[
  {
    "path": ".clang-format",
    "content": "BasedOnStyle: Google\nAllowShortFunctionsOnASingleLine: false\nSpaceAfterCStyleCast: true\nPointerBindsToType: false\nDerivePointerBinding: false\nIncludeBlocks: Preserve\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/issue.md",
    "content": "---\nname: Issue template\nabout: Please fill this issue template for reporting Mongoose issues\n#title: \n#labels: \n#assignees: \n---\n\n- My goal is: _describe_\n- My actions were: _describe_\n- My expectation was: _describe_\n- The result I saw: _provide logs or description_\n- My question is: _your question_\n\n# Environment\n\n- mongoose version: _X.Y_\n- Compiler/IDE and SDK: ZZZ version _X.Y_\n- Target hardware/board: _?_\n- Connectivity chip/module: _?_\n- Target RTOS/OS (if applicable): _?_\n"
  },
  {
    "path": ".github/workflows/cifuzz.yml",
    "content": "name: CIFuzz\non:\n  schedule:\n    - cron: '0 2 * * *' # run at 2 AM UTC\n  # Allow manual runs\n  workflow_dispatch:\n\njobs:\n  Fuzzing:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - name: Build Fuzzers\n      id: build\n      uses: google/oss-fuzz/infra/cifuzz/actions/build_fuzzers@master\n      with:\n        oss-fuzz-project-name: 'mongoose'\n        dry-run: false\n        language: c++\n    - name: Run Fuzzers\n      uses: google/oss-fuzz/infra/cifuzz/actions/run_fuzzers@master\n      with:\n        oss-fuzz-project-name: 'mongoose'\n        fuzz-seconds: 600\n        dry-run: false\n        language: c++\n    - name: Upload Crash\n      uses: actions/upload-artifact@v4\n      if: failure() && steps.build.outcome == 'success'\n      with:\n        name: artifacts\n        path: ./out/artifacts\n"
  },
  {
    "path": ".github/workflows/codeql.yml",
    "content": "name: \"CodeQL Scanning\"\n# https://github.com/github/codeql-action\n\non:\n  #schedule:\n  #  - cron: '30 23 * * *' # run at 11:30 PM UTC\n  # Allow manual runs\n  workflow_dispatch:\n\nenv:\n  IPV6: 0\njobs:\n  CodeQL-Build:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n    permissions:\n      security-events: write\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n\n    - name: Initialize CodeQL\n      uses: github/codeql-action/init@v3\n      with:\n        languages: cpp\n    - run: |\n        make -C test test CC=gcc ASAN= ASAN_OPTIONS=\n        ./test/setup_ga_network.sh && make -C test mip_test CC=gcc ASAN= ASAN_OPTIONS=\n\n    - name: Perform CodeQL Analysis\n      uses: github/codeql-action/analyze@v3\n"
  },
  {
    "path": ".github/workflows/fuzz.yml",
    "content": "name: Fuzz\non:\n  schedule:\n    - cron: '0 21 * * *' # run at 9 PM UTC\n  # Allow manual runs\n  workflow_dispatch:\nenv:\n  CC: clang\njobs:\n  fuzz:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        target: [fuzz, fuzz_tls]\n    name: ${{ matrix.target }}\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - run: make -C test ${{ matrix.target }} ARGS=\"-max_total_time=14400\"\n\n# as we're not getting access to test units causing a problem, convert from the log:\n# base64 -d > dataofdeath\n# then paste the base64 data, enter, Ctrl-D; maybe check with hexdump -C dataofdeath\n"
  },
  {
    "path": ".github/workflows/nightly.yml",
    "content": "name: Full build\non:\n  schedule:\n    - cron: '0 22 * * *' # run at 10 PM UTC\n  # Allow manual runs\n  workflow_dispatch:\nenv:\n  IPV6: 0\njobs:\n  linux:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        cc: [gcc, clang, g++, clang++]\n        target: [test]\n        ssl: [\"\", BUILTIN, MBEDTLS, OPENSSL, WOLFSSL]\n        select: [\"-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=0\", \"-DMG_ENABLE_POLL=1 -DMG_ENABLE_EPOLL=0\", \"-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=1\"]\n        exclude:\n        - ssl: MBEDTLS\n          select: \"-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=0\"\n        - ssl: MBEDTLS\n          select: \"-DMG_ENABLE_POLL=1 -DMG_ENABLE_EPOLL=0\"\n        - ssl: OPENSSL\n          select: \"-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=0\"\n        - ssl: OPENSSL\n          select: \"-DMG_ENABLE_POLL=1 -DMG_ENABLE_EPOLL=0\"\n        - ssl: WOLFSSL\n          select: \"-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=0\"\n        - ssl: WOLFSSL\n          select: \"-DMG_ENABLE_POLL=1 -DMG_ENABLE_EPOLL=0\"\n        include:\n        - ssl: BUILTIN\n          cc: gcc\n          target: test\n          select: \"-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=1 -DMG_ENABLE_CHACHA20=0\"\n    name: linux ${{ matrix.target }} CC=${{ matrix.cc }} SSL=${{ matrix.ssl }} TFLAGS=${{ matrix.select }}\n    env:\n      CC: ${{ matrix.cc }}\n      SSL: ${{ matrix.ssl }}\n      TFLAGS: ${{ matrix.select }} -DMQTT_LOCALHOST -DNO_ABORT\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - uses: webfactory/ssh-agent@v0.9.1\n      with:\n            ssh-private-key: ${{ secrets.HEALTH_TESTS_SSH_KEY }}\n    - run: sudo apt -y update ; sudo apt -y install libmbedtls-dev libwolfssl-dev && test/setup_mqtt_server.sh && make -C test ${{ matrix.target }} > log\n    - if: success() || failure()\n      run: |\n        cat log\n        test/health.awk < log > json\n        scp -o \"StrictHostKeyChecking=no\" json \"root@176.9.217.245:/data/downloads/health/linux_${{ matrix.target }}_${{ matrix.cc }}_${{ matrix.ssl }}_${{ matrix.select }}_$(date +\"%Y%m%d\").json\"\n  mip:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        cc: [gcc, clang, g++, clang++]\n        target: [mip_test, mip_tap_test]\n        ssl: [\"\", BUILTIN, MBEDTLS, OPENSSL, WOLFSSL]\n        # #3226: built-in TCP is currently not working with WolfSSL (builds fine)\n        exclude:\n        - ssl: WOLFSSL\n          target: mip_tap_test\n    name: ${{ matrix.target }} CC=${{ matrix.cc }} SSL=${{ matrix.ssl }}\n    env:\n      CC: ${{ matrix.cc }}\n      SSL: ${{ matrix.ssl }}\n      TFLAGS: -DMQTT_LOCALHOST -DNO_ABORT\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - uses: webfactory/ssh-agent@v0.9.1\n      with:\n            ssh-private-key: ${{ secrets.HEALTH_TESTS_SSH_KEY }}\n    - run: if [ \"${{ matrix.target }}\" == \"mip_tap_test\" ]; then ./test/setup_ga_network.sh ; export IPV6=0; else export IPV6=1 ; fi && sudo apt -y update ; sudo apt -y install libmbedtls-dev libwolfssl-dev && make -C test ${{ matrix.target }} > log\n    - if: success() || failure()\n      run: |\n        cat log\n        test/health.awk < log > json\n        scp -o \"StrictHostKeyChecking=no\" json \"root@176.9.217.245:/data/downloads/health/${{ matrix.target }}_${{ matrix.cc }}_${{ matrix.ssl }}_$(date +\"%Y%m%d\").json\"\n\n  mip89:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      max-parallel: 1   # no parallel runs, to minimize MQTT errors\n      matrix:\n        target: [mip_vc98]\n    name: mip89 ${{ matrix.target }}\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - run: make -C test ${{ matrix.target }} IPV6=1\n  s390:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        ssl: [\"\", BUILTIN]\n    name: S390 SSL=${{ matrix.ssl }}\n    env:\n      TFLAGS: -DMQTT_LOCALHOST\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - run: sudo apt -y update ; sudo apt -y install binfmt-support qemu-user-static && ./test/setup_mqtt_server.sh && docker run --rm --privileged multiarch/qemu-user-static --reset -p yes && make -C test s390 SSL=${{ matrix.ssl }} MULTIREC=NO\n  armhf:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        ssl: [\"\", BUILTIN]\n    name: ArmHF SSL=${{ matrix.ssl }}\n    env:\n      TFLAGS: -DMQTT_LOCALHOST\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - run: sudo apt -y update ; sudo apt -y install binfmt-support qemu-user-static && ./test/setup_mqtt_server.sh && docker run --rm --privileged multiarch/qemu-user-static --reset -p yes && make -C test armhf SSL=${{ matrix.ssl }} MULTIREC=NO\n  unamalgamated-mg_prefix:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        ssl: [\"\", BUILTIN, MBEDTLS, OPENSSL, WOLFSSL]\n    name: unamalgamated-mg_prefix SSL=${{ matrix.ssl }}\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - run: sudo apt -y update ; sudo apt -y install libmbedtls-dev libwolfssl-dev\n    - run: make -C test unamalgamated SSL=${{ matrix.ssl }} && make -C test mg_prefix\n  valgrind:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        ssl: [\"\", BUILTIN, MBEDTLS, OPENSSL, WOLFSSL]\n    name: Valgrind SSL=${{ matrix.ssl }}\n    env:\n      TFLAGS: -DMQTT_LOCALHOST\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - run: sudo apt -y update ; sudo apt -y install libmbedtls-dev libwolfssl-dev valgrind\n    - run: ./test/setup_mqtt_server.sh && make -C test valgrind SSL=${{ matrix.ssl }}\n  macos:\n    runs-on: macos-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        ssl: [\"\", BUILTIN, MBEDTLS, OPENSSL, WOLFSSL]\n        select: [-DMG_ENABLE_POLL=0, -DMG_ENABLE_POLL=1]\n        exclude:\n        - ssl: MBEDTLS\n          select: -DMG_ENABLE_POLL=0\n        - ssl: MBEDTLS                # see issue#2694\n          select: -DMG_ENABLE_POLL=1\n        - ssl: OPENSSL\n          select: -DMG_ENABLE_POLL=0\n        - ssl: WOLFSSL\n          select: -DMG_ENABLE_POLL=0\n    name: macos SSL=${{ matrix.ssl }} TFLAGS=${{ matrix.select }}\n    env:\n      SSL: ${{ matrix.ssl }}\n      TFLAGS: ${{ matrix.select }} -DMQTT_LOCALHOST ${{ matrix.env.tflags }} -DNO_ABORT -Wno-sign-conversion -Wno-undef # Workarounds for MbedTLS\n      HOMEBREW_NO_AUTO_UPDATE: 1\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - uses: webfactory/ssh-agent@v0.9.1\n      with:\n            ssh-private-key: ${{ secrets.HEALTH_TESTS_SSH_KEY }}\n    - run: brew install mbedtls wolfssl mosquitto gawk # jq openssl already pre-installed\n    - run: /opt/homebrew/opt/mosquitto/sbin/mosquitto -c /Users/runner/work/mongoose/mongoose/test/mosquitto.conf.macos &\n    - run: make -C test test ASAN_OPTIONS= MBEDTLS=$(echo $(brew --cellar)/mbedtls*/*) OPENSSL=$(echo $(brew --cellar)/openssl*/*) WOLFSSL=$(echo $(brew --cellar)/wolfssl*/*) > log\n    - if: success() || failure()\n      run: |\n        cat log\n        test/health.awk < log > json\n        scp -o \"StrictHostKeyChecking=no\" json \"root@176.9.217.245:/data/downloads/health/macos_test_cc_${{ matrix.ssl }}_${{ matrix.select }}_$(date +\"%Y%m%d\").json\"\n\n  windows:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      max-parallel: 1   # no parallel runs, to minimize MQTT errors\n      matrix:\n        target: [vc98, vc17, vc22, mingw, mingw++]\n        ssl: [\"\", BUILTIN]\n        select: [-DMG_ENABLE_POLL=0, -DMG_ENABLE_POLL=1]\n        exclude:\n        - target: vc98\n          select: -DMG_ENABLE_POLL=1\n    name: windows ${{ matrix.target }} SSL=${{ matrix.ssl }} TFLAGS=${{ matrix.select }}\n    env:\n      SSL: ${{ matrix.ssl }}\n      TFLAGS: ${{ matrix.select }} -DMQTT_LOCALHOST -DNO_ABORT\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - uses: webfactory/ssh-agent@v0.9.1\n      with:\n            ssh-private-key: ${{ secrets.HEALTH_TESTS_SSH_KEY }}\n    - run: ./test/setup_mqtt_server.sh && make -C test ${{ matrix.target }} > log\n    - if: success() || failure()\n      run: |\n        cat log\n        test/health.awk < log > json\n        scp -o \"StrictHostKeyChecking=no\" json \"root@176.9.217.245:/data/downloads/health/windows_${{ matrix.target }}_${{ matrix.cc }}_${{ matrix.ssl }}_${{ matrix.select }}_$(date +\"%Y%m%d\").json\"\n \n  arm:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        ssl: [\"\", BUILTIN]\n    name: Arm SSL=${{ matrix.ssl }}\n    steps:\n    - uses: actions/checkout@v4\n    - run: make -C test arm SSL=${{ matrix.ssl }}\n  riscv:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        ssl: [\"\", BUILTIN]\n    name: RISC-V SSL=${{ matrix.ssl }}\n    steps:\n    - uses: actions/checkout@v4\n    - run: make -C test riscv SSL=${{ matrix.ssl }}\n\n  tutorials:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        ssl: [-DMG_TLS=MG_TLS_NONE, -DMG_TLS=MG_TLS_BUILTIN]\n    name: tutorials ${{ matrix.ssl }}\n    steps:\n    - uses: actions/checkout@v4\n    - uses: webfactory/ssh-agent@v0.9.1\n      with:\n            ssh-private-key: ${{ secrets.HEALTH_TESTS_SSH_KEY }}\n    - run: sudo apt -y install libpcap-dev\n    - run: make -C test tutorials CFLAGS_EXTRA=\"${{ matrix.ssl }}\" > log\n    - if: success() || failure()\n      run: |\n        cat log\n        test/health.awk < log > json\n        scp -o \"StrictHostKeyChecking=no\" json \"root@176.9.217.245:/data/downloads/health/tutorials_${{ matrix.ssl }}_$(date +\"%Y%m%d\").json\"\n    - run: make -C test clean_tutorials\n\n  tutorials_win:\n    runs-on: windows-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        ssl: [-DMG_TLS=MG_TLS_NONE, -DMG_TLS=MG_TLS_BUILTIN]\n    name: tutorials_win ${{ matrix.ssl }}\n    steps:\n    - uses: actions/checkout@v4\n#    - uses: egor-tensin/setup-mingw@v2\n#      with:\n#        platform: x64\n    - name: test they build\n      run: make -C test tutorials_win CFLAGS_EXTRA=\"${{ matrix.ssl }}\"\n      shell: cmd\n    - name: test they clean\n      run: make -C test clean_tutorials_win\n      shell: cmd\n  tutorials_mac:\n    runs-on: macos-latest\n    env: { HOMEBREW_NO_AUTO_UPDATE: 1 }\n    strategy:\n      fail-fast: false\n      matrix:\n        ssl: [-DMG_TLS=MG_TLS_NONE, -DMG_TLS=MG_TLS_BUILTIN]\n    name: tutorials_mac ${{ matrix.ssl }}\n    steps:\n    - uses: actions/checkout@v4\n    - run: make -C test tutorials_mac CFLAGS_EXTRA=\"${{ matrix.ssl }}\"\n    - run: make -C test clean_tutorials_mac\n\n\n  arduino:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - run: echo # nothing specific to install or do\n    - run: make -C test/arduino\n    - run: make -C test/arduino cleanall\n\n\n#  wizard_examples:\n#    runs-on: ubuntu-latest\n#    strategy:\n#      fail-fast: false\n#      matrix:\n#        example:\n#          - path: esp32/esp32-idf\n#    name: ${{ matrix.example.path }}\n#    env:\n#      GO: 0\n#    steps:\n#      - uses: actions/checkout@v4\n#        with: { fetch-depth: 2 }\n#      - run: echo # nothing specific to install or do\n#          fi\n#      - run: make -C tutorials/${{ matrix.example.path }} build\n\n  wizard_examples_arm:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        example:\n          - path: infineon/xmc47_relax-make-baremetal-builtin\n          - path: infineon/xmc_plt2go_4400-make-baremetal-builtin\n          - path: infineon/xmc72_evk-make-baremetal-builtin\n          - path: nxp/frdm-mcxn947-make-baremetal-builtin\n          - path: nxp/frdm-mcxn947-make-freertos-builtin\n          - path: nxp/rt1020-evk-make-baremetal-builtin\n          - path: nxp/rt1060-evk-make-baremetal-builtin\n          - path: nxp/rt1170-evk-make-baremetal-builtin\n          - path: pico-sdk/pico-w-picosdk-baremetal-builtin\n          - path: pico-sdk/pico-2-w-picosdk-baremetal-builtin\n          - path: pico-sdk/w5500-evb-pico-picosdk-baremetal-builtin\n          - path: pico-sdk/w5500-evb-pico2-picosdk-baremetal-builtin\n          - path: stm32/nucleo-f429zi-make-baremetal-builtin\n          - path: stm32/nucleo-f429zi-make-freertos-builtin\n          - path: stm32/nucleo-f746zg-make-baremetal-builtin\n          - path: stm32/nucleo-f746zg-make-freertos-builtin\n          - path: stm32/nucleo-h563zi-make-baremetal-builtin\n          - path: stm32/nucleo-h563zi-make-freertos-builtin\n          - path: stm32/nucleo-h723zg-make-baremetal-builtin\n          - path: stm32/nucleo-h723zg-make-freertos-builtin\n          - path: stm32/nucleo-h743zi-make-baremetal-builtin\n          - path: stm32/nucleo-h743zi-make-freertos-builtin\n          - path: stm32/stm32h573i-dk-make-baremetal-builtin\n          - path: stm32/stm32h573i-dk-make-freertos-builtin\n          - path: ti/ek-tm4c1294xl-make-baremetal-builtin\n          - path: ti/ek-tm4c1294xl-make-freertos-builtin\n    name: ${{ matrix.example.path }}\n    env:\n      GO: 0\n    steps:\n      - uses: actions/checkout@v4\n        with: { fetch-depth: 2 }\n      - run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n      - run: make -C tutorials/${{ matrix.example.path }} build\n\n\n  generic_examples:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        example:\n          - path: micropython/esp32\n          - path: http/uart-bridge/esp32\n          - path: http/http-client/esp8266/http-client-server\n    name: ${{ matrix.example.path }}\n    env:\n      GO: 0\n    steps:\n      - uses: actions/checkout@v4\n        with: { fetch-depth: 2 }\n      - run: echo # nothing specific to install or do\n      - run: make -C tutorials/${{ matrix.example.path }} build\n  \n  generic_examples_arm:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        example:\n          - path: mqtt/mqtt-client/microchip/same54-xpro\n          - path: nxp/nxp-frdmk66f-freertos\n          - path: nxp/nxp-lpcxpresso54s018m-freertos\n          - path: nxp/nxp-mimxrt1020-freertos\n          - path: nxp/nxp-evkbimxrt1050-lwip-freertos\n          - path: nxp/nxp-evkmimxrt1020-lwip-freertos\n          - path: nxp/nxp-evkmimxrt1024-lwip-freertos\n          - path: nxp/nxp-evkmimxrt1060-lwip-freertos\n          - path: nxp/nxp-evkmimxrt1064-lwip-freertos\n          - path: nxp/nxp-evkmimxrt1160-cm7-lwip-freertos\n          - path: nxp/nxp-evkmimxrt1170-cm7-lwip-freertos\n          - path: nxp/nxp-frdmk64f-lwip-freertos\n          - path: nxp/nxp-frdmk66f-lwip-freertos\n          - path: nxp/nxp-lpcxpresso54018-lwip-freertos\n          - path: nxp/nxp-lpcxpresso54608-lwip-freertos\n          - path: nxp/nxp-lpcxpresso54618-lwip-freertos\n          - path: nxp/nxp-lpcxpresso54628-lwip-freertos\n          - path: nxp/nxp-twrk65f180m-lwip-freertos\n          - path: nxp/nxp-twrkv58f220m-lwip-freertos\n          - path: pico-sdk/pico-rmii\n          - path: stm32/nucleo-f429zi-make-baremetal-builtin-rndis\n          - path: stm32/nucleo-f746zg-make-baremetal-builtin-rndis\n          - path: stm32/nucleo-g031-make-baremetal-builtin\n          - path: ti/ti-ek-tm4c1294xl-http-server\n          - path: ti/ek-tm4c1294xl-make-baremetal-builtin-rndis\n    name: ${{ matrix.example.path }}\n    steps:\n      - uses: actions/checkout@v4\n        with: { fetch-depth: 2 }\n      - run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n      - run: make -C tutorials/${{ matrix.example.path }} build\n\n  device_dashboard_examples:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        example:\n          - path: esp32\n    name: ${{ matrix.example.path }}\n    steps:\n      - uses: actions/checkout@v4\n        with: { fetch-depth: 2 }\n      - run: echo # nothing specific to install or do\n      - run: make -C tutorials/http/device-dashboard/${{ matrix.example.path }} build\n\n\n  device_dashboard_examples_arm:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        ssl: [\"\", -DMG_TLS=MG_TLS_BUILTIN]\n        example:\n          - path: http/device-dashboard/microchip/same54-xpro\n          - path: nxp/rt1020-evk-make-freertos-builtin\n          - path: nxp/rt1060-evk-make-freertos-builtin\n          - path: nxp/rt1170-evk-make-freertos-builtin\n          - path: renesas/ek-ra6m4-make-baremetal-builtin\n          - path: pico-sdk/pico-rndis-dashboard\n          - path: pico-sdk/pico-w-picosdk-freertos-lwip\n          - path: pico-sdk/pico-2-w-picosdk-freertos-lwip\n          - path: stm32/nucleo-f746zg-make-freertos-tcp\n          - path: stm32/nucleo-f746zg-make-baremetal-builtin-cmsis_driver\n    name: ${{ matrix.example.path }} ${{ matrix.ssl }}\n    steps:\n      - uses: actions/checkout@v4\n        with: { fetch-depth: 2 }\n      - run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n      - run: make -C tutorials/${{ matrix.example.path }} build CFLAGS_EXTRA=\"${{ matrix.ssl }}\"\n\n#  mqtt_dashboard_examples:\n#    runs-on: ubuntu-latest\n#    strategy:\n#      fail-fast: false\n#      matrix:\n#        example:\n#          - path: \n#    name: ${{ matrix.example.path }}\n#    steps:\n#      - uses: actions/checkout@v4\n#        with: { fetch-depth: 2 }\n#      - run: echo # nothing specific to install or do\n#      - run: make -C tutorials/${{ matrix.example.path }} build\n      \n  mqtt_dashboard_examples_arm:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        example:\n          - path: pico-sdk/pico-rndis-device\n    name: ${{ matrix.example.path }}\n    steps:\n      - uses: actions/checkout@v4\n        with: { fetch-depth: 2 }\n      - run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n      - run: make -C tutorials/${{ matrix.example.path }} build\n      \n#  dual_examples:\n#    runs-on: ubuntu-latest\n#    strategy:\n#      fail-fast: false\n#      matrix:\n#        example:\n#          - path: \n#    name: ${{ matrix.example.path }}\n#    steps:\n#      - uses: actions/checkout@v4\n#        with: { fetch-depth: 2 }\n#      - run: echo # nothing specific to install or do\n#      - run: make -C tutorials/${{ matrix.example.path }} device_dashboard\n#      - run: make -C tutorials/${{ matrix.example.path }} mqtt_dashboard\n\n  cube_examples:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n        with: { fetch-depth: 2 }\n      - run: sudo pip install yq\n      - run: cd test/cube && make\n"
  },
  {
    "path": ".github/workflows/nightly_tests.yml",
    "content": "name: Full test\non:\n  schedule:\n    - cron: '0 23 * * *' # run at 11 PM UTC\n  # Allow manual runs\n  workflow_dispatch:\nenv:\n  IPV6: 0\njobs:\n\n  test_f7:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - name: baremetal\n      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n    - run: make -C tutorials/stm32/nucleo-f746zg-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n    - run: make -C tutorials/stm32/nucleo-f746zg-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n    - run: make -C tutorials/stm32/nucleo-f746zg-make-freertos-tcp test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n    - name: Cube\n      run: sudo pip install yq\n#    - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-f746zg-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5\n#    - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-f746zg-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5    \n    - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-f746zg-cube-freertos-lwip VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5\n\n  test_f4:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - name: baremetal\n      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n    - run: make -C tutorials/stm32/nucleo-f429zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n    - run: make -C tutorials/stm32/nucleo-f429zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n    - name: Cube\n      run: sudo pip install yq\n#    - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-f429zi-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2\n#    - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-f429zi-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2\n    - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-f429zi-cube-freertos-lwip VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2\n\n  test_h743:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 3 }\n    - name: baremetal\n      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n    - run: make -C tutorials/stm32/nucleo-h743zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n    - run: make -C tutorials/stm32/nucleo-h743zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#    - name: Cube\n#      run: echo # nothing specific to install or do\n#    - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-h743zi-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=6\n#    - run: make -C test/cube PROJECTS=../../tutorials/stm32/nucleo-h743zi-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=6\n\n  test_h723:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 3 }\n    - name: baremetal\n      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n    - run: make -C tutorials/stm32/nucleo-h723zg-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n    - run: make -C tutorials/stm32/nucleo-h723zg-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n    \n  test_h5:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 3 }\n    - name: baremetal\n      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n    - run: make -C tutorials/stm32/nucleo-h563zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n    - run: make -C tutorials/stm32/nucleo-h563zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n\n  test_rt1020:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 3 }\n    - name: baremetal\n      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n    - run: make -C tutorials/nxp/rt1020-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n    - run: make -C tutorials/nxp/rt1020-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n\n  test_rt1060:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 3 }\n    - name: baremetal\n      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n    - run: make -C tutorials/nxp/rt1060-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n    - run: make -C tutorials/nxp/rt1060-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n\n  test_rt1170:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 3 }\n    - name: baremetal\n      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n    - run: make -C tutorials/nxp/rt1170-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n    - run: make -C tutorials/nxp/rt1170-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n\n  test_ra6m4:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 3 }\n    - name: baremetal\n      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n    - run: make -C tutorials/renesas/ek-ra6m4-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#    - run: make -C tutorials/renesas/ek-ra6m4-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n\n  test_tm4c:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - name: baremetal\n      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n    - run:  make -C tutorials/ti/ek-tm4c1294xl-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n    - run:  make -C tutorials/ti/ek-tm4c1294xl-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n\n  test_same54:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - name: baremetal\n      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n    - run:  make -C tutorials/http/device-dashboard/microchip/same54-xpro test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n    - run:  make -C tutorials/mqtt/mqtt-client/microchip/same54-xpro test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n\n  test_pico_w5500:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - name: SDK\n      run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n    - run:  make -C tutorials/pico-sdk/w5500-evb-pico-picosdk-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n"
  },
  {
    "path": ".github/workflows/on_demand.yml",
    "content": "name: On demand ad hoc test\non:\n  workflow_dispatch:\nenv:\n  IPV6: 0\njobs:\n  macos:\n    runs-on: macos-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        ssl: [MBEDTLS, WOLFSSL]\n        select: [-DMG_ENABLE_POLL=1]\n    name: macos SSL=${{ matrix.ssl }} TFLAGS=${{ matrix.select }}\n    env:\n      SSL: ${{ matrix.ssl }}\n      TFLAGS: ${{ matrix.select }} -DMQTT_LOCALHOST -DNO_ABORT -Wno-sign-conversion -Wno-undef # Workarounds for MbedTLS\n      HOMEBREW_NO_AUTO_UPDATE: 1\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - uses: webfactory/ssh-agent@v0.9.1\n      with:\n            ssh-private-key: ${{ secrets.HEALTH_TESTS_SSH_KEY }}\n    - run: brew install mbedtls wolfssl mosquitto gawk # jq openssl already pre-installed\n    - run: /opt/homebrew/opt/mosquitto/sbin/mosquitto -c /Users/runner/work/mongoose/mongoose/test/mosquitto.conf.macos &\n    - run: make -C test test ASAN_OPTIONS= MBEDTLS=$(echo $(brew --cellar)/mbedtls*/*) OPENSSL=$(echo $(brew --cellar)/openssl*/*) WOLFSSL=$(echo $(brew --cellar)/wolfssl*/*) > log\n    - if: success() || failure()\n      run: |\n        cat log\n        test/health.awk < log > json\n        scp -o \"StrictHostKeyChecking=no\" json \"root@176.9.217.245:/data/downloads/health/macos_test_cc_${{ matrix.ssl }}_${{ matrix.select }}_$(date +\"%Y%m%d\").json\"\n"
  },
  {
    "path": ".github/workflows/quicktest.yml",
    "content": "name: Build and test - essentials\non:\n  push:\n    paths:\n      - \"**Makefile\"\n      - \"**.c\"\n      - \"**.h\"\n  # Allow manual runs\n  workflow_dispatch:\nenv:\n  IPV6: 0\njobs:\n  linux:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        cc: [gcc, clang++]\n        target: [test, mip_test]\n        ssl: [\"\", BUILTIN]\n    name: linux ${{ matrix.target }} CC=${{ matrix.cc }} SSL=${{ matrix.ssl }}\n    env:\n      CC: ${{ matrix.cc }}\n      SSL: ${{ matrix.ssl }}\n      TFLAGS: -DMQTT_LOCALHOST\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi\n    - if: ${{ env.GO == 1 }}\n      run: if [ \"${{ matrix.target }}\" == \"test\" ]; then ./test/setup_mqtt_server.sh ; fi && make -C test ${{ matrix.target }}\n  s390:\n    runs-on: ubuntu-latest\n    env:\n      TFLAGS: -DMQTT_LOCALHOST\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi\n    - if: ${{ env.GO == 1 }}\n      run: sudo apt -y update ; sudo apt -y install binfmt-support qemu-user-static && ./test/setup_mqtt_server.sh && docker run --rm --privileged multiarch/qemu-user-static --reset -p yes && make -C test s390\n  armhf:\n    runs-on: ubuntu-latest\n    env:\n      TFLAGS: -DMQTT_LOCALHOST\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi\n    - if: ${{ env.GO == 1 }}\n      run: sudo apt -y update ; sudo apt -y install binfmt-support qemu-user-static && ./test/setup_mqtt_server.sh && docker run --rm --privileged multiarch/qemu-user-static --reset -p yes && make -C test armhf\n  unamalgamated-mg_prefix:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi\n    - if: ${{ env.GO == 1 }}\n      run: make -C test unamalgamated && make -C test mg_prefix\n  macos:\n    runs-on: macos-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        ssl: [\"\", BUILTIN]\n    name: macos SSL=${{ matrix.ssl }}\n    env:\n      SSL: ${{ matrix.ssl }}\n      TFLAGS: -DMQTT_LOCALHOST # -DNO_SNTP_CHECK\n      HOMEBREW_NO_AUTO_UPDATE: 1\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        brew install mosquitto\n        /opt/homebrew/opt/mosquitto/sbin/mosquitto -c /Users/runner/work/mongoose/mongoose/test/mosquitto.conf.macos &\n        make -C test test ASAN_OPTIONS=\n  windows:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        target: [vc98, vc22, mingw++]\n    name: windows ${{ matrix.target }}\n    env:\n      TFLAGS: -DMQTT_LOCALHOST\n    steps:\n    - uses: actions/checkout@v4\n      with: { fetch-depth: 2 }\n    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi\n    - if: ${{ env.GO == 1 }}\n      run: ./test/setup_mqtt_server.sh && make -C test ${{ matrix.target }} \n  arm:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n    - run: make -C test arm\n  riscv:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n    - run: make -C test riscv\n\n  tutorials:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n    - run: make -C test tutorials_essential\n    - run: make -C test clean_tutorials_essential\n  tutorials_win:\n    runs-on: windows-latest\n    steps:\n    - uses: actions/checkout@v4\n#    - uses: egor-tensin/setup-mingw@v2\n#      with:\n#        platform: x64\n    - name: test they build\n      run: make -C test tutorials_win\n      shell: cmd\n    - name: test they clean\n      run: make -C test clean_tutorials_win\n      shell: cmd\n  tutorials_mac:\n    runs-on: macos-latest\n    env: { HOMEBREW_NO_AUTO_UPDATE: 1 }\n    steps:\n    - uses: actions/checkout@v4\n    - run: make -C test tutorials_mac\n    - run: make -C test clean_tutorials_mac\n\n\n#  wizard_examples:\n#    runs-on: ubuntu-latest\n#    strategy:\n#      fail-fast: false\n#      matrix:\n#        example:\n#          - path: esp32/esp32-idf\n#    name: ${{ matrix.example.path }}\n#    env:\n#      GO: 0\n#    steps:\n#      - uses: actions/checkout@v4\n#        with: { fetch-depth: 2 }\n#      - run: |\n#          if ./test/match_changed_files.sh '^src'; then\n#            echo GO=1 >> $GITHUB_ENV\n#            # nothing specific to install or do\n#          fi\n#      - if: ${{ env.GO == 1 }}\n#        run: make -C tutorials/${{ matrix.example.path }} build\n\n  wizard_examples_arm:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        example:\n          - path: infineon/xmc47_relax-make-baremetal-builtin\n          - path: infineon/xmc_plt2go_4400-make-baremetal-builtin\n          - path: infineon/xmc72_evk-make-baremetal-builtin\n          - path: nxp/frdm-mcxn947-make-baremetal-builtin\n          - path: nxp/frdm-mcxn947-make-freertos-builtin\n          - path: nxp/rt1020-evk-make-baremetal-builtin\n          - path: nxp/rt1060-evk-make-baremetal-builtin\n          - path: nxp/rt1170-evk-make-baremetal-builtin\n          - path: pico-sdk/pico-w-picosdk-baremetal-builtin\n          - path: pico-sdk/pico-2-w-picosdk-baremetal-builtin\n          - path: pico-sdk/w5500-evb-pico-picosdk-baremetal-builtin\n          - path: pico-sdk/w5500-evb-pico2-picosdk-baremetal-builtin\n          - path: stm32/nucleo-f429zi-make-baremetal-builtin\n          - path: stm32/nucleo-f429zi-make-freertos-builtin\n          - path: stm32/nucleo-f746zg-make-baremetal-builtin\n          - path: stm32/nucleo-f746zg-make-freertos-builtin\n          - path: stm32/nucleo-h563zi-make-baremetal-builtin\n          - path: stm32/nucleo-h563zi-make-freertos-builtin\n          - path: stm32/nucleo-h723zg-make-baremetal-builtin\n          - path: stm32/nucleo-h723zg-make-freertos-builtin\n          - path: stm32/nucleo-h743zi-make-baremetal-builtin\n          - path: stm32/nucleo-h743zi-make-freertos-builtin\n          - path: stm32/stm32h573i-dk-make-baremetal-builtin\n          - path: stm32/stm32h573i-dk-make-freertos-builtin\n          - path: ti/ek-tm4c1294xl-make-baremetal-builtin\n          - path: ti/ek-tm4c1294xl-make-freertos-builtin\n    name: ${{ matrix.example.path }}\n    env:\n      GO: 0\n    steps:\n      - uses: actions/checkout@v4\n        with: { fetch-depth: 2 }\n      - run: |\n          if ./test/match_changed_files.sh '^src'; then\n            echo GO=1 >> $GITHUB_ENV\n            sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n          fi\n      - if: ${{ env.GO == 1 }}\n        run: make -C tutorials/${{ matrix.example.path }} build\n\n\n  generic_examples:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        example:\n          - path: http/uart-bridge/esp32\n          - path: http/http-client/esp8266/http-client-server\n    name: ${{ matrix.example.path }}\n    env:\n      GO: 0\n    steps:\n      - uses: actions/checkout@v4\n        with: { fetch-depth: 2 }\n      - run: if ./test/match_changed_files.sh '^src|^tutorials/http/uart-bridge|^tutorials/${{ matrix.example.path }}'; then echo GO=1 >> $GITHUB_ENV ; fi\n      - if: ${{ env.GO == 1 }}\n        run: |\n          # nothing specific to install or do\n      - if: ${{ env.GO == 1 }}\n        run: make -C tutorials/${{ matrix.example.path }} build\n  \n  generic_examples_arm:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        example:\n          - path: stm32/nucleo-g031-make-baremetal-builtin\n    name: ${{ matrix.example.path }}\n    env:\n      GO: 0\n    steps:\n      - uses: actions/checkout@v4\n        with: { fetch-depth: 2 }\n      - run: if ./test/match_changed_files.sh '^src|^tutorials/${{ matrix.example.path }}'; then echo GO=1 >> $GITHUB_ENV ; fi\n      - if: ${{ env.GO == 1 }}\n        run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n      - if: ${{ env.GO == 1 }}\n        run: make -C tutorials/${{ matrix.example.path }} build\n\n  device_dashboard_examples:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        example:\n          - path: esp32\n    name: ${{ matrix.example.path }}\n    env:\n      GO: 0\n    steps:\n      - uses: actions/checkout@v4\n        with: { fetch-depth: 2 }\n      - run: |\n          if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard'; then\n            echo GO=1 >> $GITHUB_ENV\n            # nothing specific to install or do\n          fi\n      - if: ${{ env.GO == 1 }}\n        run: make -C tutorials/http/device-dashboard/${{ matrix.example.path }} build\n\n  device_dashboard_examples_arm:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        example:\n          - path: http/device-dashboard/microchip/same54-xpro\n          - path: nxp/rt1020-evk-make-freertos-builtin\n          - path: nxp/rt1060-evk-make-freertos-builtin\n          - path: nxp/rt1170-evk-make-freertos-builtin\n          - path: renesas/ek-ra6m4-make-baremetal-builtin\n          - path: pico-sdk/pico-rndis-dashboard\n          - path: pico-sdk/pico-w-picosdk-freertos-lwip\n          - path: pico-sdk/pico-2-w-picosdk-freertos-lwip\n          - path: stm32/nucleo-f746zg-make-freertos-tcp\n          - path: stm32/nucleo-f746zg-make-baremetal-builtin-cmsis_driver\n    name: ${{ matrix.example.path }}\n    env:\n      GO: 0\n    steps:\n      - uses: actions/checkout@v4\n        with: { fetch-depth: 2 }\n      - run: |\n          if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|^tutorials/${{ matrix.example.path }}'; then\n            echo GO=1 >> $GITHUB_ENV\n            sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n          fi\n      - if: ${{ env.GO == 1 }}\n        run: make -C tutorials/${{ matrix.example.path }} build\n\n#  mqtt_dashboard_examples:\n#    runs-on: ubuntu-latest\n#    strategy:\n#      fail-fast: false\n#      matrix:\n#        example:\n#          - path: \n#    name: ${{ matrix.example.path }}\n#    env:\n#      GO: 0\n#    steps:\n#      - uses: actions/checkout@v4\n#        with: { fetch-depth: 2 }\n#      - run: |\n#          if ./test/match_changed_files.sh '^src|tutorials/mqtt/mqtt-dashboard/device|^tutorials/${{ matrix.example.path }}'; then\n#            echo GO=1 >> $GITHUB_ENV\n#            # nothing specific to install or do\n#          fi\n#      - if: ${{ env.GO == 1 }}\n#        run: make -C tutorials/${{ matrix.example.path }} build\n      \n  mqtt_dashboard_examples_arm:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        example:\n          - path: pico-sdk/pico-rndis-device\n    name: ${{ matrix.example.path }}\n    env:\n      GO: 0\n    steps:\n      - uses: actions/checkout@v4\n        with: { fetch-depth: 2 }\n      - run: |\n          if ./test/match_changed_files.sh '^src|tutorials/mqtt/mqtt-dashboard/device|^tutorials/${{ matrix.example.path }}'; then\n            echo GO=1 >> $GITHUB_ENV\n            sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n          fi\n      - if: ${{ env.GO == 1 }}\n        run: make -C tutorials/${{ matrix.example.path }} build\n      \n  cube_examples:\n    runs-on: ubuntu-latest\n    env:\n      GO: 0\n    steps:\n      - uses: actions/checkout@v4\n        with: { fetch-depth: 2 }\n      - run: |\n          if ./test/match_changed_files.sh '^src|tutorials/stm32/nucleo-*-cube-*'; then\n            echo GO=1 >> $GITHUB_ENV\n            sudo pip install yq\n          fi\n      - if: ${{ env.GO == 1 }}\n        run: cd test/cube && make\n\n#  test_f7:\n#    runs-on: ubuntu-latest\n#    env:\n#      GO: 0\n#    steps:\n#    - uses: actions/checkout@v4\n#      with: { fetch-depth: 2 }\n#    - name: baremetal\n#      run: |\n#        if ./test/match_changed_files.sh \"^src|tutorials/http/device-dashboard|tutorials/stm32/nucleo-f7.*-make-\" ; then\n#          echo GO=1 >> $GITHUB_ENV\n#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n#        fi\n#    # always run baremetal on core or dashboard or specific example changes; other examples only on specific example changes\n#    - if: ${{ env.GO == 1 }}\n#      continue-on-error: true   # continue so next test has a chance to re-flash and exit from collisions and flash failures\n#      run: |\n#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|tutorials/stm32/nucleo-f746zg-make-baremetal-builtin'; then\n#          make -C tutorials/stm32/nucleo-f746zg-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      run: |\n#        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f746zg-make-freertos-builtin'; then\n#          make -C tutorials/stm32/nucleo-f746zg-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      run: |\n#        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f746zg-make-freertos-tcp'; then\n#          make -C tutorials/stm32/nucleo-f746zg-make-freertos-tcp test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n#    - name: Cube\n#      run: |\n#        echo GO=0 >> $GITHUB_ENV\n#        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f7.*-cube-'; then\n#          echo GO=1 >> $GITHUB_ENV\n#          # nothing specific to install or do\n#        fi\n##    - if: ${{ env.GO == 1 }}\n##      run: |\n##        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f746zg-cube-baremetal-builtin'; then\n##          make -C test/cube test PROJECTS=../../tutorials/stm32/nucleo-f746zg-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5\n##        fi\n##    - if: ${{ env.GO == 1 }}\n##      run: |\n##        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f746zg-cube-freertos-builtin'; then\n##          make -C test/cube test PROJECTS=../../tutorials/stm32/nucleo-f746zg-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5    \n##        fi\n#    - if: ${{ env.GO == 1 }}\n#      run: |\n#        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f746zg-cube-freertos-lwip'; then\n#          make -C test/cube test PROJECTS=../../tutorials/stm32/nucleo-f746zg-cube-freertos-lwip VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5\n#        fi\n#\n#\n#  test_f4:\n#    runs-on: ubuntu-latest\n#    env:\n#      GO: 0\n#    steps:\n#    - uses: actions/checkout@v4\n#      with: { fetch-depth: 2 }\n#    - name: baremetal\n#      run: |\n#        if ./test/match_changed_files.sh \"^src|tutorials/http/device-dashboard|tutorials/stm32/nucleo-f4.*-make-\" ; then\n#          echo GO=1 >> $GITHUB_ENV\n#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      continue-on-error: true\n#      run: |\n#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|tutorials/stm32/nucleo-f429zi-make-baremetal-builtin'; then\n#          make -C tutorials/stm32/nucleo-f429zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      run: |\n#        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f429zi-make-freertos-builtin'; then\n#          make -C tutorials/stm32/nucleo-f429zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n#    - name: Cube\n#      run: |\n#        echo GO=0 >> $GITHUB_ENV\n#        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f4.*-cube-'; then\n#          echo GO=1 >> $GITHUB_ENV\n#          # nothing specific to install or do\n#        fi\n##    - if: ${{ env.GO == 1 }}\n##      run: |\n##        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f429zi-cube-baremetal-builtin'; then\n##          make -C test/cube test PROJECTS=../../tutorials/stm32/nucleo-f429zi-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2\n##        fi\n##    - if: ${{ env.GO == 1 }}\n##      run: |\n##        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f429zi-cube-freertos-builtin'; then\n##          make -C test/cube test PROJECTS=../../tutorials/stm32/nucleo-f429zi-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2\n##        fi\n#    - if: ${{ env.GO == 1 }}\n#      run: |\n#        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-f429zi-cube-freertos-lwip'; then\n#          make -C test/cube test PROJECTS=../../tutorials/stm32/nucleo-f429zi-cube-freertos-lwip VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2\n#        fi\n#\n#  test_h743:\n#    runs-on: ubuntu-latest\n#    env:\n#      GO: 0\n#    steps:\n#    - uses: actions/checkout@v4\n#      with: { fetch-depth: 3 }\n#    - name: baremetal\n#      run: |\n#        if ./test/match_changed_files.sh \"^src|tutorials/http/device-dashboard|tutorials/stm32/nucleo-h74.*-make-\" ; then\n#          echo GO=1 >> $GITHUB_ENV\n#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      continue-on-error: true\n#      run: |\n#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|tutorials/stm32/nucleo-h743zi-make-baremetal-builtin'; then\n#        make -C tutorials/stm32/nucleo-h743zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      run: |\n#        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-h743zi-make-freertos-builtin'; then\n#          make -C tutorials/stm32/nucleo-h743zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n##    - name: Cube\n##      run: |\n##        echo GO=0 >> $GITHUB_ENV\n##        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-h74.*-cube-'; then\n##          echo GO=1 >> $GITHUB_ENV\n##          # nothing specific to install or do\n##        fi\n##    - if: ${{ env.GO == 1 }}\n##      run: |\n##        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-h743zi-cube-baremetal-builtin'; then\n##          make -C test/cube test PROJECTS=../../tutorials/stm32/nucleo-h743zi-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=6\n##        fi\n##    - if: ${{ env.GO == 1 }}\n##      run: |\n##        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-h743zi-cube-freertos-builtin'; then\n##          make -C test/cube test PROJECTS=../../tutorials/stm32/nucleo-h743zi-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=6\n##        fi\n#\n#  test_h723:\n#    runs-on: ubuntu-latest\n#    env:\n#      GO: 0\n#    steps:\n#    - uses: actions/checkout@v4\n#      with: { fetch-depth: 3 }\n#    - name: baremetal\n#      run: |\n#        if ./test/match_changed_files.sh \"^src|tutorials/http/device-dashboard|tutorials/stm32/nucleo-h72.*-make-\" ; then\n#          echo GO=1 >> $GITHUB_ENV\n#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      continue-on-error: true\n#      run: |\n#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|tutorials/stm32/nucleo-h723zg-make-baremetal-builtin'; then\n#          make -C tutorials/stm32/nucleo-h723zg-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      run: |\n#        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-h723zg-make-freertos-builtin'; then\n#          make -C tutorials/stm32/nucleo-h723zg-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n#    \n#  test_h5:\n#    runs-on: ubuntu-latest\n#    env:\n#      GO: 0\n#    steps:\n#    - uses: actions/checkout@v4\n#      with: { fetch-depth: 3 }\n#    - name: baremetal\n#      run: |\n#        if ./test/match_changed_files.sh \"^src|tutorials/http/device-dashboard|tutorials/stm32/nucleo-h5.*-make-\" ; then\n#          echo GO=1 >> $GITHUB_ENV\n#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      continue-on-error: true\n#      run: |\n#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|tutorials/stm32/nucleo-h563zi-make-baremetal-builtin'; then\n#          make -C tutorials/stm32/nucleo-h563zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      run: |\n#        if ./test/match_changed_files.sh 'tutorials/stm32/nucleo-h563zi-make-freertos-builtin'; then\n#          make -C tutorials/stm32/nucleo-h563zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n#\n#  test_rt1020:\n#    runs-on: ubuntu-latest\n#    env:\n#      GO: 0\n#    steps:\n#    - uses: actions/checkout@v4\n#      with: { fetch-depth: 3 }\n#    - name: baremetal\n#      run: |\n#        if ./test/match_changed_files.sh \"^src|tutorials/http/device-dashboard|tutorials/nxp/rt1020.*-make-\" ; then\n#          echo GO=1 >> $GITHUB_ENV\n#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      continue-on-error: true\n#      run: |\n#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|tutorials/nxp/rt1020-evk-make-baremetal-builtin'; then\n#          make -C tutorials/nxp/rt1020-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      run: |\n#        if ./test/match_changed_files.sh 'tutorials/nxp/rt1020-evk-make-freertos-builtin'; then\n#          make -C tutorials/nxp/rt1020-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n#\n#  test_rt1060:\n#    runs-on: ubuntu-latest\n#    env:\n#      GO: 0\n#    steps:\n#    - uses: actions/checkout@v4\n#      with: { fetch-depth: 3 }\n#    - name: baremetal\n#      run: |\n#        if ./test/match_changed_files.sh \"^src|tutorials/http/device-dashboard|tutorials/nxp/rt1060.*-make-\" ; then\n#          echo GO=1 >> $GITHUB_ENV\n#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      continue-on-error: true\n#      run: |\n#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|tutorials/nxp/rt1060-evk-make-baremetal-builtin'; then\n#          make -C tutorials/nxp/rt1060-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      run: |\n#        if ./test/match_changed_files.sh 'tutorials/nxp/rt1060-evk-make-freertos-builtin'; then\n#          make -C tutorials/nxp/rt1060-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n#\n#  test_rt1170:\n#    runs-on: ubuntu-latest\n#    env:\n#      GO: 0\n#    steps:\n#    - uses: actions/checkout@v4\n#      with: { fetch-depth: 3 }\n#    - name: baremetal\n#      run: |\n#        if ./test/match_changed_files.sh \"^src|tutorials/http/device-dashboard|tutorials/nxp/rt1170.*-make-\" ; then\n#          echo GO=1 >> $GITHUB_ENV\n#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      continue-on-error: true\n#      run: |\n#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|tutorials/nxp/rt1170-evk-make-baremetal-builtin'; then\n#          make -C tutorials/nxp/rt1170-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      run: |\n#        if ./test/match_changed_files.sh 'tutorials/nxp/rt1170-evk-make-freertos-builtin'; then\n#          make -C tutorials/nxp/rt1170-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n#\n#  test_ra6m4:\n#    runs-on: ubuntu-latest\n#    env:\n#      GO: 0\n#    steps:\n#    - uses: actions/checkout@v4\n#      with: { fetch-depth: 3 }\n#    - name: baremetal\n#      run: |\n#        if ./test/match_changed_files.sh \"^src|tutorials/http/device-dashboard|tutorials/renesas/ek-ra6m4.*-make-\" ; then\n#          echo GO=1 >> $GITHUB_ENV\n#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      continue-on-error: true\n#      run: |\n#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|tutorials/renesas/ek-ra6m4-make-baremetal-builtin'; then\n#          make -C tutorials/renesas/ek-ra6m4-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n##    - if: ${{ env.GO == 1 }}\n##      run: |\n##        if ./test/match_changed_files.sh 'tutorials/renesas/ek-ra6m4-make-freertos-builtin'; then\n##          make -C tutorials/renesas/ek-ra6m4-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n##        fi\n#\n#  test_tm4c:\n#    runs-on: ubuntu-latest\n#    env:\n#      GO: 0\n#    steps:\n#    - uses: actions/checkout@v4\n#      with: { fetch-depth: 2 }\n#    - name: baremetal\n#      run: |\n#        if ./test/match_changed_files.sh \"^src|tutorials/http/device-dashboard|tutorials/ti/ek-tm4c.*-make-\" ; then\n#          echo GO=1 >> $GITHUB_ENV\n#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      run: |\n#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard|tutorials/ti/ek-tm4c1294xl-make-baremetal-builtin'; then\n#          make -C tutorials/ti/ek-tm4c1294xl-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      run: |\n#        if ./test/match_changed_files.sh 'tutorials/ti/ek-tm4c1294xl-make-freertos-builtin'; then\n#          make -C tutorials/ti/ek-tm4c1294xl-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n#\n#  test_same54:\n#    runs-on: ubuntu-latest\n#    env:\n#      GO: 0\n#    steps:\n#    - uses: actions/checkout@v4\n#      with: { fetch-depth: 2 }\n#    - name: baremetal\n#      run: |\n#        if ./test/match_changed_files.sh \"^src|tutorials/http/device-dashboard|tutorials/mqtt/mqtt-client\" ; then\n#          echo GO=1 >> $GITHUB_ENV\n#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      run: |\n#        if ./test/match_changed_files.sh '^src|tutorials/http/device-dashboard'; then\n#          make -C tutorials/http/device-dashboard/microchip/same54-xpro test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      run: |\n#        if ./test/match_changed_files.sh '^src|tutorials/mqtt/mqtt-client'; then\n#          make -C tutorials/mqtt/mqtt-client/microchip/same54-xpro test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n#        fi\n#\n#  test_pico_w5500:\n#    runs-on: ubuntu-latest\n#    env:\n#      GO: 0\n#    steps:\n#    - uses: actions/checkout@v4\n#      with: { fetch-depth: 2 }\n#    - name: SDK\n#      run: |\n#        if ./test/match_changed_files.sh \"^src\" ; then\n#          echo GO=1 >> $GITHUB_ENV\n#          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n#        fi\n#    - if: ${{ env.GO == 1 }}\n#      run:  make -C tutorials/pico-sdk/w5500-evb-pico-picosdk-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n\n"
  },
  {
    "path": ".github/workflows/test.yml",
    "content": "name: original workflow, outdated # *** YES, OUTDATED *** kept for hystorical/reference purposes, attachment, etc.\non:\n  workflow_dispatch:\nenv:\n  IPV6: 0\njobs:\n  linux:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        cc: [gcc, clang, g++, clang++]\n        target: [test, mip_test]\n        ssl: [\"\", MBEDTLS, OPENSSL]\n        select: [\"-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=0\", \"-DMG_ENABLE_POLL=1 -DMG_ENABLE_EPOLL=0\", \"-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=1\"]\n        exclude:\n        - ssl: MBEDTLS\n          select: \"-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=0\"\n        - ssl: MBEDTLS\n          select: \"-DMG_ENABLE_POLL=1 -DMG_ENABLE_EPOLL=0\"\n        - ssl: OPENSSL\n          select: \"-DMG_ENABLE_POLL=0 -DMG_ENABLE_EPOLL=0\"\n        - ssl: OPENSSL\n          select: \"-DMG_ENABLE_POLL=1 -DMG_ENABLE_EPOLL=0\"\n    name: linux ${{ matrix.target }} CC=${{ matrix.cc }} SSL=${{ matrix.ssl }} TFLAGS=${{ matrix.select }}\n    env:\n      CC: ${{ matrix.cc }}\n      SSL: ${{ matrix.ssl }}\n      TFLAGS: ${{ matrix.select }}\n    steps:\n    - uses: actions/checkout@v3\n      with: { fetch-depth: 2 }\n    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi\n    - if: ${{ env.GO == 1 }}\n      run: ./test/setup_ga_network.sh && sudo apt -y update ; sudo apt -y install libmbedtls-dev && make ${{ matrix.target }}\n  s390:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v3\n      with: { fetch-depth: 2 }\n    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi\n    - if: ${{ env.GO == 1 }}\n      run: sudo apt -y update ; sudo apt -y install qemu binfmt-support qemu-user-static && docker run --rm --privileged multiarch/qemu-user-static --reset -p yes && make s390\n  armhf:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v3\n      with: { fetch-depth: 2 }\n    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi\n    - if: ${{ env.GO == 1 }}\n      run: sudo apt -y update ; sudo apt -y install qemu binfmt-support qemu-user-static && docker run --rm --privileged multiarch/qemu-user-static --reset -p yes && make armhf\n  linux2:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v3\n      with: { fetch-depth: 2 }\n    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi\n    - if: ${{ env.GO == 1 }}\n      run: sudo apt -y update ; sudo apt -y install libmbedtls-dev valgrind\n    - if: ${{ env.GO == 1 }}\n      run: make unamalgamated && make valgrind && make mg_prefix\n  macos:\n    runs-on: macos-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        ssl: [\"\", MBEDTLS, OPENSSL]\n        select: [-DMG_ENABLE_POLL=0, -DMG_ENABLE_POLL=1]\n        exclude:\n        - ssl: MBEDTLS\n          select: -DMG_ENABLE_POLL=0\n        - ssl: OPENSSL\n          select: -DMG_ENABLE_POLL=0\n    name: macos SSL=${{ matrix.ssl }} TFLAGS=${{ matrix.select }}\n    env:\n      SSL: ${{ matrix.ssl }}\n      TFLAGS: ${{ matrix.select }} -DNO_SNTP_CHECK -Wno-sign-conversion # Workaround for MbedTLS 3.5.0\n      HOMEBREW_NO_AUTO_UPDATE: 1\n    steps:\n    - uses: actions/checkout@v3\n      with: { fetch-depth: 2 }\n    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi\n    - if: ${{ env.GO == 1 }}\n      run: brew install jq mbedtls openssl\n    - if: ${{ env.GO == 1 }}\n      run:  make test ASAN_OPTIONS= MBEDTLS=`echo /usr/local/Cellar/mbedtls*/*` OPENSSL=`echo /usr/local/Cellar/openssl*/*`\n    - if: ${{ env.GO == 1 }}\n      run: make mg_prefix\n  windows:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        target: [vc98, vc17, vc22, mingw, mingw++]\n        select: [-DMG_ENABLE_POLL=0, -DMG_ENABLE_POLL=1]\n        exclude:\n        - target: vc98\n          select: -DMG_ENABLE_POLL=1\n    name: windows ${{ matrix.target }} TFLAGS=${{ matrix.select }}\n    env:\n      TFLAGS: ${{ matrix.select }}\n    steps:\n    - uses: actions/checkout@v3\n      with: { fetch-depth: 2 }\n    - run: if ./test/match_changed_files.sh '^test|^src/.*.[ch]' ; then echo GO=1 >> $GITHUB_ENV ; fi\n    - if: ${{ env.GO == 1 }}\n      run: make ${{ matrix.target }} \n  arm:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v3\n    - run: make arm\n  riscv:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v3\n    - run: make riscv\n\n  examples:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v3\n    - run: sudo apt -y install libmbedtls-dev libpcap-dev\n    - run: make examples\n    - run: make clean\n  examples_win:\n    runs-on: windows-latest\n    steps:\n    - uses: actions/checkout@v3\n#    - uses: egor-tensin/setup-mingw@v2\n#      with:\n#        platform: x64\n    - name: test they build\n      run: make examples_win\n      shell: cmd\n    - name: test they clean\n      run: make clean_examples_win\n      shell: cmd\n  examples_mac:\n    runs-on: macos-latest\n    env: { HOMEBREW_NO_AUTO_UPDATE: 1 }\n    steps:\n    - uses: actions/checkout@v3\n    - run: make examples_mac\n    - run: make clean_examples_mac\n\n\n  arduino:\n    runs-on: ubuntu-latest\n    env:\n      GO: 0\n    steps:\n    - uses: actions/checkout@v3\n      with: { fetch-depth: 2 }\n    - run: |\n        if ./test/match_changed_files.sh \"^src|examples/device-dashboard|examples/arduino\" ; then\n          echo GO=1 >> $GITHUB_ENV\n          # nothing specific to install or do\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/arduino'; then\n          make -C examples/arduino arduino-xiao\n        fi\n#    - if: ${{ env.GO == 1 }}\n#      run: |\n#        if ./test/match_changed_files.sh '^src|examples/arduino'; then\n#          make -C examples/arduino arduino-nano\n#        fi\n    - if: ${{ env.GO == 1 }}\n      run: make -C examples/arduino clean\n\n\n  generic_examples:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        example:\n          - path: esp32/uart-bridge\n          - path: esp32/micropython\n          - path: esp8266/http-client-server\n    name: ${{ matrix.example.path }}\n    env:\n      GO: 0\n    steps:\n      - uses: actions/checkout@v3\n        with: { fetch-depth: 2 }\n      - run: if ./test/match_changed_files.sh '^src|^examples/${{ matrix.example.path }}'; then echo GO=1 >> $GITHUB_ENV ; fi\n      - if: ${{ env.GO == 1 }}\n        run: |\n          # nothing specific to install or do\n      - if: ${{ env.GO == 1 }}\n        run: make -C examples/${{ matrix.example.path }} build\n  \n  generic_examples_arm:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        example:\n          - path: microchip/same54-xpro/mqtt-client\n          - path: infineon/infineon-xmc4700_4800-lwip-rtx-rtos\n          - path: nxp/nxp-mimxrt1020-azurertos\n          - path: nxp/nxp-frdmk66f-freertos\n          - path: nxp/nxp-lpcxpresso54s018m-freertos\n          - path: nxp/nxp-mimxrt1020-freertos\n          - path: nxp/nxp-evkbimxrt1050-lwip-freertos\n          - path: nxp/nxp-evkmimxrt1020-lwip-freertos\n          - path: nxp/nxp-evkmimxrt1024-lwip-freertos\n          - path: nxp/nxp-evkmimxrt1060-lwip-freertos\n          - path: nxp/nxp-evkmimxrt1064-lwip-freertos\n          - path: nxp/nxp-evkmimxrt1160-cm7-lwip-freertos\n          - path: nxp/nxp-evkmimxrt1170-cm7-lwip-freertos\n          - path: nxp/nxp-frdmk64f-lwip-freertos\n          - path: nxp/nxp-frdmk66f-lwip-freertos\n          - path: nxp/nxp-lpcxpresso54018-lwip-freertos\n          - path: nxp/nxp-lpcxpresso54608-lwip-freertos\n          - path: nxp/nxp-lpcxpresso54618-lwip-freertos\n          - path: nxp/nxp-lpcxpresso54628-lwip-freertos\n          - path: nxp/nxp-twrk65f180m-lwip-freertos\n          - path: nxp/nxp-twrkv58f220m-lwip-freertos\n          - path: rp2040/pico-rmii\n          - path: stm32/nucleo-f429zi-make-baremetal-builtin-rndis\n          - path: stm32/nucleo-f746zg-make-baremetal-builtin-rndis\n          - path: stm32/nucleo-g031-make-baremetal-builtin\n          - path: ti/ti-ek-tm4c1294xl-http-server\n          - path: ti/ek-tm4c1294xl-make-baremetal-builtin-rndis\n    name: ${{ matrix.example.path }}\n    env:\n      GO: 0\n    steps:\n      - uses: actions/checkout@v3\n        with: { fetch-depth: 2 }\n      - run: if ./test/match_changed_files.sh '^src|^examples/${{ matrix.example.path }}'; then echo GO=1 >> $GITHUB_ENV ; fi\n      - if: ${{ env.GO == 1 }}\n        run: sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n      - if: ${{ env.GO == 1 }}\n        run: make -C examples/${{ matrix.example.path }} build\n\n  device_dashboard_examples:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        example:\n          - path: esp32/device-dashboard\n    name: ${{ matrix.example.path }}\n    env:\n      GO: 0\n    steps:\n      - uses: actions/checkout@v3\n        with: { fetch-depth: 2 }\n      - run: |\n          if ./test/match_changed_files.sh '^src|examples/device-dashboard|^examples/${{ matrix.example.path }}'; then\n            echo GO=1 >> $GITHUB_ENV\n            # nothing specific to install or do\n          fi\n      - if: ${{ env.GO == 1 }}\n        run: make -C examples/${{ matrix.example.path }} build\n\n  device_dashboard_examples_arm:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        example:\n          - path: microchip/same54-xpro/device-dashboard\n          - path: nxp/rt1020-evk-make-baremetal-builtin\n          - path: nxp/rt1020-evk-make-freertos-builtin\n          - path: nxp/rt1060-evk-make-baremetal-builtin\n          - path: nxp/rt1060-evk-make-freertos-builtin\n          - path: rp2040/pico-rndis-dashboard\n          - path: rp2040/pico-w\n          - path: rp2040/pico-w5500\n          - path: stm32/nucleo-f429zi-make-baremetal-builtin\n          - path: stm32/nucleo-f429zi-make-freertos-builtin\n          - path: stm32/nucleo-f746zg-make-baremetal-builtin\n          - path: stm32/nucleo-f746zg-make-freertos-builtin\n          - path: stm32/nucleo-f746zg-make-freertos-tcp\n          - path: stm32/nucleo-f746zg-make-baremetal-builtin-cmsis_driver\n          - path: stm32/nucleo-h563zi-make-baremetal-builtin\n          - path: stm32/nucleo-h563zi-make-freertos-builtin\n          - path: stm32/nucleo-h723zg-make-freertos-builtin\n          - path: stm32/nucleo-h743zi-make-baremetal-builtin\n          - path: stm32/nucleo-h743zi-make-freertos-builtin\n          - path: stm32/stm32h573i-dk-make-baremetal-builtin\n          - path: stm32/stm32h573i-dk-make-freertos-builtin\n          - path: ti/ek-tm4c1294xl-make-baremetal-builtin\n          - path: ti/ek-tm4c1294xl-make-freertos-builtin\n    name: ${{ matrix.example.path }}\n    env:\n      GO: 0\n    steps:\n      - uses: actions/checkout@v3\n        with: { fetch-depth: 2 }\n      - run: |\n          if ./test/match_changed_files.sh '^src|examples/device-dashboard|^examples/${{ matrix.example.path }}'; then\n            echo GO=1 >> $GITHUB_ENV\n            sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n          fi\n      - if: ${{ env.GO == 1 }}\n        run: make -C examples/${{ matrix.example.path }} build\n\n#  mqtt_dashboard_examples:\n#    runs-on: ubuntu-latest\n#    strategy:\n#      fail-fast: false\n#      matrix:\n#        example:\n#          - path: \n#    name: ${{ matrix.example.path }}\n#    env:\n#      GO: 0\n#    steps:\n#      - uses: actions/checkout@v3\n#        with: { fetch-depth: 2 }\n#      - run: |\n#          if ./test/match_changed_files.sh '^src|examples/mqtt-dashboard/device|^examples/${{ matrix.example.path }}'; then\n#            echo GO=1 >> $GITHUB_ENV\n#            # nothing specific to install or do\n#          fi\n#      - if: ${{ env.GO == 1 }}\n#        run: make -C examples/${{ matrix.example.path }} build\n      \n  mqtt_dashboard_examples_arm:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        example:\n          - path: rp2040/pico-rndis-device\n    name: ${{ matrix.example.path }}\n    env:\n      GO: 0\n    steps:\n      - uses: actions/checkout@v3\n        with: { fetch-depth: 2 }\n      - run: |\n          if ./test/match_changed_files.sh '^src|examples/mqtt-dashboard/device|^examples/${{ matrix.example.path }}'; then\n            echo GO=1 >> $GITHUB_ENV\n            sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n          fi\n      - if: ${{ env.GO == 1 }}\n        run: make -C examples/${{ matrix.example.path }} build\n      \n#  dual_examples:\n#    runs-on: ubuntu-latest\n#    strategy:\n#      fail-fast: false\n#      matrix:\n#        example:\n#          - path: \n#    name: ${{ matrix.example.path }}\n#    env:\n#      GO: 0\n#    steps:\n#      - uses: actions/checkout@v3\n#        with: { fetch-depth: 2 }\n#      - run: |\n#          if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/mqtt-dashboard/device|^examples/${{ matrix.example.path }}'; then\n#            echo GO=1 >> $GITHUB_ENV\n#            # nothing specific to install or do\n#          fi\n#      - if: ${{ env.GO == 1 }}\n#        run: |\n#          if ./test/match_changed_files.sh '^src|examples/device-dashboard|^examples/${{ matrix.example.path }}'; then\n#            make -C examples/${{ matrix.example.path }} device_dashboard\n#          fi\n#      - if: ${{ env.GO == 1 }}\n#        run: |\n#          if ./test/match_changed_files.sh '^src|examples/mqtt-dashboard/device|^examples/${{ matrix.example.path }}'; then\n#            make -C examples/${{ matrix.example.path }} mqtt_dashboard\n#          fi\n\n  dual_examples_arm:\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        example:\n          - path: stm32/nucleo-h723zg-make-baremetal-builtin\n    name: ${{ matrix.example.path }}\n    env:\n      GO: 0\n    steps:\n      - uses: actions/checkout@v3\n        with: { fetch-depth: 2 }\n      - run: |\n          if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/mqtt-dashboard/device|^examples/${{ matrix.example.path }}'; then\n            echo GO=1 >> $GITHUB_ENV\n            sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n          fi\n      - if: ${{ env.GO == 1 }}\n        run: |\n          if ./test/match_changed_files.sh '^src|examples/device-dashboard|^examples/${{ matrix.example.path }}'; then\n            make -C examples/${{ matrix.example.path }} device_dashboard\n          fi\n      - if: ${{ env.GO == 1 }}\n        run: |\n          if ./test/match_changed_files.sh '^src|examples/mqtt-dashboard/device|^examples/${{ matrix.example.path }}'; then\n            make -C examples/${{ matrix.example.path }} mqtt_dashboard\n          fi\n\n  cube_examples:\n    runs-on: ubuntu-latest\n    env:\n      GO: 0\n    steps:\n      - uses: actions/checkout@v3\n        with: { fetch-depth: 2 }\n      - run: |\n          if ./test/match_changed_files.sh '^src|examples/stm32/nucleo-*-cube-*'; then\n            echo GO=1 >> $GITHUB_ENV\n            # nothing specific to install or do\n          fi\n      - if: ${{ env.GO == 1 }}\n        run: cd test/cube && make\n\n  zephyr_examples:\n    runs-on: ubuntu-latest\n    env:\n      GO: 0\n    steps:\n      - uses: actions/checkout@v3\n        with: { fetch-depth: 2 }\n      - run: |\n          if ./test/match_changed_files.sh '^src/.*.[ch]|^examples/zephyr'; then\n            echo GO=1 >> $GITHUB_ENV\n            sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n            fi\n      - if: ${{ env.GO == 1 }}\n        run: make -C examples/zephyr init\n      - name: minify manifest\n        if: ${{ env.GO == 1 }}\n        uses: mikefarah/yq@master\n        with:\n          cmd: yq -i eval '(.manifest.defaults, .manifest.remotes, .manifest.projects[] | select(.name == \"cmsis\" or .name == \"hal_stm32\" or .name == \"mbedtls\" or .name == \"mcuboot\" or .name == \"picolibc\" | del(.null) ), .manifest.self) as $i ireduce({};setpath($i | path; $i)) | del(.manifest.projects.[].null) | del(..|select(length==0))' examples/zephyr/zephyrproject/zephyr/west.yml\n      - if: ${{ env.GO == 1 }}\n        run: make -C examples/zephyr update\n      - if: ${{ env.GO == 1 }}\n        run: make -C examples/zephyr/device-dashboard build\n      - if: ${{ env.GO == 1 }}\n        run: make -C examples/zephyr/http-client build\n      - if: ${{ env.GO == 1 }}\n        run: make -C examples/zephyr/http-server build\n      - if: ${{ env.GO == 1 }}\n        run: make -C examples/zephyr/mqtt-aws-client build\n      - if: ${{ env.GO == 1 }}\n        run: make -C examples/zephyr/websocket-server build\n\n  test_f7:\n    runs-on: ubuntu-latest\n    env:\n      GO: 0\n    steps:\n    - uses: actions/checkout@v3\n      with: { fetch-depth: 2 }\n    - name: baremetal\n      run: |\n        if ./test/match_changed_files.sh \"^src|examples/device-dashboard|examples/stm32/nucleo-f7.*-make-\" ; then\n          echo GO=1 >> $GITHUB_ENV\n          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f746zg-make-baremetal-builtin'; then\n          make -C examples/stm32/nucleo-f746zg-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f746zg-make-freertos-builtin'; then\n          make -C examples/stm32/nucleo-f746zg-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f746zg-make-freertos-tcp'; then\n          make -C examples/stm32/nucleo-f746zg-make-freertos-tcp test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n        fi\n    - name: Cube\n      run: |\n        echo GO=0 >> $GITHUB_ENV\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f7.*-cube-'; then\n          echo GO=1 >> $GITHUB_ENV\n          # nothing specific to install or do\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f746zg-cube-baremetal-builtin'; then\n          make -C test/cube test PROJECTS=../../examples/stm32/nucleo-f746zg-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f746zg-cube-freertos-builtin'; then\n          make -C test/cube test PROJECTS=../../examples/stm32/nucleo-f746zg-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5    \n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f746zg-cube-freertos-lwip'; then\n          make -C test/cube test PROJECTS=../../examples/stm32/nucleo-f746zg-cube-freertos-lwip VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=5\n        fi\n\n\n  test_f4:\n    runs-on: ubuntu-latest\n    env:\n      GO: 0\n    steps:\n    - uses: actions/checkout@v3\n      with: { fetch-depth: 2 }\n    - name: baremetal\n      run: |\n        if ./test/match_changed_files.sh \"^src|examples/device-dashboard|examples/stm32/nucleo-f4.*-make-\" ; then\n          echo GO=1 >> $GITHUB_ENV\n          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f429zi-make-baremetal-builtin'; then\n          make -C examples/stm32/nucleo-f429zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f429zi-make-freertos-builtin'; then\n          make -C examples/stm32/nucleo-f429zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n        fi\n    - name: Cube\n      run: |\n        echo GO=0 >> $GITHUB_ENV\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f4.*-cube-'; then\n          echo GO=1 >> $GITHUB_ENV\n          # nothing specific to install or do\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f429zi-cube-baremetal-builtin'; then\n          make -C test/cube test PROJECTS=../../examples/stm32/nucleo-f429zi-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f429zi-cube-freertos-builtin'; then\n          make -C test/cube test PROJECTS=../../examples/stm32/nucleo-f429zi-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-f429zi-cube-freertos-lwip'; then\n          make -C test/cube test PROJECTS=../../examples/stm32/nucleo-f429zi-cube-freertos-lwip VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=2\n        fi\n\n  test_h743:\n    runs-on: ubuntu-latest\n    env:\n      GO: 0\n    steps:\n    - uses: actions/checkout@v3\n      with: { fetch-depth: 3 }\n    - name: baremetal\n      run: |\n        if ./test/match_changed_files.sh \"^src|examples/device-dashboard|examples/stm32/nucleo-h74.*-make-\" ; then\n          echo GO=1 >> $GITHUB_ENV\n          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-h743zi-make-baremetal-builtin'; then\n        make -C examples/stm32/nucleo-h743zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-h743zi-make-freertos-builtin'; then\n          make -C examples/stm32/nucleo-h743zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n        fi\n    - name: Cube\n      run: |\n        echo GO=0 >> $GITHUB_ENV\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-h74.*-cube-'; then\n          echo GO=1 >> $GITHUB_ENV\n          # nothing specific to install or do\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-h743zi-cube-baremetal-builtin'; then\n          make -C test/cube test PROJECTS=../../examples/stm32/nucleo-h743zi-cube-baremetal-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=6\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-h743zi-cube-freertos-builtin'; then\n          make -C test/cube test PROJECTS=../../examples/stm32/nucleo-h743zi-cube-freertos-builtin VCON_API_KEY=${{secrets.VCON_API_KEY}} DEVICE=6\n        fi\n\n  test_h723:\n    runs-on: ubuntu-latest\n    env:\n      GO: 0\n    steps:\n    - uses: actions/checkout@v3\n      with: { fetch-depth: 3 }\n    - name: baremetal\n      run: |\n        if ./test/match_changed_files.sh \"^src|examples/device-dashboard|examples/stm32/nucleo-h72.*-make-\" ; then\n          echo GO=1 >> $GITHUB_ENV\n          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-h723zg-make-baremetal-builtin'; then\n          make -C examples/stm32/nucleo-h723zg-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-h723zg-make-freertos-builtin'; then\n          make -C examples/stm32/nucleo-h723zg-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n        fi\n    \n  test_h5:\n    runs-on: ubuntu-latest\n    env:\n      GO: 0\n    steps:\n    - uses: actions/checkout@v3\n      with: { fetch-depth: 3 }\n    - name: baremetal\n      run: |\n        if ./test/match_changed_files.sh \"^src|examples/device-dashboard|examples/stm32/nucleo-h5.*-make-\" ; then\n          echo GO=1 >> $GITHUB_ENV\n          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-h563zi-make-baremetal-builtin'; then\n          make -C examples/stm32/nucleo-h563zi-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/stm32/nucleo-h563zi-make-freertos-builtin'; then\n          make -C examples/stm32/nucleo-h563zi-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n        fi\n\n  test_rt1020:\n    runs-on: ubuntu-latest\n    env:\n      GO: 0\n    steps:\n    - uses: actions/checkout@v3\n      with: { fetch-depth: 3 }\n    - name: baremetal\n      run: |\n        if ./test/match_changed_files.sh \"^src|examples/device-dashboard|examples/nxp/rt1020.*-make-\" ; then\n          echo GO=1 >> $GITHUB_ENV\n          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        #if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/nxp/rt1020-evk-make-baremetal-builtin'; then\n        if ./test/match_changed_files.sh '^src|examples/nxp/rt1020-evk-make-baremetal-builtin'; then\n          make -C examples/nxp/rt1020-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        #if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/nxp/rt1020-evk-make-freertos-builtin'; then\n        if ./test/match_changed_files.sh '^src|examples/nxp/rt1020-evk-make-freertos-builtin'; then\n          make -C examples/nxp/rt1020-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n        fi\n\n  test_rt1060:\n    runs-on: ubuntu-latest\n    env:\n      GO: 0\n    steps:\n    - uses: actions/checkout@v3\n      with: { fetch-depth: 3 }\n    - name: baremetal\n      run: |\n        if ./test/match_changed_files.sh \"^src|examples/device-dashboard|examples/nxp/rt1060.*-make-\" ; then\n          echo GO=1 >> $GITHUB_ENV\n          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/nxp/rt1060-evk-make-baremetal-builtin'; then\n          make -C examples/nxp/rt1060-evk-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n        fi\n    - if: ${{ env.GO == 1 }}\n      run: |\n        if ./test/match_changed_files.sh '^src|examples/device-dashboard|examples/nxp/rt1060-evk-make-freertos-builtin'; then\n          make -C examples/nxp/rt1060-evk-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n        fi\n\n  test_tm4c:\n    runs-on: ubuntu-latest\n    env:\n      GO: 0\n    steps:\n    - uses: actions/checkout@v3\n      with: { fetch-depth: 2 }\n    - name: baremetal\n      run: |\n        if ./test/match_changed_files.sh \"^src|examples/device-dashboard|examples/ti/ek-tm4c.*-make-\" ; then\n          echo GO=1 >> $GITHUB_ENV\n          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n        fi\n    - if: ${{ env.GO == 1 }}\n      run:  make -C examples/ti/ek-tm4c1294xl-make-baremetal-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n    - if: ${{ env.GO == 1 }}\n      run:  make -C examples/ti/ek-tm4c1294xl-make-freertos-builtin test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n\n  test_same54:\n    runs-on: ubuntu-latest\n    env:\n      GO: 0\n    steps:\n    - uses: actions/checkout@v3\n      with: { fetch-depth: 2 }\n    - name: baremetal\n      run: |\n        if ./test/match_changed_files.sh \"^src|examples/device-dashboard|examples/microchip/same54-xpro\" ; then\n          echo GO=1 >> $GITHUB_ENV\n          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n        fi\n    - if: ${{ env.GO == 1 }}\n      run:  make -C examples/microchip/same54-xpro/device-dashboard test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n    - if: ${{ env.GO == 1 }}\n      run:  make -C examples/microchip/same54-xpro/mqtt-client test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n\n  test_pico_w5500:\n    runs-on: ubuntu-latest\n    env:\n      GO: 0\n    steps:\n    - uses: actions/checkout@v3\n      with: { fetch-depth: 2 }\n    - name: SDK\n      run: |\n        if ./test/match_changed_files.sh \"^src|examples/device-dashboard|examples/rp2040/pico-w5500\" ; then\n          echo GO=1 >> $GITHUB_ENV\n          sudo apt -y update && sudo apt -y install gcc-arm-none-eabi\n        fi\n    - if: ${{ env.GO == 1 }}\n      run:  make -C examples/rp2040/pico-w5500 test VCON_API_KEY=${{secrets.VCON_API_KEY}}\n\n"
  },
  {
    "path": ".github/workflows/zephyr.yml",
    "content": "name: Zephyr\non:\n  schedule:\n    - cron: '0 0 * * *' # run at 12 AM UTC\n  # Allow manual runs\n  workflow_dispatch:\njobs:\n  zephyr_examples:\n    runs-on: ubuntu-24.04\n    strategy:\n      fail-fast: false\n      matrix:\n        revno: [\"--mr v3.7-branch\", \"--mr v4.2.0\", \"--mr v4.3.0\"] # LTS, latest stable\n    name: Zephyr ${{ matrix.revno }}\n    steps:\n      - uses: actions/checkout@v4\n        with: { fetch-depth: 2 }\n      - run: test/setup_ga_docker_filesystem.sh\n      - run: make -C tutorials/zephyr init REPO=zephyrprojectrtos/ci:v0.28.8 REVNO=\"${{ matrix.revno }}\"\n      - run: make -C tutorials/zephyr minify REVNO=\"${{ matrix.revno }}\"\n      - run: make -C tutorials/zephyr update\n      - run: make -C tutorials/zephyr/device-dashboard build REPO=zephyrprojectrtos/ci:v0.28.8\n      - run: make -C tutorials/zephyr/http-client build REPO=zephyrprojectrtos/ci:v0.28.8\n      - run: make -C tutorials/zephyr/http-server build REPO=zephyrprojectrtos/ci:v0.28.8\n      - run: make -C tutorials/zephyr/mqtt-aws-client build REPO=zephyrprojectrtos/ci:v0.28.8\n      - run: make -C tutorials/zephyr/websocket-server build REPO=zephyrprojectrtos/ci:v0.28.8\n# Latest CI image does not work with pre 4.4, they changed some SDK paths\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) 2004-2013 Sergey Lyubka\nCopyright (c) 2013-2026 Cesanta Software Limited\nAll rights reserved\n\nThis software is dual-licensed: you can redistribute it and/or modify\nit under the terms of the GNU General Public License version 2 as\npublished by the Free Software Foundation. For the terms of this\nlicense, see <http://www.gnu.org/licenses/>.\n\nYou are free to use this software under the terms of the GNU General\nPublic License, but WITHOUT ANY WARRANTY; without even the implied\nwarranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\nSee the GNU General Public License for more details.\n\nAlternatively, you can license this software under a commercial\nlicense, as set out in <https://mongoose.ws/licensing/>.\n"
  },
  {
    "path": "README.md",
    "content": "# Mongoose - Embedded Web Server / Embedded Network Library\n\n[![License: GPLv2/Commercial](https://img.shields.io/badge/License-GPLv2%20or%20Commercial-green.svg)](https://opensource.org/licenses/gpl-2.0.php)\n[![Build Status]( https://github.com/cesanta/mongoose/actions/workflows/quicktest.yml/badge.svg)](https://github.com/cesanta/mongoose/actions)\n[![Code Coverage](https://codecov.io/gh/cesanta/mongoose/branch/master/graph/badge.svg)](https://codecov.io/gh/cesanta/mongoose)\n[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/mongoose.svg)](https://issues.oss-fuzz.com/issues?sort=-opened&can=1&q=proj:mongoose)\n\n<img src=\"https://mongoose.ws/images/logo.svg\" width=\"48\" height=\"48\" align=\"left\" style=\"float:left;\" /> Mongoose is a network library for C/C++.  It provides event-driven non-blocking\nAPIs for TCP, UDP, HTTP, WebSocket, MQTT, and other protocols.  It is designed\nfor connecting devices and bringing them online. On the market since 2004, used\nby vast number of open source and commercial products - it even runs on the\nInternational Space Station!  Mongoose makes embedded network programming fast,\nrobust, and easy. Features include:\n\n- Cross-platform:\n  - works on Linux/UNIX, MacOS, Windows, Android\n  - works on ST, NXP, ESP32, Nordic, TI, Microchip, Infineon, Renesas and other chips\n  - write code once - and it'll work everywhere\n  - ideal for the unification of the network infrastructure code across company\n- Built-in protocols: plain TCP/UDP, SNTP, HTTP, MQTT, Websocket, and other\n- Asynchronous DNS resolver\n- Tiny static and run-time footprint\n- Source code is both ISO C and ISO C++ compliant\n- Easy to integrate: just copy [mongoose.c](https://raw.githubusercontent.com/cesanta/mongoose/master/mongoose.c)\n  and [mongoose.h](https://raw.githubusercontent.com/cesanta/mongoose/master/mongoose.h) files to your source tree\n- Built-in TCP/IP stack with drivers for bare metal or RTOS systems\n   - Available drivers: STM32F, STM32H; NXP RT1xxx; TI TM4C; Microchip SAME54; Wiznet W5500\n   - A complete Web device dashboard on bare metal ST Nucleo boards is only 6 files\n   - For comparison, a CubeIDE generated HTTP example is 400+ files\n- Can run on top of an existing TCP/IP stack with BSD API, e.g. lwIP, Zephyr, Azure, etc\n- Built-in TLS 1.3 ECC stack. Also can use external TLS libraries - mbedTLS, OpenSSL, or other\n- Does not depend on any other software to implement networking\n- Built-in firmware updates for STM32 H5, STM32 H7\n\nSee https://mongoose.ws/ for complete documentation, videos, case studies, etc.\n\n## Supported platforms\n\nMongoose can work on top of any TCP/IP stack that supports BSD sockets API.\nPlatforms supported by the 3rd party TCP/IP stacks:\n\n| TCP/IP stack    | Notes |\n| :-------------- | :------- |\n| **lwIP**        | All devices running lwIP, for example ESP32, ESP32S3, ESP32C3, ESP32C6, etc |\n| **Zephyr**      | All devices supported by Zephyr |\n| **Other**       | Any other TCP/IP stack that supports BSD socket API, for example Amazon FreeRTOS-TCP |\n| **Linux, Mac, Windows**   | Workstations, server, single board computers, embedded Linux devices running on MPUs or FPGAs |\n\nOptionally, Mongoose provides its own built-in TCP/IP stack, eliminating the\nneed for additional software to implement networking functionality. The\nbuilt-in stack supports operation in both bare-metal and RTOS environments.\nPlatforms supported by the Mongoose built-in TCP/IP stack:\n\n| Hardware       | Notes |\n| :------------- | :------- |\n| **STM32**      | All STM32 MCUs with built-in Ethernet: STM32Fxx, STM32H5xx, STM32H7xx |\n| **NXP**        |  All NXP MCUs with built-in Ethernet: IMXRT102x, IMXRT104x, IMXRT105x, IMXRT106x, IMXRT117x, RW612, MCXN94x   |\n| **Microchip**  | ATSAME54 MCUs with built-int Ethernet  |\n| **Renesas**    | RA5M, RA6M, RA8M MCUs with built-in Ethernet    |\n| **Infineon**   | XMC4, XMC7 MCUs with built-in Ethernet    |\n| **Texas Instruments**  |  TM4C, TMS570 MCUs with built-in Ethernet   |\n| **Cypress WiFi**  | Any MCU with CY43xx WiFi chips, like RP2040 Pico-W, RP2350 Pico2-W, Arduino Portenta    |\n| **Wiznet Ethernet**  | Any MCU that use Wiznet W5500 or Wiznet 5100 MAC+PHY chips    |\n| **Cellular**   | NRF9160, SIM800    |\n\n## Usage Examples\n\nBelow are quick snippets that should give an idea how simple the API is and\nhow easy it is to create applications with it.\n\nCreate a simple web server that serves a directory. The behavior of the\nHTTP server is specified by its event handler function:\n\n```c\n#include \"mongoose.h\"   // To build, run: cc main.c mongoose.c\n\n// HTTP server event handler function\nvoid ev_handler(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    struct mg_http_serve_opts opts = { .root_dir = \"./web_root/\" };\n    mg_http_serve_dir(c, hm, &opts);\n  }\n}\n\nint main(void) {\n  struct mg_mgr mgr;  // Declare event manager\n  mg_mgr_init(&mgr);  // Initialise event manager\n  mg_http_listen(&mgr, \"http://0.0.0.0:8000\", ev_handler, NULL);  // Setup listener\n  for (;;) {          // Run an infinite event loop\n    mg_mgr_poll(&mgr, 1000);\n  }\n  return 0;\n}\n```\n\nHTTP server implements a REST API that returns current time. JSON formatting:\n```c\nstatic void ev_handler(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    if (mg_match(hm->uri, mg_str(\"/api/time/get\"), NULL)) {\n      mg_http_reply(c, 200, \"\", \"{%m:%lu}\\n\", MG_ESC(\"time\"), time(NULL));\n    } else {\n      mg_http_reply(c, 500, \"\", \"{%m:%m}\\n\", MG_ESC(\"error\"), MG_ESC(\"Unsupported URI\")); \n    }\n  }\n}\n```\n\nMQTT client that subscribes to a topic `device1/rx` and\nechoes incoming messages to `device1/tx`:\n\n```c\n#include \"mongoose.h\"\n\nstatic const char *s_mqtt_url = \"mqtt://broker.hivemq.com:1883\";\nstatic struct mg_connection *s_mqtt_conn = NULL;\n\n// MQTT connection event handler function\nstatic void ev_handler(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_OPEN) {\n    MG_INFO((\"%lu created, connecting to %s ...\", c->id, s_mqtt_url));\n  } else if (ev == MG_EV_MQTT_OPEN) {\n    struct mg_mqtt_opts opts = {.qos = 1, .topic = mg_str(\"device1/rx\")};\n    mg_mqtt_sub(c, &opts);\n    MG_INFO((\"%lu connected, subscribing to %s\", c->id, opts.topic.buf));\n  } else if (ev == MG_EV_MQTT_MSG) {\n    char response[100];\n    struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;\n    struct mg_mqtt_opts opts = {.qos = 1, .topic = mg_str(\"device1/tx\")};\n    mg_snprintf(response, sizeof(response), \"Received [%.*s] / [%.*s]\",\n                mm->topic.len, mm->topic.buf, mm->data.len, mm->data.buf);\n    opts.message = mg_str(response);\n    mg_mqtt_pub(c, &opts);\n  } else if (ev == MG_EV_CLOSE) {\n    MG_INFO((\"%u closing\", c->id));\n    s_mqtt_conn = NULL;\n  }\n}\n\n// Reconnection timer function. If we get disconnected, reconnect again\nstatic void timer_fn(void *arg) {\n  struct mg_mgr *mgr = (struct mg_mgr *) arg;\n  if (s_mqtt_conn == NULL) {\n    struct mg_mqtt_opts opts = {.clean = true};\n    s_mqtt_conn = mg_mqtt_connect(mgr, s_mqtt_url, &opts, ev_handler, NULL);\n  }\n}\n\nint main() {\n  struct mg_mgr mgr;  // Mongoose event manager. Holds all connections\n  mg_mgr_init(&mgr);  // Initialise event manager\n  mg_timer_add(&mgr, 3000, MG_TIMER_REPEAT | MG_TIMER_RUN_NOW, timer_fn, &mgr);\n  for (;;) {\n    mg_mgr_poll(&mgr, 1000);  // Infinite event loop\n  }\n  return 0;\n}\n```\n\n## Commercial use\n- Mongoose is used by hundreds of businesses, from Fortune500 giants like\n  Siemens, Schneider Electric, Broadcom, Bosch, Google, Samsung, Qualcomm, Caterpillar to the small businesses\n- Used to solve a wide range of business needs, like implementing Web UI\n  interface on devices, RESTful API services, telemetry data exchange, remote\n  control for a product, remote software updates, remote monitoring, and others\n- Deployed to hundreds of millions devices in production environment worldwide\n- See [Case Studies](https://mongoose.ws/case-studies/) from our respected\n  customers like [Schneider Electric](https://mongoose.ws/case-studies/schneider-electric/) (industrial automation), [Broadcom](https://mongoose.ws/case-studies/broadcom/) (semiconductors), [Pilz](https://mongoose.ws/case-studies/pilz/) (industrial automation), and others\n- See [Testimonials](https://mongoose.ws/testimonials/) from engineers that integrated Mongoose in their commercial products\n- We provide [Evaluation and Commercial licensing](https://mongoose.ws/licensing/), [support](https://mongoose.ws/support/), consultancy and [integration\n  services](https://mongoose.ws/integration/) - don't hesitate to [contact us](https://mongoose.ws/contact/)\n\n\n## Security\n\nWe take security seriously:\n1. Mongoose repository runs a\n  [continuous integration test powered by GitHub](https://github.com/cesanta/mongoose/actions),\n  which runs through hundreds of unit tests on every commit to the repository.\n  Our [unit tests](https://github.com/cesanta/mongoose/tree/master/test)\n  are built with modern address sanitizer technologies, which help to find\n  security vulnerabilities early\n2. Mongoose repository is integrated into Google's\n  [oss-fuzz continuous fuzzer](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:mongoose)\n  which scans for potential vulnerabilities continuously\n3.  We receive periodic vulnerability reports from the independent security\n  groups like\n  [Cisco Talos](https://www.cisco.com/c/en/us/products/security/talos.html),\n  [Microsoft Security Response Center](https://www.microsoft.com/en-us/msrc),\n  [MITRE Corporation](https://www.mitre.org/),\n  [Compass Security](https://www.compass-security.com/en/) and others.\n  In case of the vulnerability found, we act according to the industry best\n  practice: hold on to the publication, fix the software and notify all our\n  customers that have an appropriate subscription\n4. Some of our customers (for example NASA)\n  have specific security requirements and run independent security audits,\n  of which we get notified and in case of any issue, act similar to (3).\n\n## How to report security vulnerabilities\n\nPlease send an email to support@cesanta.com, with the full information.\nDo NOT create a github issue.\n\n## Articles\n\nTechnical guides and deep dives into embedded web servers, WebUI integration and embedded networking technologies:\n- [Embedded Web Server: A Comprehensive Guide for Modern Connected Devices](https://mongoose.ws/articles/embedded-web-server-a-comprehensive-guide-for-modern-connected-devices/)\n- [Building Embedded Web Device Dashboards](https://mongoose.ws/articles/building-embedded-web-device-dashboard/)\n- [ESP32 Device Dashboard: A Step-by-Step Guide for Developers](https://mongoose.ws/articles/esp32-device-dashboard/)\n- [How to build an STM32 Web Dashboard](https://mongoose.ws/articles/stm32-device-dashboard/)\n- [STM32 WebSocket Guide](https://mongoose.ws/articles/stm32-websocket-guide/)\n- [Web File Manager on STM32, ESP32 and Embedded Linux](https://mongoose.ws/articles/building-a-web-file-manager-on-stm32-esp32-embedded-linux/)\n- [Web dashboard on Zephyr RTOS](https://mongoose.ws/articles/web-dashboard-on-zephyr-rtos/)\n- [Limiting TCP/IP RAM usage on STM32](https://mongoose.ws/articles/limiting-tcpip-ram-usage-on-stm32/)\n- [STM32 Ethernet explained](https://mongoose.ws/articles/stm32-ethernet-explained/)\n- [MQTT on a Microcontroller](https://mongoose.ws/articles/mqtt-on-a-microcontroller/)\n- [STM32 OTA Firmware Update](https://mongoose.ws/articles/stm32-ota-firmware-update/)\n- [RP2350 OTA Firmware Update](https://mongoose.ws/articles/rp2350-ota-firmware-update/)\n- [STM32 Ethernet and caches](https://mongoose.ws/articles/stm32-ethernet-and-cache/)\n- [NXP RW612 OTA Firmware Update](https://mongoose.ws/articles/rw612-ota-firmware-update/)\n- [lwIP vs Mongoose - TCP/IP Stack Integration Benchmark](https://mongoose.ws/articles/lwip-vs-mongoose-tcpip-stack-integration/)\n\n\n## Contributions\n\nContributions are welcome! Please follow the guidelines below:\n\n- Sign [Cesanta CLA](https://cesanta.com/cla.html) and send GitHub pull request\n- Make sure that PRs have only one commit, and deal with one issue only\n"
  },
  {
    "path": "mongoose.c",
    "content": "// Copyright (c) 2004-2013 Sergey Lyubka\n// Copyright (c) 2013-2025 Cesanta Software Limited\n// All rights reserved\n//\n// This software is dual-licensed: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License version 2 as\n// published by the Free Software Foundation. For the terms of this\n// license, see http://www.gnu.org/licenses/\n//\n// You are free to use this software under the terms of the GNU General\n// Public License, but WITHOUT ANY WARRANTY; without even the implied\n// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n// See the GNU General Public License for more details.\n//\n// Alternatively, you can license this software under a commercial\n// license, as set out in https://www.mongoose.ws/licensing/\n//\n// SPDX-License-Identifier: GPL-2.0-only or commercial\n\n#include \"mongoose.h\"\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/base64.c\"\n#endif\n\n\nstatic int mg_base64_encode_single(int c) {\n  if (c < 26) {\n    return c + 'A';\n  } else if (c < 52) {\n    return c - 26 + 'a';\n  } else if (c < 62) {\n    return c - 52 + '0';\n  } else {\n    return c == 62 ? '+' : '/';\n  }\n}\n\nstatic int mg_base64_decode_single(int c) {\n  if (c >= 'A' && c <= 'Z') {\n    return c - 'A';\n  } else if (c >= 'a' && c <= 'z') {\n    return c + 26 - 'a';\n  } else if (c >= '0' && c <= '9') {\n    return c + 52 - '0';\n  } else if (c == '+') {\n    return 62;\n  } else if (c == '/') {\n    return 63;\n  } else if (c == '=') {\n    return 64;\n  } else {\n    return -1;\n  }\n}\n\nsize_t mg_base64_update(unsigned char ch, char *to, size_t n) {\n  unsigned long rem = (n & 3) % 3;\n  if (rem == 0) {\n    to[n] = (char) mg_base64_encode_single(ch >> 2);\n    to[++n] = (char) ((ch & 3) << 4);\n  } else if (rem == 1) {\n    to[n] = (char) mg_base64_encode_single(to[n] | (ch >> 4));\n    to[++n] = (char) ((ch & 15) << 2);\n  } else {\n    to[n] = (char) mg_base64_encode_single(to[n] | (ch >> 6));\n    to[++n] = (char) mg_base64_encode_single(ch & 63);\n    n++;\n  }\n  return n;\n}\n\nsize_t mg_base64_final(char *to, size_t n) {\n  size_t saved = n;\n  // printf(\"---[%.*s]\\n\", n, to);\n  if (n & 3) n = mg_base64_update(0, to, n);\n  if ((saved & 3) == 2) n--;\n  // printf(\"    %d[%.*s]\\n\", n, n, to);\n  while (n & 3) to[n++] = '=';\n  to[n] = '\\0';\n  return n;\n}\n\nsize_t mg_base64_encode(const unsigned char *p, size_t n, char *to, size_t dl) {\n  size_t i, len = 0;\n  if (dl > 0) to[0] = '\\0';\n  if (dl < ((n / 3) + (n % 3 ? 1 : 0)) * 4 + 1) return 0;\n  for (i = 0; i < n; i++) len = mg_base64_update(p[i], to, len);\n  len = mg_base64_final(to, len);\n  return len;\n}\n\nsize_t mg_base64_decode(const char *src, size_t n, char *dst, size_t dl) {\n  const char *end = src == NULL ? NULL : src + n;  // Cannot add to NULL\n  size_t len = 0;\n  if (dl < n / 4 * 3 + 1) goto fail;\n  while (src != NULL && src + 3 < end) {\n    int a = mg_base64_decode_single(src[0]),\n        b = mg_base64_decode_single(src[1]),\n        c = mg_base64_decode_single(src[2]),\n        d = mg_base64_decode_single(src[3]);\n    if (a == 64 || a < 0 || b == 64 || b < 0 || c < 0 || d < 0) {\n      goto fail;\n    }\n    dst[len++] = (char) ((a << 2) | (b >> 4));\n    if (src[2] != '=') {\n      dst[len++] = (char) ((b << 4) | (c >> 2));\n      if (src[3] != '=') dst[len++] = (char) ((c << 6) | d);\n    }\n    src += 4;\n  }\n  dst[len] = '\\0';\n  return len;\nfail:\n  if (dl > 0) dst[0] = '\\0';\n  return 0;\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/dns.c\"\n#endif\n\n\n\n\n\n\n\n\nstruct dns_data {\n  struct dns_data *next;\n  struct mg_connection *c;\n  uint64_t expire;\n  uint16_t txnid;\n};\n\nstatic void mg_sendnsreq(struct mg_connection *, struct mg_str *, int,\n                         struct mg_dns *, bool);\n\nstatic void mg_dns_free(struct dns_data **head, struct dns_data *d) {\n  LIST_DELETE(struct dns_data, head, d);\n  mg_free(d);\n}\n\nvoid mg_resolve_cancel(struct mg_connection *c) {\n  struct dns_data *tmp, *d;\n  struct dns_data **head = (struct dns_data **) &c->mgr->active_dns_requests;\n  for (d = *head; d != NULL; d = tmp) {\n    tmp = d->next;\n    if (d->c == c) mg_dns_free(head, d);\n  }\n}\n\nstatic size_t mg_dns_parse_name_depth(const uint8_t *s, size_t len, size_t ofs,\n                                      char *to, size_t tolen, size_t j,\n                                      int depth) {\n  size_t i = 0;\n  if (tolen > 0 && depth == 0) to[0] = '\\0';\n  if (depth > 5) return 0;\n  // MG_INFO((\"ofs %lx %x %x\", (unsigned long) ofs, s[ofs], s[ofs + 1]));\n  while (ofs + i + 1 < len) {\n    size_t n = s[ofs + i];\n    if (n == 0) {\n      i++;\n      break;\n    }\n    if (n & 0xc0) {\n      size_t ptr = (((n & 0x3f) << 8) | s[ofs + i + 1]);  // 12 is hdr len\n      // MG_INFO((\"PTR %lx\", (unsigned long) ptr));\n      if (ptr + 1 < len && (s[ptr] & 0xc0) == 0 &&\n          mg_dns_parse_name_depth(s, len, ptr, to, tolen, j, depth + 1) == 0)\n        return 0;\n      i += 2;\n      break;\n    }\n    if (ofs + i + n + 1 >= len) return 0;\n    if (j > 0) {\n      if (j < tolen) to[j] = '.';\n      j++;\n    }\n    if (j + n < tolen) memcpy(&to[j], &s[ofs + i + 1], n);\n    j += n;\n    i += n + 1;\n    if (j < tolen) to[j] = '\\0';  // Zero-terminate this chunk\n    // MG_INFO((\"--> [%s]\", to));\n  }\n  if (tolen > 0) to[tolen - 1] = '\\0';  // Make sure it is nul-term\n  return i;\n}\n\nstatic size_t mg_dns_parse_name(const uint8_t *s, size_t n, size_t ofs,\n                                char *dst, size_t dstlen) {\n  return mg_dns_parse_name_depth(s, n, ofs, dst, dstlen, 0, 0);\n}\n\nsize_t mg_dns_parse_rr(const uint8_t *buf, size_t len, size_t ofs,\n                       bool is_question, struct mg_dns_rr *rr) {\n  const uint8_t *s = buf + ofs, *e = &buf[len];\n\n  memset(rr, 0, sizeof(*rr));\n  if (len < sizeof(struct mg_dns_header)) return 0;  // Too small\n  if (len > 512) return 0;  //  Too large, we don't expect that\n  if (s >= e) return 0;     //  Overflow\n\n  if ((rr->nlen = (uint16_t) mg_dns_parse_name(buf, len, ofs, NULL, 0)) == 0)\n    return 0;\n  s += rr->nlen + 4;\n  if (s > e) return 0;\n  rr->atype = (uint16_t) (((uint16_t) s[-4] << 8) | s[-3]);\n  rr->aclass = (uint16_t) (((uint16_t) s[-2] << 8) | s[-1]);\n  if (is_question) return (size_t) (rr->nlen + 4);\n\n  s += 6;\n  if (s > e) return 0;\n  rr->alen = (uint16_t) (((uint16_t) s[-2] << 8) | s[-1]);\n  if (s + rr->alen > e) return 0;\n  return (size_t) (rr->nlen + rr->alen + 10);\n}\n\nbool mg_dns_parse(const uint8_t *buf, size_t len, struct mg_dns_message *dm) {\n  const struct mg_dns_header *h = (struct mg_dns_header *) buf;\n  struct mg_dns_rr rr;\n  size_t i, n, num_answers, ofs = sizeof(*h);\n  bool is_response;\n  memset(dm, 0, sizeof(*dm));\n\n  if (len < sizeof(*h)) return 0;                // Too small, headers dont fit\n  if (mg_ntohs(h->num_questions) > 1) return 0;  // Sanity\n  num_answers = mg_ntohs(h->num_answers);\n  if (num_answers > 10) {\n    MG_DEBUG((\"Got %u answers, ignoring beyond 10th one\", num_answers));\n    num_answers = 10;  // Sanity cap\n  }\n  dm->txnid = mg_ntohs(h->txnid);\n  is_response = mg_ntohs(h->flags) & 0x8000;\n\n  for (i = 0; i < mg_ntohs(h->num_questions); i++) {\n    if ((n = mg_dns_parse_rr(buf, len, ofs, true, &rr)) == 0) return false;\n    // MG_INFO((\"Q %lu %lu %hu/%hu\", ofs, n, rr.atype, rr.aclass));\n    mg_dns_parse_name(buf, len, ofs, dm->name, sizeof(dm->name));\n    ofs += n;\n  }\n\n  if (!is_response) {\n    // For queries, there is no need to parse the answers. In this way,\n    // we also ensure the domain name (dm->name) is parsed from\n    // the question field.\n    return true;\n  }\n\n  for (i = 0; i < num_answers; i++) {\n    if ((n = mg_dns_parse_rr(buf, len, ofs, false, &rr)) == 0) return false;\n    // MG_INFO((\"A -- %lu %lu %hu/%hu %s\", ofs, n, rr.atype, rr.aclass,\n    // dm->name));\n    mg_dns_parse_name(buf, len, ofs, dm->name, sizeof(dm->name));\n    ofs += n;\n\n    if (rr.alen == 4 && rr.atype == MG_DNS_RTYPE_A && rr.aclass == 1) {\n      dm->addr.is_ip6 = false;\n      memcpy(&dm->addr.addr.ip, &buf[ofs - 4], 4);\n      dm->resolved = true;\n      break;  // Return success\n    } else if (rr.alen == 16 && rr.atype == MG_DNS_RTYPE_AAAA &&\n               rr.aclass == 1) {\n      dm->addr.is_ip6 = true;\n      memcpy(&dm->addr.addr.ip, &buf[ofs - 16], 16);\n      dm->resolved = true;\n      break;  // Return success\n    }\n  }\n  return true;\n}\n\nstatic void dns_cb(struct mg_connection *c, int ev, void *ev_data) {\n  struct dns_data *d, *tmp;\n  struct dns_data **head = (struct dns_data **) &c->mgr->active_dns_requests;\n  if (ev == MG_EV_POLL) {\n    uint64_t now = *(uint64_t *) ev_data;\n    for (d = *head; d != NULL; d = tmp) {\n      tmp = d->next;\n      // MG_DEBUG (\"%lu %lu dns poll\", d->expire, now));\n      if (now > d->expire) mg_error(d->c, \"DNS timeout\");\n    }\n  } else if (ev == MG_EV_READ) {\n    struct mg_dns_message dm;\n    int resolved = 0;\n    if (mg_dns_parse(c->recv.buf, c->recv.len, &dm) == false) {\n      MG_ERROR((\"Unexpected DNS response:\"));\n      mg_hexdump(c->recv.buf, c->recv.len);\n    } else {\n      // MG_VERBOSE((\"%s %d\", dm.name, dm.resolved));\n      for (d = *head; d != NULL; d = tmp) {\n        tmp = d->next;\n        // MG_INFO((\"d %p %hu %hu\", d, d->txnid, dm.txnid));\n        if (dm.txnid != d->txnid) continue;\n        if (d->c->is_resolving) {\n          if (dm.resolved) {\n            dm.addr.port = d->c->rem.port;  // Save port\n            d->c->rem = dm.addr;            // Copy resolved address\n            MG_DEBUG(\n                (\"%lu %s is %M\", d->c->id, dm.name, mg_print_ip, &d->c->rem));\n            mg_connect_resolved(d->c);\n#if MG_ENABLE_IPV6\n          } else if (dm.addr.is_ip6 == false && dm.name[0] != '\\0' &&\n                     c->mgr->use_dns6 == false) {\n            struct mg_str x = mg_str(dm.name);\n            mg_sendnsreq(d->c, &x, c->mgr->dnstimeout, &c->mgr->dns6, true);\n#endif\n          } else {\n            mg_error(d->c, \"%s DNS lookup failed\", dm.name);\n          }\n        } else {\n          MG_ERROR((\"%lu already resolved\", d->c->id));\n        }\n        mg_dns_free(head, d);\n        resolved = 1;\n      }\n    }\n    if (!resolved) MG_ERROR((\"stray DNS reply\"));\n    c->recv.len = 0;\n  } else if (ev == MG_EV_CLOSE) {\n    for (d = *head; d != NULL; d = tmp) {\n      tmp = d->next;\n      mg_error(d->c, \"DNS error\");\n      mg_dns_free(head, d);\n    }\n  }\n}\n\nstatic bool mg_dns_send(struct mg_connection *c, const struct mg_str *name,\n                        uint16_t txnid, bool ipv6) {\n  struct {\n    struct mg_dns_header header;\n    uint8_t data[256];\n  } pkt;\n  size_t i, n;\n  memset(&pkt, 0, sizeof(pkt));\n  pkt.header.txnid = mg_htons(txnid);\n  pkt.header.flags = mg_htons(0x100);\n  pkt.header.num_questions = mg_htons(1);\n  for (i = n = 0; i < sizeof(pkt.data) - 5; i++) {\n    if (name->buf[i] == '.' || i >= name->len) {\n      pkt.data[n] = (uint8_t) (i - n);\n      memcpy(&pkt.data[n + 1], name->buf + n, i - n);\n      n = i + 1;\n    }\n    if (i >= name->len) break;\n  }\n  memcpy(&pkt.data[n], \"\\x00\\x00\\x01\\x00\\x01\", 5);  // A query\n  n += 5;\n  if (ipv6) pkt.data[n - 3] = 0x1c;  // AAAA query\n  // memcpy(&pkt.data[n], \"\\xc0\\x0c\\x00\\x1c\\x00\\x01\", 6);  // AAAA query\n  // n += 6;\n  return mg_send(c, &pkt, sizeof(pkt.header) + n);\n}\n\nbool mg_dnsc_init(struct mg_mgr *mgr, struct mg_dns *dnsc);\nbool mg_dnsc_init(struct mg_mgr *mgr, struct mg_dns *dnsc) {\n  if (dnsc->url == NULL) {\n    mg_error(0, \"DNS server URL is NULL. Call mg_mgr_init()\");\n    return false;\n  }\n  if (dnsc->c == NULL) {\n    dnsc->c = mg_connect(mgr, dnsc->url, NULL, NULL);\n    if (dnsc->c == NULL) return false;\n    dnsc->c->pfn = dns_cb;\n  }\n  return true;\n}\n\nstatic void mg_sendnsreq(struct mg_connection *c, struct mg_str *name, int ms,\n                         struct mg_dns *dnsc, bool ipv6) {\n  struct dns_data *d = NULL;\n  if (!mg_dnsc_init(c->mgr, dnsc)) {\n    mg_error(c, \"resolver\");\n  } else if ((d = (struct dns_data *) mg_calloc(1, sizeof(*d))) == NULL) {\n    mg_error(c, \"resolve OOM\");\n  } else {\n    struct dns_data *reqs = (struct dns_data *) c->mgr->active_dns_requests;\n    uint16_t id;\n    mg_random(&id, sizeof(uint16_t));\n    // TODO(): traverse reqs and check id != reqs->txnid; repeat otherwise\n    if (reqs != NULL) id = (uint16_t) (reqs->txnid + 1);  // no collision\n    d->txnid = id;\n    d->next = reqs;\n    c->mgr->active_dns_requests = d;\n    d->expire = mg_millis() + (uint64_t) ms;\n    d->c = c;\n    c->is_resolving = 1;\n    MG_VERBOSE((\"%lu resolving %.*s @ %s, txnid %hu\", c->id, (int) name->len,\n                name->buf, dnsc->url, d->txnid));\n    if (!mg_dns_send(dnsc->c, name, d->txnid, ipv6)) {\n      mg_error(dnsc->c, \"DNS send\");\n    }\n  }\n}\n\nvoid mg_resolve(struct mg_connection *c, const char *url) {\n  struct mg_str host = mg_url_host(url);\n  c->rem.port = mg_htons(mg_url_port(url));\n  if (mg_aton(host, &c->rem)) {\n    // host is an IP address, do not fire name resolution\n    mg_connect_resolved(c);\n  } else {\n    // host is not an IP, send DNS resolution request\n    struct mg_dns *dns = c->mgr->use_dns6 ? &c->mgr->dns6 : &c->mgr->dns4;\n    mg_sendnsreq(c, &host, c->mgr->dnstimeout, dns, c->mgr->use_dns6);\n  }\n}\n\nstatic const uint8_t mdns_answer[] = {\n    0, 1,          // 2 bytes - record type, A\n    0, 1,          // 2 bytes - address class, INET\n    0, 0, 0, 120,  // 4 bytes - TTL\n    0, 4           // 2 bytes - address length\n};\n\nstatic uint8_t *build_name(struct mg_str *name, uint8_t *p) {\n  *p++ = (uint8_t) name->len;  // label 1\n  memcpy(p, name->buf, name->len), p += name->len;\n  *p++ = 5;  // label 2\n  memcpy(p, \"local\", 5), p += 5;\n  *p++ = 0;  // no more labels\n  return p;\n}\n\nvoid mg_getlocaddr(struct mg_connection *, struct mg_addr *, struct mg_addr *);\n\nstatic uint8_t *build_a_record(struct mg_connection *c, uint8_t *p,\n                               struct mg_addr *addr) {\n  memcpy(p, mdns_answer, sizeof(mdns_answer)), p += sizeof(mdns_answer);\n  if (addr != NULL && !addr->is_ip6) {\n    memcpy(p, &addr->addr.ip4, 4), p += 4;\n  } else {\n#if MG_ENABLE_TCPIP\n    memcpy(p, &c->mgr->ifp->ip, 4), p += 4;\n#else\n    struct mg_addr loc, to;\n    memset(&loc, 0, sizeof(loc));\n    to.is_ip6 = false;\n    to.port = mg_htons(5353);\n    to.addr.ip4 = MG_IPV4(224, 0, 0, 51);\n    mg_getlocaddr(c, &to, &loc);\n    memcpy(p, &loc.addr.ip4, 4), p += 4;\n#endif\n  }\n  return p;\n}\n\nstatic uint8_t *build_srv_name(uint8_t *p, struct mg_dnssd_record *r) {\n  *p++ = (uint8_t) r->srvcproto.len - 5;  // label 1, up to '._tcp'\n  memcpy(p, r->srvcproto.buf, r->srvcproto.len), p += r->srvcproto.len;\n  p[-5] = 4;  // label 2, '_tcp', overwrite '.'\n  *p++ = 5;   // label 3\n  memcpy(p, \"local\", 5), p += 5;\n  *p++ = 0;  // no more labels\n  return p;\n}\n\n#if 0\n// TODO(): for listing\nstatic uint8_t *build_mysrv_name(struct mg_str *name, uint8_t *p,\n                                 struct mg_dnssd_record *r) {\n  *p++ = name->len;  // label 1\n  memcpy(p, name->buf, name->len), p += name->len;\n  return build_srv_name(p, r);\n}\n#endif\n\nstatic uint8_t *build_ptr_record(struct mg_str *name, uint8_t *p, uint16_t o) {\n  uint16_t offset = mg_htons(o);\n  memcpy(p, mdns_answer, sizeof(mdns_answer));\n  p[1] = MG_DNS_RTYPE_PTR;  // overwrite record type\n  p += sizeof(mdns_answer);\n  p[-1] = (uint8_t) name->len +\n          3;  // overwrite response length, label length + label + offset\n  *p++ = (uint8_t) name->len;                       // response: label 1\n  memcpy(p, name->buf, name->len), p += name->len;  // copy label\n  memcpy(p, &offset, 2);\n  *p |= 0xC0, p += 2;\n  return p;\n}\n\nstatic uint8_t *build_srv_record(struct mg_str *name, uint8_t *p,\n                                 struct mg_dnssd_record *r, uint16_t o) {\n  uint16_t port = mg_htons(r->port);\n  uint16_t offset = mg_htons(o);\n  memcpy(p, mdns_answer, sizeof(mdns_answer));\n  p[1] = MG_DNS_RTYPE_SRV;  // overwrite record type\n  p += sizeof(mdns_answer);\n  p[-1] = (uint8_t) name->len + 9;  // overwrite response length (4+2+1+2)\n  *p++ = 0;                         // priority\n  *p++ = 0;\n  *p++ = 0;  // weight\n  *p++ = 0;\n  memcpy(p, &port, 2), p += 2;  // port\n  *p++ = (uint8_t) name->len;   // label 1\n  memcpy(p, name->buf, name->len), p += name->len;\n  memcpy(p, &offset, 2);\n  *p |= 0xC0, p += 2;\n  return p;\n}\n\nstatic uint8_t *build_txt_record(uint8_t *p, struct mg_dnssd_record *r) {\n  uint16_t len = mg_htons((uint16_t) r->txt.len);\n  memcpy(p, mdns_answer, sizeof(mdns_answer));\n  p[1] = MG_DNS_RTYPE_TXT;  // overwrite record type\n  p += sizeof(mdns_answer);\n  memcpy(p - 2, &len, 2);  // overwrite response length\n  memcpy(p, r->txt.buf, r->txt.len), p += r->txt.len;  // copy record verbatim\n  return p;\n}\n\n// RFC-6762 16: case-insensitivity --> RFC-1034, 1035\n\nstatic void handle_mdns_query(struct mg_connection *c) {\n  struct mg_dns_header *qh = (struct mg_dns_header *) c->recv.buf;\n  struct mg_dns_rr rr;\n  size_t n;\n  // Parse first question, offset 12 is header size\n  n = mg_dns_parse_rr(c->recv.buf, c->recv.len, 12, true, &rr);\n  MG_VERBOSE((\"mDNS request parsed, result=%d\", (int) n));\n  if (n > 0) {\n    // RFC-6762 Appendix C, RFC2181 11: m(n + 1-63), max 255 + 0x0\n    uint8_t buf[sizeof(struct mg_dns_header) + 256 + sizeof(mdns_answer) + 4];\n    struct mg_dns_header *h = (struct mg_dns_header *) buf;\n    uint8_t *p = &buf[sizeof(*h)];\n    char name[256];\n    uint8_t name_len;\n    // uint16_t q = mg_ntohs(qh->num_questions);\n    struct mg_str defname = mg_str((const char *) c->fn_data);\n    struct mg_str *respname;\n    struct mg_mdns_req req;\n    memset(&req, 0, sizeof(req));\n    req.is_unicast = (rr.aclass & MG_BIT(15)) != 0;  // QU\n    rr.aclass &= (uint16_t) ~MG_BIT(15);  // remove \"QU\" (unicast response)\n    qh->num_questions = mg_htons(1);      // parser sanity\n    mg_dns_parse_name(c->recv.buf, c->recv.len, 12, name, sizeof(name));\n    name_len = (uint8_t) strlen(name);  // verify it ends in .local\n    if (name_len <= 6 || strcmp(\".local\", &name[name_len - 6]) != 0 ||\n        (rr.aclass != 1 && rr.aclass != 0xff))\n      return;\n    name[name_len -= 6] = '\\0';  // remove .local\n    MG_VERBOSE((\"RR %u %u %s\", (unsigned int) rr.atype,\n                (unsigned int) rr.aclass, name));\n    if (rr.atype == MG_DNS_RTYPE_A) {\n      // TODO(): ensure c->fn_data ends in \\0\n      // if we have a name to match, go; otherwise users will match and fill\n      // req.r.name and set req.is_resp\n      if (c->fn_data != NULL && mg_casecmp((char *) c->fn_data, name) != 0)\n        return;\n      req.is_resp = (c->fn_data != NULL);\n      req.reqname = mg_str_n(name, name_len);\n    } else  // users have to match the request to something in their db, then\n            // fill req.r and set req.is_resp\n      if (rr.atype == MG_DNS_RTYPE_PTR) {\n        if (strcmp(\"_services._dns-sd._udp\", name) == 0) req.is_listing = true;\n        MG_DEBUG(\n            (\"PTR request for %s\", req.is_listing ? \"services listing\" : name));\n        req.reqname = mg_str_n(name, name_len);\n      } else if (rr.atype == MG_DNS_RTYPE_SRV || rr.atype == MG_DNS_RTYPE_TXT) {\n        MG_DEBUG((\"%s request for %s\",\n                  rr.atype == MG_DNS_RTYPE_SRV ? \"SRV\" : \"TXT\", name));\n        // if possible, check it starts with our name, users will check it ends\n        // in a service name they handle\n        if (c->fn_data != NULL) {\n          if (mg_strcasecmp(defname, mg_str_n(name, defname.len)) != 0 ||\n              name[defname.len] != '.')\n            return;\n          req.reqname =\n              mg_str_n(name + defname.len + 1, name_len - defname.len - 1);\n          MG_DEBUG(\n              (\"That's us, handing %.*s\", req.reqname.len, req.reqname.buf));\n        } else {\n          req.reqname = mg_str_n(name, name_len);\n        }\n      } else {  // unhandled record\n        return;\n      }\n    req.rr = &rr;\n    mg_call(c, MG_EV_MDNS_REQ, &req);\n    if (!req.is_resp) return;\n    respname = req.respname.buf != NULL ? &req.respname : &defname;\n\n    memset(h, 0, sizeof(*h));                   // clear header\n    h->txnid = req.is_unicast ? qh->txnid : 0;  // RFC-6762 18.1\n    h->num_answers = mg_htons(1);  // RFC-6762 6: 0 questions, 1 Answer\n    h->flags = mg_htons(0x8400);   // Authoritative response\n    if (req.is_listing) {\n      // TODO(): RFC-6762 6: each responder SHOULD delay its response by a\n      // random amount of time selected with uniform random distribution in the\n      // range 20-120 ms.\n      // TODO():\n      return;\n    } else if (rr.atype == MG_DNS_RTYPE_PTR) {  // serve PTR + SRV + TXT + A\n      // TODO(): RFC-6762 6: each responder SHOULD delay its response by a\n      // random amount of time selected with uniform random distribution in the\n      // range 20-120 ms. Response to PTR is local_name._myservice._tcp.local\n      uint8_t *o = p, *aux;\n      uint16_t offset;\n      if (respname->buf == NULL || respname->len == 0) return;\n      h->num_other_prs = mg_htons(3);  // 3 additional records\n      p = build_srv_name(p, req.r);\n      aux = build_ptr_record(respname, p, (uint16_t) (o - buf));\n      o = p + sizeof(mdns_answer);  // point to PTR response (full srvc name)\n      offset = mg_htons((uint16_t) (o - buf));\n      o = p - 7;  // point to '.local' label (\\x05local\\x00)\n      p = aux;\n      memcpy(p, &offset, 2);  // point to full srvc name, in record\n      *p |= 0xC0, p += 2;\n      aux = p;\n      p = build_srv_record(respname, p, req.r, (uint16_t) (o - buf));\n      o = aux + sizeof(mdns_answer) + 6;  // point to target in SRV\n      memcpy(p, &offset, 2);              // point to full srvc name, in record\n      *p |= 0xC0, p += 2;\n      p = build_txt_record(p, req.r);\n      offset = mg_htons((uint16_t) (o - buf));\n      memcpy(p, &offset, 2);  // point to target name, in record\n      *p |= 0xC0, p += 2;\n      p = build_a_record(c, p, req.addr);\n    } else if (rr.atype == MG_DNS_RTYPE_TXT) {\n      p = build_srv_name(p, req.r);\n      p = build_txt_record(p, req.r);\n    } else if (rr.atype == MG_DNS_RTYPE_SRV) {  // serve SRV + A\n      uint8_t *o, *aux;\n      uint16_t offset;\n      if (respname->buf == NULL || respname->len == 0) return;\n      h->num_other_prs = mg_htons(1);  // 1 additional record\n      p = build_srv_name(p, req.r);\n      o = p - 7;  // point to '.local' label (\\x05local\\x00)\n      aux = p;\n      p = build_srv_record(respname, p, req.r, (uint16_t) (o - buf));\n      o = aux + sizeof(mdns_answer) + 6;  // point to target in SRV\n      offset = mg_htons((uint16_t) (o - buf));\n      memcpy(p, &offset, 2);  // point to target name, in record\n      *p |= 0xC0, p += 2;\n      p = build_a_record(c, p, req.addr);\n    } else {  // A requested\n      // RFC-6762 6: 0 Auth, 0 Additional RRs\n      if (respname->buf == NULL || respname->len == 0) return;\n      p = build_name(respname, p);\n      p = build_a_record(c, p, req.addr);\n    }\n    if (!req.is_unicast) mg_multicast_restore(c, (uint8_t *) &c->loc);\n    mg_send(c, buf, (size_t) (p - buf));  // And send it!\n    MG_DEBUG((\"%M > %M\", mg_print_ip_port, &c->loc, mg_print_ip_port, &c->rem));\n    MG_DEBUG((\"mDNS %s response sent\", req.is_unicast ? \"unicast\" : \"mcast\"));\n  }\n}\n\nstatic void handle_mdns_response(struct mg_connection *c) {\n  struct mg_dns_header *rh = (struct mg_dns_header *) c->recv.buf;\n  struct mg_dns_rr rr;\n  size_t n;\n  // Parse first response, offset 12 is header size\n  n = mg_dns_parse_rr(c->recv.buf, c->recv.len, 12, false, &rr);\n  MG_VERBOSE((\"mDNS response parsed, result=%d\", (int) n));\n  if (n > 0) {\n    // RFC-6762 Appendix C, RFC2181 11: m(n + 1-63), max 255 + 0x0\n    char name[256];\n    uint8_t name_len;\n    struct mg_mdns_resp resp;\n    memset(&resp, 0, sizeof(resp));\n    if (rh->num_answers > mg_htons(1)) MG_DEBUG((\"ignoring > 1 answers\"));\n    mg_dns_parse_name(c->recv.buf, c->recv.len, 12, name, sizeof(name));\n    name_len = (uint8_t) strlen(name);  // verify it ends in .local\n    MG_VERBOSE((\"RR %u %u %s\", (unsigned int) rr.atype,\n                (unsigned int) rr.aclass, name));\n    if (rr.alen == 4 && rr.atype == MG_DNS_RTYPE_A &&\n        (rr.aclass & 0x7FFF) == 1) {\n      resp.addr.is_ip6 = false;\n      memcpy(resp.addr.addr.ip, (char *) (rh + 1) + n - 4, 4);\n      MG_DEBUG((\"A response from %.*s = %M\", name_len, name, mg_print_ip,\n                &resp.addr));\n      //    } else if (rr.alen == 16 && rr.atype == MG_DNS_RTYPE_AAAA &&\n      //    (rr.aclass & 0x7FFF) == 1) {\n      //      resp.addr.is_ip6 = true;\n      //      memcpy(resp.addr.addr.ip, (char *)(rh + 1) + n - 16], 16);\n      //      MG_DEBUG((\"AAAA response from %.*s = %M\", name_len, name,\n      //      mg_print_ip, &resp.addr));\n    } else {\n      return;\n    }\n    resp.name = mg_str_n(name, name_len);\n    resp.rr = &rr;\n    mg_call(c, MG_EV_MDNS_RESP, &resp);\n  }\n}\n\nstatic void handle_mdns_record(struct mg_connection *c) {\n  struct mg_dns_header *h = (struct mg_dns_header *) c->recv.buf;\n  if (c->recv.len <= 12) return;\n  if ((h->flags & mg_htons(0xF800)) == 0) {\n    // flags -> !resp, opcode=0 => query; ignore other opcodes\n    handle_mdns_query(c);\n  } else if ((h->flags & mg_htons(0xF800)) == mg_htons(0x8000)) {\n    // flags -> resp, opcode=0 => response; ignore other opcodes\n    handle_mdns_response(c);\n  }\n}\n\nstatic void mdns_cb(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_READ) {\n    handle_mdns_record(c);\n    mg_iobuf_del(&c->recv, 0, c->recv.len);\n  }\n  (void) ev_data;\n}\n\nvoid mg_multicast_add(struct mg_connection *c, char *ip);\nstruct mg_connection *mg_mdns_listen(struct mg_mgr *mgr, mg_event_handler_t fn,\n                                     void *fn_data) {\n  struct mg_connection *c =\n      mg_listen(mgr, \"udp://224.0.0.251:5353\", fn, fn_data);\n  if (c == NULL) return NULL;\n  c->pfn = mdns_cb, c->pfn_data = fn_data;\n  mg_multicast_add(c, (char *) \"224.0.0.251\");\n  return c;\n}\n\nbool mg_mdns_query(struct mg_connection *c, const char *name,\n                   unsigned int rtype) {\n  struct mg_str name_;\n  name_.buf = (char *) name, name_.len = strlen(name);\n  mg_multicast_restore(c, (uint8_t *) &c->loc);\n  (void) rtype;\n  return mg_dns_send(c, &name_, 0, false);\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/event.c\"\n#endif\n\n\n\n\n\n\nvoid mg_call(struct mg_connection *c, int ev, void *ev_data) {\n#if MG_ENABLE_PROFILE\n  const char *names[] = {\n      \"EV_ERROR\",    \"EV_OPEN\",      \"EV_POLL\",      \"EV_RESOLVE\",\n      \"EV_CONNECT\",  \"EV_ACCEPT\",    \"EV_TLS_HS\",    \"EV_READ\",\n      \"EV_WRITE\",    \"EV_CLOSE\",     \"EV_HTTP_MSG\",  \"EV_HTTP_CHUNK\",\n      \"EV_WS_OPEN\",  \"EV_WS_MSG\",    \"EV_WS_CTL\",    \"EV_MQTT_CMD\",\n      \"EV_MQTT_MSG\", \"EV_MQTT_OPEN\", \"EV_SNTP_TIME\", \"EV_USER\"};\n  if (ev != MG_EV_POLL && ev < (int) (sizeof(names) / sizeof(names[0]))) {\n    MG_PROF_ADD(c, names[ev]);\n  }\n#endif\n  // Fire protocol handler first, user handler second. See #2559\n  if (c->pfn != NULL) c->pfn(c, ev, ev_data);\n  if (c->fn != NULL) c->fn(c, ev, ev_data);\n}\n\nvoid mg_error(struct mg_connection *c, const char *fmt, ...) {\n  char buf[64];\n  va_list ap;\n  va_start(ap, fmt);\n  mg_vsnprintf(buf, sizeof(buf), fmt, &ap);\n  va_end(ap);\n  MG_ERROR((\"%lu %ld %s\", c->id, c->fd, buf));\n  c->is_closing = 1;             // Set is_closing before sending MG_EV_CALL\n  mg_call(c, MG_EV_ERROR, buf);  // Let user handler override it\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/flash.c\"\n#endif\n\n\n\n\n\n#if MG_OTA != MG_OTA_NONE && MG_OTA != MG_OTA_CUSTOM\n\nstatic char *s_addr;      // Current address to write to\nstatic size_t s_size;     // Firmware size to flash. In-progress indicator\nstatic uint32_t s_crc32;  // Firmware checksum\n\nbool mg_ota_flash_begin(size_t new_firmware_size, struct mg_flash *flash) {\n  bool ok = false;\n  if (s_size) {\n    MG_ERROR((\"OTA already in progress. Call mg_ota_end()\"));\n  } else {\n    size_t half = flash->size / 2;\n    s_crc32 = 0;\n    s_addr = (char *) flash->start + half;\n    MG_DEBUG((\"FW %lu bytes, max %lu\", new_firmware_size, half));\n    if (new_firmware_size < half) {\n      ok = true;\n      s_size = new_firmware_size;\n      MG_INFO((\"Starting OTA, firmware size %lu\", s_size));\n    } else {\n      MG_ERROR((\"Firmware %lu is too big to fit %lu\", new_firmware_size, half));\n    }\n  }\n  return ok;\n}\n\nbool mg_ota_flash_write(const void *buf, size_t len, struct mg_flash *flash) {\n  bool ok = false;\n  if (s_size == 0) {\n    MG_ERROR((\"OTA is not started, call mg_ota_begin()\"));\n  } else {\n    size_t len_aligned_down = MG_ROUND_DOWN(len, flash->align);\n    if (len_aligned_down) ok = flash->write_fn(s_addr, buf, len_aligned_down);\n    if (len_aligned_down < len) {\n      size_t left = len - len_aligned_down;\n      char tmp[flash->align];\n      memset(tmp, 0xff, sizeof(tmp));\n      memcpy(tmp, (char *) buf + len_aligned_down, left);\n      ok = flash->write_fn(s_addr + len_aligned_down, tmp, sizeof(tmp));\n    }\n    s_crc32 = mg_crc32(s_crc32, (char *) buf, len);  // Update CRC\n    MG_DEBUG((\"%#x %p %lu -> %d\", s_addr - len, buf, len, ok));\n    s_addr += len;\n  }\n  return ok;\n}\n\nbool mg_ota_flash_end(struct mg_flash *flash) {\n  char *base = (char *) flash->start + flash->size / 2;\n  bool ok = false;\n  if (s_size) {\n    size_t size = (size_t) (s_addr - base);\n    uint32_t crc32 = mg_crc32(0, base, s_size);\n    if (size == s_size && crc32 == s_crc32) ok = true;\n    MG_DEBUG((\"CRC: %x/%x, size: %lu/%lu, status: %s\", s_crc32, crc32, s_size,\n              size, ok ? \"ok\" : \"fail\"));\n    s_size = 0;\n    if (ok) ok = flash->swap_fn();\n  }\n  MG_INFO((\"Finishing OTA: %s\", ok ? \"ok\" : \"fail\"));\n  return ok;\n}\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/fmt.c\"\n#endif\n\n\n\n\nstatic bool is_digit(int c) {\n  return c >= '0' && c <= '9';\n}\n\nstatic int addexp(char *buf, int e, int sign) {\n  int n = 0;\n  buf[n++] = 'e';\n  buf[n++] = (char) sign;\n  if (e > 400) return 0;\n  if (e < 10) buf[n++] = '0';\n  if (e >= 100) buf[n++] = (char) (e / 100 + '0'), e -= 100 * (e / 100);\n  if (e >= 10) buf[n++] = (char) (e / 10 + '0'), e -= 10 * (e / 10);\n  buf[n++] = (char) (e + '0');\n  return n;\n}\n\nstatic int xisinf(double x) {\n  union {\n    double f;\n    uint64_t u;\n  } ieee754;\n  ieee754.f = x;\n  return ((unsigned) (ieee754.u >> 32) & 0x7fffffff) == 0x7ff00000 &&\n         ((unsigned) ieee754.u == 0);\n}\n\nstatic int xisnan(double x) {\n  union {\n    double f;\n    uint64_t u;\n  } ieee754;\n  ieee754.f = x;\n  return ((unsigned) (ieee754.u >> 32) & 0x7fffffff) +\n             ((unsigned) ieee754.u != 0) >\n         0x7ff00000;\n}\n\nstatic size_t mg_dtoa(char *dst, size_t dstlen, double d, int width, bool tz) {\n  char buf[40];\n  int i, s = 0, n = 0, e = 0;\n  double t, mul, saved;\n  if (d == 0.0) return mg_snprintf(dst, dstlen, \"%s\", \"0\");\n  if (xisinf(d)) return mg_snprintf(dst, dstlen, \"%s\", d > 0 ? \"inf\" : \"-inf\");\n  if (xisnan(d)) return mg_snprintf(dst, dstlen, \"%s\", \"nan\");\n  if (d < 0.0) d = -d, buf[s++] = '-';\n\n  // Round\n  saved = d;\n  if (tz) {\n    mul = 1.0;\n    while (d >= 10.0 && d / mul >= 10.0) mul *= 10.0;\n  } else {\n    mul = 0.1;\n  }\n\n  while (d <= 1.0 && d / mul <= 1.0) mul /= 10.0;\n  for (i = 0, t = mul * 5; i < width; i++) t /= 10.0;\n\n  d += t;\n\n  // Calculate exponent, and 'mul' for scientific representation\n  mul = 1.0;\n  while (d >= 10.0 && d / mul >= 10.0) mul *= 10.0, e++;\n  while (d < 1.0 && d / mul < 1.0) mul /= 10.0, e--;\n  // printf(\" --> %g %d %g %g\\n\", saved, e, t, mul);\n\n  if (tz && e >= width && width > 1) {\n    n = (int) mg_dtoa(buf, sizeof(buf), saved / mul, width, tz);\n    // printf(\" --> %.*g %d [%.*s]\\n\", 10, d / t, e, n, buf);\n    n += addexp(buf + s + n, e, '+');\n    return mg_snprintf(dst, dstlen, \"%.*s\", n, buf);\n  } else if (tz && e <= -width && width > 1) {\n    n = (int) mg_dtoa(buf, sizeof(buf), saved / mul, width, tz);\n    // printf(\" --> %.*g %d [%.*s]\\n\", 10, d / mul, e, n, buf);\n    n += addexp(buf + s + n, -e, '-');\n    return mg_snprintf(dst, dstlen, \"%.*s\", n, buf);\n  } else {\n    int targ_width = width;\n    for (i = 0, t = mul; t >= 1.0 && s + n < (int) sizeof(buf); i++) {\n      int ch = (int) (d / t);\n      if (n > 0 || ch > 0) buf[s + n++] = (char) (ch + '0');\n      d -= ch * t;\n      t /= 10.0;\n    }\n    // printf(\" --> [%g] -> %g %g (%d) [%.*s]\\n\", saved, d, t, n, s + n, buf);\n    if (n == 0) buf[s++] = '0';\n    while (t >= 1.0 && n + s < (int) sizeof(buf)) buf[n++] = '0', t /= 10.0;\n    if (s + n < (int) sizeof(buf)) buf[n + s++] = '.';\n    // printf(\" 1--> [%g] -> [%.*s]\\n\", saved, s + n, buf);\n    if (!tz && n > 0) targ_width = width + n;\n    for (i = 0, t = 0.1; s + n < (int) sizeof(buf) && n < targ_width; i++) {\n      int ch = (int) (d / t);\n      buf[s + n++] = (char) (ch + '0');\n      d -= ch * t;\n      t /= 10.0;\n    }\n  }\n\n  while (tz && n > 0 && buf[s + n - 1] == '0') n--;  // Trim trailing zeroes\n  if (tz && n > 0 && buf[s + n - 1] == '.') n--;     // Trim trailing dot\n  n += s;\n  if (n >= (int) sizeof(buf)) n = (int) sizeof(buf) - 1;\n  buf[n] = '\\0';\n  return mg_snprintf(dst, dstlen, \"%s\", buf);\n}\n\nstatic size_t mg_lld(char *buf, int64_t val, bool is_signed, bool is_hex) {\n  const char *letters = \"0123456789abcdef\";\n  uint64_t v = (uint64_t) val;\n  size_t s = 0, n, i;\n  if (is_signed && val < 0) buf[s++] = '-', v = (uint64_t) (-val);\n  // This loop prints a number in reverse order. I guess this is because we\n  // write numbers from right to left: least significant digit comes last.\n  // Maybe because we use Arabic numbers, and Arabs write RTL?\n  if (is_hex) {\n    for (n = 0; v; v >>= 4) buf[s + n++] = letters[v & 15];\n  } else {\n    for (n = 0; v; v /= 10) buf[s + n++] = letters[v % 10];\n  }\n  // Reverse a string\n  for (i = 0; i < n / 2; i++) {\n    char t = buf[s + i];\n    buf[s + i] = buf[s + n - i - 1], buf[s + n - i - 1] = t;\n  }\n  if (val == 0) buf[n++] = '0';  // Handle special case\n  return n + s;\n}\n\nstatic size_t scpy(void (*out)(char, void *), void *ptr, char *buf,\n                   size_t len) {\n  size_t i = 0;\n  while (i < len && buf[i] != '\\0') out(buf[i++], ptr);\n  return i;\n}\n\nsize_t mg_xprintf(void (*out)(char, void *), void *ptr, const char *fmt, ...) {\n  size_t len = 0;\n  va_list ap;\n  va_start(ap, fmt);\n  len = mg_vxprintf(out, ptr, fmt, &ap);\n  va_end(ap);\n  return len;\n}\n\nsize_t mg_vxprintf(void (*out)(char, void *), void *param, const char *fmt,\n                   va_list *ap) {\n  size_t i = 0, n = 0;\n  while (fmt[i] != '\\0') {\n    if (fmt[i] == '%') {\n      size_t j, k, x = 0, is_long = 0, w = 0 /* width */, pr = ~0U /* prec */;\n      char pad = ' ', minus = 0, c = fmt[++i];\n      if (c == '#') x++, c = fmt[++i];\n      if (c == '-') minus++, c = fmt[++i];\n      if (c == '0') pad = '0', c = fmt[++i];\n      while (is_digit(c)) w *= 10, w += (size_t) (c - '0'), c = fmt[++i];\n      if (c == '.') {\n        c = fmt[++i];\n        if (c == '*') {\n          pr = (size_t) va_arg(*ap, int);\n          c = fmt[++i];\n        } else {\n          pr = 0;\n          while (is_digit(c)) pr *= 10, pr += (size_t) (c - '0'), c = fmt[++i];\n        }\n      }\n      while (c == 'h') c = fmt[++i];  // Treat h and hh as int\n      if (c == 'l') {\n        is_long++, c = fmt[++i];\n        if (c == 'l') is_long++, c = fmt[++i];\n      }\n      if (c == 'p') x = 1, is_long = 1;\n      if (c == 'd' || c == 'u' || c == 'x' || c == 'X' || c == 'p' ||\n          c == 'g' || c == 'f') {\n        bool s = (c == 'd'), h = (c == 'x' || c == 'X' || c == 'p');\n        char tmp[40];\n        size_t xl = x ? 2 : 0;\n        if (c == 'g' || c == 'f') {\n          double v = va_arg(*ap, double);\n          if (pr == ~0U) pr = 6;\n          k = mg_dtoa(tmp, sizeof(tmp), v, (int) pr, c == 'g');\n        } else if (is_long == 2) {\n          int64_t v = va_arg(*ap, int64_t);\n          k = mg_lld(tmp, v, s, h);\n        } else if (is_long == 1) {\n          long v = va_arg(*ap, long);\n          k = mg_lld(tmp, s ? (int64_t) v : (int64_t) (unsigned long) v, s, h);\n        } else {\n          int v = va_arg(*ap, int);\n          k = mg_lld(tmp, s ? (int64_t) v : (int64_t) (unsigned) v, s, h);\n        }\n        for (j = 0; j < xl && w > 0; j++) w--;\n        for (j = 0; pad == ' ' && !minus && k < w && j + k < w; j++)\n          n += scpy(out, param, &pad, 1);\n        n += scpy(out, param, (char *) \"0x\", xl);\n        for (j = 0; pad == '0' && k < w && j + k < w; j++)\n          n += scpy(out, param, &pad, 1);\n        n += scpy(out, param, tmp, k);\n        for (j = 0; pad == ' ' && minus && k < w && j + k < w; j++)\n          n += scpy(out, param, &pad, 1);\n      } else if (c == 'm' || c == 'M') {\n        mg_pm_t f = va_arg(*ap, mg_pm_t);\n        if (c == 'm') out('\"', param);\n        n += f(out, param, ap);\n        if (c == 'm') n += 2, out('\"', param);\n      } else if (c == 'c') {\n        int ch = va_arg(*ap, int);\n        out((char) ch, param);\n        n++;\n      } else if (c == 's') {\n        char *p = va_arg(*ap, char *);\n        if (pr == ~0U) pr = p == NULL ? 0 : strlen(p);\n        for (j = 0; !minus && pr < w && j + pr < w; j++)\n          n += scpy(out, param, &pad, 1);\n        n += scpy(out, param, p, pr);\n        for (j = 0; minus && pr < w && j + pr < w; j++)\n          n += scpy(out, param, &pad, 1);\n      } else if (c == '%') {\n        out('%', param);\n        n++;\n      } else {\n        out('%', param);\n        out(c, param);\n        n += 2;\n      }\n      i++;\n    } else {\n      out(fmt[i], param), n++, i++;\n    }\n  }\n  return n;\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/fs.c\"\n#endif\n\n\n\n\n\nstruct mg_fd *mg_fs_open(struct mg_fs *fs, const char *path, int flags) {\n  struct mg_fd *fd = (struct mg_fd *) mg_calloc(1, sizeof(*fd));\n  if (fd != NULL) {\n    fd->fd = fs->op(path, flags);\n    fd->fs = fs;\n    if (fd->fd == NULL) {\n      mg_free(fd);\n      fd = NULL;\n    }\n  }\n  return fd;\n}\n\nvoid mg_fs_close(struct mg_fd *fd) {\n  if (fd != NULL) {\n    fd->fs->cl(fd->fd);\n    mg_free(fd);\n  }\n}\n\nstruct mg_str mg_file_read(struct mg_fs *fs, const char *path) {\n  struct mg_str result = {NULL, 0};\n  void *fp;\n  fs->st(path, &result.len, NULL);\n  if ((fp = fs->op(path, MG_FS_READ)) != NULL) {\n    result.buf = (char *) mg_calloc(1, result.len + 1);\n    if (result.buf != NULL &&\n        fs->rd(fp, (void *) result.buf, result.len) != result.len) {\n      mg_free((void *) result.buf);\n      result.buf = NULL;\n    }\n    fs->cl(fp);\n  }\n  if (result.buf == NULL) result.len = 0;\n  return result;\n}\n\nbool mg_file_write(struct mg_fs *fs, const char *path, const void *buf,\n                   size_t len) {\n  bool result = false;\n  struct mg_fd *fd;\n  char tmp[MG_PATH_MAX];\n  mg_snprintf(tmp, sizeof(tmp), \"%s..%d\", path, rand());\n  if ((fd = mg_fs_open(fs, tmp, MG_FS_WRITE)) != NULL) {\n    result = fs->wr(fd->fd, buf, len) == len;\n    mg_fs_close(fd);\n    if (result) {\n      fs->rm(path);\n      fs->mv(tmp, path);\n    } else {\n      fs->rm(tmp);\n    }\n  }\n  return result;\n}\n\nbool mg_file_printf(struct mg_fs *fs, const char *path, const char *fmt, ...) {\n  va_list ap;\n  char *data;\n  bool result = false;\n  va_start(ap, fmt);\n  data = mg_vmprintf(fmt, &ap);\n  va_end(ap);\n  result = mg_file_write(fs, path, data, strlen(data));\n  mg_free(data);\n  return result;\n}\n\n// This helper function allows to scan a filesystem in a sequential way,\n// without using callback function:\n//      char buf[100] = \"\";\n//      while (mg_fs_ls(&mg_fs_posix, \"./\", buf, sizeof(buf))) {\n//        ...\nstatic void mg_fs_ls_fn(const char *filename, void *param) {\n  struct mg_str *s = (struct mg_str *) param;\n  if (s->buf[0] == '\\0') {\n    mg_snprintf((char *) s->buf, s->len, \"%s\", filename);\n  } else if (strcmp(s->buf, filename) == 0) {\n    ((char *) s->buf)[0] = '\\0';  // Fetch next file\n  }\n}\n\nbool mg_fs_ls(struct mg_fs *fs, const char *path, char *buf, size_t len) {\n  struct mg_str s;\n  s.buf = buf, s.len = len;\n  fs->ls(path, mg_fs_ls_fn, &s);\n  return buf[0] != '\\0';\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/fs_fat.c\"\n#endif\n\n\n\n#if MG_ENABLE_FATFS\n#include <ff.h>\n\nstatic int mg_days_from_epoch(int y, int m, int d) {\n  y -= m <= 2;\n  int era = y / 400;\n  int yoe = y - era * 400;\n  int doy = (153 * (m + (m > 2 ? -3 : 9)) + 2) / 5 + d - 1;\n  int doe = yoe * 365 + yoe / 4 - yoe / 100 + doy;\n  return era * 146097 + doe - 719468;\n}\n\nstatic time_t mg_timegm(const struct tm *t) {\n  int year = t->tm_year + 1900;\n  int month = t->tm_mon;  // 0-11\n  if (month > 11) {\n    year += month / 12;\n    month %= 12;\n  } else if (month < 0) {\n    int years_diff = (11 - month) / 12;\n    year -= years_diff;\n    month += 12 * years_diff;\n  }\n  int x = mg_days_from_epoch(year, month + 1, t->tm_mday);\n  return 60 * (60 * (24L * x + t->tm_hour) + t->tm_min) + t->tm_sec;\n}\n\nstatic time_t ff_time_to_epoch(uint16_t fdate, uint16_t ftime) {\n  struct tm tm;\n  memset(&tm, 0, sizeof(struct tm));\n  tm.tm_sec = (ftime << 1) & 0x3e;\n  tm.tm_min = ((ftime >> 5) & 0x3f);\n  tm.tm_hour = ((ftime >> 11) & 0x1f);\n  tm.tm_mday = (fdate & 0x1f);\n  tm.tm_mon = ((fdate >> 5) & 0x0f) - 1;\n  tm.tm_year = ((fdate >> 9) & 0x7f) + 80;\n  return mg_timegm(&tm);\n}\n\nstatic int ff_stat(const char *path, size_t *size, time_t *mtime) {\n  FILINFO fi;\n  if (path[0] == '\\0') {\n    if (size) *size = 0;\n    if (mtime) *mtime = 0;\n    return MG_FS_DIR;\n  } else if (f_stat(path, &fi) == 0) {\n    if (size) *size = (size_t) fi.fsize;\n    if (mtime) *mtime = ff_time_to_epoch(fi.fdate, fi.ftime);\n    return MG_FS_READ | MG_FS_WRITE | ((fi.fattrib & AM_DIR) ? MG_FS_DIR : 0);\n  } else {\n    return 0;\n  }\n}\n\nstatic void ff_list(const char *dir, void (*fn)(const char *, void *),\n                    void *userdata) {\n  DIR d;\n  FILINFO fi;\n  if (f_opendir(&d, dir) == FR_OK) {\n    while (f_readdir(&d, &fi) == FR_OK && fi.fname[0] != '\\0') {\n      if (!strcmp(fi.fname, \".\") || !strcmp(fi.fname, \"..\")) continue;\n      fn(fi.fname, userdata);\n    }\n    f_closedir(&d);\n  }\n}\n\nstatic void *ff_open(const char *path, int flags) {\n  FIL f;\n  unsigned char mode = FA_READ;\n  if (flags & MG_FS_WRITE) mode |= FA_WRITE | FA_OPEN_ALWAYS | FA_OPEN_APPEND;\n  if (f_open(&f, path, mode) == 0) {\n    FIL *fp;\n    if ((fp = mg_calloc(1, sizeof(*fp))) != NULL) {\n      memcpy(fp, &f, sizeof(*fp));\n      return fp;\n    }\n  }\n  return NULL;\n}\n\nstatic void ff_close(void *fp) {\n  if (fp != NULL) {\n    f_close((FIL *) fp);\n    mg_free(fp);\n  }\n}\n\nstatic size_t ff_read(void *fp, void *buf, size_t len) {\n  UINT n = 0, misalign = ((size_t) buf) & 3;\n  if (misalign) {\n    char aligned[4];\n    f_read((FIL *) fp, aligned, len > misalign ? misalign : len, &n);\n    memcpy(buf, aligned, n);\n  } else {\n    f_read((FIL *) fp, buf, len, &n);\n  }\n  return n;\n}\n\nstatic size_t ff_write(void *fp, const void *buf, size_t len) {\n  UINT n = 0;\n  return f_write((FIL *) fp, (char *) buf, len, &n) == FR_OK ? n : 0;\n}\n\nstatic size_t ff_seek(void *fp, size_t offset) {\n  f_lseek((FIL *) fp, offset);\n  return offset;\n}\n\nstatic bool ff_rename(const char *from, const char *to) {\n  return f_rename(from, to) == FR_OK;\n}\n\nstatic bool ff_remove(const char *path) {\n  return f_unlink(path) == FR_OK;\n}\n\nstatic bool ff_mkdir(const char *path) {\n  return f_mkdir(path) == FR_OK;\n}\n\nstruct mg_fs mg_fs_fat = {ff_stat,  ff_list, ff_open,   ff_close,  ff_read,\n                          ff_write, ff_seek, ff_rename, ff_remove, ff_mkdir};\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/fs_packed.c\"\n#endif\n\n\n\n\n\nstruct packed_file {\n  const char *data;\n  size_t size;\n  size_t pos;\n};\n\n#if MG_ENABLE_PACKED_FS\n#else\nconst char *mg_unpack(const char *path, size_t *size, time_t *mtime) {\n  if (size != NULL) *size = 0;\n  if (mtime != NULL) *mtime = 0;\n  (void) path;\n  return NULL;\n}\nconst char *mg_unlist(size_t no) {\n  (void) no;\n  return NULL;\n}\n#endif\n\nstruct mg_str mg_unpacked(const char *path) {\n  size_t len = 0;\n  const char *buf = mg_unpack(path, &len, NULL);\n  return mg_str_n(buf, len);\n}\n\nstatic int is_dir_prefix(const char *prefix, size_t n, const char *path) {\n  // MG_INFO((\"[%.*s] [%s] %c\", (int) n, prefix, path, path[n]));\n  return n < strlen(path) && strncmp(prefix, path, n) == 0 &&\n         (n == 0 || path[n] == '/' || path[n - 1] == '/');\n}\n\nstatic int packed_stat(const char *path, size_t *size, time_t *mtime) {\n  const char *p;\n  size_t i, n = strlen(path);\n  if (mg_unpack(path, size, mtime)) return MG_FS_READ;  // Regular file\n  // Scan all files. If `path` is a dir prefix for any of them, it's a dir\n  for (i = 0; (p = mg_unlist(i)) != NULL; i++) {\n    if (is_dir_prefix(path, n, p)) return MG_FS_DIR;\n  }\n  return 0;\n}\n\nstatic void packed_list(const char *dir, void (*fn)(const char *, void *),\n                        void *userdata) {\n  char buf[MG_PATH_MAX], tmp[sizeof(buf)];\n  const char *path, *begin, *end;\n  size_t i, n = strlen(dir);\n  tmp[0] = '\\0';  // Previously listed entry\n  for (i = 0; (path = mg_unlist(i)) != NULL; i++) {\n    if (!is_dir_prefix(dir, n, path)) continue;\n    begin = &path[n + 1];\n    end = strchr(begin, '/');\n    if (end == NULL) end = begin + strlen(begin);\n    mg_snprintf(buf, sizeof(buf), \"%.*s\", (int) (end - begin), begin);\n    buf[sizeof(buf) - 1] = '\\0';\n    // If this entry has been already listed, skip\n    // NOTE: we're assuming that file list is sorted alphabetically\n    if (strcmp(buf, tmp) == 0) continue;\n    fn(buf, userdata);  // Not yet listed, call user function\n    strcpy(tmp, buf);   // And save this entry as listed\n  }\n}\n\nstatic void *packed_open(const char *path, int flags) {\n  size_t size = 0;\n  const char *data = mg_unpack(path, &size, NULL);\n  struct packed_file *fp = NULL;\n  if (data == NULL) return NULL;\n  if (flags & MG_FS_WRITE) return NULL;\n  if ((fp = (struct packed_file *) mg_calloc(1, sizeof(*fp))) != NULL) {\n    fp->size = size;\n    fp->data = data;\n  }\n  return (void *) fp;\n}\n\nstatic void packed_close(void *fp) {\n  if (fp != NULL) mg_free(fp);\n}\n\nstatic size_t packed_read(void *fd, void *buf, size_t len) {\n  struct packed_file *fp = (struct packed_file *) fd;\n  if (fp->pos + len > fp->size) len = fp->size - fp->pos;\n  memcpy(buf, &fp->data[fp->pos], len);\n  fp->pos += len;\n  return len;\n}\n\nstatic size_t packed_write(void *fd, const void *buf, size_t len) {\n  (void) fd, (void) buf, (void) len;\n  return 0;\n}\n\nstatic size_t packed_seek(void *fd, size_t offset) {\n  struct packed_file *fp = (struct packed_file *) fd;\n  fp->pos = offset;\n  if (fp->pos > fp->size) fp->pos = fp->size;\n  return fp->pos;\n}\n\nstatic bool packed_rename(const char *from, const char *to) {\n  (void) from, (void) to;\n  return false;\n}\n\nstatic bool packed_remove(const char *path) {\n  (void) path;\n  return false;\n}\n\nstatic bool packed_mkdir(const char *path) {\n  (void) path;\n  return false;\n}\n\nstruct mg_fs mg_fs_packed = {\n    packed_stat,  packed_list, packed_open,   packed_close,  packed_read,\n    packed_write, packed_seek, packed_rename, packed_remove, packed_mkdir};\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/fs_posix.c\"\n#endif\n\n\n#if MG_ENABLE_POSIX_FS\n\n#ifndef MG_STAT_STRUCT\n#define MG_STAT_STRUCT stat\n#endif\n\n#ifndef MG_STAT_FUNC\n#define MG_STAT_FUNC stat\n#endif\n\nstatic int p_stat(const char *path, size_t *size, time_t *mtime) {\n#if !defined(S_ISDIR)\n  MG_ERROR((\"stat() API is not supported. %p %p %p\", path, size, mtime));\n  return 0;\n#else\n#if MG_ARCH == MG_ARCH_WIN32\n  struct _stati64 st;\n  wchar_t tmp[MG_PATH_MAX];\n  MultiByteToWideChar(CP_UTF8, 0, path, -1, tmp, sizeof(tmp) / sizeof(tmp[0]));\n  if (_wstati64(tmp, &st) != 0) return 0;\n  // If path is a symlink, windows reports 0 in st.st_size.\n  // Get a real file size by opening it and jumping to the end\n  if (st.st_size == 0 && (st.st_mode & _S_IFREG)) {\n    FILE *fp = _wfopen(tmp, L\"rb\");\n    if (fp != NULL) {\n      fseek(fp, 0, SEEK_END);\n      if (ftell(fp) > 0) st.st_size = ftell(fp);  // Use _ftelli64 on win10+\n      fclose(fp);\n    }\n  }\n#else\n  struct MG_STAT_STRUCT st;\n  if (MG_STAT_FUNC(path, &st) != 0) return 0;\n#endif\n  if (size) *size = (size_t) st.st_size;\n  if (mtime) *mtime = st.st_mtime;\n  return MG_FS_READ | MG_FS_WRITE | (S_ISDIR(st.st_mode) ? MG_FS_DIR : 0);\n#endif\n}\n\n#if MG_ARCH == MG_ARCH_WIN32\nstruct dirent {\n  char d_name[MAX_PATH];\n};\n\ntypedef struct win32_dir {\n  HANDLE handle;\n  WIN32_FIND_DATAW info;\n  struct dirent result;\n} DIR;\n\n#if 0\nint gettimeofday(struct timeval *tv, void *tz) {\n  FILETIME ft;\n  unsigned __int64 tmpres = 0;\n\n  if (tv != NULL) {\n    GetSystemTimeAsFileTime(&ft);\n    tmpres |= ft.dwHighDateTime;\n    tmpres <<= 32;\n    tmpres |= ft.dwLowDateTime;\n    tmpres /= 10;  // convert into microseconds\n    tmpres -= (int64_t) 11644473600000000;\n    tv->tv_sec = (long) (tmpres / 1000000UL);\n    tv->tv_usec = (long) (tmpres % 1000000UL);\n  }\n  (void) tz;\n  return 0;\n}\n#endif\n\nstatic int to_wchar(const char *path, wchar_t *wbuf, size_t wbuf_len) {\n  int ret;\n  char buf[MAX_PATH * 2], buf2[MAX_PATH * 2], *p;\n  strncpy(buf, path, sizeof(buf));\n  buf[sizeof(buf) - 1] = '\\0';\n  // Trim trailing slashes. Leave backslash for paths like \"X:\\\"\n  p = buf + strlen(buf) - 1;\n  while (p > buf && p[-1] != ':' && (p[0] == '\\\\' || p[0] == '/')) *p-- = '\\0';\n  memset(wbuf, 0, wbuf_len * sizeof(wchar_t));\n  ret = MultiByteToWideChar(CP_UTF8, 0, buf, -1, wbuf, (int) wbuf_len);\n  // Convert back to Unicode. If doubly-converted string does not match the\n  // original, something is fishy, reject.\n  WideCharToMultiByte(CP_UTF8, 0, wbuf, (int) wbuf_len, buf2, sizeof(buf2),\n                      NULL, NULL);\n  if (strcmp(buf, buf2) != 0) {\n    wbuf[0] = L'\\0';\n    ret = 0;\n  }\n  return ret;\n}\n\nDIR *opendir(const char *name) {\n  DIR *d = NULL;\n  wchar_t wpath[MAX_PATH];\n  DWORD attrs;\n\n  if (name == NULL) {\n    SetLastError(ERROR_BAD_ARGUMENTS);\n  } else if ((d = (DIR *) mg_calloc(1, sizeof(*d))) == NULL) {\n    SetLastError(ERROR_NOT_ENOUGH_MEMORY);\n  } else {\n    to_wchar(name, wpath, sizeof(wpath) / sizeof(wpath[0]));\n    attrs = GetFileAttributesW(wpath);\n    if (attrs != 0Xffffffff && (attrs & FILE_ATTRIBUTE_DIRECTORY)) {\n      (void) wcscat(wpath, L\"\\\\*\");\n      d->handle = FindFirstFileW(wpath, &d->info);\n      d->result.d_name[0] = '\\0';\n    } else {\n      mg_free(d);\n      d = NULL;\n    }\n  }\n  return d;\n}\n\nint closedir(DIR *d) {\n  int result = 0;\n  if (d != NULL) {\n    if (d->handle != INVALID_HANDLE_VALUE)\n      result = FindClose(d->handle) ? 0 : -1;\n    mg_free(d);\n  } else {\n    result = -1;\n    SetLastError(ERROR_BAD_ARGUMENTS);\n  }\n  return result;\n}\n\nstruct dirent *readdir(DIR *d) {\n  struct dirent *result = NULL;\n  if (d != NULL) {\n    memset(&d->result, 0, sizeof(d->result));\n    if (d->handle != INVALID_HANDLE_VALUE) {\n      result = &d->result;\n      WideCharToMultiByte(CP_UTF8, 0, d->info.cFileName, -1, result->d_name,\n                          sizeof(result->d_name), NULL, NULL);\n      if (!FindNextFileW(d->handle, &d->info)) {\n        FindClose(d->handle);\n        d->handle = INVALID_HANDLE_VALUE;\n      }\n    } else {\n      SetLastError(ERROR_FILE_NOT_FOUND);\n    }\n  } else {\n    SetLastError(ERROR_BAD_ARGUMENTS);\n  }\n  return result;\n}\n#endif\n\nstatic void p_list(const char *dir, void (*fn)(const char *, void *),\n                   void *userdata) {\n#if MG_ENABLE_DIRLIST\n  struct dirent *dp;\n  DIR *dirp;\n  if ((dirp = (opendir(dir))) == NULL) return;\n  while ((dp = readdir(dirp)) != NULL) {\n    if (!strcmp(dp->d_name, \".\") || !strcmp(dp->d_name, \"..\")) continue;\n    fn(dp->d_name, userdata);\n  }\n  closedir(dirp);\n#else\n  (void) dir, (void) fn, (void) userdata;\n#endif\n}\n\nstatic void *p_open(const char *path, int flags) {\n#if MG_ARCH == MG_ARCH_WIN32\n  const char *mode = flags == MG_FS_READ ? \"rb\" : \"a+b\";\n  wchar_t b1[MG_PATH_MAX], b2[10];\n  MultiByteToWideChar(CP_UTF8, 0, path, -1, b1, sizeof(b1) / sizeof(b1[0]));\n  MultiByteToWideChar(CP_UTF8, 0, mode, -1, b2, sizeof(b2) / sizeof(b2[0]));\n  return (void *) _wfopen(b1, b2);\n#else\n  const char *mode = flags == MG_FS_READ ? \"rbe\" : \"a+be\";  // e for CLOEXEC\n  return (void *) fopen(path, mode);\n#endif\n}\n\nstatic void p_close(void *fp) {\n  fclose((FILE *) fp);\n}\n\nstatic size_t p_read(void *fp, void *buf, size_t len) {\n  return fread(buf, 1, len, (FILE *) fp);\n}\n\nstatic size_t p_write(void *fp, const void *buf, size_t len) {\n  return fwrite(buf, 1, len, (FILE *) fp);\n}\n\nstatic size_t p_seek(void *fp, size_t offset) {\n#if (defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64) ||  \\\n    (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L) || \\\n    (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 600)\n  if (fseeko((FILE *) fp, (off_t) offset, SEEK_SET) != 0) (void) 0;\n#else\n  if (fseek((FILE *) fp, (long) offset, SEEK_SET) != 0) (void) 0;\n#endif\n  return (size_t) ftell((FILE *) fp);\n}\n\nstatic bool p_rename(const char *from, const char *to) {\n  return rename(from, to) == 0;\n}\n\nstatic bool p_remove(const char *path) {\n  return remove(path) == 0;\n}\n\nstatic bool p_mkdir(const char *path) {\n  return mkdir(path, 0775) == 0;\n}\n\n#else\n\nstatic int p_stat(const char *path, size_t *size, time_t *mtime) {\n  (void) path, (void) size, (void) mtime;\n  return 0;\n}\nstatic void p_list(const char *path, void (*fn)(const char *, void *),\n                   void *userdata) {\n  (void) path, (void) fn, (void) userdata;\n}\nstatic void *p_open(const char *path, int flags) {\n  (void) path, (void) flags;\n  return NULL;\n}\nstatic void p_close(void *fp) {\n  (void) fp;\n}\nstatic size_t p_read(void *fd, void *buf, size_t len) {\n  (void) fd, (void) buf, (void) len;\n  return 0;\n}\nstatic size_t p_write(void *fd, const void *buf, size_t len) {\n  (void) fd, (void) buf, (void) len;\n  return 0;\n}\nstatic size_t p_seek(void *fd, size_t offset) {\n  (void) fd, (void) offset;\n  return (size_t) ~0;\n}\nstatic bool p_rename(const char *from, const char *to) {\n  (void) from, (void) to;\n  return false;\n}\nstatic bool p_remove(const char *path) {\n  (void) path;\n  return false;\n}\nstatic bool p_mkdir(const char *path) {\n  (void) path;\n  return false;\n}\n#endif\n\nstruct mg_fs mg_fs_posix = {p_stat,  p_list, p_open,   p_close,  p_read,\n                            p_write, p_seek, p_rename, p_remove, p_mkdir};\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/http.c\"\n#endif\n\n\n\n\n\n\n\n\n\n\n\n\n\nstatic int mg_ncasecmp(const char *s1, const char *s2, size_t len) {\n  int diff = 0;\n  if (len > 0) do {\n      int c = *s1++, d = *s2++;\n      if (c >= 'A' && c <= 'Z') c += 'a' - 'A';\n      if (d >= 'A' && d <= 'Z') d += 'a' - 'A';\n      diff = c - d;\n    } while (diff == 0 && s1[-1] != '\\0' && --len > 0);\n  return diff;\n}\n\nbool mg_to_size_t(struct mg_str str, size_t *val);\nbool mg_to_size_t(struct mg_str str, size_t *val) {\n  size_t i = 0, max = (size_t) -1, max2 = max / 10, result = 0, ndigits = 0;\n  while (i < str.len && (str.buf[i] == ' ' || str.buf[i] == '\\t')) i++;\n  if (i < str.len && str.buf[i] == '-') return false;\n  while (i < str.len && str.buf[i] >= '0' && str.buf[i] <= '9') {\n    size_t digit = (size_t) (str.buf[i] - '0');\n    if (result > max2) return false;  // Overflow\n    result *= 10;\n    if (result > max - digit) return false;  // Overflow\n    result += digit;\n    i++, ndigits++;\n  }\n  while (i < str.len && (str.buf[i] == ' ' || str.buf[i] == '\\t')) i++;\n  if (ndigits == 0) return false;  // #2322: Content-Length = 1 * DIGIT\n  if (i != str.len) return false;  // Ditto\n  *val = (size_t) result;\n  return true;\n}\n\n// Chunk deletion marker is the MSB in the \"processed\" counter\n#define MG_DMARK ((size_t) 1 << (sizeof(size_t) * 8 - 1))\n\n// Multipart POST example:\n// --xyz\n// Content-Disposition: form-data; name=\"val\"\n//\n// abcdef\n// --xyz\n// Content-Disposition: form-data; name=\"foo\"; filename=\"a.txt\"\n// Content-Type: text/plain\n//\n// hello world\n//\n// --xyz--\nsize_t mg_http_next_multipart(struct mg_str body, size_t ofs,\n                              struct mg_http_part *part) {\n  struct mg_str cd = mg_str_n(\"Content-Disposition\", 19);\n  const char *s = body.buf;\n  size_t b = ofs, h1, h2, b1, b2, max = body.len;\n\n  // Init part params\n  if (part != NULL) part->name = part->filename = part->body = mg_str_n(0, 0);\n\n  // Skip boundary\n  while (b + 2 < max && s[b] != '\\r' && s[b + 1] != '\\n') b++;\n  if (b <= ofs || b + 2 >= max) return 0;\n  // MG_INFO((\"B: %zu %zu [%.*s]\", ofs, b - ofs, (int) (b - ofs), s));\n\n  // Skip headers\n  h1 = h2 = b + 2;\n  for (;;) {\n    while (h2 + 2 < max && s[h2] != '\\r' && s[h2 + 1] != '\\n') h2++;\n    if (h2 == h1) break;\n    if (h2 + 2 >= max) return 0;\n    // MG_INFO((\"Header: [%.*s]\", (int) (h2 - h1), &s[h1]));\n    if (part != NULL && h1 + cd.len + 2 < h2 && s[h1 + cd.len] == ':' &&\n        mg_ncasecmp(&s[h1], cd.buf, cd.len) == 0) {\n      struct mg_str v = mg_str_n(&s[h1 + cd.len + 2], h2 - (h1 + cd.len + 2));\n      part->name = mg_http_get_header_var(v, mg_str_n(\"name\", 4));\n      part->filename = mg_http_get_header_var(v, mg_str_n(\"filename\", 8));\n    }\n    h1 = h2 = h2 + 2;\n  }\n  b1 = b2 = h2 + 2;\n  while (b2 + 2 + (b - ofs) + 2 < max && !(s[b2] == '\\r' && s[b2 + 1] == '\\n' &&\n                                           memcmp(&s[b2 + 2], s, b - ofs) == 0))\n    b2++;\n\n  if (b2 + 2 >= max) return 0;\n  if (part != NULL) part->body = mg_str_n(&s[b1], b2 - b1);\n  // MG_INFO((\"Body: [%.*s]\", (int) (b2 - b1), &s[b1]));\n  return b2 + 2;\n}\n\nvoid mg_http_bauth(struct mg_connection *c, const char *user,\n                   const char *pass) {\n  struct mg_str u = mg_str(user), p = mg_str(pass);\n  size_t need = c->send.len + 36 + (u.len + p.len) * 2;\n  if (c->send.size < need) mg_iobuf_resize(&c->send, need);\n  if (c->send.size >= need) {\n    size_t i, n = 0;\n    char *buf = (char *) &c->send.buf[c->send.len];\n    memcpy(buf, \"Authorization: Basic \", 21);  // DON'T use mg_send!\n    for (i = 0; i < u.len; i++) {\n      n = mg_base64_update(((unsigned char *) u.buf)[i], buf + 21, n);\n    }\n    if (p.len > 0) {\n      n = mg_base64_update(':', buf + 21, n);\n      for (i = 0; i < p.len; i++) {\n        n = mg_base64_update(((unsigned char *) p.buf)[i], buf + 21, n);\n      }\n    }\n    n = mg_base64_final(buf + 21, n);\n    c->send.len += 21 + (size_t) n + 2;\n    memcpy(&c->send.buf[c->send.len - 2], \"\\r\\n\", 2);\n  } else {\n    MG_ERROR((\"%lu oom %d->%d \", c->id, (int) c->send.size, (int) need));\n  }\n}\n\nstruct mg_str mg_http_var(struct mg_str buf, struct mg_str name) {\n  struct mg_str entry, k, v, result = mg_str_n(NULL, 0);\n  while (mg_span(buf, &entry, &buf, '&')) {\n    if (mg_span(entry, &k, &v, '=') && name.len == k.len &&\n        mg_ncasecmp(name.buf, k.buf, k.len) == 0) {\n      result = v;\n      break;\n    }\n  }\n  return result;\n}\n\nint mg_http_get_var(const struct mg_str *buf, const char *name, char *dst,\n                    size_t dst_len) {\n  int len;\n  if (dst != NULL && dst_len > 0) {\n    dst[0] = '\\0';  // If destination buffer is valid, always nul-terminate it\n  }\n  if (dst == NULL || dst_len == 0) {\n    len = -2;  // Bad destination\n  } else if (buf->buf == NULL || name == NULL || buf->len == 0) {\n    len = -1;  // Bad source\n  } else {\n    struct mg_str v = mg_http_var(*buf, mg_str(name));\n    if (v.buf == NULL) {\n      len = -4;  // Name does not exist\n    } else {\n      len = mg_url_decode(v.buf, v.len, dst, dst_len, 1);\n      if (len < 0) len = -3;  // Failed to decode\n    }\n  }\n  return len;\n}\n\nstatic bool isx(int c) {\n  return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') ||\n         (c >= 'A' && c <= 'F');\n}\n\nint mg_url_decode(const char *src, size_t src_len, char *dst, size_t dst_len,\n                  int is_form_url_encoded) {\n  size_t i, j;\n  for (i = j = 0; i < src_len && j + 1 < dst_len; i++, j++) {\n    if (src[i] == '%') {\n      // Use `i + 2 < src_len`, not `i < src_len - 2`, note small src_len\n      if (i + 2 < src_len && isx(src[i + 1]) && isx(src[i + 2])) {\n        mg_str_to_num(mg_str_n(src + i + 1, 2), 16, &dst[j], sizeof(uint8_t));\n        i += 2;\n      } else {\n        return -1;\n      }\n    } else if (is_form_url_encoded && src[i] == '+') {\n      dst[j] = ' ';\n    } else {\n      dst[j] = src[i];\n    }\n  }\n  if (j < dst_len) dst[j] = '\\0';  // Null-terminate the destination\n  return i >= src_len && j < dst_len ? (int) j : -1;\n}\n\nstatic bool isok(uint8_t c) {\n  return c == '\\n' || c == '\\r' || c == '\\t' || c >= ' ';\n}\n\nint mg_http_get_request_len(const unsigned char *buf, size_t buf_len) {\n  size_t i;\n  for (i = 0; i < buf_len; i++) {\n    if (!isok(buf[i])) return -1;\n    if ((i > 0 && buf[i] == '\\n' && buf[i - 1] == '\\n') ||\n        (i > 3 && buf[i] == '\\n' && buf[i - 1] == '\\r' && buf[i - 2] == '\\n'))\n      return (int) i + 1;\n  }\n  return 0;\n}\nstruct mg_str *mg_http_get_header(struct mg_http_message *h, const char *name) {\n  size_t i, n = strlen(name), max = sizeof(h->headers) / sizeof(h->headers[0]);\n  for (i = 0; i < max && h->headers[i].name.len > 0; i++) {\n    struct mg_str *k = &h->headers[i].name, *v = &h->headers[i].value;\n    if (n == k->len && mg_ncasecmp(k->buf, name, n) == 0) return v;\n  }\n  return NULL;\n}\n\n// Is it a valid utf-8 continuation byte\nstatic bool vcb(uint8_t c) {\n  return (c & 0xc0) == 0x80;\n}\n\n// Get character length (valid utf-8). Used to parse method, URI, headers\nstatic size_t clen(const char *s, const char *end) {\n  const unsigned char *u = (unsigned char *) s, c = *u;\n  long n = (long) (end - s);\n  if (c > ' ' && c <= '~') return 1;  // Usual ascii printed char\n  if ((c & 0xe0) == 0xc0 && n > 1 && vcb(u[1])) return 2;  // 2-byte UTF8\n  if ((c & 0xf0) == 0xe0 && n > 2 && vcb(u[1]) && vcb(u[2])) return 3;\n  if ((c & 0xf8) == 0xf0 && n > 3 && vcb(u[1]) && vcb(u[2]) && vcb(u[3]))\n    return 4;\n  return 0;\n}\n\n// Skip until the newline. Return advanced `s`, or NULL on error\nstatic const char *skiptorn(const char *s, const char *end, struct mg_str *v) {\n  v->buf = (char *) s;\n  while (s < end && s[0] != '\\n' && s[0] != '\\r') s++, v->len++;  // To newline\n  if (s >= end || (s[0] == '\\r' && s[1] != '\\n')) return NULL;    // Stray \\r\n  if (s < end && s[0] == '\\r') s++;                               // Skip \\r\n  if (s >= end || *s++ != '\\n') return NULL;                      // Skip \\n\n  return s;\n}\n\nstatic bool mg_http_parse_headers(const char *s, const char *end,\n                                  struct mg_http_header *h, size_t max_hdrs) {\n  size_t i, n;\n  for (i = 0; i < max_hdrs; i++) {\n    struct mg_str k = {NULL, 0}, v = {NULL, 0};\n    if (s >= end) return false;\n    if (s[0] == '\\n' || (s[0] == '\\r' && s[1] == '\\n')) break;\n    k.buf = (char *) s;\n    while (s < end && s[0] != ':' && (n = clen(s, end)) > 0) s += n, k.len += n;\n    if (k.len == 0) return false;                     // Empty name\n    if (s >= end || clen(s, end) == 0) return false;  // Invalid UTF-8\n    if (*s++ != ':') return false;  // Invalid, not followed by :\n    // if (clen(s, end) == 0) return false;        // Invalid UTF-8\n    while (s < end && (s[0] == ' ' || s[0] == '\\t')) s++;  // Skip spaces\n    if ((s = skiptorn(s, end, &v)) == NULL) return false;\n    while (v.len > 0 && (v.buf[v.len - 1] == ' ' || v.buf[v.len - 1] == '\\t')) {\n      v.len--;  // Trim spaces\n    }\n    // MG_INFO((\"--HH [%.*s] [%.*s]\", (int) k.len, k.buf, (int) v.len, v.buf));\n    h[i].name = k, h[i].value = v;  // Success. Assign values\n  }\n  return true;\n}\n\nint mg_http_parse(const char *s, size_t len, struct mg_http_message *hm) {\n  int is_response, req_len = mg_http_get_request_len((unsigned char *) s, len);\n  const char *end = s == NULL ? NULL : s + req_len, *qs;  // Cannot add to NULL\n  const struct mg_str *cl;\n  size_t n;\n  bool version_prefix_valid;\n\n  memset(hm, 0, sizeof(*hm));\n  if (req_len <= 0) return req_len;\n\n  hm->message.buf = hm->head.buf = (char *) s;\n  hm->body.buf = (char *) end;\n  hm->head.len = (size_t) req_len;\n  hm->message.len = hm->body.len = (size_t) -1;  // Set body length to infinite\n\n  // Parse request line\n  hm->method.buf = (char *) s;\n  while (s < end && (n = clen(s, end)) > 0) s += n, hm->method.len += n;\n  while (s < end && s[0] == ' ') s++;  // Skip spaces\n  hm->uri.buf = (char *) s;\n  while (s < end && (n = clen(s, end)) > 0) s += n, hm->uri.len += n;\n  while (s < end && s[0] == ' ') s++;  // Skip spaces\n  is_response =\n      hm->method.len > 5 && (mg_ncasecmp(hm->method.buf, \"HTTP/\", 5) == 0);\n  if ((s = skiptorn(s, end, &hm->proto)) == NULL) return false;\n  // If we're given a version, check that it is HTTP/x.x\n  version_prefix_valid =\n      hm->proto.len > 5 && (mg_ncasecmp(hm->proto.buf, \"HTTP/\", 5) == 0);\n  if (!is_response && hm->proto.len > 0 &&\n      (!version_prefix_valid || hm->proto.len != 8 ||\n       (hm->proto.buf[5] < '0' || hm->proto.buf[5] > '9') ||\n       (hm->proto.buf[6] != '.') ||\n       (hm->proto.buf[7] < '0' || hm->proto.buf[7] > '9'))) {\n    return -1;\n  }\n\n  // If URI contains '?' character, setup query string\n  if ((qs = (const char *) memchr(hm->uri.buf, '?', hm->uri.len)) != NULL) {\n    hm->query.buf = (char *) qs + 1;\n    hm->query.len = (size_t) (&hm->uri.buf[hm->uri.len] - (qs + 1));\n    hm->uri.len = (size_t) (qs - hm->uri.buf);\n  }\n\n  // Sanity check. Allow protocol/reason to be empty\n  // Do this check after hm->method.len and hm->uri.len are finalised\n  if (hm->method.len == 0 || hm->uri.len == 0) return -1;\n\n  if (!mg_http_parse_headers(s, end, hm->headers,\n                             sizeof(hm->headers) / sizeof(hm->headers[0])))\n    return -1;  // error when parsing\n  if ((cl = mg_http_get_header(hm, \"Content-Length\")) != NULL) {\n    if (mg_to_size_t(*cl, &hm->body.len) == false) return -1;\n    hm->message.len = (size_t) req_len + hm->body.len;\n  }\n\n  // mg_http_parse() is used to parse both HTTP requests and HTTP\n  // responses. If HTTP response does not have Content-Length set, then\n  // body is read until socket is closed, i.e. body.len is infinite (~0).\n  //\n  // For HTTP requests though, if Content-Length is not specified\n  // set body length to 0.\n  if (hm->body.len == (size_t) ~0 && !is_response) {\n    hm->body.len = 0;\n    hm->message.len = (size_t) req_len;\n  }\n\n  // The 204 (No content) responses also have 0 body length\n  if (hm->body.len == (size_t) ~0 && is_response &&\n      mg_strcasecmp(hm->uri, mg_str(\"204\")) == 0) {\n    hm->body.len = 0;\n    hm->message.len = (size_t) req_len;\n  }\n  if (hm->message.len < (size_t) req_len) return -1;  // Overflow protection\n\n  return req_len;\n}\n\nstatic void mg_http_vprintf_chunk(struct mg_connection *c, const char *fmt,\n                                  va_list *ap) {\n  size_t len = c->send.len;\n  if (!mg_send(c, \"        \\r\\n\", 10)) mg_error(c, \"OOM\");\n  mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, ap);\n  if (c->send.len >= len + 10) {\n    mg_snprintf((char *) c->send.buf + len, 9, \"%08lx\", c->send.len - len - 10);\n    c->send.buf[len + 8] = '\\r';\n    if (c->send.len == len + 10) c->is_resp = 0;  // Last chunk, reset marker\n  }\n  if (!mg_send(c, \"\\r\\n\", 2)) mg_error(c, \"OOM\");\n}\n\nvoid mg_http_printf_chunk(struct mg_connection *c, const char *fmt, ...) {\n  va_list ap;\n  va_start(ap, fmt);\n  mg_http_vprintf_chunk(c, fmt, &ap);\n  va_end(ap);\n}\n\nvoid mg_http_write_chunk(struct mg_connection *c, const char *buf, size_t len) {\n  mg_printf(c, \"%lx\\r\\n\", (unsigned long) len);\n  if (!mg_send(c, buf, len) || !mg_send(c, \"\\r\\n\", 2)) mg_error(c, \"OOM\");\n  if (len == 0) c->is_resp = 0;\n}\n\n// clang-format off\nstatic const char *mg_http_status_code_str(int status_code) {\n  switch (status_code) {\n    case 100: return \"Continue\";\n    case 101: return \"Switching Protocols\";\n    case 102: return \"Processing\";\n    case 200: return \"OK\";\n    case 201: return \"Created\";\n    case 202: return \"Accepted\";\n    case 203: return \"Non-authoritative Information\";\n    case 204: return \"No Content\";\n    case 205: return \"Reset Content\";\n    case 206: return \"Partial Content\";\n    case 207: return \"Multi-Status\";\n    case 208: return \"Already Reported\";\n    case 226: return \"IM Used\";\n    case 300: return \"Multiple Choices\";\n    case 301: return \"Moved Permanently\";\n    case 302: return \"Found\";\n    case 303: return \"See Other\";\n    case 304: return \"Not Modified\";\n    case 305: return \"Use Proxy\";\n    case 307: return \"Temporary Redirect\";\n    case 308: return \"Permanent Redirect\";\n    case 400: return \"Bad Request\";\n    case 401: return \"Unauthorized\";\n    case 402: return \"Payment Required\";\n    case 403: return \"Forbidden\";\n    case 404: return \"Not Found\";\n    case 405: return \"Method Not Allowed\";\n    case 406: return \"Not Acceptable\";\n    case 407: return \"Proxy Authentication Required\";\n    case 408: return \"Request Timeout\";\n    case 409: return \"Conflict\";\n    case 410: return \"Gone\";\n    case 411: return \"Length Required\";\n    case 412: return \"Precondition Failed\";\n    case 413: return \"Payload Too Large\";\n    case 414: return \"Request-URI Too Long\";\n    case 415: return \"Unsupported Media Type\";\n    case 416: return \"Requested Range Not Satisfiable\";\n    case 417: return \"Expectation Failed\";\n    case 418: return \"I'm a teapot\";\n    case 421: return \"Misdirected Request\";\n    case 422: return \"Unprocessable Entity\";\n    case 423: return \"Locked\";\n    case 424: return \"Failed Dependency\";\n    case 426: return \"Upgrade Required\";\n    case 428: return \"Precondition Required\";\n    case 429: return \"Too Many Requests\";\n    case 431: return \"Request Header Fields Too Large\";\n    case 444: return \"Connection Closed Without Response\";\n    case 451: return \"Unavailable For Legal Reasons\";\n    case 499: return \"Client Closed Request\";\n    case 500: return \"Internal Server Error\";\n    case 501: return \"Not Implemented\";\n    case 502: return \"Bad Gateway\";\n    case 503: return \"Service Unavailable\";\n    case 504: return \"Gateway Timeout\";\n    case 505: return \"HTTP Version Not Supported\";\n    case 506: return \"Variant Also Negotiates\";\n    case 507: return \"Insufficient Storage\";\n    case 508: return \"Loop Detected\";\n    case 510: return \"Not Extended\";\n    case 511: return \"Network Authentication Required\";\n    case 599: return \"Network Connect Timeout Error\";\n    default: return \"\";\n  }\n}\n// clang-format on\n\nvoid mg_http_reply(struct mg_connection *c, int code, const char *headers,\n                   const char *fmt, ...) {\n  va_list ap;\n  size_t len;\n  mg_printf(c, \"HTTP/1.1 %d %s\\r\\n%sContent-Length:            \\r\\n\\r\\n\", code,\n            mg_http_status_code_str(code), headers == NULL ? \"\" : headers);\n  len = c->send.len;\n  va_start(ap, fmt);\n  mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, &ap);\n  va_end(ap);\n  if (c->send.len > 16) {\n    size_t n = mg_snprintf((char *) &c->send.buf[len - 15], 11, \"%-10lu\",\n                           (unsigned long) (c->send.len - len));\n    c->send.buf[len - 15 + n] = ' ';  // Change ending 0 to space\n  }\n  c->is_resp = 0;\n}\n\nstatic void http_cb(struct mg_connection *, int, void *);\nstatic void restore_http_cb(struct mg_connection *c) {\n  mg_fs_close((struct mg_fd *) c->pfn_data);\n  c->pfn_data = NULL;\n  c->pfn = http_cb;\n  c->is_resp = 0;\n}\n\nchar *mg_http_etag(char *buf, size_t len, size_t size, time_t mtime);\nchar *mg_http_etag(char *buf, size_t len, size_t size, time_t mtime) {\n  mg_snprintf(buf, len, \"\\\"%lld.%lld\\\"\", (int64_t) mtime, (int64_t) size);\n  return buf;\n}\n\nstatic void static_cb(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_WRITE || ev == MG_EV_POLL) {\n    struct mg_fd *fd = (struct mg_fd *) c->pfn_data;\n    // Read to send IO buffer directly, avoid extra on-stack buffer\n    size_t n, max = MG_IO_SIZE, space;\n    size_t *cl = (size_t *) &c->data[(sizeof(c->data) - sizeof(size_t)) /\n                                     sizeof(size_t) * sizeof(size_t)];\n    if (c->send.size < max) mg_iobuf_resize(&c->send, max);\n    if (c->send.len >= c->send.size) return;  // Rate limit\n    if ((space = c->send.size - c->send.len) > *cl) space = *cl;\n    n = fd->fs->rd(fd->fd, c->send.buf + c->send.len, space);\n    c->send.len += n;\n    *cl -= n;\n    if (n == 0) restore_http_cb(c);\n  } else if (ev == MG_EV_CLOSE) {\n    restore_http_cb(c);\n  }\n  (void) ev_data;\n}\n\n// Known mime types. Keep it outside guess_content_type() function, since\n// some environments don't like it defined there.\n// clang-format off\n#define MG_C_STR(a) { (char *) (a), sizeof(a) - 1 }\nstatic struct mg_str s_known_types[] = {\n    MG_C_STR(\"html\"), MG_C_STR(\"text/html; charset=utf-8\"),\n    MG_C_STR(\"htm\"), MG_C_STR(\"text/html; charset=utf-8\"),\n    MG_C_STR(\"css\"), MG_C_STR(\"text/css; charset=utf-8\"),\n    MG_C_STR(\"js\"), MG_C_STR(\"text/javascript; charset=utf-8\"),\n    MG_C_STR(\"mjs\"), MG_C_STR(\"text/javascript; charset=utf-8\"),\n    MG_C_STR(\"gif\"), MG_C_STR(\"image/gif\"),\n    MG_C_STR(\"png\"), MG_C_STR(\"image/png\"),\n    MG_C_STR(\"jpg\"), MG_C_STR(\"image/jpeg\"),\n    MG_C_STR(\"jpeg\"), MG_C_STR(\"image/jpeg\"),\n    MG_C_STR(\"woff\"), MG_C_STR(\"font/woff\"),\n    MG_C_STR(\"ttf\"), MG_C_STR(\"font/ttf\"),\n    MG_C_STR(\"svg\"), MG_C_STR(\"image/svg+xml\"),\n    MG_C_STR(\"txt\"), MG_C_STR(\"text/plain; charset=utf-8\"),\n    MG_C_STR(\"avi\"), MG_C_STR(\"video/x-msvideo\"),\n    MG_C_STR(\"csv\"), MG_C_STR(\"text/csv\"),\n    MG_C_STR(\"doc\"), MG_C_STR(\"application/msword\"),\n    MG_C_STR(\"exe\"), MG_C_STR(\"application/octet-stream\"),\n    MG_C_STR(\"gz\"), MG_C_STR(\"application/gzip\"),\n    MG_C_STR(\"ico\"), MG_C_STR(\"image/x-icon\"),\n    MG_C_STR(\"json\"), MG_C_STR(\"application/json\"),\n    MG_C_STR(\"mov\"), MG_C_STR(\"video/quicktime\"),\n    MG_C_STR(\"mp3\"), MG_C_STR(\"audio/mpeg\"),\n    MG_C_STR(\"mp4\"), MG_C_STR(\"video/mp4\"),\n    MG_C_STR(\"mpeg\"), MG_C_STR(\"video/mpeg\"),\n    MG_C_STR(\"pdf\"), MG_C_STR(\"application/pdf\"),\n    MG_C_STR(\"shtml\"), MG_C_STR(\"text/html; charset=utf-8\"),\n    MG_C_STR(\"tgz\"), MG_C_STR(\"application/tar-gz\"),\n    MG_C_STR(\"wav\"), MG_C_STR(\"audio/wav\"),\n    MG_C_STR(\"webp\"), MG_C_STR(\"image/webp\"),\n    MG_C_STR(\"zip\"), MG_C_STR(\"application/zip\"),\n    MG_C_STR(\"3gp\"), MG_C_STR(\"video/3gpp\"),\n    {0, 0},\n};\n// clang-format on\n\nstatic struct mg_str guess_content_type(struct mg_str path, const char *extra) {\n  struct mg_str entry, k, v, s = mg_str(extra), asterisk = mg_str_n(\"*\", 1);\n  size_t i = 0;\n\n  // Shrink path to its extension only\n  while (i < path.len && path.buf[path.len - i - 1] != '.') i++;\n  path.buf += path.len - i;\n  path.len = i;\n\n  // Process user-provided mime type overrides, if any\n  while (mg_span(s, &entry, &s, ',')) {\n    if (mg_span(entry, &k, &v, '=') &&\n        (mg_strcmp(asterisk, k) == 0 || mg_strcmp(path, k) == 0))\n      return v;\n  }\n\n  // Process built-in mime types\n  for (i = 0; s_known_types[i].buf != NULL; i += 2) {\n    if (mg_strcmp(path, s_known_types[i]) == 0) return s_known_types[i + 1];\n  }\n\n  return mg_str(\"text/plain; charset=utf-8\");\n}\n\nstatic int getrange(struct mg_str *s, size_t *a, size_t *b) {\n  size_t i, numparsed = 0;\n  for (i = 0; i + 6 < s->len; i++) {\n    struct mg_str k, v = mg_str_n(s->buf + i + 6, s->len - i - 6);\n    if (memcmp(&s->buf[i], \"bytes=\", 6) != 0) continue;\n    if (mg_span(v, &k, &v, '-')) {\n      if (mg_to_size_t(k, a)) numparsed++;\n      if (v.len > 0 && mg_to_size_t(v, b)) numparsed++;\n    } else {\n      if (mg_to_size_t(v, a)) numparsed++;\n    }\n    break;\n  }\n  return (int) numparsed;\n}\n\nvoid mg_http_serve_file(struct mg_connection *c, struct mg_http_message *hm,\n                        const char *path,\n                        const struct mg_http_serve_opts *opts) {\n  char etag[64], tmp[MG_PATH_MAX];\n  struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs;\n  struct mg_fd *fd = NULL;\n  size_t size = 0;\n  time_t mtime = 0;\n  struct mg_str *inm = NULL;\n  struct mg_str mime = guess_content_type(mg_str(path), opts->mime_types);\n  bool gzip = false;\n\n  if (path != NULL) {\n    // If a browser sends us \"Accept-Encoding: gzip\", try to open .gz first\n    struct mg_str *ae = mg_http_get_header(hm, \"Accept-Encoding\");\n    if (ae != NULL) {\n      if (mg_match(*ae, mg_str(\"*gzip*\"), NULL)) {\n        mg_snprintf(tmp, sizeof(tmp), \"%s.gz\", path);\n        fd = mg_fs_open(fs, tmp, MG_FS_READ);\n        if (fd != NULL) gzip = true, path = tmp;\n      }\n    }\n    // No luck opening .gz? Open what we've told to open\n    if (fd == NULL) fd = mg_fs_open(fs, path, MG_FS_READ);\n  }\n\n  // Failed to open, and page404 is configured? Open it, then\n  if (fd == NULL && opts->page404 != NULL) {\n    fd = mg_fs_open(fs, opts->page404, MG_FS_READ);\n    path = opts->page404;\n    mime = guess_content_type(mg_str(path), opts->mime_types);\n  }\n\n  if (fd == NULL || fs->st(path, &size, &mtime) == 0) {\n    mg_http_reply(c, 404, opts->extra_headers, \"Not found\\n\");\n    mg_fs_close(fd);\n    // NOTE: mg_http_etag() call should go first!\n  } else if (mg_http_etag(etag, sizeof(etag), size, mtime) != NULL &&\n             (inm = mg_http_get_header(hm, \"If-None-Match\")) != NULL &&\n             mg_strcasecmp(*inm, mg_str(etag)) == 0) {\n    mg_fs_close(fd);\n    mg_http_reply(c, 304, opts->extra_headers, \"\");\n  } else {\n    int n, status = 200;\n    char range[100];\n    size_t r1 = 0, r2 = 0, cl = size;\n\n    // Handle Range header\n    struct mg_str *rh = mg_http_get_header(hm, \"Range\");\n    range[0] = '\\0';\n    if (rh != NULL && (n = getrange(rh, &r1, &r2)) > 0) {\n      // If range is specified like \"400-\", set second limit to content len\n      if (n == 1) r2 = cl - 1;\n      if (r1 > r2 || r2 >= cl) {\n        status = 416;\n        cl = 0;\n        mg_snprintf(range, sizeof(range), \"Content-Range: bytes */%lld\\r\\n\",\n                    (int64_t) size);\n      } else {\n        status = 206;\n        cl = r2 - r1 + 1;\n        mg_snprintf(range, sizeof(range),\n                    \"Content-Range: bytes %llu-%llu/%llu\\r\\n\", (uint64_t) r1,\n                    (uint64_t) (r1 + cl - 1), (uint64_t) size);\n        fs->sk(fd->fd, r1);\n      }\n    }\n    mg_printf(c,\n              \"HTTP/1.1 %d %s\\r\\n\"\n              \"Content-Type: %.*s\\r\\n\"\n              \"Etag: %s\\r\\n\"\n              \"Content-Length: %llu\\r\\n\"\n              \"%s%s%s\\r\\n\",\n              status, mg_http_status_code_str(status), (int) mime.len, mime.buf,\n              etag, (uint64_t) cl, gzip ? \"Content-Encoding: gzip\\r\\n\" : \"\",\n              range, opts->extra_headers ? opts->extra_headers : \"\");\n    if (mg_strcasecmp(hm->method, mg_str(\"HEAD\")) == 0 || c->is_closing) {\n      c->is_resp = 0;\n      mg_fs_close(fd);\n    } else { // start serving static content only if not closing, see #3354\n      // Track to-be-sent content length at the end of c->data, aligned\n      size_t *clp = (size_t *) &c->data[(sizeof(c->data) - sizeof(size_t)) /\n                                        sizeof(size_t) * sizeof(size_t)];\n      c->pfn = static_cb;\n      c->pfn_data = fd;\n      *clp = cl;\n    }\n  }\n}\n\nstruct printdirentrydata {\n  struct mg_connection *c;\n  struct mg_http_message *hm;\n  const struct mg_http_serve_opts *opts;\n  const char *dir;\n};\n\n#if MG_ENABLE_DIRLIST\nstatic void printdirentry(const char *name, void *userdata) {\n  struct printdirentrydata *d = (struct printdirentrydata *) userdata;\n  struct mg_fs *fs = d->opts->fs == NULL ? &mg_fs_posix : d->opts->fs;\n  size_t size = 0;\n  time_t t = 0;\n  char path[MG_PATH_MAX], sz[40], mod[40];\n  int flags, n = 0;\n\n  // MG_DEBUG((\"[%s] [%s]\", d->dir, name));\n  if (mg_snprintf(path, sizeof(path), \"%s%c%s\", d->dir, '/', name) >\n      sizeof(path)) {\n    MG_ERROR((\"%s truncated\", name));\n  } else if ((flags = fs->st(path, &size, &t)) == 0) {\n    MG_ERROR((\"%lu stat(%s)\", d->c->id, path));\n  } else {\n    const char *slash = flags & MG_FS_DIR ? \"/\" : \"\";\n    if (flags & MG_FS_DIR) {\n      mg_snprintf(sz, sizeof(sz), \"%s\", \"[DIR]\");\n    } else {\n      mg_snprintf(sz, sizeof(sz), \"%lld\", (uint64_t) size);\n    }\n#if defined(MG_HTTP_DIRLIST_TIME_FMT)\n    {\n      char time_str[40];\n      struct tm *time_info = localtime(&t);\n      strftime(time_str, sizeof time_str, \"%Y/%m/%d %H:%M:%S\", time_info);\n      mg_snprintf(mod, sizeof(mod), \"%s\", time_str);\n    }\n#else\n    mg_snprintf(mod, sizeof(mod), \"%lu\", (unsigned long) t);\n#endif\n    n = (int) mg_url_encode(name, strlen(name), path, sizeof(path));\n    mg_printf(d->c,\n              \"  <tr><td><a href=\\\"%.*s%s\\\">%s%s</a></td>\"\n              \"<td name=%lu>%s</td><td name=%lld>%s</td></tr>\\n\",\n              n, path, slash, name, slash, (unsigned long) t, mod,\n              flags & MG_FS_DIR ? (int64_t) -1 : (int64_t) size, sz);\n  }\n}\n\nstatic void listdir(struct mg_connection *c, struct mg_http_message *hm,\n                    const struct mg_http_serve_opts *opts, char *dir) {\n  const char *sort_js_code =\n      \"<script>function srt(tb, sc, so, d) {\"\n      \"var tr = Array.prototype.slice.call(tb.rows, 0),\"\n      \"tr = tr.sort(function (a, b) { var c1 = a.cells[sc], c2 = b.cells[sc],\"\n      \"n1 = c1.getAttribute('name'), n2 = c2.getAttribute('name'), \"\n      \"t1 = a.cells[2].getAttribute('name'), \"\n      \"t2 = b.cells[2].getAttribute('name'); \"\n      \"return so * (t1 < 0 && t2 >= 0 ? -1 : t2 < 0 && t1 >= 0 ? 1 : \"\n      \"n1 ? parseInt(n2) - parseInt(n1) : \"\n      \"c1.textContent.trim().localeCompare(c2.textContent.trim())); });\";\n  const char *sort_js_code2 =\n      \"for (var i = 0; i < tr.length; i++) tb.appendChild(tr[i]); \"\n      \"if (!d) window.location.hash = ('sc=' + sc + '&so=' + so); \"\n      \"};\"\n      \"window.onload = function() {\"\n      \"var tb = document.getElementById('tb');\"\n      \"var m = /sc=([012]).so=(1|-1)/.exec(window.location.hash) || [0, 2, 1];\"\n      \"var sc = m[1], so = m[2]; document.onclick = function(ev) { \"\n      \"var c = ev.target.rel; if (c) {if (c == sc) so *= -1; srt(tb, c, so); \"\n      \"sc = c; ev.preventDefault();}};\"\n      \"srt(tb, sc, so, true);\"\n      \"}\"\n      \"</script>\";\n  struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs;\n  struct printdirentrydata d = {c, hm, opts, dir};\n  char tmp[10], buf[MG_PATH_MAX];\n  size_t off, n;\n  int len = mg_url_decode(hm->uri.buf, hm->uri.len, buf, sizeof(buf), 0);\n  struct mg_str uri = len > 0 ? mg_str_n(buf, (size_t) len) : hm->uri;\n\n  mg_printf(c,\n            \"HTTP/1.1 200 OK\\r\\n\"\n            \"Content-Type: text/html; charset=utf-8\\r\\n\"\n            \"%s\"\n            \"Content-Length:         \\r\\n\\r\\n\",\n            opts->extra_headers == NULL ? \"\" : opts->extra_headers);\n  off = c->send.len;  // Start of body\n  mg_printf(c,\n            \"<!DOCTYPE html><html><head><title>Index of %.*s</title>%s%s\"\n            \"<style>th,td {text-align: left; padding-right: 1em; \"\n            \"font-family: monospace; }</style></head>\"\n            \"<body><h1>Index of %.*s</h1><table cellpadding=\\\"0\\\"><thead>\"\n            \"<tr><th><a href=\\\"#\\\" rel=\\\"0\\\">Name</a></th><th>\"\n            \"<a href=\\\"#\\\" rel=\\\"1\\\">Modified</a></th>\"\n            \"<th><a href=\\\"#\\\" rel=\\\"2\\\">Size</a></th></tr>\"\n            \"<tr><td colspan=\\\"3\\\"><hr></td></tr>\"\n            \"</thead>\"\n            \"<tbody id=\\\"tb\\\">\\n\",\n            (int) uri.len, uri.buf, sort_js_code, sort_js_code2, (int) uri.len,\n            uri.buf);\n  mg_printf(c, \"%s\",\n            \"  <tr><td><a href=\\\"..\\\">..</a></td>\"\n            \"<td name=-1></td><td name=-1>[DIR]</td></tr>\\n\");\n\n  fs->ls(dir, printdirentry, &d);\n  mg_printf(c,\n            \"</tbody><tfoot><tr><td colspan=\\\"3\\\"><hr></td></tr></tfoot>\"\n            \"</table><address>Mongoose v.%s</address></body></html>\\n\",\n            MG_VERSION);\n  n = mg_snprintf(tmp, sizeof(tmp), \"%lu\", (unsigned long) (c->send.len - off));\n  if (n > sizeof(tmp)) n = 0;\n  memcpy(c->send.buf + off - 12, tmp, n);  // Set content length\n  c->is_resp = 0;                          // Mark response end\n}\n#endif\n\n// Resolve requested file into `path` and return its fs->st() result\nstatic int uri_to_path2(struct mg_connection *c, struct mg_http_message *hm,\n                        struct mg_fs *fs, struct mg_str url, struct mg_str dir,\n                        char *path, size_t path_size) {\n  int flags, tmp;\n  // Append URI to the root_dir, and sanitize it\n  size_t n = mg_snprintf(path, path_size, \"%.*s\", (int) dir.len, dir.buf);\n  if (n + 2 >= path_size) {\n    mg_http_reply(c, 400, \"\", \"Exceeded path size\");\n    return -1;\n  }\n  path[path_size - 1] = '\\0';\n  // Terminate root dir with slash\n  if (n > 0 && path[n - 1] != '/') path[n++] = '/', path[n] = '\\0';\n  if (url.len < hm->uri.len) {\n    mg_url_decode(hm->uri.buf + url.len, hm->uri.len - url.len, path + n,\n                  path_size - n, 0);\n  }\n  path[path_size - 1] = '\\0';  // Double-check\n  if (!mg_path_is_sane(mg_str_n(path, path_size))) {\n    mg_http_reply(c, 400, \"\", \"Invalid path\");\n    return -1;\n  }\n  n = strlen(path);\n  while (n > 1 && path[n - 1] == '/') path[--n] = 0;  // Trim trailing slashes\n  flags = mg_strcmp(hm->uri, mg_str(\"/\")) == 0 ? MG_FS_DIR\n                                               : fs->st(path, NULL, NULL);\n  MG_VERBOSE((\"%lu %.*s -> %s %d\", c->id, (int) hm->uri.len, hm->uri.buf, path,\n              flags));\n  if (flags == 0) {\n    // Do nothing - let's caller decide\n  } else if ((flags & MG_FS_DIR) && hm->uri.len > 0 &&\n             hm->uri.buf[hm->uri.len - 1] != '/') {\n    mg_printf(c,\n              \"HTTP/1.1 301 Moved\\r\\n\"\n              \"Location: %.*s/\\r\\n\"\n              \"Content-Length: 0\\r\\n\"\n              \"\\r\\n\",\n              (int) hm->uri.len, hm->uri.buf);\n    c->is_resp = 0;\n    flags = -1;\n  } else if (flags & MG_FS_DIR) {\n    if (((mg_snprintf(path + n, path_size - n, \"/\" MG_HTTP_INDEX) > 0 &&\n          (tmp = fs->st(path, NULL, NULL)) != 0) ||\n         (mg_snprintf(path + n, path_size - n, \"/index.shtml\") > 0 &&\n          (tmp = fs->st(path, NULL, NULL)) != 0))) {\n      flags = tmp;\n    } else if ((mg_snprintf(path + n, path_size - n, \"/\" MG_HTTP_INDEX \".gz\") >\n                    0 &&\n                (tmp = fs->st(path, NULL, NULL)) !=\n                    0)) {  // check for gzipped index\n      flags = tmp;\n      path[n + 1 + strlen(MG_HTTP_INDEX)] =\n          '\\0';  // Remove appended .gz in index file name\n    } else {\n      path[n] = '\\0';  // Remove appended index file name\n    }\n  }\n  return flags;\n}\n\nstatic int uri_to_path(struct mg_connection *c, struct mg_http_message *hm,\n                       const struct mg_http_serve_opts *opts, char *path,\n                       size_t path_size) {\n  struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs;\n  struct mg_str k, v, part, s = mg_str(opts->root_dir), u = {NULL, 0}, p = u;\n  while (mg_span(s, &part, &s, ',')) {\n    if (!mg_span(part, &k, &v, '=')) k = part, v = mg_str_n(NULL, 0);\n    if (v.len == 0) v = k, k = mg_str(\"/\"), u = k, p = v;\n    if (hm->uri.len < k.len) continue;\n    if (mg_strcmp(k, mg_str_n(hm->uri.buf, k.len)) != 0) continue;\n    u = k, p = v;\n  }\n  return uri_to_path2(c, hm, fs, u, p, path, path_size);\n}\n\nvoid mg_http_serve_dir(struct mg_connection *c, struct mg_http_message *hm,\n                       const struct mg_http_serve_opts *opts) {\n  char path[MG_PATH_MAX];\n  const char *sp = opts->ssi_pattern;\n  int flags = uri_to_path(c, hm, opts, path, sizeof(path));\n  if (flags < 0) {\n    // Do nothing: the response has already been sent by uri_to_path()\n  } else if (flags & MG_FS_DIR) {\n#if MG_ENABLE_DIRLIST\n    listdir(c, hm, opts, path);\n#else\n    mg_http_reply(c, 403, \"\", \"Forbidden\\n\");\n#endif\n  } else if (flags && sp != NULL && mg_match(mg_str(path), mg_str(sp), NULL)) {\n    mg_http_serve_ssi(c, opts->root_dir, path);\n  } else {\n    mg_http_serve_file(c, hm, path, opts);\n  }\n}\n\nstatic bool mg_is_url_safe(int c) {\n  return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') ||\n         (c >= 'A' && c <= 'Z') || c == '.' || c == '_' || c == '-' || c == '~';\n}\n\nsize_t mg_url_encode(const char *s, size_t sl, char *buf, size_t len) {\n  size_t i, n = 0;\n  for (i = 0; i < sl; i++) {\n    int c = *(unsigned char *) &s[i];\n    if (n + 4 >= len) return 0;\n    if (mg_is_url_safe(c)) {\n      buf[n++] = s[i];\n    } else {\n      mg_snprintf(&buf[n], 4, \"%%%M\", mg_print_hex, 1, &s[i]);\n      n += 3;\n    }\n  }\n  if (len > 0 && n < len - 1) buf[n] = '\\0';  // Null-terminate the destination\n  if (len > 0) buf[len - 1] = '\\0';           // Always.\n  return n;\n}\n\nvoid mg_http_creds(struct mg_http_message *hm, char *user, size_t userlen,\n                   char *pass, size_t passlen) {\n  struct mg_str *v = mg_http_get_header(hm, \"Authorization\");\n  user[0] = pass[0] = '\\0';\n  if (v != NULL && v->len > 6 && memcmp(v->buf, \"Basic \", 6) == 0) {\n    char buf[256];\n    size_t n = mg_base64_decode(v->buf + 6, v->len - 6, buf, sizeof(buf));\n    const char *p = (const char *) memchr(buf, ':', n > 0 ? n : 0);\n    if (p != NULL) {\n      mg_snprintf(user, userlen, \"%.*s\", p - buf, buf);\n      mg_snprintf(pass, passlen, \"%.*s\", n - (size_t) (p - buf) - 1, p + 1);\n    }\n  } else if (v != NULL && v->len > 7 && memcmp(v->buf, \"Bearer \", 7) == 0) {\n    mg_snprintf(pass, passlen, \"%.*s\", (int) v->len - 7, v->buf + 7);\n  } else if ((v = mg_http_get_header(hm, \"Cookie\")) != NULL) {\n    struct mg_str t = mg_http_get_header_var(*v, mg_str_n(\"access_token\", 12));\n    if (t.len > 0) mg_snprintf(pass, passlen, \"%.*s\", (int) t.len, t.buf);\n  } else {\n    mg_http_get_var(&hm->query, \"access_token\", pass, passlen);\n  }\n}\n\nstatic struct mg_str stripquotes(struct mg_str s) {\n  return s.len > 1 && s.buf[0] == '\"' && s.buf[s.len - 1] == '\"'\n             ? mg_str_n(s.buf + 1, s.len - 2)\n             : s;\n}\n\nstruct mg_str mg_http_get_header_var(struct mg_str s, struct mg_str v) {\n  size_t i;\n  for (i = 0; v.len > 0 && i + v.len + 2 < s.len; i++) {\n    if (s.buf[i + v.len] == '=' && memcmp(&s.buf[i], v.buf, v.len) == 0) {\n      const char *p = &s.buf[i + v.len + 1], *b = p, *x = &s.buf[s.len];\n      int q = p < x && *p == '\"' ? 1 : 0;\n      while (p < x &&\n             (q ? p == b || *p != '\"' : *p != ';' && *p != ' ' && *p != ','))\n        p++;\n      // MG_INFO((\"[%.*s] [%.*s] [%.*s]\", (int) s.len, s.buf, (int) v.len,\n      // v.buf, (int) (p - b), b));\n      return stripquotes(mg_str_n(b, (size_t) (p - b + q)));\n    }\n  }\n  return mg_str_n(NULL, 0);\n}\n\nlong mg_http_upload(struct mg_connection *c, struct mg_http_message *hm,\n                    struct mg_fs *fs, const char *dir, size_t max_size) {\n  char buf[20] = \"0\", file[MG_PATH_MAX], path[MG_PATH_MAX];\n  long res = 0, offset;\n  mg_http_get_var(&hm->query, \"offset\", buf, sizeof(buf));\n  mg_http_get_var(&hm->query, \"file\", file, sizeof(file));\n  offset = strtol(buf, NULL, 0);\n  mg_snprintf(path, sizeof(path), \"%s%c%s\", dir, MG_DIRSEP, file);\n  if (hm->body.len == 0) {\n    mg_http_reply(c, 200, \"\", \"%ld\", res);  // Nothing to write\n  } else if (file[0] == '\\0') {\n    mg_http_reply(c, 400, \"\", \"file required\");\n    res = -1;\n  } else if (mg_path_is_sane(mg_str(file)) == false) {\n    mg_http_reply(c, 400, \"\", \"%s: invalid file\", file);\n    res = -2;\n  } else if (offset < 0) {\n    mg_http_reply(c, 400, \"\", \"offset required\");\n    res = -3;\n  } else if ((size_t) offset + hm->body.len > max_size) {\n    mg_http_reply(c, 400, \"\", \"%s: over max size of %lu\", path,\n                  (unsigned long) max_size);\n    res = -4;\n  } else {\n    struct mg_fd *fd;\n    size_t current_size = 0;\n    MG_DEBUG((\"%s -> %lu bytes @ %ld\", path, hm->body.len, offset));\n    if (offset == 0) fs->rm(path);  // If offset if 0, truncate file\n    fs->st(path, &current_size, NULL);\n    if (offset > 0 && current_size != (size_t) offset) {\n      mg_http_reply(c, 400, \"\", \"%s: offset mismatch\", path);\n      res = -5;\n    } else if ((fd = mg_fs_open(fs, path, MG_FS_WRITE)) == NULL) {\n      mg_http_reply(c, 400, \"\", \"open(%s)\", path);\n      res = -6;\n    } else {\n      res = offset + (long) fs->wr(fd->fd, hm->body.buf, hm->body.len);\n      mg_fs_close(fd);\n      mg_http_reply(c, 200, \"\", \"%ld\", res);\n    }\n  }\n  return res;\n}\n\nint mg_http_status(const struct mg_http_message *hm) {\n  return atoi(hm->uri.buf);\n}\n\nstatic bool is_hex_digit(int c) {\n  return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') ||\n         (c >= 'A' && c <= 'F');\n}\n\nstatic int skip_chunk(const char *buf, int len, int *pl, int *dl) {\n  int i = 0, n = 0;\n  if (len < 3) return 0;\n  while (i < len && is_hex_digit(buf[i])) i++;\n  if (i == 0) return -1;                     // Error, no length specified\n  if (i > (int) sizeof(int) * 2) return -1;  // Chunk length is too big\n  if (len < i + 1 || buf[i] != '\\r' || buf[i + 1] != '\\n') return -1;  // Error\n  if (mg_str_to_num(mg_str_n(buf, (size_t) i), 16, &n, sizeof(int)) == false)\n    return -1;                    // Decode chunk length, overflow\n  if (n < 0) return -1;           // Error. TODO(): some checks now redundant\n  if (n > len - i - 4) return 0;  // Chunk not yet fully buffered\n  if (buf[i + n + 2] != '\\r' || buf[i + n + 3] != '\\n') return -1;  // Error\n  *pl = i + 2, *dl = n;\n  return i + 2 + n + 2;\n}\n\nstatic void http_cb(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_READ || ev == MG_EV_CLOSE ||\n      (ev == MG_EV_POLL && c->is_accepted && !c->is_draining &&\n       c->recv.len > 0)) {  // see #2796\n    struct mg_http_message hm;\n    size_t ofs = 0;  // Parsing offset\n    while (c->is_resp == 0 && ofs < c->recv.len) {\n      const char *buf = (char *) c->recv.buf + ofs;\n      int n = mg_http_parse(buf, c->recv.len - ofs, &hm);\n      struct mg_str *te;  // Transfer - encoding header\n      bool is_chunked = false;\n      size_t old_len = c->recv.len;\n      if (n < 0) {\n        // We don't use mg_error() here, to avoid closing pipelined requests\n        // prematurely, see #2592\n        MG_ERROR((\"HTTP parse, %lu bytes\", c->recv.len));\n        c->is_draining = 1;\n        mg_hexdump(buf, c->recv.len - ofs > 16 ? 16 : c->recv.len - ofs);\n        c->recv.len = 0;\n        return;\n      }\n      if (n == 0) break;                 // Request is not buffered yet\n      mg_call(c, MG_EV_HTTP_HDRS, &hm);  // Got all HTTP headers\n      if (c->recv.len != old_len) {\n        // User manipulated received data. Wash our hands\n        MG_DEBUG((\"%lu detaching HTTP handler\", c->id));\n        c->pfn = NULL;\n        return;\n      }\n      if (ev == MG_EV_CLOSE) {  // If client did not set Content-Length\n        hm.message.len = c->recv.len - ofs;  // and closes now, deliver MSG\n        hm.body.len = hm.message.len - (size_t) (hm.body.buf - hm.message.buf);\n      }\n      if ((te = mg_http_get_header(&hm, \"Transfer-Encoding\")) != NULL) {\n        if (mg_strcasecmp(*te, mg_str(\"chunked\")) == 0) {\n          is_chunked = true;\n        } else {\n          mg_error(c, \"Invalid Transfer-Encoding\");  // See #2460\n          return;\n        }\n      } else if (mg_http_get_header(&hm, \"Content-length\") == NULL) {\n        // #2593: HTTP packets must contain either Transfer-Encoding or\n        // Content-length\n        bool is_response = mg_ncasecmp(hm.method.buf, \"HTTP/\", 5) == 0;\n        bool require_content_len = false;\n        if (!is_response && (mg_strcasecmp(hm.method, mg_str(\"POST\")) == 0 ||\n                             mg_strcasecmp(hm.method, mg_str(\"PUT\")) == 0)) {\n          // POST and PUT should include an entity body. Therefore, they should\n          // contain a Content-length header (unless the body length is 0, in\n          // which case it can be omitted). Other requests can also contain a\n          // body, but their content has no defined semantics (RFC 7231)\n          if (hm.body.len != 0) require_content_len = true;\n          ofs += (size_t) n;  // this request has been processed\n        } else if (is_response) {\n          // HTTP spec 7.2 Entity body: All other responses must include a body\n          // or Content-Length header field defined with a value of 0.\n          int status = mg_http_status(&hm);\n          require_content_len = status >= 200 && status != 204 && status != 304;\n        }\n        if (require_content_len) {\n          if (!c->is_client) mg_http_reply(c, 411, \"\", \"\");\n          MG_ERROR((\"Content length missing from %s\",\n                    is_response ? \"response\" : \"request\"));\n        }\n      }\n\n      if (is_chunked) {\n        // For chunked data, strip off prefixes and suffixes from chunks\n        // and relocate them right after the headers, then report a message\n        char *s = (char *) c->recv.buf + ofs + n;\n        int o = 0, pl, dl, cl, len = (int) (c->recv.len - ofs - (size_t) n);\n\n        // Find zero-length chunk (the end of the body)\n        while ((cl = skip_chunk(s + o, len - o, &pl, &dl)) > 0 && dl) o += cl;\n        if (cl == 0) break;  // No zero-len chunk, buffer more data\n        if (cl < 0) {\n          mg_error(c, \"Invalid chunk\");\n          break;\n        }\n\n        // Zero chunk found. Second pass: strip + relocate\n        o = 0, hm.body.len = 0, hm.message.len = (size_t) n;\n        while ((cl = skip_chunk(s + o, len - o, &pl, &dl)) > 0) {\n          memmove(s + hm.body.len, s + o + pl, (size_t) dl);\n          o += cl, hm.body.len += (size_t) dl, hm.message.len += (size_t) dl;\n          if (dl == 0) break;\n        }\n        ofs += (size_t) (n + o);\n      } else {  // Normal, non-chunked data\n        size_t len = c->recv.len - ofs - (size_t) n;\n        if (hm.body.len > len) break;  // Buffer more data\n        ofs += (size_t) n + hm.body.len;\n      }\n\n      if (c->is_accepted) c->is_resp = 1;  // Start generating response\n      mg_call(c, MG_EV_HTTP_MSG, &hm);     // User handler can clear is_resp\n      if (c->is_accepted && !c->is_resp) {\n        struct mg_str *cc = mg_http_get_header(&hm, \"Connection\");\n        if (cc != NULL && mg_strcasecmp(*cc, mg_str(\"close\")) == 0) {\n          c->is_draining = 1;  // honor \"Connection: close\"\n          break;\n        }\n      }\n    }\n    if (ofs > 0) mg_iobuf_del(&c->recv, 0, ofs);  // Delete processed data\n  }\n  (void) ev_data;\n}\n\nstruct mg_connection *mg_http_connect(struct mg_mgr *mgr, const char *url,\n                                      mg_event_handler_t fn, void *fn_data) {\n  return mg_connect_svc(mgr, url, fn, fn_data, http_cb, NULL);\n}\n\nstruct mg_connection *mg_http_listen(struct mg_mgr *mgr, const char *url,\n                                     mg_event_handler_t fn, void *fn_data) {\n  struct mg_connection *c = mg_listen(mgr, url, fn, fn_data);\n  if (c != NULL) c->pfn = http_cb;\n  return c;\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/iobuf.c\"\n#endif\n\n\n\n\n\nstatic size_t roundup(size_t size, size_t align) {\n  return align == 0 ? size : (size + align - 1) / align * align;\n}\n\nbool mg_iobuf_resize(struct mg_iobuf *io, size_t new_size) {\n  bool ok = true;\n  new_size = roundup(new_size, io->align);\n  if (new_size == 0) {\n    mg_bzero(io->buf, io->size);\n    mg_free(io->buf);\n    io->buf = NULL;\n    io->len = io->size = 0;\n  } else if (new_size != io->size) {\n    // NOTE(lsm): do not use realloc here. Use mg_calloc/mg_free only\n    void *p = mg_calloc(1, new_size);\n    if (p != NULL) {\n      size_t len = new_size < io->len ? new_size : io->len;\n      if (len > 0 && io->buf != NULL) memmove(p, io->buf, len);\n      mg_bzero(io->buf, io->size);\n      mg_free(io->buf);\n      io->buf = (unsigned char *) p;\n      io->size = new_size;\n      io->len = len;\n    } else {\n      ok = false;\n      MG_ERROR((\"%lld->%lld\", (uint64_t) io->size, (uint64_t) new_size));\n    }\n  }\n  return ok;\n}\n\nbool mg_iobuf_init(struct mg_iobuf *io, size_t size, size_t align) {\n  io->buf = NULL;\n  io->align = align;\n  io->size = io->len = 0;\n  return mg_iobuf_resize(io, size);\n}\n\nsize_t mg_iobuf_add(struct mg_iobuf *io, size_t ofs, const void *buf,\n                    size_t len) {\n  size_t new_size = roundup(io->len + len, io->align);\n  mg_iobuf_resize(io, new_size);      // Attempt to resize\n  if (new_size != io->size) len = 0;  // Resize failure, append nothing\n  if (ofs < io->len) memmove(io->buf + ofs + len, io->buf + ofs, io->len - ofs);\n  if (buf != NULL) memmove(io->buf + ofs, buf, len);\n  if (ofs > io->len) io->len += ofs - io->len;\n  io->len += len;\n  return len;\n}\n\nsize_t mg_iobuf_del(struct mg_iobuf *io, size_t ofs, size_t len) {\n  if (ofs > io->len) ofs = io->len;\n  if (ofs + len > io->len) len = io->len - ofs;\n  if (io->buf) memmove(io->buf + ofs, io->buf + ofs + len, io->len - ofs - len);\n  if (io->buf) mg_bzero(io->buf + io->len - len, len);\n  io->len -= len;\n  return len;\n}\n\nvoid mg_iobuf_free(struct mg_iobuf *io) {\n  mg_iobuf_resize(io, 0);\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/json.c\"\n#endif\n\n\n\n\n\nstatic const char *escapeseq(int esc) {\n  return esc ? \"\\b\\f\\n\\r\\t\\\\\\\"\" : \"bfnrt\\\\\\\"\";\n}\n\nstatic char json_esc(int c, int esc) {\n  const char *p, *esc1 = escapeseq(esc), *esc2 = escapeseq(!esc);\n  for (p = esc1; *p != '\\0'; p++) {\n    if (*p == c) return esc2[p - esc1];\n  }\n  return 0;\n}\n\nstatic int mg_pass_string(const char *s, int len) {\n  int i;\n  for (i = 0; i < len; i++) {\n    if (s[i] == '\\\\' && i + 1 < len && json_esc(s[i + 1], 1)) {\n      i++;\n    } else if (s[i] == '\\0') {\n      return MG_JSON_INVALID;\n    } else if (s[i] == '\"') {\n      return i;\n    }\n  }\n  return MG_JSON_INVALID;\n}\n\nstatic double mg_atod(const char *p, int len, int *numlen) {\n  double d = 0.0;\n  int i = 0, sign = 1;\n\n  // Sign\n  if (i < len && *p == '-') {\n    sign = -1, i++;\n  } else if (i < len && *p == '+') {\n    i++;\n  }\n\n  // Decimal\n  for (; i < len && p[i] >= '0' && p[i] <= '9'; i++) {\n    d *= 10.0;\n    d += p[i] - '0';\n  }\n  d *= sign;\n\n  // Fractional\n  if (i < len && p[i] == '.') {\n    double frac = 0.0, base = 0.1;\n    i++;\n    for (; i < len && p[i] >= '0' && p[i] <= '9'; i++) {\n      frac += base * (p[i] - '0');\n      base /= 10.0;\n    }\n    d += frac * sign;\n  }\n\n  // Exponential\n  if (i < len && (p[i] == 'e' || p[i] == 'E')) {\n    int j, exp = 0, minus = 0;\n    i++;\n    if (i < len && p[i] == '-') minus = 1, i++;\n    if (i < len && p[i] == '+') i++;\n    while (i < len && p[i] >= '0' && p[i] <= '9' && exp < 308)\n      exp = exp * 10 + (p[i++] - '0');\n    if (minus) exp = -exp;\n    for (j = 0; j < exp; j++) d *= 10.0;\n    for (j = 0; j < -exp; j++) d /= 10.0;\n  }\n\n  if (numlen != NULL) *numlen = i;\n  return d;\n}\n\n// Iterate over object or array elements\nsize_t mg_json_next(struct mg_str obj, size_t ofs, struct mg_str *key,\n                    struct mg_str *val) {\n  if (ofs >= obj.len) {\n    ofs = 0;  // Out of boundaries, stop scanning\n  } else if (obj.len < 2 || (*obj.buf != '{' && *obj.buf != '[')) {\n    ofs = 0;  // Not an array or object, stop\n  } else {\n    struct mg_str sub = mg_str_n(obj.buf + ofs, obj.len - ofs);\n    if (ofs == 0) ofs++, sub.buf++, sub.len--;\n    if (*obj.buf == '[') {  // Iterate over an array\n      int n = 0, o = mg_json_get(sub, \"$\", &n);\n      if (n < 0 || o < 0 || (size_t) (o + n) > sub.len) {\n        ofs = 0;  // Error parsing key, stop scanning\n      } else {\n        if (key) *key = mg_str_n(NULL, 0);\n        if (val) *val = mg_str_n(sub.buf + o, (size_t) n);\n        ofs = (size_t) (&sub.buf[o + n] - obj.buf);\n      }\n    } else {  // Iterate over an object\n      int n = 0, o = mg_json_get(sub, \"$\", &n);\n      if (n < 0 || o < 0 || (size_t) (o + n) > sub.len) {\n        ofs = 0;  // Error parsing key, stop scanning\n      } else {\n        if (key) *key = mg_str_n(sub.buf + o, (size_t) n);\n        sub.buf += o + n, sub.len -= (size_t) (o + n);\n        while (sub.len > 0 && *sub.buf != ':') sub.len--, sub.buf++;\n        if (sub.len > 0 && *sub.buf == ':') sub.len--, sub.buf++;\n        n = 0, o = mg_json_get(sub, \"$\", &n);\n        if (n < 0 || o < 0 || (size_t) (o + n) > sub.len) {\n          ofs = 0;  // Error parsing value, stop scanning\n        } else {\n          if (val) *val = mg_str_n(sub.buf + o, (size_t) n);\n          ofs = (size_t) (&sub.buf[o + n] - obj.buf);\n        }\n      }\n    }\n    // MG_INFO((\"SUB ofs %u %.*s\", ofs, sub.len, sub.buf));\n    while (ofs && ofs < obj.len &&\n           (obj.buf[ofs] == ' ' || obj.buf[ofs] == '\\t' ||\n            obj.buf[ofs] == '\\n' || obj.buf[ofs] == '\\r')) {\n      ofs++;\n    }\n    if (ofs && ofs < obj.len && obj.buf[ofs] == ',') ofs++;\n    if (ofs > obj.len) ofs = 0;\n  }\n  return ofs;\n}\n\nint mg_json_get(struct mg_str json, const char *path, int *toklen) {\n  const char *s = json.buf;\n  int len = (int) json.len;\n  enum { S_VALUE, S_KEY, S_COLON, S_COMMA_OR_EOO } expecting = S_VALUE;\n  unsigned char nesting[MG_JSON_MAX_DEPTH];\n  int i = 0;             // Current offset in `s`\n  int j = 0;             // Offset in `s` we're looking for (return value)\n  int depth = 0;         // Current depth (nesting level)\n  int ed = 0;            // Expected depth\n  int pos = 1;           // Current position in `path`\n  int ci = -1, ei = -1;  // Current and expected index in array\n\n  if (toklen) *toklen = 0;\n  if (path[0] != '$') return MG_JSON_INVALID;\n\n#define MG_CHECKRET(x)                                  \\\n  do {                                                  \\\n    if (depth == ed && path[pos] == '\\0' && ci == ei) { \\\n      if (toklen) *toklen = i - j + 1;                  \\\n      return j;                                         \\\n    }                                                   \\\n  } while (0)\n\n// In the ascii table, the distance between `[` and `]` is 2.\n// Ditto for `{` and `}`. Hence +2 in the code below.\n#define MG_EOO(x)                                            \\\n  do {                                                       \\\n    if (depth == ed && ci != ei) return MG_JSON_NOT_FOUND;   \\\n    if (c != nesting[depth - 1] + 2) return MG_JSON_INVALID; \\\n    depth--;                                                 \\\n    MG_CHECKRET(x);                                          \\\n  } while (0)\n\n  for (i = 0; i < len; i++) {\n    unsigned char c = ((unsigned char *) s)[i];\n    if (c == ' ' || c == '\\t' || c == '\\n' || c == '\\r') continue;\n    switch (expecting) {\n      case S_VALUE:\n        // p(\"V %s [%.*s] %d %d %d %d\\n\", path, pos, path, depth, ed, ci, ei);\n        if (depth == ed) j = i;\n        if (c == '{') {\n          if (depth >= (int) sizeof(nesting)) return MG_JSON_TOO_DEEP;\n          if (depth == ed && path[pos] == '.' && ci == ei) {\n            // If we start the object, reset array indices\n            ed++, pos++, ci = ei = -1;\n          }\n          nesting[depth++] = c;\n          expecting = S_KEY;\n          break;\n        } else if (c == '[') {\n          if (depth >= (int) sizeof(nesting)) return MG_JSON_TOO_DEEP;\n          if (depth == ed && path[pos] == '[' && ei == ci) {\n            ed++, pos++, ci = 0;\n            for (ei = 0; path[pos] != ']' && path[pos] != '\\0'; pos++) {\n              ei *= 10;\n              ei += path[pos] - '0';\n            }\n            if (path[pos] != 0) pos++;\n          }\n          nesting[depth++] = c;\n          break;\n        } else if (c == ']' && depth > 0) {  // Empty array\n          MG_EOO(']');\n        } else if (c == 't' && i + 3 < len && memcmp(&s[i], \"true\", 4) == 0) {\n          i += 3;\n        } else if (c == 'n' && i + 3 < len && memcmp(&s[i], \"null\", 4) == 0) {\n          i += 3;\n        } else if (c == 'f' && i + 4 < len && memcmp(&s[i], \"false\", 5) == 0) {\n          i += 4;\n        } else if (c == '-' || ((c >= '0' && c <= '9'))) {\n          int numlen = 0;\n          mg_atod(&s[i], len - i, &numlen);\n          i += numlen - 1;\n        } else if (c == '\"') {\n          int n = mg_pass_string(&s[i + 1], len - i - 1);\n          if (n < 0) return n;\n          i += n + 1;\n        } else {\n          return MG_JSON_INVALID;\n        }\n        MG_CHECKRET('V');\n        if (depth == ed && ei >= 0) ci++;\n        expecting = S_COMMA_OR_EOO;\n        break;\n\n      case S_KEY:\n        if (c == '\"') {\n          int n = mg_pass_string(&s[i + 1], len - i - 1);\n          if (n < 0) return n;\n          if (i + 1 + n >= len) return MG_JSON_NOT_FOUND;\n          if (depth < ed) return MG_JSON_NOT_FOUND;\n          if (depth == ed && path[pos - 1] != '.') return MG_JSON_NOT_FOUND;\n          // printf(\"K %s [%.*s] [%.*s] %d %d %d %d %d\\n\", path, pos, path, n,\n          //        &s[i + 1], n, depth, ed, ci, ei);\n          //  NOTE(cpq): in the check sequence below is important.\n          //  strncmp() must go first: it fails fast if the remaining length\n          //  of the path is smaller than `n`.\n          if (depth == ed && path[pos - 1] == '.' &&\n              strncmp(&s[i + 1], &path[pos], (size_t) n) == 0 &&\n              (path[pos + n] == '\\0' || path[pos + n] == '.' ||\n               path[pos + n] == '[')) {\n            pos += n;\n          }\n          i += n + 1;\n          expecting = S_COLON;\n        } else if (c == '}') {  // Empty object\n          MG_EOO('}');\n          expecting = S_COMMA_OR_EOO;\n          if (depth == ed && ei >= 0) ci++;\n        } else {\n          return MG_JSON_INVALID;\n        }\n        break;\n\n      case S_COLON:\n        if (c == ':') {\n          expecting = S_VALUE;\n        } else {\n          return MG_JSON_INVALID;\n        }\n        break;\n\n      case S_COMMA_OR_EOO:\n        if (depth <= 0) {\n          return MG_JSON_INVALID;\n        } else if (c == ',') {\n          expecting = (nesting[depth - 1] == '{') ? S_KEY : S_VALUE;\n        } else if (c == ']' || c == '}') {\n          if (depth == ed && c == '}' && path[pos - 1] == '.')\n            return MG_JSON_NOT_FOUND;\n          if (depth == ed && c == ']' && path[pos - 1] == ',')\n            return MG_JSON_NOT_FOUND;\n          MG_EOO('O');\n          if (depth == ed && ei >= 0) ci++;\n        } else {\n          return MG_JSON_INVALID;\n        }\n        break;\n    }\n  }\n  return MG_JSON_NOT_FOUND;\n}\n\nstruct mg_str mg_json_get_tok(struct mg_str json, const char *path) {\n  int len = 0, ofs = mg_json_get(json, path, &len);\n  return mg_str_n(ofs < 0 ? NULL : json.buf + ofs,\n                  (size_t) (len < 0 ? 0 : len));\n}\n\nbool mg_json_get_num(struct mg_str json, const char *path, double *v) {\n  int n, toklen, found = 0;\n  if ((n = mg_json_get(json, path, &toklen)) >= 0 &&\n      (json.buf[n] == '-' || (json.buf[n] >= '0' && json.buf[n] <= '9'))) {\n    if (v != NULL) *v = mg_atod(json.buf + n, toklen, NULL);\n    found = 1;\n  }\n  return found;\n}\n\nbool mg_json_get_bool(struct mg_str json, const char *path, bool *v) {\n  int found = 0, off = mg_json_get(json, path, NULL);\n  if (off >= 0 && (json.buf[off] == 't' || json.buf[off] == 'f')) {\n    if (v != NULL) *v = json.buf[off] == 't';\n    found = 1;\n  }\n  return found;\n}\n\nbool mg_json_unescape(struct mg_str s, char *to, size_t n) {\n  size_t i, j;\n  for (i = 0, j = 0; i < s.len && j < n; i++, j++) {\n    if (s.buf[i] == '\\\\' && i + 5 < s.len && s.buf[i + 1] == 'u') {\n      //  \\uXXXX escape. We process simple one-byte chars \\u00xx within ASCII\n      //  range. More complex chars would require dragging in a UTF8 library,\n      //  which is too much for us\n      if (mg_str_to_num(mg_str_n(s.buf + i + 2, 4), 16, &to[j],\n                        sizeof(uint8_t)) == false)\n        return false;\n      i += 5;\n    } else if (s.buf[i] == '\\\\' && i + 1 < s.len) {\n      char c = json_esc(s.buf[i + 1], 0);\n      if (c == 0) return false;\n      to[j] = c;\n      i++;\n    } else {\n      to[j] = s.buf[i];\n    }\n  }\n  if (j >= n) return false;\n  if (n > 0) to[j] = '\\0';\n  return true;\n}\n\nchar *mg_json_get_str(struct mg_str json, const char *path) {\n  char *result = NULL;\n  int len = 0, off = mg_json_get(json, path, &len);\n  if (off >= 0 && len > 1 && json.buf[off] == '\"') {\n    if ((result = (char *) mg_calloc(1, (size_t) len)) != NULL &&\n        !mg_json_unescape(mg_str_n(json.buf + off + 1, (size_t) (len - 2)),\n                          result, (size_t) len)) {\n      mg_free(result);\n      result = NULL;\n    }\n  }\n  return result;\n}\n\nchar *mg_json_get_b64(struct mg_str json, const char *path, int *slen) {\n  char *result = NULL;\n  int len = 0, off = mg_json_get(json, path, &len);\n  if (off >= 0 && json.buf[off] == '\"' && len > 1 &&\n      (result = (char *) mg_calloc(1, (size_t) len)) != NULL) {\n    size_t k = mg_base64_decode(json.buf + off + 1, (size_t) (len - 2), result,\n                                (size_t) len);\n    if (slen != NULL) *slen = (int) k;\n  }\n  return result;\n}\n\nchar *mg_json_get_hex(struct mg_str json, const char *path, int *slen) {\n  char *result = NULL;\n  int len = 0, off = mg_json_get(json, path, &len);\n  if (off >= 0 && json.buf[off] == '\"' && len > 1 &&\n      (result = (char *) mg_calloc(1, (size_t) len / 2)) != NULL) {\n    int i;\n    for (i = 0; i < len - 2; i += 2) {\n      mg_str_to_num(mg_str_n(json.buf + off + 1 + i, 2), 16, &result[i >> 1],\n                    sizeof(uint8_t));\n    }\n    result[len / 2 - 1] = '\\0';\n    if (slen != NULL) *slen = len / 2 - 1;\n  }\n  return result;\n}\n\nlong mg_json_get_long(struct mg_str json, const char *path, long dflt) {\n  double dv;\n  long result = dflt;\n  if (mg_json_get_num(json, path, &dv)) result = (long) dv;\n  return result;\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/l2.c\"\n#endif\n\n\n\n\n#if MG_ENABLE_TCPIP\n\n// L2 API\nvoid mg_l2_init(enum mg_l2type type, uint8_t *addr, uint16_t *mtu,\n                uint16_t *framesize);\nuint8_t *mg_l2_header(enum mg_l2type type, enum mg_l2proto proto, uint8_t *src,\n                      uint8_t *dst, uint8_t *frame);\nsize_t mg_l2_footer(enum mg_l2type type, size_t len, uint8_t *frame);\nbool mg_l2_rx(struct mg_tcpip_if *ifp, enum mg_l2proto *proto,\n              struct mg_str *pay, struct mg_str *raw);\n// TODO(): ? bool mg_l2_rx(enum mg_l2type type, struct mg_l2opts *opts, uint8_t\n// *addr, enum mg_l2proto *proto, struct mg_str *pay, struct mg_str *raw);\nuint8_t *mg_l2_getaddr(enum mg_l2type type, uint8_t *frame);\nuint8_t *mg_l2_mapip(enum mg_l2type type, enum mg_l2addrtype addrtype,\n                     struct mg_addr *ip);\nbool mg_l2_genip6(enum mg_l2type type, uint64_t *ip6, uint8_t prefix_len,\n                  uint8_t *addr);\nbool mg_l2_ip6get(enum mg_l2type type, uint8_t *addr, uint8_t *opts,\n                  uint8_t len);\nuint8_t mg_l2_ip6put(enum mg_l2type type, uint8_t *addr, uint8_t *opts);\n\n// clang-format off\nextern void mg_l2_eth_init(struct mg_l2addr *, uint16_t *, uint16_t *);\nextern uint8_t *mg_l2_eth_header(enum mg_l2proto, struct mg_l2addr *, struct mg_l2addr *, uint8_t *);\nextern size_t mg_l2_eth_footer(size_t, uint8_t *);\nextern bool mg_l2_eth_rx(struct mg_tcpip_if *, enum mg_l2proto *, struct mg_str *, struct mg_str *);\nextern struct mg_l2addr *mg_l2_eth_getaddr(uint8_t *);\nextern struct mg_l2addr *mg_l2_eth_mapip(enum mg_l2addrtype, struct mg_addr *);\nextern bool mg_l2_eth_genip6(uint64_t *, uint8_t, struct mg_l2addr *);\nextern bool mg_l2_eth_ip6get(struct mg_l2addr *, uint8_t *, uint8_t);\nextern uint8_t mg_l2_eth_ip6put(struct mg_l2addr *, uint8_t *);\n\nextern void mg_l2_ppp_init(struct mg_l2addr *, uint16_t *, uint16_t *);\nextern uint8_t *mg_l2_ppp_header(enum mg_l2proto, struct mg_l2addr *, struct mg_l2addr *, uint8_t *);\nextern size_t mg_l2_ppp_footer(size_t, uint8_t *);\nextern bool mg_l2_ppp_rx(struct mg_tcpip_if *, enum mg_l2proto *, struct mg_str *, struct mg_str *);\nextern struct mg_l2addr *mg_l2_ppp_getaddr(uint8_t *);\nextern struct mg_l2addr *mg_l2_ppp_mapip(enum mg_l2addrtype, struct mg_addr *);\n#if MG_ENABLE_IPV6\nextern bool mg_l2_ppp_genip6(uint64_t *, uint8_t, struct mg_l2addr *);\nextern bool mg_l2_ppp_ip6get(struct mg_l2addr *, uint8_t *, uint8_t);\nextern uint8_t mg_l2_ppp_ip6put(struct mg_l2addr *, uint8_t *);\n#endif\n\ntypedef void (*l2_init_fn)(struct mg_l2addr *, uint16_t *, uint16_t *);\ntypedef uint8_t *((*l2_header_fn)(enum mg_l2proto, struct mg_l2addr *, struct mg_l2addr *, uint8_t *));\ntypedef size_t (*l2_footer_fn)(size_t, uint8_t *);\ntypedef bool (*l2_rx_fn)(struct mg_tcpip_if *, enum mg_l2proto *, struct mg_str *, struct mg_str *);\ntypedef struct mg_l2addr (*(*l2_getaddr_fn)(uint8_t *));\ntypedef struct mg_l2addr (*(*l2_mapip_fn)(enum mg_l2addrtype, struct mg_addr *));\n#if MG_ENABLE_IPV6\ntypedef bool (*l2_genip6_fn)(uint64_t *, uint8_t, struct mg_l2addr *);\ntypedef bool (*l2_ip6get_fn)(struct mg_l2addr *, uint8_t *, uint8_t);\ntypedef uint8_t (*l2_ip6put_fn)(struct mg_l2addr *, uint8_t *);\n#endif\n// clang-format on\n\nstatic const l2_init_fn l2_init[] = {mg_l2_eth_init, mg_l2_ppp_init};\nstatic const l2_header_fn l2_header[] = {mg_l2_eth_header, mg_l2_ppp_header};\nstatic const l2_footer_fn l2_footer[] = {mg_l2_eth_footer, mg_l2_ppp_footer};\nstatic const l2_rx_fn l2_rx[] = {mg_l2_eth_rx, mg_l2_ppp_rx};\nstatic const l2_getaddr_fn l2_getaddr[] = {mg_l2_eth_getaddr,\n                                           mg_l2_ppp_getaddr};\nstatic const l2_mapip_fn l2_mapip[] = {mg_l2_eth_mapip, mg_l2_ppp_mapip};\n#if MG_ENABLE_IPV6\nstatic const l2_genip6_fn l2_genip6[] = {mg_l2_eth_genip6, mg_l2_ppp_genip6};\nstatic const l2_ip6get_fn l2_ip6get[] = {mg_l2_eth_ip6get, mg_l2_ppp_ip6get};\nstatic const l2_ip6put_fn l2_ip6put[] = {mg_l2_eth_ip6put, mg_l2_ppp_ip6put};\n#endif\n\nvoid mg_l2_init(enum mg_l2type type, uint8_t *addr, uint16_t *mtu,\n                uint16_t *framesize) {\n  l2_init[type]((struct mg_l2addr *) addr, mtu, framesize);\n}\n\nuint8_t *mg_l2_header(enum mg_l2type type, enum mg_l2proto proto, uint8_t *src,\n                      uint8_t *dst, uint8_t *frame) {\n  return l2_header[type](proto, (struct mg_l2addr *) src,\n                         (struct mg_l2addr *) dst, frame);\n}\n\nsize_t mg_l2_footer(enum mg_l2type type, size_t len, uint8_t *frame) {\n  return l2_footer[type](len, frame);\n}\n\nbool mg_l2_rx(struct mg_tcpip_if *ifp, enum mg_l2proto *proto,\n              struct mg_str *pay, struct mg_str *raw) {\n  return l2_rx[ifp->l2type](ifp, proto, pay, raw);\n}\n\nuint8_t *mg_l2_getaddr(enum mg_l2type type, uint8_t *frame) {\n  return (uint8_t *) l2_getaddr[type](frame);\n}\n\nstruct mg_l2addr s_mapip;\n\nuint8_t *mg_l2_mapip(enum mg_l2type type, enum mg_l2addrtype addrtype,\n                     struct mg_addr *ip) {\n  return (uint8_t *) l2_mapip[type](addrtype, ip);\n}\n\n#if MG_ENABLE_IPV6\nbool mg_l2_genip6(enum mg_l2type type, uint64_t *ip6, uint8_t prefix_len,\n                  uint8_t *addr) {\n  return l2_genip6[type](ip6, prefix_len, (struct mg_l2addr *) addr);\n}\n\nbool mg_l2_ip6get(enum mg_l2type type, uint8_t *addr, uint8_t *opts,\n                  uint8_t len) {\n  return l2_ip6get[type]((struct mg_l2addr *) addr, opts, len);\n}\nuint8_t mg_l2_ip6put(enum mg_l2type type, uint8_t *addr, uint8_t *opts) {\n  return l2_ip6put[type]((struct mg_l2addr *) addr, opts);\n}\n#endif\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/l2_eth.c\"\n#endif\n\n\n\n\n\n\n\n#if MG_ENABLE_TCPIP\n\n#if defined(__DCC__)\n#pragma pack(1)\n#else\n#pragma pack(push, 1)\n#endif\n\nstruct eth {\n  uint8_t dst[6];  // Destination MAC address\n  uint8_t src[6];  // Source MAC address\n  uint16_t type;   // Ethernet type\n};\n\n#if defined(__DCC__)\n#pragma pack(0)\n#else\n#pragma pack(pop)\n#endif\n\nstatic const uint16_t eth_types[] = {\n    // order is vital, see l2.h\n    0x800,   // IPv4\n    0x86dd,  // IPv6\n    0x806,   // ARP\n    0x8863,  // PPPoE Discovery Stage\n    0x8864   // PPPoE Session Stage\n};\n\nvoid mg_l2_eth_init(struct mg_l2addr *l2addr, uint16_t *mtu,\n                    uint16_t *framesize) {\n  // If MAC is not set, make a random one\n  if (l2addr->addr.mac[0] == 0 && l2addr->addr.mac[1] == 0 &&\n      l2addr->addr.mac[2] == 0 && l2addr->addr.mac[3] == 0 &&\n      l2addr->addr.mac[4] == 0 && l2addr->addr.mac[5] == 0) {\n    l2addr->addr.mac[0] = 0x02;  // Locally administered, unicast\n    mg_random(&l2addr->addr.mac[1], sizeof(l2addr->addr.mac) - 1);\n    MG_INFO(\n        (\"MAC not set. Generated random: %M\", mg_print_mac, l2addr->addr.mac));\n  }\n  *mtu = 1500;\n  *framesize = 1540;\n}\n\nuint8_t *mg_l2_eth_header(enum mg_l2proto proto, struct mg_l2addr *src,\n                          struct mg_l2addr *dst, uint8_t *frame) {\n  struct eth *eth = (struct eth *) frame;\n  eth->type = mg_htons(eth_types[(unsigned int) proto]);\n  memcpy(eth->src, src->addr.mac, sizeof(eth->dst));\n  memcpy(eth->dst, dst->addr.mac, sizeof(eth->dst));\n  return (uint8_t *) (eth + 1);\n}\n\nsize_t mg_l2_eth_footer(size_t len, uint8_t *frame) {\n  struct eth *eth = (struct eth *) frame;\n  // nothing to do; there is no len field in Ethernet, CRC is hw-calculated\n  return len + sizeof(*eth);\n}\n\nstruct mg_l2addr *mg_l2_eth_mapip(enum mg_l2addrtype addrtype,\n                                  struct mg_addr *addr);\n\nbool mg_l2_eth_rx(struct mg_tcpip_if *ifp, enum mg_l2proto *proto,\n                  struct mg_str *pay, struct mg_str *raw) {\n  struct eth *eth = (struct eth *) raw->buf;\n  uint16_t type, len;\n  unsigned int i;\n  if (raw->len < sizeof(*eth)) return false;  // Truncated - runt?\n  len = (uint16_t) raw->len;\n  if (ifp->enable_mac_check &&\n      memcmp(eth->dst, ifp->mac, sizeof(eth->dst)) != 0 &&\n      memcmp(eth->dst, mg_l2_eth_mapip(MG_TCPIP_L2ADDR_BCAST, NULL),\n             sizeof(eth->dst)) != 0)\n    return false;  // TODO(): add multicast addresses\n  if (ifp->enable_crc32_check && len > sizeof(*eth) + 4) {\n    uint32_t crc;\n    len -= 4;  // TODO(scaprile): check on bigendian\n    crc = mg_crc32(0, (const char *) raw->buf, len);\n    if (memcmp((void *) ((size_t) raw->buf + len), &crc, sizeof(crc)))\n      return false;\n  }\n  pay->buf = (char *) (eth + 1);\n  pay->len = len - sizeof(*eth);\n\n  type = mg_htons(eth->type);\n  for (i = 0; i < sizeof(eth_types) / sizeof(uint16_t); i++) {\n    if (type == eth_types[i]) break;\n  }\n  if (i == sizeof(eth_types)) {\n    MG_DEBUG((\"Unknown eth type %x\", type));\n    if (mg_log_level >= MG_LL_VERBOSE)\n      mg_hexdump(raw->buf, raw->len >= 32 ? 32 : raw->len);\n    return false;\n  }\n  *proto = (enum mg_l2proto) i;\n  return true;\n}\n\nstruct mg_l2addr *mg_l2_eth_getaddr(uint8_t *frame) {\n  struct eth *eth = (struct eth *) frame;\n  return (struct mg_l2addr *) &eth->src;\n}\n\nextern struct mg_l2addr s_mapip;\n\nstruct mg_l2addr *mg_l2_eth_mapip(enum mg_l2addrtype addrtype,\n                                  struct mg_addr *addr) {\n  switch (addrtype) {\n    case MG_TCPIP_L2ADDR_BCAST:\n      memset(s_mapip.addr.mac, 0xff, sizeof(s_mapip.addr.mac));\n      break;\n    case MG_TCPIP_L2ADDR_MCAST: {\n      uint8_t *ip = (uint8_t *) &addr->addr.ip4;\n      // IP multicast group MAC, RFC-1112 6.4\n      s_mapip.addr.mac[0] = 0x01, s_mapip.addr.mac[1] = 0x00,\n      s_mapip.addr.mac[2] = 0x5E;\n      s_mapip.addr.mac[3] = ip[1] & 0x7F;  // 23 LSb\n      s_mapip.addr.mac[4] = ip[2];\n      s_mapip.addr.mac[5] = ip[3];\n      break;\n    }\n    case MG_TCPIP_L2ADDR_MCAST6: {\n      // IPv6 multicast address mapping, RFC-2464 7\n      uint8_t *ip = (uint8_t *) &addr->addr.ip6;\n      s_mapip.addr.mac[0] = 0x33, s_mapip.addr.mac[1] = 0x33;\n      s_mapip.addr.mac[2] = ip[12], s_mapip.addr.mac[3] = ip[13],\n      s_mapip.addr.mac[4] = ip[14], s_mapip.addr.mac[5] = ip[15];\n      break;\n    }\n  }\n  return &s_mapip;\n}\n\n#if MG_ENABLE_IPV6\nstatic void meui64(uint8_t *addr, uint8_t *mac) {\n  *addr++ = *mac++ ^ (uint8_t) 0x02, *addr++ = *mac++, *addr++ = *mac++;\n  *addr++ = 0xff, *addr++ = 0xfe;\n  *addr++ = *mac++, *addr++ = *mac++, *addr = *mac;\n}\n\nbool mg_l2_eth_genip6(uint64_t *ip6, uint8_t prefix_len,\n                      struct mg_l2addr *l2addr) {\n  if (prefix_len > 64) {\n    MG_ERROR((\"Prefix length > 64, UNSUPPORTED\"));\n    return false;\n  }\n  ip6[0] = 0;\n  meui64(((uint8_t *) &ip6[1]), l2addr->addr.mac);  // RFC-4291 2.5.4, 2.5.1\n  return true;\n}\n\nbool mg_l2_eth_ip6get(struct mg_l2addr *l2addr, uint8_t *opts, uint8_t len) {\n  if (len != 1) return false;\n  memcpy(l2addr->addr.mac, opts, 6);\n  return true;\n}\n\nuint8_t mg_l2_eth_ip6put(struct mg_l2addr *l2addr, uint8_t *opts) {\n  memcpy(opts, l2addr->addr.mac, 6);\n  return 1;\n}\n#endif\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/l2_ppp.c\"\n#endif\n\n\n\n\n\n\n\n#if MG_ENABLE_TCPIP\n\n#if defined(__DCC__)\n#pragma pack(1)\n#else\n#pragma pack(push, 1)\n#endif\n\nstruct ppp {  // RFC-1662\n  uint8_t addr, ctrl;\n  uint16_t proto;\n};\n\nstruct lcp {  // RFC-1661\n  uint8_t code, id, len[2];\n};\n\nstruct ipcp { // RFC-1332\n  uint8_t code;\n};\n\nstruct ipv6cp { // RFC-5072\n  uint8_t code;\n};\n\n#if defined(__DCC__)\n#pragma pack(0)\n#else\n#pragma pack(pop)\n#endif\n\n\nvoid mg_l2_ppp_init(struct mg_l2addr *addr, uint16_t *mtu,\n                    uint16_t *framesize) {\n  (void) addr;\n  *mtu = 1500;        // 1492 for PPPoE\n  *framesize = 1540;  // *** TODO(scaprile): actual value, check for PPPoE too\n}\n\nuint8_t *mg_l2_ppp_header(enum mg_l2proto proto, struct mg_l2addr *src,\n                          struct mg_l2addr *dst, uint8_t *frame) {\n  (void) src;\n  (void) dst;\n  (void) proto;\n  return frame;\n}\n\nsize_t mg_l2_ppp_footer(size_t len, uint8_t *frame) {\n  (void) frame;\n  return len;\n}\n\nbool mg_l2_ppp_rx(struct mg_tcpip_if *ifp, enum mg_l2proto *proto,\n                  struct mg_str *pay, struct mg_str *raw) {\n#if 0\nif (ppp->addr == MG_PPP_ADDR && ppp->ctrl == MG_PPP_CTRL) {\n  code = ntohs(ppp->proto);\n  payload = (uint8_t *) (ppp + 1);\n} else { // Address-and-Control-Field-Compressed PPP header\n  uint16_t *cppp = (uint16_t *) ppp;\n  code = ntohs(*cppp);\n  payload = (uint8_t *) (cppp + 1);\n}\n#endif\n  *pay = *raw;\n  *proto = MG_TCPIP_L2PROTO_IPV4;\n  (void) ifp;\n  return true;\n}\n\nstruct mg_l2addr *mg_l2_ppp_getaddr(uint8_t *frame) {\n  (void) frame;\n  return &s_mapip;  // bogus\n}\n\nextern struct mg_l2addr s_mapip;\n\nstruct mg_l2addr *mg_l2_ppp_mapip(enum mg_l2addrtype addrtype,\n                                  struct mg_addr *addr) {\n  (void) addrtype;\n  (void) addr;\n  return &s_mapip;  // bogus\n}\n\n#if MG_ENABLE_IPV6\nbool mg_l2_ppp_genip6(uint64_t *ip6, uint8_t prefix_len,\n                      struct mg_l2addr *addr) {\n  (void) ip6;\n  (void) prefix_len;\n  (void) addr;\n  return false;\n}\n\nbool mg_l2_ppp_ip6get(struct mg_l2addr *addr, uint8_t *opts, uint8_t len) {\n  (void) addr;\n  (void) opts;\n  (void) len;\n  return false;\n}\n\nuint8_t mg_l2_ppp_ip6put(struct mg_l2addr *addr, uint8_t *opts) {\n  (void) addr;\n  (void) opts;\n  return 0;\n}\n#endif\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/log.c\"\n#endif\n\n\n\n\n\nint mg_log_level = MG_LL_DEBUG;\nstatic mg_pfn_t s_log_func = mg_pfn_stdout;\nstatic void *s_log_func_param = NULL;\n\nvoid mg_log_set_fn(mg_pfn_t fn, void *param) {\n  s_log_func = fn;\n  s_log_func_param = param;\n}\n\nstatic void logc(unsigned char c) {\n  s_log_func((char) c, s_log_func_param);\n}\n\nstatic void logs(const char *buf, size_t len) {\n  size_t i;\n  for (i = 0; i < len; i++) logc(((unsigned char *) buf)[i]);\n}\n\n#if MG_ENABLE_CUSTOM_LOG\n// Let user define their own mg_log_prefix() and mg_log()\n#else\nvoid mg_log_prefix(int level, const char *file, int line, const char *fname) {\n  const char *p = strrchr(file, '/');\n  char buf[41];\n  size_t n;\n  if (p == NULL) p = strrchr(file, '\\\\');\n  n = mg_snprintf(buf, sizeof(buf), \"%-6llx %d %s:%d:%s\", mg_millis(), level,\n                  p == NULL ? file : p + 1, line, fname);\n  if (n > sizeof(buf) - 2) n = sizeof(buf) - 2;\n  while (n < sizeof(buf)) buf[n++] = ' ';\n  logs(buf, n - 1);\n}\n\nvoid mg_log(const char *fmt, ...) {\n  va_list ap;\n  va_start(ap, fmt);\n  mg_vxprintf(s_log_func, s_log_func_param, fmt, &ap);\n  va_end(ap);\n  logs(\"\\r\\n\", 2);\n}\n#endif\n\nstatic unsigned char nibble(unsigned c) {\n  return (unsigned char) (c < 10 ? c + '0' : c + 'W');\n}\n\n#define ISPRINT(x) ((x) >= ' ' && (x) <= '~')\nvoid mg_hexdump(const void *buf, size_t len) {\n  const unsigned char *p = (const unsigned char *) buf;\n  unsigned char ascii[16], alen = 0;\n  size_t i;\n  for (i = 0; i < len; i++) {\n    if ((i % 16) == 0) {\n      // Print buffered ascii chars\n      if (i > 0)\n        logs(\"  \", 2), logs((char *) ascii, 16), logs(\"\\r\\n\", 2), alen = 0;\n      // Print hex address, then \\t\n      logc(nibble((i >> 12) & 15)), logc(nibble((i >> 8) & 15)),\n          logc(nibble((i >> 4) & 15)), logc('0'), logs(\"   \", 3);\n    }\n    logc(nibble(p[i] >> 4)), logc(nibble(p[i] & 15));  // Two nibbles, e.g. c5\n    logc(' ');                                         // Space after hex number\n    ascii[alen++] = ISPRINT(p[i]) ? p[i] : '.';        // Add to the ascii buf\n  }\n  while (alen < 16) logs(\"   \", 3), ascii[alen++] = ' ';\n  logs(\"  \", 2), logs((char *) ascii, 16), logs(\"\\r\\n\", 2);\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/md5.c\"\n#endif\n\n\n\n//  This code implements the MD5 message-digest algorithm.\n//  The algorithm is due to Ron Rivest.  This code was\n//  written by Colin Plumb in 1993, no copyright is claimed.\n//  This code is in the public domain; do with it what you wish.\n//\n//  Equivalent code is available from RSA Data Security, Inc.\n//  This code has been tested against that, and is equivalent,\n//  except that you don't need to include two pages of legalese\n//  with every copy.\n//\n//  To compute the message digest of a chunk of bytes, declare an\n//  MD5Context structure, pass it to MD5Init, call MD5Update as\n//  needed on buffers full of bytes, and then call MD5Final, which\n//  will fill a supplied 16-byte array with the digest.\n\n#if defined(MG_ENABLE_MD5) && MG_ENABLE_MD5\n\nstatic void mg_byte_reverse(unsigned char *buf, unsigned longs) {\n  if (MG_BIG_ENDIAN) {\n    do {\n      uint32_t t = (uint32_t) ((unsigned) buf[3] << 8 | buf[2]) << 16 |\n                   ((unsigned) buf[1] << 8 | buf[0]);\n      *(uint32_t *) buf = t;\n      buf += 4;\n    } while (--longs);\n  } else {\n    (void) buf, (void) longs;  // Little endian. Do nothing\n  }\n}\n\n#define F1(x, y, z) (z ^ (x & (y ^ z)))\n#define F2(x, y, z) F1(z, x, y)\n#define F3(x, y, z) (x ^ y ^ z)\n#define F4(x, y, z) (y ^ (x | ~z))\n\n#define MD5STEP(f, w, x, y, z, data, s) \\\n  (w += f(x, y, z) + data, w = w << s | w >> (32 - s), w += x)\n\n/*\n * Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious\n * initialization constants.\n */\nvoid mg_md5_init(mg_md5_ctx *ctx) {\n  ctx->buf[0] = 0x67452301;\n  ctx->buf[1] = 0xefcdab89;\n  ctx->buf[2] = 0x98badcfe;\n  ctx->buf[3] = 0x10325476;\n\n  ctx->bits[0] = 0;\n  ctx->bits[1] = 0;\n}\n\nstatic void mg_md5_transform(uint32_t buf[4], uint32_t const in[16]) {\n  uint32_t a, b, c, d;\n\n  a = buf[0];\n  b = buf[1];\n  c = buf[2];\n  d = buf[3];\n\n  MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);\n  MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);\n  MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);\n  MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);\n  MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);\n  MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);\n  MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);\n  MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);\n  MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);\n  MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);\n  MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);\n  MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);\n  MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);\n  MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);\n  MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);\n  MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);\n\n  MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);\n  MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);\n  MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);\n  MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);\n  MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);\n  MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);\n  MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);\n  MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);\n  MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);\n  MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);\n  MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);\n  MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);\n  MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);\n  MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);\n  MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);\n  MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);\n\n  MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);\n  MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);\n  MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);\n  MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);\n  MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);\n  MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);\n  MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);\n  MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);\n  MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);\n  MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);\n  MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);\n  MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);\n  MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);\n  MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);\n  MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);\n  MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);\n\n  MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);\n  MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);\n  MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);\n  MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);\n  MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);\n  MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);\n  MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);\n  MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);\n  MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);\n  MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);\n  MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);\n  MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);\n  MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);\n  MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);\n  MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);\n  MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);\n\n  buf[0] += a;\n  buf[1] += b;\n  buf[2] += c;\n  buf[3] += d;\n}\n\nvoid mg_md5_update(mg_md5_ctx *ctx, const unsigned char *buf, size_t len) {\n  uint32_t t;\n\n  t = ctx->bits[0];\n  if ((ctx->bits[0] = t + ((uint32_t) len << 3)) < t) ctx->bits[1]++;\n  ctx->bits[1] += (uint32_t) len >> 29;\n\n  t = (t >> 3) & 0x3f;\n\n  if (t) {\n    unsigned char *p = (unsigned char *) ctx->in + t;\n\n    t = 64 - t;\n    if (len < t) {\n      memcpy(p, buf, len);\n      return;\n    }\n    memcpy(p, buf, t);\n    mg_byte_reverse(ctx->in, 16);\n    mg_md5_transform(ctx->buf, (uint32_t *) ctx->in);\n    buf += t;\n    len -= t;\n  }\n\n  while (len >= 64) {\n    memcpy(ctx->in, buf, 64);\n    mg_byte_reverse(ctx->in, 16);\n    mg_md5_transform(ctx->buf, (uint32_t *) ctx->in);\n    buf += 64;\n    len -= 64;\n  }\n\n  memcpy(ctx->in, buf, len);\n}\n\nvoid mg_md5_final(mg_md5_ctx *ctx, unsigned char digest[16]) {\n  unsigned count;\n  unsigned char *p;\n  uint32_t *a;\n\n  count = (ctx->bits[0] >> 3) & 0x3F;\n\n  p = ctx->in + count;\n  *p++ = 0x80;\n  count = 64 - 1 - count;\n  if (count < 8) {\n    memset(p, 0, count);\n    mg_byte_reverse(ctx->in, 16);\n    mg_md5_transform(ctx->buf, (uint32_t *) ctx->in);\n    memset(ctx->in, 0, 56);\n  } else {\n    memset(p, 0, count - 8);\n  }\n  mg_byte_reverse(ctx->in, 14);\n\n  a = (uint32_t *) ctx->in;\n  a[14] = ctx->bits[0];\n  a[15] = ctx->bits[1];\n\n  mg_md5_transform(ctx->buf, (uint32_t *) ctx->in);\n  mg_byte_reverse((unsigned char *) ctx->buf, 4);\n  memcpy(digest, ctx->buf, 16);\n  memset((char *) ctx, 0, sizeof(*ctx));\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/mqtt.c\"\n#endif\n\n\n\n\n\n\n\n\n#define MQTT_CLEAN_SESSION 0x02\n#define MQTT_HAS_WILL 0x04\n#define MQTT_WILL_RETAIN 0x20\n#define MQTT_HAS_PASSWORD 0x40\n#define MQTT_HAS_USER_NAME 0x80\n\nstruct mg_mqtt_pmap {\n  uint8_t id;\n  uint8_t type;\n};\n\nstatic const struct mg_mqtt_pmap s_prop_map[] = {\n    {MQTT_PROP_PAYLOAD_FORMAT_INDICATOR, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_MESSAGE_EXPIRY_INTERVAL, MQTT_PROP_TYPE_INT},\n    {MQTT_PROP_CONTENT_TYPE, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_RESPONSE_TOPIC, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_CORRELATION_DATA, MQTT_PROP_TYPE_BINARY_DATA},\n    {MQTT_PROP_SUBSCRIPTION_IDENTIFIER, MQTT_PROP_TYPE_VARIABLE_INT},\n    {MQTT_PROP_SESSION_EXPIRY_INTERVAL, MQTT_PROP_TYPE_INT},\n    {MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_SERVER_KEEP_ALIVE, MQTT_PROP_TYPE_SHORT},\n    {MQTT_PROP_AUTHENTICATION_METHOD, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_AUTHENTICATION_DATA, MQTT_PROP_TYPE_BINARY_DATA},\n    {MQTT_PROP_REQUEST_PROBLEM_INFORMATION, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_WILL_DELAY_INTERVAL, MQTT_PROP_TYPE_INT},\n    {MQTT_PROP_REQUEST_RESPONSE_INFORMATION, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_RESPONSE_INFORMATION, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_SERVER_REFERENCE, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_REASON_STRING, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_RECEIVE_MAXIMUM, MQTT_PROP_TYPE_SHORT},\n    {MQTT_PROP_TOPIC_ALIAS_MAXIMUM, MQTT_PROP_TYPE_SHORT},\n    {MQTT_PROP_TOPIC_ALIAS, MQTT_PROP_TYPE_SHORT},\n    {MQTT_PROP_MAXIMUM_QOS, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_RETAIN_AVAILABLE, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_USER_PROPERTY, MQTT_PROP_TYPE_STRING_PAIR},\n    {MQTT_PROP_MAXIMUM_PACKET_SIZE, MQTT_PROP_TYPE_INT},\n    {MQTT_PROP_WILDCARD_SUBSCRIPTION_AVAILABLE, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_SUBSCRIPTION_IDENTIFIER_AVAILABLE, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_SHARED_SUBSCRIPTION_AVAILABLE, MQTT_PROP_TYPE_BYTE}};\n\nstatic bool mqtt_send_header(struct mg_connection *c, uint8_t cmd,\n                             uint8_t flags, uint32_t len) {\n  uint8_t buf[1 + sizeof(len)], *vlen = &buf[1];\n  buf[0] = (uint8_t) ((cmd << 4) | flags);\n  do {\n    *vlen = len % 0x80;\n    len /= 0x80;\n    if (len > 0) *vlen |= 0x80;\n    vlen++;\n  } while (len > 0 && vlen < &buf[sizeof(buf)]);\n  return mg_send(c, buf, (size_t) (vlen - buf));\n}\n\nvoid mg_mqtt_send_header(struct mg_connection *c, uint8_t cmd, uint8_t flags,\n                         uint32_t len) {\n  if (!mqtt_send_header(c, cmd, flags, len)) mg_error(c, \"OOM\");\n}\n\nstatic bool mg_send_u16(struct mg_connection *c, uint16_t value) {\n  return mg_send(c, &value, sizeof(value));\n}\n\nstatic bool mg_send_u32(struct mg_connection *c, uint32_t value) {\n  return mg_send(c, &value, sizeof(value));\n}\n\nstatic uint8_t varint_size(size_t length) {\n  uint8_t bytes_needed = 0;\n  do {\n    bytes_needed++;\n    length /= 0x80;\n  } while (length > 0);\n  return bytes_needed;\n}\n\nstatic size_t encode_varint(uint8_t *buf, size_t value) {\n  size_t len = 0;\n\n  do {\n    uint8_t b = (uint8_t) (value % 128);\n    value /= 128;\n    if (value > 0) b |= 0x80;\n    buf[len++] = b;\n  } while (value > 0);\n\n  return len;\n}\n\nstatic size_t decode_varint(const uint8_t *buf, size_t len, size_t *value) {\n  size_t multiplier = 1, offset;\n  *value = 0;\n\n  for (offset = 0; offset < 4 && offset < len; offset++) {\n    uint8_t encoded_byte = buf[offset];\n    *value += (encoded_byte & 0x7f) * multiplier;\n    multiplier *= 128;\n\n    if ((encoded_byte & 0x80) == 0) return offset + 1;\n  }\n\n  return 0;\n}\n\nstatic int mqtt_prop_type_by_id(uint8_t prop_id) {\n  size_t i, num_properties = sizeof(s_prop_map) / sizeof(s_prop_map[0]);\n  for (i = 0; i < num_properties; ++i) {\n    if (s_prop_map[i].id == prop_id) return s_prop_map[i].type;\n  }\n  return -1;  // Property ID not found\n}\n\n// Returns the size of the properties section, without the\n// size of the content's length\nstatic size_t get_properties_length(struct mg_mqtt_prop *props, size_t count) {\n  size_t i, size = 0;\n  for (i = 0; i < count; i++) {\n    size++;  // identifier\n    switch (mqtt_prop_type_by_id(props[i].id)) {\n      case MQTT_PROP_TYPE_STRING_PAIR:\n        size += (uint32_t) (props[i].val.len + props[i].key.len +\n                            2 * sizeof(uint16_t));\n        break;\n      case MQTT_PROP_TYPE_STRING:\n        size += (uint32_t) (props[i].val.len + sizeof(uint16_t));\n        break;\n      case MQTT_PROP_TYPE_BINARY_DATA:\n        size += (uint32_t) (props[i].val.len + sizeof(uint16_t));\n        break;\n      case MQTT_PROP_TYPE_VARIABLE_INT:\n        size += varint_size((uint32_t) props[i].iv);\n        break;\n      case MQTT_PROP_TYPE_INT: size += (uint32_t) sizeof(uint32_t); break;\n      case MQTT_PROP_TYPE_SHORT: size += (uint32_t) sizeof(uint16_t); break;\n      case MQTT_PROP_TYPE_BYTE: size += (uint32_t) sizeof(uint8_t); break;\n      default: return size;  // cannot parse further down\n    }\n  }\n\n  return size;\n}\n\n// returns the entire size of the properties section, including the\n// size of the variable length of the content\nstatic size_t get_props_size(struct mg_mqtt_prop *props, size_t count) {\n  size_t size = get_properties_length(props, count);\n  size += varint_size(size);\n  return size;\n}\n\nstatic bool mg_send_mqtt_properties(struct mg_connection *c,\n                                    struct mg_mqtt_prop *props, size_t nprops) {\n  size_t total_size = get_properties_length(props, nprops);\n  uint8_t buf_v[4] = {0, 0, 0, 0};\n  uint8_t buf[4] = {0, 0, 0, 0};\n  size_t i, len = encode_varint(buf, total_size);\n\n  if (!mg_send(c, buf, (size_t) len)) return false;\n  for (i = 0; i < nprops; i++) {\n    if (!mg_send(c, &props[i].id, sizeof(props[i].id))) return false;\n    switch (mqtt_prop_type_by_id(props[i].id)) {\n      case MQTT_PROP_TYPE_STRING_PAIR:\n        if (!mg_send_u16(c, mg_htons((uint16_t) props[i].key.len)) ||\n            !mg_send(c, props[i].key.buf, props[i].key.len) ||\n            !mg_send_u16(c, mg_htons((uint16_t) props[i].val.len)) ||\n            !mg_send(c, props[i].val.buf, props[i].val.len))\n          return false;\n        break;\n      case MQTT_PROP_TYPE_BYTE:\n        if (!mg_send(c, &props[i].iv, sizeof(uint8_t))) return false;\n        break;\n      case MQTT_PROP_TYPE_SHORT:\n        if (!mg_send_u16(c, mg_htons((uint16_t) props[i].iv))) return false;\n        break;\n      case MQTT_PROP_TYPE_INT:\n        if (!mg_send_u32(c, mg_htonl((uint32_t) props[i].iv))) return false;\n        break;\n      case MQTT_PROP_TYPE_STRING:\n        if (!mg_send_u16(c, mg_htons((uint16_t) props[i].val.len)) ||\n            !mg_send(c, props[i].val.buf, props[i].val.len))\n          return false;\n        break;\n      case MQTT_PROP_TYPE_BINARY_DATA:\n        if (!mg_send_u16(c, mg_htons((uint16_t) props[i].val.len)) ||\n            !mg_send(c, props[i].val.buf, props[i].val.len))\n          return false;\n        break;\n      case MQTT_PROP_TYPE_VARIABLE_INT:\n        len = encode_varint(buf_v, props[i].iv);\n        if (!mg_send(c, buf_v, (size_t) len)) return false;\n        break;\n    }\n  }\n  return true;\n}\n\nsize_t mg_mqtt_next_prop(struct mg_mqtt_message *msg, struct mg_mqtt_prop *prop,\n                         size_t ofs) {\n  uint8_t *i = (uint8_t *) msg->dgram.buf + msg->props_start + ofs;\n  uint8_t *end = (uint8_t *) msg->dgram.buf + msg->dgram.len;\n  size_t new_pos = ofs, len;\n\n  if (ofs >= msg->dgram.len || ofs >= msg->props_start + msg->props_size || (i + 1) >= end)\n    return 0;\n\n  memset(prop, 0, sizeof(struct mg_mqtt_prop));\n  prop->id = i[0];\n  i++, new_pos++;\n\n  switch (mqtt_prop_type_by_id(prop->id)) {\n    case MQTT_PROP_TYPE_STRING_PAIR:\n      if (i + 2 >= end) return 0;\n      prop->key.len = (uint16_t) ((((uint16_t) i[0]) << 8) | i[1]);\n      prop->key.buf = (char *) i + 2;\n      i += 2 + prop->key.len;\n      if (i + 2 >= end) return 0;\n      prop->val.len = (uint16_t) ((((uint16_t) i[0]) << 8) | i[1]);\n      prop->val.buf = (char *) i + 2;\n      if (i + 2 + prop->val.len >= end) return 0;\n      new_pos += 2 * sizeof(uint16_t) + prop->val.len + prop->key.len;\n      break;\n    case MQTT_PROP_TYPE_BYTE:\n      if (i + 1 >= end) return 0;\n      prop->iv = (uint8_t) i[0];\n      new_pos++;\n      break;\n    case MQTT_PROP_TYPE_SHORT:\n      if (i + 2 >= end) return 0;\n      prop->iv = (uint16_t) ((((uint16_t) i[0]) << 8) | i[1]);\n      new_pos += sizeof(uint16_t);\n      break;\n    case MQTT_PROP_TYPE_INT:\n      if (i + 4 >= end) return 0;\n      prop->iv = ((uint32_t) i[0] << 24) | ((uint32_t) i[1] << 16) |\n                 ((uint32_t) i[2] << 8) | i[3];\n      new_pos += sizeof(uint32_t);\n      break;\n    case MQTT_PROP_TYPE_STRING:\n      if (i + 2 >= end) return 0;\n      prop->val.len = (uint16_t) ((((uint16_t) i[0]) << 8) | i[1]);\n      prop->val.buf = (char *) i + 2;\n      if (i + 2 + prop->val.len >= end) return 0;\n      new_pos += 2 + prop->val.len;\n      break;\n    case MQTT_PROP_TYPE_BINARY_DATA:\n      if (i + 2 >= end) return 0;\n      prop->val.len = (uint16_t) ((((uint16_t) i[0]) << 8) | i[1]);\n      prop->val.buf = (char *) i + 2;\n      if (i + 2 + prop->val.len >= end) return 0;\n      new_pos += 2 + prop->val.len;\n      break;\n    case MQTT_PROP_TYPE_VARIABLE_INT:\n      len = decode_varint(i, (size_t) (end - i), (size_t *) &prop->iv);\n      if (i + len >= end) return 0;\n      new_pos = (len == 0) ? 0 : new_pos + len;\n      break;\n    default:\n      new_pos = 0;\n      break;\n  }\n\n  return new_pos;\n}\n\nvoid mg_mqtt_login(struct mg_connection *c, const struct mg_mqtt_opts *opts) {\n  char client_id[21];\n  struct mg_str cid = opts->client_id;\n  size_t total_len = 7 + 1 + 2 + 2;\n  uint8_t hdr[8] = {0, 4, 'M', 'Q', 'T', 'T', 0, 0};\n  hdr[6] = opts->version;\n\n  if (cid.len == 0) {\n    mg_random_str(client_id, sizeof(client_id) - 1);\n    client_id[sizeof(client_id) - 1] = '\\0';\n    cid = mg_str(client_id);\n  }\n\n  if (hdr[6] == 0) hdr[6] = 4;  // If version is not set, use 4 (3.1.1)\n  c->is_mqtt5 = hdr[6] == 5;    // Set version 5 flag\n  hdr[7] = (uint8_t) ((opts->qos & 3) << 3);  // Connection flags\n  if (opts->user.len > 0) {\n    total_len += 2 + (uint32_t) opts->user.len;\n    hdr[7] |= MQTT_HAS_USER_NAME;\n  }\n  if (opts->pass.len > 0) {\n    total_len += 2 + (uint32_t) opts->pass.len;\n    hdr[7] |= MQTT_HAS_PASSWORD;\n  }\n  if (opts->topic.len > 0) {  // allow zero-length msgs, message.len is size_t\n    total_len += 4 + (uint32_t) opts->topic.len + (uint32_t) opts->message.len;\n    hdr[7] |= MQTT_HAS_WILL;\n  }\n  if (opts->clean || cid.len == 0) hdr[7] |= MQTT_CLEAN_SESSION;\n  if (opts->retain) hdr[7] |= MQTT_WILL_RETAIN;\n  total_len += (uint32_t) cid.len;\n  if (c->is_mqtt5) {\n    total_len += get_props_size(opts->props, opts->num_props);\n    if (hdr[7] & MQTT_HAS_WILL)\n      total_len += get_props_size(opts->will_props, opts->num_will_props);\n  }\n\n  // keepalive == 0 means \"do not disconnect us!\"\n  if (!mqtt_send_header(c, MQTT_CMD_CONNECT, 0, (uint32_t) total_len) ||\n      !mg_send(c, hdr, sizeof(hdr)) ||\n      !mg_send_u16(c, mg_htons((uint16_t) opts->keepalive)))\n    goto fail;\n\n  if (c->is_mqtt5 && !mg_send_mqtt_properties(c, opts->props, opts->num_props))\n    goto fail;\n\n  if (!mg_send_u16(c, mg_htons((uint16_t) cid.len)) ||\n      !mg_send(c, cid.buf, cid.len))\n    goto fail;\n\n  if (hdr[7] & MQTT_HAS_WILL) {\n    if (c->is_mqtt5 &&\n        !mg_send_mqtt_properties(c, opts->will_props, opts->num_will_props))\n      goto fail;\n\n    if (!mg_send_u16(c, mg_htons((uint16_t) opts->topic.len)) ||\n        !mg_send(c, opts->topic.buf, opts->topic.len) ||\n        !mg_send_u16(c, mg_htons((uint16_t) opts->message.len)) ||\n        !mg_send(c, opts->message.buf, opts->message.len))\n      goto fail;\n  }\n  if (opts->user.len > 0 &&\n      (!mg_send_u16(c, mg_htons((uint16_t) opts->user.len)) ||\n       !mg_send(c, opts->user.buf, opts->user.len)))\n    goto fail;\n  if (opts->pass.len > 0 &&\n      (!mg_send_u16(c, mg_htons((uint16_t) opts->pass.len)) ||\n       !mg_send(c, opts->pass.buf, opts->pass.len)))\n    goto fail;\n  return;\nfail:\n  mg_error(c, \"OOM\");\n}\n\nuint16_t mg_mqtt_pub(struct mg_connection *c, const struct mg_mqtt_opts *opts) {\n  uint16_t id = opts->retransmit_id;\n  uint8_t flags = (uint8_t) (((opts->qos & 3) << 1) | (opts->retain ? 1 : 0));\n  size_t len = 2 + opts->topic.len + opts->message.len;\n  MG_DEBUG((\"%lu [%.*s] <- [%.*s%c\", c->id, (int) opts->topic.len,\n            (char *) opts->topic.buf,\n            (int) (opts->message.len <= 10 ? opts->message.len : 10),\n            (char *) opts->message.buf, opts->message.len <= 10 ? ']' : ' '));\n  if (opts->qos > 0) len += 2;\n  if (c->is_mqtt5) len += get_props_size(opts->props, opts->num_props);\n\n  if (opts->qos > 0 && id != 0) flags |= 1 << 3;\n  if (!mqtt_send_header(c, MQTT_CMD_PUBLISH, flags, (uint32_t) len) ||\n      !mg_send_u16(c, mg_htons((uint16_t) opts->topic.len)) ||\n      !mg_send(c, opts->topic.buf, opts->topic.len))\n    goto fail;\n  if (opts->qos > 0) {  // need to send 'id' field\n    if (id == 0) {      // generate new one if not resending\n      if (++c->mgr->mqtt_id == 0) ++c->mgr->mqtt_id;\n      id = c->mgr->mqtt_id;\n    }\n    if (!mg_send_u16(c, mg_htons(id))) goto fail;\n  }\n\n  if (c->is_mqtt5 && !mg_send_mqtt_properties(c, opts->props, opts->num_props))\n    goto fail;\n\n  if (opts->message.len > 0 &&\n      !mg_send(c, opts->message.buf, opts->message.len))\n    goto fail;\n  return id;\n\nfail:\n  mg_error(c, \"OOM\");\n  return id;\n}\n\nstatic void mg_mqtt_sub_unsub(struct mg_connection *c,\n                              const struct mg_mqtt_opts *opts, uint8_t cmd) {\n  uint8_t qos_ = opts->qos & 3;\n  bool is_sub = cmd == MQTT_CMD_SUBSCRIBE;\n  size_t plen = c->is_mqtt5 ? get_props_size(opts->props, opts->num_props) : 0;\n  size_t len = 2 + opts->topic.len + 2 + (is_sub ? 1 : 0) + plen;\n\n  if (!mqtt_send_header(c, cmd, 2, (uint32_t) len)) goto fail;\n  if (++c->mgr->mqtt_id == 0) ++c->mgr->mqtt_id;\n  if (!mg_send_u16(c, mg_htons(c->mgr->mqtt_id))) goto fail;\n\n  if (c->is_mqtt5 && !mg_send_mqtt_properties(c, opts->props, opts->num_props))\n    goto fail;\n\n  if (!mg_send_u16(c, mg_htons((uint16_t) opts->topic.len)) ||\n      !mg_send(c, opts->topic.buf, opts->topic.len))\n    goto fail;\n  if (is_sub && !mg_send(c, &qos_, sizeof(qos_))) goto fail;\n  return;\nfail:\n  mg_error(c, \"OOM\");\n}\n\nvoid mg_mqtt_sub(struct mg_connection *c, const struct mg_mqtt_opts *opts) {\n  mg_mqtt_sub_unsub(c, opts, MQTT_CMD_SUBSCRIBE);\n}\n\nvoid mg_mqtt_unsub(struct mg_connection *c, const struct mg_mqtt_opts *opts) {\n  mg_mqtt_sub_unsub(c, opts, MQTT_CMD_UNSUBSCRIBE);\n}\n\nint mg_mqtt_parse(const uint8_t *buf, size_t len, uint8_t version,\n                  struct mg_mqtt_message *m) {\n  uint8_t lc = 0, *p, *end;\n  uint32_t n = 0, len_len = 0;\n\n  memset(m, 0, sizeof(*m));\n  m->dgram.buf = (char *) buf;\n  if (len < 2) return MQTT_INCOMPLETE;\n  m->cmd = (uint8_t) (buf[0] >> 4);\n  m->qos = (buf[0] >> 1) & 3;\n\n  n = len_len = 0;\n  p = (uint8_t *) buf + 1;\n  while ((size_t) (p - buf) < len) {\n    lc = *((uint8_t *) p++);\n    n += (uint32_t) ((lc & 0x7f) << 7 * len_len);\n    len_len++;\n    if (!(lc & 0x80)) break;\n    if (len_len >= 4) return MQTT_MALFORMED;\n  }\n  end = p + n;\n  if ((lc & 0x80) || (end > buf + len)) return MQTT_INCOMPLETE;\n  m->dgram.len = (size_t) (end - buf);\n\n  switch (m->cmd) {\n    case MQTT_CMD_CONNACK:\n      if (end - p < 2) return MQTT_MALFORMED;\n      m->ack = p[1];\n      break;\n    case MQTT_CMD_PUBACK:\n    case MQTT_CMD_PUBREC:\n    case MQTT_CMD_PUBREL:\n    case MQTT_CMD_PUBCOMP:\n    case MQTT_CMD_SUBSCRIBE:\n    case MQTT_CMD_SUBACK:\n    case MQTT_CMD_UNSUBSCRIBE:\n    case MQTT_CMD_UNSUBACK:\n      if (p + 2 > end) return MQTT_MALFORMED;\n      m->id = (uint16_t) ((((uint16_t) p[0]) << 8) | p[1]);\n      p += 2;\n      break;\n    case MQTT_CMD_PUBLISH: {\n      if (p + 2 > end) return MQTT_MALFORMED;\n      m->topic.len = (uint16_t) ((((uint16_t) p[0]) << 8) | p[1]);\n      m->topic.buf = (char *) p + 2;\n      p += 2 + m->topic.len;\n      if (p > end) return MQTT_MALFORMED;\n      if (m->qos > 0) {\n        if (p + 2 > end) return MQTT_MALFORMED;\n        m->id = (uint16_t) ((((uint16_t) p[0]) << 8) | p[1]);\n        p += 2;\n      }\n      if (p > end) return MQTT_MALFORMED;\n      if (version == 5 && p + 2 < end) {\n        len_len =\n            (uint32_t) decode_varint(p, (size_t) (end - p), &m->props_size);\n        if (!len_len) return MQTT_MALFORMED;\n        m->props_start = (size_t) (p + len_len - buf);\n        p += len_len + m->props_size;\n      }\n      if (p > end) return MQTT_MALFORMED;\n      m->data.buf = (char *) p;\n      m->data.len = (size_t) (end - p);\n      break;\n    }\n    default: break;\n  }\n  return MQTT_OK;\n}\n\nstatic void mqtt_cb(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_READ) {\n    for (;;) {\n      uint8_t version = c->is_mqtt5 ? 5 : 4;\n      struct mg_mqtt_message mm;\n      int rc = mg_mqtt_parse(c->recv.buf, c->recv.len, version, &mm);\n      if (rc == MQTT_MALFORMED) {\n        MG_ERROR((\"%lu MQTT malformed message\", c->id));\n        c->is_closing = 1;\n        break;\n      } else if (rc == MQTT_OK) {\n        MG_VERBOSE((\"%lu MQTT CMD %d len %d [%.*s]\", c->id, mm.cmd,\n                    (int) mm.dgram.len, (int) mm.data.len, mm.data.buf));\n        switch (mm.cmd) {\n          case MQTT_CMD_CONNACK:\n            mg_call(c, MG_EV_MQTT_OPEN, &mm.ack);\n            if (mm.ack == 0) {\n              MG_DEBUG((\"%lu Connected\", c->id));\n            } else {\n              MG_ERROR((\"%lu MQTT auth failed, code %d\", c->id, mm.ack));\n              c->is_closing = 1;\n            }\n            break;\n          case MQTT_CMD_PUBLISH: {\n            MG_DEBUG((\"%lu [%.*s] -> [%.*s%c\", c->id, (int) mm.topic.len,\n                      mm.topic.buf,\n                      (int) (mm.data.len <= 10 ? mm.data.len : 10), mm.data.buf,\n                      mm.data.len <= 10 ? ']' : ' '));\n            if (mm.qos > 0) {\n              uint16_t id = mg_ntohs(mm.id);\n              uint32_t remaining_len = sizeof(id);\n              if (c->is_mqtt5) remaining_len += 2;  // 3.4.2\n\n              if (!mqtt_send_header(c,\n                                    (uint8_t) (mm.qos == 2 ? MQTT_CMD_PUBREC\n                                                           : MQTT_CMD_PUBACK),\n                                    0, remaining_len) ||\n                  !mg_send(c, &id, sizeof(id)))\n                goto fail;\n\n              if (c->is_mqtt5) {\n                uint16_t zero = 0;\n                if (!mg_send(c, &zero, sizeof(zero))) goto fail;\n              }\n            }\n            mg_call(c, MG_EV_MQTT_MSG, &mm);  // let the app handle qos stuff\n            break;\n          }\n          case MQTT_CMD_PUBREC: {  // MQTT5: 3.5.2-1 TODO(): variable header rc\n            uint16_t id = mg_ntohs(mm.id);\n            uint32_t remaining_len = sizeof(id);  // MQTT5 3.6.2-1\n            if (!mqtt_send_header(c, MQTT_CMD_PUBREL, 2,\n                                  remaining_len)  // MQTT5 3.6.1-1, flags = 2\n                || !mg_send(c, &id, sizeof(id)))\n              goto fail;\n            break;\n          }\n          case MQTT_CMD_PUBREL: {  // MQTT5: 3.6.2-1 TODO(): variable header rc\n            uint16_t id = mg_ntohs(mm.id);\n            uint32_t remaining_len = sizeof(id);  // MQTT5 3.7.2-1\n            if (!mqtt_send_header(c, MQTT_CMD_PUBCOMP, 0, remaining_len) ||\n                !mg_send(c, &id, sizeof(id)))\n              goto fail;\n            break;\n          }\n        }\n        mg_call(c, MG_EV_MQTT_CMD, &mm);\n        mg_iobuf_del(&c->recv, 0, mm.dgram.len);\n      } else {\n        break;\n      }\n    }\n  }\n  (void) ev_data;\n  return;\nfail:\n  mg_error(c, \"OOM\");\n}\n\nvoid mg_mqtt_ping(struct mg_connection *nc) {\n  mg_mqtt_send_header(nc, MQTT_CMD_PINGREQ, 0, 0);\n}\n\nvoid mg_mqtt_pong(struct mg_connection *nc) {\n  mg_mqtt_send_header(nc, MQTT_CMD_PINGRESP, 0, 0);\n}\n\nvoid mg_mqtt_disconnect(struct mg_connection *c,\n                        const struct mg_mqtt_opts *opts) {\n  size_t len = 0;\n  if (c->is_mqtt5) len = 1 + get_props_size(opts->props, opts->num_props);\n  if (!mqtt_send_header(c, MQTT_CMD_DISCONNECT, 0, (uint32_t) len)) goto fail;\n\n  if (c->is_mqtt5) {\n    uint8_t zero = 0;\n    if (!mg_send(c, &zero, sizeof(zero))  // reason code\n        || !mg_send_mqtt_properties(c, opts->props, opts->num_props))\n      goto fail;\n  }\n  return;\nfail:\n  mg_error(c, \"OOM\");\n}\n\nstruct mg_connection *mg_mqtt_connect(struct mg_mgr *mgr, const char *url,\n                                      const struct mg_mqtt_opts *opts,\n                                      mg_event_handler_t fn, void *fn_data) {\n  struct mg_connection *c =\n      mg_connect_svc(mgr, url, fn, fn_data, mqtt_cb, NULL);\n  if (c != NULL) {\n    struct mg_mqtt_opts empty;\n    memset(&empty, 0, sizeof(empty));\n    mg_mqtt_login(c, opts == NULL ? &empty : opts);\n  }\n  return c;\n}\n\nstruct mg_connection *mg_mqtt_listen(struct mg_mgr *mgr, const char *url,\n                                     mg_event_handler_t fn, void *fn_data) {\n  struct mg_connection *c = mg_listen(mgr, url, fn, fn_data);\n  if (c != NULL) c->pfn = mqtt_cb, c->pfn_data = mgr;\n  return c;\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/net.c\"\n#endif\n\n\n\n\n\n\n\n\n\nsize_t mg_vprintf(struct mg_connection *c, const char *fmt, va_list *ap) {\n  size_t old = c->send.len;\n  size_t expected = mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, ap);\n  size_t actual = c->send.len - old;\n  if (actual != expected) {\n    mg_error(c, \"OOM\");\n    c->send.len = old;\n    actual = 0;\n  }\n  return actual;\n}\n\nsize_t mg_printf(struct mg_connection *c, const char *fmt, ...) {\n  size_t len = 0;\n  va_list ap;\n  va_start(ap, fmt);\n  len = mg_vprintf(c, fmt, &ap);\n  va_end(ap);\n  return len;\n}\n\nstatic bool mg_atonl(struct mg_str str, struct mg_addr *addr) {\n  uint32_t localhost = mg_htonl(0x7f000001);\n  if (mg_strcasecmp(str, mg_str(\"localhost\")) != 0) return false;\n  memcpy(addr->addr.ip, &localhost, sizeof(uint32_t));\n  addr->is_ip6 = false;\n  return true;\n}\n\nstatic bool mg_atone(struct mg_str str, struct mg_addr *addr) {\n  if (str.len > 0) return false;\n  memset(addr->addr.ip, 0, sizeof(addr->addr.ip));\n  addr->is_ip6 = false;\n  return true;\n}\n\nstatic bool mg_aton4(struct mg_str str, struct mg_addr *addr) {\n  uint8_t data[4] = {0, 0, 0, 0};\n  size_t i, num_dots = 0;\n  for (i = 0; i < str.len; i++) {\n    if (str.buf[i] >= '0' && str.buf[i] <= '9') {\n      int octet = data[num_dots] * 10 + (str.buf[i] - '0');\n      if (octet > 255) return false;\n      data[num_dots] = (uint8_t) octet;\n    } else if (str.buf[i] == '.') {\n      if (num_dots >= 3 || i == 0 || str.buf[i - 1] == '.') return false;\n      num_dots++;\n    } else {\n      return false;\n    }\n  }\n  if (num_dots != 3 || str.buf[i - 1] == '.') return false;\n  memcpy(&addr->addr.ip, data, sizeof(data));\n  addr->is_ip6 = false;\n  return true;\n}\n\nstatic bool mg_v4mapped(struct mg_str str, struct mg_addr *addr) {\n  int i;\n  uint32_t ipv4;\n  if (str.len < 14) return false;\n  if (str.buf[0] != ':' || str.buf[1] != ':' || str.buf[6] != ':') return false;\n  for (i = 2; i < 6; i++) {\n    if (str.buf[i] != 'f' && str.buf[i] != 'F') return false;\n  }\n  // struct mg_str s = mg_str_n(&str.buf[7], str.len - 7);\n  if (!mg_aton4(mg_str_n(&str.buf[7], str.len - 7), addr)) return false;\n  memcpy(&ipv4, addr->addr.ip, sizeof(ipv4));\n  memset(addr->addr.ip, 0, sizeof(addr->addr.ip));\n  addr->addr.ip[10] = addr->addr.ip[11] = 255;\n  memcpy(&addr->addr.ip[12], &ipv4, 4);\n  addr->is_ip6 = true;\n  return true;\n}\n\nstatic bool mg_aton6(struct mg_str str, struct mg_addr *addr) {\n  size_t i, j = 0, n = 0, dc = 42;\n  addr->scope_id = 0;\n  if (str.len > 2 && str.buf[0] == '[') str.buf++, str.len -= 2;\n  if (mg_v4mapped(str, addr)) return true;  // sets addr->is_ip6\n  for (i = 0; i < str.len; i++) {\n    if ((str.buf[i] >= '0' && str.buf[i] <= '9') ||\n        (str.buf[i] >= 'a' && str.buf[i] <= 'f') ||\n        (str.buf[i] >= 'A' && str.buf[i] <= 'F')) {\n      unsigned long val = 0;  // TODO(): This loops on chars, refactor\n      if (i > j + 3) return false;\n      // MG_DEBUG((\"%lu %lu [%.*s]\", i, j, (int) (i - j + 1), &str.buf[j]));\n      mg_str_to_num(mg_str_n(&str.buf[j], i - j + 1), 16, &val, sizeof(val));\n      addr->addr.ip[n] = (uint8_t) ((val >> 8) & 255);\n      addr->addr.ip[n + 1] = (uint8_t) (val & 255);\n    } else if (str.buf[i] == ':') {\n      j = i + 1;\n      if (i > 0 && str.buf[i - 1] == ':') {\n        dc = n;  // Double colon\n        if (i > 1 && str.buf[i - 2] == ':') return false;\n      } else if (i > 0) {\n        n += 2;\n      }\n      if (n > 14) return false;\n      addr->addr.ip[n] = addr->addr.ip[n + 1] = 0;  // For trailing ::\n    } else if (str.buf[i] == '%') {                 // Scope ID, last in string\n      if (mg_str_to_num(mg_str_n(&str.buf[i + 1], str.len - i - 1), 10,\n                        &addr->scope_id, sizeof(uint8_t))) {\n        addr->is_ip6 = true;\n        return true;\n      } else {\n        return false;\n      }\n    } else {\n      return false;\n    }\n  }\n  if (n < 14 && dc == 42) return false;\n  if (n < 14) {\n    memmove(&addr->addr.ip[dc + (14 - n)], &addr->addr.ip[dc], n - dc + 2);\n    memset(&addr->addr.ip[dc], 0, 14 - n);\n  }\n\n  addr->is_ip6 = true;\n  return true;\n}\n\nbool mg_aton(struct mg_str str, struct mg_addr *addr) {\n  // MG_INFO((\"[%.*s]\", (int) str.len, str.buf));\n  return mg_atone(str, addr) || mg_atonl(str, addr) || mg_aton4(str, addr) ||\n         mg_aton6(str, addr);\n}\n\nstruct mg_connection *mg_alloc_conn(struct mg_mgr *mgr) {\n  struct mg_connection *c =\n      (struct mg_connection *) mg_calloc(1, sizeof(*c) + mgr->extraconnsize);\n  if (c != NULL) {\n    c->mgr = mgr;\n    c->send.align = c->recv.align = c->rtls.align = MG_IO_SIZE;\n    c->id = ++mgr->nextid;\n    MG_PROF_INIT(c);\n  }\n  return c;\n}\n\nvoid mg_close_conn(struct mg_connection *c) {\n  mg_resolve_cancel(c);  // Close any pending DNS query\n  LIST_DELETE(struct mg_connection, &c->mgr->conns, c);\n  if (c == c->mgr->dns4.c) c->mgr->dns4.c = NULL;\n  if (c == c->mgr->dns6.c) c->mgr->dns6.c = NULL;\n  // Order of operations is important. `MG_EV_CLOSE` event must be fired\n  // before we deallocate received data, see #1331\n  mg_call(c, MG_EV_CLOSE, NULL);\n  MG_DEBUG((\"%lu %ld closed\", c->id, c->fd));\n  MG_PROF_DUMP(c);\n  MG_PROF_FREE(c);\n\n  mg_tls_free(c);\n  mg_iobuf_free(&c->recv);\n  mg_iobuf_free(&c->send);\n  mg_iobuf_free(&c->rtls);\n  mg_bzero((unsigned char *) c, sizeof(*c));\n  mg_free(c);\n}\n\nstruct mg_connection *mg_connect_svc(struct mg_mgr *mgr, const char *url,\n                                     mg_event_handler_t fn, void *fn_data,\n                                     mg_event_handler_t pfn, void *pfn_data) {\n  struct mg_connection *c = NULL;\n  if (url == NULL || url[0] == '\\0') {\n    MG_ERROR((\"null url\"));\n#if MG_ENABLE_TCPIP\n  } else if (mgr->ifp != NULL && mgr->ifp->state != MG_TCPIP_STATE_READY) {\n    MG_ERROR((\"Network is down\"));\n#endif\n  } else if ((c = mg_alloc_conn(mgr)) == NULL) {\n    MG_ERROR((\"OOM\"));\n  } else {\n    LIST_ADD_HEAD(struct mg_connection, &mgr->conns, c);\n    c->is_udp = (strncmp(url, \"udp:\", 4) == 0);\n    c->fd = (void *) (size_t) MG_INVALID_SOCKET;\n    c->fn = fn;\n    c->is_client = true;\n    c->fn_data = fn_data;\n    c->is_tls = (mg_url_is_ssl(url) != 0);\n    c->pfn = pfn;\n    c->pfn_data = pfn_data;\n    mg_call(c, MG_EV_OPEN, (void *) url);\n    MG_DEBUG((\"%lu %ld %s\", c->id, c->fd, url));\n    mg_resolve(c, url);\n  }\n  return c;\n}\n\nstruct mg_connection *mg_connect(struct mg_mgr *mgr, const char *url,\n                                 mg_event_handler_t fn, void *fn_data) {\n  return mg_connect_svc(mgr, url, fn, fn_data, NULL, NULL);\n}\n\nstruct mg_connection *mg_listen(struct mg_mgr *mgr, const char *url,\n                                mg_event_handler_t fn, void *fn_data) {\n  struct mg_connection *c = NULL;\n  if ((c = mg_alloc_conn(mgr)) == NULL) {\n    MG_ERROR((\"OOM %s\", url));\n  } else if (!mg_open_listener(c, url)) {\n    MG_ERROR((\"Failed: %s\", url));\n    MG_PROF_FREE(c);\n    mg_free(c);\n    c = NULL;\n  } else {\n    c->is_listening = 1;\n    c->is_udp = strncmp(url, \"udp:\", 4) == 0;\n    LIST_ADD_HEAD(struct mg_connection, &mgr->conns, c);\n    c->fn = fn;\n    c->fn_data = fn_data;\n    c->is_tls = (mg_url_is_ssl(url) != 0);\n    mg_call(c, MG_EV_OPEN, NULL);\n    MG_DEBUG((\"%lu %ld %s\", c->id, c->fd, url));\n  }\n  return c;\n}\n\nstruct mg_connection *mg_wrapfd(struct mg_mgr *mgr, int fd,\n                                mg_event_handler_t fn, void *fn_data) {\n  struct mg_connection *c = mg_alloc_conn(mgr);\n  if (c != NULL) {\n    c->fd = (void *) (size_t) fd;\n    c->fn = fn;\n    c->fn_data = fn_data;\n    MG_EPOLL_ADD(c);\n    mg_call(c, MG_EV_OPEN, NULL);\n    LIST_ADD_HEAD(struct mg_connection, &mgr->conns, c);\n  }\n  return c;\n}\n\nstruct mg_timer *mg_timer_add(struct mg_mgr *mgr, uint64_t milliseconds,\n                              unsigned flags, void (*fn)(void *), void *arg) {\n  struct mg_timer *t = (struct mg_timer *) mg_calloc(1, sizeof(*t));\n  if (t != NULL) {\n    flags |= MG_TIMER_AUTODELETE;  // We have alloc'ed it, so autodelete\n    mg_timer_init(&mgr->timers, t, milliseconds, flags, fn, arg);\n  }\n  return t;\n}\n\nlong mg_io_recv(struct mg_connection *c, void *buf, size_t len) {\n  if (c->rtls.len == 0) return MG_IO_WAIT;\n  if (len > c->rtls.len) len = c->rtls.len;\n  memcpy(buf, c->rtls.buf, len);\n  mg_iobuf_del(&c->rtls, 0, len);\n  return (long) len;\n}\n\nvoid mg_mgr_free(struct mg_mgr *mgr) {\n  struct mg_connection *c;\n  struct mg_timer *tmp, *t = mgr->timers;\n  while (t != NULL) tmp = t->next, mg_free(t), t = tmp;\n  mgr->timers = NULL;  // Important. Next call to poll won't touch timers\n  for (c = mgr->conns; c != NULL; c = c->next) c->is_closing = 1;\n  mg_mgr_poll(mgr, 0);\n#if MG_ENABLE_FREERTOS_TCP\n  FreeRTOS_DeleteSocketSet(mgr->ss);\n#endif\n  MG_DEBUG((\"All connections closed\"));\n#if MG_ENABLE_EPOLL\n  if (mgr->epoll_fd >= 0) close(mgr->epoll_fd), mgr->epoll_fd = -1;\n#endif\n  mg_tls_ctx_free(mgr);\n#if MG_ENABLE_TCPIP\n  if (mgr->ifp) mg_tcpip_free(mgr->ifp);\n#endif\n}\n\nvoid mg_mgr_init(struct mg_mgr *mgr) {\n  memset(mgr, 0, sizeof(*mgr));\n#if MG_ENABLE_EPOLL\n  if ((mgr->epoll_fd = epoll_create1(EPOLL_CLOEXEC)) < 0)\n    MG_ERROR((\"epoll_create1 errno %d\", errno));\n#else\n  mgr->epoll_fd = -1;\n#endif\n#if MG_ARCH == MG_ARCH_WIN32 && MG_ENABLE_WINSOCK\n  // clang-format off\n  { WSADATA data; WSAStartup(MAKEWORD(2, 2), &data); }\n  // clang-format on\n#elif MG_ENABLE_FREERTOS_TCP\n  mgr->ss = FreeRTOS_CreateSocketSet();\n#elif MG_ARCH == MG_ARCH_UNIX\n  // Ignore SIGPIPE signal, so if client cancels the request, it\n  // won't kill the whole process.\n  signal(SIGPIPE, SIG_IGN);\n#elif MG_ENABLE_TCPIP_DRIVER_INIT && defined(MG_TCPIP_DRIVER_INIT)\n  MG_TCPIP_DRIVER_INIT(mgr);\n#endif\n  mgr->pipe = MG_INVALID_SOCKET;\n  mgr->dnstimeout = 3000;\n  mgr->dns4.url = \"udp://8.8.8.8:53\";\n  mgr->dns6.url = \"udp://[2001:4860:4860::8888]:53\";\n  mg_tls_ctx_init(mgr);\n  MG_DEBUG((\"MG_IO_SIZE: %lu, TLS: %s\", MG_IO_SIZE,\n            MG_TLS == MG_TLS_NONE      ? \"none\"\n            : MG_TLS == MG_TLS_MBED    ? \"MbedTLS\"\n            : MG_TLS == MG_TLS_OPENSSL ? \"OpenSSL\"\n            : MG_TLS == MG_TLS_BUILTIN ? \"builtin\"\n            : MG_TLS == MG_TLS_WOLFSSL ? \"WolfSSL\"\n                                       : \"custom\"));\n}\n\n#if MG_ENABLE_TCPIP\nvoid mg_tcpip_mapip(struct mg_connection *, struct mg_addr *);\n#endif\nvoid mg_multicast_restore(struct mg_connection *c, uint8_t *from) {\n  memcpy(&c->rem, from, sizeof(c->rem));\n#if MG_ENABLE_TCPIP\n  mg_tcpip_mapip(c, &c->rem);\n#endif\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/net_builtin.c\"\n#endif\n\n\n\n#if MG_ENABLE_TCPIP\n#define MG_EPHEMERAL_PORT_BASE 32768\n#define PDIFF(a, b) ((size_t) (((char *) (b)) - ((char *) (a))))\n\n#ifndef MG_TCPIP_KEEPALIVE_MS\n#define MG_TCPIP_KEEPALIVE_MS 45000  // TCP keep-alive period, ms\n#endif\n\n#define MG_TCPIP_ACK_MS 150    // Timeout for ACKing\n#define MG_TCPIP_ARP_MS 100    // Timeout for ARP response\n#define MG_TCPIP_SYN_MS 15000  // Timeout for connection establishment\n#define MG_TCPIP_FIN_MS 1000   // Timeout for closing connection\n\n#ifndef MG_TCPIP_WIN\n#define MG_TCPIP_WIN 6000  // TCP window size\n#endif\n\nstruct connstate {\n  uint32_t seq, ack;                      // TCP seq/ack counters\n  uint64_t timer;                         // TCP timer (see 'ttype' below)\n  uint32_t acked;                         // Last ACK-ed number\n  size_t unacked;                         // Not acked bytes\n  uint16_t dmss;                          // destination MSS (from TCP opts)\n  uint8_t mac[sizeof(struct mg_l2addr)];  // Peer hw address\n  uint8_t ttype;                          // Timer type:\n#define MIP_TTYPE_KEEPALIVE 0  // Connection is idle for long, send keepalive\n#define MIP_TTYPE_ACK 1        // Peer sent us data, we have to ack it soon\n#define MIP_TTYPE_ARP 2        // ARP resolve sent, waiting for response\n#define MIP_TTYPE_SYN 3        // SYN sent, waiting for response\n#define MIP_TTYPE_FIN 4  // FIN sent, waiting until terminating the connection\n  uint8_t tmiss;         // Number of keep-alive misses\n  struct mg_iobuf raw;   // For TLS only. Incoming raw data\n  bool fin_rcvd;         // We have received FIN from the peer\n  bool twclosure;        // 3-way closure done\n};\n\n#if defined(__DCC__)\n#pragma pack(1)\n#else\n#pragma pack(push, 1)\n#endif\n\nstruct ip {\n  uint8_t ver;    // Version\n  uint8_t tos;    // Unused\n  uint16_t len;   // Datagram length\n  uint16_t id;    // Unused\n  uint16_t frag;  // Fragmentation\n#define IP_FRAG_OFFSET_MSK 0x1fff\n#define IP_MORE_FRAGS_MSK 0x2000\n  uint8_t ttl;    // Time to live\n  uint8_t proto;  // Upper level protocol\n  uint16_t csum;  // Checksum\n  uint32_t src;   // Source IP\n  uint32_t dst;   // Destination IP\n};\n\nstruct ip6 {\n  uint8_t ver;       // Version\n  uint8_t label[3];  // Flow label\n  uint16_t plen;     // Payload length\n  uint8_t next;      // Upper level protocol\n  uint8_t hops;      // Hop limit\n  uint64_t src[2];   // Source IP\n  uint64_t dst[2];   // Destination IP\n};\n\nstruct icmp {\n  uint8_t type;\n  uint8_t code;\n  uint16_t csum;\n};\n\nstruct icmp6 {\n  uint8_t type;\n  uint8_t code;\n  uint16_t csum;\n};\n\nstruct ndp_na {\n  uint8_t res[4];    // R S O, reserved\n  uint64_t addr[2];  // Target address\n};\n\nstruct ndp_ra {\n  uint8_t cur_hop_limit;\n  uint8_t flags;  // M,O,Prf,Resvd\n  uint16_t router_lifetime;\n  uint32_t reachable_time;\n  uint32_t retrans_timer;\n};\n\nstruct arp {\n  uint16_t fmt;    // Format of hardware address\n  uint16_t pro;    // Format of protocol address\n  uint8_t hlen;    // Length of hardware address\n  uint8_t plen;    // Length of protocol address\n  uint16_t op;     // Operation\n  uint8_t sha[6];  // Sender hardware address\n  uint32_t spa;    // Sender protocol address\n  uint8_t tha[6];  // Target hardware address\n  uint32_t tpa;    // Target protocol address\n};\n\nstruct tcp {\n  uint16_t sport;  // Source port\n  uint16_t dport;  // Destination port\n  uint32_t seq;    // Sequence number\n  uint32_t ack;    // Acknowledgement number\n  uint8_t off;     // Data offset\n  uint8_t flags;   // TCP flags\n#define TH_FIN 0x01\n#define TH_SYN 0x02\n#define TH_RST 0x04\n#define TH_PUSH 0x08\n#define TH_ACK 0x10\n#define TH_URG 0x20\n#define TH_STDFLAGS 0x3f\n  // #define TH_ECE 0x40 // not part of TCP but RFC-3168 (ECN)\n  // #define TH_CWR 0x80\n  uint16_t win;   // Window\n  uint16_t csum;  // Checksum\n  uint16_t urp;   // Urgent pointer\n};\n\nstruct udp {\n  uint16_t sport;  // Source port\n  uint16_t dport;  // Destination port\n  uint16_t len;    // UDP length\n  uint16_t csum;   // UDP checksum\n};\n\nstruct dhcp {\n  uint8_t op, htype, hlen, hops;\n  uint32_t xid;\n  uint16_t secs, flags;\n  uint32_t ciaddr, yiaddr, siaddr, giaddr;\n  uint8_t hwaddr[208];\n  uint32_t magic;\n  uint8_t options[30 + sizeof(((struct mg_tcpip_if *) 0)->dhcp_name)];\n};\n\nstruct dhcp6 {\n  union {\n    uint8_t type;\n    uint32_t xid;\n  };\n  uint8_t options[30 + sizeof(((struct mg_tcpip_if *) 0)->dhcp_name)];\n};\n\nstruct pseudoip {\n  uint32_t src;  // Source IP\n  uint32_t dst;  // Destination IP\n  uint8_t zero;\n  uint8_t proto;  // Upper level protocol\n  uint16_t len;   // Datagram length\n};\n\nstruct pseudoip6 {\n  uint64_t src[2];  // Source IP\n  uint64_t dst[2];  // Destination IP\n  uint32_t plen;    // Payload length\n  uint8_t zero[3];\n  uint8_t next;  // Upper level protocol\n};\n\n#if defined(__DCC__)\n#pragma pack(0)\n#else\n#pragma pack(pop)\n#endif\n\n// pkt is 8-bit aligned, pointers to headers hint compilers to generate\n// byte-copy code for micros with alignment constraints\nstruct pkt {\n  struct mg_str raw;  // Raw packet data\n  struct mg_str pay;  // Payload data\n  uint8_t *l2;        // Ethernet, PPP [, etc] frame data\n  struct arp *arp;\n  struct ip *ip;\n  struct ip6 *ip6;\n  struct icmp *icmp;\n  struct icmp6 *icmp6;\n  struct tcp *tcp;\n  struct udp *udp;\n  struct dhcp *dhcp;\n  struct dhcp6 *dhcp6;\n};\n\n// L2 API\nvoid mg_l2_init(enum mg_l2type type, uint8_t *addr, uint16_t *mtu,\n                uint16_t *framesize);\nuint8_t *mg_l2_header(enum mg_l2type type, enum mg_l2proto proto, uint8_t *src,\n                      uint8_t *dst, uint8_t *frame);\nsize_t mg_l2_footer(enum mg_l2type type, size_t len, uint8_t *frame);\nbool mg_l2_rx(struct mg_tcpip_if *ifp, enum mg_l2proto *proto,\n              struct mg_str *pay, struct mg_str *raw);\nuint8_t *mg_l2_getaddr(enum mg_l2type type, uint8_t *frame);\nuint8_t *mg_l2_mapip(enum mg_l2type type, enum mg_l2addrtype addrtype,\n                     struct mg_addr *ip);\n#if MG_ENABLE_IPV6\nbool mg_l2_genip6(enum mg_l2type type, uint64_t *ip6, uint8_t prefix_len,\n                  uint8_t *addr);\nbool mg_l2_ip6get(enum mg_l2type type, uint8_t *addr, uint8_t *opts,\n                  uint8_t len);\nuint8_t mg_l2_ip6put(enum mg_l2type type, uint8_t *addr, uint8_t *opts);\n#endif\n\nstatic void mg_tcpip_call(struct mg_tcpip_if *ifp, int ev, void *ev_data) {\n#if MG_ENABLE_PROFILE\n  const char *names[] = {\"TCPIP_EV_ST_CHG\",        \"TCPIP_EV_DHCP_DNS\",\n                         \"TCPIP_EV_DHCP_SNTP\",     \"TCPIP_EV_ARP\",\n                         \"TCPIP_EV_TIMER_1S\",      \"TCPIP_EV_WIFI_SCAN_RESULT\",\n                         \"TCPIP_EV_WIFI_SCAN_END\", \"TCPIP_EV_WIFI_CONNECT_ERR\",\n                         \"TCPIP_EV_DRIVER\",        \"TCPIP_EV_USER\"};\n  if (ev != MG_TCPIP_EV_POLL && ev < (int) (sizeof(names) / sizeof(names[0]))) {\n    MG_PROF_ADD(c, names[ev]);\n  }\n#endif\n  // Fire protocol handler first, user handler second. See #2559\n  if (ifp->pfn != NULL) ifp->pfn(ifp, ev, ev_data);\n  if (ifp->fn != NULL) ifp->fn(ifp, ev, ev_data);\n}\n\nstatic void send_syn(struct mg_connection *c);\n\nstatic void mkpay(struct pkt *pkt, void *p) {\n  pkt->pay =\n      mg_str_n((char *) p, (size_t) (&pkt->pay.buf[pkt->pay.len] - (char *) p));\n}\n\n// NOTE(): DOES NOT handle reentries after odd length, use last\nstatic uint32_t csumup(uint32_t sum, const void *buf, size_t len) {\n  size_t i;\n  const uint8_t *p = (const uint8_t *) buf;\n  for (i = 0; i < len; i++) sum += i & 1 ? p[i] : ((uint32_t) p[i]) << 8;\n  return sum;\n}\n\nstatic uint16_t csumfin(uint32_t sum) {\n  while (sum >> 16) sum = (sum & 0xffff) + (sum >> 16);\n  return mg_htons((uint16_t) ((uint16_t) ~sum & 0xffff));\n}\n\nstatic uint16_t ipcsum(const void *buf, size_t len) {\n  uint32_t sum = csumup(0, buf, len);\n  return csumfin(sum);\n}\n\nstatic bool ipcsum_ok(const void *d) {\n  struct ip *ip = (struct ip *) d;\n  return (ipcsum(d, (ip->ver & 0x0F) * 4) == 0);\n}\n\nstatic bool icmpcsum_ok(const void *d, size_t len) {\n  return (ipcsum(d, len) == 0);\n}\n\nstatic uint16_t pcsum(void *d, void *p, size_t plen) {\n  uint32_t sum;\n  struct ip *ip = (struct ip *) d;\n#if defined(__DCC__)\n  volatile  /* Makes PPC & Diab4.3 happy */\n#endif\n  struct pseudoip pip;\n  pip.src = ip->src;\n  pip.dst = ip->dst;\n  pip.zero = 0;\n  pip.proto = ip->proto;\n  pip.len = mg_htons((uint16_t) plen);\n  sum = csumup(0, &pip, sizeof(pip));  // even length\n  sum = csumup(sum, p, plen);          // possibly odd length: last\n  return csumfin(sum);\n}\n\nstatic bool udpcsum_ok(void *d, void *u) {\n  struct udp *udp = (struct udp *) u;\n  if (udp->csum == 0) return true;\n  if (udp->csum == 0xFFFF) udp->csum = 0;\n  return (pcsum(d, u, (size_t) mg_ntohs(udp->len)) == 0);\n}\n\nstatic bool tcpcsum_ok(void *d, void *t) {\n  struct ip *ip = (struct ip *) d;\n  return (pcsum(d, t, (size_t) (mg_ntohs(ip->len) - (ip->ver & 0x0F) * 4)) ==\n          0);\n}\n\n#if MG_ENABLE_IPV6\nstatic uint16_t p6csum(void *d, void *p, size_t plen) {\n  uint32_t sum;\n  struct ip6 *ip6 = (struct ip6 *) d;\n#if defined(__DCC__)\n  volatile  /* Makes PPC & Diab4.3 happy */\n#endif\n  struct pseudoip6 pip6;\n  pip6.src[0] = ip6->src[0], pip6.src[1] = ip6->src[1];\n  pip6.dst[0] = ip6->dst[0], pip6.dst[1] = ip6->dst[1];\n  pip6.zero[0] = 0, pip6.zero[1] = 0, pip6.zero[2] = 0;\n  pip6.plen = mg_htonl((uint32_t) plen);\n  pip6.next = ip6->next;\n  sum = csumup(0, &pip6, sizeof(pip6));  // even length\n  sum = csumup(sum, p, plen);            // possibly odd length: last\n  return csumfin(sum);\n}\n\nstatic bool udp6csum_ok(void *d, void *u) {\n  struct udp *udp = (struct udp *) u;\n  if (udp->csum == 0) return false;  // mandatory in IPv6\n  if (udp->csum == 0xFFFF) udp->csum = 0;\n  return (p6csum(d, u, (size_t) mg_ntohs(udp->len)) == 0);\n}\nstatic bool tcp6csum_ok(void *d, void *t) {\n  struct ip6 *ip6 = (struct ip6 *) d;\n  return (p6csum(d, t, (size_t) mg_ntohs(ip6->plen)) == 0);\n}\nstatic bool icmp6csum_ok(void *d, void *i) {\n  struct ip6 *ip6 = (struct ip6 *) d;\n  return (p6csum(d, i, (size_t) mg_ntohs(ip6->plen)) == 0);\n}\n\nstatic void ip6sn(uint64_t *addr, uint64_t *sn_addr) {\n  // Build solicited-node multicast address from a given unicast IP\n  // RFC-4291 2.7\n  uint8_t *sn = (uint8_t *) sn_addr;\n  memset(sn_addr, 0, 16);\n  sn[0] = 0xff;\n  sn[1] = 0x02;\n  sn[11] = 0x01;\n  sn[12] = 0xff;\n  sn[13] = ((uint8_t *) addr)[13];\n  sn[14] = ((uint8_t *) addr)[14];\n  sn[15] = ((uint8_t *) addr)[15];\n}\n\nstatic const struct mg_addr ip6_allrouters = {\n    {{0xFF, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x02}}, 0, 0, true};\nstatic const struct mg_addr ip6_allnodes = {\n    {{0xFF, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01}}, 0, 0, true};\n\n#define MG_IP6MATCH(a, b) (a[0] == b[0] && a[1] == b[1])\n#endif\n\nstatic void settmout(struct mg_connection *c, uint8_t type) {\n  struct mg_tcpip_if *ifp = c->mgr->ifp;\n  struct connstate *s = (struct connstate *) (c + 1);\n  unsigned n = type == MIP_TTYPE_ACK   ? MG_TCPIP_ACK_MS\n               : type == MIP_TTYPE_ARP ? MG_TCPIP_ARP_MS\n               : type == MIP_TTYPE_SYN ? MG_TCPIP_SYN_MS\n               : type == MIP_TTYPE_FIN ? MG_TCPIP_FIN_MS\n                                       : MG_TCPIP_KEEPALIVE_MS;\n  if (s->ttype == MIP_TTYPE_FIN) return;  // skip if 3-way closing\n  s->timer = ifp->now + n;\n  s->ttype = type;\n  MG_VERBOSE((\"%lu %d -> %llx\", c->id, type, s->timer));\n}\n\nstatic size_t driver_output(struct mg_tcpip_if *ifp, size_t len) {\n  size_t n = ifp->driver->tx(ifp->tx.buf, len, ifp);\n  if (n == len) ifp->nsent++;\n  return n;\n}\n\n// RFC826, ARP assumes Ethernet MAC addresses\nvoid mg_tcpip_arp_request(struct mg_tcpip_if *ifp, uint32_t ip, uint8_t *mac) {\n  uint8_t *l2p = (uint8_t *) ifp->tx.buf;\n  struct arp *arp = (struct arp *) mg_l2_header(\n      ifp->l2type, MG_TCPIP_L2PROTO_ARP, ifp->mac,\n      mg_l2_mapip(ifp->l2type, MG_TCPIP_L2ADDR_BCAST, NULL), l2p);\n  memset(arp, 0, sizeof(*arp));\n  arp->fmt = mg_htons(1), arp->pro = mg_htons(0x800), arp->hlen = 6,\n  arp->plen = 4;\n  arp->op = mg_htons(1), arp->tpa = ip, arp->spa = ifp->ip;\n  memcpy(arp->sha, ifp->mac, sizeof(arp->sha));\n  if (mac != NULL) memcpy(arp->tha, mac, sizeof(arp->tha));\n  driver_output(ifp, mg_l2_footer(ifp->l2type, PDIFF(l2p, arp + 1), l2p));\n}\n\nstatic void onstatechange(struct mg_tcpip_if *ifp) {\n  if (ifp->state == MG_TCPIP_STATE_READY) {\n    MG_INFO((\"READY, IP: %M\", mg_print_ip4, &ifp->ip));\n    MG_INFO((\"       GW: %M\", mg_print_ip4, &ifp->gw));\n    if (ifp->l2type == MG_TCPIP_L2_ETH)  // TODO(): print other l2\n      MG_INFO((\"      MAC: %M\", mg_print_mac, ifp->mac));\n  } else if (ifp->state == MG_TCPIP_STATE_IP) {\n    if (ifp->gw != 0)\n      mg_tcpip_arp_request(ifp, ifp->gw, NULL);  // unsolicited GW ARP request\n  } else if (ifp->state == MG_TCPIP_STATE_UP) {\n    srand((unsigned int) mg_millis());\n  } else if (ifp->state == MG_TCPIP_STATE_DOWN) {\n    MG_ERROR((\"Link down\"));\n  }\n  mg_tcpip_call(ifp, MG_TCPIP_EV_ST_CHG, &ifp->state);\n}\n\nstatic struct ip *tx_ip(struct mg_tcpip_if *ifp, uint8_t *l2_dst, uint8_t proto,\n                        uint32_t ip_src, uint32_t ip_dst, size_t plen) {\n  // ifp->tx.buf is 8-bit aligned, keep other headers as pointers, see pkt\n  uint8_t *l2p = (uint8_t *) ifp->tx.buf;\n  struct ip *ip = (struct ip *) mg_l2_header(ifp->l2type, MG_TCPIP_L2PROTO_IPV4,\n                                             ifp->mac, l2_dst, l2p);\n  memset(ip, 0, sizeof(*ip));\n  ip->ver = 0x45;               // Version 4, header length 5 words\n  ip->frag = mg_htons(0x4000);  // Don't fragment\n  ip->len = mg_htons((uint16_t) (sizeof(*ip) + plen));\n  ip->ttl = 64;\n  ip->proto = proto;\n  ip->src = ip_src;\n  ip->dst = ip_dst;\n  ip->csum = ipcsum(ip, sizeof(*ip));\n  return ip;\n}\n\n#if MG_ENABLE_IPV6\nstatic struct ip6 *tx_ip6(struct mg_tcpip_if *ifp, uint8_t *l2_dst,\n                          uint8_t next, uint64_t *ip_src, uint64_t *ip_dst,\n                          size_t plen);\n#endif\n\nstatic bool tx_udp(struct mg_tcpip_if *ifp, uint8_t *l2_dst,\n                   struct mg_addr *ip_src, struct mg_addr *ip_dst,\n                   const void *buf, size_t len) {\n  uint8_t *l2p = (uint8_t *) ifp->tx.buf;\n  size_t l2_len;\n  struct ip *ip = NULL;\n  struct udp *udp;\n#if MG_ENABLE_IPV6\n  struct ip6 *ip6 = NULL;\n  if (ip_dst->is_ip6) {\n    ip6 = tx_ip6(ifp, l2_dst, 17, ip_src->addr.ip6, ip_dst->addr.ip6,\n                 len + sizeof(struct udp));\n    udp = (struct udp *) (ip6 + 1);\n    l2_len = sizeof(*ip6) + sizeof(*udp) + len;\n  } else\n#endif\n  {\n    ip = tx_ip(ifp, l2_dst, 17, ip_src->addr.ip4, ip_dst->addr.ip4,\n               len + sizeof(struct udp));\n    udp = (struct udp *) (ip + 1);\n    l2_len = sizeof(*ip) + sizeof(*udp) + len;\n  }\n  udp->sport = ip_src->port;\n  udp->dport = ip_dst->port;\n  udp->len = mg_htons((uint16_t) (sizeof(*udp) + len));\n  udp->csum = 0;\n  memmove(udp + 1, buf, len);\n#if MG_ENABLE_IPV6\n  if (ip_dst->is_ip6) {\n    udp->csum = p6csum(ip6, udp, sizeof(*udp) + len);\n  } else\n#endif\n  {\n    udp->csum = pcsum(ip, udp, sizeof(*udp) + len);\n  }\n  l2_len = mg_l2_footer(ifp->l2type, l2_len, l2p);\n  return (driver_output(ifp, l2_len) == l2_len);\n}\n\nstatic bool tx_udp4(struct mg_tcpip_if *ifp, uint8_t *l2_dst, uint32_t ip_src,\n                    uint16_t sport, uint32_t ip_dst, uint16_t dport,\n                    const void *buf, size_t len) {\n  struct mg_addr ips, ipd;\n  memset(&ips, 0, sizeof(ips));\n  ips.addr.ip4 = ip_src;\n  ips.port = sport;\n  memset(&ipd, 0, sizeof(ipd));\n  ipd.addr.ip4 = ip_dst;\n  ipd.port = dport;\n  return tx_udp(ifp, l2_dst, &ips, &ipd, buf, len);\n}\n\nstatic void tx_dhcp(struct mg_tcpip_if *ifp, uint8_t *l2_dst, uint32_t ip_src,\n                    uint32_t ip_dst, uint8_t *opts, size_t optslen,\n                    bool ciaddr) {\n  // https://datatracker.ietf.org/doc/html/rfc2132#section-9.6\n  // NOTE(): assumes Ethernet: htype=1 hlen=6, copy 6 bytes\n  struct dhcp dhcp = {1, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, {0}, 0, {0}};\n  dhcp.magic = mg_htonl(0x63825363);\n  memcpy(&dhcp.hwaddr, ifp->mac, 6);\n  memcpy(&dhcp.xid, ifp->mac + 2, sizeof(dhcp.xid));\n  memcpy(&dhcp.options, opts, optslen);\n  if (ciaddr) dhcp.ciaddr = ip_src;\n  tx_udp4(ifp, l2_dst, ip_src, mg_htons(68), ip_dst, mg_htons(67), &dhcp,\n          sizeof(dhcp));\n}\n\n// RFC-2131 #4.3.6, #4.4.1; RFC-2132 #9.8\nstatic void tx_dhcp_request_sel(struct mg_tcpip_if *ifp, uint32_t ip_req,\n                                uint32_t ip_srv) {\n  uint8_t extra = (uint8_t) ((ifp->enable_req_dns ? 1 : 0) +\n                             (ifp->enable_req_sntp ? 1 : 0));\n  size_t len = strlen(ifp->dhcp_name);\n  size_t olen = 21 + len + extra + 2 + 1;  // Total length of options\n#define OPTS_MAXLEN (21 + sizeof(ifp->dhcp_name) + 2 + 2 + 1)\n  uint8_t opts[OPTS_MAXLEN];  // Allocate options (max size possible)\n  uint8_t *p = opts;\n  assert(olen <= sizeof(opts));\n  memset(opts, 0, sizeof(opts));\n  *p++ = 53, *p++ = 1, *p++ = 3;                       // Type: DHCP request\n  *p++ = 54, *p++ = 4, memcpy(p, &ip_srv, 4), p += 4;  // DHCP server ID\n  *p++ = 50, *p++ = 4, memcpy(p, &ip_req, 4), p += 4;  // Requested IP\n  *p++ = 12, *p++ = (uint8_t) (len & 255);             // DHCP host\n  memcpy(p, ifp->dhcp_name, len), p += len;            // name\n  *p++ = 55, *p++ = 2 + extra, *p++ = 1, *p++ = 3;     // GW, MASK\n  if (ifp->enable_req_dns) *p++ = 6;                   // DNS\n  if (ifp->enable_req_sntp) *p++ = 42;                 // SNTP\n  *p++ = 255;                                          // End of options\n  // assert((size_t) (p - opts) < olen);\n  tx_dhcp(ifp, mg_l2_mapip(ifp->l2type, MG_TCPIP_L2ADDR_BCAST, NULL), 0,\n          0xffffffff, opts, olen, 0);\n  MG_DEBUG((\"DHCP req sent\"));\n}\n\n// RFC-2131 #4.3.6, #4.4.5 (renewing: unicast, rebinding: bcast)\nstatic void tx_dhcp_request_re(struct mg_tcpip_if *ifp, uint8_t *l2_dst,\n                               uint32_t ip_src, uint32_t ip_dst) {\n  uint8_t opts[] = {\n      53, 1, 3,  // Type: DHCP request\n      255        // End of options\n  };\n  tx_dhcp(ifp, l2_dst, ip_src, ip_dst, opts, sizeof(opts), true);\n  MG_DEBUG((\"DHCP req sent\"));\n}\n\nstatic void tx_dhcp_discover(struct mg_tcpip_if *ifp) {\n  uint8_t opts[] = {\n      53, 1, 1,     // Type: DHCP discover\n      55, 2, 1, 3,  // Parameters: ip, mask\n      255           // End of options\n  };\n  tx_dhcp(ifp, mg_l2_mapip(ifp->l2type, MG_TCPIP_L2ADDR_BCAST, NULL), 0,\n          0xffffffff, opts, sizeof(opts), false);\n  MG_DEBUG((\"DHCP discover sent. Our MAC: %M\", mg_print_mac, ifp->mac));\n}\n\nstatic struct mg_connection *getpeer(struct mg_mgr *mgr, struct pkt *pkt,\n                                     bool lsn) {\n  struct mg_connection *c = NULL;\n  for (c = mgr->conns; c != NULL; c = c->next) {\n    if (c->is_arplooking && pkt->arp && pkt->arp->spa == c->rem.addr.ip4) break;\n#if MG_ENABLE_IPV6\n    if (c->is_arplooking && pkt->icmp6 && pkt->icmp6->type == 136) {\n      struct ndp_na *na = (struct ndp_na *) (pkt->icmp6 + 1);\n      if (MG_IP6MATCH(na->addr, c->rem.addr.ip6)) break;\n    }\n#endif\n    if (c->is_udp && pkt->udp && c->loc.port == pkt->udp->dport &&\n        !(c->loc.is_ip6 ^ (pkt->ip6 != NULL)))  // IP or IPv6 to same dest\n      break;\n    if (!c->is_udp && pkt->tcp && c->loc.port == pkt->tcp->dport &&\n        !(c->loc.is_ip6 ^ (pkt->ip6 != NULL)) &&\n        lsn == (bool) c->is_listening &&\n        (lsn || c->rem.port == pkt->tcp->sport))\n      break;\n  }\n  return c;\n}\n\nstatic void l2addr_resolved(struct mg_connection *c);\nstatic uint8_t *get_return_l2addr(struct mg_tcpip_if *ifp, struct mg_addr *rem,\n                                  bool is_udp, struct pkt *pkt);\n\n// RFC826, ARP assumes Ethernet MAC addresses\nstatic void rx_arp(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  if (pkt->arp->op == mg_htons(1) && pkt->arp->tpa == ifp->ip) {\n    // ARP request. Make a response, then send\n    // MG_VERBOSE((\"ARP req from %M\", mg_print_ip4, &pkt->arp->spa));\n    uint8_t *l2p = (uint8_t *) ifp->tx.buf;\n    struct arp *arp =\n        (struct arp *) mg_l2_header(ifp->l2type, MG_TCPIP_L2PROTO_ARP, ifp->mac,\n                                    mg_l2_getaddr(ifp->l2type, pkt->l2), l2p);\n    *arp = *pkt->arp;\n    arp->op = mg_htons(2);\n    memcpy(arp->tha, pkt->arp->sha, sizeof(pkt->arp->tha));\n    memcpy(arp->sha, ifp->mac, sizeof(pkt->arp->sha));\n    arp->tpa = pkt->arp->spa;\n    arp->spa = ifp->ip;\n    MG_DEBUG((\"ARP: tell %M we're %M\", mg_print_ip4, &arp->tpa, mg_print_mac,\n              ifp->mac));\n    driver_output(ifp, mg_l2_footer(ifp->l2type, PDIFF(l2p, arp + 1), l2p));\n  } else if (pkt->arp->op == mg_htons(2)) {\n    if (memcmp(pkt->arp->tha, ifp->mac, sizeof(pkt->arp->tha)) != 0) return;\n    // MG_VERBOSE((\"ARP resp from %M\", mg_print_ip4, &pkt->arp->spa));\n    if (pkt->arp->spa == ifp->gw) {\n      // Got response for the GW ARP request. Set ifp->gwmac and IP -> READY\n      memcpy(ifp->gwmac, pkt->arp->sha, sizeof(ifp->gwmac));\n      ifp->gw_ready = true;\n      if (ifp->state == MG_TCPIP_STATE_IP) {\n        ifp->state = MG_TCPIP_STATE_READY;\n        onstatechange(ifp);\n      }\n    } else {\n      struct mg_connection *c = getpeer(ifp->mgr, pkt, false);\n      if (c != NULL && c->is_arplooking) {\n        struct connstate *s = (struct connstate *) (c + 1);\n        memcpy(s->mac, pkt->arp->sha, sizeof(s->mac));\n        MG_DEBUG((\"%lu ARP resolved %M -> %M\", c->id, mg_print_ip4,\n                  &c->rem.addr.ip4, mg_print_mac, s->mac));\n        c->is_arplooking = 0;\n        l2addr_resolved(c);\n      }\n    }\n  }\n}\n\nstatic void rx_icmp(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  uint8_t *l2p = (uint8_t *) ifp->tx.buf;\n  size_t plen = pkt->pay.len;\n  if (!icmpcsum_ok(pkt->icmp, sizeof(struct icmp) + plen)) return;\n  if (pkt->icmp->type == 8 && pkt->ip != NULL && pkt->ip->dst == ifp->ip) {\n    size_t l2_max_overhead = ifp->framesize - ifp->mtu;\n    size_t hlen = sizeof(struct ip) + sizeof(struct icmp);\n    size_t room = ifp->tx.len - hlen - l2_max_overhead;\n    uint8_t *l2addr;\n    struct ip *ip;\n    struct icmp *icmp;\n    struct mg_addr ips;\n    ips.addr.ip4 = pkt->ip->src;\n    ips.is_ip6 = false;\n    if ((l2addr = get_return_l2addr(ifp, &ips, false, pkt)) == NULL)\n      return;  // safety net for lousy networks\n    if (plen > room) plen = room;\n    ip = tx_ip(ifp, l2addr, 1, ifp->ip, pkt->ip->src, sizeof(*icmp) + plen);\n    icmp = (struct icmp *) (ip + 1);\n    memset(icmp, 0, sizeof(*icmp));        // Set csum, type, code to 0\n    memcpy(icmp + 1, pkt->pay.buf, plen);  // Copy RX payload to TX\n    icmp->csum = ipcsum(icmp, sizeof(*icmp) + plen);\n    driver_output(ifp, mg_l2_footer(ifp->l2type, hlen + plen, l2p));\n  }\n}\n\nstatic void setdns4(struct mg_tcpip_if *ifp, uint32_t *ip);\n\nstatic bool dhcp_opt_len_ok(uint8_t len, uint8_t *p, uint8_t *end) {\n  return (len >= 4 && (len & 3) == 0 && p + 6 < end);\n}\n\nstatic void rx_dhcp_client(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  uint32_t ip = 0, gw = 0, mask = 0, lease = 0, dns = 0, sntp = 0;\n  uint8_t msgtype = 0, state = ifp->state;\n  // perform size check first, then access fields\n  uint8_t *p = pkt->dhcp->options,\n          *end = (uint8_t *) &pkt->pay.buf[pkt->pay.len];\n  if (end < p) return;  // options are optional, check min header length\n  if (memcmp(&pkt->dhcp->xid, ifp->mac + 2, sizeof(pkt->dhcp->xid))) return;\n  while (p + 1 < end && p[0] != 255) {  // Parse options, get #1; RFC-2132 9\n    if (p[0] == 1 && p[1] == 4 && p + 6 < end) {  // Mask, 3.3\n      memcpy(&mask, p + 2, sizeof(mask));\n    } else if (p[0] == 3 && dhcp_opt_len_ok(p[1], p, end)) {  // GW, 3.5\n      memcpy(&gw, p + 2, sizeof(gw));\n      ip = pkt->dhcp->yiaddr;\n    } else if (ifp->enable_req_dns && p[0] == 6 &&\n               dhcp_opt_len_ok(p[1], p, end)) {  // DNS, 3.8\n      memcpy(&dns, p + 2, sizeof(dns));\n    } else if (ifp->enable_req_sntp && p[0] == 42 &&\n               dhcp_opt_len_ok(p[1], p, end)) {  // SNTP, 8.3\n      memcpy(&sntp, p + 2, sizeof(sntp));\n    } else if (p[0] == 51 && p[1] == 4 && p + 6 < end) {  // Lease\n      memcpy(&lease, p + 2, sizeof(lease));\n      lease = mg_ntohl(lease);\n    } else if (p[0] == 53 && p[1] == 1 && p + 6 < end) {  // Msg Type\n      msgtype = p[2];\n    }\n    p += p[1] + 2;\n  }\n  // Process message type, RFC-1533 (9.4); RFC-2131 (3.1, 4)\n  if (msgtype == 6 && ifp->ip == ip) {  // DHCPNACK, release IP\n    ifp->state = MG_TCPIP_STATE_UP, ifp->ip = 0;\n  } else if (msgtype == 2 && ifp->state == MG_TCPIP_STATE_UP && ip && gw &&\n             lease) {  // DHCPOFFER\n    // select IP, (4.4.1) (fallback to IP source addr on foul play)\n    tx_dhcp_request_sel(ifp, ip,\n                        pkt->dhcp->siaddr ? pkt->dhcp->siaddr : pkt->ip->src);\n    ifp->state = MG_TCPIP_STATE_REQ;  // REQUESTING state\n  } else if (msgtype == 5) {          // DHCPACK\n    if (ifp->state == MG_TCPIP_STATE_REQ && ip && gw && lease) {  // got an IP\n      uint64_t rand;\n      ifp->lease_expire = ifp->now + lease * 1000;\n      MG_INFO((\"Lease: %u sec (%lld)\", lease, ifp->lease_expire / 1000));\n      // assume DHCP server = router until ARP resolves\n      memcpy(ifp->gwmac, mg_l2_getaddr(ifp->l2type, pkt->l2),\n             sizeof(ifp->gwmac));\n      ifp->gw_ready = true;  // NOTE(): actual gw ARP won't retry now\n      ifp->ip = ip, ifp->gw = gw, ifp->mask = mask;\n      ifp->state = MG_TCPIP_STATE_IP;  // BOUND state\n      mg_random(&rand, sizeof(rand));\n      srand((unsigned int) (rand + mg_millis()));\n      if (ifp->enable_req_dns && dns != 0) {\n        setdns4(ifp, &dns);\n        mg_tcpip_call(ifp, MG_TCPIP_EV_DHCP_DNS, &dns);\n      }\n      if (ifp->enable_req_sntp && sntp != 0)\n        mg_tcpip_call(ifp, MG_TCPIP_EV_DHCP_SNTP, &sntp);\n    } else if (ifp->state == MG_TCPIP_STATE_READY && ifp->ip == ip) {  // renew\n      ifp->lease_expire = ifp->now + lease * 1000;\n      MG_INFO((\"Lease: %u sec (%lld)\", lease, ifp->lease_expire / 1000));\n    }  // TODO(): accept provided T1/T2 and store server IP for renewal (4.4)\n  }\n  if (ifp->state != state) onstatechange(ifp);\n}\n\n// Simple DHCP server that assigns a next IP address: ifp->ip + 1\nstatic void rx_dhcp_server(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  uint8_t *mac;\n  uint8_t op = 0, *p = pkt->dhcp->options,\n          *end = (uint8_t *) &pkt->pay.buf[pkt->pay.len];\n  // NOTE(): assumes Ethernet: htype=1 hlen=6, copy 6 bytes\n  struct dhcp res = {2, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, {0}, 0, {0}};\n  if (end < p) return;  // options are optional, check min header length\n  res.yiaddr = ifp->ip;\n  ((uint8_t *) (&res.yiaddr))[3]++;                // Offer our IP + 1\n  while (p + 1 < end && p[0] != 255) {             // Parse options\n    if (p[0] == 53 && p[1] == 1 && p + 2 < end) {  // Message type\n      op = p[2];\n    }\n    p += p[1] + 2;\n  }\n  if (op == 1 || op == 3) {         // DHCP Discover or DHCP Request\n    uint8_t msg = op == 1 ? 2 : 5;  // Message type: DHCP OFFER or DHCP ACK\n    uint8_t opts[] = {\n        53, 1, 0,                   // Message type\n        1,  4, 0,   0,   0,   0,    // Subnet mask\n        54, 4, 0,   0,   0,   0,    // Server ID\n        12, 3, 'm', 'i', 'p',       // Host name: \"mip\"\n        51, 4, 255, 255, 255, 255,  // Lease time\n        255                         // End of options\n    };\n    opts[2] = msg;\n    memcpy(&res.hwaddr, pkt->dhcp->hwaddr, 6);\n    memcpy(opts + 5, &ifp->mask, sizeof(ifp->mask));\n    memcpy(opts + 11, &ifp->ip, sizeof(ifp->ip));\n    memcpy(&res.options, opts, sizeof(opts));\n    res.magic = pkt->dhcp->magic;\n    res.xid = pkt->dhcp->xid;\n    mac = mg_l2_getaddr(ifp->l2type, pkt->l2);\n    if (ifp->enable_get_gateway) {\n      ifp->gw = res.yiaddr;  // set gw IP, best-effort gwmac as DHCP server's\n      memcpy(ifp->gwmac, mac, sizeof(ifp->gwmac));\n    }\n    tx_udp4(ifp, mac, ifp->ip, mg_htons(67), op == 1 ? ~0U : res.yiaddr,\n            mg_htons(68), &res, sizeof(res));\n  }\n}\n\n#if MG_ENABLE_IPV6\nstatic struct ip6 *tx_ip6(struct mg_tcpip_if *ifp, uint8_t *l2_dst,\n                          uint8_t next, uint64_t *ip_src, uint64_t *ip_dst,\n                          size_t plen) {\n  // ifp->tx.buf is 8-bit aligned, keep other headers as pointers, see pkt\n  uint8_t *l2p = (uint8_t *) ifp->tx.buf;\n  struct ip6 *ip6 = (struct ip6 *) mg_l2_header(\n      ifp->l2type, MG_TCPIP_L2PROTO_IPV6, ifp->mac, l2_dst, l2p);\n  memset(ip6, 0, sizeof(*ip6));\n  ip6->ver = 0x60;  // Version 6, traffic class 0\n  ip6->plen = mg_htons((uint16_t) plen);\n  ip6->next = next;\n  ip6->hops = 255;  // NDP requires max\n  ip6->src[0] = *ip_src++;\n  ip6->src[1] = *ip_src;\n  ip6->dst[0] = *ip_dst++;\n  ip6->dst[1] = *ip_dst;\n  return ip6;\n}\n\nstatic void tx_icmp6(struct mg_tcpip_if *ifp, uint8_t *l2_dst, uint64_t *ip_src,\n                     uint64_t *ip_dst, uint8_t type, uint8_t code,\n                     const void *buf, size_t len) {\n  uint8_t *l2p = (uint8_t *) ifp->tx.buf;\n  struct ip6 *ip6;\n  struct icmp6 *icmp6;\n  ip6 = tx_ip6(ifp, l2_dst, 58, ip_src, ip_dst, sizeof(*icmp6) + len);\n  icmp6 = (struct icmp6 *) (ip6 + 1);\n  memset(icmp6, 0, sizeof(*icmp6));  // Set csum to 0\n  icmp6->type = type;\n  icmp6->code = code;\n  memcpy(icmp6 + 1, buf, len);  // Copy payload\n  icmp6->csum = 0;              // RFC-4443 2.3, RFC-8200 8.1\n  icmp6->csum = p6csum(ip6, icmp6, sizeof(*icmp6) + len);\n  driver_output(\n      ifp, mg_l2_footer(ifp->l2type, sizeof(*ip6) + sizeof(*icmp6) + len, l2p));\n}\n\n// Neighbor Discovery Protocol, RFC-4861\n// Neighbor Advertisement, 4.4\nstatic void tx_ndp_na(struct mg_tcpip_if *ifp, uint8_t *l2_dst,\n                      uint64_t *ip_src, uint64_t *ip_dst, bool solicited,\n                      uint8_t *l2) {\n  uint8_t data[20 + 16];  // NOTE(): optional len upto 2 hw addr\n  memset(data, 0, sizeof(data));\n  data[0] = solicited ? 0x60 : 0x20;                    // O + S\n  memcpy(data + 4, ip_src, 16);                         // Target address\n  data[20] = 2;                                         // 4.6.1, target hwaddr\n  data[21] = mg_l2_ip6put(ifp->l2type, l2, data + 22);  // option length / 8\n  tx_icmp6(ifp, l2_dst, ip_src, ip_dst, 136, 0, data,\n           20 + (size_t) (8 * data[21]));\n}\n\nstatic void onstate6change(struct mg_tcpip_if *ifp);\n\nstatic void rx_ndp_na(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  struct ndp_na *na = (struct ndp_na *) (pkt->icmp6 + 1);\n  uint8_t *opts = (uint8_t *) (na + 1);\n  if ((na->res[0] & 0x40) == 0) return;  // not \"solicited\"\n  if (*opts++ != 2) return;              // no target hwaddr\n  MG_VERBOSE((\"NDP NA resp from %M\", mg_print_ip6, (char *) &na->addr));\n  if (MG_IP6MATCH(na->addr, ifp->gw6)) {\n    // Got response for the GW NS request. Set ifp->gw6mac and IP6 -> READY\n    uint8_t len = *opts++;  // check valid hwaddr and get it\n    if (!mg_l2_ip6get(ifp->l2type, ifp->gw6mac, opts, len)) return;\n    ifp->gw6_ready = true;\n    if (ifp->state6 == MG_TCPIP_STATE_IP) {\n      ifp->state6 = MG_TCPIP_STATE_READY;\n      onstate6change(ifp);\n    }\n  } else {\n    struct mg_connection *c = getpeer(ifp->mgr, pkt, false);\n    if (c != NULL && c->is_arplooking) {\n      struct connstate *s = (struct connstate *) (c + 1);\n      uint8_t len = *opts++;  // check valid hwaddr and get it\n      if (!mg_l2_ip6get(ifp->l2type, s->mac, opts, len)) return;\n      MG_DEBUG((\"%lu NDP resolved %M -> %M\", c->id, mg_print_ip6,\n                &c->rem.addr.ip6, mg_print_mac, ifp->l2type, s->mac));\n      c->is_arplooking = 0;\n      l2addr_resolved(c);\n    }\n  }\n}\n\n// Neighbor Solicitation, 4.3\nstatic void rx_ndp_ns(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  uint64_t target[2];\n  if (pkt->pay.len < sizeof(target)) return;\n  memcpy(target, pkt->pay.buf + 4, sizeof(target));\n  if (MG_IP6MATCH(target, ifp->ip6ll) || MG_IP6MATCH(target, ifp->ip6)) {\n    uint64_t req[2];  // requester address\n    uint8_t l2[sizeof(struct mg_l2addr)];\n    uint8_t len, *opts = (uint8_t *) pkt->pay.buf + 20;\n    if (*opts++ != 1) return;  // no requester hwaddr (source)\n    len = *opts++;             // check valid hwaddr and get it\n    if (!mg_l2_ip6get(ifp->l2type, l2, opts, len)) return;\n    req[0] = pkt->ip6->src[0], req[1] = pkt->ip6->src[1];  // align to 64-bit\n    tx_ndp_na(ifp, l2, target, req, true, ifp->mac);\n  }\n}\n\n// - use solicited node multicast to resolve a l2 address (l2_addr = NULL)\n// - use unicast to verify presence (l2_addr = neighbor l2 address)\nstatic void tx_ndp_ns(struct mg_tcpip_if *ifp, uint64_t *ip_dst,\n                      uint8_t *l2_addr) {\n  uint8_t payload[4 + 16 + 16];  // NOTE(): 16 --> optional len upto 2 hw addr\n  uint64_t ip_unspec[2] = {0, 0};\n  size_t payload_len = 20;\n  bool mcast = (l2_addr == NULL);\n  uint64_t ip_mcast[2] = {0, 0};\n  uint8_t *l2 = l2_addr;\n\n  memset(payload, 0, sizeof(payload));\n  memcpy(payload + 4, ip_dst, 16);\n  if (mcast) {\n    struct mg_addr ipd;\n    ip6sn(ip_dst, ip_mcast);\n    ipd.addr.ip6[0] = ip_mcast[0], ipd.addr.ip6[1] = ip_mcast[1],\n    ipd.is_ip6 = true;\n    l2 = mg_l2_mapip(ifp->l2type, MG_TCPIP_L2ADDR_MCAST6, &ipd);\n  }\n  payload_len = 20;\n  // TODO(robertc2000): using only link-local IP addr for now\n  // We might consider to add an option to use either link-local or global IP\n  if (!MG_IP6MATCH(ifp->ip6ll, ip_unspec)) {\n    payload[20] = 1;  // 4.6.1, source hwaddr; option length in 8-byte units\n    payload[21] = mg_l2_ip6put(ifp->l2type, ifp->mac, payload + 22);\n    payload_len += 8 * payload[21];\n  }\n  tx_icmp6(ifp, l2, ifp->ip6ll, mcast ? ip_mcast : ip_dst, 135, 0, payload,\n           payload_len);\n}\n\n// Router Solicitation, 4.1\nstatic void tx_ndp_rs(struct mg_tcpip_if *ifp) {\n  uint8_t payload[4 + 16];  // reserved + optional len upto 2 hw addr NOTE()\n  size_t payload_len = 4;\n  uint64_t ip_unspec[2] = {0, 0};\n\n  memset(payload, 0, sizeof(payload));\n\n  if (!MG_IP6MATCH(ifp->ip6ll, ip_unspec)) {\n    payload[4] = 1;  // 4.6.1, source hwaddr; option length in 8-byte units\n    payload[5] = mg_l2_ip6put(ifp->l2type, ifp->mac, payload + 6);\n    payload_len += 8 * payload[5];\n  }\n  tx_icmp6(ifp,\n           mg_l2_mapip(ifp->l2type, MG_TCPIP_L2ADDR_MCAST6,\n                       (struct mg_addr *) &ip6_allrouters),\n           ifp->ip6ll, (uint64_t *) ip6_allrouters.addr.ip6, 133, 0, payload,\n           payload_len);\n  MG_DEBUG((\"NDP Router Solicitation sent\"));\n}\n\nstatic void fill_prefix(uint8_t *dst, uint8_t *src, uint8_t len) {\n  uint8_t full = len / 8;\n  uint8_t rem = len % 8;\n  if (full > 0) memcpy(dst, src, full);\n  if (rem > 0) {\n    uint8_t mask = (uint8_t) (0xFF << (8 - rem));\n    dst[full] |= src[full] & mask;  // mg_l2_genip6() zeroes dst\n  }\n}\n\nstatic bool match_prefix(uint8_t *newp, uint8_t *curp, uint8_t len) {\n  uint8_t full = len / 8;\n  uint8_t rem = len % 8;\n  if (full > 0 && memcmp(curp, newp, full) != 0) return false;\n  if (rem > 0) {\n    uint8_t mask = (uint8_t) (0xFF << (8 - rem));\n    if (curp[full] != (newp[full] & mask)) return false;\n  }\n  return true;\n}\n\nstatic bool fill_global(struct mg_tcpip_if *ifp, uint8_t *prefix,\n                        uint8_t prefix_len) {\n  if (!mg_l2_genip6(ifp->l2type, ifp->ip6, prefix_len, ifp->mac)) return false;\n  fill_prefix((uint8_t *) ifp->ip6, prefix, prefix_len);\n  fill_prefix(ifp->prefix, prefix, prefix_len);\n  ifp->prefix_len = prefix_len;\n  return true;\n}\n\n// Router Advertisement, 4.2\nstatic void rx_ndp_ra(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  if (pkt->pay.len < 12) return;\n  struct ndp_ra *ra = (struct ndp_ra *) (pkt->icmp6 + 1);\n  uint8_t *opts = (uint8_t *) (ra + 1);\n  size_t opt_left = pkt->pay.len - 12;\n  bool gotl2addr = false, gotprefix = false;\n  uint8_t l2[sizeof(struct mg_l2addr)];\n  uint32_t mtu = 0;\n  uint8_t *prefix, prefix_len;\n\n  if (ifp->state6 == MG_TCPIP_STATE_UP) {\n    MG_DEBUG((\"Received NDP RA\"));  // fill gw6 address\n    // parse options\n    while (opt_left >= 2) {\n      uint8_t type = opts[0], len = opts[1];\n      size_t length = (size_t) len * 8;\n      if (length == 0 || length > opt_left) break;  // malformed\n      if (type == 1 && length >= 8) {\n        // Received router's L2 address\n        if (!mg_l2_ip6get(ifp->l2type, l2, opts + 2, len)) break;\n        gotl2addr = true;\n      } else if (type == 5 && length >= 8) {\n        // process MTU if available\n        mtu = mg_ntohl(*(uint32_t *) (opts + 4));\n      } else if (type == 3 && length >= 32) {\n        // process prefix, 4.6.2\n        uint8_t pfx_flags = opts[3];  // L=0x80, A=0x40\n        uint32_t valid = mg_ntohl(*(uint32_t *) (opts + 4));\n        uint32_t pref_lifetime = mg_ntohl(*(uint32_t *) (opts + 8));\n        prefix_len = opts[2];\n        prefix = opts + 16;\n\n        // TODO (robertc2000): handle prefix options if necessary\n        (void) pfx_flags;\n        (void) valid;\n        (void) pref_lifetime;\n\n        gotprefix = true;\n      }\n      opts += length;\n      opt_left -= length;\n    }\n\n    // fill prefix and global\n    if (gotprefix && !fill_global(ifp, prefix, prefix_len)) return;\n    ifp->gw6[0] = pkt->ip6->src[0], ifp->gw6[1] = pkt->ip6->src[1];\n    if (gotl2addr) {\n      memcpy(ifp->gw6mac, l2, sizeof(ifp->gw6mac));\n      ifp->state6 = MG_TCPIP_STATE_READY;\n      ifp->gw6_ready = true;\n    }\n    if (mtu != 0 && ifp->mtu != mtu) {\n      MG_ERROR(\n          (\"got an MTU: %u, that differs from the configured one. \"\n           \"All devices in an IPv6 network should have the same MTU, \"\n           \"using the router's instead...\",\n           mtu));\n      ifp->mtu = (uint16_t) mtu;\n    }\n    if (ifp->state6 != MG_TCPIP_STATE_READY) {\n      tx_ndp_ns(ifp, ifp->gw6, NULL);  // unsolicited GW hwaddr resolution\n      ifp->state6 = MG_TCPIP_STATE_IP;\n    }\n    onstate6change(ifp);\n  }\n}\n\nstatic void rx_icmp6(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  if (!icmp6csum_ok(pkt->ip6, pkt->icmp6)) return;\n  switch (pkt->icmp6->type) {\n    case 128: {  // Echo Request, RFC-4443 4.1\n      uint64_t target[2];\n      target[0] = pkt->ip6->dst[0], target[1] = pkt->ip6->dst[1];\n      if (MG_IP6MATCH(target, ifp->ip6ll) || MG_IP6MATCH(target, ifp->ip6)) {\n        size_t l2_max_overhead = ifp->framesize - ifp->mtu;\n        size_t hlen = sizeof(struct ip6) + sizeof(struct icmp6);\n        size_t room = ifp->tx.len - hlen - l2_max_overhead, plen = pkt->pay.len;\n        struct mg_addr ips;\n        uint8_t *l2addr;\n\n        ips.addr.ip6[0] = pkt->ip6->src[0], ips.addr.ip6[1] = pkt->ip6->src[1];\n        ips.is_ip6 = true;\n        if ((l2addr = get_return_l2addr(ifp, &ips, false, pkt)) == NULL)\n          return;                      // safety net for lousy networks\n        if (plen > room) plen = room;  // Copy (truncated) RX payload to TX\n        // Echo Reply, 4.2\n        tx_icmp6(ifp, l2addr, target, ips.addr.ip6, 129, 0, pkt->pay.buf, plen);\n      }\n    } break;\n    case 134:  // Router Advertisement\n      rx_ndp_ra(ifp, pkt);\n      break;\n    case 135:  // Neighbor Solicitation\n      rx_ndp_ns(ifp, pkt);\n      break;\n    case 136:  // Neighbor Advertisement\n      rx_ndp_na(ifp, pkt);\n      break;\n  }\n}\n\nstatic void onstate6change(struct mg_tcpip_if *ifp) {\n  if (ifp->state6 == MG_TCPIP_STATE_READY) {\n    MG_INFO((\"READY, IP: %M\", mg_print_ip6, &ifp->ip6));\n    MG_INFO((\"       GW: %M\", mg_print_ip6, &ifp->gw6));\n    if (ifp->l2type == MG_TCPIP_L2_ETH)  // TODO(): print other l2\n      MG_INFO((\"      MAC: %M\", mg_print_mac, &ifp->mac));\n  } else if (ifp->state6 == MG_TCPIP_STATE_IP) {\n    if (ifp->gw6[0] != 0 || ifp->gw6[1] != 0)\n      tx_ndp_ns(ifp, ifp->gw6, NULL);  // unsolicited GW hwaddr resolution\n  } else if (ifp->state6 == MG_TCPIP_STATE_UP) {\n    MG_INFO((\"IP: %M\", mg_print_ip6, &ifp->ip6ll));\n  }\n  if (ifp->state6 != MG_TCPIP_STATE_UP && ifp->state6 != MG_TCPIP_STATE_DOWN)\n    mg_tcpip_call(ifp, MG_TCPIP_EV_ST6_CHG, &ifp->state6);\n}\n#endif\n\nstatic uint8_t *tcpip_mapip(struct mg_tcpip_if *ifp, struct mg_addr *ip) {\n#if MG_ENABLE_IPV6\n  if (ip->is_ip6) {\n    if (MG_IP6MATCH(ip->addr.ip6, ip6_allnodes.addr.ip6))  // local broadcast\n      return mg_l2_mapip(ifp->l2type, MG_TCPIP_L2ADDR_MCAST6,\n                         (struct mg_addr *) &ip6_allnodes);\n    if (*ip->addr.ip == 0xFF)  // multicast\n      return mg_l2_mapip(ifp->l2type, MG_TCPIP_L2ADDR_MCAST6, ip);\n  } else\n#endif\n  {  // global/local broadcast\n    if (ip->addr.ip4 == 0xffffffff || ip->addr.ip4 == (ifp->ip | ~ifp->mask))\n      return mg_l2_mapip(ifp->l2type, MG_TCPIP_L2ADDR_BCAST, NULL);\n    if ((*ip->addr.ip & 0xE0) == 0xE0)  // 224 ~ 239 = E0 ~ EF, multicast\n      return mg_l2_mapip(ifp->l2type, MG_TCPIP_L2ADDR_MCAST, ip);\n  }\n  return NULL;\n}\n\nstatic uint8_t *get_return_l2addr(struct mg_tcpip_if *ifp, struct mg_addr *rem,\n                                  bool is_udp, struct pkt *pkt) {\n  uint8_t *l2addr;\n  if (is_udp && (l2addr = tcpip_mapip(ifp, rem)) != NULL)\n    return l2addr;  // broadcast or multicast\n#if MG_ENABLE_IPV6\n  if (rem->is_ip6) {\n    if (rem->addr.ip6[0] == ifp->ip6ll[0] ||\n        match_prefix((uint8_t *) rem->addr.ip6, ifp->prefix, ifp->prefix_len))\n      return mg_l2_getaddr(ifp->l2type, pkt->l2);  // same LAN, get from frame\n    if (ifp->gw6_ready)                            // use the router\n      return ifp->gw6mac;  // ignore source address in frame\n  } else\n#endif\n  {\n    if (ifp->ip != 0 && ((rem->addr.ip4 & ifp->mask) == (ifp->ip & ifp->mask)))\n      return mg_l2_getaddr(ifp->l2type, pkt->l2);  // same LAN, get from frame\n    if (ifp->gw_ready)                             // use the router\n      return ifp->gwmac;  // ignore source address in frame\n  }\n  MG_ERROR((\"%M %s: No way back, can't respond\", mg_print_ip_port, rem,\n            is_udp ? \"UDP\" : \"TCP\"));\n  return NULL;\n}\n\nstatic bool rx_udp(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  struct mg_connection *c = getpeer(ifp->mgr, pkt, true);\n  struct connstate *s;\n  uint8_t *l2addr;\n  if (c == NULL) return false;  // No UDP listener on this port\n  s = (struct connstate *) (c + 1);\n  c->rem.port = pkt->udp->sport;\n#if MG_ENABLE_IPV6\n  if (c->loc.is_ip6) {  // matching of v4/v6 to dest is done bt getpeer()\n    if (!udp6csum_ok(pkt->ip6, pkt->udp)) return false;\n    c->rem.addr.ip6[0] = pkt->ip6->src[0],\n    c->rem.addr.ip6[1] = pkt->ip6->src[1], c->rem.is_ip6 = true;\n  } else\n#endif\n  {\n    if (!udpcsum_ok(pkt->ip, pkt->udp)) return false;\n    c->rem.addr.ip4 = pkt->ip->src;\n  }\n  if ((l2addr = get_return_l2addr(ifp, &c->rem, true, pkt)) == NULL)\n    return false;  // safety net for lousy networks\n  memcpy(s->mac, l2addr, sizeof(s->mac));\n  if (c->recv.len >= MG_MAX_RECV_SIZE) {\n    mg_error(c, \"max_recv_buf_size reached\");\n  } else if (c->recv.size - c->recv.len < pkt->pay.len &&\n             !mg_iobuf_resize(&c->recv, c->recv.len + pkt->pay.len)) {\n    mg_error(c, \"oom\");\n  } else {\n    memcpy(&c->recv.buf[c->recv.len], pkt->pay.buf, pkt->pay.len);\n    c->recv.len += pkt->pay.len;\n    mg_call(c, MG_EV_READ, &pkt->pay.len);\n  }\n  return true;\n}\n\nstatic size_t tx_tcp(struct mg_tcpip_if *ifp, uint8_t *l2_dst,\n                     struct mg_addr *ip_src, struct mg_addr *ip_dst,\n                     uint8_t flags, uint32_t seq, uint32_t ack, const void *buf,\n                     size_t len) {\n  uint8_t *l2p = (uint8_t *) ifp->tx.buf;\n  struct ip *ip = NULL;\n  struct tcp *tcp;\n  uint16_t opts[4 / 2];\n  size_t hlen = sizeof(*tcp);\n#if MG_ENABLE_IPV6\n  struct ip6 *ip6 = NULL;\n#endif\n\n  // Handle any options first, here, to determine header size\n  if (flags & TH_SYN) {  // Send MSS\n    uint16_t mss;\n#if MG_ENABLE_IPV6  // RFC-9293 3.7.1; RFC-6691 2\n    mss = (uint16_t) (ifp->mtu - 60);\n#else\n    mss = (uint16_t) (ifp->mtu - 40);\n#endif\n    opts[0] = mg_htons(0x0204);  // RFC-9293 3.2\n    opts[1] = mg_htons(mss);\n    hlen += sizeof(opts);  // always whole number of 32-bit words\n  }\n\n#if MG_ENABLE_IPV6\n  if (ip_dst->is_ip6) {\n    ip6 =\n        tx_ip6(ifp, l2_dst, 6, ip_src->addr.ip6, ip_dst->addr.ip6, hlen + len);\n    tcp = (struct tcp *) (ip6 + 1);\n  } else\n#endif\n  {\n    ip = tx_ip(ifp, l2_dst, 6, ip_src->addr.ip4, ip_dst->addr.ip4, hlen + len);\n    tcp = (struct tcp *) (ip + 1);\n  }\n  memset(tcp, 0, sizeof(*tcp));\n  memmove(tcp + 1, opts, hlen - sizeof(*tcp));  // copy opts if any\n  if (buf != NULL && len) memmove((uint8_t *) tcp + hlen, buf, len);\n  tcp->sport = ip_src->port;\n  tcp->dport = ip_dst->port;\n  tcp->seq = seq;\n  tcp->ack = ack;\n  tcp->flags = flags;\n  tcp->win = mg_htons(MG_TCPIP_WIN);\n  tcp->off = (uint8_t) (hlen / 4 << 4);\n#if MG_ENABLE_IPV6\n  if (ip_dst->is_ip6) {\n    tcp->csum = p6csum(ip6, tcp, hlen + len);\n  } else\n#endif\n  {\n    tcp->csum = pcsum(ip, tcp, hlen + len);\n  }\n  MG_VERBOSE((\"TCP %M -> %M fl %x len %u\", mg_print_ip_port, ip_src,\n              mg_print_ip_port, ip_dst, tcp->flags, len));\n  return driver_output(\n      ifp, mg_l2_footer(ifp->l2type, PDIFF(l2p, tcp) + hlen + len, l2p));\n}\n\nstatic size_t tx_tcp_ctrlresp(struct mg_tcpip_if *ifp, struct pkt *pkt,\n                              uint8_t flags, uint32_t seqno) {\n  uint32_t ackno = mg_htonl(mg_ntohl(pkt->tcp->seq) + (uint32_t) pkt->pay.len +\n                            ((pkt->tcp->flags & (TH_SYN | TH_FIN)) ? 1 : 0));\n  struct mg_addr ips, ipd;\n  uint8_t *l2addr;\n  memset(&ips, 0, sizeof(ips));\n  memset(&ipd, 0, sizeof(ipd));\n  if (pkt->ip != NULL) {\n    ips.addr.ip4 = pkt->ip->dst;\n    ipd.addr.ip4 = pkt->ip->src;\n  } else {\n    ips.addr.ip6[0] = pkt->ip6->dst[0], ips.addr.ip6[1] = pkt->ip6->dst[1];\n    ipd.addr.ip6[0] = pkt->ip6->src[0], ipd.addr.ip6[1] = pkt->ip6->src[1];\n    ips.is_ip6 = true;\n    ipd.is_ip6 = true;\n  }\n  ips.port = pkt->tcp->dport;\n  ipd.port = pkt->tcp->sport;\n  if ((l2addr = get_return_l2addr(ifp, &ipd, false, pkt)) == NULL)\n    return 0;  // safety net for lousy networks\n  return tx_tcp(ifp, l2addr, &ips, &ipd, flags, seqno, ackno, NULL, 0);\n}\n\nstatic size_t tx_tcp_rst(struct mg_tcpip_if *ifp, struct pkt *pkt, bool toack) {\n  return tx_tcp_ctrlresp(ifp, pkt, toack ? TH_RST : (TH_RST | TH_ACK),\n                         toack ? pkt->tcp->ack : 0);\n}\n\nstatic struct mg_connection *accept_conn(struct mg_connection *lsn,\n                                         struct pkt *pkt, uint16_t mss) {\n  struct connstate *s;\n  uint8_t *l2addr;\n  struct mg_connection *c = mg_alloc_conn(lsn->mgr);\n  if (c == NULL) {\n    MG_ERROR((\"OOM\"));\n    return NULL;\n  }\n  s = (struct connstate *) (c + 1);\n  s->dmss = mss;  // from options in client SYN\n  s->seq = mg_ntohl(pkt->tcp->ack), s->ack = mg_ntohl(pkt->tcp->seq);\n#if MG_ENABLE_IPV6\n  if (lsn->loc.is_ip6) {\n    c->rem.addr.ip6[0] = pkt->ip6->src[0],\n    c->rem.addr.ip6[1] = pkt->ip6->src[1], c->rem.is_ip6 = true;\n    c->loc.addr.ip6[0] = c->mgr->ifp->ip6[0],\n    c->loc.addr.ip6[1] = c->mgr->ifp->ip6[1], c->loc.is_ip6 = true;\n    // TODO(): compare lsn to link-local, or rem as link-local: use ll instead\n  } else\n#endif\n  {\n    c->rem.addr.ip4 = pkt->ip->src;\n    c->loc.addr.ip4 = c->mgr->ifp->ip;\n  }\n  c->rem.port = pkt->tcp->sport;\n  c->loc.port = lsn->loc.port;\n  if ((l2addr = get_return_l2addr(lsn->mgr->ifp, &c->rem, false, pkt)) ==\n      NULL) {\n    free(c);      // safety net for lousy networks, not actually needed\n    return NULL;  // as path has already been checked at SYN (sending SYN+ACK)\n  }\n  memcpy(s->mac, l2addr, sizeof(s->mac));\n  settmout(c, MIP_TTYPE_KEEPALIVE);\n  MG_DEBUG((\"%lu accepted %M\", c->id, mg_print_ip_port, &c->rem));\n  LIST_ADD_HEAD(struct mg_connection, &lsn->mgr->conns, c);\n  c->is_accepted = 1;\n  c->is_hexdumping = lsn->is_hexdumping;\n  c->pfn = lsn->pfn;\n  c->pfn_data = lsn->pfn_data;\n  c->fn = lsn->fn;\n  c->fn_data = lsn->fn_data;\n  c->is_tls = lsn->is_tls;\n  mg_call(c, MG_EV_OPEN, NULL);\n  mg_call(c, MG_EV_ACCEPT, NULL);\n  if (!c->is_tls_hs) c->is_tls = 0;  // user did not call mg_tls_init()\n  return c;\n}\n\nstatic size_t trim_len(struct mg_connection *c, size_t len) {\n  struct mg_tcpip_if *ifp = c->mgr->ifp;\n  size_t l2_max_overhead = ifp->framesize - ifp->mtu;\n  size_t ip_max_h_len = c->rem.is_ip6 ? 40 : 24;  // we don't send options\n  size_t tcp_max_h_len = 60 /* RFC-9293 3.7.1; RFC-6691 2 */, udp_h_len = 8;\n  size_t max_headers_len =\n      ip_max_h_len + (c->is_udp ? udp_h_len : tcp_max_h_len);\n  size_t min_mtu = c->rem.is_ip6 ? 1280 /* RFC-8200, IPv6 minimum */\n                   : c->is_udp   ? 68   /* RFC-791, IP minimum */\n                                 : max_headers_len /* fit full TCP header */;\n  // NOTE(): We are effectively reducing transmitted TCP segment length by 20,\n  // accounting for possible options; though we currently don't send options\n  // except for SYN.\n\n  // If the frame exceeds the available buffer, trim the length.\n  if (len + max_headers_len + l2_max_overhead > ifp->tx.len)\n    len = ifp->tx.len - max_headers_len - l2_max_overhead;\n  // Ensure the MTU isn't lower than the minimum allowed value\n  if (ifp->mtu < min_mtu) {\n    MG_ERROR((\"MTU is lower than minimum, raising to %lu\", min_mtu));\n    ifp->mtu = (uint16_t) min_mtu;\n  }\n  // If the total packet size exceeds the MTU, trim the length\n  if (len + max_headers_len > ifp->mtu) {\n    len = ifp->mtu - max_headers_len;\n    if (c->is_udp) MG_ERROR((\"UDP datagram exceeds MTU. Truncating it.\"));\n  }\n\n  return len;\n}\n\nstatic bool udp_send(struct mg_connection *c, const void *buf, size_t len) {\n  struct mg_tcpip_if *ifp = c->mgr->ifp;\n  struct connstate *s = (struct connstate *) (c + 1);\n  struct mg_addr ips;\n  memset(&ips, 0, sizeof(ips));\n#if MG_ENABLE_IPV6\n  if (c->loc.is_ip6) {\n    ips.addr.ip6[0] = ifp->ip6[0], ips.addr.ip6[1] = ifp->ip6[1],\n    ips.is_ip6 = true;\n    // TODO(): detect link-local (c->rem) and use it\n  } else\n#endif\n  {\n    ips.addr.ip4 = ifp->ip;\n  }\n  ips.port = c->loc.port;\n  return tx_udp(ifp, s->mac, &ips, &c->rem, buf, len);\n}\n\nlong mg_io_send(struct mg_connection *c, const void *buf, size_t len) {\n  struct connstate *s = (struct connstate *) (c + 1);\n  len = trim_len(c, len);\n  if (c->is_udp) {\n    if (!udp_send(c, buf, len)) return MG_IO_WAIT;\n  } else {  // TCP, cap to peer's MSS\n    struct mg_tcpip_if *ifp = c->mgr->ifp;\n    size_t sent;\n    if (len > s->dmss) len = s->dmss;  // RFC-6691: reduce if sending opts\n    sent = tx_tcp(ifp, s->mac, &c->loc, &c->rem, TH_PUSH | TH_ACK,\n                  mg_htonl(s->seq), mg_htonl(s->ack), buf, len);\n    if (sent == 0) {\n      return MG_IO_WAIT;\n    } else if (sent == (size_t) -1) {\n      return MG_IO_ERR;\n    } else {\n      s->seq += (uint32_t) len;\n      if (s->ttype == MIP_TTYPE_ACK) settmout(c, MIP_TTYPE_KEEPALIVE);\n    }\n  }\n  return (long) len;\n}\n\nstatic void handle_tls_recv(struct mg_connection *c) {\n  size_t avail = mg_tls_pending(c);\n  size_t min = avail > MG_MAX_RECV_SIZE ? MG_MAX_RECV_SIZE : avail;\n  struct mg_iobuf *io = &c->recv;\n  if (io->size - io->len < min && !mg_iobuf_resize(io, io->len + min)) {\n    mg_error(c, \"oom\");\n  } else {\n    // Decrypt data directly into c->recv\n    long n = mg_tls_recv(c, io->buf != NULL ? &io->buf[io->len] : io->buf,\n                         io->size - io->len);\n    if (n == MG_IO_ERR) {\n      mg_error(c, \"TLS recv error\");\n    } else if (n > 0) {\n      // Decrypted successfully - trigger MG_EV_READ\n      io->len += (size_t) n;\n      mg_call(c, MG_EV_READ, &n);\n    }  // else n < 0: outstanding data to be moved to c->recv\n  }\n}\n\nstatic void read_conn(struct mg_connection *c, struct pkt *pkt) {\n  struct connstate *s = (struct connstate *) (c + 1);\n  struct mg_iobuf *io = c->is_tls ? &c->rtls : &c->recv;\n  uint32_t seq = mg_ntohl(pkt->tcp->seq);\n  if (pkt->tcp->flags & TH_FIN) {\n    uint8_t flags = TH_ACK;\n    if (mg_ntohl(pkt->tcp->seq) != s->ack) {\n      MG_VERBOSE((\"ignoring FIN, %x != %x\", mg_ntohl(pkt->tcp->seq), s->ack));\n      tx_tcp(c->mgr->ifp, s->mac, &c->loc, &c->rem, TH_ACK, mg_htonl(s->seq),\n             mg_htonl(s->ack), \"\", 0);\n      return;\n    }\n    // If we initiated the closure, we reply with ACK upon receiving FIN\n    // If we didn't initiate it, we reply with FIN as part of the normal TCP\n    // closure process\n    s->ack = (uint32_t) (mg_htonl(pkt->tcp->seq) + pkt->pay.len + 1);\n    s->fin_rcvd = true;\n    if (c->is_draining && s->ttype == MIP_TTYPE_FIN) {\n      if (s->seq == mg_htonl(pkt->tcp->ack)) {  // Simultaneous closure ?\n        s->seq++;                               // Yes. Increment our SEQ\n      } else {                                  // Otherwise,\n        s->seq = mg_htonl(pkt->tcp->ack);       // Set to peer's ACK\n      }\n      s->twclosure = true;\n    } else {\n      flags |= TH_FIN;\n      c->is_draining = 1;\n      settmout(c, MIP_TTYPE_FIN);\n    }\n    tx_tcp(c->mgr->ifp, s->mac, &c->loc, &c->rem, flags, mg_htonl(s->seq),\n           mg_htonl(s->ack), \"\", 0);\n    if (pkt->pay.len == 0) return;  // if no data, we're done\n  } else if (pkt->pay.len <= 1 && mg_ntohl(pkt->tcp->seq) == s->ack - 1) {\n    // Keep-Alive (RFC-9293 3.8.4, allow erroneous implementations)\n    MG_VERBOSE((\"%lu keepalive ACK\", c->id));\n    tx_tcp(c->mgr->ifp, s->mac, &c->loc, &c->rem, TH_ACK, mg_htonl(s->seq),\n           mg_htonl(s->ack), NULL, 0);\n    return;                        // no data to process\n  } else if (pkt->pay.len == 0) {  // this is an ACK\n    if (s->fin_rcvd && s->ttype == MIP_TTYPE_FIN) s->twclosure = true;\n    return;  // no data to process\n  } else if (seq != s->ack) {\n    uint32_t ack = (uint32_t) (mg_htonl(pkt->tcp->seq) + pkt->pay.len);\n    if (s->ack == ack) {\n      MG_VERBOSE((\"ignoring duplicate pkt\"));\n    } else {\n      MG_VERBOSE((\"SEQ != ACK: %x %x %x\", seq, s->ack, ack));\n      tx_tcp(c->mgr->ifp, s->mac, &c->loc, &c->rem, TH_ACK, mg_htonl(s->seq),\n             mg_htonl(s->ack), \"\", 0);\n    }\n    return;  // drop it\n  } else if (io->size - io->len < pkt->pay.len &&\n             !mg_iobuf_resize(io, io->len + pkt->pay.len)) {\n    mg_error(c, \"oom\");\n    return;  // drop it\n  }\n  // Copy TCP payload into the IO buffer. If the connection is plain text,\n  // we copy to c->recv. If the connection is TLS, this data is encrypted,\n  // therefore we copy that encrypted data to the c->rtls iobuffer instead,\n  // and then call mg_tls_recv() to decrypt it. NOTE: mg_tls_recv() will\n  // call back mg_io_recv() which grabs raw data from c->rtls\n  memcpy(&io->buf[io->len], pkt->pay.buf, pkt->pay.len);\n  io->len += pkt->pay.len;\n  MG_VERBOSE((\"%lu SEQ %x -> %x\", c->id, mg_htonl(pkt->tcp->seq), s->ack));\n  // Advance ACK counter\n  s->ack = (uint32_t) (mg_htonl(pkt->tcp->seq) + pkt->pay.len);\n  s->unacked += pkt->pay.len;\n  // size_t diff = s->acked <= s->ack ? s->ack - s->acked : s->ack;\n  if (s->unacked > MG_TCPIP_WIN / 2 && s->acked != s->ack) {\n    // Send ACK immediately\n    MG_VERBOSE((\"%lu imm ACK %lu\", c->id, s->acked));\n    tx_tcp(c->mgr->ifp, s->mac, &c->loc, &c->rem, TH_ACK, mg_htonl(s->seq),\n           mg_htonl(s->ack), NULL, 0);\n    s->unacked = 0;\n    s->acked = s->ack;\n    if (s->ttype != MIP_TTYPE_KEEPALIVE) settmout(c, MIP_TTYPE_KEEPALIVE);\n  } else {\n    // if not already running, setup a timer to send an ACK later\n    if (s->ttype != MIP_TTYPE_ACK) settmout(c, MIP_TTYPE_ACK);\n  }\n  if (c->is_tls) {\n    c->is_tls_hs ? mg_tls_handshake(c) : handle_tls_recv(c);\n  } else {\n    // Plain text connection, data is already in c->recv, trigger MG_EV_READ\n    mg_call(c, MG_EV_READ, &pkt->pay.len);\n  }\n}\n\n// TCP backlog\nstruct mg_backlog {\n  uint16_t port, mss;  // use port=0 for available entries\n  uint8_t age;\n};\n\nstatic int backlog_insert(struct mg_connection *c, uint16_t port,\n                          uint16_t mss) {\n  struct mg_backlog *p = (struct mg_backlog *) c->data;\n  size_t i;\n  for (i = 0; i < sizeof(c->data) / sizeof(*p); i++) {\n    if (p[i].port != 0) continue;\n    p[i].age = 2;  // remove after two calls, average 1.5 call rate\n    p[i].port = port, p[i].mss = mss;\n    return (int) i;\n  }\n  return -1;\n}\n\nstatic struct mg_backlog *backlog_retrieve(struct mg_connection *c,\n                                           uint16_t key, uint16_t port) {\n  struct mg_backlog *p = (struct mg_backlog *) c->data;\n  if (key >= sizeof(c->data) / sizeof(*p)) return NULL;\n  if (p[key].port != port) return NULL;\n  p += key;\n  return p;\n}\n\nstatic void backlog_remove(struct mg_connection *c, uint16_t key) {\n  struct mg_backlog *p = (struct mg_backlog *) c->data;\n  p[key].port = 0;\n}\n\nstatic void backlog_maintain(struct mg_connection *c) {\n  struct mg_backlog *p = (struct mg_backlog *) c->data;\n  size_t i;  // dec age and remove those where it reaches 0\n  for (i = 0; i < sizeof(c->data) / sizeof(*p); i++) {\n    if (p[i].port == 0) continue;\n    if (p[i].age != 0) --p[i].age;\n    if (p[i].age == 0) p[i].port = 0;\n  }\n}\n\nstatic void backlog_poll(struct mg_mgr *mgr) {\n  struct mg_connection *c = NULL;\n  for (c = mgr->conns; c != NULL; c = c->next) {\n    if (!c->is_udp && c->is_listening) backlog_maintain(c);\n  }\n}\n\n// process options (MSS)\nstatic void handle_opt(struct connstate *s, struct tcp *tcp, bool ip6) {\n  uint8_t *opts = (uint8_t *) (tcp + 1);\n  int len = 4 * ((int) (tcp->off >> 4) - ((int) sizeof(*tcp) / 4));\n  s->dmss = ip6 ? 1220 : 536;  // assume default, RFC-9293 3.7.1\n  while (len > 0) {            // RFC-9293 3.1 3.2\n    uint8_t kind = opts[0], optlen = 1;\n    if (kind != 1) {         // No-Operation\n      if (kind == 0) break;  // End of Option List\n      optlen = opts[1];\n      if (kind == 2 && optlen == 4)  // set received MSS\n        s->dmss = (uint16_t) (((uint16_t) opts[2] << 8) + opts[3]);\n    }\n    MG_VERBOSE((\"kind: %u, optlen: %u, len: %d\\n\", kind, optlen, len));\n    opts += optlen;\n    len -= optlen;\n  }\n}\n\nstatic void rx_tcp(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  struct mg_connection *c = getpeer(ifp->mgr, pkt, false);\n  struct connstate *s = c == NULL ? NULL : (struct connstate *) (c + 1);\n#if MG_ENABLE_IPV6  // matching of v4/v6 to dest is done by getpeer()\n  if (pkt->ip6 != NULL && !tcp6csum_ok(pkt->ip6, pkt->tcp)) return;\n#endif\n  if (pkt->ip != NULL && !tcpcsum_ok(pkt->ip, pkt->tcp)) return;\n  pkt->tcp->flags &= TH_STDFLAGS;  // tolerate creative usage (ECN, ?)\n  // Order is VERY important; RFC-9293 3.5.2\n  // - check clients (Group 1) and established connections (Group 3)\n  if (c != NULL && c->is_connecting && pkt->tcp->flags == (TH_SYN | TH_ACK)) {\n    // client got a server connection accept\n    handle_opt(s, pkt->tcp, pkt->ip6 != NULL);  // process options (MSS)\n    s->seq = mg_ntohl(pkt->tcp->ack), s->ack = mg_ntohl(pkt->tcp->seq) + 1;\n    tx_tcp_ctrlresp(ifp, pkt, TH_ACK, pkt->tcp->ack);\n    c->is_connecting = 0;  // Client connected\n    settmout(c, MIP_TTYPE_KEEPALIVE);\n    mg_call(c, MG_EV_CONNECT, NULL);  // Let user know\n    if (c->is_tls_hs) mg_tls_handshake(c);\n    if (!c->is_tls_hs) c->is_tls = 0;  // user did not call mg_tls_init()\n  } else if (c != NULL && c->is_connecting && pkt->tcp->flags != TH_ACK) {\n    mg_error(c, \"connection refused\");\n  } else if (c != NULL && pkt->tcp->flags & TH_RST) {\n    // TODO(): validate RST is within window (and optional with proper ACK)\n    mg_error(c, \"peer RST\");  // RFC-1122 4.2.2.13\n  } else if (c != NULL) {\n    // process segment\n    s->tmiss = 0;                         // Reset missed keep-alive counter\n    if (s->ttype == MIP_TTYPE_KEEPALIVE)  // Advance keep-alive timer\n      settmout(c,\n               MIP_TTYPE_KEEPALIVE);  // unless a former ACK timeout is pending\n    read_conn(c, pkt);  // Override timer with ACK timeout if needed\n  } else\n    // - we don't listen on that port; RFC-9293 3.5.2 Group 1\n    // - check listening connections; RFC-9293 3.5.2 Group 2\n    if ((c = getpeer(ifp->mgr, pkt, true)) == NULL) {\n      // not listening on that port\n      if (!(pkt->tcp->flags & TH_RST)) {\n        tx_tcp_rst(ifp, pkt, pkt->tcp->flags & TH_ACK);\n      }  // else silently discard\n    } else if (pkt->tcp->flags == TH_SYN) {\n      // listener receives a connection request\n      struct connstate cs;  // At this point, s = NULL, there is no connection\n      int key;\n      uint32_t isn;\n      if (pkt->tcp->sport != 0) {\n        handle_opt(&cs, pkt->tcp, pkt->ip6 != NULL);  // process options (MSS)\n        key = backlog_insert(c, pkt->tcp->sport,\n                             cs.dmss);  // backlog options (MSS)\n        if (key < 0) return;  // no room in backlog, discard SYN, client retries\n        // Use peer's src port and bl key as ISN, to later identify the\n        // handshake\n        isn = (mg_htonl(((uint32_t) key << 16) | mg_ntohs(pkt->tcp->sport)));\n        if (tx_tcp_ctrlresp(ifp, pkt, TH_SYN | TH_ACK, isn) == 0)\n          backlog_remove(c, (uint16_t) key);  // safety net for lousy networks\n      }  // what should we do when port=0 ? Linux takes port 0 as any other\n         // port\n    } else if (pkt->tcp->flags == TH_ACK) {\n      // listener receives an ACK\n      struct mg_backlog *b = NULL;\n      if ((uint16_t) (mg_htonl(pkt->tcp->ack) - 1) ==\n          mg_htons(pkt->tcp->sport)) {\n        uint16_t key = (uint16_t) ((mg_htonl(pkt->tcp->ack) - 1) >> 16);\n        b = backlog_retrieve(c, key, pkt->tcp->sport);\n        if (b != NULL) {                // ACK is a response to a SYN+ACK\n          accept_conn(c, pkt, b->mss);  // pass options\n          backlog_remove(c, key);\n        }  // else not an actual match, reset\n      }\n      if (b == NULL) tx_tcp_rst(ifp, pkt, true);\n    } else if (pkt->tcp->flags & TH_RST) {\n      // silently discard\n    } else if (pkt->tcp->flags & TH_ACK) {  // ACK + something else != RST\n      tx_tcp_rst(ifp, pkt, true);\n    } else if (pkt->tcp->flags & TH_SYN) {  // SYN + something else != ACK\n      tx_tcp_rst(ifp, pkt, false);\n    }  // else  silently discard\n}\n\nstatic void rx_ip(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  uint8_t ihl;\n  uint16_t frag, len;\n  if (pkt->pay.len < sizeof(*pkt->ip)) return;  // Truncated\n  if ((pkt->ip->ver >> 4) != 4) return;         // Not IP\n  ihl = pkt->ip->ver & 0x0F;\n  if (ihl < 5) return;                              // bad IHL\n  if (pkt->pay.len < (uint16_t) (ihl * 4)) return;  // Truncated / malformed\n  // There can be link padding, take length from IP header\n  len = mg_ntohs(pkt->ip->len);  // IP datagram length\n  if (len < (uint16_t) (ihl * 4) || len > pkt->pay.len) return;  // malformed\n  pkt->pay.len = len;                      // strip padding\n  mkpay(pkt, (uint32_t *) pkt->ip + ihl);  // account for opts\n  if (!ipcsum_ok(pkt->ip)) return;\n  frag = mg_ntohs(pkt->ip->frag);\n  if (frag & IP_MORE_FRAGS_MSK || frag & IP_FRAG_OFFSET_MSK) {\n    struct mg_connection *c;\n    if (pkt->ip->proto == 17) pkt->udp = (struct udp *) (pkt->pay.buf);\n    if (pkt->ip->proto == 6) pkt->tcp = (struct tcp *) (pkt->pay.buf);\n    c = getpeer(ifp->mgr, pkt, false);\n    if (c) mg_error(c, \"Received fragmented packet\");\n  } else if (pkt->ip->proto == 1) {\n    pkt->icmp = (struct icmp *) (pkt->pay.buf);\n    if (pkt->pay.len < sizeof(*pkt->icmp)) return;\n    mkpay(pkt, pkt->icmp + 1);\n    rx_icmp(ifp, pkt);\n  } else if (pkt->ip->proto == 17) {\n    pkt->udp = (struct udp *) (pkt->pay.buf);\n    if (pkt->pay.len < sizeof(*pkt->udp)) return;  // truncated\n    // Take length from UDP header\n    len = mg_ntohs(pkt->udp->len);  // UDP datagram length\n    if (len < sizeof(*pkt->udp) || len > pkt->pay.len) return;  // malformed\n    pkt->pay.len = len;  // strip excess data\n    mkpay(pkt, pkt->udp + 1);\n    MG_VERBOSE((\"UDP %M:%hu -> %M:%hu len %u\", mg_print_ip4, &pkt->ip->src,\n                mg_ntohs(pkt->udp->sport), mg_print_ip4, &pkt->ip->dst,\n                mg_ntohs(pkt->udp->dport), (int) pkt->pay.len));\n    if (ifp->enable_dhcp_client && pkt->udp->dport == mg_htons(68)) {\n      pkt->dhcp = (struct dhcp *) (pkt->udp + 1);\n      mkpay(pkt, &pkt->dhcp->options);\n      rx_dhcp_client(ifp, pkt);\n    } else if (ifp->enable_dhcp_server && pkt->udp->dport == mg_htons(67)) {\n      pkt->dhcp = (struct dhcp *) (pkt->udp + 1);\n      mkpay(pkt, &pkt->dhcp->options);\n      rx_dhcp_server(ifp, pkt);\n    } else if (!rx_udp(ifp, pkt)) {\n      // Should send ICMP Destination Unreachable for unicasts, but keep\n      // silent\n    }\n  } else if (pkt->ip->proto == 6) {\n    uint8_t off;\n    pkt->tcp = (struct tcp *) (pkt->pay.buf);\n    if (pkt->pay.len < sizeof(*pkt->tcp)) return;\n    off = pkt->tcp->off >> 4;  // account for opts\n    if (pkt->pay.len < (uint16_t) (4 * off)) return;\n    mkpay(pkt, (uint32_t *) pkt->tcp + off);\n    MG_VERBOSE((\"TCP %M:%hu -> %M:%hu len %u\", mg_print_ip4, &pkt->ip->src,\n                mg_ntohs(pkt->tcp->sport), mg_print_ip4, &pkt->ip->dst,\n                mg_ntohs(pkt->tcp->dport), (int) pkt->pay.len));\n    rx_tcp(ifp, pkt);\n  } else {\n    MG_DEBUG((\"Unknown IP proto %x\", (int) pkt->ip->proto));\n    if (mg_log_level >= MG_LL_VERBOSE)\n      mg_hexdump(pkt->ip, pkt->pay.len >= 32 ? 32 : pkt->pay.len);\n  }\n}\n\n#if MG_ENABLE_IPV6\nstatic void rx_ip6(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  uint16_t len = 0, plen;\n  uint8_t next, *nhdr;\n  bool loop = true;\n  if (pkt->pay.len < sizeof(*pkt->ip6)) return;  // Truncated\n  if ((pkt->ip6->ver >> 4) != 0x6) return;       // Not IPv6\n  plen = mg_ntohs(pkt->ip6->plen);\n  if (plen > (pkt->pay.len - sizeof(*pkt->ip6))) return;  // malformed\n  next = pkt->ip6->next;\n  nhdr = (uint8_t *) (pkt->ip6 + 1);\n  while (loop) {\n    switch (next) {\n      case 0:   // Hop-by-Hop 4.3\n      case 43:  // Routing 4.4\n      case 60:  // Destination Options 4.6\n      case 51:  // Authentication RFC-4302\n        MG_INFO((\"IPv6 extension header %d\", (int) next));\n        next = nhdr[0];\n        len += (uint16_t) (8 * (nhdr[1] + 1));\n        nhdr += 8 * (nhdr[1] + 1);\n        break;\n      case 44:  // Fragment 4.5\n      {\n        struct mg_connection *c;\n        if (nhdr[0] == 17) pkt->udp = (struct udp *) (pkt->pay.buf);\n        if (nhdr[0] == 6) pkt->tcp = (struct tcp *) (pkt->pay.buf);\n        c = getpeer(ifp->mgr, pkt, false);\n        if (c) mg_error(c, \"Received fragmented packet\");\n      }\n        return;\n      case 59:  // No Next Header 4.7\n        return;\n      case 50:  // IPsec ESP RFC-4303, unsupported\n      default:\n        loop = false;\n        break;\n    }\n  }\n  if (len >= plen) return;\n  // There can be link padding, take payload length from IPv6 header - options\n  pkt->pay.buf = (char *) nhdr;\n  pkt->pay.len = plen - len;\n  if (next == 58) {\n    pkt->icmp6 = (struct icmp6 *) (pkt->pay.buf);\n    if (pkt->pay.len < sizeof(*pkt->icmp6)) return;\n    mkpay(pkt, pkt->icmp6 + 1);\n    MG_DEBUG((\"ICMPv6 %M -> %M len %u\", mg_print_ip6, &pkt->ip6->src,\n              mg_print_ip6, &pkt->ip6->dst, (int) pkt->pay.len));\n    rx_icmp6(ifp, pkt);\n  } else if (next == 17) {\n    pkt->udp = (struct udp *) (pkt->pay.buf);\n    if (pkt->pay.len < sizeof(*pkt->udp)) return;\n    // Take length from UDP header\n    len = mg_ntohs(pkt->udp->len);  // UDP datagram length\n    if (len < sizeof(*pkt->udp) || len > pkt->pay.len) return;  // malformed\n    pkt->pay.len = len;  // strip excess data\n    mkpay(pkt, pkt->udp + 1);\n    MG_DEBUG((\"UDP %M:%hu -> %M:%hu len %u\", mg_print_ip6, &pkt->ip6->src,\n              mg_ntohs(pkt->udp->sport), mg_print_ip6, &pkt->ip6->dst,\n              mg_ntohs(pkt->udp->dport), (int) pkt->pay.len));\n    if (ifp->enable_dhcp6_client && pkt->udp->dport == mg_htons(546)) {\n      pkt->dhcp6 = (struct dhcp6 *) (pkt->udp + 1);\n      mkpay(pkt, pkt->dhcp6 + 1);\n      // rx_dhcp6_client(ifp, pkt);\n#if 0\n    } else if (ifp->enable_dhcp_server && pkt->udp->dport == mg_htons(547)) {\n      pkt->dhcp6 = (struct dhcp6 *) (pkt->udp + 1);\n      mkpay(pkt, pkt->dhcp6 + 1);\n      rx_dhcp6_server(ifp, pkt);\n#endif\n    } else if (!rx_udp(ifp, pkt)) {\n      // Should send ICMPv6 Destination Unreachable for unicasts, keep silent\n    }\n  } else if (next == 6) {\n    uint8_t off;\n    pkt->tcp = (struct tcp *) (pkt->pay.buf);\n    if (pkt->pay.len < sizeof(*pkt->tcp)) return;\n    off = pkt->tcp->off >> 4;  // account for opts\n    if (pkt->pay.len < (uint16_t) (4 * off)) return;\n    mkpay(pkt, (uint32_t *) pkt->tcp + off);\n    MG_DEBUG((\"TCP %M:%hu -> %M:%hu len %u\", mg_print_ip6, &pkt->ip6->src,\n              mg_ntohs(pkt->tcp->sport), mg_print_ip6, &pkt->ip6->dst,\n              mg_ntohs(pkt->tcp->dport), (int) pkt->pay.len));\n    rx_tcp(ifp, pkt);\n  } else {\n    MG_DEBUG((\"Unknown IPv6 next hdr %x\", (int) next));\n    if (mg_log_level >= MG_LL_VERBOSE)\n      mg_hexdump(pkt->ip6, pkt->pay.len >= 32 ? 32 : pkt->pay.len);\n  }\n}\n#else\n#define rx_ip6(x, y)\n#endif\n\nstatic void mg_tcpip_rx(struct mg_tcpip_if *ifp, void *buf, size_t len) {\n  struct pkt pkt;\n  enum mg_l2proto proto;\n  memset(&pkt, 0, sizeof(pkt));\n  pkt.raw.buf = (char *) buf;\n  pkt.raw.len = len;\n  pkt.l2 = (uint8_t *) pkt.raw.buf;\n  if (!mg_l2_rx(ifp, &proto, &pkt.pay, &pkt.raw)) return;\n  if (proto == MG_TCPIP_L2PROTO_ARP) {\n    pkt.arp = (struct arp *) (pkt.pay.buf);\n    if (pkt.pay.len < sizeof(*pkt.arp)) return;  // Truncated\n    mg_tcpip_call(ifp, MG_TCPIP_EV_ARP, &pkt.raw);\n    rx_arp(ifp, &pkt);\n  } else if (proto == MG_TCPIP_L2PROTO_IPV6) {\n    pkt.ip6 = (struct ip6 *) (pkt.pay.buf);\n    rx_ip6(ifp, &pkt);\n  } else if (proto == MG_TCPIP_L2PROTO_IPV4) {\n    pkt.ip = (struct ip *) (pkt.pay.buf);\n    rx_ip(ifp, &pkt);\n  }\n}\n\nstatic void mg_ip_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->state == MG_TCPIP_STATE_DOWN) return;\n  // DHCP RFC-2131 (4.4)\n  if (ifp->enable_dhcp_client && s1) {\n    if (ifp->state == MG_TCPIP_STATE_UP) {\n      tx_dhcp_discover(ifp);  // INIT (4.4.1)\n    } else if (ifp->state == MG_TCPIP_STATE_READY &&\n               ifp->lease_expire > 0) {  // BOUND / RENEWING / REBINDING\n      if (ifp->now >= ifp->lease_expire) {\n        ifp->state = MG_TCPIP_STATE_UP, ifp->ip = 0;  // expired, release IP\n        onstatechange(ifp);\n      } else if (ifp->now + 30UL * 60UL * 1000UL > ifp->lease_expire &&\n                 ((ifp->now / 1000) % 60) == 0) {\n        // hack: 30 min before deadline, try to rebind (4.3.6) every min\n        tx_dhcp_request_re(\n            ifp, mg_l2_mapip(ifp->l2type, MG_TCPIP_L2ADDR_BCAST, NULL), ifp->ip,\n            0xffffffff);\n      }  // TODO(): Handle T1 (RENEWING) and T2 (REBINDING) (4.4.5)\n    }\n  }\n}\nstatic void mg_ip_link(struct mg_tcpip_if *ifp, bool up) {\n  bool current = ifp->state != MG_TCPIP_STATE_DOWN;\n  if (!up && ifp->enable_dhcp_client) ifp->ip = 0;\n  if (up != current) {  // link state has changed\n    ifp->state = up == false                               ? MG_TCPIP_STATE_DOWN\n                 : ifp->enable_dhcp_client || ifp->ip == 0 ? MG_TCPIP_STATE_UP\n                                                           : MG_TCPIP_STATE_IP;\n    onstatechange(ifp);\n  } else if (!ifp->enable_dhcp_client && ifp->state == MG_TCPIP_STATE_UP &&\n             ifp->ip) {\n    ifp->state = MG_TCPIP_STATE_IP;  // ifp->fn has set an IP\n    onstatechange(ifp);\n  }\n}\n\n#if MG_ENABLE_IPV6\nstatic void mg_ip6_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->state6 == MG_TCPIP_STATE_DOWN) return;\n  if (ifp->enable_slaac && s1 && ifp->state6 == MG_TCPIP_STATE_UP)\n    tx_ndp_rs(ifp);\n}\nstatic void mg_ip6_link(struct mg_tcpip_if *ifp, bool up) {\n  bool current = ifp->state6 != MG_TCPIP_STATE_DOWN;\n  if (!up && ifp->enable_slaac) ifp->ip6[0] = ifp->ip6[1] = 0;\n  if (up != current) {  // link state has changed\n    ifp->state6 = !up                                     ? MG_TCPIP_STATE_DOWN\n                  : ifp->enable_slaac || ifp->ip6[0] == 0 ? MG_TCPIP_STATE_UP\n                                                          : MG_TCPIP_STATE_IP;\n    onstate6change(ifp);\n  } else if (!ifp->enable_slaac && ifp->state6 == MG_TCPIP_STATE_UP &&\n             ifp->ip6[0]) {\n    ifp->state6 = MG_TCPIP_STATE_IP;  // ifp->fn has set an IP\n    onstate6change(ifp);\n  }\n}\n#else\n#define mg_ip6_poll(x, y)\n#define mg_ip6_link(x, y)\n#endif\n\nstatic void mg_tcpip_poll(struct mg_tcpip_if *ifp, uint64_t now) {\n  struct mg_connection *c;\n  bool expired_1000ms = mg_timer_expired(&ifp->timer_1000ms, 1000, now);\n  ifp->now = now;\n\n  if (expired_1000ms) {\n#if MG_ENABLE_TCPIP_PRINT_DEBUG_STATS\n    const char *names[] = {\"down\", \"up\", \"req\", \"ip\", \"ready\"};\n    size_t max = sizeof(names) / sizeof(char *);\n    unsigned int state = ifp->state >= max ? max - 1 : ifp->state;\n    MG_INFO((\"Status: %s, IP: %M, rx:%u, tx:%u, dr:%u, er:%u\", names[state],\n             mg_print_ip4, &ifp->ip, ifp->nrecv, ifp->nsent, ifp->ndrop,\n             ifp->nerr));\n#if MG_ENABLE_IPV6\n    state = ifp->state6 >= max ? max - 1 : ifp->state6;\n    if (state > MG_TCPIP_STATE_UP)\n      MG_INFO((\"Status: %s, IPv6: %M\", names[state], mg_print_ip6, &ifp->ip6));\n#endif\n#endif\n    backlog_poll(ifp->mgr);\n  }\n  // Handle gw ARP request timeout, order is important\n  if (expired_1000ms && ifp->state == MG_TCPIP_STATE_IP) {\n    ifp->state = MG_TCPIP_STATE_READY;  // keep best-effort MAC or poison mark\n    onstatechange(ifp);\n  }\n  if (expired_1000ms && ifp->state == MG_TCPIP_STATE_READY && !ifp->gw_ready &&\n      ifp->gw != 0)\n    mg_tcpip_arp_request(ifp, ifp->gw, NULL);  // retry GW ARP request\n#if MG_ENABLE_IPV6\n  // Handle gw NS/NA req/resp timeout, order is important\n  if (expired_1000ms && ifp->state6 == MG_TCPIP_STATE_IP) {\n    ifp->state6 = MG_TCPIP_STATE_READY;  // keep best-effort MAC or poison mark\n    onstate6change(ifp);\n  }\n  if (expired_1000ms && ifp->state == MG_TCPIP_STATE_READY && !ifp->gw6_ready &&\n      (ifp->gw6[0] != 0 || ifp->gw6[1] != 0))\n    tx_ndp_ns(ifp, ifp->gw6, NULL);  // retry GW hwaddr resolution\n#endif\n\n  // poll driver\n  if (ifp->driver->poll) {\n    bool up = ifp->driver->poll(ifp, expired_1000ms);\n    // Handle physical interface up/down status, ifp->state rules over state6\n    if (expired_1000ms) {\n      mg_ip_link(ifp, up);   // Handle IPv4\n      mg_ip6_link(ifp, up);  // Handle IPv6\n      if (ifp->state == MG_TCPIP_STATE_DOWN) MG_ERROR((\"Network is down\"));\n      mg_tcpip_call(ifp, MG_TCPIP_EV_TIMER_1S, NULL);\n    }\n  }\n\n  mg_ip_poll(ifp, expired_1000ms);   // Handle IPv4\n  mg_ip6_poll(ifp, expired_1000ms);  // Handle IPv6\n\n  if (ifp->state == MG_TCPIP_STATE_DOWN) return;\n  // Read data from the network\n  if (ifp->driver->rx != NULL) {  // Simple polling driver, returns one frame\n    size_t len =\n        ifp->driver->rx(ifp->recv_queue.buf, ifp->recv_queue.size, ifp);\n    if (len > 0) {\n      ifp->nrecv++;\n      mg_tcpip_rx(ifp, ifp->recv_queue.buf, len);\n    }\n  } else {  // Complex poll / Interrupt-based driver. Queues recvd frames\n    char *buf;\n    size_t len, cnt = 7;  // Max 7 packets to fetch\n    while (cnt-- > 0 && (len = mg_queue_next(&ifp->recv_queue, &buf)) > 0) {\n      mg_tcpip_rx(ifp, buf, len);\n      mg_queue_del(&ifp->recv_queue, len);\n    }\n  }\n\n  // Process timeouts\n  for (c = ifp->mgr->conns; c != NULL; c = c->next) {\n    struct connstate *s = (struct connstate *) (c + 1);\n    if ((c->is_udp && !c->is_arplooking) || c->is_listening || c->is_resolving)\n      continue;\n    if (ifp->now > s->timer) {\n      if (s->ttype == MIP_TTYPE_ARP) {\n        mg_error(c, \"ARP timeout\");\n      } else if (c->is_udp) {\n        continue;\n      } else if (s->ttype == MIP_TTYPE_ACK && s->acked != s->ack) {\n        MG_VERBOSE((\"%lu ack %x %x\", c->id, s->seq, s->ack));\n        tx_tcp(ifp, s->mac, &c->loc, &c->rem, TH_ACK, mg_htonl(s->seq),\n               mg_htonl(s->ack), NULL, 0);\n        s->acked = s->ack;\n      } else if (s->ttype == MIP_TTYPE_SYN) {\n        mg_error(c, \"Connection timeout\");\n      } else if (s->ttype == MIP_TTYPE_FIN) {\n        c->is_closing = 1;\n        continue;\n      } else {\n        if (s->tmiss++ > 2) {\n          mg_error(c, \"keepalive\");\n        } else {\n          MG_VERBOSE((\"%lu keepalive\", c->id));\n          tx_tcp(ifp, s->mac, &c->loc, &c->rem, TH_ACK, mg_htonl(s->seq - 1),\n                 mg_htonl(s->ack), NULL, 0);\n        }\n      }\n\n      settmout(c, MIP_TTYPE_KEEPALIVE);\n    }\n  }\n}\n\n// This function executes in interrupt context, thus it should copy data\n// somewhere fast. Note that newlib's malloc is not thread safe, thus use\n// our lock-free queue with preallocated buffer to copy data and return asap\nvoid mg_tcpip_qwrite(void *buf, size_t len, struct mg_tcpip_if *ifp) {\n  char *p;\n  if (mg_queue_book(&ifp->recv_queue, &p, len) >= len) {\n    memcpy(p, buf, len);\n    mg_queue_add(&ifp->recv_queue, len);\n    ifp->nrecv++;\n  } else {\n    ifp->ndrop++;\n  }\n}\n\nvoid mg_tcpip_init(struct mg_mgr *mgr, struct mg_tcpip_if *ifp) {\n  // If L2 address is not set, make a random one; fill MTU\n  mg_l2_init(ifp->l2type, ifp->mac, &ifp->mtu, &ifp->framesize);\n\n  if (ifp->dhcp_name[0] == '\\0')  // If DHCP name is not set, use \"mip\"\n    memcpy(ifp->dhcp_name, \"mip\", 4);\n  ifp->dhcp_name[sizeof(ifp->dhcp_name) - 1] = '\\0';  // Just in case\n\n  if (ifp->driver->init && !ifp->driver->init(ifp)) {\n    MG_ERROR((\"driver init failed\"));\n  } else {\n    ifp->tx.buf = (char *) mg_calloc(1, ifp->framesize),\n    ifp->tx.len = ifp->framesize;\n    if (ifp->recv_queue.size == 0)\n      ifp->recv_queue.size = ifp->driver->rx ? ifp->framesize : 8192;\n    ifp->recv_queue.buf = (char *) mg_calloc(1, ifp->recv_queue.size);\n    ifp->timer_1000ms = mg_millis();\n    mgr->ifp = ifp;\n    ifp->mgr = mgr;\n    mgr->extraconnsize = sizeof(struct connstate);\n    if (ifp->ip == 0) ifp->enable_dhcp_client = true;\n    mg_random(&ifp->eport, sizeof(ifp->eport));  // Random from 0 to 65535\n    ifp->eport |= MG_EPHEMERAL_PORT_BASE;        // Random from\n                                           // MG_EPHEMERAL_PORT_BASE to 65535\n#if MG_ENABLE_IPV6\n    if (ifp->ip6ll[0] == 0 && ifp->ip6ll[1] == 0) {    // gen link-local address\n      uint8_t px[8] = {0xfe, 0x80, 0, 0, 0, 0, 0, 0};  // RFC-4291 2.5.6\n      mg_l2_genip6(ifp->l2type, ifp->ip6ll, 64, ifp->mac);\n      memcpy(ifp->ip6ll, px, 8);  // RFC-4291 2.5.4\n    }  // just got our link local address if we didn't.\n    // If static configuration is used, global addresses,\n    // prefix length, and gw are already filled at this point.\n    if (ifp->ip6[0] == 0 && ifp->ip6[1] == 0) ifp->enable_slaac = true;\n#endif\n    if (ifp->tx.buf == NULL || ifp->recv_queue.buf == NULL) MG_ERROR((\"OOM\"));\n  }\n}\n\nvoid mg_tcpip_free(struct mg_tcpip_if *ifp) {\n  mg_free(ifp->recv_queue.buf);\n  mg_free(ifp->tx.buf);\n  mg_free(ifp->dns4_url);\n}\n\nstatic void send_syn(struct mg_connection *c) {\n  struct connstate *s = (struct connstate *) (c + 1);\n  uint32_t isn = mg_htonl((uint32_t) mg_ntohs(c->loc.port));\n  tx_tcp(c->mgr->ifp, s->mac, &c->loc, &c->rem, TH_SYN, isn, 0, NULL, 0);\n}\n\nstatic void l2addr_resolved(struct mg_connection *c) {\n  if (c->is_udp) {\n    c->is_connecting = 0;\n    mg_call(c, MG_EV_CONNECT, NULL);\n  } else {\n    send_syn(c);\n    settmout(c, MIP_TTYPE_SYN);\n  }\n}\n\nvoid mg_connect_resolved(struct mg_connection *c) {\n  struct mg_tcpip_if *ifp = c->mgr->ifp;\n  uint8_t *l2addr;\n  c->is_resolving = 0;\n  if (ifp->eport < MG_EPHEMERAL_PORT_BASE) ifp->eport = MG_EPHEMERAL_PORT_BASE;\n  c->loc.port = mg_htons(ifp->eport++);\n#if MG_ENABLE_IPV6\n  if (c->rem.is_ip6) {\n    c->loc.addr.ip6[0] = ifp->ip6[0], c->loc.addr.ip6[1] = ifp->ip6[1],\n    c->loc.is_ip6 = true;\n  } else\n#endif\n  {\n    c->loc.addr.ip4 = ifp->ip;\n  }\n  MG_DEBUG((\"%lu %M -> %M\", c->id, mg_print_ip_port, &c->loc, mg_print_ip_port,\n            &c->rem));\n  mg_call(c, MG_EV_RESOLVE, NULL);\n  c->is_connecting = 1;\n  if (c->is_udp && (l2addr = tcpip_mapip(ifp, &c->rem)) != NULL) {\n    struct connstate *s = (struct connstate *) (c + 1);\n    memcpy(s->mac, l2addr, sizeof(s->mac));\n    l2addr_resolved(c);  // broadcast or multicast\n#if MG_ENABLE_IPV6\n  } else if (c->rem.is_ip6) {\n    if (match_prefix((uint8_t *) c->rem.addr.ip6, ifp->prefix,\n                     ifp->prefix_len)                       // same global LAN\n        || (c->rem.addr.ip6[0] == ifp->ip6ll[0]             // same local LAN\n            && !MG_IP6MATCH(c->rem.addr.ip6, ifp->gw6))) {  // and not gw\n      // If we're in the same LAN, fire a Neighbor Solicitation\n      MG_DEBUG((\"%lu NS lookup...\", c->id));\n      tx_ndp_ns(ifp, c->rem.addr.ip6, NULL);  // RFC-4861 4.3, requesting\n      settmout(c, MIP_TTYPE_ARP);\n      c->is_arplooking = 1;\n    } else if (ifp->gw6_ready) {\n      struct connstate *s = (struct connstate *) (c + 1);\n      memcpy(s->mac, ifp->gw6mac, sizeof(s->mac));\n      l2addr_resolved(c);\n    } else {\n      MG_ERROR((\"No IPv6 gateway, can't connect\"));\n    }\n#endif\n  } else {\n    uint32_t rem_ip = c->rem.addr.ip4;\n    if (ifp->ip && ((rem_ip & ifp->mask) == (ifp->ip & ifp->mask)) &&\n        rem_ip != ifp->gw) {  // skip if gw (onstatechange -> ARP)\n      // If we're in the same LAN, fire an ARP lookup.\n      MG_DEBUG((\"%lu ARP lookup...\", c->id));\n      mg_tcpip_arp_request(ifp, rem_ip, NULL);\n      settmout(c, MIP_TTYPE_ARP);\n      c->is_arplooking = 1;\n    } else if (ifp->gw_ready) {\n      struct connstate *s = (struct connstate *) (c + 1);\n      memcpy(s->mac, ifp->gwmac, sizeof(s->mac));\n      l2addr_resolved(c);\n    } else {\n      MG_ERROR((\"No gateway, can't connect\"));\n    }\n  }\n}\n\nbool mg_open_listener(struct mg_connection *c, const char *url) {\n  c->loc.port = mg_htons(mg_url_port(url));\n  if (!mg_aton(mg_url_host(url), &c->loc)) {\n    MG_ERROR((\"invalid listening URL: %s\", url));\n    return false;\n  }\n  return true;\n}\n\nstatic void write_conn(struct mg_connection *c) {\n  long len = c->is_tls ? mg_tls_send(c, c->send.buf, c->send.len)\n                       : mg_io_send(c, c->send.buf, c->send.len);\n  // TODO(): mg_tls_send() may return 0 forever on steady OOM\n  if (len == MG_IO_ERR) {\n    mg_error(c, \"tx err\");\n  } else if (len > 0) {\n    mg_iobuf_del(&c->send, 0, (size_t) len);\n    mg_call(c, MG_EV_WRITE, &len);\n  }\n}\n\nstatic void init_closure(struct mg_connection *c) {\n  struct connstate *s = (struct connstate *) (c + 1);\n  if (c->is_udp == false && c->is_listening == false &&\n      c->is_connecting == false) {  // For TCP conns,\n    tx_tcp(c->mgr->ifp, s->mac, &c->loc, &c->rem, TH_FIN | TH_ACK,\n           mg_htonl(s->seq), mg_htonl(s->ack), NULL, 0);\n    settmout(c, MIP_TTYPE_FIN);\n  }\n}\n\nstatic void close_conn(struct mg_connection *c) {\n  struct connstate *s = (struct connstate *) (c + 1);\n  mg_iobuf_free(&s->raw);  // For TLS connections, release raw data\n  mg_close_conn(c);\n}\n\nstatic bool can_write(struct mg_connection *c) {\n  return c->is_connecting == 0 && c->is_resolving == 0 && c->send.len > 0 &&\n         c->is_tls_hs == 0 && c->is_arplooking == 0;\n}\n\nvoid mg_mgr_poll(struct mg_mgr *mgr, int ms) {\n  struct mg_connection *c, *tmp;\n  uint64_t now = mg_millis();\n  mg_timer_poll(&mgr->timers, now);\n  if (mgr->ifp == NULL || mgr->ifp->driver == NULL) return;\n  mg_tcpip_poll(mgr->ifp, now);\n  for (c = mgr->conns; c != NULL; c = tmp) {\n    struct connstate *s = (struct connstate *) (c + 1);\n    bool is_tls = c->is_tls && !c->is_resolving && !c->is_arplooking &&\n                  !c->is_listening && !c->is_connecting;\n    tmp = c->next;\n    mg_call(c, MG_EV_POLL, &now);\n    MG_VERBOSE((\"%lu .. %c%c%c%c%c %lu %lu\", c->id, c->is_tls ? 'T' : 't',\n                c->is_connecting ? 'C' : 'c', c->is_tls_hs ? 'H' : 'h',\n                c->is_resolving ? 'R' : 'r', c->is_closing ? 'C' : 'c',\n                mg_tls_pending(c), c->rtls.len));\n    // order is important, TLS conn close with > 1 record in buffer (below)\n    if (is_tls && (c->rtls.len > 0 || mg_tls_pending(c) > 0))\n      c->is_tls_hs ? mg_tls_handshake(c) : handle_tls_recv(c);\n    if (can_write(c)) write_conn(c);\n    if (is_tls && c->send.len == 0) mg_tls_flush(c);\n    if (c->is_draining && c->send.len == 0 && s->ttype != MIP_TTYPE_FIN)\n      init_closure(c);\n    // For non-TLS, close immediately upon completing the 3-way closure\n    // For TLS, handle any pending data (above) until MIP_TTYPE_FIN expires\n    if (s->twclosure &&\n        (!c->is_tls || (c->rtls.len == 0 && mg_tls_pending(c) == 0)))\n      c->is_closing = 1;\n    if (c->is_closing) close_conn(c);\n  }\n  (void) ms;\n}\n\nbool mg_send(struct mg_connection *c, const void *buf, size_t len) {\n  struct mg_tcpip_if *ifp = c->mgr->ifp;\n  bool res = false;\n  if (!c->loc.is_ip6 && (ifp->ip == 0 || ifp->state != MG_TCPIP_STATE_READY)) {\n    mg_error(c, \"net down\");\n#if MG_ENABLE_IPV6\n  } else if (c->loc.is_ip6 && ifp->state6 != MG_TCPIP_STATE_READY) {\n    mg_error(c, \"net down\");\n#endif\n  } else if (c->is_udp && (c->is_arplooking || c->is_resolving)) {\n    // Fail to send, no target MAC or IP\n    MG_VERBOSE((\"still resolving...\"));\n  } else if (c->is_udp) {\n    len = trim_len(c, len);  // Trimming length if necessary\n    res = udp_send(c, buf, len);\n  } else {\n    res = len == 0 || mg_iobuf_add(&c->send, c->send.len, buf, len) > 0;\n    // returning 0 means an OOM condition (iobuf couldn't resize), yet this is\n    // so far recoverable, let the caller decide\n  }\n  return res;\n}\n\nuint8_t mcast_addr[6] = {0x01, 0x00, 0x5e, 0x00, 0x00, 0xfb};\nvoid mg_multicast_add(struct mg_connection *c, char *ip) {\n  (void) ip;  // ip4/6_mcastmac(mcast_mac, &ip); ipv6 param\n  // TODO(): actual IP -> MAC; check database, update\n  c->mgr->ifp->update_mac_hash_table = true;  // mark dirty\n}\n\nbool mg_dnsc_init(struct mg_mgr *mgr, struct mg_dns *dnsc);\n\nstatic void setdns4(struct mg_tcpip_if *ifp, uint32_t *ip) {\n  struct mg_dns *dnsc;\n  mg_free(ifp->dns4_url);\n  ifp->dns4_url = mg_mprintf(\"udp://%M:53\", mg_print_ip4, ip);\n  dnsc = &ifp->mgr->dns4;\n  dnsc->url = (const char *) ifp->dns4_url;\n  MG_DEBUG((\"Set DNS URL to %s\", dnsc->url));\n  if (ifp->mgr->use_dns6) return;\n  if (dnsc->c != NULL) mg_close_conn(dnsc->c);\n  if (!mg_dnsc_init(ifp->mgr, dnsc))  // create DNS connection\n    MG_ERROR((\"DNS connection creation failed\"));\n}\n\nvoid mg_tcpip_mapip(struct mg_connection *c, struct mg_addr *ip) {\n  struct connstate *s = (struct connstate *) (c + 1);\n  uint8_t *l2addr = tcpip_mapip(c->mgr->ifp, ip);\n  if (l2addr == NULL) return;\n  memcpy(s->mac, l2addr, sizeof(s->mac));\n}\n\n#endif  // MG_ENABLE_TCPIP\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ota_ch32v307.c\"\n#endif\n\n\n\n\n#if MG_OTA == MG_OTA_CH32V307\n// RM: https://www.wch-ic.com/downloads/CH32FV2x_V3xRM_PDF.html\n\nstatic bool mg_ch32v307_write(void *, const void *, size_t);\nstatic bool mg_ch32v307_swap(void);\n\nstatic struct mg_flash s_mg_flash_ch32v307 = {\n    (void *) 0x08000000,  // Start\n    480 * 1024,           // Size, first 320k is 0-wait\n    4 * 1024,             // Sector size, 4k\n    4,                    // Align, 32 bit\n    mg_ch32v307_write,\n    mg_ch32v307_swap,\n};\n\n#define FLASH_BASE 0x40022000\n#define FLASH_ACTLR (FLASH_BASE + 0)\n#define FLASH_KEYR (FLASH_BASE + 4)\n#define FLASH_OBKEYR (FLASH_BASE + 8)\n#define FLASH_STATR (FLASH_BASE + 12)\n#define FLASH_CTLR (FLASH_BASE + 16)\n#define FLASH_ADDR (FLASH_BASE + 20)\n#define FLASH_OBR (FLASH_BASE + 28)\n#define FLASH_WPR (FLASH_BASE + 32)\n\nMG_IRAM static void flash_unlock(void) {\n  static bool unlocked;\n  if (unlocked == false) {\n    MG_REG(FLASH_KEYR) = 0x45670123;\n    MG_REG(FLASH_KEYR) = 0xcdef89ab;\n    unlocked = true;\n  }\n}\n\nMG_IRAM static void flash_wait(void) {\n  while (MG_REG(FLASH_STATR) & MG_BIT(0)) (void) 0;\n}\n\nMG_IRAM static void mg_ch32v307_erase(void *addr) {\n  // MG_INFO((\"%p\", addr));\n  flash_unlock();\n  flash_wait();\n  MG_REG(FLASH_ADDR) = (uint32_t) addr;\n  MG_REG(FLASH_CTLR) |= MG_BIT(1) | MG_BIT(6);  // PER | STRT;\n  flash_wait();\n}\n\nMG_IRAM static bool is_page_boundary(const void *addr) {\n  uint32_t val = (uint32_t) addr;\n  return (val & (s_mg_flash_ch32v307.secsz - 1)) == 0;\n}\n\nMG_IRAM static bool mg_ch32v307_write(void *addr, const void *buf, size_t len) {\n  // MG_INFO((\"%p %p %lu\", addr, buf, len));\n  // mg_hexdump(buf, len);\n  flash_unlock();\n  const uint16_t *src = (uint16_t *) buf, *end = &src[len / 2];\n  uint16_t *dst = (uint16_t *) addr;\n  MG_REG(FLASH_CTLR) |= MG_BIT(0);  // Set PG\n  // MG_INFO((\"CTLR: %#lx\", MG_REG(FLASH_CTLR)));\n  while (src < end) {\n    if (is_page_boundary(dst)) mg_ch32v307_erase(dst);\n    *dst++ = *src++;\n    flash_wait();\n  }\n  MG_REG(FLASH_CTLR) &= ~MG_BIT(0);  // Clear PG\n  return true;\n}\n\nMG_IRAM bool mg_ch32v307_swap(void) {\n  return true;\n}\n\n// just overwrite instead of swap\nMG_IRAM static void single_bank_swap(char *p1, char *p2, size_t s, size_t ss) {\n  // no stdlib calls here\n  for (size_t ofs = 0; ofs < s; ofs += ss) {\n    mg_ch32v307_write(p1 + ofs, p2 + ofs, ss);\n  }\n  *((volatile uint32_t *) 0xbeef0000) |= 1U << 7;  // NVIC_SystemReset()\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_ch32v307);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_ch32v307);\n}\n\nbool mg_ota_end(void) {\n  if (mg_ota_flash_end(&s_mg_flash_ch32v307)) {\n    // Swap partitions. Pray power does not go away\n    MG_INFO((\"Swapping partitions, size %u (%u sectors)\",\n             s_mg_flash_ch32v307.size,\n             s_mg_flash_ch32v307.size / s_mg_flash_ch32v307.secsz));\n    MG_INFO((\"Do NOT power off...\"));\n    mg_log_level = MG_LL_NONE;\n    // TODO() disable IRQ, s_flash_irq_disabled = true;\n    // Runs in RAM, will reset when finished\n    single_bank_swap(\n        (char *) s_mg_flash_ch32v307.start,\n        (char *) s_mg_flash_ch32v307.start + s_mg_flash_ch32v307.size / 2,\n        s_mg_flash_ch32v307.size / 2, s_mg_flash_ch32v307.secsz);\n  }\n  return false;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ota_dummy.c\"\n#endif\n\n\n\n#if MG_OTA == MG_OTA_NONE\nbool mg_ota_begin(size_t new_firmware_size) {\n  (void) new_firmware_size;\n  return true;\n}\nbool mg_ota_write(const void *buf, size_t len) {\n  (void) buf, (void) len;\n  return true;\n}\nbool mg_ota_end(void) {\n  return true;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ota_esp32.c\"\n#endif\n\n\n#if MG_ARCH == MG_ARCH_ESP32 && MG_OTA == MG_OTA_ESP32\n\nstatic const esp_partition_t *s_ota_update_partition;\nstatic esp_ota_handle_t s_ota_update_handle;\nstatic bool s_ota_success;\n\n// Those empty macros do nothing, but mark places in the code which could\n// potentially trigger a watchdog reboot due to the log flash erase operation\n#define disable_wdt()\n#define enable_wdt()\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  if (s_ota_update_partition != NULL) {\n    MG_ERROR((\"Update in progress. Call mg_ota_end() ?\"));\n    return false;\n  } else {\n    s_ota_success = false;\n    disable_wdt();\n    s_ota_update_partition = esp_ota_get_next_update_partition(NULL);\n    esp_err_t err = esp_ota_begin(s_ota_update_partition, new_firmware_size,\n                                  &s_ota_update_handle);\n    enable_wdt();\n    MG_DEBUG((\"esp_ota_begin(): %d\", err));\n    s_ota_success = (err == ESP_OK);\n  }\n  return s_ota_success;\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  disable_wdt();\n  esp_err_t err = esp_ota_write(s_ota_update_handle, buf, len);\n  enable_wdt();\n  MG_INFO((\"esp_ota_write(): %d\", err));\n  s_ota_success = err == ESP_OK;\n  return s_ota_success;\n}\n\nbool mg_ota_end(void) {\n  esp_err_t err = esp_ota_end(s_ota_update_handle);\n  MG_DEBUG((\"esp_ota_end(%p): %d\", s_ota_update_handle, err));\n  if (s_ota_success && err == ESP_OK) {\n    err = esp_ota_set_boot_partition(s_ota_update_partition);\n    s_ota_success = (err == ESP_OK);\n  }\n  MG_DEBUG((\"Finished ESP32 OTA, success: %d\", s_ota_success));\n  s_ota_update_partition = NULL;\n  return s_ota_success;\n}\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ota_imxrt.c\"\n#endif\n\n\n\n\n#if MG_OTA >= MG_OTA_RT1020 && MG_OTA <= MG_OTA_RT1170\n\nstatic bool mg_imxrt_write(void *, const void *, size_t);\nstatic bool mg_imxrt_swap(void);\n\n#if MG_OTA <= MG_OTA_RT1060\n#define MG_IMXRT_FLASH_START 0x60000000\n#define FLEXSPI_NOR_INSTANCE 0\n#elif MG_OTA == MG_OTA_RT1064\n#define MG_IMXRT_FLASH_START 0x70000000\n#define FLEXSPI_NOR_INSTANCE 1\n#else  // RT1170\n#define MG_IMXRT_FLASH_START 0x30000000\n#define FLEXSPI_NOR_INSTANCE 1\n#endif\n\n#if MG_OTA == MG_OTA_RT1050\n#define MG_IMXRT_SECTOR_SIZE (256 * 1024)\n#define MG_IMXRT_PAGE_SIZE 512\n#else\n#define MG_IMXRT_SECTOR_SIZE (4 * 1024)\n#define MG_IMXRT_PAGE_SIZE 256\n#endif\n\n// TODO(): fill at init, support more devices in a dynamic way\n// TODO(): then, check alignment is <= 256, see Wizard's #251\nstatic struct mg_flash s_mg_flash_imxrt = {\n    (void *) MG_IMXRT_FLASH_START,  // Start,\n    4 * 1024 * 1024,                // Size, 4mb\n    MG_IMXRT_SECTOR_SIZE,           // Sector size\n    MG_IMXRT_PAGE_SIZE,             // Align\n    mg_imxrt_write,\n    mg_imxrt_swap,\n};\n\nstruct mg_flexspi_lut_seq {\n  uint8_t seqNum;\n  uint8_t seqId;\n  uint16_t reserved;\n};\n\nstruct mg_flexspi_mem_config {\n  uint32_t tag;\n  uint32_t version;\n  uint32_t reserved0;\n  uint8_t readSampleClkSrc;\n  uint8_t csHoldTime;\n  uint8_t csSetupTime;\n  uint8_t columnAddressWidth;\n  uint8_t deviceModeCfgEnable;\n  uint8_t deviceModeType;\n  uint16_t waitTimeCfgCommands;\n  struct mg_flexspi_lut_seq deviceModeSeq;\n  uint32_t deviceModeArg;\n  uint8_t configCmdEnable;\n  uint8_t configModeType[3];\n  struct mg_flexspi_lut_seq configCmdSeqs[3];\n  uint32_t reserved1;\n  uint32_t configCmdArgs[3];\n  uint32_t reserved2;\n  uint32_t controllerMiscOption;\n  uint8_t deviceType;\n  uint8_t sflashPadType;\n  uint8_t serialClkFreq;\n  uint8_t lutCustomSeqEnable;\n  uint32_t reserved3[2];\n  uint32_t sflashA1Size;\n  uint32_t sflashA2Size;\n  uint32_t sflashB1Size;\n  uint32_t sflashB2Size;\n  uint32_t csPadSettingOverride;\n  uint32_t sclkPadSettingOverride;\n  uint32_t dataPadSettingOverride;\n  uint32_t dqsPadSettingOverride;\n  uint32_t timeoutInMs;\n  uint32_t commandInterval;\n  uint16_t dataValidTime[2];\n  uint16_t busyOffset;\n  uint16_t busyBitPolarity;\n  uint32_t lookupTable[64];\n  struct mg_flexspi_lut_seq lutCustomSeq[12];\n  uint32_t reserved4[4];\n};\n\nstruct mg_flexspi_nor_config {\n  struct mg_flexspi_mem_config memConfig;\n  uint32_t pageSize;\n  uint32_t sectorSize;\n  uint8_t ipcmdSerialClkFreq;\n  uint8_t isUniformBlockSize;\n  uint8_t reserved0[2];\n  uint8_t serialNorType;\n  uint8_t needExitNoCmdMode;\n  uint8_t halfClkForNonReadCmd;\n  uint8_t needRestoreNoCmdMode;\n  uint32_t blockSize;\n  uint32_t reserve2[11];\n};\n\n/* FLEXSPI memory config block related defintions */\n#define MG_FLEXSPI_CFG_BLK_TAG (0x42464346UL)      // ascii \"FCFB\" Big Endian\n#define MG_FLEXSPI_CFG_BLK_VERSION (0x56010400UL)  // V1.4.0\n\n#define MG_FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)       \\\n  (MG_FLEXSPI_LUT_OPERAND0(op0) | MG_FLEXSPI_LUT_NUM_PADS0(pad0) | \\\n   MG_FLEXSPI_LUT_OPCODE0(cmd0) | MG_FLEXSPI_LUT_OPERAND1(op1) |   \\\n   MG_FLEXSPI_LUT_NUM_PADS1(pad1) | MG_FLEXSPI_LUT_OPCODE1(cmd1))\n\n#define MG_CMD_SDR 0x01\n#define MG_CMD_DDR 0x21\n#define MG_DUMMY_SDR 0x0C\n#define MG_DUMMY_DDR 0x2C\n#define MG_DUMMY_RWDS_DDR 0x2D\n#define MG_RADDR_SDR 0x02\n#define MG_RADDR_DDR 0x22\n#define MG_CADDR_DDR 0x23\n#define MG_READ_SDR 0x09\n#define MG_READ_DDR 0x29\n#define MG_WRITE_SDR 0x08\n#define MG_WRITE_DDR 0x28\n#define MG_STOP 0\n\n#define MG_FLEXSPI_1PAD 0\n#define MG_FLEXSPI_2PAD 1\n#define MG_FLEXSPI_4PAD 2\n#define MG_FLEXSPI_8PAD 3\n\n#define MG_FLEXSPI_QSPI_LUT                                                    \\\n  {                                                                            \\\n    [0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0xEB, MG_RADDR_SDR,  \\\n                             MG_FLEXSPI_4PAD, 0x18),                           \\\n    [1] = MG_FLEXSPI_LUT_SEQ(MG_DUMMY_SDR, MG_FLEXSPI_4PAD, 0x06, MG_READ_SDR, \\\n                             MG_FLEXSPI_4PAD, 0x04),                           \\\n    [4 * 1 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x05,        \\\n                                     MG_READ_SDR, MG_FLEXSPI_1PAD, 0x04),      \\\n    [4 * 3 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x06,        \\\n                                     MG_STOP, MG_FLEXSPI_1PAD, 0x0),           \\\n    [4 * 5 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x20,        \\\n                                     MG_RADDR_SDR, MG_FLEXSPI_1PAD, 0x18),     \\\n    [4 * 8 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0xD8,        \\\n                                     MG_RADDR_SDR, MG_FLEXSPI_1PAD, 0x18),     \\\n    [4 * 9 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x02,        \\\n                                     MG_RADDR_SDR, MG_FLEXSPI_1PAD, 0x18),     \\\n    [4 * 9 + 1] = MG_FLEXSPI_LUT_SEQ(MG_WRITE_SDR, MG_FLEXSPI_1PAD, 0x04,      \\\n                                     MG_STOP, MG_FLEXSPI_1PAD, 0x0),           \\\n    [4 * 11 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x60,       \\\n                                      MG_STOP, MG_FLEXSPI_1PAD, 0x0),          \\\n  }\n\n#define MG_FLEXSPI_HYPER_LUT                                                  \\\n  {                                                                           \\\n    [0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xA0, MG_RADDR_DDR, \\\n                             MG_FLEXSPI_8PAD, 0x18),                          \\\n    [1] = MG_FLEXSPI_LUT_SEQ(MG_CADDR_DDR, MG_FLEXSPI_8PAD, 0x10,             \\\n                             MG_DUMMY_DDR, MG_FLEXSPI_8PAD, 0x0C),            \\\n    [2] = MG_FLEXSPI_LUT_SEQ(MG_READ_DDR, MG_FLEXSPI_8PAD, 0x04, MG_STOP,     \\\n                             MG_FLEXSPI_1PAD, 0x0),                           \\\n    [4 * 1 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),       \\\n    [4 * 1 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),      \\\n    [4 * 1 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x05),      \\\n    [4 * 1 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x70),      \\\n    [4 * 2 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xA0,       \\\n                                     MG_RADDR_DDR, MG_FLEXSPI_8PAD, 0x18),    \\\n    [4 * 2 + 1] =                                                             \\\n        MG_FLEXSPI_LUT_SEQ(MG_CADDR_DDR, MG_FLEXSPI_8PAD, 0x10,               \\\n                           MG_DUMMY_RWDS_DDR, MG_FLEXSPI_8PAD, 0x0B),         \\\n    [4 * 2 + 2] = MG_FLEXSPI_LUT_SEQ(MG_READ_DDR, MG_FLEXSPI_8PAD, 0x4,       \\\n                                     MG_STOP, MG_FLEXSPI_1PAD, 0x0),          \\\n    [4 * 3 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),       \\\n    [4 * 3 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),      \\\n    [4 * 3 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x05),      \\\n    [4 * 3 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),      \\\n    [4 * 4 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),       \\\n    [4 * 4 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x55),      \\\n    [4 * 4 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x02),      \\\n    [4 * 4 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x55),      \\\n    [4 * 5 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),       \\\n    [4 * 5 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),      \\\n    [4 * 5 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x05),      \\\n    [4 * 5 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x80),      \\\n    [4 * 6 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),       \\\n    [4 * 6 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),      \\\n    [4 * 6 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x05),      \\\n    [4 * 6 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),      \\\n    [4 * 7 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),       \\\n    [4 * 7 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x55),      \\\n    [4 * 7 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x02),      \\\n    [4 * 7 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x55),      \\\n    [4 * 8 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_RADDR_DDR, MG_FLEXSPI_8PAD, 0x18),    \\\n    [4 * 8 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CADDR_DDR, MG_FLEXSPI_8PAD, 0x10,     \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),       \\\n    [4 * 8 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x30,       \\\n                                     MG_STOP, MG_FLEXSPI_1PAD, 0x0),          \\\n    [4 * 9 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),       \\\n    [4 * 9 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),      \\\n    [4 * 9 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x05),      \\\n    [4 * 9 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xA0),      \\\n    [4 * 10 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_RADDR_DDR, MG_FLEXSPI_8PAD, 0x18),   \\\n    [4 * 10 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CADDR_DDR, MG_FLEXSPI_8PAD, 0x10,    \\\n                                      MG_WRITE_DDR, MG_FLEXSPI_8PAD, 0x80),   \\\n    [4 * 11 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),      \\\n    [4 * 11 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),     \\\n    [4 * 11 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x05),     \\\n    [4 * 11 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x80),     \\\n    [4 * 12 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),      \\\n    [4 * 12 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),     \\\n    [4 * 12 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x05),     \\\n    [4 * 12 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),     \\\n    [4 * 13 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),      \\\n    [4 * 13 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x55),     \\\n    [4 * 13 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x02),     \\\n    [4 * 13 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x55),     \\\n    [4 * 14 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),      \\\n    [4 * 14 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),     \\\n    [4 * 14 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x05),     \\\n    [4 * 14 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x10),     \\\n  }\n\n#define MG_LUT_CUSTOM_SEQ                          \\\n  {                                                \\\n    {.seqNum = 0, .seqId = 0, .reserved = 0},      \\\n        {.seqNum = 2, .seqId = 1, .reserved = 0},  \\\n        {.seqNum = 2, .seqId = 3, .reserved = 0},  \\\n        {.seqNum = 4, .seqId = 5, .reserved = 0},  \\\n        {.seqNum = 2, .seqId = 9, .reserved = 0},  \\\n        {.seqNum = 4, .seqId = 11, .reserved = 0}, \\\n  }\n\n#define MG_FLEXSPI_LUT_OPERAND0(x) (((uint32_t) (((uint32_t) (x)))) & 0xFFU)\n#define MG_FLEXSPI_LUT_NUM_PADS0(x) \\\n  (((uint32_t) (((uint32_t) (x)) << 8U)) & 0x300U)\n#define MG_FLEXSPI_LUT_OPCODE0(x) \\\n  (((uint32_t) (((uint32_t) (x)) << 10U)) & 0xFC00U)\n#define MG_FLEXSPI_LUT_OPERAND1(x) \\\n  (((uint32_t) (((uint32_t) (x)) << 16U)) & 0xFF0000U)\n#define MG_FLEXSPI_LUT_NUM_PADS1(x) \\\n  (((uint32_t) (((uint32_t) (x)) << 24U)) & 0x3000000U)\n#define MG_FLEXSPI_LUT_OPCODE1(x) \\\n  (((uint32_t) (((uint32_t) (x)) << 26U)) & 0xFC000000U)\n\n#if MG_OTA == MG_OTA_RT1020 || MG_OTA == MG_OTA_RT1050\n// RT102X and RT105x boards support ROM API version 1.4\nstruct mg_flexspi_nor_driver_interface {\n  uint32_t version;\n  int (*init)(uint32_t instance, struct mg_flexspi_nor_config *config);\n  int (*program)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                 uint32_t dst_addr, const uint32_t *src);\n  uint32_t reserved;\n  int (*erase)(uint32_t instance, struct mg_flexspi_nor_config *config,\n               uint32_t start, uint32_t lengthInBytes);\n  uint32_t reserved2;\n  int (*update_lut)(uint32_t instance, uint32_t seqIndex,\n                    const uint32_t *lutBase, uint32_t seqNumber);\n  int (*xfer)(uint32_t instance, char *xfer);\n  void (*clear_cache)(uint32_t instance);\n};\n#elif MG_OTA <= MG_OTA_RT1064\n// RT104x and RT106x support ROM API version 1.5\nstruct mg_flexspi_nor_driver_interface {\n  uint32_t version;\n  int (*init)(uint32_t instance, struct mg_flexspi_nor_config *config);\n  int (*program)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                 uint32_t dst_addr, const uint32_t *src);\n  int (*erase_all)(uint32_t instance, struct mg_flexspi_nor_config *config);\n  int (*erase)(uint32_t instance, struct mg_flexspi_nor_config *config,\n               uint32_t start, uint32_t lengthInBytes);\n  int (*read)(uint32_t instance, struct mg_flexspi_nor_config *config,\n              uint32_t *dst, uint32_t addr, uint32_t lengthInBytes);\n  void (*clear_cache)(uint32_t instance);\n  int (*xfer)(uint32_t instance, char *xfer);\n  int (*update_lut)(uint32_t instance, uint32_t seqIndex,\n                    const uint32_t *lutBase, uint32_t seqNumber);\n  int (*get_config)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                    uint32_t *option);\n};\n#else\n// RT117x support ROM API version 1.7\nstruct mg_flexspi_nor_driver_interface {\n  uint32_t version;\n  int (*init)(uint32_t instance, struct mg_flexspi_nor_config *config);\n  int (*program)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                 uint32_t dst_addr, const uint32_t *src);\n  int (*erase_all)(uint32_t instance, struct mg_flexspi_nor_config *config);\n  int (*erase)(uint32_t instance, struct mg_flexspi_nor_config *config,\n               uint32_t start, uint32_t lengthInBytes);\n  int (*read)(uint32_t instance, struct mg_flexspi_nor_config *config,\n              uint32_t *dst, uint32_t addr, uint32_t lengthInBytes);\n  uint32_t reserved;\n  int (*xfer)(uint32_t instance, char *xfer);\n  int (*update_lut)(uint32_t instance, uint32_t seqIndex,\n                    const uint32_t *lutBase, uint32_t seqNumber);\n  int (*get_config)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                    uint32_t *option);\n  int (*erase_sector)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                      uint32_t address);\n  int (*erase_block)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                     uint32_t address);\n  void (*hw_reset)(uint32_t instance, uint32_t resetLogic);\n  int (*wait_busy)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                   bool isParallelMode, uint32_t address);\n  int (*set_clock_source)(uint32_t instance, uint32_t clockSrc);\n  void (*config_clock)(uint32_t instance, uint32_t freqOption,\n                       uint32_t sampleClkMode);\n};\n#endif\n\n#if MG_OTA <= MG_OTA_RT1064\n#define MG_FLEXSPI_BASE 0x402A8000\n#define flexspi_nor                                                          \\\n  (*((struct mg_flexspi_nor_driver_interface **) (*(uint32_t *) 0x0020001c + \\\n                                                  16)))\n#else\n#define MG_FLEXSPI_BASE 0x400CC000\n#define flexspi_nor                                                          \\\n  (*((struct mg_flexspi_nor_driver_interface **) (*(uint32_t *) 0x0021001c + \\\n                                                  12)))\n#endif\n\nstatic bool s_flash_irq_disabled;\n\nMG_IRAM static bool flash_page_start(volatile uint32_t *dst) {\n  char *base = (char *) s_mg_flash_imxrt.start,\n       *end = base + s_mg_flash_imxrt.size;\n  volatile char *p = (char *) dst;\n  return p >= base && p < end && ((p - base) % s_mg_flash_imxrt.secsz) == 0;\n}\n\n#if MG_OTA == MG_OTA_RT1050\n// Configuration for Hyper flash memory\nstatic struct mg_flexspi_nor_config default_config = {\n    .memConfig =\n        {\n            .tag = MG_FLEXSPI_CFG_BLK_TAG,\n            .version = MG_FLEXSPI_CFG_BLK_VERSION,\n            .readSampleClkSrc = 3,  // ReadSampleClk_LoopbackFromDqsPad\n            .csHoldTime = 3,\n            .csSetupTime = 3,\n            .columnAddressWidth = 3u,\n            .controllerMiscOption =\n                MG_BIT(6) | MG_BIT(4) | MG_BIT(3) | MG_BIT(0),\n            .deviceType = 1,  // serial NOR\n            .sflashPadType = 8,\n            .serialClkFreq = 7,  // 133MHz\n            .sflashA1Size = 64 * 1024 * 1024,\n            .dataValidTime = {15, 0},\n            .busyOffset = 15,\n            .busyBitPolarity = 1,\n            .lutCustomSeqEnable = 0x1,\n            .lookupTable = MG_FLEXSPI_HYPER_LUT,\n            .lutCustomSeq = MG_LUT_CUSTOM_SEQ,\n        },\n    .pageSize = 512,\n    .sectorSize = 256 * 1024,\n    .ipcmdSerialClkFreq = 1,\n    .serialNorType = 1u,\n    .blockSize = 256 * 1024,\n    .isUniformBlockSize = true};\n#else\n// Note: this QSPI configuration works for RTs supporting QSPI\n// Configuration for QSPI memory\nstatic struct mg_flexspi_nor_config default_config = {\n    .memConfig = {.tag = MG_FLEXSPI_CFG_BLK_TAG,\n                  .version = MG_FLEXSPI_CFG_BLK_VERSION,\n                  .readSampleClkSrc = 1,  // ReadSampleClk_LoopbackFromDqsPad\n                  .csHoldTime = 3,\n                  .csSetupTime = 3,\n                  .controllerMiscOption = MG_BIT(4),\n                  .deviceType = 1,  // serial NOR\n                  .sflashPadType = 4,\n                  .serialClkFreq = 7,  // 133MHz\n                  .sflashA1Size = 8 * 1024 * 1024,\n                  .lookupTable = MG_FLEXSPI_QSPI_LUT},\n    .pageSize = 256,\n    .sectorSize = 4 * 1024,\n    .ipcmdSerialClkFreq = 1,\n    .blockSize = 64 * 1024,\n    .isUniformBlockSize = false};\n#endif\n\n// must reside in RAM, as flash will be erased\nMG_IRAM static int flexspi_nor_get_config(\n    struct mg_flexspi_nor_config **config) {\n  *config = &default_config;\n  return 0;\n}\n\n#if 0\n// ROM API get_config call (ROM version >= 1.5)\nMG_IRAM static int flexspi_nor_get_config(\n    struct mg_flexspi_nor_config **config) {\n  uint32_t options[] = {0xc0000000, 0x00};\n\n  MG_ARM_DISABLE_IRQ();\n  uint32_t status =\n      flexspi_nor->get_config(FLEXSPI_NOR_INSTANCE, *config, options);\n  if (!s_flash_irq_disabled) {\n    MG_ARM_ENABLE_IRQ();\n  }\n  if (status) {\n    MG_ERROR((\"Failed to extract flash configuration: status %u\", status));\n  }\n  return status;\n}\n#endif\n\nMG_IRAM static void mg_spin(volatile uint32_t count) {\n  while (count--) (void) 0;\n}\n\nMG_IRAM static void flash_wait(void) {\n  while ((*((volatile uint32_t *) (MG_FLEXSPI_BASE + 0xE0)) & MG_BIT(1)) == 0)\n    mg_spin(1);\n}\n\nMG_IRAM static bool flash_erase(struct mg_flexspi_nor_config *config,\n                                void *addr) {\n  if (flash_page_start(addr) == false) {\n    MG_ERROR((\"%p is not on a sector boundary\", addr));\n    return false;\n  }\n\n  void *dst = (void *) ((char *) addr - (char *) s_mg_flash_imxrt.start);\n\n  bool ok = (flexspi_nor->erase(FLEXSPI_NOR_INSTANCE, config, (uint32_t) dst,\n                                s_mg_flash_imxrt.secsz) == 0);\n  MG_DEBUG((\"Sector starting at %p erasure: %s\", addr, ok ? \"ok\" : \"fail\"));\n  return ok;\n}\n\n#if 0\n// standalone erase call\nMG_IRAM static bool mg_imxrt_erase(void *addr) {\n  struct mg_flexspi_nor_config config, *config_ptr = &config;\n  bool ret;\n  // Interrupts must be disabled before calls to ROM API in RT1020 and 1060\n  MG_ARM_DISABLE_IRQ();\n  ret = (flexspi_nor_get_config(&config_ptr) == 0);\n  if (ret) ret = flash_erase(config_ptr, addr);\n  MG_ARM_ENABLE_IRQ();\n  return ret;\n}\n#endif\n\nMG_IRAM bool mg_imxrt_swap(void) {\n  return true;\n}\n\nMG_IRAM static bool mg_imxrt_write(void *addr, const void *buf, size_t len) {\n  struct mg_flexspi_nor_config config, *config_ptr = &config;\n  bool ok = false;\n  // Interrupts must be disabled before calls to ROM API in RT1020 and 1060\n  MG_ARM_DISABLE_IRQ();\n  if (flexspi_nor_get_config(&config_ptr) != 0) goto fwxit;\n  if ((len % s_mg_flash_imxrt.align) != 0) {\n    MG_ERROR((\"%lu is not aligned to %lu\", len, s_mg_flash_imxrt.align));\n    goto fwxit;\n  }\n  if ((char *) addr < (char *) s_mg_flash_imxrt.start) {\n    MG_ERROR((\"Invalid flash write address: %p\", addr));\n    goto fwxit;\n  }\n\n  uint32_t *dst = (uint32_t *) addr;\n  uint32_t *src = (uint32_t *) buf;\n  uint32_t *end = (uint32_t *) ((char *) buf + len);\n  ok = true;\n\n  while (ok && src < end) {\n    if (flash_page_start(dst) && flash_erase(config_ptr, dst) == false) {\n      ok = false;\n      break;\n    }\n    uint32_t status;\n    uint32_t dst_ofs = (uint32_t) dst - (uint32_t) s_mg_flash_imxrt.start;\n    if ((char *) buf >= (char *) s_mg_flash_imxrt.start) {\n      // If we copy from FLASH to FLASH, then we first need to copy the source\n      // to RAM\n      size_t tmp_buf_size = s_mg_flash_imxrt.align / sizeof(uint32_t);\n      uint32_t tmp[tmp_buf_size];\n\n      for (size_t i = 0; i < tmp_buf_size; i++) {\n        flash_wait();\n        tmp[i] = src[i];\n      }\n      status = flexspi_nor->program(FLEXSPI_NOR_INSTANCE, config_ptr,\n                                    (uint32_t) dst_ofs, tmp);\n    } else {\n      status = flexspi_nor->program(FLEXSPI_NOR_INSTANCE, config_ptr,\n                                    (uint32_t) dst_ofs, src);\n    }\n    src = (uint32_t *) ((char *) src + s_mg_flash_imxrt.align);\n    dst = (uint32_t *) ((char *) dst + s_mg_flash_imxrt.align);\n    if (status != 0) {\n      ok = false;\n    }\n  }\n  MG_DEBUG((\"Flash write %lu bytes @ %p: %s.\", len, dst, ok ? \"ok\" : \"fail\"));\nfwxit:\n  if (!s_flash_irq_disabled) MG_ARM_ENABLE_IRQ();\n  return ok;\n}\n\n// just overwrite instead of swap\nMG_IRAM static void single_bank_swap(char *p1, char *p2, size_t s, size_t ss) {\n  // no stdlib calls here\n  for (size_t ofs = 0; ofs < s; ofs += ss) {\n    mg_imxrt_write(p1 + ofs, p2 + ofs, ss);\n  }\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_imxrt);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_imxrt);\n}\n\nbool mg_ota_end(void) {\n  if (mg_ota_flash_end(&s_mg_flash_imxrt)) {\n    if (0) {  // is_dualbank()\n      // TODO(): no devices so far\n      *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n    } else {\n      // Swap partitions. Pray power does not go away\n      MG_INFO((\"Swapping partitions, size %u (%u sectors)\",\n               s_mg_flash_imxrt.size,\n               s_mg_flash_imxrt.size / s_mg_flash_imxrt.secsz));\n      MG_INFO((\"Do NOT power off...\"));\n      mg_log_level = MG_LL_NONE;\n      s_flash_irq_disabled = true;\n      // Runs in RAM, will reset when finished\n      single_bank_swap(\n          (char *) s_mg_flash_imxrt.start,\n          (char *) s_mg_flash_imxrt.start + s_mg_flash_imxrt.size / 2,\n          s_mg_flash_imxrt.size / 2, s_mg_flash_imxrt.secsz);\n    }\n  }\n  return false;\n}\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ota_mcxn.c\"\n#endif\n\n\n\n\n#if MG_OTA == MG_OTA_MCXN\n\n// - Flash phrase: 16 bytes; smallest portion programmed in one operation.\n// - Flash page: 128 bytes; largest portion programmed in one operation.\n// - Flash sector: 8 KB; smallest portion that can be erased in one operation.\n// - Flash API mg_flash_driver->program: \"start\" and \"len\" must be page-size\n// aligned; to use 'phrase', FMU register access is needed. Using ROM\n\nstatic bool mg_mcxn_write(void *, const void *, size_t);\nstatic bool mg_mcxn_swap(void);\n\nstatic struct mg_flash s_mg_flash_mcxn = {\n    (void *) 0,  // Start, filled at init\n    0,           // Size, filled at init\n    0,           // Sector size, filled at init\n    0,           // Align, filled at init\n    mg_mcxn_write,\n    mg_mcxn_swap,\n};\n\nstruct mg_flash_config {\n  uint32_t addr;\n  uint32_t size;\n  uint32_t blocks;\n  uint32_t page_size;\n  uint32_t sector_size;\n  uint32_t ffr[6];\n  uint32_t reserved0[5];\n  uint32_t *bootctx;\n  bool useahb;\n};\n\nstruct mg_flash_driver_interface {\n  uint32_t version;\n  uint32_t (*init)(struct mg_flash_config *);\n  uint32_t (*erase)(struct mg_flash_config *, uint32_t start, uint32_t len,\n                    uint32_t key);\n  uint32_t (*program)(struct mg_flash_config *, uint32_t start, uint8_t *src,\n                      uint32_t len);\n  uint32_t (*verify_erase)(struct mg_flash_config *, uint32_t start,\n                           uint32_t len);\n  uint32_t (*verify_program)(struct mg_flash_config *, uint32_t start,\n                             uint32_t len, const uint8_t *expected,\n                             uint32_t *addr, uint32_t *failed);\n  uint32_t reserved1[12];\n  uint32_t (*read)(struct mg_flash_config *, uint32_t start, uint8_t *dest,\n                   uint32_t len);\n  uint32_t reserved2[4];\n  uint32_t (*deinit)(struct mg_flash_config *);\n};\n#define mg_flash_driver \\\n  ((struct mg_flash_driver_interface *) (*((uint32_t *) 0x1303fc00 + 4)))\n#define MG_MCXN_FLASK_KEY (('k' << 24) | ('e' << 16) | ('f' << 8) | 'l')\n\nMG_IRAM static bool flash_sector_start(volatile uint32_t *dst) {\n  char *base = (char *) s_mg_flash_mcxn.start,\n       *end = base + s_mg_flash_mcxn.size;\n  volatile char *p = (char *) dst;\n  return p >= base && p < end && ((p - base) % s_mg_flash_mcxn.secsz) == 0;\n}\n\nMG_IRAM static bool flash_erase(struct mg_flash_config *config, void *addr) {\n  if (flash_sector_start(addr) == false) {\n    MG_ERROR((\"%p is not on a sector boundary\", addr));\n    return false;\n  }\n  uint32_t dst =\n      (uint32_t) addr - (uint32_t) s_mg_flash_mcxn.start;  // future-proof\n  uint32_t status = mg_flash_driver->erase(config, dst, s_mg_flash_mcxn.secsz,\n                                           MG_MCXN_FLASK_KEY);\n  bool ok = (status == 0);\n  if (!ok) MG_ERROR((\"Flash write error: %lu\", status));\n  MG_DEBUG((\"Sector starting at %p erasure: %s\", addr, ok ? \"ok\" : \"fail\"));\n  return ok;\n}\n\n#if 0\n// read-while-write, no need to disable IRQs for standalone usage\nMG_IRAM static bool mg_mcxn_erase(void *addr) {\n  uint32_t status;\n  struct mg_flash_config config;\n  if ((status = mg_flash_driver->init(&config)) != 0) {\n    MG_ERROR((\"Flash driver init error: %lu\", status));\n    return false;\n  }\n  bool ok = flash_erase(&config, addr);\n  mg_flash_driver->deinit(&config);\n  return ok;\n}\n#endif\n\nMG_IRAM static bool mg_mcxn_swap(void) {\n  // TODO(): no devices so far\n  return true;\n}\n\nstatic bool s_flash_irq_disabled;\n\nMG_IRAM static bool mg_mcxn_write(void *addr, const void *buf, size_t len) {\n  bool ok = false;\n  uint32_t status;\n  struct mg_flash_config config;\n  if ((status = mg_flash_driver->init(&config)) != 0) {\n    MG_ERROR((\"Flash driver init error: %lu\", status));\n    return false;\n  }\n  if ((len % s_mg_flash_mcxn.align) != 0) {\n    MG_ERROR((\"%lu is not aligned to %lu\", len, s_mg_flash_mcxn.align));\n    goto fwxit;\n  }\n  if ((((size_t) addr - (size_t) s_mg_flash_mcxn.start) %\n       s_mg_flash_mcxn.align) != 0) {\n    MG_ERROR((\"%p is not on a page boundary\", addr));\n    goto fwxit;\n  }\n\n  uint32_t *dst = (uint32_t *) addr;\n  uint32_t *src = (uint32_t *) buf;\n  uint32_t *end = (uint32_t *) ((char *) buf + len);\n  ok = true;\n\n  MG_ARM_DISABLE_IRQ();\n  while (ok && src < end) {\n    if (flash_sector_start(dst) && flash_erase(&config, dst) == false) {\n      ok = false;\n      break;\n    }\n    uint32_t dst_ofs = (uint32_t) dst - (uint32_t) s_mg_flash_mcxn.start;\n    // assume source is in RAM or in a different bank or read-while-write\n    status = mg_flash_driver->program(&config, dst_ofs, (uint8_t *) src,\n                                      s_mg_flash_mcxn.align);\n    src = (uint32_t *) ((char *) src + s_mg_flash_mcxn.align);\n    dst = (uint32_t *) ((char *) dst + s_mg_flash_mcxn.align);\n    if (status != 0) {\n      MG_ERROR((\"Flash write error: %lu\", status));\n      ok = false;\n    }\n  }\n  if (!s_flash_irq_disabled) MG_ARM_ENABLE_IRQ();\n  MG_DEBUG((\"Flash write %lu bytes @ %p: %s.\", len, dst, ok ? \"ok\" : \"fail\"));\n\nfwxit:\n  mg_flash_driver->deinit(&config);\n  return ok;\n}\n\n// try to swap (honor dual image), otherwise just overwrite\nMG_IRAM static void single_bank_swap(char *p1, char *p2, size_t s, size_t ss) {\n  char *tmp = mg_calloc(1, ss);\n  // no stdlib calls here\n  for (size_t ofs = 0; ofs < s; ofs += ss) {\n    if (tmp != NULL)\n      for (size_t i = 0; i < ss; i++) tmp[i] = p1[ofs + i];\n    mg_mcxn_write(p1 + ofs, p2 + ofs, ss);\n    if (tmp != NULL) mg_mcxn_write(p2 + ofs, tmp, ss);\n  }\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  uint32_t status;\n  struct mg_flash_config config;\n  if ((status = mg_flash_driver->init(&config)) != 0) {\n    MG_ERROR((\"Flash driver init error: %lu\", status));\n    return false;\n  }\n  s_mg_flash_mcxn.start = (void *) config.addr;\n  s_mg_flash_mcxn.size = config.size;\n  s_mg_flash_mcxn.secsz = config.sector_size;\n  s_mg_flash_mcxn.align = config.page_size;\n  mg_flash_driver->deinit(&config);\n  MG_DEBUG(\n      (\"%lu-byte flash @%p, using %lu-byte sectors with %lu-byte-aligned pages\",\n       s_mg_flash_mcxn.size, s_mg_flash_mcxn.start, s_mg_flash_mcxn.secsz,\n       s_mg_flash_mcxn.align));\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_mcxn);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_mcxn);\n}\n\nbool mg_ota_end(void) {\n  if (mg_ota_flash_end(&s_mg_flash_mcxn)) {\n    if (0) {  // is_dualbank()\n      // TODO(): no devices so far\n      *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n    } else {\n      // Swap partitions. Pray power does not go away\n      MG_INFO((\"Swapping partitions, size %u (%u sectors)\",\n               s_mg_flash_mcxn.size,\n               s_mg_flash_mcxn.size / s_mg_flash_mcxn.secsz));\n      MG_INFO((\"Do NOT power off...\"));\n      mg_log_level = MG_LL_NONE;\n      s_flash_irq_disabled = true;\n      // Runs in RAM, will reset when finished\n      single_bank_swap(\n          (char *) s_mg_flash_mcxn.start,\n          (char *) s_mg_flash_mcxn.start + s_mg_flash_mcxn.size / 2,\n          s_mg_flash_mcxn.size / 2, s_mg_flash_mcxn.secsz);\n    }\n  }\n  return false;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ota_picosdk.c\"\n#endif\n\n\n\n\n#if MG_OTA == MG_OTA_PICOSDK\n\n// Both RP2040 and RP2350 have no flash, low-level flash access support in\n// bootrom, and high-level support in Pico-SDK (2.0+ for the RP2350)\n// - The RP2350 in RISC-V mode is not tested\n// NOTE(): See OTA design notes\n\nstatic bool mg_picosdk_write(void *, const void *, size_t);\nstatic bool mg_picosdk_swap(void);\n\nstatic struct mg_flash s_mg_flash_picosdk = {\n    (void *) 0x10000000,  // Start; functions handle offset\n#ifdef PICO_FLASH_SIZE_BYTES\n    PICO_FLASH_SIZE_BYTES,  // Size, from board definitions\n#else\n    0x200000,  // Size, guess... is 2M enough ?\n#endif\n    FLASH_SECTOR_SIZE,  // Sector size, from hardware_flash\n    FLASH_PAGE_SIZE,    // Align, from hardware_flash\n    mg_picosdk_write,      mg_picosdk_swap,\n};\n\n#define MG_MODULO2(x, m) ((x) & ((m) -1))\n\nstatic bool __no_inline_not_in_flash_func(flash_sector_start)(\n    volatile uint32_t *dst) {\n  char *base = (char *) s_mg_flash_picosdk.start,\n       *end = base + s_mg_flash_picosdk.size;\n  volatile char *p = (char *) dst;\n  return p >= base && p < end &&\n         MG_MODULO2(p - base, s_mg_flash_picosdk.secsz) == 0;\n}\n\nstatic bool __no_inline_not_in_flash_func(flash_erase)(void *addr) {\n  if (flash_sector_start(addr) == false) {\n    MG_ERROR((\"%p is not on a sector boundary\", addr));\n    return false;\n  }\n  void *dst = (void *) ((char *) addr - (char *) s_mg_flash_picosdk.start);\n  flash_range_erase((uint32_t) dst, s_mg_flash_picosdk.secsz);\n  MG_DEBUG((\"Sector starting at %p erasure\", addr));\n  return true;\n}\n\nstatic bool __no_inline_not_in_flash_func(mg_picosdk_swap)(void) {\n  // TODO(): RP2350 might have some A/B functionality (DS 5.1)\n  return true;\n}\n\nstatic bool s_flash_irq_disabled;\n\nstatic bool __no_inline_not_in_flash_func(mg_picosdk_write)(void *addr,\n                                                            const void *buf,\n                                                            size_t len) {\n  if ((len % s_mg_flash_picosdk.align) != 0) {\n    MG_ERROR((\"%lu is not aligned to %lu\", len, s_mg_flash_picosdk.align));\n    return false;\n  }\n  if ((((size_t) addr - (size_t) s_mg_flash_picosdk.start) %\n       s_mg_flash_picosdk.align) != 0) {\n    MG_ERROR((\"%p is not on a page boundary\", addr));\n    return false;\n  }\n\n  uint32_t *dst = (uint32_t *) addr;\n  uint32_t *src = (uint32_t *) buf;\n  uint32_t *end = (uint32_t *) ((char *) buf + len);\n\n#ifndef __riscv\n  MG_ARM_DISABLE_IRQ();\n#else\n  asm volatile(\"csrrc zero, mstatus, %0\" : : \"i\"(1 << 3) : \"memory\");\n#endif\n  while (src < end) {\n    uint32_t dst_ofs = (uint32_t) dst - (uint32_t) s_mg_flash_picosdk.start;\n    if (flash_sector_start(dst) && flash_erase(dst) == false) break;\n    // flash_range_program() runs in RAM and handles writing up to\n    // FLASH_PAGE_SIZE bytes. Source must not be in flash\n    flash_range_program((uint32_t) dst_ofs, (uint8_t *) src,\n                        s_mg_flash_picosdk.align);\n    src = (uint32_t *) ((char *) src + s_mg_flash_picosdk.align);\n    dst = (uint32_t *) ((char *) dst + s_mg_flash_picosdk.align);\n  }\n  if (!s_flash_irq_disabled) {\n#ifndef __riscv\n    MG_ARM_ENABLE_IRQ();\n#else\n    asm volatile(\"csrrs mstatus, %0\" : : \"i\"(1 << 3) : \"memory\");\n#endif\n  }\n  MG_DEBUG((\"Flash write %lu bytes @ %p.\", len, dst));\n  return true;\n}\n\n// just overwrite instead of swap\nstatic void __no_inline_not_in_flash_func(single_bank_swap)(char *p1, char *p2,\n                                                            size_t s,\n                                                            size_t ss) {\n  char *tmp = mg_calloc(1, ss);\n  if (tmp == NULL) return;\n#if PICO_RP2040\n  uint32_t xip[256 / sizeof(uint32_t)];\n  void *dst = (void *) ((char *) p1 - (char *) s_mg_flash_picosdk.start);\n  size_t count = MG_ROUND_UP(s, ss);\n  // use SDK function calls to get BootROM function pointers\n  rom_connect_internal_flash_fn connect = (rom_connect_internal_flash_fn) rom_func_lookup(ROM_FUNC_CONNECT_INTERNAL_FLASH);\n  rom_flash_exit_xip_fn xit = (rom_flash_exit_xip_fn) rom_func_lookup(ROM_FUNC_FLASH_EXIT_XIP);\n  rom_flash_range_program_fn program = (rom_flash_range_program_fn) rom_func_lookup(ROM_FUNC_FLASH_RANGE_PROGRAM);\n  rom_flash_flush_cache_fn flush = (rom_flash_flush_cache_fn) rom_func_lookup(ROM_FUNC_FLASH_FLUSH_CACHE);\n  // no stdlib calls here.\n  MG_ARM_DISABLE_IRQ();\n  // 2nd bootloader (XIP) is in flash, SDK functions copy it to RAM on entry\n  for (size_t i = 0; i < 256 / sizeof(uint32_t); i++)\n    xip[i] = ((uint32_t *) (s_mg_flash_picosdk.start))[i];\n  flash_range_erase((uint32_t) dst, count);\n  // flash has been erased, no XIP to copy. Only BootROM calls possible\n  for (uint32_t ofs = 0; ofs < s; ofs += ss) {\n    for (size_t i = 0; i < ss; i++) tmp[i] = p2[ofs + i];\n    __compiler_memory_barrier();\n    connect();\n    xit();\n    program((uint32_t) dst + ofs, tmp, ss);\n    flush();\n    ((void (*)(void))((intptr_t) xip + 1))(); // enter XIP again\n  }\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;  // AIRCR = SYSRESETREQ\n#else\n  // RP2350 has BootRAM and copies second bootloader there, SDK uses that copy,\n  // It might also be able to take advantage of partition swapping\n  rom_reboot_fn reboot = (rom_reboot_fn) rom_func_lookup(ROM_FUNC_REBOOT);\n  for (size_t ofs = 0; ofs < s; ofs += ss) {\n    for (size_t i = 0; i < ss; i++) tmp[i] = p2[ofs + i];\n    mg_picosdk_write(p1 + ofs, tmp, ss);\n  }\n  reboot(BOOT_TYPE_NORMAL | 0x100, 1, 0, 0); // 0x100: NO_RETURN_ON_SUCCESS\n#endif\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_picosdk);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_picosdk);\n}\n\nbool mg_ota_end(void) {\n  if (mg_ota_flash_end(&s_mg_flash_picosdk)) {\n    // Swap partitions. Pray power does not go away\n    MG_INFO((\"Swapping partitions, size %u (%u sectors)\",\n             s_mg_flash_picosdk.size,\n             s_mg_flash_picosdk.size / s_mg_flash_picosdk.secsz));\n    MG_INFO((\"Do NOT power off...\"));\n    mg_log_level = MG_LL_NONE;\n    s_flash_irq_disabled = true;\n    // Runs in RAM, will reset when finished or return on failure\n    single_bank_swap(\n        (char *) s_mg_flash_picosdk.start,\n        (char *) s_mg_flash_picosdk.start + s_mg_flash_picosdk.size / 2,\n        s_mg_flash_picosdk.size / 2, s_mg_flash_picosdk.secsz);\n  }\n  return false;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ota_rw612.c\"\n#endif\n\n\n\n\n#if MG_OTA == MG_OTA_RW612\n\nMG_IRAM static bool mg_frdm_write(void *, const void *, size_t);\nstatic bool mg_frdm_swap(void);\n\nstatic struct mg_flash s_mg_flash_frdm = {(void *) 0x08000000,  // Start,\n                                          0x200000,             // Size\n                                          0x1000,               // Sector size\n                                          0x100,                // Align\n                                          mg_frdm_write,\n                                          mg_frdm_swap};\n\nstruct mg_flexspi_lut_seq {\n  uint8_t seqNum;\n  uint8_t seqId;\n  uint16_t reserved;\n};\n\nstruct mg_flexspi_mem_config {\n  uint32_t tag;\n  uint32_t version;\n  uint32_t reserved0;\n  uint8_t readSampleClkSrc;\n  uint8_t csHoldTime;\n  uint8_t csSetupTime;\n  uint8_t columnAddressWidth;\n  uint8_t deviceModeCfgEnable;\n  uint8_t deviceModeType;\n  uint16_t waitTimeCfgCommands;\n  struct mg_flexspi_lut_seq deviceModeSeq;\n  uint32_t deviceModeArg;\n  uint8_t configCmdEnable;\n  uint8_t configModeType[3];\n  struct mg_flexspi_lut_seq configCmdSeqs[3];\n  uint32_t reserved1;\n  uint32_t configCmdArgs[3];\n  uint32_t reserved2;\n  uint32_t controllerMiscOption;\n  uint8_t deviceType;\n  uint8_t sflashPadType;\n  uint8_t serialClkFreq;\n  uint8_t lutCustomSeqEnable;\n  uint32_t reserved3[2];\n  uint32_t sflashA1Size;\n  uint32_t sflashA2Size;\n  uint32_t sflashB1Size;\n  uint32_t sflashB2Size;\n  uint32_t csPadSettingOverride;\n  uint32_t sclkPadSettingOverride;\n  uint32_t dataPadSettingOverride;\n  uint32_t dqsPadSettingOverride;\n  uint32_t timeoutInMs;\n  uint32_t commandInterval;\n  uint16_t dataValidTime[2];\n  uint16_t busyOffset;\n  uint16_t busyBitPolarity;\n  uint32_t lookupTable[64];\n  struct mg_flexspi_lut_seq lutCustomSeq[12];\n  uint32_t reserved4[4];\n};\n\nstruct mg_flexspi_nor_config {\n  struct mg_flexspi_mem_config memConfig;\n  uint32_t pageSize;\n  uint32_t sectorSize;\n  uint8_t ipcmdSerialClkFreq;\n  uint8_t isUniformBlockSize;\n  uint8_t isDataOrderSwapped;\n  uint8_t reserved0[1];\n  uint8_t serialNorType;\n  uint8_t needExitNoCmdMode;\n  uint8_t halfClkForNonReadCmd;\n  uint8_t needRestoreNoCmdMode;\n  uint32_t blockSize;\n  uint32_t flashStateCtx;\n  uint32_t reserve2[10];\n};\n\nstruct mg_flexspi_nor_driver_interface {\n  uint32_t version;\n  uint32_t (*init)(uint32_t instance, struct mg_flexspi_nor_config *config);\n  uint32_t (*wait_busy)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                        uint32_t address, bool keepState);\n  uint32_t (*page_program)(uint32_t instance,\n                           struct mg_flexspi_nor_config *config,\n                           uint32_t dstAddr, const uint32_t *src,\n                           bool keepState);\n  uint32_t (*erase_all)(uint32_t instance,\n                        struct mg_flexspi_nor_config *config);\n  uint32_t (*erase)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                    uint32_t start, uint32_t length);\n  uint32_t (*erase_sector)(uint32_t instance,\n                           struct mg_flexspi_nor_config *config,\n                           uint32_t address);\n  uint32_t (*erase_block)(uint32_t instance,\n                          struct mg_flexspi_nor_config *config,\n                          uint32_t address);\n  uint32_t (*read)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                   uint32_t *dst, uint32_t start, uint32_t bytes);\n  void (*config_clock)(uint32_t instance, uint32_t freqOption,\n                       uint32_t sampleClkMode);\n  uint32_t (*set_clock_source)(uint32_t clockSrc);\n  uint32_t (*get_config)(uint32_t instance,\n                         struct mg_flexspi_nor_config *config,\n                         uint32_t *option);\n  void (*hw_reset)(uint32_t instance, uint32_t reset_logic);\n  uint32_t (*xfer)(uint32_t instance, char *xfer);\n  uint32_t (*update_lut)(uint32_t instance, uint32_t seqIndex,\n                         const uint32_t *lutBase, uint32_t numberOfSeq);\n  uint32_t (*partial_program)(uint32_t instance,\n                              struct mg_flexspi_nor_config *config,\n                              uint32_t dstAddr, const uint32_t *src,\n                              uint32_t length, bool keepState);\n};\n\n#define MG_FLEXSPI_CFG_BLK_TAG (0x42464346UL)\n#define MG_FLEXSPI_BASE 0x40134000UL\n\n#define MG_CMD_SDR 0x01\n#define MG_RADDR_SDR 0x02\n#define MG_WRITE_SDR 0x08\n#define MG_READ_SDR 0x09\n#define MG_DUMMY_SDR 0x0C\n#define MG_STOP_EXE 0\n\n#define MG_FLEXSPI_1PAD 0\n#define MG_FLEXSPI_4PAD 2\n\n#define MG_FLEXSPI_LUT_OPERAND0(x) (((x) &0xFF) << 0)\n#define MG_FLEXSPI_LUT_NUM_PADS0(x) (((x) &0x3) << 8)\n#define MG_FLEXSPI_LUT_OPCODE0(x) (((x) &0x3F) << 10)\n#define MG_FLEXSPI_LUT_OPERAND1(x) (((x) &0xFF) << 16)\n#define MG_FLEXSPI_LUT_NUM_PADS1(x) (((x) &0x3) << 24)\n#define MG_FLEXSPI_LUT_OPCODE1(x) (((x) &0x3F) << 26)\n\n#define MG_FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)       \\\n  (MG_FLEXSPI_LUT_OPERAND0(op0) | MG_FLEXSPI_LUT_NUM_PADS0(pad0) | \\\n   MG_FLEXSPI_LUT_OPCODE0(cmd0) | MG_FLEXSPI_LUT_OPERAND1(op1) |   \\\n   MG_FLEXSPI_LUT_NUM_PADS1(pad1) | MG_FLEXSPI_LUT_OPCODE1(cmd1))\n\nstruct mg_flexspi_nor_config default_config = {\n    .memConfig =\n        {\n            .tag = MG_FLEXSPI_CFG_BLK_TAG,\n            .version = 0,\n            .readSampleClkSrc = 1,\n            .csHoldTime = 3,\n            .csSetupTime = 3,\n            .deviceModeCfgEnable = 1,\n            .deviceModeSeq = {.seqNum = 1, .seqId = 2},\n            .deviceModeArg = 0x0740,\n            .configCmdEnable = 0,\n            .deviceType = 0x1,\n            .sflashPadType = 4,\n            .serialClkFreq = 4,\n            .sflashA1Size = 0x4000000U,\n            .sflashA2Size = 0,\n            .sflashB1Size = 0,\n            .sflashB2Size = 0,\n            .lookupTable =\n                {\n                    [0] =\n                        MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0xEB,\n                                           MG_RADDR_SDR, MG_FLEXSPI_4PAD, 0x18),\n                    [1] =\n                        MG_FLEXSPI_LUT_SEQ(MG_DUMMY_SDR, MG_FLEXSPI_4PAD, 0x06,\n                                           MG_READ_SDR, MG_FLEXSPI_4PAD, 0x04),\n                    [4 * 1 + 0] =\n                        MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x05,\n                                           MG_READ_SDR, MG_FLEXSPI_1PAD, 0x04),\n                    [4 * 2 + 0] =\n                        MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x01,\n                                           MG_WRITE_SDR, MG_FLEXSPI_1PAD, 0x02),\n                    [4 * 3 + 0] =\n                        MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x06,\n                                           MG_STOP_EXE, MG_FLEXSPI_1PAD, 0x00),\n                    [4 * 5 + 0] =\n                        MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x20,\n                                           MG_RADDR_SDR, MG_FLEXSPI_1PAD, 0x18),\n                    [4 * 8 + 0] =\n                        MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x52,\n                                           MG_RADDR_SDR, MG_FLEXSPI_1PAD, 0x18),\n                    [4 * 9 + 0] =\n                        MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x02,\n                                           MG_RADDR_SDR, MG_FLEXSPI_1PAD, 0x18),\n                    [4 * 9 + 1] =\n                        MG_FLEXSPI_LUT_SEQ(MG_WRITE_SDR, MG_FLEXSPI_1PAD, 0x00,\n                                           MG_STOP_EXE, MG_FLEXSPI_1PAD, 0x00),\n                    [4 * 11 + 0] =\n                        MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x60,\n                                           MG_STOP_EXE, MG_FLEXSPI_1PAD, 0x00),\n                },\n        },\n    .pageSize = 0x100,\n    .sectorSize = 0x1000,\n    .ipcmdSerialClkFreq = 0,\n    .blockSize = 0x8000,\n};\n\n#define MG_FLEXSPI_NOR_INSTANCE 0\n#define MG_ROMAPI_ADDRESS 0x13030000U\n#define flexspi_nor                              \\\n  ((struct mg_flexspi_nor_driver_interface *) (( \\\n      (uint32_t *) MG_ROMAPI_ADDRESS)[5]))\n\nMG_IRAM static bool flash_page_start(volatile uint32_t *dst) {\n  char *base = (char *) s_mg_flash_frdm.start,\n       *end = base + s_mg_flash_frdm.size;\n  volatile char *p = (char *) dst;\n  return p >= base && p < end && ((p - base) % s_mg_flash_frdm.secsz) == 0;\n}\n\nMG_IRAM static int flexspi_nor_get_config(\n    struct mg_flexspi_nor_config *config) {\n  uint32_t option = 0xc0000004;\n  return flexspi_nor->get_config(MG_FLEXSPI_NOR_INSTANCE, config, &option);\n}\n\nMG_IRAM static int flash_init(void) {\n  static bool initialized = false;\n  if (!initialized) {\n    struct mg_flexspi_nor_config config;\n    memset(&config, 0, sizeof(config));\n    flexspi_nor->set_clock_source(0);\n    flexspi_nor->config_clock(MG_FLEXSPI_NOR_INSTANCE, 1, 0);\n    if (flexspi_nor->init(MG_FLEXSPI_NOR_INSTANCE, &default_config)) {\n      return 1;\n    }\n    flexspi_nor_get_config(&config);\n    if (flexspi_nor->init(MG_FLEXSPI_NOR_INSTANCE, &config)) {\n      return 1;\n    }\n    initialized = true;\n  }\n  return 0;\n}\n\nMG_IRAM static bool flash_erase(struct mg_flexspi_nor_config *config,\n                                void *addr) {\n  if (flash_page_start(addr) == false) {\n    MG_ERROR((\"%p is not on a sector boundary\", addr));\n    return false;\n  }\n\n  void *dst = (void *) ((char *) addr - (char *) s_mg_flash_frdm.start);\n  bool ok = (flexspi_nor->erase_sector(MG_FLEXSPI_NOR_INSTANCE, config,\n                                       (uint32_t) dst) == 0);\n  MG_INFO((\"Sector starting at %p erasure: %s\", addr, ok ? \"ok\" : \"fail\"));\n  return ok;\n}\n\nMG_IRAM bool mg_frdm_swap(void) {\n  return true;\n}\n\nMG_IRAM static void flash_wait(void) {\n  while ((*((volatile uint32_t *) (MG_FLEXSPI_BASE + 0xE0)) & MG_BIT(1)) == 0)\n    (void) 0;\n}\n\nstatic bool s_flash_irq_disabled;\n\nMG_IRAM static bool mg_frdm_write(void *addr, const void *buf, size_t len) {\n  struct mg_flexspi_nor_config config;\n  bool ok = false;\n  MG_ARM_DISABLE_IRQ();\n  if (flash_init() != 0) goto fwxit;\n  if (flexspi_nor_get_config(&config) != 0) goto fwxit;\n  if ((len % s_mg_flash_frdm.align) != 0) {\n    MG_ERROR((\"%lu is not aligned to %lu\", len, s_mg_flash_frdm.align));\n    goto fwxit;\n  }\n  if ((char *) addr < (char *) s_mg_flash_frdm.start) {\n    MG_ERROR((\"Invalid flash write address: %p\", addr));\n    goto fwxit;\n  }\n\n  uint32_t *dst = (uint32_t *) addr;\n  uint32_t *src = (uint32_t *) buf;\n  uint32_t *end = (uint32_t *) ((char *) buf + len);\n  ok = true;\n\n  while (ok && src < end) {\n    if (flash_page_start(dst) && flash_erase(&config, dst) == false) {\n      ok = false;\n      break;\n    }\n    uint32_t status;\n    uint32_t dst_ofs = (uint32_t) dst - (uint32_t) s_mg_flash_frdm.start;\n    if ((char *) buf >= (char *) s_mg_flash_frdm.start &&\n        (char *) buf <\n            (char *) (s_mg_flash_frdm.start + s_mg_flash_frdm.size)) {\n      // If we copy from FLASH to FLASH, then we first need to copy the source\n      // to RAM\n      size_t tmp_buf_size = s_mg_flash_frdm.align / sizeof(uint32_t);\n      uint32_t tmp[tmp_buf_size];\n\n      for (size_t i = 0; i < tmp_buf_size; i++) {\n        flash_wait();\n        tmp[i] = src[i];\n      }\n      status = flexspi_nor->page_program(MG_FLEXSPI_NOR_INSTANCE, &config,\n                                         (uint32_t) dst_ofs, tmp, false);\n    } else {\n      status = flexspi_nor->page_program(MG_FLEXSPI_NOR_INSTANCE, &config,\n                                         (uint32_t) dst_ofs, src, false);\n    }\n    src = (uint32_t *) ((char *) src + s_mg_flash_frdm.align);\n    dst = (uint32_t *) ((char *) dst + s_mg_flash_frdm.align);\n    if (status != 0) {\n      ok = false;\n    }\n  }\n  MG_INFO((\"Flash write %lu bytes @ %p: %s.\", len, dst, ok ? \"ok\" : \"fail\"));\nfwxit:\n  if (!s_flash_irq_disabled) MG_ARM_ENABLE_IRQ();\n  return ok;\n}\n\n// just overwrite instead of swap\nMG_IRAM static void single_bank_swap(char *p1, char *p2, size_t s, size_t ss) {\n  // no stdlib calls here\n  for (size_t ofs = 0; ofs < s; ofs += ss) {\n    mg_frdm_write(p1 + ofs, p2 + ofs, ss);\n  }\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_frdm);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_frdm);\n}\n\nbool mg_ota_end(void) {\n  if (mg_ota_flash_end(&s_mg_flash_frdm)) {\n    if (0) {  // is_dualbank()\n      // TODO(): no devices so far\n      *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n    } else {\n      // Swap partitions. Pray power does not go away\n      MG_INFO((\"Swapping partitions, size %u (%u sectors)\",\n               s_mg_flash_frdm.size,\n               s_mg_flash_frdm.size / s_mg_flash_frdm.secsz));\n      MG_INFO((\"Do NOT power off...\"));\n      mg_log_level = MG_LL_NONE;\n      s_flash_irq_disabled = true;\n      // Runs in RAM, will reset when finished\n      single_bank_swap(\n          (char *) s_mg_flash_frdm.start,\n          (char *) s_mg_flash_frdm.start + s_mg_flash_frdm.size / 2,\n          s_mg_flash_frdm.size / 2, s_mg_flash_frdm.secsz);\n    }\n  }\n  return false;\n}\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ota_stm32f.c\"\n#endif\n\n\n\n\n#if MG_OTA == MG_OTA_STM32F\n\nstatic bool mg_stm32f_write(void *, const void *, size_t);\nstatic bool mg_stm32f_swap(void);\n\nstatic struct mg_flash s_mg_flash_stm32f = {\n    (void *) 0x08000000,  // Start\n    0,                    // Size, FLASH_SIZE_REG\n    0,                    // Irregular sector size\n    32,                   // Align, 256 bit\n    mg_stm32f_write,\n    mg_stm32f_swap,\n};\n\n#define MG_FLASH_BASE 0x40023c00\n#define MG_FLASH_KEYR 0x04\n#define MG_FLASH_SR 0x0c\n#define MG_FLASH_CR 0x10\n#define MG_FLASH_OPTCR 0x14\n#define MG_FLASH_SIZE_REG_F7 0x1FF0F442\n#define MG_FLASH_SIZE_REG_F4 0x1FFF7A22\n\n#define STM_DBGMCU_IDCODE 0xE0042000\n#define STM_DEV_ID (MG_REG(STM_DBGMCU_IDCODE) & (MG_BIT(12) - 1))\n#define SYSCFG_MEMRMP 0x40013800\n\n#define MG_FLASH_SIZE_REG_LOCATION \\\n  ((STM_DEV_ID >= 0x449) ? MG_FLASH_SIZE_REG_F7 : MG_FLASH_SIZE_REG_F4)\n\nstatic size_t flash_size(void) {\n  return (MG_REG(MG_FLASH_SIZE_REG_LOCATION) & 0xFFFF) * 1024;\n}\n\nMG_IRAM static int is_dualbank(void) {\n  // only F42x/F43x series (0x419) support dual bank\n  return STM_DEV_ID == 0x419;\n}\n\nMG_IRAM static void flash_unlock(void) {\n  static bool unlocked = false;\n  if (unlocked == false) {\n    MG_REG(MG_FLASH_BASE + MG_FLASH_KEYR) = 0x45670123;\n    MG_REG(MG_FLASH_BASE + MG_FLASH_KEYR) = 0xcdef89ab;\n    unlocked = true;\n  }\n}\n\n#define MG_FLASH_CONFIG_16_64_128 1   // used by STM32F7\n#define MG_FLASH_CONFIG_32_128_256 2  // used by STM32F4 and F2\n\nMG_IRAM static bool flash_page_start(volatile uint32_t *dst) {\n  char *base = (char *) s_mg_flash_stm32f.start;\n  char *end = base + s_mg_flash_stm32f.size;\n\n  if (is_dualbank() && dst >= (uint32_t *) (base + (end - base) / 2)) {\n    dst = (uint32_t *) ((uint32_t) dst - (end - base) / 2);\n  }\n\n  uint32_t flash_config = MG_FLASH_CONFIG_16_64_128;\n  if (STM_DEV_ID >= 0x449) {\n    flash_config = MG_FLASH_CONFIG_32_128_256;\n  }\n\n  volatile char *p = (char *) dst;\n  if (p >= base && p < end) {\n    if (p < base + 16 * 1024 * 4 * flash_config) {\n      if ((p - base) % (16 * 1024 * flash_config) == 0) return true;\n    } else if (p == base + 16 * 1024 * 4 * flash_config) {\n      return true;\n    } else if ((p - base) % (128 * 1024 * flash_config) == 0) {\n      return true;\n    }\n  }\n  return false;\n}\n\nMG_IRAM static int flash_sector(volatile uint32_t *addr) {\n  char *base = (char *) s_mg_flash_stm32f.start;\n  char *end = base + s_mg_flash_stm32f.size;\n  bool addr_in_bank_2 = false;\n  if (is_dualbank() && addr >= (uint32_t *) (base + (end - base) / 2)) {\n    addr = (uint32_t *) ((uint32_t) addr - (end - base) / 2);\n    addr_in_bank_2 = true;\n  }\n  volatile char *p = (char *) addr;\n  uint32_t flash_config = MG_FLASH_CONFIG_16_64_128;\n  if (STM_DEV_ID >= 0x449) {\n    flash_config = MG_FLASH_CONFIG_32_128_256;\n  }\n  int sector = -1;\n  if (p >= base && p < end) {\n    if (p < base + 16 * 1024 * 4 * flash_config) {\n      sector = (p - base) / (16 * 1024 * flash_config);\n    } else if (p >= base + 64 * 1024 * flash_config &&\n               p < base + 128 * 1024 * flash_config) {\n      sector = 4;\n    } else {\n      sector = (p - base) / (128 * 1024 * flash_config) + 4;\n    }\n  }\n  if (sector == -1) return -1;\n  if (addr_in_bank_2) sector += 12;  // a bank has 12 sectors\n  return sector;\n}\n\nMG_IRAM static bool flash_is_err(void) {\n  return MG_REG(MG_FLASH_BASE + MG_FLASH_SR) & ((MG_BIT(7) - 1) << 1);\n}\n\nMG_IRAM static void flash_wait(void) {\n  while (MG_REG(MG_FLASH_BASE + MG_FLASH_SR) & (MG_BIT(16))) (void) 0;\n}\n\nMG_IRAM static void flash_clear_err(void) {\n  flash_wait();                                // Wait until ready\n  MG_REG(MG_FLASH_BASE + MG_FLASH_SR) = 0xf2;  // Clear all errors\n}\n\nMG_IRAM static bool mg_stm32f_erase(void *addr) {\n  bool ok = false;\n  if (flash_page_start(addr) == false) {\n    MG_ERROR((\"%p is not on a sector boundary\", addr));\n  } else {\n    int sector = flash_sector(addr);\n    if (sector < 0) return false;\n    uint32_t sector_reg = sector;\n    if (is_dualbank() && sector >= 12) {\n      // 3.9.8 Flash control register (FLASH_CR) for F42xxx and F43xxx\n      // BITS[7:3]\n      sector_reg -= 12;\n      sector_reg |= MG_BIT(4);\n    }\n    flash_unlock();\n    flash_wait();\n    uint32_t cr = MG_BIT(1);       // SER\n    cr |= MG_BIT(16);              // STRT\n    cr |= (sector_reg & 31) << 3;  // sector\n    MG_REG(MG_FLASH_BASE + MG_FLASH_CR) = cr;\n    ok = !flash_is_err();\n    MG_DEBUG((\"Erase sector %lu @ %p %s. CR %#lx SR %#lx\", sector, addr,\n              ok ? \"ok\" : \"fail\", MG_REG(MG_FLASH_BASE + MG_FLASH_CR),\n              MG_REG(MG_FLASH_BASE + MG_FLASH_SR)));\n    // After we have erased the sector, set CR flags for programming\n    // 2 << 8 is word write parallelism, bit(0) is PG. RM0385, section 3.7.5\n    MG_REG(MG_FLASH_BASE + MG_FLASH_CR) = MG_BIT(0) | (2 << 8);\n    flash_clear_err();\n  }\n  return ok;\n}\n\nMG_IRAM static bool mg_stm32f_swap(void) {\n  // STM32 F42x/F43x support dual bank, however, the memory mapping\n  // change will not be carried through a hard reset. Therefore, we will use\n  // the single bank approach for this family as well.\n  return true;\n}\n\nstatic bool s_flash_irq_disabled;\n\nMG_IRAM static bool mg_stm32f_write(void *addr, const void *buf, size_t len) {\n  if ((len % s_mg_flash_stm32f.align) != 0) {\n    MG_ERROR((\"%lu is not aligned to %lu\", len, s_mg_flash_stm32f.align));\n    return false;\n  }\n  uint32_t *dst = (uint32_t *) addr;\n  uint32_t *src = (uint32_t *) buf;\n  uint32_t *end = (uint32_t *) ((char *) buf + len);\n  bool ok = true;\n  MG_ARM_DISABLE_IRQ();\n  flash_unlock();\n  flash_clear_err();\n  MG_REG(MG_FLASH_BASE + MG_FLASH_CR) = MG_BIT(0) | MG_BIT(9);  // PG, 32-bit\n  flash_wait();\n  MG_DEBUG((\"Writing flash @ %p, %lu bytes\", addr, len));\n  while (ok && src < end) {\n    if (flash_page_start(dst) && mg_stm32f_erase(dst) == false) break;\n    *(volatile uint32_t *) dst++ = *src++;\n    MG_DSB();  // ensure flash is written with no errors\n    flash_wait();\n    if (flash_is_err()) ok = false;\n  }\n  if (!s_flash_irq_disabled) MG_ARM_ENABLE_IRQ();\n  MG_DEBUG((\"Flash write %lu bytes @ %p: %s. CR %#lx SR %#lx\", len, dst,\n            ok ? \"ok\" : \"fail\", MG_REG(MG_FLASH_BASE + MG_FLASH_CR),\n            MG_REG(MG_FLASH_BASE + MG_FLASH_SR)));\n  MG_REG(MG_FLASH_BASE + MG_FLASH_CR) &= ~MG_BIT(0);  // Clear programming flag\n  return ok;\n}\n\n// just overwrite instead of swap\nMG_IRAM void single_bank_swap(char *p1, char *p2, size_t size) {\n  // no stdlib calls here\n  mg_stm32f_write(p1, p2, size);\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  s_mg_flash_stm32f.size = flash_size();\n#ifdef __ZEPHYR__\n  *((uint32_t *)0xE000ED94) = 0;\n  MG_DEBUG((\"Jailbreak %s\", *((uint32_t *)0xE000ED94) == 0 ? \"successful\" : \"failed\"));\n#endif\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_stm32f);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_stm32f);\n}\n\nbool mg_ota_end(void) {\n  if (mg_ota_flash_end(&s_mg_flash_stm32f)) {\n    // Swap partitions. Pray power does not go away\n    MG_INFO((\"Swapping partitions, size %u (%u sectors)\",\n             s_mg_flash_stm32f.size, STM_DEV_ID == 0x449 ? 8 : 12));\n    MG_INFO((\"Do NOT power off...\"));\n    mg_log_level = MG_LL_NONE;\n    s_flash_irq_disabled = true;\n    char *p1 = (char *) s_mg_flash_stm32f.start;\n    char *p2 = p1 + s_mg_flash_stm32f.size / 2;\n    size_t size = s_mg_flash_stm32f.size / 2;\n    // Runs in RAM, will reset when finished\n    single_bank_swap(p1, p2, size);\n  }\n  return false;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ota_stm32h5.c\"\n#endif\n\n\n\n\n#if MG_OTA == MG_OTA_STM32H5\n\nstatic bool mg_stm32h5_write(void *, const void *, size_t);\nstatic bool mg_stm32h5_swap(void);\n\nstatic struct mg_flash s_mg_flash_stm32h5 = {\n    (void *) 0x08000000,  // Start\n    2 * 1024 * 1024,      // Size, 2Mb\n    8 * 1024,             // Sector size, 8k\n    16,                   // Align, 128 bit\n    mg_stm32h5_write,\n    mg_stm32h5_swap,\n};\n\n#define MG_FLASH_BASE 0x40022000          // Base address of the flash controller\n#define FLASH_KEYR (MG_FLASH_BASE + 0x4)  // See RM0481 7.11\n#define FLASH_OPTKEYR (MG_FLASH_BASE + 0xc)\n#define FLASH_OPTCR (MG_FLASH_BASE + 0x1c)\n#define FLASH_NSSR (MG_FLASH_BASE + 0x20)\n#define FLASH_NSCR (MG_FLASH_BASE + 0x28)\n#define FLASH_NSCCR (MG_FLASH_BASE + 0x30)\n#define FLASH_OPTSR_CUR (MG_FLASH_BASE + 0x50)\n#define FLASH_OPTSR_PRG (MG_FLASH_BASE + 0x54)\n\nstatic void flash_unlock(void) {\n  static bool unlocked = false;\n  if (unlocked == false) {\n    MG_REG(FLASH_KEYR) = 0x45670123;\n    MG_REG(FLASH_KEYR) = 0Xcdef89ab;\n    MG_REG(FLASH_OPTKEYR) = 0x08192a3b;\n    MG_REG(FLASH_OPTKEYR) = 0x4c5d6e7f;\n    unlocked = true;\n  }\n}\n\nstatic int flash_page_start(volatile uint32_t *dst) {\n  char *base = (char *) s_mg_flash_stm32h5.start,\n       *end = base + s_mg_flash_stm32h5.size;\n  volatile char *p = (char *) dst;\n  return p >= base && p < end && ((p - base) % s_mg_flash_stm32h5.secsz) == 0;\n}\n\nstatic bool flash_is_err(void) {\n  return MG_REG(FLASH_NSSR) & ((MG_BIT(8) - 1) << 17);  // RM0481 7.11.9\n}\n\nstatic void flash_wait(void) {\n  while ((MG_REG(FLASH_NSSR) & MG_BIT(0)) &&\n         (MG_REG(FLASH_NSSR) & MG_BIT(16)) == 0) {\n    (void) 0;\n  }\n}\n\nstatic void flash_clear_err(void) {\n  flash_wait();                                    // Wait until ready\n  MG_REG(FLASH_NSCCR) = ((MG_BIT(9) - 1) << 16U);  // Clear all errors\n}\n\nstatic bool flash_bank_is_swapped(void) {\n  return MG_REG(FLASH_OPTCR) & MG_BIT(31);  // RM0481 7.11.8\n}\n\nstatic bool mg_stm32h5_erase(void *location) {\n  bool ok = false;\n  if (flash_page_start(location) == false) {\n    MG_ERROR((\"%p is not on a sector boundary\"));\n  } else {\n    uintptr_t diff = (char *) location - (char *) s_mg_flash_stm32h5.start;\n    uint32_t sector = diff / s_mg_flash_stm32h5.secsz;\n    uint32_t saved_cr = MG_REG(FLASH_NSCR);  // Save CR value\n    flash_unlock();\n    flash_clear_err();\n    MG_REG(FLASH_NSCR) = 0;\n    if ((sector < 128 && flash_bank_is_swapped()) ||\n        (sector > 127 && !flash_bank_is_swapped())) {\n      MG_REG(FLASH_NSCR) |= MG_BIT(31);  // Set FLASH_CR_BKSEL\n    }\n    if (sector > 127) sector -= 128;\n    MG_REG(FLASH_NSCR) |= MG_BIT(2) | (sector << 6);  // Erase | sector_num\n    MG_REG(FLASH_NSCR) |= MG_BIT(5);                  // Start erasing\n    flash_wait();\n    ok = !flash_is_err();\n    MG_DEBUG((\"Erase sector %lu @ %p: %s. CR %#lx SR %#lx\", sector, location,\n              ok ? \"ok\" : \"fail\", MG_REG(FLASH_NSCR), MG_REG(FLASH_NSSR)));\n    // mg_hexdump(location, 32);\n    MG_REG(FLASH_NSCR) = saved_cr;  // Restore saved CR\n  }\n  return ok;\n}\n\nstatic bool mg_stm32h5_swap(void) {\n  uint32_t desired = flash_bank_is_swapped() ? 0 : MG_BIT(31);\n  flash_unlock();\n  flash_clear_err();\n  // printf(\"OPTSR_PRG 1 %#lx\\n\", FLASH->OPTSR_PRG);\n  MG_SET_BITS(MG_REG(FLASH_OPTSR_PRG), MG_BIT(31), desired);\n  // printf(\"OPTSR_PRG 2 %#lx\\n\", FLASH->OPTSR_PRG);\n  MG_REG(FLASH_OPTCR) |= MG_BIT(1);  // OPTSTART\n  while ((MG_REG(FLASH_OPTSR_CUR) & MG_BIT(31)) != desired) (void) 0;\n  return true;\n}\n\nstatic bool mg_stm32h5_write(void *addr, const void *buf, size_t len) {\n  if ((len % s_mg_flash_stm32h5.align) != 0) {\n    MG_ERROR((\"%lu is not aligned to %lu\", len, s_mg_flash_stm32h5.align));\n    return false;\n  }\n  uint32_t *dst = (uint32_t *) addr;\n  uint32_t *src = (uint32_t *) buf;\n  uint32_t *end = (uint32_t *) ((char *) buf + len);\n  bool ok = true;\n  MG_ARM_DISABLE_IRQ();\n  flash_unlock();\n  flash_clear_err();\n  MG_REG(FLASH_NSCR) = MG_BIT(1);  // Set programming flag\n  while (ok && src < end) {\n    if (flash_page_start(dst) && mg_stm32h5_erase(dst) == false) {\n      ok = false;\n      break;\n    }\n    *(volatile uint32_t *) dst++ = *src++;\n    flash_wait();\n    if (flash_is_err()) ok = false;\n  }\n  MG_ARM_ENABLE_IRQ();\n  MG_DEBUG((\"Flash write %lu bytes @ %p: %s. CR %#lx SR %#lx\", len, dst,\n            flash_is_err() ? \"fail\" : \"ok\", MG_REG(FLASH_NSCR),\n            MG_REG(FLASH_NSSR)));\n  MG_REG(FLASH_NSCR) = 0;  // Clear flags\n  return ok;\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n#ifdef __ZEPHYR__\n  *((uint32_t *)0xE000ED94) = 0;\n  MG_DEBUG((\"Jailbreak %s\", *((uint32_t *)0xE000ED94) == 0 ? \"successful\" : \"failed\"));\n#endif\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_stm32h5);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_stm32h5);\n}\n\n// Actual bank swap is deferred until reset, it is safe to execute in flash\nbool mg_ota_end(void) {\n  if(!mg_ota_flash_end(&s_mg_flash_stm32h5)) return false;\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n  return true;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ota_stm32h7.c\"\n#endif\n\n\n\n\n#if MG_OTA == MG_OTA_STM32H7 || MG_OTA == MG_OTA_STM32H7_DUAL_CORE\n\n// - H723/735 RM 4.3.3: Note: The application can simultaneously request a read\n// and a write operation through the AXI interface.\n//   - We only need IRAM for partition swapping in the H723, however, all\n//   related functions must reside in IRAM for this to be possible.\n// - Linker files for other devices won't define a .iram section so there's no\n// associated penalty\n\nstatic bool mg_stm32h7_write(void *, const void *, size_t);\nstatic bool mg_stm32h7_swap(void);\n\nstatic struct mg_flash s_mg_flash_stm32h7 = {\n    (void *) 0x08000000,  // Start\n    0,                    // Size, FLASH_SIZE_REG\n    128 * 1024,           // Sector size, 128k\n    32,                   // Align, 256 bit\n    mg_stm32h7_write,\n    mg_stm32h7_swap,\n};\n\n#define FLASH_BASE1 0x52002000  // Base address for bank1\n#define FLASH_BASE2 0x52002100  // Base address for bank2\n#define FLASH_KEYR 0x04         // See RM0433 4.9.2\n#define FLASH_OPTKEYR 0x08\n#define FLASH_OPTCR 0x18\n#define FLASH_SR 0x10\n#define FLASH_CR 0x0c\n#define FLASH_CCR 0x14\n#define FLASH_OPTSR_CUR 0x1c\n#define FLASH_OPTSR_PRG 0x20\n#define FLASH_SIZE_REG 0x1ff1e880\n\n#define IS_DUALCORE() (MG_OTA == MG_OTA_STM32H7_DUAL_CORE)\n\nMG_IRAM static bool is_dualbank(void) {\n  if (IS_DUALCORE()) {\n    // H745/H755 and H747/H757 are running on dual core.\n    // Using only the 1st bank (mapped to CM7), in order not to interfere\n    // with the 2nd bank (CM4), possibly causing CM4 to boot unexpectedly.\n    return false;\n  }\n  return (s_mg_flash_stm32h7.size < 2 * 1024 * 1024) ? false : true;\n}\n\nMG_IRAM static void flash_unlock(void) {\n  static bool unlocked = false;\n  if (unlocked == false) {\n    MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0x45670123;\n    MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0xcdef89ab;\n    if (is_dualbank()) {\n      MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0x45670123;\n      MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0xcdef89ab;\n    }\n    MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x08192a3b;  // opt reg is \"shared\"\n    MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x4c5d6e7f;  // thus unlock once\n    unlocked = true;\n  }\n}\n\nMG_IRAM static bool flash_page_start(volatile uint32_t *dst) {\n  char *base = (char *) s_mg_flash_stm32h7.start,\n       *end = base + s_mg_flash_stm32h7.size;\n  volatile char *p = (char *) dst;\n  return p >= base && p < end && ((p - base) % s_mg_flash_stm32h7.secsz) == 0;\n}\n\nMG_IRAM static bool flash_is_err(uint32_t bank) {\n  return MG_REG(bank + FLASH_SR) & ((MG_BIT(11) - 1) << 17);  // RM0433 4.9.5\n}\n\nMG_IRAM static void flash_wait(uint32_t bank) {\n  while (MG_REG(bank + FLASH_SR) & (MG_BIT(0) | MG_BIT(2))) (void) 0;\n}\n\nMG_IRAM static void flash_clear_err(uint32_t bank) {\n  flash_wait(bank);                                      // Wait until ready\n  MG_REG(bank + FLASH_CCR) = ((MG_BIT(11) - 1) << 16U);  // Clear all errors\n}\n\nMG_IRAM static bool flash_bank_is_swapped(uint32_t bank) {\n  return MG_REG(bank + FLASH_OPTCR) & MG_BIT(31);  // RM0433 4.9.7\n}\n\n// Figure out flash bank based on the address\nMG_IRAM static uint32_t flash_bank(void *addr) {\n  size_t ofs = (char *) addr - (char *) s_mg_flash_stm32h7.start;\n  if (!is_dualbank()) return FLASH_BASE1;\n  return ofs < s_mg_flash_stm32h7.size / 2 ? FLASH_BASE1 : FLASH_BASE2;\n}\n\n// read-while-write, no need to disable IRQs for standalone usage\nMG_IRAM static bool mg_stm32h7_erase(void *addr) {\n  bool ok = false;\n  if (flash_page_start(addr) == false) {\n    MG_ERROR((\"%p is not on a sector boundary\", addr));\n  } else {\n    uintptr_t diff = (char *) addr - (char *) s_mg_flash_stm32h7.start;\n    uint32_t sector = diff / s_mg_flash_stm32h7.secsz;\n    uint32_t bank = flash_bank(addr);\n    uint32_t saved_cr = MG_REG(bank + FLASH_CR);  // Save CR value\n\n    flash_unlock();\n    if (sector > 7) sector -= 8;\n\n    flash_clear_err(bank);\n    MG_REG(bank + FLASH_CR) = MG_BIT(5);             // 32-bit write parallelism\n    MG_REG(bank + FLASH_CR) |= (sector & 7U) << 8U;  // Sector to erase\n    MG_REG(bank + FLASH_CR) |= MG_BIT(2);            // Sector erase bit\n    MG_REG(bank + FLASH_CR) |= MG_BIT(7);            // Start erasing\n    ok = !flash_is_err(bank);\n    MG_DEBUG((\"Erase sector %lu @ %p %s. CR %#lx SR %#lx\", sector, addr,\n              ok ? \"ok\" : \"fail\", MG_REG(bank + FLASH_CR),\n              MG_REG(bank + FLASH_SR)));\n    MG_REG(bank + FLASH_CR) = saved_cr;  // Restore CR\n  }\n  return ok;\n}\n\nMG_IRAM static bool mg_stm32h7_swap(void) {\n  if (!is_dualbank()) return true;\n  uint32_t bank = FLASH_BASE1;\n  uint32_t desired = flash_bank_is_swapped(bank) ? 0 : MG_BIT(31);\n  flash_unlock();\n  flash_clear_err(bank);\n  // printf(\"OPTSR_PRG 1 %#lx\\n\", FLASH->OPTSR_PRG);\n  MG_SET_BITS(MG_REG(bank + FLASH_OPTSR_PRG), MG_BIT(31), desired);\n  // printf(\"OPTSR_PRG 2 %#lx\\n\", FLASH->OPTSR_PRG);\n  MG_REG(bank + FLASH_OPTCR) |= MG_BIT(1);  // OPTSTART\n  while ((MG_REG(bank + FLASH_OPTSR_CUR) & MG_BIT(31)) != desired) (void) 0;\n  return true;\n}\n\nstatic bool s_flash_irq_disabled;\n\nMG_IRAM static bool mg_stm32h7_write(void *addr, const void *buf, size_t len) {\n  if ((len % s_mg_flash_stm32h7.align) != 0) {\n    MG_ERROR((\"%lu is not aligned to %lu\", len, s_mg_flash_stm32h7.align));\n    return false;\n  }\n  uint32_t bank = flash_bank(addr);\n  uint32_t *dst = (uint32_t *) addr;\n  uint32_t *src = (uint32_t *) buf;\n  uint32_t *end = (uint32_t *) ((char *) buf + len);\n  bool ok = true;\n  MG_ARM_DISABLE_IRQ();\n  flash_unlock();\n  flash_clear_err(bank);\n  MG_REG(bank + FLASH_CR) = MG_BIT(1);   // Set programming flag\n  MG_REG(bank + FLASH_CR) |= MG_BIT(5);  // 32-bit write parallelism\n  while (ok && src < end) {\n    if (flash_page_start(dst) && mg_stm32h7_erase(dst) == false) {\n      ok = false;\n      break;\n    }\n    *(volatile uint32_t *) dst++ = *src++;\n    flash_wait(bank);\n    if (flash_is_err(bank)) ok = false;\n  }\n  if (!s_flash_irq_disabled) MG_ARM_ENABLE_IRQ();\n  MG_DEBUG((\"Flash write %lu bytes @ %p: %s. CR %#lx SR %#lx\", len, dst,\n            ok ? \"ok\" : \"fail\", MG_REG(bank + FLASH_CR),\n            MG_REG(bank + FLASH_SR)));\n  MG_REG(bank + FLASH_CR) &= ~MG_BIT(1);  // Clear programming flag\n  return ok;\n}\n\n// just overwrite instead of swap\nMG_IRAM static void single_bank_swap(char *p1, char *p2, size_t s, size_t ss) {\n  // no stdlib calls here\n  for (size_t ofs = 0; ofs < s; ofs += ss) {\n    mg_stm32h7_write(p1 + ofs, p2 + ofs, ss);\n  }\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  s_mg_flash_stm32h7.size = MG_REG(FLASH_SIZE_REG) * 1024;\n  if (IS_DUALCORE()) {\n    // Using only the 1st bank (mapped to CM7)\n    s_mg_flash_stm32h7.size /= 2;\n  }\n#ifdef __ZEPHYR__\n  *((uint32_t *)0xE000ED94) = 0;\n  MG_DEBUG((\"Jailbreak %s\", *((uint32_t *)0xE000ED94) == 0 ? \"successful\" : \"failed\"));\n#endif\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_stm32h7);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_stm32h7);\n}\n\nbool mg_ota_end(void) {\n  if (mg_ota_flash_end(&s_mg_flash_stm32h7)) {\n    if (is_dualbank()) {\n      // Bank swap is deferred until reset, been executing in flash, reset\n      *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n    } else {\n      // Swap partitions. Pray power does not go away\n      MG_INFO((\"Swapping partitions, size %u (%u sectors)\",\n               s_mg_flash_stm32h7.size,\n               s_mg_flash_stm32h7.size / s_mg_flash_stm32h7.secsz));\n      MG_INFO((\"Do NOT power off...\"));\n      mg_log_level = MG_LL_NONE;\n      s_flash_irq_disabled = true;\n      // Runs in RAM, will reset when finished\n      single_bank_swap(\n          (char *) s_mg_flash_stm32h7.start,\n          (char *) s_mg_flash_stm32h7.start + s_mg_flash_stm32h7.size / 2,\n          s_mg_flash_stm32h7.size / 2, s_mg_flash_stm32h7.secsz);\n    }\n  }\n  return false;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/printf.c\"\n#endif\n\n\n\n\nsize_t mg_queue_printf(struct mg_queue *q, const char *fmt, ...) {\n  char *buf;\n  size_t len;\n  va_list ap1, ap2;\n  va_start(ap1, fmt);\n  len = mg_vsnprintf(NULL, 0, fmt, &ap1);\n  va_end(ap1);\n  if (len == 0 || mg_queue_book(q, &buf, len + 1) < len + 1)\n    return 0;  // Nah. Not enough space\n  va_start(ap2, fmt);\n  len = mg_vsnprintf(buf, len + 1, fmt, &ap2);\n  mg_queue_add(q, len);\n  va_end(ap2);\n  return len;\n}\n\nstatic void mg_pfn_iobuf_private(char ch, void *param, bool expand) {\n  struct mg_iobuf *io = (struct mg_iobuf *) param;\n  if (expand && io->len + 2 > io->size) mg_iobuf_resize(io, io->len + 2);\n  if (io->len + 2 <= io->size) {\n    io->buf[io->len++] = (uint8_t) ch;\n    io->buf[io->len] = 0;\n  } else if (io->len < io->size) {\n    io->buf[io->len++] = 0;  // Guarantee to 0-terminate\n  }\n}\n\nvoid mg_pfn_iobuf_noresize(char ch, void *param) {\n  mg_pfn_iobuf_private(ch, param, false);\n}\n\nvoid mg_pfn_iobuf(char ch, void *param) {\n  mg_pfn_iobuf_private(ch, param, true);\n}\n\nsize_t mg_vsnprintf(char *buf, size_t len, const char *fmt, va_list *ap) {\n  struct mg_iobuf io = {0, 0, 0, 0};\n  size_t n;\n  io.buf = (uint8_t *) buf, io.size = len;\n  n = mg_vxprintf(mg_pfn_iobuf_noresize, &io, fmt, ap);\n  if (n < len) buf[n] = '\\0';\n  return n;\n}\n\nsize_t mg_snprintf(char *buf, size_t len, const char *fmt, ...) {\n  va_list ap;\n  size_t n;\n  va_start(ap, fmt);\n  n = mg_vsnprintf(buf, len, fmt, &ap);\n  va_end(ap);\n  return n;\n}\n\nchar *mg_vmprintf(const char *fmt, va_list *ap) {\n  struct mg_iobuf io = {0, 0, 0, 256};\n  mg_vxprintf(mg_pfn_iobuf, &io, fmt, ap);\n  return (char *) io.buf;\n}\n\nchar *mg_mprintf(const char *fmt, ...) {\n  char *s;\n  va_list ap;\n  va_start(ap, fmt);\n  s = mg_vmprintf(fmt, &ap);\n  va_end(ap);\n  return s;\n}\n\nvoid mg_pfn_stdout(char c, void *param) {\n  putchar(c);\n  (void) param;\n}\n\nstatic size_t print_ip4(void (*out)(char, void *), void *arg, uint8_t *p) {\n  return mg_xprintf(out, arg, \"%d.%d.%d.%d\", p[0], p[1], p[2], p[3]);\n}\n\nstatic size_t print_ip6(void (*out)(char, void *), void *arg, uint16_t *p) {\n  return mg_xprintf(out, arg, \"[%x:%x:%x:%x:%x:%x:%x:%x]\", mg_ntohs(p[0]),\n                    mg_ntohs(p[1]), mg_ntohs(p[2]), mg_ntohs(p[3]),\n                    mg_ntohs(p[4]), mg_ntohs(p[5]), mg_ntohs(p[6]),\n                    mg_ntohs(p[7]));\n}\n\nsize_t mg_print_ip4(void (*out)(char, void *), void *arg, va_list *ap) {\n  uint8_t *p = va_arg(*ap, uint8_t *);\n  return print_ip4(out, arg, p);\n}\n\nsize_t mg_print_ip6(void (*out)(char, void *), void *arg, va_list *ap) {\n  uint16_t *p = va_arg(*ap, uint16_t *);\n  return print_ip6(out, arg, p);\n}\n\nsize_t mg_print_ip(void (*out)(char, void *), void *arg, va_list *ap) {\n  struct mg_addr *addr = va_arg(*ap, struct mg_addr *);\n  if (addr->is_ip6) return print_ip6(out, arg, (uint16_t *) addr->addr.ip);\n  return print_ip4(out, arg, (uint8_t *) &addr->addr.ip);\n}\n\nsize_t mg_print_ip_port(void (*out)(char, void *), void *arg, va_list *ap) {\n  struct mg_addr *a = va_arg(*ap, struct mg_addr *);\n  return mg_xprintf(out, arg, \"%M:%hu\", mg_print_ip, a, mg_ntohs(a->port));\n}\n\nstatic size_t print_mac(void (*out)(char, void *), void *arg, uint8_t *p) {\n  return mg_xprintf(out, arg, \"%02x:%02x:%02x:%02x:%02x:%02x\", p[0], p[1], p[2],\n                    p[3], p[4], p[5]);\n}\n\nsize_t mg_print_mac(void (*out)(char, void *), void *arg, va_list *ap) {\n  uint8_t *p = va_arg(*ap, uint8_t *);\n  return print_mac(out, arg, p);\n}\n\n#if MG_ENABLE_TCPIP\nsize_t mg_print_l2addr(void (*out)(char, void *), void *arg, va_list *ap) {\n  enum mg_l2type type = (enum mg_l2type) va_arg(*ap, int);\n  if (type == MG_TCPIP_L2_ETH) {\n    uint8_t *p = va_arg(*ap, uint8_t *);\n    return print_mac(out, arg, p);\n  }\n  return 0;\n}\n#endif\n\nstatic char mg_esc(int c, bool esc) {\n  const char *p, *esc1 = \"\\b\\f\\n\\r\\t\\\\\\\"\", *esc2 = \"bfnrt\\\\\\\"\";\n  for (p = esc ? esc1 : esc2; *p != '\\0'; p++) {\n    if (*p == c) return esc ? esc2[p - esc1] : esc1[p - esc2];\n  }\n  return 0;\n}\n\nstatic char mg_escape(int c) {\n  return mg_esc(c, true);\n}\n\nstatic size_t qcpy(void (*out)(char, void *), void *ptr, char *buf,\n                   size_t len) {\n  size_t i = 0, extra = 0;\n  for (i = 0; i < len && buf[i] != '\\0'; i++) {\n    char c = mg_escape(buf[i]);\n    if (c) {\n      out('\\\\', ptr), out(c, ptr), extra++;\n    } else {\n      out(buf[i], ptr);\n    }\n  }\n  return i + extra;\n}\n\nstatic size_t bcpy(void (*out)(char, void *), void *arg, uint8_t *buf,\n                   size_t len) {\n  size_t i, j, n = 0;\n  const char *t =\n      \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n  for (i = 0; i < len; i += 3) {\n    uint8_t c1 = buf[i], c2 = i + 1 < len ? buf[i + 1] : 0,\n            c3 = i + 2 < len ? buf[i + 2] : 0;\n    char tmp[4] = {0, 0, '=', '='};\n    tmp[0] = t[c1 >> 2], tmp[1] = t[(c1 & 3) << 4 | (c2 >> 4)];\n    if (i + 1 < len) tmp[2] = t[(c2 & 15) << 2 | (c3 >> 6)];\n    if (i + 2 < len) tmp[3] = t[c3 & 63];\n    for (j = 0; j < sizeof(tmp) && tmp[j] != '\\0'; j++) out(tmp[j], arg);\n    n += j;\n  }\n  return n;\n}\n\nsize_t mg_print_hex(void (*out)(char, void *), void *arg, va_list *ap) {\n  size_t bl = (size_t) va_arg(*ap, int);\n  uint8_t *p = va_arg(*ap, uint8_t *);\n  const char *hex = \"0123456789abcdef\";\n  size_t j;\n  for (j = 0; j < bl; j++) {\n    out(hex[(p[j] >> 4) & 0x0F], arg);\n    out(hex[p[j] & 0x0F], arg);\n  }\n  return 2 * bl;\n}\nsize_t mg_print_base64(void (*out)(char, void *), void *arg, va_list *ap) {\n  size_t len = (size_t) va_arg(*ap, int);\n  uint8_t *buf = va_arg(*ap, uint8_t *);\n  return bcpy(out, arg, buf, len);\n}\n\nsize_t mg_print_esc(void (*out)(char, void *), void *arg, va_list *ap) {\n  size_t len = (size_t) va_arg(*ap, int);\n  char *p = va_arg(*ap, char *);\n  if (len == 0) len = p == NULL ? 0 : strlen(p);\n  return qcpy(out, arg, p, len);\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/queue.c\"\n#endif\n\n\n\n#if (defined(__GNUC__) && (__GNUC__ > 4) ||                                \\\n     (defined(__GNUC_MINOR__) && __GNUC__ == 4 && __GNUC_MINOR__ >= 1)) || \\\n    defined(__clang__)\n#define MG_MEMORY_BARRIER() __sync_synchronize()\n#elif defined(_MSC_VER) && _MSC_VER >= 1700\n#define MG_MEMORY_BARRIER() MemoryBarrier()\n#elif !defined(MG_MEMORY_BARRIER)\n#define MG_MEMORY_BARRIER()\n#endif\n\n// Every message in a queue is prepended by a 32-bit message length (ML).\n// If ML is 0, then it is the end, and reader must wrap to the beginning.\n//\n//  Queue when q->tail <= q->head:\n//  |----- free -----| ML | message1 | ML | message2 |  ----- free ------|\n//  ^                ^                               ^                   ^\n// buf              tail                            head                len\n//\n//  Queue when q->tail > q->head:\n//  | ML | message2 |----- free ------| ML | message1 | 0 |---- free ----|\n//  ^               ^                 ^                                  ^\n// buf             head              tail                               len\n\nvoid mg_queue_init(struct mg_queue *q, char *buf, size_t size) {\n  q->size = size;\n  q->buf = buf;\n  q->head = q->tail = 0;\n}\n\nstatic size_t mg_queue_read_len(struct mg_queue *q) {\n  uint32_t n = 0;\n  MG_MEMORY_BARRIER();\n  memcpy(&n, q->buf + q->tail, sizeof(n));\n  assert(q->tail + n + sizeof(n) <= q->size);\n  return n;\n}\n\nstatic void mg_queue_write_len(struct mg_queue *q, size_t len) {\n  uint32_t n = (uint32_t) len;\n  memcpy(q->buf + q->head, &n, sizeof(n));\n  MG_MEMORY_BARRIER();\n}\n\nsize_t mg_queue_book(struct mg_queue *q, char **buf, size_t len) {\n  size_t space = 0, hs = sizeof(uint32_t) * 2;  // *2 is for the 0 marker\n  if (q->head >= q->tail && q->head + len + hs <= q->size) {\n    space = q->size - q->head - hs;  // There is enough space\n  } else if (q->head >= q->tail && q->tail > hs) {\n    mg_queue_write_len(q, 0);  // Not enough space ahead\n    q->head = 0;               // Wrap head to the beginning\n  }\n  if (q->head + hs + len < q->tail) space = q->tail - q->head - hs;\n  if (buf != NULL) *buf = q->buf + q->head + sizeof(uint32_t);\n  return space;\n}\n\nsize_t mg_queue_next(struct mg_queue *q, char **buf) {\n  size_t len = 0;\n  if (q->tail != q->head) {\n    len = mg_queue_read_len(q);\n    if (len == 0) {  // Zero (head wrapped) ?\n      q->tail = 0;   // Reset tail to the start\n      if (q->head > q->tail) len = mg_queue_read_len(q);  // Read again\n    }\n  }\n  if (buf != NULL) *buf = q->buf + q->tail + sizeof(uint32_t);\n  assert(q->tail + len <= q->size);\n  return len;\n}\n\nvoid mg_queue_add(struct mg_queue *q, size_t len) {\n  assert(len > 0);\n  mg_queue_write_len(q, len);\n  assert(q->head + sizeof(uint32_t) * 2 + len <= q->size);\n  q->head += len + sizeof(uint32_t);\n}\n\nvoid mg_queue_del(struct mg_queue *q, size_t len) {\n  q->tail += len + sizeof(uint32_t);\n  assert(q->tail + sizeof(uint32_t) <= q->size);\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/rpc.c\"\n#endif\n\n\n\n\nvoid mg_rpc_add(struct mg_rpc **head, struct mg_str method,\n                void (*fn)(struct mg_rpc_req *), void *fn_data) {\n  struct mg_rpc *rpc = (struct mg_rpc *) mg_calloc(1, sizeof(*rpc));\n  if (rpc != NULL) {\n    rpc->method = mg_strdup(method);\n    rpc->fn = fn;\n    rpc->fn_data = fn_data;\n    rpc->next = *head, *head = rpc;\n  }\n}\n\nvoid mg_rpc_del(struct mg_rpc **head, void (*fn)(struct mg_rpc_req *)) {\n  struct mg_rpc *r;\n  while ((r = *head) != NULL) {\n    if (r->fn == fn || fn == NULL) {\n      *head = r->next;\n      mg_free((void *) r->method.buf);\n      mg_free(r);\n    } else {\n      head = &(*head)->next;\n    }\n  }\n}\n\nstatic void mg_rpc_call(struct mg_rpc_req *r, struct mg_str method) {\n  struct mg_rpc *h = r->head == NULL ? NULL : *r->head;\n  while (h != NULL && !mg_match(method, h->method, NULL)) h = h->next;\n  if (h != NULL) {\n    r->rpc = h;\n    h->fn(r);\n  } else {\n    mg_rpc_err(r, -32601, \"\\\"%.*s not found\\\"\", (int) method.len, method.buf);\n  }\n}\n\nvoid mg_rpc_process(struct mg_rpc_req *r) {\n  int len, off = mg_json_get(r->frame, \"$.method\", &len);\n  if (off > 0 && r->frame.buf[off] == '\"') {\n    struct mg_str method = mg_str_n(&r->frame.buf[off + 1], (size_t) len - 2);\n    mg_rpc_call(r, method);\n  } else if ((off = mg_json_get(r->frame, \"$.result\", &len)) > 0 ||\n             (off = mg_json_get(r->frame, \"$.error\", &len)) > 0) {\n    mg_rpc_call(r, mg_str(\"\"));  // JSON response! call \"\" method handler\n  } else {\n    mg_rpc_err(r, -32700, \"%m\", mg_print_esc, (int) r->frame.len,\n               r->frame.buf);  // Invalid\n  }\n}\n\nvoid mg_rpc_vok(struct mg_rpc_req *r, const char *fmt, va_list *ap) {\n  int len, off = mg_json_get(r->frame, \"$.id\", &len);\n  if (off > 0) {\n    mg_xprintf(r->pfn, r->pfn_data, \"{%m:%.*s,%m:\", mg_print_esc, 0, \"id\", len,\n               &r->frame.buf[off], mg_print_esc, 0, \"result\");\n    mg_vxprintf(r->pfn, r->pfn_data, fmt == NULL ? \"null\" : fmt, ap);\n    mg_xprintf(r->pfn, r->pfn_data, \"}\");\n  }\n}\n\nvoid mg_rpc_ok(struct mg_rpc_req *r, const char *fmt, ...) {\n  va_list ap;\n  va_start(ap, fmt);\n  mg_rpc_vok(r, fmt, &ap);\n  va_end(ap);\n}\n\nvoid mg_rpc_verr(struct mg_rpc_req *r, int code, const char *fmt, va_list *ap) {\n  int len, off = mg_json_get(r->frame, \"$.id\", &len);\n  mg_xprintf(r->pfn, r->pfn_data, \"{\");\n  if (off > 0) {\n    mg_xprintf(r->pfn, r->pfn_data, \"%m:%.*s,\", mg_print_esc, 0, \"id\", len,\n               &r->frame.buf[off]);\n  }\n  mg_xprintf(r->pfn, r->pfn_data, \"%m:{%m:%d,%m:\", mg_print_esc, 0, \"error\",\n             mg_print_esc, 0, \"code\", code, mg_print_esc, 0, \"message\");\n  mg_vxprintf(r->pfn, r->pfn_data, fmt == NULL ? \"null\" : fmt, ap);\n  mg_xprintf(r->pfn, r->pfn_data, \"}}\");\n}\n\nvoid mg_rpc_err(struct mg_rpc_req *r, int code, const char *fmt, ...) {\n  va_list ap;\n  va_start(ap, fmt);\n  mg_rpc_verr(r, code, fmt, &ap);\n  va_end(ap);\n}\n\nstatic size_t print_methods(mg_pfn_t pfn, void *pfn_data, va_list *ap) {\n  struct mg_rpc *h, **head = (struct mg_rpc **) va_arg(*ap, void **);\n  size_t len = 0;\n  for (h = *head; h != NULL; h = h->next) {\n    if (h->method.len == 0) continue;  // Ignore response handler\n    len += mg_xprintf(pfn, pfn_data, \"%s%m\", h == *head ? \"\" : \",\",\n                      mg_print_esc, (int) h->method.len, h->method.buf);\n  }\n  return len;\n}\n\nvoid mg_rpc_list(struct mg_rpc_req *r) {\n  mg_rpc_ok(r, \"[%M]\", print_methods, r->head);\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/sha1.c\"\n#endif\n/* Copyright(c) By Steve Reid <steve@edmweb.com> */\n/* 100% Public Domain */\n\n\n\nunion char64long16 {\n  unsigned char c[64];\n  uint32_t l[16];\n};\n\n#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))\n\nstatic uint32_t blk0(union char64long16 *block, int i) {\n  if (MG_BIG_ENDIAN) {\n  } else {\n    block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) |\n                  (rol(block->l[i], 8) & 0x00FF00FF);\n  }\n  return block->l[i];\n}\n\n/* Avoid redefine warning (ARM /usr/include/sys/ucontext.h define R0~R4) */\n#undef blk\n#undef R0\n#undef R1\n#undef R2\n#undef R3\n#undef R4\n\n#define blk(i)                                                               \\\n  (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ block->l[(i + 8) & 15] ^ \\\n                              block->l[(i + 2) & 15] ^ block->l[i & 15],     \\\n                          1))\n#define R0(v, w, x, y, z, i)                                          \\\n  z += ((w & (x ^ y)) ^ y) + blk0(block, i) + 0x5A827999 + rol(v, 5); \\\n  w = rol(w, 30);\n#define R1(v, w, x, y, z, i)                                  \\\n  z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \\\n  w = rol(w, 30);\n#define R2(v, w, x, y, z, i)                          \\\n  z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); \\\n  w = rol(w, 30);\n#define R3(v, w, x, y, z, i)                                        \\\n  z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \\\n  w = rol(w, 30);\n#define R4(v, w, x, y, z, i)                          \\\n  z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \\\n  w = rol(w, 30);\n\nstatic void mg_sha1_transform(uint32_t state[5],\n                              const unsigned char *buffer) {\n  uint32_t a, b, c, d, e;\n  union char64long16 block[1];\n\n  memcpy(block, buffer, 64);\n  a = state[0];\n  b = state[1];\n  c = state[2];\n  d = state[3];\n  e = state[4];\n  R0(a, b, c, d, e, 0);\n  R0(e, a, b, c, d, 1);\n  R0(d, e, a, b, c, 2);\n  R0(c, d, e, a, b, 3);\n  R0(b, c, d, e, a, 4);\n  R0(a, b, c, d, e, 5);\n  R0(e, a, b, c, d, 6);\n  R0(d, e, a, b, c, 7);\n  R0(c, d, e, a, b, 8);\n  R0(b, c, d, e, a, 9);\n  R0(a, b, c, d, e, 10);\n  R0(e, a, b, c, d, 11);\n  R0(d, e, a, b, c, 12);\n  R0(c, d, e, a, b, 13);\n  R0(b, c, d, e, a, 14);\n  R0(a, b, c, d, e, 15);\n  R1(e, a, b, c, d, 16);\n  R1(d, e, a, b, c, 17);\n  R1(c, d, e, a, b, 18);\n  R1(b, c, d, e, a, 19);\n  R2(a, b, c, d, e, 20);\n  R2(e, a, b, c, d, 21);\n  R2(d, e, a, b, c, 22);\n  R2(c, d, e, a, b, 23);\n  R2(b, c, d, e, a, 24);\n  R2(a, b, c, d, e, 25);\n  R2(e, a, b, c, d, 26);\n  R2(d, e, a, b, c, 27);\n  R2(c, d, e, a, b, 28);\n  R2(b, c, d, e, a, 29);\n  R2(a, b, c, d, e, 30);\n  R2(e, a, b, c, d, 31);\n  R2(d, e, a, b, c, 32);\n  R2(c, d, e, a, b, 33);\n  R2(b, c, d, e, a, 34);\n  R2(a, b, c, d, e, 35);\n  R2(e, a, b, c, d, 36);\n  R2(d, e, a, b, c, 37);\n  R2(c, d, e, a, b, 38);\n  R2(b, c, d, e, a, 39);\n  R3(a, b, c, d, e, 40);\n  R3(e, a, b, c, d, 41);\n  R3(d, e, a, b, c, 42);\n  R3(c, d, e, a, b, 43);\n  R3(b, c, d, e, a, 44);\n  R3(a, b, c, d, e, 45);\n  R3(e, a, b, c, d, 46);\n  R3(d, e, a, b, c, 47);\n  R3(c, d, e, a, b, 48);\n  R3(b, c, d, e, a, 49);\n  R3(a, b, c, d, e, 50);\n  R3(e, a, b, c, d, 51);\n  R3(d, e, a, b, c, 52);\n  R3(c, d, e, a, b, 53);\n  R3(b, c, d, e, a, 54);\n  R3(a, b, c, d, e, 55);\n  R3(e, a, b, c, d, 56);\n  R3(d, e, a, b, c, 57);\n  R3(c, d, e, a, b, 58);\n  R3(b, c, d, e, a, 59);\n  R4(a, b, c, d, e, 60);\n  R4(e, a, b, c, d, 61);\n  R4(d, e, a, b, c, 62);\n  R4(c, d, e, a, b, 63);\n  R4(b, c, d, e, a, 64);\n  R4(a, b, c, d, e, 65);\n  R4(e, a, b, c, d, 66);\n  R4(d, e, a, b, c, 67);\n  R4(c, d, e, a, b, 68);\n  R4(b, c, d, e, a, 69);\n  R4(a, b, c, d, e, 70);\n  R4(e, a, b, c, d, 71);\n  R4(d, e, a, b, c, 72);\n  R4(c, d, e, a, b, 73);\n  R4(b, c, d, e, a, 74);\n  R4(a, b, c, d, e, 75);\n  R4(e, a, b, c, d, 76);\n  R4(d, e, a, b, c, 77);\n  R4(c, d, e, a, b, 78);\n  R4(b, c, d, e, a, 79);\n  state[0] += a;\n  state[1] += b;\n  state[2] += c;\n  state[3] += d;\n  state[4] += e;\n  /* Erase working structures. The order of operations is important,\n   * used to ensure that compiler doesn't optimize those out. */\n  memset(block, 0, sizeof(block));\n  a = b = c = d = e = 0;\n  (void) a;\n  (void) b;\n  (void) c;\n  (void) d;\n  (void) e;\n}\n\nvoid mg_sha1_init(mg_sha1_ctx *context) {\n  context->state[0] = 0x67452301;\n  context->state[1] = 0xEFCDAB89;\n  context->state[2] = 0x98BADCFE;\n  context->state[3] = 0x10325476;\n  context->state[4] = 0xC3D2E1F0;\n  context->count[0] = context->count[1] = 0;\n}\n\nvoid mg_sha1_update(mg_sha1_ctx *context, const unsigned char *data,\n                    size_t len) {\n  size_t i, j;\n\n  j = context->count[0];\n  if ((context->count[0] += (uint32_t) len << 3) < j) context->count[1]++;\n  context->count[1] += (uint32_t) (len >> 29);\n  j = (j >> 3) & 63;\n  if ((j + len) > 63) {\n    memcpy(&context->buffer[j], data, (i = 64 - j));\n    mg_sha1_transform(context->state, context->buffer);\n    for (; i + 63 < len; i += 64) {\n      mg_sha1_transform(context->state, &data[i]);\n    }\n    j = 0;\n  } else\n    i = 0;\n  memcpy(&context->buffer[j], &data[i], len - i);\n}\n\nvoid mg_sha1_final(unsigned char digest[20], mg_sha1_ctx *context) {\n  unsigned i;\n  unsigned char finalcount[8], c;\n\n  for (i = 0; i < 8; i++) {\n    finalcount[i] = (unsigned char) ((context->count[(i >= 4 ? 0 : 1)] >>\n                                      ((3 - (i & 3)) * 8)) &\n                                     255);\n  }\n  c = 0200;\n  mg_sha1_update(context, &c, 1);\n  while ((context->count[0] & 504) != 448) {\n    c = 0000;\n    mg_sha1_update(context, &c, 1);\n  }\n  mg_sha1_update(context, finalcount, 8);\n  for (i = 0; i < 20; i++) {\n    digest[i] =\n        (unsigned char) ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255);\n  }\n  memset(context, '\\0', sizeof(*context));\n  memset(&finalcount, '\\0', sizeof(finalcount));\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/sha256.c\"\n#endif\n// https://github.com/B-Con/crypto-algorithms\n// Author:     Brad Conte (brad AT bradconte.com)\n// Disclaimer: This code is presented \"as is\" without any guarantees.\n// Details:    Defines the API for the corresponding SHA1 implementation.\n// Copyright:  public domain\n\n\n\n#define ror(x, n) (((x) >> (n)) | ((x) << (32 - (n))))\n#define ch(x, y, z) (((x) & (y)) ^ (~(x) & (z)))\n#define maj(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))\n#define ep0(x) (ror(x, 2) ^ ror(x, 13) ^ ror(x, 22))\n#define ep1(x) (ror(x, 6) ^ ror(x, 11) ^ ror(x, 25))\n#define sig0(x) (ror(x, 7) ^ ror(x, 18) ^ ((x) >> 3))\n#define sig1(x) (ror(x, 17) ^ ror(x, 19) ^ ((x) >> 10))\n\nstatic const uint32_t mg_sha256_k[64] = {\n    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,\n    0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n    0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,\n    0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n    0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n    0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,\n    0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,\n    0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n    0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2};\n\nvoid mg_sha256_init(mg_sha256_ctx *ctx) {\n  ctx->len = 0;\n  ctx->bits = 0;\n  ctx->state[0] = 0x6a09e667;\n  ctx->state[1] = 0xbb67ae85;\n  ctx->state[2] = 0x3c6ef372;\n  ctx->state[3] = 0xa54ff53a;\n  ctx->state[4] = 0x510e527f;\n  ctx->state[5] = 0x9b05688c;\n  ctx->state[6] = 0x1f83d9ab;\n  ctx->state[7] = 0x5be0cd19;\n}\n\nstatic void mg_sha256_chunk(mg_sha256_ctx *ctx) {\n  int i, j;\n  uint32_t a, b, c, d, e, f, g, h;\n  uint32_t m[64];\n  for (i = 0, j = 0; i < 16; ++i, j += 4)\n    m[i] = (uint32_t) (((uint32_t) ctx->buffer[j] << 24) |\n                       ((uint32_t) ctx->buffer[j + 1] << 16) |\n                       ((uint32_t) ctx->buffer[j + 2] << 8) |\n                       ((uint32_t) ctx->buffer[j + 3]));\n  for (; i < 64; ++i)\n    m[i] = sig1(m[i - 2]) + m[i - 7] + sig0(m[i - 15]) + m[i - 16];\n\n  a = ctx->state[0];\n  b = ctx->state[1];\n  c = ctx->state[2];\n  d = ctx->state[3];\n  e = ctx->state[4];\n  f = ctx->state[5];\n  g = ctx->state[6];\n  h = ctx->state[7];\n\n  for (i = 0; i < 64; ++i) {\n    uint32_t t1 = h + ep1(e) + ch(e, f, g) + mg_sha256_k[i] + m[i];\n    uint32_t t2 = ep0(a) + maj(a, b, c);\n    h = g;\n    g = f;\n    f = e;\n    e = d + t1;\n    d = c;\n    c = b;\n    b = a;\n    a = t1 + t2;\n  }\n\n  ctx->state[0] += a;\n  ctx->state[1] += b;\n  ctx->state[2] += c;\n  ctx->state[3] += d;\n  ctx->state[4] += e;\n  ctx->state[5] += f;\n  ctx->state[6] += g;\n  ctx->state[7] += h;\n}\n\nvoid mg_sha256_update(mg_sha256_ctx *ctx, const unsigned char *data,\n                      size_t len) {\n  size_t i;\n  for (i = 0; i < len; i++) {\n    ctx->buffer[ctx->len] = data[i];\n    if ((++ctx->len) == 64) {\n      mg_sha256_chunk(ctx);\n      ctx->bits += 512;\n      ctx->len = 0;\n    }\n  }\n}\n\n// TODO: make final reusable (remove side effects)\nvoid mg_sha256_final(unsigned char digest[32], mg_sha256_ctx *ctx) {\n  uint32_t i = ctx->len;\n  if (i < 56) {\n    ctx->buffer[i++] = 0x80;\n    while (i < 56) {\n      ctx->buffer[i++] = 0x00;\n    }\n  } else {\n    ctx->buffer[i++] = 0x80;\n    while (i < 64) {\n      ctx->buffer[i++] = 0x00;\n    }\n    mg_sha256_chunk(ctx);\n    memset(ctx->buffer, 0, 56);\n  }\n\n  ctx->bits += ctx->len * 8;\n  ctx->buffer[63] = (uint8_t) ((ctx->bits) & 0xff);\n  ctx->buffer[62] = (uint8_t) ((ctx->bits >> 8) & 0xff);\n  ctx->buffer[61] = (uint8_t) ((ctx->bits >> 16) & 0xff);\n  ctx->buffer[60] = (uint8_t) ((ctx->bits >> 24) & 0xff);\n  ctx->buffer[59] = (uint8_t) ((ctx->bits >> 32) & 0xff);\n  ctx->buffer[58] = (uint8_t) ((ctx->bits >> 40) & 0xff);\n  ctx->buffer[57] = (uint8_t) ((ctx->bits >> 48) & 0xff);\n  ctx->buffer[56] = (uint8_t) ((ctx->bits >> 56) & 0xff);\n  mg_sha256_chunk(ctx);\n\n  for (i = 0; i < 4; ++i) {\n    digest[i] = (uint8_t) ((ctx->state[0] >> (24 - i * 8)) & 0xff);\n    digest[i + 4] = (uint8_t) ((ctx->state[1] >> (24 - i * 8)) & 0xff);\n    digest[i + 8] = (uint8_t) ((ctx->state[2] >> (24 - i * 8)) & 0xff);\n    digest[i + 12] = (uint8_t) ((ctx->state[3] >> (24 - i * 8)) & 0xff);\n    digest[i + 16] = (uint8_t) ((ctx->state[4] >> (24 - i * 8)) & 0xff);\n    digest[i + 20] = (uint8_t) ((ctx->state[5] >> (24 - i * 8)) & 0xff);\n    digest[i + 24] = (uint8_t) ((ctx->state[6] >> (24 - i * 8)) & 0xff);\n    digest[i + 28] = (uint8_t) ((ctx->state[7] >> (24 - i * 8)) & 0xff);\n  }\n}\n\nvoid mg_sha256(uint8_t dst[32], uint8_t *data, size_t datasz) {\n  mg_sha256_ctx ctx;\n  mg_sha256_init(&ctx);\n  mg_sha256_update(&ctx, data, datasz);\n  mg_sha256_final(dst, &ctx);\n}\n\nvoid mg_hmac_sha256(uint8_t dst[32], uint8_t *key, size_t keysz, uint8_t *data,\n                    size_t datasz) {\n  mg_sha256_ctx ctx;\n  uint8_t k[64] = {0};\n  uint8_t o_pad[64], i_pad[64];\n  unsigned int i;\n  memset(i_pad, 0x36, sizeof(i_pad));\n  memset(o_pad, 0x5c, sizeof(o_pad));\n  if (keysz < 64) {\n    if (keysz > 0) memmove(k, key, keysz);\n  } else {\n    mg_sha256_init(&ctx);\n    mg_sha256_update(&ctx, key, keysz);\n    mg_sha256_final(k, &ctx);\n  }\n  for (i = 0; i < sizeof(k); i++) {\n    i_pad[i] ^= k[i];\n    o_pad[i] ^= k[i];\n  }\n  mg_sha256_init(&ctx);\n  mg_sha256_update(&ctx, i_pad, sizeof(i_pad));\n  mg_sha256_update(&ctx, data, datasz);\n  mg_sha256_final(dst, &ctx);\n  mg_sha256_init(&ctx);\n  mg_sha256_update(&ctx, o_pad, sizeof(o_pad));\n  mg_sha256_update(&ctx, dst, 32);\n  mg_sha256_final(dst, &ctx);\n}\n\n#define rotr64(x, n) (((x) >> (n)) | ((x) << (64 - (n))))\n#define ep064(x) (rotr64(x, 28) ^ rotr64(x, 34) ^ rotr64(x, 39))\n#define ep164(x) (rotr64(x, 14) ^ rotr64(x, 18) ^ rotr64(x, 41))\n#define sig064(x) (rotr64(x, 1) ^ rotr64(x, 8) ^ ((x) >> 7))\n#define sig164(x) (rotr64(x, 19) ^ rotr64(x, 61) ^ ((x) >> 6))\n\nstatic const uint64_t mg_sha256_k2[80] = {\n#if defined(__DCC__)\n    0x428a2f98d728ae22ull, 0x7137449123ef65cdull, 0xb5c0fbcfec4d3b2full,\n    0xe9b5dba58189dbbcull, 0x3956c25bf348b538ull, 0x59f111f1b605d019ull,\n    0x923f82a4af194f9bull, 0xab1c5ed5da6d8118ull, 0xd807aa98a3030242ull,\n    0x12835b0145706fbeull, 0x243185be4ee4b28cull, 0x550c7dc3d5ffb4e2ull,\n    0x72be5d74f27b896full, 0x80deb1fe3b1696b1ull, 0x9bdc06a725c71235ull,\n    0xc19bf174cf692694ull, 0xe49b69c19ef14ad2ull, 0xefbe4786384f25e3ull,\n    0x0fc19dc68b8cd5b5ull, 0x240ca1cc77ac9c65ull, 0x2de92c6f592b0275ull,\n    0x4a7484aa6ea6e483ull, 0x5cb0a9dcbd41fbd4ull, 0x76f988da831153b5ull,\n    0x983e5152ee66dfabull, 0xa831c66d2db43210ull, 0xb00327c898fb213full,\n    0xbf597fc7beef0ee4ull, 0xc6e00bf33da88fc2ull, 0xd5a79147930aa725ull,\n    0x06ca6351e003826full, 0x142929670a0e6e70ull, 0x27b70a8546d22ffcull,\n    0x2e1b21385c26c926ull, 0x4d2c6dfc5ac42aedull, 0x53380d139d95b3dfull,\n    0x650a73548baf63deull, 0x766a0abb3c77b2a8ull, 0x81c2c92e47edaee6ull,\n    0x92722c851482353bull, 0xa2bfe8a14cf10364ull, 0xa81a664bbc423001ull,\n    0xc24b8b70d0f89791ull, 0xc76c51a30654be30ull, 0xd192e819d6ef5218ull,\n    0xd69906245565a910ull, 0xf40e35855771202aull, 0x106aa07032bbd1b8ull,\n    0x19a4c116b8d2d0c8ull, 0x1e376c085141ab53ull, 0x2748774cdf8eeb99ull,\n    0x34b0bcb5e19b48a8ull, 0x391c0cb3c5c95a63ull, 0x4ed8aa4ae3418acbull,\n    0x5b9cca4f7763e373ull, 0x682e6ff3d6b2b8a3ull, 0x748f82ee5defb2fcull,\n    0x78a5636f43172f60ull, 0x84c87814a1f0ab72ull, 0x8cc702081a6439ecull,\n    0x90befffa23631e28ull, 0xa4506cebde82bde9ull, 0xbef9a3f7b2c67915ull,\n    0xc67178f2e372532bull, 0xca273eceea26619cull, 0xd186b8c721c0c207ull,\n    0xeada7dd6cde0eb1eull, 0xf57d4f7fee6ed178ull, 0x06f067aa72176fbaull,\n    0x0a637dc5a2c898a6ull, 0x113f9804bef90daeull, 0x1b710b35131c471bull,\n    0x28db77f523047d84ull, 0x32caab7b40c72493ull, 0x3c9ebe0a15c9bebcull,\n    0x431d67c49c100d4cull, 0x4cc5d4becb3e42b6ull, 0x597f299cfc657e2aull,\n    0x5fcb6fab3ad6faecull, 0x6c44198c4a475817ull\n#else\n    0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f,\n    0xe9b5dba58189dbbc, 0x3956c25bf348b538, 0x59f111f1b605d019,\n    0x923f82a4af194f9b, 0xab1c5ed5da6d8118, 0xd807aa98a3030242,\n    0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,\n    0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235,\n    0xc19bf174cf692694, 0xe49b69c19ef14ad2, 0xefbe4786384f25e3,\n    0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, 0x2de92c6f592b0275,\n    0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5,\n    0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f,\n    0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725,\n    0x06ca6351e003826f, 0x142929670a0e6e70, 0x27b70a8546d22ffc,\n    0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df,\n    0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6,\n    0x92722c851482353b, 0xa2bfe8a14cf10364, 0xa81a664bbc423001,\n    0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218,\n    0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8,\n    0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99,\n    0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb,\n    0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc,\n    0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec,\n    0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915,\n    0xc67178f2e372532b, 0xca273eceea26619c, 0xd186b8c721c0c207,\n    0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba,\n    0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b,\n    0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc,\n    0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a,\n    0x5fcb6fab3ad6faec, 0x6c44198c4a475817\n#endif\n};\n\nstatic void mg_sha384_transform(mg_sha384_ctx *ctx, const uint8_t data[]) {\n  uint64_t m[80];\n  uint64_t a, b, c, d, e, f, g, h;\n  int i, j;\n\n  for (i = 0, j = 0; i < 16; ++i, j += 8)\n    m[i] = ((uint64_t) data[j] << 56) | ((uint64_t) data[j + 1] << 48) |\n           ((uint64_t) data[j + 2] << 40) | ((uint64_t) data[j + 3] << 32) |\n           ((uint64_t) data[j + 4] << 24) | ((uint64_t) data[j + 5] << 16) |\n           ((uint64_t) data[j + 6] << 8) | ((uint64_t) data[j + 7]);\n  for (; i < 80; ++i)\n    m[i] = sig164(m[i - 2]) + m[i - 7] + sig064(m[i - 15]) + m[i - 16];\n\n  a = ctx->state[0];\n  b = ctx->state[1];\n  c = ctx->state[2];\n  d = ctx->state[3];\n  e = ctx->state[4];\n  f = ctx->state[5];\n  g = ctx->state[6];\n  h = ctx->state[7];\n\n  for (i = 0; i < 80; ++i) {\n    uint64_t t1 = h + ep164(e) + ch(e, f, g) + mg_sha256_k2[i] + m[i];\n    uint64_t t2 = ep064(a) + maj(a, b, c);\n    h = g;\n    g = f;\n    f = e;\n    e = d + t1;\n    d = c;\n    c = b;\n    b = a;\n    a = t1 + t2;\n  }\n\n  ctx->state[0] += a;\n  ctx->state[1] += b;\n  ctx->state[2] += c;\n  ctx->state[3] += d;\n  ctx->state[4] += e;\n  ctx->state[5] += f;\n  ctx->state[6] += g;\n  ctx->state[7] += h;\n}\n\nvoid mg_sha384_init(mg_sha384_ctx *ctx) {\n  ctx->datalen = 0;\n  ctx->bitlen[0] = 0;\n  ctx->bitlen[1] = 0;\n#if defined(__DCC__)\n  ctx->state[0] = 0xcbbb9d5dc1059ed8ull;\n  ctx->state[1] = 0x629a292a367cd507ull;\n  ctx->state[2] = 0x9159015a3070dd17ull;\n  ctx->state[3] = 0x152fecd8f70e5939ull;\n  ctx->state[4] = 0x67332667ffc00b31ull;\n  ctx->state[5] = 0x8eb44a8768581511ull;\n  ctx->state[6] = 0xdb0c2e0d64f98fa7ull;\n  ctx->state[7] = 0x47b5481dbefa4fa4ull;\n#else\n  ctx->state[0] = 0xcbbb9d5dc1059ed8;\n  ctx->state[1] = 0x629a292a367cd507;\n  ctx->state[2] = 0x9159015a3070dd17;\n  ctx->state[3] = 0x152fecd8f70e5939;\n  ctx->state[4] = 0x67332667ffc00b31;\n  ctx->state[5] = 0x8eb44a8768581511;\n  ctx->state[6] = 0xdb0c2e0d64f98fa7;\n  ctx->state[7] = 0x47b5481dbefa4fa4;\n#endif\n}\n\nvoid mg_sha384_update(mg_sha384_ctx *ctx, const uint8_t *data, size_t len) {\n  size_t i;\n  for (i = 0; i < len; ++i) {\n    ctx->buffer[ctx->datalen] = data[i];\n    ctx->datalen++;\n    if (ctx->datalen == 128) {\n      mg_sha384_transform(ctx, ctx->buffer);\n      ctx->bitlen[1] += 1024;\n      if (ctx->bitlen[1] < 1024) ctx->bitlen[0]++;\n      ctx->datalen = 0;\n    }\n  }\n}\n\nvoid mg_sha384_final(uint8_t hash[48], mg_sha384_ctx *ctx) {\n  size_t i = ctx->datalen;\n\n  if (ctx->datalen < 112) {\n    ctx->buffer[i++] = 0x80;\n    while (i < 112) ctx->buffer[i++] = 0x00;\n  } else {\n    ctx->buffer[i++] = 0x80;\n    while (i < 128) ctx->buffer[i++] = 0x00;\n    mg_sha384_transform(ctx, ctx->buffer);\n    memset(ctx->buffer, 0, 112);\n  }\n\n  ctx->bitlen[1] += ctx->datalen * 8;\n  if (ctx->bitlen[1] < ctx->datalen * 8) ctx->bitlen[0]++;\n  ctx->buffer[127] = (uint8_t) (ctx->bitlen[1]);\n  ctx->buffer[126] = (uint8_t) (ctx->bitlen[1] >> 8);\n  ctx->buffer[125] = (uint8_t) (ctx->bitlen[1] >> 16);\n  ctx->buffer[124] = (uint8_t) (ctx->bitlen[1] >> 24);\n  ctx->buffer[123] = (uint8_t) (ctx->bitlen[1] >> 32);\n  ctx->buffer[122] = (uint8_t) (ctx->bitlen[1] >> 40);\n  ctx->buffer[121] = (uint8_t) (ctx->bitlen[1] >> 48);\n  ctx->buffer[120] = (uint8_t) (ctx->bitlen[1] >> 56);\n  ctx->buffer[119] = (uint8_t) (ctx->bitlen[0]);\n  ctx->buffer[118] = (uint8_t) (ctx->bitlen[0] >> 8);\n  ctx->buffer[117] = (uint8_t) (ctx->bitlen[0] >> 16);\n  ctx->buffer[116] = (uint8_t) (ctx->bitlen[0] >> 24);\n  ctx->buffer[115] = (uint8_t) (ctx->bitlen[0] >> 32);\n  ctx->buffer[114] = (uint8_t) (ctx->bitlen[0] >> 40);\n  ctx->buffer[113] = (uint8_t) (ctx->bitlen[0] >> 48);\n  ctx->buffer[112] = (uint8_t) (ctx->bitlen[0] >> 56);\n  mg_sha384_transform(ctx, ctx->buffer);\n\n  for (i = 0; i < 6; ++i) {\n    hash[i * 8] = (uint8_t) ((ctx->state[i] >> 56) & 0xff);\n    hash[i * 8 + 1] = (uint8_t) ((ctx->state[i] >> 48) & 0xff);\n    hash[i * 8 + 2] = (uint8_t) ((ctx->state[i] >> 40) & 0xff);\n    hash[i * 8 + 3] = (uint8_t) ((ctx->state[i] >> 32) & 0xff);\n    hash[i * 8 + 4] = (uint8_t) ((ctx->state[i] >> 24) & 0xff);\n    hash[i * 8 + 5] = (uint8_t) ((ctx->state[i] >> 16) & 0xff);\n    hash[i * 8 + 6] = (uint8_t) ((ctx->state[i] >> 8) & 0xff);\n    hash[i * 8 + 7] = (uint8_t) (ctx->state[i] & 0xff);\n  }\n}\n\nvoid mg_sha384(uint8_t dst[48], uint8_t *data, size_t datasz) {\n  mg_sha384_ctx ctx;\n  mg_sha384_init(&ctx);\n  mg_sha384_update(&ctx, data, datasz);\n  mg_sha384_final(dst, &ctx);\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/sntp.c\"\n#endif\n\n\n\n\n\n\n#define SNTP_TIME_OFFSET 2208988800U  // (1970 - 1900) in seconds\n#define SNTP_MAX_FRAC 4294967295.0    // 2 ** 32 - 1\n\nstatic uint64_t s_boot_timestamp = 0;  // Updated by SNTP\n\nuint64_t mg_now(void) {\n  return mg_millis() + s_boot_timestamp;\n}\n\nstatic int64_t gettimestamp(const uint32_t *data) {\n  uint32_t sec = mg_ntohl(data[0]), frac = mg_ntohl(data[1]);\n  if (sec) sec -= SNTP_TIME_OFFSET;\n  return ((int64_t) sec) * 1000 + (int64_t) (frac / SNTP_MAX_FRAC * 1000.0);\n}\n\nint64_t mg_sntp_parse(const unsigned char *buf, size_t len) {\n  int64_t epoch_milliseconds = -1;\n  int mode = len > 0 ? buf[0] & 7 : 0;\n  int version = len > 0 ? (buf[0] >> 3) & 7 : 0;\n  if (len < 48) {\n    MG_ERROR((\"%s\", \"corrupt packet\"));\n  } else if (mode != 4 && mode != 5) {\n    MG_ERROR((\"%s\", \"not a server reply\"));\n  } else if (buf[1] == 0) {\n    MG_ERROR((\"%s\", \"server sent a kiss of death\"));\n  } else if (version == 4 || version == 3) {\n    // int64_t ref = gettimestamp((uint32_t *) &buf[16]);\n    int64_t origin_time = gettimestamp((uint32_t *) &buf[24]);\n    int64_t receive_time = gettimestamp((uint32_t *) &buf[32]);\n    int64_t transmit_time = gettimestamp((uint32_t *) &buf[40]);\n    int64_t now = (int64_t) mg_millis();\n    int64_t latency = (now - origin_time) - (transmit_time - receive_time);\n    epoch_milliseconds = transmit_time + latency / 2;\n    s_boot_timestamp = (uint64_t) (epoch_milliseconds - now);\n  } else {\n    MG_ERROR((\"unexpected version: %d\", version));\n  }\n  return epoch_milliseconds;\n}\n\nstatic void sntp_cb(struct mg_connection *c, int ev, void *ev_data) {\n  uint64_t *expiration_time = (uint64_t *) c->data;\n  if (ev == MG_EV_OPEN) {\n    *expiration_time = mg_millis() + 3000;  // Store expiration time in 3s\n  } else if (ev == MG_EV_CONNECT) {\n    mg_sntp_request(c);\n  } else if (ev == MG_EV_READ) {\n    int64_t milliseconds = mg_sntp_parse(c->recv.buf, c->recv.len);\n    if (milliseconds > 0) {\n      s_boot_timestamp = (uint64_t) milliseconds - mg_millis();\n      mg_call(c, MG_EV_SNTP_TIME, (uint64_t *) &milliseconds);\n      MG_DEBUG((\"%lu got time: %lld ms from epoch\", c->id, milliseconds));\n    }\n    // mg_iobuf_del(&c->recv, 0, c->recv.len);  // Free receive buffer\n    c->is_closing = 1;\n  } else if (ev == MG_EV_POLL) {\n    if (mg_millis() > *expiration_time) c->is_closing = 1;\n  } else if (ev == MG_EV_CLOSE) {\n  }\n  (void) ev_data;\n}\n\nvoid mg_sntp_request(struct mg_connection *c) {\n  if (c->is_resolving) {\n    MG_ERROR((\"%lu wait until resolved\", c->id));\n  } else {\n    int64_t now = (int64_t) mg_millis();  // Use int64_t, for vc98\n    uint8_t buf[48] = {0};\n    uint32_t *t = (uint32_t *) &buf[40];\n    double frac = ((double) (now % 1000)) / 1000.0 * SNTP_MAX_FRAC;\n    buf[0] = (0 << 6) | (4 << 3) | 3;\n    t[0] = mg_htonl((uint32_t) (now / 1000) + SNTP_TIME_OFFSET);\n    t[1] = mg_htonl((uint32_t) frac);\n    mg_send(c, buf, sizeof(buf));\n  }\n}\n\nstruct mg_connection *mg_sntp_connect(struct mg_mgr *mgr, const char *url,\n                                      mg_event_handler_t fn, void *fn_data) {\n  if (url == NULL) url = \"udp://time.google.com:123\";\n  return mg_connect_svc(mgr, url, fn, fn_data, sntp_cb, NULL);\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/sock.c\"\n#endif\n\n\n\n\n\n\n\n\n\n\n\n#if MG_ENABLE_SOCKET\n\n#ifndef closesocket\n#define closesocket(x) close(x)\n#endif\n\n#define FD(c_) ((MG_SOCKET_TYPE) (size_t) (c_)->fd)\n#define S2PTR(s_) ((void *) (size_t) (s_))\n\n#ifndef MSG_NONBLOCKING\n#define MSG_NONBLOCKING 0\n#endif\n\n#ifndef AF_INET6\n#define AF_INET6 10\n#endif\n\n#ifndef MG_SOCK_ERR\n#define MG_SOCK_ERR(errcode) ((errcode) < 0 ? errno : 0)\n#endif\n\n#ifndef MG_SOCK_INTR\n#define MG_SOCK_INTR(fd) (fd == MG_INVALID_SOCKET && MG_SOCK_ERR(-1) == EINTR)\n#endif\n\n#ifndef MG_SOCK_PENDING\n#define MG_SOCK_PENDING(errcode) \\\n  (((errcode) < 0) && (errno == EINPROGRESS || errno == EWOULDBLOCK))\n#endif\n\n#ifndef MG_SOCK_RESET\n#define MG_SOCK_RESET(errcode) \\\n  (((errcode) < 0) && (errno == EPIPE || errno == ECONNRESET))\n#endif\n\nunion usa {\n  struct sockaddr sa;\n  struct sockaddr_in sin;\n#if MG_ENABLE_IPV6\n  struct sockaddr_in6 sin6;\n#endif\n};\n\nstatic socklen_t tousa(struct mg_addr *a, union usa *usa) {\n  socklen_t len = sizeof(usa->sin);\n  memset(usa, 0, sizeof(*usa));\n  usa->sin.sin_family = AF_INET;\n  usa->sin.sin_port = a->port;\n  memcpy(&usa->sin.sin_addr, a->addr.ip, sizeof(uint32_t));\n#if MG_ENABLE_IPV6\n  if (a->is_ip6) {\n    usa->sin.sin_family = AF_INET6;\n    usa->sin6.sin6_port = a->port;\n    usa->sin6.sin6_scope_id = a->scope_id;\n    memcpy(&usa->sin6.sin6_addr, a->addr.ip, sizeof(a->addr.ip));\n    len = sizeof(usa->sin6);\n  }\n#endif\n  return len;\n}\n\nstatic void tomgaddr(union usa *usa, struct mg_addr *a, bool is_ip6) {\n  a->is_ip6 = is_ip6;\n#if MG_ENABLE_IPV6\n  if (is_ip6) {\n    memcpy(a->addr.ip, &usa->sin6.sin6_addr, sizeof(a->addr.ip));\n    a->port = usa->sin6.sin6_port;\n    a->scope_id = (uint8_t) usa->sin6.sin6_scope_id;\n  } else\n#endif\n  {\n    a->port = usa->sin.sin_port;\n    memcpy(&a->addr.ip, &usa->sin.sin_addr, sizeof(uint32_t));\n  }\n}\n\nstatic void setlocaddr(MG_SOCKET_TYPE fd, struct mg_addr *addr) {\n  union usa usa;\n  socklen_t n = sizeof(usa);\n  if (getsockname(fd, &usa.sa, &n) == 0) {\n    tomgaddr(&usa, addr, n != sizeof(usa.sin));\n  }\n}\n\n// Get the local 'addr' the stack will use to connect to 'to'\nvoid mg_getlocaddr(struct mg_connection *c, struct mg_addr *to, struct mg_addr *addr);\nvoid mg_getlocaddr(struct mg_connection *c, struct mg_addr *to, struct mg_addr *addr) {\n  union usa usa;\n  socklen_t slen;\n  MG_SOCKET_TYPE fd;\n  int rc, af = to->is_ip6 ? AF_INET6 : AF_INET;\n  fd = socket(af, SOCK_DGRAM, IPPROTO_UDP);\n  if (fd == MG_INVALID_SOCKET) {\n    mg_error(c, \"socket(): %d\", MG_SOCK_ERR(-1));\n    return;\n  }\n  // NOTE(): TI-RTOS NDK may require binding\n  slen = tousa(to, &usa);\n  if ((rc = connect(fd, &usa.sa, slen)) != 0) {\n    mg_error(c, \"connect: %d\", MG_SOCK_ERR(rc));\n    return;\n  }\n  setlocaddr(fd, addr);\n  closesocket(fd);\n}\n\n\nstatic void iolog(struct mg_connection *c, char *buf, long n, bool r) {\n  if (n == MG_IO_WAIT) {\n    // Do nothing\n  } else if (n <= 0) {\n    c->is_closing = 1;  // Termination. Don't call mg_error(): #1529\n  } else if (n > 0) {\n    if (c->is_hexdumping) {\n      MG_INFO((\"\\n-- %lu %M %s %M %ld\", c->id, mg_print_ip_port, &c->loc,\n               r ? \"<-\" : \"->\", mg_print_ip_port, &c->rem, n));\n      mg_hexdump(buf, (size_t) n);\n    }\n    if (r) {\n      c->recv.len += (size_t) n;\n      mg_call(c, MG_EV_READ, &n);\n    } else {\n      mg_iobuf_del(&c->send, 0, (size_t) n);\n      // if (c->send.len == 0) mg_iobuf_resize(&c->send, 0);\n      if (c->send.len == 0) {\n        MG_EPOLL_MOD(c, 0);\n      }\n      mg_call(c, MG_EV_WRITE, &n);\n    }\n  }\n}\n\nlong mg_io_send(struct mg_connection *c, const void *buf, size_t len) {\n  long n;\n  if (c->is_udp) {\n    union usa usa;\n    socklen_t slen = tousa(&c->rem, &usa);\n    n = sendto(FD(c), (char *) buf, len, 0, &usa.sa, slen);\n    if (n > 0) setlocaddr(FD(c), &c->loc);\n  } else {\n    n = send(FD(c), (char *) buf, len, MSG_NONBLOCKING);\n  }\n  MG_VERBOSE((\"%lu %ld %d\", c->id, n, MG_SOCK_ERR(n)));\n  if (MG_SOCK_PENDING(n)) return MG_IO_WAIT;\n  if (MG_SOCK_RESET(n)) return MG_IO_RESET;  // MbedTLS, see #1507\n  if (n <= 0) return MG_IO_ERR;\n  return n;\n}\n\nbool mg_send(struct mg_connection *c, const void *buf, size_t len) {\n  if (c->is_udp) {\n    long n = mg_io_send(c, buf, len);\n    MG_DEBUG((\"%lu %ld %lu:%lu:%lu %ld err %d\", c->id, c->fd, c->send.len,\n              c->recv.len, c->rtls.len, n, MG_SOCK_ERR(n)));\n    iolog(c, (char *) buf, n, false);\n    return n > 0;\n  } else {\n    return len == 0 || mg_iobuf_add(&c->send, c->send.len, buf, len) > 0;\n    // returning 0 means an OOM condition (iobuf couldn't resize), yet this is\n    // so far recoverable, let the caller decide\n  }\n}\n\nstatic void mg_set_non_blocking_mode(MG_SOCKET_TYPE fd) {\n#if defined(MG_CUSTOM_NONBLOCK)\n  MG_CUSTOM_NONBLOCK(fd);\n#elif MG_ARCH == MG_ARCH_WIN32 && MG_ENABLE_WINSOCK\n  unsigned long on = 1;\n  ioctlsocket(fd, FIONBIO, &on);\n#elif MG_ENABLE_RL\n  unsigned long on = 1;\n  ioctlsocket(fd, FIONBIO, &on);\n#elif MG_ENABLE_FREERTOS_TCP\n  const BaseType_t off = 0;\n  if (setsockopt(fd, 0, FREERTOS_SO_RCVTIMEO, &off, sizeof(off)) != 0) (void) 0;\n  if (setsockopt(fd, 0, FREERTOS_SO_SNDTIMEO, &off, sizeof(off)) != 0) (void) 0;\n#elif MG_ENABLE_LWIP\n  lwip_fcntl(fd, F_SETFL, O_NONBLOCK);\n#elif MG_ARCH == MG_ARCH_THREADX\n  // NetxDuo fails to send large blocks of data to the non-blocking sockets\n  (void) fd;\n  // fcntl(fd, F_SETFL, O_NONBLOCK);\n#elif MG_ARCH == MG_ARCH_TIRTOS\n  int val = 0;\n  setsockopt(fd, SOL_SOCKET, SO_BLOCKING, &val, sizeof(val));\n  // SPRU524J section 3.3.3 page 63, SO_SNDLOWAT\n  int sz = sizeof(val);\n  getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &val, &sz);\n  val /= 2;  // set send low-water mark at half send buffer size\n  setsockopt(fd, SOL_SOCKET, SO_SNDLOWAT, &val, sizeof(val));\n#else\n  fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);  // Non-blocking mode\n  fcntl(fd, F_SETFD, FD_CLOEXEC);                          // Set close-on-exec\n#endif\n}\n\nvoid mg_multicast_add(struct mg_connection *c, char *ip);\nvoid mg_multicast_add(struct mg_connection *c, char *ip) {\n#if MG_ENABLE_RL\n  MG_ERROR((\"unsupported\"));\n#elif MG_ENABLE_FREERTOS_TCP\n  // TODO(): prvAllowIPPacketIPv4()\n#else\n  // lwIP, Unix, Windows, Zephyr 4+(, AzureRTOS ?)\n#if MG_ENABLE_LWIP && !LWIP_IGMP\n  MG_ERROR((\"LWIP_IGMP not defined, no multicast support\"));\n#else\n#if defined(__ZEPHYR__) && ZEPHYR_VERSION_CODE < 0x40000\n  MG_ERROR((\"struct ip_mreq not defined\"));\n#else\n  struct ip_mreq mreq;\n  mreq.imr_multiaddr.s_addr = inet_addr(ip);\n  mreq.imr_interface.s_addr = mg_htonl(INADDR_ANY);\n  setsockopt(FD(c), IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mreq,\n             sizeof(mreq));\n#endif  // !Zephyr\n#endif  // !lwIP\n#endif\n}\n\nbool mg_open_listener(struct mg_connection *c, const char *url) {\n  MG_SOCKET_TYPE fd = MG_INVALID_SOCKET;\n  bool success = false;\n  c->loc.port = mg_htons(mg_url_port(url));\n  if (!mg_aton(mg_url_host(url), &c->loc)) {\n    MG_ERROR((\"invalid listening URL: %s\", url));\n  } else {\n    union usa usa;\n    socklen_t slen = tousa(&c->loc, &usa);\n    int rc, on = 1, af = c->loc.is_ip6 ? AF_INET6 : AF_INET;\n    int type = strncmp(url, \"udp:\", 4) == 0 ? SOCK_DGRAM : SOCK_STREAM;\n    int proto = type == SOCK_DGRAM ? IPPROTO_UDP : IPPROTO_TCP;\n    (void) on;\n\n    if ((fd = socket(af, type, proto)) == MG_INVALID_SOCKET) {\n      MG_ERROR((\"socket: %d\", MG_SOCK_ERR(-1)));\n#if defined(SO_EXCLUSIVEADDRUSE)\n    } else if ((rc = setsockopt(fd, SOL_SOCKET, SO_EXCLUSIVEADDRUSE,\n                                (char *) &on, sizeof(on))) != 0) {\n      // \"Using SO_REUSEADDR and SO_EXCLUSIVEADDRUSE\"\n      MG_ERROR((\"setsockopt(SO_EXCLUSIVEADDRUSE): %d %d\", on, MG_SOCK_ERR(rc)));\n#elif defined(SO_REUSEADDR) && (!defined(LWIP_SOCKET) || SO_REUSE)\n    } else if ((rc = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &on,\n                                sizeof(on))) != 0) {\n      // 1. SO_REUSEADDR semantics on UNIX and Windows is different.  On\n      // Windows, SO_REUSEADDR allows to bind a socket to a port without error\n      // even if the port is already open by another program. This is not the\n      // behavior SO_REUSEADDR was designed for, and leads to hard-to-track\n      // failure scenarios.\n      //\n      // 2. For LWIP, SO_REUSEADDR should be explicitly enabled by defining\n      // SO_REUSE = 1 in lwipopts.h, otherwise the code below will compile but\n      // won't work! (setsockopt will return EINVAL)\n      MG_ERROR((\"setsockopt(SO_REUSEADDR): %d\", MG_SOCK_ERR(rc)));\n#endif\n#if MG_IPV6_V6ONLY\n      // Bind only to the V6 address, not V4 address on this port\n    } else if (c->loc.is_ip6 &&\n               (rc = setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char *) &on,\n                                sizeof(on))) != 0) {\n      // See #2089. Allow to bind v4 and v6 sockets on the same port\n      MG_ERROR((\"setsockopt(IPV6_V6ONLY): %d\", MG_SOCK_ERR(rc)));\n#endif\n    } else if ((rc = bind(fd, &usa.sa, slen)) != 0) {\n      MG_ERROR((\"bind: %d\", MG_SOCK_ERR(rc)));\n    } else if ((type == SOCK_STREAM &&\n                (rc = listen(fd, MG_SOCK_LISTEN_BACKLOG_SIZE)) != 0)) {\n      // NOTE(lsm): FreeRTOS uses backlog value as a connection limit\n      // In case port was set to 0, get the real port number\n      MG_ERROR((\"listen: %d\", MG_SOCK_ERR(rc)));\n    } else {\n      setlocaddr(fd, &c->loc);\n      mg_set_non_blocking_mode(fd);\n      c->fd = S2PTR(fd);\n      MG_EPOLL_ADD(c);\n      success = true;\n    }\n  }\n  if (success == false && fd != MG_INVALID_SOCKET) closesocket(fd);\n  return success;\n}\n\nstatic long recv_raw(struct mg_connection *c, void *buf, size_t len) {\n  long n = 0;\n  if (c->is_udp) {\n    union usa usa;\n    socklen_t slen = tousa(&c->rem, &usa);\n    n = recvfrom(FD(c), (char *) buf, len, 0, &usa.sa, &slen);\n    if (n > 0) tomgaddr(&usa, &c->rem, slen != sizeof(usa.sin));\n  } else {\n    n = recv(FD(c), (char *) buf, len, MSG_NONBLOCKING);\n  }\n  MG_VERBOSE((\"%lu %ld %d\", c->id, n, MG_SOCK_ERR(n)));\n  if (MG_SOCK_PENDING(n)) return MG_IO_WAIT;\n  if (MG_SOCK_RESET(n)) return MG_IO_RESET;  // MbedTLS, see #1507\n  if (n <= 0) return MG_IO_ERR;\n  return n;\n}\n\nstatic bool ioalloc(struct mg_connection *c, struct mg_iobuf *io) {\n  bool res = false;\n  if (io->len >= MG_MAX_RECV_SIZE) {\n    mg_error(c, \"MG_MAX_RECV_SIZE\");\n  } else if (io->size <= io->len &&\n             !mg_iobuf_resize(io, io->size + MG_IO_SIZE)) {\n    mg_error(c, \"OOM\");\n  } else {\n    res = true;\n  }\n  return res;\n}\n\n// NOTE(lsm): do only one iteration of reads, cause some systems\n// (e.g. FreeRTOS stack) return 0 instead of -1/EWOULDBLOCK when no data\nstatic void read_conn(struct mg_connection *c) {\n  if (ioalloc(c, &c->recv)) {\n    char *buf = (char *) &c->recv.buf[c->recv.len];\n    size_t len = c->recv.size - c->recv.len;\n    long n = -1;\n    if (c->is_tls) {\n      // Do not read to the raw TLS buffer if it already has enough.\n      // This is to prevent overflowing c->rtls if our reads are slow\n      long m;\n      if (c->rtls.len < 16 * 1024 + 40) {  // TLS record, header, MAC, padding\n        if (!ioalloc(c, &c->rtls)) return;\n        n = recv_raw(c, (char *) &c->rtls.buf[c->rtls.len],\n                     c->rtls.size - c->rtls.len);\n        if (n > 0) c->rtls.len += (size_t) n;\n      }\n      // there can still be > 16K from last iteration, always mg_tls_recv()\n      m = c->is_tls_hs ? (long) MG_IO_WAIT : mg_tls_recv(c, buf, len);\n      if (n == MG_IO_ERR || n == MG_IO_RESET) {  // Windows, see #3031\n        if (c->rtls.len == 0 || m < 0) {\n          // Close only when we have fully drained both rtls and TLS buffers\n          c->is_closing = 1;         // or there's nothing we can do about it.\n          if (m < 0) m = MG_IO_ERR;  // but return last record data, see #3104\n        } else {                     // see #2885\n          // TLS buffer is capped to max record size, even though, there can\n          // be more than one record, give TLS a chance to process them.\n        }\n      } else if (c->is_tls_hs) {\n        mg_tls_handshake(c);\n      }\n      n = m;\n    } else {\n      n = recv_raw(c, buf, len);\n    }\n    MG_DEBUG((\"%lu %ld %lu:%lu:%lu %ld err %d\", c->id, c->fd, c->send.len,\n              c->recv.len, c->rtls.len, n, MG_SOCK_ERR(n)));\n    iolog(c, buf, n, true);\n  }\n}\n\nstatic void write_conn(struct mg_connection *c) {\n  char *buf = (char *) c->send.buf;\n  size_t len = c->send.len;\n  long n = c->is_tls ? mg_tls_send(c, buf, len) : mg_io_send(c, buf, len);\n  // TODO(): mg_tls_send() may return 0 forever on steady OOM\n  MG_DEBUG((\"%lu %ld snd %ld/%ld rcv %ld/%ld n=%ld err=%d\", c->id, c->fd,\n            (long) c->send.len, (long) c->send.size, (long) c->recv.len,\n            (long) c->recv.size, n, MG_SOCK_ERR(n)));\n  iolog(c, buf, n, false);\n}\n\nstatic void close_conn(struct mg_connection *c) {\n  if (FD(c) != MG_INVALID_SOCKET) {\n#if MG_ENABLE_EPOLL\n    epoll_ctl(c->mgr->epoll_fd, EPOLL_CTL_DEL, FD(c), NULL);\n#endif\n    closesocket(FD(c));\n#if MG_ENABLE_FREERTOS_TCP\n    FreeRTOS_FD_CLR(c->fd, c->mgr->ss, eSELECT_ALL);\n#endif\n  }\n  mg_close_conn(c);\n}\n\nstatic void connect_conn(struct mg_connection *c) {\n  union usa usa;\n  socklen_t n = sizeof(usa);\n  // Use getpeername() to test whether we have connected\n  if (getpeername(FD(c), &usa.sa, &n) == 0) {\n    c->is_connecting = 0;\n    setlocaddr(FD(c), &c->loc);\n    mg_call(c, MG_EV_CONNECT, NULL);\n    MG_EPOLL_MOD(c, 0);\n    if (c->is_tls_hs) mg_tls_handshake(c);\n    if (!c->is_tls_hs) c->is_tls = 0;  // user did not call mg_tls_init()\n  } else {\n    mg_error(c, \"socket error\");\n  }\n}\n\nstatic void setsockopts(struct mg_connection *c) {\n#if MG_ENABLE_FREERTOS_TCP || MG_ARCH == MG_ARCH_THREADX || \\\n    MG_ARCH == MG_ARCH_TIRTOS\n  (void) c;\n#else\n  int on = 1;\n#if !defined(SOL_TCP)\n#define SOL_TCP IPPROTO_TCP\n#endif\n  if (setsockopt(FD(c), SOL_TCP, TCP_NODELAY, (char *) &on, sizeof(on)) != 0)\n    (void) 0;\n  if (setsockopt(FD(c), SOL_SOCKET, SO_KEEPALIVE, (char *) &on, sizeof(on)) !=\n      0)\n    (void) 0;\n#endif\n}\n\nvoid mg_connect_resolved(struct mg_connection *c) {\n  int type = c->is_udp ? SOCK_DGRAM : SOCK_STREAM;\n  int proto = type == SOCK_DGRAM ? IPPROTO_UDP : IPPROTO_TCP;\n  int rc, af = c->rem.is_ip6 ? AF_INET6 : AF_INET;  // c->rem has resolved IP\n  c->fd = S2PTR(socket(af, type, proto));           // Create outbound socket\n  c->is_resolving = 0;                              // Clear resolving flag\n  if (FD(c) == MG_INVALID_SOCKET) {\n    mg_error(c, \"socket(): %d\", MG_SOCK_ERR(-1));\n  } else if (c->is_udp) {\n    MG_EPOLL_ADD(c);\n#if MG_ARCH == MG_ARCH_TIRTOS\n    union usa usa;  // TI-RTOS NDK requires binding to receive on UDP sockets\n    socklen_t slen = tousa(&c->loc, &usa);\n    if ((rc = bind(c->fd, &usa.sa, slen)) != 0)\n      MG_ERROR((\"bind: %d\", MG_SOCK_ERR(rc)));\n#endif\n    setlocaddr(FD(c), &c->loc);\n    mg_call(c, MG_EV_RESOLVE, NULL);\n    mg_call(c, MG_EV_CONNECT, NULL);\n  } else {\n    union usa usa;\n    socklen_t slen = tousa(&c->rem, &usa);\n    mg_set_non_blocking_mode(FD(c));\n    setsockopts(c);\n    MG_EPOLL_ADD(c);\n    mg_call(c, MG_EV_RESOLVE, NULL);\n    rc = connect(FD(c), &usa.sa, slen);  // Attempt to connect\n    if (rc == 0) {                       // Success\n      setlocaddr(FD(c), &c->loc);\n      mg_call(c, MG_EV_CONNECT, NULL);   // Send MG_EV_CONNECT to the user\n      if (!c->is_tls_hs) c->is_tls = 0;  // user did not call mg_tls_init()\n    } else if (MG_SOCK_PENDING(rc)) {    // Need to wait for TCP handshake\n      MG_DEBUG((\"%lu %ld -> %M pend\", c->id, c->fd, mg_print_ip_port, &c->rem));\n      c->is_connecting = 1;\n    } else {\n      mg_error(c, \"connect: %d\", MG_SOCK_ERR(rc));\n    }\n  }\n}\n\nstatic MG_SOCKET_TYPE raccept(MG_SOCKET_TYPE sock, union usa *usa,\n                              socklen_t *len) {\n  MG_SOCKET_TYPE fd = MG_INVALID_SOCKET;\n  do {\n    memset(usa, 0, sizeof(*usa));\n    fd = accept(sock, &usa->sa, len);\n  } while (MG_SOCK_INTR(fd));\n  return fd;\n}\n\nstatic void accept_conn(struct mg_mgr *mgr, struct mg_connection *lsn) {\n  struct mg_connection *c = NULL;\n  union usa usa;\n  socklen_t sa_len = sizeof(usa);\n  MG_SOCKET_TYPE fd = raccept(FD(lsn), &usa, &sa_len);\n  if (fd == MG_INVALID_SOCKET) {\n#if MG_ARCH == MG_ARCH_THREADX || defined(__ECOS)\n    // NetxDuo, in non-block socket mode can mark listening socket readable\n    // even it is not. See comment for 'select' func implementation in\n    // nx_bsd.c That's not an error, just should try later\n    if (errno != EAGAIN)\n#endif\n      MG_ERROR((\"%lu accept failed, errno %d\", lsn->id, MG_SOCK_ERR(-1)));\n#if (MG_ARCH != MG_ARCH_WIN32) && !MG_ENABLE_FREERTOS_TCP && \\\n    (MG_ARCH != MG_ARCH_TIRTOS) && !MG_ENABLE_POLL && !MG_ENABLE_EPOLL\n  } else if ((long) fd >= FD_SETSIZE) {\n    MG_ERROR((\"%ld > %ld\", (long) fd, (long) FD_SETSIZE));\n    closesocket(fd);\n#endif\n  } else if ((c = mg_alloc_conn(mgr)) == NULL) {\n    MG_ERROR((\"%lu OOM\", lsn->id));\n    closesocket(fd);\n  } else {\n    tomgaddr(&usa, &c->rem, sa_len != sizeof(usa.sin));\n    LIST_ADD_HEAD(struct mg_connection, &mgr->conns, c);\n    c->fd = S2PTR(fd);\n    MG_EPOLL_ADD(c);\n    mg_set_non_blocking_mode(FD(c));\n    setsockopts(c);\n    c->is_accepted = 1;\n    c->is_hexdumping = lsn->is_hexdumping;\n    setlocaddr(fd, &c->loc); // set local addr to where the client connected to\n    c->pfn = lsn->pfn;\n    c->pfn_data = lsn->pfn_data;\n    c->fn = lsn->fn;\n    c->fn_data = lsn->fn_data;\n    c->is_tls = lsn->is_tls;\n    MG_DEBUG((\"%lu %ld accepted %M -> %M\", c->id, c->fd, mg_print_ip_port,\n              &c->rem, mg_print_ip_port, &c->loc));\n    mg_call(c, MG_EV_OPEN, NULL);\n    mg_call(c, MG_EV_ACCEPT, NULL);\n    if (!c->is_tls_hs) c->is_tls = 0;  // user did not call mg_tls_init()\n  }\n}\n\nstatic bool can_read(const struct mg_connection *c) {\n  return c->is_full == false;\n}\n\nstatic bool can_write(const struct mg_connection *c) {\n  return c->is_connecting || (c->send.len > 0 && c->is_tls_hs == 0);\n}\n\nstatic bool skip_iotest(const struct mg_connection *c) {\n  return (c->is_closing || c->is_resolving || FD(c) == MG_INVALID_SOCKET) ||\n         (can_read(c) == false && can_write(c) == false);\n}\n\nstatic void mg_iotest(struct mg_mgr *mgr, int ms) {\n#if MG_ENABLE_FREERTOS_TCP\n  struct mg_connection *c;\n  for (c = mgr->conns; c != NULL; c = c->next) {\n    c->is_readable = c->is_writable = 0;\n    if (skip_iotest(c)) continue;\n    if (can_read(c))\n      FreeRTOS_FD_SET(c->fd, mgr->ss, eSELECT_READ | eSELECT_EXCEPT);\n    if (can_write(c)) FreeRTOS_FD_SET(c->fd, mgr->ss, eSELECT_WRITE);\n    if (c->is_closing) ms = 1;\n  }\n  FreeRTOS_select(mgr->ss, pdMS_TO_TICKS(ms));\n  for (c = mgr->conns; c != NULL; c = c->next) {\n    EventBits_t bits = FreeRTOS_FD_ISSET(c->fd, mgr->ss);\n    c->is_readable = bits & (eSELECT_READ | eSELECT_EXCEPT) ? 1U : 0;\n    c->is_writable = bits & eSELECT_WRITE ? 1U : 0;\n    if (c->fd != MG_INVALID_SOCKET)\n      FreeRTOS_FD_CLR(c->fd, mgr->ss,\n                      eSELECT_READ | eSELECT_EXCEPT | eSELECT_WRITE);\n  }\n#elif MG_ENABLE_EPOLL\n  size_t max = 1;\n  for (struct mg_connection *c = mgr->conns; c != NULL; c = c->next) {\n    c->is_readable = c->is_writable = 0;\n    if (c->rtls.len > 0 || mg_tls_pending(c) > 0) ms = 1, c->is_readable = 1;\n    if (can_write(c)) MG_EPOLL_MOD(c, 1);\n    if (c->is_closing) ms = 1;\n    max++;\n  }\n  struct epoll_event *evs = (struct epoll_event *) alloca(max * sizeof(evs[0]));\n  int n = epoll_wait(mgr->epoll_fd, evs, (int) max, ms);\n  for (int i = 0; i < n; i++) {\n    struct mg_connection *c = (struct mg_connection *) evs[i].data.ptr;\n    if (evs[i].events & EPOLLERR) {\n      mg_error(c, \"socket error\");\n    } else if (c->is_readable == 0) {\n      bool rd = evs[i].events & (EPOLLIN | EPOLLHUP);\n      bool wr = evs[i].events & EPOLLOUT;\n      c->is_readable = can_read(c) && rd ? 1U : 0;\n      c->is_writable = can_write(c) && wr ? 1U : 0;\n      if (c->rtls.len > 0 || mg_tls_pending(c) > 0) c->is_readable = 1;\n    }\n  }\n  (void) skip_iotest;\n#elif MG_ENABLE_POLL\n  nfds_t n = 0;\n  for (struct mg_connection *c = mgr->conns; c != NULL; c = c->next) n++;\n  struct pollfd *fds = (struct pollfd *) alloca(n * sizeof(fds[0]));\n  memset(fds, 0, n * sizeof(fds[0]));\n  n = 0;\n  for (struct mg_connection *c = mgr->conns; c != NULL; c = c->next) {\n    c->is_readable = c->is_writable = 0;\n    if (c->is_closing) ms = 1;\n    if (skip_iotest(c)) {\n      // Socket not valid, ignore\n    } else {\n      // Don't wait if TLS is ready\n      if (c->rtls.len > 0 || mg_tls_pending(c) > 0) ms = 1;\n      fds[n].fd = FD(c);\n      if (can_read(c)) fds[n].events |= POLLIN;\n      if (can_write(c)) fds[n].events |= POLLOUT;\n      n++;\n    }\n  }\n\n  // MG_INFO((\"poll n=%d ms=%d\", (int) n, ms));\n  if (poll(fds, n, ms) < 0) {\n#if MG_ARCH == MG_ARCH_WIN32\n    if (n == 0) Sleep(ms);  // On Windows, poll fails if no sockets\n#endif\n    memset(fds, 0, n * sizeof(fds[0]));\n  }\n  n = 0;\n  for (struct mg_connection *c = mgr->conns; c != NULL; c = c->next) {\n    if (skip_iotest(c)) {\n      // Socket not valid, ignore\n    } else {\n      if (fds[n].revents & POLLERR) {\n        mg_error(c, \"socket error\");\n      } else {\n        c->is_readable =\n            (unsigned) (fds[n].revents & (POLLIN | POLLHUP) ? 1 : 0);\n        c->is_writable = (unsigned) (fds[n].revents & POLLOUT ? 1 : 0);\n        if (c->rtls.len > 0 || mg_tls_pending(c) > 0) c->is_readable = 1;\n      }\n      n++;\n    }\n  }\n#else\n  struct timeval tv = {ms / 1000, (ms % 1000) * 1000}, tv_1ms = {0, 1000}, *tvp;\n  struct mg_connection *c;\n  fd_set rset, wset, eset;\n  MG_SOCKET_TYPE maxfd = 0;\n  int rc;\n\n  FD_ZERO(&rset);\n  FD_ZERO(&wset);\n  FD_ZERO(&eset);\n  tvp = ms < 0 ? NULL : &tv;\n  for (c = mgr->conns; c != NULL; c = c->next) {\n    c->is_readable = c->is_writable = 0;\n    if (skip_iotest(c)) continue;\n    FD_SET(FD(c), &eset);\n    if (can_read(c)) FD_SET(FD(c), &rset);\n    if (can_write(c)) FD_SET(FD(c), &wset);\n    if (c->rtls.len > 0 || mg_tls_pending(c) > 0) tvp = &tv_1ms;\n    if (FD(c) > maxfd) maxfd = FD(c);\n    if (c->is_closing) tvp = &tv_1ms;\n  }\n\n  if ((rc = select((int) maxfd + 1, &rset, &wset, &eset, tvp)) <= 0) {\n#if MG_ARCH == MG_ARCH_WIN32\n    if (maxfd == 0) Sleep(ms);  // On Windows, select fails if no sockets\n#else\n    if (rc < 0) MG_ERROR((\"select: %d %d\", rc, MG_SOCK_ERR(rc)));\n#endif\n    FD_ZERO(&rset);\n    FD_ZERO(&wset);\n    FD_ZERO(&eset);\n  }\n\n  for (c = mgr->conns; c != NULL; c = c->next) {\n    if (FD(c) != MG_INVALID_SOCKET && FD_ISSET(FD(c), &eset)) {\n#if MG_ARCH == MG_ARCH_THREADX\n      // NetxDuo stack returns exceptions for listening connection after accept\n      if (c->is_listening == 0) mg_error(c, \"socket error\");\n#else\n      mg_error(c, \"socket error\");\n#endif\n    } else {\n      c->is_readable = FD(c) != MG_INVALID_SOCKET && FD_ISSET(FD(c), &rset);\n      c->is_writable = FD(c) != MG_INVALID_SOCKET && FD_ISSET(FD(c), &wset);\n      if (c->rtls.len > 0 || mg_tls_pending(c) > 0) c->is_readable = 1;\n    }\n  }\n#endif\n}\n\nstatic bool mg_socketpair(MG_SOCKET_TYPE sp[2], union usa usa[2]) {\n  socklen_t n = sizeof(usa[0].sin);\n  bool success = false;\n\n  sp[0] = sp[1] = MG_INVALID_SOCKET;\n  (void) memset(&usa[0], 0, sizeof(usa[0]));\n  usa[0].sin.sin_family = AF_INET;\n  *(uint32_t *) &usa->sin.sin_addr = mg_htonl(0x7f000001U);  // 127.0.0.1\n  usa[1] = usa[0];\n\n  if ((sp[0] = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) != MG_INVALID_SOCKET &&\n      (sp[1] = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) != MG_INVALID_SOCKET &&\n      bind(sp[0], &usa[0].sa, n) == 0 &&          //\n      bind(sp[1], &usa[1].sa, n) == 0 &&          //\n      getsockname(sp[0], &usa[0].sa, &n) == 0 &&  //\n      getsockname(sp[1], &usa[1].sa, &n) == 0 &&  //\n      connect(sp[0], &usa[1].sa, n) == 0 &&       //\n      connect(sp[1], &usa[0].sa, n) == 0) {       //\n    success = true;\n  }\n  if (!success) {\n    if (sp[0] != MG_INVALID_SOCKET) closesocket(sp[0]);\n    if (sp[1] != MG_INVALID_SOCKET) closesocket(sp[1]);\n    sp[0] = sp[1] = MG_INVALID_SOCKET;\n  }\n  return success;\n}\n\n// mg_wakeup() event handler\nstatic void wufn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_READ) {\n    unsigned long *id = (unsigned long *) c->recv.buf;\n    // MG_INFO((\"Got data\"));\n    // mg_hexdump(c->recv.buf, c->recv.len);\n    if (c->recv.len >= sizeof(*id)) {\n      struct mg_connection *t;\n      for (t = c->mgr->conns; t != NULL; t = t->next) {\n        if (t->id == *id) {\n          struct mg_str data = mg_str_n((char *) c->recv.buf + sizeof(*id),\n                                        c->recv.len - sizeof(*id));\n          mg_call(t, MG_EV_WAKEUP, &data);\n        }\n      }\n    }\n    c->recv.len = 0;  // Consume received data\n  } else if (ev == MG_EV_CLOSE) {\n    closesocket(c->mgr->pipe);         // When we're closing, close the other\n    c->mgr->pipe = MG_INVALID_SOCKET;  // side of the socketpair, too\n  }\n  (void) ev_data;\n}\n\nbool mg_wakeup_init(struct mg_mgr *mgr) {\n  bool ok = false;\n  if (mgr->pipe == MG_INVALID_SOCKET) {\n    union usa usa[2];\n    MG_SOCKET_TYPE sp[2] = {MG_INVALID_SOCKET, MG_INVALID_SOCKET};\n    struct mg_connection *c = NULL;\n    if (!mg_socketpair(sp, usa)) {\n      MG_ERROR((\"Cannot create socket pair\"));\n    } else if ((c = mg_wrapfd(mgr, (int) sp[1], wufn, NULL)) == NULL) {\n      closesocket(sp[0]);\n      closesocket(sp[1]);\n      sp[0] = sp[1] = MG_INVALID_SOCKET;\n    } else {\n      tomgaddr(&usa[0], &c->rem, false);\n      MG_DEBUG((\"%lu %p pipe %lu\", c->id, c->fd, (unsigned long) sp[0]));\n      mgr->pipe = sp[0];\n      ok = true;\n    }\n  }\n  return ok;\n}\n\nbool mg_wakeup(struct mg_mgr *mgr, unsigned long conn_id, const void *buf,\n               size_t len) {\n  if (mgr->pipe != MG_INVALID_SOCKET && conn_id > 0) {\n    char *extended_buf = (char *) alloca(len + sizeof(conn_id));\n    memcpy(extended_buf, &conn_id, sizeof(conn_id));\n    memcpy(extended_buf + sizeof(conn_id), buf, len);\n    send(mgr->pipe, extended_buf, len + sizeof(conn_id), MSG_NONBLOCKING);\n    return true;\n  }\n  return false;\n}\n\nvoid mg_mgr_poll(struct mg_mgr *mgr, int ms) {\n  struct mg_connection *c, *tmp;\n  uint64_t now;\n\n  mg_iotest(mgr, ms);\n  now = mg_millis();\n  mg_timer_poll(&mgr->timers, now);\n\n  for (c = mgr->conns; c != NULL; c = tmp) {\n    bool is_resp = c->is_resp;\n    tmp = c->next;\n    mg_call(c, MG_EV_POLL, &now);\n    if (is_resp && !c->is_resp) {\n      long n = 0;\n      mg_call(c, MG_EV_READ, &n);\n    }\n    MG_VERBOSE((\"%lu %c%c %c%c%c%c%c %lu %lu\", c->id,\n                c->is_readable ? 'r' : '-', c->is_writable ? 'w' : '-',\n                c->is_tls ? 'T' : 't', c->is_connecting ? 'C' : 'c',\n                c->is_tls_hs ? 'H' : 'h', c->is_resolving ? 'R' : 'r',\n                c->is_closing ? 'C' : 'c', mg_tls_pending(c), c->rtls.len));\n    if (c->is_resolving || c->is_closing) {\n      // Do nothing\n    } else if (c->is_listening && c->is_udp == 0) {\n      if (c->is_readable) accept_conn(mgr, c);\n    } else if (c->is_connecting) {\n      if (c->is_readable || c->is_writable) connect_conn(c);\n    } else {\n      if (c->is_readable) read_conn(c);\n      if (c->is_writable) write_conn(c);\n      if (c->is_tls && !c->is_tls_hs && c->send.len == 0) mg_tls_flush(c);\n    }\n\n    if (c->is_draining && c->send.len == 0) c->is_closing = 1;\n    if (c->is_closing) close_conn(c);\n  }\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ssi.c\"\n#endif\n\n\n\n\n\n#ifndef MG_MAX_SSI_DEPTH\n#define MG_MAX_SSI_DEPTH 5\n#endif\n\n#ifndef MG_SSI_BUFSIZ\n#define MG_SSI_BUFSIZ 1024\n#endif\n\n#if MG_ENABLE_SSI\nstatic char *mg_ssi(const char *path, const char *root, int depth) {\n  struct mg_iobuf b = {NULL, 0, 0, MG_IO_SIZE};\n  FILE *fp = fopen(path, \"rb\");\n  if (fp != NULL) {\n    char buf[MG_SSI_BUFSIZ], arg[sizeof(buf)];\n    int ch, intag = 0;\n    size_t len = 0;\n    buf[0] = arg[0] = '\\0';\n    while ((ch = fgetc(fp)) != EOF) {\n      if (intag && ch == '>' && buf[len - 1] == '-' && buf[len - 2] == '-') {\n        buf[len++] = (char) (ch & 0xff);\n        buf[len] = '\\0';\n        if (sscanf(buf, \"<!--#include file=\\\"%[^\\\"]\", arg) > 0) {\n          char tmp[MG_PATH_MAX + MG_SSI_BUFSIZ + 10],\n              *p = (char *) path + strlen(path), *data;\n          while (p > path && p[-1] != MG_DIRSEP && p[-1] != '/') p--;\n          mg_snprintf(tmp, sizeof(tmp), \"%.*s%s\", (int) (p - path), path, arg);\n          if (depth < MG_MAX_SSI_DEPTH &&\n              (data = mg_ssi(tmp, root, depth + 1)) != NULL) {\n            size_t datalen = strlen(data);\n            size_t ret = mg_iobuf_add(&b, b.len, data, datalen);\n            mg_free(data);\n            if (datalen > 0 && ret == 0) goto fail;\n          } else {\n            MG_ERROR((\"%s: file=%s error or too deep\", path, arg));\n          } // TODO(): or OOM at recursive call\n        } else if (sscanf(buf, \"<!--#include virtual=\\\"%[^\\\"]\", arg) > 0) {\n          char tmp[MG_PATH_MAX + MG_SSI_BUFSIZ + 10], *data;\n          mg_snprintf(tmp, sizeof(tmp), \"%s%s\", root, arg);\n          if (depth < MG_MAX_SSI_DEPTH &&\n              (data = mg_ssi(tmp, root, depth + 1)) != NULL) {\n            size_t datalen = strlen(data);\n            size_t ret = mg_iobuf_add(&b, b.len, data, datalen);\n            mg_free(data);\n            if (datalen > 0 && ret == 0) goto fail;\n          } else {\n            MG_ERROR((\"%s: virtual=%s error or too deep\", path, arg));\n          } // TODO(): or OOM at recursive call\n        } else {\n          // Unknown SSI tag\n          MG_ERROR((\"Unknown SSI tag: %.*s\", (int) len, buf));\n          if (len > 0 && mg_iobuf_add(&b, b.len, buf, len) == 0) goto fail;\n        }\n        intag = 0;\n        len = 0;\n      } else if (ch == '<') {\n        intag = 1;\n        if (len > 0 && mg_iobuf_add(&b, b.len, buf, len) == 0) goto fail;\n        len = 0;\n        buf[len++] = (char) (ch & 0xff);\n      } else if (intag) {\n        if (len == 5 && strncmp(buf, \"<!--#\", 5) != 0) {\n          intag = 0;\n        } else if (len >= sizeof(buf) - 2) {\n          MG_ERROR((\"%s: SSI tag is too large\", path));\n          len = 0;\n        }\n        buf[len++] = (char) (ch & 0xff);\n      } else {\n        buf[len++] = (char) (ch & 0xff);\n        if (len >= sizeof(buf)) {\n          if (mg_iobuf_add(&b, b.len, buf, len) == 0) goto fail;\n          len = 0;\n        }\n      }\n    }\n    if (len > 0 && mg_iobuf_add(&b, b.len, buf, len) == 0) goto fail;\n    if (b.len > 0 && mg_iobuf_add(&b, b.len, \"\", 1) == 0)  // nul-terminate\n      goto fail;\n    fclose(fp);\n  }\n  (void) depth;\n  (void) root;\n  return (char *) b.buf;\n\nfail:\n  fclose(fp);\n  return NULL;\n}\n\nvoid mg_http_serve_ssi(struct mg_connection *c, const char *root,\n                       const char *fullpath) {\n  const char *headers = \"Content-Type: text/html; charset=utf-8\\r\\n\";\n  char *data = mg_ssi(fullpath, root, 0);\n  if (data == NULL) {\n    mg_error(c, \"OOM\");\n    return;\n  }\n  mg_http_reply(c, 200, headers, \"%s\", data == NULL ? \"\" : data);\n  mg_free(data);\n}\n#else\nvoid mg_http_serve_ssi(struct mg_connection *c, const char *root,\n                       const char *fullpath) {\n  mg_http_reply(c, 501, NULL, \"SSI not enabled\");\n  (void) root, (void) fullpath;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/str.c\"\n#endif\n\n\n\nstruct mg_str mg_str_s(const char *s) {\n  struct mg_str str;\n  str.buf = (char *) s, str.len = (s == NULL) ? 0 : strlen(s);\n  return str;\n}\n\nstruct mg_str mg_str_n(const char *s, size_t n) {\n  struct mg_str str;\n  str.buf = (char *) s, str.len = n;\n  return str;\n}\n\nstatic int mg_tolc(char c) {\n  return (c >= 'A' && c <= 'Z') ? c + 'a' - 'A' : c;\n}\n\nint mg_casecmp(const char *s1, const char *s2) {\n  int diff = 0;\n  do {\n    int c = mg_tolc(*s1++), d = mg_tolc(*s2++);\n    diff = c - d;\n  } while (diff == 0 && s1[-1] != '\\0');\n  return diff;\n}\n\nstruct mg_str mg_strdup(const struct mg_str s) {\n  struct mg_str r = {NULL, 0};\n  if (s.len > 0 && s.buf != NULL) {\n    char *sc = (char *) mg_calloc(1, s.len + 1);\n    if (sc != NULL) {\n      memcpy(sc, s.buf, s.len);\n      sc[s.len] = '\\0';\n      r.buf = sc;\n      r.len = s.len;\n    }\n  }\n  return r;\n}\n\nint mg_strcmp(const struct mg_str str1, const struct mg_str str2) {\n  size_t i = 0;\n  while (i < str1.len && i < str2.len) {\n    int c1 = str1.buf[i];\n    int c2 = str2.buf[i];\n    if (c1 < c2) return -1;\n    if (c1 > c2) return 1;\n    i++;\n  }\n  if (i < str1.len) return 1;\n  if (i < str2.len) return -1;\n  return 0;\n}\n\nint mg_strcasecmp(const struct mg_str str1, const struct mg_str str2) {\n  size_t i = 0;\n  while (i < str1.len && i < str2.len) {\n    int c1 = mg_tolc(str1.buf[i]);\n    int c2 = mg_tolc(str2.buf[i]);\n    if (c1 < c2) return -1;\n    if (c1 > c2) return 1;\n    i++;\n  }\n  if (i < str1.len) return 1;\n  if (i < str2.len) return -1;\n  return 0;\n}\n\nbool mg_match(struct mg_str s, struct mg_str p, struct mg_str *caps) {\n  size_t i = 0, j = 0, ni = 0, nj = 0;\n  if (caps) caps->buf = NULL, caps->len = 0;\n  while (i < p.len || j < s.len) {\n    if (i < p.len && j < s.len &&\n        (p.buf[i] == '?' ||\n         (p.buf[i] != '*' && p.buf[i] != '#' && s.buf[j] == p.buf[i]))) {\n      if (caps == NULL) {\n      } else if (p.buf[i] == '?') {\n        caps->buf = &s.buf[j], caps->len = 1;     // Finalize `?` cap\n        caps++, caps->buf = NULL, caps->len = 0;  // Init next cap\n      } else if (caps->buf != NULL && caps->len == 0) {\n        caps->len = (size_t) (&s.buf[j] - caps->buf);  // Finalize current cap\n        caps++, caps->len = 0, caps->buf = NULL;       // Init next cap\n      }\n      i++, j++;\n    } else if (i < p.len && (p.buf[i] == '*' || p.buf[i] == '#')) {\n      if (caps && !caps->buf) caps->len = 0, caps->buf = &s.buf[j];  // Init cap\n      ni = i++, nj = j + 1;\n    } else if (nj > 0 && nj <= s.len && ((ni < p.len && p.buf[ni] == '#') || s.buf[j] != '/')) {\n      i = ni, j = nj;\n      if (caps && caps->buf == NULL && caps->len == 0) {\n        caps--, caps->len = 0;  // Restart previous cap\n      }\n    } else {\n      return false;\n    }\n  }\n  if (caps && caps->buf && caps->len == 0) {\n    caps->len = (size_t) (&s.buf[j] - caps->buf);\n  }\n  return true;\n}\n\nbool mg_span(struct mg_str s, struct mg_str *a, struct mg_str *b, char sep) {\n  if (s.len == 0 || s.buf == NULL) {\n    return false;  // Empty string, nothing to span - fail\n  } else {\n    size_t len = 0;\n    while (len < s.len && s.buf[len] != sep) len++;  // Find separator\n    if (a) *a = mg_str_n(s.buf, len);                // Init a\n    if (b) *b = mg_str_n(s.buf + len, s.len - len);  // Init b\n    if (b && len < s.len) b->buf++, b->len--;        // Skip separator\n    return true;\n  }\n}\n\nbool mg_str_to_num(struct mg_str str, int base, void *val, size_t val_len) {\n  size_t i = 0, ndigits = 0;\n  uint64_t max = val_len == sizeof(uint8_t)    ? 0xFF\n                 : val_len == sizeof(uint16_t) ? 0xFFFF\n                 : val_len == sizeof(uint32_t) ? 0xFFFFFFFF\n                                               : (uint64_t) ~0;\n  uint64_t result = 0;\n  if (max == (uint64_t) ~0 && val_len != sizeof(uint64_t)) return false;\n  if (base == 0 && str.len >= 2) {\n    if (str.buf[i] == '0') {\n      i++;\n      base = str.buf[i] == 'b' ? 2 : str.buf[i] == 'x' ? 16 : 10;\n      if (base != 10) ++i;\n    } else {\n      base = 10;\n    }\n  }\n  switch (base) {\n    case 2:\n      while (i < str.len && (str.buf[i] == '0' || str.buf[i] == '1')) {\n        uint64_t digit = (uint64_t) (str.buf[i] - '0');\n        if (result > max / 2) return false;  // Overflow\n        result *= 2;\n        if (result > max - digit) return false;  // Overflow\n        result += digit;\n        i++, ndigits++;\n      }\n      break;\n    case 10:\n      while (i < str.len && str.buf[i] >= '0' && str.buf[i] <= '9') {\n        uint64_t digit = (uint64_t) (str.buf[i] - '0');\n        if (result > max / 10) return false;  // Overflow\n        result *= 10;\n        if (result > max - digit) return false;  // Overflow\n        result += digit;\n        i++, ndigits++;\n      }\n      break;\n    case 16:\n      while (i < str.len) {\n        char c = str.buf[i];\n        uint64_t digit = (c >= '0' && c <= '9')   ? (uint64_t) (c - '0')\n                         : (c >= 'A' && c <= 'F') ? (uint64_t) (c - '7')\n                         : (c >= 'a' && c <= 'f') ? (uint64_t) (c - 'W')\n                                                  : (uint64_t) ~0;\n        if (digit == (uint64_t) ~0) break;\n        if (result > max / 16) return false;  // Overflow\n        result *= 16;\n        if (result > max - digit) return false;  // Overflow\n        result += digit;\n        i++, ndigits++;\n      }\n      break;\n    default:\n      return false;\n  }\n  if (ndigits == 0) return false;\n  if (i != str.len) return false;\n  if (val_len == 1) {\n    *((uint8_t *) val) = (uint8_t) result;\n  } else if (val_len == 2) {\n    *((uint16_t *) val) = (uint16_t) result;\n  } else if (val_len == 4) {\n    *((uint32_t *) val) = (uint32_t) result;\n  } else {\n    *((uint64_t *) val) = (uint64_t) result;\n  }\n  return true;\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/timer.c\"\n#endif\n\n\n\n\nvoid mg_timer_init(struct mg_timer **head, struct mg_timer *t, uint64_t ms,\n                   unsigned flags, void (*fn)(void *), void *arg) {\n  t->period_ms = ms, t->expire = 0;\n  t->flags = flags, t->fn = fn, t->arg = arg, t->next = *head;\n  *head = t;\n}\n\nvoid mg_timer_free(struct mg_timer **head, struct mg_timer *t) {\n  while (*head && *head != t) head = &(*head)->next;\n  if (*head) *head = t->next;\n}\n\n// t: expiration time, prd: period, now: current time. Return true if expired\nbool mg_timer_expired(uint64_t *t, uint64_t prd, uint64_t now) {\n  if (now + prd < *t) *t = 0;                    // Time wrapped? Reset timer\n  if (*t == 0) *t = now + prd;                   // Firt poll? Set expiration\n  if (*t > now) return false;                    // Not expired yet, return\n  *t = (now - *t) > prd ? now + prd : *t + prd;  // Next expiration time\n  return true;                                   // Expired, return true\n}\n\nvoid mg_timer_poll(struct mg_timer **head, uint64_t now_ms) {\n  struct mg_timer *t, *tmp;\n  for (t = *head; t != NULL; t = tmp) {\n    bool once = t->expire == 0 && (t->flags & MG_TIMER_RUN_NOW) &&\n                !(t->flags & MG_TIMER_CALLED);  // Handle MG_TIMER_NOW only once\n    bool expired = mg_timer_expired(&t->expire, t->period_ms, now_ms);\n    tmp = t->next;\n    if (!once && !expired) continue;\n    if ((t->flags & MG_TIMER_REPEAT) || !(t->flags & MG_TIMER_CALLED)) {\n      t->fn(t->arg);\n    }\n    t->flags |= MG_TIMER_CALLED;\n\n    // If this timer is not repeating and marked AUTODELETE, remove it\n    if (!(t->flags & MG_TIMER_REPEAT) && (t->flags & MG_TIMER_AUTODELETE)) {\n      mg_timer_free(head, t);\n      mg_free(t);\n    }\n  }\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/tls_aes128.c\"\n#endif\n/******************************************************************************\n *\n * THIS SOURCE CODE IS HEREBY PLACED INTO THE PUBLIC DOMAIN FOR THE GOOD OF ALL\n *\n * This is a simple and straightforward implementation of the AES Rijndael\n * 128-bit block cipher designed by Vincent Rijmen and Joan Daemen. The focus\n * of this work was correctness & accuracy.  It is written in 'C' without any\n * particular focus upon optimization or speed. It should be endian (memory\n * byte order) neutral since the few places that care are handled explicitly.\n *\n * This implementation of Rijndael was created by Steven M. Gibson of GRC.com.\n *\n * It is intended for general purpose use, but was written in support of GRC's\n * reference implementation of the SQRL (Secure Quick Reliable Login) client.\n *\n * See:    http://csrc.nist.gov/archive/aes/rijndael/wsdindex.html\n *\n * NO COPYRIGHT IS CLAIMED IN THIS WORK, HOWEVER, NEITHER IS ANY WARRANTY MADE\n * REGARDING ITS FITNESS FOR ANY PARTICULAR PURPOSE. USE IT AT YOUR OWN RISK.\n *\n *******************************************************************************/\n\n\n\n#if MG_TLS == MG_TLS_BUILTIN\n/******************************************************************************/\n#define AES_DECRYPTION 1  // whether AES decryption is supported\n/******************************************************************************/\n\n#define MG_ENCRYPT 1  // specify whether we're encrypting\n#define MG_DECRYPT 0  // or decrypting\n\n\n\n/******************************************************************************\n *  AES_INIT_KEYGEN_TABLES : MUST be called once before any AES use\n ******************************************************************************/\nstatic void aes_init_keygen_tables(void);\n\n/******************************************************************************\n *  AES_SETKEY : called to expand the key for encryption or decryption\n ******************************************************************************/\nstatic int aes_setkey(aes_context *ctx,  // pointer to context\n                      int mode,          // 1 or 0 for Encrypt/Decrypt\n                      const unsigned char *key,  // AES input key\n                      unsigned int keysize);  // size in bytes (must be 16, 24, 32 for\n                                      // 128, 192 or 256-bit keys respectively)\n                                      // returns 0 for success\n\n/******************************************************************************\n *  AES_CIPHER : called to encrypt or decrypt ONE 128-bit block of data\n ******************************************************************************/\nstatic int aes_cipher(aes_context *ctx,       // pointer to context\n                      const unsigned char input[16],  // 128-bit block to en/decipher\n                      unsigned char output[16]);      // 128-bit output result block\n                                              // returns 0 for success\n\n/******************************************************************************\n *  GCM_CONTEXT : GCM context / holds keytables, instance data, and AES ctx\n ******************************************************************************/\ntypedef struct {\n  int mode;             // cipher direction: encrypt/decrypt\n  uint64_t len;         // cipher data length processed so far\n  uint64_t add_len;     // total add data length\n  uint64_t HL[16];      // precalculated lo-half HTable\n  uint64_t HH[16];      // precalculated hi-half HTable\n  unsigned char base_ectr[16];  // first counter-mode cipher output for tag\n  unsigned char y[16];          // the current cipher-input IV|Counter value\n  unsigned char buf[16];        // buf working value\n  aes_context aes_ctx;  // cipher context used\n} gcm_context;\n\n/******************************************************************************\n *  GCM_SETKEY : sets the GCM (and AES) keying material for use\n ******************************************************************************/\nstatic int gcm_setkey(\n    gcm_context *ctx,   // caller-provided context ptr\n    const unsigned char *key,   // pointer to cipher key\n    const unsigned int keysize  // size in bytes (must be 16, 24, 32 for\n                        // 128, 192 or 256-bit keys respectively)\n);                      // returns 0 for success\n\n/******************************************************************************\n *\n *  GCM_CRYPT_AND_TAG\n *\n *  This either encrypts or decrypts the user-provided data and, either\n *  way, generates an authentication tag of the requested length. It must be\n *  called with a GCM context whose key has already been set with GCM_SETKEY.\n *\n *  The user would typically call this explicitly to ENCRYPT a buffer of data\n *  and optional associated data, and produce its an authentication tag.\n *\n *  To reverse the process the user would typically call the companion\n *  GCM_AUTH_DECRYPT function to decrypt data and verify a user-provided\n *  authentication tag.  The GCM_AUTH_DECRYPT function calls this function\n *  to perform its decryption and tag generation, which it then compares.\n *\n ******************************************************************************/\nstatic int gcm_crypt_and_tag(\n    gcm_context *ctx,    // gcm context with key already setup\n    int mode,            // cipher direction: MG_ENCRYPT (1) or MG_DECRYPT (0)\n    const unsigned char *iv,     // pointer to the 12-byte initialization vector\n    size_t iv_len,       // byte length if the IV. should always be 12\n    const unsigned char *add,    // pointer to the non-ciphered additional data\n    size_t add_len,      // byte length of the additional AEAD data\n    const unsigned char *input,  // pointer to the cipher data source\n    unsigned char *output,       // pointer to the cipher data destination\n    size_t length,       // byte length of the cipher data\n    unsigned char *tag,          // pointer to the tag to be generated\n    size_t tag_len);     // byte length of the tag to be generated\n\n/******************************************************************************\n *\n *  GCM_START\n *\n *  Given a user-provided GCM context, this initializes it, sets the encryption\n *  mode, and preprocesses the initialization vector and additional AEAD data.\n *\n ******************************************************************************/\nstatic int gcm_start(\n    gcm_context *ctx,  // pointer to user-provided GCM context\n    int mode,          // MG_ENCRYPT (1) or MG_DECRYPT (0)\n    const unsigned char *iv,   // pointer to initialization vector\n    size_t iv_len,     // IV length in bytes (should == 12)\n    const unsigned char *add,  // pointer to additional AEAD data (NULL if none)\n    size_t add_len);   // length of additional AEAD data (bytes)\n\n/******************************************************************************\n *\n *  GCM_UPDATE\n *\n *  This is called once or more to process bulk plaintext or ciphertext data.\n *  We give this some number of bytes of input and it returns the same number\n *  of output bytes. If called multiple times (which is fine) all but the final\n *  invocation MUST be called with length mod 16 == 0. (Only the final call can\n *  have a partial block length of < 128 bits.)\n *\n ******************************************************************************/\nstatic int gcm_update(gcm_context *ctx,  // pointer to user-provided GCM context\n                      size_t length,     // length, in bytes, of data to process\n                      const unsigned char *input,  // pointer to source data\n                      unsigned char *output);      // pointer to destination data\n\n/******************************************************************************\n *\n *  GCM_FINISH\n *\n *  This is called once after all calls to GCM_UPDATE to finalize the GCM.\n *  It performs the final GHASH to produce the resulting authentication TAG.\n *\n ******************************************************************************/\nstatic int gcm_finish(\n    gcm_context *ctx,  // pointer to user-provided GCM context\n    unsigned char *tag,        // ptr to tag buffer - NULL if tag_len = 0\n    size_t tag_len);   // length, in bytes, of the tag-receiving buf\n\n/******************************************************************************\n *\n *  GCM_ZERO_CTX\n *\n *  The GCM context contains both the GCM context and the AES context.\n *  This includes keying and key-related material which is security-\n *  sensitive, so it MUST be zeroed after use. This function does that.\n *\n ******************************************************************************/\nstatic void gcm_zero_ctx(gcm_context *ctx);\n\n/******************************************************************************\n *\n * THIS SOURCE CODE IS HEREBY PLACED INTO THE PUBLIC DOMAIN FOR THE GOOD OF ALL\n *\n * This is a simple and straightforward implementation of the AES Rijndael\n * 128-bit block cipher designed by Vincent Rijmen and Joan Daemen. The focus\n * of this work was correctness & accuracy.  It is written in 'C' without any\n * particular focus upon optimization or speed. It should be endian (memory\n * byte order) neutral since the few places that care are handled explicitly.\n *\n * This implementation of Rijndael was created by Steven M. Gibson of GRC.com.\n *\n * It is intended for general purpose use, but was written in support of GRC's\n * reference implementation of the SQRL (Secure Quick Reliable Login) client.\n *\n * See:    http://csrc.nist.gov/archive/aes/rijndael/wsdindex.html\n *\n * NO COPYRIGHT IS CLAIMED IN THIS WORK, HOWEVER, NEITHER IS ANY WARRANTY MADE\n * REGARDING ITS FITNESS FOR ANY PARTICULAR PURPOSE. USE IT AT YOUR OWN RISK.\n *\n *******************************************************************************/\n\nstatic int aes_tables_inited = 0;  // run-once flag for performing key\n                                   // expasion table generation (see below)\n/*\n *  The following static local tables must be filled-in before the first use of\n *  the GCM or AES ciphers. They are used for the AES key expansion/scheduling\n *  and once built are read-only and thread safe. The \"gcm_initialize\" function\n *  must be called once during system initialization to populate these arrays\n *  for subsequent use by the AES key scheduler. If they have not been built\n *  before attempted use, an error will be returned to the caller.\n *\n *  NOTE: GCM Encryption/Decryption does NOT REQUIRE AES decryption. Since\n *  GCM uses AES in counter-mode, where the AES cipher output is XORed with\n *  the GCM input, we ONLY NEED AES encryption.  Thus, to save space AES\n *  decryption is typically disabled by setting AES_DECRYPTION to 0 in aes.h.\n */\n// We always need our forward tables\nstatic unsigned char FSb[256];     // Forward substitution box (FSb)\nstatic uint32_t FT0[256];  // Forward key schedule assembly tables\nstatic uint32_t FT1[256];\nstatic uint32_t FT2[256];\nstatic uint32_t FT3[256];\n\n#if AES_DECRYPTION         // We ONLY need reverse for decryption\nstatic unsigned char RSb[256];     // Reverse substitution box (RSb)\nstatic uint32_t RT0[256];  // Reverse key schedule assembly tables\nstatic uint32_t RT1[256];\nstatic uint32_t RT2[256];\nstatic uint32_t RT3[256];\n#endif /* AES_DECRYPTION */\n\nstatic uint32_t RCON[10];  // AES round constants\n\n/*\n * Platform Endianness Neutralizing Load and Store Macro definitions\n * AES wants platform-neutral Little Endian (LE) byte ordering\n */\n#define GET_UINT32_LE(n, b, i)                                               \\\n  {                                                                          \\\n    (n) = ((uint32_t) (b)[(i)]) | ((uint32_t) (b)[(i) + 1] << 8) |           \\\n          ((uint32_t) (b)[(i) + 2] << 16) | ((uint32_t) (b)[(i) + 3] << 24); \\\n  }\n\n#define PUT_UINT32_LE(n, b, i)          \\\n  {                                     \\\n    (b)[(i)] = (unsigned char) ((n));           \\\n    (b)[(i) + 1] = (unsigned char) ((n) >> 8);  \\\n    (b)[(i) + 2] = (unsigned char) ((n) >> 16); \\\n    (b)[(i) + 3] = (unsigned char) ((n) >> 24); \\\n  }\n\n/*\n *  AES forward and reverse encryption round processing macros\n */\n#define AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3)          \\\n  {                                                         \\\n    X0 = *RK++ ^ FT0[(Y0) & 0xFF] ^ FT1[(Y1 >> 8) & 0xFF] ^ \\\n         FT2[(Y2 >> 16) & 0xFF] ^ FT3[(Y3 >> 24) & 0xFF];   \\\n                                                            \\\n    X1 = *RK++ ^ FT0[(Y1) & 0xFF] ^ FT1[(Y2 >> 8) & 0xFF] ^ \\\n         FT2[(Y3 >> 16) & 0xFF] ^ FT3[(Y0 >> 24) & 0xFF];   \\\n                                                            \\\n    X2 = *RK++ ^ FT0[(Y2) & 0xFF] ^ FT1[(Y3 >> 8) & 0xFF] ^ \\\n         FT2[(Y0 >> 16) & 0xFF] ^ FT3[(Y1 >> 24) & 0xFF];   \\\n                                                            \\\n    X3 = *RK++ ^ FT0[(Y3) & 0xFF] ^ FT1[(Y0 >> 8) & 0xFF] ^ \\\n         FT2[(Y1 >> 16) & 0xFF] ^ FT3[(Y2 >> 24) & 0xFF];   \\\n  }\n\n#define AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3)          \\\n  {                                                         \\\n    X0 = *RK++ ^ RT0[(Y0) & 0xFF] ^ RT1[(Y3 >> 8) & 0xFF] ^ \\\n         RT2[(Y2 >> 16) & 0xFF] ^ RT3[(Y1 >> 24) & 0xFF];   \\\n                                                            \\\n    X1 = *RK++ ^ RT0[(Y1) & 0xFF] ^ RT1[(Y0 >> 8) & 0xFF] ^ \\\n         RT2[(Y3 >> 16) & 0xFF] ^ RT3[(Y2 >> 24) & 0xFF];   \\\n                                                            \\\n    X2 = *RK++ ^ RT0[(Y2) & 0xFF] ^ RT1[(Y1 >> 8) & 0xFF] ^ \\\n         RT2[(Y0 >> 16) & 0xFF] ^ RT3[(Y3 >> 24) & 0xFF];   \\\n                                                            \\\n    X3 = *RK++ ^ RT0[(Y3) & 0xFF] ^ RT1[(Y2 >> 8) & 0xFF] ^ \\\n         RT2[(Y1 >> 16) & 0xFF] ^ RT3[(Y0 >> 24) & 0xFF];   \\\n  }\n\n/*\n *  These macros improve the readability of the key\n *  generation initialization code by collapsing\n *  repetitive common operations into logical pieces.\n */\n#define ROTL8(x) ((x << 8) & 0xFFFFFFFF) | (x >> 24)\n#define XTIME(x) ((x << 1) ^ ((x & 0x80) ? 0x1B : 0x00))\n#define MUL(x, y) ((x && y) ? pow[(log[x] + log[y]) % 255] : 0)\n#define MIX(x, y)                     \\\n  {                                   \\\n    y = ((y << 1) | (y >> 7)) & 0xFF; \\\n    x ^= y;                           \\\n  }\n#define CPY128     \\\n  {                \\\n    *RK++ = *SK++; \\\n    *RK++ = *SK++; \\\n    *RK++ = *SK++; \\\n    *RK++ = *SK++; \\\n  }\n\n/******************************************************************************\n *\n *  AES_INIT_KEYGEN_TABLES\n *\n *  Fills the AES key expansion tables allocated above with their static\n *  data. This is not \"per key\" data, but static system-wide read-only\n *  table data. THIS FUNCTION IS NOT THREAD SAFE. It must be called once\n *  at system initialization to setup the tables for all subsequent use.\n *\n ******************************************************************************/\nvoid aes_init_keygen_tables(void) {\n  int i, x, y, z;  // general purpose iteration and computation locals\n  int pow[256];\n  int log[256];\n\n  if (aes_tables_inited) return;\n\n  // fill the 'pow' and 'log' tables over GF(2^8)\n  for (i = 0, x = 1; i < 256; i++) {\n    pow[i] = x;\n    log[x] = i;\n    x = (x ^ XTIME(x)) & 0xFF;\n  }\n  // compute the round constants\n  for (i = 0, x = 1; i < 10; i++) {\n    RCON[i] = (uint32_t) x;\n    x = XTIME(x) & 0xFF;\n  }\n  // fill the forward and reverse substitution boxes\n  FSb[0x00] = 0x63;\n#if AES_DECRYPTION  // whether AES decryption is supported\n  RSb[0x63] = 0x00;\n#endif /* AES_DECRYPTION */\n\n  for (i = 1; i < 256; i++) {\n    x = y = pow[255 - log[i]];\n    MIX(x, y);\n    MIX(x, y);\n    MIX(x, y);\n    MIX(x, y);\n    FSb[i] = (unsigned char) (x ^= 0x63);\n#if AES_DECRYPTION  // whether AES decryption is supported\n    RSb[x] = (unsigned char) i;\n#endif /* AES_DECRYPTION */\n  }\n  // generate the forward and reverse key expansion tables\n  for (i = 0; i < 256; i++) {\n    x = FSb[i];\n    y = XTIME(x) & 0xFF;\n    z = (y ^ x) & 0xFF;\n\n    FT0[i] = ((uint32_t) y) ^ ((uint32_t) x << 8) ^ ((uint32_t) x << 16) ^\n             ((uint32_t) z << 24);\n\n    FT1[i] = ROTL8(FT0[i]);\n    FT2[i] = ROTL8(FT1[i]);\n    FT3[i] = ROTL8(FT2[i]);\n\n#if AES_DECRYPTION  // whether AES decryption is supported\n    x = RSb[i];\n\n    RT0[i] = ((uint32_t) MUL(0x0E, x)) ^ ((uint32_t) MUL(0x09, x) << 8) ^\n             ((uint32_t) MUL(0x0D, x) << 16) ^ ((uint32_t) MUL(0x0B, x) << 24);\n\n    RT1[i] = ROTL8(RT0[i]);\n    RT2[i] = ROTL8(RT1[i]);\n    RT3[i] = ROTL8(RT2[i]);\n#endif /* AES_DECRYPTION */\n  }\n  aes_tables_inited = 1;  // flag that the tables have been generated\n}  // to permit subsequent use of the AES cipher\n\n/******************************************************************************\n *\n *  AES_SET_ENCRYPTION_KEY\n *\n *  This is called by 'aes_setkey' when we're establishing a key for\n *  subsequent encryption.  We give it a pointer to the encryption\n *  context, a pointer to the key, and the key's length in bytes.\n *  Valid lengths are: 16, 24 or 32 bytes (128, 192, 256 bits).\n *\n ******************************************************************************/\nstatic int aes_set_encryption_key(aes_context *ctx, const unsigned char *key,\n                                  unsigned int keysize) {\n  unsigned int i;                  // general purpose iteration local\n  uint32_t *RK = ctx->rk;  // initialize our RoundKey buffer pointer\n\n  for (i = 0; i < (keysize >> 2); i++) {\n    GET_UINT32_LE(RK[i], key, i << 2);\n  }\n\n  switch (ctx->rounds) {\n    case 10:\n      for (i = 0; i < 10; i++, RK += 4) {\n        RK[4] = RK[0] ^ RCON[i] ^ ((uint32_t) FSb[(RK[3] >> 8) & 0xFF]) ^\n                ((uint32_t) FSb[(RK[3] >> 16) & 0xFF] << 8) ^\n                ((uint32_t) FSb[(RK[3] >> 24) & 0xFF] << 16) ^\n                ((uint32_t) FSb[(RK[3]) & 0xFF] << 24);\n\n        RK[5] = RK[1] ^ RK[4];\n        RK[6] = RK[2] ^ RK[5];\n        RK[7] = RK[3] ^ RK[6];\n      }\n      break;\n\n    case 12:\n      for (i = 0; i < 8; i++, RK += 6) {\n        RK[6] = RK[0] ^ RCON[i] ^ ((uint32_t) FSb[(RK[5] >> 8) & 0xFF]) ^\n                ((uint32_t) FSb[(RK[5] >> 16) & 0xFF] << 8) ^\n                ((uint32_t) FSb[(RK[5] >> 24) & 0xFF] << 16) ^\n                ((uint32_t) FSb[(RK[5]) & 0xFF] << 24);\n\n        RK[7] = RK[1] ^ RK[6];\n        RK[8] = RK[2] ^ RK[7];\n        RK[9] = RK[3] ^ RK[8];\n        RK[10] = RK[4] ^ RK[9];\n        RK[11] = RK[5] ^ RK[10];\n      }\n      break;\n\n    case 14:\n      for (i = 0; i < 7; i++, RK += 8) {\n        RK[8] = RK[0] ^ RCON[i] ^ ((uint32_t) FSb[(RK[7] >> 8) & 0xFF]) ^\n                ((uint32_t) FSb[(RK[7] >> 16) & 0xFF] << 8) ^\n                ((uint32_t) FSb[(RK[7] >> 24) & 0xFF] << 16) ^\n                ((uint32_t) FSb[(RK[7]) & 0xFF] << 24);\n\n        RK[9] = RK[1] ^ RK[8];\n        RK[10] = RK[2] ^ RK[9];\n        RK[11] = RK[3] ^ RK[10];\n\n        RK[12] = RK[4] ^ ((uint32_t) FSb[(RK[11]) & 0xFF]) ^\n                 ((uint32_t) FSb[(RK[11] >> 8) & 0xFF] << 8) ^\n                 ((uint32_t) FSb[(RK[11] >> 16) & 0xFF] << 16) ^\n                 ((uint32_t) FSb[(RK[11] >> 24) & 0xFF] << 24);\n\n        RK[13] = RK[5] ^ RK[12];\n        RK[14] = RK[6] ^ RK[13];\n        RK[15] = RK[7] ^ RK[14];\n      }\n      break;\n\n    default:\n      return -1;\n  }\n  return (0);\n}\n\n#if AES_DECRYPTION  // whether AES decryption is supported\n\n/******************************************************************************\n *\n *  AES_SET_DECRYPTION_KEY\n *\n *  This is called by 'aes_setkey' when we're establishing a\n *  key for subsequent decryption.  We give it a pointer to\n *  the encryption context, a pointer to the key, and the key's\n *  length in bits. Valid lengths are: 128, 192, or 256 bits.\n *\n ******************************************************************************/\nstatic int aes_set_decryption_key(aes_context *ctx, const unsigned char *key,\n                                  unsigned int keysize) {\n  int i, j;\n  aes_context cty;         // a calling aes context for set_encryption_key\n  uint32_t *RK = ctx->rk;  // initialize our RoundKey buffer pointer\n  uint32_t *SK;\n  int ret;\n\n  cty.rounds = ctx->rounds;  // initialize our local aes context\n  cty.rk = cty.buf;          // round count and key buf pointer\n\n  if ((ret = aes_set_encryption_key(&cty, key, keysize)) != 0) return (ret);\n\n  SK = cty.rk + cty.rounds * 4;\n\n  CPY128  // copy a 128-bit block from *SK to *RK\n\n      for (i = ctx->rounds - 1, SK -= 8; i > 0; i--, SK -= 8) {\n    for (j = 0; j < 4; j++, SK++) {\n      *RK++ = RT0[FSb[(*SK) & 0xFF]] ^ RT1[FSb[(*SK >> 8) & 0xFF]] ^\n              RT2[FSb[(*SK >> 16) & 0xFF]] ^ RT3[FSb[(*SK >> 24) & 0xFF]];\n    }\n  }\n  CPY128  // copy a 128-bit block from *SK to *RK\n      memset(&cty, 0, sizeof(aes_context));  // clear local aes context\n  return (0);\n}\n\n#endif /* AES_DECRYPTION */\n\n/******************************************************************************\n *\n *  AES_SETKEY\n *\n *  Invoked to establish the key schedule for subsequent encryption/decryption\n *\n ******************************************************************************/\nstatic int aes_setkey(aes_context *ctx,  // AES context provided by our caller\n                      int mode,          // ENCRYPT or DECRYPT flag\n                      const unsigned char *key,  // pointer to the key\n                      unsigned int keysize)      // key length in bytes\n{\n  // since table initialization is not thread safe, we could either add\n  // system-specific mutexes and init the AES key generation tables on\n  // demand, or ask the developer to simply call \"gcm_initialize\" once during\n  // application startup before threading begins. That's what we choose.\n  if (!aes_tables_inited) return (-1);  // fail the call when not inited.\n\n  ctx->mode = mode;    // capture the key type we're creating\n  ctx->rk = ctx->buf;  // initialize our round key pointer\n\n  switch (keysize)  // set the rounds count based upon the keysize\n  {\n    case 16:\n      ctx->rounds = 10;\n      break;  // 16-byte, 128-bit key\n    case 24:\n      ctx->rounds = 12;\n      break;  // 24-byte, 192-bit key\n    case 32:\n      ctx->rounds = 14;\n      break;  // 32-byte, 256-bit key\n    default:\n      return (-1);\n  }\n\n#if AES_DECRYPTION\n  if (mode == MG_DECRYPT)  // expand our key for encryption or decryption\n    return (aes_set_decryption_key(ctx, key, keysize));\n  else /* MG_ENCRYPT */\n#endif /* AES_DECRYPTION */\n    return (aes_set_encryption_key(ctx, key, keysize));\n}\n\n/******************************************************************************\n *\n *  AES_CIPHER\n *\n *  Perform AES encryption and decryption.\n *  The AES context will have been setup with the encryption mode\n *  and all keying information appropriate for the task.\n *\n ******************************************************************************/\nstatic int aes_cipher(aes_context *ctx, const unsigned char input[16],\n                      unsigned char output[16]) {\n  int i;\n  uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;  // general purpose locals\n\n  RK = ctx->rk;\n\n  GET_UINT32_LE(X0, input, 0);\n  X0 ^= *RK++;  // load our 128-bit\n  GET_UINT32_LE(X1, input, 4);\n  X1 ^= *RK++;  // input buffer in a storage\n  GET_UINT32_LE(X2, input, 8);\n  X2 ^= *RK++;  // memory endian-neutral way\n  GET_UINT32_LE(X3, input, 12);\n  X3 ^= *RK++;\n\n#if AES_DECRYPTION  // whether AES decryption is supported\n\n  if (ctx->mode == MG_DECRYPT) {\n    for (i = (ctx->rounds >> 1) - 1; i > 0; i--) {\n      AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3);\n      AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3);\n    }\n\n    AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3);\n\n    X0 = *RK++ ^ ((uint32_t) RSb[(Y0) & 0xFF]) ^\n         ((uint32_t) RSb[(Y3 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) RSb[(Y2 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) RSb[(Y1 >> 24) & 0xFF] << 24);\n\n    X1 = *RK++ ^ ((uint32_t) RSb[(Y1) & 0xFF]) ^\n         ((uint32_t) RSb[(Y0 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) RSb[(Y3 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) RSb[(Y2 >> 24) & 0xFF] << 24);\n\n    X2 = *RK++ ^ ((uint32_t) RSb[(Y2) & 0xFF]) ^\n         ((uint32_t) RSb[(Y1 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) RSb[(Y0 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) RSb[(Y3 >> 24) & 0xFF] << 24);\n\n    X3 = *RK++ ^ ((uint32_t) RSb[(Y3) & 0xFF]) ^\n         ((uint32_t) RSb[(Y2 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) RSb[(Y1 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) RSb[(Y0 >> 24) & 0xFF] << 24);\n  } else /* MG_ENCRYPT */\n  {\n#endif /* AES_DECRYPTION */\n\n    for (i = (ctx->rounds >> 1) - 1; i > 0; i--) {\n      AES_FROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3);\n      AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3);\n    }\n\n    AES_FROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3);\n\n    X0 = *RK++ ^ ((uint32_t) FSb[(Y0) & 0xFF]) ^\n         ((uint32_t) FSb[(Y1 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) FSb[(Y2 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) FSb[(Y3 >> 24) & 0xFF] << 24);\n\n    X1 = *RK++ ^ ((uint32_t) FSb[(Y1) & 0xFF]) ^\n         ((uint32_t) FSb[(Y2 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) FSb[(Y3 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) FSb[(Y0 >> 24) & 0xFF] << 24);\n\n    X2 = *RK++ ^ ((uint32_t) FSb[(Y2) & 0xFF]) ^\n         ((uint32_t) FSb[(Y3 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) FSb[(Y0 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) FSb[(Y1 >> 24) & 0xFF] << 24);\n\n    X3 = *RK++ ^ ((uint32_t) FSb[(Y3) & 0xFF]) ^\n         ((uint32_t) FSb[(Y0 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) FSb[(Y1 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) FSb[(Y2 >> 24) & 0xFF] << 24);\n\n#if AES_DECRYPTION  // whether AES decryption is supported\n  }\n#endif /* AES_DECRYPTION */\n\n  PUT_UINT32_LE(X0, output, 0);\n  PUT_UINT32_LE(X1, output, 4);\n  PUT_UINT32_LE(X2, output, 8);\n  PUT_UINT32_LE(X3, output, 12);\n\n  return (0);\n}\n/* end of aes.c */\n/******************************************************************************\n *\n * THIS SOURCE CODE IS HEREBY PLACED INTO THE PUBLIC DOMAIN FOR THE GOOD OF ALL\n *\n * This is a simple and straightforward implementation of AES-GCM authenticated\n * encryption. The focus of this work was correctness & accuracy. It is written\n * in straight 'C' without any particular focus upon optimization or speed. It\n * should be endian (memory byte order) neutral since the few places that care\n * are handled explicitly.\n *\n * This implementation of AES-GCM was created by Steven M. Gibson of GRC.com.\n *\n * It is intended for general purpose use, but was written in support of GRC's\n * reference implementation of the SQRL (Secure Quick Reliable Login) client.\n *\n * See:    http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf\n *         http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/\n *         gcm/gcm-revised-spec.pdf\n *\n * NO COPYRIGHT IS CLAIMED IN THIS WORK, HOWEVER, NEITHER IS ANY WARRANTY MADE\n * REGARDING ITS FITNESS FOR ANY PARTICULAR PURPOSE. USE IT AT YOUR OWN RISK.\n *\n *******************************************************************************/\n\n/******************************************************************************\n *                      ==== IMPLEMENTATION WARNING ====\n *\n *  This code was developed for use within SQRL's fixed environmnent. Thus, it\n *  is somewhat less \"general purpose\" than it would be if it were designed as\n *  a general purpose AES-GCM library. Specifically, it bothers with almost NO\n *  error checking on parameter limits, buffer bounds, etc. It assumes that it\n *  is being invoked by its author or by someone who understands the values it\n *  expects to receive. Its behavior will be undefined otherwise.\n *\n *  All functions that might fail are defined to return 'ints' to indicate a\n *  problem. Most do not do so now. But this allows for error propagation out\n *  of internal functions if robust error checking should ever be desired.\n *\n ******************************************************************************/\n\n/* Calculating the \"GHASH\"\n *\n * There are many ways of calculating the so-called GHASH in software, each with\n * a traditional size vs performance tradeoff.  The GHASH (Galois field hash) is\n * an intriguing construction which takes two 128-bit strings (also the cipher's\n * block size and the fundamental operation size for the system) and hashes them\n * into a third 128-bit result.\n *\n * Many implementation solutions have been worked out that use large precomputed\n * table lookups in place of more time consuming bit fiddling, and this approach\n * can be scaled easily upward or downward as needed to change the time/space\n * tradeoff. It's been studied extensively and there's a solid body of theory\n * and practice.  For example, without using any lookup tables an implementation\n * might obtain 119 cycles per byte throughput, whereas using a simple, though\n * large, key-specific 64 kbyte 8-bit lookup table the performance jumps to 13\n * cycles per byte.\n *\n * And Intel's processors have, since 2010, included an instruction which does\n * the entire 128x128->128 bit job in just several 64x64->128 bit pieces.\n *\n * Since SQRL is interactive, and only processing a few 128-bit blocks, I've\n * settled upon a relatively slower but appealing small-table compromise which\n * folds a bunch of not only time consuming but also bit twiddling into a simple\n * 16-entry table which is attributed to Victor Shoup's 1996 work while at\n * Bellcore: \"On Fast and Provably Secure MessageAuthentication Based on\n * Universal Hashing.\"  See: http://www.shoup.net/papers/macs.pdf\n * See, also section 4.1 of the \"gcm-revised-spec\" cited above.\n */\n\n/*\n *  This 16-entry table of pre-computed constants is used by the\n *  GHASH multiplier to improve over a strictly table-free but\n *  significantly slower 128x128 bit multiple within GF(2^128).\n */\nstatic const uint64_t last4[16] = {\n    0x0000, 0x1c20, 0x3840, 0x2460, 0x7080, 0x6ca0, 0x48c0, 0x54e0,\n    0xe100, 0xfd20, 0xd940, 0xc560, 0x9180, 0x8da0, 0xa9c0, 0xb5e0};\n\n/*\n * Platform Endianness Neutralizing Load and Store Macro definitions\n * GCM wants platform-neutral Big Endian (BE) byte ordering\n */\n#define GET_UINT32_BE(n, b, i)                                            \\\n  {                                                                       \\\n    (n) = ((uint32_t) (b)[(i)] << 24) | ((uint32_t) (b)[(i) + 1] << 16) | \\\n          ((uint32_t) (b)[(i) + 2] << 8) | ((uint32_t) (b)[(i) + 3]);     \\\n  }\n\n#define PUT_UINT32_BE(n, b, i)          \\\n  {                                     \\\n    (b)[(i)] = (unsigned char) ((n) >> 24);     \\\n    (b)[(i) + 1] = (unsigned char) ((n) >> 16); \\\n    (b)[(i) + 2] = (unsigned char) ((n) >> 8);  \\\n    (b)[(i) + 3] = (unsigned char) ((n));       \\\n  }\n\n/******************************************************************************\n *\n *  GCM_INITIALIZE\n *\n *  Must be called once to initialize the GCM library.\n *\n *  At present, this only calls the AES keygen table generator, which expands\n *  the AES keying tables for use. This is NOT A THREAD-SAFE function, so it\n *  MUST be called during system initialization before a multi-threading\n *  environment is running.\n *\n ******************************************************************************/\nint mg_gcm_initialize(void) {\n  aes_init_keygen_tables();\n  return (0);\n}\n\n/******************************************************************************\n *\n *  GCM_MULT\n *\n *  Performs a GHASH operation on the 128-bit input vector 'x', setting\n *  the 128-bit output vector to 'x' times H using our precomputed tables.\n *  'x' and 'output' are seen as elements of GCM's GF(2^128) Galois field.\n *\n ******************************************************************************/\nstatic void gcm_mult(gcm_context *ctx,   // pointer to established context\n                     const unsigned char x[16],  // pointer to 128-bit input vector\n                     unsigned char output[16])   // pointer to 128-bit output vector\n{\n  int i;\n  unsigned char lo, hi, rem;\n  uint64_t zh, zl;\n\n  lo = (unsigned char) (x[15] & 0x0f);\n  hi = (unsigned char) (x[15] >> 4);\n  zh = ctx->HH[lo];\n  zl = ctx->HL[lo];\n\n  for (i = 15; i >= 0; i--) {\n    lo = (unsigned char) (x[i] & 0x0f);\n    hi = (unsigned char) (x[i] >> 4);\n\n    if (i != 15) {\n      rem = (unsigned char) (zl & 0x0f);\n      zl = (zh << 60) | (zl >> 4);\n      zh = (zh >> 4);\n      zh ^= (uint64_t) last4[rem] << 48;\n      zh ^= ctx->HH[lo];\n      zl ^= ctx->HL[lo];\n    }\n    rem = (unsigned char) (zl & 0x0f);\n    zl = (zh << 60) | (zl >> 4);\n    zh = (zh >> 4);\n    zh ^= (uint64_t) last4[rem] << 48;\n    zh ^= ctx->HH[hi];\n    zl ^= ctx->HL[hi];\n  }\n  PUT_UINT32_BE(zh >> 32, output, 0);\n  PUT_UINT32_BE(zh, output, 4);\n  PUT_UINT32_BE(zl >> 32, output, 8);\n  PUT_UINT32_BE(zl, output, 12);\n}\n\n/******************************************************************************\n *\n *  GCM_SETKEY\n *\n *  This is called to set the AES-GCM key. It initializes the AES key\n *  and populates the gcm context's pre-calculated HTables.\n *\n ******************************************************************************/\nstatic int gcm_setkey(\n    gcm_context *ctx,    // pointer to caller-provided gcm context\n    const unsigned char *key,    // pointer to the AES encryption key\n    const unsigned int keysize)  // size in bytes (must be 16, 24, 32 for\n                         // 128, 192 or 256-bit keys respectively)\n{\n  int ret, i, j;\n  uint64_t hi, lo;\n  uint64_t vl, vh;\n  unsigned char h[16];\n\n  memset(ctx, 0, sizeof(gcm_context));  // zero caller-provided GCM context\n  memset(h, 0, 16);                     // initialize the block to encrypt\n\n  // encrypt the null 128-bit block to generate a key-based value\n  // which is then used to initialize our GHASH lookup tables\n  if ((ret = aes_setkey(&ctx->aes_ctx, MG_ENCRYPT, key, keysize)) != 0)\n    return (ret);\n  if ((ret = aes_cipher(&ctx->aes_ctx, h, h)) != 0) return (ret);\n\n  GET_UINT32_BE(hi, h, 0);  // pack h as two 64-bit ints, big-endian\n  GET_UINT32_BE(lo, h, 4);\n  vh = (uint64_t) hi << 32 | lo;\n\n  GET_UINT32_BE(hi, h, 8);\n  GET_UINT32_BE(lo, h, 12);\n  vl = (uint64_t) hi << 32 | lo;\n\n  ctx->HL[8] = vl;  // 8 = 1000 corresponds to 1 in GF(2^128)\n  ctx->HH[8] = vh;\n  ctx->HH[0] = 0;  // 0 corresponds to 0 in GF(2^128)\n  ctx->HL[0] = 0;\n\n  for (i = 4; i > 0; i >>= 1) {\n    uint32_t T = (uint32_t) (vl & 1) * 0xe1000000U;\n    vl = (vh << 63) | (vl >> 1);\n    vh = (vh >> 1) ^ ((uint64_t) T << 32);\n    ctx->HL[i] = vl;\n    ctx->HH[i] = vh;\n  }\n  for (i = 2; i < 16; i <<= 1) {\n    uint64_t *HiL = ctx->HL + i, *HiH = ctx->HH + i;\n    vh = *HiH;\n    vl = *HiL;\n    for (j = 1; j < i; j++) {\n      HiH[j] = vh ^ ctx->HH[j];\n      HiL[j] = vl ^ ctx->HL[j];\n    }\n  }\n  return (0);\n}\n\n/******************************************************************************\n *\n *    GCM processing occurs four phases: SETKEY, START, UPDATE and FINISH.\n *\n *  SETKEY:\n *\n *   START: Sets the Encryption/Decryption mode.\n *          Accepts the initialization vector and additional data.\n *\n *  UPDATE: Encrypts or decrypts the plaintext or ciphertext.\n *\n *  FINISH: Performs a final GHASH to generate the authentication tag.\n *\n ******************************************************************************\n *\n *  GCM_START\n *\n *  Given a user-provided GCM context, this initializes it, sets the encryption\n *  mode, and preprocesses the initialization vector and additional AEAD data.\n *\n ******************************************************************************/\nint gcm_start(gcm_context *ctx,  // pointer to user-provided GCM context\n              int mode,          // GCM_ENCRYPT or GCM_DECRYPT\n              const unsigned char *iv,   // pointer to initialization vector\n              size_t iv_len,     // IV length in bytes (should == 12)\n              const unsigned char *add,  // ptr to additional AEAD data (NULL if none)\n              size_t add_len)    // length of additional AEAD data (bytes)\n{\n  int ret;             // our error return if the AES encrypt fails\n  unsigned char work_buf[16];  // XOR source built from provided IV if len != 16\n  const unsigned char *p;      // general purpose array pointer\n  size_t use_len;      // byte count to process, up to 16 bytes\n  size_t i;            // local loop iterator\n\n  // since the context might be reused under the same key\n  // we zero the working buffers for this next new process\n  memset(ctx->y, 0x00, sizeof(ctx->y));\n  memset(ctx->buf, 0x00, sizeof(ctx->buf));\n  ctx->len = 0;\n  ctx->add_len = 0;\n\n  ctx->mode = mode;                // set the GCM encryption/decryption mode\n  ctx->aes_ctx.mode = MG_ENCRYPT;  // GCM *always* runs AES in ENCRYPTION mode\n\n  if (iv_len == 12) {            // GCM natively uses a 12-byte, 96-bit IV\n    memcpy(ctx->y, iv, iv_len);  // copy the IV to the top of the 'y' buff\n    ctx->y[15] = 1;              // start \"counting\" from 1 (not 0)\n  } else  // if we don't have a 12-byte IV, we GHASH whatever we've been given\n  {\n    memset(work_buf, 0x00, 16);               // clear the working buffer\n    PUT_UINT32_BE(iv_len * 8, work_buf, 12);  // place the IV into buffer\n\n    p = iv;\n    while (iv_len > 0) {\n      use_len = (iv_len < 16) ? iv_len : 16;\n      for (i = 0; i < use_len; i++) ctx->y[i] ^= p[i];\n      gcm_mult(ctx, ctx->y, ctx->y);\n      iv_len -= use_len;\n      p += use_len;\n    }\n    for (i = 0; i < 16; i++) ctx->y[i] ^= work_buf[i];\n    gcm_mult(ctx, ctx->y, ctx->y);\n  }\n  if ((ret = aes_cipher(&ctx->aes_ctx, ctx->y, ctx->base_ectr)) != 0)\n    return (ret);\n\n  ctx->add_len = add_len;\n  p = add;\n  while (add_len > 0) {\n    use_len = (add_len < 16) ? add_len : 16;\n    for (i = 0; i < use_len; i++) ctx->buf[i] ^= p[i];\n    gcm_mult(ctx, ctx->buf, ctx->buf);\n    add_len -= use_len;\n    p += use_len;\n  }\n  return (0);\n}\n\n/******************************************************************************\n *\n *  GCM_UPDATE\n *\n *  This is called once or more to process bulk plaintext or ciphertext data.\n *  We give this some number of bytes of input and it returns the same number\n *  of output bytes. If called multiple times (which is fine) all but the final\n *  invocation MUST be called with length mod 16 == 0. (Only the final call can\n *  have a partial block length of < 128 bits.)\n *\n ******************************************************************************/\nint gcm_update(gcm_context *ctx,    // pointer to user-provided GCM context\n               size_t length,       // length, in bytes, of data to process\n               const unsigned char *input,  // pointer to source data\n               unsigned char *output)       // pointer to destination data\n{\n  int ret;         // our error return if the AES encrypt fails\n  unsigned char ectr[16];  // counter-mode cipher output for XORing\n  size_t use_len;  // byte count to process, up to 16 bytes\n  size_t i;        // local loop iterator\n\n  ctx->len += length;  // bump the GCM context's running length count\n\n  while (length > 0) {\n    // clamp the length to process at 16 bytes\n    use_len = (length < 16) ? length : 16;\n\n    // increment the context's 128-bit IV||Counter 'y' vector\n    for (i = 16; i > 12; i--)\n      if (++ctx->y[i - 1] != 0) break;\n\n    // encrypt the context's 'y' vector under the established key\n    if ((ret = aes_cipher(&ctx->aes_ctx, ctx->y, ectr)) != 0) return (ret);\n\n    // encrypt or decrypt the input to the output\n    if (ctx->mode == MG_ENCRYPT) {\n      for (i = 0; i < use_len; i++) {\n        // XOR the cipher's ouptut vector (ectr) with our input\n        output[i] = (unsigned char) (ectr[i] ^ input[i]);\n        // now we mix in our data into the authentication hash.\n        // if we're ENcrypting we XOR in the post-XOR (output)\n        // results, but if we're DEcrypting we XOR in the input\n        // data\n        ctx->buf[i] ^= output[i];\n      }\n    } else {\n      for (i = 0; i < use_len; i++) {\n        // but if we're DEcrypting we XOR in the input data first,\n        // i.e. before saving to ouput data, otherwise if the input\n        // and output buffer are the same (inplace decryption) we\n        // would not get the correct auth tag\n\n        ctx->buf[i] ^= input[i];\n\n        // XOR the cipher's ouptut vector (ectr) with our input\n        output[i] = (unsigned char) (ectr[i] ^ input[i]);\n      }\n    }\n    gcm_mult(ctx, ctx->buf, ctx->buf);  // perform a GHASH operation\n\n    length -= use_len;  // drop the remaining byte count to process\n    input += use_len;   // bump our input pointer forward\n    output += use_len;  // bump our output pointer forward\n  }\n  return (0);\n}\n\n/******************************************************************************\n *\n *  GCM_FINISH\n *\n *  This is called once after all calls to GCM_UPDATE to finalize the GCM.\n *  It performs the final GHASH to produce the resulting authentication TAG.\n *\n ******************************************************************************/\nint gcm_finish(gcm_context *ctx,  // pointer to user-provided GCM context\n               unsigned char *tag,        // pointer to buffer which receives the tag\n               size_t tag_len)    // length, in bytes, of the tag-receiving buf\n{\n  unsigned char work_buf[16];\n  uint64_t orig_len = ctx->len * 8;\n  uint64_t orig_add_len = ctx->add_len * 8;\n  size_t i;\n\n  if (tag_len != 0) memcpy(tag, ctx->base_ectr, tag_len);\n\n  if (orig_len || orig_add_len) {\n    memset(work_buf, 0x00, 16);\n\n    PUT_UINT32_BE((orig_add_len >> 32), work_buf, 0);\n    PUT_UINT32_BE((orig_add_len), work_buf, 4);\n    PUT_UINT32_BE((orig_len >> 32), work_buf, 8);\n    PUT_UINT32_BE((orig_len), work_buf, 12);\n\n    for (i = 0; i < 16; i++) ctx->buf[i] ^= work_buf[i];\n    gcm_mult(ctx, ctx->buf, ctx->buf);\n    for (i = 0; i < tag_len; i++) tag[i] ^= ctx->buf[i];\n  }\n  return (0);\n}\n\n/******************************************************************************\n *\n *  GCM_CRYPT_AND_TAG\n *\n *  This either encrypts or decrypts the user-provided data and, either\n *  way, generates an authentication tag of the requested length. It must be\n *  called with a GCM context whose key has already been set with GCM_SETKEY.\n *\n *  The user would typically call this explicitly to ENCRYPT a buffer of data\n *  and optional associated data, and produce its an authentication tag.\n *\n *  To reverse the process the user would typically call the companion\n *  GCM_AUTH_DECRYPT function to decrypt data and verify a user-provided\n *  authentication tag.  The GCM_AUTH_DECRYPT function calls this function\n *  to perform its decryption and tag generation, which it then compares.\n *\n ******************************************************************************/\nint gcm_crypt_and_tag(\n    gcm_context *ctx,    // gcm context with key already setup\n    int mode,            // cipher direction: GCM_ENCRYPT or GCM_DECRYPT\n    const unsigned char *iv,     // pointer to the 12-byte initialization vector\n    size_t iv_len,       // byte length if the IV. should always be 12\n    const unsigned char *add,    // pointer to the non-ciphered additional data\n    size_t add_len,      // byte length of the additional AEAD data\n    const unsigned char *input,  // pointer to the cipher data source\n    unsigned char *output,       // pointer to the cipher data destination\n    size_t length,       // byte length of the cipher data\n    unsigned char *tag,          // pointer to the tag to be generated\n    size_t tag_len)      // byte length of the tag to be generated\n{                        /*\n                            assuming that the caller has already invoked gcm_setkey to\n                            prepare the gcm context with the keying material, we simply\n                            invoke each of the three GCM sub-functions in turn...\n                         */\n  gcm_start(ctx, mode, iv, iv_len, add, add_len);\n  gcm_update(ctx, length, input, output);\n  gcm_finish(ctx, tag, tag_len);\n  return (0);\n}\n\n/******************************************************************************\n *\n *  GCM_ZERO_CTX\n *\n *  The GCM context contains both the GCM context and the AES context.\n *  This includes keying and key-related material which is security-\n *  sensitive, so it MUST be zeroed after use. This function does that.\n *\n ******************************************************************************/\nvoid gcm_zero_ctx(gcm_context *ctx) {\n  // zero the context originally provided to us\n  memset(ctx, 0, sizeof(gcm_context));\n}\n//\n//  aes-gcm.c\n//  Pods\n//\n//  Created by Markus Kosmal on 20/11/14.\n//\n//\n\nint mg_aes_gcm_encrypt(unsigned char *output,  //\n                       const unsigned char *input, size_t input_length,\n                       const unsigned char *key, const size_t key_len,\n                       const unsigned char *iv, const size_t iv_len,\n                       unsigned char *aead, size_t aead_len, unsigned char *tag,\n                       const size_t tag_len) {\n  int ret = 0;      // our return value\n  gcm_context ctx;  // includes the AES context structure\n\n  gcm_setkey(&ctx, key, (unsigned int) key_len);\n\n  ret = gcm_crypt_and_tag(&ctx, MG_ENCRYPT, iv, iv_len, aead, aead_len, input,\n                          output, input_length, tag, tag_len);\n\n  gcm_zero_ctx(&ctx);\n\n  return (ret);\n}\n\nint mg_aes_gcm_decrypt(unsigned char *output, const unsigned char *input,\n                       size_t input_length, const unsigned char *key,\n                       const size_t key_len, const unsigned char *iv,\n                       const size_t iv_len) {\n  int ret = 0;      // our return value\n  gcm_context ctx;  // includes the AES context structure\n\n  size_t tag_len = 0;\n  unsigned char *tag_buf = NULL;\n\n  gcm_setkey(&ctx, key, (unsigned int) key_len);\n\n  ret = gcm_crypt_and_tag(&ctx, MG_DECRYPT, iv, iv_len, NULL, 0, input, output,\n                          input_length, tag_buf, tag_len);\n\n  gcm_zero_ctx(&ctx);\n\n  return (ret);\n}\n#endif\n// End of aes128 PD\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/tls_builtin.c\"\n#endif\n\n\n\n\n\n\n\n\n\n\n\n\n#if MG_TLS == MG_TLS_BUILTIN\n\n// PKCS#8 algorithm OIDs\nstatic const uint8_t mg_rsa_oid[] = {\n    0x2a, 0x86, 0x48, 0x86, 0xf7,\n    0x0d, 0x01, 0x01, 0x01  // 1.2.840.113549.1.1.1 rsaEncryption\n};\nstatic const uint8_t mg_ec_public_key_oid[] = {\n    0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01  // 1.2.840.10045.2.1 ecPublicKey\n};\nstatic const uint8_t mg_secp256r1_oid[] = {\n    0x2a, 0x86, 0x48, 0xce,\n    0x3d, 0x03, 0x01, 0x07  // 1.2.840.10045.3.1.7 secp256r1\n};\n\n/* TLS 1.3 Record Content Type (RFC8446 B.1) */\n#define MG_TLS_CHANGE_CIPHER 20\n#define MG_TLS_ALERT 21\n#define MG_TLS_HANDSHAKE 22\n#define MG_TLS_APP_DATA 23\n#define MG_TLS_HEARTBEAT 24\n\n/* TLS 1.3 Handshake Message Type (RFC8446 B.3) */\n#define MG_TLS_CLIENT_HELLO 1\n#define MG_TLS_SERVER_HELLO 2\n#define MG_TLS_ENCRYPTED_EXTENSIONS 8\n#define MG_TLS_CERTIFICATE 11\n#define MG_TLS_CERTIFICATE_REQUEST 13\n#define MG_TLS_CERTIFICATE_VERIFY 15\n#define MG_TLS_FINISHED 20\n\n#define MG_TLS_RSA_USE_CRT 1  // CRT instead of naive RSA\n\n// handshake is re-entrant, so we need to keep track of its state state names\n// refer to RFC8446#A.1\nenum mg_tls_hs_state {\n  // Client state machine:\n  MG_TLS_STATE_CLIENT_START,        // Send ClientHello\n  MG_TLS_STATE_CLIENT_WAIT_SH,      // Wait for ServerHello\n  MG_TLS_STATE_CLIENT_WAIT_EE,      // Wait for EncryptedExtensions\n  MG_TLS_STATE_CLIENT_WAIT_CERT,    // Wait for Certificate\n  MG_TLS_STATE_CLIENT_WAIT_CV,      // Wait for CertificateVerify\n  MG_TLS_STATE_CLIENT_WAIT_FINISH,  // Wait for Finish\n  MG_TLS_STATE_CLIENT_CONNECTED,    // Done\n\n  // Server state machine:\n  MG_TLS_STATE_SERVER_START,       // Wait for ClientHello\n  MG_TLS_STATE_SERVER_WAIT_CERT,   // Wait for Certificate\n  MG_TLS_STATE_SERVER_WAIT_CV,     // Wait for CertificateVerify\n  MG_TLS_STATE_SERVER_NEGOTIATED,  // Wait for Finish\n  MG_TLS_STATE_SERVER_CONNECTED    // Done\n};\n\n// encryption keys for a TLS connection\nstruct tls_enc {\n  uint32_t sseq;  // server sequence number, used in encryption\n  uint32_t cseq;  // client sequence number, used in decryption\n  // keys for AES encryption or ChaCha20\n  uint8_t handshake_secret[32];\n  uint8_t server_write_key[32];\n  uint8_t server_write_iv[12];\n  uint8_t server_finished_key[32];\n  uint8_t client_write_key[32];\n  uint8_t client_write_iv[12];\n  uint8_t client_finished_key[32];\n};\n\nstruct mg_rsa_key {\n  struct mg_str n;     // modulus\n  struct mg_str e;     // public exponent\n  struct mg_str d;     // private exponent\n  struct mg_str p;     // prime1\n  struct mg_str q;     // prime2\n  struct mg_str dP;    // exponent1 (d mod (p-1))\n  struct mg_str dQ;    // exponent2 (d mod (q-1))\n  struct mg_str qInv;  // coefficient ((inverse of q) mod p)\n};\n\n// per-connection TLS data\nstruct tls_data {\n  enum mg_tls_hs_state state;  // keep track of connection handshake progress\n\n  struct mg_iobuf send;  // For the receive path, we're reusing c->rtls\n  size_t recv_offset;    // While c->rtls contains full records, reuse that\n  size_t recv_len;       // buffer but point at individual decrypted messages\n\n  uint8_t content_type;  // Last received record content type\n\n  mg_sha256_ctx sha256;  // incremental SHA-256 hash for TLS handshake\n\n  uint8_t random[32];      // client random from ClientHello\n  uint8_t session_id[32];  // client session ID between the handshake states\n  uint8_t x25519_cli[32];  // client X25519 key between the handshake states\n  uint8_t x25519_sec[32];  // x25519 secret between the handshake states\n\n  bool skip_verification;    // do not perform checks on server certificate\n  bool cert_requested;       // client received a CertificateRequest\n  bool is_twoway;            // server is configured to authenticate clients\n  struct mg_str cert_der;    // certificate in DER format\n  struct mg_str ca_der;      // CA certificate\n  struct mg_str *chain_der;  // certificate chain (intermediate certs)\n  size_t chain_len;          // number of certificates in chain\n  uint8_t ec_key[32];        // EC private key\n  struct mg_rsa_key rsa;\n  struct mg_str rsa_key_der;  // RSA private key in DER format\n  char hostname[254];         // matching hostname\n\n  bool is_ec_pubkey;         // EC or RSA\n  uint8_t pubkey[512 + 16];  // server EC (64) or RSA (512+exp) public key to\n                             // verify cert\n  size_t pubkeysz;           // size of the server public key\n  uint8_t sighash[32];       // calculated signature verification hash\n\n  struct tls_enc enc;       // actual keys in use at this time\n  struct tls_enc app_keys;  // storage during two-way auth handshake\n};\n\n#define TLS_RECHDR_SIZE 5  // 1 byte type, 2 bytes version, 2 bytes length\n#define TLS_MSGHDR_SIZE 4  // 1 byte type, 3 bytes length\n\n#ifdef MG_TLS_SSLKEYLOGFILE\n#include <stdio.h>\nstatic void mg_ssl_key_log(const char *label, uint8_t client_random[32],\n                           uint8_t *secret, size_t secretsz) {\n  char *keylogfile = getenv(\"SSLKEYLOGFILE\");\n  size_t i;\n  if (keylogfile != NULL) {\n    MG_DEBUG((\"Dumping key log into %s\", keylogfile));\n    FILE *f = fopen(keylogfile, \"a\");\n    if (f != NULL) {\n      fprintf(f, \"%s \", label);\n      for (i = 0; i < 32; i++) {\n        fprintf(f, \"%02x\", client_random[i]);\n      }\n      fprintf(f, \" \");\n      for (i = 0; i < secretsz; i++) {\n        fprintf(f, \"%02x\", secret[i]);\n      }\n      fprintf(f, \"\\n\");\n      fclose(f);\n    } else {\n      MG_ERROR((\"Cannot open %s\", keylogfile));\n    }\n  }\n}\n#endif\n\n// for derived tls keys we need SHA256([0]*32)\nstatic uint8_t zeros[32] = {0};\nstatic uint8_t zeros_sha256_digest[32] = {\n    0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4,\n    0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b,\n    0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55};\n\n// helper to hexdump buffers inline\nstatic void mg_tls_hexdump(const char *msg, uint8_t *buf, size_t bufsz) {\n  MG_VERBOSE((\"%s: %M\", msg, mg_print_hex, bufsz, buf));\n}\n\n// helper utilities to parse ASN.1 DER\nstruct mg_der_tlv {\n  uint8_t type;\n  uint32_t len;\n  uint8_t *value;\n};\n\nstatic int mg_der_parse(uint8_t *der, size_t dersz, struct mg_der_tlv *tlv) {\n  size_t header_len = 2;\n  uint32_t len = dersz < 2 ? 0 : der[1];\n  if (dersz < 2) return -1;  // Invalid DER\n  tlv->type = der[0];\n  if (len > 0x7F) {  // long-form length\n    uint8_t len_bytes = len & 0x7F, i;\n    if (dersz < (size_t) (2 + len_bytes)) return -1;\n    len = 0;\n    for (i = 0; i < len_bytes; i++) {\n      len = (len << 8) | der[2 + i];\n    }\n    header_len += len_bytes;\n  }\n  if (dersz < header_len + len) return -1;\n  tlv->len = len;\n  tlv->value = der + header_len;\n  return (int) (header_len + len);\n}\n\nstatic int mg_der_next(struct mg_der_tlv *parent, struct mg_der_tlv *child) {\n  int consumed;\n  if (parent->len == 0) return 0;\n  consumed = mg_der_parse(parent->value, parent->len, child);\n  if (consumed < 0) return -1;\n  parent->value += consumed;\n  parent->len -= (uint32_t) consumed;\n  return 1;\n}\n\nstatic int mg_der_find_oid(struct mg_der_tlv *tlv, const uint8_t *oid,\n                           size_t oid_len, struct mg_der_tlv *found) {\n  struct mg_der_tlv parent, child;\n  parent = *tlv;\n  while (mg_der_next(&parent, &child) > 0) {\n    if (child.type == 0x06 && child.len == oid_len &&\n        memcmp(child.value, oid, oid_len) == 0) {\n      return mg_der_next(&parent, found);\n    } else if (child.type & 0x20) {\n      struct mg_der_tlv sub_parent = child;\n      if (mg_der_find_oid(&sub_parent, oid, oid_len, found)) return 1;\n    }\n  }\n  return 0;\n}\n\n#if 0\nstatic void mg_der_debug(struct mg_der_tlv *tlv, int depth) {\n  MG_DEBUG((\"> %.*sd=%d Type: 0x%02X, Length: %u\\n\", depth * 4, \" \", depth,\n            tlv->type, tlv->len));\n\n  if (tlv->type & 0x20) {  // Constructed: recurse into children\n    struct mg_der_tlv child;\n    struct mg_der_tlv parent = *tlv;\n    while (mg_der_next(&parent, &child) > 0) {\n      mg_der_debug(&child, depth + 1);\n    }\n  }\n}\n#endif\n\n// parse DER into a TLV record\nstatic int mg_der_to_tlv(uint8_t *der, size_t dersz, struct mg_der_tlv *tlv) {\n  if (dersz < 2) {\n    return -1;\n  }\n  tlv->type = der[0];\n  tlv->len = der[1];\n  tlv->value = der + 2;\n  if (tlv->len > 0x7f) {\n    uint32_t i, n = tlv->len - 0x80;\n    tlv->len = 0;\n    for (i = 0; i < n; i++) {\n      tlv->len = (tlv->len << 8) | (der[2 + i]);\n    }\n    tlv->value = der + 2 + n;\n  }\n  if (der + dersz < tlv->value + tlv->len) {\n    return -1;\n  }\n  return 0;\n}\n\n// Did we receive a full TLS record in the c->rtls buffer?\nstatic bool mg_tls_got_record(struct mg_connection *c) {\n  return c->rtls.len >= (size_t) TLS_RECHDR_SIZE &&\n         c->rtls.len >=\n             (size_t) (TLS_RECHDR_SIZE + MG_LOAD_BE16(c->rtls.buf + 3));\n}\n\n// Remove a single TLS record from the recv buffer\nstatic void mg_tls_drop_record(struct mg_connection *c) {\n  struct mg_iobuf *rio = &c->rtls;\n  uint16_t n = MG_LOAD_BE16(rio->buf + 3) + TLS_RECHDR_SIZE;\n  mg_iobuf_del(rio, 0, n);\n}\n\n// Remove a single TLS message from decrypted buffer, remove the wrapping\n// record if it was the last message within a record\nstatic void mg_tls_drop_message(struct mg_connection *c) {\n  uint32_t len;\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf = &c->rtls.buf[tls->recv_offset];\n  if (tls->recv_len == 0) return;\n  len = MG_LOAD_BE24(recv_buf + 1) + TLS_MSGHDR_SIZE;\n  if (tls->recv_len < len) {\n    mg_error(c, \"wrong size\");\n    return;\n  }\n  mg_sha256_update(&tls->sha256, recv_buf, len);\n  tls->recv_offset += len;\n  tls->recv_len -= len;\n  if (tls->recv_len == 0) {\n    mg_tls_drop_record(c);\n  }\n}\n\n// TLS1.3 secret derivation based on the key label\nstatic void mg_tls_derive_secret(const char *label, uint8_t *key, size_t keysz,\n                                 uint8_t *data, size_t datasz, uint8_t *hash,\n                                 size_t hashsz) {\n  size_t labelsz = strlen(label);\n  uint8_t secret[32];\n  uint8_t packed[256] = {0, (uint8_t) hashsz, (uint8_t) labelsz};\n  // TODO: assert lengths of label, key, data and hash\n  if (labelsz > 0) memmove(packed + 3, label, labelsz);\n  packed[3 + labelsz] = (uint8_t) datasz;\n  if (datasz > 0) memmove(packed + labelsz + 4, data, datasz);\n  packed[4 + labelsz + datasz] = 1;\n\n  mg_hmac_sha256(secret, key, keysz, packed, 5 + labelsz + datasz);\n  memmove(hash, secret, hashsz);\n}\n\n// at this point we have x25519 shared secret, we can generate a set of derived\n// handshake encryption keys\nstatic void mg_tls_generate_handshake_keys(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n\n  mg_sha256_ctx sha256;\n  uint8_t early_secret[32];\n  uint8_t pre_extract_secret[32];\n  uint8_t hello_hash[32];\n  uint8_t server_hs_secret[32];\n  uint8_t client_hs_secret[32];\n#if MG_ENABLE_CHACHA20\n  const size_t keysz = 32;\n#else\n  const size_t keysz = 16;\n#endif\n\n  mg_hmac_sha256(early_secret, NULL, 0, zeros, sizeof(zeros));\n  mg_tls_derive_secret(\"tls13 derived\", early_secret, 32, zeros_sha256_digest,\n                       32, pre_extract_secret, 32);\n  mg_hmac_sha256(tls->enc.handshake_secret, pre_extract_secret,\n                 sizeof(pre_extract_secret), tls->x25519_sec,\n                 sizeof(tls->x25519_sec));\n  mg_tls_hexdump(\"hs secret\", tls->enc.handshake_secret, 32);\n\n  // mg_sha256_final is not idempotent, need to copy sha256 context to calculate\n  // the digest\n  memmove(&sha256, &tls->sha256, sizeof(mg_sha256_ctx));\n  mg_sha256_final(hello_hash, &sha256);\n\n  mg_tls_hexdump(\"hello hash\", hello_hash, 32);\n  // derive keys needed for the rest of the handshake\n  mg_tls_derive_secret(\"tls13 s hs traffic\", tls->enc.handshake_secret, 32,\n                       hello_hash, 32, server_hs_secret, 32);\n  mg_tls_derive_secret(\"tls13 c hs traffic\", tls->enc.handshake_secret, 32,\n                       hello_hash, 32, client_hs_secret, 32);\n\n  mg_tls_derive_secret(\"tls13 key\", server_hs_secret, 32, NULL, 0,\n                       tls->enc.server_write_key, keysz);\n  mg_tls_derive_secret(\"tls13 iv\", server_hs_secret, 32, NULL, 0,\n                       tls->enc.server_write_iv, 12);\n  mg_tls_derive_secret(\"tls13 finished\", server_hs_secret, 32, NULL, 0,\n                       tls->enc.server_finished_key, 32);\n\n  mg_tls_derive_secret(\"tls13 key\", client_hs_secret, 32, NULL, 0,\n                       tls->enc.client_write_key, keysz);\n  mg_tls_derive_secret(\"tls13 iv\", client_hs_secret, 32, NULL, 0,\n                       tls->enc.client_write_iv, 12);\n  mg_tls_derive_secret(\"tls13 finished\", client_hs_secret, 32, NULL, 0,\n                       tls->enc.client_finished_key, 32);\n\n  mg_tls_hexdump(\"s hs traffic\", server_hs_secret, 32);\n  mg_tls_hexdump(\"s key\", tls->enc.server_write_key, keysz);\n  mg_tls_hexdump(\"s iv\", tls->enc.server_write_iv, 12);\n  mg_tls_hexdump(\"s finished\", tls->enc.server_finished_key, 32);\n  mg_tls_hexdump(\"c hs traffic\", client_hs_secret, 32);\n  mg_tls_hexdump(\"c key\", tls->enc.client_write_key, keysz);\n  mg_tls_hexdump(\"c iv\", tls->enc.client_write_iv, 12);\n  mg_tls_hexdump(\"c finished\", tls->enc.client_finished_key, 32);\n\n#ifdef MG_TLS_SSLKEYLOGFILE\n  mg_ssl_key_log(\"SERVER_HANDSHAKE_TRAFFIC_SECRET\", tls->random,\n                 server_hs_secret, 32);\n  mg_ssl_key_log(\"CLIENT_HANDSHAKE_TRAFFIC_SECRET\", tls->random,\n                 client_hs_secret, 32);\n#endif\n}\n\nstatic void mg_tls_generate_application_keys(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  uint8_t hash[32];\n  uint8_t premaster_secret[32];\n  uint8_t master_secret[32];\n  uint8_t server_secret[32];\n  uint8_t client_secret[32];\n#if MG_ENABLE_CHACHA20\n  const size_t keysz = 32;\n#else\n  const size_t keysz = 16;\n#endif\n\n  mg_sha256_ctx sha256;\n  memmove(&sha256, &tls->sha256, sizeof(mg_sha256_ctx));\n  mg_sha256_final(hash, &sha256);\n\n  mg_tls_derive_secret(\"tls13 derived\", tls->enc.handshake_secret, 32,\n                       zeros_sha256_digest, 32, premaster_secret, 32);\n  mg_hmac_sha256(master_secret, premaster_secret, 32, zeros, 32);\n\n  mg_tls_derive_secret(\"tls13 s ap traffic\", master_secret, 32, hash, 32,\n                       server_secret, 32);\n  mg_tls_derive_secret(\"tls13 key\", server_secret, 32, NULL, 0,\n                       tls->enc.server_write_key, keysz);\n  mg_tls_derive_secret(\"tls13 iv\", server_secret, 32, NULL, 0,\n                       tls->enc.server_write_iv, 12);\n  mg_tls_derive_secret(\"tls13 c ap traffic\", master_secret, 32, hash, 32,\n                       client_secret, 32);\n  mg_tls_derive_secret(\"tls13 key\", client_secret, 32, NULL, 0,\n                       tls->enc.client_write_key, keysz);\n  mg_tls_derive_secret(\"tls13 iv\", client_secret, 32, NULL, 0,\n                       tls->enc.client_write_iv, 12);\n\n  mg_tls_hexdump(\"s ap traffic\", server_secret, 32);\n  mg_tls_hexdump(\"s key\", tls->enc.server_write_key, keysz);\n  mg_tls_hexdump(\"s iv\", tls->enc.server_write_iv, 12);\n  mg_tls_hexdump(\"s finished\", tls->enc.server_finished_key, 32);\n  mg_tls_hexdump(\"c ap traffic\", client_secret, 32);\n  mg_tls_hexdump(\"c key\", tls->enc.client_write_key, keysz);\n  mg_tls_hexdump(\"c iv\", tls->enc.client_write_iv, 12);\n  mg_tls_hexdump(\"c finished\", tls->enc.client_finished_key, 32);\n  tls->enc.sseq = tls->enc.cseq = 0;\n\n#ifdef MG_TLS_SSLKEYLOGFILE\n  mg_ssl_key_log(\"SERVER_TRAFFIC_SECRET_0\", tls->random, server_secret, 32);\n  mg_ssl_key_log(\"CLIENT_TRAFFIC_SECRET_0\", tls->random, client_secret, 32);\n#endif\n}\n\n// AES GCM encryption of the message + put encoded data into the write buffer\nstatic bool mg_tls_encrypt(struct mg_connection *c, const uint8_t *msg,\n                           size_t msgsz, uint8_t msgtype) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  struct mg_iobuf *wio = &tls->send;\n  uint8_t *outmsg;\n  uint8_t *tag;\n  size_t encsz = msgsz + 16 + 1;\n  uint8_t hdr[5] = {MG_TLS_APP_DATA, 0x03, 0x03,\n                    (uint8_t) ((encsz >> 8) & 0xff), (uint8_t) (encsz & 0xff)};\n  uint8_t associated_data[5] = {MG_TLS_APP_DATA, 0x03, 0x03,\n                                (uint8_t) ((encsz >> 8) & 0xff),\n                                (uint8_t) (encsz & 0xff)};\n  uint8_t nonce[12];\n\n  uint32_t seq = c->is_client ? tls->enc.cseq : tls->enc.sseq;\n  uint8_t *key =\n      c->is_client ? tls->enc.client_write_key : tls->enc.server_write_key;\n  uint8_t *iv =\n      c->is_client ? tls->enc.client_write_iv : tls->enc.server_write_iv;\n\n  if (msgsz > 16384) {\n    MG_ERROR((\"msg longer than recordsz\"));\n    return false;\n  }\n\n#if MG_ENABLE_CHACHA20\n#else\n  mg_gcm_initialize();\n#endif\n\n  memmove(nonce, iv, sizeof(nonce));\n  nonce[8] ^= (uint8_t) ((seq >> 24) & 255U);\n  nonce[9] ^= (uint8_t) ((seq >> 16) & 255U);\n  nonce[10] ^= (uint8_t) ((seq >> 8) & 255U);\n  nonce[11] ^= (uint8_t) ((seq) & 255U);\n\n  if (mg_iobuf_add(wio, wio->len, hdr, sizeof(hdr)) == 0 ||\n      !mg_iobuf_resize(wio, wio->len + encsz))\n    return false;\n  outmsg = wio->buf + wio->len;\n  tag = wio->buf + wio->len + msgsz + 1;\n  memmove(outmsg, msg, msgsz);\n  outmsg[msgsz] = msgtype;\n#if MG_ENABLE_CHACHA20\n  (void) tag;  // tag is only used in aes gcm\n  {\n    size_t n;\n    uint8_t *enc = (uint8_t *) mg_calloc(1, msgsz + 256 + 1);\n    if (enc == NULL) return false;\n    n = mg_chacha20_poly1305_encrypt(enc, key, nonce, associated_data,\n                                     sizeof(associated_data), outmsg,\n                                     msgsz + 1);\n    memmove(outmsg, enc, n);\n    mg_free(enc);\n  }\n#else\n  mg_aes_gcm_encrypt(outmsg, outmsg, msgsz + 1, key, 16, nonce, sizeof(nonce),\n                     associated_data, sizeof(associated_data), tag, 16);\n#endif\n  c->is_client ? tls->enc.cseq++ : tls->enc.sseq++;\n  wio->len += encsz;\n  return true;\n}\n\n// read an encrypted record, decrypt it in place\nstatic int mg_tls_recv_record(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  struct mg_iobuf *rio = &c->rtls;\n  uint16_t msgsz;\n  uint8_t *msg;\n  uint8_t nonce[12];\n  int r;\n\n  uint32_t seq = c->is_client ? tls->enc.sseq : tls->enc.cseq;\n  uint8_t *key =\n      c->is_client ? tls->enc.server_write_key : tls->enc.client_write_key;\n  uint8_t *iv =\n      c->is_client ? tls->enc.server_write_iv : tls->enc.client_write_iv;\n\n  if (tls->recv_len > 0) {\n    return 0; /* some data from previous record is still present */\n  }\n  for (;;) {\n    if (!mg_tls_got_record(c)) {\n      return MG_IO_WAIT;\n    }\n    if (rio->buf[0] == MG_TLS_APP_DATA) {\n      break;\n    } else if (rio->buf[0] == MG_TLS_CHANGE_CIPHER) {  // skip CCS\n      mg_tls_drop_record(c);\n    } else if (rio->buf[0] == MG_TLS_ALERT) {  // Skip Alerts\n      if (rio->len >= 7) {\n        uint8_t level = rio->buf[5], desc = rio->buf[6];\n        MG_INFO((\"TLS ALERT received: level=%d, desc=%d (%s)\", level, desc,\n                 desc == 0    ? \"close_notify\"\n                 : desc == 10 ? \"unexpected_message\"\n                 : desc == 20 ? \"bad_record_mac\"\n                 : desc == 21 ? \"decryption_failed\"\n                 : desc == 40 ? \"handshake_failure\"\n                 : desc == 42 ? \"bad_certificate\"\n                 : desc == 43 ? \"unsupported_certificate\"\n                              : \"unknown\"));\n      } else {\n        MG_INFO((\"TLS ALERT packet received (short)\"));\n      }\n      mg_tls_drop_record(c);\n    } else {\n      mg_error(c, \"unexpected packet\");\n      return -1;\n    }\n  }\n\n  msgsz = MG_LOAD_BE16(rio->buf + 3);\n  msg = rio->buf + 5;\n  if (msgsz < 16) {\n    mg_error(c, \"wrong size\");\n    return -1;\n  }\n\n  memmove(nonce, iv, sizeof(nonce));\n  nonce[8] ^= (uint8_t) ((seq >> 24) & 255U);\n  nonce[9] ^= (uint8_t) ((seq >> 16) & 255U);\n  nonce[10] ^= (uint8_t) ((seq >> 8) & 255U);\n  nonce[11] ^= (uint8_t) ((seq) & 255U);\n#if MG_ENABLE_CHACHA20\n  {\n    uint8_t *dec = (uint8_t *) mg_calloc(1, msgsz);\n    size_t n;\n    if (dec == NULL) {\n      mg_error(c, \"TLS OOM\");\n      return -1;\n    }\n    n = mg_chacha20_poly1305_decrypt(dec, key, nonce, msg, msgsz);\n    if (n == (size_t) -1) {\n      mg_error(c, \"decryption error\");\n      return -1;\n    }\n    memmove(msg, dec, n);\n    mg_free(dec);\n  }\n#else\n  mg_gcm_initialize();\n  mg_aes_gcm_decrypt(msg, msg, msgsz - 16, key, 16, nonce, sizeof(nonce));\n#endif\n\n  r = msgsz - 16 - 1;\n  tls->content_type = msg[msgsz - 16 - 1];\n  tls->recv_offset = (size_t) msg - (size_t) rio->buf;\n  tls->recv_len = (size_t) msgsz - 16 - 1;\n  c->is_client ? tls->enc.sseq++ : tls->enc.cseq++;\n  return r;\n}\n\nstatic void mg_tls_calc_cert_verify_hash(struct mg_connection *c,\n                                         uint8_t hash[32], bool is_client) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  uint8_t sig_content[130];\n  mg_sha256_ctx sha256;\n\n  memset(sig_content, 0x20, 64);\n  if (is_client) {\n    uint8_t client_context[34] = \"TLS 1.3, client CertificateVerify\";\n    memcpy(sig_content + 64, client_context, sizeof(client_context));\n  } else {\n    uint8_t server_context[34] = \"TLS 1.3, server CertificateVerify\";\n    memcpy(sig_content + 64, server_context, sizeof(server_context));\n  }\n\n  memmove(&sha256, &tls->sha256, sizeof(mg_sha256_ctx));\n  mg_sha256_final(sig_content + 98, &sha256);\n\n  mg_sha256_init(&sha256);\n  mg_sha256_update(&sha256, sig_content, sizeof(sig_content));\n  mg_sha256_final(hash, &sha256);\n}\n\n// read and parse ClientHello record\nstatic int mg_tls_server_recv_hello(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  struct mg_iobuf *rio = &c->rtls;\n  uint8_t session_id_len;\n  uint16_t j;\n  uint16_t cipher_suites_len;\n  uint16_t ext_len;\n  uint8_t *ext;\n  uint16_t msgsz;\n\n  if (!mg_tls_got_record(c)) {\n    return MG_IO_WAIT;\n  }\n  if (rio->buf[0] != MG_TLS_HANDSHAKE || rio->buf[5] != MG_TLS_CLIENT_HELLO) {\n    mg_error(c, \"not a client hello packet\");\n    return -1;\n  }\n  if (rio->len < 50) goto fail;\n  msgsz = MG_LOAD_BE16(rio->buf + 3);\n  if (((uint32_t) msgsz + 4) > rio->len) goto fail;\n  mg_sha256_update(&tls->sha256, rio->buf + 5, msgsz);\n  // store client random\n  memmove(tls->random, rio->buf + 11, sizeof(tls->random));\n  // store session_id\n  session_id_len = rio->buf[43];\n  if (session_id_len == sizeof(tls->session_id)) {\n    memmove(tls->session_id, rio->buf + 44, session_id_len);\n  } else if (session_id_len != 0) {\n    MG_INFO((\"bad session id len\"));\n  }\n  cipher_suites_len = MG_LOAD_BE16(rio->buf + 44 + session_id_len);\n  if (((uint32_t) cipher_suites_len + 46 + session_id_len) > rio->len)\n    goto fail;\n  ext_len = MG_LOAD_BE16(rio->buf + 48 + session_id_len + cipher_suites_len);\n  ext = rio->buf + 50 + session_id_len + cipher_suites_len;\n  if (((unsigned char *) ext + ext_len) > (rio->buf + rio->len)) goto fail;\n  for (j = 0; j < ext_len;) {\n    uint16_t k;\n    uint16_t key_exchange_len;\n    uint8_t *key_exchange;\n    uint16_t n = MG_LOAD_BE16(ext + j + 2);\n    if (((uint32_t) n + j + 4) > ext_len) goto fail;\n    if (MG_LOAD_BE16(ext + j) != 0x0033) {  // not a key share extension, ignore\n      j += (uint16_t) (n + 4);\n      continue;\n    }\n    key_exchange_len = MG_LOAD_BE16(ext + j + 4);\n    key_exchange = ext + j + 6;\n    if (((size_t) key_exchange_len +\n         ((size_t) key_exchange - (size_t) rio->buf)) > rio->len)\n      goto fail;\n    for (k = 0; k < key_exchange_len;) {\n      uint16_t m = MG_LOAD_BE16(key_exchange + k + 2);\n      if (((uint32_t) m + k + 4) > key_exchange_len) goto fail;\n      if (m == 32 && key_exchange[k] == 0x00 && key_exchange[k + 1] == 0x1d) {\n        memmove(tls->x25519_cli, key_exchange + k + 4, m);\n        mg_tls_drop_record(c);\n        return 0;\n      }\n      k += (uint16_t) (m + 4);\n    }\n    j += (uint16_t) (n + 4);\n  }\nfail:\n  mg_error(c, \"bad client hello\");\n  return -1;\n}\n\n#define PLACEHOLDER_8B 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'\n#define PLACEHOLDER_16B PLACEHOLDER_8B, PLACEHOLDER_8B\n#define PLACEHOLDER_32B PLACEHOLDER_16B, PLACEHOLDER_16B\n\n// put ServerHello record into wio buffer\nstatic bool mg_tls_server_send_hello(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  struct mg_iobuf *wio = &tls->send;\n\n  // clang-format off\n  uint8_t msg_server_hello[122] = {\n      // server hello, tls 1.2\n      0x02, 0x00, 0x00, 0x76, 0x03, 0x03,\n      // random (32 bytes)\n      PLACEHOLDER_32B,\n      // session ID length + session ID (32 bytes)\n      0x20, PLACEHOLDER_32B,\n#if MG_ENABLE_CHACHA20\n      // TLS_CHACHA20_POLY1305_SHA256 + no compression\n      0x13, 0x03, 0x00,\n#else\n      // TLS_AES_128_GCM_SHA256 + no compression\n      0x13, 0x01, 0x00,\n#endif\n      // extensions + keyshare\n      0x00, 0x2e, 0x00, 0x33, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x20,\n      // x25519 keyshare\n      PLACEHOLDER_32B,\n      // supported versions (tls1.3 == 0x304)\n      0x00, 0x2b, 0x00, 0x02, 0x03, 0x04};\n  // clang-format on\n\n  // calculate keyshare\n  uint8_t x25519_pub[X25519_BYTES];\n  uint8_t x25519_prv[X25519_BYTES];\n  if (!mg_random(x25519_prv, sizeof(x25519_prv))) mg_error(c, \"RNG\");\n  mg_tls_x25519(x25519_pub, x25519_prv, X25519_BASE_POINT, 1);\n  mg_tls_x25519(tls->x25519_sec, x25519_prv, tls->x25519_cli, 1);\n  mg_tls_hexdump(\"s x25519 sec\", tls->x25519_sec, sizeof(tls->x25519_sec));\n\n  // fill in the gaps: random + session ID + keyshare\n  memmove(msg_server_hello + 6, tls->random, sizeof(tls->random));\n  memmove(msg_server_hello + 39, tls->session_id, sizeof(tls->session_id));\n  memmove(msg_server_hello + 84, x25519_pub, sizeof(x25519_pub));\n\n  // server hello message\n  if (mg_iobuf_add(wio, wio->len, \"\\x16\\x03\\x03\\x00\\x7a\", 5) == 0 ||\n      mg_iobuf_add(wio, wio->len, msg_server_hello, sizeof(msg_server_hello)) ==\n          0)\n    return false;\n  mg_sha256_update(&tls->sha256, msg_server_hello, sizeof(msg_server_hello));\n\n  // change cipher message\n  if (mg_iobuf_add(wio, wio->len, \"\\x14\\x03\\x03\\x00\\x01\\x01\", 6) == 0)\n    return false;\n  return true;\n}\n\nstatic bool mg_tls_server_send_ext(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  // server extensions\n  uint8_t ext[6] = {0x08, 0, 0, 2, 0, 0};\n  mg_sha256_update(&tls->sha256, ext, sizeof(ext));\n  return mg_tls_encrypt(c, ext, sizeof(ext), MG_TLS_HANDSHAKE);\n}\n\n// signature algorithms we actually support:\n// rsa_pkcs1_sha256, rsa_pss_rsae_sha256 and ecdsa_secp256r1_sha256\nstatic const uint8_t secp256r1_sig_algs[12] = {\n    0x00, 0x0d, 0x00, 0x08, 0x00, 0x06, 0x04, 0x03, 0x08, 0x04, 0x04, 0x01};\n\nstatic bool mg_tls_server_send_cert_request(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  uint8_t req[13 + sizeof(secp256r1_sig_algs)];\n  req[0] = MG_TLS_CERTIFICATE_REQUEST;  // handshake header\n  MG_STORE_BE24(req + 1, 9 + sizeof(secp256r1_sig_algs));\n  req[4] = 0;                                              // context length\n  MG_STORE_BE16(req + 5, 6 + sizeof(secp256r1_sig_algs));  // extensions length\n  MG_STORE_BE16(req + 7, 13);  // \"signature algorithms\"\n  MG_STORE_BE16(req + 9, 2 + sizeof(secp256r1_sig_algs));  // length\n  MG_STORE_BE16(\n      req + 11,\n      sizeof(secp256r1_sig_algs));  // signature hash algorithms length\n  memcpy(req + 13, (uint8_t *) secp256r1_sig_algs, sizeof(secp256r1_sig_algs));\n  mg_sha256_update(&tls->sha256, req, sizeof(req));\n  return mg_tls_encrypt(c, req, sizeof(req), MG_TLS_HANDSHAKE);\n}\n\nstatic bool mg_tls_send_cert(struct mg_connection *c, bool is_client) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  int send_ca = !is_client && tls->ca_der.len > 0;\n  // DER certificate + CA (server optional)\n  size_t i, offset, total_size = tls->cert_der.len + 5;\n  uint8_t *cert;\n  bool res = false;\n  for (i = 1; i < tls->chain_len; i++) {\n    total_size += tls->chain_der[i].len + 5;\n  }\n  if (send_ca) {\n    total_size += tls->ca_der.len + 5;\n  }\n  cert = (uint8_t *) mg_calloc(1, 13 + total_size);\n  if (cert == NULL) return res;\n  cert[0] = MG_TLS_CERTIFICATE;  // handshake header\n  MG_STORE_BE24(cert + 1, total_size + 4);\n  cert[4] = 0;                          // request context\n  MG_STORE_BE24(cert + 5, total_size);  // 3 bytes: cert (s) length\n  offset = 8;\n  MG_STORE_BE24(cert + offset, tls->cert_der.len);  // 3 bytes: first cert len\n  offset += 3;\n  // bytes 11+ are certificate in DER format\n  memmove(cert + offset, tls->cert_der.buf, tls->cert_der.len);\n  offset += tls->cert_der.len;\n  MG_STORE_BE16(cert + offset, 0);  // certificate extensions (none)\n  offset += 2;\n  for (i = 1; i < tls->chain_len; i++) {\n    MG_STORE_BE24(cert + offset, tls->chain_der[i].len);\n    offset += 3;\n    memmove(cert + offset, tls->chain_der[i].buf, tls->chain_der[i].len);\n    offset += tls->chain_der[i].len;\n    MG_STORE_BE16(cert + offset, 0);  // certificate extensions (none)\n    offset += 2;\n  }\n  if (send_ca) {\n    MG_STORE_BE24(cert + offset, tls->ca_der.len);  // 3 bytes: CA cert length\n    offset += 3;\n    memmove(cert + offset, tls->ca_der.buf,\n            tls->ca_der.len);  // CA cert data\n    offset += tls->ca_der.len;\n    MG_STORE_BE16(cert + offset, 0);  // certificate extensions (none)\n    offset += 2;\n  }\n  mg_sha256_update(&tls->sha256, cert, offset);\n  res = mg_tls_encrypt(c, cert, offset, MG_TLS_HANDSHAKE);\n  mg_free(cert);\n  return res;\n}\n\n// type adapter between uECC hash context and our sha256 implementation\ntypedef struct SHA256_HashContext {\n  MG_UECC_HashContext uECC;\n  mg_sha256_ctx ctx;\n} SHA256_HashContext;\n\nstatic void init_SHA256(const MG_UECC_HashContext *base) {\n  SHA256_HashContext *c = (SHA256_HashContext *) base;\n  mg_sha256_init(&c->ctx);\n}\n\nstatic void update_SHA256(const MG_UECC_HashContext *base,\n                          const uint8_t *message, unsigned message_size) {\n  SHA256_HashContext *c = (SHA256_HashContext *) base;\n  mg_sha256_update(&c->ctx, message, message_size);\n}\nstatic void finish_SHA256(const MG_UECC_HashContext *base,\n                          uint8_t *hash_result) {\n  SHA256_HashContext *c = (SHA256_HashContext *) base;\n  mg_sha256_final(hash_result, &c->ctx);\n}\n\nstatic void mg_tls_mgf1(uint8_t *mask, size_t mask_len, const uint8_t *seed,\n                        size_t seed_len) {\n  uint32_t counter = 0;\n  size_t chunk, chunk_len, generated = 0;\n  while (generated < mask_len) {\n    mg_sha256_ctx ctx;\n    uint8_t digest[32];\n    uint8_t ctr[4];\n    ctr[0] = (uint8_t) (counter >> 24);\n    ctr[1] = (uint8_t) (counter >> 16);\n    ctr[2] = (uint8_t) (counter >> 8);\n    ctr[3] = (uint8_t) counter;\n    mg_sha256_init(&ctx);\n    mg_sha256_update(&ctx, seed, seed_len);\n    mg_sha256_update(&ctx, ctr, sizeof(ctr));\n    mg_sha256_final(digest, &ctx);\n    chunk_len = mask_len - generated;\n    chunk = (chunk_len < sizeof(digest) ? chunk_len : sizeof(digest));\n    memmove(mask + generated, digest, chunk);\n    generated += chunk;\n    counter++;\n  }\n}\n\nstatic unsigned int mg_tls_rsa_bits(const struct mg_str *n) {\n  size_t i = 0;\n  unsigned int bits = 0;\n  while (i < n->len && n->buf[i] == 0) i++;\n  if (i == n->len) return 0;\n  bits = (unsigned int) ((n->len - i) * 8);\n  {\n    uint8_t byte = (uint8_t) n->buf[i];\n    while ((byte & 0x80U) == 0) {\n      bits--;\n      byte = (uint8_t) (byte << 1);\n    }\n  }\n  return bits;\n}\n\nstatic bool mg_tls_pss_encode(const uint8_t *hash, size_t hashlen,\n                              const struct mg_str *n, uint8_t *em) {\n  size_t emlen = n->len, saltlen = hashlen, dblen, pslen, i;\n  uint8_t salt[64];   // Max salt size for any reasonable hash\n  uint8_t m[136];     // 8 + max hash (64) + max salt (64) = 136\n  uint8_t H[64];      // Max hash size\n  uint8_t DB[512];    // Max for 4096-bit RSA\n  uint8_t mask[512];  // Max for 4096-bit RSA\n  mg_sha256_ctx ctx;\n\n  // Check bounds\n  if (saltlen > sizeof(salt) || (8 + hashlen + saltlen) > sizeof(m) ||\n      hashlen > sizeof(H) || emlen > sizeof(DB)) {\n    MG_ERROR((\"RSA key too large for static buffers\"));\n    return false;\n  }\n  if (emlen < hashlen + saltlen + 2) {\n    return false;\n  }\n  if (!mg_random(salt, saltlen)) {\n    return false;\n  }\n  MG_VERBOSE((\"PSS salt: %M\", mg_print_hex, saltlen, salt));\n\n  // Build m = 8 zero bytes || hash || salt\n  memset(m, 0, 8);\n  memcpy(m + 8, hash, hashlen);\n  memcpy(m + 8 + hashlen, salt, saltlen);\n  mg_sha256_init(&ctx);\n  mg_sha256_update(&ctx, m, 8 + hashlen + saltlen);\n  mg_sha256_final(H, &ctx);\n  MG_VERBOSE((\"PSS H: %M\", mg_print_hex, hashlen, H));\n\n  dblen = emlen - hashlen - 1;\n  pslen = emlen - hashlen - saltlen - 2;\n\n  // Build DB = PS || 0x01 || salt\n  memset(DB, 0, pslen);\n  DB[pslen] = 0x01;\n  memcpy(DB + pslen + 1, salt, saltlen);\n\n  // Generate mask and apply to DB\n  mg_tls_mgf1(mask, dblen, H, hashlen);\n  for (i = 0; i < dblen; i++) DB[i] ^= mask[i];\n\n  {\n    // PSS standard: emBits = modulus_bit_length - 1\n    unsigned rsa_bits = mg_tls_rsa_bits(n);\n    unsigned embits = rsa_bits - 1;\n    unsigned unused = (unsigned) (8 * emlen - embits);\n    MG_VERBOSE((\"RSA modulus bits: %u, emBits: %u, emlen: %zu, unused: %u\",\n                rsa_bits, embits, emlen, unused));\n    if (unused > 0 && unused < 8) {\n      uint8_t mask_byte = (uint8_t) (0xff >> unused);\n      MG_VERBOSE((\"Applying mask 0x%02x to first byte (was 0x%02x)\", mask_byte,\n                  DB[0]));\n      DB[0] &= mask_byte;\n      MG_VERBOSE((\"First byte after mask: 0x%02x\", DB[0]));\n    }\n  }\n\n  // Build final em = maskedDB || H || 0xbc\n  memcpy(em, DB, dblen);\n  memcpy(em + dblen, H, hashlen);\n  em[emlen - 1] = 0xbc;\n  return true;\n}\n\nstatic bool mg_tls_rsa_sign(struct tls_data *tls, const uint8_t *em,\n                            size_t emlen, uint8_t *sig) {\n  size_t nlen;\n  int crt_result;\n#if MG_TLS_RSA_USE_CRT\n  // RSA CRT (Chinese Remainder Theorem) optimization:\n  // s1 = em^dP mod p\n  // s2 = em^dQ mod q\n  // h = qInv * (s1 - s2) mod p\n  // s = s2 + h * q\n\n  if (tls->rsa.p.len == 0 || tls->rsa.q.len == 0 || tls->rsa.dP.len == 0 ||\n      tls->rsa.dQ.len == 0 || tls->rsa.qInv.len == 0) {\n    MG_ERROR((\"CRT parameters missing, cannot use CRT optimization\"));\n    return false;\n  }\n\n  MG_VERBOSE((\"Using RSA-CRT optimization\"));\n\n  nlen = tls->rsa.n.len;\n\n  crt_result = mg_rsa_crt_sign(\n      em, emlen, (const uint8_t *) tls->rsa.dP.buf, tls->rsa.dP.len,\n      (const uint8_t *) tls->rsa.dQ.buf, tls->rsa.dQ.len,\n      (const uint8_t *) tls->rsa.p.buf, tls->rsa.p.len,\n      (const uint8_t *) tls->rsa.q.buf, tls->rsa.q.len,\n      (const uint8_t *) tls->rsa.qInv.buf, tls->rsa.qInv.len, sig, nlen);\n\n  if (crt_result == 0) {\n    MG_VERBOSE((\"CRT signature successful (first 4 bytes): %02x %02x %02x %02x\",\n                sig[0], sig[1], sig[2], sig[3]));\n    MG_VERBOSE((\"CRT signature successful (last 4 bytes): %02x %02x %02x %02x\",\n                sig[nlen - 4], sig[nlen - 3], sig[nlen - 2], sig[nlen - 1]));\n    return true;\n  } else {\n    MG_ERROR((\"CRT signing failed\"));\n    return false;\n  }\n#else\n  int ret;\n  // Standard RSA: s = em^d mod n\n  memset(sig, 0, tls->rsa.n.len);\n  ret = mg_rsa_mod_pow((const uint8_t *) tls->rsa.n.buf, tls->rsa.n.len,\n                       (const uint8_t *) tls->rsa.d.buf, tls->rsa.d.len, em,\n                       emlen, sig, tls->rsa.n.len);\n  if (ret == 0) {\n    MG_VERBOSE((\"RSA signature first 4 bytes: %02x %02x %02x %02x\", sig[0],\n                sig[1], sig[2], sig[3]));\n    MG_VERBOSE((\"RSA signature last 4 bytes: %02x %02x %02x %02x\",\n                sig[tls->rsa.n.len - 4], sig[tls->rsa.n.len - 3],\n                sig[tls->rsa.n.len - 2], sig[tls->rsa.n.len - 1]));\n  }\n  return ret == 0;\n#endif\n}\n\nstatic bool mg_tls_send_cert_verify(struct mg_connection *c, bool is_client) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  uint8_t hash[32] = {0};\n\n  mg_tls_calc_cert_verify_hash(c, (uint8_t *) hash, is_client);\n\n  if (tls->rsa.n.len > 0 && tls->rsa.d.len > 0) {\n    // RSA certificate verify packet\n    size_t emlen = tls->rsa.n.len;\n    size_t verifysz = 8U + emlen;\n    uint8_t em[512];      // Max for 4096-bit RSA\n    uint8_t verify[520];  // 8 + 512 max\n\n    // Check bounds\n    if (emlen > sizeof(em) || verifysz > sizeof(verify)) {\n      MG_ERROR((\"RSA key too large for static buffers\"));\n      return false;\n    }\n\n    if (!mg_tls_pss_encode(hash, sizeof(hash), &tls->rsa.n, em)) {\n      MG_ERROR((\"Failed PSS encode\"));\n      return false;\n    }\n\n    // Validate PSS encoded message format\n    if (em[emlen - 1] != 0xbc) {\n      MG_ERROR((\"Invalid PSS encoding: last byte is 0x%02x, expected 0xbc\",\n                em[emlen - 1]));\n      return false;\n    }\n\n    // Build verify packet header, then sign directly into the packet\n    verify[0] = 0x0f;\n    MG_STORE_BE24(verify + 1, emlen + 4);\n    MG_STORE_BE16(verify + 4, 0x0804);\n    MG_STORE_BE16(verify + 6, emlen);\n\n    // Sign directly into the verify buffer (verify + 8 = signature location)\n    memset(verify + 8, 0, emlen);  // Initialize signature area\n    if (!mg_tls_rsa_sign(tls, em, emlen, verify + 8)) {\n      MG_ERROR((\"Failed RSA sign\"));\n      return false;\n    }\n\n    MG_VERBOSE(\n        (\"PSS EM first 4: %02x %02x %02x %02x\", em[0], em[1], em[2], em[3]));\n    MG_VERBOSE((\"PSS EM last 4: %02x %02x %02x %02x\", em[emlen - 4],\n                em[emlen - 3], em[emlen - 2], em[emlen - 1]));\n\n    mg_sha256_update(&tls->sha256, verify, verifysz);\n    return mg_tls_encrypt(c, verify, verifysz, MG_TLS_HANDSHAKE);\n  } else {\n    // EC certificate verify packet\n    uint8_t verify[82] = {0x0f, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00};\n    uint8_t tmp[2 * 32 + 64] = {0};\n    struct SHA256_HashContext ctx = {\n        {&init_SHA256, &update_SHA256, &finish_SHA256, 64, 32, tmp},\n        {{0}, 0, 0, {0}}};\n    size_t sigsz, verifysz = 0;\n    int neg1, neg2;\n    uint8_t sig[64] = {0};\n    mg_uecc_sign_deterministic(tls->ec_key, hash, sizeof(hash), &ctx.uECC, sig,\n                               mg_uecc_secp256r1());\n\n    neg1 = !!(sig[0] & 0x80);\n    neg2 = !!(sig[32] & 0x80);\n    verify[8] = 0x30;  // ASN.1 SEQUENCE\n    verify[9] = (uint8_t) (68 + neg1 + neg2);\n    verify[10] = 0x02;  // ASN.1 INTEGER\n    verify[11] = (uint8_t) (32 + neg1);\n    memmove(verify + 12 + neg1, sig, 32);\n    verify[12 + 32 + neg1] = 0x02;  // ASN.1 INTEGER\n    verify[13 + 32 + neg1] = (uint8_t) (32 + neg2);\n    memmove(verify + 14 + 32 + neg1 + neg2, sig + 32, 32);\n\n    sigsz = (size_t) (70 + neg1 + neg2);\n    verifysz = 8U + sigsz;\n    verify[3] = (uint8_t) (sigsz + 4);\n    verify[7] = (uint8_t) sigsz;\n\n    mg_sha256_update(&tls->sha256, verify, verifysz);\n    return mg_tls_encrypt(c, verify, verifysz, MG_TLS_HANDSHAKE);\n  }\n}\n\nstatic bool mg_tls_server_send_finish(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  mg_sha256_ctx sha256;\n  uint8_t hash[32];\n  uint8_t finish[36] = {0x14, 0, 0, 32};\n  memmove(&sha256, &tls->sha256, sizeof(mg_sha256_ctx));\n  mg_sha256_final(hash, &sha256);\n  mg_hmac_sha256(finish + 4, tls->enc.server_finished_key, 32, hash, 32);\n  if (!mg_tls_encrypt(c, finish, sizeof(finish), MG_TLS_HANDSHAKE))\n    return false;\n  mg_sha256_update(&tls->sha256, finish, sizeof(finish));\n  return true;\n}\n\nstatic int mg_tls_server_recv_finish(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf;\n  // we have to backup sha256 value to restore it later, since Finished record\n  // is exceptional and is not supposed to be added to the rolling hash\n  // calculation.\n  mg_sha256_ctx sha256 = tls->sha256;\n  if (mg_tls_recv_record(c) < 0) {\n    return -1;\n  }\n  recv_buf = &c->rtls.buf[tls->recv_offset];\n  if (recv_buf[0] != MG_TLS_FINISHED) {\n    mg_error(c, \"expected Finish but got msg 0x%02x\", recv_buf[0]);\n    return -1;\n  }\n  mg_tls_drop_message(c);\n\n  // restore hash\n  tls->sha256 = sha256;\n  return 0;\n}\n\nstatic bool mg_tls_client_send_hello(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  struct mg_iobuf *wio = &tls->send;\n\n  uint8_t x25519_pub[X25519_BYTES];\n\n  // - \"signature algorithms we actually support\", see above\n  //   uint8_t secp256r1_sig_algs[]\n  // - all popular signature algorithms (if we don't care about verification)\n  uint8_t all_sig_algs[34] = {\n      0x00, 0x0d, 0x00, 0x1e, 0x00, 0x1c, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03,\n      0x08, 0x07, 0x08, 0x08, 0x08, 0x09, 0x08, 0x0a, 0x08, 0x0b, 0x08, 0x04,\n      0x08, 0x05, 0x08, 0x06, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01};\n  uint8_t server_name_ext[9] = {0x00, 0x00, 0x00, 0xfe, 0x00,\n                                0xfe, 0x00, 0x00, 0xfe};\n\n  // clang-format off\n  uint8_t msg_client_hello[145] = {\n      // TLS Client Hello header reported as TLS1.2 (5)\n      0x16, 0x03, 0x03, 0x00, 0xfe,\n      // client hello, tls 1.2 (6)\n      0x01, 0x00, 0x00, 0x8c, 0x03, 0x03,\n      // random (32 bytes)\n      PLACEHOLDER_32B,\n      // session ID length + session ID (32 bytes)\n      0x20, PLACEHOLDER_32B, 0x00,\n      0x02,  // size = 2 bytes\n#if MG_ENABLE_CHACHA20\n      // TLS_CHACHA20_POLY1305_SHA256\n      0x13, 0x03,\n#else\n      // TLS_AES_128_GCM_SHA256\n      0x13, 0x01,\n#endif\n      // no compression\n      0x01, 0x00,\n      // extensions + keyshare\n      0x00, 0xfe,\n      // x25519 keyshare\n      0x00, 0x33, 0x00, 0x26, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x20,\n      PLACEHOLDER_32B,\n      // supported groups (x25519)\n      0x00, 0x0a, 0x00, 0x04, 0x00, 0x02, 0x00, 0x1d,\n      // supported versions (tls1.3 == 0x304)\n      0x00, 0x2b, 0x00, 0x03, 0x02, 0x03, 0x04,\n      // session ticket (none)\n      0x00, 0x23, 0x00, 0x00, // 144 bytes till here\n\t};\n  // clang-format on\n  const char *hostname = tls->hostname;\n  size_t hostnamesz = strlen(tls->hostname);\n  size_t hostname_extsz = hostnamesz ? hostnamesz + 9 : 0;\n  uint8_t *sig_alg =\n      tls->skip_verification ? all_sig_algs : (uint8_t *) secp256r1_sig_algs;\n  size_t sig_alg_sz = tls->skip_verification ? sizeof(all_sig_algs)\n                                             : sizeof(secp256r1_sig_algs);\n\n  // patch ClientHello with correct hostname ext length (if any)\n  MG_STORE_BE16(msg_client_hello + 3,\n                hostname_extsz + 183 - 9 - 34 + sig_alg_sz);\n  MG_STORE_BE16(msg_client_hello + 7,\n                hostname_extsz + 179 - 9 - 34 + sig_alg_sz);\n  MG_STORE_BE16(msg_client_hello + 82,\n                hostname_extsz + 104 - 9 - 34 + sig_alg_sz);\n\n  if (hostnamesz > 0) {\n    MG_STORE_BE16(server_name_ext + 2, hostnamesz + 5);\n    MG_STORE_BE16(server_name_ext + 4, hostnamesz + 3);\n    MG_STORE_BE16(server_name_ext + 7, hostnamesz);\n  }\n\n  // calculate keyshare\n  if (!mg_random(tls->x25519_cli, sizeof(tls->x25519_cli))) mg_error(c, \"RNG\");\n  mg_tls_x25519(x25519_pub, tls->x25519_cli, X25519_BASE_POINT, 1);\n\n  // fill in the gaps: random + session ID + keyshare\n  if (!mg_random(tls->session_id, sizeof(tls->session_id))) mg_error(c, \"RNG\");\n  if (!mg_random(tls->random, sizeof(tls->random))) mg_error(c, \"RNG\");\n  memmove(msg_client_hello + 11, tls->random, sizeof(tls->random));\n  memmove(msg_client_hello + 44, tls->session_id, sizeof(tls->session_id));\n  memmove(msg_client_hello + 94, x25519_pub, sizeof(x25519_pub));\n\n  // client hello message\n  if (mg_iobuf_add(wio, wio->len, msg_client_hello, sizeof(msg_client_hello)) ==\n      0)\n    return false;\n  mg_sha256_update(&tls->sha256, msg_client_hello + 5,\n                   sizeof(msg_client_hello) - 5);\n  if (mg_iobuf_add(wio, wio->len, sig_alg, sig_alg_sz) == 0) return false;\n  mg_sha256_update(&tls->sha256, sig_alg, sig_alg_sz);\n  if (hostnamesz > 0) {\n    if (mg_iobuf_add(wio, wio->len, server_name_ext, sizeof(server_name_ext)) ==\n            0 ||\n        mg_iobuf_add(wio, wio->len, hostname, hostnamesz) == 0)\n      return false;\n    mg_sha256_update(&tls->sha256, server_name_ext, sizeof(server_name_ext));\n    mg_sha256_update(&tls->sha256, (uint8_t *) hostname, hostnamesz);\n  }\n\n  // change cipher message\n  if (mg_iobuf_add(wio, wio->len, (const char *) \"\\x14\\x03\\x03\\x00\\x01\\x01\",\n                   6) == 0)\n    return false;\n  return true;\n}\n\nstatic int mg_tls_client_recv_hello(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  struct mg_iobuf *rio = &c->rtls;\n  uint16_t msgsz;\n  uint8_t *ext;\n  uint16_t ext_len;\n  int j;\n\n  if (!mg_tls_got_record(c)) {\n    return MG_IO_WAIT;\n  }\n  if (rio->buf[0] != MG_TLS_HANDSHAKE || rio->buf[5] != MG_TLS_SERVER_HELLO) {\n    if (rio->buf[0] == MG_TLS_ALERT && rio->len >= 7) {\n      mg_error(c, \"tls alert %d\", rio->buf[6]);\n      return -1;\n    }\n    MG_INFO((\"got packet type 0x%02x/0x%02x\", rio->buf[0], rio->buf[5]));\n    mg_error(c, \"not a server hello packet\");\n    return -1;\n  }\n\n  msgsz = MG_LOAD_BE16(rio->buf + 3);\n  mg_sha256_update(&tls->sha256, rio->buf + 5, msgsz);\n\n  ext_len = MG_LOAD_BE16(rio->buf + 5 + 39 + 32 + 3);\n  ext = rio->buf + 5 + 39 + 32 + 3 + 2;\n  if (ext_len > (rio->len - (5 + 39 + 32 + 3 + 2))) goto fail;\n\n  for (j = 0; j < ext_len;) {\n    uint16_t ext_type = MG_LOAD_BE16(ext + j);\n    uint16_t ext_len2 = MG_LOAD_BE16(ext + j + 2);\n    uint16_t group;\n    uint8_t *key_exchange;\n    uint16_t key_exchange_len;\n    if (ext_len2 > (ext_len - j - 4)) goto fail;\n    if (ext_type != 0x0033) {  // not a key share extension, ignore\n      j += (uint16_t) (ext_len2 + 4);\n      continue;\n    }\n    group = MG_LOAD_BE16(ext + j + 4);\n    if (group != 0x001d) {\n      mg_error(c, \"bad key exchange group\");\n      return -1;\n    }\n    key_exchange_len = MG_LOAD_BE16(ext + j + 6);\n    key_exchange = ext + j + 8;\n    if (key_exchange_len != 32) {\n      mg_error(c, \"bad key exchange length\");\n      return -1;\n    }\n    mg_tls_x25519(tls->x25519_sec, tls->x25519_cli, key_exchange, 1);\n    mg_tls_hexdump(\"c x25519 sec\", tls->x25519_sec, 32);\n    mg_tls_drop_record(c);\n    /* generate handshake keys */\n    mg_tls_generate_handshake_keys(c);\n    return 0;\n  }\nfail:\n  mg_error(c, \"bad server hello\");\n  return -1;\n}\n\nstatic int mg_tls_client_recv_ext(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf;\n  if (mg_tls_recv_record(c) < 0) {\n    return -1;\n  }\n  recv_buf = &c->rtls.buf[tls->recv_offset];\n  if (recv_buf[0] != MG_TLS_ENCRYPTED_EXTENSIONS) {\n    mg_error(c, \"expected server extensions but got msg 0x%02x\", recv_buf[0]);\n    return -1;\n  }\n  mg_tls_drop_message(c);\n  return 0;\n}\n\nstruct mg_tls_cert {\n  int is_ec_pubkey;\n  struct mg_str sn;\n  struct mg_str pubkey;\n  struct mg_der_tlv subj;\n  struct mg_str sig;    // signature\n  uint8_t tbshash[48];  // 32b for sha256/secp256, 48b for sha384/secp384\n  size_t tbshashsz;     // actual TBS hash size\n};\n\nstatic void mg_der_debug_cert_name(const char *name, struct mg_der_tlv *tlv) {\n  struct mg_der_tlv v;\n  struct mg_str cn, c, o, ou;\n  cn = c = o = ou = mg_str(\"\");\n  if (mg_der_find_oid(tlv, (uint8_t *) \"\\x55\\x04\\x03\", 3, &v))\n    cn = mg_str_n((const char *) v.value, v.len);\n  if (mg_der_find_oid(tlv, (uint8_t *) \"\\x55\\x04\\x06\", 3, &v))\n    c = mg_str_n((const char *) v.value, v.len);\n  if (mg_der_find_oid(tlv, (uint8_t *) \"\\x55\\x04\\x0a\", 3, &v))\n    o = mg_str_n((const char *) v.value, v.len);\n  if (mg_der_find_oid(tlv, (uint8_t *) \"\\x55\\x04\\x0b\", 3, &v))\n    ou = mg_str_n((const char *) v.value, v.len);\n  MG_VERBOSE((\"%s: CN=%.*s, C=%.*s, O=%.*s, OU=%.*s\", name, cn.len, cn.buf,\n              c.len, c.buf, o.len, o.buf, ou.len, ou.buf));\n}\n\nstatic int mg_tls_parse_cert_der(void *buf, size_t dersz,\n                                 struct mg_tls_cert *cert) {\n  uint8_t *tbs, *der = (uint8_t *) buf;\n  size_t tbssz;\n  struct mg_der_tlv root, tbs_cert, field, algo;  // pubkey, signature;\n  struct mg_der_tlv pki, pki_algo, pki_key, pki_curve, raw_sig;\n\n  // Parse outermost SEQUENCE\n  if (mg_der_parse(der, dersz, &root) <= 0 || root.type != 0x30) return -1;\n\n  // Parse TBSCertificate SEQUENCE\n  tbs = root.value;\n  if (mg_der_next(&root, &tbs_cert) <= 0 || tbs_cert.type != 0x30) return -1;\n  tbssz = (size_t) (tbs_cert.value + tbs_cert.len - tbs);\n\n  // Parse Version (optional field)\n  if (mg_der_next(&tbs_cert, &field) <= 0) return -1;\n  if (field.type == 0xa0) {  // v3\n    if (mg_der_parse(field.value, field.len, &field) <= 0 || field.len != 1 ||\n        field.value[0] != 2)\n      return -1;\n    if (mg_der_next(&tbs_cert, &field) <= 0) return -1;\n  }\n\n  // Parse Serial Number\n  if (field.type != 2) return -1;\n  cert->sn = mg_str_n((char *) field.value, field.len);\n  MG_VERBOSE((\"cert s/n: %M\", mg_print_hex, cert->sn.len, cert->sn.buf));\n\n  // Parse signature algorithm (first occurrence)\n  if (mg_der_next(&tbs_cert, &field) <= 0 || field.type != 0x30) return -1;\n  if (mg_der_next(&field, &algo) <= 0 || algo.type != 0x06) return -1;\n\n  MG_VERBOSE((\"sig algo (oid): %M\", mg_print_hex, algo.len, algo.value));\n  // Signature algorithm OID mapping\n  if (algo.len == 8 &&\n      memcmp(algo.value, \"\\x2A\\x86\\x48\\xCE\\x3D\\x04\\x03\\x02\", 8) == 0) {\n    MG_VERBOSE((\"sig algo: ECDSA with SHA256\"));\n    mg_sha256(cert->tbshash, tbs, tbssz);\n    cert->tbshashsz = 32;\n  } else if (algo.len == 9 &&\n             memcmp(algo.value, \"\\x2A\\x86\\x48\\x86\\xF7\\x0D\\x01\\x01\\x0B\", 9) ==\n                 0) {\n    MG_VERBOSE((\"sig algo: RSA with SHA256\"));\n    mg_sha256(cert->tbshash, tbs, tbssz);\n    cert->tbshashsz = 32;\n  } else if (algo.len == 8 &&\n             memcmp(algo.value, \"\\x2A\\x86\\x48\\xCE\\x3D\\x04\\x03\\x03\", 8) == 0) {\n    MG_VERBOSE((\"sig algo: ECDSA with SHA384\"));\n    mg_sha384(cert->tbshash, tbs, tbssz);\n    cert->tbshashsz = 48;\n  } else if (algo.len == 9 &&\n             memcmp(algo.value, \"\\x2A\\x86\\x48\\x86\\xF7\\x0D\\x01\\x01\\x0C\", 9) ==\n                 0) {\n    MG_VERBOSE((\"sig algo: RSA with SHA384\"));\n    mg_sha384(cert->tbshash, tbs, tbssz);\n    cert->tbshashsz = 48;\n  } else {\n    MG_ERROR(\n        (\"sig algo: unsupported OID: %M\", mg_print_hex, algo.len, algo.value));\n    return -1;\n  }\n  MG_VERBOSE((\"tbs hash: %M\", mg_print_hex, cert->tbshashsz, cert->tbshash));\n\n  // issuer\n  if (mg_der_next(&tbs_cert, &field) <= 0 || field.type != 0x30) return -1;\n  mg_der_debug_cert_name(\"issuer\", &field);\n\n  // validity dates (before/after)\n  if (mg_der_next(&tbs_cert, &field) <= 0 || field.type != 0x30) return -1;\n  if (1) {\n    struct mg_der_tlv before, after;\n    mg_der_next(&field, &before);\n    mg_der_next(&field, &after);\n    if (after.len == 13 && memcmp(after.value, \"250101000000Z\", 13) < 0) {\n      MG_ERROR((\"invalid validity dates: before=%M after=%M\", mg_print_hex,\n                before.len, before.value, mg_print_hex, after.len,\n                after.value));\n      return -1;\n    }\n  }\n\n  // subject\n  if (mg_der_next(&tbs_cert, &field) <= 0 || field.type != 0x30) return -1;\n  cert->subj = field;\n  mg_der_debug_cert_name(\"subject\", &field);\n\n  // subject public key info\n  if (mg_der_next(&tbs_cert, &field) <= 0 || field.type != 0x30) return -1;\n\n  if (mg_der_next(&field, &pki) <= 0 || pki.type != 0x30) return -1;\n  if (mg_der_next(&pki, &pki_algo) <= 0 || pki_algo.type != 0x06) return -1;\n\n  // public key algorithm\n  MG_VERBOSE((\"pk algo (oid): %M\", mg_print_hex, pki_algo.len, pki_algo.value));\n  if (pki_algo.len == 8 &&\n      memcmp(pki_algo.value, \"\\x2A\\x86\\x48\\xCE\\x3D\\x03\\x01\\x07\", 8) == 0) {\n    cert->is_ec_pubkey = 1;\n    MG_VERBOSE((\"pk algo: ECDSA secp256r1\"));\n  } else if (pki_algo.len == 8 &&\n             memcmp(pki_algo.value, \"\\x2A\\x86\\x48\\xCE\\x3D\\x03\\x01\\x08\", 8) ==\n                 0) {\n    cert->is_ec_pubkey = 1;\n    MG_VERBOSE((\"pk algo: ECDSA secp384r1\"));\n  } else if (pki_algo.len == 7 &&\n             memcmp(pki_algo.value, \"\\x2A\\x86\\x48\\xCE\\x3D\\x02\\x01\", 7) == 0) {\n    cert->is_ec_pubkey = 1;\n    MG_VERBOSE((\"pk algo: EC public key\"));\n  } else if (pki_algo.len == 9 &&\n             memcmp(pki_algo.value, \"\\x2A\\x86\\x48\\x86\\xF7\\x0D\\x01\\x01\\x01\",\n                    9) == 0) {\n    cert->is_ec_pubkey = 0;\n    MG_VERBOSE((\"pk algo: RSA\"));\n  } else {\n    MG_ERROR((\"unsupported pk algo: %M\", mg_print_hex, pki_algo.len,\n              pki_algo.value));\n    return -1;\n  }\n\n  // Parse public key\n  if (cert->is_ec_pubkey) {\n    if (mg_der_next(&pki, &pki_curve) <= 0 || pki_curve.type != 0x06) return -1;\n  }\n  if (mg_der_next(&field, &pki_key) <= 0 || pki_key.type != 0x03) return -1;\n\n  if (cert->is_ec_pubkey) {  // Skip leading 0x00 and 0x04 (=uncompressed)\n    cert->pubkey = mg_str_n((char *) pki_key.value + 2, pki_key.len - 2);\n  } else {  // Skip leading 0x00 byte\n    cert->pubkey = mg_str_n((char *) pki_key.value + 1, pki_key.len - 1);\n  }\n\n  // Parse signature\n  if (mg_der_next(&root, &field) <= 0 || field.type != 0x30) return -1;\n  if (mg_der_next(&root, &raw_sig) <= 0 || raw_sig.type != 0x03) return -1;\n  if (raw_sig.len < 1 || raw_sig.value[0] != 0x00) return -1;\n\n  cert->sig = mg_str_n((char *) raw_sig.value + 1, raw_sig.len - 1);\n  MG_VERBOSE((\"sig: %M\", mg_print_hex, cert->sig.len, cert->sig.buf));\n\n  return 0;\n}\n\nstatic int mg_tls_verify_cert_san(const uint8_t *der, size_t dersz,\n                                  const char *server_name,\n                                  struct mg_addr *server_ip) {\n  struct mg_der_tlv root, field, name;\n  if (mg_der_parse((uint8_t *) der, dersz, &root) < 0) {\n    MG_ERROR((\"failed to parse certificate\"));\n    return -1;\n  }\n  if (mg_der_find_oid(&root, (uint8_t *) \"\\x55\\x1d\\x11\", 3, &field) <= 0) {\n    MG_ERROR((\"failed to extract SAN\"));\n    return -1;\n  }\n  if (mg_der_parse(field.value, field.len, &field) < 0) {\n    MG_ERROR((\"SAN is not a constructed object\"));\n    return -1;\n  }\n  while (mg_der_next(&field, &name) > 0) {\n    if (name.type == 0x87 && name.len == 4) {  // this is an IPv4 address\n      MG_VERBOSE((\"Found SAN, IP: %M\", mg_print_ip4, name.value));\n      if (!server_ip->is_ip6 &&\n          *((uint32_t *) name.value) == server_ip->addr.ip4)\n        return 1;  // and matches the one we're connected to\n    } else {       // this is a text SAN\n      MG_VERBOSE((\"Found SAN, (%u): %.*s\", name.type, name.len, name.value));\n      if (mg_match(mg_str(server_name), mg_str_n((char *) name.value, name.len),\n                   NULL))\n        return 1;  // and matches the host name\n    }              // TODO(): add IPv6 comparison, more items ?\n  }\n  return -1;\n}\n\nstatic int mg_tls_verify_cert_signature(const struct mg_tls_cert *cert,\n                                        const struct mg_tls_cert *issuer) {\n  if (issuer->is_ec_pubkey) {\n    uint8_t sig[128];\n    struct mg_der_tlv seq = {0, 0, 0}, a = {0, 0, 0}, b = {0, 0, 0};\n    mg_der_parse((uint8_t *) cert->sig.buf, cert->sig.len, &seq);\n    mg_der_next(&seq, &a);\n    mg_der_next(&seq, &b);\n    if (a.len == 0 || b.len == 0) {\n      MG_ERROR((\"cert verification error\"));\n      return 0;\n    }\n    if (issuer->pubkey.len == 64) {\n      const uint32_t N = 32;\n      if (a.len > N) a.value += (a.len - N), a.len = N;\n      if (b.len > N) b.value += (b.len - N), b.len = N;\n      memmove(sig, a.value, N);\n      memmove(sig + N, b.value, N);\n      return mg_uecc_verify((uint8_t *) issuer->pubkey.buf, cert->tbshash,\n                            (unsigned) cert->tbshashsz, sig,\n                            mg_uecc_secp256r1());\n    } else if (issuer->pubkey.len == 96) {\n      MG_VERBOSE((\"ignore secp386 for now\"));\n      return 1;\n    } else {\n      MG_ERROR((\"unsupported public key length: %d\", issuer->pubkey.len));\n      return 0;\n    }\n  } else {\n    int r;\n    uint8_t sig2[256];  // 2048 bits\n    struct mg_der_tlv seq, modulus, exponent;\n    if (mg_der_parse((uint8_t *) issuer->pubkey.buf, issuer->pubkey.len,\n                     &seq) <= 0 ||\n        mg_der_next(&seq, &modulus) <= 0 || modulus.type != 2 ||\n        mg_der_next(&seq, &exponent) <= 0 || exponent.type != 2) {\n      return -1;\n    }\n    mg_rsa_mod_pow(modulus.value, modulus.len, exponent.value, exponent.len,\n                   (uint8_t *) cert->sig.buf, cert->sig.len, sig2,\n                   sizeof(sig2));\n\n    r = memcmp(sig2 + sizeof(sig2) - cert->tbshashsz, cert->tbshash,\n               cert->tbshashsz);\n    return r == 0;\n  }\n}\n\nstatic int mg_tls_verify_cert_cn(struct mg_der_tlv *subj, const char *host) {\n  struct mg_der_tlv v;\n  int matched = 0;\n  if (mg_der_find_oid(subj, (uint8_t *) \"\\x55\\x04\\x03\", 3, &v) > 0) {\n    MG_VERBOSE((\"using CN: %.*s <-> %s\", v.len, v.value, host));\n    matched = mg_match(mg_str(host), mg_str_n((char *) v.value, v.len), NULL);\n  }\n  return matched;\n}\n\nstatic int mg_tls_recv_cert(struct mg_connection *c, bool is_client) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf;\n\n  if (mg_tls_recv_record(c) < 0) {\n    return -1;\n  }\n\n  recv_buf = &c->rtls.buf[tls->recv_offset];\n\n  if (recv_buf[0] == MG_TLS_CERTIFICATE_REQUEST) {\n    MG_VERBOSE((\"got certificate request\"));\n    mg_tls_drop_message(c);\n    tls->cert_requested = 1;\n    return -1;\n  }\n\n  if (recv_buf[0] != MG_TLS_CERTIFICATE) {\n    mg_error(c, \"expected %s certificate but got msg 0x%02x\",\n             is_client ? \"server\" : \"client\", recv_buf[0]);\n    return -1;\n  }\n\n  if (tls->recv_len < 11) {\n    mg_error(c, \"certificate list too short\");\n    return -1;\n  }\n\n  {\n    // Normally, there are 2-3 certs in a chain (when is_client)\n    struct mg_tls_cert certs[8];\n    int certnum = 0;\n    uint32_t full_cert_chain_len = MG_LOAD_BE24(recv_buf + 1);\n    uint32_t cert_chain_len = MG_LOAD_BE24(recv_buf + 5);\n    uint8_t *p = recv_buf + 8;\n    uint8_t *endp = recv_buf + cert_chain_len;\n    bool found_ca = false;\n    struct mg_tls_cert ca;\n\n    if (cert_chain_len != full_cert_chain_len - 4) {\n      MG_ERROR((\"full chain length: %d, chain length: %d\", full_cert_chain_len,\n                cert_chain_len));\n      mg_error(c, \"certificate chain length mismatch\");\n      return -1;\n    }\n\n    memset(certs, 0, sizeof(certs));\n    memset(&ca, 0, sizeof(ca));\n\n    if (tls->ca_der.len > 0) {\n      if (mg_tls_parse_cert_der(tls->ca_der.buf, tls->ca_der.len, &ca) < 0) {\n        mg_error(c, \"failed to parse CA certificate\");\n        return -1;\n      }\n      MG_VERBOSE((\"CA serial: %M\", mg_print_hex, ca.sn.len, ca.sn.buf));\n    }\n\n    while (p < endp) {\n      struct mg_tls_cert *ci = &certs[certnum++];\n      uint32_t certsz = MG_LOAD_BE24(p);\n      uint8_t *cert = p + 3;\n      uint16_t certext = MG_LOAD_BE16(cert + certsz);\n      if (certext != 0) {\n        mg_error(c, \"certificate extensions are not supported\");\n        return -1;\n      }\n      p = cert + certsz + 2;\n\n      if (mg_tls_parse_cert_der(cert, certsz, ci) < 0) {\n        mg_error(c, \"failed to parse certificate\");\n        return -1;\n      }\n\n      if (ci == certs) {\n        // First certificate in the chain is peer cert, check SAN if requested,\n        // and store public key for further CertVerify step\n        if (tls->hostname[0] != '\\0' &&\n            mg_tls_verify_cert_san(cert, certsz, tls->hostname, &c->rem) <= 0 &&\n            mg_tls_verify_cert_cn(&ci->subj, tls->hostname) <= 0) {\n          mg_error(c, \"failed to verify hostname\");\n          return -1;\n        }\n        memmove(tls->pubkey, ci->pubkey.buf, ci->pubkey.len);\n        tls->pubkeysz = ci->pubkey.len;\n      } else {\n        if (!mg_tls_verify_cert_signature(ci - 1, ci)) {\n          mg_error(c, \"failed to verify certificate chain\");\n          return -1;\n        }\n      }\n\n      if (ca.pubkey.len == ci->pubkey.len &&\n          memcmp(ca.pubkey.buf, ci->pubkey.buf, ca.pubkey.len) == 0) {\n        found_ca = true;\n        break;\n      }\n\n      if (certnum == sizeof(certs) / sizeof(certs[0]) - 1) {\n        mg_error(c, \"too many certificates in the chain\");\n        return -1;\n      }\n    }\n\n    if (!found_ca && tls->ca_der.len > 0) {\n      if (certnum < 1 ||\n          !mg_tls_verify_cert_signature(&certs[certnum - 1], &ca)) {\n        mg_error(c, \"failed to verify CA\");\n        return -1;\n      } else if (is_client) {\n        MG_VERBOSE(\n            (\"CA was not in the chain, but verification with builtin CA \"\n             \"passed\"));\n      }\n    }\n  }\n  mg_tls_drop_message(c);\n  mg_tls_calc_cert_verify_hash(c, tls->sighash, !is_client);\n  return 0;\n}\n\nstatic int mg_tls_recv_cert_verify(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf;\n  if (mg_tls_recv_record(c) < 0) {\n    return -1;\n  }\n  recv_buf = &c->rtls.buf[tls->recv_offset];\n  if (recv_buf[0] != MG_TLS_CERTIFICATE_VERIFY) {\n    mg_error(c, \"expected %s certificate verify but got msg 0x%02x\",\n             c->is_client ? \"server\" : \"client\", recv_buf[0]);\n    return -1;\n  }\n  if (tls->recv_len < 8) {\n    mg_error(c, \"server certificate verify is too short: %d bytes\",\n             tls->recv_len);\n    return -1;\n  }\n\n  // Ignore CertificateVerify if strict checks are not required\n  if (tls->skip_verification) {\n    mg_tls_drop_message(c);\n    return 0;\n  }\n\n  {\n    uint16_t sigalg = MG_LOAD_BE16(recv_buf + 4);\n    uint16_t siglen = MG_LOAD_BE16(recv_buf + 6);\n    uint8_t *sigbuf = recv_buf + 8;\n    if (siglen > tls->recv_len - 8) {\n      mg_error(c, \"invalid certverify signature length: %d, expected %d\",\n               siglen, tls->recv_len - 8);\n      return -1;\n    }\n    MG_VERBOSE(\n        (\"certificate verification, algo=%04x, siglen=%d\", sigalg, siglen));\n\n    if (sigalg == 0x0804) {  // rsa_pss_rsae_sha256\n      uint8_t sig2[512];     // 2048 or 4096 bits\n      struct mg_der_tlv seq, modulus, exponent;\n\n      if (mg_der_parse(tls->pubkey, tls->pubkeysz, &seq) <= 0 ||\n          mg_der_next(&seq, &modulus) <= 0 || modulus.type != 2 ||\n          mg_der_next(&seq, &exponent) <= 0 || exponent.type != 2) {\n        mg_error(c, \"invalid public key\");\n        return -1;\n      }\n\n      mg_rsa_mod_pow(modulus.value, modulus.len, exponent.value, exponent.len,\n                     sigbuf, siglen, sig2, sizeof(sig2));\n\n      if (sig2[sizeof(sig2) - 1] != 0xbc) {\n        mg_error(c, \"failed to verify RSA certificate (certverify)\");\n        return -1;\n      }\n      MG_VERBOSE((\"certificate verification successful (RSA)\"));\n    } else if (sigalg == 0x0403) {  // ecdsa_secp256r1_sha256\n      // Extract certificate signature and verify it using pubkey and sighash\n      uint8_t sig[64];\n      struct mg_der_tlv seq, r, s;\n      memset(sig, 0, 64);\n      if (mg_der_to_tlv(sigbuf, siglen, &seq) < 0) {\n        mg_error(c, \"verification message is not an ASN.1 DER sequence\");\n        return -1;\n      }\n      if (mg_der_to_tlv(seq.value, seq.len, &r) < 0) {\n        mg_error(c, \"missing first part of the signature\");\n        return -1;\n      }\n      if (mg_der_to_tlv(r.value + r.len, seq.len - r.len, &s) < 0) {\n        mg_error(c, \"missing second part of the signature\");\n        return -1;\n      }\n      // Integers may be padded with zeroes\n      if (r.len > 32) r.value = r.value + (r.len - 32), r.len = 32;\n      if (s.len > 32) s.value = s.value + (s.len - 32), s.len = 32;\n\n      // r or s may be shorter than 32 bytes, \"right-justify\" (network order)\n      memmove(sig + (32 - r.len), r.value, r.len);\n      memmove(sig + 32 + (32 - s.len), s.value, s.len);\n\n      if (mg_uecc_verify(tls->pubkey, tls->sighash, sizeof(tls->sighash), sig,\n                         mg_uecc_secp256r1()) != 1) {\n        mg_error(c, \"failed to verify EC certificate (certverify)\");\n        return -1;\n      }\n      MG_VERBOSE((\"certificate verification successful (EC)\"));\n    } else {\n      // From\n      // https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml:\n      //   0805 = rsa_pss_rsae_sha384\n      //   0806 = rsa_pss_rsae_sha512\n      //   0807 = ed25519\n      //   0808 = ed448\n      //   0809 = rsa_pss_pss_sha256\n      //   080A = rsa_pss_pss_sha384\n      //   080B = rsa_pss_pss_sha512\n      MG_ERROR((\"unsupported certverify signature scheme: %x of %d bytes\",\n                sigalg, siglen));\n      return -1;\n    }\n  }\n  mg_tls_drop_message(c);\n  return 0;\n}\n\nstatic int mg_tls_client_recv_finish(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf;\n  if (mg_tls_recv_record(c) < 0) {\n    return -1;\n  }\n  recv_buf = &c->rtls.buf[tls->recv_offset];\n  if (recv_buf[0] != MG_TLS_FINISHED) {\n    mg_error(c, \"expected server finished but got msg 0x%02x\", recv_buf[0]);\n    return -1;\n  }\n  mg_tls_drop_message(c);\n  return 0;\n}\n\nstatic bool mg_tls_client_send_finish(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  mg_sha256_ctx sha256;\n  uint8_t hash[32];\n  uint8_t finish[36] = {0x14, 0, 0, 32};\n  memmove(&sha256, &tls->sha256, sizeof(mg_sha256_ctx));\n  mg_sha256_final(hash, &sha256);\n  mg_hmac_sha256(finish + 4, tls->enc.client_finished_key, 32, hash, 32);\n  return mg_tls_encrypt(c, finish, sizeof(finish), MG_TLS_HANDSHAKE);\n}\n\nstatic bool mg_tls_client_handshake(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  switch (tls->state) {\n    case MG_TLS_STATE_CLIENT_START:\n      if (!mg_tls_client_send_hello(c)) return false;\n      tls->state = MG_TLS_STATE_CLIENT_WAIT_SH;\n      // Fallthrough\n    case MG_TLS_STATE_CLIENT_WAIT_SH:\n      if (mg_tls_client_recv_hello(c) < 0) break;\n      tls->state = MG_TLS_STATE_CLIENT_WAIT_EE;\n      // Fallthrough\n    case MG_TLS_STATE_CLIENT_WAIT_EE:\n      if (mg_tls_client_recv_ext(c) < 0) break;\n      tls->state = MG_TLS_STATE_CLIENT_WAIT_CERT;\n      // Fallthrough\n    case MG_TLS_STATE_CLIENT_WAIT_CERT:\n      if (mg_tls_recv_cert(c, true) < 0) break;\n      tls->state = MG_TLS_STATE_CLIENT_WAIT_CV;\n      // Fallthrough\n    case MG_TLS_STATE_CLIENT_WAIT_CV:\n      if (mg_tls_recv_cert_verify(c) < 0) break;\n      tls->state = MG_TLS_STATE_CLIENT_WAIT_FINISH;\n      // Fallthrough\n    case MG_TLS_STATE_CLIENT_WAIT_FINISH:\n      if (mg_tls_client_recv_finish(c) < 0) break;\n      if (tls->cert_requested && tls->cert_der.len > 0) {  // two-way auth\n        // generate application keys at this point, keep using handshake keys\n        struct tls_enc hs_keys = tls->enc;\n        mg_tls_generate_application_keys(c);\n        tls->app_keys = tls->enc;\n        tls->enc = hs_keys;\n        if (!mg_tls_send_cert(c, true) || !mg_tls_send_cert_verify(c, true) ||\n            !mg_tls_client_send_finish(c))\n          return false;\n        tls->enc = tls->app_keys;\n      } else {\n        if (!mg_tls_client_send_finish(c)) return false;\n        mg_tls_generate_application_keys(c);\n      }\n      tls->state = MG_TLS_STATE_CLIENT_CONNECTED;\n      c->is_tls_hs = 0;\n      mg_call(c, MG_EV_TLS_HS, NULL);\n      break;\n    default:\n      mg_error(c, \"unexpected client state: %d\", tls->state);\n      break;\n  }\n  return true;\n}\n\nstatic bool mg_tls_server_handshake(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  switch (tls->state) {\n    case MG_TLS_STATE_SERVER_START:\n      if (mg_tls_server_recv_hello(c) < 0) break;\n      if (!mg_tls_server_send_hello(c)) return false;\n      mg_tls_generate_handshake_keys(c);\n      if (!mg_tls_server_send_ext(c)) return false;\n      if (tls->is_twoway && !mg_tls_server_send_cert_request(c)) return false;\n      if (!mg_tls_send_cert(c, false) || !mg_tls_send_cert_verify(c, false) ||\n          !mg_tls_server_send_finish(c))\n        return false;\n      if (tls->is_twoway) {\n        // generate application keys at this point, keep using handshake keys\n        struct tls_enc hs_keys = tls->enc;\n        mg_tls_generate_application_keys(c);\n        tls->app_keys = tls->enc;\n        tls->enc = hs_keys;\n        tls->state = MG_TLS_STATE_SERVER_WAIT_CERT;\n        break;\n      }\n      tls->state = MG_TLS_STATE_SERVER_NEGOTIATED;\n      // fallthrough\n    case MG_TLS_STATE_SERVER_NEGOTIATED:\n      if (mg_tls_server_recv_finish(c) < 0) break;\n      if (tls->is_twoway) {  // use previously generated keys\n        tls->enc = tls->app_keys;\n      } else {  // generate keys now\n        mg_tls_generate_application_keys(c);\n      }\n      tls->state = MG_TLS_STATE_SERVER_CONNECTED;\n      c->is_tls_hs = 0;\n      break;\n    case MG_TLS_STATE_SERVER_WAIT_CERT:\n      if (mg_tls_recv_cert(c, false) < 0) break;\n      tls->state = MG_TLS_STATE_SERVER_WAIT_CV;\n      // Fallthrough\n    case MG_TLS_STATE_SERVER_WAIT_CV:\n      if (mg_tls_recv_cert_verify(c) < 0) break;\n      tls->state = MG_TLS_STATE_SERVER_NEGOTIATED;\n      break;\n    default:\n      mg_error(c, \"unexpected server state: %d\", tls->state);\n      break;\n  }\n  return true;\n}\n\nvoid mg_tls_handshake(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  long n;\n  bool res;\n  if (c->is_closing) return;  // we don't clear rx buf, so ignore what's left\n  if (c->is_client) {\n    // will clear is_hs when sending last chunk\n    res = mg_tls_client_handshake(c);\n  } else {\n    res = mg_tls_server_handshake(c);\n  }\n  if (!res) {\n    mg_error(c, \"TLS OOM\");\n    return;\n  }\n  while (tls->send.len > 0 &&\n         (n = mg_io_send(c, tls->send.buf, tls->send.len)) > 0) {\n    mg_iobuf_del(&tls->send, 0, (size_t) n);\n  }  // if last chunk fails to be sent, it will be sent with first app data,\n     // otherwise, it needs to be flushed\n}\n\nstatic int mg_rsa_parse_der_int(const uint8_t **p, const uint8_t *end,\n                                struct mg_str *out) {\n  const uint8_t *start = *p, *value_start, *value_end;\n  uint8_t i;\n  uint32_t len;\n\n  if (end - start < 2) {\n    MG_VERBOSE((\"DER INT: not enough bytes (%d < 2)\", (int) (end - start)));\n    return -1;\n  }\n  if (start[0] != 0x02) {\n    MG_VERBOSE((\"DER INT: expected 0x02, got 0x%02x\", start[0]));\n    return -1;\n  }\n\n  len = start[1];\n  *p = start + 2;\n\n  if (len > 0x7F) {\n    // Long form length\n    uint8_t len_bytes = len & 0x7F;\n    MG_VERBOSE((\"DER INT: long form, %d length bytes\", len_bytes));\n    if (end - *p < len_bytes) {\n      MG_VERBOSE((\"DER INT: not enough bytes for length\"));\n      return -1;\n    }\n    len = 0;\n    for (i = 0; i < len_bytes; i++) {\n      len = (len << 8) | (*p)[i];\n    }\n    *p += len_bytes;\n  }\n\n  MG_VERBOSE((\"DER INT: length=%u, remaining=%d\", len, (int) (end - *p)));\n\n  if (end - *p < (long) len) {\n    MG_VERBOSE((\"DER INT: length exceeds remaining bytes\"));\n    return -1;\n  }\n\n  // The encoded length tells us how many bytes to consume from the stream\n  value_start = *p;\n  value_end = *p + len;\n\n  // Skip leading zero byte if present (for positive numbers)\n  // This doesn't change how many bytes we consume, just what we expose\n  if (len > 0 && (*p)[0] == 0x00) {\n    (*p)++;\n    len--;\n  }\n\n  out->buf = (char *) *p;\n  out->len = len;\n\n  // Advance pointer by the ORIGINAL encoded length, not the adjusted length\n  *p = value_end;\n\n  MG_VERBOSE((\"DER INT: parsed %u bytes (skipped zero=%d)\", len,\n              (size_t)(value_end - value_start) != (size_t) len ? 1 : 0));\n  return 0;\n}\n\n// RFC 5915 ECPrivateKey ::= SEQUENCE {\n//   version INTEGER { ecPrivkeyVer1(1) },\n//   privateKey OCTET STRING,\n//   parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,\n//   publicKey [1] BIT STRING OPTIONAL\n// }\nstatic int mg_parse_ec_private_key(const uint8_t *der, size_t dersz,\n                                   uint8_t *ec_key) {\n  struct mg_der_tlv root, version, private_key_octets;\n\n  if (mg_der_parse((uint8_t *) der, dersz, &root) < 0 || root.type != 0x30) {\n    MG_ERROR((\"EC private key: invalid SEQUENCE\"));\n    return -1;\n  }\n\n  if (mg_der_next(&root, &version) < 0 || version.type != 0x02) {\n    MG_ERROR((\"EC private key: invalid version\"));\n    return -1;\n  }\n\n  if (mg_der_next(&root, &private_key_octets) < 0 ||\n      private_key_octets.type != 0x04) {\n    MG_ERROR((\"EC private key: invalid privateKey OCTET STRING\"));\n    return -1;\n  }\n\n  if (private_key_octets.len != 32) {\n    MG_ERROR(\n        (\"EC private key: expected 32 bytes, got %u\", private_key_octets.len));\n    return -1;\n  }\n\n  memcpy(ec_key, private_key_octets.value, 32);\n  return 0;\n}\n\n// Parse RSA private key from DER format\n// RSAPrivateKey ::= SEQUENCE {\n//   version           INTEGER (0),\n//   modulus           INTEGER,  -- n\n//   publicExponent    INTEGER,  -- e\n//   privateExponent   INTEGER,  -- d\n//   prime1            INTEGER,  -- p\n//   prime2            INTEGER,  -- q\n//   exponent1         INTEGER,  -- dP = d mod (p-1)\n//   exponent2         INTEGER,  -- dQ = d mod (q-1)\n//   coefficient       INTEGER,  -- qInv = (inverse of q) mod p\n// }\nstatic int mg_rsa_parse_key(const uint8_t *der, size_t dersz,\n                            struct mg_rsa_key *key) {\n  const uint8_t *p = der;\n  const uint8_t *end = der + dersz;\n  uint32_t seq_len;\n  struct mg_str version;\n\n  memset(key, 0, sizeof(*key));\n\n  // Debug: show first few bytes\n  MG_VERBOSE(\n      (\"RSA key DER first 16 bytes: %02x %02x %02x %02x %02x %02x %02x %02x \"\n       \"%02x %02x %02x %02x %02x %02x %02x %02x\",\n       der[0], der[1], der[2], der[3], der[4], der[5], der[6], der[7], der[8],\n       der[9], der[10], der[11], der[12], der[13], der[14], der[15]));\n\n  // Parse outer SEQUENCE\n  if (end - p < 2) {\n    MG_ERROR((\"RSA key too short for SEQUENCE header\"));\n    return -1;\n  }\n  if (p[0] != 0x30) {\n    MG_ERROR((\"RSA key: expected SEQUENCE (0x30), got 0x%02x\", p[0]));\n    return -1;\n  }\n\n  seq_len = p[1];\n  p += 2;\n\n  if (seq_len > 0x7F) {\n    // Long form length\n    uint8_t i, len_bytes = seq_len & 0x7F;\n    MG_VERBOSE((\"Long form length: %d bytes\", len_bytes));\n    if (end - p < len_bytes) {\n      MG_ERROR((\"Not enough bytes for long form length\"));\n      return -1;\n    }\n    seq_len = 0;\n    for (i = 0; i < len_bytes; i++) {\n      seq_len = (seq_len << 8) | p[i];\n    }\n    p += len_bytes;\n  }\n\n  MG_VERBOSE(\n      (\"SEQUENCE length: %u, total DER size: %u\", seq_len, (unsigned) dersz));\n\n  if (end - p < (long) seq_len) {\n    MG_ERROR((\"SEQUENCE length exceeds buffer\"));\n    return -1;\n  }\n  end = p + seq_len;  // Adjust end to sequence boundary\n\n  // Parse version (should be 0)\n  MG_VERBOSE((\"Before version: offset=%d, bytes: %02x %02x %02x %02x\",\n              (int) (p - der), p[0], p[1], p[2], p[3]));\n  if (mg_rsa_parse_der_int(&p, end, &version) < 0) {\n    MG_ERROR((\"Failed to parse version\"));\n    return -1;\n  }\n  MG_DEBUG((\"Version: %d byte(s), value=%d, offset now=%d\", (int) version.len,\n            version.len > 0 ? (int) (unsigned char) version.buf[0] : -1,\n            (int) (p - der)));\n\n  // Parse the 8 components: n, e, d, p, q, dP, dQ, qInv\n  MG_VERBOSE((\"Before n: offset=%d, bytes: %02x %02x %02x %02x %02x %02x\",\n              (int) (p - der), p[0], p[1], p[2], p[3], p[4], p[5]));\n  if (mg_rsa_parse_der_int(&p, end, &key->n) < 0) {\n    MG_ERROR((\"Failed to parse n (modulus)\"));\n    return -1;\n  }\n  MG_VERBOSE((\"Parsed n: %d bytes, offset now=%d, consumed=%d bytes total\",\n              (int) key->n.len, (int) (p - der), (int) (p - der)));\n  MG_VERBOSE((\"  First 8 bytes of n: %02x %02x %02x %02x %02x %02x %02x %02x\",\n              (unsigned char) key->n.buf[0], (unsigned char) key->n.buf[1],\n              (unsigned char) key->n.buf[2], (unsigned char) key->n.buf[3],\n              (unsigned char) key->n.buf[4], (unsigned char) key->n.buf[5],\n              (unsigned char) key->n.buf[6], (unsigned char) key->n.buf[7]));\n  MG_VERBOSE((\"  Next bytes after n: %02x %02x %02x %02x %02x %02x\",\n              p < end ? p[0] : 0xFF, p + 1 < end ? p[1] : 0xFF,\n              p + 2 < end ? p[2] : 0xFF, p + 3 < end ? p[3] : 0xFF,\n              p + 4 < end ? p[4] : 0xFF, p + 5 < end ? p[5] : 0xFF));\n\n  if (mg_rsa_parse_der_int(&p, end, &key->e) < 0) {\n    MG_ERROR((\"Failed to parse e (public exponent), bytes remaining: %d\",\n              (int) (end - p)));\n    if (end - p >= 4) {\n      MG_ERROR((\"  Next 4 bytes: %02x %02x %02x %02x\", p[0], p[1], p[2], p[3]));\n    }\n    return -1;\n  }\n  if (mg_rsa_parse_der_int(&p, end, &key->d) < 0) {\n    MG_ERROR((\"Failed to parse d (private exponent)\"));\n    return -1;\n  }\n  if (mg_rsa_parse_der_int(&p, end, &key->p) < 0) {\n    MG_ERROR((\"Failed to parse p (prime1)\"));\n    return -1;\n  }\n  if (mg_rsa_parse_der_int(&p, end, &key->q) < 0) {\n    MG_ERROR((\"Failed to parse q (prime2)\"));\n    return -1;\n  }\n  if (mg_rsa_parse_der_int(&p, end, &key->dP) < 0) {\n    MG_ERROR((\"Failed to parse dP (exponent1)\"));\n    return -1;\n  }\n  if (mg_rsa_parse_der_int(&p, end, &key->dQ) < 0) {\n    MG_ERROR((\"Failed to parse dQ (exponent2)\"));\n    return -1;\n  }\n  if (mg_rsa_parse_der_int(&p, end, &key->qInv) < 0) {\n    MG_ERROR((\"Failed to parse qInv (coefficient)\"));\n    return -1;\n  }\n\n  MG_VERBOSE((\"Successfully parsed RSA key\"));\n  return 0;\n}\n\n// PKCS#8 PrivateKeyInfo ::= SEQUENCE {\n//   version INTEGER,\n//   privateKeyAlgorithm AlgorithmIdentifier,\n//   privateKey OCTET STRING,\n//   attributes [0] Attributes OPTIONAL\n// }\n// AlgorithmIdentifier ::= SEQUENCE {\n//   algorithm OBJECT IDENTIFIER,\n//   parameters ANY OPTIONAL\n// }\nstatic int mg_parse_pkcs8_key(const uint8_t *der, size_t dersz,\n                              struct tls_data *tls) {\n  struct mg_der_tlv root, version, alg_id, private_key_octets;\n  struct mg_der_tlv alg_oid, alg_params;\n\n  if (mg_der_parse((uint8_t *) der, dersz, &root) < 0 || root.type != 0x30) {\n    MG_ERROR((\"PKCS#8: invalid PrivateKeyInfo SEQUENCE\"));\n    return -1;\n  }\n\n  if (mg_der_next(&root, &version) < 0 || version.type != 0x02) {\n    MG_ERROR((\"PKCS#8: invalid version\"));\n    return -1;\n  }\n\n  if (mg_der_next(&root, &alg_id) < 0 || alg_id.type != 0x30) {\n    MG_ERROR((\"PKCS#8: invalid AlgorithmIdentifier SEQUENCE\"));\n    return -1;\n  }\n\n  if (mg_der_next(&alg_id, &alg_oid) < 0 || alg_oid.type != 0x06) {\n    MG_ERROR((\"PKCS#8: invalid algorithm OID\"));\n    return -1;\n  }\n\n  if (mg_der_next(&root, &private_key_octets) < 0 ||\n      private_key_octets.type != 0x04) {\n    MG_ERROR((\"PKCS#8: invalid privateKey OCTET STRING\"));\n    return -1;\n  }\n\n  if (alg_oid.len == sizeof(mg_rsa_oid) &&\n      memcmp(alg_oid.value, mg_rsa_oid, sizeof(mg_rsa_oid)) == 0) {\n    struct mg_rsa_key rsa_key;\n    if (mg_rsa_parse_key(private_key_octets.value, private_key_octets.len,\n                         &rsa_key) < 0) {\n      MG_ERROR((\"PKCS#8: failed to parse inner RSA key\"));\n      return -1;\n    }\n    tls->rsa = rsa_key;\n    return 0;\n\n  } else if (alg_oid.len == sizeof(mg_ec_public_key_oid) &&\n             memcmp(alg_oid.value, mg_ec_public_key_oid,\n                    sizeof(mg_ec_public_key_oid)) == 0) {\n    if (mg_der_next(&alg_id, &alg_params) < 0 || alg_params.type != 0x06) {\n      MG_ERROR((\"PKCS#8: invalid EC parameters OID\"));\n      return -1;\n    }\n\n    if (alg_params.len != sizeof(mg_secp256r1_oid) ||\n        memcmp(alg_params.value, mg_secp256r1_oid, sizeof(mg_secp256r1_oid)) !=\n            0) {\n      MG_ERROR((\"PKCS#8: unsupported EC curve (only secp256r1 supported)\"));\n      return -1;\n    }\n\n    return mg_parse_ec_private_key(private_key_octets.value,\n                                   private_key_octets.len, tls->ec_key);\n\n  } else {\n    MG_ERROR((\"PKCS#8: unsupported algorithm\"));\n    return -1;\n  }\n}\n\nstatic int mg_parse_pem(const struct mg_str pem, const struct mg_str label,\n                        struct mg_str *der) {\n  size_t n = 0, m = 0;\n  char *s;\n  const char *c;\n  struct mg_str caps[6];  // number of wildcards + 1\n  if (!mg_match(pem, mg_str(\"#-----BEGIN #-----#-----END #-----#\"), caps)) {\n    *der = mg_strdup(pem);\n    return 0;\n  }\n  if (mg_strcmp(caps[1], label) != 0 || mg_strcmp(caps[3], label) != 0) {\n    return -1;  // bad label\n  }\n  if ((s = (char *) mg_calloc(1, caps[2].len)) == NULL) {\n    return -1;\n  }\n\n  for (c = caps[2].buf; c < caps[2].buf + caps[2].len; c++) {\n    if (*c == ' ' || *c == '\\n' || *c == '\\r' || *c == '\\t') {\n      continue;\n    }\n    s[n++] = *c;\n  }\n  m = mg_base64_decode(s, n, s, n);\n  if (m == 0) {\n    mg_free(s);\n    return -1;\n  }\n  der->buf = s;\n  der->len = m;\n  return 0;\n}\n\nstatic int mg_parse_pem_certs(const struct mg_str pem, struct mg_str **ders) {\n  int count = 0;\n  struct mg_str *certs = NULL;\n  const char *p = pem.buf;\n  const char *end = pem.buf + pem.len;\n  const char *begin_marker = \"-----BEGIN CERTIFICATE-----\";\n  const char *end_marker = \"-----END CERTIFICATE-----\";\n  size_t begin_len = strlen(begin_marker);\n  size_t end_len = strlen(end_marker);\n\n  while (p < end) {\n    const char *s, *begin = NULL, *finish = NULL;\n    struct mg_str cert_pem, cert_der, *new_certs;\n    int i;\n\n    for (s = p; s <= end - (int) begin_len; s++) {\n      if (memcmp(s, begin_marker, begin_len) == 0) {\n        begin = s;\n        break;\n      }\n    }\n    if (begin == NULL) break;\n\n    for (s = begin + begin_len; s <= end - (int) end_len; s++) {\n      if (memcmp(s, end_marker, end_len) == 0) {\n        finish = s + end_len;\n        break;\n      }\n    }\n    if (finish == NULL) {\n      for (i = 0; i < count; i++) mg_free((void *) certs[i].buf);\n      mg_free(certs);\n      return -1;\n    }\n\n    cert_pem = mg_str_n(begin, (size_t) (finish - begin));\n    if (mg_parse_pem(cert_pem, mg_str_s(\"CERTIFICATE\"), &cert_der) < 0) {\n      for (i = 0; i < count; i++) mg_free((void *) certs[i].buf);\n      mg_free(certs);\n      return -1;\n    }\n\n    new_certs =\n        (struct mg_str *) mg_calloc((size_t) count + 1, sizeof(*new_certs));\n    if (new_certs == NULL) {\n      mg_free((void *) cert_der.buf);\n      for (i = 0; i < count; i++) mg_free((void *) certs[i].buf);\n      mg_free(certs);\n      return -1;\n    }\n    if (count > 0) {\n      memmove(new_certs, certs, (size_t) count * sizeof(struct mg_str));\n      mg_free(certs);\n    }\n    certs = new_certs;\n\n    certs[count++] = cert_der;\n    p = finish;\n  }\n\n  *ders = certs;\n  return count;\n}\n\nvoid mg_tls_init(struct mg_connection *c, const struct mg_tls_opts *opts) {\n  struct mg_str key;\n  struct tls_data *tls =\n      (struct tls_data *) mg_calloc(1, sizeof(struct tls_data));\n  if (tls == NULL) {\n    mg_error(c, \"tls oom\");\n    return;\n  }\n\n  tls->state =\n      c->is_client ? MG_TLS_STATE_CLIENT_START : MG_TLS_STATE_SERVER_START;\n\n  tls->skip_verification = opts->skip_verification;\n  // tls->send.align = MG_IO_SIZE;\n\n  c->tls = tls;\n  c->is_tls = c->is_tls_hs = 1;\n  mg_sha256_init(&tls->sha256);\n\n  // save hostname (client extension)\n  if (opts->name.len > 0) {\n    if (opts->name.len >= sizeof(tls->hostname) - 1) {\n      mg_error(c, \"hostname too long\");\n      return;\n    }\n    strncpy((char *) tls->hostname, opts->name.buf, sizeof(tls->hostname) - 1);\n    tls->hostname[opts->name.len] = 0;\n  }\n  // server CA certificate, store serial number\n  if (opts->ca.len > 0) {\n    if (mg_parse_pem(opts->ca, mg_str_s(\"CERTIFICATE\"), &tls->ca_der) < 0) {\n      MG_ERROR((\"Failed to load certificate\"));\n      return;\n    }\n    if (!c->is_client) tls->is_twoway = true;  // server + CA: two-way auth\n  }\n\n  if (opts->cert.buf == NULL) {\n    MG_VERBOSE((\"No certificate provided\"));\n    return;\n  }\n\n  // parse PEM or DER certificate\n  {\n    struct mg_str *all_certs = NULL;\n    int cert_count = mg_parse_pem_certs(opts->cert, &all_certs);\n\n    if (cert_count > 0) {\n      tls->cert_der.buf = all_certs[0].buf;\n      tls->cert_der.len = all_certs[0].len;\n      if (cert_count > 1) {\n        tls->chain_len = (size_t) cert_count;\n        tls->chain_der = all_certs;\n      } else {\n        mg_free(all_certs);\n      }\n    } else {\n      if (mg_parse_pem(opts->cert, mg_str_s(\"CERTIFICATE\"), &tls->cert_der) <\n          0) {\n        MG_ERROR((\"Failed to load certificate\"));\n        return;\n      }\n    }\n  }\n\n  // parse PEM or DER EC key\n  if (opts->key.buf == NULL) {\n    mg_error(c, \"Certificate provided without a private key\");\n    return;\n  }\n\n  if (mg_parse_pem(opts->key, mg_str_s(\"EC PRIVATE KEY\"), &key) == 0) {\n    if (key.len < 39) {\n      MG_ERROR((\"EC private key too short\"));\n      return;\n    }\n    // expect ASN.1 SEQUENCE=[INTEGER=1, BITSTRING of 32 bytes, ...]\n    // 30 nn 02 01 01 04 20 [key] ...\n    if (key.buf[0] != 0x30 || (key.buf[1] & 0x80) != 0) {\n      MG_ERROR((\"EC private key: ASN.1 bad sequence\"));\n      return;\n    }\n    if (memcmp(key.buf + 2, \"\\x02\\x01\\x01\\x04\\x20\", 5) != 0) {\n      MG_ERROR((\"EC private key: ASN.1 bad data\"));\n    }\n    memmove(tls->ec_key, key.buf + 7, 32);\n    mg_free((void *) key.buf);\n  } else if (mg_parse_pem(opts->key, mg_str_s(\"RSA PRIVATE KEY\"), &key) == 0) {\n    struct mg_rsa_key rsa_key;\n    // RSA private key found, store it for later use\n    tls->rsa_key_der = key;\n    MG_INFO((\"Parsed RSA private key: %d bytes\", (int) key.len));\n\n    // parse and validate the key structure\n    // we keep the DER buffer, rsa_key just points into it\n    if (mg_rsa_parse_key((const uint8_t *) key.buf, key.len, &rsa_key) < 0) {\n      MG_ERROR((\"Failed to parse RSA private key structure\"));\n      mg_free((void *) key.buf);\n      tls->rsa_key_der = mg_str_n(NULL, 0);\n      mg_error(c, \"Invalid RSA private key format\");\n      return;\n    }\n\n    MG_VERBOSE((\"RSA key components:\"));\n    MG_VERBOSE((\"  n (modulus):  %d bytes\", (int) rsa_key.n.len));\n    MG_VERBOSE((\"  e (pubexp):   %d bytes\", (int) rsa_key.e.len));\n    MG_VERBOSE((\"  d (privexp):  %d bytes\", (int) rsa_key.d.len));\n    MG_VERBOSE((\"  p (prime1):   %d bytes\", (int) rsa_key.p.len));\n    MG_VERBOSE((\"  q (prime2):   %d bytes\", (int) rsa_key.q.len));\n    MG_VERBOSE((\"  dP:           %d bytes\", (int) rsa_key.dP.len));\n    MG_VERBOSE((\"  dQ:           %d bytes\", (int) rsa_key.dQ.len));\n    MG_VERBOSE((\"  qInv:         %d bytes\", (int) rsa_key.qInv.len));\n\n    // Copy parsed RSA key components to tls->rsa for signing operations\n    tls->rsa = rsa_key;\n  } else if (mg_parse_pem(opts->key, mg_str_s(\"PRIVATE KEY\"), &key) == 0) {\n    if (mg_parse_pkcs8_key((const uint8_t *) key.buf, key.len, tls) == 0) {\n      if (tls->rsa.n.len > 0) {\n        tls->rsa_key_der = key;\n        MG_INFO((\"Parsed PKCS#8 RSA private key: %d bytes\", (int) key.len));\n      } else {\n        mg_free((void *) key.buf);\n        MG_INFO((\"Parsed PKCS#8 EC private key\"));\n      }\n    } else {\n      mg_free((void *) key.buf);\n      mg_error(c, \"Unsupported PKCS#8 private key format, algorithm, or curve\");\n      return;\n    }\n  } else {\n    mg_error(\n        c, \"Expected EC PRIVATE KEY, RSA PRIVATE KEY, or PRIVATE KEY (PKCS#8)\");\n  }\n}\n\nvoid mg_tls_free(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  size_t i;\n  if (tls != NULL) {\n    mg_iobuf_free(&tls->send);\n    if (tls->chain_der != NULL) {\n      for (i = 0; i < tls->chain_len; i++) {\n        mg_free((void *) tls->chain_der[i].buf);\n      }\n      mg_free(tls->chain_der);\n    } else {\n      mg_free((void *) tls->cert_der.buf);\n    }\n    mg_free((void *) tls->ca_der.buf);\n    mg_free((void *) tls->rsa_key_der.buf);\n  }\n  mg_free(c->tls);\n  c->tls = NULL;\n}\n\nlong mg_tls_send(struct mg_connection *c, const void *buf, size_t len) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  long n = MG_IO_WAIT;\n  bool was_throttled = c->is_tls_throttled;  // see #3074\n  if (!was_throttled) {                      // encrypt new data\n    if (len > MG_IO_SIZE) len = MG_IO_SIZE;\n    if (len > 16384) len = 16384;\n    if (!mg_tls_encrypt(c, (const uint8_t *) buf, len, MG_TLS_APP_DATA))\n      return 0;  // returning 0 means an OOM condition (iobuf couldn't resize),\n                 // yet this is so far recoverable, let the caller decide\n  }              // else, resend outstanding encrypted data in tls->send\n  while (tls->send.len > 0 &&\n         (n = mg_io_send(c, tls->send.buf, tls->send.len)) > 0) {\n    mg_iobuf_del(&tls->send, 0, (size_t) n);\n  }  // if last chunk fails to be sent, it needs to be flushed\n  c->is_tls_throttled = (tls->send.len > 0 && n == MG_IO_WAIT);\n  MG_VERBOSE((\"%lu %ld %ld %ld %c %c\", c->id, (long) len, (long) tls->send.len,\n              n, was_throttled ? 'T' : 't', c->is_tls_throttled ? 'T' : 't'));\n  if (n == MG_IO_ERR) return MG_IO_ERR;\n  if (was_throttled) return MG_IO_WAIT;  // sent throttled data instead\n  return (long) len;  // return len even when throttled, already encripted that\n}\n\nlong mg_tls_recv(struct mg_connection *c, void *buf, size_t len) {\n  int r = 0;\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf;\n  size_t minlen;\n\n  for (;;) {\n    r = mg_tls_recv_record(c);\n    if (r < 0) return r;\n    if (tls->content_type == MG_TLS_APP_DATA) break;\n    tls->recv_len = 0;\n    mg_tls_drop_record(c);\n  }\n\n  if (buf == NULL || len == 0) return 0L;\n  recv_buf = &c->rtls.buf[tls->recv_offset];\n  minlen = len < tls->recv_len ? len : tls->recv_len;\n  memmove(buf, recv_buf, minlen);\n  tls->recv_offset += minlen;\n  tls->recv_len -= minlen;\n  if (tls->recv_len == 0) mg_tls_drop_record(c);\n  return (long) minlen;\n}\n\nsize_t mg_tls_pending(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  return tls != NULL ? tls->recv_len : 0;\n}\n\nvoid mg_tls_flush(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  long n;\n  while (tls->send.len > 0 &&\n         (n = mg_io_send(c, tls->send.buf, tls->send.len)) > 0) {\n    mg_iobuf_del(&tls->send, 0, (size_t) n);\n  }\n}\n\nvoid mg_tls_ctx_init(struct mg_mgr *mgr) {\n  (void) mgr;\n}\n\nvoid mg_tls_ctx_free(struct mg_mgr *mgr) {\n  (void) mgr;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/tls_chacha20.c\"\n#endif\n// portable8439 v1.0.1\n// Source: https://github.com/DavyLandman/portable8439\n// Licensed under CC0-1.0\n// Contains poly1305-donna e6ad6e091d30d7f4ec2d4f978be1fcfcbce72781 (Public\n// Domain)\n\n\n\n\n#if MG_TLS == MG_TLS_BUILTIN\n// ******* BEGIN: chacha-portable/chacha-portable.h ********\n\n#if !defined(__cplusplus) && !defined(_MSC_VER) && \\\n    (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L)\n#error \"C99 or newer required\"\n#endif\n\n#define CHACHA20_KEY_SIZE (32)\n#define CHACHA20_NONCE_SIZE (12)\n\n#if defined(_MSC_VER) || defined(__cplusplus)\n// add restrict support\n#if ((defined(_MSC_VER) && _MSC_VER >= 1900) && !defined(__cplusplus)) || \\\n    defined(__clang__) || defined(__GNUC__)\n#define restrict __restrict\n#else\n#define restrict\n#endif\n#endif\n\n// xor data with a ChaCha20 keystream as per RFC8439\nstatic PORTABLE_8439_DECL void chacha20_xor_stream(\n    uint8_t *restrict dest, const uint8_t *restrict source, size_t length,\n    const uint8_t key[CHACHA20_KEY_SIZE],\n    const uint8_t nonce[CHACHA20_NONCE_SIZE], uint32_t counter);\n\nstatic PORTABLE_8439_DECL void rfc8439_keygen(\n    uint8_t poly_key[32], const uint8_t key[CHACHA20_KEY_SIZE],\n    const uint8_t nonce[CHACHA20_NONCE_SIZE]);\n\n// ******* END:   chacha-portable/chacha-portable.h ********\n// ******* BEGIN: poly1305-donna/poly1305-donna.h ********\n\n#include <stddef.h>\n\ntypedef struct poly1305_context {\n  size_t aligner;\n  unsigned char opaque[136];\n} poly1305_context;\n\nstatic PORTABLE_8439_DECL void poly1305_init(poly1305_context *ctx,\n                                             const unsigned char key[32]);\nstatic PORTABLE_8439_DECL void poly1305_update(poly1305_context *ctx,\n                                               const unsigned char *m,\n                                               size_t bytes);\nstatic PORTABLE_8439_DECL void poly1305_finish(poly1305_context *ctx,\n                                               unsigned char mac[16]);\n\n// ******* END:   poly1305-donna/poly1305-donna.h ********\n// ******* BEGIN: chacha-portable.c ********\n\n#include <assert.h>\n#include <string.h>\n\n// this is a fresh implementation of chacha20, based on the description in\n// rfc8349 it's such a nice compact algorithm that it is easy to do. In\n// relationship to other c implementation this implementation:\n//  - pure c99\n//  - big & little endian support\n//  - safe for architectures that don't support unaligned reads\n//\n// Next to this, we try to be fast as possible without resorting inline\n// assembly.\n\n// based on https://sourceforge.net/p/predef/wiki/Endianness/\n#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \\\n    __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__\n#define __HAVE_LITTLE_ENDIAN 1\n#elif defined(__LITTLE_ENDIAN__) || defined(__ARMEL__) ||                 \\\n    defined(__THUMBEL__) || defined(__AARCH64EL__) || defined(_MIPSEL) || \\\n    defined(__MIPSEL) || defined(__MIPSEL__) || defined(__XTENSA_EL__) || \\\n    defined(__AVR__)\n#define __HAVE_LITTLE_ENDIAN 1\n#endif\n// DO NOT test for LITTLE_ENDIAN, as it is defined as 1234 when including sys/types.h in GCC\n\n#ifndef TEST_SLOW_PATH\n#if defined(__HAVE_LITTLE_ENDIAN)\n#define FAST_PATH\n#endif\n#endif\n\n#define CHACHA20_STATE_WORDS (16)\n#define CHACHA20_BLOCK_SIZE (CHACHA20_STATE_WORDS * sizeof(uint32_t))\n\n#ifdef FAST_PATH\n#define store_32_le(target, source) memcpy(&(target), source, sizeof(uint32_t))\n#else\n#define store_32_le(target, source)                                 \\\n  target = (uint32_t) (source)[0] | ((uint32_t) (source)[1]) << 8 | \\\n           ((uint32_t) (source)[2]) << 16 | ((uint32_t) (source)[3]) << 24\n#endif\n\nstatic void initialize_state(uint32_t state[CHACHA20_STATE_WORDS],\n                             const uint8_t key[CHACHA20_KEY_SIZE],\n                             const uint8_t nonce[CHACHA20_NONCE_SIZE],\n                             uint32_t counter) {\n#if 0\n#ifdef static_assert\n  static_assert(sizeof(uint32_t) == 4,\n                \"We don't support systems that do not conform to standard of \"\n                \"uint32_t being exact 32bit wide\");\n#endif\n#endif\n  state[0] = 0x61707865;\n  state[1] = 0x3320646e;\n  state[2] = 0x79622d32;\n  state[3] = 0x6b206574;\n  store_32_le(state[4], key);\n  store_32_le(state[5], key + 4);\n  store_32_le(state[6], key + 8);\n  store_32_le(state[7], key + 12);\n  store_32_le(state[8], key + 16);\n  store_32_le(state[9], key + 20);\n  store_32_le(state[10], key + 24);\n  store_32_le(state[11], key + 28);\n  state[12] = counter;\n  store_32_le(state[13], nonce);\n  store_32_le(state[14], nonce + 4);\n  store_32_le(state[15], nonce + 8);\n}\n\n#define increment_counter(state) (state)[12]++\n\n// source: http://blog.regehr.org/archives/1063\n#define rotl32a(x, n) ((x) << (n)) | ((x) >> (32 - (n)))\n\n#define Qround(a, b, c, d) \\\n  a += b;                  \\\n  d ^= a;                  \\\n  d = rotl32a(d, 16);      \\\n  c += d;                  \\\n  b ^= c;                  \\\n  b = rotl32a(b, 12);      \\\n  a += b;                  \\\n  d ^= a;                  \\\n  d = rotl32a(d, 8);       \\\n  c += d;                  \\\n  b ^= c;                  \\\n  b = rotl32a(b, 7);\n\n#define TIMES16(x)                                                          \\\n  x(0) x(1) x(2) x(3) x(4) x(5) x(6) x(7) x(8) x(9) x(10) x(11) x(12) x(13) \\\n      x(14) x(15)\n\nstatic void core_block(const uint32_t *restrict start,\n                       uint32_t *restrict output) {\n  int i;\n// instead of working on the output array,\n// we let the compiler allocate 16 local variables on the stack\n#define __LV(i) uint32_t __t##i = start[i];\n  TIMES16(__LV)\n\n#define __Q(a, b, c, d) Qround(__t##a, __t##b, __t##c, __t##d)\n\n  for (i = 0; i < 10; i++) {\n    __Q(0, 4, 8, 12);\n    __Q(1, 5, 9, 13);\n    __Q(2, 6, 10, 14);\n    __Q(3, 7, 11, 15);\n    __Q(0, 5, 10, 15);\n    __Q(1, 6, 11, 12);\n    __Q(2, 7, 8, 13);\n    __Q(3, 4, 9, 14);\n  }\n\n#define __FIN(i) output[i] = start[i] + __t##i;\n  TIMES16(__FIN)\n}\n\n#define U8(x) ((uint8_t) ((x) &0xFF))\n\n#ifdef FAST_PATH\n#define xor32_le(dst, src, pad)            \\\n  uint32_t __value;                        \\\n  memcpy(&__value, src, sizeof(uint32_t)); \\\n  __value ^= *(pad);                       \\\n  memcpy(dst, &__value, sizeof(uint32_t));\n#else\n#define xor32_le(dst, src, pad)           \\\n  (dst)[0] = (src)[0] ^ U8(*(pad));       \\\n  (dst)[1] = (src)[1] ^ U8(*(pad) >> 8);  \\\n  (dst)[2] = (src)[2] ^ U8(*(pad) >> 16); \\\n  (dst)[3] = (src)[3] ^ U8(*(pad) >> 24);\n#endif\n\n#define index8_32(a, ix) ((a) + ((ix) * sizeof(uint32_t)))\n\n#define xor32_blocks(dest, source, pad, words)                    \\\n  for (i = 0; i < words; i++) {                                   \\\n    xor32_le(index8_32(dest, i), index8_32(source, i), (pad) + i) \\\n  }\n\nstatic void xor_block(uint8_t *restrict dest, const uint8_t *restrict source,\n                      const uint32_t *restrict pad, unsigned int chunk_size) {\n  unsigned int i, full_blocks = chunk_size / (unsigned int) sizeof(uint32_t);\n  // have to be carefull, we are going back from uint32 to uint8, so endianness\n  // matters again\n  xor32_blocks(dest, source, pad, full_blocks)\n\n      dest += full_blocks * sizeof(uint32_t);\n  source += full_blocks * sizeof(uint32_t);\n  pad += full_blocks;\n\n  switch (chunk_size % sizeof(uint32_t)) {\n    case 1:\n      dest[0] = source[0] ^ U8(*pad);\n      break;\n    case 2:\n      dest[0] = source[0] ^ U8(*pad);\n      dest[1] = source[1] ^ U8(*pad >> 8);\n      break;\n    case 3:\n      dest[0] = source[0] ^ U8(*pad);\n      dest[1] = source[1] ^ U8(*pad >> 8);\n      dest[2] = source[2] ^ U8(*pad >> 16);\n      break;\n  }\n}\n\nstatic void chacha20_xor_stream(uint8_t *restrict dest,\n                                const uint8_t *restrict source, size_t length,\n                                const uint8_t key[CHACHA20_KEY_SIZE],\n                                const uint8_t nonce[CHACHA20_NONCE_SIZE],\n                                uint32_t counter) {\n  uint32_t state[CHACHA20_STATE_WORDS];\n  uint32_t pad[CHACHA20_STATE_WORDS];\n  size_t i, b, last_block, full_blocks = length / CHACHA20_BLOCK_SIZE;\n  initialize_state(state, key, nonce, counter);\n  for (b = 0; b < full_blocks; b++) {\n    core_block(state, pad);\n    increment_counter(state);\n    xor32_blocks(dest, source, pad, CHACHA20_STATE_WORDS) dest +=\n        CHACHA20_BLOCK_SIZE;\n    source += CHACHA20_BLOCK_SIZE;\n  }\n  last_block = length % CHACHA20_BLOCK_SIZE;\n  if (last_block > 0) {\n    core_block(state, pad);\n    xor_block(dest, source, pad, (unsigned int) last_block);\n  }\n}\n\n#ifdef FAST_PATH\n#define serialize(poly_key, result) memcpy(poly_key, result, 32)\n#else\n#define store32_le(target, source)   \\\n  (target)[0] = U8(*(source));       \\\n  (target)[1] = U8(*(source) >> 8);  \\\n  (target)[2] = U8(*(source) >> 16); \\\n  (target)[3] = U8(*(source) >> 24);\n\n#define serialize(poly_key, result)                 \\\n  for (i = 0; i < 32 / sizeof(uint32_t); i++) {     \\\n    store32_le(index8_32(poly_key, i), result + i); \\\n  }\n#endif\n\nstatic void rfc8439_keygen(uint8_t poly_key[32],\n                           const uint8_t key[CHACHA20_KEY_SIZE],\n                           const uint8_t nonce[CHACHA20_NONCE_SIZE]) {\n  uint32_t state[CHACHA20_STATE_WORDS];\n  uint32_t result[CHACHA20_STATE_WORDS];\n  size_t i;\n  initialize_state(state, key, nonce, 0);\n  core_block(state, result);\n  serialize(poly_key, result);\n  (void) i;\n}\n// ******* END: chacha-portable.c ********\n// ******* BEGIN: poly1305-donna.c ********\n\n/* auto detect between 32bit / 64bit */\n#if /* uint128 available on 64bit system*/                              \\\n    (defined(__SIZEOF_INT128__) &&                                      \\\n     defined(__LP64__))                       /* MSVC 64bit compiler */ \\\n    || (defined(_MSC_VER) && defined(_M_X64)) /* gcc >= 4.4 64bit */    \\\n    || (defined(__GNUC__) && defined(__LP64__) &&                       \\\n        ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4))))\n#define __GUESS64\n#else\n#define __GUESS32\n#endif\n\n#if defined(POLY1305_8BIT)\n/*\n        poly1305 implementation using 8 bit * 8 bit = 16 bit multiplication and\n32 bit addition\n\n        based on the public domain reference version in supercop by djb\nstatic */\n\n#if defined(_MSC_VER) && _MSC_VER < 1700\n#define POLY1305_NOINLINE\n#elif defined(_MSC_VER)\n#define POLY1305_NOINLINE __declspec(noinline)\n#elif defined(__GNUC__)\n#define POLY1305_NOINLINE __attribute__((noinline))\n#else\n#define POLY1305_NOINLINE\n#endif\n\n#define poly1305_block_size 16\n\n/* 17 + sizeof(size_t) + 51*sizeof(unsigned char) */\ntypedef struct poly1305_state_internal_t {\n  unsigned char buffer[poly1305_block_size];\n  size_t leftover;\n  unsigned char h[17];\n  unsigned char r[17];\n  unsigned char pad[17];\n  unsigned char final;\n} poly1305_state_internal_t;\n\nstatic void poly1305_init(poly1305_context *ctx, const unsigned char key[32]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  size_t i;\n\n  st->leftover = 0;\n\n  /* h = 0 */\n  for (i = 0; i < 17; i++) st->h[i] = 0;\n\n  /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */\n  st->r[0] = key[0] & 0xff;\n  st->r[1] = key[1] & 0xff;\n  st->r[2] = key[2] & 0xff;\n  st->r[3] = key[3] & 0x0f;\n  st->r[4] = key[4] & 0xfc;\n  st->r[5] = key[5] & 0xff;\n  st->r[6] = key[6] & 0xff;\n  st->r[7] = key[7] & 0x0f;\n  st->r[8] = key[8] & 0xfc;\n  st->r[9] = key[9] & 0xff;\n  st->r[10] = key[10] & 0xff;\n  st->r[11] = key[11] & 0x0f;\n  st->r[12] = key[12] & 0xfc;\n  st->r[13] = key[13] & 0xff;\n  st->r[14] = key[14] & 0xff;\n  st->r[15] = key[15] & 0x0f;\n  st->r[16] = 0;\n\n  /* save pad for later */\n  for (i = 0; i < 16; i++) st->pad[i] = key[i + 16];\n  st->pad[16] = 0;\n\n  st->final = 0;\n}\n\nstatic void poly1305_add(unsigned char h[17], const unsigned char c[17]) {\n  unsigned short u;\n  unsigned int i;\n  for (u = 0, i = 0; i < 17; i++) {\n    u += (unsigned short) h[i] + (unsigned short) c[i];\n    h[i] = (unsigned char) u & 0xff;\n    u >>= 8;\n  }\n}\n\nstatic void poly1305_squeeze(unsigned char h[17], unsigned long hr[17]) {\n  unsigned long u;\n  unsigned int i;\n  u = 0;\n  for (i = 0; i < 16; i++) {\n    u += hr[i];\n    h[i] = (unsigned char) u & 0xff;\n    u >>= 8;\n  }\n  u += hr[16];\n  h[16] = (unsigned char) u & 0x03;\n  u >>= 2;\n  u += (u << 2); /* u *= 5; */\n  for (i = 0; i < 16; i++) {\n    u += h[i];\n    h[i] = (unsigned char) u & 0xff;\n    u >>= 8;\n  }\n  h[16] += (unsigned char) u;\n}\n\nstatic void poly1305_freeze(unsigned char h[17]) {\n  const unsigned char minusp[17] = {0x05, 0x00, 0x00, 0x00, 0x00, 0x00,\n                                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n                                    0x00, 0x00, 0x00, 0x00, 0xfc};\n  unsigned char horig[17], negative;\n  unsigned int i;\n\n  /* compute h + -p */\n  for (i = 0; i < 17; i++) horig[i] = h[i];\n  poly1305_add(h, minusp);\n\n  /* select h if h < p, or h + -p if h >= p */\n  negative = -(h[16] >> 7);\n  for (i = 0; i < 17; i++) h[i] ^= negative & (horig[i] ^ h[i]);\n}\n\nstatic void poly1305_blocks(poly1305_state_internal_t *st,\n                            const unsigned char *m, size_t bytes) {\n  const unsigned char hibit = st->final ^ 1; /* 1 << 128 */\n\n  while (bytes >= poly1305_block_size) {\n    unsigned long hr[17], u;\n    unsigned char c[17];\n    unsigned int i, j;\n\n    /* h += m */\n    for (i = 0; i < 16; i++) c[i] = m[i];\n    c[16] = hibit;\n    poly1305_add(st->h, c);\n\n    /* h *= r */\n    for (i = 0; i < 17; i++) {\n      u = 0;\n      for (j = 0; j <= i; j++) {\n        u += (unsigned short) st->h[j] * st->r[i - j];\n      }\n      for (j = i + 1; j < 17; j++) {\n        unsigned long v = (unsigned short) st->h[j] * st->r[i + 17 - j];\n        v = ((v << 8) + (v << 6)); /* v *= (5 << 6); */\n        u += v;\n      }\n      hr[i] = u;\n    }\n\n    /* (partial) h %= p */\n    poly1305_squeeze(st->h, hr);\n\n    m += poly1305_block_size;\n    bytes -= poly1305_block_size;\n  }\n}\n\nstatic POLY1305_NOINLINE void poly1305_finish(poly1305_context *ctx,\n                                              unsigned char mac[16]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  size_t i;\n\n  /* process the remaining block */\n  if (st->leftover) {\n    size_t i = st->leftover;\n    st->buffer[i++] = 1;\n    for (; i < poly1305_block_size; i++) st->buffer[i] = 0;\n    st->final = 1;\n    poly1305_blocks(st, st->buffer, poly1305_block_size);\n  }\n\n  /* fully reduce h */\n  poly1305_freeze(st->h);\n\n  /* h = (h + pad) % (1 << 128) */\n  poly1305_add(st->h, st->pad);\n  for (i = 0; i < 16; i++) mac[i] = st->h[i];\n\n  /* zero out the state */\n  for (i = 0; i < 17; i++) st->h[i] = 0;\n  for (i = 0; i < 17; i++) st->r[i] = 0;\n  for (i = 0; i < 17; i++) st->pad[i] = 0;\n}\n#elif defined(POLY1305_16BIT)\n/*\n        poly1305 implementation using 16 bit * 16 bit = 32 bit multiplication\nand 32 bit addition static */\n\n#if defined(_MSC_VER) && _MSC_VER < 1700\n#define POLY1305_NOINLINE\n#elif defined(_MSC_VER)\n#define POLY1305_NOINLINE __declspec(noinline)\n#elif defined(__GNUC__)\n#define POLY1305_NOINLINE __attribute__((noinline))\n#else\n#define POLY1305_NOINLINE\n#endif\n\n#define poly1305_block_size 16\n\n/* 17 + sizeof(size_t) + 18*sizeof(unsigned short) */\ntypedef struct poly1305_state_internal_t {\n  unsigned char buffer[poly1305_block_size];\n  size_t leftover;\n  unsigned short r[10];\n  unsigned short h[10];\n  unsigned short pad[8];\n  unsigned char final;\n} poly1305_state_internal_t;\n\n/* interpret two 8 bit unsigned integers as a 16 bit unsigned integer in little\n * endian */\nstatic unsigned short U8TO16(const unsigned char *p) {\n  return (((unsigned short) (p[0] & 0xff)) |\n          ((unsigned short) (p[1] & 0xff) << 8));\n}\n\n/* store a 16 bit unsigned integer as two 8 bit unsigned integers in little\n * endian */\nstatic void U16TO8(unsigned char *p, unsigned short v) {\n  p[0] = (v) &0xff;\n  p[1] = (v >> 8) & 0xff;\n}\n\nstatic void poly1305_init(poly1305_context *ctx, const unsigned char key[32]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  unsigned short t0, t1, t2, t3, t4, t5, t6, t7;\n  size_t i;\n\n  /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */\n  t0 = U8TO16(&key[0]);\n  st->r[0] = (t0) &0x1fff;\n  t1 = U8TO16(&key[2]);\n  st->r[1] = ((t0 >> 13) | (t1 << 3)) & 0x1fff;\n  t2 = U8TO16(&key[4]);\n  st->r[2] = ((t1 >> 10) | (t2 << 6)) & 0x1f03;\n  t3 = U8TO16(&key[6]);\n  st->r[3] = ((t2 >> 7) | (t3 << 9)) & 0x1fff;\n  t4 = U8TO16(&key[8]);\n  st->r[4] = ((t3 >> 4) | (t4 << 12)) & 0x00ff;\n  st->r[5] = ((t4 >> 1)) & 0x1ffe;\n  t5 = U8TO16(&key[10]);\n  st->r[6] = ((t4 >> 14) | (t5 << 2)) & 0x1fff;\n  t6 = U8TO16(&key[12]);\n  st->r[7] = ((t5 >> 11) | (t6 << 5)) & 0x1f81;\n  t7 = U8TO16(&key[14]);\n  st->r[8] = ((t6 >> 8) | (t7 << 8)) & 0x1fff;\n  st->r[9] = ((t7 >> 5)) & 0x007f;\n\n  /* h = 0 */\n  for (i = 0; i < 10; i++) st->h[i] = 0;\n\n  /* save pad for later */\n  for (i = 0; i < 8; i++) st->pad[i] = U8TO16(&key[16 + (2 * i)]);\n\n  st->leftover = 0;\n  st->final = 0;\n}\n\nstatic void poly1305_blocks(poly1305_state_internal_t *st,\n                            const unsigned char *m, size_t bytes) {\n  const unsigned short hibit = (st->final) ? 0 : (1 << 11); /* 1 << 128 */\n  unsigned short t0, t1, t2, t3, t4, t5, t6, t7;\n  unsigned long d[10];\n  unsigned long c;\n\n  while (bytes >= poly1305_block_size) {\n    size_t i, j;\n\n    /* h += m[i] */\n    t0 = U8TO16(&m[0]);\n    st->h[0] += (t0) &0x1fff;\n    t1 = U8TO16(&m[2]);\n    st->h[1] += ((t0 >> 13) | (t1 << 3)) & 0x1fff;\n    t2 = U8TO16(&m[4]);\n    st->h[2] += ((t1 >> 10) | (t2 << 6)) & 0x1fff;\n    t3 = U8TO16(&m[6]);\n    st->h[3] += ((t2 >> 7) | (t3 << 9)) & 0x1fff;\n    t4 = U8TO16(&m[8]);\n    st->h[4] += ((t3 >> 4) | (t4 << 12)) & 0x1fff;\n    st->h[5] += ((t4 >> 1)) & 0x1fff;\n    t5 = U8TO16(&m[10]);\n    st->h[6] += ((t4 >> 14) | (t5 << 2)) & 0x1fff;\n    t6 = U8TO16(&m[12]);\n    st->h[7] += ((t5 >> 11) | (t6 << 5)) & 0x1fff;\n    t7 = U8TO16(&m[14]);\n    st->h[8] += ((t6 >> 8) | (t7 << 8)) & 0x1fff;\n    st->h[9] += ((t7 >> 5)) | hibit;\n\n    /* h *= r, (partial) h %= p */\n    for (i = 0, c = 0; i < 10; i++) {\n      d[i] = c;\n      for (j = 0; j < 10; j++) {\n        d[i] += (unsigned long) st->h[j] *\n                ((j <= i) ? st->r[i - j] : (5 * st->r[i + 10 - j]));\n        /* Sum(h[i] * r[i] * 5) will overflow slightly above 6 products with an\n         * unclamped r, so carry at 5 */\n        if (j == 4) {\n          c = (d[i] >> 13);\n          d[i] &= 0x1fff;\n        }\n      }\n      c += (d[i] >> 13);\n      d[i] &= 0x1fff;\n    }\n    c = ((c << 2) + c); /* c *= 5 */\n    c += d[0];\n    d[0] = ((unsigned short) c & 0x1fff);\n    c = (c >> 13);\n    d[1] += c;\n\n    for (i = 0; i < 10; i++) st->h[i] = (unsigned short) d[i];\n\n    m += poly1305_block_size;\n    bytes -= poly1305_block_size;\n  }\n}\n\nstatic POLY1305_NOINLINE void poly1305_finish(poly1305_context *ctx,\n                                              unsigned char mac[16]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  unsigned short c;\n  unsigned short g[10];\n  unsigned short mask;\n  unsigned long f;\n  size_t i;\n\n  /* process the remaining block */\n  if (st->leftover) {\n    size_t i = st->leftover;\n    st->buffer[i++] = 1;\n    for (; i < poly1305_block_size; i++) st->buffer[i] = 0;\n    st->final = 1;\n    poly1305_blocks(st, st->buffer, poly1305_block_size);\n  }\n\n  /* fully carry h */\n  c = st->h[1] >> 13;\n  st->h[1] &= 0x1fff;\n  for (i = 2; i < 10; i++) {\n    st->h[i] += c;\n    c = st->h[i] >> 13;\n    st->h[i] &= 0x1fff;\n  }\n  st->h[0] += (c * 5);\n  c = st->h[0] >> 13;\n  st->h[0] &= 0x1fff;\n  st->h[1] += c;\n  c = st->h[1] >> 13;\n  st->h[1] &= 0x1fff;\n  st->h[2] += c;\n\n  /* compute h + -p */\n  g[0] = st->h[0] + 5;\n  c = g[0] >> 13;\n  g[0] &= 0x1fff;\n  for (i = 1; i < 10; i++) {\n    g[i] = st->h[i] + c;\n    c = g[i] >> 13;\n    g[i] &= 0x1fff;\n  }\n\n  /* select h if h < p, or h + -p if h >= p */\n  mask = (c ^ 1) - 1;\n  for (i = 0; i < 10; i++) g[i] &= mask;\n  mask = ~mask;\n  for (i = 0; i < 10; i++) st->h[i] = (st->h[i] & mask) | g[i];\n\n  /* h = h % (2^128) */\n  st->h[0] = ((st->h[0]) | (st->h[1] << 13)) & 0xffff;\n  st->h[1] = ((st->h[1] >> 3) | (st->h[2] << 10)) & 0xffff;\n  st->h[2] = ((st->h[2] >> 6) | (st->h[3] << 7)) & 0xffff;\n  st->h[3] = ((st->h[3] >> 9) | (st->h[4] << 4)) & 0xffff;\n  st->h[4] = ((st->h[4] >> 12) | (st->h[5] << 1) | (st->h[6] << 14)) & 0xffff;\n  st->h[5] = ((st->h[6] >> 2) | (st->h[7] << 11)) & 0xffff;\n  st->h[6] = ((st->h[7] >> 5) | (st->h[8] << 8)) & 0xffff;\n  st->h[7] = ((st->h[8] >> 8) | (st->h[9] << 5)) & 0xffff;\n\n  /* mac = (h + pad) % (2^128) */\n  f = (unsigned long) st->h[0] + st->pad[0];\n  st->h[0] = (unsigned short) f;\n  for (i = 1; i < 8; i++) {\n    f = (unsigned long) st->h[i] + st->pad[i] + (f >> 16);\n    st->h[i] = (unsigned short) f;\n  }\n\n  for (i = 0; i < 8; i++) U16TO8(mac + (i * 2), st->h[i]);\n\n  /* zero out the state */\n  for (i = 0; i < 10; i++) st->h[i] = 0;\n  for (i = 0; i < 10; i++) st->r[i] = 0;\n  for (i = 0; i < 8; i++) st->pad[i] = 0;\n}\n#elif defined(POLY1305_32BIT) || \\\n    (!defined(POLY1305_64BIT) && defined(__GUESS32))\n/*\n        poly1305 implementation using 32 bit * 32 bit = 64 bit multiplication\nand 64 bit addition static */\n\n#if defined(_MSC_VER) && _MSC_VER < 1700\n#define POLY1305_NOINLINE\n#elif defined(_MSC_VER)\n#define POLY1305_NOINLINE __declspec(noinline)\n#elif defined(__GNUC__)\n#define POLY1305_NOINLINE __attribute__((noinline))\n#else\n#define POLY1305_NOINLINE\n#endif\n\n#define poly1305_block_size 16\n\n/* 17 + sizeof(size_t) + 14*sizeof(unsigned long) */\ntypedef struct poly1305_state_internal_t {\n  unsigned long r[5];\n  unsigned long h[5];\n  unsigned long pad[4];\n  size_t leftover;\n  unsigned char buffer[poly1305_block_size];\n  unsigned char final;\n} poly1305_state_internal_t;\n\n/* interpret four 8 bit unsigned integers as a 32 bit unsigned integer in little\n * endian */\nstatic unsigned long U8TO32(const unsigned char *p) {\n  return (((unsigned long) (p[0] & 0xff)) |\n          ((unsigned long) (p[1] & 0xff) << 8) |\n          ((unsigned long) (p[2] & 0xff) << 16) |\n          ((unsigned long) (p[3] & 0xff) << 24));\n}\n\n/* store a 32 bit unsigned integer as four 8 bit unsigned integers in little\n * endian */\nstatic void U32TO8(unsigned char *p, unsigned long v) {\n  p[0] = (unsigned char) ((v) &0xff);\n  p[1] = (unsigned char) ((v >> 8) & 0xff);\n  p[2] = (unsigned char) ((v >> 16) & 0xff);\n  p[3] = (unsigned char) ((v >> 24) & 0xff);\n}\n\nstatic void poly1305_init(poly1305_context *ctx, const unsigned char key[32]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n\n  /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */\n  st->r[0] = (U8TO32(&key[0])) & 0x3ffffff;\n  st->r[1] = (U8TO32(&key[3]) >> 2) & 0x3ffff03;\n  st->r[2] = (U8TO32(&key[6]) >> 4) & 0x3ffc0ff;\n  st->r[3] = (U8TO32(&key[9]) >> 6) & 0x3f03fff;\n  st->r[4] = (U8TO32(&key[12]) >> 8) & 0x00fffff;\n\n  /* h = 0 */\n  st->h[0] = 0;\n  st->h[1] = 0;\n  st->h[2] = 0;\n  st->h[3] = 0;\n  st->h[4] = 0;\n\n  /* save pad for later */\n  st->pad[0] = U8TO32(&key[16]);\n  st->pad[1] = U8TO32(&key[20]);\n  st->pad[2] = U8TO32(&key[24]);\n  st->pad[3] = U8TO32(&key[28]);\n\n  st->leftover = 0;\n  st->final = 0;\n}\n\nstatic void poly1305_blocks(poly1305_state_internal_t *st,\n                            const unsigned char *m, size_t bytes) {\n  const unsigned long hibit = (st->final) ? 0 : (1UL << 24); /* 1 << 128 */\n  unsigned long r0, r1, r2, r3, r4;\n  unsigned long s1, s2, s3, s4;\n  unsigned long h0, h1, h2, h3, h4;\n  uint64_t d0, d1, d2, d3, d4;\n  unsigned long c;\n\n  r0 = st->r[0];\n  r1 = st->r[1];\n  r2 = st->r[2];\n  r3 = st->r[3];\n  r4 = st->r[4];\n\n  s1 = r1 * 5;\n  s2 = r2 * 5;\n  s3 = r3 * 5;\n  s4 = r4 * 5;\n\n  h0 = st->h[0];\n  h1 = st->h[1];\n  h2 = st->h[2];\n  h3 = st->h[3];\n  h4 = st->h[4];\n\n  while (bytes >= poly1305_block_size) {\n    /* h += m[i] */\n    h0 += (U8TO32(m + 0)) & 0x3ffffff;\n    h1 += (U8TO32(m + 3) >> 2) & 0x3ffffff;\n    h2 += (U8TO32(m + 6) >> 4) & 0x3ffffff;\n    h3 += (U8TO32(m + 9) >> 6) & 0x3ffffff;\n    h4 += (U8TO32(m + 12) >> 8) | hibit;\n\n    /* h *= r */\n    d0 = ((uint64_t) h0 * r0) + ((uint64_t) h1 * s4) + ((uint64_t) h2 * s3) +\n         ((uint64_t) h3 * s2) + ((uint64_t) h4 * s1);\n    d1 = ((uint64_t) h0 * r1) + ((uint64_t) h1 * r0) + ((uint64_t) h2 * s4) +\n         ((uint64_t) h3 * s3) + ((uint64_t) h4 * s2);\n    d2 = ((uint64_t) h0 * r2) + ((uint64_t) h1 * r1) + ((uint64_t) h2 * r0) +\n         ((uint64_t) h3 * s4) + ((uint64_t) h4 * s3);\n    d3 = ((uint64_t) h0 * r3) + ((uint64_t) h1 * r2) + ((uint64_t) h2 * r1) +\n         ((uint64_t) h3 * r0) + ((uint64_t) h4 * s4);\n    d4 = ((uint64_t) h0 * r4) + ((uint64_t) h1 * r3) + ((uint64_t) h2 * r2) +\n         ((uint64_t) h3 * r1) + ((uint64_t) h4 * r0);\n\n    /* (partial) h %= p */\n    c = (unsigned long) (d0 >> 26);\n    h0 = (unsigned long) d0 & 0x3ffffff;\n    d1 += c;\n    c = (unsigned long) (d1 >> 26);\n    h1 = (unsigned long) d1 & 0x3ffffff;\n    d2 += c;\n    c = (unsigned long) (d2 >> 26);\n    h2 = (unsigned long) d2 & 0x3ffffff;\n    d3 += c;\n    c = (unsigned long) (d3 >> 26);\n    h3 = (unsigned long) d3 & 0x3ffffff;\n    d4 += c;\n    c = (unsigned long) (d4 >> 26);\n    h4 = (unsigned long) d4 & 0x3ffffff;\n    h0 += c * 5;\n    c = (h0 >> 26);\n    h0 = h0 & 0x3ffffff;\n    h1 += c;\n\n    m += poly1305_block_size;\n    bytes -= poly1305_block_size;\n  }\n\n  st->h[0] = h0;\n  st->h[1] = h1;\n  st->h[2] = h2;\n  st->h[3] = h3;\n  st->h[4] = h4;\n}\n\nstatic POLY1305_NOINLINE void poly1305_finish(poly1305_context *ctx,\n                                              unsigned char mac[16]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  unsigned long h0, h1, h2, h3, h4, c;\n  unsigned long g0, g1, g2, g3, g4;\n  uint64_t f;\n  unsigned long mask;\n\n  /* process the remaining block */\n  if (st->leftover) {\n    size_t i = st->leftover;\n    st->buffer[i++] = 1;\n    for (; i < poly1305_block_size; i++) st->buffer[i] = 0;\n    st->final = 1;\n    poly1305_blocks(st, st->buffer, poly1305_block_size);\n  }\n\n  /* fully carry h */\n  h0 = st->h[0];\n  h1 = st->h[1];\n  h2 = st->h[2];\n  h3 = st->h[3];\n  h4 = st->h[4];\n\n  c = h1 >> 26;\n  h1 = h1 & 0x3ffffff;\n  h2 += c;\n  c = h2 >> 26;\n  h2 = h2 & 0x3ffffff;\n  h3 += c;\n  c = h3 >> 26;\n  h3 = h3 & 0x3ffffff;\n  h4 += c;\n  c = h4 >> 26;\n  h4 = h4 & 0x3ffffff;\n  h0 += c * 5;\n  c = h0 >> 26;\n  h0 = h0 & 0x3ffffff;\n  h1 += c;\n\n  /* compute h + -p */\n  g0 = h0 + 5;\n  c = g0 >> 26;\n  g0 &= 0x3ffffff;\n  g1 = h1 + c;\n  c = g1 >> 26;\n  g1 &= 0x3ffffff;\n  g2 = h2 + c;\n  c = g2 >> 26;\n  g2 &= 0x3ffffff;\n  g3 = h3 + c;\n  c = g3 >> 26;\n  g3 &= 0x3ffffff;\n  g4 = h4 + c - (1UL << 26);\n\n  /* select h if h < p, or h + -p if h >= p */\n  mask = (g4 >> ((sizeof(unsigned long) * 8) - 1)) - 1;\n  g0 &= mask;\n  g1 &= mask;\n  g2 &= mask;\n  g3 &= mask;\n  g4 &= mask;\n  mask = ~mask;\n  h0 = (h0 & mask) | g0;\n  h1 = (h1 & mask) | g1;\n  h2 = (h2 & mask) | g2;\n  h3 = (h3 & mask) | g3;\n  h4 = (h4 & mask) | g4;\n\n  /* h = h % (2^128) */\n  h0 = ((h0) | (h1 << 26)) & 0xffffffff;\n  h1 = ((h1 >> 6) | (h2 << 20)) & 0xffffffff;\n  h2 = ((h2 >> 12) | (h3 << 14)) & 0xffffffff;\n  h3 = ((h3 >> 18) | (h4 << 8)) & 0xffffffff;\n\n  /* mac = (h + pad) % (2^128) */\n  f = (uint64_t) h0 + st->pad[0];\n  h0 = (unsigned long) f;\n  f = (uint64_t) h1 + st->pad[1] + (f >> 32);\n  h1 = (unsigned long) f;\n  f = (uint64_t) h2 + st->pad[2] + (f >> 32);\n  h2 = (unsigned long) f;\n  f = (uint64_t) h3 + st->pad[3] + (f >> 32);\n  h3 = (unsigned long) f;\n\n  U32TO8(mac + 0, h0);\n  U32TO8(mac + 4, h1);\n  U32TO8(mac + 8, h2);\n  U32TO8(mac + 12, h3);\n\n  /* zero out the state */\n  st->h[0] = 0;\n  st->h[1] = 0;\n  st->h[2] = 0;\n  st->h[3] = 0;\n  st->h[4] = 0;\n  st->r[0] = 0;\n  st->r[1] = 0;\n  st->r[2] = 0;\n  st->r[3] = 0;\n  st->r[4] = 0;\n  st->pad[0] = 0;\n  st->pad[1] = 0;\n  st->pad[2] = 0;\n  st->pad[3] = 0;\n}\n\n#else\n/*\n        poly1305 implementation using 64 bit * 64 bit = 128 bit multiplication\nand 128 bit addition static */\n\n#if defined(_MSC_VER)\n\ntypedef struct uint128_t {\n  uint64_t lo;\n  uint64_t hi;\n} uint128_t;\n\n#define MUL128(out, x, y) out.lo = _umul128((x), (y), &out.hi)\n#define ADD(out, in)                \\\n  {                                 \\\n    uint64_t t = out.lo;            \\\n    out.lo += in.lo;                \\\n    out.hi += (out.lo < t) + in.hi; \\\n  }\n#define ADDLO(out, in)      \\\n  {                         \\\n    uint64_t t = out.lo;    \\\n    out.lo += in;           \\\n    out.hi += (out.lo < t); \\\n  }\n#define SHR(in, shift) (__shiftright128(in.lo, in.hi, (shift)))\n#define LO(in) (in.lo)\n\n#if defined(_MSC_VER) && _MSC_VER < 1700\n#define POLY1305_NOINLINE\n#else\n#define POLY1305_NOINLINE __declspec(noinline)\n#endif\n#elif defined(__GNUC__)\n#if defined(__SIZEOF_INT128__)\n// Get rid of GCC warning \"ISO C does not support '__int128' types\"\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wpedantic\"\ntypedef unsigned __int128 uint128_t;\n#pragma GCC diagnostic pop\n#else\ntypedef unsigned uint128_t __attribute__((mode(TI)));\n#endif\n\n#define MUL128(out, x, y) out = ((uint128_t) x * y)\n#define ADD(out, in) out += in\n#define ADDLO(out, in) out += in\n#define SHR(in, shift) (uint64_t)(in >> (shift))\n#define LO(in) (uint64_t)(in)\n\n#define POLY1305_NOINLINE __attribute__((noinline))\n#endif\n\n#define poly1305_block_size 16\n\n/* 17 + sizeof(size_t) + 8*sizeof(uint64_t) */\ntypedef struct poly1305_state_internal_t {\n  uint64_t r[3];\n  uint64_t h[3];\n  uint64_t pad[2];\n  size_t leftover;\n  unsigned char buffer[poly1305_block_size];\n  unsigned char final;\n} poly1305_state_internal_t;\n\n/* interpret eight 8 bit unsigned integers as a 64 bit unsigned integer in\n * little endian */\nstatic uint64_t U8TO64(const unsigned char *p) {\n  return (((uint64_t) (p[0] & 0xff)) | ((uint64_t) (p[1] & 0xff) << 8) |\n          ((uint64_t) (p[2] & 0xff) << 16) | ((uint64_t) (p[3] & 0xff) << 24) |\n          ((uint64_t) (p[4] & 0xff) << 32) | ((uint64_t) (p[5] & 0xff) << 40) |\n          ((uint64_t) (p[6] & 0xff) << 48) | ((uint64_t) (p[7] & 0xff) << 56));\n}\n\n/* store a 64 bit unsigned integer as eight 8 bit unsigned integers in little\n * endian */\nstatic void U64TO8(unsigned char *p, uint64_t v) {\n  p[0] = (unsigned char) ((v) &0xff);\n  p[1] = (unsigned char) ((v >> 8) & 0xff);\n  p[2] = (unsigned char) ((v >> 16) & 0xff);\n  p[3] = (unsigned char) ((v >> 24) & 0xff);\n  p[4] = (unsigned char) ((v >> 32) & 0xff);\n  p[5] = (unsigned char) ((v >> 40) & 0xff);\n  p[6] = (unsigned char) ((v >> 48) & 0xff);\n  p[7] = (unsigned char) ((v >> 56) & 0xff);\n}\n\nstatic void poly1305_init(poly1305_context *ctx, const unsigned char key[32]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  uint64_t t0, t1;\n\n  /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */\n  t0 = U8TO64(&key[0]);\n  t1 = U8TO64(&key[8]);\n\n  st->r[0] = (t0) &0xffc0fffffff;\n  st->r[1] = ((t0 >> 44) | (t1 << 20)) & 0xfffffc0ffff;\n  st->r[2] = ((t1 >> 24)) & 0x00ffffffc0f;\n\n  /* h = 0 */\n  st->h[0] = 0;\n  st->h[1] = 0;\n  st->h[2] = 0;\n\n  /* save pad for later */\n  st->pad[0] = U8TO64(&key[16]);\n  st->pad[1] = U8TO64(&key[24]);\n\n  st->leftover = 0;\n  st->final = 0;\n}\n\nstatic void poly1305_blocks(poly1305_state_internal_t *st,\n                            const unsigned char *m, size_t bytes) {\n  const uint64_t hibit = (st->final) ? 0 : ((uint64_t) 1 << 40); /* 1 << 128 */\n  uint64_t r0, r1, r2;\n  uint64_t s1, s2;\n  uint64_t h0, h1, h2;\n  uint64_t c;\n  uint128_t d0, d1, d2, d;\n\n  r0 = st->r[0];\n  r1 = st->r[1];\n  r2 = st->r[2];\n\n  h0 = st->h[0];\n  h1 = st->h[1];\n  h2 = st->h[2];\n\n  s1 = r1 * (5 << 2);\n  s2 = r2 * (5 << 2);\n\n  while (bytes >= poly1305_block_size) {\n    uint64_t t0, t1;\n\n    /* h += m[i] */\n    t0 = U8TO64(&m[0]);\n    t1 = U8TO64(&m[8]);\n\n    h0 += ((t0) &0xfffffffffff);\n    h1 += (((t0 >> 44) | (t1 << 20)) & 0xfffffffffff);\n    h2 += (((t1 >> 24)) & 0x3ffffffffff) | hibit;\n\n    /* h *= r */\n    MUL128(d0, h0, r0);\n    MUL128(d, h1, s2);\n    ADD(d0, d);\n    MUL128(d, h2, s1);\n    ADD(d0, d);\n    MUL128(d1, h0, r1);\n    MUL128(d, h1, r0);\n    ADD(d1, d);\n    MUL128(d, h2, s2);\n    ADD(d1, d);\n    MUL128(d2, h0, r2);\n    MUL128(d, h1, r1);\n    ADD(d2, d);\n    MUL128(d, h2, r0);\n    ADD(d2, d);\n\n    /* (partial) h %= p */\n    c = SHR(d0, 44);\n    h0 = LO(d0) & 0xfffffffffff;\n    ADDLO(d1, c);\n    c = SHR(d1, 44);\n    h1 = LO(d1) & 0xfffffffffff;\n    ADDLO(d2, c);\n    c = SHR(d2, 42);\n    h2 = LO(d2) & 0x3ffffffffff;\n    h0 += c * 5;\n    c = (h0 >> 44);\n    h0 = h0 & 0xfffffffffff;\n    h1 += c;\n\n    m += poly1305_block_size;\n    bytes -= poly1305_block_size;\n  }\n\n  st->h[0] = h0;\n  st->h[1] = h1;\n  st->h[2] = h2;\n}\n\nstatic POLY1305_NOINLINE void poly1305_finish(poly1305_context *ctx,\n                                              unsigned char mac[16]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  uint64_t h0, h1, h2, c;\n  uint64_t g0, g1, g2;\n  uint64_t t0, t1;\n\n  /* process the remaining block */\n  if (st->leftover) {\n    size_t i = st->leftover;\n    st->buffer[i] = 1;\n    for (i = i + 1; i < poly1305_block_size; i++) st->buffer[i] = 0;\n    st->final = 1;\n    poly1305_blocks(st, st->buffer, poly1305_block_size);\n  }\n\n  /* fully carry h */\n  h0 = st->h[0];\n  h1 = st->h[1];\n  h2 = st->h[2];\n\n  c = (h1 >> 44);\n  h1 &= 0xfffffffffff;\n  h2 += c;\n  c = (h2 >> 42);\n  h2 &= 0x3ffffffffff;\n  h0 += c * 5;\n  c = (h0 >> 44);\n  h0 &= 0xfffffffffff;\n  h1 += c;\n  c = (h1 >> 44);\n  h1 &= 0xfffffffffff;\n  h2 += c;\n  c = (h2 >> 42);\n  h2 &= 0x3ffffffffff;\n  h0 += c * 5;\n  c = (h0 >> 44);\n  h0 &= 0xfffffffffff;\n  h1 += c;\n\n  /* compute h + -p */\n  g0 = h0 + 5;\n  c = (g0 >> 44);\n  g0 &= 0xfffffffffff;\n  g1 = h1 + c;\n  c = (g1 >> 44);\n  g1 &= 0xfffffffffff;\n  g2 = h2 + c - ((uint64_t) 1 << 42);\n\n  /* select h if h < p, or h + -p if h >= p */\n  c = (g2 >> ((sizeof(uint64_t) * 8) - 1)) - 1;\n  g0 &= c;\n  g1 &= c;\n  g2 &= c;\n  c = ~c;\n  h0 = (h0 & c) | g0;\n  h1 = (h1 & c) | g1;\n  h2 = (h2 & c) | g2;\n\n  /* h = (h + pad) */\n  t0 = st->pad[0];\n  t1 = st->pad[1];\n\n  h0 += ((t0) &0xfffffffffff);\n  c = (h0 >> 44);\n  h0 &= 0xfffffffffff;\n  h1 += (((t0 >> 44) | (t1 << 20)) & 0xfffffffffff) + c;\n  c = (h1 >> 44);\n  h1 &= 0xfffffffffff;\n  h2 += (((t1 >> 24)) & 0x3ffffffffff) + c;\n  h2 &= 0x3ffffffffff;\n\n  /* mac = h % (2^128) */\n  h0 = ((h0) | (h1 << 44));\n  h1 = ((h1 >> 20) | (h2 << 24));\n\n  U64TO8(&mac[0], h0);\n  U64TO8(&mac[8], h1);\n\n  /* zero out the state */\n  st->h[0] = 0;\n  st->h[1] = 0;\n  st->h[2] = 0;\n  st->r[0] = 0;\n  st->r[1] = 0;\n  st->r[2] = 0;\n  st->pad[0] = 0;\n  st->pad[1] = 0;\n}\n\n#endif\n\nstatic void poly1305_update(poly1305_context *ctx, const unsigned char *m,\n                            size_t bytes) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  size_t i;\n\n  /* handle leftover */\n  if (st->leftover) {\n    size_t want = (poly1305_block_size - st->leftover);\n    if (want > bytes) want = bytes;\n    for (i = 0; i < want; i++) st->buffer[st->leftover + i] = m[i];\n    bytes -= want;\n    m += want;\n    st->leftover += want;\n    if (st->leftover < poly1305_block_size) return;\n    poly1305_blocks(st, st->buffer, poly1305_block_size);\n    st->leftover = 0;\n  }\n\n  /* process full blocks */\n  if (bytes >= poly1305_block_size) {\n    size_t want = (bytes & (size_t) ~(poly1305_block_size - 1));\n    poly1305_blocks(st, m, want);\n    m += want;\n    bytes -= want;\n  }\n\n  /* store leftover */\n  if (bytes) {\n    for (i = 0; i < bytes; i++) st->buffer[st->leftover + i] = m[i];\n    st->leftover += bytes;\n  }\n}\n\n// ******* END: poly1305-donna.c ********\n// ******* BEGIN: portable8439.c ********\n\n#define __CHACHA20_BLOCK_SIZE (64)\n#define __POLY1305_KEY_SIZE (32)\n\nstatic PORTABLE_8439_DECL uint8_t __ZEROES[16] = {0};\nstatic PORTABLE_8439_DECL void pad_if_needed(poly1305_context *ctx,\n                                             size_t size) {\n  size_t padding = size % 16;\n  if (padding != 0) {\n    poly1305_update(ctx, __ZEROES, 16 - padding);\n  }\n}\n\n#define __u8(v) ((uint8_t) ((v) &0xFF))\n\n// TODO: make this depending on the unaligned/native read size possible\nstatic PORTABLE_8439_DECL void write_64bit_int(poly1305_context *ctx,\n                                               uint64_t value) {\n  uint8_t result[8];\n  result[0] = __u8(value);\n  result[1] = __u8(value >> 8);\n  result[2] = __u8(value >> 16);\n  result[3] = __u8(value >> 24);\n  result[4] = __u8(value >> 32);\n  result[5] = __u8(value >> 40);\n  result[6] = __u8(value >> 48);\n  result[7] = __u8(value >> 56);\n  poly1305_update(ctx, result, 8);\n}\n\nstatic PORTABLE_8439_DECL void poly1305_calculate_mac(\n    uint8_t *mac, const uint8_t *cipher_text, size_t cipher_text_size,\n    const uint8_t key[RFC_8439_KEY_SIZE],\n    const uint8_t nonce[RFC_8439_NONCE_SIZE], const uint8_t *ad,\n    size_t ad_size) {\n  // init poly key (section 2.6)\n  uint8_t poly_key[__POLY1305_KEY_SIZE] = {0};\n  poly1305_context poly_ctx;\n  rfc8439_keygen(poly_key, key, nonce);\n  // start poly1305 mac\n  poly1305_init(&poly_ctx, poly_key);\n\n  if (ad != NULL && ad_size > 0) {\n    // write AD if present\n    poly1305_update(&poly_ctx, ad, ad_size);\n    pad_if_needed(&poly_ctx, ad_size);\n  }\n\n  // now write the cipher text\n  poly1305_update(&poly_ctx, cipher_text, cipher_text_size);\n  pad_if_needed(&poly_ctx, cipher_text_size);\n\n  // write sizes\n  write_64bit_int(&poly_ctx, ad_size);\n  write_64bit_int(&poly_ctx, cipher_text_size);\n\n  // calculate MAC\n  poly1305_finish(&poly_ctx, mac);\n}\n\n#define MG_PM(p) ((size_t) (p))\n\n// pointers overlap if the smaller either ahead of the end,\n// or its end is before the start of the other\n//\n// s_size should be smaller or equal to b_size\n#define MG_OVERLAPPING(s, s_size, b, b_size) \\\n  (MG_PM(s) < MG_PM((b) + (b_size))) && (MG_PM(b) < MG_PM((s) + (s_size)))\n\nPORTABLE_8439_DECL size_t mg_chacha20_poly1305_encrypt(\n    uint8_t *restrict cipher_text, const uint8_t key[RFC_8439_KEY_SIZE],\n    const uint8_t nonce[RFC_8439_NONCE_SIZE], const uint8_t *restrict ad,\n    size_t ad_size, const uint8_t *restrict plain_text,\n    size_t plain_text_size) {\n  size_t new_size = plain_text_size + RFC_8439_TAG_SIZE;\n  if (MG_OVERLAPPING(plain_text, plain_text_size, cipher_text, new_size)) {\n    return (size_t) -1;\n  }\n  chacha20_xor_stream(cipher_text, plain_text, plain_text_size, key, nonce, 1);\n  poly1305_calculate_mac(cipher_text + plain_text_size, cipher_text,\n                         plain_text_size, key, nonce, ad, ad_size);\n  return new_size;\n}\n\nPORTABLE_8439_DECL size_t mg_chacha20_poly1305_decrypt(\n    uint8_t *restrict plain_text, const uint8_t key[RFC_8439_KEY_SIZE],\n    const uint8_t nonce[RFC_8439_NONCE_SIZE],\n    const uint8_t *restrict cipher_text, size_t cipher_text_size) {\n  // first we calculate the mac and see if it lines up, only then do we decrypt\n  size_t actual_size = cipher_text_size - RFC_8439_TAG_SIZE;\n  if (MG_OVERLAPPING(plain_text, actual_size, cipher_text, cipher_text_size)) {\n    return (size_t) -1;\n  }\n\n  chacha20_xor_stream(plain_text, cipher_text, actual_size, key, nonce, 1);\n  return actual_size;\n}\n// ******* END:   portable8439.c ********\n#endif  // MG_TLS == MG_TLS_BUILTIN\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/tls_dummy.c\"\n#endif\n\n\n#if MG_TLS == MG_TLS_NONE\nvoid mg_tls_init(struct mg_connection *c, const struct mg_tls_opts *opts) {\n  (void) opts;\n  mg_error(c, \"TLS is not enabled\");\n}\nvoid mg_tls_handshake(struct mg_connection *c) {\n  (void) c;\n}\nvoid mg_tls_free(struct mg_connection *c) {\n  (void) c;\n}\nlong mg_tls_recv(struct mg_connection *c, void *buf, size_t len) {\n  return c == NULL || buf == NULL || len == 0 ? 0 : -1;\n}\nlong mg_tls_send(struct mg_connection *c, const void *buf, size_t len) {\n  return c == NULL || buf == NULL || len == 0 ? 0 : -1;\n}\nsize_t mg_tls_pending(struct mg_connection *c) {\n  (void) c;\n  return 0;\n}\nvoid mg_tls_flush(struct mg_connection *c) {\n  (void) c;\n}\nvoid mg_tls_ctx_init(struct mg_mgr *mgr) {\n  (void) mgr;\n}\nvoid mg_tls_ctx_free(struct mg_mgr *mgr) {\n  (void) mgr;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/tls_mbed.c\"\n#endif\n\n\n\n\n\n\n#if MG_TLS == MG_TLS_MBED\n\n#if defined(MBEDTLS_VERSION_NUMBER) && MBEDTLS_VERSION_NUMBER >= 0x03000000 && \\\n    MBEDTLS_VERSION_NUMBER < 0x04000000\n#define MG_MBEDTLS_RNG_GET , mg_mbed_rng, NULL\n#else\n#define MG_MBEDTLS_RNG_GET\n#endif\n\nstatic int mg_tls_err(struct mg_connection *c, int rc) {\n  char s[80];\n  mbedtls_strerror(rc, s, sizeof(s));\n  MG_ERROR((\"%lu %s\", ((struct mg_connection *) c)->id, s));\n  return rc;\n}\n\n#if defined(MBEDTLS_VERSION_NUMBER) && MBEDTLS_VERSION_NUMBER >= 0x04000000\n#else\nstatic int mg_mbed_rng(void *ctx, unsigned char *buf, size_t len) {\n  mg_random(buf, len);\n  (void) ctx;\n  return 0;\n}\n#endif\n\nstatic bool mg_load_cert(struct mg_str str, mbedtls_x509_crt *p) {\n  int rc;\n  if (str.buf == NULL || str.buf[0] == '\\0' || str.buf[0] == '*') return true;\n  if (!MG_IS_DER(str.buf)) str.len++;  // PEM, include trailing NUL\n  if ((rc = mbedtls_x509_crt_parse(p, (uint8_t *) str.buf, str.len)) != 0) {\n    MG_ERROR((\"cert err %#x\", -rc));\n    return false;\n  }\n  return true;\n}\n\nstatic bool mg_load_key(struct mg_str str, mbedtls_pk_context *p) {\n  int rc;\n  if (str.buf == NULL || str.buf[0] == '\\0' || str.buf[0] == '*') return true;\n  if (!MG_IS_DER(str.buf)) str.len++;  // PEM, include trailing NUL\n  if ((rc = mbedtls_pk_parse_key(p, (uint8_t *) str.buf, str.len, NULL,\n                                 0 MG_MBEDTLS_RNG_GET)) != 0) {\n    MG_ERROR((\"key err %#x\", -rc));\n    return false;\n  }\n  return true;\n}\n\nvoid mg_tls_free(struct mg_connection *c) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  if (tls != NULL) {\n    mbedtls_ssl_free(&tls->ssl);\n    mbedtls_pk_free(&tls->pk);\n    mbedtls_x509_crt_free(&tls->ca);\n    mbedtls_x509_crt_free(&tls->cert);\n    mbedtls_ssl_config_free(&tls->conf);\n#ifdef MBEDTLS_SSL_SESSION_TICKETS\n    mbedtls_ssl_ticket_free(&tls->ticket);\n#endif\n    // PSA has global data. Do not call mbedtls_psa_crypto_free() here,\n    // it will free all global resources. Call it when actually freeing all\n    // application resources (main() exits)\n    mg_free(tls);\n    c->tls = NULL;\n  }\n}\n\nstatic int mg_net_send(void *ctx, const unsigned char *buf, size_t len) {\n  long n = mg_io_send((struct mg_connection *) ctx, buf, len);\n  MG_VERBOSE((\"%lu n=%ld e=%d\", ((struct mg_connection *) ctx)->id, n, errno));\n  if (n == MG_IO_WAIT) return MBEDTLS_ERR_SSL_WANT_WRITE;\n  if (n == MG_IO_RESET) return MBEDTLS_ERR_NET_CONN_RESET;\n  if (n == MG_IO_ERR) return MBEDTLS_ERR_NET_SEND_FAILED;\n  return (int) n;\n}\n\nstatic int mg_net_recv(void *ctx, unsigned char *buf, size_t len) {\n  long n = mg_io_recv((struct mg_connection *) ctx, buf, len);\n  MG_VERBOSE((\"%lu n=%ld\", ((struct mg_connection *) ctx)->id, n));\n  if (n == MG_IO_WAIT) return MBEDTLS_ERR_SSL_WANT_WRITE;\n  if (n == MG_IO_RESET) return MBEDTLS_ERR_NET_CONN_RESET;\n  if (n == MG_IO_ERR) return MBEDTLS_ERR_NET_RECV_FAILED;\n  return (int) n;\n}\n\nvoid mg_tls_handshake(struct mg_connection *c) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  int rc = mbedtls_ssl_handshake(&tls->ssl);\n  if (rc == 0) {  // Success\n    MG_DEBUG((\"%lu success\", c->id));\n    c->is_tls_hs = 0;\n    mg_call(c, MG_EV_TLS_HS, NULL);\n  } else if (rc == MBEDTLS_ERR_SSL_WANT_READ ||\n             rc == MBEDTLS_ERR_SSL_WANT_WRITE) {  // Still pending\n    MG_VERBOSE((\"%lu pending, %d%d %d (-%#x)\", c->id, c->is_connecting,\n                c->is_tls_hs, rc, -rc));\n  } else {\n    mg_error(c, \"TLS handshake: -%#x\", -mg_tls_err(c, rc));  // Error\n  }\n}\n\nstatic void debug_cb(void *c, int lev, const char *s, int n, const char *s2) {\n  n = (int) strlen(s2) - 1;\n  MG_INFO((\"%lu %d %.*s\", ((struct mg_connection *) c)->id, lev, n, s2));\n  (void) s;\n}\n\nvoid mg_tls_init(struct mg_connection *c, const struct mg_tls_opts *opts) {\n  struct mg_tls *tls = (struct mg_tls *) mg_calloc(1, sizeof(*tls));\n  int rc = 0;\n  c->tls = tls;\n  if (c->tls == NULL) {\n    mg_error(c, \"TLS OOM\");\n    goto fail;\n  }\n  if (c->is_listening) goto fail;\n  MG_DEBUG((\"%lu Setting TLS\", c->id));\n  MG_PROF_ADD(c, \"mbedtls_init_start\");\n#if defined(MBEDTLS_VERSION_NUMBER) && MBEDTLS_VERSION_NUMBER >= 0x03000000 && \\\n    defined(MBEDTLS_PSA_CRYPTO_C)\n  psa_crypto_init();  // https://github.com/Mbed-TLS/mbedtls/issues/9072#issuecomment-2084845711\n  // this initializes global resources and then just returns when called again\n#endif\n  mbedtls_ssl_init(&tls->ssl);\n  mbedtls_ssl_config_init(&tls->conf);\n  mbedtls_x509_crt_init(&tls->ca);\n  mbedtls_x509_crt_init(&tls->cert);\n  mbedtls_pk_init(&tls->pk);\n  mbedtls_ssl_conf_dbg(&tls->conf, debug_cb, c);\n#if defined(MG_MBEDTLS_DEBUG_LEVEL)\n  mbedtls_debug_set_threshold(MG_MBEDTLS_DEBUG_LEVEL);\n#endif\n  if ((rc = mbedtls_ssl_config_defaults(\n           &tls->conf,\n           c->is_client ? MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER,\n           MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT)) != 0) {\n    mg_error(c, \"tls defaults %#x\", -mg_tls_err(c, rc));\n    goto fail;\n  }\n#if defined(MBEDTLS_VERSION_NUMBER) && MBEDTLS_VERSION_NUMBER >= 0x04000000\n  MG_INFO((\"PSA is in control of random number generation\"));\n#else\n  mbedtls_ssl_conf_rng(&tls->conf, mg_mbed_rng, c);\n#endif\n\n  if (opts->ca.len == 0 || mg_strcmp(opts->ca, mg_str(\"*\")) == 0) {\n    // NOTE: MBEDTLS_SSL_VERIFY_NONE is not supported for TLS1.3 on client side\n    // See https://github.com/Mbed-TLS/mbedtls/issues/7075\n    mbedtls_ssl_conf_authmode(&tls->conf, MBEDTLS_SSL_VERIFY_NONE);\n  } else {\n    if (mg_load_cert(opts->ca, &tls->ca) == false) goto fail;\n    mbedtls_ssl_conf_ca_chain(&tls->conf, &tls->ca, NULL);\n    if (c->is_client) {\n      if (opts->name.buf != NULL && opts->name.buf[0] != '\\0') {\n        char *host = mg_mprintf(\"%.*s\", opts->name.len, opts->name.buf);\n        mbedtls_ssl_set_hostname(&tls->ssl, host);\n        MG_DEBUG((\"%lu hostname verification: %s\", c->id, host));\n        mg_free(host);\n      } else {\n        MG_DEBUG((\"%lu skipping hostname verification\", c->id));\n        mbedtls_ssl_set_hostname(&tls->ssl, NULL);\n      }\n    }\n    mbedtls_ssl_conf_authmode(&tls->conf, MBEDTLS_SSL_VERIFY_REQUIRED);\n  }\n  if (!mg_load_cert(opts->cert, &tls->cert)) goto fail;\n  if (!mg_load_key(opts->key, &tls->pk)) goto fail;\n  if (tls->cert.version &&\n      (rc = mbedtls_ssl_conf_own_cert(&tls->conf, &tls->cert, &tls->pk)) != 0) {\n    mg_error(c, \"own cert %#x\", -mg_tls_err(c, rc));\n    goto fail;\n  }\n\n#ifdef MBEDTLS_SSL_SESSION_TICKETS\n  mbedtls_ssl_conf_session_tickets_cb(\n      &tls->conf, mbedtls_ssl_ticket_write, mbedtls_ssl_ticket_parse,\n      &((struct mg_tls_ctx *) c->mgr->tls_ctx)->tickets);\n#endif\n\n  if ((rc = mbedtls_ssl_setup(&tls->ssl, &tls->conf)) != 0) {\n    mg_error(c, \"setup err %#x\", -mg_tls_err(c, rc));\n    goto fail;\n  }\n  c->is_tls = 1;\n  c->is_tls_hs = 1;\n  mbedtls_ssl_set_bio(&tls->ssl, c, mg_net_send, mg_net_recv, 0);\n  MG_PROF_ADD(c, \"mbedtls_init_end\");\n  return;\nfail:\n  mg_tls_free(c);\n}\n\nsize_t mg_tls_pending(struct mg_connection *c) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  return tls == NULL ? 0 : mbedtls_ssl_get_bytes_avail(&tls->ssl);\n}\n\nlong mg_tls_recv(struct mg_connection *c, void *buf, size_t len) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  long n = mbedtls_ssl_read(&tls->ssl, (unsigned char *) buf, len);\n  if (!c->is_tls_hs && buf == NULL && n == 0) return 0;  // TODO(): MIP\n  if (n == MBEDTLS_ERR_SSL_WANT_READ || n == MBEDTLS_ERR_SSL_WANT_WRITE)\n    return MG_IO_WAIT;\n#if defined(MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET)\n  if (n == MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET) {\n    return MG_IO_WAIT;\n  }\n#endif\n  if (n <= 0) return MG_IO_ERR;\n  return n;\n}\n\nlong mg_tls_send(struct mg_connection *c, const void *buf, size_t len) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  long n;\n  bool was_throttled = c->is_tls_throttled;  // see #3074\n  n = was_throttled ? mbedtls_ssl_write(&tls->ssl, tls->throttled_buf,\n                                        tls->throttled_len) /* flush old data */\n                    : mbedtls_ssl_write(&tls->ssl, (unsigned char *) buf,\n                                        len);  // encrypt current data\n  c->is_tls_throttled =\n      (n == MBEDTLS_ERR_SSL_WANT_READ || n == MBEDTLS_ERR_SSL_WANT_WRITE);\n  if (was_throttled) return MG_IO_WAIT;  // flushed throttled data instead\n  if (c->is_tls_throttled) {\n    tls->throttled_buf =\n        (unsigned char *) buf;  // MbedTLS code actually ignores\n    tls->throttled_len = len;   //  these, but let's play API rules\n    return (long) len;          // already encripted that when throttled\n  }  // if last chunk fails to be sent, it needs to be flushed\n  if (n <= 0) return MG_IO_ERR;\n  return n;\n}\n\nvoid mg_tls_flush(struct mg_connection *c) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  if (c->is_tls_throttled) {\n    long n =\n        mbedtls_ssl_write(&tls->ssl, tls->throttled_buf, tls->throttled_len);\n    c->is_tls_throttled =\n        (n == MBEDTLS_ERR_SSL_WANT_READ || n == MBEDTLS_ERR_SSL_WANT_WRITE);\n  }\n}\n\nvoid mg_tls_ctx_init(struct mg_mgr *mgr) {\n  struct mg_tls_ctx *ctx = (struct mg_tls_ctx *) mg_calloc(1, sizeof(*ctx));\n  if (ctx == NULL) {\n    MG_ERROR((\"TLS context init OOM\"));\n  } else {\n#ifdef MBEDTLS_SSL_SESSION_TICKETS\n    int rc;\n    mbedtls_ssl_ticket_init(&ctx->tickets);\n#if defined(MBEDTLS_VERSION_NUMBER) && MBEDTLS_VERSION_NUMBER >= 0x04000000\n    if ((rc = mbedtls_ssl_ticket_setup(&ctx->tickets, PSA_ALG_GCM,\n                                       PSA_KEY_TYPE_AES, 128, 86400))\n#else\n    if ((rc = mbedtls_ssl_ticket_setup(&ctx->tickets, mg_mbed_rng, NULL,\n                                       MBEDTLS_CIPHER_AES_128_GCM, 86400))\n#endif\n        != 0) {\n      MG_ERROR((\" mbedtls_ssl_ticket_setup %#x\", -rc));\n    }\n#endif\n    mgr->tls_ctx = ctx;\n  }\n}\n\nvoid mg_tls_ctx_free(struct mg_mgr *mgr) {\n  struct mg_tls_ctx *ctx = (struct mg_tls_ctx *) mgr->tls_ctx;\n  if (ctx != NULL) {\n#ifdef MBEDTLS_SSL_SESSION_TICKETS\n    mbedtls_ssl_ticket_free(&ctx->tickets);\n#endif\n    mg_free(ctx);\n    mgr->tls_ctx = NULL;\n  }\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/tls_openssl.c\"\n#endif\n\n\n\n\n#if MG_TLS == MG_TLS_OPENSSL || MG_TLS == MG_TLS_WOLFSSL\n\nstatic int tls_err_cb(const char *s, size_t len, void *c) {\n  int n = (int) len - 1;\n  MG_ERROR((\"%lu %.*s\", ((struct mg_connection *) c)->id, n, s));\n  return 0;  // undocumented\n}\n\nstatic int mg_tls_err(struct mg_connection *c, struct mg_tls *tls, int res) {\n  int err = SSL_get_error(tls->ssl, res);\n  // We've just fetched the last error from the queue.\n  // Now we need to clear the error queue. If we do not, then the following\n  // can happen (actually reported):\n  //  - A new connection is accept()-ed with cert error (e.g. self-signed cert)\n  //  - Since all accept()-ed connections share listener's context,\n  //  - *ALL* SSL accepted connection report read error on the next poll cycle.\n  //    Thus a single errored connection can close all the rest, unrelated ones.\n  // Clearing the error keeps the shared SSL_CTX in an OK state.\n\n  if (err != 0) ERR_print_errors_cb(tls_err_cb, c);\n  ERR_clear_error();\n  if (err == SSL_ERROR_WANT_READ) return 0;\n  if (err == SSL_ERROR_WANT_WRITE) return 0;\n  return err;\n}\n\n#if MG_TLS != MG_TLS_WOLFSSL\nstatic STACK_OF(X509_INFO) * load_ca_certs(struct mg_str ca) {\n  BIO *bio = BIO_new_mem_buf(ca.buf, (int) ca.len);\n  STACK_OF(X509_INFO) *certs =\n      bio ? PEM_X509_INFO_read_bio(bio, NULL, NULL, NULL) : NULL;\n  if (bio) BIO_free(bio);\n  return certs;\n}\n\nstatic bool add_ca_certs(SSL_CTX *ctx, STACK_OF(X509_INFO) * certs) {\n  int i;\n  X509_STORE *cert_store = SSL_CTX_get_cert_store(ctx);\n  if (cert_store == NULL) return false;\n  for (i = 0; i < sk_X509_INFO_num(certs); i++) {\n    X509_INFO *cert_info = sk_X509_INFO_value(certs, i);\n    if (cert_info->x509 && !X509_STORE_add_cert(cert_store, cert_info->x509))\n      return false;\n  }\n  return true;\n}\n#endif\n\nstatic EVP_PKEY *load_key(struct mg_str s) {\n  BIO *bio = BIO_new_mem_buf(s.buf, (int) (long) s.len);\n  EVP_PKEY *key = bio ? PEM_read_bio_PrivateKey(bio, NULL, 0, NULL) : NULL;\n  if (bio) BIO_free(bio);\n  return key;\n}\n\nstatic X509 *load_cert(struct mg_str s) {\n  BIO *bio = BIO_new_mem_buf(s.buf, (int) (long) s.len);\n  X509 *cert = bio == NULL ? NULL\n               : MG_IS_DER(s.buf)\n                   ? d2i_X509_bio(bio, NULL)                    // DER\n                   : PEM_read_bio_X509(bio, NULL, NULL, NULL);  // PEM\n  if (bio) BIO_free(bio);\n  return cert;\n}\n\nstatic long mg_bio_ctrl(BIO *b, int cmd, long larg, void *pargs) {\n  long ret = 0;\n  if (cmd == BIO_CTRL_PUSH) ret = 1;\n  if (cmd == BIO_CTRL_POP) ret = 1;\n  if (cmd == BIO_CTRL_FLUSH) ret = 1;\n#if MG_TLS == MG_TLS_OPENSSL\n  if (cmd == BIO_C_SET_NBIO) ret = 1;\n#endif\n  // MG_DEBUG((\"%d -> %ld\", cmd, ret));\n  (void) b, (void) cmd, (void) larg, (void) pargs;\n  return ret;\n}\n\nstatic int mg_bio_read(BIO *bio, char *buf, int len) {\n  struct mg_connection *c = (struct mg_connection *) BIO_get_data(bio);\n  long res = mg_io_recv(c, buf, (size_t) len);\n  // MG_DEBUG((\"%p %d %ld\", buf, len, res));\n  len = res > 0 ? (int) res : -1;\n  if (res == MG_IO_WAIT) BIO_set_retry_read(bio);\n  return len;\n}\n\nstatic int mg_bio_write(BIO *bio, const char *buf, int len) {\n  struct mg_connection *c = (struct mg_connection *) BIO_get_data(bio);\n  long res = mg_io_send(c, buf, (size_t) len);\n  // MG_DEBUG((\"%p %d %ld\", buf, len, res));\n  len = res > 0 ? (int) res : -1;\n  if (res == MG_IO_WAIT) BIO_set_retry_write(bio);\n  return len;\n}\n\n#ifdef MG_TLS_SSLKEYLOGFILE\nstatic void ssl_keylog_cb(const SSL *ssl, const char *line) {\n  char *keylogfile = getenv(\"SSLKEYLOGFILE\");\n  if (keylogfile == NULL) {\n    return;\n  }\n  FILE *f = fopen(keylogfile, \"a\");\n  fprintf(f, \"%s\\n\", line);\n  fflush(f);\n  fclose(f);\n  (void) ssl;\n}\n#endif\n\nvoid mg_tls_free(struct mg_connection *c) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  if (tls == NULL) return;\n  SSL_free(tls->ssl);\n  SSL_CTX_free(tls->ctx);\n  BIO_meth_free(tls->bm);\n  mg_free(tls);\n  c->tls = NULL;\n}\n\nvoid mg_tls_init(struct mg_connection *c, const struct mg_tls_opts *opts) {\n  struct mg_tls *tls = (struct mg_tls *) mg_calloc(1, sizeof(*tls));\n  const char *id = \"mongoose\";\n  static unsigned char s_initialised = 0;\n  BIO *bio = NULL;\n  int rc;\n  c->tls = tls;\n  if (tls == NULL) {\n    mg_error(c, \"TLS OOM\");\n    goto fail;\n  }\n\n  if (!s_initialised) {\n    SSL_library_init();\n    s_initialised++;\n  }\n  MG_DEBUG((\"%lu Setting TLS\", c->id));\n  tls->ctx = c->is_client ? SSL_CTX_new(TLS_client_method())\n                          : SSL_CTX_new(TLS_server_method());\n  if (tls->ctx == NULL) {\n    mg_error(c, \"SSL_CTX_new\");\n    goto fail;\n  }\n#ifdef MG_TLS_SSLKEYLOGFILE\n  SSL_CTX_set_keylog_callback(tls->ctx, ssl_keylog_cb);\n#endif\n  if ((tls->ssl = SSL_new(tls->ctx)) == NULL) {\n    mg_error(c, \"SSL_new\");\n    goto fail;\n  }\n  SSL_set_session_id_context(tls->ssl, (const uint8_t *) id,\n                             (unsigned) strlen(id));\n  // Disable deprecated protocols\n  SSL_set_options(tls->ssl, SSL_OP_NO_SSLv2);\n  SSL_set_options(tls->ssl, SSL_OP_NO_SSLv3);\n  SSL_set_options(tls->ssl, SSL_OP_NO_TLSv1);\n  SSL_set_options(tls->ssl, SSL_OP_NO_TLSv1_1);\n#ifdef MG_ENABLE_OPENSSL_NO_COMPRESSION\n  SSL_set_options(tls->ssl, SSL_OP_NO_COMPRESSION);\n#endif\n#ifdef MG_ENABLE_OPENSSL_CIPHER_SERVER_PREFERENCE\n  SSL_set_options(tls->ssl, SSL_OP_CIPHER_SERVER_PREFERENCE);\n#endif\n\n#if MG_TLS == MG_TLS_WOLFSSL && !defined(OPENSSL_COMPATIBLE_DEFAULTS)\n  if (opts->ca.len == 0 || mg_strcmp(opts->ca, mg_str(\"*\")) == 0) {\n    // Older versions require that either the CA is loaded or SSL_VERIFY_NONE\n    // explicitly set\n    SSL_set_verify(tls->ssl, SSL_VERIFY_NONE, NULL);\n  }\n#endif\n\n  if (opts->ca.buf != NULL && opts->ca.buf[0] != '\\0') {\n    SSL_set_verify(tls->ssl, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,\n                   NULL);\n#if MG_TLS == MG_TLS_WOLFSSL\n    extern int wolfSSL_CTX_load_verify_buffer(SSL_CTX *, const unsigned char *,\n                                              long, int);\n    rc = wolfSSL_CTX_load_verify_buffer(tls->ctx,\n                                        (const unsigned char *) opts->ca.buf,\n                                        (long) opts->ca.len, SSL_FILETYPE_PEM);\n    if (rc != 1) {\n      mg_error(c, \"CA err\");\n      goto fail;\n    }\n#else\n    STACK_OF(X509_INFO) *certs = load_ca_certs(opts->ca);\n    rc = add_ca_certs(tls->ctx, certs);\n    sk_X509_INFO_pop_free(certs, X509_INFO_free);\n    if (!rc) {\n      mg_error(c, \"CA err\");\n      goto fail;\n    }\n#endif\n  }\n\n  if (opts->cert.buf != NULL && opts->cert.buf[0] != '\\0') {\n    X509 *cert = load_cert(opts->cert);\n    rc = cert == NULL ? 0 : SSL_use_certificate(tls->ssl, cert);\n    X509_free(cert);\n    if (cert == NULL || rc != 1) {\n      mg_error(c, \"CERT err %d\", mg_tls_err(c, tls, rc));\n      goto fail;\n    }\n  }\n  if (opts->key.buf != NULL && opts->key.buf[0] != '\\0') {\n    EVP_PKEY *key = load_key(opts->key);\n    rc = key == NULL ? 0 : SSL_use_PrivateKey(tls->ssl, key);\n    EVP_PKEY_free(key);\n    if (key == NULL || rc != 1) {\n      mg_error(c, \"KEY err %d\", mg_tls_err(c, tls, rc));\n      goto fail;\n    }\n  }\n\n  SSL_set_mode(tls->ssl, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);\n#if MG_TLS == MG_TLS_OPENSSL && OPENSSL_VERSION_NUMBER > 0x10002000L\n  (void) SSL_set_ecdh_auto(tls->ssl, 1);\n#endif\n#if OPENSSL_VERSION_NUMBER >= 0x10100000L\n  if (opts->name.len > 0) {\n    char *s = mg_mprintf(\"%.*s\", (int) opts->name.len, opts->name.buf);\n#if MG_TLS != MG_TLS_WOLFSSL || LIBWOLFSSL_VERSION_HEX >= 0x05005002\n    SSL_set1_host(tls->ssl, s);\n#else\n    X509_VERIFY_PARAM_set1_host(SSL_get0_param(tls->ssl), s, 0);\n#endif\n    SSL_set_tlsext_host_name(tls->ssl, s);\n    mg_free(s);\n  }\n#endif\n#if MG_TLS == MG_TLS_WOLFSSL\n  tls->bm = BIO_meth_new(0, \"bio_mg\");\n#else\n  tls->bm = BIO_meth_new(BIO_get_new_index() | BIO_TYPE_SOURCE_SINK, \"bio_mg\");\n#endif\n  BIO_meth_set_write(tls->bm, mg_bio_write);\n  BIO_meth_set_read(tls->bm, mg_bio_read);\n  BIO_meth_set_ctrl(tls->bm, mg_bio_ctrl);\n\n  bio = BIO_new(tls->bm);\n  BIO_set_data(bio, c);\n  SSL_set_bio(tls->ssl, bio, bio);\n\n  c->is_tls = 1;\n  c->is_tls_hs = 1;\n  MG_DEBUG((\"%lu SSL %s OK\", c->id, c->is_accepted ? \"accept\" : \"client\"));\n  return;\nfail:\n  mg_tls_free(c);\n}\n\nvoid mg_tls_handshake(struct mg_connection *c) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  int rc = c->is_client ? SSL_connect(tls->ssl) : SSL_accept(tls->ssl);\n  if (rc == 1) {\n    MG_DEBUG((\"%lu success\", c->id));\n    c->is_tls_hs = 0;\n    mg_call(c, MG_EV_TLS_HS, NULL);\n  } else {\n    int code = mg_tls_err(c, tls, rc);\n    if (code != 0) mg_error(c, \"tls hs: rc %d, err %d\", rc, code);\n  }\n}\n\nsize_t mg_tls_pending(struct mg_connection *c) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  return tls == NULL ? 0 : (size_t) SSL_pending(tls->ssl);\n}\n\nlong mg_tls_recv(struct mg_connection *c, void *buf, size_t len) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  int n = SSL_read(tls->ssl, buf, (int) len);\n  if (!c->is_tls_hs && buf == NULL && n == 0) return 0;  // TODO(): MIP\n  if (n < 0 && mg_tls_err(c, tls, n) == 0) return MG_IO_WAIT;\n  if (n <= 0) return MG_IO_ERR;\n  return n;\n}\n\nlong mg_tls_send(struct mg_connection *c, const void *buf, size_t len) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  int n = SSL_write(tls->ssl, buf, (int) len);\n  if (n < 0 && mg_tls_err(c, tls, n) == 0) return MG_IO_WAIT;\n  if (n <= 0) return MG_IO_ERR;\n  return n;\n}\n\nvoid mg_tls_flush(struct mg_connection *c) {\n  (void) c;\n}\n\nvoid mg_tls_ctx_init(struct mg_mgr *mgr) {\n  (void) mgr;\n}\n\nvoid mg_tls_ctx_free(struct mg_mgr *mgr) {\n  (void) mgr;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/tls_rsa.c\"\n#endif\n\n\n\n\n#if MG_TLS == MG_TLS_BUILTIN\n\n#define NS_INTERNAL static\ntypedef struct _bigint bigint; /**< An alias for _bigint */\n\n/*\n * Copyright (c) 2007, Cameron Rich\n *\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright notice,\n *   this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n *   this list of conditions and the following disclaimer in the documentation\n *   and/or other materials provided with the distribution.\n * * Neither the name of the axTLS project nor the names of its contributors\n *   may be used to endorse or promote products derived from this software\n *   without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* Maintain a number of precomputed variables when doing reduction */\n#define BIGINT_M_OFFSET 0 /**< Normal modulo offset. */\n#define BIGINT_P_OFFSET 1 /**< p modulo offset. */\n#define BIGINT_Q_OFFSET 2 /**< q module offset. */\n#define BIGINT_NUM_MODS 3 /**< The number of modulus constants used. */\n\n/* Architecture specific functions for big ints */\n#if defined(CONFIG_INTEGER_8BIT)\n#define COMP_RADIX 256U     /**< Max component + 1 */\n#define COMP_MAX 0xFFFFU    /**< (Max dbl comp -1) */\n#define COMP_BIT_SIZE 8     /**< Number of bits in a component. */\n#define COMP_BYTE_SIZE 1    /**< Number of bytes in a component. */\n#define COMP_NUM_NIBBLES 2  /**< Used For diagnostics only. */\ntypedef uint8_t comp;       /**< A single precision component. */\ntypedef uint16_t long_comp; /**< A double precision component. */\ntypedef int16_t slong_comp; /**< A signed double precision component. */\n#elif defined(CONFIG_INTEGER_16BIT)\n#define COMP_RADIX 65536U    /**< Max component + 1 */\n#define COMP_MAX 0xFFFFFFFFU /**< (Max dbl comp -1) */\n#define COMP_BIT_SIZE 16     /**< Number of bits in a component. */\n#define COMP_BYTE_SIZE 2     /**< Number of bytes in a component. */\n#define COMP_NUM_NIBBLES 4   /**< Used For diagnostics only. */\ntypedef uint16_t comp;            /**< A single precision component. */\ntypedef uint32_t long_comp;       /**< A double precision component. */\ntypedef int32_t slong_comp;       /**< A signed double precision component. */\n#else                        /* regular 32 bit */\n#ifdef _MSC_VER\n#define COMP_RADIX 4294967296i64\n#define COMP_MAX 0xFFFFFFFFFFFFFFFFui64\n#else\n#define COMP_RADIX 4294967296       /**< Max component + 1 */\n#define COMP_MAX 0xFFFFFFFFFFFFFFFF /**< (Max dbl comp -1) */\n#endif\n#define COMP_BIT_SIZE 32   /**< Number of bits in a component. */\n#define COMP_BYTE_SIZE 4   /**< Number of bytes in a component. */\n#define COMP_NUM_NIBBLES 8 /**< Used For diagnostics only. */\ntypedef uint32_t comp;      /**< A single precision component. */\ntypedef uint64_t long_comp; /**< A double precision component. */\ntypedef int64_t slong_comp; /**< A signed double precision component. */\n#endif\n\n/**\n * @struct  _bigint\n * @brief A big integer basic object\n */\nstruct _bigint {\n  struct _bigint *next; /**< The next bigint in the cache. */\n  short size;           /**< The number of components in this bigint. */\n  short max_comps;      /**< The heapsize allocated for this bigint */\n  int refs;             /**< An internal reference count. */\n  comp *comps;          /**< A ptr to the actual component data */\n};\n\n/**\n * Maintains the state of the cache, and a number of variables used in\n * reduction.\n */\nstruct _BI_CTX /**< A big integer \"session\" context. */\n    {\n  bigint *active_list;             /**< Bigints currently used. */\n  bigint *free_list;               /**< Bigints not used. */\n  bigint *bi_radix;                /**< The radix used. */\n  bigint *bi_mod[BIGINT_NUM_MODS]; /**< modulus */\n\n#if defined(CONFIG_BIGINT_MONTGOMERY)\n  bigint *bi_RR_mod_m[BIGINT_NUM_MODS]; /**< R^2 mod m */\n  bigint *bi_R_mod_m[BIGINT_NUM_MODS];  /**< R mod m */\n  comp N0_dash[BIGINT_NUM_MODS];\n#elif defined(CONFIG_BIGINT_BARRETT)\n  bigint *bi_mu[BIGINT_NUM_MODS]; /**< Storage for mu */\n#endif\n  bigint *bi_normalised_mod[BIGINT_NUM_MODS]; /**< Normalised mod storage. */\n  bigint **g;                                 /**< Used by sliding-window. */\n  int window;       /**< The size of the sliding window */\n  int active_count; /**< Number of active bigints. */\n  int free_count;   /**< Number of free bigints. */\n\n#ifdef CONFIG_BIGINT_MONTGOMERY\n  uint8_t use_classical; /**< Use classical reduction. */\n#endif\n  uint8_t mod_offset; /**< The mod offset we are using */\n};\ntypedef struct _BI_CTX BI_CTX;\n\n#if !defined(MAX)\n#define MAX(a, b) ((a) > (b) ? (a) : (b))\n#define MIN(a, b)  ((a) < (b) ? (a) : (b))\n#endif\n\n#define PERMANENT 0x7FFF55AA /**< A magic number for permanents. */\n\n/*\n * Copyright (c) 2007, Cameron Rich\n *\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright notice,\n *   this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n *   this list of conditions and the following disclaimer in the documentation\n *   and/or other materials provided with the distribution.\n * * Neither the name of the axTLS project nor the names of its contributors\n *   may be used to endorse or promote products derived from this software\n *   without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nNS_INTERNAL BI_CTX *bi_initialize(void);\nNS_INTERNAL void bi_terminate(BI_CTX *ctx);\nNS_INTERNAL void bi_permanent(bigint *bi);\nNS_INTERNAL void bi_depermanent(bigint *bi);\nNS_INTERNAL void bi_clear_cache(BI_CTX *ctx);\nNS_INTERNAL void bi_free(BI_CTX *ctx, bigint *bi);\nNS_INTERNAL bigint *bi_copy(bigint *bi);\nNS_INTERNAL bigint *bi_clone(BI_CTX *ctx, const bigint *bi);\nNS_INTERNAL void bi_export(BI_CTX *ctx, bigint *bi, uint8_t *data, int size);\nNS_INTERNAL bigint *bi_import(BI_CTX *ctx, const uint8_t *data, int len);\nNS_INTERNAL bigint *int_to_bi(BI_CTX *ctx, comp i);\n\n/* the functions that actually do something interesting */\nNS_INTERNAL bigint *bi_add(BI_CTX *ctx, bigint *bia, bigint *bib);\nNS_INTERNAL bigint *bi_subtract(BI_CTX *ctx, bigint *bia, bigint *bib,\n                                int *is_negative);\nNS_INTERNAL bigint *bi_divide(BI_CTX *ctx, bigint *bia, bigint *bim,\n                              int is_mod);\nNS_INTERNAL bigint *bi_multiply(BI_CTX *ctx, bigint *bia, bigint *bib);\nNS_INTERNAL bigint *bi_mod_power(BI_CTX *ctx, bigint *bi, bigint *biexp);\n#if 0\nNS_INTERNAL bigint *bi_mod_power2(BI_CTX *ctx, bigint *bi,\n\t\t\tbigint *bim, bigint *biexp);\n#endif\nNS_INTERNAL int bi_compare(bigint *bia, bigint *bib);\nNS_INTERNAL void bi_set_mod(BI_CTX *ctx, bigint *bim, int mod_offset);\nNS_INTERNAL void bi_free_mod(BI_CTX *ctx, int mod_offset);\n\n#ifdef CONFIG_SSL_FULL_MODE\nNS_INTERNAL void bi_print(const char *label, bigint *bi);\nNS_INTERNAL bigint *bi_str_import(BI_CTX *ctx, const char *data);\n#endif\n\n/**\n * @def bi_mod\n * Find the residue of B. bi_set_mod() must be called before hand.\n */\n#define bi_mod(A, B) bi_divide(A, B, ctx->bi_mod[ctx->mod_offset], 1)\n\n/**\n * bi_residue() is technically the same as bi_mod(), but it uses the\n * appropriate reduction technique (which is bi_mod() when doing classical\n * reduction).\n */\n#if defined(CONFIG_BIGINT_MONTGOMERY)\n#define bi_residue(A, B) bi_mont(A, B)\nNS_INTERNAL bigint *bi_mont(BI_CTX *ctx, bigint *bixy);\n#elif defined(CONFIG_BIGINT_BARRETT)\n#define bi_residue(A, B) bi_barrett(A, B)\nNS_INTERNAL bigint *bi_barrett(BI_CTX *ctx, bigint *bi);\n#else /* if defined(CONFIG_BIGINT_CLASSICAL) */\n#define bi_residue(A, B) bi_mod(A, B)\n#endif\n\n#ifdef CONFIG_BIGINT_SQUARE\nNS_INTERNAL bigint *bi_square(BI_CTX *ctx, bigint *bi);\n#else\n#define bi_square(A, B) bi_multiply(A, bi_copy(B), B)\n#endif\n\n//NS_INTERNAL bigint *bi_crt(BI_CTX *ctx, bigint *bi, bigint *dP, bigint *dQ,\n//                           bigint *p, bigint *q, bigint *qInv);\n\n/*\n * Copyright (c) 2007, Cameron Rich\n *\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright notice,\n *   this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n *   this list of conditions and the following disclaimer in the documentation\n *   and/or other materials provided with the distribution.\n * * Neither the name of the axTLS project nor the names of its contributors\n *   may be used to endorse or promote products derived from this software\n *   without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * @defgroup bigint_api Big Integer API\n * @brief The bigint implementation as used by the axTLS project.\n *\n * The bigint library is for RSA encryption/decryption as well as signing.\n * This code tries to minimise use of malloc/free by maintaining a small\n * cache. A bigint context may maintain state by being made \"permanent\".\n * It be be later released with a bi_depermanent() and bi_free() call.\n *\n * It supports the following reduction techniques:\n * - Classical\n * - Barrett\n * - Montgomery\n *\n * It also implements the following:\n * - Karatsuba multiplication\n * - Squaring\n * - Sliding window exponentiation\n * - Chinese Remainder Theorem (implemented in rsa.c).\n *\n * All the algorithms used are pretty standard, and designed for different\n * data bus sizes. Negative numbers are not dealt with at all, so a subtraction\n * may need to be tested for negativity.\n *\n * This library steals some ideas from Jef Poskanzer\n * <http://cs.marlboro.edu/term/cs-fall02/algorithms/crypto/RSA/bigint>\n * and GMP <http://www.swox.com/gmp>. It gets most of its implementation\n * detail from \"The Handbook of Applied Cryptography\"\n * <http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf>\n * @{\n */\n\n#define V1 v->comps[v->size - 1]                     /**< v1 for division */\n#define V2 v->comps[v->size - 2]                     /**< v2 for division */\n#define U(j) tmp_u->comps[tmp_u->size - j - 1]       /**< uj for division */\n#define Q(j) quotient->comps[quotient->size - j - 1] /**< qj for division */\n\nstatic bigint *bi_int_multiply(BI_CTX *ctx, bigint *bi, comp i);\nstatic bigint *bi_int_divide(BI_CTX *ctx, bigint *biR, comp denom);\nstatic bigint *alloc(BI_CTX *ctx, int size);\nstatic bigint *trim(bigint *bi);\nstatic void more_comps(bigint *bi, int n);\n#if defined(CONFIG_BIGINT_KARATSUBA) || defined(CONFIG_BIGINT_BARRETT) || \\\n    defined(CONFIG_BIGINT_MONTGOMERY)\nstatic bigint *comp_right_shift(bigint *biR, int num_shifts);\nstatic bigint *comp_left_shift(bigint *biR, int num_shifts);\n#endif\n\n#ifdef CONFIG_BIGINT_CHECK_ON\nstatic void check(const bigint *bi);\n#else\n#define check(A) /**< disappears in normal production mode */\n#endif\n\n/**\n * @brief Start a new bigint context.\n * @return A bigint context.\n */\nNS_INTERNAL BI_CTX *bi_initialize(void) {\n  /* mg_calloc() sets everything to zero */\n  BI_CTX *ctx = (BI_CTX *) mg_calloc(1, sizeof(BI_CTX));\n\n  /* the radix */\n  ctx->bi_radix = alloc(ctx, 2);\n  ctx->bi_radix->comps[0] = 0;\n  ctx->bi_radix->comps[1] = 1;\n  bi_permanent(ctx->bi_radix);\n  return ctx;\n}\n\n/**\n * @brief Close the bigint context and free any resources.\n *\n * Free up any used memory - a check is done if all objects were not\n * properly freed.\n * @param ctx [in]   The bigint session context.\n */\nNS_INTERNAL void bi_terminate(BI_CTX *ctx) {\n  bi_depermanent(ctx->bi_radix);\n  bi_free(ctx, ctx->bi_radix);\n\n  if (ctx->active_count != 0) {\n#ifdef CONFIG_SSL_FULL_MODE\n    printf(\"bi_terminate: there were %d un-freed bigints\\n\", ctx->active_count);\n#endif\n    abort();\n  }\n\n  bi_clear_cache(ctx);\n  mg_free(ctx);\n}\n\n/**\n *@brief Clear the memory cache.\n */\nNS_INTERNAL void bi_clear_cache(BI_CTX *ctx) {\n  bigint *p, *pn;\n\n  if (ctx->free_list == NULL) return;\n\n  for (p = ctx->free_list; p != NULL; p = pn) {\n    pn = p->next;\n    mg_free(p->comps);\n    mg_free(p);\n  }\n\n  ctx->free_count = 0;\n  ctx->free_list = NULL;\n}\n\n/**\n * @brief Increment the number of references to this object.\n * It does not do a full copy.\n * @param bi [in]   The bigint to copy.\n * @return A reference to the same bigint.\n */\nNS_INTERNAL bigint *bi_copy(bigint *bi) {\n  check(bi);\n  if (bi->refs != PERMANENT) bi->refs++;\n  return bi;\n}\n\n/**\n * @brief Simply make a bigint object \"unfreeable\" if bi_free() is called on it.\n *\n * For this object to be freed, bi_depermanent() must be called.\n * @param bi [in]   The bigint to be made permanent.\n */\nNS_INTERNAL void bi_permanent(bigint *bi) {\n  check(bi);\n  if (bi->refs != 1) {\n#ifdef CONFIG_SSL_FULL_MODE\n    printf(\"bi_permanent: refs was not 1\\n\");\n#endif\n    abort();\n  }\n\n  bi->refs = PERMANENT;\n}\n\n/**\n * @brief Take a permanent object and make it eligible for freedom.\n * @param bi [in]   The bigint to be made back to temporary.\n */\nNS_INTERNAL void bi_depermanent(bigint *bi) {\n  check(bi);\n  if (bi->refs != PERMANENT) {\n#ifdef CONFIG_SSL_FULL_MODE\n    printf(\"bi_depermanent: bigint was not permanent\\n\");\n#endif\n    abort();\n  }\n\n  bi->refs = 1;\n}\n\n/**\n * @brief Free a bigint object so it can be used again.\n *\n * The memory itself it not actually freed, just tagged as being available\n * @param ctx [in]   The bigint session context.\n * @param bi [in]    The bigint to be freed.\n */\nNS_INTERNAL void bi_free(BI_CTX *ctx, bigint *bi) {\n  check(bi);\n  if (bi->refs == PERMANENT) {\n    return;\n  }\n\n  if (--bi->refs > 0) {\n    return;\n  }\n\n  bi->next = ctx->free_list;\n  ctx->free_list = bi;\n  ctx->free_count++;\n\n  if (--ctx->active_count < 0) {\n#ifdef CONFIG_SSL_FULL_MODE\n    printf(\n        \"bi_free: active_count went negative \"\n        \"- double-freed bigint?\\n\");\n#endif\n    abort();\n  }\n}\n\n/**\n * @brief Convert an (unsigned) integer into a bigint.\n * @param ctx [in]   The bigint session context.\n * @param i [in]     The (unsigned) integer to be converted.\n *\n */\nNS_INTERNAL bigint *int_to_bi(BI_CTX *ctx, comp i) {\n  bigint *biR = alloc(ctx, 1);\n  biR->comps[0] = i;\n  return biR;\n}\n\n/**\n * @brief Do a full copy of the bigint object.\n * @param ctx [in]   The bigint session context.\n * @param bi  [in]   The bigint object to be copied.\n */\nNS_INTERNAL bigint *bi_clone(BI_CTX *ctx, const bigint *bi) {\n  bigint *biR = alloc(ctx, bi->size);\n  check(bi);\n  memcpy(biR->comps, bi->comps, (size_t) bi->size * COMP_BYTE_SIZE);\n  return biR;\n}\n\n/**\n * @brief Perform an addition operation between two bigints.\n * @param ctx [in]  The bigint session context.\n * @param bia [in]  A bigint.\n * @param bib [in]  Another bigint.\n * @return The result of the addition.\n */\nNS_INTERNAL bigint *bi_add(BI_CTX *ctx, bigint *bia, bigint *bib) {\n  int n;\n  comp carry = 0;\n  comp *pa, *pb;\n\n  check(bia);\n  check(bib);\n\n  n = MAX(bia->size, bib->size);\n  more_comps(bia, n + 1);\n  more_comps(bib, n);\n  pa = bia->comps;\n  pb = bib->comps;\n\n  do {\n    comp sl, rl, cy1;\n    sl = *pa + *pb++;\n    rl = sl + carry;\n    cy1 = sl < *pa;\n    carry = cy1 | (rl < sl);\n    *pa++ = rl;\n  } while (--n != 0);\n\n  *pa = carry; /* do overflow */\n  bi_free(ctx, bib);\n  return trim(bia);\n}\n\n/**\n * @brief Perform a subtraction operation between two bigints.\n * @param ctx [in]  The bigint session context.\n * @param bia [in]  A bigint.\n * @param bib [in]  Another bigint.\n * @param is_negative [out] If defined, indicates that the result was negative.\n * is_negative may be null.\n * @return The result of the subtraction. The result is always positive.\n */\nNS_INTERNAL bigint *bi_subtract(BI_CTX *ctx, bigint *bia, bigint *bib,\n                                int *is_negative) {\n  int n = bia->size;\n  comp *pa, *pb, carry = 0;\n\n  check(bia);\n  check(bib);\n\n  more_comps(bib, n);\n  pa = bia->comps;\n  pb = bib->comps;\n\n  do {\n    comp sl, rl, cy1;\n    sl = *pa - *pb++;\n    rl = sl - carry;\n    cy1 = sl > *pa;\n    carry = cy1 | (rl > sl);\n    *pa++ = rl;\n  } while (--n != 0);\n\n  if (is_negative) /* indicate a negative result */\n  {\n    *is_negative = (int) carry;\n  }\n\n  bi_free(ctx, trim(bib)); /* put bib back to the way it was */\n  return trim(bia);\n}\n\n/**\n * Perform a multiply between a bigint an an (unsigned) integer\n */\nstatic bigint *bi_int_multiply(BI_CTX *ctx, bigint *bia, comp b) {\n  int j = 0, n = bia->size;\n  bigint *biR = alloc(ctx, n + 1);\n  comp carry = 0;\n  comp *r = biR->comps;\n  comp *a = bia->comps;\n\n  check(bia);\n\n  /* clear things to start with */\n  memset(r, 0, (size_t) ((n + 1) * COMP_BYTE_SIZE));\n\n  do {\n    long_comp tmp = *r + (long_comp) a[j] * b + carry;\n    *r++ = (comp) tmp; /* downsize */\n    carry = (comp)(tmp >> COMP_BIT_SIZE);\n  } while (++j < n);\n\n  *r = carry;\n  bi_free(ctx, bia);\n  return trim(biR);\n}\n\n/**\n * @brief Does both division and modulo calculations.\n *\n * Used extensively when doing classical reduction.\n * @param ctx [in]  The bigint session context.\n * @param u [in]    A bigint which is the numerator.\n * @param v [in]    Either the denominator or the modulus depending on the mode.\n * @param is_mod [n] Determines if this is a normal division (0) or a reduction\n * (1).\n * @return  The result of the division/reduction.\n */\nNS_INTERNAL bigint *bi_divide(BI_CTX *ctx, bigint *u, bigint *v, int is_mod) {\n  int n = v->size, m = u->size - n;\n  int j = 0, orig_u_size = u->size;\n  uint8_t mod_offset = ctx->mod_offset;\n  comp d;\n  bigint *quotient, *tmp_u;\n  comp q_dash;\n\n  check(u);\n  check(v);\n\n  /* if doing reduction and we are < mod, then return mod */\n  if (is_mod && bi_compare(v, u) > 0) {\n    bi_free(ctx, v);\n    return u;\n  }\n\n  quotient = alloc(ctx, m + 1);\n  tmp_u = alloc(ctx, n + 1);\n  v = trim(v); /* make sure we have no leading 0's */\n  d = (comp)((long_comp) COMP_RADIX / (V1 + 1));\n\n  /* clear things to start with */\n  memset(quotient->comps, 0, (size_t) ((quotient->size) * COMP_BYTE_SIZE));\n\n  /* normalise */\n  if (d > 1) {\n    u = bi_int_multiply(ctx, u, d);\n\n    if (is_mod) {\n      v = ctx->bi_normalised_mod[mod_offset];\n    } else {\n      v = bi_int_multiply(ctx, v, d);\n    }\n  }\n\n  if (orig_u_size == u->size) /* new digit position u0 */\n  {\n    more_comps(u, orig_u_size + 1);\n  }\n\n  do {\n    /* get a temporary short version of u */\n    memcpy(tmp_u->comps, &u->comps[u->size - n - 1 - j],\n           (size_t) (n + 1) * COMP_BYTE_SIZE);\n\n    /* calculate q' */\n    if (U(0) == V1) {\n      q_dash = COMP_RADIX - 1;\n    } else {\n      q_dash = (comp)(((long_comp) U(0) * COMP_RADIX + U(1)) / V1);\n\n      if (v->size > 1 && V2) {\n        /* we are implementing the following:\n        if (V2*q_dash > (((U(0)*COMP_RADIX + U(1) -\n                q_dash*V1)*COMP_RADIX) + U(2))) ... */\n        comp inner = (comp)((long_comp) COMP_RADIX * U(0) + U(1) -\n                            (long_comp) q_dash * V1);\n        if ((long_comp) V2 * q_dash > (long_comp) inner * COMP_RADIX + U(2)) {\n          q_dash--;\n        }\n      }\n    }\n\n    /* multiply and subtract */\n    if (q_dash) {\n      int is_negative;\n      tmp_u = bi_subtract(ctx, tmp_u, bi_int_multiply(ctx, bi_copy(v), q_dash),\n                          &is_negative);\n      more_comps(tmp_u, n + 1);\n\n      Q(j) = q_dash;\n\n      /* add back */\n      if (is_negative) {\n        Q(j)--;\n        tmp_u = bi_add(ctx, tmp_u, bi_copy(v));\n\n        /* lop off the carry */\n        tmp_u->size--;\n        v->size--;\n      }\n    } else {\n      Q(j) = 0;\n    }\n\n    /* copy back to u */\n    memcpy(&u->comps[u->size - n - 1 - j], tmp_u->comps,\n           (size_t) (n + 1) * COMP_BYTE_SIZE);\n  } while (++j <= m);\n\n  bi_free(ctx, tmp_u);\n  bi_free(ctx, v);\n\n  if (is_mod) /* get the remainder */\n  {\n    bi_free(ctx, quotient);\n    return bi_int_divide(ctx, trim(u), d);\n  } else /* get the quotient */\n  {\n    bi_free(ctx, u);\n    return trim(quotient);\n  }\n}\n\n/*\n * Perform an integer divide on a bigint.\n */\nstatic bigint *bi_int_divide(BI_CTX *ctx, bigint *biR, comp denom) {\n  int i = biR->size - 1;\n  long_comp r = 0;\n\n  (void) ctx;\n  check(biR);\n\n  do {\n    r = (r << COMP_BIT_SIZE) + biR->comps[i];\n    biR->comps[i] = (comp)(r / denom);\n    r %= denom;\n  } while (--i >= 0);\n\n  return trim(biR);\n}\n\n#ifdef CONFIG_BIGINT_MONTGOMERY\n/**\n * There is a need for the value of integer N' such that B^-1(B-1)-N^-1N'=1,\n * where B^-1(B-1) mod N=1. Actually, only the least significant part of\n * N' is needed, hence the definition N0'=N' mod b. We reproduce below the\n * simple algorithm from an article by Dusse and Kaliski to efficiently\n * find N0' from N0 and b */\nstatic comp modular_inverse(bigint *bim) {\n  int i;\n  comp t = 1;\n  comp two_2_i_minus_1 = 2; /* 2^(i-1) */\n  long_comp two_2_i = 4;    /* 2^i */\n  comp N = bim->comps[0];\n\n  for (i = 2; i <= COMP_BIT_SIZE; i++) {\n    if ((long_comp) N * t % two_2_i >= two_2_i_minus_1) {\n      t += two_2_i_minus_1;\n    }\n\n    two_2_i_minus_1 <<= 1;\n    two_2_i <<= 1;\n  }\n\n  return (comp)(COMP_RADIX - t);\n}\n#endif\n\n#if defined(CONFIG_BIGINT_KARATSUBA) || defined(CONFIG_BIGINT_BARRETT) || \\\n    defined(CONFIG_BIGINT_MONTGOMERY)\n/**\n * Take each component and shift down (in terms of components)\n */\nstatic bigint *comp_right_shift(bigint *biR, int num_shifts) {\n  int i = biR->size - num_shifts;\n  comp *x = biR->comps;\n  comp *y = &biR->comps[num_shifts];\n\n  check(biR);\n\n  if (i <= 0) /* have we completely right shifted? */\n  {\n    biR->comps[0] = 0; /* return 0 */\n    biR->size = 1;\n    return biR;\n  }\n\n  do {\n    *x++ = *y++;\n  } while (--i > 0);\n\n  biR->size -= num_shifts;\n  return biR;\n}\n\n/**\n * Take each component and shift it up (in terms of components)\n */\nstatic bigint *comp_left_shift(bigint *biR, int num_shifts) {\n  int i = biR->size - 1;\n  comp *x, *y;\n\n  check(biR);\n\n  if (num_shifts <= 0) {\n    return biR;\n  }\n\n  more_comps(biR, biR->size + num_shifts);\n\n  x = &biR->comps[i + num_shifts];\n  y = &biR->comps[i];\n\n  do {\n    *x-- = *y--;\n  } while (i--);\n\n  memset(biR->comps, 0, (size_t) (num_shifts * COMP_BYTE_SIZE)); /* zero LS comps */\n  return biR;\n}\n#endif\n\n/**\n * @brief Allow a binary sequence to be imported as a bigint.\n * @param ctx [in]  The bigint session context.\n * @param data [in] The data to be converted.\n * @param size [in] The number of bytes of data.\n * @return A bigint representing this data.\n */\nNS_INTERNAL bigint *bi_import(BI_CTX *ctx, const uint8_t *data, int size) {\n  bigint *biR = alloc(ctx, (size + COMP_BYTE_SIZE - 1) / COMP_BYTE_SIZE);\n  int i, j = 0, offset = 0;\n\n  memset(biR->comps, 0, (size_t) (biR->size * COMP_BYTE_SIZE));\n\n  for (i = size - 1; i >= 0; i--) {\n    biR->comps[offset] += (comp) data[i] << (j * 8);\n\n    if (++j == COMP_BYTE_SIZE) {\n      j = 0;\n      offset++;\n    }\n  }\n\n  return trim(biR);\n}\n\n#ifdef CONFIG_SSL_FULL_MODE\n/**\n * @brief The testharness uses this code to import text hex-streams and\n * convert them into bigints.\n * @param ctx [in]  The bigint session context.\n * @param data [in] A string consisting of hex characters. The characters must\n * be in upper case.\n * @return A bigint representing this data.\n */\nNS_INTERNAL bigint *bi_str_import(BI_CTX *ctx, const char *data) {\n  int size = strlen(data);\n  bigint *biR = alloc(ctx, (size + COMP_NUM_NIBBLES - 1) / COMP_NUM_NIBBLES);\n  int i, j = 0, offset = 0;\n  memset(biR->comps, 0, (size_t) (biR->size * COMP_BYTE_SIZE));\n\n  for (i = size - 1; i >= 0; i--) {\n    int num = (data[i] <= '9') ? (data[i] - '0') : (data[i] - 'A' + 10);\n    biR->comps[offset] += num << (j * 4);\n\n    if (++j == COMP_NUM_NIBBLES) {\n      j = 0;\n      offset++;\n    }\n  }\n\n  return biR;\n}\n\nNS_INTERNAL void bi_print(const char *label, bigint *x) {\n  int i, j;\n\n  if (x == NULL) {\n    printf(\"%s: (null)\\n\", label);\n    return;\n  }\n\n  printf(\"%s: (size %d)\\n\", label, x->size);\n  for (i = x->size - 1; i >= 0; i--) {\n    for (j = COMP_NUM_NIBBLES - 1; j >= 0; j--) {\n      comp mask = 0x0f << (j * 4);\n      comp num = (x->comps[i] & mask) >> (j * 4);\n      putc((num <= 9) ? (num + '0') : (num + 'A' - 10), stdout);\n    }\n  }\n\n  printf(\"\\n\");\n}\n#endif\n\n/**\n * @brief Take a bigint and convert it into a byte sequence.\n *\n * This is useful after a decrypt operation.\n * @param ctx [in]  The bigint session context.\n * @param x [in]  The bigint to be converted.\n * @param data [out] The converted data as a byte stream.\n * @param size [in] The maximum size of the byte stream. Unused bytes will be\n * zeroed.\n */\nNS_INTERNAL void bi_export(BI_CTX *ctx, bigint *x, uint8_t *data, int size) {\n  int i, j, k = size - 1;\n\n  check(x);\n  memset(data, 0, (size_t) size); /* ensure all leading 0's are cleared */\n\n  for (i = 0; i < x->size; i++) {\n    for (j = 0; j < COMP_BYTE_SIZE; j++) {\n      comp mask = (comp) 0xff << (j * 8);\n      int num = (int) (x->comps[i] & mask) >> (j * 8);\n      data[k--] = (uint8_t) num;\n\n      if (k < 0) {\n        goto buf_done;\n      }\n    }\n  }\nbuf_done:\n\n  bi_free(ctx, x);\n}\n\n/**\n * @brief Pre-calculate some of the expensive steps in reduction.\n *\n * This function should only be called once (normally when a session starts).\n * When the session is over, bi_free_mod() should be called. bi_mod_power()\n * relies on this function being called.\n * @param ctx [in]  The bigint session context.\n * @param bim [in]  The bigint modulus that will be used.\n * @param mod_offset [in] There are three moduluii that can be stored - the\n * standard modulus, and its two primes p and q. This offset refers to which\n * modulus we are referring to.\n * @see bi_free_mod(), bi_mod_power().\n */\nNS_INTERNAL void bi_set_mod(BI_CTX *ctx, bigint *bim, int mod_offset) {\n  int k = bim->size;\n  comp d = (comp)((long_comp) COMP_RADIX / (bim->comps[k - 1] + 1));\n#ifdef CONFIG_BIGINT_MONTGOMERY\n  bigint *R, *R2;\n#endif\n\n  ctx->bi_mod[mod_offset] = bim;\n  bi_permanent(ctx->bi_mod[mod_offset]);\n  ctx->bi_normalised_mod[mod_offset] = bi_int_multiply(ctx, bim, d);\n  bi_permanent(ctx->bi_normalised_mod[mod_offset]);\n\n#if defined(CONFIG_BIGINT_MONTGOMERY)\n  /* set montgomery variables */\n  R = comp_left_shift(bi_clone(ctx, ctx->bi_radix), k - 1);      /* R */\n  R2 = comp_left_shift(bi_clone(ctx, ctx->bi_radix), k * 2 - 1); /* R^2 */\n  ctx->bi_RR_mod_m[mod_offset] = bi_mod(ctx, R2);                /* R^2 mod m */\n  ctx->bi_R_mod_m[mod_offset] = bi_mod(ctx, R);                  /* R mod m */\n\n  bi_permanent(ctx->bi_RR_mod_m[mod_offset]);\n  bi_permanent(ctx->bi_R_mod_m[mod_offset]);\n\n  ctx->N0_dash[mod_offset] = modular_inverse(ctx->bi_mod[mod_offset]);\n\n#elif defined(CONFIG_BIGINT_BARRETT)\n  ctx->bi_mu[mod_offset] =\n      bi_divide(ctx, comp_left_shift(bi_clone(ctx, ctx->bi_radix), k * 2 - 1),\n                ctx->bi_mod[mod_offset], 0);\n  bi_permanent(ctx->bi_mu[mod_offset]);\n#endif\n}\n\n/**\n * @brief Used when cleaning various bigints at the end of a session.\n * @param ctx [in]  The bigint session context.\n * @param mod_offset [in] The offset to use.\n * @see bi_set_mod().\n */\nvoid bi_free_mod(BI_CTX *ctx, int mod_offset) {\n  bi_depermanent(ctx->bi_mod[mod_offset]);\n  bi_free(ctx, ctx->bi_mod[mod_offset]);\n#if defined(CONFIG_BIGINT_MONTGOMERY)\n  bi_depermanent(ctx->bi_RR_mod_m[mod_offset]);\n  bi_depermanent(ctx->bi_R_mod_m[mod_offset]);\n  bi_free(ctx, ctx->bi_RR_mod_m[mod_offset]);\n  bi_free(ctx, ctx->bi_R_mod_m[mod_offset]);\n#elif defined(CONFIG_BIGINT_BARRETT)\n  bi_depermanent(ctx->bi_mu[mod_offset]);\n  bi_free(ctx, ctx->bi_mu[mod_offset]);\n#endif\n  bi_depermanent(ctx->bi_normalised_mod[mod_offset]);\n  bi_free(ctx, ctx->bi_normalised_mod[mod_offset]);\n}\n\n/**\n * Perform a standard multiplication between two bigints.\n *\n * Barrett reduction has no need for some parts of the product, so ignore bits\n * of the multiply. This routine gives Barrett its big performance\n * improvements over Classical/Montgomery reduction methods.\n */\nstatic bigint *regular_multiply(BI_CTX *ctx, bigint *bia, bigint *bib,\n                                int inner_partial, int outer_partial) {\n  int i = 0, j;\n  int n = bia->size;\n  int t = bib->size;\n  bigint *biR = alloc(ctx, n + t);\n  comp *sr = biR->comps;\n  comp *sa = bia->comps;\n  comp *sb = bib->comps;\n\n  check(bia);\n  check(bib);\n\n  /* clear things to start with */\n  memset(biR->comps, 0, (size_t) ((n + t) * COMP_BYTE_SIZE));\n\n  do {\n    long_comp tmp;\n    comp carry = 0;\n    int r_index = i;\n    j = 0;\n\n    if (outer_partial && outer_partial - i > 0 && outer_partial < n) {\n      r_index = outer_partial - 1;\n      j = outer_partial - i - 1;\n    }\n\n    do {\n      if (inner_partial && r_index >= inner_partial) {\n        break;\n      }\n\n      tmp = sr[r_index] + ((long_comp) sa[j]) * sb[i] + carry;\n      sr[r_index++] = (comp) tmp; /* downsize */\n      carry = (comp) (tmp >> COMP_BIT_SIZE);\n    } while (++j < n);\n\n    sr[r_index] = carry;\n  } while (++i < t);\n\n  bi_free(ctx, bia);\n  bi_free(ctx, bib);\n  return trim(biR);\n}\n\n#ifdef CONFIG_BIGINT_KARATSUBA\n/*\n * Karatsuba improves on regular multiplication due to only 3 multiplications\n * being done instead of 4. The additional additions/subtractions are O(N)\n * rather than O(N^2) and so for big numbers it saves on a few operations\n */\nstatic bigint *karatsuba(BI_CTX *ctx, bigint *bia, bigint *bib, int is_square) {\n  bigint *x0, *x1;\n  bigint *p0, *p1, *p2;\n  int m;\n\n  if (is_square) {\n    m = (bia->size + 1) / 2;\n  } else {\n    m = (MAX(bia->size, bib->size) + 1) / 2;\n  }\n\n  x0 = bi_clone(ctx, bia);\n  x0->size = m;\n  x1 = bi_clone(ctx, bia);\n  comp_right_shift(x1, m);\n  bi_free(ctx, bia);\n\n  /* work out the 3 partial products */\n  if (is_square) {\n    p0 = bi_square(ctx, bi_copy(x0));\n    p2 = bi_square(ctx, bi_copy(x1));\n    p1 = bi_square(ctx, bi_add(ctx, x0, x1));\n  } else /* normal multiply */\n  {\n    bigint *y0, *y1;\n    y0 = bi_clone(ctx, bib);\n    y0->size = m;\n    y1 = bi_clone(ctx, bib);\n    comp_right_shift(y1, m);\n    bi_free(ctx, bib);\n\n    p0 = bi_multiply(ctx, bi_copy(x0), bi_copy(y0));\n    p2 = bi_multiply(ctx, bi_copy(x1), bi_copy(y1));\n    p1 = bi_multiply(ctx, bi_add(ctx, x0, x1), bi_add(ctx, y0, y1));\n  }\n\n  p1 = bi_subtract(ctx, bi_subtract(ctx, p1, bi_copy(p2), NULL), bi_copy(p0),\n                   NULL);\n\n  comp_left_shift(p1, m);\n  comp_left_shift(p2, 2 * m);\n  return bi_add(ctx, p1, bi_add(ctx, p0, p2));\n}\n#endif\n\n/**\n * @brief Perform a multiplication operation between two bigints.\n * @param ctx [in]  The bigint session context.\n * @param bia [in]  A bigint.\n * @param bib [in]  Another bigint.\n * @return The result of the multiplication.\n */\nNS_INTERNAL bigint *bi_multiply(BI_CTX *ctx, bigint *bia, bigint *bib) {\n  check(bia);\n  check(bib);\n\n#ifdef CONFIG_BIGINT_KARATSUBA\n  if (MIN(bia->size, bib->size) < MUL_KARATSUBA_THRESH) {\n    return regular_multiply(ctx, bia, bib, 0, 0);\n  }\n\n  return karatsuba(ctx, bia, bib, 0);\n#else\n  return regular_multiply(ctx, bia, bib, 0, 0);\n#endif\n}\n\n#ifdef CONFIG_BIGINT_SQUARE\n/*\n * Perform the actual square operion. It takes into account overflow.\n */\nstatic bigint *regular_square(BI_CTX *ctx, bigint *bi) {\n  int t = bi->size;\n  int i = 0, j;\n  bigint *biR = alloc(ctx, t * 2 + 1);\n  comp *w = biR->comps;\n  comp *x = bi->comps;\n  long_comp carry;\n  memset(w, 0, biR->size * COMP_BYTE_SIZE);\n\n  do {\n    long_comp tmp = w[2 * i] + (long_comp) x[i] * x[i];\n    w[2 * i] = (comp) tmp;\n    carry = tmp >> COMP_BIT_SIZE;\n\n    for (j = i + 1; j < t; j++) {\n      uint8_t c = 0;\n      long_comp xx = (long_comp) x[i] * x[j];\n      if ((COMP_MAX - xx) < xx) c = 1;\n\n      tmp = (xx << 1);\n\n      if ((COMP_MAX - tmp) < w[i + j]) c = 1;\n\n      tmp += w[i + j];\n\n      if ((COMP_MAX - tmp) < carry) c = 1;\n\n      tmp += carry;\n      w[i + j] = (comp) tmp;\n      carry = tmp >> COMP_BIT_SIZE;\n\n      if (c) carry += COMP_RADIX;\n    }\n\n    tmp = w[i + t] + carry;\n    w[i + t] = (comp) tmp;\n    w[i + t + 1] = tmp >> COMP_BIT_SIZE;\n  } while (++i < t);\n\n  bi_free(ctx, bi);\n  return trim(biR);\n}\n\n/**\n * @brief Perform a square operation on a bigint.\n * @param ctx [in]  The bigint session context.\n * @param bia [in]  A bigint.\n * @return The result of the multiplication.\n */\nNS_INTERNAL bigint *bi_square(BI_CTX *ctx, bigint *bia) {\n  check(bia);\n\n#ifdef CONFIG_BIGINT_KARATSUBA\n  if (bia->size < SQU_KARATSUBA_THRESH) {\n    return regular_square(ctx, bia);\n  }\n\n  return karatsuba(ctx, bia, NULL, 1);\n#else\n  return regular_square(ctx, bia);\n#endif\n}\n#endif\n\n/**\n * @brief Compare two bigints.\n * @param bia [in]  A bigint.\n * @param bib [in]  Another bigint.\n * @return -1 if smaller, 1 if larger and 0 if equal.\n */\nNS_INTERNAL int bi_compare(bigint *bia, bigint *bib) {\n  int r, i;\n\n  check(bia);\n  check(bib);\n\n  if (bia->size > bib->size)\n    r = 1;\n  else if (bia->size < bib->size)\n    r = -1;\n  else {\n    comp *a = bia->comps;\n    comp *b = bib->comps;\n\n    /* Same number of components.  Compare starting from the high end\n     * and working down. */\n    r = 0;\n    i = bia->size - 1;\n\n    do {\n      if (a[i] > b[i]) {\n        r = 1;\n        break;\n      } else if (a[i] < b[i]) {\n        r = -1;\n        break;\n      }\n    } while (--i >= 0);\n  }\n\n  return r;\n}\n\n/*\n * Allocate and zero more components.  Does not consume bi.\n */\nstatic void more_comps(bigint *bi, int n) {\n  if (n > bi->max_comps) {\n    int max = MAX(bi->max_comps * 2, n);\n    void *p = mg_calloc(1, (size_t) max * COMP_BYTE_SIZE);\n    if (p != NULL && bi->size > 0) memcpy(p, bi->comps, (size_t) bi->max_comps * COMP_BYTE_SIZE);\n    mg_free(bi->comps);\n    bi->max_comps = (short) max;\n    bi->comps = (comp *) p;\n  }\n\n  if (n > bi->size) {\n    memset(&bi->comps[bi->size], 0, (size_t) (n - bi->size) * COMP_BYTE_SIZE);\n  }\n\n  bi->size = (short) n;\n}\n\n/*\n * Make a new empty bigint. It may just use an old one if one is available.\n * Otherwise get one off the heap.\n */\nstatic bigint *alloc(BI_CTX *ctx, int size) {\n  bigint *biR;\n\n  /* Can we recycle an old bigint? */\n  if (ctx->free_list != NULL) {\n    biR = ctx->free_list;\n    ctx->free_list = biR->next;\n    ctx->free_count--;\n\n    if (biR->refs != 0) {\n#ifdef CONFIG_SSL_FULL_MODE\n      printf(\"alloc: refs was not 0\\n\");\n#endif\n      abort(); /* create a stack trace from a core dump */\n    }\n\n    more_comps(biR, size);\n  } else {\n    /* No free bigints available - create a new one. */\n    biR = (bigint *) mg_calloc(1, sizeof(bigint));\n    biR->comps = (comp *) mg_calloc(1, (size_t) size * COMP_BYTE_SIZE);\n    biR->max_comps = (short) size; /* give some space to spare */\n  }\n\n  biR->size = (short) size;\n  biR->refs = 1;\n  biR->next = NULL;\n  ctx->active_count++;\n  return biR;\n}\n\n/*\n * Work out the highest '1' bit in an exponent. Used when doing sliding-window\n * exponentiation.\n */\nstatic int find_max_exp_index(bigint *biexp) {\n  int i = COMP_BIT_SIZE - 1;\n  comp shift = COMP_RADIX / 2;\n  comp test = biexp->comps[biexp->size - 1]; /* assume no leading zeroes */\n\n  check(biexp);\n\n  do {\n    if (test & shift) {\n      return i + (biexp->size - 1) * COMP_BIT_SIZE;\n    }\n\n    shift >>= 1;\n  } while (i-- != 0);\n\n  return -1; /* error - must have been a leading 0 */\n}\n\n/*\n * Is a particular bit is an exponent 1 or 0? Used when doing sliding-window\n * exponentiation.\n */\nstatic int exp_bit_is_one(bigint *biexp, int offset) {\n  comp test = biexp->comps[offset / COMP_BIT_SIZE];\n  int num_shifts = offset % COMP_BIT_SIZE;\n  comp shift = 1;\n  int i;\n\n  check(biexp);\n\n  for (i = 0; i < num_shifts; i++) {\n    shift <<= 1;\n  }\n\n  return (test & shift) != 0;\n}\n\n#ifdef CONFIG_BIGINT_CHECK_ON\n/*\n * Perform a sanity check on bi.\n */\nstatic void check(const bigint *bi) {\n  if (bi->refs <= 0) {\n    printf(\"check: zero or negative refs in bigint\\n\");\n    abort();\n  }\n\n  if (bi->next != NULL) {\n    printf(\n        \"check: attempt to use a bigint from \"\n        \"the free list\\n\");\n    abort();\n  }\n}\n#endif\n\n/*\n * Delete any leading 0's (and allow for 0).\n */\nstatic bigint *trim(bigint *bi) {\n  check(bi);\n\n  while (bi->comps[bi->size - 1] == 0 && bi->size > 1) {\n    bi->size--;\n  }\n\n  return bi;\n}\n\n#if defined(CONFIG_BIGINT_MONTGOMERY)\n/**\n * @brief Perform a single montgomery reduction.\n * @param ctx [in]  The bigint session context.\n * @param bixy [in]  A bigint.\n * @return The result of the montgomery reduction.\n */\nNS_INTERNAL bigint *bi_mont(BI_CTX *ctx, bigint *bixy) {\n  int i = 0, n;\n  uint8_t mod_offset = ctx->mod_offset;\n  bigint *bim = ctx->bi_mod[mod_offset];\n  comp mod_inv = ctx->N0_dash[mod_offset];\n\n  check(bixy);\n\n  if (ctx->use_classical) /* just use classical instead */\n  {\n    return bi_mod(ctx, bixy);\n  }\n\n  n = bim->size;\n\n  do {\n    bixy = bi_add(ctx, bixy,\n                  comp_left_shift(\n                      bi_int_multiply(ctx, bim, bixy->comps[i] * mod_inv), i));\n  } while (++i < n);\n\n  comp_right_shift(bixy, n);\n\n  if (bi_compare(bixy, bim) >= 0) {\n    bixy = bi_subtract(ctx, bixy, bim, NULL);\n  }\n\n  return bixy;\n}\n\n#elif defined(CONFIG_BIGINT_BARRETT)\n/*\n * Stomp on the most significant components to give the illusion of a \"mod base\n * radix\" operation\n */\nstatic bigint *comp_mod(bigint *bi, int mod) {\n  check(bi);\n\n  if (bi->size > mod) {\n    bi->size = mod;\n  }\n\n  return bi;\n}\n\n/**\n * @brief Perform a single Barrett reduction.\n * @param ctx [in]  The bigint session context.\n * @param bi [in]  A bigint.\n * @return The result of the Barrett reduction.\n */\nNS_INTERNAL bigint *bi_barrett(BI_CTX *ctx, bigint *bi) {\n  bigint *q1, *q2, *q3, *r1, *r2, *r;\n  uint8_t mod_offset = ctx->mod_offset;\n  bigint *bim = ctx->bi_mod[mod_offset];\n  int k = bim->size;\n\n  check(bi);\n  check(bim);\n\n  /* use Classical method instead  - Barrett cannot help here */\n  if (bi->size > k * 2) {\n    return bi_mod(ctx, bi);\n  }\n\n  q1 = comp_right_shift(bi_clone(ctx, bi), k - 1);\n\n  /* do outer partial multiply */\n  q2 = regular_multiply(ctx, q1, ctx->bi_mu[mod_offset], 0, k - 1);\n  q3 = comp_right_shift(q2, k + 1);\n  r1 = comp_mod(bi, k + 1);\n\n  /* do inner partial multiply */\n  r2 = comp_mod(regular_multiply(ctx, q3, bim, k + 1, 0), k + 1);\n  r = bi_subtract(ctx, r1, r2, NULL);\n\n  /* if (r >= m) r = r - m; */\n  if (bi_compare(r, bim) >= 0) {\n    r = bi_subtract(ctx, r, bim, NULL);\n  }\n\n  return r;\n}\n#endif /* CONFIG_BIGINT_BARRETT */\n\n#ifdef CONFIG_BIGINT_SLIDING_WINDOW\n/*\n * Work out g1, g3, g5, g7... etc for the sliding-window algorithm\n */\nstatic void precompute_slide_window(BI_CTX *ctx, int window, bigint *g1) {\n  int k = 1, i;\n  bigint *g2;\n\n  for (i = 0; i < window - 1; i++) /* compute 2^(window-1) */\n  {\n    k <<= 1;\n  }\n\n  ctx->g = (bigint **) mg_calloc(1, k * sizeof(bigint *));\n  ctx->g[0] = bi_clone(ctx, g1);\n  bi_permanent(ctx->g[0]);\n  g2 = bi_residue(ctx, bi_square(ctx, ctx->g[0])); /* g^2 */\n\n  for (i = 1; i < k; i++) {\n    ctx->g[i] = bi_residue(ctx, bi_multiply(ctx, ctx->g[i - 1], bi_copy(g2)));\n    bi_permanent(ctx->g[i]);\n  }\n\n  bi_free(ctx, g2);\n  ctx->window = k;\n}\n#endif\n\n/**\n * @brief Perform a modular exponentiation.\n *\n * This function requires bi_set_mod() to have been called previously. This is\n * one of the optimisations used for performance.\n * @param ctx [in]  The bigint session context.\n * @param bi  [in]  The bigint on which to perform the mod power operation.\n * @param biexp [in] The bigint exponent.\n * @return The result of the mod exponentiation operation\n * @see bi_set_mod().\n */\nNS_INTERNAL bigint *bi_mod_power(BI_CTX *ctx, bigint *bi, bigint *biexp) {\n  int i = find_max_exp_index(biexp), j, window_size = 1;\n  bigint *biR = int_to_bi(ctx, 1);\n\n#if defined(CONFIG_BIGINT_MONTGOMERY)\n  uint8_t mod_offset = ctx->mod_offset;\n  if (!ctx->use_classical) {\n    /* preconvert */\n    bi = bi_mont(ctx,\n                 bi_multiply(ctx, bi, ctx->bi_RR_mod_m[mod_offset])); /* x' */\n    bi_free(ctx, biR);\n    biR = ctx->bi_R_mod_m[mod_offset]; /* A */\n  }\n#endif\n\n  check(bi);\n  check(biexp);\n\n#ifdef CONFIG_BIGINT_SLIDING_WINDOW\n  for (j = i; j > 32; j /= 5) /* work out an optimum size */\n    window_size++;\n\n  /* work out the slide constants */\n  precompute_slide_window(ctx, window_size, bi);\n#else /* just one constant */\n  ctx->g = (bigint **) mg_calloc(1, sizeof(bigint *));\n  ctx->g[0] = bi_clone(ctx, bi);\n  ctx->window = 1;\n  bi_permanent(ctx->g[0]);\n#endif\n\n  /* if sliding-window is off, then only one bit will be done at a time and\n   * will reduce to standard left-to-right exponentiation */\n  do {\n    if (exp_bit_is_one(biexp, i)) {\n      int l = i - window_size + 1;\n      int part_exp = 0;\n\n      if (l < 0) /* LSB of exponent will always be 1 */\n        l = 0;\n      else {\n        while (exp_bit_is_one(biexp, l) == 0) l++; /* go back up */\n      }\n\n      /* build up the section of the exponent */\n      for (j = i; j >= l; j--) {\n        biR = bi_residue(ctx, bi_square(ctx, biR));\n        if (exp_bit_is_one(biexp, j)) part_exp++;\n\n        if (j != l) part_exp <<= 1;\n      }\n\n      part_exp = (part_exp - 1) / 2; /* adjust for array */\n      biR = bi_residue(ctx, bi_multiply(ctx, biR, ctx->g[part_exp]));\n      i = l - 1;\n    } else /* square it */\n    {\n      biR = bi_residue(ctx, bi_square(ctx, biR));\n      i--;\n    }\n  } while (i >= 0);\n\n  /* cleanup */\n  for (i = 0; i < ctx->window; i++) {\n    bi_depermanent(ctx->g[i]);\n    bi_free(ctx, ctx->g[i]);\n  }\n\n  mg_free(ctx->g);\n  bi_free(ctx, bi);\n  bi_free(ctx, biexp);\n#if defined CONFIG_BIGINT_MONTGOMERY\n  return ctx->use_classical ? biR : bi_mont(ctx, biR); /* convert back */\n#else /* CONFIG_BIGINT_CLASSICAL or CONFIG_BIGINT_BARRETT */\n  return biR;\n#endif\n}\n\n/**\n * @brief Use the Chinese Remainder Theorem to quickly perform RSA decrypts.\n *\n * @param ctx [in]  The bigint session context.\n * @param bi  [in]  The bigint to perform the exp/mod.\n * @param dP [in] CRT's dP bigint\n * @param dQ [in] CRT's dQ bigint\n * @param p [in] CRT's p bigint\n * @param q [in] CRT's q bigint\n * @param qInv [in] CRT's qInv bigint\n * @return The result of the CRT operation\n */\n#if 1\nNS_INTERNAL bigint *bi_crt(BI_CTX *ctx, bigint *bi, bigint *dP, bigint *dQ,\n                           bigint *p, bigint *q, bigint *qInv) {\n  bigint *m1, *m2, *h;\n\n/* Montgomery has a condition the 0 < x, y < m and these products violate\n * that condition. So disable Montgomery when using CRT */\n#if defined(CONFIG_BIGINT_MONTGOMERY)\n  ctx->use_classical = 1;\n#endif\n  ctx->mod_offset = BIGINT_P_OFFSET;\n  m1 = bi_mod_power(ctx, bi_copy(bi), dP);\n\n  ctx->mod_offset = BIGINT_Q_OFFSET;\n  m2 = bi_mod_power(ctx, bi, dQ);\n\n  h = bi_subtract(ctx, bi_add(ctx, m1, p), bi_copy(m2), NULL);\n  h = bi_multiply(ctx, h, qInv);\n  ctx->mod_offset = BIGINT_P_OFFSET;\n  h = bi_residue(ctx, h);\n#if defined(CONFIG_BIGINT_MONTGOMERY)\n  ctx->use_classical = 0; /* reset for any further operation */\n#endif\n  return bi_add(ctx, m2, bi_multiply(ctx, q, h));\n}\n#endif\n\n// Proper lib usage:\n// - BI_CTX *c = bi_initialize()\n// - allocate bigints (e.g.: calling bi_import(), int_to_bi(), ...)\n// - function calls, allocate bigints, etc.\n// - bigint *n = bi_import(c, indata, insize)\n//   - bi_set_mod(c, n, x)\n//   - mod function calls\n//   - bigint *nn = bi_mod_pwr(c, m, e) <-- frees m, e\n//   - bi_free_mod(c, x)                <-- frees n\n// - bi_export(c, nn, outdata, outsize) <-- frees nn\n// - function calls\n// - free bigints calling bi_free()\n// - bi_terminate(c)                    <-- frees c\n\nint mg_rsa_mod_pow(const uint8_t *mod, size_t modsz, const uint8_t *exp, size_t expsz, const uint8_t *msg, size_t msgsz, uint8_t *out, size_t outsz) {\n\tBI_CTX *bi_ctx = bi_initialize();\n\tbigint *m1;\n\tbigint *n = bi_import(bi_ctx, mod, (int) modsz);\n\tbigint *e = bi_import(bi_ctx, exp, (int) expsz);\n\tbigint *h = bi_import(bi_ctx, msg, (int) msgsz);\n\tbi_set_mod(bi_ctx, n, 0);\n\tm1 = bi_mod_power(bi_ctx, h, e);\n\tbi_free_mod(bi_ctx, 0);\n\tbi_export(bi_ctx, m1, out, (int) outsz);\n\tbi_terminate(bi_ctx);\n\treturn 0;\n}\n\nint mg_rsa_crt_sign(const uint8_t *em, size_t em_len,\n                    const uint8_t *dP, size_t dP_len,\n                    const uint8_t *dQ, size_t dQ_len,\n                    const uint8_t *p, size_t p_len,\n                    const uint8_t *q, size_t q_len,\n                    const uint8_t *qInv, size_t qInv_len,\n                    uint8_t *signature, size_t sig_len) {\n  BI_CTX *ctx;\n  bigint *em_bi, *dP_bi, *dQ_bi, *p_bi, *q_bi, *qInv_bi, *result_bi;\n  int ret = -1;\n\n  ctx = bi_initialize();\n  if (ctx == NULL) {\n    return -1;\n  }\n\n  em_bi = bi_import(ctx, em, (int) em_len);\n  dP_bi = bi_import(ctx, dP, (int) dP_len);\n  dQ_bi = bi_import(ctx, dQ, (int) dQ_len);\n  p_bi = bi_import(ctx, p, (int) p_len);\n  q_bi = bi_import(ctx, q, (int) q_len);\n  qInv_bi = bi_import(ctx, qInv, (int) qInv_len);\n\n  if (em_bi == NULL || dP_bi == NULL || dQ_bi == NULL ||\n      p_bi == NULL || q_bi == NULL || qInv_bi == NULL) {\n    goto cleanup;\n  }\n\n  bi_set_mod(ctx, bi_clone(ctx, p_bi), BIGINT_P_OFFSET);\n  bi_set_mod(ctx, bi_clone(ctx, q_bi), BIGINT_Q_OFFSET);\n\n  result_bi = bi_crt(ctx, em_bi, dP_bi, dQ_bi, p_bi, q_bi, qInv_bi);\n  if (result_bi == NULL) {\n    goto cleanup;\n  }\n  bi_export(ctx, result_bi, signature, (int) sig_len);\n  ret = 0;  // Success!\ncleanup:\n  bi_free_mod(ctx, BIGINT_P_OFFSET);  // cloned p_bi stored in mod context\n  bi_free_mod(ctx, BIGINT_Q_OFFSET);  // cloned q_bi stored in mod context\n  bi_terminate(ctx);\n  return ret;\n}\n\n#endif /* MG_TLS == MG_TLS_BUILTIN */\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/tls_uecc.c\"\n#endif\n/* Copyright 2014, Kenneth MacKay. Licensed under the BSD 2-clause license. */\n\n\n\n\n#if MG_TLS == MG_TLS_BUILTIN\n\n#ifndef MG_UECC_RNG_MAX_TRIES\n#define MG_UECC_RNG_MAX_TRIES 64\n#endif\n\n#if MG_UECC_ENABLE_VLI_API\n#define MG_UECC_VLI_API\n#else\n#define MG_UECC_VLI_API static\n#endif\n\n#if (MG_UECC_PLATFORM == mg_uecc_avr) || (MG_UECC_PLATFORM == mg_uecc_arm) || \\\n    (MG_UECC_PLATFORM == mg_uecc_arm_thumb) ||                                \\\n    (MG_UECC_PLATFORM == mg_uecc_arm_thumb2)\n#define MG_UECC_CONCATX(a, ...) a##__VA_ARGS__\n#define MG_UECC_CONCAT(a, ...) MG_UECC_CONCATX(a, __VA_ARGS__)\n\n#define STRX(a) #a\n#define STR(a) STRX(a)\n\n#define EVAL(...) EVAL1(EVAL1(EVAL1(EVAL1(__VA_ARGS__))))\n#define EVAL1(...) EVAL2(EVAL2(EVAL2(EVAL2(__VA_ARGS__))))\n#define EVAL2(...) EVAL3(EVAL3(EVAL3(EVAL3(__VA_ARGS__))))\n#define EVAL3(...) EVAL4(EVAL4(EVAL4(EVAL4(__VA_ARGS__))))\n#define EVAL4(...) __VA_ARGS__\n\n#define DEC_1 0\n#define DEC_2 1\n#define DEC_3 2\n#define DEC_4 3\n#define DEC_5 4\n#define DEC_6 5\n#define DEC_7 6\n#define DEC_8 7\n#define DEC_9 8\n#define DEC_10 9\n#define DEC_11 10\n#define DEC_12 11\n#define DEC_13 12\n#define DEC_14 13\n#define DEC_15 14\n#define DEC_16 15\n#define DEC_17 16\n#define DEC_18 17\n#define DEC_19 18\n#define DEC_20 19\n#define DEC_21 20\n#define DEC_22 21\n#define DEC_23 22\n#define DEC_24 23\n#define DEC_25 24\n#define DEC_26 25\n#define DEC_27 26\n#define DEC_28 27\n#define DEC_29 28\n#define DEC_30 29\n#define DEC_31 30\n#define DEC_32 31\n\n#define DEC_(N) MG_UECC_CONCAT(DEC_, N)\n\n#define SECOND_ARG(_, val, ...) val\n#define SOME_CHECK_0 ~, 0\n#define GET_SECOND_ARG(...) SECOND_ARG(__VA_ARGS__, SOME, )\n#define SOME_OR_0(N) GET_SECOND_ARG(MG_UECC_CONCAT(SOME_CHECK_, N))\n\n#define MG_UECC_EMPTY(...)\n#define DEFER(...) __VA_ARGS__ MG_UECC_EMPTY()\n\n#define REPEAT_NAME_0() REPEAT_0\n#define REPEAT_NAME_SOME() REPEAT_SOME\n#define REPEAT_0(...)\n#define REPEAT_SOME(N, stuff) \\\n  DEFER(MG_UECC_CONCAT(REPEAT_NAME_, SOME_OR_0(DEC_(N))))()(DEC_(N), stuff) stuff\n#define REPEAT(N, stuff) EVAL(REPEAT_SOME(N, stuff))\n\n#define REPEATM_NAME_0() REPEATM_0\n#define REPEATM_NAME_SOME() REPEATM_SOME\n#define REPEATM_0(...)\n#define REPEATM_SOME(N, macro) \\\n  macro(N) DEFER(MG_UECC_CONCAT(REPEATM_NAME_, SOME_OR_0(DEC_(N))))()(DEC_(N), macro)\n#define REPEATM(N, macro) EVAL(REPEATM_SOME(N, macro))\n#endif\n\n// \n\n#if (MG_UECC_WORD_SIZE == 1)\n#if MG_UECC_SUPPORTS_secp160r1\n#define MG_UECC_MAX_WORDS 21 /* Due to the size of curve_n. */\n#endif\n#if MG_UECC_SUPPORTS_secp192r1\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 24\n#endif\n#if MG_UECC_SUPPORTS_secp224r1\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 28\n#endif\n#if (MG_UECC_SUPPORTS_secp256r1 || MG_UECC_SUPPORTS_secp256k1)\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 32\n#endif\n#elif (MG_UECC_WORD_SIZE == 4)\n#if MG_UECC_SUPPORTS_secp160r1\n#define MG_UECC_MAX_WORDS 6 /* Due to the size of curve_n. */\n#endif\n#if MG_UECC_SUPPORTS_secp192r1\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 6\n#endif\n#if MG_UECC_SUPPORTS_secp224r1\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 7\n#endif\n#if (MG_UECC_SUPPORTS_secp256r1 || MG_UECC_SUPPORTS_secp256k1)\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 8\n#endif\n#elif (MG_UECC_WORD_SIZE == 8)\n#if MG_UECC_SUPPORTS_secp160r1\n#define MG_UECC_MAX_WORDS 3\n#endif\n#if MG_UECC_SUPPORTS_secp192r1\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 3\n#endif\n#if MG_UECC_SUPPORTS_secp224r1\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 4\n#endif\n#if (MG_UECC_SUPPORTS_secp256r1 || MG_UECC_SUPPORTS_secp256k1)\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 4\n#endif\n#endif /* MG_UECC_WORD_SIZE */\n\n#define BITS_TO_WORDS(num_bits)                                \\\n  ((wordcount_t) ((num_bits + ((MG_UECC_WORD_SIZE * 8) - 1)) / \\\n                  (MG_UECC_WORD_SIZE * 8)))\n#define BITS_TO_BYTES(num_bits) ((num_bits + 7) / 8)\n\nstruct MG_UECC_Curve_t {\n  wordcount_t num_words;\n  wordcount_t num_bytes;\n  bitcount_t num_n_bits;\n  mg_uecc_word_t p[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t n[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t G[MG_UECC_MAX_WORDS * 2];\n  mg_uecc_word_t b[MG_UECC_MAX_WORDS];\n  void (*double_jacobian)(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                          mg_uecc_word_t *Z1, MG_UECC_Curve curve);\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n  void (*mod_sqrt)(mg_uecc_word_t *a, MG_UECC_Curve curve);\n#endif\n  void (*x_side)(mg_uecc_word_t *result, const mg_uecc_word_t *x,\n                 MG_UECC_Curve curve);\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n  void (*mmod_fast)(mg_uecc_word_t *result, mg_uecc_word_t *product);\n#endif\n};\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\nstatic void bcopy(uint8_t *dst, const uint8_t *src, unsigned num_bytes) {\n  while (0 != num_bytes) {\n    num_bytes--;\n    dst[num_bytes] = src[num_bytes];\n  }\n}\n#endif\n\nstatic cmpresult_t mg_uecc_vli_cmp_unsafe(const mg_uecc_word_t *left,\n                                          const mg_uecc_word_t *right,\n                                          wordcount_t num_words);\n\n#if (MG_UECC_PLATFORM == mg_uecc_arm ||       \\\n     MG_UECC_PLATFORM == mg_uecc_arm_thumb || \\\n     MG_UECC_PLATFORM == mg_uecc_arm_thumb2)\n\n#endif\n\n#if (MG_UECC_PLATFORM == mg_uecc_avr)\n\n#endif\n\n#ifndef asm_clear\n#define asm_clear 0\n#endif\n#ifndef asm_set\n#define asm_set 0\n#endif\n#ifndef asm_add\n#define asm_add 0\n#endif\n#ifndef asm_sub\n#define asm_sub 0\n#endif\n#ifndef asm_mult\n#define asm_mult 0\n#endif\n#ifndef asm_rshift1\n#define asm_rshift1 0\n#endif\n#ifndef asm_mmod_fast_secp256r1\n#define asm_mmod_fast_secp256r1 0\n#endif\n\n#if defined(default_RNG_defined) && default_RNG_defined\nstatic MG_UECC_RNG_Function g_rng_function = &default_RNG;\n#else\nstatic MG_UECC_RNG_Function g_rng_function = 0;\n#endif\n\nvoid mg_uecc_set_rng(MG_UECC_RNG_Function rng_function) {\n  g_rng_function = rng_function;\n}\n\nMG_UECC_RNG_Function mg_uecc_get_rng(void) {\n  return g_rng_function;\n}\n\nint mg_uecc_curve_private_key_size(MG_UECC_Curve curve) {\n  return BITS_TO_BYTES(curve->num_n_bits);\n}\n\nint mg_uecc_curve_public_key_size(MG_UECC_Curve curve) {\n  return 2 * curve->num_bytes;\n}\n\n#if !asm_clear\nMG_UECC_VLI_API void mg_uecc_vli_clear(mg_uecc_word_t *vli,\n                                       wordcount_t num_words) {\n  wordcount_t i;\n  for (i = 0; i < num_words; ++i) {\n    vli[i] = 0;\n  }\n}\n#endif /* !asm_clear */\n\n/* Constant-time comparison to zero - secure way to compare long integers */\n/* Returns 1 if vli == 0, 0 otherwise. */\nMG_UECC_VLI_API mg_uecc_word_t mg_uecc_vli_isZero(const mg_uecc_word_t *vli,\n                                                  wordcount_t num_words) {\n  mg_uecc_word_t bits = 0;\n  wordcount_t i;\n  for (i = 0; i < num_words; ++i) {\n    bits |= vli[i];\n  }\n  return (bits == 0);\n}\n\n/* Returns nonzero if bit 'bit' of vli is set. */\nMG_UECC_VLI_API mg_uecc_word_t mg_uecc_vli_testBit(const mg_uecc_word_t *vli,\n                                                   bitcount_t bit) {\n  return (vli[bit >> MG_UECC_WORD_BITS_SHIFT] &\n          ((mg_uecc_word_t) 1 << (bit & MG_UECC_WORD_BITS_MASK)));\n}\n\n/* Counts the number of words in vli. */\nstatic wordcount_t vli_numDigits(const mg_uecc_word_t *vli,\n                                 const wordcount_t max_words) {\n  wordcount_t i;\n  /* Search from the end until we find a non-zero digit.\n     We do it in reverse because we expect that most digits will be nonzero. */\n  for (i = max_words - 1; i >= 0 && vli[i] == 0; --i) {\n  }\n\n  return (i + 1);\n}\n\n/* Counts the number of bits required to represent vli. */\nMG_UECC_VLI_API bitcount_t mg_uecc_vli_numBits(const mg_uecc_word_t *vli,\n                                               const wordcount_t max_words) {\n  mg_uecc_word_t i;\n  mg_uecc_word_t digit;\n\n  wordcount_t num_digits = vli_numDigits(vli, max_words);\n  if (num_digits == 0) {\n    return 0;\n  }\n\n  digit = vli[num_digits - 1];\n  for (i = 0; digit; ++i) {\n    digit >>= 1;\n  }\n\n  return (((bitcount_t) ((num_digits - 1) << MG_UECC_WORD_BITS_SHIFT)) +\n          (bitcount_t) i);\n}\n\n/* Sets dest = src. */\n#if !asm_set\nMG_UECC_VLI_API void mg_uecc_vli_set(mg_uecc_word_t *dest,\n                                     const mg_uecc_word_t *src,\n                                     wordcount_t num_words) {\n  wordcount_t i;\n  for (i = 0; i < num_words; ++i) {\n    dest[i] = src[i];\n  }\n}\n#endif /* !asm_set */\n\n/* Returns sign of left - right. */\nstatic cmpresult_t mg_uecc_vli_cmp_unsafe(const mg_uecc_word_t *left,\n                                          const mg_uecc_word_t *right,\n                                          wordcount_t num_words) {\n  wordcount_t i;\n  for (i = num_words - 1; i >= 0; --i) {\n    if (left[i] > right[i]) {\n      return 1;\n    } else if (left[i] < right[i]) {\n      return -1;\n    }\n  }\n  return 0;\n}\n\n/* Constant-time comparison function - secure way to compare long integers */\n/* Returns one if left == right, zero otherwise. */\nMG_UECC_VLI_API mg_uecc_word_t mg_uecc_vli_equal(const mg_uecc_word_t *left,\n                                                 const mg_uecc_word_t *right,\n                                                 wordcount_t num_words) {\n  mg_uecc_word_t diff = 0;\n  wordcount_t i;\n  for (i = num_words - 1; i >= 0; --i) {\n    diff |= (left[i] ^ right[i]);\n  }\n  return (diff == 0);\n}\n\nMG_UECC_VLI_API mg_uecc_word_t mg_uecc_vli_sub(mg_uecc_word_t *result,\n                                               const mg_uecc_word_t *left,\n                                               const mg_uecc_word_t *right,\n                                               wordcount_t num_words);\n\n/* Returns sign of left - right, in constant time. */\nMG_UECC_VLI_API cmpresult_t mg_uecc_vli_cmp(const mg_uecc_word_t *left,\n                                            const mg_uecc_word_t *right,\n                                            wordcount_t num_words) {\n  mg_uecc_word_t tmp[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t neg = !!mg_uecc_vli_sub(tmp, left, right, num_words);\n  mg_uecc_word_t equal = mg_uecc_vli_isZero(tmp, num_words);\n  return (cmpresult_t) (!equal - 2 * neg);\n}\n\n/* Computes vli = vli >> 1. */\n#if !asm_rshift1\nMG_UECC_VLI_API void mg_uecc_vli_rshift1(mg_uecc_word_t *vli,\n                                         wordcount_t num_words) {\n  mg_uecc_word_t *end = vli;\n  mg_uecc_word_t carry = 0;\n\n  vli += num_words;\n  while (vli-- > end) {\n    mg_uecc_word_t temp = *vli;\n    *vli = (temp >> 1) | carry;\n    carry = temp << (MG_UECC_WORD_BITS - 1);\n  }\n}\n#endif /* !asm_rshift1 */\n\n/* Computes result = left + right, returning carry. Can modify in place. */\n#if !asm_add\nMG_UECC_VLI_API mg_uecc_word_t mg_uecc_vli_add(mg_uecc_word_t *result,\n                                               const mg_uecc_word_t *left,\n                                               const mg_uecc_word_t *right,\n                                               wordcount_t num_words) {\n  mg_uecc_word_t carry = 0;\n  wordcount_t i;\n  for (i = 0; i < num_words; ++i) {\n    mg_uecc_word_t sum = left[i] + right[i] + carry;\n    if (sum != left[i]) {\n      carry = (sum < left[i]);\n    }\n    result[i] = sum;\n  }\n  return carry;\n}\n#endif /* !asm_add */\n\n/* Computes result = left - right, returning borrow. Can modify in place. */\n#if !asm_sub\nMG_UECC_VLI_API mg_uecc_word_t mg_uecc_vli_sub(mg_uecc_word_t *result,\n                                               const mg_uecc_word_t *left,\n                                               const mg_uecc_word_t *right,\n                                               wordcount_t num_words) {\n  mg_uecc_word_t borrow = 0;\n  wordcount_t i;\n  for (i = 0; i < num_words; ++i) {\n    mg_uecc_word_t diff = left[i] - right[i] - borrow;\n    if (diff != left[i]) {\n      borrow = (diff > left[i]);\n    }\n    result[i] = diff;\n  }\n  return borrow;\n}\n#endif /* !asm_sub */\n\n#if !asm_mult || (MG_UECC_SQUARE_FUNC && !asm_square) ||               \\\n    (MG_UECC_SUPPORTS_secp256k1 && (MG_UECC_OPTIMIZATION_LEVEL > 0) && \\\n     ((MG_UECC_WORD_SIZE == 1) || (MG_UECC_WORD_SIZE == 8)))\nstatic void muladd(mg_uecc_word_t a, mg_uecc_word_t b, mg_uecc_word_t *r0,\n                   mg_uecc_word_t *r1, mg_uecc_word_t *r2) {\n#if MG_UECC_WORD_SIZE == 8\n  uint64_t a0 = a & 0xffffffff;\n  uint64_t a1 = a >> 32;\n  uint64_t b0 = b & 0xffffffff;\n  uint64_t b1 = b >> 32;\n\n  uint64_t i0 = a0 * b0;\n  uint64_t i1 = a0 * b1;\n  uint64_t i2 = a1 * b0;\n  uint64_t i3 = a1 * b1;\n\n  uint64_t p0, p1;\n\n  i2 += (i0 >> 32);\n  i2 += i1;\n  if (i2 < i1) { /* overflow */\n    i3 += 0x100000000;\n  }\n\n  p0 = (i0 & 0xffffffff) | (i2 << 32);\n  p1 = i3 + (i2 >> 32);\n\n  *r0 += p0;\n  *r1 += (p1 + (*r0 < p0));\n  *r2 += ((*r1 < p1) || (*r1 == p1 && *r0 < p0));\n#else\n  mg_uecc_dword_t p = (mg_uecc_dword_t) a * b;\n  mg_uecc_dword_t r01 = ((mg_uecc_dword_t) (*r1) << MG_UECC_WORD_BITS) | *r0;\n  r01 += p;\n  *r2 += (r01 < p);\n  *r1 = (mg_uecc_word_t) (r01 >> MG_UECC_WORD_BITS);\n  *r0 = (mg_uecc_word_t) r01;\n#endif\n}\n#endif /* muladd needed */\n\n#if !asm_mult\nMG_UECC_VLI_API void mg_uecc_vli_mult(mg_uecc_word_t *result,\n                                      const mg_uecc_word_t *left,\n                                      const mg_uecc_word_t *right,\n                                      wordcount_t num_words) {\n  mg_uecc_word_t r0 = 0;\n  mg_uecc_word_t r1 = 0;\n  mg_uecc_word_t r2 = 0;\n  wordcount_t i, k;\n\n  /* Compute each digit of result in sequence, maintaining the carries. */\n  for (k = 0; k < num_words; ++k) {\n    for (i = 0; i <= k; ++i) {\n      muladd(left[i], right[k - i], &r0, &r1, &r2);\n    }\n    result[k] = r0;\n    r0 = r1;\n    r1 = r2;\n    r2 = 0;\n  }\n  for (k = num_words; k < num_words * 2 - 1; ++k) {\n    for (i = (wordcount_t) ((k + 1) - num_words); i < num_words; ++i) {\n      muladd(left[i], right[k - i], &r0, &r1, &r2);\n    }\n    result[k] = r0;\n    r0 = r1;\n    r1 = r2;\n    r2 = 0;\n  }\n  result[num_words * 2 - 1] = r0;\n}\n#endif /* !asm_mult */\n\n#if MG_UECC_SQUARE_FUNC\n\n#if !asm_square\nstatic void mul2add(mg_uecc_word_t a, mg_uecc_word_t b, mg_uecc_word_t *r0,\n                    mg_uecc_word_t *r1, mg_uecc_word_t *r2) {\n#if MG_UECC_WORD_SIZE == 8\n  uint64_t a0 = a & 0xffffffffull;\n  uint64_t a1 = a >> 32;\n  uint64_t b0 = b & 0xffffffffull;\n  uint64_t b1 = b >> 32;\n\n  uint64_t i0 = a0 * b0;\n  uint64_t i1 = a0 * b1;\n  uint64_t i2 = a1 * b0;\n  uint64_t i3 = a1 * b1;\n\n  uint64_t p0, p1;\n\n  i2 += (i0 >> 32);\n  i2 += i1;\n  if (i2 < i1) { /* overflow */\n    i3 += 0x100000000ull;\n  }\n\n  p0 = (i0 & 0xffffffffull) | (i2 << 32);\n  p1 = i3 + (i2 >> 32);\n\n  *r2 += (p1 >> 63);\n  p1 = (p1 << 1) | (p0 >> 63);\n  p0 <<= 1;\n\n  *r0 += p0;\n  *r1 += (p1 + (*r0 < p0));\n  *r2 += ((*r1 < p1) || (*r1 == p1 && *r0 < p0));\n#else\n  mg_uecc_dword_t p = (mg_uecc_dword_t) a * b;\n  mg_uecc_dword_t r01 = ((mg_uecc_dword_t) (*r1) << MG_UECC_WORD_BITS) | *r0;\n  *r2 += (p >> (MG_UECC_WORD_BITS * 2 - 1));\n  p *= 2;\n  r01 += p;\n  *r2 += (r01 < p);\n  *r1 = r01 >> MG_UECC_WORD_BITS;\n  *r0 = (mg_uecc_word_t) r01;\n#endif\n}\n\nMG_UECC_VLI_API void mg_uecc_vli_square(mg_uecc_word_t *result,\n                                        const mg_uecc_word_t *left,\n                                        wordcount_t num_words) {\n  mg_uecc_word_t r0 = 0;\n  mg_uecc_word_t r1 = 0;\n  mg_uecc_word_t r2 = 0;\n\n  wordcount_t i, k;\n\n  for (k = 0; k < num_words * 2 - 1; ++k) {\n    mg_uecc_word_t min = (k < num_words ? 0 : (k + 1) - num_words);\n    for (i = min; i <= k && i <= k - i; ++i) {\n      if (i < k - i) {\n        mul2add(left[i], left[k - i], &r0, &r1, &r2);\n      } else {\n        muladd(left[i], left[k - i], &r0, &r1, &r2);\n      }\n    }\n    result[k] = r0;\n    r0 = r1;\n    r1 = r2;\n    r2 = 0;\n  }\n\n  result[num_words * 2 - 1] = r0;\n}\n#endif /* !asm_square */\n\n#else /* MG_UECC_SQUARE_FUNC */\n\n#if MG_UECC_ENABLE_VLI_API\nMG_UECC_VLI_API void mg_uecc_vli_square(mg_uecc_word_t *result,\n                                        const mg_uecc_word_t *left,\n                                        wordcount_t num_words) {\n  mg_uecc_vli_mult(result, left, left, num_words);\n}\n#endif /* MG_UECC_ENABLE_VLI_API */\n\n#endif /* MG_UECC_SQUARE_FUNC */\n\n/* Computes result = (left + right) % mod.\n   Assumes that left < mod and right < mod, and that result does not overlap\n   mod. */\nMG_UECC_VLI_API void mg_uecc_vli_modAdd(mg_uecc_word_t *result,\n                                        const mg_uecc_word_t *left,\n                                        const mg_uecc_word_t *right,\n                                        const mg_uecc_word_t *mod,\n                                        wordcount_t num_words) {\n  mg_uecc_word_t carry = mg_uecc_vli_add(result, left, right, num_words);\n  if (carry || mg_uecc_vli_cmp_unsafe(mod, result, num_words) != 1) {\n    /* result > mod (result = mod + remainder), so subtract mod to get\n     * remainder. */\n    mg_uecc_vli_sub(result, result, mod, num_words);\n  }\n}\n\n/* Computes result = (left - right) % mod.\n   Assumes that left < mod and right < mod, and that result does not overlap\n   mod. */\nMG_UECC_VLI_API void mg_uecc_vli_modSub(mg_uecc_word_t *result,\n                                        const mg_uecc_word_t *left,\n                                        const mg_uecc_word_t *right,\n                                        const mg_uecc_word_t *mod,\n                                        wordcount_t num_words) {\n  mg_uecc_word_t l_borrow = mg_uecc_vli_sub(result, left, right, num_words);\n  if (l_borrow) {\n    /* In this case, result == -diff == (max int) - diff. Since -x % d == d - x,\n       we can get the correct result from result + mod (with overflow). */\n    mg_uecc_vli_add(result, result, mod, num_words);\n  }\n}\n\n/* Computes result = product % mod, where product is 2N words long. */\n/* Currently only designed to work for curve_p or curve_n. */\nMG_UECC_VLI_API void mg_uecc_vli_mmod(mg_uecc_word_t *result,\n                                      mg_uecc_word_t *product,\n                                      const mg_uecc_word_t *mod,\n                                      wordcount_t num_words) {\n  mg_uecc_word_t mod_multiple[2 * MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tmp[2 * MG_UECC_MAX_WORDS];\n  mg_uecc_word_t *v[2] = {tmp, product};\n  mg_uecc_word_t index;\n\n  /* Shift mod so its highest set bit is at the maximum position. */\n  bitcount_t shift = (bitcount_t) ((num_words * 2 * MG_UECC_WORD_BITS) -\n                                   mg_uecc_vli_numBits(mod, num_words));\n  wordcount_t word_shift = (wordcount_t) (shift / MG_UECC_WORD_BITS);\n  wordcount_t bit_shift = (wordcount_t) (shift % MG_UECC_WORD_BITS);\n  mg_uecc_word_t carry = 0;\n  mg_uecc_vli_clear(mod_multiple, word_shift);\n  if (bit_shift > 0) {\n    for (index = 0; index < (mg_uecc_word_t) num_words; ++index) {\n      mod_multiple[(mg_uecc_word_t) word_shift + index] =\n          (mg_uecc_word_t) (mod[index] << bit_shift) | carry;\n      carry = mod[index] >> (MG_UECC_WORD_BITS - bit_shift);\n    }\n  } else {\n    mg_uecc_vli_set(mod_multiple + word_shift, mod, num_words);\n  }\n\n  for (index = 1; shift >= 0; --shift) {\n    mg_uecc_word_t borrow = 0;\n    wordcount_t i;\n    for (i = 0; i < num_words * 2; ++i) {\n      mg_uecc_word_t diff = v[index][i] - mod_multiple[i] - borrow;\n      if (diff != v[index][i]) {\n        borrow = (diff > v[index][i]);\n      }\n      v[1 - index][i] = diff;\n    }\n    index = !(index ^ borrow); /* Swap the index if there was no borrow */\n    mg_uecc_vli_rshift1(mod_multiple, num_words);\n    mod_multiple[num_words - 1] |= mod_multiple[num_words]\n                                   << (MG_UECC_WORD_BITS - 1);\n    mg_uecc_vli_rshift1(mod_multiple + num_words, num_words);\n  }\n  mg_uecc_vli_set(result, v[index], num_words);\n}\n\n/* Computes result = (left * right) % mod. */\nMG_UECC_VLI_API void mg_uecc_vli_modMult(mg_uecc_word_t *result,\n                                         const mg_uecc_word_t *left,\n                                         const mg_uecc_word_t *right,\n                                         const mg_uecc_word_t *mod,\n                                         wordcount_t num_words) {\n  mg_uecc_word_t product[2 * MG_UECC_MAX_WORDS];\n  mg_uecc_vli_mult(product, left, right, num_words);\n  mg_uecc_vli_mmod(result, product, mod, num_words);\n}\n\nMG_UECC_VLI_API void mg_uecc_vli_modMult_fast(mg_uecc_word_t *result,\n                                              const mg_uecc_word_t *left,\n                                              const mg_uecc_word_t *right,\n                                              MG_UECC_Curve curve) {\n  mg_uecc_word_t product[2 * MG_UECC_MAX_WORDS];\n  mg_uecc_vli_mult(product, left, right, curve->num_words);\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n  curve->mmod_fast(result, product);\n#else\n  mg_uecc_vli_mmod(result, product, curve->p, curve->num_words);\n#endif\n}\n\n#if MG_UECC_SQUARE_FUNC\n\n#if MG_UECC_ENABLE_VLI_API\n/* Computes result = left^2 % mod. */\nMG_UECC_VLI_API void mg_uecc_vli_modSquare(mg_uecc_word_t *result,\n                                           const mg_uecc_word_t *left,\n                                           const mg_uecc_word_t *mod,\n                                           wordcount_t num_words) {\n  mg_uecc_word_t product[2 * MG_UECC_MAX_WORDS];\n  mg_uecc_vli_square(product, left, num_words);\n  mg_uecc_vli_mmod(result, product, mod, num_words);\n}\n#endif /* MG_UECC_ENABLE_VLI_API */\n\nMG_UECC_VLI_API void mg_uecc_vli_modSquare_fast(mg_uecc_word_t *result,\n                                                const mg_uecc_word_t *left,\n                                                MG_UECC_Curve curve) {\n  mg_uecc_word_t product[2 * MG_UECC_MAX_WORDS];\n  mg_uecc_vli_square(product, left, curve->num_words);\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n  curve->mmod_fast(result, product);\n#else\n  mg_uecc_vli_mmod(result, product, curve->p, curve->num_words);\n#endif\n}\n\n#else /* MG_UECC_SQUARE_FUNC */\n\n#if MG_UECC_ENABLE_VLI_API\nMG_UECC_VLI_API void mg_uecc_vli_modSquare(mg_uecc_word_t *result,\n                                           const mg_uecc_word_t *left,\n                                           const mg_uecc_word_t *mod,\n                                           wordcount_t num_words) {\n  mg_uecc_vli_modMult(result, left, left, mod, num_words);\n}\n#endif /* MG_UECC_ENABLE_VLI_API */\n\nMG_UECC_VLI_API void mg_uecc_vli_modSquare_fast(mg_uecc_word_t *result,\n                                                const mg_uecc_word_t *left,\n                                                MG_UECC_Curve curve) {\n  mg_uecc_vli_modMult_fast(result, left, left, curve);\n}\n\n#endif /* MG_UECC_SQUARE_FUNC */\n\n#define EVEN(vli) (!(vli[0] & 1))\nstatic void vli_modInv_update(mg_uecc_word_t *uv, const mg_uecc_word_t *mod,\n                              wordcount_t num_words) {\n  mg_uecc_word_t carry = 0;\n  if (!EVEN(uv)) {\n    carry = mg_uecc_vli_add(uv, uv, mod, num_words);\n  }\n  mg_uecc_vli_rshift1(uv, num_words);\n  if (carry) {\n    uv[num_words - 1] |= HIGH_BIT_SET;\n  }\n}\n\n/* Computes result = (1 / input) % mod. All VLIs are the same size.\n   See \"From Euclid's GCD to Montgomery Multiplication to the Great Divide\" */\nMG_UECC_VLI_API void mg_uecc_vli_modInv(mg_uecc_word_t *result,\n                                        const mg_uecc_word_t *input,\n                                        const mg_uecc_word_t *mod,\n                                        wordcount_t num_words) {\n  mg_uecc_word_t a[MG_UECC_MAX_WORDS], b[MG_UECC_MAX_WORDS],\n      u[MG_UECC_MAX_WORDS], v[MG_UECC_MAX_WORDS];\n  cmpresult_t cmpResult;\n\n  if (mg_uecc_vli_isZero(input, num_words)) {\n    mg_uecc_vli_clear(result, num_words);\n    return;\n  }\n\n  mg_uecc_vli_set(a, input, num_words);\n  mg_uecc_vli_set(b, mod, num_words);\n  mg_uecc_vli_clear(u, num_words);\n  u[0] = 1;\n  mg_uecc_vli_clear(v, num_words);\n  while ((cmpResult = mg_uecc_vli_cmp_unsafe(a, b, num_words)) != 0) {\n    if (EVEN(a)) {\n      mg_uecc_vli_rshift1(a, num_words);\n      vli_modInv_update(u, mod, num_words);\n    } else if (EVEN(b)) {\n      mg_uecc_vli_rshift1(b, num_words);\n      vli_modInv_update(v, mod, num_words);\n    } else if (cmpResult > 0) {\n      mg_uecc_vli_sub(a, a, b, num_words);\n      mg_uecc_vli_rshift1(a, num_words);\n      if (mg_uecc_vli_cmp_unsafe(u, v, num_words) < 0) {\n        mg_uecc_vli_add(u, u, mod, num_words);\n      }\n      mg_uecc_vli_sub(u, u, v, num_words);\n      vli_modInv_update(u, mod, num_words);\n    } else {\n      mg_uecc_vli_sub(b, b, a, num_words);\n      mg_uecc_vli_rshift1(b, num_words);\n      if (mg_uecc_vli_cmp_unsafe(v, u, num_words) < 0) {\n        mg_uecc_vli_add(v, v, mod, num_words);\n      }\n      mg_uecc_vli_sub(v, v, u, num_words);\n      vli_modInv_update(v, mod, num_words);\n    }\n  }\n  mg_uecc_vli_set(result, u, num_words);\n}\n\n/* ------ Point operations ------ */\n\n/* Copyright 2015, Kenneth MacKay. Licensed under the BSD 2-clause license. */\n\n#ifndef _UECC_CURVE_SPECIFIC_H_\n#define _UECC_CURVE_SPECIFIC_H_\n\n#define num_bytes_secp160r1 20\n#define num_bytes_secp192r1 24\n#define num_bytes_secp224r1 28\n#define num_bytes_secp256r1 32\n#define num_bytes_secp256k1 32\n\n#if (MG_UECC_WORD_SIZE == 1)\n\n#define num_words_secp160r1 20\n#define num_words_secp192r1 24\n#define num_words_secp224r1 28\n#define num_words_secp256r1 32\n#define num_words_secp256k1 32\n\n#define BYTES_TO_WORDS_8(a, b, c, d, e, f, g, h) \\\n  0x##a, 0x##b, 0x##c, 0x##d, 0x##e, 0x##f, 0x##g, 0x##h\n#define BYTES_TO_WORDS_4(a, b, c, d) 0x##a, 0x##b, 0x##c, 0x##d\n\n#elif (MG_UECC_WORD_SIZE == 4)\n\n#define num_words_secp160r1 5\n#define num_words_secp192r1 6\n#define num_words_secp224r1 7\n#define num_words_secp256r1 8\n#define num_words_secp256k1 8\n\n#define BYTES_TO_WORDS_8(a, b, c, d, e, f, g, h) 0x##d##c##b##a, 0x##h##g##f##e\n#define BYTES_TO_WORDS_4(a, b, c, d) 0x##d##c##b##a\n\n#elif (MG_UECC_WORD_SIZE == 8)\n\n#define num_words_secp160r1 3\n#define num_words_secp192r1 3\n#define num_words_secp224r1 4\n#define num_words_secp256r1 4\n#define num_words_secp256k1 4\n\n#define BYTES_TO_WORDS_8(a, b, c, d, e, f, g, h) 0x##h##g##f##e##d##c##b##a##U\n#define BYTES_TO_WORDS_4(a, b, c, d) 0x##d##c##b##a##U\n\n#endif /* MG_UECC_WORD_SIZE */\n\n#if MG_UECC_SUPPORTS_secp160r1 || MG_UECC_SUPPORTS_secp192r1 || \\\n    MG_UECC_SUPPORTS_secp224r1 || MG_UECC_SUPPORTS_secp256r1\nstatic void double_jacobian_default(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                                    mg_uecc_word_t *Z1, MG_UECC_Curve curve) {\n  /* t1 = X, t2 = Y, t3 = Z */\n  mg_uecc_word_t t4[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t t5[MG_UECC_MAX_WORDS];\n  wordcount_t num_words = curve->num_words;\n\n  if (mg_uecc_vli_isZero(Z1, num_words)) {\n    return;\n  }\n\n  mg_uecc_vli_modSquare_fast(t4, Y1, curve);   /* t4 = y1^2 */\n  mg_uecc_vli_modMult_fast(t5, X1, t4, curve); /* t5 = x1*y1^2 = A */\n  mg_uecc_vli_modSquare_fast(t4, t4, curve);   /* t4 = y1^4 */\n  mg_uecc_vli_modMult_fast(Y1, Y1, Z1, curve); /* t2 = y1*z1 = z3 */\n  mg_uecc_vli_modSquare_fast(Z1, Z1, curve);   /* t3 = z1^2 */\n\n  mg_uecc_vli_modAdd(X1, X1, Z1, curve->p, num_words); /* t1 = x1 + z1^2 */\n  mg_uecc_vli_modAdd(Z1, Z1, Z1, curve->p, num_words); /* t3 = 2*z1^2 */\n  mg_uecc_vli_modSub(Z1, X1, Z1, curve->p, num_words); /* t3 = x1 - z1^2 */\n  mg_uecc_vli_modMult_fast(X1, X1, Z1, curve);         /* t1 = x1^2 - z1^4 */\n\n  mg_uecc_vli_modAdd(Z1, X1, X1, curve->p,\n                     num_words); /* t3 = 2*(x1^2 - z1^4) */\n  mg_uecc_vli_modAdd(X1, X1, Z1, curve->p,\n                     num_words); /* t1 = 3*(x1^2 - z1^4) */\n  if (mg_uecc_vli_testBit(X1, 0)) {\n    mg_uecc_word_t l_carry = mg_uecc_vli_add(X1, X1, curve->p, num_words);\n    mg_uecc_vli_rshift1(X1, num_words);\n    X1[num_words - 1] |= l_carry << (MG_UECC_WORD_BITS - 1);\n  } else {\n    mg_uecc_vli_rshift1(X1, num_words);\n  }\n  /* t1 = 3/2*(x1^2 - z1^4) = B */\n\n  mg_uecc_vli_modSquare_fast(Z1, X1, curve);           /* t3 = B^2 */\n  mg_uecc_vli_modSub(Z1, Z1, t5, curve->p, num_words); /* t3 = B^2 - A */\n  mg_uecc_vli_modSub(Z1, Z1, t5, curve->p, num_words); /* t3 = B^2 - 2A = x3 */\n  mg_uecc_vli_modSub(t5, t5, Z1, curve->p, num_words); /* t5 = A - x3 */\n  mg_uecc_vli_modMult_fast(X1, X1, t5, curve);         /* t1 = B * (A - x3) */\n  mg_uecc_vli_modSub(t4, X1, t4, curve->p,\n                     num_words); /* t4 = B * (A - x3) - y1^4 = y3 */\n\n  mg_uecc_vli_set(X1, Z1, num_words);\n  mg_uecc_vli_set(Z1, Y1, num_words);\n  mg_uecc_vli_set(Y1, t4, num_words);\n}\n\n/* Computes result = x^3 + ax + b. result must not overlap x. */\nstatic void x_side_default(mg_uecc_word_t *result, const mg_uecc_word_t *x,\n                           MG_UECC_Curve curve) {\n  mg_uecc_word_t _3[MG_UECC_MAX_WORDS] = {3}; /* -a = 3 */\n  wordcount_t num_words = curve->num_words;\n\n  mg_uecc_vli_modSquare_fast(result, x, curve);                /* r = x^2 */\n  mg_uecc_vli_modSub(result, result, _3, curve->p, num_words); /* r = x^2 - 3 */\n  mg_uecc_vli_modMult_fast(result, result, x, curve); /* r = x^3 - 3x */\n  mg_uecc_vli_modAdd(result, result, curve->b, curve->p,\n                     num_words); /* r = x^3 - 3x + b */\n}\n#endif /* MG_UECC_SUPPORTS_secp... */\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n#if MG_UECC_SUPPORTS_secp160r1 || MG_UECC_SUPPORTS_secp192r1 || \\\n    MG_UECC_SUPPORTS_secp256r1 || MG_UECC_SUPPORTS_secp256k1\n/* Compute a = sqrt(a) (mod curve_p). */\nstatic void mod_sqrt_default(mg_uecc_word_t *a, MG_UECC_Curve curve) {\n  bitcount_t i;\n  mg_uecc_word_t p1[MG_UECC_MAX_WORDS] = {1};\n  mg_uecc_word_t l_result[MG_UECC_MAX_WORDS] = {1};\n  wordcount_t num_words = curve->num_words;\n\n  /* When curve->p == 3 (mod 4), we can compute\n     sqrt(a) = a^((curve->p + 1) / 4) (mod curve->p). */\n  mg_uecc_vli_add(p1, curve->p, p1, num_words); /* p1 = curve_p + 1 */\n  for (i = mg_uecc_vli_numBits(p1, num_words) - 1; i > 1; --i) {\n    mg_uecc_vli_modSquare_fast(l_result, l_result, curve);\n    if (mg_uecc_vli_testBit(p1, i)) {\n      mg_uecc_vli_modMult_fast(l_result, l_result, a, curve);\n    }\n  }\n  mg_uecc_vli_set(a, l_result, num_words);\n}\n#endif /* MG_UECC_SUPPORTS_secp... */\n#endif /* MG_UECC_SUPPORT_COMPRESSED_POINT */\n\n#if MG_UECC_SUPPORTS_secp160r1\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\nstatic void vli_mmod_fast_secp160r1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product);\n#endif\n\nstatic const struct MG_UECC_Curve_t curve_secp160r1 = {\n    num_words_secp160r1,\n    num_bytes_secp160r1,\n    161, /* num_n_bits */\n    {BYTES_TO_WORDS_8(FF, FF, FF, 7F, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_4(FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(57, 22, 75, CA, D3, AE, 27, F9),\n     BYTES_TO_WORDS_8(C8, F4, 01, 00, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, 01, 00, 00, 00)},\n    {BYTES_TO_WORDS_8(82, FC, CB, 13, B9, 8B, C3, 68),\n     BYTES_TO_WORDS_8(89, 69, 64, 46, 28, 73, F5, 8E),\n     BYTES_TO_WORDS_4(68, B5, 96, 4A),\n\n     BYTES_TO_WORDS_8(32, FB, C5, 7A, 37, 51, 23, 04),\n     BYTES_TO_WORDS_8(12, C9, DC, 59, 7D, 94, 68, 31),\n     BYTES_TO_WORDS_4(55, 28, A6, 23)},\n    {BYTES_TO_WORDS_8(45, FA, 65, C5, AD, D4, D4, 81),\n     BYTES_TO_WORDS_8(9F, F8, AC, 65, 8B, 7A, BD, 54),\n     BYTES_TO_WORDS_4(FC, BE, 97, 1C)},\n    &double_jacobian_default,\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n    &mod_sqrt_default,\n#endif\n    &x_side_default,\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n    &vli_mmod_fast_secp160r1\n#endif\n};\n\nMG_UECC_Curve mg_uecc_secp160r1(void) {\n  return &curve_secp160r1;\n}\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0 && !asm_mmod_fast_secp160r1)\n/* Computes result = product % curve_p\n    see http://www.isys.uni-klu.ac.at/PDF/2001-0126-MT.pdf page 354\n\n    Note that this only works if log2(omega) < log2(p) / 2 */\nstatic void omega_mult_secp160r1(mg_uecc_word_t *result,\n                                 const mg_uecc_word_t *right);\n#if MG_UECC_WORD_SIZE == 8\nstatic void vli_mmod_fast_secp160r1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product) {\n  mg_uecc_word_t tmp[2 * num_words_secp160r1];\n  mg_uecc_word_t copy;\n\n  mg_uecc_vli_clear(tmp, num_words_secp160r1);\n  mg_uecc_vli_clear(tmp + num_words_secp160r1, num_words_secp160r1);\n\n  omega_mult_secp160r1(tmp,\n                       product + num_words_secp160r1 - 1); /* (Rq, q) = q * c */\n\n  product[num_words_secp160r1 - 1] &= 0xffffffff;\n  copy = tmp[num_words_secp160r1 - 1];\n  tmp[num_words_secp160r1 - 1] &= 0xffffffff;\n  mg_uecc_vli_add(result, product, tmp,\n                  num_words_secp160r1); /* (C, r) = r + q */\n  mg_uecc_vli_clear(product, num_words_secp160r1);\n  tmp[num_words_secp160r1 - 1] = copy;\n  omega_mult_secp160r1(product, tmp + num_words_secp160r1 - 1); /* Rq*c */\n  mg_uecc_vli_add(result, result, product,\n                  num_words_secp160r1); /* (C1, r) = r + Rq*c */\n\n  while (mg_uecc_vli_cmp_unsafe(result, curve_secp160r1.p,\n                                num_words_secp160r1) > 0) {\n    mg_uecc_vli_sub(result, result, curve_secp160r1.p, num_words_secp160r1);\n  }\n}\n\nstatic void omega_mult_secp160r1(uint64_t *result, const uint64_t *right) {\n  uint32_t carry;\n  unsigned i;\n\n  /* Multiply by (2^31 + 1). */\n  carry = 0;\n  for (i = 0; i < num_words_secp160r1; ++i) {\n    uint64_t tmp = (right[i] >> 32) | (right[i + 1] << 32);\n    result[i] = (tmp << 31) + tmp + carry;\n    carry = (tmp >> 33) + (result[i] < tmp || (carry && result[i] == tmp));\n  }\n  result[i] = carry;\n}\n#else\nstatic void vli_mmod_fast_secp160r1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product) {\n  mg_uecc_word_t tmp[2 * num_words_secp160r1];\n  mg_uecc_word_t carry;\n\n  mg_uecc_vli_clear(tmp, num_words_secp160r1);\n  mg_uecc_vli_clear(tmp + num_words_secp160r1, num_words_secp160r1);\n\n  omega_mult_secp160r1(tmp,\n                       product + num_words_secp160r1); /* (Rq, q) = q * c */\n\n  carry = mg_uecc_vli_add(result, product, tmp,\n                          num_words_secp160r1); /* (C, r) = r + q */\n  mg_uecc_vli_clear(product, num_words_secp160r1);\n  omega_mult_secp160r1(product, tmp + num_words_secp160r1); /* Rq*c */\n  carry += mg_uecc_vli_add(result, result, product,\n                           num_words_secp160r1); /* (C1, r) = r + Rq*c */\n\n  while (carry > 0) {\n    --carry;\n    mg_uecc_vli_sub(result, result, curve_secp160r1.p, num_words_secp160r1);\n  }\n  if (mg_uecc_vli_cmp_unsafe(result, curve_secp160r1.p, num_words_secp160r1) >\n      0) {\n    mg_uecc_vli_sub(result, result, curve_secp160r1.p, num_words_secp160r1);\n  }\n}\n#endif\n\n#if MG_UECC_WORD_SIZE == 1\nstatic void omega_mult_secp160r1(uint8_t *result, const uint8_t *right) {\n  uint8_t carry;\n  uint8_t i;\n\n  /* Multiply by (2^31 + 1). */\n  mg_uecc_vli_set(result + 4, right, num_words_secp160r1); /* 2^32 */\n  mg_uecc_vli_rshift1(result + 4, num_words_secp160r1);    /* 2^31 */\n  result[3] = right[0] << 7; /* get last bit from shift */\n\n  carry = mg_uecc_vli_add(result, result, right,\n                          num_words_secp160r1); /* 2^31 + 1 */\n  for (i = num_words_secp160r1; carry; ++i) {\n    uint16_t sum = (uint16_t) result[i] + carry;\n    result[i] = (uint8_t) sum;\n    carry = sum >> 8;\n  }\n}\n#elif MG_UECC_WORD_SIZE == 4\nstatic void omega_mult_secp160r1(uint32_t *result, const uint32_t *right) {\n  uint32_t carry;\n  unsigned i;\n\n  /* Multiply by (2^31 + 1). */\n  mg_uecc_vli_set(result + 1, right, num_words_secp160r1); /* 2^32 */\n  mg_uecc_vli_rshift1(result + 1, num_words_secp160r1);    /* 2^31 */\n  result[0] = right[0] << 31; /* get last bit from shift */\n\n  carry = mg_uecc_vli_add(result, result, right,\n                          num_words_secp160r1); /* 2^31 + 1 */\n  for (i = num_words_secp160r1; carry; ++i) {\n    uint64_t sum = (uint64_t) result[i] + carry;\n    result[i] = (uint32_t) sum;\n    carry = sum >> 32;\n  }\n}\n#endif /* MG_UECC_WORD_SIZE */\n#endif /* (MG_UECC_OPTIMIZATION_LEVEL > 0 && !asm_mmod_fast_secp160r1) */\n\n#endif /* MG_UECC_SUPPORTS_secp160r1 */\n\n#if MG_UECC_SUPPORTS_secp192r1\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\nstatic void vli_mmod_fast_secp192r1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product);\n#endif\n\nstatic const struct MG_UECC_Curve_t curve_secp192r1 = {\n    num_words_secp192r1,\n    num_bytes_secp192r1,\n    192, /* num_n_bits */\n    {BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FE, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(31, 28, D2, B4, B1, C9, 6B, 14),\n     BYTES_TO_WORDS_8(36, F8, DE, 99, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(12, 10, FF, 82, FD, 0A, FF, F4),\n     BYTES_TO_WORDS_8(00, 88, A1, 43, EB, 20, BF, 7C),\n     BYTES_TO_WORDS_8(F6, 90, 30, B0, 0E, A8, 8D, 18),\n\n     BYTES_TO_WORDS_8(11, 48, 79, 1E, A1, 77, F9, 73),\n     BYTES_TO_WORDS_8(D5, CD, 24, 6B, ED, 11, 10, 63),\n     BYTES_TO_WORDS_8(78, DA, C8, FF, 95, 2B, 19, 07)},\n    {BYTES_TO_WORDS_8(B1, B9, 46, C1, EC, DE, B8, FE),\n     BYTES_TO_WORDS_8(49, 30, 24, 72, AB, E9, A7, 0F),\n     BYTES_TO_WORDS_8(E7, 80, 9C, E5, 19, 05, 21, 64)},\n    &double_jacobian_default,\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n    &mod_sqrt_default,\n#endif\n    &x_side_default,\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n    &vli_mmod_fast_secp192r1\n#endif\n};\n\nMG_UECC_Curve mg_uecc_secp192r1(void) {\n  return &curve_secp192r1;\n}\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n/* Computes result = product % curve_p.\n   See algorithm 5 and 6 from http://www.isys.uni-klu.ac.at/PDF/2001-0126-MT.pdf\n */\n#if MG_UECC_WORD_SIZE == 1\nstatic void vli_mmod_fast_secp192r1(uint8_t *result, uint8_t *product) {\n  uint8_t tmp[num_words_secp192r1];\n  uint8_t carry;\n\n  mg_uecc_vli_set(result, product, num_words_secp192r1);\n\n  mg_uecc_vli_set(tmp, &product[24], num_words_secp192r1);\n  carry = mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  tmp[0] = tmp[1] = tmp[2] = tmp[3] = tmp[4] = tmp[5] = tmp[6] = tmp[7] = 0;\n  tmp[8] = product[24];\n  tmp[9] = product[25];\n  tmp[10] = product[26];\n  tmp[11] = product[27];\n  tmp[12] = product[28];\n  tmp[13] = product[29];\n  tmp[14] = product[30];\n  tmp[15] = product[31];\n  tmp[16] = product[32];\n  tmp[17] = product[33];\n  tmp[18] = product[34];\n  tmp[19] = product[35];\n  tmp[20] = product[36];\n  tmp[21] = product[37];\n  tmp[22] = product[38];\n  tmp[23] = product[39];\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  tmp[0] = tmp[8] = product[40];\n  tmp[1] = tmp[9] = product[41];\n  tmp[2] = tmp[10] = product[42];\n  tmp[3] = tmp[11] = product[43];\n  tmp[4] = tmp[12] = product[44];\n  tmp[5] = tmp[13] = product[45];\n  tmp[6] = tmp[14] = product[46];\n  tmp[7] = tmp[15] = product[47];\n  tmp[16] = tmp[17] = tmp[18] = tmp[19] = tmp[20] = tmp[21] = tmp[22] =\n      tmp[23] = 0;\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  while (carry || mg_uecc_vli_cmp_unsafe(curve_secp192r1.p, result,\n                                         num_words_secp192r1) != 1) {\n    carry -=\n        mg_uecc_vli_sub(result, result, curve_secp192r1.p, num_words_secp192r1);\n  }\n}\n#elif MG_UECC_WORD_SIZE == 4\nstatic void vli_mmod_fast_secp192r1(uint32_t *result, uint32_t *product) {\n  uint32_t tmp[num_words_secp192r1];\n  int carry;\n\n  mg_uecc_vli_set(result, product, num_words_secp192r1);\n\n  mg_uecc_vli_set(tmp, &product[6], num_words_secp192r1);\n  carry = mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  tmp[0] = tmp[1] = 0;\n  tmp[2] = product[6];\n  tmp[3] = product[7];\n  tmp[4] = product[8];\n  tmp[5] = product[9];\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  tmp[0] = tmp[2] = product[10];\n  tmp[1] = tmp[3] = product[11];\n  tmp[4] = tmp[5] = 0;\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  while (carry || mg_uecc_vli_cmp_unsafe(curve_secp192r1.p, result,\n                                         num_words_secp192r1) != 1) {\n    carry -=\n        mg_uecc_vli_sub(result, result, curve_secp192r1.p, num_words_secp192r1);\n  }\n}\n#else\nstatic void vli_mmod_fast_secp192r1(uint64_t *result, uint64_t *product) {\n  uint64_t tmp[num_words_secp192r1];\n  int carry;\n\n  mg_uecc_vli_set(result, product, num_words_secp192r1);\n\n  mg_uecc_vli_set(tmp, &product[3], num_words_secp192r1);\n  carry = (int) mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  tmp[0] = 0;\n  tmp[1] = product[3];\n  tmp[2] = product[4];\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  tmp[0] = tmp[1] = product[5];\n  tmp[2] = 0;\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  while (carry || mg_uecc_vli_cmp_unsafe(curve_secp192r1.p, result,\n                                         num_words_secp192r1) != 1) {\n    carry -=\n        mg_uecc_vli_sub(result, result, curve_secp192r1.p, num_words_secp192r1);\n  }\n}\n#endif /* MG_UECC_WORD_SIZE */\n#endif /* (MG_UECC_OPTIMIZATION_LEVEL > 0) */\n\n#endif /* MG_UECC_SUPPORTS_secp192r1 */\n\n#if MG_UECC_SUPPORTS_secp224r1\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\nstatic void mod_sqrt_secp224r1(mg_uecc_word_t *a, MG_UECC_Curve curve);\n#endif\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\nstatic void vli_mmod_fast_secp224r1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product);\n#endif\n\nstatic const struct MG_UECC_Curve_t curve_secp224r1 = {\n    num_words_secp224r1,\n    num_bytes_secp224r1,\n    224, /* num_n_bits */\n    {BYTES_TO_WORDS_8(01, 00, 00, 00, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_4(FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(3D, 2A, 5C, 5C, 45, 29, DD, 13),\n     BYTES_TO_WORDS_8(3E, F0, B8, E0, A2, 16, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_4(FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(21, 1D, 5C, 11, D6, 80, 32, 34),\n     BYTES_TO_WORDS_8(22, 11, C2, 56, D3, C1, 03, 4A),\n     BYTES_TO_WORDS_8(B9, 90, 13, 32, 7F, BF, B4, 6B),\n     BYTES_TO_WORDS_4(BD, 0C, 0E, B7),\n\n     BYTES_TO_WORDS_8(34, 7E, 00, 85, 99, 81, D5, 44),\n     BYTES_TO_WORDS_8(64, 47, 07, 5A, A0, 75, 43, CD),\n     BYTES_TO_WORDS_8(E6, DF, 22, 4C, FB, 23, F7, B5),\n     BYTES_TO_WORDS_4(88, 63, 37, BD)},\n    {BYTES_TO_WORDS_8(B4, FF, 55, 23, 43, 39, 0B, 27),\n     BYTES_TO_WORDS_8(BA, D8, BF, D7, B7, B0, 44, 50),\n     BYTES_TO_WORDS_8(56, 32, 41, F5, AB, B3, 04, 0C),\n     BYTES_TO_WORDS_4(85, 0A, 05, B4)},\n    &double_jacobian_default,\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n    &mod_sqrt_secp224r1,\n#endif\n    &x_side_default,\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n    &vli_mmod_fast_secp224r1\n#endif\n};\n\nMG_UECC_Curve mg_uecc_secp224r1(void) {\n  return &curve_secp224r1;\n}\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n/* Routine 3.2.4 RS;  from http://www.nsa.gov/ia/_files/nist-routines.pdf */\nstatic void mod_sqrt_secp224r1_rs(mg_uecc_word_t *d1, mg_uecc_word_t *e1,\n                                  mg_uecc_word_t *f1, const mg_uecc_word_t *d0,\n                                  const mg_uecc_word_t *e0,\n                                  const mg_uecc_word_t *f0) {\n  mg_uecc_word_t t[num_words_secp224r1];\n\n  mg_uecc_vli_modSquare_fast(t, d0, &curve_secp224r1);    /* t <-- d0 ^ 2 */\n  mg_uecc_vli_modMult_fast(e1, d0, e0, &curve_secp224r1); /* e1 <-- d0 * e0 */\n  mg_uecc_vli_modAdd(d1, t, f0, curve_secp224r1.p,\n                     num_words_secp224r1); /* d1 <-- t  + f0 */\n  mg_uecc_vli_modAdd(e1, e1, e1, curve_secp224r1.p,\n                     num_words_secp224r1);               /* e1 <-- e1 + e1 */\n  mg_uecc_vli_modMult_fast(f1, t, f0, &curve_secp224r1); /* f1 <-- t  * f0 */\n  mg_uecc_vli_modAdd(f1, f1, f1, curve_secp224r1.p,\n                     num_words_secp224r1); /* f1 <-- f1 + f1 */\n  mg_uecc_vli_modAdd(f1, f1, f1, curve_secp224r1.p,\n                     num_words_secp224r1); /* f1 <-- f1 + f1 */\n}\n\n/* Routine 3.2.5 RSS;  from http://www.nsa.gov/ia/_files/nist-routines.pdf */\nstatic void mod_sqrt_secp224r1_rss(mg_uecc_word_t *d1, mg_uecc_word_t *e1,\n                                   mg_uecc_word_t *f1, const mg_uecc_word_t *d0,\n                                   const mg_uecc_word_t *e0,\n                                   const mg_uecc_word_t *f0,\n                                   const bitcount_t j) {\n  bitcount_t i;\n\n  mg_uecc_vli_set(d1, d0, num_words_secp224r1); /* d1 <-- d0 */\n  mg_uecc_vli_set(e1, e0, num_words_secp224r1); /* e1 <-- e0 */\n  mg_uecc_vli_set(f1, f0, num_words_secp224r1); /* f1 <-- f0 */\n  for (i = 1; i <= j; i++) {\n    mod_sqrt_secp224r1_rs(d1, e1, f1, d1, e1, f1); /* RS (d1,e1,f1,d1,e1,f1) */\n  }\n}\n\n/* Routine 3.2.6 RM;  from http://www.nsa.gov/ia/_files/nist-routines.pdf */\nstatic void mod_sqrt_secp224r1_rm(mg_uecc_word_t *d2, mg_uecc_word_t *e2,\n                                  mg_uecc_word_t *f2, const mg_uecc_word_t *c,\n                                  const mg_uecc_word_t *d0,\n                                  const mg_uecc_word_t *e0,\n                                  const mg_uecc_word_t *d1,\n                                  const mg_uecc_word_t *e1) {\n  mg_uecc_word_t t1[num_words_secp224r1];\n  mg_uecc_word_t t2[num_words_secp224r1];\n\n  mg_uecc_vli_modMult_fast(t1, e0, e1, &curve_secp224r1); /* t1 <-- e0 * e1 */\n  mg_uecc_vli_modMult_fast(t1, t1, c, &curve_secp224r1);  /* t1 <-- t1 * c */\n  /* t1 <-- p  - t1 */\n  mg_uecc_vli_modSub(t1, curve_secp224r1.p, t1, curve_secp224r1.p,\n                     num_words_secp224r1);\n  mg_uecc_vli_modMult_fast(t2, d0, d1, &curve_secp224r1); /* t2 <-- d0 * d1 */\n  mg_uecc_vli_modAdd(t2, t2, t1, curve_secp224r1.p,\n                     num_words_secp224r1);                /* t2 <-- t2 + t1 */\n  mg_uecc_vli_modMult_fast(t1, d0, e1, &curve_secp224r1); /* t1 <-- d0 * e1 */\n  mg_uecc_vli_modMult_fast(e2, d1, e0, &curve_secp224r1); /* e2 <-- d1 * e0 */\n  mg_uecc_vli_modAdd(e2, e2, t1, curve_secp224r1.p,\n                     num_words_secp224r1);               /* e2 <-- e2 + t1 */\n  mg_uecc_vli_modSquare_fast(f2, e2, &curve_secp224r1);  /* f2 <-- e2^2 */\n  mg_uecc_vli_modMult_fast(f2, f2, c, &curve_secp224r1); /* f2 <-- f2 * c */\n  /* f2 <-- p  - f2 */\n  mg_uecc_vli_modSub(f2, curve_secp224r1.p, f2, curve_secp224r1.p,\n                     num_words_secp224r1);\n  mg_uecc_vli_set(d2, t2, num_words_secp224r1); /* d2 <-- t2 */\n}\n\n/* Routine 3.2.7 RP;  from http://www.nsa.gov/ia/_files/nist-routines.pdf */\nstatic void mod_sqrt_secp224r1_rp(mg_uecc_word_t *d1, mg_uecc_word_t *e1,\n                                  mg_uecc_word_t *f1, const mg_uecc_word_t *c,\n                                  const mg_uecc_word_t *r) {\n  wordcount_t i;\n  wordcount_t pow2i = 1;\n  mg_uecc_word_t d0[num_words_secp224r1];\n  mg_uecc_word_t e0[num_words_secp224r1] = {1}; /* e0 <-- 1 */\n  mg_uecc_word_t f0[num_words_secp224r1];\n\n  mg_uecc_vli_set(d0, r, num_words_secp224r1); /* d0 <-- r */\n  /* f0 <-- p  - c */\n  mg_uecc_vli_modSub(f0, curve_secp224r1.p, c, curve_secp224r1.p,\n                     num_words_secp224r1);\n  for (i = 0; i <= 6; i++) {\n    mod_sqrt_secp224r1_rss(d1, e1, f1, d0, e0, f0,\n                           pow2i); /* RSS (d1,e1,f1,d0,e0,f0,2^i) */\n    mod_sqrt_secp224r1_rm(d1, e1, f1, c, d1, e1, d0,\n                          e0); /* RM (d1,e1,f1,c,d1,e1,d0,e0) */\n    mg_uecc_vli_set(d0, d1, num_words_secp224r1); /* d0 <-- d1 */\n    mg_uecc_vli_set(e0, e1, num_words_secp224r1); /* e0 <-- e1 */\n    mg_uecc_vli_set(f0, f1, num_words_secp224r1); /* f0 <-- f1 */\n    pow2i *= 2;\n  }\n}\n\n/* Compute a = sqrt(a) (mod curve_p). */\n/* Routine 3.2.8 mp_mod_sqrt_224; from\n * http://www.nsa.gov/ia/_files/nist-routines.pdf */\nstatic void mod_sqrt_secp224r1(mg_uecc_word_t *a, MG_UECC_Curve curve) {\n  (void) curve;\n  bitcount_t i;\n  mg_uecc_word_t e1[num_words_secp224r1];\n  mg_uecc_word_t f1[num_words_secp224r1];\n  mg_uecc_word_t d0[num_words_secp224r1];\n  mg_uecc_word_t e0[num_words_secp224r1];\n  mg_uecc_word_t f0[num_words_secp224r1];\n  mg_uecc_word_t d1[num_words_secp224r1];\n\n  /* s = a; using constant instead of random value */\n  mod_sqrt_secp224r1_rp(d0, e0, f0, a, a); /* RP (d0, e0, f0, c, s) */\n  mod_sqrt_secp224r1_rs(d1, e1, f1, d0, e0,\n                        f0); /* RS (d1, e1, f1, d0, e0, f0) */\n  for (i = 1; i <= 95; i++) {\n    mg_uecc_vli_set(d0, d1, num_words_secp224r1); /* d0 <-- d1 */\n    mg_uecc_vli_set(e0, e1, num_words_secp224r1); /* e0 <-- e1 */\n    mg_uecc_vli_set(f0, f1, num_words_secp224r1); /* f0 <-- f1 */\n    mod_sqrt_secp224r1_rs(d1, e1, f1, d0, e0,\n                          f0); /* RS (d1, e1, f1, d0, e0, f0) */\n    if (mg_uecc_vli_isZero(d1, num_words_secp224r1)) { /* if d1 == 0 */\n      break;\n    }\n  }\n  mg_uecc_vli_modInv(f1, e0, curve_secp224r1.p,\n                     num_words_secp224r1);               /* f1 <-- 1 / e0 */\n  mg_uecc_vli_modMult_fast(a, d0, f1, &curve_secp224r1); /* a  <-- d0 / e0 */\n}\n#endif /* MG_UECC_SUPPORT_COMPRESSED_POINT */\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n/* Computes result = product % curve_p\n   from http://www.nsa.gov/ia/_files/nist-routines.pdf */\n#if MG_UECC_WORD_SIZE == 1\nstatic void vli_mmod_fast_secp224r1(uint8_t *result, uint8_t *product) {\n  uint8_t tmp[num_words_secp224r1];\n  int8_t carry;\n\n  /* t */\n  mg_uecc_vli_set(result, product, num_words_secp224r1);\n\n  /* s1 */\n  tmp[0] = tmp[1] = tmp[2] = tmp[3] = 0;\n  tmp[4] = tmp[5] = tmp[6] = tmp[7] = 0;\n  tmp[8] = tmp[9] = tmp[10] = tmp[11] = 0;\n  tmp[12] = product[28];\n  tmp[13] = product[29];\n  tmp[14] = product[30];\n  tmp[15] = product[31];\n  tmp[16] = product[32];\n  tmp[17] = product[33];\n  tmp[18] = product[34];\n  tmp[19] = product[35];\n  tmp[20] = product[36];\n  tmp[21] = product[37];\n  tmp[22] = product[38];\n  tmp[23] = product[39];\n  tmp[24] = product[40];\n  tmp[25] = product[41];\n  tmp[26] = product[42];\n  tmp[27] = product[43];\n  carry = mg_uecc_vli_add(result, result, tmp, num_words_secp224r1);\n\n  /* s2 */\n  tmp[12] = product[44];\n  tmp[13] = product[45];\n  tmp[14] = product[46];\n  tmp[15] = product[47];\n  tmp[16] = product[48];\n  tmp[17] = product[49];\n  tmp[18] = product[50];\n  tmp[19] = product[51];\n  tmp[20] = product[52];\n  tmp[21] = product[53];\n  tmp[22] = product[54];\n  tmp[23] = product[55];\n  tmp[24] = tmp[25] = tmp[26] = tmp[27] = 0;\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp224r1);\n\n  /* d1 */\n  tmp[0] = product[28];\n  tmp[1] = product[29];\n  tmp[2] = product[30];\n  tmp[3] = product[31];\n  tmp[4] = product[32];\n  tmp[5] = product[33];\n  tmp[6] = product[34];\n  tmp[7] = product[35];\n  tmp[8] = product[36];\n  tmp[9] = product[37];\n  tmp[10] = product[38];\n  tmp[11] = product[39];\n  tmp[12] = product[40];\n  tmp[13] = product[41];\n  tmp[14] = product[42];\n  tmp[15] = product[43];\n  tmp[16] = product[44];\n  tmp[17] = product[45];\n  tmp[18] = product[46];\n  tmp[19] = product[47];\n  tmp[20] = product[48];\n  tmp[21] = product[49];\n  tmp[22] = product[50];\n  tmp[23] = product[51];\n  tmp[24] = product[52];\n  tmp[25] = product[53];\n  tmp[26] = product[54];\n  tmp[27] = product[55];\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp224r1);\n\n  /* d2 */\n  tmp[0] = product[44];\n  tmp[1] = product[45];\n  tmp[2] = product[46];\n  tmp[3] = product[47];\n  tmp[4] = product[48];\n  tmp[5] = product[49];\n  tmp[6] = product[50];\n  tmp[7] = product[51];\n  tmp[8] = product[52];\n  tmp[9] = product[53];\n  tmp[10] = product[54];\n  tmp[11] = product[55];\n  tmp[12] = tmp[13] = tmp[14] = tmp[15] = 0;\n  tmp[16] = tmp[17] = tmp[18] = tmp[19] = 0;\n  tmp[20] = tmp[21] = tmp[22] = tmp[23] = 0;\n  tmp[24] = tmp[25] = tmp[26] = tmp[27] = 0;\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp224r1);\n\n  if (carry < 0) {\n    do {\n      carry += mg_uecc_vli_add(result, result, curve_secp224r1.p,\n                               num_words_secp224r1);\n    } while (carry < 0);\n  } else {\n    while (carry || mg_uecc_vli_cmp_unsafe(curve_secp224r1.p, result,\n                                           num_words_secp224r1) != 1) {\n      carry -= mg_uecc_vli_sub(result, result, curve_secp224r1.p,\n                               num_words_secp224r1);\n    }\n  }\n}\n#elif MG_UECC_WORD_SIZE == 4\nstatic void vli_mmod_fast_secp224r1(uint32_t *result, uint32_t *product) {\n  uint32_t tmp[num_words_secp224r1];\n  int carry;\n\n  /* t */\n  mg_uecc_vli_set(result, product, num_words_secp224r1);\n\n  /* s1 */\n  tmp[0] = tmp[1] = tmp[2] = 0;\n  tmp[3] = product[7];\n  tmp[4] = product[8];\n  tmp[5] = product[9];\n  tmp[6] = product[10];\n  carry = mg_uecc_vli_add(result, result, tmp, num_words_secp224r1);\n\n  /* s2 */\n  tmp[3] = product[11];\n  tmp[4] = product[12];\n  tmp[5] = product[13];\n  tmp[6] = 0;\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp224r1);\n\n  /* d1 */\n  tmp[0] = product[7];\n  tmp[1] = product[8];\n  tmp[2] = product[9];\n  tmp[3] = product[10];\n  tmp[4] = product[11];\n  tmp[5] = product[12];\n  tmp[6] = product[13];\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp224r1);\n\n  /* d2 */\n  tmp[0] = product[11];\n  tmp[1] = product[12];\n  tmp[2] = product[13];\n  tmp[3] = tmp[4] = tmp[5] = tmp[6] = 0;\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp224r1);\n\n  if (carry < 0) {\n    do {\n      carry += mg_uecc_vli_add(result, result, curve_secp224r1.p,\n                               num_words_secp224r1);\n    } while (carry < 0);\n  } else {\n    while (carry || mg_uecc_vli_cmp_unsafe(curve_secp224r1.p, result,\n                                           num_words_secp224r1) != 1) {\n      carry -= mg_uecc_vli_sub(result, result, curve_secp224r1.p,\n                               num_words_secp224r1);\n    }\n  }\n}\n#else\nstatic void vli_mmod_fast_secp224r1(uint64_t *result, uint64_t *product) {\n  uint64_t tmp[num_words_secp224r1];\n  int carry = 0;\n\n  /* t */\n  mg_uecc_vli_set(result, product, num_words_secp224r1);\n  result[num_words_secp224r1 - 1] &= 0xffffffff;\n\n  /* s1 */\n  tmp[0] = 0;\n  tmp[1] = product[3] & 0xffffffff00000000ull;\n  tmp[2] = product[4];\n  tmp[3] = product[5] & 0xffffffff;\n  mg_uecc_vli_add(result, result, tmp, num_words_secp224r1);\n\n  /* s2 */\n  tmp[1] = product[5] & 0xffffffff00000000ull;\n  tmp[2] = product[6];\n  tmp[3] = 0;\n  mg_uecc_vli_add(result, result, tmp, num_words_secp224r1);\n\n  /* d1 */\n  tmp[0] = (product[3] >> 32) | (product[4] << 32);\n  tmp[1] = (product[4] >> 32) | (product[5] << 32);\n  tmp[2] = (product[5] >> 32) | (product[6] << 32);\n  tmp[3] = product[6] >> 32;\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp224r1);\n\n  /* d2 */\n  tmp[0] = (product[5] >> 32) | (product[6] << 32);\n  tmp[1] = product[6] >> 32;\n  tmp[2] = tmp[3] = 0;\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp224r1);\n\n  if (carry < 0) {\n    do {\n      carry += mg_uecc_vli_add(result, result, curve_secp224r1.p,\n                               num_words_secp224r1);\n    } while (carry < 0);\n  } else {\n    while (mg_uecc_vli_cmp_unsafe(curve_secp224r1.p, result,\n                                  num_words_secp224r1) != 1) {\n      mg_uecc_vli_sub(result, result, curve_secp224r1.p, num_words_secp224r1);\n    }\n  }\n}\n#endif /* MG_UECC_WORD_SIZE */\n#endif /* (MG_UECC_OPTIMIZATION_LEVEL > 0) */\n\n#endif /* MG_UECC_SUPPORTS_secp224r1 */\n\n#if MG_UECC_SUPPORTS_secp256r1\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\nstatic void vli_mmod_fast_secp256r1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product);\n#endif\n\nstatic const struct MG_UECC_Curve_t curve_secp256r1 = {\n    num_words_secp256r1,\n    num_bytes_secp256r1,\n    256, /* num_n_bits */\n    {BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(01, 00, 00, 00, FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(51, 25, 63, FC, C2, CA, B9, F3),\n     BYTES_TO_WORDS_8(84, 9E, 17, A7, AD, FA, E6, BC),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(96, C2, 98, D8, 45, 39, A1, F4),\n     BYTES_TO_WORDS_8(A0, 33, EB, 2D, 81, 7D, 03, 77),\n     BYTES_TO_WORDS_8(F2, 40, A4, 63, E5, E6, BC, F8),\n     BYTES_TO_WORDS_8(47, 42, 2C, E1, F2, D1, 17, 6B),\n\n     BYTES_TO_WORDS_8(F5, 51, BF, 37, 68, 40, B6, CB),\n     BYTES_TO_WORDS_8(CE, 5E, 31, 6B, 57, 33, CE, 2B),\n     BYTES_TO_WORDS_8(16, 9E, 0F, 7C, 4A, EB, E7, 8E),\n     BYTES_TO_WORDS_8(9B, 7F, 1A, FE, E2, 42, E3, 4F)},\n    {BYTES_TO_WORDS_8(4B, 60, D2, 27, 3E, 3C, CE, 3B),\n     BYTES_TO_WORDS_8(F6, B0, 53, CC, B0, 06, 1D, 65),\n     BYTES_TO_WORDS_8(BC, 86, 98, 76, 55, BD, EB, B3),\n     BYTES_TO_WORDS_8(E7, 93, 3A, AA, D8, 35, C6, 5A)},\n    &double_jacobian_default,\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n    &mod_sqrt_default,\n#endif\n    &x_side_default,\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n    &vli_mmod_fast_secp256r1\n#endif\n};\n\nMG_UECC_Curve mg_uecc_secp256r1(void) {\n  return &curve_secp256r1;\n}\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0 && !asm_mmod_fast_secp256r1)\n/* Computes result = product % curve_p\n   from http://www.nsa.gov/ia/_files/nist-routines.pdf */\n#if MG_UECC_WORD_SIZE == 1\nstatic void vli_mmod_fast_secp256r1(uint8_t *result, uint8_t *product) {\n  uint8_t tmp[num_words_secp256r1];\n  int8_t carry;\n\n  /* t */\n  mg_uecc_vli_set(result, product, num_words_secp256r1);\n\n  /* s1 */\n  tmp[0] = tmp[1] = tmp[2] = tmp[3] = 0;\n  tmp[4] = tmp[5] = tmp[6] = tmp[7] = 0;\n  tmp[8] = tmp[9] = tmp[10] = tmp[11] = 0;\n  tmp[12] = product[44];\n  tmp[13] = product[45];\n  tmp[14] = product[46];\n  tmp[15] = product[47];\n  tmp[16] = product[48];\n  tmp[17] = product[49];\n  tmp[18] = product[50];\n  tmp[19] = product[51];\n  tmp[20] = product[52];\n  tmp[21] = product[53];\n  tmp[22] = product[54];\n  tmp[23] = product[55];\n  tmp[24] = product[56];\n  tmp[25] = product[57];\n  tmp[26] = product[58];\n  tmp[27] = product[59];\n  tmp[28] = product[60];\n  tmp[29] = product[61];\n  tmp[30] = product[62];\n  tmp[31] = product[63];\n  carry = mg_uecc_vli_add(tmp, tmp, tmp, num_words_secp256r1);\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s2 */\n  tmp[12] = product[48];\n  tmp[13] = product[49];\n  tmp[14] = product[50];\n  tmp[15] = product[51];\n  tmp[16] = product[52];\n  tmp[17] = product[53];\n  tmp[18] = product[54];\n  tmp[19] = product[55];\n  tmp[20] = product[56];\n  tmp[21] = product[57];\n  tmp[22] = product[58];\n  tmp[23] = product[59];\n  tmp[24] = product[60];\n  tmp[25] = product[61];\n  tmp[26] = product[62];\n  tmp[27] = product[63];\n  tmp[28] = tmp[29] = tmp[30] = tmp[31] = 0;\n  carry += mg_uecc_vli_add(tmp, tmp, tmp, num_words_secp256r1);\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s3 */\n  tmp[0] = product[32];\n  tmp[1] = product[33];\n  tmp[2] = product[34];\n  tmp[3] = product[35];\n  tmp[4] = product[36];\n  tmp[5] = product[37];\n  tmp[6] = product[38];\n  tmp[7] = product[39];\n  tmp[8] = product[40];\n  tmp[9] = product[41];\n  tmp[10] = product[42];\n  tmp[11] = product[43];\n  tmp[12] = tmp[13] = tmp[14] = tmp[15] = 0;\n  tmp[16] = tmp[17] = tmp[18] = tmp[19] = 0;\n  tmp[20] = tmp[21] = tmp[22] = tmp[23] = 0;\n  tmp[24] = product[56];\n  tmp[25] = product[57];\n  tmp[26] = product[58];\n  tmp[27] = product[59];\n  tmp[28] = product[60];\n  tmp[29] = product[61];\n  tmp[30] = product[62];\n  tmp[31] = product[63];\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s4 */\n  tmp[0] = product[36];\n  tmp[1] = product[37];\n  tmp[2] = product[38];\n  tmp[3] = product[39];\n  tmp[4] = product[40];\n  tmp[5] = product[41];\n  tmp[6] = product[42];\n  tmp[7] = product[43];\n  tmp[8] = product[44];\n  tmp[9] = product[45];\n  tmp[10] = product[46];\n  tmp[11] = product[47];\n  tmp[12] = product[52];\n  tmp[13] = product[53];\n  tmp[14] = product[54];\n  tmp[15] = product[55];\n  tmp[16] = product[56];\n  tmp[17] = product[57];\n  tmp[18] = product[58];\n  tmp[19] = product[59];\n  tmp[20] = product[60];\n  tmp[21] = product[61];\n  tmp[22] = product[62];\n  tmp[23] = product[63];\n  tmp[24] = product[52];\n  tmp[25] = product[53];\n  tmp[26] = product[54];\n  tmp[27] = product[55];\n  tmp[28] = product[32];\n  tmp[29] = product[33];\n  tmp[30] = product[34];\n  tmp[31] = product[35];\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* d1 */\n  tmp[0] = product[44];\n  tmp[1] = product[45];\n  tmp[2] = product[46];\n  tmp[3] = product[47];\n  tmp[4] = product[48];\n  tmp[5] = product[49];\n  tmp[6] = product[50];\n  tmp[7] = product[51];\n  tmp[8] = product[52];\n  tmp[9] = product[53];\n  tmp[10] = product[54];\n  tmp[11] = product[55];\n  tmp[12] = tmp[13] = tmp[14] = tmp[15] = 0;\n  tmp[16] = tmp[17] = tmp[18] = tmp[19] = 0;\n  tmp[20] = tmp[21] = tmp[22] = tmp[23] = 0;\n  tmp[24] = product[32];\n  tmp[25] = product[33];\n  tmp[26] = product[34];\n  tmp[27] = product[35];\n  tmp[28] = product[40];\n  tmp[29] = product[41];\n  tmp[30] = product[42];\n  tmp[31] = product[43];\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d2 */\n  tmp[0] = product[48];\n  tmp[1] = product[49];\n  tmp[2] = product[50];\n  tmp[3] = product[51];\n  tmp[4] = product[52];\n  tmp[5] = product[53];\n  tmp[6] = product[54];\n  tmp[7] = product[55];\n  tmp[8] = product[56];\n  tmp[9] = product[57];\n  tmp[10] = product[58];\n  tmp[11] = product[59];\n  tmp[12] = product[60];\n  tmp[13] = product[61];\n  tmp[14] = product[62];\n  tmp[15] = product[63];\n  tmp[16] = tmp[17] = tmp[18] = tmp[19] = 0;\n  tmp[20] = tmp[21] = tmp[22] = tmp[23] = 0;\n  tmp[24] = product[36];\n  tmp[25] = product[37];\n  tmp[26] = product[38];\n  tmp[27] = product[39];\n  tmp[28] = product[44];\n  tmp[29] = product[45];\n  tmp[30] = product[46];\n  tmp[31] = product[47];\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d3 */\n  tmp[0] = product[52];\n  tmp[1] = product[53];\n  tmp[2] = product[54];\n  tmp[3] = product[55];\n  tmp[4] = product[56];\n  tmp[5] = product[57];\n  tmp[6] = product[58];\n  tmp[7] = product[59];\n  tmp[8] = product[60];\n  tmp[9] = product[61];\n  tmp[10] = product[62];\n  tmp[11] = product[63];\n  tmp[12] = product[32];\n  tmp[13] = product[33];\n  tmp[14] = product[34];\n  tmp[15] = product[35];\n  tmp[16] = product[36];\n  tmp[17] = product[37];\n  tmp[18] = product[38];\n  tmp[19] = product[39];\n  tmp[20] = product[40];\n  tmp[21] = product[41];\n  tmp[22] = product[42];\n  tmp[23] = product[43];\n  tmp[24] = tmp[25] = tmp[26] = tmp[27] = 0;\n  tmp[28] = product[48];\n  tmp[29] = product[49];\n  tmp[30] = product[50];\n  tmp[31] = product[51];\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d4 */\n  tmp[0] = product[56];\n  tmp[1] = product[57];\n  tmp[2] = product[58];\n  tmp[3] = product[59];\n  tmp[4] = product[60];\n  tmp[5] = product[61];\n  tmp[6] = product[62];\n  tmp[7] = product[63];\n  tmp[8] = tmp[9] = tmp[10] = tmp[11] = 0;\n  tmp[12] = product[36];\n  tmp[13] = product[37];\n  tmp[14] = product[38];\n  tmp[15] = product[39];\n  tmp[16] = product[40];\n  tmp[17] = product[41];\n  tmp[18] = product[42];\n  tmp[19] = product[43];\n  tmp[20] = product[44];\n  tmp[21] = product[45];\n  tmp[22] = product[46];\n  tmp[23] = product[47];\n  tmp[24] = tmp[25] = tmp[26] = tmp[27] = 0;\n  tmp[28] = product[52];\n  tmp[29] = product[53];\n  tmp[30] = product[54];\n  tmp[31] = product[55];\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  if (carry < 0) {\n    do {\n      carry += mg_uecc_vli_add(result, result, curve_secp256r1.p,\n                               num_words_secp256r1);\n    } while (carry < 0);\n  } else {\n    while (carry || mg_uecc_vli_cmp_unsafe(curve_secp256r1.p, result,\n                                           num_words_secp256r1) != 1) {\n      carry -= mg_uecc_vli_sub(result, result, curve_secp256r1.p,\n                               num_words_secp256r1);\n    }\n  }\n}\n#elif MG_UECC_WORD_SIZE == 4\nstatic void vli_mmod_fast_secp256r1(uint32_t *result, uint32_t *product) {\n  uint32_t tmp[num_words_secp256r1];\n  int carry;\n\n  /* t */\n  mg_uecc_vli_set(result, product, num_words_secp256r1);\n\n  /* s1 */\n  tmp[0] = tmp[1] = tmp[2] = 0;\n  tmp[3] = product[11];\n  tmp[4] = product[12];\n  tmp[5] = product[13];\n  tmp[6] = product[14];\n  tmp[7] = product[15];\n  carry = (int) mg_uecc_vli_add(tmp, tmp, tmp, num_words_secp256r1);\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s2 */\n  tmp[3] = product[12];\n  tmp[4] = product[13];\n  tmp[5] = product[14];\n  tmp[6] = product[15];\n  tmp[7] = 0;\n  carry += (int) mg_uecc_vli_add(tmp, tmp, tmp, num_words_secp256r1);\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s3 */\n  tmp[0] = product[8];\n  tmp[1] = product[9];\n  tmp[2] = product[10];\n  tmp[3] = tmp[4] = tmp[5] = 0;\n  tmp[6] = product[14];\n  tmp[7] = product[15];\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s4 */\n  tmp[0] = product[9];\n  tmp[1] = product[10];\n  tmp[2] = product[11];\n  tmp[3] = product[13];\n  tmp[4] = product[14];\n  tmp[5] = product[15];\n  tmp[6] = product[13];\n  tmp[7] = product[8];\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* d1 */\n  tmp[0] = product[11];\n  tmp[1] = product[12];\n  tmp[2] = product[13];\n  tmp[3] = tmp[4] = tmp[5] = 0;\n  tmp[6] = product[8];\n  tmp[7] = product[10];\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d2 */\n  tmp[0] = product[12];\n  tmp[1] = product[13];\n  tmp[2] = product[14];\n  tmp[3] = product[15];\n  tmp[4] = tmp[5] = 0;\n  tmp[6] = product[9];\n  tmp[7] = product[11];\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d3 */\n  tmp[0] = product[13];\n  tmp[1] = product[14];\n  tmp[2] = product[15];\n  tmp[3] = product[8];\n  tmp[4] = product[9];\n  tmp[5] = product[10];\n  tmp[6] = 0;\n  tmp[7] = product[12];\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d4 */\n  tmp[0] = product[14];\n  tmp[1] = product[15];\n  tmp[2] = 0;\n  tmp[3] = product[9];\n  tmp[4] = product[10];\n  tmp[5] = product[11];\n  tmp[6] = 0;\n  tmp[7] = product[13];\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  if (carry < 0) {\n    do {\n      carry += (int) mg_uecc_vli_add(result, result, curve_secp256r1.p,\n                                     num_words_secp256r1);\n    } while (carry < 0);\n  } else {\n    while (carry || mg_uecc_vli_cmp_unsafe(curve_secp256r1.p, result,\n                                           num_words_secp256r1) != 1) {\n      carry -= (int) mg_uecc_vli_sub(result, result, curve_secp256r1.p,\n                                     num_words_secp256r1);\n    }\n  }\n}\n#else\nstatic void vli_mmod_fast_secp256r1(uint64_t *result, uint64_t *product) {\n  uint64_t tmp[num_words_secp256r1];\n  int carry;\n\n  /* t */\n  mg_uecc_vli_set(result, product, num_words_secp256r1);\n\n  /* s1 */\n  tmp[0] = 0;\n  tmp[1] = product[5] & 0xffffffff00000000U;\n  tmp[2] = product[6];\n  tmp[3] = product[7];\n  carry = (int) mg_uecc_vli_add(tmp, tmp, tmp, num_words_secp256r1);\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s2 */\n  tmp[1] = product[6] << 32;\n  tmp[2] = (product[6] >> 32) | (product[7] << 32);\n  tmp[3] = product[7] >> 32;\n  carry += (int) mg_uecc_vli_add(tmp, tmp, tmp, num_words_secp256r1);\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s3 */\n  tmp[0] = product[4];\n  tmp[1] = product[5] & 0xffffffff;\n  tmp[2] = 0;\n  tmp[3] = product[7];\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s4 */\n  tmp[0] = (product[4] >> 32) | (product[5] << 32);\n  tmp[1] = (product[5] >> 32) | (product[6] & 0xffffffff00000000U);\n  tmp[2] = product[7];\n  tmp[3] = (product[6] >> 32) | (product[4] << 32);\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* d1 */\n  tmp[0] = (product[5] >> 32) | (product[6] << 32);\n  tmp[1] = (product[6] >> 32);\n  tmp[2] = 0;\n  tmp[3] = (product[4] & 0xffffffff) | (product[5] << 32);\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d2 */\n  tmp[0] = product[6];\n  tmp[1] = product[7];\n  tmp[2] = 0;\n  tmp[3] = (product[4] >> 32) | (product[5] & 0xffffffff00000000);\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d3 */\n  tmp[0] = (product[6] >> 32) | (product[7] << 32);\n  tmp[1] = (product[7] >> 32) | (product[4] << 32);\n  tmp[2] = (product[4] >> 32) | (product[5] << 32);\n  tmp[3] = (product[6] << 32);\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d4 */\n  tmp[0] = product[7];\n  tmp[1] = product[4] & 0xffffffff00000000U;\n  tmp[2] = product[5];\n  tmp[3] = product[6] & 0xffffffff00000000U;\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  if (carry < 0) {\n    do {\n      carry += (int) mg_uecc_vli_add(result, result, curve_secp256r1.p,\n                                     num_words_secp256r1);\n    } while (carry < 0);\n  } else {\n    while (carry || mg_uecc_vli_cmp_unsafe(curve_secp256r1.p, result,\n                                           num_words_secp256r1) != 1) {\n      carry -= (int) mg_uecc_vli_sub(result, result, curve_secp256r1.p,\n                                     num_words_secp256r1);\n    }\n  }\n}\n#endif /* MG_UECC_WORD_SIZE */\n#endif /* (MG_UECC_OPTIMIZATION_LEVEL > 0 && !asm_mmod_fast_secp256r1) */\n\n#endif /* MG_UECC_SUPPORTS_secp256r1 */\n\n#if MG_UECC_SUPPORTS_secp256k1\n\nstatic void double_jacobian_secp256k1(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                                      mg_uecc_word_t *Z1, MG_UECC_Curve curve);\nstatic void x_side_secp256k1(mg_uecc_word_t *result, const mg_uecc_word_t *x,\n                             MG_UECC_Curve curve);\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\nstatic void vli_mmod_fast_secp256k1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product);\n#endif\n\nstatic const struct MG_UECC_Curve_t curve_secp256k1 = {\n    num_words_secp256k1,\n    num_bytes_secp256k1,\n    256, /* num_n_bits */\n    {BYTES_TO_WORDS_8(2F, FC, FF, FF, FE, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(41, 41, 36, D0, 8C, 5E, D2, BF),\n     BYTES_TO_WORDS_8(3B, A0, 48, AF, E6, DC, AE, BA),\n     BYTES_TO_WORDS_8(FE, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(98, 17, F8, 16, 5B, 81, F2, 59),\n     BYTES_TO_WORDS_8(D9, 28, CE, 2D, DB, FC, 9B, 02),\n     BYTES_TO_WORDS_8(07, 0B, 87, CE, 95, 62, A0, 55),\n     BYTES_TO_WORDS_8(AC, BB, DC, F9, 7E, 66, BE, 79),\n\n     BYTES_TO_WORDS_8(B8, D4, 10, FB, 8F, D0, 47, 9C),\n     BYTES_TO_WORDS_8(19, 54, 85, A6, 48, B4, 17, FD),\n     BYTES_TO_WORDS_8(A8, 08, 11, 0E, FC, FB, A4, 5D),\n     BYTES_TO_WORDS_8(65, C4, A3, 26, 77, DA, 3A, 48)},\n    {BYTES_TO_WORDS_8(07, 00, 00, 00, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, 00, 00, 00, 00)},\n    &double_jacobian_secp256k1,\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n    &mod_sqrt_default,\n#endif\n    &x_side_secp256k1,\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n    &vli_mmod_fast_secp256k1\n#endif\n};\n\nMG_UECC_Curve mg_uecc_secp256k1(void) {\n  return &curve_secp256k1;\n}\n\n/* Double in place */\nstatic void double_jacobian_secp256k1(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                                      mg_uecc_word_t *Z1, MG_UECC_Curve curve) {\n  /* t1 = X, t2 = Y, t3 = Z */\n  mg_uecc_word_t t4[num_words_secp256k1];\n  mg_uecc_word_t t5[num_words_secp256k1];\n\n  if (mg_uecc_vli_isZero(Z1, num_words_secp256k1)) {\n    return;\n  }\n\n  mg_uecc_vli_modSquare_fast(t5, Y1, curve);   /* t5 = y1^2 */\n  mg_uecc_vli_modMult_fast(t4, X1, t5, curve); /* t4 = x1*y1^2 = A */\n  mg_uecc_vli_modSquare_fast(X1, X1, curve);   /* t1 = x1^2 */\n  mg_uecc_vli_modSquare_fast(t5, t5, curve);   /* t5 = y1^4 */\n  mg_uecc_vli_modMult_fast(Z1, Y1, Z1, curve); /* t3 = y1*z1 = z3 */\n\n  mg_uecc_vli_modAdd(Y1, X1, X1, curve->p,\n                     num_words_secp256k1); /* t2 = 2*x1^2 */\n  mg_uecc_vli_modAdd(Y1, Y1, X1, curve->p,\n                     num_words_secp256k1); /* t2 = 3*x1^2 */\n  if (mg_uecc_vli_testBit(Y1, 0)) {\n    mg_uecc_word_t carry =\n        mg_uecc_vli_add(Y1, Y1, curve->p, num_words_secp256k1);\n    mg_uecc_vli_rshift1(Y1, num_words_secp256k1);\n    Y1[num_words_secp256k1 - 1] |= carry << (MG_UECC_WORD_BITS - 1);\n  } else {\n    mg_uecc_vli_rshift1(Y1, num_words_secp256k1);\n  }\n  /* t2 = 3/2*(x1^2) = B */\n\n  mg_uecc_vli_modSquare_fast(X1, Y1, curve); /* t1 = B^2 */\n  mg_uecc_vli_modSub(X1, X1, t4, curve->p,\n                     num_words_secp256k1); /* t1 = B^2 - A */\n  mg_uecc_vli_modSub(X1, X1, t4, curve->p,\n                     num_words_secp256k1); /* t1 = B^2 - 2A = x3 */\n\n  mg_uecc_vli_modSub(t4, t4, X1, curve->p,\n                     num_words_secp256k1);     /* t4 = A - x3 */\n  mg_uecc_vli_modMult_fast(Y1, Y1, t4, curve); /* t2 = B * (A - x3) */\n  mg_uecc_vli_modSub(Y1, Y1, t5, curve->p,\n                     num_words_secp256k1); /* t2 = B * (A - x3) - y1^4 = y3 */\n}\n\n/* Computes result = x^3 + b. result must not overlap x. */\nstatic void x_side_secp256k1(mg_uecc_word_t *result, const mg_uecc_word_t *x,\n                             MG_UECC_Curve curve) {\n  mg_uecc_vli_modSquare_fast(result, x, curve);       /* r = x^2 */\n  mg_uecc_vli_modMult_fast(result, result, x, curve); /* r = x^3 */\n  mg_uecc_vli_modAdd(result, result, curve->b, curve->p,\n                     num_words_secp256k1); /* r = x^3 + b */\n}\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0 && !asm_mmod_fast_secp256k1)\nstatic void omega_mult_secp256k1(mg_uecc_word_t *result,\n                                 const mg_uecc_word_t *right);\nstatic void vli_mmod_fast_secp256k1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product) {\n  mg_uecc_word_t tmp[2 * num_words_secp256k1];\n  mg_uecc_word_t carry;\n\n  mg_uecc_vli_clear(tmp, num_words_secp256k1);\n  mg_uecc_vli_clear(tmp + num_words_secp256k1, num_words_secp256k1);\n\n  omega_mult_secp256k1(tmp,\n                       product + num_words_secp256k1); /* (Rq, q) = q * c */\n\n  carry = mg_uecc_vli_add(result, product, tmp,\n                          num_words_secp256k1); /* (C, r) = r + q       */\n  mg_uecc_vli_clear(product, num_words_secp256k1);\n  omega_mult_secp256k1(product, tmp + num_words_secp256k1); /* Rq*c */\n  carry += mg_uecc_vli_add(result, result, product,\n                           num_words_secp256k1); /* (C1, r) = r + Rq*c */\n\n  while (carry > 0) {\n    --carry;\n    mg_uecc_vli_sub(result, result, curve_secp256k1.p, num_words_secp256k1);\n  }\n  if (mg_uecc_vli_cmp_unsafe(result, curve_secp256k1.p, num_words_secp256k1) >\n      0) {\n    mg_uecc_vli_sub(result, result, curve_secp256k1.p, num_words_secp256k1);\n  }\n}\n\n#if MG_UECC_WORD_SIZE == 1\nstatic void omega_mult_secp256k1(uint8_t *result, const uint8_t *right) {\n  /* Multiply by (2^32 + 2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1). */\n  mg_uecc_word_t r0 = 0;\n  mg_uecc_word_t r1 = 0;\n  mg_uecc_word_t r2 = 0;\n  wordcount_t k;\n\n  /* Multiply by (2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1). */\n  muladd(0xD1, right[0], &r0, &r1, &r2);\n  result[0] = r0;\n  r0 = r1;\n  r1 = r2;\n  /* r2 is still 0 */\n\n  for (k = 1; k < num_words_secp256k1; ++k) {\n    muladd(0x03, right[k - 1], &r0, &r1, &r2);\n    muladd(0xD1, right[k], &r0, &r1, &r2);\n    result[k] = r0;\n    r0 = r1;\n    r1 = r2;\n    r2 = 0;\n  }\n  muladd(0x03, right[num_words_secp256k1 - 1], &r0, &r1, &r2);\n  result[num_words_secp256k1] = r0;\n  result[num_words_secp256k1 + 1] = r1;\n  /* add the 2^32 multiple */\n  result[4 + num_words_secp256k1] =\n      mg_uecc_vli_add(result + 4, result + 4, right, num_words_secp256k1);\n}\n#elif MG_UECC_WORD_SIZE == 4\nstatic void omega_mult_secp256k1(uint32_t *result, const uint32_t *right) {\n  /* Multiply by (2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1). */\n  uint32_t carry = 0;\n  wordcount_t k;\n\n  for (k = 0; k < num_words_secp256k1; ++k) {\n    uint64_t p = (uint64_t) 0x3D1 * right[k] + carry;\n    result[k] = (uint32_t) p;\n    carry = p >> 32;\n  }\n  result[num_words_secp256k1] = carry;\n  /* add the 2^32 multiple */\n  result[1 + num_words_secp256k1] =\n      mg_uecc_vli_add(result + 1, result + 1, right, num_words_secp256k1);\n}\n#else\nstatic void omega_mult_secp256k1(uint64_t *result, const uint64_t *right) {\n  mg_uecc_word_t r0 = 0;\n  mg_uecc_word_t r1 = 0;\n  mg_uecc_word_t r2 = 0;\n  wordcount_t k;\n\n  /* Multiply by (2^32 + 2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1). */\n  for (k = 0; k < num_words_secp256k1; ++k) {\n    muladd(0x1000003D1ull, right[k], &r0, &r1, &r2);\n    result[k] = r0;\n    r0 = r1;\n    r1 = r2;\n    r2 = 0;\n  }\n  result[num_words_secp256k1] = r0;\n}\n#endif /* MG_UECC_WORD_SIZE */\n#endif /* (MG_UECC_OPTIMIZATION_LEVEL > 0 &&  && !asm_mmod_fast_secp256k1) */\n\n#endif /* MG_UECC_SUPPORTS_secp256k1 */\n\n#endif /* _UECC_CURVE_SPECIFIC_H_ */\n\n/* Returns 1 if 'point' is the point at infinity, 0 otherwise. */\n#define EccPoint_isZero(point, curve) \\\n  mg_uecc_vli_isZero((point), (wordcount_t) ((curve)->num_words * 2))\n\n/* Point multiplication algorithm using Montgomery's ladder with co-Z\ncoordinates. From http://eprint.iacr.org/2011/338.pdf\n*/\n\n/* Modify (x1, y1) => (x1 * z^2, y1 * z^3) */\nstatic void apply_z(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                    const mg_uecc_word_t *const Z, MG_UECC_Curve curve) {\n  mg_uecc_word_t t1[MG_UECC_MAX_WORDS];\n\n  mg_uecc_vli_modSquare_fast(t1, Z, curve);    /* z^2 */\n  mg_uecc_vli_modMult_fast(X1, X1, t1, curve); /* x1 * z^2 */\n  mg_uecc_vli_modMult_fast(t1, t1, Z, curve);  /* z^3 */\n  mg_uecc_vli_modMult_fast(Y1, Y1, t1, curve); /* y1 * z^3 */\n}\n\n/* P = (x1, y1) => 2P, (x2, y2) => P' */\nstatic void XYcZ_initial_double(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                                mg_uecc_word_t *X2, mg_uecc_word_t *Y2,\n                                const mg_uecc_word_t *const initial_Z,\n                                MG_UECC_Curve curve) {\n  mg_uecc_word_t z[MG_UECC_MAX_WORDS];\n  wordcount_t num_words = curve->num_words;\n  if (initial_Z) {\n    mg_uecc_vli_set(z, initial_Z, num_words);\n  } else {\n    mg_uecc_vli_clear(z, num_words);\n    z[0] = 1;\n  }\n\n  mg_uecc_vli_set(X2, X1, num_words);\n  mg_uecc_vli_set(Y2, Y1, num_words);\n\n  apply_z(X1, Y1, z, curve);\n  curve->double_jacobian(X1, Y1, z, curve);\n  apply_z(X2, Y2, z, curve);\n}\n\n/* Input P = (x1, y1, Z), Q = (x2, y2, Z)\n   Output P' = (x1', y1', Z3), P + Q = (x3, y3, Z3)\n   or P => P', Q => P + Q\n*/\nstatic void XYcZ_add(mg_uecc_word_t *X1, mg_uecc_word_t *Y1, mg_uecc_word_t *X2,\n                     mg_uecc_word_t *Y2, MG_UECC_Curve curve) {\n  /* t1 = X1, t2 = Y1, t3 = X2, t4 = Y2 */\n  mg_uecc_word_t t5[MG_UECC_MAX_WORDS] = {0};\n  wordcount_t num_words = curve->num_words;\n\n  mg_uecc_vli_modSub(t5, X2, X1, curve->p, num_words); /* t5 = x2 - x1 */\n  mg_uecc_vli_modSquare_fast(t5, t5, curve);   /* t5 = (x2 - x1)^2 = A */\n  mg_uecc_vli_modMult_fast(X1, X1, t5, curve); /* t1 = x1*A = B */\n  mg_uecc_vli_modMult_fast(X2, X2, t5, curve); /* t3 = x2*A = C */\n  mg_uecc_vli_modSub(Y2, Y2, Y1, curve->p, num_words); /* t4 = y2 - y1 */\n  mg_uecc_vli_modSquare_fast(t5, Y2, curve); /* t5 = (y2 - y1)^2 = D */\n\n  mg_uecc_vli_modSub(t5, t5, X1, curve->p, num_words); /* t5 = D - B */\n  mg_uecc_vli_modSub(t5, t5, X2, curve->p, num_words); /* t5 = D - B - C = x3 */\n  mg_uecc_vli_modSub(X2, X2, X1, curve->p, num_words); /* t3 = C - B */\n  mg_uecc_vli_modMult_fast(Y1, Y1, X2, curve);         /* t2 = y1*(C - B) */\n  mg_uecc_vli_modSub(X2, X1, t5, curve->p, num_words); /* t3 = B - x3 */\n  mg_uecc_vli_modMult_fast(Y2, Y2, X2, curve); /* t4 = (y2 - y1)*(B - x3) */\n  mg_uecc_vli_modSub(Y2, Y2, Y1, curve->p, num_words); /* t4 = y3 */\n\n  mg_uecc_vli_set(X2, t5, num_words);\n}\n\n/* Input P = (x1, y1, Z), Q = (x2, y2, Z)\n   Output P + Q = (x3, y3, Z3), P - Q = (x3', y3', Z3)\n   or P => P - Q, Q => P + Q\n*/\nstatic void XYcZ_addC(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                      mg_uecc_word_t *X2, mg_uecc_word_t *Y2,\n                      MG_UECC_Curve curve) {\n  /* t1 = X1, t2 = Y1, t3 = X2, t4 = Y2 */\n  mg_uecc_word_t t5[MG_UECC_MAX_WORDS] = {0};\n  mg_uecc_word_t t6[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t t7[MG_UECC_MAX_WORDS];\n  wordcount_t num_words = curve->num_words;\n\n  mg_uecc_vli_modSub(t5, X2, X1, curve->p, num_words); /* t5 = x2 - x1 */\n  mg_uecc_vli_modSquare_fast(t5, t5, curve);   /* t5 = (x2 - x1)^2 = A */\n  mg_uecc_vli_modMult_fast(X1, X1, t5, curve); /* t1 = x1*A = B */\n  mg_uecc_vli_modMult_fast(X2, X2, t5, curve); /* t3 = x2*A = C */\n  mg_uecc_vli_modAdd(t5, Y2, Y1, curve->p, num_words); /* t5 = y2 + y1 */\n  mg_uecc_vli_modSub(Y2, Y2, Y1, curve->p, num_words); /* t4 = y2 - y1 */\n\n  mg_uecc_vli_modSub(t6, X2, X1, curve->p, num_words); /* t6 = C - B */\n  mg_uecc_vli_modMult_fast(Y1, Y1, t6, curve); /* t2 = y1 * (C - B) = E */\n  mg_uecc_vli_modAdd(t6, X1, X2, curve->p, num_words); /* t6 = B + C */\n  mg_uecc_vli_modSquare_fast(X2, Y2, curve); /* t3 = (y2 - y1)^2 = D */\n  mg_uecc_vli_modSub(X2, X2, t6, curve->p,\n                     num_words); /* t3 = D - (B + C) = x3 */\n\n  mg_uecc_vli_modSub(t7, X1, X2, curve->p, num_words); /* t7 = B - x3 */\n  mg_uecc_vli_modMult_fast(Y2, Y2, t7, curve); /* t4 = (y2 - y1)*(B - x3) */\n  mg_uecc_vli_modSub(Y2, Y2, Y1, curve->p,\n                     num_words); /* t4 = (y2 - y1)*(B - x3) - E = y3 */\n\n  mg_uecc_vli_modSquare_fast(t7, t5, curve); /* t7 = (y2 + y1)^2 = F */\n  mg_uecc_vli_modSub(t7, t7, t6, curve->p,\n                     num_words); /* t7 = F - (B + C) = x3' */\n  mg_uecc_vli_modSub(t6, t7, X1, curve->p, num_words); /* t6 = x3' - B */\n  mg_uecc_vli_modMult_fast(t6, t6, t5, curve); /* t6 = (y2+y1)*(x3' - B) */\n  mg_uecc_vli_modSub(Y1, t6, Y1, curve->p,\n                     num_words); /* t2 = (y2+y1)*(x3' - B) - E = y3' */\n\n  mg_uecc_vli_set(X1, t7, num_words);\n}\n\n/* result may overlap point. */\nstatic void EccPoint_mult(mg_uecc_word_t *result, const mg_uecc_word_t *point,\n                          const mg_uecc_word_t *scalar,\n                          const mg_uecc_word_t *initial_Z, bitcount_t num_bits,\n                          MG_UECC_Curve curve) {\n  /* R0 and R1 */\n  mg_uecc_word_t Rx[2][MG_UECC_MAX_WORDS];\n  mg_uecc_word_t Ry[2][MG_UECC_MAX_WORDS];\n  mg_uecc_word_t z[MG_UECC_MAX_WORDS];\n  bitcount_t i;\n  mg_uecc_word_t nb;\n  wordcount_t num_words = curve->num_words;\n\n  mg_uecc_vli_set(Rx[1], point, num_words);\n  mg_uecc_vli_set(Ry[1], point + num_words, num_words);\n\n  XYcZ_initial_double(Rx[1], Ry[1], Rx[0], Ry[0], initial_Z, curve);\n\n  for (i = num_bits - 2; i > 0; --i) {\n    nb = !mg_uecc_vli_testBit(scalar, i);\n    XYcZ_addC(Rx[1 - nb], Ry[1 - nb], Rx[nb], Ry[nb], curve);\n    XYcZ_add(Rx[nb], Ry[nb], Rx[1 - nb], Ry[1 - nb], curve);\n  }\n\n  nb = !mg_uecc_vli_testBit(scalar, 0);\n  XYcZ_addC(Rx[1 - nb], Ry[1 - nb], Rx[nb], Ry[nb], curve);\n\n  /* Find final 1/Z value. */\n  mg_uecc_vli_modSub(z, Rx[1], Rx[0], curve->p, num_words); /* X1 - X0 */\n  mg_uecc_vli_modMult_fast(z, z, Ry[1 - nb], curve);        /* Yb * (X1 - X0) */\n  mg_uecc_vli_modMult_fast(z, z, point, curve);  /* xP * Yb * (X1 - X0) */\n  mg_uecc_vli_modInv(z, z, curve->p, num_words); /* 1 / (xP * Yb * (X1 - X0)) */\n  /* yP / (xP * Yb * (X1 - X0)) */\n  mg_uecc_vli_modMult_fast(z, z, point + num_words, curve);\n  mg_uecc_vli_modMult_fast(z, z, Rx[1 - nb],\n                           curve); /* Xb * yP / (xP * Yb * (X1 - X0)) */\n  /* End 1/Z calculation */\n\n  XYcZ_add(Rx[nb], Ry[nb], Rx[1 - nb], Ry[1 - nb], curve);\n  apply_z(Rx[0], Ry[0], z, curve);\n\n  mg_uecc_vli_set(result, Rx[0], num_words);\n  mg_uecc_vli_set(result + num_words, Ry[0], num_words);\n}\n\nstatic mg_uecc_word_t regularize_k(const mg_uecc_word_t *const k,\n                                   mg_uecc_word_t *k0, mg_uecc_word_t *k1,\n                                   MG_UECC_Curve curve) {\n  wordcount_t num_n_words = BITS_TO_WORDS(curve->num_n_bits);\n  bitcount_t num_n_bits = curve->num_n_bits;\n  mg_uecc_word_t carry =\n      mg_uecc_vli_add(k0, k, curve->n, num_n_words) ||\n      (num_n_bits < ((bitcount_t) num_n_words * MG_UECC_WORD_SIZE * 8) &&\n       mg_uecc_vli_testBit(k0, num_n_bits));\n  mg_uecc_vli_add(k1, k0, curve->n, num_n_words);\n  return carry;\n}\n\n/* Generates a random integer in the range 0 < random < top.\n   Both random and top have num_words words. */\nMG_UECC_VLI_API int mg_uecc_generate_random_int(mg_uecc_word_t *random,\n                                                const mg_uecc_word_t *top,\n                                                wordcount_t num_words) {\n  mg_uecc_word_t mask = (mg_uecc_word_t) -1;\n  mg_uecc_word_t tries;\n  bitcount_t num_bits = mg_uecc_vli_numBits(top, num_words);\n\n  if (!g_rng_function) {\n    return 0;\n  }\n\n  for (tries = 0; tries < MG_UECC_RNG_MAX_TRIES; ++tries) {\n    if (!g_rng_function((uint8_t *) random,\n                        (unsigned int) (num_words * MG_UECC_WORD_SIZE))) {\n      return 0;\n    }\n    random[num_words - 1] &=\n        mask >> ((bitcount_t) (num_words * MG_UECC_WORD_SIZE * 8 - num_bits));\n    if (!mg_uecc_vli_isZero(random, num_words) &&\n        mg_uecc_vli_cmp(top, random, num_words) == 1) {\n      return 1;\n    }\n  }\n  return 0;\n}\n\nstatic mg_uecc_word_t EccPoint_compute_public_key(mg_uecc_word_t *result,\n                                                  mg_uecc_word_t *private_key,\n                                                  MG_UECC_Curve curve) {\n  mg_uecc_word_t tmp1[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tmp2[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t *p2[2] = {tmp1, tmp2};\n  mg_uecc_word_t *initial_Z = 0;\n  mg_uecc_word_t carry;\n\n  /* Regularize the bitcount for the private key so that attackers cannot use a\n     side channel attack to learn the number of leading zeros. */\n  carry = regularize_k(private_key, tmp1, tmp2, curve);\n\n  /* If an RNG function was specified, try to get a random initial Z value to\n     improve protection against side-channel attacks. */\n  if (g_rng_function) {\n    if (!mg_uecc_generate_random_int(p2[carry], curve->p, curve->num_words)) {\n      return 0;\n    }\n    initial_Z = p2[carry];\n  }\n  EccPoint_mult(result, curve->G, p2[!carry], initial_Z,\n                (bitcount_t) (curve->num_n_bits + 1), curve);\n\n  if (EccPoint_isZero(result, curve)) {\n    return 0;\n  }\n  return 1;\n}\n\n#if MG_UECC_WORD_SIZE == 1\n\nMG_UECC_VLI_API void mg_uecc_vli_nativeToBytes(uint8_t *bytes, int num_bytes,\n                                               const uint8_t *native) {\n  wordcount_t i;\n  for (i = 0; i < num_bytes; ++i) {\n    bytes[i] = native[(num_bytes - 1) - i];\n  }\n}\n\nMG_UECC_VLI_API void mg_uecc_vli_bytesToNative(uint8_t *native,\n                                               const uint8_t *bytes,\n                                               int num_bytes) {\n  mg_uecc_vli_nativeToBytes(native, num_bytes, bytes);\n}\n\n#else\n\nMG_UECC_VLI_API void mg_uecc_vli_nativeToBytes(uint8_t *bytes, int num_bytes,\n                                               const mg_uecc_word_t *native) {\n  int i;\n  for (i = 0; i < num_bytes; ++i) {\n    unsigned b = (unsigned) (num_bytes - 1 - i);\n    bytes[i] = (uint8_t) (native[b / MG_UECC_WORD_SIZE] >>\n                          (8 * (b % MG_UECC_WORD_SIZE)));\n  }\n}\n\nMG_UECC_VLI_API void mg_uecc_vli_bytesToNative(mg_uecc_word_t *native,\n                                               const uint8_t *bytes,\n                                               int num_bytes) {\n  int i;\n  mg_uecc_vli_clear(native,\n                    (wordcount_t) ((num_bytes + (MG_UECC_WORD_SIZE - 1)) /\n                                   MG_UECC_WORD_SIZE));\n  for (i = 0; i < num_bytes; ++i) {\n    unsigned b = (unsigned) (num_bytes - 1 - i);\n    native[b / MG_UECC_WORD_SIZE] |= (mg_uecc_word_t) bytes[i]\n                                     << (8 * (b % MG_UECC_WORD_SIZE));\n  }\n}\n\n#endif /* MG_UECC_WORD_SIZE */\n\nint mg_uecc_make_key(uint8_t *public_key, uint8_t *private_key,\n                     MG_UECC_Curve curve) {\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  mg_uecc_word_t *_private = (mg_uecc_word_t *) private_key;\n  mg_uecc_word_t *_public = (mg_uecc_word_t *) public_key;\n#else\n  mg_uecc_word_t _private[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t _public[MG_UECC_MAX_WORDS * 2];\n#endif\n  mg_uecc_word_t tries;\n\n  for (tries = 0; tries < MG_UECC_RNG_MAX_TRIES; ++tries) {\n    if (!mg_uecc_generate_random_int(_private, curve->n,\n                                     BITS_TO_WORDS(curve->num_n_bits))) {\n      return 0;\n    }\n\n    if (EccPoint_compute_public_key(_public, _private, curve)) {\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN == 0\n      mg_uecc_vli_nativeToBytes(private_key, BITS_TO_BYTES(curve->num_n_bits),\n                                _private);\n      mg_uecc_vli_nativeToBytes(public_key, curve->num_bytes, _public);\n      mg_uecc_vli_nativeToBytes(public_key + curve->num_bytes, curve->num_bytes,\n                                _public + curve->num_words);\n#endif\n      return 1;\n    }\n  }\n  return 0;\n}\n\nint mg_uecc_shared_secret(const uint8_t *public_key, const uint8_t *private_key,\n                          uint8_t *secret, MG_UECC_Curve curve) {\n  mg_uecc_word_t _public[MG_UECC_MAX_WORDS * 2];\n  mg_uecc_word_t _private[MG_UECC_MAX_WORDS];\n\n  mg_uecc_word_t tmp[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t *p2[2] = {_private, tmp};\n  mg_uecc_word_t *initial_Z = 0;\n  mg_uecc_word_t carry;\n  wordcount_t num_words = curve->num_words;\n  wordcount_t num_bytes = curve->num_bytes;\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy((uint8_t *) _private, private_key, num_bytes);\n  bcopy((uint8_t *) _public, public_key, num_bytes * 2);\n#else\n  mg_uecc_vli_bytesToNative(_private, private_key,\n                            BITS_TO_BYTES(curve->num_n_bits));\n  mg_uecc_vli_bytesToNative(_public, public_key, num_bytes);\n  mg_uecc_vli_bytesToNative(_public + num_words, public_key + num_bytes,\n                            num_bytes);\n#endif\n\n  /* Regularize the bitcount for the private key so that attackers cannot use a\n     side channel attack to learn the number of leading zeros. */\n  carry = regularize_k(_private, _private, tmp, curve);\n\n  /* If an RNG function was specified, try to get a random initial Z value to\n     improve protection against side-channel attacks. */\n  if (g_rng_function) {\n    if (!mg_uecc_generate_random_int(p2[carry], curve->p, num_words)) {\n      return 0;\n    }\n    initial_Z = p2[carry];\n  }\n\n  EccPoint_mult(_public, _public, p2[!carry], initial_Z,\n                (bitcount_t) (curve->num_n_bits + 1), curve);\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy((uint8_t *) secret, (uint8_t *) _public, num_bytes);\n#else\n  mg_uecc_vli_nativeToBytes(secret, num_bytes, _public);\n#endif\n  return !EccPoint_isZero(_public, curve);\n}\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\nvoid mg_uecc_compress(const uint8_t *public_key, uint8_t *compressed,\n                      MG_UECC_Curve curve) {\n  wordcount_t i;\n  for (i = 0; i < curve->num_bytes; ++i) {\n    compressed[i + 1] = public_key[i];\n  }\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  compressed[0] = 2 + (public_key[curve->num_bytes] & 0x01);\n#else\n  compressed[0] = 2 + (public_key[curve->num_bytes * 2 - 1] & 0x01);\n#endif\n}\n\nvoid mg_uecc_decompress(const uint8_t *compressed, uint8_t *public_key,\n                        MG_UECC_Curve curve) {\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  mg_uecc_word_t *point = (mg_uecc_word_t *) public_key;\n#else\n  mg_uecc_word_t point[MG_UECC_MAX_WORDS * 2];\n#endif\n  mg_uecc_word_t *y = point + curve->num_words;\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy(public_key, compressed + 1, curve->num_bytes);\n#else\n  mg_uecc_vli_bytesToNative(point, compressed + 1, curve->num_bytes);\n#endif\n  curve->x_side(y, point, curve);\n  curve->mod_sqrt(y, curve);\n\n  if ((uint8_t) (y[0] & 0x01) != (compressed[0] & 0x01)) {\n    mg_uecc_vli_sub(y, curve->p, y, curve->num_words);\n  }\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN == 0\n  mg_uecc_vli_nativeToBytes(public_key, curve->num_bytes, point);\n  mg_uecc_vli_nativeToBytes(public_key + curve->num_bytes, curve->num_bytes, y);\n#endif\n}\n#endif /* MG_UECC_SUPPORT_COMPRESSED_POINT */\n\nMG_UECC_VLI_API int mg_uecc_valid_point(const mg_uecc_word_t *point,\n                                        MG_UECC_Curve curve) {\n  mg_uecc_word_t tmp1[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tmp2[MG_UECC_MAX_WORDS];\n  wordcount_t num_words = curve->num_words;\n\n  /* The point at infinity is invalid. */\n  if (EccPoint_isZero(point, curve)) {\n    return 0;\n  }\n\n  /* x and y must be smaller than p. */\n  if (mg_uecc_vli_cmp_unsafe(curve->p, point, num_words) != 1 ||\n      mg_uecc_vli_cmp_unsafe(curve->p, point + num_words, num_words) != 1) {\n    return 0;\n  }\n\n  mg_uecc_vli_modSquare_fast(tmp1, point + num_words, curve);\n  curve->x_side(tmp2, point, curve); /* tmp2 = x^3 + ax + b */\n\n  /* Make sure that y^2 == x^3 + ax + b */\n  return (int) (mg_uecc_vli_equal(tmp1, tmp2, num_words));\n}\n\nint mg_uecc_valid_public_key(const uint8_t *public_key, MG_UECC_Curve curve) {\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  mg_uecc_word_t *_public = (mg_uecc_word_t *) public_key;\n#else\n  mg_uecc_word_t _public[MG_UECC_MAX_WORDS * 2];\n#endif\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN == 0\n  mg_uecc_vli_bytesToNative(_public, public_key, curve->num_bytes);\n  mg_uecc_vli_bytesToNative(_public + curve->num_words,\n                            public_key + curve->num_bytes, curve->num_bytes);\n#endif\n  return mg_uecc_valid_point(_public, curve);\n}\n\nint mg_uecc_compute_public_key(const uint8_t *private_key, uint8_t *public_key,\n                               MG_UECC_Curve curve) {\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  mg_uecc_word_t *_private = (mg_uecc_word_t *) private_key;\n  mg_uecc_word_t *_public = (mg_uecc_word_t *) public_key;\n#else\n  mg_uecc_word_t _private[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t _public[MG_UECC_MAX_WORDS * 2];\n#endif\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN == 0\n  mg_uecc_vli_bytesToNative(_private, private_key,\n                            BITS_TO_BYTES(curve->num_n_bits));\n#endif\n\n  /* Make sure the private key is in the range [1, n-1]. */\n  if (mg_uecc_vli_isZero(_private, BITS_TO_WORDS(curve->num_n_bits))) {\n    return 0;\n  }\n\n  if (mg_uecc_vli_cmp(curve->n, _private, BITS_TO_WORDS(curve->num_n_bits)) !=\n      1) {\n    return 0;\n  }\n\n  /* Compute public key. */\n  if (!EccPoint_compute_public_key(_public, _private, curve)) {\n    return 0;\n  }\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN == 0\n  mg_uecc_vli_nativeToBytes(public_key, curve->num_bytes, _public);\n  mg_uecc_vli_nativeToBytes(public_key + curve->num_bytes, curve->num_bytes,\n                            _public + curve->num_words);\n#endif\n  return 1;\n}\n\n/* -------- ECDSA code -------- */\n\nstatic void bits2int(mg_uecc_word_t *native, const uint8_t *bits,\n                     unsigned bits_size, MG_UECC_Curve curve) {\n  unsigned num_n_bytes = (unsigned) BITS_TO_BYTES(curve->num_n_bits);\n  unsigned num_n_words = (unsigned) BITS_TO_WORDS(curve->num_n_bits);\n  int shift;\n  mg_uecc_word_t carry;\n  mg_uecc_word_t *ptr;\n\n  if (bits_size > num_n_bytes) {\n    bits_size = num_n_bytes;\n  }\n\n  mg_uecc_vli_clear(native, (wordcount_t) num_n_words);\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy((uint8_t *) native, bits, bits_size);\n#else\n  mg_uecc_vli_bytesToNative(native, bits, (int) bits_size);\n#endif\n  if (bits_size * 8 <= (unsigned) curve->num_n_bits) {\n    return;\n  }\n  shift = (int) bits_size * 8 - curve->num_n_bits;\n  carry = 0;\n  ptr = native + num_n_words;\n  while (ptr-- > native) {\n    mg_uecc_word_t temp = *ptr;\n    *ptr = (temp >> shift) | carry;\n    carry = temp << (MG_UECC_WORD_BITS - shift);\n  }\n\n  /* Reduce mod curve_n */\n  if (mg_uecc_vli_cmp_unsafe(curve->n, native, (wordcount_t) num_n_words) !=\n      1) {\n    mg_uecc_vli_sub(native, native, curve->n, (wordcount_t) num_n_words);\n  }\n}\n\nstatic int mg_uecc_sign_with_k_internal(const uint8_t *private_key,\n                                        const uint8_t *message_hash,\n                                        unsigned hash_size, mg_uecc_word_t *k,\n                                        uint8_t *signature,\n                                        MG_UECC_Curve curve) {\n  mg_uecc_word_t tmp[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t s[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t *k2[2] = {tmp, s};\n  mg_uecc_word_t *initial_Z = 0;\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  mg_uecc_word_t *p = (mg_uecc_word_t *) signature;\n#else\n  mg_uecc_word_t p[MG_UECC_MAX_WORDS * 2];\n#endif\n  mg_uecc_word_t carry;\n  wordcount_t num_words = curve->num_words;\n  wordcount_t num_n_words = BITS_TO_WORDS(curve->num_n_bits);\n  bitcount_t num_n_bits = curve->num_n_bits;\n\n  /* Make sure 0 < k < curve_n */\n  if (mg_uecc_vli_isZero(k, num_words) ||\n      mg_uecc_vli_cmp(curve->n, k, num_n_words) != 1) {\n    return 0;\n  }\n\n  carry = regularize_k(k, tmp, s, curve);\n  /* If an RNG function was specified, try to get a random initial Z value to\n     improve protection against side-channel attacks. */\n  if (g_rng_function) {\n    if (!mg_uecc_generate_random_int(k2[carry], curve->p, num_words)) {\n      return 0;\n    }\n    initial_Z = k2[carry];\n  }\n  EccPoint_mult(p, curve->G, k2[!carry], initial_Z,\n                (bitcount_t) (num_n_bits + 1), curve);\n  if (mg_uecc_vli_isZero(p, num_words)) {\n    return 0;\n  }\n\n  /* If an RNG function was specified, get a random number\n     to prevent side channel analysis of k. */\n  if (!g_rng_function) {\n    mg_uecc_vli_clear(tmp, num_n_words);\n    tmp[0] = 1;\n  } else if (!mg_uecc_generate_random_int(tmp, curve->n, num_n_words)) {\n    return 0;\n  }\n\n  /* Prevent side channel analysis of mg_uecc_vli_modInv() to determine\n     bits of k / the private key by premultiplying by a random number */\n  mg_uecc_vli_modMult(k, k, tmp, curve->n, num_n_words); /* k' = rand * k */\n  mg_uecc_vli_modInv(k, k, curve->n, num_n_words);       /* k = 1 / k' */\n  mg_uecc_vli_modMult(k, k, tmp, curve->n, num_n_words); /* k = 1 / k */\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN == 0\n  mg_uecc_vli_nativeToBytes(signature, curve->num_bytes, p); /* store r */\n#endif\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy((uint8_t *) tmp, private_key, BITS_TO_BYTES(curve->num_n_bits));\n#else\n  mg_uecc_vli_bytesToNative(tmp, private_key,\n                            BITS_TO_BYTES(curve->num_n_bits)); /* tmp = d */\n#endif\n\n  s[num_n_words - 1] = 0;\n  mg_uecc_vli_set(s, p, num_words);\n  mg_uecc_vli_modMult(s, tmp, s, curve->n, num_n_words); /* s = r*d */\n\n  bits2int(tmp, message_hash, hash_size, curve);\n  mg_uecc_vli_modAdd(s, tmp, s, curve->n, num_n_words); /* s = e + r*d */\n  mg_uecc_vli_modMult(s, s, k, curve->n, num_n_words);  /* s = (e + r*d) / k */\n  if (mg_uecc_vli_numBits(s, num_n_words) > (bitcount_t) curve->num_bytes * 8) {\n    return 0;\n  }\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy((uint8_t *) signature + curve->num_bytes, (uint8_t *) s,\n        curve->num_bytes);\n#else\n  mg_uecc_vli_nativeToBytes(signature + curve->num_bytes, curve->num_bytes, s);\n#endif\n  return 1;\n}\n\n#if 0\n/* For testing - sign with an explicitly specified k value */\nint mg_uecc_sign_with_k(const uint8_t *private_key, const uint8_t *message_hash,\n                     unsigned hash_size, const uint8_t *k, uint8_t *signature,\n                     MG_UECC_Curve curve) {\n  mg_uecc_word_t k2[MG_UECC_MAX_WORDS];\n  bits2int(k2, k, (unsigned) BITS_TO_BYTES(curve->num_n_bits), curve);\n  return mg_uecc_sign_with_k_internal(private_key, message_hash, hash_size, k2,\n                                   signature, curve);\n}\n#endif\n\nint mg_uecc_sign(const uint8_t *private_key, const uint8_t *message_hash,\n                 unsigned hash_size, uint8_t *signature, MG_UECC_Curve curve) {\n  mg_uecc_word_t k[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tries;\n\n  for (tries = 0; tries < MG_UECC_RNG_MAX_TRIES; ++tries) {\n    if (!mg_uecc_generate_random_int(k, curve->n,\n                                     BITS_TO_WORDS(curve->num_n_bits))) {\n      return 0;\n    }\n\n    if (mg_uecc_sign_with_k_internal(private_key, message_hash, hash_size, k,\n                                     signature, curve)) {\n      return 1;\n    }\n  }\n  return 0;\n}\n\n/* Compute an HMAC using K as a key (as in RFC 6979). Note that K is always\n   the same size as the hash result size. */\nstatic void HMAC_init(const MG_UECC_HashContext *hash_context,\n                      const uint8_t *K) {\n  uint8_t *pad = hash_context->tmp + 2 * hash_context->result_size;\n  unsigned i;\n  for (i = 0; i < hash_context->result_size; ++i) pad[i] = K[i] ^ 0x36;\n  for (; i < hash_context->block_size; ++i) pad[i] = 0x36;\n\n  hash_context->init_hash(hash_context);\n  hash_context->update_hash(hash_context, pad, hash_context->block_size);\n}\n\nstatic void HMAC_update(const MG_UECC_HashContext *hash_context,\n                        const uint8_t *message, unsigned message_size) {\n  hash_context->update_hash(hash_context, message, message_size);\n}\n\nstatic void HMAC_finish(const MG_UECC_HashContext *hash_context,\n                        const uint8_t *K, uint8_t *result) {\n  uint8_t *pad = hash_context->tmp + 2 * hash_context->result_size;\n  unsigned i;\n  for (i = 0; i < hash_context->result_size; ++i) pad[i] = K[i] ^ 0x5c;\n  for (; i < hash_context->block_size; ++i) pad[i] = 0x5c;\n\n  hash_context->finish_hash(hash_context, result);\n\n  hash_context->init_hash(hash_context);\n  hash_context->update_hash(hash_context, pad, hash_context->block_size);\n  hash_context->update_hash(hash_context, result, hash_context->result_size);\n  hash_context->finish_hash(hash_context, result);\n}\n\n/* V = HMAC_K(V) */\nstatic void update_V(const MG_UECC_HashContext *hash_context, uint8_t *K,\n                     uint8_t *V) {\n  HMAC_init(hash_context, K);\n  HMAC_update(hash_context, V, hash_context->result_size);\n  HMAC_finish(hash_context, K, V);\n}\n\n/* Deterministic signing, similar to RFC 6979. Differences are:\n    * We just use H(m) directly rather than bits2octets(H(m))\n      (it is not reduced modulo curve_n).\n    * We generate a value for k (aka T) directly rather than converting\n   endianness.\n\n   Layout of hash_context->tmp: <K> | <V> | (1 byte overlapped 0x00 or 0x01) /\n   <HMAC pad> */\nint mg_uecc_sign_deterministic(const uint8_t *private_key,\n                               const uint8_t *message_hash, unsigned hash_size,\n                               const MG_UECC_HashContext *hash_context,\n                               uint8_t *signature, MG_UECC_Curve curve) {\n  uint8_t *K = hash_context->tmp;\n  uint8_t *V = K + hash_context->result_size;\n  wordcount_t num_bytes = curve->num_bytes;\n  wordcount_t num_n_words = BITS_TO_WORDS(curve->num_n_bits);\n  bitcount_t num_n_bits = curve->num_n_bits;\n  mg_uecc_word_t tries;\n  unsigned i;\n  for (i = 0; i < hash_context->result_size; ++i) {\n    V[i] = 0x01;\n    K[i] = 0;\n  }\n\n  /* K = HMAC_K(V || 0x00 || int2octets(x) || h(m)) */\n  HMAC_init(hash_context, K);\n  V[hash_context->result_size] = 0x00;\n  HMAC_update(hash_context, V, hash_context->result_size + 1);\n  HMAC_update(hash_context, private_key, (unsigned int) num_bytes);\n  HMAC_update(hash_context, message_hash, hash_size);\n  HMAC_finish(hash_context, K, K);\n\n  update_V(hash_context, K, V);\n\n  /* K = HMAC_K(V || 0x01 || int2octets(x) || h(m)) */\n  HMAC_init(hash_context, K);\n  V[hash_context->result_size] = 0x01;\n  HMAC_update(hash_context, V, hash_context->result_size + 1);\n  HMAC_update(hash_context, private_key, (unsigned int) num_bytes);\n  HMAC_update(hash_context, message_hash, hash_size);\n  HMAC_finish(hash_context, K, K);\n\n  update_V(hash_context, K, V);\n\n  for (tries = 0; tries < MG_UECC_RNG_MAX_TRIES; ++tries) {\n    mg_uecc_word_t T[MG_UECC_MAX_WORDS];\n    uint8_t *T_ptr = (uint8_t *) T;\n    wordcount_t T_bytes = 0;\n    for (;;) {\n      update_V(hash_context, K, V);\n      for (i = 0; i < hash_context->result_size; ++i) {\n        T_ptr[T_bytes++] = V[i];\n        if (T_bytes >= num_n_words * MG_UECC_WORD_SIZE) {\n          goto filled;\n        }\n      }\n    }\n  filled:\n    if ((bitcount_t) num_n_words * MG_UECC_WORD_SIZE * 8 > num_n_bits) {\n      mg_uecc_word_t mask = (mg_uecc_word_t) -1;\n      T[num_n_words - 1] &=\n          mask >>\n          ((bitcount_t) (num_n_words * MG_UECC_WORD_SIZE * 8 - num_n_bits));\n    }\n\n    if (mg_uecc_sign_with_k_internal(private_key, message_hash, hash_size, T,\n                                     signature, curve)) {\n      return 1;\n    }\n\n    /* K = HMAC_K(V || 0x00) */\n    HMAC_init(hash_context, K);\n    V[hash_context->result_size] = 0x00;\n    HMAC_update(hash_context, V, hash_context->result_size + 1);\n    HMAC_finish(hash_context, K, K);\n\n    update_V(hash_context, K, V);\n  }\n  return 0;\n}\n\nstatic bitcount_t smax(bitcount_t a, bitcount_t b) {\n  return (a > b ? a : b);\n}\n\nint mg_uecc_verify(const uint8_t *public_key, const uint8_t *message_hash,\n                   unsigned hash_size, const uint8_t *signature,\n                   MG_UECC_Curve curve) {\n  mg_uecc_word_t u1[MG_UECC_MAX_WORDS], u2[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t z[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t sum[MG_UECC_MAX_WORDS * 2];\n  mg_uecc_word_t rx[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t ry[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tx[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t ty[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tz[MG_UECC_MAX_WORDS];\n  const mg_uecc_word_t *points[4];\n  const mg_uecc_word_t *point;\n  bitcount_t num_bits;\n  bitcount_t i;\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  mg_uecc_word_t *_public = (mg_uecc_word_t *) public_key;\n#else\n  mg_uecc_word_t _public[MG_UECC_MAX_WORDS * 2];\n#endif\n  mg_uecc_word_t r[MG_UECC_MAX_WORDS], s[MG_UECC_MAX_WORDS];\n  wordcount_t num_words = curve->num_words;\n  wordcount_t num_n_words = BITS_TO_WORDS(curve->num_n_bits);\n\n  rx[num_n_words - 1] = 0;\n  r[num_n_words - 1] = 0;\n  s[num_n_words - 1] = 0;\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy((uint8_t *) r, signature, curve->num_bytes);\n  bcopy((uint8_t *) s, signature + curve->num_bytes, curve->num_bytes);\n#else\n  mg_uecc_vli_bytesToNative(_public, public_key, curve->num_bytes);\n  mg_uecc_vli_bytesToNative(_public + num_words, public_key + curve->num_bytes,\n                            curve->num_bytes);\n  mg_uecc_vli_bytesToNative(r, signature, curve->num_bytes);\n  mg_uecc_vli_bytesToNative(s, signature + curve->num_bytes, curve->num_bytes);\n#endif\n\n  /* r, s must not be 0. */\n  if (mg_uecc_vli_isZero(r, num_words) || mg_uecc_vli_isZero(s, num_words)) {\n    return 0;\n  }\n\n  /* r, s must be < n. */\n  if (mg_uecc_vli_cmp_unsafe(curve->n, r, num_n_words) != 1 ||\n      mg_uecc_vli_cmp_unsafe(curve->n, s, num_n_words) != 1) {\n    return 0;\n  }\n\n  /* Calculate u1 and u2. */\n  mg_uecc_vli_modInv(z, s, curve->n, num_n_words); /* z = 1/s */\n  u1[num_n_words - 1] = 0;\n  bits2int(u1, message_hash, hash_size, curve);\n  mg_uecc_vli_modMult(u1, u1, z, curve->n, num_n_words); /* u1 = e/s */\n  mg_uecc_vli_modMult(u2, r, z, curve->n, num_n_words);  /* u2 = r/s */\n\n  /* Calculate sum = G + Q. */\n  mg_uecc_vli_set(sum, _public, num_words);\n  mg_uecc_vli_set(sum + num_words, _public + num_words, num_words);\n  mg_uecc_vli_set(tx, curve->G, num_words);\n  mg_uecc_vli_set(ty, curve->G + num_words, num_words);\n  mg_uecc_vli_modSub(z, sum, tx, curve->p, num_words); /* z = x2 - x1 */\n  XYcZ_add(tx, ty, sum, sum + num_words, curve);\n  mg_uecc_vli_modInv(z, z, curve->p, num_words); /* z = 1/z */\n  apply_z(sum, sum + num_words, z, curve);\n\n  /* Use Shamir's trick to calculate u1*G + u2*Q */\n  points[0] = 0;\n  points[1] = curve->G;\n  points[2] = _public;\n  points[3] = sum;\n  num_bits = smax(mg_uecc_vli_numBits(u1, num_n_words),\n                  mg_uecc_vli_numBits(u2, num_n_words));\n  point =\n      points[(!!mg_uecc_vli_testBit(u1, (bitcount_t) (num_bits - 1))) |\n             ((!!mg_uecc_vli_testBit(u2, (bitcount_t) (num_bits - 1))) << 1)];\n  mg_uecc_vli_set(rx, point, num_words);\n  mg_uecc_vli_set(ry, point + num_words, num_words);\n  mg_uecc_vli_clear(z, num_words);\n  z[0] = 1;\n\n  for (i = num_bits - 2; i >= 0; --i) {\n    mg_uecc_word_t index;\n    curve->double_jacobian(rx, ry, z, curve);\n\n    index = (!!mg_uecc_vli_testBit(u1, i)) |\n            (mg_uecc_word_t) ((!!mg_uecc_vli_testBit(u2, i)) << 1);\n    point = points[index];\n    if (point) {\n      mg_uecc_vli_set(tx, point, num_words);\n      mg_uecc_vli_set(ty, point + num_words, num_words);\n      apply_z(tx, ty, z, curve);\n      mg_uecc_vli_modSub(tz, rx, tx, curve->p, num_words); /* Z = x2 - x1 */\n      XYcZ_add(tx, ty, rx, ry, curve);\n      mg_uecc_vli_modMult_fast(z, z, tz, curve);\n    }\n  }\n\n  mg_uecc_vli_modInv(z, z, curve->p, num_words); /* Z = 1/Z */\n  apply_z(rx, ry, z, curve);\n\n  /* v = x1 (mod n) */\n  if (mg_uecc_vli_cmp_unsafe(curve->n, rx, num_n_words) != 1) {\n    mg_uecc_vli_sub(rx, rx, curve->n, num_n_words);\n  }\n\n  /* Accept only if v == r. */\n  return (int) (mg_uecc_vli_equal(rx, r, num_words));\n}\n\n#if MG_UECC_ENABLE_VLI_API\n\nunsigned mg_uecc_curve_num_words(MG_UECC_Curve curve) {\n  return curve->num_words;\n}\n\nunsigned mg_uecc_curve_num_bytes(MG_UECC_Curve curve) {\n  return curve->num_bytes;\n}\n\nunsigned mg_uecc_curve_num_bits(MG_UECC_Curve curve) {\n  return curve->num_bytes * 8;\n}\n\nunsigned mg_uecc_curve_num_n_words(MG_UECC_Curve curve) {\n  return BITS_TO_WORDS(curve->num_n_bits);\n}\n\nunsigned mg_uecc_curve_num_n_bytes(MG_UECC_Curve curve) {\n  return BITS_TO_BYTES(curve->num_n_bits);\n}\n\nunsigned mg_uecc_curve_num_n_bits(MG_UECC_Curve curve) {\n  return curve->num_n_bits;\n}\n\nconst mg_uecc_word_t *mg_uecc_curve_p(MG_UECC_Curve curve) {\n  return curve->p;\n}\n\nconst mg_uecc_word_t *mg_uecc_curve_n(MG_UECC_Curve curve) {\n  return curve->n;\n}\n\nconst mg_uecc_word_t *mg_uecc_curve_G(MG_UECC_Curve curve) {\n  return curve->G;\n}\n\nconst mg_uecc_word_t *mg_uecc_curve_b(MG_UECC_Curve curve) {\n  return curve->b;\n}\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\nvoid mg_uecc_vli_mod_sqrt(mg_uecc_word_t *a, MG_UECC_Curve curve) {\n  curve->mod_sqrt(a, curve);\n}\n#endif\n\nvoid mg_uecc_vli_mmod_fast(mg_uecc_word_t *result, mg_uecc_word_t *product,\n                           MG_UECC_Curve curve) {\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n  curve->mmod_fast(result, product);\n#else\n  mg_uecc_vli_mmod(result, product, curve->p, curve->num_words);\n#endif\n}\n\nvoid mg_uecc_point_mult(mg_uecc_word_t *result, const mg_uecc_word_t *point,\n                        const mg_uecc_word_t *scalar, MG_UECC_Curve curve) {\n  mg_uecc_word_t tmp1[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tmp2[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t *p2[2] = {tmp1, tmp2};\n  mg_uecc_word_t carry = regularize_k(scalar, tmp1, tmp2, curve);\n\n  EccPoint_mult(result, point, p2[!carry], 0, curve->num_n_bits + 1, curve);\n}\n\n#endif  /* MG_UECC_ENABLE_VLI_API */\n#endif  // MG_TLS_BUILTIN\n// End of uecc BSD-2\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/tls_x25519.c\"\n#endif\n/**\n * Adapted from STROBE: https://strobe.sourceforge.io/\n * Copyright (c) 2015-2016 Cryptography Research, Inc.\n * Author: Mike Hamburg\n * License: MIT License\n */\n\n\n\n\n#if MG_TLS == MG_TLS_BUILTIN\n\nconst uint8_t X25519_BASE_POINT[X25519_BYTES] = {9};\n\n#define X25519_WBITS 32\n\ntypedef uint32_t limb_t;\ntypedef uint64_t dlimb_t;\ntypedef int64_t sdlimb_t;\n\n#define NLIMBS (256 / X25519_WBITS)\ntypedef limb_t mg_fe[NLIMBS];\n\nstatic limb_t umaal(limb_t *carry, limb_t acc, limb_t mand, limb_t mier) {\n  dlimb_t tmp = (dlimb_t) mand * mier + acc + *carry;\n  *carry = (limb_t) (tmp >> X25519_WBITS);\n  return (limb_t) tmp;\n}\n\n// These functions are implemented in terms of umaal on ARM\nstatic limb_t adc(limb_t *carry, limb_t acc, limb_t mand) {\n  dlimb_t total = (dlimb_t) *carry + acc + mand;\n  *carry = (limb_t) (total >> X25519_WBITS);\n  return (limb_t) total;\n}\n\nstatic limb_t adc0(limb_t *carry, limb_t acc) {\n  dlimb_t total = (dlimb_t) *carry + acc;\n  *carry = (limb_t) (total >> X25519_WBITS);\n  return (limb_t) total;\n}\n\n// - Precondition: carry is small.\n// - Invariant: result of propagate is < 2^255 + 1 word\n// - In particular, always less than 2p.\n// - Also, output x >= min(x,19)\nstatic void propagate(mg_fe x, limb_t over) {\n  unsigned i;\n  limb_t carry;\n  over = x[NLIMBS - 1] >> (X25519_WBITS - 1) | over << 1;\n  x[NLIMBS - 1] &= ~((limb_t) 1 << (X25519_WBITS - 1));\n\n  carry = over * 19;\n  for (i = 0; i < NLIMBS; i++) {\n    x[i] = adc0(&carry, x[i]);\n  }\n}\n\nstatic void add(mg_fe out, const mg_fe a, const mg_fe b) {\n  unsigned i;\n  limb_t carry = 0;\n  for (i = 0; i < NLIMBS; i++) {\n    out[i] = adc(&carry, a[i], b[i]);\n  }\n  propagate(out, carry);\n}\n\nstatic void sub(mg_fe out, const mg_fe a, const mg_fe b) {\n  unsigned i;\n  sdlimb_t carry = -38;\n  for (i = 0; i < NLIMBS; i++) {\n    carry = carry + a[i] - b[i];\n    out[i] = (limb_t) carry;\n    carry >>= X25519_WBITS;\n  }\n  propagate(out, (limb_t) (1 + carry));\n}\n\n// `b` can contain less than 8 limbs, thus we use `limb_t *` instead of `mg_fe`\n// to avoid build warnings\nstatic void mul(mg_fe out, const mg_fe a, const limb_t *b, unsigned nb) {\n  limb_t accum[2 * NLIMBS] = {0};\n  unsigned i, j;\n\n  limb_t carry2;\n  for (i = 0; i < nb; i++) {\n    limb_t mand = b[i];\n    carry2 = 0;\n    for (j = 0; j < NLIMBS; j++) {\n      limb_t tmp;                        // \"a\" may be misaligned\n      memcpy(&tmp, &a[j], sizeof(tmp));  // So make an aligned copy\n      accum[i + j] = umaal(&carry2, accum[i + j], mand, tmp);\n    }\n    accum[i + j] = carry2;\n  }\n\n  carry2 = 0;\n  for (j = 0; j < NLIMBS; j++) {\n    out[j] = umaal(&carry2, accum[j], 38, accum[j + NLIMBS]);\n  }\n  propagate(out, carry2);\n}\n\nstatic void sqr(mg_fe out, const mg_fe a) {\n  mul(out, a, a, NLIMBS);\n}\nstatic void mul1(mg_fe out, const mg_fe a) {\n  mul(out, a, out, NLIMBS);\n}\nstatic void sqr1(mg_fe a) {\n  mul1(a, a);\n}\n\nstatic void condswap(limb_t a[2 * NLIMBS], limb_t b[2 * NLIMBS],\n                     limb_t doswap) {\n  unsigned i;\n  for (i = 0; i < 2 * NLIMBS; i++) {\n    limb_t xor_ab = (a[i] ^ b[i]) & doswap;\n    a[i] ^= xor_ab;\n    b[i] ^= xor_ab;\n  }\n}\n\n// Canonicalize a field element x, reducing it to the least residue which is\n// congruent to it mod 2^255-19\n// - Precondition: x < 2^255 + 1 word\nstatic limb_t canon(mg_fe x) {\n  // First, add 19.\n  unsigned i;\n  limb_t carry0 = 19;\n  limb_t res;\n  sdlimb_t carry;\n  for (i = 0; i < NLIMBS; i++) {\n    x[i] = adc0(&carry0, x[i]);\n  }\n  propagate(x, carry0);\n\n  // Here, 19 <= x2 < 2^255\n  // - This is because we added 19, so before propagate it can't be less\n  // than 19. After propagate, it still can't be less than 19, because if\n  // propagate does anything it adds 19.\n  // - We know that the high bit must be clear, because either the input was ~\n  // 2^255 + one word + 19 (in which case it propagates to at most 2 words) or\n  // it was < 2^255. So now, if we subtract 19, we will get back to something in\n  // [0,2^255-19).\n  carry = -19;\n  res = 0;\n  for (i = 0; i < NLIMBS; i++) {\n    carry += x[i];\n    res |= x[i] = (limb_t) carry;\n    carry >>= X25519_WBITS;\n  }\n  return (limb_t) (((dlimb_t) res - 1) >> X25519_WBITS);\n}\n\nstatic const limb_t a24[1] = {121665};\n\nstatic void ladder_part1(mg_fe xs[5]) {\n  limb_t *x2 = xs[0], *z2 = xs[1], *x3 = xs[2], *z3 = xs[3], *t1 = xs[4];\n  add(t1, x2, z2);                                 // t1 = A\n  sub(z2, x2, z2);                                 // z2 = B\n  add(x2, x3, z3);                                 // x2 = C\n  sub(z3, x3, z3);                                 // z3 = D\n  mul1(z3, t1);                                    // z3 = DA\n  mul1(x2, z2);                                    // x3 = BC\n  add(x3, z3, x2);                                 // x3 = DA+CB\n  sub(z3, z3, x2);                                 // z3 = DA-CB\n  sqr1(t1);                                        // t1 = AA\n  sqr1(z2);                                        // z2 = BB\n  sub(x2, t1, z2);                                 // x2 = E = AA-BB\n  mul(z2, x2, a24, sizeof(a24) / sizeof(a24[0]));  // z2 = E*a24\n  add(z2, z2, t1);                                 // z2 = E*a24 + AA\n}\n\nstatic void ladder_part2(mg_fe xs[5], const mg_fe x1) {\n  limb_t *x2 = xs[0], *z2 = xs[1], *x3 = xs[2], *z3 = xs[3], *t1 = xs[4];\n  sqr1(z3);         // z3 = (DA-CB)^2\n  mul1(z3, x1);     // z3 = x1 * (DA-CB)^2\n  sqr1(x3);         // x3 = (DA+CB)^2\n  mul1(z2, x2);     // z2 = AA*(E*a24+AA)\n  sub(x2, t1, x2);  // x2 = BB again\n  mul1(x2, t1);     // x2 = AA*BB\n}\n\nstatic void x25519_core(mg_fe xs[5], const uint8_t scalar[X25519_BYTES],\n                        const uint8_t *x1, int clamp) {\n  int i;\n  mg_fe x1_limbs;\n  limb_t swap = 0;\n  limb_t *x2 = xs[0], *x3 = xs[2], *z3 = xs[3];\n  memset(xs, 0, 4 * sizeof(mg_fe));\n  x2[0] = z3[0] = 1;\n  for (i = 0; i < NLIMBS; i++) {\n    x3[i] = x1_limbs[i] =\n        MG_U32(x1[i * 4 + 3], x1[i * 4 + 2], x1[i * 4 + 1], x1[i * 4]);\n  }\n\n  for (i = 255; i >= 0; i--) {\n    uint8_t bytei = scalar[i / 8];\n    limb_t doswap;\n    if (clamp) {\n      if (i / 8 == 0) {\n        bytei &= (uint8_t) ~7U;\n      } else if (i / 8 == X25519_BYTES - 1) {\n        bytei &= 0x7F;\n        bytei |= 0x40;\n      }\n    }\n    doswap = 0 - (limb_t) ((bytei >> (i % 8)) & 1);\n    condswap(x2, x3, swap ^ doswap);\n    swap = doswap;\n\n    ladder_part1(xs);\n    ladder_part2(xs, (const limb_t *) x1_limbs);\n  }\n  condswap(x2, x3, swap);\n}\n\nint mg_tls_x25519(uint8_t out[X25519_BYTES], const uint8_t scalar[X25519_BYTES],\n                  const uint8_t x1[X25519_BYTES], int clamp) {\n  int i, ret;\n  mg_fe xs[5], out_limbs;\n  limb_t *x2, *z2, *z3, *prev;\n  static const struct {\n    uint8_t a, c, n;\n  } steps[13] = {{2, 1, 1},  {2, 1, 1},  {4, 2, 3},  {2, 4, 6},  {3, 1, 1},\n                 {3, 2, 12}, {4, 3, 25}, {2, 3, 25}, {2, 4, 50}, {3, 2, 125},\n                 {3, 1, 2},  {3, 1, 2},  {3, 1, 1}};\n  x25519_core(xs, scalar, x1, clamp);\n\n  // Precomputed inversion chain\n  x2 = xs[0];\n  z2 = xs[1];\n  z3 = xs[3];\n\n  prev = z2;\n  for (i = 0; i < 13; i++) {\n    int j;\n    limb_t *a = xs[steps[i].a];\n    for (j = steps[i].n; j > 0; j--) {\n      sqr(a, prev);\n      prev = a;\n    }\n    mul1(a, xs[steps[i].c]);\n  }\n\n  // Here prev = z3\n  // x2 /= z2\n  mul(out_limbs, x2, z3, NLIMBS);\n  ret = (int) canon(out_limbs);\n  if (!clamp) ret = 0;\n  for (i = 0; i < NLIMBS; i++) {\n    uint32_t n = out_limbs[i];\n    out[i * 4] = (uint8_t) (n & 0xff);\n    out[i * 4 + 1] = (uint8_t) ((n >> 8) & 0xff);\n    out[i * 4 + 2] = (uint8_t) ((n >> 16) & 0xff);\n    out[i * 4 + 3] = (uint8_t) ((n >> 24) & 0xff);\n  }\n  return ret;\n}\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/url.c\"\n#endif\n\n\nstruct url {\n  size_t key, user, pass, host, port, uri, end;\n};\n\nint mg_url_is_ssl(const char *url) {\n  return strncmp(url, \"wss:\", 4) == 0 || strncmp(url, \"https:\", 6) == 0 ||\n         strncmp(url, \"mqtts:\", 6) == 0 || strncmp(url, \"ssl:\", 4) == 0 ||\n         strncmp(url, \"tls:\", 4) == 0 || strncmp(url, \"tcps:\", 5) == 0;\n}\n\nstatic struct url urlparse(const char *url) {\n  size_t i;\n  struct url u;\n  memset(&u, 0, sizeof(u));\n  for (i = 0; url[i] != '\\0'; i++) {\n    if (url[i] == '/' && i > 0 && u.host == 0 && url[i - 1] == '/') {\n      u.host = i + 1;\n      u.port = 0;\n    } else if (url[i] == ']') {\n      u.port = 0;  // IPv6 URLs, like http://[::1]/bar\n    } else if (url[i] == ':' && u.port == 0 && u.uri == 0) {\n      u.port = i + 1;\n    } else if (url[i] == '@' && u.user == 0 && u.pass == 0 && u.uri == 0) {\n      u.user = u.host;\n      u.pass = u.port;\n      u.host = i + 1;\n      u.port = 0;\n    } else if (url[i] == '/' && u.host && u.uri == 0) {\n      u.uri = i;\n    }\n  }\n  u.end = i;\n#if 0\n  printf(\"[%s] %d %d %d %d %d\\n\", url, u.user, u.pass, u.host, u.port, u.uri);\n#endif\n  return u;\n}\n\nstruct mg_str mg_url_host(const char *url) {\n  struct url u = urlparse(url);\n  size_t n = u.port  ? u.port - u.host - 1\n             : u.uri ? u.uri - u.host\n                     : u.end - u.host;\n  struct mg_str s = mg_str_n(url + u.host, n);\n  return s;\n}\n\nconst char *mg_url_uri(const char *url) {\n  struct url u = urlparse(url);\n  return u.uri ? url + u.uri : \"/\";\n}\n\nunsigned short mg_url_port(const char *url) {\n  struct url u = urlparse(url);\n  unsigned short port = 0;\n  if (strncmp(url, \"http:\", 5) == 0 || strncmp(url, \"ws:\", 3) == 0) port = 80;\n  if (strncmp(url, \"wss:\", 4) == 0 || strncmp(url, \"https:\", 6) == 0)\n    port = 443;\n  if (strncmp(url, \"mqtt:\", 5) == 0) port = 1883;\n  if (strncmp(url, \"mqtts:\", 6) == 0) port = 8883;\n  if (u.port) port = (unsigned short) atoi(url + u.port);\n  return port;\n}\n\nstruct mg_str mg_url_user(const char *url) {\n  struct url u = urlparse(url);\n  struct mg_str s = mg_str(\"\");\n  if (u.user && (u.pass || u.host)) {\n    size_t n = u.pass ? u.pass - u.user - 1 : u.host - u.user - 1;\n    s = mg_str_n(url + u.user, n);\n  }\n  return s;\n}\n\nstruct mg_str mg_url_pass(const char *url) {\n  struct url u = urlparse(url);\n  struct mg_str s = mg_str_n(\"\", 0UL);\n  if (u.pass && u.host) {\n    size_t n = u.host - u.pass - 1;\n    s = mg_str_n(url + u.pass, n);\n  }\n  return s;\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/util.c\"\n#endif\n\n\n\n// Not using memset for zeroing memory, cause it can be dropped by compiler\n// See https://github.com/cesanta/mongoose/pull/1265\nvoid mg_bzero(volatile unsigned char *buf, size_t len) {\n  if (buf != NULL) {\n    while (len--) *buf++ = 0;\n  }\n}\n\n#if MG_ENABLE_CUSTOM_RANDOM\n#else\nbool mg_random(void *buf, size_t len) {\n  bool success = false;\n  unsigned char *p = (unsigned char *) buf;\n#if MG_ARCH == MG_ARCH_ESP32\n  while (len--) *p++ = (unsigned char) (esp_random() & 255);\n  success = true;\n#elif MG_ARCH == MG_ARCH_CUBE && defined(HAL_RNG_MODULE_ENABLED)\n  extern RNG_HandleTypeDef hrng;\n  for (size_t n = 0; n < len; n += sizeof(uint32_t)) {\n    uint32_t r = HAL_RNG_ReadLastRandomNumber(&hrng);\n    memcpy((char *) buf + n, &r, n + sizeof(r) > len ? len - n : sizeof(r));\n  }\n  success = true;\n#elif MG_ARCH == MG_ARCH_PICOSDK\n  while (len--) *p++ = (unsigned char) (get_rand_32() & 255);\n  success = true;\n#elif MG_ARCH == MG_ARCH_ZEPHYR\n#if MG_TLS == MG_TLS_BUILTIN ||                                    \\\n    (MG_TLS == MG_TLS_MBED && (!defined(MBEDTLS_VERSION_NUMBER) || \\\n                               MBEDTLS_VERSION_NUMBER < 0x04000000))\n  return (sys_csrand_get(buf, len) == 0);  // do not fallback on reseed error\n#else\n  sys_rand_get(buf, len);\n  success = true;\n#endif\n#elif MG_ARCH == MG_ARCH_WIN32\n#if defined(_MSC_VER) && _MSC_VER < 1700\n  static bool initialised = false;\n  static HCRYPTPROV hProv;\n  // CryptGenRandom() implementation earlier than 2008 is weak, see\n  // https://en.wikipedia.org/wiki/CryptGenRandom\n  if (!initialised) {\n    initialised = CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,\n                                      CRYPT_VERIFYCONTEXT);\n  }\n  if (initialised) success = CryptGenRandom(hProv, len, p);\n#else\n  size_t i;\n  for (i = 0; i < len; i++) {\n    unsigned int rand_v;\n    if (rand_s(&rand_v) == 0) {\n      p[i] = (unsigned char) (rand_v & 255);\n    } else {\n      break;\n    }\n  }\n  success = (i == len);\n#endif\n\n#elif MG_ARCH == MG_ARCH_UNIX\n  FILE *fp = fopen(\"/dev/urandom\", \"rb\");\n  if (fp != NULL) {\n    if (fread(buf, 1, len, fp) == len) success = true;\n    fclose(fp);\n  }\n#endif\n  // If everything above did not work, fallback to a pseudo random generator\n  if (success == false) {\n    MG_ERROR((\"Weak RNG: using rand()\"));\n    while (len--) *p++ = (unsigned char) (rand() & 255);\n  }\n  return success;\n}\n#endif\n\nchar *mg_random_str(char *buf, size_t len) {\n  size_t i;\n  mg_random(buf, len);\n  for (i = 0; i < len; i++) {\n    uint8_t c = ((uint8_t *) buf)[i] % 62U;\n    buf[i] = i == len - 1 ? (char) '\\0'            // 0-terminate last byte\n             : c < 26     ? (char) ('a' + c)       // lowercase\n             : c < 52     ? (char) ('A' + c - 26)  // uppercase\n                          : (char) ('0' + c - 52);     // numeric\n  }\n  return buf;\n}\n\nuint32_t mg_crc32(uint32_t crc, const char *buf, size_t len) {\n  static const uint32_t crclut[16] = {\n      // table for polynomial 0xEDB88320 (reflected)\n      0x00000000, 0x1DB71064, 0x3B6E20C8, 0x26D930AC, 0x76DC4190, 0x6B6B51F4,\n      0x4DB26158, 0x5005713C, 0xEDB88320, 0xF00F9344, 0xD6D6A3E8, 0xCB61B38C,\n      0x9B64C2B0, 0x86D3D2D4, 0xA00AE278, 0xBDBDF21C};\n  crc = ~crc;\n  while (len--) {\n    uint8_t b = *(uint8_t *) buf++;\n    crc = crclut[(crc ^ b) & 0x0F] ^ (crc >> 4);\n    crc = crclut[(crc ^ (b >> 4)) & 0x0F] ^ (crc >> 4);\n  }\n  return ~crc;\n}\n\nstatic int isbyte(int n) {\n  return n >= 0 && n <= 255;\n}\n\nstatic int parse_net(const char *spec, uint32_t *net, uint32_t *mask) {\n  int n, a, b, c, d, slash = 32, len = 0;\n  if ((sscanf(spec, \"%d.%d.%d.%d/%d%n\", &a, &b, &c, &d, &slash, &n) == 5 ||\n       sscanf(spec, \"%d.%d.%d.%d%n\", &a, &b, &c, &d, &n) == 4) &&\n      isbyte(a) && isbyte(b) && isbyte(c) && isbyte(d) && slash >= 0 &&\n      slash < 33) {\n    len = n;\n    *net = ((uint32_t) a << 24) | ((uint32_t) b << 16) | ((uint32_t) c << 8) |\n           (uint32_t) d;\n    *mask = slash ? (uint32_t) (0xffffffffU << (32 - slash)) : (uint32_t) 0;\n  }\n  return len;\n}\n\nint mg_check_ip_acl(struct mg_str acl, struct mg_addr *remote_ip) {\n  struct mg_str entry;\n  int allowed = acl.len == 0 ? '+' : '-';  // If any ACL is set, deny by default\n  uint32_t remote_ip4;\n  if (remote_ip->is_ip6) {\n    return -1;  // TODO(): handle IPv6 ACL and addresses\n  } else {      // IPv4\n    memcpy((void *) &remote_ip4, remote_ip->addr.ip, sizeof(remote_ip4));\n    while (mg_span(acl, &entry, &acl, ',')) {\n      uint32_t net, mask;\n      if (entry.buf[0] != '+' && entry.buf[0] != '-') return -1;\n      if (parse_net(&entry.buf[1], &net, &mask) == 0) return -2;\n      if ((mg_ntohl(remote_ip4) & mask) == net) allowed = entry.buf[0];\n    }\n  }\n  return allowed == '+';\n}\n\nbool mg_path_is_sane(const struct mg_str path) {\n  const char *s = path.buf;\n  size_t n = path.len;\n  if (path.buf[0] == '~') return false;                        // Starts with ~\n  if (path.buf[0] == '.' && path.buf[1] == '.') return false;  // Starts with ..\n  for (; s[0] != '\\0' && n > 0; s++, n--) {\n    if ((s[0] == '/' || s[0] == '\\\\') && n >= 2) {   // Subdir?\n      if (s[1] == '.' && s[2] == '.') return false;  // Starts with ..\n    }\n  }\n  return true;\n}\n\n#if MG_ENABLE_CUSTOM_MILLIS\n#else\nuint64_t mg_millis(void) {\n#if MG_ARCH == MG_ARCH_WIN32\n  return GetTickCount();\n#elif MG_ARCH == MG_ARCH_PICOSDK\n  return time_us_64() / 1000;\n#elif MG_ARCH == MG_ARCH_ESP8266 || MG_ARCH == MG_ARCH_ESP32 || \\\n    MG_ARCH == MG_ARCH_FREERTOS\n  return xTaskGetTickCount() * portTICK_PERIOD_MS;\n#elif MG_ARCH == MG_ARCH_CUBE\n  return (uint64_t) HAL_GetTick();\n#elif MG_ARCH == MG_ARCH_THREADX\n  return tx_time_get() * (1000 /* MS per SEC */ / TX_TIMER_TICKS_PER_SECOND);\n#elif MG_ARCH == MG_ARCH_TIRTOS\n  return (uint64_t) Clock_getTicks();\n#elif MG_ARCH == MG_ARCH_ZEPHYR\n  return (uint64_t) k_uptime_get();\n#elif MG_ARCH == MG_ARCH_CMSIS_RTOS1\n  return (uint64_t) rt_time_get();\n#elif MG_ARCH == MG_ARCH_CMSIS_RTOS2\n  return (uint64_t) ((osKernelGetTickCount() * 1000) / osKernelGetTickFreq());\n#elif MG_ARCH == MG_ARCH_RTTHREAD\n  return (uint64_t) ((rt_tick_get() * 1000) / RT_TICK_PER_SECOND);\n#elif MG_ARCH == MG_ARCH_UNIX && defined(__APPLE__)\n  // Apple CLOCK_MONOTONIC_RAW is equivalent to CLOCK_BOOTTIME on linux\n  // Apple CLOCK_UPTIME_RAW is equivalent to CLOCK_MONOTONIC_RAW on linux\n  return clock_gettime_nsec_np(CLOCK_UPTIME_RAW) / 1000000;\n#elif MG_ARCH == MG_ARCH_UNIX\n  struct timespec ts = {0, 0};\n  // See #1615 - prefer monotonic clock\n#if defined(CLOCK_MONOTONIC_RAW)\n  // Raw hardware-based time that is not subject to NTP adjustment\n  clock_gettime(CLOCK_MONOTONIC_RAW, &ts);\n#elif defined(CLOCK_MONOTONIC)\n  // Affected by the incremental adjustments performed by adjtime and NTP\n  clock_gettime(CLOCK_MONOTONIC, &ts);\n#else\n  // Affected by discontinuous jumps in the system time and by the incremental\n  // adjustments performed by adjtime and NTP\n  clock_gettime(CLOCK_REALTIME, &ts);\n#endif\n  return ((uint64_t) ts.tv_sec * 1000 + (uint64_t) ts.tv_nsec / 1000000);\n#elif defined(ARDUINO)\n  return (uint64_t) millis();\n#else\n  return (uint64_t) (time(NULL) * 1000);\n#endif\n}\n#endif\n\n// network format equates big endian order\nuint16_t mg_ntohs(uint16_t net) {\n  return MG_LOAD_BE16(&net);\n}\n\nuint32_t mg_ntohl(uint32_t net) {\n  return MG_LOAD_BE32(&net);\n}\n\nuint64_t mg_ntohll(uint64_t net) {\n  return MG_LOAD_BE64(&net);\n}\n\nvoid mg_delayms(unsigned int ms) {\n  uint64_t to = mg_millis() + ms + 1;\n  while (mg_millis() < to) (void) 0;\n}\n\n#if MG_ENABLE_CUSTOM_CALLOC\n#else\nvoid *mg_calloc(size_t count, size_t size) {\n  return calloc(count, size);\n}\n\nvoid mg_free(void *ptr) {\n  free(ptr);\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/wifi_dummy.c\"\n#endif\n\n\n#if (!defined(MG_ENABLE_DRIVER_PICO_W) || !MG_ENABLE_DRIVER_PICO_W) && \\\n    (!defined(MG_ENABLE_DRIVER_CYW) || !MG_ENABLE_DRIVER_CYW) && \\\n    (!defined(MG_ENABLE_DRIVER_CYW_SDIO) || !MG_ENABLE_DRIVER_CYW_SDIO) && \\\n    (!defined(MG_ENABLE_DRIVER_NXP_WIFI) || !MG_ENABLE_DRIVER_NXP_WIFI) && \\\n    (!defined(MG_ENABLE_DRIVER_ST67W6) || !MG_ENABLE_DRIVER_ST67W6)\n\n\nbool mg_wifi_scan(void) {\n  MG_ERROR((\"No Wi-Fi driver enabled\"));\n  return false;\n}\n\nbool mg_wifi_connect(struct mg_wifi_data *wifi) {\n  (void) wifi;\n  return mg_wifi_scan();\n}\n\nbool mg_wifi_disconnect(void) {\n  return mg_wifi_scan();\n}\n\nbool mg_wifi_ap_start(struct mg_wifi_data *wifi) {\n  (void) wifi;\n  return mg_wifi_scan();\n}\n\nbool mg_wifi_ap_stop(void) {\n  return mg_wifi_scan();\n}\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ws.c\"\n#endif\n\n\n\n\n\n\n\n\n\n\n\nstruct ws_msg {\n  uint8_t flags;\n  size_t header_len;\n  size_t data_len;\n};\n\nsize_t mg_ws_vprintf(struct mg_connection *c, int op, const char *fmt,\n                     va_list *ap) {\n  size_t len = c->send.len;\n  size_t n = mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, ap);\n  mg_ws_wrap(c, c->send.len - len, op);\n  return n;\n}\n\nsize_t mg_ws_printf(struct mg_connection *c, int op, const char *fmt, ...) {\n  size_t len = 0;\n  va_list ap;\n  va_start(ap, fmt);\n  len = mg_ws_vprintf(c, op, fmt, &ap);\n  va_end(ap);\n  return len;\n}\n\nstatic void ws_handshake(struct mg_connection *c, const struct mg_str *wskey,\n                         const struct mg_str *wsproto, const char *fmt,\n                         va_list *ap) {\n  const char *magic = \"258EAFA5-E914-47DA-95CA-C5AB0DC85B11\";\n  unsigned char sha[20], b64_sha[30];\n\n  mg_sha1_ctx sha_ctx;\n  mg_sha1_init(&sha_ctx);\n  mg_sha1_update(&sha_ctx, (unsigned char *) wskey->buf, wskey->len);\n  mg_sha1_update(&sha_ctx, (unsigned char *) magic, 36);\n  mg_sha1_final(sha, &sha_ctx);\n  mg_base64_encode(sha, sizeof(sha), (char *) b64_sha, sizeof(b64_sha));\n  mg_xprintf(mg_pfn_iobuf, &c->send,\n             \"HTTP/1.1 101 Switching Protocols\\r\\n\"\n             \"Upgrade: websocket\\r\\n\"\n             \"Connection: Upgrade\\r\\n\"\n             \"Sec-WebSocket-Accept: %s\\r\\n\",\n             b64_sha);\n  if (fmt != NULL) mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, ap);\n  if (wsproto != NULL) {\n    mg_printf(c, \"Sec-WebSocket-Protocol: %.*s\\r\\n\", (int) wsproto->len,\n              wsproto->buf);\n  }\n  if (!mg_send(c, \"\\r\\n\", 2)) mg_error(c, \"OOM\");\n}\n\nstatic uint32_t be32(const uint8_t *p) {\n  return (((uint32_t) p[3]) << 0) | (((uint32_t) p[2]) << 8) |\n         (((uint32_t) p[1]) << 16) | (((uint32_t) p[0]) << 24);\n}\n\nstatic size_t ws_process(uint8_t *buf, size_t len, struct ws_msg *msg) {\n  size_t i, n = 0, mask_len = 0;\n  memset(msg, 0, sizeof(*msg));\n  if (len >= 2) {\n    n = buf[1] & 0x7f;                // Frame length\n    mask_len = buf[1] & 128 ? 4 : 0;  // last bit is a mask bit\n    msg->flags = buf[0];\n    if (n < 126 && len >= mask_len) {\n      msg->data_len = n;\n      msg->header_len = 2 + mask_len;\n    } else if (n == 126 && len >= 4 + mask_len) {\n      msg->header_len = 4 + mask_len;\n      msg->data_len = (((size_t) buf[2]) << 8) | buf[3];\n    } else if (len >= 10 + mask_len) {\n      msg->header_len = 10 + mask_len;\n      msg->data_len =\n          (size_t) (((uint64_t) be32(buf + 2) << 32) + be32(buf + 6));\n    }\n  }\n  // Sanity check, and integer overflow protection for the boundary check below\n  // data_len should not be larger than 1 Gb\n  if (msg->data_len > 1024 * 1024 * 1024) return 0;\n  if (msg->header_len + msg->data_len > len) return 0;\n  if (mask_len > 0) {\n    uint8_t *p = buf + msg->header_len, *m = p - mask_len;\n    for (i = 0; i < msg->data_len; i++) p[i] ^= m[i & 3];\n  }\n  return msg->header_len + msg->data_len;\n}\n\nstatic size_t mkhdr(size_t len, int op, bool is_client, uint8_t *buf) {\n  size_t n = 0;\n  buf[0] = (uint8_t) (op | 128);\n  if (len < 126) {\n    buf[1] = (unsigned char) len;\n    n = 2;\n  } else if (len < 65536) {\n    uint16_t tmp = mg_htons((uint16_t) len);\n    buf[1] = 126;\n    memcpy(&buf[2], &tmp, sizeof(tmp));\n    n = 4;\n  } else {\n    uint32_t tmp;\n    buf[1] = 127;\n    tmp = mg_htonl((uint32_t) (((uint64_t) len) >> 32));\n    memcpy(&buf[2], &tmp, sizeof(tmp));\n    tmp = mg_htonl((uint32_t) (len & 0xffffffffU));\n    memcpy(&buf[6], &tmp, sizeof(tmp));\n    n = 10;\n  }\n  if (is_client) {\n    buf[1] |= 1 << 7;  // Set masking flag\n    mg_random(&buf[n], 4);\n    n += 4;\n  }\n  return n;\n}\n\nstatic void mg_ws_mask(struct mg_connection *c, size_t len) {\n  if (c->is_client && c->send.buf != NULL) {\n    size_t i;\n    uint8_t *p = c->send.buf + c->send.len - len, *mask = p - 4;\n    for (i = 0; i < len; i++) p[i] ^= mask[i & 3];\n  }\n}\n\nsize_t mg_ws_send(struct mg_connection *c, const void *buf, size_t len,\n                  int op) {\n  uint8_t header[14];\n  size_t header_len = mkhdr(len, op, c->is_client, header);\n  if (!mg_send(c, header, header_len)) return 0;\n  if (!mg_send(c, buf, len)) return header_len;\n  MG_VERBOSE((\"WS out: %d [%.*s]\", (int) len, (int) len, buf));\n  mg_ws_mask(c, len);\n  return header_len + len;\n}\n\nstatic bool mg_ws_client_handshake(struct mg_connection *c) {\n  int n = mg_http_get_request_len(c->recv.buf, c->recv.len);\n  if (n < 0) {\n    mg_error(c, \"not http\");  // Some just, not an HTTP request\n  } else if (n > 0) {\n    if (n < 15 || memcmp(c->recv.buf + 9, \"101\", 3) != 0) {\n      mg_error(c, \"ws handshake error\");\n    } else {\n      struct mg_http_message hm;\n      if (mg_http_parse((char *) c->recv.buf, c->recv.len, &hm)) {\n        c->is_websocket = 1;\n        mg_call(c, MG_EV_WS_OPEN, &hm);\n      } else {\n        mg_error(c, \"ws handshake error\");\n      }\n    }\n    mg_iobuf_del(&c->recv, 0, (size_t) n);\n  } else {\n    return true;  // Request is not yet received, quit event handler\n  }\n  return false;  // Continue event handler\n}\n\nstatic void mg_ws_cb(struct mg_connection *c, int ev, void *ev_data) {\n  struct ws_msg msg;\n  size_t ofs = (size_t) c->pfn_data;\n\n  // assert(ofs < c->recv.len);\n  if (ev == MG_EV_READ) {\n    if (c->is_client && !c->is_websocket && mg_ws_client_handshake(c)) return;\n\n    while (ws_process(c->recv.buf + ofs, c->recv.len - ofs, &msg) > 0) {\n      char *s = (char *) c->recv.buf + ofs + msg.header_len;\n      struct mg_ws_message m;\n      size_t len;\n      uint8_t final, op;\n      m.data.buf = s, m.data.len = msg.data_len, m.flags = msg.flags;\n      len = msg.header_len + msg.data_len;\n      final = msg.flags & 128;\n      op = msg.flags & 15;\n      // MG_VERBOSE (\"fin %d op %d len %d [%.*s]\", final, op,\n      //                       (int) m.data.len, (int) m.data.len, m.data.buf));\n      switch (op) {\n        case WEBSOCKET_OP_CONTINUE:\n          mg_call(c, MG_EV_WS_CTL, &m);\n          break;\n        case WEBSOCKET_OP_PING:\n          MG_DEBUG((\"%s\", \"WS PONG\"));\n          mg_ws_send(c, s, msg.data_len, WEBSOCKET_OP_PONG);\n          mg_call(c, MG_EV_WS_CTL, &m);\n          break;\n        case WEBSOCKET_OP_PONG:\n          mg_call(c, MG_EV_WS_CTL, &m);\n          break;\n        case WEBSOCKET_OP_TEXT:\n        case WEBSOCKET_OP_BINARY:\n          if (final) mg_call(c, MG_EV_WS_MSG, &m);\n          break;\n        case WEBSOCKET_OP_CLOSE:\n          MG_DEBUG((\"%lu WS CLOSE\", c->id));\n          mg_call(c, MG_EV_WS_CTL, &m);\n          // Echo the payload of the received CLOSE message back to the sender\n          mg_ws_send(c, m.data.buf, m.data.len, WEBSOCKET_OP_CLOSE);\n          c->is_draining = 1;\n          break;\n        default:\n          // Per RFC6455, close conn when an unknown op is recvd\n          mg_error(c, \"unknown WS op %d\", op);\n          break;\n      }\n\n      // Handle fragmented frames: strip header, keep in c->recv\n      if (final == 0 || op == 0) {\n        if (op) ofs++, len--, msg.header_len--;       // First frame\n        mg_iobuf_del(&c->recv, ofs, msg.header_len);  // Strip header\n        len -= msg.header_len;\n        ofs += len;\n        c->pfn_data = (void *) ofs;\n        // MG_INFO((\"FRAG %d [%.*s]\", (int) ofs, (int) ofs, c->recv.buf));\n      }\n      // Remove non-fragmented frame\n      if (final && op) mg_iobuf_del(&c->recv, ofs, len);\n      // Last chunk of the fragmented frame\n      if (final && !op && (ofs > 0)) {\n        m.flags = c->recv.buf[0];\n        m.data = mg_str_n((char *) &c->recv.buf[1], (size_t) (ofs - 1));\n        mg_call(c, MG_EV_WS_MSG, &m);\n        mg_iobuf_del(&c->recv, 0, ofs);\n        ofs = 0;\n        c->pfn_data = NULL;\n      }\n    }\n  }\n  (void) ev_data;\n}\n\nstruct mg_connection *mg_ws_connect(struct mg_mgr *mgr, const char *url,\n                                    mg_event_handler_t fn, void *fn_data,\n                                    const char *fmt, ...) {\n  struct mg_connection *c = mg_connect(mgr, url, fn, fn_data);\n  if (c != NULL) {\n    char nonce[16], key[30];\n    struct mg_str host = mg_url_host(url);\n    mg_random(nonce, sizeof(nonce));\n    mg_base64_encode((unsigned char *) nonce, sizeof(nonce), key, sizeof(key));\n    mg_xprintf(mg_pfn_iobuf, &c->send,\n               \"GET %s HTTP/1.1\\r\\n\"\n               \"Upgrade: websocket\\r\\n\"\n               \"Host: %.*s\\r\\n\"\n               \"Connection: Upgrade\\r\\n\"\n               \"Sec-WebSocket-Version: 13\\r\\n\"\n               \"Sec-WebSocket-Key: %s\\r\\n\",\n               mg_url_uri(url), (int) host.len, host.buf, key);\n    if (fmt != NULL) {\n      va_list ap;\n      va_start(ap, fmt);\n      mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, &ap);\n      va_end(ap);\n    }\n    mg_xprintf(mg_pfn_iobuf, &c->send, \"\\r\\n\");\n    c->pfn = mg_ws_cb;\n    c->pfn_data = NULL;\n  }\n  return c;\n}\n\nvoid mg_ws_upgrade(struct mg_connection *c, struct mg_http_message *hm,\n                   const char *fmt, ...) {\n  struct mg_str *wskey = mg_http_get_header(hm, \"Sec-WebSocket-Key\");\n  c->pfn = mg_ws_cb;\n  c->pfn_data = NULL;\n  if (wskey == NULL) {\n    mg_http_reply(c, 426, \"\", \"WS upgrade expected\\n\");\n    c->is_draining = 1;\n  } else {\n    struct mg_str *wsproto = mg_http_get_header(hm, \"Sec-WebSocket-Protocol\");\n    va_list ap;\n    va_start(ap, fmt);\n    ws_handshake(c, wskey, wsproto, fmt, &ap);\n    va_end(ap);\n    c->is_websocket = 1;\n    c->is_resp = 0;\n    mg_call(c, MG_EV_WS_OPEN, hm);\n  }\n}\n\nsize_t mg_ws_wrap(struct mg_connection *c, size_t len, int op) {\n  uint8_t header[14], *p;\n  size_t header_len = mkhdr(len, op, c->is_client, header);\n\n  // NOTE: order of operations is important!\n  if (mg_iobuf_add(&c->send, c->send.len, NULL, header_len) != 0) {\n    p = &c->send.buf[c->send.len - len];         // p points to data\n    memmove(p, p - header_len, len);             // Shift data\n    memcpy(p - header_len, header, header_len);  // Prepend header\n    mg_ws_mask(c, len);                          // Mask data\n  }  // returning 0 means an OOM condition (iobuf couldn't resize), yet this is\n  return c->send.len;  // so far recoverable, let the caller decide\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/cmsis.c\"\n#endif\n// https://arm-software.github.io/CMSIS_5/Driver/html/index.html\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_CMSIS) && MG_ENABLE_DRIVER_CMSIS\n\n\n\n\n\nextern ARM_DRIVER_ETH_MAC Driver_ETH_MAC0;\nextern ARM_DRIVER_ETH_PHY Driver_ETH_PHY0;\n\nstatic struct mg_tcpip_if *s_ifp;\n\nstatic void mac_cb(uint32_t);\nstatic bool cmsis_init(struct mg_tcpip_if *);\nstatic bool cmsis_poll(struct mg_tcpip_if *, bool);\nstatic size_t cmsis_tx(const void *, size_t, struct mg_tcpip_if *);\nstatic size_t cmsis_rx(void *, size_t, struct mg_tcpip_if *);\n\nstruct mg_tcpip_driver mg_tcpip_driver_cmsis = {cmsis_init, cmsis_tx, NULL,\n                                                cmsis_poll};\n\nstatic bool cmsis_init(struct mg_tcpip_if *ifp) {\n  ARM_ETH_MAC_ADDR addr;\n  s_ifp = ifp;\n\n  ARM_DRIVER_ETH_MAC *mac = &Driver_ETH_MAC0;\n  ARM_DRIVER_ETH_PHY *phy = &Driver_ETH_PHY0;\n  ARM_ETH_MAC_CAPABILITIES cap = mac->GetCapabilities();\n  if (mac->Initialize(mac_cb) != ARM_DRIVER_OK) return false;\n  if (phy->Initialize(mac->PHY_Read, mac->PHY_Write) != ARM_DRIVER_OK)\n    return false;\n  if (cap.event_rx_frame == 0)  // polled mode driver\n    mg_tcpip_driver_cmsis.rx = cmsis_rx;\n  mac->PowerControl(ARM_POWER_FULL);\n  if (cap.mac_address) {  // driver provides MAC address\n    mac->GetMacAddress(&addr);\n    memcpy(ifp->mac, &addr, sizeof(ifp->mac));\n  } else {  // we provide MAC address\n    memcpy(&addr, ifp->mac, sizeof(addr));\n    mac->SetMacAddress(&addr);\n  }\n  phy->PowerControl(ARM_POWER_FULL);\n  phy->SetInterface(cap.media_interface);\n  phy->SetMode(ARM_ETH_PHY_AUTO_NEGOTIATE);\n  return true;\n}\n\nstatic size_t cmsis_tx(const void *buf, size_t len, struct mg_tcpip_if *ifp) {\n  ARM_DRIVER_ETH_MAC *mac = &Driver_ETH_MAC0;\n  if (mac->SendFrame(buf, (uint32_t) len, 0) != ARM_DRIVER_OK) {\n    ifp->nerr++;\n    return 0;\n  }\n  ifp->nsent++;\n  return len;\n}\n\nstatic void cmsis_update_hash_table(struct mg_tcpip_if *ifp) {\n  // TODO(): read database, rebuild hash table\n  ARM_DRIVER_ETH_MAC *mac = &Driver_ETH_MAC0;\n  ARM_ETH_MAC_ADDR addr;\n  memcpy(&addr, mcast_addr, sizeof(addr));\n  mac->SetAddressFilter(&addr, 1);\n  (void) ifp;\n}\n\nstatic bool cmsis_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    cmsis_update_hash_table(ifp);\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  ARM_DRIVER_ETH_PHY *phy = &Driver_ETH_PHY0;\n  ARM_DRIVER_ETH_MAC *mac = &Driver_ETH_MAC0;\n  bool up = (phy->GetLinkState() == ARM_ETH_LINK_UP) ? 1 : 0;  // link state\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {             // just went up\n    ARM_ETH_LINK_INFO st = phy->GetLinkInfo();\n    mac->Control(ARM_ETH_MAC_CONFIGURE,\n                 (st.speed << ARM_ETH_MAC_SPEED_Pos) |\n                     (st.duplex << ARM_ETH_MAC_DUPLEX_Pos) |\n                     ARM_ETH_MAC_ADDRESS_BROADCAST);\n    MG_DEBUG((\"Link is %uM %s-duplex\",\n              (st.speed == 2) ? 1000\n              : st.speed      ? 100\n                              : 10,\n              st.duplex ? \"full\" : \"half\"));\n    mac->Control(ARM_ETH_MAC_CONTROL_TX, 1);\n    mac->Control(ARM_ETH_MAC_CONTROL_RX, 1);\n  } else if ((ifp->state != MG_TCPIP_STATE_DOWN) && !up) {  // just went down\n    mac->Control(ARM_ETH_MAC_FLUSH,\n                 ARM_ETH_MAC_FLUSH_TX | ARM_ETH_MAC_FLUSH_RX);\n    mac->Control(ARM_ETH_MAC_CONTROL_TX, 0);\n    mac->Control(ARM_ETH_MAC_CONTROL_RX, 0);\n  }\n  return up;\n}\n\nstatic void mac_cb(uint32_t ev) {\n  if ((ev & ARM_ETH_MAC_EVENT_RX_FRAME) == 0) return;\n  ARM_DRIVER_ETH_MAC *mac = &Driver_ETH_MAC0;\n  uint32_t len = mac->GetRxFrameSize();  // CRC already stripped\n  if (len >= 60 && len <= 1518) {        // proper frame\n    char *p;\n    if (mg_queue_book(&s_ifp->recv_queue, &p, len) >= len) {  // have room\n      if ((len = mac->ReadFrame((uint8_t *) p, len)) > 0) {   // copy succeeds\n        mg_queue_add(&s_ifp->recv_queue, len);\n        s_ifp->nrecv++;\n      }\n      return;\n    }\n    s_ifp->ndrop++;\n  }\n  mac->ReadFrame(NULL, 0);  // otherwise, discard\n}\n\nstatic size_t cmsis_rx(void *buf, size_t buflen, struct mg_tcpip_if *ifp) {\n  ARM_DRIVER_ETH_MAC *mac = &Driver_ETH_MAC0;\n  uint32_t len = mac->GetRxFrameSize();  // CRC already stripped\n  if (len >= 60 && len <= 1518 &&\n      ((len = mac->ReadFrame(buf, (uint32_t) buflen)) > 0))\n    return len;\n  if (len > 0) mac->ReadFrame(NULL, 0);  // discard bad frames\n  (void) ifp;\n  return 0;\n}\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/cyw.c\"\n#endif\n\n\n\n#if MG_ENABLE_TCPIP &&                                          \\\n    ((defined(MG_ENABLE_DRIVER_CYW) && MG_ENABLE_DRIVER_CYW) || \\\n     (defined(MG_ENABLE_DRIVER_CYW_SDIO) && MG_ENABLE_DRIVER_CYW_SDIO))\n\n#ifndef MG_ENABLE_DRIVER_CYW\n#define MG_ENABLE_DRIVER_CYW 0\n#endif\n#ifndef MG_ENABLE_DRIVER_CYW_SDIO\n#define MG_ENABLE_DRIVER_CYW_SDIO 0\n#endif\n\nstatic struct mg_tcpip_if *s_ifp;\nstatic uint32_t s_ip, s_mask;\nstatic bool s_link, s_auth, s_join;\n\nstatic void wifi_cb(struct mg_tcpip_if *ifp, int ev, void *ev_data) {\n  struct mg_wifi_data *wifi = &((struct mg_tcpip_driver_cyw_data *) ifp->driver_data)->wifi;\n  if (wifi->apmode && ev == MG_TCPIP_EV_ST_CHG && *(uint8_t *) ev_data == MG_TCPIP_STATE_UP) {\n    MG_DEBUG((\"Access Point started\"));\n    s_ip = ifp->ip, ifp->ip = wifi->apip;\n    s_mask = ifp->mask, ifp->mask = wifi->apmask;\n    ifp->enable_dhcp_client = false;\n    ifp->enable_dhcp_server = true;\n  }\n}\n\nstatic bool cyw_init(uint8_t *mac);\nstatic void cyw_poll(void);\n\nstatic bool mg_tcpip_driver_cyw_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_cyw_data *d =\n      (struct mg_tcpip_driver_cyw_data *) ifp->driver_data;\n  struct mg_wifi_data *wifi = &d->wifi;\n  if (MG_BIG_ENDIAN) {\n    MG_ERROR((\"Big-endian host\"));\n    return false;\n  }\n  s_ifp = ifp;\n  s_ip = ifp->ip;\n  s_mask = ifp->mask;\n  s_link = s_auth = s_join = false;\n  ifp->pfn = wifi_cb;\n  if (!cyw_init(ifp->mac)) return false;\n\n  if (wifi->apmode) {\n    return mg_wifi_ap_start(wifi);\n  } else if (wifi->ssid != NULL && wifi->pass != NULL) {\n    return mg_wifi_connect(wifi);\n  }\n  return true;\n}\n\nstatic size_t mg_cyw_tx(unsigned int ifc, void *data, size_t len);\nsize_t mg_tcpip_driver_cyw_output(const void *buf, size_t len,\n                                  struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_cyw_data *d =\n      (struct mg_tcpip_driver_cyw_data *) ifp->driver_data;\n  return mg_cyw_tx(d->wifi.apmode ? 1 : 0, (void *) buf, len) >= len ? len : 0;\n}\n\nstatic bool mg_tcpip_driver_cyw_poll(struct mg_tcpip_if *ifp, bool s1) {\n  cyw_poll();\n  if (!s1) return false;\n  struct mg_tcpip_driver_cyw_data *d =\n      (struct mg_tcpip_driver_cyw_data *) ifp->driver_data;\n  return d->wifi.apmode ? s_link : s_link && s_auth && s_join;\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_cyw = {mg_tcpip_driver_cyw_init,\n                                              mg_tcpip_driver_cyw_output, NULL,\n                                              mg_tcpip_driver_cyw_poll};\n\n// - DS:\n// https://www.mouser.com/datasheet/2/196/Infineon_CYW43439_DataSheet_v03_00_EN-3074791.pdf\n// - WHD: https://github.com/Infineon/wifi-host-driver\n//\n//              |  e   <-- event data\n//              |-----\n//          net | vnd   <-- network (TCP/IP) | vendor header (Broadcom (bcm))\n//         -----|-----\n//  IOCTL | ETH | ETH  <-- IOCTL/IOVAR: chip control | ETH: Ethernet header\n// -------|-----|-----\n//   CDC  | BDC | BDC\n// ------- ----- -----\n//        SDPCM        <-- includes SDIO bus arbitration, not used in SPI\n// -------------------\n//    SPI   |  SDIO    <-- padded to 32-bit | 64-bytes\n//\n// - SDPCM has 3 channels (control, data, and asynchronous data)\n// - SPI has 4 \"functions\", F0 to F3, to access different blocks in the chip,\n// like the SPI/SDIO controller, chip backplane, and 2 DMA I/Os; these are\n// usually handled by SDPCM but we need to explicitly access the I/O controller\n// and chip backplane during initialization\n// - SDIO has 3 functions (proper SDIO terminology), F0 to F2, coincident with\n// those for SPI, accessed through standard SDIO practices. There is no F3.\n\n// Processor core firmware is loaded to TCM RAM, along with module-dependent\n// (hardware design) NVRAM data, via the chip backplane access through the bus\n// Once the chip has been initialized, information regarding regulatory\n// constraints (CLM blob, “Country Locale Matrix”), is loaded as an IOVAR. This\n// is tied to the module being certified, hence it is also module-dependent.\n// - Result: chip firmware + module NVRAM data + module CLM blob\n\n#pragma pack(push, 1)\n// all little endian\n\nstruct cdc_hdr {\n  uint32_t cmd;   // ioctl command value\n  uint16_t olen;  // output buflen\n  uint16_t ilen;  // input buflen (excludes header)\n  uint32_t flags;\n  uint32_t status;\n};\n\nstruct bdc_hdr {\n  uint8_t flags;     // Flags\n  uint8_t priority;  // 802.1d Priority (low 3 bits)\n  uint8_t flags2;\n  uint8_t data_offset;  // Offset from end of BDC header to packet data, in\n                        // 4-uint8_t words. Leaves room for optional headers.\n};\n\nstruct sdpcm_sw_hdr {\n  uint8_t sequence;           // Sequence number of pkt\n  uint8_t channel_and_flags;  // IOCTL/IOVAR or User Data or Event\n  uint8_t next_length;\n  uint8_t header_length;  // Offset to BDC or CDC header\n  uint8_t wireless_flow_control;\n  uint8_t bus_data_credit;  // Credit from WLAN Chip\n  uint8_t _reserved[2];\n};\n\nstruct sdpcm_hdr {\n  uint16_t len;\n  uint16_t _len;  // ~len\n  struct sdpcm_sw_hdr sw_hdr;\n};\n\nstruct data_hdr {\n  struct sdpcm_hdr sdpcm;\n  uint8_t pad[2];\n  struct bdc_hdr bdc;\n};\n\n// gSPI, CYW43439 DS 4.2.1 Fig.12, 2-bit field\n#define CYW_SPID_FUNC_BUS 0   // F0\n#define CYW_SPID_FUNC_CHIP 1  // F1\n#define CYW_SPID_FUNC_WLAN 2  // F2\n\n// SDIO functions, 3-bit field; CYW4343W and CYW43439 DS 4.1\n#define CYW_SDIO_FUNC_BUS 0   // F0\n#define CYW_SDIO_FUNC_CHIP 1  // F1\n#define CYW_SDIO_FUNC_WLAN 2  // F2\n\n#define CYW_SDPCM_CTRL_HDR 0\n#define CYW_SDPCM_ASYNC_HDR 1\n#define CYW_SDPCM_DATA_HDR 2\n\n#pragma pack(pop)\n\nstatic uint8_t s_tx_seqno;\nstatic uint32_t txdata[2048 / 4], resp[2048 / 4];\n\nstatic void cyw_handle_cdc(struct cdc_hdr *cdc, size_t len);\nstatic void cyw_handle_bdc(struct bdc_hdr *bdc, size_t len);\nstatic void cyw_handle_bdc_evnt(struct bdc_hdr *bdc, size_t len);\n\nstatic size_t cyw_bus_specific_poll(uint32_t *dest);\nstatic void cyw_update_hash_table(void);\n\n// High-level comm stuff\n\nstatic void cyw_poll(void) {\n  struct sdpcm_hdr *sdpcm = (struct sdpcm_hdr *) resp;\n  unsigned int channel;\n  if (s_ifp->update_mac_hash_table) {\n    // first call to _poll() is after _init(), so this is safe\n    cyw_update_hash_table();\n    s_ifp->update_mac_hash_table = false;\n  }\n  if (cyw_bus_specific_poll(resp) == 0) return;\n  if ((sdpcm->len ^ sdpcm->_len) != 0xffff || sdpcm->len < sizeof(*sdpcm) ||\n      sdpcm->len > 2048 - sizeof(*sdpcm))\n    return;\n  channel = sdpcm->sw_hdr.channel_and_flags & 0x0F;\n  if (channel == CYW_SDPCM_CTRL_HDR) {\n    if (sdpcm->len >= sizeof(*sdpcm) + sizeof(struct cdc_hdr)) {\n      struct cdc_hdr *cdc =\n          (struct cdc_hdr *) ((size_t) sdpcm + sdpcm->sw_hdr.header_length);\n      size_t len = sdpcm->len - sdpcm->sw_hdr.header_length;\n      cyw_handle_cdc(cdc, len);\n    }\n  } else if (channel == CYW_SDPCM_DATA_HDR) {\n    if (sdpcm->len >= sizeof(*sdpcm) + sizeof(struct bdc_hdr)) {\n      struct bdc_hdr *bdc =\n          (struct bdc_hdr *) ((size_t) sdpcm + sdpcm->sw_hdr.header_length);\n      size_t len = sdpcm->len - sdpcm->sw_hdr.header_length;\n      cyw_handle_bdc(bdc, len);\n    }\n  } else if (channel == CYW_SDPCM_ASYNC_HDR) {\n    struct bdc_hdr *bdc =\n        (struct bdc_hdr *) ((size_t) sdpcm + sdpcm->sw_hdr.header_length);\n    size_t len_ = sdpcm->len - sdpcm->sw_hdr.header_length;\n    cyw_handle_bdc_evnt(bdc, len_);\n  }  // else silently discard\n}\n\n// WLAN frame reception\nstatic void cyw_handle_bdc(struct bdc_hdr *bdc, size_t len) {\n  uint8_t *payload = (uint8_t *) &bdc[bdc->data_offset + 1];\n  mg_tcpip_qwrite(payload, len - (payload - (uint8_t *) bdc), s_ifp);\n}\n\nstatic size_t cyw_bus_specific_tx(uint32_t *data, uint16_t len);\n\n// WLAN frame transmission\nstatic size_t mg_cyw_tx(unsigned int ifc, void *data, size_t len) {\n  struct data_hdr *hdr = (struct data_hdr *) txdata;\n  uint16_t txlen = (uint16_t) (len + sizeof(*hdr));\n  memset(txdata, 0, sizeof(*hdr));\n  memcpy((uint8_t *) txdata + sizeof(*hdr), data, len);\n  // TODO(): hdr->bdc.priority = map IP to TOS if supporting QoS/ToS\n  hdr->bdc.flags = 2 << 4;          // BDC version 2\n  hdr->bdc.flags2 = (uint8_t) ifc;  // 0 -> STA, 1 -> AP\n  // hdr->bdc.data_offset = 0; // actually zeroed above\n  hdr->sdpcm.len = txlen;\n  hdr->sdpcm._len = (uint16_t) ~txlen;\n  hdr->sdpcm.sw_hdr.sequence = ++s_tx_seqno;\n  hdr->sdpcm.sw_hdr.channel_and_flags = CYW_SDPCM_DATA_HDR,\n  hdr->sdpcm.sw_hdr.header_length = offsetof(struct data_hdr, bdc);\n  return cyw_bus_specific_tx(txdata, txlen);\n}\n\n// WLAN event handling\n#pragma pack(push, 1)\n// all in network order\n\nstruct eth_hdr {  // TODO(scaprile) reuse 'eth' in net_builtin.c\n  uint8_t dest[6];\n  uint8_t src[6];\n  uint16_t type;\n};\n\nstruct bcm_vendor_hdr {\n  uint16_t subtype;  // vendor specific: 0x8001\n  uint16_t length;   // bytes following this field\n  uint8_t version;   // 0\n  uint8_t oui[3];    // vendor specific: 0x00 0x10 0x18\n  uint16_t usr_subtype;\n};\n\nstruct bcm_evnt_hdr {\n  uint16_t version;  // 1: fields up to ifname; 2: as shown\n  uint16_t flags;\n  uint32_t event_type;\n  uint32_t status;\n  uint32_t reason;\n  uint32_t auth_type;\n  uint32_t datalen;\n  uint8_t addr[6];  // Station address (if applicable)\n  char ifname[16];\n  uint8_t ifidx;\n  uint8_t bss_cfg_idx;\n};\n\nstruct evnt_msg {\n  struct eth_hdr eth;\n  //  struct vendor_hdr; but we only handle Broadcom (Wi-Fi processor) events\n  struct bcm_vendor_hdr bcm;\n  struct bcm_evnt_hdr event;\n};\n\n#pragma pack(pop)\n\nstruct scan_result;\nstatic void cyw_handle_scan_result(uint32_t status, struct scan_result *data,\n                                   size_t len);\n\n// Do not call any IOCTL functions here, otherwise revise cyw_ioctl_wait()\nstatic void cyw_handle_bdc_evnt(struct bdc_hdr *bdc, size_t len) {\n  struct evnt_msg *msg = (struct evnt_msg *) &bdc[bdc->data_offset + 1];\n  MG_VERBOSE((\"%u bytes event\", len));\n  if (mg_log_level >= MG_LL_VERBOSE) mg_hexdump((void *) bdc, len);\n  if (mg_ntohs(msg->eth.type) != 0x886C || msg->bcm.oui[0] != 0x00 ||\n      msg->bcm.oui[1] != 0x10 || msg->bcm.oui[2] != 0x18)\n    return;  // discard if not Broadcom\n  if (mg_ntohl(msg->event.datalen) <=\n      len - ((uint8_t *) msg - (uint8_t *) bdc)) {\n    uint32_t event_type = mg_ntohl(msg->event.event_type);\n    uint32_t status = mg_ntohl(msg->event.status);\n    uint32_t reason = mg_ntohl(msg->event.reason);\n    uint16_t flags = mg_ntohs(msg->event.flags);\n    MG_VERBOSE((\"BCM evt %lu %lu %lu %p\", event_type, status, reason, flags));\n    if (event_type == 16 && status == 0) {  // Link\n      s_link = flags & 1;\n    } else if (event_type == 46 && s_link) {  // PSK sup with link up\n      if (status == 6) {                      // Keyed\n      } else if ((status == 4 || status == 8 || status == 10) &&\n                 reason == 15) {  // Wait M1/M3/G1\n        MG_ERROR((\"AUTH TIMEOUT\"));\n        s_auth = false;\n      } else {\n        MG_ERROR((\"AUTH FAILED\"));\n        s_auth = false;\n      }\n    } else if (event_type == 3 && status != 6) {  // Auth (not unsolicited)\n      if (status == 0) {                          // Success\n        s_auth = true;\n      } else {\n        MG_ERROR((\"AUTH TIMEOUT\"));\n        s_auth = false;\n      }\n    } else if (event_type == 1) {  // Join\n      if (status == 0) {           // Success\n        s_join = true;\n      } else {\n        MG_ERROR((\"%s\", status == 3 /* No networks */ ? \"SSID NOT FOUND\"\n                                                      : \"JOIN FAILED\"));\n        s_join = false;\n        mg_tcpip_call(s_ifp, MG_TCPIP_EV_WIFI_CONNECT_ERR, &status);\n      }\n    } else if (event_type == 12 || event_type == 5) {  // Disassoc, Deauth\n      s_auth = false;\n    } else if (event_type == 69) {  // Scan result\n      struct scan_result *data = (struct scan_result *) (&msg->event + 1);\n      size_t dlen = mg_ntohl(msg->event.datalen);\n      if (dlen > len - ((uint8_t *) data - (uint8_t *) bdc)) return;\n      cyw_handle_scan_result(status, data, dlen);\n    }\n  }  // else silently discard\n}\n\nstatic bool cyw_ioctl_get_(unsigned int ifc, unsigned int cmd, void *data,\n                           size_t len);\nstatic bool cyw_ioctl_set_(unsigned int ifc, unsigned int cmd, void *data,\n                           size_t len);\nstatic bool cyw_ioctl_iovar_get_(unsigned int ifc, char *var, void *data,\n                                 size_t len);\nstatic bool cyw_ioctl_iovar_set_(unsigned int ifc, char *var, void *data,\n                                 size_t len);\n// clang-format off\n// convenience: ioctl funcs on default ifc (0), as only AP needs ifc 1\n__attribute__((unused)) static bool cyw_ioctl_get(unsigned int cmd, void *data, size_t len) { return cyw_ioctl_get_(0, cmd, data, len); }\nstatic bool cyw_ioctl_set(unsigned int cmd, void *data, size_t len) { return cyw_ioctl_set_(0, cmd, data, len); }\nstatic bool cyw_ioctl_iovar_get(char *var, void *data, size_t len) { return cyw_ioctl_iovar_get_(0, var, data, len); }\nstatic bool cyw_ioctl_iovar_set(char *var, void *data, size_t len) { return cyw_ioctl_iovar_set_(0, var, data, len); }\n// clang-format on\n\n// Wi-Fi network stuff\n\n// clang-format off\nstatic bool cyw_wifi_connect(char *ssid, char *pass) {\n  uint32_t sup_wpa[2] = {0, 1}; // bss index 0 = STA, not open\n  static const uint32_t eapver[2] = {0, (uint32_t) -1}, // accept AP version\n                              tmo[2] = {0, 2500};\n  uint32_t data[64/4 + 1]; // max pass length: 64 for WPA, 128 for WPA3 SAE\n  uint16_t *da = (uint16_t *) data;\n  unsigned int len;\n  uint32_t val;\n  val = 4; // security type: 0 for none, 2 for WPA, 4 for WPA2/WPA3, 6 for mixed WPA/WPA2\n  // sup_wpa[1] = 0 if not using security\n  if (!(cyw_ioctl_set(134 /* SET_WSEC */, (uint8_t *)&val, sizeof(val))\n        && cyw_ioctl_iovar_set(\"bsscfg:sup_wpa\", (void *)sup_wpa, sizeof(sup_wpa))\n        && cyw_ioctl_iovar_set(\"bsscfg:sup_wpa2_eapver\", (void *)eapver, sizeof(eapver))\n        && cyw_ioctl_iovar_set(\"bsscfg:sup_wpa_tmo\", (void *)tmo, sizeof(tmo)))\n     ) return false;\n  mg_delayms(2); // allow radio firmware to be ready\n  // skip if not using auth\n  memset(data, 0, sizeof(data));\n  len = strlen(pass);\n  da[0] = (uint16_t) len;\n  da[1] = 1; // indicates wireless security key, skip for WPA3 SAE\n  memcpy((uint8_t *)data + 2 * sizeof(uint16_t), pass, len); // skip for WPA3 SAE\n  if (!cyw_ioctl_set(268 /* SET_WSEC_PMK */, data, sizeof(data))) return false; // skip for WPA3 SAE, sizeof/2 if supporting SAE but using WPA\n  // for WPA3 SAE: memcpy((uint8_t *)data + sizeof(uint16_t), pass, len); cyw_ioctl_iovar_set(\"sae_password\", data, sizeof(data));\n  // resume if not using auth\n  val = 1; if (!cyw_ioctl_set(20 /* SET_INFRA */, (uint8_t *)&val, sizeof(val))) return false;\n  val = 0; // auth type: 0 for open, 3 for SAE\n  if (!cyw_ioctl_set(22 /* SET_AUTH */, (uint8_t *)&val, sizeof(val))) return false;\n  val = 1; // MFP capable: 1 for yes, 0 for no; recommended to be set for WPA2+ (2 for 'required', WPA3)\n  cyw_ioctl_iovar_set(\"mfp\", (uint8_t *)&val, sizeof(val)); // Old chipsets do not support MFP\n  val = 0x80; // auth type: 0 for none, 4 for WPA PSK, 0x80 for WPA2 PSK, 0x40000 for WPA3 SAE PSK\n  if (!cyw_ioctl_set(165 /* SET_WPA_AUTH */, (uint8_t *)&val, sizeof(val))) return false;\n  len = strlen(ssid);\n  data[0] = (uint32_t) len;\n  memcpy((uint8_t *)&data[1], ssid, len);\n  if (!cyw_ioctl_set(26 /* SET_SSID */, data, len + sizeof(uint32_t))) return false;\n  return true;\n}\n\nstatic bool cyw_wifi_disconnect(void) {\n  return cyw_ioctl_set(52 /* DISASSOC */, NULL, 0);\n}\n\n// For AP functions, we use explicit ifc selection; both for clarity and maintenance, as some actions are performed on ifc 0, with or without a bss_index, and others are performed on ifc 1\n\nstatic bool cyw_wifi_ap_start(char *ssid, char *pass, unsigned int channel) {\n  uint32_t data[64/4 + 2]; // max pass length: 64 for WPA, 128 for WPA3 SAE\n  uint16_t *da = (uint16_t *) data;\n  unsigned int len;\n  uint32_t val;\n  // CHIP DEPENDENCY\n  // RPi set the AMPDU parameter for AP (window size = 2) *****************\n  // val = 2 ; cyw_ioctl_iovar_set_(0, \"ampdu_ba_wsize\", (uint8_t *)&val, sizeof(val));\n  // some chips might require to turn APSTA off and issue a SET_AP IOCTL\n  len = strlen(ssid);\n  data[0] = 1; // bss index 1 = AP\n  data[1] = (uint32_t) len;\n  memcpy((uint8_t *)&data[2], ssid, len);\n  // TODO(scaprile): this takes some time to process, or requires a delay before doing it\n  if (!cyw_ioctl_iovar_set_(0, \"bsscfg:ssid\", (uint8_t *)&data, len + 2 * sizeof(uint32_t))) return false;\n  // TODO(scaprile): but sometimes this one takes some time to process\n  val = (uint32_t) channel; if (!cyw_ioctl_set_(0, 30 /* SET_CHANNEL */, (uint8_t *)&val, sizeof(val))) return false;\n  data[0] = 1; // bss index 1 = AP\n  data[1] = 0x00400004; // security type: 0 for none, 0x00200002 for WPA, 0x00400004 for WPA2, 0x01000004 for WPA3, 0x01400004 for mixed WPA2/WPA3, 0x00400006 for mixed WPA/WPA2\n  // NOTE(): WHD writes & 0xFF if WPS is not enabled (?)\n  if (!cyw_ioctl_iovar_set_(0, \"bsscfg:wsec\", (uint8_t *)&data, 2 * sizeof(uint32_t))) return false;\n  val = 1; // MFP capable: 1 for yes, 0 for no; recommended to be set for WPA2+ (2 for 'required', WPA3)\n  cyw_ioctl_iovar_set_(1, \"mfp\", (uint8_t *)&val, sizeof(val)); // Old chipsets do not support MFP\n  mg_delayms(2); // allow radio firmware to be ready\n  // skip if not using auth\n  // WPA, WPA2, mixed WPA/WPA2, mixed WPA2/WPA3\n  // NOTE(): WHD does not set SAE password for shared WPA2/WPA3, same do we\n  memset(data, 0, sizeof(data));\n  len = strlen(pass);\n  da[0] = (uint16_t) len; // skip for WPA3 SAE (43430 does NOT support WPA3 in AP)\n  da[1] = 1; // indicates wireless security key, skip for WPA3 SAE\n  memcpy((uint8_t *)data + 2 * sizeof(uint16_t), pass, len); // skip for WPA3 SAE\n  if (!cyw_ioctl_set_(1, 268 /* SET_WSEC_PMK */, data, sizeof(data))) return false; // skip for WPA3 SAE, sizeof/2 if supporting SAE but using WPA\n  /* for WPA3 SAE:\n    memcpy((uint8_t *)data + sizeof(uint16_t), pass, len);\n    cyw_ioctl_iovar_set_(1, \"sae_password\", data, sizeof(data)); */\n  /* for WPA3 or mixed WPA2/WPA3:\n    val = 5 ; cyw_ioctl_iovar_set_(1, \"sae_max_pwe_loop\", (uint8_t *)&val, sizeof(val));  // Some chipsets do not support this */\n  // resume if not using auth\n\n  data[0] = 1; // bss index 1 = AP\n  data[1] = 0x80; // auth type: 0 for none, 4 for WPA PSK, 0x80 for WPA2 PSK, 0x40000 for WPA3 SAE PSK; ored if mixed\n  if (!cyw_ioctl_iovar_set_(0, \"bsscfg:wpa_auth\", (uint8_t *)&data, 2 * sizeof(uint32_t))) return false;\n\n  val = 1 /* auto */; if (!cyw_ioctl_set_(1, 110 /* SET_GMODE */, (uint8_t *)&val, sizeof(val))) return false;\n  // Set multicast tx rate to 11Mbps, may fail in some chipsets, we are enforcing it\n  val = 11000000 / 500000; if (!cyw_ioctl_iovar_set_(1, \"2g_mrate\", (uint8_t *)&val, sizeof(val))) return false;\n  val = 1; if (!cyw_ioctl_set_(1, 78 /* SET_DTIMPRD */, (uint8_t *)&val, sizeof(val))) return false;\n  data[0] = 1; // bss index 1 = AP\n  data[1] = 1; // UP\n  // TODO(scaprile): this takes a long time to process\n  if (!cyw_ioctl_iovar_set_(0, \"bss\", (uint8_t *)&data, 2 * sizeof(uint32_t))) return false;\n  return true;\n}\n\nstatic bool cyw_wifi_ap_stop(void) {\n  uint32_t data[2];\n  data[0] = 1; // bss index 1 = AP\n  data[1] = 0; // DOWN\n  if (!cyw_ioctl_iovar_set_(0, \"bss\", (uint8_t *)&data, 2 * sizeof(uint32_t))) return false;\n  // DO WE NEED TO CLEAR CHANNEL ???\n  // CHIP DEPENDENCY\n  //val = 8 ; cyw_ioctl_iovar_set_(0, \"ampdu_ba_wsize\", (uint8_t *)&val, sizeof(val));\n  return true;\n}\n\n// WLAN scan handling\n\n#pragma pack(push, 1)\n// in little endian\n\nstruct wifi_scan_opt {\n    uint32_t version;\n    uint16_t action;\n    uint16_t _;\n    uint32_t ssid_len;\n    uint8_t ssid[32];\n    uint8_t bssid[6];\n    int8_t bss_type;\n    int8_t scan_type;\n    int32_t nprobes;\n    int32_t active_time;\n    int32_t passive_time;\n    int32_t home_time;\n    int32_t channel_num;\n    uint16_t channel_list[1];\n};\n#pragma pack(pop)\n\nstatic bool cyw_wifi_scan(void) {\n  struct wifi_scan_opt opts;\n  memset(&opts, 0, sizeof(opts));\n  opts.version = 1;\n  opts.action = 1; // start\n  opts._ = 0;\n  memset(opts.bssid, 0xff, sizeof(opts.bssid));\n  opts.bss_type = 2; // any\n  opts.nprobes = -1;\n  opts.active_time = -1;\n  opts.passive_time = -1;\n  opts.home_time = -1;\n  opts.channel_num = 0;\n  opts.channel_list[0] = 0;\n  return cyw_ioctl_iovar_set(\"escan\", (uint8_t *)&opts, sizeof(opts));\n}\n\n\n#pragma pack(push, 1)\n// in little endian\n\nstruct scan_bss {\n    uint32_t version;              // version field\n    uint32_t length;               // byte length of data in this record, starting at version and including IEs\n    uint8_t BSSID[6];              // Unique 6-byte MAC address\n    uint16_t beacon_period;        // Interval between two consecutive beacon frames. Units are Kusec\n    uint16_t capability;           // Capability information\n    uint8_t SSID_len;              // SSID length\n    uint8_t SSID[32];              // Array to store SSID\n    uint8_t reserved1[1];          // Reserved(padding)\n    uint32_t rateset_count;        // Count of rates in this set\n    uint8_t rateset_rates[16];     // rates in 500kbps units, higher bit set if basic\n    uint16_t chanspec;             // Channel specification for basic service set\n    uint16_t atim_window;          // Announcement traffic indication message window size. Units are Kusec\n    uint8_t dtim_period;           // Delivery traffic indication message period\n    uint8_t reserved2[1];          // Reserved(padding)\n    int16_t RSSI;                  // receive signal strength (in dBm)\n    int8_t phy_noise;              // noise (in dBm)\n    uint8_t n_cap;                 // BSS is 802.11n Capable\n    uint8_t reserved3[2];          // Reserved(padding)\n    uint32_t nbss_cap;             // 802.11n BSS Capabilities (based on HT_CAP_*)\n    uint8_t ctl_ch;                // 802.11n BSS control channel number\n    uint8_t reserved4[3];          // Reserved(padding)\n    uint32_t reserved32[1];        // Reserved for expansion of BSS properties\n    uint8_t flags;                 // flags\n    uint8_t vht_cap;               // BSS is vht capable\n    uint8_t reserved5[2];          // Reserved(padding)\n    uint8_t basic_mcs[16];         // 802.11N BSS required MCS set\n    uint16_t ie_offset;            // offset at which IEs start, from beginning\n    uint16_t reserved16[1];        // Reserved(padding)\n    uint32_t ie_length;            // byte length of Information Elements\n    int16_t SNR;                   // Average SNR during frame reception\n};\n\nstruct scan_result {\n    uint32_t buflen;\n    uint32_t version;\n    uint16_t sync_id;\n    uint16_t bss_count;\n    struct scan_bss bss[1];\n};\n\n#pragma pack(pop)\n\n// CHIP DEPENDENCY\n#define CYW_BSS_BANDMASK 0xc000\n#define CYW_BSS_BAND2G 0\n//\n\nstatic void cyw_handle_scan_result(uint32_t status, struct scan_result *data, size_t len) {\n  MG_VERBOSE((\"scan event, status: %ld\", status));\n  if (status == 0) { // SUCCESS\n    MG_VERBOSE((\"scan complete\"));\n    mg_tcpip_call(s_ifp, MG_TCPIP_EV_WIFI_SCAN_END, NULL);\n  } else if (status == 8) { // PARTIAL\n    struct mg_wifi_scan_bss_data bss;\n    struct scan_bss *sbss = data->bss;\n    unsigned int band = sbss->chanspec & CYW_BSS_BANDMASK;\n    if (data->version != 109 || data->bss_count != 1) {\n      MG_ERROR((\"Unsupported: %lu %u\", data->version, data->bss_count));\n      return;\n    }\n    if (sbss->length > len - offsetof(struct scan_result, bss) || sbss->SSID_len > sizeof(sbss->SSID) || sbss->ie_offset < sizeof(*sbss) || sbss->ie_offset > (sizeof(*sbss) + sbss->ie_length) || sbss->ie_offset + sbss->ie_length > sbss->length)\n      return; // silently discard malformed data\n    if (!(sbss->flags & MG_BIT(2))) return; // RSSI_ONCHANNEL, ignore off-channel results\n    bss.SSID = mg_str_n((char *)sbss->SSID, sbss->SSID_len);\n    bss.BSSID = (char *)sbss->BSSID;\n    bss.RSSI = (int8_t)sbss->RSSI;\n    bss.has_n = sbss->n_cap != 0;\n    bss.channel = bss.has_n ? sbss->ctl_ch : (uint8_t)(sbss->chanspec & 0xff); // n 40MHz vs a/b/g and 20MHz\n    bss.band = band & CYW_BSS_BAND2G ? MG_WIFI_BAND_2G : MG_WIFI_BAND_5G;\n    bss.security = (sbss->capability & MG_BIT(4) /* CAP_PRIVACY */) ? MG_WIFI_SECURITY_WEP : MG_WIFI_SECURITY_OPEN;\n    { // travel IEs (Information Elements) in search of security definitions\n      const uint8_t wot1[4] = {0x00, 0x50, 0xf2, 0x01}; // WPA_OUI_TYPE1\n      uint8_t *ie = (uint8_t *)sbss + sbss->ie_offset;\n      int bytes = (int) sbss->ie_length;\n      while (bytes > 0 && ie[1] + 2 < bytes) { // ie[0] -> type, ie[1] -> bytes from ie[2]\n        if (ie[0] == 48 /* IE_ID_RSN */) bss.security |= MG_WIFI_SECURITY_WPA2;\n        if (ie[0] == 221 /* IE_ID_VENDOR_SPECIFIC */ && memcmp(&ie[2], wot1, 4) == 0)\n          bss.security |= MG_WIFI_SECURITY_WPA;\n        ie += ie[1] + 2;\n        bytes -= ie[1] + 2;\n      }\n    }\n    MG_VERBOSE((\"BSS: %.*s (%u) (%M) %d dBm %u\", bss.SSID.len, bss.SSID.buf, bss.channel, mg_print_mac, bss.BSSID, (int) bss.RSSI, bss.security));\n    mg_tcpip_call(s_ifp, MG_TCPIP_EV_WIFI_SCAN_RESULT, &bss);\n  } else {\n    MG_ERROR((\"scan error\"));\n  }\n}\n// clang-format on\n\n// IOCTL stuff. All values read and written are in little endian format\n\nstatic uint16_t s_ioctl_reqid;\n\n// CDC handler for waiting loop\nstatic uint8_t *s_ioctl_resp;\nstatic bool s_ioctl_err;\n\nstatic void cyw_handle_cdc(struct cdc_hdr *cdc, size_t len) {\n  uint8_t *r = (uint8_t *) cdc + sizeof(*cdc);\n  MG_VERBOSE((\"%u bytes CDC frame\", len));\n  if ((cdc->flags >> 16) != s_ioctl_reqid) return;\n  if (cdc->flags & 1) {\n    MG_ERROR((\"IOCTL error: %ld\", -cdc->status));\n    s_ioctl_err = true;\n    return;\n  }\n  if (mg_log_level >= MG_LL_VERBOSE) mg_hexdump((void *) cdc, len);\n  MG_VERBOSE((\"IOCTL result: %02x %02x %02x %02x ..\", r[0], r[1], r[2], r[3]));\n  s_ioctl_resp = r;\n}\n// NOTE(): alt no loop handler dispatching IOCTL response to current handler:\n// static void *s_ioctl_hnd; *s_ioctl_hnd(ioctl, len);\n// app is a state machine calling get/sets and advancing via these callbacks\n\n#pragma pack(push, 1)\n// all little endian\n\nstruct ctrl_hdr {\n  struct sdpcm_hdr sdpcm;\n  struct cdc_hdr cdc;\n};\n\n#pragma pack(pop)\n\n// IOCTL command send\nstatic void cyw_ioctl_send_cmd(unsigned int ifc, unsigned int cmd, bool set,\n                               size_t len) {\n  struct ctrl_hdr *hdr = (struct ctrl_hdr *) txdata;\n  uint16_t txlen = (uint16_t) (len + sizeof(*hdr));\n  memset(txdata, 0, sizeof(*hdr));\n  hdr->cdc.cmd = cmd;\n  hdr->cdc.olen = (uint16_t) len;\n  // hdr->cdc.ilen = 0; // actually zeroed above\n  hdr->cdc.flags = ((uint32_t) ++s_ioctl_reqid << 16) | ((ifc & 0xf) << 12) |\n                   (set ? MG_BIT(1) : 0);\n  hdr->sdpcm.len = txlen;\n  hdr->sdpcm._len = (uint16_t) ~txlen;\n  hdr->sdpcm.sw_hdr.sequence = ++s_tx_seqno;\n  hdr->sdpcm.sw_hdr.channel_and_flags = CYW_SDPCM_CTRL_HDR;\n  hdr->sdpcm.sw_hdr.header_length = offsetof(struct ctrl_hdr, cdc);\n  cyw_bus_specific_tx(txdata, txlen);\n}\n\n// just send respective commands, response handled via CDC handler\nstatic void cyw_ioctl_send_get(unsigned int ifc, unsigned int cmd) {\n  cyw_ioctl_send_cmd(ifc, cmd, false, 0);\n}\n\nstatic void cyw_ioctl_send_set(unsigned int ifc, unsigned int cmd, void *data,\n                               size_t len) {\n  if (data != NULL && len > 0)\n    memcpy((uint8_t *) txdata + sizeof(struct ctrl_hdr), data, len);\n  cyw_ioctl_send_cmd(ifc, cmd, true, (uint16_t) len);\n}\n\nstatic void cyw_ioctl_send_iovar_get(unsigned int ifc, char *var, size_t len) {\n  unsigned int namelen = strlen(var) + 1;  // include '\\0'\n  // cmd = GET IOVAR, \"set\" the name...\n  cyw_ioctl_send_set(ifc, 262, var, len > namelen ? len : namelen);\n}\n\nstatic void cyw_ioctl_send_iovar_set2(unsigned int ifc, char *var, void *data1,\n                                      size_t len1, void *data2, size_t len2) {\n  struct ctrl_hdr *hdr = (struct ctrl_hdr *) txdata;\n  unsigned int namelen = strlen(var) + 1;  // include '\\0'\n  uint16_t txlen, payload_len = (uint16_t) (namelen + len1 + len2);\n  memcpy((uint8_t *) txdata + sizeof(*hdr), var, namelen);\n  memcpy((uint8_t *) txdata + namelen + sizeof(*hdr), data1, len1);\n  if (data2 != NULL)\n    memcpy((uint8_t *) txdata + namelen + sizeof(*hdr) + len1, data2, len2);\n  txlen = (uint16_t) (payload_len + sizeof(*hdr));\n  cyw_ioctl_send_cmd(ifc, 263, true, txlen);  // cmd = SET IOVAR\n}\n\n__attribute__((unused)) static void cyw_ioctl_send_iovar_set(unsigned int ifc,\n                                                             char *var,\n                                                             void *data,\n                                                             size_t len) {\n  cyw_ioctl_send_iovar_set2(ifc, var, data, len, NULL, 0);\n}\n\nstatic inline bool delayms(unsigned int ms) {\n  mg_delayms(ms);\n  return true;\n}\n\n// wait for a response, meanwhile delivering received frames and events\nstatic bool cyw_ioctl_wait(void) {\n  unsigned int times = 100;\n  s_ioctl_resp = NULL;\n  s_ioctl_err = false;\n  do {  // IOCTL response processing does not call any other IOCTL function\n    cyw_poll();  // otherwise we can't allow them to pile up here\n    // network frames will be pushed to the queue so that is safe\n  } while (s_ioctl_resp == NULL && !s_ioctl_err && times-- > 0 && delayms(1));\n  MG_VERBOSE((\"resp: %lp, err: %c, times: %d\", s_ioctl_resp,\n              s_ioctl_err ? '1' : '0', (int) times));\n  return s_ioctl_resp != NULL;\n}\n\nstatic bool cyw_ioctl_waitdata(void *data, size_t len) {\n  if (!cyw_ioctl_wait()) return false;\n  memcpy(data, s_ioctl_resp, len);\n  return true;\n}\n\n// send respective commands, wait for a response or timeout\nstatic bool cyw_ioctl_get_(unsigned int ifc, unsigned int cmd, void *data,\n                           size_t len) {\n  cyw_ioctl_send_get(ifc, cmd);\n  return cyw_ioctl_waitdata(data, len);\n}\nstatic bool cyw_ioctl_set_(unsigned int ifc, unsigned int cmd, void *data,\n                           size_t len) {\n  cyw_ioctl_send_set(ifc, cmd, data, len);\n  return cyw_ioctl_wait();\n}\n\nstatic bool cyw_ioctl_iovar_get_(unsigned int ifc, char *var, void *data,\n                                 size_t len) {\n  cyw_ioctl_send_iovar_get(ifc, var, len);\n  return cyw_ioctl_waitdata(data, len);\n}\nstatic bool cyw_ioctl_iovar_set2_(unsigned int ifc, char *var, void *data1,\n                                  size_t len1, void *data2, size_t len2) {\n  cyw_ioctl_send_iovar_set2(ifc, var, data1, len1, data2, len2);\n  return cyw_ioctl_wait();\n}\nstatic bool cyw_ioctl_iovar_set_(unsigned int ifc, char *var, void *data,\n                                 size_t len) {\n  return cyw_ioctl_iovar_set2_(ifc, var, data, len, NULL, 0);\n}\n\n// CYW43 chipset specifics. All values read and written are in little endian\n// format\n\n#pragma pack(push, 1)\n// all little endian\n\nstruct cyw_country {\n  uint32_t a;\n  int32_t rev;\n  uint32_t c;\n};\n\nstruct clm_hdr {\n  uint16_t flag;\n  uint16_t type;\n  uint32_t len;\n  uint32_t crc;\n};\n\n#pragma pack(pop)\n\n// worlwide rev0, TODO(): try rev 17 for 4343W\nstatic const uint32_t country_code = 'X' + ('X' << 8) + (0 << 16);\n\nstatic bool cyw_bus_specific_init();\nstatic bool cyw_load_clmll(void *data, size_t len);\n\nstatic bool cyw_load_clm(struct mg_tcpip_driver_cyw_firmware *fw) {\n  return cyw_load_clmll((void *) fw->clm_addr, fw->clm_len);\n}\n\n// clang-format off\nstatic bool cyw_init(uint8_t *mac) {\n  struct mg_tcpip_driver_cyw_data *d = (struct mg_tcpip_driver_cyw_data *) s_ifp->driver_data;\n  uint32_t val = 0;\n  if (!cyw_bus_specific_init()) return false;\n  if (!cyw_load_clm(d->fw)) return false;  // Load CLM blob\n  // BT-ENABLED DEPENDENCY\n  // set Wi-Fi up\n  val = 0 /* disable */; cyw_ioctl_iovar_set(\"bus:txglom\", (uint8_t *)&val, sizeof(val));\n  val = 1 /* on */; cyw_ioctl_iovar_set(\"apsta\", (uint8_t *)&val, sizeof(val));\n  // CHIP DEPENDENCY\n  val = 8 ; cyw_ioctl_iovar_set(\"ampdu_ba_wsize\", (uint8_t *)&val, sizeof(val));\n  val = 4 ; cyw_ioctl_iovar_set(\"ampdu_mpdu\", (uint8_t *)&val, sizeof(val));\n  val = 0 /* 8K */; cyw_ioctl_iovar_set(\"ampdu_rx_factor\", (uint8_t *)&val, sizeof(val));\n  //\n  {\n    struct cyw_country c;\n    unsigned int rev = (unsigned int) (country_code >> 16) & 0xffff;\n    c.c = c.a = country_code & 0xffff;\n    c.rev = rev == 0 ? -1 : (int32_t) rev; // if rev is 0, set it to -1, the chip will use any NVRAM/OTP configured aggregate or default to rev 0\n    cyw_ioctl_iovar_set(\"country\", (void *)&c, sizeof(c));\n  } // this takes some time to process\n  { // so do some retries while enabling events of interest\n    // we care for SET_SSID(0), JOIN(1), AUTH(3), DEAUTH(5), DISASSOC_IND(12), LINK(16), PSK_SUP(46), SCAN_RESULT(69); all < 128\n    uint32_t data[128/8/4 + 1];\n    data[0] = 0; // bss index: 0 = STA\n    memset(&data[1], 0, 128/8); // mark all as not desired\n    data[1] = MG_BIT(0) | MG_BIT(1) | MG_BIT(3) | MG_BIT(5) | MG_BIT(12) | MG_BIT(16); // events 0 to 31\n    data[2] = MG_BIT(46 - 32); // events 32 to 63\n    data[3] = MG_BIT(69 - 64); // events 64 to 95\n    unsigned int times = 100;\n    while (times --)\n      if (cyw_ioctl_iovar_set(\"bsscfg:event_msgs\", (uint8_t *)data, sizeof(data))) break;\n    if (times == (unsigned int) ~0) return false;\n  }\n  val = 0; if (!cyw_ioctl_set(64 /* SET_ANTDIV */, (uint8_t *)&val, sizeof(val))) return false;\n  if (!cyw_ioctl_set(2 /* UP, interface up */, NULL, 0)) return false;\n  // use PM2 power saving for max throughput\n  val = 200 /* ms */; if (!cyw_ioctl_iovar_set(\"pm2_sleep_ret\", (uint8_t *)&val, sizeof(val))) return false;\n  // set beacon intervals to reduce power consumption while associated to an AP but idle\n  val = 1; if (!cyw_ioctl_iovar_set(\"bcn_li_bcn\", (uint8_t *)&val, sizeof(val))) return false;\n  val = 1; if (!cyw_ioctl_iovar_set(\"bcn_li_dtim\", (uint8_t *)&val, sizeof(val))) return false;\n  val = 10; if (!cyw_ioctl_iovar_set(\"assoc_listen\", (uint8_t *)&val, sizeof(val))) return false;\n  val = 1 /* auto */; if (!cyw_ioctl_set(110 /* SET_GMODE */, (uint8_t *)&val, sizeof(val))) return false;\n  val = 0 /* any */; if (!cyw_ioctl_set(142 /* SET_BAND */, (uint8_t *)&val, sizeof(val))) return false;\n  if (mg_log_level >= MG_LL_DEBUG) {\n    char text[256]; // this is huge, but we're just starting up\n    if (cyw_ioctl_iovar_get(\"ver\", (uint8_t *)text, sizeof(text))) {\n      unsigned int len = strnlen(text, sizeof(text));\n      MG_DEBUG((\"Firmware:\\n%.*s\", len, text));\n    }\n    text[0] = '\\0';\n    if (cyw_ioctl_iovar_get(\"clmver\", (uint8_t *)text, sizeof(text)) && text[0] != '\\0') {\n      unsigned int len = strnlen(text, sizeof(text));\n      MG_DEBUG((\"CLM:\\n%.*s\", len, text));\n    }\n  }\n  {\n    if(cyw_ioctl_iovar_get(\"cur_etheraddr\", mac, 6)) {\n      MG_DEBUG((\"MAC: %M\", mg_print_mac, mac));\n    } else {\n      MG_ERROR((\"read MAC failed\"));\n    }\n  }\n  return true;\n}\n// clang-format on\n\nstatic bool cyw_load_fwll(void *fwdata, size_t fwlen, void *nvramdata,\n                          size_t nvramlen);\n\nstatic bool cyw_load_firmware(struct mg_tcpip_driver_cyw_firmware *fw) {\n  return cyw_load_fwll((void *) fw->code_addr, fw->code_len,\n                       (void *) fw->nvram_addr, fw->nvram_len);\n}\n\n// clang-format off\nstatic bool cyw_load_clmll(void *data, size_t len) {\n  unsigned int sent = 0, offset = 0;\n  struct clm_hdr hdr = {\n      .flag = 1 << 12 /* DLOAD_HANDLER_VER */ | MG_BIT(1) /* DL_BEGIN */,\n      .type = 2,\n      .crc = 0};\n  while (sent < len) {\n    unsigned int bytes = len - sent;\n    if (bytes > 1024) bytes = 1024;\n    if (sent + bytes >= len) hdr.flag |= MG_BIT(2);  // DL_END;\n    hdr.len = bytes;\n    if (!cyw_ioctl_iovar_set2_(0, \"clmload\", (void *) &hdr, sizeof(hdr), (uint8_t *) data + offset, bytes))\n      break;\n    sent += bytes;\n    offset += bytes;\n    hdr.flag &= (uint16_t)~MG_BIT(1);  // DL_BEGIN\n  }\n  return sent >= len;\n}\n// clang-format on\n\nstatic void cyw_update_hash_table(void) {\n  // TODO(): read database, rebuild hash table\n  uint32_t val = 0;\n  val = 1;\n  cyw_ioctl_iovar_set2_(0, \"mcast_list\", (uint8_t *) &val, sizeof(val),\n                        (uint8_t *) mcast_addr, sizeof(mcast_addr));\n  mg_delayms(50);\n}\n\n// CYW43 chip backplane specifics. All values read and written are in little\n// endian format\n\n// Access to chip backplane is done windowed in 32KB banks\n// - addr = area base address + register offset\n// - set the window address to addr & ~ADDRMSK\n// - access addr & ADDRMSK for non-32-bit quantities\n// - if accesing 32-bit quantities, do it on (addr & ADDRMSK) | ACCSS4B\n#define CYW_CHIP_CHIPCOMMON 0x18000000\n#define CYW_CHIP_BCKPLN_WINSZ 0x8000\n#define CYW_CHIP_BCKPLN_ADDRMSK 0x7fff\n#define CYW_CHIP_BCKPLN_ACCSS4B MG_BIT(15)\n#define CYW_CHIP_BCKPLN_WRAPPOFF 0x100000\n// BUS DEPENDENCY: max bus to backplane transfer size, bus function id\n#define CYW_CHIP_BCKPLN_SPIMAX 64\n#define CYW_CHIP_BCKPLN_SDIOMAX 1536\n#if MG_ENABLE_DRIVER_CYW_SDIO\n#define CYW_CHIP_BCKPLN_BUSMAX CYW_CHIP_BCKPLN_SDIOMAX\n#define CYW_BUS_FUNC_CHIP CYW_SDIO_FUNC_CHIP\n#else\n#define CYW_CHIP_BCKPLN_BUSMAX CYW_CHIP_BCKPLN_SPIMAX\n#define CYW_BUS_FUNC_CHIP CYW_SPID_FUNC_CHIP\n#endif\n\n// CHIP DEPENDENCY\n#define CYW_CHIP_ARMCORE_BASE (CYW_CHIP_CHIPCOMMON + 0x3000)\n#define CYW_CHIP_SOCSRAM_BASE (CYW_CHIP_CHIPCOMMON + 0x4000)\n#define CYW_CHIP_ARMCORE (CYW_CHIP_ARMCORE_BASE + CYW_CHIP_BCKPLN_WRAPPOFF)\n#define CYW_CHIP_SOCSRAM (CYW_CHIP_SOCSRAM_BASE + CYW_CHIP_BCKPLN_WRAPPOFF)\n#define CYW_CHIP_ATCMRAM_BASE 0\n#define CYW_CHIP_RAM_SIZE 0x80000\n//\n\n#define CYW_CHIP_ADDRLOW 0x1000a\n#define CYW_CHIP_ADDRMID 0x1000b\n#define CYW_CHIP_ADDRHIGH 0x1000c\n#define CYW_CHIP_SPIFRCTRL 0x1000d\n#define CYW_CHIP_CLOCKCSR 0x1000e\n#define CYW_CHIP_PULLUP 0x1000f\n#define CYW_CHIP_WAKEUPCTL 0x1001e\n#define CYW_CHIP_SLEEPCSR 0x1001f\n\n#define CYW_CHIP_SOCSRAM_BANKXIDX 0x010\n#define CYW_CHIP_SOCSRAM_BANKXPDA 0x044\n#define CYW_CHIP_AI_IOCTRL 0x408\n#define CYW_CHIP_AI_RESETCTRL 0x800\n\nstatic bool cyw_bus_write(unsigned int f, uint32_t addr, void *data,\n                          uint16_t len);\nstatic bool cyw_bus_read(unsigned int f, uint32_t addr, void *data,\n                         uint16_t len);\n\n// clang-format off\n// set backplane window to requested area.\nstatic void cyw_set_backplane_window(uint32_t addr) {\n  uint32_t val;\n  addr &= ~CYW_CHIP_BCKPLN_ADDRMSK;\n  val = (addr >> 24) & 0xff; cyw_bus_write(CYW_BUS_FUNC_CHIP, CYW_CHIP_ADDRHIGH, &val, 1);\n  val = (addr >> 16) & 0xff; cyw_bus_write(CYW_BUS_FUNC_CHIP, CYW_CHIP_ADDRMID, &val, 1);\n  val = (addr >> 8) & 0xff; cyw_bus_write(CYW_BUS_FUNC_CHIP, CYW_CHIP_ADDRLOW, &val, 1);\n}\n\nstatic bool cyw_core_reset(uint32_t core_base, bool check) {\n  uint32_t val = 0;\n  // core disabled after chip reset\n  cyw_set_backplane_window(core_base); // set backplane window for requested area; we do know offsets fall within that window\n  // possible CHIP DEPENDENCY: AI_RESETSTATUS check and wait (instead of these cool reads) to ensure backplane operations end\n  cyw_bus_read(CYW_BUS_FUNC_CHIP, (core_base + CYW_CHIP_AI_IOCTRL) & CYW_CHIP_BCKPLN_ADDRMSK, &val, 1); // ensure backplane operations end\n  val = MG_BIT(1) | MG_BIT(0) /* SICF_FGC | SICF_CLOCK_EN */; cyw_bus_write(CYW_BUS_FUNC_CHIP, (core_base + CYW_CHIP_AI_IOCTRL) & CYW_CHIP_BCKPLN_ADDRMSK, &val, 1); // reset\n  cyw_bus_read(CYW_BUS_FUNC_CHIP, (core_base + CYW_CHIP_AI_IOCTRL) & CYW_CHIP_BCKPLN_ADDRMSK, &val, 1); // ensure backplane operations end\n  val = 0x00; cyw_bus_write(CYW_BUS_FUNC_CHIP, (core_base + CYW_CHIP_AI_RESETCTRL) & CYW_CHIP_BCKPLN_ADDRMSK, &val, 1); // release reset\n  mg_delayms(1);\n  val = MG_BIT(0) /* SICF_CLOCK_EN */; cyw_bus_write(CYW_BUS_FUNC_CHIP, (core_base + CYW_CHIP_AI_IOCTRL) & CYW_CHIP_BCKPLN_ADDRMSK, &val, 1);\n  cyw_bus_read(CYW_BUS_FUNC_CHIP, (core_base + CYW_CHIP_AI_IOCTRL) & CYW_CHIP_BCKPLN_ADDRMSK, &val, 1); // ensure backplane operations end\n  mg_delayms(1);\n\n  if (check) {\n    // Verify only clock is enabled\n    cyw_bus_read(CYW_BUS_FUNC_CHIP, (core_base + CYW_CHIP_AI_IOCTRL) & CYW_CHIP_BCKPLN_ADDRMSK, &val, 1);\n    if ((val & (MG_BIT(1) | MG_BIT(0)) /* SICF_FGC | SICF_CLOCK_EN) */) != MG_BIT(0)) return false;\n    // Verify it is not in reset state\n    cyw_bus_read(CYW_BUS_FUNC_CHIP, (core_base + CYW_CHIP_AI_RESETCTRL) & CYW_CHIP_BCKPLN_ADDRMSK, &val, 1);\n    if (val & MG_BIT(0)) return false; // AIRC_RESET\n  }\n  return true;\n}\n\nstatic void cyw_socram_init(void) {\n  uint32_t val;\n  // CHIP DEPENDENCY: disable remap for SRAM_3: 43430 and 43439 only\n  cyw_set_backplane_window(CYW_CHIP_SOCSRAM_BASE); // set backplane window for requested area; we do know offsets fall within that window\n  val = 0x03; cyw_bus_write(CYW_BUS_FUNC_CHIP, ((CYW_CHIP_SOCSRAM_BASE + CYW_CHIP_SOCSRAM_BANKXIDX) & CYW_CHIP_BCKPLN_ADDRMSK), &val, sizeof(val));\n  val = 0x00; cyw_bus_write(CYW_BUS_FUNC_CHIP, ((CYW_CHIP_SOCSRAM_BASE + CYW_CHIP_SOCSRAM_BANKXPDA) & CYW_CHIP_BCKPLN_ADDRMSK), &val, sizeof(val));\n}\n\n// transfer is fractioned in bus-to-backplane-size units within backplane windows\nstatic void cyw_load_data(uint32_t dest, void *data, size_t len) {\n  size_t sent = 0, offset = 0;\n  uint32_t last_addr = (uint32_t) ~0;\n  while (sent < len)  {\n    size_t bytes = len - sent, avail;\n    uint32_t addr = dest + offset;\n    if (addr - last_addr >= CYW_CHIP_BCKPLN_WINSZ || last_addr == (uint32_t) ~0) {\n      cyw_set_backplane_window(addr); // set backplane window for requested area\n      last_addr = addr & ~CYW_CHIP_BCKPLN_ADDRMSK;\n    }\n    addr &= CYW_CHIP_BCKPLN_ADDRMSK;\n    avail = CYW_CHIP_BCKPLN_WINSZ - (unsigned int) addr; // internal backplane limit\n    if (bytes > avail) bytes = avail;\n    if (bytes > CYW_CHIP_BCKPLN_BUSMAX) bytes = CYW_CHIP_BCKPLN_BUSMAX; // bus to backplane transfer limit\n    cyw_bus_write(CYW_BUS_FUNC_CHIP, addr, (uint8_t *)data + offset, (uint16_t) bytes);\n    sent += bytes;\n    offset += bytes;\n  }\n}\n\n// CHIP DEPENDENCY: no SOCSRAM base address; start address in fwdata image (Cortex-R4 chips)\nstatic bool cyw_load_fwll(void *fwdata, size_t fwlen, void *nvramdata, size_t nvramlen) {\n  uint32_t val = ((~(nvramlen / 4) & 0xffff) << 16) | (nvramlen / 4); // ~len len in 32-bit words\n  cyw_core_reset(CYW_CHIP_SOCSRAM, false);  // cores were disabled at chip reset\n  cyw_socram_init();\n  cyw_load_data(CYW_CHIP_ATCMRAM_BASE, fwdata, fwlen);\n  mg_delayms(5); // TODO(scaprile): CHECK IF THIS IS ACTUALLY NEEDED\n  // Load NVRAM and place 'length ~length' at the end; end of chip RAM\n  {\n    const uint32_t start = CYW_CHIP_RAM_SIZE - 4 - nvramlen;\n    cyw_load_data(start, nvramdata, nvramlen); // nvramlen must be a multiple of 4\n    // RAM_SIZE is a multiple of WINSZ, so the place for len ~len will be at the end of the window\n    cyw_bus_write(CYW_BUS_FUNC_CHIP, (CYW_CHIP_BCKPLN_WINSZ - 4), &val, sizeof(val));\n  }\n  // Reset ARM core and check it starts\n  if (!cyw_core_reset(CYW_CHIP_ARMCORE, true)) return false;\n  return true;\n}\n// clang-format on\n\n#if !MG_ENABLE_DRIVER_CYW_SDIO\n\n// CYW43 SPI bus specifics\n\n#define CYW_BUS_SPI_BUSCTRL 0x00     // 4 regs, 0 to 3\n#define CYW_BUS_SPI_INT 0x04         // 2 regs, 4 to 5\n#define CYW_BUS_SPI_INTEN 0x06       // 16-bit register\n#define CYW_BUS_SPI_STATUS 0x08      // 32-bit register\n#define CYW_BUS_SPI_TEST 0x14        // 32-bit register\n#define CYW_BUS_SPI_RESPDLY_F1 0x1d  // 8-bit register, F1: chip\n\n#define CYW_BUS_STS_LEN(x) ((x >> 9) & 0x7ff)\n\nstatic bool cyw_spi_write(unsigned int f, uint32_t addr, void *data,\n                          uint16_t len);\nstatic void cyw_spi_read(unsigned int f, uint32_t addr, void *data,\n                         uint16_t len);\n\n// clang-format off\nstatic size_t cyw_spi_poll(uint8_t *response) {\n  size_t len;\n  uint32_t res;\n  // SPI poll\n  cyw_spi_read(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_STATUS, &res, sizeof(res));\n  if (res == (uint32_t) ~0 || !(res & MG_BIT(8) /* packet available */ )) return 0;\n  len = CYW_BUS_STS_LEN(res);\n  if (len == 0) { // just ack IRQ\n    uint16_t val = 1;\n    cyw_spi_write(CYW_SPID_FUNC_CHIP, CYW_CHIP_SPIFRCTRL, &val, 1);\n    cyw_spi_read(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_INT, &val, sizeof(val));\n    cyw_spi_write(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_INT, &val, sizeof(val));\n    return 0;\n  }\n  cyw_spi_read(CYW_SPID_FUNC_WLAN, 0,  response, (uint16_t)len);\n  return len;\n}\n\nstatic size_t cyw_spi_tx(uint32_t *data, uint16_t len) {\n  while (len & 3) data[len++] = 0; // SPI 32-bit padding\n  return cyw_spi_write(CYW_SPID_FUNC_WLAN, 0, data, len) ? len: 0;\n}\n\n// this can be integrated in lowest level SPI read/write _driver_ functions\n// (those calling hal SPI transaction functions), though is only used at start\nuint32_t sw16_2(uint32_t data) {\n  return ((uint32_t)mg_htons((uint16_t)(data >> 16)) << 16) + mg_htons((uint16_t)data);\n}\n\n// DS 4.2.2 Table 6: signal we're working in 16-bit mode\n#define CYW_SPI_16bMODE MG_BIT(2) // arbitrary bit out of the FUNC space\n\nstatic bool cyw_spi_init() {\n  struct mg_tcpip_driver_cyw_data *d = (struct mg_tcpip_driver_cyw_data *) s_ifp->driver_data;\n  uint32_t val = 0;\n  // DS 4.2.3 Boot-Up Sequence; WHD: other chips might require more effort\n  unsigned int times = 51;\n  while (times--) {\n    cyw_spi_read(CYW_SPID_FUNC_BUS | CYW_SPI_16bMODE, CYW_BUS_SPI_TEST, &val, sizeof(val));\n    if (sw16_2(val) == 0xFEEDBEAD) break;\n    mg_delayms(1);\n  }\n  if (times == (unsigned int) ~0) return false;\n  // DS 4.2.3 Table 6. Chip starts in 16-bit little-endian mode.\n  // Configure SPI and switch to 32-bit big-endian mode:\n  // - High-speed mode: d->hs true\n  // - IRQ POLARITY high\n  // - SPI RESPONSE DELAY 4 bytes time [not in DS] TODO(scaprile): logic ana\n  // - Status not sent after command, IRQ with status\n  val = sw16_2(0x000204a3 | (d->hs ? MG_BIT(4) : 0)); // 4 reg content\n  cyw_spi_write(CYW_SPID_FUNC_BUS | CYW_SPI_16bMODE, CYW_BUS_SPI_BUSCTRL, &val, sizeof(val));\n  mg_tcpip_call(s_ifp, MG_TCPIP_EV_DRIVER, NULL);\n  cyw_spi_read(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_TEST, &val, sizeof(val));\n  if (val != 0xFEEDBEAD) return false;\n  val = 4; cyw_spi_write(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_RESPDLY_F1, &val, 1);\n  val = 0x99; // clear error bits DATA_UNAVAILABLE, COMMAND_ERROR, DATA_ERROR, F1_OVERFLOW\n  cyw_spi_write(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_INT, &val, 1);\n  val = 0x00be; // Enable IRQs F2_F3_FIFO_RD_UNDERFLOW, F2_F3_FIFO_WR_OVERFLOW, COMMAND_ERROR, DATA_ERROR, F2_PACKET_AVAILABLE, F1_OVERFLOW\n  // BT-ENABLED DEPENDENCY: add F1_INTR (bit 13)\n  cyw_spi_write(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_INTEN, &val, sizeof(uint16_t));\n\n  // chip backplane is ready, initialize it\n  // request ALP (Active Low Power) clock\n  val = MG_BIT(3) /* ALP_REQ */; cyw_spi_write(CYW_SPID_FUNC_CHIP, CYW_CHIP_CLOCKCSR, &val, 1);\n  // BT-ENABLED DEPENDENCY\n  times = 10;\n  while (times--) {\n    cyw_spi_read(CYW_SPID_FUNC_CHIP, CYW_CHIP_CLOCKCSR, &val, 1);\n    if (val & MG_BIT(6)) break; // ALP_AVAIL\n    mg_delayms(1);\n  }\n  if (times == (unsigned int) ~0) return false;\n  // clear request\n  val = 0; cyw_spi_write(CYW_SPID_FUNC_CHIP, CYW_CHIP_CLOCKCSR, &val, 1);\n  cyw_set_backplane_window(CYW_CHIP_CHIPCOMMON); // set backplane window to start of CHIPCOMMON area\n  cyw_spi_read(CYW_SPID_FUNC_CHIP, (CYW_CHIP_CHIPCOMMON + 0x00) & CYW_CHIP_BCKPLN_ADDRMSK, &val, 2);\n  if (val == 43430) val = 4343;\n  MG_INFO((\"WLAN chip is CYW%u%c\", val, val == 4343 ? 'W' : ' '));\n\n  // Load firmware (code and NVRAM)\n  if (!cyw_load_firmware(d->fw)) return false;\n\n  // Wait for High Throughput (HT) clock ready\n  times = 50;\n  while (times--) {\n    cyw_spi_read(CYW_SPID_FUNC_CHIP, CYW_CHIP_CLOCKCSR, &val, 1);\n    if (val & MG_BIT(7)) break; // HT_AVAIL\n    mg_delayms(1);\n  }\n  if (times == (unsigned int) ~0) return false;\n  // Wait for backplane ready\n  times = 1000;\n  while (times--) {\n    cyw_spi_read(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_STATUS, &val, sizeof(val));\n    if (val & MG_BIT(5)) break; // F2_RX_READY\n    mg_delayms(1);\n  }\n  if (times == (unsigned int) ~0) return false;\n\n  // CHIP DEPENDENCY\n  // Enable save / restore\n  // Configure WakeupCtrl, set HT_AVAIL in CLOCK_CSR\n  cyw_spi_read(CYW_SPID_FUNC_CHIP, CYW_CHIP_WAKEUPCTL, &val, 1);\n  val |= MG_BIT(1) /* WAKE_TILL_HT_AVAIL */; cyw_spi_write(CYW_SPID_FUNC_CHIP, CYW_CHIP_WAKEUPCTL, &val, 1);\n#if 0\n  // Set BRCM_CARDCAP to CMD_NODEC. NOTE(): This is probably only necessary for SDIO, not SPI\n  val = MG_BIT(3); cyw_spi_write(CYW_SPID_FUNC_BUS, 0xf0 /* SDIOD_CCCR_BRCM_CARDCAP */, &val, 1);\n#endif\n  // Force HT request to chip backplane\n  val = MG_BIT(1) /* FORCE_HT */; cyw_spi_write(CYW_SPID_FUNC_CHIP, CYW_CHIP_CLOCKCSR, &val, 1);\n  // Enable Keep SDIO On (KSO)\n  cyw_spi_read(CYW_SPID_FUNC_CHIP, CYW_CHIP_SLEEPCSR, &val, 1);\n  if (!(val & MG_BIT(0))) {\n      val |= MG_BIT(0); cyw_spi_write(CYW_SPID_FUNC_CHIP, CYW_CHIP_SLEEPCSR, &val, 1);\n  }\n  // The SPI bus can be configured for sleep (KSO controls wlan block sleep)\n  cyw_spi_read(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_BUSCTRL, &val, sizeof(val));\n  val &= ~MG_BIT(7) /* WAKE_UP */; cyw_spi_write(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_BUSCTRL, &val, sizeof(val));\n  // Set SPI bus sleep\n  val = 0x0f; cyw_spi_write(CYW_SPID_FUNC_CHIP, CYW_CHIP_PULLUP, &val, 1);\n\n  // Clear pullups. NOTE(): ?\n  val = 0x00; cyw_spi_write(CYW_SPID_FUNC_CHIP, CYW_CHIP_PULLUP, &val, 1);\n  cyw_spi_read(CYW_SPID_FUNC_CHIP, CYW_CHIP_PULLUP, &val, 1);\n  // Clear possible data unavailable error\n  cyw_spi_read(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_INTEN, &val, sizeof(uint16_t));\n  if (val & MG_BIT(0)) cyw_spi_write(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_INTEN, &val, sizeof(uint16_t));\n\n  return true;\n}\n// clang-format on\n\n// gSPI, CYW43439 DS 4.2.1 Fig.12\n#define CYW_SPID_LEN(x) ((x) &0x7FF)             // bits 0-10\n#define CYW_SPID_ADDR(x) (((x) &0x1FFFF) << 11)  // bits 11-27,\n#define CYW_SPID_FUNC(x) (((x) &3) << 28)        // bits 28-29\n#define CYW_SPID_INC MG_BIT(30)\n#define CYW_SPID_WR MG_BIT(31)\n\nstatic bool cyw_spi_write(unsigned int f, uint32_t addr, void *data,\n                          uint16_t len) {\n  struct mg_tcpip_driver_cyw_data *d =\n      (struct mg_tcpip_driver_cyw_data *) s_ifp->driver_data;\n  struct mg_tcpip_spi_ *s = (struct mg_tcpip_spi_ *) d->bus;\n  uint32_t hdr = CYW_SPID_WR | CYW_SPID_INC | CYW_SPID_FUNC(f) |\n                 CYW_SPID_ADDR(addr) | CYW_SPID_LEN(len);  // gSPI header\n  // TODO(scaprile): check spin in between and timeout values, return false\n  if (f == CYW_SPID_FUNC_WLAN) {\n    uint32_t val = 0;\n    while ((val & MG_BIT(5)) != MG_BIT(5))  // F2 rx ready (FIFO ready)\n      cyw_spi_read(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_STATUS, &val, sizeof(val));\n  }\n  if (f & CYW_SPI_16bMODE)\n    hdr = sw16_2(hdr);  // swap half-words in 16-bit little-endian mode\n\n  s->begin(NULL);\n  s->txn(NULL, (uint8_t *) &hdr, NULL, sizeof(hdr));\n  if (len <= 4) {\n    uint32_t pad = 0;\n    memcpy(&pad, data, len);\n    s->txn(NULL, (uint8_t *) &pad, NULL, sizeof(pad));\n  } else {\n    s->txn(NULL, (uint8_t *) data, NULL, len);\n  }\n  s->end(NULL);\n  return true;\n}\n\n// will write 32-bit aligned quantities to data if f == CYW_SPID_FUNC_WLAN\nstatic void cyw_spi_read(unsigned int f, uint32_t addr, void *data,\n                         uint16_t len) {\n  struct mg_tcpip_driver_cyw_data *d =\n      (struct mg_tcpip_driver_cyw_data *) s_ifp->driver_data;\n  struct mg_tcpip_spi_ *s = (struct mg_tcpip_spi_ *) d->bus;\n  uint32_t padding =\n      f == CYW_SPID_FUNC_CHIP\n          ? 4\n          : 0;  // add padding to chip backplane reads as a response delay\n  uint32_t hdr = CYW_SPID_INC | CYW_SPID_FUNC(f) | CYW_SPID_ADDR(addr) |\n                 CYW_SPID_LEN(len + padding);  // gSPI header\n  if (f == CYW_SPID_FUNC_WLAN && (len & 3))\n    len = (len + 4) & ~3;  // align WLAN transfers to 32-bit\n  if (f & CYW_SPI_16bMODE)\n    hdr = sw16_2(hdr);  // swap half-words in 16-bit little-endian mode\n\n  s->begin(NULL);\n  s->txn(NULL, (uint8_t *) &hdr, NULL, sizeof(hdr));\n  if (f == CYW_SPID_FUNC_CHIP) {\n    uint32_t pad;\n    s->txn(NULL, NULL, (uint8_t *) &pad, 4);  // read padding back and discard\n  }\n  s->txn(NULL, NULL, (uint8_t *) data, len);\n  s->end(NULL);\n}\n\nstatic bool cyw_bus_specific_init(void) {\n  return cyw_spi_init();\n}\nstatic size_t cyw_bus_specific_poll(uint32_t *response) {\n  return cyw_spi_poll((uint8_t *) response);\n}\nstatic size_t cyw_bus_specific_tx(uint32_t *data, uint16_t len) {\n  return cyw_spi_tx(data, len);\n}\nstatic bool cyw_bus_write(unsigned int f, uint32_t addr, void *data,\n                          uint16_t len) {\n  if (f == CYW_SPID_FUNC_CHIP && len >= 4) addr |= CYW_CHIP_BCKPLN_ACCSS4B;\n  return cyw_spi_write(f, addr, data, len);\n}\nstatic bool cyw_bus_read(unsigned int f, uint32_t addr, void *data,\n                         uint16_t len) {\n  cyw_spi_read(f, addr, data, len);\n  return true;\n}\n\n#else  // MG_ENABLE_DRIVER_CYW_SDIO\n\n\n\n// CYW43 SDIO bus specifics\n\n// CYW4343W and CYW43439 DS 4.1 SDIO v2.0:\n//- F0: max block size is  32 bytes\n//- F1: max block size is  64 bytes\n//- F2: max block size is 512 bytes\n\n// clang-format off\nstatic bool cyw_sdio_transfer(bool write, unsigned int f, uint32_t addr, void *data, uint32_t len) {\n  struct mg_tcpip_driver_cyw_data *d = (struct mg_tcpip_driver_cyw_data *) s_ifp->driver_data;\n  struct mg_tcpip_sdio *s = (struct mg_tcpip_sdio *) d->bus;\n  uint32_t *ptr = (uint32_t *) data; // assume 32-bit aligned data (all except firmware)\n  if (write && (size_t) data & 3) {  // missed, source data is not 32-bit aligned\n    memcpy(txdata, data, len);       // copy to an aligned buffer, we know it fits\n    ptr = txdata;\n  } // all possible read destinations are 32-bit aligned\n  // mg_sdio_transfer requires 32-bit alignment for > 1 byte transfers\n  return mg_sdio_transfer(s, write, f, addr, ptr, len);\n}\n\nstatic size_t cyw_sdio_poll(uint32_t *response) {\n  uint32_t res;\n  uint16_t *len = (uint16_t *)&res;\n  // WHD: internal docs, \"tag\" hinting a possible packet.\n  // This is actually the len / ~len field of a possible struct sdpcm_hdr, if there is a packet available, or 0 if there is none.\n  cyw_sdio_transfer(false, CYW_SDIO_FUNC_WLAN, 0, &res, sizeof(res)); // read \"the tag\"\n  if ((len[0] | len[1]) == 0 || (len[0] ^ len[1]) != 0xffff || *len <= 4) return 0;\n  response[0] = res; // copy what we already read, then read the rest\n  cyw_sdio_transfer(false, CYW_SDIO_FUNC_WLAN, 0, response + 1, *len - sizeof(res));\n  return (size_t)*len;\n}\n\nstatic size_t cyw_sdio_tx(uint32_t *data, uint16_t len) {\n  return cyw_sdio_transfer(true, CYW_SDIO_FUNC_WLAN, 0, data, len) ? len: 0;\n}\n\nstatic bool cyw_sdio_init() {\n  struct mg_tcpip_driver_cyw_data *d = (struct mg_tcpip_driver_cyw_data *) s_ifp->driver_data;\n  struct mg_tcpip_sdio *s = (struct mg_tcpip_sdio *) d->bus;\n  uint32_t val = 0;\n  if (!mg_sdio_init(s)) return false;\n  // no block transfers on F0. if (!mg_sdio_set_blksz(s, CYW_SDIO_FUNC_BUS, 32)) return false;\n  if (!mg_sdio_set_blksz(s, CYW_SDIO_FUNC_CHIP, 64)) return false;\n  if (!mg_sdio_set_blksz(s, CYW_SDIO_FUNC_WLAN, 64)) return false;\n  // TODO(scaprile): we don't handle SDIO interrupts, study CCCR INTEN and SDIO support (SDIO 6.3, 8)\n  // Enable chip backplane (F1)\n  if (!mg_sdio_enable_f(s, CYW_SDIO_FUNC_CHIP)) return false;\n  // Wait for F1 to be ready\n  if (!mg_sdio_waitready_f(s, CYW_SDIO_FUNC_CHIP)) return false;\n  // chip backplane is ready, initialize it\n  // request ALP (Active Low Power) clock\n  val = MG_BIT(5) | MG_BIT(3) | MG_BIT(0); // HW_CLKREQ_OFF ALP_REQ FORCE_ALP\n  cyw_sdio_transfer(true, CYW_SDIO_FUNC_CHIP, CYW_CHIP_CLOCKCSR, &val, 1);\n  // BT-ENABLED DEPENDENCY\n  unsigned int times = 10;\n  while (times--) {\n    if(!cyw_sdio_transfer(false, CYW_SDIO_FUNC_CHIP, CYW_CHIP_CLOCKCSR, &val, 1)) return false;\n    if (val & MG_BIT(6)) break; // ALP_AVAIL\n    mg_delayms(1);\n  }\n  if (times == (unsigned int) ~0) return false;\n  // clear request\n  val = 0; cyw_sdio_transfer(true, CYW_SDIO_FUNC_CHIP, CYW_CHIP_CLOCKCSR, &val, 1);\n  // Enable WLAN (F2)\n  if (!mg_sdio_enable_f(s, CYW_SDIO_FUNC_WLAN)) return false;\n  // Clear pullups. NOTE(): ?\n  val = 0x00; cyw_sdio_transfer(true, CYW_SDIO_FUNC_CHIP, CYW_CHIP_PULLUP, &val, 1);\n  // we don't handle wake nor OOB interrupts; SEP_INT_CTL is a vendor specific SDIO register\n  // SDIO interrupts: enable F2 interrupt only\n\n  cyw_set_backplane_window(CYW_CHIP_CHIPCOMMON); // set backplane window to start of CHIPCOMMON area\n  cyw_sdio_transfer(false, CYW_SDIO_FUNC_CHIP, (CYW_CHIP_CHIPCOMMON + 0x00) & CYW_CHIP_BCKPLN_ADDRMSK, &val, 2);\n  if (val == 43430) val = 4343;\n  MG_INFO((\"WLAN chip is CYW%u%c\", val, val == 4343 ? 'W' : ' '));\n  // Load firmware (code and NVRAM)\n  if (!cyw_load_firmware(d->fw)) return false;\n\n  // Wait for High Throughput (HT) clock ready\n  times = 50;\n  while (times--) {\n    if(!cyw_sdio_transfer(false, CYW_SDIO_FUNC_CHIP, CYW_CHIP_CLOCKCSR, &val, 1)) return false;\n    if (val & MG_BIT(7)) break; // HT_AVAIL\n    mg_delayms(1);\n  }\n  if (times == (unsigned int) ~0) return false;\n  // Wait for WLAN ready\n  if (!mg_sdio_waitready_f(s, CYW_SDIO_FUNC_WLAN)) return false;\n\n  // CHIP DEPENDENCY\n  // Enable save / restore\n  // Configure WakeupCtrl, set HT_AVAIL in CLOCK_CSR\n  if(!cyw_sdio_transfer(false, CYW_SDIO_FUNC_CHIP, CYW_CHIP_WAKEUPCTL, &val, 1)) return false;\n  val |= MG_BIT(1) /* WAKE_TILL_HT_AVAIL */; cyw_sdio_transfer(true, CYW_SDIO_FUNC_CHIP, CYW_CHIP_WAKEUPCTL, &val, 1);\n#if 0 // TODO(scaprile): Check if this is actually necessary\n  // Set BRCM_CARDCAP to CMD_NODEC. This is a vendor specific SDIO register\n  val = MG_BIT(3); cyw_sdio_transfer(true, CYW_SDIO_FUNC_BUS, 0xf0 /* SDIOD_CCCR_BRCM_CARDCAP */, &val, 1);\n#endif\n  // Force HT request to chip backplane\n  val = MG_BIT(1) /* FORCE_HT */; if(!cyw_sdio_transfer(true, CYW_SDIO_FUNC_CHIP, CYW_CHIP_CLOCKCSR, &val, 1)) return false;\n  // Enable Keep SDIO On (KSO)\n  cyw_sdio_transfer(false, CYW_SDIO_FUNC_CHIP, CYW_CHIP_SLEEPCSR, &val, 1);\n  if (!(val & MG_BIT(0))) {\n      val |= MG_BIT(0); cyw_sdio_transfer(true, CYW_SDIO_FUNC_CHIP, CYW_CHIP_SLEEPCSR, &val, 1);\n  }\n  return true;\n}\n\n// clang-format on\n\nstatic bool cyw_bus_specific_init(void) {\n  return cyw_sdio_init();\n}\nstatic size_t cyw_bus_specific_poll(uint32_t *response) {\n  return cyw_sdio_poll(response);\n}\nstatic size_t cyw_bus_specific_tx(uint32_t *data, uint16_t len) {\n  return cyw_sdio_tx(data, len);\n}\nstatic bool cyw_bus_write(unsigned int f, uint32_t addr, void *data,\n                          uint16_t len) {\n  if (f == CYW_SDIO_FUNC_CHIP && len == 4) addr |= CYW_CHIP_BCKPLN_ACCSS4B;\n  return cyw_sdio_transfer(true, f, addr, data, (uint32_t) len);\n}\nstatic bool cyw_bus_read(unsigned int f, uint32_t addr, void *data,\n                         uint16_t len) {\n  return cyw_sdio_transfer(false, f, addr, data, (uint32_t) len);\n}\n\n#endif\n\n// Mongoose Wi-Fi API functions\n\nbool mg_wifi_scan(void) {\n  return cyw_wifi_scan();\n}\n\nbool mg_wifi_connect(struct mg_wifi_data *wifi) {\n  s_ifp->ip = s_ip;\n  s_ifp->mask = s_mask;\n  if (s_ifp->ip == 0) s_ifp->enable_dhcp_client = true;\n  s_ifp->enable_dhcp_server = false;\n  MG_DEBUG((\"Connecting to '%s'\", wifi->ssid));\n  return cyw_wifi_connect(wifi->ssid, wifi->pass);\n}\n\nbool mg_wifi_disconnect(void) {\n  return cyw_wifi_disconnect();\n}\n\nbool mg_wifi_ap_start(struct mg_wifi_data *wifi) {\n  MG_DEBUG((\"Starting AP '%s' (%u)\", wifi->apssid, wifi->apchannel));\n  return cyw_wifi_ap_start(wifi->apssid, wifi->appass, wifi->apchannel);\n}\n\nbool mg_wifi_ap_stop(void) {\n  return cyw_wifi_ap_stop();\n}\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/imxrt.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && \\\n  (defined(MG_ENABLE_DRIVER_IMXRT10) && MG_ENABLE_DRIVER_IMXRT10) || \\\n  (defined(MG_ENABLE_DRIVER_IMXRT11) && MG_ENABLE_DRIVER_IMXRT11) || \\\n  (defined(MG_ENABLE_DRIVER_MCXE) && MG_ENABLE_DRIVER_MCXE)\nstruct imxrt_enet {\n  volatile uint32_t RESERVED0, EIR, EIMR, RESERVED1, RDAR, TDAR, RESERVED2[3],\n      ECR, RESERVED3[6], MMFR, MSCR, RESERVED4[7], MIBC, RESERVED5[7], RCR,\n      RESERVED6[15], TCR, RESERVED7[7], PALR, PAUR, OPD, TXIC0, TXIC1, TXIC2,\n      RESERVED8, RXIC0, RXIC1, RXIC2, RESERVED9[3], IAUR, IALR, GAUR, GALR,\n      RESERVED10[7], TFWR, RESERVED11[14], RDSR, TDSR, MRBR[2], RSFL, RSEM,\n      RAEM, RAFL, TSEM, TAEM, TAFL, TIPG, FTRL, RESERVED12[3], TACC, RACC,\n      RESERVED13[15], RMON_T_PACKETS, RMON_T_BC_PKT, RMON_T_MC_PKT,\n      RMON_T_CRC_ALIGN, RMON_T_UNDERSIZE, RMON_T_OVERSIZE, RMON_T_FRAG,\n      RMON_T_JAB, RMON_T_COL, RMON_T_P64, RMON_T_P65TO127, RMON_T_P128TO255,\n      RMON_T_P256TO511, RMON_T_P512TO1023, RMON_T_P1024TO2048, RMON_T_GTE2048,\n      RMON_T_OCTETS, IEEE_T_DROP, IEEE_T_FRAME_OK, IEEE_T_1COL, IEEE_T_MCOL,\n      IEEE_T_DEF, IEEE_T_LCOL, IEEE_T_EXCOL, IEEE_T_MACERR, IEEE_T_CSERR,\n      IEEE_T_SQE, IEEE_T_FDXFC, IEEE_T_OCTETS_OK, RESERVED14[3], RMON_R_PACKETS,\n      RMON_R_BC_PKT, RMON_R_MC_PKT, RMON_R_CRC_ALIGN, RMON_R_UNDERSIZE,\n      RMON_R_OVERSIZE, RMON_R_FRAG, RMON_R_JAB, RESERVED15, RMON_R_P64,\n      RMON_R_P65TO127, RMON_R_P128TO255, RMON_R_P256TO511, RMON_R_P512TO1023,\n      RMON_R_P1024TO2047, RMON_R_GTE2048, RMON_R_OCTETS, IEEE_R_DROP,\n      IEEE_R_FRAME_OK, IEEE_R_CRC, IEEE_R_ALIGN, IEEE_R_MACERR, IEEE_R_FDXFC,\n      IEEE_R_OCTETS_OK, RESERVED16[71], ATCR, ATVR, ATOFF, ATPER, ATCOR, ATINC,\n      ATSTMP, RESERVED17[122], TGSR, TCSR0, TCCR0, TCSR1, TCCR1, TCSR2, TCCR2,\n      TCSR3;\n};\n\n#undef ENET\n#if defined(MG_ENABLE_DRIVER_IMXRT11) && MG_ENABLE_DRIVER_IMXRT11\n#define ENET ((struct imxrt_enet *) (uintptr_t) 0x40424000U)\n#define ETH_DESC_CNT 5     // Descriptors count\n#elif defined(MG_ENABLE_DRIVER_IMXRT10) && MG_ENABLE_DRIVER_IMXRT10\n#define ENET ((struct imxrt_enet *) (uintptr_t) 0x402D8000U)\n#define ETH_DESC_CNT 4     // Descriptors count\n#else // MG_ENABLE_DRIVER_MCXE\n#define ENET ((struct imxrt_enet *) (uintptr_t) 0x40079000U)\n#define ETH_DESC_CNT 4     // Descriptor count\n#endif\n\n#define ETH_PKT_SIZE 1536  // Max frame size, 64-bit aligned\n\nstruct enet_desc {\n  uint16_t length;   // Data length\n  uint16_t control;  // Control and status\n  uint32_t *buffer;  // Data ptr\n};\n\n// Descriptors: in non-cached area (TODO(scaprile)), (37.5.1.22.2 37.5.1.23.2)\n// Buffers: 64-byte aligned (37.3.14)\nstatic volatile struct enet_desc s_rxdesc[ETH_DESC_CNT] MG_ETH_RAM MG_64BYTE_ALIGNED;\nstatic volatile struct enet_desc s_txdesc[ETH_DESC_CNT] MG_ETH_RAM MG_64BYTE_ALIGNED;\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM MG_64BYTE_ALIGNED;\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM MG_64BYTE_ALIGNED;\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\n\nstatic uint16_t enet_read_phy(uint8_t addr, uint8_t reg) {\n  ENET->EIR |= MG_BIT(23);  // MII interrupt clear\n  ENET->MMFR = (1 << 30) | (2 << 28) | (addr << 23) | (reg << 18) | (2 << 16);\n  while ((ENET->EIR & MG_BIT(23)) == 0) (void) 0;\n  return ENET->MMFR & 0xffff;\n}\n\nstatic void enet_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  ENET->EIR |= MG_BIT(23);  // MII interrupt clear\n  ENET->MMFR =\n      (1 << 30) | (1 << 28) | (addr << 23) | (reg << 18) | (2 << 16) | val;\n  while ((ENET->EIR & MG_BIT(23)) == 0) (void) 0;\n}\n\n//  MDC clock is generated from IPS Bus clock (ipg_clk); as per 802.3,\n//  it must not exceed 2.5MHz\n// The PHY receives the PLL6-generated 50MHz clock\nstatic bool mg_tcpip_driver_imxrt_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_imxrt_data *d =\n      (struct mg_tcpip_driver_imxrt_data *) ifp->driver_data;\n  s_ifp = ifp;\n\n  // Init RX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i].control = MG_BIT(15);              // Own (E)\n    s_rxdesc[i].buffer = (uint32_t *) s_rxbuf[i];  // Point to data buffer\n  }\n  s_rxdesc[ETH_DESC_CNT - 1].control |= MG_BIT(13);  // Wrap last descriptor\n\n  // Init TX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    // s_txdesc[i].control = MG_BIT(10);  // Own (TC)\n    s_txdesc[i].buffer = (uint32_t *) s_txbuf[i];\n  }\n  s_txdesc[ETH_DESC_CNT - 1].control |= MG_BIT(13);  // Wrap last descriptor\n\n  ENET->ECR = MG_BIT(0);                     // Software reset, disable\n  while ((ENET->ECR & MG_BIT(0))) (void) 0;  // Wait until done\n\n  // Set MDC clock divider. If user told us the value, use it.\n  // TODO(): Otherwise, guess (currently assuming max freq)\n  int cr = (d == NULL || d->mdc_cr < 0) ? 24 : d->mdc_cr;\n  ENET->MSCR = (1 << 8) | ((cr & 0x3f) << 1);  // HOLDTIME 2 clks\n  struct mg_phy phy = {enet_read_phy, enet_write_phy};\n  mg_phy_init(&phy, d->phy_addr, MG_PHY_LEDS_ACTIVE_HIGH); // MAC clocks PHY  \n  // Select RMII mode, 100M, keep CRC, set max rx length, disable loop\n  ENET->RCR = (1518 << 16) | MG_BIT(8) | MG_BIT(2);\n  // ENET->RCR |= MG_BIT(3);     // Receive all\n  ENET->TCR = MG_BIT(2);  // Full-duplex\n  ENET->RDSR = (uint32_t) (uintptr_t) s_rxdesc;\n  ENET->TDSR = (uint32_t) (uintptr_t) s_txdesc;\n  ENET->MRBR[0] = ETH_PKT_SIZE;  // Same size for RX/TX buffers\n  // MAC address filtering (bytes in reversed order)\n  ENET->PAUR = ((uint32_t) ifp->mac[4] << 24U) | (uint32_t) ifp->mac[5] << 16U;\n  ENET->PALR = (uint32_t) (ifp->mac[0] << 24U) |\n               ((uint32_t) ifp->mac[1] << 16U) |\n               ((uint32_t) ifp->mac[2] << 8U) | ifp->mac[3];\n  ENET->ECR = MG_BIT(8) | MG_BIT(1);  // Little-endian CPU, Enable\n  ENET->EIMR = MG_BIT(25);            // Set interrupt mask\n  ENET->RDAR = MG_BIT(24);            // Receive Descriptors have changed\n  ENET->TDAR = MG_BIT(24);            // Transmit Descriptors have changed\n  // ENET->OPD = 0x10014;\n  ENET->IAUR = 0;\n  ENET->IALR = 0;\n  ENET->GAUR = 0;\n  ENET->GALR = 0;\n  return true;\n}\n\n\n// Transmit frame\nstatic size_t mg_tcpip_driver_imxrt_tx(const void *buf, size_t len,\n                                       struct mg_tcpip_if *ifp) {\n  static int s_txno;  // Current descriptor index\n  if (len > sizeof(s_txbuf[ETH_DESC_CNT])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = (size_t) -1;  // fail\n  } else if ((s_txdesc[s_txno].control & MG_BIT(15))) {\n    ifp->nerr++;\n    MG_ERROR((\"No descriptors available\"));\n    len = 0;  // retry later\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);         // Copy data\n    s_txdesc[s_txno].length = (uint16_t) len;  // Set data len\n    // Table 37-34, R, L, TC (Ready, last, transmit CRC after frame\n    s_txdesc[s_txno].control |=\n        (uint16_t) (MG_BIT(15) | MG_BIT(11) | MG_BIT(10));\n    ENET->TDAR = MG_BIT(24);  // Descriptor ring updated\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n  (void) ifp;\n  return len;\n}\n\nstatic void mg_tcpip_driver_imxrt_update_hash_table(struct mg_tcpip_if *ifp) {\n  // TODO(): read database, rebuild hash table\n  // RM 37.3.4.3.2\n  uint32_t hash_table[2] = {0, 0};\n  // uint8_t hash64 = ((~mg_crc32(0, mcast_addr, 6)) >> 26) & 0x3f;\n  // hash_table[((uint8_t)hash64) >> 5] |= (1 << (hash64 & 0x1f));\n  hash_table[1] = MG_BIT(1); // above reduces to this for mDNS addr\n  ENET->GAUR = hash_table[1];\n  ENET->GALR = hash_table[0];\n  (void) ifp;\n}\n\nstatic bool mg_tcpip_driver_imxrt_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    mg_tcpip_driver_imxrt_update_hash_table(ifp);\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  struct mg_tcpip_driver_imxrt_data *d =\n      (struct mg_tcpip_driver_imxrt_data *) ifp->driver_data;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {enet_read_phy, enet_write_phy};\n  up = mg_phy_up(&phy, d->phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    // tmp = reg with flags set to the most likely situation: 100M full-duplex\n    // if(link is slow or half) set flags otherwise\n    // reg = tmp\n    uint32_t tcr = ENET->TCR | MG_BIT(2);             // Full-duplex\n    uint32_t rcr = ENET->RCR & ~MG_BIT(9);            // 100M\n    if (speed == MG_PHY_SPEED_10M) rcr |= MG_BIT(9);  // 10M\n    if (full_duplex == false) tcr &= ~MG_BIT(2);      // Half-duplex\n    ENET->TCR = tcr;  // IRQ handler does not fiddle with these registers\n    ENET->RCR = rcr;\n    MG_DEBUG((\"Link is %uM %s-duplex\", rcr & MG_BIT(9) ? 10 : 100,\n              tcr & MG_BIT(2) ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\nstatic uint32_t s_rxno;\n#if !defined(MG_ENABLE_DRIVER_MCXE)\nvoid ENET_IRQHandler(void);\nvoid ENET_IRQHandler(void) {\n#else\nvoid ENET_Receive_IRQHandler(void);\nvoid ENET_Receive_IRQHandler(void) {\n#endif\n  ENET->EIR = MG_BIT(25);  // Ack IRQ\n  // Frame received, loop\n  for (uint32_t i = 0; i < 10; i++) {  // read as they arrive but not forever\n    uint32_t r = s_rxdesc[s_rxno].control;\n    if (r & MG_BIT(15)) break;  // exit when done\n    // skip partial/errored frames (Table 37-32)\n    if ((r & MG_BIT(11)) &&\n        !(r & (MG_BIT(5) | MG_BIT(4) | MG_BIT(2) | MG_BIT(1) | MG_BIT(0)))) {\n      size_t len = s_rxdesc[s_rxno].length;\n      mg_tcpip_qwrite(s_rxbuf[s_rxno], len > 4 ? len - 4 : len, s_ifp);\n    }\n    s_rxdesc[s_rxno].control |= MG_BIT(15);\n    if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n  }\n  ENET->RDAR = MG_BIT(24);  // Receive Descriptors have changed\n  // If b24 == 0, descriptors were exhausted and probably frames were dropped\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_imxrt = {mg_tcpip_driver_imxrt_init,\n                                                mg_tcpip_driver_imxrt_tx, NULL,\n                                                mg_tcpip_driver_imxrt_poll};\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/nxp_wifi.c\"\n#endif\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_NXP_WIFI) && \\\n    MG_ENABLE_DRIVER_NXP_WIFI\n\n\n\nbool __attribute__((weak)) netif_init(struct mg_tcpip_if *ifp) {\n  (void) ifp;\n  MG_ERROR((\"Please link wifi/port/net contents\"));\n  return false;\n}\nsize_t __attribute__((weak))\nnetif_tx(const void *bfr, size_t len, struct mg_tcpip_if *ifp) {\n  (void) bfr;\n  (void) len;\n  netif_init(ifp);\n  return 0;\n}\nbool __attribute__((weak)) netif_connect(struct mg_wifi_data *wifi) {\n  (void) wifi;\n  return netif_init(NULL);\n}\nbool __attribute__((weak))\nnetif_poll(struct mg_tcpip_if *ifp, bool s1, mg_tcpip_event_handler_t evcb) {\n  (void) ifp;\n  (void) s1;\n  (void) evcb;\n  return false;\n}\n\nstatic struct mg_tcpip_if *s_ifp;\nstatic uint32_t s_ip, s_mask;\n\nstatic void wifi_cb(struct mg_tcpip_if *ifp, int ev, void *ev_data) {\n  struct mg_wifi_data *wifi =\n      &((struct mg_tcpip_driver_nxp_wifi_data *) ifp->driver_data)->wifi;\n  if (wifi->apmode && ev == MG_TCPIP_EV_ST_CHG &&\n      *(uint8_t *) ev_data == MG_TCPIP_STATE_UP) {\n    MG_DEBUG((\"Access Point started\"));\n    s_ip = ifp->ip, ifp->ip = wifi->apip;\n    s_mask = ifp->mask, ifp->mask = wifi->apmask;\n    ifp->enable_dhcp_client = false;\n    ifp->enable_dhcp_server = true;\n  }\n}\n\nstatic bool nxp_wifi_init(struct mg_tcpip_if *ifp) {\n  struct mg_wifi_data *wifi =\n      &((struct mg_tcpip_driver_nxp_wifi_data *) ifp->driver_data)->wifi;\n  s_ifp = ifp;\n  s_ip = ifp->ip;\n  s_mask = ifp->mask;\n  ifp->pfn = wifi_cb;\n  if (!netif_init(ifp)) return false;\n  if (wifi->apmode) {\n    return mg_wifi_ap_start(wifi);\n  } else if (wifi->ssid != NULL && wifi->pass != NULL) {\n    return mg_wifi_connect(wifi);\n  }\n  return true;\n}\n\nbool nxp_wifi_poll(struct mg_tcpip_if *ifp, bool s1) {\n  return netif_poll(ifp, s1, mg_tcpip_call);\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_nxp_wifi = {nxp_wifi_init, netif_tx,\n                                                   NULL, nxp_wifi_poll};\n\nbool mg_wifi_connect(struct mg_wifi_data *wifi) {\n  s_ifp->ip = s_ip;\n  s_ifp->mask = s_mask;\n  if (s_ifp->ip == 0) s_ifp->enable_dhcp_client = true;\n  s_ifp->enable_dhcp_server = false;\n  return netif_connect(wifi);\n}\n\nbool __attribute__((weak)) mg_wifi_scan(void) {\n  return netif_init(NULL);\n}\nbool __attribute__((weak)) mg_wifi_disconnect(void) {\n  return netif_init(NULL);\n}\nbool __attribute__((weak)) mg_wifi_ap_start(struct mg_wifi_data *wifi) {\n  (void) wifi;\n  return netif_init(NULL);\n}\nbool __attribute__((weak)) mg_wifi_ap_stop(void) {\n  return netif_init(NULL);\n}\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/phy.c\"\n#endif\n\n\nenum {                  // ID1  ID2\n  MG_PHY_KSZ8x = 0x22,  // 0022 156x - KSZ8081RNB, KSZ8091RNB\n  MG_PHY_DP83x = 0x2000,\n  MG_PHY_DP83867 = 0xa231,  // 2000 a231 - TI DP83867I\n  MG_PHY_DP83825 = 0xa140,  // 2000 a140 - TI DP83825I\n  MG_PHY_DP83848 = 0x5ca2,  // 2000 5ca2 - TI DP83848I\n  MG_PHY_LAN87x = 0x7,      // 0007 c0fx - LAN8720\n  MG_PHY_RTL82x = 0x1c,\n  MG_PHY_RTL8201 = 0xc816,  // 001c c816 - RTL8201F\n  MG_PHY_RTL8211 = 0xc916,  // 001c c916 - RTL8211F\n  MG_PHY_ICS1894x = 0x15,\n  MG_PHY_ICS189432 = 0xf450  // 0015 f450 - ICS1894\n};\n\nenum {\n  MG_PHY_REG_BCR = 0,\n  MG_PHY_REG_BSR = 1,\n  MG_PHY_REG_ID1 = 2,\n  MG_PHY_REG_ID2 = 3,\n  MG_PHY_DP83x_REG_PHYSTS = 16,\n  MG_PHY_DP83867_REG_PHYSTS = 17,\n  MG_PHY_DP83x_REG_RCSR = 23,\n  MG_PHY_DP83x_REG_LEDCR = 24,\n  MG_PHY_KSZ8x_REG_PC1R = 30,\n  MG_PHY_KSZ8x_REG_PC2R = 31,\n  MG_PHY_LAN87x_REG_SCSR = 31,\n  MG_PHY_RTL82x_REG_PAGESEL = 31,\n  MG_PHY_RTL8201_REG_RMSR = 16,   // in page 7\n  MG_PHY_RTL8211_REG_PHYSR = 26,  // in page a43\n  MG_PHY_ICS189432_REG_POLL = 17\n};\n\nstatic const char *mg_phy_id_to_str(uint16_t id1, uint16_t id2) {\n  switch (id1) {\n    case MG_PHY_DP83x:\n      switch (id2) {\n        case MG_PHY_DP83867:\n          return \"DP83867\";\n        case MG_PHY_DP83848:\n          return \"DP83848\";\n        case MG_PHY_DP83825:\n          return \"DP83825\";\n        default:\n          return \"DP83x\";\n      }\n    case MG_PHY_KSZ8x:\n      return \"KSZ8x\";\n    case MG_PHY_LAN87x:\n      return \"LAN87x\";\n    case MG_PHY_RTL82x:\n      switch (id2) {\n        case MG_PHY_RTL8201:\n          return \"RTL8201\";\n        case MG_PHY_RTL8211:\n          return \"RTL8211\";\n        default:\n          return \"RTL82x\";\n      }\n    case MG_PHY_ICS1894x:\n      return \"ICS1894x\";\n    default:\n      return \"unknown\";\n  }\n}\n\nvoid mg_phy_init(struct mg_phy *phy, uint8_t phy_addr, uint8_t config) {\n  uint16_t id1, id2;\n  phy->write_reg(phy_addr, MG_PHY_REG_BCR, MG_BIT(15));  // Reset PHY\n  while (phy->read_reg(phy_addr, MG_PHY_REG_BCR) & MG_BIT(15)) (void) 0;\n  // MG_PHY_REG_BCR[12]: Autonegotiation is default unless hw says otherwise\n\n  id1 = phy->read_reg(phy_addr, MG_PHY_REG_ID1);\n  id2 = phy->read_reg(phy_addr, MG_PHY_REG_ID2);\n  MG_INFO((\"PHY ID: %#04x %#04x (%s)\", id1, id2, mg_phy_id_to_str(id1, id2)));\n\n  if (id1 == MG_PHY_DP83x && id2 == MG_PHY_DP83867) {\n    phy->write_reg(phy_addr, 0x0d, 0x1f);  // write 0x10d to IO_MUX_CFG (0x0170)\n    phy->write_reg(phy_addr, 0x0e, 0x170);\n    phy->write_reg(phy_addr, 0x0d, 0x401f);\n    phy->write_reg(phy_addr, 0x0e, 0x10d);\n  }\n\n  if (config & MG_PHY_CLOCKS_MAC) {\n    // Use PHY crystal oscillator (preserve defaults)\n    // nothing to do\n  } else {  // MAC clocks PHY, PHY has no xtal\n    // Enable 50 MHz external ref clock at XI (preserve defaults)\n    if (id1 == MG_PHY_DP83x && id2 != MG_PHY_DP83867 && id2 != MG_PHY_DP83848) {\n      phy->write_reg(phy_addr, MG_PHY_DP83x_REG_RCSR, MG_BIT(7) | MG_BIT(0));\n    } else if (id1 == MG_PHY_KSZ8x) {\n      // Disable isolation (override hw, it doesn't make sense at this point)\n      // - #2848, some NXP boards set ISO, even though docs say they don't\n      phy->write_reg(phy_addr, MG_PHY_REG_BCR,\n                     (uint16_t) (phy->read_reg(phy_addr, MG_PHY_REG_BCR) &\n                                 (uint16_t) ~MG_BIT(10)));\n      // now do clock stuff\n      phy->write_reg(phy_addr, MG_PHY_KSZ8x_REG_PC2R,\n                     (uint16_t) (MG_BIT(15) | MG_BIT(8) | MG_BIT(7)));\n    } else if (id1 == MG_PHY_LAN87x) {\n      // nothing to do\n    } else if (id1 == MG_PHY_RTL82x && id2 == MG_PHY_RTL8201) {\n      // assume PHY has been hardware strapped properly\n#if 0\n      phy->write_reg(phy_addr, MG_PHY_RTL82x_REG_PAGESEL, 7);  // Select page 7\n      phy->write_reg(phy_addr, MG_PHY_RTL8201_REG_RMSR, 0x1ffa);\n      phy->write_reg(phy_addr, MG_PHY_RTL82x_REG_PAGESEL, 0);  // Select page 0\n#endif\n    } else if (id1 == MG_PHY_RTL82x && id2 == MG_PHY_RTL8211) {\n      // assume PHY has been hardware strapped properly\n    }\n  }\n\n  if (config & MG_PHY_LEDS_ACTIVE_HIGH && id1 == MG_PHY_DP83x) {\n    phy->write_reg(phy_addr, MG_PHY_DP83x_REG_LEDCR,\n                   MG_BIT(9) | MG_BIT(7));  // LED status, active high\n  }  // Other PHYs do not support this feature\n}\n\nbool mg_phy_up(struct mg_phy *phy, uint8_t phy_addr, bool *full_duplex,\n               uint8_t *speed) {\n  bool up = false;\n  uint16_t bsr = phy->read_reg(phy_addr, MG_PHY_REG_BSR);\n  if ((bsr & MG_BIT(5)) && !(bsr & MG_BIT(2)))  // some PHYs latch down events\n    bsr = phy->read_reg(phy_addr, MG_PHY_REG_BSR);  // read again\n  up = bsr & MG_BIT(2);\n  if (up && full_duplex != NULL && speed != NULL) {\n    uint16_t id1 = phy->read_reg(phy_addr, MG_PHY_REG_ID1);\n    if (id1 == MG_PHY_DP83x) {\n      uint16_t id2 = phy->read_reg(phy_addr, MG_PHY_REG_ID2);\n      if (id2 == MG_PHY_DP83867) {\n        uint16_t physts = phy->read_reg(phy_addr, MG_PHY_DP83867_REG_PHYSTS);\n        *full_duplex = physts & MG_BIT(13);\n        *speed = (physts & MG_BIT(15))   ? MG_PHY_SPEED_1000M\n                 : (physts & MG_BIT(14)) ? MG_PHY_SPEED_100M\n                                         : MG_PHY_SPEED_10M;\n      } else {\n        uint16_t physts = phy->read_reg(phy_addr, MG_PHY_DP83x_REG_PHYSTS);\n        *full_duplex = physts & MG_BIT(2);\n        *speed = (physts & MG_BIT(1)) ? MG_PHY_SPEED_10M : MG_PHY_SPEED_100M;\n      }\n    } else if (id1 == MG_PHY_KSZ8x) {\n      uint16_t pc1r = phy->read_reg(phy_addr, MG_PHY_KSZ8x_REG_PC1R);\n      *full_duplex = pc1r & MG_BIT(2);\n      *speed = (pc1r & 3) == 1 ? MG_PHY_SPEED_10M : MG_PHY_SPEED_100M;\n    } else if (id1 == MG_PHY_LAN87x) {\n      uint16_t scsr = phy->read_reg(phy_addr, MG_PHY_LAN87x_REG_SCSR);\n      *full_duplex = scsr & MG_BIT(4);\n      *speed = (scsr & MG_BIT(3)) ? MG_PHY_SPEED_100M : MG_PHY_SPEED_10M;\n    } else if (id1 == MG_PHY_RTL82x) {\n      uint16_t id2 = phy->read_reg(phy_addr, MG_PHY_REG_ID2);\n      if (id2 == MG_PHY_RTL8211) {\n        uint16_t physr;\n        phy->write_reg(phy_addr, MG_PHY_RTL82x_REG_PAGESEL, 0xa43);\n        physr = phy->read_reg(phy_addr, MG_PHY_RTL8211_REG_PHYSR);\n        phy->write_reg(phy_addr, MG_PHY_RTL82x_REG_PAGESEL, 0);\n        *full_duplex = physr & MG_BIT(3);\n        *speed = (physr & MG_BIT(5))   ? MG_PHY_SPEED_1000M\n                 : (physr & MG_BIT(4)) ? MG_PHY_SPEED_100M\n                                       : MG_PHY_SPEED_10M;\n      } else {\n        uint16_t bcr = phy->read_reg(phy_addr, MG_PHY_REG_BCR);\n        *full_duplex = bcr & MG_BIT(8);\n        *speed = (bcr & MG_BIT(13)) ? MG_PHY_SPEED_100M : MG_PHY_SPEED_10M;\n      }\n    } else if (id1 == MG_PHY_ICS1894x) {\n      uint16_t poll_reg = phy->read_reg(phy_addr, MG_PHY_ICS189432_REG_POLL);\n      *full_duplex = poll_reg & MG_BIT(14);\n      *speed = (poll_reg & MG_BIT(15)) ? MG_PHY_SPEED_100M : MG_PHY_SPEED_10M;\n    }\n  }\n  return up;\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/pico-w.c\"\n#endif\n#if MG_ENABLE_TCPIP && MG_ARCH == MG_ARCH_PICOSDK && \\\n    defined(MG_ENABLE_DRIVER_PICO_W) && MG_ENABLE_DRIVER_PICO_W\n\n\n\n\n\nstatic struct mg_tcpip_if *s_ifp;\nstatic uint32_t s_ip, s_mask;\nstatic bool s_aplink = false, s_scanning = false;\nstatic bool s_stalink = false, s_connecting = false;\n\nstatic void wifi_cb(struct mg_tcpip_if *ifp, int ev, void *ev_data) {\n  struct mg_wifi_data *wifi =\n      &((struct mg_tcpip_driver_pico_w_data *) ifp->driver_data)->wifi;\n  if (wifi->apmode && ev == MG_TCPIP_EV_ST_CHG &&\n      *(uint8_t *) ev_data == MG_TCPIP_STATE_UP) {\n    MG_DEBUG((\"Access Point started\"));\n    s_ip = ifp->ip, ifp->ip = wifi->apip;\n    s_mask = ifp->mask, ifp->mask = wifi->apmask;\n    ifp->enable_dhcp_client = false;\n    ifp->enable_dhcp_server = true;\n  }\n}\n\nstatic bool mg_tcpip_driver_pico_w_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_pico_w_data *d =\n      (struct mg_tcpip_driver_pico_w_data *) ifp->driver_data;\n  struct mg_wifi_data *wifi = &d->wifi;\n  s_ifp = ifp;\n  s_ip = ifp->ip;\n  s_mask = ifp->mask;\n  ifp->pfn = wifi_cb;\n  if (cyw43_arch_init() != 0)\n    return false;  // initialize async_context and WiFi chip\n  if (wifi->apmode && wifi->apssid != NULL) {\n    if (!mg_wifi_ap_start(wifi)) return false;\n    cyw43_wifi_get_mac(&cyw43_state, CYW43_ITF_STA, ifp->mac);  // same MAC\n  } else {\n    cyw43_arch_enable_sta_mode();\n    cyw43_wifi_get_mac(&cyw43_state, CYW43_ITF_STA, ifp->mac);\n    if (wifi->ssid != NULL) {\n      return mg_wifi_connect(wifi);\n    } else {\n      cyw43_arch_disable_sta_mode();\n    }\n  }\n  return true;\n}\n\nstatic size_t mg_tcpip_driver_pico_w_tx(const void *buf, size_t len,\n                                        struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_pico_w_data *d =\n      (struct mg_tcpip_driver_pico_w_data *) ifp->driver_data;\n  return cyw43_send_ethernet(&cyw43_state,\n                             d->wifi.apmode ? CYW43_ITF_AP : CYW43_ITF_STA, len,\n                             buf, false) == 0\n             ? len\n             : 0;\n}\n\nstatic bool mg_tcpip_driver_pico_w_poll(struct mg_tcpip_if *ifp, bool s1) {\n  cyw43_arch_poll();  // not necessary, except when IRQs are disabled (OTA)\n  if (s_scanning && !cyw43_wifi_scan_active(&cyw43_state)) {\n    MG_VERBOSE((\"scan complete\"));\n    s_scanning = 0;\n    mg_tcpip_call(ifp, MG_TCPIP_EV_WIFI_SCAN_END, NULL);\n  }\n  if (ifp->update_mac_hash_table) {\n    // first call to _poll() is after _init(), so this is safe\n    cyw43_wifi_update_multicast_filter(&cyw43_state, (uint8_t *) mcast_addr,\n                                       true);\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  struct mg_tcpip_driver_pico_w_data *d =\n      (struct mg_tcpip_driver_pico_w_data *) ifp->driver_data;\n  if (d->wifi.apmode) return s_aplink;\n  int sdkstate = cyw43_wifi_link_status(&cyw43_state, CYW43_ITF_STA);\n  MG_VERBOSE((\"conn: %c state: %d\", s_connecting ? '1' : '0', sdkstate));\n  if (sdkstate < 0 && s_connecting) {\n    mg_tcpip_call(ifp, MG_TCPIP_EV_WIFI_CONNECT_ERR, &sdkstate);\n    s_connecting = false;\n  }\n  return s_stalink;\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_pico_w = {\n    mg_tcpip_driver_pico_w_init,\n    mg_tcpip_driver_pico_w_tx,\n    NULL,\n    mg_tcpip_driver_pico_w_poll,\n};\n\n// Called once per outstanding frame by async_context\nvoid cyw43_cb_process_ethernet(void *cb_data, int itf, size_t len,\n                               const uint8_t *buf) {\n  mg_tcpip_qwrite((void *) buf, len, s_ifp);\n  (void) cb_data;\n}\n\n// Called by async_context\nvoid cyw43_cb_tcpip_set_link_up(cyw43_t *self, int itf) {\n  if (itf == CYW43_ITF_AP) {\n    s_aplink = true;\n  } else {\n    s_stalink = true;\n    s_connecting = false;\n  }\n}\nvoid cyw43_cb_tcpip_set_link_down(cyw43_t *self, int itf) {\n  if (itf == CYW43_ITF_AP) {\n    s_aplink = false;\n  } else {\n    s_stalink = false;\n    // SDK calls this before we check status, don't clear s_connecting here\n  }\n}\n\n// there's life beyond lwIP\nvoid pbuf_copy_partial(void) {\n  (void) 0;\n}\n\nstatic int result_cb(void *arg, const cyw43_ev_scan_result_t *data) {\n  struct mg_wifi_scan_bss_data bss;\n  bss.SSID = mg_str_n(data->ssid, data->ssid_len);\n  bss.BSSID = (char *) data->bssid;\n  bss.RSSI = (int8_t) data->rssi;\n  bss.has_n = 0;  // SDK ignores this\n  bss.channel = (uint8_t) data->channel;\n  bss.band = MG_WIFI_BAND_2G;\n  // SDK-internal dependency, 2.1.0\n  bss.security = data->auth_mode & MG_BIT(0) ? MG_WIFI_SECURITY_WEP\n                                             : MG_WIFI_SECURITY_OPEN;\n  if (data->auth_mode & MG_BIT(1)) bss.security |= MG_WIFI_SECURITY_WPA;\n  if (data->auth_mode & MG_BIT(2)) bss.security |= MG_WIFI_SECURITY_WPA2;\n  MG_VERBOSE((\"BSS: %.*s (%u) (%M) %d dBm %u\", bss.SSID.len, bss.SSID.buf,\n              bss.channel, mg_print_mac, bss.BSSID, (int) bss.RSSI,\n              bss.security));\n  mg_tcpip_call(s_ifp, MG_TCPIP_EV_WIFI_SCAN_RESULT, &bss);\n  return 0;\n}\n\nbool mg_wifi_scan(void) {\n  cyw43_wifi_scan_options_t opts;\n  memset(&opts, 0, sizeof(opts));\n  bool res = (cyw43_wifi_scan(&cyw43_state, &opts, NULL, result_cb) == 0);\n  if (res) s_scanning = true;\n  return res;\n}\n\nbool mg_wifi_connect(struct mg_wifi_data *wifi) {\n  s_ifp->ip = s_ip;\n  s_ifp->mask = s_mask;\n  if (s_ifp->ip == 0) s_ifp->enable_dhcp_client = true;\n  s_ifp->enable_dhcp_server = false;\n  cyw43_arch_enable_sta_mode();\n  MG_DEBUG((\"Connecting to '%s'\", wifi->ssid));\n  int res = cyw43_arch_wifi_connect_async(wifi->ssid, wifi->pass,\n                                          CYW43_AUTH_WPA2_AES_PSK);\n  MG_VERBOSE((\"res: %d\", res));\n  if (res == 0) s_connecting = true;\n  return (res == 0);\n}\n\nbool mg_wifi_disconnect(void) {\n  cyw43_arch_disable_sta_mode();\n  s_connecting = false;\n  return true;\n}\n\nbool mg_wifi_ap_start(struct mg_wifi_data *wifi) {\n  MG_DEBUG((\"Starting AP '%s' (%u)\", wifi->apssid, wifi->apchannel));\n  cyw43_wifi_ap_set_channel(&cyw43_state, wifi->apchannel);\n  cyw43_arch_enable_ap_mode(wifi->apssid, wifi->appass,\n                            CYW43_AUTH_WPA2_AES_PSK);\n  return true;\n}\n\nbool mg_wifi_ap_stop(void) {\n  cyw43_arch_disable_ap_mode();\n  return true;\n}\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/ppp.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_PPP) && MG_ENABLE_DRIVER_PPP\n\n#define MG_PPP_FLAG 0x7e  // PPP frame delimiter\n#define MG_PPP_ESC 0x7d   // PPP escape byte for special characters\n#define MG_PPP_ADDR 0xff\n#define MG_PPP_CTRL 0x03\n\n#define MG_PPP_PROTO_IP 0x0021\n#define MG_PPP_PROTO_LCP 0xc021\n#define MG_PPP_PROTO_IPCP 0x8021\n\n#define MG_PPP_IPCP_REQ 1\n#define MG_PPP_IPCP_ACK 2\n#define MG_PPP_IPCP_NACK 3\n#define MG_PPP_IPCP_IPADDR 3\n\n#define MG_PPP_LCP_CFG_REQ 1\n#define MG_PPP_LCP_CFG_ACK 2\n#define MG_PPP_LCP_CFG_NACK 3\n#define MG_PPP_LCP_CFG_REJECT 4\n#define MG_PPP_LCP_CFG_TERM_REQ 5\n#define MG_PPP_LCP_CFG_TERM_ACK 6\n\n#define MG_PPP_AT_TIMEOUT 2000\n\nstatic size_t print_atcmd(void (*out)(char, void *), void *arg, va_list *ap) {\n  struct mg_str s = va_arg(*ap, struct mg_str);\n  for (size_t i = 0; i < s.len; i++) out(s.buf[i] < 0x20 ? '.' : s.buf[i], arg);\n  return s.len;\n}\n\nstatic void mg_ppp_reset(struct mg_tcpip_driver_ppp_data *dd) {\n  dd->script_index = 0;\n  dd->deadline = 0;\n  if (dd->reset) dd->reset(dd->uart);\n}\n\nstatic bool mg_ppp_atcmd_handle(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_ppp_data *dd =\n      (struct mg_tcpip_driver_ppp_data *) ifp->driver_data;\n  if (dd->script == NULL || dd->script_index < 0) return true;\n  if (dd->deadline == 0) dd->deadline = mg_millis() + MG_PPP_AT_TIMEOUT;\n  for (;;) {\n    if (dd->script_index % 2 == 0) {  // send AT command\n      const char *cmd = dd->script[dd->script_index];\n      MG_DEBUG((\"send AT[%d]: %M\", dd->script_index, print_atcmd, mg_str(cmd)));\n      while (*cmd) dd->tx(dd->uart, *cmd++);\n      dd->script_index++;\n      ifp->recv_queue.head = 0;\n    } else {  // check AT command response\n      const char *expect = dd->script[dd->script_index];\n      struct mg_queue *q = &ifp->recv_queue;\n      for (;;) {\n        int c;\n        int is_timeout = dd->deadline > 0 && mg_millis() > dd->deadline;\n        int is_overflow = q->head >= q->size - 1;\n        if (is_timeout || is_overflow) {\n          MG_ERROR((\"AT error: %s, retrying...\",\n                    is_timeout ? \"timeout\" : \"overflow\"));\n          mg_ppp_reset(dd);\n          return false;  // FAIL: timeout\n        }\n        if ((c = dd->rx(dd->uart)) < 0) return false;  // no data\n        q->buf[q->head++] = c;\n        if (mg_match(mg_str_n(q->buf, q->head), mg_str(expect), NULL)) {\n          MG_DEBUG((\"recv AT[%d]: %M\", dd->script_index, print_atcmd,\n                    mg_str_n(q->buf, q->head)));\n          dd->script_index++;\n          q->head = 0;\n          break;\n        }\n      }\n    }\n    if (dd->script[dd->script_index] == NULL) {\n      MG_DEBUG((\"finished AT script\"));\n      dd->script_index = -1;\n      return true;\n    }\n  }\n}\n\nstatic bool mg_ppp_init(struct mg_tcpip_if *ifp) {\n  ifp->recv_queue.size = 3000;  // MTU=1500, worst case escaping = 2x\n  return true;\n}\n\n// Calculate FCS/CRC for PPP frames. Could be implemented faster using lookup\n// tables.\nstatic uint32_t fcs_do(uint32_t fcs, uint8_t x) {\n  for (int i = 0; i < 8; i++) {\n    fcs = ((fcs ^ x) & 1) ? (fcs >> 1) ^ 0x8408 : fcs >> 1;\n    x >>= 1;\n  }\n  return fcs;\n}\n\nstatic bool mg_ppp_poll(struct mg_tcpip_if *ifp, bool s1) {\n  (void) s1;\n  return ifp->driver_data != NULL;\n}\n\n// Transmit a single byte as part of the PPP frame (escaped, if needed)\nstatic void mg_ppp_tx_byte(struct mg_tcpip_driver_ppp_data *dd, uint8_t b) {\n  if ((b < 0x20) || (b == MG_PPP_ESC) || (b == MG_PPP_FLAG)) {\n    dd->tx(dd->uart, MG_PPP_ESC);\n    dd->tx(dd->uart, b ^ 0x20);\n  } else {\n    dd->tx(dd->uart, b);\n  }\n}\n\n// Transmit a single PPP frame for the given protocol\nstatic void mg_ppp_tx_frame(struct mg_tcpip_driver_ppp_data *dd, uint16_t proto,\n                            uint8_t *data, size_t datasz) {\n  uint16_t crc;\n  uint32_t fcs = 0xffff;\n\n  dd->tx(dd->uart, MG_PPP_FLAG);\n  mg_ppp_tx_byte(dd, MG_PPP_ADDR);\n  mg_ppp_tx_byte(dd, MG_PPP_CTRL);\n  mg_ppp_tx_byte(dd, proto >> 8);\n  mg_ppp_tx_byte(dd, proto & 0xff);\n  fcs = fcs_do(fcs, MG_PPP_ADDR);\n  fcs = fcs_do(fcs, MG_PPP_CTRL);\n  fcs = fcs_do(fcs, proto >> 8);\n  fcs = fcs_do(fcs, proto & 0xff);\n  for (unsigned int i = 0; i < datasz; i++) {\n    mg_ppp_tx_byte(dd, data[i]);\n    fcs = fcs_do(fcs, data[i]);\n  }\n  crc = fcs & 0xffff;\n  mg_ppp_tx_byte(dd, ~crc);  // send CRC, note the byte order\n  mg_ppp_tx_byte(dd, ~crc >> 8);\n  dd->tx(dd->uart, MG_PPP_FLAG);  // end of frame\n}\n\n// Send Ethernet frame as PPP frame\nstatic size_t mg_ppp_tx(const void *buf, size_t len, struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_ppp_data *dd =\n      (struct mg_tcpip_driver_ppp_data *) ifp->driver_data;\n  if (ifp->state != MG_TCPIP_STATE_READY) return 0;\n  // XXX: what if not an IP protocol?\n  mg_ppp_tx_frame(dd, MG_PPP_PROTO_IP, (uint8_t *) buf + 14, len - 14);\n  return len;\n}\n\n// Given a full PPP frame, unescape it in place and verify FCS, returns actual\n// data size on success or 0 on error.\nstatic size_t mg_ppp_verify_frame(uint8_t *buf, size_t bufsz) {\n  int unpack = 0;\n  uint16_t crc;\n  size_t pktsz = 0;\n  uint32_t fcs = 0xffff;\n  for (unsigned int i = 0; i < bufsz; i++) {\n    if (unpack == 0) {\n      if (buf[i] == 0x7d) {\n        unpack = 1;\n      } else {\n        buf[pktsz] = buf[i];\n        fcs = fcs_do(fcs, buf[pktsz]);\n        pktsz++;\n      }\n    } else {\n      unpack = 0;\n      buf[pktsz] = buf[i] ^ 0x20;\n      fcs = fcs_do(fcs, buf[pktsz]);\n      pktsz++;\n    }\n  }\n  crc = fcs & 0xffff;\n  if (crc != 0xf0b8) {\n    MG_DEBUG((\"bad crc: %04x\", crc));\n    return 0;\n  }\n  if (pktsz < 6 || buf[0] != MG_PPP_ADDR || buf[1] != MG_PPP_CTRL) {\n    return 0;\n  }\n  return pktsz - 2;  // strip FCS\n}\n\n// fetch as much data as we can, until a single PPP frame is received\nstatic size_t mg_ppp_rx_frame(struct mg_tcpip_driver_ppp_data *dd,\n                              struct mg_queue *q) {\n  while (q->head < q->size) {\n    int c;\n    if ((c = dd->rx(dd->uart)) < 0) {\n      return 0;\n    }\n    if (c == MG_PPP_FLAG) {\n      if (q->head > 0) {\n        break;\n      } else {\n        continue;\n      }\n    }\n    q->buf[q->head++] = c;\n  }\n\n  size_t n = mg_ppp_verify_frame((uint8_t *) q->buf, q->head);\n  if (n == 0) {\n    MG_DEBUG((\"invalid PPP frame of %d bytes\", q->head));\n    q->head = 0;\n    return 0;\n  }\n  q->head = n;\n  return q->head;\n}\n\nstatic void mg_ppp_handle_lcp(struct mg_tcpip_if *ifp, uint8_t *lcp,\n                              size_t lcpsz) {\n  uint8_t id;\n  uint16_t len;\n  struct mg_tcpip_driver_ppp_data *dd =\n      (struct mg_tcpip_driver_ppp_data *) ifp->driver_data;\n  if (lcpsz < 4) return;\n  id = lcp[1];\n  len = (((uint16_t) lcp[2]) << 8) | (lcp[3]);\n  switch (lcp[0]) {\n    case MG_PPP_LCP_CFG_REQ: {\n      if (len == 4) {\n        MG_DEBUG((\"LCP config request of %d bytes, acknowledging...\", len));\n        lcp[0] = MG_PPP_LCP_CFG_ACK;\n        mg_ppp_tx_frame(dd, MG_PPP_PROTO_LCP, lcp, len);\n        lcp[0] = MG_PPP_LCP_CFG_REQ;\n        mg_ppp_tx_frame(dd, MG_PPP_PROTO_LCP, lcp, len);\n      } else {\n        MG_DEBUG((\"LCP config request of %d bytes, rejecting...\", len));\n        lcp[0] = MG_PPP_LCP_CFG_REJECT;\n        mg_ppp_tx_frame(dd, MG_PPP_PROTO_LCP, lcp, len);\n      }\n    } break;\n    case MG_PPP_LCP_CFG_TERM_REQ: {\n      uint8_t ack[4] = {MG_PPP_LCP_CFG_TERM_ACK, id, 0, 4};\n      MG_DEBUG((\"LCP termination request, acknowledging...\"));\n      mg_ppp_tx_frame(dd, MG_PPP_PROTO_LCP, ack, sizeof(ack));\n      mg_ppp_reset(dd);\n      ifp->state = MG_TCPIP_STATE_UP;\n      if (dd->reset) dd->reset(dd->uart);\n    } break;\n  }\n}\n\nstatic void mg_ppp_handle_ipcp(struct mg_tcpip_if *ifp, uint8_t *ipcp,\n                               size_t ipcpsz) {\n  struct mg_tcpip_driver_ppp_data *dd =\n      (struct mg_tcpip_driver_ppp_data *) ifp->driver_data;\n  uint16_t len;\n  uint8_t id;\n  uint8_t req[] = {\n      MG_PPP_IPCP_REQ, 0, 0, 10, MG_PPP_IPCP_IPADDR, 6, 0, 0, 0, 0};\n  if (ipcpsz < 4) return;\n  id = ipcp[1];\n  len = (((uint16_t) ipcp[2]) << 8) | (ipcp[3]);\n  switch (ipcp[0]) {\n    case MG_PPP_IPCP_REQ:\n      MG_DEBUG((\"got IPCP config request, acknowledging...\"));\n      if (len >= 10 && ipcp[4] == MG_PPP_IPCP_IPADDR) {\n        uint8_t *ip = ipcp + 6;\n        MG_DEBUG((\"host ip: %d.%d.%d.%d\", ip[0], ip[1], ip[2], ip[3]));\n      }\n      ipcp[0] = MG_PPP_IPCP_ACK;\n      mg_ppp_tx_frame(dd, MG_PPP_PROTO_IPCP, ipcp, len);\n      req[1] = id;\n      // Request IP address 0.0.0.0\n      mg_ppp_tx_frame(dd, MG_PPP_PROTO_IPCP, req, sizeof(req));\n      break;\n    case MG_PPP_IPCP_ACK:\n      // This usually does not happen, as our \"preferred\" IP address is invalid\n      MG_DEBUG((\"got IPCP config ack, link is online now\"));\n      ifp->state = MG_TCPIP_STATE_READY;\n      break;\n    case MG_PPP_IPCP_NACK:\n      MG_DEBUG((\"got IPCP config nack\"));\n      // NACK contains our \"suggested\" IP address, use it\n      if (len >= 10 && ipcp[4] == MG_PPP_IPCP_IPADDR) {\n        uint8_t *ip = ipcp + 6;\n        MG_DEBUG((\"ipcp ack, ip: %d.%d.%d.%d\", ip[0], ip[1], ip[2], ip[3]));\n        ipcp[0] = MG_PPP_IPCP_REQ;\n        mg_ppp_tx_frame(dd, MG_PPP_PROTO_IPCP, ipcp, len);\n        ifp->ip = ifp->mask = MG_IPV4(ip[0], ip[1], ip[2], ip[3]);\n        ifp->state = MG_TCPIP_STATE_READY;\n      }\n      break;\n  }\n}\n\nstatic size_t mg_ppp_rx(void *ethbuf, size_t ethlen, struct mg_tcpip_if *ifp) {\n  uint8_t *eth = ethbuf;\n  size_t ethsz = 0;\n  struct mg_tcpip_driver_ppp_data *dd =\n      (struct mg_tcpip_driver_ppp_data *) ifp->driver_data;\n  uint8_t *buf = (uint8_t *) ifp->recv_queue.buf;\n\n  if (!mg_ppp_atcmd_handle(ifp)) return 0;\n\n  size_t bufsz = mg_ppp_rx_frame(dd, &ifp->recv_queue);\n  if (!bufsz) return 0;\n  uint16_t proto = (((uint16_t) buf[2]) << 8) | (uint16_t) buf[3];\n  switch (proto) {\n    case MG_PPP_PROTO_LCP: mg_ppp_handle_lcp(ifp, buf + 4, bufsz - 4); break;\n    case MG_PPP_PROTO_IPCP: mg_ppp_handle_ipcp(ifp, buf + 4, bufsz - 4); break;\n    case MG_PPP_PROTO_IP:\n      MG_VERBOSE((\"got IP packet of %d bytes\", bufsz - 4));\n      memmove(eth + 14, buf + 4, bufsz - 4);\n      memmove(eth, ifp->mac, 6);\n      memmove(eth + 6, \"\\xff\\xff\\xff\\xff\\xff\\xff\", 6);\n      eth[12] = 0x08;\n      eth[13] = 0x00;\n      ethsz = bufsz - 4 + 14;\n      ifp->recv_queue.head = 0;\n      return ethsz;\n#if 0\n    default:\n      MG_DEBUG((\"unknown PPP frame:\"));\n      mg_hexdump(ppp->buf, ppp->bufsz);\n#endif\n  }\n  ifp->recv_queue.head = 0;\n  return 0;\n  (void) ethlen;\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_ppp = {mg_ppp_init, mg_ppp_tx, mg_ppp_rx,\n                                              mg_ppp_poll};\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/ra.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && \\\n  (defined(MG_ENABLE_DRIVER_RA6) && MG_ENABLE_DRIVER_RA6) || \\\n  (defined(MG_ENABLE_DRIVER_RA8) && MG_ENABLE_DRIVER_RA8)\nstruct ra_etherc {\n  volatile uint32_t ECMR, RESERVED, RFLR, RESERVED1, ECSR, RESERVED2, ECSIPR,\n      RESERVED3, PIR, RESERVED4, PSR, RESERVED5[5], RDMLR, RESERVED6[3], IPGR,\n      APR, MPR, RESERVED7, RFCF, TPAUSER, TPAUSECR, BCFRR, RESERVED8[20], MAHR,\n      RESERVED9, MALR, RESERVED10, TROCR, CDCR, LCCR, CNDCR, RESERVED11, CEFCR,\n      FRECR, TSFRCR, TLFRCR, RFCR, MAFCR;\n};\n\nstruct ra_edmac {\n  volatile uint32_t EDMR, RESERVED, EDTRR, RESERVED1, EDRRR, RESERVED2, TDLAR,\n      RESERVED3, RDLAR, RESERVED4, EESR, RESERVED5, EESIPR, RESERVED6, TRSCER,\n      RESERVED7, RMFCR, RESERVED8, TFTR, RESERVED9, FDR, RESERVED10, RMCR,\n      RESERVED11[2], TFUCR, RFOCR, IOSR, FCFTR, RESERVED12, RPADIR, TRIMD,\n      RESERVED13[18], RBWAR, RDFAR, RESERVED14, TBRAR, TDFAR;\n};\n\n#undef ETHERC\n#undef EDMAC\n#undef RASYSC\n#undef ICU_IELSR\n#if defined(MG_ENABLE_DRIVER_RA8) && MG_ENABLE_DRIVER_RA8\n#define ETHERC ((struct ra_etherc *) (uintptr_t) 0x40354100U)\n#define EDMAC ((struct ra_edmac *) (uintptr_t) 0x40354000U)\n#define RASYSC ((uint32_t *) (uintptr_t) 0x4001E000U)\n#define ICU_IELSR ((uint32_t *) (uintptr_t) 0x4000C300U)\n#else\n#define ETHERC ((struct ra_etherc *) (uintptr_t) 0x40114100U)\n#define EDMAC ((struct ra_edmac *) (uintptr_t) 0x40114000U)\n#define RASYSC ((uint32_t *) (uintptr_t) 0x4001E000U)\n#define ICU_IELSR ((uint32_t *) (uintptr_t) 0x40006300U)\n#endif\n\n#define ETH_PKT_SIZE 1536  // Max frame size, multiple of 32\n#define ETH_DESC_CNT 4     // Descriptors count\n\n// Descriptors: 16-byte aligned\n// Buffers: 32-byte aligned (27.3.1)\nstatic volatile uint32_t s_rxdesc[ETH_DESC_CNT][4] MG_ETH_RAM MG_16BYTE_ALIGNED;\nstatic volatile uint32_t s_txdesc[ETH_DESC_CNT][4] MG_ETH_RAM MG_16BYTE_ALIGNED;\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM MG_32BYTE_ALIGNED;\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM MG_32BYTE_ALIGNED;\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\n\n// fastest is 3 cycles (SUB + BNE) on a 3-stage pipeline or equivalent\nstatic inline void raspin(volatile uint32_t count) {\n  while (count--) (void) 0;\n}\n// count to get the 200ns SMC semi-cycle period (2.5MHz) calling raspin():\n// SYS_FREQUENCY * 200ns / 3 = SYS_FREQUENCY / 15000000\nstatic uint32_t s_smispin;\n\n// Bit-banged SMI\nstatic void smi_preamble(void) {\n  unsigned int i = 32;\n  uint32_t pir = MG_BIT(1) | MG_BIT(2);  // write, mdio = 1, mdc = 0\n  ETHERC->PIR = pir;\n  while (i--) {\n    pir &= ~MG_BIT(0);  // mdc = 0\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n    pir |= MG_BIT(0);  // mdc = 1\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n  }\n}\nstatic void smi_wr(uint16_t header, uint16_t data) {\n  uint32_t word = (header << 16) | data;\n  smi_preamble();\n  unsigned int i = 32;\n  while (i--) {\n    uint32_t pir = MG_BIT(1) |\n                   (word & 0x80000000 ? MG_BIT(2) : 0);  // write, mdc = 0, data\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n    pir |= MG_BIT(0);  // mdc = 1\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n    word <<= 1;\n  }\n}\nstatic uint16_t smi_rd(uint16_t header) {\n  smi_preamble();\n  unsigned int i = 16;  // 2 LSb as turnaround\n  uint32_t pir;\n  while (i--) {\n    pir = (i > 1 ? MG_BIT(1) : 0) |\n          (header & 0x8000\n               ? MG_BIT(2)\n               : 0);  // mdc = 0, header, set read direction at turnaround\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n    pir |= MG_BIT(0);  // mdc = 1\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n    header <<= 1;\n  }\n  i = 16;\n  uint16_t data = 0;\n  while (i--) {\n    data <<= 1;\n    pir = 0;  // read, mdc = 0\n    ETHERC->PIR = pir;\n    raspin(s_smispin / 2);  // 1/4 clock period, 300ns max access time\n    data |= (uint16_t) (ETHERC->PIR & MG_BIT(3) ? 1 : 0);  // read mdio\n    raspin(s_smispin / 2);                                 // 1/4 clock period\n    pir |= MG_BIT(0);                                      // mdc = 1\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n  }\n  return data;\n}\n\nstatic uint16_t raeth_read_phy(uint8_t addr, uint8_t reg) {\n  return smi_rd(\n      (uint16_t) ((1 << 14) | (2 << 12) | (addr << 7) | (reg << 2) | (2 << 0)));\n}\n\nstatic void raeth_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  smi_wr(\n      (uint16_t) ((1 << 14) | (1 << 12) | (addr << 7) | (reg << 2) | (2 << 0)),\n      val);\n}\n\n// MDC clock is generated manually; as per 802.3, it must not exceed 2.5MHz\nstatic bool mg_tcpip_driver_ra_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_ra_data *d =\n      (struct mg_tcpip_driver_ra_data *) ifp->driver_data;\n  s_ifp = ifp;\n\n  // Init SMI clock timing. If user told us the clock value, use it.\n  // TODO(): Otherwise, guess\n  s_smispin = d->clock / 15000000;\n\n  // Init RX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i][0] = MG_BIT(31);             // RACT\n    s_rxdesc[i][1] = ETH_PKT_SIZE << 16;     // RBL\n    s_rxdesc[i][2] = (uint32_t) s_rxbuf[i];  // Point to data buffer\n  }\n  s_rxdesc[ETH_DESC_CNT - 1][0] |= MG_BIT(30);  // Wrap last descriptor\n\n  // Init TX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    // TACT = 0\n    s_txdesc[i][2] = (uint32_t) s_txbuf[i];\n  }\n  s_txdesc[ETH_DESC_CNT - 1][0] |= MG_BIT(30);  // Wrap last descriptor\n\n  EDMAC->EDMR = MG_BIT(0);  // Software reset, wait 64 PCLKA clocks (27.2.1)\n  uint32_t sckdivcr = RASYSC[8];  // get divisors from SCKDIVCR (8.2.2)\n  uint32_t ick = 1 << ((sckdivcr >> 24) & 7);   // sys_clock div\n  uint32_t pcka = 1 << ((sckdivcr >> 12) & 7);  // pclka div\n  raspin((64U * pcka) / (3U * ick));\n  EDMAC->EDMR = MG_BIT(6);  // Initialize, little-endian (27.2.1)\n\n  MG_DEBUG((\"PHY addr: %d, smispin: %d\", d->phy_addr, s_smispin));\n  struct mg_phy phy = {raeth_read_phy, raeth_write_phy};\n  mg_phy_init(&phy, d->phy_addr, MG_PHY_CLOCKS_MAC);\n\n  // Select RMII mode,\n  ETHERC->ECMR = MG_BIT(2) | MG_BIT(1);  // 100M, Full-duplex, CRC\n  // ETHERC->ECMR |= MG_BIT(0);             // Receive all\n  ETHERC->RFLR = 1518;  // Set max rx length\n\n  EDMAC->RDLAR = (uint32_t) (uintptr_t) s_rxdesc;\n  EDMAC->TDLAR = (uint32_t) (uintptr_t) s_txdesc;\n  // MAC address filtering (bytes in reversed order)\n  ETHERC->MAHR = (uint32_t) (ifp->mac[0] << 24U) |\n                 ((uint32_t) ifp->mac[1] << 16U) |\n                 ((uint32_t) ifp->mac[2] << 8U) | ifp->mac[3];\n  ETHERC->MALR = ((uint32_t) ifp->mac[4] << 8U) | ifp->mac[5];\n\n  EDMAC->TFTR = 0;                        // Store and forward (27.2.10)\n  EDMAC->FDR = 0x070f;                    // (27.2.11)\n  EDMAC->RMCR = MG_BIT(0);                // (27.2.12)\n  ETHERC->ECMR |= MG_BIT(6) | MG_BIT(5);  // TE RE\n  EDMAC->EESIPR = MG_BIT(18);  // FR: Enable Rx (frame) IRQ\n  EDMAC->EDRRR = MG_BIT(0);  // Receive Descriptors have changed\n  EDMAC->EDTRR = MG_BIT(0);  // Transmit Descriptors have changed\n  return true;\n}\n\n// Transmit frame\nstatic size_t mg_tcpip_driver_ra_tx(const void *buf, size_t len,\n                                    struct mg_tcpip_if *ifp) {\n  static int s_txno;  // Current descriptor index\n  if (len > sizeof(s_txbuf[ETH_DESC_CNT])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = (size_t) -1;  // fail\n  } else if ((s_txdesc[s_txno][0] & MG_BIT(31))) {\n    ifp->nerr++;\n    MG_ERROR((\"No descriptors available\"));\n    len = 0;  // retry later\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);            // Copy data\n    s_txdesc[s_txno][1] = len << 16;              // Set data len\n    s_txdesc[s_txno][0] |= MG_BIT(31) | 3 << 28;  // (27.3.1.1) mark valid\n    EDMAC->EDTRR = MG_BIT(0);                     // Transmit request\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n  return len;\n}\n\nstatic bool mg_tcpip_driver_ra_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    EDMAC->EESIPR = MG_BIT(18) | MG_BIT(7);  // FR, RMAF: Frame and mcast IRQ\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  struct mg_tcpip_driver_ra_data *d =\n      (struct mg_tcpip_driver_ra_data *) ifp->driver_data;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {raeth_read_phy, raeth_write_phy};\n  up = mg_phy_up(&phy, d->phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    // tmp = reg with flags set to the most likely situation: 100M full-duplex\n    // if(link is slow or half) set flags otherwise\n    // reg = tmp\n    uint32_t ecmr = ETHERC->ECMR | MG_BIT(2) | MG_BIT(1);  // 100M Full-duplex\n    if (speed == MG_PHY_SPEED_10M) ecmr &= ~MG_BIT(2);     // 10M\n    if (full_duplex == false) ecmr &= ~MG_BIT(1);          // Half-duplex\n    ETHERC->ECMR = ecmr;  // IRQ handler does not fiddle with these registers\n    MG_DEBUG((\"Link is %uM %s-duplex\", ecmr & MG_BIT(2) ? 100 : 10,\n              ecmr & MG_BIT(1) ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\nvoid EDMAC_IRQHandler(void);\nstatic uint32_t s_rxno;\nvoid EDMAC_IRQHandler(void) {\n  struct mg_tcpip_driver_ra_data *d =\n      (struct mg_tcpip_driver_ra_data *) s_ifp->driver_data;\n  EDMAC->EESR = MG_BIT(18) | MG_BIT(7);  // Ack IRQ in EDMAC 1st\n  ICU_IELSR[d->irqno] &= ~MG_BIT(16);  // Ack IRQ in ICU last\n  // Frame received, loop\n  for (uint32_t i = 0; i < 10; i++) {  // read as they arrive but not forever\n    uint32_t r = s_rxdesc[s_rxno][0];\n    if (r & MG_BIT(31)) break;  // exit when done\n    // skip partial/errored frames (27.3.1.2)\n    if ((r & (MG_BIT(29) | MG_BIT(28)) && !(r & MG_BIT(27)))) {\n      size_t len = s_rxdesc[s_rxno][1] & 0xffff;\n      mg_tcpip_qwrite(s_rxbuf[s_rxno], len, s_ifp);  // CRC already stripped\n    }\n    s_rxdesc[s_rxno][0] |= MG_BIT(31);\n    if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n  }\n  EDMAC->EDRRR = MG_BIT(0);  // Receive Descriptors have changed\n  // If b0 == 0, descriptors were exhausted and probably frames were dropped,\n  // (27.2.9 RMFCR counts them)\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_ra = {mg_tcpip_driver_ra_init,\n                                             mg_tcpip_driver_ra_tx, NULL,\n                                             mg_tcpip_driver_ra_poll};\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/rw612.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_RW612) && MG_ENABLE_DRIVER_RW612\n\nstruct ENET_Type {\n  volatile uint32_t RESERVED_0[1], EIR, EIMR, RESERVED_1[1], RDAR, TDAR,\n      RESERVED_2[3], ECR, RESERVED_3[6], MMFR, MSCR, RESERVED_4[7], MIBC,\n      RESERVED_5[7], RCR, RESERVED_6[15], TCR, RESERVED_7[7], PALR, PAUR, OPD,\n      TXIC[1], RESERVED_8[3], RXIC[1], RESERVED_9[5], IAUR, IALR, GAUR, GALR,\n      RESERVED_10[7], TFWR, RESERVED_11[14], RDSR, TDSR, MRBR, RESERVED_12[1],\n      RSFL, RSEM, RAEM, RAFL, TSEM, TAEM, TAFL, TIPG, FTRL, RESERVED_13[3],\n      TACC, RACC, RESERVED_14[15], RMON_T_PACKETS, RMON_T_BC_PKT, RMON_T_MC_PKT,\n      RMON_T_CRC_ALIGN, RMON_T_UNDERSIZE, RMON_T_OVERSIZE, RMON_T_FRAG,\n      RMON_T_JAB, RMON_T_COL, RMON_T_P64, RMON_T_P65TO127, RMON_T_P128TO255,\n      RMON_T_P256TO511, RMON_T_P512TO1023, RMON_T_P1024TO2047, RMON_T_P_GTE2048,\n      RMON_T_OCTETS, IEEE_T_DROP, IEEE_T_FRAME_OK, IEEE_T_1COL, IEEE_T_MCOL,\n      IEEE_T_DEF, IEEE_T_LCOL, IEEE_T_EXCOL, IEEE_T_MACERR, IEEE_T_CSERR,\n      IEEE_T_SQE, IEEE_T_FDXFC, IEEE_T_OCTETS_OK, RESERVED_15[3],\n      RMON_R_PACKETS, RMON_R_BC_PKT, RMON_R_MC_PKT, RMON_R_CRC_ALIGN,\n      RMON_R_UNDERSIZE, RMON_R_OVERSIZE, RMON_R_FRAG, RMON_R_JAB,\n      RESERVED_16[1], RMON_R_P64, RMON_R_P65TO127, RMON_R_P128TO255,\n      RMON_R_P256TO511, RMON_R_P512TO1023, RMON_R_P1024TO2047, RMON_R_P_GTE2048,\n      RMON_R_OCTETS, IEEE_R_DROP, IEEE_R_FRAME_OK, IEEE_R_CRC, IEEE_R_ALIGN,\n      IEEE_R_MACERR, IEEE_R_FDXFC, IEEE_R_OCTETS_OK, RESERVED_17[71], ATCR,\n      ATVR, ATOFF, ATPER, ATCOR, ATINC, ATSTMP, RESERVED_18[122], TGSR,\n      CHANNEL_TCSR[4], CHANNEL_TCCR[4];\n};\n\n#undef ENET\n#define ENET ((struct ENET_Type *) 0x40138000)\n\n#define ETH_PKT_SIZE 1536  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 2           // Descriptor size (words)\n\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM MG_8BYTE_ALIGNED;\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM MG_8BYTE_ALIGNED;\nstatic uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS] MG_ETH_RAM MG_8BYTE_ALIGNED;\nstatic uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS] MG_ETH_RAM MG_8BYTE_ALIGNED;\nstatic uint8_t s_txno;  // Current TX descriptor\nstatic uint8_t s_rxno;  // Current RX descriptor\n\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\n\nstatic uint16_t eth_read_phy(uint8_t addr, uint8_t reg) {\n  ENET->MMFR = MG_BIT(30) |  // Start of frame delimiter\n               MG_BIT(29) |  // Opcode\n               ((addr & 0x1f) << 23) | ((reg & 0x1f) << 18) | MG_BIT(17);\n  while ((ENET->EIR & MG_BIT(23)) == 0) (void) 0;\n  ENET->EIR |= MG_BIT(23);\n  return ENET->MMFR & 0xffff;\n}\n\nstatic void eth_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  ENET->MMFR = MG_BIT(30) |  // Start of frame delimiter\n               MG_BIT(28) |  // Opcode\n               ((addr & 0x1f) << 23) | ((reg & 0x1f) << 18) | MG_BIT(17) | val;\n  while ((ENET->EIR & MG_BIT(23)) == 0) (void) 0;\n  ENET->EIR |= MG_BIT(23);\n}\n\nstatic bool mg_tcpip_driver_rw612_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_rw612_data *d =\n      (struct mg_tcpip_driver_rw612_data *) ifp->driver_data;\n  s_ifp = ifp;\n  ENET->MSCR = ((d->mdc_cr & 0x3f) << 1) | ((d->mdc_holdtime & 7) << 8);\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  mg_phy_init(&phy, d->phy_addr, 0);\n  ENET->ECR |= MG_BIT(0);  // reset ETH\n\n  // initialize descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i][1] = (uint32_t) s_rxbuf[i];\n    s_rxdesc[i][0] = MG_BIT(31);  // OWN\n    if (i == ETH_DESC_CNT - 1) {\n      s_rxdesc[i][0] |= MG_BIT(29);  // mark last descriptor\n    }\n    s_txdesc[i][1] = (uint32_t) s_txbuf[i];\n    if (i == ETH_DESC_CNT - 1) {\n      s_txdesc[i][0] |= MG_BIT(29);  // mark last descriptor\n    }\n  }\n\n  ENET->RCR = (ENET->RCR & (0xffff << 16)) | MG_BIT(14) | MG_BIT(8) | MG_BIT(2);\n  ENET->TCR = MG_BIT(2);  // full duplex\n  ENET->TDSR = (uint32_t) &s_txdesc[0][0];\n  ENET->RDSR = (uint32_t) &s_rxdesc[0][0];\n  ENET->MRBR = ETH_PKT_SIZE;\n  ENET->PALR =\n      ifp->mac[0] << 24 | ifp->mac[1] << 16 | ifp->mac[2] << 8 | ifp->mac[3];\n  ENET->PAUR |= (ifp->mac[4] << 24 | ifp->mac[5] << 16);\n  ENET->IALR = 0;\n  ENET->IAUR = 0;\n  ENET->GALR = 0;\n  ENET->GAUR = 0;\n  ENET->MSCR = ((d->mdc_cr & 0x3f) << 1) | ((d->mdc_holdtime & 7) << 8);\n  ENET->EIMR = MG_BIT(25);             // Enable RX interrupt\n  ENET->ECR |= MG_BIT(8) | MG_BIT(1);  // DBSWP, Enable\n  ENET->RDAR = 0;                      // activate RX descriptors ring\n  return true;\n}\n\nstatic size_t mg_tcpip_driver_rw612_tx(const void *buf, size_t len,\n                                       struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // Frame is too big\n  } else if (((s_txdesc[s_txno][0] & MG_BIT(31)) != 0)) {\n    ifp->nerr++;\n    MG_ERROR((\"No free descriptors\"));\n    len = 0;  // All descriptors are busy, fail\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);\n    s_txdesc[s_txno][0] = len | MG_BIT(27) | MG_BIT(26);  // last buffer, crc\n    if (s_txno == ETH_DESC_CNT - 1) {\n      s_txdesc[s_txno][0] |= MG_BIT(29);  // wrap\n    }\n    s_txdesc[s_txno][0] |= MG_BIT(31);  // release ownership\n    MG_DSB();\n    ENET->TDAR = 0;\n    // MG_INFO((\"s_txdesc[%d][0]: 0x%x\", s_txno, s_txdesc[s_txno][0]));\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n\n  return len;\n}\n\n\nstatic void mg_tcpip_driver_rw612_update_hash_table(struct mg_tcpip_if *ifp) {\n  // TODO(): read database, rebuild hash table\n  ENET->GAUR = MG_BIT(1); // see imxrt, it reduces to this for mDNS\n  (void) ifp;\n}\n\nstatic bool mg_tcpip_driver_rw612_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    mg_tcpip_driver_rw612_update_hash_table(ifp);\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  struct mg_tcpip_driver_rw612_data *d =\n      (struct mg_tcpip_driver_rw612_data *) ifp->driver_data;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  up = mg_phy_up(&phy, d->phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    // tmp = reg with flags set to the most likely situation: 100M full-duplex\n    // if(link is slow or half) set flags otherwise\n    // reg = tmp\n    if (speed == MG_PHY_SPEED_100M && (ENET->RCR & MG_BIT(9))) {\n      ENET->RCR &= ~MG_BIT(9);\n    } else if (speed == MG_PHY_SPEED_10M && (ENET->RCR & MG_BIT(9)) == 0) {\n      ENET->RCR |= MG_BIT(9);\n    }\n    if (full_duplex && (ENET->TCR & MG_BIT(2)) == 0) {\n      ENET->ECR &= ~MG_BIT(1);\n      ENET->TCR |= MG_BIT(2);\n      ENET->ECR |= MG_BIT(1);\n    } else if (!full_duplex && (ENET->TCR & MG_BIT(2))) {\n      ENET->ECR &= ~MG_BIT(1);\n      ENET->TCR &= ~MG_BIT(2);\n      ENET->ECR |= MG_BIT(1);\n    }\n    MG_INFO((\"Link is %uM %s-duplex\",\n             speed == MG_PHY_SPEED_10M\n                 ? 10\n                 : (speed == MG_PHY_SPEED_100M ? 100 : 1000),\n             full_duplex ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\nvoid ENET_IRQHandler(void) {\n  if (ENET->EIR & MG_BIT(25)) {\n    ENET->EIR = MG_BIT(25);              // Ack RX\n    for (uint32_t i = 0; i < 10; i++) {  // read as they arrive but not forever\n      if ((s_rxdesc[s_rxno][0] & MG_BIT(31)) != 0) break;  // exit when done\n      // skip partial/errored frames\n      if ((s_rxdesc[s_rxno][0] & MG_BIT(27)) &&\n          !(s_rxdesc[s_rxno][0] &\n            (MG_BIT(21) | MG_BIT(20) | MG_BIT(18) | MG_BIT(17) | MG_BIT(16)))) {\n        size_t len = s_rxdesc[s_rxno][0] & 0xffff;\n        mg_tcpip_qwrite(s_rxbuf[s_rxno], len, s_ifp);\n        s_rxdesc[s_rxno][0] |= MG_BIT(31);  // OWN bit: handle control to DMA\n        MG_DSB();\n        ENET->RDAR = 0;\n        if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n      }\n    }\n  }\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_rw612 = {mg_tcpip_driver_rw612_init,\n                                                mg_tcpip_driver_rw612_tx, NULL,\n                                                mg_tcpip_driver_rw612_poll};\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/same54.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_SAME54) && \\\n    MG_ENABLE_DRIVER_SAME54\n\nstruct GMAC_REGS_ {\n  uint32_t GMAC_NCR, GMAC_NCFGR, GMAC_NSR, GMAC_UR, GMAC_DCFGR, GMAC_TSR,\n      GMAC_RBQB, GMAC_TBQB, GMAC_RSR, GMAC_ISR, GMAC_IER, GMAC_IDR, GMAC_IMR,\n      GMAC_MAN, GMAC_RPQ, GMAC_TPQ, GMAC_TPSF, GMAC_RPSF, GMAC_RJFML,\n      Reserved1[13], GMAC_HRB, GMAC_HRT, GMAC_SAB0, GMAC_SAT0, GMAC_SAB1,\n      GMAC_SAT1, GMAC_SAB2, GMAC_SAT2, GMAC_SAB3, GMAC_SAT3, GMAC_TIDM[4],\n      GMAC_WOL, GMAC_IPGS, GMAC_SVLAN, GMAC_TPFCP, GMAC_SAMB1, GMAC_SAMT1,\n      Reserved2[3], GMAC_NSC, GMAC_SCL, GMAC_SCH, GMAC_EFTSH, GMAC_EFRSH,\n      GMAC_PEFTSH, GMAC_PEFRSH, Reserved3[2], GMAC_OTLO, GMAC_OTHI, GMAC_FT,\n      GMAC_BCFT, GMAC_MFT, GMAC_PFT, GMAC_BFT64, GMAC_TBFT127, GMAC_TBFT255,\n      GMAC_TBFT511, GMAC_TBFT1023, GMAC_TBFT1518, GMAC_GTBFT1518, GMAC_TUR,\n      GMAC_SCF, GMAC_MCF, GMAC_EC, GMAC_LC, GMAC_DTF, GMAC_CSE, GMAC_ORLO,\n      GMAC_ORHI, GMAC_FR, GMAC_BCFR, GMAC_MFR, GMAC_PFR, GMAC_BFR64,\n      GMAC_TBFR127, GMAC_TBFR255, GMAC_TBFR511, GMAC_TBFR1023, GMAC_TBFR1518,\n      GMAC_TMXBFR, GMAC_UFR, GMAC_OFR, GMAC_JR, GMAC_FCSE, GMAC_LFFE, GMAC_RSE,\n      GMAC_AE, GMAC_RRE, GMAC_ROE, GMAC_IHCE, GMAC_TCE, GMAC_UCE, Reserved4[2],\n      GMAC_TISUBN, GMAC_TSH, Reserved5, GMAC_TSSSL, GMAC_TSSN, GMAC_TSL,\n      GMAC_TN, GMAC_TA, GMAC_TI, GMAC_EFTSL, GMAC_EFTN, GMAC_EFRSL, GMAC_EFRN,\n      GMAC_PEFTSL, GMAC_PEFTN, GMAC_PEFRSL, GMAC_PEFRN, Reserved6[28],\n      GMAC_RLPITR, GMAC_RLPITI, GMAC_TLPITR, GMAC_TLPITI;\n};\n\nstruct GCLK_REGS_ {\n  uint32_t GCLK_CTRLA_RESERVED, GCLK_SYNCBUSY, Reserved2[6], GCLK_GENCTRL[12],\n      Reserved3[12], GCLK_PCHCTRL[48];\n};\n\n#define GMAC_REGS ((struct GMAC_REGS_ *) 0x42000800)\n#define GCLK_REGS ((struct GCLK_REGS_ *) 0x40001c00)\n\n#define ETH_PKT_SIZE 1536  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 2           // Descriptor size (words)\n\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE];\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE];\nstatic uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS];  // RX descriptors\nstatic uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS];  // TX descriptors\nstatic uint8_t s_txno;                           // Current TX descriptor\nstatic uint8_t s_rxno;                           // Current RX descriptor\n\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\n\nstatic uint16_t eth_read_phy(uint8_t addr, uint8_t reg) {\n  GMAC_REGS->GMAC_MAN = MG_BIT(30) |  // Clause 22\n                        MG_BIT(29) |  // Setting the read operation\n                        MG_BIT(17) | ((addr & 0x1f) << 23) |  // PHY address\n                        ((reg & 0x1f) << 18);  // Setting the register\n  while (!(GMAC_REGS->GMAC_NSR & MG_BIT(2))) (void) 0;\n  return GMAC_REGS->GMAC_MAN & 0xffff;  // Getting the read value\n}\n\nstatic void eth_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  GMAC_REGS->GMAC_MAN = MG_BIT(30) |\n                        MG_BIT(28) |  // Setting the write operation\n                        MG_BIT(17) | ((addr & 0x1f) << 23) |  // PHY address\n                        ((reg & 0x1f) << 18) | val;  // Setting the register\n  while (!(GMAC_REGS->GMAC_NSR & MG_BIT(2)))\n    ;  // Waiting until the write op is complete\n}\n\nuint32_t get_clock_rate(struct mg_tcpip_driver_same54_data *d) {\n  if (d && d->mdc_cr >= 0 && d->mdc_cr <= 5) {\n    return d->mdc_cr;\n  } else {\n    // get MCLK from GCLK_GENERATOR 0\n    uint32_t div = 512;\n    uint32_t mclk;\n    if (!(GCLK_REGS->GCLK_GENCTRL[0] & MG_BIT(12))) {\n      div = ((GCLK_REGS->GCLK_GENCTRL[0] & 0x00FF0000) >> 16);\n      if (div == 0) div = 1;\n    }\n    switch (GCLK_REGS->GCLK_GENCTRL[0] & 0xF) {\n      case 0:               // GCLK_GENCTRL_SRC_XOSC0_Val\n        mclk = 32000000UL;  // 32MHz\n        break;\n      case 1:               // GCLK_GENCTRL_SRC_XOSC1_Val\n        mclk = 32000000UL;  // 32MHz\n        break;\n      case 4:            // GCLK_GENCTRL_SRC_OSCULP32K_Val\n        mclk = 32000UL;  // 32Khz\n        break;\n      case 5:            // GCLK_GENCTRL_SRC_XOSC32K_Val\n        mclk = 32000UL;  // 32Khz\n        break;\n      case 6:               // GCLK_GENCTRL_SRC_DFLL_Val\n        mclk = 48000000UL;  // 48MHz\n        break;\n      case 7:                // GCLK_GENCTRL_SRC_DPLL0_Val:\n        mclk = 200000000UL;  // 200MHz\n        break;\n      case 8:                // GCLK_GENCTRL_SRC_DPLL1_Val\n        mclk = 200000000UL;  // 200MHz\n        break;\n      default:\n        mclk = 200000000UL;  // 200MHz\n    }\n\n    mclk /= div;\n    uint8_t crs[] = {0, 1, 2, 3, 4, 5};            // GMAC->NCFGR::CLK values\n    uint8_t dividers[] = {8, 16, 32, 48, 64, 96};  // Respective CLK dividers\n    for (int i = 0; i < 6; i++) {\n      if (mclk / dividers[i] <= 2375000UL) {  // 2.5MHz - 5%\n        return crs[i];\n      }\n    }\n\n    return 5;\n  }\n}\n\nstatic bool mg_tcpip_driver_same54_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_same54_data *d =\n      (struct mg_tcpip_driver_same54_data *) ifp->driver_data;\n  s_ifp = ifp;\n\n  GMAC_REGS->GMAC_NCFGR = get_clock_rate(d) << 18;  // Set MDC divider\n  GMAC_REGS->GMAC_NCR = 0;                          // Disable RX & TX\n  GMAC_REGS->GMAC_NCR |= MG_BIT(4);                 // Enable MDC & MDIO\n\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  mg_phy_init(&phy, d->phy_addr, 0);\n\n  for (int i = 0; i < ETH_DESC_CNT; i++) {   // Init TX descriptors\n    s_txdesc[i][0] = (uint32_t) s_txbuf[i];  // Point to data buffer\n    s_txdesc[i][1] = MG_BIT(31);             // OWN bit\n  }\n  s_txdesc[ETH_DESC_CNT - 1][1] |= MG_BIT(30);  // Last tx descriptor - wrap\n\n  GMAC_REGS->GMAC_DCFGR = (0x18 << 16) |     // DMA recv buf 1536\n                          (3 << 8) |         // RXBMS\n                          MG_BIT(10);        // See #2487\n  for (int i = 0; i < ETH_DESC_CNT; i++) {   // Init RX descriptors\n    s_rxdesc[i][0] = (uint32_t) s_rxbuf[i];  // Address of the data buffer\n    s_rxdesc[i][1] = 0;                      // Clear status\n  }\n  s_rxdesc[ETH_DESC_CNT - 1][0] |= MG_BIT(1);  // Last rx descriptor - wrap\n\n  GMAC_REGS->GMAC_TBQB = (uint32_t) s_txdesc;  // about the descriptor addresses\n  GMAC_REGS->GMAC_RBQB = (uint32_t) s_rxdesc;  // Let the controller know\n\n  GMAC_REGS->GMAC_SAB0 =\n      MG_U32(ifp->mac[3], ifp->mac[2], ifp->mac[1], ifp->mac[0]);\n  GMAC_REGS->GMAC_SAT0 = MG_U32(0, 0, ifp->mac[5], ifp->mac[4]);\n\n  GMAC_REGS->GMAC_UR &= ~MG_BIT(0);                 // Disable MII, use RMII\n  GMAC_REGS->GMAC_NCFGR |= MG_BIT(8) | MG_BIT(6) |  // MAXFX, MTIHEN\n                           MG_BIT(25) | MG_BIT(4);  // EFRHD, CAF\n  GMAC_REGS->GMAC_TSR = 0x17f;                      // all transmit statuses\n  GMAC_REGS->GMAC_RSR = 0xf;                        // all recv statuses\n  GMAC_REGS->GMAC_IDR = ~0U;  // Disable interrupts, then enable required\n  GMAC_REGS->GMAC_IER = MG_BIT(11) | MG_BIT(10) |  // HRESP, ROVR\n                        MG_BIT(7) | MG_BIT(6) |    // TCOMP, TFC\n                        MG_BIT(5) | MG_BIT(4) |    // RLEX, TUR\n                        MG_BIT(2) | MG_BIT(1);     // RXUBR, RCOMP\n  GMAC_REGS->GMAC_NCR |= MG_BIT(3) | MG_BIT(2);    // TXEN, RXEN\n\n  return true;\n}\n\nstatic size_t mg_tcpip_driver_same54_tx(const void *buf, size_t len,\n                                        struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // Frame is too big\n  } else if ((s_txdesc[s_txno][1] & MG_BIT(31)) == 0) {\n    ifp->nerr++;\n    MG_ERROR((\"No free descriptors\"));\n    len = 0;  // All descriptors are busy, fail\n  } else {\n    uint32_t status = len | MG_BIT(15);  // Frame length, last chunk\n    if (s_txno == ETH_DESC_CNT - 1) status |= MG_BIT(30);  // wrap\n    memcpy(s_txbuf[s_txno], buf, len);                     // Copy data\n    s_txdesc[s_txno][1] = status;\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n  MG_DSB();                          // Ensure descriptors have been written\n  GMAC_REGS->GMAC_NCR |= MG_BIT(9);  // Enable transmission\n  return len;\n}\n\nstatic void mg_tcpip_driver_same54_update_hash_table(struct mg_tcpip_if *ifp) {\n  // TODO(): read database, rebuild hash table\n  // Setting Hash Index for 01:00:5e:00:00:fb (multicast)\n  // 24.6.9 Hash addressing\n  // computed hash is 55, which means bit 23 (55 - 32) in\n  // HRT register must be set\n  GMAC_REGS->GMAC_HRT = MG_BIT(23);\n  GMAC_REGS->GMAC_NCFGR |= MG_BIT(6);  // enable multicast hash filtering\n  (void) ifp;\n}\n\nstatic bool mg_tcpip_driver_same54_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    mg_tcpip_driver_same54_update_hash_table(ifp);\n    ifp->update_mac_hash_table = false;\n  }\n\n  bool up = false;\n  if (s1) {\n    uint8_t speed = MG_PHY_SPEED_10M;\n    bool full_duplex = false;\n    struct mg_phy phy = {eth_read_phy, eth_write_phy};\n    up = mg_phy_up(&phy, 0, &full_duplex, &speed);\n\n    // If PHY is ready, update NCFGR accordingly\n    if (ifp->state == MG_TCPIP_STATE_DOWN && up) {\n      GMAC_REGS->GMAC_NCFGR =\n          (GMAC_REGS->GMAC_NCFGR & ~(MG_BIT(0) | MG_BIT(1))) | (speed & 1) |\n          (full_duplex << 1);\n    }\n  }\n  return up;\n}\n\nvoid GMAC_Handler(void);\nvoid GMAC_Handler(void) {\n  uint32_t isr = GMAC_REGS->GMAC_ISR;\n  uint32_t rsr = GMAC_REGS->GMAC_RSR;\n  uint32_t tsr = GMAC_REGS->GMAC_TSR;\n  if (isr & MG_BIT(1)) {\n    if (rsr & MG_BIT(1)) {\n      for (uint8_t i = 0; i < ETH_DESC_CNT; i++) {\n        if ((s_rxdesc[s_rxno][0] & MG_BIT(0)) == 0) break;\n        size_t len = s_rxdesc[s_rxno][1] & (MG_BIT(13) - 1);\n        mg_tcpip_qwrite(s_rxbuf[s_rxno], len, s_ifp);\n        s_rxdesc[s_rxno][0] &= ~MG_BIT(0);  // Disown\n        if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n      }\n    }\n  }\n\n  if (tsr != 0) {\n    // MG_INFO((\" --> %#x %#x\", s_txdesc[s_txno][1], tsr));\n    if (!(s_txdesc[s_txno][1] & MG_BIT(31))) s_txdesc[s_txno][1] |= MG_BIT(31);\n  }\n\n  GMAC_REGS->GMAC_RSR = rsr;\n  GMAC_REGS->GMAC_TSR = tsr;\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_same54 = {\n    mg_tcpip_driver_same54_init, mg_tcpip_driver_same54_tx, NULL,\n    mg_tcpip_driver_same54_poll};\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/sdio.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && \\\n    (defined(MG_ENABLE_DRIVER_CYW_SDIO) && MG_ENABLE_DRIVER_CYW_SDIO)\n\n// SDIO 6.9 Table 6-1 CCCR (Common Card Control Registers)\n#define MG_SDIO_CCCR_SDIOREV 0x000\n#define MG_SDIO_CCCR_SDREV 0x001\n#define MG_SDIO_CCCR_IOEN 0x002\n#define MG_SDIO_CCCR_IORDY 0x003\n#define MG_SDIO_CCCR_INTEN 0x004\n#define MG_SDIO_CCCR_BIC 0x007\n#define MG_SDIO_CCCR_CCAP 0x008\n#define MG_SDIO_CCCR_CCIS 0x009     // 3 registers\n#define MG_SDIO_CCCR_F0BLKSZ 0x010  // 2 registers\n#define MG_SDIO_CCCR_HISPD 0x013\n// SDIO 6.10 Table 6-3 FBR (Function Basic Registers)\n#define MG_SDIO_FBR_FnBLKSZ(n) (((n) &7) * 0x100 + 0x10)  // 2 registers\n\n// SDIO 5.1 IO_RW_DIRECT Command (CMD52)\n#define MG_SDIO_DATA(x) ((x) &0xFF)            // bits 0-7\n#define MG_SDIO_ADDR(x) (((x) &0x1FFFF) << 9)  // bits 9-25\n#define MG_SDIO_FUNC(x) (((x) &3) << 28)       // bits 28-30 (30 unused here)\n#define MG_SDIO_WR MG_BIT(31)\n\n// SDIO 5.3 IO_RW_EXTENDED Command (CMD53)\n#define MG_SDIO_LEN(x) ((x) &0x1FF)  // bits 0-8\n#define MG_SDIO_OPINC MG_BIT(26)\n#define MG_SDIO_BLKMODE MG_BIT(27)\n\n// - Drivers set blocksize, drivers request transfers. Requesting a read\n// transfer > blocksize means block transfer will be used.\n// - To simplify the use of DMA transfers and avoid intermediate buffers,\n// drivers must have room to accomodate a whole block transfer, e.g.: blocksize\n// = 64, read 65 => 2 blocks = 128 bytes\n// - Transfers of more than 1 byte assume (uint32_t *) data. 1-byte transfers\n// use (uint8_t *) data\n// - 'len' is the number of _bytes_ to transfer\nbool mg_sdio_transfer(struct mg_tcpip_sdio *sdio, bool write, unsigned int f,\n                      uint32_t addr, void *data, uint32_t len) {\n  uint32_t arg, val = 0;\n  unsigned int blksz = 64;  // TODO(): mg_sdio_set_blksz() stores in an array,\n                            // index on f, skip if 0\n  if (len == 1) {\n    arg = (write ? MG_SDIO_WR : 0) | MG_SDIO_FUNC(f) | MG_SDIO_ADDR(addr) |\n          (write ? MG_SDIO_DATA(*(uint8_t *) data) : 0);\n    bool res = sdio->txn(sdio, 52, arg, &val);  // IO_RW_DIRECT\n    if (!write) *(uint8_t *) data = (uint8_t) val;\n    return res;\n  }\n  // IO_RW_EXTENDED\n  arg = (write ? MG_SDIO_WR : 0) | MG_SDIO_OPINC | MG_SDIO_FUNC(f) |\n        MG_SDIO_ADDR(addr);\n  if (len > 512 || (blksz != 0 && len > blksz)) {  // SDIO 5.3 512 -> len=0\n    unsigned int blkcnt;\n    if (blksz == 0) return false;  // > 512 requires block size set\n    blkcnt = (len + blksz - 1) / blksz;\n    if (blkcnt > 511) return false;  // we don't support \"infinite\" blocks\n    arg |= MG_SDIO_BLKMODE | MG_SDIO_LEN(blkcnt);  // block transfer\n    len = blksz * blkcnt;\n  } else {\n    arg |= MG_SDIO_LEN(len);  // multi-byte transfer\n  }\n  return sdio->xfr(sdio, write, arg,\n                   (arg & MG_SDIO_BLKMODE) ? (uint16_t) blksz : 0,\n                   (uint32_t *) data, len, &val);\n}\n\nbool mg_sdio_set_blksz(struct mg_tcpip_sdio *sdio, unsigned int f,\n                       uint16_t blksz) {\n  uint32_t val = blksz & 0xff;\n  if (!mg_sdio_transfer(sdio, true, 0, MG_SDIO_FBR_FnBLKSZ(f), &val, 1))\n    return false;\n  val = (blksz >> 8) & 0x0f;  // SDIO 6.10 Table 6-4, max 2048\n  if (!mg_sdio_transfer(sdio, true, 0, MG_SDIO_FBR_FnBLKSZ(f) + 1, &val, 1))\n    return false;\n  // TODO(): store in an array, index on f. Static 8-element array\n  MG_VERBOSE((\"F%c block size set\", (f & 7) + '0'));\n  return true;\n}\n\n// Enable Fx\nbool mg_sdio_enable_f(struct mg_tcpip_sdio *sdio, unsigned int f) {\n  uint8_t bit = 1U << (f & 7), bits;\n  uint32_t val = 0;\n  if (!mg_sdio_transfer(sdio, false, 0, MG_SDIO_CCCR_IOEN, &val, 1))\n    return false;\n  bits = (uint8_t) val | bit;\n  unsigned int times = 501;\n  while (times--) {\n    val = bits; /* IOEf */\n    ;\n    if (!mg_sdio_transfer(sdio, true, 0, MG_SDIO_CCCR_IOEN, &val, 1))\n      return false;\n    mg_delayms(1);\n    val = 0;\n    if (!mg_sdio_transfer(sdio, false, 0, MG_SDIO_CCCR_IOEN, &val, 1))\n      return false;\n    if (val & bit) break;\n  }\n  if (times == (unsigned int) ~0) return false;\n  MG_VERBOSE((\"F%c enabled\", (f & 7) + '0'));\n  return true;\n}\n\n// Wait for Fx to be ready\nbool mg_sdio_waitready_f(struct mg_tcpip_sdio *sdio, unsigned int f) {\n  uint8_t bit = 1U << (f & 7);\n  unsigned int times = 501;\n  while (times--) {\n    uint32_t val;\n    if (!mg_sdio_transfer(sdio, false, 0, MG_SDIO_CCCR_IORDY, &val, 1))\n      return false;\n    if (val & bit) break;  // IORf\n    mg_delayms(1);\n  }\n  if (times == (unsigned int) ~0) return false;\n  MG_VERBOSE((\"F%c ready\", (f & 7) + '0'));\n  return true;\n}\n\n// SDIO 6.14 Bus State Diagram\nbool mg_sdio_init(struct mg_tcpip_sdio *sdio) {\n  uint32_t val = 0;\n  if (!sdio->txn(sdio, 0, 0, NULL)) return false;  // GO_IDLE_STATE\n  sdio->txn(sdio, 5, 0, &val);                     // IO_SEND_OP_COND, no CRC\n  MG_VERBOSE((\"IO Functions: %u, Memory: %c\", 1 + ((val >> 28) & 7),\n              (val & MG_BIT(27)) ? 'Y' : 'N'));\n  if (!sdio->txn(sdio, 3, 0, &val)) return false;  // SEND_RELATIVE_ADDR\n  val = ((uint32_t) val) >> 16;                    // RCA\n  if (!sdio->txn(sdio, 7, val << 16, &val))\n    return false;  // SELECT/DESELECT_CARD\n  mg_sdio_transfer(sdio, false, 0, MG_SDIO_CCCR_SDIOREV, &val, 1);\n  MG_DEBUG((\"CCCR: %u.%u, SDIO: %u.%u\", 1 + ((val >> 2) & 3), (val >> 0) & 3,\n            1 + ((val >> 6) & 3), (val >> 4) & 3));\n  mg_sdio_transfer(sdio, false, 0, MG_SDIO_CCCR_SDREV, &val, 1);\n  MG_VERBOSE((\"SD: %u.%u\", 1 + ((val >> 2) & 3), (val >> 0) & 3));\n  mg_sdio_transfer(sdio, false, 0, MG_SDIO_CCCR_BIC, &val, 1);\n  MG_SET_BITS(val, 3,\n              MG_BIT(7) | MG_BIT(1));  // SDIO 6.9 Tables 6-1 6-2, 4-bit bus\n  mg_sdio_transfer(sdio, true, 0, MG_SDIO_CCCR_BIC, &val, 1);\n  // All Full-Speed SDIO cards support a 4-bit bus. Skip for Low-Speed SDIO\n  // cards, we don't provide separate low-level functions for width and speed\n  sdio->cfg(sdio, 0);  // set DS;\n  if (!mg_sdio_transfer(sdio, false, 0, MG_SDIO_CCCR_HISPD, &val, 1))\n    return false;\n  if (val & MG_BIT(0) /* SHS */) {\n    val = MG_BIT(1); /* EHS */\n    if (!mg_sdio_transfer(sdio, true, 0, MG_SDIO_CCCR_HISPD, &val, 1))\n      return false;\n    sdio->cfg(sdio, 1);  // set HS;\n    MG_VERBOSE((\"Bus set to 4-bit @50MHz\"));\n  } else {\n    MG_VERBOSE((\"Bus set to 4-bit @25MHz\"));\n  }\n  return true;\n}\n\n// - 6.11 Card Information Structure (CIS): 0x0001000-0x017FF; for card common\n// and all functions\n// - 16.5 SDIO Card Metaformat\n// - 16.7.2 CISTPL_FUNCE (0x22): Function Extension Tuple, provides standard\n// information about the card (common) and each individual function. One\n// CISTPL_FUNCE in each function’s CIS, immediately following the CISTPL_FUNCID\n// tuple\n// - 16.7.3 CISTPL_FUNCE Tuple for Function 0 (common)\n// - 16.7.4 CISTPL_FUNCE Tuple for Function 1-7\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/st67w6.c\"\n#endif\n\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_ST67W6) && \\\n    MG_ENABLE_DRIVER_ST67W6\n\nstatic struct mg_tcpip_if *s_ifp;\nstatic uint32_t s_ip, s_mask;\nstatic bool s_link = false, s_connecting = false;\n\nstatic void wifi_cb(struct mg_tcpip_if *ifp, int ev, void *ev_data) {\n  struct mg_wifi_data *wifi =\n      &((struct mg_tcpip_driver_st67w6_data *) ifp->driver_data)->wifi;\n  if (wifi->apmode && ev == MG_TCPIP_EV_ST_CHG &&\n      *(uint8_t *) ev_data == MG_TCPIP_STATE_UP) {\n    MG_DEBUG((\"Access Point started\"));\n    s_ip = ifp->ip, ifp->ip = wifi->apip;\n    s_mask = ifp->mask, ifp->mask = wifi->apmask;\n    ifp->enable_dhcp_client = false;\n    ifp->enable_dhcp_server = true;\n  }\n}\n\nstatic bool st67w6_init(uint8_t *mac);\nstatic void st67w6_poll(bool is_at);\n\nstatic bool mg_tcpip_driver_st67w6_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_st67w6_data *d =\n      (struct mg_tcpip_driver_st67w6_data *) ifp->driver_data;\n  struct mg_wifi_data *wifi = &d->wifi;\n  if (MG_BIG_ENDIAN) {\n    MG_ERROR((\"Big-endian host\"));\n    return false;\n  }\n  if (d->is_ready == NULL) return false;\n  s_ifp = ifp;\n  s_ip = ifp->ip;\n  s_mask = ifp->mask;\n  s_link = false;\n  ifp->pfn = wifi_cb;\n  if (!st67w6_init(ifp->mac)) return false;\n\n  if (d->send_queue.size == 0) d->send_queue.size = 8192;\n  d->send_queue.buf = (char *) mg_calloc(1, d->send_queue.size);\n  if (d->send_queue.buf == NULL) {\n    MG_ERROR((\"OOM\"));\n    return false;\n  }\n\n  if (wifi->apmode) {\n    return mg_wifi_ap_start(wifi);\n  } else if (wifi->ssid != NULL && wifi->pass != NULL) {\n    return mg_wifi_connect(wifi);\n  }\n  return true;\n}\n\n// Decouple; module access depends on it being RDY. See st67w6_poll()\nsize_t mg_tcpip_driver_st67w6_output(const void *buf, size_t len,\n                                     struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_st67w6_data *d =\n      (struct mg_tcpip_driver_st67w6_data *) ifp->driver_data;\n  char *p;\n  if (mg_queue_book(&d->send_queue, &p, len) < len) return 0;\n  memcpy(p, buf, len);\n  mg_queue_add(&d->send_queue, len);\n  return len;\n}\n\nstatic bool mg_tcpip_driver_st67w6_poll(struct mg_tcpip_if *ifp, bool s1) {\n  struct mg_tcpip_driver_st67w6_data *d =\n      (struct mg_tcpip_driver_st67w6_data *) ifp->driver_data;\n  if (d->is_ready == NULL) return false;\n  st67w6_poll(false);\n  if (!s1) return false;\n  return s_link;\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_st67w6 = {\n    mg_tcpip_driver_st67w6_init, mg_tcpip_driver_st67w6_output, NULL,\n    mg_tcpip_driver_st67w6_poll};\n\n//  AT | STA | AP | HCI | OT\n// --------------------------\n//       framing             <-- includes rx stall indication\n// --------------------------\n//         SPI               <-- padded to 32-bit\n//\n// Transactions take place when the module signals RDY, 'tx' and 'write'\n// functions actually just write to memory\n// - AT: handles configuration and events (unsolicited +foo:). Responses may\n// come as:\n//   - 1 frame: just OK or ERROR\n//   - 2 frames: 1 text line each, a response and OK\n//   - 3 frames: 2 text lines: 1 frame with text and no CR/LF, 1 frame with\n//   binary and CR/LF, 1 text line with OK\n// - STA and AP contain plain Ethernet frames to/from the STA and AP networks,\n// respectively\n// - HCI: BLE stuff\n// - OT: ?\n\n#pragma pack(push, 1)\n// little endian\n\nstruct spi_hdr {\n  uint16_t magic;\n  uint16_t len;\n  uint8_t vflags;  // version :2, rx_stall :1, flags :5\n  uint8_t type;\n  uint16_t reserved;\n};\n\n#define ST67W6_SPI_TYPE_AT 0\n#define ST67W6_SPI_TYPE_STA 1\n#define ST67W6_SPI_TYPE_AP 2\n#define ST67W6_SPI_TYPE_HCI 3\n#define ST67W6_SPI_TYPE_OT 4\n\n#pragma pack(pop)\n\nstatic uint32_t txdata[2048 / 4], rxdata[2048 / 4];\nstatic uint8_t at_resp[300];\n\nstatic bool s_at_ok, s_at_err;\nstatic size_t s_at_resp_len;\nstatic void st67w6_handle_wifi_evnt(char *, size_t len);\nstatic void st67w6_handle_scan_result(char *, size_t len);\n\nstatic size_t st67w6_spi_poll(uint8_t *write, uint8_t *read);\nstatic void st67w6_write(unsigned int f, void *data, uint16_t len);\nstatic void st67w6_update_hash_table(void);\n\n// High-level comm stuff\n\nstatic void st67w6_poll(bool is_at) {\n  struct mg_tcpip_driver_st67w6_data *d =\n      (struct mg_tcpip_driver_st67w6_data *) s_ifp->driver_data;\n  struct spi_hdr *h = (struct spi_hdr *) rxdata;\n  unsigned int type;\n  uint8_t *txsource = (uint8_t *) txdata;\n  if (s_ifp->update_mac_hash_table) {\n    // first call to _poll() is after _init(), so this is safe\n    st67w6_update_hash_table();\n    s_ifp->update_mac_hash_table = false;\n  }\n  if (!is_at) {  // send outstanding WLAN frames in the queue\n    char *buf;\n    size_t len;\n    // NOTE(): have traffic-dependent queues or queue traffic type with data\n    if ((len = mg_queue_next(&d->send_queue, &buf)) > 0) {\n      st67w6_write(d->wifi.apmode ? ST67W6_SPI_TYPE_AP : ST67W6_SPI_TYPE_STA,\n                   buf, (uint16_t) len);\n      mg_queue_del(&d->send_queue, len);\n    } else {  // nothing to send\n      txsource = NULL;\n    }\n  }\n  if (st67w6_spi_poll(txsource, (uint8_t *) rxdata) == 0) return;\n  if (h->len == 0) return;\n  type = h->type;\n  if (type == ST67W6_SPI_TYPE_AT) {\n    char *p = (char *) (h + 1);\n    size_t len = h->len;\n    if (len > 7 && strncmp(p, \"+CWLAP:\", 7) == 0) {  // scan result\n      st67w6_handle_scan_result(p + 7, len - 7);\n    } else if (len > 4 && strncmp(p, \"+CW:\", 4) == 0) {\n      st67w6_handle_wifi_evnt(p + 4, len - 4);\n    } else {\n      MG_VERBOSE((\"AT partial: %.*s\", (int) len, p));\n      if (s_at_resp_len + len >= sizeof(at_resp))\n        s_at_resp_len = 0;  // truncate response, error will be caught later\n      memcpy(at_resp + s_at_resp_len, p, len);\n      s_at_resp_len += len;\n      if (mg_match(mg_str_n((char *) at_resp, s_at_resp_len),\n                   mg_str_n(\"*ERROR*\", 7), NULL)) {\n        s_at_err = true;\n      } else if (mg_match(mg_str_n((char *) at_resp, s_at_resp_len),\n                          mg_str_n(\"*OK*\", 4), NULL)) {\n        s_at_ok = true;\n      }\n    }\n  } else if (type == ST67W6_SPI_TYPE_STA || type == ST67W6_SPI_TYPE_AP) {\n    // WLAN frame reception\n    mg_tcpip_qwrite(h + 1, h->len, s_ifp);\n  }  // else silently discard\n}\n\n// WLAN event handling\n\n// - Do not call any AT functions here, otherwise revise st67w6_at_wait()\n// - The module likes to send ERROR along with other events\nstatic void st67w6_handle_wifi_evnt(char *p, size_t len) {\n  struct mg_str data[2];\n  MG_VERBOSE((\"event: %.*s\", (int) len, p));\n  if (len > 9 && strncmp(p, \"CONNECTED\", 9) == 0) {\n    s_link = true;\n    s_connecting = false;\n  } else if (len > 12 && strncmp(p, \"DISCONNECTED\", 12) == 0) {\n    s_link = false;\n    s_connecting = false;  // should not be needed\n  } else if (s_connecting && len > 6 &&\n             mg_match(mg_str_n(p, len), mg_str_n(\"ERROR,*\\r\\n*\", 10), data)) {\n    size_t reason = 0;\n    bool ok = mg_to_size_t(data[0], &reason);\n    s_connecting = false;\n    MG_ERROR((\"CONNECT FAILED\"));\n    mg_tcpip_call(s_ifp, MG_TCPIP_EV_WIFI_CONNECT_ERR, ok ? &reason : NULL);\n  } else if (len > 9 && strncmp(p, \"SCAN_DONE\", 9) == 0) {\n    MG_VERBOSE((\"scan complete\"));\n    mg_tcpip_call(s_ifp, MG_TCPIP_EV_WIFI_SCAN_END, NULL);\n  }  // else silently discard: CONNECTING; STA_CONNECTED,\"MAC\";\n     // STA_DISCONNECTED,\"MAC\"; DIST_STA_IP,\"MAC\",\"IP\"\n}\n\nstatic bool st67w6_at_cmd(char *cmd, size_t len);\n\n// Wi-Fi network stuff\n\nstatic bool st67w6_wifi_connect(char *ssid, char *pass) {\n  char cmd[90];  // ssid + pass + AT\n  size_t cmd_len;\n  if (!st67w6_at_cmd(\"AT+CWMODE=1,0\\r\\n\", 15)) return false;\n  cmd_len = mg_snprintf(cmd, sizeof(cmd), \"AT+CWJAP=\\\"%s\\\",\\\"%s\\\",,0\\r\\n\", ssid,\n                        pass);  // takes >700ms\n  if (!st67w6_at_cmd(cmd, cmd_len)) return false;\n  st67w6_at_cmd(\"AT+CWRECONNCFG=0,0\\r\\n\", 20);  // disregard error, connecting\n  s_connecting = true;\n  return true;\n}\n\nstatic bool st67w6_wifi_disconnect(void) {\n  s_connecting = false;\n  if (!st67w6_at_cmd(\"AT+CWQAP=0\\r\\n\", 12)) return false;  // takes >800ms\n  return st67w6_at_cmd(\"AT+CWMODE=0,0\\r\\n\", 15);           // takes >550ms\n}\n\nstatic bool st67w6_wifi_ap_start(char *ssid, char *pass, unsigned int channel) {\n  char cmd[90];  // ssid + pass + AT\n  size_t cmd_len;\n  if (!st67w6_at_cmd(\"AT+CWMODE=2,0\\r\\n\", 15)) return false;  // takes >800ms\n  cmd_len = mg_snprintf(\n      cmd, sizeof(cmd), \"AT+CWSAP=\\\"%s\\\",\\\"%s\\\",%u,3,2,0\\r\\n\", ssid, pass,\n      channel);  // 3: WPA2_PSK; 2: max stations  // takes >350ms\n  s_link = true;\n  return st67w6_at_cmd(cmd, cmd_len);\n}\n\nstatic bool st67w6_wifi_ap_stop(void) {\n  s_link = false;\n  return st67w6_at_cmd(\"AT+CWMODE=0,0\\r\\n\", 15);  // takes >550ms\n}\n\n// WLAN scan handling\n\n// +CWLAP:(security,\"SSID\",RSSI,\"BSSID\",channel,cipher,proto,wps)\\r\\n\n// security: OPEN, WEP, WPA, WPA2, WPA-WPA2, WPA-EAP, WPA3-SAE, WPA2-WPA3-SAE\n// cipher: NONE, WEP, AES/CCMP, TKIP, TKIP and AES/CCMP\n// proto: 4-bit bitmap AX,N,G,B; all set from right to left\n\nstatic bool st67w6_wifi_scan(void) {\n  return st67w6_at_cmd(\"AT+CWLAPOPT=1,1695,-100,255,50\\r\\n\", 32) &&\n         st67w6_at_cmd(\"AT+CWLAP=0,,,0\\r\\n\", 16);\n}\n\nstatic void st67w6_handle_scan_result(char *data, size_t len) {\n  struct mg_wifi_scan_bss_data bss;\n  struct mg_str fields[2];\n  char mac[6];\n  uint8_t val;\n  unsigned int i;\n  MG_VERBOSE((\"scan result event: %.*s\", (int) len, data));\n  ++data, --len;  // skip '('\n  if (!mg_span(mg_str_n(data, len), &fields[0], &fields[1], ',') ||\n      !mg_str_to_num(fields[0], 10, &val, 1))\n    return;\n  bss.security =\n      (val == 0)\n          ? MG_WIFI_SECURITY_OPEN\n          : MG_WIFI_SECURITY_WEP |\n                ((val == 2 || val == 4 || val == 5) ? MG_WIFI_SECURITY_WPA\n                                                    : 0) |\n                ((val == 3 || val == 4 || val == 7) ? MG_WIFI_SECURITY_WPA2\n                                                    : 0) |\n                ((val == 6 || val == 7) ? MG_WIFI_SECURITY_WPA3 : 0);\n  if (!mg_span(fields[1], &fields[0], &fields[1], ',')) return;\n  bss.SSID.buf = fields[0].buf + 1, bss.SSID.len = fields[0].len - 2;\n  if (!mg_span(fields[1], &fields[0], &fields[1], ',')) return;\n  while (fields[0].buf[0] == ' ') ++fields[0].buf, --fields[0].len;\n  if (fields[0].buf[0] != '-') return;  // positive RSSI would be great\n  ++fields[0].buf, --fields[0].len;\n  if (!mg_str_to_num(fields[0], 10, &val, 1)) return;\n  bss.RSSI = (int8_t) - (int8_t) val;\n  if (!mg_span(fields[1], &fields[0], &fields[1], ',')) return;\n  if (fields[0].len < 19) return;\n  ++fields[0].buf, --fields[0].len;  // skip '\"'\n  for (i = 0; i < 6; i++) {\n    struct mg_str str;\n    str.buf = fields[0].buf + 3 * i;\n    str.len = 2;\n    if (!mg_str_to_num(str, 16, &mac[i], 1)) return;\n  }\n  bss.BSSID = mac;\n  if (!mg_span(fields[1], &fields[0], &fields[1], ',') ||\n      !mg_str_to_num(fields[0], 10, &bss.channel, 1))\n    return;\n  if (!mg_span(fields[1], &fields[0], &fields[1], ',') ||\n      !mg_str_to_num(fields[0], 10, &val, 1))\n    return;\n  // ignore cypher\n  if (!mg_span(fields[1], &fields[0], &fields[1], ',') ||\n      !mg_str_to_num(fields[0], 10, &val, 1))\n    return;\n  bss.has_n = (val & 4) != 0;\n  // bss.has_ax = (val & 8) != 0;\n  bss.band = MG_WIFI_BAND_2G;  // NOT INFORMED with default options, no docs\n  MG_VERBOSE((\"BSS: %.*s (%u) (%M) %d dBm %u\", bss.SSID.len, bss.SSID.buf,\n              bss.channel, mg_print_mac, bss.BSSID, (int) bss.RSSI,\n              bss.security));\n  mg_tcpip_call(s_ifp, MG_TCPIP_EV_WIFI_SCAN_RESULT, &bss);\n}\n\n// AT stuff\n\nstatic inline bool delayms(unsigned int ms) {\n  mg_delayms(ms);\n  return true;\n}\n\n// send AT command, wait for a response or timeout, meanwhile delivering\n// received frames and events\n\nstatic bool st67w6_at_cmd(char *cmd, size_t len) {\n  bool is_at = true;\n  unsigned int times = 1000;\n  s_at_resp_len = 0;\n  st67w6_write(ST67W6_SPI_TYPE_AT, cmd, (uint16_t) len);\n  s_at_ok = false, s_at_err = false;\n  do {  // AT response processing does not call any other AT function\n    st67w6_poll(is_at);  // otherwise we can't allow them to pile up here\n    is_at = false;       // avoid repeating, allow queued WLAN frames to be sent\n    // network frames will be pushed to the queue so that is safe\n  } while (!s_at_ok && !s_at_err && times-- > 0 && delayms(1));\n  MG_VERBOSE((\"AT response:\\n%.*s\", s_at_resp_len, at_resp));\n  MG_VERBOSE((\"ok: %c, err: %c, times: %d\", s_at_ok ? '1' : '0',\n              s_at_err ? '1' : '0', (int) times));\n  return s_at_ok;\n}\n\nstatic bool st67w6_spi_init(void);\nbool mg_to_size_t(struct mg_str str, size_t *val);\n\nstatic bool st67w6_init(uint8_t *mac) {\n  //  struct mg_tcpip_driver_st67w6_data *d = (struct\n  //  mg_tcpip_driver_st67w6_data *) s_ifp->driver_data;\n  struct mg_str data[3];\n  size_t val;\n  bool is_b = false;\n  if (!st67w6_spi_init()) return false;\n  if (!st67w6_at_cmd(\"AT\\r\\n\", 4)) return false;\n  if (!st67w6_at_cmd(\"AT+CWNETMODE?\\r\\n\", 15) ||\n      !mg_match(mg_str_n((char *) at_resp, s_at_resp_len),\n                mg_str_n(\"*:*\\r\\n*\", 6), data) ||\n      !mg_to_size_t(data[1], &val))\n    return false;\n  if (val != 0) {\n    MG_ERROR((\"Wrong firmware, T02 is needed\"));\n    return false;\n  }\n  // set clock, who cares ???\n  if (!st67w6_at_cmd(\"AT+GET_CLOCK\\r\\n\", 14)) return false;\n  MG_DEBUG((\"%.*s\", s_at_resp_len, at_resp));  // TODO(scaprile): --> VERBOSE\n  // BT-ENABLED DEPENDENCY\n\n  // MODULE DEPENDENCY\n  if (!st67w6_at_cmd(\"AT+EFUSE-R=24,\\\"0x100\\\"\\r\\n\", 23) ||\n      !mg_match(mg_str_n((char *) at_resp, s_at_resp_len), mg_str_n(\"*,*\", 3),\n                data))\n    return false;\n  if (data[1].buf[0] == 'C' && data[1].buf[1] == '6') is_b = true;\n  MG_DEBUG((\"WLAN module is %sB type\", is_b ? \"\" : \"not\"));  // --> VERBOSE\n  if (is_b) {\n    // Disable the antenna diversity pin\n    if (!st67w6_at_cmd(\"AT+IORST=0\\r\\n\", 12)) return false;\n    // Apparently they intend to disable some antenna ...\n    if (!st67w6_at_cmd(\"AT+CWANTENABLE?\\r\\n\", 17)) return false;\n    MG_DEBUG((\"%.*s\", s_at_resp_len, at_resp));  // --> VERBOSE\n  }\n\n  // Do not set wake-up pin (AT+SLWKIO)\n  // Disable power save mode\n  // NOTE(scaprile): (no response if in hibernate mode, though I guess we\n  // wouldn't have reached this point in that case either)\n  if (!st67w6_at_cmd(\"AT+PWR=0\\r\\n\", 12)) return false;\n  // set Wi-Fi\n  // set country code\n  if (!st67w6_at_cmd(\"AT+CWCOUNTRY=0,\\\"00\\\"\\r\\n\", 21)) return false;\n#if 0\n\t// set DTIM\n  if (!st67w6_at_cmd(\"AT+SLWKDTIM=1\\r\\n\", 15)) return false;\n#endif\n  // Read only default MAC, ignore set bit count (data[6] & 0x3F). Custom MACs\n  // reside at @0x64 and 0x70\n  if (st67w6_at_cmd(\"AT+EFUSE-R=7,\\\"0x014\\\"\\r\\n\", 22) &&\n      mg_match(mg_str_n((char *) at_resp, s_at_resp_len), mg_str_n(\"*,*\", 3),\n               data)) {\n    int i;\n    for (i = 0; i < 6; i++) mac[i] = data[1].buf[5 - i];\n    MG_DEBUG((\"MAC: %M\", mg_print_mac, mac));\n  } else {\n    MG_ERROR((\"read MAC failed\"));\n  }\n  return true;\n}\n\nstatic void st67w6_update_hash_table(void) {\n  // TODO(): read database, rebuild hash table\n  //  uint32_t val = 0;\n  //  val = 1;\n  //  st67w6_at_iovar_set2_(0, \"mcast_list\", (uint8_t *) &val, sizeof(val),\n  //  (uint8_t *) mcast_addr, sizeof(mcast_addr)); mg_delayms(50);\n}\n\n// SPI specifics\n\n#define ST67W6_SPI_MAGIC 0x55AA\n// #define ST67W6_SPI_VERSION(x), IS_STALL, FLAGS(x), ...\n\nstatic const uint8_t idlehdr[sizeof(struct spi_hdr)] = {0xaa, 0x55, 0, 0,\n                                                        0,    0,    0, 0};\n\nstatic void st67w6_write(unsigned int f, void *data, uint16_t len) {\n  struct spi_hdr *h = (struct spi_hdr *) txdata;\n  h->magic = ST67W6_SPI_MAGIC;\n  h->type = (uint8_t) f;\n  h->vflags = 0;\n  h->len = len;\n  h->reserved = 0;\n  memmove(h + 1, data, len);\n}\n\nstatic size_t st67w6_spi_poll(uint8_t *write, uint8_t *read) {\n  struct mg_tcpip_driver_st67w6_data *d =\n      (struct mg_tcpip_driver_st67w6_data *) s_ifp->driver_data;\n  struct spi_hdr *th, *rh = (struct spi_hdr *) read;\n  struct mg_tcpip_spi_ *s = (struct mg_tcpip_spi_ *) d->spi;\n  size_t padded;\n  unsigned int times;\n\n  th = (write != NULL) ? (struct spi_hdr *) write : (struct spi_hdr *) idlehdr;\n  s->begin(s->spi);\n  times = 50;\n  while (times--) {\n    if (d->is_ready()) break;\n    if (times == 0) {\n      MG_ERROR((\"RDY TIMEOUT\"));\n      s->end(s->spi);\n      return 0;\n    }\n    mg_delayms(1);\n  }\n\n  padded = (th->len + 3) & ~3;\n  s->txn(s->spi, (uint8_t *) th, (uint8_t *) rh, sizeof(*th) + padded);\n  if (rh->magic == ST67W6_SPI_MAGIC && rh->len > padded) {\n    size_t remaining_padded = (rh->len - padded + 3) & ~3;\n    if (remaining_padded > (2048 - sizeof(*rh) - padded))\n      remaining_padded = 2048 - sizeof(*rh) - padded;\n    s->txn(s->spi, NULL, read + sizeof(*rh) + padded, remaining_padded);\n  }\n  times = 50;\n  while (times--) {\n    if (!d->is_ready()) break;\n    if (times == 0) {\n      MG_ERROR((\"!RDY TIMEOUT\"));\n      break;\n    }\n    mg_delayms(1);\n  }\n  s->end(s->spi);\n  return (size_t) rh->len;\n}\n\nstatic bool st67w6_spi_init(void) {\n  struct mg_tcpip_driver_st67w6_data *d =\n      (struct mg_tcpip_driver_st67w6_data *) s_ifp->driver_data;\n  size_t len;\n  unsigned int times = 1000;\n  while (times--) {\n    if (d->is_ready()) break;\n    if (times == 0) return false;\n    mg_delayms(1);\n  }\n  if (((len = st67w6_spi_poll(NULL, (uint8_t *) rxdata)) == 0) ||\n      !mg_match(mg_str_n(((char *) rxdata) + sizeof(struct spi_hdr), len),\n                mg_str_n(\"*ready*\", 7), NULL))\n    return false;\n  return true;\n}\n\n// Mongoose Wi-Fi API functions\n\nbool mg_wifi_scan(void) {\n  return st67w6_wifi_scan();\n}\n\nbool mg_wifi_connect(struct mg_wifi_data *wifi) {\n  s_ifp->ip = s_ip;\n  s_ifp->mask = s_mask;\n  if (s_ifp->ip == 0) s_ifp->enable_dhcp_client = true;\n  s_ifp->enable_dhcp_server = false;\n  MG_DEBUG((\"Connecting to '%s'\", wifi->ssid));\n  return st67w6_wifi_connect(wifi->ssid, wifi->pass);\n}\n\nbool mg_wifi_disconnect(void) {\n  return st67w6_wifi_disconnect();\n}\n\nbool mg_wifi_ap_start(struct mg_wifi_data *wifi) {\n  MG_DEBUG((\"Starting AP '%s' (%u)\", wifi->apssid, wifi->apchannel));\n  return st67w6_wifi_ap_start(wifi->apssid, wifi->appass, wifi->apchannel);\n}\n\nbool mg_wifi_ap_stop(void) {\n  return st67w6_wifi_ap_stop();\n}\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/stm32f.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_STM32F) && \\\n    MG_ENABLE_DRIVER_STM32F\nstruct stm32f_eth {\n  volatile uint32_t MACCR, MACFFR, MACHTHR, MACHTLR, MACMIIAR, MACMIIDR, MACFCR,\n      MACVLANTR, RESERVED0[2], MACRWUFFR, MACPMTCSR, RESERVED1, MACDBGR, MACSR,\n      MACIMR, MACA0HR, MACA0LR, MACA1HR, MACA1LR, MACA2HR, MACA2LR, MACA3HR,\n      MACA3LR, RESERVED2[40], MMCCR, MMCRIR, MMCTIR, MMCRIMR, MMCTIMR,\n      RESERVED3[14], MMCTGFSCCR, MMCTGFMSCCR, RESERVED4[5], MMCTGFCR,\n      RESERVED5[10], MMCRFCECR, MMCRFAECR, RESERVED6[10], MMCRGUFCR,\n      RESERVED7[334], PTPTSCR, PTPSSIR, PTPTSHR, PTPTSLR, PTPTSHUR, PTPTSLUR,\n      PTPTSAR, PTPTTHR, PTPTTLR, RESERVED8, PTPTSSR, PTPPPSCR, RESERVED9[564],\n      DMABMR, DMATPDR, DMARPDR, DMARDLAR, DMATDLAR, DMASR, DMAOMR, DMAIER,\n      DMAMFBOCR, DMARSWTR, RESERVED10[8], DMACHTDR, DMACHRDR, DMACHTBAR,\n      DMACHRBAR;\n};\n#undef ETH\n#define ETH ((struct stm32f_eth *) (uintptr_t) 0x40028000)\n\n#define ETH_PKT_SIZE 1540  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 4           // Descriptor size (words)\n\nstatic uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS] MG_ETH_RAM;      // RX descriptors\nstatic uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS] MG_ETH_RAM;      // TX descriptors\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM;  // RX ethernet buffers\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM;  // TX ethernet buffers\nstatic uint8_t s_txno;                               // Current TX descriptor\nstatic uint8_t s_rxno;                               // Current RX descriptor\n\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\n\nstatic uint16_t eth_read_phy(uint8_t addr, uint8_t reg) {\n  ETH->MACMIIAR &= (7 << 2);\n  ETH->MACMIIAR |= ((uint32_t) addr << 11) | ((uint32_t) reg << 6);\n  ETH->MACMIIAR |= MG_BIT(0);\n  while (ETH->MACMIIAR & MG_BIT(0)) (void) 0;\n  return ETH->MACMIIDR & 0xffff;\n}\n\nstatic void eth_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  ETH->MACMIIDR = val;\n  ETH->MACMIIAR &= (7 << 2);\n  ETH->MACMIIAR |= ((uint32_t) addr << 11) | ((uint32_t) reg << 6) | MG_BIT(1);\n  ETH->MACMIIAR |= MG_BIT(0);\n  while (ETH->MACMIIAR & MG_BIT(0)) (void) 0;\n}\n\nstatic uint32_t get_hclk(void) {\n  struct rcc {\n    volatile uint32_t CR, PLLCFGR, CFGR;\n  } *rcc = (struct rcc *) 0x40023800;\n  uint32_t clk = 0, hsi = 16000000 /* 16 MHz */, hse = 8000000 /* 8MHz */;\n\n  if (rcc->CFGR & (1 << 2)) {\n    clk = hse;\n  } else if (rcc->CFGR & (1 << 3)) {\n    uint32_t vco, m, n, p;\n    m = (rcc->PLLCFGR & (0x3f << 0)) >> 0;\n    n = (rcc->PLLCFGR & (0x1ff << 6)) >> 6;\n    p = (((rcc->PLLCFGR & (3 << 16)) >> 16) + 1) * 2;\n    clk = (rcc->PLLCFGR & (1 << 22)) ? hse : hsi;\n    vco = (uint32_t) ((uint64_t) clk * n / m);\n    clk = vco / p;\n  } else {\n    clk = hsi;\n  }\n  uint32_t hpre = (rcc->CFGR & (15 << 4)) >> 4;\n  if (hpre < 8) return clk;\n\n  uint8_t ahbptab[8] = {1, 2, 3, 4, 6, 7, 8, 9};  // log2(div)\n  return ((uint32_t) clk) >> ahbptab[hpre - 8];\n}\n\n//  Guess CR from HCLK. MDC clock is generated from HCLK (AHB); as per 802.3,\n//  it must not exceed 2.5MHz As the AHB clock can be (and usually is) derived\n//  from the HSI (internal RC), and it can go above specs, the datasheets\n//  specify a range of frequencies and activate one of a series of dividers to\n//  keep the MDC clock safely below 2.5MHz. We guess a divider setting based on\n//  HCLK with a +5% drift. If the user uses a different clock from our\n//  defaults, needs to set the macros on top Valid for STM32F74xxx/75xxx\n//  (38.8.1) and STM32F42xxx/43xxx (33.8.1) (both 4.5% worst case drift)\nstatic int guess_mdc_cr(void) {\n  uint8_t crs[] = {2, 3, 0, 1, 4, 5};          // ETH->MACMIIAR::CR values\n  uint8_t div[] = {16, 26, 42, 62, 102, 124};  // Respective HCLK dividers\n  uint32_t hclk = get_hclk();                  // Guess system HCLK\n  int result = -1;                             // Invalid CR value\n  if (hclk < 25000000) {\n    MG_ERROR((\"HCLK too low\"));\n  } else {\n    for (int i = 0; i < 6; i++) {\n      if (hclk / div[i] <= 2375000UL /* 2.5MHz - 5% */) {\n        result = crs[i];\n        break;\n      }\n    }\n    if (result < 0) MG_ERROR((\"HCLK too high\"));\n  }\n  MG_DEBUG((\"HCLK: %u, CR: %d\", hclk, result));\n  return result;\n}\n\nstatic bool mg_tcpip_driver_stm32f_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_stm32f_data *d =\n      (struct mg_tcpip_driver_stm32f_data *) ifp->driver_data;\n  uint8_t phy_addr = d == NULL ? 0 : d->phy_addr;\n  s_ifp = ifp;\n\n  // Init RX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i][0] = MG_BIT(31);                         // Own\n    s_rxdesc[i][1] = sizeof(s_rxbuf[i]) | MG_BIT(14);    // 2nd address chained\n    s_rxdesc[i][2] = (uint32_t) (uintptr_t) s_rxbuf[i];  // Point to data buffer\n    s_rxdesc[i][3] =\n        (uint32_t) (uintptr_t) s_rxdesc[(i + 1) % ETH_DESC_CNT];  // Chain\n  }\n\n  // Init TX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_txdesc[i][2] = (uint32_t) (uintptr_t) s_txbuf[i];  // Buf pointer\n    s_txdesc[i][3] =\n        (uint32_t) (uintptr_t) s_txdesc[(i + 1) % ETH_DESC_CNT];  // Chain\n  }\n\n  ETH->DMABMR |= MG_BIT(0);                         // Software reset\n  while ((ETH->DMABMR & MG_BIT(0)) != 0) (void) 0;  // Wait until done\n\n  // Set MDC clock divider. If user told us the value, use it. Otherwise, guess\n  int cr = (d == NULL || d->mdc_cr < 0) ? guess_mdc_cr() : d->mdc_cr;\n  ETH->MACMIIAR = ((uint32_t) cr & 7) << 2;\n\n  // NOTE(cpq): we do not use extended descriptor bit 7, and do not use\n  // hardware checksum. Therefore, descriptor size is 4, not 8\n  // ETH->DMABMR = MG_BIT(13) | MG_BIT(16) | MG_BIT(22) | MG_BIT(23) |\n  // MG_BIT(25);\n  ETH->MACIMR = MG_BIT(3) | MG_BIT(9);  // Mask timestamp & PMT IT\n  ETH->MACFCR = MG_BIT(7);              // Disable zero quarta pause\n  ETH->MACFFR = MG_BIT(10);             // Perfect filtering\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  mg_phy_init(&phy, phy_addr, MG_PHY_CLOCKS_MAC);\n  ETH->DMARDLAR = (uint32_t) (uintptr_t) s_rxdesc;  // RX descriptors\n  ETH->DMATDLAR = (uint32_t) (uintptr_t) s_txdesc;  // RX descriptors\n  ETH->DMAIER = MG_BIT(6) | MG_BIT(16);             // RIE, NISE\n  ETH->MACCR =\n      MG_BIT(2) | MG_BIT(3) | MG_BIT(11) | MG_BIT(14);  // RE, TE, Duplex, Fast\n  ETH->DMAOMR =\n      MG_BIT(1) | MG_BIT(13) | MG_BIT(21) | MG_BIT(25);  // SR, ST, TSF, RSF\n\n  // MAC address filtering\n  ETH->MACA0HR = ((uint32_t) ifp->mac[5] << 8U) | ifp->mac[4];\n  ETH->MACA0LR = (uint32_t) (ifp->mac[3] << 24) |\n                 ((uint32_t) ifp->mac[2] << 16) |\n                 ((uint32_t) ifp->mac[1] << 8) | ifp->mac[0];\n  return true;\n}\n\nstatic size_t mg_tcpip_driver_stm32f_tx(const void *buf, size_t len,\n                                        struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // Frame is too big\n  } else if ((s_txdesc[s_txno][0] & MG_BIT(31))) {\n    ifp->nerr++;\n    MG_ERROR((\"No free descriptors\"));\n    // printf(\"D0 %lx SR %lx\\n\", (long) s_txdesc[0][0], (long) ETH->DMASR);\n    len = 0;  // All descriptors are busy, fail\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);                           // Copy data\n    s_txdesc[s_txno][1] = (uint32_t) len;                        // Set data len\n    s_txdesc[s_txno][0] = MG_BIT(20) | MG_BIT(28) | MG_BIT(29);  // Chain,FS,LS\n    s_txdesc[s_txno][0] |= MG_BIT(31);  // Set OWN bit - let DMA take over\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n  MG_DSB();                            // ensure descriptors have been written\n  ETH->DMASR = MG_BIT(2) | MG_BIT(5);  // Clear any prior TBUS/TUS\n  ETH->DMATPDR = 0;                    // and resume\n  return len;\n}\n\nstatic void mg_tcpip_driver_stm32f_update_hash_table(struct mg_tcpip_if *ifp) {\n  // TODO(): read database, rebuild hash table\n  ETH->MACA1LR = (uint32_t) mcast_addr[3] << 24 |\n                 (uint32_t) mcast_addr[2] << 16 |\n                 (uint32_t) mcast_addr[1] << 8 | (uint32_t) mcast_addr[0];\n  ETH->MACA1HR = (uint32_t) mcast_addr[5] << 8 | (uint32_t) mcast_addr[4];\n  ETH->MACA1HR |= MG_BIT(31);  // AE\n  (void) ifp;\n}\n\nstatic bool mg_tcpip_driver_stm32f_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    mg_tcpip_driver_stm32f_update_hash_table(ifp);\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  struct mg_tcpip_driver_stm32f_data *d =\n      (struct mg_tcpip_driver_stm32f_data *) ifp->driver_data;\n  uint8_t phy_addr = d == NULL ? 0 : d->phy_addr;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  up = mg_phy_up(&phy, phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    // tmp = reg with flags set to the most likely situation: 100M full-duplex\n    // if(link is slow or half) set flags otherwise\n    // reg = tmp\n    uint32_t maccr = ETH->MACCR | MG_BIT(14) | MG_BIT(11);  // 100M, Full-duplex\n    if (speed == MG_PHY_SPEED_10M) maccr &= ~MG_BIT(14);    // 10M\n    if (full_duplex == false) maccr &= ~MG_BIT(11);         // Half-duplex\n    ETH->MACCR = maccr;  // IRQ handler does not fiddle with this register\n    MG_DEBUG((\"Link is %uM %s-duplex\", maccr & MG_BIT(14) ? 100 : 10,\n              maccr & MG_BIT(11) ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\n#ifdef __riscv\n__attribute__((interrupt()))  // For RISCV CH32V307, which share the same MAC\n#endif\nvoid ETH_IRQHandler(void);\nvoid ETH_IRQHandler(void) {\n  if (ETH->DMASR & MG_BIT(6)) {           // Frame received, loop\n    ETH->DMASR = MG_BIT(16) | MG_BIT(6);  // Clear flag\n    for (uint32_t i = 0; i < 10; i++) {   // read as they arrive but not forever\n      if (s_rxdesc[s_rxno][0] & MG_BIT(31)) break;  // exit when done\n      if (((s_rxdesc[s_rxno][0] & (MG_BIT(8) | MG_BIT(9))) ==\n           (MG_BIT(8) | MG_BIT(9))) &&\n          !(s_rxdesc[s_rxno][0] & MG_BIT(15))) {  // skip partial/errored frames\n        uint32_t len = ((s_rxdesc[s_rxno][0] >> 16) & (MG_BIT(14) - 1));\n        //  printf(\"%lx %lu %lx %.8lx\\n\", s_rxno, len, s_rxdesc[s_rxno][0],\n        //  ETH->DMASR);\n        mg_tcpip_qwrite(s_rxbuf[s_rxno], len > 4 ? len - 4 : len, s_ifp);\n      }\n      s_rxdesc[s_rxno][0] = MG_BIT(31);\n      if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n    }\n  }\n  // Cleanup flags\n  ETH->DMASR = MG_BIT(16)    // NIS, normal interrupt summary\n               | MG_BIT(7);  // Clear possible RBUS while processing\n  ETH->DMARPDR = 0;          // and resume RX\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_stm32f = {\n    mg_tcpip_driver_stm32f_init, mg_tcpip_driver_stm32f_tx, NULL,\n    mg_tcpip_driver_stm32f_poll};\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/stm32h.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && (MG_ENABLE_DRIVER_STM32H || MG_ENABLE_DRIVER_MCXN || \\\n                        MG_ENABLE_DRIVER_STM32N)\n// STM32H: vendor modded single-queue Synopsys v4.2\n// STM32N: dual-queue GbE Synopsys v5.2 with no hash table option, 64-bit AXI\n// MCXNx4x: dual-queue Synopsys v5.2 with no hash table option\n// RT1170: ENET_QOS: quad-queue Synopsys v5.1\n#if MG_ENABLE_DRIVER_STM32H\n#define SYNOPSYS_ENET_V5 0\n#define SYNOPSYS_ENET_SINGLEQ 1\n#define SYNOPSYS_ENET_NOHASHTABLE 0\n#define SYNOPSYS_ENET_GbE 0\n#elif MG_ENABLE_DRIVER_STM32N\n#define SYNOPSYS_ENET_V5 1\n#define SYNOPSYS_ENET_SINGLEQ 0\n#define SYNOPSYS_ENET_NOHASHTABLE 1\n#define SYNOPSYS_ENET_GbE 1\n#elif MG_ENABLE_DRIVER_MCXN\n#define SYNOPSYS_ENET_V5 1\n#define SYNOPSYS_ENET_SINGLEQ 0\n#define SYNOPSYS_ENET_NOHASHTABLE 1\n#define SYNOPSYS_ENET_GbE 0\n#endif\n\nstruct synopsys_enet_qos {\n  volatile uint32_t MACCR, MACECR, MACPFR, MACWTR, MACHT0R, MACHT1R,\n      RESERVED1[14], MACVTR, RESERVED2, MACVHTR, RESERVED3, MACVIR, MACIVIR,\n      RESERVED4[2], MACTFCR, RESERVED5[7], MACRFCR, RESERVED6[7], MACISR,\n      MACIER, MACRXTXSR, RESERVED7, MACPCSR, MACRWKPFR, RESERVED8[2], MACLCSR,\n      MACLTCR, MACLETR, MAC1USTCR, RESERVED9[12], MACVR, MACDR, RESERVED10,\n      MACHWF0R, MACHWF1R, MACHWF2R, RESERVED11[54], MACMDIOAR, MACMDIODR,\n      RESERVED12[2], MACARPAR, RESERVED13[59], MACA0HR, MACA0LR, MACA1HR,\n      MACA1LR, MACA2HR, MACA2LR, MACA3HR, MACA3LR, RESERVED14[248], MMCCR,\n      MMCRIR, MMCTIR, MMCRIMR, MMCTIMR, RESERVED15[14], MMCTSCGPR, MMCTMCGPR,\n      RESERVED16[5], MMCTPCGR, RESERVED17[10], MMCRCRCEPR, MMCRAEPR,\n      RESERVED18[10], MMCRUPGR, RESERVED19[9], MMCTLPIMSTR, MMCTLPITCR,\n      MMCRLPIMSTR, MMCRLPITCR, RESERVED20[65], MACL3L4C0R, MACL4A0R,\n      RESERVED21[2], MACL3A0R0R, MACL3A1R0R, MACL3A2R0R, MACL3A3R0R,\n      RESERVED22[4], MACL3L4C1R, MACL4A1R, RESERVED23[2], MACL3A0R1R,\n      MACL3A1R1R, MACL3A2R1R, MACL3A3R1R, RESERVED24[108], MACTSCR, MACSSIR,\n      MACSTSR, MACSTNR, MACSTSUR, MACSTNUR, MACTSAR, RESERVED25, MACTSSR,\n      RESERVED26[3], MACTTSSNR, MACTTSSSR, RESERVED27[2], MACACR, RESERVED28,\n      MACATSNR, MACATSSR, MACTSIACR, MACTSEACR, MACTSICNR, MACTSECNR,\n      RESERVED29[4], MACPPSCR, RESERVED30[3], MACPPSTTSR, MACPPSTTNR, MACPPSIR,\n      MACPPSWR, RESERVED31[12], MACPOCR, MACSPI0R, MACSPI1R, MACSPI2R, MACLMIR,\n      RESERVED32[11], MTLOMR, RESERVED33[7], MTLISR, RESERVED34[55], MTLTQOMR,\n      MTLTQUR, MTLTQDR, RESERVED35[8], MTLQICSR, MTLRQOMR, MTLRQMPOCR, MTLRQDR,\n      RESERVED36[177], DMAMR, DMASBMR, DMAISR, DMADSR, RESERVED37[60], DMACCR,\n      DMACTCR, DMACRCR, RESERVED38[2], DMACTDLAR, RESERVED39, DMACRDLAR,\n      DMACTDTPR, RESERVED40, DMACRDTPR, DMACTDRLR, DMACRDRLR, DMACIER,\n      DMACRIWTR, DMACSFCSR, RESERVED41, DMACCATDR, RESERVED42, DMACCARDR,\n      RESERVED43, DMACCATBR, RESERVED44, DMACCARBR, DMACSR, RESERVED45[2],\n      DMACMFCR;\n};\n#undef ETH\n#if MG_ENABLE_DRIVER_STM32H\n#define ETH ((struct synopsys_enet_qos *) (uintptr_t) 0x40028000UL)\n#elif MG_ENABLE_DRIVER_STM32N\n#define ETH ((struct synopsys_enet_qos *) (uintptr_t) 0x48036000UL)\n#elif MG_ENABLE_DRIVER_MCXN\n#define ETH ((struct synopsys_enet_qos *) (uintptr_t) 0x40100000UL)\n#endif\n\n#define ETH_PKT_SIZE 1540  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 4           // Descriptor size (words)\n\n#if MG_ENABLE_DRIVER_STM32H || MG_ENABLE_DRIVER_STM32N\n#define CACHE_LINESZ 32  // must be a whole number of (d)words (see DESC_SZW)\n#ifndef SCB\nstruct m7_scb {\n  volatile uint32_t CPUID, RESERVED1[4], CCR, RESERVED2[145], DCIMVAC, DCISW,\n      DCCMVAU, DCCMVAC, DCCSW, DCCIMVAC, DCCISW, RESERVED3[10], CACR,\n      RESERVED4[3];\n};\n#define SCB ((struct m7_scb *) (uintptr_t) 0xE000ED00UL)\n#endif\n// ending ISB is not needed because we don't cache instructions in data space\nstatic inline void MG_CACHE_INVAL(uint8_t *addr, int32_t len) {\n#if MG_ENABLE_DRIVER_STM32H\n  if ((SCB->CPUID & 0xfff0) != 0xc270) return;  // not a Cortex-M7 => not an H7\n#endif\n  if ((SCB->CCR & MG_BIT(16)) == 0) return;     // cache not enabled\n  MG_DSB();\n  while (len > 0) {\n    SCB->DCIMVAC = (uint32_t) addr;\n    addr += CACHE_LINESZ;\n    len -= CACHE_LINESZ;\n  }\n  MG_DSB();\n}\nstatic inline void MG_CACHE_FLUSH(uint8_t *addr, int32_t len) {\n#if MG_ENABLE_DRIVER_STM32H\n  if ((SCB->CPUID & 0xfff0) != 0xc270) return;  // not a Cortex-M7 => not an H7\n#endif\n  if ((SCB->CCR & MG_BIT(16)) == 0) return;     // cache not enabled\n  MG_DSB();\n  while (len > 0) {\n    SCB->DCCMVAC = (uint32_t) addr;\n    addr += CACHE_LINESZ;\n    len -= CACHE_LINESZ;\n  }\n  MG_DSB();\n}\n#define ETH_RAM_ALIGNED MG_32BYTE_ALIGNED  // depends on CACHE_LINESZ and ETH\n#define CACHE_ALIGN(x) \\\n  ((((size_t) (x)) + CACHE_LINESZ - 1) & ~(CACHE_LINESZ - 1))\n#define DESC_SZ CACHE_ALIGN(4 * ETH_DS)  // grow descriptors to fit a line\n#define DESC_SZW (DESC_SZ / 4)\n#define BUFF_SZ CACHE_ALIGN(ETH_PKT_SIZE)  // grow buffers to fit n lines\n#if MG_ENABLE_DRIVER_STM32H\n#define DESC_SKIPW (DESC_SZW - ETH_DS)  // tell DMA the descriptor size, words\n#else\n// MG_ENABLE_DRIVER_STM32N, DMA is AXI and specs skip in 64-bit double-words\n#define DESC_SKIPW ((DESC_SZW - ETH_DS) / 2)\n#endif\n#else\n#define MG_CACHE_FLUSH(a, b)\n#define MG_CACHE_INVAL(a, b)\n#define ETH_RAM_ALIGNED MG_8BYTE_ALIGNED  // depends on ETH DMA alone\n#define DESC_SZ 0\n#define DESC_SZW ETH_DS\n#define BUFF_SZ ETH_PKT_SIZE\n#define DESC_SKIPW 0  // no need to skip, as we're not aligning to cache lines\n#endif\n\n// array[rows][cols] = coldata coldata ... for all rows, keeps alignment\nstatic volatile uint32_t s_rxdesc[ETH_DESC_CNT][DESC_SZW] MG_ETH_RAM\n    ETH_RAM_ALIGNED;\nstatic volatile uint32_t s_txdesc[ETH_DESC_CNT][DESC_SZW] MG_ETH_RAM\n    ETH_RAM_ALIGNED;\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][BUFF_SZ] MG_ETH_RAM ETH_RAM_ALIGNED;\nstatic uint8_t s_txbuf[ETH_DESC_CNT][BUFF_SZ] MG_ETH_RAM ETH_RAM_ALIGNED;\n\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\n\nstatic uint16_t eth_read_phy(uint8_t addr, uint8_t reg) {\n  ETH->MACMDIOAR &= (0xF << 8);\n  ETH->MACMDIOAR |= ((uint32_t) addr << 21) | ((uint32_t) reg << 16) | 3 << 2;\n  ETH->MACMDIOAR |= MG_BIT(0);\n  while (ETH->MACMDIOAR & MG_BIT(0)) (void) 0;\n  return (uint16_t) ETH->MACMDIODR;\n}\n\nstatic void eth_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  ETH->MACMDIODR = val;\n  ETH->MACMDIOAR &= (0xF << 8);\n  ETH->MACMDIOAR |= ((uint32_t) addr << 21) | ((uint32_t) reg << 16) | 1 << 2;\n  ETH->MACMDIOAR |= MG_BIT(0);\n  while (ETH->MACMDIOAR & MG_BIT(0)) (void) 0;\n}\n\nstatic bool mg_tcpip_driver_stm32h_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_stm32h_data *d =\n      (struct mg_tcpip_driver_stm32h_data *) ifp->driver_data;\n  s_ifp = ifp;\n  uint8_t phy_addr = d == NULL ? 0 : d->phy_addr;\n  uint8_t phy_conf = d == NULL ? MG_PHY_CLOCKS_MAC : d->phy_conf;\n\n  // Init RX descriptors\n  memset((char *) s_rxdesc, 0, sizeof(s_rxdesc));  // manual init\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i][0] = (uint32_t) (uintptr_t) s_rxbuf[i];  // Point to data buffer\n    s_rxdesc[i][3] = MG_BIT(31) | MG_BIT(30) | MG_BIT(24);  // OWN, IOC, BUF1V\n  }\n  MG_CACHE_FLUSH((uint8_t *) s_rxdesc, sizeof(s_rxdesc));\n\n  // Init TX descriptors\n  memset((char *) s_txdesc, 0, sizeof(s_txdesc));  // manual init\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_txdesc[i][0] = (uint32_t) (uintptr_t) s_txbuf[i];  // Buf pointer\n  }\n  MG_CACHE_FLUSH((uint8_t *) s_txdesc, sizeof(s_txdesc));\n\n  ETH->DMAMR |= MG_BIT(0);  // Software reset\n  for (int i = 0; i < 4; i++)\n    (void) 0;  // wait at least 4 clocks before reading\n  while ((ETH->DMAMR & MG_BIT(0)) != 0) (void) 0;  // Wait until done\n\n  // Set MDC clock divider. Get user value, else, assume max freq\n  int cr = (d == NULL || d->mdc_cr < 0) ? 7 : d->mdc_cr;\n  ETH->MACMDIOAR = ((uint32_t) cr & 0xF) << 8;\n\n  // NOTE(scaprile): We do not use timing facilities so the DMA engine does not\n  // re-write buffer address\n  ETH->DMAMR = 0 << 16;        // use interrupt mode 0 (58.8.1) (reset value)\n  ETH->DMASBMR |= MG_BIT(12);  // AAL NOTE(scaprile): is this actually needed\n  ETH->MACIER = 0;  // Do not enable additional irq sources (reset value)\n  ETH->MACTFCR = MG_BIT(7);  // Disable zero-quanta pause\n#if !SYNOPSYS_ENET_V5\n  ETH->MACPFR = MG_BIT(10);  // Perfect filtering\n#endif\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  mg_phy_init(&phy, phy_addr, phy_conf);\n  ETH->DMACRDLAR =\n      (uint32_t) (uintptr_t) s_rxdesc;  // RX descriptors start address\n  ETH->DMACRDRLR = ETH_DESC_CNT - 1;    // ring length\n  ETH->DMACRDTPR =\n      (uint32_t) (uintptr_t) &s_rxdesc[ETH_DESC_CNT -\n                                       1];  // last valid descriptor address\n  ETH->DMACTDLAR =\n      (uint32_t) (uintptr_t) s_txdesc;  // TX descriptors start address\n  ETH->DMACTDRLR = ETH_DESC_CNT - 1;    // ring length\n  ETH->DMACTDTPR =\n      (uint32_t) (uintptr_t) s_txdesc;  // first available descriptor address\n  ETH->DMACCR = DESC_SKIPW << 18;  // DSL (contiguous/sparse descriptor table)\n#if SYNOPSYS_ENET_V5\n  MG_SET_BITS(ETH->DMACTCR, 0x3F << 16, MG_BIT(16));\n  MG_SET_BITS(ETH->DMACRCR, 0x3F << 16, MG_BIT(16));\n#endif\n  ETH->DMACIER = MG_BIT(6) | MG_BIT(15);  // RIE, NIE\n  ETH->MACCR = MG_BIT(0) | MG_BIT(1) | MG_BIT(13) | MG_BIT(14) |\n               MG_BIT(15);  // RE, TE, Duplex, Fast, (10/100)/Reserved\n#if SYNOPSYS_ENET_SINGLEQ\n  ETH->MTLTQOMR |= MG_BIT(1);  // TSF\n  ETH->MTLRQOMR |= MG_BIT(5);  // RSF\n#else\n  ETH->MTLTQOMR |= (7 << 16) | MG_BIT(3) | MG_BIT(1);  // 2KB Q0, TSF\n  ETH->MTLRQOMR |= (7 << 20) | MG_BIT(5);              // 2KB Q, RSF\n  MG_SET_BITS(ETH->RESERVED6[3], 3, 2);  // Enable RxQ0 (MAC_RXQ_CTRL0)\n#endif\n  ETH->DMACTCR |= MG_BIT(0);  // ST\n  ETH->DMACRCR |= MG_BIT(0);  // SR\n\n  // MAC address filtering\n  ETH->MACA0HR = ((uint32_t) ifp->mac[5] << 8U) | ifp->mac[4];\n  ETH->MACA0LR = (uint32_t) (ifp->mac[3] << 24) |\n                 ((uint32_t) ifp->mac[2] << 16) |\n                 ((uint32_t) ifp->mac[1] << 8) | ifp->mac[0];\n  return true;\n}\n\nstatic uint32_t s_txno;\nstatic size_t mg_tcpip_driver_stm32h_tx(const void *buf, size_t len,\n                                        struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    return 0;  // Frame is too big\n  }\n  MG_CACHE_INVAL((uint8_t *) &s_txdesc[s_txno], DESC_SZ);\n  if ((s_txdesc[s_txno][3] & MG_BIT(31))) {\n    ifp->nerr++;\n    MG_ERROR((\"No free descriptors: %u %08X %08X %08X\", s_txno,\n              s_txdesc[s_txno][3], ETH->DMACSR, ETH->DMACTCR));\n    MG_CACHE_INVAL((uint8_t *) s_txdesc, sizeof(s_txdesc));\n    for (int i = 0; i < ETH_DESC_CNT; i++) MG_ERROR((\"%08X\", s_txdesc[i][3]));\n    len = 0;  // All descriptors are busy, fail\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);  // Copy data\n    MG_CACHE_FLUSH((uint8_t *) &s_txbuf[s_txno], BUFF_SZ);\n    s_txdesc[s_txno][2] = (uint32_t) len;           // Set data len\n    s_txdesc[s_txno][3] = MG_BIT(28) | MG_BIT(29);  // FD, LD\n    s_txdesc[s_txno][3] |= MG_BIT(31);  // Set OWN bit - let DMA take over\n    MG_CACHE_FLUSH((uint8_t *) &s_txdesc[s_txno], DESC_SZ);\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n  ETH->DMACSR |= MG_BIT(2) | MG_BIT(1);  // Clear any prior TBU, TPS\n  ETH->DMACTDTPR = (uint32_t) (uintptr_t) &s_txdesc[s_txno];  // and resume\n  return len;\n  (void) ifp;\n}\n\nstatic void mg_tcpip_driver_stm32h_update_hash_table(struct mg_tcpip_if *ifp) {\n#if SYNOPSYS_ENET_NOHASHTABLE\n  ETH->MACPFR = MG_BIT(4);  // Pass Multicast (pass all multicast frames)\n#else\n  // TODO(): read database, rebuild hash table\n  // add mDNS / DNS-SD multicast address\n  ETH->MACA1LR = (uint32_t) mcast_addr[3] << 24 |\n                 (uint32_t) mcast_addr[2] << 16 |\n                 (uint32_t) mcast_addr[1] << 8 | (uint32_t) mcast_addr[0];\n  ETH->MACA1HR = (uint32_t) mcast_addr[5] << 8 | (uint32_t) mcast_addr[4];\n  ETH->MACA1HR |= MG_BIT(31);  // AE\n#endif\n  (void) ifp;\n}\n\nstatic bool mg_tcpip_driver_stm32h_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    mg_tcpip_driver_stm32h_update_hash_table(ifp);\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  struct mg_tcpip_driver_stm32h_data *d =\n      (struct mg_tcpip_driver_stm32h_data *) ifp->driver_data;\n  uint8_t phy_addr = d == NULL ? 0 : d->phy_addr;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  up = mg_phy_up(&phy, phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    // tmp = reg with flags set to the most likely situation: 100M full-duplex\n    // if(link is slow or half) set flags otherwise\n    // reg = tmp\n    uint32_t maccr = ETH->MACCR | MG_BIT(14) | MG_BIT(13);  // 100M, Full-duplex\n#if SYNOPSYS_ENET_GbE\n    if (speed == MG_PHY_SPEED_1000M) maccr &= ~MG_BIT(15);  // 1000M\n#endif\n    if (speed == MG_PHY_SPEED_10M) maccr &= ~MG_BIT(14);  // 10M\n    if (full_duplex == false) maccr &= ~MG_BIT(13);       // Half-duplex\n    ETH->MACCR = maccr;  // IRQ handler does not fiddle with this register\n    MG_DEBUG((\"Link is %uM %s-duplex\", maccr & MG_BIT(14) ? 100 : 10,\n              maccr & MG_BIT(13) ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\nstatic uint32_t s_rxno;\n#if MG_ENABLE_DRIVER_MCXN\nvoid ETHERNET_IRQHandler(void);\nvoid ETHERNET_IRQHandler(void) {\n#elif MG_ENABLE_DRIVER_STM32H\nvoid ETH_IRQHandler(void);\nvoid ETH_IRQHandler(void) {\n#else\nvoid ETH1_IRQHandler(void);\nvoid ETH1_IRQHandler(void) {\n#endif\n  if (ETH->DMACSR & MG_BIT(6)) {           // Frame received, loop\n    ETH->DMACSR = MG_BIT(15) | MG_BIT(6);  // Clear flag\n    for (uint32_t i = 0; i < 10; i++) {  // read as they arrive but not forever\n      MG_CACHE_INVAL((uint8_t *) &s_rxdesc[s_rxno], DESC_SZ);\n      if (s_rxdesc[s_rxno][3] & MG_BIT(31)) break;  // exit when done\n      if (((s_rxdesc[s_rxno][3] & (MG_BIT(28) | MG_BIT(29))) ==\n           (MG_BIT(28) | MG_BIT(29))) &&\n          !(s_rxdesc[s_rxno][3] & MG_BIT(15))) {  // skip partial/errored frames\n        uint32_t len = s_rxdesc[s_rxno][3] & (MG_BIT(15) - 1);\n        // MG_DEBUG((\"%lx %lu %lx %08lx\", s_rxno, len, s_rxdesc[s_rxno][3],\n        // ETH->DMACSR));\n        MG_CACHE_INVAL((uint8_t *) &s_rxbuf[s_rxno], BUFF_SZ);\n        mg_tcpip_qwrite(s_rxbuf[s_rxno], len > 4 ? len - 4 : len, s_ifp);\n      }\n      s_rxdesc[s_rxno][3] =\n          MG_BIT(31) | MG_BIT(30) | MG_BIT(24);  // OWN, IOC, BUF1V\n      MG_CACHE_FLUSH((uint8_t *) &s_rxdesc[s_rxno], DESC_SZ);\n      if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n    }\n  }\n  ETH->DMACSR =\n      MG_BIT(7) | MG_BIT(8);  // Clear possible RBU RPS while processing\n  ETH->DMACRDTPR =\n      (uint32_t) (uintptr_t) &s_rxdesc[ETH_DESC_CNT - 1];  // and resume RX\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_stm32h = {\n    mg_tcpip_driver_stm32h_init, mg_tcpip_driver_stm32h_tx, NULL,\n    mg_tcpip_driver_stm32h_poll};\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/tm4c.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_TM4C) && MG_ENABLE_DRIVER_TM4C\nstruct tm4c_emac {\n  volatile uint32_t EMACCFG, EMACFRAMEFLTR, EMACHASHTBLH, EMACHASHTBLL,\n      EMACMIIADDR, EMACMIIDATA, EMACFLOWCTL, EMACVLANTG, RESERVED0, EMACSTATUS,\n      EMACRWUFF, EMACPMTCTLSTAT, RESERVED1[2], EMACRIS, EMACIM, EMACADDR0H,\n      EMACADDR0L, EMACADDR1H, EMACADDR1L, EMACADDR2H, EMACADDR2L, EMACADDR3H,\n      EMACADDR3L, RESERVED2[31], EMACWDOGTO, RESERVED3[8], EMACMMCCTRL,\n      EMACMMCRXRIS, EMACMMCTXRIS, EMACMMCRXIM, EMACMMCTXIM, RESERVED4,\n      EMACTXCNTGB, RESERVED5[12], EMACTXCNTSCOL, EMACTXCNTMCOL, RESERVED6[4],\n      EMACTXOCTCNTG, RESERVED7[6], EMACRXCNTGB, RESERVED8[4], EMACRXCNTCRCERR,\n      EMACRXCNTALGNERR, RESERVED9[10], EMACRXCNTGUNI, RESERVED10[239],\n      EMACVLNINCREP, EMACVLANHASH, RESERVED11[93], EMACTIMSTCTRL, EMACSUBSECINC,\n      EMACTIMSEC, EMACTIMNANO, EMACTIMSECU, EMACTIMNANOU, EMACTIMADD,\n      EMACTARGSEC, EMACTARGNANO, EMACHWORDSEC, EMACTIMSTAT, EMACPPSCTRL,\n      RESERVED12[12], EMACPPS0INTVL, EMACPPS0WIDTH, RESERVED13[294],\n      EMACDMABUSMOD, EMACTXPOLLD, EMACRXPOLLD, EMACRXDLADDR, EMACTXDLADDR,\n      EMACDMARIS, EMACDMAOPMODE, EMACDMAIM, EMACMFBOC, EMACRXINTWDT,\n      RESERVED14[8], EMACHOSTXDESC, EMACHOSRXDESC, EMACHOSTXBA, EMACHOSRXBA,\n      RESERVED15[218], EMACPP, EMACPC, EMACCC, RESERVED16, EMACEPHYRIS,\n      EMACEPHYIM, EMACEPHYIMSC;\n};\n#undef EMAC\n#define EMAC ((struct tm4c_emac *) (uintptr_t) 0x400EC000)\n\n#define ETH_PKT_SIZE 1540  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 4           // Descriptor size (words)\n\nstatic uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS];      // RX descriptors\nstatic uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS];      // TX descriptors\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE];  // RX ethernet buffers\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE];  // TX ethernet buffers\nstatic struct mg_tcpip_if *s_ifp;                    // MIP interface\nenum {\n  EPHY_ADDR = 0,\n  EPHYBMCR = 0,\n  EPHYBMSR = 1,\n  EPHYSTS = 16\n};  // PHY constants\n\nstatic inline void tm4cspin(volatile uint32_t count) {\n  while (count--) (void) 0;\n}\n\nstatic uint32_t emac_read_phy(uint8_t addr, uint8_t reg) {\n  EMAC->EMACMIIADDR &= (0xf << 2);\n  EMAC->EMACMIIADDR |= ((uint32_t) addr << 11) | ((uint32_t) reg << 6);\n  EMAC->EMACMIIADDR |= MG_BIT(0);\n  while (EMAC->EMACMIIADDR & MG_BIT(0)) tm4cspin(1);\n  return EMAC->EMACMIIDATA;\n}\n\nstatic void emac_write_phy(uint8_t addr, uint8_t reg, uint32_t val) {\n  EMAC->EMACMIIDATA = val;\n  EMAC->EMACMIIADDR &= (0xf << 2);\n  EMAC->EMACMIIADDR |=\n      ((uint32_t) addr << 11) | ((uint32_t) reg << 6) | MG_BIT(1);\n  EMAC->EMACMIIADDR |= MG_BIT(0);\n  while (EMAC->EMACMIIADDR & MG_BIT(0)) tm4cspin(1);\n}\n\nstatic uint32_t get_sysclk(void) {\n  struct sysctl {\n    volatile uint32_t DONTCARE0[44], RSCLKCFG, DONTCARE1[43], PLLFREQ0,\n        PLLFREQ1;\n  } *sysctl = (struct sysctl *) 0x400FE000;\n  uint32_t clk = 0, piosc = 16000000 /* 16 MHz */, mosc = 25000000 /* 25MHz */;\n  if (sysctl->RSCLKCFG & (1 << 28)) {  // USEPLL\n    uint32_t fin, vco, mdiv, n, q, psysdiv;\n    uint32_t pllsrc = (sysctl->RSCLKCFG & (0xf << 24)) >> 24;\n    if (pllsrc == 0) {\n      clk = piosc;\n    } else if (pllsrc == 3) {\n      clk = mosc;\n    } else {\n      MG_ERROR((\"Unsupported clock source\"));\n    }\n    q = (sysctl->PLLFREQ1 & (0x1f << 8)) >> 8;\n    n = (sysctl->PLLFREQ1 & (0x1f << 0)) >> 0;\n    fin = clk / ((q + 1) * (n + 1));\n    mdiv = (sysctl->PLLFREQ0 & (0x3ff << 0)) >>\n           0;  // mint + (mfrac / 1024); MFRAC not supported\n    psysdiv = (sysctl->RSCLKCFG & (0x3f << 0)) >> 0;\n    vco = (uint32_t) ((uint64_t) fin * mdiv);\n    return vco / (psysdiv + 1);\n  }\n  uint32_t oscsrc = (sysctl->RSCLKCFG & (0xf << 20)) >> 20;\n  if (oscsrc == 0) {\n    clk = piosc;\n  } else if (oscsrc == 3) {\n    clk = mosc;\n  } else {\n    MG_ERROR((\"Unsupported clock source\"));\n  }\n  uint32_t osysdiv = (sysctl->RSCLKCFG & (0xf << 16)) >> 16;\n  return clk / (osysdiv + 1);\n}\n\n//  Guess CR from SYSCLK. MDC clock is generated from SYSCLK (AHB); as per\n//  802.3, it must not exceed 2.5MHz (also 20.4.2.6) As the AHB clock can be\n//  derived from the PIOSC (internal RC), and it can go above  specs, the\n//  datasheets specify a range of frequencies and activate one of a series of\n//  dividers to keep the MDC clock safely below 2.5MHz. We guess a divider\n//  setting based on SYSCLK with a +5% drift. If the user uses a different clock\n//  from our defaults, needs to set the macros on top Valid for TM4C129x (20.7)\n//  (4.5% worst case drift)\n// The PHY receives the main oscillator (MOSC) (20.3.1)\nstatic int guess_mdc_cr(void) {\n  uint8_t crs[] = {2, 3, 0, 1};      // EMAC->MACMIIAR::CR values\n  uint8_t div[] = {16, 26, 42, 62};  // Respective HCLK dividers\n  uint32_t sysclk = get_sysclk();    // Guess system SYSCLK\n  int i, result = -1;                // Invalid CR value\n  if (sysclk < 25000000) {\n    MG_ERROR((\"SYSCLK too low\"));\n  } else {\n    for (i = 0; i < 4; i++) {\n      if (sysclk / div[i] <= 2375000UL /* 2.5MHz - 5% */) {\n        result = crs[i];\n        break;\n      }\n    }\n    if (result < 0) MG_ERROR((\"SYSCLK too high\"));\n  }\n  MG_DEBUG((\"SYSCLK: %u, CR: %d\", sysclk, result));\n  return result;\n}\n\nstatic bool mg_tcpip_driver_tm4c_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_tm4c_data *d =\n      (struct mg_tcpip_driver_tm4c_data *) ifp->driver_data;\n  int i;\n  s_ifp = ifp;\n\n  // Init RX descriptors\n  for (i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i][0] = MG_BIT(31);                         // Own\n    s_rxdesc[i][1] = sizeof(s_rxbuf[i]) | MG_BIT(14);    // 2nd address chained\n    s_rxdesc[i][2] = (uint32_t) (uintptr_t) s_rxbuf[i];  // Point to data buffer\n    s_rxdesc[i][3] =\n        (uint32_t) (uintptr_t) s_rxdesc[(i + 1) % ETH_DESC_CNT];  // Chain\n    // MG_DEBUG((\"%d %p\", i, s_rxdesc[i]));\n  }\n\n  // Init TX descriptors\n  for (i = 0; i < ETH_DESC_CNT; i++) {\n    s_txdesc[i][2] = (uint32_t) (uintptr_t) s_txbuf[i];  // Buf pointer\n    s_txdesc[i][3] =\n        (uint32_t) (uintptr_t) s_txdesc[(i + 1) % ETH_DESC_CNT];  // Chain\n  }\n\n  EMAC->EMACDMABUSMOD |= MG_BIT(0);  // Software reset\n  while ((EMAC->EMACDMABUSMOD & MG_BIT(0)) != 0)\n    tm4cspin(1);  // Wait until done\n\n  // Set MDC clock divider. If user told us the value, use it. Otherwise, guess\n  int cr = (d == NULL || d->mdc_cr < 0) ? guess_mdc_cr() : d->mdc_cr;\n  EMAC->EMACMIIADDR = ((uint32_t) cr & 0xf) << 2;\n\n  // NOTE(cpq): we do not use extended descriptor bit 7, and do not use\n  // hardware checksum. Therefore, descriptor size is 4, not 8\n  // EMAC->EMACDMABUSMOD = MG_BIT(13) | MG_BIT(16) | MG_BIT(22) | MG_BIT(23) |\n  // MG_BIT(25);\n  EMAC->EMACIM = MG_BIT(3) | MG_BIT(9);  // Mask timestamp & PMT IT\n  EMAC->EMACFLOWCTL = MG_BIT(7);         // Disable zero-quanta pause\n  EMAC->EMACFRAMEFLTR = MG_BIT(10);      // Perfect filtering\n  // EMAC->EMACPC defaults to internal PHY (EPHY) in MMI mode\n  emac_write_phy(EPHY_ADDR, EPHYBMCR, MG_BIT(15));  // Reset internal PHY (EPHY)\n  emac_write_phy(EPHY_ADDR, EPHYBMCR, MG_BIT(12));  // Set autonegotiation\n  EMAC->EMACRXDLADDR = (uint32_t) (uintptr_t) s_rxdesc;  // RX descriptors\n  EMAC->EMACTXDLADDR = (uint32_t) (uintptr_t) s_txdesc;  // TX descriptors\n  EMAC->EMACDMAIM = MG_BIT(6) | MG_BIT(16);              // RIE, NIE\n  EMAC->EMACCFG =\n      MG_BIT(2) | MG_BIT(3) | MG_BIT(11) | MG_BIT(14);  // RE, TE, Duplex, Fast\n  EMAC->EMACDMAOPMODE =\n      MG_BIT(1) | MG_BIT(13) | MG_BIT(21) | MG_BIT(25);  // SR, ST, TSF, RSF\n  EMAC->EMACADDR0H = ((uint32_t) ifp->mac[5] << 8U) | ifp->mac[4];\n  EMAC->EMACADDR0L = (uint32_t) (ifp->mac[3] << 24) |\n                     ((uint32_t) ifp->mac[2] << 16) |\n                     ((uint32_t) ifp->mac[1] << 8) | ifp->mac[0];\n  return true;\n}\n\nstatic uint32_t s_txno;\nstatic size_t mg_tcpip_driver_tm4c_tx(const void *buf, size_t len,\n                                      struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // fail\n  } else if ((s_txdesc[s_txno][0] & MG_BIT(31))) {\n    ifp->nerr++;\n    MG_ERROR((\"No descriptors available\"));\n    // printf(\"D0 %lx SR %lx\\n\", (long) s_txdesc[0][0], (long)\n    // EMAC->EMACDMARIS);\n    len = 0;  // fail\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);     // Copy data\n    s_txdesc[s_txno][1] = (uint32_t) len;  // Set data len\n    s_txdesc[s_txno][0] =\n        MG_BIT(20) | MG_BIT(28) | MG_BIT(29) | MG_BIT(30);  // Chain,FS,LS,IC\n    s_txdesc[s_txno][0] |= MG_BIT(31);  // Set OWN bit - let DMA take over\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n  EMAC->EMACDMARIS = MG_BIT(2) | MG_BIT(5);  // Clear any prior TU/UNF\n  EMAC->EMACTXPOLLD = 0;                     // and resume\n  return len;\n}\n\nstatic void mg_tcpip_driver_tm4c_update_hash_table(struct mg_tcpip_if *ifp) {\n  // TODO(): read database, rebuild hash table\n  // add mDNS / DNS-SD multicast address\n  EMAC->EMACADDR1L = (uint32_t) mcast_addr[3] << 24 |\n                     (uint32_t) mcast_addr[2] << 16 |\n                     (uint32_t) mcast_addr[1] << 8 | (uint32_t) mcast_addr[0];\n  EMAC->EMACADDR1H = (uint32_t) mcast_addr[5] << 8 | (uint32_t) mcast_addr[4];\n  EMAC->EMACADDR1H |= MG_BIT(31);  // AE\n  (void) ifp;\n}\n\nstatic bool mg_tcpip_driver_tm4c_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    mg_tcpip_driver_tm4c_update_hash_table(ifp);\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  uint32_t bmsr = emac_read_phy(EPHY_ADDR, EPHYBMSR);\n  bool up = (bmsr & MG_BIT(2)) ? 1 : 0;\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    uint32_t sts = emac_read_phy(EPHY_ADDR, EPHYSTS);\n    // tmp = reg with flags set to the most likely situation: 100M full-duplex\n    // if(link is slow or half) set flags otherwise\n    // reg = tmp\n    uint32_t emaccfg =\n        EMAC->EMACCFG | MG_BIT(14) | MG_BIT(11);         // 100M, Full-duplex\n    if (sts & MG_BIT(1)) emaccfg &= ~MG_BIT(14);         // 10M\n    if ((sts & MG_BIT(2)) == 0) emaccfg &= ~MG_BIT(11);  // Half-duplex\n    EMAC->EMACCFG = emaccfg;  // IRQ handler does not fiddle with this register\n    MG_DEBUG((\"Link is %uM %s-duplex\", emaccfg & MG_BIT(14) ? 100 : 10,\n              emaccfg & MG_BIT(11) ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\nvoid EMAC0_IRQHandler(void);\nstatic uint32_t s_rxno;\nvoid EMAC0_IRQHandler(void) {\n  int i;\n  if (EMAC->EMACDMARIS & MG_BIT(6)) {           // Frame received, loop\n    EMAC->EMACDMARIS = MG_BIT(16) | MG_BIT(6);  // Clear flag\n    for (i = 0; i < 10; i++) {  // read as they arrive but not forever\n      if (s_rxdesc[s_rxno][0] & MG_BIT(31)) break;  // exit when done\n      if (((s_rxdesc[s_rxno][0] & (MG_BIT(8) | MG_BIT(9))) ==\n           (MG_BIT(8) | MG_BIT(9))) &&\n          !(s_rxdesc[s_rxno][0] & MG_BIT(15))) {  // skip partial/errored frames\n        uint32_t len = ((s_rxdesc[s_rxno][0] >> 16) & (MG_BIT(14) - 1));\n        //  printf(\"%lx %lu %lx %.8lx\\n\", s_rxno, len, s_rxdesc[s_rxno][0],\n        //  EMAC->EMACDMARIS);\n        mg_tcpip_qwrite(s_rxbuf[s_rxno], len > 4 ? len - 4 : len, s_ifp);\n      }\n      s_rxdesc[s_rxno][0] = MG_BIT(31);\n      if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n    }\n  }\n  EMAC->EMACDMARIS = MG_BIT(7);  // Clear possible RU while processing\n  EMAC->EMACRXPOLLD = 0;         // and resume RX\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_tm4c = {mg_tcpip_driver_tm4c_init,\n                                               mg_tcpip_driver_tm4c_tx, NULL,\n                                               mg_tcpip_driver_tm4c_poll};\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/tms570.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_TMS570) && MG_ENABLE_DRIVER_TMS570\nstruct tms570_emac_ctrl {\n  volatile uint32_t REVID, SOFTRESET, RESERVED1[1], INTCONTROL, C0RXTHRESHEN,\n  C0RXEN, C0TXEN, C0MISCEN, RESERVED2[8],\n  C0RXTHRESHSTAT, C0RXSTAT, C0TXSTAT, C0MISCSTAT,\n  RESERVED3[8],\n  C0RXIMAX, C0TXIMAX;\n};\nstruct tms570_emac {\n  volatile uint32_t TXREVID, TXCONTROL, TXTEARDOWN, RESERVED1[1], RXREVID,\n  RXCONTROL, RXTEARDOWN, RESERVED2[25], TXINTSTATRAW,TXINTSTATMASKED,\n  TXINTMASKSET, TXINTMASKCLEAR, MACINVECTOR, MACEOIVECTOR, RESERVED8[2], RXINTSTATRAW,\n  RXINTSTATMASKED, RXINTMASKSET, RXINTMASKCLEAR, MACINTSTATRAW, MACINTSTATMASKED,\n  MACINTMASKSET, MACINTMASKCLEAR, RESERVED3[16], RXMBPENABLE, RXUNICASTSET,\n  RXUNICASTCLEAR, RXMAXLEN, RXBUFFEROFFSET, RXFILTERLOWTHRESH, RESERVED9[2], RXFLOWTHRESH[8],\n  RXFREEBUFFER[8], MACCONTROL, MACSTATUS, EMCONTROL, FIFOCONTROL, MACCONFIG,\n  SOFTRESET, RESERVED4[22], MACSRCADDRLO, MACSRCADDRHI, MACHASH1, MACHASH2,\n  BOFFTEST, TPACETEST, RXPAUSE, TXPAUSE, RESERVED5[4], RXGOODFRAMES, RXBCASTFRAMES,\n  RXMCASTFRAMES, RXPAUSEFRAMES, RXCRCERRORS, RXALIGNCODEERRORS, RXOVERSIZED,\n  RXJABBER, RXUNDERSIZED, RXFRAGMENTS, RXFILTERED, RXQOSFILTERED, RXOCTETS,\n  TXGOODFRAMES, TXBCASTFRAMES, TXMCASTFRAMES, TXPAUSEFRAMES, TXDEFERRED,\n  TXCOLLISION, TXSINGLECOLL, TXMULTICOLL, TXEXCESSIVECOLL, TXLATECOLL,\n  TXUNDERRUN, TXCARRIERSENSE, TXOCTETS, FRAME64, FRAME65T127, FRAME128T255,\n  FRAME256T511, FRAME512T1023, FRAME1024TUP, NETOCTETS, RXSOFOVERRUNS,\n  RXMOFOVERRUNS, RXDMAOVERRUNS, RESERVED6[156], MACADDRLO, MACADDRHI,\n  MACINDEX, RESERVED7[61], TXHDP[8], RXHDP[8], TXCP[8], RXCP[8];\n};\nstruct tms570_mdio {\n  volatile uint32_t REVID, CONTROL, ALIVE, LINK, LINKINTRAW, LINKINTMASKED,\n  RESERVED1[2], USERINTRAW, USERINTMASKED, USERINTMASKSET, USERINTMASKCLEAR,\n  RESERVED2[20], USERACCESS0, USERPHYSEL0, USERACCESS1, USERPHYSEL1;\n};\n#define SWAP32(x) ( (((x) & 0x000000FF) << 24) | \\\n                              (((x) & 0x0000FF00) << 8)  | \\\n                              (((x) & 0x00FF0000) >> 8)  | \\\n                              (((x) & 0xFF000000) >> 24) )\n#undef EMAC\n#undef EMAC_CTRL\n#undef MDIO\n#define EMAC ((struct tms570_emac *) (uintptr_t) 0xFCF78000)\n#define EMAC_CTRL ((struct tms570_emac_ctrl *) (uintptr_t) 0xFCF78800)\n#define MDIO ((struct tms570_mdio *) (uintptr_t) 0xFCF78900)\n#define ETH_PKT_SIZE 1540  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 4           // Descriptor size (words)\nstatic uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS] \n  __attribute__((section(\".ETH_CPPI\"), aligned(4)));      // TX descriptors\nstatic uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS] \n  __attribute__((section(\".ETH_CPPI\"), aligned(4)));      // RX descriptors\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE] \n  __attribute__((aligned(4)));  // RX ethernet buffers\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE] \n  __attribute__((aligned(4)));  // TX ethernet buffers\nstatic struct mg_tcpip_if *s_ifp;                    // MIP interface\nstatic uint16_t emac_read_phy(uint8_t addr, uint8_t reg) {\n  while(MDIO->USERACCESS0 & MG_BIT(31)) (void) 0;\n  MDIO->USERACCESS0 = MG_BIT(31) | ((reg & 0x1f) << 21) |\n                      ((addr & 0x1f) << 16);\n  while(MDIO->USERACCESS0 & MG_BIT(31)) (void) 0;\n  return MDIO->USERACCESS0 & 0xffff;\n}\nstatic void emac_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  while(MDIO->USERACCESS0 & MG_BIT(31)) (void) 0;\n  MDIO->USERACCESS0 = MG_BIT(31) | MG_BIT(30) | ((reg & 0x1f) << 21) |\n                      ((addr & 0x1f) << 16) | (val & 0xffff);\n  while(MDIO->USERACCESS0 & MG_BIT(31)) (void) 0;\n}\nstatic bool mg_tcpip_driver_tms570_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_tms570_data *d =\n      (struct mg_tcpip_driver_tms570_data *) ifp->driver_data;\n  s_ifp = ifp;\n  EMAC_CTRL->SOFTRESET = MG_BIT(0); // Reset the EMAC Control Module\n  while(EMAC_CTRL->SOFTRESET & MG_BIT(0)) (void) 0; // wait\n  EMAC->SOFTRESET = MG_BIT(0); // Reset the EMAC Module\n  while(EMAC->SOFTRESET & MG_BIT(0)) (void) 0;\n  EMAC->MACCONTROL = 0;\n  EMAC->RXCONTROL = 0;\n  EMAC->TXCONTROL = 0;\n  // Initialize all the header descriptor pointer registers\n  uint32_t i;\n  for(i =  0; i < ETH_DESC_CNT; i++) {\n    EMAC->RXHDP[i] = 0;\n    EMAC->TXHDP[i] = 0;\n    EMAC->RXCP[i] = 0;\n    EMAC->TXCP[i] = 0;\n    ///EMAC->RXFREEBUFFER[i] = 0xff;\n  }\n  // Clear the interrupt enable for all the channels\n  EMAC->TXINTMASKCLEAR = 0xff;\n  EMAC->RXINTMASKCLEAR = 0xff;\n  EMAC->MACHASH1 = 0;\n  EMAC->MACHASH2 = 0;\n  EMAC->RXBUFFEROFFSET = 0;\n  EMAC->RXUNICASTCLEAR = 0xff;\n  EMAC->RXUNICASTSET = 0;\n  EMAC->RXMBPENABLE = 0;\n  // init MDIO\n  // MDIO_CLK frequency = VCLK3/(CLKDIV + 1). (MDIO must be between 1.0 - 2.5Mhz)\n  uint32_t clkdiv = 75; // VCLK is configured to 75Mhz\n  // CLKDIV, ENABLE, PREAMBLE, FAULTENB\n  MDIO->CONTROL = (clkdiv - 1) | MG_BIT(30) | MG_BIT(20) | MG_BIT(18);\n  volatile int delay = 0xfff;\n  while (delay-- != 0) (void) 0;\n  struct mg_phy phy = {emac_read_phy, emac_write_phy};\n  mg_phy_init(&phy, d->phy_addr, MG_PHY_CLOCKS_MAC);\n  uint32_t channel;\n  for (channel = 0; channel < 8; channel++) {\n    EMAC->MACINDEX = channel;\n    EMAC->MACADDRHI = ifp->mac[0] | (ifp->mac[1] << 8) | (ifp->mac[2] << 16) |\n                       (ifp->mac[3] << 24);\n    EMAC->MACADDRLO = ifp->mac[4] | (ifp->mac[5] << 8) | MG_BIT(20) |\n                      MG_BIT(19) | (channel << 16);\n  }\n  EMAC->RXUNICASTSET = 1; // accept unicast frames;\n\n  EMAC->RXMBPENABLE |= MG_BIT(30) | MG_BIT(13); // CRC, broadcast\n\n  // Initialize the descriptors\n  for (i = 0; i < ETH_DESC_CNT; i++) {\n    if (i < ETH_DESC_CNT - 1) {\n      s_txdesc[i][0] = 0;\n      s_rxdesc[i][0] = SWAP32(((uint32_t) &s_rxdesc[i + 1][0]));\n    }\n    s_txdesc[i][1] = SWAP32(((uint32_t) s_txbuf[i]));\n    s_rxdesc[i][1] = SWAP32(((uint32_t) s_rxbuf[i]));\n    s_txdesc[i][2] = 0;\n    s_rxdesc[i][2] = SWAP32(ETH_PKT_SIZE);\n    s_txdesc[i][3] = 0;\n    s_rxdesc[i][3] = SWAP32(MG_BIT(29)); // OWN\n  }\n  s_txdesc[ETH_DESC_CNT - 1][0] = 0;\n  s_rxdesc[ETH_DESC_CNT - 1][0] = 0;\n  \n  EMAC->MACCONTROL = MG_BIT(5) | MG_BIT(0); // Enable MII, Full-duplex\n  //EMAC->TXINTMASKSET = 1; // Enable TX interrupt\n  EMAC->RXINTMASKSET = 1; // Enable RX interrupt\n  //EMAC_CTRL->C0TXEN = 1; // TX completion interrupt\n  EMAC_CTRL->C0RXEN = 1; // RX completion interrupt\n  EMAC->TXCONTROL = 1; // TXEN\n  EMAC->RXCONTROL = 1; // RXEN\n  EMAC->RXHDP[0] = (uint32_t) &s_rxdesc[0][0];\n  return true;\n}\nstatic uint32_t s_txno;\nstatic size_t mg_tcpip_driver_tms570_tx(const void *buf, size_t len,\n                                      struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // fail\n  } else if ((s_txdesc[s_txno][3] & SWAP32(MG_BIT(29)))) {\n    ifp->nerr++;\n    MG_ERROR((\"No descriptors available\"));\n    len = 0;  // fail\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);     // Copy data\n    if (len < 128) len = 128;\n    s_txdesc[s_txno][2] = SWAP32((uint32_t) len);  // Set data len\n    s_txdesc[s_txno][3] =\n        SWAP32(MG_BIT(31) | MG_BIT(30) | MG_BIT(29) | len);  // SOP, EOP, OWN, length\n    \n    while(EMAC->TXHDP[0] != 0) (void) 0;\n    EMAC->TXHDP[0] = (uint32_t) &s_txdesc[s_txno][0];\n    if(++s_txno == ETH_DESC_CNT) {\n      s_txno = 0;\n    }\n  }\n  return len;\n  (void) ifp;\n}\n\nstatic void mg_tcpip_driver_tms570_update_hash_table(struct mg_tcpip_if *ifp) {\n  // TODO(): read database, rebuild hash table\n  // Setting Hash Index for 01:00:5e:00:00:fb (multicast)\n  // using TMS570 XOR method (32.5.37).\n  // computed hash is 55, which means bit 23 (55 - 32) in\n  // HASH2 register must be set\n  EMAC->MACHASH2 = MG_BIT(23);\n  EMAC->RXMBPENABLE = MG_BIT(5); // enable hash filtering\n  (void) ifp;\n}\n\nstatic bool mg_tcpip_driver_tms570_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    mg_tcpip_driver_tms570_update_hash_table(ifp);\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  struct mg_tcpip_driver_tms570_data *d =\n      (struct mg_tcpip_driver_tms570_data *) ifp->driver_data;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {emac_read_phy, emac_write_phy};\n  if (!s1) return false;\n  up = mg_phy_up(&phy, d->phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {\n    // link state just went up\n    MG_DEBUG((\"Link is %uM %s-duplex\", speed == MG_PHY_SPEED_10M ? 10 : 100,\n              full_duplex ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\n#pragma CODE_STATE(EMAC_TX_IRQHandler, 32)\n#pragma INTERRUPT(EMAC_TX_IRQHandler, IRQ)\nvoid EMAC_TX_IRQHandler(void) {\n  uint32_t status = EMAC_CTRL->C0TXSTAT;\n  if (status & 1) { // interrupt caused on channel 0\n    while(s_txdesc[s_txno][3] & SWAP32(MG_BIT(29))) (void) 0;\n    EMAC->TXCP[0] = (uint32_t) &s_txdesc[s_txno][0];\n  }\n  //Write the DMA end of interrupt vector\n  EMAC->MACEOIVECTOR = 2;\n}\nstatic uint32_t s_rxno;\n#pragma CODE_STATE(EMAC_RX_IRQHandler, 32)\n#pragma INTERRUPT(EMAC_RX_IRQHandler, IRQ)\nvoid EMAC_RX_IRQHandler(void) {\n  uint32_t status = EMAC_CTRL->C0RXSTAT;\n  if (status & 1) { // Frame received, loop\n    uint32_t i;\n    //MG_INFO((\"RX interrupt\"));\n    for (i = 0; i < 10; i++) {   // read as they arrive but not forever\n      if (s_rxdesc[s_rxno][3] & SWAP32(MG_BIT(29))) break;\n      uint32_t len = SWAP32(s_rxdesc[s_rxno][3]) & 0xffff;\n      //MG_INFO((\"recv len: %d\", len));\n      //mg_hexdump(s_rxbuf[s_rxno], len);\n      mg_tcpip_qwrite(s_rxbuf[s_rxno], len > 4 ? len - 4 : len, s_ifp);\n      uint32_t flags = s_rxdesc[s_rxno][3];\n      s_rxdesc[s_rxno][3] = SWAP32(MG_BIT(29));\n      s_rxdesc[s_rxno][2] = SWAP32(ETH_PKT_SIZE);\n      EMAC->RXCP[0] = (uint32_t) &s_rxdesc[s_rxno][0];\n      if (flags & SWAP32(MG_BIT(28))) {\n        //MG_INFO((\"EOQ detected\"));\n        EMAC->RXHDP[0] = (uint32_t) &s_rxdesc[0][0];\n      }\n      if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n    }\n  }\n  //Write the DMA end of interrupt vector\n  EMAC->MACEOIVECTOR = 1;\n}\nstruct mg_tcpip_driver mg_tcpip_driver_tms570 = {mg_tcpip_driver_tms570_init,\n                                               mg_tcpip_driver_tms570_tx, NULL,\n                                               mg_tcpip_driver_tms570_poll};\n#endif\n\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/w5100.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_W5100) && MG_ENABLE_DRIVER_W5100\n\nstatic void w5100_txn(struct mg_tcpip_spi *s, uint16_t addr, bool wr, void *buf,\n                      size_t len) {\n  size_t i;\n  uint8_t *p = (uint8_t *) buf;\n  uint8_t control = wr ? 0xF0 : 0x0F;\n  uint8_t cmd[] = {control, (uint8_t) (addr >> 8), (uint8_t) (addr & 255)};\n  s->begin(s->spi);\n  for (i = 0; i < sizeof(cmd); i++) s->txn(s->spi, cmd[i]);\n  for (i = 0; i < len; i++) {\n    uint8_t r = s->txn(s->spi, p[i]);\n    if (!wr) p[i] = r;\n  }\n  s->end(s->spi);\n}\n\n// clang-format off\nstatic  void w5100_wn(struct mg_tcpip_spi *s, uint16_t addr, void *buf, size_t len) { w5100_txn(s, addr, true, buf, len); }\nstatic  void w5100_w1(struct mg_tcpip_spi *s, uint16_t addr, uint8_t val) { w5100_wn(s, addr, &val, 1); }\nstatic  void w5100_w2(struct mg_tcpip_spi *s, uint16_t addr, uint16_t val) { uint8_t buf[2] = {(uint8_t) (val >> 8), (uint8_t) (val & 255)}; w5100_wn(s, addr, buf, sizeof(buf)); }\nstatic  void w5100_rn(struct mg_tcpip_spi *s, uint16_t addr, void *buf, size_t len) { w5100_txn(s, addr, false, buf, len); }\nstatic  uint8_t w5100_r1(struct mg_tcpip_spi *s, uint16_t addr) { uint8_t r = 0; w5100_rn(s, addr, &r, 1); return r; }\nstatic  uint16_t w5100_r2(struct mg_tcpip_spi *s, uint16_t addr) { uint8_t buf[2] = {0, 0}; w5100_rn(s, addr, buf, sizeof(buf)); return (uint16_t) ((buf[0] << 8) | buf[1]); }\n// clang-format on\n\nstatic size_t w5100_rx(void *buf, size_t buflen, struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data;\n  uint16_t r = 0, n = 0, len = (uint16_t) buflen, n2;  // Read recv len\n  while ((n2 = w5100_r2(s, 0x426)) > n) n = n2;        // Until it is stable\n  if (n > 0) {\n    uint16_t ptr = w5100_r2(s, 0x428);  // Get read pointer\n    if (n <= len + 2 && n > 1) {\n      r = (uint16_t) (n - 2);\n    }\n    uint16_t rxbuf_size = (1 << (w5100_r1(s, 0x1a) & 3)) * 1024;\n    uint16_t rxbuf_addr = 0x6000;\n    uint16_t ptr_ofs = (ptr + 2) & (rxbuf_size - 1);\n    if (ptr_ofs + r < rxbuf_size) {\n      w5100_rn(s, rxbuf_addr + ptr_ofs, buf, r);\n    } else {\n      uint16_t remaining_len = rxbuf_size - ptr_ofs;\n      w5100_rn(s, rxbuf_addr + ptr_ofs, buf, remaining_len);\n      w5100_rn(s, rxbuf_addr, buf + remaining_len, n - remaining_len);\n    }\n    w5100_w2(s, 0x428, (uint16_t) (ptr + n));\n    w5100_w1(s, 0x401, 0x40);  // Sock0 CR -> RECV\n  }\n  return r;\n}\n\nstatic size_t w5100_tx(const void *buf, size_t buflen,\n                       struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data;\n  uint16_t i, n = 0, ptr = 0, len = (uint16_t) buflen;\n  while (n < len) n = w5100_r2(s, 0x420);  // Wait for space\n  ptr = w5100_r2(s, 0x424);                // Get write pointer\n  uint16_t txbuf_size = (1 << (w5100_r1(s, 0x1b) & 3)) * 1024;\n  uint16_t ptr_ofs = ptr & (txbuf_size - 1);\n  uint16_t txbuf_addr = 0x4000;\n  if (ptr_ofs + len > txbuf_size) {\n    uint16_t size = txbuf_size - ptr_ofs;\n    w5100_wn(s, txbuf_addr + ptr_ofs, (char *) buf, size);\n    w5100_wn(s, txbuf_addr, (char *) buf + size, len - size);\n  } else {\n    w5100_wn(s, txbuf_addr + ptr_ofs, (char *) buf, len);\n  }\n  w5100_w2(s, 0x424, (uint16_t) (ptr + len));  // Advance write pointer\n  w5100_w1(s, 0x401, 0x20);                    // Sock0 CR -> SEND\n  for (i = 0; i < 40; i++) {\n    uint8_t ir = w5100_r1(s, 0x402);  // Read S0 IR\n    if (ir == 0) continue;\n    // printf(\"IR %d, len=%d, free=%d, ptr %d\\n\", ir, (int) len, (int) n, ptr);\n    w5100_w1(s, 0x402, ir);    // Write S0 IR: clear it!\n    if (ir & 8) len = 0;       // Timeout. Report error\n    if (ir & (16 | 8)) break;  // Stop on SEND_OK or timeout\n  }\n  return len;\n}\n\nstatic bool w5100_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data;\n  s->end(s->spi);\n  w5100_w1(s, 0, 0x80);               // Reset chip: CR -> 0x80\n  w5100_w1(s, 0x72, 0x53);            // CR PHYLCKR -> unlock PHY\n  w5100_w1(s, 0x46, 0);               // CR PHYCR0 -> autonegotiation\n  w5100_w1(s, 0x47, 0);               // CR PHYCR1 -> reset\n  w5100_w1(s, 0x72, 0x00);            // CR PHYLCKR -> lock PHY\n  w5100_wn(s, 0x09, ifp->mac, 6);     // SHAR\n  w5100_w1(s, 0x1a, 6);               // Sock0 RX buf size - 4KB\n  w5100_w1(s, 0x1b, 6);               // Sock0 TX buf size - 4KB\n  w5100_w1(s, 0x400, 0x44);           // Sock0 MR -> MACRAW, MAC filter\n  w5100_w1(s, 0x401, 1);              // Sock0 CR -> OPEN\n  return w5100_r1(s, 0x403) == 0x42;  // Sock0 SR == MACRAW\n}\n\nstatic bool w5100_poll(struct mg_tcpip_if *ifp, bool s1) {\n  struct mg_tcpip_spi *spi = (struct mg_tcpip_spi *) ifp->driver_data;\n  return s1 ? w5100_r1(spi, 0x3c /* PHYSR */) & 1\n            : false;  // Bit 0 of PHYSR is LNK (0 - down, 1 - up)\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_w5100 = {w5100_init, w5100_tx, w5100_rx,\n                                                w5100_poll};\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/w5500.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_W5500) && MG_ENABLE_DRIVER_W5500\n\nenum { W5500_CR = 0, W5500_S0 = 1, W5500_TX0 = 2, W5500_RX0 = 3 };\n\nstatic void w5500_txn(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr,\n                      bool wr, void *buf, size_t len) {\n  size_t i;\n  uint8_t *p = (uint8_t *) buf;\n  uint8_t cmd[] = {(uint8_t) (addr >> 8), (uint8_t) (addr & 255),\n                   (uint8_t) ((block << 3) | (wr ? 4 : 0))};\n  s->begin(s->spi);\n  for (i = 0; i < sizeof(cmd); i++) s->txn(s->spi, cmd[i]);\n  for (i = 0; i < len; i++) {\n    uint8_t r = s->txn(s->spi, p[i]);\n    if (!wr) p[i] = r;\n  }\n  s->end(s->spi);\n}\n\n// clang-format off\nstatic  void w5500_wn(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr, void *buf, size_t len) { w5500_txn(s, block, addr, true, buf, len); }\nstatic  void w5500_w1(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr, uint8_t val) { w5500_wn(s, block, addr, &val, 1); }\nstatic  void w5500_w2(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr, uint16_t val) { uint8_t buf[2] = {(uint8_t) (val >> 8), (uint8_t) (val & 255)}; w5500_wn(s, block, addr, buf, sizeof(buf)); }\nstatic  void w5500_rn(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr, void *buf, size_t len) { w5500_txn(s, block, addr, false, buf, len); }\nstatic  uint8_t w5500_r1(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr) { uint8_t r = 0; w5500_rn(s, block, addr, &r, 1); return r; }\nstatic  uint16_t w5500_r2(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr) { uint8_t buf[2] = {0, 0}; w5500_rn(s, block, addr, buf, sizeof(buf)); return (uint16_t) ((buf[0] << 8) | buf[1]); }\n// clang-format on\n\nstatic size_t w5500_rx(void *buf, size_t buflen, struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data;\n  uint16_t r = 0, n = 0, len = (uint16_t) buflen, n2;     // Read recv len\n  while ((n2 = w5500_r2(s, W5500_S0, 0x26)) > n) n = n2;  // Until it is stable\n  // printf(\"RSR: %d\\n\", (int) n);\n  if (n > 0) {\n    uint16_t ptr = w5500_r2(s, W5500_S0, 0x28);  // Get read pointer\n    n = w5500_r2(s, W5500_RX0, ptr);             // Read frame length\n    if (n <= len + 2 && n > 1) {\n      r = (uint16_t) (n - 2);\n      w5500_rn(s, W5500_RX0, (uint16_t) (ptr + 2), buf, r);\n    }\n    w5500_w2(s, W5500_S0, 0x28, (uint16_t) (ptr + n));  // Advance read pointer\n    w5500_w1(s, W5500_S0, 1, 0x40);                     // Sock0 CR -> RECV\n    // printf(\"  RX_RD: tot=%u n=%u r=%u\\n\", n2, n, r);\n  }\n  return r;\n}\n\nstatic size_t w5500_tx(const void *buf, size_t buflen,\n                       struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data;\n  uint16_t i, ptr, n = 0, len = (uint16_t) buflen;\n  while (n < len) n = w5500_r2(s, W5500_S0, 0x20);      // Wait for space\n  ptr = w5500_r2(s, W5500_S0, 0x24);                    // Get write pointer\n  w5500_wn(s, W5500_TX0, ptr, (void *) buf, len);       // Write data\n  w5500_w2(s, W5500_S0, 0x24, (uint16_t) (ptr + len));  // Advance write pointer\n  w5500_w1(s, W5500_S0, 1, 0x20);                       // Sock0 CR -> SEND\n  for (i = 0; i < 40; i++) {\n    uint8_t ir = w5500_r1(s, W5500_S0, 2);  // Read S0 IR\n    if (ir == 0) continue;\n    // printf(\"IR %d, len=%d, free=%d, ptr %d\\n\", ir, (int) len, (int) n, ptr);\n    w5500_w1(s, W5500_S0, 2, ir);  // Write S0 IR: clear it!\n    if (ir & 8) len = 0;           // Timeout. Report error\n    if (ir & (16 | 8)) break;      // Stop on SEND_OK or timeout\n  }\n  return len;\n}\n\nstatic bool w5500_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data;\n  s->end(s->spi);\n  w5500_w1(s, W5500_CR, 0, 0x80);     // Reset chip: CR -> 0x80\n  w5500_w1(s, W5500_CR, 0x2e, 0);     // CR PHYCFGR -> reset\n  w5500_w1(s, W5500_CR, 0x2e, 0xf8);  // CR PHYCFGR -> set\n  // w5500_wn(s, W5500_CR, 9, s->mac, 6);      // Set source MAC\n  w5500_w1(s, W5500_S0, 0x1e, 16);          // Sock0 RX buf size\n  w5500_w1(s, W5500_S0, 0x1f, 16);          // Sock0 TX buf size\n  w5500_w1(s, W5500_S0, 0, 4);              // Sock0 MR -> MACRAW\n  w5500_w1(s, W5500_S0, 1, 1);              // Sock0 CR -> OPEN\n  return w5500_r1(s, W5500_S0, 3) == 0x42;  // Sock0 SR == MACRAW\n}\n\nstatic bool w5500_poll(struct mg_tcpip_if *ifp, bool s1) {\n  struct mg_tcpip_spi *spi = (struct mg_tcpip_spi *) ifp->driver_data;\n  return s1 ? w5500_r1(spi, W5500_CR, 0x2e /* PHYCFGR */) & 1\n            : false;  // Bit 0 of PHYCFGR is LNK (0 - down, 1 - up)\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_w5500 = {w5500_init, w5500_tx, w5500_rx,\n                                                w5500_poll};\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/xmc.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_XMC) && MG_ENABLE_DRIVER_XMC\n\nstruct ETH_GLOBAL_TypeDef {\n  volatile uint32_t MAC_CONFIGURATION, MAC_FRAME_FILTER, HASH_TABLE_HIGH,\n      HASH_TABLE_LOW, GMII_ADDRESS, GMII_DATA, FLOW_CONTROL, VLAN_TAG, VERSION,\n      DEBUG, REMOTE_WAKE_UP_FRAME_FILTER, PMT_CONTROL_STATUS, RESERVED[2],\n      INTERRUPT_STATUS, INTERRUPT_MASK, MAC_ADDRESS0_HIGH, MAC_ADDRESS0_LOW,\n      MAC_ADDRESS1_HIGH, MAC_ADDRESS1_LOW, MAC_ADDRESS2_HIGH, MAC_ADDRESS2_LOW,\n      MAC_ADDRESS3_HIGH, MAC_ADDRESS3_LOW, RESERVED1[40], MMC_CONTROL,\n      MMC_RECEIVE_INTERRUPT, MMC_TRANSMIT_INTERRUPT, MMC_RECEIVE_INTERRUPT_MASK,\n      MMC_TRANSMIT_INTERRUPT_MASK, TX_STATISTICS[26], RESERVED2,\n      RX_STATISTICS_1[26], RESERVED3[6], MMC_IPC_RECEIVE_INTERRUPT_MASK,\n      RESERVED4, MMC_IPC_RECEIVE_INTERRUPT, RESERVED5, RX_STATISTICS_2[30],\n      RESERVED7[286], TIMESTAMP_CONTROL, SUB_SECOND_INCREMENT,\n      SYSTEM_TIME_SECONDS, SYSTEM_TIME_NANOSECONDS, SYSTEM_TIME_SECONDS_UPDATE,\n      SYSTEM_TIME_NANOSECONDS_UPDATE, TIMESTAMP_ADDEND, TARGET_TIME_SECONDS,\n      TARGET_TIME_NANOSECONDS, SYSTEM_TIME_HIGHER_WORD_SECONDS,\n      TIMESTAMP_STATUS, PPS_CONTROL, RESERVED8[564], BUS_MODE,\n      TRANSMIT_POLL_DEMAND, RECEIVE_POLL_DEMAND,\n      RECEIVE_DESCRIPTOR_LIST_ADDRESS, TRANSMIT_DESCRIPTOR_LIST_ADDRESS, STATUS,\n      OPERATION_MODE, INTERRUPT_ENABLE,\n      MISSED_FRAME_AND_BUFFER_OVERFLOW_COUNTER,\n      RECEIVE_INTERRUPT_WATCHDOG_TIMER, RESERVED9, AHB_STATUS, RESERVED10[6],\n      CURRENT_HOST_TRANSMIT_DESCRIPTOR, CURRENT_HOST_RECEIVE_DESCRIPTOR,\n      CURRENT_HOST_TRANSMIT_BUFFER_ADDRESS, CURRENT_HOST_RECEIVE_BUFFER_ADDRESS,\n      HW_FEATURE;\n};\n\n#undef ETH0\n#define ETH0 ((struct ETH_GLOBAL_TypeDef *) 0x5000C000UL)\n\n#define ETH_PKT_SIZE 1536  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 4           // Descriptor size (words)\n\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM;\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM;\nstatic uint32_t s_rxdesc[ETH_DESC_CNT]\n                        [ETH_DS] MG_ETH_RAM;  // RX descriptors\nstatic uint32_t s_txdesc[ETH_DESC_CNT]\n                        [ETH_DS] MG_ETH_RAM;  // TX descriptors\nstatic uint8_t s_txno;                             // Current TX descriptor\nstatic uint8_t s_rxno;                             // Current RX descriptor\n\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\nenum { MG_PHY_ADDR = 0, MG_PHYREG_BCR = 0, MG_PHYREG_BSR = 1 };\n\nstatic uint16_t eth_read_phy(uint8_t addr, uint8_t reg) {\n  ETH0->GMII_ADDRESS = (ETH0->GMII_ADDRESS & 0x3c) | ((uint32_t) addr << 11) |\n                       ((uint32_t) reg << 6) | 1;\n  while ((ETH0->GMII_ADDRESS & 1) != 0) (void) 0;\n  return (uint16_t) (ETH0->GMII_DATA & 0xffff);\n}\n\nstatic void eth_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  ETH0->GMII_DATA = val;\n  ETH0->GMII_ADDRESS = (ETH0->GMII_ADDRESS & 0x3c) | ((uint32_t) addr << 11) |\n                       ((uint32_t) reg << 6) | 3;\n  while ((ETH0->GMII_ADDRESS & 1) != 0) (void) 0;\n}\n\nstatic uint32_t get_clock_rate(struct mg_tcpip_driver_xmc_data *d) {\n  if (d->mdc_cr == -1) {\n    // assume ETH clock is 60MHz by default\n    // then according to 13.2.8.1, we need to set value 3\n    return 3;\n  }\n\n  return d->mdc_cr;\n}\n\nstatic bool mg_tcpip_driver_xmc_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_xmc_data *d =\n      (struct mg_tcpip_driver_xmc_data *) ifp->driver_data;\n  s_ifp = ifp;\n\n  // reset MAC\n  ETH0->BUS_MODE |= 1;\n  while (ETH0->BUS_MODE & 1) (void) 0;\n\n  // set clock rate\n  ETH0->GMII_ADDRESS = get_clock_rate(d) << 2;\n\n  // init phy\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  mg_phy_init(&phy, d->phy_addr, MG_PHY_CLOCKS_MAC);\n\n  // configure MAC: DO, DM, FES, TC\n  ETH0->MAC_CONFIGURATION = MG_BIT(13) | MG_BIT(11) | MG_BIT(14) | MG_BIT(24);\n\n  // set the MAC address\n  ETH0->MAC_ADDRESS0_HIGH = MG_U32(0, 0, ifp->mac[5], ifp->mac[4]);\n  ETH0->MAC_ADDRESS0_LOW =\n      MG_U32(ifp->mac[3], ifp->mac[2], ifp->mac[1], ifp->mac[0]);\n\n  // Configure the receive filter\n  ETH0->MAC_FRAME_FILTER = MG_BIT(10);  // Perfect filter\n  // Disable flow control\n  ETH0->FLOW_CONTROL = 0;\n  // Enable store and forward mode\n  ETH0->OPERATION_MODE = MG_BIT(25) | MG_BIT(21);  // RSF, TSF\n\n  // Configure DMA bus mode (AAL, USP, RPBL, PBL)\n  ETH0->BUS_MODE = MG_BIT(25) | MG_BIT(23) | (32 << 17) | (32 << 8);\n\n  // init RX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i][0] = MG_BIT(31);  // OWN descriptor\n    s_rxdesc[i][1] = MG_BIT(14) | ETH_PKT_SIZE;\n    s_rxdesc[i][2] = (uint32_t) s_rxbuf[i];\n    if (i == ETH_DESC_CNT - 1) {\n      s_rxdesc[i][3] = (uint32_t) &s_rxdesc[0][0];\n    } else {\n      s_rxdesc[i][3] = (uint32_t) &s_rxdesc[i + 1][0];\n    }\n  }\n  ETH0->RECEIVE_DESCRIPTOR_LIST_ADDRESS = (uint32_t) &s_rxdesc[0][0];\n\n  // init TX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_txdesc[i][0] = MG_BIT(30) | MG_BIT(20);\n    s_txdesc[i][2] = (uint32_t) s_txbuf[i];\n    if (i == ETH_DESC_CNT - 1) {\n      s_txdesc[i][3] = (uint32_t) &s_txdesc[0][0];\n    } else {\n      s_txdesc[i][3] = (uint32_t) &s_txdesc[i + 1][0];\n    }\n  }\n  ETH0->TRANSMIT_DESCRIPTOR_LIST_ADDRESS = (uint32_t) &s_txdesc[0][0];\n\n  // Clear interrupts\n  ETH0->STATUS = 0xFFFFFFFF;\n\n  // Disable MAC interrupts\n  ETH0->MMC_TRANSMIT_INTERRUPT_MASK = 0xFFFFFFFF;\n  ETH0->MMC_RECEIVE_INTERRUPT_MASK = 0xFFFFFFFF;\n  ETH0->MMC_IPC_RECEIVE_INTERRUPT_MASK = 0xFFFFFFFF;\n  ETH0->INTERRUPT_MASK = MG_BIT(9) | MG_BIT(3);  // TSIM, PMTIM\n\n  // Enable interrupts (NIE, RIE, TIE)\n  ETH0->INTERRUPT_ENABLE = MG_BIT(16) | MG_BIT(6) | MG_BIT(0);\n\n  // Enable MAC transmission and reception (TE, RE)\n  ETH0->MAC_CONFIGURATION |= MG_BIT(3) | MG_BIT(2);\n  // Enable DMA transmission and reception (ST, SR)\n  ETH0->OPERATION_MODE |= MG_BIT(13) | MG_BIT(1);\n  return true;\n}\n\nstatic size_t mg_tcpip_driver_xmc_tx(const void *buf, size_t len,\n                                     struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // Frame is too big\n  } else if ((s_txdesc[s_txno][0] & MG_BIT(31))) {\n    ifp->nerr++;\n    MG_ERROR((\"No free descriptors\"));\n    len = 0;  // All descriptors are busy, fail\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);\n    s_txdesc[s_txno][1] = len;\n    // Table 13-19 Transmit Descriptor Word 0 (IC, LS, FS, TCH)\n    s_txdesc[s_txno][0] = MG_BIT(30) | MG_BIT(29) | MG_BIT(28) | MG_BIT(20);\n    s_txdesc[s_txno][0] |= MG_BIT(31);  // OWN bit: handle control to DMA\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n\n  // Resume processing\n  ETH0->STATUS = MG_BIT(2);  // clear Transmit unavailable\n  ETH0->TRANSMIT_POLL_DEMAND = 0;\n  return len;\n}\n\nstatic void mg_tcpip_driver_xmc_update_hash_table(struct mg_tcpip_if *ifp) {\n  // TODO(): read database, rebuild hash table\n  // set the multicast address filter\n  ETH0->MAC_ADDRESS1_HIGH =\n      MG_U32(0, 0, mcast_addr[5], mcast_addr[4]) | MG_BIT(31);\n  ETH0->MAC_ADDRESS1_LOW =\n      MG_U32(mcast_addr[3], mcast_addr[2], mcast_addr[1], mcast_addr[0]);\n  (void) ifp;\n}\n\nstatic bool mg_tcpip_driver_xmc_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    mg_tcpip_driver_xmc_update_hash_table(ifp);\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  struct mg_tcpip_driver_xmc_data *d =\n      (struct mg_tcpip_driver_xmc_data *) ifp->driver_data;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  up = mg_phy_up(&phy, d->phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    MG_DEBUG((\"Link is %uM %s-duplex\", speed == MG_PHY_SPEED_10M ? 10 : 100,\n              full_duplex ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\nvoid ETH0_0_IRQHandler(void);\nvoid ETH0_0_IRQHandler(void) {\n  uint32_t irq_status = ETH0->STATUS;\n\n  // check if a frame was received\n  if (irq_status & MG_BIT(6)) {\n    for (uint8_t i = 0; i < 10; i++) {  // read as they arrive, but not forever\n      if (s_rxdesc[s_rxno][0] & MG_BIT(31)) break;\n      size_t len = (s_rxdesc[s_rxno][0] & 0x3fff0000) >> 16;\n      mg_tcpip_qwrite(s_rxbuf[s_rxno], len, s_ifp);\n      s_rxdesc[s_rxno][0] = MG_BIT(31);  // OWN bit: handle control to DMA\n      // Resume processing\n      ETH0->STATUS = MG_BIT(7) | MG_BIT(6);  // clear RU and RI\n      ETH0->RECEIVE_POLL_DEMAND = 0;\n      if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n    }\n    ETH0->STATUS = MG_BIT(6);\n  }\n\n  // clear Successful transmission interrupt\n  if (irq_status & 1) {\n    ETH0->STATUS = 1;\n  }\n\n  // clear normal interrupt\n  if (irq_status & MG_BIT(16)) {\n    ETH0->STATUS = MG_BIT(16);\n  }\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_xmc = {mg_tcpip_driver_xmc_init,\n                                              mg_tcpip_driver_xmc_tx, NULL,\n                                              mg_tcpip_driver_xmc_poll};\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/xmc7.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_XMC7) && MG_ENABLE_DRIVER_XMC7\n\nstruct ETH_Type {\n  volatile uint32_t CTL, STATUS, RESERVED[1022], NETWORK_CONTROL,\n      NETWORK_CONFIG, NETWORK_STATUS, USER_IO_REGISTER, DMA_CONFIG,\n      TRANSMIT_STATUS, RECEIVE_Q_PTR, TRANSMIT_Q_PTR, RECEIVE_STATUS,\n      INT_STATUS, INT_ENABLE, INT_DISABLE, INT_MASK, PHY_MANAGEMENT, PAUSE_TIME,\n      TX_PAUSE_QUANTUM, PBUF_TXCUTTHRU, PBUF_RXCUTTHRU, JUMBO_MAX_LENGTH,\n      EXTERNAL_FIFO_INTERFACE, RESERVED1, AXI_MAX_PIPELINE, RSC_CONTROL,\n      INT_MODERATION, SYS_WAKE_TIME, RESERVED2[7], HASH_BOTTOM, HASH_TOP,\n      SPEC_ADD1_BOTTOM, SPEC_ADD1_TOP, SPEC_ADD2_BOTTOM, SPEC_ADD2_TOP,\n      SPEC_ADD3_BOTTOM, SPEC_ADD3_TOP, SPEC_ADD4_BOTTOM, SPEC_ADD4_TOP,\n      SPEC_TYPE1, SPEC_TYPE2, SPEC_TYPE3, SPEC_TYPE4, WOL_REGISTER,\n      STRETCH_RATIO, STACKED_VLAN, TX_PFC_PAUSE, MASK_ADD1_BOTTOM,\n      MASK_ADD1_TOP, DMA_ADDR_OR_MASK, RX_PTP_UNICAST, TX_PTP_UNICAST,\n      TSU_NSEC_CMP, TSU_SEC_CMP, TSU_MSB_SEC_CMP, TSU_PTP_TX_MSB_SEC,\n      TSU_PTP_RX_MSB_SEC, TSU_PEER_TX_MSB_SEC, TSU_PEER_RX_MSB_SEC,\n      DPRAM_FILL_DBG, REVISION_REG, OCTETS_TXED_BOTTOM, OCTETS_TXED_TOP,\n      FRAMES_TXED_OK, BROADCAST_TXED, MULTICAST_TXED, PAUSE_FRAMES_TXED,\n      FRAMES_TXED_64, FRAMES_TXED_65, FRAMES_TXED_128, FRAMES_TXED_256,\n      FRAMES_TXED_512, FRAMES_TXED_1024, FRAMES_TXED_1519, TX_UNDERRUNS,\n      SINGLE_COLLISIONS, MULTIPLE_COLLISIONS, EXCESSIVE_COLLISIONS,\n      LATE_COLLISIONS, DEFERRED_FRAMES, CRS_ERRORS, OCTETS_RXED_BOTTOM,\n      OCTETS_RXED_TOP, FRAMES_RXED_OK, BROADCAST_RXED, MULTICAST_RXED,\n      PAUSE_FRAMES_RXED, FRAMES_RXED_64, FRAMES_RXED_65, FRAMES_RXED_128,\n      FRAMES_RXED_256, FRAMES_RXED_512, FRAMES_RXED_1024, FRAMES_RXED_1519,\n      UNDERSIZE_FRAMES, EXCESSIVE_RX_LENGTH, RX_JABBERS, FCS_ERRORS,\n      RX_LENGTH_ERRORS, RX_SYMBOL_ERRORS, ALIGNMENT_ERRORS, RX_RESOURCE_ERRORS,\n      RX_OVERRUNS, RX_IP_CK_ERRORS, RX_TCP_CK_ERRORS, RX_UDP_CK_ERRORS,\n      AUTO_FLUSHED_PKTS, RESERVED3, TSU_TIMER_INCR_SUB_NSEC, TSU_TIMER_MSB_SEC,\n      TSU_STROBE_MSB_SEC, TSU_STROBE_SEC, TSU_STROBE_NSEC, TSU_TIMER_SEC,\n      TSU_TIMER_NSEC, TSU_TIMER_ADJUST, TSU_TIMER_INCR, TSU_PTP_TX_SEC,\n      TSU_PTP_TX_NSEC, TSU_PTP_RX_SEC, TSU_PTP_RX_NSEC, TSU_PEER_TX_SEC,\n      TSU_PEER_TX_NSEC, TSU_PEER_RX_SEC, TSU_PEER_RX_NSEC, PCS_CONTROL,\n      PCS_STATUS, RESERVED4[2], PCS_AN_ADV, PCS_AN_LP_BASE, PCS_AN_EXP,\n      PCS_AN_NP_TX, PCS_AN_LP_NP, RESERVED5[6], PCS_AN_EXT_STATUS, RESERVED6[8],\n      TX_PAUSE_QUANTUM1, TX_PAUSE_QUANTUM2, TX_PAUSE_QUANTUM3, RESERVED7,\n      RX_LPI, RX_LPI_TIME, TX_LPI, TX_LPI_TIME, DESIGNCFG_DEBUG1,\n      DESIGNCFG_DEBUG2, DESIGNCFG_DEBUG3, DESIGNCFG_DEBUG4, DESIGNCFG_DEBUG5,\n      DESIGNCFG_DEBUG6, DESIGNCFG_DEBUG7, DESIGNCFG_DEBUG8, DESIGNCFG_DEBUG9,\n      DESIGNCFG_DEBUG10, RESERVED8[22], SPEC_ADD5_BOTTOM, SPEC_ADD5_TOP,\n      RESERVED9[60], SPEC_ADD36_BOTTOM, SPEC_ADD36_TOP, INT_Q1_STATUS,\n      INT_Q2_STATUS, INT_Q3_STATUS, RESERVED10[11], INT_Q15_STATUS, RESERVED11,\n      TRANSMIT_Q1_PTR, TRANSMIT_Q2_PTR, TRANSMIT_Q3_PTR, RESERVED12[11],\n      TRANSMIT_Q15_PTR, RESERVED13, RECEIVE_Q1_PTR, RECEIVE_Q2_PTR,\n      RECEIVE_Q3_PTR, RESERVED14[3], RECEIVE_Q7_PTR, RESERVED15,\n      DMA_RXBUF_SIZE_Q1, DMA_RXBUF_SIZE_Q2, DMA_RXBUF_SIZE_Q3, RESERVED16[3],\n      DMA_RXBUF_SIZE_Q7, CBS_CONTROL, CBS_IDLESLOPE_Q_A, CBS_IDLESLOPE_Q_B,\n      UPPER_TX_Q_BASE_ADDR, TX_BD_CONTROL, RX_BD_CONTROL, UPPER_RX_Q_BASE_ADDR,\n      RESERVED17[2], HIDDEN_REG0, HIDDEN_REG1, HIDDEN_REG2, HIDDEN_REG3,\n      RESERVED18[2], HIDDEN_REG4, HIDDEN_REG5;\n};\n\n#define ETH0 ((struct ETH_Type *) 0x40490000)\n\n#define ETH_PKT_SIZE 1536  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 2           // Descriptor size (words)\n\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM;\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM;\nstatic uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS] MG_ETH_RAM MG_8BYTE_ALIGNED;\nstatic uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS] MG_ETH_RAM MG_8BYTE_ALIGNED;\nstatic uint8_t s_txno;  // Current TX descriptor\nstatic uint8_t s_rxno;  // Current RX descriptor\n\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\nenum { MG_PHY_ADDR = 0, MG_PHYREG_BCR = 0, MG_PHYREG_BSR = 1 };\n\nstatic uint16_t eth_read_phy(uint8_t addr, uint8_t reg) {\n  // WRITE1, READ OPERATION, PHY, REG, WRITE10\n  ETH0->PHY_MANAGEMENT = MG_BIT(30) | MG_BIT(29) | ((addr & 0xf) << 24) |\n                         ((reg & 0x1f) << 18) | MG_BIT(17);\n  while ((ETH0->NETWORK_STATUS & MG_BIT(2)) == 0) (void) 0;\n  return ETH0->PHY_MANAGEMENT & 0xffff;\n}\n\nstatic void eth_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  ETH0->PHY_MANAGEMENT = MG_BIT(30) | MG_BIT(28) | ((addr & 0xf) << 24) |\n                         ((reg & 0x1f) << 18) | MG_BIT(17) | val;\n  while ((ETH0->NETWORK_STATUS & MG_BIT(2)) == 0) (void) 0;\n}\n\nstatic uint32_t get_clock_rate(struct mg_tcpip_driver_xmc7_data *d) {\n  // see ETH0 -> NETWORK_CONFIG register\n  (void) d;\n  return 3;\n}\n\nstatic bool mg_tcpip_driver_xmc7_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_xmc7_data *d =\n      (struct mg_tcpip_driver_xmc7_data *) ifp->driver_data;\n  s_ifp = ifp;\n\n  // enable controller, set RGMII mode\n  ETH0->CTL = MG_BIT(31) | (4 << 8) | 2;\n\n  uint32_t cr = get_clock_rate(d);\n  // set NSP change, ignore RX FCS, data bus width, clock rate\n  // frame length 1536, full duplex, speed\n  ETH0->NETWORK_CONFIG = MG_BIT(29) | MG_BIT(26) | MG_BIT(21) |\n                         ((cr & 7) << 18) | MG_BIT(8) | MG_BIT(1) | MG_BIT(0);\n\n  // config DMA settings: Force TX burst, Discard on Error, set RX buffer size\n  // to 1536, TX_PBUF_SIZE, RX_PBUF_SIZE, AMBA_BURST_LENGTH\n  ETH0->DMA_CONFIG =\n      MG_BIT(26) | MG_BIT(24) | (0x18 << 16) | MG_BIT(10) | (3 << 8) | 4;\n\n  // initialize descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i][0] = (uint32_t) s_rxbuf[i];\n    if (i == ETH_DESC_CNT - 1) {\n      s_rxdesc[i][0] |= MG_BIT(1);  // mark last descriptor\n    }\n\n    s_txdesc[i][0] = (uint32_t) s_txbuf[i];\n    s_txdesc[i][1] = MG_BIT(31);  // OWN descriptor\n    if (i == ETH_DESC_CNT - 1) {\n      s_txdesc[i][1] |= MG_BIT(30);  // mark last descriptor\n    }\n  }\n  ETH0->RECEIVE_Q_PTR = (uint32_t) s_rxdesc;\n  ETH0->TRANSMIT_Q_PTR = (uint32_t) s_txdesc;\n\n  // disable other queues\n  ETH0->TRANSMIT_Q2_PTR = 1;\n  ETH0->TRANSMIT_Q1_PTR = 1;\n  ETH0->RECEIVE_Q2_PTR = 1;\n  ETH0->RECEIVE_Q1_PTR = 1;\n\n  // enable interrupts (RX complete)\n  ETH0->INT_ENABLE = MG_BIT(1);\n\n  // set MAC address\n  ETH0->SPEC_ADD1_BOTTOM =\n      ifp->mac[3] << 24 | ifp->mac[2] << 16 | ifp->mac[1] << 8 | ifp->mac[0];\n  ETH0->SPEC_ADD1_TOP = ifp->mac[5] << 8 | ifp->mac[4];\n\n  // enable MDIO, TX, RX\n  ETH0->NETWORK_CONTROL = MG_BIT(4) | MG_BIT(3) | MG_BIT(2);\n\n  // start transmission\n  ETH0->NETWORK_CONTROL |= MG_BIT(9);\n\n  // init phy\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  mg_phy_init(&phy, d->phy_addr, MG_PHY_CLOCKS_MAC);\n\n  (void) d;\n  return true;\n}\n\nstatic size_t mg_tcpip_driver_xmc7_tx(const void *buf, size_t len,\n                                      struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // Frame is too big\n  } else if (((s_txdesc[s_txno][1] & MG_BIT(31)) == 0)) {\n    ifp->nerr++;\n    MG_ERROR((\"No free descriptors\"));\n    len = 0;  // All descriptors are busy, fail\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);\n    s_txdesc[s_txno][1] = (s_txno == ETH_DESC_CNT - 1 ? MG_BIT(30) : 0) |\n                          MG_BIT(15) | len;  // Last buffer and length\n\n    ETH0->NETWORK_CONTROL |= MG_BIT(9);  // enable transmission\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n\n  MG_DSB();\n  ETH0->TRANSMIT_STATUS = ETH0->TRANSMIT_STATUS;\n  ETH0->NETWORK_CONTROL |= MG_BIT(9);  // enable transmission\n\n  return len;\n}\n\nstatic void mg_tcpip_driver_xmc7_update_hash_table(struct mg_tcpip_if *ifp) {\n  // TODO(): read database, rebuild hash table\n  // set multicast MAC address\n  ETH0->SPEC_ADD2_BOTTOM = mcast_addr[3] << 24 | mcast_addr[2] << 16 |\n                           mcast_addr[1] << 8 | mcast_addr[0];\n  ETH0->SPEC_ADD2_TOP = mcast_addr[5] << 8 | mcast_addr[4];\n  (void) ifp;\n}\n\nstatic bool mg_tcpip_driver_xmc7_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    mg_tcpip_driver_xmc7_update_hash_table(ifp);\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  struct mg_tcpip_driver_xmc7_data *d =\n      (struct mg_tcpip_driver_xmc7_data *) ifp->driver_data;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  up = mg_phy_up(&phy, d->phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    // tmp = reg with flags set to the most likely situation: 100M full-duplex\n    // if(link is slow or half) set flags otherwise\n    // reg = tmp\n    uint32_t netconf = ETH0->NETWORK_CONFIG;\n    MG_SET_BITS(netconf, MG_BIT(10),\n                MG_BIT(1) | MG_BIT(0));  // 100M, Full-duplex\n    uint32_t ctl = ETH0->CTL;\n    MG_SET_BITS(ctl, 0xFF00, 4 << 8);  // /5 for 25M clock\n    if (speed == MG_PHY_SPEED_1000M) {\n      netconf |= MG_BIT(10);        // 1000M\n      MG_SET_BITS(ctl, 0xFF00, 0);  // /1 for 125M clock TODO() IS THIS NEEDED ?\n    } else if (speed == MG_PHY_SPEED_10M) {\n      netconf &= ~MG_BIT(0);         // 10M\n      MG_SET_BITS(ctl, 0xFF00, 49);  // /50 for 2.5M clock\n    }\n    if (full_duplex == false) netconf &= ~MG_BIT(1);  // Half-duplex\n    ETH0->NETWORK_CONFIG = netconf;  // IRQ handler does not fiddle with these\n    ETH0->CTL = ctl;\n    MG_DEBUG((\"Link is %uM %s-duplex\",\n              speed == MG_PHY_SPEED_10M\n                  ? 10\n                  : (speed == MG_PHY_SPEED_100M ? 100 : 1000),\n              full_duplex ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\nvoid ETH_IRQHandler(void) {\n  uint32_t irq_status = ETH0->INT_STATUS;\n  if (irq_status & MG_BIT(1)) {\n    for (uint8_t i = 0; i < 10; i++) {  // read as they arrive, but not forever\n      if ((s_rxdesc[s_rxno][0] & MG_BIT(0)) == 0) break;\n      size_t len = s_rxdesc[s_rxno][1] & (MG_BIT(13) - 1);\n      mg_tcpip_qwrite(s_rxbuf[s_rxno], len, s_ifp);\n      s_rxdesc[s_rxno][0] &= ~MG_BIT(0);  // OWN bit: handle control to DMA\n      if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n    }\n  }\n\n  ETH0->INT_STATUS = irq_status;\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_xmc7 = {mg_tcpip_driver_xmc7_init,\n                                               mg_tcpip_driver_xmc7_tx, NULL,\n                                               mg_tcpip_driver_xmc7_poll};\n#endif\n"
  },
  {
    "path": "mongoose.h",
    "content": "// Copyright (c) 2004-2013 Sergey Lyubka\n// Copyright (c) 2013-2025 Cesanta Software Limited\n// All rights reserved\n//\n// This software is dual-licensed: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License version 2 as\n// published by the Free Software Foundation. For the terms of this\n// license, see http://www.gnu.org/licenses/\n//\n// You are free to use this software under the terms of the GNU General\n// Public License, but WITHOUT ANY WARRANTY; without even the implied\n// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n// See the GNU General Public License for more details.\n//\n// Alternatively, you can license this software under a commercial\n// license, as set out in https://www.mongoose.ws/licensing/\n//\n// SPDX-License-Identifier: GPL-2.0-only or commercial\n\n#ifndef MONGOOSE_H\n#define MONGOOSE_H\n\n#define MG_VERSION \"7.20\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n#define MG_ARCH_CUSTOM 0        // User creates its own mongoose_config.h\n#define MG_ARCH_UNIX 1          // Linux, BSD, Mac, ...\n#define MG_ARCH_WIN32 2         // Windows\n#define MG_ARCH_ESP32 3         // ESP32\n#define MG_ARCH_ESP8266 4       // ESP8266\n#define MG_ARCH_FREERTOS 5      // FreeRTOS\n#define MG_ARCH_THREADX 6       // Eclipse ThreadX (former MS Azure RTOS)\n#define MG_ARCH_ZEPHYR 7        // Zephyr RTOS\n#define MG_ARCH_ARMGCC 8        // Plain ARM GCC\n#define MG_ARCH_CMSIS_RTOS1 9   // CMSIS-RTOS API v1 (Keil RTX)\n#define MG_ARCH_TIRTOS 10       // Texas Semi TI-RTOS\n#define MG_ARCH_PICOSDK 11      // Raspberry Pi Pico-SDK (RP2040, RP2350)\n#define MG_ARCH_ARMCC 12        // Keil MDK-Core with Configuration Wizard\n#define MG_ARCH_CMSIS_RTOS2 13  // CMSIS-RTOS API v2 (Keil RTX5, FreeRTOS)\n#define MG_ARCH_RTTHREAD 14     // RT-Thread RTOS\n#define MG_ARCH_ARMCGT 15       // Texas Semi ARM-CGT\n#define MG_ARCH_CUBE 16\t        // STM32Cube environment\n\n#define MG_ARCH_NEWLIB MG_ARCH_ARMGCC  // Alias, deprecate in 2025\n\n#if !defined(MG_ARCH)\n#if defined(__unix__) || defined(__APPLE__)\n#define MG_ARCH MG_ARCH_UNIX\n#elif defined(_WIN32)\n#define MG_ARCH MG_ARCH_WIN32\n#endif\n#endif  // !defined(MG_ARCH)\n\n#if !defined(MG_ARCH) || (MG_ARCH == MG_ARCH_CUSTOM)\n#include \"mongoose_config.h\"  // keep this include\n#endif\n\n#if !defined(MG_ARCH)\n#error \"MG_ARCH is not specified and we couldn't guess it. Define MG_ARCH=... in mongoose_config.h\"\n#endif\n\n// http://esr.ibiblio.org/?p=5095\n#define MG_BIG_ENDIAN (*(uint16_t *) \"\\0\\xff\" < 0x100)\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#if MG_ARCH == MG_ARCH_ARMCGT\n\n#include <ctype.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/types.h>\n#include <time.h>\n\n#define MG_PATH_MAX 100\n#define MG_ENABLE_SOCKET 0\n#define MG_ENABLE_DIRLIST 0\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_ARMGCC\n#define _POSIX_TIMERS\n\n#include <ctype.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/time.h>\n#include <sys/types.h>\n#include <time.h>\n#include <unistd.h>\n\n#define MG_PATH_MAX 100\n#define MG_ENABLE_SOCKET 0\n#define MG_ENABLE_DIRLIST 0\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_CUBE\n\n#include <ctype.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/time.h>\n#include <sys/types.h>\n#include <time.h>\n#include <unistd.h>\n\n// Cube-generated header, includes ST Cube HAL\n// NOTE: use angle brackets to prevent amalgamator ditching it\n#include <main.h>\n\n#ifndef MG_PATH_MAX\n#define MG_PATH_MAX 100\n#endif\n\n#ifndef MG_ENABLE_DIRLIST\n#define MG_ENABLE_DIRLIST 0\n#endif\n\n#ifndef MG_ENABLE_SOCKET\n#define MG_ENABLE_SOCKET 0\n#endif\n\n#ifndef MG_ENABLE_TCPIP\n#define MG_ENABLE_TCPIP 1  // Enable built-in TCP/IP stack\n#endif\n\n#if MG_ENABLE_TCPIP && !defined(MG_ENABLE_DRIVER_STM32F) && \\\n    !defined(MG_ENABLE_DRIVER_STM32H) && !defined(MG_ENABLE_DRIVER_STM32N)\n#if defined(STM32F1) || defined(STM32F2) || defined(STM32F4) || defined(STM32F7)\n#define MG_ENABLE_DRIVER_STM32F 1\n#elif defined(STM32H5) || defined(STM32H7)\n#define MG_ENABLE_DRIVER_STM32H 1\n#elif defined(STM32N6)\n#define MG_ENABLE_DRIVER_STM32N 1\n#else\n#error Select a driver in mongoose_config.h\n#endif\n#endif\n\n#ifndef MG_TLS\n#define MG_TLS MG_TLS_BUILTIN\n#endif\n\n#if !defined(MG_OTA) && defined(STM32F1) || defined(STM32F2) || \\\n    defined(STM32F4) || defined(STM32F7)\n#define MG_OTA MG_OTA_STM32F\n#elif !defined(MG_OTA) && defined(STM32H5)\n#define MG_OTA MG_OTA_STM32H5\n#elif !defined(MG_OTA) && defined(STM32H7)\n#define MG_OTA MG_OTA_STM32H7\n#endif\n// use HAL-defined execute-in-ram section\n#define MG_IRAM __attribute__((section(\".RamFunc\")))\n\n#ifndef HAL_ICACHE_MODULE_ENABLED\n#define HAL_ICACHE_IsEnabled() 0\n#define HAL_ICACHE_Enable() (void) 0\n#define HAL_ICACHE_Disable() (void) 0\n#endif\n\n#ifndef MG_SET_MAC_ADDRESS\n// Construct MAC address from UUID\n#define MGUID ((uint32_t *) UID_BASE)  // Unique 96-bit chip ID\n#define MG_SET_MAC_ADDRESS(mac)                                   \\\n  do {                                                            \\\n    int icache_enabled_ = HAL_ICACHE_IsEnabled();                 \\\n    if (icache_enabled_) HAL_ICACHE_Disable();                    \\\n    mac[0] = 42;                                                  \\\n    mac[1] = ((MGUID[0] >> 0) & 255) ^ ((MGUID[2] >> 19) & 255);  \\\n    mac[2] = ((MGUID[0] >> 10) & 255) ^ ((MGUID[1] >> 10) & 255); \\\n    mac[3] = (MGUID[0] >> 19) & 255;                              \\\n    mac[4] = ((MGUID[1] >> 0) & 255) ^ ((MGUID[2] >> 10) & 255);  \\\n    mac[5] = ((MGUID[2] >> 0) & 255) ^ ((MGUID[1] >> 19) & 255);  \\\n    if (icache_enabled_) HAL_ICACHE_Enable();                     \\\n  } while (0)\n#endif\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_ESP32\n\n#include <ctype.h>\n#include <dirent.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <limits.h>\n#include <netdb.h>\n#include <stdarg.h>\n#include <stddef.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <time.h>\n\n#include <esp_ota_ops.h>  // Use angle brackets to avoid\n#include <esp_timer.h>    // amalgamation ditching them\n\n#define MG_PATH_MAX 128\n\n#ifndef MG_ENABLE_POSIX_FS\n#define MG_ENABLE_POSIX_FS 1\n#endif\n\n#ifndef MG_ENABLE_DIRLIST\n#define MG_ENABLE_DIRLIST 1\n#endif\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_ESP8266\n\n#include <ctype.h>\n#include <dirent.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <limits.h>\n#include <netdb.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stddef.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/time.h>\n#include <sys/types.h>\n#include <time.h>\n\n#include <esp_system.h>\n\n#define MG_PATH_MAX 128\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_FREERTOS\n\n#include <ctype.h>\n#if !defined(MG_ENABLE_LWIP) || !MG_ENABLE_LWIP\n#include <errno.h>\n#endif\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stddef.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>  // rand(), strtol(), atoi()\n#include <string.h>\n#if defined(__ARMCC_VERSION)\n#define mode_t size_t\n#include <alloca.h>\n#include <time.h>\n#define strdup(s) ((char *) mg_strdup(mg_str(s)).buf)\n#elif defined(__CCRH__)\n#else\n#include <sys/stat.h>\n#endif\n\n#include <FreeRTOS.h>\n#include <task.h>\n\n#define MG_ENABLE_CUSTOM_CALLOC 1\n\nstatic inline void mg_free(void *ptr) {\n  vPortFree(ptr);\n}\n\n// Re-route calloc/free to the FreeRTOS's functions, don't use stdlib\nstatic inline void *mg_calloc(size_t cnt, size_t size) {\n  void *p = pvPortMalloc(cnt * size);\n  if (p != NULL) memset(p, 0, size * cnt);\n  return p;\n}\n\n#if !defined(MG_ENABLE_POSIX_FS) || !MG_ENABLE_POSIX_FS\n#else\n#define mkdir(a, b) mg_mkdir(a, b)\nstatic inline int mg_mkdir(const char *path, mode_t mode) {\n  (void) path, (void) mode;\n  return -1;\n}\n#endif\n\n#endif  // MG_ARCH == MG_ARCH_FREERTOS\n\n\n#if MG_ARCH == MG_ARCH_PICOSDK\n#if !defined(MG_ENABLE_LWIP) || !MG_ENABLE_LWIP\n#include <errno.h>\n#endif\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <time.h>\n\n#include <pico/stdlib.h>\n#include <pico/rand.h>\nint mkdir(const char *, mode_t);\n\n#if MG_OTA == MG_OTA_PICOSDK\n#include <hardware/flash.h>\n#include <pico/bootrom.h>\n#endif\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_RTTHREAD\n\n#include <rtthread.h>\n#include <ctype.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <sys/socket.h>\n#include <sys/select.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/types.h>\n#include <time.h>\n\n#ifndef MG_IO_SIZE\n#define MG_IO_SIZE 1460\n#endif\n\n#endif // MG_ARCH == MG_ARCH_RTTHREAD\n\n\n#if MG_ARCH == MG_ARCH_ARMCC || MG_ARCH == MG_ARCH_CMSIS_RTOS1 || \\\n    MG_ARCH == MG_ARCH_CMSIS_RTOS2\n\n#include <ctype.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stddef.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <alloca.h>\n#include <string.h>\n#include <time.h>\n#if MG_ARCH == MG_ARCH_CMSIS_RTOS1\n#include \"cmsis_os.h\"  // keep this include\n// https://developer.arm.com/documentation/ka003821/latest\nextern uint32_t rt_time_get(void);\n#elif MG_ARCH == MG_ARCH_CMSIS_RTOS2\n#include \"cmsis_os2.h\"  // keep this include\n#endif\n\n#define strdup(s) ((char *) mg_strdup(mg_str(s)).buf)\n\n#if defined(__ARMCC_VERSION)\n#define mode_t size_t\n#define mkdir(a, b) mg_mkdir(a, b)\nstatic inline int mg_mkdir(const char *path, mode_t mode) {\n  (void) path, (void) mode;\n  return -1;\n}\n#endif\n\n#if (MG_ARCH == MG_ARCH_CMSIS_RTOS1 || MG_ARCH == MG_ARCH_CMSIS_RTOS2) &&     \\\n    !defined MG_ENABLE_RL && (!defined(MG_ENABLE_LWIP) || !MG_ENABLE_LWIP) && \\\n    (!defined(MG_ENABLE_TCPIP) || !MG_ENABLE_TCPIP)\n#define MG_ENABLE_RL 1\n#ifndef MG_SOCK_LISTEN_BACKLOG_SIZE\n#define MG_SOCK_LISTEN_BACKLOG_SIZE 3\n#endif\n#endif\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_THREADX\n\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <string.h>\n\n// Do not include time.h and stdlib.h, since they conflict with nxd_bsd.h\n// extern time_t time(time_t *);\n#include <nxd_bsd.h>\n\n#define MG_DIRSEP '\\\\'\n#undef FOPEN_MAX\n\n#ifndef MG_PATH_MAX\n#define MG_PATH_MAX 32\n#endif\n\n#ifndef MG_SOCK_LISTEN_BACKLOG_SIZE\n#define MG_SOCK_LISTEN_BACKLOG_SIZE 3\n#endif\n\n#ifndef MG_ENABLE_IPV6\n#define MG_ENABLE_IPV6 0\n#endif\n\n#define socklen_t int\n#define closesocket(x) soc_close(x)\n\n// In order to enable BSD support in NetxDuo, do the following (assuming Cube):\n// 1. Add nxd_bsd.h and nxd_bsd.c to the repo:\n//     https://github.com/eclipse-threadx/netxduo/blob/v6.1.12_rel/addons/BSD/nxd_bsd.c\n//     https://github.com/eclipse-threadx/netxduo/blob/v6.1.12_rel/addons/BSD/nxd_bsd.h\n// 2. Add to tx_user.h\n//     #define TX_THREAD_USER_EXTENSION int bsd_errno;\n// 3. Add to nx_user.h\n//     #define NX_ENABLE_EXTENDED_NOTIFY_SUPPORT\n// 4. Add __CCRX__ build preprocessor constant\n//   Project -> Properties -> C/C++ -> Settings -> MCU Compiler -> Preprocessor\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_TIRTOS\n\n#include <stdlib.h>\n#include <ctype.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <string.h>\n#include <time.h>\n\n#include <serrno.h>\n#include <sys/socket.h>\n\n#include <ti/sysbios/knl/Clock.h>\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_UNIX\n\n#define _DARWIN_UNLIMITED_SELECT 1  // No limit on file descriptors\n\n#if defined(__APPLE__)\n#include <mach/mach_time.h>\n#endif\n\n#if !defined(MG_ENABLE_EPOLL) && defined(__linux__)\n#define MG_ENABLE_EPOLL 1\n#elif !defined(MG_ENABLE_POLL)\n#define MG_ENABLE_POLL 1\n#endif\n\n#include <arpa/inet.h>\n#include <ctype.h>\n#include <dirent.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <inttypes.h>\n#include <limits.h>\n#include <netdb.h>\n#include <netinet/in.h>\n#include <netinet/tcp.h>\n#include <signal.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stddef.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#if defined(MG_ENABLE_EPOLL) && MG_ENABLE_EPOLL\n#include <sys/epoll.h>\n#elif defined(MG_ENABLE_POLL) && MG_ENABLE_POLL\n#include <poll.h>\n#else\n#include <sys/select.h>\n#endif\n\n#include <sys/socket.h>\n#include <sys/stat.h>\n#include <sys/time.h>\n#include <sys/types.h>\n#include <time.h>\n#include <unistd.h>\n\n#ifndef MG_ENABLE_DIRLIST\n#define MG_ENABLE_DIRLIST 1\n#endif\n\n#ifndef MG_PATH_MAX\n#define MG_PATH_MAX FILENAME_MAX\n#endif\n\n#ifndef MG_ENABLE_POSIX_FS\n#define MG_ENABLE_POSIX_FS 1\n#endif\n\n#ifndef MG_IO_SIZE\n#define MG_IO_SIZE 16384\n#endif\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_WIN32\n\n// Avoid name clashing; (macro expansion producing 'defined' has undefined\n// behaviour). See config.h for user options\n#ifndef MG_ENABLE_WINSOCK\n#if (!defined(MG_ENABLE_TCPIP) || !MG_ENABLE_TCPIP) && \\\n    (!defined(MG_ENABLE_LWIP) || !MG_ENABLE_LWIP) &&   \\\n    (!defined(MG_ENABLE_FREERTOS_TCP) || !MG_ENABLE_FREERTOS_TCP)\n#define MG_ENABLE_WINSOCK 1\n#else\n#define MG_ENABLE_WINSOCK 0\n#endif\n#endif\n\n#ifndef _CRT_RAND_S\n#define _CRT_RAND_S\n#endif\n\n#ifndef _WIN32_WINNT\n#if defined(_MSC_VER) && _MSC_VER < 1700\n#define _WIN32_WINNT 0x0400 // Let vc98 pick up wincrypt.h\n#else\n#define _WIN32_WINNT 0x0600\n#endif\n#endif\n#ifndef WINVER\n#define WINVER _WIN32_WINNT\n#endif\n\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n\n#ifndef _CRT_SECURE_NO_WARNINGS\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n\n#ifndef _WINSOCK_DEPRECATED_NO_WARNINGS\n#define _WINSOCK_DEPRECATED_NO_WARNINGS\n#endif\n\n#include <ctype.h>\n#include <direct.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <limits.h>\n#include <signal.h>\n#include <stdarg.h>\n#include <stddef.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <time.h>\n\n#include <winsock2.h>       // fix missing macros and types\n\n#if defined(_MSC_VER) && _MSC_VER < 1700\n#define __func__ \"\"\ntypedef __int64 int64_t;\ntypedef unsigned __int64 uint64_t;\ntypedef unsigned char uint8_t;\ntypedef char int8_t;\ntypedef unsigned short uint16_t;\ntypedef short int16_t;\ntypedef unsigned int uint32_t;\ntypedef int int32_t;\ntypedef enum { false = 0, true = 1 } bool;\n#else\n#include <stdbool.h>\n#include <stdint.h>\n#if MG_ENABLE_WINSOCK\n#include <ws2tcpip.h>\n#endif\n#endif\n\n#include <process.h>\n#include <winerror.h>\n\n// For mg_random()\n#if defined(_MSC_VER) && _MSC_VER < 1700\n#include <wincrypt.h>\n#pragma comment(lib, \"advapi32.lib\")\n#endif\n\n#if defined(_MSC_VER) && _MSC_VER <= 1200\n  #ifndef IPPROTO_IP\n    #define IPPROTO_IP 0\n  #endif\n\n  #ifndef IP_ADD_MEMBERSHIP\n    struct ip_mreq {\n        struct in_addr imr_multiaddr;\n        struct in_addr imr_interface;\n    };\n    #define IP_ADD_MEMBERSHIP  12\n  #endif\n#endif\n\n// Protect from calls like std::snprintf in app code\n// See https://github.com/cesanta/mongoose/issues/1047\n#ifndef __cplusplus\n#define snprintf _snprintf\n#define vsnprintf _vsnprintf\n#ifndef strdup  // For MSVC with _DEBUG, see #1359\n#define strdup(x) _strdup(x)\n#endif\n#endif\n\n#if defined(MG_ENABLE_POLL) && MG_ENABLE_POLL && (!defined(MG_ENABLE_LWIP) || !MG_ENABLE_LWIP)\ntypedef unsigned long nfds_t; // see #3388\n#endif\n\n#if defined(_MSC_VER)\n#if MG_ENABLE_WINSOCK\n#pragma comment(lib, \"ws2_32.lib\")\n#endif\n#ifndef alloca\n#define alloca(a) _alloca(a)\n#endif\n#endif\n\n#define MG_DIRSEP '\\\\'\n\n#ifndef MG_PATH_MAX\n#define MG_PATH_MAX FILENAME_MAX\n#endif\n\n#if MG_ENABLE_WINSOCK\n\n#define MG_INVALID_SOCKET INVALID_SOCKET\n#define MG_SOCKET_TYPE SOCKET\n#define poll(a, b, c) WSAPoll((a), (b), (c))\n#define closesocket(x) closesocket(x)\ntypedef int socklen_t;\n\n#ifndef SO_EXCLUSIVEADDRUSE\n#define SO_EXCLUSIVEADDRUSE ((int) (~SO_REUSEADDR))\n#endif\n\n#define MG_SOCK_ERR(errcode) ((errcode) < 0 ? WSAGetLastError() : 0)\n\n#define MG_SOCK_PENDING(errcode)                                            \\\n  (((errcode) < 0) &&                                                       \\\n   (WSAGetLastError() == WSAEINTR || WSAGetLastError() == WSAEINPROGRESS || \\\n    WSAGetLastError() == WSAEWOULDBLOCK))\n\n#define MG_SOCK_RESET(errcode) \\\n  (((errcode) < 0) && (WSAGetLastError() == WSAECONNRESET))\n\n#endif  // MG_ENABLE_WINSOCK\n\n#define realpath(a, b) _fullpath((b), (a), MG_PATH_MAX)\n#define sleep(x) Sleep((x) *1000)\n#define mkdir(a, b) _mkdir(a)\n#define timegm(x) _mkgmtime(x)\n\n#ifndef S_ISDIR\n#define S_ISDIR(x) (((x) &_S_IFMT) == _S_IFDIR)\n#endif\n\n#ifndef MG_ENABLE_DIRLIST\n#define MG_ENABLE_DIRLIST 1\n#endif\n\n#ifndef SIGPIPE\n#define SIGPIPE 0\n#endif\n\n#ifndef MG_ENABLE_POSIX_FS\n#define MG_ENABLE_POSIX_FS 1\n#endif\n\n#ifndef MG_IO_SIZE\n#define MG_IO_SIZE 16384\n#endif\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_ZEPHYR\n\n#include <zephyr/kernel.h>\n#include <zephyr/net/socket.h>\n// #include <zephyr/posix/dirent.h>\n#include <zephyr/posix/fcntl.h>\n#include <zephyr/posix/sys/select.h>\n#include <zephyr/random/random.h>\n#include <zephyr/version.h>\n\n#include <ctype.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/types.h>\n#include <time.h>\n\n#define MG_PUTCHAR(x) printk(\"%c\", x)\n#ifndef strdup\n#define strdup(s) ((char *) mg_strdup(mg_str(s)).buf)\n#endif\n#define strerror(x) zsock_gai_strerror(x)\n\n#ifndef FD_CLOEXEC\n#define FD_CLOEXEC 0\n#endif\n\n#ifndef F_SETFD\n#define F_SETFD 0\n#endif\n\n#define MG_ENABLE_SSI 0\n\nint rand(void);\nint sscanf(const char *, const char *, ...);\n\n#endif\n\n\n#if defined(MG_ENABLE_FREERTOS_TCP) && MG_ENABLE_FREERTOS_TCP\n\n#include <limits.h>\n#include <list.h>\n\n#include <FreeRTOS_IP.h>\n#include <FreeRTOS_Sockets.h>\n\n#define MG_SOCKET_TYPE Socket_t\n#define MG_INVALID_SOCKET FREERTOS_INVALID_SOCKET\n\n// Why FreeRTOS-TCP did not implement a clean BSD API, but its own thing\n// with FreeRTOS_ prefix, is beyond me\n#define IPPROTO_TCP FREERTOS_IPPROTO_TCP\n#define IPPROTO_UDP FREERTOS_IPPROTO_UDP\n#define AF_INET FREERTOS_AF_INET\n#define SOCK_STREAM FREERTOS_SOCK_STREAM\n#define SOCK_DGRAM FREERTOS_SOCK_DGRAM\n#define SO_BROADCAST 0\n#define SO_ERROR 0\n#define SOL_SOCKET 0\n#define SO_REUSEADDR 0\n\n#define MG_SOCK_ERR(errcode) ((errcode) < 0 ? (errcode) : 0)\n\n#define MG_SOCK_PENDING(errcode)                 \\\n  ((errcode) == -pdFREERTOS_ERRNO_EWOULDBLOCK || \\\n   (errcode) == -pdFREERTOS_ERRNO_EISCONN ||     \\\n   (errcode) == -pdFREERTOS_ERRNO_EINPROGRESS || \\\n   (errcode) == -pdFREERTOS_ERRNO_EAGAIN)\n\n#define MG_SOCK_RESET(errcode) ((errcode) == -pdFREERTOS_ERRNO_ENOTCONN)\n\n// actually only if optional timeout is enabled\n#define MG_SOCK_INTR(fd) (fd == NULL)\n\n#define sockaddr_in freertos_sockaddr\n#define sockaddr freertos_sockaddr\n#if ipFR_TCP_VERSION_MAJOR >= 4\n#define sin_addr sin_address.ulIP_IPv4\n#endif\n#define accept(a, b, c) FreeRTOS_accept((a), (b), (c))\n#define connect(a, b, c) FreeRTOS_connect((a), (b), (c))\n#define bind(a, b, c) FreeRTOS_bind((a), (b), (c))\n#define listen(a, b) FreeRTOS_listen((a), (b))\n#define socket(a, b, c) FreeRTOS_socket((a), (b), (c))\n#define send(a, b, c, d) FreeRTOS_send((a), (b), (c), (d))\n#define recv(a, b, c, d) FreeRTOS_recv((a), (b), (c), (d))\n#define setsockopt(a, b, c, d, e) FreeRTOS_setsockopt((a), (b), (c), (d), (e))\n#define sendto(a, b, c, d, e, f) FreeRTOS_sendto((a), (b), (c), (d), (e), (f))\n#define recvfrom(a, b, c, d, e, f) \\\n  FreeRTOS_recvfrom((a), (b), (c), (d), (e), (f))\n#define closesocket(x) FreeRTOS_closesocket(x)\n#define gethostbyname(x) FreeRTOS_gethostbyname(x)\n#define getsockname(a, b, c) mg_getsockname((a), (b), (c))\n#define getpeername(a, b, c) mg_getpeername((a), (b), (c))\n\nstatic inline int mg_getsockname(MG_SOCKET_TYPE fd, void *buf, socklen_t *len) {\n  (void) fd, (void) buf, (void) len;\n  return -1;\n}\n\nstatic inline int mg_getpeername(MG_SOCKET_TYPE fd, void *buf, socklen_t *len) {\n  (void) fd, (void) buf, (void) len;\n  return 0;\n}\n#endif\n\n\n#if defined(MG_ENABLE_LWIP) && MG_ENABLE_LWIP\n\n#if defined(__GNUC__) && !defined(__ARMCC_VERSION)\n#include <sys/stat.h>\n#endif\n\nstruct timeval;\n\n#include <lwip/sockets.h>\n\n#if !LWIP_TIMEVAL_PRIVATE\n#if defined(__GNUC__) && !defined(__ARMCC_VERSION) // armclang sets both\n#include <sys/time.h>\n#else\nstruct timeval {\n  time_t tv_sec;\n  long tv_usec;\n};\n#endif\n#endif\n\n#if LWIP_SOCKET != 1\n// Sockets support disabled in LWIP by default\n#error Set LWIP_SOCKET variable to 1 (in lwipopts.h)\n#endif\n#endif\n\n\n#if defined(MG_ENABLE_RL) && MG_ENABLE_RL\n#include <rl_net.h>\n\n#define closesocket(x) closesocket(x)\n\n#define TCP_NODELAY SO_KEEPALIVE\n\n#define MG_SOCK_ERR(errcode) ((errcode) < 0 ? (errcode) : 0)\n\n#define MG_SOCK_PENDING(errcode)                                \\\n  ((errcode) == BSD_EWOULDBLOCK || (errcode) == BSD_EALREADY || \\\n   (errcode) == BSD_EINPROGRESS)\n\n#define MG_SOCK_RESET(errcode) \\\n  ((errcode) == BSD_ECONNABORTED || (errcode) == BSD_ECONNRESET)\n\n// In blocking mode, which is enabled by default, accept() waits for a\n// connection request. In non blocking mode, you must call accept()\n// again if the error code BSD_EWOULDBLOCK is returned.\n#define MG_SOCK_INTR(fd) (fd == BSD_EWOULDBLOCK)\n\n#define socklen_t int\n#endif\n\n\n#ifndef MG_ENABLE_LOG\n#define MG_ENABLE_LOG 1\n#endif\n\n#ifndef MG_ENABLE_CUSTOM_CALLOC\n#define MG_ENABLE_CUSTOM_CALLOC 0\n#endif\n\n#ifndef MG_ENABLE_CUSTOM_LOG\n#define MG_ENABLE_CUSTOM_LOG 0  // Let user define their own MG_LOG\n#endif\n\n#ifndef MG_ENABLE_TCPIP\n#define MG_ENABLE_TCPIP 0  // Mongoose built-in network stack\n#endif\n\n#ifndef MG_ENABLE_LWIP\n#define MG_ENABLE_LWIP 0  // lWIP network stack\n#endif\n\n#ifndef MG_ENABLE_FREERTOS_TCP\n#define MG_ENABLE_FREERTOS_TCP 0  // Amazon FreeRTOS-TCP network stack\n#endif\n\n#ifndef MG_ENABLE_RL\n#define MG_ENABLE_RL 0  // ARM MDK network stack\n#endif\n\n#ifndef MG_ENABLE_SOCKET\n#define MG_ENABLE_SOCKET !MG_ENABLE_TCPIP\n#endif\n\n#ifndef MG_ENABLE_POLL\n#define MG_ENABLE_POLL 0\n#endif\n\n#ifndef MG_ENABLE_EPOLL\n#define MG_ENABLE_EPOLL 0\n#endif\n\n#ifndef MG_ENABLE_FATFS\n#define MG_ENABLE_FATFS 0\n#endif\n\n#ifndef MG_ENABLE_SSI\n#define MG_ENABLE_SSI 0\n#endif\n\n#ifndef MG_ENABLE_IPV6\n#define MG_ENABLE_IPV6 0\n#endif\n\n#ifndef MG_IPV6_V6ONLY\n#define MG_IPV6_V6ONLY 0  // IPv6 socket binds only to V6, not V4 address\n#endif\n\n#ifndef MG_ENABLE_MD5\n#define MG_ENABLE_MD5 1\n#endif\n\n// Set MG_ENABLE_WINSOCK=0 for Win32 builds with other external IP stack not\n// mentioned in arch_win32.h\n#ifndef MG_ENABLE_WINSOCK\n#define MG_ENABLE_WINSOCK 1\n#endif\n\n#ifndef MG_ENABLE_DIRLIST\n#define MG_ENABLE_DIRLIST 0\n#endif\n\n#ifndef MG_ENABLE_CUSTOM_RANDOM\n#define MG_ENABLE_CUSTOM_RANDOM 0\n#endif\n\n#ifndef MG_ENABLE_CUSTOM_MILLIS\n#define MG_ENABLE_CUSTOM_MILLIS 0\n#endif\n\n#ifndef MG_ENABLE_PACKED_FS\n#define MG_ENABLE_PACKED_FS 0\n#endif\n\n#ifndef MG_ENABLE_ASSERT\n#define MG_ENABLE_ASSERT 0\n#endif\n\n#ifndef MG_IO_SIZE\n#define MG_IO_SIZE 512  // Granularity of the send/recv IO buffer growth\n#endif\n\n#ifndef MG_MAX_RECV_SIZE\n#define MG_MAX_RECV_SIZE (3UL * 1024UL * 1024UL)  // Maximum recv IO buffer size\n#endif\n\n#ifndef MG_DATA_SIZE\n#define MG_DATA_SIZE 32  // struct mg_connection :: data size\n#endif\n\n#ifndef MG_MAX_HTTP_HEADERS\n#define MG_MAX_HTTP_HEADERS 30\n#endif\n\n#ifndef MG_HTTP_INDEX\n#define MG_HTTP_INDEX \"index.html\"\n#endif\n\n#ifndef MG_PATH_MAX\n#ifdef PATH_MAX\n#define MG_PATH_MAX PATH_MAX\n#else\n#define MG_PATH_MAX 128\n#endif\n#endif\n\n#ifndef MG_SOCK_LISTEN_BACKLOG_SIZE\n#define MG_SOCK_LISTEN_BACKLOG_SIZE 128\n#endif\n\n#ifndef MG_DIRSEP\n#define MG_DIRSEP '/'\n#endif\n\n#ifndef MG_ENABLE_POSIX_FS\n#define MG_ENABLE_POSIX_FS 0\n#endif\n\n#ifndef MG_INVALID_SOCKET\n#define MG_INVALID_SOCKET (-1)\n#endif\n\n#ifndef MG_SOCKET_TYPE\n#define MG_SOCKET_TYPE int\n#endif\n\n#ifndef MG_SOCKET_ERRNO\n#define MG_SOCKET_ERRNO errno\n#endif\n\n#if MG_ENABLE_EPOLL\n#define MG_EPOLL_ADD(c)                                                    \\\n  do {                                                                     \\\n    struct epoll_event ev = {EPOLLIN | EPOLLERR | EPOLLHUP, {c}};          \\\n    epoll_ctl(c->mgr->epoll_fd, EPOLL_CTL_ADD, (int) (size_t) c->fd, &ev); \\\n  } while (0)\n#define MG_EPOLL_MOD(c, wr)                                                \\\n  do {                                                                     \\\n    struct epoll_event ev = {EPOLLIN | EPOLLERR | EPOLLHUP, {c}};          \\\n    if (wr) ev.events |= EPOLLOUT;                                         \\\n    epoll_ctl(c->mgr->epoll_fd, EPOLL_CTL_MOD, (int) (size_t) c->fd, &ev); \\\n  } while (0)\n#else\n#define MG_EPOLL_ADD(c)\n#define MG_EPOLL_MOD(c, wr)\n#endif\n\n#ifndef MG_ENABLE_PROFILE\n#define MG_ENABLE_PROFILE 0\n#endif\n\n#ifndef MG_ENABLE_TCPIP_DRIVER_INIT    // mg_mgr_init() will also initialize\n#define MG_ENABLE_TCPIP_DRIVER_INIT 1  // enabled built-in driver for\n#endif                                 // Mongoose built-in network stack\n\n#ifndef MG_TCPIP_IP                      // e.g. MG_IPV4(192, 168, 0, 223)\n#define MG_TCPIP_IP MG_IPV4(0, 0, 0, 0)  // Default is 0.0.0.0 (DHCP)\n#endif\n\n#ifndef MG_TCPIP_MASK\n#define MG_TCPIP_MASK MG_IPV4(0, 0, 0, 0)  // Default is 0.0.0.0 (DHCP)\n#endif\n\n#ifndef MG_TCPIP_GW\n#define MG_TCPIP_GW MG_IPV4(0, 0, 0, 0)  // Default is 0.0.0.0 (DHCP)\n#endif\n\n#if MG_ENABLE_IPV6\n\n#ifndef MG_TCPIP_GLOBAL\n#define MG_TCPIP_GLOBAL MG_IPV6(0, 0, 0, 0, 0, 0, 0, 0)\n#endif\n\n#ifndef MG_TCPIP_IPV6_LINKLOCAL\n#define MG_TCPIP_IPV6_LINKLOCAL MG_IPV6(0, 0, 0, 0, 0, 0, 0, 0)\n#endif\n\n#ifndef MG_TCPIP_PREFIX_LEN\n#define MG_TCPIP_PREFIX_LEN 0\n#endif\n\n#ifndef MG_TCPIP_GW6\n#define MG_TCPIP_GW6 MG_IPV6(0, 0, 0, 0, 0, 0, 0, 0)\n#endif\n\n#endif\n\n#ifndef MG_SET_MAC_ADDRESS\n#define MG_SET_MAC_ADDRESS(mac)\n#endif\n\n#ifndef MG_TCPIP_DHCPNAME_SIZE\n#define MG_TCPIP_DHCPNAME_SIZE 18  // struct mg_tcpip_if :: dhcp_name size\n#endif\n\n#ifndef MG_SET_WIFI_CONFIG\n#define MG_SET_WIFI_CONFIG(data)\n#endif\n\n#ifndef MG_ENABLE_TCPIP_PRINT_DEBUG_STATS\n#define MG_ENABLE_TCPIP_PRINT_DEBUG_STATS 0\n#endif\n\n#ifndef MG_ENABLE_CHACHA20\n#define MG_ENABLE_CHACHA20 1  // When set to 0, GCM is used. For MG_TLS_BUILTIN\n#endif\n\n\n\n// Macros to record timestamped events that happens with a connection.\n// They are saved into a c->prof IO buffer, each event is a name and a 32-bit\n// timestamp in milliseconds since connection init time.\n//\n// Test (run in two separate terminals):\n//   make -C tutorials/http/http-server/ CFLAGS_EXTRA=-DMG_ENABLE_PROFILE=1\n//   curl localhost:8000\n// Output:\n//   1ea1f1e7 2 net.c:150:mg_close_conn      3 profile:                                                            \n//   1ea1f1e8 2 net.c:150:mg_close_conn      1ea1f1e6 init                                                         \n//   1ea1f1e8 2 net.c:150:mg_close_conn          0 EV_OPEN\n//   1ea1f1e8 2 net.c:150:mg_close_conn          0 EV_ACCEPT \n//   1ea1f1e8 2 net.c:150:mg_close_conn          0 EV_READ\n//   1ea1f1e8 2 net.c:150:mg_close_conn          0 EV_HTTP_MSG\n//   1ea1f1e8 2 net.c:150:mg_close_conn          0 EV_WRITE\n//   1ea1f1e8 2 net.c:150:mg_close_conn          1 EV_CLOSE\n//\n// Usage:\n//   Enable profiling by setting MG_ENABLE_PROFILE=1\n//   Invoke MG_PROF_ADD(c, \"MY_EVENT_1\") in the places you'd like to measure\n\n#if MG_ENABLE_PROFILE\nstruct mg_profitem {\n  const char *name;    // Event name\n  uint32_t timestamp;  // Milliseconds since connection creation (MG_EV_OPEN)\n};\n\n#define MG_PROFILE_ALLOC_GRANULARITY 256  // Can save 32 items wih to realloc\n\n// Adding a profile item to the c->prof. Must be as fast as possible.\n// Reallocation of the c->prof iobuf is not desirable here, that's why we\n// pre-allocate c->prof with MG_PROFILE_ALLOC_GRANULARITY.\n// This macro just inits and copies 8 bytes, and calls mg_millis(),\n// which should be fast enough.\n#define MG_PROF_ADD(c, name_)                                             \\\n  do {                                                                    \\\n    struct mg_iobuf *io = &c->prof;                                       \\\n    uint32_t inittime = ((struct mg_profitem *) io->buf)->timestamp;      \\\n    struct mg_profitem item = {name_, (uint32_t) mg_millis() - inittime}; \\\n    mg_iobuf_add(io, io->len, &item, sizeof(item));                       \\\n  } while (0)\n\n// Initialising profile for a new connection. Not time sensitive\n#define MG_PROF_INIT(c)                                          \\\n  do {                                                           \\\n    struct mg_profitem first = {\"init\", (uint32_t) mg_millis()}; \\\n    mg_iobuf_init(&(c)->prof, 0, MG_PROFILE_ALLOC_GRANULARITY);  \\\n    mg_iobuf_add(&c->prof, c->prof.len, &first, sizeof(first));  \\\n  } while (0)\n\n#define MG_PROF_FREE(c) mg_iobuf_free(&(c)->prof)\n\n// Dumping the profile. Not time sensitive\n#define MG_PROF_DUMP(c)                                            \\\n  do {                                                             \\\n    struct mg_iobuf *io = &c->prof;                                \\\n    struct mg_profitem *p = (struct mg_profitem *) io->buf;        \\\n    struct mg_profitem *e = &p[io->len / sizeof(*p)];              \\\n    MG_INFO((\"%lu profile:\", c->id));                              \\\n    while (p < e) {                                                \\\n      MG_INFO((\"%5lx %s\", (unsigned long) p->timestamp, p->name)); \\\n      p++;                                                         \\\n    }                                                              \\\n  } while (0)\n\n#else\n#define MG_PROF_INIT(c)\n#define MG_PROF_FREE(c)\n#define MG_PROF_ADD(c, name)\n#define MG_PROF_DUMP(c)\n#endif\n\n\n\n\n// Describes an arbitrary chunk of memory\nstruct mg_str {\n  char *buf;   // String data\n  size_t len;  // String length\n};\n\n// Using macro to avoid shadowing C++ struct constructor, see #1298\n#define mg_str(s) mg_str_s(s)\n\nstruct mg_str mg_str(const char *s);\nstruct mg_str mg_str_n(const char *s, size_t n);\nint mg_casecmp(const char *s1, const char *s2);\nint mg_strcmp(const struct mg_str str1, const struct mg_str str2);\nint mg_strcasecmp(const struct mg_str str1, const struct mg_str str2);\nstruct mg_str mg_strdup(const struct mg_str s);\nbool mg_match(struct mg_str str, struct mg_str pattern, struct mg_str *caps);\nbool mg_span(struct mg_str s, struct mg_str *a, struct mg_str *b, char delim);\n\nbool mg_str_to_num(struct mg_str, int base, void *val, size_t val_len);\n\n\n\n\n// Single producer, single consumer non-blocking queue\n\nstruct mg_queue {\n  char *buf;\n  size_t size;\n  volatile size_t tail;\n  volatile size_t head;\n};\n\nvoid mg_queue_init(struct mg_queue *, char *, size_t);        // Init queue\nsize_t mg_queue_book(struct mg_queue *, char **buf, size_t);  // Reserve space\nvoid mg_queue_add(struct mg_queue *, size_t);                 // Add new message\nsize_t mg_queue_next(struct mg_queue *, char **);  // Get oldest message\nvoid mg_queue_del(struct mg_queue *, size_t);      // Delete oldest message\n\n\n\n\ntypedef void (*mg_pfn_t)(char, void *);                  // Output function\ntypedef size_t (*mg_pm_t)(mg_pfn_t, void *, va_list *);  // %M printer\n\nsize_t mg_vxprintf(void (*)(char, void *), void *, const char *fmt, va_list *);\nsize_t mg_xprintf(void (*fn)(char, void *), void *, const char *fmt, ...);\n\n\n\n\n\n\n// Convenience wrappers around mg_xprintf\nsize_t mg_vsnprintf(char *buf, size_t len, const char *fmt, va_list *ap);\nsize_t mg_snprintf(char *, size_t, const char *fmt, ...);\nchar *mg_vmprintf(const char *fmt, va_list *ap);\nchar *mg_mprintf(const char *fmt, ...);\nsize_t mg_queue_printf(struct mg_queue *, const char *fmt, ...);\n\n// %M print helper functions\nsize_t mg_print_base64(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_esc(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_hex(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_ip(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_ip_port(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_ip4(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_ip6(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_mac(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_l2addr(void (*out)(char, void *), void *arg, va_list *ap);\n\n// Various output functions\nvoid mg_pfn_iobuf(char ch, void *param);           // param: struct mg_iobuf *\nvoid mg_pfn_iobuf_noresize(char ch, void *param);  // param: struct mg_iobuf *\nvoid mg_pfn_stdout(char c, void *param);           // param: ignored\n\n// A helper macro for printing JSON: mg_snprintf(buf, len, \"%m\", MG_ESC(\"hi\"))\n#define MG_ESC(str) mg_print_esc, 0, (str)\n\n\n\n\n\n\nenum { MG_LL_NONE, MG_LL_ERROR, MG_LL_INFO, MG_LL_DEBUG, MG_LL_VERBOSE };\nextern int mg_log_level;  // Current log level, one of MG_LL_*\n\nvoid mg_log(const char *fmt, ...);\nvoid mg_log_prefix(int ll, const char *file, int line, const char *fname);\n// bool mg_log2(int ll, const char *file, int line, const char *fmt, ...);\nvoid mg_hexdump(const void *buf, size_t len);\nvoid mg_log_set_fn(mg_pfn_t fn, void *param);\n\n#define mg_log_set(level_) mg_log_level = (level_)\n\n#if MG_ENABLE_LOG\n#if !defined(_MSC_VER) && \\\n    (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L)\n#define MG___FUNC__ \"\"\n#else\n#define MG___FUNC__ __func__  // introduced in C99\n#endif\n#define MG_LOG(level, args)                                    \\\n  do {                                                         \\\n    if ((level) <= mg_log_level) {                             \\\n      mg_log_prefix((level), __FILE__, __LINE__, MG___FUNC__); \\\n      mg_log args;                                             \\\n    }                                                          \\\n  } while (0)\n#else\n#define MG_LOG(level, args) \\\n  do {                      \\\n    if (0) mg_log args;     \\\n  } while (0)\n#endif\n\n#define MG_ERROR(args) MG_LOG(MG_LL_ERROR, args)\n#define MG_INFO(args) MG_LOG(MG_LL_INFO, args)\n#define MG_DEBUG(args) MG_LOG(MG_LL_DEBUG, args)\n#define MG_VERBOSE(args) MG_LOG(MG_LL_VERBOSE, args)\n\n\n\n\nstruct mg_timer {\n  uint64_t period_ms;          // Timer period in milliseconds\n  uint64_t expire;             // Expiration timestamp in milliseconds\n  unsigned flags;              // Possible flags values below\n#define MG_TIMER_ONCE 0        // Call function once\n#define MG_TIMER_REPEAT 1      // Call function periodically\n#define MG_TIMER_RUN_NOW 2     // Call immediately when timer is set\n#define MG_TIMER_CALLED 4      // Timer function was called at least once\n#define MG_TIMER_AUTODELETE 8  // mg_free() timer when done\n  void (*fn)(void *);          // Function to call\n  void *arg;                   // Function argument\n  struct mg_timer *next;       // Linkage\n};\n\nvoid mg_timer_init(struct mg_timer **head, struct mg_timer *timer,\n                   uint64_t milliseconds, unsigned flags, void (*fn)(void *),\n                   void *arg);\nvoid mg_timer_free(struct mg_timer **head, struct mg_timer *);\nvoid mg_timer_poll(struct mg_timer **head, uint64_t new_ms);\nbool mg_timer_expired(uint64_t *expiration, uint64_t period, uint64_t now);\n\n\n\n\n\nenum { MG_FS_READ = 1, MG_FS_WRITE = 2, MG_FS_DIR = 4 };\n\n// Filesystem API functions\n// st() returns MG_FS_* flags and populates file size and modification time\n// ls() calls fn() for every directory entry, allowing to list a directory\n//\n// NOTE: UNIX-style shorthand names for the API functions are deliberately\n// chosen to avoid conflicts with some libraries that make macros for e.g.\n// stat(), write(), read() calls.\nstruct mg_fs {\n  int (*st)(const char *path, size_t *size, time_t *mtime);  // stat file\n  void (*ls)(const char *path, void (*fn)(const char *, void *),\n             void *);  // List directory entries: call fn(file_name, fn_data)\n                       // for each directory entry\n  void *(*op)(const char *path, int flags);             // Open file\n  void (*cl)(void *fd);                                 // Close file\n  size_t (*rd)(void *fd, void *buf, size_t len);        // Read file\n  size_t (*wr)(void *fd, const void *buf, size_t len);  // Write file\n  size_t (*sk)(void *fd, size_t offset);                // Set file position\n  bool (*mv)(const char *from, const char *to);         // Rename file\n  bool (*rm)(const char *path);                         // Delete file\n  bool (*mkd)(const char *path);                        // Create directory\n};\n\nextern struct mg_fs mg_fs_posix;   // POSIX open/close/read/write/seek\nextern struct mg_fs mg_fs_packed;  // see tutorials/core/embedded-filesystem\nextern struct mg_fs mg_fs_fat;     // FAT FS\n\n// File descriptor\nstruct mg_fd {\n  void *fd;\n  struct mg_fs *fs;\n};\n\nstruct mg_fd *mg_fs_open(struct mg_fs *fs, const char *path, int flags);\nvoid mg_fs_close(struct mg_fd *fd);\nbool mg_fs_ls(struct mg_fs *fs, const char *path, char *buf, size_t len);\nstruct mg_str mg_file_read(struct mg_fs *fs, const char *path);\nbool mg_file_write(struct mg_fs *fs, const char *path, const void *, size_t);\nbool mg_file_printf(struct mg_fs *fs, const char *path, const char *fmt, ...);\n\n// Packed API\nconst char *mg_unpack(const char *path, size_t *size, time_t *mtime);\nconst char *mg_unlist(size_t no);             // Get no'th packed filename\nstruct mg_str mg_unpacked(const char *path);  // Packed file as mg_str\n\n\n\n\n\n\n\n#if MG_ENABLE_ASSERT\n#include <assert.h>\n#elif !defined(assert)\n#define assert(x)\n#endif\n\nvoid *mg_calloc(size_t count, size_t size);\nvoid mg_free(void *ptr);\nvoid mg_bzero(volatile unsigned char *buf, size_t len);\nbool mg_random(void *buf, size_t len);\nchar *mg_random_str(char *buf, size_t len);\nuint32_t mg_crc32(uint32_t crc, const char *buf, size_t len);\nuint64_t mg_millis(void);  // Return milliseconds since boot\nbool mg_path_is_sane(const struct mg_str path);\nvoid mg_delayms(unsigned int ms);\n\n#define MG_U32(a, b, c, d)                                         \\\n  (((uint32_t) ((a) &255) << 24) | ((uint32_t) ((b) &255) << 16) | \\\n   ((uint32_t) ((c) &255) << 8) | (uint32_t) ((d) &255))\n\n#define MG_IPV4(a, b, c, d) mg_htonl(MG_U32(a, b, c, d))\n\n#define MG_IPV6(a, b, c, d, e, f, g ,h) \\\n  { (uint8_t)((a)>>8),(uint8_t)(a), \\\n    (uint8_t)((b)>>8),(uint8_t)(b), \\\n    (uint8_t)((c)>>8),(uint8_t)(c), \\\n    (uint8_t)((d)>>8),(uint8_t)(d), \\\n    (uint8_t)((e)>>8),(uint8_t)(e), \\\n    (uint8_t)((f)>>8),(uint8_t)(f), \\\n    (uint8_t)((g)>>8),(uint8_t)(g), \\\n    (uint8_t)((h)>>8),(uint8_t)(h) }\n\n// For printing IPv4 addresses: printf(\"%d.%d.%d.%d\\n\", MG_IPADDR_PARTS(&ip))\n#define MG_U8P(ADDR) ((uint8_t *) (ADDR))\n#define MG_IPADDR_PARTS(ADDR) \\\n  MG_U8P(ADDR)[0], MG_U8P(ADDR)[1], MG_U8P(ADDR)[2], MG_U8P(ADDR)[3]\n\n#define MG_LOAD_BE16(p) \\\n  ((uint16_t) (((uint16_t) MG_U8P(p)[0] << 8U) | MG_U8P(p)[1]))\n#define MG_LOAD_BE24(p)                           \\\n  ((uint32_t) (((uint32_t) MG_U8P(p)[0] << 16U) | \\\n               ((uint32_t) MG_U8P(p)[1] << 8U) | MG_U8P(p)[2]))\n#define MG_LOAD_BE32(p)                           \\\n  ((uint32_t) (((uint32_t) MG_U8P(p)[0] << 24U) | \\\n               ((uint32_t) MG_U8P(p)[1] << 16U) | \\\n               ((uint32_t) MG_U8P(p)[2] << 8U) | MG_U8P(p)[3]))\n#define MG_LOAD_BE64(p)                           \\\n  ((uint64_t) (((uint64_t) MG_U8P(p)[0] << 56U) | \\\n               ((uint64_t) MG_U8P(p)[1] << 48U) | \\\n               ((uint64_t) MG_U8P(p)[2] << 40U) | \\\n               ((uint64_t) MG_U8P(p)[3] << 32U) | \\\n               ((uint64_t) MG_U8P(p)[4] << 24U) | \\\n               ((uint64_t) MG_U8P(p)[5] << 16U) | \\\n               ((uint64_t) MG_U8P(p)[6] << 8U) | MG_U8P(p)[7]))\n#define MG_STORE_BE16(p, n)           \\\n  do {                                \\\n    MG_U8P(p)[0] = ((n) >> 8U) & 255; \\\n    MG_U8P(p)[1] = (n) &255;          \\\n  } while (0)\n#define MG_STORE_BE24(p, n)            \\\n  do {                                 \\\n    MG_U8P(p)[0] = ((n) >> 16U) & 255; \\\n    MG_U8P(p)[1] = ((n) >> 8U) & 255;  \\\n    MG_U8P(p)[2] = (n) &255;           \\\n  } while (0)\n#define MG_STORE_BE32(p, n)            \\\n  do {                                 \\\n    MG_U8P(p)[0] = ((n) >> 24U) & 255; \\\n    MG_U8P(p)[1] = ((n) >> 16U) & 255; \\\n    MG_U8P(p)[2] = ((n) >> 8U) & 255;  \\\n    MG_U8P(p)[3] = (n) &255;           \\\n  } while (0)\n#define MG_STORE_BE64(p, n)            \\\n  do {                                 \\\n    MG_U8P(p)[0] = ((n) >> 56U) & 255; \\\n    MG_U8P(p)[1] = ((n) >> 48U) & 255; \\\n    MG_U8P(p)[2] = ((n) >> 40U) & 255; \\\n    MG_U8P(p)[3] = ((n) >> 32U) & 255; \\\n    MG_U8P(p)[4] = ((n) >> 24U) & 255; \\\n    MG_U8P(p)[5] = ((n) >> 16U) & 255; \\\n    MG_U8P(p)[6] = ((n) >> 8U) & 255;  \\\n    MG_U8P(p)[7] = (n) &255;           \\\n  } while (0)\n\nuint16_t mg_ntohs(uint16_t net);\nuint32_t mg_ntohl(uint32_t net);\nuint64_t mg_ntohll(uint64_t net);\n#define mg_htons(x) mg_ntohs(x)\n#define mg_htonl(x) mg_ntohl(x)\n#define mg_htonll(x) mg_ntohll(x)\n\n#define MG_REG(x) ((volatile uint32_t *) (x))[0]\n#define MG_BIT(x) (((uint32_t) 1U) << (x))\n#define MG_SET_BITS(R, CLRMASK, SETMASK) (R) = ((R) & ~(CLRMASK)) | (SETMASK)\n\n#define MG_ROUND_UP(x, a) ((a) == 0 ? (x) : ((((x) + (a) -1) / (a)) * (a)))\n#define MG_ROUND_DOWN(x, a) ((a) == 0 ? (x) : (((x) / (a)) * (a)))\n\n#if defined(__GNUC__) && defined(__arm__)\n#ifdef __ZEPHYR__\n#define MG_ARM_DISABLE_IRQ() __asm__ __volatile__(\"cpsid i\" : : : \"memory\")\n#define MG_ARM_ENABLE_IRQ() __asm__ __volatile__(\"cpsie i\" : : : \"memory\")\n#else\n#define MG_ARM_DISABLE_IRQ() asm volatile(\"cpsid i\" : : : \"memory\")\n#define MG_ARM_ENABLE_IRQ() asm volatile(\"cpsie i\" : : : \"memory\")\n#endif // !ZEPHYR\n#elif defined(__CCRH__)\n#define MG_RH850_DISABLE_IRQ() __DI()\n#define MG_RH850_ENABLE_IRQ() __EI()\n#else\n#define MG_ARM_DISABLE_IRQ()\n#define MG_ARM_ENABLE_IRQ()\n#endif\n\n#if defined(__CC_ARM)\n#define MG_DSB() __dsb(0xf)\n#elif defined(__ARMCC_VERSION)\n#define MG_DSB() __builtin_arm_dsb(0xf)\n#elif defined(__GNUC__) && defined(__arm__) && defined(__thumb__)\n#ifdef __ZEPHYR__\n#define MG_DSB() __asm__(\"DSB 0xf\")\n#else\n#define MG_DSB() asm(\"DSB 0xf\")\n#endif // !ZEPHYR\n#elif defined(__ICCARM__)\n#define MG_DSB() __iar_builtin_DSB()\n#else\n#define MG_DSB()\n#endif\n\nstruct mg_addr;\nint mg_check_ip_acl(struct mg_str acl, struct mg_addr *remote_ip);\n\n// Linked list management macros\n#define LIST_ADD_HEAD(type_, head_, elem_) \\\n  do {                                     \\\n    (elem_)->next = (*head_);              \\\n    *(head_) = (elem_);                    \\\n  } while (0)\n\n#define LIST_ADD_TAIL(type_, head_, elem_) \\\n  do {                                     \\\n    type_ **h = head_;                     \\\n    while (*h != NULL) h = &(*h)->next;    \\\n    *h = (elem_);                          \\\n  } while (0)\n\n#define LIST_DELETE(type_, head_, elem_)   \\\n  do {                                     \\\n    type_ **h = head_;                     \\\n    while (*h != (elem_)) h = &(*h)->next; \\\n    *h = (elem_)->next;                    \\\n  } while (0)\n\n\n\nunsigned short mg_url_port(const char *url);\nint mg_url_is_ssl(const char *url);\nstruct mg_str mg_url_host(const char *url);\nstruct mg_str mg_url_user(const char *url);\nstruct mg_str mg_url_pass(const char *url);\nconst char *mg_url_uri(const char *url);\n\n\n\n\nstruct mg_iobuf {\n  unsigned char *buf;  // Pointer to stored data\n  size_t size;         // Total size available\n  size_t len;          // Current number of bytes\n  size_t align;        // Alignment during allocation\n};\n\nbool mg_iobuf_init(struct mg_iobuf *, size_t, size_t);\nbool mg_iobuf_resize(struct mg_iobuf *, size_t);\nvoid mg_iobuf_free(struct mg_iobuf *);\nsize_t mg_iobuf_add(struct mg_iobuf *, size_t, const void *, size_t);\nsize_t mg_iobuf_del(struct mg_iobuf *, size_t ofs, size_t len);\n\n\nsize_t mg_base64_update(unsigned char input_byte, char *buf, size_t len);\nsize_t mg_base64_final(char *buf, size_t len);\nsize_t mg_base64_encode(const unsigned char *p, size_t n, char *buf, size_t);\nsize_t mg_base64_decode(const char *src, size_t n, char *dst, size_t);\n\n\n\n\ntypedef struct {\n  uint32_t buf[4];\n  uint32_t bits[2];\n  unsigned char in[64];\n} mg_md5_ctx;\n\nvoid mg_md5_init(mg_md5_ctx *c);\nvoid mg_md5_update(mg_md5_ctx *c, const unsigned char *data, size_t len);\nvoid mg_md5_final(mg_md5_ctx *c, unsigned char[16]);\n\n\n\n\ntypedef struct {\n  uint32_t state[5];\n  uint32_t count[2];\n  unsigned char buffer[64];\n} mg_sha1_ctx;\n\nvoid mg_sha1_init(mg_sha1_ctx *);\nvoid mg_sha1_update(mg_sha1_ctx *, const unsigned char *data, size_t len);\nvoid mg_sha1_final(unsigned char digest[20], mg_sha1_ctx *);\n// https://github.com/B-Con/crypto-algorithms\n// Author:     Brad Conte (brad AT bradconte.com)\n// Disclaimer: This code is presented \"as is\" without any guarantees.\n// Details:    Defines the API for the corresponding SHA1 implementation.\n// Copyright:  public domain\n\n\n\n\n\ntypedef struct {\n  uint32_t state[8];\n  uint64_t bits;\n  uint32_t len;\n  unsigned char buffer[64];\n} mg_sha256_ctx;\n\n\nvoid mg_sha256_init(mg_sha256_ctx *);\nvoid mg_sha256_update(mg_sha256_ctx *, const unsigned char *data, size_t len);\nvoid mg_sha256_final(unsigned char digest[32], mg_sha256_ctx *);\nvoid mg_sha256(uint8_t dst[32], uint8_t *data, size_t datasz);\nvoid mg_hmac_sha256(uint8_t dst[32], uint8_t *key, size_t keysz, uint8_t *data,\n                    size_t datasz);\n\ntypedef struct {\n    uint64_t state[8];\n    uint8_t buffer[128];\n    uint64_t bitlen[2];\n    uint32_t datalen;\n} mg_sha384_ctx;\nvoid mg_sha384_init(mg_sha384_ctx *ctx);\nvoid mg_sha384_update(mg_sha384_ctx *ctx, const uint8_t *data, size_t len);\nvoid mg_sha384_final(uint8_t digest[48], mg_sha384_ctx *ctx);\nvoid mg_sha384(uint8_t dst[48], uint8_t *data, size_t datasz);\n\n\n\nstruct mg_connection;\ntypedef void (*mg_event_handler_t)(struct mg_connection *, int ev,\n                                   void *ev_data);\nvoid mg_call(struct mg_connection *c, int ev, void *ev_data);\nvoid mg_error(struct mg_connection *c, const char *fmt, ...);\n\nenum {\n  MG_EV_ERROR,      // Error                        char *error_message\n  MG_EV_OPEN,       // Connection created           NULL\n  MG_EV_POLL,       // mg_mgr_poll iteration        uint64_t *uptime_millis\n  MG_EV_RESOLVE,    // Host name is resolved        NULL\n  MG_EV_CONNECT,    // Connection established       NULL\n  MG_EV_ACCEPT,     // Connection accepted          NULL\n  MG_EV_TLS_HS,     // TLS handshake succeeded      NULL\n  MG_EV_READ,       // Data received from socket    long *bytes_read\n  MG_EV_WRITE,      // Data written to socket       long *bytes_written\n  MG_EV_CLOSE,      // Connection closed            NULL\n  MG_EV_HTTP_HDRS,  // HTTP headers                 struct mg_http_message *\n  MG_EV_HTTP_MSG,   // Full HTTP request/response   struct mg_http_message *\n  MG_EV_WS_OPEN,    // Websocket handshake done     struct mg_http_message *\n  MG_EV_WS_MSG,     // Websocket msg, text or bin   struct mg_ws_message *\n  MG_EV_WS_CTL,     // Websocket control msg        struct mg_ws_message *\n  MG_EV_MQTT_CMD,   // MQTT low-level command       struct mg_mqtt_message *\n  MG_EV_MQTT_MSG,   // MQTT PUBLISH received        struct mg_mqtt_message *\n  MG_EV_MQTT_OPEN,  // MQTT CONNACK received        int *connack_status_code\n  MG_EV_SNTP_TIME,  // SNTP time received           uint64_t *epoch_millis\n  MG_EV_WAKEUP,     // mg_wakeup() data received    struct mg_str *data\n  MG_EV_MDNS_REQ,   // mDNS request                 struct mg_mdns_req *\n  MG_EV_MDNS_RESP,  // mDNS response                struct mg_mdns_resp *\n  MG_EV_USER        // Starting ID for user events\n};\n\n\n\n\n\n\n\n\n\n\nstruct mg_dns {\n  const char *url;          // DNS server URL\n  struct mg_connection *c;  // DNS server connection\n};\n\nstruct mg_addr {\n  union {  // Holds IPv4 or IPv6 address, in network byte order\n    uint8_t ip[16];\n    uint32_t ip4;\n    uint64_t ip6[2];\n  } addr;\n  uint16_t port;     // TCP or UDP port in network byte order\n  uint8_t scope_id;  // IPv6 scope ID\n  bool is_ip6;       // True when address is IPv6 address\n};\n\nstruct mg_mgr {\n  struct mg_connection *conns;  // List of active connections\n  struct mg_dns dns4;           // DNS for IPv4\n  struct mg_dns dns6;           // DNS for IPv6\n  int dnstimeout;               // DNS resolve timeout in milliseconds\n  bool use_dns6;                // Use DNS6 server by default, see #1532\n  unsigned long nextid;         // Next connection ID\n  void *userdata;               // Arbitrary user data pointer\n  void *tls_ctx;                // TLS context shared by all TLS sessions\n  uint16_t mqtt_id;             // MQTT IDs for pub/sub\n  void *active_dns_requests;    // DNS requests in progress\n  struct mg_timer *timers;      // Active timers\n  int epoll_fd;                 // Used when MG_EPOLL_ENABLE=1\n  struct mg_tcpip_if *ifp;      // Builtin TCP/IP stack only. Interface pointer\n  size_t extraconnsize;         // Builtin TCP/IP stack only. Extra space\n  MG_SOCKET_TYPE pipe;          // Socketpair end for mg_wakeup()\n#if MG_ENABLE_FREERTOS_TCP\n  SocketSet_t ss;  // NOTE(lsm): referenced from socket struct\n#endif\n};\n\nstruct mg_connection {\n  struct mg_connection *next;     // Linkage in struct mg_mgr :: connections\n  struct mg_mgr *mgr;             // Our container\n  struct mg_addr loc;             // Local address\n  struct mg_addr rem;             // Remote address\n  void *fd;                       // Connected socket, or LWIP data\n  unsigned long id;               // Auto-incrementing unique connection ID\n  struct mg_iobuf recv;           // Incoming data\n  struct mg_iobuf send;           // Outgoing data\n  struct mg_iobuf prof;           // Profile data enabled by MG_ENABLE_PROFILE\n  struct mg_iobuf rtls;           // TLS only. Incoming encrypted data\n  mg_event_handler_t fn;          // User-specified event handler function\n  void *fn_data;                  // User-specified function parameter\n  mg_event_handler_t pfn;         // Protocol-specific handler function\n  void *pfn_data;                 // Protocol-specific function parameter\n  char data[MG_DATA_SIZE];        // Arbitrary connection data\n  void *tls;                      // TLS specific data\n  unsigned is_listening : 1;      // Listening connection\n  unsigned is_client : 1;         // Outbound (client) connection\n  unsigned is_accepted : 1;       // Accepted (server) connection\n  unsigned is_resolving : 1;      // Non-blocking DNS resolution is in progress\n  unsigned is_arplooking : 1;     // Non-blocking ARP resolution is in progress\n  unsigned is_connecting : 1;     // Non-blocking connect is in progress\n  unsigned is_tls : 1;            // TLS-enabled connection\n  unsigned is_tls_hs : 1;         // TLS handshake is in progress\n  unsigned is_udp : 1;            // UDP connection\n  unsigned is_websocket : 1;      // WebSocket connection\n  unsigned is_mqtt5 : 1;          // For MQTT connection, v5 indicator\n  unsigned is_hexdumping : 1;     // Hexdump in/out traffic\n  unsigned is_draining : 1;       // Send remaining data, then close and free\n  unsigned is_closing : 1;        // Close and free the connection immediately\n  unsigned is_full : 1;           // Stop reads, until cleared\n  unsigned is_tls_throttled : 1;  // Last TLS write: MG_SOCK_PENDING() was true\n  unsigned is_resp : 1;           // Response is still being generated\n  unsigned is_readable : 1;       // Connection is ready to read\n  unsigned is_writable : 1;       // Connection is ready to write\n};\n\nvoid mg_mgr_poll(struct mg_mgr *, int ms);\nvoid mg_mgr_init(struct mg_mgr *);\nvoid mg_mgr_free(struct mg_mgr *);\n\nstruct mg_connection *mg_listen(struct mg_mgr *, const char *url,\n                                mg_event_handler_t fn, void *fn_data);\nstruct mg_connection *mg_connect(struct mg_mgr *, const char *url,\n                                 mg_event_handler_t fn, void *fn_data);\nstruct mg_connection *mg_wrapfd(struct mg_mgr *mgr, int fd,\n                                mg_event_handler_t fn, void *fn_data);\nvoid mg_connect_resolved(struct mg_connection *);\nbool mg_send(struct mg_connection *, const void *, size_t);\nsize_t mg_printf(struct mg_connection *, const char *fmt, ...);\nsize_t mg_vprintf(struct mg_connection *, const char *fmt, va_list *ap);\nbool mg_aton(struct mg_str str, struct mg_addr *addr);\n\n// These functions are used to integrate with custom network stacks\nstruct mg_connection *mg_alloc_conn(struct mg_mgr *);\nvoid mg_close_conn(struct mg_connection *c);\nbool mg_open_listener(struct mg_connection *c, const char *url);\n\n// Utility functions\nbool mg_wakeup(struct mg_mgr *, unsigned long id, const void *buf, size_t len);\nbool mg_wakeup_init(struct mg_mgr *);\nstruct mg_timer *mg_timer_add(struct mg_mgr *mgr, uint64_t milliseconds,\n                              unsigned flags, void (*fn)(void *), void *arg);\nstruct mg_connection *mg_connect_svc(struct mg_mgr *mgr, const char *url,\n                                     mg_event_handler_t fn, void *fn_data,\n                                     mg_event_handler_t pfn, void *pfn_data);\nvoid mg_multicast_restore(struct mg_connection *c, uint8_t *from);\n\n\n\n\n\n\n\n\nstruct mg_http_header {\n  struct mg_str name;   // Header name\n  struct mg_str value;  // Header value\n};\n\nstruct mg_http_message {\n  struct mg_str method, uri, query, proto;             // Request/response line\n  struct mg_http_header headers[MG_MAX_HTTP_HEADERS];  // Headers\n  struct mg_str body;                                  // Body\n  struct mg_str head;                                  // Request + headers\n  struct mg_str message;  // Request + headers + body\n};\n\n// Parameter for mg_http_serve_dir()\nstruct mg_http_serve_opts {\n  const char *root_dir;       // Web root directory, must be non-NULL\n  const char *ssi_pattern;    // SSI file name pattern, e.g. #.shtml\n  const char *extra_headers;  // Extra HTTP headers to add in responses\n  const char *mime_types;     // Extra mime types, ext1=type1,ext2=type2,..\n  const char *page404;        // Path to the 404 page, or NULL by default\n  struct mg_fs *fs;           // Filesystem implementation. Use NULL for POSIX\n};\n\n// Parameter for mg_http_next_multipart\nstruct mg_http_part {\n  struct mg_str name;      // Form field name\n  struct mg_str filename;  // Filename for file uploads\n  struct mg_str body;      // Part contents\n};\n\nint mg_http_parse(const char *s, size_t len, struct mg_http_message *);\nint mg_http_get_request_len(const unsigned char *buf, size_t buf_len);\nvoid mg_http_printf_chunk(struct mg_connection *cnn, const char *fmt, ...);\nvoid mg_http_write_chunk(struct mg_connection *c, const char *buf, size_t len);\nstruct mg_connection *mg_http_listen(struct mg_mgr *, const char *url,\n                                     mg_event_handler_t fn, void *fn_data);\nstruct mg_connection *mg_http_connect(struct mg_mgr *, const char *url,\n                                      mg_event_handler_t fn, void *fn_data);\nvoid mg_http_serve_dir(struct mg_connection *, struct mg_http_message *hm,\n                       const struct mg_http_serve_opts *);\nvoid mg_http_serve_file(struct mg_connection *, struct mg_http_message *hm,\n                        const char *path, const struct mg_http_serve_opts *);\nvoid mg_http_reply(struct mg_connection *, int status_code, const char *headers,\n                   const char *body_fmt, ...);\nstruct mg_str *mg_http_get_header(struct mg_http_message *, const char *name);\nstruct mg_str mg_http_var(struct mg_str buf, struct mg_str name);\nint mg_http_get_var(const struct mg_str *, const char *name, char *, size_t);\nint mg_url_decode(const char *s, size_t n, char *to, size_t to_len, int form);\nsize_t mg_url_encode(const char *s, size_t n, char *buf, size_t len);\nvoid mg_http_creds(struct mg_http_message *, char *, size_t, char *, size_t);\nlong mg_http_upload(struct mg_connection *c, struct mg_http_message *hm,\n                    struct mg_fs *fs, const char *dir, size_t max_size);\nvoid mg_http_bauth(struct mg_connection *, const char *user, const char *pass);\nstruct mg_str mg_http_get_header_var(struct mg_str s, struct mg_str v);\nsize_t mg_http_next_multipart(struct mg_str, size_t, struct mg_http_part *);\nint mg_http_status(const struct mg_http_message *hm);\n\n\nvoid mg_http_serve_ssi(struct mg_connection *c, const char *root,\n                       const char *fullpath);\n\n\n#define MG_TLS_NONE 0     // No TLS support\n#define MG_TLS_MBED 1     // mbedTLS\n#define MG_TLS_OPENSSL 2  // OpenSSL\n#define MG_TLS_WOLFSSL 5  // WolfSSL (based on OpenSSL)\n#define MG_TLS_BUILTIN 3  // Built-in\n#define MG_TLS_CUSTOM 4   // Custom implementation\n\n#ifndef MG_TLS\n#define MG_TLS MG_TLS_NONE\n#endif\n\n\n\n\n\nstruct mg_tls_opts {\n  struct mg_str ca;       // PEM or DER\n  struct mg_str cert;     // PEM or DER\n  struct mg_str key;      // PEM or DER\n  struct mg_str name;     // If not empty, enable host name verification\n  int skip_verification;  // Skip certificate and host name verification\n};\n\nvoid mg_tls_init(struct mg_connection *, const struct mg_tls_opts *opts);\nvoid mg_tls_free(struct mg_connection *);\nlong mg_tls_send(struct mg_connection *, const void *buf, size_t len);\nlong mg_tls_recv(struct mg_connection *, void *buf, size_t len);\nsize_t mg_tls_pending(struct mg_connection *);\nvoid mg_tls_flush(struct mg_connection *);\nvoid mg_tls_handshake(struct mg_connection *);\n\n// Private\nvoid mg_tls_ctx_init(struct mg_mgr *);\nvoid mg_tls_ctx_free(struct mg_mgr *);\n#define MG_IS_DER(buf) (((uint8_t *) (buf))[0] == 0x30)  // DER begins with 0x30\n\n// Low-level IO primives used by TLS layer\nenum { MG_IO_ERR = -1, MG_IO_WAIT = -2, MG_IO_RESET = -3 };\nlong mg_io_send(struct mg_connection *c, const void *buf, size_t len);\nlong mg_io_recv(struct mg_connection *c, void *buf, size_t len);\n#ifndef TLS_X15519_H\n#define TLS_X15519_H\n\n\n\n#define X25519_BYTES 32\nextern const uint8_t X25519_BASE_POINT[X25519_BYTES];\n\nint mg_tls_x25519(uint8_t out[X25519_BYTES], const uint8_t scalar[X25519_BYTES],\n                  const uint8_t x1[X25519_BYTES], int clamp);\n\n\n#endif /* TLS_X15519_H */\n/******************************************************************************\n *\n * THIS SOURCE CODE IS HEREBY PLACED INTO THE PUBLIC DOMAIN FOR THE GOOD OF ALL\n *\n * This is a simple and straightforward implementation of AES-GCM authenticated\n * encryption. The focus of this work was correctness & accuracy. It is written\n * in straight 'C' without any particular focus upon optimization or speed. It\n * should be endian (memory byte order) neutral since the few places that care\n * are handled explicitly.\n *\n * This implementation of AES-GCM was created by Steven M. Gibson of GRC.com.\n *\n * It is intended for general purpose use, but was written in support of GRC's\n * reference implementation of the SQRL (Secure Quick Reliable Login) client.\n *\n * See:    http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf\n *         http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/ \\\n *         gcm/gcm-revised-spec.pdf\n *\n * NO COPYRIGHT IS CLAIMED IN THIS WORK, HOWEVER, NEITHER IS ANY WARRANTY MADE\n * REGARDING ITS FITNESS FOR ANY PARTICULAR PURPOSE. USE IT AT YOUR OWN RISK.\n *\n *******************************************************************************/\n#ifndef TLS_AES128_H\n#define TLS_AES128_H\n\n/******************************************************************************\n *  AES_CONTEXT : cipher context / holds inter-call data\n ******************************************************************************/\ntypedef struct {\n  int mode;          // 1 for Encryption, 0 for Decryption\n  int rounds;        // keysize-based rounds count\n  uint32_t *rk;      // pointer to current round key\n  uint32_t buf[68];  // key expansion buffer\n} aes_context;\n\n\n#define GCM_AUTH_FAILURE 0x55555555  // authentication failure\n\n/******************************************************************************\n *  GCM_CONTEXT : MUST be called once before ANY use of this library\n ******************************************************************************/\nint mg_gcm_initialize(void);\n\n//\n//  aes-gcm.h\n//  MKo\n//\n//  Created by Markus Kosmal on 20/11/14.\n//\n//\nint mg_aes_gcm_encrypt(unsigned char *output, const unsigned char *input,\n                       size_t input_length, const unsigned char *key,\n                       const size_t key_len, const unsigned char *iv,\n                       const size_t iv_len, unsigned char *aead,\n                       size_t aead_len, unsigned char *tag,\n                       const size_t tag_len);\n\nint mg_aes_gcm_decrypt(unsigned char *output, const unsigned char *input,\n                       size_t input_length, const unsigned char *key,\n                       const size_t key_len, const unsigned char *iv,\n                       const size_t iv_len);\n\n#endif /* TLS_AES128_H */\n\n// End of aes128 PD\n\n\n\n#define MG_UECC_SUPPORTS_secp256r1 1\n/* Copyright 2014, Kenneth MacKay. Licensed under the BSD 2-clause license. */\n\n#ifndef _UECC_H_\n#define _UECC_H_\n\n/* Platform selection options.\nIf MG_UECC_PLATFORM is not defined, the code will try to guess it based on\ncompiler macros. Possible values for MG_UECC_PLATFORM are defined below: */\n#define mg_uecc_arch_other 0\n#define mg_uecc_x86 1\n#define mg_uecc_x86_64 2\n#define mg_uecc_arm 3\n#define mg_uecc_arm_thumb 4\n#define mg_uecc_arm_thumb2 5\n#define mg_uecc_arm64 6\n#define mg_uecc_avr 7\n\n/* If desired, you can define MG_UECC_WORD_SIZE as appropriate for your platform\n(1, 4, or 8 bytes). If MG_UECC_WORD_SIZE is not explicitly defined then it will\nbe automatically set based on your platform. */\n\n/* Optimization level; trade speed for code size.\n   Larger values produce code that is faster but larger.\n   Currently supported values are 0 - 4; 0 is unusably slow for most\n   applications. Optimization level 4 currently only has an effect ARM platforms\n   where more than one curve is enabled. */\n#ifndef MG_UECC_OPTIMIZATION_LEVEL\n#define MG_UECC_OPTIMIZATION_LEVEL 2\n#endif\n\n/* MG_UECC_SQUARE_FUNC - If enabled (defined as nonzero), this will cause a\nspecific function to be used for (scalar) squaring instead of the generic\nmultiplication function. This can make things faster somewhat faster, but\nincreases the code size. */\n#ifndef MG_UECC_SQUARE_FUNC\n#define MG_UECC_SQUARE_FUNC 0\n#endif\n\n/* MG_UECC_VLI_NATIVE_LITTLE_ENDIAN - If enabled (defined as nonzero), this will\nswitch to native little-endian format for *all* arrays passed in and out of the\npublic API. This includes public and private keys, shared secrets, signatures\nand message hashes. Using this switch reduces the amount of call stack memory\nused by uECC, since less intermediate translations are required. Note that this\nwill *only* work on native little-endian processors and it will treat the\nuint8_t arrays passed into the public API as word arrays, therefore requiring\nthe provided byte arrays to be word aligned on architectures that do not support\nunaligned accesses. IMPORTANT: Keys and signatures generated with\nMG_UECC_VLI_NATIVE_LITTLE_ENDIAN=1 are incompatible with keys and signatures\ngenerated with MG_UECC_VLI_NATIVE_LITTLE_ENDIAN=0; all parties must use the same\nendianness. */\n#ifndef MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n#define MG_UECC_VLI_NATIVE_LITTLE_ENDIAN 0\n#endif\n\n/* Curve support selection. Set to 0 to remove that curve. */\n#ifndef MG_UECC_SUPPORTS_secp160r1\n#define MG_UECC_SUPPORTS_secp160r1 0\n#endif\n#ifndef MG_UECC_SUPPORTS_secp192r1\n#define MG_UECC_SUPPORTS_secp192r1 0\n#endif\n#ifndef MG_UECC_SUPPORTS_secp224r1\n#define MG_UECC_SUPPORTS_secp224r1 0\n#endif\n#ifndef MG_UECC_SUPPORTS_secp256r1\n#define MG_UECC_SUPPORTS_secp256r1 1\n#endif\n#ifndef MG_UECC_SUPPORTS_secp256k1\n#define MG_UECC_SUPPORTS_secp256k1 0\n#endif\n\n/* Specifies whether compressed point format is supported.\n   Set to 0 to disable point compression/decompression functions. */\n#ifndef MG_UECC_SUPPORT_COMPRESSED_POINT\n#define MG_UECC_SUPPORT_COMPRESSED_POINT 1\n#endif\n\nstruct MG_UECC_Curve_t;\ntypedef const struct MG_UECC_Curve_t *MG_UECC_Curve;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if MG_UECC_SUPPORTS_secp160r1\nMG_UECC_Curve mg_uecc_secp160r1(void);\n#endif\n#if MG_UECC_SUPPORTS_secp192r1\nMG_UECC_Curve mg_uecc_secp192r1(void);\n#endif\n#if MG_UECC_SUPPORTS_secp224r1\nMG_UECC_Curve mg_uecc_secp224r1(void);\n#endif\n#if MG_UECC_SUPPORTS_secp256r1\nMG_UECC_Curve mg_uecc_secp256r1(void);\n#endif\n#if MG_UECC_SUPPORTS_secp256k1\nMG_UECC_Curve mg_uecc_secp256k1(void);\n#endif\n\n/* MG_UECC_RNG_Function type\nThe RNG function should fill 'size' random bytes into 'dest'. It should return 1\nif 'dest' was filled with random data, or 0 if the random data could not be\ngenerated. The filled-in values should be either truly random, or from a\ncryptographically-secure PRNG.\n\nA correctly functioning RNG function must be set (using mg_uecc_set_rng())\nbefore calling mg_uecc_make_key() or mg_uecc_sign().\n\nSetting a correctly functioning RNG function improves the resistance to\nside-channel attacks for mg_uecc_shared_secret() and\nmg_uecc_sign_deterministic().\n\nA correct RNG function is set by default when building for Windows, Linux, or OS\nX. If you are building on another POSIX-compliant system that supports\n/dev/random or /dev/urandom, you can define MG_UECC_POSIX to use the predefined\nRNG. For embedded platforms there is no predefined RNG function; you must\nprovide your own.\n*/\ntypedef int (*MG_UECC_RNG_Function)(uint8_t *dest, unsigned size);\n\n/* mg_uecc_set_rng() function.\nSet the function that will be used to generate random bytes. The RNG function\nshould return 1 if the random data was generated, or 0 if the random data could\nnot be generated.\n\nOn platforms where there is no predefined RNG function (eg embedded platforms),\nthis must be called before mg_uecc_make_key() or mg_uecc_sign() are used.\n\nInputs:\n    rng_function - The function that will be used to generate random bytes.\n*/\nvoid mg_uecc_set_rng(MG_UECC_RNG_Function rng_function);\n\n/* mg_uecc_get_rng() function.\n\nReturns the function that will be used to generate random bytes.\n*/\nMG_UECC_RNG_Function mg_uecc_get_rng(void);\n\n/* mg_uecc_curve_private_key_size() function.\n\nReturns the size of a private key for the curve in bytes.\n*/\nint mg_uecc_curve_private_key_size(MG_UECC_Curve curve);\n\n/* mg_uecc_curve_public_key_size() function.\n\nReturns the size of a public key for the curve in bytes.\n*/\nint mg_uecc_curve_public_key_size(MG_UECC_Curve curve);\n\n/* mg_uecc_make_key() function.\nCreate a public/private key pair.\n\nOutputs:\n    public_key  - Will be filled in with the public key. Must be at least 2 *\nthe curve size (in bytes) long. For example, if the curve is secp256r1,\npublic_key must be 64 bytes long. private_key - Will be filled in with the\nprivate key. Must be as long as the curve order; this is typically the same as\nthe curve size, except for secp160r1. For example, if the curve is secp256r1,\nprivate_key must be 32 bytes long.\n\n                  For secp160r1, private_key must be 21 bytes long! Note that\nthe first byte will almost always be 0 (there is about a 1 in 2^80 chance of it\nbeing non-zero).\n\nReturns 1 if the key pair was generated successfully, 0 if an error occurred.\n*/\nint mg_uecc_make_key(uint8_t *public_key, uint8_t *private_key,\n                     MG_UECC_Curve curve);\n\n/* mg_uecc_shared_secret() function.\nCompute a shared secret given your secret key and someone else's public key. If\nthe public key is not from a trusted source and has not been previously\nverified, you should verify it first using mg_uecc_valid_public_key(). Note: It\nis recommended that you hash the result of mg_uecc_shared_secret() before using\nit for symmetric encryption or HMAC.\n\nInputs:\n    public_key  - The public key of the remote party.\n    private_key - Your private key.\n\nOutputs:\n    secret - Will be filled in with the shared secret value. Must be the same\nsize as the curve size; for example, if the curve is secp256r1, secret must be\n32 bytes long.\n\nReturns 1 if the shared secret was generated successfully, 0 if an error\noccurred.\n*/\nint mg_uecc_shared_secret(const uint8_t *public_key, const uint8_t *private_key,\n                          uint8_t *secret, MG_UECC_Curve curve);\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n/* mg_uecc_compress() function.\nCompress a public key.\n\nInputs:\n    public_key - The public key to compress.\n\nOutputs:\n    compressed - Will be filled in with the compressed public key. Must be at\nleast (curve size + 1) bytes long; for example, if the curve is secp256r1,\n                 compressed must be 33 bytes long.\n*/\nvoid mg_uecc_compress(const uint8_t *public_key, uint8_t *compressed,\n                      MG_UECC_Curve curve);\n\n/* mg_uecc_decompress() function.\nDecompress a compressed public key.\n\nInputs:\n    compressed - The compressed public key.\n\nOutputs:\n    public_key - Will be filled in with the decompressed public key.\n*/\nvoid mg_uecc_decompress(const uint8_t *compressed, uint8_t *public_key,\n                        MG_UECC_Curve curve);\n#endif /* MG_UECC_SUPPORT_COMPRESSED_POINT */\n\n/* mg_uecc_valid_public_key() function.\nCheck to see if a public key is valid.\n\nNote that you are not required to check for a valid public key before using any\nother uECC functions. However, you may wish to avoid spending CPU time computing\na shared secret or verifying a signature using an invalid public key.\n\nInputs:\n    public_key - The public key to check.\n\nReturns 1 if the public key is valid, 0 if it is invalid.\n*/\nint mg_uecc_valid_public_key(const uint8_t *public_key, MG_UECC_Curve curve);\n\n/* mg_uecc_compute_public_key() function.\nCompute the corresponding public key for a private key.\n\nInputs:\n    private_key - The private key to compute the public key for\n\nOutputs:\n    public_key - Will be filled in with the corresponding public key\n\nReturns 1 if the key was computed successfully, 0 if an error occurred.\n*/\nint mg_uecc_compute_public_key(const uint8_t *private_key, uint8_t *public_key,\n                               MG_UECC_Curve curve);\n\n/* mg_uecc_sign() function.\nGenerate an ECDSA signature for a given hash value.\n\nUsage: Compute a hash of the data you wish to sign (SHA-2 is recommended) and\npass it in to this function along with your private key.\n\nInputs:\n    private_key  - Your private key.\n    message_hash - The hash of the message to sign.\n    hash_size    - The size of message_hash in bytes.\n\nOutputs:\n    signature - Will be filled in with the signature value. Must be at least 2 *\ncurve size long. For example, if the curve is secp256r1, signature must be 64\nbytes long.\n\nReturns 1 if the signature generated successfully, 0 if an error occurred.\n*/\nint mg_uecc_sign(const uint8_t *private_key, const uint8_t *message_hash,\n                 unsigned hash_size, uint8_t *signature, MG_UECC_Curve curve);\n\n/* MG_UECC_HashContext structure.\nThis is used to pass in an arbitrary hash function to\nmg_uecc_sign_deterministic(). The structure will be used for multiple hash\ncomputations; each time a new hash is computed, init_hash() will be called,\nfollowed by one or more calls to update_hash(), and finally a call to\nfinish_hash() to produce the resulting hash.\n\nThe intention is that you will create a structure that includes\nMG_UECC_HashContext followed by any hash-specific data. For example:\n\ntypedef struct SHA256_HashContext {\n    MG_UECC_HashContext uECC;\n    SHA256_CTX ctx;\n} SHA256_HashContext;\n\nvoid init_SHA256(MG_UECC_HashContext *base) {\n    SHA256_HashContext *context = (SHA256_HashContext *)base;\n    SHA256_Init(&context->ctx);\n}\n\nvoid update_SHA256(MG_UECC_HashContext *base,\n                   const uint8_t *message,\n                   unsigned message_size) {\n    SHA256_HashContext *context = (SHA256_HashContext *)base;\n    SHA256_Update(&context->ctx, message, message_size);\n}\n\nvoid finish_SHA256(MG_UECC_HashContext *base, uint8_t *hash_result) {\n    SHA256_HashContext *context = (SHA256_HashContext *)base;\n    SHA256_Final(hash_result, &context->ctx);\n}\n\n... when signing ...\n{\n    uint8_t tmp[32 + 32 + 64];\n    SHA256_HashContext ctx = {{&init_SHA256, &update_SHA256, &finish_SHA256, 64,\n32, tmp}}; mg_uecc_sign_deterministic(key, message_hash, &ctx.uECC, signature);\n}\n*/\ntypedef struct MG_UECC_HashContext {\n  void (*init_hash)(const struct MG_UECC_HashContext *context);\n  void (*update_hash)(const struct MG_UECC_HashContext *context,\n                      const uint8_t *message, unsigned message_size);\n  void (*finish_hash)(const struct MG_UECC_HashContext *context,\n                      uint8_t *hash_result);\n  unsigned\n      block_size; /* Hash function block size in bytes, eg 64 for SHA-256. */\n  unsigned\n      result_size; /* Hash function result size in bytes, eg 32 for SHA-256. */\n  uint8_t *tmp;    /* Must point to a buffer of at least (2 * result_size +\n                      block_size) bytes. */\n} MG_UECC_HashContext;\n\n/* mg_uecc_sign_deterministic() function.\nGenerate an ECDSA signature for a given hash value, using a deterministic\nalgorithm (see RFC 6979). You do not need to set the RNG using mg_uecc_set_rng()\nbefore calling this function; however, if the RNG is defined it will improve\nresistance to side-channel attacks.\n\nUsage: Compute a hash of the data you wish to sign (SHA-2 is recommended) and\npass it to this function along with your private key and a hash context. Note\nthat the message_hash does not need to be computed with the same hash function\nused by hash_context.\n\nInputs:\n    private_key  - Your private key.\n    message_hash - The hash of the message to sign.\n    hash_size    - The size of message_hash in bytes.\n    hash_context - A hash context to use.\n\nOutputs:\n    signature - Will be filled in with the signature value.\n\nReturns 1 if the signature generated successfully, 0 if an error occurred.\n*/\nint mg_uecc_sign_deterministic(const uint8_t *private_key,\n                               const uint8_t *message_hash, unsigned hash_size,\n                               const MG_UECC_HashContext *hash_context,\n                               uint8_t *signature, MG_UECC_Curve curve);\n\n/* mg_uecc_verify() function.\nVerify an ECDSA signature.\n\nUsage: Compute the hash of the signed data using the same hash as the signer and\npass it to this function along with the signer's public key and the signature\nvalues (r and s).\n\nInputs:\n    public_key   - The signer's public key.\n    message_hash - The hash of the signed data.\n    hash_size    - The size of message_hash in bytes.\n    signature    - The signature value.\n\nReturns 1 if the signature is valid, 0 if it is invalid.\n*/\nint mg_uecc_verify(const uint8_t *public_key, const uint8_t *message_hash,\n                   unsigned hash_size, const uint8_t *signature,\n                   MG_UECC_Curve curve);\n\n#ifdef __cplusplus\n} /* end of extern \"C\" */\n#endif\n\n#endif /* _UECC_H_ */\n\n/* Copyright 2015, Kenneth MacKay. Licensed under the BSD 2-clause license. */\n\n#ifndef _UECC_TYPES_H_\n#define _UECC_TYPES_H_\n\n#ifndef MG_UECC_PLATFORM\n#if defined(__AVR__) && __AVR__\n#define MG_UECC_PLATFORM mg_uecc_avr\n#elif defined(__thumb2__) || \\\n    defined(_M_ARMT) /* I think MSVC only supports Thumb-2 targets */\n#define MG_UECC_PLATFORM mg_uecc_arm_thumb2\n#elif defined(__thumb__)\n#define MG_UECC_PLATFORM mg_uecc_arm_thumb\n#elif defined(__arm__) || defined(_M_ARM)\n#define MG_UECC_PLATFORM mg_uecc_arm\n#elif defined(__aarch64__)\n#define MG_UECC_PLATFORM mg_uecc_arm64\n#elif defined(__i386__) || defined(_M_IX86) || defined(_X86_) || \\\n    defined(__I86__)\n#define MG_UECC_PLATFORM mg_uecc_x86\n#elif defined(__amd64__) || defined(_M_X64)\n#define MG_UECC_PLATFORM mg_uecc_x86_64\n#else\n#define MG_UECC_PLATFORM mg_uecc_arch_other\n#endif\n#endif\n\n#ifndef MG_UECC_ARM_USE_UMAAL\n#if (MG_UECC_PLATFORM == mg_uecc_arm) && (__ARM_ARCH >= 6)\n#define MG_UECC_ARM_USE_UMAAL 1\n#elif (MG_UECC_PLATFORM == mg_uecc_arm_thumb2) && (__ARM_ARCH >= 6) && \\\n    (!defined(__ARM_ARCH_7M__) || !__ARM_ARCH_7M__)\n#define MG_UECC_ARM_USE_UMAAL 1\n#else\n#define MG_UECC_ARM_USE_UMAAL 0\n#endif\n#endif\n\n#ifndef MG_UECC_WORD_SIZE\n#if MG_UECC_PLATFORM == mg_uecc_avr\n#define MG_UECC_WORD_SIZE 1\n#elif (MG_UECC_PLATFORM == mg_uecc_x86_64 || MG_UECC_PLATFORM == mg_uecc_arm64)\n#define MG_UECC_WORD_SIZE 8\n#else\n#define MG_UECC_WORD_SIZE 4\n#endif\n#endif\n\n#if (MG_UECC_WORD_SIZE != 1) && (MG_UECC_WORD_SIZE != 4) && \\\n    (MG_UECC_WORD_SIZE != 8)\n#error \"Unsupported value for MG_UECC_WORD_SIZE\"\n#endif\n\n#if ((MG_UECC_PLATFORM == mg_uecc_avr) && (MG_UECC_WORD_SIZE != 1))\n#pragma message(\"MG_UECC_WORD_SIZE must be 1 for AVR\")\n#undef MG_UECC_WORD_SIZE\n#define MG_UECC_WORD_SIZE 1\n#endif\n\n#if ((MG_UECC_PLATFORM == mg_uecc_arm ||         \\\n      MG_UECC_PLATFORM == mg_uecc_arm_thumb ||   \\\n      MG_UECC_PLATFORM == mg_uecc_arm_thumb2) && \\\n     (MG_UECC_WORD_SIZE != 4))\n#pragma message(\"MG_UECC_WORD_SIZE must be 4 for ARM\")\n#undef MG_UECC_WORD_SIZE\n#define MG_UECC_WORD_SIZE 4\n#endif\n\ntypedef int8_t wordcount_t;\ntypedef int16_t bitcount_t;\ntypedef int8_t cmpresult_t;\n\n#if (MG_UECC_WORD_SIZE == 1)\n\ntypedef uint8_t mg_uecc_word_t;\ntypedef uint16_t mg_uecc_dword_t;\n\n#define HIGH_BIT_SET 0x80\n#define MG_UECC_WORD_BITS 8\n#define MG_UECC_WORD_BITS_SHIFT 3\n#define MG_UECC_WORD_BITS_MASK 0x07\n\n#elif (MG_UECC_WORD_SIZE == 4)\n\ntypedef uint32_t mg_uecc_word_t;\ntypedef uint64_t mg_uecc_dword_t;\n\n#define HIGH_BIT_SET 0x80000000\n#define MG_UECC_WORD_BITS 32\n#define MG_UECC_WORD_BITS_SHIFT 5\n#define MG_UECC_WORD_BITS_MASK 0x01F\n\n#elif (MG_UECC_WORD_SIZE == 8)\n\ntypedef uint64_t mg_uecc_word_t;\n\n#define HIGH_BIT_SET 0x8000000000000000U\n#define MG_UECC_WORD_BITS 64\n#define MG_UECC_WORD_BITS_SHIFT 6\n#define MG_UECC_WORD_BITS_MASK 0x03F\n\n#endif /* MG_UECC_WORD_SIZE */\n\n#endif /* _UECC_TYPES_H_ */\n\n/* Copyright 2015, Kenneth MacKay. Licensed under the BSD 2-clause license. */\n\n#ifndef _UECC_VLI_H_\n#define _UECC_VLI_H_\n\n// \n// \n\n/* Functions for raw large-integer manipulation. These are only available\n   if uECC.c is compiled with MG_UECC_ENABLE_VLI_API defined to 1. */\n#ifndef MG_UECC_ENABLE_VLI_API\n#define MG_UECC_ENABLE_VLI_API 0\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if MG_UECC_ENABLE_VLI_API\n\nvoid mg_uecc_vli_clear(mg_uecc_word_t *vli, wordcount_t num_words);\n\n/* Constant-time comparison to zero - secure way to compare long integers */\n/* Returns 1 if vli == 0, 0 otherwise. */\nmg_uecc_word_t mg_uecc_vli_isZero(const mg_uecc_word_t *vli,\n                                  wordcount_t num_words);\n\n/* Returns nonzero if bit 'bit' of vli is set. */\nmg_uecc_word_t mg_uecc_vli_testBit(const mg_uecc_word_t *vli, bitcount_t bit);\n\n/* Counts the number of bits required to represent vli. */\nbitcount_t mg_uecc_vli_numBits(const mg_uecc_word_t *vli,\n                               const wordcount_t max_words);\n\n/* Sets dest = src. */\nvoid mg_uecc_vli_set(mg_uecc_word_t *dest, const mg_uecc_word_t *src,\n                     wordcount_t num_words);\n\n/* Constant-time comparison function - secure way to compare long integers */\n/* Returns one if left == right, zero otherwise */\nmg_uecc_word_t mg_uecc_vli_equal(const mg_uecc_word_t *left,\n                                 const mg_uecc_word_t *right,\n                                 wordcount_t num_words);\n\n/* Constant-time comparison function - secure way to compare long integers */\n/* Returns sign of left - right, in constant time. */\ncmpresult_t mg_uecc_vli_cmp(const mg_uecc_word_t *left,\n                            const mg_uecc_word_t *right, wordcount_t num_words);\n\n/* Computes vli = vli >> 1. */\nvoid mg_uecc_vli_rshift1(mg_uecc_word_t *vli, wordcount_t num_words);\n\n/* Computes result = left + right, returning carry. Can modify in place. */\nmg_uecc_word_t mg_uecc_vli_add(mg_uecc_word_t *result,\n                               const mg_uecc_word_t *left,\n                               const mg_uecc_word_t *right,\n                               wordcount_t num_words);\n\n/* Computes result = left - right, returning borrow. Can modify in place. */\nmg_uecc_word_t mg_uecc_vli_sub(mg_uecc_word_t *result,\n                               const mg_uecc_word_t *left,\n                               const mg_uecc_word_t *right,\n                               wordcount_t num_words);\n\n/* Computes result = left * right. Result must be 2 * num_words long. */\nvoid mg_uecc_vli_mult(mg_uecc_word_t *result, const mg_uecc_word_t *left,\n                      const mg_uecc_word_t *right, wordcount_t num_words);\n\n/* Computes result = left^2. Result must be 2 * num_words long. */\nvoid mg_uecc_vli_square(mg_uecc_word_t *result, const mg_uecc_word_t *left,\n                        wordcount_t num_words);\n\n/* Computes result = (left + right) % mod.\n   Assumes that left < mod and right < mod, and that result does not overlap\n   mod. */\nvoid mg_uecc_vli_modAdd(mg_uecc_word_t *result, const mg_uecc_word_t *left,\n                        const mg_uecc_word_t *right, const mg_uecc_word_t *mod,\n                        wordcount_t num_words);\n\n/* Computes result = (left - right) % mod.\n   Assumes that left < mod and right < mod, and that result does not overlap\n   mod. */\nvoid mg_uecc_vli_modSub(mg_uecc_word_t *result, const mg_uecc_word_t *left,\n                        const mg_uecc_word_t *right, const mg_uecc_word_t *mod,\n                        wordcount_t num_words);\n\n/* Computes result = product % mod, where product is 2N words long.\n   Currently only designed to work for mod == curve->p or curve_n. */\nvoid mg_uecc_vli_mmod(mg_uecc_word_t *result, mg_uecc_word_t *product,\n                      const mg_uecc_word_t *mod, wordcount_t num_words);\n\n/* Calculates result = product (mod curve->p), where product is up to\n   2 * curve->num_words long. */\nvoid mg_uecc_vli_mmod_fast(mg_uecc_word_t *result, mg_uecc_word_t *product,\n                           MG_UECC_Curve curve);\n\n/* Computes result = (left * right) % mod.\n   Currently only designed to work for mod == curve->p or curve_n. */\nvoid mg_uecc_vli_modMult(mg_uecc_word_t *result, const mg_uecc_word_t *left,\n                         const mg_uecc_word_t *right, const mg_uecc_word_t *mod,\n                         wordcount_t num_words);\n\n/* Computes result = (left * right) % curve->p. */\nvoid mg_uecc_vli_modMult_fast(mg_uecc_word_t *result,\n                              const mg_uecc_word_t *left,\n                              const mg_uecc_word_t *right, MG_UECC_Curve curve);\n\n/* Computes result = left^2 % mod.\n   Currently only designed to work for mod == curve->p or curve_n. */\nvoid mg_uecc_vli_modSquare(mg_uecc_word_t *result, const mg_uecc_word_t *left,\n                           const mg_uecc_word_t *mod, wordcount_t num_words);\n\n/* Computes result = left^2 % curve->p. */\nvoid mg_uecc_vli_modSquare_fast(mg_uecc_word_t *result,\n                                const mg_uecc_word_t *left,\n                                MG_UECC_Curve curve);\n\n/* Computes result = (1 / input) % mod.*/\nvoid mg_uecc_vli_modInv(mg_uecc_word_t *result, const mg_uecc_word_t *input,\n                        const mg_uecc_word_t *mod, wordcount_t num_words);\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n/* Calculates a = sqrt(a) (mod curve->p) */\nvoid mg_uecc_vli_mod_sqrt(mg_uecc_word_t *a, MG_UECC_Curve curve);\n#endif\n\n/* Converts an integer in uECC native format to big-endian bytes. */\nvoid mg_uecc_vli_nativeToBytes(uint8_t *bytes, int num_bytes,\n                               const mg_uecc_word_t *native);\n/* Converts big-endian bytes to an integer in uECC native format. */\nvoid mg_uecc_vli_bytesToNative(mg_uecc_word_t *native, const uint8_t *bytes,\n                               int num_bytes);\n\nunsigned mg_uecc_curve_num_words(MG_UECC_Curve curve);\nunsigned mg_uecc_curve_num_bytes(MG_UECC_Curve curve);\nunsigned mg_uecc_curve_num_bits(MG_UECC_Curve curve);\nunsigned mg_uecc_curve_num_n_words(MG_UECC_Curve curve);\nunsigned mg_uecc_curve_num_n_bytes(MG_UECC_Curve curve);\nunsigned mg_uecc_curve_num_n_bits(MG_UECC_Curve curve);\n\nconst mg_uecc_word_t *mg_uecc_curve_p(MG_UECC_Curve curve);\nconst mg_uecc_word_t *mg_uecc_curve_n(MG_UECC_Curve curve);\nconst mg_uecc_word_t *mg_uecc_curve_G(MG_UECC_Curve curve);\nconst mg_uecc_word_t *mg_uecc_curve_b(MG_UECC_Curve curve);\n\nint mg_uecc_valid_point(const mg_uecc_word_t *point, MG_UECC_Curve curve);\n\n/* Multiplies a point by a scalar. Points are represented by the X coordinate\n   followed by the Y coordinate in the same array, both coordinates are\n   curve->num_words long. Note that scalar must be curve->num_n_words long (NOT\n   curve->num_words). */\nvoid mg_uecc_point_mult(mg_uecc_word_t *result, const mg_uecc_word_t *point,\n                        const mg_uecc_word_t *scalar, MG_UECC_Curve curve);\n\n/* Generates a random integer in the range 0 < random < top.\n   Both random and top have num_words words. */\nint mg_uecc_generate_random_int(mg_uecc_word_t *random,\n                                const mg_uecc_word_t *top,\n                                wordcount_t num_words);\n\n#endif /* MG_UECC_ENABLE_VLI_API */\n\n#ifdef __cplusplus\n} /* end of extern \"C\" */\n#endif\n\n#endif /* _UECC_VLI_H_ */\n\n// End of uecc BSD-2\n// portable8439 v1.0.1\n// Source: https://github.com/DavyLandman/portable8439\n// Licensed under CC0-1.0\n// Contains poly1305-donna e6ad6e091d30d7f4ec2d4f978be1fcfcbce72781 (Public\n// Domain)\n\n\n\n\n\n#if MG_TLS == MG_TLS_BUILTIN\n#ifndef __PORTABLE_8439_H\n#define __PORTABLE_8439_H\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n// provide your own decl specificier like -DPORTABLE_8439_DECL=ICACHE_RAM_ATTR\n#ifndef PORTABLE_8439_DECL\n#define PORTABLE_8439_DECL\n#endif\n\n/*\n This library implements RFC 8439 a.k.a. ChaCha20-Poly1305 AEAD\n\n You can use this library to avoid attackers mutating or reusing your\n encrypted messages. This does assume you never reuse a nonce+key pair and,\n if possible, carefully pick your associated data.\n*/\n\n/* Make sure we are either nested in C++ or running in a C99+ compiler\n#if !defined(__cplusplus) && !defined(_MSC_VER) && \\\n    (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L)\n#error \"C99 or newer required\"\n#endif */\n\n// #if CHAR_BIT > 8\n// #    error \"Systems without native octals not suppoted\"\n// #endif\n\n#if defined(_MSC_VER) || defined(__cplusplus)\n// add restrict support is possible\n#if (defined(_MSC_VER) && _MSC_VER >= 1900) || defined(__clang__) || \\\n    defined(__GNUC__)\n#define restrict __restrict\n#else\n#define restrict\n#endif\n#endif\n\n#define RFC_8439_TAG_SIZE (16)\n#define RFC_8439_KEY_SIZE (32)\n#define RFC_8439_NONCE_SIZE (12)\n\n/*\n    Encrypt/Seal plain text bytes into a cipher text that can only be\n    decrypted by knowing the key, nonce and associated data.\n\n    input:\n        - key: RFC_8439_KEY_SIZE bytes that all parties have agreed\n            upon beforehand\n        - nonce: RFC_8439_NONCE_SIZE bytes that should never be repeated\n            for the same key. A counter or a pseudo-random value are fine.\n        - ad: associated data to include with calculating the tag of the\n            cipher text. Can be null for empty.\n        - plain_text: data to be encrypted, pointer + size should not overlap\n            with cipher_text pointer\n\n    output:\n        - cipher_text: encrypted plain_text with a tag appended. Make sure to\n            allocate at least plain_text_size + RFC_8439_TAG_SIZE\n\n    returns:\n        - size of bytes written to cipher_text, can be -1 if overlapping\n            pointers are passed for plain_text and cipher_text\n*/\nPORTABLE_8439_DECL size_t mg_chacha20_poly1305_encrypt(\n    uint8_t *restrict cipher_text, const uint8_t key[RFC_8439_KEY_SIZE],\n    const uint8_t nonce[RFC_8439_NONCE_SIZE], const uint8_t *restrict ad,\n    size_t ad_size, const uint8_t *restrict plain_text, size_t plain_text_size);\n\n/*\n    Decrypt/unseal cipher text given the right key, nonce, and additional data.\n\n    input:\n        - key: RFC_8439_KEY_SIZE bytes that all parties have agreed\n            upon beforehand\n        - nonce: RFC_8439_NONCE_SIZE bytes that should never be repeated for\n            the same key. A counter or a pseudo-random value are fine.\n        - ad: associated data to include with calculating the tag of the\n            cipher text. Can be null for empty.\n        - cipher_text: encrypted message.\n\n    output:\n        - plain_text: data to be encrypted, pointer + size should not overlap\n            with cipher_text pointer, leave at least enough room for\n            cipher_text_size - RFC_8439_TAG_SIZE\n\n    returns:\n        - size of bytes written to plain_text, -1 signals either:\n            - incorrect key/nonce/ad\n            - corrupted cipher_text\n            - overlapping pointers are passed for plain_text and cipher_text\n*/\nPORTABLE_8439_DECL size_t mg_chacha20_poly1305_decrypt(\n    uint8_t *restrict plain_text, const uint8_t key[RFC_8439_KEY_SIZE],\n    const uint8_t nonce[RFC_8439_NONCE_SIZE],\n    const uint8_t *restrict cipher_text, size_t cipher_text_size);\n#if defined(__cplusplus)\n}\n#endif\n#endif\n#endif\n#ifndef TLS_RSA_H\n#define TLS_RSA_H\n\n\nint mg_rsa_mod_pow(const uint8_t *mod, size_t modsz, const uint8_t *exp, size_t expsz, const uint8_t *msg, size_t msgsz, uint8_t *out, size_t outsz);\nint mg_rsa_crt_sign(const uint8_t *em, size_t em_len,\n                    const uint8_t *dP, size_t dP_len,\n                    const uint8_t *dQ, size_t dQ_len,\n                    const uint8_t *p, size_t p_len,\n                    const uint8_t *q, size_t q_len,\n                    const uint8_t *qInv, size_t qInv_len,\n                    uint8_t *signature, size_t sig_len);\n#endif // TLS_RSA_H\n\n\n\n\n\n\n\n#if MG_TLS == MG_TLS_MBED\n#include <mbedtls/debug.h>\n#include <mbedtls/error.h>\n#include <mbedtls/net_sockets.h>\n#include <mbedtls/ssl.h>\n#include <mbedtls/ssl_ticket.h>\n\nstruct mg_tls_ctx {\n  int dummy;\n#ifdef MBEDTLS_SSL_SESSION_TICKETS\n  mbedtls_ssl_ticket_context tickets;\n#endif\n};\n\nstruct mg_tls {\n  mbedtls_x509_crt ca;      // Parsed CA certificate\n  mbedtls_x509_crt cert;    // Parsed certificate\n  mbedtls_pk_context pk;    // Private key context\n  mbedtls_ssl_context ssl;  // SSL/TLS context\n  mbedtls_ssl_config conf;  // SSL-TLS config\n#ifdef MBEDTLS_SSL_SESSION_TICKETS\n  mbedtls_ssl_ticket_context ticket;  // Session tickets context\n#endif\n  // https://github.com/Mbed-TLS/mbedtls/blob/3b3c652d/include/mbedtls/ssl.h#L5071C18-L5076C29\n  unsigned char *throttled_buf;  // see #3074\n  size_t throttled_len;\n};\n#endif\n\n\n#if MG_TLS == MG_TLS_OPENSSL || MG_TLS == MG_TLS_WOLFSSL\n\n#include <openssl/err.h>\n#include <openssl/ssl.h>\n\nstruct mg_tls {\n  BIO_METHOD *bm;\n  SSL_CTX *ctx;\n  SSL *ssl;\n};\n#endif\n\n\n#define WEBSOCKET_OP_CONTINUE 0\n#define WEBSOCKET_OP_TEXT 1\n#define WEBSOCKET_OP_BINARY 2\n#define WEBSOCKET_OP_CLOSE 8\n#define WEBSOCKET_OP_PING 9\n#define WEBSOCKET_OP_PONG 10\n\n\n\nstruct mg_ws_message {\n  struct mg_str data;  // Websocket message data\n  uint8_t flags;       // Websocket message flags\n};\n\nstruct mg_connection *mg_ws_connect(struct mg_mgr *, const char *url,\n                                    mg_event_handler_t fn, void *fn_data,\n                                    const char *fmt, ...);\nvoid mg_ws_upgrade(struct mg_connection *, struct mg_http_message *,\n                   const char *fmt, ...);\nsize_t mg_ws_send(struct mg_connection *, const void *buf, size_t len, int op);\nsize_t mg_ws_wrap(struct mg_connection *, size_t len, int op);\nsize_t mg_ws_printf(struct mg_connection *c, int op, const char *fmt, ...);\nsize_t mg_ws_vprintf(struct mg_connection *c, int op, const char *fmt,\n                     va_list *);\n\n\n\n\nstruct mg_connection *mg_sntp_connect(struct mg_mgr *mgr, const char *url,\n                                      mg_event_handler_t fn, void *fn_data);\nvoid mg_sntp_request(struct mg_connection *c);\nint64_t mg_sntp_parse(const unsigned char *buf, size_t len);\n\nuint64_t mg_now(void);     // Return milliseconds since Epoch\n\n\n\n\n\n#define MQTT_CMD_CONNECT 1\n#define MQTT_CMD_CONNACK 2\n#define MQTT_CMD_PUBLISH 3\n#define MQTT_CMD_PUBACK 4\n#define MQTT_CMD_PUBREC 5\n#define MQTT_CMD_PUBREL 6\n#define MQTT_CMD_PUBCOMP 7\n#define MQTT_CMD_SUBSCRIBE 8\n#define MQTT_CMD_SUBACK 9\n#define MQTT_CMD_UNSUBSCRIBE 10\n#define MQTT_CMD_UNSUBACK 11\n#define MQTT_CMD_PINGREQ 12\n#define MQTT_CMD_PINGRESP 13\n#define MQTT_CMD_DISCONNECT 14\n#define MQTT_CMD_AUTH 15\n\n#define MQTT_PROP_PAYLOAD_FORMAT_INDICATOR 0x01\n#define MQTT_PROP_MESSAGE_EXPIRY_INTERVAL 0x02\n#define MQTT_PROP_CONTENT_TYPE 0x03\n#define MQTT_PROP_RESPONSE_TOPIC 0x08\n#define MQTT_PROP_CORRELATION_DATA 0x09\n#define MQTT_PROP_SUBSCRIPTION_IDENTIFIER 0x0B\n#define MQTT_PROP_SESSION_EXPIRY_INTERVAL 0x11\n#define MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER 0x12\n#define MQTT_PROP_SERVER_KEEP_ALIVE 0x13\n#define MQTT_PROP_AUTHENTICATION_METHOD 0x15\n#define MQTT_PROP_AUTHENTICATION_DATA 0x16\n#define MQTT_PROP_REQUEST_PROBLEM_INFORMATION 0x17\n#define MQTT_PROP_WILL_DELAY_INTERVAL 0x18\n#define MQTT_PROP_REQUEST_RESPONSE_INFORMATION 0x19\n#define MQTT_PROP_RESPONSE_INFORMATION 0x1A\n#define MQTT_PROP_SERVER_REFERENCE 0x1C\n#define MQTT_PROP_REASON_STRING 0x1F\n#define MQTT_PROP_RECEIVE_MAXIMUM 0x21\n#define MQTT_PROP_TOPIC_ALIAS_MAXIMUM 0x22\n#define MQTT_PROP_TOPIC_ALIAS 0x23\n#define MQTT_PROP_MAXIMUM_QOS 0x24\n#define MQTT_PROP_RETAIN_AVAILABLE 0x25\n#define MQTT_PROP_USER_PROPERTY 0x26\n#define MQTT_PROP_MAXIMUM_PACKET_SIZE 0x27\n#define MQTT_PROP_WILDCARD_SUBSCRIPTION_AVAILABLE 0x28\n#define MQTT_PROP_SUBSCRIPTION_IDENTIFIER_AVAILABLE 0x29\n#define MQTT_PROP_SHARED_SUBSCRIPTION_AVAILABLE 0x2A\n\nenum {\n  MQTT_PROP_TYPE_BYTE,\n  MQTT_PROP_TYPE_STRING,\n  MQTT_PROP_TYPE_STRING_PAIR,\n  MQTT_PROP_TYPE_BINARY_DATA,\n  MQTT_PROP_TYPE_VARIABLE_INT,\n  MQTT_PROP_TYPE_INT,\n  MQTT_PROP_TYPE_SHORT\n};\n\nenum { MQTT_OK, MQTT_INCOMPLETE, MQTT_MALFORMED };\n\nstruct mg_mqtt_prop {\n  uint8_t id;         // Enumerated at MQTT5 Reference\n  uint32_t iv;        // Integer value for 8-, 16-, 32-bit integers types\n  struct mg_str key;  // Non-NULL only for user property type\n  struct mg_str val;  // Non-NULL only for UTF-8 types and user properties\n};\n\nstruct mg_mqtt_opts {\n  struct mg_str user;               // Username, can be empty\n  struct mg_str pass;               // Password, can be empty\n  struct mg_str client_id;          // Client ID\n  struct mg_str topic;              // message/subscription topic\n  struct mg_str message;            // message content\n  uint8_t qos;                      // message quality of service\n  uint8_t version;                  // Can be 4 (3.1.1), or 5. If 0, assume 4\n  uint16_t keepalive;               // Keep-alive timer in seconds\n  uint16_t retransmit_id;           // For PUBLISH, init to 0\n  bool retain;                      // Retain flag\n  bool clean;                       // Clean session flag\n  struct mg_mqtt_prop *props;       // MQTT5 props array\n  size_t num_props;                 // number of props\n  struct mg_mqtt_prop *will_props;  // Valid only for CONNECT packet (MQTT5)\n  size_t num_will_props;            // Number of will props\n};\n\nstruct mg_mqtt_message {\n  struct mg_str topic;  // Parsed topic for PUBLISH\n  struct mg_str data;   // Parsed message for PUBLISH\n  struct mg_str dgram;  // Whole MQTT packet, including headers\n  uint16_t id;          // For PUBACK, PUBREC, PUBREL, PUBCOMP, SUBACK, PUBLISH\n  uint8_t cmd;          // MQTT command, one of MQTT_CMD_*\n  uint8_t qos;          // Quality of service\n  uint8_t ack;          // CONNACK return code, 0 = success\n  size_t props_start;   // Offset to the start of the properties (MQTT5)\n  size_t props_size;    // Length of the properties\n};\n\nstruct mg_connection *mg_mqtt_connect(struct mg_mgr *, const char *url,\n                                      const struct mg_mqtt_opts *opts,\n                                      mg_event_handler_t fn, void *fn_data);\nstruct mg_connection *mg_mqtt_listen(struct mg_mgr *mgr, const char *url,\n                                     mg_event_handler_t fn, void *fn_data);\nvoid mg_mqtt_login(struct mg_connection *c, const struct mg_mqtt_opts *opts);\nuint16_t mg_mqtt_pub(struct mg_connection *c, const struct mg_mqtt_opts *opts);\nvoid mg_mqtt_sub(struct mg_connection *, const struct mg_mqtt_opts *opts);\nvoid mg_mqtt_unsub(struct mg_connection *c, const struct mg_mqtt_opts *opts);\nint mg_mqtt_parse(const uint8_t *, size_t, uint8_t, struct mg_mqtt_message *);\nvoid mg_mqtt_send_header(struct mg_connection *, uint8_t cmd, uint8_t flags,\n                         uint32_t len);\nvoid mg_mqtt_ping(struct mg_connection *);\nvoid mg_mqtt_pong(struct mg_connection *);\nvoid mg_mqtt_disconnect(struct mg_connection *, const struct mg_mqtt_opts *);\nsize_t mg_mqtt_next_prop(struct mg_mqtt_message *, struct mg_mqtt_prop *,\n                         size_t ofs);\n\n\n\n\n\n#define MG_DNS_RTYPE_A 1\n#define MG_DNS_RTYPE_PTR 12\n#define MG_DNS_RTYPE_TXT 16\n#define MG_DNS_RTYPE_AAAA 28\n#define MG_DNS_RTYPE_SRV 33\n\n// Mongoose sends DNS queries that contain only one question:\n// either A (IPv4) or AAAA (IPv6) address lookup.\n// Therefore, we expect zero or one answer.\n// If `resolved` is true, then `addr` contains resolved IPv4 or IPV6 address.\nstruct mg_dns_message {\n  uint16_t txnid;       // Transaction ID\n  bool resolved;        // Resolve successful, addr is set\n  struct mg_addr addr;  // Resolved address\n  char name[256];       // Host name\n};\n\nstruct mg_dns_header {\n  uint16_t txnid;  // Transaction ID\n  uint16_t flags;\n  uint16_t num_questions;\n  uint16_t num_answers;\n  uint16_t num_authority_prs;\n  uint16_t num_other_prs;\n};\n\n// DNS resource record\nstruct mg_dns_rr {\n  uint16_t nlen;    // Name or pointer length\n  uint16_t atype;   // Address type\n  uint16_t aclass;  // Address class\n  uint16_t alen;    // Address length\n};\n\n// DNS-SD response record\nstruct mg_dnssd_record {\n  struct mg_str srvcproto;  // service.proto, service name\n  struct mg_str txt;        // TXT record contents\n  uint16_t port;            // SRV record port\n};\n\n// mDNS request and response data structs passed to event handlers\nstruct mg_mdns_req {\n  struct mg_dns_rr *rr;\n  struct mg_dnssd_record *r;\n  struct mg_str reqname;   // requested name in RR\n  struct mg_str respname;  // actual name to use in response\n  struct mg_addr *addr;    // actual address to use in response\n  bool is_listing;\n  bool is_resp;\n  bool is_unicast;\n};\n\nstruct mg_mdns_resp {\n  struct mg_dns_rr *rr;\n  // TODO(scaprile )struct mg_str srvcproto; struct mg_str txt; uint16_t port; ?\n  struct mg_str name;\n  struct mg_addr addr;\n  // TODO(scaprile); bool has_A; bool has_PTR; bool has_SRV; bool has_TXT; ?\n};\n\nvoid mg_resolve(struct mg_connection *, const char *url);\nvoid mg_resolve_cancel(struct mg_connection *);\nbool mg_dns_parse(const uint8_t *buf, size_t len, struct mg_dns_message *);\nsize_t mg_dns_parse_rr(const uint8_t *buf, size_t len, size_t ofs,\n                       bool is_question, struct mg_dns_rr *);\n\nstruct mg_connection *mg_mdns_listen(struct mg_mgr *mgr, mg_event_handler_t fn,\n                                     void *fn_data);\nbool mg_mdns_query(struct mg_connection *, const char *, unsigned int);\n\n\n\n\n\n#ifndef MG_JSON_MAX_DEPTH\n#define MG_JSON_MAX_DEPTH 30\n#endif\n\n// Error return values - negative. Successful returns are >= 0\nenum { MG_JSON_TOO_DEEP = -1, MG_JSON_INVALID = -2, MG_JSON_NOT_FOUND = -3 };\nint mg_json_get(struct mg_str json, const char *path, int *toklen);\n\nstruct mg_str mg_json_get_tok(struct mg_str json, const char *path);\nbool mg_json_get_num(struct mg_str json, const char *path, double *v);\nbool mg_json_get_bool(struct mg_str json, const char *path, bool *v);\nlong mg_json_get_long(struct mg_str json, const char *path, long dflt);\nchar *mg_json_get_str(struct mg_str json, const char *path);\nchar *mg_json_get_hex(struct mg_str json, const char *path, int *len);\nchar *mg_json_get_b64(struct mg_str json, const char *path, int *len);\n\nbool mg_json_unescape(struct mg_str str, char *buf, size_t len);\nsize_t mg_json_next(struct mg_str obj, size_t ofs, struct mg_str *key,\n                    struct mg_str *val);\n\n\n\n\n// JSON-RPC request descriptor\nstruct mg_rpc_req {\n  struct mg_rpc **head;  // RPC handlers list head\n  struct mg_rpc *rpc;    // RPC handler being called\n  mg_pfn_t pfn;          // Response printing function\n  void *pfn_data;        // Response printing function data\n  void *req_data;        // Arbitrary request data\n  struct mg_str frame;   // Request, e.g. {\"id\":1,\"method\":\"add\",\"params\":[1,2]}\n};\n\n// JSON-RPC method handler\nstruct mg_rpc {\n  struct mg_rpc *next;              // Next in list\n  struct mg_str method;             // Method pattern\n  void (*fn)(struct mg_rpc_req *);  // Handler function\n  void *fn_data;                    // Handler function argument\n};\n\nvoid mg_rpc_add(struct mg_rpc **head, struct mg_str method_pattern,\n                void (*handler)(struct mg_rpc_req *), void *handler_data);\nvoid mg_rpc_del(struct mg_rpc **head, void (*handler)(struct mg_rpc_req *));\nvoid mg_rpc_process(struct mg_rpc_req *);\n\n// Helper functions to print result or error frame\nvoid mg_rpc_ok(struct mg_rpc_req *, const char *fmt, ...);\nvoid mg_rpc_vok(struct mg_rpc_req *, const char *fmt, va_list *ap);\nvoid mg_rpc_err(struct mg_rpc_req *, int code, const char *fmt, ...);\nvoid mg_rpc_verr(struct mg_rpc_req *, int code, const char *fmt, va_list *);\nvoid mg_rpc_list(struct mg_rpc_req *r);\n// Copyright (c) 2023 Cesanta Software Limited\n// All rights reserved\n\n\n\n\n\n#define MG_OTA_NONE 0       // No OTA support\n#define MG_OTA_STM32H5 1    // STM32 H5\n#define MG_OTA_STM32H7 2    // STM32 H7\n#define MG_OTA_STM32H7_DUAL_CORE 3 // STM32 H7 dual core\n#define MG_OTA_STM32F  4    // STM32 F7/F4/F2\n#define MG_OTA_CH32V307 100 // WCH CH32V307\n#define MG_OTA_U2A 200      // Renesas U2A16, U2A8, U2A6\n#define MG_OTA_RT1020 300   // IMXRT1020\n#define MG_OTA_RT1050 301   // IMXRT1050\n#define MG_OTA_RT1060 302   // IMXRT1060\n#define MG_OTA_RT1064 303   // IMXRT1064\n#define MG_OTA_RT1170 304   // IMXRT1170\n#define MG_OTA_MCXN 310 \t// MCXN947\n#define MG_OTA_RW612 320    // FRDM-RW612\n#define MG_OTA_FLASH 900    // OTA via an internal flash\n#define MG_OTA_ESP32 910    // ESP32 OTA implementation\n#define MG_OTA_PICOSDK 920  // RP2040/2350 using Pico-SDK hardware_flash\n#define MG_OTA_CUSTOM 1000  // Custom implementation\n\n#ifndef MG_OTA\n#define MG_OTA MG_OTA_NONE\n#else\n#ifndef MG_IRAM\n#if defined(__GNUC__)\n#define MG_IRAM __attribute__((noinline, section(\".iram\")))\n#else\n#define MG_IRAM\n#endif // compiler\n#endif // IRAM\n#endif // OTA\n\n// Firmware update API\nbool mg_ota_begin(size_t new_firmware_size);     // Start writing\nbool mg_ota_write(const void *buf, size_t len);  // Write chunk, aligned to 1k\nbool mg_ota_end(void);                           // Stop writing\n\n\n\n#if MG_OTA != MG_OTA_NONE && MG_OTA != MG_OTA_CUSTOM\n\nstruct mg_flash {\n  void *start;    // Address at which flash starts\n  size_t size;    // Flash size\n  size_t secsz;   // Sector size\n  size_t align;   // Write alignment\n  bool (*write_fn)(void *, const void *, size_t);  // Write function\n  bool (*swap_fn)(void);                           // Swap partitions\n};\n\nbool mg_ota_flash_begin(size_t new_firmware_size, struct mg_flash *flash);\nbool mg_ota_flash_write(const void *buf, size_t len, struct mg_flash *flash);\nbool mg_ota_flash_end(struct mg_flash *flash);\n\n#endif\n\n\n\n\n\n\nstruct mg_wifi_data {\n  char *ssid, *pass;      // STA mode, SSID to connect to\n  char *apssid, *appass;  // AP mode, our SSID\n  uint32_t apip, apmask;  // AP mode, our IP address and mask\n  uint8_t security;       // STA mode, TBD\n  uint8_t apsecurity;     // AP mode, TBD\n  uint8_t apchannel;      // AP mode, channel to use\n  bool apmode;  // start in AP mode; 'false' -> connect to 'ssid' != NULL\n};\n\nstruct mg_wifi_scan_bss_data {\n  struct mg_str SSID;\n  char *BSSID;\n  int16_t RSSI;\n  uint8_t security;\n#define MG_WIFI_SECURITY_OPEN 0\n#define MG_WIFI_SECURITY_WEP MG_BIT(0)\n#define MG_WIFI_SECURITY_WPA MG_BIT(1)\n#define MG_WIFI_SECURITY_WPA2 MG_BIT(2)\n#define MG_WIFI_SECURITY_WPA3 MG_BIT(3)\n  uint8_t channel;\n  unsigned band : 2;\n#define MG_WIFI_BAND_2G 0\n#define MG_WIFI_BAND_5G 1\n  unsigned has_n : 1;\n};\n\nbool mg_wifi_scan(void);\nbool mg_wifi_connect(struct mg_wifi_data *);\nbool mg_wifi_disconnect(void);\nbool mg_wifi_ap_start(struct mg_wifi_data *);\nbool mg_wifi_ap_stop(void);\n\n\n\n\n\n#if MG_ENABLE_TCPIP\n\n// no config defaults to 0 => Ethernet\nenum mg_l2type { MG_TCPIP_L2_ETH = 0, MG_TCPIP_L2_PPP };  // MG_TCPIP_L2_PPPoE\n\n#if defined(__DCC__)\n#pragma pack(1)\n#else\n#pragma pack(push, 1)\n#endif\n\nstruct mg_l2addr {\n  union {\n    uint8_t mac[6];\n  } addr;\n};\n\n#if defined(__DCC__)\n#pragma pack(0)\n#else\n#pragma pack(pop)\n#endif\n\n#if 0\nTODO(): ?\nstruct eth_opts {\n  bool enable_crc32_check;         // Do a CRC check on RX frames and strip it\n  bool enable_mac_check;           // Do a MAC check on RX frames\n};\nstruct mg_l2opts {\n  union {\n    struct eth_opts eth;\n  };\n};\n#endif\n\nenum mg_l2proto {\n  MG_TCPIP_L2PROTO_IPV4 = 0,\n  MG_TCPIP_L2PROTO_IPV6,\n  MG_TCPIP_L2PROTO_ARP,\n  MG_TCPIP_L2PROTO_PPPoE_DISC,\n  MG_TCPIP_L2PROTO_PPPoE_SESS\n};\nenum mg_l2addrtype {\n  MG_TCPIP_L2ADDR_BCAST,\n  MG_TCPIP_L2ADDR_MCAST,\n  MG_TCPIP_L2ADDR_MCAST6\n};\n\n#endif\n\n\n\n\n\n\n\n\n#if MG_ENABLE_TCPIP\n\nstruct mg_tcpip_if;  // Mongoose TCP/IP network interface\n\nstruct mg_tcpip_driver {\n  bool (*init)(struct mg_tcpip_if *);                         // Init driver\n  size_t (*tx)(const void *, size_t, struct mg_tcpip_if *);   // Transmit frame\n  size_t (*rx)(void *buf, size_t len, struct mg_tcpip_if *);  // Receive frame\n  bool (*poll)(struct mg_tcpip_if *, bool);  // Poll, return Up/down status\n};\n\ntypedef void (*mg_tcpip_event_handler_t)(struct mg_tcpip_if *ifp, int ev,\n                                         void *ev_data);\n\nenum {\n  MG_TCPIP_EV_ST_CHG,  // state change                   uint8_t * (&ifp->state)\n  MG_TCPIP_EV_DHCP_DNS,   // DHCP DNS assignment            uint32_t *ipaddr\n  MG_TCPIP_EV_DHCP_SNTP,  // DHCP SNTP assignment           uint32_t *ipaddr\n  MG_TCPIP_EV_ARP,        // Got ARP packet                 struct mg_str *\n  MG_TCPIP_EV_TIMER_1S,   // 1 second timer                 NULL\n  MG_TCPIP_EV_WIFI_SCAN_RESULT,  // Wi-Fi scan results             struct\n                                 // mg_wifi_scan_bss_data *\n  MG_TCPIP_EV_WIFI_SCAN_END,     // Wi-Fi scan has finished        NULL\n  MG_TCPIP_EV_WIFI_CONNECT_ERR,  // Wi-Fi connect has failed       driver and\n                                 // chip specific\n  MG_TCPIP_EV_DRIVER,   // Driver event                   driver specific\n  MG_TCPIP_EV_ST6_CHG,  // state6 change                  uint8_t *\n                        // (&ifp->state6)\n  MG_TCPIP_EV_USER      // Starting ID for user events\n};\n\n// Network interface\nstruct mg_tcpip_if {\n  uint8_t mac[sizeof(struct mg_l2addr)];  // hw address. Set to a valid addr\n  uint32_t ip, mask, gw;                  // IP address, mask, default gateway\n  struct mg_str tx;                       // Output (TX) buffer\n  bool enable_dhcp_client;                // Enable DCHP client\n  bool enable_dhcp_server;                // Enable DCHP server\n  bool enable_get_gateway;                // DCHP server sets client as gateway\n  bool enable_req_dns;                    // DCHP client requests DNS server\n  bool enable_req_sntp;                   // DCHP client requests SNTP server\n  bool enable_crc32_check;         // Do a CRC check on RX frames and strip it\n  bool enable_mac_check;           // Do a MAC check on RX frames\n  bool update_mac_hash_table;      // Signal drivers to update MAC controller\n  struct mg_tcpip_driver *driver;  // Low level driver\n  void *driver_data;               // Driver-specific data\n  mg_tcpip_event_handler_t pfn;    // Driver-specific event handler function\n  mg_tcpip_event_handler_t fn;     // User-specified event handler function\n  struct mg_mgr *mgr;              // Mongoose event manager\n  struct mg_queue recv_queue;      // Receive queue\n  char dhcp_name[MG_TCPIP_DHCPNAME_SIZE];  // Name for DHCP, \"mip\" if unset\n  uint16_t mtu;                            // Interface link payload\n  uint16_t framesize;                      // Interface frame max length\n#if MG_ENABLE_IPV6\n  uint64_t ip6ll[2], ip6[2];  // IPv6 link-local and global addresses,\n  uint8_t prefix[8];          // prefix,\n  uint8_t prefix_len;         // prefix length,\n  uint64_t gw6[2];            // default gateway.\n  bool enable_slaac;          // Enable IPv6 address autoconfiguration\n  bool enable_dhcp6_client;   // Enable DCHPv6 client TODO()\n#endif\n\n  // Internal state, user can use it but should not change it\n  uint8_t gwmac[sizeof(struct mg_l2addr)];  // Router's hw address\n  enum mg_l2type l2type;                    // Ethernet, PPP, etc.\n  char *dns4_url;                           // DNS server URL\n  uint64_t now;                             // Current time\n  uint64_t timer_1000ms;        // 1000 ms timer: for DHCP and link state\n  uint64_t lease_expire;        // Lease expiration time, in ms\n  uint16_t eport;               // Next ephemeral port\n  volatile uint32_t ndrop;      // Number of received, but dropped frames\n  volatile uint32_t nrecv;      // Number of received frames\n  volatile uint32_t nsent;      // Number of transmitted frames\n  volatile uint32_t nerr;       // Number of driver errors\n  uint8_t state;                // Current link and IPv4 state\n#define MG_TCPIP_STATE_DOWN 0   // Interface is down\n#define MG_TCPIP_STATE_UP 1     // Interface is up\n#define MG_TCPIP_STATE_REQ 2    // Interface is up, DHCP REQUESTING state\n#define MG_TCPIP_STATE_IP 3     // Interface is up and has an IP assigned\n#define MG_TCPIP_STATE_READY 4  // Interface has fully come up, ready to work\n  bool gw_ready;                // We've got a hw address for the router\n#if MG_ENABLE_IPV6\n  uint8_t gw6mac[sizeof(struct mg_l2addr)];  // IPV6 Router's hw address\n  uint8_t state6;                            // Current IPv6 state\n  bool gw6_ready;  // We've got a hw address for the IPv6 router\n#endif\n};\n\nvoid mg_tcpip_init(struct mg_mgr *, struct mg_tcpip_if *);\nvoid mg_tcpip_free(struct mg_tcpip_if *);\nvoid mg_tcpip_qwrite(void *buf, size_t len, struct mg_tcpip_if *ifp);\nvoid mg_tcpip_arp_request(struct mg_tcpip_if *ifp, uint32_t ip, uint8_t *mac);\n\nextern struct mg_tcpip_driver mg_tcpip_driver_stm32f;\nextern struct mg_tcpip_driver mg_tcpip_driver_w5500;\nextern struct mg_tcpip_driver mg_tcpip_driver_w5100;\nextern struct mg_tcpip_driver mg_tcpip_driver_tm4c;\nextern struct mg_tcpip_driver mg_tcpip_driver_tms570;\nextern struct mg_tcpip_driver mg_tcpip_driver_stm32h;\nextern struct mg_tcpip_driver mg_tcpip_driver_imxrt;\nextern struct mg_tcpip_driver mg_tcpip_driver_same54;\nextern struct mg_tcpip_driver mg_tcpip_driver_cmsis;\nextern struct mg_tcpip_driver mg_tcpip_driver_ra;\nextern struct mg_tcpip_driver mg_tcpip_driver_xmc;\nextern struct mg_tcpip_driver mg_tcpip_driver_xmc7;\nextern struct mg_tcpip_driver mg_tcpip_driver_ppp;\nextern struct mg_tcpip_driver mg_tcpip_driver_pico_w;\nextern struct mg_tcpip_driver mg_tcpip_driver_rw612;\nextern struct mg_tcpip_driver mg_tcpip_driver_cyw;\nextern struct mg_tcpip_driver mg_tcpip_driver_nxp_wifi;\nextern struct mg_tcpip_driver mg_tcpip_driver_st67w6;\n\n// Drivers that require SPI, can use this SPI abstraction\nstruct mg_tcpip_spi {\n  void *spi;                        // Opaque SPI bus descriptor\n  void (*begin)(void *);            // SPI begin: slave select low\n  void (*end)(void *);              // SPI end: slave select high\n  uint8_t (*txn)(void *, uint8_t);  // SPI transaction: write 1 byte, read reply\n};\n\n// Alignment and memory section requirements\n#ifndef MG_8BYTE_ALIGNED\n#if defined(__GNUC__)\n#define MG_8BYTE_ALIGNED __attribute__((aligned((8U))))\n#else\n#define MG_8BYTE_ALIGNED\n#endif  // compiler\n#endif  // 8BYTE_ALIGNED\n\n#ifndef MG_16BYTE_ALIGNED\n#if defined(__GNUC__)\n#define MG_16BYTE_ALIGNED __attribute__((aligned((16U))))\n#else\n#define MG_16BYTE_ALIGNED\n#endif  // compiler\n#endif  // 16BYTE_ALIGNED\n\n#ifndef MG_32BYTE_ALIGNED\n#if defined(__GNUC__)\n#define MG_32BYTE_ALIGNED __attribute__((aligned((32U))))\n#else\n#define MG_32BYTE_ALIGNED\n#endif  // compiler\n#endif  // 32BYTE_ALIGNED\n\n#ifndef MG_64BYTE_ALIGNED\n#if defined(__GNUC__)\n#define MG_64BYTE_ALIGNED __attribute__((aligned((64U))))\n#else\n#define MG_64BYTE_ALIGNED\n#endif  // compiler\n#endif  // 64BYTE_ALIGNED\n\n#ifndef MG_ETH_RAM\n#define MG_ETH_RAM\n#endif\n\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_CMSIS) && MG_ENABLE_DRIVER_CMSIS\n\n#include \"Driver_ETH_MAC.h\"  // keep this include\n#include \"Driver_ETH_PHY.h\"  // keep this include\n\n#endif\n\n\n#if MG_ENABLE_TCPIP &&                                          \\\n    ((defined(MG_ENABLE_DRIVER_CYW) && MG_ENABLE_DRIVER_CYW) || \\\n     (defined(MG_ENABLE_DRIVER_CYW_SDIO) && MG_ENABLE_DRIVER_CYW_SDIO))\n\nstruct mg_tcpip_spi_ {\n  void *spi;              // Opaque SPI bus descriptor\n  void (*begin)(void *);  // SPI begin: slave select low\n  void (*end)(void *);    // SPI end: slave select high\n  void (*txn)(void *, uint8_t *, uint8_t *,\n              size_t len);  // SPI transaction: write-read len bytes\n};\n\nstruct mg_tcpip_driver_cyw_firmware {\n  const uint8_t *code_addr;\n  size_t code_len;\n  const uint8_t *nvram_addr;\n  size_t nvram_len;\n  const uint8_t *clm_addr;\n  size_t clm_len;\n};\n\nstruct mg_tcpip_driver_cyw_data {\n  struct mg_wifi_data wifi;\n  void *bus;\n  struct mg_tcpip_driver_cyw_firmware *fw;\n  bool hs;  // use chip \"high-speed\" mode; otherwise SPI CPOL0 CPHA0 (DS 4.2.3 Table 6)\n};\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                              \\\n  do {                                                         \\\n    static struct mg_tcpip_driver_cyw_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                            \\\n    MG_SET_WIFI_CONFIG(&driver_data_);                         \\\n    mif_.ip = MG_TCPIP_IP;                                     \\\n    mif_.mask = MG_TCPIP_MASK;                                 \\\n    mif_.gw = MG_TCPIP_GW;                                     \\\n    mif_.driver = &mg_tcpip_driver_cyw;                        \\\n    mif_.driver_data = &driver_data_;                          \\\n    mif_.recv_queue.size = 8192;                               \\\n    mif_.mac[0] = 2; /* MAC read from OTP at driver init */    \\\n    mg_tcpip_init(mgr, &mif_);                                 \\\n    MG_INFO((\"Driver: cyw, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n\n\n#if MG_ENABLE_TCPIP && \\\n  (defined(MG_ENABLE_DRIVER_IMXRT10) && MG_ENABLE_DRIVER_IMXRT10) || \\\n  (defined(MG_ENABLE_DRIVER_IMXRT11) && MG_ENABLE_DRIVER_IMXRT11) || \\\n  (defined(MG_ENABLE_DRIVER_MCXE) && MG_ENABLE_DRIVER_MCXE)\n\nstruct mg_tcpip_driver_imxrt_data {\n  // MDC clock divider. MDC clock is derived from IPS Bus clock (ipg_clk),\n  // must not exceed 2.5MHz. Configuration for clock range 2.36~2.50 MHz\n  // 37.5.1.8.2, Table 37-46 : f = ipg_clk / (2(mdc_cr + 1))\n  //    ipg_clk       mdc_cr VALUE\n  //    --------------------------\n  //                  -1  <-- TODO() tell driver to guess the value\n  //    25 MHz         4\n  //    33 MHz         6\n  //    40 MHz         7\n  //    50 MHz         9\n  //    66 MHz        13\n  int mdc_cr;  // Valid values: -1 to 63\n\n  uint8_t phy_addr;  // PHY address\n};\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 2\n#endif\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 24\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                \\\n  do {                                                           \\\n    static struct mg_tcpip_driver_imxrt_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                              \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                      \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                   \\\n    mif_.ip = MG_TCPIP_IP;                                       \\\n    mif_.mask = MG_TCPIP_MASK;                                   \\\n    mif_.gw = MG_TCPIP_GW;                                       \\\n    mif_.driver = &mg_tcpip_driver_imxrt;                        \\\n    mif_.driver_data = &driver_data_;                            \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                                \\\n    mg_tcpip_init(mgr, &mif_);                                   \\\n    MG_INFO((\"Driver: imxrt, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n\n\n#if MG_ENABLE_TCPIP  && \\\n    defined(MG_ENABLE_DRIVER_NXP_WIFI) && MG_ENABLE_DRIVER_NXP_WIFI\n\n\nstruct mg_tcpip_driver_nxp_wifi_data {\n  struct mg_wifi_data wifi;\n};\n\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                   \\\n  do {                                                              \\\n    static struct mg_tcpip_driver_nxp_wifi_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                                 \\\n    MG_SET_WIFI_CONFIG(&driver_data_);                              \\\n    mif_.ip = MG_TCPIP_IP;                                          \\\n    mif_.mask = MG_TCPIP_MASK;                                      \\\n    mif_.gw = MG_TCPIP_GW;                                          \\\n    mif_.driver = &mg_tcpip_driver_nxp_wifi;                        \\\n    mif_.driver_data = &driver_data_;                               \\\n    mif_.recv_queue.size = 8192;                                    \\\n    mif_.mac[0] = 2; /* MAC read from OTP at driver init */         \\\n    mg_tcpip_init(mgr, &mif_);                                      \\\n    MG_INFO((\"Driver: nxp wifi, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n\n\n\n\nstruct mg_phy {\n  uint16_t (*read_reg)(uint8_t addr, uint8_t reg);\n  void (*write_reg)(uint8_t addr, uint8_t reg, uint16_t value);\n};\n\n// PHY configuration settings, bitmask\nenum {\n  // Set if PHY LEDs are connected to ground\n  MG_PHY_LEDS_ACTIVE_HIGH = (1 << 0),\n  // Set when PHY clocks MAC. Otherwise, MAC clocks PHY\n  MG_PHY_CLOCKS_MAC = (1 << 1)\n};\n\nenum { MG_PHY_SPEED_10M, MG_PHY_SPEED_100M, MG_PHY_SPEED_1000M };\n\nvoid mg_phy_init(struct mg_phy *, uint8_t addr, uint8_t config);\nbool mg_phy_up(struct mg_phy *, uint8_t addr, bool *full_duplex,\n               uint8_t *speed);\n\n\n#if MG_ENABLE_TCPIP && MG_ARCH == MG_ARCH_PICOSDK && \\\n    defined(MG_ENABLE_DRIVER_PICO_W) && MG_ENABLE_DRIVER_PICO_W\n\n#include \"cyw43.h\"              // keep this include\n#include \"pico/cyw43_arch.h\"    // keep this include\n#include \"pico/unique_id.h\"     // keep this include\n\nstruct mg_tcpip_driver_pico_w_data {\n  struct mg_wifi_data wifi;\n};\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_pico_w_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    MG_SET_WIFI_CONFIG(&driver_data_);                            \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_pico_w;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    mif_.recv_queue.size = 8192;                                  \\\n    mif_.mac[0] = 2; /* MAC read from OTP at driver init */       \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_INFO((\"Driver: pico-w, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n\n\nstruct mg_tcpip_driver_ppp_data {\n  void *uart;                   // Opaque UART bus descriptor\n  void (*reset)(void *);        // Modem hardware reset\n  void (*tx)(void *, uint8_t);  // UART transmit single byte\n  int (*rx)(void *);            // UART receive single byte\n  const char **script;          // List of AT commands and expected replies\n  int script_index;             // Index of the current AT command in the list\n  uint64_t deadline;            // AT command deadline in ms\n};\n\n\n#if MG_ENABLE_TCPIP && \\\n  (defined(MG_ENABLE_DRIVER_RA6) && MG_ENABLE_DRIVER_RA6) || \\\n  (defined(MG_ENABLE_DRIVER_RA8) && MG_ENABLE_DRIVER_RA8)\n\nstruct mg_tcpip_driver_ra_data {\n  // MDC clock \"divider\". MDC clock is software generated,\n  uint32_t clock;    // core clock frequency in Hz\n  uint16_t irqno;    // IRQn, R_ICU->IELSR[irqno]\n  uint8_t phy_addr;  // PHY address\n};\n\n#ifndef MG_DRIVER_CLK_FREQ\n#define MG_DRIVER_CLK_FREQ 100000000UL\n#endif\n\n#ifndef MG_DRIVER_IRQ_NO\n#define MG_DRIVER_IRQ_NO 0\n#endif\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 0\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                             \\\n  do {                                                        \\\n    static struct mg_tcpip_driver_ra_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                           \\\n    driver_data_.clock = MG_DRIVER_CLK_FREQ;                  \\\n    driver_data_.irqno = MG_DRIVER_IRQ_NO;                    \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                \\\n    mif_.ip = MG_TCPIP_IP;                                    \\\n    mif_.mask = MG_TCPIP_MASK;                                \\\n    mif_.gw = MG_TCPIP_GW;                                    \\\n    mif_.driver = &mg_tcpip_driver_ra;                        \\\n    mif_.driver_data = &driver_data_;                         \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                             \\\n    mg_tcpip_init(mgr, &mif_);                                \\\n    MG_INFO((\"Driver: ra, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_RW612) && MG_ENABLE_DRIVER_RW612\n\nstruct mg_tcpip_driver_rw612_data {\n  // 38.1.8 MII Speed Control Register (MSCR)\n  // MDC clock frequency must not exceed 2.5 MHz and is calculated as follows:\n  // MDC_freq = P_clock / ((mdc_cr + 1) * 2), where P_clock is the\n  // peripheral bus clock.\n  // IEEE802.3 clause 22 defines a minimum of 10 ns for the hold time on the\n  // MDIO output. Depending on the host bus frequency, the setting may need\n  // to be increased.\n  int mdc_cr;\n  int mdc_holdtime; // Valid values: [0-7]\n  uint8_t phy_addr;\n};\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 2\n#endif\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 51\n#endif\n\n#ifndef MG_DRIVER_MDC_HOLDTIME\n#define MG_DRIVER_MDC_HOLDTIME 3\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_rw612_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                       \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                    \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_rw612;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                                 \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_INFO((\"Driver: rw612, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_SAME54) && \\\n    MG_ENABLE_DRIVER_SAME54\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 5\n#endif\n\n#ifndef MG_DRIVER_PHY_ADDR\n#define MG_DRIVER_PHY_ADDR 0\n#endif\n\nstruct mg_tcpip_driver_same54_data {\n  int mdc_cr;\n  uint8_t phy_addr;\n};\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_same54_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                       \\\n    driver_data_.phy_addr = MG_DRIVER_PHY_ADDR;                   \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_same54;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                                 \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_INFO((\"Driver: same54, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n\n\n#if MG_ENABLE_TCPIP && \\\n    (defined(MG_ENABLE_DRIVER_CYW_SDIO) && MG_ENABLE_DRIVER_CYW_SDIO)\n\n// Specific chip/card driver --> SDIO driver --> HAL --> SDIO hw controller\n\n// API with HAL for hardware controller\n// - Provide a function to init the controller (external)\n// - Provide these functions:\nstruct mg_tcpip_sdio {\n  void *sdio;                    // Opaque SDIO bus descriptor\n  void (*cfg)(void *, uint8_t);  // select operating parameters\n  // SDIO transaction: send cmd with a possible 1-byte read or write\n  bool (*txn)(void *, uint8_t cmd, uint32_t arg, uint32_t *r);\n  // SDIO extended transaction: write or read len bytes, using blksz blocks\n  bool (*xfr)(void *, bool write, uint32_t arg, uint16_t blksz, uint32_t *,\n              uint32_t len, uint32_t *r);\n};\n\n// API with driver (e.g.: cyw.c)\n// Once the hardware controller has been initialized:\n// - Init card: selects the card, sets F0 block size, sets bus width and speed\nbool mg_sdio_init(struct mg_tcpip_sdio *sdio);\n// - Enable other possible functions (F1 to F7)\nbool mg_sdio_enable_f(struct mg_tcpip_sdio *sdio, unsigned int f);\n// - Wait for them to be ready\nbool mg_sdio_waitready_f(struct mg_tcpip_sdio *sdio, unsigned int f);\n// - Set their transfer block length\nbool mg_sdio_set_blksz(struct mg_tcpip_sdio *sdio, unsigned int f,\n                       uint16_t blksz);\n// - Transfer data to/from a function (abstracts from transaction type)\n// - Requesting a read transfer > blocksize means block transfer will be used.\n// - Drivers must have room to accomodate a whole block transfer, see sdio.c\n// - Transfers of > 1 byte --> (uint32_t *) data. 1-byte --> (uint8_t *) data\nbool mg_sdio_transfer(struct mg_tcpip_sdio *sdio, bool write, unsigned int f,\n                      uint32_t addr, void *data, uint32_t len);\n\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_ST67W6) && \\\n    MG_ENABLE_DRIVER_ST67W6\n\nstruct mg_tcpip_spi_ {\n  void *spi;              // Opaque SPI bus descriptor\n  void (*begin)(void *);  // SPI begin: slave select low\n  void (*end)(void *);    // SPI end: slave select high\n  void (*txn)(void *, uint8_t *, uint8_t *,\n              size_t len);  // SPI transaction: write-read len bytes\n};\n\nstruct mg_tcpip_driver_st67w6_data {\n  struct mg_wifi_data wifi;\n  void *spi;\n  bool (*is_ready)(void);     // return state of module RDY pin\n  struct mg_queue send_queue; // decouple tx calls from module polls\n};\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_st67w6_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    MG_SET_WIFI_CONFIG(&driver_data_);                            \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_st67w6;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    mif_.recv_queue.size = 8192;                                  \\\n    mif_.mac[0] = 2; /* MAC read from OTP at driver init */       \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_INFO((\"Driver: st67w6, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_STM32F) && \\\n    MG_ENABLE_DRIVER_STM32F\n\nstruct mg_tcpip_driver_stm32f_data {\n  // MDC clock divider. MDC clock is derived from HCLK, must not exceed 2.5MHz\n  //    HCLK range    DIVIDER    mdc_cr VALUE\n  //    -------------------------------------\n  //                                -1  <-- tell driver to guess the value\n  //    60-100 MHz    HCLK/42        0\n  //    100-150 MHz   HCLK/62        1\n  //    20-35 MHz     HCLK/16        2\n  //    35-60 MHz     HCLK/26        3\n  //    150-216 MHz   HCLK/102       4  <-- value for Nucleo-F* on max speed\n  //    216-310 MHz   HCLK/124       5\n  //    110, 111 Reserved\n  int mdc_cr;  // Valid values: -1, 0, 1, 2, 3, 4, 5\n\n  uint8_t phy_addr;  // PHY address\n};\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 0\n#endif\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 4\n#endif\n\n#if MG_ARCH == MG_ARCH_CUBE\n#define MG_ENABLE_ETH_IRQ() NVIC_EnableIRQ(ETH_IRQn)\n#else\n#define MG_ENABLE_ETH_IRQ()\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_stm32f_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                       \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                    \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_stm32f;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                                 \\\n    MG_ENABLE_ETH_IRQ();                                          \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_INFO((\"Driver: stm32f, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n\n\n#if MG_ENABLE_TCPIP\n#if !defined(MG_ENABLE_DRIVER_STM32H)\n#define MG_ENABLE_DRIVER_STM32H 0\n#endif\n#if !defined(MG_ENABLE_DRIVER_MCXN)\n#define MG_ENABLE_DRIVER_MCXN 0\n#endif\n#if !defined(MG_ENABLE_DRIVER_STM32N)\n#define MG_ENABLE_DRIVER_STM32N 0\n#endif\n#if MG_ENABLE_DRIVER_STM32H || MG_ENABLE_DRIVER_MCXN || MG_ENABLE_DRIVER_STM32N\n\nstruct mg_tcpip_driver_stm32h_data {\n  // MDC clock divider. MDC clock is derived from HCLK, must not exceed 2.5MHz\n  //    HCLK range    DIVIDER    mdc_cr VALUE\n  //    -------------------------------------\n  //                                -1  <-- tell driver to guess the value\n  //    60-100 MHz    HCLK/42        0\n  //    100-150 MHz   HCLK/62        1\n  //    20-35 MHz     HCLK/16        2\n  //    35-60 MHz     HCLK/26        3\n  //    150-250 MHz   HCLK/102       4  <-- value for max speed HSI\n  //    250-300 MHz   HCLK/124       5  <-- value for Nucleo-H* on CSI\n  //    300-500 MHz   HCLK/204       6\n  //    500-800 MHz   HCLK/324       7\n  int mdc_cr;  // Valid values: -1, 0, 1, 2, 3, 4, 5\n\n  uint8_t phy_addr;  // PHY address\n  uint8_t phy_conf;  // PHY config\n};\n\n#ifndef MG_TCPIP_PHY_CONF\n#define MG_TCPIP_PHY_CONF MG_PHY_CLOCKS_MAC\n#endif\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 0\n#endif\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 4\n#endif\n\n#if MG_ENABLE_DRIVER_STM32H && MG_ARCH == MG_ARCH_CUBE\n#define MG_ENABLE_ETH_IRQ() NVIC_EnableIRQ(ETH_IRQn)\n#else\n#define MG_ENABLE_ETH_IRQ()\n#endif\n\n#if MG_ENABLE_IPV6\n#define MG_IPV6_INIT(mif)                                         \\\n  do {                                                            \\\n    memcpy(mif.ip6ll, (uint8_t[16]) MG_TCPIP_IPV6_LINKLOCAL, 16);     \\\n    memcpy(mif.ip6, (uint8_t[16]) MG_TCPIP_GLOBAL, 16);           \\\n    memcpy(mif.gw6, (uint8_t[16]) MG_TCPIP_GW6, 16);              \\\n    mif.prefix_len = MG_TCPIP_PREFIX_LEN;                        \\\n  } while(0)\n#else\n#define MG_IPV6_INIT(mif)\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_stm32h_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                       \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                    \\\n    driver_data_.phy_conf = MG_TCPIP_PHY_CONF;                    \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_stm32h;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                                 \\\n    MG_IPV6_INIT(mif_);                                           \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_ENABLE_ETH_IRQ();                                          \\\n    MG_INFO((\"Driver: stm32h, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_TM4C) && MG_ENABLE_DRIVER_TM4C\n\nstruct mg_tcpip_driver_tm4c_data {\n  // MDC clock divider. MDC clock is derived from SYSCLK, must not exceed 2.5MHz\n  //    SYSCLK range   DIVIDER   mdc_cr VALUE\n  //    -------------------------------------\n  //                                -1  <-- tell driver to guess the value\n  //    60-100 MHz    SYSCLK/42      0\n  //    100-150 MHz   SYSCLK/62      1  <-- value for EK-TM4C129* on max speed\n  //    20-35 MHz     SYSCLK/16      2\n  //    35-60 MHz     SYSCLK/26      3\n  //    0x4-0xF Reserved\n  int mdc_cr;  // Valid values: -1, 0, 1, 2, 3\n};\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 1\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                               \\\n  do {                                                          \\\n    static struct mg_tcpip_driver_tm4c_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                             \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                     \\\n    mif_.ip = MG_TCPIP_IP;                                      \\\n    mif_.mask = MG_TCPIP_MASK;                                  \\\n    mif_.gw = MG_TCPIP_GW;                                      \\\n    mif_.driver = &mg_tcpip_driver_tm4c;                        \\\n    mif_.driver_data = &driver_data_;                           \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                               \\\n    mg_tcpip_init(mgr, &mif_);                                  \\\n    MG_INFO((\"Driver: tm4c, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_TMS570) && MG_ENABLE_DRIVER_TMS570\nstruct mg_tcpip_driver_tms570_data {\n  int mdc_cr;\n  int phy_addr;\n};\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 0\n#endif\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 1\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                               \\\n  do {                                                          \\\n    static struct mg_tcpip_driver_tms570_data driver_data_;     \\\n    static struct mg_tcpip_if mif_;                             \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                     \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                  \\\n    mif_.ip = MG_TCPIP_IP;                                      \\\n    mif_.mask = MG_TCPIP_MASK;                                  \\\n    mif_.gw = MG_TCPIP_GW;                                      \\\n    mif_.driver = &mg_tcpip_driver_tms570;                      \\\n    mif_.driver_data = &driver_data_;                           \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                               \\\n    mg_tcpip_init(mgr, &mif_);                                  \\\n    MG_INFO((\"Driver: tms570, MAC: %M\", mg_print_mac, mif_.mac));\\\n  } while (0)\n#endif\n\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_XMC) && MG_ENABLE_DRIVER_XMC\n\nstruct mg_tcpip_driver_xmc_data {\n  // 13.2.8.1 Station Management Functions\n  // MDC clock divider (). MDC clock is derived from ETH MAC clock\n  // It must not exceed 2.5MHz\n  // ETH Clock range  DIVIDER       mdc_cr VALUE\n  // --------------------------------------------\n  //                                     -1  <-- tell driver to guess the value\n  // 60-100 MHz       ETH Clock/42        0\n  // 100-150 MHz      ETH Clock/62        1\n  // 20-35 MHz        ETH Clock/16        2\n  // 35-60 MHz        ETH Clock/26        3\n  // 150-250 MHz      ETH Clock/102       4\n  // 250-300 MHz      ETH Clock/124       5\n  // 110, 111 Reserved\n  int mdc_cr;  // Valid values: -1, 0, 1, 2, 3, 4, 5\n  uint8_t phy_addr;\n};\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 0\n#endif\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 4\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_xmc_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                       \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                    \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_xmc;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                                 \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_INFO((\"Driver: xmc, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_XMC7) && MG_ENABLE_DRIVER_XMC7\n\nstruct mg_tcpip_driver_xmc7_data {\n  int mdc_cr;  // Valid values: -1, 0, 1, 2, 3, 4, 5\n  uint8_t phy_addr;\n};\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 0\n#endif\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 3\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_xmc7_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                       \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                    \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_xmc7;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                                 \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_INFO((\"Driver: xmc7, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n\n\n#ifdef __cplusplus\n}\n#endif\n#endif  // MONGOOSE_H\n"
  },
  {
    "path": "src/arch.h",
    "content": "#pragma once\n\n#define MG_ARCH_CUSTOM 0        // User creates its own mongoose_config.h\n#define MG_ARCH_UNIX 1          // Linux, BSD, Mac, ...\n#define MG_ARCH_WIN32 2         // Windows\n#define MG_ARCH_ESP32 3         // ESP32\n#define MG_ARCH_ESP8266 4       // ESP8266\n#define MG_ARCH_FREERTOS 5      // FreeRTOS\n#define MG_ARCH_THREADX 6       // Eclipse ThreadX (former MS Azure RTOS)\n#define MG_ARCH_ZEPHYR 7        // Zephyr RTOS\n#define MG_ARCH_ARMGCC 8        // Plain ARM GCC\n#define MG_ARCH_CMSIS_RTOS1 9   // CMSIS-RTOS API v1 (Keil RTX)\n#define MG_ARCH_TIRTOS 10       // Texas Semi TI-RTOS\n#define MG_ARCH_PICOSDK 11      // Raspberry Pi Pico-SDK (RP2040, RP2350)\n#define MG_ARCH_ARMCC 12        // Keil MDK-Core with Configuration Wizard\n#define MG_ARCH_CMSIS_RTOS2 13  // CMSIS-RTOS API v2 (Keil RTX5, FreeRTOS)\n#define MG_ARCH_RTTHREAD 14     // RT-Thread RTOS\n#define MG_ARCH_ARMCGT 15       // Texas Semi ARM-CGT\n#define MG_ARCH_CUBE 16\t        // STM32Cube environment\n\n#define MG_ARCH_NEWLIB MG_ARCH_ARMGCC  // Alias, deprecate in 2025\n\n#if !defined(MG_ARCH)\n#if defined(__unix__) || defined(__APPLE__)\n#define MG_ARCH MG_ARCH_UNIX\n#elif defined(_WIN32)\n#define MG_ARCH MG_ARCH_WIN32\n#endif\n#endif  // !defined(MG_ARCH)\n\n#if !defined(MG_ARCH) || (MG_ARCH == MG_ARCH_CUSTOM)\n#include \"mongoose_config.h\"  // keep this include\n#endif\n\n#if !defined(MG_ARCH)\n#error \"MG_ARCH is not specified and we couldn't guess it. Define MG_ARCH=... in mongoose_config.h\"\n#endif\n\n// http://esr.ibiblio.org/?p=5095\n#define MG_BIG_ENDIAN (*(uint16_t *) \"\\0\\xff\" < 0x100)\n\n#include \"arch_armgcc.h\"\n#include \"arch_cube.h\"\n#include \"arch_esp32.h\"\n#include \"arch_esp8266.h\"\n#include \"arch_freertos.h\"\n#include \"arch_rtx.h\"\n#include \"arch_threadx.h\"\n#include \"arch_unix.h\"\n#include \"arch_win32.h\"\n#include \"arch_zephyr.h\"\n\n#include \"net_ft.h\"\n#include \"net_lwip.h\"\n#include \"net_rl.h\"\n"
  },
  {
    "path": "src/arch_armcgt.h",
    "content": "#pragma once\n\n#if MG_ARCH == MG_ARCH_ARMCGT\n\n#include <ctype.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/types.h>\n#include <time.h>\n\n#define MG_PATH_MAX 100\n#define MG_ENABLE_SOCKET 0\n#define MG_ENABLE_DIRLIST 0\n\n#endif\n"
  },
  {
    "path": "src/arch_armgcc.h",
    "content": "#pragma once\n\n#if MG_ARCH == MG_ARCH_ARMGCC\n#define _POSIX_TIMERS\n\n#include <ctype.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/time.h>\n#include <sys/types.h>\n#include <time.h>\n#include <unistd.h>\n\n#define MG_PATH_MAX 100\n#define MG_ENABLE_SOCKET 0\n#define MG_ENABLE_DIRLIST 0\n\n#endif\n"
  },
  {
    "path": "src/arch_cube.h",
    "content": "#pragma once\n\n#if MG_ARCH == MG_ARCH_CUBE\n\n#include <ctype.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/time.h>\n#include <sys/types.h>\n#include <time.h>\n#include <unistd.h>\n\n// Cube-generated header, includes ST Cube HAL\n// NOTE: use angle brackets to prevent amalgamator ditching it\n#include <main.h>\n\n#ifndef MG_PATH_MAX\n#define MG_PATH_MAX 100\n#endif\n\n#ifndef MG_ENABLE_DIRLIST\n#define MG_ENABLE_DIRLIST 0\n#endif\n\n#ifndef MG_ENABLE_SOCKET\n#define MG_ENABLE_SOCKET 0\n#endif\n\n#ifndef MG_ENABLE_TCPIP\n#define MG_ENABLE_TCPIP 1  // Enable built-in TCP/IP stack\n#endif\n\n#if MG_ENABLE_TCPIP && !defined(MG_ENABLE_DRIVER_STM32F) && \\\n    !defined(MG_ENABLE_DRIVER_STM32H) && !defined(MG_ENABLE_DRIVER_STM32N)\n#if defined(STM32F1) || defined(STM32F2) || defined(STM32F4) || defined(STM32F7)\n#define MG_ENABLE_DRIVER_STM32F 1\n#elif defined(STM32H5) || defined(STM32H7)\n#define MG_ENABLE_DRIVER_STM32H 1\n#elif defined(STM32N6)\n#define MG_ENABLE_DRIVER_STM32N 1\n#else\n#error Select a driver in mongoose_config.h\n#endif\n#endif\n\n#ifndef MG_TLS\n#define MG_TLS MG_TLS_BUILTIN\n#endif\n\n#if !defined(MG_OTA) && defined(STM32F1) || defined(STM32F2) || \\\n    defined(STM32F4) || defined(STM32F7)\n#define MG_OTA MG_OTA_STM32F\n#elif !defined(MG_OTA) && defined(STM32H5)\n#define MG_OTA MG_OTA_STM32H5\n#elif !defined(MG_OTA) && defined(STM32H7)\n#define MG_OTA MG_OTA_STM32H7\n#endif\n// use HAL-defined execute-in-ram section\n#define MG_IRAM __attribute__((section(\".RamFunc\")))\n\n#ifndef HAL_ICACHE_MODULE_ENABLED\n#define HAL_ICACHE_IsEnabled() 0\n#define HAL_ICACHE_Enable() (void) 0\n#define HAL_ICACHE_Disable() (void) 0\n#endif\n\n#ifndef MG_SET_MAC_ADDRESS\n// Construct MAC address from UUID\n#define MGUID ((uint32_t *) UID_BASE)  // Unique 96-bit chip ID\n#define MG_SET_MAC_ADDRESS(mac)                                   \\\n  do {                                                            \\\n    int icache_enabled_ = HAL_ICACHE_IsEnabled();                 \\\n    if (icache_enabled_) HAL_ICACHE_Disable();                    \\\n    mac[0] = 42;                                                  \\\n    mac[1] = ((MGUID[0] >> 0) & 255) ^ ((MGUID[2] >> 19) & 255);  \\\n    mac[2] = ((MGUID[0] >> 10) & 255) ^ ((MGUID[1] >> 10) & 255); \\\n    mac[3] = (MGUID[0] >> 19) & 255;                              \\\n    mac[4] = ((MGUID[1] >> 0) & 255) ^ ((MGUID[2] >> 10) & 255);  \\\n    mac[5] = ((MGUID[2] >> 0) & 255) ^ ((MGUID[1] >> 19) & 255);  \\\n    if (icache_enabled_) HAL_ICACHE_Enable();                     \\\n  } while (0)\n#endif\n\n#endif\n"
  },
  {
    "path": "src/arch_esp32.h",
    "content": "#pragma once\n\n#if MG_ARCH == MG_ARCH_ESP32\n\n#include <ctype.h>\n#include <dirent.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <limits.h>\n#include <netdb.h>\n#include <stdarg.h>\n#include <stddef.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <time.h>\n\n#include <esp_ota_ops.h>  // Use angle brackets to avoid\n#include <esp_timer.h>    // amalgamation ditching them\n\n#define MG_PATH_MAX 128\n\n#ifndef MG_ENABLE_POSIX_FS\n#define MG_ENABLE_POSIX_FS 1\n#endif\n\n#ifndef MG_ENABLE_DIRLIST\n#define MG_ENABLE_DIRLIST 1\n#endif\n\n#endif\n"
  },
  {
    "path": "src/arch_esp8266.h",
    "content": "#pragma once\n\n#if MG_ARCH == MG_ARCH_ESP8266\n\n#include <ctype.h>\n#include <dirent.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <limits.h>\n#include <netdb.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stddef.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/time.h>\n#include <sys/types.h>\n#include <time.h>\n\n#include <esp_system.h>\n\n#define MG_PATH_MAX 128\n\n#endif\n"
  },
  {
    "path": "src/arch_freertos.h",
    "content": "#pragma once\n\n#if MG_ARCH == MG_ARCH_FREERTOS\n\n#include <ctype.h>\n#if !defined(MG_ENABLE_LWIP) || !MG_ENABLE_LWIP\n#include <errno.h>\n#endif\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stddef.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>  // rand(), strtol(), atoi()\n#include <string.h>\n#if defined(__ARMCC_VERSION)\n#define mode_t size_t\n#include <alloca.h>\n#include <time.h>\n#define strdup(s) ((char *) mg_strdup(mg_str(s)).buf)\n#elif defined(__CCRH__)\n#else\n#include <sys/stat.h>\n#endif\n\n#include <FreeRTOS.h>\n#include <task.h>\n\n#define MG_ENABLE_CUSTOM_CALLOC 1\n\nstatic inline void mg_free(void *ptr) {\n  vPortFree(ptr);\n}\n\n// Re-route calloc/free to the FreeRTOS's functions, don't use stdlib\nstatic inline void *mg_calloc(size_t cnt, size_t size) {\n  void *p = pvPortMalloc(cnt * size);\n  if (p != NULL) memset(p, 0, size * cnt);\n  return p;\n}\n\n#if !defined(MG_ENABLE_POSIX_FS) || !MG_ENABLE_POSIX_FS\n#else\n#define mkdir(a, b) mg_mkdir(a, b)\nstatic inline int mg_mkdir(const char *path, mode_t mode) {\n  (void) path, (void) mode;\n  return -1;\n}\n#endif\n\n#endif  // MG_ARCH == MG_ARCH_FREERTOS\n"
  },
  {
    "path": "src/arch_picosdk.h",
    "content": "#pragma once\n\n#if MG_ARCH == MG_ARCH_PICOSDK\n#if !defined(MG_ENABLE_LWIP) || !MG_ENABLE_LWIP\n#include <errno.h>\n#endif\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <time.h>\n\n#include <pico/stdlib.h>\n#include <pico/rand.h>\nint mkdir(const char *, mode_t);\n\n#if MG_OTA == MG_OTA_PICOSDK\n#include <hardware/flash.h>\n#include <pico/bootrom.h>\n#endif\n\n#endif\n"
  },
  {
    "path": "src/arch_rtthread.h",
    "content": "#pragma once\n\n#if MG_ARCH == MG_ARCH_RTTHREAD\n\n#include <rtthread.h>\n#include <ctype.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <sys/socket.h>\n#include <sys/select.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/types.h>\n#include <time.h>\n\n#ifndef MG_IO_SIZE\n#define MG_IO_SIZE 1460\n#endif\n\n#endif // MG_ARCH == MG_ARCH_RTTHREAD\n"
  },
  {
    "path": "src/arch_rtx.h",
    "content": "#pragma once\n\n#if MG_ARCH == MG_ARCH_ARMCC || MG_ARCH == MG_ARCH_CMSIS_RTOS1 || \\\n    MG_ARCH == MG_ARCH_CMSIS_RTOS2\n\n#include <ctype.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stddef.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <alloca.h>\n#include <string.h>\n#include <time.h>\n#if MG_ARCH == MG_ARCH_CMSIS_RTOS1\n#include \"cmsis_os.h\"  // keep this include\n// https://developer.arm.com/documentation/ka003821/latest\nextern uint32_t rt_time_get(void);\n#elif MG_ARCH == MG_ARCH_CMSIS_RTOS2\n#include \"cmsis_os2.h\"  // keep this include\n#endif\n\n#define strdup(s) ((char *) mg_strdup(mg_str(s)).buf)\n\n#if defined(__ARMCC_VERSION)\n#define mode_t size_t\n#define mkdir(a, b) mg_mkdir(a, b)\nstatic inline int mg_mkdir(const char *path, mode_t mode) {\n  (void) path, (void) mode;\n  return -1;\n}\n#endif\n\n#if (MG_ARCH == MG_ARCH_CMSIS_RTOS1 || MG_ARCH == MG_ARCH_CMSIS_RTOS2) &&     \\\n    !defined MG_ENABLE_RL && (!defined(MG_ENABLE_LWIP) || !MG_ENABLE_LWIP) && \\\n    (!defined(MG_ENABLE_TCPIP) || !MG_ENABLE_TCPIP)\n#define MG_ENABLE_RL 1\n#ifndef MG_SOCK_LISTEN_BACKLOG_SIZE\n#define MG_SOCK_LISTEN_BACKLOG_SIZE 3\n#endif\n#endif\n\n#endif\n"
  },
  {
    "path": "src/arch_threadx.h",
    "content": "#pragma once\n\n#if MG_ARCH == MG_ARCH_THREADX\n\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <string.h>\n\n// Do not include time.h and stdlib.h, since they conflict with nxd_bsd.h\n// extern time_t time(time_t *);\n#include <nxd_bsd.h>\n\n#define MG_DIRSEP '\\\\'\n#undef FOPEN_MAX\n\n#ifndef MG_PATH_MAX\n#define MG_PATH_MAX 32\n#endif\n\n#ifndef MG_SOCK_LISTEN_BACKLOG_SIZE\n#define MG_SOCK_LISTEN_BACKLOG_SIZE 3\n#endif\n\n#ifndef MG_ENABLE_IPV6\n#define MG_ENABLE_IPV6 0\n#endif\n\n#define socklen_t int\n#define closesocket(x) soc_close(x)\n\n// In order to enable BSD support in NetxDuo, do the following (assuming Cube):\n// 1. Add nxd_bsd.h and nxd_bsd.c to the repo:\n//     https://github.com/eclipse-threadx/netxduo/blob/v6.1.12_rel/addons/BSD/nxd_bsd.c\n//     https://github.com/eclipse-threadx/netxduo/blob/v6.1.12_rel/addons/BSD/nxd_bsd.h\n// 2. Add to tx_user.h\n//     #define TX_THREAD_USER_EXTENSION int bsd_errno;\n// 3. Add to nx_user.h\n//     #define NX_ENABLE_EXTENDED_NOTIFY_SUPPORT\n// 4. Add __CCRX__ build preprocessor constant\n//   Project -> Properties -> C/C++ -> Settings -> MCU Compiler -> Preprocessor\n\n#endif\n"
  },
  {
    "path": "src/arch_tirtos.h",
    "content": "#pragma once\n\n#if MG_ARCH == MG_ARCH_TIRTOS\n\n#include <stdlib.h>\n#include <ctype.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <string.h>\n#include <time.h>\n\n#include <serrno.h>\n#include <sys/socket.h>\n\n#include <ti/sysbios/knl/Clock.h>\n\n#endif\n"
  },
  {
    "path": "src/arch_unix.h",
    "content": "#pragma once\n\n#if MG_ARCH == MG_ARCH_UNIX\n\n#define _DARWIN_UNLIMITED_SELECT 1  // No limit on file descriptors\n\n#if defined(__APPLE__)\n#include <mach/mach_time.h>\n#endif\n\n#if !defined(MG_ENABLE_EPOLL) && defined(__linux__)\n#define MG_ENABLE_EPOLL 1\n#elif !defined(MG_ENABLE_POLL)\n#define MG_ENABLE_POLL 1\n#endif\n\n#include <arpa/inet.h>\n#include <ctype.h>\n#include <dirent.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <inttypes.h>\n#include <limits.h>\n#include <netdb.h>\n#include <netinet/in.h>\n#include <netinet/tcp.h>\n#include <signal.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stddef.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#if defined(MG_ENABLE_EPOLL) && MG_ENABLE_EPOLL\n#include <sys/epoll.h>\n#elif defined(MG_ENABLE_POLL) && MG_ENABLE_POLL\n#include <poll.h>\n#else\n#include <sys/select.h>\n#endif\n\n#include <sys/socket.h>\n#include <sys/stat.h>\n#include <sys/time.h>\n#include <sys/types.h>\n#include <time.h>\n#include <unistd.h>\n\n#ifndef MG_ENABLE_DIRLIST\n#define MG_ENABLE_DIRLIST 1\n#endif\n\n#ifndef MG_PATH_MAX\n#define MG_PATH_MAX FILENAME_MAX\n#endif\n\n#ifndef MG_ENABLE_POSIX_FS\n#define MG_ENABLE_POSIX_FS 1\n#endif\n\n#ifndef MG_IO_SIZE\n#define MG_IO_SIZE 16384\n#endif\n\n#endif\n"
  },
  {
    "path": "src/arch_win32.h",
    "content": "#pragma once\n\n#if MG_ARCH == MG_ARCH_WIN32\n\n// Avoid name clashing; (macro expansion producing 'defined' has undefined\n// behaviour). See config.h for user options\n#ifndef MG_ENABLE_WINSOCK\n#if (!defined(MG_ENABLE_TCPIP) || !MG_ENABLE_TCPIP) && \\\n    (!defined(MG_ENABLE_LWIP) || !MG_ENABLE_LWIP) &&   \\\n    (!defined(MG_ENABLE_FREERTOS_TCP) || !MG_ENABLE_FREERTOS_TCP)\n#define MG_ENABLE_WINSOCK 1\n#else\n#define MG_ENABLE_WINSOCK 0\n#endif\n#endif\n\n#ifndef _CRT_RAND_S\n#define _CRT_RAND_S\n#endif\n\n#ifndef _WIN32_WINNT\n#if defined(_MSC_VER) && _MSC_VER < 1700\n#define _WIN32_WINNT 0x0400 // Let vc98 pick up wincrypt.h\n#else\n#define _WIN32_WINNT 0x0600\n#endif\n#endif\n#ifndef WINVER\n#define WINVER _WIN32_WINNT\n#endif\n\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n\n#ifndef _CRT_SECURE_NO_WARNINGS\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n\n#ifndef _WINSOCK_DEPRECATED_NO_WARNINGS\n#define _WINSOCK_DEPRECATED_NO_WARNINGS\n#endif\n\n#include <ctype.h>\n#include <direct.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <limits.h>\n#include <signal.h>\n#include <stdarg.h>\n#include <stddef.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <time.h>\n\n#include <winsock2.h>       // fix missing macros and types\n\n#if defined(_MSC_VER) && _MSC_VER < 1700\n#define __func__ \"\"\ntypedef __int64 int64_t;\ntypedef unsigned __int64 uint64_t;\ntypedef unsigned char uint8_t;\ntypedef char int8_t;\ntypedef unsigned short uint16_t;\ntypedef short int16_t;\ntypedef unsigned int uint32_t;\ntypedef int int32_t;\ntypedef enum { false = 0, true = 1 } bool;\n#else\n#include <stdbool.h>\n#include <stdint.h>\n#if MG_ENABLE_WINSOCK\n#include <ws2tcpip.h>\n#endif\n#endif\n\n#include <process.h>\n#include <winerror.h>\n\n// For mg_random()\n#if defined(_MSC_VER) && _MSC_VER < 1700\n#include <wincrypt.h>\n#pragma comment(lib, \"advapi32.lib\")\n#endif\n\n#if defined(_MSC_VER) && _MSC_VER <= 1200\n  #ifndef IPPROTO_IP\n    #define IPPROTO_IP 0\n  #endif\n\n  #ifndef IP_ADD_MEMBERSHIP\n    struct ip_mreq {\n        struct in_addr imr_multiaddr;\n        struct in_addr imr_interface;\n    };\n    #define IP_ADD_MEMBERSHIP  12\n  #endif\n#endif\n\n// Protect from calls like std::snprintf in app code\n// See https://github.com/cesanta/mongoose/issues/1047\n#ifndef __cplusplus\n#define snprintf _snprintf\n#define vsnprintf _vsnprintf\n#ifndef strdup  // For MSVC with _DEBUG, see #1359\n#define strdup(x) _strdup(x)\n#endif\n#endif\n\n#if defined(MG_ENABLE_POLL) && MG_ENABLE_POLL && (!defined(MG_ENABLE_LWIP) || !MG_ENABLE_LWIP)\ntypedef unsigned long nfds_t; // see #3388\n#endif\n\n#if defined(_MSC_VER)\n#if MG_ENABLE_WINSOCK\n#pragma comment(lib, \"ws2_32.lib\")\n#endif\n#ifndef alloca\n#define alloca(a) _alloca(a)\n#endif\n#endif\n\n#define MG_DIRSEP '\\\\'\n\n#ifndef MG_PATH_MAX\n#define MG_PATH_MAX FILENAME_MAX\n#endif\n\n#if MG_ENABLE_WINSOCK\n\n#define MG_INVALID_SOCKET INVALID_SOCKET\n#define MG_SOCKET_TYPE SOCKET\n#define poll(a, b, c) WSAPoll((a), (b), (c))\n#define closesocket(x) closesocket(x)\ntypedef int socklen_t;\n\n#ifndef SO_EXCLUSIVEADDRUSE\n#define SO_EXCLUSIVEADDRUSE ((int) (~SO_REUSEADDR))\n#endif\n\n#define MG_SOCK_ERR(errcode) ((errcode) < 0 ? WSAGetLastError() : 0)\n\n#define MG_SOCK_PENDING(errcode)                                            \\\n  (((errcode) < 0) &&                                                       \\\n   (WSAGetLastError() == WSAEINTR || WSAGetLastError() == WSAEINPROGRESS || \\\n    WSAGetLastError() == WSAEWOULDBLOCK))\n\n#define MG_SOCK_RESET(errcode) \\\n  (((errcode) < 0) && (WSAGetLastError() == WSAECONNRESET))\n\n#endif  // MG_ENABLE_WINSOCK\n\n#define realpath(a, b) _fullpath((b), (a), MG_PATH_MAX)\n#define sleep(x) Sleep((x) *1000)\n#define mkdir(a, b) _mkdir(a)\n#define timegm(x) _mkgmtime(x)\n\n#ifndef S_ISDIR\n#define S_ISDIR(x) (((x) &_S_IFMT) == _S_IFDIR)\n#endif\n\n#ifndef MG_ENABLE_DIRLIST\n#define MG_ENABLE_DIRLIST 1\n#endif\n\n#ifndef SIGPIPE\n#define SIGPIPE 0\n#endif\n\n#ifndef MG_ENABLE_POSIX_FS\n#define MG_ENABLE_POSIX_FS 1\n#endif\n\n#ifndef MG_IO_SIZE\n#define MG_IO_SIZE 16384\n#endif\n\n#endif\n"
  },
  {
    "path": "src/arch_zephyr.h",
    "content": "#pragma once\n\n#if MG_ARCH == MG_ARCH_ZEPHYR\n\n#include <zephyr/kernel.h>\n#include <zephyr/net/socket.h>\n// #include <zephyr/posix/dirent.h>\n#include <zephyr/posix/fcntl.h>\n#include <zephyr/posix/sys/select.h>\n#include <zephyr/random/random.h>\n#include <zephyr/version.h>\n\n#include <ctype.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/types.h>\n#include <time.h>\n\n#define MG_PUTCHAR(x) printk(\"%c\", x)\n#ifndef strdup\n#define strdup(s) ((char *) mg_strdup(mg_str(s)).buf)\n#endif\n#define strerror(x) zsock_gai_strerror(x)\n\n#ifndef FD_CLOEXEC\n#define FD_CLOEXEC 0\n#endif\n\n#ifndef F_SETFD\n#define F_SETFD 0\n#endif\n\n#define MG_ENABLE_SSI 0\n\nint rand(void);\nint sscanf(const char *, const char *, ...);\n\n#endif\n"
  },
  {
    "path": "src/base64.c",
    "content": "#include \"base64.h\"\n\nstatic int mg_base64_encode_single(int c) {\n  if (c < 26) {\n    return c + 'A';\n  } else if (c < 52) {\n    return c - 26 + 'a';\n  } else if (c < 62) {\n    return c - 52 + '0';\n  } else {\n    return c == 62 ? '+' : '/';\n  }\n}\n\nstatic int mg_base64_decode_single(int c) {\n  if (c >= 'A' && c <= 'Z') {\n    return c - 'A';\n  } else if (c >= 'a' && c <= 'z') {\n    return c + 26 - 'a';\n  } else if (c >= '0' && c <= '9') {\n    return c + 52 - '0';\n  } else if (c == '+') {\n    return 62;\n  } else if (c == '/') {\n    return 63;\n  } else if (c == '=') {\n    return 64;\n  } else {\n    return -1;\n  }\n}\n\nsize_t mg_base64_update(unsigned char ch, char *to, size_t n) {\n  unsigned long rem = (n & 3) % 3;\n  if (rem == 0) {\n    to[n] = (char) mg_base64_encode_single(ch >> 2);\n    to[++n] = (char) ((ch & 3) << 4);\n  } else if (rem == 1) {\n    to[n] = (char) mg_base64_encode_single(to[n] | (ch >> 4));\n    to[++n] = (char) ((ch & 15) << 2);\n  } else {\n    to[n] = (char) mg_base64_encode_single(to[n] | (ch >> 6));\n    to[++n] = (char) mg_base64_encode_single(ch & 63);\n    n++;\n  }\n  return n;\n}\n\nsize_t mg_base64_final(char *to, size_t n) {\n  size_t saved = n;\n  // printf(\"---[%.*s]\\n\", n, to);\n  if (n & 3) n = mg_base64_update(0, to, n);\n  if ((saved & 3) == 2) n--;\n  // printf(\"    %d[%.*s]\\n\", n, n, to);\n  while (n & 3) to[n++] = '=';\n  to[n] = '\\0';\n  return n;\n}\n\nsize_t mg_base64_encode(const unsigned char *p, size_t n, char *to, size_t dl) {\n  size_t i, len = 0;\n  if (dl > 0) to[0] = '\\0';\n  if (dl < ((n / 3) + (n % 3 ? 1 : 0)) * 4 + 1) return 0;\n  for (i = 0; i < n; i++) len = mg_base64_update(p[i], to, len);\n  len = mg_base64_final(to, len);\n  return len;\n}\n\nsize_t mg_base64_decode(const char *src, size_t n, char *dst, size_t dl) {\n  const char *end = src == NULL ? NULL : src + n;  // Cannot add to NULL\n  size_t len = 0;\n  if (dl < n / 4 * 3 + 1) goto fail;\n  while (src != NULL && src + 3 < end) {\n    int a = mg_base64_decode_single(src[0]),\n        b = mg_base64_decode_single(src[1]),\n        c = mg_base64_decode_single(src[2]),\n        d = mg_base64_decode_single(src[3]);\n    if (a == 64 || a < 0 || b == 64 || b < 0 || c < 0 || d < 0) {\n      goto fail;\n    }\n    dst[len++] = (char) ((a << 2) | (b >> 4));\n    if (src[2] != '=') {\n      dst[len++] = (char) ((b << 4) | (c >> 2));\n      if (src[3] != '=') dst[len++] = (char) ((c << 6) | d);\n    }\n    src += 4;\n  }\n  dst[len] = '\\0';\n  return len;\nfail:\n  if (dl > 0) dst[0] = '\\0';\n  return 0;\n}\n"
  },
  {
    "path": "src/base64.h",
    "content": "#pragma once\n#include \"arch.h\"\nsize_t mg_base64_update(unsigned char input_byte, char *buf, size_t len);\nsize_t mg_base64_final(char *buf, size_t len);\nsize_t mg_base64_encode(const unsigned char *p, size_t n, char *buf, size_t);\nsize_t mg_base64_decode(const char *src, size_t n, char *dst, size_t);\n"
  },
  {
    "path": "src/config.h",
    "content": "#pragma once\n\n#ifndef MG_ENABLE_LOG\n#define MG_ENABLE_LOG 1\n#endif\n\n#ifndef MG_ENABLE_CUSTOM_CALLOC\n#define MG_ENABLE_CUSTOM_CALLOC 0\n#endif\n\n#ifndef MG_ENABLE_CUSTOM_LOG\n#define MG_ENABLE_CUSTOM_LOG 0  // Let user define their own MG_LOG\n#endif\n\n#ifndef MG_ENABLE_TCPIP\n#define MG_ENABLE_TCPIP 0  // Mongoose built-in network stack\n#endif\n\n#ifndef MG_ENABLE_LWIP\n#define MG_ENABLE_LWIP 0  // lWIP network stack\n#endif\n\n#ifndef MG_ENABLE_FREERTOS_TCP\n#define MG_ENABLE_FREERTOS_TCP 0  // Amazon FreeRTOS-TCP network stack\n#endif\n\n#ifndef MG_ENABLE_RL\n#define MG_ENABLE_RL 0  // ARM MDK network stack\n#endif\n\n#ifndef MG_ENABLE_SOCKET\n#define MG_ENABLE_SOCKET !MG_ENABLE_TCPIP\n#endif\n\n#ifndef MG_ENABLE_POLL\n#define MG_ENABLE_POLL 0\n#endif\n\n#ifndef MG_ENABLE_EPOLL\n#define MG_ENABLE_EPOLL 0\n#endif\n\n#ifndef MG_ENABLE_FATFS\n#define MG_ENABLE_FATFS 0\n#endif\n\n#ifndef MG_ENABLE_SSI\n#define MG_ENABLE_SSI 0\n#endif\n\n#ifndef MG_ENABLE_IPV6\n#define MG_ENABLE_IPV6 0\n#endif\n\n#ifndef MG_IPV6_V6ONLY\n#define MG_IPV6_V6ONLY 0  // IPv6 socket binds only to V6, not V4 address\n#endif\n\n#ifndef MG_ENABLE_MD5\n#define MG_ENABLE_MD5 1\n#endif\n\n// Set MG_ENABLE_WINSOCK=0 for Win32 builds with other external IP stack not\n// mentioned in arch_win32.h\n#ifndef MG_ENABLE_WINSOCK\n#define MG_ENABLE_WINSOCK 1\n#endif\n\n#ifndef MG_ENABLE_DIRLIST\n#define MG_ENABLE_DIRLIST 0\n#endif\n\n#ifndef MG_ENABLE_CUSTOM_RANDOM\n#define MG_ENABLE_CUSTOM_RANDOM 0\n#endif\n\n#ifndef MG_ENABLE_CUSTOM_MILLIS\n#define MG_ENABLE_CUSTOM_MILLIS 0\n#endif\n\n#ifndef MG_ENABLE_PACKED_FS\n#define MG_ENABLE_PACKED_FS 0\n#endif\n\n#ifndef MG_ENABLE_ASSERT\n#define MG_ENABLE_ASSERT 0\n#endif\n\n#ifndef MG_IO_SIZE\n#define MG_IO_SIZE 512  // Granularity of the send/recv IO buffer growth\n#endif\n\n#ifndef MG_MAX_RECV_SIZE\n#define MG_MAX_RECV_SIZE (3UL * 1024UL * 1024UL)  // Maximum recv IO buffer size\n#endif\n\n#ifndef MG_DATA_SIZE\n#define MG_DATA_SIZE 32  // struct mg_connection :: data size\n#endif\n\n#ifndef MG_MAX_HTTP_HEADERS\n#define MG_MAX_HTTP_HEADERS 30\n#endif\n\n#ifndef MG_HTTP_INDEX\n#define MG_HTTP_INDEX \"index.html\"\n#endif\n\n#ifndef MG_PATH_MAX\n#ifdef PATH_MAX\n#define MG_PATH_MAX PATH_MAX\n#else\n#define MG_PATH_MAX 128\n#endif\n#endif\n\n#ifndef MG_SOCK_LISTEN_BACKLOG_SIZE\n#define MG_SOCK_LISTEN_BACKLOG_SIZE 128\n#endif\n\n#ifndef MG_DIRSEP\n#define MG_DIRSEP '/'\n#endif\n\n#ifndef MG_ENABLE_POSIX_FS\n#define MG_ENABLE_POSIX_FS 0\n#endif\n\n#ifndef MG_INVALID_SOCKET\n#define MG_INVALID_SOCKET (-1)\n#endif\n\n#ifndef MG_SOCKET_TYPE\n#define MG_SOCKET_TYPE int\n#endif\n\n#ifndef MG_SOCKET_ERRNO\n#define MG_SOCKET_ERRNO errno\n#endif\n\n#if MG_ENABLE_EPOLL\n#define MG_EPOLL_ADD(c)                                                    \\\n  do {                                                                     \\\n    struct epoll_event ev = {EPOLLIN | EPOLLERR | EPOLLHUP, {c}};          \\\n    epoll_ctl(c->mgr->epoll_fd, EPOLL_CTL_ADD, (int) (size_t) c->fd, &ev); \\\n  } while (0)\n#define MG_EPOLL_MOD(c, wr)                                                \\\n  do {                                                                     \\\n    struct epoll_event ev = {EPOLLIN | EPOLLERR | EPOLLHUP, {c}};          \\\n    if (wr) ev.events |= EPOLLOUT;                                         \\\n    epoll_ctl(c->mgr->epoll_fd, EPOLL_CTL_MOD, (int) (size_t) c->fd, &ev); \\\n  } while (0)\n#else\n#define MG_EPOLL_ADD(c)\n#define MG_EPOLL_MOD(c, wr)\n#endif\n\n#ifndef MG_ENABLE_PROFILE\n#define MG_ENABLE_PROFILE 0\n#endif\n\n#ifndef MG_ENABLE_TCPIP_DRIVER_INIT    // mg_mgr_init() will also initialize\n#define MG_ENABLE_TCPIP_DRIVER_INIT 1  // enabled built-in driver for\n#endif                                 // Mongoose built-in network stack\n\n#ifndef MG_TCPIP_IP                      // e.g. MG_IPV4(192, 168, 0, 223)\n#define MG_TCPIP_IP MG_IPV4(0, 0, 0, 0)  // Default is 0.0.0.0 (DHCP)\n#endif\n\n#ifndef MG_TCPIP_MASK\n#define MG_TCPIP_MASK MG_IPV4(0, 0, 0, 0)  // Default is 0.0.0.0 (DHCP)\n#endif\n\n#ifndef MG_TCPIP_GW\n#define MG_TCPIP_GW MG_IPV4(0, 0, 0, 0)  // Default is 0.0.0.0 (DHCP)\n#endif\n\n#if MG_ENABLE_IPV6\n\n#ifndef MG_TCPIP_GLOBAL\n#define MG_TCPIP_GLOBAL MG_IPV6(0, 0, 0, 0, 0, 0, 0, 0)\n#endif\n\n#ifndef MG_TCPIP_IPV6_LINKLOCAL\n#define MG_TCPIP_IPV6_LINKLOCAL MG_IPV6(0, 0, 0, 0, 0, 0, 0, 0)\n#endif\n\n#ifndef MG_TCPIP_PREFIX_LEN\n#define MG_TCPIP_PREFIX_LEN 0\n#endif\n\n#ifndef MG_TCPIP_GW6\n#define MG_TCPIP_GW6 MG_IPV6(0, 0, 0, 0, 0, 0, 0, 0)\n#endif\n\n#endif\n\n#ifndef MG_SET_MAC_ADDRESS\n#define MG_SET_MAC_ADDRESS(mac)\n#endif\n\n#ifndef MG_TCPIP_DHCPNAME_SIZE\n#define MG_TCPIP_DHCPNAME_SIZE 18  // struct mg_tcpip_if :: dhcp_name size\n#endif\n\n#ifndef MG_SET_WIFI_CONFIG\n#define MG_SET_WIFI_CONFIG(data)\n#endif\n\n#ifndef MG_ENABLE_TCPIP_PRINT_DEBUG_STATS\n#define MG_ENABLE_TCPIP_PRINT_DEBUG_STATS 0\n#endif\n\n#ifndef MG_ENABLE_CHACHA20\n#define MG_ENABLE_CHACHA20 1  // When set to 0, GCM is used. For MG_TLS_BUILTIN\n#endif\n"
  },
  {
    "path": "src/dns.c",
    "content": "#include \"dns.h\"\n#include \"log.h\"\n#include \"printf.h\"\n#include \"str.h\"\n#include \"timer.h\"\n#include \"url.h\"\n#include \"util.h\"\n\nstruct dns_data {\n  struct dns_data *next;\n  struct mg_connection *c;\n  uint64_t expire;\n  uint16_t txnid;\n};\n\nstatic void mg_sendnsreq(struct mg_connection *, struct mg_str *, int,\n                         struct mg_dns *, bool);\n\nstatic void mg_dns_free(struct dns_data **head, struct dns_data *d) {\n  LIST_DELETE(struct dns_data, head, d);\n  mg_free(d);\n}\n\nvoid mg_resolve_cancel(struct mg_connection *c) {\n  struct dns_data *tmp, *d;\n  struct dns_data **head = (struct dns_data **) &c->mgr->active_dns_requests;\n  for (d = *head; d != NULL; d = tmp) {\n    tmp = d->next;\n    if (d->c == c) mg_dns_free(head, d);\n  }\n}\n\nstatic size_t mg_dns_parse_name_depth(const uint8_t *s, size_t len, size_t ofs,\n                                      char *to, size_t tolen, size_t j,\n                                      int depth) {\n  size_t i = 0;\n  if (tolen > 0 && depth == 0) to[0] = '\\0';\n  if (depth > 5) return 0;\n  // MG_INFO((\"ofs %lx %x %x\", (unsigned long) ofs, s[ofs], s[ofs + 1]));\n  while (ofs + i + 1 < len) {\n    size_t n = s[ofs + i];\n    if (n == 0) {\n      i++;\n      break;\n    }\n    if (n & 0xc0) {\n      size_t ptr = (((n & 0x3f) << 8) | s[ofs + i + 1]);  // 12 is hdr len\n      // MG_INFO((\"PTR %lx\", (unsigned long) ptr));\n      if (ptr + 1 < len && (s[ptr] & 0xc0) == 0 &&\n          mg_dns_parse_name_depth(s, len, ptr, to, tolen, j, depth + 1) == 0)\n        return 0;\n      i += 2;\n      break;\n    }\n    if (ofs + i + n + 1 >= len) return 0;\n    if (j > 0) {\n      if (j < tolen) to[j] = '.';\n      j++;\n    }\n    if (j + n < tolen) memcpy(&to[j], &s[ofs + i + 1], n);\n    j += n;\n    i += n + 1;\n    if (j < tolen) to[j] = '\\0';  // Zero-terminate this chunk\n    // MG_INFO((\"--> [%s]\", to));\n  }\n  if (tolen > 0) to[tolen - 1] = '\\0';  // Make sure it is nul-term\n  return i;\n}\n\nstatic size_t mg_dns_parse_name(const uint8_t *s, size_t n, size_t ofs,\n                                char *dst, size_t dstlen) {\n  return mg_dns_parse_name_depth(s, n, ofs, dst, dstlen, 0, 0);\n}\n\nsize_t mg_dns_parse_rr(const uint8_t *buf, size_t len, size_t ofs,\n                       bool is_question, struct mg_dns_rr *rr) {\n  const uint8_t *s = buf + ofs, *e = &buf[len];\n\n  memset(rr, 0, sizeof(*rr));\n  if (len < sizeof(struct mg_dns_header)) return 0;  // Too small\n  if (len > 512) return 0;  //  Too large, we don't expect that\n  if (s >= e) return 0;     //  Overflow\n\n  if ((rr->nlen = (uint16_t) mg_dns_parse_name(buf, len, ofs, NULL, 0)) == 0)\n    return 0;\n  s += rr->nlen + 4;\n  if (s > e) return 0;\n  rr->atype = (uint16_t) (((uint16_t) s[-4] << 8) | s[-3]);\n  rr->aclass = (uint16_t) (((uint16_t) s[-2] << 8) | s[-1]);\n  if (is_question) return (size_t) (rr->nlen + 4);\n\n  s += 6;\n  if (s > e) return 0;\n  rr->alen = (uint16_t) (((uint16_t) s[-2] << 8) | s[-1]);\n  if (s + rr->alen > e) return 0;\n  return (size_t) (rr->nlen + rr->alen + 10);\n}\n\nbool mg_dns_parse(const uint8_t *buf, size_t len, struct mg_dns_message *dm) {\n  const struct mg_dns_header *h = (struct mg_dns_header *) buf;\n  struct mg_dns_rr rr;\n  size_t i, n, num_answers, ofs = sizeof(*h);\n  bool is_response;\n  memset(dm, 0, sizeof(*dm));\n\n  if (len < sizeof(*h)) return 0;                // Too small, headers dont fit\n  if (mg_ntohs(h->num_questions) > 1) return 0;  // Sanity\n  num_answers = mg_ntohs(h->num_answers);\n  if (num_answers > 10) {\n    MG_DEBUG((\"Got %u answers, ignoring beyond 10th one\", num_answers));\n    num_answers = 10;  // Sanity cap\n  }\n  dm->txnid = mg_ntohs(h->txnid);\n  is_response = mg_ntohs(h->flags) & 0x8000;\n\n  for (i = 0; i < mg_ntohs(h->num_questions); i++) {\n    if ((n = mg_dns_parse_rr(buf, len, ofs, true, &rr)) == 0) return false;\n    // MG_INFO((\"Q %lu %lu %hu/%hu\", ofs, n, rr.atype, rr.aclass));\n    mg_dns_parse_name(buf, len, ofs, dm->name, sizeof(dm->name));\n    ofs += n;\n  }\n\n  if (!is_response) {\n    // For queries, there is no need to parse the answers. In this way,\n    // we also ensure the domain name (dm->name) is parsed from\n    // the question field.\n    return true;\n  }\n\n  for (i = 0; i < num_answers; i++) {\n    if ((n = mg_dns_parse_rr(buf, len, ofs, false, &rr)) == 0) return false;\n    // MG_INFO((\"A -- %lu %lu %hu/%hu %s\", ofs, n, rr.atype, rr.aclass,\n    // dm->name));\n    mg_dns_parse_name(buf, len, ofs, dm->name, sizeof(dm->name));\n    ofs += n;\n\n    if (rr.alen == 4 && rr.atype == MG_DNS_RTYPE_A && rr.aclass == 1) {\n      dm->addr.is_ip6 = false;\n      memcpy(&dm->addr.addr.ip, &buf[ofs - 4], 4);\n      dm->resolved = true;\n      break;  // Return success\n    } else if (rr.alen == 16 && rr.atype == MG_DNS_RTYPE_AAAA &&\n               rr.aclass == 1) {\n      dm->addr.is_ip6 = true;\n      memcpy(&dm->addr.addr.ip, &buf[ofs - 16], 16);\n      dm->resolved = true;\n      break;  // Return success\n    }\n  }\n  return true;\n}\n\nstatic void dns_cb(struct mg_connection *c, int ev, void *ev_data) {\n  struct dns_data *d, *tmp;\n  struct dns_data **head = (struct dns_data **) &c->mgr->active_dns_requests;\n  if (ev == MG_EV_POLL) {\n    uint64_t now = *(uint64_t *) ev_data;\n    for (d = *head; d != NULL; d = tmp) {\n      tmp = d->next;\n      // MG_DEBUG (\"%lu %lu dns poll\", d->expire, now));\n      if (now > d->expire) mg_error(d->c, \"DNS timeout\");\n    }\n  } else if (ev == MG_EV_READ) {\n    struct mg_dns_message dm;\n    int resolved = 0;\n    if (mg_dns_parse(c->recv.buf, c->recv.len, &dm) == false) {\n      MG_ERROR((\"Unexpected DNS response:\"));\n      mg_hexdump(c->recv.buf, c->recv.len);\n    } else {\n      // MG_VERBOSE((\"%s %d\", dm.name, dm.resolved));\n      for (d = *head; d != NULL; d = tmp) {\n        tmp = d->next;\n        // MG_INFO((\"d %p %hu %hu\", d, d->txnid, dm.txnid));\n        if (dm.txnid != d->txnid) continue;\n        if (d->c->is_resolving) {\n          if (dm.resolved) {\n            dm.addr.port = d->c->rem.port;  // Save port\n            d->c->rem = dm.addr;            // Copy resolved address\n            MG_DEBUG(\n                (\"%lu %s is %M\", d->c->id, dm.name, mg_print_ip, &d->c->rem));\n            mg_connect_resolved(d->c);\n#if MG_ENABLE_IPV6\n          } else if (dm.addr.is_ip6 == false && dm.name[0] != '\\0' &&\n                     c->mgr->use_dns6 == false) {\n            struct mg_str x = mg_str(dm.name);\n            mg_sendnsreq(d->c, &x, c->mgr->dnstimeout, &c->mgr->dns6, true);\n#endif\n          } else {\n            mg_error(d->c, \"%s DNS lookup failed\", dm.name);\n          }\n        } else {\n          MG_ERROR((\"%lu already resolved\", d->c->id));\n        }\n        mg_dns_free(head, d);\n        resolved = 1;\n      }\n    }\n    if (!resolved) MG_ERROR((\"stray DNS reply\"));\n    c->recv.len = 0;\n  } else if (ev == MG_EV_CLOSE) {\n    for (d = *head; d != NULL; d = tmp) {\n      tmp = d->next;\n      mg_error(d->c, \"DNS error\");\n      mg_dns_free(head, d);\n    }\n  }\n}\n\nstatic bool mg_dns_send(struct mg_connection *c, const struct mg_str *name,\n                        uint16_t txnid, bool ipv6) {\n  struct {\n    struct mg_dns_header header;\n    uint8_t data[256];\n  } pkt;\n  size_t i, n;\n  memset(&pkt, 0, sizeof(pkt));\n  pkt.header.txnid = mg_htons(txnid);\n  pkt.header.flags = mg_htons(0x100);\n  pkt.header.num_questions = mg_htons(1);\n  for (i = n = 0; i < sizeof(pkt.data) - 5; i++) {\n    if (name->buf[i] == '.' || i >= name->len) {\n      pkt.data[n] = (uint8_t) (i - n);\n      memcpy(&pkt.data[n + 1], name->buf + n, i - n);\n      n = i + 1;\n    }\n    if (i >= name->len) break;\n  }\n  memcpy(&pkt.data[n], \"\\x00\\x00\\x01\\x00\\x01\", 5);  // A query\n  n += 5;\n  if (ipv6) pkt.data[n - 3] = 0x1c;  // AAAA query\n  // memcpy(&pkt.data[n], \"\\xc0\\x0c\\x00\\x1c\\x00\\x01\", 6);  // AAAA query\n  // n += 6;\n  return mg_send(c, &pkt, sizeof(pkt.header) + n);\n}\n\nbool mg_dnsc_init(struct mg_mgr *mgr, struct mg_dns *dnsc);\nbool mg_dnsc_init(struct mg_mgr *mgr, struct mg_dns *dnsc) {\n  if (dnsc->url == NULL) {\n    mg_error(0, \"DNS server URL is NULL. Call mg_mgr_init()\");\n    return false;\n  }\n  if (dnsc->c == NULL) {\n    dnsc->c = mg_connect(mgr, dnsc->url, NULL, NULL);\n    if (dnsc->c == NULL) return false;\n    dnsc->c->pfn = dns_cb;\n  }\n  return true;\n}\n\nstatic void mg_sendnsreq(struct mg_connection *c, struct mg_str *name, int ms,\n                         struct mg_dns *dnsc, bool ipv6) {\n  struct dns_data *d = NULL;\n  if (!mg_dnsc_init(c->mgr, dnsc)) {\n    mg_error(c, \"resolver\");\n  } else if ((d = (struct dns_data *) mg_calloc(1, sizeof(*d))) == NULL) {\n    mg_error(c, \"resolve OOM\");\n  } else {\n    struct dns_data *reqs = (struct dns_data *) c->mgr->active_dns_requests;\n    uint16_t id;\n    mg_random(&id, sizeof(uint16_t));\n    // TODO(): traverse reqs and check id != reqs->txnid; repeat otherwise\n    if (reqs != NULL) id = (uint16_t) (reqs->txnid + 1);  // no collision\n    d->txnid = id;\n    d->next = reqs;\n    c->mgr->active_dns_requests = d;\n    d->expire = mg_millis() + (uint64_t) ms;\n    d->c = c;\n    c->is_resolving = 1;\n    MG_VERBOSE((\"%lu resolving %.*s @ %s, txnid %hu\", c->id, (int) name->len,\n                name->buf, dnsc->url, d->txnid));\n    if (!mg_dns_send(dnsc->c, name, d->txnid, ipv6)) {\n      mg_error(dnsc->c, \"DNS send\");\n    }\n  }\n}\n\nvoid mg_resolve(struct mg_connection *c, const char *url) {\n  struct mg_str host = mg_url_host(url);\n  c->rem.port = mg_htons(mg_url_port(url));\n  if (mg_aton(host, &c->rem)) {\n    // host is an IP address, do not fire name resolution\n    mg_connect_resolved(c);\n  } else {\n    // host is not an IP, send DNS resolution request\n    struct mg_dns *dns = c->mgr->use_dns6 ? &c->mgr->dns6 : &c->mgr->dns4;\n    mg_sendnsreq(c, &host, c->mgr->dnstimeout, dns, c->mgr->use_dns6);\n  }\n}\n\nstatic const uint8_t mdns_answer[] = {\n    0, 1,          // 2 bytes - record type, A\n    0, 1,          // 2 bytes - address class, INET\n    0, 0, 0, 120,  // 4 bytes - TTL\n    0, 4           // 2 bytes - address length\n};\n\nstatic uint8_t *build_name(struct mg_str *name, uint8_t *p) {\n  *p++ = (uint8_t) name->len;  // label 1\n  memcpy(p, name->buf, name->len), p += name->len;\n  *p++ = 5;  // label 2\n  memcpy(p, \"local\", 5), p += 5;\n  *p++ = 0;  // no more labels\n  return p;\n}\n\nvoid mg_getlocaddr(struct mg_connection *, struct mg_addr *, struct mg_addr *);\n\nstatic uint8_t *build_a_record(struct mg_connection *c, uint8_t *p,\n                               struct mg_addr *addr) {\n  memcpy(p, mdns_answer, sizeof(mdns_answer)), p += sizeof(mdns_answer);\n  if (addr != NULL && !addr->is_ip6) {\n    memcpy(p, &addr->addr.ip4, 4), p += 4;\n  } else {\n#if MG_ENABLE_TCPIP\n    memcpy(p, &c->mgr->ifp->ip, 4), p += 4;\n#else\n    struct mg_addr loc, to;\n    memset(&loc, 0, sizeof(loc));\n    to.is_ip6 = false;\n    to.port = mg_htons(5353);\n    to.addr.ip4 = MG_IPV4(224, 0, 0, 51);\n    mg_getlocaddr(c, &to, &loc);\n    memcpy(p, &loc.addr.ip4, 4), p += 4;\n#endif\n  }\n  return p;\n}\n\nstatic uint8_t *build_srv_name(uint8_t *p, struct mg_dnssd_record *r) {\n  *p++ = (uint8_t) r->srvcproto.len - 5;  // label 1, up to '._tcp'\n  memcpy(p, r->srvcproto.buf, r->srvcproto.len), p += r->srvcproto.len;\n  p[-5] = 4;  // label 2, '_tcp', overwrite '.'\n  *p++ = 5;   // label 3\n  memcpy(p, \"local\", 5), p += 5;\n  *p++ = 0;  // no more labels\n  return p;\n}\n\n#if 0\n// TODO(): for listing\nstatic uint8_t *build_mysrv_name(struct mg_str *name, uint8_t *p,\n                                 struct mg_dnssd_record *r) {\n  *p++ = name->len;  // label 1\n  memcpy(p, name->buf, name->len), p += name->len;\n  return build_srv_name(p, r);\n}\n#endif\n\nstatic uint8_t *build_ptr_record(struct mg_str *name, uint8_t *p, uint16_t o) {\n  uint16_t offset = mg_htons(o);\n  memcpy(p, mdns_answer, sizeof(mdns_answer));\n  p[1] = MG_DNS_RTYPE_PTR;  // overwrite record type\n  p += sizeof(mdns_answer);\n  p[-1] = (uint8_t) name->len +\n          3;  // overwrite response length, label length + label + offset\n  *p++ = (uint8_t) name->len;                       // response: label 1\n  memcpy(p, name->buf, name->len), p += name->len;  // copy label\n  memcpy(p, &offset, 2);\n  *p |= 0xC0, p += 2;\n  return p;\n}\n\nstatic uint8_t *build_srv_record(struct mg_str *name, uint8_t *p,\n                                 struct mg_dnssd_record *r, uint16_t o) {\n  uint16_t port = mg_htons(r->port);\n  uint16_t offset = mg_htons(o);\n  memcpy(p, mdns_answer, sizeof(mdns_answer));\n  p[1] = MG_DNS_RTYPE_SRV;  // overwrite record type\n  p += sizeof(mdns_answer);\n  p[-1] = (uint8_t) name->len + 9;  // overwrite response length (4+2+1+2)\n  *p++ = 0;                         // priority\n  *p++ = 0;\n  *p++ = 0;  // weight\n  *p++ = 0;\n  memcpy(p, &port, 2), p += 2;  // port\n  *p++ = (uint8_t) name->len;   // label 1\n  memcpy(p, name->buf, name->len), p += name->len;\n  memcpy(p, &offset, 2);\n  *p |= 0xC0, p += 2;\n  return p;\n}\n\nstatic uint8_t *build_txt_record(uint8_t *p, struct mg_dnssd_record *r) {\n  uint16_t len = mg_htons((uint16_t) r->txt.len);\n  memcpy(p, mdns_answer, sizeof(mdns_answer));\n  p[1] = MG_DNS_RTYPE_TXT;  // overwrite record type\n  p += sizeof(mdns_answer);\n  memcpy(p - 2, &len, 2);  // overwrite response length\n  memcpy(p, r->txt.buf, r->txt.len), p += r->txt.len;  // copy record verbatim\n  return p;\n}\n\n// RFC-6762 16: case-insensitivity --> RFC-1034, 1035\n\nstatic void handle_mdns_query(struct mg_connection *c) {\n  struct mg_dns_header *qh = (struct mg_dns_header *) c->recv.buf;\n  struct mg_dns_rr rr;\n  size_t n;\n  // Parse first question, offset 12 is header size\n  n = mg_dns_parse_rr(c->recv.buf, c->recv.len, 12, true, &rr);\n  MG_VERBOSE((\"mDNS request parsed, result=%d\", (int) n));\n  if (n > 0) {\n    // RFC-6762 Appendix C, RFC2181 11: m(n + 1-63), max 255 + 0x0\n    uint8_t buf[sizeof(struct mg_dns_header) + 256 + sizeof(mdns_answer) + 4];\n    struct mg_dns_header *h = (struct mg_dns_header *) buf;\n    uint8_t *p = &buf[sizeof(*h)];\n    char name[256];\n    uint8_t name_len;\n    // uint16_t q = mg_ntohs(qh->num_questions);\n    struct mg_str defname = mg_str((const char *) c->fn_data);\n    struct mg_str *respname;\n    struct mg_mdns_req req;\n    memset(&req, 0, sizeof(req));\n    req.is_unicast = (rr.aclass & MG_BIT(15)) != 0;  // QU\n    rr.aclass &= (uint16_t) ~MG_BIT(15);  // remove \"QU\" (unicast response)\n    qh->num_questions = mg_htons(1);      // parser sanity\n    mg_dns_parse_name(c->recv.buf, c->recv.len, 12, name, sizeof(name));\n    name_len = (uint8_t) strlen(name);  // verify it ends in .local\n    if (name_len <= 6 || strcmp(\".local\", &name[name_len - 6]) != 0 ||\n        (rr.aclass != 1 && rr.aclass != 0xff))\n      return;\n    name[name_len -= 6] = '\\0';  // remove .local\n    MG_VERBOSE((\"RR %u %u %s\", (unsigned int) rr.atype,\n                (unsigned int) rr.aclass, name));\n    if (rr.atype == MG_DNS_RTYPE_A) {\n      // TODO(): ensure c->fn_data ends in \\0\n      // if we have a name to match, go; otherwise users will match and fill\n      // req.r.name and set req.is_resp\n      if (c->fn_data != NULL && mg_casecmp((char *) c->fn_data, name) != 0)\n        return;\n      req.is_resp = (c->fn_data != NULL);\n      req.reqname = mg_str_n(name, name_len);\n    } else  // users have to match the request to something in their db, then\n            // fill req.r and set req.is_resp\n      if (rr.atype == MG_DNS_RTYPE_PTR) {\n        if (strcmp(\"_services._dns-sd._udp\", name) == 0) req.is_listing = true;\n        MG_DEBUG(\n            (\"PTR request for %s\", req.is_listing ? \"services listing\" : name));\n        req.reqname = mg_str_n(name, name_len);\n      } else if (rr.atype == MG_DNS_RTYPE_SRV || rr.atype == MG_DNS_RTYPE_TXT) {\n        MG_DEBUG((\"%s request for %s\",\n                  rr.atype == MG_DNS_RTYPE_SRV ? \"SRV\" : \"TXT\", name));\n        // if possible, check it starts with our name, users will check it ends\n        // in a service name they handle\n        if (c->fn_data != NULL) {\n          if (mg_strcasecmp(defname, mg_str_n(name, defname.len)) != 0 ||\n              name[defname.len] != '.')\n            return;\n          req.reqname =\n              mg_str_n(name + defname.len + 1, name_len - defname.len - 1);\n          MG_DEBUG(\n              (\"That's us, handing %.*s\", req.reqname.len, req.reqname.buf));\n        } else {\n          req.reqname = mg_str_n(name, name_len);\n        }\n      } else {  // unhandled record\n        return;\n      }\n    req.rr = &rr;\n    mg_call(c, MG_EV_MDNS_REQ, &req);\n    if (!req.is_resp) return;\n    respname = req.respname.buf != NULL ? &req.respname : &defname;\n\n    memset(h, 0, sizeof(*h));                   // clear header\n    h->txnid = req.is_unicast ? qh->txnid : 0;  // RFC-6762 18.1\n    h->num_answers = mg_htons(1);  // RFC-6762 6: 0 questions, 1 Answer\n    h->flags = mg_htons(0x8400);   // Authoritative response\n    if (req.is_listing) {\n      // TODO(): RFC-6762 6: each responder SHOULD delay its response by a\n      // random amount of time selected with uniform random distribution in the\n      // range 20-120 ms.\n      // TODO():\n      return;\n    } else if (rr.atype == MG_DNS_RTYPE_PTR) {  // serve PTR + SRV + TXT + A\n      // TODO(): RFC-6762 6: each responder SHOULD delay its response by a\n      // random amount of time selected with uniform random distribution in the\n      // range 20-120 ms. Response to PTR is local_name._myservice._tcp.local\n      uint8_t *o = p, *aux;\n      uint16_t offset;\n      if (respname->buf == NULL || respname->len == 0) return;\n      h->num_other_prs = mg_htons(3);  // 3 additional records\n      p = build_srv_name(p, req.r);\n      aux = build_ptr_record(respname, p, (uint16_t) (o - buf));\n      o = p + sizeof(mdns_answer);  // point to PTR response (full srvc name)\n      offset = mg_htons((uint16_t) (o - buf));\n      o = p - 7;  // point to '.local' label (\\x05local\\x00)\n      p = aux;\n      memcpy(p, &offset, 2);  // point to full srvc name, in record\n      *p |= 0xC0, p += 2;\n      aux = p;\n      p = build_srv_record(respname, p, req.r, (uint16_t) (o - buf));\n      o = aux + sizeof(mdns_answer) + 6;  // point to target in SRV\n      memcpy(p, &offset, 2);              // point to full srvc name, in record\n      *p |= 0xC0, p += 2;\n      p = build_txt_record(p, req.r);\n      offset = mg_htons((uint16_t) (o - buf));\n      memcpy(p, &offset, 2);  // point to target name, in record\n      *p |= 0xC0, p += 2;\n      p = build_a_record(c, p, req.addr);\n    } else if (rr.atype == MG_DNS_RTYPE_TXT) {\n      p = build_srv_name(p, req.r);\n      p = build_txt_record(p, req.r);\n    } else if (rr.atype == MG_DNS_RTYPE_SRV) {  // serve SRV + A\n      uint8_t *o, *aux;\n      uint16_t offset;\n      if (respname->buf == NULL || respname->len == 0) return;\n      h->num_other_prs = mg_htons(1);  // 1 additional record\n      p = build_srv_name(p, req.r);\n      o = p - 7;  // point to '.local' label (\\x05local\\x00)\n      aux = p;\n      p = build_srv_record(respname, p, req.r, (uint16_t) (o - buf));\n      o = aux + sizeof(mdns_answer) + 6;  // point to target in SRV\n      offset = mg_htons((uint16_t) (o - buf));\n      memcpy(p, &offset, 2);  // point to target name, in record\n      *p |= 0xC0, p += 2;\n      p = build_a_record(c, p, req.addr);\n    } else {  // A requested\n      // RFC-6762 6: 0 Auth, 0 Additional RRs\n      if (respname->buf == NULL || respname->len == 0) return;\n      p = build_name(respname, p);\n      p = build_a_record(c, p, req.addr);\n    }\n    if (!req.is_unicast) mg_multicast_restore(c, (uint8_t *) &c->loc);\n    mg_send(c, buf, (size_t) (p - buf));  // And send it!\n    MG_DEBUG((\"%M > %M\", mg_print_ip_port, &c->loc, mg_print_ip_port, &c->rem));\n    MG_DEBUG((\"mDNS %s response sent\", req.is_unicast ? \"unicast\" : \"mcast\"));\n  }\n}\n\nstatic void handle_mdns_response(struct mg_connection *c) {\n  struct mg_dns_header *rh = (struct mg_dns_header *) c->recv.buf;\n  struct mg_dns_rr rr;\n  size_t n;\n  // Parse first response, offset 12 is header size\n  n = mg_dns_parse_rr(c->recv.buf, c->recv.len, 12, false, &rr);\n  MG_VERBOSE((\"mDNS response parsed, result=%d\", (int) n));\n  if (n > 0) {\n    // RFC-6762 Appendix C, RFC2181 11: m(n + 1-63), max 255 + 0x0\n    char name[256];\n    uint8_t name_len;\n    struct mg_mdns_resp resp;\n    memset(&resp, 0, sizeof(resp));\n    if (rh->num_answers > mg_htons(1)) MG_DEBUG((\"ignoring > 1 answers\"));\n    mg_dns_parse_name(c->recv.buf, c->recv.len, 12, name, sizeof(name));\n    name_len = (uint8_t) strlen(name);  // verify it ends in .local\n    MG_VERBOSE((\"RR %u %u %s\", (unsigned int) rr.atype,\n                (unsigned int) rr.aclass, name));\n    if (rr.alen == 4 && rr.atype == MG_DNS_RTYPE_A &&\n        (rr.aclass & 0x7FFF) == 1) {\n      resp.addr.is_ip6 = false;\n      memcpy(resp.addr.addr.ip, (char *) (rh + 1) + n - 4, 4);\n      MG_DEBUG((\"A response from %.*s = %M\", name_len, name, mg_print_ip,\n                &resp.addr));\n      //    } else if (rr.alen == 16 && rr.atype == MG_DNS_RTYPE_AAAA &&\n      //    (rr.aclass & 0x7FFF) == 1) {\n      //      resp.addr.is_ip6 = true;\n      //      memcpy(resp.addr.addr.ip, (char *)(rh + 1) + n - 16], 16);\n      //      MG_DEBUG((\"AAAA response from %.*s = %M\", name_len, name,\n      //      mg_print_ip, &resp.addr));\n    } else {\n      return;\n    }\n    resp.name = mg_str_n(name, name_len);\n    resp.rr = &rr;\n    mg_call(c, MG_EV_MDNS_RESP, &resp);\n  }\n}\n\nstatic void handle_mdns_record(struct mg_connection *c) {\n  struct mg_dns_header *h = (struct mg_dns_header *) c->recv.buf;\n  if (c->recv.len <= 12) return;\n  if ((h->flags & mg_htons(0xF800)) == 0) {\n    // flags -> !resp, opcode=0 => query; ignore other opcodes\n    handle_mdns_query(c);\n  } else if ((h->flags & mg_htons(0xF800)) == mg_htons(0x8000)) {\n    // flags -> resp, opcode=0 => response; ignore other opcodes\n    handle_mdns_response(c);\n  }\n}\n\nstatic void mdns_cb(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_READ) {\n    handle_mdns_record(c);\n    mg_iobuf_del(&c->recv, 0, c->recv.len);\n  }\n  (void) ev_data;\n}\n\nvoid mg_multicast_add(struct mg_connection *c, char *ip);\nstruct mg_connection *mg_mdns_listen(struct mg_mgr *mgr, mg_event_handler_t fn,\n                                     void *fn_data) {\n  struct mg_connection *c =\n      mg_listen(mgr, \"udp://224.0.0.251:5353\", fn, fn_data);\n  if (c == NULL) return NULL;\n  c->pfn = mdns_cb, c->pfn_data = fn_data;\n  mg_multicast_add(c, (char *) \"224.0.0.251\");\n  return c;\n}\n\nbool mg_mdns_query(struct mg_connection *c, const char *name,\n                   unsigned int rtype) {\n  struct mg_str name_;\n  name_.buf = (char *) name, name_.len = strlen(name);\n  mg_multicast_restore(c, (uint8_t *) &c->loc);\n  (void) rtype;\n  return mg_dns_send(c, &name_, 0, false);\n}\n"
  },
  {
    "path": "src/dns.h",
    "content": "#pragma once\n\n#include \"net.h\"\n#include \"str.h\"\n\n#define MG_DNS_RTYPE_A 1\n#define MG_DNS_RTYPE_PTR 12\n#define MG_DNS_RTYPE_TXT 16\n#define MG_DNS_RTYPE_AAAA 28\n#define MG_DNS_RTYPE_SRV 33\n\n// Mongoose sends DNS queries that contain only one question:\n// either A (IPv4) or AAAA (IPv6) address lookup.\n// Therefore, we expect zero or one answer.\n// If `resolved` is true, then `addr` contains resolved IPv4 or IPV6 address.\nstruct mg_dns_message {\n  uint16_t txnid;       // Transaction ID\n  bool resolved;        // Resolve successful, addr is set\n  struct mg_addr addr;  // Resolved address\n  char name[256];       // Host name\n};\n\nstruct mg_dns_header {\n  uint16_t txnid;  // Transaction ID\n  uint16_t flags;\n  uint16_t num_questions;\n  uint16_t num_answers;\n  uint16_t num_authority_prs;\n  uint16_t num_other_prs;\n};\n\n// DNS resource record\nstruct mg_dns_rr {\n  uint16_t nlen;    // Name or pointer length\n  uint16_t atype;   // Address type\n  uint16_t aclass;  // Address class\n  uint16_t alen;    // Address length\n};\n\n// DNS-SD response record\nstruct mg_dnssd_record {\n  struct mg_str srvcproto;  // service.proto, service name\n  struct mg_str txt;        // TXT record contents\n  uint16_t port;            // SRV record port\n};\n\n// mDNS request and response data structs passed to event handlers\nstruct mg_mdns_req {\n  struct mg_dns_rr *rr;\n  struct mg_dnssd_record *r;\n  struct mg_str reqname;   // requested name in RR\n  struct mg_str respname;  // actual name to use in response\n  struct mg_addr *addr;    // actual address to use in response\n  bool is_listing;\n  bool is_resp;\n  bool is_unicast;\n};\n\nstruct mg_mdns_resp {\n  struct mg_dns_rr *rr;\n  // TODO(scaprile )struct mg_str srvcproto; struct mg_str txt; uint16_t port; ?\n  struct mg_str name;\n  struct mg_addr addr;\n  // TODO(scaprile); bool has_A; bool has_PTR; bool has_SRV; bool has_TXT; ?\n};\n\nvoid mg_resolve(struct mg_connection *, const char *url);\nvoid mg_resolve_cancel(struct mg_connection *);\nbool mg_dns_parse(const uint8_t *buf, size_t len, struct mg_dns_message *);\nsize_t mg_dns_parse_rr(const uint8_t *buf, size_t len, size_t ofs,\n                       bool is_question, struct mg_dns_rr *);\n\nstruct mg_connection *mg_mdns_listen(struct mg_mgr *mgr, mg_event_handler_t fn,\n                                     void *fn_data);\nbool mg_mdns_query(struct mg_connection *, const char *, unsigned int);\n"
  },
  {
    "path": "src/drivers/cmsis.c",
    "content": "// https://arm-software.github.io/CMSIS_5/Driver/html/index.html\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_CMSIS) && MG_ENABLE_DRIVER_CMSIS\n\n#include \"cmsis.h\"\n#include \"net_builtin.h\"\n#include \"queue.h\"\n\nextern ARM_DRIVER_ETH_MAC Driver_ETH_MAC0;\nextern ARM_DRIVER_ETH_PHY Driver_ETH_PHY0;\n\nstatic struct mg_tcpip_if *s_ifp;\n\nstatic void mac_cb(uint32_t);\nstatic bool cmsis_init(struct mg_tcpip_if *);\nstatic bool cmsis_poll(struct mg_tcpip_if *, bool);\nstatic size_t cmsis_tx(const void *, size_t, struct mg_tcpip_if *);\nstatic size_t cmsis_rx(void *, size_t, struct mg_tcpip_if *);\n\nstruct mg_tcpip_driver mg_tcpip_driver_cmsis = {cmsis_init, cmsis_tx, NULL,\n                                                cmsis_poll};\n\nstatic bool cmsis_init(struct mg_tcpip_if *ifp) {\n  ARM_ETH_MAC_ADDR addr;\n  s_ifp = ifp;\n\n  ARM_DRIVER_ETH_MAC *mac = &Driver_ETH_MAC0;\n  ARM_DRIVER_ETH_PHY *phy = &Driver_ETH_PHY0;\n  ARM_ETH_MAC_CAPABILITIES cap = mac->GetCapabilities();\n  if (mac->Initialize(mac_cb) != ARM_DRIVER_OK) return false;\n  if (phy->Initialize(mac->PHY_Read, mac->PHY_Write) != ARM_DRIVER_OK)\n    return false;\n  if (cap.event_rx_frame == 0)  // polled mode driver\n    mg_tcpip_driver_cmsis.rx = cmsis_rx;\n  mac->PowerControl(ARM_POWER_FULL);\n  if (cap.mac_address) {  // driver provides MAC address\n    mac->GetMacAddress(&addr);\n    memcpy(ifp->mac, &addr, sizeof(ifp->mac));\n  } else {  // we provide MAC address\n    memcpy(&addr, ifp->mac, sizeof(addr));\n    mac->SetMacAddress(&addr);\n  }\n  phy->PowerControl(ARM_POWER_FULL);\n  phy->SetInterface(cap.media_interface);\n  phy->SetMode(ARM_ETH_PHY_AUTO_NEGOTIATE);\n  return true;\n}\n\nstatic size_t cmsis_tx(const void *buf, size_t len, struct mg_tcpip_if *ifp) {\n  ARM_DRIVER_ETH_MAC *mac = &Driver_ETH_MAC0;\n  if (mac->SendFrame(buf, (uint32_t) len, 0) != ARM_DRIVER_OK) {\n    ifp->nerr++;\n    return 0;\n  }\n  ifp->nsent++;\n  return len;\n}\n\nstatic void cmsis_update_hash_table(struct mg_tcpip_if *ifp) {\n  // TODO(): read database, rebuild hash table\n  ARM_DRIVER_ETH_MAC *mac = &Driver_ETH_MAC0;\n  ARM_ETH_MAC_ADDR addr;\n  memcpy(&addr, mcast_addr, sizeof(addr));\n  mac->SetAddressFilter(&addr, 1);\n  (void) ifp;\n}\n\nstatic bool cmsis_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    cmsis_update_hash_table(ifp);\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  ARM_DRIVER_ETH_PHY *phy = &Driver_ETH_PHY0;\n  ARM_DRIVER_ETH_MAC *mac = &Driver_ETH_MAC0;\n  bool up = (phy->GetLinkState() == ARM_ETH_LINK_UP) ? 1 : 0;  // link state\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {             // just went up\n    ARM_ETH_LINK_INFO st = phy->GetLinkInfo();\n    mac->Control(ARM_ETH_MAC_CONFIGURE,\n                 (st.speed << ARM_ETH_MAC_SPEED_Pos) |\n                     (st.duplex << ARM_ETH_MAC_DUPLEX_Pos) |\n                     ARM_ETH_MAC_ADDRESS_BROADCAST);\n    MG_DEBUG((\"Link is %uM %s-duplex\",\n              (st.speed == 2) ? 1000\n              : st.speed      ? 100\n                              : 10,\n              st.duplex ? \"full\" : \"half\"));\n    mac->Control(ARM_ETH_MAC_CONTROL_TX, 1);\n    mac->Control(ARM_ETH_MAC_CONTROL_RX, 1);\n  } else if ((ifp->state != MG_TCPIP_STATE_DOWN) && !up) {  // just went down\n    mac->Control(ARM_ETH_MAC_FLUSH,\n                 ARM_ETH_MAC_FLUSH_TX | ARM_ETH_MAC_FLUSH_RX);\n    mac->Control(ARM_ETH_MAC_CONTROL_TX, 0);\n    mac->Control(ARM_ETH_MAC_CONTROL_RX, 0);\n  }\n  return up;\n}\n\nstatic void mac_cb(uint32_t ev) {\n  if ((ev & ARM_ETH_MAC_EVENT_RX_FRAME) == 0) return;\n  ARM_DRIVER_ETH_MAC *mac = &Driver_ETH_MAC0;\n  uint32_t len = mac->GetRxFrameSize();  // CRC already stripped\n  if (len >= 60 && len <= 1518) {        // proper frame\n    char *p;\n    if (mg_queue_book(&s_ifp->recv_queue, &p, len) >= len) {  // have room\n      if ((len = mac->ReadFrame((uint8_t *) p, len)) > 0) {   // copy succeeds\n        mg_queue_add(&s_ifp->recv_queue, len);\n        s_ifp->nrecv++;\n      }\n      return;\n    }\n    s_ifp->ndrop++;\n  }\n  mac->ReadFrame(NULL, 0);  // otherwise, discard\n}\n\nstatic size_t cmsis_rx(void *buf, size_t buflen, struct mg_tcpip_if *ifp) {\n  ARM_DRIVER_ETH_MAC *mac = &Driver_ETH_MAC0;\n  uint32_t len = mac->GetRxFrameSize();  // CRC already stripped\n  if (len >= 60 && len <= 1518 &&\n      ((len = mac->ReadFrame(buf, (uint32_t) buflen)) > 0))\n    return len;\n  if (len > 0) mac->ReadFrame(NULL, 0);  // discard bad frames\n  (void) ifp;\n  return 0;\n}\n\n#endif\n"
  },
  {
    "path": "src/drivers/cmsis.h",
    "content": "#pragma once\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_CMSIS) && MG_ENABLE_DRIVER_CMSIS\n\n#include \"Driver_ETH_MAC.h\"  // keep this include\n#include \"Driver_ETH_PHY.h\"  // keep this include\n\n#endif\n"
  },
  {
    "path": "src/drivers/cyw.c",
    "content": "#include \"cyw.h\"\n#include \"net.h\"\n\n#if MG_ENABLE_TCPIP &&                                          \\\n    ((defined(MG_ENABLE_DRIVER_CYW) && MG_ENABLE_DRIVER_CYW) || \\\n     (defined(MG_ENABLE_DRIVER_CYW_SDIO) && MG_ENABLE_DRIVER_CYW_SDIO))\n\n#ifndef MG_ENABLE_DRIVER_CYW\n#define MG_ENABLE_DRIVER_CYW 0\n#endif\n#ifndef MG_ENABLE_DRIVER_CYW_SDIO\n#define MG_ENABLE_DRIVER_CYW_SDIO 0\n#endif\n\nstatic struct mg_tcpip_if *s_ifp;\nstatic uint32_t s_ip, s_mask;\nstatic bool s_link, s_auth, s_join;\n\nstatic void wifi_cb(struct mg_tcpip_if *ifp, int ev, void *ev_data) {\n  struct mg_wifi_data *wifi = &((struct mg_tcpip_driver_cyw_data *) ifp->driver_data)->wifi;\n  if (wifi->apmode && ev == MG_TCPIP_EV_ST_CHG && *(uint8_t *) ev_data == MG_TCPIP_STATE_UP) {\n    MG_DEBUG((\"Access Point started\"));\n    s_ip = ifp->ip, ifp->ip = wifi->apip;\n    s_mask = ifp->mask, ifp->mask = wifi->apmask;\n    ifp->enable_dhcp_client = false;\n    ifp->enable_dhcp_server = true;\n  }\n}\n\nstatic bool cyw_init(uint8_t *mac);\nstatic void cyw_poll(void);\n\nstatic bool mg_tcpip_driver_cyw_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_cyw_data *d =\n      (struct mg_tcpip_driver_cyw_data *) ifp->driver_data;\n  struct mg_wifi_data *wifi = &d->wifi;\n  if (MG_BIG_ENDIAN) {\n    MG_ERROR((\"Big-endian host\"));\n    return false;\n  }\n  s_ifp = ifp;\n  s_ip = ifp->ip;\n  s_mask = ifp->mask;\n  s_link = s_auth = s_join = false;\n  ifp->pfn = wifi_cb;\n  if (!cyw_init(ifp->mac)) return false;\n\n  if (wifi->apmode) {\n    return mg_wifi_ap_start(wifi);\n  } else if (wifi->ssid != NULL && wifi->pass != NULL) {\n    return mg_wifi_connect(wifi);\n  }\n  return true;\n}\n\nstatic size_t mg_cyw_tx(unsigned int ifc, void *data, size_t len);\nsize_t mg_tcpip_driver_cyw_output(const void *buf, size_t len,\n                                  struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_cyw_data *d =\n      (struct mg_tcpip_driver_cyw_data *) ifp->driver_data;\n  return mg_cyw_tx(d->wifi.apmode ? 1 : 0, (void *) buf, len) >= len ? len : 0;\n}\n\nstatic bool mg_tcpip_driver_cyw_poll(struct mg_tcpip_if *ifp, bool s1) {\n  cyw_poll();\n  if (!s1) return false;\n  struct mg_tcpip_driver_cyw_data *d =\n      (struct mg_tcpip_driver_cyw_data *) ifp->driver_data;\n  return d->wifi.apmode ? s_link : s_link && s_auth && s_join;\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_cyw = {mg_tcpip_driver_cyw_init,\n                                              mg_tcpip_driver_cyw_output, NULL,\n                                              mg_tcpip_driver_cyw_poll};\n\n// - DS:\n// https://www.mouser.com/datasheet/2/196/Infineon_CYW43439_DataSheet_v03_00_EN-3074791.pdf\n// - WHD: https://github.com/Infineon/wifi-host-driver\n//\n//              |  e   <-- event data\n//              |-----\n//          net | vnd   <-- network (TCP/IP) | vendor header (Broadcom (bcm))\n//         -----|-----\n//  IOCTL | ETH | ETH  <-- IOCTL/IOVAR: chip control | ETH: Ethernet header\n// -------|-----|-----\n//   CDC  | BDC | BDC\n// ------- ----- -----\n//        SDPCM        <-- includes SDIO bus arbitration, not used in SPI\n// -------------------\n//    SPI   |  SDIO    <-- padded to 32-bit | 64-bytes\n//\n// - SDPCM has 3 channels (control, data, and asynchronous data)\n// - SPI has 4 \"functions\", F0 to F3, to access different blocks in the chip,\n// like the SPI/SDIO controller, chip backplane, and 2 DMA I/Os; these are\n// usually handled by SDPCM but we need to explicitly access the I/O controller\n// and chip backplane during initialization\n// - SDIO has 3 functions (proper SDIO terminology), F0 to F2, coincident with\n// those for SPI, accessed through standard SDIO practices. There is no F3.\n\n// Processor core firmware is loaded to TCM RAM, along with module-dependent\n// (hardware design) NVRAM data, via the chip backplane access through the bus\n// Once the chip has been initialized, information regarding regulatory\n// constraints (CLM blob, “Country Locale Matrix”), is loaded as an IOVAR. This\n// is tied to the module being certified, hence it is also module-dependent.\n// - Result: chip firmware + module NVRAM data + module CLM blob\n\n#pragma pack(push, 1)\n// all little endian\n\nstruct cdc_hdr {\n  uint32_t cmd;   // ioctl command value\n  uint16_t olen;  // output buflen\n  uint16_t ilen;  // input buflen (excludes header)\n  uint32_t flags;\n  uint32_t status;\n};\n\nstruct bdc_hdr {\n  uint8_t flags;     // Flags\n  uint8_t priority;  // 802.1d Priority (low 3 bits)\n  uint8_t flags2;\n  uint8_t data_offset;  // Offset from end of BDC header to packet data, in\n                        // 4-uint8_t words. Leaves room for optional headers.\n};\n\nstruct sdpcm_sw_hdr {\n  uint8_t sequence;           // Sequence number of pkt\n  uint8_t channel_and_flags;  // IOCTL/IOVAR or User Data or Event\n  uint8_t next_length;\n  uint8_t header_length;  // Offset to BDC or CDC header\n  uint8_t wireless_flow_control;\n  uint8_t bus_data_credit;  // Credit from WLAN Chip\n  uint8_t _reserved[2];\n};\n\nstruct sdpcm_hdr {\n  uint16_t len;\n  uint16_t _len;  // ~len\n  struct sdpcm_sw_hdr sw_hdr;\n};\n\nstruct data_hdr {\n  struct sdpcm_hdr sdpcm;\n  uint8_t pad[2];\n  struct bdc_hdr bdc;\n};\n\n// gSPI, CYW43439 DS 4.2.1 Fig.12, 2-bit field\n#define CYW_SPID_FUNC_BUS 0   // F0\n#define CYW_SPID_FUNC_CHIP 1  // F1\n#define CYW_SPID_FUNC_WLAN 2  // F2\n\n// SDIO functions, 3-bit field; CYW4343W and CYW43439 DS 4.1\n#define CYW_SDIO_FUNC_BUS 0   // F0\n#define CYW_SDIO_FUNC_CHIP 1  // F1\n#define CYW_SDIO_FUNC_WLAN 2  // F2\n\n#define CYW_SDPCM_CTRL_HDR 0\n#define CYW_SDPCM_ASYNC_HDR 1\n#define CYW_SDPCM_DATA_HDR 2\n\n#pragma pack(pop)\n\nstatic uint8_t s_tx_seqno;\nstatic uint32_t txdata[2048 / 4], resp[2048 / 4];\n\nstatic void cyw_handle_cdc(struct cdc_hdr *cdc, size_t len);\nstatic void cyw_handle_bdc(struct bdc_hdr *bdc, size_t len);\nstatic void cyw_handle_bdc_evnt(struct bdc_hdr *bdc, size_t len);\n\nstatic size_t cyw_bus_specific_poll(uint32_t *dest);\nstatic void cyw_update_hash_table(void);\n\n// High-level comm stuff\n\nstatic void cyw_poll(void) {\n  struct sdpcm_hdr *sdpcm = (struct sdpcm_hdr *) resp;\n  unsigned int channel;\n  if (s_ifp->update_mac_hash_table) {\n    // first call to _poll() is after _init(), so this is safe\n    cyw_update_hash_table();\n    s_ifp->update_mac_hash_table = false;\n  }\n  if (cyw_bus_specific_poll(resp) == 0) return;\n  if ((sdpcm->len ^ sdpcm->_len) != 0xffff || sdpcm->len < sizeof(*sdpcm) ||\n      sdpcm->len > 2048 - sizeof(*sdpcm))\n    return;\n  channel = sdpcm->sw_hdr.channel_and_flags & 0x0F;\n  if (channel == CYW_SDPCM_CTRL_HDR) {\n    if (sdpcm->len >= sizeof(*sdpcm) + sizeof(struct cdc_hdr)) {\n      struct cdc_hdr *cdc =\n          (struct cdc_hdr *) ((size_t) sdpcm + sdpcm->sw_hdr.header_length);\n      size_t len = sdpcm->len - sdpcm->sw_hdr.header_length;\n      cyw_handle_cdc(cdc, len);\n    }\n  } else if (channel == CYW_SDPCM_DATA_HDR) {\n    if (sdpcm->len >= sizeof(*sdpcm) + sizeof(struct bdc_hdr)) {\n      struct bdc_hdr *bdc =\n          (struct bdc_hdr *) ((size_t) sdpcm + sdpcm->sw_hdr.header_length);\n      size_t len = sdpcm->len - sdpcm->sw_hdr.header_length;\n      cyw_handle_bdc(bdc, len);\n    }\n  } else if (channel == CYW_SDPCM_ASYNC_HDR) {\n    struct bdc_hdr *bdc =\n        (struct bdc_hdr *) ((size_t) sdpcm + sdpcm->sw_hdr.header_length);\n    size_t len_ = sdpcm->len - sdpcm->sw_hdr.header_length;\n    cyw_handle_bdc_evnt(bdc, len_);\n  }  // else silently discard\n}\n\n// WLAN frame reception\nstatic void cyw_handle_bdc(struct bdc_hdr *bdc, size_t len) {\n  uint8_t *payload = (uint8_t *) &bdc[bdc->data_offset + 1];\n  mg_tcpip_qwrite(payload, len - (payload - (uint8_t *) bdc), s_ifp);\n}\n\nstatic size_t cyw_bus_specific_tx(uint32_t *data, uint16_t len);\n\n// WLAN frame transmission\nstatic size_t mg_cyw_tx(unsigned int ifc, void *data, size_t len) {\n  struct data_hdr *hdr = (struct data_hdr *) txdata;\n  uint16_t txlen = (uint16_t) (len + sizeof(*hdr));\n  memset(txdata, 0, sizeof(*hdr));\n  memcpy((uint8_t *) txdata + sizeof(*hdr), data, len);\n  // TODO(): hdr->bdc.priority = map IP to TOS if supporting QoS/ToS\n  hdr->bdc.flags = 2 << 4;          // BDC version 2\n  hdr->bdc.flags2 = (uint8_t) ifc;  // 0 -> STA, 1 -> AP\n  // hdr->bdc.data_offset = 0; // actually zeroed above\n  hdr->sdpcm.len = txlen;\n  hdr->sdpcm._len = (uint16_t) ~txlen;\n  hdr->sdpcm.sw_hdr.sequence = ++s_tx_seqno;\n  hdr->sdpcm.sw_hdr.channel_and_flags = CYW_SDPCM_DATA_HDR,\n  hdr->sdpcm.sw_hdr.header_length = offsetof(struct data_hdr, bdc);\n  return cyw_bus_specific_tx(txdata, txlen);\n}\n\n// WLAN event handling\n#pragma pack(push, 1)\n// all in network order\n\nstruct eth_hdr {  // TODO(scaprile) reuse 'eth' in net_builtin.c\n  uint8_t dest[6];\n  uint8_t src[6];\n  uint16_t type;\n};\n\nstruct bcm_vendor_hdr {\n  uint16_t subtype;  // vendor specific: 0x8001\n  uint16_t length;   // bytes following this field\n  uint8_t version;   // 0\n  uint8_t oui[3];    // vendor specific: 0x00 0x10 0x18\n  uint16_t usr_subtype;\n};\n\nstruct bcm_evnt_hdr {\n  uint16_t version;  // 1: fields up to ifname; 2: as shown\n  uint16_t flags;\n  uint32_t event_type;\n  uint32_t status;\n  uint32_t reason;\n  uint32_t auth_type;\n  uint32_t datalen;\n  uint8_t addr[6];  // Station address (if applicable)\n  char ifname[16];\n  uint8_t ifidx;\n  uint8_t bss_cfg_idx;\n};\n\nstruct evnt_msg {\n  struct eth_hdr eth;\n  //  struct vendor_hdr; but we only handle Broadcom (Wi-Fi processor) events\n  struct bcm_vendor_hdr bcm;\n  struct bcm_evnt_hdr event;\n};\n\n#pragma pack(pop)\n\nstruct scan_result;\nstatic void cyw_handle_scan_result(uint32_t status, struct scan_result *data,\n                                   size_t len);\n\n// Do not call any IOCTL functions here, otherwise revise cyw_ioctl_wait()\nstatic void cyw_handle_bdc_evnt(struct bdc_hdr *bdc, size_t len) {\n  struct evnt_msg *msg = (struct evnt_msg *) &bdc[bdc->data_offset + 1];\n  MG_VERBOSE((\"%u bytes event\", len));\n  if (mg_log_level >= MG_LL_VERBOSE) mg_hexdump((void *) bdc, len);\n  if (mg_ntohs(msg->eth.type) != 0x886C || msg->bcm.oui[0] != 0x00 ||\n      msg->bcm.oui[1] != 0x10 || msg->bcm.oui[2] != 0x18)\n    return;  // discard if not Broadcom\n  if (mg_ntohl(msg->event.datalen) <=\n      len - ((uint8_t *) msg - (uint8_t *) bdc)) {\n    uint32_t event_type = mg_ntohl(msg->event.event_type);\n    uint32_t status = mg_ntohl(msg->event.status);\n    uint32_t reason = mg_ntohl(msg->event.reason);\n    uint16_t flags = mg_ntohs(msg->event.flags);\n    MG_VERBOSE((\"BCM evt %lu %lu %lu %p\", event_type, status, reason, flags));\n    if (event_type == 16 && status == 0) {  // Link\n      s_link = flags & 1;\n    } else if (event_type == 46 && s_link) {  // PSK sup with link up\n      if (status == 6) {                      // Keyed\n      } else if ((status == 4 || status == 8 || status == 10) &&\n                 reason == 15) {  // Wait M1/M3/G1\n        MG_ERROR((\"AUTH TIMEOUT\"));\n        s_auth = false;\n      } else {\n        MG_ERROR((\"AUTH FAILED\"));\n        s_auth = false;\n      }\n    } else if (event_type == 3 && status != 6) {  // Auth (not unsolicited)\n      if (status == 0) {                          // Success\n        s_auth = true;\n      } else {\n        MG_ERROR((\"AUTH TIMEOUT\"));\n        s_auth = false;\n      }\n    } else if (event_type == 1) {  // Join\n      if (status == 0) {           // Success\n        s_join = true;\n      } else {\n        MG_ERROR((\"%s\", status == 3 /* No networks */ ? \"SSID NOT FOUND\"\n                                                      : \"JOIN FAILED\"));\n        s_join = false;\n        mg_tcpip_call(s_ifp, MG_TCPIP_EV_WIFI_CONNECT_ERR, &status);\n      }\n    } else if (event_type == 12 || event_type == 5) {  // Disassoc, Deauth\n      s_auth = false;\n    } else if (event_type == 69) {  // Scan result\n      struct scan_result *data = (struct scan_result *) (&msg->event + 1);\n      size_t dlen = mg_ntohl(msg->event.datalen);\n      if (dlen > len - ((uint8_t *) data - (uint8_t *) bdc)) return;\n      cyw_handle_scan_result(status, data, dlen);\n    }\n  }  // else silently discard\n}\n\nstatic bool cyw_ioctl_get_(unsigned int ifc, unsigned int cmd, void *data,\n                           size_t len);\nstatic bool cyw_ioctl_set_(unsigned int ifc, unsigned int cmd, void *data,\n                           size_t len);\nstatic bool cyw_ioctl_iovar_get_(unsigned int ifc, char *var, void *data,\n                                 size_t len);\nstatic bool cyw_ioctl_iovar_set_(unsigned int ifc, char *var, void *data,\n                                 size_t len);\n// clang-format off\n// convenience: ioctl funcs on default ifc (0), as only AP needs ifc 1\n__attribute__((unused)) static bool cyw_ioctl_get(unsigned int cmd, void *data, size_t len) { return cyw_ioctl_get_(0, cmd, data, len); }\nstatic bool cyw_ioctl_set(unsigned int cmd, void *data, size_t len) { return cyw_ioctl_set_(0, cmd, data, len); }\nstatic bool cyw_ioctl_iovar_get(char *var, void *data, size_t len) { return cyw_ioctl_iovar_get_(0, var, data, len); }\nstatic bool cyw_ioctl_iovar_set(char *var, void *data, size_t len) { return cyw_ioctl_iovar_set_(0, var, data, len); }\n// clang-format on\n\n// Wi-Fi network stuff\n\n// clang-format off\nstatic bool cyw_wifi_connect(char *ssid, char *pass) {\n  uint32_t sup_wpa[2] = {0, 1}; // bss index 0 = STA, not open\n  static const uint32_t eapver[2] = {0, (uint32_t) -1}, // accept AP version\n                              tmo[2] = {0, 2500};\n  uint32_t data[64/4 + 1]; // max pass length: 64 for WPA, 128 for WPA3 SAE\n  uint16_t *da = (uint16_t *) data;\n  unsigned int len;\n  uint32_t val;\n  val = 4; // security type: 0 for none, 2 for WPA, 4 for WPA2/WPA3, 6 for mixed WPA/WPA2\n  // sup_wpa[1] = 0 if not using security\n  if (!(cyw_ioctl_set(134 /* SET_WSEC */, (uint8_t *)&val, sizeof(val))\n        && cyw_ioctl_iovar_set(\"bsscfg:sup_wpa\", (void *)sup_wpa, sizeof(sup_wpa))\n        && cyw_ioctl_iovar_set(\"bsscfg:sup_wpa2_eapver\", (void *)eapver, sizeof(eapver))\n        && cyw_ioctl_iovar_set(\"bsscfg:sup_wpa_tmo\", (void *)tmo, sizeof(tmo)))\n     ) return false;\n  mg_delayms(2); // allow radio firmware to be ready\n  // skip if not using auth\n  memset(data, 0, sizeof(data));\n  len = strlen(pass);\n  da[0] = (uint16_t) len;\n  da[1] = 1; // indicates wireless security key, skip for WPA3 SAE\n  memcpy((uint8_t *)data + 2 * sizeof(uint16_t), pass, len); // skip for WPA3 SAE\n  if (!cyw_ioctl_set(268 /* SET_WSEC_PMK */, data, sizeof(data))) return false; // skip for WPA3 SAE, sizeof/2 if supporting SAE but using WPA\n  // for WPA3 SAE: memcpy((uint8_t *)data + sizeof(uint16_t), pass, len); cyw_ioctl_iovar_set(\"sae_password\", data, sizeof(data));\n  // resume if not using auth\n  val = 1; if (!cyw_ioctl_set(20 /* SET_INFRA */, (uint8_t *)&val, sizeof(val))) return false;\n  val = 0; // auth type: 0 for open, 3 for SAE\n  if (!cyw_ioctl_set(22 /* SET_AUTH */, (uint8_t *)&val, sizeof(val))) return false;\n  val = 1; // MFP capable: 1 for yes, 0 for no; recommended to be set for WPA2+ (2 for 'required', WPA3)\n  cyw_ioctl_iovar_set(\"mfp\", (uint8_t *)&val, sizeof(val)); // Old chipsets do not support MFP\n  val = 0x80; // auth type: 0 for none, 4 for WPA PSK, 0x80 for WPA2 PSK, 0x40000 for WPA3 SAE PSK\n  if (!cyw_ioctl_set(165 /* SET_WPA_AUTH */, (uint8_t *)&val, sizeof(val))) return false;\n  len = strlen(ssid);\n  data[0] = (uint32_t) len;\n  memcpy((uint8_t *)&data[1], ssid, len);\n  if (!cyw_ioctl_set(26 /* SET_SSID */, data, len + sizeof(uint32_t))) return false;\n  return true;\n}\n\nstatic bool cyw_wifi_disconnect(void) {\n  return cyw_ioctl_set(52 /* DISASSOC */, NULL, 0);\n}\n\n// For AP functions, we use explicit ifc selection; both for clarity and maintenance, as some actions are performed on ifc 0, with or without a bss_index, and others are performed on ifc 1\n\nstatic bool cyw_wifi_ap_start(char *ssid, char *pass, unsigned int channel) {\n  uint32_t data[64/4 + 2]; // max pass length: 64 for WPA, 128 for WPA3 SAE\n  uint16_t *da = (uint16_t *) data;\n  unsigned int len;\n  uint32_t val;\n  // CHIP DEPENDENCY\n  // RPi set the AMPDU parameter for AP (window size = 2) *****************\n  // val = 2 ; cyw_ioctl_iovar_set_(0, \"ampdu_ba_wsize\", (uint8_t *)&val, sizeof(val));\n  // some chips might require to turn APSTA off and issue a SET_AP IOCTL\n  len = strlen(ssid);\n  data[0] = 1; // bss index 1 = AP\n  data[1] = (uint32_t) len;\n  memcpy((uint8_t *)&data[2], ssid, len);\n  // TODO(scaprile): this takes some time to process, or requires a delay before doing it\n  if (!cyw_ioctl_iovar_set_(0, \"bsscfg:ssid\", (uint8_t *)&data, len + 2 * sizeof(uint32_t))) return false;\n  // TODO(scaprile): but sometimes this one takes some time to process\n  val = (uint32_t) channel; if (!cyw_ioctl_set_(0, 30 /* SET_CHANNEL */, (uint8_t *)&val, sizeof(val))) return false;\n  data[0] = 1; // bss index 1 = AP\n  data[1] = 0x00400004; // security type: 0 for none, 0x00200002 for WPA, 0x00400004 for WPA2, 0x01000004 for WPA3, 0x01400004 for mixed WPA2/WPA3, 0x00400006 for mixed WPA/WPA2\n  // NOTE(): WHD writes & 0xFF if WPS is not enabled (?)\n  if (!cyw_ioctl_iovar_set_(0, \"bsscfg:wsec\", (uint8_t *)&data, 2 * sizeof(uint32_t))) return false;\n  val = 1; // MFP capable: 1 for yes, 0 for no; recommended to be set for WPA2+ (2 for 'required', WPA3)\n  cyw_ioctl_iovar_set_(1, \"mfp\", (uint8_t *)&val, sizeof(val)); // Old chipsets do not support MFP\n  mg_delayms(2); // allow radio firmware to be ready\n  // skip if not using auth\n  // WPA, WPA2, mixed WPA/WPA2, mixed WPA2/WPA3\n  // NOTE(): WHD does not set SAE password for shared WPA2/WPA3, same do we\n  memset(data, 0, sizeof(data));\n  len = strlen(pass);\n  da[0] = (uint16_t) len; // skip for WPA3 SAE (43430 does NOT support WPA3 in AP)\n  da[1] = 1; // indicates wireless security key, skip for WPA3 SAE\n  memcpy((uint8_t *)data + 2 * sizeof(uint16_t), pass, len); // skip for WPA3 SAE\n  if (!cyw_ioctl_set_(1, 268 /* SET_WSEC_PMK */, data, sizeof(data))) return false; // skip for WPA3 SAE, sizeof/2 if supporting SAE but using WPA\n  /* for WPA3 SAE:\n    memcpy((uint8_t *)data + sizeof(uint16_t), pass, len);\n    cyw_ioctl_iovar_set_(1, \"sae_password\", data, sizeof(data)); */\n  /* for WPA3 or mixed WPA2/WPA3:\n    val = 5 ; cyw_ioctl_iovar_set_(1, \"sae_max_pwe_loop\", (uint8_t *)&val, sizeof(val));  // Some chipsets do not support this */\n  // resume if not using auth\n\n  data[0] = 1; // bss index 1 = AP\n  data[1] = 0x80; // auth type: 0 for none, 4 for WPA PSK, 0x80 for WPA2 PSK, 0x40000 for WPA3 SAE PSK; ored if mixed\n  if (!cyw_ioctl_iovar_set_(0, \"bsscfg:wpa_auth\", (uint8_t *)&data, 2 * sizeof(uint32_t))) return false;\n\n  val = 1 /* auto */; if (!cyw_ioctl_set_(1, 110 /* SET_GMODE */, (uint8_t *)&val, sizeof(val))) return false;\n  // Set multicast tx rate to 11Mbps, may fail in some chipsets, we are enforcing it\n  val = 11000000 / 500000; if (!cyw_ioctl_iovar_set_(1, \"2g_mrate\", (uint8_t *)&val, sizeof(val))) return false;\n  val = 1; if (!cyw_ioctl_set_(1, 78 /* SET_DTIMPRD */, (uint8_t *)&val, sizeof(val))) return false;\n  data[0] = 1; // bss index 1 = AP\n  data[1] = 1; // UP\n  // TODO(scaprile): this takes a long time to process\n  if (!cyw_ioctl_iovar_set_(0, \"bss\", (uint8_t *)&data, 2 * sizeof(uint32_t))) return false;\n  return true;\n}\n\nstatic bool cyw_wifi_ap_stop(void) {\n  uint32_t data[2];\n  data[0] = 1; // bss index 1 = AP\n  data[1] = 0; // DOWN\n  if (!cyw_ioctl_iovar_set_(0, \"bss\", (uint8_t *)&data, 2 * sizeof(uint32_t))) return false;\n  // DO WE NEED TO CLEAR CHANNEL ???\n  // CHIP DEPENDENCY\n  //val = 8 ; cyw_ioctl_iovar_set_(0, \"ampdu_ba_wsize\", (uint8_t *)&val, sizeof(val));\n  return true;\n}\n\n// WLAN scan handling\n\n#pragma pack(push, 1)\n// in little endian\n\nstruct wifi_scan_opt {\n    uint32_t version;\n    uint16_t action;\n    uint16_t _;\n    uint32_t ssid_len;\n    uint8_t ssid[32];\n    uint8_t bssid[6];\n    int8_t bss_type;\n    int8_t scan_type;\n    int32_t nprobes;\n    int32_t active_time;\n    int32_t passive_time;\n    int32_t home_time;\n    int32_t channel_num;\n    uint16_t channel_list[1];\n};\n#pragma pack(pop)\n\nstatic bool cyw_wifi_scan(void) {\n  struct wifi_scan_opt opts;\n  memset(&opts, 0, sizeof(opts));\n  opts.version = 1;\n  opts.action = 1; // start\n  opts._ = 0;\n  memset(opts.bssid, 0xff, sizeof(opts.bssid));\n  opts.bss_type = 2; // any\n  opts.nprobes = -1;\n  opts.active_time = -1;\n  opts.passive_time = -1;\n  opts.home_time = -1;\n  opts.channel_num = 0;\n  opts.channel_list[0] = 0;\n  return cyw_ioctl_iovar_set(\"escan\", (uint8_t *)&opts, sizeof(opts));\n}\n\n\n#pragma pack(push, 1)\n// in little endian\n\nstruct scan_bss {\n    uint32_t version;              // version field\n    uint32_t length;               // byte length of data in this record, starting at version and including IEs\n    uint8_t BSSID[6];              // Unique 6-byte MAC address\n    uint16_t beacon_period;        // Interval between two consecutive beacon frames. Units are Kusec\n    uint16_t capability;           // Capability information\n    uint8_t SSID_len;              // SSID length\n    uint8_t SSID[32];              // Array to store SSID\n    uint8_t reserved1[1];          // Reserved(padding)\n    uint32_t rateset_count;        // Count of rates in this set\n    uint8_t rateset_rates[16];     // rates in 500kbps units, higher bit set if basic\n    uint16_t chanspec;             // Channel specification for basic service set\n    uint16_t atim_window;          // Announcement traffic indication message window size. Units are Kusec\n    uint8_t dtim_period;           // Delivery traffic indication message period\n    uint8_t reserved2[1];          // Reserved(padding)\n    int16_t RSSI;                  // receive signal strength (in dBm)\n    int8_t phy_noise;              // noise (in dBm)\n    uint8_t n_cap;                 // BSS is 802.11n Capable\n    uint8_t reserved3[2];          // Reserved(padding)\n    uint32_t nbss_cap;             // 802.11n BSS Capabilities (based on HT_CAP_*)\n    uint8_t ctl_ch;                // 802.11n BSS control channel number\n    uint8_t reserved4[3];          // Reserved(padding)\n    uint32_t reserved32[1];        // Reserved for expansion of BSS properties\n    uint8_t flags;                 // flags\n    uint8_t vht_cap;               // BSS is vht capable\n    uint8_t reserved5[2];          // Reserved(padding)\n    uint8_t basic_mcs[16];         // 802.11N BSS required MCS set\n    uint16_t ie_offset;            // offset at which IEs start, from beginning\n    uint16_t reserved16[1];        // Reserved(padding)\n    uint32_t ie_length;            // byte length of Information Elements\n    int16_t SNR;                   // Average SNR during frame reception\n};\n\nstruct scan_result {\n    uint32_t buflen;\n    uint32_t version;\n    uint16_t sync_id;\n    uint16_t bss_count;\n    struct scan_bss bss[1];\n};\n\n#pragma pack(pop)\n\n// CHIP DEPENDENCY\n#define CYW_BSS_BANDMASK 0xc000\n#define CYW_BSS_BAND2G 0\n//\n\nstatic void cyw_handle_scan_result(uint32_t status, struct scan_result *data, size_t len) {\n  MG_VERBOSE((\"scan event, status: %ld\", status));\n  if (status == 0) { // SUCCESS\n    MG_VERBOSE((\"scan complete\"));\n    mg_tcpip_call(s_ifp, MG_TCPIP_EV_WIFI_SCAN_END, NULL);\n  } else if (status == 8) { // PARTIAL\n    struct mg_wifi_scan_bss_data bss;\n    struct scan_bss *sbss = data->bss;\n    unsigned int band = sbss->chanspec & CYW_BSS_BANDMASK;\n    if (data->version != 109 || data->bss_count != 1) {\n      MG_ERROR((\"Unsupported: %lu %u\", data->version, data->bss_count));\n      return;\n    }\n    if (sbss->length > len - offsetof(struct scan_result, bss) || sbss->SSID_len > sizeof(sbss->SSID) || sbss->ie_offset < sizeof(*sbss) || sbss->ie_offset > (sizeof(*sbss) + sbss->ie_length) || sbss->ie_offset + sbss->ie_length > sbss->length)\n      return; // silently discard malformed data\n    if (!(sbss->flags & MG_BIT(2))) return; // RSSI_ONCHANNEL, ignore off-channel results\n    bss.SSID = mg_str_n((char *)sbss->SSID, sbss->SSID_len);\n    bss.BSSID = (char *)sbss->BSSID;\n    bss.RSSI = (int8_t)sbss->RSSI;\n    bss.has_n = sbss->n_cap != 0;\n    bss.channel = bss.has_n ? sbss->ctl_ch : (uint8_t)(sbss->chanspec & 0xff); // n 40MHz vs a/b/g and 20MHz\n    bss.band = band & CYW_BSS_BAND2G ? MG_WIFI_BAND_2G : MG_WIFI_BAND_5G;\n    bss.security = (sbss->capability & MG_BIT(4) /* CAP_PRIVACY */) ? MG_WIFI_SECURITY_WEP : MG_WIFI_SECURITY_OPEN;\n    { // travel IEs (Information Elements) in search of security definitions\n      const uint8_t wot1[4] = {0x00, 0x50, 0xf2, 0x01}; // WPA_OUI_TYPE1\n      uint8_t *ie = (uint8_t *)sbss + sbss->ie_offset;\n      int bytes = (int) sbss->ie_length;\n      while (bytes > 0 && ie[1] + 2 < bytes) { // ie[0] -> type, ie[1] -> bytes from ie[2]\n        if (ie[0] == 48 /* IE_ID_RSN */) bss.security |= MG_WIFI_SECURITY_WPA2;\n        if (ie[0] == 221 /* IE_ID_VENDOR_SPECIFIC */ && memcmp(&ie[2], wot1, 4) == 0)\n          bss.security |= MG_WIFI_SECURITY_WPA;\n        ie += ie[1] + 2;\n        bytes -= ie[1] + 2;\n      }\n    }\n    MG_VERBOSE((\"BSS: %.*s (%u) (%M) %d dBm %u\", bss.SSID.len, bss.SSID.buf, bss.channel, mg_print_mac, bss.BSSID, (int) bss.RSSI, bss.security));\n    mg_tcpip_call(s_ifp, MG_TCPIP_EV_WIFI_SCAN_RESULT, &bss);\n  } else {\n    MG_ERROR((\"scan error\"));\n  }\n}\n// clang-format on\n\n// IOCTL stuff. All values read and written are in little endian format\n\nstatic uint16_t s_ioctl_reqid;\n\n// CDC handler for waiting loop\nstatic uint8_t *s_ioctl_resp;\nstatic bool s_ioctl_err;\n\nstatic void cyw_handle_cdc(struct cdc_hdr *cdc, size_t len) {\n  uint8_t *r = (uint8_t *) cdc + sizeof(*cdc);\n  MG_VERBOSE((\"%u bytes CDC frame\", len));\n  if ((cdc->flags >> 16) != s_ioctl_reqid) return;\n  if (cdc->flags & 1) {\n    MG_ERROR((\"IOCTL error: %ld\", -cdc->status));\n    s_ioctl_err = true;\n    return;\n  }\n  if (mg_log_level >= MG_LL_VERBOSE) mg_hexdump((void *) cdc, len);\n  MG_VERBOSE((\"IOCTL result: %02x %02x %02x %02x ..\", r[0], r[1], r[2], r[3]));\n  s_ioctl_resp = r;\n}\n// NOTE(): alt no loop handler dispatching IOCTL response to current handler:\n// static void *s_ioctl_hnd; *s_ioctl_hnd(ioctl, len);\n// app is a state machine calling get/sets and advancing via these callbacks\n\n#pragma pack(push, 1)\n// all little endian\n\nstruct ctrl_hdr {\n  struct sdpcm_hdr sdpcm;\n  struct cdc_hdr cdc;\n};\n\n#pragma pack(pop)\n\n// IOCTL command send\nstatic void cyw_ioctl_send_cmd(unsigned int ifc, unsigned int cmd, bool set,\n                               size_t len) {\n  struct ctrl_hdr *hdr = (struct ctrl_hdr *) txdata;\n  uint16_t txlen = (uint16_t) (len + sizeof(*hdr));\n  memset(txdata, 0, sizeof(*hdr));\n  hdr->cdc.cmd = cmd;\n  hdr->cdc.olen = (uint16_t) len;\n  // hdr->cdc.ilen = 0; // actually zeroed above\n  hdr->cdc.flags = ((uint32_t) ++s_ioctl_reqid << 16) | ((ifc & 0xf) << 12) |\n                   (set ? MG_BIT(1) : 0);\n  hdr->sdpcm.len = txlen;\n  hdr->sdpcm._len = (uint16_t) ~txlen;\n  hdr->sdpcm.sw_hdr.sequence = ++s_tx_seqno;\n  hdr->sdpcm.sw_hdr.channel_and_flags = CYW_SDPCM_CTRL_HDR;\n  hdr->sdpcm.sw_hdr.header_length = offsetof(struct ctrl_hdr, cdc);\n  cyw_bus_specific_tx(txdata, txlen);\n}\n\n// just send respective commands, response handled via CDC handler\nstatic void cyw_ioctl_send_get(unsigned int ifc, unsigned int cmd) {\n  cyw_ioctl_send_cmd(ifc, cmd, false, 0);\n}\n\nstatic void cyw_ioctl_send_set(unsigned int ifc, unsigned int cmd, void *data,\n                               size_t len) {\n  if (data != NULL && len > 0)\n    memcpy((uint8_t *) txdata + sizeof(struct ctrl_hdr), data, len);\n  cyw_ioctl_send_cmd(ifc, cmd, true, (uint16_t) len);\n}\n\nstatic void cyw_ioctl_send_iovar_get(unsigned int ifc, char *var, size_t len) {\n  unsigned int namelen = strlen(var) + 1;  // include '\\0'\n  // cmd = GET IOVAR, \"set\" the name...\n  cyw_ioctl_send_set(ifc, 262, var, len > namelen ? len : namelen);\n}\n\nstatic void cyw_ioctl_send_iovar_set2(unsigned int ifc, char *var, void *data1,\n                                      size_t len1, void *data2, size_t len2) {\n  struct ctrl_hdr *hdr = (struct ctrl_hdr *) txdata;\n  unsigned int namelen = strlen(var) + 1;  // include '\\0'\n  uint16_t txlen, payload_len = (uint16_t) (namelen + len1 + len2);\n  memcpy((uint8_t *) txdata + sizeof(*hdr), var, namelen);\n  memcpy((uint8_t *) txdata + namelen + sizeof(*hdr), data1, len1);\n  if (data2 != NULL)\n    memcpy((uint8_t *) txdata + namelen + sizeof(*hdr) + len1, data2, len2);\n  txlen = (uint16_t) (payload_len + sizeof(*hdr));\n  cyw_ioctl_send_cmd(ifc, 263, true, txlen);  // cmd = SET IOVAR\n}\n\n__attribute__((unused)) static void cyw_ioctl_send_iovar_set(unsigned int ifc,\n                                                             char *var,\n                                                             void *data,\n                                                             size_t len) {\n  cyw_ioctl_send_iovar_set2(ifc, var, data, len, NULL, 0);\n}\n\nstatic inline bool delayms(unsigned int ms) {\n  mg_delayms(ms);\n  return true;\n}\n\n// wait for a response, meanwhile delivering received frames and events\nstatic bool cyw_ioctl_wait(void) {\n  unsigned int times = 100;\n  s_ioctl_resp = NULL;\n  s_ioctl_err = false;\n  do {  // IOCTL response processing does not call any other IOCTL function\n    cyw_poll();  // otherwise we can't allow them to pile up here\n    // network frames will be pushed to the queue so that is safe\n  } while (s_ioctl_resp == NULL && !s_ioctl_err && times-- > 0 && delayms(1));\n  MG_VERBOSE((\"resp: %lp, err: %c, times: %d\", s_ioctl_resp,\n              s_ioctl_err ? '1' : '0', (int) times));\n  return s_ioctl_resp != NULL;\n}\n\nstatic bool cyw_ioctl_waitdata(void *data, size_t len) {\n  if (!cyw_ioctl_wait()) return false;\n  memcpy(data, s_ioctl_resp, len);\n  return true;\n}\n\n// send respective commands, wait for a response or timeout\nstatic bool cyw_ioctl_get_(unsigned int ifc, unsigned int cmd, void *data,\n                           size_t len) {\n  cyw_ioctl_send_get(ifc, cmd);\n  return cyw_ioctl_waitdata(data, len);\n}\nstatic bool cyw_ioctl_set_(unsigned int ifc, unsigned int cmd, void *data,\n                           size_t len) {\n  cyw_ioctl_send_set(ifc, cmd, data, len);\n  return cyw_ioctl_wait();\n}\n\nstatic bool cyw_ioctl_iovar_get_(unsigned int ifc, char *var, void *data,\n                                 size_t len) {\n  cyw_ioctl_send_iovar_get(ifc, var, len);\n  return cyw_ioctl_waitdata(data, len);\n}\nstatic bool cyw_ioctl_iovar_set2_(unsigned int ifc, char *var, void *data1,\n                                  size_t len1, void *data2, size_t len2) {\n  cyw_ioctl_send_iovar_set2(ifc, var, data1, len1, data2, len2);\n  return cyw_ioctl_wait();\n}\nstatic bool cyw_ioctl_iovar_set_(unsigned int ifc, char *var, void *data,\n                                 size_t len) {\n  return cyw_ioctl_iovar_set2_(ifc, var, data, len, NULL, 0);\n}\n\n// CYW43 chipset specifics. All values read and written are in little endian\n// format\n\n#pragma pack(push, 1)\n// all little endian\n\nstruct cyw_country {\n  uint32_t a;\n  int32_t rev;\n  uint32_t c;\n};\n\nstruct clm_hdr {\n  uint16_t flag;\n  uint16_t type;\n  uint32_t len;\n  uint32_t crc;\n};\n\n#pragma pack(pop)\n\n// worlwide rev0, TODO(): try rev 17 for 4343W\nstatic const uint32_t country_code = 'X' + ('X' << 8) + (0 << 16);\n\nstatic bool cyw_bus_specific_init();\nstatic bool cyw_load_clmll(void *data, size_t len);\n\nstatic bool cyw_load_clm(struct mg_tcpip_driver_cyw_firmware *fw) {\n  return cyw_load_clmll((void *) fw->clm_addr, fw->clm_len);\n}\n\n// clang-format off\nstatic bool cyw_init(uint8_t *mac) {\n  struct mg_tcpip_driver_cyw_data *d = (struct mg_tcpip_driver_cyw_data *) s_ifp->driver_data;\n  uint32_t val = 0;\n  if (!cyw_bus_specific_init()) return false;\n  if (!cyw_load_clm(d->fw)) return false;  // Load CLM blob\n  // BT-ENABLED DEPENDENCY\n  // set Wi-Fi up\n  val = 0 /* disable */; cyw_ioctl_iovar_set(\"bus:txglom\", (uint8_t *)&val, sizeof(val));\n  val = 1 /* on */; cyw_ioctl_iovar_set(\"apsta\", (uint8_t *)&val, sizeof(val));\n  // CHIP DEPENDENCY\n  val = 8 ; cyw_ioctl_iovar_set(\"ampdu_ba_wsize\", (uint8_t *)&val, sizeof(val));\n  val = 4 ; cyw_ioctl_iovar_set(\"ampdu_mpdu\", (uint8_t *)&val, sizeof(val));\n  val = 0 /* 8K */; cyw_ioctl_iovar_set(\"ampdu_rx_factor\", (uint8_t *)&val, sizeof(val));\n  //\n  {\n    struct cyw_country c;\n    unsigned int rev = (unsigned int) (country_code >> 16) & 0xffff;\n    c.c = c.a = country_code & 0xffff;\n    c.rev = rev == 0 ? -1 : (int32_t) rev; // if rev is 0, set it to -1, the chip will use any NVRAM/OTP configured aggregate or default to rev 0\n    cyw_ioctl_iovar_set(\"country\", (void *)&c, sizeof(c));\n  } // this takes some time to process\n  { // so do some retries while enabling events of interest\n    // we care for SET_SSID(0), JOIN(1), AUTH(3), DEAUTH(5), DISASSOC_IND(12), LINK(16), PSK_SUP(46), SCAN_RESULT(69); all < 128\n    uint32_t data[128/8/4 + 1];\n    data[0] = 0; // bss index: 0 = STA\n    memset(&data[1], 0, 128/8); // mark all as not desired\n    data[1] = MG_BIT(0) | MG_BIT(1) | MG_BIT(3) | MG_BIT(5) | MG_BIT(12) | MG_BIT(16); // events 0 to 31\n    data[2] = MG_BIT(46 - 32); // events 32 to 63\n    data[3] = MG_BIT(69 - 64); // events 64 to 95\n    unsigned int times = 100;\n    while (times --)\n      if (cyw_ioctl_iovar_set(\"bsscfg:event_msgs\", (uint8_t *)data, sizeof(data))) break;\n    if (times == (unsigned int) ~0) return false;\n  }\n  val = 0; if (!cyw_ioctl_set(64 /* SET_ANTDIV */, (uint8_t *)&val, sizeof(val))) return false;\n  if (!cyw_ioctl_set(2 /* UP, interface up */, NULL, 0)) return false;\n  // use PM2 power saving for max throughput\n  val = 200 /* ms */; if (!cyw_ioctl_iovar_set(\"pm2_sleep_ret\", (uint8_t *)&val, sizeof(val))) return false;\n  // set beacon intervals to reduce power consumption while associated to an AP but idle\n  val = 1; if (!cyw_ioctl_iovar_set(\"bcn_li_bcn\", (uint8_t *)&val, sizeof(val))) return false;\n  val = 1; if (!cyw_ioctl_iovar_set(\"bcn_li_dtim\", (uint8_t *)&val, sizeof(val))) return false;\n  val = 10; if (!cyw_ioctl_iovar_set(\"assoc_listen\", (uint8_t *)&val, sizeof(val))) return false;\n  val = 1 /* auto */; if (!cyw_ioctl_set(110 /* SET_GMODE */, (uint8_t *)&val, sizeof(val))) return false;\n  val = 0 /* any */; if (!cyw_ioctl_set(142 /* SET_BAND */, (uint8_t *)&val, sizeof(val))) return false;\n  if (mg_log_level >= MG_LL_DEBUG) {\n    char text[256]; // this is huge, but we're just starting up\n    if (cyw_ioctl_iovar_get(\"ver\", (uint8_t *)text, sizeof(text))) {\n      unsigned int len = strnlen(text, sizeof(text));\n      MG_DEBUG((\"Firmware:\\n%.*s\", len, text));\n    }\n    text[0] = '\\0';\n    if (cyw_ioctl_iovar_get(\"clmver\", (uint8_t *)text, sizeof(text)) && text[0] != '\\0') {\n      unsigned int len = strnlen(text, sizeof(text));\n      MG_DEBUG((\"CLM:\\n%.*s\", len, text));\n    }\n  }\n  {\n    if(cyw_ioctl_iovar_get(\"cur_etheraddr\", mac, 6)) {\n      MG_DEBUG((\"MAC: %M\", mg_print_mac, mac));\n    } else {\n      MG_ERROR((\"read MAC failed\"));\n    }\n  }\n  return true;\n}\n// clang-format on\n\nstatic bool cyw_load_fwll(void *fwdata, size_t fwlen, void *nvramdata,\n                          size_t nvramlen);\n\nstatic bool cyw_load_firmware(struct mg_tcpip_driver_cyw_firmware *fw) {\n  return cyw_load_fwll((void *) fw->code_addr, fw->code_len,\n                       (void *) fw->nvram_addr, fw->nvram_len);\n}\n\n// clang-format off\nstatic bool cyw_load_clmll(void *data, size_t len) {\n  unsigned int sent = 0, offset = 0;\n  struct clm_hdr hdr = {\n      .flag = 1 << 12 /* DLOAD_HANDLER_VER */ | MG_BIT(1) /* DL_BEGIN */,\n      .type = 2,\n      .crc = 0};\n  while (sent < len) {\n    unsigned int bytes = len - sent;\n    if (bytes > 1024) bytes = 1024;\n    if (sent + bytes >= len) hdr.flag |= MG_BIT(2);  // DL_END;\n    hdr.len = bytes;\n    if (!cyw_ioctl_iovar_set2_(0, \"clmload\", (void *) &hdr, sizeof(hdr), (uint8_t *) data + offset, bytes))\n      break;\n    sent += bytes;\n    offset += bytes;\n    hdr.flag &= (uint16_t)~MG_BIT(1);  // DL_BEGIN\n  }\n  return sent >= len;\n}\n// clang-format on\n\nstatic void cyw_update_hash_table(void) {\n  // TODO(): read database, rebuild hash table\n  uint32_t val = 0;\n  val = 1;\n  cyw_ioctl_iovar_set2_(0, \"mcast_list\", (uint8_t *) &val, sizeof(val),\n                        (uint8_t *) mcast_addr, sizeof(mcast_addr));\n  mg_delayms(50);\n}\n\n// CYW43 chip backplane specifics. All values read and written are in little\n// endian format\n\n// Access to chip backplane is done windowed in 32KB banks\n// - addr = area base address + register offset\n// - set the window address to addr & ~ADDRMSK\n// - access addr & ADDRMSK for non-32-bit quantities\n// - if accesing 32-bit quantities, do it on (addr & ADDRMSK) | ACCSS4B\n#define CYW_CHIP_CHIPCOMMON 0x18000000\n#define CYW_CHIP_BCKPLN_WINSZ 0x8000\n#define CYW_CHIP_BCKPLN_ADDRMSK 0x7fff\n#define CYW_CHIP_BCKPLN_ACCSS4B MG_BIT(15)\n#define CYW_CHIP_BCKPLN_WRAPPOFF 0x100000\n// BUS DEPENDENCY: max bus to backplane transfer size, bus function id\n#define CYW_CHIP_BCKPLN_SPIMAX 64\n#define CYW_CHIP_BCKPLN_SDIOMAX 1536\n#if MG_ENABLE_DRIVER_CYW_SDIO\n#define CYW_CHIP_BCKPLN_BUSMAX CYW_CHIP_BCKPLN_SDIOMAX\n#define CYW_BUS_FUNC_CHIP CYW_SDIO_FUNC_CHIP\n#else\n#define CYW_CHIP_BCKPLN_BUSMAX CYW_CHIP_BCKPLN_SPIMAX\n#define CYW_BUS_FUNC_CHIP CYW_SPID_FUNC_CHIP\n#endif\n\n// CHIP DEPENDENCY\n#define CYW_CHIP_ARMCORE_BASE (CYW_CHIP_CHIPCOMMON + 0x3000)\n#define CYW_CHIP_SOCSRAM_BASE (CYW_CHIP_CHIPCOMMON + 0x4000)\n#define CYW_CHIP_ARMCORE (CYW_CHIP_ARMCORE_BASE + CYW_CHIP_BCKPLN_WRAPPOFF)\n#define CYW_CHIP_SOCSRAM (CYW_CHIP_SOCSRAM_BASE + CYW_CHIP_BCKPLN_WRAPPOFF)\n#define CYW_CHIP_ATCMRAM_BASE 0\n#define CYW_CHIP_RAM_SIZE 0x80000\n//\n\n#define CYW_CHIP_ADDRLOW 0x1000a\n#define CYW_CHIP_ADDRMID 0x1000b\n#define CYW_CHIP_ADDRHIGH 0x1000c\n#define CYW_CHIP_SPIFRCTRL 0x1000d\n#define CYW_CHIP_CLOCKCSR 0x1000e\n#define CYW_CHIP_PULLUP 0x1000f\n#define CYW_CHIP_WAKEUPCTL 0x1001e\n#define CYW_CHIP_SLEEPCSR 0x1001f\n\n#define CYW_CHIP_SOCSRAM_BANKXIDX 0x010\n#define CYW_CHIP_SOCSRAM_BANKXPDA 0x044\n#define CYW_CHIP_AI_IOCTRL 0x408\n#define CYW_CHIP_AI_RESETCTRL 0x800\n\nstatic bool cyw_bus_write(unsigned int f, uint32_t addr, void *data,\n                          uint16_t len);\nstatic bool cyw_bus_read(unsigned int f, uint32_t addr, void *data,\n                         uint16_t len);\n\n// clang-format off\n// set backplane window to requested area.\nstatic void cyw_set_backplane_window(uint32_t addr) {\n  uint32_t val;\n  addr &= ~CYW_CHIP_BCKPLN_ADDRMSK;\n  val = (addr >> 24) & 0xff; cyw_bus_write(CYW_BUS_FUNC_CHIP, CYW_CHIP_ADDRHIGH, &val, 1);\n  val = (addr >> 16) & 0xff; cyw_bus_write(CYW_BUS_FUNC_CHIP, CYW_CHIP_ADDRMID, &val, 1);\n  val = (addr >> 8) & 0xff; cyw_bus_write(CYW_BUS_FUNC_CHIP, CYW_CHIP_ADDRLOW, &val, 1);\n}\n\nstatic bool cyw_core_reset(uint32_t core_base, bool check) {\n  uint32_t val = 0;\n  // core disabled after chip reset\n  cyw_set_backplane_window(core_base); // set backplane window for requested area; we do know offsets fall within that window\n  // possible CHIP DEPENDENCY: AI_RESETSTATUS check and wait (instead of these cool reads) to ensure backplane operations end\n  cyw_bus_read(CYW_BUS_FUNC_CHIP, (core_base + CYW_CHIP_AI_IOCTRL) & CYW_CHIP_BCKPLN_ADDRMSK, &val, 1); // ensure backplane operations end\n  val = MG_BIT(1) | MG_BIT(0) /* SICF_FGC | SICF_CLOCK_EN */; cyw_bus_write(CYW_BUS_FUNC_CHIP, (core_base + CYW_CHIP_AI_IOCTRL) & CYW_CHIP_BCKPLN_ADDRMSK, &val, 1); // reset\n  cyw_bus_read(CYW_BUS_FUNC_CHIP, (core_base + CYW_CHIP_AI_IOCTRL) & CYW_CHIP_BCKPLN_ADDRMSK, &val, 1); // ensure backplane operations end\n  val = 0x00; cyw_bus_write(CYW_BUS_FUNC_CHIP, (core_base + CYW_CHIP_AI_RESETCTRL) & CYW_CHIP_BCKPLN_ADDRMSK, &val, 1); // release reset\n  mg_delayms(1);\n  val = MG_BIT(0) /* SICF_CLOCK_EN */; cyw_bus_write(CYW_BUS_FUNC_CHIP, (core_base + CYW_CHIP_AI_IOCTRL) & CYW_CHIP_BCKPLN_ADDRMSK, &val, 1);\n  cyw_bus_read(CYW_BUS_FUNC_CHIP, (core_base + CYW_CHIP_AI_IOCTRL) & CYW_CHIP_BCKPLN_ADDRMSK, &val, 1); // ensure backplane operations end\n  mg_delayms(1);\n\n  if (check) {\n    // Verify only clock is enabled\n    cyw_bus_read(CYW_BUS_FUNC_CHIP, (core_base + CYW_CHIP_AI_IOCTRL) & CYW_CHIP_BCKPLN_ADDRMSK, &val, 1);\n    if ((val & (MG_BIT(1) | MG_BIT(0)) /* SICF_FGC | SICF_CLOCK_EN) */) != MG_BIT(0)) return false;\n    // Verify it is not in reset state\n    cyw_bus_read(CYW_BUS_FUNC_CHIP, (core_base + CYW_CHIP_AI_RESETCTRL) & CYW_CHIP_BCKPLN_ADDRMSK, &val, 1);\n    if (val & MG_BIT(0)) return false; // AIRC_RESET\n  }\n  return true;\n}\n\nstatic void cyw_socram_init(void) {\n  uint32_t val;\n  // CHIP DEPENDENCY: disable remap for SRAM_3: 43430 and 43439 only\n  cyw_set_backplane_window(CYW_CHIP_SOCSRAM_BASE); // set backplane window for requested area; we do know offsets fall within that window\n  val = 0x03; cyw_bus_write(CYW_BUS_FUNC_CHIP, ((CYW_CHIP_SOCSRAM_BASE + CYW_CHIP_SOCSRAM_BANKXIDX) & CYW_CHIP_BCKPLN_ADDRMSK), &val, sizeof(val));\n  val = 0x00; cyw_bus_write(CYW_BUS_FUNC_CHIP, ((CYW_CHIP_SOCSRAM_BASE + CYW_CHIP_SOCSRAM_BANKXPDA) & CYW_CHIP_BCKPLN_ADDRMSK), &val, sizeof(val));\n}\n\n// transfer is fractioned in bus-to-backplane-size units within backplane windows\nstatic void cyw_load_data(uint32_t dest, void *data, size_t len) {\n  size_t sent = 0, offset = 0;\n  uint32_t last_addr = (uint32_t) ~0;\n  while (sent < len)  {\n    size_t bytes = len - sent, avail;\n    uint32_t addr = dest + offset;\n    if (addr - last_addr >= CYW_CHIP_BCKPLN_WINSZ || last_addr == (uint32_t) ~0) {\n      cyw_set_backplane_window(addr); // set backplane window for requested area\n      last_addr = addr & ~CYW_CHIP_BCKPLN_ADDRMSK;\n    }\n    addr &= CYW_CHIP_BCKPLN_ADDRMSK;\n    avail = CYW_CHIP_BCKPLN_WINSZ - (unsigned int) addr; // internal backplane limit\n    if (bytes > avail) bytes = avail;\n    if (bytes > CYW_CHIP_BCKPLN_BUSMAX) bytes = CYW_CHIP_BCKPLN_BUSMAX; // bus to backplane transfer limit\n    cyw_bus_write(CYW_BUS_FUNC_CHIP, addr, (uint8_t *)data + offset, (uint16_t) bytes);\n    sent += bytes;\n    offset += bytes;\n  }\n}\n\n// CHIP DEPENDENCY: no SOCSRAM base address; start address in fwdata image (Cortex-R4 chips)\nstatic bool cyw_load_fwll(void *fwdata, size_t fwlen, void *nvramdata, size_t nvramlen) {\n  uint32_t val = ((~(nvramlen / 4) & 0xffff) << 16) | (nvramlen / 4); // ~len len in 32-bit words\n  cyw_core_reset(CYW_CHIP_SOCSRAM, false);  // cores were disabled at chip reset\n  cyw_socram_init();\n  cyw_load_data(CYW_CHIP_ATCMRAM_BASE, fwdata, fwlen);\n  mg_delayms(5); // TODO(scaprile): CHECK IF THIS IS ACTUALLY NEEDED\n  // Load NVRAM and place 'length ~length' at the end; end of chip RAM\n  {\n    const uint32_t start = CYW_CHIP_RAM_SIZE - 4 - nvramlen;\n    cyw_load_data(start, nvramdata, nvramlen); // nvramlen must be a multiple of 4\n    // RAM_SIZE is a multiple of WINSZ, so the place for len ~len will be at the end of the window\n    cyw_bus_write(CYW_BUS_FUNC_CHIP, (CYW_CHIP_BCKPLN_WINSZ - 4), &val, sizeof(val));\n  }\n  // Reset ARM core and check it starts\n  if (!cyw_core_reset(CYW_CHIP_ARMCORE, true)) return false;\n  return true;\n}\n// clang-format on\n\n#if !MG_ENABLE_DRIVER_CYW_SDIO\n\n// CYW43 SPI bus specifics\n\n#define CYW_BUS_SPI_BUSCTRL 0x00     // 4 regs, 0 to 3\n#define CYW_BUS_SPI_INT 0x04         // 2 regs, 4 to 5\n#define CYW_BUS_SPI_INTEN 0x06       // 16-bit register\n#define CYW_BUS_SPI_STATUS 0x08      // 32-bit register\n#define CYW_BUS_SPI_TEST 0x14        // 32-bit register\n#define CYW_BUS_SPI_RESPDLY_F1 0x1d  // 8-bit register, F1: chip\n\n#define CYW_BUS_STS_LEN(x) ((x >> 9) & 0x7ff)\n\nstatic bool cyw_spi_write(unsigned int f, uint32_t addr, void *data,\n                          uint16_t len);\nstatic void cyw_spi_read(unsigned int f, uint32_t addr, void *data,\n                         uint16_t len);\n\n// clang-format off\nstatic size_t cyw_spi_poll(uint8_t *response) {\n  size_t len;\n  uint32_t res;\n  // SPI poll\n  cyw_spi_read(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_STATUS, &res, sizeof(res));\n  if (res == (uint32_t) ~0 || !(res & MG_BIT(8) /* packet available */ )) return 0;\n  len = CYW_BUS_STS_LEN(res);\n  if (len == 0) { // just ack IRQ\n    uint16_t val = 1;\n    cyw_spi_write(CYW_SPID_FUNC_CHIP, CYW_CHIP_SPIFRCTRL, &val, 1);\n    cyw_spi_read(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_INT, &val, sizeof(val));\n    cyw_spi_write(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_INT, &val, sizeof(val));\n    return 0;\n  }\n  cyw_spi_read(CYW_SPID_FUNC_WLAN, 0,  response, (uint16_t)len);\n  return len;\n}\n\nstatic size_t cyw_spi_tx(uint32_t *data, uint16_t len) {\n  while (len & 3) data[len++] = 0; // SPI 32-bit padding\n  return cyw_spi_write(CYW_SPID_FUNC_WLAN, 0, data, len) ? len: 0;\n}\n\n// this can be integrated in lowest level SPI read/write _driver_ functions\n// (those calling hal SPI transaction functions), though is only used at start\nuint32_t sw16_2(uint32_t data) {\n  return ((uint32_t)mg_htons((uint16_t)(data >> 16)) << 16) + mg_htons((uint16_t)data);\n}\n\n// DS 4.2.2 Table 6: signal we're working in 16-bit mode\n#define CYW_SPI_16bMODE MG_BIT(2) // arbitrary bit out of the FUNC space\n\nstatic bool cyw_spi_init() {\n  struct mg_tcpip_driver_cyw_data *d = (struct mg_tcpip_driver_cyw_data *) s_ifp->driver_data;\n  uint32_t val = 0;\n  // DS 4.2.3 Boot-Up Sequence; WHD: other chips might require more effort\n  unsigned int times = 51;\n  while (times--) {\n    cyw_spi_read(CYW_SPID_FUNC_BUS | CYW_SPI_16bMODE, CYW_BUS_SPI_TEST, &val, sizeof(val));\n    if (sw16_2(val) == 0xFEEDBEAD) break;\n    mg_delayms(1);\n  }\n  if (times == (unsigned int) ~0) return false;\n  // DS 4.2.3 Table 6. Chip starts in 16-bit little-endian mode.\n  // Configure SPI and switch to 32-bit big-endian mode:\n  // - High-speed mode: d->hs true\n  // - IRQ POLARITY high\n  // - SPI RESPONSE DELAY 4 bytes time [not in DS] TODO(scaprile): logic ana\n  // - Status not sent after command, IRQ with status\n  val = sw16_2(0x000204a3 | (d->hs ? MG_BIT(4) : 0)); // 4 reg content\n  cyw_spi_write(CYW_SPID_FUNC_BUS | CYW_SPI_16bMODE, CYW_BUS_SPI_BUSCTRL, &val, sizeof(val));\n  mg_tcpip_call(s_ifp, MG_TCPIP_EV_DRIVER, NULL);\n  cyw_spi_read(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_TEST, &val, sizeof(val));\n  if (val != 0xFEEDBEAD) return false;\n  val = 4; cyw_spi_write(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_RESPDLY_F1, &val, 1);\n  val = 0x99; // clear error bits DATA_UNAVAILABLE, COMMAND_ERROR, DATA_ERROR, F1_OVERFLOW\n  cyw_spi_write(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_INT, &val, 1);\n  val = 0x00be; // Enable IRQs F2_F3_FIFO_RD_UNDERFLOW, F2_F3_FIFO_WR_OVERFLOW, COMMAND_ERROR, DATA_ERROR, F2_PACKET_AVAILABLE, F1_OVERFLOW\n  // BT-ENABLED DEPENDENCY: add F1_INTR (bit 13)\n  cyw_spi_write(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_INTEN, &val, sizeof(uint16_t));\n\n  // chip backplane is ready, initialize it\n  // request ALP (Active Low Power) clock\n  val = MG_BIT(3) /* ALP_REQ */; cyw_spi_write(CYW_SPID_FUNC_CHIP, CYW_CHIP_CLOCKCSR, &val, 1);\n  // BT-ENABLED DEPENDENCY\n  times = 10;\n  while (times--) {\n    cyw_spi_read(CYW_SPID_FUNC_CHIP, CYW_CHIP_CLOCKCSR, &val, 1);\n    if (val & MG_BIT(6)) break; // ALP_AVAIL\n    mg_delayms(1);\n  }\n  if (times == (unsigned int) ~0) return false;\n  // clear request\n  val = 0; cyw_spi_write(CYW_SPID_FUNC_CHIP, CYW_CHIP_CLOCKCSR, &val, 1);\n  cyw_set_backplane_window(CYW_CHIP_CHIPCOMMON); // set backplane window to start of CHIPCOMMON area\n  cyw_spi_read(CYW_SPID_FUNC_CHIP, (CYW_CHIP_CHIPCOMMON + 0x00) & CYW_CHIP_BCKPLN_ADDRMSK, &val, 2);\n  if (val == 43430) val = 4343;\n  MG_INFO((\"WLAN chip is CYW%u%c\", val, val == 4343 ? 'W' : ' '));\n\n  // Load firmware (code and NVRAM)\n  if (!cyw_load_firmware(d->fw)) return false;\n\n  // Wait for High Throughput (HT) clock ready\n  times = 50;\n  while (times--) {\n    cyw_spi_read(CYW_SPID_FUNC_CHIP, CYW_CHIP_CLOCKCSR, &val, 1);\n    if (val & MG_BIT(7)) break; // HT_AVAIL\n    mg_delayms(1);\n  }\n  if (times == (unsigned int) ~0) return false;\n  // Wait for backplane ready\n  times = 1000;\n  while (times--) {\n    cyw_spi_read(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_STATUS, &val, sizeof(val));\n    if (val & MG_BIT(5)) break; // F2_RX_READY\n    mg_delayms(1);\n  }\n  if (times == (unsigned int) ~0) return false;\n\n  // CHIP DEPENDENCY\n  // Enable save / restore\n  // Configure WakeupCtrl, set HT_AVAIL in CLOCK_CSR\n  cyw_spi_read(CYW_SPID_FUNC_CHIP, CYW_CHIP_WAKEUPCTL, &val, 1);\n  val |= MG_BIT(1) /* WAKE_TILL_HT_AVAIL */; cyw_spi_write(CYW_SPID_FUNC_CHIP, CYW_CHIP_WAKEUPCTL, &val, 1);\n#if 0\n  // Set BRCM_CARDCAP to CMD_NODEC. NOTE(): This is probably only necessary for SDIO, not SPI\n  val = MG_BIT(3); cyw_spi_write(CYW_SPID_FUNC_BUS, 0xf0 /* SDIOD_CCCR_BRCM_CARDCAP */, &val, 1);\n#endif\n  // Force HT request to chip backplane\n  val = MG_BIT(1) /* FORCE_HT */; cyw_spi_write(CYW_SPID_FUNC_CHIP, CYW_CHIP_CLOCKCSR, &val, 1);\n  // Enable Keep SDIO On (KSO)\n  cyw_spi_read(CYW_SPID_FUNC_CHIP, CYW_CHIP_SLEEPCSR, &val, 1);\n  if (!(val & MG_BIT(0))) {\n      val |= MG_BIT(0); cyw_spi_write(CYW_SPID_FUNC_CHIP, CYW_CHIP_SLEEPCSR, &val, 1);\n  }\n  // The SPI bus can be configured for sleep (KSO controls wlan block sleep)\n  cyw_spi_read(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_BUSCTRL, &val, sizeof(val));\n  val &= ~MG_BIT(7) /* WAKE_UP */; cyw_spi_write(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_BUSCTRL, &val, sizeof(val));\n  // Set SPI bus sleep\n  val = 0x0f; cyw_spi_write(CYW_SPID_FUNC_CHIP, CYW_CHIP_PULLUP, &val, 1);\n\n  // Clear pullups. NOTE(): ?\n  val = 0x00; cyw_spi_write(CYW_SPID_FUNC_CHIP, CYW_CHIP_PULLUP, &val, 1);\n  cyw_spi_read(CYW_SPID_FUNC_CHIP, CYW_CHIP_PULLUP, &val, 1);\n  // Clear possible data unavailable error\n  cyw_spi_read(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_INTEN, &val, sizeof(uint16_t));\n  if (val & MG_BIT(0)) cyw_spi_write(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_INTEN, &val, sizeof(uint16_t));\n\n  return true;\n}\n// clang-format on\n\n// gSPI, CYW43439 DS 4.2.1 Fig.12\n#define CYW_SPID_LEN(x) ((x) &0x7FF)             // bits 0-10\n#define CYW_SPID_ADDR(x) (((x) &0x1FFFF) << 11)  // bits 11-27,\n#define CYW_SPID_FUNC(x) (((x) &3) << 28)        // bits 28-29\n#define CYW_SPID_INC MG_BIT(30)\n#define CYW_SPID_WR MG_BIT(31)\n\nstatic bool cyw_spi_write(unsigned int f, uint32_t addr, void *data,\n                          uint16_t len) {\n  struct mg_tcpip_driver_cyw_data *d =\n      (struct mg_tcpip_driver_cyw_data *) s_ifp->driver_data;\n  struct mg_tcpip_spi_ *s = (struct mg_tcpip_spi_ *) d->bus;\n  uint32_t hdr = CYW_SPID_WR | CYW_SPID_INC | CYW_SPID_FUNC(f) |\n                 CYW_SPID_ADDR(addr) | CYW_SPID_LEN(len);  // gSPI header\n  // TODO(scaprile): check spin in between and timeout values, return false\n  if (f == CYW_SPID_FUNC_WLAN) {\n    uint32_t val = 0;\n    while ((val & MG_BIT(5)) != MG_BIT(5))  // F2 rx ready (FIFO ready)\n      cyw_spi_read(CYW_SPID_FUNC_BUS, CYW_BUS_SPI_STATUS, &val, sizeof(val));\n  }\n  if (f & CYW_SPI_16bMODE)\n    hdr = sw16_2(hdr);  // swap half-words in 16-bit little-endian mode\n\n  s->begin(NULL);\n  s->txn(NULL, (uint8_t *) &hdr, NULL, sizeof(hdr));\n  if (len <= 4) {\n    uint32_t pad = 0;\n    memcpy(&pad, data, len);\n    s->txn(NULL, (uint8_t *) &pad, NULL, sizeof(pad));\n  } else {\n    s->txn(NULL, (uint8_t *) data, NULL, len);\n  }\n  s->end(NULL);\n  return true;\n}\n\n// will write 32-bit aligned quantities to data if f == CYW_SPID_FUNC_WLAN\nstatic void cyw_spi_read(unsigned int f, uint32_t addr, void *data,\n                         uint16_t len) {\n  struct mg_tcpip_driver_cyw_data *d =\n      (struct mg_tcpip_driver_cyw_data *) s_ifp->driver_data;\n  struct mg_tcpip_spi_ *s = (struct mg_tcpip_spi_ *) d->bus;\n  uint32_t padding =\n      f == CYW_SPID_FUNC_CHIP\n          ? 4\n          : 0;  // add padding to chip backplane reads as a response delay\n  uint32_t hdr = CYW_SPID_INC | CYW_SPID_FUNC(f) | CYW_SPID_ADDR(addr) |\n                 CYW_SPID_LEN(len + padding);  // gSPI header\n  if (f == CYW_SPID_FUNC_WLAN && (len & 3))\n    len = (len + 4) & ~3;  // align WLAN transfers to 32-bit\n  if (f & CYW_SPI_16bMODE)\n    hdr = sw16_2(hdr);  // swap half-words in 16-bit little-endian mode\n\n  s->begin(NULL);\n  s->txn(NULL, (uint8_t *) &hdr, NULL, sizeof(hdr));\n  if (f == CYW_SPID_FUNC_CHIP) {\n    uint32_t pad;\n    s->txn(NULL, NULL, (uint8_t *) &pad, 4);  // read padding back and discard\n  }\n  s->txn(NULL, NULL, (uint8_t *) data, len);\n  s->end(NULL);\n}\n\nstatic bool cyw_bus_specific_init(void) {\n  return cyw_spi_init();\n}\nstatic size_t cyw_bus_specific_poll(uint32_t *response) {\n  return cyw_spi_poll((uint8_t *) response);\n}\nstatic size_t cyw_bus_specific_tx(uint32_t *data, uint16_t len) {\n  return cyw_spi_tx(data, len);\n}\nstatic bool cyw_bus_write(unsigned int f, uint32_t addr, void *data,\n                          uint16_t len) {\n  if (f == CYW_SPID_FUNC_CHIP && len >= 4) addr |= CYW_CHIP_BCKPLN_ACCSS4B;\n  return cyw_spi_write(f, addr, data, len);\n}\nstatic bool cyw_bus_read(unsigned int f, uint32_t addr, void *data,\n                         uint16_t len) {\n  cyw_spi_read(f, addr, data, len);\n  return true;\n}\n\n#else  // MG_ENABLE_DRIVER_CYW_SDIO\n\n#include \"sdio.h\"\n\n// CYW43 SDIO bus specifics\n\n// CYW4343W and CYW43439 DS 4.1 SDIO v2.0:\n//- F0: max block size is  32 bytes\n//- F1: max block size is  64 bytes\n//- F2: max block size is 512 bytes\n\n// clang-format off\nstatic bool cyw_sdio_transfer(bool write, unsigned int f, uint32_t addr, void *data, uint32_t len) {\n  struct mg_tcpip_driver_cyw_data *d = (struct mg_tcpip_driver_cyw_data *) s_ifp->driver_data;\n  struct mg_tcpip_sdio *s = (struct mg_tcpip_sdio *) d->bus;\n  uint32_t *ptr = (uint32_t *) data; // assume 32-bit aligned data (all except firmware)\n  if (write && (size_t) data & 3) {  // missed, source data is not 32-bit aligned\n    memcpy(txdata, data, len);       // copy to an aligned buffer, we know it fits\n    ptr = txdata;\n  } // all possible read destinations are 32-bit aligned\n  // mg_sdio_transfer requires 32-bit alignment for > 1 byte transfers\n  return mg_sdio_transfer(s, write, f, addr, ptr, len);\n}\n\nstatic size_t cyw_sdio_poll(uint32_t *response) {\n  uint32_t res;\n  uint16_t *len = (uint16_t *)&res;\n  // WHD: internal docs, \"tag\" hinting a possible packet.\n  // This is actually the len / ~len field of a possible struct sdpcm_hdr, if there is a packet available, or 0 if there is none.\n  cyw_sdio_transfer(false, CYW_SDIO_FUNC_WLAN, 0, &res, sizeof(res)); // read \"the tag\"\n  if ((len[0] | len[1]) == 0 || (len[0] ^ len[1]) != 0xffff || *len <= 4) return 0;\n  response[0] = res; // copy what we already read, then read the rest\n  cyw_sdio_transfer(false, CYW_SDIO_FUNC_WLAN, 0, response + 1, *len - sizeof(res));\n  return (size_t)*len;\n}\n\nstatic size_t cyw_sdio_tx(uint32_t *data, uint16_t len) {\n  return cyw_sdio_transfer(true, CYW_SDIO_FUNC_WLAN, 0, data, len) ? len: 0;\n}\n\nstatic bool cyw_sdio_init() {\n  struct mg_tcpip_driver_cyw_data *d = (struct mg_tcpip_driver_cyw_data *) s_ifp->driver_data;\n  struct mg_tcpip_sdio *s = (struct mg_tcpip_sdio *) d->bus;\n  uint32_t val = 0;\n  if (!mg_sdio_init(s)) return false;\n  // no block transfers on F0. if (!mg_sdio_set_blksz(s, CYW_SDIO_FUNC_BUS, 32)) return false;\n  if (!mg_sdio_set_blksz(s, CYW_SDIO_FUNC_CHIP, 64)) return false;\n  if (!mg_sdio_set_blksz(s, CYW_SDIO_FUNC_WLAN, 64)) return false;\n  // TODO(scaprile): we don't handle SDIO interrupts, study CCCR INTEN and SDIO support (SDIO 6.3, 8)\n  // Enable chip backplane (F1)\n  if (!mg_sdio_enable_f(s, CYW_SDIO_FUNC_CHIP)) return false;\n  // Wait for F1 to be ready\n  if (!mg_sdio_waitready_f(s, CYW_SDIO_FUNC_CHIP)) return false;\n  // chip backplane is ready, initialize it\n  // request ALP (Active Low Power) clock\n  val = MG_BIT(5) | MG_BIT(3) | MG_BIT(0); // HW_CLKREQ_OFF ALP_REQ FORCE_ALP\n  cyw_sdio_transfer(true, CYW_SDIO_FUNC_CHIP, CYW_CHIP_CLOCKCSR, &val, 1);\n  // BT-ENABLED DEPENDENCY\n  unsigned int times = 10;\n  while (times--) {\n    if(!cyw_sdio_transfer(false, CYW_SDIO_FUNC_CHIP, CYW_CHIP_CLOCKCSR, &val, 1)) return false;\n    if (val & MG_BIT(6)) break; // ALP_AVAIL\n    mg_delayms(1);\n  }\n  if (times == (unsigned int) ~0) return false;\n  // clear request\n  val = 0; cyw_sdio_transfer(true, CYW_SDIO_FUNC_CHIP, CYW_CHIP_CLOCKCSR, &val, 1);\n  // Enable WLAN (F2)\n  if (!mg_sdio_enable_f(s, CYW_SDIO_FUNC_WLAN)) return false;\n  // Clear pullups. NOTE(): ?\n  val = 0x00; cyw_sdio_transfer(true, CYW_SDIO_FUNC_CHIP, CYW_CHIP_PULLUP, &val, 1);\n  // we don't handle wake nor OOB interrupts; SEP_INT_CTL is a vendor specific SDIO register\n  // SDIO interrupts: enable F2 interrupt only\n\n  cyw_set_backplane_window(CYW_CHIP_CHIPCOMMON); // set backplane window to start of CHIPCOMMON area\n  cyw_sdio_transfer(false, CYW_SDIO_FUNC_CHIP, (CYW_CHIP_CHIPCOMMON + 0x00) & CYW_CHIP_BCKPLN_ADDRMSK, &val, 2);\n  if (val == 43430) val = 4343;\n  MG_INFO((\"WLAN chip is CYW%u%c\", val, val == 4343 ? 'W' : ' '));\n  // Load firmware (code and NVRAM)\n  if (!cyw_load_firmware(d->fw)) return false;\n\n  // Wait for High Throughput (HT) clock ready\n  times = 50;\n  while (times--) {\n    if(!cyw_sdio_transfer(false, CYW_SDIO_FUNC_CHIP, CYW_CHIP_CLOCKCSR, &val, 1)) return false;\n    if (val & MG_BIT(7)) break; // HT_AVAIL\n    mg_delayms(1);\n  }\n  if (times == (unsigned int) ~0) return false;\n  // Wait for WLAN ready\n  if (!mg_sdio_waitready_f(s, CYW_SDIO_FUNC_WLAN)) return false;\n\n  // CHIP DEPENDENCY\n  // Enable save / restore\n  // Configure WakeupCtrl, set HT_AVAIL in CLOCK_CSR\n  if(!cyw_sdio_transfer(false, CYW_SDIO_FUNC_CHIP, CYW_CHIP_WAKEUPCTL, &val, 1)) return false;\n  val |= MG_BIT(1) /* WAKE_TILL_HT_AVAIL */; cyw_sdio_transfer(true, CYW_SDIO_FUNC_CHIP, CYW_CHIP_WAKEUPCTL, &val, 1);\n#if 0 // TODO(scaprile): Check if this is actually necessary\n  // Set BRCM_CARDCAP to CMD_NODEC. This is a vendor specific SDIO register\n  val = MG_BIT(3); cyw_sdio_transfer(true, CYW_SDIO_FUNC_BUS, 0xf0 /* SDIOD_CCCR_BRCM_CARDCAP */, &val, 1);\n#endif\n  // Force HT request to chip backplane\n  val = MG_BIT(1) /* FORCE_HT */; if(!cyw_sdio_transfer(true, CYW_SDIO_FUNC_CHIP, CYW_CHIP_CLOCKCSR, &val, 1)) return false;\n  // Enable Keep SDIO On (KSO)\n  cyw_sdio_transfer(false, CYW_SDIO_FUNC_CHIP, CYW_CHIP_SLEEPCSR, &val, 1);\n  if (!(val & MG_BIT(0))) {\n      val |= MG_BIT(0); cyw_sdio_transfer(true, CYW_SDIO_FUNC_CHIP, CYW_CHIP_SLEEPCSR, &val, 1);\n  }\n  return true;\n}\n\n// clang-format on\n\nstatic bool cyw_bus_specific_init(void) {\n  return cyw_sdio_init();\n}\nstatic size_t cyw_bus_specific_poll(uint32_t *response) {\n  return cyw_sdio_poll(response);\n}\nstatic size_t cyw_bus_specific_tx(uint32_t *data, uint16_t len) {\n  return cyw_sdio_tx(data, len);\n}\nstatic bool cyw_bus_write(unsigned int f, uint32_t addr, void *data,\n                          uint16_t len) {\n  if (f == CYW_SDIO_FUNC_CHIP && len == 4) addr |= CYW_CHIP_BCKPLN_ACCSS4B;\n  return cyw_sdio_transfer(true, f, addr, data, (uint32_t) len);\n}\nstatic bool cyw_bus_read(unsigned int f, uint32_t addr, void *data,\n                         uint16_t len) {\n  return cyw_sdio_transfer(false, f, addr, data, (uint32_t) len);\n}\n\n#endif\n\n// Mongoose Wi-Fi API functions\n\nbool mg_wifi_scan(void) {\n  return cyw_wifi_scan();\n}\n\nbool mg_wifi_connect(struct mg_wifi_data *wifi) {\n  s_ifp->ip = s_ip;\n  s_ifp->mask = s_mask;\n  if (s_ifp->ip == 0) s_ifp->enable_dhcp_client = true;\n  s_ifp->enable_dhcp_server = false;\n  MG_DEBUG((\"Connecting to '%s'\", wifi->ssid));\n  return cyw_wifi_connect(wifi->ssid, wifi->pass);\n}\n\nbool mg_wifi_disconnect(void) {\n  return cyw_wifi_disconnect();\n}\n\nbool mg_wifi_ap_start(struct mg_wifi_data *wifi) {\n  MG_DEBUG((\"Starting AP '%s' (%u)\", wifi->apssid, wifi->apchannel));\n  return cyw_wifi_ap_start(wifi->apssid, wifi->appass, wifi->apchannel);\n}\n\nbool mg_wifi_ap_stop(void) {\n  return cyw_wifi_ap_stop();\n}\n\n#endif\n"
  },
  {
    "path": "src/drivers/cyw.h",
    "content": "#pragma once\n\n#if MG_ENABLE_TCPIP &&                                          \\\n    ((defined(MG_ENABLE_DRIVER_CYW) && MG_ENABLE_DRIVER_CYW) || \\\n     (defined(MG_ENABLE_DRIVER_CYW_SDIO) && MG_ENABLE_DRIVER_CYW_SDIO))\n\nstruct mg_tcpip_spi_ {\n  void *spi;              // Opaque SPI bus descriptor\n  void (*begin)(void *);  // SPI begin: slave select low\n  void (*end)(void *);    // SPI end: slave select high\n  void (*txn)(void *, uint8_t *, uint8_t *,\n              size_t len);  // SPI transaction: write-read len bytes\n};\n\nstruct mg_tcpip_driver_cyw_firmware {\n  const uint8_t *code_addr;\n  size_t code_len;\n  const uint8_t *nvram_addr;\n  size_t nvram_len;\n  const uint8_t *clm_addr;\n  size_t clm_len;\n};\n\nstruct mg_tcpip_driver_cyw_data {\n  struct mg_wifi_data wifi;\n  void *bus;\n  struct mg_tcpip_driver_cyw_firmware *fw;\n  bool hs;  // use chip \"high-speed\" mode; otherwise SPI CPOL0 CPHA0 (DS 4.2.3 Table 6)\n};\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                              \\\n  do {                                                         \\\n    static struct mg_tcpip_driver_cyw_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                            \\\n    MG_SET_WIFI_CONFIG(&driver_data_);                         \\\n    mif_.ip = MG_TCPIP_IP;                                     \\\n    mif_.mask = MG_TCPIP_MASK;                                 \\\n    mif_.gw = MG_TCPIP_GW;                                     \\\n    mif_.driver = &mg_tcpip_driver_cyw;                        \\\n    mif_.driver_data = &driver_data_;                          \\\n    mif_.recv_queue.size = 8192;                               \\\n    mif_.mac[0] = 2; /* MAC read from OTP at driver init */    \\\n    mg_tcpip_init(mgr, &mif_);                                 \\\n    MG_INFO((\"Driver: cyw, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n"
  },
  {
    "path": "src/drivers/imxrt.c",
    "content": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && \\\n  (defined(MG_ENABLE_DRIVER_IMXRT10) && MG_ENABLE_DRIVER_IMXRT10) || \\\n  (defined(MG_ENABLE_DRIVER_IMXRT11) && MG_ENABLE_DRIVER_IMXRT11) || \\\n  (defined(MG_ENABLE_DRIVER_MCXE) && MG_ENABLE_DRIVER_MCXE)\nstruct imxrt_enet {\n  volatile uint32_t RESERVED0, EIR, EIMR, RESERVED1, RDAR, TDAR, RESERVED2[3],\n      ECR, RESERVED3[6], MMFR, MSCR, RESERVED4[7], MIBC, RESERVED5[7], RCR,\n      RESERVED6[15], TCR, RESERVED7[7], PALR, PAUR, OPD, TXIC0, TXIC1, TXIC2,\n      RESERVED8, RXIC0, RXIC1, RXIC2, RESERVED9[3], IAUR, IALR, GAUR, GALR,\n      RESERVED10[7], TFWR, RESERVED11[14], RDSR, TDSR, MRBR[2], RSFL, RSEM,\n      RAEM, RAFL, TSEM, TAEM, TAFL, TIPG, FTRL, RESERVED12[3], TACC, RACC,\n      RESERVED13[15], RMON_T_PACKETS, RMON_T_BC_PKT, RMON_T_MC_PKT,\n      RMON_T_CRC_ALIGN, RMON_T_UNDERSIZE, RMON_T_OVERSIZE, RMON_T_FRAG,\n      RMON_T_JAB, RMON_T_COL, RMON_T_P64, RMON_T_P65TO127, RMON_T_P128TO255,\n      RMON_T_P256TO511, RMON_T_P512TO1023, RMON_T_P1024TO2048, RMON_T_GTE2048,\n      RMON_T_OCTETS, IEEE_T_DROP, IEEE_T_FRAME_OK, IEEE_T_1COL, IEEE_T_MCOL,\n      IEEE_T_DEF, IEEE_T_LCOL, IEEE_T_EXCOL, IEEE_T_MACERR, IEEE_T_CSERR,\n      IEEE_T_SQE, IEEE_T_FDXFC, IEEE_T_OCTETS_OK, RESERVED14[3], RMON_R_PACKETS,\n      RMON_R_BC_PKT, RMON_R_MC_PKT, RMON_R_CRC_ALIGN, RMON_R_UNDERSIZE,\n      RMON_R_OVERSIZE, RMON_R_FRAG, RMON_R_JAB, RESERVED15, RMON_R_P64,\n      RMON_R_P65TO127, RMON_R_P128TO255, RMON_R_P256TO511, RMON_R_P512TO1023,\n      RMON_R_P1024TO2047, RMON_R_GTE2048, RMON_R_OCTETS, IEEE_R_DROP,\n      IEEE_R_FRAME_OK, IEEE_R_CRC, IEEE_R_ALIGN, IEEE_R_MACERR, IEEE_R_FDXFC,\n      IEEE_R_OCTETS_OK, RESERVED16[71], ATCR, ATVR, ATOFF, ATPER, ATCOR, ATINC,\n      ATSTMP, RESERVED17[122], TGSR, TCSR0, TCCR0, TCSR1, TCCR1, TCSR2, TCCR2,\n      TCSR3;\n};\n\n#undef ENET\n#if defined(MG_ENABLE_DRIVER_IMXRT11) && MG_ENABLE_DRIVER_IMXRT11\n#define ENET ((struct imxrt_enet *) (uintptr_t) 0x40424000U)\n#define ETH_DESC_CNT 5     // Descriptors count\n#elif defined(MG_ENABLE_DRIVER_IMXRT10) && MG_ENABLE_DRIVER_IMXRT10\n#define ENET ((struct imxrt_enet *) (uintptr_t) 0x402D8000U)\n#define ETH_DESC_CNT 4     // Descriptors count\n#else // MG_ENABLE_DRIVER_MCXE\n#define ENET ((struct imxrt_enet *) (uintptr_t) 0x40079000U)\n#define ETH_DESC_CNT 4     // Descriptor count\n#endif\n\n#define ETH_PKT_SIZE 1536  // Max frame size, 64-bit aligned\n\nstruct enet_desc {\n  uint16_t length;   // Data length\n  uint16_t control;  // Control and status\n  uint32_t *buffer;  // Data ptr\n};\n\n// Descriptors: in non-cached area (TODO(scaprile)), (37.5.1.22.2 37.5.1.23.2)\n// Buffers: 64-byte aligned (37.3.14)\nstatic volatile struct enet_desc s_rxdesc[ETH_DESC_CNT] MG_ETH_RAM MG_64BYTE_ALIGNED;\nstatic volatile struct enet_desc s_txdesc[ETH_DESC_CNT] MG_ETH_RAM MG_64BYTE_ALIGNED;\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM MG_64BYTE_ALIGNED;\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM MG_64BYTE_ALIGNED;\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\n\nstatic uint16_t enet_read_phy(uint8_t addr, uint8_t reg) {\n  ENET->EIR |= MG_BIT(23);  // MII interrupt clear\n  ENET->MMFR = (1 << 30) | (2 << 28) | (addr << 23) | (reg << 18) | (2 << 16);\n  while ((ENET->EIR & MG_BIT(23)) == 0) (void) 0;\n  return ENET->MMFR & 0xffff;\n}\n\nstatic void enet_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  ENET->EIR |= MG_BIT(23);  // MII interrupt clear\n  ENET->MMFR =\n      (1 << 30) | (1 << 28) | (addr << 23) | (reg << 18) | (2 << 16) | val;\n  while ((ENET->EIR & MG_BIT(23)) == 0) (void) 0;\n}\n\n//  MDC clock is generated from IPS Bus clock (ipg_clk); as per 802.3,\n//  it must not exceed 2.5MHz\n// The PHY receives the PLL6-generated 50MHz clock\nstatic bool mg_tcpip_driver_imxrt_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_imxrt_data *d =\n      (struct mg_tcpip_driver_imxrt_data *) ifp->driver_data;\n  s_ifp = ifp;\n\n  // Init RX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i].control = MG_BIT(15);              // Own (E)\n    s_rxdesc[i].buffer = (uint32_t *) s_rxbuf[i];  // Point to data buffer\n  }\n  s_rxdesc[ETH_DESC_CNT - 1].control |= MG_BIT(13);  // Wrap last descriptor\n\n  // Init TX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    // s_txdesc[i].control = MG_BIT(10);  // Own (TC)\n    s_txdesc[i].buffer = (uint32_t *) s_txbuf[i];\n  }\n  s_txdesc[ETH_DESC_CNT - 1].control |= MG_BIT(13);  // Wrap last descriptor\n\n  ENET->ECR = MG_BIT(0);                     // Software reset, disable\n  while ((ENET->ECR & MG_BIT(0))) (void) 0;  // Wait until done\n\n  // Set MDC clock divider. If user told us the value, use it.\n  // TODO(): Otherwise, guess (currently assuming max freq)\n  int cr = (d == NULL || d->mdc_cr < 0) ? 24 : d->mdc_cr;\n  ENET->MSCR = (1 << 8) | ((cr & 0x3f) << 1);  // HOLDTIME 2 clks\n  struct mg_phy phy = {enet_read_phy, enet_write_phy};\n  mg_phy_init(&phy, d->phy_addr, MG_PHY_LEDS_ACTIVE_HIGH); // MAC clocks PHY  \n  // Select RMII mode, 100M, keep CRC, set max rx length, disable loop\n  ENET->RCR = (1518 << 16) | MG_BIT(8) | MG_BIT(2);\n  // ENET->RCR |= MG_BIT(3);     // Receive all\n  ENET->TCR = MG_BIT(2);  // Full-duplex\n  ENET->RDSR = (uint32_t) (uintptr_t) s_rxdesc;\n  ENET->TDSR = (uint32_t) (uintptr_t) s_txdesc;\n  ENET->MRBR[0] = ETH_PKT_SIZE;  // Same size for RX/TX buffers\n  // MAC address filtering (bytes in reversed order)\n  ENET->PAUR = ((uint32_t) ifp->mac[4] << 24U) | (uint32_t) ifp->mac[5] << 16U;\n  ENET->PALR = (uint32_t) (ifp->mac[0] << 24U) |\n               ((uint32_t) ifp->mac[1] << 16U) |\n               ((uint32_t) ifp->mac[2] << 8U) | ifp->mac[3];\n  ENET->ECR = MG_BIT(8) | MG_BIT(1);  // Little-endian CPU, Enable\n  ENET->EIMR = MG_BIT(25);            // Set interrupt mask\n  ENET->RDAR = MG_BIT(24);            // Receive Descriptors have changed\n  ENET->TDAR = MG_BIT(24);            // Transmit Descriptors have changed\n  // ENET->OPD = 0x10014;\n  ENET->IAUR = 0;\n  ENET->IALR = 0;\n  ENET->GAUR = 0;\n  ENET->GALR = 0;\n  return true;\n}\n\n\n// Transmit frame\nstatic size_t mg_tcpip_driver_imxrt_tx(const void *buf, size_t len,\n                                       struct mg_tcpip_if *ifp) {\n  static int s_txno;  // Current descriptor index\n  if (len > sizeof(s_txbuf[ETH_DESC_CNT])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = (size_t) -1;  // fail\n  } else if ((s_txdesc[s_txno].control & MG_BIT(15))) {\n    ifp->nerr++;\n    MG_ERROR((\"No descriptors available\"));\n    len = 0;  // retry later\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);         // Copy data\n    s_txdesc[s_txno].length = (uint16_t) len;  // Set data len\n    // Table 37-34, R, L, TC (Ready, last, transmit CRC after frame\n    s_txdesc[s_txno].control |=\n        (uint16_t) (MG_BIT(15) | MG_BIT(11) | MG_BIT(10));\n    ENET->TDAR = MG_BIT(24);  // Descriptor ring updated\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n  (void) ifp;\n  return len;\n}\n\nstatic void mg_tcpip_driver_imxrt_update_hash_table(struct mg_tcpip_if *ifp) {\n  // TODO(): read database, rebuild hash table\n  // RM 37.3.4.3.2\n  uint32_t hash_table[2] = {0, 0};\n  // uint8_t hash64 = ((~mg_crc32(0, mcast_addr, 6)) >> 26) & 0x3f;\n  // hash_table[((uint8_t)hash64) >> 5] |= (1 << (hash64 & 0x1f));\n  hash_table[1] = MG_BIT(1); // above reduces to this for mDNS addr\n  ENET->GAUR = hash_table[1];\n  ENET->GALR = hash_table[0];\n  (void) ifp;\n}\n\nstatic bool mg_tcpip_driver_imxrt_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    mg_tcpip_driver_imxrt_update_hash_table(ifp);\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  struct mg_tcpip_driver_imxrt_data *d =\n      (struct mg_tcpip_driver_imxrt_data *) ifp->driver_data;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {enet_read_phy, enet_write_phy};\n  up = mg_phy_up(&phy, d->phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    // tmp = reg with flags set to the most likely situation: 100M full-duplex\n    // if(link is slow or half) set flags otherwise\n    // reg = tmp\n    uint32_t tcr = ENET->TCR | MG_BIT(2);             // Full-duplex\n    uint32_t rcr = ENET->RCR & ~MG_BIT(9);            // 100M\n    if (speed == MG_PHY_SPEED_10M) rcr |= MG_BIT(9);  // 10M\n    if (full_duplex == false) tcr &= ~MG_BIT(2);      // Half-duplex\n    ENET->TCR = tcr;  // IRQ handler does not fiddle with these registers\n    ENET->RCR = rcr;\n    MG_DEBUG((\"Link is %uM %s-duplex\", rcr & MG_BIT(9) ? 10 : 100,\n              tcr & MG_BIT(2) ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\nstatic uint32_t s_rxno;\n#if !defined(MG_ENABLE_DRIVER_MCXE)\nvoid ENET_IRQHandler(void);\nvoid ENET_IRQHandler(void) {\n#else\nvoid ENET_Receive_IRQHandler(void);\nvoid ENET_Receive_IRQHandler(void) {\n#endif\n  ENET->EIR = MG_BIT(25);  // Ack IRQ\n  // Frame received, loop\n  for (uint32_t i = 0; i < 10; i++) {  // read as they arrive but not forever\n    uint32_t r = s_rxdesc[s_rxno].control;\n    if (r & MG_BIT(15)) break;  // exit when done\n    // skip partial/errored frames (Table 37-32)\n    if ((r & MG_BIT(11)) &&\n        !(r & (MG_BIT(5) | MG_BIT(4) | MG_BIT(2) | MG_BIT(1) | MG_BIT(0)))) {\n      size_t len = s_rxdesc[s_rxno].length;\n      mg_tcpip_qwrite(s_rxbuf[s_rxno], len > 4 ? len - 4 : len, s_ifp);\n    }\n    s_rxdesc[s_rxno].control |= MG_BIT(15);\n    if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n  }\n  ENET->RDAR = MG_BIT(24);  // Receive Descriptors have changed\n  // If b24 == 0, descriptors were exhausted and probably frames were dropped\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_imxrt = {mg_tcpip_driver_imxrt_init,\n                                                mg_tcpip_driver_imxrt_tx, NULL,\n                                                mg_tcpip_driver_imxrt_poll};\n\n#endif\n"
  },
  {
    "path": "src/drivers/imxrt.h",
    "content": "#pragma once\n\n#if MG_ENABLE_TCPIP && \\\n  (defined(MG_ENABLE_DRIVER_IMXRT10) && MG_ENABLE_DRIVER_IMXRT10) || \\\n  (defined(MG_ENABLE_DRIVER_IMXRT11) && MG_ENABLE_DRIVER_IMXRT11) || \\\n  (defined(MG_ENABLE_DRIVER_MCXE) && MG_ENABLE_DRIVER_MCXE)\n\nstruct mg_tcpip_driver_imxrt_data {\n  // MDC clock divider. MDC clock is derived from IPS Bus clock (ipg_clk),\n  // must not exceed 2.5MHz. Configuration for clock range 2.36~2.50 MHz\n  // 37.5.1.8.2, Table 37-46 : f = ipg_clk / (2(mdc_cr + 1))\n  //    ipg_clk       mdc_cr VALUE\n  //    --------------------------\n  //                  -1  <-- TODO() tell driver to guess the value\n  //    25 MHz         4\n  //    33 MHz         6\n  //    40 MHz         7\n  //    50 MHz         9\n  //    66 MHz        13\n  int mdc_cr;  // Valid values: -1 to 63\n\n  uint8_t phy_addr;  // PHY address\n};\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 2\n#endif\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 24\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                \\\n  do {                                                           \\\n    static struct mg_tcpip_driver_imxrt_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                              \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                      \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                   \\\n    mif_.ip = MG_TCPIP_IP;                                       \\\n    mif_.mask = MG_TCPIP_MASK;                                   \\\n    mif_.gw = MG_TCPIP_GW;                                       \\\n    mif_.driver = &mg_tcpip_driver_imxrt;                        \\\n    mif_.driver_data = &driver_data_;                            \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                                \\\n    mg_tcpip_init(mgr, &mif_);                                   \\\n    MG_INFO((\"Driver: imxrt, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n"
  },
  {
    "path": "src/drivers/nxp_wifi.c",
    "content": "#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_NXP_WIFI) && \\\n    MG_ENABLE_DRIVER_NXP_WIFI\n\n#include \"drivers/nxp_wifi.h\"\n\nbool __attribute__((weak)) netif_init(struct mg_tcpip_if *ifp) {\n  (void) ifp;\n  MG_ERROR((\"Please link wifi/port/net contents\"));\n  return false;\n}\nsize_t __attribute__((weak))\nnetif_tx(const void *bfr, size_t len, struct mg_tcpip_if *ifp) {\n  (void) bfr;\n  (void) len;\n  netif_init(ifp);\n  return 0;\n}\nbool __attribute__((weak)) netif_connect(struct mg_wifi_data *wifi) {\n  (void) wifi;\n  return netif_init(NULL);\n}\nbool __attribute__((weak))\nnetif_poll(struct mg_tcpip_if *ifp, bool s1, mg_tcpip_event_handler_t evcb) {\n  (void) ifp;\n  (void) s1;\n  (void) evcb;\n  return false;\n}\n\nstatic struct mg_tcpip_if *s_ifp;\nstatic uint32_t s_ip, s_mask;\n\nstatic void wifi_cb(struct mg_tcpip_if *ifp, int ev, void *ev_data) {\n  struct mg_wifi_data *wifi =\n      &((struct mg_tcpip_driver_nxp_wifi_data *) ifp->driver_data)->wifi;\n  if (wifi->apmode && ev == MG_TCPIP_EV_ST_CHG &&\n      *(uint8_t *) ev_data == MG_TCPIP_STATE_UP) {\n    MG_DEBUG((\"Access Point started\"));\n    s_ip = ifp->ip, ifp->ip = wifi->apip;\n    s_mask = ifp->mask, ifp->mask = wifi->apmask;\n    ifp->enable_dhcp_client = false;\n    ifp->enable_dhcp_server = true;\n  }\n}\n\nstatic bool nxp_wifi_init(struct mg_tcpip_if *ifp) {\n  struct mg_wifi_data *wifi =\n      &((struct mg_tcpip_driver_nxp_wifi_data *) ifp->driver_data)->wifi;\n  s_ifp = ifp;\n  s_ip = ifp->ip;\n  s_mask = ifp->mask;\n  ifp->pfn = wifi_cb;\n  if (!netif_init(ifp)) return false;\n  if (wifi->apmode) {\n    return mg_wifi_ap_start(wifi);\n  } else if (wifi->ssid != NULL && wifi->pass != NULL) {\n    return mg_wifi_connect(wifi);\n  }\n  return true;\n}\n\nbool nxp_wifi_poll(struct mg_tcpip_if *ifp, bool s1) {\n  return netif_poll(ifp, s1, mg_tcpip_call);\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_nxp_wifi = {nxp_wifi_init, netif_tx,\n                                                   NULL, nxp_wifi_poll};\n\nbool mg_wifi_connect(struct mg_wifi_data *wifi) {\n  s_ifp->ip = s_ip;\n  s_ifp->mask = s_mask;\n  if (s_ifp->ip == 0) s_ifp->enable_dhcp_client = true;\n  s_ifp->enable_dhcp_server = false;\n  return netif_connect(wifi);\n}\n\nbool __attribute__((weak)) mg_wifi_scan(void) {\n  return netif_init(NULL);\n}\nbool __attribute__((weak)) mg_wifi_disconnect(void) {\n  return netif_init(NULL);\n}\nbool __attribute__((weak)) mg_wifi_ap_start(struct mg_wifi_data *wifi) {\n  (void) wifi;\n  return netif_init(NULL);\n}\nbool __attribute__((weak)) mg_wifi_ap_stop(void) {\n  return netif_init(NULL);\n}\n\n#endif\n"
  },
  {
    "path": "src/drivers/nxp_wifi.h",
    "content": "#pragma once\n\n#if MG_ENABLE_TCPIP  && \\\n    defined(MG_ENABLE_DRIVER_NXP_WIFI) && MG_ENABLE_DRIVER_NXP_WIFI\n\n\nstruct mg_tcpip_driver_nxp_wifi_data {\n  struct mg_wifi_data wifi;\n};\n\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                   \\\n  do {                                                              \\\n    static struct mg_tcpip_driver_nxp_wifi_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                                 \\\n    MG_SET_WIFI_CONFIG(&driver_data_);                              \\\n    mif_.ip = MG_TCPIP_IP;                                          \\\n    mif_.mask = MG_TCPIP_MASK;                                      \\\n    mif_.gw = MG_TCPIP_GW;                                          \\\n    mif_.driver = &mg_tcpip_driver_nxp_wifi;                        \\\n    mif_.driver_data = &driver_data_;                               \\\n    mif_.recv_queue.size = 8192;                                    \\\n    mif_.mac[0] = 2; /* MAC read from OTP at driver init */         \\\n    mg_tcpip_init(mgr, &mif_);                                      \\\n    MG_INFO((\"Driver: nxp wifi, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n"
  },
  {
    "path": "src/drivers/phy.c",
    "content": "#include \"phy.h\"\n\nenum {                  // ID1  ID2\n  MG_PHY_KSZ8x = 0x22,  // 0022 156x - KSZ8081RNB, KSZ8091RNB\n  MG_PHY_DP83x = 0x2000,\n  MG_PHY_DP83867 = 0xa231,  // 2000 a231 - TI DP83867I\n  MG_PHY_DP83825 = 0xa140,  // 2000 a140 - TI DP83825I\n  MG_PHY_DP83848 = 0x5ca2,  // 2000 5ca2 - TI DP83848I\n  MG_PHY_LAN87x = 0x7,      // 0007 c0fx - LAN8720\n  MG_PHY_RTL82x = 0x1c,\n  MG_PHY_RTL8201 = 0xc816,  // 001c c816 - RTL8201F\n  MG_PHY_RTL8211 = 0xc916,  // 001c c916 - RTL8211F\n  MG_PHY_ICS1894x = 0x15,\n  MG_PHY_ICS189432 = 0xf450  // 0015 f450 - ICS1894\n};\n\nenum {\n  MG_PHY_REG_BCR = 0,\n  MG_PHY_REG_BSR = 1,\n  MG_PHY_REG_ID1 = 2,\n  MG_PHY_REG_ID2 = 3,\n  MG_PHY_DP83x_REG_PHYSTS = 16,\n  MG_PHY_DP83867_REG_PHYSTS = 17,\n  MG_PHY_DP83x_REG_RCSR = 23,\n  MG_PHY_DP83x_REG_LEDCR = 24,\n  MG_PHY_KSZ8x_REG_PC1R = 30,\n  MG_PHY_KSZ8x_REG_PC2R = 31,\n  MG_PHY_LAN87x_REG_SCSR = 31,\n  MG_PHY_RTL82x_REG_PAGESEL = 31,\n  MG_PHY_RTL8201_REG_RMSR = 16,   // in page 7\n  MG_PHY_RTL8211_REG_PHYSR = 26,  // in page a43\n  MG_PHY_ICS189432_REG_POLL = 17\n};\n\nstatic const char *mg_phy_id_to_str(uint16_t id1, uint16_t id2) {\n  switch (id1) {\n    case MG_PHY_DP83x:\n      switch (id2) {\n        case MG_PHY_DP83867:\n          return \"DP83867\";\n        case MG_PHY_DP83848:\n          return \"DP83848\";\n        case MG_PHY_DP83825:\n          return \"DP83825\";\n        default:\n          return \"DP83x\";\n      }\n    case MG_PHY_KSZ8x:\n      return \"KSZ8x\";\n    case MG_PHY_LAN87x:\n      return \"LAN87x\";\n    case MG_PHY_RTL82x:\n      switch (id2) {\n        case MG_PHY_RTL8201:\n          return \"RTL8201\";\n        case MG_PHY_RTL8211:\n          return \"RTL8211\";\n        default:\n          return \"RTL82x\";\n      }\n    case MG_PHY_ICS1894x:\n      return \"ICS1894x\";\n    default:\n      return \"unknown\";\n  }\n}\n\nvoid mg_phy_init(struct mg_phy *phy, uint8_t phy_addr, uint8_t config) {\n  uint16_t id1, id2;\n  phy->write_reg(phy_addr, MG_PHY_REG_BCR, MG_BIT(15));  // Reset PHY\n  while (phy->read_reg(phy_addr, MG_PHY_REG_BCR) & MG_BIT(15)) (void) 0;\n  // MG_PHY_REG_BCR[12]: Autonegotiation is default unless hw says otherwise\n\n  id1 = phy->read_reg(phy_addr, MG_PHY_REG_ID1);\n  id2 = phy->read_reg(phy_addr, MG_PHY_REG_ID2);\n  MG_INFO((\"PHY ID: %#04x %#04x (%s)\", id1, id2, mg_phy_id_to_str(id1, id2)));\n\n  if (id1 == MG_PHY_DP83x && id2 == MG_PHY_DP83867) {\n    phy->write_reg(phy_addr, 0x0d, 0x1f);  // write 0x10d to IO_MUX_CFG (0x0170)\n    phy->write_reg(phy_addr, 0x0e, 0x170);\n    phy->write_reg(phy_addr, 0x0d, 0x401f);\n    phy->write_reg(phy_addr, 0x0e, 0x10d);\n  }\n\n  if (config & MG_PHY_CLOCKS_MAC) {\n    // Use PHY crystal oscillator (preserve defaults)\n    // nothing to do\n  } else {  // MAC clocks PHY, PHY has no xtal\n    // Enable 50 MHz external ref clock at XI (preserve defaults)\n    if (id1 == MG_PHY_DP83x && id2 != MG_PHY_DP83867 && id2 != MG_PHY_DP83848) {\n      phy->write_reg(phy_addr, MG_PHY_DP83x_REG_RCSR, MG_BIT(7) | MG_BIT(0));\n    } else if (id1 == MG_PHY_KSZ8x) {\n      // Disable isolation (override hw, it doesn't make sense at this point)\n      // - #2848, some NXP boards set ISO, even though docs say they don't\n      phy->write_reg(phy_addr, MG_PHY_REG_BCR,\n                     (uint16_t) (phy->read_reg(phy_addr, MG_PHY_REG_BCR) &\n                                 (uint16_t) ~MG_BIT(10)));\n      // now do clock stuff\n      phy->write_reg(phy_addr, MG_PHY_KSZ8x_REG_PC2R,\n                     (uint16_t) (MG_BIT(15) | MG_BIT(8) | MG_BIT(7)));\n    } else if (id1 == MG_PHY_LAN87x) {\n      // nothing to do\n    } else if (id1 == MG_PHY_RTL82x && id2 == MG_PHY_RTL8201) {\n      // assume PHY has been hardware strapped properly\n#if 0\n      phy->write_reg(phy_addr, MG_PHY_RTL82x_REG_PAGESEL, 7);  // Select page 7\n      phy->write_reg(phy_addr, MG_PHY_RTL8201_REG_RMSR, 0x1ffa);\n      phy->write_reg(phy_addr, MG_PHY_RTL82x_REG_PAGESEL, 0);  // Select page 0\n#endif\n    } else if (id1 == MG_PHY_RTL82x && id2 == MG_PHY_RTL8211) {\n      // assume PHY has been hardware strapped properly\n    }\n  }\n\n  if (config & MG_PHY_LEDS_ACTIVE_HIGH && id1 == MG_PHY_DP83x) {\n    phy->write_reg(phy_addr, MG_PHY_DP83x_REG_LEDCR,\n                   MG_BIT(9) | MG_BIT(7));  // LED status, active high\n  }  // Other PHYs do not support this feature\n}\n\nbool mg_phy_up(struct mg_phy *phy, uint8_t phy_addr, bool *full_duplex,\n               uint8_t *speed) {\n  bool up = false;\n  uint16_t bsr = phy->read_reg(phy_addr, MG_PHY_REG_BSR);\n  if ((bsr & MG_BIT(5)) && !(bsr & MG_BIT(2)))  // some PHYs latch down events\n    bsr = phy->read_reg(phy_addr, MG_PHY_REG_BSR);  // read again\n  up = bsr & MG_BIT(2);\n  if (up && full_duplex != NULL && speed != NULL) {\n    uint16_t id1 = phy->read_reg(phy_addr, MG_PHY_REG_ID1);\n    if (id1 == MG_PHY_DP83x) {\n      uint16_t id2 = phy->read_reg(phy_addr, MG_PHY_REG_ID2);\n      if (id2 == MG_PHY_DP83867) {\n        uint16_t physts = phy->read_reg(phy_addr, MG_PHY_DP83867_REG_PHYSTS);\n        *full_duplex = physts & MG_BIT(13);\n        *speed = (physts & MG_BIT(15))   ? MG_PHY_SPEED_1000M\n                 : (physts & MG_BIT(14)) ? MG_PHY_SPEED_100M\n                                         : MG_PHY_SPEED_10M;\n      } else {\n        uint16_t physts = phy->read_reg(phy_addr, MG_PHY_DP83x_REG_PHYSTS);\n        *full_duplex = physts & MG_BIT(2);\n        *speed = (physts & MG_BIT(1)) ? MG_PHY_SPEED_10M : MG_PHY_SPEED_100M;\n      }\n    } else if (id1 == MG_PHY_KSZ8x) {\n      uint16_t pc1r = phy->read_reg(phy_addr, MG_PHY_KSZ8x_REG_PC1R);\n      *full_duplex = pc1r & MG_BIT(2);\n      *speed = (pc1r & 3) == 1 ? MG_PHY_SPEED_10M : MG_PHY_SPEED_100M;\n    } else if (id1 == MG_PHY_LAN87x) {\n      uint16_t scsr = phy->read_reg(phy_addr, MG_PHY_LAN87x_REG_SCSR);\n      *full_duplex = scsr & MG_BIT(4);\n      *speed = (scsr & MG_BIT(3)) ? MG_PHY_SPEED_100M : MG_PHY_SPEED_10M;\n    } else if (id1 == MG_PHY_RTL82x) {\n      uint16_t id2 = phy->read_reg(phy_addr, MG_PHY_REG_ID2);\n      if (id2 == MG_PHY_RTL8211) {\n        uint16_t physr;\n        phy->write_reg(phy_addr, MG_PHY_RTL82x_REG_PAGESEL, 0xa43);\n        physr = phy->read_reg(phy_addr, MG_PHY_RTL8211_REG_PHYSR);\n        phy->write_reg(phy_addr, MG_PHY_RTL82x_REG_PAGESEL, 0);\n        *full_duplex = physr & MG_BIT(3);\n        *speed = (physr & MG_BIT(5))   ? MG_PHY_SPEED_1000M\n                 : (physr & MG_BIT(4)) ? MG_PHY_SPEED_100M\n                                       : MG_PHY_SPEED_10M;\n      } else {\n        uint16_t bcr = phy->read_reg(phy_addr, MG_PHY_REG_BCR);\n        *full_duplex = bcr & MG_BIT(8);\n        *speed = (bcr & MG_BIT(13)) ? MG_PHY_SPEED_100M : MG_PHY_SPEED_10M;\n      }\n    } else if (id1 == MG_PHY_ICS1894x) {\n      uint16_t poll_reg = phy->read_reg(phy_addr, MG_PHY_ICS189432_REG_POLL);\n      *full_duplex = poll_reg & MG_BIT(14);\n      *speed = (poll_reg & MG_BIT(15)) ? MG_PHY_SPEED_100M : MG_PHY_SPEED_10M;\n    }\n  }\n  return up;\n}\n"
  },
  {
    "path": "src/drivers/phy.h",
    "content": "#pragma once\n\n#include \"net_builtin.h\"\n\nstruct mg_phy {\n  uint16_t (*read_reg)(uint8_t addr, uint8_t reg);\n  void (*write_reg)(uint8_t addr, uint8_t reg, uint16_t value);\n};\n\n// PHY configuration settings, bitmask\nenum {\n  // Set if PHY LEDs are connected to ground\n  MG_PHY_LEDS_ACTIVE_HIGH = (1 << 0),\n  // Set when PHY clocks MAC. Otherwise, MAC clocks PHY\n  MG_PHY_CLOCKS_MAC = (1 << 1)\n};\n\nenum { MG_PHY_SPEED_10M, MG_PHY_SPEED_100M, MG_PHY_SPEED_1000M };\n\nvoid mg_phy_init(struct mg_phy *, uint8_t addr, uint8_t config);\nbool mg_phy_up(struct mg_phy *, uint8_t addr, bool *full_duplex,\n               uint8_t *speed);\n"
  },
  {
    "path": "src/drivers/pico-w.c",
    "content": "#if MG_ENABLE_TCPIP && MG_ARCH == MG_ARCH_PICOSDK && \\\n    defined(MG_ENABLE_DRIVER_PICO_W) && MG_ENABLE_DRIVER_PICO_W\n\n#include \"drivers/pico-w.h\"\n#include \"net_builtin.h\"\n#include \"pico/stdlib.h\"\n\nstatic struct mg_tcpip_if *s_ifp;\nstatic uint32_t s_ip, s_mask;\nstatic bool s_aplink = false, s_scanning = false;\nstatic bool s_stalink = false, s_connecting = false;\n\nstatic void wifi_cb(struct mg_tcpip_if *ifp, int ev, void *ev_data) {\n  struct mg_wifi_data *wifi =\n      &((struct mg_tcpip_driver_pico_w_data *) ifp->driver_data)->wifi;\n  if (wifi->apmode && ev == MG_TCPIP_EV_ST_CHG &&\n      *(uint8_t *) ev_data == MG_TCPIP_STATE_UP) {\n    MG_DEBUG((\"Access Point started\"));\n    s_ip = ifp->ip, ifp->ip = wifi->apip;\n    s_mask = ifp->mask, ifp->mask = wifi->apmask;\n    ifp->enable_dhcp_client = false;\n    ifp->enable_dhcp_server = true;\n  }\n}\n\nstatic bool mg_tcpip_driver_pico_w_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_pico_w_data *d =\n      (struct mg_tcpip_driver_pico_w_data *) ifp->driver_data;\n  struct mg_wifi_data *wifi = &d->wifi;\n  s_ifp = ifp;\n  s_ip = ifp->ip;\n  s_mask = ifp->mask;\n  ifp->pfn = wifi_cb;\n  if (cyw43_arch_init() != 0)\n    return false;  // initialize async_context and WiFi chip\n  if (wifi->apmode && wifi->apssid != NULL) {\n    if (!mg_wifi_ap_start(wifi)) return false;\n    cyw43_wifi_get_mac(&cyw43_state, CYW43_ITF_STA, ifp->mac);  // same MAC\n  } else {\n    cyw43_arch_enable_sta_mode();\n    cyw43_wifi_get_mac(&cyw43_state, CYW43_ITF_STA, ifp->mac);\n    if (wifi->ssid != NULL) {\n      return mg_wifi_connect(wifi);\n    } else {\n      cyw43_arch_disable_sta_mode();\n    }\n  }\n  return true;\n}\n\nstatic size_t mg_tcpip_driver_pico_w_tx(const void *buf, size_t len,\n                                        struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_pico_w_data *d =\n      (struct mg_tcpip_driver_pico_w_data *) ifp->driver_data;\n  return cyw43_send_ethernet(&cyw43_state,\n                             d->wifi.apmode ? CYW43_ITF_AP : CYW43_ITF_STA, len,\n                             buf, false) == 0\n             ? len\n             : 0;\n}\n\nstatic bool mg_tcpip_driver_pico_w_poll(struct mg_tcpip_if *ifp, bool s1) {\n  cyw43_arch_poll();  // not necessary, except when IRQs are disabled (OTA)\n  if (s_scanning && !cyw43_wifi_scan_active(&cyw43_state)) {\n    MG_VERBOSE((\"scan complete\"));\n    s_scanning = 0;\n    mg_tcpip_call(ifp, MG_TCPIP_EV_WIFI_SCAN_END, NULL);\n  }\n  if (ifp->update_mac_hash_table) {\n    // first call to _poll() is after _init(), so this is safe\n    cyw43_wifi_update_multicast_filter(&cyw43_state, (uint8_t *) mcast_addr,\n                                       true);\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  struct mg_tcpip_driver_pico_w_data *d =\n      (struct mg_tcpip_driver_pico_w_data *) ifp->driver_data;\n  if (d->wifi.apmode) return s_aplink;\n  int sdkstate = cyw43_wifi_link_status(&cyw43_state, CYW43_ITF_STA);\n  MG_VERBOSE((\"conn: %c state: %d\", s_connecting ? '1' : '0', sdkstate));\n  if (sdkstate < 0 && s_connecting) {\n    mg_tcpip_call(ifp, MG_TCPIP_EV_WIFI_CONNECT_ERR, &sdkstate);\n    s_connecting = false;\n  }\n  return s_stalink;\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_pico_w = {\n    mg_tcpip_driver_pico_w_init,\n    mg_tcpip_driver_pico_w_tx,\n    NULL,\n    mg_tcpip_driver_pico_w_poll,\n};\n\n// Called once per outstanding frame by async_context\nvoid cyw43_cb_process_ethernet(void *cb_data, int itf, size_t len,\n                               const uint8_t *buf) {\n  mg_tcpip_qwrite((void *) buf, len, s_ifp);\n  (void) cb_data;\n}\n\n// Called by async_context\nvoid cyw43_cb_tcpip_set_link_up(cyw43_t *self, int itf) {\n  if (itf == CYW43_ITF_AP) {\n    s_aplink = true;\n  } else {\n    s_stalink = true;\n    s_connecting = false;\n  }\n}\nvoid cyw43_cb_tcpip_set_link_down(cyw43_t *self, int itf) {\n  if (itf == CYW43_ITF_AP) {\n    s_aplink = false;\n  } else {\n    s_stalink = false;\n    // SDK calls this before we check status, don't clear s_connecting here\n  }\n}\n\n// there's life beyond lwIP\nvoid pbuf_copy_partial(void) {\n  (void) 0;\n}\n\nstatic int result_cb(void *arg, const cyw43_ev_scan_result_t *data) {\n  struct mg_wifi_scan_bss_data bss;\n  bss.SSID = mg_str_n(data->ssid, data->ssid_len);\n  bss.BSSID = (char *) data->bssid;\n  bss.RSSI = (int8_t) data->rssi;\n  bss.has_n = 0;  // SDK ignores this\n  bss.channel = (uint8_t) data->channel;\n  bss.band = MG_WIFI_BAND_2G;\n  // SDK-internal dependency, 2.1.0\n  bss.security = data->auth_mode & MG_BIT(0) ? MG_WIFI_SECURITY_WEP\n                                             : MG_WIFI_SECURITY_OPEN;\n  if (data->auth_mode & MG_BIT(1)) bss.security |= MG_WIFI_SECURITY_WPA;\n  if (data->auth_mode & MG_BIT(2)) bss.security |= MG_WIFI_SECURITY_WPA2;\n  MG_VERBOSE((\"BSS: %.*s (%u) (%M) %d dBm %u\", bss.SSID.len, bss.SSID.buf,\n              bss.channel, mg_print_mac, bss.BSSID, (int) bss.RSSI,\n              bss.security));\n  mg_tcpip_call(s_ifp, MG_TCPIP_EV_WIFI_SCAN_RESULT, &bss);\n  return 0;\n}\n\nbool mg_wifi_scan(void) {\n  cyw43_wifi_scan_options_t opts;\n  memset(&opts, 0, sizeof(opts));\n  bool res = (cyw43_wifi_scan(&cyw43_state, &opts, NULL, result_cb) == 0);\n  if (res) s_scanning = true;\n  return res;\n}\n\nbool mg_wifi_connect(struct mg_wifi_data *wifi) {\n  s_ifp->ip = s_ip;\n  s_ifp->mask = s_mask;\n  if (s_ifp->ip == 0) s_ifp->enable_dhcp_client = true;\n  s_ifp->enable_dhcp_server = false;\n  cyw43_arch_enable_sta_mode();\n  MG_DEBUG((\"Connecting to '%s'\", wifi->ssid));\n  int res = cyw43_arch_wifi_connect_async(wifi->ssid, wifi->pass,\n                                          CYW43_AUTH_WPA2_AES_PSK);\n  MG_VERBOSE((\"res: %d\", res));\n  if (res == 0) s_connecting = true;\n  return (res == 0);\n}\n\nbool mg_wifi_disconnect(void) {\n  cyw43_arch_disable_sta_mode();\n  s_connecting = false;\n  return true;\n}\n\nbool mg_wifi_ap_start(struct mg_wifi_data *wifi) {\n  MG_DEBUG((\"Starting AP '%s' (%u)\", wifi->apssid, wifi->apchannel));\n  cyw43_wifi_ap_set_channel(&cyw43_state, wifi->apchannel);\n  cyw43_arch_enable_ap_mode(wifi->apssid, wifi->appass,\n                            CYW43_AUTH_WPA2_AES_PSK);\n  return true;\n}\n\nbool mg_wifi_ap_stop(void) {\n  cyw43_arch_disable_ap_mode();\n  return true;\n}\n\n#endif\n"
  },
  {
    "path": "src/drivers/pico-w.h",
    "content": "#pragma once\n\n#if MG_ENABLE_TCPIP && MG_ARCH == MG_ARCH_PICOSDK && \\\n    defined(MG_ENABLE_DRIVER_PICO_W) && MG_ENABLE_DRIVER_PICO_W\n\n#include \"cyw43.h\"              // keep this include\n#include \"pico/cyw43_arch.h\"    // keep this include\n#include \"pico/unique_id.h\"     // keep this include\n\nstruct mg_tcpip_driver_pico_w_data {\n  struct mg_wifi_data wifi;\n};\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_pico_w_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    MG_SET_WIFI_CONFIG(&driver_data_);                            \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_pico_w;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    mif_.recv_queue.size = 8192;                                  \\\n    mif_.mac[0] = 2; /* MAC read from OTP at driver init */       \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_INFO((\"Driver: pico-w, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n"
  },
  {
    "path": "src/drivers/ppp.c",
    "content": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_PPP) && MG_ENABLE_DRIVER_PPP\n\n#define MG_PPP_FLAG 0x7e  // PPP frame delimiter\n#define MG_PPP_ESC 0x7d   // PPP escape byte for special characters\n#define MG_PPP_ADDR 0xff\n#define MG_PPP_CTRL 0x03\n\n#define MG_PPP_PROTO_IP 0x0021\n#define MG_PPP_PROTO_LCP 0xc021\n#define MG_PPP_PROTO_IPCP 0x8021\n\n#define MG_PPP_IPCP_REQ 1\n#define MG_PPP_IPCP_ACK 2\n#define MG_PPP_IPCP_NACK 3\n#define MG_PPP_IPCP_IPADDR 3\n\n#define MG_PPP_LCP_CFG_REQ 1\n#define MG_PPP_LCP_CFG_ACK 2\n#define MG_PPP_LCP_CFG_NACK 3\n#define MG_PPP_LCP_CFG_REJECT 4\n#define MG_PPP_LCP_CFG_TERM_REQ 5\n#define MG_PPP_LCP_CFG_TERM_ACK 6\n\n#define MG_PPP_AT_TIMEOUT 2000\n\nstatic size_t print_atcmd(void (*out)(char, void *), void *arg, va_list *ap) {\n  struct mg_str s = va_arg(*ap, struct mg_str);\n  for (size_t i = 0; i < s.len; i++) out(s.buf[i] < 0x20 ? '.' : s.buf[i], arg);\n  return s.len;\n}\n\nstatic void mg_ppp_reset(struct mg_tcpip_driver_ppp_data *dd) {\n  dd->script_index = 0;\n  dd->deadline = 0;\n  if (dd->reset) dd->reset(dd->uart);\n}\n\nstatic bool mg_ppp_atcmd_handle(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_ppp_data *dd =\n      (struct mg_tcpip_driver_ppp_data *) ifp->driver_data;\n  if (dd->script == NULL || dd->script_index < 0) return true;\n  if (dd->deadline == 0) dd->deadline = mg_millis() + MG_PPP_AT_TIMEOUT;\n  for (;;) {\n    if (dd->script_index % 2 == 0) {  // send AT command\n      const char *cmd = dd->script[dd->script_index];\n      MG_DEBUG((\"send AT[%d]: %M\", dd->script_index, print_atcmd, mg_str(cmd)));\n      while (*cmd) dd->tx(dd->uart, *cmd++);\n      dd->script_index++;\n      ifp->recv_queue.head = 0;\n    } else {  // check AT command response\n      const char *expect = dd->script[dd->script_index];\n      struct mg_queue *q = &ifp->recv_queue;\n      for (;;) {\n        int c;\n        int is_timeout = dd->deadline > 0 && mg_millis() > dd->deadline;\n        int is_overflow = q->head >= q->size - 1;\n        if (is_timeout || is_overflow) {\n          MG_ERROR((\"AT error: %s, retrying...\",\n                    is_timeout ? \"timeout\" : \"overflow\"));\n          mg_ppp_reset(dd);\n          return false;  // FAIL: timeout\n        }\n        if ((c = dd->rx(dd->uart)) < 0) return false;  // no data\n        q->buf[q->head++] = c;\n        if (mg_match(mg_str_n(q->buf, q->head), mg_str(expect), NULL)) {\n          MG_DEBUG((\"recv AT[%d]: %M\", dd->script_index, print_atcmd,\n                    mg_str_n(q->buf, q->head)));\n          dd->script_index++;\n          q->head = 0;\n          break;\n        }\n      }\n    }\n    if (dd->script[dd->script_index] == NULL) {\n      MG_DEBUG((\"finished AT script\"));\n      dd->script_index = -1;\n      return true;\n    }\n  }\n}\n\nstatic bool mg_ppp_init(struct mg_tcpip_if *ifp) {\n  ifp->recv_queue.size = 3000;  // MTU=1500, worst case escaping = 2x\n  return true;\n}\n\n// Calculate FCS/CRC for PPP frames. Could be implemented faster using lookup\n// tables.\nstatic uint32_t fcs_do(uint32_t fcs, uint8_t x) {\n  for (int i = 0; i < 8; i++) {\n    fcs = ((fcs ^ x) & 1) ? (fcs >> 1) ^ 0x8408 : fcs >> 1;\n    x >>= 1;\n  }\n  return fcs;\n}\n\nstatic bool mg_ppp_poll(struct mg_tcpip_if *ifp, bool s1) {\n  (void) s1;\n  return ifp->driver_data != NULL;\n}\n\n// Transmit a single byte as part of the PPP frame (escaped, if needed)\nstatic void mg_ppp_tx_byte(struct mg_tcpip_driver_ppp_data *dd, uint8_t b) {\n  if ((b < 0x20) || (b == MG_PPP_ESC) || (b == MG_PPP_FLAG)) {\n    dd->tx(dd->uart, MG_PPP_ESC);\n    dd->tx(dd->uart, b ^ 0x20);\n  } else {\n    dd->tx(dd->uart, b);\n  }\n}\n\n// Transmit a single PPP frame for the given protocol\nstatic void mg_ppp_tx_frame(struct mg_tcpip_driver_ppp_data *dd, uint16_t proto,\n                            uint8_t *data, size_t datasz) {\n  uint16_t crc;\n  uint32_t fcs = 0xffff;\n\n  dd->tx(dd->uart, MG_PPP_FLAG);\n  mg_ppp_tx_byte(dd, MG_PPP_ADDR);\n  mg_ppp_tx_byte(dd, MG_PPP_CTRL);\n  mg_ppp_tx_byte(dd, proto >> 8);\n  mg_ppp_tx_byte(dd, proto & 0xff);\n  fcs = fcs_do(fcs, MG_PPP_ADDR);\n  fcs = fcs_do(fcs, MG_PPP_CTRL);\n  fcs = fcs_do(fcs, proto >> 8);\n  fcs = fcs_do(fcs, proto & 0xff);\n  for (unsigned int i = 0; i < datasz; i++) {\n    mg_ppp_tx_byte(dd, data[i]);\n    fcs = fcs_do(fcs, data[i]);\n  }\n  crc = fcs & 0xffff;\n  mg_ppp_tx_byte(dd, ~crc);  // send CRC, note the byte order\n  mg_ppp_tx_byte(dd, ~crc >> 8);\n  dd->tx(dd->uart, MG_PPP_FLAG);  // end of frame\n}\n\n// Send Ethernet frame as PPP frame\nstatic size_t mg_ppp_tx(const void *buf, size_t len, struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_ppp_data *dd =\n      (struct mg_tcpip_driver_ppp_data *) ifp->driver_data;\n  if (ifp->state != MG_TCPIP_STATE_READY) return 0;\n  // XXX: what if not an IP protocol?\n  mg_ppp_tx_frame(dd, MG_PPP_PROTO_IP, (uint8_t *) buf + 14, len - 14);\n  return len;\n}\n\n// Given a full PPP frame, unescape it in place and verify FCS, returns actual\n// data size on success or 0 on error.\nstatic size_t mg_ppp_verify_frame(uint8_t *buf, size_t bufsz) {\n  int unpack = 0;\n  uint16_t crc;\n  size_t pktsz = 0;\n  uint32_t fcs = 0xffff;\n  for (unsigned int i = 0; i < bufsz; i++) {\n    if (unpack == 0) {\n      if (buf[i] == 0x7d) {\n        unpack = 1;\n      } else {\n        buf[pktsz] = buf[i];\n        fcs = fcs_do(fcs, buf[pktsz]);\n        pktsz++;\n      }\n    } else {\n      unpack = 0;\n      buf[pktsz] = buf[i] ^ 0x20;\n      fcs = fcs_do(fcs, buf[pktsz]);\n      pktsz++;\n    }\n  }\n  crc = fcs & 0xffff;\n  if (crc != 0xf0b8) {\n    MG_DEBUG((\"bad crc: %04x\", crc));\n    return 0;\n  }\n  if (pktsz < 6 || buf[0] != MG_PPP_ADDR || buf[1] != MG_PPP_CTRL) {\n    return 0;\n  }\n  return pktsz - 2;  // strip FCS\n}\n\n// fetch as much data as we can, until a single PPP frame is received\nstatic size_t mg_ppp_rx_frame(struct mg_tcpip_driver_ppp_data *dd,\n                              struct mg_queue *q) {\n  while (q->head < q->size) {\n    int c;\n    if ((c = dd->rx(dd->uart)) < 0) {\n      return 0;\n    }\n    if (c == MG_PPP_FLAG) {\n      if (q->head > 0) {\n        break;\n      } else {\n        continue;\n      }\n    }\n    q->buf[q->head++] = c;\n  }\n\n  size_t n = mg_ppp_verify_frame((uint8_t *) q->buf, q->head);\n  if (n == 0) {\n    MG_DEBUG((\"invalid PPP frame of %d bytes\", q->head));\n    q->head = 0;\n    return 0;\n  }\n  q->head = n;\n  return q->head;\n}\n\nstatic void mg_ppp_handle_lcp(struct mg_tcpip_if *ifp, uint8_t *lcp,\n                              size_t lcpsz) {\n  uint8_t id;\n  uint16_t len;\n  struct mg_tcpip_driver_ppp_data *dd =\n      (struct mg_tcpip_driver_ppp_data *) ifp->driver_data;\n  if (lcpsz < 4) return;\n  id = lcp[1];\n  len = (((uint16_t) lcp[2]) << 8) | (lcp[3]);\n  switch (lcp[0]) {\n    case MG_PPP_LCP_CFG_REQ: {\n      if (len == 4) {\n        MG_DEBUG((\"LCP config request of %d bytes, acknowledging...\", len));\n        lcp[0] = MG_PPP_LCP_CFG_ACK;\n        mg_ppp_tx_frame(dd, MG_PPP_PROTO_LCP, lcp, len);\n        lcp[0] = MG_PPP_LCP_CFG_REQ;\n        mg_ppp_tx_frame(dd, MG_PPP_PROTO_LCP, lcp, len);\n      } else {\n        MG_DEBUG((\"LCP config request of %d bytes, rejecting...\", len));\n        lcp[0] = MG_PPP_LCP_CFG_REJECT;\n        mg_ppp_tx_frame(dd, MG_PPP_PROTO_LCP, lcp, len);\n      }\n    } break;\n    case MG_PPP_LCP_CFG_TERM_REQ: {\n      uint8_t ack[4] = {MG_PPP_LCP_CFG_TERM_ACK, id, 0, 4};\n      MG_DEBUG((\"LCP termination request, acknowledging...\"));\n      mg_ppp_tx_frame(dd, MG_PPP_PROTO_LCP, ack, sizeof(ack));\n      mg_ppp_reset(dd);\n      ifp->state = MG_TCPIP_STATE_UP;\n      if (dd->reset) dd->reset(dd->uart);\n    } break;\n  }\n}\n\nstatic void mg_ppp_handle_ipcp(struct mg_tcpip_if *ifp, uint8_t *ipcp,\n                               size_t ipcpsz) {\n  struct mg_tcpip_driver_ppp_data *dd =\n      (struct mg_tcpip_driver_ppp_data *) ifp->driver_data;\n  uint16_t len;\n  uint8_t id;\n  uint8_t req[] = {\n      MG_PPP_IPCP_REQ, 0, 0, 10, MG_PPP_IPCP_IPADDR, 6, 0, 0, 0, 0};\n  if (ipcpsz < 4) return;\n  id = ipcp[1];\n  len = (((uint16_t) ipcp[2]) << 8) | (ipcp[3]);\n  switch (ipcp[0]) {\n    case MG_PPP_IPCP_REQ:\n      MG_DEBUG((\"got IPCP config request, acknowledging...\"));\n      if (len >= 10 && ipcp[4] == MG_PPP_IPCP_IPADDR) {\n        uint8_t *ip = ipcp + 6;\n        MG_DEBUG((\"host ip: %d.%d.%d.%d\", ip[0], ip[1], ip[2], ip[3]));\n      }\n      ipcp[0] = MG_PPP_IPCP_ACK;\n      mg_ppp_tx_frame(dd, MG_PPP_PROTO_IPCP, ipcp, len);\n      req[1] = id;\n      // Request IP address 0.0.0.0\n      mg_ppp_tx_frame(dd, MG_PPP_PROTO_IPCP, req, sizeof(req));\n      break;\n    case MG_PPP_IPCP_ACK:\n      // This usually does not happen, as our \"preferred\" IP address is invalid\n      MG_DEBUG((\"got IPCP config ack, link is online now\"));\n      ifp->state = MG_TCPIP_STATE_READY;\n      break;\n    case MG_PPP_IPCP_NACK:\n      MG_DEBUG((\"got IPCP config nack\"));\n      // NACK contains our \"suggested\" IP address, use it\n      if (len >= 10 && ipcp[4] == MG_PPP_IPCP_IPADDR) {\n        uint8_t *ip = ipcp + 6;\n        MG_DEBUG((\"ipcp ack, ip: %d.%d.%d.%d\", ip[0], ip[1], ip[2], ip[3]));\n        ipcp[0] = MG_PPP_IPCP_REQ;\n        mg_ppp_tx_frame(dd, MG_PPP_PROTO_IPCP, ipcp, len);\n        ifp->ip = ifp->mask = MG_IPV4(ip[0], ip[1], ip[2], ip[3]);\n        ifp->state = MG_TCPIP_STATE_READY;\n      }\n      break;\n  }\n}\n\nstatic size_t mg_ppp_rx(void *ethbuf, size_t ethlen, struct mg_tcpip_if *ifp) {\n  uint8_t *eth = ethbuf;\n  size_t ethsz = 0;\n  struct mg_tcpip_driver_ppp_data *dd =\n      (struct mg_tcpip_driver_ppp_data *) ifp->driver_data;\n  uint8_t *buf = (uint8_t *) ifp->recv_queue.buf;\n\n  if (!mg_ppp_atcmd_handle(ifp)) return 0;\n\n  size_t bufsz = mg_ppp_rx_frame(dd, &ifp->recv_queue);\n  if (!bufsz) return 0;\n  uint16_t proto = (((uint16_t) buf[2]) << 8) | (uint16_t) buf[3];\n  switch (proto) {\n    case MG_PPP_PROTO_LCP: mg_ppp_handle_lcp(ifp, buf + 4, bufsz - 4); break;\n    case MG_PPP_PROTO_IPCP: mg_ppp_handle_ipcp(ifp, buf + 4, bufsz - 4); break;\n    case MG_PPP_PROTO_IP:\n      MG_VERBOSE((\"got IP packet of %d bytes\", bufsz - 4));\n      memmove(eth + 14, buf + 4, bufsz - 4);\n      memmove(eth, ifp->mac, 6);\n      memmove(eth + 6, \"\\xff\\xff\\xff\\xff\\xff\\xff\", 6);\n      eth[12] = 0x08;\n      eth[13] = 0x00;\n      ethsz = bufsz - 4 + 14;\n      ifp->recv_queue.head = 0;\n      return ethsz;\n#if 0\n    default:\n      MG_DEBUG((\"unknown PPP frame:\"));\n      mg_hexdump(ppp->buf, ppp->bufsz);\n#endif\n  }\n  ifp->recv_queue.head = 0;\n  return 0;\n  (void) ethlen;\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_ppp = {mg_ppp_init, mg_ppp_tx, mg_ppp_rx,\n                                              mg_ppp_poll};\n\n#endif\n"
  },
  {
    "path": "src/drivers/ppp.h",
    "content": "#pragma once\n\nstruct mg_tcpip_driver_ppp_data {\n  void *uart;                   // Opaque UART bus descriptor\n  void (*reset)(void *);        // Modem hardware reset\n  void (*tx)(void *, uint8_t);  // UART transmit single byte\n  int (*rx)(void *);            // UART receive single byte\n  const char **script;          // List of AT commands and expected replies\n  int script_index;             // Index of the current AT command in the list\n  uint64_t deadline;            // AT command deadline in ms\n};\n"
  },
  {
    "path": "src/drivers/ra.c",
    "content": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && \\\n  (defined(MG_ENABLE_DRIVER_RA6) && MG_ENABLE_DRIVER_RA6) || \\\n  (defined(MG_ENABLE_DRIVER_RA8) && MG_ENABLE_DRIVER_RA8)\nstruct ra_etherc {\n  volatile uint32_t ECMR, RESERVED, RFLR, RESERVED1, ECSR, RESERVED2, ECSIPR,\n      RESERVED3, PIR, RESERVED4, PSR, RESERVED5[5], RDMLR, RESERVED6[3], IPGR,\n      APR, MPR, RESERVED7, RFCF, TPAUSER, TPAUSECR, BCFRR, RESERVED8[20], MAHR,\n      RESERVED9, MALR, RESERVED10, TROCR, CDCR, LCCR, CNDCR, RESERVED11, CEFCR,\n      FRECR, TSFRCR, TLFRCR, RFCR, MAFCR;\n};\n\nstruct ra_edmac {\n  volatile uint32_t EDMR, RESERVED, EDTRR, RESERVED1, EDRRR, RESERVED2, TDLAR,\n      RESERVED3, RDLAR, RESERVED4, EESR, RESERVED5, EESIPR, RESERVED6, TRSCER,\n      RESERVED7, RMFCR, RESERVED8, TFTR, RESERVED9, FDR, RESERVED10, RMCR,\n      RESERVED11[2], TFUCR, RFOCR, IOSR, FCFTR, RESERVED12, RPADIR, TRIMD,\n      RESERVED13[18], RBWAR, RDFAR, RESERVED14, TBRAR, TDFAR;\n};\n\n#undef ETHERC\n#undef EDMAC\n#undef RASYSC\n#undef ICU_IELSR\n#if defined(MG_ENABLE_DRIVER_RA8) && MG_ENABLE_DRIVER_RA8\n#define ETHERC ((struct ra_etherc *) (uintptr_t) 0x40354100U)\n#define EDMAC ((struct ra_edmac *) (uintptr_t) 0x40354000U)\n#define RASYSC ((uint32_t *) (uintptr_t) 0x4001E000U)\n#define ICU_IELSR ((uint32_t *) (uintptr_t) 0x4000C300U)\n#else\n#define ETHERC ((struct ra_etherc *) (uintptr_t) 0x40114100U)\n#define EDMAC ((struct ra_edmac *) (uintptr_t) 0x40114000U)\n#define RASYSC ((uint32_t *) (uintptr_t) 0x4001E000U)\n#define ICU_IELSR ((uint32_t *) (uintptr_t) 0x40006300U)\n#endif\n\n#define ETH_PKT_SIZE 1536  // Max frame size, multiple of 32\n#define ETH_DESC_CNT 4     // Descriptors count\n\n// Descriptors: 16-byte aligned\n// Buffers: 32-byte aligned (27.3.1)\nstatic volatile uint32_t s_rxdesc[ETH_DESC_CNT][4] MG_ETH_RAM MG_16BYTE_ALIGNED;\nstatic volatile uint32_t s_txdesc[ETH_DESC_CNT][4] MG_ETH_RAM MG_16BYTE_ALIGNED;\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM MG_32BYTE_ALIGNED;\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM MG_32BYTE_ALIGNED;\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\n\n// fastest is 3 cycles (SUB + BNE) on a 3-stage pipeline or equivalent\nstatic inline void raspin(volatile uint32_t count) {\n  while (count--) (void) 0;\n}\n// count to get the 200ns SMC semi-cycle period (2.5MHz) calling raspin():\n// SYS_FREQUENCY * 200ns / 3 = SYS_FREQUENCY / 15000000\nstatic uint32_t s_smispin;\n\n// Bit-banged SMI\nstatic void smi_preamble(void) {\n  unsigned int i = 32;\n  uint32_t pir = MG_BIT(1) | MG_BIT(2);  // write, mdio = 1, mdc = 0\n  ETHERC->PIR = pir;\n  while (i--) {\n    pir &= ~MG_BIT(0);  // mdc = 0\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n    pir |= MG_BIT(0);  // mdc = 1\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n  }\n}\nstatic void smi_wr(uint16_t header, uint16_t data) {\n  uint32_t word = (header << 16) | data;\n  smi_preamble();\n  unsigned int i = 32;\n  while (i--) {\n    uint32_t pir = MG_BIT(1) |\n                   (word & 0x80000000 ? MG_BIT(2) : 0);  // write, mdc = 0, data\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n    pir |= MG_BIT(0);  // mdc = 1\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n    word <<= 1;\n  }\n}\nstatic uint16_t smi_rd(uint16_t header) {\n  smi_preamble();\n  unsigned int i = 16;  // 2 LSb as turnaround\n  uint32_t pir;\n  while (i--) {\n    pir = (i > 1 ? MG_BIT(1) : 0) |\n          (header & 0x8000\n               ? MG_BIT(2)\n               : 0);  // mdc = 0, header, set read direction at turnaround\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n    pir |= MG_BIT(0);  // mdc = 1\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n    header <<= 1;\n  }\n  i = 16;\n  uint16_t data = 0;\n  while (i--) {\n    data <<= 1;\n    pir = 0;  // read, mdc = 0\n    ETHERC->PIR = pir;\n    raspin(s_smispin / 2);  // 1/4 clock period, 300ns max access time\n    data |= (uint16_t) (ETHERC->PIR & MG_BIT(3) ? 1 : 0);  // read mdio\n    raspin(s_smispin / 2);                                 // 1/4 clock period\n    pir |= MG_BIT(0);                                      // mdc = 1\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n  }\n  return data;\n}\n\nstatic uint16_t raeth_read_phy(uint8_t addr, uint8_t reg) {\n  return smi_rd(\n      (uint16_t) ((1 << 14) | (2 << 12) | (addr << 7) | (reg << 2) | (2 << 0)));\n}\n\nstatic void raeth_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  smi_wr(\n      (uint16_t) ((1 << 14) | (1 << 12) | (addr << 7) | (reg << 2) | (2 << 0)),\n      val);\n}\n\n// MDC clock is generated manually; as per 802.3, it must not exceed 2.5MHz\nstatic bool mg_tcpip_driver_ra_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_ra_data *d =\n      (struct mg_tcpip_driver_ra_data *) ifp->driver_data;\n  s_ifp = ifp;\n\n  // Init SMI clock timing. If user told us the clock value, use it.\n  // TODO(): Otherwise, guess\n  s_smispin = d->clock / 15000000;\n\n  // Init RX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i][0] = MG_BIT(31);             // RACT\n    s_rxdesc[i][1] = ETH_PKT_SIZE << 16;     // RBL\n    s_rxdesc[i][2] = (uint32_t) s_rxbuf[i];  // Point to data buffer\n  }\n  s_rxdesc[ETH_DESC_CNT - 1][0] |= MG_BIT(30);  // Wrap last descriptor\n\n  // Init TX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    // TACT = 0\n    s_txdesc[i][2] = (uint32_t) s_txbuf[i];\n  }\n  s_txdesc[ETH_DESC_CNT - 1][0] |= MG_BIT(30);  // Wrap last descriptor\n\n  EDMAC->EDMR = MG_BIT(0);  // Software reset, wait 64 PCLKA clocks (27.2.1)\n  uint32_t sckdivcr = RASYSC[8];  // get divisors from SCKDIVCR (8.2.2)\n  uint32_t ick = 1 << ((sckdivcr >> 24) & 7);   // sys_clock div\n  uint32_t pcka = 1 << ((sckdivcr >> 12) & 7);  // pclka div\n  raspin((64U * pcka) / (3U * ick));\n  EDMAC->EDMR = MG_BIT(6);  // Initialize, little-endian (27.2.1)\n\n  MG_DEBUG((\"PHY addr: %d, smispin: %d\", d->phy_addr, s_smispin));\n  struct mg_phy phy = {raeth_read_phy, raeth_write_phy};\n  mg_phy_init(&phy, d->phy_addr, MG_PHY_CLOCKS_MAC);\n\n  // Select RMII mode,\n  ETHERC->ECMR = MG_BIT(2) | MG_BIT(1);  // 100M, Full-duplex, CRC\n  // ETHERC->ECMR |= MG_BIT(0);             // Receive all\n  ETHERC->RFLR = 1518;  // Set max rx length\n\n  EDMAC->RDLAR = (uint32_t) (uintptr_t) s_rxdesc;\n  EDMAC->TDLAR = (uint32_t) (uintptr_t) s_txdesc;\n  // MAC address filtering (bytes in reversed order)\n  ETHERC->MAHR = (uint32_t) (ifp->mac[0] << 24U) |\n                 ((uint32_t) ifp->mac[1] << 16U) |\n                 ((uint32_t) ifp->mac[2] << 8U) | ifp->mac[3];\n  ETHERC->MALR = ((uint32_t) ifp->mac[4] << 8U) | ifp->mac[5];\n\n  EDMAC->TFTR = 0;                        // Store and forward (27.2.10)\n  EDMAC->FDR = 0x070f;                    // (27.2.11)\n  EDMAC->RMCR = MG_BIT(0);                // (27.2.12)\n  ETHERC->ECMR |= MG_BIT(6) | MG_BIT(5);  // TE RE\n  EDMAC->EESIPR = MG_BIT(18);  // FR: Enable Rx (frame) IRQ\n  EDMAC->EDRRR = MG_BIT(0);  // Receive Descriptors have changed\n  EDMAC->EDTRR = MG_BIT(0);  // Transmit Descriptors have changed\n  return true;\n}\n\n// Transmit frame\nstatic size_t mg_tcpip_driver_ra_tx(const void *buf, size_t len,\n                                    struct mg_tcpip_if *ifp) {\n  static int s_txno;  // Current descriptor index\n  if (len > sizeof(s_txbuf[ETH_DESC_CNT])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = (size_t) -1;  // fail\n  } else if ((s_txdesc[s_txno][0] & MG_BIT(31))) {\n    ifp->nerr++;\n    MG_ERROR((\"No descriptors available\"));\n    len = 0;  // retry later\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);            // Copy data\n    s_txdesc[s_txno][1] = len << 16;              // Set data len\n    s_txdesc[s_txno][0] |= MG_BIT(31) | 3 << 28;  // (27.3.1.1) mark valid\n    EDMAC->EDTRR = MG_BIT(0);                     // Transmit request\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n  return len;\n}\n\nstatic bool mg_tcpip_driver_ra_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    EDMAC->EESIPR = MG_BIT(18) | MG_BIT(7);  // FR, RMAF: Frame and mcast IRQ\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  struct mg_tcpip_driver_ra_data *d =\n      (struct mg_tcpip_driver_ra_data *) ifp->driver_data;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {raeth_read_phy, raeth_write_phy};\n  up = mg_phy_up(&phy, d->phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    // tmp = reg with flags set to the most likely situation: 100M full-duplex\n    // if(link is slow or half) set flags otherwise\n    // reg = tmp\n    uint32_t ecmr = ETHERC->ECMR | MG_BIT(2) | MG_BIT(1);  // 100M Full-duplex\n    if (speed == MG_PHY_SPEED_10M) ecmr &= ~MG_BIT(2);     // 10M\n    if (full_duplex == false) ecmr &= ~MG_BIT(1);          // Half-duplex\n    ETHERC->ECMR = ecmr;  // IRQ handler does not fiddle with these registers\n    MG_DEBUG((\"Link is %uM %s-duplex\", ecmr & MG_BIT(2) ? 100 : 10,\n              ecmr & MG_BIT(1) ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\nvoid EDMAC_IRQHandler(void);\nstatic uint32_t s_rxno;\nvoid EDMAC_IRQHandler(void) {\n  struct mg_tcpip_driver_ra_data *d =\n      (struct mg_tcpip_driver_ra_data *) s_ifp->driver_data;\n  EDMAC->EESR = MG_BIT(18) | MG_BIT(7);  // Ack IRQ in EDMAC 1st\n  ICU_IELSR[d->irqno] &= ~MG_BIT(16);  // Ack IRQ in ICU last\n  // Frame received, loop\n  for (uint32_t i = 0; i < 10; i++) {  // read as they arrive but not forever\n    uint32_t r = s_rxdesc[s_rxno][0];\n    if (r & MG_BIT(31)) break;  // exit when done\n    // skip partial/errored frames (27.3.1.2)\n    if ((r & (MG_BIT(29) | MG_BIT(28)) && !(r & MG_BIT(27)))) {\n      size_t len = s_rxdesc[s_rxno][1] & 0xffff;\n      mg_tcpip_qwrite(s_rxbuf[s_rxno], len, s_ifp);  // CRC already stripped\n    }\n    s_rxdesc[s_rxno][0] |= MG_BIT(31);\n    if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n  }\n  EDMAC->EDRRR = MG_BIT(0);  // Receive Descriptors have changed\n  // If b0 == 0, descriptors were exhausted and probably frames were dropped,\n  // (27.2.9 RMFCR counts them)\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_ra = {mg_tcpip_driver_ra_init,\n                                             mg_tcpip_driver_ra_tx, NULL,\n                                             mg_tcpip_driver_ra_poll};\n\n#endif\n"
  },
  {
    "path": "src/drivers/ra.h",
    "content": "#pragma once\n\n#if MG_ENABLE_TCPIP && \\\n  (defined(MG_ENABLE_DRIVER_RA6) && MG_ENABLE_DRIVER_RA6) || \\\n  (defined(MG_ENABLE_DRIVER_RA8) && MG_ENABLE_DRIVER_RA8)\n\nstruct mg_tcpip_driver_ra_data {\n  // MDC clock \"divider\". MDC clock is software generated,\n  uint32_t clock;    // core clock frequency in Hz\n  uint16_t irqno;    // IRQn, R_ICU->IELSR[irqno]\n  uint8_t phy_addr;  // PHY address\n};\n\n#ifndef MG_DRIVER_CLK_FREQ\n#define MG_DRIVER_CLK_FREQ 100000000UL\n#endif\n\n#ifndef MG_DRIVER_IRQ_NO\n#define MG_DRIVER_IRQ_NO 0\n#endif\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 0\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                             \\\n  do {                                                        \\\n    static struct mg_tcpip_driver_ra_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                           \\\n    driver_data_.clock = MG_DRIVER_CLK_FREQ;                  \\\n    driver_data_.irqno = MG_DRIVER_IRQ_NO;                    \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                \\\n    mif_.ip = MG_TCPIP_IP;                                    \\\n    mif_.mask = MG_TCPIP_MASK;                                \\\n    mif_.gw = MG_TCPIP_GW;                                    \\\n    mif_.driver = &mg_tcpip_driver_ra;                        \\\n    mif_.driver_data = &driver_data_;                         \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                             \\\n    mg_tcpip_init(mgr, &mif_);                                \\\n    MG_INFO((\"Driver: ra, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n"
  },
  {
    "path": "src/drivers/rw612.c",
    "content": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_RW612) && MG_ENABLE_DRIVER_RW612\n\nstruct ENET_Type {\n  volatile uint32_t RESERVED_0[1], EIR, EIMR, RESERVED_1[1], RDAR, TDAR,\n      RESERVED_2[3], ECR, RESERVED_3[6], MMFR, MSCR, RESERVED_4[7], MIBC,\n      RESERVED_5[7], RCR, RESERVED_6[15], TCR, RESERVED_7[7], PALR, PAUR, OPD,\n      TXIC[1], RESERVED_8[3], RXIC[1], RESERVED_9[5], IAUR, IALR, GAUR, GALR,\n      RESERVED_10[7], TFWR, RESERVED_11[14], RDSR, TDSR, MRBR, RESERVED_12[1],\n      RSFL, RSEM, RAEM, RAFL, TSEM, TAEM, TAFL, TIPG, FTRL, RESERVED_13[3],\n      TACC, RACC, RESERVED_14[15], RMON_T_PACKETS, RMON_T_BC_PKT, RMON_T_MC_PKT,\n      RMON_T_CRC_ALIGN, RMON_T_UNDERSIZE, RMON_T_OVERSIZE, RMON_T_FRAG,\n      RMON_T_JAB, RMON_T_COL, RMON_T_P64, RMON_T_P65TO127, RMON_T_P128TO255,\n      RMON_T_P256TO511, RMON_T_P512TO1023, RMON_T_P1024TO2047, RMON_T_P_GTE2048,\n      RMON_T_OCTETS, IEEE_T_DROP, IEEE_T_FRAME_OK, IEEE_T_1COL, IEEE_T_MCOL,\n      IEEE_T_DEF, IEEE_T_LCOL, IEEE_T_EXCOL, IEEE_T_MACERR, IEEE_T_CSERR,\n      IEEE_T_SQE, IEEE_T_FDXFC, IEEE_T_OCTETS_OK, RESERVED_15[3],\n      RMON_R_PACKETS, RMON_R_BC_PKT, RMON_R_MC_PKT, RMON_R_CRC_ALIGN,\n      RMON_R_UNDERSIZE, RMON_R_OVERSIZE, RMON_R_FRAG, RMON_R_JAB,\n      RESERVED_16[1], RMON_R_P64, RMON_R_P65TO127, RMON_R_P128TO255,\n      RMON_R_P256TO511, RMON_R_P512TO1023, RMON_R_P1024TO2047, RMON_R_P_GTE2048,\n      RMON_R_OCTETS, IEEE_R_DROP, IEEE_R_FRAME_OK, IEEE_R_CRC, IEEE_R_ALIGN,\n      IEEE_R_MACERR, IEEE_R_FDXFC, IEEE_R_OCTETS_OK, RESERVED_17[71], ATCR,\n      ATVR, ATOFF, ATPER, ATCOR, ATINC, ATSTMP, RESERVED_18[122], TGSR,\n      CHANNEL_TCSR[4], CHANNEL_TCCR[4];\n};\n\n#undef ENET\n#define ENET ((struct ENET_Type *) 0x40138000)\n\n#define ETH_PKT_SIZE 1536  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 2           // Descriptor size (words)\n\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM MG_8BYTE_ALIGNED;\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM MG_8BYTE_ALIGNED;\nstatic uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS] MG_ETH_RAM MG_8BYTE_ALIGNED;\nstatic uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS] MG_ETH_RAM MG_8BYTE_ALIGNED;\nstatic uint8_t s_txno;  // Current TX descriptor\nstatic uint8_t s_rxno;  // Current RX descriptor\n\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\n\nstatic uint16_t eth_read_phy(uint8_t addr, uint8_t reg) {\n  ENET->MMFR = MG_BIT(30) |  // Start of frame delimiter\n               MG_BIT(29) |  // Opcode\n               ((addr & 0x1f) << 23) | ((reg & 0x1f) << 18) | MG_BIT(17);\n  while ((ENET->EIR & MG_BIT(23)) == 0) (void) 0;\n  ENET->EIR |= MG_BIT(23);\n  return ENET->MMFR & 0xffff;\n}\n\nstatic void eth_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  ENET->MMFR = MG_BIT(30) |  // Start of frame delimiter\n               MG_BIT(28) |  // Opcode\n               ((addr & 0x1f) << 23) | ((reg & 0x1f) << 18) | MG_BIT(17) | val;\n  while ((ENET->EIR & MG_BIT(23)) == 0) (void) 0;\n  ENET->EIR |= MG_BIT(23);\n}\n\nstatic bool mg_tcpip_driver_rw612_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_rw612_data *d =\n      (struct mg_tcpip_driver_rw612_data *) ifp->driver_data;\n  s_ifp = ifp;\n  ENET->MSCR = ((d->mdc_cr & 0x3f) << 1) | ((d->mdc_holdtime & 7) << 8);\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  mg_phy_init(&phy, d->phy_addr, 0);\n  ENET->ECR |= MG_BIT(0);  // reset ETH\n\n  // initialize descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i][1] = (uint32_t) s_rxbuf[i];\n    s_rxdesc[i][0] = MG_BIT(31);  // OWN\n    if (i == ETH_DESC_CNT - 1) {\n      s_rxdesc[i][0] |= MG_BIT(29);  // mark last descriptor\n    }\n    s_txdesc[i][1] = (uint32_t) s_txbuf[i];\n    if (i == ETH_DESC_CNT - 1) {\n      s_txdesc[i][0] |= MG_BIT(29);  // mark last descriptor\n    }\n  }\n\n  ENET->RCR = (ENET->RCR & (0xffff << 16)) | MG_BIT(14) | MG_BIT(8) | MG_BIT(2);\n  ENET->TCR = MG_BIT(2);  // full duplex\n  ENET->TDSR = (uint32_t) &s_txdesc[0][0];\n  ENET->RDSR = (uint32_t) &s_rxdesc[0][0];\n  ENET->MRBR = ETH_PKT_SIZE;\n  ENET->PALR =\n      ifp->mac[0] << 24 | ifp->mac[1] << 16 | ifp->mac[2] << 8 | ifp->mac[3];\n  ENET->PAUR |= (ifp->mac[4] << 24 | ifp->mac[5] << 16);\n  ENET->IALR = 0;\n  ENET->IAUR = 0;\n  ENET->GALR = 0;\n  ENET->GAUR = 0;\n  ENET->MSCR = ((d->mdc_cr & 0x3f) << 1) | ((d->mdc_holdtime & 7) << 8);\n  ENET->EIMR = MG_BIT(25);             // Enable RX interrupt\n  ENET->ECR |= MG_BIT(8) | MG_BIT(1);  // DBSWP, Enable\n  ENET->RDAR = 0;                      // activate RX descriptors ring\n  return true;\n}\n\nstatic size_t mg_tcpip_driver_rw612_tx(const void *buf, size_t len,\n                                       struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // Frame is too big\n  } else if (((s_txdesc[s_txno][0] & MG_BIT(31)) != 0)) {\n    ifp->nerr++;\n    MG_ERROR((\"No free descriptors\"));\n    len = 0;  // All descriptors are busy, fail\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);\n    s_txdesc[s_txno][0] = len | MG_BIT(27) | MG_BIT(26);  // last buffer, crc\n    if (s_txno == ETH_DESC_CNT - 1) {\n      s_txdesc[s_txno][0] |= MG_BIT(29);  // wrap\n    }\n    s_txdesc[s_txno][0] |= MG_BIT(31);  // release ownership\n    MG_DSB();\n    ENET->TDAR = 0;\n    // MG_INFO((\"s_txdesc[%d][0]: 0x%x\", s_txno, s_txdesc[s_txno][0]));\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n\n  return len;\n}\n\n\nstatic void mg_tcpip_driver_rw612_update_hash_table(struct mg_tcpip_if *ifp) {\n  // TODO(): read database, rebuild hash table\n  ENET->GAUR = MG_BIT(1); // see imxrt, it reduces to this for mDNS\n  (void) ifp;\n}\n\nstatic bool mg_tcpip_driver_rw612_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    mg_tcpip_driver_rw612_update_hash_table(ifp);\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  struct mg_tcpip_driver_rw612_data *d =\n      (struct mg_tcpip_driver_rw612_data *) ifp->driver_data;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  up = mg_phy_up(&phy, d->phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    // tmp = reg with flags set to the most likely situation: 100M full-duplex\n    // if(link is slow or half) set flags otherwise\n    // reg = tmp\n    if (speed == MG_PHY_SPEED_100M && (ENET->RCR & MG_BIT(9))) {\n      ENET->RCR &= ~MG_BIT(9);\n    } else if (speed == MG_PHY_SPEED_10M && (ENET->RCR & MG_BIT(9)) == 0) {\n      ENET->RCR |= MG_BIT(9);\n    }\n    if (full_duplex && (ENET->TCR & MG_BIT(2)) == 0) {\n      ENET->ECR &= ~MG_BIT(1);\n      ENET->TCR |= MG_BIT(2);\n      ENET->ECR |= MG_BIT(1);\n    } else if (!full_duplex && (ENET->TCR & MG_BIT(2))) {\n      ENET->ECR &= ~MG_BIT(1);\n      ENET->TCR &= ~MG_BIT(2);\n      ENET->ECR |= MG_BIT(1);\n    }\n    MG_INFO((\"Link is %uM %s-duplex\",\n             speed == MG_PHY_SPEED_10M\n                 ? 10\n                 : (speed == MG_PHY_SPEED_100M ? 100 : 1000),\n             full_duplex ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\nvoid ENET_IRQHandler(void) {\n  if (ENET->EIR & MG_BIT(25)) {\n    ENET->EIR = MG_BIT(25);              // Ack RX\n    for (uint32_t i = 0; i < 10; i++) {  // read as they arrive but not forever\n      if ((s_rxdesc[s_rxno][0] & MG_BIT(31)) != 0) break;  // exit when done\n      // skip partial/errored frames\n      if ((s_rxdesc[s_rxno][0] & MG_BIT(27)) &&\n          !(s_rxdesc[s_rxno][0] &\n            (MG_BIT(21) | MG_BIT(20) | MG_BIT(18) | MG_BIT(17) | MG_BIT(16)))) {\n        size_t len = s_rxdesc[s_rxno][0] & 0xffff;\n        mg_tcpip_qwrite(s_rxbuf[s_rxno], len, s_ifp);\n        s_rxdesc[s_rxno][0] |= MG_BIT(31);  // OWN bit: handle control to DMA\n        MG_DSB();\n        ENET->RDAR = 0;\n        if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n      }\n    }\n  }\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_rw612 = {mg_tcpip_driver_rw612_init,\n                                                mg_tcpip_driver_rw612_tx, NULL,\n                                                mg_tcpip_driver_rw612_poll};\n#endif\n"
  },
  {
    "path": "src/drivers/rw612.h",
    "content": "#pragma once\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_RW612) && MG_ENABLE_DRIVER_RW612\n\nstruct mg_tcpip_driver_rw612_data {\n  // 38.1.8 MII Speed Control Register (MSCR)\n  // MDC clock frequency must not exceed 2.5 MHz and is calculated as follows:\n  // MDC_freq = P_clock / ((mdc_cr + 1) * 2), where P_clock is the\n  // peripheral bus clock.\n  // IEEE802.3 clause 22 defines a minimum of 10 ns for the hold time on the\n  // MDIO output. Depending on the host bus frequency, the setting may need\n  // to be increased.\n  int mdc_cr;\n  int mdc_holdtime; // Valid values: [0-7]\n  uint8_t phy_addr;\n};\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 2\n#endif\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 51\n#endif\n\n#ifndef MG_DRIVER_MDC_HOLDTIME\n#define MG_DRIVER_MDC_HOLDTIME 3\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_rw612_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                       \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                    \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_rw612;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                                 \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_INFO((\"Driver: rw612, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n"
  },
  {
    "path": "src/drivers/same54.c",
    "content": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_SAME54) && \\\n    MG_ENABLE_DRIVER_SAME54\n\nstruct GMAC_REGS_ {\n  uint32_t GMAC_NCR, GMAC_NCFGR, GMAC_NSR, GMAC_UR, GMAC_DCFGR, GMAC_TSR,\n      GMAC_RBQB, GMAC_TBQB, GMAC_RSR, GMAC_ISR, GMAC_IER, GMAC_IDR, GMAC_IMR,\n      GMAC_MAN, GMAC_RPQ, GMAC_TPQ, GMAC_TPSF, GMAC_RPSF, GMAC_RJFML,\n      Reserved1[13], GMAC_HRB, GMAC_HRT, GMAC_SAB0, GMAC_SAT0, GMAC_SAB1,\n      GMAC_SAT1, GMAC_SAB2, GMAC_SAT2, GMAC_SAB3, GMAC_SAT3, GMAC_TIDM[4],\n      GMAC_WOL, GMAC_IPGS, GMAC_SVLAN, GMAC_TPFCP, GMAC_SAMB1, GMAC_SAMT1,\n      Reserved2[3], GMAC_NSC, GMAC_SCL, GMAC_SCH, GMAC_EFTSH, GMAC_EFRSH,\n      GMAC_PEFTSH, GMAC_PEFRSH, Reserved3[2], GMAC_OTLO, GMAC_OTHI, GMAC_FT,\n      GMAC_BCFT, GMAC_MFT, GMAC_PFT, GMAC_BFT64, GMAC_TBFT127, GMAC_TBFT255,\n      GMAC_TBFT511, GMAC_TBFT1023, GMAC_TBFT1518, GMAC_GTBFT1518, GMAC_TUR,\n      GMAC_SCF, GMAC_MCF, GMAC_EC, GMAC_LC, GMAC_DTF, GMAC_CSE, GMAC_ORLO,\n      GMAC_ORHI, GMAC_FR, GMAC_BCFR, GMAC_MFR, GMAC_PFR, GMAC_BFR64,\n      GMAC_TBFR127, GMAC_TBFR255, GMAC_TBFR511, GMAC_TBFR1023, GMAC_TBFR1518,\n      GMAC_TMXBFR, GMAC_UFR, GMAC_OFR, GMAC_JR, GMAC_FCSE, GMAC_LFFE, GMAC_RSE,\n      GMAC_AE, GMAC_RRE, GMAC_ROE, GMAC_IHCE, GMAC_TCE, GMAC_UCE, Reserved4[2],\n      GMAC_TISUBN, GMAC_TSH, Reserved5, GMAC_TSSSL, GMAC_TSSN, GMAC_TSL,\n      GMAC_TN, GMAC_TA, GMAC_TI, GMAC_EFTSL, GMAC_EFTN, GMAC_EFRSL, GMAC_EFRN,\n      GMAC_PEFTSL, GMAC_PEFTN, GMAC_PEFRSL, GMAC_PEFRN, Reserved6[28],\n      GMAC_RLPITR, GMAC_RLPITI, GMAC_TLPITR, GMAC_TLPITI;\n};\n\nstruct GCLK_REGS_ {\n  uint32_t GCLK_CTRLA_RESERVED, GCLK_SYNCBUSY, Reserved2[6], GCLK_GENCTRL[12],\n      Reserved3[12], GCLK_PCHCTRL[48];\n};\n\n#define GMAC_REGS ((struct GMAC_REGS_ *) 0x42000800)\n#define GCLK_REGS ((struct GCLK_REGS_ *) 0x40001c00)\n\n#define ETH_PKT_SIZE 1536  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 2           // Descriptor size (words)\n\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE];\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE];\nstatic uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS];  // RX descriptors\nstatic uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS];  // TX descriptors\nstatic uint8_t s_txno;                           // Current TX descriptor\nstatic uint8_t s_rxno;                           // Current RX descriptor\n\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\n\nstatic uint16_t eth_read_phy(uint8_t addr, uint8_t reg) {\n  GMAC_REGS->GMAC_MAN = MG_BIT(30) |  // Clause 22\n                        MG_BIT(29) |  // Setting the read operation\n                        MG_BIT(17) | ((addr & 0x1f) << 23) |  // PHY address\n                        ((reg & 0x1f) << 18);  // Setting the register\n  while (!(GMAC_REGS->GMAC_NSR & MG_BIT(2))) (void) 0;\n  return GMAC_REGS->GMAC_MAN & 0xffff;  // Getting the read value\n}\n\nstatic void eth_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  GMAC_REGS->GMAC_MAN = MG_BIT(30) |\n                        MG_BIT(28) |  // Setting the write operation\n                        MG_BIT(17) | ((addr & 0x1f) << 23) |  // PHY address\n                        ((reg & 0x1f) << 18) | val;  // Setting the register\n  while (!(GMAC_REGS->GMAC_NSR & MG_BIT(2)))\n    ;  // Waiting until the write op is complete\n}\n\nuint32_t get_clock_rate(struct mg_tcpip_driver_same54_data *d) {\n  if (d && d->mdc_cr >= 0 && d->mdc_cr <= 5) {\n    return d->mdc_cr;\n  } else {\n    // get MCLK from GCLK_GENERATOR 0\n    uint32_t div = 512;\n    uint32_t mclk;\n    if (!(GCLK_REGS->GCLK_GENCTRL[0] & MG_BIT(12))) {\n      div = ((GCLK_REGS->GCLK_GENCTRL[0] & 0x00FF0000) >> 16);\n      if (div == 0) div = 1;\n    }\n    switch (GCLK_REGS->GCLK_GENCTRL[0] & 0xF) {\n      case 0:               // GCLK_GENCTRL_SRC_XOSC0_Val\n        mclk = 32000000UL;  // 32MHz\n        break;\n      case 1:               // GCLK_GENCTRL_SRC_XOSC1_Val\n        mclk = 32000000UL;  // 32MHz\n        break;\n      case 4:            // GCLK_GENCTRL_SRC_OSCULP32K_Val\n        mclk = 32000UL;  // 32Khz\n        break;\n      case 5:            // GCLK_GENCTRL_SRC_XOSC32K_Val\n        mclk = 32000UL;  // 32Khz\n        break;\n      case 6:               // GCLK_GENCTRL_SRC_DFLL_Val\n        mclk = 48000000UL;  // 48MHz\n        break;\n      case 7:                // GCLK_GENCTRL_SRC_DPLL0_Val:\n        mclk = 200000000UL;  // 200MHz\n        break;\n      case 8:                // GCLK_GENCTRL_SRC_DPLL1_Val\n        mclk = 200000000UL;  // 200MHz\n        break;\n      default:\n        mclk = 200000000UL;  // 200MHz\n    }\n\n    mclk /= div;\n    uint8_t crs[] = {0, 1, 2, 3, 4, 5};            // GMAC->NCFGR::CLK values\n    uint8_t dividers[] = {8, 16, 32, 48, 64, 96};  // Respective CLK dividers\n    for (int i = 0; i < 6; i++) {\n      if (mclk / dividers[i] <= 2375000UL) {  // 2.5MHz - 5%\n        return crs[i];\n      }\n    }\n\n    return 5;\n  }\n}\n\nstatic bool mg_tcpip_driver_same54_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_same54_data *d =\n      (struct mg_tcpip_driver_same54_data *) ifp->driver_data;\n  s_ifp = ifp;\n\n  GMAC_REGS->GMAC_NCFGR = get_clock_rate(d) << 18;  // Set MDC divider\n  GMAC_REGS->GMAC_NCR = 0;                          // Disable RX & TX\n  GMAC_REGS->GMAC_NCR |= MG_BIT(4);                 // Enable MDC & MDIO\n\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  mg_phy_init(&phy, d->phy_addr, 0);\n\n  for (int i = 0; i < ETH_DESC_CNT; i++) {   // Init TX descriptors\n    s_txdesc[i][0] = (uint32_t) s_txbuf[i];  // Point to data buffer\n    s_txdesc[i][1] = MG_BIT(31);             // OWN bit\n  }\n  s_txdesc[ETH_DESC_CNT - 1][1] |= MG_BIT(30);  // Last tx descriptor - wrap\n\n  GMAC_REGS->GMAC_DCFGR = (0x18 << 16) |     // DMA recv buf 1536\n                          (3 << 8) |         // RXBMS\n                          MG_BIT(10);        // See #2487\n  for (int i = 0; i < ETH_DESC_CNT; i++) {   // Init RX descriptors\n    s_rxdesc[i][0] = (uint32_t) s_rxbuf[i];  // Address of the data buffer\n    s_rxdesc[i][1] = 0;                      // Clear status\n  }\n  s_rxdesc[ETH_DESC_CNT - 1][0] |= MG_BIT(1);  // Last rx descriptor - wrap\n\n  GMAC_REGS->GMAC_TBQB = (uint32_t) s_txdesc;  // about the descriptor addresses\n  GMAC_REGS->GMAC_RBQB = (uint32_t) s_rxdesc;  // Let the controller know\n\n  GMAC_REGS->GMAC_SAB0 =\n      MG_U32(ifp->mac[3], ifp->mac[2], ifp->mac[1], ifp->mac[0]);\n  GMAC_REGS->GMAC_SAT0 = MG_U32(0, 0, ifp->mac[5], ifp->mac[4]);\n\n  GMAC_REGS->GMAC_UR &= ~MG_BIT(0);                 // Disable MII, use RMII\n  GMAC_REGS->GMAC_NCFGR |= MG_BIT(8) | MG_BIT(6) |  // MAXFX, MTIHEN\n                           MG_BIT(25) | MG_BIT(4);  // EFRHD, CAF\n  GMAC_REGS->GMAC_TSR = 0x17f;                      // all transmit statuses\n  GMAC_REGS->GMAC_RSR = 0xf;                        // all recv statuses\n  GMAC_REGS->GMAC_IDR = ~0U;  // Disable interrupts, then enable required\n  GMAC_REGS->GMAC_IER = MG_BIT(11) | MG_BIT(10) |  // HRESP, ROVR\n                        MG_BIT(7) | MG_BIT(6) |    // TCOMP, TFC\n                        MG_BIT(5) | MG_BIT(4) |    // RLEX, TUR\n                        MG_BIT(2) | MG_BIT(1);     // RXUBR, RCOMP\n  GMAC_REGS->GMAC_NCR |= MG_BIT(3) | MG_BIT(2);    // TXEN, RXEN\n\n  return true;\n}\n\nstatic size_t mg_tcpip_driver_same54_tx(const void *buf, size_t len,\n                                        struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // Frame is too big\n  } else if ((s_txdesc[s_txno][1] & MG_BIT(31)) == 0) {\n    ifp->nerr++;\n    MG_ERROR((\"No free descriptors\"));\n    len = 0;  // All descriptors are busy, fail\n  } else {\n    uint32_t status = len | MG_BIT(15);  // Frame length, last chunk\n    if (s_txno == ETH_DESC_CNT - 1) status |= MG_BIT(30);  // wrap\n    memcpy(s_txbuf[s_txno], buf, len);                     // Copy data\n    s_txdesc[s_txno][1] = status;\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n  MG_DSB();                          // Ensure descriptors have been written\n  GMAC_REGS->GMAC_NCR |= MG_BIT(9);  // Enable transmission\n  return len;\n}\n\nstatic void mg_tcpip_driver_same54_update_hash_table(struct mg_tcpip_if *ifp) {\n  // TODO(): read database, rebuild hash table\n  // Setting Hash Index for 01:00:5e:00:00:fb (multicast)\n  // 24.6.9 Hash addressing\n  // computed hash is 55, which means bit 23 (55 - 32) in\n  // HRT register must be set\n  GMAC_REGS->GMAC_HRT = MG_BIT(23);\n  GMAC_REGS->GMAC_NCFGR |= MG_BIT(6);  // enable multicast hash filtering\n  (void) ifp;\n}\n\nstatic bool mg_tcpip_driver_same54_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    mg_tcpip_driver_same54_update_hash_table(ifp);\n    ifp->update_mac_hash_table = false;\n  }\n\n  bool up = false;\n  if (s1) {\n    uint8_t speed = MG_PHY_SPEED_10M;\n    bool full_duplex = false;\n    struct mg_phy phy = {eth_read_phy, eth_write_phy};\n    up = mg_phy_up(&phy, 0, &full_duplex, &speed);\n\n    // If PHY is ready, update NCFGR accordingly\n    if (ifp->state == MG_TCPIP_STATE_DOWN && up) {\n      GMAC_REGS->GMAC_NCFGR =\n          (GMAC_REGS->GMAC_NCFGR & ~(MG_BIT(0) | MG_BIT(1))) | (speed & 1) |\n          (full_duplex << 1);\n    }\n  }\n  return up;\n}\n\nvoid GMAC_Handler(void);\nvoid GMAC_Handler(void) {\n  uint32_t isr = GMAC_REGS->GMAC_ISR;\n  uint32_t rsr = GMAC_REGS->GMAC_RSR;\n  uint32_t tsr = GMAC_REGS->GMAC_TSR;\n  if (isr & MG_BIT(1)) {\n    if (rsr & MG_BIT(1)) {\n      for (uint8_t i = 0; i < ETH_DESC_CNT; i++) {\n        if ((s_rxdesc[s_rxno][0] & MG_BIT(0)) == 0) break;\n        size_t len = s_rxdesc[s_rxno][1] & (MG_BIT(13) - 1);\n        mg_tcpip_qwrite(s_rxbuf[s_rxno], len, s_ifp);\n        s_rxdesc[s_rxno][0] &= ~MG_BIT(0);  // Disown\n        if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n      }\n    }\n  }\n\n  if (tsr != 0) {\n    // MG_INFO((\" --> %#x %#x\", s_txdesc[s_txno][1], tsr));\n    if (!(s_txdesc[s_txno][1] & MG_BIT(31))) s_txdesc[s_txno][1] |= MG_BIT(31);\n  }\n\n  GMAC_REGS->GMAC_RSR = rsr;\n  GMAC_REGS->GMAC_TSR = tsr;\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_same54 = {\n    mg_tcpip_driver_same54_init, mg_tcpip_driver_same54_tx, NULL,\n    mg_tcpip_driver_same54_poll};\n#endif\n"
  },
  {
    "path": "src/drivers/same54.h",
    "content": "#pragma once\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_SAME54) && \\\n    MG_ENABLE_DRIVER_SAME54\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 5\n#endif\n\n#ifndef MG_DRIVER_PHY_ADDR\n#define MG_DRIVER_PHY_ADDR 0\n#endif\n\nstruct mg_tcpip_driver_same54_data {\n  int mdc_cr;\n  uint8_t phy_addr;\n};\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_same54_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                       \\\n    driver_data_.phy_addr = MG_DRIVER_PHY_ADDR;                   \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_same54;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                                 \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_INFO((\"Driver: same54, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n"
  },
  {
    "path": "src/drivers/sdio.c",
    "content": "#include \"sdio.h\"\n\n#if MG_ENABLE_TCPIP && \\\n    (defined(MG_ENABLE_DRIVER_CYW_SDIO) && MG_ENABLE_DRIVER_CYW_SDIO)\n\n// SDIO 6.9 Table 6-1 CCCR (Common Card Control Registers)\n#define MG_SDIO_CCCR_SDIOREV 0x000\n#define MG_SDIO_CCCR_SDREV 0x001\n#define MG_SDIO_CCCR_IOEN 0x002\n#define MG_SDIO_CCCR_IORDY 0x003\n#define MG_SDIO_CCCR_INTEN 0x004\n#define MG_SDIO_CCCR_BIC 0x007\n#define MG_SDIO_CCCR_CCAP 0x008\n#define MG_SDIO_CCCR_CCIS 0x009     // 3 registers\n#define MG_SDIO_CCCR_F0BLKSZ 0x010  // 2 registers\n#define MG_SDIO_CCCR_HISPD 0x013\n// SDIO 6.10 Table 6-3 FBR (Function Basic Registers)\n#define MG_SDIO_FBR_FnBLKSZ(n) (((n) &7) * 0x100 + 0x10)  // 2 registers\n\n// SDIO 5.1 IO_RW_DIRECT Command (CMD52)\n#define MG_SDIO_DATA(x) ((x) &0xFF)            // bits 0-7\n#define MG_SDIO_ADDR(x) (((x) &0x1FFFF) << 9)  // bits 9-25\n#define MG_SDIO_FUNC(x) (((x) &3) << 28)       // bits 28-30 (30 unused here)\n#define MG_SDIO_WR MG_BIT(31)\n\n// SDIO 5.3 IO_RW_EXTENDED Command (CMD53)\n#define MG_SDIO_LEN(x) ((x) &0x1FF)  // bits 0-8\n#define MG_SDIO_OPINC MG_BIT(26)\n#define MG_SDIO_BLKMODE MG_BIT(27)\n\n// - Drivers set blocksize, drivers request transfers. Requesting a read\n// transfer > blocksize means block transfer will be used.\n// - To simplify the use of DMA transfers and avoid intermediate buffers,\n// drivers must have room to accomodate a whole block transfer, e.g.: blocksize\n// = 64, read 65 => 2 blocks = 128 bytes\n// - Transfers of more than 1 byte assume (uint32_t *) data. 1-byte transfers\n// use (uint8_t *) data\n// - 'len' is the number of _bytes_ to transfer\nbool mg_sdio_transfer(struct mg_tcpip_sdio *sdio, bool write, unsigned int f,\n                      uint32_t addr, void *data, uint32_t len) {\n  uint32_t arg, val = 0;\n  unsigned int blksz = 64;  // TODO(): mg_sdio_set_blksz() stores in an array,\n                            // index on f, skip if 0\n  if (len == 1) {\n    arg = (write ? MG_SDIO_WR : 0) | MG_SDIO_FUNC(f) | MG_SDIO_ADDR(addr) |\n          (write ? MG_SDIO_DATA(*(uint8_t *) data) : 0);\n    bool res = sdio->txn(sdio, 52, arg, &val);  // IO_RW_DIRECT\n    if (!write) *(uint8_t *) data = (uint8_t) val;\n    return res;\n  }\n  // IO_RW_EXTENDED\n  arg = (write ? MG_SDIO_WR : 0) | MG_SDIO_OPINC | MG_SDIO_FUNC(f) |\n        MG_SDIO_ADDR(addr);\n  if (len > 512 || (blksz != 0 && len > blksz)) {  // SDIO 5.3 512 -> len=0\n    unsigned int blkcnt;\n    if (blksz == 0) return false;  // > 512 requires block size set\n    blkcnt = (len + blksz - 1) / blksz;\n    if (blkcnt > 511) return false;  // we don't support \"infinite\" blocks\n    arg |= MG_SDIO_BLKMODE | MG_SDIO_LEN(blkcnt);  // block transfer\n    len = blksz * blkcnt;\n  } else {\n    arg |= MG_SDIO_LEN(len);  // multi-byte transfer\n  }\n  return sdio->xfr(sdio, write, arg,\n                   (arg & MG_SDIO_BLKMODE) ? (uint16_t) blksz : 0,\n                   (uint32_t *) data, len, &val);\n}\n\nbool mg_sdio_set_blksz(struct mg_tcpip_sdio *sdio, unsigned int f,\n                       uint16_t blksz) {\n  uint32_t val = blksz & 0xff;\n  if (!mg_sdio_transfer(sdio, true, 0, MG_SDIO_FBR_FnBLKSZ(f), &val, 1))\n    return false;\n  val = (blksz >> 8) & 0x0f;  // SDIO 6.10 Table 6-4, max 2048\n  if (!mg_sdio_transfer(sdio, true, 0, MG_SDIO_FBR_FnBLKSZ(f) + 1, &val, 1))\n    return false;\n  // TODO(): store in an array, index on f. Static 8-element array\n  MG_VERBOSE((\"F%c block size set\", (f & 7) + '0'));\n  return true;\n}\n\n// Enable Fx\nbool mg_sdio_enable_f(struct mg_tcpip_sdio *sdio, unsigned int f) {\n  uint8_t bit = 1U << (f & 7), bits;\n  uint32_t val = 0;\n  if (!mg_sdio_transfer(sdio, false, 0, MG_SDIO_CCCR_IOEN, &val, 1))\n    return false;\n  bits = (uint8_t) val | bit;\n  unsigned int times = 501;\n  while (times--) {\n    val = bits; /* IOEf */\n    ;\n    if (!mg_sdio_transfer(sdio, true, 0, MG_SDIO_CCCR_IOEN, &val, 1))\n      return false;\n    mg_delayms(1);\n    val = 0;\n    if (!mg_sdio_transfer(sdio, false, 0, MG_SDIO_CCCR_IOEN, &val, 1))\n      return false;\n    if (val & bit) break;\n  }\n  if (times == (unsigned int) ~0) return false;\n  MG_VERBOSE((\"F%c enabled\", (f & 7) + '0'));\n  return true;\n}\n\n// Wait for Fx to be ready\nbool mg_sdio_waitready_f(struct mg_tcpip_sdio *sdio, unsigned int f) {\n  uint8_t bit = 1U << (f & 7);\n  unsigned int times = 501;\n  while (times--) {\n    uint32_t val;\n    if (!mg_sdio_transfer(sdio, false, 0, MG_SDIO_CCCR_IORDY, &val, 1))\n      return false;\n    if (val & bit) break;  // IORf\n    mg_delayms(1);\n  }\n  if (times == (unsigned int) ~0) return false;\n  MG_VERBOSE((\"F%c ready\", (f & 7) + '0'));\n  return true;\n}\n\n// SDIO 6.14 Bus State Diagram\nbool mg_sdio_init(struct mg_tcpip_sdio *sdio) {\n  uint32_t val = 0;\n  if (!sdio->txn(sdio, 0, 0, NULL)) return false;  // GO_IDLE_STATE\n  sdio->txn(sdio, 5, 0, &val);                     // IO_SEND_OP_COND, no CRC\n  MG_VERBOSE((\"IO Functions: %u, Memory: %c\", 1 + ((val >> 28) & 7),\n              (val & MG_BIT(27)) ? 'Y' : 'N'));\n  if (!sdio->txn(sdio, 3, 0, &val)) return false;  // SEND_RELATIVE_ADDR\n  val = ((uint32_t) val) >> 16;                    // RCA\n  if (!sdio->txn(sdio, 7, val << 16, &val))\n    return false;  // SELECT/DESELECT_CARD\n  mg_sdio_transfer(sdio, false, 0, MG_SDIO_CCCR_SDIOREV, &val, 1);\n  MG_DEBUG((\"CCCR: %u.%u, SDIO: %u.%u\", 1 + ((val >> 2) & 3), (val >> 0) & 3,\n            1 + ((val >> 6) & 3), (val >> 4) & 3));\n  mg_sdio_transfer(sdio, false, 0, MG_SDIO_CCCR_SDREV, &val, 1);\n  MG_VERBOSE((\"SD: %u.%u\", 1 + ((val >> 2) & 3), (val >> 0) & 3));\n  mg_sdio_transfer(sdio, false, 0, MG_SDIO_CCCR_BIC, &val, 1);\n  MG_SET_BITS(val, 3,\n              MG_BIT(7) | MG_BIT(1));  // SDIO 6.9 Tables 6-1 6-2, 4-bit bus\n  mg_sdio_transfer(sdio, true, 0, MG_SDIO_CCCR_BIC, &val, 1);\n  // All Full-Speed SDIO cards support a 4-bit bus. Skip for Low-Speed SDIO\n  // cards, we don't provide separate low-level functions for width and speed\n  sdio->cfg(sdio, 0);  // set DS;\n  if (!mg_sdio_transfer(sdio, false, 0, MG_SDIO_CCCR_HISPD, &val, 1))\n    return false;\n  if (val & MG_BIT(0) /* SHS */) {\n    val = MG_BIT(1); /* EHS */\n    if (!mg_sdio_transfer(sdio, true, 0, MG_SDIO_CCCR_HISPD, &val, 1))\n      return false;\n    sdio->cfg(sdio, 1);  // set HS;\n    MG_VERBOSE((\"Bus set to 4-bit @50MHz\"));\n  } else {\n    MG_VERBOSE((\"Bus set to 4-bit @25MHz\"));\n  }\n  return true;\n}\n\n// - 6.11 Card Information Structure (CIS): 0x0001000-0x017FF; for card common\n// and all functions\n// - 16.5 SDIO Card Metaformat\n// - 16.7.2 CISTPL_FUNCE (0x22): Function Extension Tuple, provides standard\n// information about the card (common) and each individual function. One\n// CISTPL_FUNCE in each function’s CIS, immediately following the CISTPL_FUNCID\n// tuple\n// - 16.7.3 CISTPL_FUNCE Tuple for Function 0 (common)\n// - 16.7.4 CISTPL_FUNCE Tuple for Function 1-7\n\n#endif\n"
  },
  {
    "path": "src/drivers/sdio.h",
    "content": "#pragma once\n\n#if MG_ENABLE_TCPIP && \\\n    (defined(MG_ENABLE_DRIVER_CYW_SDIO) && MG_ENABLE_DRIVER_CYW_SDIO)\n\n// Specific chip/card driver --> SDIO driver --> HAL --> SDIO hw controller\n\n// API with HAL for hardware controller\n// - Provide a function to init the controller (external)\n// - Provide these functions:\nstruct mg_tcpip_sdio {\n  void *sdio;                    // Opaque SDIO bus descriptor\n  void (*cfg)(void *, uint8_t);  // select operating parameters\n  // SDIO transaction: send cmd with a possible 1-byte read or write\n  bool (*txn)(void *, uint8_t cmd, uint32_t arg, uint32_t *r);\n  // SDIO extended transaction: write or read len bytes, using blksz blocks\n  bool (*xfr)(void *, bool write, uint32_t arg, uint16_t blksz, uint32_t *,\n              uint32_t len, uint32_t *r);\n};\n\n// API with driver (e.g.: cyw.c)\n// Once the hardware controller has been initialized:\n// - Init card: selects the card, sets F0 block size, sets bus width and speed\nbool mg_sdio_init(struct mg_tcpip_sdio *sdio);\n// - Enable other possible functions (F1 to F7)\nbool mg_sdio_enable_f(struct mg_tcpip_sdio *sdio, unsigned int f);\n// - Wait for them to be ready\nbool mg_sdio_waitready_f(struct mg_tcpip_sdio *sdio, unsigned int f);\n// - Set their transfer block length\nbool mg_sdio_set_blksz(struct mg_tcpip_sdio *sdio, unsigned int f,\n                       uint16_t blksz);\n// - Transfer data to/from a function (abstracts from transaction type)\n// - Requesting a read transfer > blocksize means block transfer will be used.\n// - Drivers must have room to accomodate a whole block transfer, see sdio.c\n// - Transfers of > 1 byte --> (uint32_t *) data. 1-byte --> (uint8_t *) data\nbool mg_sdio_transfer(struct mg_tcpip_sdio *sdio, bool write, unsigned int f,\n                      uint32_t addr, void *data, uint32_t len);\n\n#endif\n"
  },
  {
    "path": "src/drivers/st67w6.c",
    "content": "#include \"st67w6.h\"\n#include \"net.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_ST67W6) && \\\n    MG_ENABLE_DRIVER_ST67W6\n\nstatic struct mg_tcpip_if *s_ifp;\nstatic uint32_t s_ip, s_mask;\nstatic bool s_link = false, s_connecting = false;\n\nstatic void wifi_cb(struct mg_tcpip_if *ifp, int ev, void *ev_data) {\n  struct mg_wifi_data *wifi =\n      &((struct mg_tcpip_driver_st67w6_data *) ifp->driver_data)->wifi;\n  if (wifi->apmode && ev == MG_TCPIP_EV_ST_CHG &&\n      *(uint8_t *) ev_data == MG_TCPIP_STATE_UP) {\n    MG_DEBUG((\"Access Point started\"));\n    s_ip = ifp->ip, ifp->ip = wifi->apip;\n    s_mask = ifp->mask, ifp->mask = wifi->apmask;\n    ifp->enable_dhcp_client = false;\n    ifp->enable_dhcp_server = true;\n  }\n}\n\nstatic bool st67w6_init(uint8_t *mac);\nstatic void st67w6_poll(bool is_at);\n\nstatic bool mg_tcpip_driver_st67w6_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_st67w6_data *d =\n      (struct mg_tcpip_driver_st67w6_data *) ifp->driver_data;\n  struct mg_wifi_data *wifi = &d->wifi;\n  if (MG_BIG_ENDIAN) {\n    MG_ERROR((\"Big-endian host\"));\n    return false;\n  }\n  if (d->is_ready == NULL) return false;\n  s_ifp = ifp;\n  s_ip = ifp->ip;\n  s_mask = ifp->mask;\n  s_link = false;\n  ifp->pfn = wifi_cb;\n  if (!st67w6_init(ifp->mac)) return false;\n\n  if (d->send_queue.size == 0) d->send_queue.size = 8192;\n  d->send_queue.buf = (char *) mg_calloc(1, d->send_queue.size);\n  if (d->send_queue.buf == NULL) {\n    MG_ERROR((\"OOM\"));\n    return false;\n  }\n\n  if (wifi->apmode) {\n    return mg_wifi_ap_start(wifi);\n  } else if (wifi->ssid != NULL && wifi->pass != NULL) {\n    return mg_wifi_connect(wifi);\n  }\n  return true;\n}\n\n// Decouple; module access depends on it being RDY. See st67w6_poll()\nsize_t mg_tcpip_driver_st67w6_output(const void *buf, size_t len,\n                                     struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_st67w6_data *d =\n      (struct mg_tcpip_driver_st67w6_data *) ifp->driver_data;\n  char *p;\n  if (mg_queue_book(&d->send_queue, &p, len) < len) return 0;\n  memcpy(p, buf, len);\n  mg_queue_add(&d->send_queue, len);\n  return len;\n}\n\nstatic bool mg_tcpip_driver_st67w6_poll(struct mg_tcpip_if *ifp, bool s1) {\n  struct mg_tcpip_driver_st67w6_data *d =\n      (struct mg_tcpip_driver_st67w6_data *) ifp->driver_data;\n  if (d->is_ready == NULL) return false;\n  st67w6_poll(false);\n  if (!s1) return false;\n  return s_link;\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_st67w6 = {\n    mg_tcpip_driver_st67w6_init, mg_tcpip_driver_st67w6_output, NULL,\n    mg_tcpip_driver_st67w6_poll};\n\n//  AT | STA | AP | HCI | OT\n// --------------------------\n//       framing             <-- includes rx stall indication\n// --------------------------\n//         SPI               <-- padded to 32-bit\n//\n// Transactions take place when the module signals RDY, 'tx' and 'write'\n// functions actually just write to memory\n// - AT: handles configuration and events (unsolicited +foo:). Responses may\n// come as:\n//   - 1 frame: just OK or ERROR\n//   - 2 frames: 1 text line each, a response and OK\n//   - 3 frames: 2 text lines: 1 frame with text and no CR/LF, 1 frame with\n//   binary and CR/LF, 1 text line with OK\n// - STA and AP contain plain Ethernet frames to/from the STA and AP networks,\n// respectively\n// - HCI: BLE stuff\n// - OT: ?\n\n#pragma pack(push, 1)\n// little endian\n\nstruct spi_hdr {\n  uint16_t magic;\n  uint16_t len;\n  uint8_t vflags;  // version :2, rx_stall :1, flags :5\n  uint8_t type;\n  uint16_t reserved;\n};\n\n#define ST67W6_SPI_TYPE_AT 0\n#define ST67W6_SPI_TYPE_STA 1\n#define ST67W6_SPI_TYPE_AP 2\n#define ST67W6_SPI_TYPE_HCI 3\n#define ST67W6_SPI_TYPE_OT 4\n\n#pragma pack(pop)\n\nstatic uint32_t txdata[2048 / 4], rxdata[2048 / 4];\nstatic uint8_t at_resp[300];\n\nstatic bool s_at_ok, s_at_err;\nstatic size_t s_at_resp_len;\nstatic void st67w6_handle_wifi_evnt(char *, size_t len);\nstatic void st67w6_handle_scan_result(char *, size_t len);\n\nstatic size_t st67w6_spi_poll(uint8_t *write, uint8_t *read);\nstatic void st67w6_write(unsigned int f, void *data, uint16_t len);\nstatic void st67w6_update_hash_table(void);\n\n// High-level comm stuff\n\nstatic void st67w6_poll(bool is_at) {\n  struct mg_tcpip_driver_st67w6_data *d =\n      (struct mg_tcpip_driver_st67w6_data *) s_ifp->driver_data;\n  struct spi_hdr *h = (struct spi_hdr *) rxdata;\n  unsigned int type;\n  uint8_t *txsource = (uint8_t *) txdata;\n  if (s_ifp->update_mac_hash_table) {\n    // first call to _poll() is after _init(), so this is safe\n    st67w6_update_hash_table();\n    s_ifp->update_mac_hash_table = false;\n  }\n  if (!is_at) {  // send outstanding WLAN frames in the queue\n    char *buf;\n    size_t len;\n    // NOTE(): have traffic-dependent queues or queue traffic type with data\n    if ((len = mg_queue_next(&d->send_queue, &buf)) > 0) {\n      st67w6_write(d->wifi.apmode ? ST67W6_SPI_TYPE_AP : ST67W6_SPI_TYPE_STA,\n                   buf, (uint16_t) len);\n      mg_queue_del(&d->send_queue, len);\n    } else {  // nothing to send\n      txsource = NULL;\n    }\n  }\n  if (st67w6_spi_poll(txsource, (uint8_t *) rxdata) == 0) return;\n  if (h->len == 0) return;\n  type = h->type;\n  if (type == ST67W6_SPI_TYPE_AT) {\n    char *p = (char *) (h + 1);\n    size_t len = h->len;\n    if (len > 7 && strncmp(p, \"+CWLAP:\", 7) == 0) {  // scan result\n      st67w6_handle_scan_result(p + 7, len - 7);\n    } else if (len > 4 && strncmp(p, \"+CW:\", 4) == 0) {\n      st67w6_handle_wifi_evnt(p + 4, len - 4);\n    } else {\n      MG_VERBOSE((\"AT partial: %.*s\", (int) len, p));\n      if (s_at_resp_len + len >= sizeof(at_resp))\n        s_at_resp_len = 0;  // truncate response, error will be caught later\n      memcpy(at_resp + s_at_resp_len, p, len);\n      s_at_resp_len += len;\n      if (mg_match(mg_str_n((char *) at_resp, s_at_resp_len),\n                   mg_str_n(\"*ERROR*\", 7), NULL)) {\n        s_at_err = true;\n      } else if (mg_match(mg_str_n((char *) at_resp, s_at_resp_len),\n                          mg_str_n(\"*OK*\", 4), NULL)) {\n        s_at_ok = true;\n      }\n    }\n  } else if (type == ST67W6_SPI_TYPE_STA || type == ST67W6_SPI_TYPE_AP) {\n    // WLAN frame reception\n    mg_tcpip_qwrite(h + 1, h->len, s_ifp);\n  }  // else silently discard\n}\n\n// WLAN event handling\n\n// - Do not call any AT functions here, otherwise revise st67w6_at_wait()\n// - The module likes to send ERROR along with other events\nstatic void st67w6_handle_wifi_evnt(char *p, size_t len) {\n  struct mg_str data[2];\n  MG_VERBOSE((\"event: %.*s\", (int) len, p));\n  if (len > 9 && strncmp(p, \"CONNECTED\", 9) == 0) {\n    s_link = true;\n    s_connecting = false;\n  } else if (len > 12 && strncmp(p, \"DISCONNECTED\", 12) == 0) {\n    s_link = false;\n    s_connecting = false;  // should not be needed\n  } else if (s_connecting && len > 6 &&\n             mg_match(mg_str_n(p, len), mg_str_n(\"ERROR,*\\r\\n*\", 10), data)) {\n    size_t reason = 0;\n    bool ok = mg_to_size_t(data[0], &reason);\n    s_connecting = false;\n    MG_ERROR((\"CONNECT FAILED\"));\n    mg_tcpip_call(s_ifp, MG_TCPIP_EV_WIFI_CONNECT_ERR, ok ? &reason : NULL);\n  } else if (len > 9 && strncmp(p, \"SCAN_DONE\", 9) == 0) {\n    MG_VERBOSE((\"scan complete\"));\n    mg_tcpip_call(s_ifp, MG_TCPIP_EV_WIFI_SCAN_END, NULL);\n  }  // else silently discard: CONNECTING; STA_CONNECTED,\"MAC\";\n     // STA_DISCONNECTED,\"MAC\"; DIST_STA_IP,\"MAC\",\"IP\"\n}\n\nstatic bool st67w6_at_cmd(char *cmd, size_t len);\n\n// Wi-Fi network stuff\n\nstatic bool st67w6_wifi_connect(char *ssid, char *pass) {\n  char cmd[90];  // ssid + pass + AT\n  size_t cmd_len;\n  if (!st67w6_at_cmd(\"AT+CWMODE=1,0\\r\\n\", 15)) return false;\n  cmd_len = mg_snprintf(cmd, sizeof(cmd), \"AT+CWJAP=\\\"%s\\\",\\\"%s\\\",,0\\r\\n\", ssid,\n                        pass);  // takes >700ms\n  if (!st67w6_at_cmd(cmd, cmd_len)) return false;\n  st67w6_at_cmd(\"AT+CWRECONNCFG=0,0\\r\\n\", 20);  // disregard error, connecting\n  s_connecting = true;\n  return true;\n}\n\nstatic bool st67w6_wifi_disconnect(void) {\n  s_connecting = false;\n  if (!st67w6_at_cmd(\"AT+CWQAP=0\\r\\n\", 12)) return false;  // takes >800ms\n  return st67w6_at_cmd(\"AT+CWMODE=0,0\\r\\n\", 15);           // takes >550ms\n}\n\nstatic bool st67w6_wifi_ap_start(char *ssid, char *pass, unsigned int channel) {\n  char cmd[90];  // ssid + pass + AT\n  size_t cmd_len;\n  if (!st67w6_at_cmd(\"AT+CWMODE=2,0\\r\\n\", 15)) return false;  // takes >800ms\n  cmd_len = mg_snprintf(\n      cmd, sizeof(cmd), \"AT+CWSAP=\\\"%s\\\",\\\"%s\\\",%u,3,2,0\\r\\n\", ssid, pass,\n      channel);  // 3: WPA2_PSK; 2: max stations  // takes >350ms\n  s_link = true;\n  return st67w6_at_cmd(cmd, cmd_len);\n}\n\nstatic bool st67w6_wifi_ap_stop(void) {\n  s_link = false;\n  return st67w6_at_cmd(\"AT+CWMODE=0,0\\r\\n\", 15);  // takes >550ms\n}\n\n// WLAN scan handling\n\n// +CWLAP:(security,\"SSID\",RSSI,\"BSSID\",channel,cipher,proto,wps)\\r\\n\n// security: OPEN, WEP, WPA, WPA2, WPA-WPA2, WPA-EAP, WPA3-SAE, WPA2-WPA3-SAE\n// cipher: NONE, WEP, AES/CCMP, TKIP, TKIP and AES/CCMP\n// proto: 4-bit bitmap AX,N,G,B; all set from right to left\n\nstatic bool st67w6_wifi_scan(void) {\n  return st67w6_at_cmd(\"AT+CWLAPOPT=1,1695,-100,255,50\\r\\n\", 32) &&\n         st67w6_at_cmd(\"AT+CWLAP=0,,,0\\r\\n\", 16);\n}\n\nstatic void st67w6_handle_scan_result(char *data, size_t len) {\n  struct mg_wifi_scan_bss_data bss;\n  struct mg_str fields[2];\n  char mac[6];\n  uint8_t val;\n  unsigned int i;\n  MG_VERBOSE((\"scan result event: %.*s\", (int) len, data));\n  ++data, --len;  // skip '('\n  if (!mg_span(mg_str_n(data, len), &fields[0], &fields[1], ',') ||\n      !mg_str_to_num(fields[0], 10, &val, 1))\n    return;\n  bss.security =\n      (val == 0)\n          ? MG_WIFI_SECURITY_OPEN\n          : MG_WIFI_SECURITY_WEP |\n                ((val == 2 || val == 4 || val == 5) ? MG_WIFI_SECURITY_WPA\n                                                    : 0) |\n                ((val == 3 || val == 4 || val == 7) ? MG_WIFI_SECURITY_WPA2\n                                                    : 0) |\n                ((val == 6 || val == 7) ? MG_WIFI_SECURITY_WPA3 : 0);\n  if (!mg_span(fields[1], &fields[0], &fields[1], ',')) return;\n  bss.SSID.buf = fields[0].buf + 1, bss.SSID.len = fields[0].len - 2;\n  if (!mg_span(fields[1], &fields[0], &fields[1], ',')) return;\n  while (fields[0].buf[0] == ' ') ++fields[0].buf, --fields[0].len;\n  if (fields[0].buf[0] != '-') return;  // positive RSSI would be great\n  ++fields[0].buf, --fields[0].len;\n  if (!mg_str_to_num(fields[0], 10, &val, 1)) return;\n  bss.RSSI = (int8_t) - (int8_t) val;\n  if (!mg_span(fields[1], &fields[0], &fields[1], ',')) return;\n  if (fields[0].len < 19) return;\n  ++fields[0].buf, --fields[0].len;  // skip '\"'\n  for (i = 0; i < 6; i++) {\n    struct mg_str str;\n    str.buf = fields[0].buf + 3 * i;\n    str.len = 2;\n    if (!mg_str_to_num(str, 16, &mac[i], 1)) return;\n  }\n  bss.BSSID = mac;\n  if (!mg_span(fields[1], &fields[0], &fields[1], ',') ||\n      !mg_str_to_num(fields[0], 10, &bss.channel, 1))\n    return;\n  if (!mg_span(fields[1], &fields[0], &fields[1], ',') ||\n      !mg_str_to_num(fields[0], 10, &val, 1))\n    return;\n  // ignore cypher\n  if (!mg_span(fields[1], &fields[0], &fields[1], ',') ||\n      !mg_str_to_num(fields[0], 10, &val, 1))\n    return;\n  bss.has_n = (val & 4) != 0;\n  // bss.has_ax = (val & 8) != 0;\n  bss.band = MG_WIFI_BAND_2G;  // NOT INFORMED with default options, no docs\n  MG_VERBOSE((\"BSS: %.*s (%u) (%M) %d dBm %u\", bss.SSID.len, bss.SSID.buf,\n              bss.channel, mg_print_mac, bss.BSSID, (int) bss.RSSI,\n              bss.security));\n  mg_tcpip_call(s_ifp, MG_TCPIP_EV_WIFI_SCAN_RESULT, &bss);\n}\n\n// AT stuff\n\nstatic inline bool delayms(unsigned int ms) {\n  mg_delayms(ms);\n  return true;\n}\n\n// send AT command, wait for a response or timeout, meanwhile delivering\n// received frames and events\n\nstatic bool st67w6_at_cmd(char *cmd, size_t len) {\n  bool is_at = true;\n  unsigned int times = 1000;\n  s_at_resp_len = 0;\n  st67w6_write(ST67W6_SPI_TYPE_AT, cmd, (uint16_t) len);\n  s_at_ok = false, s_at_err = false;\n  do {  // AT response processing does not call any other AT function\n    st67w6_poll(is_at);  // otherwise we can't allow them to pile up here\n    is_at = false;       // avoid repeating, allow queued WLAN frames to be sent\n    // network frames will be pushed to the queue so that is safe\n  } while (!s_at_ok && !s_at_err && times-- > 0 && delayms(1));\n  MG_VERBOSE((\"AT response:\\n%.*s\", s_at_resp_len, at_resp));\n  MG_VERBOSE((\"ok: %c, err: %c, times: %d\", s_at_ok ? '1' : '0',\n              s_at_err ? '1' : '0', (int) times));\n  return s_at_ok;\n}\n\nstatic bool st67w6_spi_init(void);\nbool mg_to_size_t(struct mg_str str, size_t *val);\n\nstatic bool st67w6_init(uint8_t *mac) {\n  //  struct mg_tcpip_driver_st67w6_data *d = (struct\n  //  mg_tcpip_driver_st67w6_data *) s_ifp->driver_data;\n  struct mg_str data[3];\n  size_t val;\n  bool is_b = false;\n  if (!st67w6_spi_init()) return false;\n  if (!st67w6_at_cmd(\"AT\\r\\n\", 4)) return false;\n  if (!st67w6_at_cmd(\"AT+CWNETMODE?\\r\\n\", 15) ||\n      !mg_match(mg_str_n((char *) at_resp, s_at_resp_len),\n                mg_str_n(\"*:*\\r\\n*\", 6), data) ||\n      !mg_to_size_t(data[1], &val))\n    return false;\n  if (val != 0) {\n    MG_ERROR((\"Wrong firmware, T02 is needed\"));\n    return false;\n  }\n  // set clock, who cares ???\n  if (!st67w6_at_cmd(\"AT+GET_CLOCK\\r\\n\", 14)) return false;\n  MG_DEBUG((\"%.*s\", s_at_resp_len, at_resp));  // TODO(scaprile): --> VERBOSE\n  // BT-ENABLED DEPENDENCY\n\n  // MODULE DEPENDENCY\n  if (!st67w6_at_cmd(\"AT+EFUSE-R=24,\\\"0x100\\\"\\r\\n\", 23) ||\n      !mg_match(mg_str_n((char *) at_resp, s_at_resp_len), mg_str_n(\"*,*\", 3),\n                data))\n    return false;\n  if (data[1].buf[0] == 'C' && data[1].buf[1] == '6') is_b = true;\n  MG_DEBUG((\"WLAN module is %sB type\", is_b ? \"\" : \"not\"));  // --> VERBOSE\n  if (is_b) {\n    // Disable the antenna diversity pin\n    if (!st67w6_at_cmd(\"AT+IORST=0\\r\\n\", 12)) return false;\n    // Apparently they intend to disable some antenna ...\n    if (!st67w6_at_cmd(\"AT+CWANTENABLE?\\r\\n\", 17)) return false;\n    MG_DEBUG((\"%.*s\", s_at_resp_len, at_resp));  // --> VERBOSE\n  }\n\n  // Do not set wake-up pin (AT+SLWKIO)\n  // Disable power save mode\n  // NOTE(scaprile): (no response if in hibernate mode, though I guess we\n  // wouldn't have reached this point in that case either)\n  if (!st67w6_at_cmd(\"AT+PWR=0\\r\\n\", 12)) return false;\n  // set Wi-Fi\n  // set country code\n  if (!st67w6_at_cmd(\"AT+CWCOUNTRY=0,\\\"00\\\"\\r\\n\", 21)) return false;\n#if 0\n\t// set DTIM\n  if (!st67w6_at_cmd(\"AT+SLWKDTIM=1\\r\\n\", 15)) return false;\n#endif\n  // Read only default MAC, ignore set bit count (data[6] & 0x3F). Custom MACs\n  // reside at @0x64 and 0x70\n  if (st67w6_at_cmd(\"AT+EFUSE-R=7,\\\"0x014\\\"\\r\\n\", 22) &&\n      mg_match(mg_str_n((char *) at_resp, s_at_resp_len), mg_str_n(\"*,*\", 3),\n               data)) {\n    int i;\n    for (i = 0; i < 6; i++) mac[i] = data[1].buf[5 - i];\n    MG_DEBUG((\"MAC: %M\", mg_print_mac, mac));\n  } else {\n    MG_ERROR((\"read MAC failed\"));\n  }\n  return true;\n}\n\nstatic void st67w6_update_hash_table(void) {\n  // TODO(): read database, rebuild hash table\n  //  uint32_t val = 0;\n  //  val = 1;\n  //  st67w6_at_iovar_set2_(0, \"mcast_list\", (uint8_t *) &val, sizeof(val),\n  //  (uint8_t *) mcast_addr, sizeof(mcast_addr)); mg_delayms(50);\n}\n\n// SPI specifics\n\n#define ST67W6_SPI_MAGIC 0x55AA\n// #define ST67W6_SPI_VERSION(x), IS_STALL, FLAGS(x), ...\n\nstatic const uint8_t idlehdr[sizeof(struct spi_hdr)] = {0xaa, 0x55, 0, 0,\n                                                        0,    0,    0, 0};\n\nstatic void st67w6_write(unsigned int f, void *data, uint16_t len) {\n  struct spi_hdr *h = (struct spi_hdr *) txdata;\n  h->magic = ST67W6_SPI_MAGIC;\n  h->type = (uint8_t) f;\n  h->vflags = 0;\n  h->len = len;\n  h->reserved = 0;\n  memmove(h + 1, data, len);\n}\n\nstatic size_t st67w6_spi_poll(uint8_t *write, uint8_t *read) {\n  struct mg_tcpip_driver_st67w6_data *d =\n      (struct mg_tcpip_driver_st67w6_data *) s_ifp->driver_data;\n  struct spi_hdr *th, *rh = (struct spi_hdr *) read;\n  struct mg_tcpip_spi_ *s = (struct mg_tcpip_spi_ *) d->spi;\n  size_t padded;\n  unsigned int times;\n\n  th = (write != NULL) ? (struct spi_hdr *) write : (struct spi_hdr *) idlehdr;\n  s->begin(s->spi);\n  times = 50;\n  while (times--) {\n    if (d->is_ready()) break;\n    if (times == 0) {\n      MG_ERROR((\"RDY TIMEOUT\"));\n      s->end(s->spi);\n      return 0;\n    }\n    mg_delayms(1);\n  }\n\n  padded = (th->len + 3) & ~3;\n  s->txn(s->spi, (uint8_t *) th, (uint8_t *) rh, sizeof(*th) + padded);\n  if (rh->magic == ST67W6_SPI_MAGIC && rh->len > padded) {\n    size_t remaining_padded = (rh->len - padded + 3) & ~3;\n    if (remaining_padded > (2048 - sizeof(*rh) - padded))\n      remaining_padded = 2048 - sizeof(*rh) - padded;\n    s->txn(s->spi, NULL, read + sizeof(*rh) + padded, remaining_padded);\n  }\n  times = 50;\n  while (times--) {\n    if (!d->is_ready()) break;\n    if (times == 0) {\n      MG_ERROR((\"!RDY TIMEOUT\"));\n      break;\n    }\n    mg_delayms(1);\n  }\n  s->end(s->spi);\n  return (size_t) rh->len;\n}\n\nstatic bool st67w6_spi_init(void) {\n  struct mg_tcpip_driver_st67w6_data *d =\n      (struct mg_tcpip_driver_st67w6_data *) s_ifp->driver_data;\n  size_t len;\n  unsigned int times = 1000;\n  while (times--) {\n    if (d->is_ready()) break;\n    if (times == 0) return false;\n    mg_delayms(1);\n  }\n  if (((len = st67w6_spi_poll(NULL, (uint8_t *) rxdata)) == 0) ||\n      !mg_match(mg_str_n(((char *) rxdata) + sizeof(struct spi_hdr), len),\n                mg_str_n(\"*ready*\", 7), NULL))\n    return false;\n  return true;\n}\n\n// Mongoose Wi-Fi API functions\n\nbool mg_wifi_scan(void) {\n  return st67w6_wifi_scan();\n}\n\nbool mg_wifi_connect(struct mg_wifi_data *wifi) {\n  s_ifp->ip = s_ip;\n  s_ifp->mask = s_mask;\n  if (s_ifp->ip == 0) s_ifp->enable_dhcp_client = true;\n  s_ifp->enable_dhcp_server = false;\n  MG_DEBUG((\"Connecting to '%s'\", wifi->ssid));\n  return st67w6_wifi_connect(wifi->ssid, wifi->pass);\n}\n\nbool mg_wifi_disconnect(void) {\n  return st67w6_wifi_disconnect();\n}\n\nbool mg_wifi_ap_start(struct mg_wifi_data *wifi) {\n  MG_DEBUG((\"Starting AP '%s' (%u)\", wifi->apssid, wifi->apchannel));\n  return st67w6_wifi_ap_start(wifi->apssid, wifi->appass, wifi->apchannel);\n}\n\nbool mg_wifi_ap_stop(void) {\n  return st67w6_wifi_ap_stop();\n}\n\n#endif\n"
  },
  {
    "path": "src/drivers/st67w6.h",
    "content": "#pragma once\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_ST67W6) && \\\n    MG_ENABLE_DRIVER_ST67W6\n\nstruct mg_tcpip_spi_ {\n  void *spi;              // Opaque SPI bus descriptor\n  void (*begin)(void *);  // SPI begin: slave select low\n  void (*end)(void *);    // SPI end: slave select high\n  void (*txn)(void *, uint8_t *, uint8_t *,\n              size_t len);  // SPI transaction: write-read len bytes\n};\n\nstruct mg_tcpip_driver_st67w6_data {\n  struct mg_wifi_data wifi;\n  void *spi;\n  bool (*is_ready)(void);     // return state of module RDY pin\n  struct mg_queue send_queue; // decouple tx calls from module polls\n};\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_st67w6_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    MG_SET_WIFI_CONFIG(&driver_data_);                            \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_st67w6;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    mif_.recv_queue.size = 8192;                                  \\\n    mif_.mac[0] = 2; /* MAC read from OTP at driver init */       \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_INFO((\"Driver: st67w6, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n"
  },
  {
    "path": "src/drivers/stm32f.c",
    "content": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_STM32F) && \\\n    MG_ENABLE_DRIVER_STM32F\nstruct stm32f_eth {\n  volatile uint32_t MACCR, MACFFR, MACHTHR, MACHTLR, MACMIIAR, MACMIIDR, MACFCR,\n      MACVLANTR, RESERVED0[2], MACRWUFFR, MACPMTCSR, RESERVED1, MACDBGR, MACSR,\n      MACIMR, MACA0HR, MACA0LR, MACA1HR, MACA1LR, MACA2HR, MACA2LR, MACA3HR,\n      MACA3LR, RESERVED2[40], MMCCR, MMCRIR, MMCTIR, MMCRIMR, MMCTIMR,\n      RESERVED3[14], MMCTGFSCCR, MMCTGFMSCCR, RESERVED4[5], MMCTGFCR,\n      RESERVED5[10], MMCRFCECR, MMCRFAECR, RESERVED6[10], MMCRGUFCR,\n      RESERVED7[334], PTPTSCR, PTPSSIR, PTPTSHR, PTPTSLR, PTPTSHUR, PTPTSLUR,\n      PTPTSAR, PTPTTHR, PTPTTLR, RESERVED8, PTPTSSR, PTPPPSCR, RESERVED9[564],\n      DMABMR, DMATPDR, DMARPDR, DMARDLAR, DMATDLAR, DMASR, DMAOMR, DMAIER,\n      DMAMFBOCR, DMARSWTR, RESERVED10[8], DMACHTDR, DMACHRDR, DMACHTBAR,\n      DMACHRBAR;\n};\n#undef ETH\n#define ETH ((struct stm32f_eth *) (uintptr_t) 0x40028000)\n\n#define ETH_PKT_SIZE 1540  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 4           // Descriptor size (words)\n\nstatic uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS] MG_ETH_RAM;      // RX descriptors\nstatic uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS] MG_ETH_RAM;      // TX descriptors\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM;  // RX ethernet buffers\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM;  // TX ethernet buffers\nstatic uint8_t s_txno;                               // Current TX descriptor\nstatic uint8_t s_rxno;                               // Current RX descriptor\n\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\n\nstatic uint16_t eth_read_phy(uint8_t addr, uint8_t reg) {\n  ETH->MACMIIAR &= (7 << 2);\n  ETH->MACMIIAR |= ((uint32_t) addr << 11) | ((uint32_t) reg << 6);\n  ETH->MACMIIAR |= MG_BIT(0);\n  while (ETH->MACMIIAR & MG_BIT(0)) (void) 0;\n  return ETH->MACMIIDR & 0xffff;\n}\n\nstatic void eth_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  ETH->MACMIIDR = val;\n  ETH->MACMIIAR &= (7 << 2);\n  ETH->MACMIIAR |= ((uint32_t) addr << 11) | ((uint32_t) reg << 6) | MG_BIT(1);\n  ETH->MACMIIAR |= MG_BIT(0);\n  while (ETH->MACMIIAR & MG_BIT(0)) (void) 0;\n}\n\nstatic uint32_t get_hclk(void) {\n  struct rcc {\n    volatile uint32_t CR, PLLCFGR, CFGR;\n  } *rcc = (struct rcc *) 0x40023800;\n  uint32_t clk = 0, hsi = 16000000 /* 16 MHz */, hse = 8000000 /* 8MHz */;\n\n  if (rcc->CFGR & (1 << 2)) {\n    clk = hse;\n  } else if (rcc->CFGR & (1 << 3)) {\n    uint32_t vco, m, n, p;\n    m = (rcc->PLLCFGR & (0x3f << 0)) >> 0;\n    n = (rcc->PLLCFGR & (0x1ff << 6)) >> 6;\n    p = (((rcc->PLLCFGR & (3 << 16)) >> 16) + 1) * 2;\n    clk = (rcc->PLLCFGR & (1 << 22)) ? hse : hsi;\n    vco = (uint32_t) ((uint64_t) clk * n / m);\n    clk = vco / p;\n  } else {\n    clk = hsi;\n  }\n  uint32_t hpre = (rcc->CFGR & (15 << 4)) >> 4;\n  if (hpre < 8) return clk;\n\n  uint8_t ahbptab[8] = {1, 2, 3, 4, 6, 7, 8, 9};  // log2(div)\n  return ((uint32_t) clk) >> ahbptab[hpre - 8];\n}\n\n//  Guess CR from HCLK. MDC clock is generated from HCLK (AHB); as per 802.3,\n//  it must not exceed 2.5MHz As the AHB clock can be (and usually is) derived\n//  from the HSI (internal RC), and it can go above specs, the datasheets\n//  specify a range of frequencies and activate one of a series of dividers to\n//  keep the MDC clock safely below 2.5MHz. We guess a divider setting based on\n//  HCLK with a +5% drift. If the user uses a different clock from our\n//  defaults, needs to set the macros on top Valid for STM32F74xxx/75xxx\n//  (38.8.1) and STM32F42xxx/43xxx (33.8.1) (both 4.5% worst case drift)\nstatic int guess_mdc_cr(void) {\n  uint8_t crs[] = {2, 3, 0, 1, 4, 5};          // ETH->MACMIIAR::CR values\n  uint8_t div[] = {16, 26, 42, 62, 102, 124};  // Respective HCLK dividers\n  uint32_t hclk = get_hclk();                  // Guess system HCLK\n  int result = -1;                             // Invalid CR value\n  if (hclk < 25000000) {\n    MG_ERROR((\"HCLK too low\"));\n  } else {\n    for (int i = 0; i < 6; i++) {\n      if (hclk / div[i] <= 2375000UL /* 2.5MHz - 5% */) {\n        result = crs[i];\n        break;\n      }\n    }\n    if (result < 0) MG_ERROR((\"HCLK too high\"));\n  }\n  MG_DEBUG((\"HCLK: %u, CR: %d\", hclk, result));\n  return result;\n}\n\nstatic bool mg_tcpip_driver_stm32f_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_stm32f_data *d =\n      (struct mg_tcpip_driver_stm32f_data *) ifp->driver_data;\n  uint8_t phy_addr = d == NULL ? 0 : d->phy_addr;\n  s_ifp = ifp;\n\n  // Init RX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i][0] = MG_BIT(31);                         // Own\n    s_rxdesc[i][1] = sizeof(s_rxbuf[i]) | MG_BIT(14);    // 2nd address chained\n    s_rxdesc[i][2] = (uint32_t) (uintptr_t) s_rxbuf[i];  // Point to data buffer\n    s_rxdesc[i][3] =\n        (uint32_t) (uintptr_t) s_rxdesc[(i + 1) % ETH_DESC_CNT];  // Chain\n  }\n\n  // Init TX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_txdesc[i][2] = (uint32_t) (uintptr_t) s_txbuf[i];  // Buf pointer\n    s_txdesc[i][3] =\n        (uint32_t) (uintptr_t) s_txdesc[(i + 1) % ETH_DESC_CNT];  // Chain\n  }\n\n  ETH->DMABMR |= MG_BIT(0);                         // Software reset\n  while ((ETH->DMABMR & MG_BIT(0)) != 0) (void) 0;  // Wait until done\n\n  // Set MDC clock divider. If user told us the value, use it. Otherwise, guess\n  int cr = (d == NULL || d->mdc_cr < 0) ? guess_mdc_cr() : d->mdc_cr;\n  ETH->MACMIIAR = ((uint32_t) cr & 7) << 2;\n\n  // NOTE(cpq): we do not use extended descriptor bit 7, and do not use\n  // hardware checksum. Therefore, descriptor size is 4, not 8\n  // ETH->DMABMR = MG_BIT(13) | MG_BIT(16) | MG_BIT(22) | MG_BIT(23) |\n  // MG_BIT(25);\n  ETH->MACIMR = MG_BIT(3) | MG_BIT(9);  // Mask timestamp & PMT IT\n  ETH->MACFCR = MG_BIT(7);              // Disable zero quarta pause\n  ETH->MACFFR = MG_BIT(10);             // Perfect filtering\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  mg_phy_init(&phy, phy_addr, MG_PHY_CLOCKS_MAC);\n  ETH->DMARDLAR = (uint32_t) (uintptr_t) s_rxdesc;  // RX descriptors\n  ETH->DMATDLAR = (uint32_t) (uintptr_t) s_txdesc;  // RX descriptors\n  ETH->DMAIER = MG_BIT(6) | MG_BIT(16);             // RIE, NISE\n  ETH->MACCR =\n      MG_BIT(2) | MG_BIT(3) | MG_BIT(11) | MG_BIT(14);  // RE, TE, Duplex, Fast\n  ETH->DMAOMR =\n      MG_BIT(1) | MG_BIT(13) | MG_BIT(21) | MG_BIT(25);  // SR, ST, TSF, RSF\n\n  // MAC address filtering\n  ETH->MACA0HR = ((uint32_t) ifp->mac[5] << 8U) | ifp->mac[4];\n  ETH->MACA0LR = (uint32_t) (ifp->mac[3] << 24) |\n                 ((uint32_t) ifp->mac[2] << 16) |\n                 ((uint32_t) ifp->mac[1] << 8) | ifp->mac[0];\n  return true;\n}\n\nstatic size_t mg_tcpip_driver_stm32f_tx(const void *buf, size_t len,\n                                        struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // Frame is too big\n  } else if ((s_txdesc[s_txno][0] & MG_BIT(31))) {\n    ifp->nerr++;\n    MG_ERROR((\"No free descriptors\"));\n    // printf(\"D0 %lx SR %lx\\n\", (long) s_txdesc[0][0], (long) ETH->DMASR);\n    len = 0;  // All descriptors are busy, fail\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);                           // Copy data\n    s_txdesc[s_txno][1] = (uint32_t) len;                        // Set data len\n    s_txdesc[s_txno][0] = MG_BIT(20) | MG_BIT(28) | MG_BIT(29);  // Chain,FS,LS\n    s_txdesc[s_txno][0] |= MG_BIT(31);  // Set OWN bit - let DMA take over\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n  MG_DSB();                            // ensure descriptors have been written\n  ETH->DMASR = MG_BIT(2) | MG_BIT(5);  // Clear any prior TBUS/TUS\n  ETH->DMATPDR = 0;                    // and resume\n  return len;\n}\n\nstatic void mg_tcpip_driver_stm32f_update_hash_table(struct mg_tcpip_if *ifp) {\n  // TODO(): read database, rebuild hash table\n  ETH->MACA1LR = (uint32_t) mcast_addr[3] << 24 |\n                 (uint32_t) mcast_addr[2] << 16 |\n                 (uint32_t) mcast_addr[1] << 8 | (uint32_t) mcast_addr[0];\n  ETH->MACA1HR = (uint32_t) mcast_addr[5] << 8 | (uint32_t) mcast_addr[4];\n  ETH->MACA1HR |= MG_BIT(31);  // AE\n  (void) ifp;\n}\n\nstatic bool mg_tcpip_driver_stm32f_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    mg_tcpip_driver_stm32f_update_hash_table(ifp);\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  struct mg_tcpip_driver_stm32f_data *d =\n      (struct mg_tcpip_driver_stm32f_data *) ifp->driver_data;\n  uint8_t phy_addr = d == NULL ? 0 : d->phy_addr;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  up = mg_phy_up(&phy, phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    // tmp = reg with flags set to the most likely situation: 100M full-duplex\n    // if(link is slow or half) set flags otherwise\n    // reg = tmp\n    uint32_t maccr = ETH->MACCR | MG_BIT(14) | MG_BIT(11);  // 100M, Full-duplex\n    if (speed == MG_PHY_SPEED_10M) maccr &= ~MG_BIT(14);    // 10M\n    if (full_duplex == false) maccr &= ~MG_BIT(11);         // Half-duplex\n    ETH->MACCR = maccr;  // IRQ handler does not fiddle with this register\n    MG_DEBUG((\"Link is %uM %s-duplex\", maccr & MG_BIT(14) ? 100 : 10,\n              maccr & MG_BIT(11) ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\n#ifdef __riscv\n__attribute__((interrupt()))  // For RISCV CH32V307, which share the same MAC\n#endif\nvoid ETH_IRQHandler(void);\nvoid ETH_IRQHandler(void) {\n  if (ETH->DMASR & MG_BIT(6)) {           // Frame received, loop\n    ETH->DMASR = MG_BIT(16) | MG_BIT(6);  // Clear flag\n    for (uint32_t i = 0; i < 10; i++) {   // read as they arrive but not forever\n      if (s_rxdesc[s_rxno][0] & MG_BIT(31)) break;  // exit when done\n      if (((s_rxdesc[s_rxno][0] & (MG_BIT(8) | MG_BIT(9))) ==\n           (MG_BIT(8) | MG_BIT(9))) &&\n          !(s_rxdesc[s_rxno][0] & MG_BIT(15))) {  // skip partial/errored frames\n        uint32_t len = ((s_rxdesc[s_rxno][0] >> 16) & (MG_BIT(14) - 1));\n        //  printf(\"%lx %lu %lx %.8lx\\n\", s_rxno, len, s_rxdesc[s_rxno][0],\n        //  ETH->DMASR);\n        mg_tcpip_qwrite(s_rxbuf[s_rxno], len > 4 ? len - 4 : len, s_ifp);\n      }\n      s_rxdesc[s_rxno][0] = MG_BIT(31);\n      if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n    }\n  }\n  // Cleanup flags\n  ETH->DMASR = MG_BIT(16)    // NIS, normal interrupt summary\n               | MG_BIT(7);  // Clear possible RBUS while processing\n  ETH->DMARPDR = 0;          // and resume RX\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_stm32f = {\n    mg_tcpip_driver_stm32f_init, mg_tcpip_driver_stm32f_tx, NULL,\n    mg_tcpip_driver_stm32f_poll};\n#endif\n"
  },
  {
    "path": "src/drivers/stm32f.h",
    "content": "#pragma once\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_STM32F) && \\\n    MG_ENABLE_DRIVER_STM32F\n\nstruct mg_tcpip_driver_stm32f_data {\n  // MDC clock divider. MDC clock is derived from HCLK, must not exceed 2.5MHz\n  //    HCLK range    DIVIDER    mdc_cr VALUE\n  //    -------------------------------------\n  //                                -1  <-- tell driver to guess the value\n  //    60-100 MHz    HCLK/42        0\n  //    100-150 MHz   HCLK/62        1\n  //    20-35 MHz     HCLK/16        2\n  //    35-60 MHz     HCLK/26        3\n  //    150-216 MHz   HCLK/102       4  <-- value for Nucleo-F* on max speed\n  //    216-310 MHz   HCLK/124       5\n  //    110, 111 Reserved\n  int mdc_cr;  // Valid values: -1, 0, 1, 2, 3, 4, 5\n\n  uint8_t phy_addr;  // PHY address\n};\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 0\n#endif\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 4\n#endif\n\n#if MG_ARCH == MG_ARCH_CUBE\n#define MG_ENABLE_ETH_IRQ() NVIC_EnableIRQ(ETH_IRQn)\n#else\n#define MG_ENABLE_ETH_IRQ()\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_stm32f_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                       \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                    \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_stm32f;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                                 \\\n    MG_ENABLE_ETH_IRQ();                                          \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_INFO((\"Driver: stm32f, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n"
  },
  {
    "path": "src/drivers/stm32h.c",
    "content": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && (MG_ENABLE_DRIVER_STM32H || MG_ENABLE_DRIVER_MCXN || \\\n                        MG_ENABLE_DRIVER_STM32N)\n// STM32H: vendor modded single-queue Synopsys v4.2\n// STM32N: dual-queue GbE Synopsys v5.2 with no hash table option, 64-bit AXI\n// MCXNx4x: dual-queue Synopsys v5.2 with no hash table option\n// RT1170: ENET_QOS: quad-queue Synopsys v5.1\n#if MG_ENABLE_DRIVER_STM32H\n#define SYNOPSYS_ENET_V5 0\n#define SYNOPSYS_ENET_SINGLEQ 1\n#define SYNOPSYS_ENET_NOHASHTABLE 0\n#define SYNOPSYS_ENET_GbE 0\n#elif MG_ENABLE_DRIVER_STM32N\n#define SYNOPSYS_ENET_V5 1\n#define SYNOPSYS_ENET_SINGLEQ 0\n#define SYNOPSYS_ENET_NOHASHTABLE 1\n#define SYNOPSYS_ENET_GbE 1\n#elif MG_ENABLE_DRIVER_MCXN\n#define SYNOPSYS_ENET_V5 1\n#define SYNOPSYS_ENET_SINGLEQ 0\n#define SYNOPSYS_ENET_NOHASHTABLE 1\n#define SYNOPSYS_ENET_GbE 0\n#endif\n\nstruct synopsys_enet_qos {\n  volatile uint32_t MACCR, MACECR, MACPFR, MACWTR, MACHT0R, MACHT1R,\n      RESERVED1[14], MACVTR, RESERVED2, MACVHTR, RESERVED3, MACVIR, MACIVIR,\n      RESERVED4[2], MACTFCR, RESERVED5[7], MACRFCR, RESERVED6[7], MACISR,\n      MACIER, MACRXTXSR, RESERVED7, MACPCSR, MACRWKPFR, RESERVED8[2], MACLCSR,\n      MACLTCR, MACLETR, MAC1USTCR, RESERVED9[12], MACVR, MACDR, RESERVED10,\n      MACHWF0R, MACHWF1R, MACHWF2R, RESERVED11[54], MACMDIOAR, MACMDIODR,\n      RESERVED12[2], MACARPAR, RESERVED13[59], MACA0HR, MACA0LR, MACA1HR,\n      MACA1LR, MACA2HR, MACA2LR, MACA3HR, MACA3LR, RESERVED14[248], MMCCR,\n      MMCRIR, MMCTIR, MMCRIMR, MMCTIMR, RESERVED15[14], MMCTSCGPR, MMCTMCGPR,\n      RESERVED16[5], MMCTPCGR, RESERVED17[10], MMCRCRCEPR, MMCRAEPR,\n      RESERVED18[10], MMCRUPGR, RESERVED19[9], MMCTLPIMSTR, MMCTLPITCR,\n      MMCRLPIMSTR, MMCRLPITCR, RESERVED20[65], MACL3L4C0R, MACL4A0R,\n      RESERVED21[2], MACL3A0R0R, MACL3A1R0R, MACL3A2R0R, MACL3A3R0R,\n      RESERVED22[4], MACL3L4C1R, MACL4A1R, RESERVED23[2], MACL3A0R1R,\n      MACL3A1R1R, MACL3A2R1R, MACL3A3R1R, RESERVED24[108], MACTSCR, MACSSIR,\n      MACSTSR, MACSTNR, MACSTSUR, MACSTNUR, MACTSAR, RESERVED25, MACTSSR,\n      RESERVED26[3], MACTTSSNR, MACTTSSSR, RESERVED27[2], MACACR, RESERVED28,\n      MACATSNR, MACATSSR, MACTSIACR, MACTSEACR, MACTSICNR, MACTSECNR,\n      RESERVED29[4], MACPPSCR, RESERVED30[3], MACPPSTTSR, MACPPSTTNR, MACPPSIR,\n      MACPPSWR, RESERVED31[12], MACPOCR, MACSPI0R, MACSPI1R, MACSPI2R, MACLMIR,\n      RESERVED32[11], MTLOMR, RESERVED33[7], MTLISR, RESERVED34[55], MTLTQOMR,\n      MTLTQUR, MTLTQDR, RESERVED35[8], MTLQICSR, MTLRQOMR, MTLRQMPOCR, MTLRQDR,\n      RESERVED36[177], DMAMR, DMASBMR, DMAISR, DMADSR, RESERVED37[60], DMACCR,\n      DMACTCR, DMACRCR, RESERVED38[2], DMACTDLAR, RESERVED39, DMACRDLAR,\n      DMACTDTPR, RESERVED40, DMACRDTPR, DMACTDRLR, DMACRDRLR, DMACIER,\n      DMACRIWTR, DMACSFCSR, RESERVED41, DMACCATDR, RESERVED42, DMACCARDR,\n      RESERVED43, DMACCATBR, RESERVED44, DMACCARBR, DMACSR, RESERVED45[2],\n      DMACMFCR;\n};\n#undef ETH\n#if MG_ENABLE_DRIVER_STM32H\n#define ETH ((struct synopsys_enet_qos *) (uintptr_t) 0x40028000UL)\n#elif MG_ENABLE_DRIVER_STM32N\n#define ETH ((struct synopsys_enet_qos *) (uintptr_t) 0x48036000UL)\n#elif MG_ENABLE_DRIVER_MCXN\n#define ETH ((struct synopsys_enet_qos *) (uintptr_t) 0x40100000UL)\n#endif\n\n#define ETH_PKT_SIZE 1540  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 4           // Descriptor size (words)\n\n#if MG_ENABLE_DRIVER_STM32H || MG_ENABLE_DRIVER_STM32N\n#define CACHE_LINESZ 32  // must be a whole number of (d)words (see DESC_SZW)\n#ifndef SCB\nstruct m7_scb {\n  volatile uint32_t CPUID, RESERVED1[4], CCR, RESERVED2[145], DCIMVAC, DCISW,\n      DCCMVAU, DCCMVAC, DCCSW, DCCIMVAC, DCCISW, RESERVED3[10], CACR,\n      RESERVED4[3];\n};\n#define SCB ((struct m7_scb *) (uintptr_t) 0xE000ED00UL)\n#endif\n// ending ISB is not needed because we don't cache instructions in data space\nstatic inline void MG_CACHE_INVAL(uint8_t *addr, int32_t len) {\n#if MG_ENABLE_DRIVER_STM32H\n  if ((SCB->CPUID & 0xfff0) != 0xc270) return;  // not a Cortex-M7 => not an H7\n#endif\n  if ((SCB->CCR & MG_BIT(16)) == 0) return;     // cache not enabled\n  MG_DSB();\n  while (len > 0) {\n    SCB->DCIMVAC = (uint32_t) addr;\n    addr += CACHE_LINESZ;\n    len -= CACHE_LINESZ;\n  }\n  MG_DSB();\n}\nstatic inline void MG_CACHE_FLUSH(uint8_t *addr, int32_t len) {\n#if MG_ENABLE_DRIVER_STM32H\n  if ((SCB->CPUID & 0xfff0) != 0xc270) return;  // not a Cortex-M7 => not an H7\n#endif\n  if ((SCB->CCR & MG_BIT(16)) == 0) return;     // cache not enabled\n  MG_DSB();\n  while (len > 0) {\n    SCB->DCCMVAC = (uint32_t) addr;\n    addr += CACHE_LINESZ;\n    len -= CACHE_LINESZ;\n  }\n  MG_DSB();\n}\n#define ETH_RAM_ALIGNED MG_32BYTE_ALIGNED  // depends on CACHE_LINESZ and ETH\n#define CACHE_ALIGN(x) \\\n  ((((size_t) (x)) + CACHE_LINESZ - 1) & ~(CACHE_LINESZ - 1))\n#define DESC_SZ CACHE_ALIGN(4 * ETH_DS)  // grow descriptors to fit a line\n#define DESC_SZW (DESC_SZ / 4)\n#define BUFF_SZ CACHE_ALIGN(ETH_PKT_SIZE)  // grow buffers to fit n lines\n#if MG_ENABLE_DRIVER_STM32H\n#define DESC_SKIPW (DESC_SZW - ETH_DS)  // tell DMA the descriptor size, words\n#else\n// MG_ENABLE_DRIVER_STM32N, DMA is AXI and specs skip in 64-bit double-words\n#define DESC_SKIPW ((DESC_SZW - ETH_DS) / 2)\n#endif\n#else\n#define MG_CACHE_FLUSH(a, b)\n#define MG_CACHE_INVAL(a, b)\n#define ETH_RAM_ALIGNED MG_8BYTE_ALIGNED  // depends on ETH DMA alone\n#define DESC_SZ 0\n#define DESC_SZW ETH_DS\n#define BUFF_SZ ETH_PKT_SIZE\n#define DESC_SKIPW 0  // no need to skip, as we're not aligning to cache lines\n#endif\n\n// array[rows][cols] = coldata coldata ... for all rows, keeps alignment\nstatic volatile uint32_t s_rxdesc[ETH_DESC_CNT][DESC_SZW] MG_ETH_RAM\n    ETH_RAM_ALIGNED;\nstatic volatile uint32_t s_txdesc[ETH_DESC_CNT][DESC_SZW] MG_ETH_RAM\n    ETH_RAM_ALIGNED;\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][BUFF_SZ] MG_ETH_RAM ETH_RAM_ALIGNED;\nstatic uint8_t s_txbuf[ETH_DESC_CNT][BUFF_SZ] MG_ETH_RAM ETH_RAM_ALIGNED;\n\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\n\nstatic uint16_t eth_read_phy(uint8_t addr, uint8_t reg) {\n  ETH->MACMDIOAR &= (0xF << 8);\n  ETH->MACMDIOAR |= ((uint32_t) addr << 21) | ((uint32_t) reg << 16) | 3 << 2;\n  ETH->MACMDIOAR |= MG_BIT(0);\n  while (ETH->MACMDIOAR & MG_BIT(0)) (void) 0;\n  return (uint16_t) ETH->MACMDIODR;\n}\n\nstatic void eth_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  ETH->MACMDIODR = val;\n  ETH->MACMDIOAR &= (0xF << 8);\n  ETH->MACMDIOAR |= ((uint32_t) addr << 21) | ((uint32_t) reg << 16) | 1 << 2;\n  ETH->MACMDIOAR |= MG_BIT(0);\n  while (ETH->MACMDIOAR & MG_BIT(0)) (void) 0;\n}\n\nstatic bool mg_tcpip_driver_stm32h_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_stm32h_data *d =\n      (struct mg_tcpip_driver_stm32h_data *) ifp->driver_data;\n  s_ifp = ifp;\n  uint8_t phy_addr = d == NULL ? 0 : d->phy_addr;\n  uint8_t phy_conf = d == NULL ? MG_PHY_CLOCKS_MAC : d->phy_conf;\n\n  // Init RX descriptors\n  memset((char *) s_rxdesc, 0, sizeof(s_rxdesc));  // manual init\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i][0] = (uint32_t) (uintptr_t) s_rxbuf[i];  // Point to data buffer\n    s_rxdesc[i][3] = MG_BIT(31) | MG_BIT(30) | MG_BIT(24);  // OWN, IOC, BUF1V\n  }\n  MG_CACHE_FLUSH((uint8_t *) s_rxdesc, sizeof(s_rxdesc));\n\n  // Init TX descriptors\n  memset((char *) s_txdesc, 0, sizeof(s_txdesc));  // manual init\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_txdesc[i][0] = (uint32_t) (uintptr_t) s_txbuf[i];  // Buf pointer\n  }\n  MG_CACHE_FLUSH((uint8_t *) s_txdesc, sizeof(s_txdesc));\n\n  ETH->DMAMR |= MG_BIT(0);  // Software reset\n  for (int i = 0; i < 4; i++)\n    (void) 0;  // wait at least 4 clocks before reading\n  while ((ETH->DMAMR & MG_BIT(0)) != 0) (void) 0;  // Wait until done\n\n  // Set MDC clock divider. Get user value, else, assume max freq\n  int cr = (d == NULL || d->mdc_cr < 0) ? 7 : d->mdc_cr;\n  ETH->MACMDIOAR = ((uint32_t) cr & 0xF) << 8;\n\n  // NOTE(scaprile): We do not use timing facilities so the DMA engine does not\n  // re-write buffer address\n  ETH->DMAMR = 0 << 16;        // use interrupt mode 0 (58.8.1) (reset value)\n  ETH->DMASBMR |= MG_BIT(12);  // AAL NOTE(scaprile): is this actually needed\n  ETH->MACIER = 0;  // Do not enable additional irq sources (reset value)\n  ETH->MACTFCR = MG_BIT(7);  // Disable zero-quanta pause\n#if !SYNOPSYS_ENET_V5\n  ETH->MACPFR = MG_BIT(10);  // Perfect filtering\n#endif\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  mg_phy_init(&phy, phy_addr, phy_conf);\n  ETH->DMACRDLAR =\n      (uint32_t) (uintptr_t) s_rxdesc;  // RX descriptors start address\n  ETH->DMACRDRLR = ETH_DESC_CNT - 1;    // ring length\n  ETH->DMACRDTPR =\n      (uint32_t) (uintptr_t) &s_rxdesc[ETH_DESC_CNT -\n                                       1];  // last valid descriptor address\n  ETH->DMACTDLAR =\n      (uint32_t) (uintptr_t) s_txdesc;  // TX descriptors start address\n  ETH->DMACTDRLR = ETH_DESC_CNT - 1;    // ring length\n  ETH->DMACTDTPR =\n      (uint32_t) (uintptr_t) s_txdesc;  // first available descriptor address\n  ETH->DMACCR = DESC_SKIPW << 18;  // DSL (contiguous/sparse descriptor table)\n#if SYNOPSYS_ENET_V5\n  MG_SET_BITS(ETH->DMACTCR, 0x3F << 16, MG_BIT(16));\n  MG_SET_BITS(ETH->DMACRCR, 0x3F << 16, MG_BIT(16));\n#endif\n  ETH->DMACIER = MG_BIT(6) | MG_BIT(15);  // RIE, NIE\n  ETH->MACCR = MG_BIT(0) | MG_BIT(1) | MG_BIT(13) | MG_BIT(14) |\n               MG_BIT(15);  // RE, TE, Duplex, Fast, (10/100)/Reserved\n#if SYNOPSYS_ENET_SINGLEQ\n  ETH->MTLTQOMR |= MG_BIT(1);  // TSF\n  ETH->MTLRQOMR |= MG_BIT(5);  // RSF\n#else\n  ETH->MTLTQOMR |= (7 << 16) | MG_BIT(3) | MG_BIT(1);  // 2KB Q0, TSF\n  ETH->MTLRQOMR |= (7 << 20) | MG_BIT(5);              // 2KB Q, RSF\n  MG_SET_BITS(ETH->RESERVED6[3], 3, 2);  // Enable RxQ0 (MAC_RXQ_CTRL0)\n#endif\n  ETH->DMACTCR |= MG_BIT(0);  // ST\n  ETH->DMACRCR |= MG_BIT(0);  // SR\n\n  // MAC address filtering\n  ETH->MACA0HR = ((uint32_t) ifp->mac[5] << 8U) | ifp->mac[4];\n  ETH->MACA0LR = (uint32_t) (ifp->mac[3] << 24) |\n                 ((uint32_t) ifp->mac[2] << 16) |\n                 ((uint32_t) ifp->mac[1] << 8) | ifp->mac[0];\n  return true;\n}\n\nstatic uint32_t s_txno;\nstatic size_t mg_tcpip_driver_stm32h_tx(const void *buf, size_t len,\n                                        struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    return 0;  // Frame is too big\n  }\n  MG_CACHE_INVAL((uint8_t *) &s_txdesc[s_txno], DESC_SZ);\n  if ((s_txdesc[s_txno][3] & MG_BIT(31))) {\n    ifp->nerr++;\n    MG_ERROR((\"No free descriptors: %u %08X %08X %08X\", s_txno,\n              s_txdesc[s_txno][3], ETH->DMACSR, ETH->DMACTCR));\n    MG_CACHE_INVAL((uint8_t *) s_txdesc, sizeof(s_txdesc));\n    for (int i = 0; i < ETH_DESC_CNT; i++) MG_ERROR((\"%08X\", s_txdesc[i][3]));\n    len = 0;  // All descriptors are busy, fail\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);  // Copy data\n    MG_CACHE_FLUSH((uint8_t *) &s_txbuf[s_txno], BUFF_SZ);\n    s_txdesc[s_txno][2] = (uint32_t) len;           // Set data len\n    s_txdesc[s_txno][3] = MG_BIT(28) | MG_BIT(29);  // FD, LD\n    s_txdesc[s_txno][3] |= MG_BIT(31);  // Set OWN bit - let DMA take over\n    MG_CACHE_FLUSH((uint8_t *) &s_txdesc[s_txno], DESC_SZ);\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n  ETH->DMACSR |= MG_BIT(2) | MG_BIT(1);  // Clear any prior TBU, TPS\n  ETH->DMACTDTPR = (uint32_t) (uintptr_t) &s_txdesc[s_txno];  // and resume\n  return len;\n  (void) ifp;\n}\n\nstatic void mg_tcpip_driver_stm32h_update_hash_table(struct mg_tcpip_if *ifp) {\n#if SYNOPSYS_ENET_NOHASHTABLE\n  ETH->MACPFR = MG_BIT(4);  // Pass Multicast (pass all multicast frames)\n#else\n  // TODO(): read database, rebuild hash table\n  // add mDNS / DNS-SD multicast address\n  ETH->MACA1LR = (uint32_t) mcast_addr[3] << 24 |\n                 (uint32_t) mcast_addr[2] << 16 |\n                 (uint32_t) mcast_addr[1] << 8 | (uint32_t) mcast_addr[0];\n  ETH->MACA1HR = (uint32_t) mcast_addr[5] << 8 | (uint32_t) mcast_addr[4];\n  ETH->MACA1HR |= MG_BIT(31);  // AE\n#endif\n  (void) ifp;\n}\n\nstatic bool mg_tcpip_driver_stm32h_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    mg_tcpip_driver_stm32h_update_hash_table(ifp);\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  struct mg_tcpip_driver_stm32h_data *d =\n      (struct mg_tcpip_driver_stm32h_data *) ifp->driver_data;\n  uint8_t phy_addr = d == NULL ? 0 : d->phy_addr;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  up = mg_phy_up(&phy, phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    // tmp = reg with flags set to the most likely situation: 100M full-duplex\n    // if(link is slow or half) set flags otherwise\n    // reg = tmp\n    uint32_t maccr = ETH->MACCR | MG_BIT(14) | MG_BIT(13);  // 100M, Full-duplex\n#if SYNOPSYS_ENET_GbE\n    if (speed == MG_PHY_SPEED_1000M) maccr &= ~MG_BIT(15);  // 1000M\n#endif\n    if (speed == MG_PHY_SPEED_10M) maccr &= ~MG_BIT(14);  // 10M\n    if (full_duplex == false) maccr &= ~MG_BIT(13);       // Half-duplex\n    ETH->MACCR = maccr;  // IRQ handler does not fiddle with this register\n    MG_DEBUG((\"Link is %uM %s-duplex\", maccr & MG_BIT(14) ? 100 : 10,\n              maccr & MG_BIT(13) ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\nstatic uint32_t s_rxno;\n#if MG_ENABLE_DRIVER_MCXN\nvoid ETHERNET_IRQHandler(void);\nvoid ETHERNET_IRQHandler(void) {\n#elif MG_ENABLE_DRIVER_STM32H\nvoid ETH_IRQHandler(void);\nvoid ETH_IRQHandler(void) {\n#else\nvoid ETH1_IRQHandler(void);\nvoid ETH1_IRQHandler(void) {\n#endif\n  if (ETH->DMACSR & MG_BIT(6)) {           // Frame received, loop\n    ETH->DMACSR = MG_BIT(15) | MG_BIT(6);  // Clear flag\n    for (uint32_t i = 0; i < 10; i++) {  // read as they arrive but not forever\n      MG_CACHE_INVAL((uint8_t *) &s_rxdesc[s_rxno], DESC_SZ);\n      if (s_rxdesc[s_rxno][3] & MG_BIT(31)) break;  // exit when done\n      if (((s_rxdesc[s_rxno][3] & (MG_BIT(28) | MG_BIT(29))) ==\n           (MG_BIT(28) | MG_BIT(29))) &&\n          !(s_rxdesc[s_rxno][3] & MG_BIT(15))) {  // skip partial/errored frames\n        uint32_t len = s_rxdesc[s_rxno][3] & (MG_BIT(15) - 1);\n        // MG_DEBUG((\"%lx %lu %lx %08lx\", s_rxno, len, s_rxdesc[s_rxno][3],\n        // ETH->DMACSR));\n        MG_CACHE_INVAL((uint8_t *) &s_rxbuf[s_rxno], BUFF_SZ);\n        mg_tcpip_qwrite(s_rxbuf[s_rxno], len > 4 ? len - 4 : len, s_ifp);\n      }\n      s_rxdesc[s_rxno][3] =\n          MG_BIT(31) | MG_BIT(30) | MG_BIT(24);  // OWN, IOC, BUF1V\n      MG_CACHE_FLUSH((uint8_t *) &s_rxdesc[s_rxno], DESC_SZ);\n      if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n    }\n  }\n  ETH->DMACSR =\n      MG_BIT(7) | MG_BIT(8);  // Clear possible RBU RPS while processing\n  ETH->DMACRDTPR =\n      (uint32_t) (uintptr_t) &s_rxdesc[ETH_DESC_CNT - 1];  // and resume RX\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_stm32h = {\n    mg_tcpip_driver_stm32h_init, mg_tcpip_driver_stm32h_tx, NULL,\n    mg_tcpip_driver_stm32h_poll};\n#endif\n"
  },
  {
    "path": "src/drivers/stm32h.h",
    "content": "#pragma once\n\n#if MG_ENABLE_TCPIP\n#if !defined(MG_ENABLE_DRIVER_STM32H)\n#define MG_ENABLE_DRIVER_STM32H 0\n#endif\n#if !defined(MG_ENABLE_DRIVER_MCXN)\n#define MG_ENABLE_DRIVER_MCXN 0\n#endif\n#if !defined(MG_ENABLE_DRIVER_STM32N)\n#define MG_ENABLE_DRIVER_STM32N 0\n#endif\n#if MG_ENABLE_DRIVER_STM32H || MG_ENABLE_DRIVER_MCXN || MG_ENABLE_DRIVER_STM32N\n\nstruct mg_tcpip_driver_stm32h_data {\n  // MDC clock divider. MDC clock is derived from HCLK, must not exceed 2.5MHz\n  //    HCLK range    DIVIDER    mdc_cr VALUE\n  //    -------------------------------------\n  //                                -1  <-- tell driver to guess the value\n  //    60-100 MHz    HCLK/42        0\n  //    100-150 MHz   HCLK/62        1\n  //    20-35 MHz     HCLK/16        2\n  //    35-60 MHz     HCLK/26        3\n  //    150-250 MHz   HCLK/102       4  <-- value for max speed HSI\n  //    250-300 MHz   HCLK/124       5  <-- value for Nucleo-H* on CSI\n  //    300-500 MHz   HCLK/204       6\n  //    500-800 MHz   HCLK/324       7\n  int mdc_cr;  // Valid values: -1, 0, 1, 2, 3, 4, 5\n\n  uint8_t phy_addr;  // PHY address\n  uint8_t phy_conf;  // PHY config\n};\n\n#ifndef MG_TCPIP_PHY_CONF\n#define MG_TCPIP_PHY_CONF MG_PHY_CLOCKS_MAC\n#endif\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 0\n#endif\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 4\n#endif\n\n#if MG_ENABLE_DRIVER_STM32H && MG_ARCH == MG_ARCH_CUBE\n#define MG_ENABLE_ETH_IRQ() NVIC_EnableIRQ(ETH_IRQn)\n#else\n#define MG_ENABLE_ETH_IRQ()\n#endif\n\n#if MG_ENABLE_IPV6\n#define MG_IPV6_INIT(mif)                                         \\\n  do {                                                            \\\n    memcpy(mif.ip6ll, (uint8_t[16]) MG_TCPIP_IPV6_LINKLOCAL, 16);     \\\n    memcpy(mif.ip6, (uint8_t[16]) MG_TCPIP_GLOBAL, 16);           \\\n    memcpy(mif.gw6, (uint8_t[16]) MG_TCPIP_GW6, 16);              \\\n    mif.prefix_len = MG_TCPIP_PREFIX_LEN;                        \\\n  } while(0)\n#else\n#define MG_IPV6_INIT(mif)\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_stm32h_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                       \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                    \\\n    driver_data_.phy_conf = MG_TCPIP_PHY_CONF;                    \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_stm32h;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                                 \\\n    MG_IPV6_INIT(mif_);                                           \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_ENABLE_ETH_IRQ();                                          \\\n    MG_INFO((\"Driver: stm32h, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n#endif\n"
  },
  {
    "path": "src/drivers/tm4c.c",
    "content": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_TM4C) && MG_ENABLE_DRIVER_TM4C\nstruct tm4c_emac {\n  volatile uint32_t EMACCFG, EMACFRAMEFLTR, EMACHASHTBLH, EMACHASHTBLL,\n      EMACMIIADDR, EMACMIIDATA, EMACFLOWCTL, EMACVLANTG, RESERVED0, EMACSTATUS,\n      EMACRWUFF, EMACPMTCTLSTAT, RESERVED1[2], EMACRIS, EMACIM, EMACADDR0H,\n      EMACADDR0L, EMACADDR1H, EMACADDR1L, EMACADDR2H, EMACADDR2L, EMACADDR3H,\n      EMACADDR3L, RESERVED2[31], EMACWDOGTO, RESERVED3[8], EMACMMCCTRL,\n      EMACMMCRXRIS, EMACMMCTXRIS, EMACMMCRXIM, EMACMMCTXIM, RESERVED4,\n      EMACTXCNTGB, RESERVED5[12], EMACTXCNTSCOL, EMACTXCNTMCOL, RESERVED6[4],\n      EMACTXOCTCNTG, RESERVED7[6], EMACRXCNTGB, RESERVED8[4], EMACRXCNTCRCERR,\n      EMACRXCNTALGNERR, RESERVED9[10], EMACRXCNTGUNI, RESERVED10[239],\n      EMACVLNINCREP, EMACVLANHASH, RESERVED11[93], EMACTIMSTCTRL, EMACSUBSECINC,\n      EMACTIMSEC, EMACTIMNANO, EMACTIMSECU, EMACTIMNANOU, EMACTIMADD,\n      EMACTARGSEC, EMACTARGNANO, EMACHWORDSEC, EMACTIMSTAT, EMACPPSCTRL,\n      RESERVED12[12], EMACPPS0INTVL, EMACPPS0WIDTH, RESERVED13[294],\n      EMACDMABUSMOD, EMACTXPOLLD, EMACRXPOLLD, EMACRXDLADDR, EMACTXDLADDR,\n      EMACDMARIS, EMACDMAOPMODE, EMACDMAIM, EMACMFBOC, EMACRXINTWDT,\n      RESERVED14[8], EMACHOSTXDESC, EMACHOSRXDESC, EMACHOSTXBA, EMACHOSRXBA,\n      RESERVED15[218], EMACPP, EMACPC, EMACCC, RESERVED16, EMACEPHYRIS,\n      EMACEPHYIM, EMACEPHYIMSC;\n};\n#undef EMAC\n#define EMAC ((struct tm4c_emac *) (uintptr_t) 0x400EC000)\n\n#define ETH_PKT_SIZE 1540  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 4           // Descriptor size (words)\n\nstatic uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS];      // RX descriptors\nstatic uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS];      // TX descriptors\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE];  // RX ethernet buffers\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE];  // TX ethernet buffers\nstatic struct mg_tcpip_if *s_ifp;                    // MIP interface\nenum {\n  EPHY_ADDR = 0,\n  EPHYBMCR = 0,\n  EPHYBMSR = 1,\n  EPHYSTS = 16\n};  // PHY constants\n\nstatic inline void tm4cspin(volatile uint32_t count) {\n  while (count--) (void) 0;\n}\n\nstatic uint32_t emac_read_phy(uint8_t addr, uint8_t reg) {\n  EMAC->EMACMIIADDR &= (0xf << 2);\n  EMAC->EMACMIIADDR |= ((uint32_t) addr << 11) | ((uint32_t) reg << 6);\n  EMAC->EMACMIIADDR |= MG_BIT(0);\n  while (EMAC->EMACMIIADDR & MG_BIT(0)) tm4cspin(1);\n  return EMAC->EMACMIIDATA;\n}\n\nstatic void emac_write_phy(uint8_t addr, uint8_t reg, uint32_t val) {\n  EMAC->EMACMIIDATA = val;\n  EMAC->EMACMIIADDR &= (0xf << 2);\n  EMAC->EMACMIIADDR |=\n      ((uint32_t) addr << 11) | ((uint32_t) reg << 6) | MG_BIT(1);\n  EMAC->EMACMIIADDR |= MG_BIT(0);\n  while (EMAC->EMACMIIADDR & MG_BIT(0)) tm4cspin(1);\n}\n\nstatic uint32_t get_sysclk(void) {\n  struct sysctl {\n    volatile uint32_t DONTCARE0[44], RSCLKCFG, DONTCARE1[43], PLLFREQ0,\n        PLLFREQ1;\n  } *sysctl = (struct sysctl *) 0x400FE000;\n  uint32_t clk = 0, piosc = 16000000 /* 16 MHz */, mosc = 25000000 /* 25MHz */;\n  if (sysctl->RSCLKCFG & (1 << 28)) {  // USEPLL\n    uint32_t fin, vco, mdiv, n, q, psysdiv;\n    uint32_t pllsrc = (sysctl->RSCLKCFG & (0xf << 24)) >> 24;\n    if (pllsrc == 0) {\n      clk = piosc;\n    } else if (pllsrc == 3) {\n      clk = mosc;\n    } else {\n      MG_ERROR((\"Unsupported clock source\"));\n    }\n    q = (sysctl->PLLFREQ1 & (0x1f << 8)) >> 8;\n    n = (sysctl->PLLFREQ1 & (0x1f << 0)) >> 0;\n    fin = clk / ((q + 1) * (n + 1));\n    mdiv = (sysctl->PLLFREQ0 & (0x3ff << 0)) >>\n           0;  // mint + (mfrac / 1024); MFRAC not supported\n    psysdiv = (sysctl->RSCLKCFG & (0x3f << 0)) >> 0;\n    vco = (uint32_t) ((uint64_t) fin * mdiv);\n    return vco / (psysdiv + 1);\n  }\n  uint32_t oscsrc = (sysctl->RSCLKCFG & (0xf << 20)) >> 20;\n  if (oscsrc == 0) {\n    clk = piosc;\n  } else if (oscsrc == 3) {\n    clk = mosc;\n  } else {\n    MG_ERROR((\"Unsupported clock source\"));\n  }\n  uint32_t osysdiv = (sysctl->RSCLKCFG & (0xf << 16)) >> 16;\n  return clk / (osysdiv + 1);\n}\n\n//  Guess CR from SYSCLK. MDC clock is generated from SYSCLK (AHB); as per\n//  802.3, it must not exceed 2.5MHz (also 20.4.2.6) As the AHB clock can be\n//  derived from the PIOSC (internal RC), and it can go above  specs, the\n//  datasheets specify a range of frequencies and activate one of a series of\n//  dividers to keep the MDC clock safely below 2.5MHz. We guess a divider\n//  setting based on SYSCLK with a +5% drift. If the user uses a different clock\n//  from our defaults, needs to set the macros on top Valid for TM4C129x (20.7)\n//  (4.5% worst case drift)\n// The PHY receives the main oscillator (MOSC) (20.3.1)\nstatic int guess_mdc_cr(void) {\n  uint8_t crs[] = {2, 3, 0, 1};      // EMAC->MACMIIAR::CR values\n  uint8_t div[] = {16, 26, 42, 62};  // Respective HCLK dividers\n  uint32_t sysclk = get_sysclk();    // Guess system SYSCLK\n  int i, result = -1;                // Invalid CR value\n  if (sysclk < 25000000) {\n    MG_ERROR((\"SYSCLK too low\"));\n  } else {\n    for (i = 0; i < 4; i++) {\n      if (sysclk / div[i] <= 2375000UL /* 2.5MHz - 5% */) {\n        result = crs[i];\n        break;\n      }\n    }\n    if (result < 0) MG_ERROR((\"SYSCLK too high\"));\n  }\n  MG_DEBUG((\"SYSCLK: %u, CR: %d\", sysclk, result));\n  return result;\n}\n\nstatic bool mg_tcpip_driver_tm4c_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_tm4c_data *d =\n      (struct mg_tcpip_driver_tm4c_data *) ifp->driver_data;\n  int i;\n  s_ifp = ifp;\n\n  // Init RX descriptors\n  for (i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i][0] = MG_BIT(31);                         // Own\n    s_rxdesc[i][1] = sizeof(s_rxbuf[i]) | MG_BIT(14);    // 2nd address chained\n    s_rxdesc[i][2] = (uint32_t) (uintptr_t) s_rxbuf[i];  // Point to data buffer\n    s_rxdesc[i][3] =\n        (uint32_t) (uintptr_t) s_rxdesc[(i + 1) % ETH_DESC_CNT];  // Chain\n    // MG_DEBUG((\"%d %p\", i, s_rxdesc[i]));\n  }\n\n  // Init TX descriptors\n  for (i = 0; i < ETH_DESC_CNT; i++) {\n    s_txdesc[i][2] = (uint32_t) (uintptr_t) s_txbuf[i];  // Buf pointer\n    s_txdesc[i][3] =\n        (uint32_t) (uintptr_t) s_txdesc[(i + 1) % ETH_DESC_CNT];  // Chain\n  }\n\n  EMAC->EMACDMABUSMOD |= MG_BIT(0);  // Software reset\n  while ((EMAC->EMACDMABUSMOD & MG_BIT(0)) != 0)\n    tm4cspin(1);  // Wait until done\n\n  // Set MDC clock divider. If user told us the value, use it. Otherwise, guess\n  int cr = (d == NULL || d->mdc_cr < 0) ? guess_mdc_cr() : d->mdc_cr;\n  EMAC->EMACMIIADDR = ((uint32_t) cr & 0xf) << 2;\n\n  // NOTE(cpq): we do not use extended descriptor bit 7, and do not use\n  // hardware checksum. Therefore, descriptor size is 4, not 8\n  // EMAC->EMACDMABUSMOD = MG_BIT(13) | MG_BIT(16) | MG_BIT(22) | MG_BIT(23) |\n  // MG_BIT(25);\n  EMAC->EMACIM = MG_BIT(3) | MG_BIT(9);  // Mask timestamp & PMT IT\n  EMAC->EMACFLOWCTL = MG_BIT(7);         // Disable zero-quanta pause\n  EMAC->EMACFRAMEFLTR = MG_BIT(10);      // Perfect filtering\n  // EMAC->EMACPC defaults to internal PHY (EPHY) in MMI mode\n  emac_write_phy(EPHY_ADDR, EPHYBMCR, MG_BIT(15));  // Reset internal PHY (EPHY)\n  emac_write_phy(EPHY_ADDR, EPHYBMCR, MG_BIT(12));  // Set autonegotiation\n  EMAC->EMACRXDLADDR = (uint32_t) (uintptr_t) s_rxdesc;  // RX descriptors\n  EMAC->EMACTXDLADDR = (uint32_t) (uintptr_t) s_txdesc;  // TX descriptors\n  EMAC->EMACDMAIM = MG_BIT(6) | MG_BIT(16);              // RIE, NIE\n  EMAC->EMACCFG =\n      MG_BIT(2) | MG_BIT(3) | MG_BIT(11) | MG_BIT(14);  // RE, TE, Duplex, Fast\n  EMAC->EMACDMAOPMODE =\n      MG_BIT(1) | MG_BIT(13) | MG_BIT(21) | MG_BIT(25);  // SR, ST, TSF, RSF\n  EMAC->EMACADDR0H = ((uint32_t) ifp->mac[5] << 8U) | ifp->mac[4];\n  EMAC->EMACADDR0L = (uint32_t) (ifp->mac[3] << 24) |\n                     ((uint32_t) ifp->mac[2] << 16) |\n                     ((uint32_t) ifp->mac[1] << 8) | ifp->mac[0];\n  return true;\n}\n\nstatic uint32_t s_txno;\nstatic size_t mg_tcpip_driver_tm4c_tx(const void *buf, size_t len,\n                                      struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // fail\n  } else if ((s_txdesc[s_txno][0] & MG_BIT(31))) {\n    ifp->nerr++;\n    MG_ERROR((\"No descriptors available\"));\n    // printf(\"D0 %lx SR %lx\\n\", (long) s_txdesc[0][0], (long)\n    // EMAC->EMACDMARIS);\n    len = 0;  // fail\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);     // Copy data\n    s_txdesc[s_txno][1] = (uint32_t) len;  // Set data len\n    s_txdesc[s_txno][0] =\n        MG_BIT(20) | MG_BIT(28) | MG_BIT(29) | MG_BIT(30);  // Chain,FS,LS,IC\n    s_txdesc[s_txno][0] |= MG_BIT(31);  // Set OWN bit - let DMA take over\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n  EMAC->EMACDMARIS = MG_BIT(2) | MG_BIT(5);  // Clear any prior TU/UNF\n  EMAC->EMACTXPOLLD = 0;                     // and resume\n  return len;\n}\n\nstatic void mg_tcpip_driver_tm4c_update_hash_table(struct mg_tcpip_if *ifp) {\n  // TODO(): read database, rebuild hash table\n  // add mDNS / DNS-SD multicast address\n  EMAC->EMACADDR1L = (uint32_t) mcast_addr[3] << 24 |\n                     (uint32_t) mcast_addr[2] << 16 |\n                     (uint32_t) mcast_addr[1] << 8 | (uint32_t) mcast_addr[0];\n  EMAC->EMACADDR1H = (uint32_t) mcast_addr[5] << 8 | (uint32_t) mcast_addr[4];\n  EMAC->EMACADDR1H |= MG_BIT(31);  // AE\n  (void) ifp;\n}\n\nstatic bool mg_tcpip_driver_tm4c_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    mg_tcpip_driver_tm4c_update_hash_table(ifp);\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  uint32_t bmsr = emac_read_phy(EPHY_ADDR, EPHYBMSR);\n  bool up = (bmsr & MG_BIT(2)) ? 1 : 0;\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    uint32_t sts = emac_read_phy(EPHY_ADDR, EPHYSTS);\n    // tmp = reg with flags set to the most likely situation: 100M full-duplex\n    // if(link is slow or half) set flags otherwise\n    // reg = tmp\n    uint32_t emaccfg =\n        EMAC->EMACCFG | MG_BIT(14) | MG_BIT(11);         // 100M, Full-duplex\n    if (sts & MG_BIT(1)) emaccfg &= ~MG_BIT(14);         // 10M\n    if ((sts & MG_BIT(2)) == 0) emaccfg &= ~MG_BIT(11);  // Half-duplex\n    EMAC->EMACCFG = emaccfg;  // IRQ handler does not fiddle with this register\n    MG_DEBUG((\"Link is %uM %s-duplex\", emaccfg & MG_BIT(14) ? 100 : 10,\n              emaccfg & MG_BIT(11) ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\nvoid EMAC0_IRQHandler(void);\nstatic uint32_t s_rxno;\nvoid EMAC0_IRQHandler(void) {\n  int i;\n  if (EMAC->EMACDMARIS & MG_BIT(6)) {           // Frame received, loop\n    EMAC->EMACDMARIS = MG_BIT(16) | MG_BIT(6);  // Clear flag\n    for (i = 0; i < 10; i++) {  // read as they arrive but not forever\n      if (s_rxdesc[s_rxno][0] & MG_BIT(31)) break;  // exit when done\n      if (((s_rxdesc[s_rxno][0] & (MG_BIT(8) | MG_BIT(9))) ==\n           (MG_BIT(8) | MG_BIT(9))) &&\n          !(s_rxdesc[s_rxno][0] & MG_BIT(15))) {  // skip partial/errored frames\n        uint32_t len = ((s_rxdesc[s_rxno][0] >> 16) & (MG_BIT(14) - 1));\n        //  printf(\"%lx %lu %lx %.8lx\\n\", s_rxno, len, s_rxdesc[s_rxno][0],\n        //  EMAC->EMACDMARIS);\n        mg_tcpip_qwrite(s_rxbuf[s_rxno], len > 4 ? len - 4 : len, s_ifp);\n      }\n      s_rxdesc[s_rxno][0] = MG_BIT(31);\n      if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n    }\n  }\n  EMAC->EMACDMARIS = MG_BIT(7);  // Clear possible RU while processing\n  EMAC->EMACRXPOLLD = 0;         // and resume RX\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_tm4c = {mg_tcpip_driver_tm4c_init,\n                                               mg_tcpip_driver_tm4c_tx, NULL,\n                                               mg_tcpip_driver_tm4c_poll};\n#endif\n"
  },
  {
    "path": "src/drivers/tm4c.h",
    "content": "#pragma once\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_TM4C) && MG_ENABLE_DRIVER_TM4C\n\nstruct mg_tcpip_driver_tm4c_data {\n  // MDC clock divider. MDC clock is derived from SYSCLK, must not exceed 2.5MHz\n  //    SYSCLK range   DIVIDER   mdc_cr VALUE\n  //    -------------------------------------\n  //                                -1  <-- tell driver to guess the value\n  //    60-100 MHz    SYSCLK/42      0\n  //    100-150 MHz   SYSCLK/62      1  <-- value for EK-TM4C129* on max speed\n  //    20-35 MHz     SYSCLK/16      2\n  //    35-60 MHz     SYSCLK/26      3\n  //    0x4-0xF Reserved\n  int mdc_cr;  // Valid values: -1, 0, 1, 2, 3\n};\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 1\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                               \\\n  do {                                                          \\\n    static struct mg_tcpip_driver_tm4c_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                             \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                     \\\n    mif_.ip = MG_TCPIP_IP;                                      \\\n    mif_.mask = MG_TCPIP_MASK;                                  \\\n    mif_.gw = MG_TCPIP_GW;                                      \\\n    mif_.driver = &mg_tcpip_driver_tm4c;                        \\\n    mif_.driver_data = &driver_data_;                           \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                               \\\n    mg_tcpip_init(mgr, &mif_);                                  \\\n    MG_INFO((\"Driver: tm4c, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n"
  },
  {
    "path": "src/drivers/tms570.c",
    "content": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_TMS570) && MG_ENABLE_DRIVER_TMS570\nstruct tms570_emac_ctrl {\n  volatile uint32_t REVID, SOFTRESET, RESERVED1[1], INTCONTROL, C0RXTHRESHEN,\n  C0RXEN, C0TXEN, C0MISCEN, RESERVED2[8],\n  C0RXTHRESHSTAT, C0RXSTAT, C0TXSTAT, C0MISCSTAT,\n  RESERVED3[8],\n  C0RXIMAX, C0TXIMAX;\n};\nstruct tms570_emac {\n  volatile uint32_t TXREVID, TXCONTROL, TXTEARDOWN, RESERVED1[1], RXREVID,\n  RXCONTROL, RXTEARDOWN, RESERVED2[25], TXINTSTATRAW,TXINTSTATMASKED,\n  TXINTMASKSET, TXINTMASKCLEAR, MACINVECTOR, MACEOIVECTOR, RESERVED8[2], RXINTSTATRAW,\n  RXINTSTATMASKED, RXINTMASKSET, RXINTMASKCLEAR, MACINTSTATRAW, MACINTSTATMASKED,\n  MACINTMASKSET, MACINTMASKCLEAR, RESERVED3[16], RXMBPENABLE, RXUNICASTSET,\n  RXUNICASTCLEAR, RXMAXLEN, RXBUFFEROFFSET, RXFILTERLOWTHRESH, RESERVED9[2], RXFLOWTHRESH[8],\n  RXFREEBUFFER[8], MACCONTROL, MACSTATUS, EMCONTROL, FIFOCONTROL, MACCONFIG,\n  SOFTRESET, RESERVED4[22], MACSRCADDRLO, MACSRCADDRHI, MACHASH1, MACHASH2,\n  BOFFTEST, TPACETEST, RXPAUSE, TXPAUSE, RESERVED5[4], RXGOODFRAMES, RXBCASTFRAMES,\n  RXMCASTFRAMES, RXPAUSEFRAMES, RXCRCERRORS, RXALIGNCODEERRORS, RXOVERSIZED,\n  RXJABBER, RXUNDERSIZED, RXFRAGMENTS, RXFILTERED, RXQOSFILTERED, RXOCTETS,\n  TXGOODFRAMES, TXBCASTFRAMES, TXMCASTFRAMES, TXPAUSEFRAMES, TXDEFERRED,\n  TXCOLLISION, TXSINGLECOLL, TXMULTICOLL, TXEXCESSIVECOLL, TXLATECOLL,\n  TXUNDERRUN, TXCARRIERSENSE, TXOCTETS, FRAME64, FRAME65T127, FRAME128T255,\n  FRAME256T511, FRAME512T1023, FRAME1024TUP, NETOCTETS, RXSOFOVERRUNS,\n  RXMOFOVERRUNS, RXDMAOVERRUNS, RESERVED6[156], MACADDRLO, MACADDRHI,\n  MACINDEX, RESERVED7[61], TXHDP[8], RXHDP[8], TXCP[8], RXCP[8];\n};\nstruct tms570_mdio {\n  volatile uint32_t REVID, CONTROL, ALIVE, LINK, LINKINTRAW, LINKINTMASKED,\n  RESERVED1[2], USERINTRAW, USERINTMASKED, USERINTMASKSET, USERINTMASKCLEAR,\n  RESERVED2[20], USERACCESS0, USERPHYSEL0, USERACCESS1, USERPHYSEL1;\n};\n#define SWAP32(x) ( (((x) & 0x000000FF) << 24) | \\\n                              (((x) & 0x0000FF00) << 8)  | \\\n                              (((x) & 0x00FF0000) >> 8)  | \\\n                              (((x) & 0xFF000000) >> 24) )\n#undef EMAC\n#undef EMAC_CTRL\n#undef MDIO\n#define EMAC ((struct tms570_emac *) (uintptr_t) 0xFCF78000)\n#define EMAC_CTRL ((struct tms570_emac_ctrl *) (uintptr_t) 0xFCF78800)\n#define MDIO ((struct tms570_mdio *) (uintptr_t) 0xFCF78900)\n#define ETH_PKT_SIZE 1540  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 4           // Descriptor size (words)\nstatic uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS] \n  __attribute__((section(\".ETH_CPPI\"), aligned(4)));      // TX descriptors\nstatic uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS] \n  __attribute__((section(\".ETH_CPPI\"), aligned(4)));      // RX descriptors\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE] \n  __attribute__((aligned(4)));  // RX ethernet buffers\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE] \n  __attribute__((aligned(4)));  // TX ethernet buffers\nstatic struct mg_tcpip_if *s_ifp;                    // MIP interface\nstatic uint16_t emac_read_phy(uint8_t addr, uint8_t reg) {\n  while(MDIO->USERACCESS0 & MG_BIT(31)) (void) 0;\n  MDIO->USERACCESS0 = MG_BIT(31) | ((reg & 0x1f) << 21) |\n                      ((addr & 0x1f) << 16);\n  while(MDIO->USERACCESS0 & MG_BIT(31)) (void) 0;\n  return MDIO->USERACCESS0 & 0xffff;\n}\nstatic void emac_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  while(MDIO->USERACCESS0 & MG_BIT(31)) (void) 0;\n  MDIO->USERACCESS0 = MG_BIT(31) | MG_BIT(30) | ((reg & 0x1f) << 21) |\n                      ((addr & 0x1f) << 16) | (val & 0xffff);\n  while(MDIO->USERACCESS0 & MG_BIT(31)) (void) 0;\n}\nstatic bool mg_tcpip_driver_tms570_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_tms570_data *d =\n      (struct mg_tcpip_driver_tms570_data *) ifp->driver_data;\n  s_ifp = ifp;\n  EMAC_CTRL->SOFTRESET = MG_BIT(0); // Reset the EMAC Control Module\n  while(EMAC_CTRL->SOFTRESET & MG_BIT(0)) (void) 0; // wait\n  EMAC->SOFTRESET = MG_BIT(0); // Reset the EMAC Module\n  while(EMAC->SOFTRESET & MG_BIT(0)) (void) 0;\n  EMAC->MACCONTROL = 0;\n  EMAC->RXCONTROL = 0;\n  EMAC->TXCONTROL = 0;\n  // Initialize all the header descriptor pointer registers\n  uint32_t i;\n  for(i =  0; i < ETH_DESC_CNT; i++) {\n    EMAC->RXHDP[i] = 0;\n    EMAC->TXHDP[i] = 0;\n    EMAC->RXCP[i] = 0;\n    EMAC->TXCP[i] = 0;\n    ///EMAC->RXFREEBUFFER[i] = 0xff;\n  }\n  // Clear the interrupt enable for all the channels\n  EMAC->TXINTMASKCLEAR = 0xff;\n  EMAC->RXINTMASKCLEAR = 0xff;\n  EMAC->MACHASH1 = 0;\n  EMAC->MACHASH2 = 0;\n  EMAC->RXBUFFEROFFSET = 0;\n  EMAC->RXUNICASTCLEAR = 0xff;\n  EMAC->RXUNICASTSET = 0;\n  EMAC->RXMBPENABLE = 0;\n  // init MDIO\n  // MDIO_CLK frequency = VCLK3/(CLKDIV + 1). (MDIO must be between 1.0 - 2.5Mhz)\n  uint32_t clkdiv = 75; // VCLK is configured to 75Mhz\n  // CLKDIV, ENABLE, PREAMBLE, FAULTENB\n  MDIO->CONTROL = (clkdiv - 1) | MG_BIT(30) | MG_BIT(20) | MG_BIT(18);\n  volatile int delay = 0xfff;\n  while (delay-- != 0) (void) 0;\n  struct mg_phy phy = {emac_read_phy, emac_write_phy};\n  mg_phy_init(&phy, d->phy_addr, MG_PHY_CLOCKS_MAC);\n  uint32_t channel;\n  for (channel = 0; channel < 8; channel++) {\n    EMAC->MACINDEX = channel;\n    EMAC->MACADDRHI = ifp->mac[0] | (ifp->mac[1] << 8) | (ifp->mac[2] << 16) |\n                       (ifp->mac[3] << 24);\n    EMAC->MACADDRLO = ifp->mac[4] | (ifp->mac[5] << 8) | MG_BIT(20) |\n                      MG_BIT(19) | (channel << 16);\n  }\n  EMAC->RXUNICASTSET = 1; // accept unicast frames;\n\n  EMAC->RXMBPENABLE |= MG_BIT(30) | MG_BIT(13); // CRC, broadcast\n\n  // Initialize the descriptors\n  for (i = 0; i < ETH_DESC_CNT; i++) {\n    if (i < ETH_DESC_CNT - 1) {\n      s_txdesc[i][0] = 0;\n      s_rxdesc[i][0] = SWAP32(((uint32_t) &s_rxdesc[i + 1][0]));\n    }\n    s_txdesc[i][1] = SWAP32(((uint32_t) s_txbuf[i]));\n    s_rxdesc[i][1] = SWAP32(((uint32_t) s_rxbuf[i]));\n    s_txdesc[i][2] = 0;\n    s_rxdesc[i][2] = SWAP32(ETH_PKT_SIZE);\n    s_txdesc[i][3] = 0;\n    s_rxdesc[i][3] = SWAP32(MG_BIT(29)); // OWN\n  }\n  s_txdesc[ETH_DESC_CNT - 1][0] = 0;\n  s_rxdesc[ETH_DESC_CNT - 1][0] = 0;\n  \n  EMAC->MACCONTROL = MG_BIT(5) | MG_BIT(0); // Enable MII, Full-duplex\n  //EMAC->TXINTMASKSET = 1; // Enable TX interrupt\n  EMAC->RXINTMASKSET = 1; // Enable RX interrupt\n  //EMAC_CTRL->C0TXEN = 1; // TX completion interrupt\n  EMAC_CTRL->C0RXEN = 1; // RX completion interrupt\n  EMAC->TXCONTROL = 1; // TXEN\n  EMAC->RXCONTROL = 1; // RXEN\n  EMAC->RXHDP[0] = (uint32_t) &s_rxdesc[0][0];\n  return true;\n}\nstatic uint32_t s_txno;\nstatic size_t mg_tcpip_driver_tms570_tx(const void *buf, size_t len,\n                                      struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // fail\n  } else if ((s_txdesc[s_txno][3] & SWAP32(MG_BIT(29)))) {\n    ifp->nerr++;\n    MG_ERROR((\"No descriptors available\"));\n    len = 0;  // fail\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);     // Copy data\n    if (len < 128) len = 128;\n    s_txdesc[s_txno][2] = SWAP32((uint32_t) len);  // Set data len\n    s_txdesc[s_txno][3] =\n        SWAP32(MG_BIT(31) | MG_BIT(30) | MG_BIT(29) | len);  // SOP, EOP, OWN, length\n    \n    while(EMAC->TXHDP[0] != 0) (void) 0;\n    EMAC->TXHDP[0] = (uint32_t) &s_txdesc[s_txno][0];\n    if(++s_txno == ETH_DESC_CNT) {\n      s_txno = 0;\n    }\n  }\n  return len;\n  (void) ifp;\n}\n\nstatic void mg_tcpip_driver_tms570_update_hash_table(struct mg_tcpip_if *ifp) {\n  // TODO(): read database, rebuild hash table\n  // Setting Hash Index for 01:00:5e:00:00:fb (multicast)\n  // using TMS570 XOR method (32.5.37).\n  // computed hash is 55, which means bit 23 (55 - 32) in\n  // HASH2 register must be set\n  EMAC->MACHASH2 = MG_BIT(23);\n  EMAC->RXMBPENABLE = MG_BIT(5); // enable hash filtering\n  (void) ifp;\n}\n\nstatic bool mg_tcpip_driver_tms570_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    mg_tcpip_driver_tms570_update_hash_table(ifp);\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  struct mg_tcpip_driver_tms570_data *d =\n      (struct mg_tcpip_driver_tms570_data *) ifp->driver_data;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {emac_read_phy, emac_write_phy};\n  if (!s1) return false;\n  up = mg_phy_up(&phy, d->phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {\n    // link state just went up\n    MG_DEBUG((\"Link is %uM %s-duplex\", speed == MG_PHY_SPEED_10M ? 10 : 100,\n              full_duplex ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\n#pragma CODE_STATE(EMAC_TX_IRQHandler, 32)\n#pragma INTERRUPT(EMAC_TX_IRQHandler, IRQ)\nvoid EMAC_TX_IRQHandler(void) {\n  uint32_t status = EMAC_CTRL->C0TXSTAT;\n  if (status & 1) { // interrupt caused on channel 0\n    while(s_txdesc[s_txno][3] & SWAP32(MG_BIT(29))) (void) 0;\n    EMAC->TXCP[0] = (uint32_t) &s_txdesc[s_txno][0];\n  }\n  //Write the DMA end of interrupt vector\n  EMAC->MACEOIVECTOR = 2;\n}\nstatic uint32_t s_rxno;\n#pragma CODE_STATE(EMAC_RX_IRQHandler, 32)\n#pragma INTERRUPT(EMAC_RX_IRQHandler, IRQ)\nvoid EMAC_RX_IRQHandler(void) {\n  uint32_t status = EMAC_CTRL->C0RXSTAT;\n  if (status & 1) { // Frame received, loop\n    uint32_t i;\n    //MG_INFO((\"RX interrupt\"));\n    for (i = 0; i < 10; i++) {   // read as they arrive but not forever\n      if (s_rxdesc[s_rxno][3] & SWAP32(MG_BIT(29))) break;\n      uint32_t len = SWAP32(s_rxdesc[s_rxno][3]) & 0xffff;\n      //MG_INFO((\"recv len: %d\", len));\n      //mg_hexdump(s_rxbuf[s_rxno], len);\n      mg_tcpip_qwrite(s_rxbuf[s_rxno], len > 4 ? len - 4 : len, s_ifp);\n      uint32_t flags = s_rxdesc[s_rxno][3];\n      s_rxdesc[s_rxno][3] = SWAP32(MG_BIT(29));\n      s_rxdesc[s_rxno][2] = SWAP32(ETH_PKT_SIZE);\n      EMAC->RXCP[0] = (uint32_t) &s_rxdesc[s_rxno][0];\n      if (flags & SWAP32(MG_BIT(28))) {\n        //MG_INFO((\"EOQ detected\"));\n        EMAC->RXHDP[0] = (uint32_t) &s_rxdesc[0][0];\n      }\n      if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n    }\n  }\n  //Write the DMA end of interrupt vector\n  EMAC->MACEOIVECTOR = 1;\n}\nstruct mg_tcpip_driver mg_tcpip_driver_tms570 = {mg_tcpip_driver_tms570_init,\n                                               mg_tcpip_driver_tms570_tx, NULL,\n                                               mg_tcpip_driver_tms570_poll};\n#endif\n\n"
  },
  {
    "path": "src/drivers/tms570.h",
    "content": "#pragma once\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_TMS570) && MG_ENABLE_DRIVER_TMS570\nstruct mg_tcpip_driver_tms570_data {\n  int mdc_cr;\n  int phy_addr;\n};\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 0\n#endif\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 1\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                               \\\n  do {                                                          \\\n    static struct mg_tcpip_driver_tms570_data driver_data_;     \\\n    static struct mg_tcpip_if mif_;                             \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                     \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                  \\\n    mif_.ip = MG_TCPIP_IP;                                      \\\n    mif_.mask = MG_TCPIP_MASK;                                  \\\n    mif_.gw = MG_TCPIP_GW;                                      \\\n    mif_.driver = &mg_tcpip_driver_tms570;                      \\\n    mif_.driver_data = &driver_data_;                           \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                               \\\n    mg_tcpip_init(mgr, &mif_);                                  \\\n    MG_INFO((\"Driver: tms570, MAC: %M\", mg_print_mac, mif_.mac));\\\n  } while (0)\n#endif\n\n"
  },
  {
    "path": "src/drivers/w5100.c",
    "content": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_W5100) && MG_ENABLE_DRIVER_W5100\n\nstatic void w5100_txn(struct mg_tcpip_spi *s, uint16_t addr, bool wr, void *buf,\n                      size_t len) {\n  size_t i;\n  uint8_t *p = (uint8_t *) buf;\n  uint8_t control = wr ? 0xF0 : 0x0F;\n  uint8_t cmd[] = {control, (uint8_t) (addr >> 8), (uint8_t) (addr & 255)};\n  s->begin(s->spi);\n  for (i = 0; i < sizeof(cmd); i++) s->txn(s->spi, cmd[i]);\n  for (i = 0; i < len; i++) {\n    uint8_t r = s->txn(s->spi, p[i]);\n    if (!wr) p[i] = r;\n  }\n  s->end(s->spi);\n}\n\n// clang-format off\nstatic  void w5100_wn(struct mg_tcpip_spi *s, uint16_t addr, void *buf, size_t len) { w5100_txn(s, addr, true, buf, len); }\nstatic  void w5100_w1(struct mg_tcpip_spi *s, uint16_t addr, uint8_t val) { w5100_wn(s, addr, &val, 1); }\nstatic  void w5100_w2(struct mg_tcpip_spi *s, uint16_t addr, uint16_t val) { uint8_t buf[2] = {(uint8_t) (val >> 8), (uint8_t) (val & 255)}; w5100_wn(s, addr, buf, sizeof(buf)); }\nstatic  void w5100_rn(struct mg_tcpip_spi *s, uint16_t addr, void *buf, size_t len) { w5100_txn(s, addr, false, buf, len); }\nstatic  uint8_t w5100_r1(struct mg_tcpip_spi *s, uint16_t addr) { uint8_t r = 0; w5100_rn(s, addr, &r, 1); return r; }\nstatic  uint16_t w5100_r2(struct mg_tcpip_spi *s, uint16_t addr) { uint8_t buf[2] = {0, 0}; w5100_rn(s, addr, buf, sizeof(buf)); return (uint16_t) ((buf[0] << 8) | buf[1]); }\n// clang-format on\n\nstatic size_t w5100_rx(void *buf, size_t buflen, struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data;\n  uint16_t r = 0, n = 0, len = (uint16_t) buflen, n2;  // Read recv len\n  while ((n2 = w5100_r2(s, 0x426)) > n) n = n2;        // Until it is stable\n  if (n > 0) {\n    uint16_t ptr = w5100_r2(s, 0x428);  // Get read pointer\n    if (n <= len + 2 && n > 1) {\n      r = (uint16_t) (n - 2);\n    }\n    uint16_t rxbuf_size = (1 << (w5100_r1(s, 0x1a) & 3)) * 1024;\n    uint16_t rxbuf_addr = 0x6000;\n    uint16_t ptr_ofs = (ptr + 2) & (rxbuf_size - 1);\n    if (ptr_ofs + r < rxbuf_size) {\n      w5100_rn(s, rxbuf_addr + ptr_ofs, buf, r);\n    } else {\n      uint16_t remaining_len = rxbuf_size - ptr_ofs;\n      w5100_rn(s, rxbuf_addr + ptr_ofs, buf, remaining_len);\n      w5100_rn(s, rxbuf_addr, buf + remaining_len, n - remaining_len);\n    }\n    w5100_w2(s, 0x428, (uint16_t) (ptr + n));\n    w5100_w1(s, 0x401, 0x40);  // Sock0 CR -> RECV\n  }\n  return r;\n}\n\nstatic size_t w5100_tx(const void *buf, size_t buflen,\n                       struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data;\n  uint16_t i, n = 0, ptr = 0, len = (uint16_t) buflen;\n  while (n < len) n = w5100_r2(s, 0x420);  // Wait for space\n  ptr = w5100_r2(s, 0x424);                // Get write pointer\n  uint16_t txbuf_size = (1 << (w5100_r1(s, 0x1b) & 3)) * 1024;\n  uint16_t ptr_ofs = ptr & (txbuf_size - 1);\n  uint16_t txbuf_addr = 0x4000;\n  if (ptr_ofs + len > txbuf_size) {\n    uint16_t size = txbuf_size - ptr_ofs;\n    w5100_wn(s, txbuf_addr + ptr_ofs, (char *) buf, size);\n    w5100_wn(s, txbuf_addr, (char *) buf + size, len - size);\n  } else {\n    w5100_wn(s, txbuf_addr + ptr_ofs, (char *) buf, len);\n  }\n  w5100_w2(s, 0x424, (uint16_t) (ptr + len));  // Advance write pointer\n  w5100_w1(s, 0x401, 0x20);                    // Sock0 CR -> SEND\n  for (i = 0; i < 40; i++) {\n    uint8_t ir = w5100_r1(s, 0x402);  // Read S0 IR\n    if (ir == 0) continue;\n    // printf(\"IR %d, len=%d, free=%d, ptr %d\\n\", ir, (int) len, (int) n, ptr);\n    w5100_w1(s, 0x402, ir);    // Write S0 IR: clear it!\n    if (ir & 8) len = 0;       // Timeout. Report error\n    if (ir & (16 | 8)) break;  // Stop on SEND_OK or timeout\n  }\n  return len;\n}\n\nstatic bool w5100_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data;\n  s->end(s->spi);\n  w5100_w1(s, 0, 0x80);               // Reset chip: CR -> 0x80\n  w5100_w1(s, 0x72, 0x53);            // CR PHYLCKR -> unlock PHY\n  w5100_w1(s, 0x46, 0);               // CR PHYCR0 -> autonegotiation\n  w5100_w1(s, 0x47, 0);               // CR PHYCR1 -> reset\n  w5100_w1(s, 0x72, 0x00);            // CR PHYLCKR -> lock PHY\n  w5100_wn(s, 0x09, ifp->mac, 6);     // SHAR\n  w5100_w1(s, 0x1a, 6);               // Sock0 RX buf size - 4KB\n  w5100_w1(s, 0x1b, 6);               // Sock0 TX buf size - 4KB\n  w5100_w1(s, 0x400, 0x44);           // Sock0 MR -> MACRAW, MAC filter\n  w5100_w1(s, 0x401, 1);              // Sock0 CR -> OPEN\n  return w5100_r1(s, 0x403) == 0x42;  // Sock0 SR == MACRAW\n}\n\nstatic bool w5100_poll(struct mg_tcpip_if *ifp, bool s1) {\n  struct mg_tcpip_spi *spi = (struct mg_tcpip_spi *) ifp->driver_data;\n  return s1 ? w5100_r1(spi, 0x3c /* PHYSR */) & 1\n            : false;  // Bit 0 of PHYSR is LNK (0 - down, 1 - up)\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_w5100 = {w5100_init, w5100_tx, w5100_rx,\n                                                w5100_poll};\n#endif\n"
  },
  {
    "path": "src/drivers/w5500.c",
    "content": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_W5500) && MG_ENABLE_DRIVER_W5500\n\nenum { W5500_CR = 0, W5500_S0 = 1, W5500_TX0 = 2, W5500_RX0 = 3 };\n\nstatic void w5500_txn(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr,\n                      bool wr, void *buf, size_t len) {\n  size_t i;\n  uint8_t *p = (uint8_t *) buf;\n  uint8_t cmd[] = {(uint8_t) (addr >> 8), (uint8_t) (addr & 255),\n                   (uint8_t) ((block << 3) | (wr ? 4 : 0))};\n  s->begin(s->spi);\n  for (i = 0; i < sizeof(cmd); i++) s->txn(s->spi, cmd[i]);\n  for (i = 0; i < len; i++) {\n    uint8_t r = s->txn(s->spi, p[i]);\n    if (!wr) p[i] = r;\n  }\n  s->end(s->spi);\n}\n\n// clang-format off\nstatic  void w5500_wn(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr, void *buf, size_t len) { w5500_txn(s, block, addr, true, buf, len); }\nstatic  void w5500_w1(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr, uint8_t val) { w5500_wn(s, block, addr, &val, 1); }\nstatic  void w5500_w2(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr, uint16_t val) { uint8_t buf[2] = {(uint8_t) (val >> 8), (uint8_t) (val & 255)}; w5500_wn(s, block, addr, buf, sizeof(buf)); }\nstatic  void w5500_rn(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr, void *buf, size_t len) { w5500_txn(s, block, addr, false, buf, len); }\nstatic  uint8_t w5500_r1(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr) { uint8_t r = 0; w5500_rn(s, block, addr, &r, 1); return r; }\nstatic  uint16_t w5500_r2(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr) { uint8_t buf[2] = {0, 0}; w5500_rn(s, block, addr, buf, sizeof(buf)); return (uint16_t) ((buf[0] << 8) | buf[1]); }\n// clang-format on\n\nstatic size_t w5500_rx(void *buf, size_t buflen, struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data;\n  uint16_t r = 0, n = 0, len = (uint16_t) buflen, n2;     // Read recv len\n  while ((n2 = w5500_r2(s, W5500_S0, 0x26)) > n) n = n2;  // Until it is stable\n  // printf(\"RSR: %d\\n\", (int) n);\n  if (n > 0) {\n    uint16_t ptr = w5500_r2(s, W5500_S0, 0x28);  // Get read pointer\n    n = w5500_r2(s, W5500_RX0, ptr);             // Read frame length\n    if (n <= len + 2 && n > 1) {\n      r = (uint16_t) (n - 2);\n      w5500_rn(s, W5500_RX0, (uint16_t) (ptr + 2), buf, r);\n    }\n    w5500_w2(s, W5500_S0, 0x28, (uint16_t) (ptr + n));  // Advance read pointer\n    w5500_w1(s, W5500_S0, 1, 0x40);                     // Sock0 CR -> RECV\n    // printf(\"  RX_RD: tot=%u n=%u r=%u\\n\", n2, n, r);\n  }\n  return r;\n}\n\nstatic size_t w5500_tx(const void *buf, size_t buflen,\n                       struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data;\n  uint16_t i, ptr, n = 0, len = (uint16_t) buflen;\n  while (n < len) n = w5500_r2(s, W5500_S0, 0x20);      // Wait for space\n  ptr = w5500_r2(s, W5500_S0, 0x24);                    // Get write pointer\n  w5500_wn(s, W5500_TX0, ptr, (void *) buf, len);       // Write data\n  w5500_w2(s, W5500_S0, 0x24, (uint16_t) (ptr + len));  // Advance write pointer\n  w5500_w1(s, W5500_S0, 1, 0x20);                       // Sock0 CR -> SEND\n  for (i = 0; i < 40; i++) {\n    uint8_t ir = w5500_r1(s, W5500_S0, 2);  // Read S0 IR\n    if (ir == 0) continue;\n    // printf(\"IR %d, len=%d, free=%d, ptr %d\\n\", ir, (int) len, (int) n, ptr);\n    w5500_w1(s, W5500_S0, 2, ir);  // Write S0 IR: clear it!\n    if (ir & 8) len = 0;           // Timeout. Report error\n    if (ir & (16 | 8)) break;      // Stop on SEND_OK or timeout\n  }\n  return len;\n}\n\nstatic bool w5500_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data;\n  s->end(s->spi);\n  w5500_w1(s, W5500_CR, 0, 0x80);     // Reset chip: CR -> 0x80\n  w5500_w1(s, W5500_CR, 0x2e, 0);     // CR PHYCFGR -> reset\n  w5500_w1(s, W5500_CR, 0x2e, 0xf8);  // CR PHYCFGR -> set\n  // w5500_wn(s, W5500_CR, 9, s->mac, 6);      // Set source MAC\n  w5500_w1(s, W5500_S0, 0x1e, 16);          // Sock0 RX buf size\n  w5500_w1(s, W5500_S0, 0x1f, 16);          // Sock0 TX buf size\n  w5500_w1(s, W5500_S0, 0, 4);              // Sock0 MR -> MACRAW\n  w5500_w1(s, W5500_S0, 1, 1);              // Sock0 CR -> OPEN\n  return w5500_r1(s, W5500_S0, 3) == 0x42;  // Sock0 SR == MACRAW\n}\n\nstatic bool w5500_poll(struct mg_tcpip_if *ifp, bool s1) {\n  struct mg_tcpip_spi *spi = (struct mg_tcpip_spi *) ifp->driver_data;\n  return s1 ? w5500_r1(spi, W5500_CR, 0x2e /* PHYCFGR */) & 1\n            : false;  // Bit 0 of PHYCFGR is LNK (0 - down, 1 - up)\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_w5500 = {w5500_init, w5500_tx, w5500_rx,\n                                                w5500_poll};\n#endif\n"
  },
  {
    "path": "src/drivers/xmc.c",
    "content": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_XMC) && MG_ENABLE_DRIVER_XMC\n\nstruct ETH_GLOBAL_TypeDef {\n  volatile uint32_t MAC_CONFIGURATION, MAC_FRAME_FILTER, HASH_TABLE_HIGH,\n      HASH_TABLE_LOW, GMII_ADDRESS, GMII_DATA, FLOW_CONTROL, VLAN_TAG, VERSION,\n      DEBUG, REMOTE_WAKE_UP_FRAME_FILTER, PMT_CONTROL_STATUS, RESERVED[2],\n      INTERRUPT_STATUS, INTERRUPT_MASK, MAC_ADDRESS0_HIGH, MAC_ADDRESS0_LOW,\n      MAC_ADDRESS1_HIGH, MAC_ADDRESS1_LOW, MAC_ADDRESS2_HIGH, MAC_ADDRESS2_LOW,\n      MAC_ADDRESS3_HIGH, MAC_ADDRESS3_LOW, RESERVED1[40], MMC_CONTROL,\n      MMC_RECEIVE_INTERRUPT, MMC_TRANSMIT_INTERRUPT, MMC_RECEIVE_INTERRUPT_MASK,\n      MMC_TRANSMIT_INTERRUPT_MASK, TX_STATISTICS[26], RESERVED2,\n      RX_STATISTICS_1[26], RESERVED3[6], MMC_IPC_RECEIVE_INTERRUPT_MASK,\n      RESERVED4, MMC_IPC_RECEIVE_INTERRUPT, RESERVED5, RX_STATISTICS_2[30],\n      RESERVED7[286], TIMESTAMP_CONTROL, SUB_SECOND_INCREMENT,\n      SYSTEM_TIME_SECONDS, SYSTEM_TIME_NANOSECONDS, SYSTEM_TIME_SECONDS_UPDATE,\n      SYSTEM_TIME_NANOSECONDS_UPDATE, TIMESTAMP_ADDEND, TARGET_TIME_SECONDS,\n      TARGET_TIME_NANOSECONDS, SYSTEM_TIME_HIGHER_WORD_SECONDS,\n      TIMESTAMP_STATUS, PPS_CONTROL, RESERVED8[564], BUS_MODE,\n      TRANSMIT_POLL_DEMAND, RECEIVE_POLL_DEMAND,\n      RECEIVE_DESCRIPTOR_LIST_ADDRESS, TRANSMIT_DESCRIPTOR_LIST_ADDRESS, STATUS,\n      OPERATION_MODE, INTERRUPT_ENABLE,\n      MISSED_FRAME_AND_BUFFER_OVERFLOW_COUNTER,\n      RECEIVE_INTERRUPT_WATCHDOG_TIMER, RESERVED9, AHB_STATUS, RESERVED10[6],\n      CURRENT_HOST_TRANSMIT_DESCRIPTOR, CURRENT_HOST_RECEIVE_DESCRIPTOR,\n      CURRENT_HOST_TRANSMIT_BUFFER_ADDRESS, CURRENT_HOST_RECEIVE_BUFFER_ADDRESS,\n      HW_FEATURE;\n};\n\n#undef ETH0\n#define ETH0 ((struct ETH_GLOBAL_TypeDef *) 0x5000C000UL)\n\n#define ETH_PKT_SIZE 1536  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 4           // Descriptor size (words)\n\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM;\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM;\nstatic uint32_t s_rxdesc[ETH_DESC_CNT]\n                        [ETH_DS] MG_ETH_RAM;  // RX descriptors\nstatic uint32_t s_txdesc[ETH_DESC_CNT]\n                        [ETH_DS] MG_ETH_RAM;  // TX descriptors\nstatic uint8_t s_txno;                             // Current TX descriptor\nstatic uint8_t s_rxno;                             // Current RX descriptor\n\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\nenum { MG_PHY_ADDR = 0, MG_PHYREG_BCR = 0, MG_PHYREG_BSR = 1 };\n\nstatic uint16_t eth_read_phy(uint8_t addr, uint8_t reg) {\n  ETH0->GMII_ADDRESS = (ETH0->GMII_ADDRESS & 0x3c) | ((uint32_t) addr << 11) |\n                       ((uint32_t) reg << 6) | 1;\n  while ((ETH0->GMII_ADDRESS & 1) != 0) (void) 0;\n  return (uint16_t) (ETH0->GMII_DATA & 0xffff);\n}\n\nstatic void eth_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  ETH0->GMII_DATA = val;\n  ETH0->GMII_ADDRESS = (ETH0->GMII_ADDRESS & 0x3c) | ((uint32_t) addr << 11) |\n                       ((uint32_t) reg << 6) | 3;\n  while ((ETH0->GMII_ADDRESS & 1) != 0) (void) 0;\n}\n\nstatic uint32_t get_clock_rate(struct mg_tcpip_driver_xmc_data *d) {\n  if (d->mdc_cr == -1) {\n    // assume ETH clock is 60MHz by default\n    // then according to 13.2.8.1, we need to set value 3\n    return 3;\n  }\n\n  return d->mdc_cr;\n}\n\nstatic bool mg_tcpip_driver_xmc_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_xmc_data *d =\n      (struct mg_tcpip_driver_xmc_data *) ifp->driver_data;\n  s_ifp = ifp;\n\n  // reset MAC\n  ETH0->BUS_MODE |= 1;\n  while (ETH0->BUS_MODE & 1) (void) 0;\n\n  // set clock rate\n  ETH0->GMII_ADDRESS = get_clock_rate(d) << 2;\n\n  // init phy\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  mg_phy_init(&phy, d->phy_addr, MG_PHY_CLOCKS_MAC);\n\n  // configure MAC: DO, DM, FES, TC\n  ETH0->MAC_CONFIGURATION = MG_BIT(13) | MG_BIT(11) | MG_BIT(14) | MG_BIT(24);\n\n  // set the MAC address\n  ETH0->MAC_ADDRESS0_HIGH = MG_U32(0, 0, ifp->mac[5], ifp->mac[4]);\n  ETH0->MAC_ADDRESS0_LOW =\n      MG_U32(ifp->mac[3], ifp->mac[2], ifp->mac[1], ifp->mac[0]);\n\n  // Configure the receive filter\n  ETH0->MAC_FRAME_FILTER = MG_BIT(10);  // Perfect filter\n  // Disable flow control\n  ETH0->FLOW_CONTROL = 0;\n  // Enable store and forward mode\n  ETH0->OPERATION_MODE = MG_BIT(25) | MG_BIT(21);  // RSF, TSF\n\n  // Configure DMA bus mode (AAL, USP, RPBL, PBL)\n  ETH0->BUS_MODE = MG_BIT(25) | MG_BIT(23) | (32 << 17) | (32 << 8);\n\n  // init RX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i][0] = MG_BIT(31);  // OWN descriptor\n    s_rxdesc[i][1] = MG_BIT(14) | ETH_PKT_SIZE;\n    s_rxdesc[i][2] = (uint32_t) s_rxbuf[i];\n    if (i == ETH_DESC_CNT - 1) {\n      s_rxdesc[i][3] = (uint32_t) &s_rxdesc[0][0];\n    } else {\n      s_rxdesc[i][3] = (uint32_t) &s_rxdesc[i + 1][0];\n    }\n  }\n  ETH0->RECEIVE_DESCRIPTOR_LIST_ADDRESS = (uint32_t) &s_rxdesc[0][0];\n\n  // init TX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_txdesc[i][0] = MG_BIT(30) | MG_BIT(20);\n    s_txdesc[i][2] = (uint32_t) s_txbuf[i];\n    if (i == ETH_DESC_CNT - 1) {\n      s_txdesc[i][3] = (uint32_t) &s_txdesc[0][0];\n    } else {\n      s_txdesc[i][3] = (uint32_t) &s_txdesc[i + 1][0];\n    }\n  }\n  ETH0->TRANSMIT_DESCRIPTOR_LIST_ADDRESS = (uint32_t) &s_txdesc[0][0];\n\n  // Clear interrupts\n  ETH0->STATUS = 0xFFFFFFFF;\n\n  // Disable MAC interrupts\n  ETH0->MMC_TRANSMIT_INTERRUPT_MASK = 0xFFFFFFFF;\n  ETH0->MMC_RECEIVE_INTERRUPT_MASK = 0xFFFFFFFF;\n  ETH0->MMC_IPC_RECEIVE_INTERRUPT_MASK = 0xFFFFFFFF;\n  ETH0->INTERRUPT_MASK = MG_BIT(9) | MG_BIT(3);  // TSIM, PMTIM\n\n  // Enable interrupts (NIE, RIE, TIE)\n  ETH0->INTERRUPT_ENABLE = MG_BIT(16) | MG_BIT(6) | MG_BIT(0);\n\n  // Enable MAC transmission and reception (TE, RE)\n  ETH0->MAC_CONFIGURATION |= MG_BIT(3) | MG_BIT(2);\n  // Enable DMA transmission and reception (ST, SR)\n  ETH0->OPERATION_MODE |= MG_BIT(13) | MG_BIT(1);\n  return true;\n}\n\nstatic size_t mg_tcpip_driver_xmc_tx(const void *buf, size_t len,\n                                     struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // Frame is too big\n  } else if ((s_txdesc[s_txno][0] & MG_BIT(31))) {\n    ifp->nerr++;\n    MG_ERROR((\"No free descriptors\"));\n    len = 0;  // All descriptors are busy, fail\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);\n    s_txdesc[s_txno][1] = len;\n    // Table 13-19 Transmit Descriptor Word 0 (IC, LS, FS, TCH)\n    s_txdesc[s_txno][0] = MG_BIT(30) | MG_BIT(29) | MG_BIT(28) | MG_BIT(20);\n    s_txdesc[s_txno][0] |= MG_BIT(31);  // OWN bit: handle control to DMA\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n\n  // Resume processing\n  ETH0->STATUS = MG_BIT(2);  // clear Transmit unavailable\n  ETH0->TRANSMIT_POLL_DEMAND = 0;\n  return len;\n}\n\nstatic void mg_tcpip_driver_xmc_update_hash_table(struct mg_tcpip_if *ifp) {\n  // TODO(): read database, rebuild hash table\n  // set the multicast address filter\n  ETH0->MAC_ADDRESS1_HIGH =\n      MG_U32(0, 0, mcast_addr[5], mcast_addr[4]) | MG_BIT(31);\n  ETH0->MAC_ADDRESS1_LOW =\n      MG_U32(mcast_addr[3], mcast_addr[2], mcast_addr[1], mcast_addr[0]);\n  (void) ifp;\n}\n\nstatic bool mg_tcpip_driver_xmc_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    mg_tcpip_driver_xmc_update_hash_table(ifp);\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  struct mg_tcpip_driver_xmc_data *d =\n      (struct mg_tcpip_driver_xmc_data *) ifp->driver_data;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  up = mg_phy_up(&phy, d->phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    MG_DEBUG((\"Link is %uM %s-duplex\", speed == MG_PHY_SPEED_10M ? 10 : 100,\n              full_duplex ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\nvoid ETH0_0_IRQHandler(void);\nvoid ETH0_0_IRQHandler(void) {\n  uint32_t irq_status = ETH0->STATUS;\n\n  // check if a frame was received\n  if (irq_status & MG_BIT(6)) {\n    for (uint8_t i = 0; i < 10; i++) {  // read as they arrive, but not forever\n      if (s_rxdesc[s_rxno][0] & MG_BIT(31)) break;\n      size_t len = (s_rxdesc[s_rxno][0] & 0x3fff0000) >> 16;\n      mg_tcpip_qwrite(s_rxbuf[s_rxno], len, s_ifp);\n      s_rxdesc[s_rxno][0] = MG_BIT(31);  // OWN bit: handle control to DMA\n      // Resume processing\n      ETH0->STATUS = MG_BIT(7) | MG_BIT(6);  // clear RU and RI\n      ETH0->RECEIVE_POLL_DEMAND = 0;\n      if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n    }\n    ETH0->STATUS = MG_BIT(6);\n  }\n\n  // clear Successful transmission interrupt\n  if (irq_status & 1) {\n    ETH0->STATUS = 1;\n  }\n\n  // clear normal interrupt\n  if (irq_status & MG_BIT(16)) {\n    ETH0->STATUS = MG_BIT(16);\n  }\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_xmc = {mg_tcpip_driver_xmc_init,\n                                              mg_tcpip_driver_xmc_tx, NULL,\n                                              mg_tcpip_driver_xmc_poll};\n#endif\n"
  },
  {
    "path": "src/drivers/xmc.h",
    "content": "#pragma once\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_XMC) && MG_ENABLE_DRIVER_XMC\n\nstruct mg_tcpip_driver_xmc_data {\n  // 13.2.8.1 Station Management Functions\n  // MDC clock divider (). MDC clock is derived from ETH MAC clock\n  // It must not exceed 2.5MHz\n  // ETH Clock range  DIVIDER       mdc_cr VALUE\n  // --------------------------------------------\n  //                                     -1  <-- tell driver to guess the value\n  // 60-100 MHz       ETH Clock/42        0\n  // 100-150 MHz      ETH Clock/62        1\n  // 20-35 MHz        ETH Clock/16        2\n  // 35-60 MHz        ETH Clock/26        3\n  // 150-250 MHz      ETH Clock/102       4\n  // 250-300 MHz      ETH Clock/124       5\n  // 110, 111 Reserved\n  int mdc_cr;  // Valid values: -1, 0, 1, 2, 3, 4, 5\n  uint8_t phy_addr;\n};\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 0\n#endif\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 4\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_xmc_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                       \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                    \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_xmc;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                                 \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_INFO((\"Driver: xmc, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n"
  },
  {
    "path": "src/drivers/xmc7.c",
    "content": "#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_XMC7) && MG_ENABLE_DRIVER_XMC7\n\nstruct ETH_Type {\n  volatile uint32_t CTL, STATUS, RESERVED[1022], NETWORK_CONTROL,\n      NETWORK_CONFIG, NETWORK_STATUS, USER_IO_REGISTER, DMA_CONFIG,\n      TRANSMIT_STATUS, RECEIVE_Q_PTR, TRANSMIT_Q_PTR, RECEIVE_STATUS,\n      INT_STATUS, INT_ENABLE, INT_DISABLE, INT_MASK, PHY_MANAGEMENT, PAUSE_TIME,\n      TX_PAUSE_QUANTUM, PBUF_TXCUTTHRU, PBUF_RXCUTTHRU, JUMBO_MAX_LENGTH,\n      EXTERNAL_FIFO_INTERFACE, RESERVED1, AXI_MAX_PIPELINE, RSC_CONTROL,\n      INT_MODERATION, SYS_WAKE_TIME, RESERVED2[7], HASH_BOTTOM, HASH_TOP,\n      SPEC_ADD1_BOTTOM, SPEC_ADD1_TOP, SPEC_ADD2_BOTTOM, SPEC_ADD2_TOP,\n      SPEC_ADD3_BOTTOM, SPEC_ADD3_TOP, SPEC_ADD4_BOTTOM, SPEC_ADD4_TOP,\n      SPEC_TYPE1, SPEC_TYPE2, SPEC_TYPE3, SPEC_TYPE4, WOL_REGISTER,\n      STRETCH_RATIO, STACKED_VLAN, TX_PFC_PAUSE, MASK_ADD1_BOTTOM,\n      MASK_ADD1_TOP, DMA_ADDR_OR_MASK, RX_PTP_UNICAST, TX_PTP_UNICAST,\n      TSU_NSEC_CMP, TSU_SEC_CMP, TSU_MSB_SEC_CMP, TSU_PTP_TX_MSB_SEC,\n      TSU_PTP_RX_MSB_SEC, TSU_PEER_TX_MSB_SEC, TSU_PEER_RX_MSB_SEC,\n      DPRAM_FILL_DBG, REVISION_REG, OCTETS_TXED_BOTTOM, OCTETS_TXED_TOP,\n      FRAMES_TXED_OK, BROADCAST_TXED, MULTICAST_TXED, PAUSE_FRAMES_TXED,\n      FRAMES_TXED_64, FRAMES_TXED_65, FRAMES_TXED_128, FRAMES_TXED_256,\n      FRAMES_TXED_512, FRAMES_TXED_1024, FRAMES_TXED_1519, TX_UNDERRUNS,\n      SINGLE_COLLISIONS, MULTIPLE_COLLISIONS, EXCESSIVE_COLLISIONS,\n      LATE_COLLISIONS, DEFERRED_FRAMES, CRS_ERRORS, OCTETS_RXED_BOTTOM,\n      OCTETS_RXED_TOP, FRAMES_RXED_OK, BROADCAST_RXED, MULTICAST_RXED,\n      PAUSE_FRAMES_RXED, FRAMES_RXED_64, FRAMES_RXED_65, FRAMES_RXED_128,\n      FRAMES_RXED_256, FRAMES_RXED_512, FRAMES_RXED_1024, FRAMES_RXED_1519,\n      UNDERSIZE_FRAMES, EXCESSIVE_RX_LENGTH, RX_JABBERS, FCS_ERRORS,\n      RX_LENGTH_ERRORS, RX_SYMBOL_ERRORS, ALIGNMENT_ERRORS, RX_RESOURCE_ERRORS,\n      RX_OVERRUNS, RX_IP_CK_ERRORS, RX_TCP_CK_ERRORS, RX_UDP_CK_ERRORS,\n      AUTO_FLUSHED_PKTS, RESERVED3, TSU_TIMER_INCR_SUB_NSEC, TSU_TIMER_MSB_SEC,\n      TSU_STROBE_MSB_SEC, TSU_STROBE_SEC, TSU_STROBE_NSEC, TSU_TIMER_SEC,\n      TSU_TIMER_NSEC, TSU_TIMER_ADJUST, TSU_TIMER_INCR, TSU_PTP_TX_SEC,\n      TSU_PTP_TX_NSEC, TSU_PTP_RX_SEC, TSU_PTP_RX_NSEC, TSU_PEER_TX_SEC,\n      TSU_PEER_TX_NSEC, TSU_PEER_RX_SEC, TSU_PEER_RX_NSEC, PCS_CONTROL,\n      PCS_STATUS, RESERVED4[2], PCS_AN_ADV, PCS_AN_LP_BASE, PCS_AN_EXP,\n      PCS_AN_NP_TX, PCS_AN_LP_NP, RESERVED5[6], PCS_AN_EXT_STATUS, RESERVED6[8],\n      TX_PAUSE_QUANTUM1, TX_PAUSE_QUANTUM2, TX_PAUSE_QUANTUM3, RESERVED7,\n      RX_LPI, RX_LPI_TIME, TX_LPI, TX_LPI_TIME, DESIGNCFG_DEBUG1,\n      DESIGNCFG_DEBUG2, DESIGNCFG_DEBUG3, DESIGNCFG_DEBUG4, DESIGNCFG_DEBUG5,\n      DESIGNCFG_DEBUG6, DESIGNCFG_DEBUG7, DESIGNCFG_DEBUG8, DESIGNCFG_DEBUG9,\n      DESIGNCFG_DEBUG10, RESERVED8[22], SPEC_ADD5_BOTTOM, SPEC_ADD5_TOP,\n      RESERVED9[60], SPEC_ADD36_BOTTOM, SPEC_ADD36_TOP, INT_Q1_STATUS,\n      INT_Q2_STATUS, INT_Q3_STATUS, RESERVED10[11], INT_Q15_STATUS, RESERVED11,\n      TRANSMIT_Q1_PTR, TRANSMIT_Q2_PTR, TRANSMIT_Q3_PTR, RESERVED12[11],\n      TRANSMIT_Q15_PTR, RESERVED13, RECEIVE_Q1_PTR, RECEIVE_Q2_PTR,\n      RECEIVE_Q3_PTR, RESERVED14[3], RECEIVE_Q7_PTR, RESERVED15,\n      DMA_RXBUF_SIZE_Q1, DMA_RXBUF_SIZE_Q2, DMA_RXBUF_SIZE_Q3, RESERVED16[3],\n      DMA_RXBUF_SIZE_Q7, CBS_CONTROL, CBS_IDLESLOPE_Q_A, CBS_IDLESLOPE_Q_B,\n      UPPER_TX_Q_BASE_ADDR, TX_BD_CONTROL, RX_BD_CONTROL, UPPER_RX_Q_BASE_ADDR,\n      RESERVED17[2], HIDDEN_REG0, HIDDEN_REG1, HIDDEN_REG2, HIDDEN_REG3,\n      RESERVED18[2], HIDDEN_REG4, HIDDEN_REG5;\n};\n\n#define ETH0 ((struct ETH_Type *) 0x40490000)\n\n#define ETH_PKT_SIZE 1536  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 2           // Descriptor size (words)\n\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM;\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_ETH_RAM;\nstatic uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS] MG_ETH_RAM MG_8BYTE_ALIGNED;\nstatic uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS] MG_ETH_RAM MG_8BYTE_ALIGNED;\nstatic uint8_t s_txno;  // Current TX descriptor\nstatic uint8_t s_rxno;  // Current RX descriptor\n\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\nenum { MG_PHY_ADDR = 0, MG_PHYREG_BCR = 0, MG_PHYREG_BSR = 1 };\n\nstatic uint16_t eth_read_phy(uint8_t addr, uint8_t reg) {\n  // WRITE1, READ OPERATION, PHY, REG, WRITE10\n  ETH0->PHY_MANAGEMENT = MG_BIT(30) | MG_BIT(29) | ((addr & 0xf) << 24) |\n                         ((reg & 0x1f) << 18) | MG_BIT(17);\n  while ((ETH0->NETWORK_STATUS & MG_BIT(2)) == 0) (void) 0;\n  return ETH0->PHY_MANAGEMENT & 0xffff;\n}\n\nstatic void eth_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  ETH0->PHY_MANAGEMENT = MG_BIT(30) | MG_BIT(28) | ((addr & 0xf) << 24) |\n                         ((reg & 0x1f) << 18) | MG_BIT(17) | val;\n  while ((ETH0->NETWORK_STATUS & MG_BIT(2)) == 0) (void) 0;\n}\n\nstatic uint32_t get_clock_rate(struct mg_tcpip_driver_xmc7_data *d) {\n  // see ETH0 -> NETWORK_CONFIG register\n  (void) d;\n  return 3;\n}\n\nstatic bool mg_tcpip_driver_xmc7_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_xmc7_data *d =\n      (struct mg_tcpip_driver_xmc7_data *) ifp->driver_data;\n  s_ifp = ifp;\n\n  // enable controller, set RGMII mode\n  ETH0->CTL = MG_BIT(31) | (4 << 8) | 2;\n\n  uint32_t cr = get_clock_rate(d);\n  // set NSP change, ignore RX FCS, data bus width, clock rate\n  // frame length 1536, full duplex, speed\n  ETH0->NETWORK_CONFIG = MG_BIT(29) | MG_BIT(26) | MG_BIT(21) |\n                         ((cr & 7) << 18) | MG_BIT(8) | MG_BIT(1) | MG_BIT(0);\n\n  // config DMA settings: Force TX burst, Discard on Error, set RX buffer size\n  // to 1536, TX_PBUF_SIZE, RX_PBUF_SIZE, AMBA_BURST_LENGTH\n  ETH0->DMA_CONFIG =\n      MG_BIT(26) | MG_BIT(24) | (0x18 << 16) | MG_BIT(10) | (3 << 8) | 4;\n\n  // initialize descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i][0] = (uint32_t) s_rxbuf[i];\n    if (i == ETH_DESC_CNT - 1) {\n      s_rxdesc[i][0] |= MG_BIT(1);  // mark last descriptor\n    }\n\n    s_txdesc[i][0] = (uint32_t) s_txbuf[i];\n    s_txdesc[i][1] = MG_BIT(31);  // OWN descriptor\n    if (i == ETH_DESC_CNT - 1) {\n      s_txdesc[i][1] |= MG_BIT(30);  // mark last descriptor\n    }\n  }\n  ETH0->RECEIVE_Q_PTR = (uint32_t) s_rxdesc;\n  ETH0->TRANSMIT_Q_PTR = (uint32_t) s_txdesc;\n\n  // disable other queues\n  ETH0->TRANSMIT_Q2_PTR = 1;\n  ETH0->TRANSMIT_Q1_PTR = 1;\n  ETH0->RECEIVE_Q2_PTR = 1;\n  ETH0->RECEIVE_Q1_PTR = 1;\n\n  // enable interrupts (RX complete)\n  ETH0->INT_ENABLE = MG_BIT(1);\n\n  // set MAC address\n  ETH0->SPEC_ADD1_BOTTOM =\n      ifp->mac[3] << 24 | ifp->mac[2] << 16 | ifp->mac[1] << 8 | ifp->mac[0];\n  ETH0->SPEC_ADD1_TOP = ifp->mac[5] << 8 | ifp->mac[4];\n\n  // enable MDIO, TX, RX\n  ETH0->NETWORK_CONTROL = MG_BIT(4) | MG_BIT(3) | MG_BIT(2);\n\n  // start transmission\n  ETH0->NETWORK_CONTROL |= MG_BIT(9);\n\n  // init phy\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  mg_phy_init(&phy, d->phy_addr, MG_PHY_CLOCKS_MAC);\n\n  (void) d;\n  return true;\n}\n\nstatic size_t mg_tcpip_driver_xmc7_tx(const void *buf, size_t len,\n                                      struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // Frame is too big\n  } else if (((s_txdesc[s_txno][1] & MG_BIT(31)) == 0)) {\n    ifp->nerr++;\n    MG_ERROR((\"No free descriptors\"));\n    len = 0;  // All descriptors are busy, fail\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);\n    s_txdesc[s_txno][1] = (s_txno == ETH_DESC_CNT - 1 ? MG_BIT(30) : 0) |\n                          MG_BIT(15) | len;  // Last buffer and length\n\n    ETH0->NETWORK_CONTROL |= MG_BIT(9);  // enable transmission\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n\n  MG_DSB();\n  ETH0->TRANSMIT_STATUS = ETH0->TRANSMIT_STATUS;\n  ETH0->NETWORK_CONTROL |= MG_BIT(9);  // enable transmission\n\n  return len;\n}\n\nstatic void mg_tcpip_driver_xmc7_update_hash_table(struct mg_tcpip_if *ifp) {\n  // TODO(): read database, rebuild hash table\n  // set multicast MAC address\n  ETH0->SPEC_ADD2_BOTTOM = mcast_addr[3] << 24 | mcast_addr[2] << 16 |\n                           mcast_addr[1] << 8 | mcast_addr[0];\n  ETH0->SPEC_ADD2_TOP = mcast_addr[5] << 8 | mcast_addr[4];\n  (void) ifp;\n}\n\nstatic bool mg_tcpip_driver_xmc7_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->update_mac_hash_table) {\n    mg_tcpip_driver_xmc7_update_hash_table(ifp);\n    ifp->update_mac_hash_table = false;\n  }\n  if (!s1) return false;\n  struct mg_tcpip_driver_xmc7_data *d =\n      (struct mg_tcpip_driver_xmc7_data *) ifp->driver_data;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  up = mg_phy_up(&phy, d->phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    // tmp = reg with flags set to the most likely situation: 100M full-duplex\n    // if(link is slow or half) set flags otherwise\n    // reg = tmp\n    uint32_t netconf = ETH0->NETWORK_CONFIG;\n    MG_SET_BITS(netconf, MG_BIT(10),\n                MG_BIT(1) | MG_BIT(0));  // 100M, Full-duplex\n    uint32_t ctl = ETH0->CTL;\n    MG_SET_BITS(ctl, 0xFF00, 4 << 8);  // /5 for 25M clock\n    if (speed == MG_PHY_SPEED_1000M) {\n      netconf |= MG_BIT(10);        // 1000M\n      MG_SET_BITS(ctl, 0xFF00, 0);  // /1 for 125M clock TODO() IS THIS NEEDED ?\n    } else if (speed == MG_PHY_SPEED_10M) {\n      netconf &= ~MG_BIT(0);         // 10M\n      MG_SET_BITS(ctl, 0xFF00, 49);  // /50 for 2.5M clock\n    }\n    if (full_duplex == false) netconf &= ~MG_BIT(1);  // Half-duplex\n    ETH0->NETWORK_CONFIG = netconf;  // IRQ handler does not fiddle with these\n    ETH0->CTL = ctl;\n    MG_DEBUG((\"Link is %uM %s-duplex\",\n              speed == MG_PHY_SPEED_10M\n                  ? 10\n                  : (speed == MG_PHY_SPEED_100M ? 100 : 1000),\n              full_duplex ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\nvoid ETH_IRQHandler(void) {\n  uint32_t irq_status = ETH0->INT_STATUS;\n  if (irq_status & MG_BIT(1)) {\n    for (uint8_t i = 0; i < 10; i++) {  // read as they arrive, but not forever\n      if ((s_rxdesc[s_rxno][0] & MG_BIT(0)) == 0) break;\n      size_t len = s_rxdesc[s_rxno][1] & (MG_BIT(13) - 1);\n      mg_tcpip_qwrite(s_rxbuf[s_rxno], len, s_ifp);\n      s_rxdesc[s_rxno][0] &= ~MG_BIT(0);  // OWN bit: handle control to DMA\n      if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n    }\n  }\n\n  ETH0->INT_STATUS = irq_status;\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_xmc7 = {mg_tcpip_driver_xmc7_init,\n                                               mg_tcpip_driver_xmc7_tx, NULL,\n                                               mg_tcpip_driver_xmc7_poll};\n#endif\n"
  },
  {
    "path": "src/drivers/xmc7.h",
    "content": "#pragma once\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_XMC7) && MG_ENABLE_DRIVER_XMC7\n\nstruct mg_tcpip_driver_xmc7_data {\n  int mdc_cr;  // Valid values: -1, 0, 1, 2, 3, 4, 5\n  uint8_t phy_addr;\n};\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 0\n#endif\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 3\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_xmc7_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                       \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                    \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_xmc7;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                                 \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_INFO((\"Driver: xmc7, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n\n"
  },
  {
    "path": "src/event.c",
    "content": "#include \"event.h\"\n#include \"log.h\"\n#include \"net.h\"\n#include \"printf.h\"\n#include \"profile.h\"\n\nvoid mg_call(struct mg_connection *c, int ev, void *ev_data) {\n#if MG_ENABLE_PROFILE\n  const char *names[] = {\n      \"EV_ERROR\",    \"EV_OPEN\",      \"EV_POLL\",      \"EV_RESOLVE\",\n      \"EV_CONNECT\",  \"EV_ACCEPT\",    \"EV_TLS_HS\",    \"EV_READ\",\n      \"EV_WRITE\",    \"EV_CLOSE\",     \"EV_HTTP_MSG\",  \"EV_HTTP_CHUNK\",\n      \"EV_WS_OPEN\",  \"EV_WS_MSG\",    \"EV_WS_CTL\",    \"EV_MQTT_CMD\",\n      \"EV_MQTT_MSG\", \"EV_MQTT_OPEN\", \"EV_SNTP_TIME\", \"EV_USER\"};\n  if (ev != MG_EV_POLL && ev < (int) (sizeof(names) / sizeof(names[0]))) {\n    MG_PROF_ADD(c, names[ev]);\n  }\n#endif\n  // Fire protocol handler first, user handler second. See #2559\n  if (c->pfn != NULL) c->pfn(c, ev, ev_data);\n  if (c->fn != NULL) c->fn(c, ev, ev_data);\n}\n\nvoid mg_error(struct mg_connection *c, const char *fmt, ...) {\n  char buf[64];\n  va_list ap;\n  va_start(ap, fmt);\n  mg_vsnprintf(buf, sizeof(buf), fmt, &ap);\n  va_end(ap);\n  MG_ERROR((\"%lu %ld %s\", c->id, c->fd, buf));\n  c->is_closing = 1;             // Set is_closing before sending MG_EV_CALL\n  mg_call(c, MG_EV_ERROR, buf);  // Let user handler override it\n}\n"
  },
  {
    "path": "src/event.h",
    "content": "#pragma once\n\nstruct mg_connection;\ntypedef void (*mg_event_handler_t)(struct mg_connection *, int ev,\n                                   void *ev_data);\nvoid mg_call(struct mg_connection *c, int ev, void *ev_data);\nvoid mg_error(struct mg_connection *c, const char *fmt, ...);\n\nenum {\n  MG_EV_ERROR,      // Error                        char *error_message\n  MG_EV_OPEN,       // Connection created           NULL\n  MG_EV_POLL,       // mg_mgr_poll iteration        uint64_t *uptime_millis\n  MG_EV_RESOLVE,    // Host name is resolved        NULL\n  MG_EV_CONNECT,    // Connection established       NULL\n  MG_EV_ACCEPT,     // Connection accepted          NULL\n  MG_EV_TLS_HS,     // TLS handshake succeeded      NULL\n  MG_EV_READ,       // Data received from socket    long *bytes_read\n  MG_EV_WRITE,      // Data written to socket       long *bytes_written\n  MG_EV_CLOSE,      // Connection closed            NULL\n  MG_EV_HTTP_HDRS,  // HTTP headers                 struct mg_http_message *\n  MG_EV_HTTP_MSG,   // Full HTTP request/response   struct mg_http_message *\n  MG_EV_WS_OPEN,    // Websocket handshake done     struct mg_http_message *\n  MG_EV_WS_MSG,     // Websocket msg, text or bin   struct mg_ws_message *\n  MG_EV_WS_CTL,     // Websocket control msg        struct mg_ws_message *\n  MG_EV_MQTT_CMD,   // MQTT low-level command       struct mg_mqtt_message *\n  MG_EV_MQTT_MSG,   // MQTT PUBLISH received        struct mg_mqtt_message *\n  MG_EV_MQTT_OPEN,  // MQTT CONNACK received        int *connack_status_code\n  MG_EV_SNTP_TIME,  // SNTP time received           uint64_t *epoch_millis\n  MG_EV_WAKEUP,     // mg_wakeup() data received    struct mg_str *data\n  MG_EV_MDNS_REQ,   // mDNS request                 struct mg_mdns_req *\n  MG_EV_MDNS_RESP,  // mDNS response                struct mg_mdns_resp *\n  MG_EV_USER        // Starting ID for user events\n};\n"
  },
  {
    "path": "src/flash.c",
    "content": "#include \"arch.h\"\n#include \"flash.h\"\n#include \"log.h\"\n#include \"ota.h\"\n\n#if MG_OTA != MG_OTA_NONE && MG_OTA != MG_OTA_CUSTOM\n\nstatic char *s_addr;      // Current address to write to\nstatic size_t s_size;     // Firmware size to flash. In-progress indicator\nstatic uint32_t s_crc32;  // Firmware checksum\n\nbool mg_ota_flash_begin(size_t new_firmware_size, struct mg_flash *flash) {\n  bool ok = false;\n  if (s_size) {\n    MG_ERROR((\"OTA already in progress. Call mg_ota_end()\"));\n  } else {\n    size_t half = flash->size / 2;\n    s_crc32 = 0;\n    s_addr = (char *) flash->start + half;\n    MG_DEBUG((\"FW %lu bytes, max %lu\", new_firmware_size, half));\n    if (new_firmware_size < half) {\n      ok = true;\n      s_size = new_firmware_size;\n      MG_INFO((\"Starting OTA, firmware size %lu\", s_size));\n    } else {\n      MG_ERROR((\"Firmware %lu is too big to fit %lu\", new_firmware_size, half));\n    }\n  }\n  return ok;\n}\n\nbool mg_ota_flash_write(const void *buf, size_t len, struct mg_flash *flash) {\n  bool ok = false;\n  if (s_size == 0) {\n    MG_ERROR((\"OTA is not started, call mg_ota_begin()\"));\n  } else {\n    size_t len_aligned_down = MG_ROUND_DOWN(len, flash->align);\n    if (len_aligned_down) ok = flash->write_fn(s_addr, buf, len_aligned_down);\n    if (len_aligned_down < len) {\n      size_t left = len - len_aligned_down;\n      char tmp[flash->align];\n      memset(tmp, 0xff, sizeof(tmp));\n      memcpy(tmp, (char *) buf + len_aligned_down, left);\n      ok = flash->write_fn(s_addr + len_aligned_down, tmp, sizeof(tmp));\n    }\n    s_crc32 = mg_crc32(s_crc32, (char *) buf, len);  // Update CRC\n    MG_DEBUG((\"%#x %p %lu -> %d\", s_addr - len, buf, len, ok));\n    s_addr += len;\n  }\n  return ok;\n}\n\nbool mg_ota_flash_end(struct mg_flash *flash) {\n  char *base = (char *) flash->start + flash->size / 2;\n  bool ok = false;\n  if (s_size) {\n    size_t size = (size_t) (s_addr - base);\n    uint32_t crc32 = mg_crc32(0, base, s_size);\n    if (size == s_size && crc32 == s_crc32) ok = true;\n    MG_DEBUG((\"CRC: %x/%x, size: %lu/%lu, status: %s\", s_crc32, crc32, s_size,\n              size, ok ? \"ok\" : \"fail\"));\n    s_size = 0;\n    if (ok) ok = flash->swap_fn();\n  }\n  MG_INFO((\"Finishing OTA: %s\", ok ? \"ok\" : \"fail\"));\n  return ok;\n}\n\n#endif\n"
  },
  {
    "path": "src/flash.h",
    "content": "#include \"arch.h\"\n#include \"ota.h\"\n\n#if MG_OTA != MG_OTA_NONE && MG_OTA != MG_OTA_CUSTOM\n\nstruct mg_flash {\n  void *start;    // Address at which flash starts\n  size_t size;    // Flash size\n  size_t secsz;   // Sector size\n  size_t align;   // Write alignment\n  bool (*write_fn)(void *, const void *, size_t);  // Write function\n  bool (*swap_fn)(void);                           // Swap partitions\n};\n\nbool mg_ota_flash_begin(size_t new_firmware_size, struct mg_flash *flash);\nbool mg_ota_flash_write(const void *buf, size_t len, struct mg_flash *flash);\nbool mg_ota_flash_end(struct mg_flash *flash);\n\n#endif\n"
  },
  {
    "path": "src/fmt.c",
    "content": "#include \"fmt.h\"\n#include \"printf.h\"\n#include \"util.h\"\n\nstatic bool is_digit(int c) {\n  return c >= '0' && c <= '9';\n}\n\nstatic int addexp(char *buf, int e, int sign) {\n  int n = 0;\n  buf[n++] = 'e';\n  buf[n++] = (char) sign;\n  if (e > 400) return 0;\n  if (e < 10) buf[n++] = '0';\n  if (e >= 100) buf[n++] = (char) (e / 100 + '0'), e -= 100 * (e / 100);\n  if (e >= 10) buf[n++] = (char) (e / 10 + '0'), e -= 10 * (e / 10);\n  buf[n++] = (char) (e + '0');\n  return n;\n}\n\nstatic int xisinf(double x) {\n  union {\n    double f;\n    uint64_t u;\n  } ieee754;\n  ieee754.f = x;\n  return ((unsigned) (ieee754.u >> 32) & 0x7fffffff) == 0x7ff00000 &&\n         ((unsigned) ieee754.u == 0);\n}\n\nstatic int xisnan(double x) {\n  union {\n    double f;\n    uint64_t u;\n  } ieee754;\n  ieee754.f = x;\n  return ((unsigned) (ieee754.u >> 32) & 0x7fffffff) +\n             ((unsigned) ieee754.u != 0) >\n         0x7ff00000;\n}\n\nstatic size_t mg_dtoa(char *dst, size_t dstlen, double d, int width, bool tz) {\n  char buf[40];\n  int i, s = 0, n = 0, e = 0;\n  double t, mul, saved;\n  if (d == 0.0) return mg_snprintf(dst, dstlen, \"%s\", \"0\");\n  if (xisinf(d)) return mg_snprintf(dst, dstlen, \"%s\", d > 0 ? \"inf\" : \"-inf\");\n  if (xisnan(d)) return mg_snprintf(dst, dstlen, \"%s\", \"nan\");\n  if (d < 0.0) d = -d, buf[s++] = '-';\n\n  // Round\n  saved = d;\n  if (tz) {\n    mul = 1.0;\n    while (d >= 10.0 && d / mul >= 10.0) mul *= 10.0;\n  } else {\n    mul = 0.1;\n  }\n\n  while (d <= 1.0 && d / mul <= 1.0) mul /= 10.0;\n  for (i = 0, t = mul * 5; i < width; i++) t /= 10.0;\n\n  d += t;\n\n  // Calculate exponent, and 'mul' for scientific representation\n  mul = 1.0;\n  while (d >= 10.0 && d / mul >= 10.0) mul *= 10.0, e++;\n  while (d < 1.0 && d / mul < 1.0) mul /= 10.0, e--;\n  // printf(\" --> %g %d %g %g\\n\", saved, e, t, mul);\n\n  if (tz && e >= width && width > 1) {\n    n = (int) mg_dtoa(buf, sizeof(buf), saved / mul, width, tz);\n    // printf(\" --> %.*g %d [%.*s]\\n\", 10, d / t, e, n, buf);\n    n += addexp(buf + s + n, e, '+');\n    return mg_snprintf(dst, dstlen, \"%.*s\", n, buf);\n  } else if (tz && e <= -width && width > 1) {\n    n = (int) mg_dtoa(buf, sizeof(buf), saved / mul, width, tz);\n    // printf(\" --> %.*g %d [%.*s]\\n\", 10, d / mul, e, n, buf);\n    n += addexp(buf + s + n, -e, '-');\n    return mg_snprintf(dst, dstlen, \"%.*s\", n, buf);\n  } else {\n    int targ_width = width;\n    for (i = 0, t = mul; t >= 1.0 && s + n < (int) sizeof(buf); i++) {\n      int ch = (int) (d / t);\n      if (n > 0 || ch > 0) buf[s + n++] = (char) (ch + '0');\n      d -= ch * t;\n      t /= 10.0;\n    }\n    // printf(\" --> [%g] -> %g %g (%d) [%.*s]\\n\", saved, d, t, n, s + n, buf);\n    if (n == 0) buf[s++] = '0';\n    while (t >= 1.0 && n + s < (int) sizeof(buf)) buf[n++] = '0', t /= 10.0;\n    if (s + n < (int) sizeof(buf)) buf[n + s++] = '.';\n    // printf(\" 1--> [%g] -> [%.*s]\\n\", saved, s + n, buf);\n    if (!tz && n > 0) targ_width = width + n;\n    for (i = 0, t = 0.1; s + n < (int) sizeof(buf) && n < targ_width; i++) {\n      int ch = (int) (d / t);\n      buf[s + n++] = (char) (ch + '0');\n      d -= ch * t;\n      t /= 10.0;\n    }\n  }\n\n  while (tz && n > 0 && buf[s + n - 1] == '0') n--;  // Trim trailing zeroes\n  if (tz && n > 0 && buf[s + n - 1] == '.') n--;     // Trim trailing dot\n  n += s;\n  if (n >= (int) sizeof(buf)) n = (int) sizeof(buf) - 1;\n  buf[n] = '\\0';\n  return mg_snprintf(dst, dstlen, \"%s\", buf);\n}\n\nstatic size_t mg_lld(char *buf, int64_t val, bool is_signed, bool is_hex) {\n  const char *letters = \"0123456789abcdef\";\n  uint64_t v = (uint64_t) val;\n  size_t s = 0, n, i;\n  if (is_signed && val < 0) buf[s++] = '-', v = (uint64_t) (-val);\n  // This loop prints a number in reverse order. I guess this is because we\n  // write numbers from right to left: least significant digit comes last.\n  // Maybe because we use Arabic numbers, and Arabs write RTL?\n  if (is_hex) {\n    for (n = 0; v; v >>= 4) buf[s + n++] = letters[v & 15];\n  } else {\n    for (n = 0; v; v /= 10) buf[s + n++] = letters[v % 10];\n  }\n  // Reverse a string\n  for (i = 0; i < n / 2; i++) {\n    char t = buf[s + i];\n    buf[s + i] = buf[s + n - i - 1], buf[s + n - i - 1] = t;\n  }\n  if (val == 0) buf[n++] = '0';  // Handle special case\n  return n + s;\n}\n\nstatic size_t scpy(void (*out)(char, void *), void *ptr, char *buf,\n                   size_t len) {\n  size_t i = 0;\n  while (i < len && buf[i] != '\\0') out(buf[i++], ptr);\n  return i;\n}\n\nsize_t mg_xprintf(void (*out)(char, void *), void *ptr, const char *fmt, ...) {\n  size_t len = 0;\n  va_list ap;\n  va_start(ap, fmt);\n  len = mg_vxprintf(out, ptr, fmt, &ap);\n  va_end(ap);\n  return len;\n}\n\nsize_t mg_vxprintf(void (*out)(char, void *), void *param, const char *fmt,\n                   va_list *ap) {\n  size_t i = 0, n = 0;\n  while (fmt[i] != '\\0') {\n    if (fmt[i] == '%') {\n      size_t j, k, x = 0, is_long = 0, w = 0 /* width */, pr = ~0U /* prec */;\n      char pad = ' ', minus = 0, c = fmt[++i];\n      if (c == '#') x++, c = fmt[++i];\n      if (c == '-') minus++, c = fmt[++i];\n      if (c == '0') pad = '0', c = fmt[++i];\n      while (is_digit(c)) w *= 10, w += (size_t) (c - '0'), c = fmt[++i];\n      if (c == '.') {\n        c = fmt[++i];\n        if (c == '*') {\n          pr = (size_t) va_arg(*ap, int);\n          c = fmt[++i];\n        } else {\n          pr = 0;\n          while (is_digit(c)) pr *= 10, pr += (size_t) (c - '0'), c = fmt[++i];\n        }\n      }\n      while (c == 'h') c = fmt[++i];  // Treat h and hh as int\n      if (c == 'l') {\n        is_long++, c = fmt[++i];\n        if (c == 'l') is_long++, c = fmt[++i];\n      }\n      if (c == 'p') x = 1, is_long = 1;\n      if (c == 'd' || c == 'u' || c == 'x' || c == 'X' || c == 'p' ||\n          c == 'g' || c == 'f') {\n        bool s = (c == 'd'), h = (c == 'x' || c == 'X' || c == 'p');\n        char tmp[40];\n        size_t xl = x ? 2 : 0;\n        if (c == 'g' || c == 'f') {\n          double v = va_arg(*ap, double);\n          if (pr == ~0U) pr = 6;\n          k = mg_dtoa(tmp, sizeof(tmp), v, (int) pr, c == 'g');\n        } else if (is_long == 2) {\n          int64_t v = va_arg(*ap, int64_t);\n          k = mg_lld(tmp, v, s, h);\n        } else if (is_long == 1) {\n          long v = va_arg(*ap, long);\n          k = mg_lld(tmp, s ? (int64_t) v : (int64_t) (unsigned long) v, s, h);\n        } else {\n          int v = va_arg(*ap, int);\n          k = mg_lld(tmp, s ? (int64_t) v : (int64_t) (unsigned) v, s, h);\n        }\n        for (j = 0; j < xl && w > 0; j++) w--;\n        for (j = 0; pad == ' ' && !minus && k < w && j + k < w; j++)\n          n += scpy(out, param, &pad, 1);\n        n += scpy(out, param, (char *) \"0x\", xl);\n        for (j = 0; pad == '0' && k < w && j + k < w; j++)\n          n += scpy(out, param, &pad, 1);\n        n += scpy(out, param, tmp, k);\n        for (j = 0; pad == ' ' && minus && k < w && j + k < w; j++)\n          n += scpy(out, param, &pad, 1);\n      } else if (c == 'm' || c == 'M') {\n        mg_pm_t f = va_arg(*ap, mg_pm_t);\n        if (c == 'm') out('\"', param);\n        n += f(out, param, ap);\n        if (c == 'm') n += 2, out('\"', param);\n      } else if (c == 'c') {\n        int ch = va_arg(*ap, int);\n        out((char) ch, param);\n        n++;\n      } else if (c == 's') {\n        char *p = va_arg(*ap, char *);\n        if (pr == ~0U) pr = p == NULL ? 0 : strlen(p);\n        for (j = 0; !minus && pr < w && j + pr < w; j++)\n          n += scpy(out, param, &pad, 1);\n        n += scpy(out, param, p, pr);\n        for (j = 0; minus && pr < w && j + pr < w; j++)\n          n += scpy(out, param, &pad, 1);\n      } else if (c == '%') {\n        out('%', param);\n        n++;\n      } else {\n        out('%', param);\n        out(c, param);\n        n += 2;\n      }\n      i++;\n    } else {\n      out(fmt[i], param), n++, i++;\n    }\n  }\n  return n;\n}\n"
  },
  {
    "path": "src/fmt.h",
    "content": "#pragma once\n\n#include \"arch.h\"\n\ntypedef void (*mg_pfn_t)(char, void *);                  // Output function\ntypedef size_t (*mg_pm_t)(mg_pfn_t, void *, va_list *);  // %M printer\n\nsize_t mg_vxprintf(void (*)(char, void *), void *, const char *fmt, va_list *);\nsize_t mg_xprintf(void (*fn)(char, void *), void *, const char *fmt, ...);\n"
  },
  {
    "path": "src/fs.c",
    "content": "#include \"fs.h\"\n#include \"printf.h\"\n#include \"str.h\"\n#include \"util.h\"\n\nstruct mg_fd *mg_fs_open(struct mg_fs *fs, const char *path, int flags) {\n  struct mg_fd *fd = (struct mg_fd *) mg_calloc(1, sizeof(*fd));\n  if (fd != NULL) {\n    fd->fd = fs->op(path, flags);\n    fd->fs = fs;\n    if (fd->fd == NULL) {\n      mg_free(fd);\n      fd = NULL;\n    }\n  }\n  return fd;\n}\n\nvoid mg_fs_close(struct mg_fd *fd) {\n  if (fd != NULL) {\n    fd->fs->cl(fd->fd);\n    mg_free(fd);\n  }\n}\n\nstruct mg_str mg_file_read(struct mg_fs *fs, const char *path) {\n  struct mg_str result = {NULL, 0};\n  void *fp;\n  fs->st(path, &result.len, NULL);\n  if ((fp = fs->op(path, MG_FS_READ)) != NULL) {\n    result.buf = (char *) mg_calloc(1, result.len + 1);\n    if (result.buf != NULL &&\n        fs->rd(fp, (void *) result.buf, result.len) != result.len) {\n      mg_free((void *) result.buf);\n      result.buf = NULL;\n    }\n    fs->cl(fp);\n  }\n  if (result.buf == NULL) result.len = 0;\n  return result;\n}\n\nbool mg_file_write(struct mg_fs *fs, const char *path, const void *buf,\n                   size_t len) {\n  bool result = false;\n  struct mg_fd *fd;\n  char tmp[MG_PATH_MAX];\n  mg_snprintf(tmp, sizeof(tmp), \"%s..%d\", path, rand());\n  if ((fd = mg_fs_open(fs, tmp, MG_FS_WRITE)) != NULL) {\n    result = fs->wr(fd->fd, buf, len) == len;\n    mg_fs_close(fd);\n    if (result) {\n      fs->rm(path);\n      fs->mv(tmp, path);\n    } else {\n      fs->rm(tmp);\n    }\n  }\n  return result;\n}\n\nbool mg_file_printf(struct mg_fs *fs, const char *path, const char *fmt, ...) {\n  va_list ap;\n  char *data;\n  bool result = false;\n  va_start(ap, fmt);\n  data = mg_vmprintf(fmt, &ap);\n  va_end(ap);\n  result = mg_file_write(fs, path, data, strlen(data));\n  mg_free(data);\n  return result;\n}\n\n// This helper function allows to scan a filesystem in a sequential way,\n// without using callback function:\n//      char buf[100] = \"\";\n//      while (mg_fs_ls(&mg_fs_posix, \"./\", buf, sizeof(buf))) {\n//        ...\nstatic void mg_fs_ls_fn(const char *filename, void *param) {\n  struct mg_str *s = (struct mg_str *) param;\n  if (s->buf[0] == '\\0') {\n    mg_snprintf((char *) s->buf, s->len, \"%s\", filename);\n  } else if (strcmp(s->buf, filename) == 0) {\n    ((char *) s->buf)[0] = '\\0';  // Fetch next file\n  }\n}\n\nbool mg_fs_ls(struct mg_fs *fs, const char *path, char *buf, size_t len) {\n  struct mg_str s;\n  s.buf = buf, s.len = len;\n  fs->ls(path, mg_fs_ls_fn, &s);\n  return buf[0] != '\\0';\n}\n"
  },
  {
    "path": "src/fs.h",
    "content": "#pragma once\n\n#include \"arch.h\"\n#include \"config.h\"\n\nenum { MG_FS_READ = 1, MG_FS_WRITE = 2, MG_FS_DIR = 4 };\n\n// Filesystem API functions\n// st() returns MG_FS_* flags and populates file size and modification time\n// ls() calls fn() for every directory entry, allowing to list a directory\n//\n// NOTE: UNIX-style shorthand names for the API functions are deliberately\n// chosen to avoid conflicts with some libraries that make macros for e.g.\n// stat(), write(), read() calls.\nstruct mg_fs {\n  int (*st)(const char *path, size_t *size, time_t *mtime);  // stat file\n  void (*ls)(const char *path, void (*fn)(const char *, void *),\n             void *);  // List directory entries: call fn(file_name, fn_data)\n                       // for each directory entry\n  void *(*op)(const char *path, int flags);             // Open file\n  void (*cl)(void *fd);                                 // Close file\n  size_t (*rd)(void *fd, void *buf, size_t len);        // Read file\n  size_t (*wr)(void *fd, const void *buf, size_t len);  // Write file\n  size_t (*sk)(void *fd, size_t offset);                // Set file position\n  bool (*mv)(const char *from, const char *to);         // Rename file\n  bool (*rm)(const char *path);                         // Delete file\n  bool (*mkd)(const char *path);                        // Create directory\n};\n\nextern struct mg_fs mg_fs_posix;   // POSIX open/close/read/write/seek\nextern struct mg_fs mg_fs_packed;  // see tutorials/core/embedded-filesystem\nextern struct mg_fs mg_fs_fat;     // FAT FS\n\n// File descriptor\nstruct mg_fd {\n  void *fd;\n  struct mg_fs *fs;\n};\n\nstruct mg_fd *mg_fs_open(struct mg_fs *fs, const char *path, int flags);\nvoid mg_fs_close(struct mg_fd *fd);\nbool mg_fs_ls(struct mg_fs *fs, const char *path, char *buf, size_t len);\nstruct mg_str mg_file_read(struct mg_fs *fs, const char *path);\nbool mg_file_write(struct mg_fs *fs, const char *path, const void *, size_t);\nbool mg_file_printf(struct mg_fs *fs, const char *path, const char *fmt, ...);\n\n// Packed API\nconst char *mg_unpack(const char *path, size_t *size, time_t *mtime);\nconst char *mg_unlist(size_t no);             // Get no'th packed filename\nstruct mg_str mg_unpacked(const char *path);  // Packed file as mg_str\n"
  },
  {
    "path": "src/fs_fat.c",
    "content": "#include \"arch.h\"\n#include \"fs.h\"\n\n#if MG_ENABLE_FATFS\n#include <ff.h>\n\nstatic int mg_days_from_epoch(int y, int m, int d) {\n  y -= m <= 2;\n  int era = y / 400;\n  int yoe = y - era * 400;\n  int doy = (153 * (m + (m > 2 ? -3 : 9)) + 2) / 5 + d - 1;\n  int doe = yoe * 365 + yoe / 4 - yoe / 100 + doy;\n  return era * 146097 + doe - 719468;\n}\n\nstatic time_t mg_timegm(const struct tm *t) {\n  int year = t->tm_year + 1900;\n  int month = t->tm_mon;  // 0-11\n  if (month > 11) {\n    year += month / 12;\n    month %= 12;\n  } else if (month < 0) {\n    int years_diff = (11 - month) / 12;\n    year -= years_diff;\n    month += 12 * years_diff;\n  }\n  int x = mg_days_from_epoch(year, month + 1, t->tm_mday);\n  return 60 * (60 * (24L * x + t->tm_hour) + t->tm_min) + t->tm_sec;\n}\n\nstatic time_t ff_time_to_epoch(uint16_t fdate, uint16_t ftime) {\n  struct tm tm;\n  memset(&tm, 0, sizeof(struct tm));\n  tm.tm_sec = (ftime << 1) & 0x3e;\n  tm.tm_min = ((ftime >> 5) & 0x3f);\n  tm.tm_hour = ((ftime >> 11) & 0x1f);\n  tm.tm_mday = (fdate & 0x1f);\n  tm.tm_mon = ((fdate >> 5) & 0x0f) - 1;\n  tm.tm_year = ((fdate >> 9) & 0x7f) + 80;\n  return mg_timegm(&tm);\n}\n\nstatic int ff_stat(const char *path, size_t *size, time_t *mtime) {\n  FILINFO fi;\n  if (path[0] == '\\0') {\n    if (size) *size = 0;\n    if (mtime) *mtime = 0;\n    return MG_FS_DIR;\n  } else if (f_stat(path, &fi) == 0) {\n    if (size) *size = (size_t) fi.fsize;\n    if (mtime) *mtime = ff_time_to_epoch(fi.fdate, fi.ftime);\n    return MG_FS_READ | MG_FS_WRITE | ((fi.fattrib & AM_DIR) ? MG_FS_DIR : 0);\n  } else {\n    return 0;\n  }\n}\n\nstatic void ff_list(const char *dir, void (*fn)(const char *, void *),\n                    void *userdata) {\n  DIR d;\n  FILINFO fi;\n  if (f_opendir(&d, dir) == FR_OK) {\n    while (f_readdir(&d, &fi) == FR_OK && fi.fname[0] != '\\0') {\n      if (!strcmp(fi.fname, \".\") || !strcmp(fi.fname, \"..\")) continue;\n      fn(fi.fname, userdata);\n    }\n    f_closedir(&d);\n  }\n}\n\nstatic void *ff_open(const char *path, int flags) {\n  FIL f;\n  unsigned char mode = FA_READ;\n  if (flags & MG_FS_WRITE) mode |= FA_WRITE | FA_OPEN_ALWAYS | FA_OPEN_APPEND;\n  if (f_open(&f, path, mode) == 0) {\n    FIL *fp;\n    if ((fp = mg_calloc(1, sizeof(*fp))) != NULL) {\n      memcpy(fp, &f, sizeof(*fp));\n      return fp;\n    }\n  }\n  return NULL;\n}\n\nstatic void ff_close(void *fp) {\n  if (fp != NULL) {\n    f_close((FIL *) fp);\n    mg_free(fp);\n  }\n}\n\nstatic size_t ff_read(void *fp, void *buf, size_t len) {\n  UINT n = 0, misalign = ((size_t) buf) & 3;\n  if (misalign) {\n    char aligned[4];\n    f_read((FIL *) fp, aligned, len > misalign ? misalign : len, &n);\n    memcpy(buf, aligned, n);\n  } else {\n    f_read((FIL *) fp, buf, len, &n);\n  }\n  return n;\n}\n\nstatic size_t ff_write(void *fp, const void *buf, size_t len) {\n  UINT n = 0;\n  return f_write((FIL *) fp, (char *) buf, len, &n) == FR_OK ? n : 0;\n}\n\nstatic size_t ff_seek(void *fp, size_t offset) {\n  f_lseek((FIL *) fp, offset);\n  return offset;\n}\n\nstatic bool ff_rename(const char *from, const char *to) {\n  return f_rename(from, to) == FR_OK;\n}\n\nstatic bool ff_remove(const char *path) {\n  return f_unlink(path) == FR_OK;\n}\n\nstatic bool ff_mkdir(const char *path) {\n  return f_mkdir(path) == FR_OK;\n}\n\nstruct mg_fs mg_fs_fat = {ff_stat,  ff_list, ff_open,   ff_close,  ff_read,\n                          ff_write, ff_seek, ff_rename, ff_remove, ff_mkdir};\n#endif\n"
  },
  {
    "path": "src/fs_packed.c",
    "content": "#include \"fs.h\"\n#include \"printf.h\"\n#include \"str.h\"\n#include \"util.h\"\n\nstruct packed_file {\n  const char *data;\n  size_t size;\n  size_t pos;\n};\n\n#if MG_ENABLE_PACKED_FS\n#else\nconst char *mg_unpack(const char *path, size_t *size, time_t *mtime) {\n  if (size != NULL) *size = 0;\n  if (mtime != NULL) *mtime = 0;\n  (void) path;\n  return NULL;\n}\nconst char *mg_unlist(size_t no) {\n  (void) no;\n  return NULL;\n}\n#endif\n\nstruct mg_str mg_unpacked(const char *path) {\n  size_t len = 0;\n  const char *buf = mg_unpack(path, &len, NULL);\n  return mg_str_n(buf, len);\n}\n\nstatic int is_dir_prefix(const char *prefix, size_t n, const char *path) {\n  // MG_INFO((\"[%.*s] [%s] %c\", (int) n, prefix, path, path[n]));\n  return n < strlen(path) && strncmp(prefix, path, n) == 0 &&\n         (n == 0 || path[n] == '/' || path[n - 1] == '/');\n}\n\nstatic int packed_stat(const char *path, size_t *size, time_t *mtime) {\n  const char *p;\n  size_t i, n = strlen(path);\n  if (mg_unpack(path, size, mtime)) return MG_FS_READ;  // Regular file\n  // Scan all files. If `path` is a dir prefix for any of them, it's a dir\n  for (i = 0; (p = mg_unlist(i)) != NULL; i++) {\n    if (is_dir_prefix(path, n, p)) return MG_FS_DIR;\n  }\n  return 0;\n}\n\nstatic void packed_list(const char *dir, void (*fn)(const char *, void *),\n                        void *userdata) {\n  char buf[MG_PATH_MAX], tmp[sizeof(buf)];\n  const char *path, *begin, *end;\n  size_t i, n = strlen(dir);\n  tmp[0] = '\\0';  // Previously listed entry\n  for (i = 0; (path = mg_unlist(i)) != NULL; i++) {\n    if (!is_dir_prefix(dir, n, path)) continue;\n    begin = &path[n + 1];\n    end = strchr(begin, '/');\n    if (end == NULL) end = begin + strlen(begin);\n    mg_snprintf(buf, sizeof(buf), \"%.*s\", (int) (end - begin), begin);\n    buf[sizeof(buf) - 1] = '\\0';\n    // If this entry has been already listed, skip\n    // NOTE: we're assuming that file list is sorted alphabetically\n    if (strcmp(buf, tmp) == 0) continue;\n    fn(buf, userdata);  // Not yet listed, call user function\n    strcpy(tmp, buf);   // And save this entry as listed\n  }\n}\n\nstatic void *packed_open(const char *path, int flags) {\n  size_t size = 0;\n  const char *data = mg_unpack(path, &size, NULL);\n  struct packed_file *fp = NULL;\n  if (data == NULL) return NULL;\n  if (flags & MG_FS_WRITE) return NULL;\n  if ((fp = (struct packed_file *) mg_calloc(1, sizeof(*fp))) != NULL) {\n    fp->size = size;\n    fp->data = data;\n  }\n  return (void *) fp;\n}\n\nstatic void packed_close(void *fp) {\n  if (fp != NULL) mg_free(fp);\n}\n\nstatic size_t packed_read(void *fd, void *buf, size_t len) {\n  struct packed_file *fp = (struct packed_file *) fd;\n  if (fp->pos + len > fp->size) len = fp->size - fp->pos;\n  memcpy(buf, &fp->data[fp->pos], len);\n  fp->pos += len;\n  return len;\n}\n\nstatic size_t packed_write(void *fd, const void *buf, size_t len) {\n  (void) fd, (void) buf, (void) len;\n  return 0;\n}\n\nstatic size_t packed_seek(void *fd, size_t offset) {\n  struct packed_file *fp = (struct packed_file *) fd;\n  fp->pos = offset;\n  if (fp->pos > fp->size) fp->pos = fp->size;\n  return fp->pos;\n}\n\nstatic bool packed_rename(const char *from, const char *to) {\n  (void) from, (void) to;\n  return false;\n}\n\nstatic bool packed_remove(const char *path) {\n  (void) path;\n  return false;\n}\n\nstatic bool packed_mkdir(const char *path) {\n  (void) path;\n  return false;\n}\n\nstruct mg_fs mg_fs_packed = {\n    packed_stat,  packed_list, packed_open,   packed_close,  packed_read,\n    packed_write, packed_seek, packed_rename, packed_remove, packed_mkdir};\n"
  },
  {
    "path": "src/fs_posix.c",
    "content": "#include \"fs.h\"\n\n#if MG_ENABLE_POSIX_FS\n\n#ifndef MG_STAT_STRUCT\n#define MG_STAT_STRUCT stat\n#endif\n\n#ifndef MG_STAT_FUNC\n#define MG_STAT_FUNC stat\n#endif\n\nstatic int p_stat(const char *path, size_t *size, time_t *mtime) {\n#if !defined(S_ISDIR)\n  MG_ERROR((\"stat() API is not supported. %p %p %p\", path, size, mtime));\n  return 0;\n#else\n#if MG_ARCH == MG_ARCH_WIN32\n  struct _stati64 st;\n  wchar_t tmp[MG_PATH_MAX];\n  MultiByteToWideChar(CP_UTF8, 0, path, -1, tmp, sizeof(tmp) / sizeof(tmp[0]));\n  if (_wstati64(tmp, &st) != 0) return 0;\n  // If path is a symlink, windows reports 0 in st.st_size.\n  // Get a real file size by opening it and jumping to the end\n  if (st.st_size == 0 && (st.st_mode & _S_IFREG)) {\n    FILE *fp = _wfopen(tmp, L\"rb\");\n    if (fp != NULL) {\n      fseek(fp, 0, SEEK_END);\n      if (ftell(fp) > 0) st.st_size = ftell(fp);  // Use _ftelli64 on win10+\n      fclose(fp);\n    }\n  }\n#else\n  struct MG_STAT_STRUCT st;\n  if (MG_STAT_FUNC(path, &st) != 0) return 0;\n#endif\n  if (size) *size = (size_t) st.st_size;\n  if (mtime) *mtime = st.st_mtime;\n  return MG_FS_READ | MG_FS_WRITE | (S_ISDIR(st.st_mode) ? MG_FS_DIR : 0);\n#endif\n}\n\n#if MG_ARCH == MG_ARCH_WIN32\nstruct dirent {\n  char d_name[MAX_PATH];\n};\n\ntypedef struct win32_dir {\n  HANDLE handle;\n  WIN32_FIND_DATAW info;\n  struct dirent result;\n} DIR;\n\n#if 0\nint gettimeofday(struct timeval *tv, void *tz) {\n  FILETIME ft;\n  unsigned __int64 tmpres = 0;\n\n  if (tv != NULL) {\n    GetSystemTimeAsFileTime(&ft);\n    tmpres |= ft.dwHighDateTime;\n    tmpres <<= 32;\n    tmpres |= ft.dwLowDateTime;\n    tmpres /= 10;  // convert into microseconds\n    tmpres -= (int64_t) 11644473600000000;\n    tv->tv_sec = (long) (tmpres / 1000000UL);\n    tv->tv_usec = (long) (tmpres % 1000000UL);\n  }\n  (void) tz;\n  return 0;\n}\n#endif\n\nstatic int to_wchar(const char *path, wchar_t *wbuf, size_t wbuf_len) {\n  int ret;\n  char buf[MAX_PATH * 2], buf2[MAX_PATH * 2], *p;\n  strncpy(buf, path, sizeof(buf));\n  buf[sizeof(buf) - 1] = '\\0';\n  // Trim trailing slashes. Leave backslash for paths like \"X:\\\"\n  p = buf + strlen(buf) - 1;\n  while (p > buf && p[-1] != ':' && (p[0] == '\\\\' || p[0] == '/')) *p-- = '\\0';\n  memset(wbuf, 0, wbuf_len * sizeof(wchar_t));\n  ret = MultiByteToWideChar(CP_UTF8, 0, buf, -1, wbuf, (int) wbuf_len);\n  // Convert back to Unicode. If doubly-converted string does not match the\n  // original, something is fishy, reject.\n  WideCharToMultiByte(CP_UTF8, 0, wbuf, (int) wbuf_len, buf2, sizeof(buf2),\n                      NULL, NULL);\n  if (strcmp(buf, buf2) != 0) {\n    wbuf[0] = L'\\0';\n    ret = 0;\n  }\n  return ret;\n}\n\nDIR *opendir(const char *name) {\n  DIR *d = NULL;\n  wchar_t wpath[MAX_PATH];\n  DWORD attrs;\n\n  if (name == NULL) {\n    SetLastError(ERROR_BAD_ARGUMENTS);\n  } else if ((d = (DIR *) mg_calloc(1, sizeof(*d))) == NULL) {\n    SetLastError(ERROR_NOT_ENOUGH_MEMORY);\n  } else {\n    to_wchar(name, wpath, sizeof(wpath) / sizeof(wpath[0]));\n    attrs = GetFileAttributesW(wpath);\n    if (attrs != 0Xffffffff && (attrs & FILE_ATTRIBUTE_DIRECTORY)) {\n      (void) wcscat(wpath, L\"\\\\*\");\n      d->handle = FindFirstFileW(wpath, &d->info);\n      d->result.d_name[0] = '\\0';\n    } else {\n      mg_free(d);\n      d = NULL;\n    }\n  }\n  return d;\n}\n\nint closedir(DIR *d) {\n  int result = 0;\n  if (d != NULL) {\n    if (d->handle != INVALID_HANDLE_VALUE)\n      result = FindClose(d->handle) ? 0 : -1;\n    mg_free(d);\n  } else {\n    result = -1;\n    SetLastError(ERROR_BAD_ARGUMENTS);\n  }\n  return result;\n}\n\nstruct dirent *readdir(DIR *d) {\n  struct dirent *result = NULL;\n  if (d != NULL) {\n    memset(&d->result, 0, sizeof(d->result));\n    if (d->handle != INVALID_HANDLE_VALUE) {\n      result = &d->result;\n      WideCharToMultiByte(CP_UTF8, 0, d->info.cFileName, -1, result->d_name,\n                          sizeof(result->d_name), NULL, NULL);\n      if (!FindNextFileW(d->handle, &d->info)) {\n        FindClose(d->handle);\n        d->handle = INVALID_HANDLE_VALUE;\n      }\n    } else {\n      SetLastError(ERROR_FILE_NOT_FOUND);\n    }\n  } else {\n    SetLastError(ERROR_BAD_ARGUMENTS);\n  }\n  return result;\n}\n#endif\n\nstatic void p_list(const char *dir, void (*fn)(const char *, void *),\n                   void *userdata) {\n#if MG_ENABLE_DIRLIST\n  struct dirent *dp;\n  DIR *dirp;\n  if ((dirp = (opendir(dir))) == NULL) return;\n  while ((dp = readdir(dirp)) != NULL) {\n    if (!strcmp(dp->d_name, \".\") || !strcmp(dp->d_name, \"..\")) continue;\n    fn(dp->d_name, userdata);\n  }\n  closedir(dirp);\n#else\n  (void) dir, (void) fn, (void) userdata;\n#endif\n}\n\nstatic void *p_open(const char *path, int flags) {\n#if MG_ARCH == MG_ARCH_WIN32\n  const char *mode = flags == MG_FS_READ ? \"rb\" : \"a+b\";\n  wchar_t b1[MG_PATH_MAX], b2[10];\n  MultiByteToWideChar(CP_UTF8, 0, path, -1, b1, sizeof(b1) / sizeof(b1[0]));\n  MultiByteToWideChar(CP_UTF8, 0, mode, -1, b2, sizeof(b2) / sizeof(b2[0]));\n  return (void *) _wfopen(b1, b2);\n#else\n  const char *mode = flags == MG_FS_READ ? \"rbe\" : \"a+be\";  // e for CLOEXEC\n  return (void *) fopen(path, mode);\n#endif\n}\n\nstatic void p_close(void *fp) {\n  fclose((FILE *) fp);\n}\n\nstatic size_t p_read(void *fp, void *buf, size_t len) {\n  return fread(buf, 1, len, (FILE *) fp);\n}\n\nstatic size_t p_write(void *fp, const void *buf, size_t len) {\n  return fwrite(buf, 1, len, (FILE *) fp);\n}\n\nstatic size_t p_seek(void *fp, size_t offset) {\n#if (defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64) ||  \\\n    (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L) || \\\n    (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 600)\n  if (fseeko((FILE *) fp, (off_t) offset, SEEK_SET) != 0) (void) 0;\n#else\n  if (fseek((FILE *) fp, (long) offset, SEEK_SET) != 0) (void) 0;\n#endif\n  return (size_t) ftell((FILE *) fp);\n}\n\nstatic bool p_rename(const char *from, const char *to) {\n  return rename(from, to) == 0;\n}\n\nstatic bool p_remove(const char *path) {\n  return remove(path) == 0;\n}\n\nstatic bool p_mkdir(const char *path) {\n  return mkdir(path, 0775) == 0;\n}\n\n#else\n\nstatic int p_stat(const char *path, size_t *size, time_t *mtime) {\n  (void) path, (void) size, (void) mtime;\n  return 0;\n}\nstatic void p_list(const char *path, void (*fn)(const char *, void *),\n                   void *userdata) {\n  (void) path, (void) fn, (void) userdata;\n}\nstatic void *p_open(const char *path, int flags) {\n  (void) path, (void) flags;\n  return NULL;\n}\nstatic void p_close(void *fp) {\n  (void) fp;\n}\nstatic size_t p_read(void *fd, void *buf, size_t len) {\n  (void) fd, (void) buf, (void) len;\n  return 0;\n}\nstatic size_t p_write(void *fd, const void *buf, size_t len) {\n  (void) fd, (void) buf, (void) len;\n  return 0;\n}\nstatic size_t p_seek(void *fd, size_t offset) {\n  (void) fd, (void) offset;\n  return (size_t) ~0;\n}\nstatic bool p_rename(const char *from, const char *to) {\n  (void) from, (void) to;\n  return false;\n}\nstatic bool p_remove(const char *path) {\n  (void) path;\n  return false;\n}\nstatic bool p_mkdir(const char *path) {\n  (void) path;\n  return false;\n}\n#endif\n\nstruct mg_fs mg_fs_posix = {p_stat,  p_list, p_open,   p_close,  p_read,\n                            p_write, p_seek, p_rename, p_remove, p_mkdir};\n"
  },
  {
    "path": "src/http.c",
    "content": "#include \"http.h\"\n#include \"arch.h\"\n#include \"base64.h\"\n#include \"fmt.h\"\n#include \"json.h\"\n#include \"log.h\"\n#include \"net.h\"\n#include \"printf.h\"\n#include \"ssi.h\"\n#include \"util.h\"\n#include \"version.h\"\n#include \"ws.h\"\n\nstatic int mg_ncasecmp(const char *s1, const char *s2, size_t len) {\n  int diff = 0;\n  if (len > 0) do {\n      int c = *s1++, d = *s2++;\n      if (c >= 'A' && c <= 'Z') c += 'a' - 'A';\n      if (d >= 'A' && d <= 'Z') d += 'a' - 'A';\n      diff = c - d;\n    } while (diff == 0 && s1[-1] != '\\0' && --len > 0);\n  return diff;\n}\n\nbool mg_to_size_t(struct mg_str str, size_t *val);\nbool mg_to_size_t(struct mg_str str, size_t *val) {\n  size_t i = 0, max = (size_t) -1, max2 = max / 10, result = 0, ndigits = 0;\n  while (i < str.len && (str.buf[i] == ' ' || str.buf[i] == '\\t')) i++;\n  if (i < str.len && str.buf[i] == '-') return false;\n  while (i < str.len && str.buf[i] >= '0' && str.buf[i] <= '9') {\n    size_t digit = (size_t) (str.buf[i] - '0');\n    if (result > max2) return false;  // Overflow\n    result *= 10;\n    if (result > max - digit) return false;  // Overflow\n    result += digit;\n    i++, ndigits++;\n  }\n  while (i < str.len && (str.buf[i] == ' ' || str.buf[i] == '\\t')) i++;\n  if (ndigits == 0) return false;  // #2322: Content-Length = 1 * DIGIT\n  if (i != str.len) return false;  // Ditto\n  *val = (size_t) result;\n  return true;\n}\n\n// Chunk deletion marker is the MSB in the \"processed\" counter\n#define MG_DMARK ((size_t) 1 << (sizeof(size_t) * 8 - 1))\n\n// Multipart POST example:\n// --xyz\n// Content-Disposition: form-data; name=\"val\"\n//\n// abcdef\n// --xyz\n// Content-Disposition: form-data; name=\"foo\"; filename=\"a.txt\"\n// Content-Type: text/plain\n//\n// hello world\n//\n// --xyz--\nsize_t mg_http_next_multipart(struct mg_str body, size_t ofs,\n                              struct mg_http_part *part) {\n  struct mg_str cd = mg_str_n(\"Content-Disposition\", 19);\n  const char *s = body.buf;\n  size_t b = ofs, h1, h2, b1, b2, max = body.len;\n\n  // Init part params\n  if (part != NULL) part->name = part->filename = part->body = mg_str_n(0, 0);\n\n  // Skip boundary\n  while (b + 2 < max && s[b] != '\\r' && s[b + 1] != '\\n') b++;\n  if (b <= ofs || b + 2 >= max) return 0;\n  // MG_INFO((\"B: %zu %zu [%.*s]\", ofs, b - ofs, (int) (b - ofs), s));\n\n  // Skip headers\n  h1 = h2 = b + 2;\n  for (;;) {\n    while (h2 + 2 < max && s[h2] != '\\r' && s[h2 + 1] != '\\n') h2++;\n    if (h2 == h1) break;\n    if (h2 + 2 >= max) return 0;\n    // MG_INFO((\"Header: [%.*s]\", (int) (h2 - h1), &s[h1]));\n    if (part != NULL && h1 + cd.len + 2 < h2 && s[h1 + cd.len] == ':' &&\n        mg_ncasecmp(&s[h1], cd.buf, cd.len) == 0) {\n      struct mg_str v = mg_str_n(&s[h1 + cd.len + 2], h2 - (h1 + cd.len + 2));\n      part->name = mg_http_get_header_var(v, mg_str_n(\"name\", 4));\n      part->filename = mg_http_get_header_var(v, mg_str_n(\"filename\", 8));\n    }\n    h1 = h2 = h2 + 2;\n  }\n  b1 = b2 = h2 + 2;\n  while (b2 + 2 + (b - ofs) + 2 < max && !(s[b2] == '\\r' && s[b2 + 1] == '\\n' &&\n                                           memcmp(&s[b2 + 2], s, b - ofs) == 0))\n    b2++;\n\n  if (b2 + 2 >= max) return 0;\n  if (part != NULL) part->body = mg_str_n(&s[b1], b2 - b1);\n  // MG_INFO((\"Body: [%.*s]\", (int) (b2 - b1), &s[b1]));\n  return b2 + 2;\n}\n\nvoid mg_http_bauth(struct mg_connection *c, const char *user,\n                   const char *pass) {\n  struct mg_str u = mg_str(user), p = mg_str(pass);\n  size_t need = c->send.len + 36 + (u.len + p.len) * 2;\n  if (c->send.size < need) mg_iobuf_resize(&c->send, need);\n  if (c->send.size >= need) {\n    size_t i, n = 0;\n    char *buf = (char *) &c->send.buf[c->send.len];\n    memcpy(buf, \"Authorization: Basic \", 21);  // DON'T use mg_send!\n    for (i = 0; i < u.len; i++) {\n      n = mg_base64_update(((unsigned char *) u.buf)[i], buf + 21, n);\n    }\n    if (p.len > 0) {\n      n = mg_base64_update(':', buf + 21, n);\n      for (i = 0; i < p.len; i++) {\n        n = mg_base64_update(((unsigned char *) p.buf)[i], buf + 21, n);\n      }\n    }\n    n = mg_base64_final(buf + 21, n);\n    c->send.len += 21 + (size_t) n + 2;\n    memcpy(&c->send.buf[c->send.len - 2], \"\\r\\n\", 2);\n  } else {\n    MG_ERROR((\"%lu oom %d->%d \", c->id, (int) c->send.size, (int) need));\n  }\n}\n\nstruct mg_str mg_http_var(struct mg_str buf, struct mg_str name) {\n  struct mg_str entry, k, v, result = mg_str_n(NULL, 0);\n  while (mg_span(buf, &entry, &buf, '&')) {\n    if (mg_span(entry, &k, &v, '=') && name.len == k.len &&\n        mg_ncasecmp(name.buf, k.buf, k.len) == 0) {\n      result = v;\n      break;\n    }\n  }\n  return result;\n}\n\nint mg_http_get_var(const struct mg_str *buf, const char *name, char *dst,\n                    size_t dst_len) {\n  int len;\n  if (dst != NULL && dst_len > 0) {\n    dst[0] = '\\0';  // If destination buffer is valid, always nul-terminate it\n  }\n  if (dst == NULL || dst_len == 0) {\n    len = -2;  // Bad destination\n  } else if (buf->buf == NULL || name == NULL || buf->len == 0) {\n    len = -1;  // Bad source\n  } else {\n    struct mg_str v = mg_http_var(*buf, mg_str(name));\n    if (v.buf == NULL) {\n      len = -4;  // Name does not exist\n    } else {\n      len = mg_url_decode(v.buf, v.len, dst, dst_len, 1);\n      if (len < 0) len = -3;  // Failed to decode\n    }\n  }\n  return len;\n}\n\nstatic bool isx(int c) {\n  return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') ||\n         (c >= 'A' && c <= 'F');\n}\n\nint mg_url_decode(const char *src, size_t src_len, char *dst, size_t dst_len,\n                  int is_form_url_encoded) {\n  size_t i, j;\n  for (i = j = 0; i < src_len && j + 1 < dst_len; i++, j++) {\n    if (src[i] == '%') {\n      // Use `i + 2 < src_len`, not `i < src_len - 2`, note small src_len\n      if (i + 2 < src_len && isx(src[i + 1]) && isx(src[i + 2])) {\n        mg_str_to_num(mg_str_n(src + i + 1, 2), 16, &dst[j], sizeof(uint8_t));\n        i += 2;\n      } else {\n        return -1;\n      }\n    } else if (is_form_url_encoded && src[i] == '+') {\n      dst[j] = ' ';\n    } else {\n      dst[j] = src[i];\n    }\n  }\n  if (j < dst_len) dst[j] = '\\0';  // Null-terminate the destination\n  return i >= src_len && j < dst_len ? (int) j : -1;\n}\n\nstatic bool isok(uint8_t c) {\n  return c == '\\n' || c == '\\r' || c == '\\t' || c >= ' ';\n}\n\nint mg_http_get_request_len(const unsigned char *buf, size_t buf_len) {\n  size_t i;\n  for (i = 0; i < buf_len; i++) {\n    if (!isok(buf[i])) return -1;\n    if ((i > 0 && buf[i] == '\\n' && buf[i - 1] == '\\n') ||\n        (i > 3 && buf[i] == '\\n' && buf[i - 1] == '\\r' && buf[i - 2] == '\\n'))\n      return (int) i + 1;\n  }\n  return 0;\n}\nstruct mg_str *mg_http_get_header(struct mg_http_message *h, const char *name) {\n  size_t i, n = strlen(name), max = sizeof(h->headers) / sizeof(h->headers[0]);\n  for (i = 0; i < max && h->headers[i].name.len > 0; i++) {\n    struct mg_str *k = &h->headers[i].name, *v = &h->headers[i].value;\n    if (n == k->len && mg_ncasecmp(k->buf, name, n) == 0) return v;\n  }\n  return NULL;\n}\n\n// Is it a valid utf-8 continuation byte\nstatic bool vcb(uint8_t c) {\n  return (c & 0xc0) == 0x80;\n}\n\n// Get character length (valid utf-8). Used to parse method, URI, headers\nstatic size_t clen(const char *s, const char *end) {\n  const unsigned char *u = (unsigned char *) s, c = *u;\n  long n = (long) (end - s);\n  if (c > ' ' && c <= '~') return 1;  // Usual ascii printed char\n  if ((c & 0xe0) == 0xc0 && n > 1 && vcb(u[1])) return 2;  // 2-byte UTF8\n  if ((c & 0xf0) == 0xe0 && n > 2 && vcb(u[1]) && vcb(u[2])) return 3;\n  if ((c & 0xf8) == 0xf0 && n > 3 && vcb(u[1]) && vcb(u[2]) && vcb(u[3]))\n    return 4;\n  return 0;\n}\n\n// Skip until the newline. Return advanced `s`, or NULL on error\nstatic const char *skiptorn(const char *s, const char *end, struct mg_str *v) {\n  v->buf = (char *) s;\n  while (s < end && s[0] != '\\n' && s[0] != '\\r') s++, v->len++;  // To newline\n  if (s >= end || (s[0] == '\\r' && s[1] != '\\n')) return NULL;    // Stray \\r\n  if (s < end && s[0] == '\\r') s++;                               // Skip \\r\n  if (s >= end || *s++ != '\\n') return NULL;                      // Skip \\n\n  return s;\n}\n\nstatic bool mg_http_parse_headers(const char *s, const char *end,\n                                  struct mg_http_header *h, size_t max_hdrs) {\n  size_t i, n;\n  for (i = 0; i < max_hdrs; i++) {\n    struct mg_str k = {NULL, 0}, v = {NULL, 0};\n    if (s >= end) return false;\n    if (s[0] == '\\n' || (s[0] == '\\r' && s[1] == '\\n')) break;\n    k.buf = (char *) s;\n    while (s < end && s[0] != ':' && (n = clen(s, end)) > 0) s += n, k.len += n;\n    if (k.len == 0) return false;                     // Empty name\n    if (s >= end || clen(s, end) == 0) return false;  // Invalid UTF-8\n    if (*s++ != ':') return false;  // Invalid, not followed by :\n    // if (clen(s, end) == 0) return false;        // Invalid UTF-8\n    while (s < end && (s[0] == ' ' || s[0] == '\\t')) s++;  // Skip spaces\n    if ((s = skiptorn(s, end, &v)) == NULL) return false;\n    while (v.len > 0 && (v.buf[v.len - 1] == ' ' || v.buf[v.len - 1] == '\\t')) {\n      v.len--;  // Trim spaces\n    }\n    // MG_INFO((\"--HH [%.*s] [%.*s]\", (int) k.len, k.buf, (int) v.len, v.buf));\n    h[i].name = k, h[i].value = v;  // Success. Assign values\n  }\n  return true;\n}\n\nint mg_http_parse(const char *s, size_t len, struct mg_http_message *hm) {\n  int is_response, req_len = mg_http_get_request_len((unsigned char *) s, len);\n  const char *end = s == NULL ? NULL : s + req_len, *qs;  // Cannot add to NULL\n  const struct mg_str *cl;\n  size_t n;\n  bool version_prefix_valid;\n\n  memset(hm, 0, sizeof(*hm));\n  if (req_len <= 0) return req_len;\n\n  hm->message.buf = hm->head.buf = (char *) s;\n  hm->body.buf = (char *) end;\n  hm->head.len = (size_t) req_len;\n  hm->message.len = hm->body.len = (size_t) -1;  // Set body length to infinite\n\n  // Parse request line\n  hm->method.buf = (char *) s;\n  while (s < end && (n = clen(s, end)) > 0) s += n, hm->method.len += n;\n  while (s < end && s[0] == ' ') s++;  // Skip spaces\n  hm->uri.buf = (char *) s;\n  while (s < end && (n = clen(s, end)) > 0) s += n, hm->uri.len += n;\n  while (s < end && s[0] == ' ') s++;  // Skip spaces\n  is_response =\n      hm->method.len > 5 && (mg_ncasecmp(hm->method.buf, \"HTTP/\", 5) == 0);\n  if ((s = skiptorn(s, end, &hm->proto)) == NULL) return false;\n  // If we're given a version, check that it is HTTP/x.x\n  version_prefix_valid =\n      hm->proto.len > 5 && (mg_ncasecmp(hm->proto.buf, \"HTTP/\", 5) == 0);\n  if (!is_response && hm->proto.len > 0 &&\n      (!version_prefix_valid || hm->proto.len != 8 ||\n       (hm->proto.buf[5] < '0' || hm->proto.buf[5] > '9') ||\n       (hm->proto.buf[6] != '.') ||\n       (hm->proto.buf[7] < '0' || hm->proto.buf[7] > '9'))) {\n    return -1;\n  }\n\n  // If URI contains '?' character, setup query string\n  if ((qs = (const char *) memchr(hm->uri.buf, '?', hm->uri.len)) != NULL) {\n    hm->query.buf = (char *) qs + 1;\n    hm->query.len = (size_t) (&hm->uri.buf[hm->uri.len] - (qs + 1));\n    hm->uri.len = (size_t) (qs - hm->uri.buf);\n  }\n\n  // Sanity check. Allow protocol/reason to be empty\n  // Do this check after hm->method.len and hm->uri.len are finalised\n  if (hm->method.len == 0 || hm->uri.len == 0) return -1;\n\n  if (!mg_http_parse_headers(s, end, hm->headers,\n                             sizeof(hm->headers) / sizeof(hm->headers[0])))\n    return -1;  // error when parsing\n  if ((cl = mg_http_get_header(hm, \"Content-Length\")) != NULL) {\n    if (mg_to_size_t(*cl, &hm->body.len) == false) return -1;\n    hm->message.len = (size_t) req_len + hm->body.len;\n  }\n\n  // mg_http_parse() is used to parse both HTTP requests and HTTP\n  // responses. If HTTP response does not have Content-Length set, then\n  // body is read until socket is closed, i.e. body.len is infinite (~0).\n  //\n  // For HTTP requests though, if Content-Length is not specified\n  // set body length to 0.\n  if (hm->body.len == (size_t) ~0 && !is_response) {\n    hm->body.len = 0;\n    hm->message.len = (size_t) req_len;\n  }\n\n  // The 204 (No content) responses also have 0 body length\n  if (hm->body.len == (size_t) ~0 && is_response &&\n      mg_strcasecmp(hm->uri, mg_str(\"204\")) == 0) {\n    hm->body.len = 0;\n    hm->message.len = (size_t) req_len;\n  }\n  if (hm->message.len < (size_t) req_len) return -1;  // Overflow protection\n\n  return req_len;\n}\n\nstatic void mg_http_vprintf_chunk(struct mg_connection *c, const char *fmt,\n                                  va_list *ap) {\n  size_t len = c->send.len;\n  if (!mg_send(c, \"        \\r\\n\", 10)) mg_error(c, \"OOM\");\n  mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, ap);\n  if (c->send.len >= len + 10) {\n    mg_snprintf((char *) c->send.buf + len, 9, \"%08lx\", c->send.len - len - 10);\n    c->send.buf[len + 8] = '\\r';\n    if (c->send.len == len + 10) c->is_resp = 0;  // Last chunk, reset marker\n  }\n  if (!mg_send(c, \"\\r\\n\", 2)) mg_error(c, \"OOM\");\n}\n\nvoid mg_http_printf_chunk(struct mg_connection *c, const char *fmt, ...) {\n  va_list ap;\n  va_start(ap, fmt);\n  mg_http_vprintf_chunk(c, fmt, &ap);\n  va_end(ap);\n}\n\nvoid mg_http_write_chunk(struct mg_connection *c, const char *buf, size_t len) {\n  mg_printf(c, \"%lx\\r\\n\", (unsigned long) len);\n  if (!mg_send(c, buf, len) || !mg_send(c, \"\\r\\n\", 2)) mg_error(c, \"OOM\");\n  if (len == 0) c->is_resp = 0;\n}\n\n// clang-format off\nstatic const char *mg_http_status_code_str(int status_code) {\n  switch (status_code) {\n    case 100: return \"Continue\";\n    case 101: return \"Switching Protocols\";\n    case 102: return \"Processing\";\n    case 200: return \"OK\";\n    case 201: return \"Created\";\n    case 202: return \"Accepted\";\n    case 203: return \"Non-authoritative Information\";\n    case 204: return \"No Content\";\n    case 205: return \"Reset Content\";\n    case 206: return \"Partial Content\";\n    case 207: return \"Multi-Status\";\n    case 208: return \"Already Reported\";\n    case 226: return \"IM Used\";\n    case 300: return \"Multiple Choices\";\n    case 301: return \"Moved Permanently\";\n    case 302: return \"Found\";\n    case 303: return \"See Other\";\n    case 304: return \"Not Modified\";\n    case 305: return \"Use Proxy\";\n    case 307: return \"Temporary Redirect\";\n    case 308: return \"Permanent Redirect\";\n    case 400: return \"Bad Request\";\n    case 401: return \"Unauthorized\";\n    case 402: return \"Payment Required\";\n    case 403: return \"Forbidden\";\n    case 404: return \"Not Found\";\n    case 405: return \"Method Not Allowed\";\n    case 406: return \"Not Acceptable\";\n    case 407: return \"Proxy Authentication Required\";\n    case 408: return \"Request Timeout\";\n    case 409: return \"Conflict\";\n    case 410: return \"Gone\";\n    case 411: return \"Length Required\";\n    case 412: return \"Precondition Failed\";\n    case 413: return \"Payload Too Large\";\n    case 414: return \"Request-URI Too Long\";\n    case 415: return \"Unsupported Media Type\";\n    case 416: return \"Requested Range Not Satisfiable\";\n    case 417: return \"Expectation Failed\";\n    case 418: return \"I'm a teapot\";\n    case 421: return \"Misdirected Request\";\n    case 422: return \"Unprocessable Entity\";\n    case 423: return \"Locked\";\n    case 424: return \"Failed Dependency\";\n    case 426: return \"Upgrade Required\";\n    case 428: return \"Precondition Required\";\n    case 429: return \"Too Many Requests\";\n    case 431: return \"Request Header Fields Too Large\";\n    case 444: return \"Connection Closed Without Response\";\n    case 451: return \"Unavailable For Legal Reasons\";\n    case 499: return \"Client Closed Request\";\n    case 500: return \"Internal Server Error\";\n    case 501: return \"Not Implemented\";\n    case 502: return \"Bad Gateway\";\n    case 503: return \"Service Unavailable\";\n    case 504: return \"Gateway Timeout\";\n    case 505: return \"HTTP Version Not Supported\";\n    case 506: return \"Variant Also Negotiates\";\n    case 507: return \"Insufficient Storage\";\n    case 508: return \"Loop Detected\";\n    case 510: return \"Not Extended\";\n    case 511: return \"Network Authentication Required\";\n    case 599: return \"Network Connect Timeout Error\";\n    default: return \"\";\n  }\n}\n// clang-format on\n\nvoid mg_http_reply(struct mg_connection *c, int code, const char *headers,\n                   const char *fmt, ...) {\n  va_list ap;\n  size_t len;\n  mg_printf(c, \"HTTP/1.1 %d %s\\r\\n%sContent-Length:            \\r\\n\\r\\n\", code,\n            mg_http_status_code_str(code), headers == NULL ? \"\" : headers);\n  len = c->send.len;\n  va_start(ap, fmt);\n  mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, &ap);\n  va_end(ap);\n  if (c->send.len > 16) {\n    size_t n = mg_snprintf((char *) &c->send.buf[len - 15], 11, \"%-10lu\",\n                           (unsigned long) (c->send.len - len));\n    c->send.buf[len - 15 + n] = ' ';  // Change ending 0 to space\n  }\n  c->is_resp = 0;\n}\n\nstatic void http_cb(struct mg_connection *, int, void *);\nstatic void restore_http_cb(struct mg_connection *c) {\n  mg_fs_close((struct mg_fd *) c->pfn_data);\n  c->pfn_data = NULL;\n  c->pfn = http_cb;\n  c->is_resp = 0;\n}\n\nchar *mg_http_etag(char *buf, size_t len, size_t size, time_t mtime);\nchar *mg_http_etag(char *buf, size_t len, size_t size, time_t mtime) {\n  mg_snprintf(buf, len, \"\\\"%lld.%lld\\\"\", (int64_t) mtime, (int64_t) size);\n  return buf;\n}\n\nstatic void static_cb(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_WRITE || ev == MG_EV_POLL) {\n    struct mg_fd *fd = (struct mg_fd *) c->pfn_data;\n    // Read to send IO buffer directly, avoid extra on-stack buffer\n    size_t n, max = MG_IO_SIZE, space;\n    size_t *cl = (size_t *) &c->data[(sizeof(c->data) - sizeof(size_t)) /\n                                     sizeof(size_t) * sizeof(size_t)];\n    if (c->send.size < max) mg_iobuf_resize(&c->send, max);\n    if (c->send.len >= c->send.size) return;  // Rate limit\n    if ((space = c->send.size - c->send.len) > *cl) space = *cl;\n    n = fd->fs->rd(fd->fd, c->send.buf + c->send.len, space);\n    c->send.len += n;\n    *cl -= n;\n    if (n == 0) restore_http_cb(c);\n  } else if (ev == MG_EV_CLOSE) {\n    restore_http_cb(c);\n  }\n  (void) ev_data;\n}\n\n// Known mime types. Keep it outside guess_content_type() function, since\n// some environments don't like it defined there.\n// clang-format off\n#define MG_C_STR(a) { (char *) (a), sizeof(a) - 1 }\nstatic struct mg_str s_known_types[] = {\n    MG_C_STR(\"html\"), MG_C_STR(\"text/html; charset=utf-8\"),\n    MG_C_STR(\"htm\"), MG_C_STR(\"text/html; charset=utf-8\"),\n    MG_C_STR(\"css\"), MG_C_STR(\"text/css; charset=utf-8\"),\n    MG_C_STR(\"js\"), MG_C_STR(\"text/javascript; charset=utf-8\"),\n    MG_C_STR(\"mjs\"), MG_C_STR(\"text/javascript; charset=utf-8\"),\n    MG_C_STR(\"gif\"), MG_C_STR(\"image/gif\"),\n    MG_C_STR(\"png\"), MG_C_STR(\"image/png\"),\n    MG_C_STR(\"jpg\"), MG_C_STR(\"image/jpeg\"),\n    MG_C_STR(\"jpeg\"), MG_C_STR(\"image/jpeg\"),\n    MG_C_STR(\"woff\"), MG_C_STR(\"font/woff\"),\n    MG_C_STR(\"ttf\"), MG_C_STR(\"font/ttf\"),\n    MG_C_STR(\"svg\"), MG_C_STR(\"image/svg+xml\"),\n    MG_C_STR(\"txt\"), MG_C_STR(\"text/plain; charset=utf-8\"),\n    MG_C_STR(\"avi\"), MG_C_STR(\"video/x-msvideo\"),\n    MG_C_STR(\"csv\"), MG_C_STR(\"text/csv\"),\n    MG_C_STR(\"doc\"), MG_C_STR(\"application/msword\"),\n    MG_C_STR(\"exe\"), MG_C_STR(\"application/octet-stream\"),\n    MG_C_STR(\"gz\"), MG_C_STR(\"application/gzip\"),\n    MG_C_STR(\"ico\"), MG_C_STR(\"image/x-icon\"),\n    MG_C_STR(\"json\"), MG_C_STR(\"application/json\"),\n    MG_C_STR(\"mov\"), MG_C_STR(\"video/quicktime\"),\n    MG_C_STR(\"mp3\"), MG_C_STR(\"audio/mpeg\"),\n    MG_C_STR(\"mp4\"), MG_C_STR(\"video/mp4\"),\n    MG_C_STR(\"mpeg\"), MG_C_STR(\"video/mpeg\"),\n    MG_C_STR(\"pdf\"), MG_C_STR(\"application/pdf\"),\n    MG_C_STR(\"shtml\"), MG_C_STR(\"text/html; charset=utf-8\"),\n    MG_C_STR(\"tgz\"), MG_C_STR(\"application/tar-gz\"),\n    MG_C_STR(\"wav\"), MG_C_STR(\"audio/wav\"),\n    MG_C_STR(\"webp\"), MG_C_STR(\"image/webp\"),\n    MG_C_STR(\"zip\"), MG_C_STR(\"application/zip\"),\n    MG_C_STR(\"3gp\"), MG_C_STR(\"video/3gpp\"),\n    {0, 0},\n};\n// clang-format on\n\nstatic struct mg_str guess_content_type(struct mg_str path, const char *extra) {\n  struct mg_str entry, k, v, s = mg_str(extra), asterisk = mg_str_n(\"*\", 1);\n  size_t i = 0;\n\n  // Shrink path to its extension only\n  while (i < path.len && path.buf[path.len - i - 1] != '.') i++;\n  path.buf += path.len - i;\n  path.len = i;\n\n  // Process user-provided mime type overrides, if any\n  while (mg_span(s, &entry, &s, ',')) {\n    if (mg_span(entry, &k, &v, '=') &&\n        (mg_strcmp(asterisk, k) == 0 || mg_strcmp(path, k) == 0))\n      return v;\n  }\n\n  // Process built-in mime types\n  for (i = 0; s_known_types[i].buf != NULL; i += 2) {\n    if (mg_strcmp(path, s_known_types[i]) == 0) return s_known_types[i + 1];\n  }\n\n  return mg_str(\"text/plain; charset=utf-8\");\n}\n\nstatic int getrange(struct mg_str *s, size_t *a, size_t *b) {\n  size_t i, numparsed = 0;\n  for (i = 0; i + 6 < s->len; i++) {\n    struct mg_str k, v = mg_str_n(s->buf + i + 6, s->len - i - 6);\n    if (memcmp(&s->buf[i], \"bytes=\", 6) != 0) continue;\n    if (mg_span(v, &k, &v, '-')) {\n      if (mg_to_size_t(k, a)) numparsed++;\n      if (v.len > 0 && mg_to_size_t(v, b)) numparsed++;\n    } else {\n      if (mg_to_size_t(v, a)) numparsed++;\n    }\n    break;\n  }\n  return (int) numparsed;\n}\n\nvoid mg_http_serve_file(struct mg_connection *c, struct mg_http_message *hm,\n                        const char *path,\n                        const struct mg_http_serve_opts *opts) {\n  char etag[64], tmp[MG_PATH_MAX];\n  struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs;\n  struct mg_fd *fd = NULL;\n  size_t size = 0;\n  time_t mtime = 0;\n  struct mg_str *inm = NULL;\n  struct mg_str mime = guess_content_type(mg_str(path), opts->mime_types);\n  bool gzip = false;\n\n  if (path != NULL) {\n    // If a browser sends us \"Accept-Encoding: gzip\", try to open .gz first\n    struct mg_str *ae = mg_http_get_header(hm, \"Accept-Encoding\");\n    if (ae != NULL) {\n      if (mg_match(*ae, mg_str(\"*gzip*\"), NULL)) {\n        mg_snprintf(tmp, sizeof(tmp), \"%s.gz\", path);\n        fd = mg_fs_open(fs, tmp, MG_FS_READ);\n        if (fd != NULL) gzip = true, path = tmp;\n      }\n    }\n    // No luck opening .gz? Open what we've told to open\n    if (fd == NULL) fd = mg_fs_open(fs, path, MG_FS_READ);\n  }\n\n  // Failed to open, and page404 is configured? Open it, then\n  if (fd == NULL && opts->page404 != NULL) {\n    fd = mg_fs_open(fs, opts->page404, MG_FS_READ);\n    path = opts->page404;\n    mime = guess_content_type(mg_str(path), opts->mime_types);\n  }\n\n  if (fd == NULL || fs->st(path, &size, &mtime) == 0) {\n    mg_http_reply(c, 404, opts->extra_headers, \"Not found\\n\");\n    mg_fs_close(fd);\n    // NOTE: mg_http_etag() call should go first!\n  } else if (mg_http_etag(etag, sizeof(etag), size, mtime) != NULL &&\n             (inm = mg_http_get_header(hm, \"If-None-Match\")) != NULL &&\n             mg_strcasecmp(*inm, mg_str(etag)) == 0) {\n    mg_fs_close(fd);\n    mg_http_reply(c, 304, opts->extra_headers, \"\");\n  } else {\n    int n, status = 200;\n    char range[100];\n    size_t r1 = 0, r2 = 0, cl = size;\n\n    // Handle Range header\n    struct mg_str *rh = mg_http_get_header(hm, \"Range\");\n    range[0] = '\\0';\n    if (rh != NULL && (n = getrange(rh, &r1, &r2)) > 0) {\n      // If range is specified like \"400-\", set second limit to content len\n      if (n == 1) r2 = cl - 1;\n      if (r1 > r2 || r2 >= cl) {\n        status = 416;\n        cl = 0;\n        mg_snprintf(range, sizeof(range), \"Content-Range: bytes */%lld\\r\\n\",\n                    (int64_t) size);\n      } else {\n        status = 206;\n        cl = r2 - r1 + 1;\n        mg_snprintf(range, sizeof(range),\n                    \"Content-Range: bytes %llu-%llu/%llu\\r\\n\", (uint64_t) r1,\n                    (uint64_t) (r1 + cl - 1), (uint64_t) size);\n        fs->sk(fd->fd, r1);\n      }\n    }\n    mg_printf(c,\n              \"HTTP/1.1 %d %s\\r\\n\"\n              \"Content-Type: %.*s\\r\\n\"\n              \"Etag: %s\\r\\n\"\n              \"Content-Length: %llu\\r\\n\"\n              \"%s%s%s\\r\\n\",\n              status, mg_http_status_code_str(status), (int) mime.len, mime.buf,\n              etag, (uint64_t) cl, gzip ? \"Content-Encoding: gzip\\r\\n\" : \"\",\n              range, opts->extra_headers ? opts->extra_headers : \"\");\n    if (mg_strcasecmp(hm->method, mg_str(\"HEAD\")) == 0 || c->is_closing) {\n      c->is_resp = 0;\n      mg_fs_close(fd);\n    } else { // start serving static content only if not closing, see #3354\n      // Track to-be-sent content length at the end of c->data, aligned\n      size_t *clp = (size_t *) &c->data[(sizeof(c->data) - sizeof(size_t)) /\n                                        sizeof(size_t) * sizeof(size_t)];\n      c->pfn = static_cb;\n      c->pfn_data = fd;\n      *clp = cl;\n    }\n  }\n}\n\nstruct printdirentrydata {\n  struct mg_connection *c;\n  struct mg_http_message *hm;\n  const struct mg_http_serve_opts *opts;\n  const char *dir;\n};\n\n#if MG_ENABLE_DIRLIST\nstatic void printdirentry(const char *name, void *userdata) {\n  struct printdirentrydata *d = (struct printdirentrydata *) userdata;\n  struct mg_fs *fs = d->opts->fs == NULL ? &mg_fs_posix : d->opts->fs;\n  size_t size = 0;\n  time_t t = 0;\n  char path[MG_PATH_MAX], sz[40], mod[40];\n  int flags, n = 0;\n\n  // MG_DEBUG((\"[%s] [%s]\", d->dir, name));\n  if (mg_snprintf(path, sizeof(path), \"%s%c%s\", d->dir, '/', name) >\n      sizeof(path)) {\n    MG_ERROR((\"%s truncated\", name));\n  } else if ((flags = fs->st(path, &size, &t)) == 0) {\n    MG_ERROR((\"%lu stat(%s)\", d->c->id, path));\n  } else {\n    const char *slash = flags & MG_FS_DIR ? \"/\" : \"\";\n    if (flags & MG_FS_DIR) {\n      mg_snprintf(sz, sizeof(sz), \"%s\", \"[DIR]\");\n    } else {\n      mg_snprintf(sz, sizeof(sz), \"%lld\", (uint64_t) size);\n    }\n#if defined(MG_HTTP_DIRLIST_TIME_FMT)\n    {\n      char time_str[40];\n      struct tm *time_info = localtime(&t);\n      strftime(time_str, sizeof time_str, \"%Y/%m/%d %H:%M:%S\", time_info);\n      mg_snprintf(mod, sizeof(mod), \"%s\", time_str);\n    }\n#else\n    mg_snprintf(mod, sizeof(mod), \"%lu\", (unsigned long) t);\n#endif\n    n = (int) mg_url_encode(name, strlen(name), path, sizeof(path));\n    mg_printf(d->c,\n              \"  <tr><td><a href=\\\"%.*s%s\\\">%s%s</a></td>\"\n              \"<td name=%lu>%s</td><td name=%lld>%s</td></tr>\\n\",\n              n, path, slash, name, slash, (unsigned long) t, mod,\n              flags & MG_FS_DIR ? (int64_t) -1 : (int64_t) size, sz);\n  }\n}\n\nstatic void listdir(struct mg_connection *c, struct mg_http_message *hm,\n                    const struct mg_http_serve_opts *opts, char *dir) {\n  const char *sort_js_code =\n      \"<script>function srt(tb, sc, so, d) {\"\n      \"var tr = Array.prototype.slice.call(tb.rows, 0),\"\n      \"tr = tr.sort(function (a, b) { var c1 = a.cells[sc], c2 = b.cells[sc],\"\n      \"n1 = c1.getAttribute('name'), n2 = c2.getAttribute('name'), \"\n      \"t1 = a.cells[2].getAttribute('name'), \"\n      \"t2 = b.cells[2].getAttribute('name'); \"\n      \"return so * (t1 < 0 && t2 >= 0 ? -1 : t2 < 0 && t1 >= 0 ? 1 : \"\n      \"n1 ? parseInt(n2) - parseInt(n1) : \"\n      \"c1.textContent.trim().localeCompare(c2.textContent.trim())); });\";\n  const char *sort_js_code2 =\n      \"for (var i = 0; i < tr.length; i++) tb.appendChild(tr[i]); \"\n      \"if (!d) window.location.hash = ('sc=' + sc + '&so=' + so); \"\n      \"};\"\n      \"window.onload = function() {\"\n      \"var tb = document.getElementById('tb');\"\n      \"var m = /sc=([012]).so=(1|-1)/.exec(window.location.hash) || [0, 2, 1];\"\n      \"var sc = m[1], so = m[2]; document.onclick = function(ev) { \"\n      \"var c = ev.target.rel; if (c) {if (c == sc) so *= -1; srt(tb, c, so); \"\n      \"sc = c; ev.preventDefault();}};\"\n      \"srt(tb, sc, so, true);\"\n      \"}\"\n      \"</script>\";\n  struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs;\n  struct printdirentrydata d = {c, hm, opts, dir};\n  char tmp[10], buf[MG_PATH_MAX];\n  size_t off, n;\n  int len = mg_url_decode(hm->uri.buf, hm->uri.len, buf, sizeof(buf), 0);\n  struct mg_str uri = len > 0 ? mg_str_n(buf, (size_t) len) : hm->uri;\n\n  mg_printf(c,\n            \"HTTP/1.1 200 OK\\r\\n\"\n            \"Content-Type: text/html; charset=utf-8\\r\\n\"\n            \"%s\"\n            \"Content-Length:         \\r\\n\\r\\n\",\n            opts->extra_headers == NULL ? \"\" : opts->extra_headers);\n  off = c->send.len;  // Start of body\n  mg_printf(c,\n            \"<!DOCTYPE html><html><head><title>Index of %.*s</title>%s%s\"\n            \"<style>th,td {text-align: left; padding-right: 1em; \"\n            \"font-family: monospace; }</style></head>\"\n            \"<body><h1>Index of %.*s</h1><table cellpadding=\\\"0\\\"><thead>\"\n            \"<tr><th><a href=\\\"#\\\" rel=\\\"0\\\">Name</a></th><th>\"\n            \"<a href=\\\"#\\\" rel=\\\"1\\\">Modified</a></th>\"\n            \"<th><a href=\\\"#\\\" rel=\\\"2\\\">Size</a></th></tr>\"\n            \"<tr><td colspan=\\\"3\\\"><hr></td></tr>\"\n            \"</thead>\"\n            \"<tbody id=\\\"tb\\\">\\n\",\n            (int) uri.len, uri.buf, sort_js_code, sort_js_code2, (int) uri.len,\n            uri.buf);\n  mg_printf(c, \"%s\",\n            \"  <tr><td><a href=\\\"..\\\">..</a></td>\"\n            \"<td name=-1></td><td name=-1>[DIR]</td></tr>\\n\");\n\n  fs->ls(dir, printdirentry, &d);\n  mg_printf(c,\n            \"</tbody><tfoot><tr><td colspan=\\\"3\\\"><hr></td></tr></tfoot>\"\n            \"</table><address>Mongoose v.%s</address></body></html>\\n\",\n            MG_VERSION);\n  n = mg_snprintf(tmp, sizeof(tmp), \"%lu\", (unsigned long) (c->send.len - off));\n  if (n > sizeof(tmp)) n = 0;\n  memcpy(c->send.buf + off - 12, tmp, n);  // Set content length\n  c->is_resp = 0;                          // Mark response end\n}\n#endif\n\n// Resolve requested file into `path` and return its fs->st() result\nstatic int uri_to_path2(struct mg_connection *c, struct mg_http_message *hm,\n                        struct mg_fs *fs, struct mg_str url, struct mg_str dir,\n                        char *path, size_t path_size) {\n  int flags, tmp;\n  // Append URI to the root_dir, and sanitize it\n  size_t n = mg_snprintf(path, path_size, \"%.*s\", (int) dir.len, dir.buf);\n  if (n + 2 >= path_size) {\n    mg_http_reply(c, 400, \"\", \"Exceeded path size\");\n    return -1;\n  }\n  path[path_size - 1] = '\\0';\n  // Terminate root dir with slash\n  if (n > 0 && path[n - 1] != '/') path[n++] = '/', path[n] = '\\0';\n  if (url.len < hm->uri.len) {\n    mg_url_decode(hm->uri.buf + url.len, hm->uri.len - url.len, path + n,\n                  path_size - n, 0);\n  }\n  path[path_size - 1] = '\\0';  // Double-check\n  if (!mg_path_is_sane(mg_str_n(path, path_size))) {\n    mg_http_reply(c, 400, \"\", \"Invalid path\");\n    return -1;\n  }\n  n = strlen(path);\n  while (n > 1 && path[n - 1] == '/') path[--n] = 0;  // Trim trailing slashes\n  flags = mg_strcmp(hm->uri, mg_str(\"/\")) == 0 ? MG_FS_DIR\n                                               : fs->st(path, NULL, NULL);\n  MG_VERBOSE((\"%lu %.*s -> %s %d\", c->id, (int) hm->uri.len, hm->uri.buf, path,\n              flags));\n  if (flags == 0) {\n    // Do nothing - let's caller decide\n  } else if ((flags & MG_FS_DIR) && hm->uri.len > 0 &&\n             hm->uri.buf[hm->uri.len - 1] != '/') {\n    mg_printf(c,\n              \"HTTP/1.1 301 Moved\\r\\n\"\n              \"Location: %.*s/\\r\\n\"\n              \"Content-Length: 0\\r\\n\"\n              \"\\r\\n\",\n              (int) hm->uri.len, hm->uri.buf);\n    c->is_resp = 0;\n    flags = -1;\n  } else if (flags & MG_FS_DIR) {\n    if (((mg_snprintf(path + n, path_size - n, \"/\" MG_HTTP_INDEX) > 0 &&\n          (tmp = fs->st(path, NULL, NULL)) != 0) ||\n         (mg_snprintf(path + n, path_size - n, \"/index.shtml\") > 0 &&\n          (tmp = fs->st(path, NULL, NULL)) != 0))) {\n      flags = tmp;\n    } else if ((mg_snprintf(path + n, path_size - n, \"/\" MG_HTTP_INDEX \".gz\") >\n                    0 &&\n                (tmp = fs->st(path, NULL, NULL)) !=\n                    0)) {  // check for gzipped index\n      flags = tmp;\n      path[n + 1 + strlen(MG_HTTP_INDEX)] =\n          '\\0';  // Remove appended .gz in index file name\n    } else {\n      path[n] = '\\0';  // Remove appended index file name\n    }\n  }\n  return flags;\n}\n\nstatic int uri_to_path(struct mg_connection *c, struct mg_http_message *hm,\n                       const struct mg_http_serve_opts *opts, char *path,\n                       size_t path_size) {\n  struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs;\n  struct mg_str k, v, part, s = mg_str(opts->root_dir), u = {NULL, 0}, p = u;\n  while (mg_span(s, &part, &s, ',')) {\n    if (!mg_span(part, &k, &v, '=')) k = part, v = mg_str_n(NULL, 0);\n    if (v.len == 0) v = k, k = mg_str(\"/\"), u = k, p = v;\n    if (hm->uri.len < k.len) continue;\n    if (mg_strcmp(k, mg_str_n(hm->uri.buf, k.len)) != 0) continue;\n    u = k, p = v;\n  }\n  return uri_to_path2(c, hm, fs, u, p, path, path_size);\n}\n\nvoid mg_http_serve_dir(struct mg_connection *c, struct mg_http_message *hm,\n                       const struct mg_http_serve_opts *opts) {\n  char path[MG_PATH_MAX];\n  const char *sp = opts->ssi_pattern;\n  int flags = uri_to_path(c, hm, opts, path, sizeof(path));\n  if (flags < 0) {\n    // Do nothing: the response has already been sent by uri_to_path()\n  } else if (flags & MG_FS_DIR) {\n#if MG_ENABLE_DIRLIST\n    listdir(c, hm, opts, path);\n#else\n    mg_http_reply(c, 403, \"\", \"Forbidden\\n\");\n#endif\n  } else if (flags && sp != NULL && mg_match(mg_str(path), mg_str(sp), NULL)) {\n    mg_http_serve_ssi(c, opts->root_dir, path);\n  } else {\n    mg_http_serve_file(c, hm, path, opts);\n  }\n}\n\nstatic bool mg_is_url_safe(int c) {\n  return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') ||\n         (c >= 'A' && c <= 'Z') || c == '.' || c == '_' || c == '-' || c == '~';\n}\n\nsize_t mg_url_encode(const char *s, size_t sl, char *buf, size_t len) {\n  size_t i, n = 0;\n  for (i = 0; i < sl; i++) {\n    int c = *(unsigned char *) &s[i];\n    if (n + 4 >= len) return 0;\n    if (mg_is_url_safe(c)) {\n      buf[n++] = s[i];\n    } else {\n      mg_snprintf(&buf[n], 4, \"%%%M\", mg_print_hex, 1, &s[i]);\n      n += 3;\n    }\n  }\n  if (len > 0 && n < len - 1) buf[n] = '\\0';  // Null-terminate the destination\n  if (len > 0) buf[len - 1] = '\\0';           // Always.\n  return n;\n}\n\nvoid mg_http_creds(struct mg_http_message *hm, char *user, size_t userlen,\n                   char *pass, size_t passlen) {\n  struct mg_str *v = mg_http_get_header(hm, \"Authorization\");\n  user[0] = pass[0] = '\\0';\n  if (v != NULL && v->len > 6 && memcmp(v->buf, \"Basic \", 6) == 0) {\n    char buf[256];\n    size_t n = mg_base64_decode(v->buf + 6, v->len - 6, buf, sizeof(buf));\n    const char *p = (const char *) memchr(buf, ':', n > 0 ? n : 0);\n    if (p != NULL) {\n      mg_snprintf(user, userlen, \"%.*s\", p - buf, buf);\n      mg_snprintf(pass, passlen, \"%.*s\", n - (size_t) (p - buf) - 1, p + 1);\n    }\n  } else if (v != NULL && v->len > 7 && memcmp(v->buf, \"Bearer \", 7) == 0) {\n    mg_snprintf(pass, passlen, \"%.*s\", (int) v->len - 7, v->buf + 7);\n  } else if ((v = mg_http_get_header(hm, \"Cookie\")) != NULL) {\n    struct mg_str t = mg_http_get_header_var(*v, mg_str_n(\"access_token\", 12));\n    if (t.len > 0) mg_snprintf(pass, passlen, \"%.*s\", (int) t.len, t.buf);\n  } else {\n    mg_http_get_var(&hm->query, \"access_token\", pass, passlen);\n  }\n}\n\nstatic struct mg_str stripquotes(struct mg_str s) {\n  return s.len > 1 && s.buf[0] == '\"' && s.buf[s.len - 1] == '\"'\n             ? mg_str_n(s.buf + 1, s.len - 2)\n             : s;\n}\n\nstruct mg_str mg_http_get_header_var(struct mg_str s, struct mg_str v) {\n  size_t i;\n  for (i = 0; v.len > 0 && i + v.len + 2 < s.len; i++) {\n    if (s.buf[i + v.len] == '=' && memcmp(&s.buf[i], v.buf, v.len) == 0) {\n      const char *p = &s.buf[i + v.len + 1], *b = p, *x = &s.buf[s.len];\n      int q = p < x && *p == '\"' ? 1 : 0;\n      while (p < x &&\n             (q ? p == b || *p != '\"' : *p != ';' && *p != ' ' && *p != ','))\n        p++;\n      // MG_INFO((\"[%.*s] [%.*s] [%.*s]\", (int) s.len, s.buf, (int) v.len,\n      // v.buf, (int) (p - b), b));\n      return stripquotes(mg_str_n(b, (size_t) (p - b + q)));\n    }\n  }\n  return mg_str_n(NULL, 0);\n}\n\nlong mg_http_upload(struct mg_connection *c, struct mg_http_message *hm,\n                    struct mg_fs *fs, const char *dir, size_t max_size) {\n  char buf[20] = \"0\", file[MG_PATH_MAX], path[MG_PATH_MAX];\n  long res = 0, offset;\n  mg_http_get_var(&hm->query, \"offset\", buf, sizeof(buf));\n  mg_http_get_var(&hm->query, \"file\", file, sizeof(file));\n  offset = strtol(buf, NULL, 0);\n  mg_snprintf(path, sizeof(path), \"%s%c%s\", dir, MG_DIRSEP, file);\n  if (hm->body.len == 0) {\n    mg_http_reply(c, 200, \"\", \"%ld\", res);  // Nothing to write\n  } else if (file[0] == '\\0') {\n    mg_http_reply(c, 400, \"\", \"file required\");\n    res = -1;\n  } else if (mg_path_is_sane(mg_str(file)) == false) {\n    mg_http_reply(c, 400, \"\", \"%s: invalid file\", file);\n    res = -2;\n  } else if (offset < 0) {\n    mg_http_reply(c, 400, \"\", \"offset required\");\n    res = -3;\n  } else if ((size_t) offset + hm->body.len > max_size) {\n    mg_http_reply(c, 400, \"\", \"%s: over max size of %lu\", path,\n                  (unsigned long) max_size);\n    res = -4;\n  } else {\n    struct mg_fd *fd;\n    size_t current_size = 0;\n    MG_DEBUG((\"%s -> %lu bytes @ %ld\", path, hm->body.len, offset));\n    if (offset == 0) fs->rm(path);  // If offset if 0, truncate file\n    fs->st(path, &current_size, NULL);\n    if (offset > 0 && current_size != (size_t) offset) {\n      mg_http_reply(c, 400, \"\", \"%s: offset mismatch\", path);\n      res = -5;\n    } else if ((fd = mg_fs_open(fs, path, MG_FS_WRITE)) == NULL) {\n      mg_http_reply(c, 400, \"\", \"open(%s)\", path);\n      res = -6;\n    } else {\n      res = offset + (long) fs->wr(fd->fd, hm->body.buf, hm->body.len);\n      mg_fs_close(fd);\n      mg_http_reply(c, 200, \"\", \"%ld\", res);\n    }\n  }\n  return res;\n}\n\nint mg_http_status(const struct mg_http_message *hm) {\n  return atoi(hm->uri.buf);\n}\n\nstatic bool is_hex_digit(int c) {\n  return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') ||\n         (c >= 'A' && c <= 'F');\n}\n\nstatic int skip_chunk(const char *buf, int len, int *pl, int *dl) {\n  int i = 0, n = 0;\n  if (len < 3) return 0;\n  while (i < len && is_hex_digit(buf[i])) i++;\n  if (i == 0) return -1;                     // Error, no length specified\n  if (i > (int) sizeof(int) * 2) return -1;  // Chunk length is too big\n  if (len < i + 1 || buf[i] != '\\r' || buf[i + 1] != '\\n') return -1;  // Error\n  if (mg_str_to_num(mg_str_n(buf, (size_t) i), 16, &n, sizeof(int)) == false)\n    return -1;                    // Decode chunk length, overflow\n  if (n < 0) return -1;           // Error. TODO(): some checks now redundant\n  if (n > len - i - 4) return 0;  // Chunk not yet fully buffered\n  if (buf[i + n + 2] != '\\r' || buf[i + n + 3] != '\\n') return -1;  // Error\n  *pl = i + 2, *dl = n;\n  return i + 2 + n + 2;\n}\n\nstatic void http_cb(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_READ || ev == MG_EV_CLOSE ||\n      (ev == MG_EV_POLL && c->is_accepted && !c->is_draining &&\n       c->recv.len > 0)) {  // see #2796\n    struct mg_http_message hm;\n    size_t ofs = 0;  // Parsing offset\n    while (c->is_resp == 0 && ofs < c->recv.len) {\n      const char *buf = (char *) c->recv.buf + ofs;\n      int n = mg_http_parse(buf, c->recv.len - ofs, &hm);\n      struct mg_str *te;  // Transfer - encoding header\n      bool is_chunked = false;\n      size_t old_len = c->recv.len;\n      if (n < 0) {\n        // We don't use mg_error() here, to avoid closing pipelined requests\n        // prematurely, see #2592\n        MG_ERROR((\"HTTP parse, %lu bytes\", c->recv.len));\n        c->is_draining = 1;\n        mg_hexdump(buf, c->recv.len - ofs > 16 ? 16 : c->recv.len - ofs);\n        c->recv.len = 0;\n        return;\n      }\n      if (n == 0) break;                 // Request is not buffered yet\n      mg_call(c, MG_EV_HTTP_HDRS, &hm);  // Got all HTTP headers\n      if (c->recv.len != old_len) {\n        // User manipulated received data. Wash our hands\n        MG_DEBUG((\"%lu detaching HTTP handler\", c->id));\n        c->pfn = NULL;\n        return;\n      }\n      if (ev == MG_EV_CLOSE) {  // If client did not set Content-Length\n        hm.message.len = c->recv.len - ofs;  // and closes now, deliver MSG\n        hm.body.len = hm.message.len - (size_t) (hm.body.buf - hm.message.buf);\n      }\n      if ((te = mg_http_get_header(&hm, \"Transfer-Encoding\")) != NULL) {\n        if (mg_strcasecmp(*te, mg_str(\"chunked\")) == 0) {\n          is_chunked = true;\n        } else {\n          mg_error(c, \"Invalid Transfer-Encoding\");  // See #2460\n          return;\n        }\n      } else if (mg_http_get_header(&hm, \"Content-length\") == NULL) {\n        // #2593: HTTP packets must contain either Transfer-Encoding or\n        // Content-length\n        bool is_response = mg_ncasecmp(hm.method.buf, \"HTTP/\", 5) == 0;\n        bool require_content_len = false;\n        if (!is_response && (mg_strcasecmp(hm.method, mg_str(\"POST\")) == 0 ||\n                             mg_strcasecmp(hm.method, mg_str(\"PUT\")) == 0)) {\n          // POST and PUT should include an entity body. Therefore, they should\n          // contain a Content-length header (unless the body length is 0, in\n          // which case it can be omitted). Other requests can also contain a\n          // body, but their content has no defined semantics (RFC 7231)\n          if (hm.body.len != 0) require_content_len = true;\n          ofs += (size_t) n;  // this request has been processed\n        } else if (is_response) {\n          // HTTP spec 7.2 Entity body: All other responses must include a body\n          // or Content-Length header field defined with a value of 0.\n          int status = mg_http_status(&hm);\n          require_content_len = status >= 200 && status != 204 && status != 304;\n        }\n        if (require_content_len) {\n          if (!c->is_client) mg_http_reply(c, 411, \"\", \"\");\n          MG_ERROR((\"Content length missing from %s\",\n                    is_response ? \"response\" : \"request\"));\n        }\n      }\n\n      if (is_chunked) {\n        // For chunked data, strip off prefixes and suffixes from chunks\n        // and relocate them right after the headers, then report a message\n        char *s = (char *) c->recv.buf + ofs + n;\n        int o = 0, pl, dl, cl, len = (int) (c->recv.len - ofs - (size_t) n);\n\n        // Find zero-length chunk (the end of the body)\n        while ((cl = skip_chunk(s + o, len - o, &pl, &dl)) > 0 && dl) o += cl;\n        if (cl == 0) break;  // No zero-len chunk, buffer more data\n        if (cl < 0) {\n          mg_error(c, \"Invalid chunk\");\n          break;\n        }\n\n        // Zero chunk found. Second pass: strip + relocate\n        o = 0, hm.body.len = 0, hm.message.len = (size_t) n;\n        while ((cl = skip_chunk(s + o, len - o, &pl, &dl)) > 0) {\n          memmove(s + hm.body.len, s + o + pl, (size_t) dl);\n          o += cl, hm.body.len += (size_t) dl, hm.message.len += (size_t) dl;\n          if (dl == 0) break;\n        }\n        ofs += (size_t) (n + o);\n      } else {  // Normal, non-chunked data\n        size_t len = c->recv.len - ofs - (size_t) n;\n        if (hm.body.len > len) break;  // Buffer more data\n        ofs += (size_t) n + hm.body.len;\n      }\n\n      if (c->is_accepted) c->is_resp = 1;  // Start generating response\n      mg_call(c, MG_EV_HTTP_MSG, &hm);     // User handler can clear is_resp\n      if (c->is_accepted && !c->is_resp) {\n        struct mg_str *cc = mg_http_get_header(&hm, \"Connection\");\n        if (cc != NULL && mg_strcasecmp(*cc, mg_str(\"close\")) == 0) {\n          c->is_draining = 1;  // honor \"Connection: close\"\n          break;\n        }\n      }\n    }\n    if (ofs > 0) mg_iobuf_del(&c->recv, 0, ofs);  // Delete processed data\n  }\n  (void) ev_data;\n}\n\nstruct mg_connection *mg_http_connect(struct mg_mgr *mgr, const char *url,\n                                      mg_event_handler_t fn, void *fn_data) {\n  return mg_connect_svc(mgr, url, fn, fn_data, http_cb, NULL);\n}\n\nstruct mg_connection *mg_http_listen(struct mg_mgr *mgr, const char *url,\n                                     mg_event_handler_t fn, void *fn_data) {\n  struct mg_connection *c = mg_listen(mgr, url, fn, fn_data);\n  if (c != NULL) c->pfn = http_cb;\n  return c;\n}\n"
  },
  {
    "path": "src/http.h",
    "content": "#pragma once\n\n#include \"arch.h\"\n#include \"config.h\"\n#include \"fs.h\"\n#include \"net.h\"\n#include \"str.h\"\n\nstruct mg_http_header {\n  struct mg_str name;   // Header name\n  struct mg_str value;  // Header value\n};\n\nstruct mg_http_message {\n  struct mg_str method, uri, query, proto;             // Request/response line\n  struct mg_http_header headers[MG_MAX_HTTP_HEADERS];  // Headers\n  struct mg_str body;                                  // Body\n  struct mg_str head;                                  // Request + headers\n  struct mg_str message;  // Request + headers + body\n};\n\n// Parameter for mg_http_serve_dir()\nstruct mg_http_serve_opts {\n  const char *root_dir;       // Web root directory, must be non-NULL\n  const char *ssi_pattern;    // SSI file name pattern, e.g. #.shtml\n  const char *extra_headers;  // Extra HTTP headers to add in responses\n  const char *mime_types;     // Extra mime types, ext1=type1,ext2=type2,..\n  const char *page404;        // Path to the 404 page, or NULL by default\n  struct mg_fs *fs;           // Filesystem implementation. Use NULL for POSIX\n};\n\n// Parameter for mg_http_next_multipart\nstruct mg_http_part {\n  struct mg_str name;      // Form field name\n  struct mg_str filename;  // Filename for file uploads\n  struct mg_str body;      // Part contents\n};\n\nint mg_http_parse(const char *s, size_t len, struct mg_http_message *);\nint mg_http_get_request_len(const unsigned char *buf, size_t buf_len);\nvoid mg_http_printf_chunk(struct mg_connection *cnn, const char *fmt, ...);\nvoid mg_http_write_chunk(struct mg_connection *c, const char *buf, size_t len);\nstruct mg_connection *mg_http_listen(struct mg_mgr *, const char *url,\n                                     mg_event_handler_t fn, void *fn_data);\nstruct mg_connection *mg_http_connect(struct mg_mgr *, const char *url,\n                                      mg_event_handler_t fn, void *fn_data);\nvoid mg_http_serve_dir(struct mg_connection *, struct mg_http_message *hm,\n                       const struct mg_http_serve_opts *);\nvoid mg_http_serve_file(struct mg_connection *, struct mg_http_message *hm,\n                        const char *path, const struct mg_http_serve_opts *);\nvoid mg_http_reply(struct mg_connection *, int status_code, const char *headers,\n                   const char *body_fmt, ...);\nstruct mg_str *mg_http_get_header(struct mg_http_message *, const char *name);\nstruct mg_str mg_http_var(struct mg_str buf, struct mg_str name);\nint mg_http_get_var(const struct mg_str *, const char *name, char *, size_t);\nint mg_url_decode(const char *s, size_t n, char *to, size_t to_len, int form);\nsize_t mg_url_encode(const char *s, size_t n, char *buf, size_t len);\nvoid mg_http_creds(struct mg_http_message *, char *, size_t, char *, size_t);\nlong mg_http_upload(struct mg_connection *c, struct mg_http_message *hm,\n                    struct mg_fs *fs, const char *dir, size_t max_size);\nvoid mg_http_bauth(struct mg_connection *, const char *user, const char *pass);\nstruct mg_str mg_http_get_header_var(struct mg_str s, struct mg_str v);\nsize_t mg_http_next_multipart(struct mg_str, size_t, struct mg_http_part *);\nint mg_http_status(const struct mg_http_message *hm);\n"
  },
  {
    "path": "src/iobuf.c",
    "content": "#include \"iobuf.h\"\n#include \"arch.h\"\n#include \"log.h\"\n#include \"util.h\"\n\nstatic size_t roundup(size_t size, size_t align) {\n  return align == 0 ? size : (size + align - 1) / align * align;\n}\n\nbool mg_iobuf_resize(struct mg_iobuf *io, size_t new_size) {\n  bool ok = true;\n  new_size = roundup(new_size, io->align);\n  if (new_size == 0) {\n    mg_bzero(io->buf, io->size);\n    mg_free(io->buf);\n    io->buf = NULL;\n    io->len = io->size = 0;\n  } else if (new_size != io->size) {\n    // NOTE(lsm): do not use realloc here. Use mg_calloc/mg_free only\n    void *p = mg_calloc(1, new_size);\n    if (p != NULL) {\n      size_t len = new_size < io->len ? new_size : io->len;\n      if (len > 0 && io->buf != NULL) memmove(p, io->buf, len);\n      mg_bzero(io->buf, io->size);\n      mg_free(io->buf);\n      io->buf = (unsigned char *) p;\n      io->size = new_size;\n      io->len = len;\n    } else {\n      ok = false;\n      MG_ERROR((\"%lld->%lld\", (uint64_t) io->size, (uint64_t) new_size));\n    }\n  }\n  return ok;\n}\n\nbool mg_iobuf_init(struct mg_iobuf *io, size_t size, size_t align) {\n  io->buf = NULL;\n  io->align = align;\n  io->size = io->len = 0;\n  return mg_iobuf_resize(io, size);\n}\n\nsize_t mg_iobuf_add(struct mg_iobuf *io, size_t ofs, const void *buf,\n                    size_t len) {\n  size_t new_size = roundup(io->len + len, io->align);\n  mg_iobuf_resize(io, new_size);      // Attempt to resize\n  if (new_size != io->size) len = 0;  // Resize failure, append nothing\n  if (ofs < io->len) memmove(io->buf + ofs + len, io->buf + ofs, io->len - ofs);\n  if (buf != NULL) memmove(io->buf + ofs, buf, len);\n  if (ofs > io->len) io->len += ofs - io->len;\n  io->len += len;\n  return len;\n}\n\nsize_t mg_iobuf_del(struct mg_iobuf *io, size_t ofs, size_t len) {\n  if (ofs > io->len) ofs = io->len;\n  if (ofs + len > io->len) len = io->len - ofs;\n  if (io->buf) memmove(io->buf + ofs, io->buf + ofs + len, io->len - ofs - len);\n  if (io->buf) mg_bzero(io->buf + io->len - len, len);\n  io->len -= len;\n  return len;\n}\n\nvoid mg_iobuf_free(struct mg_iobuf *io) {\n  mg_iobuf_resize(io, 0);\n}\n"
  },
  {
    "path": "src/iobuf.h",
    "content": "#pragma once\n\n#include \"arch.h\"\n\nstruct mg_iobuf {\n  unsigned char *buf;  // Pointer to stored data\n  size_t size;         // Total size available\n  size_t len;          // Current number of bytes\n  size_t align;        // Alignment during allocation\n};\n\nbool mg_iobuf_init(struct mg_iobuf *, size_t, size_t);\nbool mg_iobuf_resize(struct mg_iobuf *, size_t);\nvoid mg_iobuf_free(struct mg_iobuf *);\nsize_t mg_iobuf_add(struct mg_iobuf *, size_t, const void *, size_t);\nsize_t mg_iobuf_del(struct mg_iobuf *, size_t ofs, size_t len);\n"
  },
  {
    "path": "src/json.c",
    "content": "#include \"json.h\"\n#include \"base64.h\"\n#include \"fmt.h\"\n#include \"util.h\"\n\nstatic const char *escapeseq(int esc) {\n  return esc ? \"\\b\\f\\n\\r\\t\\\\\\\"\" : \"bfnrt\\\\\\\"\";\n}\n\nstatic char json_esc(int c, int esc) {\n  const char *p, *esc1 = escapeseq(esc), *esc2 = escapeseq(!esc);\n  for (p = esc1; *p != '\\0'; p++) {\n    if (*p == c) return esc2[p - esc1];\n  }\n  return 0;\n}\n\nstatic int mg_pass_string(const char *s, int len) {\n  int i;\n  for (i = 0; i < len; i++) {\n    if (s[i] == '\\\\' && i + 1 < len && json_esc(s[i + 1], 1)) {\n      i++;\n    } else if (s[i] == '\\0') {\n      return MG_JSON_INVALID;\n    } else if (s[i] == '\"') {\n      return i;\n    }\n  }\n  return MG_JSON_INVALID;\n}\n\nstatic double mg_atod(const char *p, int len, int *numlen) {\n  double d = 0.0;\n  int i = 0, sign = 1;\n\n  // Sign\n  if (i < len && *p == '-') {\n    sign = -1, i++;\n  } else if (i < len && *p == '+') {\n    i++;\n  }\n\n  // Decimal\n  for (; i < len && p[i] >= '0' && p[i] <= '9'; i++) {\n    d *= 10.0;\n    d += p[i] - '0';\n  }\n  d *= sign;\n\n  // Fractional\n  if (i < len && p[i] == '.') {\n    double frac = 0.0, base = 0.1;\n    i++;\n    for (; i < len && p[i] >= '0' && p[i] <= '9'; i++) {\n      frac += base * (p[i] - '0');\n      base /= 10.0;\n    }\n    d += frac * sign;\n  }\n\n  // Exponential\n  if (i < len && (p[i] == 'e' || p[i] == 'E')) {\n    int j, exp = 0, minus = 0;\n    i++;\n    if (i < len && p[i] == '-') minus = 1, i++;\n    if (i < len && p[i] == '+') i++;\n    while (i < len && p[i] >= '0' && p[i] <= '9' && exp < 308)\n      exp = exp * 10 + (p[i++] - '0');\n    if (minus) exp = -exp;\n    for (j = 0; j < exp; j++) d *= 10.0;\n    for (j = 0; j < -exp; j++) d /= 10.0;\n  }\n\n  if (numlen != NULL) *numlen = i;\n  return d;\n}\n\n// Iterate over object or array elements\nsize_t mg_json_next(struct mg_str obj, size_t ofs, struct mg_str *key,\n                    struct mg_str *val) {\n  if (ofs >= obj.len) {\n    ofs = 0;  // Out of boundaries, stop scanning\n  } else if (obj.len < 2 || (*obj.buf != '{' && *obj.buf != '[')) {\n    ofs = 0;  // Not an array or object, stop\n  } else {\n    struct mg_str sub = mg_str_n(obj.buf + ofs, obj.len - ofs);\n    if (ofs == 0) ofs++, sub.buf++, sub.len--;\n    if (*obj.buf == '[') {  // Iterate over an array\n      int n = 0, o = mg_json_get(sub, \"$\", &n);\n      if (n < 0 || o < 0 || (size_t) (o + n) > sub.len) {\n        ofs = 0;  // Error parsing key, stop scanning\n      } else {\n        if (key) *key = mg_str_n(NULL, 0);\n        if (val) *val = mg_str_n(sub.buf + o, (size_t) n);\n        ofs = (size_t) (&sub.buf[o + n] - obj.buf);\n      }\n    } else {  // Iterate over an object\n      int n = 0, o = mg_json_get(sub, \"$\", &n);\n      if (n < 0 || o < 0 || (size_t) (o + n) > sub.len) {\n        ofs = 0;  // Error parsing key, stop scanning\n      } else {\n        if (key) *key = mg_str_n(sub.buf + o, (size_t) n);\n        sub.buf += o + n, sub.len -= (size_t) (o + n);\n        while (sub.len > 0 && *sub.buf != ':') sub.len--, sub.buf++;\n        if (sub.len > 0 && *sub.buf == ':') sub.len--, sub.buf++;\n        n = 0, o = mg_json_get(sub, \"$\", &n);\n        if (n < 0 || o < 0 || (size_t) (o + n) > sub.len) {\n          ofs = 0;  // Error parsing value, stop scanning\n        } else {\n          if (val) *val = mg_str_n(sub.buf + o, (size_t) n);\n          ofs = (size_t) (&sub.buf[o + n] - obj.buf);\n        }\n      }\n    }\n    // MG_INFO((\"SUB ofs %u %.*s\", ofs, sub.len, sub.buf));\n    while (ofs && ofs < obj.len &&\n           (obj.buf[ofs] == ' ' || obj.buf[ofs] == '\\t' ||\n            obj.buf[ofs] == '\\n' || obj.buf[ofs] == '\\r')) {\n      ofs++;\n    }\n    if (ofs && ofs < obj.len && obj.buf[ofs] == ',') ofs++;\n    if (ofs > obj.len) ofs = 0;\n  }\n  return ofs;\n}\n\nint mg_json_get(struct mg_str json, const char *path, int *toklen) {\n  const char *s = json.buf;\n  int len = (int) json.len;\n  enum { S_VALUE, S_KEY, S_COLON, S_COMMA_OR_EOO } expecting = S_VALUE;\n  unsigned char nesting[MG_JSON_MAX_DEPTH];\n  int i = 0;             // Current offset in `s`\n  int j = 0;             // Offset in `s` we're looking for (return value)\n  int depth = 0;         // Current depth (nesting level)\n  int ed = 0;            // Expected depth\n  int pos = 1;           // Current position in `path`\n  int ci = -1, ei = -1;  // Current and expected index in array\n\n  if (toklen) *toklen = 0;\n  if (path[0] != '$') return MG_JSON_INVALID;\n\n#define MG_CHECKRET(x)                                  \\\n  do {                                                  \\\n    if (depth == ed && path[pos] == '\\0' && ci == ei) { \\\n      if (toklen) *toklen = i - j + 1;                  \\\n      return j;                                         \\\n    }                                                   \\\n  } while (0)\n\n// In the ascii table, the distance between `[` and `]` is 2.\n// Ditto for `{` and `}`. Hence +2 in the code below.\n#define MG_EOO(x)                                            \\\n  do {                                                       \\\n    if (depth == ed && ci != ei) return MG_JSON_NOT_FOUND;   \\\n    if (c != nesting[depth - 1] + 2) return MG_JSON_INVALID; \\\n    depth--;                                                 \\\n    MG_CHECKRET(x);                                          \\\n  } while (0)\n\n  for (i = 0; i < len; i++) {\n    unsigned char c = ((unsigned char *) s)[i];\n    if (c == ' ' || c == '\\t' || c == '\\n' || c == '\\r') continue;\n    switch (expecting) {\n      case S_VALUE:\n        // p(\"V %s [%.*s] %d %d %d %d\\n\", path, pos, path, depth, ed, ci, ei);\n        if (depth == ed) j = i;\n        if (c == '{') {\n          if (depth >= (int) sizeof(nesting)) return MG_JSON_TOO_DEEP;\n          if (depth == ed && path[pos] == '.' && ci == ei) {\n            // If we start the object, reset array indices\n            ed++, pos++, ci = ei = -1;\n          }\n          nesting[depth++] = c;\n          expecting = S_KEY;\n          break;\n        } else if (c == '[') {\n          if (depth >= (int) sizeof(nesting)) return MG_JSON_TOO_DEEP;\n          if (depth == ed && path[pos] == '[' && ei == ci) {\n            ed++, pos++, ci = 0;\n            for (ei = 0; path[pos] != ']' && path[pos] != '\\0'; pos++) {\n              ei *= 10;\n              ei += path[pos] - '0';\n            }\n            if (path[pos] != 0) pos++;\n          }\n          nesting[depth++] = c;\n          break;\n        } else if (c == ']' && depth > 0) {  // Empty array\n          MG_EOO(']');\n        } else if (c == 't' && i + 3 < len && memcmp(&s[i], \"true\", 4) == 0) {\n          i += 3;\n        } else if (c == 'n' && i + 3 < len && memcmp(&s[i], \"null\", 4) == 0) {\n          i += 3;\n        } else if (c == 'f' && i + 4 < len && memcmp(&s[i], \"false\", 5) == 0) {\n          i += 4;\n        } else if (c == '-' || ((c >= '0' && c <= '9'))) {\n          int numlen = 0;\n          mg_atod(&s[i], len - i, &numlen);\n          i += numlen - 1;\n        } else if (c == '\"') {\n          int n = mg_pass_string(&s[i + 1], len - i - 1);\n          if (n < 0) return n;\n          i += n + 1;\n        } else {\n          return MG_JSON_INVALID;\n        }\n        MG_CHECKRET('V');\n        if (depth == ed && ei >= 0) ci++;\n        expecting = S_COMMA_OR_EOO;\n        break;\n\n      case S_KEY:\n        if (c == '\"') {\n          int n = mg_pass_string(&s[i + 1], len - i - 1);\n          if (n < 0) return n;\n          if (i + 1 + n >= len) return MG_JSON_NOT_FOUND;\n          if (depth < ed) return MG_JSON_NOT_FOUND;\n          if (depth == ed && path[pos - 1] != '.') return MG_JSON_NOT_FOUND;\n          // printf(\"K %s [%.*s] [%.*s] %d %d %d %d %d\\n\", path, pos, path, n,\n          //        &s[i + 1], n, depth, ed, ci, ei);\n          //  NOTE(cpq): in the check sequence below is important.\n          //  strncmp() must go first: it fails fast if the remaining length\n          //  of the path is smaller than `n`.\n          if (depth == ed && path[pos - 1] == '.' &&\n              strncmp(&s[i + 1], &path[pos], (size_t) n) == 0 &&\n              (path[pos + n] == '\\0' || path[pos + n] == '.' ||\n               path[pos + n] == '[')) {\n            pos += n;\n          }\n          i += n + 1;\n          expecting = S_COLON;\n        } else if (c == '}') {  // Empty object\n          MG_EOO('}');\n          expecting = S_COMMA_OR_EOO;\n          if (depth == ed && ei >= 0) ci++;\n        } else {\n          return MG_JSON_INVALID;\n        }\n        break;\n\n      case S_COLON:\n        if (c == ':') {\n          expecting = S_VALUE;\n        } else {\n          return MG_JSON_INVALID;\n        }\n        break;\n\n      case S_COMMA_OR_EOO:\n        if (depth <= 0) {\n          return MG_JSON_INVALID;\n        } else if (c == ',') {\n          expecting = (nesting[depth - 1] == '{') ? S_KEY : S_VALUE;\n        } else if (c == ']' || c == '}') {\n          if (depth == ed && c == '}' && path[pos - 1] == '.')\n            return MG_JSON_NOT_FOUND;\n          if (depth == ed && c == ']' && path[pos - 1] == ',')\n            return MG_JSON_NOT_FOUND;\n          MG_EOO('O');\n          if (depth == ed && ei >= 0) ci++;\n        } else {\n          return MG_JSON_INVALID;\n        }\n        break;\n    }\n  }\n  return MG_JSON_NOT_FOUND;\n}\n\nstruct mg_str mg_json_get_tok(struct mg_str json, const char *path) {\n  int len = 0, ofs = mg_json_get(json, path, &len);\n  return mg_str_n(ofs < 0 ? NULL : json.buf + ofs,\n                  (size_t) (len < 0 ? 0 : len));\n}\n\nbool mg_json_get_num(struct mg_str json, const char *path, double *v) {\n  int n, toklen, found = 0;\n  if ((n = mg_json_get(json, path, &toklen)) >= 0 &&\n      (json.buf[n] == '-' || (json.buf[n] >= '0' && json.buf[n] <= '9'))) {\n    if (v != NULL) *v = mg_atod(json.buf + n, toklen, NULL);\n    found = 1;\n  }\n  return found;\n}\n\nbool mg_json_get_bool(struct mg_str json, const char *path, bool *v) {\n  int found = 0, off = mg_json_get(json, path, NULL);\n  if (off >= 0 && (json.buf[off] == 't' || json.buf[off] == 'f')) {\n    if (v != NULL) *v = json.buf[off] == 't';\n    found = 1;\n  }\n  return found;\n}\n\nbool mg_json_unescape(struct mg_str s, char *to, size_t n) {\n  size_t i, j;\n  for (i = 0, j = 0; i < s.len && j < n; i++, j++) {\n    if (s.buf[i] == '\\\\' && i + 5 < s.len && s.buf[i + 1] == 'u') {\n      //  \\uXXXX escape. We process simple one-byte chars \\u00xx within ASCII\n      //  range. More complex chars would require dragging in a UTF8 library,\n      //  which is too much for us\n      if (mg_str_to_num(mg_str_n(s.buf + i + 2, 4), 16, &to[j],\n                        sizeof(uint8_t)) == false)\n        return false;\n      i += 5;\n    } else if (s.buf[i] == '\\\\' && i + 1 < s.len) {\n      char c = json_esc(s.buf[i + 1], 0);\n      if (c == 0) return false;\n      to[j] = c;\n      i++;\n    } else {\n      to[j] = s.buf[i];\n    }\n  }\n  if (j >= n) return false;\n  if (n > 0) to[j] = '\\0';\n  return true;\n}\n\nchar *mg_json_get_str(struct mg_str json, const char *path) {\n  char *result = NULL;\n  int len = 0, off = mg_json_get(json, path, &len);\n  if (off >= 0 && len > 1 && json.buf[off] == '\"') {\n    if ((result = (char *) mg_calloc(1, (size_t) len)) != NULL &&\n        !mg_json_unescape(mg_str_n(json.buf + off + 1, (size_t) (len - 2)),\n                          result, (size_t) len)) {\n      mg_free(result);\n      result = NULL;\n    }\n  }\n  return result;\n}\n\nchar *mg_json_get_b64(struct mg_str json, const char *path, int *slen) {\n  char *result = NULL;\n  int len = 0, off = mg_json_get(json, path, &len);\n  if (off >= 0 && json.buf[off] == '\"' && len > 1 &&\n      (result = (char *) mg_calloc(1, (size_t) len)) != NULL) {\n    size_t k = mg_base64_decode(json.buf + off + 1, (size_t) (len - 2), result,\n                                (size_t) len);\n    if (slen != NULL) *slen = (int) k;\n  }\n  return result;\n}\n\nchar *mg_json_get_hex(struct mg_str json, const char *path, int *slen) {\n  char *result = NULL;\n  int len = 0, off = mg_json_get(json, path, &len);\n  if (off >= 0 && json.buf[off] == '\"' && len > 1 &&\n      (result = (char *) mg_calloc(1, (size_t) len / 2)) != NULL) {\n    int i;\n    for (i = 0; i < len - 2; i += 2) {\n      mg_str_to_num(mg_str_n(json.buf + off + 1 + i, 2), 16, &result[i >> 1],\n                    sizeof(uint8_t));\n    }\n    result[len / 2 - 1] = '\\0';\n    if (slen != NULL) *slen = len / 2 - 1;\n  }\n  return result;\n}\n\nlong mg_json_get_long(struct mg_str json, const char *path, long dflt) {\n  double dv;\n  long result = dflt;\n  if (mg_json_get_num(json, path, &dv)) result = (long) dv;\n  return result;\n}\n"
  },
  {
    "path": "src/json.h",
    "content": "#pragma once\n\n#include \"arch.h\"\n#include \"str.h\"\n\n#ifndef MG_JSON_MAX_DEPTH\n#define MG_JSON_MAX_DEPTH 30\n#endif\n\n// Error return values - negative. Successful returns are >= 0\nenum { MG_JSON_TOO_DEEP = -1, MG_JSON_INVALID = -2, MG_JSON_NOT_FOUND = -3 };\nint mg_json_get(struct mg_str json, const char *path, int *toklen);\n\nstruct mg_str mg_json_get_tok(struct mg_str json, const char *path);\nbool mg_json_get_num(struct mg_str json, const char *path, double *v);\nbool mg_json_get_bool(struct mg_str json, const char *path, bool *v);\nlong mg_json_get_long(struct mg_str json, const char *path, long dflt);\nchar *mg_json_get_str(struct mg_str json, const char *path);\nchar *mg_json_get_hex(struct mg_str json, const char *path, int *len);\nchar *mg_json_get_b64(struct mg_str json, const char *path, int *len);\n\nbool mg_json_unescape(struct mg_str str, char *buf, size_t len);\nsize_t mg_json_next(struct mg_str obj, size_t ofs, struct mg_str *key,\n                    struct mg_str *val);\n"
  },
  {
    "path": "src/l2.c",
    "content": "#include \"l2.h\"\n#include \"net.h\"\n#include \"net_builtin.h\"\n\n#if MG_ENABLE_TCPIP\n\n// L2 API\nvoid mg_l2_init(enum mg_l2type type, uint8_t *addr, uint16_t *mtu,\n                uint16_t *framesize);\nuint8_t *mg_l2_header(enum mg_l2type type, enum mg_l2proto proto, uint8_t *src,\n                      uint8_t *dst, uint8_t *frame);\nsize_t mg_l2_footer(enum mg_l2type type, size_t len, uint8_t *frame);\nbool mg_l2_rx(struct mg_tcpip_if *ifp, enum mg_l2proto *proto,\n              struct mg_str *pay, struct mg_str *raw);\n// TODO(): ? bool mg_l2_rx(enum mg_l2type type, struct mg_l2opts *opts, uint8_t\n// *addr, enum mg_l2proto *proto, struct mg_str *pay, struct mg_str *raw);\nuint8_t *mg_l2_getaddr(enum mg_l2type type, uint8_t *frame);\nuint8_t *mg_l2_mapip(enum mg_l2type type, enum mg_l2addrtype addrtype,\n                     struct mg_addr *ip);\nbool mg_l2_genip6(enum mg_l2type type, uint64_t *ip6, uint8_t prefix_len,\n                  uint8_t *addr);\nbool mg_l2_ip6get(enum mg_l2type type, uint8_t *addr, uint8_t *opts,\n                  uint8_t len);\nuint8_t mg_l2_ip6put(enum mg_l2type type, uint8_t *addr, uint8_t *opts);\n\n// clang-format off\nextern void mg_l2_eth_init(struct mg_l2addr *, uint16_t *, uint16_t *);\nextern uint8_t *mg_l2_eth_header(enum mg_l2proto, struct mg_l2addr *, struct mg_l2addr *, uint8_t *);\nextern size_t mg_l2_eth_footer(size_t, uint8_t *);\nextern bool mg_l2_eth_rx(struct mg_tcpip_if *, enum mg_l2proto *, struct mg_str *, struct mg_str *);\nextern struct mg_l2addr *mg_l2_eth_getaddr(uint8_t *);\nextern struct mg_l2addr *mg_l2_eth_mapip(enum mg_l2addrtype, struct mg_addr *);\nextern bool mg_l2_eth_genip6(uint64_t *, uint8_t, struct mg_l2addr *);\nextern bool mg_l2_eth_ip6get(struct mg_l2addr *, uint8_t *, uint8_t);\nextern uint8_t mg_l2_eth_ip6put(struct mg_l2addr *, uint8_t *);\n\nextern void mg_l2_ppp_init(struct mg_l2addr *, uint16_t *, uint16_t *);\nextern uint8_t *mg_l2_ppp_header(enum mg_l2proto, struct mg_l2addr *, struct mg_l2addr *, uint8_t *);\nextern size_t mg_l2_ppp_footer(size_t, uint8_t *);\nextern bool mg_l2_ppp_rx(struct mg_tcpip_if *, enum mg_l2proto *, struct mg_str *, struct mg_str *);\nextern struct mg_l2addr *mg_l2_ppp_getaddr(uint8_t *);\nextern struct mg_l2addr *mg_l2_ppp_mapip(enum mg_l2addrtype, struct mg_addr *);\n#if MG_ENABLE_IPV6\nextern bool mg_l2_ppp_genip6(uint64_t *, uint8_t, struct mg_l2addr *);\nextern bool mg_l2_ppp_ip6get(struct mg_l2addr *, uint8_t *, uint8_t);\nextern uint8_t mg_l2_ppp_ip6put(struct mg_l2addr *, uint8_t *);\n#endif\n\ntypedef void (*l2_init_fn)(struct mg_l2addr *, uint16_t *, uint16_t *);\ntypedef uint8_t *((*l2_header_fn)(enum mg_l2proto, struct mg_l2addr *, struct mg_l2addr *, uint8_t *));\ntypedef size_t (*l2_footer_fn)(size_t, uint8_t *);\ntypedef bool (*l2_rx_fn)(struct mg_tcpip_if *, enum mg_l2proto *, struct mg_str *, struct mg_str *);\ntypedef struct mg_l2addr (*(*l2_getaddr_fn)(uint8_t *));\ntypedef struct mg_l2addr (*(*l2_mapip_fn)(enum mg_l2addrtype, struct mg_addr *));\n#if MG_ENABLE_IPV6\ntypedef bool (*l2_genip6_fn)(uint64_t *, uint8_t, struct mg_l2addr *);\ntypedef bool (*l2_ip6get_fn)(struct mg_l2addr *, uint8_t *, uint8_t);\ntypedef uint8_t (*l2_ip6put_fn)(struct mg_l2addr *, uint8_t *);\n#endif\n// clang-format on\n\nstatic const l2_init_fn l2_init[] = {mg_l2_eth_init, mg_l2_ppp_init};\nstatic const l2_header_fn l2_header[] = {mg_l2_eth_header, mg_l2_ppp_header};\nstatic const l2_footer_fn l2_footer[] = {mg_l2_eth_footer, mg_l2_ppp_footer};\nstatic const l2_rx_fn l2_rx[] = {mg_l2_eth_rx, mg_l2_ppp_rx};\nstatic const l2_getaddr_fn l2_getaddr[] = {mg_l2_eth_getaddr,\n                                           mg_l2_ppp_getaddr};\nstatic const l2_mapip_fn l2_mapip[] = {mg_l2_eth_mapip, mg_l2_ppp_mapip};\n#if MG_ENABLE_IPV6\nstatic const l2_genip6_fn l2_genip6[] = {mg_l2_eth_genip6, mg_l2_ppp_genip6};\nstatic const l2_ip6get_fn l2_ip6get[] = {mg_l2_eth_ip6get, mg_l2_ppp_ip6get};\nstatic const l2_ip6put_fn l2_ip6put[] = {mg_l2_eth_ip6put, mg_l2_ppp_ip6put};\n#endif\n\nvoid mg_l2_init(enum mg_l2type type, uint8_t *addr, uint16_t *mtu,\n                uint16_t *framesize) {\n  l2_init[type]((struct mg_l2addr *) addr, mtu, framesize);\n}\n\nuint8_t *mg_l2_header(enum mg_l2type type, enum mg_l2proto proto, uint8_t *src,\n                      uint8_t *dst, uint8_t *frame) {\n  return l2_header[type](proto, (struct mg_l2addr *) src,\n                         (struct mg_l2addr *) dst, frame);\n}\n\nsize_t mg_l2_footer(enum mg_l2type type, size_t len, uint8_t *frame) {\n  return l2_footer[type](len, frame);\n}\n\nbool mg_l2_rx(struct mg_tcpip_if *ifp, enum mg_l2proto *proto,\n              struct mg_str *pay, struct mg_str *raw) {\n  return l2_rx[ifp->l2type](ifp, proto, pay, raw);\n}\n\nuint8_t *mg_l2_getaddr(enum mg_l2type type, uint8_t *frame) {\n  return (uint8_t *) l2_getaddr[type](frame);\n}\n\nstruct mg_l2addr s_mapip;\n\nuint8_t *mg_l2_mapip(enum mg_l2type type, enum mg_l2addrtype addrtype,\n                     struct mg_addr *ip) {\n  return (uint8_t *) l2_mapip[type](addrtype, ip);\n}\n\n#if MG_ENABLE_IPV6\nbool mg_l2_genip6(enum mg_l2type type, uint64_t *ip6, uint8_t prefix_len,\n                  uint8_t *addr) {\n  return l2_genip6[type](ip6, prefix_len, (struct mg_l2addr *) addr);\n}\n\nbool mg_l2_ip6get(enum mg_l2type type, uint8_t *addr, uint8_t *opts,\n                  uint8_t len) {\n  return l2_ip6get[type]((struct mg_l2addr *) addr, opts, len);\n}\nuint8_t mg_l2_ip6put(enum mg_l2type type, uint8_t *addr, uint8_t *opts) {\n  return l2_ip6put[type]((struct mg_l2addr *) addr, opts);\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/l2.h",
    "content": "#pragma once\n\n#include \"arch.h\"\n#include \"config.h\"\n\n#if MG_ENABLE_TCPIP\n\n// no config defaults to 0 => Ethernet\nenum mg_l2type { MG_TCPIP_L2_ETH = 0, MG_TCPIP_L2_PPP };  // MG_TCPIP_L2_PPPoE\n\n#if defined(__DCC__)\n#pragma pack(1)\n#else\n#pragma pack(push, 1)\n#endif\n\nstruct mg_l2addr {\n  union {\n    uint8_t mac[6];\n  } addr;\n};\n\n#if defined(__DCC__)\n#pragma pack(0)\n#else\n#pragma pack(pop)\n#endif\n\n#if 0\nTODO(): ?\nstruct eth_opts {\n  bool enable_crc32_check;         // Do a CRC check on RX frames and strip it\n  bool enable_mac_check;           // Do a MAC check on RX frames\n};\nstruct mg_l2opts {\n  union {\n    struct eth_opts eth;\n  };\n};\n#endif\n\nenum mg_l2proto {\n  MG_TCPIP_L2PROTO_IPV4 = 0,\n  MG_TCPIP_L2PROTO_IPV6,\n  MG_TCPIP_L2PROTO_ARP,\n  MG_TCPIP_L2PROTO_PPPoE_DISC,\n  MG_TCPIP_L2PROTO_PPPoE_SESS\n};\nenum mg_l2addrtype {\n  MG_TCPIP_L2ADDR_BCAST,\n  MG_TCPIP_L2ADDR_MCAST,\n  MG_TCPIP_L2ADDR_MCAST6\n};\n\n#endif\n"
  },
  {
    "path": "src/l2_eth.c",
    "content": "#include \"l2.h\"\n#include \"log.h\"\n#include \"net.h\"\n#include \"net_builtin.h\"\n#include \"printf.h\"\n#include \"util.h\"\n\n#if MG_ENABLE_TCPIP\n\n#if defined(__DCC__)\n#pragma pack(1)\n#else\n#pragma pack(push, 1)\n#endif\n\nstruct eth {\n  uint8_t dst[6];  // Destination MAC address\n  uint8_t src[6];  // Source MAC address\n  uint16_t type;   // Ethernet type\n};\n\n#if defined(__DCC__)\n#pragma pack(0)\n#else\n#pragma pack(pop)\n#endif\n\nstatic const uint16_t eth_types[] = {\n    // order is vital, see l2.h\n    0x800,   // IPv4\n    0x86dd,  // IPv6\n    0x806,   // ARP\n    0x8863,  // PPPoE Discovery Stage\n    0x8864   // PPPoE Session Stage\n};\n\nvoid mg_l2_eth_init(struct mg_l2addr *l2addr, uint16_t *mtu,\n                    uint16_t *framesize) {\n  // If MAC is not set, make a random one\n  if (l2addr->addr.mac[0] == 0 && l2addr->addr.mac[1] == 0 &&\n      l2addr->addr.mac[2] == 0 && l2addr->addr.mac[3] == 0 &&\n      l2addr->addr.mac[4] == 0 && l2addr->addr.mac[5] == 0) {\n    l2addr->addr.mac[0] = 0x02;  // Locally administered, unicast\n    mg_random(&l2addr->addr.mac[1], sizeof(l2addr->addr.mac) - 1);\n    MG_INFO(\n        (\"MAC not set. Generated random: %M\", mg_print_mac, l2addr->addr.mac));\n  }\n  *mtu = 1500;\n  *framesize = 1540;\n}\n\nuint8_t *mg_l2_eth_header(enum mg_l2proto proto, struct mg_l2addr *src,\n                          struct mg_l2addr *dst, uint8_t *frame) {\n  struct eth *eth = (struct eth *) frame;\n  eth->type = mg_htons(eth_types[(unsigned int) proto]);\n  memcpy(eth->src, src->addr.mac, sizeof(eth->dst));\n  memcpy(eth->dst, dst->addr.mac, sizeof(eth->dst));\n  return (uint8_t *) (eth + 1);\n}\n\nsize_t mg_l2_eth_footer(size_t len, uint8_t *frame) {\n  struct eth *eth = (struct eth *) frame;\n  // nothing to do; there is no len field in Ethernet, CRC is hw-calculated\n  return len + sizeof(*eth);\n}\n\nstruct mg_l2addr *mg_l2_eth_mapip(enum mg_l2addrtype addrtype,\n                                  struct mg_addr *addr);\n\nbool mg_l2_eth_rx(struct mg_tcpip_if *ifp, enum mg_l2proto *proto,\n                  struct mg_str *pay, struct mg_str *raw) {\n  struct eth *eth = (struct eth *) raw->buf;\n  uint16_t type, len;\n  unsigned int i;\n  if (raw->len < sizeof(*eth)) return false;  // Truncated - runt?\n  len = (uint16_t) raw->len;\n  if (ifp->enable_mac_check &&\n      memcmp(eth->dst, ifp->mac, sizeof(eth->dst)) != 0 &&\n      memcmp(eth->dst, mg_l2_eth_mapip(MG_TCPIP_L2ADDR_BCAST, NULL),\n             sizeof(eth->dst)) != 0)\n    return false;  // TODO(): add multicast addresses\n  if (ifp->enable_crc32_check && len > sizeof(*eth) + 4) {\n    uint32_t crc;\n    len -= 4;  // TODO(scaprile): check on bigendian\n    crc = mg_crc32(0, (const char *) raw->buf, len);\n    if (memcmp((void *) ((size_t) raw->buf + len), &crc, sizeof(crc)))\n      return false;\n  }\n  pay->buf = (char *) (eth + 1);\n  pay->len = len - sizeof(*eth);\n\n  type = mg_htons(eth->type);\n  for (i = 0; i < sizeof(eth_types) / sizeof(uint16_t); i++) {\n    if (type == eth_types[i]) break;\n  }\n  if (i == sizeof(eth_types)) {\n    MG_DEBUG((\"Unknown eth type %x\", type));\n    if (mg_log_level >= MG_LL_VERBOSE)\n      mg_hexdump(raw->buf, raw->len >= 32 ? 32 : raw->len);\n    return false;\n  }\n  *proto = (enum mg_l2proto) i;\n  return true;\n}\n\nstruct mg_l2addr *mg_l2_eth_getaddr(uint8_t *frame) {\n  struct eth *eth = (struct eth *) frame;\n  return (struct mg_l2addr *) &eth->src;\n}\n\nextern struct mg_l2addr s_mapip;\n\nstruct mg_l2addr *mg_l2_eth_mapip(enum mg_l2addrtype addrtype,\n                                  struct mg_addr *addr) {\n  switch (addrtype) {\n    case MG_TCPIP_L2ADDR_BCAST:\n      memset(s_mapip.addr.mac, 0xff, sizeof(s_mapip.addr.mac));\n      break;\n    case MG_TCPIP_L2ADDR_MCAST: {\n      uint8_t *ip = (uint8_t *) &addr->addr.ip4;\n      // IP multicast group MAC, RFC-1112 6.4\n      s_mapip.addr.mac[0] = 0x01, s_mapip.addr.mac[1] = 0x00,\n      s_mapip.addr.mac[2] = 0x5E;\n      s_mapip.addr.mac[3] = ip[1] & 0x7F;  // 23 LSb\n      s_mapip.addr.mac[4] = ip[2];\n      s_mapip.addr.mac[5] = ip[3];\n      break;\n    }\n    case MG_TCPIP_L2ADDR_MCAST6: {\n      // IPv6 multicast address mapping, RFC-2464 7\n      uint8_t *ip = (uint8_t *) &addr->addr.ip6;\n      s_mapip.addr.mac[0] = 0x33, s_mapip.addr.mac[1] = 0x33;\n      s_mapip.addr.mac[2] = ip[12], s_mapip.addr.mac[3] = ip[13],\n      s_mapip.addr.mac[4] = ip[14], s_mapip.addr.mac[5] = ip[15];\n      break;\n    }\n  }\n  return &s_mapip;\n}\n\n#if MG_ENABLE_IPV6\nstatic void meui64(uint8_t *addr, uint8_t *mac) {\n  *addr++ = *mac++ ^ (uint8_t) 0x02, *addr++ = *mac++, *addr++ = *mac++;\n  *addr++ = 0xff, *addr++ = 0xfe;\n  *addr++ = *mac++, *addr++ = *mac++, *addr = *mac;\n}\n\nbool mg_l2_eth_genip6(uint64_t *ip6, uint8_t prefix_len,\n                      struct mg_l2addr *l2addr) {\n  if (prefix_len > 64) {\n    MG_ERROR((\"Prefix length > 64, UNSUPPORTED\"));\n    return false;\n  }\n  ip6[0] = 0;\n  meui64(((uint8_t *) &ip6[1]), l2addr->addr.mac);  // RFC-4291 2.5.4, 2.5.1\n  return true;\n}\n\nbool mg_l2_eth_ip6get(struct mg_l2addr *l2addr, uint8_t *opts, uint8_t len) {\n  if (len != 1) return false;\n  memcpy(l2addr->addr.mac, opts, 6);\n  return true;\n}\n\nuint8_t mg_l2_eth_ip6put(struct mg_l2addr *l2addr, uint8_t *opts) {\n  memcpy(opts, l2addr->addr.mac, 6);\n  return 1;\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/l2_ppp.c",
    "content": "#include \"l2.h\"\n#include \"log.h\"\n#include \"net.h\"\n#include \"net_builtin.h\"\n#include \"printf.h\"\n#include \"util.h\"\n\n#if MG_ENABLE_TCPIP\n\n#if defined(__DCC__)\n#pragma pack(1)\n#else\n#pragma pack(push, 1)\n#endif\n\nstruct ppp {  // RFC-1662\n  uint8_t addr, ctrl;\n  uint16_t proto;\n};\n\nstruct lcp {  // RFC-1661\n  uint8_t code, id, len[2];\n};\n\nstruct ipcp { // RFC-1332\n  uint8_t code;\n};\n\nstruct ipv6cp { // RFC-5072\n  uint8_t code;\n};\n\n#if defined(__DCC__)\n#pragma pack(0)\n#else\n#pragma pack(pop)\n#endif\n\n\nvoid mg_l2_ppp_init(struct mg_l2addr *addr, uint16_t *mtu,\n                    uint16_t *framesize) {\n  (void) addr;\n  *mtu = 1500;        // 1492 for PPPoE\n  *framesize = 1540;  // *** TODO(scaprile): actual value, check for PPPoE too\n}\n\nuint8_t *mg_l2_ppp_header(enum mg_l2proto proto, struct mg_l2addr *src,\n                          struct mg_l2addr *dst, uint8_t *frame) {\n  (void) src;\n  (void) dst;\n  (void) proto;\n  return frame;\n}\n\nsize_t mg_l2_ppp_footer(size_t len, uint8_t *frame) {\n  (void) frame;\n  return len;\n}\n\nbool mg_l2_ppp_rx(struct mg_tcpip_if *ifp, enum mg_l2proto *proto,\n                  struct mg_str *pay, struct mg_str *raw) {\n#if 0\nif (ppp->addr == MG_PPP_ADDR && ppp->ctrl == MG_PPP_CTRL) {\n  code = ntohs(ppp->proto);\n  payload = (uint8_t *) (ppp + 1);\n} else { // Address-and-Control-Field-Compressed PPP header\n  uint16_t *cppp = (uint16_t *) ppp;\n  code = ntohs(*cppp);\n  payload = (uint8_t *) (cppp + 1);\n}\n#endif\n  *pay = *raw;\n  *proto = MG_TCPIP_L2PROTO_IPV4;\n  (void) ifp;\n  return true;\n}\n\nstruct mg_l2addr *mg_l2_ppp_getaddr(uint8_t *frame) {\n  (void) frame;\n  return &s_mapip;  // bogus\n}\n\nextern struct mg_l2addr s_mapip;\n\nstruct mg_l2addr *mg_l2_ppp_mapip(enum mg_l2addrtype addrtype,\n                                  struct mg_addr *addr) {\n  (void) addrtype;\n  (void) addr;\n  return &s_mapip;  // bogus\n}\n\n#if MG_ENABLE_IPV6\nbool mg_l2_ppp_genip6(uint64_t *ip6, uint8_t prefix_len,\n                      struct mg_l2addr *addr) {\n  (void) ip6;\n  (void) prefix_len;\n  (void) addr;\n  return false;\n}\n\nbool mg_l2_ppp_ip6get(struct mg_l2addr *addr, uint8_t *opts, uint8_t len) {\n  (void) addr;\n  (void) opts;\n  (void) len;\n  return false;\n}\n\nuint8_t mg_l2_ppp_ip6put(struct mg_l2addr *addr, uint8_t *opts) {\n  (void) addr;\n  (void) opts;\n  return 0;\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "src/license.h",
    "content": "// Copyright (c) 2004-2013 Sergey Lyubka\n// Copyright (c) 2013-2025 Cesanta Software Limited\n// All rights reserved\n//\n// This software is dual-licensed: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License version 2 as\n// published by the Free Software Foundation. For the terms of this\n// license, see http://www.gnu.org/licenses/\n//\n// You are free to use this software under the terms of the GNU General\n// Public License, but WITHOUT ANY WARRANTY; without even the implied\n// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n// See the GNU General Public License for more details.\n//\n// Alternatively, you can license this software under a commercial\n// license, as set out in https://www.mongoose.ws/licensing/\n//\n// SPDX-License-Identifier: GPL-2.0-only or commercial\n"
  },
  {
    "path": "src/log.c",
    "content": "#include \"log.h\"\n#include \"printf.h\"\n#include \"str.h\"\n#include \"util.h\"\n\nint mg_log_level = MG_LL_DEBUG;\nstatic mg_pfn_t s_log_func = mg_pfn_stdout;\nstatic void *s_log_func_param = NULL;\n\nvoid mg_log_set_fn(mg_pfn_t fn, void *param) {\n  s_log_func = fn;\n  s_log_func_param = param;\n}\n\nstatic void logc(unsigned char c) {\n  s_log_func((char) c, s_log_func_param);\n}\n\nstatic void logs(const char *buf, size_t len) {\n  size_t i;\n  for (i = 0; i < len; i++) logc(((unsigned char *) buf)[i]);\n}\n\n#if MG_ENABLE_CUSTOM_LOG\n// Let user define their own mg_log_prefix() and mg_log()\n#else\nvoid mg_log_prefix(int level, const char *file, int line, const char *fname) {\n  const char *p = strrchr(file, '/');\n  char buf[41];\n  size_t n;\n  if (p == NULL) p = strrchr(file, '\\\\');\n  n = mg_snprintf(buf, sizeof(buf), \"%-6llx %d %s:%d:%s\", mg_millis(), level,\n                  p == NULL ? file : p + 1, line, fname);\n  if (n > sizeof(buf) - 2) n = sizeof(buf) - 2;\n  while (n < sizeof(buf)) buf[n++] = ' ';\n  logs(buf, n - 1);\n}\n\nvoid mg_log(const char *fmt, ...) {\n  va_list ap;\n  va_start(ap, fmt);\n  mg_vxprintf(s_log_func, s_log_func_param, fmt, &ap);\n  va_end(ap);\n  logs(\"\\r\\n\", 2);\n}\n#endif\n\nstatic unsigned char nibble(unsigned c) {\n  return (unsigned char) (c < 10 ? c + '0' : c + 'W');\n}\n\n#define ISPRINT(x) ((x) >= ' ' && (x) <= '~')\nvoid mg_hexdump(const void *buf, size_t len) {\n  const unsigned char *p = (const unsigned char *) buf;\n  unsigned char ascii[16], alen = 0;\n  size_t i;\n  for (i = 0; i < len; i++) {\n    if ((i % 16) == 0) {\n      // Print buffered ascii chars\n      if (i > 0)\n        logs(\"  \", 2), logs((char *) ascii, 16), logs(\"\\r\\n\", 2), alen = 0;\n      // Print hex address, then \\t\n      logc(nibble((i >> 12) & 15)), logc(nibble((i >> 8) & 15)),\n          logc(nibble((i >> 4) & 15)), logc('0'), logs(\"   \", 3);\n    }\n    logc(nibble(p[i] >> 4)), logc(nibble(p[i] & 15));  // Two nibbles, e.g. c5\n    logc(' ');                                         // Space after hex number\n    ascii[alen++] = ISPRINT(p[i]) ? p[i] : '.';        // Add to the ascii buf\n  }\n  while (alen < 16) logs(\"   \", 3), ascii[alen++] = ' ';\n  logs(\"  \", 2), logs((char *) ascii, 16), logs(\"\\r\\n\", 2);\n}\n"
  },
  {
    "path": "src/log.h",
    "content": "#pragma once\n\n#include \"arch.h\"\n#include \"config.h\"\n#include \"fmt.h\"\n\nenum { MG_LL_NONE, MG_LL_ERROR, MG_LL_INFO, MG_LL_DEBUG, MG_LL_VERBOSE };\nextern int mg_log_level;  // Current log level, one of MG_LL_*\n\nvoid mg_log(const char *fmt, ...);\nvoid mg_log_prefix(int ll, const char *file, int line, const char *fname);\n// bool mg_log2(int ll, const char *file, int line, const char *fmt, ...);\nvoid mg_hexdump(const void *buf, size_t len);\nvoid mg_log_set_fn(mg_pfn_t fn, void *param);\n\n#define mg_log_set(level_) mg_log_level = (level_)\n\n#if MG_ENABLE_LOG\n#if !defined(_MSC_VER) && \\\n    (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L)\n#define MG___FUNC__ \"\"\n#else\n#define MG___FUNC__ __func__  // introduced in C99\n#endif\n#define MG_LOG(level, args)                                    \\\n  do {                                                         \\\n    if ((level) <= mg_log_level) {                             \\\n      mg_log_prefix((level), __FILE__, __LINE__, MG___FUNC__); \\\n      mg_log args;                                             \\\n    }                                                          \\\n  } while (0)\n#else\n#define MG_LOG(level, args) \\\n  do {                      \\\n    if (0) mg_log args;     \\\n  } while (0)\n#endif\n\n#define MG_ERROR(args) MG_LOG(MG_LL_ERROR, args)\n#define MG_INFO(args) MG_LOG(MG_LL_INFO, args)\n#define MG_DEBUG(args) MG_LOG(MG_LL_DEBUG, args)\n#define MG_VERBOSE(args) MG_LOG(MG_LL_VERBOSE, args)\n"
  },
  {
    "path": "src/md5.c",
    "content": "#include \"arch.h\"\n#include \"md5.h\"\n\n//  This code implements the MD5 message-digest algorithm.\n//  The algorithm is due to Ron Rivest.  This code was\n//  written by Colin Plumb in 1993, no copyright is claimed.\n//  This code is in the public domain; do with it what you wish.\n//\n//  Equivalent code is available from RSA Data Security, Inc.\n//  This code has been tested against that, and is equivalent,\n//  except that you don't need to include two pages of legalese\n//  with every copy.\n//\n//  To compute the message digest of a chunk of bytes, declare an\n//  MD5Context structure, pass it to MD5Init, call MD5Update as\n//  needed on buffers full of bytes, and then call MD5Final, which\n//  will fill a supplied 16-byte array with the digest.\n\n#if defined(MG_ENABLE_MD5) && MG_ENABLE_MD5\n\nstatic void mg_byte_reverse(unsigned char *buf, unsigned longs) {\n  if (MG_BIG_ENDIAN) {\n    do {\n      uint32_t t = (uint32_t) ((unsigned) buf[3] << 8 | buf[2]) << 16 |\n                   ((unsigned) buf[1] << 8 | buf[0]);\n      *(uint32_t *) buf = t;\n      buf += 4;\n    } while (--longs);\n  } else {\n    (void) buf, (void) longs;  // Little endian. Do nothing\n  }\n}\n\n#define F1(x, y, z) (z ^ (x & (y ^ z)))\n#define F2(x, y, z) F1(z, x, y)\n#define F3(x, y, z) (x ^ y ^ z)\n#define F4(x, y, z) (y ^ (x | ~z))\n\n#define MD5STEP(f, w, x, y, z, data, s) \\\n  (w += f(x, y, z) + data, w = w << s | w >> (32 - s), w += x)\n\n/*\n * Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious\n * initialization constants.\n */\nvoid mg_md5_init(mg_md5_ctx *ctx) {\n  ctx->buf[0] = 0x67452301;\n  ctx->buf[1] = 0xefcdab89;\n  ctx->buf[2] = 0x98badcfe;\n  ctx->buf[3] = 0x10325476;\n\n  ctx->bits[0] = 0;\n  ctx->bits[1] = 0;\n}\n\nstatic void mg_md5_transform(uint32_t buf[4], uint32_t const in[16]) {\n  uint32_t a, b, c, d;\n\n  a = buf[0];\n  b = buf[1];\n  c = buf[2];\n  d = buf[3];\n\n  MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);\n  MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);\n  MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);\n  MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);\n  MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);\n  MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);\n  MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);\n  MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);\n  MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);\n  MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);\n  MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);\n  MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);\n  MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);\n  MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);\n  MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);\n  MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);\n\n  MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);\n  MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);\n  MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);\n  MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);\n  MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);\n  MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);\n  MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);\n  MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);\n  MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);\n  MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);\n  MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);\n  MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);\n  MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);\n  MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);\n  MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);\n  MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);\n\n  MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);\n  MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);\n  MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);\n  MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);\n  MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);\n  MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);\n  MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);\n  MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);\n  MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);\n  MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);\n  MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);\n  MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);\n  MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);\n  MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);\n  MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);\n  MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);\n\n  MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);\n  MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);\n  MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);\n  MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);\n  MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);\n  MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);\n  MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);\n  MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);\n  MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);\n  MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);\n  MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);\n  MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);\n  MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);\n  MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);\n  MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);\n  MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);\n\n  buf[0] += a;\n  buf[1] += b;\n  buf[2] += c;\n  buf[3] += d;\n}\n\nvoid mg_md5_update(mg_md5_ctx *ctx, const unsigned char *buf, size_t len) {\n  uint32_t t;\n\n  t = ctx->bits[0];\n  if ((ctx->bits[0] = t + ((uint32_t) len << 3)) < t) ctx->bits[1]++;\n  ctx->bits[1] += (uint32_t) len >> 29;\n\n  t = (t >> 3) & 0x3f;\n\n  if (t) {\n    unsigned char *p = (unsigned char *) ctx->in + t;\n\n    t = 64 - t;\n    if (len < t) {\n      memcpy(p, buf, len);\n      return;\n    }\n    memcpy(p, buf, t);\n    mg_byte_reverse(ctx->in, 16);\n    mg_md5_transform(ctx->buf, (uint32_t *) ctx->in);\n    buf += t;\n    len -= t;\n  }\n\n  while (len >= 64) {\n    memcpy(ctx->in, buf, 64);\n    mg_byte_reverse(ctx->in, 16);\n    mg_md5_transform(ctx->buf, (uint32_t *) ctx->in);\n    buf += 64;\n    len -= 64;\n  }\n\n  memcpy(ctx->in, buf, len);\n}\n\nvoid mg_md5_final(mg_md5_ctx *ctx, unsigned char digest[16]) {\n  unsigned count;\n  unsigned char *p;\n  uint32_t *a;\n\n  count = (ctx->bits[0] >> 3) & 0x3F;\n\n  p = ctx->in + count;\n  *p++ = 0x80;\n  count = 64 - 1 - count;\n  if (count < 8) {\n    memset(p, 0, count);\n    mg_byte_reverse(ctx->in, 16);\n    mg_md5_transform(ctx->buf, (uint32_t *) ctx->in);\n    memset(ctx->in, 0, 56);\n  } else {\n    memset(p, 0, count - 8);\n  }\n  mg_byte_reverse(ctx->in, 14);\n\n  a = (uint32_t *) ctx->in;\n  a[14] = ctx->bits[0];\n  a[15] = ctx->bits[1];\n\n  mg_md5_transform(ctx->buf, (uint32_t *) ctx->in);\n  mg_byte_reverse((unsigned char *) ctx->buf, 4);\n  memcpy(digest, ctx->buf, 16);\n  memset((char *) ctx, 0, sizeof(*ctx));\n}\n#endif\n"
  },
  {
    "path": "src/md5.h",
    "content": "#pragma once\n\n#include \"arch.h\"\n\ntypedef struct {\n  uint32_t buf[4];\n  uint32_t bits[2];\n  unsigned char in[64];\n} mg_md5_ctx;\n\nvoid mg_md5_init(mg_md5_ctx *c);\nvoid mg_md5_update(mg_md5_ctx *c, const unsigned char *data, size_t len);\nvoid mg_md5_final(mg_md5_ctx *c, unsigned char[16]);\n"
  },
  {
    "path": "src/mqtt.c",
    "content": "#include \"arch.h\"\n#include \"base64.h\"\n#include \"event.h\"\n#include \"log.h\"\n#include \"mqtt.h\"\n#include \"url.h\"\n#include \"util.h\"\n\n#define MQTT_CLEAN_SESSION 0x02\n#define MQTT_HAS_WILL 0x04\n#define MQTT_WILL_RETAIN 0x20\n#define MQTT_HAS_PASSWORD 0x40\n#define MQTT_HAS_USER_NAME 0x80\n\nstruct mg_mqtt_pmap {\n  uint8_t id;\n  uint8_t type;\n};\n\nstatic const struct mg_mqtt_pmap s_prop_map[] = {\n    {MQTT_PROP_PAYLOAD_FORMAT_INDICATOR, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_MESSAGE_EXPIRY_INTERVAL, MQTT_PROP_TYPE_INT},\n    {MQTT_PROP_CONTENT_TYPE, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_RESPONSE_TOPIC, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_CORRELATION_DATA, MQTT_PROP_TYPE_BINARY_DATA},\n    {MQTT_PROP_SUBSCRIPTION_IDENTIFIER, MQTT_PROP_TYPE_VARIABLE_INT},\n    {MQTT_PROP_SESSION_EXPIRY_INTERVAL, MQTT_PROP_TYPE_INT},\n    {MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_SERVER_KEEP_ALIVE, MQTT_PROP_TYPE_SHORT},\n    {MQTT_PROP_AUTHENTICATION_METHOD, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_AUTHENTICATION_DATA, MQTT_PROP_TYPE_BINARY_DATA},\n    {MQTT_PROP_REQUEST_PROBLEM_INFORMATION, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_WILL_DELAY_INTERVAL, MQTT_PROP_TYPE_INT},\n    {MQTT_PROP_REQUEST_RESPONSE_INFORMATION, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_RESPONSE_INFORMATION, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_SERVER_REFERENCE, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_REASON_STRING, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_RECEIVE_MAXIMUM, MQTT_PROP_TYPE_SHORT},\n    {MQTT_PROP_TOPIC_ALIAS_MAXIMUM, MQTT_PROP_TYPE_SHORT},\n    {MQTT_PROP_TOPIC_ALIAS, MQTT_PROP_TYPE_SHORT},\n    {MQTT_PROP_MAXIMUM_QOS, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_RETAIN_AVAILABLE, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_USER_PROPERTY, MQTT_PROP_TYPE_STRING_PAIR},\n    {MQTT_PROP_MAXIMUM_PACKET_SIZE, MQTT_PROP_TYPE_INT},\n    {MQTT_PROP_WILDCARD_SUBSCRIPTION_AVAILABLE, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_SUBSCRIPTION_IDENTIFIER_AVAILABLE, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_SHARED_SUBSCRIPTION_AVAILABLE, MQTT_PROP_TYPE_BYTE}};\n\nstatic bool mqtt_send_header(struct mg_connection *c, uint8_t cmd,\n                             uint8_t flags, uint32_t len) {\n  uint8_t buf[1 + sizeof(len)], *vlen = &buf[1];\n  buf[0] = (uint8_t) ((cmd << 4) | flags);\n  do {\n    *vlen = len % 0x80;\n    len /= 0x80;\n    if (len > 0) *vlen |= 0x80;\n    vlen++;\n  } while (len > 0 && vlen < &buf[sizeof(buf)]);\n  return mg_send(c, buf, (size_t) (vlen - buf));\n}\n\nvoid mg_mqtt_send_header(struct mg_connection *c, uint8_t cmd, uint8_t flags,\n                         uint32_t len) {\n  if (!mqtt_send_header(c, cmd, flags, len)) mg_error(c, \"OOM\");\n}\n\nstatic bool mg_send_u16(struct mg_connection *c, uint16_t value) {\n  return mg_send(c, &value, sizeof(value));\n}\n\nstatic bool mg_send_u32(struct mg_connection *c, uint32_t value) {\n  return mg_send(c, &value, sizeof(value));\n}\n\nstatic uint8_t varint_size(size_t length) {\n  uint8_t bytes_needed = 0;\n  do {\n    bytes_needed++;\n    length /= 0x80;\n  } while (length > 0);\n  return bytes_needed;\n}\n\nstatic size_t encode_varint(uint8_t *buf, size_t value) {\n  size_t len = 0;\n\n  do {\n    uint8_t b = (uint8_t) (value % 128);\n    value /= 128;\n    if (value > 0) b |= 0x80;\n    buf[len++] = b;\n  } while (value > 0);\n\n  return len;\n}\n\nstatic size_t decode_varint(const uint8_t *buf, size_t len, size_t *value) {\n  size_t multiplier = 1, offset;\n  *value = 0;\n\n  for (offset = 0; offset < 4 && offset < len; offset++) {\n    uint8_t encoded_byte = buf[offset];\n    *value += (encoded_byte & 0x7f) * multiplier;\n    multiplier *= 128;\n\n    if ((encoded_byte & 0x80) == 0) return offset + 1;\n  }\n\n  return 0;\n}\n\nstatic int mqtt_prop_type_by_id(uint8_t prop_id) {\n  size_t i, num_properties = sizeof(s_prop_map) / sizeof(s_prop_map[0]);\n  for (i = 0; i < num_properties; ++i) {\n    if (s_prop_map[i].id == prop_id) return s_prop_map[i].type;\n  }\n  return -1;  // Property ID not found\n}\n\n// Returns the size of the properties section, without the\n// size of the content's length\nstatic size_t get_properties_length(struct mg_mqtt_prop *props, size_t count) {\n  size_t i, size = 0;\n  for (i = 0; i < count; i++) {\n    size++;  // identifier\n    switch (mqtt_prop_type_by_id(props[i].id)) {\n      case MQTT_PROP_TYPE_STRING_PAIR:\n        size += (uint32_t) (props[i].val.len + props[i].key.len +\n                            2 * sizeof(uint16_t));\n        break;\n      case MQTT_PROP_TYPE_STRING:\n        size += (uint32_t) (props[i].val.len + sizeof(uint16_t));\n        break;\n      case MQTT_PROP_TYPE_BINARY_DATA:\n        size += (uint32_t) (props[i].val.len + sizeof(uint16_t));\n        break;\n      case MQTT_PROP_TYPE_VARIABLE_INT:\n        size += varint_size((uint32_t) props[i].iv);\n        break;\n      case MQTT_PROP_TYPE_INT: size += (uint32_t) sizeof(uint32_t); break;\n      case MQTT_PROP_TYPE_SHORT: size += (uint32_t) sizeof(uint16_t); break;\n      case MQTT_PROP_TYPE_BYTE: size += (uint32_t) sizeof(uint8_t); break;\n      default: return size;  // cannot parse further down\n    }\n  }\n\n  return size;\n}\n\n// returns the entire size of the properties section, including the\n// size of the variable length of the content\nstatic size_t get_props_size(struct mg_mqtt_prop *props, size_t count) {\n  size_t size = get_properties_length(props, count);\n  size += varint_size(size);\n  return size;\n}\n\nstatic bool mg_send_mqtt_properties(struct mg_connection *c,\n                                    struct mg_mqtt_prop *props, size_t nprops) {\n  size_t total_size = get_properties_length(props, nprops);\n  uint8_t buf_v[4] = {0, 0, 0, 0};\n  uint8_t buf[4] = {0, 0, 0, 0};\n  size_t i, len = encode_varint(buf, total_size);\n\n  if (!mg_send(c, buf, (size_t) len)) return false;\n  for (i = 0; i < nprops; i++) {\n    if (!mg_send(c, &props[i].id, sizeof(props[i].id))) return false;\n    switch (mqtt_prop_type_by_id(props[i].id)) {\n      case MQTT_PROP_TYPE_STRING_PAIR:\n        if (!mg_send_u16(c, mg_htons((uint16_t) props[i].key.len)) ||\n            !mg_send(c, props[i].key.buf, props[i].key.len) ||\n            !mg_send_u16(c, mg_htons((uint16_t) props[i].val.len)) ||\n            !mg_send(c, props[i].val.buf, props[i].val.len))\n          return false;\n        break;\n      case MQTT_PROP_TYPE_BYTE:\n        if (!mg_send(c, &props[i].iv, sizeof(uint8_t))) return false;\n        break;\n      case MQTT_PROP_TYPE_SHORT:\n        if (!mg_send_u16(c, mg_htons((uint16_t) props[i].iv))) return false;\n        break;\n      case MQTT_PROP_TYPE_INT:\n        if (!mg_send_u32(c, mg_htonl((uint32_t) props[i].iv))) return false;\n        break;\n      case MQTT_PROP_TYPE_STRING:\n        if (!mg_send_u16(c, mg_htons((uint16_t) props[i].val.len)) ||\n            !mg_send(c, props[i].val.buf, props[i].val.len))\n          return false;\n        break;\n      case MQTT_PROP_TYPE_BINARY_DATA:\n        if (!mg_send_u16(c, mg_htons((uint16_t) props[i].val.len)) ||\n            !mg_send(c, props[i].val.buf, props[i].val.len))\n          return false;\n        break;\n      case MQTT_PROP_TYPE_VARIABLE_INT:\n        len = encode_varint(buf_v, props[i].iv);\n        if (!mg_send(c, buf_v, (size_t) len)) return false;\n        break;\n    }\n  }\n  return true;\n}\n\nsize_t mg_mqtt_next_prop(struct mg_mqtt_message *msg, struct mg_mqtt_prop *prop,\n                         size_t ofs) {\n  uint8_t *i = (uint8_t *) msg->dgram.buf + msg->props_start + ofs;\n  uint8_t *end = (uint8_t *) msg->dgram.buf + msg->dgram.len;\n  size_t new_pos = ofs, len;\n\n  if (ofs >= msg->dgram.len || ofs >= msg->props_start + msg->props_size || (i + 1) >= end)\n    return 0;\n\n  memset(prop, 0, sizeof(struct mg_mqtt_prop));\n  prop->id = i[0];\n  i++, new_pos++;\n\n  switch (mqtt_prop_type_by_id(prop->id)) {\n    case MQTT_PROP_TYPE_STRING_PAIR:\n      if (i + 2 >= end) return 0;\n      prop->key.len = (uint16_t) ((((uint16_t) i[0]) << 8) | i[1]);\n      prop->key.buf = (char *) i + 2;\n      i += 2 + prop->key.len;\n      if (i + 2 >= end) return 0;\n      prop->val.len = (uint16_t) ((((uint16_t) i[0]) << 8) | i[1]);\n      prop->val.buf = (char *) i + 2;\n      if (i + 2 + prop->val.len >= end) return 0;\n      new_pos += 2 * sizeof(uint16_t) + prop->val.len + prop->key.len;\n      break;\n    case MQTT_PROP_TYPE_BYTE:\n      if (i + 1 >= end) return 0;\n      prop->iv = (uint8_t) i[0];\n      new_pos++;\n      break;\n    case MQTT_PROP_TYPE_SHORT:\n      if (i + 2 >= end) return 0;\n      prop->iv = (uint16_t) ((((uint16_t) i[0]) << 8) | i[1]);\n      new_pos += sizeof(uint16_t);\n      break;\n    case MQTT_PROP_TYPE_INT:\n      if (i + 4 >= end) return 0;\n      prop->iv = ((uint32_t) i[0] << 24) | ((uint32_t) i[1] << 16) |\n                 ((uint32_t) i[2] << 8) | i[3];\n      new_pos += sizeof(uint32_t);\n      break;\n    case MQTT_PROP_TYPE_STRING:\n      if (i + 2 >= end) return 0;\n      prop->val.len = (uint16_t) ((((uint16_t) i[0]) << 8) | i[1]);\n      prop->val.buf = (char *) i + 2;\n      if (i + 2 + prop->val.len >= end) return 0;\n      new_pos += 2 + prop->val.len;\n      break;\n    case MQTT_PROP_TYPE_BINARY_DATA:\n      if (i + 2 >= end) return 0;\n      prop->val.len = (uint16_t) ((((uint16_t) i[0]) << 8) | i[1]);\n      prop->val.buf = (char *) i + 2;\n      if (i + 2 + prop->val.len >= end) return 0;\n      new_pos += 2 + prop->val.len;\n      break;\n    case MQTT_PROP_TYPE_VARIABLE_INT:\n      len = decode_varint(i, (size_t) (end - i), (size_t *) &prop->iv);\n      if (i + len >= end) return 0;\n      new_pos = (len == 0) ? 0 : new_pos + len;\n      break;\n    default:\n      new_pos = 0;\n      break;\n  }\n\n  return new_pos;\n}\n\nvoid mg_mqtt_login(struct mg_connection *c, const struct mg_mqtt_opts *opts) {\n  char client_id[21];\n  struct mg_str cid = opts->client_id;\n  size_t total_len = 7 + 1 + 2 + 2;\n  uint8_t hdr[8] = {0, 4, 'M', 'Q', 'T', 'T', 0, 0};\n  hdr[6] = opts->version;\n\n  if (cid.len == 0) {\n    mg_random_str(client_id, sizeof(client_id) - 1);\n    client_id[sizeof(client_id) - 1] = '\\0';\n    cid = mg_str(client_id);\n  }\n\n  if (hdr[6] == 0) hdr[6] = 4;  // If version is not set, use 4 (3.1.1)\n  c->is_mqtt5 = hdr[6] == 5;    // Set version 5 flag\n  hdr[7] = (uint8_t) ((opts->qos & 3) << 3);  // Connection flags\n  if (opts->user.len > 0) {\n    total_len += 2 + (uint32_t) opts->user.len;\n    hdr[7] |= MQTT_HAS_USER_NAME;\n  }\n  if (opts->pass.len > 0) {\n    total_len += 2 + (uint32_t) opts->pass.len;\n    hdr[7] |= MQTT_HAS_PASSWORD;\n  }\n  if (opts->topic.len > 0) {  // allow zero-length msgs, message.len is size_t\n    total_len += 4 + (uint32_t) opts->topic.len + (uint32_t) opts->message.len;\n    hdr[7] |= MQTT_HAS_WILL;\n  }\n  if (opts->clean || cid.len == 0) hdr[7] |= MQTT_CLEAN_SESSION;\n  if (opts->retain) hdr[7] |= MQTT_WILL_RETAIN;\n  total_len += (uint32_t) cid.len;\n  if (c->is_mqtt5) {\n    total_len += get_props_size(opts->props, opts->num_props);\n    if (hdr[7] & MQTT_HAS_WILL)\n      total_len += get_props_size(opts->will_props, opts->num_will_props);\n  }\n\n  // keepalive == 0 means \"do not disconnect us!\"\n  if (!mqtt_send_header(c, MQTT_CMD_CONNECT, 0, (uint32_t) total_len) ||\n      !mg_send(c, hdr, sizeof(hdr)) ||\n      !mg_send_u16(c, mg_htons((uint16_t) opts->keepalive)))\n    goto fail;\n\n  if (c->is_mqtt5 && !mg_send_mqtt_properties(c, opts->props, opts->num_props))\n    goto fail;\n\n  if (!mg_send_u16(c, mg_htons((uint16_t) cid.len)) ||\n      !mg_send(c, cid.buf, cid.len))\n    goto fail;\n\n  if (hdr[7] & MQTT_HAS_WILL) {\n    if (c->is_mqtt5 &&\n        !mg_send_mqtt_properties(c, opts->will_props, opts->num_will_props))\n      goto fail;\n\n    if (!mg_send_u16(c, mg_htons((uint16_t) opts->topic.len)) ||\n        !mg_send(c, opts->topic.buf, opts->topic.len) ||\n        !mg_send_u16(c, mg_htons((uint16_t) opts->message.len)) ||\n        !mg_send(c, opts->message.buf, opts->message.len))\n      goto fail;\n  }\n  if (opts->user.len > 0 &&\n      (!mg_send_u16(c, mg_htons((uint16_t) opts->user.len)) ||\n       !mg_send(c, opts->user.buf, opts->user.len)))\n    goto fail;\n  if (opts->pass.len > 0 &&\n      (!mg_send_u16(c, mg_htons((uint16_t) opts->pass.len)) ||\n       !mg_send(c, opts->pass.buf, opts->pass.len)))\n    goto fail;\n  return;\nfail:\n  mg_error(c, \"OOM\");\n}\n\nuint16_t mg_mqtt_pub(struct mg_connection *c, const struct mg_mqtt_opts *opts) {\n  uint16_t id = opts->retransmit_id;\n  uint8_t flags = (uint8_t) (((opts->qos & 3) << 1) | (opts->retain ? 1 : 0));\n  size_t len = 2 + opts->topic.len + opts->message.len;\n  MG_DEBUG((\"%lu [%.*s] <- [%.*s%c\", c->id, (int) opts->topic.len,\n            (char *) opts->topic.buf,\n            (int) (opts->message.len <= 10 ? opts->message.len : 10),\n            (char *) opts->message.buf, opts->message.len <= 10 ? ']' : ' '));\n  if (opts->qos > 0) len += 2;\n  if (c->is_mqtt5) len += get_props_size(opts->props, opts->num_props);\n\n  if (opts->qos > 0 && id != 0) flags |= 1 << 3;\n  if (!mqtt_send_header(c, MQTT_CMD_PUBLISH, flags, (uint32_t) len) ||\n      !mg_send_u16(c, mg_htons((uint16_t) opts->topic.len)) ||\n      !mg_send(c, opts->topic.buf, opts->topic.len))\n    goto fail;\n  if (opts->qos > 0) {  // need to send 'id' field\n    if (id == 0) {      // generate new one if not resending\n      if (++c->mgr->mqtt_id == 0) ++c->mgr->mqtt_id;\n      id = c->mgr->mqtt_id;\n    }\n    if (!mg_send_u16(c, mg_htons(id))) goto fail;\n  }\n\n  if (c->is_mqtt5 && !mg_send_mqtt_properties(c, opts->props, opts->num_props))\n    goto fail;\n\n  if (opts->message.len > 0 &&\n      !mg_send(c, opts->message.buf, opts->message.len))\n    goto fail;\n  return id;\n\nfail:\n  mg_error(c, \"OOM\");\n  return id;\n}\n\nstatic void mg_mqtt_sub_unsub(struct mg_connection *c,\n                              const struct mg_mqtt_opts *opts, uint8_t cmd) {\n  uint8_t qos_ = opts->qos & 3;\n  bool is_sub = cmd == MQTT_CMD_SUBSCRIBE;\n  size_t plen = c->is_mqtt5 ? get_props_size(opts->props, opts->num_props) : 0;\n  size_t len = 2 + opts->topic.len + 2 + (is_sub ? 1 : 0) + plen;\n\n  if (!mqtt_send_header(c, cmd, 2, (uint32_t) len)) goto fail;\n  if (++c->mgr->mqtt_id == 0) ++c->mgr->mqtt_id;\n  if (!mg_send_u16(c, mg_htons(c->mgr->mqtt_id))) goto fail;\n\n  if (c->is_mqtt5 && !mg_send_mqtt_properties(c, opts->props, opts->num_props))\n    goto fail;\n\n  if (!mg_send_u16(c, mg_htons((uint16_t) opts->topic.len)) ||\n      !mg_send(c, opts->topic.buf, opts->topic.len))\n    goto fail;\n  if (is_sub && !mg_send(c, &qos_, sizeof(qos_))) goto fail;\n  return;\nfail:\n  mg_error(c, \"OOM\");\n}\n\nvoid mg_mqtt_sub(struct mg_connection *c, const struct mg_mqtt_opts *opts) {\n  mg_mqtt_sub_unsub(c, opts, MQTT_CMD_SUBSCRIBE);\n}\n\nvoid mg_mqtt_unsub(struct mg_connection *c, const struct mg_mqtt_opts *opts) {\n  mg_mqtt_sub_unsub(c, opts, MQTT_CMD_UNSUBSCRIBE);\n}\n\nint mg_mqtt_parse(const uint8_t *buf, size_t len, uint8_t version,\n                  struct mg_mqtt_message *m) {\n  uint8_t lc = 0, *p, *end;\n  uint32_t n = 0, len_len = 0;\n\n  memset(m, 0, sizeof(*m));\n  m->dgram.buf = (char *) buf;\n  if (len < 2) return MQTT_INCOMPLETE;\n  m->cmd = (uint8_t) (buf[0] >> 4);\n  m->qos = (buf[0] >> 1) & 3;\n\n  n = len_len = 0;\n  p = (uint8_t *) buf + 1;\n  while ((size_t) (p - buf) < len) {\n    lc = *((uint8_t *) p++);\n    n += (uint32_t) ((lc & 0x7f) << 7 * len_len);\n    len_len++;\n    if (!(lc & 0x80)) break;\n    if (len_len >= 4) return MQTT_MALFORMED;\n  }\n  end = p + n;\n  if ((lc & 0x80) || (end > buf + len)) return MQTT_INCOMPLETE;\n  m->dgram.len = (size_t) (end - buf);\n\n  switch (m->cmd) {\n    case MQTT_CMD_CONNACK:\n      if (end - p < 2) return MQTT_MALFORMED;\n      m->ack = p[1];\n      break;\n    case MQTT_CMD_PUBACK:\n    case MQTT_CMD_PUBREC:\n    case MQTT_CMD_PUBREL:\n    case MQTT_CMD_PUBCOMP:\n    case MQTT_CMD_SUBSCRIBE:\n    case MQTT_CMD_SUBACK:\n    case MQTT_CMD_UNSUBSCRIBE:\n    case MQTT_CMD_UNSUBACK:\n      if (p + 2 > end) return MQTT_MALFORMED;\n      m->id = (uint16_t) ((((uint16_t) p[0]) << 8) | p[1]);\n      p += 2;\n      break;\n    case MQTT_CMD_PUBLISH: {\n      if (p + 2 > end) return MQTT_MALFORMED;\n      m->topic.len = (uint16_t) ((((uint16_t) p[0]) << 8) | p[1]);\n      m->topic.buf = (char *) p + 2;\n      p += 2 + m->topic.len;\n      if (p > end) return MQTT_MALFORMED;\n      if (m->qos > 0) {\n        if (p + 2 > end) return MQTT_MALFORMED;\n        m->id = (uint16_t) ((((uint16_t) p[0]) << 8) | p[1]);\n        p += 2;\n      }\n      if (p > end) return MQTT_MALFORMED;\n      if (version == 5 && p + 2 < end) {\n        len_len =\n            (uint32_t) decode_varint(p, (size_t) (end - p), &m->props_size);\n        if (!len_len) return MQTT_MALFORMED;\n        m->props_start = (size_t) (p + len_len - buf);\n        p += len_len + m->props_size;\n      }\n      if (p > end) return MQTT_MALFORMED;\n      m->data.buf = (char *) p;\n      m->data.len = (size_t) (end - p);\n      break;\n    }\n    default: break;\n  }\n  return MQTT_OK;\n}\n\nstatic void mqtt_cb(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_READ) {\n    for (;;) {\n      uint8_t version = c->is_mqtt5 ? 5 : 4;\n      struct mg_mqtt_message mm;\n      int rc = mg_mqtt_parse(c->recv.buf, c->recv.len, version, &mm);\n      if (rc == MQTT_MALFORMED) {\n        MG_ERROR((\"%lu MQTT malformed message\", c->id));\n        c->is_closing = 1;\n        break;\n      } else if (rc == MQTT_OK) {\n        MG_VERBOSE((\"%lu MQTT CMD %d len %d [%.*s]\", c->id, mm.cmd,\n                    (int) mm.dgram.len, (int) mm.data.len, mm.data.buf));\n        switch (mm.cmd) {\n          case MQTT_CMD_CONNACK:\n            mg_call(c, MG_EV_MQTT_OPEN, &mm.ack);\n            if (mm.ack == 0) {\n              MG_DEBUG((\"%lu Connected\", c->id));\n            } else {\n              MG_ERROR((\"%lu MQTT auth failed, code %d\", c->id, mm.ack));\n              c->is_closing = 1;\n            }\n            break;\n          case MQTT_CMD_PUBLISH: {\n            MG_DEBUG((\"%lu [%.*s] -> [%.*s%c\", c->id, (int) mm.topic.len,\n                      mm.topic.buf,\n                      (int) (mm.data.len <= 10 ? mm.data.len : 10), mm.data.buf,\n                      mm.data.len <= 10 ? ']' : ' '));\n            if (mm.qos > 0) {\n              uint16_t id = mg_ntohs(mm.id);\n              uint32_t remaining_len = sizeof(id);\n              if (c->is_mqtt5) remaining_len += 2;  // 3.4.2\n\n              if (!mqtt_send_header(c,\n                                    (uint8_t) (mm.qos == 2 ? MQTT_CMD_PUBREC\n                                                           : MQTT_CMD_PUBACK),\n                                    0, remaining_len) ||\n                  !mg_send(c, &id, sizeof(id)))\n                goto fail;\n\n              if (c->is_mqtt5) {\n                uint16_t zero = 0;\n                if (!mg_send(c, &zero, sizeof(zero))) goto fail;\n              }\n            }\n            mg_call(c, MG_EV_MQTT_MSG, &mm);  // let the app handle qos stuff\n            break;\n          }\n          case MQTT_CMD_PUBREC: {  // MQTT5: 3.5.2-1 TODO(): variable header rc\n            uint16_t id = mg_ntohs(mm.id);\n            uint32_t remaining_len = sizeof(id);  // MQTT5 3.6.2-1\n            if (!mqtt_send_header(c, MQTT_CMD_PUBREL, 2,\n                                  remaining_len)  // MQTT5 3.6.1-1, flags = 2\n                || !mg_send(c, &id, sizeof(id)))\n              goto fail;\n            break;\n          }\n          case MQTT_CMD_PUBREL: {  // MQTT5: 3.6.2-1 TODO(): variable header rc\n            uint16_t id = mg_ntohs(mm.id);\n            uint32_t remaining_len = sizeof(id);  // MQTT5 3.7.2-1\n            if (!mqtt_send_header(c, MQTT_CMD_PUBCOMP, 0, remaining_len) ||\n                !mg_send(c, &id, sizeof(id)))\n              goto fail;\n            break;\n          }\n        }\n        mg_call(c, MG_EV_MQTT_CMD, &mm);\n        mg_iobuf_del(&c->recv, 0, mm.dgram.len);\n      } else {\n        break;\n      }\n    }\n  }\n  (void) ev_data;\n  return;\nfail:\n  mg_error(c, \"OOM\");\n}\n\nvoid mg_mqtt_ping(struct mg_connection *nc) {\n  mg_mqtt_send_header(nc, MQTT_CMD_PINGREQ, 0, 0);\n}\n\nvoid mg_mqtt_pong(struct mg_connection *nc) {\n  mg_mqtt_send_header(nc, MQTT_CMD_PINGRESP, 0, 0);\n}\n\nvoid mg_mqtt_disconnect(struct mg_connection *c,\n                        const struct mg_mqtt_opts *opts) {\n  size_t len = 0;\n  if (c->is_mqtt5) len = 1 + get_props_size(opts->props, opts->num_props);\n  if (!mqtt_send_header(c, MQTT_CMD_DISCONNECT, 0, (uint32_t) len)) goto fail;\n\n  if (c->is_mqtt5) {\n    uint8_t zero = 0;\n    if (!mg_send(c, &zero, sizeof(zero))  // reason code\n        || !mg_send_mqtt_properties(c, opts->props, opts->num_props))\n      goto fail;\n  }\n  return;\nfail:\n  mg_error(c, \"OOM\");\n}\n\nstruct mg_connection *mg_mqtt_connect(struct mg_mgr *mgr, const char *url,\n                                      const struct mg_mqtt_opts *opts,\n                                      mg_event_handler_t fn, void *fn_data) {\n  struct mg_connection *c =\n      mg_connect_svc(mgr, url, fn, fn_data, mqtt_cb, NULL);\n  if (c != NULL) {\n    struct mg_mqtt_opts empty;\n    memset(&empty, 0, sizeof(empty));\n    mg_mqtt_login(c, opts == NULL ? &empty : opts);\n  }\n  return c;\n}\n\nstruct mg_connection *mg_mqtt_listen(struct mg_mgr *mgr, const char *url,\n                                     mg_event_handler_t fn, void *fn_data) {\n  struct mg_connection *c = mg_listen(mgr, url, fn, fn_data);\n  if (c != NULL) c->pfn = mqtt_cb, c->pfn_data = mgr;\n  return c;\n}\n"
  },
  {
    "path": "src/mqtt.h",
    "content": "#pragma once\n\n#include \"net.h\"\n#include \"str.h\"\n\n#define MQTT_CMD_CONNECT 1\n#define MQTT_CMD_CONNACK 2\n#define MQTT_CMD_PUBLISH 3\n#define MQTT_CMD_PUBACK 4\n#define MQTT_CMD_PUBREC 5\n#define MQTT_CMD_PUBREL 6\n#define MQTT_CMD_PUBCOMP 7\n#define MQTT_CMD_SUBSCRIBE 8\n#define MQTT_CMD_SUBACK 9\n#define MQTT_CMD_UNSUBSCRIBE 10\n#define MQTT_CMD_UNSUBACK 11\n#define MQTT_CMD_PINGREQ 12\n#define MQTT_CMD_PINGRESP 13\n#define MQTT_CMD_DISCONNECT 14\n#define MQTT_CMD_AUTH 15\n\n#define MQTT_PROP_PAYLOAD_FORMAT_INDICATOR 0x01\n#define MQTT_PROP_MESSAGE_EXPIRY_INTERVAL 0x02\n#define MQTT_PROP_CONTENT_TYPE 0x03\n#define MQTT_PROP_RESPONSE_TOPIC 0x08\n#define MQTT_PROP_CORRELATION_DATA 0x09\n#define MQTT_PROP_SUBSCRIPTION_IDENTIFIER 0x0B\n#define MQTT_PROP_SESSION_EXPIRY_INTERVAL 0x11\n#define MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER 0x12\n#define MQTT_PROP_SERVER_KEEP_ALIVE 0x13\n#define MQTT_PROP_AUTHENTICATION_METHOD 0x15\n#define MQTT_PROP_AUTHENTICATION_DATA 0x16\n#define MQTT_PROP_REQUEST_PROBLEM_INFORMATION 0x17\n#define MQTT_PROP_WILL_DELAY_INTERVAL 0x18\n#define MQTT_PROP_REQUEST_RESPONSE_INFORMATION 0x19\n#define MQTT_PROP_RESPONSE_INFORMATION 0x1A\n#define MQTT_PROP_SERVER_REFERENCE 0x1C\n#define MQTT_PROP_REASON_STRING 0x1F\n#define MQTT_PROP_RECEIVE_MAXIMUM 0x21\n#define MQTT_PROP_TOPIC_ALIAS_MAXIMUM 0x22\n#define MQTT_PROP_TOPIC_ALIAS 0x23\n#define MQTT_PROP_MAXIMUM_QOS 0x24\n#define MQTT_PROP_RETAIN_AVAILABLE 0x25\n#define MQTT_PROP_USER_PROPERTY 0x26\n#define MQTT_PROP_MAXIMUM_PACKET_SIZE 0x27\n#define MQTT_PROP_WILDCARD_SUBSCRIPTION_AVAILABLE 0x28\n#define MQTT_PROP_SUBSCRIPTION_IDENTIFIER_AVAILABLE 0x29\n#define MQTT_PROP_SHARED_SUBSCRIPTION_AVAILABLE 0x2A\n\nenum {\n  MQTT_PROP_TYPE_BYTE,\n  MQTT_PROP_TYPE_STRING,\n  MQTT_PROP_TYPE_STRING_PAIR,\n  MQTT_PROP_TYPE_BINARY_DATA,\n  MQTT_PROP_TYPE_VARIABLE_INT,\n  MQTT_PROP_TYPE_INT,\n  MQTT_PROP_TYPE_SHORT\n};\n\nenum { MQTT_OK, MQTT_INCOMPLETE, MQTT_MALFORMED };\n\nstruct mg_mqtt_prop {\n  uint8_t id;         // Enumerated at MQTT5 Reference\n  uint32_t iv;        // Integer value for 8-, 16-, 32-bit integers types\n  struct mg_str key;  // Non-NULL only for user property type\n  struct mg_str val;  // Non-NULL only for UTF-8 types and user properties\n};\n\nstruct mg_mqtt_opts {\n  struct mg_str user;               // Username, can be empty\n  struct mg_str pass;               // Password, can be empty\n  struct mg_str client_id;          // Client ID\n  struct mg_str topic;              // message/subscription topic\n  struct mg_str message;            // message content\n  uint8_t qos;                      // message quality of service\n  uint8_t version;                  // Can be 4 (3.1.1), or 5. If 0, assume 4\n  uint16_t keepalive;               // Keep-alive timer in seconds\n  uint16_t retransmit_id;           // For PUBLISH, init to 0\n  bool retain;                      // Retain flag\n  bool clean;                       // Clean session flag\n  struct mg_mqtt_prop *props;       // MQTT5 props array\n  size_t num_props;                 // number of props\n  struct mg_mqtt_prop *will_props;  // Valid only for CONNECT packet (MQTT5)\n  size_t num_will_props;            // Number of will props\n};\n\nstruct mg_mqtt_message {\n  struct mg_str topic;  // Parsed topic for PUBLISH\n  struct mg_str data;   // Parsed message for PUBLISH\n  struct mg_str dgram;  // Whole MQTT packet, including headers\n  uint16_t id;          // For PUBACK, PUBREC, PUBREL, PUBCOMP, SUBACK, PUBLISH\n  uint8_t cmd;          // MQTT command, one of MQTT_CMD_*\n  uint8_t qos;          // Quality of service\n  uint8_t ack;          // CONNACK return code, 0 = success\n  size_t props_start;   // Offset to the start of the properties (MQTT5)\n  size_t props_size;    // Length of the properties\n};\n\nstruct mg_connection *mg_mqtt_connect(struct mg_mgr *, const char *url,\n                                      const struct mg_mqtt_opts *opts,\n                                      mg_event_handler_t fn, void *fn_data);\nstruct mg_connection *mg_mqtt_listen(struct mg_mgr *mgr, const char *url,\n                                     mg_event_handler_t fn, void *fn_data);\nvoid mg_mqtt_login(struct mg_connection *c, const struct mg_mqtt_opts *opts);\nuint16_t mg_mqtt_pub(struct mg_connection *c, const struct mg_mqtt_opts *opts);\nvoid mg_mqtt_sub(struct mg_connection *, const struct mg_mqtt_opts *opts);\nvoid mg_mqtt_unsub(struct mg_connection *c, const struct mg_mqtt_opts *opts);\nint mg_mqtt_parse(const uint8_t *, size_t, uint8_t, struct mg_mqtt_message *);\nvoid mg_mqtt_send_header(struct mg_connection *, uint8_t cmd, uint8_t flags,\n                         uint32_t len);\nvoid mg_mqtt_ping(struct mg_connection *);\nvoid mg_mqtt_pong(struct mg_connection *);\nvoid mg_mqtt_disconnect(struct mg_connection *, const struct mg_mqtt_opts *);\nsize_t mg_mqtt_next_prop(struct mg_mqtt_message *, struct mg_mqtt_prop *,\n                         size_t ofs);\n"
  },
  {
    "path": "src/net.c",
    "content": "#include \"net.h\"\n#include \"dns.h\"\n#include \"fmt.h\"\n#include \"log.h\"\n#include \"printf.h\"\n#include \"profile.h\"\n#include \"timer.h\"\n#include \"tls.h\"\n\nsize_t mg_vprintf(struct mg_connection *c, const char *fmt, va_list *ap) {\n  size_t old = c->send.len;\n  size_t expected = mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, ap);\n  size_t actual = c->send.len - old;\n  if (actual != expected) {\n    mg_error(c, \"OOM\");\n    c->send.len = old;\n    actual = 0;\n  }\n  return actual;\n}\n\nsize_t mg_printf(struct mg_connection *c, const char *fmt, ...) {\n  size_t len = 0;\n  va_list ap;\n  va_start(ap, fmt);\n  len = mg_vprintf(c, fmt, &ap);\n  va_end(ap);\n  return len;\n}\n\nstatic bool mg_atonl(struct mg_str str, struct mg_addr *addr) {\n  uint32_t localhost = mg_htonl(0x7f000001);\n  if (mg_strcasecmp(str, mg_str(\"localhost\")) != 0) return false;\n  memcpy(addr->addr.ip, &localhost, sizeof(uint32_t));\n  addr->is_ip6 = false;\n  return true;\n}\n\nstatic bool mg_atone(struct mg_str str, struct mg_addr *addr) {\n  if (str.len > 0) return false;\n  memset(addr->addr.ip, 0, sizeof(addr->addr.ip));\n  addr->is_ip6 = false;\n  return true;\n}\n\nstatic bool mg_aton4(struct mg_str str, struct mg_addr *addr) {\n  uint8_t data[4] = {0, 0, 0, 0};\n  size_t i, num_dots = 0;\n  for (i = 0; i < str.len; i++) {\n    if (str.buf[i] >= '0' && str.buf[i] <= '9') {\n      int octet = data[num_dots] * 10 + (str.buf[i] - '0');\n      if (octet > 255) return false;\n      data[num_dots] = (uint8_t) octet;\n    } else if (str.buf[i] == '.') {\n      if (num_dots >= 3 || i == 0 || str.buf[i - 1] == '.') return false;\n      num_dots++;\n    } else {\n      return false;\n    }\n  }\n  if (num_dots != 3 || str.buf[i - 1] == '.') return false;\n  memcpy(&addr->addr.ip, data, sizeof(data));\n  addr->is_ip6 = false;\n  return true;\n}\n\nstatic bool mg_v4mapped(struct mg_str str, struct mg_addr *addr) {\n  int i;\n  uint32_t ipv4;\n  if (str.len < 14) return false;\n  if (str.buf[0] != ':' || str.buf[1] != ':' || str.buf[6] != ':') return false;\n  for (i = 2; i < 6; i++) {\n    if (str.buf[i] != 'f' && str.buf[i] != 'F') return false;\n  }\n  // struct mg_str s = mg_str_n(&str.buf[7], str.len - 7);\n  if (!mg_aton4(mg_str_n(&str.buf[7], str.len - 7), addr)) return false;\n  memcpy(&ipv4, addr->addr.ip, sizeof(ipv4));\n  memset(addr->addr.ip, 0, sizeof(addr->addr.ip));\n  addr->addr.ip[10] = addr->addr.ip[11] = 255;\n  memcpy(&addr->addr.ip[12], &ipv4, 4);\n  addr->is_ip6 = true;\n  return true;\n}\n\nstatic bool mg_aton6(struct mg_str str, struct mg_addr *addr) {\n  size_t i, j = 0, n = 0, dc = 42;\n  addr->scope_id = 0;\n  if (str.len > 2 && str.buf[0] == '[') str.buf++, str.len -= 2;\n  if (mg_v4mapped(str, addr)) return true;  // sets addr->is_ip6\n  for (i = 0; i < str.len; i++) {\n    if ((str.buf[i] >= '0' && str.buf[i] <= '9') ||\n        (str.buf[i] >= 'a' && str.buf[i] <= 'f') ||\n        (str.buf[i] >= 'A' && str.buf[i] <= 'F')) {\n      unsigned long val = 0;  // TODO(): This loops on chars, refactor\n      if (i > j + 3) return false;\n      // MG_DEBUG((\"%lu %lu [%.*s]\", i, j, (int) (i - j + 1), &str.buf[j]));\n      mg_str_to_num(mg_str_n(&str.buf[j], i - j + 1), 16, &val, sizeof(val));\n      addr->addr.ip[n] = (uint8_t) ((val >> 8) & 255);\n      addr->addr.ip[n + 1] = (uint8_t) (val & 255);\n    } else if (str.buf[i] == ':') {\n      j = i + 1;\n      if (i > 0 && str.buf[i - 1] == ':') {\n        dc = n;  // Double colon\n        if (i > 1 && str.buf[i - 2] == ':') return false;\n      } else if (i > 0) {\n        n += 2;\n      }\n      if (n > 14) return false;\n      addr->addr.ip[n] = addr->addr.ip[n + 1] = 0;  // For trailing ::\n    } else if (str.buf[i] == '%') {                 // Scope ID, last in string\n      if (mg_str_to_num(mg_str_n(&str.buf[i + 1], str.len - i - 1), 10,\n                        &addr->scope_id, sizeof(uint8_t))) {\n        addr->is_ip6 = true;\n        return true;\n      } else {\n        return false;\n      }\n    } else {\n      return false;\n    }\n  }\n  if (n < 14 && dc == 42) return false;\n  if (n < 14) {\n    memmove(&addr->addr.ip[dc + (14 - n)], &addr->addr.ip[dc], n - dc + 2);\n    memset(&addr->addr.ip[dc], 0, 14 - n);\n  }\n\n  addr->is_ip6 = true;\n  return true;\n}\n\nbool mg_aton(struct mg_str str, struct mg_addr *addr) {\n  // MG_INFO((\"[%.*s]\", (int) str.len, str.buf));\n  return mg_atone(str, addr) || mg_atonl(str, addr) || mg_aton4(str, addr) ||\n         mg_aton6(str, addr);\n}\n\nstruct mg_connection *mg_alloc_conn(struct mg_mgr *mgr) {\n  struct mg_connection *c =\n      (struct mg_connection *) mg_calloc(1, sizeof(*c) + mgr->extraconnsize);\n  if (c != NULL) {\n    c->mgr = mgr;\n    c->send.align = c->recv.align = c->rtls.align = MG_IO_SIZE;\n    c->id = ++mgr->nextid;\n    MG_PROF_INIT(c);\n  }\n  return c;\n}\n\nvoid mg_close_conn(struct mg_connection *c) {\n  mg_resolve_cancel(c);  // Close any pending DNS query\n  LIST_DELETE(struct mg_connection, &c->mgr->conns, c);\n  if (c == c->mgr->dns4.c) c->mgr->dns4.c = NULL;\n  if (c == c->mgr->dns6.c) c->mgr->dns6.c = NULL;\n  // Order of operations is important. `MG_EV_CLOSE` event must be fired\n  // before we deallocate received data, see #1331\n  mg_call(c, MG_EV_CLOSE, NULL);\n  MG_DEBUG((\"%lu %ld closed\", c->id, c->fd));\n  MG_PROF_DUMP(c);\n  MG_PROF_FREE(c);\n\n  mg_tls_free(c);\n  mg_iobuf_free(&c->recv);\n  mg_iobuf_free(&c->send);\n  mg_iobuf_free(&c->rtls);\n  mg_bzero((unsigned char *) c, sizeof(*c));\n  mg_free(c);\n}\n\nstruct mg_connection *mg_connect_svc(struct mg_mgr *mgr, const char *url,\n                                     mg_event_handler_t fn, void *fn_data,\n                                     mg_event_handler_t pfn, void *pfn_data) {\n  struct mg_connection *c = NULL;\n  if (url == NULL || url[0] == '\\0') {\n    MG_ERROR((\"null url\"));\n#if MG_ENABLE_TCPIP\n  } else if (mgr->ifp != NULL && mgr->ifp->state != MG_TCPIP_STATE_READY) {\n    MG_ERROR((\"Network is down\"));\n#endif\n  } else if ((c = mg_alloc_conn(mgr)) == NULL) {\n    MG_ERROR((\"OOM\"));\n  } else {\n    LIST_ADD_HEAD(struct mg_connection, &mgr->conns, c);\n    c->is_udp = (strncmp(url, \"udp:\", 4) == 0);\n    c->fd = (void *) (size_t) MG_INVALID_SOCKET;\n    c->fn = fn;\n    c->is_client = true;\n    c->fn_data = fn_data;\n    c->is_tls = (mg_url_is_ssl(url) != 0);\n    c->pfn = pfn;\n    c->pfn_data = pfn_data;\n    mg_call(c, MG_EV_OPEN, (void *) url);\n    MG_DEBUG((\"%lu %ld %s\", c->id, c->fd, url));\n    mg_resolve(c, url);\n  }\n  return c;\n}\n\nstruct mg_connection *mg_connect(struct mg_mgr *mgr, const char *url,\n                                 mg_event_handler_t fn, void *fn_data) {\n  return mg_connect_svc(mgr, url, fn, fn_data, NULL, NULL);\n}\n\nstruct mg_connection *mg_listen(struct mg_mgr *mgr, const char *url,\n                                mg_event_handler_t fn, void *fn_data) {\n  struct mg_connection *c = NULL;\n  if ((c = mg_alloc_conn(mgr)) == NULL) {\n    MG_ERROR((\"OOM %s\", url));\n  } else if (!mg_open_listener(c, url)) {\n    MG_ERROR((\"Failed: %s\", url));\n    MG_PROF_FREE(c);\n    mg_free(c);\n    c = NULL;\n  } else {\n    c->is_listening = 1;\n    c->is_udp = strncmp(url, \"udp:\", 4) == 0;\n    LIST_ADD_HEAD(struct mg_connection, &mgr->conns, c);\n    c->fn = fn;\n    c->fn_data = fn_data;\n    c->is_tls = (mg_url_is_ssl(url) != 0);\n    mg_call(c, MG_EV_OPEN, NULL);\n    MG_DEBUG((\"%lu %ld %s\", c->id, c->fd, url));\n  }\n  return c;\n}\n\nstruct mg_connection *mg_wrapfd(struct mg_mgr *mgr, int fd,\n                                mg_event_handler_t fn, void *fn_data) {\n  struct mg_connection *c = mg_alloc_conn(mgr);\n  if (c != NULL) {\n    c->fd = (void *) (size_t) fd;\n    c->fn = fn;\n    c->fn_data = fn_data;\n    MG_EPOLL_ADD(c);\n    mg_call(c, MG_EV_OPEN, NULL);\n    LIST_ADD_HEAD(struct mg_connection, &mgr->conns, c);\n  }\n  return c;\n}\n\nstruct mg_timer *mg_timer_add(struct mg_mgr *mgr, uint64_t milliseconds,\n                              unsigned flags, void (*fn)(void *), void *arg) {\n  struct mg_timer *t = (struct mg_timer *) mg_calloc(1, sizeof(*t));\n  if (t != NULL) {\n    flags |= MG_TIMER_AUTODELETE;  // We have alloc'ed it, so autodelete\n    mg_timer_init(&mgr->timers, t, milliseconds, flags, fn, arg);\n  }\n  return t;\n}\n\nlong mg_io_recv(struct mg_connection *c, void *buf, size_t len) {\n  if (c->rtls.len == 0) return MG_IO_WAIT;\n  if (len > c->rtls.len) len = c->rtls.len;\n  memcpy(buf, c->rtls.buf, len);\n  mg_iobuf_del(&c->rtls, 0, len);\n  return (long) len;\n}\n\nvoid mg_mgr_free(struct mg_mgr *mgr) {\n  struct mg_connection *c;\n  struct mg_timer *tmp, *t = mgr->timers;\n  while (t != NULL) tmp = t->next, mg_free(t), t = tmp;\n  mgr->timers = NULL;  // Important. Next call to poll won't touch timers\n  for (c = mgr->conns; c != NULL; c = c->next) c->is_closing = 1;\n  mg_mgr_poll(mgr, 0);\n#if MG_ENABLE_FREERTOS_TCP\n  FreeRTOS_DeleteSocketSet(mgr->ss);\n#endif\n  MG_DEBUG((\"All connections closed\"));\n#if MG_ENABLE_EPOLL\n  if (mgr->epoll_fd >= 0) close(mgr->epoll_fd), mgr->epoll_fd = -1;\n#endif\n  mg_tls_ctx_free(mgr);\n#if MG_ENABLE_TCPIP\n  if (mgr->ifp) mg_tcpip_free(mgr->ifp);\n#endif\n}\n\nvoid mg_mgr_init(struct mg_mgr *mgr) {\n  memset(mgr, 0, sizeof(*mgr));\n#if MG_ENABLE_EPOLL\n  if ((mgr->epoll_fd = epoll_create1(EPOLL_CLOEXEC)) < 0)\n    MG_ERROR((\"epoll_create1 errno %d\", errno));\n#else\n  mgr->epoll_fd = -1;\n#endif\n#if MG_ARCH == MG_ARCH_WIN32 && MG_ENABLE_WINSOCK\n  // clang-format off\n  { WSADATA data; WSAStartup(MAKEWORD(2, 2), &data); }\n  // clang-format on\n#elif MG_ENABLE_FREERTOS_TCP\n  mgr->ss = FreeRTOS_CreateSocketSet();\n#elif MG_ARCH == MG_ARCH_UNIX\n  // Ignore SIGPIPE signal, so if client cancels the request, it\n  // won't kill the whole process.\n  signal(SIGPIPE, SIG_IGN);\n#elif MG_ENABLE_TCPIP_DRIVER_INIT && defined(MG_TCPIP_DRIVER_INIT)\n  MG_TCPIP_DRIVER_INIT(mgr);\n#endif\n  mgr->pipe = MG_INVALID_SOCKET;\n  mgr->dnstimeout = 3000;\n  mgr->dns4.url = \"udp://8.8.8.8:53\";\n  mgr->dns6.url = \"udp://[2001:4860:4860::8888]:53\";\n  mg_tls_ctx_init(mgr);\n  MG_DEBUG((\"MG_IO_SIZE: %lu, TLS: %s\", MG_IO_SIZE,\n            MG_TLS == MG_TLS_NONE      ? \"none\"\n            : MG_TLS == MG_TLS_MBED    ? \"MbedTLS\"\n            : MG_TLS == MG_TLS_OPENSSL ? \"OpenSSL\"\n            : MG_TLS == MG_TLS_BUILTIN ? \"builtin\"\n            : MG_TLS == MG_TLS_WOLFSSL ? \"WolfSSL\"\n                                       : \"custom\"));\n}\n\n#if MG_ENABLE_TCPIP\nvoid mg_tcpip_mapip(struct mg_connection *, struct mg_addr *);\n#endif\nvoid mg_multicast_restore(struct mg_connection *c, uint8_t *from) {\n  memcpy(&c->rem, from, sizeof(c->rem));\n#if MG_ENABLE_TCPIP\n  mg_tcpip_mapip(c, &c->rem);\n#endif\n}\n"
  },
  {
    "path": "src/net.h",
    "content": "#pragma once\n\n#include \"arch.h\"\n#include \"config.h\"\n#include \"event.h\"\n#include \"iobuf.h\"\n#include \"net_builtin.h\"\n#include \"str.h\"\n#include \"timer.h\"\n\nstruct mg_dns {\n  const char *url;          // DNS server URL\n  struct mg_connection *c;  // DNS server connection\n};\n\nstruct mg_addr {\n  union {  // Holds IPv4 or IPv6 address, in network byte order\n    uint8_t ip[16];\n    uint32_t ip4;\n    uint64_t ip6[2];\n  } addr;\n  uint16_t port;     // TCP or UDP port in network byte order\n  uint8_t scope_id;  // IPv6 scope ID\n  bool is_ip6;       // True when address is IPv6 address\n};\n\nstruct mg_mgr {\n  struct mg_connection *conns;  // List of active connections\n  struct mg_dns dns4;           // DNS for IPv4\n  struct mg_dns dns6;           // DNS for IPv6\n  int dnstimeout;               // DNS resolve timeout in milliseconds\n  bool use_dns6;                // Use DNS6 server by default, see #1532\n  unsigned long nextid;         // Next connection ID\n  void *userdata;               // Arbitrary user data pointer\n  void *tls_ctx;                // TLS context shared by all TLS sessions\n  uint16_t mqtt_id;             // MQTT IDs for pub/sub\n  void *active_dns_requests;    // DNS requests in progress\n  struct mg_timer *timers;      // Active timers\n  int epoll_fd;                 // Used when MG_EPOLL_ENABLE=1\n  struct mg_tcpip_if *ifp;      // Builtin TCP/IP stack only. Interface pointer\n  size_t extraconnsize;         // Builtin TCP/IP stack only. Extra space\n  MG_SOCKET_TYPE pipe;          // Socketpair end for mg_wakeup()\n#if MG_ENABLE_FREERTOS_TCP\n  SocketSet_t ss;  // NOTE(lsm): referenced from socket struct\n#endif\n};\n\nstruct mg_connection {\n  struct mg_connection *next;     // Linkage in struct mg_mgr :: connections\n  struct mg_mgr *mgr;             // Our container\n  struct mg_addr loc;             // Local address\n  struct mg_addr rem;             // Remote address\n  void *fd;                       // Connected socket, or LWIP data\n  unsigned long id;               // Auto-incrementing unique connection ID\n  struct mg_iobuf recv;           // Incoming data\n  struct mg_iobuf send;           // Outgoing data\n  struct mg_iobuf prof;           // Profile data enabled by MG_ENABLE_PROFILE\n  struct mg_iobuf rtls;           // TLS only. Incoming encrypted data\n  mg_event_handler_t fn;          // User-specified event handler function\n  void *fn_data;                  // User-specified function parameter\n  mg_event_handler_t pfn;         // Protocol-specific handler function\n  void *pfn_data;                 // Protocol-specific function parameter\n  char data[MG_DATA_SIZE];        // Arbitrary connection data\n  void *tls;                      // TLS specific data\n  unsigned is_listening : 1;      // Listening connection\n  unsigned is_client : 1;         // Outbound (client) connection\n  unsigned is_accepted : 1;       // Accepted (server) connection\n  unsigned is_resolving : 1;      // Non-blocking DNS resolution is in progress\n  unsigned is_arplooking : 1;     // Non-blocking ARP resolution is in progress\n  unsigned is_connecting : 1;     // Non-blocking connect is in progress\n  unsigned is_tls : 1;            // TLS-enabled connection\n  unsigned is_tls_hs : 1;         // TLS handshake is in progress\n  unsigned is_udp : 1;            // UDP connection\n  unsigned is_websocket : 1;      // WebSocket connection\n  unsigned is_mqtt5 : 1;          // For MQTT connection, v5 indicator\n  unsigned is_hexdumping : 1;     // Hexdump in/out traffic\n  unsigned is_draining : 1;       // Send remaining data, then close and free\n  unsigned is_closing : 1;        // Close and free the connection immediately\n  unsigned is_full : 1;           // Stop reads, until cleared\n  unsigned is_tls_throttled : 1;  // Last TLS write: MG_SOCK_PENDING() was true\n  unsigned is_resp : 1;           // Response is still being generated\n  unsigned is_readable : 1;       // Connection is ready to read\n  unsigned is_writable : 1;       // Connection is ready to write\n};\n\nvoid mg_mgr_poll(struct mg_mgr *, int ms);\nvoid mg_mgr_init(struct mg_mgr *);\nvoid mg_mgr_free(struct mg_mgr *);\n\nstruct mg_connection *mg_listen(struct mg_mgr *, const char *url,\n                                mg_event_handler_t fn, void *fn_data);\nstruct mg_connection *mg_connect(struct mg_mgr *, const char *url,\n                                 mg_event_handler_t fn, void *fn_data);\nstruct mg_connection *mg_wrapfd(struct mg_mgr *mgr, int fd,\n                                mg_event_handler_t fn, void *fn_data);\nvoid mg_connect_resolved(struct mg_connection *);\nbool mg_send(struct mg_connection *, const void *, size_t);\nsize_t mg_printf(struct mg_connection *, const char *fmt, ...);\nsize_t mg_vprintf(struct mg_connection *, const char *fmt, va_list *ap);\nbool mg_aton(struct mg_str str, struct mg_addr *addr);\n\n// These functions are used to integrate with custom network stacks\nstruct mg_connection *mg_alloc_conn(struct mg_mgr *);\nvoid mg_close_conn(struct mg_connection *c);\nbool mg_open_listener(struct mg_connection *c, const char *url);\n\n// Utility functions\nbool mg_wakeup(struct mg_mgr *, unsigned long id, const void *buf, size_t len);\nbool mg_wakeup_init(struct mg_mgr *);\nstruct mg_timer *mg_timer_add(struct mg_mgr *mgr, uint64_t milliseconds,\n                              unsigned flags, void (*fn)(void *), void *arg);\nstruct mg_connection *mg_connect_svc(struct mg_mgr *mgr, const char *url,\n                                     mg_event_handler_t fn, void *fn_data,\n                                     mg_event_handler_t pfn, void *pfn_data);\nvoid mg_multicast_restore(struct mg_connection *c, uint8_t *from);\n"
  },
  {
    "path": "src/net_builtin.c",
    "content": "#include \"net_builtin.h\"\n#include \"profile.h\"\n\n#if MG_ENABLE_TCPIP\n#define MG_EPHEMERAL_PORT_BASE 32768\n#define PDIFF(a, b) ((size_t) (((char *) (b)) - ((char *) (a))))\n\n#ifndef MG_TCPIP_KEEPALIVE_MS\n#define MG_TCPIP_KEEPALIVE_MS 45000  // TCP keep-alive period, ms\n#endif\n\n#define MG_TCPIP_ACK_MS 150    // Timeout for ACKing\n#define MG_TCPIP_ARP_MS 100    // Timeout for ARP response\n#define MG_TCPIP_SYN_MS 15000  // Timeout for connection establishment\n#define MG_TCPIP_FIN_MS 1000   // Timeout for closing connection\n\n#ifndef MG_TCPIP_WIN\n#define MG_TCPIP_WIN 6000  // TCP window size\n#endif\n\nstruct connstate {\n  uint32_t seq, ack;                      // TCP seq/ack counters\n  uint64_t timer;                         // TCP timer (see 'ttype' below)\n  uint32_t acked;                         // Last ACK-ed number\n  size_t unacked;                         // Not acked bytes\n  uint16_t dmss;                          // destination MSS (from TCP opts)\n  uint8_t mac[sizeof(struct mg_l2addr)];  // Peer hw address\n  uint8_t ttype;                          // Timer type:\n#define MIP_TTYPE_KEEPALIVE 0  // Connection is idle for long, send keepalive\n#define MIP_TTYPE_ACK 1        // Peer sent us data, we have to ack it soon\n#define MIP_TTYPE_ARP 2        // ARP resolve sent, waiting for response\n#define MIP_TTYPE_SYN 3        // SYN sent, waiting for response\n#define MIP_TTYPE_FIN 4  // FIN sent, waiting until terminating the connection\n  uint8_t tmiss;         // Number of keep-alive misses\n  struct mg_iobuf raw;   // For TLS only. Incoming raw data\n  bool fin_rcvd;         // We have received FIN from the peer\n  bool twclosure;        // 3-way closure done\n};\n\n#if defined(__DCC__)\n#pragma pack(1)\n#else\n#pragma pack(push, 1)\n#endif\n\nstruct ip {\n  uint8_t ver;    // Version\n  uint8_t tos;    // Unused\n  uint16_t len;   // Datagram length\n  uint16_t id;    // Unused\n  uint16_t frag;  // Fragmentation\n#define IP_FRAG_OFFSET_MSK 0x1fff\n#define IP_MORE_FRAGS_MSK 0x2000\n  uint8_t ttl;    // Time to live\n  uint8_t proto;  // Upper level protocol\n  uint16_t csum;  // Checksum\n  uint32_t src;   // Source IP\n  uint32_t dst;   // Destination IP\n};\n\nstruct ip6 {\n  uint8_t ver;       // Version\n  uint8_t label[3];  // Flow label\n  uint16_t plen;     // Payload length\n  uint8_t next;      // Upper level protocol\n  uint8_t hops;      // Hop limit\n  uint64_t src[2];   // Source IP\n  uint64_t dst[2];   // Destination IP\n};\n\nstruct icmp {\n  uint8_t type;\n  uint8_t code;\n  uint16_t csum;\n};\n\nstruct icmp6 {\n  uint8_t type;\n  uint8_t code;\n  uint16_t csum;\n};\n\nstruct ndp_na {\n  uint8_t res[4];    // R S O, reserved\n  uint64_t addr[2];  // Target address\n};\n\nstruct ndp_ra {\n  uint8_t cur_hop_limit;\n  uint8_t flags;  // M,O,Prf,Resvd\n  uint16_t router_lifetime;\n  uint32_t reachable_time;\n  uint32_t retrans_timer;\n};\n\nstruct arp {\n  uint16_t fmt;    // Format of hardware address\n  uint16_t pro;    // Format of protocol address\n  uint8_t hlen;    // Length of hardware address\n  uint8_t plen;    // Length of protocol address\n  uint16_t op;     // Operation\n  uint8_t sha[6];  // Sender hardware address\n  uint32_t spa;    // Sender protocol address\n  uint8_t tha[6];  // Target hardware address\n  uint32_t tpa;    // Target protocol address\n};\n\nstruct tcp {\n  uint16_t sport;  // Source port\n  uint16_t dport;  // Destination port\n  uint32_t seq;    // Sequence number\n  uint32_t ack;    // Acknowledgement number\n  uint8_t off;     // Data offset\n  uint8_t flags;   // TCP flags\n#define TH_FIN 0x01\n#define TH_SYN 0x02\n#define TH_RST 0x04\n#define TH_PUSH 0x08\n#define TH_ACK 0x10\n#define TH_URG 0x20\n#define TH_STDFLAGS 0x3f\n  // #define TH_ECE 0x40 // not part of TCP but RFC-3168 (ECN)\n  // #define TH_CWR 0x80\n  uint16_t win;   // Window\n  uint16_t csum;  // Checksum\n  uint16_t urp;   // Urgent pointer\n};\n\nstruct udp {\n  uint16_t sport;  // Source port\n  uint16_t dport;  // Destination port\n  uint16_t len;    // UDP length\n  uint16_t csum;   // UDP checksum\n};\n\nstruct dhcp {\n  uint8_t op, htype, hlen, hops;\n  uint32_t xid;\n  uint16_t secs, flags;\n  uint32_t ciaddr, yiaddr, siaddr, giaddr;\n  uint8_t hwaddr[208];\n  uint32_t magic;\n  uint8_t options[30 + sizeof(((struct mg_tcpip_if *) 0)->dhcp_name)];\n};\n\nstruct dhcp6 {\n  union {\n    uint8_t type;\n    uint32_t xid;\n  };\n  uint8_t options[30 + sizeof(((struct mg_tcpip_if *) 0)->dhcp_name)];\n};\n\nstruct pseudoip {\n  uint32_t src;  // Source IP\n  uint32_t dst;  // Destination IP\n  uint8_t zero;\n  uint8_t proto;  // Upper level protocol\n  uint16_t len;   // Datagram length\n};\n\nstruct pseudoip6 {\n  uint64_t src[2];  // Source IP\n  uint64_t dst[2];  // Destination IP\n  uint32_t plen;    // Payload length\n  uint8_t zero[3];\n  uint8_t next;  // Upper level protocol\n};\n\n#if defined(__DCC__)\n#pragma pack(0)\n#else\n#pragma pack(pop)\n#endif\n\n// pkt is 8-bit aligned, pointers to headers hint compilers to generate\n// byte-copy code for micros with alignment constraints\nstruct pkt {\n  struct mg_str raw;  // Raw packet data\n  struct mg_str pay;  // Payload data\n  uint8_t *l2;        // Ethernet, PPP [, etc] frame data\n  struct arp *arp;\n  struct ip *ip;\n  struct ip6 *ip6;\n  struct icmp *icmp;\n  struct icmp6 *icmp6;\n  struct tcp *tcp;\n  struct udp *udp;\n  struct dhcp *dhcp;\n  struct dhcp6 *dhcp6;\n};\n\n// L2 API\nvoid mg_l2_init(enum mg_l2type type, uint8_t *addr, uint16_t *mtu,\n                uint16_t *framesize);\nuint8_t *mg_l2_header(enum mg_l2type type, enum mg_l2proto proto, uint8_t *src,\n                      uint8_t *dst, uint8_t *frame);\nsize_t mg_l2_footer(enum mg_l2type type, size_t len, uint8_t *frame);\nbool mg_l2_rx(struct mg_tcpip_if *ifp, enum mg_l2proto *proto,\n              struct mg_str *pay, struct mg_str *raw);\nuint8_t *mg_l2_getaddr(enum mg_l2type type, uint8_t *frame);\nuint8_t *mg_l2_mapip(enum mg_l2type type, enum mg_l2addrtype addrtype,\n                     struct mg_addr *ip);\n#if MG_ENABLE_IPV6\nbool mg_l2_genip6(enum mg_l2type type, uint64_t *ip6, uint8_t prefix_len,\n                  uint8_t *addr);\nbool mg_l2_ip6get(enum mg_l2type type, uint8_t *addr, uint8_t *opts,\n                  uint8_t len);\nuint8_t mg_l2_ip6put(enum mg_l2type type, uint8_t *addr, uint8_t *opts);\n#endif\n\nstatic void mg_tcpip_call(struct mg_tcpip_if *ifp, int ev, void *ev_data) {\n#if MG_ENABLE_PROFILE\n  const char *names[] = {\"TCPIP_EV_ST_CHG\",        \"TCPIP_EV_DHCP_DNS\",\n                         \"TCPIP_EV_DHCP_SNTP\",     \"TCPIP_EV_ARP\",\n                         \"TCPIP_EV_TIMER_1S\",      \"TCPIP_EV_WIFI_SCAN_RESULT\",\n                         \"TCPIP_EV_WIFI_SCAN_END\", \"TCPIP_EV_WIFI_CONNECT_ERR\",\n                         \"TCPIP_EV_DRIVER\",        \"TCPIP_EV_USER\"};\n  if (ev != MG_TCPIP_EV_POLL && ev < (int) (sizeof(names) / sizeof(names[0]))) {\n    MG_PROF_ADD(c, names[ev]);\n  }\n#endif\n  // Fire protocol handler first, user handler second. See #2559\n  if (ifp->pfn != NULL) ifp->pfn(ifp, ev, ev_data);\n  if (ifp->fn != NULL) ifp->fn(ifp, ev, ev_data);\n}\n\nstatic void send_syn(struct mg_connection *c);\n\nstatic void mkpay(struct pkt *pkt, void *p) {\n  pkt->pay =\n      mg_str_n((char *) p, (size_t) (&pkt->pay.buf[pkt->pay.len] - (char *) p));\n}\n\n// NOTE(): DOES NOT handle reentries after odd length, use last\nstatic uint32_t csumup(uint32_t sum, const void *buf, size_t len) {\n  size_t i;\n  const uint8_t *p = (const uint8_t *) buf;\n  for (i = 0; i < len; i++) sum += i & 1 ? p[i] : ((uint32_t) p[i]) << 8;\n  return sum;\n}\n\nstatic uint16_t csumfin(uint32_t sum) {\n  while (sum >> 16) sum = (sum & 0xffff) + (sum >> 16);\n  return mg_htons((uint16_t) ((uint16_t) ~sum & 0xffff));\n}\n\nstatic uint16_t ipcsum(const void *buf, size_t len) {\n  uint32_t sum = csumup(0, buf, len);\n  return csumfin(sum);\n}\n\nstatic bool ipcsum_ok(const void *d) {\n  struct ip *ip = (struct ip *) d;\n  return (ipcsum(d, (ip->ver & 0x0F) * 4) == 0);\n}\n\nstatic bool icmpcsum_ok(const void *d, size_t len) {\n  return (ipcsum(d, len) == 0);\n}\n\nstatic uint16_t pcsum(void *d, void *p, size_t plen) {\n  uint32_t sum;\n  struct ip *ip = (struct ip *) d;\n#if defined(__DCC__)\n  volatile  /* Makes PPC & Diab4.3 happy */\n#endif\n  struct pseudoip pip;\n  pip.src = ip->src;\n  pip.dst = ip->dst;\n  pip.zero = 0;\n  pip.proto = ip->proto;\n  pip.len = mg_htons((uint16_t) plen);\n  sum = csumup(0, &pip, sizeof(pip));  // even length\n  sum = csumup(sum, p, plen);          // possibly odd length: last\n  return csumfin(sum);\n}\n\nstatic bool udpcsum_ok(void *d, void *u) {\n  struct udp *udp = (struct udp *) u;\n  if (udp->csum == 0) return true;\n  if (udp->csum == 0xFFFF) udp->csum = 0;\n  return (pcsum(d, u, (size_t) mg_ntohs(udp->len)) == 0);\n}\n\nstatic bool tcpcsum_ok(void *d, void *t) {\n  struct ip *ip = (struct ip *) d;\n  return (pcsum(d, t, (size_t) (mg_ntohs(ip->len) - (ip->ver & 0x0F) * 4)) ==\n          0);\n}\n\n#if MG_ENABLE_IPV6\nstatic uint16_t p6csum(void *d, void *p, size_t plen) {\n  uint32_t sum;\n  struct ip6 *ip6 = (struct ip6 *) d;\n#if defined(__DCC__)\n  volatile  /* Makes PPC & Diab4.3 happy */\n#endif\n  struct pseudoip6 pip6;\n  pip6.src[0] = ip6->src[0], pip6.src[1] = ip6->src[1];\n  pip6.dst[0] = ip6->dst[0], pip6.dst[1] = ip6->dst[1];\n  pip6.zero[0] = 0, pip6.zero[1] = 0, pip6.zero[2] = 0;\n  pip6.plen = mg_htonl((uint32_t) plen);\n  pip6.next = ip6->next;\n  sum = csumup(0, &pip6, sizeof(pip6));  // even length\n  sum = csumup(sum, p, plen);            // possibly odd length: last\n  return csumfin(sum);\n}\n\nstatic bool udp6csum_ok(void *d, void *u) {\n  struct udp *udp = (struct udp *) u;\n  if (udp->csum == 0) return false;  // mandatory in IPv6\n  if (udp->csum == 0xFFFF) udp->csum = 0;\n  return (p6csum(d, u, (size_t) mg_ntohs(udp->len)) == 0);\n}\nstatic bool tcp6csum_ok(void *d, void *t) {\n  struct ip6 *ip6 = (struct ip6 *) d;\n  return (p6csum(d, t, (size_t) mg_ntohs(ip6->plen)) == 0);\n}\nstatic bool icmp6csum_ok(void *d, void *i) {\n  struct ip6 *ip6 = (struct ip6 *) d;\n  return (p6csum(d, i, (size_t) mg_ntohs(ip6->plen)) == 0);\n}\n\nstatic void ip6sn(uint64_t *addr, uint64_t *sn_addr) {\n  // Build solicited-node multicast address from a given unicast IP\n  // RFC-4291 2.7\n  uint8_t *sn = (uint8_t *) sn_addr;\n  memset(sn_addr, 0, 16);\n  sn[0] = 0xff;\n  sn[1] = 0x02;\n  sn[11] = 0x01;\n  sn[12] = 0xff;\n  sn[13] = ((uint8_t *) addr)[13];\n  sn[14] = ((uint8_t *) addr)[14];\n  sn[15] = ((uint8_t *) addr)[15];\n}\n\nstatic const struct mg_addr ip6_allrouters = {\n    {{0xFF, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x02}}, 0, 0, true};\nstatic const struct mg_addr ip6_allnodes = {\n    {{0xFF, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01}}, 0, 0, true};\n\n#define MG_IP6MATCH(a, b) (a[0] == b[0] && a[1] == b[1])\n#endif\n\nstatic void settmout(struct mg_connection *c, uint8_t type) {\n  struct mg_tcpip_if *ifp = c->mgr->ifp;\n  struct connstate *s = (struct connstate *) (c + 1);\n  unsigned n = type == MIP_TTYPE_ACK   ? MG_TCPIP_ACK_MS\n               : type == MIP_TTYPE_ARP ? MG_TCPIP_ARP_MS\n               : type == MIP_TTYPE_SYN ? MG_TCPIP_SYN_MS\n               : type == MIP_TTYPE_FIN ? MG_TCPIP_FIN_MS\n                                       : MG_TCPIP_KEEPALIVE_MS;\n  if (s->ttype == MIP_TTYPE_FIN) return;  // skip if 3-way closing\n  s->timer = ifp->now + n;\n  s->ttype = type;\n  MG_VERBOSE((\"%lu %d -> %llx\", c->id, type, s->timer));\n}\n\nstatic size_t driver_output(struct mg_tcpip_if *ifp, size_t len) {\n  size_t n = ifp->driver->tx(ifp->tx.buf, len, ifp);\n  if (n == len) ifp->nsent++;\n  return n;\n}\n\n// RFC826, ARP assumes Ethernet MAC addresses\nvoid mg_tcpip_arp_request(struct mg_tcpip_if *ifp, uint32_t ip, uint8_t *mac) {\n  uint8_t *l2p = (uint8_t *) ifp->tx.buf;\n  struct arp *arp = (struct arp *) mg_l2_header(\n      ifp->l2type, MG_TCPIP_L2PROTO_ARP, ifp->mac,\n      mg_l2_mapip(ifp->l2type, MG_TCPIP_L2ADDR_BCAST, NULL), l2p);\n  memset(arp, 0, sizeof(*arp));\n  arp->fmt = mg_htons(1), arp->pro = mg_htons(0x800), arp->hlen = 6,\n  arp->plen = 4;\n  arp->op = mg_htons(1), arp->tpa = ip, arp->spa = ifp->ip;\n  memcpy(arp->sha, ifp->mac, sizeof(arp->sha));\n  if (mac != NULL) memcpy(arp->tha, mac, sizeof(arp->tha));\n  driver_output(ifp, mg_l2_footer(ifp->l2type, PDIFF(l2p, arp + 1), l2p));\n}\n\nstatic void onstatechange(struct mg_tcpip_if *ifp) {\n  if (ifp->state == MG_TCPIP_STATE_READY) {\n    MG_INFO((\"READY, IP: %M\", mg_print_ip4, &ifp->ip));\n    MG_INFO((\"       GW: %M\", mg_print_ip4, &ifp->gw));\n    if (ifp->l2type == MG_TCPIP_L2_ETH)  // TODO(): print other l2\n      MG_INFO((\"      MAC: %M\", mg_print_mac, ifp->mac));\n  } else if (ifp->state == MG_TCPIP_STATE_IP) {\n    if (ifp->gw != 0)\n      mg_tcpip_arp_request(ifp, ifp->gw, NULL);  // unsolicited GW ARP request\n  } else if (ifp->state == MG_TCPIP_STATE_UP) {\n    srand((unsigned int) mg_millis());\n  } else if (ifp->state == MG_TCPIP_STATE_DOWN) {\n    MG_ERROR((\"Link down\"));\n  }\n  mg_tcpip_call(ifp, MG_TCPIP_EV_ST_CHG, &ifp->state);\n}\n\nstatic struct ip *tx_ip(struct mg_tcpip_if *ifp, uint8_t *l2_dst, uint8_t proto,\n                        uint32_t ip_src, uint32_t ip_dst, size_t plen) {\n  // ifp->tx.buf is 8-bit aligned, keep other headers as pointers, see pkt\n  uint8_t *l2p = (uint8_t *) ifp->tx.buf;\n  struct ip *ip = (struct ip *) mg_l2_header(ifp->l2type, MG_TCPIP_L2PROTO_IPV4,\n                                             ifp->mac, l2_dst, l2p);\n  memset(ip, 0, sizeof(*ip));\n  ip->ver = 0x45;               // Version 4, header length 5 words\n  ip->frag = mg_htons(0x4000);  // Don't fragment\n  ip->len = mg_htons((uint16_t) (sizeof(*ip) + plen));\n  ip->ttl = 64;\n  ip->proto = proto;\n  ip->src = ip_src;\n  ip->dst = ip_dst;\n  ip->csum = ipcsum(ip, sizeof(*ip));\n  return ip;\n}\n\n#if MG_ENABLE_IPV6\nstatic struct ip6 *tx_ip6(struct mg_tcpip_if *ifp, uint8_t *l2_dst,\n                          uint8_t next, uint64_t *ip_src, uint64_t *ip_dst,\n                          size_t plen);\n#endif\n\nstatic bool tx_udp(struct mg_tcpip_if *ifp, uint8_t *l2_dst,\n                   struct mg_addr *ip_src, struct mg_addr *ip_dst,\n                   const void *buf, size_t len) {\n  uint8_t *l2p = (uint8_t *) ifp->tx.buf;\n  size_t l2_len;\n  struct ip *ip = NULL;\n  struct udp *udp;\n#if MG_ENABLE_IPV6\n  struct ip6 *ip6 = NULL;\n  if (ip_dst->is_ip6) {\n    ip6 = tx_ip6(ifp, l2_dst, 17, ip_src->addr.ip6, ip_dst->addr.ip6,\n                 len + sizeof(struct udp));\n    udp = (struct udp *) (ip6 + 1);\n    l2_len = sizeof(*ip6) + sizeof(*udp) + len;\n  } else\n#endif\n  {\n    ip = tx_ip(ifp, l2_dst, 17, ip_src->addr.ip4, ip_dst->addr.ip4,\n               len + sizeof(struct udp));\n    udp = (struct udp *) (ip + 1);\n    l2_len = sizeof(*ip) + sizeof(*udp) + len;\n  }\n  udp->sport = ip_src->port;\n  udp->dport = ip_dst->port;\n  udp->len = mg_htons((uint16_t) (sizeof(*udp) + len));\n  udp->csum = 0;\n  memmove(udp + 1, buf, len);\n#if MG_ENABLE_IPV6\n  if (ip_dst->is_ip6) {\n    udp->csum = p6csum(ip6, udp, sizeof(*udp) + len);\n  } else\n#endif\n  {\n    udp->csum = pcsum(ip, udp, sizeof(*udp) + len);\n  }\n  l2_len = mg_l2_footer(ifp->l2type, l2_len, l2p);\n  return (driver_output(ifp, l2_len) == l2_len);\n}\n\nstatic bool tx_udp4(struct mg_tcpip_if *ifp, uint8_t *l2_dst, uint32_t ip_src,\n                    uint16_t sport, uint32_t ip_dst, uint16_t dport,\n                    const void *buf, size_t len) {\n  struct mg_addr ips, ipd;\n  memset(&ips, 0, sizeof(ips));\n  ips.addr.ip4 = ip_src;\n  ips.port = sport;\n  memset(&ipd, 0, sizeof(ipd));\n  ipd.addr.ip4 = ip_dst;\n  ipd.port = dport;\n  return tx_udp(ifp, l2_dst, &ips, &ipd, buf, len);\n}\n\nstatic void tx_dhcp(struct mg_tcpip_if *ifp, uint8_t *l2_dst, uint32_t ip_src,\n                    uint32_t ip_dst, uint8_t *opts, size_t optslen,\n                    bool ciaddr) {\n  // https://datatracker.ietf.org/doc/html/rfc2132#section-9.6\n  // NOTE(): assumes Ethernet: htype=1 hlen=6, copy 6 bytes\n  struct dhcp dhcp = {1, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, {0}, 0, {0}};\n  dhcp.magic = mg_htonl(0x63825363);\n  memcpy(&dhcp.hwaddr, ifp->mac, 6);\n  memcpy(&dhcp.xid, ifp->mac + 2, sizeof(dhcp.xid));\n  memcpy(&dhcp.options, opts, optslen);\n  if (ciaddr) dhcp.ciaddr = ip_src;\n  tx_udp4(ifp, l2_dst, ip_src, mg_htons(68), ip_dst, mg_htons(67), &dhcp,\n          sizeof(dhcp));\n}\n\n// RFC-2131 #4.3.6, #4.4.1; RFC-2132 #9.8\nstatic void tx_dhcp_request_sel(struct mg_tcpip_if *ifp, uint32_t ip_req,\n                                uint32_t ip_srv) {\n  uint8_t extra = (uint8_t) ((ifp->enable_req_dns ? 1 : 0) +\n                             (ifp->enable_req_sntp ? 1 : 0));\n  size_t len = strlen(ifp->dhcp_name);\n  size_t olen = 21 + len + extra + 2 + 1;  // Total length of options\n#define OPTS_MAXLEN (21 + sizeof(ifp->dhcp_name) + 2 + 2 + 1)\n  uint8_t opts[OPTS_MAXLEN];  // Allocate options (max size possible)\n  uint8_t *p = opts;\n  assert(olen <= sizeof(opts));\n  memset(opts, 0, sizeof(opts));\n  *p++ = 53, *p++ = 1, *p++ = 3;                       // Type: DHCP request\n  *p++ = 54, *p++ = 4, memcpy(p, &ip_srv, 4), p += 4;  // DHCP server ID\n  *p++ = 50, *p++ = 4, memcpy(p, &ip_req, 4), p += 4;  // Requested IP\n  *p++ = 12, *p++ = (uint8_t) (len & 255);             // DHCP host\n  memcpy(p, ifp->dhcp_name, len), p += len;            // name\n  *p++ = 55, *p++ = 2 + extra, *p++ = 1, *p++ = 3;     // GW, MASK\n  if (ifp->enable_req_dns) *p++ = 6;                   // DNS\n  if (ifp->enable_req_sntp) *p++ = 42;                 // SNTP\n  *p++ = 255;                                          // End of options\n  // assert((size_t) (p - opts) < olen);\n  tx_dhcp(ifp, mg_l2_mapip(ifp->l2type, MG_TCPIP_L2ADDR_BCAST, NULL), 0,\n          0xffffffff, opts, olen, 0);\n  MG_DEBUG((\"DHCP req sent\"));\n}\n\n// RFC-2131 #4.3.6, #4.4.5 (renewing: unicast, rebinding: bcast)\nstatic void tx_dhcp_request_re(struct mg_tcpip_if *ifp, uint8_t *l2_dst,\n                               uint32_t ip_src, uint32_t ip_dst) {\n  uint8_t opts[] = {\n      53, 1, 3,  // Type: DHCP request\n      255        // End of options\n  };\n  tx_dhcp(ifp, l2_dst, ip_src, ip_dst, opts, sizeof(opts), true);\n  MG_DEBUG((\"DHCP req sent\"));\n}\n\nstatic void tx_dhcp_discover(struct mg_tcpip_if *ifp) {\n  uint8_t opts[] = {\n      53, 1, 1,     // Type: DHCP discover\n      55, 2, 1, 3,  // Parameters: ip, mask\n      255           // End of options\n  };\n  tx_dhcp(ifp, mg_l2_mapip(ifp->l2type, MG_TCPIP_L2ADDR_BCAST, NULL), 0,\n          0xffffffff, opts, sizeof(opts), false);\n  MG_DEBUG((\"DHCP discover sent. Our MAC: %M\", mg_print_mac, ifp->mac));\n}\n\nstatic struct mg_connection *getpeer(struct mg_mgr *mgr, struct pkt *pkt,\n                                     bool lsn) {\n  struct mg_connection *c = NULL;\n  for (c = mgr->conns; c != NULL; c = c->next) {\n    if (c->is_arplooking && pkt->arp && pkt->arp->spa == c->rem.addr.ip4) break;\n#if MG_ENABLE_IPV6\n    if (c->is_arplooking && pkt->icmp6 && pkt->icmp6->type == 136) {\n      struct ndp_na *na = (struct ndp_na *) (pkt->icmp6 + 1);\n      if (MG_IP6MATCH(na->addr, c->rem.addr.ip6)) break;\n    }\n#endif\n    if (c->is_udp && pkt->udp && c->loc.port == pkt->udp->dport &&\n        !(c->loc.is_ip6 ^ (pkt->ip6 != NULL)))  // IP or IPv6 to same dest\n      break;\n    if (!c->is_udp && pkt->tcp && c->loc.port == pkt->tcp->dport &&\n        !(c->loc.is_ip6 ^ (pkt->ip6 != NULL)) &&\n        lsn == (bool) c->is_listening &&\n        (lsn || c->rem.port == pkt->tcp->sport))\n      break;\n  }\n  return c;\n}\n\nstatic void l2addr_resolved(struct mg_connection *c);\nstatic uint8_t *get_return_l2addr(struct mg_tcpip_if *ifp, struct mg_addr *rem,\n                                  bool is_udp, struct pkt *pkt);\n\n// RFC826, ARP assumes Ethernet MAC addresses\nstatic void rx_arp(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  if (pkt->arp->op == mg_htons(1) && pkt->arp->tpa == ifp->ip) {\n    // ARP request. Make a response, then send\n    // MG_VERBOSE((\"ARP req from %M\", mg_print_ip4, &pkt->arp->spa));\n    uint8_t *l2p = (uint8_t *) ifp->tx.buf;\n    struct arp *arp =\n        (struct arp *) mg_l2_header(ifp->l2type, MG_TCPIP_L2PROTO_ARP, ifp->mac,\n                                    mg_l2_getaddr(ifp->l2type, pkt->l2), l2p);\n    *arp = *pkt->arp;\n    arp->op = mg_htons(2);\n    memcpy(arp->tha, pkt->arp->sha, sizeof(pkt->arp->tha));\n    memcpy(arp->sha, ifp->mac, sizeof(pkt->arp->sha));\n    arp->tpa = pkt->arp->spa;\n    arp->spa = ifp->ip;\n    MG_DEBUG((\"ARP: tell %M we're %M\", mg_print_ip4, &arp->tpa, mg_print_mac,\n              ifp->mac));\n    driver_output(ifp, mg_l2_footer(ifp->l2type, PDIFF(l2p, arp + 1), l2p));\n  } else if (pkt->arp->op == mg_htons(2)) {\n    if (memcmp(pkt->arp->tha, ifp->mac, sizeof(pkt->arp->tha)) != 0) return;\n    // MG_VERBOSE((\"ARP resp from %M\", mg_print_ip4, &pkt->arp->spa));\n    if (pkt->arp->spa == ifp->gw) {\n      // Got response for the GW ARP request. Set ifp->gwmac and IP -> READY\n      memcpy(ifp->gwmac, pkt->arp->sha, sizeof(ifp->gwmac));\n      ifp->gw_ready = true;\n      if (ifp->state == MG_TCPIP_STATE_IP) {\n        ifp->state = MG_TCPIP_STATE_READY;\n        onstatechange(ifp);\n      }\n    } else {\n      struct mg_connection *c = getpeer(ifp->mgr, pkt, false);\n      if (c != NULL && c->is_arplooking) {\n        struct connstate *s = (struct connstate *) (c + 1);\n        memcpy(s->mac, pkt->arp->sha, sizeof(s->mac));\n        MG_DEBUG((\"%lu ARP resolved %M -> %M\", c->id, mg_print_ip4,\n                  &c->rem.addr.ip4, mg_print_mac, s->mac));\n        c->is_arplooking = 0;\n        l2addr_resolved(c);\n      }\n    }\n  }\n}\n\nstatic void rx_icmp(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  uint8_t *l2p = (uint8_t *) ifp->tx.buf;\n  size_t plen = pkt->pay.len;\n  if (!icmpcsum_ok(pkt->icmp, sizeof(struct icmp) + plen)) return;\n  if (pkt->icmp->type == 8 && pkt->ip != NULL && pkt->ip->dst == ifp->ip) {\n    size_t l2_max_overhead = ifp->framesize - ifp->mtu;\n    size_t hlen = sizeof(struct ip) + sizeof(struct icmp);\n    size_t room = ifp->tx.len - hlen - l2_max_overhead;\n    uint8_t *l2addr;\n    struct ip *ip;\n    struct icmp *icmp;\n    struct mg_addr ips;\n    ips.addr.ip4 = pkt->ip->src;\n    ips.is_ip6 = false;\n    if ((l2addr = get_return_l2addr(ifp, &ips, false, pkt)) == NULL)\n      return;  // safety net for lousy networks\n    if (plen > room) plen = room;\n    ip = tx_ip(ifp, l2addr, 1, ifp->ip, pkt->ip->src, sizeof(*icmp) + plen);\n    icmp = (struct icmp *) (ip + 1);\n    memset(icmp, 0, sizeof(*icmp));        // Set csum, type, code to 0\n    memcpy(icmp + 1, pkt->pay.buf, plen);  // Copy RX payload to TX\n    icmp->csum = ipcsum(icmp, sizeof(*icmp) + plen);\n    driver_output(ifp, mg_l2_footer(ifp->l2type, hlen + plen, l2p));\n  }\n}\n\nstatic void setdns4(struct mg_tcpip_if *ifp, uint32_t *ip);\n\nstatic bool dhcp_opt_len_ok(uint8_t len, uint8_t *p, uint8_t *end) {\n  return (len >= 4 && (len & 3) == 0 && p + 6 < end);\n}\n\nstatic void rx_dhcp_client(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  uint32_t ip = 0, gw = 0, mask = 0, lease = 0, dns = 0, sntp = 0;\n  uint8_t msgtype = 0, state = ifp->state;\n  // perform size check first, then access fields\n  uint8_t *p = pkt->dhcp->options,\n          *end = (uint8_t *) &pkt->pay.buf[pkt->pay.len];\n  if (end < p) return;  // options are optional, check min header length\n  if (memcmp(&pkt->dhcp->xid, ifp->mac + 2, sizeof(pkt->dhcp->xid))) return;\n  while (p + 1 < end && p[0] != 255) {  // Parse options, get #1; RFC-2132 9\n    if (p[0] == 1 && p[1] == 4 && p + 6 < end) {  // Mask, 3.3\n      memcpy(&mask, p + 2, sizeof(mask));\n    } else if (p[0] == 3 && dhcp_opt_len_ok(p[1], p, end)) {  // GW, 3.5\n      memcpy(&gw, p + 2, sizeof(gw));\n      ip = pkt->dhcp->yiaddr;\n    } else if (ifp->enable_req_dns && p[0] == 6 &&\n               dhcp_opt_len_ok(p[1], p, end)) {  // DNS, 3.8\n      memcpy(&dns, p + 2, sizeof(dns));\n    } else if (ifp->enable_req_sntp && p[0] == 42 &&\n               dhcp_opt_len_ok(p[1], p, end)) {  // SNTP, 8.3\n      memcpy(&sntp, p + 2, sizeof(sntp));\n    } else if (p[0] == 51 && p[1] == 4 && p + 6 < end) {  // Lease\n      memcpy(&lease, p + 2, sizeof(lease));\n      lease = mg_ntohl(lease);\n    } else if (p[0] == 53 && p[1] == 1 && p + 6 < end) {  // Msg Type\n      msgtype = p[2];\n    }\n    p += p[1] + 2;\n  }\n  // Process message type, RFC-1533 (9.4); RFC-2131 (3.1, 4)\n  if (msgtype == 6 && ifp->ip == ip) {  // DHCPNACK, release IP\n    ifp->state = MG_TCPIP_STATE_UP, ifp->ip = 0;\n  } else if (msgtype == 2 && ifp->state == MG_TCPIP_STATE_UP && ip && gw &&\n             lease) {  // DHCPOFFER\n    // select IP, (4.4.1) (fallback to IP source addr on foul play)\n    tx_dhcp_request_sel(ifp, ip,\n                        pkt->dhcp->siaddr ? pkt->dhcp->siaddr : pkt->ip->src);\n    ifp->state = MG_TCPIP_STATE_REQ;  // REQUESTING state\n  } else if (msgtype == 5) {          // DHCPACK\n    if (ifp->state == MG_TCPIP_STATE_REQ && ip && gw && lease) {  // got an IP\n      uint64_t rand;\n      ifp->lease_expire = ifp->now + lease * 1000;\n      MG_INFO((\"Lease: %u sec (%lld)\", lease, ifp->lease_expire / 1000));\n      // assume DHCP server = router until ARP resolves\n      memcpy(ifp->gwmac, mg_l2_getaddr(ifp->l2type, pkt->l2),\n             sizeof(ifp->gwmac));\n      ifp->gw_ready = true;  // NOTE(): actual gw ARP won't retry now\n      ifp->ip = ip, ifp->gw = gw, ifp->mask = mask;\n      ifp->state = MG_TCPIP_STATE_IP;  // BOUND state\n      mg_random(&rand, sizeof(rand));\n      srand((unsigned int) (rand + mg_millis()));\n      if (ifp->enable_req_dns && dns != 0) {\n        setdns4(ifp, &dns);\n        mg_tcpip_call(ifp, MG_TCPIP_EV_DHCP_DNS, &dns);\n      }\n      if (ifp->enable_req_sntp && sntp != 0)\n        mg_tcpip_call(ifp, MG_TCPIP_EV_DHCP_SNTP, &sntp);\n    } else if (ifp->state == MG_TCPIP_STATE_READY && ifp->ip == ip) {  // renew\n      ifp->lease_expire = ifp->now + lease * 1000;\n      MG_INFO((\"Lease: %u sec (%lld)\", lease, ifp->lease_expire / 1000));\n    }  // TODO(): accept provided T1/T2 and store server IP for renewal (4.4)\n  }\n  if (ifp->state != state) onstatechange(ifp);\n}\n\n// Simple DHCP server that assigns a next IP address: ifp->ip + 1\nstatic void rx_dhcp_server(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  uint8_t *mac;\n  uint8_t op = 0, *p = pkt->dhcp->options,\n          *end = (uint8_t *) &pkt->pay.buf[pkt->pay.len];\n  // NOTE(): assumes Ethernet: htype=1 hlen=6, copy 6 bytes\n  struct dhcp res = {2, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, {0}, 0, {0}};\n  if (end < p) return;  // options are optional, check min header length\n  res.yiaddr = ifp->ip;\n  ((uint8_t *) (&res.yiaddr))[3]++;                // Offer our IP + 1\n  while (p + 1 < end && p[0] != 255) {             // Parse options\n    if (p[0] == 53 && p[1] == 1 && p + 2 < end) {  // Message type\n      op = p[2];\n    }\n    p += p[1] + 2;\n  }\n  if (op == 1 || op == 3) {         // DHCP Discover or DHCP Request\n    uint8_t msg = op == 1 ? 2 : 5;  // Message type: DHCP OFFER or DHCP ACK\n    uint8_t opts[] = {\n        53, 1, 0,                   // Message type\n        1,  4, 0,   0,   0,   0,    // Subnet mask\n        54, 4, 0,   0,   0,   0,    // Server ID\n        12, 3, 'm', 'i', 'p',       // Host name: \"mip\"\n        51, 4, 255, 255, 255, 255,  // Lease time\n        255                         // End of options\n    };\n    opts[2] = msg;\n    memcpy(&res.hwaddr, pkt->dhcp->hwaddr, 6);\n    memcpy(opts + 5, &ifp->mask, sizeof(ifp->mask));\n    memcpy(opts + 11, &ifp->ip, sizeof(ifp->ip));\n    memcpy(&res.options, opts, sizeof(opts));\n    res.magic = pkt->dhcp->magic;\n    res.xid = pkt->dhcp->xid;\n    mac = mg_l2_getaddr(ifp->l2type, pkt->l2);\n    if (ifp->enable_get_gateway) {\n      ifp->gw = res.yiaddr;  // set gw IP, best-effort gwmac as DHCP server's\n      memcpy(ifp->gwmac, mac, sizeof(ifp->gwmac));\n    }\n    tx_udp4(ifp, mac, ifp->ip, mg_htons(67), op == 1 ? ~0U : res.yiaddr,\n            mg_htons(68), &res, sizeof(res));\n  }\n}\n\n#if MG_ENABLE_IPV6\nstatic struct ip6 *tx_ip6(struct mg_tcpip_if *ifp, uint8_t *l2_dst,\n                          uint8_t next, uint64_t *ip_src, uint64_t *ip_dst,\n                          size_t plen) {\n  // ifp->tx.buf is 8-bit aligned, keep other headers as pointers, see pkt\n  uint8_t *l2p = (uint8_t *) ifp->tx.buf;\n  struct ip6 *ip6 = (struct ip6 *) mg_l2_header(\n      ifp->l2type, MG_TCPIP_L2PROTO_IPV6, ifp->mac, l2_dst, l2p);\n  memset(ip6, 0, sizeof(*ip6));\n  ip6->ver = 0x60;  // Version 6, traffic class 0\n  ip6->plen = mg_htons((uint16_t) plen);\n  ip6->next = next;\n  ip6->hops = 255;  // NDP requires max\n  ip6->src[0] = *ip_src++;\n  ip6->src[1] = *ip_src;\n  ip6->dst[0] = *ip_dst++;\n  ip6->dst[1] = *ip_dst;\n  return ip6;\n}\n\nstatic void tx_icmp6(struct mg_tcpip_if *ifp, uint8_t *l2_dst, uint64_t *ip_src,\n                     uint64_t *ip_dst, uint8_t type, uint8_t code,\n                     const void *buf, size_t len) {\n  uint8_t *l2p = (uint8_t *) ifp->tx.buf;\n  struct ip6 *ip6;\n  struct icmp6 *icmp6;\n  ip6 = tx_ip6(ifp, l2_dst, 58, ip_src, ip_dst, sizeof(*icmp6) + len);\n  icmp6 = (struct icmp6 *) (ip6 + 1);\n  memset(icmp6, 0, sizeof(*icmp6));  // Set csum to 0\n  icmp6->type = type;\n  icmp6->code = code;\n  memcpy(icmp6 + 1, buf, len);  // Copy payload\n  icmp6->csum = 0;              // RFC-4443 2.3, RFC-8200 8.1\n  icmp6->csum = p6csum(ip6, icmp6, sizeof(*icmp6) + len);\n  driver_output(\n      ifp, mg_l2_footer(ifp->l2type, sizeof(*ip6) + sizeof(*icmp6) + len, l2p));\n}\n\n// Neighbor Discovery Protocol, RFC-4861\n// Neighbor Advertisement, 4.4\nstatic void tx_ndp_na(struct mg_tcpip_if *ifp, uint8_t *l2_dst,\n                      uint64_t *ip_src, uint64_t *ip_dst, bool solicited,\n                      uint8_t *l2) {\n  uint8_t data[20 + 16];  // NOTE(): optional len upto 2 hw addr\n  memset(data, 0, sizeof(data));\n  data[0] = solicited ? 0x60 : 0x20;                    // O + S\n  memcpy(data + 4, ip_src, 16);                         // Target address\n  data[20] = 2;                                         // 4.6.1, target hwaddr\n  data[21] = mg_l2_ip6put(ifp->l2type, l2, data + 22);  // option length / 8\n  tx_icmp6(ifp, l2_dst, ip_src, ip_dst, 136, 0, data,\n           20 + (size_t) (8 * data[21]));\n}\n\nstatic void onstate6change(struct mg_tcpip_if *ifp);\n\nstatic void rx_ndp_na(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  struct ndp_na *na = (struct ndp_na *) (pkt->icmp6 + 1);\n  uint8_t *opts = (uint8_t *) (na + 1);\n  if ((na->res[0] & 0x40) == 0) return;  // not \"solicited\"\n  if (*opts++ != 2) return;              // no target hwaddr\n  MG_VERBOSE((\"NDP NA resp from %M\", mg_print_ip6, (char *) &na->addr));\n  if (MG_IP6MATCH(na->addr, ifp->gw6)) {\n    // Got response for the GW NS request. Set ifp->gw6mac and IP6 -> READY\n    uint8_t len = *opts++;  // check valid hwaddr and get it\n    if (!mg_l2_ip6get(ifp->l2type, ifp->gw6mac, opts, len)) return;\n    ifp->gw6_ready = true;\n    if (ifp->state6 == MG_TCPIP_STATE_IP) {\n      ifp->state6 = MG_TCPIP_STATE_READY;\n      onstate6change(ifp);\n    }\n  } else {\n    struct mg_connection *c = getpeer(ifp->mgr, pkt, false);\n    if (c != NULL && c->is_arplooking) {\n      struct connstate *s = (struct connstate *) (c + 1);\n      uint8_t len = *opts++;  // check valid hwaddr and get it\n      if (!mg_l2_ip6get(ifp->l2type, s->mac, opts, len)) return;\n      MG_DEBUG((\"%lu NDP resolved %M -> %M\", c->id, mg_print_ip6,\n                &c->rem.addr.ip6, mg_print_mac, ifp->l2type, s->mac));\n      c->is_arplooking = 0;\n      l2addr_resolved(c);\n    }\n  }\n}\n\n// Neighbor Solicitation, 4.3\nstatic void rx_ndp_ns(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  uint64_t target[2];\n  if (pkt->pay.len < sizeof(target)) return;\n  memcpy(target, pkt->pay.buf + 4, sizeof(target));\n  if (MG_IP6MATCH(target, ifp->ip6ll) || MG_IP6MATCH(target, ifp->ip6)) {\n    uint64_t req[2];  // requester address\n    uint8_t l2[sizeof(struct mg_l2addr)];\n    uint8_t len, *opts = (uint8_t *) pkt->pay.buf + 20;\n    if (*opts++ != 1) return;  // no requester hwaddr (source)\n    len = *opts++;             // check valid hwaddr and get it\n    if (!mg_l2_ip6get(ifp->l2type, l2, opts, len)) return;\n    req[0] = pkt->ip6->src[0], req[1] = pkt->ip6->src[1];  // align to 64-bit\n    tx_ndp_na(ifp, l2, target, req, true, ifp->mac);\n  }\n}\n\n// - use solicited node multicast to resolve a l2 address (l2_addr = NULL)\n// - use unicast to verify presence (l2_addr = neighbor l2 address)\nstatic void tx_ndp_ns(struct mg_tcpip_if *ifp, uint64_t *ip_dst,\n                      uint8_t *l2_addr) {\n  uint8_t payload[4 + 16 + 16];  // NOTE(): 16 --> optional len upto 2 hw addr\n  uint64_t ip_unspec[2] = {0, 0};\n  size_t payload_len = 20;\n  bool mcast = (l2_addr == NULL);\n  uint64_t ip_mcast[2] = {0, 0};\n  uint8_t *l2 = l2_addr;\n\n  memset(payload, 0, sizeof(payload));\n  memcpy(payload + 4, ip_dst, 16);\n  if (mcast) {\n    struct mg_addr ipd;\n    ip6sn(ip_dst, ip_mcast);\n    ipd.addr.ip6[0] = ip_mcast[0], ipd.addr.ip6[1] = ip_mcast[1],\n    ipd.is_ip6 = true;\n    l2 = mg_l2_mapip(ifp->l2type, MG_TCPIP_L2ADDR_MCAST6, &ipd);\n  }\n  payload_len = 20;\n  // TODO(robertc2000): using only link-local IP addr for now\n  // We might consider to add an option to use either link-local or global IP\n  if (!MG_IP6MATCH(ifp->ip6ll, ip_unspec)) {\n    payload[20] = 1;  // 4.6.1, source hwaddr; option length in 8-byte units\n    payload[21] = mg_l2_ip6put(ifp->l2type, ifp->mac, payload + 22);\n    payload_len += 8 * payload[21];\n  }\n  tx_icmp6(ifp, l2, ifp->ip6ll, mcast ? ip_mcast : ip_dst, 135, 0, payload,\n           payload_len);\n}\n\n// Router Solicitation, 4.1\nstatic void tx_ndp_rs(struct mg_tcpip_if *ifp) {\n  uint8_t payload[4 + 16];  // reserved + optional len upto 2 hw addr NOTE()\n  size_t payload_len = 4;\n  uint64_t ip_unspec[2] = {0, 0};\n\n  memset(payload, 0, sizeof(payload));\n\n  if (!MG_IP6MATCH(ifp->ip6ll, ip_unspec)) {\n    payload[4] = 1;  // 4.6.1, source hwaddr; option length in 8-byte units\n    payload[5] = mg_l2_ip6put(ifp->l2type, ifp->mac, payload + 6);\n    payload_len += 8 * payload[5];\n  }\n  tx_icmp6(ifp,\n           mg_l2_mapip(ifp->l2type, MG_TCPIP_L2ADDR_MCAST6,\n                       (struct mg_addr *) &ip6_allrouters),\n           ifp->ip6ll, (uint64_t *) ip6_allrouters.addr.ip6, 133, 0, payload,\n           payload_len);\n  MG_DEBUG((\"NDP Router Solicitation sent\"));\n}\n\nstatic void fill_prefix(uint8_t *dst, uint8_t *src, uint8_t len) {\n  uint8_t full = len / 8;\n  uint8_t rem = len % 8;\n  if (full > 0) memcpy(dst, src, full);\n  if (rem > 0) {\n    uint8_t mask = (uint8_t) (0xFF << (8 - rem));\n    dst[full] |= src[full] & mask;  // mg_l2_genip6() zeroes dst\n  }\n}\n\nstatic bool match_prefix(uint8_t *newp, uint8_t *curp, uint8_t len) {\n  uint8_t full = len / 8;\n  uint8_t rem = len % 8;\n  if (full > 0 && memcmp(curp, newp, full) != 0) return false;\n  if (rem > 0) {\n    uint8_t mask = (uint8_t) (0xFF << (8 - rem));\n    if (curp[full] != (newp[full] & mask)) return false;\n  }\n  return true;\n}\n\nstatic bool fill_global(struct mg_tcpip_if *ifp, uint8_t *prefix,\n                        uint8_t prefix_len) {\n  if (!mg_l2_genip6(ifp->l2type, ifp->ip6, prefix_len, ifp->mac)) return false;\n  fill_prefix((uint8_t *) ifp->ip6, prefix, prefix_len);\n  fill_prefix(ifp->prefix, prefix, prefix_len);\n  ifp->prefix_len = prefix_len;\n  return true;\n}\n\n// Router Advertisement, 4.2\nstatic void rx_ndp_ra(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  if (pkt->pay.len < 12) return;\n  struct ndp_ra *ra = (struct ndp_ra *) (pkt->icmp6 + 1);\n  uint8_t *opts = (uint8_t *) (ra + 1);\n  size_t opt_left = pkt->pay.len - 12;\n  bool gotl2addr = false, gotprefix = false;\n  uint8_t l2[sizeof(struct mg_l2addr)];\n  uint32_t mtu = 0;\n  uint8_t *prefix, prefix_len;\n\n  if (ifp->state6 == MG_TCPIP_STATE_UP) {\n    MG_DEBUG((\"Received NDP RA\"));  // fill gw6 address\n    // parse options\n    while (opt_left >= 2) {\n      uint8_t type = opts[0], len = opts[1];\n      size_t length = (size_t) len * 8;\n      if (length == 0 || length > opt_left) break;  // malformed\n      if (type == 1 && length >= 8) {\n        // Received router's L2 address\n        if (!mg_l2_ip6get(ifp->l2type, l2, opts + 2, len)) break;\n        gotl2addr = true;\n      } else if (type == 5 && length >= 8) {\n        // process MTU if available\n        mtu = mg_ntohl(*(uint32_t *) (opts + 4));\n      } else if (type == 3 && length >= 32) {\n        // process prefix, 4.6.2\n        uint8_t pfx_flags = opts[3];  // L=0x80, A=0x40\n        uint32_t valid = mg_ntohl(*(uint32_t *) (opts + 4));\n        uint32_t pref_lifetime = mg_ntohl(*(uint32_t *) (opts + 8));\n        prefix_len = opts[2];\n        prefix = opts + 16;\n\n        // TODO (robertc2000): handle prefix options if necessary\n        (void) pfx_flags;\n        (void) valid;\n        (void) pref_lifetime;\n\n        gotprefix = true;\n      }\n      opts += length;\n      opt_left -= length;\n    }\n\n    // fill prefix and global\n    if (gotprefix && !fill_global(ifp, prefix, prefix_len)) return;\n    ifp->gw6[0] = pkt->ip6->src[0], ifp->gw6[1] = pkt->ip6->src[1];\n    if (gotl2addr) {\n      memcpy(ifp->gw6mac, l2, sizeof(ifp->gw6mac));\n      ifp->state6 = MG_TCPIP_STATE_READY;\n      ifp->gw6_ready = true;\n    }\n    if (mtu != 0 && ifp->mtu != mtu) {\n      MG_ERROR(\n          (\"got an MTU: %u, that differs from the configured one. \"\n           \"All devices in an IPv6 network should have the same MTU, \"\n           \"using the router's instead...\",\n           mtu));\n      ifp->mtu = (uint16_t) mtu;\n    }\n    if (ifp->state6 != MG_TCPIP_STATE_READY) {\n      tx_ndp_ns(ifp, ifp->gw6, NULL);  // unsolicited GW hwaddr resolution\n      ifp->state6 = MG_TCPIP_STATE_IP;\n    }\n    onstate6change(ifp);\n  }\n}\n\nstatic void rx_icmp6(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  if (!icmp6csum_ok(pkt->ip6, pkt->icmp6)) return;\n  switch (pkt->icmp6->type) {\n    case 128: {  // Echo Request, RFC-4443 4.1\n      uint64_t target[2];\n      target[0] = pkt->ip6->dst[0], target[1] = pkt->ip6->dst[1];\n      if (MG_IP6MATCH(target, ifp->ip6ll) || MG_IP6MATCH(target, ifp->ip6)) {\n        size_t l2_max_overhead = ifp->framesize - ifp->mtu;\n        size_t hlen = sizeof(struct ip6) + sizeof(struct icmp6);\n        size_t room = ifp->tx.len - hlen - l2_max_overhead, plen = pkt->pay.len;\n        struct mg_addr ips;\n        uint8_t *l2addr;\n\n        ips.addr.ip6[0] = pkt->ip6->src[0], ips.addr.ip6[1] = pkt->ip6->src[1];\n        ips.is_ip6 = true;\n        if ((l2addr = get_return_l2addr(ifp, &ips, false, pkt)) == NULL)\n          return;                      // safety net for lousy networks\n        if (plen > room) plen = room;  // Copy (truncated) RX payload to TX\n        // Echo Reply, 4.2\n        tx_icmp6(ifp, l2addr, target, ips.addr.ip6, 129, 0, pkt->pay.buf, plen);\n      }\n    } break;\n    case 134:  // Router Advertisement\n      rx_ndp_ra(ifp, pkt);\n      break;\n    case 135:  // Neighbor Solicitation\n      rx_ndp_ns(ifp, pkt);\n      break;\n    case 136:  // Neighbor Advertisement\n      rx_ndp_na(ifp, pkt);\n      break;\n  }\n}\n\nstatic void onstate6change(struct mg_tcpip_if *ifp) {\n  if (ifp->state6 == MG_TCPIP_STATE_READY) {\n    MG_INFO((\"READY, IP: %M\", mg_print_ip6, &ifp->ip6));\n    MG_INFO((\"       GW: %M\", mg_print_ip6, &ifp->gw6));\n    if (ifp->l2type == MG_TCPIP_L2_ETH)  // TODO(): print other l2\n      MG_INFO((\"      MAC: %M\", mg_print_mac, &ifp->mac));\n  } else if (ifp->state6 == MG_TCPIP_STATE_IP) {\n    if (ifp->gw6[0] != 0 || ifp->gw6[1] != 0)\n      tx_ndp_ns(ifp, ifp->gw6, NULL);  // unsolicited GW hwaddr resolution\n  } else if (ifp->state6 == MG_TCPIP_STATE_UP) {\n    MG_INFO((\"IP: %M\", mg_print_ip6, &ifp->ip6ll));\n  }\n  if (ifp->state6 != MG_TCPIP_STATE_UP && ifp->state6 != MG_TCPIP_STATE_DOWN)\n    mg_tcpip_call(ifp, MG_TCPIP_EV_ST6_CHG, &ifp->state6);\n}\n#endif\n\nstatic uint8_t *tcpip_mapip(struct mg_tcpip_if *ifp, struct mg_addr *ip) {\n#if MG_ENABLE_IPV6\n  if (ip->is_ip6) {\n    if (MG_IP6MATCH(ip->addr.ip6, ip6_allnodes.addr.ip6))  // local broadcast\n      return mg_l2_mapip(ifp->l2type, MG_TCPIP_L2ADDR_MCAST6,\n                         (struct mg_addr *) &ip6_allnodes);\n    if (*ip->addr.ip == 0xFF)  // multicast\n      return mg_l2_mapip(ifp->l2type, MG_TCPIP_L2ADDR_MCAST6, ip);\n  } else\n#endif\n  {  // global/local broadcast\n    if (ip->addr.ip4 == 0xffffffff || ip->addr.ip4 == (ifp->ip | ~ifp->mask))\n      return mg_l2_mapip(ifp->l2type, MG_TCPIP_L2ADDR_BCAST, NULL);\n    if ((*ip->addr.ip & 0xE0) == 0xE0)  // 224 ~ 239 = E0 ~ EF, multicast\n      return mg_l2_mapip(ifp->l2type, MG_TCPIP_L2ADDR_MCAST, ip);\n  }\n  return NULL;\n}\n\nstatic uint8_t *get_return_l2addr(struct mg_tcpip_if *ifp, struct mg_addr *rem,\n                                  bool is_udp, struct pkt *pkt) {\n  uint8_t *l2addr;\n  if (is_udp && (l2addr = tcpip_mapip(ifp, rem)) != NULL)\n    return l2addr;  // broadcast or multicast\n#if MG_ENABLE_IPV6\n  if (rem->is_ip6) {\n    if (rem->addr.ip6[0] == ifp->ip6ll[0] ||\n        match_prefix((uint8_t *) rem->addr.ip6, ifp->prefix, ifp->prefix_len))\n      return mg_l2_getaddr(ifp->l2type, pkt->l2);  // same LAN, get from frame\n    if (ifp->gw6_ready)                            // use the router\n      return ifp->gw6mac;  // ignore source address in frame\n  } else\n#endif\n  {\n    if (ifp->ip != 0 && ((rem->addr.ip4 & ifp->mask) == (ifp->ip & ifp->mask)))\n      return mg_l2_getaddr(ifp->l2type, pkt->l2);  // same LAN, get from frame\n    if (ifp->gw_ready)                             // use the router\n      return ifp->gwmac;  // ignore source address in frame\n  }\n  MG_ERROR((\"%M %s: No way back, can't respond\", mg_print_ip_port, rem,\n            is_udp ? \"UDP\" : \"TCP\"));\n  return NULL;\n}\n\nstatic bool rx_udp(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  struct mg_connection *c = getpeer(ifp->mgr, pkt, true);\n  struct connstate *s;\n  uint8_t *l2addr;\n  if (c == NULL) return false;  // No UDP listener on this port\n  s = (struct connstate *) (c + 1);\n  c->rem.port = pkt->udp->sport;\n#if MG_ENABLE_IPV6\n  if (c->loc.is_ip6) {  // matching of v4/v6 to dest is done bt getpeer()\n    if (!udp6csum_ok(pkt->ip6, pkt->udp)) return false;\n    c->rem.addr.ip6[0] = pkt->ip6->src[0],\n    c->rem.addr.ip6[1] = pkt->ip6->src[1], c->rem.is_ip6 = true;\n  } else\n#endif\n  {\n    if (!udpcsum_ok(pkt->ip, pkt->udp)) return false;\n    c->rem.addr.ip4 = pkt->ip->src;\n  }\n  if ((l2addr = get_return_l2addr(ifp, &c->rem, true, pkt)) == NULL)\n    return false;  // safety net for lousy networks\n  memcpy(s->mac, l2addr, sizeof(s->mac));\n  if (c->recv.len >= MG_MAX_RECV_SIZE) {\n    mg_error(c, \"max_recv_buf_size reached\");\n  } else if (c->recv.size - c->recv.len < pkt->pay.len &&\n             !mg_iobuf_resize(&c->recv, c->recv.len + pkt->pay.len)) {\n    mg_error(c, \"oom\");\n  } else {\n    memcpy(&c->recv.buf[c->recv.len], pkt->pay.buf, pkt->pay.len);\n    c->recv.len += pkt->pay.len;\n    mg_call(c, MG_EV_READ, &pkt->pay.len);\n  }\n  return true;\n}\n\nstatic size_t tx_tcp(struct mg_tcpip_if *ifp, uint8_t *l2_dst,\n                     struct mg_addr *ip_src, struct mg_addr *ip_dst,\n                     uint8_t flags, uint32_t seq, uint32_t ack, const void *buf,\n                     size_t len) {\n  uint8_t *l2p = (uint8_t *) ifp->tx.buf;\n  struct ip *ip = NULL;\n  struct tcp *tcp;\n  uint16_t opts[4 / 2];\n  size_t hlen = sizeof(*tcp);\n#if MG_ENABLE_IPV6\n  struct ip6 *ip6 = NULL;\n#endif\n\n  // Handle any options first, here, to determine header size\n  if (flags & TH_SYN) {  // Send MSS\n    uint16_t mss;\n#if MG_ENABLE_IPV6  // RFC-9293 3.7.1; RFC-6691 2\n    mss = (uint16_t) (ifp->mtu - 60);\n#else\n    mss = (uint16_t) (ifp->mtu - 40);\n#endif\n    opts[0] = mg_htons(0x0204);  // RFC-9293 3.2\n    opts[1] = mg_htons(mss);\n    hlen += sizeof(opts);  // always whole number of 32-bit words\n  }\n\n#if MG_ENABLE_IPV6\n  if (ip_dst->is_ip6) {\n    ip6 =\n        tx_ip6(ifp, l2_dst, 6, ip_src->addr.ip6, ip_dst->addr.ip6, hlen + len);\n    tcp = (struct tcp *) (ip6 + 1);\n  } else\n#endif\n  {\n    ip = tx_ip(ifp, l2_dst, 6, ip_src->addr.ip4, ip_dst->addr.ip4, hlen + len);\n    tcp = (struct tcp *) (ip + 1);\n  }\n  memset(tcp, 0, sizeof(*tcp));\n  memmove(tcp + 1, opts, hlen - sizeof(*tcp));  // copy opts if any\n  if (buf != NULL && len) memmove((uint8_t *) tcp + hlen, buf, len);\n  tcp->sport = ip_src->port;\n  tcp->dport = ip_dst->port;\n  tcp->seq = seq;\n  tcp->ack = ack;\n  tcp->flags = flags;\n  tcp->win = mg_htons(MG_TCPIP_WIN);\n  tcp->off = (uint8_t) (hlen / 4 << 4);\n#if MG_ENABLE_IPV6\n  if (ip_dst->is_ip6) {\n    tcp->csum = p6csum(ip6, tcp, hlen + len);\n  } else\n#endif\n  {\n    tcp->csum = pcsum(ip, tcp, hlen + len);\n  }\n  MG_VERBOSE((\"TCP %M -> %M fl %x len %u\", mg_print_ip_port, ip_src,\n              mg_print_ip_port, ip_dst, tcp->flags, len));\n  return driver_output(\n      ifp, mg_l2_footer(ifp->l2type, PDIFF(l2p, tcp) + hlen + len, l2p));\n}\n\nstatic size_t tx_tcp_ctrlresp(struct mg_tcpip_if *ifp, struct pkt *pkt,\n                              uint8_t flags, uint32_t seqno) {\n  uint32_t ackno = mg_htonl(mg_ntohl(pkt->tcp->seq) + (uint32_t) pkt->pay.len +\n                            ((pkt->tcp->flags & (TH_SYN | TH_FIN)) ? 1 : 0));\n  struct mg_addr ips, ipd;\n  uint8_t *l2addr;\n  memset(&ips, 0, sizeof(ips));\n  memset(&ipd, 0, sizeof(ipd));\n  if (pkt->ip != NULL) {\n    ips.addr.ip4 = pkt->ip->dst;\n    ipd.addr.ip4 = pkt->ip->src;\n  } else {\n    ips.addr.ip6[0] = pkt->ip6->dst[0], ips.addr.ip6[1] = pkt->ip6->dst[1];\n    ipd.addr.ip6[0] = pkt->ip6->src[0], ipd.addr.ip6[1] = pkt->ip6->src[1];\n    ips.is_ip6 = true;\n    ipd.is_ip6 = true;\n  }\n  ips.port = pkt->tcp->dport;\n  ipd.port = pkt->tcp->sport;\n  if ((l2addr = get_return_l2addr(ifp, &ipd, false, pkt)) == NULL)\n    return 0;  // safety net for lousy networks\n  return tx_tcp(ifp, l2addr, &ips, &ipd, flags, seqno, ackno, NULL, 0);\n}\n\nstatic size_t tx_tcp_rst(struct mg_tcpip_if *ifp, struct pkt *pkt, bool toack) {\n  return tx_tcp_ctrlresp(ifp, pkt, toack ? TH_RST : (TH_RST | TH_ACK),\n                         toack ? pkt->tcp->ack : 0);\n}\n\nstatic struct mg_connection *accept_conn(struct mg_connection *lsn,\n                                         struct pkt *pkt, uint16_t mss) {\n  struct connstate *s;\n  uint8_t *l2addr;\n  struct mg_connection *c = mg_alloc_conn(lsn->mgr);\n  if (c == NULL) {\n    MG_ERROR((\"OOM\"));\n    return NULL;\n  }\n  s = (struct connstate *) (c + 1);\n  s->dmss = mss;  // from options in client SYN\n  s->seq = mg_ntohl(pkt->tcp->ack), s->ack = mg_ntohl(pkt->tcp->seq);\n#if MG_ENABLE_IPV6\n  if (lsn->loc.is_ip6) {\n    c->rem.addr.ip6[0] = pkt->ip6->src[0],\n    c->rem.addr.ip6[1] = pkt->ip6->src[1], c->rem.is_ip6 = true;\n    c->loc.addr.ip6[0] = c->mgr->ifp->ip6[0],\n    c->loc.addr.ip6[1] = c->mgr->ifp->ip6[1], c->loc.is_ip6 = true;\n    // TODO(): compare lsn to link-local, or rem as link-local: use ll instead\n  } else\n#endif\n  {\n    c->rem.addr.ip4 = pkt->ip->src;\n    c->loc.addr.ip4 = c->mgr->ifp->ip;\n  }\n  c->rem.port = pkt->tcp->sport;\n  c->loc.port = lsn->loc.port;\n  if ((l2addr = get_return_l2addr(lsn->mgr->ifp, &c->rem, false, pkt)) ==\n      NULL) {\n    free(c);      // safety net for lousy networks, not actually needed\n    return NULL;  // as path has already been checked at SYN (sending SYN+ACK)\n  }\n  memcpy(s->mac, l2addr, sizeof(s->mac));\n  settmout(c, MIP_TTYPE_KEEPALIVE);\n  MG_DEBUG((\"%lu accepted %M\", c->id, mg_print_ip_port, &c->rem));\n  LIST_ADD_HEAD(struct mg_connection, &lsn->mgr->conns, c);\n  c->is_accepted = 1;\n  c->is_hexdumping = lsn->is_hexdumping;\n  c->pfn = lsn->pfn;\n  c->pfn_data = lsn->pfn_data;\n  c->fn = lsn->fn;\n  c->fn_data = lsn->fn_data;\n  c->is_tls = lsn->is_tls;\n  mg_call(c, MG_EV_OPEN, NULL);\n  mg_call(c, MG_EV_ACCEPT, NULL);\n  if (!c->is_tls_hs) c->is_tls = 0;  // user did not call mg_tls_init()\n  return c;\n}\n\nstatic size_t trim_len(struct mg_connection *c, size_t len) {\n  struct mg_tcpip_if *ifp = c->mgr->ifp;\n  size_t l2_max_overhead = ifp->framesize - ifp->mtu;\n  size_t ip_max_h_len = c->rem.is_ip6 ? 40 : 24;  // we don't send options\n  size_t tcp_max_h_len = 60 /* RFC-9293 3.7.1; RFC-6691 2 */, udp_h_len = 8;\n  size_t max_headers_len =\n      ip_max_h_len + (c->is_udp ? udp_h_len : tcp_max_h_len);\n  size_t min_mtu = c->rem.is_ip6 ? 1280 /* RFC-8200, IPv6 minimum */\n                   : c->is_udp   ? 68   /* RFC-791, IP minimum */\n                                 : max_headers_len /* fit full TCP header */;\n  // NOTE(): We are effectively reducing transmitted TCP segment length by 20,\n  // accounting for possible options; though we currently don't send options\n  // except for SYN.\n\n  // If the frame exceeds the available buffer, trim the length.\n  if (len + max_headers_len + l2_max_overhead > ifp->tx.len)\n    len = ifp->tx.len - max_headers_len - l2_max_overhead;\n  // Ensure the MTU isn't lower than the minimum allowed value\n  if (ifp->mtu < min_mtu) {\n    MG_ERROR((\"MTU is lower than minimum, raising to %lu\", min_mtu));\n    ifp->mtu = (uint16_t) min_mtu;\n  }\n  // If the total packet size exceeds the MTU, trim the length\n  if (len + max_headers_len > ifp->mtu) {\n    len = ifp->mtu - max_headers_len;\n    if (c->is_udp) MG_ERROR((\"UDP datagram exceeds MTU. Truncating it.\"));\n  }\n\n  return len;\n}\n\nstatic bool udp_send(struct mg_connection *c, const void *buf, size_t len) {\n  struct mg_tcpip_if *ifp = c->mgr->ifp;\n  struct connstate *s = (struct connstate *) (c + 1);\n  struct mg_addr ips;\n  memset(&ips, 0, sizeof(ips));\n#if MG_ENABLE_IPV6\n  if (c->loc.is_ip6) {\n    ips.addr.ip6[0] = ifp->ip6[0], ips.addr.ip6[1] = ifp->ip6[1],\n    ips.is_ip6 = true;\n    // TODO(): detect link-local (c->rem) and use it\n  } else\n#endif\n  {\n    ips.addr.ip4 = ifp->ip;\n  }\n  ips.port = c->loc.port;\n  return tx_udp(ifp, s->mac, &ips, &c->rem, buf, len);\n}\n\nlong mg_io_send(struct mg_connection *c, const void *buf, size_t len) {\n  struct connstate *s = (struct connstate *) (c + 1);\n  len = trim_len(c, len);\n  if (c->is_udp) {\n    if (!udp_send(c, buf, len)) return MG_IO_WAIT;\n  } else {  // TCP, cap to peer's MSS\n    struct mg_tcpip_if *ifp = c->mgr->ifp;\n    size_t sent;\n    if (len > s->dmss) len = s->dmss;  // RFC-6691: reduce if sending opts\n    sent = tx_tcp(ifp, s->mac, &c->loc, &c->rem, TH_PUSH | TH_ACK,\n                  mg_htonl(s->seq), mg_htonl(s->ack), buf, len);\n    if (sent == 0) {\n      return MG_IO_WAIT;\n    } else if (sent == (size_t) -1) {\n      return MG_IO_ERR;\n    } else {\n      s->seq += (uint32_t) len;\n      if (s->ttype == MIP_TTYPE_ACK) settmout(c, MIP_TTYPE_KEEPALIVE);\n    }\n  }\n  return (long) len;\n}\n\nstatic void handle_tls_recv(struct mg_connection *c) {\n  size_t avail = mg_tls_pending(c);\n  size_t min = avail > MG_MAX_RECV_SIZE ? MG_MAX_RECV_SIZE : avail;\n  struct mg_iobuf *io = &c->recv;\n  if (io->size - io->len < min && !mg_iobuf_resize(io, io->len + min)) {\n    mg_error(c, \"oom\");\n  } else {\n    // Decrypt data directly into c->recv\n    long n = mg_tls_recv(c, io->buf != NULL ? &io->buf[io->len] : io->buf,\n                         io->size - io->len);\n    if (n == MG_IO_ERR) {\n      mg_error(c, \"TLS recv error\");\n    } else if (n > 0) {\n      // Decrypted successfully - trigger MG_EV_READ\n      io->len += (size_t) n;\n      mg_call(c, MG_EV_READ, &n);\n    }  // else n < 0: outstanding data to be moved to c->recv\n  }\n}\n\nstatic void read_conn(struct mg_connection *c, struct pkt *pkt) {\n  struct connstate *s = (struct connstate *) (c + 1);\n  struct mg_iobuf *io = c->is_tls ? &c->rtls : &c->recv;\n  uint32_t seq = mg_ntohl(pkt->tcp->seq);\n  if (pkt->tcp->flags & TH_FIN) {\n    uint8_t flags = TH_ACK;\n    if (mg_ntohl(pkt->tcp->seq) != s->ack) {\n      MG_VERBOSE((\"ignoring FIN, %x != %x\", mg_ntohl(pkt->tcp->seq), s->ack));\n      tx_tcp(c->mgr->ifp, s->mac, &c->loc, &c->rem, TH_ACK, mg_htonl(s->seq),\n             mg_htonl(s->ack), \"\", 0);\n      return;\n    }\n    // If we initiated the closure, we reply with ACK upon receiving FIN\n    // If we didn't initiate it, we reply with FIN as part of the normal TCP\n    // closure process\n    s->ack = (uint32_t) (mg_htonl(pkt->tcp->seq) + pkt->pay.len + 1);\n    s->fin_rcvd = true;\n    if (c->is_draining && s->ttype == MIP_TTYPE_FIN) {\n      if (s->seq == mg_htonl(pkt->tcp->ack)) {  // Simultaneous closure ?\n        s->seq++;                               // Yes. Increment our SEQ\n      } else {                                  // Otherwise,\n        s->seq = mg_htonl(pkt->tcp->ack);       // Set to peer's ACK\n      }\n      s->twclosure = true;\n    } else {\n      flags |= TH_FIN;\n      c->is_draining = 1;\n      settmout(c, MIP_TTYPE_FIN);\n    }\n    tx_tcp(c->mgr->ifp, s->mac, &c->loc, &c->rem, flags, mg_htonl(s->seq),\n           mg_htonl(s->ack), \"\", 0);\n    if (pkt->pay.len == 0) return;  // if no data, we're done\n  } else if (pkt->pay.len <= 1 && mg_ntohl(pkt->tcp->seq) == s->ack - 1) {\n    // Keep-Alive (RFC-9293 3.8.4, allow erroneous implementations)\n    MG_VERBOSE((\"%lu keepalive ACK\", c->id));\n    tx_tcp(c->mgr->ifp, s->mac, &c->loc, &c->rem, TH_ACK, mg_htonl(s->seq),\n           mg_htonl(s->ack), NULL, 0);\n    return;                        // no data to process\n  } else if (pkt->pay.len == 0) {  // this is an ACK\n    if (s->fin_rcvd && s->ttype == MIP_TTYPE_FIN) s->twclosure = true;\n    return;  // no data to process\n  } else if (seq != s->ack) {\n    uint32_t ack = (uint32_t) (mg_htonl(pkt->tcp->seq) + pkt->pay.len);\n    if (s->ack == ack) {\n      MG_VERBOSE((\"ignoring duplicate pkt\"));\n    } else {\n      MG_VERBOSE((\"SEQ != ACK: %x %x %x\", seq, s->ack, ack));\n      tx_tcp(c->mgr->ifp, s->mac, &c->loc, &c->rem, TH_ACK, mg_htonl(s->seq),\n             mg_htonl(s->ack), \"\", 0);\n    }\n    return;  // drop it\n  } else if (io->size - io->len < pkt->pay.len &&\n             !mg_iobuf_resize(io, io->len + pkt->pay.len)) {\n    mg_error(c, \"oom\");\n    return;  // drop it\n  }\n  // Copy TCP payload into the IO buffer. If the connection is plain text,\n  // we copy to c->recv. If the connection is TLS, this data is encrypted,\n  // therefore we copy that encrypted data to the c->rtls iobuffer instead,\n  // and then call mg_tls_recv() to decrypt it. NOTE: mg_tls_recv() will\n  // call back mg_io_recv() which grabs raw data from c->rtls\n  memcpy(&io->buf[io->len], pkt->pay.buf, pkt->pay.len);\n  io->len += pkt->pay.len;\n  MG_VERBOSE((\"%lu SEQ %x -> %x\", c->id, mg_htonl(pkt->tcp->seq), s->ack));\n  // Advance ACK counter\n  s->ack = (uint32_t) (mg_htonl(pkt->tcp->seq) + pkt->pay.len);\n  s->unacked += pkt->pay.len;\n  // size_t diff = s->acked <= s->ack ? s->ack - s->acked : s->ack;\n  if (s->unacked > MG_TCPIP_WIN / 2 && s->acked != s->ack) {\n    // Send ACK immediately\n    MG_VERBOSE((\"%lu imm ACK %lu\", c->id, s->acked));\n    tx_tcp(c->mgr->ifp, s->mac, &c->loc, &c->rem, TH_ACK, mg_htonl(s->seq),\n           mg_htonl(s->ack), NULL, 0);\n    s->unacked = 0;\n    s->acked = s->ack;\n    if (s->ttype != MIP_TTYPE_KEEPALIVE) settmout(c, MIP_TTYPE_KEEPALIVE);\n  } else {\n    // if not already running, setup a timer to send an ACK later\n    if (s->ttype != MIP_TTYPE_ACK) settmout(c, MIP_TTYPE_ACK);\n  }\n  if (c->is_tls) {\n    c->is_tls_hs ? mg_tls_handshake(c) : handle_tls_recv(c);\n  } else {\n    // Plain text connection, data is already in c->recv, trigger MG_EV_READ\n    mg_call(c, MG_EV_READ, &pkt->pay.len);\n  }\n}\n\n// TCP backlog\nstruct mg_backlog {\n  uint16_t port, mss;  // use port=0 for available entries\n  uint8_t age;\n};\n\nstatic int backlog_insert(struct mg_connection *c, uint16_t port,\n                          uint16_t mss) {\n  struct mg_backlog *p = (struct mg_backlog *) c->data;\n  size_t i;\n  for (i = 0; i < sizeof(c->data) / sizeof(*p); i++) {\n    if (p[i].port != 0) continue;\n    p[i].age = 2;  // remove after two calls, average 1.5 call rate\n    p[i].port = port, p[i].mss = mss;\n    return (int) i;\n  }\n  return -1;\n}\n\nstatic struct mg_backlog *backlog_retrieve(struct mg_connection *c,\n                                           uint16_t key, uint16_t port) {\n  struct mg_backlog *p = (struct mg_backlog *) c->data;\n  if (key >= sizeof(c->data) / sizeof(*p)) return NULL;\n  if (p[key].port != port) return NULL;\n  p += key;\n  return p;\n}\n\nstatic void backlog_remove(struct mg_connection *c, uint16_t key) {\n  struct mg_backlog *p = (struct mg_backlog *) c->data;\n  p[key].port = 0;\n}\n\nstatic void backlog_maintain(struct mg_connection *c) {\n  struct mg_backlog *p = (struct mg_backlog *) c->data;\n  size_t i;  // dec age and remove those where it reaches 0\n  for (i = 0; i < sizeof(c->data) / sizeof(*p); i++) {\n    if (p[i].port == 0) continue;\n    if (p[i].age != 0) --p[i].age;\n    if (p[i].age == 0) p[i].port = 0;\n  }\n}\n\nstatic void backlog_poll(struct mg_mgr *mgr) {\n  struct mg_connection *c = NULL;\n  for (c = mgr->conns; c != NULL; c = c->next) {\n    if (!c->is_udp && c->is_listening) backlog_maintain(c);\n  }\n}\n\n// process options (MSS)\nstatic void handle_opt(struct connstate *s, struct tcp *tcp, bool ip6) {\n  uint8_t *opts = (uint8_t *) (tcp + 1);\n  int len = 4 * ((int) (tcp->off >> 4) - ((int) sizeof(*tcp) / 4));\n  s->dmss = ip6 ? 1220 : 536;  // assume default, RFC-9293 3.7.1\n  while (len > 0) {            // RFC-9293 3.1 3.2\n    uint8_t kind = opts[0], optlen = 1;\n    if (kind != 1) {         // No-Operation\n      if (kind == 0) break;  // End of Option List\n      optlen = opts[1];\n      if (kind == 2 && optlen == 4)  // set received MSS\n        s->dmss = (uint16_t) (((uint16_t) opts[2] << 8) + opts[3]);\n    }\n    MG_VERBOSE((\"kind: %u, optlen: %u, len: %d\\n\", kind, optlen, len));\n    opts += optlen;\n    len -= optlen;\n  }\n}\n\nstatic void rx_tcp(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  struct mg_connection *c = getpeer(ifp->mgr, pkt, false);\n  struct connstate *s = c == NULL ? NULL : (struct connstate *) (c + 1);\n#if MG_ENABLE_IPV6  // matching of v4/v6 to dest is done by getpeer()\n  if (pkt->ip6 != NULL && !tcp6csum_ok(pkt->ip6, pkt->tcp)) return;\n#endif\n  if (pkt->ip != NULL && !tcpcsum_ok(pkt->ip, pkt->tcp)) return;\n  pkt->tcp->flags &= TH_STDFLAGS;  // tolerate creative usage (ECN, ?)\n  // Order is VERY important; RFC-9293 3.5.2\n  // - check clients (Group 1) and established connections (Group 3)\n  if (c != NULL && c->is_connecting && pkt->tcp->flags == (TH_SYN | TH_ACK)) {\n    // client got a server connection accept\n    handle_opt(s, pkt->tcp, pkt->ip6 != NULL);  // process options (MSS)\n    s->seq = mg_ntohl(pkt->tcp->ack), s->ack = mg_ntohl(pkt->tcp->seq) + 1;\n    tx_tcp_ctrlresp(ifp, pkt, TH_ACK, pkt->tcp->ack);\n    c->is_connecting = 0;  // Client connected\n    settmout(c, MIP_TTYPE_KEEPALIVE);\n    mg_call(c, MG_EV_CONNECT, NULL);  // Let user know\n    if (c->is_tls_hs) mg_tls_handshake(c);\n    if (!c->is_tls_hs) c->is_tls = 0;  // user did not call mg_tls_init()\n  } else if (c != NULL && c->is_connecting && pkt->tcp->flags != TH_ACK) {\n    mg_error(c, \"connection refused\");\n  } else if (c != NULL && pkt->tcp->flags & TH_RST) {\n    // TODO(): validate RST is within window (and optional with proper ACK)\n    mg_error(c, \"peer RST\");  // RFC-1122 4.2.2.13\n  } else if (c != NULL) {\n    // process segment\n    s->tmiss = 0;                         // Reset missed keep-alive counter\n    if (s->ttype == MIP_TTYPE_KEEPALIVE)  // Advance keep-alive timer\n      settmout(c,\n               MIP_TTYPE_KEEPALIVE);  // unless a former ACK timeout is pending\n    read_conn(c, pkt);  // Override timer with ACK timeout if needed\n  } else\n    // - we don't listen on that port; RFC-9293 3.5.2 Group 1\n    // - check listening connections; RFC-9293 3.5.2 Group 2\n    if ((c = getpeer(ifp->mgr, pkt, true)) == NULL) {\n      // not listening on that port\n      if (!(pkt->tcp->flags & TH_RST)) {\n        tx_tcp_rst(ifp, pkt, pkt->tcp->flags & TH_ACK);\n      }  // else silently discard\n    } else if (pkt->tcp->flags == TH_SYN) {\n      // listener receives a connection request\n      struct connstate cs;  // At this point, s = NULL, there is no connection\n      int key;\n      uint32_t isn;\n      if (pkt->tcp->sport != 0) {\n        handle_opt(&cs, pkt->tcp, pkt->ip6 != NULL);  // process options (MSS)\n        key = backlog_insert(c, pkt->tcp->sport,\n                             cs.dmss);  // backlog options (MSS)\n        if (key < 0) return;  // no room in backlog, discard SYN, client retries\n        // Use peer's src port and bl key as ISN, to later identify the\n        // handshake\n        isn = (mg_htonl(((uint32_t) key << 16) | mg_ntohs(pkt->tcp->sport)));\n        if (tx_tcp_ctrlresp(ifp, pkt, TH_SYN | TH_ACK, isn) == 0)\n          backlog_remove(c, (uint16_t) key);  // safety net for lousy networks\n      }  // what should we do when port=0 ? Linux takes port 0 as any other\n         // port\n    } else if (pkt->tcp->flags == TH_ACK) {\n      // listener receives an ACK\n      struct mg_backlog *b = NULL;\n      if ((uint16_t) (mg_htonl(pkt->tcp->ack) - 1) ==\n          mg_htons(pkt->tcp->sport)) {\n        uint16_t key = (uint16_t) ((mg_htonl(pkt->tcp->ack) - 1) >> 16);\n        b = backlog_retrieve(c, key, pkt->tcp->sport);\n        if (b != NULL) {                // ACK is a response to a SYN+ACK\n          accept_conn(c, pkt, b->mss);  // pass options\n          backlog_remove(c, key);\n        }  // else not an actual match, reset\n      }\n      if (b == NULL) tx_tcp_rst(ifp, pkt, true);\n    } else if (pkt->tcp->flags & TH_RST) {\n      // silently discard\n    } else if (pkt->tcp->flags & TH_ACK) {  // ACK + something else != RST\n      tx_tcp_rst(ifp, pkt, true);\n    } else if (pkt->tcp->flags & TH_SYN) {  // SYN + something else != ACK\n      tx_tcp_rst(ifp, pkt, false);\n    }  // else  silently discard\n}\n\nstatic void rx_ip(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  uint8_t ihl;\n  uint16_t frag, len;\n  if (pkt->pay.len < sizeof(*pkt->ip)) return;  // Truncated\n  if ((pkt->ip->ver >> 4) != 4) return;         // Not IP\n  ihl = pkt->ip->ver & 0x0F;\n  if (ihl < 5) return;                              // bad IHL\n  if (pkt->pay.len < (uint16_t) (ihl * 4)) return;  // Truncated / malformed\n  // There can be link padding, take length from IP header\n  len = mg_ntohs(pkt->ip->len);  // IP datagram length\n  if (len < (uint16_t) (ihl * 4) || len > pkt->pay.len) return;  // malformed\n  pkt->pay.len = len;                      // strip padding\n  mkpay(pkt, (uint32_t *) pkt->ip + ihl);  // account for opts\n  if (!ipcsum_ok(pkt->ip)) return;\n  frag = mg_ntohs(pkt->ip->frag);\n  if (frag & IP_MORE_FRAGS_MSK || frag & IP_FRAG_OFFSET_MSK) {\n    struct mg_connection *c;\n    if (pkt->ip->proto == 17) pkt->udp = (struct udp *) (pkt->pay.buf);\n    if (pkt->ip->proto == 6) pkt->tcp = (struct tcp *) (pkt->pay.buf);\n    c = getpeer(ifp->mgr, pkt, false);\n    if (c) mg_error(c, \"Received fragmented packet\");\n  } else if (pkt->ip->proto == 1) {\n    pkt->icmp = (struct icmp *) (pkt->pay.buf);\n    if (pkt->pay.len < sizeof(*pkt->icmp)) return;\n    mkpay(pkt, pkt->icmp + 1);\n    rx_icmp(ifp, pkt);\n  } else if (pkt->ip->proto == 17) {\n    pkt->udp = (struct udp *) (pkt->pay.buf);\n    if (pkt->pay.len < sizeof(*pkt->udp)) return;  // truncated\n    // Take length from UDP header\n    len = mg_ntohs(pkt->udp->len);  // UDP datagram length\n    if (len < sizeof(*pkt->udp) || len > pkt->pay.len) return;  // malformed\n    pkt->pay.len = len;  // strip excess data\n    mkpay(pkt, pkt->udp + 1);\n    MG_VERBOSE((\"UDP %M:%hu -> %M:%hu len %u\", mg_print_ip4, &pkt->ip->src,\n                mg_ntohs(pkt->udp->sport), mg_print_ip4, &pkt->ip->dst,\n                mg_ntohs(pkt->udp->dport), (int) pkt->pay.len));\n    if (ifp->enable_dhcp_client && pkt->udp->dport == mg_htons(68)) {\n      pkt->dhcp = (struct dhcp *) (pkt->udp + 1);\n      mkpay(pkt, &pkt->dhcp->options);\n      rx_dhcp_client(ifp, pkt);\n    } else if (ifp->enable_dhcp_server && pkt->udp->dport == mg_htons(67)) {\n      pkt->dhcp = (struct dhcp *) (pkt->udp + 1);\n      mkpay(pkt, &pkt->dhcp->options);\n      rx_dhcp_server(ifp, pkt);\n    } else if (!rx_udp(ifp, pkt)) {\n      // Should send ICMP Destination Unreachable for unicasts, but keep\n      // silent\n    }\n  } else if (pkt->ip->proto == 6) {\n    uint8_t off;\n    pkt->tcp = (struct tcp *) (pkt->pay.buf);\n    if (pkt->pay.len < sizeof(*pkt->tcp)) return;\n    off = pkt->tcp->off >> 4;  // account for opts\n    if (pkt->pay.len < (uint16_t) (4 * off)) return;\n    mkpay(pkt, (uint32_t *) pkt->tcp + off);\n    MG_VERBOSE((\"TCP %M:%hu -> %M:%hu len %u\", mg_print_ip4, &pkt->ip->src,\n                mg_ntohs(pkt->tcp->sport), mg_print_ip4, &pkt->ip->dst,\n                mg_ntohs(pkt->tcp->dport), (int) pkt->pay.len));\n    rx_tcp(ifp, pkt);\n  } else {\n    MG_DEBUG((\"Unknown IP proto %x\", (int) pkt->ip->proto));\n    if (mg_log_level >= MG_LL_VERBOSE)\n      mg_hexdump(pkt->ip, pkt->pay.len >= 32 ? 32 : pkt->pay.len);\n  }\n}\n\n#if MG_ENABLE_IPV6\nstatic void rx_ip6(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  uint16_t len = 0, plen;\n  uint8_t next, *nhdr;\n  bool loop = true;\n  if (pkt->pay.len < sizeof(*pkt->ip6)) return;  // Truncated\n  if ((pkt->ip6->ver >> 4) != 0x6) return;       // Not IPv6\n  plen = mg_ntohs(pkt->ip6->plen);\n  if (plen > (pkt->pay.len - sizeof(*pkt->ip6))) return;  // malformed\n  next = pkt->ip6->next;\n  nhdr = (uint8_t *) (pkt->ip6 + 1);\n  while (loop) {\n    switch (next) {\n      case 0:   // Hop-by-Hop 4.3\n      case 43:  // Routing 4.4\n      case 60:  // Destination Options 4.6\n      case 51:  // Authentication RFC-4302\n        MG_INFO((\"IPv6 extension header %d\", (int) next));\n        next = nhdr[0];\n        len += (uint16_t) (8 * (nhdr[1] + 1));\n        nhdr += 8 * (nhdr[1] + 1);\n        break;\n      case 44:  // Fragment 4.5\n      {\n        struct mg_connection *c;\n        if (nhdr[0] == 17) pkt->udp = (struct udp *) (pkt->pay.buf);\n        if (nhdr[0] == 6) pkt->tcp = (struct tcp *) (pkt->pay.buf);\n        c = getpeer(ifp->mgr, pkt, false);\n        if (c) mg_error(c, \"Received fragmented packet\");\n      }\n        return;\n      case 59:  // No Next Header 4.7\n        return;\n      case 50:  // IPsec ESP RFC-4303, unsupported\n      default:\n        loop = false;\n        break;\n    }\n  }\n  if (len >= plen) return;\n  // There can be link padding, take payload length from IPv6 header - options\n  pkt->pay.buf = (char *) nhdr;\n  pkt->pay.len = plen - len;\n  if (next == 58) {\n    pkt->icmp6 = (struct icmp6 *) (pkt->pay.buf);\n    if (pkt->pay.len < sizeof(*pkt->icmp6)) return;\n    mkpay(pkt, pkt->icmp6 + 1);\n    MG_DEBUG((\"ICMPv6 %M -> %M len %u\", mg_print_ip6, &pkt->ip6->src,\n              mg_print_ip6, &pkt->ip6->dst, (int) pkt->pay.len));\n    rx_icmp6(ifp, pkt);\n  } else if (next == 17) {\n    pkt->udp = (struct udp *) (pkt->pay.buf);\n    if (pkt->pay.len < sizeof(*pkt->udp)) return;\n    // Take length from UDP header\n    len = mg_ntohs(pkt->udp->len);  // UDP datagram length\n    if (len < sizeof(*pkt->udp) || len > pkt->pay.len) return;  // malformed\n    pkt->pay.len = len;  // strip excess data\n    mkpay(pkt, pkt->udp + 1);\n    MG_DEBUG((\"UDP %M:%hu -> %M:%hu len %u\", mg_print_ip6, &pkt->ip6->src,\n              mg_ntohs(pkt->udp->sport), mg_print_ip6, &pkt->ip6->dst,\n              mg_ntohs(pkt->udp->dport), (int) pkt->pay.len));\n    if (ifp->enable_dhcp6_client && pkt->udp->dport == mg_htons(546)) {\n      pkt->dhcp6 = (struct dhcp6 *) (pkt->udp + 1);\n      mkpay(pkt, pkt->dhcp6 + 1);\n      // rx_dhcp6_client(ifp, pkt);\n#if 0\n    } else if (ifp->enable_dhcp_server && pkt->udp->dport == mg_htons(547)) {\n      pkt->dhcp6 = (struct dhcp6 *) (pkt->udp + 1);\n      mkpay(pkt, pkt->dhcp6 + 1);\n      rx_dhcp6_server(ifp, pkt);\n#endif\n    } else if (!rx_udp(ifp, pkt)) {\n      // Should send ICMPv6 Destination Unreachable for unicasts, keep silent\n    }\n  } else if (next == 6) {\n    uint8_t off;\n    pkt->tcp = (struct tcp *) (pkt->pay.buf);\n    if (pkt->pay.len < sizeof(*pkt->tcp)) return;\n    off = pkt->tcp->off >> 4;  // account for opts\n    if (pkt->pay.len < (uint16_t) (4 * off)) return;\n    mkpay(pkt, (uint32_t *) pkt->tcp + off);\n    MG_DEBUG((\"TCP %M:%hu -> %M:%hu len %u\", mg_print_ip6, &pkt->ip6->src,\n              mg_ntohs(pkt->tcp->sport), mg_print_ip6, &pkt->ip6->dst,\n              mg_ntohs(pkt->tcp->dport), (int) pkt->pay.len));\n    rx_tcp(ifp, pkt);\n  } else {\n    MG_DEBUG((\"Unknown IPv6 next hdr %x\", (int) next));\n    if (mg_log_level >= MG_LL_VERBOSE)\n      mg_hexdump(pkt->ip6, pkt->pay.len >= 32 ? 32 : pkt->pay.len);\n  }\n}\n#else\n#define rx_ip6(x, y)\n#endif\n\nstatic void mg_tcpip_rx(struct mg_tcpip_if *ifp, void *buf, size_t len) {\n  struct pkt pkt;\n  enum mg_l2proto proto;\n  memset(&pkt, 0, sizeof(pkt));\n  pkt.raw.buf = (char *) buf;\n  pkt.raw.len = len;\n  pkt.l2 = (uint8_t *) pkt.raw.buf;\n  if (!mg_l2_rx(ifp, &proto, &pkt.pay, &pkt.raw)) return;\n  if (proto == MG_TCPIP_L2PROTO_ARP) {\n    pkt.arp = (struct arp *) (pkt.pay.buf);\n    if (pkt.pay.len < sizeof(*pkt.arp)) return;  // Truncated\n    mg_tcpip_call(ifp, MG_TCPIP_EV_ARP, &pkt.raw);\n    rx_arp(ifp, &pkt);\n  } else if (proto == MG_TCPIP_L2PROTO_IPV6) {\n    pkt.ip6 = (struct ip6 *) (pkt.pay.buf);\n    rx_ip6(ifp, &pkt);\n  } else if (proto == MG_TCPIP_L2PROTO_IPV4) {\n    pkt.ip = (struct ip *) (pkt.pay.buf);\n    rx_ip(ifp, &pkt);\n  }\n}\n\nstatic void mg_ip_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->state == MG_TCPIP_STATE_DOWN) return;\n  // DHCP RFC-2131 (4.4)\n  if (ifp->enable_dhcp_client && s1) {\n    if (ifp->state == MG_TCPIP_STATE_UP) {\n      tx_dhcp_discover(ifp);  // INIT (4.4.1)\n    } else if (ifp->state == MG_TCPIP_STATE_READY &&\n               ifp->lease_expire > 0) {  // BOUND / RENEWING / REBINDING\n      if (ifp->now >= ifp->lease_expire) {\n        ifp->state = MG_TCPIP_STATE_UP, ifp->ip = 0;  // expired, release IP\n        onstatechange(ifp);\n      } else if (ifp->now + 30UL * 60UL * 1000UL > ifp->lease_expire &&\n                 ((ifp->now / 1000) % 60) == 0) {\n        // hack: 30 min before deadline, try to rebind (4.3.6) every min\n        tx_dhcp_request_re(\n            ifp, mg_l2_mapip(ifp->l2type, MG_TCPIP_L2ADDR_BCAST, NULL), ifp->ip,\n            0xffffffff);\n      }  // TODO(): Handle T1 (RENEWING) and T2 (REBINDING) (4.4.5)\n    }\n  }\n}\nstatic void mg_ip_link(struct mg_tcpip_if *ifp, bool up) {\n  bool current = ifp->state != MG_TCPIP_STATE_DOWN;\n  if (!up && ifp->enable_dhcp_client) ifp->ip = 0;\n  if (up != current) {  // link state has changed\n    ifp->state = up == false                               ? MG_TCPIP_STATE_DOWN\n                 : ifp->enable_dhcp_client || ifp->ip == 0 ? MG_TCPIP_STATE_UP\n                                                           : MG_TCPIP_STATE_IP;\n    onstatechange(ifp);\n  } else if (!ifp->enable_dhcp_client && ifp->state == MG_TCPIP_STATE_UP &&\n             ifp->ip) {\n    ifp->state = MG_TCPIP_STATE_IP;  // ifp->fn has set an IP\n    onstatechange(ifp);\n  }\n}\n\n#if MG_ENABLE_IPV6\nstatic void mg_ip6_poll(struct mg_tcpip_if *ifp, bool s1) {\n  if (ifp->state6 == MG_TCPIP_STATE_DOWN) return;\n  if (ifp->enable_slaac && s1 && ifp->state6 == MG_TCPIP_STATE_UP)\n    tx_ndp_rs(ifp);\n}\nstatic void mg_ip6_link(struct mg_tcpip_if *ifp, bool up) {\n  bool current = ifp->state6 != MG_TCPIP_STATE_DOWN;\n  if (!up && ifp->enable_slaac) ifp->ip6[0] = ifp->ip6[1] = 0;\n  if (up != current) {  // link state has changed\n    ifp->state6 = !up                                     ? MG_TCPIP_STATE_DOWN\n                  : ifp->enable_slaac || ifp->ip6[0] == 0 ? MG_TCPIP_STATE_UP\n                                                          : MG_TCPIP_STATE_IP;\n    onstate6change(ifp);\n  } else if (!ifp->enable_slaac && ifp->state6 == MG_TCPIP_STATE_UP &&\n             ifp->ip6[0]) {\n    ifp->state6 = MG_TCPIP_STATE_IP;  // ifp->fn has set an IP\n    onstate6change(ifp);\n  }\n}\n#else\n#define mg_ip6_poll(x, y)\n#define mg_ip6_link(x, y)\n#endif\n\nstatic void mg_tcpip_poll(struct mg_tcpip_if *ifp, uint64_t now) {\n  struct mg_connection *c;\n  bool expired_1000ms = mg_timer_expired(&ifp->timer_1000ms, 1000, now);\n  ifp->now = now;\n\n  if (expired_1000ms) {\n#if MG_ENABLE_TCPIP_PRINT_DEBUG_STATS\n    const char *names[] = {\"down\", \"up\", \"req\", \"ip\", \"ready\"};\n    size_t max = sizeof(names) / sizeof(char *);\n    unsigned int state = ifp->state >= max ? max - 1 : ifp->state;\n    MG_INFO((\"Status: %s, IP: %M, rx:%u, tx:%u, dr:%u, er:%u\", names[state],\n             mg_print_ip4, &ifp->ip, ifp->nrecv, ifp->nsent, ifp->ndrop,\n             ifp->nerr));\n#if MG_ENABLE_IPV6\n    state = ifp->state6 >= max ? max - 1 : ifp->state6;\n    if (state > MG_TCPIP_STATE_UP)\n      MG_INFO((\"Status: %s, IPv6: %M\", names[state], mg_print_ip6, &ifp->ip6));\n#endif\n#endif\n    backlog_poll(ifp->mgr);\n  }\n  // Handle gw ARP request timeout, order is important\n  if (expired_1000ms && ifp->state == MG_TCPIP_STATE_IP) {\n    ifp->state = MG_TCPIP_STATE_READY;  // keep best-effort MAC or poison mark\n    onstatechange(ifp);\n  }\n  if (expired_1000ms && ifp->state == MG_TCPIP_STATE_READY && !ifp->gw_ready &&\n      ifp->gw != 0)\n    mg_tcpip_arp_request(ifp, ifp->gw, NULL);  // retry GW ARP request\n#if MG_ENABLE_IPV6\n  // Handle gw NS/NA req/resp timeout, order is important\n  if (expired_1000ms && ifp->state6 == MG_TCPIP_STATE_IP) {\n    ifp->state6 = MG_TCPIP_STATE_READY;  // keep best-effort MAC or poison mark\n    onstate6change(ifp);\n  }\n  if (expired_1000ms && ifp->state == MG_TCPIP_STATE_READY && !ifp->gw6_ready &&\n      (ifp->gw6[0] != 0 || ifp->gw6[1] != 0))\n    tx_ndp_ns(ifp, ifp->gw6, NULL);  // retry GW hwaddr resolution\n#endif\n\n  // poll driver\n  if (ifp->driver->poll) {\n    bool up = ifp->driver->poll(ifp, expired_1000ms);\n    // Handle physical interface up/down status, ifp->state rules over state6\n    if (expired_1000ms) {\n      mg_ip_link(ifp, up);   // Handle IPv4\n      mg_ip6_link(ifp, up);  // Handle IPv6\n      if (ifp->state == MG_TCPIP_STATE_DOWN) MG_ERROR((\"Network is down\"));\n      mg_tcpip_call(ifp, MG_TCPIP_EV_TIMER_1S, NULL);\n    }\n  }\n\n  mg_ip_poll(ifp, expired_1000ms);   // Handle IPv4\n  mg_ip6_poll(ifp, expired_1000ms);  // Handle IPv6\n\n  if (ifp->state == MG_TCPIP_STATE_DOWN) return;\n  // Read data from the network\n  if (ifp->driver->rx != NULL) {  // Simple polling driver, returns one frame\n    size_t len =\n        ifp->driver->rx(ifp->recv_queue.buf, ifp->recv_queue.size, ifp);\n    if (len > 0) {\n      ifp->nrecv++;\n      mg_tcpip_rx(ifp, ifp->recv_queue.buf, len);\n    }\n  } else {  // Complex poll / Interrupt-based driver. Queues recvd frames\n    char *buf;\n    size_t len, cnt = 7;  // Max 7 packets to fetch\n    while (cnt-- > 0 && (len = mg_queue_next(&ifp->recv_queue, &buf)) > 0) {\n      mg_tcpip_rx(ifp, buf, len);\n      mg_queue_del(&ifp->recv_queue, len);\n    }\n  }\n\n  // Process timeouts\n  for (c = ifp->mgr->conns; c != NULL; c = c->next) {\n    struct connstate *s = (struct connstate *) (c + 1);\n    if ((c->is_udp && !c->is_arplooking) || c->is_listening || c->is_resolving)\n      continue;\n    if (ifp->now > s->timer) {\n      if (s->ttype == MIP_TTYPE_ARP) {\n        mg_error(c, \"ARP timeout\");\n      } else if (c->is_udp) {\n        continue;\n      } else if (s->ttype == MIP_TTYPE_ACK && s->acked != s->ack) {\n        MG_VERBOSE((\"%lu ack %x %x\", c->id, s->seq, s->ack));\n        tx_tcp(ifp, s->mac, &c->loc, &c->rem, TH_ACK, mg_htonl(s->seq),\n               mg_htonl(s->ack), NULL, 0);\n        s->acked = s->ack;\n      } else if (s->ttype == MIP_TTYPE_SYN) {\n        mg_error(c, \"Connection timeout\");\n      } else if (s->ttype == MIP_TTYPE_FIN) {\n        c->is_closing = 1;\n        continue;\n      } else {\n        if (s->tmiss++ > 2) {\n          mg_error(c, \"keepalive\");\n        } else {\n          MG_VERBOSE((\"%lu keepalive\", c->id));\n          tx_tcp(ifp, s->mac, &c->loc, &c->rem, TH_ACK, mg_htonl(s->seq - 1),\n                 mg_htonl(s->ack), NULL, 0);\n        }\n      }\n\n      settmout(c, MIP_TTYPE_KEEPALIVE);\n    }\n  }\n}\n\n// This function executes in interrupt context, thus it should copy data\n// somewhere fast. Note that newlib's malloc is not thread safe, thus use\n// our lock-free queue with preallocated buffer to copy data and return asap\nvoid mg_tcpip_qwrite(void *buf, size_t len, struct mg_tcpip_if *ifp) {\n  char *p;\n  if (mg_queue_book(&ifp->recv_queue, &p, len) >= len) {\n    memcpy(p, buf, len);\n    mg_queue_add(&ifp->recv_queue, len);\n    ifp->nrecv++;\n  } else {\n    ifp->ndrop++;\n  }\n}\n\nvoid mg_tcpip_init(struct mg_mgr *mgr, struct mg_tcpip_if *ifp) {\n  // If L2 address is not set, make a random one; fill MTU\n  mg_l2_init(ifp->l2type, ifp->mac, &ifp->mtu, &ifp->framesize);\n\n  if (ifp->dhcp_name[0] == '\\0')  // If DHCP name is not set, use \"mip\"\n    memcpy(ifp->dhcp_name, \"mip\", 4);\n  ifp->dhcp_name[sizeof(ifp->dhcp_name) - 1] = '\\0';  // Just in case\n\n  if (ifp->driver->init && !ifp->driver->init(ifp)) {\n    MG_ERROR((\"driver init failed\"));\n  } else {\n    ifp->tx.buf = (char *) mg_calloc(1, ifp->framesize),\n    ifp->tx.len = ifp->framesize;\n    if (ifp->recv_queue.size == 0)\n      ifp->recv_queue.size = ifp->driver->rx ? ifp->framesize : 8192;\n    ifp->recv_queue.buf = (char *) mg_calloc(1, ifp->recv_queue.size);\n    ifp->timer_1000ms = mg_millis();\n    mgr->ifp = ifp;\n    ifp->mgr = mgr;\n    mgr->extraconnsize = sizeof(struct connstate);\n    if (ifp->ip == 0) ifp->enable_dhcp_client = true;\n    mg_random(&ifp->eport, sizeof(ifp->eport));  // Random from 0 to 65535\n    ifp->eport |= MG_EPHEMERAL_PORT_BASE;        // Random from\n                                           // MG_EPHEMERAL_PORT_BASE to 65535\n#if MG_ENABLE_IPV6\n    if (ifp->ip6ll[0] == 0 && ifp->ip6ll[1] == 0) {    // gen link-local address\n      uint8_t px[8] = {0xfe, 0x80, 0, 0, 0, 0, 0, 0};  // RFC-4291 2.5.6\n      mg_l2_genip6(ifp->l2type, ifp->ip6ll, 64, ifp->mac);\n      memcpy(ifp->ip6ll, px, 8);  // RFC-4291 2.5.4\n    }  // just got our link local address if we didn't.\n    // If static configuration is used, global addresses,\n    // prefix length, and gw are already filled at this point.\n    if (ifp->ip6[0] == 0 && ifp->ip6[1] == 0) ifp->enable_slaac = true;\n#endif\n    if (ifp->tx.buf == NULL || ifp->recv_queue.buf == NULL) MG_ERROR((\"OOM\"));\n  }\n}\n\nvoid mg_tcpip_free(struct mg_tcpip_if *ifp) {\n  mg_free(ifp->recv_queue.buf);\n  mg_free(ifp->tx.buf);\n  mg_free(ifp->dns4_url);\n}\n\nstatic void send_syn(struct mg_connection *c) {\n  struct connstate *s = (struct connstate *) (c + 1);\n  uint32_t isn = mg_htonl((uint32_t) mg_ntohs(c->loc.port));\n  tx_tcp(c->mgr->ifp, s->mac, &c->loc, &c->rem, TH_SYN, isn, 0, NULL, 0);\n}\n\nstatic void l2addr_resolved(struct mg_connection *c) {\n  if (c->is_udp) {\n    c->is_connecting = 0;\n    mg_call(c, MG_EV_CONNECT, NULL);\n  } else {\n    send_syn(c);\n    settmout(c, MIP_TTYPE_SYN);\n  }\n}\n\nvoid mg_connect_resolved(struct mg_connection *c) {\n  struct mg_tcpip_if *ifp = c->mgr->ifp;\n  uint8_t *l2addr;\n  c->is_resolving = 0;\n  if (ifp->eport < MG_EPHEMERAL_PORT_BASE) ifp->eport = MG_EPHEMERAL_PORT_BASE;\n  c->loc.port = mg_htons(ifp->eport++);\n#if MG_ENABLE_IPV6\n  if (c->rem.is_ip6) {\n    c->loc.addr.ip6[0] = ifp->ip6[0], c->loc.addr.ip6[1] = ifp->ip6[1],\n    c->loc.is_ip6 = true;\n  } else\n#endif\n  {\n    c->loc.addr.ip4 = ifp->ip;\n  }\n  MG_DEBUG((\"%lu %M -> %M\", c->id, mg_print_ip_port, &c->loc, mg_print_ip_port,\n            &c->rem));\n  mg_call(c, MG_EV_RESOLVE, NULL);\n  c->is_connecting = 1;\n  if (c->is_udp && (l2addr = tcpip_mapip(ifp, &c->rem)) != NULL) {\n    struct connstate *s = (struct connstate *) (c + 1);\n    memcpy(s->mac, l2addr, sizeof(s->mac));\n    l2addr_resolved(c);  // broadcast or multicast\n#if MG_ENABLE_IPV6\n  } else if (c->rem.is_ip6) {\n    if (match_prefix((uint8_t *) c->rem.addr.ip6, ifp->prefix,\n                     ifp->prefix_len)                       // same global LAN\n        || (c->rem.addr.ip6[0] == ifp->ip6ll[0]             // same local LAN\n            && !MG_IP6MATCH(c->rem.addr.ip6, ifp->gw6))) {  // and not gw\n      // If we're in the same LAN, fire a Neighbor Solicitation\n      MG_DEBUG((\"%lu NS lookup...\", c->id));\n      tx_ndp_ns(ifp, c->rem.addr.ip6, NULL);  // RFC-4861 4.3, requesting\n      settmout(c, MIP_TTYPE_ARP);\n      c->is_arplooking = 1;\n    } else if (ifp->gw6_ready) {\n      struct connstate *s = (struct connstate *) (c + 1);\n      memcpy(s->mac, ifp->gw6mac, sizeof(s->mac));\n      l2addr_resolved(c);\n    } else {\n      MG_ERROR((\"No IPv6 gateway, can't connect\"));\n    }\n#endif\n  } else {\n    uint32_t rem_ip = c->rem.addr.ip4;\n    if (ifp->ip && ((rem_ip & ifp->mask) == (ifp->ip & ifp->mask)) &&\n        rem_ip != ifp->gw) {  // skip if gw (onstatechange -> ARP)\n      // If we're in the same LAN, fire an ARP lookup.\n      MG_DEBUG((\"%lu ARP lookup...\", c->id));\n      mg_tcpip_arp_request(ifp, rem_ip, NULL);\n      settmout(c, MIP_TTYPE_ARP);\n      c->is_arplooking = 1;\n    } else if (ifp->gw_ready) {\n      struct connstate *s = (struct connstate *) (c + 1);\n      memcpy(s->mac, ifp->gwmac, sizeof(s->mac));\n      l2addr_resolved(c);\n    } else {\n      MG_ERROR((\"No gateway, can't connect\"));\n    }\n  }\n}\n\nbool mg_open_listener(struct mg_connection *c, const char *url) {\n  c->loc.port = mg_htons(mg_url_port(url));\n  if (!mg_aton(mg_url_host(url), &c->loc)) {\n    MG_ERROR((\"invalid listening URL: %s\", url));\n    return false;\n  }\n  return true;\n}\n\nstatic void write_conn(struct mg_connection *c) {\n  long len = c->is_tls ? mg_tls_send(c, c->send.buf, c->send.len)\n                       : mg_io_send(c, c->send.buf, c->send.len);\n  // TODO(): mg_tls_send() may return 0 forever on steady OOM\n  if (len == MG_IO_ERR) {\n    mg_error(c, \"tx err\");\n  } else if (len > 0) {\n    mg_iobuf_del(&c->send, 0, (size_t) len);\n    mg_call(c, MG_EV_WRITE, &len);\n  }\n}\n\nstatic void init_closure(struct mg_connection *c) {\n  struct connstate *s = (struct connstate *) (c + 1);\n  if (c->is_udp == false && c->is_listening == false &&\n      c->is_connecting == false) {  // For TCP conns,\n    tx_tcp(c->mgr->ifp, s->mac, &c->loc, &c->rem, TH_FIN | TH_ACK,\n           mg_htonl(s->seq), mg_htonl(s->ack), NULL, 0);\n    settmout(c, MIP_TTYPE_FIN);\n  }\n}\n\nstatic void close_conn(struct mg_connection *c) {\n  struct connstate *s = (struct connstate *) (c + 1);\n  mg_iobuf_free(&s->raw);  // For TLS connections, release raw data\n  mg_close_conn(c);\n}\n\nstatic bool can_write(struct mg_connection *c) {\n  return c->is_connecting == 0 && c->is_resolving == 0 && c->send.len > 0 &&\n         c->is_tls_hs == 0 && c->is_arplooking == 0;\n}\n\nvoid mg_mgr_poll(struct mg_mgr *mgr, int ms) {\n  struct mg_connection *c, *tmp;\n  uint64_t now = mg_millis();\n  mg_timer_poll(&mgr->timers, now);\n  if (mgr->ifp == NULL || mgr->ifp->driver == NULL) return;\n  mg_tcpip_poll(mgr->ifp, now);\n  for (c = mgr->conns; c != NULL; c = tmp) {\n    struct connstate *s = (struct connstate *) (c + 1);\n    bool is_tls = c->is_tls && !c->is_resolving && !c->is_arplooking &&\n                  !c->is_listening && !c->is_connecting;\n    tmp = c->next;\n    mg_call(c, MG_EV_POLL, &now);\n    MG_VERBOSE((\"%lu .. %c%c%c%c%c %lu %lu\", c->id, c->is_tls ? 'T' : 't',\n                c->is_connecting ? 'C' : 'c', c->is_tls_hs ? 'H' : 'h',\n                c->is_resolving ? 'R' : 'r', c->is_closing ? 'C' : 'c',\n                mg_tls_pending(c), c->rtls.len));\n    // order is important, TLS conn close with > 1 record in buffer (below)\n    if (is_tls && (c->rtls.len > 0 || mg_tls_pending(c) > 0))\n      c->is_tls_hs ? mg_tls_handshake(c) : handle_tls_recv(c);\n    if (can_write(c)) write_conn(c);\n    if (is_tls && c->send.len == 0) mg_tls_flush(c);\n    if (c->is_draining && c->send.len == 0 && s->ttype != MIP_TTYPE_FIN)\n      init_closure(c);\n    // For non-TLS, close immediately upon completing the 3-way closure\n    // For TLS, handle any pending data (above) until MIP_TTYPE_FIN expires\n    if (s->twclosure &&\n        (!c->is_tls || (c->rtls.len == 0 && mg_tls_pending(c) == 0)))\n      c->is_closing = 1;\n    if (c->is_closing) close_conn(c);\n  }\n  (void) ms;\n}\n\nbool mg_send(struct mg_connection *c, const void *buf, size_t len) {\n  struct mg_tcpip_if *ifp = c->mgr->ifp;\n  bool res = false;\n  if (!c->loc.is_ip6 && (ifp->ip == 0 || ifp->state != MG_TCPIP_STATE_READY)) {\n    mg_error(c, \"net down\");\n#if MG_ENABLE_IPV6\n  } else if (c->loc.is_ip6 && ifp->state6 != MG_TCPIP_STATE_READY) {\n    mg_error(c, \"net down\");\n#endif\n  } else if (c->is_udp && (c->is_arplooking || c->is_resolving)) {\n    // Fail to send, no target MAC or IP\n    MG_VERBOSE((\"still resolving...\"));\n  } else if (c->is_udp) {\n    len = trim_len(c, len);  // Trimming length if necessary\n    res = udp_send(c, buf, len);\n  } else {\n    res = len == 0 || mg_iobuf_add(&c->send, c->send.len, buf, len) > 0;\n    // returning 0 means an OOM condition (iobuf couldn't resize), yet this is\n    // so far recoverable, let the caller decide\n  }\n  return res;\n}\n\nuint8_t mcast_addr[6] = {0x01, 0x00, 0x5e, 0x00, 0x00, 0xfb};\nvoid mg_multicast_add(struct mg_connection *c, char *ip) {\n  (void) ip;  // ip4/6_mcastmac(mcast_mac, &ip); ipv6 param\n  // TODO(): actual IP -> MAC; check database, update\n  c->mgr->ifp->update_mac_hash_table = true;  // mark dirty\n}\n\nbool mg_dnsc_init(struct mg_mgr *mgr, struct mg_dns *dnsc);\n\nstatic void setdns4(struct mg_tcpip_if *ifp, uint32_t *ip) {\n  struct mg_dns *dnsc;\n  mg_free(ifp->dns4_url);\n  ifp->dns4_url = mg_mprintf(\"udp://%M:53\", mg_print_ip4, ip);\n  dnsc = &ifp->mgr->dns4;\n  dnsc->url = (const char *) ifp->dns4_url;\n  MG_DEBUG((\"Set DNS URL to %s\", dnsc->url));\n  if (ifp->mgr->use_dns6) return;\n  if (dnsc->c != NULL) mg_close_conn(dnsc->c);\n  if (!mg_dnsc_init(ifp->mgr, dnsc))  // create DNS connection\n    MG_ERROR((\"DNS connection creation failed\"));\n}\n\nvoid mg_tcpip_mapip(struct mg_connection *c, struct mg_addr *ip) {\n  struct connstate *s = (struct connstate *) (c + 1);\n  uint8_t *l2addr = tcpip_mapip(c->mgr->ifp, ip);\n  if (l2addr == NULL) return;\n  memcpy(s->mac, l2addr, sizeof(s->mac));\n}\n\n#endif  // MG_ENABLE_TCPIP\n"
  },
  {
    "path": "src/net_builtin.h",
    "content": "#pragma once\n\n#include \"arch.h\"\n#include \"l2.h\"\n#include \"net.h\"\n#include \"queue.h\"\n#include \"str.h\"\n\n#if MG_ENABLE_TCPIP\n\nstruct mg_tcpip_if;  // Mongoose TCP/IP network interface\n\nstruct mg_tcpip_driver {\n  bool (*init)(struct mg_tcpip_if *);                         // Init driver\n  size_t (*tx)(const void *, size_t, struct mg_tcpip_if *);   // Transmit frame\n  size_t (*rx)(void *buf, size_t len, struct mg_tcpip_if *);  // Receive frame\n  bool (*poll)(struct mg_tcpip_if *, bool);  // Poll, return Up/down status\n};\n\ntypedef void (*mg_tcpip_event_handler_t)(struct mg_tcpip_if *ifp, int ev,\n                                         void *ev_data);\n\nenum {\n  MG_TCPIP_EV_ST_CHG,  // state change                   uint8_t * (&ifp->state)\n  MG_TCPIP_EV_DHCP_DNS,   // DHCP DNS assignment            uint32_t *ipaddr\n  MG_TCPIP_EV_DHCP_SNTP,  // DHCP SNTP assignment           uint32_t *ipaddr\n  MG_TCPIP_EV_ARP,        // Got ARP packet                 struct mg_str *\n  MG_TCPIP_EV_TIMER_1S,   // 1 second timer                 NULL\n  MG_TCPIP_EV_WIFI_SCAN_RESULT,  // Wi-Fi scan results             struct\n                                 // mg_wifi_scan_bss_data *\n  MG_TCPIP_EV_WIFI_SCAN_END,     // Wi-Fi scan has finished        NULL\n  MG_TCPIP_EV_WIFI_CONNECT_ERR,  // Wi-Fi connect has failed       driver and\n                                 // chip specific\n  MG_TCPIP_EV_DRIVER,   // Driver event                   driver specific\n  MG_TCPIP_EV_ST6_CHG,  // state6 change                  uint8_t *\n                        // (&ifp->state6)\n  MG_TCPIP_EV_USER      // Starting ID for user events\n};\n\n// Network interface\nstruct mg_tcpip_if {\n  uint8_t mac[sizeof(struct mg_l2addr)];  // hw address. Set to a valid addr\n  uint32_t ip, mask, gw;                  // IP address, mask, default gateway\n  struct mg_str tx;                       // Output (TX) buffer\n  bool enable_dhcp_client;                // Enable DCHP client\n  bool enable_dhcp_server;                // Enable DCHP server\n  bool enable_get_gateway;                // DCHP server sets client as gateway\n  bool enable_req_dns;                    // DCHP client requests DNS server\n  bool enable_req_sntp;                   // DCHP client requests SNTP server\n  bool enable_crc32_check;         // Do a CRC check on RX frames and strip it\n  bool enable_mac_check;           // Do a MAC check on RX frames\n  bool update_mac_hash_table;      // Signal drivers to update MAC controller\n  struct mg_tcpip_driver *driver;  // Low level driver\n  void *driver_data;               // Driver-specific data\n  mg_tcpip_event_handler_t pfn;    // Driver-specific event handler function\n  mg_tcpip_event_handler_t fn;     // User-specified event handler function\n  struct mg_mgr *mgr;              // Mongoose event manager\n  struct mg_queue recv_queue;      // Receive queue\n  char dhcp_name[MG_TCPIP_DHCPNAME_SIZE];  // Name for DHCP, \"mip\" if unset\n  uint16_t mtu;                            // Interface link payload\n  uint16_t framesize;                      // Interface frame max length\n#if MG_ENABLE_IPV6\n  uint64_t ip6ll[2], ip6[2];  // IPv6 link-local and global addresses,\n  uint8_t prefix[8];          // prefix,\n  uint8_t prefix_len;         // prefix length,\n  uint64_t gw6[2];            // default gateway.\n  bool enable_slaac;          // Enable IPv6 address autoconfiguration\n  bool enable_dhcp6_client;   // Enable DCHPv6 client TODO()\n#endif\n\n  // Internal state, user can use it but should not change it\n  uint8_t gwmac[sizeof(struct mg_l2addr)];  // Router's hw address\n  enum mg_l2type l2type;                    // Ethernet, PPP, etc.\n  char *dns4_url;                           // DNS server URL\n  uint64_t now;                             // Current time\n  uint64_t timer_1000ms;        // 1000 ms timer: for DHCP and link state\n  uint64_t lease_expire;        // Lease expiration time, in ms\n  uint16_t eport;               // Next ephemeral port\n  volatile uint32_t ndrop;      // Number of received, but dropped frames\n  volatile uint32_t nrecv;      // Number of received frames\n  volatile uint32_t nsent;      // Number of transmitted frames\n  volatile uint32_t nerr;       // Number of driver errors\n  uint8_t state;                // Current link and IPv4 state\n#define MG_TCPIP_STATE_DOWN 0   // Interface is down\n#define MG_TCPIP_STATE_UP 1     // Interface is up\n#define MG_TCPIP_STATE_REQ 2    // Interface is up, DHCP REQUESTING state\n#define MG_TCPIP_STATE_IP 3     // Interface is up and has an IP assigned\n#define MG_TCPIP_STATE_READY 4  // Interface has fully come up, ready to work\n  bool gw_ready;                // We've got a hw address for the router\n#if MG_ENABLE_IPV6\n  uint8_t gw6mac[sizeof(struct mg_l2addr)];  // IPV6 Router's hw address\n  uint8_t state6;                            // Current IPv6 state\n  bool gw6_ready;  // We've got a hw address for the IPv6 router\n#endif\n};\n\nvoid mg_tcpip_init(struct mg_mgr *, struct mg_tcpip_if *);\nvoid mg_tcpip_free(struct mg_tcpip_if *);\nvoid mg_tcpip_qwrite(void *buf, size_t len, struct mg_tcpip_if *ifp);\nvoid mg_tcpip_arp_request(struct mg_tcpip_if *ifp, uint32_t ip, uint8_t *mac);\n\nextern struct mg_tcpip_driver mg_tcpip_driver_stm32f;\nextern struct mg_tcpip_driver mg_tcpip_driver_w5500;\nextern struct mg_tcpip_driver mg_tcpip_driver_w5100;\nextern struct mg_tcpip_driver mg_tcpip_driver_tm4c;\nextern struct mg_tcpip_driver mg_tcpip_driver_tms570;\nextern struct mg_tcpip_driver mg_tcpip_driver_stm32h;\nextern struct mg_tcpip_driver mg_tcpip_driver_imxrt;\nextern struct mg_tcpip_driver mg_tcpip_driver_same54;\nextern struct mg_tcpip_driver mg_tcpip_driver_cmsis;\nextern struct mg_tcpip_driver mg_tcpip_driver_ra;\nextern struct mg_tcpip_driver mg_tcpip_driver_xmc;\nextern struct mg_tcpip_driver mg_tcpip_driver_xmc7;\nextern struct mg_tcpip_driver mg_tcpip_driver_ppp;\nextern struct mg_tcpip_driver mg_tcpip_driver_pico_w;\nextern struct mg_tcpip_driver mg_tcpip_driver_rw612;\nextern struct mg_tcpip_driver mg_tcpip_driver_cyw;\nextern struct mg_tcpip_driver mg_tcpip_driver_nxp_wifi;\nextern struct mg_tcpip_driver mg_tcpip_driver_st67w6;\n\n// Drivers that require SPI, can use this SPI abstraction\nstruct mg_tcpip_spi {\n  void *spi;                        // Opaque SPI bus descriptor\n  void (*begin)(void *);            // SPI begin: slave select low\n  void (*end)(void *);              // SPI end: slave select high\n  uint8_t (*txn)(void *, uint8_t);  // SPI transaction: write 1 byte, read reply\n};\n\n// Alignment and memory section requirements\n#ifndef MG_8BYTE_ALIGNED\n#if defined(__GNUC__)\n#define MG_8BYTE_ALIGNED __attribute__((aligned((8U))))\n#else\n#define MG_8BYTE_ALIGNED\n#endif  // compiler\n#endif  // 8BYTE_ALIGNED\n\n#ifndef MG_16BYTE_ALIGNED\n#if defined(__GNUC__)\n#define MG_16BYTE_ALIGNED __attribute__((aligned((16U))))\n#else\n#define MG_16BYTE_ALIGNED\n#endif  // compiler\n#endif  // 16BYTE_ALIGNED\n\n#ifndef MG_32BYTE_ALIGNED\n#if defined(__GNUC__)\n#define MG_32BYTE_ALIGNED __attribute__((aligned((32U))))\n#else\n#define MG_32BYTE_ALIGNED\n#endif  // compiler\n#endif  // 32BYTE_ALIGNED\n\n#ifndef MG_64BYTE_ALIGNED\n#if defined(__GNUC__)\n#define MG_64BYTE_ALIGNED __attribute__((aligned((64U))))\n#else\n#define MG_64BYTE_ALIGNED\n#endif  // compiler\n#endif  // 64BYTE_ALIGNED\n\n#ifndef MG_ETH_RAM\n#define MG_ETH_RAM\n#endif\n\n#endif\n"
  },
  {
    "path": "src/net_ft.h",
    "content": "#pragma once\n\n#if defined(MG_ENABLE_FREERTOS_TCP) && MG_ENABLE_FREERTOS_TCP\n\n#include <limits.h>\n#include <list.h>\n\n#include <FreeRTOS_IP.h>\n#include <FreeRTOS_Sockets.h>\n\n#define MG_SOCKET_TYPE Socket_t\n#define MG_INVALID_SOCKET FREERTOS_INVALID_SOCKET\n\n// Why FreeRTOS-TCP did not implement a clean BSD API, but its own thing\n// with FreeRTOS_ prefix, is beyond me\n#define IPPROTO_TCP FREERTOS_IPPROTO_TCP\n#define IPPROTO_UDP FREERTOS_IPPROTO_UDP\n#define AF_INET FREERTOS_AF_INET\n#define SOCK_STREAM FREERTOS_SOCK_STREAM\n#define SOCK_DGRAM FREERTOS_SOCK_DGRAM\n#define SO_BROADCAST 0\n#define SO_ERROR 0\n#define SOL_SOCKET 0\n#define SO_REUSEADDR 0\n\n#define MG_SOCK_ERR(errcode) ((errcode) < 0 ? (errcode) : 0)\n\n#define MG_SOCK_PENDING(errcode)                 \\\n  ((errcode) == -pdFREERTOS_ERRNO_EWOULDBLOCK || \\\n   (errcode) == -pdFREERTOS_ERRNO_EISCONN ||     \\\n   (errcode) == -pdFREERTOS_ERRNO_EINPROGRESS || \\\n   (errcode) == -pdFREERTOS_ERRNO_EAGAIN)\n\n#define MG_SOCK_RESET(errcode) ((errcode) == -pdFREERTOS_ERRNO_ENOTCONN)\n\n// actually only if optional timeout is enabled\n#define MG_SOCK_INTR(fd) (fd == NULL)\n\n#define sockaddr_in freertos_sockaddr\n#define sockaddr freertos_sockaddr\n#if ipFR_TCP_VERSION_MAJOR >= 4\n#define sin_addr sin_address.ulIP_IPv4\n#endif\n#define accept(a, b, c) FreeRTOS_accept((a), (b), (c))\n#define connect(a, b, c) FreeRTOS_connect((a), (b), (c))\n#define bind(a, b, c) FreeRTOS_bind((a), (b), (c))\n#define listen(a, b) FreeRTOS_listen((a), (b))\n#define socket(a, b, c) FreeRTOS_socket((a), (b), (c))\n#define send(a, b, c, d) FreeRTOS_send((a), (b), (c), (d))\n#define recv(a, b, c, d) FreeRTOS_recv((a), (b), (c), (d))\n#define setsockopt(a, b, c, d, e) FreeRTOS_setsockopt((a), (b), (c), (d), (e))\n#define sendto(a, b, c, d, e, f) FreeRTOS_sendto((a), (b), (c), (d), (e), (f))\n#define recvfrom(a, b, c, d, e, f) \\\n  FreeRTOS_recvfrom((a), (b), (c), (d), (e), (f))\n#define closesocket(x) FreeRTOS_closesocket(x)\n#define gethostbyname(x) FreeRTOS_gethostbyname(x)\n#define getsockname(a, b, c) mg_getsockname((a), (b), (c))\n#define getpeername(a, b, c) mg_getpeername((a), (b), (c))\n\nstatic inline int mg_getsockname(MG_SOCKET_TYPE fd, void *buf, socklen_t *len) {\n  (void) fd, (void) buf, (void) len;\n  return -1;\n}\n\nstatic inline int mg_getpeername(MG_SOCKET_TYPE fd, void *buf, socklen_t *len) {\n  (void) fd, (void) buf, (void) len;\n  return 0;\n}\n#endif\n"
  },
  {
    "path": "src/net_lwip.h",
    "content": "#pragma once\n\n#if defined(MG_ENABLE_LWIP) && MG_ENABLE_LWIP\n\n#if defined(__GNUC__) && !defined(__ARMCC_VERSION)\n#include <sys/stat.h>\n#endif\n\nstruct timeval;\n\n#include <lwip/sockets.h>\n\n#if !LWIP_TIMEVAL_PRIVATE\n#if defined(__GNUC__) && !defined(__ARMCC_VERSION) // armclang sets both\n#include <sys/time.h>\n#else\nstruct timeval {\n  time_t tv_sec;\n  long tv_usec;\n};\n#endif\n#endif\n\n#if LWIP_SOCKET != 1\n// Sockets support disabled in LWIP by default\n#error Set LWIP_SOCKET variable to 1 (in lwipopts.h)\n#endif\n#endif\n"
  },
  {
    "path": "src/net_rl.h",
    "content": "#pragma once\n\n#if defined(MG_ENABLE_RL) && MG_ENABLE_RL\n#include <rl_net.h>\n\n#define closesocket(x) closesocket(x)\n\n#define TCP_NODELAY SO_KEEPALIVE\n\n#define MG_SOCK_ERR(errcode) ((errcode) < 0 ? (errcode) : 0)\n\n#define MG_SOCK_PENDING(errcode)                                \\\n  ((errcode) == BSD_EWOULDBLOCK || (errcode) == BSD_EALREADY || \\\n   (errcode) == BSD_EINPROGRESS)\n\n#define MG_SOCK_RESET(errcode) \\\n  ((errcode) == BSD_ECONNABORTED || (errcode) == BSD_ECONNRESET)\n\n// In blocking mode, which is enabled by default, accept() waits for a\n// connection request. In non blocking mode, you must call accept()\n// again if the error code BSD_EWOULDBLOCK is returned.\n#define MG_SOCK_INTR(fd) (fd == BSD_EWOULDBLOCK)\n\n#define socklen_t int\n#endif\n"
  },
  {
    "path": "src/ota.h",
    "content": "// Copyright (c) 2023 Cesanta Software Limited\n// All rights reserved\n\n#pragma once\n\n#include \"arch.h\"\n\n#define MG_OTA_NONE 0       // No OTA support\n#define MG_OTA_STM32H5 1    // STM32 H5\n#define MG_OTA_STM32H7 2    // STM32 H7\n#define MG_OTA_STM32H7_DUAL_CORE 3 // STM32 H7 dual core\n#define MG_OTA_STM32F  4    // STM32 F7/F4/F2\n#define MG_OTA_CH32V307 100 // WCH CH32V307\n#define MG_OTA_U2A 200      // Renesas U2A16, U2A8, U2A6\n#define MG_OTA_RT1020 300   // IMXRT1020\n#define MG_OTA_RT1050 301   // IMXRT1050\n#define MG_OTA_RT1060 302   // IMXRT1060\n#define MG_OTA_RT1064 303   // IMXRT1064\n#define MG_OTA_RT1170 304   // IMXRT1170\n#define MG_OTA_MCXN 310 \t// MCXN947\n#define MG_OTA_RW612 320    // FRDM-RW612\n#define MG_OTA_FLASH 900    // OTA via an internal flash\n#define MG_OTA_ESP32 910    // ESP32 OTA implementation\n#define MG_OTA_PICOSDK 920  // RP2040/2350 using Pico-SDK hardware_flash\n#define MG_OTA_CUSTOM 1000  // Custom implementation\n\n#ifndef MG_OTA\n#define MG_OTA MG_OTA_NONE\n#else\n#ifndef MG_IRAM\n#if defined(__GNUC__)\n#define MG_IRAM __attribute__((noinline, section(\".iram\")))\n#else\n#define MG_IRAM\n#endif // compiler\n#endif // IRAM\n#endif // OTA\n\n// Firmware update API\nbool mg_ota_begin(size_t new_firmware_size);     // Start writing\nbool mg_ota_write(const void *buf, size_t len);  // Write chunk, aligned to 1k\nbool mg_ota_end(void);                           // Stop writing\n"
  },
  {
    "path": "src/ota_ch32v307.c",
    "content": "#include \"flash.h\"\n#include \"log.h\"\n#include \"ota.h\"\n\n#if MG_OTA == MG_OTA_CH32V307\n// RM: https://www.wch-ic.com/downloads/CH32FV2x_V3xRM_PDF.html\n\nstatic bool mg_ch32v307_write(void *, const void *, size_t);\nstatic bool mg_ch32v307_swap(void);\n\nstatic struct mg_flash s_mg_flash_ch32v307 = {\n    (void *) 0x08000000,  // Start\n    480 * 1024,           // Size, first 320k is 0-wait\n    4 * 1024,             // Sector size, 4k\n    4,                    // Align, 32 bit\n    mg_ch32v307_write,\n    mg_ch32v307_swap,\n};\n\n#define FLASH_BASE 0x40022000\n#define FLASH_ACTLR (FLASH_BASE + 0)\n#define FLASH_KEYR (FLASH_BASE + 4)\n#define FLASH_OBKEYR (FLASH_BASE + 8)\n#define FLASH_STATR (FLASH_BASE + 12)\n#define FLASH_CTLR (FLASH_BASE + 16)\n#define FLASH_ADDR (FLASH_BASE + 20)\n#define FLASH_OBR (FLASH_BASE + 28)\n#define FLASH_WPR (FLASH_BASE + 32)\n\nMG_IRAM static void flash_unlock(void) {\n  static bool unlocked;\n  if (unlocked == false) {\n    MG_REG(FLASH_KEYR) = 0x45670123;\n    MG_REG(FLASH_KEYR) = 0xcdef89ab;\n    unlocked = true;\n  }\n}\n\nMG_IRAM static void flash_wait(void) {\n  while (MG_REG(FLASH_STATR) & MG_BIT(0)) (void) 0;\n}\n\nMG_IRAM static void mg_ch32v307_erase(void *addr) {\n  // MG_INFO((\"%p\", addr));\n  flash_unlock();\n  flash_wait();\n  MG_REG(FLASH_ADDR) = (uint32_t) addr;\n  MG_REG(FLASH_CTLR) |= MG_BIT(1) | MG_BIT(6);  // PER | STRT;\n  flash_wait();\n}\n\nMG_IRAM static bool is_page_boundary(const void *addr) {\n  uint32_t val = (uint32_t) addr;\n  return (val & (s_mg_flash_ch32v307.secsz - 1)) == 0;\n}\n\nMG_IRAM static bool mg_ch32v307_write(void *addr, const void *buf, size_t len) {\n  // MG_INFO((\"%p %p %lu\", addr, buf, len));\n  // mg_hexdump(buf, len);\n  flash_unlock();\n  const uint16_t *src = (uint16_t *) buf, *end = &src[len / 2];\n  uint16_t *dst = (uint16_t *) addr;\n  MG_REG(FLASH_CTLR) |= MG_BIT(0);  // Set PG\n  // MG_INFO((\"CTLR: %#lx\", MG_REG(FLASH_CTLR)));\n  while (src < end) {\n    if (is_page_boundary(dst)) mg_ch32v307_erase(dst);\n    *dst++ = *src++;\n    flash_wait();\n  }\n  MG_REG(FLASH_CTLR) &= ~MG_BIT(0);  // Clear PG\n  return true;\n}\n\nMG_IRAM bool mg_ch32v307_swap(void) {\n  return true;\n}\n\n// just overwrite instead of swap\nMG_IRAM static void single_bank_swap(char *p1, char *p2, size_t s, size_t ss) {\n  // no stdlib calls here\n  for (size_t ofs = 0; ofs < s; ofs += ss) {\n    mg_ch32v307_write(p1 + ofs, p2 + ofs, ss);\n  }\n  *((volatile uint32_t *) 0xbeef0000) |= 1U << 7;  // NVIC_SystemReset()\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_ch32v307);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_ch32v307);\n}\n\nbool mg_ota_end(void) {\n  if (mg_ota_flash_end(&s_mg_flash_ch32v307)) {\n    // Swap partitions. Pray power does not go away\n    MG_INFO((\"Swapping partitions, size %u (%u sectors)\",\n             s_mg_flash_ch32v307.size,\n             s_mg_flash_ch32v307.size / s_mg_flash_ch32v307.secsz));\n    MG_INFO((\"Do NOT power off...\"));\n    mg_log_level = MG_LL_NONE;\n    // TODO() disable IRQ, s_flash_irq_disabled = true;\n    // Runs in RAM, will reset when finished\n    single_bank_swap(\n        (char *) s_mg_flash_ch32v307.start,\n        (char *) s_mg_flash_ch32v307.start + s_mg_flash_ch32v307.size / 2,\n        s_mg_flash_ch32v307.size / 2, s_mg_flash_ch32v307.secsz);\n  }\n  return false;\n}\n#endif\n"
  },
  {
    "path": "src/ota_dummy.c",
    "content": "#include \"log.h\"\n#include \"ota.h\"\n\n#if MG_OTA == MG_OTA_NONE\nbool mg_ota_begin(size_t new_firmware_size) {\n  (void) new_firmware_size;\n  return true;\n}\nbool mg_ota_write(const void *buf, size_t len) {\n  (void) buf, (void) len;\n  return true;\n}\nbool mg_ota_end(void) {\n  return true;\n}\n#endif\n"
  },
  {
    "path": "src/ota_esp32.c",
    "content": "#include \"arch.h\"\n\n#if MG_ARCH == MG_ARCH_ESP32 && MG_OTA == MG_OTA_ESP32\n\nstatic const esp_partition_t *s_ota_update_partition;\nstatic esp_ota_handle_t s_ota_update_handle;\nstatic bool s_ota_success;\n\n// Those empty macros do nothing, but mark places in the code which could\n// potentially trigger a watchdog reboot due to the log flash erase operation\n#define disable_wdt()\n#define enable_wdt()\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  if (s_ota_update_partition != NULL) {\n    MG_ERROR((\"Update in progress. Call mg_ota_end() ?\"));\n    return false;\n  } else {\n    s_ota_success = false;\n    disable_wdt();\n    s_ota_update_partition = esp_ota_get_next_update_partition(NULL);\n    esp_err_t err = esp_ota_begin(s_ota_update_partition, new_firmware_size,\n                                  &s_ota_update_handle);\n    enable_wdt();\n    MG_DEBUG((\"esp_ota_begin(): %d\", err));\n    s_ota_success = (err == ESP_OK);\n  }\n  return s_ota_success;\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  disable_wdt();\n  esp_err_t err = esp_ota_write(s_ota_update_handle, buf, len);\n  enable_wdt();\n  MG_INFO((\"esp_ota_write(): %d\", err));\n  s_ota_success = err == ESP_OK;\n  return s_ota_success;\n}\n\nbool mg_ota_end(void) {\n  esp_err_t err = esp_ota_end(s_ota_update_handle);\n  MG_DEBUG((\"esp_ota_end(%p): %d\", s_ota_update_handle, err));\n  if (s_ota_success && err == ESP_OK) {\n    err = esp_ota_set_boot_partition(s_ota_update_partition);\n    s_ota_success = (err == ESP_OK);\n  }\n  MG_DEBUG((\"Finished ESP32 OTA, success: %d\", s_ota_success));\n  s_ota_update_partition = NULL;\n  return s_ota_success;\n}\n\n#endif\n"
  },
  {
    "path": "src/ota_imxrt.c",
    "content": "#include \"flash.h\"\n#include \"log.h\"\n#include \"ota.h\"\n\n#if MG_OTA >= MG_OTA_RT1020 && MG_OTA <= MG_OTA_RT1170\n\nstatic bool mg_imxrt_write(void *, const void *, size_t);\nstatic bool mg_imxrt_swap(void);\n\n#if MG_OTA <= MG_OTA_RT1060\n#define MG_IMXRT_FLASH_START 0x60000000\n#define FLEXSPI_NOR_INSTANCE 0\n#elif MG_OTA == MG_OTA_RT1064\n#define MG_IMXRT_FLASH_START 0x70000000\n#define FLEXSPI_NOR_INSTANCE 1\n#else  // RT1170\n#define MG_IMXRT_FLASH_START 0x30000000\n#define FLEXSPI_NOR_INSTANCE 1\n#endif\n\n#if MG_OTA == MG_OTA_RT1050\n#define MG_IMXRT_SECTOR_SIZE (256 * 1024)\n#define MG_IMXRT_PAGE_SIZE 512\n#else\n#define MG_IMXRT_SECTOR_SIZE (4 * 1024)\n#define MG_IMXRT_PAGE_SIZE 256\n#endif\n\n// TODO(): fill at init, support more devices in a dynamic way\n// TODO(): then, check alignment is <= 256, see Wizard's #251\nstatic struct mg_flash s_mg_flash_imxrt = {\n    (void *) MG_IMXRT_FLASH_START,  // Start,\n    4 * 1024 * 1024,                // Size, 4mb\n    MG_IMXRT_SECTOR_SIZE,           // Sector size\n    MG_IMXRT_PAGE_SIZE,             // Align\n    mg_imxrt_write,\n    mg_imxrt_swap,\n};\n\nstruct mg_flexspi_lut_seq {\n  uint8_t seqNum;\n  uint8_t seqId;\n  uint16_t reserved;\n};\n\nstruct mg_flexspi_mem_config {\n  uint32_t tag;\n  uint32_t version;\n  uint32_t reserved0;\n  uint8_t readSampleClkSrc;\n  uint8_t csHoldTime;\n  uint8_t csSetupTime;\n  uint8_t columnAddressWidth;\n  uint8_t deviceModeCfgEnable;\n  uint8_t deviceModeType;\n  uint16_t waitTimeCfgCommands;\n  struct mg_flexspi_lut_seq deviceModeSeq;\n  uint32_t deviceModeArg;\n  uint8_t configCmdEnable;\n  uint8_t configModeType[3];\n  struct mg_flexspi_lut_seq configCmdSeqs[3];\n  uint32_t reserved1;\n  uint32_t configCmdArgs[3];\n  uint32_t reserved2;\n  uint32_t controllerMiscOption;\n  uint8_t deviceType;\n  uint8_t sflashPadType;\n  uint8_t serialClkFreq;\n  uint8_t lutCustomSeqEnable;\n  uint32_t reserved3[2];\n  uint32_t sflashA1Size;\n  uint32_t sflashA2Size;\n  uint32_t sflashB1Size;\n  uint32_t sflashB2Size;\n  uint32_t csPadSettingOverride;\n  uint32_t sclkPadSettingOverride;\n  uint32_t dataPadSettingOverride;\n  uint32_t dqsPadSettingOverride;\n  uint32_t timeoutInMs;\n  uint32_t commandInterval;\n  uint16_t dataValidTime[2];\n  uint16_t busyOffset;\n  uint16_t busyBitPolarity;\n  uint32_t lookupTable[64];\n  struct mg_flexspi_lut_seq lutCustomSeq[12];\n  uint32_t reserved4[4];\n};\n\nstruct mg_flexspi_nor_config {\n  struct mg_flexspi_mem_config memConfig;\n  uint32_t pageSize;\n  uint32_t sectorSize;\n  uint8_t ipcmdSerialClkFreq;\n  uint8_t isUniformBlockSize;\n  uint8_t reserved0[2];\n  uint8_t serialNorType;\n  uint8_t needExitNoCmdMode;\n  uint8_t halfClkForNonReadCmd;\n  uint8_t needRestoreNoCmdMode;\n  uint32_t blockSize;\n  uint32_t reserve2[11];\n};\n\n/* FLEXSPI memory config block related defintions */\n#define MG_FLEXSPI_CFG_BLK_TAG (0x42464346UL)      // ascii \"FCFB\" Big Endian\n#define MG_FLEXSPI_CFG_BLK_VERSION (0x56010400UL)  // V1.4.0\n\n#define MG_FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)       \\\n  (MG_FLEXSPI_LUT_OPERAND0(op0) | MG_FLEXSPI_LUT_NUM_PADS0(pad0) | \\\n   MG_FLEXSPI_LUT_OPCODE0(cmd0) | MG_FLEXSPI_LUT_OPERAND1(op1) |   \\\n   MG_FLEXSPI_LUT_NUM_PADS1(pad1) | MG_FLEXSPI_LUT_OPCODE1(cmd1))\n\n#define MG_CMD_SDR 0x01\n#define MG_CMD_DDR 0x21\n#define MG_DUMMY_SDR 0x0C\n#define MG_DUMMY_DDR 0x2C\n#define MG_DUMMY_RWDS_DDR 0x2D\n#define MG_RADDR_SDR 0x02\n#define MG_RADDR_DDR 0x22\n#define MG_CADDR_DDR 0x23\n#define MG_READ_SDR 0x09\n#define MG_READ_DDR 0x29\n#define MG_WRITE_SDR 0x08\n#define MG_WRITE_DDR 0x28\n#define MG_STOP 0\n\n#define MG_FLEXSPI_1PAD 0\n#define MG_FLEXSPI_2PAD 1\n#define MG_FLEXSPI_4PAD 2\n#define MG_FLEXSPI_8PAD 3\n\n#define MG_FLEXSPI_QSPI_LUT                                                    \\\n  {                                                                            \\\n    [0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0xEB, MG_RADDR_SDR,  \\\n                             MG_FLEXSPI_4PAD, 0x18),                           \\\n    [1] = MG_FLEXSPI_LUT_SEQ(MG_DUMMY_SDR, MG_FLEXSPI_4PAD, 0x06, MG_READ_SDR, \\\n                             MG_FLEXSPI_4PAD, 0x04),                           \\\n    [4 * 1 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x05,        \\\n                                     MG_READ_SDR, MG_FLEXSPI_1PAD, 0x04),      \\\n    [4 * 3 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x06,        \\\n                                     MG_STOP, MG_FLEXSPI_1PAD, 0x0),           \\\n    [4 * 5 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x20,        \\\n                                     MG_RADDR_SDR, MG_FLEXSPI_1PAD, 0x18),     \\\n    [4 * 8 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0xD8,        \\\n                                     MG_RADDR_SDR, MG_FLEXSPI_1PAD, 0x18),     \\\n    [4 * 9 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x02,        \\\n                                     MG_RADDR_SDR, MG_FLEXSPI_1PAD, 0x18),     \\\n    [4 * 9 + 1] = MG_FLEXSPI_LUT_SEQ(MG_WRITE_SDR, MG_FLEXSPI_1PAD, 0x04,      \\\n                                     MG_STOP, MG_FLEXSPI_1PAD, 0x0),           \\\n    [4 * 11 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x60,       \\\n                                      MG_STOP, MG_FLEXSPI_1PAD, 0x0),          \\\n  }\n\n#define MG_FLEXSPI_HYPER_LUT                                                  \\\n  {                                                                           \\\n    [0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xA0, MG_RADDR_DDR, \\\n                             MG_FLEXSPI_8PAD, 0x18),                          \\\n    [1] = MG_FLEXSPI_LUT_SEQ(MG_CADDR_DDR, MG_FLEXSPI_8PAD, 0x10,             \\\n                             MG_DUMMY_DDR, MG_FLEXSPI_8PAD, 0x0C),            \\\n    [2] = MG_FLEXSPI_LUT_SEQ(MG_READ_DDR, MG_FLEXSPI_8PAD, 0x04, MG_STOP,     \\\n                             MG_FLEXSPI_1PAD, 0x0),                           \\\n    [4 * 1 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),       \\\n    [4 * 1 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),      \\\n    [4 * 1 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x05),      \\\n    [4 * 1 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x70),      \\\n    [4 * 2 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xA0,       \\\n                                     MG_RADDR_DDR, MG_FLEXSPI_8PAD, 0x18),    \\\n    [4 * 2 + 1] =                                                             \\\n        MG_FLEXSPI_LUT_SEQ(MG_CADDR_DDR, MG_FLEXSPI_8PAD, 0x10,               \\\n                           MG_DUMMY_RWDS_DDR, MG_FLEXSPI_8PAD, 0x0B),         \\\n    [4 * 2 + 2] = MG_FLEXSPI_LUT_SEQ(MG_READ_DDR, MG_FLEXSPI_8PAD, 0x4,       \\\n                                     MG_STOP, MG_FLEXSPI_1PAD, 0x0),          \\\n    [4 * 3 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),       \\\n    [4 * 3 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),      \\\n    [4 * 3 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x05),      \\\n    [4 * 3 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),      \\\n    [4 * 4 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),       \\\n    [4 * 4 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x55),      \\\n    [4 * 4 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x02),      \\\n    [4 * 4 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x55),      \\\n    [4 * 5 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),       \\\n    [4 * 5 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),      \\\n    [4 * 5 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x05),      \\\n    [4 * 5 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x80),      \\\n    [4 * 6 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),       \\\n    [4 * 6 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),      \\\n    [4 * 6 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x05),      \\\n    [4 * 6 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),      \\\n    [4 * 7 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),       \\\n    [4 * 7 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x55),      \\\n    [4 * 7 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x02),      \\\n    [4 * 7 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x55),      \\\n    [4 * 8 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_RADDR_DDR, MG_FLEXSPI_8PAD, 0x18),    \\\n    [4 * 8 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CADDR_DDR, MG_FLEXSPI_8PAD, 0x10,     \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),       \\\n    [4 * 8 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x30,       \\\n                                     MG_STOP, MG_FLEXSPI_1PAD, 0x0),          \\\n    [4 * 9 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),       \\\n    [4 * 9 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),      \\\n    [4 * 9 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x05),      \\\n    [4 * 9 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,        \\\n                                     MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xA0),      \\\n    [4 * 10 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_RADDR_DDR, MG_FLEXSPI_8PAD, 0x18),   \\\n    [4 * 10 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CADDR_DDR, MG_FLEXSPI_8PAD, 0x10,    \\\n                                      MG_WRITE_DDR, MG_FLEXSPI_8PAD, 0x80),   \\\n    [4 * 11 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),      \\\n    [4 * 11 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),     \\\n    [4 * 11 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x05),     \\\n    [4 * 11 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x80),     \\\n    [4 * 12 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),      \\\n    [4 * 12 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),     \\\n    [4 * 12 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x05),     \\\n    [4 * 12 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),     \\\n    [4 * 13 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),      \\\n    [4 * 13 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x55),     \\\n    [4 * 13 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x02),     \\\n    [4 * 13 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x55),     \\\n    [4 * 14 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0),      \\\n    [4 * 14 + 1] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0xAA),     \\\n    [4 * 14 + 2] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x05),     \\\n    [4 * 14 + 3] = MG_FLEXSPI_LUT_SEQ(MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x0,       \\\n                                      MG_CMD_DDR, MG_FLEXSPI_8PAD, 0x10),     \\\n  }\n\n#define MG_LUT_CUSTOM_SEQ                          \\\n  {                                                \\\n    {.seqNum = 0, .seqId = 0, .reserved = 0},      \\\n        {.seqNum = 2, .seqId = 1, .reserved = 0},  \\\n        {.seqNum = 2, .seqId = 3, .reserved = 0},  \\\n        {.seqNum = 4, .seqId = 5, .reserved = 0},  \\\n        {.seqNum = 2, .seqId = 9, .reserved = 0},  \\\n        {.seqNum = 4, .seqId = 11, .reserved = 0}, \\\n  }\n\n#define MG_FLEXSPI_LUT_OPERAND0(x) (((uint32_t) (((uint32_t) (x)))) & 0xFFU)\n#define MG_FLEXSPI_LUT_NUM_PADS0(x) \\\n  (((uint32_t) (((uint32_t) (x)) << 8U)) & 0x300U)\n#define MG_FLEXSPI_LUT_OPCODE0(x) \\\n  (((uint32_t) (((uint32_t) (x)) << 10U)) & 0xFC00U)\n#define MG_FLEXSPI_LUT_OPERAND1(x) \\\n  (((uint32_t) (((uint32_t) (x)) << 16U)) & 0xFF0000U)\n#define MG_FLEXSPI_LUT_NUM_PADS1(x) \\\n  (((uint32_t) (((uint32_t) (x)) << 24U)) & 0x3000000U)\n#define MG_FLEXSPI_LUT_OPCODE1(x) \\\n  (((uint32_t) (((uint32_t) (x)) << 26U)) & 0xFC000000U)\n\n#if MG_OTA == MG_OTA_RT1020 || MG_OTA == MG_OTA_RT1050\n// RT102X and RT105x boards support ROM API version 1.4\nstruct mg_flexspi_nor_driver_interface {\n  uint32_t version;\n  int (*init)(uint32_t instance, struct mg_flexspi_nor_config *config);\n  int (*program)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                 uint32_t dst_addr, const uint32_t *src);\n  uint32_t reserved;\n  int (*erase)(uint32_t instance, struct mg_flexspi_nor_config *config,\n               uint32_t start, uint32_t lengthInBytes);\n  uint32_t reserved2;\n  int (*update_lut)(uint32_t instance, uint32_t seqIndex,\n                    const uint32_t *lutBase, uint32_t seqNumber);\n  int (*xfer)(uint32_t instance, char *xfer);\n  void (*clear_cache)(uint32_t instance);\n};\n#elif MG_OTA <= MG_OTA_RT1064\n// RT104x and RT106x support ROM API version 1.5\nstruct mg_flexspi_nor_driver_interface {\n  uint32_t version;\n  int (*init)(uint32_t instance, struct mg_flexspi_nor_config *config);\n  int (*program)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                 uint32_t dst_addr, const uint32_t *src);\n  int (*erase_all)(uint32_t instance, struct mg_flexspi_nor_config *config);\n  int (*erase)(uint32_t instance, struct mg_flexspi_nor_config *config,\n               uint32_t start, uint32_t lengthInBytes);\n  int (*read)(uint32_t instance, struct mg_flexspi_nor_config *config,\n              uint32_t *dst, uint32_t addr, uint32_t lengthInBytes);\n  void (*clear_cache)(uint32_t instance);\n  int (*xfer)(uint32_t instance, char *xfer);\n  int (*update_lut)(uint32_t instance, uint32_t seqIndex,\n                    const uint32_t *lutBase, uint32_t seqNumber);\n  int (*get_config)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                    uint32_t *option);\n};\n#else\n// RT117x support ROM API version 1.7\nstruct mg_flexspi_nor_driver_interface {\n  uint32_t version;\n  int (*init)(uint32_t instance, struct mg_flexspi_nor_config *config);\n  int (*program)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                 uint32_t dst_addr, const uint32_t *src);\n  int (*erase_all)(uint32_t instance, struct mg_flexspi_nor_config *config);\n  int (*erase)(uint32_t instance, struct mg_flexspi_nor_config *config,\n               uint32_t start, uint32_t lengthInBytes);\n  int (*read)(uint32_t instance, struct mg_flexspi_nor_config *config,\n              uint32_t *dst, uint32_t addr, uint32_t lengthInBytes);\n  uint32_t reserved;\n  int (*xfer)(uint32_t instance, char *xfer);\n  int (*update_lut)(uint32_t instance, uint32_t seqIndex,\n                    const uint32_t *lutBase, uint32_t seqNumber);\n  int (*get_config)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                    uint32_t *option);\n  int (*erase_sector)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                      uint32_t address);\n  int (*erase_block)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                     uint32_t address);\n  void (*hw_reset)(uint32_t instance, uint32_t resetLogic);\n  int (*wait_busy)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                   bool isParallelMode, uint32_t address);\n  int (*set_clock_source)(uint32_t instance, uint32_t clockSrc);\n  void (*config_clock)(uint32_t instance, uint32_t freqOption,\n                       uint32_t sampleClkMode);\n};\n#endif\n\n#if MG_OTA <= MG_OTA_RT1064\n#define MG_FLEXSPI_BASE 0x402A8000\n#define flexspi_nor                                                          \\\n  (*((struct mg_flexspi_nor_driver_interface **) (*(uint32_t *) 0x0020001c + \\\n                                                  16)))\n#else\n#define MG_FLEXSPI_BASE 0x400CC000\n#define flexspi_nor                                                          \\\n  (*((struct mg_flexspi_nor_driver_interface **) (*(uint32_t *) 0x0021001c + \\\n                                                  12)))\n#endif\n\nstatic bool s_flash_irq_disabled;\n\nMG_IRAM static bool flash_page_start(volatile uint32_t *dst) {\n  char *base = (char *) s_mg_flash_imxrt.start,\n       *end = base + s_mg_flash_imxrt.size;\n  volatile char *p = (char *) dst;\n  return p >= base && p < end && ((p - base) % s_mg_flash_imxrt.secsz) == 0;\n}\n\n#if MG_OTA == MG_OTA_RT1050\n// Configuration for Hyper flash memory\nstatic struct mg_flexspi_nor_config default_config = {\n    .memConfig =\n        {\n            .tag = MG_FLEXSPI_CFG_BLK_TAG,\n            .version = MG_FLEXSPI_CFG_BLK_VERSION,\n            .readSampleClkSrc = 3,  // ReadSampleClk_LoopbackFromDqsPad\n            .csHoldTime = 3,\n            .csSetupTime = 3,\n            .columnAddressWidth = 3u,\n            .controllerMiscOption =\n                MG_BIT(6) | MG_BIT(4) | MG_BIT(3) | MG_BIT(0),\n            .deviceType = 1,  // serial NOR\n            .sflashPadType = 8,\n            .serialClkFreq = 7,  // 133MHz\n            .sflashA1Size = 64 * 1024 * 1024,\n            .dataValidTime = {15, 0},\n            .busyOffset = 15,\n            .busyBitPolarity = 1,\n            .lutCustomSeqEnable = 0x1,\n            .lookupTable = MG_FLEXSPI_HYPER_LUT,\n            .lutCustomSeq = MG_LUT_CUSTOM_SEQ,\n        },\n    .pageSize = 512,\n    .sectorSize = 256 * 1024,\n    .ipcmdSerialClkFreq = 1,\n    .serialNorType = 1u,\n    .blockSize = 256 * 1024,\n    .isUniformBlockSize = true};\n#else\n// Note: this QSPI configuration works for RTs supporting QSPI\n// Configuration for QSPI memory\nstatic struct mg_flexspi_nor_config default_config = {\n    .memConfig = {.tag = MG_FLEXSPI_CFG_BLK_TAG,\n                  .version = MG_FLEXSPI_CFG_BLK_VERSION,\n                  .readSampleClkSrc = 1,  // ReadSampleClk_LoopbackFromDqsPad\n                  .csHoldTime = 3,\n                  .csSetupTime = 3,\n                  .controllerMiscOption = MG_BIT(4),\n                  .deviceType = 1,  // serial NOR\n                  .sflashPadType = 4,\n                  .serialClkFreq = 7,  // 133MHz\n                  .sflashA1Size = 8 * 1024 * 1024,\n                  .lookupTable = MG_FLEXSPI_QSPI_LUT},\n    .pageSize = 256,\n    .sectorSize = 4 * 1024,\n    .ipcmdSerialClkFreq = 1,\n    .blockSize = 64 * 1024,\n    .isUniformBlockSize = false};\n#endif\n\n// must reside in RAM, as flash will be erased\nMG_IRAM static int flexspi_nor_get_config(\n    struct mg_flexspi_nor_config **config) {\n  *config = &default_config;\n  return 0;\n}\n\n#if 0\n// ROM API get_config call (ROM version >= 1.5)\nMG_IRAM static int flexspi_nor_get_config(\n    struct mg_flexspi_nor_config **config) {\n  uint32_t options[] = {0xc0000000, 0x00};\n\n  MG_ARM_DISABLE_IRQ();\n  uint32_t status =\n      flexspi_nor->get_config(FLEXSPI_NOR_INSTANCE, *config, options);\n  if (!s_flash_irq_disabled) {\n    MG_ARM_ENABLE_IRQ();\n  }\n  if (status) {\n    MG_ERROR((\"Failed to extract flash configuration: status %u\", status));\n  }\n  return status;\n}\n#endif\n\nMG_IRAM static void mg_spin(volatile uint32_t count) {\n  while (count--) (void) 0;\n}\n\nMG_IRAM static void flash_wait(void) {\n  while ((*((volatile uint32_t *) (MG_FLEXSPI_BASE + 0xE0)) & MG_BIT(1)) == 0)\n    mg_spin(1);\n}\n\nMG_IRAM static bool flash_erase(struct mg_flexspi_nor_config *config,\n                                void *addr) {\n  if (flash_page_start(addr) == false) {\n    MG_ERROR((\"%p is not on a sector boundary\", addr));\n    return false;\n  }\n\n  void *dst = (void *) ((char *) addr - (char *) s_mg_flash_imxrt.start);\n\n  bool ok = (flexspi_nor->erase(FLEXSPI_NOR_INSTANCE, config, (uint32_t) dst,\n                                s_mg_flash_imxrt.secsz) == 0);\n  MG_DEBUG((\"Sector starting at %p erasure: %s\", addr, ok ? \"ok\" : \"fail\"));\n  return ok;\n}\n\n#if 0\n// standalone erase call\nMG_IRAM static bool mg_imxrt_erase(void *addr) {\n  struct mg_flexspi_nor_config config, *config_ptr = &config;\n  bool ret;\n  // Interrupts must be disabled before calls to ROM API in RT1020 and 1060\n  MG_ARM_DISABLE_IRQ();\n  ret = (flexspi_nor_get_config(&config_ptr) == 0);\n  if (ret) ret = flash_erase(config_ptr, addr);\n  MG_ARM_ENABLE_IRQ();\n  return ret;\n}\n#endif\n\nMG_IRAM bool mg_imxrt_swap(void) {\n  return true;\n}\n\nMG_IRAM static bool mg_imxrt_write(void *addr, const void *buf, size_t len) {\n  struct mg_flexspi_nor_config config, *config_ptr = &config;\n  bool ok = false;\n  // Interrupts must be disabled before calls to ROM API in RT1020 and 1060\n  MG_ARM_DISABLE_IRQ();\n  if (flexspi_nor_get_config(&config_ptr) != 0) goto fwxit;\n  if ((len % s_mg_flash_imxrt.align) != 0) {\n    MG_ERROR((\"%lu is not aligned to %lu\", len, s_mg_flash_imxrt.align));\n    goto fwxit;\n  }\n  if ((char *) addr < (char *) s_mg_flash_imxrt.start) {\n    MG_ERROR((\"Invalid flash write address: %p\", addr));\n    goto fwxit;\n  }\n\n  uint32_t *dst = (uint32_t *) addr;\n  uint32_t *src = (uint32_t *) buf;\n  uint32_t *end = (uint32_t *) ((char *) buf + len);\n  ok = true;\n\n  while (ok && src < end) {\n    if (flash_page_start(dst) && flash_erase(config_ptr, dst) == false) {\n      ok = false;\n      break;\n    }\n    uint32_t status;\n    uint32_t dst_ofs = (uint32_t) dst - (uint32_t) s_mg_flash_imxrt.start;\n    if ((char *) buf >= (char *) s_mg_flash_imxrt.start) {\n      // If we copy from FLASH to FLASH, then we first need to copy the source\n      // to RAM\n      size_t tmp_buf_size = s_mg_flash_imxrt.align / sizeof(uint32_t);\n      uint32_t tmp[tmp_buf_size];\n\n      for (size_t i = 0; i < tmp_buf_size; i++) {\n        flash_wait();\n        tmp[i] = src[i];\n      }\n      status = flexspi_nor->program(FLEXSPI_NOR_INSTANCE, config_ptr,\n                                    (uint32_t) dst_ofs, tmp);\n    } else {\n      status = flexspi_nor->program(FLEXSPI_NOR_INSTANCE, config_ptr,\n                                    (uint32_t) dst_ofs, src);\n    }\n    src = (uint32_t *) ((char *) src + s_mg_flash_imxrt.align);\n    dst = (uint32_t *) ((char *) dst + s_mg_flash_imxrt.align);\n    if (status != 0) {\n      ok = false;\n    }\n  }\n  MG_DEBUG((\"Flash write %lu bytes @ %p: %s.\", len, dst, ok ? \"ok\" : \"fail\"));\nfwxit:\n  if (!s_flash_irq_disabled) MG_ARM_ENABLE_IRQ();\n  return ok;\n}\n\n// just overwrite instead of swap\nMG_IRAM static void single_bank_swap(char *p1, char *p2, size_t s, size_t ss) {\n  // no stdlib calls here\n  for (size_t ofs = 0; ofs < s; ofs += ss) {\n    mg_imxrt_write(p1 + ofs, p2 + ofs, ss);\n  }\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_imxrt);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_imxrt);\n}\n\nbool mg_ota_end(void) {\n  if (mg_ota_flash_end(&s_mg_flash_imxrt)) {\n    if (0) {  // is_dualbank()\n      // TODO(): no devices so far\n      *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n    } else {\n      // Swap partitions. Pray power does not go away\n      MG_INFO((\"Swapping partitions, size %u (%u sectors)\",\n               s_mg_flash_imxrt.size,\n               s_mg_flash_imxrt.size / s_mg_flash_imxrt.secsz));\n      MG_INFO((\"Do NOT power off...\"));\n      mg_log_level = MG_LL_NONE;\n      s_flash_irq_disabled = true;\n      // Runs in RAM, will reset when finished\n      single_bank_swap(\n          (char *) s_mg_flash_imxrt.start,\n          (char *) s_mg_flash_imxrt.start + s_mg_flash_imxrt.size / 2,\n          s_mg_flash_imxrt.size / 2, s_mg_flash_imxrt.secsz);\n    }\n  }\n  return false;\n}\n\n#endif\n"
  },
  {
    "path": "src/ota_mcxn.c",
    "content": "#include \"flash.h\"\n#include \"log.h\"\n#include \"ota.h\"\n\n#if MG_OTA == MG_OTA_MCXN\n\n// - Flash phrase: 16 bytes; smallest portion programmed in one operation.\n// - Flash page: 128 bytes; largest portion programmed in one operation.\n// - Flash sector: 8 KB; smallest portion that can be erased in one operation.\n// - Flash API mg_flash_driver->program: \"start\" and \"len\" must be page-size\n// aligned; to use 'phrase', FMU register access is needed. Using ROM\n\nstatic bool mg_mcxn_write(void *, const void *, size_t);\nstatic bool mg_mcxn_swap(void);\n\nstatic struct mg_flash s_mg_flash_mcxn = {\n    (void *) 0,  // Start, filled at init\n    0,           // Size, filled at init\n    0,           // Sector size, filled at init\n    0,           // Align, filled at init\n    mg_mcxn_write,\n    mg_mcxn_swap,\n};\n\nstruct mg_flash_config {\n  uint32_t addr;\n  uint32_t size;\n  uint32_t blocks;\n  uint32_t page_size;\n  uint32_t sector_size;\n  uint32_t ffr[6];\n  uint32_t reserved0[5];\n  uint32_t *bootctx;\n  bool useahb;\n};\n\nstruct mg_flash_driver_interface {\n  uint32_t version;\n  uint32_t (*init)(struct mg_flash_config *);\n  uint32_t (*erase)(struct mg_flash_config *, uint32_t start, uint32_t len,\n                    uint32_t key);\n  uint32_t (*program)(struct mg_flash_config *, uint32_t start, uint8_t *src,\n                      uint32_t len);\n  uint32_t (*verify_erase)(struct mg_flash_config *, uint32_t start,\n                           uint32_t len);\n  uint32_t (*verify_program)(struct mg_flash_config *, uint32_t start,\n                             uint32_t len, const uint8_t *expected,\n                             uint32_t *addr, uint32_t *failed);\n  uint32_t reserved1[12];\n  uint32_t (*read)(struct mg_flash_config *, uint32_t start, uint8_t *dest,\n                   uint32_t len);\n  uint32_t reserved2[4];\n  uint32_t (*deinit)(struct mg_flash_config *);\n};\n#define mg_flash_driver \\\n  ((struct mg_flash_driver_interface *) (*((uint32_t *) 0x1303fc00 + 4)))\n#define MG_MCXN_FLASK_KEY (('k' << 24) | ('e' << 16) | ('f' << 8) | 'l')\n\nMG_IRAM static bool flash_sector_start(volatile uint32_t *dst) {\n  char *base = (char *) s_mg_flash_mcxn.start,\n       *end = base + s_mg_flash_mcxn.size;\n  volatile char *p = (char *) dst;\n  return p >= base && p < end && ((p - base) % s_mg_flash_mcxn.secsz) == 0;\n}\n\nMG_IRAM static bool flash_erase(struct mg_flash_config *config, void *addr) {\n  if (flash_sector_start(addr) == false) {\n    MG_ERROR((\"%p is not on a sector boundary\", addr));\n    return false;\n  }\n  uint32_t dst =\n      (uint32_t) addr - (uint32_t) s_mg_flash_mcxn.start;  // future-proof\n  uint32_t status = mg_flash_driver->erase(config, dst, s_mg_flash_mcxn.secsz,\n                                           MG_MCXN_FLASK_KEY);\n  bool ok = (status == 0);\n  if (!ok) MG_ERROR((\"Flash write error: %lu\", status));\n  MG_DEBUG((\"Sector starting at %p erasure: %s\", addr, ok ? \"ok\" : \"fail\"));\n  return ok;\n}\n\n#if 0\n// read-while-write, no need to disable IRQs for standalone usage\nMG_IRAM static bool mg_mcxn_erase(void *addr) {\n  uint32_t status;\n  struct mg_flash_config config;\n  if ((status = mg_flash_driver->init(&config)) != 0) {\n    MG_ERROR((\"Flash driver init error: %lu\", status));\n    return false;\n  }\n  bool ok = flash_erase(&config, addr);\n  mg_flash_driver->deinit(&config);\n  return ok;\n}\n#endif\n\nMG_IRAM static bool mg_mcxn_swap(void) {\n  // TODO(): no devices so far\n  return true;\n}\n\nstatic bool s_flash_irq_disabled;\n\nMG_IRAM static bool mg_mcxn_write(void *addr, const void *buf, size_t len) {\n  bool ok = false;\n  uint32_t status;\n  struct mg_flash_config config;\n  if ((status = mg_flash_driver->init(&config)) != 0) {\n    MG_ERROR((\"Flash driver init error: %lu\", status));\n    return false;\n  }\n  if ((len % s_mg_flash_mcxn.align) != 0) {\n    MG_ERROR((\"%lu is not aligned to %lu\", len, s_mg_flash_mcxn.align));\n    goto fwxit;\n  }\n  if ((((size_t) addr - (size_t) s_mg_flash_mcxn.start) %\n       s_mg_flash_mcxn.align) != 0) {\n    MG_ERROR((\"%p is not on a page boundary\", addr));\n    goto fwxit;\n  }\n\n  uint32_t *dst = (uint32_t *) addr;\n  uint32_t *src = (uint32_t *) buf;\n  uint32_t *end = (uint32_t *) ((char *) buf + len);\n  ok = true;\n\n  MG_ARM_DISABLE_IRQ();\n  while (ok && src < end) {\n    if (flash_sector_start(dst) && flash_erase(&config, dst) == false) {\n      ok = false;\n      break;\n    }\n    uint32_t dst_ofs = (uint32_t) dst - (uint32_t) s_mg_flash_mcxn.start;\n    // assume source is in RAM or in a different bank or read-while-write\n    status = mg_flash_driver->program(&config, dst_ofs, (uint8_t *) src,\n                                      s_mg_flash_mcxn.align);\n    src = (uint32_t *) ((char *) src + s_mg_flash_mcxn.align);\n    dst = (uint32_t *) ((char *) dst + s_mg_flash_mcxn.align);\n    if (status != 0) {\n      MG_ERROR((\"Flash write error: %lu\", status));\n      ok = false;\n    }\n  }\n  if (!s_flash_irq_disabled) MG_ARM_ENABLE_IRQ();\n  MG_DEBUG((\"Flash write %lu bytes @ %p: %s.\", len, dst, ok ? \"ok\" : \"fail\"));\n\nfwxit:\n  mg_flash_driver->deinit(&config);\n  return ok;\n}\n\n// try to swap (honor dual image), otherwise just overwrite\nMG_IRAM static void single_bank_swap(char *p1, char *p2, size_t s, size_t ss) {\n  char *tmp = mg_calloc(1, ss);\n  // no stdlib calls here\n  for (size_t ofs = 0; ofs < s; ofs += ss) {\n    if (tmp != NULL)\n      for (size_t i = 0; i < ss; i++) tmp[i] = p1[ofs + i];\n    mg_mcxn_write(p1 + ofs, p2 + ofs, ss);\n    if (tmp != NULL) mg_mcxn_write(p2 + ofs, tmp, ss);\n  }\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  uint32_t status;\n  struct mg_flash_config config;\n  if ((status = mg_flash_driver->init(&config)) != 0) {\n    MG_ERROR((\"Flash driver init error: %lu\", status));\n    return false;\n  }\n  s_mg_flash_mcxn.start = (void *) config.addr;\n  s_mg_flash_mcxn.size = config.size;\n  s_mg_flash_mcxn.secsz = config.sector_size;\n  s_mg_flash_mcxn.align = config.page_size;\n  mg_flash_driver->deinit(&config);\n  MG_DEBUG(\n      (\"%lu-byte flash @%p, using %lu-byte sectors with %lu-byte-aligned pages\",\n       s_mg_flash_mcxn.size, s_mg_flash_mcxn.start, s_mg_flash_mcxn.secsz,\n       s_mg_flash_mcxn.align));\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_mcxn);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_mcxn);\n}\n\nbool mg_ota_end(void) {\n  if (mg_ota_flash_end(&s_mg_flash_mcxn)) {\n    if (0) {  // is_dualbank()\n      // TODO(): no devices so far\n      *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n    } else {\n      // Swap partitions. Pray power does not go away\n      MG_INFO((\"Swapping partitions, size %u (%u sectors)\",\n               s_mg_flash_mcxn.size,\n               s_mg_flash_mcxn.size / s_mg_flash_mcxn.secsz));\n      MG_INFO((\"Do NOT power off...\"));\n      mg_log_level = MG_LL_NONE;\n      s_flash_irq_disabled = true;\n      // Runs in RAM, will reset when finished\n      single_bank_swap(\n          (char *) s_mg_flash_mcxn.start,\n          (char *) s_mg_flash_mcxn.start + s_mg_flash_mcxn.size / 2,\n          s_mg_flash_mcxn.size / 2, s_mg_flash_mcxn.secsz);\n    }\n  }\n  return false;\n}\n#endif\n"
  },
  {
    "path": "src/ota_picosdk.c",
    "content": "#include \"flash.h\"\n#include \"log.h\"\n#include \"ota.h\"\n\n#if MG_OTA == MG_OTA_PICOSDK\n\n// Both RP2040 and RP2350 have no flash, low-level flash access support in\n// bootrom, and high-level support in Pico-SDK (2.0+ for the RP2350)\n// - The RP2350 in RISC-V mode is not tested\n// NOTE(): See OTA design notes\n\nstatic bool mg_picosdk_write(void *, const void *, size_t);\nstatic bool mg_picosdk_swap(void);\n\nstatic struct mg_flash s_mg_flash_picosdk = {\n    (void *) 0x10000000,  // Start; functions handle offset\n#ifdef PICO_FLASH_SIZE_BYTES\n    PICO_FLASH_SIZE_BYTES,  // Size, from board definitions\n#else\n    0x200000,  // Size, guess... is 2M enough ?\n#endif\n    FLASH_SECTOR_SIZE,  // Sector size, from hardware_flash\n    FLASH_PAGE_SIZE,    // Align, from hardware_flash\n    mg_picosdk_write,      mg_picosdk_swap,\n};\n\n#define MG_MODULO2(x, m) ((x) & ((m) -1))\n\nstatic bool __no_inline_not_in_flash_func(flash_sector_start)(\n    volatile uint32_t *dst) {\n  char *base = (char *) s_mg_flash_picosdk.start,\n       *end = base + s_mg_flash_picosdk.size;\n  volatile char *p = (char *) dst;\n  return p >= base && p < end &&\n         MG_MODULO2(p - base, s_mg_flash_picosdk.secsz) == 0;\n}\n\nstatic bool __no_inline_not_in_flash_func(flash_erase)(void *addr) {\n  if (flash_sector_start(addr) == false) {\n    MG_ERROR((\"%p is not on a sector boundary\", addr));\n    return false;\n  }\n  void *dst = (void *) ((char *) addr - (char *) s_mg_flash_picosdk.start);\n  flash_range_erase((uint32_t) dst, s_mg_flash_picosdk.secsz);\n  MG_DEBUG((\"Sector starting at %p erasure\", addr));\n  return true;\n}\n\nstatic bool __no_inline_not_in_flash_func(mg_picosdk_swap)(void) {\n  // TODO(): RP2350 might have some A/B functionality (DS 5.1)\n  return true;\n}\n\nstatic bool s_flash_irq_disabled;\n\nstatic bool __no_inline_not_in_flash_func(mg_picosdk_write)(void *addr,\n                                                            const void *buf,\n                                                            size_t len) {\n  if ((len % s_mg_flash_picosdk.align) != 0) {\n    MG_ERROR((\"%lu is not aligned to %lu\", len, s_mg_flash_picosdk.align));\n    return false;\n  }\n  if ((((size_t) addr - (size_t) s_mg_flash_picosdk.start) %\n       s_mg_flash_picosdk.align) != 0) {\n    MG_ERROR((\"%p is not on a page boundary\", addr));\n    return false;\n  }\n\n  uint32_t *dst = (uint32_t *) addr;\n  uint32_t *src = (uint32_t *) buf;\n  uint32_t *end = (uint32_t *) ((char *) buf + len);\n\n#ifndef __riscv\n  MG_ARM_DISABLE_IRQ();\n#else\n  asm volatile(\"csrrc zero, mstatus, %0\" : : \"i\"(1 << 3) : \"memory\");\n#endif\n  while (src < end) {\n    uint32_t dst_ofs = (uint32_t) dst - (uint32_t) s_mg_flash_picosdk.start;\n    if (flash_sector_start(dst) && flash_erase(dst) == false) break;\n    // flash_range_program() runs in RAM and handles writing up to\n    // FLASH_PAGE_SIZE bytes. Source must not be in flash\n    flash_range_program((uint32_t) dst_ofs, (uint8_t *) src,\n                        s_mg_flash_picosdk.align);\n    src = (uint32_t *) ((char *) src + s_mg_flash_picosdk.align);\n    dst = (uint32_t *) ((char *) dst + s_mg_flash_picosdk.align);\n  }\n  if (!s_flash_irq_disabled) {\n#ifndef __riscv\n    MG_ARM_ENABLE_IRQ();\n#else\n    asm volatile(\"csrrs mstatus, %0\" : : \"i\"(1 << 3) : \"memory\");\n#endif\n  }\n  MG_DEBUG((\"Flash write %lu bytes @ %p.\", len, dst));\n  return true;\n}\n\n// just overwrite instead of swap\nstatic void __no_inline_not_in_flash_func(single_bank_swap)(char *p1, char *p2,\n                                                            size_t s,\n                                                            size_t ss) {\n  char *tmp = mg_calloc(1, ss);\n  if (tmp == NULL) return;\n#if PICO_RP2040\n  uint32_t xip[256 / sizeof(uint32_t)];\n  void *dst = (void *) ((char *) p1 - (char *) s_mg_flash_picosdk.start);\n  size_t count = MG_ROUND_UP(s, ss);\n  // use SDK function calls to get BootROM function pointers\n  rom_connect_internal_flash_fn connect = (rom_connect_internal_flash_fn) rom_func_lookup(ROM_FUNC_CONNECT_INTERNAL_FLASH);\n  rom_flash_exit_xip_fn xit = (rom_flash_exit_xip_fn) rom_func_lookup(ROM_FUNC_FLASH_EXIT_XIP);\n  rom_flash_range_program_fn program = (rom_flash_range_program_fn) rom_func_lookup(ROM_FUNC_FLASH_RANGE_PROGRAM);\n  rom_flash_flush_cache_fn flush = (rom_flash_flush_cache_fn) rom_func_lookup(ROM_FUNC_FLASH_FLUSH_CACHE);\n  // no stdlib calls here.\n  MG_ARM_DISABLE_IRQ();\n  // 2nd bootloader (XIP) is in flash, SDK functions copy it to RAM on entry\n  for (size_t i = 0; i < 256 / sizeof(uint32_t); i++)\n    xip[i] = ((uint32_t *) (s_mg_flash_picosdk.start))[i];\n  flash_range_erase((uint32_t) dst, count);\n  // flash has been erased, no XIP to copy. Only BootROM calls possible\n  for (uint32_t ofs = 0; ofs < s; ofs += ss) {\n    for (size_t i = 0; i < ss; i++) tmp[i] = p2[ofs + i];\n    __compiler_memory_barrier();\n    connect();\n    xit();\n    program((uint32_t) dst + ofs, tmp, ss);\n    flush();\n    ((void (*)(void))((intptr_t) xip + 1))(); // enter XIP again\n  }\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;  // AIRCR = SYSRESETREQ\n#else\n  // RP2350 has BootRAM and copies second bootloader there, SDK uses that copy,\n  // It might also be able to take advantage of partition swapping\n  rom_reboot_fn reboot = (rom_reboot_fn) rom_func_lookup(ROM_FUNC_REBOOT);\n  for (size_t ofs = 0; ofs < s; ofs += ss) {\n    for (size_t i = 0; i < ss; i++) tmp[i] = p2[ofs + i];\n    mg_picosdk_write(p1 + ofs, tmp, ss);\n  }\n  reboot(BOOT_TYPE_NORMAL | 0x100, 1, 0, 0); // 0x100: NO_RETURN_ON_SUCCESS\n#endif\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_picosdk);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_picosdk);\n}\n\nbool mg_ota_end(void) {\n  if (mg_ota_flash_end(&s_mg_flash_picosdk)) {\n    // Swap partitions. Pray power does not go away\n    MG_INFO((\"Swapping partitions, size %u (%u sectors)\",\n             s_mg_flash_picosdk.size,\n             s_mg_flash_picosdk.size / s_mg_flash_picosdk.secsz));\n    MG_INFO((\"Do NOT power off...\"));\n    mg_log_level = MG_LL_NONE;\n    s_flash_irq_disabled = true;\n    // Runs in RAM, will reset when finished or return on failure\n    single_bank_swap(\n        (char *) s_mg_flash_picosdk.start,\n        (char *) s_mg_flash_picosdk.start + s_mg_flash_picosdk.size / 2,\n        s_mg_flash_picosdk.size / 2, s_mg_flash_picosdk.secsz);\n  }\n  return false;\n}\n#endif\n"
  },
  {
    "path": "src/ota_rw612.c",
    "content": "#include \"flash.h\"\n#include \"log.h\"\n#include \"ota.h\"\n\n#if MG_OTA == MG_OTA_RW612\n\nMG_IRAM static bool mg_frdm_write(void *, const void *, size_t);\nstatic bool mg_frdm_swap(void);\n\nstatic struct mg_flash s_mg_flash_frdm = {(void *) 0x08000000,  // Start,\n                                          0x200000,             // Size\n                                          0x1000,               // Sector size\n                                          0x100,                // Align\n                                          mg_frdm_write,\n                                          mg_frdm_swap};\n\nstruct mg_flexspi_lut_seq {\n  uint8_t seqNum;\n  uint8_t seqId;\n  uint16_t reserved;\n};\n\nstruct mg_flexspi_mem_config {\n  uint32_t tag;\n  uint32_t version;\n  uint32_t reserved0;\n  uint8_t readSampleClkSrc;\n  uint8_t csHoldTime;\n  uint8_t csSetupTime;\n  uint8_t columnAddressWidth;\n  uint8_t deviceModeCfgEnable;\n  uint8_t deviceModeType;\n  uint16_t waitTimeCfgCommands;\n  struct mg_flexspi_lut_seq deviceModeSeq;\n  uint32_t deviceModeArg;\n  uint8_t configCmdEnable;\n  uint8_t configModeType[3];\n  struct mg_flexspi_lut_seq configCmdSeqs[3];\n  uint32_t reserved1;\n  uint32_t configCmdArgs[3];\n  uint32_t reserved2;\n  uint32_t controllerMiscOption;\n  uint8_t deviceType;\n  uint8_t sflashPadType;\n  uint8_t serialClkFreq;\n  uint8_t lutCustomSeqEnable;\n  uint32_t reserved3[2];\n  uint32_t sflashA1Size;\n  uint32_t sflashA2Size;\n  uint32_t sflashB1Size;\n  uint32_t sflashB2Size;\n  uint32_t csPadSettingOverride;\n  uint32_t sclkPadSettingOverride;\n  uint32_t dataPadSettingOverride;\n  uint32_t dqsPadSettingOverride;\n  uint32_t timeoutInMs;\n  uint32_t commandInterval;\n  uint16_t dataValidTime[2];\n  uint16_t busyOffset;\n  uint16_t busyBitPolarity;\n  uint32_t lookupTable[64];\n  struct mg_flexspi_lut_seq lutCustomSeq[12];\n  uint32_t reserved4[4];\n};\n\nstruct mg_flexspi_nor_config {\n  struct mg_flexspi_mem_config memConfig;\n  uint32_t pageSize;\n  uint32_t sectorSize;\n  uint8_t ipcmdSerialClkFreq;\n  uint8_t isUniformBlockSize;\n  uint8_t isDataOrderSwapped;\n  uint8_t reserved0[1];\n  uint8_t serialNorType;\n  uint8_t needExitNoCmdMode;\n  uint8_t halfClkForNonReadCmd;\n  uint8_t needRestoreNoCmdMode;\n  uint32_t blockSize;\n  uint32_t flashStateCtx;\n  uint32_t reserve2[10];\n};\n\nstruct mg_flexspi_nor_driver_interface {\n  uint32_t version;\n  uint32_t (*init)(uint32_t instance, struct mg_flexspi_nor_config *config);\n  uint32_t (*wait_busy)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                        uint32_t address, bool keepState);\n  uint32_t (*page_program)(uint32_t instance,\n                           struct mg_flexspi_nor_config *config,\n                           uint32_t dstAddr, const uint32_t *src,\n                           bool keepState);\n  uint32_t (*erase_all)(uint32_t instance,\n                        struct mg_flexspi_nor_config *config);\n  uint32_t (*erase)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                    uint32_t start, uint32_t length);\n  uint32_t (*erase_sector)(uint32_t instance,\n                           struct mg_flexspi_nor_config *config,\n                           uint32_t address);\n  uint32_t (*erase_block)(uint32_t instance,\n                          struct mg_flexspi_nor_config *config,\n                          uint32_t address);\n  uint32_t (*read)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                   uint32_t *dst, uint32_t start, uint32_t bytes);\n  void (*config_clock)(uint32_t instance, uint32_t freqOption,\n                       uint32_t sampleClkMode);\n  uint32_t (*set_clock_source)(uint32_t clockSrc);\n  uint32_t (*get_config)(uint32_t instance,\n                         struct mg_flexspi_nor_config *config,\n                         uint32_t *option);\n  void (*hw_reset)(uint32_t instance, uint32_t reset_logic);\n  uint32_t (*xfer)(uint32_t instance, char *xfer);\n  uint32_t (*update_lut)(uint32_t instance, uint32_t seqIndex,\n                         const uint32_t *lutBase, uint32_t numberOfSeq);\n  uint32_t (*partial_program)(uint32_t instance,\n                              struct mg_flexspi_nor_config *config,\n                              uint32_t dstAddr, const uint32_t *src,\n                              uint32_t length, bool keepState);\n};\n\n#define MG_FLEXSPI_CFG_BLK_TAG (0x42464346UL)\n#define MG_FLEXSPI_BASE 0x40134000UL\n\n#define MG_CMD_SDR 0x01\n#define MG_RADDR_SDR 0x02\n#define MG_WRITE_SDR 0x08\n#define MG_READ_SDR 0x09\n#define MG_DUMMY_SDR 0x0C\n#define MG_STOP_EXE 0\n\n#define MG_FLEXSPI_1PAD 0\n#define MG_FLEXSPI_4PAD 2\n\n#define MG_FLEXSPI_LUT_OPERAND0(x) (((x) &0xFF) << 0)\n#define MG_FLEXSPI_LUT_NUM_PADS0(x) (((x) &0x3) << 8)\n#define MG_FLEXSPI_LUT_OPCODE0(x) (((x) &0x3F) << 10)\n#define MG_FLEXSPI_LUT_OPERAND1(x) (((x) &0xFF) << 16)\n#define MG_FLEXSPI_LUT_NUM_PADS1(x) (((x) &0x3) << 24)\n#define MG_FLEXSPI_LUT_OPCODE1(x) (((x) &0x3F) << 26)\n\n#define MG_FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)       \\\n  (MG_FLEXSPI_LUT_OPERAND0(op0) | MG_FLEXSPI_LUT_NUM_PADS0(pad0) | \\\n   MG_FLEXSPI_LUT_OPCODE0(cmd0) | MG_FLEXSPI_LUT_OPERAND1(op1) |   \\\n   MG_FLEXSPI_LUT_NUM_PADS1(pad1) | MG_FLEXSPI_LUT_OPCODE1(cmd1))\n\nstruct mg_flexspi_nor_config default_config = {\n    .memConfig =\n        {\n            .tag = MG_FLEXSPI_CFG_BLK_TAG,\n            .version = 0,\n            .readSampleClkSrc = 1,\n            .csHoldTime = 3,\n            .csSetupTime = 3,\n            .deviceModeCfgEnable = 1,\n            .deviceModeSeq = {.seqNum = 1, .seqId = 2},\n            .deviceModeArg = 0x0740,\n            .configCmdEnable = 0,\n            .deviceType = 0x1,\n            .sflashPadType = 4,\n            .serialClkFreq = 4,\n            .sflashA1Size = 0x4000000U,\n            .sflashA2Size = 0,\n            .sflashB1Size = 0,\n            .sflashB2Size = 0,\n            .lookupTable =\n                {\n                    [0] =\n                        MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0xEB,\n                                           MG_RADDR_SDR, MG_FLEXSPI_4PAD, 0x18),\n                    [1] =\n                        MG_FLEXSPI_LUT_SEQ(MG_DUMMY_SDR, MG_FLEXSPI_4PAD, 0x06,\n                                           MG_READ_SDR, MG_FLEXSPI_4PAD, 0x04),\n                    [4 * 1 + 0] =\n                        MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x05,\n                                           MG_READ_SDR, MG_FLEXSPI_1PAD, 0x04),\n                    [4 * 2 + 0] =\n                        MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x01,\n                                           MG_WRITE_SDR, MG_FLEXSPI_1PAD, 0x02),\n                    [4 * 3 + 0] =\n                        MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x06,\n                                           MG_STOP_EXE, MG_FLEXSPI_1PAD, 0x00),\n                    [4 * 5 + 0] =\n                        MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x20,\n                                           MG_RADDR_SDR, MG_FLEXSPI_1PAD, 0x18),\n                    [4 * 8 + 0] =\n                        MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x52,\n                                           MG_RADDR_SDR, MG_FLEXSPI_1PAD, 0x18),\n                    [4 * 9 + 0] =\n                        MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x02,\n                                           MG_RADDR_SDR, MG_FLEXSPI_1PAD, 0x18),\n                    [4 * 9 + 1] =\n                        MG_FLEXSPI_LUT_SEQ(MG_WRITE_SDR, MG_FLEXSPI_1PAD, 0x00,\n                                           MG_STOP_EXE, MG_FLEXSPI_1PAD, 0x00),\n                    [4 * 11 + 0] =\n                        MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x60,\n                                           MG_STOP_EXE, MG_FLEXSPI_1PAD, 0x00),\n                },\n        },\n    .pageSize = 0x100,\n    .sectorSize = 0x1000,\n    .ipcmdSerialClkFreq = 0,\n    .blockSize = 0x8000,\n};\n\n#define MG_FLEXSPI_NOR_INSTANCE 0\n#define MG_ROMAPI_ADDRESS 0x13030000U\n#define flexspi_nor                              \\\n  ((struct mg_flexspi_nor_driver_interface *) (( \\\n      (uint32_t *) MG_ROMAPI_ADDRESS)[5]))\n\nMG_IRAM static bool flash_page_start(volatile uint32_t *dst) {\n  char *base = (char *) s_mg_flash_frdm.start,\n       *end = base + s_mg_flash_frdm.size;\n  volatile char *p = (char *) dst;\n  return p >= base && p < end && ((p - base) % s_mg_flash_frdm.secsz) == 0;\n}\n\nMG_IRAM static int flexspi_nor_get_config(\n    struct mg_flexspi_nor_config *config) {\n  uint32_t option = 0xc0000004;\n  return flexspi_nor->get_config(MG_FLEXSPI_NOR_INSTANCE, config, &option);\n}\n\nMG_IRAM static int flash_init(void) {\n  static bool initialized = false;\n  if (!initialized) {\n    struct mg_flexspi_nor_config config;\n    memset(&config, 0, sizeof(config));\n    flexspi_nor->set_clock_source(0);\n    flexspi_nor->config_clock(MG_FLEXSPI_NOR_INSTANCE, 1, 0);\n    if (flexspi_nor->init(MG_FLEXSPI_NOR_INSTANCE, &default_config)) {\n      return 1;\n    }\n    flexspi_nor_get_config(&config);\n    if (flexspi_nor->init(MG_FLEXSPI_NOR_INSTANCE, &config)) {\n      return 1;\n    }\n    initialized = true;\n  }\n  return 0;\n}\n\nMG_IRAM static bool flash_erase(struct mg_flexspi_nor_config *config,\n                                void *addr) {\n  if (flash_page_start(addr) == false) {\n    MG_ERROR((\"%p is not on a sector boundary\", addr));\n    return false;\n  }\n\n  void *dst = (void *) ((char *) addr - (char *) s_mg_flash_frdm.start);\n  bool ok = (flexspi_nor->erase_sector(MG_FLEXSPI_NOR_INSTANCE, config,\n                                       (uint32_t) dst) == 0);\n  MG_INFO((\"Sector starting at %p erasure: %s\", addr, ok ? \"ok\" : \"fail\"));\n  return ok;\n}\n\nMG_IRAM bool mg_frdm_swap(void) {\n  return true;\n}\n\nMG_IRAM static void flash_wait(void) {\n  while ((*((volatile uint32_t *) (MG_FLEXSPI_BASE + 0xE0)) & MG_BIT(1)) == 0)\n    (void) 0;\n}\n\nstatic bool s_flash_irq_disabled;\n\nMG_IRAM static bool mg_frdm_write(void *addr, const void *buf, size_t len) {\n  struct mg_flexspi_nor_config config;\n  bool ok = false;\n  MG_ARM_DISABLE_IRQ();\n  if (flash_init() != 0) goto fwxit;\n  if (flexspi_nor_get_config(&config) != 0) goto fwxit;\n  if ((len % s_mg_flash_frdm.align) != 0) {\n    MG_ERROR((\"%lu is not aligned to %lu\", len, s_mg_flash_frdm.align));\n    goto fwxit;\n  }\n  if ((char *) addr < (char *) s_mg_flash_frdm.start) {\n    MG_ERROR((\"Invalid flash write address: %p\", addr));\n    goto fwxit;\n  }\n\n  uint32_t *dst = (uint32_t *) addr;\n  uint32_t *src = (uint32_t *) buf;\n  uint32_t *end = (uint32_t *) ((char *) buf + len);\n  ok = true;\n\n  while (ok && src < end) {\n    if (flash_page_start(dst) && flash_erase(&config, dst) == false) {\n      ok = false;\n      break;\n    }\n    uint32_t status;\n    uint32_t dst_ofs = (uint32_t) dst - (uint32_t) s_mg_flash_frdm.start;\n    if ((char *) buf >= (char *) s_mg_flash_frdm.start &&\n        (char *) buf <\n            (char *) (s_mg_flash_frdm.start + s_mg_flash_frdm.size)) {\n      // If we copy from FLASH to FLASH, then we first need to copy the source\n      // to RAM\n      size_t tmp_buf_size = s_mg_flash_frdm.align / sizeof(uint32_t);\n      uint32_t tmp[tmp_buf_size];\n\n      for (size_t i = 0; i < tmp_buf_size; i++) {\n        flash_wait();\n        tmp[i] = src[i];\n      }\n      status = flexspi_nor->page_program(MG_FLEXSPI_NOR_INSTANCE, &config,\n                                         (uint32_t) dst_ofs, tmp, false);\n    } else {\n      status = flexspi_nor->page_program(MG_FLEXSPI_NOR_INSTANCE, &config,\n                                         (uint32_t) dst_ofs, src, false);\n    }\n    src = (uint32_t *) ((char *) src + s_mg_flash_frdm.align);\n    dst = (uint32_t *) ((char *) dst + s_mg_flash_frdm.align);\n    if (status != 0) {\n      ok = false;\n    }\n  }\n  MG_INFO((\"Flash write %lu bytes @ %p: %s.\", len, dst, ok ? \"ok\" : \"fail\"));\nfwxit:\n  if (!s_flash_irq_disabled) MG_ARM_ENABLE_IRQ();\n  return ok;\n}\n\n// just overwrite instead of swap\nMG_IRAM static void single_bank_swap(char *p1, char *p2, size_t s, size_t ss) {\n  // no stdlib calls here\n  for (size_t ofs = 0; ofs < s; ofs += ss) {\n    mg_frdm_write(p1 + ofs, p2 + ofs, ss);\n  }\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_frdm);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_frdm);\n}\n\nbool mg_ota_end(void) {\n  if (mg_ota_flash_end(&s_mg_flash_frdm)) {\n    if (0) {  // is_dualbank()\n      // TODO(): no devices so far\n      *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n    } else {\n      // Swap partitions. Pray power does not go away\n      MG_INFO((\"Swapping partitions, size %u (%u sectors)\",\n               s_mg_flash_frdm.size,\n               s_mg_flash_frdm.size / s_mg_flash_frdm.secsz));\n      MG_INFO((\"Do NOT power off...\"));\n      mg_log_level = MG_LL_NONE;\n      s_flash_irq_disabled = true;\n      // Runs in RAM, will reset when finished\n      single_bank_swap(\n          (char *) s_mg_flash_frdm.start,\n          (char *) s_mg_flash_frdm.start + s_mg_flash_frdm.size / 2,\n          s_mg_flash_frdm.size / 2, s_mg_flash_frdm.secsz);\n    }\n  }\n  return false;\n}\n\n#endif\n"
  },
  {
    "path": "src/ota_stm32f.c",
    "content": "#include \"flash.h\"\n#include \"log.h\"\n#include \"ota.h\"\n\n#if MG_OTA == MG_OTA_STM32F\n\nstatic bool mg_stm32f_write(void *, const void *, size_t);\nstatic bool mg_stm32f_swap(void);\n\nstatic struct mg_flash s_mg_flash_stm32f = {\n    (void *) 0x08000000,  // Start\n    0,                    // Size, FLASH_SIZE_REG\n    0,                    // Irregular sector size\n    32,                   // Align, 256 bit\n    mg_stm32f_write,\n    mg_stm32f_swap,\n};\n\n#define MG_FLASH_BASE 0x40023c00\n#define MG_FLASH_KEYR 0x04\n#define MG_FLASH_SR 0x0c\n#define MG_FLASH_CR 0x10\n#define MG_FLASH_OPTCR 0x14\n#define MG_FLASH_SIZE_REG_F7 0x1FF0F442\n#define MG_FLASH_SIZE_REG_F4 0x1FFF7A22\n\n#define STM_DBGMCU_IDCODE 0xE0042000\n#define STM_DEV_ID (MG_REG(STM_DBGMCU_IDCODE) & (MG_BIT(12) - 1))\n#define SYSCFG_MEMRMP 0x40013800\n\n#define MG_FLASH_SIZE_REG_LOCATION \\\n  ((STM_DEV_ID >= 0x449) ? MG_FLASH_SIZE_REG_F7 : MG_FLASH_SIZE_REG_F4)\n\nstatic size_t flash_size(void) {\n  return (MG_REG(MG_FLASH_SIZE_REG_LOCATION) & 0xFFFF) * 1024;\n}\n\nMG_IRAM static int is_dualbank(void) {\n  // only F42x/F43x series (0x419) support dual bank\n  return STM_DEV_ID == 0x419;\n}\n\nMG_IRAM static void flash_unlock(void) {\n  static bool unlocked = false;\n  if (unlocked == false) {\n    MG_REG(MG_FLASH_BASE + MG_FLASH_KEYR) = 0x45670123;\n    MG_REG(MG_FLASH_BASE + MG_FLASH_KEYR) = 0xcdef89ab;\n    unlocked = true;\n  }\n}\n\n#define MG_FLASH_CONFIG_16_64_128 1   // used by STM32F7\n#define MG_FLASH_CONFIG_32_128_256 2  // used by STM32F4 and F2\n\nMG_IRAM static bool flash_page_start(volatile uint32_t *dst) {\n  char *base = (char *) s_mg_flash_stm32f.start;\n  char *end = base + s_mg_flash_stm32f.size;\n\n  if (is_dualbank() && dst >= (uint32_t *) (base + (end - base) / 2)) {\n    dst = (uint32_t *) ((uint32_t) dst - (end - base) / 2);\n  }\n\n  uint32_t flash_config = MG_FLASH_CONFIG_16_64_128;\n  if (STM_DEV_ID >= 0x449) {\n    flash_config = MG_FLASH_CONFIG_32_128_256;\n  }\n\n  volatile char *p = (char *) dst;\n  if (p >= base && p < end) {\n    if (p < base + 16 * 1024 * 4 * flash_config) {\n      if ((p - base) % (16 * 1024 * flash_config) == 0) return true;\n    } else if (p == base + 16 * 1024 * 4 * flash_config) {\n      return true;\n    } else if ((p - base) % (128 * 1024 * flash_config) == 0) {\n      return true;\n    }\n  }\n  return false;\n}\n\nMG_IRAM static int flash_sector(volatile uint32_t *addr) {\n  char *base = (char *) s_mg_flash_stm32f.start;\n  char *end = base + s_mg_flash_stm32f.size;\n  bool addr_in_bank_2 = false;\n  if (is_dualbank() && addr >= (uint32_t *) (base + (end - base) / 2)) {\n    addr = (uint32_t *) ((uint32_t) addr - (end - base) / 2);\n    addr_in_bank_2 = true;\n  }\n  volatile char *p = (char *) addr;\n  uint32_t flash_config = MG_FLASH_CONFIG_16_64_128;\n  if (STM_DEV_ID >= 0x449) {\n    flash_config = MG_FLASH_CONFIG_32_128_256;\n  }\n  int sector = -1;\n  if (p >= base && p < end) {\n    if (p < base + 16 * 1024 * 4 * flash_config) {\n      sector = (p - base) / (16 * 1024 * flash_config);\n    } else if (p >= base + 64 * 1024 * flash_config &&\n               p < base + 128 * 1024 * flash_config) {\n      sector = 4;\n    } else {\n      sector = (p - base) / (128 * 1024 * flash_config) + 4;\n    }\n  }\n  if (sector == -1) return -1;\n  if (addr_in_bank_2) sector += 12;  // a bank has 12 sectors\n  return sector;\n}\n\nMG_IRAM static bool flash_is_err(void) {\n  return MG_REG(MG_FLASH_BASE + MG_FLASH_SR) & ((MG_BIT(7) - 1) << 1);\n}\n\nMG_IRAM static void flash_wait(void) {\n  while (MG_REG(MG_FLASH_BASE + MG_FLASH_SR) & (MG_BIT(16))) (void) 0;\n}\n\nMG_IRAM static void flash_clear_err(void) {\n  flash_wait();                                // Wait until ready\n  MG_REG(MG_FLASH_BASE + MG_FLASH_SR) = 0xf2;  // Clear all errors\n}\n\nMG_IRAM static bool mg_stm32f_erase(void *addr) {\n  bool ok = false;\n  if (flash_page_start(addr) == false) {\n    MG_ERROR((\"%p is not on a sector boundary\", addr));\n  } else {\n    int sector = flash_sector(addr);\n    if (sector < 0) return false;\n    uint32_t sector_reg = sector;\n    if (is_dualbank() && sector >= 12) {\n      // 3.9.8 Flash control register (FLASH_CR) for F42xxx and F43xxx\n      // BITS[7:3]\n      sector_reg -= 12;\n      sector_reg |= MG_BIT(4);\n    }\n    flash_unlock();\n    flash_wait();\n    uint32_t cr = MG_BIT(1);       // SER\n    cr |= MG_BIT(16);              // STRT\n    cr |= (sector_reg & 31) << 3;  // sector\n    MG_REG(MG_FLASH_BASE + MG_FLASH_CR) = cr;\n    ok = !flash_is_err();\n    MG_DEBUG((\"Erase sector %lu @ %p %s. CR %#lx SR %#lx\", sector, addr,\n              ok ? \"ok\" : \"fail\", MG_REG(MG_FLASH_BASE + MG_FLASH_CR),\n              MG_REG(MG_FLASH_BASE + MG_FLASH_SR)));\n    // After we have erased the sector, set CR flags for programming\n    // 2 << 8 is word write parallelism, bit(0) is PG. RM0385, section 3.7.5\n    MG_REG(MG_FLASH_BASE + MG_FLASH_CR) = MG_BIT(0) | (2 << 8);\n    flash_clear_err();\n  }\n  return ok;\n}\n\nMG_IRAM static bool mg_stm32f_swap(void) {\n  // STM32 F42x/F43x support dual bank, however, the memory mapping\n  // change will not be carried through a hard reset. Therefore, we will use\n  // the single bank approach for this family as well.\n  return true;\n}\n\nstatic bool s_flash_irq_disabled;\n\nMG_IRAM static bool mg_stm32f_write(void *addr, const void *buf, size_t len) {\n  if ((len % s_mg_flash_stm32f.align) != 0) {\n    MG_ERROR((\"%lu is not aligned to %lu\", len, s_mg_flash_stm32f.align));\n    return false;\n  }\n  uint32_t *dst = (uint32_t *) addr;\n  uint32_t *src = (uint32_t *) buf;\n  uint32_t *end = (uint32_t *) ((char *) buf + len);\n  bool ok = true;\n  MG_ARM_DISABLE_IRQ();\n  flash_unlock();\n  flash_clear_err();\n  MG_REG(MG_FLASH_BASE + MG_FLASH_CR) = MG_BIT(0) | MG_BIT(9);  // PG, 32-bit\n  flash_wait();\n  MG_DEBUG((\"Writing flash @ %p, %lu bytes\", addr, len));\n  while (ok && src < end) {\n    if (flash_page_start(dst) && mg_stm32f_erase(dst) == false) break;\n    *(volatile uint32_t *) dst++ = *src++;\n    MG_DSB();  // ensure flash is written with no errors\n    flash_wait();\n    if (flash_is_err()) ok = false;\n  }\n  if (!s_flash_irq_disabled) MG_ARM_ENABLE_IRQ();\n  MG_DEBUG((\"Flash write %lu bytes @ %p: %s. CR %#lx SR %#lx\", len, dst,\n            ok ? \"ok\" : \"fail\", MG_REG(MG_FLASH_BASE + MG_FLASH_CR),\n            MG_REG(MG_FLASH_BASE + MG_FLASH_SR)));\n  MG_REG(MG_FLASH_BASE + MG_FLASH_CR) &= ~MG_BIT(0);  // Clear programming flag\n  return ok;\n}\n\n// just overwrite instead of swap\nMG_IRAM void single_bank_swap(char *p1, char *p2, size_t size) {\n  // no stdlib calls here\n  mg_stm32f_write(p1, p2, size);\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  s_mg_flash_stm32f.size = flash_size();\n#ifdef __ZEPHYR__\n  *((uint32_t *)0xE000ED94) = 0;\n  MG_DEBUG((\"Jailbreak %s\", *((uint32_t *)0xE000ED94) == 0 ? \"successful\" : \"failed\"));\n#endif\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_stm32f);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_stm32f);\n}\n\nbool mg_ota_end(void) {\n  if (mg_ota_flash_end(&s_mg_flash_stm32f)) {\n    // Swap partitions. Pray power does not go away\n    MG_INFO((\"Swapping partitions, size %u (%u sectors)\",\n             s_mg_flash_stm32f.size, STM_DEV_ID == 0x449 ? 8 : 12));\n    MG_INFO((\"Do NOT power off...\"));\n    mg_log_level = MG_LL_NONE;\n    s_flash_irq_disabled = true;\n    char *p1 = (char *) s_mg_flash_stm32f.start;\n    char *p2 = p1 + s_mg_flash_stm32f.size / 2;\n    size_t size = s_mg_flash_stm32f.size / 2;\n    // Runs in RAM, will reset when finished\n    single_bank_swap(p1, p2, size);\n  }\n  return false;\n}\n#endif\n"
  },
  {
    "path": "src/ota_stm32h5.c",
    "content": "#include \"flash.h\"\n#include \"log.h\"\n#include \"ota.h\"\n\n#if MG_OTA == MG_OTA_STM32H5\n\nstatic bool mg_stm32h5_write(void *, const void *, size_t);\nstatic bool mg_stm32h5_swap(void);\n\nstatic struct mg_flash s_mg_flash_stm32h5 = {\n    (void *) 0x08000000,  // Start\n    2 * 1024 * 1024,      // Size, 2Mb\n    8 * 1024,             // Sector size, 8k\n    16,                   // Align, 128 bit\n    mg_stm32h5_write,\n    mg_stm32h5_swap,\n};\n\n#define MG_FLASH_BASE 0x40022000          // Base address of the flash controller\n#define FLASH_KEYR (MG_FLASH_BASE + 0x4)  // See RM0481 7.11\n#define FLASH_OPTKEYR (MG_FLASH_BASE + 0xc)\n#define FLASH_OPTCR (MG_FLASH_BASE + 0x1c)\n#define FLASH_NSSR (MG_FLASH_BASE + 0x20)\n#define FLASH_NSCR (MG_FLASH_BASE + 0x28)\n#define FLASH_NSCCR (MG_FLASH_BASE + 0x30)\n#define FLASH_OPTSR_CUR (MG_FLASH_BASE + 0x50)\n#define FLASH_OPTSR_PRG (MG_FLASH_BASE + 0x54)\n\nstatic void flash_unlock(void) {\n  static bool unlocked = false;\n  if (unlocked == false) {\n    MG_REG(FLASH_KEYR) = 0x45670123;\n    MG_REG(FLASH_KEYR) = 0Xcdef89ab;\n    MG_REG(FLASH_OPTKEYR) = 0x08192a3b;\n    MG_REG(FLASH_OPTKEYR) = 0x4c5d6e7f;\n    unlocked = true;\n  }\n}\n\nstatic int flash_page_start(volatile uint32_t *dst) {\n  char *base = (char *) s_mg_flash_stm32h5.start,\n       *end = base + s_mg_flash_stm32h5.size;\n  volatile char *p = (char *) dst;\n  return p >= base && p < end && ((p - base) % s_mg_flash_stm32h5.secsz) == 0;\n}\n\nstatic bool flash_is_err(void) {\n  return MG_REG(FLASH_NSSR) & ((MG_BIT(8) - 1) << 17);  // RM0481 7.11.9\n}\n\nstatic void flash_wait(void) {\n  while ((MG_REG(FLASH_NSSR) & MG_BIT(0)) &&\n         (MG_REG(FLASH_NSSR) & MG_BIT(16)) == 0) {\n    (void) 0;\n  }\n}\n\nstatic void flash_clear_err(void) {\n  flash_wait();                                    // Wait until ready\n  MG_REG(FLASH_NSCCR) = ((MG_BIT(9) - 1) << 16U);  // Clear all errors\n}\n\nstatic bool flash_bank_is_swapped(void) {\n  return MG_REG(FLASH_OPTCR) & MG_BIT(31);  // RM0481 7.11.8\n}\n\nstatic bool mg_stm32h5_erase(void *location) {\n  bool ok = false;\n  if (flash_page_start(location) == false) {\n    MG_ERROR((\"%p is not on a sector boundary\"));\n  } else {\n    uintptr_t diff = (char *) location - (char *) s_mg_flash_stm32h5.start;\n    uint32_t sector = diff / s_mg_flash_stm32h5.secsz;\n    uint32_t saved_cr = MG_REG(FLASH_NSCR);  // Save CR value\n    flash_unlock();\n    flash_clear_err();\n    MG_REG(FLASH_NSCR) = 0;\n    if ((sector < 128 && flash_bank_is_swapped()) ||\n        (sector > 127 && !flash_bank_is_swapped())) {\n      MG_REG(FLASH_NSCR) |= MG_BIT(31);  // Set FLASH_CR_BKSEL\n    }\n    if (sector > 127) sector -= 128;\n    MG_REG(FLASH_NSCR) |= MG_BIT(2) | (sector << 6);  // Erase | sector_num\n    MG_REG(FLASH_NSCR) |= MG_BIT(5);                  // Start erasing\n    flash_wait();\n    ok = !flash_is_err();\n    MG_DEBUG((\"Erase sector %lu @ %p: %s. CR %#lx SR %#lx\", sector, location,\n              ok ? \"ok\" : \"fail\", MG_REG(FLASH_NSCR), MG_REG(FLASH_NSSR)));\n    // mg_hexdump(location, 32);\n    MG_REG(FLASH_NSCR) = saved_cr;  // Restore saved CR\n  }\n  return ok;\n}\n\nstatic bool mg_stm32h5_swap(void) {\n  uint32_t desired = flash_bank_is_swapped() ? 0 : MG_BIT(31);\n  flash_unlock();\n  flash_clear_err();\n  // printf(\"OPTSR_PRG 1 %#lx\\n\", FLASH->OPTSR_PRG);\n  MG_SET_BITS(MG_REG(FLASH_OPTSR_PRG), MG_BIT(31), desired);\n  // printf(\"OPTSR_PRG 2 %#lx\\n\", FLASH->OPTSR_PRG);\n  MG_REG(FLASH_OPTCR) |= MG_BIT(1);  // OPTSTART\n  while ((MG_REG(FLASH_OPTSR_CUR) & MG_BIT(31)) != desired) (void) 0;\n  return true;\n}\n\nstatic bool mg_stm32h5_write(void *addr, const void *buf, size_t len) {\n  if ((len % s_mg_flash_stm32h5.align) != 0) {\n    MG_ERROR((\"%lu is not aligned to %lu\", len, s_mg_flash_stm32h5.align));\n    return false;\n  }\n  uint32_t *dst = (uint32_t *) addr;\n  uint32_t *src = (uint32_t *) buf;\n  uint32_t *end = (uint32_t *) ((char *) buf + len);\n  bool ok = true;\n  MG_ARM_DISABLE_IRQ();\n  flash_unlock();\n  flash_clear_err();\n  MG_REG(FLASH_NSCR) = MG_BIT(1);  // Set programming flag\n  while (ok && src < end) {\n    if (flash_page_start(dst) && mg_stm32h5_erase(dst) == false) {\n      ok = false;\n      break;\n    }\n    *(volatile uint32_t *) dst++ = *src++;\n    flash_wait();\n    if (flash_is_err()) ok = false;\n  }\n  MG_ARM_ENABLE_IRQ();\n  MG_DEBUG((\"Flash write %lu bytes @ %p: %s. CR %#lx SR %#lx\", len, dst,\n            flash_is_err() ? \"fail\" : \"ok\", MG_REG(FLASH_NSCR),\n            MG_REG(FLASH_NSSR)));\n  MG_REG(FLASH_NSCR) = 0;  // Clear flags\n  return ok;\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n#ifdef __ZEPHYR__\n  *((uint32_t *)0xE000ED94) = 0;\n  MG_DEBUG((\"Jailbreak %s\", *((uint32_t *)0xE000ED94) == 0 ? \"successful\" : \"failed\"));\n#endif\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_stm32h5);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_stm32h5);\n}\n\n// Actual bank swap is deferred until reset, it is safe to execute in flash\nbool mg_ota_end(void) {\n  if(!mg_ota_flash_end(&s_mg_flash_stm32h5)) return false;\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n  return true;\n}\n#endif\n"
  },
  {
    "path": "src/ota_stm32h7.c",
    "content": "#include \"flash.h\"\n#include \"log.h\"\n#include \"ota.h\"\n\n#if MG_OTA == MG_OTA_STM32H7 || MG_OTA == MG_OTA_STM32H7_DUAL_CORE\n\n// - H723/735 RM 4.3.3: Note: The application can simultaneously request a read\n// and a write operation through the AXI interface.\n//   - We only need IRAM for partition swapping in the H723, however, all\n//   related functions must reside in IRAM for this to be possible.\n// - Linker files for other devices won't define a .iram section so there's no\n// associated penalty\n\nstatic bool mg_stm32h7_write(void *, const void *, size_t);\nstatic bool mg_stm32h7_swap(void);\n\nstatic struct mg_flash s_mg_flash_stm32h7 = {\n    (void *) 0x08000000,  // Start\n    0,                    // Size, FLASH_SIZE_REG\n    128 * 1024,           // Sector size, 128k\n    32,                   // Align, 256 bit\n    mg_stm32h7_write,\n    mg_stm32h7_swap,\n};\n\n#define FLASH_BASE1 0x52002000  // Base address for bank1\n#define FLASH_BASE2 0x52002100  // Base address for bank2\n#define FLASH_KEYR 0x04         // See RM0433 4.9.2\n#define FLASH_OPTKEYR 0x08\n#define FLASH_OPTCR 0x18\n#define FLASH_SR 0x10\n#define FLASH_CR 0x0c\n#define FLASH_CCR 0x14\n#define FLASH_OPTSR_CUR 0x1c\n#define FLASH_OPTSR_PRG 0x20\n#define FLASH_SIZE_REG 0x1ff1e880\n\n#define IS_DUALCORE() (MG_OTA == MG_OTA_STM32H7_DUAL_CORE)\n\nMG_IRAM static bool is_dualbank(void) {\n  if (IS_DUALCORE()) {\n    // H745/H755 and H747/H757 are running on dual core.\n    // Using only the 1st bank (mapped to CM7), in order not to interfere\n    // with the 2nd bank (CM4), possibly causing CM4 to boot unexpectedly.\n    return false;\n  }\n  return (s_mg_flash_stm32h7.size < 2 * 1024 * 1024) ? false : true;\n}\n\nMG_IRAM static void flash_unlock(void) {\n  static bool unlocked = false;\n  if (unlocked == false) {\n    MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0x45670123;\n    MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0xcdef89ab;\n    if (is_dualbank()) {\n      MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0x45670123;\n      MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0xcdef89ab;\n    }\n    MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x08192a3b;  // opt reg is \"shared\"\n    MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x4c5d6e7f;  // thus unlock once\n    unlocked = true;\n  }\n}\n\nMG_IRAM static bool flash_page_start(volatile uint32_t *dst) {\n  char *base = (char *) s_mg_flash_stm32h7.start,\n       *end = base + s_mg_flash_stm32h7.size;\n  volatile char *p = (char *) dst;\n  return p >= base && p < end && ((p - base) % s_mg_flash_stm32h7.secsz) == 0;\n}\n\nMG_IRAM static bool flash_is_err(uint32_t bank) {\n  return MG_REG(bank + FLASH_SR) & ((MG_BIT(11) - 1) << 17);  // RM0433 4.9.5\n}\n\nMG_IRAM static void flash_wait(uint32_t bank) {\n  while (MG_REG(bank + FLASH_SR) & (MG_BIT(0) | MG_BIT(2))) (void) 0;\n}\n\nMG_IRAM static void flash_clear_err(uint32_t bank) {\n  flash_wait(bank);                                      // Wait until ready\n  MG_REG(bank + FLASH_CCR) = ((MG_BIT(11) - 1) << 16U);  // Clear all errors\n}\n\nMG_IRAM static bool flash_bank_is_swapped(uint32_t bank) {\n  return MG_REG(bank + FLASH_OPTCR) & MG_BIT(31);  // RM0433 4.9.7\n}\n\n// Figure out flash bank based on the address\nMG_IRAM static uint32_t flash_bank(void *addr) {\n  size_t ofs = (char *) addr - (char *) s_mg_flash_stm32h7.start;\n  if (!is_dualbank()) return FLASH_BASE1;\n  return ofs < s_mg_flash_stm32h7.size / 2 ? FLASH_BASE1 : FLASH_BASE2;\n}\n\n// read-while-write, no need to disable IRQs for standalone usage\nMG_IRAM static bool mg_stm32h7_erase(void *addr) {\n  bool ok = false;\n  if (flash_page_start(addr) == false) {\n    MG_ERROR((\"%p is not on a sector boundary\", addr));\n  } else {\n    uintptr_t diff = (char *) addr - (char *) s_mg_flash_stm32h7.start;\n    uint32_t sector = diff / s_mg_flash_stm32h7.secsz;\n    uint32_t bank = flash_bank(addr);\n    uint32_t saved_cr = MG_REG(bank + FLASH_CR);  // Save CR value\n\n    flash_unlock();\n    if (sector > 7) sector -= 8;\n\n    flash_clear_err(bank);\n    MG_REG(bank + FLASH_CR) = MG_BIT(5);             // 32-bit write parallelism\n    MG_REG(bank + FLASH_CR) |= (sector & 7U) << 8U;  // Sector to erase\n    MG_REG(bank + FLASH_CR) |= MG_BIT(2);            // Sector erase bit\n    MG_REG(bank + FLASH_CR) |= MG_BIT(7);            // Start erasing\n    ok = !flash_is_err(bank);\n    MG_DEBUG((\"Erase sector %lu @ %p %s. CR %#lx SR %#lx\", sector, addr,\n              ok ? \"ok\" : \"fail\", MG_REG(bank + FLASH_CR),\n              MG_REG(bank + FLASH_SR)));\n    MG_REG(bank + FLASH_CR) = saved_cr;  // Restore CR\n  }\n  return ok;\n}\n\nMG_IRAM static bool mg_stm32h7_swap(void) {\n  if (!is_dualbank()) return true;\n  uint32_t bank = FLASH_BASE1;\n  uint32_t desired = flash_bank_is_swapped(bank) ? 0 : MG_BIT(31);\n  flash_unlock();\n  flash_clear_err(bank);\n  // printf(\"OPTSR_PRG 1 %#lx\\n\", FLASH->OPTSR_PRG);\n  MG_SET_BITS(MG_REG(bank + FLASH_OPTSR_PRG), MG_BIT(31), desired);\n  // printf(\"OPTSR_PRG 2 %#lx\\n\", FLASH->OPTSR_PRG);\n  MG_REG(bank + FLASH_OPTCR) |= MG_BIT(1);  // OPTSTART\n  while ((MG_REG(bank + FLASH_OPTSR_CUR) & MG_BIT(31)) != desired) (void) 0;\n  return true;\n}\n\nstatic bool s_flash_irq_disabled;\n\nMG_IRAM static bool mg_stm32h7_write(void *addr, const void *buf, size_t len) {\n  if ((len % s_mg_flash_stm32h7.align) != 0) {\n    MG_ERROR((\"%lu is not aligned to %lu\", len, s_mg_flash_stm32h7.align));\n    return false;\n  }\n  uint32_t bank = flash_bank(addr);\n  uint32_t *dst = (uint32_t *) addr;\n  uint32_t *src = (uint32_t *) buf;\n  uint32_t *end = (uint32_t *) ((char *) buf + len);\n  bool ok = true;\n  MG_ARM_DISABLE_IRQ();\n  flash_unlock();\n  flash_clear_err(bank);\n  MG_REG(bank + FLASH_CR) = MG_BIT(1);   // Set programming flag\n  MG_REG(bank + FLASH_CR) |= MG_BIT(5);  // 32-bit write parallelism\n  while (ok && src < end) {\n    if (flash_page_start(dst) && mg_stm32h7_erase(dst) == false) {\n      ok = false;\n      break;\n    }\n    *(volatile uint32_t *) dst++ = *src++;\n    flash_wait(bank);\n    if (flash_is_err(bank)) ok = false;\n  }\n  if (!s_flash_irq_disabled) MG_ARM_ENABLE_IRQ();\n  MG_DEBUG((\"Flash write %lu bytes @ %p: %s. CR %#lx SR %#lx\", len, dst,\n            ok ? \"ok\" : \"fail\", MG_REG(bank + FLASH_CR),\n            MG_REG(bank + FLASH_SR)));\n  MG_REG(bank + FLASH_CR) &= ~MG_BIT(1);  // Clear programming flag\n  return ok;\n}\n\n// just overwrite instead of swap\nMG_IRAM static void single_bank_swap(char *p1, char *p2, size_t s, size_t ss) {\n  // no stdlib calls here\n  for (size_t ofs = 0; ofs < s; ofs += ss) {\n    mg_stm32h7_write(p1 + ofs, p2 + ofs, ss);\n  }\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  s_mg_flash_stm32h7.size = MG_REG(FLASH_SIZE_REG) * 1024;\n  if (IS_DUALCORE()) {\n    // Using only the 1st bank (mapped to CM7)\n    s_mg_flash_stm32h7.size /= 2;\n  }\n#ifdef __ZEPHYR__\n  *((uint32_t *)0xE000ED94) = 0;\n  MG_DEBUG((\"Jailbreak %s\", *((uint32_t *)0xE000ED94) == 0 ? \"successful\" : \"failed\"));\n#endif\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_stm32h7);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_stm32h7);\n}\n\nbool mg_ota_end(void) {\n  if (mg_ota_flash_end(&s_mg_flash_stm32h7)) {\n    if (is_dualbank()) {\n      // Bank swap is deferred until reset, been executing in flash, reset\n      *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n    } else {\n      // Swap partitions. Pray power does not go away\n      MG_INFO((\"Swapping partitions, size %u (%u sectors)\",\n               s_mg_flash_stm32h7.size,\n               s_mg_flash_stm32h7.size / s_mg_flash_stm32h7.secsz));\n      MG_INFO((\"Do NOT power off...\"));\n      mg_log_level = MG_LL_NONE;\n      s_flash_irq_disabled = true;\n      // Runs in RAM, will reset when finished\n      single_bank_swap(\n          (char *) s_mg_flash_stm32h7.start,\n          (char *) s_mg_flash_stm32h7.start + s_mg_flash_stm32h7.size / 2,\n          s_mg_flash_stm32h7.size / 2, s_mg_flash_stm32h7.secsz);\n    }\n  }\n  return false;\n}\n#endif\n"
  },
  {
    "path": "src/printf.c",
    "content": "#include \"fmt.h\"\n#include \"printf.h\"\n#include \"util.h\"\n\nsize_t mg_queue_printf(struct mg_queue *q, const char *fmt, ...) {\n  char *buf;\n  size_t len;\n  va_list ap1, ap2;\n  va_start(ap1, fmt);\n  len = mg_vsnprintf(NULL, 0, fmt, &ap1);\n  va_end(ap1);\n  if (len == 0 || mg_queue_book(q, &buf, len + 1) < len + 1)\n    return 0;  // Nah. Not enough space\n  va_start(ap2, fmt);\n  len = mg_vsnprintf(buf, len + 1, fmt, &ap2);\n  mg_queue_add(q, len);\n  va_end(ap2);\n  return len;\n}\n\nstatic void mg_pfn_iobuf_private(char ch, void *param, bool expand) {\n  struct mg_iobuf *io = (struct mg_iobuf *) param;\n  if (expand && io->len + 2 > io->size) mg_iobuf_resize(io, io->len + 2);\n  if (io->len + 2 <= io->size) {\n    io->buf[io->len++] = (uint8_t) ch;\n    io->buf[io->len] = 0;\n  } else if (io->len < io->size) {\n    io->buf[io->len++] = 0;  // Guarantee to 0-terminate\n  }\n}\n\nvoid mg_pfn_iobuf_noresize(char ch, void *param) {\n  mg_pfn_iobuf_private(ch, param, false);\n}\n\nvoid mg_pfn_iobuf(char ch, void *param) {\n  mg_pfn_iobuf_private(ch, param, true);\n}\n\nsize_t mg_vsnprintf(char *buf, size_t len, const char *fmt, va_list *ap) {\n  struct mg_iobuf io = {0, 0, 0, 0};\n  size_t n;\n  io.buf = (uint8_t *) buf, io.size = len;\n  n = mg_vxprintf(mg_pfn_iobuf_noresize, &io, fmt, ap);\n  if (n < len) buf[n] = '\\0';\n  return n;\n}\n\nsize_t mg_snprintf(char *buf, size_t len, const char *fmt, ...) {\n  va_list ap;\n  size_t n;\n  va_start(ap, fmt);\n  n = mg_vsnprintf(buf, len, fmt, &ap);\n  va_end(ap);\n  return n;\n}\n\nchar *mg_vmprintf(const char *fmt, va_list *ap) {\n  struct mg_iobuf io = {0, 0, 0, 256};\n  mg_vxprintf(mg_pfn_iobuf, &io, fmt, ap);\n  return (char *) io.buf;\n}\n\nchar *mg_mprintf(const char *fmt, ...) {\n  char *s;\n  va_list ap;\n  va_start(ap, fmt);\n  s = mg_vmprintf(fmt, &ap);\n  va_end(ap);\n  return s;\n}\n\nvoid mg_pfn_stdout(char c, void *param) {\n  putchar(c);\n  (void) param;\n}\n\nstatic size_t print_ip4(void (*out)(char, void *), void *arg, uint8_t *p) {\n  return mg_xprintf(out, arg, \"%d.%d.%d.%d\", p[0], p[1], p[2], p[3]);\n}\n\nstatic size_t print_ip6(void (*out)(char, void *), void *arg, uint16_t *p) {\n  return mg_xprintf(out, arg, \"[%x:%x:%x:%x:%x:%x:%x:%x]\", mg_ntohs(p[0]),\n                    mg_ntohs(p[1]), mg_ntohs(p[2]), mg_ntohs(p[3]),\n                    mg_ntohs(p[4]), mg_ntohs(p[5]), mg_ntohs(p[6]),\n                    mg_ntohs(p[7]));\n}\n\nsize_t mg_print_ip4(void (*out)(char, void *), void *arg, va_list *ap) {\n  uint8_t *p = va_arg(*ap, uint8_t *);\n  return print_ip4(out, arg, p);\n}\n\nsize_t mg_print_ip6(void (*out)(char, void *), void *arg, va_list *ap) {\n  uint16_t *p = va_arg(*ap, uint16_t *);\n  return print_ip6(out, arg, p);\n}\n\nsize_t mg_print_ip(void (*out)(char, void *), void *arg, va_list *ap) {\n  struct mg_addr *addr = va_arg(*ap, struct mg_addr *);\n  if (addr->is_ip6) return print_ip6(out, arg, (uint16_t *) addr->addr.ip);\n  return print_ip4(out, arg, (uint8_t *) &addr->addr.ip);\n}\n\nsize_t mg_print_ip_port(void (*out)(char, void *), void *arg, va_list *ap) {\n  struct mg_addr *a = va_arg(*ap, struct mg_addr *);\n  return mg_xprintf(out, arg, \"%M:%hu\", mg_print_ip, a, mg_ntohs(a->port));\n}\n\nstatic size_t print_mac(void (*out)(char, void *), void *arg, uint8_t *p) {\n  return mg_xprintf(out, arg, \"%02x:%02x:%02x:%02x:%02x:%02x\", p[0], p[1], p[2],\n                    p[3], p[4], p[5]);\n}\n\nsize_t mg_print_mac(void (*out)(char, void *), void *arg, va_list *ap) {\n  uint8_t *p = va_arg(*ap, uint8_t *);\n  return print_mac(out, arg, p);\n}\n\n#if MG_ENABLE_TCPIP\nsize_t mg_print_l2addr(void (*out)(char, void *), void *arg, va_list *ap) {\n  enum mg_l2type type = (enum mg_l2type) va_arg(*ap, int);\n  if (type == MG_TCPIP_L2_ETH) {\n    uint8_t *p = va_arg(*ap, uint8_t *);\n    return print_mac(out, arg, p);\n  }\n  return 0;\n}\n#endif\n\nstatic char mg_esc(int c, bool esc) {\n  const char *p, *esc1 = \"\\b\\f\\n\\r\\t\\\\\\\"\", *esc2 = \"bfnrt\\\\\\\"\";\n  for (p = esc ? esc1 : esc2; *p != '\\0'; p++) {\n    if (*p == c) return esc ? esc2[p - esc1] : esc1[p - esc2];\n  }\n  return 0;\n}\n\nstatic char mg_escape(int c) {\n  return mg_esc(c, true);\n}\n\nstatic size_t qcpy(void (*out)(char, void *), void *ptr, char *buf,\n                   size_t len) {\n  size_t i = 0, extra = 0;\n  for (i = 0; i < len && buf[i] != '\\0'; i++) {\n    char c = mg_escape(buf[i]);\n    if (c) {\n      out('\\\\', ptr), out(c, ptr), extra++;\n    } else {\n      out(buf[i], ptr);\n    }\n  }\n  return i + extra;\n}\n\nstatic size_t bcpy(void (*out)(char, void *), void *arg, uint8_t *buf,\n                   size_t len) {\n  size_t i, j, n = 0;\n  const char *t =\n      \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n  for (i = 0; i < len; i += 3) {\n    uint8_t c1 = buf[i], c2 = i + 1 < len ? buf[i + 1] : 0,\n            c3 = i + 2 < len ? buf[i + 2] : 0;\n    char tmp[4] = {0, 0, '=', '='};\n    tmp[0] = t[c1 >> 2], tmp[1] = t[(c1 & 3) << 4 | (c2 >> 4)];\n    if (i + 1 < len) tmp[2] = t[(c2 & 15) << 2 | (c3 >> 6)];\n    if (i + 2 < len) tmp[3] = t[c3 & 63];\n    for (j = 0; j < sizeof(tmp) && tmp[j] != '\\0'; j++) out(tmp[j], arg);\n    n += j;\n  }\n  return n;\n}\n\nsize_t mg_print_hex(void (*out)(char, void *), void *arg, va_list *ap) {\n  size_t bl = (size_t) va_arg(*ap, int);\n  uint8_t *p = va_arg(*ap, uint8_t *);\n  const char *hex = \"0123456789abcdef\";\n  size_t j;\n  for (j = 0; j < bl; j++) {\n    out(hex[(p[j] >> 4) & 0x0F], arg);\n    out(hex[p[j] & 0x0F], arg);\n  }\n  return 2 * bl;\n}\nsize_t mg_print_base64(void (*out)(char, void *), void *arg, va_list *ap) {\n  size_t len = (size_t) va_arg(*ap, int);\n  uint8_t *buf = va_arg(*ap, uint8_t *);\n  return bcpy(out, arg, buf, len);\n}\n\nsize_t mg_print_esc(void (*out)(char, void *), void *arg, va_list *ap) {\n  size_t len = (size_t) va_arg(*ap, int);\n  char *p = va_arg(*ap, char *);\n  if (len == 0) len = p == NULL ? 0 : strlen(p);\n  return qcpy(out, arg, p, len);\n}\n"
  },
  {
    "path": "src/printf.h",
    "content": "#pragma once\n\n#include \"arch.h\"\n#include \"iobuf.h\"\n#include \"queue.h\"\n\n// Convenience wrappers around mg_xprintf\nsize_t mg_vsnprintf(char *buf, size_t len, const char *fmt, va_list *ap);\nsize_t mg_snprintf(char *, size_t, const char *fmt, ...);\nchar *mg_vmprintf(const char *fmt, va_list *ap);\nchar *mg_mprintf(const char *fmt, ...);\nsize_t mg_queue_printf(struct mg_queue *, const char *fmt, ...);\n\n// %M print helper functions\nsize_t mg_print_base64(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_esc(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_hex(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_ip(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_ip_port(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_ip4(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_ip6(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_mac(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_l2addr(void (*out)(char, void *), void *arg, va_list *ap);\n\n// Various output functions\nvoid mg_pfn_iobuf(char ch, void *param);           // param: struct mg_iobuf *\nvoid mg_pfn_iobuf_noresize(char ch, void *param);  // param: struct mg_iobuf *\nvoid mg_pfn_stdout(char c, void *param);           // param: ignored\n\n// A helper macro for printing JSON: mg_snprintf(buf, len, \"%m\", MG_ESC(\"hi\"))\n#define MG_ESC(str) mg_print_esc, 0, (str)\n"
  },
  {
    "path": "src/profile.h",
    "content": "#pragma once\n#include \"iobuf.h\"\n\n// Macros to record timestamped events that happens with a connection.\n// They are saved into a c->prof IO buffer, each event is a name and a 32-bit\n// timestamp in milliseconds since connection init time.\n//\n// Test (run in two separate terminals):\n//   make -C tutorials/http/http-server/ CFLAGS_EXTRA=-DMG_ENABLE_PROFILE=1\n//   curl localhost:8000\n// Output:\n//   1ea1f1e7 2 net.c:150:mg_close_conn      3 profile:                                                            \n//   1ea1f1e8 2 net.c:150:mg_close_conn      1ea1f1e6 init                                                         \n//   1ea1f1e8 2 net.c:150:mg_close_conn          0 EV_OPEN\n//   1ea1f1e8 2 net.c:150:mg_close_conn          0 EV_ACCEPT \n//   1ea1f1e8 2 net.c:150:mg_close_conn          0 EV_READ\n//   1ea1f1e8 2 net.c:150:mg_close_conn          0 EV_HTTP_MSG\n//   1ea1f1e8 2 net.c:150:mg_close_conn          0 EV_WRITE\n//   1ea1f1e8 2 net.c:150:mg_close_conn          1 EV_CLOSE\n//\n// Usage:\n//   Enable profiling by setting MG_ENABLE_PROFILE=1\n//   Invoke MG_PROF_ADD(c, \"MY_EVENT_1\") in the places you'd like to measure\n\n#if MG_ENABLE_PROFILE\nstruct mg_profitem {\n  const char *name;    // Event name\n  uint32_t timestamp;  // Milliseconds since connection creation (MG_EV_OPEN)\n};\n\n#define MG_PROFILE_ALLOC_GRANULARITY 256  // Can save 32 items wih to realloc\n\n// Adding a profile item to the c->prof. Must be as fast as possible.\n// Reallocation of the c->prof iobuf is not desirable here, that's why we\n// pre-allocate c->prof with MG_PROFILE_ALLOC_GRANULARITY.\n// This macro just inits and copies 8 bytes, and calls mg_millis(),\n// which should be fast enough.\n#define MG_PROF_ADD(c, name_)                                             \\\n  do {                                                                    \\\n    struct mg_iobuf *io = &c->prof;                                       \\\n    uint32_t inittime = ((struct mg_profitem *) io->buf)->timestamp;      \\\n    struct mg_profitem item = {name_, (uint32_t) mg_millis() - inittime}; \\\n    mg_iobuf_add(io, io->len, &item, sizeof(item));                       \\\n  } while (0)\n\n// Initialising profile for a new connection. Not time sensitive\n#define MG_PROF_INIT(c)                                          \\\n  do {                                                           \\\n    struct mg_profitem first = {\"init\", (uint32_t) mg_millis()}; \\\n    mg_iobuf_init(&(c)->prof, 0, MG_PROFILE_ALLOC_GRANULARITY);  \\\n    mg_iobuf_add(&c->prof, c->prof.len, &first, sizeof(first));  \\\n  } while (0)\n\n#define MG_PROF_FREE(c) mg_iobuf_free(&(c)->prof)\n\n// Dumping the profile. Not time sensitive\n#define MG_PROF_DUMP(c)                                            \\\n  do {                                                             \\\n    struct mg_iobuf *io = &c->prof;                                \\\n    struct mg_profitem *p = (struct mg_profitem *) io->buf;        \\\n    struct mg_profitem *e = &p[io->len / sizeof(*p)];              \\\n    MG_INFO((\"%lu profile:\", c->id));                              \\\n    while (p < e) {                                                \\\n      MG_INFO((\"%5lx %s\", (unsigned long) p->timestamp, p->name)); \\\n      p++;                                                         \\\n    }                                                              \\\n  } while (0)\n\n#else\n#define MG_PROF_INIT(c)\n#define MG_PROF_FREE(c)\n#define MG_PROF_ADD(c, name)\n#define MG_PROF_DUMP(c)\n#endif\n"
  },
  {
    "path": "src/queue.c",
    "content": "#include \"queue.h\"\n#include \"util.h\"\n\n#if (defined(__GNUC__) && (__GNUC__ > 4) ||                                \\\n     (defined(__GNUC_MINOR__) && __GNUC__ == 4 && __GNUC_MINOR__ >= 1)) || \\\n    defined(__clang__)\n#define MG_MEMORY_BARRIER() __sync_synchronize()\n#elif defined(_MSC_VER) && _MSC_VER >= 1700\n#define MG_MEMORY_BARRIER() MemoryBarrier()\n#elif !defined(MG_MEMORY_BARRIER)\n#define MG_MEMORY_BARRIER()\n#endif\n\n// Every message in a queue is prepended by a 32-bit message length (ML).\n// If ML is 0, then it is the end, and reader must wrap to the beginning.\n//\n//  Queue when q->tail <= q->head:\n//  |----- free -----| ML | message1 | ML | message2 |  ----- free ------|\n//  ^                ^                               ^                   ^\n// buf              tail                            head                len\n//\n//  Queue when q->tail > q->head:\n//  | ML | message2 |----- free ------| ML | message1 | 0 |---- free ----|\n//  ^               ^                 ^                                  ^\n// buf             head              tail                               len\n\nvoid mg_queue_init(struct mg_queue *q, char *buf, size_t size) {\n  q->size = size;\n  q->buf = buf;\n  q->head = q->tail = 0;\n}\n\nstatic size_t mg_queue_read_len(struct mg_queue *q) {\n  uint32_t n = 0;\n  MG_MEMORY_BARRIER();\n  memcpy(&n, q->buf + q->tail, sizeof(n));\n  assert(q->tail + n + sizeof(n) <= q->size);\n  return n;\n}\n\nstatic void mg_queue_write_len(struct mg_queue *q, size_t len) {\n  uint32_t n = (uint32_t) len;\n  memcpy(q->buf + q->head, &n, sizeof(n));\n  MG_MEMORY_BARRIER();\n}\n\nsize_t mg_queue_book(struct mg_queue *q, char **buf, size_t len) {\n  size_t space = 0, hs = sizeof(uint32_t) * 2;  // *2 is for the 0 marker\n  if (q->head >= q->tail && q->head + len + hs <= q->size) {\n    space = q->size - q->head - hs;  // There is enough space\n  } else if (q->head >= q->tail && q->tail > hs) {\n    mg_queue_write_len(q, 0);  // Not enough space ahead\n    q->head = 0;               // Wrap head to the beginning\n  }\n  if (q->head + hs + len < q->tail) space = q->tail - q->head - hs;\n  if (buf != NULL) *buf = q->buf + q->head + sizeof(uint32_t);\n  return space;\n}\n\nsize_t mg_queue_next(struct mg_queue *q, char **buf) {\n  size_t len = 0;\n  if (q->tail != q->head) {\n    len = mg_queue_read_len(q);\n    if (len == 0) {  // Zero (head wrapped) ?\n      q->tail = 0;   // Reset tail to the start\n      if (q->head > q->tail) len = mg_queue_read_len(q);  // Read again\n    }\n  }\n  if (buf != NULL) *buf = q->buf + q->tail + sizeof(uint32_t);\n  assert(q->tail + len <= q->size);\n  return len;\n}\n\nvoid mg_queue_add(struct mg_queue *q, size_t len) {\n  assert(len > 0);\n  mg_queue_write_len(q, len);\n  assert(q->head + sizeof(uint32_t) * 2 + len <= q->size);\n  q->head += len + sizeof(uint32_t);\n}\n\nvoid mg_queue_del(struct mg_queue *q, size_t len) {\n  q->tail += len + sizeof(uint32_t);\n  assert(q->tail + sizeof(uint32_t) <= q->size);\n}\n"
  },
  {
    "path": "src/queue.h",
    "content": "#pragma once\n\n#include \"arch.h\"  // For size_t\n\n// Single producer, single consumer non-blocking queue\n\nstruct mg_queue {\n  char *buf;\n  size_t size;\n  volatile size_t tail;\n  volatile size_t head;\n};\n\nvoid mg_queue_init(struct mg_queue *, char *, size_t);        // Init queue\nsize_t mg_queue_book(struct mg_queue *, char **buf, size_t);  // Reserve space\nvoid mg_queue_add(struct mg_queue *, size_t);                 // Add new message\nsize_t mg_queue_next(struct mg_queue *, char **);  // Get oldest message\nvoid mg_queue_del(struct mg_queue *, size_t);      // Delete oldest message\n"
  },
  {
    "path": "src/rpc.c",
    "content": "#include \"rpc.h\"\n#include \"printf.h\"\n#include \"util.h\"\n\nvoid mg_rpc_add(struct mg_rpc **head, struct mg_str method,\n                void (*fn)(struct mg_rpc_req *), void *fn_data) {\n  struct mg_rpc *rpc = (struct mg_rpc *) mg_calloc(1, sizeof(*rpc));\n  if (rpc != NULL) {\n    rpc->method = mg_strdup(method);\n    rpc->fn = fn;\n    rpc->fn_data = fn_data;\n    rpc->next = *head, *head = rpc;\n  }\n}\n\nvoid mg_rpc_del(struct mg_rpc **head, void (*fn)(struct mg_rpc_req *)) {\n  struct mg_rpc *r;\n  while ((r = *head) != NULL) {\n    if (r->fn == fn || fn == NULL) {\n      *head = r->next;\n      mg_free((void *) r->method.buf);\n      mg_free(r);\n    } else {\n      head = &(*head)->next;\n    }\n  }\n}\n\nstatic void mg_rpc_call(struct mg_rpc_req *r, struct mg_str method) {\n  struct mg_rpc *h = r->head == NULL ? NULL : *r->head;\n  while (h != NULL && !mg_match(method, h->method, NULL)) h = h->next;\n  if (h != NULL) {\n    r->rpc = h;\n    h->fn(r);\n  } else {\n    mg_rpc_err(r, -32601, \"\\\"%.*s not found\\\"\", (int) method.len, method.buf);\n  }\n}\n\nvoid mg_rpc_process(struct mg_rpc_req *r) {\n  int len, off = mg_json_get(r->frame, \"$.method\", &len);\n  if (off > 0 && r->frame.buf[off] == '\"') {\n    struct mg_str method = mg_str_n(&r->frame.buf[off + 1], (size_t) len - 2);\n    mg_rpc_call(r, method);\n  } else if ((off = mg_json_get(r->frame, \"$.result\", &len)) > 0 ||\n             (off = mg_json_get(r->frame, \"$.error\", &len)) > 0) {\n    mg_rpc_call(r, mg_str(\"\"));  // JSON response! call \"\" method handler\n  } else {\n    mg_rpc_err(r, -32700, \"%m\", mg_print_esc, (int) r->frame.len,\n               r->frame.buf);  // Invalid\n  }\n}\n\nvoid mg_rpc_vok(struct mg_rpc_req *r, const char *fmt, va_list *ap) {\n  int len, off = mg_json_get(r->frame, \"$.id\", &len);\n  if (off > 0) {\n    mg_xprintf(r->pfn, r->pfn_data, \"{%m:%.*s,%m:\", mg_print_esc, 0, \"id\", len,\n               &r->frame.buf[off], mg_print_esc, 0, \"result\");\n    mg_vxprintf(r->pfn, r->pfn_data, fmt == NULL ? \"null\" : fmt, ap);\n    mg_xprintf(r->pfn, r->pfn_data, \"}\");\n  }\n}\n\nvoid mg_rpc_ok(struct mg_rpc_req *r, const char *fmt, ...) {\n  va_list ap;\n  va_start(ap, fmt);\n  mg_rpc_vok(r, fmt, &ap);\n  va_end(ap);\n}\n\nvoid mg_rpc_verr(struct mg_rpc_req *r, int code, const char *fmt, va_list *ap) {\n  int len, off = mg_json_get(r->frame, \"$.id\", &len);\n  mg_xprintf(r->pfn, r->pfn_data, \"{\");\n  if (off > 0) {\n    mg_xprintf(r->pfn, r->pfn_data, \"%m:%.*s,\", mg_print_esc, 0, \"id\", len,\n               &r->frame.buf[off]);\n  }\n  mg_xprintf(r->pfn, r->pfn_data, \"%m:{%m:%d,%m:\", mg_print_esc, 0, \"error\",\n             mg_print_esc, 0, \"code\", code, mg_print_esc, 0, \"message\");\n  mg_vxprintf(r->pfn, r->pfn_data, fmt == NULL ? \"null\" : fmt, ap);\n  mg_xprintf(r->pfn, r->pfn_data, \"}}\");\n}\n\nvoid mg_rpc_err(struct mg_rpc_req *r, int code, const char *fmt, ...) {\n  va_list ap;\n  va_start(ap, fmt);\n  mg_rpc_verr(r, code, fmt, &ap);\n  va_end(ap);\n}\n\nstatic size_t print_methods(mg_pfn_t pfn, void *pfn_data, va_list *ap) {\n  struct mg_rpc *h, **head = (struct mg_rpc **) va_arg(*ap, void **);\n  size_t len = 0;\n  for (h = *head; h != NULL; h = h->next) {\n    if (h->method.len == 0) continue;  // Ignore response handler\n    len += mg_xprintf(pfn, pfn_data, \"%s%m\", h == *head ? \"\" : \",\",\n                      mg_print_esc, (int) h->method.len, h->method.buf);\n  }\n  return len;\n}\n\nvoid mg_rpc_list(struct mg_rpc_req *r) {\n  mg_rpc_ok(r, \"[%M]\", print_methods, r->head);\n}\n"
  },
  {
    "path": "src/rpc.h",
    "content": "#pragma once\n#include \"fmt.h\"\n#include \"json.h\"\n\n// JSON-RPC request descriptor\nstruct mg_rpc_req {\n  struct mg_rpc **head;  // RPC handlers list head\n  struct mg_rpc *rpc;    // RPC handler being called\n  mg_pfn_t pfn;          // Response printing function\n  void *pfn_data;        // Response printing function data\n  void *req_data;        // Arbitrary request data\n  struct mg_str frame;   // Request, e.g. {\"id\":1,\"method\":\"add\",\"params\":[1,2]}\n};\n\n// JSON-RPC method handler\nstruct mg_rpc {\n  struct mg_rpc *next;              // Next in list\n  struct mg_str method;             // Method pattern\n  void (*fn)(struct mg_rpc_req *);  // Handler function\n  void *fn_data;                    // Handler function argument\n};\n\nvoid mg_rpc_add(struct mg_rpc **head, struct mg_str method_pattern,\n                void (*handler)(struct mg_rpc_req *), void *handler_data);\nvoid mg_rpc_del(struct mg_rpc **head, void (*handler)(struct mg_rpc_req *));\nvoid mg_rpc_process(struct mg_rpc_req *);\n\n// Helper functions to print result or error frame\nvoid mg_rpc_ok(struct mg_rpc_req *, const char *fmt, ...);\nvoid mg_rpc_vok(struct mg_rpc_req *, const char *fmt, va_list *ap);\nvoid mg_rpc_err(struct mg_rpc_req *, int code, const char *fmt, ...);\nvoid mg_rpc_verr(struct mg_rpc_req *, int code, const char *fmt, va_list *);\nvoid mg_rpc_list(struct mg_rpc_req *r);\n"
  },
  {
    "path": "src/sha1.c",
    "content": "/* Copyright(c) By Steve Reid <steve@edmweb.com> */\n/* 100% Public Domain */\n#include \"arch.h\"\n#include \"sha1.h\"\n\nunion char64long16 {\n  unsigned char c[64];\n  uint32_t l[16];\n};\n\n#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))\n\nstatic uint32_t blk0(union char64long16 *block, int i) {\n  if (MG_BIG_ENDIAN) {\n  } else {\n    block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) |\n                  (rol(block->l[i], 8) & 0x00FF00FF);\n  }\n  return block->l[i];\n}\n\n/* Avoid redefine warning (ARM /usr/include/sys/ucontext.h define R0~R4) */\n#undef blk\n#undef R0\n#undef R1\n#undef R2\n#undef R3\n#undef R4\n\n#define blk(i)                                                               \\\n  (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ block->l[(i + 8) & 15] ^ \\\n                              block->l[(i + 2) & 15] ^ block->l[i & 15],     \\\n                          1))\n#define R0(v, w, x, y, z, i)                                          \\\n  z += ((w & (x ^ y)) ^ y) + blk0(block, i) + 0x5A827999 + rol(v, 5); \\\n  w = rol(w, 30);\n#define R1(v, w, x, y, z, i)                                  \\\n  z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \\\n  w = rol(w, 30);\n#define R2(v, w, x, y, z, i)                          \\\n  z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); \\\n  w = rol(w, 30);\n#define R3(v, w, x, y, z, i)                                        \\\n  z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \\\n  w = rol(w, 30);\n#define R4(v, w, x, y, z, i)                          \\\n  z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \\\n  w = rol(w, 30);\n\nstatic void mg_sha1_transform(uint32_t state[5],\n                              const unsigned char *buffer) {\n  uint32_t a, b, c, d, e;\n  union char64long16 block[1];\n\n  memcpy(block, buffer, 64);\n  a = state[0];\n  b = state[1];\n  c = state[2];\n  d = state[3];\n  e = state[4];\n  R0(a, b, c, d, e, 0);\n  R0(e, a, b, c, d, 1);\n  R0(d, e, a, b, c, 2);\n  R0(c, d, e, a, b, 3);\n  R0(b, c, d, e, a, 4);\n  R0(a, b, c, d, e, 5);\n  R0(e, a, b, c, d, 6);\n  R0(d, e, a, b, c, 7);\n  R0(c, d, e, a, b, 8);\n  R0(b, c, d, e, a, 9);\n  R0(a, b, c, d, e, 10);\n  R0(e, a, b, c, d, 11);\n  R0(d, e, a, b, c, 12);\n  R0(c, d, e, a, b, 13);\n  R0(b, c, d, e, a, 14);\n  R0(a, b, c, d, e, 15);\n  R1(e, a, b, c, d, 16);\n  R1(d, e, a, b, c, 17);\n  R1(c, d, e, a, b, 18);\n  R1(b, c, d, e, a, 19);\n  R2(a, b, c, d, e, 20);\n  R2(e, a, b, c, d, 21);\n  R2(d, e, a, b, c, 22);\n  R2(c, d, e, a, b, 23);\n  R2(b, c, d, e, a, 24);\n  R2(a, b, c, d, e, 25);\n  R2(e, a, b, c, d, 26);\n  R2(d, e, a, b, c, 27);\n  R2(c, d, e, a, b, 28);\n  R2(b, c, d, e, a, 29);\n  R2(a, b, c, d, e, 30);\n  R2(e, a, b, c, d, 31);\n  R2(d, e, a, b, c, 32);\n  R2(c, d, e, a, b, 33);\n  R2(b, c, d, e, a, 34);\n  R2(a, b, c, d, e, 35);\n  R2(e, a, b, c, d, 36);\n  R2(d, e, a, b, c, 37);\n  R2(c, d, e, a, b, 38);\n  R2(b, c, d, e, a, 39);\n  R3(a, b, c, d, e, 40);\n  R3(e, a, b, c, d, 41);\n  R3(d, e, a, b, c, 42);\n  R3(c, d, e, a, b, 43);\n  R3(b, c, d, e, a, 44);\n  R3(a, b, c, d, e, 45);\n  R3(e, a, b, c, d, 46);\n  R3(d, e, a, b, c, 47);\n  R3(c, d, e, a, b, 48);\n  R3(b, c, d, e, a, 49);\n  R3(a, b, c, d, e, 50);\n  R3(e, a, b, c, d, 51);\n  R3(d, e, a, b, c, 52);\n  R3(c, d, e, a, b, 53);\n  R3(b, c, d, e, a, 54);\n  R3(a, b, c, d, e, 55);\n  R3(e, a, b, c, d, 56);\n  R3(d, e, a, b, c, 57);\n  R3(c, d, e, a, b, 58);\n  R3(b, c, d, e, a, 59);\n  R4(a, b, c, d, e, 60);\n  R4(e, a, b, c, d, 61);\n  R4(d, e, a, b, c, 62);\n  R4(c, d, e, a, b, 63);\n  R4(b, c, d, e, a, 64);\n  R4(a, b, c, d, e, 65);\n  R4(e, a, b, c, d, 66);\n  R4(d, e, a, b, c, 67);\n  R4(c, d, e, a, b, 68);\n  R4(b, c, d, e, a, 69);\n  R4(a, b, c, d, e, 70);\n  R4(e, a, b, c, d, 71);\n  R4(d, e, a, b, c, 72);\n  R4(c, d, e, a, b, 73);\n  R4(b, c, d, e, a, 74);\n  R4(a, b, c, d, e, 75);\n  R4(e, a, b, c, d, 76);\n  R4(d, e, a, b, c, 77);\n  R4(c, d, e, a, b, 78);\n  R4(b, c, d, e, a, 79);\n  state[0] += a;\n  state[1] += b;\n  state[2] += c;\n  state[3] += d;\n  state[4] += e;\n  /* Erase working structures. The order of operations is important,\n   * used to ensure that compiler doesn't optimize those out. */\n  memset(block, 0, sizeof(block));\n  a = b = c = d = e = 0;\n  (void) a;\n  (void) b;\n  (void) c;\n  (void) d;\n  (void) e;\n}\n\nvoid mg_sha1_init(mg_sha1_ctx *context) {\n  context->state[0] = 0x67452301;\n  context->state[1] = 0xEFCDAB89;\n  context->state[2] = 0x98BADCFE;\n  context->state[3] = 0x10325476;\n  context->state[4] = 0xC3D2E1F0;\n  context->count[0] = context->count[1] = 0;\n}\n\nvoid mg_sha1_update(mg_sha1_ctx *context, const unsigned char *data,\n                    size_t len) {\n  size_t i, j;\n\n  j = context->count[0];\n  if ((context->count[0] += (uint32_t) len << 3) < j) context->count[1]++;\n  context->count[1] += (uint32_t) (len >> 29);\n  j = (j >> 3) & 63;\n  if ((j + len) > 63) {\n    memcpy(&context->buffer[j], data, (i = 64 - j));\n    mg_sha1_transform(context->state, context->buffer);\n    for (; i + 63 < len; i += 64) {\n      mg_sha1_transform(context->state, &data[i]);\n    }\n    j = 0;\n  } else\n    i = 0;\n  memcpy(&context->buffer[j], &data[i], len - i);\n}\n\nvoid mg_sha1_final(unsigned char digest[20], mg_sha1_ctx *context) {\n  unsigned i;\n  unsigned char finalcount[8], c;\n\n  for (i = 0; i < 8; i++) {\n    finalcount[i] = (unsigned char) ((context->count[(i >= 4 ? 0 : 1)] >>\n                                      ((3 - (i & 3)) * 8)) &\n                                     255);\n  }\n  c = 0200;\n  mg_sha1_update(context, &c, 1);\n  while ((context->count[0] & 504) != 448) {\n    c = 0000;\n    mg_sha1_update(context, &c, 1);\n  }\n  mg_sha1_update(context, finalcount, 8);\n  for (i = 0; i < 20; i++) {\n    digest[i] =\n        (unsigned char) ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255);\n  }\n  memset(context, '\\0', sizeof(*context));\n  memset(&finalcount, '\\0', sizeof(finalcount));\n}\n"
  },
  {
    "path": "src/sha1.h",
    "content": "#pragma once\n\n#include \"arch.h\"\n\ntypedef struct {\n  uint32_t state[5];\n  uint32_t count[2];\n  unsigned char buffer[64];\n} mg_sha1_ctx;\n\nvoid mg_sha1_init(mg_sha1_ctx *);\nvoid mg_sha1_update(mg_sha1_ctx *, const unsigned char *data, size_t len);\nvoid mg_sha1_final(unsigned char digest[20], mg_sha1_ctx *);\n"
  },
  {
    "path": "src/sha256.c",
    "content": "// https://github.com/B-Con/crypto-algorithms\n// Author:     Brad Conte (brad AT bradconte.com)\n// Disclaimer: This code is presented \"as is\" without any guarantees.\n// Details:    Defines the API for the corresponding SHA1 implementation.\n// Copyright:  public domain\n\n#include \"sha256.h\"\n\n#define ror(x, n) (((x) >> (n)) | ((x) << (32 - (n))))\n#define ch(x, y, z) (((x) & (y)) ^ (~(x) & (z)))\n#define maj(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))\n#define ep0(x) (ror(x, 2) ^ ror(x, 13) ^ ror(x, 22))\n#define ep1(x) (ror(x, 6) ^ ror(x, 11) ^ ror(x, 25))\n#define sig0(x) (ror(x, 7) ^ ror(x, 18) ^ ((x) >> 3))\n#define sig1(x) (ror(x, 17) ^ ror(x, 19) ^ ((x) >> 10))\n\nstatic const uint32_t mg_sha256_k[64] = {\n    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,\n    0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n    0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,\n    0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n    0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n    0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,\n    0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,\n    0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n    0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2};\n\nvoid mg_sha256_init(mg_sha256_ctx *ctx) {\n  ctx->len = 0;\n  ctx->bits = 0;\n  ctx->state[0] = 0x6a09e667;\n  ctx->state[1] = 0xbb67ae85;\n  ctx->state[2] = 0x3c6ef372;\n  ctx->state[3] = 0xa54ff53a;\n  ctx->state[4] = 0x510e527f;\n  ctx->state[5] = 0x9b05688c;\n  ctx->state[6] = 0x1f83d9ab;\n  ctx->state[7] = 0x5be0cd19;\n}\n\nstatic void mg_sha256_chunk(mg_sha256_ctx *ctx) {\n  int i, j;\n  uint32_t a, b, c, d, e, f, g, h;\n  uint32_t m[64];\n  for (i = 0, j = 0; i < 16; ++i, j += 4)\n    m[i] = (uint32_t) (((uint32_t) ctx->buffer[j] << 24) |\n                       ((uint32_t) ctx->buffer[j + 1] << 16) |\n                       ((uint32_t) ctx->buffer[j + 2] << 8) |\n                       ((uint32_t) ctx->buffer[j + 3]));\n  for (; i < 64; ++i)\n    m[i] = sig1(m[i - 2]) + m[i - 7] + sig0(m[i - 15]) + m[i - 16];\n\n  a = ctx->state[0];\n  b = ctx->state[1];\n  c = ctx->state[2];\n  d = ctx->state[3];\n  e = ctx->state[4];\n  f = ctx->state[5];\n  g = ctx->state[6];\n  h = ctx->state[7];\n\n  for (i = 0; i < 64; ++i) {\n    uint32_t t1 = h + ep1(e) + ch(e, f, g) + mg_sha256_k[i] + m[i];\n    uint32_t t2 = ep0(a) + maj(a, b, c);\n    h = g;\n    g = f;\n    f = e;\n    e = d + t1;\n    d = c;\n    c = b;\n    b = a;\n    a = t1 + t2;\n  }\n\n  ctx->state[0] += a;\n  ctx->state[1] += b;\n  ctx->state[2] += c;\n  ctx->state[3] += d;\n  ctx->state[4] += e;\n  ctx->state[5] += f;\n  ctx->state[6] += g;\n  ctx->state[7] += h;\n}\n\nvoid mg_sha256_update(mg_sha256_ctx *ctx, const unsigned char *data,\n                      size_t len) {\n  size_t i;\n  for (i = 0; i < len; i++) {\n    ctx->buffer[ctx->len] = data[i];\n    if ((++ctx->len) == 64) {\n      mg_sha256_chunk(ctx);\n      ctx->bits += 512;\n      ctx->len = 0;\n    }\n  }\n}\n\n// TODO: make final reusable (remove side effects)\nvoid mg_sha256_final(unsigned char digest[32], mg_sha256_ctx *ctx) {\n  uint32_t i = ctx->len;\n  if (i < 56) {\n    ctx->buffer[i++] = 0x80;\n    while (i < 56) {\n      ctx->buffer[i++] = 0x00;\n    }\n  } else {\n    ctx->buffer[i++] = 0x80;\n    while (i < 64) {\n      ctx->buffer[i++] = 0x00;\n    }\n    mg_sha256_chunk(ctx);\n    memset(ctx->buffer, 0, 56);\n  }\n\n  ctx->bits += ctx->len * 8;\n  ctx->buffer[63] = (uint8_t) ((ctx->bits) & 0xff);\n  ctx->buffer[62] = (uint8_t) ((ctx->bits >> 8) & 0xff);\n  ctx->buffer[61] = (uint8_t) ((ctx->bits >> 16) & 0xff);\n  ctx->buffer[60] = (uint8_t) ((ctx->bits >> 24) & 0xff);\n  ctx->buffer[59] = (uint8_t) ((ctx->bits >> 32) & 0xff);\n  ctx->buffer[58] = (uint8_t) ((ctx->bits >> 40) & 0xff);\n  ctx->buffer[57] = (uint8_t) ((ctx->bits >> 48) & 0xff);\n  ctx->buffer[56] = (uint8_t) ((ctx->bits >> 56) & 0xff);\n  mg_sha256_chunk(ctx);\n\n  for (i = 0; i < 4; ++i) {\n    digest[i] = (uint8_t) ((ctx->state[0] >> (24 - i * 8)) & 0xff);\n    digest[i + 4] = (uint8_t) ((ctx->state[1] >> (24 - i * 8)) & 0xff);\n    digest[i + 8] = (uint8_t) ((ctx->state[2] >> (24 - i * 8)) & 0xff);\n    digest[i + 12] = (uint8_t) ((ctx->state[3] >> (24 - i * 8)) & 0xff);\n    digest[i + 16] = (uint8_t) ((ctx->state[4] >> (24 - i * 8)) & 0xff);\n    digest[i + 20] = (uint8_t) ((ctx->state[5] >> (24 - i * 8)) & 0xff);\n    digest[i + 24] = (uint8_t) ((ctx->state[6] >> (24 - i * 8)) & 0xff);\n    digest[i + 28] = (uint8_t) ((ctx->state[7] >> (24 - i * 8)) & 0xff);\n  }\n}\n\nvoid mg_sha256(uint8_t dst[32], uint8_t *data, size_t datasz) {\n  mg_sha256_ctx ctx;\n  mg_sha256_init(&ctx);\n  mg_sha256_update(&ctx, data, datasz);\n  mg_sha256_final(dst, &ctx);\n}\n\nvoid mg_hmac_sha256(uint8_t dst[32], uint8_t *key, size_t keysz, uint8_t *data,\n                    size_t datasz) {\n  mg_sha256_ctx ctx;\n  uint8_t k[64] = {0};\n  uint8_t o_pad[64], i_pad[64];\n  unsigned int i;\n  memset(i_pad, 0x36, sizeof(i_pad));\n  memset(o_pad, 0x5c, sizeof(o_pad));\n  if (keysz < 64) {\n    if (keysz > 0) memmove(k, key, keysz);\n  } else {\n    mg_sha256_init(&ctx);\n    mg_sha256_update(&ctx, key, keysz);\n    mg_sha256_final(k, &ctx);\n  }\n  for (i = 0; i < sizeof(k); i++) {\n    i_pad[i] ^= k[i];\n    o_pad[i] ^= k[i];\n  }\n  mg_sha256_init(&ctx);\n  mg_sha256_update(&ctx, i_pad, sizeof(i_pad));\n  mg_sha256_update(&ctx, data, datasz);\n  mg_sha256_final(dst, &ctx);\n  mg_sha256_init(&ctx);\n  mg_sha256_update(&ctx, o_pad, sizeof(o_pad));\n  mg_sha256_update(&ctx, dst, 32);\n  mg_sha256_final(dst, &ctx);\n}\n\n#define rotr64(x, n) (((x) >> (n)) | ((x) << (64 - (n))))\n#define ep064(x) (rotr64(x, 28) ^ rotr64(x, 34) ^ rotr64(x, 39))\n#define ep164(x) (rotr64(x, 14) ^ rotr64(x, 18) ^ rotr64(x, 41))\n#define sig064(x) (rotr64(x, 1) ^ rotr64(x, 8) ^ ((x) >> 7))\n#define sig164(x) (rotr64(x, 19) ^ rotr64(x, 61) ^ ((x) >> 6))\n\nstatic const uint64_t mg_sha256_k2[80] = {\n#if defined(__DCC__)\n    0x428a2f98d728ae22ull, 0x7137449123ef65cdull, 0xb5c0fbcfec4d3b2full,\n    0xe9b5dba58189dbbcull, 0x3956c25bf348b538ull, 0x59f111f1b605d019ull,\n    0x923f82a4af194f9bull, 0xab1c5ed5da6d8118ull, 0xd807aa98a3030242ull,\n    0x12835b0145706fbeull, 0x243185be4ee4b28cull, 0x550c7dc3d5ffb4e2ull,\n    0x72be5d74f27b896full, 0x80deb1fe3b1696b1ull, 0x9bdc06a725c71235ull,\n    0xc19bf174cf692694ull, 0xe49b69c19ef14ad2ull, 0xefbe4786384f25e3ull,\n    0x0fc19dc68b8cd5b5ull, 0x240ca1cc77ac9c65ull, 0x2de92c6f592b0275ull,\n    0x4a7484aa6ea6e483ull, 0x5cb0a9dcbd41fbd4ull, 0x76f988da831153b5ull,\n    0x983e5152ee66dfabull, 0xa831c66d2db43210ull, 0xb00327c898fb213full,\n    0xbf597fc7beef0ee4ull, 0xc6e00bf33da88fc2ull, 0xd5a79147930aa725ull,\n    0x06ca6351e003826full, 0x142929670a0e6e70ull, 0x27b70a8546d22ffcull,\n    0x2e1b21385c26c926ull, 0x4d2c6dfc5ac42aedull, 0x53380d139d95b3dfull,\n    0x650a73548baf63deull, 0x766a0abb3c77b2a8ull, 0x81c2c92e47edaee6ull,\n    0x92722c851482353bull, 0xa2bfe8a14cf10364ull, 0xa81a664bbc423001ull,\n    0xc24b8b70d0f89791ull, 0xc76c51a30654be30ull, 0xd192e819d6ef5218ull,\n    0xd69906245565a910ull, 0xf40e35855771202aull, 0x106aa07032bbd1b8ull,\n    0x19a4c116b8d2d0c8ull, 0x1e376c085141ab53ull, 0x2748774cdf8eeb99ull,\n    0x34b0bcb5e19b48a8ull, 0x391c0cb3c5c95a63ull, 0x4ed8aa4ae3418acbull,\n    0x5b9cca4f7763e373ull, 0x682e6ff3d6b2b8a3ull, 0x748f82ee5defb2fcull,\n    0x78a5636f43172f60ull, 0x84c87814a1f0ab72ull, 0x8cc702081a6439ecull,\n    0x90befffa23631e28ull, 0xa4506cebde82bde9ull, 0xbef9a3f7b2c67915ull,\n    0xc67178f2e372532bull, 0xca273eceea26619cull, 0xd186b8c721c0c207ull,\n    0xeada7dd6cde0eb1eull, 0xf57d4f7fee6ed178ull, 0x06f067aa72176fbaull,\n    0x0a637dc5a2c898a6ull, 0x113f9804bef90daeull, 0x1b710b35131c471bull,\n    0x28db77f523047d84ull, 0x32caab7b40c72493ull, 0x3c9ebe0a15c9bebcull,\n    0x431d67c49c100d4cull, 0x4cc5d4becb3e42b6ull, 0x597f299cfc657e2aull,\n    0x5fcb6fab3ad6faecull, 0x6c44198c4a475817ull\n#else\n    0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f,\n    0xe9b5dba58189dbbc, 0x3956c25bf348b538, 0x59f111f1b605d019,\n    0x923f82a4af194f9b, 0xab1c5ed5da6d8118, 0xd807aa98a3030242,\n    0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,\n    0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235,\n    0xc19bf174cf692694, 0xe49b69c19ef14ad2, 0xefbe4786384f25e3,\n    0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, 0x2de92c6f592b0275,\n    0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5,\n    0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f,\n    0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725,\n    0x06ca6351e003826f, 0x142929670a0e6e70, 0x27b70a8546d22ffc,\n    0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df,\n    0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6,\n    0x92722c851482353b, 0xa2bfe8a14cf10364, 0xa81a664bbc423001,\n    0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218,\n    0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8,\n    0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99,\n    0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb,\n    0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc,\n    0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec,\n    0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915,\n    0xc67178f2e372532b, 0xca273eceea26619c, 0xd186b8c721c0c207,\n    0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba,\n    0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b,\n    0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc,\n    0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a,\n    0x5fcb6fab3ad6faec, 0x6c44198c4a475817\n#endif\n};\n\nstatic void mg_sha384_transform(mg_sha384_ctx *ctx, const uint8_t data[]) {\n  uint64_t m[80];\n  uint64_t a, b, c, d, e, f, g, h;\n  int i, j;\n\n  for (i = 0, j = 0; i < 16; ++i, j += 8)\n    m[i] = ((uint64_t) data[j] << 56) | ((uint64_t) data[j + 1] << 48) |\n           ((uint64_t) data[j + 2] << 40) | ((uint64_t) data[j + 3] << 32) |\n           ((uint64_t) data[j + 4] << 24) | ((uint64_t) data[j + 5] << 16) |\n           ((uint64_t) data[j + 6] << 8) | ((uint64_t) data[j + 7]);\n  for (; i < 80; ++i)\n    m[i] = sig164(m[i - 2]) + m[i - 7] + sig064(m[i - 15]) + m[i - 16];\n\n  a = ctx->state[0];\n  b = ctx->state[1];\n  c = ctx->state[2];\n  d = ctx->state[3];\n  e = ctx->state[4];\n  f = ctx->state[5];\n  g = ctx->state[6];\n  h = ctx->state[7];\n\n  for (i = 0; i < 80; ++i) {\n    uint64_t t1 = h + ep164(e) + ch(e, f, g) + mg_sha256_k2[i] + m[i];\n    uint64_t t2 = ep064(a) + maj(a, b, c);\n    h = g;\n    g = f;\n    f = e;\n    e = d + t1;\n    d = c;\n    c = b;\n    b = a;\n    a = t1 + t2;\n  }\n\n  ctx->state[0] += a;\n  ctx->state[1] += b;\n  ctx->state[2] += c;\n  ctx->state[3] += d;\n  ctx->state[4] += e;\n  ctx->state[5] += f;\n  ctx->state[6] += g;\n  ctx->state[7] += h;\n}\n\nvoid mg_sha384_init(mg_sha384_ctx *ctx) {\n  ctx->datalen = 0;\n  ctx->bitlen[0] = 0;\n  ctx->bitlen[1] = 0;\n#if defined(__DCC__)\n  ctx->state[0] = 0xcbbb9d5dc1059ed8ull;\n  ctx->state[1] = 0x629a292a367cd507ull;\n  ctx->state[2] = 0x9159015a3070dd17ull;\n  ctx->state[3] = 0x152fecd8f70e5939ull;\n  ctx->state[4] = 0x67332667ffc00b31ull;\n  ctx->state[5] = 0x8eb44a8768581511ull;\n  ctx->state[6] = 0xdb0c2e0d64f98fa7ull;\n  ctx->state[7] = 0x47b5481dbefa4fa4ull;\n#else\n  ctx->state[0] = 0xcbbb9d5dc1059ed8;\n  ctx->state[1] = 0x629a292a367cd507;\n  ctx->state[2] = 0x9159015a3070dd17;\n  ctx->state[3] = 0x152fecd8f70e5939;\n  ctx->state[4] = 0x67332667ffc00b31;\n  ctx->state[5] = 0x8eb44a8768581511;\n  ctx->state[6] = 0xdb0c2e0d64f98fa7;\n  ctx->state[7] = 0x47b5481dbefa4fa4;\n#endif\n}\n\nvoid mg_sha384_update(mg_sha384_ctx *ctx, const uint8_t *data, size_t len) {\n  size_t i;\n  for (i = 0; i < len; ++i) {\n    ctx->buffer[ctx->datalen] = data[i];\n    ctx->datalen++;\n    if (ctx->datalen == 128) {\n      mg_sha384_transform(ctx, ctx->buffer);\n      ctx->bitlen[1] += 1024;\n      if (ctx->bitlen[1] < 1024) ctx->bitlen[0]++;\n      ctx->datalen = 0;\n    }\n  }\n}\n\nvoid mg_sha384_final(uint8_t hash[48], mg_sha384_ctx *ctx) {\n  size_t i = ctx->datalen;\n\n  if (ctx->datalen < 112) {\n    ctx->buffer[i++] = 0x80;\n    while (i < 112) ctx->buffer[i++] = 0x00;\n  } else {\n    ctx->buffer[i++] = 0x80;\n    while (i < 128) ctx->buffer[i++] = 0x00;\n    mg_sha384_transform(ctx, ctx->buffer);\n    memset(ctx->buffer, 0, 112);\n  }\n\n  ctx->bitlen[1] += ctx->datalen * 8;\n  if (ctx->bitlen[1] < ctx->datalen * 8) ctx->bitlen[0]++;\n  ctx->buffer[127] = (uint8_t) (ctx->bitlen[1]);\n  ctx->buffer[126] = (uint8_t) (ctx->bitlen[1] >> 8);\n  ctx->buffer[125] = (uint8_t) (ctx->bitlen[1] >> 16);\n  ctx->buffer[124] = (uint8_t) (ctx->bitlen[1] >> 24);\n  ctx->buffer[123] = (uint8_t) (ctx->bitlen[1] >> 32);\n  ctx->buffer[122] = (uint8_t) (ctx->bitlen[1] >> 40);\n  ctx->buffer[121] = (uint8_t) (ctx->bitlen[1] >> 48);\n  ctx->buffer[120] = (uint8_t) (ctx->bitlen[1] >> 56);\n  ctx->buffer[119] = (uint8_t) (ctx->bitlen[0]);\n  ctx->buffer[118] = (uint8_t) (ctx->bitlen[0] >> 8);\n  ctx->buffer[117] = (uint8_t) (ctx->bitlen[0] >> 16);\n  ctx->buffer[116] = (uint8_t) (ctx->bitlen[0] >> 24);\n  ctx->buffer[115] = (uint8_t) (ctx->bitlen[0] >> 32);\n  ctx->buffer[114] = (uint8_t) (ctx->bitlen[0] >> 40);\n  ctx->buffer[113] = (uint8_t) (ctx->bitlen[0] >> 48);\n  ctx->buffer[112] = (uint8_t) (ctx->bitlen[0] >> 56);\n  mg_sha384_transform(ctx, ctx->buffer);\n\n  for (i = 0; i < 6; ++i) {\n    hash[i * 8] = (uint8_t) ((ctx->state[i] >> 56) & 0xff);\n    hash[i * 8 + 1] = (uint8_t) ((ctx->state[i] >> 48) & 0xff);\n    hash[i * 8 + 2] = (uint8_t) ((ctx->state[i] >> 40) & 0xff);\n    hash[i * 8 + 3] = (uint8_t) ((ctx->state[i] >> 32) & 0xff);\n    hash[i * 8 + 4] = (uint8_t) ((ctx->state[i] >> 24) & 0xff);\n    hash[i * 8 + 5] = (uint8_t) ((ctx->state[i] >> 16) & 0xff);\n    hash[i * 8 + 6] = (uint8_t) ((ctx->state[i] >> 8) & 0xff);\n    hash[i * 8 + 7] = (uint8_t) (ctx->state[i] & 0xff);\n  }\n}\n\nvoid mg_sha384(uint8_t dst[48], uint8_t *data, size_t datasz) {\n  mg_sha384_ctx ctx;\n  mg_sha384_init(&ctx);\n  mg_sha384_update(&ctx, data, datasz);\n  mg_sha384_final(dst, &ctx);\n}\n"
  },
  {
    "path": "src/sha256.h",
    "content": "// https://github.com/B-Con/crypto-algorithms\n// Author:     Brad Conte (brad AT bradconte.com)\n// Disclaimer: This code is presented \"as is\" without any guarantees.\n// Details:    Defines the API for the corresponding SHA1 implementation.\n// Copyright:  public domain\n\n#pragma once\n\n#include \"arch.h\"\n\ntypedef struct {\n  uint32_t state[8];\n  uint64_t bits;\n  uint32_t len;\n  unsigned char buffer[64];\n} mg_sha256_ctx;\n\n\nvoid mg_sha256_init(mg_sha256_ctx *);\nvoid mg_sha256_update(mg_sha256_ctx *, const unsigned char *data, size_t len);\nvoid mg_sha256_final(unsigned char digest[32], mg_sha256_ctx *);\nvoid mg_sha256(uint8_t dst[32], uint8_t *data, size_t datasz);\nvoid mg_hmac_sha256(uint8_t dst[32], uint8_t *key, size_t keysz, uint8_t *data,\n                    size_t datasz);\n\ntypedef struct {\n    uint64_t state[8];\n    uint8_t buffer[128];\n    uint64_t bitlen[2];\n    uint32_t datalen;\n} mg_sha384_ctx;\nvoid mg_sha384_init(mg_sha384_ctx *ctx);\nvoid mg_sha384_update(mg_sha384_ctx *ctx, const uint8_t *data, size_t len);\nvoid mg_sha384_final(uint8_t digest[48], mg_sha384_ctx *ctx);\nvoid mg_sha384(uint8_t dst[48], uint8_t *data, size_t datasz);\n\n"
  },
  {
    "path": "src/sntp.c",
    "content": "#include \"sntp.h\"\n#include \"arch.h\"\n#include \"event.h\"\n#include \"log.h\"\n#include \"util.h\"\n\n#define SNTP_TIME_OFFSET 2208988800U  // (1970 - 1900) in seconds\n#define SNTP_MAX_FRAC 4294967295.0    // 2 ** 32 - 1\n\nstatic uint64_t s_boot_timestamp = 0;  // Updated by SNTP\n\nuint64_t mg_now(void) {\n  return mg_millis() + s_boot_timestamp;\n}\n\nstatic int64_t gettimestamp(const uint32_t *data) {\n  uint32_t sec = mg_ntohl(data[0]), frac = mg_ntohl(data[1]);\n  if (sec) sec -= SNTP_TIME_OFFSET;\n  return ((int64_t) sec) * 1000 + (int64_t) (frac / SNTP_MAX_FRAC * 1000.0);\n}\n\nint64_t mg_sntp_parse(const unsigned char *buf, size_t len) {\n  int64_t epoch_milliseconds = -1;\n  int mode = len > 0 ? buf[0] & 7 : 0;\n  int version = len > 0 ? (buf[0] >> 3) & 7 : 0;\n  if (len < 48) {\n    MG_ERROR((\"%s\", \"corrupt packet\"));\n  } else if (mode != 4 && mode != 5) {\n    MG_ERROR((\"%s\", \"not a server reply\"));\n  } else if (buf[1] == 0) {\n    MG_ERROR((\"%s\", \"server sent a kiss of death\"));\n  } else if (version == 4 || version == 3) {\n    // int64_t ref = gettimestamp((uint32_t *) &buf[16]);\n    int64_t origin_time = gettimestamp((uint32_t *) &buf[24]);\n    int64_t receive_time = gettimestamp((uint32_t *) &buf[32]);\n    int64_t transmit_time = gettimestamp((uint32_t *) &buf[40]);\n    int64_t now = (int64_t) mg_millis();\n    int64_t latency = (now - origin_time) - (transmit_time - receive_time);\n    epoch_milliseconds = transmit_time + latency / 2;\n    s_boot_timestamp = (uint64_t) (epoch_milliseconds - now);\n  } else {\n    MG_ERROR((\"unexpected version: %d\", version));\n  }\n  return epoch_milliseconds;\n}\n\nstatic void sntp_cb(struct mg_connection *c, int ev, void *ev_data) {\n  uint64_t *expiration_time = (uint64_t *) c->data;\n  if (ev == MG_EV_OPEN) {\n    *expiration_time = mg_millis() + 3000;  // Store expiration time in 3s\n  } else if (ev == MG_EV_CONNECT) {\n    mg_sntp_request(c);\n  } else if (ev == MG_EV_READ) {\n    int64_t milliseconds = mg_sntp_parse(c->recv.buf, c->recv.len);\n    if (milliseconds > 0) {\n      s_boot_timestamp = (uint64_t) milliseconds - mg_millis();\n      mg_call(c, MG_EV_SNTP_TIME, (uint64_t *) &milliseconds);\n      MG_DEBUG((\"%lu got time: %lld ms from epoch\", c->id, milliseconds));\n    }\n    // mg_iobuf_del(&c->recv, 0, c->recv.len);  // Free receive buffer\n    c->is_closing = 1;\n  } else if (ev == MG_EV_POLL) {\n    if (mg_millis() > *expiration_time) c->is_closing = 1;\n  } else if (ev == MG_EV_CLOSE) {\n  }\n  (void) ev_data;\n}\n\nvoid mg_sntp_request(struct mg_connection *c) {\n  if (c->is_resolving) {\n    MG_ERROR((\"%lu wait until resolved\", c->id));\n  } else {\n    int64_t now = (int64_t) mg_millis();  // Use int64_t, for vc98\n    uint8_t buf[48] = {0};\n    uint32_t *t = (uint32_t *) &buf[40];\n    double frac = ((double) (now % 1000)) / 1000.0 * SNTP_MAX_FRAC;\n    buf[0] = (0 << 6) | (4 << 3) | 3;\n    t[0] = mg_htonl((uint32_t) (now / 1000) + SNTP_TIME_OFFSET);\n    t[1] = mg_htonl((uint32_t) frac);\n    mg_send(c, buf, sizeof(buf));\n  }\n}\n\nstruct mg_connection *mg_sntp_connect(struct mg_mgr *mgr, const char *url,\n                                      mg_event_handler_t fn, void *fn_data) {\n  if (url == NULL) url = \"udp://time.google.com:123\";\n  return mg_connect_svc(mgr, url, fn, fn_data, sntp_cb, NULL);\n}\n"
  },
  {
    "path": "src/sntp.h",
    "content": "#pragma once\n\n#include \"net.h\"\n\nstruct mg_connection *mg_sntp_connect(struct mg_mgr *mgr, const char *url,\n                                      mg_event_handler_t fn, void *fn_data);\nvoid mg_sntp_request(struct mg_connection *c);\nint64_t mg_sntp_parse(const unsigned char *buf, size_t len);\n\nuint64_t mg_now(void);     // Return milliseconds since Epoch\n"
  },
  {
    "path": "src/sock.c",
    "content": "#include \"dns.h\"\n#include \"event.h\"\n#include \"log.h\"\n#include \"net.h\"\n#include \"printf.h\"\n#include \"str.h\"\n#include \"timer.h\"\n#include \"tls.h\"\n#include \"url.h\"\n#include \"util.h\"\n\n#if MG_ENABLE_SOCKET\n\n#ifndef closesocket\n#define closesocket(x) close(x)\n#endif\n\n#define FD(c_) ((MG_SOCKET_TYPE) (size_t) (c_)->fd)\n#define S2PTR(s_) ((void *) (size_t) (s_))\n\n#ifndef MSG_NONBLOCKING\n#define MSG_NONBLOCKING 0\n#endif\n\n#ifndef AF_INET6\n#define AF_INET6 10\n#endif\n\n#ifndef MG_SOCK_ERR\n#define MG_SOCK_ERR(errcode) ((errcode) < 0 ? errno : 0)\n#endif\n\n#ifndef MG_SOCK_INTR\n#define MG_SOCK_INTR(fd) (fd == MG_INVALID_SOCKET && MG_SOCK_ERR(-1) == EINTR)\n#endif\n\n#ifndef MG_SOCK_PENDING\n#define MG_SOCK_PENDING(errcode) \\\n  (((errcode) < 0) && (errno == EINPROGRESS || errno == EWOULDBLOCK))\n#endif\n\n#ifndef MG_SOCK_RESET\n#define MG_SOCK_RESET(errcode) \\\n  (((errcode) < 0) && (errno == EPIPE || errno == ECONNRESET))\n#endif\n\nunion usa {\n  struct sockaddr sa;\n  struct sockaddr_in sin;\n#if MG_ENABLE_IPV6\n  struct sockaddr_in6 sin6;\n#endif\n};\n\nstatic socklen_t tousa(struct mg_addr *a, union usa *usa) {\n  socklen_t len = sizeof(usa->sin);\n  memset(usa, 0, sizeof(*usa));\n  usa->sin.sin_family = AF_INET;\n  usa->sin.sin_port = a->port;\n  memcpy(&usa->sin.sin_addr, a->addr.ip, sizeof(uint32_t));\n#if MG_ENABLE_IPV6\n  if (a->is_ip6) {\n    usa->sin.sin_family = AF_INET6;\n    usa->sin6.sin6_port = a->port;\n    usa->sin6.sin6_scope_id = a->scope_id;\n    memcpy(&usa->sin6.sin6_addr, a->addr.ip, sizeof(a->addr.ip));\n    len = sizeof(usa->sin6);\n  }\n#endif\n  return len;\n}\n\nstatic void tomgaddr(union usa *usa, struct mg_addr *a, bool is_ip6) {\n  a->is_ip6 = is_ip6;\n#if MG_ENABLE_IPV6\n  if (is_ip6) {\n    memcpy(a->addr.ip, &usa->sin6.sin6_addr, sizeof(a->addr.ip));\n    a->port = usa->sin6.sin6_port;\n    a->scope_id = (uint8_t) usa->sin6.sin6_scope_id;\n  } else\n#endif\n  {\n    a->port = usa->sin.sin_port;\n    memcpy(&a->addr.ip, &usa->sin.sin_addr, sizeof(uint32_t));\n  }\n}\n\nstatic void setlocaddr(MG_SOCKET_TYPE fd, struct mg_addr *addr) {\n  union usa usa;\n  socklen_t n = sizeof(usa);\n  if (getsockname(fd, &usa.sa, &n) == 0) {\n    tomgaddr(&usa, addr, n != sizeof(usa.sin));\n  }\n}\n\n// Get the local 'addr' the stack will use to connect to 'to'\nvoid mg_getlocaddr(struct mg_connection *c, struct mg_addr *to, struct mg_addr *addr);\nvoid mg_getlocaddr(struct mg_connection *c, struct mg_addr *to, struct mg_addr *addr) {\n  union usa usa;\n  socklen_t slen;\n  MG_SOCKET_TYPE fd;\n  int rc, af = to->is_ip6 ? AF_INET6 : AF_INET;\n  fd = socket(af, SOCK_DGRAM, IPPROTO_UDP);\n  if (fd == MG_INVALID_SOCKET) {\n    mg_error(c, \"socket(): %d\", MG_SOCK_ERR(-1));\n    return;\n  }\n  // NOTE(): TI-RTOS NDK may require binding\n  slen = tousa(to, &usa);\n  if ((rc = connect(fd, &usa.sa, slen)) != 0) {\n    mg_error(c, \"connect: %d\", MG_SOCK_ERR(rc));\n    return;\n  }\n  setlocaddr(fd, addr);\n  closesocket(fd);\n}\n\n\nstatic void iolog(struct mg_connection *c, char *buf, long n, bool r) {\n  if (n == MG_IO_WAIT) {\n    // Do nothing\n  } else if (n <= 0) {\n    c->is_closing = 1;  // Termination. Don't call mg_error(): #1529\n  } else if (n > 0) {\n    if (c->is_hexdumping) {\n      MG_INFO((\"\\n-- %lu %M %s %M %ld\", c->id, mg_print_ip_port, &c->loc,\n               r ? \"<-\" : \"->\", mg_print_ip_port, &c->rem, n));\n      mg_hexdump(buf, (size_t) n);\n    }\n    if (r) {\n      c->recv.len += (size_t) n;\n      mg_call(c, MG_EV_READ, &n);\n    } else {\n      mg_iobuf_del(&c->send, 0, (size_t) n);\n      // if (c->send.len == 0) mg_iobuf_resize(&c->send, 0);\n      if (c->send.len == 0) {\n        MG_EPOLL_MOD(c, 0);\n      }\n      mg_call(c, MG_EV_WRITE, &n);\n    }\n  }\n}\n\nlong mg_io_send(struct mg_connection *c, const void *buf, size_t len) {\n  long n;\n  if (c->is_udp) {\n    union usa usa;\n    socklen_t slen = tousa(&c->rem, &usa);\n    n = sendto(FD(c), (char *) buf, len, 0, &usa.sa, slen);\n    if (n > 0) setlocaddr(FD(c), &c->loc);\n  } else {\n    n = send(FD(c), (char *) buf, len, MSG_NONBLOCKING);\n  }\n  MG_VERBOSE((\"%lu %ld %d\", c->id, n, MG_SOCK_ERR(n)));\n  if (MG_SOCK_PENDING(n)) return MG_IO_WAIT;\n  if (MG_SOCK_RESET(n)) return MG_IO_RESET;  // MbedTLS, see #1507\n  if (n <= 0) return MG_IO_ERR;\n  return n;\n}\n\nbool mg_send(struct mg_connection *c, const void *buf, size_t len) {\n  if (c->is_udp) {\n    long n = mg_io_send(c, buf, len);\n    MG_DEBUG((\"%lu %ld %lu:%lu:%lu %ld err %d\", c->id, c->fd, c->send.len,\n              c->recv.len, c->rtls.len, n, MG_SOCK_ERR(n)));\n    iolog(c, (char *) buf, n, false);\n    return n > 0;\n  } else {\n    return len == 0 || mg_iobuf_add(&c->send, c->send.len, buf, len) > 0;\n    // returning 0 means an OOM condition (iobuf couldn't resize), yet this is\n    // so far recoverable, let the caller decide\n  }\n}\n\nstatic void mg_set_non_blocking_mode(MG_SOCKET_TYPE fd) {\n#if defined(MG_CUSTOM_NONBLOCK)\n  MG_CUSTOM_NONBLOCK(fd);\n#elif MG_ARCH == MG_ARCH_WIN32 && MG_ENABLE_WINSOCK\n  unsigned long on = 1;\n  ioctlsocket(fd, FIONBIO, &on);\n#elif MG_ENABLE_RL\n  unsigned long on = 1;\n  ioctlsocket(fd, FIONBIO, &on);\n#elif MG_ENABLE_FREERTOS_TCP\n  const BaseType_t off = 0;\n  if (setsockopt(fd, 0, FREERTOS_SO_RCVTIMEO, &off, sizeof(off)) != 0) (void) 0;\n  if (setsockopt(fd, 0, FREERTOS_SO_SNDTIMEO, &off, sizeof(off)) != 0) (void) 0;\n#elif MG_ENABLE_LWIP\n  lwip_fcntl(fd, F_SETFL, O_NONBLOCK);\n#elif MG_ARCH == MG_ARCH_THREADX\n  // NetxDuo fails to send large blocks of data to the non-blocking sockets\n  (void) fd;\n  // fcntl(fd, F_SETFL, O_NONBLOCK);\n#elif MG_ARCH == MG_ARCH_TIRTOS\n  int val = 0;\n  setsockopt(fd, SOL_SOCKET, SO_BLOCKING, &val, sizeof(val));\n  // SPRU524J section 3.3.3 page 63, SO_SNDLOWAT\n  int sz = sizeof(val);\n  getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &val, &sz);\n  val /= 2;  // set send low-water mark at half send buffer size\n  setsockopt(fd, SOL_SOCKET, SO_SNDLOWAT, &val, sizeof(val));\n#else\n  fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);  // Non-blocking mode\n  fcntl(fd, F_SETFD, FD_CLOEXEC);                          // Set close-on-exec\n#endif\n}\n\nvoid mg_multicast_add(struct mg_connection *c, char *ip);\nvoid mg_multicast_add(struct mg_connection *c, char *ip) {\n#if MG_ENABLE_RL\n  MG_ERROR((\"unsupported\"));\n#elif MG_ENABLE_FREERTOS_TCP\n  // TODO(): prvAllowIPPacketIPv4()\n#else\n  // lwIP, Unix, Windows, Zephyr 4+(, AzureRTOS ?)\n#if MG_ENABLE_LWIP && !LWIP_IGMP\n  MG_ERROR((\"LWIP_IGMP not defined, no multicast support\"));\n#else\n#if defined(__ZEPHYR__) && ZEPHYR_VERSION_CODE < 0x40000\n  MG_ERROR((\"struct ip_mreq not defined\"));\n#else\n  struct ip_mreq mreq;\n  mreq.imr_multiaddr.s_addr = inet_addr(ip);\n  mreq.imr_interface.s_addr = mg_htonl(INADDR_ANY);\n  setsockopt(FD(c), IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *) &mreq,\n             sizeof(mreq));\n#endif  // !Zephyr\n#endif  // !lwIP\n#endif\n}\n\nbool mg_open_listener(struct mg_connection *c, const char *url) {\n  MG_SOCKET_TYPE fd = MG_INVALID_SOCKET;\n  bool success = false;\n  c->loc.port = mg_htons(mg_url_port(url));\n  if (!mg_aton(mg_url_host(url), &c->loc)) {\n    MG_ERROR((\"invalid listening URL: %s\", url));\n  } else {\n    union usa usa;\n    socklen_t slen = tousa(&c->loc, &usa);\n    int rc, on = 1, af = c->loc.is_ip6 ? AF_INET6 : AF_INET;\n    int type = strncmp(url, \"udp:\", 4) == 0 ? SOCK_DGRAM : SOCK_STREAM;\n    int proto = type == SOCK_DGRAM ? IPPROTO_UDP : IPPROTO_TCP;\n    (void) on;\n\n    if ((fd = socket(af, type, proto)) == MG_INVALID_SOCKET) {\n      MG_ERROR((\"socket: %d\", MG_SOCK_ERR(-1)));\n#if defined(SO_EXCLUSIVEADDRUSE)\n    } else if ((rc = setsockopt(fd, SOL_SOCKET, SO_EXCLUSIVEADDRUSE,\n                                (char *) &on, sizeof(on))) != 0) {\n      // \"Using SO_REUSEADDR and SO_EXCLUSIVEADDRUSE\"\n      MG_ERROR((\"setsockopt(SO_EXCLUSIVEADDRUSE): %d %d\", on, MG_SOCK_ERR(rc)));\n#elif defined(SO_REUSEADDR) && (!defined(LWIP_SOCKET) || SO_REUSE)\n    } else if ((rc = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &on,\n                                sizeof(on))) != 0) {\n      // 1. SO_REUSEADDR semantics on UNIX and Windows is different.  On\n      // Windows, SO_REUSEADDR allows to bind a socket to a port without error\n      // even if the port is already open by another program. This is not the\n      // behavior SO_REUSEADDR was designed for, and leads to hard-to-track\n      // failure scenarios.\n      //\n      // 2. For LWIP, SO_REUSEADDR should be explicitly enabled by defining\n      // SO_REUSE = 1 in lwipopts.h, otherwise the code below will compile but\n      // won't work! (setsockopt will return EINVAL)\n      MG_ERROR((\"setsockopt(SO_REUSEADDR): %d\", MG_SOCK_ERR(rc)));\n#endif\n#if MG_IPV6_V6ONLY\n      // Bind only to the V6 address, not V4 address on this port\n    } else if (c->loc.is_ip6 &&\n               (rc = setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char *) &on,\n                                sizeof(on))) != 0) {\n      // See #2089. Allow to bind v4 and v6 sockets on the same port\n      MG_ERROR((\"setsockopt(IPV6_V6ONLY): %d\", MG_SOCK_ERR(rc)));\n#endif\n    } else if ((rc = bind(fd, &usa.sa, slen)) != 0) {\n      MG_ERROR((\"bind: %d\", MG_SOCK_ERR(rc)));\n    } else if ((type == SOCK_STREAM &&\n                (rc = listen(fd, MG_SOCK_LISTEN_BACKLOG_SIZE)) != 0)) {\n      // NOTE(lsm): FreeRTOS uses backlog value as a connection limit\n      // In case port was set to 0, get the real port number\n      MG_ERROR((\"listen: %d\", MG_SOCK_ERR(rc)));\n    } else {\n      setlocaddr(fd, &c->loc);\n      mg_set_non_blocking_mode(fd);\n      c->fd = S2PTR(fd);\n      MG_EPOLL_ADD(c);\n      success = true;\n    }\n  }\n  if (success == false && fd != MG_INVALID_SOCKET) closesocket(fd);\n  return success;\n}\n\nstatic long recv_raw(struct mg_connection *c, void *buf, size_t len) {\n  long n = 0;\n  if (c->is_udp) {\n    union usa usa;\n    socklen_t slen = tousa(&c->rem, &usa);\n    n = recvfrom(FD(c), (char *) buf, len, 0, &usa.sa, &slen);\n    if (n > 0) tomgaddr(&usa, &c->rem, slen != sizeof(usa.sin));\n  } else {\n    n = recv(FD(c), (char *) buf, len, MSG_NONBLOCKING);\n  }\n  MG_VERBOSE((\"%lu %ld %d\", c->id, n, MG_SOCK_ERR(n)));\n  if (MG_SOCK_PENDING(n)) return MG_IO_WAIT;\n  if (MG_SOCK_RESET(n)) return MG_IO_RESET;  // MbedTLS, see #1507\n  if (n <= 0) return MG_IO_ERR;\n  return n;\n}\n\nstatic bool ioalloc(struct mg_connection *c, struct mg_iobuf *io) {\n  bool res = false;\n  if (io->len >= MG_MAX_RECV_SIZE) {\n    mg_error(c, \"MG_MAX_RECV_SIZE\");\n  } else if (io->size <= io->len &&\n             !mg_iobuf_resize(io, io->size + MG_IO_SIZE)) {\n    mg_error(c, \"OOM\");\n  } else {\n    res = true;\n  }\n  return res;\n}\n\n// NOTE(lsm): do only one iteration of reads, cause some systems\n// (e.g. FreeRTOS stack) return 0 instead of -1/EWOULDBLOCK when no data\nstatic void read_conn(struct mg_connection *c) {\n  if (ioalloc(c, &c->recv)) {\n    char *buf = (char *) &c->recv.buf[c->recv.len];\n    size_t len = c->recv.size - c->recv.len;\n    long n = -1;\n    if (c->is_tls) {\n      // Do not read to the raw TLS buffer if it already has enough.\n      // This is to prevent overflowing c->rtls if our reads are slow\n      long m;\n      if (c->rtls.len < 16 * 1024 + 40) {  // TLS record, header, MAC, padding\n        if (!ioalloc(c, &c->rtls)) return;\n        n = recv_raw(c, (char *) &c->rtls.buf[c->rtls.len],\n                     c->rtls.size - c->rtls.len);\n        if (n > 0) c->rtls.len += (size_t) n;\n      }\n      // there can still be > 16K from last iteration, always mg_tls_recv()\n      m = c->is_tls_hs ? (long) MG_IO_WAIT : mg_tls_recv(c, buf, len);\n      if (n == MG_IO_ERR || n == MG_IO_RESET) {  // Windows, see #3031\n        if (c->rtls.len == 0 || m < 0) {\n          // Close only when we have fully drained both rtls and TLS buffers\n          c->is_closing = 1;         // or there's nothing we can do about it.\n          if (m < 0) m = MG_IO_ERR;  // but return last record data, see #3104\n        } else {                     // see #2885\n          // TLS buffer is capped to max record size, even though, there can\n          // be more than one record, give TLS a chance to process them.\n        }\n      } else if (c->is_tls_hs) {\n        mg_tls_handshake(c);\n      }\n      n = m;\n    } else {\n      n = recv_raw(c, buf, len);\n    }\n    MG_DEBUG((\"%lu %ld %lu:%lu:%lu %ld err %d\", c->id, c->fd, c->send.len,\n              c->recv.len, c->rtls.len, n, MG_SOCK_ERR(n)));\n    iolog(c, buf, n, true);\n  }\n}\n\nstatic void write_conn(struct mg_connection *c) {\n  char *buf = (char *) c->send.buf;\n  size_t len = c->send.len;\n  long n = c->is_tls ? mg_tls_send(c, buf, len) : mg_io_send(c, buf, len);\n  // TODO(): mg_tls_send() may return 0 forever on steady OOM\n  MG_DEBUG((\"%lu %ld snd %ld/%ld rcv %ld/%ld n=%ld err=%d\", c->id, c->fd,\n            (long) c->send.len, (long) c->send.size, (long) c->recv.len,\n            (long) c->recv.size, n, MG_SOCK_ERR(n)));\n  iolog(c, buf, n, false);\n}\n\nstatic void close_conn(struct mg_connection *c) {\n  if (FD(c) != MG_INVALID_SOCKET) {\n#if MG_ENABLE_EPOLL\n    epoll_ctl(c->mgr->epoll_fd, EPOLL_CTL_DEL, FD(c), NULL);\n#endif\n    closesocket(FD(c));\n#if MG_ENABLE_FREERTOS_TCP\n    FreeRTOS_FD_CLR(c->fd, c->mgr->ss, eSELECT_ALL);\n#endif\n  }\n  mg_close_conn(c);\n}\n\nstatic void connect_conn(struct mg_connection *c) {\n  union usa usa;\n  socklen_t n = sizeof(usa);\n  // Use getpeername() to test whether we have connected\n  if (getpeername(FD(c), &usa.sa, &n) == 0) {\n    c->is_connecting = 0;\n    setlocaddr(FD(c), &c->loc);\n    mg_call(c, MG_EV_CONNECT, NULL);\n    MG_EPOLL_MOD(c, 0);\n    if (c->is_tls_hs) mg_tls_handshake(c);\n    if (!c->is_tls_hs) c->is_tls = 0;  // user did not call mg_tls_init()\n  } else {\n    mg_error(c, \"socket error\");\n  }\n}\n\nstatic void setsockopts(struct mg_connection *c) {\n#if MG_ENABLE_FREERTOS_TCP || MG_ARCH == MG_ARCH_THREADX || \\\n    MG_ARCH == MG_ARCH_TIRTOS\n  (void) c;\n#else\n  int on = 1;\n#if !defined(SOL_TCP)\n#define SOL_TCP IPPROTO_TCP\n#endif\n  if (setsockopt(FD(c), SOL_TCP, TCP_NODELAY, (char *) &on, sizeof(on)) != 0)\n    (void) 0;\n  if (setsockopt(FD(c), SOL_SOCKET, SO_KEEPALIVE, (char *) &on, sizeof(on)) !=\n      0)\n    (void) 0;\n#endif\n}\n\nvoid mg_connect_resolved(struct mg_connection *c) {\n  int type = c->is_udp ? SOCK_DGRAM : SOCK_STREAM;\n  int proto = type == SOCK_DGRAM ? IPPROTO_UDP : IPPROTO_TCP;\n  int rc, af = c->rem.is_ip6 ? AF_INET6 : AF_INET;  // c->rem has resolved IP\n  c->fd = S2PTR(socket(af, type, proto));           // Create outbound socket\n  c->is_resolving = 0;                              // Clear resolving flag\n  if (FD(c) == MG_INVALID_SOCKET) {\n    mg_error(c, \"socket(): %d\", MG_SOCK_ERR(-1));\n  } else if (c->is_udp) {\n    MG_EPOLL_ADD(c);\n#if MG_ARCH == MG_ARCH_TIRTOS\n    union usa usa;  // TI-RTOS NDK requires binding to receive on UDP sockets\n    socklen_t slen = tousa(&c->loc, &usa);\n    if ((rc = bind(c->fd, &usa.sa, slen)) != 0)\n      MG_ERROR((\"bind: %d\", MG_SOCK_ERR(rc)));\n#endif\n    setlocaddr(FD(c), &c->loc);\n    mg_call(c, MG_EV_RESOLVE, NULL);\n    mg_call(c, MG_EV_CONNECT, NULL);\n  } else {\n    union usa usa;\n    socklen_t slen = tousa(&c->rem, &usa);\n    mg_set_non_blocking_mode(FD(c));\n    setsockopts(c);\n    MG_EPOLL_ADD(c);\n    mg_call(c, MG_EV_RESOLVE, NULL);\n    rc = connect(FD(c), &usa.sa, slen);  // Attempt to connect\n    if (rc == 0) {                       // Success\n      setlocaddr(FD(c), &c->loc);\n      mg_call(c, MG_EV_CONNECT, NULL);   // Send MG_EV_CONNECT to the user\n      if (!c->is_tls_hs) c->is_tls = 0;  // user did not call mg_tls_init()\n    } else if (MG_SOCK_PENDING(rc)) {    // Need to wait for TCP handshake\n      MG_DEBUG((\"%lu %ld -> %M pend\", c->id, c->fd, mg_print_ip_port, &c->rem));\n      c->is_connecting = 1;\n    } else {\n      mg_error(c, \"connect: %d\", MG_SOCK_ERR(rc));\n    }\n  }\n}\n\nstatic MG_SOCKET_TYPE raccept(MG_SOCKET_TYPE sock, union usa *usa,\n                              socklen_t *len) {\n  MG_SOCKET_TYPE fd = MG_INVALID_SOCKET;\n  do {\n    memset(usa, 0, sizeof(*usa));\n    fd = accept(sock, &usa->sa, len);\n  } while (MG_SOCK_INTR(fd));\n  return fd;\n}\n\nstatic void accept_conn(struct mg_mgr *mgr, struct mg_connection *lsn) {\n  struct mg_connection *c = NULL;\n  union usa usa;\n  socklen_t sa_len = sizeof(usa);\n  MG_SOCKET_TYPE fd = raccept(FD(lsn), &usa, &sa_len);\n  if (fd == MG_INVALID_SOCKET) {\n#if MG_ARCH == MG_ARCH_THREADX || defined(__ECOS)\n    // NetxDuo, in non-block socket mode can mark listening socket readable\n    // even it is not. See comment for 'select' func implementation in\n    // nx_bsd.c That's not an error, just should try later\n    if (errno != EAGAIN)\n#endif\n      MG_ERROR((\"%lu accept failed, errno %d\", lsn->id, MG_SOCK_ERR(-1)));\n#if (MG_ARCH != MG_ARCH_WIN32) && !MG_ENABLE_FREERTOS_TCP && \\\n    (MG_ARCH != MG_ARCH_TIRTOS) && !MG_ENABLE_POLL && !MG_ENABLE_EPOLL\n  } else if ((long) fd >= FD_SETSIZE) {\n    MG_ERROR((\"%ld > %ld\", (long) fd, (long) FD_SETSIZE));\n    closesocket(fd);\n#endif\n  } else if ((c = mg_alloc_conn(mgr)) == NULL) {\n    MG_ERROR((\"%lu OOM\", lsn->id));\n    closesocket(fd);\n  } else {\n    tomgaddr(&usa, &c->rem, sa_len != sizeof(usa.sin));\n    LIST_ADD_HEAD(struct mg_connection, &mgr->conns, c);\n    c->fd = S2PTR(fd);\n    MG_EPOLL_ADD(c);\n    mg_set_non_blocking_mode(FD(c));\n    setsockopts(c);\n    c->is_accepted = 1;\n    c->is_hexdumping = lsn->is_hexdumping;\n    setlocaddr(fd, &c->loc); // set local addr to where the client connected to\n    c->pfn = lsn->pfn;\n    c->pfn_data = lsn->pfn_data;\n    c->fn = lsn->fn;\n    c->fn_data = lsn->fn_data;\n    c->is_tls = lsn->is_tls;\n    MG_DEBUG((\"%lu %ld accepted %M -> %M\", c->id, c->fd, mg_print_ip_port,\n              &c->rem, mg_print_ip_port, &c->loc));\n    mg_call(c, MG_EV_OPEN, NULL);\n    mg_call(c, MG_EV_ACCEPT, NULL);\n    if (!c->is_tls_hs) c->is_tls = 0;  // user did not call mg_tls_init()\n  }\n}\n\nstatic bool can_read(const struct mg_connection *c) {\n  return c->is_full == false;\n}\n\nstatic bool can_write(const struct mg_connection *c) {\n  return c->is_connecting || (c->send.len > 0 && c->is_tls_hs == 0);\n}\n\nstatic bool skip_iotest(const struct mg_connection *c) {\n  return (c->is_closing || c->is_resolving || FD(c) == MG_INVALID_SOCKET) ||\n         (can_read(c) == false && can_write(c) == false);\n}\n\nstatic void mg_iotest(struct mg_mgr *mgr, int ms) {\n#if MG_ENABLE_FREERTOS_TCP\n  struct mg_connection *c;\n  for (c = mgr->conns; c != NULL; c = c->next) {\n    c->is_readable = c->is_writable = 0;\n    if (skip_iotest(c)) continue;\n    if (can_read(c))\n      FreeRTOS_FD_SET(c->fd, mgr->ss, eSELECT_READ | eSELECT_EXCEPT);\n    if (can_write(c)) FreeRTOS_FD_SET(c->fd, mgr->ss, eSELECT_WRITE);\n    if (c->is_closing) ms = 1;\n  }\n  FreeRTOS_select(mgr->ss, pdMS_TO_TICKS(ms));\n  for (c = mgr->conns; c != NULL; c = c->next) {\n    EventBits_t bits = FreeRTOS_FD_ISSET(c->fd, mgr->ss);\n    c->is_readable = bits & (eSELECT_READ | eSELECT_EXCEPT) ? 1U : 0;\n    c->is_writable = bits & eSELECT_WRITE ? 1U : 0;\n    if (c->fd != MG_INVALID_SOCKET)\n      FreeRTOS_FD_CLR(c->fd, mgr->ss,\n                      eSELECT_READ | eSELECT_EXCEPT | eSELECT_WRITE);\n  }\n#elif MG_ENABLE_EPOLL\n  size_t max = 1;\n  for (struct mg_connection *c = mgr->conns; c != NULL; c = c->next) {\n    c->is_readable = c->is_writable = 0;\n    if (c->rtls.len > 0 || mg_tls_pending(c) > 0) ms = 1, c->is_readable = 1;\n    if (can_write(c)) MG_EPOLL_MOD(c, 1);\n    if (c->is_closing) ms = 1;\n    max++;\n  }\n  struct epoll_event *evs = (struct epoll_event *) alloca(max * sizeof(evs[0]));\n  int n = epoll_wait(mgr->epoll_fd, evs, (int) max, ms);\n  for (int i = 0; i < n; i++) {\n    struct mg_connection *c = (struct mg_connection *) evs[i].data.ptr;\n    if (evs[i].events & EPOLLERR) {\n      mg_error(c, \"socket error\");\n    } else if (c->is_readable == 0) {\n      bool rd = evs[i].events & (EPOLLIN | EPOLLHUP);\n      bool wr = evs[i].events & EPOLLOUT;\n      c->is_readable = can_read(c) && rd ? 1U : 0;\n      c->is_writable = can_write(c) && wr ? 1U : 0;\n      if (c->rtls.len > 0 || mg_tls_pending(c) > 0) c->is_readable = 1;\n    }\n  }\n  (void) skip_iotest;\n#elif MG_ENABLE_POLL\n  nfds_t n = 0;\n  for (struct mg_connection *c = mgr->conns; c != NULL; c = c->next) n++;\n  struct pollfd *fds = (struct pollfd *) alloca(n * sizeof(fds[0]));\n  memset(fds, 0, n * sizeof(fds[0]));\n  n = 0;\n  for (struct mg_connection *c = mgr->conns; c != NULL; c = c->next) {\n    c->is_readable = c->is_writable = 0;\n    if (c->is_closing) ms = 1;\n    if (skip_iotest(c)) {\n      // Socket not valid, ignore\n    } else {\n      // Don't wait if TLS is ready\n      if (c->rtls.len > 0 || mg_tls_pending(c) > 0) ms = 1;\n      fds[n].fd = FD(c);\n      if (can_read(c)) fds[n].events |= POLLIN;\n      if (can_write(c)) fds[n].events |= POLLOUT;\n      n++;\n    }\n  }\n\n  // MG_INFO((\"poll n=%d ms=%d\", (int) n, ms));\n  if (poll(fds, n, ms) < 0) {\n#if MG_ARCH == MG_ARCH_WIN32\n    if (n == 0) Sleep(ms);  // On Windows, poll fails if no sockets\n#endif\n    memset(fds, 0, n * sizeof(fds[0]));\n  }\n  n = 0;\n  for (struct mg_connection *c = mgr->conns; c != NULL; c = c->next) {\n    if (skip_iotest(c)) {\n      // Socket not valid, ignore\n    } else {\n      if (fds[n].revents & POLLERR) {\n        mg_error(c, \"socket error\");\n      } else {\n        c->is_readable =\n            (unsigned) (fds[n].revents & (POLLIN | POLLHUP) ? 1 : 0);\n        c->is_writable = (unsigned) (fds[n].revents & POLLOUT ? 1 : 0);\n        if (c->rtls.len > 0 || mg_tls_pending(c) > 0) c->is_readable = 1;\n      }\n      n++;\n    }\n  }\n#else\n  struct timeval tv = {ms / 1000, (ms % 1000) * 1000}, tv_1ms = {0, 1000}, *tvp;\n  struct mg_connection *c;\n  fd_set rset, wset, eset;\n  MG_SOCKET_TYPE maxfd = 0;\n  int rc;\n\n  FD_ZERO(&rset);\n  FD_ZERO(&wset);\n  FD_ZERO(&eset);\n  tvp = ms < 0 ? NULL : &tv;\n  for (c = mgr->conns; c != NULL; c = c->next) {\n    c->is_readable = c->is_writable = 0;\n    if (skip_iotest(c)) continue;\n    FD_SET(FD(c), &eset);\n    if (can_read(c)) FD_SET(FD(c), &rset);\n    if (can_write(c)) FD_SET(FD(c), &wset);\n    if (c->rtls.len > 0 || mg_tls_pending(c) > 0) tvp = &tv_1ms;\n    if (FD(c) > maxfd) maxfd = FD(c);\n    if (c->is_closing) tvp = &tv_1ms;\n  }\n\n  if ((rc = select((int) maxfd + 1, &rset, &wset, &eset, tvp)) <= 0) {\n#if MG_ARCH == MG_ARCH_WIN32\n    if (maxfd == 0) Sleep(ms);  // On Windows, select fails if no sockets\n#else\n    if (rc < 0) MG_ERROR((\"select: %d %d\", rc, MG_SOCK_ERR(rc)));\n#endif\n    FD_ZERO(&rset);\n    FD_ZERO(&wset);\n    FD_ZERO(&eset);\n  }\n\n  for (c = mgr->conns; c != NULL; c = c->next) {\n    if (FD(c) != MG_INVALID_SOCKET && FD_ISSET(FD(c), &eset)) {\n#if MG_ARCH == MG_ARCH_THREADX\n      // NetxDuo stack returns exceptions for listening connection after accept\n      if (c->is_listening == 0) mg_error(c, \"socket error\");\n#else\n      mg_error(c, \"socket error\");\n#endif\n    } else {\n      c->is_readable = FD(c) != MG_INVALID_SOCKET && FD_ISSET(FD(c), &rset);\n      c->is_writable = FD(c) != MG_INVALID_SOCKET && FD_ISSET(FD(c), &wset);\n      if (c->rtls.len > 0 || mg_tls_pending(c) > 0) c->is_readable = 1;\n    }\n  }\n#endif\n}\n\nstatic bool mg_socketpair(MG_SOCKET_TYPE sp[2], union usa usa[2]) {\n  socklen_t n = sizeof(usa[0].sin);\n  bool success = false;\n\n  sp[0] = sp[1] = MG_INVALID_SOCKET;\n  (void) memset(&usa[0], 0, sizeof(usa[0]));\n  usa[0].sin.sin_family = AF_INET;\n  *(uint32_t *) &usa->sin.sin_addr = mg_htonl(0x7f000001U);  // 127.0.0.1\n  usa[1] = usa[0];\n\n  if ((sp[0] = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) != MG_INVALID_SOCKET &&\n      (sp[1] = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) != MG_INVALID_SOCKET &&\n      bind(sp[0], &usa[0].sa, n) == 0 &&          //\n      bind(sp[1], &usa[1].sa, n) == 0 &&          //\n      getsockname(sp[0], &usa[0].sa, &n) == 0 &&  //\n      getsockname(sp[1], &usa[1].sa, &n) == 0 &&  //\n      connect(sp[0], &usa[1].sa, n) == 0 &&       //\n      connect(sp[1], &usa[0].sa, n) == 0) {       //\n    success = true;\n  }\n  if (!success) {\n    if (sp[0] != MG_INVALID_SOCKET) closesocket(sp[0]);\n    if (sp[1] != MG_INVALID_SOCKET) closesocket(sp[1]);\n    sp[0] = sp[1] = MG_INVALID_SOCKET;\n  }\n  return success;\n}\n\n// mg_wakeup() event handler\nstatic void wufn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_READ) {\n    unsigned long *id = (unsigned long *) c->recv.buf;\n    // MG_INFO((\"Got data\"));\n    // mg_hexdump(c->recv.buf, c->recv.len);\n    if (c->recv.len >= sizeof(*id)) {\n      struct mg_connection *t;\n      for (t = c->mgr->conns; t != NULL; t = t->next) {\n        if (t->id == *id) {\n          struct mg_str data = mg_str_n((char *) c->recv.buf + sizeof(*id),\n                                        c->recv.len - sizeof(*id));\n          mg_call(t, MG_EV_WAKEUP, &data);\n        }\n      }\n    }\n    c->recv.len = 0;  // Consume received data\n  } else if (ev == MG_EV_CLOSE) {\n    closesocket(c->mgr->pipe);         // When we're closing, close the other\n    c->mgr->pipe = MG_INVALID_SOCKET;  // side of the socketpair, too\n  }\n  (void) ev_data;\n}\n\nbool mg_wakeup_init(struct mg_mgr *mgr) {\n  bool ok = false;\n  if (mgr->pipe == MG_INVALID_SOCKET) {\n    union usa usa[2];\n    MG_SOCKET_TYPE sp[2] = {MG_INVALID_SOCKET, MG_INVALID_SOCKET};\n    struct mg_connection *c = NULL;\n    if (!mg_socketpair(sp, usa)) {\n      MG_ERROR((\"Cannot create socket pair\"));\n    } else if ((c = mg_wrapfd(mgr, (int) sp[1], wufn, NULL)) == NULL) {\n      closesocket(sp[0]);\n      closesocket(sp[1]);\n      sp[0] = sp[1] = MG_INVALID_SOCKET;\n    } else {\n      tomgaddr(&usa[0], &c->rem, false);\n      MG_DEBUG((\"%lu %p pipe %lu\", c->id, c->fd, (unsigned long) sp[0]));\n      mgr->pipe = sp[0];\n      ok = true;\n    }\n  }\n  return ok;\n}\n\nbool mg_wakeup(struct mg_mgr *mgr, unsigned long conn_id, const void *buf,\n               size_t len) {\n  if (mgr->pipe != MG_INVALID_SOCKET && conn_id > 0) {\n    char *extended_buf = (char *) alloca(len + sizeof(conn_id));\n    memcpy(extended_buf, &conn_id, sizeof(conn_id));\n    memcpy(extended_buf + sizeof(conn_id), buf, len);\n    send(mgr->pipe, extended_buf, len + sizeof(conn_id), MSG_NONBLOCKING);\n    return true;\n  }\n  return false;\n}\n\nvoid mg_mgr_poll(struct mg_mgr *mgr, int ms) {\n  struct mg_connection *c, *tmp;\n  uint64_t now;\n\n  mg_iotest(mgr, ms);\n  now = mg_millis();\n  mg_timer_poll(&mgr->timers, now);\n\n  for (c = mgr->conns; c != NULL; c = tmp) {\n    bool is_resp = c->is_resp;\n    tmp = c->next;\n    mg_call(c, MG_EV_POLL, &now);\n    if (is_resp && !c->is_resp) {\n      long n = 0;\n      mg_call(c, MG_EV_READ, &n);\n    }\n    MG_VERBOSE((\"%lu %c%c %c%c%c%c%c %lu %lu\", c->id,\n                c->is_readable ? 'r' : '-', c->is_writable ? 'w' : '-',\n                c->is_tls ? 'T' : 't', c->is_connecting ? 'C' : 'c',\n                c->is_tls_hs ? 'H' : 'h', c->is_resolving ? 'R' : 'r',\n                c->is_closing ? 'C' : 'c', mg_tls_pending(c), c->rtls.len));\n    if (c->is_resolving || c->is_closing) {\n      // Do nothing\n    } else if (c->is_listening && c->is_udp == 0) {\n      if (c->is_readable) accept_conn(mgr, c);\n    } else if (c->is_connecting) {\n      if (c->is_readable || c->is_writable) connect_conn(c);\n    } else {\n      if (c->is_readable) read_conn(c);\n      if (c->is_writable) write_conn(c);\n      if (c->is_tls && !c->is_tls_hs && c->send.len == 0) mg_tls_flush(c);\n    }\n\n    if (c->is_draining && c->send.len == 0) c->is_closing = 1;\n    if (c->is_closing) close_conn(c);\n  }\n}\n#endif\n"
  },
  {
    "path": "src/ssi.c",
    "content": "#include \"ssi.h\"\n#include \"log.h\"\n#include \"printf.h\"\n#include \"util.h\"\n\n#ifndef MG_MAX_SSI_DEPTH\n#define MG_MAX_SSI_DEPTH 5\n#endif\n\n#ifndef MG_SSI_BUFSIZ\n#define MG_SSI_BUFSIZ 1024\n#endif\n\n#if MG_ENABLE_SSI\nstatic char *mg_ssi(const char *path, const char *root, int depth) {\n  struct mg_iobuf b = {NULL, 0, 0, MG_IO_SIZE};\n  FILE *fp = fopen(path, \"rb\");\n  if (fp != NULL) {\n    char buf[MG_SSI_BUFSIZ], arg[sizeof(buf)];\n    int ch, intag = 0;\n    size_t len = 0;\n    buf[0] = arg[0] = '\\0';\n    while ((ch = fgetc(fp)) != EOF) {\n      if (intag && ch == '>' && buf[len - 1] == '-' && buf[len - 2] == '-') {\n        buf[len++] = (char) (ch & 0xff);\n        buf[len] = '\\0';\n        if (sscanf(buf, \"<!--#include file=\\\"%[^\\\"]\", arg) > 0) {\n          char tmp[MG_PATH_MAX + MG_SSI_BUFSIZ + 10],\n              *p = (char *) path + strlen(path), *data;\n          while (p > path && p[-1] != MG_DIRSEP && p[-1] != '/') p--;\n          mg_snprintf(tmp, sizeof(tmp), \"%.*s%s\", (int) (p - path), path, arg);\n          if (depth < MG_MAX_SSI_DEPTH &&\n              (data = mg_ssi(tmp, root, depth + 1)) != NULL) {\n            size_t datalen = strlen(data);\n            size_t ret = mg_iobuf_add(&b, b.len, data, datalen);\n            mg_free(data);\n            if (datalen > 0 && ret == 0) goto fail;\n          } else {\n            MG_ERROR((\"%s: file=%s error or too deep\", path, arg));\n          } // TODO(): or OOM at recursive call\n        } else if (sscanf(buf, \"<!--#include virtual=\\\"%[^\\\"]\", arg) > 0) {\n          char tmp[MG_PATH_MAX + MG_SSI_BUFSIZ + 10], *data;\n          mg_snprintf(tmp, sizeof(tmp), \"%s%s\", root, arg);\n          if (depth < MG_MAX_SSI_DEPTH &&\n              (data = mg_ssi(tmp, root, depth + 1)) != NULL) {\n            size_t datalen = strlen(data);\n            size_t ret = mg_iobuf_add(&b, b.len, data, datalen);\n            mg_free(data);\n            if (datalen > 0 && ret == 0) goto fail;\n          } else {\n            MG_ERROR((\"%s: virtual=%s error or too deep\", path, arg));\n          } // TODO(): or OOM at recursive call\n        } else {\n          // Unknown SSI tag\n          MG_ERROR((\"Unknown SSI tag: %.*s\", (int) len, buf));\n          if (len > 0 && mg_iobuf_add(&b, b.len, buf, len) == 0) goto fail;\n        }\n        intag = 0;\n        len = 0;\n      } else if (ch == '<') {\n        intag = 1;\n        if (len > 0 && mg_iobuf_add(&b, b.len, buf, len) == 0) goto fail;\n        len = 0;\n        buf[len++] = (char) (ch & 0xff);\n      } else if (intag) {\n        if (len == 5 && strncmp(buf, \"<!--#\", 5) != 0) {\n          intag = 0;\n        } else if (len >= sizeof(buf) - 2) {\n          MG_ERROR((\"%s: SSI tag is too large\", path));\n          len = 0;\n        }\n        buf[len++] = (char) (ch & 0xff);\n      } else {\n        buf[len++] = (char) (ch & 0xff);\n        if (len >= sizeof(buf)) {\n          if (mg_iobuf_add(&b, b.len, buf, len) == 0) goto fail;\n          len = 0;\n        }\n      }\n    }\n    if (len > 0 && mg_iobuf_add(&b, b.len, buf, len) == 0) goto fail;\n    if (b.len > 0 && mg_iobuf_add(&b, b.len, \"\", 1) == 0)  // nul-terminate\n      goto fail;\n    fclose(fp);\n  }\n  (void) depth;\n  (void) root;\n  return (char *) b.buf;\n\nfail:\n  fclose(fp);\n  return NULL;\n}\n\nvoid mg_http_serve_ssi(struct mg_connection *c, const char *root,\n                       const char *fullpath) {\n  const char *headers = \"Content-Type: text/html; charset=utf-8\\r\\n\";\n  char *data = mg_ssi(fullpath, root, 0);\n  if (data == NULL) {\n    mg_error(c, \"OOM\");\n    return;\n  }\n  mg_http_reply(c, 200, headers, \"%s\", data == NULL ? \"\" : data);\n  mg_free(data);\n}\n#else\nvoid mg_http_serve_ssi(struct mg_connection *c, const char *root,\n                       const char *fullpath) {\n  mg_http_reply(c, 501, NULL, \"SSI not enabled\");\n  (void) root, (void) fullpath;\n}\n#endif\n"
  },
  {
    "path": "src/ssi.h",
    "content": "#pragma once\n#include \"http.h\"\nvoid mg_http_serve_ssi(struct mg_connection *c, const char *root,\n                       const char *fullpath);\n"
  },
  {
    "path": "src/str.c",
    "content": "#include \"str.h\"\n#include \"util.h\"\n\nstruct mg_str mg_str_s(const char *s) {\n  struct mg_str str;\n  str.buf = (char *) s, str.len = (s == NULL) ? 0 : strlen(s);\n  return str;\n}\n\nstruct mg_str mg_str_n(const char *s, size_t n) {\n  struct mg_str str;\n  str.buf = (char *) s, str.len = n;\n  return str;\n}\n\nstatic int mg_tolc(char c) {\n  return (c >= 'A' && c <= 'Z') ? c + 'a' - 'A' : c;\n}\n\nint mg_casecmp(const char *s1, const char *s2) {\n  int diff = 0;\n  do {\n    int c = mg_tolc(*s1++), d = mg_tolc(*s2++);\n    diff = c - d;\n  } while (diff == 0 && s1[-1] != '\\0');\n  return diff;\n}\n\nstruct mg_str mg_strdup(const struct mg_str s) {\n  struct mg_str r = {NULL, 0};\n  if (s.len > 0 && s.buf != NULL) {\n    char *sc = (char *) mg_calloc(1, s.len + 1);\n    if (sc != NULL) {\n      memcpy(sc, s.buf, s.len);\n      sc[s.len] = '\\0';\n      r.buf = sc;\n      r.len = s.len;\n    }\n  }\n  return r;\n}\n\nint mg_strcmp(const struct mg_str str1, const struct mg_str str2) {\n  size_t i = 0;\n  while (i < str1.len && i < str2.len) {\n    int c1 = str1.buf[i];\n    int c2 = str2.buf[i];\n    if (c1 < c2) return -1;\n    if (c1 > c2) return 1;\n    i++;\n  }\n  if (i < str1.len) return 1;\n  if (i < str2.len) return -1;\n  return 0;\n}\n\nint mg_strcasecmp(const struct mg_str str1, const struct mg_str str2) {\n  size_t i = 0;\n  while (i < str1.len && i < str2.len) {\n    int c1 = mg_tolc(str1.buf[i]);\n    int c2 = mg_tolc(str2.buf[i]);\n    if (c1 < c2) return -1;\n    if (c1 > c2) return 1;\n    i++;\n  }\n  if (i < str1.len) return 1;\n  if (i < str2.len) return -1;\n  return 0;\n}\n\nbool mg_match(struct mg_str s, struct mg_str p, struct mg_str *caps) {\n  size_t i = 0, j = 0, ni = 0, nj = 0;\n  if (caps) caps->buf = NULL, caps->len = 0;\n  while (i < p.len || j < s.len) {\n    if (i < p.len && j < s.len &&\n        (p.buf[i] == '?' ||\n         (p.buf[i] != '*' && p.buf[i] != '#' && s.buf[j] == p.buf[i]))) {\n      if (caps == NULL) {\n      } else if (p.buf[i] == '?') {\n        caps->buf = &s.buf[j], caps->len = 1;     // Finalize `?` cap\n        caps++, caps->buf = NULL, caps->len = 0;  // Init next cap\n      } else if (caps->buf != NULL && caps->len == 0) {\n        caps->len = (size_t) (&s.buf[j] - caps->buf);  // Finalize current cap\n        caps++, caps->len = 0, caps->buf = NULL;       // Init next cap\n      }\n      i++, j++;\n    } else if (i < p.len && (p.buf[i] == '*' || p.buf[i] == '#')) {\n      if (caps && !caps->buf) caps->len = 0, caps->buf = &s.buf[j];  // Init cap\n      ni = i++, nj = j + 1;\n    } else if (nj > 0 && nj <= s.len && ((ni < p.len && p.buf[ni] == '#') || s.buf[j] != '/')) {\n      i = ni, j = nj;\n      if (caps && caps->buf == NULL && caps->len == 0) {\n        caps--, caps->len = 0;  // Restart previous cap\n      }\n    } else {\n      return false;\n    }\n  }\n  if (caps && caps->buf && caps->len == 0) {\n    caps->len = (size_t) (&s.buf[j] - caps->buf);\n  }\n  return true;\n}\n\nbool mg_span(struct mg_str s, struct mg_str *a, struct mg_str *b, char sep) {\n  if (s.len == 0 || s.buf == NULL) {\n    return false;  // Empty string, nothing to span - fail\n  } else {\n    size_t len = 0;\n    while (len < s.len && s.buf[len] != sep) len++;  // Find separator\n    if (a) *a = mg_str_n(s.buf, len);                // Init a\n    if (b) *b = mg_str_n(s.buf + len, s.len - len);  // Init b\n    if (b && len < s.len) b->buf++, b->len--;        // Skip separator\n    return true;\n  }\n}\n\nbool mg_str_to_num(struct mg_str str, int base, void *val, size_t val_len) {\n  size_t i = 0, ndigits = 0;\n  uint64_t max = val_len == sizeof(uint8_t)    ? 0xFF\n                 : val_len == sizeof(uint16_t) ? 0xFFFF\n                 : val_len == sizeof(uint32_t) ? 0xFFFFFFFF\n                                               : (uint64_t) ~0;\n  uint64_t result = 0;\n  if (max == (uint64_t) ~0 && val_len != sizeof(uint64_t)) return false;\n  if (base == 0 && str.len >= 2) {\n    if (str.buf[i] == '0') {\n      i++;\n      base = str.buf[i] == 'b' ? 2 : str.buf[i] == 'x' ? 16 : 10;\n      if (base != 10) ++i;\n    } else {\n      base = 10;\n    }\n  }\n  switch (base) {\n    case 2:\n      while (i < str.len && (str.buf[i] == '0' || str.buf[i] == '1')) {\n        uint64_t digit = (uint64_t) (str.buf[i] - '0');\n        if (result > max / 2) return false;  // Overflow\n        result *= 2;\n        if (result > max - digit) return false;  // Overflow\n        result += digit;\n        i++, ndigits++;\n      }\n      break;\n    case 10:\n      while (i < str.len && str.buf[i] >= '0' && str.buf[i] <= '9') {\n        uint64_t digit = (uint64_t) (str.buf[i] - '0');\n        if (result > max / 10) return false;  // Overflow\n        result *= 10;\n        if (result > max - digit) return false;  // Overflow\n        result += digit;\n        i++, ndigits++;\n      }\n      break;\n    case 16:\n      while (i < str.len) {\n        char c = str.buf[i];\n        uint64_t digit = (c >= '0' && c <= '9')   ? (uint64_t) (c - '0')\n                         : (c >= 'A' && c <= 'F') ? (uint64_t) (c - '7')\n                         : (c >= 'a' && c <= 'f') ? (uint64_t) (c - 'W')\n                                                  : (uint64_t) ~0;\n        if (digit == (uint64_t) ~0) break;\n        if (result > max / 16) return false;  // Overflow\n        result *= 16;\n        if (result > max - digit) return false;  // Overflow\n        result += digit;\n        i++, ndigits++;\n      }\n      break;\n    default:\n      return false;\n  }\n  if (ndigits == 0) return false;\n  if (i != str.len) return false;\n  if (val_len == 1) {\n    *((uint8_t *) val) = (uint8_t) result;\n  } else if (val_len == 2) {\n    *((uint16_t *) val) = (uint16_t) result;\n  } else if (val_len == 4) {\n    *((uint32_t *) val) = (uint32_t) result;\n  } else {\n    *((uint64_t *) val) = (uint64_t) result;\n  }\n  return true;\n}\n"
  },
  {
    "path": "src/str.h",
    "content": "#pragma once\n\n#include \"arch.h\"\n\n// Describes an arbitrary chunk of memory\nstruct mg_str {\n  char *buf;   // String data\n  size_t len;  // String length\n};\n\n// Using macro to avoid shadowing C++ struct constructor, see #1298\n#define mg_str(s) mg_str_s(s)\n\nstruct mg_str mg_str(const char *s);\nstruct mg_str mg_str_n(const char *s, size_t n);\nint mg_casecmp(const char *s1, const char *s2);\nint mg_strcmp(const struct mg_str str1, const struct mg_str str2);\nint mg_strcasecmp(const struct mg_str str1, const struct mg_str str2);\nstruct mg_str mg_strdup(const struct mg_str s);\nbool mg_match(struct mg_str str, struct mg_str pattern, struct mg_str *caps);\nbool mg_span(struct mg_str s, struct mg_str *a, struct mg_str *b, char delim);\n\nbool mg_str_to_num(struct mg_str, int base, void *val, size_t val_len);\n"
  },
  {
    "path": "src/timer.c",
    "content": "#include \"arch.h\"\n#include \"timer.h\"\n#include \"util.h\"\n\nvoid mg_timer_init(struct mg_timer **head, struct mg_timer *t, uint64_t ms,\n                   unsigned flags, void (*fn)(void *), void *arg) {\n  t->period_ms = ms, t->expire = 0;\n  t->flags = flags, t->fn = fn, t->arg = arg, t->next = *head;\n  *head = t;\n}\n\nvoid mg_timer_free(struct mg_timer **head, struct mg_timer *t) {\n  while (*head && *head != t) head = &(*head)->next;\n  if (*head) *head = t->next;\n}\n\n// t: expiration time, prd: period, now: current time. Return true if expired\nbool mg_timer_expired(uint64_t *t, uint64_t prd, uint64_t now) {\n  if (now + prd < *t) *t = 0;                    // Time wrapped? Reset timer\n  if (*t == 0) *t = now + prd;                   // Firt poll? Set expiration\n  if (*t > now) return false;                    // Not expired yet, return\n  *t = (now - *t) > prd ? now + prd : *t + prd;  // Next expiration time\n  return true;                                   // Expired, return true\n}\n\nvoid mg_timer_poll(struct mg_timer **head, uint64_t now_ms) {\n  struct mg_timer *t, *tmp;\n  for (t = *head; t != NULL; t = tmp) {\n    bool once = t->expire == 0 && (t->flags & MG_TIMER_RUN_NOW) &&\n                !(t->flags & MG_TIMER_CALLED);  // Handle MG_TIMER_NOW only once\n    bool expired = mg_timer_expired(&t->expire, t->period_ms, now_ms);\n    tmp = t->next;\n    if (!once && !expired) continue;\n    if ((t->flags & MG_TIMER_REPEAT) || !(t->flags & MG_TIMER_CALLED)) {\n      t->fn(t->arg);\n    }\n    t->flags |= MG_TIMER_CALLED;\n\n    // If this timer is not repeating and marked AUTODELETE, remove it\n    if (!(t->flags & MG_TIMER_REPEAT) && (t->flags & MG_TIMER_AUTODELETE)) {\n      mg_timer_free(head, t);\n      mg_free(t);\n    }\n  }\n}\n"
  },
  {
    "path": "src/timer.h",
    "content": "#pragma once\n\n#include \"arch.h\"\n\nstruct mg_timer {\n  uint64_t period_ms;          // Timer period in milliseconds\n  uint64_t expire;             // Expiration timestamp in milliseconds\n  unsigned flags;              // Possible flags values below\n#define MG_TIMER_ONCE 0        // Call function once\n#define MG_TIMER_REPEAT 1      // Call function periodically\n#define MG_TIMER_RUN_NOW 2     // Call immediately when timer is set\n#define MG_TIMER_CALLED 4      // Timer function was called at least once\n#define MG_TIMER_AUTODELETE 8  // mg_free() timer when done\n  void (*fn)(void *);          // Function to call\n  void *arg;                   // Function argument\n  struct mg_timer *next;       // Linkage\n};\n\nvoid mg_timer_init(struct mg_timer **head, struct mg_timer *timer,\n                   uint64_t milliseconds, unsigned flags, void (*fn)(void *),\n                   void *arg);\nvoid mg_timer_free(struct mg_timer **head, struct mg_timer *);\nvoid mg_timer_poll(struct mg_timer **head, uint64_t new_ms);\nbool mg_timer_expired(uint64_t *expiration, uint64_t period, uint64_t now);\n"
  },
  {
    "path": "src/tls.h",
    "content": "#pragma once\n\n#define MG_TLS_NONE 0     // No TLS support\n#define MG_TLS_MBED 1     // mbedTLS\n#define MG_TLS_OPENSSL 2  // OpenSSL\n#define MG_TLS_WOLFSSL 5  // WolfSSL (based on OpenSSL)\n#define MG_TLS_BUILTIN 3  // Built-in\n#define MG_TLS_CUSTOM 4   // Custom implementation\n\n#ifndef MG_TLS\n#define MG_TLS MG_TLS_NONE\n#endif\n\n#include \"net.h\"\n#include \"tls_mbed.h\"\n#include \"tls_openssl.h\"\n\nstruct mg_tls_opts {\n  struct mg_str ca;       // PEM or DER\n  struct mg_str cert;     // PEM or DER\n  struct mg_str key;      // PEM or DER\n  struct mg_str name;     // If not empty, enable host name verification\n  int skip_verification;  // Skip certificate and host name verification\n};\n\nvoid mg_tls_init(struct mg_connection *, const struct mg_tls_opts *opts);\nvoid mg_tls_free(struct mg_connection *);\nlong mg_tls_send(struct mg_connection *, const void *buf, size_t len);\nlong mg_tls_recv(struct mg_connection *, void *buf, size_t len);\nsize_t mg_tls_pending(struct mg_connection *);\nvoid mg_tls_flush(struct mg_connection *);\nvoid mg_tls_handshake(struct mg_connection *);\n\n// Private\nvoid mg_tls_ctx_init(struct mg_mgr *);\nvoid mg_tls_ctx_free(struct mg_mgr *);\n#define MG_IS_DER(buf) (((uint8_t *) (buf))[0] == 0x30)  // DER begins with 0x30\n\n// Low-level IO primives used by TLS layer\nenum { MG_IO_ERR = -1, MG_IO_WAIT = -2, MG_IO_RESET = -3 };\nlong mg_io_send(struct mg_connection *c, const void *buf, size_t len);\nlong mg_io_recv(struct mg_connection *c, void *buf, size_t len);\n"
  },
  {
    "path": "src/tls_aes128.c",
    "content": "/******************************************************************************\n *\n * THIS SOURCE CODE IS HEREBY PLACED INTO THE PUBLIC DOMAIN FOR THE GOOD OF ALL\n *\n * This is a simple and straightforward implementation of the AES Rijndael\n * 128-bit block cipher designed by Vincent Rijmen and Joan Daemen. The focus\n * of this work was correctness & accuracy.  It is written in 'C' without any\n * particular focus upon optimization or speed. It should be endian (memory\n * byte order) neutral since the few places that care are handled explicitly.\n *\n * This implementation of Rijndael was created by Steven M. Gibson of GRC.com.\n *\n * It is intended for general purpose use, but was written in support of GRC's\n * reference implementation of the SQRL (Secure Quick Reliable Login) client.\n *\n * See:    http://csrc.nist.gov/archive/aes/rijndael/wsdindex.html\n *\n * NO COPYRIGHT IS CLAIMED IN THIS WORK, HOWEVER, NEITHER IS ANY WARRANTY MADE\n * REGARDING ITS FITNESS FOR ANY PARTICULAR PURPOSE. USE IT AT YOUR OWN RISK.\n *\n *******************************************************************************/\n\n#include \"arch.h\"\n#include \"tls.h\"\n#if MG_TLS == MG_TLS_BUILTIN\n/******************************************************************************/\n#define AES_DECRYPTION 1  // whether AES decryption is supported\n/******************************************************************************/\n\n#define MG_ENCRYPT 1  // specify whether we're encrypting\n#define MG_DECRYPT 0  // or decrypting\n\n#include \"tls_aes128.h\"\n\n/******************************************************************************\n *  AES_INIT_KEYGEN_TABLES : MUST be called once before any AES use\n ******************************************************************************/\nstatic void aes_init_keygen_tables(void);\n\n/******************************************************************************\n *  AES_SETKEY : called to expand the key for encryption or decryption\n ******************************************************************************/\nstatic int aes_setkey(aes_context *ctx,  // pointer to context\n                      int mode,          // 1 or 0 for Encrypt/Decrypt\n                      const unsigned char *key,  // AES input key\n                      unsigned int keysize);  // size in bytes (must be 16, 24, 32 for\n                                      // 128, 192 or 256-bit keys respectively)\n                                      // returns 0 for success\n\n/******************************************************************************\n *  AES_CIPHER : called to encrypt or decrypt ONE 128-bit block of data\n ******************************************************************************/\nstatic int aes_cipher(aes_context *ctx,       // pointer to context\n                      const unsigned char input[16],  // 128-bit block to en/decipher\n                      unsigned char output[16]);      // 128-bit output result block\n                                              // returns 0 for success\n\n/******************************************************************************\n *  GCM_CONTEXT : GCM context / holds keytables, instance data, and AES ctx\n ******************************************************************************/\ntypedef struct {\n  int mode;             // cipher direction: encrypt/decrypt\n  uint64_t len;         // cipher data length processed so far\n  uint64_t add_len;     // total add data length\n  uint64_t HL[16];      // precalculated lo-half HTable\n  uint64_t HH[16];      // precalculated hi-half HTable\n  unsigned char base_ectr[16];  // first counter-mode cipher output for tag\n  unsigned char y[16];          // the current cipher-input IV|Counter value\n  unsigned char buf[16];        // buf working value\n  aes_context aes_ctx;  // cipher context used\n} gcm_context;\n\n/******************************************************************************\n *  GCM_SETKEY : sets the GCM (and AES) keying material for use\n ******************************************************************************/\nstatic int gcm_setkey(\n    gcm_context *ctx,   // caller-provided context ptr\n    const unsigned char *key,   // pointer to cipher key\n    const unsigned int keysize  // size in bytes (must be 16, 24, 32 for\n                        // 128, 192 or 256-bit keys respectively)\n);                      // returns 0 for success\n\n/******************************************************************************\n *\n *  GCM_CRYPT_AND_TAG\n *\n *  This either encrypts or decrypts the user-provided data and, either\n *  way, generates an authentication tag of the requested length. It must be\n *  called with a GCM context whose key has already been set with GCM_SETKEY.\n *\n *  The user would typically call this explicitly to ENCRYPT a buffer of data\n *  and optional associated data, and produce its an authentication tag.\n *\n *  To reverse the process the user would typically call the companion\n *  GCM_AUTH_DECRYPT function to decrypt data and verify a user-provided\n *  authentication tag.  The GCM_AUTH_DECRYPT function calls this function\n *  to perform its decryption and tag generation, which it then compares.\n *\n ******************************************************************************/\nstatic int gcm_crypt_and_tag(\n    gcm_context *ctx,    // gcm context with key already setup\n    int mode,            // cipher direction: MG_ENCRYPT (1) or MG_DECRYPT (0)\n    const unsigned char *iv,     // pointer to the 12-byte initialization vector\n    size_t iv_len,       // byte length if the IV. should always be 12\n    const unsigned char *add,    // pointer to the non-ciphered additional data\n    size_t add_len,      // byte length of the additional AEAD data\n    const unsigned char *input,  // pointer to the cipher data source\n    unsigned char *output,       // pointer to the cipher data destination\n    size_t length,       // byte length of the cipher data\n    unsigned char *tag,          // pointer to the tag to be generated\n    size_t tag_len);     // byte length of the tag to be generated\n\n/******************************************************************************\n *\n *  GCM_START\n *\n *  Given a user-provided GCM context, this initializes it, sets the encryption\n *  mode, and preprocesses the initialization vector and additional AEAD data.\n *\n ******************************************************************************/\nstatic int gcm_start(\n    gcm_context *ctx,  // pointer to user-provided GCM context\n    int mode,          // MG_ENCRYPT (1) or MG_DECRYPT (0)\n    const unsigned char *iv,   // pointer to initialization vector\n    size_t iv_len,     // IV length in bytes (should == 12)\n    const unsigned char *add,  // pointer to additional AEAD data (NULL if none)\n    size_t add_len);   // length of additional AEAD data (bytes)\n\n/******************************************************************************\n *\n *  GCM_UPDATE\n *\n *  This is called once or more to process bulk plaintext or ciphertext data.\n *  We give this some number of bytes of input and it returns the same number\n *  of output bytes. If called multiple times (which is fine) all but the final\n *  invocation MUST be called with length mod 16 == 0. (Only the final call can\n *  have a partial block length of < 128 bits.)\n *\n ******************************************************************************/\nstatic int gcm_update(gcm_context *ctx,  // pointer to user-provided GCM context\n                      size_t length,     // length, in bytes, of data to process\n                      const unsigned char *input,  // pointer to source data\n                      unsigned char *output);      // pointer to destination data\n\n/******************************************************************************\n *\n *  GCM_FINISH\n *\n *  This is called once after all calls to GCM_UPDATE to finalize the GCM.\n *  It performs the final GHASH to produce the resulting authentication TAG.\n *\n ******************************************************************************/\nstatic int gcm_finish(\n    gcm_context *ctx,  // pointer to user-provided GCM context\n    unsigned char *tag,        // ptr to tag buffer - NULL if tag_len = 0\n    size_t tag_len);   // length, in bytes, of the tag-receiving buf\n\n/******************************************************************************\n *\n *  GCM_ZERO_CTX\n *\n *  The GCM context contains both the GCM context and the AES context.\n *  This includes keying and key-related material which is security-\n *  sensitive, so it MUST be zeroed after use. This function does that.\n *\n ******************************************************************************/\nstatic void gcm_zero_ctx(gcm_context *ctx);\n\n/******************************************************************************\n *\n * THIS SOURCE CODE IS HEREBY PLACED INTO THE PUBLIC DOMAIN FOR THE GOOD OF ALL\n *\n * This is a simple and straightforward implementation of the AES Rijndael\n * 128-bit block cipher designed by Vincent Rijmen and Joan Daemen. The focus\n * of this work was correctness & accuracy.  It is written in 'C' without any\n * particular focus upon optimization or speed. It should be endian (memory\n * byte order) neutral since the few places that care are handled explicitly.\n *\n * This implementation of Rijndael was created by Steven M. Gibson of GRC.com.\n *\n * It is intended for general purpose use, but was written in support of GRC's\n * reference implementation of the SQRL (Secure Quick Reliable Login) client.\n *\n * See:    http://csrc.nist.gov/archive/aes/rijndael/wsdindex.html\n *\n * NO COPYRIGHT IS CLAIMED IN THIS WORK, HOWEVER, NEITHER IS ANY WARRANTY MADE\n * REGARDING ITS FITNESS FOR ANY PARTICULAR PURPOSE. USE IT AT YOUR OWN RISK.\n *\n *******************************************************************************/\n\nstatic int aes_tables_inited = 0;  // run-once flag for performing key\n                                   // expasion table generation (see below)\n/*\n *  The following static local tables must be filled-in before the first use of\n *  the GCM or AES ciphers. They are used for the AES key expansion/scheduling\n *  and once built are read-only and thread safe. The \"gcm_initialize\" function\n *  must be called once during system initialization to populate these arrays\n *  for subsequent use by the AES key scheduler. If they have not been built\n *  before attempted use, an error will be returned to the caller.\n *\n *  NOTE: GCM Encryption/Decryption does NOT REQUIRE AES decryption. Since\n *  GCM uses AES in counter-mode, where the AES cipher output is XORed with\n *  the GCM input, we ONLY NEED AES encryption.  Thus, to save space AES\n *  decryption is typically disabled by setting AES_DECRYPTION to 0 in aes.h.\n */\n// We always need our forward tables\nstatic unsigned char FSb[256];     // Forward substitution box (FSb)\nstatic uint32_t FT0[256];  // Forward key schedule assembly tables\nstatic uint32_t FT1[256];\nstatic uint32_t FT2[256];\nstatic uint32_t FT3[256];\n\n#if AES_DECRYPTION         // We ONLY need reverse for decryption\nstatic unsigned char RSb[256];     // Reverse substitution box (RSb)\nstatic uint32_t RT0[256];  // Reverse key schedule assembly tables\nstatic uint32_t RT1[256];\nstatic uint32_t RT2[256];\nstatic uint32_t RT3[256];\n#endif /* AES_DECRYPTION */\n\nstatic uint32_t RCON[10];  // AES round constants\n\n/*\n * Platform Endianness Neutralizing Load and Store Macro definitions\n * AES wants platform-neutral Little Endian (LE) byte ordering\n */\n#define GET_UINT32_LE(n, b, i)                                               \\\n  {                                                                          \\\n    (n) = ((uint32_t) (b)[(i)]) | ((uint32_t) (b)[(i) + 1] << 8) |           \\\n          ((uint32_t) (b)[(i) + 2] << 16) | ((uint32_t) (b)[(i) + 3] << 24); \\\n  }\n\n#define PUT_UINT32_LE(n, b, i)          \\\n  {                                     \\\n    (b)[(i)] = (unsigned char) ((n));           \\\n    (b)[(i) + 1] = (unsigned char) ((n) >> 8);  \\\n    (b)[(i) + 2] = (unsigned char) ((n) >> 16); \\\n    (b)[(i) + 3] = (unsigned char) ((n) >> 24); \\\n  }\n\n/*\n *  AES forward and reverse encryption round processing macros\n */\n#define AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3)          \\\n  {                                                         \\\n    X0 = *RK++ ^ FT0[(Y0) & 0xFF] ^ FT1[(Y1 >> 8) & 0xFF] ^ \\\n         FT2[(Y2 >> 16) & 0xFF] ^ FT3[(Y3 >> 24) & 0xFF];   \\\n                                                            \\\n    X1 = *RK++ ^ FT0[(Y1) & 0xFF] ^ FT1[(Y2 >> 8) & 0xFF] ^ \\\n         FT2[(Y3 >> 16) & 0xFF] ^ FT3[(Y0 >> 24) & 0xFF];   \\\n                                                            \\\n    X2 = *RK++ ^ FT0[(Y2) & 0xFF] ^ FT1[(Y3 >> 8) & 0xFF] ^ \\\n         FT2[(Y0 >> 16) & 0xFF] ^ FT3[(Y1 >> 24) & 0xFF];   \\\n                                                            \\\n    X3 = *RK++ ^ FT0[(Y3) & 0xFF] ^ FT1[(Y0 >> 8) & 0xFF] ^ \\\n         FT2[(Y1 >> 16) & 0xFF] ^ FT3[(Y2 >> 24) & 0xFF];   \\\n  }\n\n#define AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3)          \\\n  {                                                         \\\n    X0 = *RK++ ^ RT0[(Y0) & 0xFF] ^ RT1[(Y3 >> 8) & 0xFF] ^ \\\n         RT2[(Y2 >> 16) & 0xFF] ^ RT3[(Y1 >> 24) & 0xFF];   \\\n                                                            \\\n    X1 = *RK++ ^ RT0[(Y1) & 0xFF] ^ RT1[(Y0 >> 8) & 0xFF] ^ \\\n         RT2[(Y3 >> 16) & 0xFF] ^ RT3[(Y2 >> 24) & 0xFF];   \\\n                                                            \\\n    X2 = *RK++ ^ RT0[(Y2) & 0xFF] ^ RT1[(Y1 >> 8) & 0xFF] ^ \\\n         RT2[(Y0 >> 16) & 0xFF] ^ RT3[(Y3 >> 24) & 0xFF];   \\\n                                                            \\\n    X3 = *RK++ ^ RT0[(Y3) & 0xFF] ^ RT1[(Y2 >> 8) & 0xFF] ^ \\\n         RT2[(Y1 >> 16) & 0xFF] ^ RT3[(Y0 >> 24) & 0xFF];   \\\n  }\n\n/*\n *  These macros improve the readability of the key\n *  generation initialization code by collapsing\n *  repetitive common operations into logical pieces.\n */\n#define ROTL8(x) ((x << 8) & 0xFFFFFFFF) | (x >> 24)\n#define XTIME(x) ((x << 1) ^ ((x & 0x80) ? 0x1B : 0x00))\n#define MUL(x, y) ((x && y) ? pow[(log[x] + log[y]) % 255] : 0)\n#define MIX(x, y)                     \\\n  {                                   \\\n    y = ((y << 1) | (y >> 7)) & 0xFF; \\\n    x ^= y;                           \\\n  }\n#define CPY128     \\\n  {                \\\n    *RK++ = *SK++; \\\n    *RK++ = *SK++; \\\n    *RK++ = *SK++; \\\n    *RK++ = *SK++; \\\n  }\n\n/******************************************************************************\n *\n *  AES_INIT_KEYGEN_TABLES\n *\n *  Fills the AES key expansion tables allocated above with their static\n *  data. This is not \"per key\" data, but static system-wide read-only\n *  table data. THIS FUNCTION IS NOT THREAD SAFE. It must be called once\n *  at system initialization to setup the tables for all subsequent use.\n *\n ******************************************************************************/\nvoid aes_init_keygen_tables(void) {\n  int i, x, y, z;  // general purpose iteration and computation locals\n  int pow[256];\n  int log[256];\n\n  if (aes_tables_inited) return;\n\n  // fill the 'pow' and 'log' tables over GF(2^8)\n  for (i = 0, x = 1; i < 256; i++) {\n    pow[i] = x;\n    log[x] = i;\n    x = (x ^ XTIME(x)) & 0xFF;\n  }\n  // compute the round constants\n  for (i = 0, x = 1; i < 10; i++) {\n    RCON[i] = (uint32_t) x;\n    x = XTIME(x) & 0xFF;\n  }\n  // fill the forward and reverse substitution boxes\n  FSb[0x00] = 0x63;\n#if AES_DECRYPTION  // whether AES decryption is supported\n  RSb[0x63] = 0x00;\n#endif /* AES_DECRYPTION */\n\n  for (i = 1; i < 256; i++) {\n    x = y = pow[255 - log[i]];\n    MIX(x, y);\n    MIX(x, y);\n    MIX(x, y);\n    MIX(x, y);\n    FSb[i] = (unsigned char) (x ^= 0x63);\n#if AES_DECRYPTION  // whether AES decryption is supported\n    RSb[x] = (unsigned char) i;\n#endif /* AES_DECRYPTION */\n  }\n  // generate the forward and reverse key expansion tables\n  for (i = 0; i < 256; i++) {\n    x = FSb[i];\n    y = XTIME(x) & 0xFF;\n    z = (y ^ x) & 0xFF;\n\n    FT0[i] = ((uint32_t) y) ^ ((uint32_t) x << 8) ^ ((uint32_t) x << 16) ^\n             ((uint32_t) z << 24);\n\n    FT1[i] = ROTL8(FT0[i]);\n    FT2[i] = ROTL8(FT1[i]);\n    FT3[i] = ROTL8(FT2[i]);\n\n#if AES_DECRYPTION  // whether AES decryption is supported\n    x = RSb[i];\n\n    RT0[i] = ((uint32_t) MUL(0x0E, x)) ^ ((uint32_t) MUL(0x09, x) << 8) ^\n             ((uint32_t) MUL(0x0D, x) << 16) ^ ((uint32_t) MUL(0x0B, x) << 24);\n\n    RT1[i] = ROTL8(RT0[i]);\n    RT2[i] = ROTL8(RT1[i]);\n    RT3[i] = ROTL8(RT2[i]);\n#endif /* AES_DECRYPTION */\n  }\n  aes_tables_inited = 1;  // flag that the tables have been generated\n}  // to permit subsequent use of the AES cipher\n\n/******************************************************************************\n *\n *  AES_SET_ENCRYPTION_KEY\n *\n *  This is called by 'aes_setkey' when we're establishing a key for\n *  subsequent encryption.  We give it a pointer to the encryption\n *  context, a pointer to the key, and the key's length in bytes.\n *  Valid lengths are: 16, 24 or 32 bytes (128, 192, 256 bits).\n *\n ******************************************************************************/\nstatic int aes_set_encryption_key(aes_context *ctx, const unsigned char *key,\n                                  unsigned int keysize) {\n  unsigned int i;                  // general purpose iteration local\n  uint32_t *RK = ctx->rk;  // initialize our RoundKey buffer pointer\n\n  for (i = 0; i < (keysize >> 2); i++) {\n    GET_UINT32_LE(RK[i], key, i << 2);\n  }\n\n  switch (ctx->rounds) {\n    case 10:\n      for (i = 0; i < 10; i++, RK += 4) {\n        RK[4] = RK[0] ^ RCON[i] ^ ((uint32_t) FSb[(RK[3] >> 8) & 0xFF]) ^\n                ((uint32_t) FSb[(RK[3] >> 16) & 0xFF] << 8) ^\n                ((uint32_t) FSb[(RK[3] >> 24) & 0xFF] << 16) ^\n                ((uint32_t) FSb[(RK[3]) & 0xFF] << 24);\n\n        RK[5] = RK[1] ^ RK[4];\n        RK[6] = RK[2] ^ RK[5];\n        RK[7] = RK[3] ^ RK[6];\n      }\n      break;\n\n    case 12:\n      for (i = 0; i < 8; i++, RK += 6) {\n        RK[6] = RK[0] ^ RCON[i] ^ ((uint32_t) FSb[(RK[5] >> 8) & 0xFF]) ^\n                ((uint32_t) FSb[(RK[5] >> 16) & 0xFF] << 8) ^\n                ((uint32_t) FSb[(RK[5] >> 24) & 0xFF] << 16) ^\n                ((uint32_t) FSb[(RK[5]) & 0xFF] << 24);\n\n        RK[7] = RK[1] ^ RK[6];\n        RK[8] = RK[2] ^ RK[7];\n        RK[9] = RK[3] ^ RK[8];\n        RK[10] = RK[4] ^ RK[9];\n        RK[11] = RK[5] ^ RK[10];\n      }\n      break;\n\n    case 14:\n      for (i = 0; i < 7; i++, RK += 8) {\n        RK[8] = RK[0] ^ RCON[i] ^ ((uint32_t) FSb[(RK[7] >> 8) & 0xFF]) ^\n                ((uint32_t) FSb[(RK[7] >> 16) & 0xFF] << 8) ^\n                ((uint32_t) FSb[(RK[7] >> 24) & 0xFF] << 16) ^\n                ((uint32_t) FSb[(RK[7]) & 0xFF] << 24);\n\n        RK[9] = RK[1] ^ RK[8];\n        RK[10] = RK[2] ^ RK[9];\n        RK[11] = RK[3] ^ RK[10];\n\n        RK[12] = RK[4] ^ ((uint32_t) FSb[(RK[11]) & 0xFF]) ^\n                 ((uint32_t) FSb[(RK[11] >> 8) & 0xFF] << 8) ^\n                 ((uint32_t) FSb[(RK[11] >> 16) & 0xFF] << 16) ^\n                 ((uint32_t) FSb[(RK[11] >> 24) & 0xFF] << 24);\n\n        RK[13] = RK[5] ^ RK[12];\n        RK[14] = RK[6] ^ RK[13];\n        RK[15] = RK[7] ^ RK[14];\n      }\n      break;\n\n    default:\n      return -1;\n  }\n  return (0);\n}\n\n#if AES_DECRYPTION  // whether AES decryption is supported\n\n/******************************************************************************\n *\n *  AES_SET_DECRYPTION_KEY\n *\n *  This is called by 'aes_setkey' when we're establishing a\n *  key for subsequent decryption.  We give it a pointer to\n *  the encryption context, a pointer to the key, and the key's\n *  length in bits. Valid lengths are: 128, 192, or 256 bits.\n *\n ******************************************************************************/\nstatic int aes_set_decryption_key(aes_context *ctx, const unsigned char *key,\n                                  unsigned int keysize) {\n  int i, j;\n  aes_context cty;         // a calling aes context for set_encryption_key\n  uint32_t *RK = ctx->rk;  // initialize our RoundKey buffer pointer\n  uint32_t *SK;\n  int ret;\n\n  cty.rounds = ctx->rounds;  // initialize our local aes context\n  cty.rk = cty.buf;          // round count and key buf pointer\n\n  if ((ret = aes_set_encryption_key(&cty, key, keysize)) != 0) return (ret);\n\n  SK = cty.rk + cty.rounds * 4;\n\n  CPY128  // copy a 128-bit block from *SK to *RK\n\n      for (i = ctx->rounds - 1, SK -= 8; i > 0; i--, SK -= 8) {\n    for (j = 0; j < 4; j++, SK++) {\n      *RK++ = RT0[FSb[(*SK) & 0xFF]] ^ RT1[FSb[(*SK >> 8) & 0xFF]] ^\n              RT2[FSb[(*SK >> 16) & 0xFF]] ^ RT3[FSb[(*SK >> 24) & 0xFF]];\n    }\n  }\n  CPY128  // copy a 128-bit block from *SK to *RK\n      memset(&cty, 0, sizeof(aes_context));  // clear local aes context\n  return (0);\n}\n\n#endif /* AES_DECRYPTION */\n\n/******************************************************************************\n *\n *  AES_SETKEY\n *\n *  Invoked to establish the key schedule for subsequent encryption/decryption\n *\n ******************************************************************************/\nstatic int aes_setkey(aes_context *ctx,  // AES context provided by our caller\n                      int mode,          // ENCRYPT or DECRYPT flag\n                      const unsigned char *key,  // pointer to the key\n                      unsigned int keysize)      // key length in bytes\n{\n  // since table initialization is not thread safe, we could either add\n  // system-specific mutexes and init the AES key generation tables on\n  // demand, or ask the developer to simply call \"gcm_initialize\" once during\n  // application startup before threading begins. That's what we choose.\n  if (!aes_tables_inited) return (-1);  // fail the call when not inited.\n\n  ctx->mode = mode;    // capture the key type we're creating\n  ctx->rk = ctx->buf;  // initialize our round key pointer\n\n  switch (keysize)  // set the rounds count based upon the keysize\n  {\n    case 16:\n      ctx->rounds = 10;\n      break;  // 16-byte, 128-bit key\n    case 24:\n      ctx->rounds = 12;\n      break;  // 24-byte, 192-bit key\n    case 32:\n      ctx->rounds = 14;\n      break;  // 32-byte, 256-bit key\n    default:\n      return (-1);\n  }\n\n#if AES_DECRYPTION\n  if (mode == MG_DECRYPT)  // expand our key for encryption or decryption\n    return (aes_set_decryption_key(ctx, key, keysize));\n  else /* MG_ENCRYPT */\n#endif /* AES_DECRYPTION */\n    return (aes_set_encryption_key(ctx, key, keysize));\n}\n\n/******************************************************************************\n *\n *  AES_CIPHER\n *\n *  Perform AES encryption and decryption.\n *  The AES context will have been setup with the encryption mode\n *  and all keying information appropriate for the task.\n *\n ******************************************************************************/\nstatic int aes_cipher(aes_context *ctx, const unsigned char input[16],\n                      unsigned char output[16]) {\n  int i;\n  uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;  // general purpose locals\n\n  RK = ctx->rk;\n\n  GET_UINT32_LE(X0, input, 0);\n  X0 ^= *RK++;  // load our 128-bit\n  GET_UINT32_LE(X1, input, 4);\n  X1 ^= *RK++;  // input buffer in a storage\n  GET_UINT32_LE(X2, input, 8);\n  X2 ^= *RK++;  // memory endian-neutral way\n  GET_UINT32_LE(X3, input, 12);\n  X3 ^= *RK++;\n\n#if AES_DECRYPTION  // whether AES decryption is supported\n\n  if (ctx->mode == MG_DECRYPT) {\n    for (i = (ctx->rounds >> 1) - 1; i > 0; i--) {\n      AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3);\n      AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3);\n    }\n\n    AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3);\n\n    X0 = *RK++ ^ ((uint32_t) RSb[(Y0) & 0xFF]) ^\n         ((uint32_t) RSb[(Y3 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) RSb[(Y2 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) RSb[(Y1 >> 24) & 0xFF] << 24);\n\n    X1 = *RK++ ^ ((uint32_t) RSb[(Y1) & 0xFF]) ^\n         ((uint32_t) RSb[(Y0 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) RSb[(Y3 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) RSb[(Y2 >> 24) & 0xFF] << 24);\n\n    X2 = *RK++ ^ ((uint32_t) RSb[(Y2) & 0xFF]) ^\n         ((uint32_t) RSb[(Y1 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) RSb[(Y0 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) RSb[(Y3 >> 24) & 0xFF] << 24);\n\n    X3 = *RK++ ^ ((uint32_t) RSb[(Y3) & 0xFF]) ^\n         ((uint32_t) RSb[(Y2 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) RSb[(Y1 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) RSb[(Y0 >> 24) & 0xFF] << 24);\n  } else /* MG_ENCRYPT */\n  {\n#endif /* AES_DECRYPTION */\n\n    for (i = (ctx->rounds >> 1) - 1; i > 0; i--) {\n      AES_FROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3);\n      AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3);\n    }\n\n    AES_FROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3);\n\n    X0 = *RK++ ^ ((uint32_t) FSb[(Y0) & 0xFF]) ^\n         ((uint32_t) FSb[(Y1 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) FSb[(Y2 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) FSb[(Y3 >> 24) & 0xFF] << 24);\n\n    X1 = *RK++ ^ ((uint32_t) FSb[(Y1) & 0xFF]) ^\n         ((uint32_t) FSb[(Y2 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) FSb[(Y3 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) FSb[(Y0 >> 24) & 0xFF] << 24);\n\n    X2 = *RK++ ^ ((uint32_t) FSb[(Y2) & 0xFF]) ^\n         ((uint32_t) FSb[(Y3 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) FSb[(Y0 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) FSb[(Y1 >> 24) & 0xFF] << 24);\n\n    X3 = *RK++ ^ ((uint32_t) FSb[(Y3) & 0xFF]) ^\n         ((uint32_t) FSb[(Y0 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) FSb[(Y1 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) FSb[(Y2 >> 24) & 0xFF] << 24);\n\n#if AES_DECRYPTION  // whether AES decryption is supported\n  }\n#endif /* AES_DECRYPTION */\n\n  PUT_UINT32_LE(X0, output, 0);\n  PUT_UINT32_LE(X1, output, 4);\n  PUT_UINT32_LE(X2, output, 8);\n  PUT_UINT32_LE(X3, output, 12);\n\n  return (0);\n}\n/* end of aes.c */\n/******************************************************************************\n *\n * THIS SOURCE CODE IS HEREBY PLACED INTO THE PUBLIC DOMAIN FOR THE GOOD OF ALL\n *\n * This is a simple and straightforward implementation of AES-GCM authenticated\n * encryption. The focus of this work was correctness & accuracy. It is written\n * in straight 'C' without any particular focus upon optimization or speed. It\n * should be endian (memory byte order) neutral since the few places that care\n * are handled explicitly.\n *\n * This implementation of AES-GCM was created by Steven M. Gibson of GRC.com.\n *\n * It is intended for general purpose use, but was written in support of GRC's\n * reference implementation of the SQRL (Secure Quick Reliable Login) client.\n *\n * See:    http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf\n *         http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/\n *         gcm/gcm-revised-spec.pdf\n *\n * NO COPYRIGHT IS CLAIMED IN THIS WORK, HOWEVER, NEITHER IS ANY WARRANTY MADE\n * REGARDING ITS FITNESS FOR ANY PARTICULAR PURPOSE. USE IT AT YOUR OWN RISK.\n *\n *******************************************************************************/\n\n/******************************************************************************\n *                      ==== IMPLEMENTATION WARNING ====\n *\n *  This code was developed for use within SQRL's fixed environmnent. Thus, it\n *  is somewhat less \"general purpose\" than it would be if it were designed as\n *  a general purpose AES-GCM library. Specifically, it bothers with almost NO\n *  error checking on parameter limits, buffer bounds, etc. It assumes that it\n *  is being invoked by its author or by someone who understands the values it\n *  expects to receive. Its behavior will be undefined otherwise.\n *\n *  All functions that might fail are defined to return 'ints' to indicate a\n *  problem. Most do not do so now. But this allows for error propagation out\n *  of internal functions if robust error checking should ever be desired.\n *\n ******************************************************************************/\n\n/* Calculating the \"GHASH\"\n *\n * There are many ways of calculating the so-called GHASH in software, each with\n * a traditional size vs performance tradeoff.  The GHASH (Galois field hash) is\n * an intriguing construction which takes two 128-bit strings (also the cipher's\n * block size and the fundamental operation size for the system) and hashes them\n * into a third 128-bit result.\n *\n * Many implementation solutions have been worked out that use large precomputed\n * table lookups in place of more time consuming bit fiddling, and this approach\n * can be scaled easily upward or downward as needed to change the time/space\n * tradeoff. It's been studied extensively and there's a solid body of theory\n * and practice.  For example, without using any lookup tables an implementation\n * might obtain 119 cycles per byte throughput, whereas using a simple, though\n * large, key-specific 64 kbyte 8-bit lookup table the performance jumps to 13\n * cycles per byte.\n *\n * And Intel's processors have, since 2010, included an instruction which does\n * the entire 128x128->128 bit job in just several 64x64->128 bit pieces.\n *\n * Since SQRL is interactive, and only processing a few 128-bit blocks, I've\n * settled upon a relatively slower but appealing small-table compromise which\n * folds a bunch of not only time consuming but also bit twiddling into a simple\n * 16-entry table which is attributed to Victor Shoup's 1996 work while at\n * Bellcore: \"On Fast and Provably Secure MessageAuthentication Based on\n * Universal Hashing.\"  See: http://www.shoup.net/papers/macs.pdf\n * See, also section 4.1 of the \"gcm-revised-spec\" cited above.\n */\n\n/*\n *  This 16-entry table of pre-computed constants is used by the\n *  GHASH multiplier to improve over a strictly table-free but\n *  significantly slower 128x128 bit multiple within GF(2^128).\n */\nstatic const uint64_t last4[16] = {\n    0x0000, 0x1c20, 0x3840, 0x2460, 0x7080, 0x6ca0, 0x48c0, 0x54e0,\n    0xe100, 0xfd20, 0xd940, 0xc560, 0x9180, 0x8da0, 0xa9c0, 0xb5e0};\n\n/*\n * Platform Endianness Neutralizing Load and Store Macro definitions\n * GCM wants platform-neutral Big Endian (BE) byte ordering\n */\n#define GET_UINT32_BE(n, b, i)                                            \\\n  {                                                                       \\\n    (n) = ((uint32_t) (b)[(i)] << 24) | ((uint32_t) (b)[(i) + 1] << 16) | \\\n          ((uint32_t) (b)[(i) + 2] << 8) | ((uint32_t) (b)[(i) + 3]);     \\\n  }\n\n#define PUT_UINT32_BE(n, b, i)          \\\n  {                                     \\\n    (b)[(i)] = (unsigned char) ((n) >> 24);     \\\n    (b)[(i) + 1] = (unsigned char) ((n) >> 16); \\\n    (b)[(i) + 2] = (unsigned char) ((n) >> 8);  \\\n    (b)[(i) + 3] = (unsigned char) ((n));       \\\n  }\n\n/******************************************************************************\n *\n *  GCM_INITIALIZE\n *\n *  Must be called once to initialize the GCM library.\n *\n *  At present, this only calls the AES keygen table generator, which expands\n *  the AES keying tables for use. This is NOT A THREAD-SAFE function, so it\n *  MUST be called during system initialization before a multi-threading\n *  environment is running.\n *\n ******************************************************************************/\nint mg_gcm_initialize(void) {\n  aes_init_keygen_tables();\n  return (0);\n}\n\n/******************************************************************************\n *\n *  GCM_MULT\n *\n *  Performs a GHASH operation on the 128-bit input vector 'x', setting\n *  the 128-bit output vector to 'x' times H using our precomputed tables.\n *  'x' and 'output' are seen as elements of GCM's GF(2^128) Galois field.\n *\n ******************************************************************************/\nstatic void gcm_mult(gcm_context *ctx,   // pointer to established context\n                     const unsigned char x[16],  // pointer to 128-bit input vector\n                     unsigned char output[16])   // pointer to 128-bit output vector\n{\n  int i;\n  unsigned char lo, hi, rem;\n  uint64_t zh, zl;\n\n  lo = (unsigned char) (x[15] & 0x0f);\n  hi = (unsigned char) (x[15] >> 4);\n  zh = ctx->HH[lo];\n  zl = ctx->HL[lo];\n\n  for (i = 15; i >= 0; i--) {\n    lo = (unsigned char) (x[i] & 0x0f);\n    hi = (unsigned char) (x[i] >> 4);\n\n    if (i != 15) {\n      rem = (unsigned char) (zl & 0x0f);\n      zl = (zh << 60) | (zl >> 4);\n      zh = (zh >> 4);\n      zh ^= (uint64_t) last4[rem] << 48;\n      zh ^= ctx->HH[lo];\n      zl ^= ctx->HL[lo];\n    }\n    rem = (unsigned char) (zl & 0x0f);\n    zl = (zh << 60) | (zl >> 4);\n    zh = (zh >> 4);\n    zh ^= (uint64_t) last4[rem] << 48;\n    zh ^= ctx->HH[hi];\n    zl ^= ctx->HL[hi];\n  }\n  PUT_UINT32_BE(zh >> 32, output, 0);\n  PUT_UINT32_BE(zh, output, 4);\n  PUT_UINT32_BE(zl >> 32, output, 8);\n  PUT_UINT32_BE(zl, output, 12);\n}\n\n/******************************************************************************\n *\n *  GCM_SETKEY\n *\n *  This is called to set the AES-GCM key. It initializes the AES key\n *  and populates the gcm context's pre-calculated HTables.\n *\n ******************************************************************************/\nstatic int gcm_setkey(\n    gcm_context *ctx,    // pointer to caller-provided gcm context\n    const unsigned char *key,    // pointer to the AES encryption key\n    const unsigned int keysize)  // size in bytes (must be 16, 24, 32 for\n                         // 128, 192 or 256-bit keys respectively)\n{\n  int ret, i, j;\n  uint64_t hi, lo;\n  uint64_t vl, vh;\n  unsigned char h[16];\n\n  memset(ctx, 0, sizeof(gcm_context));  // zero caller-provided GCM context\n  memset(h, 0, 16);                     // initialize the block to encrypt\n\n  // encrypt the null 128-bit block to generate a key-based value\n  // which is then used to initialize our GHASH lookup tables\n  if ((ret = aes_setkey(&ctx->aes_ctx, MG_ENCRYPT, key, keysize)) != 0)\n    return (ret);\n  if ((ret = aes_cipher(&ctx->aes_ctx, h, h)) != 0) return (ret);\n\n  GET_UINT32_BE(hi, h, 0);  // pack h as two 64-bit ints, big-endian\n  GET_UINT32_BE(lo, h, 4);\n  vh = (uint64_t) hi << 32 | lo;\n\n  GET_UINT32_BE(hi, h, 8);\n  GET_UINT32_BE(lo, h, 12);\n  vl = (uint64_t) hi << 32 | lo;\n\n  ctx->HL[8] = vl;  // 8 = 1000 corresponds to 1 in GF(2^128)\n  ctx->HH[8] = vh;\n  ctx->HH[0] = 0;  // 0 corresponds to 0 in GF(2^128)\n  ctx->HL[0] = 0;\n\n  for (i = 4; i > 0; i >>= 1) {\n    uint32_t T = (uint32_t) (vl & 1) * 0xe1000000U;\n    vl = (vh << 63) | (vl >> 1);\n    vh = (vh >> 1) ^ ((uint64_t) T << 32);\n    ctx->HL[i] = vl;\n    ctx->HH[i] = vh;\n  }\n  for (i = 2; i < 16; i <<= 1) {\n    uint64_t *HiL = ctx->HL + i, *HiH = ctx->HH + i;\n    vh = *HiH;\n    vl = *HiL;\n    for (j = 1; j < i; j++) {\n      HiH[j] = vh ^ ctx->HH[j];\n      HiL[j] = vl ^ ctx->HL[j];\n    }\n  }\n  return (0);\n}\n\n/******************************************************************************\n *\n *    GCM processing occurs four phases: SETKEY, START, UPDATE and FINISH.\n *\n *  SETKEY:\n *\n *   START: Sets the Encryption/Decryption mode.\n *          Accepts the initialization vector and additional data.\n *\n *  UPDATE: Encrypts or decrypts the plaintext or ciphertext.\n *\n *  FINISH: Performs a final GHASH to generate the authentication tag.\n *\n ******************************************************************************\n *\n *  GCM_START\n *\n *  Given a user-provided GCM context, this initializes it, sets the encryption\n *  mode, and preprocesses the initialization vector and additional AEAD data.\n *\n ******************************************************************************/\nint gcm_start(gcm_context *ctx,  // pointer to user-provided GCM context\n              int mode,          // GCM_ENCRYPT or GCM_DECRYPT\n              const unsigned char *iv,   // pointer to initialization vector\n              size_t iv_len,     // IV length in bytes (should == 12)\n              const unsigned char *add,  // ptr to additional AEAD data (NULL if none)\n              size_t add_len)    // length of additional AEAD data (bytes)\n{\n  int ret;             // our error return if the AES encrypt fails\n  unsigned char work_buf[16];  // XOR source built from provided IV if len != 16\n  const unsigned char *p;      // general purpose array pointer\n  size_t use_len;      // byte count to process, up to 16 bytes\n  size_t i;            // local loop iterator\n\n  // since the context might be reused under the same key\n  // we zero the working buffers for this next new process\n  memset(ctx->y, 0x00, sizeof(ctx->y));\n  memset(ctx->buf, 0x00, sizeof(ctx->buf));\n  ctx->len = 0;\n  ctx->add_len = 0;\n\n  ctx->mode = mode;                // set the GCM encryption/decryption mode\n  ctx->aes_ctx.mode = MG_ENCRYPT;  // GCM *always* runs AES in ENCRYPTION mode\n\n  if (iv_len == 12) {            // GCM natively uses a 12-byte, 96-bit IV\n    memcpy(ctx->y, iv, iv_len);  // copy the IV to the top of the 'y' buff\n    ctx->y[15] = 1;              // start \"counting\" from 1 (not 0)\n  } else  // if we don't have a 12-byte IV, we GHASH whatever we've been given\n  {\n    memset(work_buf, 0x00, 16);               // clear the working buffer\n    PUT_UINT32_BE(iv_len * 8, work_buf, 12);  // place the IV into buffer\n\n    p = iv;\n    while (iv_len > 0) {\n      use_len = (iv_len < 16) ? iv_len : 16;\n      for (i = 0; i < use_len; i++) ctx->y[i] ^= p[i];\n      gcm_mult(ctx, ctx->y, ctx->y);\n      iv_len -= use_len;\n      p += use_len;\n    }\n    for (i = 0; i < 16; i++) ctx->y[i] ^= work_buf[i];\n    gcm_mult(ctx, ctx->y, ctx->y);\n  }\n  if ((ret = aes_cipher(&ctx->aes_ctx, ctx->y, ctx->base_ectr)) != 0)\n    return (ret);\n\n  ctx->add_len = add_len;\n  p = add;\n  while (add_len > 0) {\n    use_len = (add_len < 16) ? add_len : 16;\n    for (i = 0; i < use_len; i++) ctx->buf[i] ^= p[i];\n    gcm_mult(ctx, ctx->buf, ctx->buf);\n    add_len -= use_len;\n    p += use_len;\n  }\n  return (0);\n}\n\n/******************************************************************************\n *\n *  GCM_UPDATE\n *\n *  This is called once or more to process bulk plaintext or ciphertext data.\n *  We give this some number of bytes of input and it returns the same number\n *  of output bytes. If called multiple times (which is fine) all but the final\n *  invocation MUST be called with length mod 16 == 0. (Only the final call can\n *  have a partial block length of < 128 bits.)\n *\n ******************************************************************************/\nint gcm_update(gcm_context *ctx,    // pointer to user-provided GCM context\n               size_t length,       // length, in bytes, of data to process\n               const unsigned char *input,  // pointer to source data\n               unsigned char *output)       // pointer to destination data\n{\n  int ret;         // our error return if the AES encrypt fails\n  unsigned char ectr[16];  // counter-mode cipher output for XORing\n  size_t use_len;  // byte count to process, up to 16 bytes\n  size_t i;        // local loop iterator\n\n  ctx->len += length;  // bump the GCM context's running length count\n\n  while (length > 0) {\n    // clamp the length to process at 16 bytes\n    use_len = (length < 16) ? length : 16;\n\n    // increment the context's 128-bit IV||Counter 'y' vector\n    for (i = 16; i > 12; i--)\n      if (++ctx->y[i - 1] != 0) break;\n\n    // encrypt the context's 'y' vector under the established key\n    if ((ret = aes_cipher(&ctx->aes_ctx, ctx->y, ectr)) != 0) return (ret);\n\n    // encrypt or decrypt the input to the output\n    if (ctx->mode == MG_ENCRYPT) {\n      for (i = 0; i < use_len; i++) {\n        // XOR the cipher's ouptut vector (ectr) with our input\n        output[i] = (unsigned char) (ectr[i] ^ input[i]);\n        // now we mix in our data into the authentication hash.\n        // if we're ENcrypting we XOR in the post-XOR (output)\n        // results, but if we're DEcrypting we XOR in the input\n        // data\n        ctx->buf[i] ^= output[i];\n      }\n    } else {\n      for (i = 0; i < use_len; i++) {\n        // but if we're DEcrypting we XOR in the input data first,\n        // i.e. before saving to ouput data, otherwise if the input\n        // and output buffer are the same (inplace decryption) we\n        // would not get the correct auth tag\n\n        ctx->buf[i] ^= input[i];\n\n        // XOR the cipher's ouptut vector (ectr) with our input\n        output[i] = (unsigned char) (ectr[i] ^ input[i]);\n      }\n    }\n    gcm_mult(ctx, ctx->buf, ctx->buf);  // perform a GHASH operation\n\n    length -= use_len;  // drop the remaining byte count to process\n    input += use_len;   // bump our input pointer forward\n    output += use_len;  // bump our output pointer forward\n  }\n  return (0);\n}\n\n/******************************************************************************\n *\n *  GCM_FINISH\n *\n *  This is called once after all calls to GCM_UPDATE to finalize the GCM.\n *  It performs the final GHASH to produce the resulting authentication TAG.\n *\n ******************************************************************************/\nint gcm_finish(gcm_context *ctx,  // pointer to user-provided GCM context\n               unsigned char *tag,        // pointer to buffer which receives the tag\n               size_t tag_len)    // length, in bytes, of the tag-receiving buf\n{\n  unsigned char work_buf[16];\n  uint64_t orig_len = ctx->len * 8;\n  uint64_t orig_add_len = ctx->add_len * 8;\n  size_t i;\n\n  if (tag_len != 0) memcpy(tag, ctx->base_ectr, tag_len);\n\n  if (orig_len || orig_add_len) {\n    memset(work_buf, 0x00, 16);\n\n    PUT_UINT32_BE((orig_add_len >> 32), work_buf, 0);\n    PUT_UINT32_BE((orig_add_len), work_buf, 4);\n    PUT_UINT32_BE((orig_len >> 32), work_buf, 8);\n    PUT_UINT32_BE((orig_len), work_buf, 12);\n\n    for (i = 0; i < 16; i++) ctx->buf[i] ^= work_buf[i];\n    gcm_mult(ctx, ctx->buf, ctx->buf);\n    for (i = 0; i < tag_len; i++) tag[i] ^= ctx->buf[i];\n  }\n  return (0);\n}\n\n/******************************************************************************\n *\n *  GCM_CRYPT_AND_TAG\n *\n *  This either encrypts or decrypts the user-provided data and, either\n *  way, generates an authentication tag of the requested length. It must be\n *  called with a GCM context whose key has already been set with GCM_SETKEY.\n *\n *  The user would typically call this explicitly to ENCRYPT a buffer of data\n *  and optional associated data, and produce its an authentication tag.\n *\n *  To reverse the process the user would typically call the companion\n *  GCM_AUTH_DECRYPT function to decrypt data and verify a user-provided\n *  authentication tag.  The GCM_AUTH_DECRYPT function calls this function\n *  to perform its decryption and tag generation, which it then compares.\n *\n ******************************************************************************/\nint gcm_crypt_and_tag(\n    gcm_context *ctx,    // gcm context with key already setup\n    int mode,            // cipher direction: GCM_ENCRYPT or GCM_DECRYPT\n    const unsigned char *iv,     // pointer to the 12-byte initialization vector\n    size_t iv_len,       // byte length if the IV. should always be 12\n    const unsigned char *add,    // pointer to the non-ciphered additional data\n    size_t add_len,      // byte length of the additional AEAD data\n    const unsigned char *input,  // pointer to the cipher data source\n    unsigned char *output,       // pointer to the cipher data destination\n    size_t length,       // byte length of the cipher data\n    unsigned char *tag,          // pointer to the tag to be generated\n    size_t tag_len)      // byte length of the tag to be generated\n{                        /*\n                            assuming that the caller has already invoked gcm_setkey to\n                            prepare the gcm context with the keying material, we simply\n                            invoke each of the three GCM sub-functions in turn...\n                         */\n  gcm_start(ctx, mode, iv, iv_len, add, add_len);\n  gcm_update(ctx, length, input, output);\n  gcm_finish(ctx, tag, tag_len);\n  return (0);\n}\n\n/******************************************************************************\n *\n *  GCM_ZERO_CTX\n *\n *  The GCM context contains both the GCM context and the AES context.\n *  This includes keying and key-related material which is security-\n *  sensitive, so it MUST be zeroed after use. This function does that.\n *\n ******************************************************************************/\nvoid gcm_zero_ctx(gcm_context *ctx) {\n  // zero the context originally provided to us\n  memset(ctx, 0, sizeof(gcm_context));\n}\n//\n//  aes-gcm.c\n//  Pods\n//\n//  Created by Markus Kosmal on 20/11/14.\n//\n//\n\nint mg_aes_gcm_encrypt(unsigned char *output,  //\n                       const unsigned char *input, size_t input_length,\n                       const unsigned char *key, const size_t key_len,\n                       const unsigned char *iv, const size_t iv_len,\n                       unsigned char *aead, size_t aead_len, unsigned char *tag,\n                       const size_t tag_len) {\n  int ret = 0;      // our return value\n  gcm_context ctx;  // includes the AES context structure\n\n  gcm_setkey(&ctx, key, (unsigned int) key_len);\n\n  ret = gcm_crypt_and_tag(&ctx, MG_ENCRYPT, iv, iv_len, aead, aead_len, input,\n                          output, input_length, tag, tag_len);\n\n  gcm_zero_ctx(&ctx);\n\n  return (ret);\n}\n\nint mg_aes_gcm_decrypt(unsigned char *output, const unsigned char *input,\n                       size_t input_length, const unsigned char *key,\n                       const size_t key_len, const unsigned char *iv,\n                       const size_t iv_len) {\n  int ret = 0;      // our return value\n  gcm_context ctx;  // includes the AES context structure\n\n  size_t tag_len = 0;\n  unsigned char *tag_buf = NULL;\n\n  gcm_setkey(&ctx, key, (unsigned int) key_len);\n\n  ret = gcm_crypt_and_tag(&ctx, MG_DECRYPT, iv, iv_len, NULL, 0, input, output,\n                          input_length, tag_buf, tag_len);\n\n  gcm_zero_ctx(&ctx);\n\n  return (ret);\n}\n#endif\n// End of aes128 PD\n"
  },
  {
    "path": "src/tls_aes128.h",
    "content": "/******************************************************************************\n *\n * THIS SOURCE CODE IS HEREBY PLACED INTO THE PUBLIC DOMAIN FOR THE GOOD OF ALL\n *\n * This is a simple and straightforward implementation of AES-GCM authenticated\n * encryption. The focus of this work was correctness & accuracy. It is written\n * in straight 'C' without any particular focus upon optimization or speed. It\n * should be endian (memory byte order) neutral since the few places that care\n * are handled explicitly.\n *\n * This implementation of AES-GCM was created by Steven M. Gibson of GRC.com.\n *\n * It is intended for general purpose use, but was written in support of GRC's\n * reference implementation of the SQRL (Secure Quick Reliable Login) client.\n *\n * See:    http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf\n *         http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/ \\\n *         gcm/gcm-revised-spec.pdf\n *\n * NO COPYRIGHT IS CLAIMED IN THIS WORK, HOWEVER, NEITHER IS ANY WARRANTY MADE\n * REGARDING ITS FITNESS FOR ANY PARTICULAR PURPOSE. USE IT AT YOUR OWN RISK.\n *\n *******************************************************************************/\n#ifndef TLS_AES128_H\n#define TLS_AES128_H\n\n/******************************************************************************\n *  AES_CONTEXT : cipher context / holds inter-call data\n ******************************************************************************/\ntypedef struct {\n  int mode;          // 1 for Encryption, 0 for Decryption\n  int rounds;        // keysize-based rounds count\n  uint32_t *rk;      // pointer to current round key\n  uint32_t buf[68];  // key expansion buffer\n} aes_context;\n\n#include \"arch.h\"\n#define GCM_AUTH_FAILURE 0x55555555  // authentication failure\n\n/******************************************************************************\n *  GCM_CONTEXT : MUST be called once before ANY use of this library\n ******************************************************************************/\nint mg_gcm_initialize(void);\n\n//\n//  aes-gcm.h\n//  MKo\n//\n//  Created by Markus Kosmal on 20/11/14.\n//\n//\nint mg_aes_gcm_encrypt(unsigned char *output, const unsigned char *input,\n                       size_t input_length, const unsigned char *key,\n                       const size_t key_len, const unsigned char *iv,\n                       const size_t iv_len, unsigned char *aead,\n                       size_t aead_len, unsigned char *tag,\n                       const size_t tag_len);\n\nint mg_aes_gcm_decrypt(unsigned char *output, const unsigned char *input,\n                       size_t input_length, const unsigned char *key,\n                       const size_t key_len, const unsigned char *iv,\n                       const size_t iv_len);\n\n#endif /* TLS_AES128_H */\n\n// End of aes128 PD\n"
  },
  {
    "path": "src/tls_builtin.c",
    "content": "#include \"base64.h\"\n#include \"config.h\"\n#include \"printf.h\"\n#include \"sha256.h\"\n#include \"tls.h\"\n#include \"tls_aes128.h\"\n#include \"tls_chacha20.h\"\n#include \"tls_rsa.h\"\n#include \"tls_uecc.h\"\n#include \"tls_x25519.h\"\n#include \"util.h\"\n\n#if MG_TLS == MG_TLS_BUILTIN\n\n// PKCS#8 algorithm OIDs\nstatic const uint8_t mg_rsa_oid[] = {\n    0x2a, 0x86, 0x48, 0x86, 0xf7,\n    0x0d, 0x01, 0x01, 0x01  // 1.2.840.113549.1.1.1 rsaEncryption\n};\nstatic const uint8_t mg_ec_public_key_oid[] = {\n    0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01  // 1.2.840.10045.2.1 ecPublicKey\n};\nstatic const uint8_t mg_secp256r1_oid[] = {\n    0x2a, 0x86, 0x48, 0xce,\n    0x3d, 0x03, 0x01, 0x07  // 1.2.840.10045.3.1.7 secp256r1\n};\n\n/* TLS 1.3 Record Content Type (RFC8446 B.1) */\n#define MG_TLS_CHANGE_CIPHER 20\n#define MG_TLS_ALERT 21\n#define MG_TLS_HANDSHAKE 22\n#define MG_TLS_APP_DATA 23\n#define MG_TLS_HEARTBEAT 24\n\n/* TLS 1.3 Handshake Message Type (RFC8446 B.3) */\n#define MG_TLS_CLIENT_HELLO 1\n#define MG_TLS_SERVER_HELLO 2\n#define MG_TLS_ENCRYPTED_EXTENSIONS 8\n#define MG_TLS_CERTIFICATE 11\n#define MG_TLS_CERTIFICATE_REQUEST 13\n#define MG_TLS_CERTIFICATE_VERIFY 15\n#define MG_TLS_FINISHED 20\n\n#define MG_TLS_RSA_USE_CRT 1  // CRT instead of naive RSA\n\n// handshake is re-entrant, so we need to keep track of its state state names\n// refer to RFC8446#A.1\nenum mg_tls_hs_state {\n  // Client state machine:\n  MG_TLS_STATE_CLIENT_START,        // Send ClientHello\n  MG_TLS_STATE_CLIENT_WAIT_SH,      // Wait for ServerHello\n  MG_TLS_STATE_CLIENT_WAIT_EE,      // Wait for EncryptedExtensions\n  MG_TLS_STATE_CLIENT_WAIT_CERT,    // Wait for Certificate\n  MG_TLS_STATE_CLIENT_WAIT_CV,      // Wait for CertificateVerify\n  MG_TLS_STATE_CLIENT_WAIT_FINISH,  // Wait for Finish\n  MG_TLS_STATE_CLIENT_CONNECTED,    // Done\n\n  // Server state machine:\n  MG_TLS_STATE_SERVER_START,       // Wait for ClientHello\n  MG_TLS_STATE_SERVER_WAIT_CERT,   // Wait for Certificate\n  MG_TLS_STATE_SERVER_WAIT_CV,     // Wait for CertificateVerify\n  MG_TLS_STATE_SERVER_NEGOTIATED,  // Wait for Finish\n  MG_TLS_STATE_SERVER_CONNECTED    // Done\n};\n\n// encryption keys for a TLS connection\nstruct tls_enc {\n  uint32_t sseq;  // server sequence number, used in encryption\n  uint32_t cseq;  // client sequence number, used in decryption\n  // keys for AES encryption or ChaCha20\n  uint8_t handshake_secret[32];\n  uint8_t server_write_key[32];\n  uint8_t server_write_iv[12];\n  uint8_t server_finished_key[32];\n  uint8_t client_write_key[32];\n  uint8_t client_write_iv[12];\n  uint8_t client_finished_key[32];\n};\n\nstruct mg_rsa_key {\n  struct mg_str n;     // modulus\n  struct mg_str e;     // public exponent\n  struct mg_str d;     // private exponent\n  struct mg_str p;     // prime1\n  struct mg_str q;     // prime2\n  struct mg_str dP;    // exponent1 (d mod (p-1))\n  struct mg_str dQ;    // exponent2 (d mod (q-1))\n  struct mg_str qInv;  // coefficient ((inverse of q) mod p)\n};\n\n// per-connection TLS data\nstruct tls_data {\n  enum mg_tls_hs_state state;  // keep track of connection handshake progress\n\n  struct mg_iobuf send;  // For the receive path, we're reusing c->rtls\n  size_t recv_offset;    // While c->rtls contains full records, reuse that\n  size_t recv_len;       // buffer but point at individual decrypted messages\n\n  uint8_t content_type;  // Last received record content type\n\n  mg_sha256_ctx sha256;  // incremental SHA-256 hash for TLS handshake\n\n  uint8_t random[32];      // client random from ClientHello\n  uint8_t session_id[32];  // client session ID between the handshake states\n  uint8_t x25519_cli[32];  // client X25519 key between the handshake states\n  uint8_t x25519_sec[32];  // x25519 secret between the handshake states\n\n  bool skip_verification;    // do not perform checks on server certificate\n  bool cert_requested;       // client received a CertificateRequest\n  bool is_twoway;            // server is configured to authenticate clients\n  struct mg_str cert_der;    // certificate in DER format\n  struct mg_str ca_der;      // CA certificate\n  struct mg_str *chain_der;  // certificate chain (intermediate certs)\n  size_t chain_len;          // number of certificates in chain\n  uint8_t ec_key[32];        // EC private key\n  struct mg_rsa_key rsa;\n  struct mg_str rsa_key_der;  // RSA private key in DER format\n  char hostname[254];         // matching hostname\n\n  bool is_ec_pubkey;         // EC or RSA\n  uint8_t pubkey[512 + 16];  // server EC (64) or RSA (512+exp) public key to\n                             // verify cert\n  size_t pubkeysz;           // size of the server public key\n  uint8_t sighash[32];       // calculated signature verification hash\n\n  struct tls_enc enc;       // actual keys in use at this time\n  struct tls_enc app_keys;  // storage during two-way auth handshake\n};\n\n#define TLS_RECHDR_SIZE 5  // 1 byte type, 2 bytes version, 2 bytes length\n#define TLS_MSGHDR_SIZE 4  // 1 byte type, 3 bytes length\n\n#ifdef MG_TLS_SSLKEYLOGFILE\n#include <stdio.h>\nstatic void mg_ssl_key_log(const char *label, uint8_t client_random[32],\n                           uint8_t *secret, size_t secretsz) {\n  char *keylogfile = getenv(\"SSLKEYLOGFILE\");\n  size_t i;\n  if (keylogfile != NULL) {\n    MG_DEBUG((\"Dumping key log into %s\", keylogfile));\n    FILE *f = fopen(keylogfile, \"a\");\n    if (f != NULL) {\n      fprintf(f, \"%s \", label);\n      for (i = 0; i < 32; i++) {\n        fprintf(f, \"%02x\", client_random[i]);\n      }\n      fprintf(f, \" \");\n      for (i = 0; i < secretsz; i++) {\n        fprintf(f, \"%02x\", secret[i]);\n      }\n      fprintf(f, \"\\n\");\n      fclose(f);\n    } else {\n      MG_ERROR((\"Cannot open %s\", keylogfile));\n    }\n  }\n}\n#endif\n\n// for derived tls keys we need SHA256([0]*32)\nstatic uint8_t zeros[32] = {0};\nstatic uint8_t zeros_sha256_digest[32] = {\n    0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4,\n    0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b,\n    0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55};\n\n// helper to hexdump buffers inline\nstatic void mg_tls_hexdump(const char *msg, uint8_t *buf, size_t bufsz) {\n  MG_VERBOSE((\"%s: %M\", msg, mg_print_hex, bufsz, buf));\n}\n\n// helper utilities to parse ASN.1 DER\nstruct mg_der_tlv {\n  uint8_t type;\n  uint32_t len;\n  uint8_t *value;\n};\n\nstatic int mg_der_parse(uint8_t *der, size_t dersz, struct mg_der_tlv *tlv) {\n  size_t header_len = 2;\n  uint32_t len = dersz < 2 ? 0 : der[1];\n  if (dersz < 2) return -1;  // Invalid DER\n  tlv->type = der[0];\n  if (len > 0x7F) {  // long-form length\n    uint8_t len_bytes = len & 0x7F, i;\n    if (dersz < (size_t) (2 + len_bytes)) return -1;\n    len = 0;\n    for (i = 0; i < len_bytes; i++) {\n      len = (len << 8) | der[2 + i];\n    }\n    header_len += len_bytes;\n  }\n  if (dersz < header_len + len) return -1;\n  tlv->len = len;\n  tlv->value = der + header_len;\n  return (int) (header_len + len);\n}\n\nstatic int mg_der_next(struct mg_der_tlv *parent, struct mg_der_tlv *child) {\n  int consumed;\n  if (parent->len == 0) return 0;\n  consumed = mg_der_parse(parent->value, parent->len, child);\n  if (consumed < 0) return -1;\n  parent->value += consumed;\n  parent->len -= (uint32_t) consumed;\n  return 1;\n}\n\nstatic int mg_der_find_oid(struct mg_der_tlv *tlv, const uint8_t *oid,\n                           size_t oid_len, struct mg_der_tlv *found) {\n  struct mg_der_tlv parent, child;\n  parent = *tlv;\n  while (mg_der_next(&parent, &child) > 0) {\n    if (child.type == 0x06 && child.len == oid_len &&\n        memcmp(child.value, oid, oid_len) == 0) {\n      return mg_der_next(&parent, found);\n    } else if (child.type & 0x20) {\n      struct mg_der_tlv sub_parent = child;\n      if (mg_der_find_oid(&sub_parent, oid, oid_len, found)) return 1;\n    }\n  }\n  return 0;\n}\n\n#if 0\nstatic void mg_der_debug(struct mg_der_tlv *tlv, int depth) {\n  MG_DEBUG((\"> %.*sd=%d Type: 0x%02X, Length: %u\\n\", depth * 4, \" \", depth,\n            tlv->type, tlv->len));\n\n  if (tlv->type & 0x20) {  // Constructed: recurse into children\n    struct mg_der_tlv child;\n    struct mg_der_tlv parent = *tlv;\n    while (mg_der_next(&parent, &child) > 0) {\n      mg_der_debug(&child, depth + 1);\n    }\n  }\n}\n#endif\n\n// parse DER into a TLV record\nstatic int mg_der_to_tlv(uint8_t *der, size_t dersz, struct mg_der_tlv *tlv) {\n  if (dersz < 2) {\n    return -1;\n  }\n  tlv->type = der[0];\n  tlv->len = der[1];\n  tlv->value = der + 2;\n  if (tlv->len > 0x7f) {\n    uint32_t i, n = tlv->len - 0x80;\n    tlv->len = 0;\n    for (i = 0; i < n; i++) {\n      tlv->len = (tlv->len << 8) | (der[2 + i]);\n    }\n    tlv->value = der + 2 + n;\n  }\n  if (der + dersz < tlv->value + tlv->len) {\n    return -1;\n  }\n  return 0;\n}\n\n// Did we receive a full TLS record in the c->rtls buffer?\nstatic bool mg_tls_got_record(struct mg_connection *c) {\n  return c->rtls.len >= (size_t) TLS_RECHDR_SIZE &&\n         c->rtls.len >=\n             (size_t) (TLS_RECHDR_SIZE + MG_LOAD_BE16(c->rtls.buf + 3));\n}\n\n// Remove a single TLS record from the recv buffer\nstatic void mg_tls_drop_record(struct mg_connection *c) {\n  struct mg_iobuf *rio = &c->rtls;\n  uint16_t n = MG_LOAD_BE16(rio->buf + 3) + TLS_RECHDR_SIZE;\n  mg_iobuf_del(rio, 0, n);\n}\n\n// Remove a single TLS message from decrypted buffer, remove the wrapping\n// record if it was the last message within a record\nstatic void mg_tls_drop_message(struct mg_connection *c) {\n  uint32_t len;\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf = &c->rtls.buf[tls->recv_offset];\n  if (tls->recv_len == 0) return;\n  len = MG_LOAD_BE24(recv_buf + 1) + TLS_MSGHDR_SIZE;\n  if (tls->recv_len < len) {\n    mg_error(c, \"wrong size\");\n    return;\n  }\n  mg_sha256_update(&tls->sha256, recv_buf, len);\n  tls->recv_offset += len;\n  tls->recv_len -= len;\n  if (tls->recv_len == 0) {\n    mg_tls_drop_record(c);\n  }\n}\n\n// TLS1.3 secret derivation based on the key label\nstatic void mg_tls_derive_secret(const char *label, uint8_t *key, size_t keysz,\n                                 uint8_t *data, size_t datasz, uint8_t *hash,\n                                 size_t hashsz) {\n  size_t labelsz = strlen(label);\n  uint8_t secret[32];\n  uint8_t packed[256] = {0, (uint8_t) hashsz, (uint8_t) labelsz};\n  // TODO: assert lengths of label, key, data and hash\n  if (labelsz > 0) memmove(packed + 3, label, labelsz);\n  packed[3 + labelsz] = (uint8_t) datasz;\n  if (datasz > 0) memmove(packed + labelsz + 4, data, datasz);\n  packed[4 + labelsz + datasz] = 1;\n\n  mg_hmac_sha256(secret, key, keysz, packed, 5 + labelsz + datasz);\n  memmove(hash, secret, hashsz);\n}\n\n// at this point we have x25519 shared secret, we can generate a set of derived\n// handshake encryption keys\nstatic void mg_tls_generate_handshake_keys(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n\n  mg_sha256_ctx sha256;\n  uint8_t early_secret[32];\n  uint8_t pre_extract_secret[32];\n  uint8_t hello_hash[32];\n  uint8_t server_hs_secret[32];\n  uint8_t client_hs_secret[32];\n#if MG_ENABLE_CHACHA20\n  const size_t keysz = 32;\n#else\n  const size_t keysz = 16;\n#endif\n\n  mg_hmac_sha256(early_secret, NULL, 0, zeros, sizeof(zeros));\n  mg_tls_derive_secret(\"tls13 derived\", early_secret, 32, zeros_sha256_digest,\n                       32, pre_extract_secret, 32);\n  mg_hmac_sha256(tls->enc.handshake_secret, pre_extract_secret,\n                 sizeof(pre_extract_secret), tls->x25519_sec,\n                 sizeof(tls->x25519_sec));\n  mg_tls_hexdump(\"hs secret\", tls->enc.handshake_secret, 32);\n\n  // mg_sha256_final is not idempotent, need to copy sha256 context to calculate\n  // the digest\n  memmove(&sha256, &tls->sha256, sizeof(mg_sha256_ctx));\n  mg_sha256_final(hello_hash, &sha256);\n\n  mg_tls_hexdump(\"hello hash\", hello_hash, 32);\n  // derive keys needed for the rest of the handshake\n  mg_tls_derive_secret(\"tls13 s hs traffic\", tls->enc.handshake_secret, 32,\n                       hello_hash, 32, server_hs_secret, 32);\n  mg_tls_derive_secret(\"tls13 c hs traffic\", tls->enc.handshake_secret, 32,\n                       hello_hash, 32, client_hs_secret, 32);\n\n  mg_tls_derive_secret(\"tls13 key\", server_hs_secret, 32, NULL, 0,\n                       tls->enc.server_write_key, keysz);\n  mg_tls_derive_secret(\"tls13 iv\", server_hs_secret, 32, NULL, 0,\n                       tls->enc.server_write_iv, 12);\n  mg_tls_derive_secret(\"tls13 finished\", server_hs_secret, 32, NULL, 0,\n                       tls->enc.server_finished_key, 32);\n\n  mg_tls_derive_secret(\"tls13 key\", client_hs_secret, 32, NULL, 0,\n                       tls->enc.client_write_key, keysz);\n  mg_tls_derive_secret(\"tls13 iv\", client_hs_secret, 32, NULL, 0,\n                       tls->enc.client_write_iv, 12);\n  mg_tls_derive_secret(\"tls13 finished\", client_hs_secret, 32, NULL, 0,\n                       tls->enc.client_finished_key, 32);\n\n  mg_tls_hexdump(\"s hs traffic\", server_hs_secret, 32);\n  mg_tls_hexdump(\"s key\", tls->enc.server_write_key, keysz);\n  mg_tls_hexdump(\"s iv\", tls->enc.server_write_iv, 12);\n  mg_tls_hexdump(\"s finished\", tls->enc.server_finished_key, 32);\n  mg_tls_hexdump(\"c hs traffic\", client_hs_secret, 32);\n  mg_tls_hexdump(\"c key\", tls->enc.client_write_key, keysz);\n  mg_tls_hexdump(\"c iv\", tls->enc.client_write_iv, 12);\n  mg_tls_hexdump(\"c finished\", tls->enc.client_finished_key, 32);\n\n#ifdef MG_TLS_SSLKEYLOGFILE\n  mg_ssl_key_log(\"SERVER_HANDSHAKE_TRAFFIC_SECRET\", tls->random,\n                 server_hs_secret, 32);\n  mg_ssl_key_log(\"CLIENT_HANDSHAKE_TRAFFIC_SECRET\", tls->random,\n                 client_hs_secret, 32);\n#endif\n}\n\nstatic void mg_tls_generate_application_keys(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  uint8_t hash[32];\n  uint8_t premaster_secret[32];\n  uint8_t master_secret[32];\n  uint8_t server_secret[32];\n  uint8_t client_secret[32];\n#if MG_ENABLE_CHACHA20\n  const size_t keysz = 32;\n#else\n  const size_t keysz = 16;\n#endif\n\n  mg_sha256_ctx sha256;\n  memmove(&sha256, &tls->sha256, sizeof(mg_sha256_ctx));\n  mg_sha256_final(hash, &sha256);\n\n  mg_tls_derive_secret(\"tls13 derived\", tls->enc.handshake_secret, 32,\n                       zeros_sha256_digest, 32, premaster_secret, 32);\n  mg_hmac_sha256(master_secret, premaster_secret, 32, zeros, 32);\n\n  mg_tls_derive_secret(\"tls13 s ap traffic\", master_secret, 32, hash, 32,\n                       server_secret, 32);\n  mg_tls_derive_secret(\"tls13 key\", server_secret, 32, NULL, 0,\n                       tls->enc.server_write_key, keysz);\n  mg_tls_derive_secret(\"tls13 iv\", server_secret, 32, NULL, 0,\n                       tls->enc.server_write_iv, 12);\n  mg_tls_derive_secret(\"tls13 c ap traffic\", master_secret, 32, hash, 32,\n                       client_secret, 32);\n  mg_tls_derive_secret(\"tls13 key\", client_secret, 32, NULL, 0,\n                       tls->enc.client_write_key, keysz);\n  mg_tls_derive_secret(\"tls13 iv\", client_secret, 32, NULL, 0,\n                       tls->enc.client_write_iv, 12);\n\n  mg_tls_hexdump(\"s ap traffic\", server_secret, 32);\n  mg_tls_hexdump(\"s key\", tls->enc.server_write_key, keysz);\n  mg_tls_hexdump(\"s iv\", tls->enc.server_write_iv, 12);\n  mg_tls_hexdump(\"s finished\", tls->enc.server_finished_key, 32);\n  mg_tls_hexdump(\"c ap traffic\", client_secret, 32);\n  mg_tls_hexdump(\"c key\", tls->enc.client_write_key, keysz);\n  mg_tls_hexdump(\"c iv\", tls->enc.client_write_iv, 12);\n  mg_tls_hexdump(\"c finished\", tls->enc.client_finished_key, 32);\n  tls->enc.sseq = tls->enc.cseq = 0;\n\n#ifdef MG_TLS_SSLKEYLOGFILE\n  mg_ssl_key_log(\"SERVER_TRAFFIC_SECRET_0\", tls->random, server_secret, 32);\n  mg_ssl_key_log(\"CLIENT_TRAFFIC_SECRET_0\", tls->random, client_secret, 32);\n#endif\n}\n\n// AES GCM encryption of the message + put encoded data into the write buffer\nstatic bool mg_tls_encrypt(struct mg_connection *c, const uint8_t *msg,\n                           size_t msgsz, uint8_t msgtype) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  struct mg_iobuf *wio = &tls->send;\n  uint8_t *outmsg;\n  uint8_t *tag;\n  size_t encsz = msgsz + 16 + 1;\n  uint8_t hdr[5] = {MG_TLS_APP_DATA, 0x03, 0x03,\n                    (uint8_t) ((encsz >> 8) & 0xff), (uint8_t) (encsz & 0xff)};\n  uint8_t associated_data[5] = {MG_TLS_APP_DATA, 0x03, 0x03,\n                                (uint8_t) ((encsz >> 8) & 0xff),\n                                (uint8_t) (encsz & 0xff)};\n  uint8_t nonce[12];\n\n  uint32_t seq = c->is_client ? tls->enc.cseq : tls->enc.sseq;\n  uint8_t *key =\n      c->is_client ? tls->enc.client_write_key : tls->enc.server_write_key;\n  uint8_t *iv =\n      c->is_client ? tls->enc.client_write_iv : tls->enc.server_write_iv;\n\n  if (msgsz > 16384) {\n    MG_ERROR((\"msg longer than recordsz\"));\n    return false;\n  }\n\n#if MG_ENABLE_CHACHA20\n#else\n  mg_gcm_initialize();\n#endif\n\n  memmove(nonce, iv, sizeof(nonce));\n  nonce[8] ^= (uint8_t) ((seq >> 24) & 255U);\n  nonce[9] ^= (uint8_t) ((seq >> 16) & 255U);\n  nonce[10] ^= (uint8_t) ((seq >> 8) & 255U);\n  nonce[11] ^= (uint8_t) ((seq) & 255U);\n\n  if (mg_iobuf_add(wio, wio->len, hdr, sizeof(hdr)) == 0 ||\n      !mg_iobuf_resize(wio, wio->len + encsz))\n    return false;\n  outmsg = wio->buf + wio->len;\n  tag = wio->buf + wio->len + msgsz + 1;\n  memmove(outmsg, msg, msgsz);\n  outmsg[msgsz] = msgtype;\n#if MG_ENABLE_CHACHA20\n  (void) tag;  // tag is only used in aes gcm\n  {\n    size_t n;\n    uint8_t *enc = (uint8_t *) mg_calloc(1, msgsz + 256 + 1);\n    if (enc == NULL) return false;\n    n = mg_chacha20_poly1305_encrypt(enc, key, nonce, associated_data,\n                                     sizeof(associated_data), outmsg,\n                                     msgsz + 1);\n    memmove(outmsg, enc, n);\n    mg_free(enc);\n  }\n#else\n  mg_aes_gcm_encrypt(outmsg, outmsg, msgsz + 1, key, 16, nonce, sizeof(nonce),\n                     associated_data, sizeof(associated_data), tag, 16);\n#endif\n  c->is_client ? tls->enc.cseq++ : tls->enc.sseq++;\n  wio->len += encsz;\n  return true;\n}\n\n// read an encrypted record, decrypt it in place\nstatic int mg_tls_recv_record(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  struct mg_iobuf *rio = &c->rtls;\n  uint16_t msgsz;\n  uint8_t *msg;\n  uint8_t nonce[12];\n  int r;\n\n  uint32_t seq = c->is_client ? tls->enc.sseq : tls->enc.cseq;\n  uint8_t *key =\n      c->is_client ? tls->enc.server_write_key : tls->enc.client_write_key;\n  uint8_t *iv =\n      c->is_client ? tls->enc.server_write_iv : tls->enc.client_write_iv;\n\n  if (tls->recv_len > 0) {\n    return 0; /* some data from previous record is still present */\n  }\n  for (;;) {\n    if (!mg_tls_got_record(c)) {\n      return MG_IO_WAIT;\n    }\n    if (rio->buf[0] == MG_TLS_APP_DATA) {\n      break;\n    } else if (rio->buf[0] == MG_TLS_CHANGE_CIPHER) {  // skip CCS\n      mg_tls_drop_record(c);\n    } else if (rio->buf[0] == MG_TLS_ALERT) {  // Skip Alerts\n      if (rio->len >= 7) {\n        uint8_t level = rio->buf[5], desc = rio->buf[6];\n        MG_INFO((\"TLS ALERT received: level=%d, desc=%d (%s)\", level, desc,\n                 desc == 0    ? \"close_notify\"\n                 : desc == 10 ? \"unexpected_message\"\n                 : desc == 20 ? \"bad_record_mac\"\n                 : desc == 21 ? \"decryption_failed\"\n                 : desc == 40 ? \"handshake_failure\"\n                 : desc == 42 ? \"bad_certificate\"\n                 : desc == 43 ? \"unsupported_certificate\"\n                              : \"unknown\"));\n      } else {\n        MG_INFO((\"TLS ALERT packet received (short)\"));\n      }\n      mg_tls_drop_record(c);\n    } else {\n      mg_error(c, \"unexpected packet\");\n      return -1;\n    }\n  }\n\n  msgsz = MG_LOAD_BE16(rio->buf + 3);\n  msg = rio->buf + 5;\n  if (msgsz < 16) {\n    mg_error(c, \"wrong size\");\n    return -1;\n  }\n\n  memmove(nonce, iv, sizeof(nonce));\n  nonce[8] ^= (uint8_t) ((seq >> 24) & 255U);\n  nonce[9] ^= (uint8_t) ((seq >> 16) & 255U);\n  nonce[10] ^= (uint8_t) ((seq >> 8) & 255U);\n  nonce[11] ^= (uint8_t) ((seq) & 255U);\n#if MG_ENABLE_CHACHA20\n  {\n    uint8_t *dec = (uint8_t *) mg_calloc(1, msgsz);\n    size_t n;\n    if (dec == NULL) {\n      mg_error(c, \"TLS OOM\");\n      return -1;\n    }\n    n = mg_chacha20_poly1305_decrypt(dec, key, nonce, msg, msgsz);\n    if (n == (size_t) -1) {\n      mg_error(c, \"decryption error\");\n      return -1;\n    }\n    memmove(msg, dec, n);\n    mg_free(dec);\n  }\n#else\n  mg_gcm_initialize();\n  mg_aes_gcm_decrypt(msg, msg, msgsz - 16, key, 16, nonce, sizeof(nonce));\n#endif\n\n  r = msgsz - 16 - 1;\n  tls->content_type = msg[msgsz - 16 - 1];\n  tls->recv_offset = (size_t) msg - (size_t) rio->buf;\n  tls->recv_len = (size_t) msgsz - 16 - 1;\n  c->is_client ? tls->enc.sseq++ : tls->enc.cseq++;\n  return r;\n}\n\nstatic void mg_tls_calc_cert_verify_hash(struct mg_connection *c,\n                                         uint8_t hash[32], bool is_client) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  uint8_t sig_content[130];\n  mg_sha256_ctx sha256;\n\n  memset(sig_content, 0x20, 64);\n  if (is_client) {\n    uint8_t client_context[34] = \"TLS 1.3, client CertificateVerify\";\n    memcpy(sig_content + 64, client_context, sizeof(client_context));\n  } else {\n    uint8_t server_context[34] = \"TLS 1.3, server CertificateVerify\";\n    memcpy(sig_content + 64, server_context, sizeof(server_context));\n  }\n\n  memmove(&sha256, &tls->sha256, sizeof(mg_sha256_ctx));\n  mg_sha256_final(sig_content + 98, &sha256);\n\n  mg_sha256_init(&sha256);\n  mg_sha256_update(&sha256, sig_content, sizeof(sig_content));\n  mg_sha256_final(hash, &sha256);\n}\n\n// read and parse ClientHello record\nstatic int mg_tls_server_recv_hello(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  struct mg_iobuf *rio = &c->rtls;\n  uint8_t session_id_len;\n  uint16_t j;\n  uint16_t cipher_suites_len;\n  uint16_t ext_len;\n  uint8_t *ext;\n  uint16_t msgsz;\n\n  if (!mg_tls_got_record(c)) {\n    return MG_IO_WAIT;\n  }\n  if (rio->buf[0] != MG_TLS_HANDSHAKE || rio->buf[5] != MG_TLS_CLIENT_HELLO) {\n    mg_error(c, \"not a client hello packet\");\n    return -1;\n  }\n  if (rio->len < 50) goto fail;\n  msgsz = MG_LOAD_BE16(rio->buf + 3);\n  if (((uint32_t) msgsz + 4) > rio->len) goto fail;\n  mg_sha256_update(&tls->sha256, rio->buf + 5, msgsz);\n  // store client random\n  memmove(tls->random, rio->buf + 11, sizeof(tls->random));\n  // store session_id\n  session_id_len = rio->buf[43];\n  if (session_id_len == sizeof(tls->session_id)) {\n    memmove(tls->session_id, rio->buf + 44, session_id_len);\n  } else if (session_id_len != 0) {\n    MG_INFO((\"bad session id len\"));\n  }\n  cipher_suites_len = MG_LOAD_BE16(rio->buf + 44 + session_id_len);\n  if (((uint32_t) cipher_suites_len + 46 + session_id_len) > rio->len)\n    goto fail;\n  ext_len = MG_LOAD_BE16(rio->buf + 48 + session_id_len + cipher_suites_len);\n  ext = rio->buf + 50 + session_id_len + cipher_suites_len;\n  if (((unsigned char *) ext + ext_len) > (rio->buf + rio->len)) goto fail;\n  for (j = 0; j < ext_len;) {\n    uint16_t k;\n    uint16_t key_exchange_len;\n    uint8_t *key_exchange;\n    uint16_t n = MG_LOAD_BE16(ext + j + 2);\n    if (((uint32_t) n + j + 4) > ext_len) goto fail;\n    if (MG_LOAD_BE16(ext + j) != 0x0033) {  // not a key share extension, ignore\n      j += (uint16_t) (n + 4);\n      continue;\n    }\n    key_exchange_len = MG_LOAD_BE16(ext + j + 4);\n    key_exchange = ext + j + 6;\n    if (((size_t) key_exchange_len +\n         ((size_t) key_exchange - (size_t) rio->buf)) > rio->len)\n      goto fail;\n    for (k = 0; k < key_exchange_len;) {\n      uint16_t m = MG_LOAD_BE16(key_exchange + k + 2);\n      if (((uint32_t) m + k + 4) > key_exchange_len) goto fail;\n      if (m == 32 && key_exchange[k] == 0x00 && key_exchange[k + 1] == 0x1d) {\n        memmove(tls->x25519_cli, key_exchange + k + 4, m);\n        mg_tls_drop_record(c);\n        return 0;\n      }\n      k += (uint16_t) (m + 4);\n    }\n    j += (uint16_t) (n + 4);\n  }\nfail:\n  mg_error(c, \"bad client hello\");\n  return -1;\n}\n\n#define PLACEHOLDER_8B 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'\n#define PLACEHOLDER_16B PLACEHOLDER_8B, PLACEHOLDER_8B\n#define PLACEHOLDER_32B PLACEHOLDER_16B, PLACEHOLDER_16B\n\n// put ServerHello record into wio buffer\nstatic bool mg_tls_server_send_hello(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  struct mg_iobuf *wio = &tls->send;\n\n  // clang-format off\n  uint8_t msg_server_hello[122] = {\n      // server hello, tls 1.2\n      0x02, 0x00, 0x00, 0x76, 0x03, 0x03,\n      // random (32 bytes)\n      PLACEHOLDER_32B,\n      // session ID length + session ID (32 bytes)\n      0x20, PLACEHOLDER_32B,\n#if MG_ENABLE_CHACHA20\n      // TLS_CHACHA20_POLY1305_SHA256 + no compression\n      0x13, 0x03, 0x00,\n#else\n      // TLS_AES_128_GCM_SHA256 + no compression\n      0x13, 0x01, 0x00,\n#endif\n      // extensions + keyshare\n      0x00, 0x2e, 0x00, 0x33, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x20,\n      // x25519 keyshare\n      PLACEHOLDER_32B,\n      // supported versions (tls1.3 == 0x304)\n      0x00, 0x2b, 0x00, 0x02, 0x03, 0x04};\n  // clang-format on\n\n  // calculate keyshare\n  uint8_t x25519_pub[X25519_BYTES];\n  uint8_t x25519_prv[X25519_BYTES];\n  if (!mg_random(x25519_prv, sizeof(x25519_prv))) mg_error(c, \"RNG\");\n  mg_tls_x25519(x25519_pub, x25519_prv, X25519_BASE_POINT, 1);\n  mg_tls_x25519(tls->x25519_sec, x25519_prv, tls->x25519_cli, 1);\n  mg_tls_hexdump(\"s x25519 sec\", tls->x25519_sec, sizeof(tls->x25519_sec));\n\n  // fill in the gaps: random + session ID + keyshare\n  memmove(msg_server_hello + 6, tls->random, sizeof(tls->random));\n  memmove(msg_server_hello + 39, tls->session_id, sizeof(tls->session_id));\n  memmove(msg_server_hello + 84, x25519_pub, sizeof(x25519_pub));\n\n  // server hello message\n  if (mg_iobuf_add(wio, wio->len, \"\\x16\\x03\\x03\\x00\\x7a\", 5) == 0 ||\n      mg_iobuf_add(wio, wio->len, msg_server_hello, sizeof(msg_server_hello)) ==\n          0)\n    return false;\n  mg_sha256_update(&tls->sha256, msg_server_hello, sizeof(msg_server_hello));\n\n  // change cipher message\n  if (mg_iobuf_add(wio, wio->len, \"\\x14\\x03\\x03\\x00\\x01\\x01\", 6) == 0)\n    return false;\n  return true;\n}\n\nstatic bool mg_tls_server_send_ext(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  // server extensions\n  uint8_t ext[6] = {0x08, 0, 0, 2, 0, 0};\n  mg_sha256_update(&tls->sha256, ext, sizeof(ext));\n  return mg_tls_encrypt(c, ext, sizeof(ext), MG_TLS_HANDSHAKE);\n}\n\n// signature algorithms we actually support:\n// rsa_pkcs1_sha256, rsa_pss_rsae_sha256 and ecdsa_secp256r1_sha256\nstatic const uint8_t secp256r1_sig_algs[12] = {\n    0x00, 0x0d, 0x00, 0x08, 0x00, 0x06, 0x04, 0x03, 0x08, 0x04, 0x04, 0x01};\n\nstatic bool mg_tls_server_send_cert_request(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  uint8_t req[13 + sizeof(secp256r1_sig_algs)];\n  req[0] = MG_TLS_CERTIFICATE_REQUEST;  // handshake header\n  MG_STORE_BE24(req + 1, 9 + sizeof(secp256r1_sig_algs));\n  req[4] = 0;                                              // context length\n  MG_STORE_BE16(req + 5, 6 + sizeof(secp256r1_sig_algs));  // extensions length\n  MG_STORE_BE16(req + 7, 13);  // \"signature algorithms\"\n  MG_STORE_BE16(req + 9, 2 + sizeof(secp256r1_sig_algs));  // length\n  MG_STORE_BE16(\n      req + 11,\n      sizeof(secp256r1_sig_algs));  // signature hash algorithms length\n  memcpy(req + 13, (uint8_t *) secp256r1_sig_algs, sizeof(secp256r1_sig_algs));\n  mg_sha256_update(&tls->sha256, req, sizeof(req));\n  return mg_tls_encrypt(c, req, sizeof(req), MG_TLS_HANDSHAKE);\n}\n\nstatic bool mg_tls_send_cert(struct mg_connection *c, bool is_client) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  int send_ca = !is_client && tls->ca_der.len > 0;\n  // DER certificate + CA (server optional)\n  size_t i, offset, total_size = tls->cert_der.len + 5;\n  uint8_t *cert;\n  bool res = false;\n  for (i = 1; i < tls->chain_len; i++) {\n    total_size += tls->chain_der[i].len + 5;\n  }\n  if (send_ca) {\n    total_size += tls->ca_der.len + 5;\n  }\n  cert = (uint8_t *) mg_calloc(1, 13 + total_size);\n  if (cert == NULL) return res;\n  cert[0] = MG_TLS_CERTIFICATE;  // handshake header\n  MG_STORE_BE24(cert + 1, total_size + 4);\n  cert[4] = 0;                          // request context\n  MG_STORE_BE24(cert + 5, total_size);  // 3 bytes: cert (s) length\n  offset = 8;\n  MG_STORE_BE24(cert + offset, tls->cert_der.len);  // 3 bytes: first cert len\n  offset += 3;\n  // bytes 11+ are certificate in DER format\n  memmove(cert + offset, tls->cert_der.buf, tls->cert_der.len);\n  offset += tls->cert_der.len;\n  MG_STORE_BE16(cert + offset, 0);  // certificate extensions (none)\n  offset += 2;\n  for (i = 1; i < tls->chain_len; i++) {\n    MG_STORE_BE24(cert + offset, tls->chain_der[i].len);\n    offset += 3;\n    memmove(cert + offset, tls->chain_der[i].buf, tls->chain_der[i].len);\n    offset += tls->chain_der[i].len;\n    MG_STORE_BE16(cert + offset, 0);  // certificate extensions (none)\n    offset += 2;\n  }\n  if (send_ca) {\n    MG_STORE_BE24(cert + offset, tls->ca_der.len);  // 3 bytes: CA cert length\n    offset += 3;\n    memmove(cert + offset, tls->ca_der.buf,\n            tls->ca_der.len);  // CA cert data\n    offset += tls->ca_der.len;\n    MG_STORE_BE16(cert + offset, 0);  // certificate extensions (none)\n    offset += 2;\n  }\n  mg_sha256_update(&tls->sha256, cert, offset);\n  res = mg_tls_encrypt(c, cert, offset, MG_TLS_HANDSHAKE);\n  mg_free(cert);\n  return res;\n}\n\n// type adapter between uECC hash context and our sha256 implementation\ntypedef struct SHA256_HashContext {\n  MG_UECC_HashContext uECC;\n  mg_sha256_ctx ctx;\n} SHA256_HashContext;\n\nstatic void init_SHA256(const MG_UECC_HashContext *base) {\n  SHA256_HashContext *c = (SHA256_HashContext *) base;\n  mg_sha256_init(&c->ctx);\n}\n\nstatic void update_SHA256(const MG_UECC_HashContext *base,\n                          const uint8_t *message, unsigned message_size) {\n  SHA256_HashContext *c = (SHA256_HashContext *) base;\n  mg_sha256_update(&c->ctx, message, message_size);\n}\nstatic void finish_SHA256(const MG_UECC_HashContext *base,\n                          uint8_t *hash_result) {\n  SHA256_HashContext *c = (SHA256_HashContext *) base;\n  mg_sha256_final(hash_result, &c->ctx);\n}\n\nstatic void mg_tls_mgf1(uint8_t *mask, size_t mask_len, const uint8_t *seed,\n                        size_t seed_len) {\n  uint32_t counter = 0;\n  size_t chunk, chunk_len, generated = 0;\n  while (generated < mask_len) {\n    mg_sha256_ctx ctx;\n    uint8_t digest[32];\n    uint8_t ctr[4];\n    ctr[0] = (uint8_t) (counter >> 24);\n    ctr[1] = (uint8_t) (counter >> 16);\n    ctr[2] = (uint8_t) (counter >> 8);\n    ctr[3] = (uint8_t) counter;\n    mg_sha256_init(&ctx);\n    mg_sha256_update(&ctx, seed, seed_len);\n    mg_sha256_update(&ctx, ctr, sizeof(ctr));\n    mg_sha256_final(digest, &ctx);\n    chunk_len = mask_len - generated;\n    chunk = (chunk_len < sizeof(digest) ? chunk_len : sizeof(digest));\n    memmove(mask + generated, digest, chunk);\n    generated += chunk;\n    counter++;\n  }\n}\n\nstatic unsigned int mg_tls_rsa_bits(const struct mg_str *n) {\n  size_t i = 0;\n  unsigned int bits = 0;\n  while (i < n->len && n->buf[i] == 0) i++;\n  if (i == n->len) return 0;\n  bits = (unsigned int) ((n->len - i) * 8);\n  {\n    uint8_t byte = (uint8_t) n->buf[i];\n    while ((byte & 0x80U) == 0) {\n      bits--;\n      byte = (uint8_t) (byte << 1);\n    }\n  }\n  return bits;\n}\n\nstatic bool mg_tls_pss_encode(const uint8_t *hash, size_t hashlen,\n                              const struct mg_str *n, uint8_t *em) {\n  size_t emlen = n->len, saltlen = hashlen, dblen, pslen, i;\n  uint8_t salt[64];   // Max salt size for any reasonable hash\n  uint8_t m[136];     // 8 + max hash (64) + max salt (64) = 136\n  uint8_t H[64];      // Max hash size\n  uint8_t DB[512];    // Max for 4096-bit RSA\n  uint8_t mask[512];  // Max for 4096-bit RSA\n  mg_sha256_ctx ctx;\n\n  // Check bounds\n  if (saltlen > sizeof(salt) || (8 + hashlen + saltlen) > sizeof(m) ||\n      hashlen > sizeof(H) || emlen > sizeof(DB)) {\n    MG_ERROR((\"RSA key too large for static buffers\"));\n    return false;\n  }\n  if (emlen < hashlen + saltlen + 2) {\n    return false;\n  }\n  if (!mg_random(salt, saltlen)) {\n    return false;\n  }\n  MG_VERBOSE((\"PSS salt: %M\", mg_print_hex, saltlen, salt));\n\n  // Build m = 8 zero bytes || hash || salt\n  memset(m, 0, 8);\n  memcpy(m + 8, hash, hashlen);\n  memcpy(m + 8 + hashlen, salt, saltlen);\n  mg_sha256_init(&ctx);\n  mg_sha256_update(&ctx, m, 8 + hashlen + saltlen);\n  mg_sha256_final(H, &ctx);\n  MG_VERBOSE((\"PSS H: %M\", mg_print_hex, hashlen, H));\n\n  dblen = emlen - hashlen - 1;\n  pslen = emlen - hashlen - saltlen - 2;\n\n  // Build DB = PS || 0x01 || salt\n  memset(DB, 0, pslen);\n  DB[pslen] = 0x01;\n  memcpy(DB + pslen + 1, salt, saltlen);\n\n  // Generate mask and apply to DB\n  mg_tls_mgf1(mask, dblen, H, hashlen);\n  for (i = 0; i < dblen; i++) DB[i] ^= mask[i];\n\n  {\n    // PSS standard: emBits = modulus_bit_length - 1\n    unsigned rsa_bits = mg_tls_rsa_bits(n);\n    unsigned embits = rsa_bits - 1;\n    unsigned unused = (unsigned) (8 * emlen - embits);\n    MG_VERBOSE((\"RSA modulus bits: %u, emBits: %u, emlen: %zu, unused: %u\",\n                rsa_bits, embits, emlen, unused));\n    if (unused > 0 && unused < 8) {\n      uint8_t mask_byte = (uint8_t) (0xff >> unused);\n      MG_VERBOSE((\"Applying mask 0x%02x to first byte (was 0x%02x)\", mask_byte,\n                  DB[0]));\n      DB[0] &= mask_byte;\n      MG_VERBOSE((\"First byte after mask: 0x%02x\", DB[0]));\n    }\n  }\n\n  // Build final em = maskedDB || H || 0xbc\n  memcpy(em, DB, dblen);\n  memcpy(em + dblen, H, hashlen);\n  em[emlen - 1] = 0xbc;\n  return true;\n}\n\nstatic bool mg_tls_rsa_sign(struct tls_data *tls, const uint8_t *em,\n                            size_t emlen, uint8_t *sig) {\n  size_t nlen;\n  int crt_result;\n#if MG_TLS_RSA_USE_CRT\n  // RSA CRT (Chinese Remainder Theorem) optimization:\n  // s1 = em^dP mod p\n  // s2 = em^dQ mod q\n  // h = qInv * (s1 - s2) mod p\n  // s = s2 + h * q\n\n  if (tls->rsa.p.len == 0 || tls->rsa.q.len == 0 || tls->rsa.dP.len == 0 ||\n      tls->rsa.dQ.len == 0 || tls->rsa.qInv.len == 0) {\n    MG_ERROR((\"CRT parameters missing, cannot use CRT optimization\"));\n    return false;\n  }\n\n  MG_VERBOSE((\"Using RSA-CRT optimization\"));\n\n  nlen = tls->rsa.n.len;\n\n  crt_result = mg_rsa_crt_sign(\n      em, emlen, (const uint8_t *) tls->rsa.dP.buf, tls->rsa.dP.len,\n      (const uint8_t *) tls->rsa.dQ.buf, tls->rsa.dQ.len,\n      (const uint8_t *) tls->rsa.p.buf, tls->rsa.p.len,\n      (const uint8_t *) tls->rsa.q.buf, tls->rsa.q.len,\n      (const uint8_t *) tls->rsa.qInv.buf, tls->rsa.qInv.len, sig, nlen);\n\n  if (crt_result == 0) {\n    MG_VERBOSE((\"CRT signature successful (first 4 bytes): %02x %02x %02x %02x\",\n                sig[0], sig[1], sig[2], sig[3]));\n    MG_VERBOSE((\"CRT signature successful (last 4 bytes): %02x %02x %02x %02x\",\n                sig[nlen - 4], sig[nlen - 3], sig[nlen - 2], sig[nlen - 1]));\n    return true;\n  } else {\n    MG_ERROR((\"CRT signing failed\"));\n    return false;\n  }\n#else\n  int ret;\n  // Standard RSA: s = em^d mod n\n  memset(sig, 0, tls->rsa.n.len);\n  ret = mg_rsa_mod_pow((const uint8_t *) tls->rsa.n.buf, tls->rsa.n.len,\n                       (const uint8_t *) tls->rsa.d.buf, tls->rsa.d.len, em,\n                       emlen, sig, tls->rsa.n.len);\n  if (ret == 0) {\n    MG_VERBOSE((\"RSA signature first 4 bytes: %02x %02x %02x %02x\", sig[0],\n                sig[1], sig[2], sig[3]));\n    MG_VERBOSE((\"RSA signature last 4 bytes: %02x %02x %02x %02x\",\n                sig[tls->rsa.n.len - 4], sig[tls->rsa.n.len - 3],\n                sig[tls->rsa.n.len - 2], sig[tls->rsa.n.len - 1]));\n  }\n  return ret == 0;\n#endif\n}\n\nstatic bool mg_tls_send_cert_verify(struct mg_connection *c, bool is_client) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  uint8_t hash[32] = {0};\n\n  mg_tls_calc_cert_verify_hash(c, (uint8_t *) hash, is_client);\n\n  if (tls->rsa.n.len > 0 && tls->rsa.d.len > 0) {\n    // RSA certificate verify packet\n    size_t emlen = tls->rsa.n.len;\n    size_t verifysz = 8U + emlen;\n    uint8_t em[512];      // Max for 4096-bit RSA\n    uint8_t verify[520];  // 8 + 512 max\n\n    // Check bounds\n    if (emlen > sizeof(em) || verifysz > sizeof(verify)) {\n      MG_ERROR((\"RSA key too large for static buffers\"));\n      return false;\n    }\n\n    if (!mg_tls_pss_encode(hash, sizeof(hash), &tls->rsa.n, em)) {\n      MG_ERROR((\"Failed PSS encode\"));\n      return false;\n    }\n\n    // Validate PSS encoded message format\n    if (em[emlen - 1] != 0xbc) {\n      MG_ERROR((\"Invalid PSS encoding: last byte is 0x%02x, expected 0xbc\",\n                em[emlen - 1]));\n      return false;\n    }\n\n    // Build verify packet header, then sign directly into the packet\n    verify[0] = 0x0f;\n    MG_STORE_BE24(verify + 1, emlen + 4);\n    MG_STORE_BE16(verify + 4, 0x0804);\n    MG_STORE_BE16(verify + 6, emlen);\n\n    // Sign directly into the verify buffer (verify + 8 = signature location)\n    memset(verify + 8, 0, emlen);  // Initialize signature area\n    if (!mg_tls_rsa_sign(tls, em, emlen, verify + 8)) {\n      MG_ERROR((\"Failed RSA sign\"));\n      return false;\n    }\n\n    MG_VERBOSE(\n        (\"PSS EM first 4: %02x %02x %02x %02x\", em[0], em[1], em[2], em[3]));\n    MG_VERBOSE((\"PSS EM last 4: %02x %02x %02x %02x\", em[emlen - 4],\n                em[emlen - 3], em[emlen - 2], em[emlen - 1]));\n\n    mg_sha256_update(&tls->sha256, verify, verifysz);\n    return mg_tls_encrypt(c, verify, verifysz, MG_TLS_HANDSHAKE);\n  } else {\n    // EC certificate verify packet\n    uint8_t verify[82] = {0x0f, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00};\n    uint8_t tmp[2 * 32 + 64] = {0};\n    struct SHA256_HashContext ctx = {\n        {&init_SHA256, &update_SHA256, &finish_SHA256, 64, 32, tmp},\n        {{0}, 0, 0, {0}}};\n    size_t sigsz, verifysz = 0;\n    int neg1, neg2;\n    uint8_t sig[64] = {0};\n    mg_uecc_sign_deterministic(tls->ec_key, hash, sizeof(hash), &ctx.uECC, sig,\n                               mg_uecc_secp256r1());\n\n    neg1 = !!(sig[0] & 0x80);\n    neg2 = !!(sig[32] & 0x80);\n    verify[8] = 0x30;  // ASN.1 SEQUENCE\n    verify[9] = (uint8_t) (68 + neg1 + neg2);\n    verify[10] = 0x02;  // ASN.1 INTEGER\n    verify[11] = (uint8_t) (32 + neg1);\n    memmove(verify + 12 + neg1, sig, 32);\n    verify[12 + 32 + neg1] = 0x02;  // ASN.1 INTEGER\n    verify[13 + 32 + neg1] = (uint8_t) (32 + neg2);\n    memmove(verify + 14 + 32 + neg1 + neg2, sig + 32, 32);\n\n    sigsz = (size_t) (70 + neg1 + neg2);\n    verifysz = 8U + sigsz;\n    verify[3] = (uint8_t) (sigsz + 4);\n    verify[7] = (uint8_t) sigsz;\n\n    mg_sha256_update(&tls->sha256, verify, verifysz);\n    return mg_tls_encrypt(c, verify, verifysz, MG_TLS_HANDSHAKE);\n  }\n}\n\nstatic bool mg_tls_server_send_finish(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  mg_sha256_ctx sha256;\n  uint8_t hash[32];\n  uint8_t finish[36] = {0x14, 0, 0, 32};\n  memmove(&sha256, &tls->sha256, sizeof(mg_sha256_ctx));\n  mg_sha256_final(hash, &sha256);\n  mg_hmac_sha256(finish + 4, tls->enc.server_finished_key, 32, hash, 32);\n  if (!mg_tls_encrypt(c, finish, sizeof(finish), MG_TLS_HANDSHAKE))\n    return false;\n  mg_sha256_update(&tls->sha256, finish, sizeof(finish));\n  return true;\n}\n\nstatic int mg_tls_server_recv_finish(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf;\n  // we have to backup sha256 value to restore it later, since Finished record\n  // is exceptional and is not supposed to be added to the rolling hash\n  // calculation.\n  mg_sha256_ctx sha256 = tls->sha256;\n  if (mg_tls_recv_record(c) < 0) {\n    return -1;\n  }\n  recv_buf = &c->rtls.buf[tls->recv_offset];\n  if (recv_buf[0] != MG_TLS_FINISHED) {\n    mg_error(c, \"expected Finish but got msg 0x%02x\", recv_buf[0]);\n    return -1;\n  }\n  mg_tls_drop_message(c);\n\n  // restore hash\n  tls->sha256 = sha256;\n  return 0;\n}\n\nstatic bool mg_tls_client_send_hello(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  struct mg_iobuf *wio = &tls->send;\n\n  uint8_t x25519_pub[X25519_BYTES];\n\n  // - \"signature algorithms we actually support\", see above\n  //   uint8_t secp256r1_sig_algs[]\n  // - all popular signature algorithms (if we don't care about verification)\n  uint8_t all_sig_algs[34] = {\n      0x00, 0x0d, 0x00, 0x1e, 0x00, 0x1c, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03,\n      0x08, 0x07, 0x08, 0x08, 0x08, 0x09, 0x08, 0x0a, 0x08, 0x0b, 0x08, 0x04,\n      0x08, 0x05, 0x08, 0x06, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01};\n  uint8_t server_name_ext[9] = {0x00, 0x00, 0x00, 0xfe, 0x00,\n                                0xfe, 0x00, 0x00, 0xfe};\n\n  // clang-format off\n  uint8_t msg_client_hello[145] = {\n      // TLS Client Hello header reported as TLS1.2 (5)\n      0x16, 0x03, 0x03, 0x00, 0xfe,\n      // client hello, tls 1.2 (6)\n      0x01, 0x00, 0x00, 0x8c, 0x03, 0x03,\n      // random (32 bytes)\n      PLACEHOLDER_32B,\n      // session ID length + session ID (32 bytes)\n      0x20, PLACEHOLDER_32B, 0x00,\n      0x02,  // size = 2 bytes\n#if MG_ENABLE_CHACHA20\n      // TLS_CHACHA20_POLY1305_SHA256\n      0x13, 0x03,\n#else\n      // TLS_AES_128_GCM_SHA256\n      0x13, 0x01,\n#endif\n      // no compression\n      0x01, 0x00,\n      // extensions + keyshare\n      0x00, 0xfe,\n      // x25519 keyshare\n      0x00, 0x33, 0x00, 0x26, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x20,\n      PLACEHOLDER_32B,\n      // supported groups (x25519)\n      0x00, 0x0a, 0x00, 0x04, 0x00, 0x02, 0x00, 0x1d,\n      // supported versions (tls1.3 == 0x304)\n      0x00, 0x2b, 0x00, 0x03, 0x02, 0x03, 0x04,\n      // session ticket (none)\n      0x00, 0x23, 0x00, 0x00, // 144 bytes till here\n\t};\n  // clang-format on\n  const char *hostname = tls->hostname;\n  size_t hostnamesz = strlen(tls->hostname);\n  size_t hostname_extsz = hostnamesz ? hostnamesz + 9 : 0;\n  uint8_t *sig_alg =\n      tls->skip_verification ? all_sig_algs : (uint8_t *) secp256r1_sig_algs;\n  size_t sig_alg_sz = tls->skip_verification ? sizeof(all_sig_algs)\n                                             : sizeof(secp256r1_sig_algs);\n\n  // patch ClientHello with correct hostname ext length (if any)\n  MG_STORE_BE16(msg_client_hello + 3,\n                hostname_extsz + 183 - 9 - 34 + sig_alg_sz);\n  MG_STORE_BE16(msg_client_hello + 7,\n                hostname_extsz + 179 - 9 - 34 + sig_alg_sz);\n  MG_STORE_BE16(msg_client_hello + 82,\n                hostname_extsz + 104 - 9 - 34 + sig_alg_sz);\n\n  if (hostnamesz > 0) {\n    MG_STORE_BE16(server_name_ext + 2, hostnamesz + 5);\n    MG_STORE_BE16(server_name_ext + 4, hostnamesz + 3);\n    MG_STORE_BE16(server_name_ext + 7, hostnamesz);\n  }\n\n  // calculate keyshare\n  if (!mg_random(tls->x25519_cli, sizeof(tls->x25519_cli))) mg_error(c, \"RNG\");\n  mg_tls_x25519(x25519_pub, tls->x25519_cli, X25519_BASE_POINT, 1);\n\n  // fill in the gaps: random + session ID + keyshare\n  if (!mg_random(tls->session_id, sizeof(tls->session_id))) mg_error(c, \"RNG\");\n  if (!mg_random(tls->random, sizeof(tls->random))) mg_error(c, \"RNG\");\n  memmove(msg_client_hello + 11, tls->random, sizeof(tls->random));\n  memmove(msg_client_hello + 44, tls->session_id, sizeof(tls->session_id));\n  memmove(msg_client_hello + 94, x25519_pub, sizeof(x25519_pub));\n\n  // client hello message\n  if (mg_iobuf_add(wio, wio->len, msg_client_hello, sizeof(msg_client_hello)) ==\n      0)\n    return false;\n  mg_sha256_update(&tls->sha256, msg_client_hello + 5,\n                   sizeof(msg_client_hello) - 5);\n  if (mg_iobuf_add(wio, wio->len, sig_alg, sig_alg_sz) == 0) return false;\n  mg_sha256_update(&tls->sha256, sig_alg, sig_alg_sz);\n  if (hostnamesz > 0) {\n    if (mg_iobuf_add(wio, wio->len, server_name_ext, sizeof(server_name_ext)) ==\n            0 ||\n        mg_iobuf_add(wio, wio->len, hostname, hostnamesz) == 0)\n      return false;\n    mg_sha256_update(&tls->sha256, server_name_ext, sizeof(server_name_ext));\n    mg_sha256_update(&tls->sha256, (uint8_t *) hostname, hostnamesz);\n  }\n\n  // change cipher message\n  if (mg_iobuf_add(wio, wio->len, (const char *) \"\\x14\\x03\\x03\\x00\\x01\\x01\",\n                   6) == 0)\n    return false;\n  return true;\n}\n\nstatic int mg_tls_client_recv_hello(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  struct mg_iobuf *rio = &c->rtls;\n  uint16_t msgsz;\n  uint8_t *ext;\n  uint16_t ext_len;\n  int j;\n\n  if (!mg_tls_got_record(c)) {\n    return MG_IO_WAIT;\n  }\n  if (rio->buf[0] != MG_TLS_HANDSHAKE || rio->buf[5] != MG_TLS_SERVER_HELLO) {\n    if (rio->buf[0] == MG_TLS_ALERT && rio->len >= 7) {\n      mg_error(c, \"tls alert %d\", rio->buf[6]);\n      return -1;\n    }\n    MG_INFO((\"got packet type 0x%02x/0x%02x\", rio->buf[0], rio->buf[5]));\n    mg_error(c, \"not a server hello packet\");\n    return -1;\n  }\n\n  msgsz = MG_LOAD_BE16(rio->buf + 3);\n  mg_sha256_update(&tls->sha256, rio->buf + 5, msgsz);\n\n  ext_len = MG_LOAD_BE16(rio->buf + 5 + 39 + 32 + 3);\n  ext = rio->buf + 5 + 39 + 32 + 3 + 2;\n  if (ext_len > (rio->len - (5 + 39 + 32 + 3 + 2))) goto fail;\n\n  for (j = 0; j < ext_len;) {\n    uint16_t ext_type = MG_LOAD_BE16(ext + j);\n    uint16_t ext_len2 = MG_LOAD_BE16(ext + j + 2);\n    uint16_t group;\n    uint8_t *key_exchange;\n    uint16_t key_exchange_len;\n    if (ext_len2 > (ext_len - j - 4)) goto fail;\n    if (ext_type != 0x0033) {  // not a key share extension, ignore\n      j += (uint16_t) (ext_len2 + 4);\n      continue;\n    }\n    group = MG_LOAD_BE16(ext + j + 4);\n    if (group != 0x001d) {\n      mg_error(c, \"bad key exchange group\");\n      return -1;\n    }\n    key_exchange_len = MG_LOAD_BE16(ext + j + 6);\n    key_exchange = ext + j + 8;\n    if (key_exchange_len != 32) {\n      mg_error(c, \"bad key exchange length\");\n      return -1;\n    }\n    mg_tls_x25519(tls->x25519_sec, tls->x25519_cli, key_exchange, 1);\n    mg_tls_hexdump(\"c x25519 sec\", tls->x25519_sec, 32);\n    mg_tls_drop_record(c);\n    /* generate handshake keys */\n    mg_tls_generate_handshake_keys(c);\n    return 0;\n  }\nfail:\n  mg_error(c, \"bad server hello\");\n  return -1;\n}\n\nstatic int mg_tls_client_recv_ext(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf;\n  if (mg_tls_recv_record(c) < 0) {\n    return -1;\n  }\n  recv_buf = &c->rtls.buf[tls->recv_offset];\n  if (recv_buf[0] != MG_TLS_ENCRYPTED_EXTENSIONS) {\n    mg_error(c, \"expected server extensions but got msg 0x%02x\", recv_buf[0]);\n    return -1;\n  }\n  mg_tls_drop_message(c);\n  return 0;\n}\n\nstruct mg_tls_cert {\n  int is_ec_pubkey;\n  struct mg_str sn;\n  struct mg_str pubkey;\n  struct mg_der_tlv subj;\n  struct mg_str sig;    // signature\n  uint8_t tbshash[48];  // 32b for sha256/secp256, 48b for sha384/secp384\n  size_t tbshashsz;     // actual TBS hash size\n};\n\nstatic void mg_der_debug_cert_name(const char *name, struct mg_der_tlv *tlv) {\n  struct mg_der_tlv v;\n  struct mg_str cn, c, o, ou;\n  cn = c = o = ou = mg_str(\"\");\n  if (mg_der_find_oid(tlv, (uint8_t *) \"\\x55\\x04\\x03\", 3, &v))\n    cn = mg_str_n((const char *) v.value, v.len);\n  if (mg_der_find_oid(tlv, (uint8_t *) \"\\x55\\x04\\x06\", 3, &v))\n    c = mg_str_n((const char *) v.value, v.len);\n  if (mg_der_find_oid(tlv, (uint8_t *) \"\\x55\\x04\\x0a\", 3, &v))\n    o = mg_str_n((const char *) v.value, v.len);\n  if (mg_der_find_oid(tlv, (uint8_t *) \"\\x55\\x04\\x0b\", 3, &v))\n    ou = mg_str_n((const char *) v.value, v.len);\n  MG_VERBOSE((\"%s: CN=%.*s, C=%.*s, O=%.*s, OU=%.*s\", name, cn.len, cn.buf,\n              c.len, c.buf, o.len, o.buf, ou.len, ou.buf));\n}\n\nstatic int mg_tls_parse_cert_der(void *buf, size_t dersz,\n                                 struct mg_tls_cert *cert) {\n  uint8_t *tbs, *der = (uint8_t *) buf;\n  size_t tbssz;\n  struct mg_der_tlv root, tbs_cert, field, algo;  // pubkey, signature;\n  struct mg_der_tlv pki, pki_algo, pki_key, pki_curve, raw_sig;\n\n  // Parse outermost SEQUENCE\n  if (mg_der_parse(der, dersz, &root) <= 0 || root.type != 0x30) return -1;\n\n  // Parse TBSCertificate SEQUENCE\n  tbs = root.value;\n  if (mg_der_next(&root, &tbs_cert) <= 0 || tbs_cert.type != 0x30) return -1;\n  tbssz = (size_t) (tbs_cert.value + tbs_cert.len - tbs);\n\n  // Parse Version (optional field)\n  if (mg_der_next(&tbs_cert, &field) <= 0) return -1;\n  if (field.type == 0xa0) {  // v3\n    if (mg_der_parse(field.value, field.len, &field) <= 0 || field.len != 1 ||\n        field.value[0] != 2)\n      return -1;\n    if (mg_der_next(&tbs_cert, &field) <= 0) return -1;\n  }\n\n  // Parse Serial Number\n  if (field.type != 2) return -1;\n  cert->sn = mg_str_n((char *) field.value, field.len);\n  MG_VERBOSE((\"cert s/n: %M\", mg_print_hex, cert->sn.len, cert->sn.buf));\n\n  // Parse signature algorithm (first occurrence)\n  if (mg_der_next(&tbs_cert, &field) <= 0 || field.type != 0x30) return -1;\n  if (mg_der_next(&field, &algo) <= 0 || algo.type != 0x06) return -1;\n\n  MG_VERBOSE((\"sig algo (oid): %M\", mg_print_hex, algo.len, algo.value));\n  // Signature algorithm OID mapping\n  if (algo.len == 8 &&\n      memcmp(algo.value, \"\\x2A\\x86\\x48\\xCE\\x3D\\x04\\x03\\x02\", 8) == 0) {\n    MG_VERBOSE((\"sig algo: ECDSA with SHA256\"));\n    mg_sha256(cert->tbshash, tbs, tbssz);\n    cert->tbshashsz = 32;\n  } else if (algo.len == 9 &&\n             memcmp(algo.value, \"\\x2A\\x86\\x48\\x86\\xF7\\x0D\\x01\\x01\\x0B\", 9) ==\n                 0) {\n    MG_VERBOSE((\"sig algo: RSA with SHA256\"));\n    mg_sha256(cert->tbshash, tbs, tbssz);\n    cert->tbshashsz = 32;\n  } else if (algo.len == 8 &&\n             memcmp(algo.value, \"\\x2A\\x86\\x48\\xCE\\x3D\\x04\\x03\\x03\", 8) == 0) {\n    MG_VERBOSE((\"sig algo: ECDSA with SHA384\"));\n    mg_sha384(cert->tbshash, tbs, tbssz);\n    cert->tbshashsz = 48;\n  } else if (algo.len == 9 &&\n             memcmp(algo.value, \"\\x2A\\x86\\x48\\x86\\xF7\\x0D\\x01\\x01\\x0C\", 9) ==\n                 0) {\n    MG_VERBOSE((\"sig algo: RSA with SHA384\"));\n    mg_sha384(cert->tbshash, tbs, tbssz);\n    cert->tbshashsz = 48;\n  } else {\n    MG_ERROR(\n        (\"sig algo: unsupported OID: %M\", mg_print_hex, algo.len, algo.value));\n    return -1;\n  }\n  MG_VERBOSE((\"tbs hash: %M\", mg_print_hex, cert->tbshashsz, cert->tbshash));\n\n  // issuer\n  if (mg_der_next(&tbs_cert, &field) <= 0 || field.type != 0x30) return -1;\n  mg_der_debug_cert_name(\"issuer\", &field);\n\n  // validity dates (before/after)\n  if (mg_der_next(&tbs_cert, &field) <= 0 || field.type != 0x30) return -1;\n  if (1) {\n    struct mg_der_tlv before, after;\n    mg_der_next(&field, &before);\n    mg_der_next(&field, &after);\n    if (after.len == 13 && memcmp(after.value, \"250101000000Z\", 13) < 0) {\n      MG_ERROR((\"invalid validity dates: before=%M after=%M\", mg_print_hex,\n                before.len, before.value, mg_print_hex, after.len,\n                after.value));\n      return -1;\n    }\n  }\n\n  // subject\n  if (mg_der_next(&tbs_cert, &field) <= 0 || field.type != 0x30) return -1;\n  cert->subj = field;\n  mg_der_debug_cert_name(\"subject\", &field);\n\n  // subject public key info\n  if (mg_der_next(&tbs_cert, &field) <= 0 || field.type != 0x30) return -1;\n\n  if (mg_der_next(&field, &pki) <= 0 || pki.type != 0x30) return -1;\n  if (mg_der_next(&pki, &pki_algo) <= 0 || pki_algo.type != 0x06) return -1;\n\n  // public key algorithm\n  MG_VERBOSE((\"pk algo (oid): %M\", mg_print_hex, pki_algo.len, pki_algo.value));\n  if (pki_algo.len == 8 &&\n      memcmp(pki_algo.value, \"\\x2A\\x86\\x48\\xCE\\x3D\\x03\\x01\\x07\", 8) == 0) {\n    cert->is_ec_pubkey = 1;\n    MG_VERBOSE((\"pk algo: ECDSA secp256r1\"));\n  } else if (pki_algo.len == 8 &&\n             memcmp(pki_algo.value, \"\\x2A\\x86\\x48\\xCE\\x3D\\x03\\x01\\x08\", 8) ==\n                 0) {\n    cert->is_ec_pubkey = 1;\n    MG_VERBOSE((\"pk algo: ECDSA secp384r1\"));\n  } else if (pki_algo.len == 7 &&\n             memcmp(pki_algo.value, \"\\x2A\\x86\\x48\\xCE\\x3D\\x02\\x01\", 7) == 0) {\n    cert->is_ec_pubkey = 1;\n    MG_VERBOSE((\"pk algo: EC public key\"));\n  } else if (pki_algo.len == 9 &&\n             memcmp(pki_algo.value, \"\\x2A\\x86\\x48\\x86\\xF7\\x0D\\x01\\x01\\x01\",\n                    9) == 0) {\n    cert->is_ec_pubkey = 0;\n    MG_VERBOSE((\"pk algo: RSA\"));\n  } else {\n    MG_ERROR((\"unsupported pk algo: %M\", mg_print_hex, pki_algo.len,\n              pki_algo.value));\n    return -1;\n  }\n\n  // Parse public key\n  if (cert->is_ec_pubkey) {\n    if (mg_der_next(&pki, &pki_curve) <= 0 || pki_curve.type != 0x06) return -1;\n  }\n  if (mg_der_next(&field, &pki_key) <= 0 || pki_key.type != 0x03) return -1;\n\n  if (cert->is_ec_pubkey) {  // Skip leading 0x00 and 0x04 (=uncompressed)\n    cert->pubkey = mg_str_n((char *) pki_key.value + 2, pki_key.len - 2);\n  } else {  // Skip leading 0x00 byte\n    cert->pubkey = mg_str_n((char *) pki_key.value + 1, pki_key.len - 1);\n  }\n\n  // Parse signature\n  if (mg_der_next(&root, &field) <= 0 || field.type != 0x30) return -1;\n  if (mg_der_next(&root, &raw_sig) <= 0 || raw_sig.type != 0x03) return -1;\n  if (raw_sig.len < 1 || raw_sig.value[0] != 0x00) return -1;\n\n  cert->sig = mg_str_n((char *) raw_sig.value + 1, raw_sig.len - 1);\n  MG_VERBOSE((\"sig: %M\", mg_print_hex, cert->sig.len, cert->sig.buf));\n\n  return 0;\n}\n\nstatic int mg_tls_verify_cert_san(const uint8_t *der, size_t dersz,\n                                  const char *server_name,\n                                  struct mg_addr *server_ip) {\n  struct mg_der_tlv root, field, name;\n  if (mg_der_parse((uint8_t *) der, dersz, &root) < 0) {\n    MG_ERROR((\"failed to parse certificate\"));\n    return -1;\n  }\n  if (mg_der_find_oid(&root, (uint8_t *) \"\\x55\\x1d\\x11\", 3, &field) <= 0) {\n    MG_ERROR((\"failed to extract SAN\"));\n    return -1;\n  }\n  if (mg_der_parse(field.value, field.len, &field) < 0) {\n    MG_ERROR((\"SAN is not a constructed object\"));\n    return -1;\n  }\n  while (mg_der_next(&field, &name) > 0) {\n    if (name.type == 0x87 && name.len == 4) {  // this is an IPv4 address\n      MG_VERBOSE((\"Found SAN, IP: %M\", mg_print_ip4, name.value));\n      if (!server_ip->is_ip6 &&\n          *((uint32_t *) name.value) == server_ip->addr.ip4)\n        return 1;  // and matches the one we're connected to\n    } else {       // this is a text SAN\n      MG_VERBOSE((\"Found SAN, (%u): %.*s\", name.type, name.len, name.value));\n      if (mg_match(mg_str(server_name), mg_str_n((char *) name.value, name.len),\n                   NULL))\n        return 1;  // and matches the host name\n    }              // TODO(): add IPv6 comparison, more items ?\n  }\n  return -1;\n}\n\nstatic int mg_tls_verify_cert_signature(const struct mg_tls_cert *cert,\n                                        const struct mg_tls_cert *issuer) {\n  if (issuer->is_ec_pubkey) {\n    uint8_t sig[128];\n    struct mg_der_tlv seq = {0, 0, 0}, a = {0, 0, 0}, b = {0, 0, 0};\n    mg_der_parse((uint8_t *) cert->sig.buf, cert->sig.len, &seq);\n    mg_der_next(&seq, &a);\n    mg_der_next(&seq, &b);\n    if (a.len == 0 || b.len == 0) {\n      MG_ERROR((\"cert verification error\"));\n      return 0;\n    }\n    if (issuer->pubkey.len == 64) {\n      const uint32_t N = 32;\n      if (a.len > N) a.value += (a.len - N), a.len = N;\n      if (b.len > N) b.value += (b.len - N), b.len = N;\n      memmove(sig, a.value, N);\n      memmove(sig + N, b.value, N);\n      return mg_uecc_verify((uint8_t *) issuer->pubkey.buf, cert->tbshash,\n                            (unsigned) cert->tbshashsz, sig,\n                            mg_uecc_secp256r1());\n    } else if (issuer->pubkey.len == 96) {\n      MG_VERBOSE((\"ignore secp386 for now\"));\n      return 1;\n    } else {\n      MG_ERROR((\"unsupported public key length: %d\", issuer->pubkey.len));\n      return 0;\n    }\n  } else {\n    int r;\n    uint8_t sig2[256];  // 2048 bits\n    struct mg_der_tlv seq, modulus, exponent;\n    if (mg_der_parse((uint8_t *) issuer->pubkey.buf, issuer->pubkey.len,\n                     &seq) <= 0 ||\n        mg_der_next(&seq, &modulus) <= 0 || modulus.type != 2 ||\n        mg_der_next(&seq, &exponent) <= 0 || exponent.type != 2) {\n      return -1;\n    }\n    mg_rsa_mod_pow(modulus.value, modulus.len, exponent.value, exponent.len,\n                   (uint8_t *) cert->sig.buf, cert->sig.len, sig2,\n                   sizeof(sig2));\n\n    r = memcmp(sig2 + sizeof(sig2) - cert->tbshashsz, cert->tbshash,\n               cert->tbshashsz);\n    return r == 0;\n  }\n}\n\nstatic int mg_tls_verify_cert_cn(struct mg_der_tlv *subj, const char *host) {\n  struct mg_der_tlv v;\n  int matched = 0;\n  if (mg_der_find_oid(subj, (uint8_t *) \"\\x55\\x04\\x03\", 3, &v) > 0) {\n    MG_VERBOSE((\"using CN: %.*s <-> %s\", v.len, v.value, host));\n    matched = mg_match(mg_str(host), mg_str_n((char *) v.value, v.len), NULL);\n  }\n  return matched;\n}\n\nstatic int mg_tls_recv_cert(struct mg_connection *c, bool is_client) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf;\n\n  if (mg_tls_recv_record(c) < 0) {\n    return -1;\n  }\n\n  recv_buf = &c->rtls.buf[tls->recv_offset];\n\n  if (recv_buf[0] == MG_TLS_CERTIFICATE_REQUEST) {\n    MG_VERBOSE((\"got certificate request\"));\n    mg_tls_drop_message(c);\n    tls->cert_requested = 1;\n    return -1;\n  }\n\n  if (recv_buf[0] != MG_TLS_CERTIFICATE) {\n    mg_error(c, \"expected %s certificate but got msg 0x%02x\",\n             is_client ? \"server\" : \"client\", recv_buf[0]);\n    return -1;\n  }\n\n  if (tls->recv_len < 11) {\n    mg_error(c, \"certificate list too short\");\n    return -1;\n  }\n\n  {\n    // Normally, there are 2-3 certs in a chain (when is_client)\n    struct mg_tls_cert certs[8];\n    int certnum = 0;\n    uint32_t full_cert_chain_len = MG_LOAD_BE24(recv_buf + 1);\n    uint32_t cert_chain_len = MG_LOAD_BE24(recv_buf + 5);\n    uint8_t *p = recv_buf + 8;\n    uint8_t *endp = recv_buf + cert_chain_len;\n    bool found_ca = false;\n    struct mg_tls_cert ca;\n\n    if (cert_chain_len != full_cert_chain_len - 4) {\n      MG_ERROR((\"full chain length: %d, chain length: %d\", full_cert_chain_len,\n                cert_chain_len));\n      mg_error(c, \"certificate chain length mismatch\");\n      return -1;\n    }\n\n    memset(certs, 0, sizeof(certs));\n    memset(&ca, 0, sizeof(ca));\n\n    if (tls->ca_der.len > 0) {\n      if (mg_tls_parse_cert_der(tls->ca_der.buf, tls->ca_der.len, &ca) < 0) {\n        mg_error(c, \"failed to parse CA certificate\");\n        return -1;\n      }\n      MG_VERBOSE((\"CA serial: %M\", mg_print_hex, ca.sn.len, ca.sn.buf));\n    }\n\n    while (p < endp) {\n      struct mg_tls_cert *ci = &certs[certnum++];\n      uint32_t certsz = MG_LOAD_BE24(p);\n      uint8_t *cert = p + 3;\n      uint16_t certext = MG_LOAD_BE16(cert + certsz);\n      if (certext != 0) {\n        mg_error(c, \"certificate extensions are not supported\");\n        return -1;\n      }\n      p = cert + certsz + 2;\n\n      if (mg_tls_parse_cert_der(cert, certsz, ci) < 0) {\n        mg_error(c, \"failed to parse certificate\");\n        return -1;\n      }\n\n      if (ci == certs) {\n        // First certificate in the chain is peer cert, check SAN if requested,\n        // and store public key for further CertVerify step\n        if (tls->hostname[0] != '\\0' &&\n            mg_tls_verify_cert_san(cert, certsz, tls->hostname, &c->rem) <= 0 &&\n            mg_tls_verify_cert_cn(&ci->subj, tls->hostname) <= 0) {\n          mg_error(c, \"failed to verify hostname\");\n          return -1;\n        }\n        memmove(tls->pubkey, ci->pubkey.buf, ci->pubkey.len);\n        tls->pubkeysz = ci->pubkey.len;\n      } else {\n        if (!mg_tls_verify_cert_signature(ci - 1, ci)) {\n          mg_error(c, \"failed to verify certificate chain\");\n          return -1;\n        }\n      }\n\n      if (ca.pubkey.len == ci->pubkey.len &&\n          memcmp(ca.pubkey.buf, ci->pubkey.buf, ca.pubkey.len) == 0) {\n        found_ca = true;\n        break;\n      }\n\n      if (certnum == sizeof(certs) / sizeof(certs[0]) - 1) {\n        mg_error(c, \"too many certificates in the chain\");\n        return -1;\n      }\n    }\n\n    if (!found_ca && tls->ca_der.len > 0) {\n      if (certnum < 1 ||\n          !mg_tls_verify_cert_signature(&certs[certnum - 1], &ca)) {\n        mg_error(c, \"failed to verify CA\");\n        return -1;\n      } else if (is_client) {\n        MG_VERBOSE(\n            (\"CA was not in the chain, but verification with builtin CA \"\n             \"passed\"));\n      }\n    }\n  }\n  mg_tls_drop_message(c);\n  mg_tls_calc_cert_verify_hash(c, tls->sighash, !is_client);\n  return 0;\n}\n\nstatic int mg_tls_recv_cert_verify(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf;\n  if (mg_tls_recv_record(c) < 0) {\n    return -1;\n  }\n  recv_buf = &c->rtls.buf[tls->recv_offset];\n  if (recv_buf[0] != MG_TLS_CERTIFICATE_VERIFY) {\n    mg_error(c, \"expected %s certificate verify but got msg 0x%02x\",\n             c->is_client ? \"server\" : \"client\", recv_buf[0]);\n    return -1;\n  }\n  if (tls->recv_len < 8) {\n    mg_error(c, \"server certificate verify is too short: %d bytes\",\n             tls->recv_len);\n    return -1;\n  }\n\n  // Ignore CertificateVerify if strict checks are not required\n  if (tls->skip_verification) {\n    mg_tls_drop_message(c);\n    return 0;\n  }\n\n  {\n    uint16_t sigalg = MG_LOAD_BE16(recv_buf + 4);\n    uint16_t siglen = MG_LOAD_BE16(recv_buf + 6);\n    uint8_t *sigbuf = recv_buf + 8;\n    if (siglen > tls->recv_len - 8) {\n      mg_error(c, \"invalid certverify signature length: %d, expected %d\",\n               siglen, tls->recv_len - 8);\n      return -1;\n    }\n    MG_VERBOSE(\n        (\"certificate verification, algo=%04x, siglen=%d\", sigalg, siglen));\n\n    if (sigalg == 0x0804) {  // rsa_pss_rsae_sha256\n      uint8_t sig2[512];     // 2048 or 4096 bits\n      struct mg_der_tlv seq, modulus, exponent;\n\n      if (mg_der_parse(tls->pubkey, tls->pubkeysz, &seq) <= 0 ||\n          mg_der_next(&seq, &modulus) <= 0 || modulus.type != 2 ||\n          mg_der_next(&seq, &exponent) <= 0 || exponent.type != 2) {\n        mg_error(c, \"invalid public key\");\n        return -1;\n      }\n\n      mg_rsa_mod_pow(modulus.value, modulus.len, exponent.value, exponent.len,\n                     sigbuf, siglen, sig2, sizeof(sig2));\n\n      if (sig2[sizeof(sig2) - 1] != 0xbc) {\n        mg_error(c, \"failed to verify RSA certificate (certverify)\");\n        return -1;\n      }\n      MG_VERBOSE((\"certificate verification successful (RSA)\"));\n    } else if (sigalg == 0x0403) {  // ecdsa_secp256r1_sha256\n      // Extract certificate signature and verify it using pubkey and sighash\n      uint8_t sig[64];\n      struct mg_der_tlv seq, r, s;\n      memset(sig, 0, 64);\n      if (mg_der_to_tlv(sigbuf, siglen, &seq) < 0) {\n        mg_error(c, \"verification message is not an ASN.1 DER sequence\");\n        return -1;\n      }\n      if (mg_der_to_tlv(seq.value, seq.len, &r) < 0) {\n        mg_error(c, \"missing first part of the signature\");\n        return -1;\n      }\n      if (mg_der_to_tlv(r.value + r.len, seq.len - r.len, &s) < 0) {\n        mg_error(c, \"missing second part of the signature\");\n        return -1;\n      }\n      // Integers may be padded with zeroes\n      if (r.len > 32) r.value = r.value + (r.len - 32), r.len = 32;\n      if (s.len > 32) s.value = s.value + (s.len - 32), s.len = 32;\n\n      // r or s may be shorter than 32 bytes, \"right-justify\" (network order)\n      memmove(sig + (32 - r.len), r.value, r.len);\n      memmove(sig + 32 + (32 - s.len), s.value, s.len);\n\n      if (mg_uecc_verify(tls->pubkey, tls->sighash, sizeof(tls->sighash), sig,\n                         mg_uecc_secp256r1()) != 1) {\n        mg_error(c, \"failed to verify EC certificate (certverify)\");\n        return -1;\n      }\n      MG_VERBOSE((\"certificate verification successful (EC)\"));\n    } else {\n      // From\n      // https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml:\n      //   0805 = rsa_pss_rsae_sha384\n      //   0806 = rsa_pss_rsae_sha512\n      //   0807 = ed25519\n      //   0808 = ed448\n      //   0809 = rsa_pss_pss_sha256\n      //   080A = rsa_pss_pss_sha384\n      //   080B = rsa_pss_pss_sha512\n      MG_ERROR((\"unsupported certverify signature scheme: %x of %d bytes\",\n                sigalg, siglen));\n      return -1;\n    }\n  }\n  mg_tls_drop_message(c);\n  return 0;\n}\n\nstatic int mg_tls_client_recv_finish(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf;\n  if (mg_tls_recv_record(c) < 0) {\n    return -1;\n  }\n  recv_buf = &c->rtls.buf[tls->recv_offset];\n  if (recv_buf[0] != MG_TLS_FINISHED) {\n    mg_error(c, \"expected server finished but got msg 0x%02x\", recv_buf[0]);\n    return -1;\n  }\n  mg_tls_drop_message(c);\n  return 0;\n}\n\nstatic bool mg_tls_client_send_finish(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  mg_sha256_ctx sha256;\n  uint8_t hash[32];\n  uint8_t finish[36] = {0x14, 0, 0, 32};\n  memmove(&sha256, &tls->sha256, sizeof(mg_sha256_ctx));\n  mg_sha256_final(hash, &sha256);\n  mg_hmac_sha256(finish + 4, tls->enc.client_finished_key, 32, hash, 32);\n  return mg_tls_encrypt(c, finish, sizeof(finish), MG_TLS_HANDSHAKE);\n}\n\nstatic bool mg_tls_client_handshake(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  switch (tls->state) {\n    case MG_TLS_STATE_CLIENT_START:\n      if (!mg_tls_client_send_hello(c)) return false;\n      tls->state = MG_TLS_STATE_CLIENT_WAIT_SH;\n      // Fallthrough\n    case MG_TLS_STATE_CLIENT_WAIT_SH:\n      if (mg_tls_client_recv_hello(c) < 0) break;\n      tls->state = MG_TLS_STATE_CLIENT_WAIT_EE;\n      // Fallthrough\n    case MG_TLS_STATE_CLIENT_WAIT_EE:\n      if (mg_tls_client_recv_ext(c) < 0) break;\n      tls->state = MG_TLS_STATE_CLIENT_WAIT_CERT;\n      // Fallthrough\n    case MG_TLS_STATE_CLIENT_WAIT_CERT:\n      if (mg_tls_recv_cert(c, true) < 0) break;\n      tls->state = MG_TLS_STATE_CLIENT_WAIT_CV;\n      // Fallthrough\n    case MG_TLS_STATE_CLIENT_WAIT_CV:\n      if (mg_tls_recv_cert_verify(c) < 0) break;\n      tls->state = MG_TLS_STATE_CLIENT_WAIT_FINISH;\n      // Fallthrough\n    case MG_TLS_STATE_CLIENT_WAIT_FINISH:\n      if (mg_tls_client_recv_finish(c) < 0) break;\n      if (tls->cert_requested && tls->cert_der.len > 0) {  // two-way auth\n        // generate application keys at this point, keep using handshake keys\n        struct tls_enc hs_keys = tls->enc;\n        mg_tls_generate_application_keys(c);\n        tls->app_keys = tls->enc;\n        tls->enc = hs_keys;\n        if (!mg_tls_send_cert(c, true) || !mg_tls_send_cert_verify(c, true) ||\n            !mg_tls_client_send_finish(c))\n          return false;\n        tls->enc = tls->app_keys;\n      } else {\n        if (!mg_tls_client_send_finish(c)) return false;\n        mg_tls_generate_application_keys(c);\n      }\n      tls->state = MG_TLS_STATE_CLIENT_CONNECTED;\n      c->is_tls_hs = 0;\n      mg_call(c, MG_EV_TLS_HS, NULL);\n      break;\n    default:\n      mg_error(c, \"unexpected client state: %d\", tls->state);\n      break;\n  }\n  return true;\n}\n\nstatic bool mg_tls_server_handshake(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  switch (tls->state) {\n    case MG_TLS_STATE_SERVER_START:\n      if (mg_tls_server_recv_hello(c) < 0) break;\n      if (!mg_tls_server_send_hello(c)) return false;\n      mg_tls_generate_handshake_keys(c);\n      if (!mg_tls_server_send_ext(c)) return false;\n      if (tls->is_twoway && !mg_tls_server_send_cert_request(c)) return false;\n      if (!mg_tls_send_cert(c, false) || !mg_tls_send_cert_verify(c, false) ||\n          !mg_tls_server_send_finish(c))\n        return false;\n      if (tls->is_twoway) {\n        // generate application keys at this point, keep using handshake keys\n        struct tls_enc hs_keys = tls->enc;\n        mg_tls_generate_application_keys(c);\n        tls->app_keys = tls->enc;\n        tls->enc = hs_keys;\n        tls->state = MG_TLS_STATE_SERVER_WAIT_CERT;\n        break;\n      }\n      tls->state = MG_TLS_STATE_SERVER_NEGOTIATED;\n      // fallthrough\n    case MG_TLS_STATE_SERVER_NEGOTIATED:\n      if (mg_tls_server_recv_finish(c) < 0) break;\n      if (tls->is_twoway) {  // use previously generated keys\n        tls->enc = tls->app_keys;\n      } else {  // generate keys now\n        mg_tls_generate_application_keys(c);\n      }\n      tls->state = MG_TLS_STATE_SERVER_CONNECTED;\n      c->is_tls_hs = 0;\n      break;\n    case MG_TLS_STATE_SERVER_WAIT_CERT:\n      if (mg_tls_recv_cert(c, false) < 0) break;\n      tls->state = MG_TLS_STATE_SERVER_WAIT_CV;\n      // Fallthrough\n    case MG_TLS_STATE_SERVER_WAIT_CV:\n      if (mg_tls_recv_cert_verify(c) < 0) break;\n      tls->state = MG_TLS_STATE_SERVER_NEGOTIATED;\n      break;\n    default:\n      mg_error(c, \"unexpected server state: %d\", tls->state);\n      break;\n  }\n  return true;\n}\n\nvoid mg_tls_handshake(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  long n;\n  bool res;\n  if (c->is_closing) return;  // we don't clear rx buf, so ignore what's left\n  if (c->is_client) {\n    // will clear is_hs when sending last chunk\n    res = mg_tls_client_handshake(c);\n  } else {\n    res = mg_tls_server_handshake(c);\n  }\n  if (!res) {\n    mg_error(c, \"TLS OOM\");\n    return;\n  }\n  while (tls->send.len > 0 &&\n         (n = mg_io_send(c, tls->send.buf, tls->send.len)) > 0) {\n    mg_iobuf_del(&tls->send, 0, (size_t) n);\n  }  // if last chunk fails to be sent, it will be sent with first app data,\n     // otherwise, it needs to be flushed\n}\n\nstatic int mg_rsa_parse_der_int(const uint8_t **p, const uint8_t *end,\n                                struct mg_str *out) {\n  const uint8_t *start = *p, *value_start, *value_end;\n  uint8_t i;\n  uint32_t len;\n\n  if (end - start < 2) {\n    MG_VERBOSE((\"DER INT: not enough bytes (%d < 2)\", (int) (end - start)));\n    return -1;\n  }\n  if (start[0] != 0x02) {\n    MG_VERBOSE((\"DER INT: expected 0x02, got 0x%02x\", start[0]));\n    return -1;\n  }\n\n  len = start[1];\n  *p = start + 2;\n\n  if (len > 0x7F) {\n    // Long form length\n    uint8_t len_bytes = len & 0x7F;\n    MG_VERBOSE((\"DER INT: long form, %d length bytes\", len_bytes));\n    if (end - *p < len_bytes) {\n      MG_VERBOSE((\"DER INT: not enough bytes for length\"));\n      return -1;\n    }\n    len = 0;\n    for (i = 0; i < len_bytes; i++) {\n      len = (len << 8) | (*p)[i];\n    }\n    *p += len_bytes;\n  }\n\n  MG_VERBOSE((\"DER INT: length=%u, remaining=%d\", len, (int) (end - *p)));\n\n  if (end - *p < (long) len) {\n    MG_VERBOSE((\"DER INT: length exceeds remaining bytes\"));\n    return -1;\n  }\n\n  // The encoded length tells us how many bytes to consume from the stream\n  value_start = *p;\n  value_end = *p + len;\n\n  // Skip leading zero byte if present (for positive numbers)\n  // This doesn't change how many bytes we consume, just what we expose\n  if (len > 0 && (*p)[0] == 0x00) {\n    (*p)++;\n    len--;\n  }\n\n  out->buf = (char *) *p;\n  out->len = len;\n\n  // Advance pointer by the ORIGINAL encoded length, not the adjusted length\n  *p = value_end;\n\n  MG_VERBOSE((\"DER INT: parsed %u bytes (skipped zero=%d)\", len,\n              (size_t)(value_end - value_start) != (size_t) len ? 1 : 0));\n  return 0;\n}\n\n// RFC 5915 ECPrivateKey ::= SEQUENCE {\n//   version INTEGER { ecPrivkeyVer1(1) },\n//   privateKey OCTET STRING,\n//   parameters [0] ECParameters {{ NamedCurve }} OPTIONAL,\n//   publicKey [1] BIT STRING OPTIONAL\n// }\nstatic int mg_parse_ec_private_key(const uint8_t *der, size_t dersz,\n                                   uint8_t *ec_key) {\n  struct mg_der_tlv root, version, private_key_octets;\n\n  if (mg_der_parse((uint8_t *) der, dersz, &root) < 0 || root.type != 0x30) {\n    MG_ERROR((\"EC private key: invalid SEQUENCE\"));\n    return -1;\n  }\n\n  if (mg_der_next(&root, &version) < 0 || version.type != 0x02) {\n    MG_ERROR((\"EC private key: invalid version\"));\n    return -1;\n  }\n\n  if (mg_der_next(&root, &private_key_octets) < 0 ||\n      private_key_octets.type != 0x04) {\n    MG_ERROR((\"EC private key: invalid privateKey OCTET STRING\"));\n    return -1;\n  }\n\n  if (private_key_octets.len != 32) {\n    MG_ERROR(\n        (\"EC private key: expected 32 bytes, got %u\", private_key_octets.len));\n    return -1;\n  }\n\n  memcpy(ec_key, private_key_octets.value, 32);\n  return 0;\n}\n\n// Parse RSA private key from DER format\n// RSAPrivateKey ::= SEQUENCE {\n//   version           INTEGER (0),\n//   modulus           INTEGER,  -- n\n//   publicExponent    INTEGER,  -- e\n//   privateExponent   INTEGER,  -- d\n//   prime1            INTEGER,  -- p\n//   prime2            INTEGER,  -- q\n//   exponent1         INTEGER,  -- dP = d mod (p-1)\n//   exponent2         INTEGER,  -- dQ = d mod (q-1)\n//   coefficient       INTEGER,  -- qInv = (inverse of q) mod p\n// }\nstatic int mg_rsa_parse_key(const uint8_t *der, size_t dersz,\n                            struct mg_rsa_key *key) {\n  const uint8_t *p = der;\n  const uint8_t *end = der + dersz;\n  uint32_t seq_len;\n  struct mg_str version;\n\n  memset(key, 0, sizeof(*key));\n\n  // Debug: show first few bytes\n  MG_VERBOSE(\n      (\"RSA key DER first 16 bytes: %02x %02x %02x %02x %02x %02x %02x %02x \"\n       \"%02x %02x %02x %02x %02x %02x %02x %02x\",\n       der[0], der[1], der[2], der[3], der[4], der[5], der[6], der[7], der[8],\n       der[9], der[10], der[11], der[12], der[13], der[14], der[15]));\n\n  // Parse outer SEQUENCE\n  if (end - p < 2) {\n    MG_ERROR((\"RSA key too short for SEQUENCE header\"));\n    return -1;\n  }\n  if (p[0] != 0x30) {\n    MG_ERROR((\"RSA key: expected SEQUENCE (0x30), got 0x%02x\", p[0]));\n    return -1;\n  }\n\n  seq_len = p[1];\n  p += 2;\n\n  if (seq_len > 0x7F) {\n    // Long form length\n    uint8_t i, len_bytes = seq_len & 0x7F;\n    MG_VERBOSE((\"Long form length: %d bytes\", len_bytes));\n    if (end - p < len_bytes) {\n      MG_ERROR((\"Not enough bytes for long form length\"));\n      return -1;\n    }\n    seq_len = 0;\n    for (i = 0; i < len_bytes; i++) {\n      seq_len = (seq_len << 8) | p[i];\n    }\n    p += len_bytes;\n  }\n\n  MG_VERBOSE(\n      (\"SEQUENCE length: %u, total DER size: %u\", seq_len, (unsigned) dersz));\n\n  if (end - p < (long) seq_len) {\n    MG_ERROR((\"SEQUENCE length exceeds buffer\"));\n    return -1;\n  }\n  end = p + seq_len;  // Adjust end to sequence boundary\n\n  // Parse version (should be 0)\n  MG_VERBOSE((\"Before version: offset=%d, bytes: %02x %02x %02x %02x\",\n              (int) (p - der), p[0], p[1], p[2], p[3]));\n  if (mg_rsa_parse_der_int(&p, end, &version) < 0) {\n    MG_ERROR((\"Failed to parse version\"));\n    return -1;\n  }\n  MG_DEBUG((\"Version: %d byte(s), value=%d, offset now=%d\", (int) version.len,\n            version.len > 0 ? (int) (unsigned char) version.buf[0] : -1,\n            (int) (p - der)));\n\n  // Parse the 8 components: n, e, d, p, q, dP, dQ, qInv\n  MG_VERBOSE((\"Before n: offset=%d, bytes: %02x %02x %02x %02x %02x %02x\",\n              (int) (p - der), p[0], p[1], p[2], p[3], p[4], p[5]));\n  if (mg_rsa_parse_der_int(&p, end, &key->n) < 0) {\n    MG_ERROR((\"Failed to parse n (modulus)\"));\n    return -1;\n  }\n  MG_VERBOSE((\"Parsed n: %d bytes, offset now=%d, consumed=%d bytes total\",\n              (int) key->n.len, (int) (p - der), (int) (p - der)));\n  MG_VERBOSE((\"  First 8 bytes of n: %02x %02x %02x %02x %02x %02x %02x %02x\",\n              (unsigned char) key->n.buf[0], (unsigned char) key->n.buf[1],\n              (unsigned char) key->n.buf[2], (unsigned char) key->n.buf[3],\n              (unsigned char) key->n.buf[4], (unsigned char) key->n.buf[5],\n              (unsigned char) key->n.buf[6], (unsigned char) key->n.buf[7]));\n  MG_VERBOSE((\"  Next bytes after n: %02x %02x %02x %02x %02x %02x\",\n              p < end ? p[0] : 0xFF, p + 1 < end ? p[1] : 0xFF,\n              p + 2 < end ? p[2] : 0xFF, p + 3 < end ? p[3] : 0xFF,\n              p + 4 < end ? p[4] : 0xFF, p + 5 < end ? p[5] : 0xFF));\n\n  if (mg_rsa_parse_der_int(&p, end, &key->e) < 0) {\n    MG_ERROR((\"Failed to parse e (public exponent), bytes remaining: %d\",\n              (int) (end - p)));\n    if (end - p >= 4) {\n      MG_ERROR((\"  Next 4 bytes: %02x %02x %02x %02x\", p[0], p[1], p[2], p[3]));\n    }\n    return -1;\n  }\n  if (mg_rsa_parse_der_int(&p, end, &key->d) < 0) {\n    MG_ERROR((\"Failed to parse d (private exponent)\"));\n    return -1;\n  }\n  if (mg_rsa_parse_der_int(&p, end, &key->p) < 0) {\n    MG_ERROR((\"Failed to parse p (prime1)\"));\n    return -1;\n  }\n  if (mg_rsa_parse_der_int(&p, end, &key->q) < 0) {\n    MG_ERROR((\"Failed to parse q (prime2)\"));\n    return -1;\n  }\n  if (mg_rsa_parse_der_int(&p, end, &key->dP) < 0) {\n    MG_ERROR((\"Failed to parse dP (exponent1)\"));\n    return -1;\n  }\n  if (mg_rsa_parse_der_int(&p, end, &key->dQ) < 0) {\n    MG_ERROR((\"Failed to parse dQ (exponent2)\"));\n    return -1;\n  }\n  if (mg_rsa_parse_der_int(&p, end, &key->qInv) < 0) {\n    MG_ERROR((\"Failed to parse qInv (coefficient)\"));\n    return -1;\n  }\n\n  MG_VERBOSE((\"Successfully parsed RSA key\"));\n  return 0;\n}\n\n// PKCS#8 PrivateKeyInfo ::= SEQUENCE {\n//   version INTEGER,\n//   privateKeyAlgorithm AlgorithmIdentifier,\n//   privateKey OCTET STRING,\n//   attributes [0] Attributes OPTIONAL\n// }\n// AlgorithmIdentifier ::= SEQUENCE {\n//   algorithm OBJECT IDENTIFIER,\n//   parameters ANY OPTIONAL\n// }\nstatic int mg_parse_pkcs8_key(const uint8_t *der, size_t dersz,\n                              struct tls_data *tls) {\n  struct mg_der_tlv root, version, alg_id, private_key_octets;\n  struct mg_der_tlv alg_oid, alg_params;\n\n  if (mg_der_parse((uint8_t *) der, dersz, &root) < 0 || root.type != 0x30) {\n    MG_ERROR((\"PKCS#8: invalid PrivateKeyInfo SEQUENCE\"));\n    return -1;\n  }\n\n  if (mg_der_next(&root, &version) < 0 || version.type != 0x02) {\n    MG_ERROR((\"PKCS#8: invalid version\"));\n    return -1;\n  }\n\n  if (mg_der_next(&root, &alg_id) < 0 || alg_id.type != 0x30) {\n    MG_ERROR((\"PKCS#8: invalid AlgorithmIdentifier SEQUENCE\"));\n    return -1;\n  }\n\n  if (mg_der_next(&alg_id, &alg_oid) < 0 || alg_oid.type != 0x06) {\n    MG_ERROR((\"PKCS#8: invalid algorithm OID\"));\n    return -1;\n  }\n\n  if (mg_der_next(&root, &private_key_octets) < 0 ||\n      private_key_octets.type != 0x04) {\n    MG_ERROR((\"PKCS#8: invalid privateKey OCTET STRING\"));\n    return -1;\n  }\n\n  if (alg_oid.len == sizeof(mg_rsa_oid) &&\n      memcmp(alg_oid.value, mg_rsa_oid, sizeof(mg_rsa_oid)) == 0) {\n    struct mg_rsa_key rsa_key;\n    if (mg_rsa_parse_key(private_key_octets.value, private_key_octets.len,\n                         &rsa_key) < 0) {\n      MG_ERROR((\"PKCS#8: failed to parse inner RSA key\"));\n      return -1;\n    }\n    tls->rsa = rsa_key;\n    return 0;\n\n  } else if (alg_oid.len == sizeof(mg_ec_public_key_oid) &&\n             memcmp(alg_oid.value, mg_ec_public_key_oid,\n                    sizeof(mg_ec_public_key_oid)) == 0) {\n    if (mg_der_next(&alg_id, &alg_params) < 0 || alg_params.type != 0x06) {\n      MG_ERROR((\"PKCS#8: invalid EC parameters OID\"));\n      return -1;\n    }\n\n    if (alg_params.len != sizeof(mg_secp256r1_oid) ||\n        memcmp(alg_params.value, mg_secp256r1_oid, sizeof(mg_secp256r1_oid)) !=\n            0) {\n      MG_ERROR((\"PKCS#8: unsupported EC curve (only secp256r1 supported)\"));\n      return -1;\n    }\n\n    return mg_parse_ec_private_key(private_key_octets.value,\n                                   private_key_octets.len, tls->ec_key);\n\n  } else {\n    MG_ERROR((\"PKCS#8: unsupported algorithm\"));\n    return -1;\n  }\n}\n\nstatic int mg_parse_pem(const struct mg_str pem, const struct mg_str label,\n                        struct mg_str *der) {\n  size_t n = 0, m = 0;\n  char *s;\n  const char *c;\n  struct mg_str caps[6];  // number of wildcards + 1\n  if (!mg_match(pem, mg_str(\"#-----BEGIN #-----#-----END #-----#\"), caps)) {\n    *der = mg_strdup(pem);\n    return 0;\n  }\n  if (mg_strcmp(caps[1], label) != 0 || mg_strcmp(caps[3], label) != 0) {\n    return -1;  // bad label\n  }\n  if ((s = (char *) mg_calloc(1, caps[2].len)) == NULL) {\n    return -1;\n  }\n\n  for (c = caps[2].buf; c < caps[2].buf + caps[2].len; c++) {\n    if (*c == ' ' || *c == '\\n' || *c == '\\r' || *c == '\\t') {\n      continue;\n    }\n    s[n++] = *c;\n  }\n  m = mg_base64_decode(s, n, s, n);\n  if (m == 0) {\n    mg_free(s);\n    return -1;\n  }\n  der->buf = s;\n  der->len = m;\n  return 0;\n}\n\nstatic int mg_parse_pem_certs(const struct mg_str pem, struct mg_str **ders) {\n  int count = 0;\n  struct mg_str *certs = NULL;\n  const char *p = pem.buf;\n  const char *end = pem.buf + pem.len;\n  const char *begin_marker = \"-----BEGIN CERTIFICATE-----\";\n  const char *end_marker = \"-----END CERTIFICATE-----\";\n  size_t begin_len = strlen(begin_marker);\n  size_t end_len = strlen(end_marker);\n\n  while (p < end) {\n    const char *s, *begin = NULL, *finish = NULL;\n    struct mg_str cert_pem, cert_der, *new_certs;\n    int i;\n\n    for (s = p; s <= end - (int) begin_len; s++) {\n      if (memcmp(s, begin_marker, begin_len) == 0) {\n        begin = s;\n        break;\n      }\n    }\n    if (begin == NULL) break;\n\n    for (s = begin + begin_len; s <= end - (int) end_len; s++) {\n      if (memcmp(s, end_marker, end_len) == 0) {\n        finish = s + end_len;\n        break;\n      }\n    }\n    if (finish == NULL) {\n      for (i = 0; i < count; i++) mg_free((void *) certs[i].buf);\n      mg_free(certs);\n      return -1;\n    }\n\n    cert_pem = mg_str_n(begin, (size_t) (finish - begin));\n    if (mg_parse_pem(cert_pem, mg_str_s(\"CERTIFICATE\"), &cert_der) < 0) {\n      for (i = 0; i < count; i++) mg_free((void *) certs[i].buf);\n      mg_free(certs);\n      return -1;\n    }\n\n    new_certs =\n        (struct mg_str *) mg_calloc((size_t) count + 1, sizeof(*new_certs));\n    if (new_certs == NULL) {\n      mg_free((void *) cert_der.buf);\n      for (i = 0; i < count; i++) mg_free((void *) certs[i].buf);\n      mg_free(certs);\n      return -1;\n    }\n    if (count > 0) {\n      memmove(new_certs, certs, (size_t) count * sizeof(struct mg_str));\n      mg_free(certs);\n    }\n    certs = new_certs;\n\n    certs[count++] = cert_der;\n    p = finish;\n  }\n\n  *ders = certs;\n  return count;\n}\n\nvoid mg_tls_init(struct mg_connection *c, const struct mg_tls_opts *opts) {\n  struct mg_str key;\n  struct tls_data *tls =\n      (struct tls_data *) mg_calloc(1, sizeof(struct tls_data));\n  if (tls == NULL) {\n    mg_error(c, \"tls oom\");\n    return;\n  }\n\n  tls->state =\n      c->is_client ? MG_TLS_STATE_CLIENT_START : MG_TLS_STATE_SERVER_START;\n\n  tls->skip_verification = opts->skip_verification;\n  // tls->send.align = MG_IO_SIZE;\n\n  c->tls = tls;\n  c->is_tls = c->is_tls_hs = 1;\n  mg_sha256_init(&tls->sha256);\n\n  // save hostname (client extension)\n  if (opts->name.len > 0) {\n    if (opts->name.len >= sizeof(tls->hostname) - 1) {\n      mg_error(c, \"hostname too long\");\n      return;\n    }\n    strncpy((char *) tls->hostname, opts->name.buf, sizeof(tls->hostname) - 1);\n    tls->hostname[opts->name.len] = 0;\n  }\n  // server CA certificate, store serial number\n  if (opts->ca.len > 0) {\n    if (mg_parse_pem(opts->ca, mg_str_s(\"CERTIFICATE\"), &tls->ca_der) < 0) {\n      MG_ERROR((\"Failed to load certificate\"));\n      return;\n    }\n    if (!c->is_client) tls->is_twoway = true;  // server + CA: two-way auth\n  }\n\n  if (opts->cert.buf == NULL) {\n    MG_VERBOSE((\"No certificate provided\"));\n    return;\n  }\n\n  // parse PEM or DER certificate\n  {\n    struct mg_str *all_certs = NULL;\n    int cert_count = mg_parse_pem_certs(opts->cert, &all_certs);\n\n    if (cert_count > 0) {\n      tls->cert_der.buf = all_certs[0].buf;\n      tls->cert_der.len = all_certs[0].len;\n      if (cert_count > 1) {\n        tls->chain_len = (size_t) cert_count;\n        tls->chain_der = all_certs;\n      } else {\n        mg_free(all_certs);\n      }\n    } else {\n      if (mg_parse_pem(opts->cert, mg_str_s(\"CERTIFICATE\"), &tls->cert_der) <\n          0) {\n        MG_ERROR((\"Failed to load certificate\"));\n        return;\n      }\n    }\n  }\n\n  // parse PEM or DER EC key\n  if (opts->key.buf == NULL) {\n    mg_error(c, \"Certificate provided without a private key\");\n    return;\n  }\n\n  if (mg_parse_pem(opts->key, mg_str_s(\"EC PRIVATE KEY\"), &key) == 0) {\n    if (key.len < 39) {\n      MG_ERROR((\"EC private key too short\"));\n      return;\n    }\n    // expect ASN.1 SEQUENCE=[INTEGER=1, BITSTRING of 32 bytes, ...]\n    // 30 nn 02 01 01 04 20 [key] ...\n    if (key.buf[0] != 0x30 || (key.buf[1] & 0x80) != 0) {\n      MG_ERROR((\"EC private key: ASN.1 bad sequence\"));\n      return;\n    }\n    if (memcmp(key.buf + 2, \"\\x02\\x01\\x01\\x04\\x20\", 5) != 0) {\n      MG_ERROR((\"EC private key: ASN.1 bad data\"));\n    }\n    memmove(tls->ec_key, key.buf + 7, 32);\n    mg_free((void *) key.buf);\n  } else if (mg_parse_pem(opts->key, mg_str_s(\"RSA PRIVATE KEY\"), &key) == 0) {\n    struct mg_rsa_key rsa_key;\n    // RSA private key found, store it for later use\n    tls->rsa_key_der = key;\n    MG_INFO((\"Parsed RSA private key: %d bytes\", (int) key.len));\n\n    // parse and validate the key structure\n    // we keep the DER buffer, rsa_key just points into it\n    if (mg_rsa_parse_key((const uint8_t *) key.buf, key.len, &rsa_key) < 0) {\n      MG_ERROR((\"Failed to parse RSA private key structure\"));\n      mg_free((void *) key.buf);\n      tls->rsa_key_der = mg_str_n(NULL, 0);\n      mg_error(c, \"Invalid RSA private key format\");\n      return;\n    }\n\n    MG_VERBOSE((\"RSA key components:\"));\n    MG_VERBOSE((\"  n (modulus):  %d bytes\", (int) rsa_key.n.len));\n    MG_VERBOSE((\"  e (pubexp):   %d bytes\", (int) rsa_key.e.len));\n    MG_VERBOSE((\"  d (privexp):  %d bytes\", (int) rsa_key.d.len));\n    MG_VERBOSE((\"  p (prime1):   %d bytes\", (int) rsa_key.p.len));\n    MG_VERBOSE((\"  q (prime2):   %d bytes\", (int) rsa_key.q.len));\n    MG_VERBOSE((\"  dP:           %d bytes\", (int) rsa_key.dP.len));\n    MG_VERBOSE((\"  dQ:           %d bytes\", (int) rsa_key.dQ.len));\n    MG_VERBOSE((\"  qInv:         %d bytes\", (int) rsa_key.qInv.len));\n\n    // Copy parsed RSA key components to tls->rsa for signing operations\n    tls->rsa = rsa_key;\n  } else if (mg_parse_pem(opts->key, mg_str_s(\"PRIVATE KEY\"), &key) == 0) {\n    if (mg_parse_pkcs8_key((const uint8_t *) key.buf, key.len, tls) == 0) {\n      if (tls->rsa.n.len > 0) {\n        tls->rsa_key_der = key;\n        MG_INFO((\"Parsed PKCS#8 RSA private key: %d bytes\", (int) key.len));\n      } else {\n        mg_free((void *) key.buf);\n        MG_INFO((\"Parsed PKCS#8 EC private key\"));\n      }\n    } else {\n      mg_free((void *) key.buf);\n      mg_error(c, \"Unsupported PKCS#8 private key format, algorithm, or curve\");\n      return;\n    }\n  } else {\n    mg_error(\n        c, \"Expected EC PRIVATE KEY, RSA PRIVATE KEY, or PRIVATE KEY (PKCS#8)\");\n  }\n}\n\nvoid mg_tls_free(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  size_t i;\n  if (tls != NULL) {\n    mg_iobuf_free(&tls->send);\n    if (tls->chain_der != NULL) {\n      for (i = 0; i < tls->chain_len; i++) {\n        mg_free((void *) tls->chain_der[i].buf);\n      }\n      mg_free(tls->chain_der);\n    } else {\n      mg_free((void *) tls->cert_der.buf);\n    }\n    mg_free((void *) tls->ca_der.buf);\n    mg_free((void *) tls->rsa_key_der.buf);\n  }\n  mg_free(c->tls);\n  c->tls = NULL;\n}\n\nlong mg_tls_send(struct mg_connection *c, const void *buf, size_t len) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  long n = MG_IO_WAIT;\n  bool was_throttled = c->is_tls_throttled;  // see #3074\n  if (!was_throttled) {                      // encrypt new data\n    if (len > MG_IO_SIZE) len = MG_IO_SIZE;\n    if (len > 16384) len = 16384;\n    if (!mg_tls_encrypt(c, (const uint8_t *) buf, len, MG_TLS_APP_DATA))\n      return 0;  // returning 0 means an OOM condition (iobuf couldn't resize),\n                 // yet this is so far recoverable, let the caller decide\n  }              // else, resend outstanding encrypted data in tls->send\n  while (tls->send.len > 0 &&\n         (n = mg_io_send(c, tls->send.buf, tls->send.len)) > 0) {\n    mg_iobuf_del(&tls->send, 0, (size_t) n);\n  }  // if last chunk fails to be sent, it needs to be flushed\n  c->is_tls_throttled = (tls->send.len > 0 && n == MG_IO_WAIT);\n  MG_VERBOSE((\"%lu %ld %ld %ld %c %c\", c->id, (long) len, (long) tls->send.len,\n              n, was_throttled ? 'T' : 't', c->is_tls_throttled ? 'T' : 't'));\n  if (n == MG_IO_ERR) return MG_IO_ERR;\n  if (was_throttled) return MG_IO_WAIT;  // sent throttled data instead\n  return (long) len;  // return len even when throttled, already encripted that\n}\n\nlong mg_tls_recv(struct mg_connection *c, void *buf, size_t len) {\n  int r = 0;\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf;\n  size_t minlen;\n\n  for (;;) {\n    r = mg_tls_recv_record(c);\n    if (r < 0) return r;\n    if (tls->content_type == MG_TLS_APP_DATA) break;\n    tls->recv_len = 0;\n    mg_tls_drop_record(c);\n  }\n\n  if (buf == NULL || len == 0) return 0L;\n  recv_buf = &c->rtls.buf[tls->recv_offset];\n  minlen = len < tls->recv_len ? len : tls->recv_len;\n  memmove(buf, recv_buf, minlen);\n  tls->recv_offset += minlen;\n  tls->recv_len -= minlen;\n  if (tls->recv_len == 0) mg_tls_drop_record(c);\n  return (long) minlen;\n}\n\nsize_t mg_tls_pending(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  return tls != NULL ? tls->recv_len : 0;\n}\n\nvoid mg_tls_flush(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  long n;\n  while (tls->send.len > 0 &&\n         (n = mg_io_send(c, tls->send.buf, tls->send.len)) > 0) {\n    mg_iobuf_del(&tls->send, 0, (size_t) n);\n  }\n}\n\nvoid mg_tls_ctx_init(struct mg_mgr *mgr) {\n  (void) mgr;\n}\n\nvoid mg_tls_ctx_free(struct mg_mgr *mgr) {\n  (void) mgr;\n}\n#endif\n"
  },
  {
    "path": "src/tls_chacha20.c",
    "content": "// portable8439 v1.0.1\n// Source: https://github.com/DavyLandman/portable8439\n// Licensed under CC0-1.0\n// Contains poly1305-donna e6ad6e091d30d7f4ec2d4f978be1fcfcbce72781 (Public\n// Domain)\n\n#include \"tls_chacha20.h\"\n#include \"tls.h\"\n\n#if MG_TLS == MG_TLS_BUILTIN\n// ******* BEGIN: chacha-portable/chacha-portable.h ********\n\n#if !defined(__cplusplus) && !defined(_MSC_VER) && \\\n    (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L)\n#error \"C99 or newer required\"\n#endif\n\n#define CHACHA20_KEY_SIZE (32)\n#define CHACHA20_NONCE_SIZE (12)\n\n#if defined(_MSC_VER) || defined(__cplusplus)\n// add restrict support\n#if ((defined(_MSC_VER) && _MSC_VER >= 1900) && !defined(__cplusplus)) || \\\n    defined(__clang__) || defined(__GNUC__)\n#define restrict __restrict\n#else\n#define restrict\n#endif\n#endif\n\n// xor data with a ChaCha20 keystream as per RFC8439\nstatic PORTABLE_8439_DECL void chacha20_xor_stream(\n    uint8_t *restrict dest, const uint8_t *restrict source, size_t length,\n    const uint8_t key[CHACHA20_KEY_SIZE],\n    const uint8_t nonce[CHACHA20_NONCE_SIZE], uint32_t counter);\n\nstatic PORTABLE_8439_DECL void rfc8439_keygen(\n    uint8_t poly_key[32], const uint8_t key[CHACHA20_KEY_SIZE],\n    const uint8_t nonce[CHACHA20_NONCE_SIZE]);\n\n// ******* END:   chacha-portable/chacha-portable.h ********\n// ******* BEGIN: poly1305-donna/poly1305-donna.h ********\n\n#include <stddef.h>\n\ntypedef struct poly1305_context {\n  size_t aligner;\n  unsigned char opaque[136];\n} poly1305_context;\n\nstatic PORTABLE_8439_DECL void poly1305_init(poly1305_context *ctx,\n                                             const unsigned char key[32]);\nstatic PORTABLE_8439_DECL void poly1305_update(poly1305_context *ctx,\n                                               const unsigned char *m,\n                                               size_t bytes);\nstatic PORTABLE_8439_DECL void poly1305_finish(poly1305_context *ctx,\n                                               unsigned char mac[16]);\n\n// ******* END:   poly1305-donna/poly1305-donna.h ********\n// ******* BEGIN: chacha-portable.c ********\n\n#include <assert.h>\n#include <string.h>\n\n// this is a fresh implementation of chacha20, based on the description in\n// rfc8349 it's such a nice compact algorithm that it is easy to do. In\n// relationship to other c implementation this implementation:\n//  - pure c99\n//  - big & little endian support\n//  - safe for architectures that don't support unaligned reads\n//\n// Next to this, we try to be fast as possible without resorting inline\n// assembly.\n\n// based on https://sourceforge.net/p/predef/wiki/Endianness/\n#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \\\n    __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__\n#define __HAVE_LITTLE_ENDIAN 1\n#elif defined(__LITTLE_ENDIAN__) || defined(__ARMEL__) ||                 \\\n    defined(__THUMBEL__) || defined(__AARCH64EL__) || defined(_MIPSEL) || \\\n    defined(__MIPSEL) || defined(__MIPSEL__) || defined(__XTENSA_EL__) || \\\n    defined(__AVR__)\n#define __HAVE_LITTLE_ENDIAN 1\n#endif\n// DO NOT test for LITTLE_ENDIAN, as it is defined as 1234 when including sys/types.h in GCC\n\n#ifndef TEST_SLOW_PATH\n#if defined(__HAVE_LITTLE_ENDIAN)\n#define FAST_PATH\n#endif\n#endif\n\n#define CHACHA20_STATE_WORDS (16)\n#define CHACHA20_BLOCK_SIZE (CHACHA20_STATE_WORDS * sizeof(uint32_t))\n\n#ifdef FAST_PATH\n#define store_32_le(target, source) memcpy(&(target), source, sizeof(uint32_t))\n#else\n#define store_32_le(target, source)                                 \\\n  target = (uint32_t) (source)[0] | ((uint32_t) (source)[1]) << 8 | \\\n           ((uint32_t) (source)[2]) << 16 | ((uint32_t) (source)[3]) << 24\n#endif\n\nstatic void initialize_state(uint32_t state[CHACHA20_STATE_WORDS],\n                             const uint8_t key[CHACHA20_KEY_SIZE],\n                             const uint8_t nonce[CHACHA20_NONCE_SIZE],\n                             uint32_t counter) {\n#if 0\n#ifdef static_assert\n  static_assert(sizeof(uint32_t) == 4,\n                \"We don't support systems that do not conform to standard of \"\n                \"uint32_t being exact 32bit wide\");\n#endif\n#endif\n  state[0] = 0x61707865;\n  state[1] = 0x3320646e;\n  state[2] = 0x79622d32;\n  state[3] = 0x6b206574;\n  store_32_le(state[4], key);\n  store_32_le(state[5], key + 4);\n  store_32_le(state[6], key + 8);\n  store_32_le(state[7], key + 12);\n  store_32_le(state[8], key + 16);\n  store_32_le(state[9], key + 20);\n  store_32_le(state[10], key + 24);\n  store_32_le(state[11], key + 28);\n  state[12] = counter;\n  store_32_le(state[13], nonce);\n  store_32_le(state[14], nonce + 4);\n  store_32_le(state[15], nonce + 8);\n}\n\n#define increment_counter(state) (state)[12]++\n\n// source: http://blog.regehr.org/archives/1063\n#define rotl32a(x, n) ((x) << (n)) | ((x) >> (32 - (n)))\n\n#define Qround(a, b, c, d) \\\n  a += b;                  \\\n  d ^= a;                  \\\n  d = rotl32a(d, 16);      \\\n  c += d;                  \\\n  b ^= c;                  \\\n  b = rotl32a(b, 12);      \\\n  a += b;                  \\\n  d ^= a;                  \\\n  d = rotl32a(d, 8);       \\\n  c += d;                  \\\n  b ^= c;                  \\\n  b = rotl32a(b, 7);\n\n#define TIMES16(x)                                                          \\\n  x(0) x(1) x(2) x(3) x(4) x(5) x(6) x(7) x(8) x(9) x(10) x(11) x(12) x(13) \\\n      x(14) x(15)\n\nstatic void core_block(const uint32_t *restrict start,\n                       uint32_t *restrict output) {\n  int i;\n// instead of working on the output array,\n// we let the compiler allocate 16 local variables on the stack\n#define __LV(i) uint32_t __t##i = start[i];\n  TIMES16(__LV)\n\n#define __Q(a, b, c, d) Qround(__t##a, __t##b, __t##c, __t##d)\n\n  for (i = 0; i < 10; i++) {\n    __Q(0, 4, 8, 12);\n    __Q(1, 5, 9, 13);\n    __Q(2, 6, 10, 14);\n    __Q(3, 7, 11, 15);\n    __Q(0, 5, 10, 15);\n    __Q(1, 6, 11, 12);\n    __Q(2, 7, 8, 13);\n    __Q(3, 4, 9, 14);\n  }\n\n#define __FIN(i) output[i] = start[i] + __t##i;\n  TIMES16(__FIN)\n}\n\n#define U8(x) ((uint8_t) ((x) &0xFF))\n\n#ifdef FAST_PATH\n#define xor32_le(dst, src, pad)            \\\n  uint32_t __value;                        \\\n  memcpy(&__value, src, sizeof(uint32_t)); \\\n  __value ^= *(pad);                       \\\n  memcpy(dst, &__value, sizeof(uint32_t));\n#else\n#define xor32_le(dst, src, pad)           \\\n  (dst)[0] = (src)[0] ^ U8(*(pad));       \\\n  (dst)[1] = (src)[1] ^ U8(*(pad) >> 8);  \\\n  (dst)[2] = (src)[2] ^ U8(*(pad) >> 16); \\\n  (dst)[3] = (src)[3] ^ U8(*(pad) >> 24);\n#endif\n\n#define index8_32(a, ix) ((a) + ((ix) * sizeof(uint32_t)))\n\n#define xor32_blocks(dest, source, pad, words)                    \\\n  for (i = 0; i < words; i++) {                                   \\\n    xor32_le(index8_32(dest, i), index8_32(source, i), (pad) + i) \\\n  }\n\nstatic void xor_block(uint8_t *restrict dest, const uint8_t *restrict source,\n                      const uint32_t *restrict pad, unsigned int chunk_size) {\n  unsigned int i, full_blocks = chunk_size / (unsigned int) sizeof(uint32_t);\n  // have to be carefull, we are going back from uint32 to uint8, so endianness\n  // matters again\n  xor32_blocks(dest, source, pad, full_blocks)\n\n      dest += full_blocks * sizeof(uint32_t);\n  source += full_blocks * sizeof(uint32_t);\n  pad += full_blocks;\n\n  switch (chunk_size % sizeof(uint32_t)) {\n    case 1:\n      dest[0] = source[0] ^ U8(*pad);\n      break;\n    case 2:\n      dest[0] = source[0] ^ U8(*pad);\n      dest[1] = source[1] ^ U8(*pad >> 8);\n      break;\n    case 3:\n      dest[0] = source[0] ^ U8(*pad);\n      dest[1] = source[1] ^ U8(*pad >> 8);\n      dest[2] = source[2] ^ U8(*pad >> 16);\n      break;\n  }\n}\n\nstatic void chacha20_xor_stream(uint8_t *restrict dest,\n                                const uint8_t *restrict source, size_t length,\n                                const uint8_t key[CHACHA20_KEY_SIZE],\n                                const uint8_t nonce[CHACHA20_NONCE_SIZE],\n                                uint32_t counter) {\n  uint32_t state[CHACHA20_STATE_WORDS];\n  uint32_t pad[CHACHA20_STATE_WORDS];\n  size_t i, b, last_block, full_blocks = length / CHACHA20_BLOCK_SIZE;\n  initialize_state(state, key, nonce, counter);\n  for (b = 0; b < full_blocks; b++) {\n    core_block(state, pad);\n    increment_counter(state);\n    xor32_blocks(dest, source, pad, CHACHA20_STATE_WORDS) dest +=\n        CHACHA20_BLOCK_SIZE;\n    source += CHACHA20_BLOCK_SIZE;\n  }\n  last_block = length % CHACHA20_BLOCK_SIZE;\n  if (last_block > 0) {\n    core_block(state, pad);\n    xor_block(dest, source, pad, (unsigned int) last_block);\n  }\n}\n\n#ifdef FAST_PATH\n#define serialize(poly_key, result) memcpy(poly_key, result, 32)\n#else\n#define store32_le(target, source)   \\\n  (target)[0] = U8(*(source));       \\\n  (target)[1] = U8(*(source) >> 8);  \\\n  (target)[2] = U8(*(source) >> 16); \\\n  (target)[3] = U8(*(source) >> 24);\n\n#define serialize(poly_key, result)                 \\\n  for (i = 0; i < 32 / sizeof(uint32_t); i++) {     \\\n    store32_le(index8_32(poly_key, i), result + i); \\\n  }\n#endif\n\nstatic void rfc8439_keygen(uint8_t poly_key[32],\n                           const uint8_t key[CHACHA20_KEY_SIZE],\n                           const uint8_t nonce[CHACHA20_NONCE_SIZE]) {\n  uint32_t state[CHACHA20_STATE_WORDS];\n  uint32_t result[CHACHA20_STATE_WORDS];\n  size_t i;\n  initialize_state(state, key, nonce, 0);\n  core_block(state, result);\n  serialize(poly_key, result);\n  (void) i;\n}\n// ******* END: chacha-portable.c ********\n// ******* BEGIN: poly1305-donna.c ********\n\n/* auto detect between 32bit / 64bit */\n#if /* uint128 available on 64bit system*/                              \\\n    (defined(__SIZEOF_INT128__) &&                                      \\\n     defined(__LP64__))                       /* MSVC 64bit compiler */ \\\n    || (defined(_MSC_VER) && defined(_M_X64)) /* gcc >= 4.4 64bit */    \\\n    || (defined(__GNUC__) && defined(__LP64__) &&                       \\\n        ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4))))\n#define __GUESS64\n#else\n#define __GUESS32\n#endif\n\n#if defined(POLY1305_8BIT)\n/*\n        poly1305 implementation using 8 bit * 8 bit = 16 bit multiplication and\n32 bit addition\n\n        based on the public domain reference version in supercop by djb\nstatic */\n\n#if defined(_MSC_VER) && _MSC_VER < 1700\n#define POLY1305_NOINLINE\n#elif defined(_MSC_VER)\n#define POLY1305_NOINLINE __declspec(noinline)\n#elif defined(__GNUC__)\n#define POLY1305_NOINLINE __attribute__((noinline))\n#else\n#define POLY1305_NOINLINE\n#endif\n\n#define poly1305_block_size 16\n\n/* 17 + sizeof(size_t) + 51*sizeof(unsigned char) */\ntypedef struct poly1305_state_internal_t {\n  unsigned char buffer[poly1305_block_size];\n  size_t leftover;\n  unsigned char h[17];\n  unsigned char r[17];\n  unsigned char pad[17];\n  unsigned char final;\n} poly1305_state_internal_t;\n\nstatic void poly1305_init(poly1305_context *ctx, const unsigned char key[32]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  size_t i;\n\n  st->leftover = 0;\n\n  /* h = 0 */\n  for (i = 0; i < 17; i++) st->h[i] = 0;\n\n  /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */\n  st->r[0] = key[0] & 0xff;\n  st->r[1] = key[1] & 0xff;\n  st->r[2] = key[2] & 0xff;\n  st->r[3] = key[3] & 0x0f;\n  st->r[4] = key[4] & 0xfc;\n  st->r[5] = key[5] & 0xff;\n  st->r[6] = key[6] & 0xff;\n  st->r[7] = key[7] & 0x0f;\n  st->r[8] = key[8] & 0xfc;\n  st->r[9] = key[9] & 0xff;\n  st->r[10] = key[10] & 0xff;\n  st->r[11] = key[11] & 0x0f;\n  st->r[12] = key[12] & 0xfc;\n  st->r[13] = key[13] & 0xff;\n  st->r[14] = key[14] & 0xff;\n  st->r[15] = key[15] & 0x0f;\n  st->r[16] = 0;\n\n  /* save pad for later */\n  for (i = 0; i < 16; i++) st->pad[i] = key[i + 16];\n  st->pad[16] = 0;\n\n  st->final = 0;\n}\n\nstatic void poly1305_add(unsigned char h[17], const unsigned char c[17]) {\n  unsigned short u;\n  unsigned int i;\n  for (u = 0, i = 0; i < 17; i++) {\n    u += (unsigned short) h[i] + (unsigned short) c[i];\n    h[i] = (unsigned char) u & 0xff;\n    u >>= 8;\n  }\n}\n\nstatic void poly1305_squeeze(unsigned char h[17], unsigned long hr[17]) {\n  unsigned long u;\n  unsigned int i;\n  u = 0;\n  for (i = 0; i < 16; i++) {\n    u += hr[i];\n    h[i] = (unsigned char) u & 0xff;\n    u >>= 8;\n  }\n  u += hr[16];\n  h[16] = (unsigned char) u & 0x03;\n  u >>= 2;\n  u += (u << 2); /* u *= 5; */\n  for (i = 0; i < 16; i++) {\n    u += h[i];\n    h[i] = (unsigned char) u & 0xff;\n    u >>= 8;\n  }\n  h[16] += (unsigned char) u;\n}\n\nstatic void poly1305_freeze(unsigned char h[17]) {\n  const unsigned char minusp[17] = {0x05, 0x00, 0x00, 0x00, 0x00, 0x00,\n                                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n                                    0x00, 0x00, 0x00, 0x00, 0xfc};\n  unsigned char horig[17], negative;\n  unsigned int i;\n\n  /* compute h + -p */\n  for (i = 0; i < 17; i++) horig[i] = h[i];\n  poly1305_add(h, minusp);\n\n  /* select h if h < p, or h + -p if h >= p */\n  negative = -(h[16] >> 7);\n  for (i = 0; i < 17; i++) h[i] ^= negative & (horig[i] ^ h[i]);\n}\n\nstatic void poly1305_blocks(poly1305_state_internal_t *st,\n                            const unsigned char *m, size_t bytes) {\n  const unsigned char hibit = st->final ^ 1; /* 1 << 128 */\n\n  while (bytes >= poly1305_block_size) {\n    unsigned long hr[17], u;\n    unsigned char c[17];\n    unsigned int i, j;\n\n    /* h += m */\n    for (i = 0; i < 16; i++) c[i] = m[i];\n    c[16] = hibit;\n    poly1305_add(st->h, c);\n\n    /* h *= r */\n    for (i = 0; i < 17; i++) {\n      u = 0;\n      for (j = 0; j <= i; j++) {\n        u += (unsigned short) st->h[j] * st->r[i - j];\n      }\n      for (j = i + 1; j < 17; j++) {\n        unsigned long v = (unsigned short) st->h[j] * st->r[i + 17 - j];\n        v = ((v << 8) + (v << 6)); /* v *= (5 << 6); */\n        u += v;\n      }\n      hr[i] = u;\n    }\n\n    /* (partial) h %= p */\n    poly1305_squeeze(st->h, hr);\n\n    m += poly1305_block_size;\n    bytes -= poly1305_block_size;\n  }\n}\n\nstatic POLY1305_NOINLINE void poly1305_finish(poly1305_context *ctx,\n                                              unsigned char mac[16]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  size_t i;\n\n  /* process the remaining block */\n  if (st->leftover) {\n    size_t i = st->leftover;\n    st->buffer[i++] = 1;\n    for (; i < poly1305_block_size; i++) st->buffer[i] = 0;\n    st->final = 1;\n    poly1305_blocks(st, st->buffer, poly1305_block_size);\n  }\n\n  /* fully reduce h */\n  poly1305_freeze(st->h);\n\n  /* h = (h + pad) % (1 << 128) */\n  poly1305_add(st->h, st->pad);\n  for (i = 0; i < 16; i++) mac[i] = st->h[i];\n\n  /* zero out the state */\n  for (i = 0; i < 17; i++) st->h[i] = 0;\n  for (i = 0; i < 17; i++) st->r[i] = 0;\n  for (i = 0; i < 17; i++) st->pad[i] = 0;\n}\n#elif defined(POLY1305_16BIT)\n/*\n        poly1305 implementation using 16 bit * 16 bit = 32 bit multiplication\nand 32 bit addition static */\n\n#if defined(_MSC_VER) && _MSC_VER < 1700\n#define POLY1305_NOINLINE\n#elif defined(_MSC_VER)\n#define POLY1305_NOINLINE __declspec(noinline)\n#elif defined(__GNUC__)\n#define POLY1305_NOINLINE __attribute__((noinline))\n#else\n#define POLY1305_NOINLINE\n#endif\n\n#define poly1305_block_size 16\n\n/* 17 + sizeof(size_t) + 18*sizeof(unsigned short) */\ntypedef struct poly1305_state_internal_t {\n  unsigned char buffer[poly1305_block_size];\n  size_t leftover;\n  unsigned short r[10];\n  unsigned short h[10];\n  unsigned short pad[8];\n  unsigned char final;\n} poly1305_state_internal_t;\n\n/* interpret two 8 bit unsigned integers as a 16 bit unsigned integer in little\n * endian */\nstatic unsigned short U8TO16(const unsigned char *p) {\n  return (((unsigned short) (p[0] & 0xff)) |\n          ((unsigned short) (p[1] & 0xff) << 8));\n}\n\n/* store a 16 bit unsigned integer as two 8 bit unsigned integers in little\n * endian */\nstatic void U16TO8(unsigned char *p, unsigned short v) {\n  p[0] = (v) &0xff;\n  p[1] = (v >> 8) & 0xff;\n}\n\nstatic void poly1305_init(poly1305_context *ctx, const unsigned char key[32]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  unsigned short t0, t1, t2, t3, t4, t5, t6, t7;\n  size_t i;\n\n  /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */\n  t0 = U8TO16(&key[0]);\n  st->r[0] = (t0) &0x1fff;\n  t1 = U8TO16(&key[2]);\n  st->r[1] = ((t0 >> 13) | (t1 << 3)) & 0x1fff;\n  t2 = U8TO16(&key[4]);\n  st->r[2] = ((t1 >> 10) | (t2 << 6)) & 0x1f03;\n  t3 = U8TO16(&key[6]);\n  st->r[3] = ((t2 >> 7) | (t3 << 9)) & 0x1fff;\n  t4 = U8TO16(&key[8]);\n  st->r[4] = ((t3 >> 4) | (t4 << 12)) & 0x00ff;\n  st->r[5] = ((t4 >> 1)) & 0x1ffe;\n  t5 = U8TO16(&key[10]);\n  st->r[6] = ((t4 >> 14) | (t5 << 2)) & 0x1fff;\n  t6 = U8TO16(&key[12]);\n  st->r[7] = ((t5 >> 11) | (t6 << 5)) & 0x1f81;\n  t7 = U8TO16(&key[14]);\n  st->r[8] = ((t6 >> 8) | (t7 << 8)) & 0x1fff;\n  st->r[9] = ((t7 >> 5)) & 0x007f;\n\n  /* h = 0 */\n  for (i = 0; i < 10; i++) st->h[i] = 0;\n\n  /* save pad for later */\n  for (i = 0; i < 8; i++) st->pad[i] = U8TO16(&key[16 + (2 * i)]);\n\n  st->leftover = 0;\n  st->final = 0;\n}\n\nstatic void poly1305_blocks(poly1305_state_internal_t *st,\n                            const unsigned char *m, size_t bytes) {\n  const unsigned short hibit = (st->final) ? 0 : (1 << 11); /* 1 << 128 */\n  unsigned short t0, t1, t2, t3, t4, t5, t6, t7;\n  unsigned long d[10];\n  unsigned long c;\n\n  while (bytes >= poly1305_block_size) {\n    size_t i, j;\n\n    /* h += m[i] */\n    t0 = U8TO16(&m[0]);\n    st->h[0] += (t0) &0x1fff;\n    t1 = U8TO16(&m[2]);\n    st->h[1] += ((t0 >> 13) | (t1 << 3)) & 0x1fff;\n    t2 = U8TO16(&m[4]);\n    st->h[2] += ((t1 >> 10) | (t2 << 6)) & 0x1fff;\n    t3 = U8TO16(&m[6]);\n    st->h[3] += ((t2 >> 7) | (t3 << 9)) & 0x1fff;\n    t4 = U8TO16(&m[8]);\n    st->h[4] += ((t3 >> 4) | (t4 << 12)) & 0x1fff;\n    st->h[5] += ((t4 >> 1)) & 0x1fff;\n    t5 = U8TO16(&m[10]);\n    st->h[6] += ((t4 >> 14) | (t5 << 2)) & 0x1fff;\n    t6 = U8TO16(&m[12]);\n    st->h[7] += ((t5 >> 11) | (t6 << 5)) & 0x1fff;\n    t7 = U8TO16(&m[14]);\n    st->h[8] += ((t6 >> 8) | (t7 << 8)) & 0x1fff;\n    st->h[9] += ((t7 >> 5)) | hibit;\n\n    /* h *= r, (partial) h %= p */\n    for (i = 0, c = 0; i < 10; i++) {\n      d[i] = c;\n      for (j = 0; j < 10; j++) {\n        d[i] += (unsigned long) st->h[j] *\n                ((j <= i) ? st->r[i - j] : (5 * st->r[i + 10 - j]));\n        /* Sum(h[i] * r[i] * 5) will overflow slightly above 6 products with an\n         * unclamped r, so carry at 5 */\n        if (j == 4) {\n          c = (d[i] >> 13);\n          d[i] &= 0x1fff;\n        }\n      }\n      c += (d[i] >> 13);\n      d[i] &= 0x1fff;\n    }\n    c = ((c << 2) + c); /* c *= 5 */\n    c += d[0];\n    d[0] = ((unsigned short) c & 0x1fff);\n    c = (c >> 13);\n    d[1] += c;\n\n    for (i = 0; i < 10; i++) st->h[i] = (unsigned short) d[i];\n\n    m += poly1305_block_size;\n    bytes -= poly1305_block_size;\n  }\n}\n\nstatic POLY1305_NOINLINE void poly1305_finish(poly1305_context *ctx,\n                                              unsigned char mac[16]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  unsigned short c;\n  unsigned short g[10];\n  unsigned short mask;\n  unsigned long f;\n  size_t i;\n\n  /* process the remaining block */\n  if (st->leftover) {\n    size_t i = st->leftover;\n    st->buffer[i++] = 1;\n    for (; i < poly1305_block_size; i++) st->buffer[i] = 0;\n    st->final = 1;\n    poly1305_blocks(st, st->buffer, poly1305_block_size);\n  }\n\n  /* fully carry h */\n  c = st->h[1] >> 13;\n  st->h[1] &= 0x1fff;\n  for (i = 2; i < 10; i++) {\n    st->h[i] += c;\n    c = st->h[i] >> 13;\n    st->h[i] &= 0x1fff;\n  }\n  st->h[0] += (c * 5);\n  c = st->h[0] >> 13;\n  st->h[0] &= 0x1fff;\n  st->h[1] += c;\n  c = st->h[1] >> 13;\n  st->h[1] &= 0x1fff;\n  st->h[2] += c;\n\n  /* compute h + -p */\n  g[0] = st->h[0] + 5;\n  c = g[0] >> 13;\n  g[0] &= 0x1fff;\n  for (i = 1; i < 10; i++) {\n    g[i] = st->h[i] + c;\n    c = g[i] >> 13;\n    g[i] &= 0x1fff;\n  }\n\n  /* select h if h < p, or h + -p if h >= p */\n  mask = (c ^ 1) - 1;\n  for (i = 0; i < 10; i++) g[i] &= mask;\n  mask = ~mask;\n  for (i = 0; i < 10; i++) st->h[i] = (st->h[i] & mask) | g[i];\n\n  /* h = h % (2^128) */\n  st->h[0] = ((st->h[0]) | (st->h[1] << 13)) & 0xffff;\n  st->h[1] = ((st->h[1] >> 3) | (st->h[2] << 10)) & 0xffff;\n  st->h[2] = ((st->h[2] >> 6) | (st->h[3] << 7)) & 0xffff;\n  st->h[3] = ((st->h[3] >> 9) | (st->h[4] << 4)) & 0xffff;\n  st->h[4] = ((st->h[4] >> 12) | (st->h[5] << 1) | (st->h[6] << 14)) & 0xffff;\n  st->h[5] = ((st->h[6] >> 2) | (st->h[7] << 11)) & 0xffff;\n  st->h[6] = ((st->h[7] >> 5) | (st->h[8] << 8)) & 0xffff;\n  st->h[7] = ((st->h[8] >> 8) | (st->h[9] << 5)) & 0xffff;\n\n  /* mac = (h + pad) % (2^128) */\n  f = (unsigned long) st->h[0] + st->pad[0];\n  st->h[0] = (unsigned short) f;\n  for (i = 1; i < 8; i++) {\n    f = (unsigned long) st->h[i] + st->pad[i] + (f >> 16);\n    st->h[i] = (unsigned short) f;\n  }\n\n  for (i = 0; i < 8; i++) U16TO8(mac + (i * 2), st->h[i]);\n\n  /* zero out the state */\n  for (i = 0; i < 10; i++) st->h[i] = 0;\n  for (i = 0; i < 10; i++) st->r[i] = 0;\n  for (i = 0; i < 8; i++) st->pad[i] = 0;\n}\n#elif defined(POLY1305_32BIT) || \\\n    (!defined(POLY1305_64BIT) && defined(__GUESS32))\n/*\n        poly1305 implementation using 32 bit * 32 bit = 64 bit multiplication\nand 64 bit addition static */\n\n#if defined(_MSC_VER) && _MSC_VER < 1700\n#define POLY1305_NOINLINE\n#elif defined(_MSC_VER)\n#define POLY1305_NOINLINE __declspec(noinline)\n#elif defined(__GNUC__)\n#define POLY1305_NOINLINE __attribute__((noinline))\n#else\n#define POLY1305_NOINLINE\n#endif\n\n#define poly1305_block_size 16\n\n/* 17 + sizeof(size_t) + 14*sizeof(unsigned long) */\ntypedef struct poly1305_state_internal_t {\n  unsigned long r[5];\n  unsigned long h[5];\n  unsigned long pad[4];\n  size_t leftover;\n  unsigned char buffer[poly1305_block_size];\n  unsigned char final;\n} poly1305_state_internal_t;\n\n/* interpret four 8 bit unsigned integers as a 32 bit unsigned integer in little\n * endian */\nstatic unsigned long U8TO32(const unsigned char *p) {\n  return (((unsigned long) (p[0] & 0xff)) |\n          ((unsigned long) (p[1] & 0xff) << 8) |\n          ((unsigned long) (p[2] & 0xff) << 16) |\n          ((unsigned long) (p[3] & 0xff) << 24));\n}\n\n/* store a 32 bit unsigned integer as four 8 bit unsigned integers in little\n * endian */\nstatic void U32TO8(unsigned char *p, unsigned long v) {\n  p[0] = (unsigned char) ((v) &0xff);\n  p[1] = (unsigned char) ((v >> 8) & 0xff);\n  p[2] = (unsigned char) ((v >> 16) & 0xff);\n  p[3] = (unsigned char) ((v >> 24) & 0xff);\n}\n\nstatic void poly1305_init(poly1305_context *ctx, const unsigned char key[32]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n\n  /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */\n  st->r[0] = (U8TO32(&key[0])) & 0x3ffffff;\n  st->r[1] = (U8TO32(&key[3]) >> 2) & 0x3ffff03;\n  st->r[2] = (U8TO32(&key[6]) >> 4) & 0x3ffc0ff;\n  st->r[3] = (U8TO32(&key[9]) >> 6) & 0x3f03fff;\n  st->r[4] = (U8TO32(&key[12]) >> 8) & 0x00fffff;\n\n  /* h = 0 */\n  st->h[0] = 0;\n  st->h[1] = 0;\n  st->h[2] = 0;\n  st->h[3] = 0;\n  st->h[4] = 0;\n\n  /* save pad for later */\n  st->pad[0] = U8TO32(&key[16]);\n  st->pad[1] = U8TO32(&key[20]);\n  st->pad[2] = U8TO32(&key[24]);\n  st->pad[3] = U8TO32(&key[28]);\n\n  st->leftover = 0;\n  st->final = 0;\n}\n\nstatic void poly1305_blocks(poly1305_state_internal_t *st,\n                            const unsigned char *m, size_t bytes) {\n  const unsigned long hibit = (st->final) ? 0 : (1UL << 24); /* 1 << 128 */\n  unsigned long r0, r1, r2, r3, r4;\n  unsigned long s1, s2, s3, s4;\n  unsigned long h0, h1, h2, h3, h4;\n  uint64_t d0, d1, d2, d3, d4;\n  unsigned long c;\n\n  r0 = st->r[0];\n  r1 = st->r[1];\n  r2 = st->r[2];\n  r3 = st->r[3];\n  r4 = st->r[4];\n\n  s1 = r1 * 5;\n  s2 = r2 * 5;\n  s3 = r3 * 5;\n  s4 = r4 * 5;\n\n  h0 = st->h[0];\n  h1 = st->h[1];\n  h2 = st->h[2];\n  h3 = st->h[3];\n  h4 = st->h[4];\n\n  while (bytes >= poly1305_block_size) {\n    /* h += m[i] */\n    h0 += (U8TO32(m + 0)) & 0x3ffffff;\n    h1 += (U8TO32(m + 3) >> 2) & 0x3ffffff;\n    h2 += (U8TO32(m + 6) >> 4) & 0x3ffffff;\n    h3 += (U8TO32(m + 9) >> 6) & 0x3ffffff;\n    h4 += (U8TO32(m + 12) >> 8) | hibit;\n\n    /* h *= r */\n    d0 = ((uint64_t) h0 * r0) + ((uint64_t) h1 * s4) + ((uint64_t) h2 * s3) +\n         ((uint64_t) h3 * s2) + ((uint64_t) h4 * s1);\n    d1 = ((uint64_t) h0 * r1) + ((uint64_t) h1 * r0) + ((uint64_t) h2 * s4) +\n         ((uint64_t) h3 * s3) + ((uint64_t) h4 * s2);\n    d2 = ((uint64_t) h0 * r2) + ((uint64_t) h1 * r1) + ((uint64_t) h2 * r0) +\n         ((uint64_t) h3 * s4) + ((uint64_t) h4 * s3);\n    d3 = ((uint64_t) h0 * r3) + ((uint64_t) h1 * r2) + ((uint64_t) h2 * r1) +\n         ((uint64_t) h3 * r0) + ((uint64_t) h4 * s4);\n    d4 = ((uint64_t) h0 * r4) + ((uint64_t) h1 * r3) + ((uint64_t) h2 * r2) +\n         ((uint64_t) h3 * r1) + ((uint64_t) h4 * r0);\n\n    /* (partial) h %= p */\n    c = (unsigned long) (d0 >> 26);\n    h0 = (unsigned long) d0 & 0x3ffffff;\n    d1 += c;\n    c = (unsigned long) (d1 >> 26);\n    h1 = (unsigned long) d1 & 0x3ffffff;\n    d2 += c;\n    c = (unsigned long) (d2 >> 26);\n    h2 = (unsigned long) d2 & 0x3ffffff;\n    d3 += c;\n    c = (unsigned long) (d3 >> 26);\n    h3 = (unsigned long) d3 & 0x3ffffff;\n    d4 += c;\n    c = (unsigned long) (d4 >> 26);\n    h4 = (unsigned long) d4 & 0x3ffffff;\n    h0 += c * 5;\n    c = (h0 >> 26);\n    h0 = h0 & 0x3ffffff;\n    h1 += c;\n\n    m += poly1305_block_size;\n    bytes -= poly1305_block_size;\n  }\n\n  st->h[0] = h0;\n  st->h[1] = h1;\n  st->h[2] = h2;\n  st->h[3] = h3;\n  st->h[4] = h4;\n}\n\nstatic POLY1305_NOINLINE void poly1305_finish(poly1305_context *ctx,\n                                              unsigned char mac[16]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  unsigned long h0, h1, h2, h3, h4, c;\n  unsigned long g0, g1, g2, g3, g4;\n  uint64_t f;\n  unsigned long mask;\n\n  /* process the remaining block */\n  if (st->leftover) {\n    size_t i = st->leftover;\n    st->buffer[i++] = 1;\n    for (; i < poly1305_block_size; i++) st->buffer[i] = 0;\n    st->final = 1;\n    poly1305_blocks(st, st->buffer, poly1305_block_size);\n  }\n\n  /* fully carry h */\n  h0 = st->h[0];\n  h1 = st->h[1];\n  h2 = st->h[2];\n  h3 = st->h[3];\n  h4 = st->h[4];\n\n  c = h1 >> 26;\n  h1 = h1 & 0x3ffffff;\n  h2 += c;\n  c = h2 >> 26;\n  h2 = h2 & 0x3ffffff;\n  h3 += c;\n  c = h3 >> 26;\n  h3 = h3 & 0x3ffffff;\n  h4 += c;\n  c = h4 >> 26;\n  h4 = h4 & 0x3ffffff;\n  h0 += c * 5;\n  c = h0 >> 26;\n  h0 = h0 & 0x3ffffff;\n  h1 += c;\n\n  /* compute h + -p */\n  g0 = h0 + 5;\n  c = g0 >> 26;\n  g0 &= 0x3ffffff;\n  g1 = h1 + c;\n  c = g1 >> 26;\n  g1 &= 0x3ffffff;\n  g2 = h2 + c;\n  c = g2 >> 26;\n  g2 &= 0x3ffffff;\n  g3 = h3 + c;\n  c = g3 >> 26;\n  g3 &= 0x3ffffff;\n  g4 = h4 + c - (1UL << 26);\n\n  /* select h if h < p, or h + -p if h >= p */\n  mask = (g4 >> ((sizeof(unsigned long) * 8) - 1)) - 1;\n  g0 &= mask;\n  g1 &= mask;\n  g2 &= mask;\n  g3 &= mask;\n  g4 &= mask;\n  mask = ~mask;\n  h0 = (h0 & mask) | g0;\n  h1 = (h1 & mask) | g1;\n  h2 = (h2 & mask) | g2;\n  h3 = (h3 & mask) | g3;\n  h4 = (h4 & mask) | g4;\n\n  /* h = h % (2^128) */\n  h0 = ((h0) | (h1 << 26)) & 0xffffffff;\n  h1 = ((h1 >> 6) | (h2 << 20)) & 0xffffffff;\n  h2 = ((h2 >> 12) | (h3 << 14)) & 0xffffffff;\n  h3 = ((h3 >> 18) | (h4 << 8)) & 0xffffffff;\n\n  /* mac = (h + pad) % (2^128) */\n  f = (uint64_t) h0 + st->pad[0];\n  h0 = (unsigned long) f;\n  f = (uint64_t) h1 + st->pad[1] + (f >> 32);\n  h1 = (unsigned long) f;\n  f = (uint64_t) h2 + st->pad[2] + (f >> 32);\n  h2 = (unsigned long) f;\n  f = (uint64_t) h3 + st->pad[3] + (f >> 32);\n  h3 = (unsigned long) f;\n\n  U32TO8(mac + 0, h0);\n  U32TO8(mac + 4, h1);\n  U32TO8(mac + 8, h2);\n  U32TO8(mac + 12, h3);\n\n  /* zero out the state */\n  st->h[0] = 0;\n  st->h[1] = 0;\n  st->h[2] = 0;\n  st->h[3] = 0;\n  st->h[4] = 0;\n  st->r[0] = 0;\n  st->r[1] = 0;\n  st->r[2] = 0;\n  st->r[3] = 0;\n  st->r[4] = 0;\n  st->pad[0] = 0;\n  st->pad[1] = 0;\n  st->pad[2] = 0;\n  st->pad[3] = 0;\n}\n\n#else\n/*\n        poly1305 implementation using 64 bit * 64 bit = 128 bit multiplication\nand 128 bit addition static */\n\n#if defined(_MSC_VER)\n\ntypedef struct uint128_t {\n  uint64_t lo;\n  uint64_t hi;\n} uint128_t;\n\n#define MUL128(out, x, y) out.lo = _umul128((x), (y), &out.hi)\n#define ADD(out, in)                \\\n  {                                 \\\n    uint64_t t = out.lo;            \\\n    out.lo += in.lo;                \\\n    out.hi += (out.lo < t) + in.hi; \\\n  }\n#define ADDLO(out, in)      \\\n  {                         \\\n    uint64_t t = out.lo;    \\\n    out.lo += in;           \\\n    out.hi += (out.lo < t); \\\n  }\n#define SHR(in, shift) (__shiftright128(in.lo, in.hi, (shift)))\n#define LO(in) (in.lo)\n\n#if defined(_MSC_VER) && _MSC_VER < 1700\n#define POLY1305_NOINLINE\n#else\n#define POLY1305_NOINLINE __declspec(noinline)\n#endif\n#elif defined(__GNUC__)\n#if defined(__SIZEOF_INT128__)\n// Get rid of GCC warning \"ISO C does not support '__int128' types\"\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wpedantic\"\ntypedef unsigned __int128 uint128_t;\n#pragma GCC diagnostic pop\n#else\ntypedef unsigned uint128_t __attribute__((mode(TI)));\n#endif\n\n#define MUL128(out, x, y) out = ((uint128_t) x * y)\n#define ADD(out, in) out += in\n#define ADDLO(out, in) out += in\n#define SHR(in, shift) (uint64_t)(in >> (shift))\n#define LO(in) (uint64_t)(in)\n\n#define POLY1305_NOINLINE __attribute__((noinline))\n#endif\n\n#define poly1305_block_size 16\n\n/* 17 + sizeof(size_t) + 8*sizeof(uint64_t) */\ntypedef struct poly1305_state_internal_t {\n  uint64_t r[3];\n  uint64_t h[3];\n  uint64_t pad[2];\n  size_t leftover;\n  unsigned char buffer[poly1305_block_size];\n  unsigned char final;\n} poly1305_state_internal_t;\n\n/* interpret eight 8 bit unsigned integers as a 64 bit unsigned integer in\n * little endian */\nstatic uint64_t U8TO64(const unsigned char *p) {\n  return (((uint64_t) (p[0] & 0xff)) | ((uint64_t) (p[1] & 0xff) << 8) |\n          ((uint64_t) (p[2] & 0xff) << 16) | ((uint64_t) (p[3] & 0xff) << 24) |\n          ((uint64_t) (p[4] & 0xff) << 32) | ((uint64_t) (p[5] & 0xff) << 40) |\n          ((uint64_t) (p[6] & 0xff) << 48) | ((uint64_t) (p[7] & 0xff) << 56));\n}\n\n/* store a 64 bit unsigned integer as eight 8 bit unsigned integers in little\n * endian */\nstatic void U64TO8(unsigned char *p, uint64_t v) {\n  p[0] = (unsigned char) ((v) &0xff);\n  p[1] = (unsigned char) ((v >> 8) & 0xff);\n  p[2] = (unsigned char) ((v >> 16) & 0xff);\n  p[3] = (unsigned char) ((v >> 24) & 0xff);\n  p[4] = (unsigned char) ((v >> 32) & 0xff);\n  p[5] = (unsigned char) ((v >> 40) & 0xff);\n  p[6] = (unsigned char) ((v >> 48) & 0xff);\n  p[7] = (unsigned char) ((v >> 56) & 0xff);\n}\n\nstatic void poly1305_init(poly1305_context *ctx, const unsigned char key[32]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  uint64_t t0, t1;\n\n  /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */\n  t0 = U8TO64(&key[0]);\n  t1 = U8TO64(&key[8]);\n\n  st->r[0] = (t0) &0xffc0fffffff;\n  st->r[1] = ((t0 >> 44) | (t1 << 20)) & 0xfffffc0ffff;\n  st->r[2] = ((t1 >> 24)) & 0x00ffffffc0f;\n\n  /* h = 0 */\n  st->h[0] = 0;\n  st->h[1] = 0;\n  st->h[2] = 0;\n\n  /* save pad for later */\n  st->pad[0] = U8TO64(&key[16]);\n  st->pad[1] = U8TO64(&key[24]);\n\n  st->leftover = 0;\n  st->final = 0;\n}\n\nstatic void poly1305_blocks(poly1305_state_internal_t *st,\n                            const unsigned char *m, size_t bytes) {\n  const uint64_t hibit = (st->final) ? 0 : ((uint64_t) 1 << 40); /* 1 << 128 */\n  uint64_t r0, r1, r2;\n  uint64_t s1, s2;\n  uint64_t h0, h1, h2;\n  uint64_t c;\n  uint128_t d0, d1, d2, d;\n\n  r0 = st->r[0];\n  r1 = st->r[1];\n  r2 = st->r[2];\n\n  h0 = st->h[0];\n  h1 = st->h[1];\n  h2 = st->h[2];\n\n  s1 = r1 * (5 << 2);\n  s2 = r2 * (5 << 2);\n\n  while (bytes >= poly1305_block_size) {\n    uint64_t t0, t1;\n\n    /* h += m[i] */\n    t0 = U8TO64(&m[0]);\n    t1 = U8TO64(&m[8]);\n\n    h0 += ((t0) &0xfffffffffff);\n    h1 += (((t0 >> 44) | (t1 << 20)) & 0xfffffffffff);\n    h2 += (((t1 >> 24)) & 0x3ffffffffff) | hibit;\n\n    /* h *= r */\n    MUL128(d0, h0, r0);\n    MUL128(d, h1, s2);\n    ADD(d0, d);\n    MUL128(d, h2, s1);\n    ADD(d0, d);\n    MUL128(d1, h0, r1);\n    MUL128(d, h1, r0);\n    ADD(d1, d);\n    MUL128(d, h2, s2);\n    ADD(d1, d);\n    MUL128(d2, h0, r2);\n    MUL128(d, h1, r1);\n    ADD(d2, d);\n    MUL128(d, h2, r0);\n    ADD(d2, d);\n\n    /* (partial) h %= p */\n    c = SHR(d0, 44);\n    h0 = LO(d0) & 0xfffffffffff;\n    ADDLO(d1, c);\n    c = SHR(d1, 44);\n    h1 = LO(d1) & 0xfffffffffff;\n    ADDLO(d2, c);\n    c = SHR(d2, 42);\n    h2 = LO(d2) & 0x3ffffffffff;\n    h0 += c * 5;\n    c = (h0 >> 44);\n    h0 = h0 & 0xfffffffffff;\n    h1 += c;\n\n    m += poly1305_block_size;\n    bytes -= poly1305_block_size;\n  }\n\n  st->h[0] = h0;\n  st->h[1] = h1;\n  st->h[2] = h2;\n}\n\nstatic POLY1305_NOINLINE void poly1305_finish(poly1305_context *ctx,\n                                              unsigned char mac[16]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  uint64_t h0, h1, h2, c;\n  uint64_t g0, g1, g2;\n  uint64_t t0, t1;\n\n  /* process the remaining block */\n  if (st->leftover) {\n    size_t i = st->leftover;\n    st->buffer[i] = 1;\n    for (i = i + 1; i < poly1305_block_size; i++) st->buffer[i] = 0;\n    st->final = 1;\n    poly1305_blocks(st, st->buffer, poly1305_block_size);\n  }\n\n  /* fully carry h */\n  h0 = st->h[0];\n  h1 = st->h[1];\n  h2 = st->h[2];\n\n  c = (h1 >> 44);\n  h1 &= 0xfffffffffff;\n  h2 += c;\n  c = (h2 >> 42);\n  h2 &= 0x3ffffffffff;\n  h0 += c * 5;\n  c = (h0 >> 44);\n  h0 &= 0xfffffffffff;\n  h1 += c;\n  c = (h1 >> 44);\n  h1 &= 0xfffffffffff;\n  h2 += c;\n  c = (h2 >> 42);\n  h2 &= 0x3ffffffffff;\n  h0 += c * 5;\n  c = (h0 >> 44);\n  h0 &= 0xfffffffffff;\n  h1 += c;\n\n  /* compute h + -p */\n  g0 = h0 + 5;\n  c = (g0 >> 44);\n  g0 &= 0xfffffffffff;\n  g1 = h1 + c;\n  c = (g1 >> 44);\n  g1 &= 0xfffffffffff;\n  g2 = h2 + c - ((uint64_t) 1 << 42);\n\n  /* select h if h < p, or h + -p if h >= p */\n  c = (g2 >> ((sizeof(uint64_t) * 8) - 1)) - 1;\n  g0 &= c;\n  g1 &= c;\n  g2 &= c;\n  c = ~c;\n  h0 = (h0 & c) | g0;\n  h1 = (h1 & c) | g1;\n  h2 = (h2 & c) | g2;\n\n  /* h = (h + pad) */\n  t0 = st->pad[0];\n  t1 = st->pad[1];\n\n  h0 += ((t0) &0xfffffffffff);\n  c = (h0 >> 44);\n  h0 &= 0xfffffffffff;\n  h1 += (((t0 >> 44) | (t1 << 20)) & 0xfffffffffff) + c;\n  c = (h1 >> 44);\n  h1 &= 0xfffffffffff;\n  h2 += (((t1 >> 24)) & 0x3ffffffffff) + c;\n  h2 &= 0x3ffffffffff;\n\n  /* mac = h % (2^128) */\n  h0 = ((h0) | (h1 << 44));\n  h1 = ((h1 >> 20) | (h2 << 24));\n\n  U64TO8(&mac[0], h0);\n  U64TO8(&mac[8], h1);\n\n  /* zero out the state */\n  st->h[0] = 0;\n  st->h[1] = 0;\n  st->h[2] = 0;\n  st->r[0] = 0;\n  st->r[1] = 0;\n  st->r[2] = 0;\n  st->pad[0] = 0;\n  st->pad[1] = 0;\n}\n\n#endif\n\nstatic void poly1305_update(poly1305_context *ctx, const unsigned char *m,\n                            size_t bytes) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  size_t i;\n\n  /* handle leftover */\n  if (st->leftover) {\n    size_t want = (poly1305_block_size - st->leftover);\n    if (want > bytes) want = bytes;\n    for (i = 0; i < want; i++) st->buffer[st->leftover + i] = m[i];\n    bytes -= want;\n    m += want;\n    st->leftover += want;\n    if (st->leftover < poly1305_block_size) return;\n    poly1305_blocks(st, st->buffer, poly1305_block_size);\n    st->leftover = 0;\n  }\n\n  /* process full blocks */\n  if (bytes >= poly1305_block_size) {\n    size_t want = (bytes & (size_t) ~(poly1305_block_size - 1));\n    poly1305_blocks(st, m, want);\n    m += want;\n    bytes -= want;\n  }\n\n  /* store leftover */\n  if (bytes) {\n    for (i = 0; i < bytes; i++) st->buffer[st->leftover + i] = m[i];\n    st->leftover += bytes;\n  }\n}\n\n// ******* END: poly1305-donna.c ********\n// ******* BEGIN: portable8439.c ********\n\n#define __CHACHA20_BLOCK_SIZE (64)\n#define __POLY1305_KEY_SIZE (32)\n\nstatic PORTABLE_8439_DECL uint8_t __ZEROES[16] = {0};\nstatic PORTABLE_8439_DECL void pad_if_needed(poly1305_context *ctx,\n                                             size_t size) {\n  size_t padding = size % 16;\n  if (padding != 0) {\n    poly1305_update(ctx, __ZEROES, 16 - padding);\n  }\n}\n\n#define __u8(v) ((uint8_t) ((v) &0xFF))\n\n// TODO: make this depending on the unaligned/native read size possible\nstatic PORTABLE_8439_DECL void write_64bit_int(poly1305_context *ctx,\n                                               uint64_t value) {\n  uint8_t result[8];\n  result[0] = __u8(value);\n  result[1] = __u8(value >> 8);\n  result[2] = __u8(value >> 16);\n  result[3] = __u8(value >> 24);\n  result[4] = __u8(value >> 32);\n  result[5] = __u8(value >> 40);\n  result[6] = __u8(value >> 48);\n  result[7] = __u8(value >> 56);\n  poly1305_update(ctx, result, 8);\n}\n\nstatic PORTABLE_8439_DECL void poly1305_calculate_mac(\n    uint8_t *mac, const uint8_t *cipher_text, size_t cipher_text_size,\n    const uint8_t key[RFC_8439_KEY_SIZE],\n    const uint8_t nonce[RFC_8439_NONCE_SIZE], const uint8_t *ad,\n    size_t ad_size) {\n  // init poly key (section 2.6)\n  uint8_t poly_key[__POLY1305_KEY_SIZE] = {0};\n  poly1305_context poly_ctx;\n  rfc8439_keygen(poly_key, key, nonce);\n  // start poly1305 mac\n  poly1305_init(&poly_ctx, poly_key);\n\n  if (ad != NULL && ad_size > 0) {\n    // write AD if present\n    poly1305_update(&poly_ctx, ad, ad_size);\n    pad_if_needed(&poly_ctx, ad_size);\n  }\n\n  // now write the cipher text\n  poly1305_update(&poly_ctx, cipher_text, cipher_text_size);\n  pad_if_needed(&poly_ctx, cipher_text_size);\n\n  // write sizes\n  write_64bit_int(&poly_ctx, ad_size);\n  write_64bit_int(&poly_ctx, cipher_text_size);\n\n  // calculate MAC\n  poly1305_finish(&poly_ctx, mac);\n}\n\n#define MG_PM(p) ((size_t) (p))\n\n// pointers overlap if the smaller either ahead of the end,\n// or its end is before the start of the other\n//\n// s_size should be smaller or equal to b_size\n#define MG_OVERLAPPING(s, s_size, b, b_size) \\\n  (MG_PM(s) < MG_PM((b) + (b_size))) && (MG_PM(b) < MG_PM((s) + (s_size)))\n\nPORTABLE_8439_DECL size_t mg_chacha20_poly1305_encrypt(\n    uint8_t *restrict cipher_text, const uint8_t key[RFC_8439_KEY_SIZE],\n    const uint8_t nonce[RFC_8439_NONCE_SIZE], const uint8_t *restrict ad,\n    size_t ad_size, const uint8_t *restrict plain_text,\n    size_t plain_text_size) {\n  size_t new_size = plain_text_size + RFC_8439_TAG_SIZE;\n  if (MG_OVERLAPPING(plain_text, plain_text_size, cipher_text, new_size)) {\n    return (size_t) -1;\n  }\n  chacha20_xor_stream(cipher_text, plain_text, plain_text_size, key, nonce, 1);\n  poly1305_calculate_mac(cipher_text + plain_text_size, cipher_text,\n                         plain_text_size, key, nonce, ad, ad_size);\n  return new_size;\n}\n\nPORTABLE_8439_DECL size_t mg_chacha20_poly1305_decrypt(\n    uint8_t *restrict plain_text, const uint8_t key[RFC_8439_KEY_SIZE],\n    const uint8_t nonce[RFC_8439_NONCE_SIZE],\n    const uint8_t *restrict cipher_text, size_t cipher_text_size) {\n  // first we calculate the mac and see if it lines up, only then do we decrypt\n  size_t actual_size = cipher_text_size - RFC_8439_TAG_SIZE;\n  if (MG_OVERLAPPING(plain_text, actual_size, cipher_text, cipher_text_size)) {\n    return (size_t) -1;\n  }\n\n  chacha20_xor_stream(plain_text, cipher_text, actual_size, key, nonce, 1);\n  return actual_size;\n}\n// ******* END:   portable8439.c ********\n#endif  // MG_TLS == MG_TLS_BUILTIN\n"
  },
  {
    "path": "src/tls_chacha20.h",
    "content": "// portable8439 v1.0.1\n// Source: https://github.com/DavyLandman/portable8439\n// Licensed under CC0-1.0\n// Contains poly1305-donna e6ad6e091d30d7f4ec2d4f978be1fcfcbce72781 (Public\n// Domain)\n\n#include \"arch.h\"\n#include \"config.h\"\n#include \"tls.h\"\n\n#if MG_TLS == MG_TLS_BUILTIN\n#ifndef __PORTABLE_8439_H\n#define __PORTABLE_8439_H\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n// provide your own decl specificier like -DPORTABLE_8439_DECL=ICACHE_RAM_ATTR\n#ifndef PORTABLE_8439_DECL\n#define PORTABLE_8439_DECL\n#endif\n\n/*\n This library implements RFC 8439 a.k.a. ChaCha20-Poly1305 AEAD\n\n You can use this library to avoid attackers mutating or reusing your\n encrypted messages. This does assume you never reuse a nonce+key pair and,\n if possible, carefully pick your associated data.\n*/\n\n/* Make sure we are either nested in C++ or running in a C99+ compiler\n#if !defined(__cplusplus) && !defined(_MSC_VER) && \\\n    (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L)\n#error \"C99 or newer required\"\n#endif */\n\n// #if CHAR_BIT > 8\n// #    error \"Systems without native octals not suppoted\"\n// #endif\n\n#if defined(_MSC_VER) || defined(__cplusplus)\n// add restrict support is possible\n#if (defined(_MSC_VER) && _MSC_VER >= 1900) || defined(__clang__) || \\\n    defined(__GNUC__)\n#define restrict __restrict\n#else\n#define restrict\n#endif\n#endif\n\n#define RFC_8439_TAG_SIZE (16)\n#define RFC_8439_KEY_SIZE (32)\n#define RFC_8439_NONCE_SIZE (12)\n\n/*\n    Encrypt/Seal plain text bytes into a cipher text that can only be\n    decrypted by knowing the key, nonce and associated data.\n\n    input:\n        - key: RFC_8439_KEY_SIZE bytes that all parties have agreed\n            upon beforehand\n        - nonce: RFC_8439_NONCE_SIZE bytes that should never be repeated\n            for the same key. A counter or a pseudo-random value are fine.\n        - ad: associated data to include with calculating the tag of the\n            cipher text. Can be null for empty.\n        - plain_text: data to be encrypted, pointer + size should not overlap\n            with cipher_text pointer\n\n    output:\n        - cipher_text: encrypted plain_text with a tag appended. Make sure to\n            allocate at least plain_text_size + RFC_8439_TAG_SIZE\n\n    returns:\n        - size of bytes written to cipher_text, can be -1 if overlapping\n            pointers are passed for plain_text and cipher_text\n*/\nPORTABLE_8439_DECL size_t mg_chacha20_poly1305_encrypt(\n    uint8_t *restrict cipher_text, const uint8_t key[RFC_8439_KEY_SIZE],\n    const uint8_t nonce[RFC_8439_NONCE_SIZE], const uint8_t *restrict ad,\n    size_t ad_size, const uint8_t *restrict plain_text, size_t plain_text_size);\n\n/*\n    Decrypt/unseal cipher text given the right key, nonce, and additional data.\n\n    input:\n        - key: RFC_8439_KEY_SIZE bytes that all parties have agreed\n            upon beforehand\n        - nonce: RFC_8439_NONCE_SIZE bytes that should never be repeated for\n            the same key. A counter or a pseudo-random value are fine.\n        - ad: associated data to include with calculating the tag of the\n            cipher text. Can be null for empty.\n        - cipher_text: encrypted message.\n\n    output:\n        - plain_text: data to be encrypted, pointer + size should not overlap\n            with cipher_text pointer, leave at least enough room for\n            cipher_text_size - RFC_8439_TAG_SIZE\n\n    returns:\n        - size of bytes written to plain_text, -1 signals either:\n            - incorrect key/nonce/ad\n            - corrupted cipher_text\n            - overlapping pointers are passed for plain_text and cipher_text\n*/\nPORTABLE_8439_DECL size_t mg_chacha20_poly1305_decrypt(\n    uint8_t *restrict plain_text, const uint8_t key[RFC_8439_KEY_SIZE],\n    const uint8_t nonce[RFC_8439_NONCE_SIZE],\n    const uint8_t *restrict cipher_text, size_t cipher_text_size);\n#if defined(__cplusplus)\n}\n#endif\n#endif\n#endif\n"
  },
  {
    "path": "src/tls_dummy.c",
    "content": "#include \"tls.h\"\n\n#if MG_TLS == MG_TLS_NONE\nvoid mg_tls_init(struct mg_connection *c, const struct mg_tls_opts *opts) {\n  (void) opts;\n  mg_error(c, \"TLS is not enabled\");\n}\nvoid mg_tls_handshake(struct mg_connection *c) {\n  (void) c;\n}\nvoid mg_tls_free(struct mg_connection *c) {\n  (void) c;\n}\nlong mg_tls_recv(struct mg_connection *c, void *buf, size_t len) {\n  return c == NULL || buf == NULL || len == 0 ? 0 : -1;\n}\nlong mg_tls_send(struct mg_connection *c, const void *buf, size_t len) {\n  return c == NULL || buf == NULL || len == 0 ? 0 : -1;\n}\nsize_t mg_tls_pending(struct mg_connection *c) {\n  (void) c;\n  return 0;\n}\nvoid mg_tls_flush(struct mg_connection *c) {\n  (void) c;\n}\nvoid mg_tls_ctx_init(struct mg_mgr *mgr) {\n  (void) mgr;\n}\nvoid mg_tls_ctx_free(struct mg_mgr *mgr) {\n  (void) mgr;\n}\n#endif\n"
  },
  {
    "path": "src/tls_mbed.c",
    "content": "#include \"log.h\"\n#include \"printf.h\"\n#include \"profile.h\"\n#include \"tls.h\"\n#include \"util.h\"\n\n#if MG_TLS == MG_TLS_MBED\n\n#if defined(MBEDTLS_VERSION_NUMBER) && MBEDTLS_VERSION_NUMBER >= 0x03000000 && \\\n    MBEDTLS_VERSION_NUMBER < 0x04000000\n#define MG_MBEDTLS_RNG_GET , mg_mbed_rng, NULL\n#else\n#define MG_MBEDTLS_RNG_GET\n#endif\n\nstatic int mg_tls_err(struct mg_connection *c, int rc) {\n  char s[80];\n  mbedtls_strerror(rc, s, sizeof(s));\n  MG_ERROR((\"%lu %s\", ((struct mg_connection *) c)->id, s));\n  return rc;\n}\n\n#if defined(MBEDTLS_VERSION_NUMBER) && MBEDTLS_VERSION_NUMBER >= 0x04000000\n#else\nstatic int mg_mbed_rng(void *ctx, unsigned char *buf, size_t len) {\n  mg_random(buf, len);\n  (void) ctx;\n  return 0;\n}\n#endif\n\nstatic bool mg_load_cert(struct mg_str str, mbedtls_x509_crt *p) {\n  int rc;\n  if (str.buf == NULL || str.buf[0] == '\\0' || str.buf[0] == '*') return true;\n  if (!MG_IS_DER(str.buf)) str.len++;  // PEM, include trailing NUL\n  if ((rc = mbedtls_x509_crt_parse(p, (uint8_t *) str.buf, str.len)) != 0) {\n    MG_ERROR((\"cert err %#x\", -rc));\n    return false;\n  }\n  return true;\n}\n\nstatic bool mg_load_key(struct mg_str str, mbedtls_pk_context *p) {\n  int rc;\n  if (str.buf == NULL || str.buf[0] == '\\0' || str.buf[0] == '*') return true;\n  if (!MG_IS_DER(str.buf)) str.len++;  // PEM, include trailing NUL\n  if ((rc = mbedtls_pk_parse_key(p, (uint8_t *) str.buf, str.len, NULL,\n                                 0 MG_MBEDTLS_RNG_GET)) != 0) {\n    MG_ERROR((\"key err %#x\", -rc));\n    return false;\n  }\n  return true;\n}\n\nvoid mg_tls_free(struct mg_connection *c) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  if (tls != NULL) {\n    mbedtls_ssl_free(&tls->ssl);\n    mbedtls_pk_free(&tls->pk);\n    mbedtls_x509_crt_free(&tls->ca);\n    mbedtls_x509_crt_free(&tls->cert);\n    mbedtls_ssl_config_free(&tls->conf);\n#ifdef MBEDTLS_SSL_SESSION_TICKETS\n    mbedtls_ssl_ticket_free(&tls->ticket);\n#endif\n    // PSA has global data. Do not call mbedtls_psa_crypto_free() here,\n    // it will free all global resources. Call it when actually freeing all\n    // application resources (main() exits)\n    mg_free(tls);\n    c->tls = NULL;\n  }\n}\n\nstatic int mg_net_send(void *ctx, const unsigned char *buf, size_t len) {\n  long n = mg_io_send((struct mg_connection *) ctx, buf, len);\n  MG_VERBOSE((\"%lu n=%ld e=%d\", ((struct mg_connection *) ctx)->id, n, errno));\n  if (n == MG_IO_WAIT) return MBEDTLS_ERR_SSL_WANT_WRITE;\n  if (n == MG_IO_RESET) return MBEDTLS_ERR_NET_CONN_RESET;\n  if (n == MG_IO_ERR) return MBEDTLS_ERR_NET_SEND_FAILED;\n  return (int) n;\n}\n\nstatic int mg_net_recv(void *ctx, unsigned char *buf, size_t len) {\n  long n = mg_io_recv((struct mg_connection *) ctx, buf, len);\n  MG_VERBOSE((\"%lu n=%ld\", ((struct mg_connection *) ctx)->id, n));\n  if (n == MG_IO_WAIT) return MBEDTLS_ERR_SSL_WANT_WRITE;\n  if (n == MG_IO_RESET) return MBEDTLS_ERR_NET_CONN_RESET;\n  if (n == MG_IO_ERR) return MBEDTLS_ERR_NET_RECV_FAILED;\n  return (int) n;\n}\n\nvoid mg_tls_handshake(struct mg_connection *c) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  int rc = mbedtls_ssl_handshake(&tls->ssl);\n  if (rc == 0) {  // Success\n    MG_DEBUG((\"%lu success\", c->id));\n    c->is_tls_hs = 0;\n    mg_call(c, MG_EV_TLS_HS, NULL);\n  } else if (rc == MBEDTLS_ERR_SSL_WANT_READ ||\n             rc == MBEDTLS_ERR_SSL_WANT_WRITE) {  // Still pending\n    MG_VERBOSE((\"%lu pending, %d%d %d (-%#x)\", c->id, c->is_connecting,\n                c->is_tls_hs, rc, -rc));\n  } else {\n    mg_error(c, \"TLS handshake: -%#x\", -mg_tls_err(c, rc));  // Error\n  }\n}\n\nstatic void debug_cb(void *c, int lev, const char *s, int n, const char *s2) {\n  n = (int) strlen(s2) - 1;\n  MG_INFO((\"%lu %d %.*s\", ((struct mg_connection *) c)->id, lev, n, s2));\n  (void) s;\n}\n\nvoid mg_tls_init(struct mg_connection *c, const struct mg_tls_opts *opts) {\n  struct mg_tls *tls = (struct mg_tls *) mg_calloc(1, sizeof(*tls));\n  int rc = 0;\n  c->tls = tls;\n  if (c->tls == NULL) {\n    mg_error(c, \"TLS OOM\");\n    goto fail;\n  }\n  if (c->is_listening) goto fail;\n  MG_DEBUG((\"%lu Setting TLS\", c->id));\n  MG_PROF_ADD(c, \"mbedtls_init_start\");\n#if defined(MBEDTLS_VERSION_NUMBER) && MBEDTLS_VERSION_NUMBER >= 0x03000000 && \\\n    defined(MBEDTLS_PSA_CRYPTO_C)\n  psa_crypto_init();  // https://github.com/Mbed-TLS/mbedtls/issues/9072#issuecomment-2084845711\n  // this initializes global resources and then just returns when called again\n#endif\n  mbedtls_ssl_init(&tls->ssl);\n  mbedtls_ssl_config_init(&tls->conf);\n  mbedtls_x509_crt_init(&tls->ca);\n  mbedtls_x509_crt_init(&tls->cert);\n  mbedtls_pk_init(&tls->pk);\n  mbedtls_ssl_conf_dbg(&tls->conf, debug_cb, c);\n#if defined(MG_MBEDTLS_DEBUG_LEVEL)\n  mbedtls_debug_set_threshold(MG_MBEDTLS_DEBUG_LEVEL);\n#endif\n  if ((rc = mbedtls_ssl_config_defaults(\n           &tls->conf,\n           c->is_client ? MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER,\n           MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT)) != 0) {\n    mg_error(c, \"tls defaults %#x\", -mg_tls_err(c, rc));\n    goto fail;\n  }\n#if defined(MBEDTLS_VERSION_NUMBER) && MBEDTLS_VERSION_NUMBER >= 0x04000000\n  MG_INFO((\"PSA is in control of random number generation\"));\n#else\n  mbedtls_ssl_conf_rng(&tls->conf, mg_mbed_rng, c);\n#endif\n\n  if (opts->ca.len == 0 || mg_strcmp(opts->ca, mg_str(\"*\")) == 0) {\n    // NOTE: MBEDTLS_SSL_VERIFY_NONE is not supported for TLS1.3 on client side\n    // See https://github.com/Mbed-TLS/mbedtls/issues/7075\n    mbedtls_ssl_conf_authmode(&tls->conf, MBEDTLS_SSL_VERIFY_NONE);\n  } else {\n    if (mg_load_cert(opts->ca, &tls->ca) == false) goto fail;\n    mbedtls_ssl_conf_ca_chain(&tls->conf, &tls->ca, NULL);\n    if (c->is_client) {\n      if (opts->name.buf != NULL && opts->name.buf[0] != '\\0') {\n        char *host = mg_mprintf(\"%.*s\", opts->name.len, opts->name.buf);\n        mbedtls_ssl_set_hostname(&tls->ssl, host);\n        MG_DEBUG((\"%lu hostname verification: %s\", c->id, host));\n        mg_free(host);\n      } else {\n        MG_DEBUG((\"%lu skipping hostname verification\", c->id));\n        mbedtls_ssl_set_hostname(&tls->ssl, NULL);\n      }\n    }\n    mbedtls_ssl_conf_authmode(&tls->conf, MBEDTLS_SSL_VERIFY_REQUIRED);\n  }\n  if (!mg_load_cert(opts->cert, &tls->cert)) goto fail;\n  if (!mg_load_key(opts->key, &tls->pk)) goto fail;\n  if (tls->cert.version &&\n      (rc = mbedtls_ssl_conf_own_cert(&tls->conf, &tls->cert, &tls->pk)) != 0) {\n    mg_error(c, \"own cert %#x\", -mg_tls_err(c, rc));\n    goto fail;\n  }\n\n#ifdef MBEDTLS_SSL_SESSION_TICKETS\n  mbedtls_ssl_conf_session_tickets_cb(\n      &tls->conf, mbedtls_ssl_ticket_write, mbedtls_ssl_ticket_parse,\n      &((struct mg_tls_ctx *) c->mgr->tls_ctx)->tickets);\n#endif\n\n  if ((rc = mbedtls_ssl_setup(&tls->ssl, &tls->conf)) != 0) {\n    mg_error(c, \"setup err %#x\", -mg_tls_err(c, rc));\n    goto fail;\n  }\n  c->is_tls = 1;\n  c->is_tls_hs = 1;\n  mbedtls_ssl_set_bio(&tls->ssl, c, mg_net_send, mg_net_recv, 0);\n  MG_PROF_ADD(c, \"mbedtls_init_end\");\n  return;\nfail:\n  mg_tls_free(c);\n}\n\nsize_t mg_tls_pending(struct mg_connection *c) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  return tls == NULL ? 0 : mbedtls_ssl_get_bytes_avail(&tls->ssl);\n}\n\nlong mg_tls_recv(struct mg_connection *c, void *buf, size_t len) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  long n = mbedtls_ssl_read(&tls->ssl, (unsigned char *) buf, len);\n  if (!c->is_tls_hs && buf == NULL && n == 0) return 0;  // TODO(): MIP\n  if (n == MBEDTLS_ERR_SSL_WANT_READ || n == MBEDTLS_ERR_SSL_WANT_WRITE)\n    return MG_IO_WAIT;\n#if defined(MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET)\n  if (n == MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET) {\n    return MG_IO_WAIT;\n  }\n#endif\n  if (n <= 0) return MG_IO_ERR;\n  return n;\n}\n\nlong mg_tls_send(struct mg_connection *c, const void *buf, size_t len) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  long n;\n  bool was_throttled = c->is_tls_throttled;  // see #3074\n  n = was_throttled ? mbedtls_ssl_write(&tls->ssl, tls->throttled_buf,\n                                        tls->throttled_len) /* flush old data */\n                    : mbedtls_ssl_write(&tls->ssl, (unsigned char *) buf,\n                                        len);  // encrypt current data\n  c->is_tls_throttled =\n      (n == MBEDTLS_ERR_SSL_WANT_READ || n == MBEDTLS_ERR_SSL_WANT_WRITE);\n  if (was_throttled) return MG_IO_WAIT;  // flushed throttled data instead\n  if (c->is_tls_throttled) {\n    tls->throttled_buf =\n        (unsigned char *) buf;  // MbedTLS code actually ignores\n    tls->throttled_len = len;   //  these, but let's play API rules\n    return (long) len;          // already encripted that when throttled\n  }  // if last chunk fails to be sent, it needs to be flushed\n  if (n <= 0) return MG_IO_ERR;\n  return n;\n}\n\nvoid mg_tls_flush(struct mg_connection *c) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  if (c->is_tls_throttled) {\n    long n =\n        mbedtls_ssl_write(&tls->ssl, tls->throttled_buf, tls->throttled_len);\n    c->is_tls_throttled =\n        (n == MBEDTLS_ERR_SSL_WANT_READ || n == MBEDTLS_ERR_SSL_WANT_WRITE);\n  }\n}\n\nvoid mg_tls_ctx_init(struct mg_mgr *mgr) {\n  struct mg_tls_ctx *ctx = (struct mg_tls_ctx *) mg_calloc(1, sizeof(*ctx));\n  if (ctx == NULL) {\n    MG_ERROR((\"TLS context init OOM\"));\n  } else {\n#ifdef MBEDTLS_SSL_SESSION_TICKETS\n    int rc;\n    mbedtls_ssl_ticket_init(&ctx->tickets);\n#if defined(MBEDTLS_VERSION_NUMBER) && MBEDTLS_VERSION_NUMBER >= 0x04000000\n    if ((rc = mbedtls_ssl_ticket_setup(&ctx->tickets, PSA_ALG_GCM,\n                                       PSA_KEY_TYPE_AES, 128, 86400))\n#else\n    if ((rc = mbedtls_ssl_ticket_setup(&ctx->tickets, mg_mbed_rng, NULL,\n                                       MBEDTLS_CIPHER_AES_128_GCM, 86400))\n#endif\n        != 0) {\n      MG_ERROR((\" mbedtls_ssl_ticket_setup %#x\", -rc));\n    }\n#endif\n    mgr->tls_ctx = ctx;\n  }\n}\n\nvoid mg_tls_ctx_free(struct mg_mgr *mgr) {\n  struct mg_tls_ctx *ctx = (struct mg_tls_ctx *) mgr->tls_ctx;\n  if (ctx != NULL) {\n#ifdef MBEDTLS_SSL_SESSION_TICKETS\n    mbedtls_ssl_ticket_free(&ctx->tickets);\n#endif\n    mg_free(ctx);\n    mgr->tls_ctx = NULL;\n  }\n}\n#endif\n"
  },
  {
    "path": "src/tls_mbed.h",
    "content": "#pragma once\n\n#include \"config.h\"\n#include \"log.h\"\n#include \"url.h\"\n#include \"util.h\"\n\n#if MG_TLS == MG_TLS_MBED\n#include <mbedtls/debug.h>\n#include <mbedtls/error.h>\n#include <mbedtls/net_sockets.h>\n#include <mbedtls/ssl.h>\n#include <mbedtls/ssl_ticket.h>\n\nstruct mg_tls_ctx {\n  int dummy;\n#ifdef MBEDTLS_SSL_SESSION_TICKETS\n  mbedtls_ssl_ticket_context tickets;\n#endif\n};\n\nstruct mg_tls {\n  mbedtls_x509_crt ca;      // Parsed CA certificate\n  mbedtls_x509_crt cert;    // Parsed certificate\n  mbedtls_pk_context pk;    // Private key context\n  mbedtls_ssl_context ssl;  // SSL/TLS context\n  mbedtls_ssl_config conf;  // SSL-TLS config\n#ifdef MBEDTLS_SSL_SESSION_TICKETS\n  mbedtls_ssl_ticket_context ticket;  // Session tickets context\n#endif\n  // https://github.com/Mbed-TLS/mbedtls/blob/3b3c652d/include/mbedtls/ssl.h#L5071C18-L5076C29\n  unsigned char *throttled_buf;  // see #3074\n  size_t throttled_len;\n};\n#endif\n"
  },
  {
    "path": "src/tls_openssl.c",
    "content": "#include \"printf.h\"\n#include \"tls.h\"\n#include \"util.h\"\n\n#if MG_TLS == MG_TLS_OPENSSL || MG_TLS == MG_TLS_WOLFSSL\n\nstatic int tls_err_cb(const char *s, size_t len, void *c) {\n  int n = (int) len - 1;\n  MG_ERROR((\"%lu %.*s\", ((struct mg_connection *) c)->id, n, s));\n  return 0;  // undocumented\n}\n\nstatic int mg_tls_err(struct mg_connection *c, struct mg_tls *tls, int res) {\n  int err = SSL_get_error(tls->ssl, res);\n  // We've just fetched the last error from the queue.\n  // Now we need to clear the error queue. If we do not, then the following\n  // can happen (actually reported):\n  //  - A new connection is accept()-ed with cert error (e.g. self-signed cert)\n  //  - Since all accept()-ed connections share listener's context,\n  //  - *ALL* SSL accepted connection report read error on the next poll cycle.\n  //    Thus a single errored connection can close all the rest, unrelated ones.\n  // Clearing the error keeps the shared SSL_CTX in an OK state.\n\n  if (err != 0) ERR_print_errors_cb(tls_err_cb, c);\n  ERR_clear_error();\n  if (err == SSL_ERROR_WANT_READ) return 0;\n  if (err == SSL_ERROR_WANT_WRITE) return 0;\n  return err;\n}\n\n#if MG_TLS != MG_TLS_WOLFSSL\nstatic STACK_OF(X509_INFO) * load_ca_certs(struct mg_str ca) {\n  BIO *bio = BIO_new_mem_buf(ca.buf, (int) ca.len);\n  STACK_OF(X509_INFO) *certs =\n      bio ? PEM_X509_INFO_read_bio(bio, NULL, NULL, NULL) : NULL;\n  if (bio) BIO_free(bio);\n  return certs;\n}\n\nstatic bool add_ca_certs(SSL_CTX *ctx, STACK_OF(X509_INFO) * certs) {\n  int i;\n  X509_STORE *cert_store = SSL_CTX_get_cert_store(ctx);\n  if (cert_store == NULL) return false;\n  for (i = 0; i < sk_X509_INFO_num(certs); i++) {\n    X509_INFO *cert_info = sk_X509_INFO_value(certs, i);\n    if (cert_info->x509 && !X509_STORE_add_cert(cert_store, cert_info->x509))\n      return false;\n  }\n  return true;\n}\n#endif\n\nstatic EVP_PKEY *load_key(struct mg_str s) {\n  BIO *bio = BIO_new_mem_buf(s.buf, (int) (long) s.len);\n  EVP_PKEY *key = bio ? PEM_read_bio_PrivateKey(bio, NULL, 0, NULL) : NULL;\n  if (bio) BIO_free(bio);\n  return key;\n}\n\nstatic X509 *load_cert(struct mg_str s) {\n  BIO *bio = BIO_new_mem_buf(s.buf, (int) (long) s.len);\n  X509 *cert = bio == NULL ? NULL\n               : MG_IS_DER(s.buf)\n                   ? d2i_X509_bio(bio, NULL)                    // DER\n                   : PEM_read_bio_X509(bio, NULL, NULL, NULL);  // PEM\n  if (bio) BIO_free(bio);\n  return cert;\n}\n\nstatic long mg_bio_ctrl(BIO *b, int cmd, long larg, void *pargs) {\n  long ret = 0;\n  if (cmd == BIO_CTRL_PUSH) ret = 1;\n  if (cmd == BIO_CTRL_POP) ret = 1;\n  if (cmd == BIO_CTRL_FLUSH) ret = 1;\n#if MG_TLS == MG_TLS_OPENSSL\n  if (cmd == BIO_C_SET_NBIO) ret = 1;\n#endif\n  // MG_DEBUG((\"%d -> %ld\", cmd, ret));\n  (void) b, (void) cmd, (void) larg, (void) pargs;\n  return ret;\n}\n\nstatic int mg_bio_read(BIO *bio, char *buf, int len) {\n  struct mg_connection *c = (struct mg_connection *) BIO_get_data(bio);\n  long res = mg_io_recv(c, buf, (size_t) len);\n  // MG_DEBUG((\"%p %d %ld\", buf, len, res));\n  len = res > 0 ? (int) res : -1;\n  if (res == MG_IO_WAIT) BIO_set_retry_read(bio);\n  return len;\n}\n\nstatic int mg_bio_write(BIO *bio, const char *buf, int len) {\n  struct mg_connection *c = (struct mg_connection *) BIO_get_data(bio);\n  long res = mg_io_send(c, buf, (size_t) len);\n  // MG_DEBUG((\"%p %d %ld\", buf, len, res));\n  len = res > 0 ? (int) res : -1;\n  if (res == MG_IO_WAIT) BIO_set_retry_write(bio);\n  return len;\n}\n\n#ifdef MG_TLS_SSLKEYLOGFILE\nstatic void ssl_keylog_cb(const SSL *ssl, const char *line) {\n  char *keylogfile = getenv(\"SSLKEYLOGFILE\");\n  if (keylogfile == NULL) {\n    return;\n  }\n  FILE *f = fopen(keylogfile, \"a\");\n  fprintf(f, \"%s\\n\", line);\n  fflush(f);\n  fclose(f);\n  (void) ssl;\n}\n#endif\n\nvoid mg_tls_free(struct mg_connection *c) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  if (tls == NULL) return;\n  SSL_free(tls->ssl);\n  SSL_CTX_free(tls->ctx);\n  BIO_meth_free(tls->bm);\n  mg_free(tls);\n  c->tls = NULL;\n}\n\nvoid mg_tls_init(struct mg_connection *c, const struct mg_tls_opts *opts) {\n  struct mg_tls *tls = (struct mg_tls *) mg_calloc(1, sizeof(*tls));\n  const char *id = \"mongoose\";\n  static unsigned char s_initialised = 0;\n  BIO *bio = NULL;\n  int rc;\n  c->tls = tls;\n  if (tls == NULL) {\n    mg_error(c, \"TLS OOM\");\n    goto fail;\n  }\n\n  if (!s_initialised) {\n    SSL_library_init();\n    s_initialised++;\n  }\n  MG_DEBUG((\"%lu Setting TLS\", c->id));\n  tls->ctx = c->is_client ? SSL_CTX_new(TLS_client_method())\n                          : SSL_CTX_new(TLS_server_method());\n  if (tls->ctx == NULL) {\n    mg_error(c, \"SSL_CTX_new\");\n    goto fail;\n  }\n#ifdef MG_TLS_SSLKEYLOGFILE\n  SSL_CTX_set_keylog_callback(tls->ctx, ssl_keylog_cb);\n#endif\n  if ((tls->ssl = SSL_new(tls->ctx)) == NULL) {\n    mg_error(c, \"SSL_new\");\n    goto fail;\n  }\n  SSL_set_session_id_context(tls->ssl, (const uint8_t *) id,\n                             (unsigned) strlen(id));\n  // Disable deprecated protocols\n  SSL_set_options(tls->ssl, SSL_OP_NO_SSLv2);\n  SSL_set_options(tls->ssl, SSL_OP_NO_SSLv3);\n  SSL_set_options(tls->ssl, SSL_OP_NO_TLSv1);\n  SSL_set_options(tls->ssl, SSL_OP_NO_TLSv1_1);\n#ifdef MG_ENABLE_OPENSSL_NO_COMPRESSION\n  SSL_set_options(tls->ssl, SSL_OP_NO_COMPRESSION);\n#endif\n#ifdef MG_ENABLE_OPENSSL_CIPHER_SERVER_PREFERENCE\n  SSL_set_options(tls->ssl, SSL_OP_CIPHER_SERVER_PREFERENCE);\n#endif\n\n#if MG_TLS == MG_TLS_WOLFSSL && !defined(OPENSSL_COMPATIBLE_DEFAULTS)\n  if (opts->ca.len == 0 || mg_strcmp(opts->ca, mg_str(\"*\")) == 0) {\n    // Older versions require that either the CA is loaded or SSL_VERIFY_NONE\n    // explicitly set\n    SSL_set_verify(tls->ssl, SSL_VERIFY_NONE, NULL);\n  }\n#endif\n\n  if (opts->ca.buf != NULL && opts->ca.buf[0] != '\\0') {\n    SSL_set_verify(tls->ssl, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,\n                   NULL);\n#if MG_TLS == MG_TLS_WOLFSSL\n    extern int wolfSSL_CTX_load_verify_buffer(SSL_CTX *, const unsigned char *,\n                                              long, int);\n    rc = wolfSSL_CTX_load_verify_buffer(tls->ctx,\n                                        (const unsigned char *) opts->ca.buf,\n                                        (long) opts->ca.len, SSL_FILETYPE_PEM);\n    if (rc != 1) {\n      mg_error(c, \"CA err\");\n      goto fail;\n    }\n#else\n    STACK_OF(X509_INFO) *certs = load_ca_certs(opts->ca);\n    rc = add_ca_certs(tls->ctx, certs);\n    sk_X509_INFO_pop_free(certs, X509_INFO_free);\n    if (!rc) {\n      mg_error(c, \"CA err\");\n      goto fail;\n    }\n#endif\n  }\n\n  if (opts->cert.buf != NULL && opts->cert.buf[0] != '\\0') {\n    X509 *cert = load_cert(opts->cert);\n    rc = cert == NULL ? 0 : SSL_use_certificate(tls->ssl, cert);\n    X509_free(cert);\n    if (cert == NULL || rc != 1) {\n      mg_error(c, \"CERT err %d\", mg_tls_err(c, tls, rc));\n      goto fail;\n    }\n  }\n  if (opts->key.buf != NULL && opts->key.buf[0] != '\\0') {\n    EVP_PKEY *key = load_key(opts->key);\n    rc = key == NULL ? 0 : SSL_use_PrivateKey(tls->ssl, key);\n    EVP_PKEY_free(key);\n    if (key == NULL || rc != 1) {\n      mg_error(c, \"KEY err %d\", mg_tls_err(c, tls, rc));\n      goto fail;\n    }\n  }\n\n  SSL_set_mode(tls->ssl, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);\n#if MG_TLS == MG_TLS_OPENSSL && OPENSSL_VERSION_NUMBER > 0x10002000L\n  (void) SSL_set_ecdh_auto(tls->ssl, 1);\n#endif\n#if OPENSSL_VERSION_NUMBER >= 0x10100000L\n  if (opts->name.len > 0) {\n    char *s = mg_mprintf(\"%.*s\", (int) opts->name.len, opts->name.buf);\n#if MG_TLS != MG_TLS_WOLFSSL || LIBWOLFSSL_VERSION_HEX >= 0x05005002\n    SSL_set1_host(tls->ssl, s);\n#else\n    X509_VERIFY_PARAM_set1_host(SSL_get0_param(tls->ssl), s, 0);\n#endif\n    SSL_set_tlsext_host_name(tls->ssl, s);\n    mg_free(s);\n  }\n#endif\n#if MG_TLS == MG_TLS_WOLFSSL\n  tls->bm = BIO_meth_new(0, \"bio_mg\");\n#else\n  tls->bm = BIO_meth_new(BIO_get_new_index() | BIO_TYPE_SOURCE_SINK, \"bio_mg\");\n#endif\n  BIO_meth_set_write(tls->bm, mg_bio_write);\n  BIO_meth_set_read(tls->bm, mg_bio_read);\n  BIO_meth_set_ctrl(tls->bm, mg_bio_ctrl);\n\n  bio = BIO_new(tls->bm);\n  BIO_set_data(bio, c);\n  SSL_set_bio(tls->ssl, bio, bio);\n\n  c->is_tls = 1;\n  c->is_tls_hs = 1;\n  MG_DEBUG((\"%lu SSL %s OK\", c->id, c->is_accepted ? \"accept\" : \"client\"));\n  return;\nfail:\n  mg_tls_free(c);\n}\n\nvoid mg_tls_handshake(struct mg_connection *c) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  int rc = c->is_client ? SSL_connect(tls->ssl) : SSL_accept(tls->ssl);\n  if (rc == 1) {\n    MG_DEBUG((\"%lu success\", c->id));\n    c->is_tls_hs = 0;\n    mg_call(c, MG_EV_TLS_HS, NULL);\n  } else {\n    int code = mg_tls_err(c, tls, rc);\n    if (code != 0) mg_error(c, \"tls hs: rc %d, err %d\", rc, code);\n  }\n}\n\nsize_t mg_tls_pending(struct mg_connection *c) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  return tls == NULL ? 0 : (size_t) SSL_pending(tls->ssl);\n}\n\nlong mg_tls_recv(struct mg_connection *c, void *buf, size_t len) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  int n = SSL_read(tls->ssl, buf, (int) len);\n  if (!c->is_tls_hs && buf == NULL && n == 0) return 0;  // TODO(): MIP\n  if (n < 0 && mg_tls_err(c, tls, n) == 0) return MG_IO_WAIT;\n  if (n <= 0) return MG_IO_ERR;\n  return n;\n}\n\nlong mg_tls_send(struct mg_connection *c, const void *buf, size_t len) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  int n = SSL_write(tls->ssl, buf, (int) len);\n  if (n < 0 && mg_tls_err(c, tls, n) == 0) return MG_IO_WAIT;\n  if (n <= 0) return MG_IO_ERR;\n  return n;\n}\n\nvoid mg_tls_flush(struct mg_connection *c) {\n  (void) c;\n}\n\nvoid mg_tls_ctx_init(struct mg_mgr *mgr) {\n  (void) mgr;\n}\n\nvoid mg_tls_ctx_free(struct mg_mgr *mgr) {\n  (void) mgr;\n}\n#endif\n"
  },
  {
    "path": "src/tls_openssl.h",
    "content": "#pragma once\n\n#if MG_TLS == MG_TLS_OPENSSL || MG_TLS == MG_TLS_WOLFSSL\n\n#include <openssl/err.h>\n#include <openssl/ssl.h>\n\nstruct mg_tls {\n  BIO_METHOD *bm;\n  SSL_CTX *ctx;\n  SSL *ssl;\n};\n#endif\n"
  },
  {
    "path": "src/tls_rsa.c",
    "content": "#include \"tls.h\"\n#include \"tls_rsa.h\"\n#include \"util.h\"\n\n#if MG_TLS == MG_TLS_BUILTIN\n\n#define NS_INTERNAL static\ntypedef struct _bigint bigint; /**< An alias for _bigint */\n\n/*\n * Copyright (c) 2007, Cameron Rich\n *\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright notice,\n *   this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n *   this list of conditions and the following disclaimer in the documentation\n *   and/or other materials provided with the distribution.\n * * Neither the name of the axTLS project nor the names of its contributors\n *   may be used to endorse or promote products derived from this software\n *   without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* Maintain a number of precomputed variables when doing reduction */\n#define BIGINT_M_OFFSET 0 /**< Normal modulo offset. */\n#define BIGINT_P_OFFSET 1 /**< p modulo offset. */\n#define BIGINT_Q_OFFSET 2 /**< q module offset. */\n#define BIGINT_NUM_MODS 3 /**< The number of modulus constants used. */\n\n/* Architecture specific functions for big ints */\n#if defined(CONFIG_INTEGER_8BIT)\n#define COMP_RADIX 256U     /**< Max component + 1 */\n#define COMP_MAX 0xFFFFU    /**< (Max dbl comp -1) */\n#define COMP_BIT_SIZE 8     /**< Number of bits in a component. */\n#define COMP_BYTE_SIZE 1    /**< Number of bytes in a component. */\n#define COMP_NUM_NIBBLES 2  /**< Used For diagnostics only. */\ntypedef uint8_t comp;       /**< A single precision component. */\ntypedef uint16_t long_comp; /**< A double precision component. */\ntypedef int16_t slong_comp; /**< A signed double precision component. */\n#elif defined(CONFIG_INTEGER_16BIT)\n#define COMP_RADIX 65536U    /**< Max component + 1 */\n#define COMP_MAX 0xFFFFFFFFU /**< (Max dbl comp -1) */\n#define COMP_BIT_SIZE 16     /**< Number of bits in a component. */\n#define COMP_BYTE_SIZE 2     /**< Number of bytes in a component. */\n#define COMP_NUM_NIBBLES 4   /**< Used For diagnostics only. */\ntypedef uint16_t comp;            /**< A single precision component. */\ntypedef uint32_t long_comp;       /**< A double precision component. */\ntypedef int32_t slong_comp;       /**< A signed double precision component. */\n#else                        /* regular 32 bit */\n#ifdef _MSC_VER\n#define COMP_RADIX 4294967296i64\n#define COMP_MAX 0xFFFFFFFFFFFFFFFFui64\n#else\n#define COMP_RADIX 4294967296       /**< Max component + 1 */\n#define COMP_MAX 0xFFFFFFFFFFFFFFFF /**< (Max dbl comp -1) */\n#endif\n#define COMP_BIT_SIZE 32   /**< Number of bits in a component. */\n#define COMP_BYTE_SIZE 4   /**< Number of bytes in a component. */\n#define COMP_NUM_NIBBLES 8 /**< Used For diagnostics only. */\ntypedef uint32_t comp;      /**< A single precision component. */\ntypedef uint64_t long_comp; /**< A double precision component. */\ntypedef int64_t slong_comp; /**< A signed double precision component. */\n#endif\n\n/**\n * @struct  _bigint\n * @brief A big integer basic object\n */\nstruct _bigint {\n  struct _bigint *next; /**< The next bigint in the cache. */\n  short size;           /**< The number of components in this bigint. */\n  short max_comps;      /**< The heapsize allocated for this bigint */\n  int refs;             /**< An internal reference count. */\n  comp *comps;          /**< A ptr to the actual component data */\n};\n\n/**\n * Maintains the state of the cache, and a number of variables used in\n * reduction.\n */\nstruct _BI_CTX /**< A big integer \"session\" context. */\n    {\n  bigint *active_list;             /**< Bigints currently used. */\n  bigint *free_list;               /**< Bigints not used. */\n  bigint *bi_radix;                /**< The radix used. */\n  bigint *bi_mod[BIGINT_NUM_MODS]; /**< modulus */\n\n#if defined(CONFIG_BIGINT_MONTGOMERY)\n  bigint *bi_RR_mod_m[BIGINT_NUM_MODS]; /**< R^2 mod m */\n  bigint *bi_R_mod_m[BIGINT_NUM_MODS];  /**< R mod m */\n  comp N0_dash[BIGINT_NUM_MODS];\n#elif defined(CONFIG_BIGINT_BARRETT)\n  bigint *bi_mu[BIGINT_NUM_MODS]; /**< Storage for mu */\n#endif\n  bigint *bi_normalised_mod[BIGINT_NUM_MODS]; /**< Normalised mod storage. */\n  bigint **g;                                 /**< Used by sliding-window. */\n  int window;       /**< The size of the sliding window */\n  int active_count; /**< Number of active bigints. */\n  int free_count;   /**< Number of free bigints. */\n\n#ifdef CONFIG_BIGINT_MONTGOMERY\n  uint8_t use_classical; /**< Use classical reduction. */\n#endif\n  uint8_t mod_offset; /**< The mod offset we are using */\n};\ntypedef struct _BI_CTX BI_CTX;\n\n#if !defined(MAX)\n#define MAX(a, b) ((a) > (b) ? (a) : (b))\n#define MIN(a, b)  ((a) < (b) ? (a) : (b))\n#endif\n\n#define PERMANENT 0x7FFF55AA /**< A magic number for permanents. */\n\n/*\n * Copyright (c) 2007, Cameron Rich\n *\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright notice,\n *   this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n *   this list of conditions and the following disclaimer in the documentation\n *   and/or other materials provided with the distribution.\n * * Neither the name of the axTLS project nor the names of its contributors\n *   may be used to endorse or promote products derived from this software\n *   without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nNS_INTERNAL BI_CTX *bi_initialize(void);\nNS_INTERNAL void bi_terminate(BI_CTX *ctx);\nNS_INTERNAL void bi_permanent(bigint *bi);\nNS_INTERNAL void bi_depermanent(bigint *bi);\nNS_INTERNAL void bi_clear_cache(BI_CTX *ctx);\nNS_INTERNAL void bi_free(BI_CTX *ctx, bigint *bi);\nNS_INTERNAL bigint *bi_copy(bigint *bi);\nNS_INTERNAL bigint *bi_clone(BI_CTX *ctx, const bigint *bi);\nNS_INTERNAL void bi_export(BI_CTX *ctx, bigint *bi, uint8_t *data, int size);\nNS_INTERNAL bigint *bi_import(BI_CTX *ctx, const uint8_t *data, int len);\nNS_INTERNAL bigint *int_to_bi(BI_CTX *ctx, comp i);\n\n/* the functions that actually do something interesting */\nNS_INTERNAL bigint *bi_add(BI_CTX *ctx, bigint *bia, bigint *bib);\nNS_INTERNAL bigint *bi_subtract(BI_CTX *ctx, bigint *bia, bigint *bib,\n                                int *is_negative);\nNS_INTERNAL bigint *bi_divide(BI_CTX *ctx, bigint *bia, bigint *bim,\n                              int is_mod);\nNS_INTERNAL bigint *bi_multiply(BI_CTX *ctx, bigint *bia, bigint *bib);\nNS_INTERNAL bigint *bi_mod_power(BI_CTX *ctx, bigint *bi, bigint *biexp);\n#if 0\nNS_INTERNAL bigint *bi_mod_power2(BI_CTX *ctx, bigint *bi,\n\t\t\tbigint *bim, bigint *biexp);\n#endif\nNS_INTERNAL int bi_compare(bigint *bia, bigint *bib);\nNS_INTERNAL void bi_set_mod(BI_CTX *ctx, bigint *bim, int mod_offset);\nNS_INTERNAL void bi_free_mod(BI_CTX *ctx, int mod_offset);\n\n#ifdef CONFIG_SSL_FULL_MODE\nNS_INTERNAL void bi_print(const char *label, bigint *bi);\nNS_INTERNAL bigint *bi_str_import(BI_CTX *ctx, const char *data);\n#endif\n\n/**\n * @def bi_mod\n * Find the residue of B. bi_set_mod() must be called before hand.\n */\n#define bi_mod(A, B) bi_divide(A, B, ctx->bi_mod[ctx->mod_offset], 1)\n\n/**\n * bi_residue() is technically the same as bi_mod(), but it uses the\n * appropriate reduction technique (which is bi_mod() when doing classical\n * reduction).\n */\n#if defined(CONFIG_BIGINT_MONTGOMERY)\n#define bi_residue(A, B) bi_mont(A, B)\nNS_INTERNAL bigint *bi_mont(BI_CTX *ctx, bigint *bixy);\n#elif defined(CONFIG_BIGINT_BARRETT)\n#define bi_residue(A, B) bi_barrett(A, B)\nNS_INTERNAL bigint *bi_barrett(BI_CTX *ctx, bigint *bi);\n#else /* if defined(CONFIG_BIGINT_CLASSICAL) */\n#define bi_residue(A, B) bi_mod(A, B)\n#endif\n\n#ifdef CONFIG_BIGINT_SQUARE\nNS_INTERNAL bigint *bi_square(BI_CTX *ctx, bigint *bi);\n#else\n#define bi_square(A, B) bi_multiply(A, bi_copy(B), B)\n#endif\n\n//NS_INTERNAL bigint *bi_crt(BI_CTX *ctx, bigint *bi, bigint *dP, bigint *dQ,\n//                           bigint *p, bigint *q, bigint *qInv);\n\n/*\n * Copyright (c) 2007, Cameron Rich\n *\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * * Redistributions of source code must retain the above copyright notice,\n *   this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above copyright notice,\n *   this list of conditions and the following disclaimer in the documentation\n *   and/or other materials provided with the distribution.\n * * Neither the name of the axTLS project nor the names of its contributors\n *   may be used to endorse or promote products derived from this software\n *   without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/**\n * @defgroup bigint_api Big Integer API\n * @brief The bigint implementation as used by the axTLS project.\n *\n * The bigint library is for RSA encryption/decryption as well as signing.\n * This code tries to minimise use of malloc/free by maintaining a small\n * cache. A bigint context may maintain state by being made \"permanent\".\n * It be be later released with a bi_depermanent() and bi_free() call.\n *\n * It supports the following reduction techniques:\n * - Classical\n * - Barrett\n * - Montgomery\n *\n * It also implements the following:\n * - Karatsuba multiplication\n * - Squaring\n * - Sliding window exponentiation\n * - Chinese Remainder Theorem (implemented in rsa.c).\n *\n * All the algorithms used are pretty standard, and designed for different\n * data bus sizes. Negative numbers are not dealt with at all, so a subtraction\n * may need to be tested for negativity.\n *\n * This library steals some ideas from Jef Poskanzer\n * <http://cs.marlboro.edu/term/cs-fall02/algorithms/crypto/RSA/bigint>\n * and GMP <http://www.swox.com/gmp>. It gets most of its implementation\n * detail from \"The Handbook of Applied Cryptography\"\n * <http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf>\n * @{\n */\n\n#define V1 v->comps[v->size - 1]                     /**< v1 for division */\n#define V2 v->comps[v->size - 2]                     /**< v2 for division */\n#define U(j) tmp_u->comps[tmp_u->size - j - 1]       /**< uj for division */\n#define Q(j) quotient->comps[quotient->size - j - 1] /**< qj for division */\n\nstatic bigint *bi_int_multiply(BI_CTX *ctx, bigint *bi, comp i);\nstatic bigint *bi_int_divide(BI_CTX *ctx, bigint *biR, comp denom);\nstatic bigint *alloc(BI_CTX *ctx, int size);\nstatic bigint *trim(bigint *bi);\nstatic void more_comps(bigint *bi, int n);\n#if defined(CONFIG_BIGINT_KARATSUBA) || defined(CONFIG_BIGINT_BARRETT) || \\\n    defined(CONFIG_BIGINT_MONTGOMERY)\nstatic bigint *comp_right_shift(bigint *biR, int num_shifts);\nstatic bigint *comp_left_shift(bigint *biR, int num_shifts);\n#endif\n\n#ifdef CONFIG_BIGINT_CHECK_ON\nstatic void check(const bigint *bi);\n#else\n#define check(A) /**< disappears in normal production mode */\n#endif\n\n/**\n * @brief Start a new bigint context.\n * @return A bigint context.\n */\nNS_INTERNAL BI_CTX *bi_initialize(void) {\n  /* mg_calloc() sets everything to zero */\n  BI_CTX *ctx = (BI_CTX *) mg_calloc(1, sizeof(BI_CTX));\n\n  /* the radix */\n  ctx->bi_radix = alloc(ctx, 2);\n  ctx->bi_radix->comps[0] = 0;\n  ctx->bi_radix->comps[1] = 1;\n  bi_permanent(ctx->bi_radix);\n  return ctx;\n}\n\n/**\n * @brief Close the bigint context and free any resources.\n *\n * Free up any used memory - a check is done if all objects were not\n * properly freed.\n * @param ctx [in]   The bigint session context.\n */\nNS_INTERNAL void bi_terminate(BI_CTX *ctx) {\n  bi_depermanent(ctx->bi_radix);\n  bi_free(ctx, ctx->bi_radix);\n\n  if (ctx->active_count != 0) {\n#ifdef CONFIG_SSL_FULL_MODE\n    printf(\"bi_terminate: there were %d un-freed bigints\\n\", ctx->active_count);\n#endif\n    abort();\n  }\n\n  bi_clear_cache(ctx);\n  mg_free(ctx);\n}\n\n/**\n *@brief Clear the memory cache.\n */\nNS_INTERNAL void bi_clear_cache(BI_CTX *ctx) {\n  bigint *p, *pn;\n\n  if (ctx->free_list == NULL) return;\n\n  for (p = ctx->free_list; p != NULL; p = pn) {\n    pn = p->next;\n    mg_free(p->comps);\n    mg_free(p);\n  }\n\n  ctx->free_count = 0;\n  ctx->free_list = NULL;\n}\n\n/**\n * @brief Increment the number of references to this object.\n * It does not do a full copy.\n * @param bi [in]   The bigint to copy.\n * @return A reference to the same bigint.\n */\nNS_INTERNAL bigint *bi_copy(bigint *bi) {\n  check(bi);\n  if (bi->refs != PERMANENT) bi->refs++;\n  return bi;\n}\n\n/**\n * @brief Simply make a bigint object \"unfreeable\" if bi_free() is called on it.\n *\n * For this object to be freed, bi_depermanent() must be called.\n * @param bi [in]   The bigint to be made permanent.\n */\nNS_INTERNAL void bi_permanent(bigint *bi) {\n  check(bi);\n  if (bi->refs != 1) {\n#ifdef CONFIG_SSL_FULL_MODE\n    printf(\"bi_permanent: refs was not 1\\n\");\n#endif\n    abort();\n  }\n\n  bi->refs = PERMANENT;\n}\n\n/**\n * @brief Take a permanent object and make it eligible for freedom.\n * @param bi [in]   The bigint to be made back to temporary.\n */\nNS_INTERNAL void bi_depermanent(bigint *bi) {\n  check(bi);\n  if (bi->refs != PERMANENT) {\n#ifdef CONFIG_SSL_FULL_MODE\n    printf(\"bi_depermanent: bigint was not permanent\\n\");\n#endif\n    abort();\n  }\n\n  bi->refs = 1;\n}\n\n/**\n * @brief Free a bigint object so it can be used again.\n *\n * The memory itself it not actually freed, just tagged as being available\n * @param ctx [in]   The bigint session context.\n * @param bi [in]    The bigint to be freed.\n */\nNS_INTERNAL void bi_free(BI_CTX *ctx, bigint *bi) {\n  check(bi);\n  if (bi->refs == PERMANENT) {\n    return;\n  }\n\n  if (--bi->refs > 0) {\n    return;\n  }\n\n  bi->next = ctx->free_list;\n  ctx->free_list = bi;\n  ctx->free_count++;\n\n  if (--ctx->active_count < 0) {\n#ifdef CONFIG_SSL_FULL_MODE\n    printf(\n        \"bi_free: active_count went negative \"\n        \"- double-freed bigint?\\n\");\n#endif\n    abort();\n  }\n}\n\n/**\n * @brief Convert an (unsigned) integer into a bigint.\n * @param ctx [in]   The bigint session context.\n * @param i [in]     The (unsigned) integer to be converted.\n *\n */\nNS_INTERNAL bigint *int_to_bi(BI_CTX *ctx, comp i) {\n  bigint *biR = alloc(ctx, 1);\n  biR->comps[0] = i;\n  return biR;\n}\n\n/**\n * @brief Do a full copy of the bigint object.\n * @param ctx [in]   The bigint session context.\n * @param bi  [in]   The bigint object to be copied.\n */\nNS_INTERNAL bigint *bi_clone(BI_CTX *ctx, const bigint *bi) {\n  bigint *biR = alloc(ctx, bi->size);\n  check(bi);\n  memcpy(biR->comps, bi->comps, (size_t) bi->size * COMP_BYTE_SIZE);\n  return biR;\n}\n\n/**\n * @brief Perform an addition operation between two bigints.\n * @param ctx [in]  The bigint session context.\n * @param bia [in]  A bigint.\n * @param bib [in]  Another bigint.\n * @return The result of the addition.\n */\nNS_INTERNAL bigint *bi_add(BI_CTX *ctx, bigint *bia, bigint *bib) {\n  int n;\n  comp carry = 0;\n  comp *pa, *pb;\n\n  check(bia);\n  check(bib);\n\n  n = MAX(bia->size, bib->size);\n  more_comps(bia, n + 1);\n  more_comps(bib, n);\n  pa = bia->comps;\n  pb = bib->comps;\n\n  do {\n    comp sl, rl, cy1;\n    sl = *pa + *pb++;\n    rl = sl + carry;\n    cy1 = sl < *pa;\n    carry = cy1 | (rl < sl);\n    *pa++ = rl;\n  } while (--n != 0);\n\n  *pa = carry; /* do overflow */\n  bi_free(ctx, bib);\n  return trim(bia);\n}\n\n/**\n * @brief Perform a subtraction operation between two bigints.\n * @param ctx [in]  The bigint session context.\n * @param bia [in]  A bigint.\n * @param bib [in]  Another bigint.\n * @param is_negative [out] If defined, indicates that the result was negative.\n * is_negative may be null.\n * @return The result of the subtraction. The result is always positive.\n */\nNS_INTERNAL bigint *bi_subtract(BI_CTX *ctx, bigint *bia, bigint *bib,\n                                int *is_negative) {\n  int n = bia->size;\n  comp *pa, *pb, carry = 0;\n\n  check(bia);\n  check(bib);\n\n  more_comps(bib, n);\n  pa = bia->comps;\n  pb = bib->comps;\n\n  do {\n    comp sl, rl, cy1;\n    sl = *pa - *pb++;\n    rl = sl - carry;\n    cy1 = sl > *pa;\n    carry = cy1 | (rl > sl);\n    *pa++ = rl;\n  } while (--n != 0);\n\n  if (is_negative) /* indicate a negative result */\n  {\n    *is_negative = (int) carry;\n  }\n\n  bi_free(ctx, trim(bib)); /* put bib back to the way it was */\n  return trim(bia);\n}\n\n/**\n * Perform a multiply between a bigint an an (unsigned) integer\n */\nstatic bigint *bi_int_multiply(BI_CTX *ctx, bigint *bia, comp b) {\n  int j = 0, n = bia->size;\n  bigint *biR = alloc(ctx, n + 1);\n  comp carry = 0;\n  comp *r = biR->comps;\n  comp *a = bia->comps;\n\n  check(bia);\n\n  /* clear things to start with */\n  memset(r, 0, (size_t) ((n + 1) * COMP_BYTE_SIZE));\n\n  do {\n    long_comp tmp = *r + (long_comp) a[j] * b + carry;\n    *r++ = (comp) tmp; /* downsize */\n    carry = (comp)(tmp >> COMP_BIT_SIZE);\n  } while (++j < n);\n\n  *r = carry;\n  bi_free(ctx, bia);\n  return trim(biR);\n}\n\n/**\n * @brief Does both division and modulo calculations.\n *\n * Used extensively when doing classical reduction.\n * @param ctx [in]  The bigint session context.\n * @param u [in]    A bigint which is the numerator.\n * @param v [in]    Either the denominator or the modulus depending on the mode.\n * @param is_mod [n] Determines if this is a normal division (0) or a reduction\n * (1).\n * @return  The result of the division/reduction.\n */\nNS_INTERNAL bigint *bi_divide(BI_CTX *ctx, bigint *u, bigint *v, int is_mod) {\n  int n = v->size, m = u->size - n;\n  int j = 0, orig_u_size = u->size;\n  uint8_t mod_offset = ctx->mod_offset;\n  comp d;\n  bigint *quotient, *tmp_u;\n  comp q_dash;\n\n  check(u);\n  check(v);\n\n  /* if doing reduction and we are < mod, then return mod */\n  if (is_mod && bi_compare(v, u) > 0) {\n    bi_free(ctx, v);\n    return u;\n  }\n\n  quotient = alloc(ctx, m + 1);\n  tmp_u = alloc(ctx, n + 1);\n  v = trim(v); /* make sure we have no leading 0's */\n  d = (comp)((long_comp) COMP_RADIX / (V1 + 1));\n\n  /* clear things to start with */\n  memset(quotient->comps, 0, (size_t) ((quotient->size) * COMP_BYTE_SIZE));\n\n  /* normalise */\n  if (d > 1) {\n    u = bi_int_multiply(ctx, u, d);\n\n    if (is_mod) {\n      v = ctx->bi_normalised_mod[mod_offset];\n    } else {\n      v = bi_int_multiply(ctx, v, d);\n    }\n  }\n\n  if (orig_u_size == u->size) /* new digit position u0 */\n  {\n    more_comps(u, orig_u_size + 1);\n  }\n\n  do {\n    /* get a temporary short version of u */\n    memcpy(tmp_u->comps, &u->comps[u->size - n - 1 - j],\n           (size_t) (n + 1) * COMP_BYTE_SIZE);\n\n    /* calculate q' */\n    if (U(0) == V1) {\n      q_dash = COMP_RADIX - 1;\n    } else {\n      q_dash = (comp)(((long_comp) U(0) * COMP_RADIX + U(1)) / V1);\n\n      if (v->size > 1 && V2) {\n        /* we are implementing the following:\n        if (V2*q_dash > (((U(0)*COMP_RADIX + U(1) -\n                q_dash*V1)*COMP_RADIX) + U(2))) ... */\n        comp inner = (comp)((long_comp) COMP_RADIX * U(0) + U(1) -\n                            (long_comp) q_dash * V1);\n        if ((long_comp) V2 * q_dash > (long_comp) inner * COMP_RADIX + U(2)) {\n          q_dash--;\n        }\n      }\n    }\n\n    /* multiply and subtract */\n    if (q_dash) {\n      int is_negative;\n      tmp_u = bi_subtract(ctx, tmp_u, bi_int_multiply(ctx, bi_copy(v), q_dash),\n                          &is_negative);\n      more_comps(tmp_u, n + 1);\n\n      Q(j) = q_dash;\n\n      /* add back */\n      if (is_negative) {\n        Q(j)--;\n        tmp_u = bi_add(ctx, tmp_u, bi_copy(v));\n\n        /* lop off the carry */\n        tmp_u->size--;\n        v->size--;\n      }\n    } else {\n      Q(j) = 0;\n    }\n\n    /* copy back to u */\n    memcpy(&u->comps[u->size - n - 1 - j], tmp_u->comps,\n           (size_t) (n + 1) * COMP_BYTE_SIZE);\n  } while (++j <= m);\n\n  bi_free(ctx, tmp_u);\n  bi_free(ctx, v);\n\n  if (is_mod) /* get the remainder */\n  {\n    bi_free(ctx, quotient);\n    return bi_int_divide(ctx, trim(u), d);\n  } else /* get the quotient */\n  {\n    bi_free(ctx, u);\n    return trim(quotient);\n  }\n}\n\n/*\n * Perform an integer divide on a bigint.\n */\nstatic bigint *bi_int_divide(BI_CTX *ctx, bigint *biR, comp denom) {\n  int i = biR->size - 1;\n  long_comp r = 0;\n\n  (void) ctx;\n  check(biR);\n\n  do {\n    r = (r << COMP_BIT_SIZE) + biR->comps[i];\n    biR->comps[i] = (comp)(r / denom);\n    r %= denom;\n  } while (--i >= 0);\n\n  return trim(biR);\n}\n\n#ifdef CONFIG_BIGINT_MONTGOMERY\n/**\n * There is a need for the value of integer N' such that B^-1(B-1)-N^-1N'=1,\n * where B^-1(B-1) mod N=1. Actually, only the least significant part of\n * N' is needed, hence the definition N0'=N' mod b. We reproduce below the\n * simple algorithm from an article by Dusse and Kaliski to efficiently\n * find N0' from N0 and b */\nstatic comp modular_inverse(bigint *bim) {\n  int i;\n  comp t = 1;\n  comp two_2_i_minus_1 = 2; /* 2^(i-1) */\n  long_comp two_2_i = 4;    /* 2^i */\n  comp N = bim->comps[0];\n\n  for (i = 2; i <= COMP_BIT_SIZE; i++) {\n    if ((long_comp) N * t % two_2_i >= two_2_i_minus_1) {\n      t += two_2_i_minus_1;\n    }\n\n    two_2_i_minus_1 <<= 1;\n    two_2_i <<= 1;\n  }\n\n  return (comp)(COMP_RADIX - t);\n}\n#endif\n\n#if defined(CONFIG_BIGINT_KARATSUBA) || defined(CONFIG_BIGINT_BARRETT) || \\\n    defined(CONFIG_BIGINT_MONTGOMERY)\n/**\n * Take each component and shift down (in terms of components)\n */\nstatic bigint *comp_right_shift(bigint *biR, int num_shifts) {\n  int i = biR->size - num_shifts;\n  comp *x = biR->comps;\n  comp *y = &biR->comps[num_shifts];\n\n  check(biR);\n\n  if (i <= 0) /* have we completely right shifted? */\n  {\n    biR->comps[0] = 0; /* return 0 */\n    biR->size = 1;\n    return biR;\n  }\n\n  do {\n    *x++ = *y++;\n  } while (--i > 0);\n\n  biR->size -= num_shifts;\n  return biR;\n}\n\n/**\n * Take each component and shift it up (in terms of components)\n */\nstatic bigint *comp_left_shift(bigint *biR, int num_shifts) {\n  int i = biR->size - 1;\n  comp *x, *y;\n\n  check(biR);\n\n  if (num_shifts <= 0) {\n    return biR;\n  }\n\n  more_comps(biR, biR->size + num_shifts);\n\n  x = &biR->comps[i + num_shifts];\n  y = &biR->comps[i];\n\n  do {\n    *x-- = *y--;\n  } while (i--);\n\n  memset(biR->comps, 0, (size_t) (num_shifts * COMP_BYTE_SIZE)); /* zero LS comps */\n  return biR;\n}\n#endif\n\n/**\n * @brief Allow a binary sequence to be imported as a bigint.\n * @param ctx [in]  The bigint session context.\n * @param data [in] The data to be converted.\n * @param size [in] The number of bytes of data.\n * @return A bigint representing this data.\n */\nNS_INTERNAL bigint *bi_import(BI_CTX *ctx, const uint8_t *data, int size) {\n  bigint *biR = alloc(ctx, (size + COMP_BYTE_SIZE - 1) / COMP_BYTE_SIZE);\n  int i, j = 0, offset = 0;\n\n  memset(biR->comps, 0, (size_t) (biR->size * COMP_BYTE_SIZE));\n\n  for (i = size - 1; i >= 0; i--) {\n    biR->comps[offset] += (comp) data[i] << (j * 8);\n\n    if (++j == COMP_BYTE_SIZE) {\n      j = 0;\n      offset++;\n    }\n  }\n\n  return trim(biR);\n}\n\n#ifdef CONFIG_SSL_FULL_MODE\n/**\n * @brief The testharness uses this code to import text hex-streams and\n * convert them into bigints.\n * @param ctx [in]  The bigint session context.\n * @param data [in] A string consisting of hex characters. The characters must\n * be in upper case.\n * @return A bigint representing this data.\n */\nNS_INTERNAL bigint *bi_str_import(BI_CTX *ctx, const char *data) {\n  int size = strlen(data);\n  bigint *biR = alloc(ctx, (size + COMP_NUM_NIBBLES - 1) / COMP_NUM_NIBBLES);\n  int i, j = 0, offset = 0;\n  memset(biR->comps, 0, (size_t) (biR->size * COMP_BYTE_SIZE));\n\n  for (i = size - 1; i >= 0; i--) {\n    int num = (data[i] <= '9') ? (data[i] - '0') : (data[i] - 'A' + 10);\n    biR->comps[offset] += num << (j * 4);\n\n    if (++j == COMP_NUM_NIBBLES) {\n      j = 0;\n      offset++;\n    }\n  }\n\n  return biR;\n}\n\nNS_INTERNAL void bi_print(const char *label, bigint *x) {\n  int i, j;\n\n  if (x == NULL) {\n    printf(\"%s: (null)\\n\", label);\n    return;\n  }\n\n  printf(\"%s: (size %d)\\n\", label, x->size);\n  for (i = x->size - 1; i >= 0; i--) {\n    for (j = COMP_NUM_NIBBLES - 1; j >= 0; j--) {\n      comp mask = 0x0f << (j * 4);\n      comp num = (x->comps[i] & mask) >> (j * 4);\n      putc((num <= 9) ? (num + '0') : (num + 'A' - 10), stdout);\n    }\n  }\n\n  printf(\"\\n\");\n}\n#endif\n\n/**\n * @brief Take a bigint and convert it into a byte sequence.\n *\n * This is useful after a decrypt operation.\n * @param ctx [in]  The bigint session context.\n * @param x [in]  The bigint to be converted.\n * @param data [out] The converted data as a byte stream.\n * @param size [in] The maximum size of the byte stream. Unused bytes will be\n * zeroed.\n */\nNS_INTERNAL void bi_export(BI_CTX *ctx, bigint *x, uint8_t *data, int size) {\n  int i, j, k = size - 1;\n\n  check(x);\n  memset(data, 0, (size_t) size); /* ensure all leading 0's are cleared */\n\n  for (i = 0; i < x->size; i++) {\n    for (j = 0; j < COMP_BYTE_SIZE; j++) {\n      comp mask = (comp) 0xff << (j * 8);\n      int num = (int) (x->comps[i] & mask) >> (j * 8);\n      data[k--] = (uint8_t) num;\n\n      if (k < 0) {\n        goto buf_done;\n      }\n    }\n  }\nbuf_done:\n\n  bi_free(ctx, x);\n}\n\n/**\n * @brief Pre-calculate some of the expensive steps in reduction.\n *\n * This function should only be called once (normally when a session starts).\n * When the session is over, bi_free_mod() should be called. bi_mod_power()\n * relies on this function being called.\n * @param ctx [in]  The bigint session context.\n * @param bim [in]  The bigint modulus that will be used.\n * @param mod_offset [in] There are three moduluii that can be stored - the\n * standard modulus, and its two primes p and q. This offset refers to which\n * modulus we are referring to.\n * @see bi_free_mod(), bi_mod_power().\n */\nNS_INTERNAL void bi_set_mod(BI_CTX *ctx, bigint *bim, int mod_offset) {\n  int k = bim->size;\n  comp d = (comp)((long_comp) COMP_RADIX / (bim->comps[k - 1] + 1));\n#ifdef CONFIG_BIGINT_MONTGOMERY\n  bigint *R, *R2;\n#endif\n\n  ctx->bi_mod[mod_offset] = bim;\n  bi_permanent(ctx->bi_mod[mod_offset]);\n  ctx->bi_normalised_mod[mod_offset] = bi_int_multiply(ctx, bim, d);\n  bi_permanent(ctx->bi_normalised_mod[mod_offset]);\n\n#if defined(CONFIG_BIGINT_MONTGOMERY)\n  /* set montgomery variables */\n  R = comp_left_shift(bi_clone(ctx, ctx->bi_radix), k - 1);      /* R */\n  R2 = comp_left_shift(bi_clone(ctx, ctx->bi_radix), k * 2 - 1); /* R^2 */\n  ctx->bi_RR_mod_m[mod_offset] = bi_mod(ctx, R2);                /* R^2 mod m */\n  ctx->bi_R_mod_m[mod_offset] = bi_mod(ctx, R);                  /* R mod m */\n\n  bi_permanent(ctx->bi_RR_mod_m[mod_offset]);\n  bi_permanent(ctx->bi_R_mod_m[mod_offset]);\n\n  ctx->N0_dash[mod_offset] = modular_inverse(ctx->bi_mod[mod_offset]);\n\n#elif defined(CONFIG_BIGINT_BARRETT)\n  ctx->bi_mu[mod_offset] =\n      bi_divide(ctx, comp_left_shift(bi_clone(ctx, ctx->bi_radix), k * 2 - 1),\n                ctx->bi_mod[mod_offset], 0);\n  bi_permanent(ctx->bi_mu[mod_offset]);\n#endif\n}\n\n/**\n * @brief Used when cleaning various bigints at the end of a session.\n * @param ctx [in]  The bigint session context.\n * @param mod_offset [in] The offset to use.\n * @see bi_set_mod().\n */\nvoid bi_free_mod(BI_CTX *ctx, int mod_offset) {\n  bi_depermanent(ctx->bi_mod[mod_offset]);\n  bi_free(ctx, ctx->bi_mod[mod_offset]);\n#if defined(CONFIG_BIGINT_MONTGOMERY)\n  bi_depermanent(ctx->bi_RR_mod_m[mod_offset]);\n  bi_depermanent(ctx->bi_R_mod_m[mod_offset]);\n  bi_free(ctx, ctx->bi_RR_mod_m[mod_offset]);\n  bi_free(ctx, ctx->bi_R_mod_m[mod_offset]);\n#elif defined(CONFIG_BIGINT_BARRETT)\n  bi_depermanent(ctx->bi_mu[mod_offset]);\n  bi_free(ctx, ctx->bi_mu[mod_offset]);\n#endif\n  bi_depermanent(ctx->bi_normalised_mod[mod_offset]);\n  bi_free(ctx, ctx->bi_normalised_mod[mod_offset]);\n}\n\n/**\n * Perform a standard multiplication between two bigints.\n *\n * Barrett reduction has no need for some parts of the product, so ignore bits\n * of the multiply. This routine gives Barrett its big performance\n * improvements over Classical/Montgomery reduction methods.\n */\nstatic bigint *regular_multiply(BI_CTX *ctx, bigint *bia, bigint *bib,\n                                int inner_partial, int outer_partial) {\n  int i = 0, j;\n  int n = bia->size;\n  int t = bib->size;\n  bigint *biR = alloc(ctx, n + t);\n  comp *sr = biR->comps;\n  comp *sa = bia->comps;\n  comp *sb = bib->comps;\n\n  check(bia);\n  check(bib);\n\n  /* clear things to start with */\n  memset(biR->comps, 0, (size_t) ((n + t) * COMP_BYTE_SIZE));\n\n  do {\n    long_comp tmp;\n    comp carry = 0;\n    int r_index = i;\n    j = 0;\n\n    if (outer_partial && outer_partial - i > 0 && outer_partial < n) {\n      r_index = outer_partial - 1;\n      j = outer_partial - i - 1;\n    }\n\n    do {\n      if (inner_partial && r_index >= inner_partial) {\n        break;\n      }\n\n      tmp = sr[r_index] + ((long_comp) sa[j]) * sb[i] + carry;\n      sr[r_index++] = (comp) tmp; /* downsize */\n      carry = (comp) (tmp >> COMP_BIT_SIZE);\n    } while (++j < n);\n\n    sr[r_index] = carry;\n  } while (++i < t);\n\n  bi_free(ctx, bia);\n  bi_free(ctx, bib);\n  return trim(biR);\n}\n\n#ifdef CONFIG_BIGINT_KARATSUBA\n/*\n * Karatsuba improves on regular multiplication due to only 3 multiplications\n * being done instead of 4. The additional additions/subtractions are O(N)\n * rather than O(N^2) and so for big numbers it saves on a few operations\n */\nstatic bigint *karatsuba(BI_CTX *ctx, bigint *bia, bigint *bib, int is_square) {\n  bigint *x0, *x1;\n  bigint *p0, *p1, *p2;\n  int m;\n\n  if (is_square) {\n    m = (bia->size + 1) / 2;\n  } else {\n    m = (MAX(bia->size, bib->size) + 1) / 2;\n  }\n\n  x0 = bi_clone(ctx, bia);\n  x0->size = m;\n  x1 = bi_clone(ctx, bia);\n  comp_right_shift(x1, m);\n  bi_free(ctx, bia);\n\n  /* work out the 3 partial products */\n  if (is_square) {\n    p0 = bi_square(ctx, bi_copy(x0));\n    p2 = bi_square(ctx, bi_copy(x1));\n    p1 = bi_square(ctx, bi_add(ctx, x0, x1));\n  } else /* normal multiply */\n  {\n    bigint *y0, *y1;\n    y0 = bi_clone(ctx, bib);\n    y0->size = m;\n    y1 = bi_clone(ctx, bib);\n    comp_right_shift(y1, m);\n    bi_free(ctx, bib);\n\n    p0 = bi_multiply(ctx, bi_copy(x0), bi_copy(y0));\n    p2 = bi_multiply(ctx, bi_copy(x1), bi_copy(y1));\n    p1 = bi_multiply(ctx, bi_add(ctx, x0, x1), bi_add(ctx, y0, y1));\n  }\n\n  p1 = bi_subtract(ctx, bi_subtract(ctx, p1, bi_copy(p2), NULL), bi_copy(p0),\n                   NULL);\n\n  comp_left_shift(p1, m);\n  comp_left_shift(p2, 2 * m);\n  return bi_add(ctx, p1, bi_add(ctx, p0, p2));\n}\n#endif\n\n/**\n * @brief Perform a multiplication operation between two bigints.\n * @param ctx [in]  The bigint session context.\n * @param bia [in]  A bigint.\n * @param bib [in]  Another bigint.\n * @return The result of the multiplication.\n */\nNS_INTERNAL bigint *bi_multiply(BI_CTX *ctx, bigint *bia, bigint *bib) {\n  check(bia);\n  check(bib);\n\n#ifdef CONFIG_BIGINT_KARATSUBA\n  if (MIN(bia->size, bib->size) < MUL_KARATSUBA_THRESH) {\n    return regular_multiply(ctx, bia, bib, 0, 0);\n  }\n\n  return karatsuba(ctx, bia, bib, 0);\n#else\n  return regular_multiply(ctx, bia, bib, 0, 0);\n#endif\n}\n\n#ifdef CONFIG_BIGINT_SQUARE\n/*\n * Perform the actual square operion. It takes into account overflow.\n */\nstatic bigint *regular_square(BI_CTX *ctx, bigint *bi) {\n  int t = bi->size;\n  int i = 0, j;\n  bigint *biR = alloc(ctx, t * 2 + 1);\n  comp *w = biR->comps;\n  comp *x = bi->comps;\n  long_comp carry;\n  memset(w, 0, biR->size * COMP_BYTE_SIZE);\n\n  do {\n    long_comp tmp = w[2 * i] + (long_comp) x[i] * x[i];\n    w[2 * i] = (comp) tmp;\n    carry = tmp >> COMP_BIT_SIZE;\n\n    for (j = i + 1; j < t; j++) {\n      uint8_t c = 0;\n      long_comp xx = (long_comp) x[i] * x[j];\n      if ((COMP_MAX - xx) < xx) c = 1;\n\n      tmp = (xx << 1);\n\n      if ((COMP_MAX - tmp) < w[i + j]) c = 1;\n\n      tmp += w[i + j];\n\n      if ((COMP_MAX - tmp) < carry) c = 1;\n\n      tmp += carry;\n      w[i + j] = (comp) tmp;\n      carry = tmp >> COMP_BIT_SIZE;\n\n      if (c) carry += COMP_RADIX;\n    }\n\n    tmp = w[i + t] + carry;\n    w[i + t] = (comp) tmp;\n    w[i + t + 1] = tmp >> COMP_BIT_SIZE;\n  } while (++i < t);\n\n  bi_free(ctx, bi);\n  return trim(biR);\n}\n\n/**\n * @brief Perform a square operation on a bigint.\n * @param ctx [in]  The bigint session context.\n * @param bia [in]  A bigint.\n * @return The result of the multiplication.\n */\nNS_INTERNAL bigint *bi_square(BI_CTX *ctx, bigint *bia) {\n  check(bia);\n\n#ifdef CONFIG_BIGINT_KARATSUBA\n  if (bia->size < SQU_KARATSUBA_THRESH) {\n    return regular_square(ctx, bia);\n  }\n\n  return karatsuba(ctx, bia, NULL, 1);\n#else\n  return regular_square(ctx, bia);\n#endif\n}\n#endif\n\n/**\n * @brief Compare two bigints.\n * @param bia [in]  A bigint.\n * @param bib [in]  Another bigint.\n * @return -1 if smaller, 1 if larger and 0 if equal.\n */\nNS_INTERNAL int bi_compare(bigint *bia, bigint *bib) {\n  int r, i;\n\n  check(bia);\n  check(bib);\n\n  if (bia->size > bib->size)\n    r = 1;\n  else if (bia->size < bib->size)\n    r = -1;\n  else {\n    comp *a = bia->comps;\n    comp *b = bib->comps;\n\n    /* Same number of components.  Compare starting from the high end\n     * and working down. */\n    r = 0;\n    i = bia->size - 1;\n\n    do {\n      if (a[i] > b[i]) {\n        r = 1;\n        break;\n      } else if (a[i] < b[i]) {\n        r = -1;\n        break;\n      }\n    } while (--i >= 0);\n  }\n\n  return r;\n}\n\n/*\n * Allocate and zero more components.  Does not consume bi.\n */\nstatic void more_comps(bigint *bi, int n) {\n  if (n > bi->max_comps) {\n    int max = MAX(bi->max_comps * 2, n);\n    void *p = mg_calloc(1, (size_t) max * COMP_BYTE_SIZE);\n    if (p != NULL && bi->size > 0) memcpy(p, bi->comps, (size_t) bi->max_comps * COMP_BYTE_SIZE);\n    mg_free(bi->comps);\n    bi->max_comps = (short) max;\n    bi->comps = (comp *) p;\n  }\n\n  if (n > bi->size) {\n    memset(&bi->comps[bi->size], 0, (size_t) (n - bi->size) * COMP_BYTE_SIZE);\n  }\n\n  bi->size = (short) n;\n}\n\n/*\n * Make a new empty bigint. It may just use an old one if one is available.\n * Otherwise get one off the heap.\n */\nstatic bigint *alloc(BI_CTX *ctx, int size) {\n  bigint *biR;\n\n  /* Can we recycle an old bigint? */\n  if (ctx->free_list != NULL) {\n    biR = ctx->free_list;\n    ctx->free_list = biR->next;\n    ctx->free_count--;\n\n    if (biR->refs != 0) {\n#ifdef CONFIG_SSL_FULL_MODE\n      printf(\"alloc: refs was not 0\\n\");\n#endif\n      abort(); /* create a stack trace from a core dump */\n    }\n\n    more_comps(biR, size);\n  } else {\n    /* No free bigints available - create a new one. */\n    biR = (bigint *) mg_calloc(1, sizeof(bigint));\n    biR->comps = (comp *) mg_calloc(1, (size_t) size * COMP_BYTE_SIZE);\n    biR->max_comps = (short) size; /* give some space to spare */\n  }\n\n  biR->size = (short) size;\n  biR->refs = 1;\n  biR->next = NULL;\n  ctx->active_count++;\n  return biR;\n}\n\n/*\n * Work out the highest '1' bit in an exponent. Used when doing sliding-window\n * exponentiation.\n */\nstatic int find_max_exp_index(bigint *biexp) {\n  int i = COMP_BIT_SIZE - 1;\n  comp shift = COMP_RADIX / 2;\n  comp test = biexp->comps[biexp->size - 1]; /* assume no leading zeroes */\n\n  check(biexp);\n\n  do {\n    if (test & shift) {\n      return i + (biexp->size - 1) * COMP_BIT_SIZE;\n    }\n\n    shift >>= 1;\n  } while (i-- != 0);\n\n  return -1; /* error - must have been a leading 0 */\n}\n\n/*\n * Is a particular bit is an exponent 1 or 0? Used when doing sliding-window\n * exponentiation.\n */\nstatic int exp_bit_is_one(bigint *biexp, int offset) {\n  comp test = biexp->comps[offset / COMP_BIT_SIZE];\n  int num_shifts = offset % COMP_BIT_SIZE;\n  comp shift = 1;\n  int i;\n\n  check(biexp);\n\n  for (i = 0; i < num_shifts; i++) {\n    shift <<= 1;\n  }\n\n  return (test & shift) != 0;\n}\n\n#ifdef CONFIG_BIGINT_CHECK_ON\n/*\n * Perform a sanity check on bi.\n */\nstatic void check(const bigint *bi) {\n  if (bi->refs <= 0) {\n    printf(\"check: zero or negative refs in bigint\\n\");\n    abort();\n  }\n\n  if (bi->next != NULL) {\n    printf(\n        \"check: attempt to use a bigint from \"\n        \"the free list\\n\");\n    abort();\n  }\n}\n#endif\n\n/*\n * Delete any leading 0's (and allow for 0).\n */\nstatic bigint *trim(bigint *bi) {\n  check(bi);\n\n  while (bi->comps[bi->size - 1] == 0 && bi->size > 1) {\n    bi->size--;\n  }\n\n  return bi;\n}\n\n#if defined(CONFIG_BIGINT_MONTGOMERY)\n/**\n * @brief Perform a single montgomery reduction.\n * @param ctx [in]  The bigint session context.\n * @param bixy [in]  A bigint.\n * @return The result of the montgomery reduction.\n */\nNS_INTERNAL bigint *bi_mont(BI_CTX *ctx, bigint *bixy) {\n  int i = 0, n;\n  uint8_t mod_offset = ctx->mod_offset;\n  bigint *bim = ctx->bi_mod[mod_offset];\n  comp mod_inv = ctx->N0_dash[mod_offset];\n\n  check(bixy);\n\n  if (ctx->use_classical) /* just use classical instead */\n  {\n    return bi_mod(ctx, bixy);\n  }\n\n  n = bim->size;\n\n  do {\n    bixy = bi_add(ctx, bixy,\n                  comp_left_shift(\n                      bi_int_multiply(ctx, bim, bixy->comps[i] * mod_inv), i));\n  } while (++i < n);\n\n  comp_right_shift(bixy, n);\n\n  if (bi_compare(bixy, bim) >= 0) {\n    bixy = bi_subtract(ctx, bixy, bim, NULL);\n  }\n\n  return bixy;\n}\n\n#elif defined(CONFIG_BIGINT_BARRETT)\n/*\n * Stomp on the most significant components to give the illusion of a \"mod base\n * radix\" operation\n */\nstatic bigint *comp_mod(bigint *bi, int mod) {\n  check(bi);\n\n  if (bi->size > mod) {\n    bi->size = mod;\n  }\n\n  return bi;\n}\n\n/**\n * @brief Perform a single Barrett reduction.\n * @param ctx [in]  The bigint session context.\n * @param bi [in]  A bigint.\n * @return The result of the Barrett reduction.\n */\nNS_INTERNAL bigint *bi_barrett(BI_CTX *ctx, bigint *bi) {\n  bigint *q1, *q2, *q3, *r1, *r2, *r;\n  uint8_t mod_offset = ctx->mod_offset;\n  bigint *bim = ctx->bi_mod[mod_offset];\n  int k = bim->size;\n\n  check(bi);\n  check(bim);\n\n  /* use Classical method instead  - Barrett cannot help here */\n  if (bi->size > k * 2) {\n    return bi_mod(ctx, bi);\n  }\n\n  q1 = comp_right_shift(bi_clone(ctx, bi), k - 1);\n\n  /* do outer partial multiply */\n  q2 = regular_multiply(ctx, q1, ctx->bi_mu[mod_offset], 0, k - 1);\n  q3 = comp_right_shift(q2, k + 1);\n  r1 = comp_mod(bi, k + 1);\n\n  /* do inner partial multiply */\n  r2 = comp_mod(regular_multiply(ctx, q3, bim, k + 1, 0), k + 1);\n  r = bi_subtract(ctx, r1, r2, NULL);\n\n  /* if (r >= m) r = r - m; */\n  if (bi_compare(r, bim) >= 0) {\n    r = bi_subtract(ctx, r, bim, NULL);\n  }\n\n  return r;\n}\n#endif /* CONFIG_BIGINT_BARRETT */\n\n#ifdef CONFIG_BIGINT_SLIDING_WINDOW\n/*\n * Work out g1, g3, g5, g7... etc for the sliding-window algorithm\n */\nstatic void precompute_slide_window(BI_CTX *ctx, int window, bigint *g1) {\n  int k = 1, i;\n  bigint *g2;\n\n  for (i = 0; i < window - 1; i++) /* compute 2^(window-1) */\n  {\n    k <<= 1;\n  }\n\n  ctx->g = (bigint **) mg_calloc(1, k * sizeof(bigint *));\n  ctx->g[0] = bi_clone(ctx, g1);\n  bi_permanent(ctx->g[0]);\n  g2 = bi_residue(ctx, bi_square(ctx, ctx->g[0])); /* g^2 */\n\n  for (i = 1; i < k; i++) {\n    ctx->g[i] = bi_residue(ctx, bi_multiply(ctx, ctx->g[i - 1], bi_copy(g2)));\n    bi_permanent(ctx->g[i]);\n  }\n\n  bi_free(ctx, g2);\n  ctx->window = k;\n}\n#endif\n\n/**\n * @brief Perform a modular exponentiation.\n *\n * This function requires bi_set_mod() to have been called previously. This is\n * one of the optimisations used for performance.\n * @param ctx [in]  The bigint session context.\n * @param bi  [in]  The bigint on which to perform the mod power operation.\n * @param biexp [in] The bigint exponent.\n * @return The result of the mod exponentiation operation\n * @see bi_set_mod().\n */\nNS_INTERNAL bigint *bi_mod_power(BI_CTX *ctx, bigint *bi, bigint *biexp) {\n  int i = find_max_exp_index(biexp), j, window_size = 1;\n  bigint *biR = int_to_bi(ctx, 1);\n\n#if defined(CONFIG_BIGINT_MONTGOMERY)\n  uint8_t mod_offset = ctx->mod_offset;\n  if (!ctx->use_classical) {\n    /* preconvert */\n    bi = bi_mont(ctx,\n                 bi_multiply(ctx, bi, ctx->bi_RR_mod_m[mod_offset])); /* x' */\n    bi_free(ctx, biR);\n    biR = ctx->bi_R_mod_m[mod_offset]; /* A */\n  }\n#endif\n\n  check(bi);\n  check(biexp);\n\n#ifdef CONFIG_BIGINT_SLIDING_WINDOW\n  for (j = i; j > 32; j /= 5) /* work out an optimum size */\n    window_size++;\n\n  /* work out the slide constants */\n  precompute_slide_window(ctx, window_size, bi);\n#else /* just one constant */\n  ctx->g = (bigint **) mg_calloc(1, sizeof(bigint *));\n  ctx->g[0] = bi_clone(ctx, bi);\n  ctx->window = 1;\n  bi_permanent(ctx->g[0]);\n#endif\n\n  /* if sliding-window is off, then only one bit will be done at a time and\n   * will reduce to standard left-to-right exponentiation */\n  do {\n    if (exp_bit_is_one(biexp, i)) {\n      int l = i - window_size + 1;\n      int part_exp = 0;\n\n      if (l < 0) /* LSB of exponent will always be 1 */\n        l = 0;\n      else {\n        while (exp_bit_is_one(biexp, l) == 0) l++; /* go back up */\n      }\n\n      /* build up the section of the exponent */\n      for (j = i; j >= l; j--) {\n        biR = bi_residue(ctx, bi_square(ctx, biR));\n        if (exp_bit_is_one(biexp, j)) part_exp++;\n\n        if (j != l) part_exp <<= 1;\n      }\n\n      part_exp = (part_exp - 1) / 2; /* adjust for array */\n      biR = bi_residue(ctx, bi_multiply(ctx, biR, ctx->g[part_exp]));\n      i = l - 1;\n    } else /* square it */\n    {\n      biR = bi_residue(ctx, bi_square(ctx, biR));\n      i--;\n    }\n  } while (i >= 0);\n\n  /* cleanup */\n  for (i = 0; i < ctx->window; i++) {\n    bi_depermanent(ctx->g[i]);\n    bi_free(ctx, ctx->g[i]);\n  }\n\n  mg_free(ctx->g);\n  bi_free(ctx, bi);\n  bi_free(ctx, biexp);\n#if defined CONFIG_BIGINT_MONTGOMERY\n  return ctx->use_classical ? biR : bi_mont(ctx, biR); /* convert back */\n#else /* CONFIG_BIGINT_CLASSICAL or CONFIG_BIGINT_BARRETT */\n  return biR;\n#endif\n}\n\n/**\n * @brief Use the Chinese Remainder Theorem to quickly perform RSA decrypts.\n *\n * @param ctx [in]  The bigint session context.\n * @param bi  [in]  The bigint to perform the exp/mod.\n * @param dP [in] CRT's dP bigint\n * @param dQ [in] CRT's dQ bigint\n * @param p [in] CRT's p bigint\n * @param q [in] CRT's q bigint\n * @param qInv [in] CRT's qInv bigint\n * @return The result of the CRT operation\n */\n#if 1\nNS_INTERNAL bigint *bi_crt(BI_CTX *ctx, bigint *bi, bigint *dP, bigint *dQ,\n                           bigint *p, bigint *q, bigint *qInv) {\n  bigint *m1, *m2, *h;\n\n/* Montgomery has a condition the 0 < x, y < m and these products violate\n * that condition. So disable Montgomery when using CRT */\n#if defined(CONFIG_BIGINT_MONTGOMERY)\n  ctx->use_classical = 1;\n#endif\n  ctx->mod_offset = BIGINT_P_OFFSET;\n  m1 = bi_mod_power(ctx, bi_copy(bi), dP);\n\n  ctx->mod_offset = BIGINT_Q_OFFSET;\n  m2 = bi_mod_power(ctx, bi, dQ);\n\n  h = bi_subtract(ctx, bi_add(ctx, m1, p), bi_copy(m2), NULL);\n  h = bi_multiply(ctx, h, qInv);\n  ctx->mod_offset = BIGINT_P_OFFSET;\n  h = bi_residue(ctx, h);\n#if defined(CONFIG_BIGINT_MONTGOMERY)\n  ctx->use_classical = 0; /* reset for any further operation */\n#endif\n  return bi_add(ctx, m2, bi_multiply(ctx, q, h));\n}\n#endif\n\n// Proper lib usage:\n// - BI_CTX *c = bi_initialize()\n// - allocate bigints (e.g.: calling bi_import(), int_to_bi(), ...)\n// - function calls, allocate bigints, etc.\n// - bigint *n = bi_import(c, indata, insize)\n//   - bi_set_mod(c, n, x)\n//   - mod function calls\n//   - bigint *nn = bi_mod_pwr(c, m, e) <-- frees m, e\n//   - bi_free_mod(c, x)                <-- frees n\n// - bi_export(c, nn, outdata, outsize) <-- frees nn\n// - function calls\n// - free bigints calling bi_free()\n// - bi_terminate(c)                    <-- frees c\n\nint mg_rsa_mod_pow(const uint8_t *mod, size_t modsz, const uint8_t *exp, size_t expsz, const uint8_t *msg, size_t msgsz, uint8_t *out, size_t outsz) {\n\tBI_CTX *bi_ctx = bi_initialize();\n\tbigint *m1;\n\tbigint *n = bi_import(bi_ctx, mod, (int) modsz);\n\tbigint *e = bi_import(bi_ctx, exp, (int) expsz);\n\tbigint *h = bi_import(bi_ctx, msg, (int) msgsz);\n\tbi_set_mod(bi_ctx, n, 0);\n\tm1 = bi_mod_power(bi_ctx, h, e);\n\tbi_free_mod(bi_ctx, 0);\n\tbi_export(bi_ctx, m1, out, (int) outsz);\n\tbi_terminate(bi_ctx);\n\treturn 0;\n}\n\nint mg_rsa_crt_sign(const uint8_t *em, size_t em_len,\n                    const uint8_t *dP, size_t dP_len,\n                    const uint8_t *dQ, size_t dQ_len,\n                    const uint8_t *p, size_t p_len,\n                    const uint8_t *q, size_t q_len,\n                    const uint8_t *qInv, size_t qInv_len,\n                    uint8_t *signature, size_t sig_len) {\n  BI_CTX *ctx;\n  bigint *em_bi, *dP_bi, *dQ_bi, *p_bi, *q_bi, *qInv_bi, *result_bi;\n  int ret = -1;\n\n  ctx = bi_initialize();\n  if (ctx == NULL) {\n    return -1;\n  }\n\n  em_bi = bi_import(ctx, em, (int) em_len);\n  dP_bi = bi_import(ctx, dP, (int) dP_len);\n  dQ_bi = bi_import(ctx, dQ, (int) dQ_len);\n  p_bi = bi_import(ctx, p, (int) p_len);\n  q_bi = bi_import(ctx, q, (int) q_len);\n  qInv_bi = bi_import(ctx, qInv, (int) qInv_len);\n\n  if (em_bi == NULL || dP_bi == NULL || dQ_bi == NULL ||\n      p_bi == NULL || q_bi == NULL || qInv_bi == NULL) {\n    goto cleanup;\n  }\n\n  bi_set_mod(ctx, bi_clone(ctx, p_bi), BIGINT_P_OFFSET);\n  bi_set_mod(ctx, bi_clone(ctx, q_bi), BIGINT_Q_OFFSET);\n\n  result_bi = bi_crt(ctx, em_bi, dP_bi, dQ_bi, p_bi, q_bi, qInv_bi);\n  if (result_bi == NULL) {\n    goto cleanup;\n  }\n  bi_export(ctx, result_bi, signature, (int) sig_len);\n  ret = 0;  // Success!\ncleanup:\n  bi_free_mod(ctx, BIGINT_P_OFFSET);  // cloned p_bi stored in mod context\n  bi_free_mod(ctx, BIGINT_Q_OFFSET);  // cloned q_bi stored in mod context\n  bi_terminate(ctx);\n  return ret;\n}\n\n#endif /* MG_TLS == MG_TLS_BUILTIN */\n"
  },
  {
    "path": "src/tls_rsa.h",
    "content": "#ifndef TLS_RSA_H\n#define TLS_RSA_H\n\n#include \"arch.h\"\nint mg_rsa_mod_pow(const uint8_t *mod, size_t modsz, const uint8_t *exp, size_t expsz, const uint8_t *msg, size_t msgsz, uint8_t *out, size_t outsz);\nint mg_rsa_crt_sign(const uint8_t *em, size_t em_len,\n                    const uint8_t *dP, size_t dP_len,\n                    const uint8_t *dQ, size_t dQ_len,\n                    const uint8_t *p, size_t p_len,\n                    const uint8_t *q, size_t q_len,\n                    const uint8_t *qInv, size_t qInv_len,\n                    uint8_t *signature, size_t sig_len);\n#endif // TLS_RSA_H\n"
  },
  {
    "path": "src/tls_uecc.c",
    "content": "/* Copyright 2014, Kenneth MacKay. Licensed under the BSD 2-clause license. */\n\n#include \"tls_uecc.h\"\n#include \"tls.h\"\n\n#if MG_TLS == MG_TLS_BUILTIN\n\n#ifndef MG_UECC_RNG_MAX_TRIES\n#define MG_UECC_RNG_MAX_TRIES 64\n#endif\n\n#if MG_UECC_ENABLE_VLI_API\n#define MG_UECC_VLI_API\n#else\n#define MG_UECC_VLI_API static\n#endif\n\n#if (MG_UECC_PLATFORM == mg_uecc_avr) || (MG_UECC_PLATFORM == mg_uecc_arm) || \\\n    (MG_UECC_PLATFORM == mg_uecc_arm_thumb) ||                                \\\n    (MG_UECC_PLATFORM == mg_uecc_arm_thumb2)\n#define MG_UECC_CONCATX(a, ...) a##__VA_ARGS__\n#define MG_UECC_CONCAT(a, ...) MG_UECC_CONCATX(a, __VA_ARGS__)\n\n#define STRX(a) #a\n#define STR(a) STRX(a)\n\n#define EVAL(...) EVAL1(EVAL1(EVAL1(EVAL1(__VA_ARGS__))))\n#define EVAL1(...) EVAL2(EVAL2(EVAL2(EVAL2(__VA_ARGS__))))\n#define EVAL2(...) EVAL3(EVAL3(EVAL3(EVAL3(__VA_ARGS__))))\n#define EVAL3(...) EVAL4(EVAL4(EVAL4(EVAL4(__VA_ARGS__))))\n#define EVAL4(...) __VA_ARGS__\n\n#define DEC_1 0\n#define DEC_2 1\n#define DEC_3 2\n#define DEC_4 3\n#define DEC_5 4\n#define DEC_6 5\n#define DEC_7 6\n#define DEC_8 7\n#define DEC_9 8\n#define DEC_10 9\n#define DEC_11 10\n#define DEC_12 11\n#define DEC_13 12\n#define DEC_14 13\n#define DEC_15 14\n#define DEC_16 15\n#define DEC_17 16\n#define DEC_18 17\n#define DEC_19 18\n#define DEC_20 19\n#define DEC_21 20\n#define DEC_22 21\n#define DEC_23 22\n#define DEC_24 23\n#define DEC_25 24\n#define DEC_26 25\n#define DEC_27 26\n#define DEC_28 27\n#define DEC_29 28\n#define DEC_30 29\n#define DEC_31 30\n#define DEC_32 31\n\n#define DEC_(N) MG_UECC_CONCAT(DEC_, N)\n\n#define SECOND_ARG(_, val, ...) val\n#define SOME_CHECK_0 ~, 0\n#define GET_SECOND_ARG(...) SECOND_ARG(__VA_ARGS__, SOME, )\n#define SOME_OR_0(N) GET_SECOND_ARG(MG_UECC_CONCAT(SOME_CHECK_, N))\n\n#define MG_UECC_EMPTY(...)\n#define DEFER(...) __VA_ARGS__ MG_UECC_EMPTY()\n\n#define REPEAT_NAME_0() REPEAT_0\n#define REPEAT_NAME_SOME() REPEAT_SOME\n#define REPEAT_0(...)\n#define REPEAT_SOME(N, stuff) \\\n  DEFER(MG_UECC_CONCAT(REPEAT_NAME_, SOME_OR_0(DEC_(N))))()(DEC_(N), stuff) stuff\n#define REPEAT(N, stuff) EVAL(REPEAT_SOME(N, stuff))\n\n#define REPEATM_NAME_0() REPEATM_0\n#define REPEATM_NAME_SOME() REPEATM_SOME\n#define REPEATM_0(...)\n#define REPEATM_SOME(N, macro) \\\n  macro(N) DEFER(MG_UECC_CONCAT(REPEATM_NAME_, SOME_OR_0(DEC_(N))))()(DEC_(N), macro)\n#define REPEATM(N, macro) EVAL(REPEATM_SOME(N, macro))\n#endif\n\n// #include \"platform-specific.inc\"\n\n#if (MG_UECC_WORD_SIZE == 1)\n#if MG_UECC_SUPPORTS_secp160r1\n#define MG_UECC_MAX_WORDS 21 /* Due to the size of curve_n. */\n#endif\n#if MG_UECC_SUPPORTS_secp192r1\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 24\n#endif\n#if MG_UECC_SUPPORTS_secp224r1\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 28\n#endif\n#if (MG_UECC_SUPPORTS_secp256r1 || MG_UECC_SUPPORTS_secp256k1)\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 32\n#endif\n#elif (MG_UECC_WORD_SIZE == 4)\n#if MG_UECC_SUPPORTS_secp160r1\n#define MG_UECC_MAX_WORDS 6 /* Due to the size of curve_n. */\n#endif\n#if MG_UECC_SUPPORTS_secp192r1\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 6\n#endif\n#if MG_UECC_SUPPORTS_secp224r1\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 7\n#endif\n#if (MG_UECC_SUPPORTS_secp256r1 || MG_UECC_SUPPORTS_secp256k1)\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 8\n#endif\n#elif (MG_UECC_WORD_SIZE == 8)\n#if MG_UECC_SUPPORTS_secp160r1\n#define MG_UECC_MAX_WORDS 3\n#endif\n#if MG_UECC_SUPPORTS_secp192r1\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 3\n#endif\n#if MG_UECC_SUPPORTS_secp224r1\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 4\n#endif\n#if (MG_UECC_SUPPORTS_secp256r1 || MG_UECC_SUPPORTS_secp256k1)\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 4\n#endif\n#endif /* MG_UECC_WORD_SIZE */\n\n#define BITS_TO_WORDS(num_bits)                                \\\n  ((wordcount_t) ((num_bits + ((MG_UECC_WORD_SIZE * 8) - 1)) / \\\n                  (MG_UECC_WORD_SIZE * 8)))\n#define BITS_TO_BYTES(num_bits) ((num_bits + 7) / 8)\n\nstruct MG_UECC_Curve_t {\n  wordcount_t num_words;\n  wordcount_t num_bytes;\n  bitcount_t num_n_bits;\n  mg_uecc_word_t p[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t n[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t G[MG_UECC_MAX_WORDS * 2];\n  mg_uecc_word_t b[MG_UECC_MAX_WORDS];\n  void (*double_jacobian)(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                          mg_uecc_word_t *Z1, MG_UECC_Curve curve);\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n  void (*mod_sqrt)(mg_uecc_word_t *a, MG_UECC_Curve curve);\n#endif\n  void (*x_side)(mg_uecc_word_t *result, const mg_uecc_word_t *x,\n                 MG_UECC_Curve curve);\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n  void (*mmod_fast)(mg_uecc_word_t *result, mg_uecc_word_t *product);\n#endif\n};\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\nstatic void bcopy(uint8_t *dst, const uint8_t *src, unsigned num_bytes) {\n  while (0 != num_bytes) {\n    num_bytes--;\n    dst[num_bytes] = src[num_bytes];\n  }\n}\n#endif\n\nstatic cmpresult_t mg_uecc_vli_cmp_unsafe(const mg_uecc_word_t *left,\n                                          const mg_uecc_word_t *right,\n                                          wordcount_t num_words);\n\n#if (MG_UECC_PLATFORM == mg_uecc_arm ||       \\\n     MG_UECC_PLATFORM == mg_uecc_arm_thumb || \\\n     MG_UECC_PLATFORM == mg_uecc_arm_thumb2)\n#include \"asm_arm.inc\"\n#endif\n\n#if (MG_UECC_PLATFORM == mg_uecc_avr)\n#include \"asm_avr.inc\"\n#endif\n\n#ifndef asm_clear\n#define asm_clear 0\n#endif\n#ifndef asm_set\n#define asm_set 0\n#endif\n#ifndef asm_add\n#define asm_add 0\n#endif\n#ifndef asm_sub\n#define asm_sub 0\n#endif\n#ifndef asm_mult\n#define asm_mult 0\n#endif\n#ifndef asm_rshift1\n#define asm_rshift1 0\n#endif\n#ifndef asm_mmod_fast_secp256r1\n#define asm_mmod_fast_secp256r1 0\n#endif\n\n#if defined(default_RNG_defined) && default_RNG_defined\nstatic MG_UECC_RNG_Function g_rng_function = &default_RNG;\n#else\nstatic MG_UECC_RNG_Function g_rng_function = 0;\n#endif\n\nvoid mg_uecc_set_rng(MG_UECC_RNG_Function rng_function) {\n  g_rng_function = rng_function;\n}\n\nMG_UECC_RNG_Function mg_uecc_get_rng(void) {\n  return g_rng_function;\n}\n\nint mg_uecc_curve_private_key_size(MG_UECC_Curve curve) {\n  return BITS_TO_BYTES(curve->num_n_bits);\n}\n\nint mg_uecc_curve_public_key_size(MG_UECC_Curve curve) {\n  return 2 * curve->num_bytes;\n}\n\n#if !asm_clear\nMG_UECC_VLI_API void mg_uecc_vli_clear(mg_uecc_word_t *vli,\n                                       wordcount_t num_words) {\n  wordcount_t i;\n  for (i = 0; i < num_words; ++i) {\n    vli[i] = 0;\n  }\n}\n#endif /* !asm_clear */\n\n/* Constant-time comparison to zero - secure way to compare long integers */\n/* Returns 1 if vli == 0, 0 otherwise. */\nMG_UECC_VLI_API mg_uecc_word_t mg_uecc_vli_isZero(const mg_uecc_word_t *vli,\n                                                  wordcount_t num_words) {\n  mg_uecc_word_t bits = 0;\n  wordcount_t i;\n  for (i = 0; i < num_words; ++i) {\n    bits |= vli[i];\n  }\n  return (bits == 0);\n}\n\n/* Returns nonzero if bit 'bit' of vli is set. */\nMG_UECC_VLI_API mg_uecc_word_t mg_uecc_vli_testBit(const mg_uecc_word_t *vli,\n                                                   bitcount_t bit) {\n  return (vli[bit >> MG_UECC_WORD_BITS_SHIFT] &\n          ((mg_uecc_word_t) 1 << (bit & MG_UECC_WORD_BITS_MASK)));\n}\n\n/* Counts the number of words in vli. */\nstatic wordcount_t vli_numDigits(const mg_uecc_word_t *vli,\n                                 const wordcount_t max_words) {\n  wordcount_t i;\n  /* Search from the end until we find a non-zero digit.\n     We do it in reverse because we expect that most digits will be nonzero. */\n  for (i = max_words - 1; i >= 0 && vli[i] == 0; --i) {\n  }\n\n  return (i + 1);\n}\n\n/* Counts the number of bits required to represent vli. */\nMG_UECC_VLI_API bitcount_t mg_uecc_vli_numBits(const mg_uecc_word_t *vli,\n                                               const wordcount_t max_words) {\n  mg_uecc_word_t i;\n  mg_uecc_word_t digit;\n\n  wordcount_t num_digits = vli_numDigits(vli, max_words);\n  if (num_digits == 0) {\n    return 0;\n  }\n\n  digit = vli[num_digits - 1];\n  for (i = 0; digit; ++i) {\n    digit >>= 1;\n  }\n\n  return (((bitcount_t) ((num_digits - 1) << MG_UECC_WORD_BITS_SHIFT)) +\n          (bitcount_t) i);\n}\n\n/* Sets dest = src. */\n#if !asm_set\nMG_UECC_VLI_API void mg_uecc_vli_set(mg_uecc_word_t *dest,\n                                     const mg_uecc_word_t *src,\n                                     wordcount_t num_words) {\n  wordcount_t i;\n  for (i = 0; i < num_words; ++i) {\n    dest[i] = src[i];\n  }\n}\n#endif /* !asm_set */\n\n/* Returns sign of left - right. */\nstatic cmpresult_t mg_uecc_vli_cmp_unsafe(const mg_uecc_word_t *left,\n                                          const mg_uecc_word_t *right,\n                                          wordcount_t num_words) {\n  wordcount_t i;\n  for (i = num_words - 1; i >= 0; --i) {\n    if (left[i] > right[i]) {\n      return 1;\n    } else if (left[i] < right[i]) {\n      return -1;\n    }\n  }\n  return 0;\n}\n\n/* Constant-time comparison function - secure way to compare long integers */\n/* Returns one if left == right, zero otherwise. */\nMG_UECC_VLI_API mg_uecc_word_t mg_uecc_vli_equal(const mg_uecc_word_t *left,\n                                                 const mg_uecc_word_t *right,\n                                                 wordcount_t num_words) {\n  mg_uecc_word_t diff = 0;\n  wordcount_t i;\n  for (i = num_words - 1; i >= 0; --i) {\n    diff |= (left[i] ^ right[i]);\n  }\n  return (diff == 0);\n}\n\nMG_UECC_VLI_API mg_uecc_word_t mg_uecc_vli_sub(mg_uecc_word_t *result,\n                                               const mg_uecc_word_t *left,\n                                               const mg_uecc_word_t *right,\n                                               wordcount_t num_words);\n\n/* Returns sign of left - right, in constant time. */\nMG_UECC_VLI_API cmpresult_t mg_uecc_vli_cmp(const mg_uecc_word_t *left,\n                                            const mg_uecc_word_t *right,\n                                            wordcount_t num_words) {\n  mg_uecc_word_t tmp[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t neg = !!mg_uecc_vli_sub(tmp, left, right, num_words);\n  mg_uecc_word_t equal = mg_uecc_vli_isZero(tmp, num_words);\n  return (cmpresult_t) (!equal - 2 * neg);\n}\n\n/* Computes vli = vli >> 1. */\n#if !asm_rshift1\nMG_UECC_VLI_API void mg_uecc_vli_rshift1(mg_uecc_word_t *vli,\n                                         wordcount_t num_words) {\n  mg_uecc_word_t *end = vli;\n  mg_uecc_word_t carry = 0;\n\n  vli += num_words;\n  while (vli-- > end) {\n    mg_uecc_word_t temp = *vli;\n    *vli = (temp >> 1) | carry;\n    carry = temp << (MG_UECC_WORD_BITS - 1);\n  }\n}\n#endif /* !asm_rshift1 */\n\n/* Computes result = left + right, returning carry. Can modify in place. */\n#if !asm_add\nMG_UECC_VLI_API mg_uecc_word_t mg_uecc_vli_add(mg_uecc_word_t *result,\n                                               const mg_uecc_word_t *left,\n                                               const mg_uecc_word_t *right,\n                                               wordcount_t num_words) {\n  mg_uecc_word_t carry = 0;\n  wordcount_t i;\n  for (i = 0; i < num_words; ++i) {\n    mg_uecc_word_t sum = left[i] + right[i] + carry;\n    if (sum != left[i]) {\n      carry = (sum < left[i]);\n    }\n    result[i] = sum;\n  }\n  return carry;\n}\n#endif /* !asm_add */\n\n/* Computes result = left - right, returning borrow. Can modify in place. */\n#if !asm_sub\nMG_UECC_VLI_API mg_uecc_word_t mg_uecc_vli_sub(mg_uecc_word_t *result,\n                                               const mg_uecc_word_t *left,\n                                               const mg_uecc_word_t *right,\n                                               wordcount_t num_words) {\n  mg_uecc_word_t borrow = 0;\n  wordcount_t i;\n  for (i = 0; i < num_words; ++i) {\n    mg_uecc_word_t diff = left[i] - right[i] - borrow;\n    if (diff != left[i]) {\n      borrow = (diff > left[i]);\n    }\n    result[i] = diff;\n  }\n  return borrow;\n}\n#endif /* !asm_sub */\n\n#if !asm_mult || (MG_UECC_SQUARE_FUNC && !asm_square) ||               \\\n    (MG_UECC_SUPPORTS_secp256k1 && (MG_UECC_OPTIMIZATION_LEVEL > 0) && \\\n     ((MG_UECC_WORD_SIZE == 1) || (MG_UECC_WORD_SIZE == 8)))\nstatic void muladd(mg_uecc_word_t a, mg_uecc_word_t b, mg_uecc_word_t *r0,\n                   mg_uecc_word_t *r1, mg_uecc_word_t *r2) {\n#if MG_UECC_WORD_SIZE == 8\n  uint64_t a0 = a & 0xffffffff;\n  uint64_t a1 = a >> 32;\n  uint64_t b0 = b & 0xffffffff;\n  uint64_t b1 = b >> 32;\n\n  uint64_t i0 = a0 * b0;\n  uint64_t i1 = a0 * b1;\n  uint64_t i2 = a1 * b0;\n  uint64_t i3 = a1 * b1;\n\n  uint64_t p0, p1;\n\n  i2 += (i0 >> 32);\n  i2 += i1;\n  if (i2 < i1) { /* overflow */\n    i3 += 0x100000000;\n  }\n\n  p0 = (i0 & 0xffffffff) | (i2 << 32);\n  p1 = i3 + (i2 >> 32);\n\n  *r0 += p0;\n  *r1 += (p1 + (*r0 < p0));\n  *r2 += ((*r1 < p1) || (*r1 == p1 && *r0 < p0));\n#else\n  mg_uecc_dword_t p = (mg_uecc_dword_t) a * b;\n  mg_uecc_dword_t r01 = ((mg_uecc_dword_t) (*r1) << MG_UECC_WORD_BITS) | *r0;\n  r01 += p;\n  *r2 += (r01 < p);\n  *r1 = (mg_uecc_word_t) (r01 >> MG_UECC_WORD_BITS);\n  *r0 = (mg_uecc_word_t) r01;\n#endif\n}\n#endif /* muladd needed */\n\n#if !asm_mult\nMG_UECC_VLI_API void mg_uecc_vli_mult(mg_uecc_word_t *result,\n                                      const mg_uecc_word_t *left,\n                                      const mg_uecc_word_t *right,\n                                      wordcount_t num_words) {\n  mg_uecc_word_t r0 = 0;\n  mg_uecc_word_t r1 = 0;\n  mg_uecc_word_t r2 = 0;\n  wordcount_t i, k;\n\n  /* Compute each digit of result in sequence, maintaining the carries. */\n  for (k = 0; k < num_words; ++k) {\n    for (i = 0; i <= k; ++i) {\n      muladd(left[i], right[k - i], &r0, &r1, &r2);\n    }\n    result[k] = r0;\n    r0 = r1;\n    r1 = r2;\n    r2 = 0;\n  }\n  for (k = num_words; k < num_words * 2 - 1; ++k) {\n    for (i = (wordcount_t) ((k + 1) - num_words); i < num_words; ++i) {\n      muladd(left[i], right[k - i], &r0, &r1, &r2);\n    }\n    result[k] = r0;\n    r0 = r1;\n    r1 = r2;\n    r2 = 0;\n  }\n  result[num_words * 2 - 1] = r0;\n}\n#endif /* !asm_mult */\n\n#if MG_UECC_SQUARE_FUNC\n\n#if !asm_square\nstatic void mul2add(mg_uecc_word_t a, mg_uecc_word_t b, mg_uecc_word_t *r0,\n                    mg_uecc_word_t *r1, mg_uecc_word_t *r2) {\n#if MG_UECC_WORD_SIZE == 8\n  uint64_t a0 = a & 0xffffffffull;\n  uint64_t a1 = a >> 32;\n  uint64_t b0 = b & 0xffffffffull;\n  uint64_t b1 = b >> 32;\n\n  uint64_t i0 = a0 * b0;\n  uint64_t i1 = a0 * b1;\n  uint64_t i2 = a1 * b0;\n  uint64_t i3 = a1 * b1;\n\n  uint64_t p0, p1;\n\n  i2 += (i0 >> 32);\n  i2 += i1;\n  if (i2 < i1) { /* overflow */\n    i3 += 0x100000000ull;\n  }\n\n  p0 = (i0 & 0xffffffffull) | (i2 << 32);\n  p1 = i3 + (i2 >> 32);\n\n  *r2 += (p1 >> 63);\n  p1 = (p1 << 1) | (p0 >> 63);\n  p0 <<= 1;\n\n  *r0 += p0;\n  *r1 += (p1 + (*r0 < p0));\n  *r2 += ((*r1 < p1) || (*r1 == p1 && *r0 < p0));\n#else\n  mg_uecc_dword_t p = (mg_uecc_dword_t) a * b;\n  mg_uecc_dword_t r01 = ((mg_uecc_dword_t) (*r1) << MG_UECC_WORD_BITS) | *r0;\n  *r2 += (p >> (MG_UECC_WORD_BITS * 2 - 1));\n  p *= 2;\n  r01 += p;\n  *r2 += (r01 < p);\n  *r1 = r01 >> MG_UECC_WORD_BITS;\n  *r0 = (mg_uecc_word_t) r01;\n#endif\n}\n\nMG_UECC_VLI_API void mg_uecc_vli_square(mg_uecc_word_t *result,\n                                        const mg_uecc_word_t *left,\n                                        wordcount_t num_words) {\n  mg_uecc_word_t r0 = 0;\n  mg_uecc_word_t r1 = 0;\n  mg_uecc_word_t r2 = 0;\n\n  wordcount_t i, k;\n\n  for (k = 0; k < num_words * 2 - 1; ++k) {\n    mg_uecc_word_t min = (k < num_words ? 0 : (k + 1) - num_words);\n    for (i = min; i <= k && i <= k - i; ++i) {\n      if (i < k - i) {\n        mul2add(left[i], left[k - i], &r0, &r1, &r2);\n      } else {\n        muladd(left[i], left[k - i], &r0, &r1, &r2);\n      }\n    }\n    result[k] = r0;\n    r0 = r1;\n    r1 = r2;\n    r2 = 0;\n  }\n\n  result[num_words * 2 - 1] = r0;\n}\n#endif /* !asm_square */\n\n#else /* MG_UECC_SQUARE_FUNC */\n\n#if MG_UECC_ENABLE_VLI_API\nMG_UECC_VLI_API void mg_uecc_vli_square(mg_uecc_word_t *result,\n                                        const mg_uecc_word_t *left,\n                                        wordcount_t num_words) {\n  mg_uecc_vli_mult(result, left, left, num_words);\n}\n#endif /* MG_UECC_ENABLE_VLI_API */\n\n#endif /* MG_UECC_SQUARE_FUNC */\n\n/* Computes result = (left + right) % mod.\n   Assumes that left < mod and right < mod, and that result does not overlap\n   mod. */\nMG_UECC_VLI_API void mg_uecc_vli_modAdd(mg_uecc_word_t *result,\n                                        const mg_uecc_word_t *left,\n                                        const mg_uecc_word_t *right,\n                                        const mg_uecc_word_t *mod,\n                                        wordcount_t num_words) {\n  mg_uecc_word_t carry = mg_uecc_vli_add(result, left, right, num_words);\n  if (carry || mg_uecc_vli_cmp_unsafe(mod, result, num_words) != 1) {\n    /* result > mod (result = mod + remainder), so subtract mod to get\n     * remainder. */\n    mg_uecc_vli_sub(result, result, mod, num_words);\n  }\n}\n\n/* Computes result = (left - right) % mod.\n   Assumes that left < mod and right < mod, and that result does not overlap\n   mod. */\nMG_UECC_VLI_API void mg_uecc_vli_modSub(mg_uecc_word_t *result,\n                                        const mg_uecc_word_t *left,\n                                        const mg_uecc_word_t *right,\n                                        const mg_uecc_word_t *mod,\n                                        wordcount_t num_words) {\n  mg_uecc_word_t l_borrow = mg_uecc_vli_sub(result, left, right, num_words);\n  if (l_borrow) {\n    /* In this case, result == -diff == (max int) - diff. Since -x % d == d - x,\n       we can get the correct result from result + mod (with overflow). */\n    mg_uecc_vli_add(result, result, mod, num_words);\n  }\n}\n\n/* Computes result = product % mod, where product is 2N words long. */\n/* Currently only designed to work for curve_p or curve_n. */\nMG_UECC_VLI_API void mg_uecc_vli_mmod(mg_uecc_word_t *result,\n                                      mg_uecc_word_t *product,\n                                      const mg_uecc_word_t *mod,\n                                      wordcount_t num_words) {\n  mg_uecc_word_t mod_multiple[2 * MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tmp[2 * MG_UECC_MAX_WORDS];\n  mg_uecc_word_t *v[2] = {tmp, product};\n  mg_uecc_word_t index;\n\n  /* Shift mod so its highest set bit is at the maximum position. */\n  bitcount_t shift = (bitcount_t) ((num_words * 2 * MG_UECC_WORD_BITS) -\n                                   mg_uecc_vli_numBits(mod, num_words));\n  wordcount_t word_shift = (wordcount_t) (shift / MG_UECC_WORD_BITS);\n  wordcount_t bit_shift = (wordcount_t) (shift % MG_UECC_WORD_BITS);\n  mg_uecc_word_t carry = 0;\n  mg_uecc_vli_clear(mod_multiple, word_shift);\n  if (bit_shift > 0) {\n    for (index = 0; index < (mg_uecc_word_t) num_words; ++index) {\n      mod_multiple[(mg_uecc_word_t) word_shift + index] =\n          (mg_uecc_word_t) (mod[index] << bit_shift) | carry;\n      carry = mod[index] >> (MG_UECC_WORD_BITS - bit_shift);\n    }\n  } else {\n    mg_uecc_vli_set(mod_multiple + word_shift, mod, num_words);\n  }\n\n  for (index = 1; shift >= 0; --shift) {\n    mg_uecc_word_t borrow = 0;\n    wordcount_t i;\n    for (i = 0; i < num_words * 2; ++i) {\n      mg_uecc_word_t diff = v[index][i] - mod_multiple[i] - borrow;\n      if (diff != v[index][i]) {\n        borrow = (diff > v[index][i]);\n      }\n      v[1 - index][i] = diff;\n    }\n    index = !(index ^ borrow); /* Swap the index if there was no borrow */\n    mg_uecc_vli_rshift1(mod_multiple, num_words);\n    mod_multiple[num_words - 1] |= mod_multiple[num_words]\n                                   << (MG_UECC_WORD_BITS - 1);\n    mg_uecc_vli_rshift1(mod_multiple + num_words, num_words);\n  }\n  mg_uecc_vli_set(result, v[index], num_words);\n}\n\n/* Computes result = (left * right) % mod. */\nMG_UECC_VLI_API void mg_uecc_vli_modMult(mg_uecc_word_t *result,\n                                         const mg_uecc_word_t *left,\n                                         const mg_uecc_word_t *right,\n                                         const mg_uecc_word_t *mod,\n                                         wordcount_t num_words) {\n  mg_uecc_word_t product[2 * MG_UECC_MAX_WORDS];\n  mg_uecc_vli_mult(product, left, right, num_words);\n  mg_uecc_vli_mmod(result, product, mod, num_words);\n}\n\nMG_UECC_VLI_API void mg_uecc_vli_modMult_fast(mg_uecc_word_t *result,\n                                              const mg_uecc_word_t *left,\n                                              const mg_uecc_word_t *right,\n                                              MG_UECC_Curve curve) {\n  mg_uecc_word_t product[2 * MG_UECC_MAX_WORDS];\n  mg_uecc_vli_mult(product, left, right, curve->num_words);\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n  curve->mmod_fast(result, product);\n#else\n  mg_uecc_vli_mmod(result, product, curve->p, curve->num_words);\n#endif\n}\n\n#if MG_UECC_SQUARE_FUNC\n\n#if MG_UECC_ENABLE_VLI_API\n/* Computes result = left^2 % mod. */\nMG_UECC_VLI_API void mg_uecc_vli_modSquare(mg_uecc_word_t *result,\n                                           const mg_uecc_word_t *left,\n                                           const mg_uecc_word_t *mod,\n                                           wordcount_t num_words) {\n  mg_uecc_word_t product[2 * MG_UECC_MAX_WORDS];\n  mg_uecc_vli_square(product, left, num_words);\n  mg_uecc_vli_mmod(result, product, mod, num_words);\n}\n#endif /* MG_UECC_ENABLE_VLI_API */\n\nMG_UECC_VLI_API void mg_uecc_vli_modSquare_fast(mg_uecc_word_t *result,\n                                                const mg_uecc_word_t *left,\n                                                MG_UECC_Curve curve) {\n  mg_uecc_word_t product[2 * MG_UECC_MAX_WORDS];\n  mg_uecc_vli_square(product, left, curve->num_words);\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n  curve->mmod_fast(result, product);\n#else\n  mg_uecc_vli_mmod(result, product, curve->p, curve->num_words);\n#endif\n}\n\n#else /* MG_UECC_SQUARE_FUNC */\n\n#if MG_UECC_ENABLE_VLI_API\nMG_UECC_VLI_API void mg_uecc_vli_modSquare(mg_uecc_word_t *result,\n                                           const mg_uecc_word_t *left,\n                                           const mg_uecc_word_t *mod,\n                                           wordcount_t num_words) {\n  mg_uecc_vli_modMult(result, left, left, mod, num_words);\n}\n#endif /* MG_UECC_ENABLE_VLI_API */\n\nMG_UECC_VLI_API void mg_uecc_vli_modSquare_fast(mg_uecc_word_t *result,\n                                                const mg_uecc_word_t *left,\n                                                MG_UECC_Curve curve) {\n  mg_uecc_vli_modMult_fast(result, left, left, curve);\n}\n\n#endif /* MG_UECC_SQUARE_FUNC */\n\n#define EVEN(vli) (!(vli[0] & 1))\nstatic void vli_modInv_update(mg_uecc_word_t *uv, const mg_uecc_word_t *mod,\n                              wordcount_t num_words) {\n  mg_uecc_word_t carry = 0;\n  if (!EVEN(uv)) {\n    carry = mg_uecc_vli_add(uv, uv, mod, num_words);\n  }\n  mg_uecc_vli_rshift1(uv, num_words);\n  if (carry) {\n    uv[num_words - 1] |= HIGH_BIT_SET;\n  }\n}\n\n/* Computes result = (1 / input) % mod. All VLIs are the same size.\n   See \"From Euclid's GCD to Montgomery Multiplication to the Great Divide\" */\nMG_UECC_VLI_API void mg_uecc_vli_modInv(mg_uecc_word_t *result,\n                                        const mg_uecc_word_t *input,\n                                        const mg_uecc_word_t *mod,\n                                        wordcount_t num_words) {\n  mg_uecc_word_t a[MG_UECC_MAX_WORDS], b[MG_UECC_MAX_WORDS],\n      u[MG_UECC_MAX_WORDS], v[MG_UECC_MAX_WORDS];\n  cmpresult_t cmpResult;\n\n  if (mg_uecc_vli_isZero(input, num_words)) {\n    mg_uecc_vli_clear(result, num_words);\n    return;\n  }\n\n  mg_uecc_vli_set(a, input, num_words);\n  mg_uecc_vli_set(b, mod, num_words);\n  mg_uecc_vli_clear(u, num_words);\n  u[0] = 1;\n  mg_uecc_vli_clear(v, num_words);\n  while ((cmpResult = mg_uecc_vli_cmp_unsafe(a, b, num_words)) != 0) {\n    if (EVEN(a)) {\n      mg_uecc_vli_rshift1(a, num_words);\n      vli_modInv_update(u, mod, num_words);\n    } else if (EVEN(b)) {\n      mg_uecc_vli_rshift1(b, num_words);\n      vli_modInv_update(v, mod, num_words);\n    } else if (cmpResult > 0) {\n      mg_uecc_vli_sub(a, a, b, num_words);\n      mg_uecc_vli_rshift1(a, num_words);\n      if (mg_uecc_vli_cmp_unsafe(u, v, num_words) < 0) {\n        mg_uecc_vli_add(u, u, mod, num_words);\n      }\n      mg_uecc_vli_sub(u, u, v, num_words);\n      vli_modInv_update(u, mod, num_words);\n    } else {\n      mg_uecc_vli_sub(b, b, a, num_words);\n      mg_uecc_vli_rshift1(b, num_words);\n      if (mg_uecc_vli_cmp_unsafe(v, u, num_words) < 0) {\n        mg_uecc_vli_add(v, v, mod, num_words);\n      }\n      mg_uecc_vli_sub(v, v, u, num_words);\n      vli_modInv_update(v, mod, num_words);\n    }\n  }\n  mg_uecc_vli_set(result, u, num_words);\n}\n\n/* ------ Point operations ------ */\n\n/* Copyright 2015, Kenneth MacKay. Licensed under the BSD 2-clause license. */\n\n#ifndef _UECC_CURVE_SPECIFIC_H_\n#define _UECC_CURVE_SPECIFIC_H_\n\n#define num_bytes_secp160r1 20\n#define num_bytes_secp192r1 24\n#define num_bytes_secp224r1 28\n#define num_bytes_secp256r1 32\n#define num_bytes_secp256k1 32\n\n#if (MG_UECC_WORD_SIZE == 1)\n\n#define num_words_secp160r1 20\n#define num_words_secp192r1 24\n#define num_words_secp224r1 28\n#define num_words_secp256r1 32\n#define num_words_secp256k1 32\n\n#define BYTES_TO_WORDS_8(a, b, c, d, e, f, g, h) \\\n  0x##a, 0x##b, 0x##c, 0x##d, 0x##e, 0x##f, 0x##g, 0x##h\n#define BYTES_TO_WORDS_4(a, b, c, d) 0x##a, 0x##b, 0x##c, 0x##d\n\n#elif (MG_UECC_WORD_SIZE == 4)\n\n#define num_words_secp160r1 5\n#define num_words_secp192r1 6\n#define num_words_secp224r1 7\n#define num_words_secp256r1 8\n#define num_words_secp256k1 8\n\n#define BYTES_TO_WORDS_8(a, b, c, d, e, f, g, h) 0x##d##c##b##a, 0x##h##g##f##e\n#define BYTES_TO_WORDS_4(a, b, c, d) 0x##d##c##b##a\n\n#elif (MG_UECC_WORD_SIZE == 8)\n\n#define num_words_secp160r1 3\n#define num_words_secp192r1 3\n#define num_words_secp224r1 4\n#define num_words_secp256r1 4\n#define num_words_secp256k1 4\n\n#define BYTES_TO_WORDS_8(a, b, c, d, e, f, g, h) 0x##h##g##f##e##d##c##b##a##U\n#define BYTES_TO_WORDS_4(a, b, c, d) 0x##d##c##b##a##U\n\n#endif /* MG_UECC_WORD_SIZE */\n\n#if MG_UECC_SUPPORTS_secp160r1 || MG_UECC_SUPPORTS_secp192r1 || \\\n    MG_UECC_SUPPORTS_secp224r1 || MG_UECC_SUPPORTS_secp256r1\nstatic void double_jacobian_default(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                                    mg_uecc_word_t *Z1, MG_UECC_Curve curve) {\n  /* t1 = X, t2 = Y, t3 = Z */\n  mg_uecc_word_t t4[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t t5[MG_UECC_MAX_WORDS];\n  wordcount_t num_words = curve->num_words;\n\n  if (mg_uecc_vli_isZero(Z1, num_words)) {\n    return;\n  }\n\n  mg_uecc_vli_modSquare_fast(t4, Y1, curve);   /* t4 = y1^2 */\n  mg_uecc_vli_modMult_fast(t5, X1, t4, curve); /* t5 = x1*y1^2 = A */\n  mg_uecc_vli_modSquare_fast(t4, t4, curve);   /* t4 = y1^4 */\n  mg_uecc_vli_modMult_fast(Y1, Y1, Z1, curve); /* t2 = y1*z1 = z3 */\n  mg_uecc_vli_modSquare_fast(Z1, Z1, curve);   /* t3 = z1^2 */\n\n  mg_uecc_vli_modAdd(X1, X1, Z1, curve->p, num_words); /* t1 = x1 + z1^2 */\n  mg_uecc_vli_modAdd(Z1, Z1, Z1, curve->p, num_words); /* t3 = 2*z1^2 */\n  mg_uecc_vli_modSub(Z1, X1, Z1, curve->p, num_words); /* t3 = x1 - z1^2 */\n  mg_uecc_vli_modMult_fast(X1, X1, Z1, curve);         /* t1 = x1^2 - z1^4 */\n\n  mg_uecc_vli_modAdd(Z1, X1, X1, curve->p,\n                     num_words); /* t3 = 2*(x1^2 - z1^4) */\n  mg_uecc_vli_modAdd(X1, X1, Z1, curve->p,\n                     num_words); /* t1 = 3*(x1^2 - z1^4) */\n  if (mg_uecc_vli_testBit(X1, 0)) {\n    mg_uecc_word_t l_carry = mg_uecc_vli_add(X1, X1, curve->p, num_words);\n    mg_uecc_vli_rshift1(X1, num_words);\n    X1[num_words - 1] |= l_carry << (MG_UECC_WORD_BITS - 1);\n  } else {\n    mg_uecc_vli_rshift1(X1, num_words);\n  }\n  /* t1 = 3/2*(x1^2 - z1^4) = B */\n\n  mg_uecc_vli_modSquare_fast(Z1, X1, curve);           /* t3 = B^2 */\n  mg_uecc_vli_modSub(Z1, Z1, t5, curve->p, num_words); /* t3 = B^2 - A */\n  mg_uecc_vli_modSub(Z1, Z1, t5, curve->p, num_words); /* t3 = B^2 - 2A = x3 */\n  mg_uecc_vli_modSub(t5, t5, Z1, curve->p, num_words); /* t5 = A - x3 */\n  mg_uecc_vli_modMult_fast(X1, X1, t5, curve);         /* t1 = B * (A - x3) */\n  mg_uecc_vli_modSub(t4, X1, t4, curve->p,\n                     num_words); /* t4 = B * (A - x3) - y1^4 = y3 */\n\n  mg_uecc_vli_set(X1, Z1, num_words);\n  mg_uecc_vli_set(Z1, Y1, num_words);\n  mg_uecc_vli_set(Y1, t4, num_words);\n}\n\n/* Computes result = x^3 + ax + b. result must not overlap x. */\nstatic void x_side_default(mg_uecc_word_t *result, const mg_uecc_word_t *x,\n                           MG_UECC_Curve curve) {\n  mg_uecc_word_t _3[MG_UECC_MAX_WORDS] = {3}; /* -a = 3 */\n  wordcount_t num_words = curve->num_words;\n\n  mg_uecc_vli_modSquare_fast(result, x, curve);                /* r = x^2 */\n  mg_uecc_vli_modSub(result, result, _3, curve->p, num_words); /* r = x^2 - 3 */\n  mg_uecc_vli_modMult_fast(result, result, x, curve); /* r = x^3 - 3x */\n  mg_uecc_vli_modAdd(result, result, curve->b, curve->p,\n                     num_words); /* r = x^3 - 3x + b */\n}\n#endif /* MG_UECC_SUPPORTS_secp... */\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n#if MG_UECC_SUPPORTS_secp160r1 || MG_UECC_SUPPORTS_secp192r1 || \\\n    MG_UECC_SUPPORTS_secp256r1 || MG_UECC_SUPPORTS_secp256k1\n/* Compute a = sqrt(a) (mod curve_p). */\nstatic void mod_sqrt_default(mg_uecc_word_t *a, MG_UECC_Curve curve) {\n  bitcount_t i;\n  mg_uecc_word_t p1[MG_UECC_MAX_WORDS] = {1};\n  mg_uecc_word_t l_result[MG_UECC_MAX_WORDS] = {1};\n  wordcount_t num_words = curve->num_words;\n\n  /* When curve->p == 3 (mod 4), we can compute\n     sqrt(a) = a^((curve->p + 1) / 4) (mod curve->p). */\n  mg_uecc_vli_add(p1, curve->p, p1, num_words); /* p1 = curve_p + 1 */\n  for (i = mg_uecc_vli_numBits(p1, num_words) - 1; i > 1; --i) {\n    mg_uecc_vli_modSquare_fast(l_result, l_result, curve);\n    if (mg_uecc_vli_testBit(p1, i)) {\n      mg_uecc_vli_modMult_fast(l_result, l_result, a, curve);\n    }\n  }\n  mg_uecc_vli_set(a, l_result, num_words);\n}\n#endif /* MG_UECC_SUPPORTS_secp... */\n#endif /* MG_UECC_SUPPORT_COMPRESSED_POINT */\n\n#if MG_UECC_SUPPORTS_secp160r1\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\nstatic void vli_mmod_fast_secp160r1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product);\n#endif\n\nstatic const struct MG_UECC_Curve_t curve_secp160r1 = {\n    num_words_secp160r1,\n    num_bytes_secp160r1,\n    161, /* num_n_bits */\n    {BYTES_TO_WORDS_8(FF, FF, FF, 7F, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_4(FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(57, 22, 75, CA, D3, AE, 27, F9),\n     BYTES_TO_WORDS_8(C8, F4, 01, 00, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, 01, 00, 00, 00)},\n    {BYTES_TO_WORDS_8(82, FC, CB, 13, B9, 8B, C3, 68),\n     BYTES_TO_WORDS_8(89, 69, 64, 46, 28, 73, F5, 8E),\n     BYTES_TO_WORDS_4(68, B5, 96, 4A),\n\n     BYTES_TO_WORDS_8(32, FB, C5, 7A, 37, 51, 23, 04),\n     BYTES_TO_WORDS_8(12, C9, DC, 59, 7D, 94, 68, 31),\n     BYTES_TO_WORDS_4(55, 28, A6, 23)},\n    {BYTES_TO_WORDS_8(45, FA, 65, C5, AD, D4, D4, 81),\n     BYTES_TO_WORDS_8(9F, F8, AC, 65, 8B, 7A, BD, 54),\n     BYTES_TO_WORDS_4(FC, BE, 97, 1C)},\n    &double_jacobian_default,\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n    &mod_sqrt_default,\n#endif\n    &x_side_default,\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n    &vli_mmod_fast_secp160r1\n#endif\n};\n\nMG_UECC_Curve mg_uecc_secp160r1(void) {\n  return &curve_secp160r1;\n}\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0 && !asm_mmod_fast_secp160r1)\n/* Computes result = product % curve_p\n    see http://www.isys.uni-klu.ac.at/PDF/2001-0126-MT.pdf page 354\n\n    Note that this only works if log2(omega) < log2(p) / 2 */\nstatic void omega_mult_secp160r1(mg_uecc_word_t *result,\n                                 const mg_uecc_word_t *right);\n#if MG_UECC_WORD_SIZE == 8\nstatic void vli_mmod_fast_secp160r1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product) {\n  mg_uecc_word_t tmp[2 * num_words_secp160r1];\n  mg_uecc_word_t copy;\n\n  mg_uecc_vli_clear(tmp, num_words_secp160r1);\n  mg_uecc_vli_clear(tmp + num_words_secp160r1, num_words_secp160r1);\n\n  omega_mult_secp160r1(tmp,\n                       product + num_words_secp160r1 - 1); /* (Rq, q) = q * c */\n\n  product[num_words_secp160r1 - 1] &= 0xffffffff;\n  copy = tmp[num_words_secp160r1 - 1];\n  tmp[num_words_secp160r1 - 1] &= 0xffffffff;\n  mg_uecc_vli_add(result, product, tmp,\n                  num_words_secp160r1); /* (C, r) = r + q */\n  mg_uecc_vli_clear(product, num_words_secp160r1);\n  tmp[num_words_secp160r1 - 1] = copy;\n  omega_mult_secp160r1(product, tmp + num_words_secp160r1 - 1); /* Rq*c */\n  mg_uecc_vli_add(result, result, product,\n                  num_words_secp160r1); /* (C1, r) = r + Rq*c */\n\n  while (mg_uecc_vli_cmp_unsafe(result, curve_secp160r1.p,\n                                num_words_secp160r1) > 0) {\n    mg_uecc_vli_sub(result, result, curve_secp160r1.p, num_words_secp160r1);\n  }\n}\n\nstatic void omega_mult_secp160r1(uint64_t *result, const uint64_t *right) {\n  uint32_t carry;\n  unsigned i;\n\n  /* Multiply by (2^31 + 1). */\n  carry = 0;\n  for (i = 0; i < num_words_secp160r1; ++i) {\n    uint64_t tmp = (right[i] >> 32) | (right[i + 1] << 32);\n    result[i] = (tmp << 31) + tmp + carry;\n    carry = (tmp >> 33) + (result[i] < tmp || (carry && result[i] == tmp));\n  }\n  result[i] = carry;\n}\n#else\nstatic void vli_mmod_fast_secp160r1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product) {\n  mg_uecc_word_t tmp[2 * num_words_secp160r1];\n  mg_uecc_word_t carry;\n\n  mg_uecc_vli_clear(tmp, num_words_secp160r1);\n  mg_uecc_vli_clear(tmp + num_words_secp160r1, num_words_secp160r1);\n\n  omega_mult_secp160r1(tmp,\n                       product + num_words_secp160r1); /* (Rq, q) = q * c */\n\n  carry = mg_uecc_vli_add(result, product, tmp,\n                          num_words_secp160r1); /* (C, r) = r + q */\n  mg_uecc_vli_clear(product, num_words_secp160r1);\n  omega_mult_secp160r1(product, tmp + num_words_secp160r1); /* Rq*c */\n  carry += mg_uecc_vli_add(result, result, product,\n                           num_words_secp160r1); /* (C1, r) = r + Rq*c */\n\n  while (carry > 0) {\n    --carry;\n    mg_uecc_vli_sub(result, result, curve_secp160r1.p, num_words_secp160r1);\n  }\n  if (mg_uecc_vli_cmp_unsafe(result, curve_secp160r1.p, num_words_secp160r1) >\n      0) {\n    mg_uecc_vli_sub(result, result, curve_secp160r1.p, num_words_secp160r1);\n  }\n}\n#endif\n\n#if MG_UECC_WORD_SIZE == 1\nstatic void omega_mult_secp160r1(uint8_t *result, const uint8_t *right) {\n  uint8_t carry;\n  uint8_t i;\n\n  /* Multiply by (2^31 + 1). */\n  mg_uecc_vli_set(result + 4, right, num_words_secp160r1); /* 2^32 */\n  mg_uecc_vli_rshift1(result + 4, num_words_secp160r1);    /* 2^31 */\n  result[3] = right[0] << 7; /* get last bit from shift */\n\n  carry = mg_uecc_vli_add(result, result, right,\n                          num_words_secp160r1); /* 2^31 + 1 */\n  for (i = num_words_secp160r1; carry; ++i) {\n    uint16_t sum = (uint16_t) result[i] + carry;\n    result[i] = (uint8_t) sum;\n    carry = sum >> 8;\n  }\n}\n#elif MG_UECC_WORD_SIZE == 4\nstatic void omega_mult_secp160r1(uint32_t *result, const uint32_t *right) {\n  uint32_t carry;\n  unsigned i;\n\n  /* Multiply by (2^31 + 1). */\n  mg_uecc_vli_set(result + 1, right, num_words_secp160r1); /* 2^32 */\n  mg_uecc_vli_rshift1(result + 1, num_words_secp160r1);    /* 2^31 */\n  result[0] = right[0] << 31; /* get last bit from shift */\n\n  carry = mg_uecc_vli_add(result, result, right,\n                          num_words_secp160r1); /* 2^31 + 1 */\n  for (i = num_words_secp160r1; carry; ++i) {\n    uint64_t sum = (uint64_t) result[i] + carry;\n    result[i] = (uint32_t) sum;\n    carry = sum >> 32;\n  }\n}\n#endif /* MG_UECC_WORD_SIZE */\n#endif /* (MG_UECC_OPTIMIZATION_LEVEL > 0 && !asm_mmod_fast_secp160r1) */\n\n#endif /* MG_UECC_SUPPORTS_secp160r1 */\n\n#if MG_UECC_SUPPORTS_secp192r1\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\nstatic void vli_mmod_fast_secp192r1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product);\n#endif\n\nstatic const struct MG_UECC_Curve_t curve_secp192r1 = {\n    num_words_secp192r1,\n    num_bytes_secp192r1,\n    192, /* num_n_bits */\n    {BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FE, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(31, 28, D2, B4, B1, C9, 6B, 14),\n     BYTES_TO_WORDS_8(36, F8, DE, 99, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(12, 10, FF, 82, FD, 0A, FF, F4),\n     BYTES_TO_WORDS_8(00, 88, A1, 43, EB, 20, BF, 7C),\n     BYTES_TO_WORDS_8(F6, 90, 30, B0, 0E, A8, 8D, 18),\n\n     BYTES_TO_WORDS_8(11, 48, 79, 1E, A1, 77, F9, 73),\n     BYTES_TO_WORDS_8(D5, CD, 24, 6B, ED, 11, 10, 63),\n     BYTES_TO_WORDS_8(78, DA, C8, FF, 95, 2B, 19, 07)},\n    {BYTES_TO_WORDS_8(B1, B9, 46, C1, EC, DE, B8, FE),\n     BYTES_TO_WORDS_8(49, 30, 24, 72, AB, E9, A7, 0F),\n     BYTES_TO_WORDS_8(E7, 80, 9C, E5, 19, 05, 21, 64)},\n    &double_jacobian_default,\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n    &mod_sqrt_default,\n#endif\n    &x_side_default,\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n    &vli_mmod_fast_secp192r1\n#endif\n};\n\nMG_UECC_Curve mg_uecc_secp192r1(void) {\n  return &curve_secp192r1;\n}\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n/* Computes result = product % curve_p.\n   See algorithm 5 and 6 from http://www.isys.uni-klu.ac.at/PDF/2001-0126-MT.pdf\n */\n#if MG_UECC_WORD_SIZE == 1\nstatic void vli_mmod_fast_secp192r1(uint8_t *result, uint8_t *product) {\n  uint8_t tmp[num_words_secp192r1];\n  uint8_t carry;\n\n  mg_uecc_vli_set(result, product, num_words_secp192r1);\n\n  mg_uecc_vli_set(tmp, &product[24], num_words_secp192r1);\n  carry = mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  tmp[0] = tmp[1] = tmp[2] = tmp[3] = tmp[4] = tmp[5] = tmp[6] = tmp[7] = 0;\n  tmp[8] = product[24];\n  tmp[9] = product[25];\n  tmp[10] = product[26];\n  tmp[11] = product[27];\n  tmp[12] = product[28];\n  tmp[13] = product[29];\n  tmp[14] = product[30];\n  tmp[15] = product[31];\n  tmp[16] = product[32];\n  tmp[17] = product[33];\n  tmp[18] = product[34];\n  tmp[19] = product[35];\n  tmp[20] = product[36];\n  tmp[21] = product[37];\n  tmp[22] = product[38];\n  tmp[23] = product[39];\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  tmp[0] = tmp[8] = product[40];\n  tmp[1] = tmp[9] = product[41];\n  tmp[2] = tmp[10] = product[42];\n  tmp[3] = tmp[11] = product[43];\n  tmp[4] = tmp[12] = product[44];\n  tmp[5] = tmp[13] = product[45];\n  tmp[6] = tmp[14] = product[46];\n  tmp[7] = tmp[15] = product[47];\n  tmp[16] = tmp[17] = tmp[18] = tmp[19] = tmp[20] = tmp[21] = tmp[22] =\n      tmp[23] = 0;\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  while (carry || mg_uecc_vli_cmp_unsafe(curve_secp192r1.p, result,\n                                         num_words_secp192r1) != 1) {\n    carry -=\n        mg_uecc_vli_sub(result, result, curve_secp192r1.p, num_words_secp192r1);\n  }\n}\n#elif MG_UECC_WORD_SIZE == 4\nstatic void vli_mmod_fast_secp192r1(uint32_t *result, uint32_t *product) {\n  uint32_t tmp[num_words_secp192r1];\n  int carry;\n\n  mg_uecc_vli_set(result, product, num_words_secp192r1);\n\n  mg_uecc_vli_set(tmp, &product[6], num_words_secp192r1);\n  carry = mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  tmp[0] = tmp[1] = 0;\n  tmp[2] = product[6];\n  tmp[3] = product[7];\n  tmp[4] = product[8];\n  tmp[5] = product[9];\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  tmp[0] = tmp[2] = product[10];\n  tmp[1] = tmp[3] = product[11];\n  tmp[4] = tmp[5] = 0;\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  while (carry || mg_uecc_vli_cmp_unsafe(curve_secp192r1.p, result,\n                                         num_words_secp192r1) != 1) {\n    carry -=\n        mg_uecc_vli_sub(result, result, curve_secp192r1.p, num_words_secp192r1);\n  }\n}\n#else\nstatic void vli_mmod_fast_secp192r1(uint64_t *result, uint64_t *product) {\n  uint64_t tmp[num_words_secp192r1];\n  int carry;\n\n  mg_uecc_vli_set(result, product, num_words_secp192r1);\n\n  mg_uecc_vli_set(tmp, &product[3], num_words_secp192r1);\n  carry = (int) mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  tmp[0] = 0;\n  tmp[1] = product[3];\n  tmp[2] = product[4];\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  tmp[0] = tmp[1] = product[5];\n  tmp[2] = 0;\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  while (carry || mg_uecc_vli_cmp_unsafe(curve_secp192r1.p, result,\n                                         num_words_secp192r1) != 1) {\n    carry -=\n        mg_uecc_vli_sub(result, result, curve_secp192r1.p, num_words_secp192r1);\n  }\n}\n#endif /* MG_UECC_WORD_SIZE */\n#endif /* (MG_UECC_OPTIMIZATION_LEVEL > 0) */\n\n#endif /* MG_UECC_SUPPORTS_secp192r1 */\n\n#if MG_UECC_SUPPORTS_secp224r1\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\nstatic void mod_sqrt_secp224r1(mg_uecc_word_t *a, MG_UECC_Curve curve);\n#endif\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\nstatic void vli_mmod_fast_secp224r1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product);\n#endif\n\nstatic const struct MG_UECC_Curve_t curve_secp224r1 = {\n    num_words_secp224r1,\n    num_bytes_secp224r1,\n    224, /* num_n_bits */\n    {BYTES_TO_WORDS_8(01, 00, 00, 00, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_4(FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(3D, 2A, 5C, 5C, 45, 29, DD, 13),\n     BYTES_TO_WORDS_8(3E, F0, B8, E0, A2, 16, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_4(FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(21, 1D, 5C, 11, D6, 80, 32, 34),\n     BYTES_TO_WORDS_8(22, 11, C2, 56, D3, C1, 03, 4A),\n     BYTES_TO_WORDS_8(B9, 90, 13, 32, 7F, BF, B4, 6B),\n     BYTES_TO_WORDS_4(BD, 0C, 0E, B7),\n\n     BYTES_TO_WORDS_8(34, 7E, 00, 85, 99, 81, D5, 44),\n     BYTES_TO_WORDS_8(64, 47, 07, 5A, A0, 75, 43, CD),\n     BYTES_TO_WORDS_8(E6, DF, 22, 4C, FB, 23, F7, B5),\n     BYTES_TO_WORDS_4(88, 63, 37, BD)},\n    {BYTES_TO_WORDS_8(B4, FF, 55, 23, 43, 39, 0B, 27),\n     BYTES_TO_WORDS_8(BA, D8, BF, D7, B7, B0, 44, 50),\n     BYTES_TO_WORDS_8(56, 32, 41, F5, AB, B3, 04, 0C),\n     BYTES_TO_WORDS_4(85, 0A, 05, B4)},\n    &double_jacobian_default,\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n    &mod_sqrt_secp224r1,\n#endif\n    &x_side_default,\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n    &vli_mmod_fast_secp224r1\n#endif\n};\n\nMG_UECC_Curve mg_uecc_secp224r1(void) {\n  return &curve_secp224r1;\n}\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n/* Routine 3.2.4 RS;  from http://www.nsa.gov/ia/_files/nist-routines.pdf */\nstatic void mod_sqrt_secp224r1_rs(mg_uecc_word_t *d1, mg_uecc_word_t *e1,\n                                  mg_uecc_word_t *f1, const mg_uecc_word_t *d0,\n                                  const mg_uecc_word_t *e0,\n                                  const mg_uecc_word_t *f0) {\n  mg_uecc_word_t t[num_words_secp224r1];\n\n  mg_uecc_vli_modSquare_fast(t, d0, &curve_secp224r1);    /* t <-- d0 ^ 2 */\n  mg_uecc_vli_modMult_fast(e1, d0, e0, &curve_secp224r1); /* e1 <-- d0 * e0 */\n  mg_uecc_vli_modAdd(d1, t, f0, curve_secp224r1.p,\n                     num_words_secp224r1); /* d1 <-- t  + f0 */\n  mg_uecc_vli_modAdd(e1, e1, e1, curve_secp224r1.p,\n                     num_words_secp224r1);               /* e1 <-- e1 + e1 */\n  mg_uecc_vli_modMult_fast(f1, t, f0, &curve_secp224r1); /* f1 <-- t  * f0 */\n  mg_uecc_vli_modAdd(f1, f1, f1, curve_secp224r1.p,\n                     num_words_secp224r1); /* f1 <-- f1 + f1 */\n  mg_uecc_vli_modAdd(f1, f1, f1, curve_secp224r1.p,\n                     num_words_secp224r1); /* f1 <-- f1 + f1 */\n}\n\n/* Routine 3.2.5 RSS;  from http://www.nsa.gov/ia/_files/nist-routines.pdf */\nstatic void mod_sqrt_secp224r1_rss(mg_uecc_word_t *d1, mg_uecc_word_t *e1,\n                                   mg_uecc_word_t *f1, const mg_uecc_word_t *d0,\n                                   const mg_uecc_word_t *e0,\n                                   const mg_uecc_word_t *f0,\n                                   const bitcount_t j) {\n  bitcount_t i;\n\n  mg_uecc_vli_set(d1, d0, num_words_secp224r1); /* d1 <-- d0 */\n  mg_uecc_vli_set(e1, e0, num_words_secp224r1); /* e1 <-- e0 */\n  mg_uecc_vli_set(f1, f0, num_words_secp224r1); /* f1 <-- f0 */\n  for (i = 1; i <= j; i++) {\n    mod_sqrt_secp224r1_rs(d1, e1, f1, d1, e1, f1); /* RS (d1,e1,f1,d1,e1,f1) */\n  }\n}\n\n/* Routine 3.2.6 RM;  from http://www.nsa.gov/ia/_files/nist-routines.pdf */\nstatic void mod_sqrt_secp224r1_rm(mg_uecc_word_t *d2, mg_uecc_word_t *e2,\n                                  mg_uecc_word_t *f2, const mg_uecc_word_t *c,\n                                  const mg_uecc_word_t *d0,\n                                  const mg_uecc_word_t *e0,\n                                  const mg_uecc_word_t *d1,\n                                  const mg_uecc_word_t *e1) {\n  mg_uecc_word_t t1[num_words_secp224r1];\n  mg_uecc_word_t t2[num_words_secp224r1];\n\n  mg_uecc_vli_modMult_fast(t1, e0, e1, &curve_secp224r1); /* t1 <-- e0 * e1 */\n  mg_uecc_vli_modMult_fast(t1, t1, c, &curve_secp224r1);  /* t1 <-- t1 * c */\n  /* t1 <-- p  - t1 */\n  mg_uecc_vli_modSub(t1, curve_secp224r1.p, t1, curve_secp224r1.p,\n                     num_words_secp224r1);\n  mg_uecc_vli_modMult_fast(t2, d0, d1, &curve_secp224r1); /* t2 <-- d0 * d1 */\n  mg_uecc_vli_modAdd(t2, t2, t1, curve_secp224r1.p,\n                     num_words_secp224r1);                /* t2 <-- t2 + t1 */\n  mg_uecc_vli_modMult_fast(t1, d0, e1, &curve_secp224r1); /* t1 <-- d0 * e1 */\n  mg_uecc_vli_modMult_fast(e2, d1, e0, &curve_secp224r1); /* e2 <-- d1 * e0 */\n  mg_uecc_vli_modAdd(e2, e2, t1, curve_secp224r1.p,\n                     num_words_secp224r1);               /* e2 <-- e2 + t1 */\n  mg_uecc_vli_modSquare_fast(f2, e2, &curve_secp224r1);  /* f2 <-- e2^2 */\n  mg_uecc_vli_modMult_fast(f2, f2, c, &curve_secp224r1); /* f2 <-- f2 * c */\n  /* f2 <-- p  - f2 */\n  mg_uecc_vli_modSub(f2, curve_secp224r1.p, f2, curve_secp224r1.p,\n                     num_words_secp224r1);\n  mg_uecc_vli_set(d2, t2, num_words_secp224r1); /* d2 <-- t2 */\n}\n\n/* Routine 3.2.7 RP;  from http://www.nsa.gov/ia/_files/nist-routines.pdf */\nstatic void mod_sqrt_secp224r1_rp(mg_uecc_word_t *d1, mg_uecc_word_t *e1,\n                                  mg_uecc_word_t *f1, const mg_uecc_word_t *c,\n                                  const mg_uecc_word_t *r) {\n  wordcount_t i;\n  wordcount_t pow2i = 1;\n  mg_uecc_word_t d0[num_words_secp224r1];\n  mg_uecc_word_t e0[num_words_secp224r1] = {1}; /* e0 <-- 1 */\n  mg_uecc_word_t f0[num_words_secp224r1];\n\n  mg_uecc_vli_set(d0, r, num_words_secp224r1); /* d0 <-- r */\n  /* f0 <-- p  - c */\n  mg_uecc_vli_modSub(f0, curve_secp224r1.p, c, curve_secp224r1.p,\n                     num_words_secp224r1);\n  for (i = 0; i <= 6; i++) {\n    mod_sqrt_secp224r1_rss(d1, e1, f1, d0, e0, f0,\n                           pow2i); /* RSS (d1,e1,f1,d0,e0,f0,2^i) */\n    mod_sqrt_secp224r1_rm(d1, e1, f1, c, d1, e1, d0,\n                          e0); /* RM (d1,e1,f1,c,d1,e1,d0,e0) */\n    mg_uecc_vli_set(d0, d1, num_words_secp224r1); /* d0 <-- d1 */\n    mg_uecc_vli_set(e0, e1, num_words_secp224r1); /* e0 <-- e1 */\n    mg_uecc_vli_set(f0, f1, num_words_secp224r1); /* f0 <-- f1 */\n    pow2i *= 2;\n  }\n}\n\n/* Compute a = sqrt(a) (mod curve_p). */\n/* Routine 3.2.8 mp_mod_sqrt_224; from\n * http://www.nsa.gov/ia/_files/nist-routines.pdf */\nstatic void mod_sqrt_secp224r1(mg_uecc_word_t *a, MG_UECC_Curve curve) {\n  (void) curve;\n  bitcount_t i;\n  mg_uecc_word_t e1[num_words_secp224r1];\n  mg_uecc_word_t f1[num_words_secp224r1];\n  mg_uecc_word_t d0[num_words_secp224r1];\n  mg_uecc_word_t e0[num_words_secp224r1];\n  mg_uecc_word_t f0[num_words_secp224r1];\n  mg_uecc_word_t d1[num_words_secp224r1];\n\n  /* s = a; using constant instead of random value */\n  mod_sqrt_secp224r1_rp(d0, e0, f0, a, a); /* RP (d0, e0, f0, c, s) */\n  mod_sqrt_secp224r1_rs(d1, e1, f1, d0, e0,\n                        f0); /* RS (d1, e1, f1, d0, e0, f0) */\n  for (i = 1; i <= 95; i++) {\n    mg_uecc_vli_set(d0, d1, num_words_secp224r1); /* d0 <-- d1 */\n    mg_uecc_vli_set(e0, e1, num_words_secp224r1); /* e0 <-- e1 */\n    mg_uecc_vli_set(f0, f1, num_words_secp224r1); /* f0 <-- f1 */\n    mod_sqrt_secp224r1_rs(d1, e1, f1, d0, e0,\n                          f0); /* RS (d1, e1, f1, d0, e0, f0) */\n    if (mg_uecc_vli_isZero(d1, num_words_secp224r1)) { /* if d1 == 0 */\n      break;\n    }\n  }\n  mg_uecc_vli_modInv(f1, e0, curve_secp224r1.p,\n                     num_words_secp224r1);               /* f1 <-- 1 / e0 */\n  mg_uecc_vli_modMult_fast(a, d0, f1, &curve_secp224r1); /* a  <-- d0 / e0 */\n}\n#endif /* MG_UECC_SUPPORT_COMPRESSED_POINT */\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n/* Computes result = product % curve_p\n   from http://www.nsa.gov/ia/_files/nist-routines.pdf */\n#if MG_UECC_WORD_SIZE == 1\nstatic void vli_mmod_fast_secp224r1(uint8_t *result, uint8_t *product) {\n  uint8_t tmp[num_words_secp224r1];\n  int8_t carry;\n\n  /* t */\n  mg_uecc_vli_set(result, product, num_words_secp224r1);\n\n  /* s1 */\n  tmp[0] = tmp[1] = tmp[2] = tmp[3] = 0;\n  tmp[4] = tmp[5] = tmp[6] = tmp[7] = 0;\n  tmp[8] = tmp[9] = tmp[10] = tmp[11] = 0;\n  tmp[12] = product[28];\n  tmp[13] = product[29];\n  tmp[14] = product[30];\n  tmp[15] = product[31];\n  tmp[16] = product[32];\n  tmp[17] = product[33];\n  tmp[18] = product[34];\n  tmp[19] = product[35];\n  tmp[20] = product[36];\n  tmp[21] = product[37];\n  tmp[22] = product[38];\n  tmp[23] = product[39];\n  tmp[24] = product[40];\n  tmp[25] = product[41];\n  tmp[26] = product[42];\n  tmp[27] = product[43];\n  carry = mg_uecc_vli_add(result, result, tmp, num_words_secp224r1);\n\n  /* s2 */\n  tmp[12] = product[44];\n  tmp[13] = product[45];\n  tmp[14] = product[46];\n  tmp[15] = product[47];\n  tmp[16] = product[48];\n  tmp[17] = product[49];\n  tmp[18] = product[50];\n  tmp[19] = product[51];\n  tmp[20] = product[52];\n  tmp[21] = product[53];\n  tmp[22] = product[54];\n  tmp[23] = product[55];\n  tmp[24] = tmp[25] = tmp[26] = tmp[27] = 0;\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp224r1);\n\n  /* d1 */\n  tmp[0] = product[28];\n  tmp[1] = product[29];\n  tmp[2] = product[30];\n  tmp[3] = product[31];\n  tmp[4] = product[32];\n  tmp[5] = product[33];\n  tmp[6] = product[34];\n  tmp[7] = product[35];\n  tmp[8] = product[36];\n  tmp[9] = product[37];\n  tmp[10] = product[38];\n  tmp[11] = product[39];\n  tmp[12] = product[40];\n  tmp[13] = product[41];\n  tmp[14] = product[42];\n  tmp[15] = product[43];\n  tmp[16] = product[44];\n  tmp[17] = product[45];\n  tmp[18] = product[46];\n  tmp[19] = product[47];\n  tmp[20] = product[48];\n  tmp[21] = product[49];\n  tmp[22] = product[50];\n  tmp[23] = product[51];\n  tmp[24] = product[52];\n  tmp[25] = product[53];\n  tmp[26] = product[54];\n  tmp[27] = product[55];\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp224r1);\n\n  /* d2 */\n  tmp[0] = product[44];\n  tmp[1] = product[45];\n  tmp[2] = product[46];\n  tmp[3] = product[47];\n  tmp[4] = product[48];\n  tmp[5] = product[49];\n  tmp[6] = product[50];\n  tmp[7] = product[51];\n  tmp[8] = product[52];\n  tmp[9] = product[53];\n  tmp[10] = product[54];\n  tmp[11] = product[55];\n  tmp[12] = tmp[13] = tmp[14] = tmp[15] = 0;\n  tmp[16] = tmp[17] = tmp[18] = tmp[19] = 0;\n  tmp[20] = tmp[21] = tmp[22] = tmp[23] = 0;\n  tmp[24] = tmp[25] = tmp[26] = tmp[27] = 0;\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp224r1);\n\n  if (carry < 0) {\n    do {\n      carry += mg_uecc_vli_add(result, result, curve_secp224r1.p,\n                               num_words_secp224r1);\n    } while (carry < 0);\n  } else {\n    while (carry || mg_uecc_vli_cmp_unsafe(curve_secp224r1.p, result,\n                                           num_words_secp224r1) != 1) {\n      carry -= mg_uecc_vli_sub(result, result, curve_secp224r1.p,\n                               num_words_secp224r1);\n    }\n  }\n}\n#elif MG_UECC_WORD_SIZE == 4\nstatic void vli_mmod_fast_secp224r1(uint32_t *result, uint32_t *product) {\n  uint32_t tmp[num_words_secp224r1];\n  int carry;\n\n  /* t */\n  mg_uecc_vli_set(result, product, num_words_secp224r1);\n\n  /* s1 */\n  tmp[0] = tmp[1] = tmp[2] = 0;\n  tmp[3] = product[7];\n  tmp[4] = product[8];\n  tmp[5] = product[9];\n  tmp[6] = product[10];\n  carry = mg_uecc_vli_add(result, result, tmp, num_words_secp224r1);\n\n  /* s2 */\n  tmp[3] = product[11];\n  tmp[4] = product[12];\n  tmp[5] = product[13];\n  tmp[6] = 0;\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp224r1);\n\n  /* d1 */\n  tmp[0] = product[7];\n  tmp[1] = product[8];\n  tmp[2] = product[9];\n  tmp[3] = product[10];\n  tmp[4] = product[11];\n  tmp[5] = product[12];\n  tmp[6] = product[13];\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp224r1);\n\n  /* d2 */\n  tmp[0] = product[11];\n  tmp[1] = product[12];\n  tmp[2] = product[13];\n  tmp[3] = tmp[4] = tmp[5] = tmp[6] = 0;\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp224r1);\n\n  if (carry < 0) {\n    do {\n      carry += mg_uecc_vli_add(result, result, curve_secp224r1.p,\n                               num_words_secp224r1);\n    } while (carry < 0);\n  } else {\n    while (carry || mg_uecc_vli_cmp_unsafe(curve_secp224r1.p, result,\n                                           num_words_secp224r1) != 1) {\n      carry -= mg_uecc_vli_sub(result, result, curve_secp224r1.p,\n                               num_words_secp224r1);\n    }\n  }\n}\n#else\nstatic void vli_mmod_fast_secp224r1(uint64_t *result, uint64_t *product) {\n  uint64_t tmp[num_words_secp224r1];\n  int carry = 0;\n\n  /* t */\n  mg_uecc_vli_set(result, product, num_words_secp224r1);\n  result[num_words_secp224r1 - 1] &= 0xffffffff;\n\n  /* s1 */\n  tmp[0] = 0;\n  tmp[1] = product[3] & 0xffffffff00000000ull;\n  tmp[2] = product[4];\n  tmp[3] = product[5] & 0xffffffff;\n  mg_uecc_vli_add(result, result, tmp, num_words_secp224r1);\n\n  /* s2 */\n  tmp[1] = product[5] & 0xffffffff00000000ull;\n  tmp[2] = product[6];\n  tmp[3] = 0;\n  mg_uecc_vli_add(result, result, tmp, num_words_secp224r1);\n\n  /* d1 */\n  tmp[0] = (product[3] >> 32) | (product[4] << 32);\n  tmp[1] = (product[4] >> 32) | (product[5] << 32);\n  tmp[2] = (product[5] >> 32) | (product[6] << 32);\n  tmp[3] = product[6] >> 32;\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp224r1);\n\n  /* d2 */\n  tmp[0] = (product[5] >> 32) | (product[6] << 32);\n  tmp[1] = product[6] >> 32;\n  tmp[2] = tmp[3] = 0;\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp224r1);\n\n  if (carry < 0) {\n    do {\n      carry += mg_uecc_vli_add(result, result, curve_secp224r1.p,\n                               num_words_secp224r1);\n    } while (carry < 0);\n  } else {\n    while (mg_uecc_vli_cmp_unsafe(curve_secp224r1.p, result,\n                                  num_words_secp224r1) != 1) {\n      mg_uecc_vli_sub(result, result, curve_secp224r1.p, num_words_secp224r1);\n    }\n  }\n}\n#endif /* MG_UECC_WORD_SIZE */\n#endif /* (MG_UECC_OPTIMIZATION_LEVEL > 0) */\n\n#endif /* MG_UECC_SUPPORTS_secp224r1 */\n\n#if MG_UECC_SUPPORTS_secp256r1\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\nstatic void vli_mmod_fast_secp256r1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product);\n#endif\n\nstatic const struct MG_UECC_Curve_t curve_secp256r1 = {\n    num_words_secp256r1,\n    num_bytes_secp256r1,\n    256, /* num_n_bits */\n    {BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(01, 00, 00, 00, FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(51, 25, 63, FC, C2, CA, B9, F3),\n     BYTES_TO_WORDS_8(84, 9E, 17, A7, AD, FA, E6, BC),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(96, C2, 98, D8, 45, 39, A1, F4),\n     BYTES_TO_WORDS_8(A0, 33, EB, 2D, 81, 7D, 03, 77),\n     BYTES_TO_WORDS_8(F2, 40, A4, 63, E5, E6, BC, F8),\n     BYTES_TO_WORDS_8(47, 42, 2C, E1, F2, D1, 17, 6B),\n\n     BYTES_TO_WORDS_8(F5, 51, BF, 37, 68, 40, B6, CB),\n     BYTES_TO_WORDS_8(CE, 5E, 31, 6B, 57, 33, CE, 2B),\n     BYTES_TO_WORDS_8(16, 9E, 0F, 7C, 4A, EB, E7, 8E),\n     BYTES_TO_WORDS_8(9B, 7F, 1A, FE, E2, 42, E3, 4F)},\n    {BYTES_TO_WORDS_8(4B, 60, D2, 27, 3E, 3C, CE, 3B),\n     BYTES_TO_WORDS_8(F6, B0, 53, CC, B0, 06, 1D, 65),\n     BYTES_TO_WORDS_8(BC, 86, 98, 76, 55, BD, EB, B3),\n     BYTES_TO_WORDS_8(E7, 93, 3A, AA, D8, 35, C6, 5A)},\n    &double_jacobian_default,\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n    &mod_sqrt_default,\n#endif\n    &x_side_default,\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n    &vli_mmod_fast_secp256r1\n#endif\n};\n\nMG_UECC_Curve mg_uecc_secp256r1(void) {\n  return &curve_secp256r1;\n}\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0 && !asm_mmod_fast_secp256r1)\n/* Computes result = product % curve_p\n   from http://www.nsa.gov/ia/_files/nist-routines.pdf */\n#if MG_UECC_WORD_SIZE == 1\nstatic void vli_mmod_fast_secp256r1(uint8_t *result, uint8_t *product) {\n  uint8_t tmp[num_words_secp256r1];\n  int8_t carry;\n\n  /* t */\n  mg_uecc_vli_set(result, product, num_words_secp256r1);\n\n  /* s1 */\n  tmp[0] = tmp[1] = tmp[2] = tmp[3] = 0;\n  tmp[4] = tmp[5] = tmp[6] = tmp[7] = 0;\n  tmp[8] = tmp[9] = tmp[10] = tmp[11] = 0;\n  tmp[12] = product[44];\n  tmp[13] = product[45];\n  tmp[14] = product[46];\n  tmp[15] = product[47];\n  tmp[16] = product[48];\n  tmp[17] = product[49];\n  tmp[18] = product[50];\n  tmp[19] = product[51];\n  tmp[20] = product[52];\n  tmp[21] = product[53];\n  tmp[22] = product[54];\n  tmp[23] = product[55];\n  tmp[24] = product[56];\n  tmp[25] = product[57];\n  tmp[26] = product[58];\n  tmp[27] = product[59];\n  tmp[28] = product[60];\n  tmp[29] = product[61];\n  tmp[30] = product[62];\n  tmp[31] = product[63];\n  carry = mg_uecc_vli_add(tmp, tmp, tmp, num_words_secp256r1);\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s2 */\n  tmp[12] = product[48];\n  tmp[13] = product[49];\n  tmp[14] = product[50];\n  tmp[15] = product[51];\n  tmp[16] = product[52];\n  tmp[17] = product[53];\n  tmp[18] = product[54];\n  tmp[19] = product[55];\n  tmp[20] = product[56];\n  tmp[21] = product[57];\n  tmp[22] = product[58];\n  tmp[23] = product[59];\n  tmp[24] = product[60];\n  tmp[25] = product[61];\n  tmp[26] = product[62];\n  tmp[27] = product[63];\n  tmp[28] = tmp[29] = tmp[30] = tmp[31] = 0;\n  carry += mg_uecc_vli_add(tmp, tmp, tmp, num_words_secp256r1);\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s3 */\n  tmp[0] = product[32];\n  tmp[1] = product[33];\n  tmp[2] = product[34];\n  tmp[3] = product[35];\n  tmp[4] = product[36];\n  tmp[5] = product[37];\n  tmp[6] = product[38];\n  tmp[7] = product[39];\n  tmp[8] = product[40];\n  tmp[9] = product[41];\n  tmp[10] = product[42];\n  tmp[11] = product[43];\n  tmp[12] = tmp[13] = tmp[14] = tmp[15] = 0;\n  tmp[16] = tmp[17] = tmp[18] = tmp[19] = 0;\n  tmp[20] = tmp[21] = tmp[22] = tmp[23] = 0;\n  tmp[24] = product[56];\n  tmp[25] = product[57];\n  tmp[26] = product[58];\n  tmp[27] = product[59];\n  tmp[28] = product[60];\n  tmp[29] = product[61];\n  tmp[30] = product[62];\n  tmp[31] = product[63];\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s4 */\n  tmp[0] = product[36];\n  tmp[1] = product[37];\n  tmp[2] = product[38];\n  tmp[3] = product[39];\n  tmp[4] = product[40];\n  tmp[5] = product[41];\n  tmp[6] = product[42];\n  tmp[7] = product[43];\n  tmp[8] = product[44];\n  tmp[9] = product[45];\n  tmp[10] = product[46];\n  tmp[11] = product[47];\n  tmp[12] = product[52];\n  tmp[13] = product[53];\n  tmp[14] = product[54];\n  tmp[15] = product[55];\n  tmp[16] = product[56];\n  tmp[17] = product[57];\n  tmp[18] = product[58];\n  tmp[19] = product[59];\n  tmp[20] = product[60];\n  tmp[21] = product[61];\n  tmp[22] = product[62];\n  tmp[23] = product[63];\n  tmp[24] = product[52];\n  tmp[25] = product[53];\n  tmp[26] = product[54];\n  tmp[27] = product[55];\n  tmp[28] = product[32];\n  tmp[29] = product[33];\n  tmp[30] = product[34];\n  tmp[31] = product[35];\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* d1 */\n  tmp[0] = product[44];\n  tmp[1] = product[45];\n  tmp[2] = product[46];\n  tmp[3] = product[47];\n  tmp[4] = product[48];\n  tmp[5] = product[49];\n  tmp[6] = product[50];\n  tmp[7] = product[51];\n  tmp[8] = product[52];\n  tmp[9] = product[53];\n  tmp[10] = product[54];\n  tmp[11] = product[55];\n  tmp[12] = tmp[13] = tmp[14] = tmp[15] = 0;\n  tmp[16] = tmp[17] = tmp[18] = tmp[19] = 0;\n  tmp[20] = tmp[21] = tmp[22] = tmp[23] = 0;\n  tmp[24] = product[32];\n  tmp[25] = product[33];\n  tmp[26] = product[34];\n  tmp[27] = product[35];\n  tmp[28] = product[40];\n  tmp[29] = product[41];\n  tmp[30] = product[42];\n  tmp[31] = product[43];\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d2 */\n  tmp[0] = product[48];\n  tmp[1] = product[49];\n  tmp[2] = product[50];\n  tmp[3] = product[51];\n  tmp[4] = product[52];\n  tmp[5] = product[53];\n  tmp[6] = product[54];\n  tmp[7] = product[55];\n  tmp[8] = product[56];\n  tmp[9] = product[57];\n  tmp[10] = product[58];\n  tmp[11] = product[59];\n  tmp[12] = product[60];\n  tmp[13] = product[61];\n  tmp[14] = product[62];\n  tmp[15] = product[63];\n  tmp[16] = tmp[17] = tmp[18] = tmp[19] = 0;\n  tmp[20] = tmp[21] = tmp[22] = tmp[23] = 0;\n  tmp[24] = product[36];\n  tmp[25] = product[37];\n  tmp[26] = product[38];\n  tmp[27] = product[39];\n  tmp[28] = product[44];\n  tmp[29] = product[45];\n  tmp[30] = product[46];\n  tmp[31] = product[47];\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d3 */\n  tmp[0] = product[52];\n  tmp[1] = product[53];\n  tmp[2] = product[54];\n  tmp[3] = product[55];\n  tmp[4] = product[56];\n  tmp[5] = product[57];\n  tmp[6] = product[58];\n  tmp[7] = product[59];\n  tmp[8] = product[60];\n  tmp[9] = product[61];\n  tmp[10] = product[62];\n  tmp[11] = product[63];\n  tmp[12] = product[32];\n  tmp[13] = product[33];\n  tmp[14] = product[34];\n  tmp[15] = product[35];\n  tmp[16] = product[36];\n  tmp[17] = product[37];\n  tmp[18] = product[38];\n  tmp[19] = product[39];\n  tmp[20] = product[40];\n  tmp[21] = product[41];\n  tmp[22] = product[42];\n  tmp[23] = product[43];\n  tmp[24] = tmp[25] = tmp[26] = tmp[27] = 0;\n  tmp[28] = product[48];\n  tmp[29] = product[49];\n  tmp[30] = product[50];\n  tmp[31] = product[51];\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d4 */\n  tmp[0] = product[56];\n  tmp[1] = product[57];\n  tmp[2] = product[58];\n  tmp[3] = product[59];\n  tmp[4] = product[60];\n  tmp[5] = product[61];\n  tmp[6] = product[62];\n  tmp[7] = product[63];\n  tmp[8] = tmp[9] = tmp[10] = tmp[11] = 0;\n  tmp[12] = product[36];\n  tmp[13] = product[37];\n  tmp[14] = product[38];\n  tmp[15] = product[39];\n  tmp[16] = product[40];\n  tmp[17] = product[41];\n  tmp[18] = product[42];\n  tmp[19] = product[43];\n  tmp[20] = product[44];\n  tmp[21] = product[45];\n  tmp[22] = product[46];\n  tmp[23] = product[47];\n  tmp[24] = tmp[25] = tmp[26] = tmp[27] = 0;\n  tmp[28] = product[52];\n  tmp[29] = product[53];\n  tmp[30] = product[54];\n  tmp[31] = product[55];\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  if (carry < 0) {\n    do {\n      carry += mg_uecc_vli_add(result, result, curve_secp256r1.p,\n                               num_words_secp256r1);\n    } while (carry < 0);\n  } else {\n    while (carry || mg_uecc_vli_cmp_unsafe(curve_secp256r1.p, result,\n                                           num_words_secp256r1) != 1) {\n      carry -= mg_uecc_vli_sub(result, result, curve_secp256r1.p,\n                               num_words_secp256r1);\n    }\n  }\n}\n#elif MG_UECC_WORD_SIZE == 4\nstatic void vli_mmod_fast_secp256r1(uint32_t *result, uint32_t *product) {\n  uint32_t tmp[num_words_secp256r1];\n  int carry;\n\n  /* t */\n  mg_uecc_vli_set(result, product, num_words_secp256r1);\n\n  /* s1 */\n  tmp[0] = tmp[1] = tmp[2] = 0;\n  tmp[3] = product[11];\n  tmp[4] = product[12];\n  tmp[5] = product[13];\n  tmp[6] = product[14];\n  tmp[7] = product[15];\n  carry = (int) mg_uecc_vli_add(tmp, tmp, tmp, num_words_secp256r1);\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s2 */\n  tmp[3] = product[12];\n  tmp[4] = product[13];\n  tmp[5] = product[14];\n  tmp[6] = product[15];\n  tmp[7] = 0;\n  carry += (int) mg_uecc_vli_add(tmp, tmp, tmp, num_words_secp256r1);\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s3 */\n  tmp[0] = product[8];\n  tmp[1] = product[9];\n  tmp[2] = product[10];\n  tmp[3] = tmp[4] = tmp[5] = 0;\n  tmp[6] = product[14];\n  tmp[7] = product[15];\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s4 */\n  tmp[0] = product[9];\n  tmp[1] = product[10];\n  tmp[2] = product[11];\n  tmp[3] = product[13];\n  tmp[4] = product[14];\n  tmp[5] = product[15];\n  tmp[6] = product[13];\n  tmp[7] = product[8];\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* d1 */\n  tmp[0] = product[11];\n  tmp[1] = product[12];\n  tmp[2] = product[13];\n  tmp[3] = tmp[4] = tmp[5] = 0;\n  tmp[6] = product[8];\n  tmp[7] = product[10];\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d2 */\n  tmp[0] = product[12];\n  tmp[1] = product[13];\n  tmp[2] = product[14];\n  tmp[3] = product[15];\n  tmp[4] = tmp[5] = 0;\n  tmp[6] = product[9];\n  tmp[7] = product[11];\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d3 */\n  tmp[0] = product[13];\n  tmp[1] = product[14];\n  tmp[2] = product[15];\n  tmp[3] = product[8];\n  tmp[4] = product[9];\n  tmp[5] = product[10];\n  tmp[6] = 0;\n  tmp[7] = product[12];\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d4 */\n  tmp[0] = product[14];\n  tmp[1] = product[15];\n  tmp[2] = 0;\n  tmp[3] = product[9];\n  tmp[4] = product[10];\n  tmp[5] = product[11];\n  tmp[6] = 0;\n  tmp[7] = product[13];\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  if (carry < 0) {\n    do {\n      carry += (int) mg_uecc_vli_add(result, result, curve_secp256r1.p,\n                                     num_words_secp256r1);\n    } while (carry < 0);\n  } else {\n    while (carry || mg_uecc_vli_cmp_unsafe(curve_secp256r1.p, result,\n                                           num_words_secp256r1) != 1) {\n      carry -= (int) mg_uecc_vli_sub(result, result, curve_secp256r1.p,\n                                     num_words_secp256r1);\n    }\n  }\n}\n#else\nstatic void vli_mmod_fast_secp256r1(uint64_t *result, uint64_t *product) {\n  uint64_t tmp[num_words_secp256r1];\n  int carry;\n\n  /* t */\n  mg_uecc_vli_set(result, product, num_words_secp256r1);\n\n  /* s1 */\n  tmp[0] = 0;\n  tmp[1] = product[5] & 0xffffffff00000000U;\n  tmp[2] = product[6];\n  tmp[3] = product[7];\n  carry = (int) mg_uecc_vli_add(tmp, tmp, tmp, num_words_secp256r1);\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s2 */\n  tmp[1] = product[6] << 32;\n  tmp[2] = (product[6] >> 32) | (product[7] << 32);\n  tmp[3] = product[7] >> 32;\n  carry += (int) mg_uecc_vli_add(tmp, tmp, tmp, num_words_secp256r1);\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s3 */\n  tmp[0] = product[4];\n  tmp[1] = product[5] & 0xffffffff;\n  tmp[2] = 0;\n  tmp[3] = product[7];\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s4 */\n  tmp[0] = (product[4] >> 32) | (product[5] << 32);\n  tmp[1] = (product[5] >> 32) | (product[6] & 0xffffffff00000000U);\n  tmp[2] = product[7];\n  tmp[3] = (product[6] >> 32) | (product[4] << 32);\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* d1 */\n  tmp[0] = (product[5] >> 32) | (product[6] << 32);\n  tmp[1] = (product[6] >> 32);\n  tmp[2] = 0;\n  tmp[3] = (product[4] & 0xffffffff) | (product[5] << 32);\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d2 */\n  tmp[0] = product[6];\n  tmp[1] = product[7];\n  tmp[2] = 0;\n  tmp[3] = (product[4] >> 32) | (product[5] & 0xffffffff00000000);\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d3 */\n  tmp[0] = (product[6] >> 32) | (product[7] << 32);\n  tmp[1] = (product[7] >> 32) | (product[4] << 32);\n  tmp[2] = (product[4] >> 32) | (product[5] << 32);\n  tmp[3] = (product[6] << 32);\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d4 */\n  tmp[0] = product[7];\n  tmp[1] = product[4] & 0xffffffff00000000U;\n  tmp[2] = product[5];\n  tmp[3] = product[6] & 0xffffffff00000000U;\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  if (carry < 0) {\n    do {\n      carry += (int) mg_uecc_vli_add(result, result, curve_secp256r1.p,\n                                     num_words_secp256r1);\n    } while (carry < 0);\n  } else {\n    while (carry || mg_uecc_vli_cmp_unsafe(curve_secp256r1.p, result,\n                                           num_words_secp256r1) != 1) {\n      carry -= (int) mg_uecc_vli_sub(result, result, curve_secp256r1.p,\n                                     num_words_secp256r1);\n    }\n  }\n}\n#endif /* MG_UECC_WORD_SIZE */\n#endif /* (MG_UECC_OPTIMIZATION_LEVEL > 0 && !asm_mmod_fast_secp256r1) */\n\n#endif /* MG_UECC_SUPPORTS_secp256r1 */\n\n#if MG_UECC_SUPPORTS_secp256k1\n\nstatic void double_jacobian_secp256k1(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                                      mg_uecc_word_t *Z1, MG_UECC_Curve curve);\nstatic void x_side_secp256k1(mg_uecc_word_t *result, const mg_uecc_word_t *x,\n                             MG_UECC_Curve curve);\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\nstatic void vli_mmod_fast_secp256k1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product);\n#endif\n\nstatic const struct MG_UECC_Curve_t curve_secp256k1 = {\n    num_words_secp256k1,\n    num_bytes_secp256k1,\n    256, /* num_n_bits */\n    {BYTES_TO_WORDS_8(2F, FC, FF, FF, FE, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(41, 41, 36, D0, 8C, 5E, D2, BF),\n     BYTES_TO_WORDS_8(3B, A0, 48, AF, E6, DC, AE, BA),\n     BYTES_TO_WORDS_8(FE, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(98, 17, F8, 16, 5B, 81, F2, 59),\n     BYTES_TO_WORDS_8(D9, 28, CE, 2D, DB, FC, 9B, 02),\n     BYTES_TO_WORDS_8(07, 0B, 87, CE, 95, 62, A0, 55),\n     BYTES_TO_WORDS_8(AC, BB, DC, F9, 7E, 66, BE, 79),\n\n     BYTES_TO_WORDS_8(B8, D4, 10, FB, 8F, D0, 47, 9C),\n     BYTES_TO_WORDS_8(19, 54, 85, A6, 48, B4, 17, FD),\n     BYTES_TO_WORDS_8(A8, 08, 11, 0E, FC, FB, A4, 5D),\n     BYTES_TO_WORDS_8(65, C4, A3, 26, 77, DA, 3A, 48)},\n    {BYTES_TO_WORDS_8(07, 00, 00, 00, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, 00, 00, 00, 00)},\n    &double_jacobian_secp256k1,\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n    &mod_sqrt_default,\n#endif\n    &x_side_secp256k1,\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n    &vli_mmod_fast_secp256k1\n#endif\n};\n\nMG_UECC_Curve mg_uecc_secp256k1(void) {\n  return &curve_secp256k1;\n}\n\n/* Double in place */\nstatic void double_jacobian_secp256k1(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                                      mg_uecc_word_t *Z1, MG_UECC_Curve curve) {\n  /* t1 = X, t2 = Y, t3 = Z */\n  mg_uecc_word_t t4[num_words_secp256k1];\n  mg_uecc_word_t t5[num_words_secp256k1];\n\n  if (mg_uecc_vli_isZero(Z1, num_words_secp256k1)) {\n    return;\n  }\n\n  mg_uecc_vli_modSquare_fast(t5, Y1, curve);   /* t5 = y1^2 */\n  mg_uecc_vli_modMult_fast(t4, X1, t5, curve); /* t4 = x1*y1^2 = A */\n  mg_uecc_vli_modSquare_fast(X1, X1, curve);   /* t1 = x1^2 */\n  mg_uecc_vli_modSquare_fast(t5, t5, curve);   /* t5 = y1^4 */\n  mg_uecc_vli_modMult_fast(Z1, Y1, Z1, curve); /* t3 = y1*z1 = z3 */\n\n  mg_uecc_vli_modAdd(Y1, X1, X1, curve->p,\n                     num_words_secp256k1); /* t2 = 2*x1^2 */\n  mg_uecc_vli_modAdd(Y1, Y1, X1, curve->p,\n                     num_words_secp256k1); /* t2 = 3*x1^2 */\n  if (mg_uecc_vli_testBit(Y1, 0)) {\n    mg_uecc_word_t carry =\n        mg_uecc_vli_add(Y1, Y1, curve->p, num_words_secp256k1);\n    mg_uecc_vli_rshift1(Y1, num_words_secp256k1);\n    Y1[num_words_secp256k1 - 1] |= carry << (MG_UECC_WORD_BITS - 1);\n  } else {\n    mg_uecc_vli_rshift1(Y1, num_words_secp256k1);\n  }\n  /* t2 = 3/2*(x1^2) = B */\n\n  mg_uecc_vli_modSquare_fast(X1, Y1, curve); /* t1 = B^2 */\n  mg_uecc_vli_modSub(X1, X1, t4, curve->p,\n                     num_words_secp256k1); /* t1 = B^2 - A */\n  mg_uecc_vli_modSub(X1, X1, t4, curve->p,\n                     num_words_secp256k1); /* t1 = B^2 - 2A = x3 */\n\n  mg_uecc_vli_modSub(t4, t4, X1, curve->p,\n                     num_words_secp256k1);     /* t4 = A - x3 */\n  mg_uecc_vli_modMult_fast(Y1, Y1, t4, curve); /* t2 = B * (A - x3) */\n  mg_uecc_vli_modSub(Y1, Y1, t5, curve->p,\n                     num_words_secp256k1); /* t2 = B * (A - x3) - y1^4 = y3 */\n}\n\n/* Computes result = x^3 + b. result must not overlap x. */\nstatic void x_side_secp256k1(mg_uecc_word_t *result, const mg_uecc_word_t *x,\n                             MG_UECC_Curve curve) {\n  mg_uecc_vli_modSquare_fast(result, x, curve);       /* r = x^2 */\n  mg_uecc_vli_modMult_fast(result, result, x, curve); /* r = x^3 */\n  mg_uecc_vli_modAdd(result, result, curve->b, curve->p,\n                     num_words_secp256k1); /* r = x^3 + b */\n}\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0 && !asm_mmod_fast_secp256k1)\nstatic void omega_mult_secp256k1(mg_uecc_word_t *result,\n                                 const mg_uecc_word_t *right);\nstatic void vli_mmod_fast_secp256k1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product) {\n  mg_uecc_word_t tmp[2 * num_words_secp256k1];\n  mg_uecc_word_t carry;\n\n  mg_uecc_vli_clear(tmp, num_words_secp256k1);\n  mg_uecc_vli_clear(tmp + num_words_secp256k1, num_words_secp256k1);\n\n  omega_mult_secp256k1(tmp,\n                       product + num_words_secp256k1); /* (Rq, q) = q * c */\n\n  carry = mg_uecc_vli_add(result, product, tmp,\n                          num_words_secp256k1); /* (C, r) = r + q       */\n  mg_uecc_vli_clear(product, num_words_secp256k1);\n  omega_mult_secp256k1(product, tmp + num_words_secp256k1); /* Rq*c */\n  carry += mg_uecc_vli_add(result, result, product,\n                           num_words_secp256k1); /* (C1, r) = r + Rq*c */\n\n  while (carry > 0) {\n    --carry;\n    mg_uecc_vli_sub(result, result, curve_secp256k1.p, num_words_secp256k1);\n  }\n  if (mg_uecc_vli_cmp_unsafe(result, curve_secp256k1.p, num_words_secp256k1) >\n      0) {\n    mg_uecc_vli_sub(result, result, curve_secp256k1.p, num_words_secp256k1);\n  }\n}\n\n#if MG_UECC_WORD_SIZE == 1\nstatic void omega_mult_secp256k1(uint8_t *result, const uint8_t *right) {\n  /* Multiply by (2^32 + 2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1). */\n  mg_uecc_word_t r0 = 0;\n  mg_uecc_word_t r1 = 0;\n  mg_uecc_word_t r2 = 0;\n  wordcount_t k;\n\n  /* Multiply by (2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1). */\n  muladd(0xD1, right[0], &r0, &r1, &r2);\n  result[0] = r0;\n  r0 = r1;\n  r1 = r2;\n  /* r2 is still 0 */\n\n  for (k = 1; k < num_words_secp256k1; ++k) {\n    muladd(0x03, right[k - 1], &r0, &r1, &r2);\n    muladd(0xD1, right[k], &r0, &r1, &r2);\n    result[k] = r0;\n    r0 = r1;\n    r1 = r2;\n    r2 = 0;\n  }\n  muladd(0x03, right[num_words_secp256k1 - 1], &r0, &r1, &r2);\n  result[num_words_secp256k1] = r0;\n  result[num_words_secp256k1 + 1] = r1;\n  /* add the 2^32 multiple */\n  result[4 + num_words_secp256k1] =\n      mg_uecc_vli_add(result + 4, result + 4, right, num_words_secp256k1);\n}\n#elif MG_UECC_WORD_SIZE == 4\nstatic void omega_mult_secp256k1(uint32_t *result, const uint32_t *right) {\n  /* Multiply by (2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1). */\n  uint32_t carry = 0;\n  wordcount_t k;\n\n  for (k = 0; k < num_words_secp256k1; ++k) {\n    uint64_t p = (uint64_t) 0x3D1 * right[k] + carry;\n    result[k] = (uint32_t) p;\n    carry = p >> 32;\n  }\n  result[num_words_secp256k1] = carry;\n  /* add the 2^32 multiple */\n  result[1 + num_words_secp256k1] =\n      mg_uecc_vli_add(result + 1, result + 1, right, num_words_secp256k1);\n}\n#else\nstatic void omega_mult_secp256k1(uint64_t *result, const uint64_t *right) {\n  mg_uecc_word_t r0 = 0;\n  mg_uecc_word_t r1 = 0;\n  mg_uecc_word_t r2 = 0;\n  wordcount_t k;\n\n  /* Multiply by (2^32 + 2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1). */\n  for (k = 0; k < num_words_secp256k1; ++k) {\n    muladd(0x1000003D1ull, right[k], &r0, &r1, &r2);\n    result[k] = r0;\n    r0 = r1;\n    r1 = r2;\n    r2 = 0;\n  }\n  result[num_words_secp256k1] = r0;\n}\n#endif /* MG_UECC_WORD_SIZE */\n#endif /* (MG_UECC_OPTIMIZATION_LEVEL > 0 &&  && !asm_mmod_fast_secp256k1) */\n\n#endif /* MG_UECC_SUPPORTS_secp256k1 */\n\n#endif /* _UECC_CURVE_SPECIFIC_H_ */\n\n/* Returns 1 if 'point' is the point at infinity, 0 otherwise. */\n#define EccPoint_isZero(point, curve) \\\n  mg_uecc_vli_isZero((point), (wordcount_t) ((curve)->num_words * 2))\n\n/* Point multiplication algorithm using Montgomery's ladder with co-Z\ncoordinates. From http://eprint.iacr.org/2011/338.pdf\n*/\n\n/* Modify (x1, y1) => (x1 * z^2, y1 * z^3) */\nstatic void apply_z(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                    const mg_uecc_word_t *const Z, MG_UECC_Curve curve) {\n  mg_uecc_word_t t1[MG_UECC_MAX_WORDS];\n\n  mg_uecc_vli_modSquare_fast(t1, Z, curve);    /* z^2 */\n  mg_uecc_vli_modMult_fast(X1, X1, t1, curve); /* x1 * z^2 */\n  mg_uecc_vli_modMult_fast(t1, t1, Z, curve);  /* z^3 */\n  mg_uecc_vli_modMult_fast(Y1, Y1, t1, curve); /* y1 * z^3 */\n}\n\n/* P = (x1, y1) => 2P, (x2, y2) => P' */\nstatic void XYcZ_initial_double(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                                mg_uecc_word_t *X2, mg_uecc_word_t *Y2,\n                                const mg_uecc_word_t *const initial_Z,\n                                MG_UECC_Curve curve) {\n  mg_uecc_word_t z[MG_UECC_MAX_WORDS];\n  wordcount_t num_words = curve->num_words;\n  if (initial_Z) {\n    mg_uecc_vli_set(z, initial_Z, num_words);\n  } else {\n    mg_uecc_vli_clear(z, num_words);\n    z[0] = 1;\n  }\n\n  mg_uecc_vli_set(X2, X1, num_words);\n  mg_uecc_vli_set(Y2, Y1, num_words);\n\n  apply_z(X1, Y1, z, curve);\n  curve->double_jacobian(X1, Y1, z, curve);\n  apply_z(X2, Y2, z, curve);\n}\n\n/* Input P = (x1, y1, Z), Q = (x2, y2, Z)\n   Output P' = (x1', y1', Z3), P + Q = (x3, y3, Z3)\n   or P => P', Q => P + Q\n*/\nstatic void XYcZ_add(mg_uecc_word_t *X1, mg_uecc_word_t *Y1, mg_uecc_word_t *X2,\n                     mg_uecc_word_t *Y2, MG_UECC_Curve curve) {\n  /* t1 = X1, t2 = Y1, t3 = X2, t4 = Y2 */\n  mg_uecc_word_t t5[MG_UECC_MAX_WORDS] = {0};\n  wordcount_t num_words = curve->num_words;\n\n  mg_uecc_vli_modSub(t5, X2, X1, curve->p, num_words); /* t5 = x2 - x1 */\n  mg_uecc_vli_modSquare_fast(t5, t5, curve);   /* t5 = (x2 - x1)^2 = A */\n  mg_uecc_vli_modMult_fast(X1, X1, t5, curve); /* t1 = x1*A = B */\n  mg_uecc_vli_modMult_fast(X2, X2, t5, curve); /* t3 = x2*A = C */\n  mg_uecc_vli_modSub(Y2, Y2, Y1, curve->p, num_words); /* t4 = y2 - y1 */\n  mg_uecc_vli_modSquare_fast(t5, Y2, curve); /* t5 = (y2 - y1)^2 = D */\n\n  mg_uecc_vli_modSub(t5, t5, X1, curve->p, num_words); /* t5 = D - B */\n  mg_uecc_vli_modSub(t5, t5, X2, curve->p, num_words); /* t5 = D - B - C = x3 */\n  mg_uecc_vli_modSub(X2, X2, X1, curve->p, num_words); /* t3 = C - B */\n  mg_uecc_vli_modMult_fast(Y1, Y1, X2, curve);         /* t2 = y1*(C - B) */\n  mg_uecc_vli_modSub(X2, X1, t5, curve->p, num_words); /* t3 = B - x3 */\n  mg_uecc_vli_modMult_fast(Y2, Y2, X2, curve); /* t4 = (y2 - y1)*(B - x3) */\n  mg_uecc_vli_modSub(Y2, Y2, Y1, curve->p, num_words); /* t4 = y3 */\n\n  mg_uecc_vli_set(X2, t5, num_words);\n}\n\n/* Input P = (x1, y1, Z), Q = (x2, y2, Z)\n   Output P + Q = (x3, y3, Z3), P - Q = (x3', y3', Z3)\n   or P => P - Q, Q => P + Q\n*/\nstatic void XYcZ_addC(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                      mg_uecc_word_t *X2, mg_uecc_word_t *Y2,\n                      MG_UECC_Curve curve) {\n  /* t1 = X1, t2 = Y1, t3 = X2, t4 = Y2 */\n  mg_uecc_word_t t5[MG_UECC_MAX_WORDS] = {0};\n  mg_uecc_word_t t6[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t t7[MG_UECC_MAX_WORDS];\n  wordcount_t num_words = curve->num_words;\n\n  mg_uecc_vli_modSub(t5, X2, X1, curve->p, num_words); /* t5 = x2 - x1 */\n  mg_uecc_vli_modSquare_fast(t5, t5, curve);   /* t5 = (x2 - x1)^2 = A */\n  mg_uecc_vli_modMult_fast(X1, X1, t5, curve); /* t1 = x1*A = B */\n  mg_uecc_vli_modMult_fast(X2, X2, t5, curve); /* t3 = x2*A = C */\n  mg_uecc_vli_modAdd(t5, Y2, Y1, curve->p, num_words); /* t5 = y2 + y1 */\n  mg_uecc_vli_modSub(Y2, Y2, Y1, curve->p, num_words); /* t4 = y2 - y1 */\n\n  mg_uecc_vli_modSub(t6, X2, X1, curve->p, num_words); /* t6 = C - B */\n  mg_uecc_vli_modMult_fast(Y1, Y1, t6, curve); /* t2 = y1 * (C - B) = E */\n  mg_uecc_vli_modAdd(t6, X1, X2, curve->p, num_words); /* t6 = B + C */\n  mg_uecc_vli_modSquare_fast(X2, Y2, curve); /* t3 = (y2 - y1)^2 = D */\n  mg_uecc_vli_modSub(X2, X2, t6, curve->p,\n                     num_words); /* t3 = D - (B + C) = x3 */\n\n  mg_uecc_vli_modSub(t7, X1, X2, curve->p, num_words); /* t7 = B - x3 */\n  mg_uecc_vli_modMult_fast(Y2, Y2, t7, curve); /* t4 = (y2 - y1)*(B - x3) */\n  mg_uecc_vli_modSub(Y2, Y2, Y1, curve->p,\n                     num_words); /* t4 = (y2 - y1)*(B - x3) - E = y3 */\n\n  mg_uecc_vli_modSquare_fast(t7, t5, curve); /* t7 = (y2 + y1)^2 = F */\n  mg_uecc_vli_modSub(t7, t7, t6, curve->p,\n                     num_words); /* t7 = F - (B + C) = x3' */\n  mg_uecc_vli_modSub(t6, t7, X1, curve->p, num_words); /* t6 = x3' - B */\n  mg_uecc_vli_modMult_fast(t6, t6, t5, curve); /* t6 = (y2+y1)*(x3' - B) */\n  mg_uecc_vli_modSub(Y1, t6, Y1, curve->p,\n                     num_words); /* t2 = (y2+y1)*(x3' - B) - E = y3' */\n\n  mg_uecc_vli_set(X1, t7, num_words);\n}\n\n/* result may overlap point. */\nstatic void EccPoint_mult(mg_uecc_word_t *result, const mg_uecc_word_t *point,\n                          const mg_uecc_word_t *scalar,\n                          const mg_uecc_word_t *initial_Z, bitcount_t num_bits,\n                          MG_UECC_Curve curve) {\n  /* R0 and R1 */\n  mg_uecc_word_t Rx[2][MG_UECC_MAX_WORDS];\n  mg_uecc_word_t Ry[2][MG_UECC_MAX_WORDS];\n  mg_uecc_word_t z[MG_UECC_MAX_WORDS];\n  bitcount_t i;\n  mg_uecc_word_t nb;\n  wordcount_t num_words = curve->num_words;\n\n  mg_uecc_vli_set(Rx[1], point, num_words);\n  mg_uecc_vli_set(Ry[1], point + num_words, num_words);\n\n  XYcZ_initial_double(Rx[1], Ry[1], Rx[0], Ry[0], initial_Z, curve);\n\n  for (i = num_bits - 2; i > 0; --i) {\n    nb = !mg_uecc_vli_testBit(scalar, i);\n    XYcZ_addC(Rx[1 - nb], Ry[1 - nb], Rx[nb], Ry[nb], curve);\n    XYcZ_add(Rx[nb], Ry[nb], Rx[1 - nb], Ry[1 - nb], curve);\n  }\n\n  nb = !mg_uecc_vli_testBit(scalar, 0);\n  XYcZ_addC(Rx[1 - nb], Ry[1 - nb], Rx[nb], Ry[nb], curve);\n\n  /* Find final 1/Z value. */\n  mg_uecc_vli_modSub(z, Rx[1], Rx[0], curve->p, num_words); /* X1 - X0 */\n  mg_uecc_vli_modMult_fast(z, z, Ry[1 - nb], curve);        /* Yb * (X1 - X0) */\n  mg_uecc_vli_modMult_fast(z, z, point, curve);  /* xP * Yb * (X1 - X0) */\n  mg_uecc_vli_modInv(z, z, curve->p, num_words); /* 1 / (xP * Yb * (X1 - X0)) */\n  /* yP / (xP * Yb * (X1 - X0)) */\n  mg_uecc_vli_modMult_fast(z, z, point + num_words, curve);\n  mg_uecc_vli_modMult_fast(z, z, Rx[1 - nb],\n                           curve); /* Xb * yP / (xP * Yb * (X1 - X0)) */\n  /* End 1/Z calculation */\n\n  XYcZ_add(Rx[nb], Ry[nb], Rx[1 - nb], Ry[1 - nb], curve);\n  apply_z(Rx[0], Ry[0], z, curve);\n\n  mg_uecc_vli_set(result, Rx[0], num_words);\n  mg_uecc_vli_set(result + num_words, Ry[0], num_words);\n}\n\nstatic mg_uecc_word_t regularize_k(const mg_uecc_word_t *const k,\n                                   mg_uecc_word_t *k0, mg_uecc_word_t *k1,\n                                   MG_UECC_Curve curve) {\n  wordcount_t num_n_words = BITS_TO_WORDS(curve->num_n_bits);\n  bitcount_t num_n_bits = curve->num_n_bits;\n  mg_uecc_word_t carry =\n      mg_uecc_vli_add(k0, k, curve->n, num_n_words) ||\n      (num_n_bits < ((bitcount_t) num_n_words * MG_UECC_WORD_SIZE * 8) &&\n       mg_uecc_vli_testBit(k0, num_n_bits));\n  mg_uecc_vli_add(k1, k0, curve->n, num_n_words);\n  return carry;\n}\n\n/* Generates a random integer in the range 0 < random < top.\n   Both random and top have num_words words. */\nMG_UECC_VLI_API int mg_uecc_generate_random_int(mg_uecc_word_t *random,\n                                                const mg_uecc_word_t *top,\n                                                wordcount_t num_words) {\n  mg_uecc_word_t mask = (mg_uecc_word_t) -1;\n  mg_uecc_word_t tries;\n  bitcount_t num_bits = mg_uecc_vli_numBits(top, num_words);\n\n  if (!g_rng_function) {\n    return 0;\n  }\n\n  for (tries = 0; tries < MG_UECC_RNG_MAX_TRIES; ++tries) {\n    if (!g_rng_function((uint8_t *) random,\n                        (unsigned int) (num_words * MG_UECC_WORD_SIZE))) {\n      return 0;\n    }\n    random[num_words - 1] &=\n        mask >> ((bitcount_t) (num_words * MG_UECC_WORD_SIZE * 8 - num_bits));\n    if (!mg_uecc_vli_isZero(random, num_words) &&\n        mg_uecc_vli_cmp(top, random, num_words) == 1) {\n      return 1;\n    }\n  }\n  return 0;\n}\n\nstatic mg_uecc_word_t EccPoint_compute_public_key(mg_uecc_word_t *result,\n                                                  mg_uecc_word_t *private_key,\n                                                  MG_UECC_Curve curve) {\n  mg_uecc_word_t tmp1[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tmp2[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t *p2[2] = {tmp1, tmp2};\n  mg_uecc_word_t *initial_Z = 0;\n  mg_uecc_word_t carry;\n\n  /* Regularize the bitcount for the private key so that attackers cannot use a\n     side channel attack to learn the number of leading zeros. */\n  carry = regularize_k(private_key, tmp1, tmp2, curve);\n\n  /* If an RNG function was specified, try to get a random initial Z value to\n     improve protection against side-channel attacks. */\n  if (g_rng_function) {\n    if (!mg_uecc_generate_random_int(p2[carry], curve->p, curve->num_words)) {\n      return 0;\n    }\n    initial_Z = p2[carry];\n  }\n  EccPoint_mult(result, curve->G, p2[!carry], initial_Z,\n                (bitcount_t) (curve->num_n_bits + 1), curve);\n\n  if (EccPoint_isZero(result, curve)) {\n    return 0;\n  }\n  return 1;\n}\n\n#if MG_UECC_WORD_SIZE == 1\n\nMG_UECC_VLI_API void mg_uecc_vli_nativeToBytes(uint8_t *bytes, int num_bytes,\n                                               const uint8_t *native) {\n  wordcount_t i;\n  for (i = 0; i < num_bytes; ++i) {\n    bytes[i] = native[(num_bytes - 1) - i];\n  }\n}\n\nMG_UECC_VLI_API void mg_uecc_vli_bytesToNative(uint8_t *native,\n                                               const uint8_t *bytes,\n                                               int num_bytes) {\n  mg_uecc_vli_nativeToBytes(native, num_bytes, bytes);\n}\n\n#else\n\nMG_UECC_VLI_API void mg_uecc_vli_nativeToBytes(uint8_t *bytes, int num_bytes,\n                                               const mg_uecc_word_t *native) {\n  int i;\n  for (i = 0; i < num_bytes; ++i) {\n    unsigned b = (unsigned) (num_bytes - 1 - i);\n    bytes[i] = (uint8_t) (native[b / MG_UECC_WORD_SIZE] >>\n                          (8 * (b % MG_UECC_WORD_SIZE)));\n  }\n}\n\nMG_UECC_VLI_API void mg_uecc_vli_bytesToNative(mg_uecc_word_t *native,\n                                               const uint8_t *bytes,\n                                               int num_bytes) {\n  int i;\n  mg_uecc_vli_clear(native,\n                    (wordcount_t) ((num_bytes + (MG_UECC_WORD_SIZE - 1)) /\n                                   MG_UECC_WORD_SIZE));\n  for (i = 0; i < num_bytes; ++i) {\n    unsigned b = (unsigned) (num_bytes - 1 - i);\n    native[b / MG_UECC_WORD_SIZE] |= (mg_uecc_word_t) bytes[i]\n                                     << (8 * (b % MG_UECC_WORD_SIZE));\n  }\n}\n\n#endif /* MG_UECC_WORD_SIZE */\n\nint mg_uecc_make_key(uint8_t *public_key, uint8_t *private_key,\n                     MG_UECC_Curve curve) {\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  mg_uecc_word_t *_private = (mg_uecc_word_t *) private_key;\n  mg_uecc_word_t *_public = (mg_uecc_word_t *) public_key;\n#else\n  mg_uecc_word_t _private[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t _public[MG_UECC_MAX_WORDS * 2];\n#endif\n  mg_uecc_word_t tries;\n\n  for (tries = 0; tries < MG_UECC_RNG_MAX_TRIES; ++tries) {\n    if (!mg_uecc_generate_random_int(_private, curve->n,\n                                     BITS_TO_WORDS(curve->num_n_bits))) {\n      return 0;\n    }\n\n    if (EccPoint_compute_public_key(_public, _private, curve)) {\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN == 0\n      mg_uecc_vli_nativeToBytes(private_key, BITS_TO_BYTES(curve->num_n_bits),\n                                _private);\n      mg_uecc_vli_nativeToBytes(public_key, curve->num_bytes, _public);\n      mg_uecc_vli_nativeToBytes(public_key + curve->num_bytes, curve->num_bytes,\n                                _public + curve->num_words);\n#endif\n      return 1;\n    }\n  }\n  return 0;\n}\n\nint mg_uecc_shared_secret(const uint8_t *public_key, const uint8_t *private_key,\n                          uint8_t *secret, MG_UECC_Curve curve) {\n  mg_uecc_word_t _public[MG_UECC_MAX_WORDS * 2];\n  mg_uecc_word_t _private[MG_UECC_MAX_WORDS];\n\n  mg_uecc_word_t tmp[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t *p2[2] = {_private, tmp};\n  mg_uecc_word_t *initial_Z = 0;\n  mg_uecc_word_t carry;\n  wordcount_t num_words = curve->num_words;\n  wordcount_t num_bytes = curve->num_bytes;\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy((uint8_t *) _private, private_key, num_bytes);\n  bcopy((uint8_t *) _public, public_key, num_bytes * 2);\n#else\n  mg_uecc_vli_bytesToNative(_private, private_key,\n                            BITS_TO_BYTES(curve->num_n_bits));\n  mg_uecc_vli_bytesToNative(_public, public_key, num_bytes);\n  mg_uecc_vli_bytesToNative(_public + num_words, public_key + num_bytes,\n                            num_bytes);\n#endif\n\n  /* Regularize the bitcount for the private key so that attackers cannot use a\n     side channel attack to learn the number of leading zeros. */\n  carry = regularize_k(_private, _private, tmp, curve);\n\n  /* If an RNG function was specified, try to get a random initial Z value to\n     improve protection against side-channel attacks. */\n  if (g_rng_function) {\n    if (!mg_uecc_generate_random_int(p2[carry], curve->p, num_words)) {\n      return 0;\n    }\n    initial_Z = p2[carry];\n  }\n\n  EccPoint_mult(_public, _public, p2[!carry], initial_Z,\n                (bitcount_t) (curve->num_n_bits + 1), curve);\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy((uint8_t *) secret, (uint8_t *) _public, num_bytes);\n#else\n  mg_uecc_vli_nativeToBytes(secret, num_bytes, _public);\n#endif\n  return !EccPoint_isZero(_public, curve);\n}\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\nvoid mg_uecc_compress(const uint8_t *public_key, uint8_t *compressed,\n                      MG_UECC_Curve curve) {\n  wordcount_t i;\n  for (i = 0; i < curve->num_bytes; ++i) {\n    compressed[i + 1] = public_key[i];\n  }\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  compressed[0] = 2 + (public_key[curve->num_bytes] & 0x01);\n#else\n  compressed[0] = 2 + (public_key[curve->num_bytes * 2 - 1] & 0x01);\n#endif\n}\n\nvoid mg_uecc_decompress(const uint8_t *compressed, uint8_t *public_key,\n                        MG_UECC_Curve curve) {\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  mg_uecc_word_t *point = (mg_uecc_word_t *) public_key;\n#else\n  mg_uecc_word_t point[MG_UECC_MAX_WORDS * 2];\n#endif\n  mg_uecc_word_t *y = point + curve->num_words;\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy(public_key, compressed + 1, curve->num_bytes);\n#else\n  mg_uecc_vli_bytesToNative(point, compressed + 1, curve->num_bytes);\n#endif\n  curve->x_side(y, point, curve);\n  curve->mod_sqrt(y, curve);\n\n  if ((uint8_t) (y[0] & 0x01) != (compressed[0] & 0x01)) {\n    mg_uecc_vli_sub(y, curve->p, y, curve->num_words);\n  }\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN == 0\n  mg_uecc_vli_nativeToBytes(public_key, curve->num_bytes, point);\n  mg_uecc_vli_nativeToBytes(public_key + curve->num_bytes, curve->num_bytes, y);\n#endif\n}\n#endif /* MG_UECC_SUPPORT_COMPRESSED_POINT */\n\nMG_UECC_VLI_API int mg_uecc_valid_point(const mg_uecc_word_t *point,\n                                        MG_UECC_Curve curve) {\n  mg_uecc_word_t tmp1[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tmp2[MG_UECC_MAX_WORDS];\n  wordcount_t num_words = curve->num_words;\n\n  /* The point at infinity is invalid. */\n  if (EccPoint_isZero(point, curve)) {\n    return 0;\n  }\n\n  /* x and y must be smaller than p. */\n  if (mg_uecc_vli_cmp_unsafe(curve->p, point, num_words) != 1 ||\n      mg_uecc_vli_cmp_unsafe(curve->p, point + num_words, num_words) != 1) {\n    return 0;\n  }\n\n  mg_uecc_vli_modSquare_fast(tmp1, point + num_words, curve);\n  curve->x_side(tmp2, point, curve); /* tmp2 = x^3 + ax + b */\n\n  /* Make sure that y^2 == x^3 + ax + b */\n  return (int) (mg_uecc_vli_equal(tmp1, tmp2, num_words));\n}\n\nint mg_uecc_valid_public_key(const uint8_t *public_key, MG_UECC_Curve curve) {\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  mg_uecc_word_t *_public = (mg_uecc_word_t *) public_key;\n#else\n  mg_uecc_word_t _public[MG_UECC_MAX_WORDS * 2];\n#endif\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN == 0\n  mg_uecc_vli_bytesToNative(_public, public_key, curve->num_bytes);\n  mg_uecc_vli_bytesToNative(_public + curve->num_words,\n                            public_key + curve->num_bytes, curve->num_bytes);\n#endif\n  return mg_uecc_valid_point(_public, curve);\n}\n\nint mg_uecc_compute_public_key(const uint8_t *private_key, uint8_t *public_key,\n                               MG_UECC_Curve curve) {\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  mg_uecc_word_t *_private = (mg_uecc_word_t *) private_key;\n  mg_uecc_word_t *_public = (mg_uecc_word_t *) public_key;\n#else\n  mg_uecc_word_t _private[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t _public[MG_UECC_MAX_WORDS * 2];\n#endif\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN == 0\n  mg_uecc_vli_bytesToNative(_private, private_key,\n                            BITS_TO_BYTES(curve->num_n_bits));\n#endif\n\n  /* Make sure the private key is in the range [1, n-1]. */\n  if (mg_uecc_vli_isZero(_private, BITS_TO_WORDS(curve->num_n_bits))) {\n    return 0;\n  }\n\n  if (mg_uecc_vli_cmp(curve->n, _private, BITS_TO_WORDS(curve->num_n_bits)) !=\n      1) {\n    return 0;\n  }\n\n  /* Compute public key. */\n  if (!EccPoint_compute_public_key(_public, _private, curve)) {\n    return 0;\n  }\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN == 0\n  mg_uecc_vli_nativeToBytes(public_key, curve->num_bytes, _public);\n  mg_uecc_vli_nativeToBytes(public_key + curve->num_bytes, curve->num_bytes,\n                            _public + curve->num_words);\n#endif\n  return 1;\n}\n\n/* -------- ECDSA code -------- */\n\nstatic void bits2int(mg_uecc_word_t *native, const uint8_t *bits,\n                     unsigned bits_size, MG_UECC_Curve curve) {\n  unsigned num_n_bytes = (unsigned) BITS_TO_BYTES(curve->num_n_bits);\n  unsigned num_n_words = (unsigned) BITS_TO_WORDS(curve->num_n_bits);\n  int shift;\n  mg_uecc_word_t carry;\n  mg_uecc_word_t *ptr;\n\n  if (bits_size > num_n_bytes) {\n    bits_size = num_n_bytes;\n  }\n\n  mg_uecc_vli_clear(native, (wordcount_t) num_n_words);\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy((uint8_t *) native, bits, bits_size);\n#else\n  mg_uecc_vli_bytesToNative(native, bits, (int) bits_size);\n#endif\n  if (bits_size * 8 <= (unsigned) curve->num_n_bits) {\n    return;\n  }\n  shift = (int) bits_size * 8 - curve->num_n_bits;\n  carry = 0;\n  ptr = native + num_n_words;\n  while (ptr-- > native) {\n    mg_uecc_word_t temp = *ptr;\n    *ptr = (temp >> shift) | carry;\n    carry = temp << (MG_UECC_WORD_BITS - shift);\n  }\n\n  /* Reduce mod curve_n */\n  if (mg_uecc_vli_cmp_unsafe(curve->n, native, (wordcount_t) num_n_words) !=\n      1) {\n    mg_uecc_vli_sub(native, native, curve->n, (wordcount_t) num_n_words);\n  }\n}\n\nstatic int mg_uecc_sign_with_k_internal(const uint8_t *private_key,\n                                        const uint8_t *message_hash,\n                                        unsigned hash_size, mg_uecc_word_t *k,\n                                        uint8_t *signature,\n                                        MG_UECC_Curve curve) {\n  mg_uecc_word_t tmp[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t s[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t *k2[2] = {tmp, s};\n  mg_uecc_word_t *initial_Z = 0;\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  mg_uecc_word_t *p = (mg_uecc_word_t *) signature;\n#else\n  mg_uecc_word_t p[MG_UECC_MAX_WORDS * 2];\n#endif\n  mg_uecc_word_t carry;\n  wordcount_t num_words = curve->num_words;\n  wordcount_t num_n_words = BITS_TO_WORDS(curve->num_n_bits);\n  bitcount_t num_n_bits = curve->num_n_bits;\n\n  /* Make sure 0 < k < curve_n */\n  if (mg_uecc_vli_isZero(k, num_words) ||\n      mg_uecc_vli_cmp(curve->n, k, num_n_words) != 1) {\n    return 0;\n  }\n\n  carry = regularize_k(k, tmp, s, curve);\n  /* If an RNG function was specified, try to get a random initial Z value to\n     improve protection against side-channel attacks. */\n  if (g_rng_function) {\n    if (!mg_uecc_generate_random_int(k2[carry], curve->p, num_words)) {\n      return 0;\n    }\n    initial_Z = k2[carry];\n  }\n  EccPoint_mult(p, curve->G, k2[!carry], initial_Z,\n                (bitcount_t) (num_n_bits + 1), curve);\n  if (mg_uecc_vli_isZero(p, num_words)) {\n    return 0;\n  }\n\n  /* If an RNG function was specified, get a random number\n     to prevent side channel analysis of k. */\n  if (!g_rng_function) {\n    mg_uecc_vli_clear(tmp, num_n_words);\n    tmp[0] = 1;\n  } else if (!mg_uecc_generate_random_int(tmp, curve->n, num_n_words)) {\n    return 0;\n  }\n\n  /* Prevent side channel analysis of mg_uecc_vli_modInv() to determine\n     bits of k / the private key by premultiplying by a random number */\n  mg_uecc_vli_modMult(k, k, tmp, curve->n, num_n_words); /* k' = rand * k */\n  mg_uecc_vli_modInv(k, k, curve->n, num_n_words);       /* k = 1 / k' */\n  mg_uecc_vli_modMult(k, k, tmp, curve->n, num_n_words); /* k = 1 / k */\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN == 0\n  mg_uecc_vli_nativeToBytes(signature, curve->num_bytes, p); /* store r */\n#endif\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy((uint8_t *) tmp, private_key, BITS_TO_BYTES(curve->num_n_bits));\n#else\n  mg_uecc_vli_bytesToNative(tmp, private_key,\n                            BITS_TO_BYTES(curve->num_n_bits)); /* tmp = d */\n#endif\n\n  s[num_n_words - 1] = 0;\n  mg_uecc_vli_set(s, p, num_words);\n  mg_uecc_vli_modMult(s, tmp, s, curve->n, num_n_words); /* s = r*d */\n\n  bits2int(tmp, message_hash, hash_size, curve);\n  mg_uecc_vli_modAdd(s, tmp, s, curve->n, num_n_words); /* s = e + r*d */\n  mg_uecc_vli_modMult(s, s, k, curve->n, num_n_words);  /* s = (e + r*d) / k */\n  if (mg_uecc_vli_numBits(s, num_n_words) > (bitcount_t) curve->num_bytes * 8) {\n    return 0;\n  }\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy((uint8_t *) signature + curve->num_bytes, (uint8_t *) s,\n        curve->num_bytes);\n#else\n  mg_uecc_vli_nativeToBytes(signature + curve->num_bytes, curve->num_bytes, s);\n#endif\n  return 1;\n}\n\n#if 0\n/* For testing - sign with an explicitly specified k value */\nint mg_uecc_sign_with_k(const uint8_t *private_key, const uint8_t *message_hash,\n                     unsigned hash_size, const uint8_t *k, uint8_t *signature,\n                     MG_UECC_Curve curve) {\n  mg_uecc_word_t k2[MG_UECC_MAX_WORDS];\n  bits2int(k2, k, (unsigned) BITS_TO_BYTES(curve->num_n_bits), curve);\n  return mg_uecc_sign_with_k_internal(private_key, message_hash, hash_size, k2,\n                                   signature, curve);\n}\n#endif\n\nint mg_uecc_sign(const uint8_t *private_key, const uint8_t *message_hash,\n                 unsigned hash_size, uint8_t *signature, MG_UECC_Curve curve) {\n  mg_uecc_word_t k[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tries;\n\n  for (tries = 0; tries < MG_UECC_RNG_MAX_TRIES; ++tries) {\n    if (!mg_uecc_generate_random_int(k, curve->n,\n                                     BITS_TO_WORDS(curve->num_n_bits))) {\n      return 0;\n    }\n\n    if (mg_uecc_sign_with_k_internal(private_key, message_hash, hash_size, k,\n                                     signature, curve)) {\n      return 1;\n    }\n  }\n  return 0;\n}\n\n/* Compute an HMAC using K as a key (as in RFC 6979). Note that K is always\n   the same size as the hash result size. */\nstatic void HMAC_init(const MG_UECC_HashContext *hash_context,\n                      const uint8_t *K) {\n  uint8_t *pad = hash_context->tmp + 2 * hash_context->result_size;\n  unsigned i;\n  for (i = 0; i < hash_context->result_size; ++i) pad[i] = K[i] ^ 0x36;\n  for (; i < hash_context->block_size; ++i) pad[i] = 0x36;\n\n  hash_context->init_hash(hash_context);\n  hash_context->update_hash(hash_context, pad, hash_context->block_size);\n}\n\nstatic void HMAC_update(const MG_UECC_HashContext *hash_context,\n                        const uint8_t *message, unsigned message_size) {\n  hash_context->update_hash(hash_context, message, message_size);\n}\n\nstatic void HMAC_finish(const MG_UECC_HashContext *hash_context,\n                        const uint8_t *K, uint8_t *result) {\n  uint8_t *pad = hash_context->tmp + 2 * hash_context->result_size;\n  unsigned i;\n  for (i = 0; i < hash_context->result_size; ++i) pad[i] = K[i] ^ 0x5c;\n  for (; i < hash_context->block_size; ++i) pad[i] = 0x5c;\n\n  hash_context->finish_hash(hash_context, result);\n\n  hash_context->init_hash(hash_context);\n  hash_context->update_hash(hash_context, pad, hash_context->block_size);\n  hash_context->update_hash(hash_context, result, hash_context->result_size);\n  hash_context->finish_hash(hash_context, result);\n}\n\n/* V = HMAC_K(V) */\nstatic void update_V(const MG_UECC_HashContext *hash_context, uint8_t *K,\n                     uint8_t *V) {\n  HMAC_init(hash_context, K);\n  HMAC_update(hash_context, V, hash_context->result_size);\n  HMAC_finish(hash_context, K, V);\n}\n\n/* Deterministic signing, similar to RFC 6979. Differences are:\n    * We just use H(m) directly rather than bits2octets(H(m))\n      (it is not reduced modulo curve_n).\n    * We generate a value for k (aka T) directly rather than converting\n   endianness.\n\n   Layout of hash_context->tmp: <K> | <V> | (1 byte overlapped 0x00 or 0x01) /\n   <HMAC pad> */\nint mg_uecc_sign_deterministic(const uint8_t *private_key,\n                               const uint8_t *message_hash, unsigned hash_size,\n                               const MG_UECC_HashContext *hash_context,\n                               uint8_t *signature, MG_UECC_Curve curve) {\n  uint8_t *K = hash_context->tmp;\n  uint8_t *V = K + hash_context->result_size;\n  wordcount_t num_bytes = curve->num_bytes;\n  wordcount_t num_n_words = BITS_TO_WORDS(curve->num_n_bits);\n  bitcount_t num_n_bits = curve->num_n_bits;\n  mg_uecc_word_t tries;\n  unsigned i;\n  for (i = 0; i < hash_context->result_size; ++i) {\n    V[i] = 0x01;\n    K[i] = 0;\n  }\n\n  /* K = HMAC_K(V || 0x00 || int2octets(x) || h(m)) */\n  HMAC_init(hash_context, K);\n  V[hash_context->result_size] = 0x00;\n  HMAC_update(hash_context, V, hash_context->result_size + 1);\n  HMAC_update(hash_context, private_key, (unsigned int) num_bytes);\n  HMAC_update(hash_context, message_hash, hash_size);\n  HMAC_finish(hash_context, K, K);\n\n  update_V(hash_context, K, V);\n\n  /* K = HMAC_K(V || 0x01 || int2octets(x) || h(m)) */\n  HMAC_init(hash_context, K);\n  V[hash_context->result_size] = 0x01;\n  HMAC_update(hash_context, V, hash_context->result_size + 1);\n  HMAC_update(hash_context, private_key, (unsigned int) num_bytes);\n  HMAC_update(hash_context, message_hash, hash_size);\n  HMAC_finish(hash_context, K, K);\n\n  update_V(hash_context, K, V);\n\n  for (tries = 0; tries < MG_UECC_RNG_MAX_TRIES; ++tries) {\n    mg_uecc_word_t T[MG_UECC_MAX_WORDS];\n    uint8_t *T_ptr = (uint8_t *) T;\n    wordcount_t T_bytes = 0;\n    for (;;) {\n      update_V(hash_context, K, V);\n      for (i = 0; i < hash_context->result_size; ++i) {\n        T_ptr[T_bytes++] = V[i];\n        if (T_bytes >= num_n_words * MG_UECC_WORD_SIZE) {\n          goto filled;\n        }\n      }\n    }\n  filled:\n    if ((bitcount_t) num_n_words * MG_UECC_WORD_SIZE * 8 > num_n_bits) {\n      mg_uecc_word_t mask = (mg_uecc_word_t) -1;\n      T[num_n_words - 1] &=\n          mask >>\n          ((bitcount_t) (num_n_words * MG_UECC_WORD_SIZE * 8 - num_n_bits));\n    }\n\n    if (mg_uecc_sign_with_k_internal(private_key, message_hash, hash_size, T,\n                                     signature, curve)) {\n      return 1;\n    }\n\n    /* K = HMAC_K(V || 0x00) */\n    HMAC_init(hash_context, K);\n    V[hash_context->result_size] = 0x00;\n    HMAC_update(hash_context, V, hash_context->result_size + 1);\n    HMAC_finish(hash_context, K, K);\n\n    update_V(hash_context, K, V);\n  }\n  return 0;\n}\n\nstatic bitcount_t smax(bitcount_t a, bitcount_t b) {\n  return (a > b ? a : b);\n}\n\nint mg_uecc_verify(const uint8_t *public_key, const uint8_t *message_hash,\n                   unsigned hash_size, const uint8_t *signature,\n                   MG_UECC_Curve curve) {\n  mg_uecc_word_t u1[MG_UECC_MAX_WORDS], u2[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t z[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t sum[MG_UECC_MAX_WORDS * 2];\n  mg_uecc_word_t rx[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t ry[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tx[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t ty[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tz[MG_UECC_MAX_WORDS];\n  const mg_uecc_word_t *points[4];\n  const mg_uecc_word_t *point;\n  bitcount_t num_bits;\n  bitcount_t i;\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  mg_uecc_word_t *_public = (mg_uecc_word_t *) public_key;\n#else\n  mg_uecc_word_t _public[MG_UECC_MAX_WORDS * 2];\n#endif\n  mg_uecc_word_t r[MG_UECC_MAX_WORDS], s[MG_UECC_MAX_WORDS];\n  wordcount_t num_words = curve->num_words;\n  wordcount_t num_n_words = BITS_TO_WORDS(curve->num_n_bits);\n\n  rx[num_n_words - 1] = 0;\n  r[num_n_words - 1] = 0;\n  s[num_n_words - 1] = 0;\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy((uint8_t *) r, signature, curve->num_bytes);\n  bcopy((uint8_t *) s, signature + curve->num_bytes, curve->num_bytes);\n#else\n  mg_uecc_vli_bytesToNative(_public, public_key, curve->num_bytes);\n  mg_uecc_vli_bytesToNative(_public + num_words, public_key + curve->num_bytes,\n                            curve->num_bytes);\n  mg_uecc_vli_bytesToNative(r, signature, curve->num_bytes);\n  mg_uecc_vli_bytesToNative(s, signature + curve->num_bytes, curve->num_bytes);\n#endif\n\n  /* r, s must not be 0. */\n  if (mg_uecc_vli_isZero(r, num_words) || mg_uecc_vli_isZero(s, num_words)) {\n    return 0;\n  }\n\n  /* r, s must be < n. */\n  if (mg_uecc_vli_cmp_unsafe(curve->n, r, num_n_words) != 1 ||\n      mg_uecc_vli_cmp_unsafe(curve->n, s, num_n_words) != 1) {\n    return 0;\n  }\n\n  /* Calculate u1 and u2. */\n  mg_uecc_vli_modInv(z, s, curve->n, num_n_words); /* z = 1/s */\n  u1[num_n_words - 1] = 0;\n  bits2int(u1, message_hash, hash_size, curve);\n  mg_uecc_vli_modMult(u1, u1, z, curve->n, num_n_words); /* u1 = e/s */\n  mg_uecc_vli_modMult(u2, r, z, curve->n, num_n_words);  /* u2 = r/s */\n\n  /* Calculate sum = G + Q. */\n  mg_uecc_vli_set(sum, _public, num_words);\n  mg_uecc_vli_set(sum + num_words, _public + num_words, num_words);\n  mg_uecc_vli_set(tx, curve->G, num_words);\n  mg_uecc_vli_set(ty, curve->G + num_words, num_words);\n  mg_uecc_vli_modSub(z, sum, tx, curve->p, num_words); /* z = x2 - x1 */\n  XYcZ_add(tx, ty, sum, sum + num_words, curve);\n  mg_uecc_vli_modInv(z, z, curve->p, num_words); /* z = 1/z */\n  apply_z(sum, sum + num_words, z, curve);\n\n  /* Use Shamir's trick to calculate u1*G + u2*Q */\n  points[0] = 0;\n  points[1] = curve->G;\n  points[2] = _public;\n  points[3] = sum;\n  num_bits = smax(mg_uecc_vli_numBits(u1, num_n_words),\n                  mg_uecc_vli_numBits(u2, num_n_words));\n  point =\n      points[(!!mg_uecc_vli_testBit(u1, (bitcount_t) (num_bits - 1))) |\n             ((!!mg_uecc_vli_testBit(u2, (bitcount_t) (num_bits - 1))) << 1)];\n  mg_uecc_vli_set(rx, point, num_words);\n  mg_uecc_vli_set(ry, point + num_words, num_words);\n  mg_uecc_vli_clear(z, num_words);\n  z[0] = 1;\n\n  for (i = num_bits - 2; i >= 0; --i) {\n    mg_uecc_word_t index;\n    curve->double_jacobian(rx, ry, z, curve);\n\n    index = (!!mg_uecc_vli_testBit(u1, i)) |\n            (mg_uecc_word_t) ((!!mg_uecc_vli_testBit(u2, i)) << 1);\n    point = points[index];\n    if (point) {\n      mg_uecc_vli_set(tx, point, num_words);\n      mg_uecc_vli_set(ty, point + num_words, num_words);\n      apply_z(tx, ty, z, curve);\n      mg_uecc_vli_modSub(tz, rx, tx, curve->p, num_words); /* Z = x2 - x1 */\n      XYcZ_add(tx, ty, rx, ry, curve);\n      mg_uecc_vli_modMult_fast(z, z, tz, curve);\n    }\n  }\n\n  mg_uecc_vli_modInv(z, z, curve->p, num_words); /* Z = 1/Z */\n  apply_z(rx, ry, z, curve);\n\n  /* v = x1 (mod n) */\n  if (mg_uecc_vli_cmp_unsafe(curve->n, rx, num_n_words) != 1) {\n    mg_uecc_vli_sub(rx, rx, curve->n, num_n_words);\n  }\n\n  /* Accept only if v == r. */\n  return (int) (mg_uecc_vli_equal(rx, r, num_words));\n}\n\n#if MG_UECC_ENABLE_VLI_API\n\nunsigned mg_uecc_curve_num_words(MG_UECC_Curve curve) {\n  return curve->num_words;\n}\n\nunsigned mg_uecc_curve_num_bytes(MG_UECC_Curve curve) {\n  return curve->num_bytes;\n}\n\nunsigned mg_uecc_curve_num_bits(MG_UECC_Curve curve) {\n  return curve->num_bytes * 8;\n}\n\nunsigned mg_uecc_curve_num_n_words(MG_UECC_Curve curve) {\n  return BITS_TO_WORDS(curve->num_n_bits);\n}\n\nunsigned mg_uecc_curve_num_n_bytes(MG_UECC_Curve curve) {\n  return BITS_TO_BYTES(curve->num_n_bits);\n}\n\nunsigned mg_uecc_curve_num_n_bits(MG_UECC_Curve curve) {\n  return curve->num_n_bits;\n}\n\nconst mg_uecc_word_t *mg_uecc_curve_p(MG_UECC_Curve curve) {\n  return curve->p;\n}\n\nconst mg_uecc_word_t *mg_uecc_curve_n(MG_UECC_Curve curve) {\n  return curve->n;\n}\n\nconst mg_uecc_word_t *mg_uecc_curve_G(MG_UECC_Curve curve) {\n  return curve->G;\n}\n\nconst mg_uecc_word_t *mg_uecc_curve_b(MG_UECC_Curve curve) {\n  return curve->b;\n}\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\nvoid mg_uecc_vli_mod_sqrt(mg_uecc_word_t *a, MG_UECC_Curve curve) {\n  curve->mod_sqrt(a, curve);\n}\n#endif\n\nvoid mg_uecc_vli_mmod_fast(mg_uecc_word_t *result, mg_uecc_word_t *product,\n                           MG_UECC_Curve curve) {\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n  curve->mmod_fast(result, product);\n#else\n  mg_uecc_vli_mmod(result, product, curve->p, curve->num_words);\n#endif\n}\n\nvoid mg_uecc_point_mult(mg_uecc_word_t *result, const mg_uecc_word_t *point,\n                        const mg_uecc_word_t *scalar, MG_UECC_Curve curve) {\n  mg_uecc_word_t tmp1[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tmp2[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t *p2[2] = {tmp1, tmp2};\n  mg_uecc_word_t carry = regularize_k(scalar, tmp1, tmp2, curve);\n\n  EccPoint_mult(result, point, p2[!carry], 0, curve->num_n_bits + 1, curve);\n}\n\n#endif  /* MG_UECC_ENABLE_VLI_API */\n#endif  // MG_TLS_BUILTIN\n// End of uecc BSD-2\n"
  },
  {
    "path": "src/tls_uecc.h",
    "content": "#pragma once\n#include \"arch.h\"\n\n#define MG_UECC_SUPPORTS_secp256r1 1\n/* Copyright 2014, Kenneth MacKay. Licensed under the BSD 2-clause license. */\n\n#ifndef _UECC_H_\n#define _UECC_H_\n\n/* Platform selection options.\nIf MG_UECC_PLATFORM is not defined, the code will try to guess it based on\ncompiler macros. Possible values for MG_UECC_PLATFORM are defined below: */\n#define mg_uecc_arch_other 0\n#define mg_uecc_x86 1\n#define mg_uecc_x86_64 2\n#define mg_uecc_arm 3\n#define mg_uecc_arm_thumb 4\n#define mg_uecc_arm_thumb2 5\n#define mg_uecc_arm64 6\n#define mg_uecc_avr 7\n\n/* If desired, you can define MG_UECC_WORD_SIZE as appropriate for your platform\n(1, 4, or 8 bytes). If MG_UECC_WORD_SIZE is not explicitly defined then it will\nbe automatically set based on your platform. */\n\n/* Optimization level; trade speed for code size.\n   Larger values produce code that is faster but larger.\n   Currently supported values are 0 - 4; 0 is unusably slow for most\n   applications. Optimization level 4 currently only has an effect ARM platforms\n   where more than one curve is enabled. */\n#ifndef MG_UECC_OPTIMIZATION_LEVEL\n#define MG_UECC_OPTIMIZATION_LEVEL 2\n#endif\n\n/* MG_UECC_SQUARE_FUNC - If enabled (defined as nonzero), this will cause a\nspecific function to be used for (scalar) squaring instead of the generic\nmultiplication function. This can make things faster somewhat faster, but\nincreases the code size. */\n#ifndef MG_UECC_SQUARE_FUNC\n#define MG_UECC_SQUARE_FUNC 0\n#endif\n\n/* MG_UECC_VLI_NATIVE_LITTLE_ENDIAN - If enabled (defined as nonzero), this will\nswitch to native little-endian format for *all* arrays passed in and out of the\npublic API. This includes public and private keys, shared secrets, signatures\nand message hashes. Using this switch reduces the amount of call stack memory\nused by uECC, since less intermediate translations are required. Note that this\nwill *only* work on native little-endian processors and it will treat the\nuint8_t arrays passed into the public API as word arrays, therefore requiring\nthe provided byte arrays to be word aligned on architectures that do not support\nunaligned accesses. IMPORTANT: Keys and signatures generated with\nMG_UECC_VLI_NATIVE_LITTLE_ENDIAN=1 are incompatible with keys and signatures\ngenerated with MG_UECC_VLI_NATIVE_LITTLE_ENDIAN=0; all parties must use the same\nendianness. */\n#ifndef MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n#define MG_UECC_VLI_NATIVE_LITTLE_ENDIAN 0\n#endif\n\n/* Curve support selection. Set to 0 to remove that curve. */\n#ifndef MG_UECC_SUPPORTS_secp160r1\n#define MG_UECC_SUPPORTS_secp160r1 0\n#endif\n#ifndef MG_UECC_SUPPORTS_secp192r1\n#define MG_UECC_SUPPORTS_secp192r1 0\n#endif\n#ifndef MG_UECC_SUPPORTS_secp224r1\n#define MG_UECC_SUPPORTS_secp224r1 0\n#endif\n#ifndef MG_UECC_SUPPORTS_secp256r1\n#define MG_UECC_SUPPORTS_secp256r1 1\n#endif\n#ifndef MG_UECC_SUPPORTS_secp256k1\n#define MG_UECC_SUPPORTS_secp256k1 0\n#endif\n\n/* Specifies whether compressed point format is supported.\n   Set to 0 to disable point compression/decompression functions. */\n#ifndef MG_UECC_SUPPORT_COMPRESSED_POINT\n#define MG_UECC_SUPPORT_COMPRESSED_POINT 1\n#endif\n\nstruct MG_UECC_Curve_t;\ntypedef const struct MG_UECC_Curve_t *MG_UECC_Curve;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if MG_UECC_SUPPORTS_secp160r1\nMG_UECC_Curve mg_uecc_secp160r1(void);\n#endif\n#if MG_UECC_SUPPORTS_secp192r1\nMG_UECC_Curve mg_uecc_secp192r1(void);\n#endif\n#if MG_UECC_SUPPORTS_secp224r1\nMG_UECC_Curve mg_uecc_secp224r1(void);\n#endif\n#if MG_UECC_SUPPORTS_secp256r1\nMG_UECC_Curve mg_uecc_secp256r1(void);\n#endif\n#if MG_UECC_SUPPORTS_secp256k1\nMG_UECC_Curve mg_uecc_secp256k1(void);\n#endif\n\n/* MG_UECC_RNG_Function type\nThe RNG function should fill 'size' random bytes into 'dest'. It should return 1\nif 'dest' was filled with random data, or 0 if the random data could not be\ngenerated. The filled-in values should be either truly random, or from a\ncryptographically-secure PRNG.\n\nA correctly functioning RNG function must be set (using mg_uecc_set_rng())\nbefore calling mg_uecc_make_key() or mg_uecc_sign().\n\nSetting a correctly functioning RNG function improves the resistance to\nside-channel attacks for mg_uecc_shared_secret() and\nmg_uecc_sign_deterministic().\n\nA correct RNG function is set by default when building for Windows, Linux, or OS\nX. If you are building on another POSIX-compliant system that supports\n/dev/random or /dev/urandom, you can define MG_UECC_POSIX to use the predefined\nRNG. For embedded platforms there is no predefined RNG function; you must\nprovide your own.\n*/\ntypedef int (*MG_UECC_RNG_Function)(uint8_t *dest, unsigned size);\n\n/* mg_uecc_set_rng() function.\nSet the function that will be used to generate random bytes. The RNG function\nshould return 1 if the random data was generated, or 0 if the random data could\nnot be generated.\n\nOn platforms where there is no predefined RNG function (eg embedded platforms),\nthis must be called before mg_uecc_make_key() or mg_uecc_sign() are used.\n\nInputs:\n    rng_function - The function that will be used to generate random bytes.\n*/\nvoid mg_uecc_set_rng(MG_UECC_RNG_Function rng_function);\n\n/* mg_uecc_get_rng() function.\n\nReturns the function that will be used to generate random bytes.\n*/\nMG_UECC_RNG_Function mg_uecc_get_rng(void);\n\n/* mg_uecc_curve_private_key_size() function.\n\nReturns the size of a private key for the curve in bytes.\n*/\nint mg_uecc_curve_private_key_size(MG_UECC_Curve curve);\n\n/* mg_uecc_curve_public_key_size() function.\n\nReturns the size of a public key for the curve in bytes.\n*/\nint mg_uecc_curve_public_key_size(MG_UECC_Curve curve);\n\n/* mg_uecc_make_key() function.\nCreate a public/private key pair.\n\nOutputs:\n    public_key  - Will be filled in with the public key. Must be at least 2 *\nthe curve size (in bytes) long. For example, if the curve is secp256r1,\npublic_key must be 64 bytes long. private_key - Will be filled in with the\nprivate key. Must be as long as the curve order; this is typically the same as\nthe curve size, except for secp160r1. For example, if the curve is secp256r1,\nprivate_key must be 32 bytes long.\n\n                  For secp160r1, private_key must be 21 bytes long! Note that\nthe first byte will almost always be 0 (there is about a 1 in 2^80 chance of it\nbeing non-zero).\n\nReturns 1 if the key pair was generated successfully, 0 if an error occurred.\n*/\nint mg_uecc_make_key(uint8_t *public_key, uint8_t *private_key,\n                     MG_UECC_Curve curve);\n\n/* mg_uecc_shared_secret() function.\nCompute a shared secret given your secret key and someone else's public key. If\nthe public key is not from a trusted source and has not been previously\nverified, you should verify it first using mg_uecc_valid_public_key(). Note: It\nis recommended that you hash the result of mg_uecc_shared_secret() before using\nit for symmetric encryption or HMAC.\n\nInputs:\n    public_key  - The public key of the remote party.\n    private_key - Your private key.\n\nOutputs:\n    secret - Will be filled in with the shared secret value. Must be the same\nsize as the curve size; for example, if the curve is secp256r1, secret must be\n32 bytes long.\n\nReturns 1 if the shared secret was generated successfully, 0 if an error\noccurred.\n*/\nint mg_uecc_shared_secret(const uint8_t *public_key, const uint8_t *private_key,\n                          uint8_t *secret, MG_UECC_Curve curve);\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n/* mg_uecc_compress() function.\nCompress a public key.\n\nInputs:\n    public_key - The public key to compress.\n\nOutputs:\n    compressed - Will be filled in with the compressed public key. Must be at\nleast (curve size + 1) bytes long; for example, if the curve is secp256r1,\n                 compressed must be 33 bytes long.\n*/\nvoid mg_uecc_compress(const uint8_t *public_key, uint8_t *compressed,\n                      MG_UECC_Curve curve);\n\n/* mg_uecc_decompress() function.\nDecompress a compressed public key.\n\nInputs:\n    compressed - The compressed public key.\n\nOutputs:\n    public_key - Will be filled in with the decompressed public key.\n*/\nvoid mg_uecc_decompress(const uint8_t *compressed, uint8_t *public_key,\n                        MG_UECC_Curve curve);\n#endif /* MG_UECC_SUPPORT_COMPRESSED_POINT */\n\n/* mg_uecc_valid_public_key() function.\nCheck to see if a public key is valid.\n\nNote that you are not required to check for a valid public key before using any\nother uECC functions. However, you may wish to avoid spending CPU time computing\na shared secret or verifying a signature using an invalid public key.\n\nInputs:\n    public_key - The public key to check.\n\nReturns 1 if the public key is valid, 0 if it is invalid.\n*/\nint mg_uecc_valid_public_key(const uint8_t *public_key, MG_UECC_Curve curve);\n\n/* mg_uecc_compute_public_key() function.\nCompute the corresponding public key for a private key.\n\nInputs:\n    private_key - The private key to compute the public key for\n\nOutputs:\n    public_key - Will be filled in with the corresponding public key\n\nReturns 1 if the key was computed successfully, 0 if an error occurred.\n*/\nint mg_uecc_compute_public_key(const uint8_t *private_key, uint8_t *public_key,\n                               MG_UECC_Curve curve);\n\n/* mg_uecc_sign() function.\nGenerate an ECDSA signature for a given hash value.\n\nUsage: Compute a hash of the data you wish to sign (SHA-2 is recommended) and\npass it in to this function along with your private key.\n\nInputs:\n    private_key  - Your private key.\n    message_hash - The hash of the message to sign.\n    hash_size    - The size of message_hash in bytes.\n\nOutputs:\n    signature - Will be filled in with the signature value. Must be at least 2 *\ncurve size long. For example, if the curve is secp256r1, signature must be 64\nbytes long.\n\nReturns 1 if the signature generated successfully, 0 if an error occurred.\n*/\nint mg_uecc_sign(const uint8_t *private_key, const uint8_t *message_hash,\n                 unsigned hash_size, uint8_t *signature, MG_UECC_Curve curve);\n\n/* MG_UECC_HashContext structure.\nThis is used to pass in an arbitrary hash function to\nmg_uecc_sign_deterministic(). The structure will be used for multiple hash\ncomputations; each time a new hash is computed, init_hash() will be called,\nfollowed by one or more calls to update_hash(), and finally a call to\nfinish_hash() to produce the resulting hash.\n\nThe intention is that you will create a structure that includes\nMG_UECC_HashContext followed by any hash-specific data. For example:\n\ntypedef struct SHA256_HashContext {\n    MG_UECC_HashContext uECC;\n    SHA256_CTX ctx;\n} SHA256_HashContext;\n\nvoid init_SHA256(MG_UECC_HashContext *base) {\n    SHA256_HashContext *context = (SHA256_HashContext *)base;\n    SHA256_Init(&context->ctx);\n}\n\nvoid update_SHA256(MG_UECC_HashContext *base,\n                   const uint8_t *message,\n                   unsigned message_size) {\n    SHA256_HashContext *context = (SHA256_HashContext *)base;\n    SHA256_Update(&context->ctx, message, message_size);\n}\n\nvoid finish_SHA256(MG_UECC_HashContext *base, uint8_t *hash_result) {\n    SHA256_HashContext *context = (SHA256_HashContext *)base;\n    SHA256_Final(hash_result, &context->ctx);\n}\n\n... when signing ...\n{\n    uint8_t tmp[32 + 32 + 64];\n    SHA256_HashContext ctx = {{&init_SHA256, &update_SHA256, &finish_SHA256, 64,\n32, tmp}}; mg_uecc_sign_deterministic(key, message_hash, &ctx.uECC, signature);\n}\n*/\ntypedef struct MG_UECC_HashContext {\n  void (*init_hash)(const struct MG_UECC_HashContext *context);\n  void (*update_hash)(const struct MG_UECC_HashContext *context,\n                      const uint8_t *message, unsigned message_size);\n  void (*finish_hash)(const struct MG_UECC_HashContext *context,\n                      uint8_t *hash_result);\n  unsigned\n      block_size; /* Hash function block size in bytes, eg 64 for SHA-256. */\n  unsigned\n      result_size; /* Hash function result size in bytes, eg 32 for SHA-256. */\n  uint8_t *tmp;    /* Must point to a buffer of at least (2 * result_size +\n                      block_size) bytes. */\n} MG_UECC_HashContext;\n\n/* mg_uecc_sign_deterministic() function.\nGenerate an ECDSA signature for a given hash value, using a deterministic\nalgorithm (see RFC 6979). You do not need to set the RNG using mg_uecc_set_rng()\nbefore calling this function; however, if the RNG is defined it will improve\nresistance to side-channel attacks.\n\nUsage: Compute a hash of the data you wish to sign (SHA-2 is recommended) and\npass it to this function along with your private key and a hash context. Note\nthat the message_hash does not need to be computed with the same hash function\nused by hash_context.\n\nInputs:\n    private_key  - Your private key.\n    message_hash - The hash of the message to sign.\n    hash_size    - The size of message_hash in bytes.\n    hash_context - A hash context to use.\n\nOutputs:\n    signature - Will be filled in with the signature value.\n\nReturns 1 if the signature generated successfully, 0 if an error occurred.\n*/\nint mg_uecc_sign_deterministic(const uint8_t *private_key,\n                               const uint8_t *message_hash, unsigned hash_size,\n                               const MG_UECC_HashContext *hash_context,\n                               uint8_t *signature, MG_UECC_Curve curve);\n\n/* mg_uecc_verify() function.\nVerify an ECDSA signature.\n\nUsage: Compute the hash of the signed data using the same hash as the signer and\npass it to this function along with the signer's public key and the signature\nvalues (r and s).\n\nInputs:\n    public_key   - The signer's public key.\n    message_hash - The hash of the signed data.\n    hash_size    - The size of message_hash in bytes.\n    signature    - The signature value.\n\nReturns 1 if the signature is valid, 0 if it is invalid.\n*/\nint mg_uecc_verify(const uint8_t *public_key, const uint8_t *message_hash,\n                   unsigned hash_size, const uint8_t *signature,\n                   MG_UECC_Curve curve);\n\n#ifdef __cplusplus\n} /* end of extern \"C\" */\n#endif\n\n#endif /* _UECC_H_ */\n\n/* Copyright 2015, Kenneth MacKay. Licensed under the BSD 2-clause license. */\n\n#ifndef _UECC_TYPES_H_\n#define _UECC_TYPES_H_\n\n#ifndef MG_UECC_PLATFORM\n#if defined(__AVR__) && __AVR__\n#define MG_UECC_PLATFORM mg_uecc_avr\n#elif defined(__thumb2__) || \\\n    defined(_M_ARMT) /* I think MSVC only supports Thumb-2 targets */\n#define MG_UECC_PLATFORM mg_uecc_arm_thumb2\n#elif defined(__thumb__)\n#define MG_UECC_PLATFORM mg_uecc_arm_thumb\n#elif defined(__arm__) || defined(_M_ARM)\n#define MG_UECC_PLATFORM mg_uecc_arm\n#elif defined(__aarch64__)\n#define MG_UECC_PLATFORM mg_uecc_arm64\n#elif defined(__i386__) || defined(_M_IX86) || defined(_X86_) || \\\n    defined(__I86__)\n#define MG_UECC_PLATFORM mg_uecc_x86\n#elif defined(__amd64__) || defined(_M_X64)\n#define MG_UECC_PLATFORM mg_uecc_x86_64\n#else\n#define MG_UECC_PLATFORM mg_uecc_arch_other\n#endif\n#endif\n\n#ifndef MG_UECC_ARM_USE_UMAAL\n#if (MG_UECC_PLATFORM == mg_uecc_arm) && (__ARM_ARCH >= 6)\n#define MG_UECC_ARM_USE_UMAAL 1\n#elif (MG_UECC_PLATFORM == mg_uecc_arm_thumb2) && (__ARM_ARCH >= 6) && \\\n    (!defined(__ARM_ARCH_7M__) || !__ARM_ARCH_7M__)\n#define MG_UECC_ARM_USE_UMAAL 1\n#else\n#define MG_UECC_ARM_USE_UMAAL 0\n#endif\n#endif\n\n#ifndef MG_UECC_WORD_SIZE\n#if MG_UECC_PLATFORM == mg_uecc_avr\n#define MG_UECC_WORD_SIZE 1\n#elif (MG_UECC_PLATFORM == mg_uecc_x86_64 || MG_UECC_PLATFORM == mg_uecc_arm64)\n#define MG_UECC_WORD_SIZE 8\n#else\n#define MG_UECC_WORD_SIZE 4\n#endif\n#endif\n\n#if (MG_UECC_WORD_SIZE != 1) && (MG_UECC_WORD_SIZE != 4) && \\\n    (MG_UECC_WORD_SIZE != 8)\n#error \"Unsupported value for MG_UECC_WORD_SIZE\"\n#endif\n\n#if ((MG_UECC_PLATFORM == mg_uecc_avr) && (MG_UECC_WORD_SIZE != 1))\n#pragma message(\"MG_UECC_WORD_SIZE must be 1 for AVR\")\n#undef MG_UECC_WORD_SIZE\n#define MG_UECC_WORD_SIZE 1\n#endif\n\n#if ((MG_UECC_PLATFORM == mg_uecc_arm ||         \\\n      MG_UECC_PLATFORM == mg_uecc_arm_thumb ||   \\\n      MG_UECC_PLATFORM == mg_uecc_arm_thumb2) && \\\n     (MG_UECC_WORD_SIZE != 4))\n#pragma message(\"MG_UECC_WORD_SIZE must be 4 for ARM\")\n#undef MG_UECC_WORD_SIZE\n#define MG_UECC_WORD_SIZE 4\n#endif\n\ntypedef int8_t wordcount_t;\ntypedef int16_t bitcount_t;\ntypedef int8_t cmpresult_t;\n\n#if (MG_UECC_WORD_SIZE == 1)\n\ntypedef uint8_t mg_uecc_word_t;\ntypedef uint16_t mg_uecc_dword_t;\n\n#define HIGH_BIT_SET 0x80\n#define MG_UECC_WORD_BITS 8\n#define MG_UECC_WORD_BITS_SHIFT 3\n#define MG_UECC_WORD_BITS_MASK 0x07\n\n#elif (MG_UECC_WORD_SIZE == 4)\n\ntypedef uint32_t mg_uecc_word_t;\ntypedef uint64_t mg_uecc_dword_t;\n\n#define HIGH_BIT_SET 0x80000000\n#define MG_UECC_WORD_BITS 32\n#define MG_UECC_WORD_BITS_SHIFT 5\n#define MG_UECC_WORD_BITS_MASK 0x01F\n\n#elif (MG_UECC_WORD_SIZE == 8)\n\ntypedef uint64_t mg_uecc_word_t;\n\n#define HIGH_BIT_SET 0x8000000000000000U\n#define MG_UECC_WORD_BITS 64\n#define MG_UECC_WORD_BITS_SHIFT 6\n#define MG_UECC_WORD_BITS_MASK 0x03F\n\n#endif /* MG_UECC_WORD_SIZE */\n\n#endif /* _UECC_TYPES_H_ */\n\n/* Copyright 2015, Kenneth MacKay. Licensed under the BSD 2-clause license. */\n\n#ifndef _UECC_VLI_H_\n#define _UECC_VLI_H_\n\n// #include \"types.h\"\n// #include \"uECC.h\"\n\n/* Functions for raw large-integer manipulation. These are only available\n   if uECC.c is compiled with MG_UECC_ENABLE_VLI_API defined to 1. */\n#ifndef MG_UECC_ENABLE_VLI_API\n#define MG_UECC_ENABLE_VLI_API 0\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if MG_UECC_ENABLE_VLI_API\n\nvoid mg_uecc_vli_clear(mg_uecc_word_t *vli, wordcount_t num_words);\n\n/* Constant-time comparison to zero - secure way to compare long integers */\n/* Returns 1 if vli == 0, 0 otherwise. */\nmg_uecc_word_t mg_uecc_vli_isZero(const mg_uecc_word_t *vli,\n                                  wordcount_t num_words);\n\n/* Returns nonzero if bit 'bit' of vli is set. */\nmg_uecc_word_t mg_uecc_vli_testBit(const mg_uecc_word_t *vli, bitcount_t bit);\n\n/* Counts the number of bits required to represent vli. */\nbitcount_t mg_uecc_vli_numBits(const mg_uecc_word_t *vli,\n                               const wordcount_t max_words);\n\n/* Sets dest = src. */\nvoid mg_uecc_vli_set(mg_uecc_word_t *dest, const mg_uecc_word_t *src,\n                     wordcount_t num_words);\n\n/* Constant-time comparison function - secure way to compare long integers */\n/* Returns one if left == right, zero otherwise */\nmg_uecc_word_t mg_uecc_vli_equal(const mg_uecc_word_t *left,\n                                 const mg_uecc_word_t *right,\n                                 wordcount_t num_words);\n\n/* Constant-time comparison function - secure way to compare long integers */\n/* Returns sign of left - right, in constant time. */\ncmpresult_t mg_uecc_vli_cmp(const mg_uecc_word_t *left,\n                            const mg_uecc_word_t *right, wordcount_t num_words);\n\n/* Computes vli = vli >> 1. */\nvoid mg_uecc_vli_rshift1(mg_uecc_word_t *vli, wordcount_t num_words);\n\n/* Computes result = left + right, returning carry. Can modify in place. */\nmg_uecc_word_t mg_uecc_vli_add(mg_uecc_word_t *result,\n                               const mg_uecc_word_t *left,\n                               const mg_uecc_word_t *right,\n                               wordcount_t num_words);\n\n/* Computes result = left - right, returning borrow. Can modify in place. */\nmg_uecc_word_t mg_uecc_vli_sub(mg_uecc_word_t *result,\n                               const mg_uecc_word_t *left,\n                               const mg_uecc_word_t *right,\n                               wordcount_t num_words);\n\n/* Computes result = left * right. Result must be 2 * num_words long. */\nvoid mg_uecc_vli_mult(mg_uecc_word_t *result, const mg_uecc_word_t *left,\n                      const mg_uecc_word_t *right, wordcount_t num_words);\n\n/* Computes result = left^2. Result must be 2 * num_words long. */\nvoid mg_uecc_vli_square(mg_uecc_word_t *result, const mg_uecc_word_t *left,\n                        wordcount_t num_words);\n\n/* Computes result = (left + right) % mod.\n   Assumes that left < mod and right < mod, and that result does not overlap\n   mod. */\nvoid mg_uecc_vli_modAdd(mg_uecc_word_t *result, const mg_uecc_word_t *left,\n                        const mg_uecc_word_t *right, const mg_uecc_word_t *mod,\n                        wordcount_t num_words);\n\n/* Computes result = (left - right) % mod.\n   Assumes that left < mod and right < mod, and that result does not overlap\n   mod. */\nvoid mg_uecc_vli_modSub(mg_uecc_word_t *result, const mg_uecc_word_t *left,\n                        const mg_uecc_word_t *right, const mg_uecc_word_t *mod,\n                        wordcount_t num_words);\n\n/* Computes result = product % mod, where product is 2N words long.\n   Currently only designed to work for mod == curve->p or curve_n. */\nvoid mg_uecc_vli_mmod(mg_uecc_word_t *result, mg_uecc_word_t *product,\n                      const mg_uecc_word_t *mod, wordcount_t num_words);\n\n/* Calculates result = product (mod curve->p), where product is up to\n   2 * curve->num_words long. */\nvoid mg_uecc_vli_mmod_fast(mg_uecc_word_t *result, mg_uecc_word_t *product,\n                           MG_UECC_Curve curve);\n\n/* Computes result = (left * right) % mod.\n   Currently only designed to work for mod == curve->p or curve_n. */\nvoid mg_uecc_vli_modMult(mg_uecc_word_t *result, const mg_uecc_word_t *left,\n                         const mg_uecc_word_t *right, const mg_uecc_word_t *mod,\n                         wordcount_t num_words);\n\n/* Computes result = (left * right) % curve->p. */\nvoid mg_uecc_vli_modMult_fast(mg_uecc_word_t *result,\n                              const mg_uecc_word_t *left,\n                              const mg_uecc_word_t *right, MG_UECC_Curve curve);\n\n/* Computes result = left^2 % mod.\n   Currently only designed to work for mod == curve->p or curve_n. */\nvoid mg_uecc_vli_modSquare(mg_uecc_word_t *result, const mg_uecc_word_t *left,\n                           const mg_uecc_word_t *mod, wordcount_t num_words);\n\n/* Computes result = left^2 % curve->p. */\nvoid mg_uecc_vli_modSquare_fast(mg_uecc_word_t *result,\n                                const mg_uecc_word_t *left,\n                                MG_UECC_Curve curve);\n\n/* Computes result = (1 / input) % mod.*/\nvoid mg_uecc_vli_modInv(mg_uecc_word_t *result, const mg_uecc_word_t *input,\n                        const mg_uecc_word_t *mod, wordcount_t num_words);\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n/* Calculates a = sqrt(a) (mod curve->p) */\nvoid mg_uecc_vli_mod_sqrt(mg_uecc_word_t *a, MG_UECC_Curve curve);\n#endif\n\n/* Converts an integer in uECC native format to big-endian bytes. */\nvoid mg_uecc_vli_nativeToBytes(uint8_t *bytes, int num_bytes,\n                               const mg_uecc_word_t *native);\n/* Converts big-endian bytes to an integer in uECC native format. */\nvoid mg_uecc_vli_bytesToNative(mg_uecc_word_t *native, const uint8_t *bytes,\n                               int num_bytes);\n\nunsigned mg_uecc_curve_num_words(MG_UECC_Curve curve);\nunsigned mg_uecc_curve_num_bytes(MG_UECC_Curve curve);\nunsigned mg_uecc_curve_num_bits(MG_UECC_Curve curve);\nunsigned mg_uecc_curve_num_n_words(MG_UECC_Curve curve);\nunsigned mg_uecc_curve_num_n_bytes(MG_UECC_Curve curve);\nunsigned mg_uecc_curve_num_n_bits(MG_UECC_Curve curve);\n\nconst mg_uecc_word_t *mg_uecc_curve_p(MG_UECC_Curve curve);\nconst mg_uecc_word_t *mg_uecc_curve_n(MG_UECC_Curve curve);\nconst mg_uecc_word_t *mg_uecc_curve_G(MG_UECC_Curve curve);\nconst mg_uecc_word_t *mg_uecc_curve_b(MG_UECC_Curve curve);\n\nint mg_uecc_valid_point(const mg_uecc_word_t *point, MG_UECC_Curve curve);\n\n/* Multiplies a point by a scalar. Points are represented by the X coordinate\n   followed by the Y coordinate in the same array, both coordinates are\n   curve->num_words long. Note that scalar must be curve->num_n_words long (NOT\n   curve->num_words). */\nvoid mg_uecc_point_mult(mg_uecc_word_t *result, const mg_uecc_word_t *point,\n                        const mg_uecc_word_t *scalar, MG_UECC_Curve curve);\n\n/* Generates a random integer in the range 0 < random < top.\n   Both random and top have num_words words. */\nint mg_uecc_generate_random_int(mg_uecc_word_t *random,\n                                const mg_uecc_word_t *top,\n                                wordcount_t num_words);\n\n#endif /* MG_UECC_ENABLE_VLI_API */\n\n#ifdef __cplusplus\n} /* end of extern \"C\" */\n#endif\n\n#endif /* _UECC_VLI_H_ */\n\n// End of uecc BSD-2\n"
  },
  {
    "path": "src/tls_x25519.c",
    "content": "/**\n * Adapted from STROBE: https://strobe.sourceforge.io/\n * Copyright (c) 2015-2016 Cryptography Research, Inc.\n * Author: Mike Hamburg\n * License: MIT License\n */\n#include \"tls.h\"\n#include \"tls_x25519.h\"\n#include \"util.h\"\n\n#if MG_TLS == MG_TLS_BUILTIN\n\nconst uint8_t X25519_BASE_POINT[X25519_BYTES] = {9};\n\n#define X25519_WBITS 32\n\ntypedef uint32_t limb_t;\ntypedef uint64_t dlimb_t;\ntypedef int64_t sdlimb_t;\n\n#define NLIMBS (256 / X25519_WBITS)\ntypedef limb_t mg_fe[NLIMBS];\n\nstatic limb_t umaal(limb_t *carry, limb_t acc, limb_t mand, limb_t mier) {\n  dlimb_t tmp = (dlimb_t) mand * mier + acc + *carry;\n  *carry = (limb_t) (tmp >> X25519_WBITS);\n  return (limb_t) tmp;\n}\n\n// These functions are implemented in terms of umaal on ARM\nstatic limb_t adc(limb_t *carry, limb_t acc, limb_t mand) {\n  dlimb_t total = (dlimb_t) *carry + acc + mand;\n  *carry = (limb_t) (total >> X25519_WBITS);\n  return (limb_t) total;\n}\n\nstatic limb_t adc0(limb_t *carry, limb_t acc) {\n  dlimb_t total = (dlimb_t) *carry + acc;\n  *carry = (limb_t) (total >> X25519_WBITS);\n  return (limb_t) total;\n}\n\n// - Precondition: carry is small.\n// - Invariant: result of propagate is < 2^255 + 1 word\n// - In particular, always less than 2p.\n// - Also, output x >= min(x,19)\nstatic void propagate(mg_fe x, limb_t over) {\n  unsigned i;\n  limb_t carry;\n  over = x[NLIMBS - 1] >> (X25519_WBITS - 1) | over << 1;\n  x[NLIMBS - 1] &= ~((limb_t) 1 << (X25519_WBITS - 1));\n\n  carry = over * 19;\n  for (i = 0; i < NLIMBS; i++) {\n    x[i] = adc0(&carry, x[i]);\n  }\n}\n\nstatic void add(mg_fe out, const mg_fe a, const mg_fe b) {\n  unsigned i;\n  limb_t carry = 0;\n  for (i = 0; i < NLIMBS; i++) {\n    out[i] = adc(&carry, a[i], b[i]);\n  }\n  propagate(out, carry);\n}\n\nstatic void sub(mg_fe out, const mg_fe a, const mg_fe b) {\n  unsigned i;\n  sdlimb_t carry = -38;\n  for (i = 0; i < NLIMBS; i++) {\n    carry = carry + a[i] - b[i];\n    out[i] = (limb_t) carry;\n    carry >>= X25519_WBITS;\n  }\n  propagate(out, (limb_t) (1 + carry));\n}\n\n// `b` can contain less than 8 limbs, thus we use `limb_t *` instead of `mg_fe`\n// to avoid build warnings\nstatic void mul(mg_fe out, const mg_fe a, const limb_t *b, unsigned nb) {\n  limb_t accum[2 * NLIMBS] = {0};\n  unsigned i, j;\n\n  limb_t carry2;\n  for (i = 0; i < nb; i++) {\n    limb_t mand = b[i];\n    carry2 = 0;\n    for (j = 0; j < NLIMBS; j++) {\n      limb_t tmp;                        // \"a\" may be misaligned\n      memcpy(&tmp, &a[j], sizeof(tmp));  // So make an aligned copy\n      accum[i + j] = umaal(&carry2, accum[i + j], mand, tmp);\n    }\n    accum[i + j] = carry2;\n  }\n\n  carry2 = 0;\n  for (j = 0; j < NLIMBS; j++) {\n    out[j] = umaal(&carry2, accum[j], 38, accum[j + NLIMBS]);\n  }\n  propagate(out, carry2);\n}\n\nstatic void sqr(mg_fe out, const mg_fe a) {\n  mul(out, a, a, NLIMBS);\n}\nstatic void mul1(mg_fe out, const mg_fe a) {\n  mul(out, a, out, NLIMBS);\n}\nstatic void sqr1(mg_fe a) {\n  mul1(a, a);\n}\n\nstatic void condswap(limb_t a[2 * NLIMBS], limb_t b[2 * NLIMBS],\n                     limb_t doswap) {\n  unsigned i;\n  for (i = 0; i < 2 * NLIMBS; i++) {\n    limb_t xor_ab = (a[i] ^ b[i]) & doswap;\n    a[i] ^= xor_ab;\n    b[i] ^= xor_ab;\n  }\n}\n\n// Canonicalize a field element x, reducing it to the least residue which is\n// congruent to it mod 2^255-19\n// - Precondition: x < 2^255 + 1 word\nstatic limb_t canon(mg_fe x) {\n  // First, add 19.\n  unsigned i;\n  limb_t carry0 = 19;\n  limb_t res;\n  sdlimb_t carry;\n  for (i = 0; i < NLIMBS; i++) {\n    x[i] = adc0(&carry0, x[i]);\n  }\n  propagate(x, carry0);\n\n  // Here, 19 <= x2 < 2^255\n  // - This is because we added 19, so before propagate it can't be less\n  // than 19. After propagate, it still can't be less than 19, because if\n  // propagate does anything it adds 19.\n  // - We know that the high bit must be clear, because either the input was ~\n  // 2^255 + one word + 19 (in which case it propagates to at most 2 words) or\n  // it was < 2^255. So now, if we subtract 19, we will get back to something in\n  // [0,2^255-19).\n  carry = -19;\n  res = 0;\n  for (i = 0; i < NLIMBS; i++) {\n    carry += x[i];\n    res |= x[i] = (limb_t) carry;\n    carry >>= X25519_WBITS;\n  }\n  return (limb_t) (((dlimb_t) res - 1) >> X25519_WBITS);\n}\n\nstatic const limb_t a24[1] = {121665};\n\nstatic void ladder_part1(mg_fe xs[5]) {\n  limb_t *x2 = xs[0], *z2 = xs[1], *x3 = xs[2], *z3 = xs[3], *t1 = xs[4];\n  add(t1, x2, z2);                                 // t1 = A\n  sub(z2, x2, z2);                                 // z2 = B\n  add(x2, x3, z3);                                 // x2 = C\n  sub(z3, x3, z3);                                 // z3 = D\n  mul1(z3, t1);                                    // z3 = DA\n  mul1(x2, z2);                                    // x3 = BC\n  add(x3, z3, x2);                                 // x3 = DA+CB\n  sub(z3, z3, x2);                                 // z3 = DA-CB\n  sqr1(t1);                                        // t1 = AA\n  sqr1(z2);                                        // z2 = BB\n  sub(x2, t1, z2);                                 // x2 = E = AA-BB\n  mul(z2, x2, a24, sizeof(a24) / sizeof(a24[0]));  // z2 = E*a24\n  add(z2, z2, t1);                                 // z2 = E*a24 + AA\n}\n\nstatic void ladder_part2(mg_fe xs[5], const mg_fe x1) {\n  limb_t *x2 = xs[0], *z2 = xs[1], *x3 = xs[2], *z3 = xs[3], *t1 = xs[4];\n  sqr1(z3);         // z3 = (DA-CB)^2\n  mul1(z3, x1);     // z3 = x1 * (DA-CB)^2\n  sqr1(x3);         // x3 = (DA+CB)^2\n  mul1(z2, x2);     // z2 = AA*(E*a24+AA)\n  sub(x2, t1, x2);  // x2 = BB again\n  mul1(x2, t1);     // x2 = AA*BB\n}\n\nstatic void x25519_core(mg_fe xs[5], const uint8_t scalar[X25519_BYTES],\n                        const uint8_t *x1, int clamp) {\n  int i;\n  mg_fe x1_limbs;\n  limb_t swap = 0;\n  limb_t *x2 = xs[0], *x3 = xs[2], *z3 = xs[3];\n  memset(xs, 0, 4 * sizeof(mg_fe));\n  x2[0] = z3[0] = 1;\n  for (i = 0; i < NLIMBS; i++) {\n    x3[i] = x1_limbs[i] =\n        MG_U32(x1[i * 4 + 3], x1[i * 4 + 2], x1[i * 4 + 1], x1[i * 4]);\n  }\n\n  for (i = 255; i >= 0; i--) {\n    uint8_t bytei = scalar[i / 8];\n    limb_t doswap;\n    if (clamp) {\n      if (i / 8 == 0) {\n        bytei &= (uint8_t) ~7U;\n      } else if (i / 8 == X25519_BYTES - 1) {\n        bytei &= 0x7F;\n        bytei |= 0x40;\n      }\n    }\n    doswap = 0 - (limb_t) ((bytei >> (i % 8)) & 1);\n    condswap(x2, x3, swap ^ doswap);\n    swap = doswap;\n\n    ladder_part1(xs);\n    ladder_part2(xs, (const limb_t *) x1_limbs);\n  }\n  condswap(x2, x3, swap);\n}\n\nint mg_tls_x25519(uint8_t out[X25519_BYTES], const uint8_t scalar[X25519_BYTES],\n                  const uint8_t x1[X25519_BYTES], int clamp) {\n  int i, ret;\n  mg_fe xs[5], out_limbs;\n  limb_t *x2, *z2, *z3, *prev;\n  static const struct {\n    uint8_t a, c, n;\n  } steps[13] = {{2, 1, 1},  {2, 1, 1},  {4, 2, 3},  {2, 4, 6},  {3, 1, 1},\n                 {3, 2, 12}, {4, 3, 25}, {2, 3, 25}, {2, 4, 50}, {3, 2, 125},\n                 {3, 1, 2},  {3, 1, 2},  {3, 1, 1}};\n  x25519_core(xs, scalar, x1, clamp);\n\n  // Precomputed inversion chain\n  x2 = xs[0];\n  z2 = xs[1];\n  z3 = xs[3];\n\n  prev = z2;\n  for (i = 0; i < 13; i++) {\n    int j;\n    limb_t *a = xs[steps[i].a];\n    for (j = steps[i].n; j > 0; j--) {\n      sqr(a, prev);\n      prev = a;\n    }\n    mul1(a, xs[steps[i].c]);\n  }\n\n  // Here prev = z3\n  // x2 /= z2\n  mul(out_limbs, x2, z3, NLIMBS);\n  ret = (int) canon(out_limbs);\n  if (!clamp) ret = 0;\n  for (i = 0; i < NLIMBS; i++) {\n    uint32_t n = out_limbs[i];\n    out[i * 4] = (uint8_t) (n & 0xff);\n    out[i * 4 + 1] = (uint8_t) ((n >> 8) & 0xff);\n    out[i * 4 + 2] = (uint8_t) ((n >> 16) & 0xff);\n    out[i * 4 + 3] = (uint8_t) ((n >> 24) & 0xff);\n  }\n  return ret;\n}\n\n#endif\n"
  },
  {
    "path": "src/tls_x25519.h",
    "content": "#ifndef TLS_X15519_H\n#define TLS_X15519_H\n\n#include \"arch.h\"\n\n#define X25519_BYTES 32\nextern const uint8_t X25519_BASE_POINT[X25519_BYTES];\n\nint mg_tls_x25519(uint8_t out[X25519_BYTES], const uint8_t scalar[X25519_BYTES],\n                  const uint8_t x1[X25519_BYTES], int clamp);\n\n\n#endif /* TLS_X15519_H */\n"
  },
  {
    "path": "src/url.c",
    "content": "#include \"url.h\"\n\nstruct url {\n  size_t key, user, pass, host, port, uri, end;\n};\n\nint mg_url_is_ssl(const char *url) {\n  return strncmp(url, \"wss:\", 4) == 0 || strncmp(url, \"https:\", 6) == 0 ||\n         strncmp(url, \"mqtts:\", 6) == 0 || strncmp(url, \"ssl:\", 4) == 0 ||\n         strncmp(url, \"tls:\", 4) == 0 || strncmp(url, \"tcps:\", 5) == 0;\n}\n\nstatic struct url urlparse(const char *url) {\n  size_t i;\n  struct url u;\n  memset(&u, 0, sizeof(u));\n  for (i = 0; url[i] != '\\0'; i++) {\n    if (url[i] == '/' && i > 0 && u.host == 0 && url[i - 1] == '/') {\n      u.host = i + 1;\n      u.port = 0;\n    } else if (url[i] == ']') {\n      u.port = 0;  // IPv6 URLs, like http://[::1]/bar\n    } else if (url[i] == ':' && u.port == 0 && u.uri == 0) {\n      u.port = i + 1;\n    } else if (url[i] == '@' && u.user == 0 && u.pass == 0 && u.uri == 0) {\n      u.user = u.host;\n      u.pass = u.port;\n      u.host = i + 1;\n      u.port = 0;\n    } else if (url[i] == '/' && u.host && u.uri == 0) {\n      u.uri = i;\n    }\n  }\n  u.end = i;\n#if 0\n  printf(\"[%s] %d %d %d %d %d\\n\", url, u.user, u.pass, u.host, u.port, u.uri);\n#endif\n  return u;\n}\n\nstruct mg_str mg_url_host(const char *url) {\n  struct url u = urlparse(url);\n  size_t n = u.port  ? u.port - u.host - 1\n             : u.uri ? u.uri - u.host\n                     : u.end - u.host;\n  struct mg_str s = mg_str_n(url + u.host, n);\n  return s;\n}\n\nconst char *mg_url_uri(const char *url) {\n  struct url u = urlparse(url);\n  return u.uri ? url + u.uri : \"/\";\n}\n\nunsigned short mg_url_port(const char *url) {\n  struct url u = urlparse(url);\n  unsigned short port = 0;\n  if (strncmp(url, \"http:\", 5) == 0 || strncmp(url, \"ws:\", 3) == 0) port = 80;\n  if (strncmp(url, \"wss:\", 4) == 0 || strncmp(url, \"https:\", 6) == 0)\n    port = 443;\n  if (strncmp(url, \"mqtt:\", 5) == 0) port = 1883;\n  if (strncmp(url, \"mqtts:\", 6) == 0) port = 8883;\n  if (u.port) port = (unsigned short) atoi(url + u.port);\n  return port;\n}\n\nstruct mg_str mg_url_user(const char *url) {\n  struct url u = urlparse(url);\n  struct mg_str s = mg_str(\"\");\n  if (u.user && (u.pass || u.host)) {\n    size_t n = u.pass ? u.pass - u.user - 1 : u.host - u.user - 1;\n    s = mg_str_n(url + u.user, n);\n  }\n  return s;\n}\n\nstruct mg_str mg_url_pass(const char *url) {\n  struct url u = urlparse(url);\n  struct mg_str s = mg_str_n(\"\", 0UL);\n  if (u.pass && u.host) {\n    size_t n = u.host - u.pass - 1;\n    s = mg_str_n(url + u.pass, n);\n  }\n  return s;\n}\n"
  },
  {
    "path": "src/url.h",
    "content": "#pragma once\n#include \"str.h\"\n\nunsigned short mg_url_port(const char *url);\nint mg_url_is_ssl(const char *url);\nstruct mg_str mg_url_host(const char *url);\nstruct mg_str mg_url_user(const char *url);\nstruct mg_str mg_url_pass(const char *url);\nconst char *mg_url_uri(const char *url);\n"
  },
  {
    "path": "src/util.c",
    "content": "#include \"util.h\"\n#include \"log.h\"\n\n// Not using memset for zeroing memory, cause it can be dropped by compiler\n// See https://github.com/cesanta/mongoose/pull/1265\nvoid mg_bzero(volatile unsigned char *buf, size_t len) {\n  if (buf != NULL) {\n    while (len--) *buf++ = 0;\n  }\n}\n\n#if MG_ENABLE_CUSTOM_RANDOM\n#else\nbool mg_random(void *buf, size_t len) {\n  bool success = false;\n  unsigned char *p = (unsigned char *) buf;\n#if MG_ARCH == MG_ARCH_ESP32\n  while (len--) *p++ = (unsigned char) (esp_random() & 255);\n  success = true;\n#elif MG_ARCH == MG_ARCH_CUBE && defined(HAL_RNG_MODULE_ENABLED)\n  extern RNG_HandleTypeDef hrng;\n  for (size_t n = 0; n < len; n += sizeof(uint32_t)) {\n    uint32_t r = HAL_RNG_ReadLastRandomNumber(&hrng);\n    memcpy((char *) buf + n, &r, n + sizeof(r) > len ? len - n : sizeof(r));\n  }\n  success = true;\n#elif MG_ARCH == MG_ARCH_PICOSDK\n  while (len--) *p++ = (unsigned char) (get_rand_32() & 255);\n  success = true;\n#elif MG_ARCH == MG_ARCH_ZEPHYR\n#if MG_TLS == MG_TLS_BUILTIN ||                                    \\\n    (MG_TLS == MG_TLS_MBED && (!defined(MBEDTLS_VERSION_NUMBER) || \\\n                               MBEDTLS_VERSION_NUMBER < 0x04000000))\n  return (sys_csrand_get(buf, len) == 0);  // do not fallback on reseed error\n#else\n  sys_rand_get(buf, len);\n  success = true;\n#endif\n#elif MG_ARCH == MG_ARCH_WIN32\n#if defined(_MSC_VER) && _MSC_VER < 1700\n  static bool initialised = false;\n  static HCRYPTPROV hProv;\n  // CryptGenRandom() implementation earlier than 2008 is weak, see\n  // https://en.wikipedia.org/wiki/CryptGenRandom\n  if (!initialised) {\n    initialised = CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,\n                                      CRYPT_VERIFYCONTEXT);\n  }\n  if (initialised) success = CryptGenRandom(hProv, len, p);\n#else\n  size_t i;\n  for (i = 0; i < len; i++) {\n    unsigned int rand_v;\n    if (rand_s(&rand_v) == 0) {\n      p[i] = (unsigned char) (rand_v & 255);\n    } else {\n      break;\n    }\n  }\n  success = (i == len);\n#endif\n\n#elif MG_ARCH == MG_ARCH_UNIX\n  FILE *fp = fopen(\"/dev/urandom\", \"rb\");\n  if (fp != NULL) {\n    if (fread(buf, 1, len, fp) == len) success = true;\n    fclose(fp);\n  }\n#endif\n  // If everything above did not work, fallback to a pseudo random generator\n  if (success == false) {\n    MG_ERROR((\"Weak RNG: using rand()\"));\n    while (len--) *p++ = (unsigned char) (rand() & 255);\n  }\n  return success;\n}\n#endif\n\nchar *mg_random_str(char *buf, size_t len) {\n  size_t i;\n  mg_random(buf, len);\n  for (i = 0; i < len; i++) {\n    uint8_t c = ((uint8_t *) buf)[i] % 62U;\n    buf[i] = i == len - 1 ? (char) '\\0'            // 0-terminate last byte\n             : c < 26     ? (char) ('a' + c)       // lowercase\n             : c < 52     ? (char) ('A' + c - 26)  // uppercase\n                          : (char) ('0' + c - 52);     // numeric\n  }\n  return buf;\n}\n\nuint32_t mg_crc32(uint32_t crc, const char *buf, size_t len) {\n  static const uint32_t crclut[16] = {\n      // table for polynomial 0xEDB88320 (reflected)\n      0x00000000, 0x1DB71064, 0x3B6E20C8, 0x26D930AC, 0x76DC4190, 0x6B6B51F4,\n      0x4DB26158, 0x5005713C, 0xEDB88320, 0xF00F9344, 0xD6D6A3E8, 0xCB61B38C,\n      0x9B64C2B0, 0x86D3D2D4, 0xA00AE278, 0xBDBDF21C};\n  crc = ~crc;\n  while (len--) {\n    uint8_t b = *(uint8_t *) buf++;\n    crc = crclut[(crc ^ b) & 0x0F] ^ (crc >> 4);\n    crc = crclut[(crc ^ (b >> 4)) & 0x0F] ^ (crc >> 4);\n  }\n  return ~crc;\n}\n\nstatic int isbyte(int n) {\n  return n >= 0 && n <= 255;\n}\n\nstatic int parse_net(const char *spec, uint32_t *net, uint32_t *mask) {\n  int n, a, b, c, d, slash = 32, len = 0;\n  if ((sscanf(spec, \"%d.%d.%d.%d/%d%n\", &a, &b, &c, &d, &slash, &n) == 5 ||\n       sscanf(spec, \"%d.%d.%d.%d%n\", &a, &b, &c, &d, &n) == 4) &&\n      isbyte(a) && isbyte(b) && isbyte(c) && isbyte(d) && slash >= 0 &&\n      slash < 33) {\n    len = n;\n    *net = ((uint32_t) a << 24) | ((uint32_t) b << 16) | ((uint32_t) c << 8) |\n           (uint32_t) d;\n    *mask = slash ? (uint32_t) (0xffffffffU << (32 - slash)) : (uint32_t) 0;\n  }\n  return len;\n}\n\nint mg_check_ip_acl(struct mg_str acl, struct mg_addr *remote_ip) {\n  struct mg_str entry;\n  int allowed = acl.len == 0 ? '+' : '-';  // If any ACL is set, deny by default\n  uint32_t remote_ip4;\n  if (remote_ip->is_ip6) {\n    return -1;  // TODO(): handle IPv6 ACL and addresses\n  } else {      // IPv4\n    memcpy((void *) &remote_ip4, remote_ip->addr.ip, sizeof(remote_ip4));\n    while (mg_span(acl, &entry, &acl, ',')) {\n      uint32_t net, mask;\n      if (entry.buf[0] != '+' && entry.buf[0] != '-') return -1;\n      if (parse_net(&entry.buf[1], &net, &mask) == 0) return -2;\n      if ((mg_ntohl(remote_ip4) & mask) == net) allowed = entry.buf[0];\n    }\n  }\n  return allowed == '+';\n}\n\nbool mg_path_is_sane(const struct mg_str path) {\n  const char *s = path.buf;\n  size_t n = path.len;\n  if (path.buf[0] == '~') return false;                        // Starts with ~\n  if (path.buf[0] == '.' && path.buf[1] == '.') return false;  // Starts with ..\n  for (; s[0] != '\\0' && n > 0; s++, n--) {\n    if ((s[0] == '/' || s[0] == '\\\\') && n >= 2) {   // Subdir?\n      if (s[1] == '.' && s[2] == '.') return false;  // Starts with ..\n    }\n  }\n  return true;\n}\n\n#if MG_ENABLE_CUSTOM_MILLIS\n#else\nuint64_t mg_millis(void) {\n#if MG_ARCH == MG_ARCH_WIN32\n  return GetTickCount();\n#elif MG_ARCH == MG_ARCH_PICOSDK\n  return time_us_64() / 1000;\n#elif MG_ARCH == MG_ARCH_ESP8266 || MG_ARCH == MG_ARCH_ESP32 || \\\n    MG_ARCH == MG_ARCH_FREERTOS\n  return xTaskGetTickCount() * portTICK_PERIOD_MS;\n#elif MG_ARCH == MG_ARCH_CUBE\n  return (uint64_t) HAL_GetTick();\n#elif MG_ARCH == MG_ARCH_THREADX\n  return tx_time_get() * (1000 /* MS per SEC */ / TX_TIMER_TICKS_PER_SECOND);\n#elif MG_ARCH == MG_ARCH_TIRTOS\n  return (uint64_t) Clock_getTicks();\n#elif MG_ARCH == MG_ARCH_ZEPHYR\n  return (uint64_t) k_uptime_get();\n#elif MG_ARCH == MG_ARCH_CMSIS_RTOS1\n  return (uint64_t) rt_time_get();\n#elif MG_ARCH == MG_ARCH_CMSIS_RTOS2\n  return (uint64_t) ((osKernelGetTickCount() * 1000) / osKernelGetTickFreq());\n#elif MG_ARCH == MG_ARCH_RTTHREAD\n  return (uint64_t) ((rt_tick_get() * 1000) / RT_TICK_PER_SECOND);\n#elif MG_ARCH == MG_ARCH_UNIX && defined(__APPLE__)\n  // Apple CLOCK_MONOTONIC_RAW is equivalent to CLOCK_BOOTTIME on linux\n  // Apple CLOCK_UPTIME_RAW is equivalent to CLOCK_MONOTONIC_RAW on linux\n  return clock_gettime_nsec_np(CLOCK_UPTIME_RAW) / 1000000;\n#elif MG_ARCH == MG_ARCH_UNIX\n  struct timespec ts = {0, 0};\n  // See #1615 - prefer monotonic clock\n#if defined(CLOCK_MONOTONIC_RAW)\n  // Raw hardware-based time that is not subject to NTP adjustment\n  clock_gettime(CLOCK_MONOTONIC_RAW, &ts);\n#elif defined(CLOCK_MONOTONIC)\n  // Affected by the incremental adjustments performed by adjtime and NTP\n  clock_gettime(CLOCK_MONOTONIC, &ts);\n#else\n  // Affected by discontinuous jumps in the system time and by the incremental\n  // adjustments performed by adjtime and NTP\n  clock_gettime(CLOCK_REALTIME, &ts);\n#endif\n  return ((uint64_t) ts.tv_sec * 1000 + (uint64_t) ts.tv_nsec / 1000000);\n#elif defined(ARDUINO)\n  return (uint64_t) millis();\n#else\n  return (uint64_t) (time(NULL) * 1000);\n#endif\n}\n#endif\n\n// network format equates big endian order\nuint16_t mg_ntohs(uint16_t net) {\n  return MG_LOAD_BE16(&net);\n}\n\nuint32_t mg_ntohl(uint32_t net) {\n  return MG_LOAD_BE32(&net);\n}\n\nuint64_t mg_ntohll(uint64_t net) {\n  return MG_LOAD_BE64(&net);\n}\n\nvoid mg_delayms(unsigned int ms) {\n  uint64_t to = mg_millis() + ms + 1;\n  while (mg_millis() < to) (void) 0;\n}\n\n#if MG_ENABLE_CUSTOM_CALLOC\n#else\nvoid *mg_calloc(size_t count, size_t size) {\n  return calloc(count, size);\n}\n\nvoid mg_free(void *ptr) {\n  free(ptr);\n}\n#endif\n"
  },
  {
    "path": "src/util.h",
    "content": "#pragma once\n\n#include \"arch.h\"\n#include \"config.h\"\n#include \"net.h\"\n#include \"str.h\"\n\n#if MG_ENABLE_ASSERT\n#include <assert.h>\n#elif !defined(assert)\n#define assert(x)\n#endif\n\nvoid *mg_calloc(size_t count, size_t size);\nvoid mg_free(void *ptr);\nvoid mg_bzero(volatile unsigned char *buf, size_t len);\nbool mg_random(void *buf, size_t len);\nchar *mg_random_str(char *buf, size_t len);\nuint32_t mg_crc32(uint32_t crc, const char *buf, size_t len);\nuint64_t mg_millis(void);  // Return milliseconds since boot\nbool mg_path_is_sane(const struct mg_str path);\nvoid mg_delayms(unsigned int ms);\n\n#define MG_U32(a, b, c, d)                                         \\\n  (((uint32_t) ((a) &255) << 24) | ((uint32_t) ((b) &255) << 16) | \\\n   ((uint32_t) ((c) &255) << 8) | (uint32_t) ((d) &255))\n\n#define MG_IPV4(a, b, c, d) mg_htonl(MG_U32(a, b, c, d))\n\n#define MG_IPV6(a, b, c, d, e, f, g ,h) \\\n  { (uint8_t)((a)>>8),(uint8_t)(a), \\\n    (uint8_t)((b)>>8),(uint8_t)(b), \\\n    (uint8_t)((c)>>8),(uint8_t)(c), \\\n    (uint8_t)((d)>>8),(uint8_t)(d), \\\n    (uint8_t)((e)>>8),(uint8_t)(e), \\\n    (uint8_t)((f)>>8),(uint8_t)(f), \\\n    (uint8_t)((g)>>8),(uint8_t)(g), \\\n    (uint8_t)((h)>>8),(uint8_t)(h) }\n\n// For printing IPv4 addresses: printf(\"%d.%d.%d.%d\\n\", MG_IPADDR_PARTS(&ip))\n#define MG_U8P(ADDR) ((uint8_t *) (ADDR))\n#define MG_IPADDR_PARTS(ADDR) \\\n  MG_U8P(ADDR)[0], MG_U8P(ADDR)[1], MG_U8P(ADDR)[2], MG_U8P(ADDR)[3]\n\n#define MG_LOAD_BE16(p) \\\n  ((uint16_t) (((uint16_t) MG_U8P(p)[0] << 8U) | MG_U8P(p)[1]))\n#define MG_LOAD_BE24(p)                           \\\n  ((uint32_t) (((uint32_t) MG_U8P(p)[0] << 16U) | \\\n               ((uint32_t) MG_U8P(p)[1] << 8U) | MG_U8P(p)[2]))\n#define MG_LOAD_BE32(p)                           \\\n  ((uint32_t) (((uint32_t) MG_U8P(p)[0] << 24U) | \\\n               ((uint32_t) MG_U8P(p)[1] << 16U) | \\\n               ((uint32_t) MG_U8P(p)[2] << 8U) | MG_U8P(p)[3]))\n#define MG_LOAD_BE64(p)                           \\\n  ((uint64_t) (((uint64_t) MG_U8P(p)[0] << 56U) | \\\n               ((uint64_t) MG_U8P(p)[1] << 48U) | \\\n               ((uint64_t) MG_U8P(p)[2] << 40U) | \\\n               ((uint64_t) MG_U8P(p)[3] << 32U) | \\\n               ((uint64_t) MG_U8P(p)[4] << 24U) | \\\n               ((uint64_t) MG_U8P(p)[5] << 16U) | \\\n               ((uint64_t) MG_U8P(p)[6] << 8U) | MG_U8P(p)[7]))\n#define MG_STORE_BE16(p, n)           \\\n  do {                                \\\n    MG_U8P(p)[0] = ((n) >> 8U) & 255; \\\n    MG_U8P(p)[1] = (n) &255;          \\\n  } while (0)\n#define MG_STORE_BE24(p, n)            \\\n  do {                                 \\\n    MG_U8P(p)[0] = ((n) >> 16U) & 255; \\\n    MG_U8P(p)[1] = ((n) >> 8U) & 255;  \\\n    MG_U8P(p)[2] = (n) &255;           \\\n  } while (0)\n#define MG_STORE_BE32(p, n)            \\\n  do {                                 \\\n    MG_U8P(p)[0] = ((n) >> 24U) & 255; \\\n    MG_U8P(p)[1] = ((n) >> 16U) & 255; \\\n    MG_U8P(p)[2] = ((n) >> 8U) & 255;  \\\n    MG_U8P(p)[3] = (n) &255;           \\\n  } while (0)\n#define MG_STORE_BE64(p, n)            \\\n  do {                                 \\\n    MG_U8P(p)[0] = ((n) >> 56U) & 255; \\\n    MG_U8P(p)[1] = ((n) >> 48U) & 255; \\\n    MG_U8P(p)[2] = ((n) >> 40U) & 255; \\\n    MG_U8P(p)[3] = ((n) >> 32U) & 255; \\\n    MG_U8P(p)[4] = ((n) >> 24U) & 255; \\\n    MG_U8P(p)[5] = ((n) >> 16U) & 255; \\\n    MG_U8P(p)[6] = ((n) >> 8U) & 255;  \\\n    MG_U8P(p)[7] = (n) &255;           \\\n  } while (0)\n\nuint16_t mg_ntohs(uint16_t net);\nuint32_t mg_ntohl(uint32_t net);\nuint64_t mg_ntohll(uint64_t net);\n#define mg_htons(x) mg_ntohs(x)\n#define mg_htonl(x) mg_ntohl(x)\n#define mg_htonll(x) mg_ntohll(x)\n\n#define MG_REG(x) ((volatile uint32_t *) (x))[0]\n#define MG_BIT(x) (((uint32_t) 1U) << (x))\n#define MG_SET_BITS(R, CLRMASK, SETMASK) (R) = ((R) & ~(CLRMASK)) | (SETMASK)\n\n#define MG_ROUND_UP(x, a) ((a) == 0 ? (x) : ((((x) + (a) -1) / (a)) * (a)))\n#define MG_ROUND_DOWN(x, a) ((a) == 0 ? (x) : (((x) / (a)) * (a)))\n\n#if defined(__GNUC__) && defined(__arm__)\n#ifdef __ZEPHYR__\n#define MG_ARM_DISABLE_IRQ() __asm__ __volatile__(\"cpsid i\" : : : \"memory\")\n#define MG_ARM_ENABLE_IRQ() __asm__ __volatile__(\"cpsie i\" : : : \"memory\")\n#else\n#define MG_ARM_DISABLE_IRQ() asm volatile(\"cpsid i\" : : : \"memory\")\n#define MG_ARM_ENABLE_IRQ() asm volatile(\"cpsie i\" : : : \"memory\")\n#endif // !ZEPHYR\n#elif defined(__CCRH__)\n#define MG_RH850_DISABLE_IRQ() __DI()\n#define MG_RH850_ENABLE_IRQ() __EI()\n#else\n#define MG_ARM_DISABLE_IRQ()\n#define MG_ARM_ENABLE_IRQ()\n#endif\n\n#if defined(__CC_ARM)\n#define MG_DSB() __dsb(0xf)\n#elif defined(__ARMCC_VERSION)\n#define MG_DSB() __builtin_arm_dsb(0xf)\n#elif defined(__GNUC__) && defined(__arm__) && defined(__thumb__)\n#ifdef __ZEPHYR__\n#define MG_DSB() __asm__(\"DSB 0xf\")\n#else\n#define MG_DSB() asm(\"DSB 0xf\")\n#endif // !ZEPHYR\n#elif defined(__ICCARM__)\n#define MG_DSB() __iar_builtin_DSB()\n#else\n#define MG_DSB()\n#endif\n\nstruct mg_addr;\nint mg_check_ip_acl(struct mg_str acl, struct mg_addr *remote_ip);\n\n// Linked list management macros\n#define LIST_ADD_HEAD(type_, head_, elem_) \\\n  do {                                     \\\n    (elem_)->next = (*head_);              \\\n    *(head_) = (elem_);                    \\\n  } while (0)\n\n#define LIST_ADD_TAIL(type_, head_, elem_) \\\n  do {                                     \\\n    type_ **h = head_;                     \\\n    while (*h != NULL) h = &(*h)->next;    \\\n    *h = (elem_);                          \\\n  } while (0)\n\n#define LIST_DELETE(type_, head_, elem_)   \\\n  do {                                     \\\n    type_ **h = head_;                     \\\n    while (*h != (elem_)) h = &(*h)->next; \\\n    *h = (elem_)->next;                    \\\n  } while (0)\n"
  },
  {
    "path": "src/version.h",
    "content": "#define MG_VERSION \"7.20\"\n"
  },
  {
    "path": "src/wifi.h",
    "content": "#pragma once\n\n#include \"arch.h\"\n#include \"log.h\"\n#include \"str.h\"\n\nstruct mg_wifi_data {\n  char *ssid, *pass;      // STA mode, SSID to connect to\n  char *apssid, *appass;  // AP mode, our SSID\n  uint32_t apip, apmask;  // AP mode, our IP address and mask\n  uint8_t security;       // STA mode, TBD\n  uint8_t apsecurity;     // AP mode, TBD\n  uint8_t apchannel;      // AP mode, channel to use\n  bool apmode;  // start in AP mode; 'false' -> connect to 'ssid' != NULL\n};\n\nstruct mg_wifi_scan_bss_data {\n  struct mg_str SSID;\n  char *BSSID;\n  int16_t RSSI;\n  uint8_t security;\n#define MG_WIFI_SECURITY_OPEN 0\n#define MG_WIFI_SECURITY_WEP MG_BIT(0)\n#define MG_WIFI_SECURITY_WPA MG_BIT(1)\n#define MG_WIFI_SECURITY_WPA2 MG_BIT(2)\n#define MG_WIFI_SECURITY_WPA3 MG_BIT(3)\n  uint8_t channel;\n  unsigned band : 2;\n#define MG_WIFI_BAND_2G 0\n#define MG_WIFI_BAND_5G 1\n  unsigned has_n : 1;\n};\n\nbool mg_wifi_scan(void);\nbool mg_wifi_connect(struct mg_wifi_data *);\nbool mg_wifi_disconnect(void);\nbool mg_wifi_ap_start(struct mg_wifi_data *);\nbool mg_wifi_ap_stop(void);\n"
  },
  {
    "path": "src/wifi_dummy.c",
    "content": "#include \"wifi.h\"\n\n#if (!defined(MG_ENABLE_DRIVER_PICO_W) || !MG_ENABLE_DRIVER_PICO_W) && \\\n    (!defined(MG_ENABLE_DRIVER_CYW) || !MG_ENABLE_DRIVER_CYW) && \\\n    (!defined(MG_ENABLE_DRIVER_CYW_SDIO) || !MG_ENABLE_DRIVER_CYW_SDIO) && \\\n    (!defined(MG_ENABLE_DRIVER_NXP_WIFI) || !MG_ENABLE_DRIVER_NXP_WIFI) && \\\n    (!defined(MG_ENABLE_DRIVER_ST67W6) || !MG_ENABLE_DRIVER_ST67W6)\n\n\nbool mg_wifi_scan(void) {\n  MG_ERROR((\"No Wi-Fi driver enabled\"));\n  return false;\n}\n\nbool mg_wifi_connect(struct mg_wifi_data *wifi) {\n  (void) wifi;\n  return mg_wifi_scan();\n}\n\nbool mg_wifi_disconnect(void) {\n  return mg_wifi_scan();\n}\n\nbool mg_wifi_ap_start(struct mg_wifi_data *wifi) {\n  (void) wifi;\n  return mg_wifi_scan();\n}\n\nbool mg_wifi_ap_stop(void) {\n  return mg_wifi_scan();\n}\n\n#endif\n"
  },
  {
    "path": "src/ws.c",
    "content": "#include \"ws.h\"\n\n#include \"base64.h\"\n#include \"fmt.h\"\n#include \"http.h\"\n#include \"log.h\"\n#include \"printf.h\"\n#include \"sha1.h\"\n#include \"url.h\"\n#include \"util.h\"\n\nstruct ws_msg {\n  uint8_t flags;\n  size_t header_len;\n  size_t data_len;\n};\n\nsize_t mg_ws_vprintf(struct mg_connection *c, int op, const char *fmt,\n                     va_list *ap) {\n  size_t len = c->send.len;\n  size_t n = mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, ap);\n  mg_ws_wrap(c, c->send.len - len, op);\n  return n;\n}\n\nsize_t mg_ws_printf(struct mg_connection *c, int op, const char *fmt, ...) {\n  size_t len = 0;\n  va_list ap;\n  va_start(ap, fmt);\n  len = mg_ws_vprintf(c, op, fmt, &ap);\n  va_end(ap);\n  return len;\n}\n\nstatic void ws_handshake(struct mg_connection *c, const struct mg_str *wskey,\n                         const struct mg_str *wsproto, const char *fmt,\n                         va_list *ap) {\n  const char *magic = \"258EAFA5-E914-47DA-95CA-C5AB0DC85B11\";\n  unsigned char sha[20], b64_sha[30];\n\n  mg_sha1_ctx sha_ctx;\n  mg_sha1_init(&sha_ctx);\n  mg_sha1_update(&sha_ctx, (unsigned char *) wskey->buf, wskey->len);\n  mg_sha1_update(&sha_ctx, (unsigned char *) magic, 36);\n  mg_sha1_final(sha, &sha_ctx);\n  mg_base64_encode(sha, sizeof(sha), (char *) b64_sha, sizeof(b64_sha));\n  mg_xprintf(mg_pfn_iobuf, &c->send,\n             \"HTTP/1.1 101 Switching Protocols\\r\\n\"\n             \"Upgrade: websocket\\r\\n\"\n             \"Connection: Upgrade\\r\\n\"\n             \"Sec-WebSocket-Accept: %s\\r\\n\",\n             b64_sha);\n  if (fmt != NULL) mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, ap);\n  if (wsproto != NULL) {\n    mg_printf(c, \"Sec-WebSocket-Protocol: %.*s\\r\\n\", (int) wsproto->len,\n              wsproto->buf);\n  }\n  if (!mg_send(c, \"\\r\\n\", 2)) mg_error(c, \"OOM\");\n}\n\nstatic uint32_t be32(const uint8_t *p) {\n  return (((uint32_t) p[3]) << 0) | (((uint32_t) p[2]) << 8) |\n         (((uint32_t) p[1]) << 16) | (((uint32_t) p[0]) << 24);\n}\n\nstatic size_t ws_process(uint8_t *buf, size_t len, struct ws_msg *msg) {\n  size_t i, n = 0, mask_len = 0;\n  memset(msg, 0, sizeof(*msg));\n  if (len >= 2) {\n    n = buf[1] & 0x7f;                // Frame length\n    mask_len = buf[1] & 128 ? 4 : 0;  // last bit is a mask bit\n    msg->flags = buf[0];\n    if (n < 126 && len >= mask_len) {\n      msg->data_len = n;\n      msg->header_len = 2 + mask_len;\n    } else if (n == 126 && len >= 4 + mask_len) {\n      msg->header_len = 4 + mask_len;\n      msg->data_len = (((size_t) buf[2]) << 8) | buf[3];\n    } else if (len >= 10 + mask_len) {\n      msg->header_len = 10 + mask_len;\n      msg->data_len =\n          (size_t) (((uint64_t) be32(buf + 2) << 32) + be32(buf + 6));\n    }\n  }\n  // Sanity check, and integer overflow protection for the boundary check below\n  // data_len should not be larger than 1 Gb\n  if (msg->data_len > 1024 * 1024 * 1024) return 0;\n  if (msg->header_len + msg->data_len > len) return 0;\n  if (mask_len > 0) {\n    uint8_t *p = buf + msg->header_len, *m = p - mask_len;\n    for (i = 0; i < msg->data_len; i++) p[i] ^= m[i & 3];\n  }\n  return msg->header_len + msg->data_len;\n}\n\nstatic size_t mkhdr(size_t len, int op, bool is_client, uint8_t *buf) {\n  size_t n = 0;\n  buf[0] = (uint8_t) (op | 128);\n  if (len < 126) {\n    buf[1] = (unsigned char) len;\n    n = 2;\n  } else if (len < 65536) {\n    uint16_t tmp = mg_htons((uint16_t) len);\n    buf[1] = 126;\n    memcpy(&buf[2], &tmp, sizeof(tmp));\n    n = 4;\n  } else {\n    uint32_t tmp;\n    buf[1] = 127;\n    tmp = mg_htonl((uint32_t) (((uint64_t) len) >> 32));\n    memcpy(&buf[2], &tmp, sizeof(tmp));\n    tmp = mg_htonl((uint32_t) (len & 0xffffffffU));\n    memcpy(&buf[6], &tmp, sizeof(tmp));\n    n = 10;\n  }\n  if (is_client) {\n    buf[1] |= 1 << 7;  // Set masking flag\n    mg_random(&buf[n], 4);\n    n += 4;\n  }\n  return n;\n}\n\nstatic void mg_ws_mask(struct mg_connection *c, size_t len) {\n  if (c->is_client && c->send.buf != NULL) {\n    size_t i;\n    uint8_t *p = c->send.buf + c->send.len - len, *mask = p - 4;\n    for (i = 0; i < len; i++) p[i] ^= mask[i & 3];\n  }\n}\n\nsize_t mg_ws_send(struct mg_connection *c, const void *buf, size_t len,\n                  int op) {\n  uint8_t header[14];\n  size_t header_len = mkhdr(len, op, c->is_client, header);\n  if (!mg_send(c, header, header_len)) return 0;\n  if (!mg_send(c, buf, len)) return header_len;\n  MG_VERBOSE((\"WS out: %d [%.*s]\", (int) len, (int) len, buf));\n  mg_ws_mask(c, len);\n  return header_len + len;\n}\n\nstatic bool mg_ws_client_handshake(struct mg_connection *c) {\n  int n = mg_http_get_request_len(c->recv.buf, c->recv.len);\n  if (n < 0) {\n    mg_error(c, \"not http\");  // Some just, not an HTTP request\n  } else if (n > 0) {\n    if (n < 15 || memcmp(c->recv.buf + 9, \"101\", 3) != 0) {\n      mg_error(c, \"ws handshake error\");\n    } else {\n      struct mg_http_message hm;\n      if (mg_http_parse((char *) c->recv.buf, c->recv.len, &hm)) {\n        c->is_websocket = 1;\n        mg_call(c, MG_EV_WS_OPEN, &hm);\n      } else {\n        mg_error(c, \"ws handshake error\");\n      }\n    }\n    mg_iobuf_del(&c->recv, 0, (size_t) n);\n  } else {\n    return true;  // Request is not yet received, quit event handler\n  }\n  return false;  // Continue event handler\n}\n\nstatic void mg_ws_cb(struct mg_connection *c, int ev, void *ev_data) {\n  struct ws_msg msg;\n  size_t ofs = (size_t) c->pfn_data;\n\n  // assert(ofs < c->recv.len);\n  if (ev == MG_EV_READ) {\n    if (c->is_client && !c->is_websocket && mg_ws_client_handshake(c)) return;\n\n    while (ws_process(c->recv.buf + ofs, c->recv.len - ofs, &msg) > 0) {\n      char *s = (char *) c->recv.buf + ofs + msg.header_len;\n      struct mg_ws_message m;\n      size_t len;\n      uint8_t final, op;\n      m.data.buf = s, m.data.len = msg.data_len, m.flags = msg.flags;\n      len = msg.header_len + msg.data_len;\n      final = msg.flags & 128;\n      op = msg.flags & 15;\n      // MG_VERBOSE (\"fin %d op %d len %d [%.*s]\", final, op,\n      //                       (int) m.data.len, (int) m.data.len, m.data.buf));\n      switch (op) {\n        case WEBSOCKET_OP_CONTINUE:\n          mg_call(c, MG_EV_WS_CTL, &m);\n          break;\n        case WEBSOCKET_OP_PING:\n          MG_DEBUG((\"%s\", \"WS PONG\"));\n          mg_ws_send(c, s, msg.data_len, WEBSOCKET_OP_PONG);\n          mg_call(c, MG_EV_WS_CTL, &m);\n          break;\n        case WEBSOCKET_OP_PONG:\n          mg_call(c, MG_EV_WS_CTL, &m);\n          break;\n        case WEBSOCKET_OP_TEXT:\n        case WEBSOCKET_OP_BINARY:\n          if (final) mg_call(c, MG_EV_WS_MSG, &m);\n          break;\n        case WEBSOCKET_OP_CLOSE:\n          MG_DEBUG((\"%lu WS CLOSE\", c->id));\n          mg_call(c, MG_EV_WS_CTL, &m);\n          // Echo the payload of the received CLOSE message back to the sender\n          mg_ws_send(c, m.data.buf, m.data.len, WEBSOCKET_OP_CLOSE);\n          c->is_draining = 1;\n          break;\n        default:\n          // Per RFC6455, close conn when an unknown op is recvd\n          mg_error(c, \"unknown WS op %d\", op);\n          break;\n      }\n\n      // Handle fragmented frames: strip header, keep in c->recv\n      if (final == 0 || op == 0) {\n        if (op) ofs++, len--, msg.header_len--;       // First frame\n        mg_iobuf_del(&c->recv, ofs, msg.header_len);  // Strip header\n        len -= msg.header_len;\n        ofs += len;\n        c->pfn_data = (void *) ofs;\n        // MG_INFO((\"FRAG %d [%.*s]\", (int) ofs, (int) ofs, c->recv.buf));\n      }\n      // Remove non-fragmented frame\n      if (final && op) mg_iobuf_del(&c->recv, ofs, len);\n      // Last chunk of the fragmented frame\n      if (final && !op && (ofs > 0)) {\n        m.flags = c->recv.buf[0];\n        m.data = mg_str_n((char *) &c->recv.buf[1], (size_t) (ofs - 1));\n        mg_call(c, MG_EV_WS_MSG, &m);\n        mg_iobuf_del(&c->recv, 0, ofs);\n        ofs = 0;\n        c->pfn_data = NULL;\n      }\n    }\n  }\n  (void) ev_data;\n}\n\nstruct mg_connection *mg_ws_connect(struct mg_mgr *mgr, const char *url,\n                                    mg_event_handler_t fn, void *fn_data,\n                                    const char *fmt, ...) {\n  struct mg_connection *c = mg_connect(mgr, url, fn, fn_data);\n  if (c != NULL) {\n    char nonce[16], key[30];\n    struct mg_str host = mg_url_host(url);\n    mg_random(nonce, sizeof(nonce));\n    mg_base64_encode((unsigned char *) nonce, sizeof(nonce), key, sizeof(key));\n    mg_xprintf(mg_pfn_iobuf, &c->send,\n               \"GET %s HTTP/1.1\\r\\n\"\n               \"Upgrade: websocket\\r\\n\"\n               \"Host: %.*s\\r\\n\"\n               \"Connection: Upgrade\\r\\n\"\n               \"Sec-WebSocket-Version: 13\\r\\n\"\n               \"Sec-WebSocket-Key: %s\\r\\n\",\n               mg_url_uri(url), (int) host.len, host.buf, key);\n    if (fmt != NULL) {\n      va_list ap;\n      va_start(ap, fmt);\n      mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, &ap);\n      va_end(ap);\n    }\n    mg_xprintf(mg_pfn_iobuf, &c->send, \"\\r\\n\");\n    c->pfn = mg_ws_cb;\n    c->pfn_data = NULL;\n  }\n  return c;\n}\n\nvoid mg_ws_upgrade(struct mg_connection *c, struct mg_http_message *hm,\n                   const char *fmt, ...) {\n  struct mg_str *wskey = mg_http_get_header(hm, \"Sec-WebSocket-Key\");\n  c->pfn = mg_ws_cb;\n  c->pfn_data = NULL;\n  if (wskey == NULL) {\n    mg_http_reply(c, 426, \"\", \"WS upgrade expected\\n\");\n    c->is_draining = 1;\n  } else {\n    struct mg_str *wsproto = mg_http_get_header(hm, \"Sec-WebSocket-Protocol\");\n    va_list ap;\n    va_start(ap, fmt);\n    ws_handshake(c, wskey, wsproto, fmt, &ap);\n    va_end(ap);\n    c->is_websocket = 1;\n    c->is_resp = 0;\n    mg_call(c, MG_EV_WS_OPEN, hm);\n  }\n}\n\nsize_t mg_ws_wrap(struct mg_connection *c, size_t len, int op) {\n  uint8_t header[14], *p;\n  size_t header_len = mkhdr(len, op, c->is_client, header);\n\n  // NOTE: order of operations is important!\n  if (mg_iobuf_add(&c->send, c->send.len, NULL, header_len) != 0) {\n    p = &c->send.buf[c->send.len - len];         // p points to data\n    memmove(p, p - header_len, len);             // Shift data\n    memcpy(p - header_len, header, header_len);  // Prepend header\n    mg_ws_mask(c, len);                          // Mask data\n  }  // returning 0 means an OOM condition (iobuf couldn't resize), yet this is\n  return c->send.len;  // so far recoverable, let the caller decide\n}\n"
  },
  {
    "path": "src/ws.h",
    "content": "#pragma once\n\n#define WEBSOCKET_OP_CONTINUE 0\n#define WEBSOCKET_OP_TEXT 1\n#define WEBSOCKET_OP_BINARY 2\n#define WEBSOCKET_OP_CLOSE 8\n#define WEBSOCKET_OP_PING 9\n#define WEBSOCKET_OP_PONG 10\n\n#include \"http.h\"\n\nstruct mg_ws_message {\n  struct mg_str data;  // Websocket message data\n  uint8_t flags;       // Websocket message flags\n};\n\nstruct mg_connection *mg_ws_connect(struct mg_mgr *, const char *url,\n                                    mg_event_handler_t fn, void *fn_data,\n                                    const char *fmt, ...);\nvoid mg_ws_upgrade(struct mg_connection *, struct mg_http_message *,\n                   const char *fmt, ...);\nsize_t mg_ws_send(struct mg_connection *, const void *buf, size_t len, int op);\nsize_t mg_ws_wrap(struct mg_connection *, size_t len, int op);\nsize_t mg_ws_printf(struct mg_connection *c, int op, const char *fmt, ...);\nsize_t mg_ws_vprintf(struct mg_connection *c, int op, const char *fmt,\n                     va_list *);\n"
  },
  {
    "path": "test/Makefile",
    "content": "SRCS = mongoose.c unit_test.c packed_fs.c\nHDRS = $(wildcard ../src/*.h) $(wildcard ../src/drivers/*.h)\nDEFS ?= -DMG_MAX_HTTP_HEADERS=7 -DMG_ENABLE_LINES -DMG_ENABLE_PACKED_FS=1 -DMG_ENABLE_SSI=1 -DMG_ENABLE_ASSERT=1\nWARN ?= -pedantic -W -Wall -Werror -Wshadow -Wdouble-promotion -fno-common -Wconversion -Wundef\nOPTS ?= -O3 -g3\nINCS ?= -Isrc -I.\nSSL ?=\nCWD ?= $(realpath $(CURDIR))\nROOT_DIR = $(realpath $(CWD)/..)\nENV ?=  -e Tmp=. -e WINEDEBUG=-all\nDOCKER_BIN ?= docker\n# use net=host so all tests have the same network and can access localhost and ad hoc services\nDOCKER ?= $(DOCKER_BIN) run --platform linux/amd64 --net=host --rm $(ENV) -v $(ROOT_DIR):$(ROOT_DIR) -w $(CWD)\nVCFLAGS ?= /nologo /W3 /O2 /MD /I.\nIPV6 ?= 1\nASAN ?= -fsanitize=address,undefined,alignment -fno-sanitize-recover=all -fno-omit-frame-pointer -fno-common\nASAN_OPTIONS ?= detect_leaks=1\n# This does not include ESP32, ESP8266, Microchip; all examples that are directly placed under an OS tutorial. Also, it is needed that way...\nTUTORIALS_EMBEDDED := $(dir $(wildcard ../tutorials/infineon/*/Makefile)) $(dir $(wildcard ../tutorials/nxp/*/Makefile)) $(dir $(wildcard ../tutorials/pico-sdk/*/Makefile)) $(dir $(wildcard ../tutorials/renesas/*/Makefile)) $(dir $(wildcard ../tutorials/stm32/*/Makefile)) $(dir $(wildcard ../tutorials/ti/*/Makefile)) $(dir $(wildcard ../tutorials/wch/*/Makefile))\nTUTORIALS := ../tutorials/micropython/ $(filter-out $(TUTORIALS_EMBEDDED), $(dir $(wildcard ../tutorials/*/*/Makefile)))\nTUTORIALS_QUICK := $(filter-out ../tutorials/micropython/ ../tutorials/tcpip/pcap-driver/, $(TUTORIALS))\nTUTORIALS_MAC := $(filter-out ../tutorials/micropython/ ../tutorials/tcpip/pcap-driver/ ../tutorials/tcpip/tap-driver/, $(TUTORIALS))\nTUTORIALS_WIN := $(dir $(wildcard ../tutorials/http/file-*/Makefile) $(wildcard ../tutorials/http/http-*/Makefile) $(wildcard ../tutorials/mqtt/*/Makefile) $(wildcard ../tutorials/websocket/*/Makefile) $(wildcard ../tutorials/webui/*/Makefile))\nPREFIX ?= /usr/local\nLIBDIR ?= $(PREFIX)/lib\nINCLUDEDIR ?= $(PREFIX)/include\nVERSION ?= $(shell cut -d'\"' -f2 ../src/version.h)\nCOMMON_CFLAGS ?= $(C_WARN) $(WARN) $(INCS) $(DEFS) -DMG_ENABLE_IPV6=$(IPV6) $(TFLAGS) -pthread\nCFLAGS ?= $(OPTS) $(ASAN) $(COMMON_CFLAGS)\nVALGRIND_CFLAGS ?= $(OPTS) $(COMMON_CFLAGS)\nVALGRIND_RUN ?= valgrind --tool=memcheck --gen-suppressions=all --leak-check=full --show-leak-kinds=all --leak-resolution=high --track-origins=yes --error-exitcode=1 --exit-on-first-error=yes --fair-sched=yes\n.PHONY: clean_tutorials tutorials mip_test test valgrind\n\nifeq \"$(findstring ++,$(CC))\" \"\"\n# $(CC) does not end with ++, i.e. we're using C. Apply C flags\nC_WARN ?= -Wmissing-prototypes -Wstrict-prototypes\nelse\n# $(CC) ends with ++, i.e. we're using C++. Apply C++ flags\nC_WARN ?= -Wno-deprecated\nendif\n\nifeq \"$(SSL)\" \"OPENSSL\"\nifeq \"$(OPENSSL)\" \"\"\nCFLAGS  += -DMG_TLS=MG_TLS_OPENSSL $(shell pkg-config openssl --cflags)\nLDFLAGS += $(shell pkg-config openssl --libs)\nelse\nCFLAGS  += -DMG_TLS=MG_TLS_OPENSSL -I$(OPENSSL)/include\nLDFLAGS += -L$(OPENSSL)/lib -lssl -lcrypto\nendif\nendif\n\nifeq \"$(SSL)\" \"MBEDTLS\"\nifeq \"$(MBEDTLS)\" \"\"\n# Ubuntu 22.04 does not provide 'pc' files for MbedTLS (others may)\n#CFLAGS  += -DMG_TLS=MG_TLS_MBED $(shell pkg-config mbedtls --cflags) $(shell pkg-config mbedcrypto --cflags) $(shell pkg-config mbedx509 --cflags)\n#LDFLAGS += $(shell pkg-config mbedtls --libs) $(shell pkg-config mbedcrypto --libs) $(shell pkg-config mbedx509 --libs)\nCFLAGS  += -DMG_TLS=MG_TLS_MBED -I/usr/include\nLDFLAGS += -lmbedtls -lmbedcrypto -lmbedx509\nelse\nCFLAGS  += -DMG_TLS=MG_TLS_MBED -I$(MBEDTLS)/include -I/usr/include\nLDFLAGS += -L$(MBEDTLS)/lib -lmbedtls -lmbedcrypto -lmbedx509\nendif\nendif\n\nifeq \"$(SSL)\" \"WOLFSSL\"\n# WolfSSL requires overriding the include path when used in OpenSSL compatibility mode (we do)\n#ifeq \"$(WOLFSSL)\" \"\"\n#CFLAGS  += -DMG_TLS=MG_TLS_WOLFSSL -DEXTERNAL_OPTS_OPENVPN $(shell pkg-config openssl --cflags)\n#LDFLAGS += $(shell pkg-config wolfssl --libs)\n#else\nWOLFSSL ?= $(shell pkg-config wolfssl --variable=prefix)\nCFLAGS  += -DMG_TLS=MG_TLS_WOLFSSL -DEXTERNAL_OPTS_OPENVPN -I$(WOLFSSL)/include -I$(WOLFSSL)/include/wolfssl\nLDFLAGS += -L$(WOLFSSL)/lib -lwolfssl\n#endif\nendif\n\nifeq \"$(SSL)\" \"BUILTIN\"\nDEFS += -DMG_TLS=MG_TLS_BUILTIN\nendif\n\nall:\n\t$(MAKE) -C ../tutorials/http/http-server\n\ntall: mg_prefix unamalgamated test valgrind fuzz fuzz_tls vc98 vc17 vc22 mingw mingw++ arm armhf riscv s390 tutorials tutorials_win tutorials_embedded mip_test mip_vc98\n\nmip_test: mip_test.c mongoose.c mongoose.h packed_fs.c Makefile\n\t$(CC) mip_test.c packed_fs.c $(CFLAGS) $(LDFLAGS) -o $@\n\tASAN_OPTIONS=$(ASAN_OPTIONS) $(RUN) ./$@\n\nmip_tap_test: mip_tap_test.c mongoose.c mongoose.h packed_fs.c Makefile tls_multirec/server\n\t$(CC) mip_tap_test.c packed_fs.c $(CFLAGS) $(LDFLAGS) -o $@\n\tASAN_OPTIONS=$(ASAN_OPTIONS) $(RUN) ./$@\n\n# bridge UDP port <--> TAP interface\nport_tap_bridge: port_tap_bridge.c\n\tcc port_tap_bridge.c -o $@\n\n# requires port_tap_bridge to be running\nmip_port_test: mip_port_test.c mongoose.c mongoose.h packed_fs.c Makefile tls_multirec/server\n\t$(CC) mip_port_test.c packed_fs.c $(CFLAGS) $(LDFLAGS) -o $@\n\tASAN_OPTIONS=$(ASAN_OPTIONS) $(RUN) ./$@\n\nmip_vc98: mip_test.c mongoose.c mongoose.h packed_fs.c Makefile\n\t$(DOCKER) mdashnet/vc98 wine cl mip_test.c packed_fs.c $(VCFLAGS) $(DEFS) $(TFLAGS) /Fe$@.exe\n\t$(DOCKER) -e WINEPREFIX=/tmp/wineprefix mdashnet/vc98 wine $@.exe\n\npacked_fs.c: Makefile data/ssi.h fuzz.c data/a.txt data/ca.pem certs/ca.crt certs/server.crt certs/server.key\n\t$(CC) $(CFLAGS) pack.c -o pack\n\t$(RUN) ./pack Makefile data/ssi.h fuzz.c data/a.txt data/range.txt data/ca.pem certs/ca.crt certs/server.crt certs/server.key certs/client.key certs/client.crt > $@\n\n# Check that all external (exported) symbols have \"mg_\" prefix\nmg_prefix: mongoose.c mongoose.h\n\t$(CC) mongoose.c $(CFLAGS) -c -o /tmp/x.o && nm /tmp/x.o | grep ' T ' | grep -v 'mg_' ; test $$? = 1\n\nmusl: test\nmusl: ASAN =\nmusl: WARN += -Wno-sign-conversion\nmusl: CC = $(DOCKER) mdashnet/cc1 gcc\nmusl: RUN = $(DOCKER) mdashnet/cc1\n\n# Make sure we can build from unamalgamated sources.\nunamalgamated: CFLAGS += -DMG_ENABLE_MD5=1\nunamalgamated: $(HDRS) Makefile packed_fs.c\n\t$(CC) ../src/*.c packed_fs.c unit_test.c $(CFLAGS) $(LDFLAGS) -g -o unit_test\n\nfuzz: ASAN = -fsanitize=fuzzer,signed-integer-overflow,address,undefined\nfuzz: mongoose.c mongoose.h Makefile fuzz.c\n\t$(CC) fuzz.c $(OPTS) $(WARN) $(INCS) $(TFLAGS) $(ASAN) -o fuzzer\n\t$(RUN) ./fuzzer $(ARGS)\n\nFUZZDATA ?= /tmp/fuzzdata\nfuzz2: mongoose.c mongoose.h Makefile fuzz.c\n\t$(CC) fuzz.c -DMAIN $(OPTS) $(WARN) $(ASAN) $(INCS) -o fuzzer\n\t$(RUN) ./fuzzer $(FUZZDATA)\n\nfuzz_tls: ASAN = -fsanitize=fuzzer,signed-integer-overflow,address,undefined\nfuzz_tls: mongoose.c mongoose.h Makefile fuzz_tls.c\n\t$(CC) fuzz_tls.c $(OPTS) $(WARN) $(INCS) $(TFLAGS) $(ASAN) -o fuzzer_tls\n\t$(RUN) ./fuzzer_tls -max_len=17000 $(ARGS)\n\nfuzz_tls2: mongoose.c mongoose.h Makefile fuzz_tls.c\n\t$(CC) fuzz_tls.c -DMAIN $(OPTS) $(WARN) $(ASAN) $(INCS) -o fuzzer_tls\n\t$(RUN) ./fuzzer_tls $(FUZZDATA)\n\n\n\ntest: Makefile mongoose.h $(SRCS) tls_multirec/server\n\t$(CC) $(SRCS) $(CFLAGS) $(LDFLAGS) -o unit_test\n\tASAN_OPTIONS=$(ASAN_OPTIONS) $(RUN) ./unit_test\n\ntls_multirec/server: FORCE\nifneq \"$(SSL)\" \"\"\nifeq \"$(MULTIREC)\" \"\"\n\t$(MAKE) -C tls_multirec CC=gcc\nendif\nendif\n\ttrue\n\nFORCE:\n\ttrue\n\ncoverage: CFLAGS += -coverage\ncoverage: test\n\tgcov -l -n *.gcno | sed '/^$$/d' | sed 'N;s/\\n/ /'\n\tgcov -t mongoose.c > mongoose.gcov\n\nupload-coverage: coverage\n\tcurl -s https://codecov.io/bash | /bin/bash\n\nvalgrind: Makefile mongoose.h $(SRCS)\n\t$(CC) $(SRCS) $(VALGRIND_CFLAGS) $(LDFLAGS) -g -o unit_test\n\t$(VALGRIND_RUN) ./unit_test\n\nmisra:\n\tcppcheck --addon=misra -DMG_ARCH=MG_ARCH_UNIX -DMG_ENABLE_PACKED_FS=1 -DMG_ENABLE_SSI=1 mongoose.c >/tmp/x 2>&1\n\tcppcheck --addon=misra -DMG_ARCH=MG_ARCH_CUSTOM -DMG_ENABLE_LINES=1 -DTLS=MG_TLS_BUILTIN -DMG_ENABLE_TCPIP=1 mongoose.c  >>/tmp/x 2>&1\n\tcppcheck --addon=misra --clang -DMG_ENABLE_LINES=1 -DTLS=MG_TLS_BUILTIN -DMG_ENABLE_TCPIP=1 mongoose.c  >>/tmp/x 2>&1\n\tcppcheck --addon=misra --clang -DMG_ENABLE_LINES=1 -DMG_ENABLE_SSI=1 mongoose.c  >>/tmp/x 2>&1\n\tless /tmp/x\n\n# https://ddanilov.me/how-signals-are-handled-in-a-docker-container\narmhf: ASAN=\narmhf: IPV6=0\narmhf: CC = $(DOCKER) mdashnet/armhf cc\narmhf: RUN = $(DOCKER) --init mdashnet/armhf\narmhf: test\n\ns390: ASAN=\ns390: IPV6=0\ns390: CFLAGS += -Wno-stringop-overflow\ns390: CC = $(DOCKER) mdashnet/s390 cc\ns390: RUN = $(DOCKER) --init mdashnet/s390\ns390: test\n\nmip_s390: ASAN=\nmip_s390: CC = $(DOCKER) mdashnet/s390 cc\nmip_s390: RUN = $(DOCKER) --init mdashnet/s390\nmip_s390: mip_test\n\nmip_port_s390: ASAN=\nmip_port_s390: IPV6=0\n# This test requires curl, not present in this image\nmip_port_s390: CFLAGS += -DNO_HTTPSERVER_TEST\nmip_port_s390: CC = $(DOCKER) mdashnet/s390 cc\nmip_port_s390: RUN = $(DOCKER) --init mdashnet/s390\nmip_port_s390: mip_port_test\n\narm: DEFS += -DMG_ENABLE_POSIX_FS=0 -DMG_ENABLE_TCPIP=1 -DMG_ENABLE_TCPIP_DRIVER_INIT=0 -DMG_ARCH=MG_ARCH_ARMGCC -DNO_SLEEP_ABORT\narm: mongoose.h $(SRCS)\n\t$(DOCKER) mdashnet/armgcc arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb $(SRCS) $(OPTS) $(WARN) $(INCS) $(DEFS) $(TFLAGS) -o unit_test -nostartfiles --specs nosys.specs -e 0\n\nriscv: DEFS += -DMG_ENABLE_POSIX_FS=0 -DMG_ENABLE_TCPIP=1 -DMG_ENABLE_TCPIP_DRIVER_INIT=0 -DMG_ARCH=MG_ARCH_ARMGCC -DNO_SLEEP_ABORT\nriscv: mongoose.h $(SRCS)\n\t$(DOCKER) mdashnet/riscv riscv-none-elf-gcc -march=rv32imc -mabi=ilp32 $(SRCS) $(OPTS) $(WARN) $(INCS) $(DEFS) $(TFLAGS) -o unit_test\n\nvc98: Makefile mongoose.h $(SRCS)\n\t$(DOCKER) mdashnet/vc98 wine cl $(SRCS) $(VCFLAGS) $(DEFS) $(TFLAGS) /Fe$@.exe\n\t$(DOCKER) -e WINEPREFIX=/tmp/wineprefix mdashnet/vc98 wine $@.exe\n\nvc17: Makefile mongoose.h $(SRCS)\n\t$(DOCKER) mdashnet/vc17 wine64 cl $(SRCS) $(VCFLAGS) $(DEFS) $(TFLAGS) /Fe$@.exe\n\t$(DOCKER) mdashnet/vc17 wine64 $@.exe\n\nvc22: Makefile mongoose.h $(SRCS)\n\t$(DOCKER) mdashnet/vc22 wine64 cl $(SRCS) $(VCFLAGS) $(DEFS) $(TFLAGS) /Fe$@.exe\n\t$(DOCKER) mdashnet/vc22 wine64 $@.exe\n\nmingw: Makefile mongoose.h $(SRCS)\n\t$(DOCKER) mdashnet/mingw x86_64-w64-mingw32-gcc $(SRCS) -W -Wall -Werror -I. $(DEFS) $(TFLAGS) -lws2_32 -lbcrypt -o $@.exe\n\t$(DOCKER) mdashnet/mingw wine64 $@.exe\n\nmingw++: Makefile mongoose.h $(SRCS)\n\t$(DOCKER) mdashnet/mingw x86_64-w64-mingw32-g++ $(SRCS) -W -Wall -Werror -I. $(DEFS) $(TFLAGS) -lws2_32 -lbcrypt -o $@.exe\n\t@echo \"NOT RUNNING\"\n\nlinux-libs: CFLAGS += -fPIC\nlinux-libs: LDFLAGS += -Wl,-soname,libmongoose.so.$(VERSION)\nlinux-libs: mongoose.o\n\t$(CC) mongoose.o $(LDFLAGS) -shared -o libmongoose.so.$(VERSION)\n\t$(AR) rcs libmongoose.a mongoose.o\n\ninstall: linux-libs\n\tinstall -Dm644 libmongoose.a libmongoose.so.$(VERSION) $(DESTDIR)$(LIBDIR)\n\tln -s libmongoose.so.$(VERSION) $(DESTDIR)$(LIBDIR)/libmongoose.so\n\tinstall -Dm644 mongoose.h $(DESTDIR)$(INCLUDEDIR)/mongoose.h\n\nuninstall:\n\trm -rf $(DESTDIR)$(LIBDIR)/libmongoose.a $(DESTDIR)$(LIBDIR)/libmongoose.so.$(VERSION) $(DESTDIR)$(INCLUDEDIR)/mongoose.h $(DESTDIR)$(LIBDIR)/libmongoose.so\n\nmongoose.c: Makefile $(wildcard ../src/*.c) $(wildcard ../src/drivers/*.c)\n\tcd .. && (export LC_ALL=C ; cat src/license.h; echo; echo '#include \"mongoose.h\"' ; (for F in src/*.c src/drivers/*.c ; do echo; echo '#ifdef MG_ENABLE_LINES'; echo \"#line 1 \\\"$$F\\\"\"; echo '#endif'; cat $$F | sed -e 's,#include \".*,,'; done))> $@\n\nmongoose.h: $(HDRS) Makefile\n\tcd .. && (cat src/license.h; echo; echo '#ifndef MONGOOSE_H'; echo '#define MONGOOSE_H'; echo; cat src/version.h ; echo; echo '#ifdef __cplusplus'; echo 'extern \"C\" {'; echo '#endif'; cat src/arch.h src/arch_*.h src/net_ft.h src/net_lwip.h src/net_rl.h src/config.h src/profile.h src/str.h src/queue.h src/fmt.h src/printf.h src/log.h src/timer.h src/fs.h src/util.h src/url.h src/iobuf.h src/base64.h src/md5.h src/sha1.h src/sha256.h src/event.h src/net.h src/http.h src/ssi.h src/tls.h src/tls_x25519.h src/tls_aes128.h src/tls_uecc.h src/tls_chacha20.h src/tls_rsa.h src/tls_mbed.h src/tls_openssl.h src/ws.h src/sntp.h src/mqtt.h src/dns.h src/json.h src/rpc.h src/ota.h src/flash.h src/wifi.h src/l2.h src/net_builtin.h src/drivers/*.h | sed -e '/keep/! s,#include \".*,,' -e 's,^#pragma once,,'; echo; echo '#ifdef __cplusplus'; echo '}'; echo '#endif'; echo '#endif  // MONGOOSE_H')> $@\n\n\nclean: clean_tutorials clean_tutorials_embedded\n\trm -rf $(PROG) *.exe *.o *.dSYM *_test ut fuzzer *.gcov *.gcno *.gcda *.obj *.exe *.ilk *.pdb slow-unit* _CL_* infer-out data.txt crash-* packed_fs.c pack\n\t$(MAKE) -C tls_multirec $@\n\t#find tutorials -maxdepth 3 -name zephyr -prune -o -name Makefile -print | xargs dirname | xargs -n1 make clean -C\n\n\ntutorials:\n\t@for X in $(TUTORIALS); do test -f $$X/Makefile || continue; $(MAKE) -C $$X example || exit 1; done\nclean_tutorials:\n\tfor X in $(TUTORIALS); do test -f $$X/Makefile || continue; $(MAKE) -C $$X clean || exit 1; done\n\ntutorials_essential:\n\t@for X in $(TUTORIALS_QUICK); do test -f $$X/Makefile || continue; $(MAKE) -C $$X example || exit 1; done\nclean_tutorials_essential:\n\tfor X in $(TUTORIALS_QUICK); do test -f $$X/Makefile || continue; $(MAKE) -C $$X clean || exit 1; done\n\ntutorials_mac:\n\t@for X in $(TUTORIALS_MAC); do test -f $$X/Makefile || continue; $(MAKE) -C $$X example || exit 1; done\nclean_tutorials_mac:\n\tfor X in $(TUTORIALS_MAC); do test -f $$X/Makefile || continue; $(MAKE) -C $$X clean || exit 1; done\n\ntutorials_win:\n\t$(foreach X, $(TUTORIALS_WIN), $(MAKE) -C $(X) example &)\nclean_tutorials_win:\n\t$(foreach X, $(TUTORIALS_WIN), $(MAKE) -C $(X) clean &)\n\n\ntutorials_embedded:\n\t@for X in $(TUTORIALS_EMBEDDED); do test -f $$X/Makefile || continue; $(MAKE) -C $$X build || exit 1; done\nclean_tutorials_embedded:\n\tfor X in $(TUTORIALS_EMBEDDED); do test -f $$X/Makefile || continue; $(MAKE) -C $$X clean || exit 1; done\n\n"
  },
  {
    "path": "test/arduino/Makefile",
    "content": "# arduino-nano fails on the flash size department, need to reduce unused function footprint (sha256, sha384 ?)\n# teensy41 board management seems to be for 2.0\nPROJECTS ?= seeeduino-xiao esp32\nROOT ?= $(realpath $(CURDIR)/../..)\nARD ?= $(realpath $(CURDIR))\n\nall: $(PROJECTS)\n\techo \n\narduino: ENV = -v $(CWD):/root\narduino:\n\tcurl -sL http://downloads.arduino.cc/arduino-1.8.19-linux64.tar.xz | unxz | tar -xf -\n\tmv arduino-* $@\n\t./arduino/arduino --pref \"compiler.warning_level=all\" --save-prefs\n\nseeeduino-xiao-board:\n\t./arduino/arduino --pref \"boardsmanager.additional.urls=https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json\" --save-prefs\n\t./arduino/arduino --install-boards Seeeduino:samd\n\ttouch seeeduino-xiao-board\n\nesp32-board:\n\t./arduino/arduino --pref \"boardsmanager.additional.urls=https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json\" --save-prefs\n\t./arduino/arduino --install-boards esp32:esp32\n\ttouch esp32-board\n\nteensy-board:\n\t./arduino/arduino --pref \"boardsmanager.additional.urls=https://www.pjrc.com/teensy/package_teensy_index.json\" --save-prefs\n\t./arduino/arduino --install-boards teensy:avr\n\ttouch teensy-board\n\nseeeduino-xiao: arduino seeeduino-xiao-board\n\tcd $(ROOT)/tutorials/mqtt/mqtt-client/arduino/sim800-mqtt && $(ARD)/arduino/arduino --verbose --verify --board Seeeduino:samd:seeed_XIAO_m0 sim800-mqtt.ino\n\tcd $(ROOT)/tutorials/http/http-server/arduino/w5500-http &&  $(ARD)/arduino/arduino --verbose --verify --board Seeeduino:samd:seeed_XIAO_m0 w5500-http.ino\n\tcd $(ROOT)/tutorials/mqtt/mqtt-client/arduino/w5500-mqtt &&  $(ARD)/arduino/arduino --verbose --verify --board Seeeduino:samd:seeed_XIAO_m0 w5500-mqtt.ino\n\narduino-nano: arduino\n\tcd $(ROOT)/tutorials/mqtt/mqtt-client/arduino/nano-w5500-mqtt && $(ARD)/arduino/arduino --pref compiler.cpp.extra_flags=-DMG_ENABLE_LOG=0 --verbose --verify --board arduino:avr:nano nano-w5500-mqtt.ino\n\nesp32: arduino esp32-board\n\tcd $(ROOT)/tutorials/mqtt/mqtt-client/arduino/esp32-mqtt && $(ARD)/arduino/arduino --verbose --verify --board esp32:esp32:node32s esp32-mqtt.ino\n\t# Needs a board with 'LED_BUILTIN', yet somehow invocation is missing that definition (lack of include somehow amended by the IDE)\n\t#cd $(ROOT)/tutorials/http/http-server/arduino/esp32-http && $(ARD)/arduino/arduino --verbose --verify --board esp32:esp32:esp32 esp32-http.ino\n\nteensy41: arduino teensy-board\n\tcd $(ROOT)/tutorials/http/http-server/arduino/teensy41-http && $(ARD)/arduino/arduino --verbose --verify --board teensy41-http.ino\n\n\n\nclean:\n\trm -rf arduino \n\n# Board support gets installed in your home dir.\n# We fool make satisfying a dependency using touch above, otherwise board installation fails as it is already installed\n# To really get rid of the installed board stuff run 'make cleanall'\ncleanall: clean\n\trm -rf ~/.arduino* ~/.oracle_jre_usage seeeduino-xiao-board esp32-board teensy-board\n"
  },
  {
    "path": "test/certs/ca.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIBFTCBvAIJAMNTFtpfcq8NMAoGCCqGSM49BAMCMBMxETAPBgNVBAMMCE1vbmdv\nb3NlMB4XDTI0MDUwNzE0MzczNloXDTM0MDUwNTE0MzczNlowEzERMA8GA1UEAwwI\nTW9uZ29vc2UwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASuP+86T/rOWnGpEVhl\nfxYZ+pjMbCmDZ+vdnP0rjoxudwRMRQCv5slRlDK7Lxue761sdvqxWr0Ma6TFGTNg\nepsRMAoGCCqGSM49BAMCA0gAMEUCIQCwb2CxuAKm51s81S6BIoy1IcandXSohnqs\nus64BAA7QgIgGGtUrpkgFSS0oPBlCUG6YPHFVw42vTfpTC0ySwAS0M4=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "test/certs/ca.key",
    "content": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIJqrhcIKC5dk0omuRJRnzCXdfxevxnabQEnOWlL6P6x1oAoGCCqGSM49\nAwEHoUQDQgAErj/vOk/6zlpxqRFYZX8WGfqYzGwpg2fr3Zz9K46MbncETEUAr+bJ\nUZQyuy8bnu+tbHb6sVq9DGukxRkzYHqbEQ==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "test/certs/ca.srl",
    "content": "96EAA481EB95FF36\n"
  },
  {
    "path": "test/certs/client.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIBMjCB2aADAgECAgkAluqkgeuV/zYwCgYIKoZIzj0EAwIwEzERMA8GA1UEAwwI\nTW9uZ29vc2UwHhcNMjQwNTA3MTQzNzM2WhcNMzQwNTA1MTQzNzM2WjARMQ8wDQYD\nVQQDDAZjbGllbnQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASXNWpzrToZJQVB\ndIJCeIw4j43kV38oehDKhYnaPJDTkqoKrEtSTvXWFY7BxnjUhSkSWBElcq/g6qiP\nTquJCvXLoxgwFjAUBgNVHREEDTALgglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDSAAw\nRQIhAOsbCgeobKm0sOmQKzH9+KYmoxL/8AXMAzWozd2bEtivAiACyLVppRHjgA/e\nrP1mRkL0RAUxPw6s/gK7TFcPXUqzGQ==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "test/certs/client.csr",
    "content": "-----BEGIN CERTIFICATE REQUEST-----\nMIHKMHMCAQAwETEPMA0GA1UEAwwGY2xpZW50MFkwEwYHKoZIzj0CAQYIKoZIzj0D\nAQcDQgAElzVqc606GSUFQXSCQniMOI+N5Fd/KHoQyoWJ2jyQ05KqCqxLUk711hWO\nwcZ41IUpElgRJXKv4Oqoj06riQr1y6AAMAoGCCqGSM49BAMCA0cAMEQCIH0SLqrh\n1ieUh01dSUMJLVRDkrSsZu+Z/ZiYPaHNd1I0AiBKNu9sLEc4vtxwZJJvdwer3pbq\nUw7jMwjwyuhZd2+eJA==\n-----END CERTIFICATE REQUEST-----\n"
  },
  {
    "path": "test/certs/client.key",
    "content": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIGzf9AgYx3RfhzMGwv5EWgzoQh/EDfFpieFgfpTisWbAoAoGCCqGSM49\nAwEHoUQDQgAElzVqc606GSUFQXSCQniMOI+N5Fd/KHoQyoWJ2jyQ05KqCqxLUk71\n1hWOwcZ41IUpElgRJXKv4Oqoj06riQr1yw==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "test/certs/generate.sh",
    "content": "#/bin/sh\n#\n# Geneate self-signed ECC certificates\n\ncd `dirname $0`\n\n# Create cnf for adding SAN DNS:localhost\n# See https://security.stackexchange.com/questions/190905/subject-alternative-name-in-certificate-signing-request-apparently-does-not-surv\ncat > cnf <<EOF\n[SAN]\nsubjectAltName=DNS:localhost\nEOF\n\n# Generate CA\n# Important: CN names must be different for CA and client/server certs\nopenssl ecparam -noout -name prime256v1 -genkey -out ca.key\nopenssl req -x509 -new -key ca.key -days 3650 -subj /CN=Mongoose -out ca.crt\n\n# Generate server cert\nopenssl ecparam -noout -name prime256v1 -genkey -out server.key\nopenssl req -new -sha256 -key server.key -days 3650 -subj /CN=server -out server.csr\nopenssl x509 -req -sha256 -in server.csr -extensions SAN -extfile cnf \\\n  -CAkey ca.key -CA ca.crt -CAcreateserial -days 3650 -out server.crt\n\n# Generate client cert\nopenssl ecparam -noout -name prime256v1 -genkey -out client.key\nopenssl req -new -sha256 -key client.key -days 3650 -subj /CN=client -out client.csr\nopenssl x509 -req -sha256 -in client.csr -extensions SAN -extfile cnf \\\n  -CAkey ca.key -CA ca.crt -CAcreateserial -days 3650 -out client.crt\n\n# Verify\nopenssl verify -verbose -CAfile ca.crt server.crt\nopenssl verify -verbose -CAfile ca.crt client.crt\n\n# Inspect\n# openssl x509 -text -noout -ext subjectAltName -in server.crt\n"
  },
  {
    "path": "test/certs/server.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIBMTCB2aADAgECAgkAluqkgeuV/zUwCgYIKoZIzj0EAwIwEzERMA8GA1UEAwwI\nTW9uZ29vc2UwHhcNMjQwNTA3MTQzNzM2WhcNMzQwNTA1MTQzNzM2WjARMQ8wDQYD\nVQQDDAZzZXJ2ZXIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASo3oEiG+BuTt5y\nZRyfwNr0C+SP+4M0RG2pYkb2v+ivbpfi72NHkmXiF/kbHXtgmSrn/PeTqiA8M+mg\nBhYjDX+zoxgwFjAUBgNVHREEDTALgglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDRwAw\nRAIgTXW9MITQSwzqbNTxUUdt9DcB+8pPUTbWZpiXcA26GMYCIBiYw+DSFMLHmkHF\n+5U3NXW3gVCLN9ntD5DAx8LTG8sB\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "test/certs/server.csr",
    "content": "-----BEGIN CERTIFICATE REQUEST-----\nMIHMMHMCAQAwETEPMA0GA1UEAwwGc2VydmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0D\nAQcDQgAEqN6BIhvgbk7ecmUcn8Da9Avkj/uDNERtqWJG9r/or26X4u9jR5Jl4hf5\nGx17YJkq5/z3k6ogPDPpoAYWIw1/s6AAMAoGCCqGSM49BAMCA0kAMEYCIQCOydOU\n+7sELXySq1CB66e2fVTpRUO/vET0SjcRc6jLigIhAMPTkWiALWIOvyVHA3dMQctr\n72yTgPuMgEHTe7keZ32E\n-----END CERTIFICATE REQUEST-----\n"
  },
  {
    "path": "test/certs/server.key",
    "content": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIAVdo8UAScxG7jiuNY2UZESNX/KPH8qJ0u0gOMMsAzYWoAoGCCqGSM49\nAwEHoUQDQgAEqN6BIhvgbk7ecmUcn8Da9Avkj/uDNERtqWJG9r/or26X4u9jR5Jl\n4hf5Gx17YJkq5/z3k6ogPDPpoAYWIw1/sw==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "test/cgt+make/Makefile",
    "content": "ROOT ?= $(realpath $(CURDIR)/../..)\nTARGET ?= Debug\nDOCKER = docker run --rm -v $(ROOT):$(ROOT) -v $(CURDIR):/root -w $(CURDIR) \nIMAGE ?= scaprile/cgt\n\nall: $(PROJECTS)\n\techo\n\n$(PROJECTS): FORCE\n\t$(DOCKER) $(IMAGE) make -C $@\n\nFORCE:\n"
  },
  {
    "path": "test/configs/mongoose_config_full.h",
    "content": "#pragma once\n\n// Build environment. Possible options are at https://github.com/cesanta/mongoose/blob/master/src/arch.h\n// #define MG_ARCH MG_ARCH_CUSTOM\n\n// Choice of the network stack. By default, use an external BSD-compatible stack\n// #define MG_ENABLE_FREERTOS_TCP 0  // Amazon FreeRTOS-TCP\n// #define MG_ENABLE_LWIP 0          // lWIP\n// #define MG_ENABLE_TCPIP 0         // Mongoose built-in\n// #define MG_ENABLE_RL 0            // ARM MDK\n// #define MG_ENABLE_POLL 0          // Only for BSD stack. Use poll()\n// #define MG_ENABLE_EPOLL 0         // Only for Linux/BSD stack. Use epoll()\n// #define MG_ENABLE_WINSOCK 1       // Only for Windows stack. Use Winsock\n// #define MG_ENABLE_SOCKET !MG_ENABLE_TCPIP\n// #define MG_SOCK_LISTEN_BACKLOG_SIZE 3  // Only for socket-based stacks\n\n// Only for built-in network stack, MG_ENABLE_TCPIP == 1\n// #define MG_ENABLE_TCPIP_DRIVER_INIT 1  // enabled built-in driver for\n// #define MG_SET_MAC_ADDRESS(mac)        // set MAC address for built-in driver\n// #define MG_SET_WIFI_CONFIG(data)\n// #define MG_ENABLE_TCPIP_PRINT_DEBUG_STATS 0\n\n// Choose a driver for built-in network stack, MG_ENABLE_TCPIP == 1\n// #define MG_ENABLE_DRIVER_STM32H 0\n// #define MG_ENABLE_DRIVER_STM32F 0\n// #define MG_ENABLE_DRIVER_IMXRT 0\n// #define MG_ENABLE_DRIVER_CMSIS 0\n// #define MG_ENABLE_DRIVER_RA 0\n// #define MG_ENABLE_DRIVER_RW612 0\n// #define MG_ENABLE_DRIVER_SAME54 0\n// #define MG_ENABLE_DRIVER_MCXN 0\n// #define MG_ENABLE_DRIVER_TM4C 0\n// #define MG_ENABLE_DRIVER_TMS570 0\n// #define MG_ENABLE_DRIVER_XMC7 0\n// #define MG_ENABLE_DRIVER_XMC 0\n\n// Filesystem support\n// #define MG_ENABLE_PACKED_FS 0  // Enable packed filesystem support\n// #define MG_ENABLE_FATFS 0      // Enable FATFS support, mg_fs_packed\n// #define MG_ENABLE_POSIX_FS 0   // Enable POSIX filesystem support, mg_fs_posix\n// #define MG_PATH_MAX 128        // Maximum path length\n// #define MG_DIRSEP '/'          // Directory separator\n\n// Misc options\n// #define MG_ENABLE_LOG 1           // Enable logging\n// #define MG_TLS MG_TLS_NONE        // MG_TLS_NONE, MG_TLS_MBED, MG_TLS_OPENSSL, MG_TLS_CUSTOM\n// #define MG_ENABLE_IPV6 0          // Enable IPv6 support\n// #define MG_IPV6_V6ONLY 0          // IPv6 socket binds only to V6, not V4 address\n// #define MG_ENABLE_CUSTOM_CALLOC 0 // Set to 1 to let user define mg_calloc() and mg_free()\n// #define MG_ENABLE_CUSTOM_RANDOM 0 // Set to 1 to let user define mg_random()\n// #define MG_ENABLE_CUSTOM_MILLIS 0 // Set to 1 to let user define mg_millis()\n// #define MG_ENABLE_SSI 0           // Enable SSI support\n// #define MG_ENABLE_DIRLIST 0       // Enable directory listing\n// #define MG_IO_SIZE 512            // Granularity of the send/recv IO buffer growth\n// #define MG_MAX_RECV_SIZE (3UL * 1024UL * 1024UL)  // Maximum recv IO buffer size\n// #define MG_DATA_SIZE 32           // struct mg_connection :: data size\n// #define MG_MAX_HTTP_HEADERS 30    // Maximum number of HTTP headers\n// #define MG_HTTP_INDEX \"index.html\"  // Default HTTP index file\n// #define MG_ENABLE_LINES 0         // Show unamalgamated line numbers\n"
  },
  {
    "path": "test/cube/Makefile",
    "content": "ROOT ?= $(realpath $(CURDIR)/../..)\nPROJECTS ?= $(wildcard ../../tutorials/stm32/nucleo-*-cube-*)\nTARGET ?= Debug\nDOCKER = docker run --rm -v $(ROOT):$(ROOT) -v $(CURDIR):/root -w $(CURDIR) \nIMAGE ?= scaprile/cubeozone\n# set PATHTO if image author did not set path\n\nall: $(PROJECTS)\n\t$(DOCKER) $(IMAGE) $(PATHTO)headless-build.sh -data workspace -removeAll workspace\n\t$(DOCKER) $(IMAGE) /bin/bash -c \"rm -rf workspace/.metadata\"\n\n$(PROJECTS): FORCE\n\t(make -C $@ && sudo make -C $@ clean) || ( \\\n\tCOREDIRS=`find $@ -maxdepth 1 -name 'CM*' -print` && ( \\\n\t(test \"$$COREDIRS\" = \"\" && \\\n\t  PROJNAME=`xq -r .projectDescription.name $@/.project` && \\\n\t  $(DOCKER) $(IMAGE) $(PATHTO)headless-build.sh -data workspace -import $@ -cleanBuild $$PROJNAME/$(TARGET) && \\\n\t  $(DOCKER) $(IMAGE) $(PATHTO)headless-build.sh -data workspace -remove $@ && \\\n\t  $(DOCKER) $(IMAGE) /bin/bash -c \"rm -rf $@/.settings $@/$(TARGET)\") || ( \\\n\t(test \"$$COREDIRS\" != \"\" && \\\n\t  for core in $$COREDIRS; do \\\n\t    DIR=`basename $$core` \\\n\t    PROJNAME=`xq -r .projectDescription.name $@/$$DIR/.project` && \\\n\t    $(DOCKER) $(IMAGE) $(PATHTO)headless-build.sh -data workspace -import $@/$$DIR -cleanBuild $$PROJNAME/$(TARGET) && \\\n\t    $(DOCKER) $(IMAGE) $(PATHTO)headless-build.sh -data workspace -remove $@/$$DIR && \\\n\t    $(DOCKER) $(IMAGE) /bin/bash -c \"rm -rf $@/$$DIR/.settings $@/$$DIR/Drivers $@/$$DIR/Middlewares $@/$$DIR/$(TARGET)\" || exit 1; \\\n\t  done ))))\n\nFORCE:\n"
  },
  {
    "path": "test/data/..ddot/index.html",
    "content": "hi\n"
  },
  {
    "path": "test/data/404.html",
    "content": "boo\n"
  },
  {
    "path": "test/data/a.txt",
    "content": "hello\n"
  },
  {
    "path": "test/data/ca.pem",
    "content": "Issuer: C=US, O=Internet Security Research Group, CN=ISRG Root X1\nNot Before: Mar 13 00:00:00 2024 GMT\nNot After : Mar 12 23:59:59 2027 GMT\n-----BEGIN CERTIFICATE-----\nMIIEVzCCAj+gAwIBAgIRALBXPpFzlydw27SHyzpFKzgwDQYJKoZIhvcNAQELBQAw\nTzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\ncmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw\nWhcNMjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg\nRW5jcnlwdDELMAkGA1UEAxMCRTYwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATZ8Z5G\nh/ghcWCoJuuj+rnq2h25EqfUJtlRFLFhfHWWvyILOR/VvtEKRqotPEoJhC6+QJVV\n6RlAN2Z17TJOdwRJ+HB7wxjnzvdxEP6sdNgA1O1tHHMWMxCcOrLqbGL0vbijgfgw\ngfUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD\nATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSTJ0aYA6lRaI6Y1sRCSNsj\nv1iU0jAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB\nAQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0g\nBAwwCjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVu\nY3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAfYt7SiA1sgWGCIpunk46r4AExIRc\nMxkKgUhNlrrv1B21hOaXN/5miE+LOTbrcmU/M9yvC6MVY730GNFoL8IhJ8j8vrOL\npMY22OP6baS1k9YMrtDTlwJHoGby04ThTUeBDksS9RiuHvicZqBedQdIF65pZuhp\neDcGBcLiYasQr/EO5gxxtLyTmgsHSOVSBcFOn9lgv7LECPq9i7mfH3mpxgrRKSxH\npOoZ0KXMcB+hHuvlklHntvcI0mMMQ0mhYj6qtMFStkF1RpCG3IPdIwpVCQqu8GV7\ns8ubknRzs+3C/Bm19RFOoiPpDkwvyNfvmQ14XkyqqKK5oZ8zhD32kFRQkxa8uZSu\nh4aTImFxknu39waBxIRXE4jKxlAmQc4QjFZoq1KmQqQg0J/1JF8RlFvJas1VcjLv\nYlvUB2t6npO6oQjB3l+PNf0DpQH7iUx3Wz5AjQCi6L25FjyE06q6BZ/QlmtYdl/8\nZYao4SRqPEs/6cAiF+Qf5zg2UkaWtDphl1LKMuTNLotvsX99HP69V2faNyegodQ0\nLyTApr/vT01YPE46vNsDLgK+4cL6TrzC/a4WcmF5SRJ938zrv/duJHLXQIku5v0+\nEwOy59Hdm0PT/Er/84dDV0CSjdR/2XuZM3kpysSKLgD1cKiDA+IRguODCxfO9cyY\nIg46v9mFmBvyH04=\n-----END CERTIFICATE-----\n\n\nIssuer: C=US, O=Internet Security Research Group, CN=ISRG Root X1\nNot Before: Mar 13 00:00:00 2024 GMT\nNot After : Mar 12 23:59:59 2027 GMT\n-----BEGIN CERTIFICATE-----\nMIIEVzCCAj+gAwIBAgIRAIOPbGPOsTmMYgZigxXJ/d4wDQYJKoZIhvcNAQELBQAw\nTzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\ncmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMjQwMzEzMDAwMDAw\nWhcNMjcwMzEyMjM1OTU5WjAyMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNTGV0J3Mg\nRW5jcnlwdDELMAkGA1UEAxMCRTUwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNCzqK\na2GOtu/cX1jnxkJFVKtj9mZhSAouWXW0gQI3ULc/FnncmOyhKJdyIBwsz9V8UiBO\nVHhbhBRrwJCuhezAUUE8Wod/Bk3U/mDR+mwt4X2VEIiiCFQPmRpM5uoKrNijgfgw\ngfUwDgYDVR0PAQH/BAQDAgGGMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcD\nATASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1UdDgQWBBSfK1/PPCFPnQS37SssxMZw\ni9LXDTAfBgNVHSMEGDAWgBR5tFnme7bl5AFzgAiIyBpY9umbbjAyBggrBgEFBQcB\nAQQmMCQwIgYIKwYBBQUHMAKGFmh0dHA6Ly94MS5pLmxlbmNyLm9yZy8wEwYDVR0g\nBAwwCjAIBgZngQwBAgEwJwYDVR0fBCAwHjAcoBqgGIYWaHR0cDovL3gxLmMubGVu\nY3Iub3JnLzANBgkqhkiG9w0BAQsFAAOCAgEAH3KdNEVCQdqk0LKyuNImTKdRJY1C\n2uw2SJajuhqkyGPY8C+zzsufZ+mgnhnq1A2KVQOSykOEnUbx1cy637rBAihx97r+\nbcwbZM6sTDIaEriR/PLk6LKs9Be0uoVxgOKDcpG9svD33J+G9Lcfv1K9luDmSTgG\n6XNFIN5vfI5gs/lMPyojEMdIzK9blcl2/1vKxO8WGCcjvsQ1nJ/Pwt8LQZBfOFyV\nXP8ubAp/au3dc4EKWG9MO5zcx1qT9+NXRGdVWxGvmBFRAajciMfXME1ZuGmk3/GO\nkoAM7ZkjZmleyokP1LGzmfJcUd9s7eeu1/9/eg5XlXd/55GtYjAM+C4DG5i7eaNq\ncm2F+yxYIPt6cbbtYVNJCGfHWqHEQ4FYStUyFnv8sjyqU8ypgZaNJ9aVcWSICLOI\nE1/Qv/7oKsnZCWJ926wU6RqG1OYPGOi1zuABhLw61cuPVDT28nQS/e6z95cJXq0e\nK1BcaJ6fJZsmbjRgD5p3mvEf5vdQM7MCEvU0tHbsx2I5mHHJoABHb8KVBgWp/lcX\nGWiWaeOyB7RP+OfDtvi2OsapxXiV7vNVs7fMlrRjY1joKaqmmycnBvAq14AEbtyL\nsVfOS66B8apkeFX2NY4XPEYV4ZSCe8VHPrdrERk2wILG3T/EGmSIkCYVUMSnjmJd\nVQD9F6Na/+zmXCc=\n-----END CERTIFICATE-----\n\n\nIssuer: C=US, O=Google Trust Services LLC, CN=GTS Root R1\nNot Before: Jun 22 00:00:00 2016 GMT\nNot After : Jun 22 00:00:00 2036 GMT\n-----BEGIN CERTIFICATE-----\nMIIFVzCCAz+gAwIBAgINAgPlk28xsBNJiGuiFzANBgkqhkiG9w0BAQwFADBHMQsw\nCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEU\nMBIGA1UEAxMLR1RTIFJvb3QgUjEwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAw\nMDAwWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZp\nY2VzIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUA\nA4ICDwAwggIKAoICAQC2EQKLHuOhd5s73L+UPreVp0A8of2C+X0yBoJx9vaMf/vo\n27xqLpeXo4xL+Sv2sfnOhB2x+cWX3u+58qPpvBKJXqeqUqv4IyfLpLGcY9vXmX7w\nCl7raKb0xlpHDU0QM+NOsROjyBhsS+z8CZDfnWQpJSMHobTSPS5g4M/SCYe7zUjw\nTcLCeoiKu7rPWRnWr4+wB7CeMfGCwcDfLqZtbBkOtdh+JhpFAz2weaSUKK0Pfybl\nqAj+lug8aJRT7oM6iCsVlgmy4HqMLnXWnOunVmSPlk9orj2XwoSPwLxAwAtcvfaH\nszVsrBhQf4TgTM2S0yDpM7xSma8ytSmzJSq0SPly4cpk9+aCEI3oncKKiPo4Zor8\nY/kB+Xj9e1x3+naH+uzfsQ55lVe0vSbv1gHR6xYKu44LtcXFilWr06zqkUspzBmk\nMiVOKvFlRNACzqrOSbTqn3yDsEB750Orp2yjj32JgfpMpf/VjsPOS+C12LOORc92\nwO1AK/1TD7Cn1TsNsYqiA94xrcx36m97PtbfkSIS5r762DL8EGMUUXLeXdYWk70p\naDPvOmbsB4om3xPXV2V4J95eSRQAogB/mqghtqmxlbCluQ0WEdrHbEg8QOB+DVrN\nVjzRlwW5y0vtOUucxD/SVRNuJLDWcfr0wbrM7Rv1/oFB2ACYPTrIrnqYNxgFlQID\nAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E\nFgQU5K8rJnEaK0gnhS9SZizv8IkTcT4wDQYJKoZIhvcNAQEMBQADggIBAJ+qQibb\nC5u+/x6Wki4+omVKapi6Ist9wTrYggoGxval3sBOh2Z5ofmmWJyq+bXmYOfg6LEe\nQkEzCzc9zolwFcq1JKjPa7XSQCGYzyI0zzvFIoTgxQ6KfF2I5DUkzps+GlQebtuy\nh6f88/qBVRRiClmpIgUxPoLW7ttXNLwzldMXG+gnoot7TiYaelpkttGsN/H9oPM4\n7HLwEXWdyzRSjeZ2axfG34arJ45JK3VmgRAhpuo+9K4l/3wV3s6MJT/KYnAK9y8J\nZgfIPxz88NtFMN9iiMG1D53Dn0reWVlHxYciNuaCp+0KueIHoI17eko8cdLiA6Ef\nMgfdG+RCzgwARWGAtQsgWSl4vflVy2PFPEz0tv/bal8xa5meLMFrUKTX5hgUvYU/\nZ6tGn6D/Qqc6f1zLXbBwHSs09dR2CQzreExZBfMzQsNhFRAbd03OIozUhfJFfbdT\n6u9AWpQKXCBfTkBdYiJ23//OYb2MI3jSNwLgjt7RETeJ9r/tSQdirpLsQBqvFAnZ\n0E6yove+7u7Y/9waLd64NnHi/Hm3lCXRSHNboTXns5lndcEZOitHTtNCjv0xyBZm\n2tIMPNuzjsmhDYAPexZ3FL//2wmUspO8IFgV6dtxQ/PeEMMA3KgqlbbC1j+Qa3bb\nbP6MvPJwNQzcmRk13NfIRmPVNnGuV/u3gm3c\n-----END CERTIFICATE-----\n\n\nIssuer: OU=GlobalSign ECC Root CA - R4, O=GlobalSign, CN=GlobalSign\nNot Before: Nov 13 00:00:00 2012 GMT\nNot After : Jan 19 03:14:07 2038 GMT\n-----BEGIN CERTIFICATE-----\nMIIB3DCCAYOgAwIBAgINAgPlfvU/k/2lCSGypjAKBggqhkjOPQQDAjBQMSQwIgYD\nVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjQxEzARBgNVBAoTCkdsb2Jh\nbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMTIxMTEzMDAwMDAwWhcNMzgw\nMTE5MDMxNDA3WjBQMSQwIgYDVQQLExtHbG9iYWxTaWduIEVDQyBSb290IENBIC0g\nUjQxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2JhbFNpZ24wWTAT\nBgcqhkjOPQIBBggqhkjOPQMBBwNCAAS4xnnTj2wlDp8uORkcA6SumuU5BwkWymOx\nuYb4ilfBV85C+nOh92VC/x7BALJucw7/xyHlGKSq2XE/qNS5zowdo0IwQDAOBgNV\nHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVLB7rUW44kB/\n+wpu+74zyTyjhNUwCgYIKoZIzj0EAwIDRwAwRAIgIk90crlgr/HmnKAWBVBfw147\nbmF0774BxL4YSFlhgjICICadVGNA3jdgUM/I2O2dgq43mLyjj0xMqTQrbO/7lZsm\n-----END CERTIFICATE-----\n\n\nIssuer: C=US, O=Google Trust Services LLC, CN=GTS Root R4\nNot Before: Jun 22 00:00:00 2016 GMT\nNot After : Jun 22 00:00:00 2036 GMT\n-----BEGIN CERTIFICATE-----\nMIICCTCCAY6gAwIBAgINAgPlwGjvYxqccpBQUjAKBggqhkjOPQQDAzBHMQswCQYD\nVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzEUMBIG\nA1UEAxMLR1RTIFJvb3QgUjQwHhcNMTYwNjIyMDAwMDAwWhcNMzYwNjIyMDAwMDAw\nWjBHMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2Vz\nIExMQzEUMBIGA1UEAxMLR1RTIFJvb3QgUjQwdjAQBgcqhkjOPQIBBgUrgQQAIgNi\nAATzdHOnaItgrkO4NcWBMHtLSZ37wWHO5t5GvWvVYRg1rkDdc/eJkTBa6zzuhXyi\nQHY7qca4R9gq55KRanPpsXI5nymfopjTX15YhmUPoYRlBtHci8nHc8iMai/lxKvR\nHYqjQjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW\nBBSATNbrdP9JNqPV2Py1PsVq8JQdjDAKBggqhkjOPQQDAwNpADBmAjEA6ED/g94D\n9J+uHXqnLrmvT/aDHQ4thQEd0dlq7A/Cr8deVl5c1RxYIigL9zC2L7F8AjEA8GE8\np/SgguMh1YQdc4acLa/KNJvxn7kjNuK8YAOdgLOaVsjh4rsUecrNIdSUtUlD\n-----END CERTIFICATE-----\n\n\nIssuer: C = US, O = Internet Security Research Group, CN = ISRG Root X1\nNot Before: Jun  4 11:04:38 2015 GMT\nNot After : Jun  4 11:04:38 2035 GMT\n-----BEGIN CERTIFICATE-----\nMIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\nTzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\ncmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\nWhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\nZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\nMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\nh77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\n0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\nA5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\nT8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\nB5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\nB5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\nKBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\nOlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\njh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\nqHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\nrU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\nHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\nhkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\nubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\n3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\nNFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\nORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\nTkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\njNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\noyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\n4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\nmRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\nemyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=\n-----END CERTIFICATE-----\n\nSubject: C=IE, O=Baltimore, OU=CyberTrust, CN=Baltimore CyberTrust Root\nNot Before: May 12 18:46:00 2000 GMT\nNot After : May 12 23:59:00 2025 GMT\n-----BEGIN CERTIFICATE-----\nMIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ\nRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD\nVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX\nDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y\nZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy\nVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr\nmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr\nIZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK\nmpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu\nXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy\ndc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye\njl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1\nBE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3\nDQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92\n9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx\njkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0\nEpn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz\nksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS\nR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp\n-----END CERTIFICATE-----\n\nSubject: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA\nNot Before: May 21 04:00:00 2002 GMT\nNot After : May 21 04:00:00 2022 GMT\n-----BEGIN CERTIFICATE-----\nMIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT\nMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i\nYWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG\nEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg\nR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9\n9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq\nfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv\niS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU\n1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+\nbw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW\nMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA\nephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l\nuMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn\nZ57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS\ntQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF\nPseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un\nhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV\n5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==\n-----END CERTIFICATE-----\n\nSubject: C=US, O=Symantec Corporation, OU=Symantec Trust Network, CN=Symantec Class 3 ECC 256 bit SSL CA - G2\nNot Before: May 12 00:00:00 2015 GMT\nNot After : May 11 23:59:59 2025 GMT\n-----BEGIN CERTIFICATE-----\nMIIEajCCA1KgAwIBAgIQP5KHvp0dpKN6nfYoLndaxDANBgkqhkiG9w0BAQsFADCB\nyjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\nExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp\nU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW\nZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0\naG9yaXR5IC0gRzUwHhcNMTUwNTEyMDAwMDAwWhcNMjUwNTExMjM1OTU5WjCBgDEL\nMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8wHQYD\nVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMTEwLwYDVQQDEyhTeW1hbnRlYyBD\nbGFzcyAzIEVDQyAyNTYgYml0IFNTTCBDQSAtIEcyMFkwEwYHKoZIzj0CAQYIKoZI\nzj0DAQcDQgAEDxukkdfnrOfRTk63ZFvhj39uBNOrONtEt0Bcbb2WljffeYmGZ/ex\nHwie/WM7RoyfvVPoFdyXPiuBRq2Gfw4BOaOCAV0wggFZMC4GCCsGAQUFBwEBBCIw\nIDAeBggrBgEFBQcwAYYSaHR0cDovL3Muc3ltY2QuY29tMBIGA1UdEwEB/wQIMAYB\nAf8CAQAwZQYDVR0gBF4wXDBaBgpghkgBhvhFAQc2MEwwIwYIKwYBBQUHAgEWF2h0\ndHBzOi8vZC5zeW1jYi5jb20vY3BzMCUGCCsGAQUFBwICMBkaF2h0dHBzOi8vZC5z\neW1jYi5jb20vcnBhMC8GA1UdHwQoMCYwJKAioCCGHmh0dHA6Ly9zLnN5bWNiLmNv\nbS9wY2EzLWc1LmNybDAOBgNVHQ8BAf8EBAMCAQYwKwYDVR0RBCQwIqQgMB4xHDAa\nBgNVBAMTE1NZTUMtRUNDLUNBLXAyNTYtMjIwHQYDVR0OBBYEFCXwiuFLetkBlQrt\nxlPxjHgf2fP4MB8GA1UdIwQYMBaAFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG\nSIb3DQEBCwUAA4IBAQAMMGUXBaWTdaLxsTGtcB/naqjIQrLvoV9NG+7MoHpGd/69\ndZ/h2zOy7sGFUHoG/0HGRA9rxT/5w5GkEVIVkxtWyIWWq6rs4CTZt8Bej/KHYRbo\njtEDUkCTZSTLiCvguPyvinXgxy+LHT+PmdtEfXsvcdbeBSWUYpOsDYvD2hNtz9dw\nOd5nBosMApmdxt+z7LQyZu8wMnfI1U6IMO+RWowxZ8uy0oswdFYd32l9xe+aAE/k\ny9alLu/M9pvxiUKufqHJRgDBKA6uDjHLMPX+/nxXaNCPX3SI4KVZ1stHQ/U5oNlM\ndHN9umAvlU313g0IgJrjsQ2nIdf9dsdP+6lrmP7s\n-----END CERTIFICATE-----\n\nSubject: C=US, O=VeriSign, Inc., OU=VeriSign Trust Network, OU=(c) 2006 VeriSign, Inc. - For authorized use only, CN=VeriSign Class 3 Public Primary Certification Authority - G5\nNot Before: Nov  8 00:00:00 2006 GMT\nNot After : Jul 16 23:59:59 2036 GMT\n-----BEGIN CERTIFICATE-----\nMIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB\nyjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL\nExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp\nU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW\nZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0\naG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL\nMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW\nZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln\nbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp\nU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y\naXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1\nnmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex\nt0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz\nSdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG\nBO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+\nrCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/\nNIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E\nBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH\nBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy\naXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv\nMzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE\np6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y\n5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK\nWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ\n4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N\nhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq\n-----END CERTIFICATE-----\n\nSubject: C=US, O=The Go Daddy Group, Inc., OU=Go Daddy Class 2 Certification Authority\nNot Before: Jun 29 17:06:20 2004 GMT\nNot After : Jun 29 17:06:20 2034 GMT\n-----BEGIN CERTIFICATE-----\nMIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh\nMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE\nYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3\nMDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo\nZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg\nMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN\nADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA\nPVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w\nwdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi\nEqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY\navx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+\nYihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE\nsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h\n/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5\nIEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj\nYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD\nggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy\nOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P\nTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ\nHmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER\ndEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf\nReYNnyicsbkqWletNw+vHX/bvZ8=\n-----END CERTIFICATE-----\n\n# Note: Amazon ATS endpoint uses this (2018/12/18)\nSubject: C=US, O=Starfield Technologies, Inc., OU=Starfield Class 2 Certification Authority\nNot Before: Jun 29 17:39:16 2004 GMT\nNot After : Jun 29 17:39:16 2034 GMT\n-----BEGIN CERTIFICATE-----\nMIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl\nMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp\nU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw\nNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE\nChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp\nZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3\nDQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf\n8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN\n+lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0\nX9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa\nK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA\n1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G\nA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR\nzt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0\nYXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD\nbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w\nDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3\nL7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D\neruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl\nxy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp\nVSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY\nWQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=\n-----END CERTIFICATE-----\n\nNot Before: Sep  1 00:00:00 2009 GMT\nNot After : Dec 31 23:59:59 2037 GMT\nSubject: C=US, ST=Arizona, L=Scottsdale, O=Starfield Technologies, Inc., CN=Starfield Root Certificate Authority - G2\n-----BEGIN CERTIFICATE-----\nMIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx\nEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT\nHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs\nZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw\nMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6\nb25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj\naG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp\nY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg\nnLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1\nHOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N\nHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN\ndloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0\nHZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO\nBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G\nCSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU\nsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3\n4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg\n8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K\npL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1\nmMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0\n-----END CERTIFICATE-----\n\nSubject: C=US, ST=Arizona, L=Scottsdale, O=Starfield Technologies, Inc., CN=Starfield Services Root Certificate Authority - G2\nNot Before: Sep  1 00:00:00 2009 GMT\nNot After : Dec 31 23:59:59 2037 GMT\n-----BEGIN CERTIFICATE-----\nMIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx\nEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT\nHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs\nZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5\nMDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD\nVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy\nZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy\ndmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI\nhvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p\nOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2\n8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K\nTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe\nhRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk\n6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw\nDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q\nAdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI\nbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB\nve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z\nqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd\niEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn\n0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN\nsSi6\n-----END CERTIFICATE-----\n\nSubject: C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA\nNot Before: Sep  1 12:00:00 1998 GMT\nNot After : Jan 28 12:00:00 2028 GMT\n-----BEGIN CERTIFICATE-----\nMIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG\nA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv\nb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw\nMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i\nYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT\naWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ\njc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp\nxy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp\n1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG\nsnUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ\nU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8\n9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E\nBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B\nAQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz\nyj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE\n38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP\nAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad\nDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME\nHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==\n-----END CERTIFICATE-----\n\nSubject: OU = GlobalSign ECC Root CA - R5, O = GlobalSign, CN = GlobalSign\nNot Before: Nov 13 00:00:00 2012 GMT\nNot After : Jan 19 03:14:07 2038 GMT\n-----BEGIN CERTIFICATE-----\nMIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEk\nMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpH\nbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX\nDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD\nQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu\nMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6SFkc\n8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8ke\nhOvRnkmSh5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYD\nVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYI\nKoZIzj0EAwMDaAAwZQIxAOVpEslu28YxuglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg\n515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7yFz9SO8NdCKoCOJuxUnO\nxwy8p2Fp8fc74SrL+SvzZpA3\n-----END CERTIFICATE-----\n\nSubject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert High Assurance EV Root CA\nNot Before: Nov 10 00:00:00 2006 GMT\nNot After : Nov 10 00:00:00 2031 GMT\n-----BEGIN CERTIFICATE-----\nMIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j\nZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL\nMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3\nLmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug\nRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm\n+9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW\nPNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM\nxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB\nIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3\nhzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg\nEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF\nMAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA\nFLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec\nnzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z\neM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF\nhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2\nYzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe\nvEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep\n+OkuE6N36B9K\n-----END CERTIFICATE-----\n\nSubject: C=US, O=DigiCert Inc, OU=www.digicert.com, CN=DigiCert Global Root CA\nNot Before: Nov 10 00:00:00 2006 GMT\nNot After : Nov 10 00:00:00 2031 GMT\n-----BEGIN CERTIFICATE-----\nMIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\nQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\nMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\nb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\nCSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\nnh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\nT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\ngdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\nBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\nTLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\nDQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\nhMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\n06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\nPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\nYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\nCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n-----END CERTIFICATE-----\n\n# *.azure-devices.de use this root.\nSubject: C = DE, O = D-Trust GmbH, CN = D-TRUST Root Class 3 CA 2 2009\nNot Before: Nov  5 08:35:58 2009 GMT\nNot After : Nov  5 08:35:58 2029 GMT\n-----BEGIN CERTIFICATE-----\nMIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF\nMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD\nbGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha\nME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM\nHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB\nBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03\nUAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42\ntSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R\nySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM\nlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp\n/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G\nA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G\nA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj\ndG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy\nMENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl\ncmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js\nL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL\nBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni\nacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0\no3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K\nzCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8\nPIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y\nJohw1+qRzT65ysCQblrGXnRl11z+o+I=\n-----END CERTIFICATE-----\n\n# https://www.amazontrust.com/repository/\nSubject: C = US, O = Amazon, CN = Amazon Root CA 1\nNot Before: May 26 00:00:00 2015 GMT\nNot After : Jan 17 00:00:00 2038 GMT\n-----BEGIN CERTIFICATE-----\nMIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\nADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\nb24gUm9vdCBDQSAxMB4XDTE1MDUyNjAwMDAwMFoXDTM4MDExNzAwMDAwMFowOTEL\nMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\nb3QgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALJ4gHHKeNXj\nca9HgFB0fW7Y14h29Jlo91ghYPl0hAEvrAIthtOgQ3pOsqTQNroBvo3bSMgHFzZM\n9O6II8c+6zf1tRn4SWiw3te5djgdYZ6k/oI2peVKVuRF4fn9tBb6dNqcmzU5L/qw\nIFAGbHrQgLKm+a/sRxmPUDgH3KKHOVj4utWp+UhnMJbulHheb4mjUcAwhmahRWa6\nVOujw5H5SNz/0egwLX0tdHA114gk957EWW67c4cX8jJGKLhD+rcdqsq08p8kDi1L\n93FcXmn/6pUCyziKrlA4b9v7LWIbxcceVOF34GfID5yHI9Y/QCB/IIDEgEw+OyQm\njgSubJrIqg0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\nAYYwHQYDVR0OBBYEFIQYzIU07LwMlJQuCFmcx7IQTgoIMA0GCSqGSIb3DQEBCwUA\nA4IBAQCY8jdaQZChGsV2USggNiMOruYou6r4lK5IpDB/G/wkjUu0yKGX9rbxenDI\nU5PMCCjjmCXPI6T53iHTfIUJrU6adTrCC2qJeHZERxhlbI1Bjjt/msv0tadQ1wUs\nN+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv\no/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU\n5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy\nrqXRfboQnoZsG4q5WTP468SQvvG5\n-----END CERTIFICATE-----\n\nSubject: C = US, O = Amazon, CN = Amazon Root CA 2\nNot Before: May 26 00:00:00 2015 GMT\nNot After : May 26 00:00:00 2040 GMT\n-----BEGIN CERTIFICATE-----\nMIIFQTCCAymgAwIBAgITBmyf0pY1hp8KD+WGePhbJruKNzANBgkqhkiG9w0BAQwF\nADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\nb24gUm9vdCBDQSAyMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTEL\nMAkGA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJv\nb3QgQ0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK2Wny2cSkxK\ngXlRmeyKy2tgURO8TW0G/LAIjd0ZEGrHJgw12MBvIITplLGbhQPDW9tK6Mj4kHbZ\nW0/jTOgGNk3Mmqw9DJArktQGGWCsN0R5hYGCrVo34A3MnaZMUnbqQ523BNFQ9lXg\n1dKmSYXpN+nKfq5clU1Imj+uIFptiJXZNLhSGkOQsL9sBbm2eLfq0OQ6PBJTYv9K\n8nu+NQWpEjTj82R0Yiw9AElaKP4yRLuH3WUnAnE72kr3H9rN9yFVkE8P7K6C4Z9r\n2UXTu/Bfh+08LDmG2j/e7HJV63mjrdvdfLC6HM783k81ds8P+HgfajZRRidhW+me\nz/CiVX18JYpvL7TFz4QuK/0NURBs+18bvBt+xa47mAExkv8LV/SasrlX6avvDXbR\n8O70zoan4G7ptGmh32n2M8ZpLpcTnqWHsFcQgTfJU7O7f/aS0ZzQGPSSbtqDT6Zj\nmUyl+17vIWR6IF9sZIUVyzfpYgwLKhbcAS4y2j5L9Z469hdAlO+ekQiG+r5jqFoz\n7Mt0Q5X5bGlSNscpb/xVA1wf+5+9R+vnSUeVC06JIglJ4PVhHvG/LopyboBZ/1c6\n+XUyo05f7O0oYtlNc/LMgRdg7c3r3NunysV+Ar3yVAhU/bQtCSwXVEqY0VThUWcI\n0u1ufm8/0i2BWSlmy5A5lREedCf+3euvAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMB\nAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSwDPBMMPQFWAJI/TPlUq9LhONm\nUjANBgkqhkiG9w0BAQwFAAOCAgEAqqiAjw54o+Ci1M3m9Zh6O+oAA7CXDpO8Wqj2\nLIxyh6mx/H9z/WNxeKWHWc8w4Q0QshNabYL1auaAn6AFC2jkR2vHat+2/XcycuUY\n+gn0oJMsXdKMdYV2ZZAMA3m3MSNjrXiDCYZohMr/+c8mmpJ5581LxedhpxfL86kS\nk5Nrp+gvU5LEYFiwzAJRGFuFjWJZY7attN6a+yb3ACfAXVU3dJnJUH/jWS5E4ywl\n7uxMMne0nxrpS10gxdr9HIcWxkPo1LsmmkVwXqkLN1PiRnsn/eBG8om3zEK2yygm\nbtmlyTrIQRNg91CMFa6ybRoVGld45pIq2WWQgj9sAq+uEjonljYE1x2igGOpm/Hl\nurR8FLBOybEfdF849lHqm/osohHUqS0nGkWxr7JOcQ3AWEbWaQbLU8uz/mtBzUF+\nfUwPfHJ5elnNXkoOrJupmHN5fLT0zLm4BwyydFy4x2+IoZCn9Kr5v2c69BoVYh63\nn749sSmvZ6ES8lgQGVMDMBu4Gon2nL2XA46jCfMdiyHxtN/kHNGfZQIG6lzWE7OE\n76KlXIx3KadowGuuQNKotOrN8I1LOJwZmhsoVLiJkO/KdYE+HvJkJMcYr07/R54H\n9jVlpNMKVv/1F2Rs76giJUmTtt8AF9pYfl3uxRuw0dFfIRDH+fO6AgonB8Xx1sfT\n4PsJYGw=\n-----END CERTIFICATE-----\n\nNot Before: May 26 00:00:00 2015 GMT\nNot After : May 26 00:00:00 2040 GMT\nSubject: C = US, O = Amazon, CN = Amazon Root CA 3\n-----BEGIN CERTIFICATE-----\nMIIBtjCCAVugAwIBAgITBmyf1XSXNmY/Owua2eiedgPySjAKBggqhkjOPQQDAjA5\nMQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g\nUm9vdCBDQSAzMB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG\nA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg\nQ0EgMzBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABCmXp8ZBf8ANm+gBG1bG8lKl\nui2yEujSLtf6ycXYqm0fc4E7O5hrOXwzpcVOho6AF2hiRVd9RFgdszflZwjrZt6j\nQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBSr\nttvXBp43rDCGB5Fwx5zEGbF4wDAKBggqhkjOPQQDAgNJADBGAiEA4IWSoxe3jfkr\nBqWTrBqYaGFy+uGh0PsceGCmQ5nFuMQCIQCcAu/xlJyzlvnrxir4tiz+OpAUFteM\nYyRIHN8wfdVoOw==\n-----END CERTIFICATE-----\n\nNot Before: May 26 00:00:00 2015 GMT\nNot After : May 26 00:00:00 2040 GMT\nSubject: C = US, O = Amazon, CN = Amazon Root CA 4\n-----BEGIN CERTIFICATE-----\nMIIB8jCCAXigAwIBAgITBmyf18G7EEwpQ+Vxe3ssyBrBDjAKBggqhkjOPQQDAzA5\nMQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6b24g\nUm9vdCBDQSA0MB4XDTE1MDUyNjAwMDAwMFoXDTQwMDUyNjAwMDAwMFowOTELMAkG\nA1UEBhMCVVMxDzANBgNVBAoTBkFtYXpvbjEZMBcGA1UEAxMQQW1hem9uIFJvb3Qg\nQ0EgNDB2MBAGByqGSM49AgEGBSuBBAAiA2IABNKrijdPo1MN/sGKe0uoe0ZLY7Bi\n9i0b2whxIdIA6GO9mif78DluXeo9pcmBqqNbIJhFXRbb/egQbeOc4OO9X4Ri83Bk\nM6DLJC9wuoihKqB1+IGuYgbEgds5bimwHvouXKNCMEAwDwYDVR0TAQH/BAUwAwEB\n/zAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFNPsxzplbszh2naaVvuc84ZtV+WB\nMAoGCCqGSM49BAMDA2gAMGUCMDqLIfG9fhGt0O9Yli/W651+kI0rz2ZVwyzjKKlw\nCkcO8DdZEv8tmZQoTipPNU0zWgIxAOp1AE47xDqUEpHJWEadIRNyp4iciuRMStuW\n1KyLa2tJElMzrdfkviT8tQp21KW8EA==\n-----END CERTIFICATE-----\n\nNot Before: Nov 10 00:00:00 2006 GMT\nNot After : Nov 10 00:00:00 2031 GMT\nSubject: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA\n-----BEGIN CERTIFICATE-----\nMIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\nMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\nd3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\nQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\nMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\nb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\nCSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\nnh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\nT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\ngdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\nBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\nTLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\nDQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\nhMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\n06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\nPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\nYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\nCAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n-----END CERTIFICATE-----\n\nNot Before: Nov 13 00:00:00 2012 GMT\nNot After : Jan 19 03:14:07 2038 GMT\nSubject: OU = GlobalSign ECC Root CA - R4, O = GlobalSign, CN = GlobalSign\n-----BEGIN CERTIFICATE-----\nMIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEk\nMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpH\nbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoX\nDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMbR2xvYmFsU2lnbiBFQ0MgUm9vdCBD\nQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQDEwpHbG9iYWxTaWdu\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprlOQcJ\nFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAw\nDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61F\nuOJAf/sKbvu+M8k8o4TVMAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGX\nkPoUVy0D7O48027KqGx2vKLeuwIgJ6iFJzWbVsaj8kfSt24bAgAXqmemFZHe+pTs\newv4n4Q=\n-----END CERTIFICATE-----\n\nNot Before: Nov  1 00:00:42 2018 GMT\nNot After : Nov  1 00:00:42 2042 GMT\nSubject: C = US, O = Google Trust Services LLC, CN = GTS LTSR\n-----BEGIN CERTIFICATE-----\nMIIBxTCCAWugAwIBAgINAfD3nVndblD3QnNxUDAKBggqhkjOPQQDAjBEMQswCQYD\nVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExMQzERMA8G\nA1UEAxMIR1RTIExUU1IwHhcNMTgxMTAxMDAwMDQyWhcNNDIxMTAxMDAwMDQyWjBE\nMQswCQYDVQQGEwJVUzEiMCAGA1UEChMZR29vZ2xlIFRydXN0IFNlcnZpY2VzIExM\nQzERMA8GA1UEAxMIR1RTIExUU1IwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAATN\n8YyO2u+yCQoZdwAkUNv5c3dokfULfrA6QJgFV2XMuENtQZIG5HUOS6jFn8f0ySlV\neORCxqFyjDJyRn86d+Iko0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUw\nAwEB/zAdBgNVHQ4EFgQUPv7/zFLrvzQ+PfNA0OQlsV+4u1IwCgYIKoZIzj0EAwID\nSAAwRQIhAPKuf/VtBHqGw3TUwUIq7TfaExp3bH7bjCBmVXJupT9FAiBr0SmCtsuk\nmiGgpajjf/gFigGM34F9021bCWs1MbL0SA==\n-----END CERTIFICATE-----\n\n"
  },
  {
    "path": "test/data/dredir/index.html",
    "content": "hi\n"
  },
  {
    "path": "test/data/e8.crt",
    "content": "\n 1 s:C=US, O=Let's Encrypt, CN=E8\n   i:C=US, O=Internet Security Research Group, CN=ISRG Root X1\n   a:PKEY: id-ecPublicKey, 384 (bit); sigalg: RSA-SHA256\n   v:NotBefore: Mar 13 00:00:00 2024 GMT; NotAfter: Mar 12 23:59:59 2027 GMT\n-----BEGIN CERTIFICATE-----\nMIIEVjCCAj6gAwIBAgIQY5WTY8JOcIJxWRi/w9ftVjANBgkqhkiG9w0BAQsFADBP\nMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy\nY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa\nFw0yNzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF\nbmNyeXB0MQswCQYDVQQDEwJFODB2MBAGByqGSM49AgEGBSuBBAAiA2IABNFl8l7c\nS7QMApzSsvru6WyrOq44ofTUOTIzxULUzDMMNMchIJBwXOhiLxxxs0LXeb5GDcHb\nR6EToMffgSZjO9SNHfY9gjMy9vQr5/WWOrQTZxh7az6NSNnq3u2ubT6HTKOB+DCB\n9TAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB\nMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFI8NE6L2Ln7RUGwzGDhdWY4j\ncpHKMB8GA1UdIwQYMBaAFHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEB\nBCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzATBgNVHSAE\nDDAKMAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDEuYy5sZW5j\nci5vcmcvMA0GCSqGSIb3DQEBCwUAA4ICAQBnE0hGINKsCYWi0Xx1ygxD5qihEjZ0\nRI3tTZz1wuATH3ZwYPIp97kWEayanD1j0cDhIYzy4CkDo2jB8D5t0a6zZWzlr98d\nAQFNh8uKJkIHdLShy+nUyeZxc5bNeMp1Lu0gSzE4McqfmNMvIpeiwWSYO9w82Ob8\notvXcO2JUYi3svHIWRm3+707DUbL51XMcY2iZdlCq4Wa9nbuk3WTU4gr6LY8MzVA\naDQG2+4U3eJ6qUF10bBnR1uuVyDYs9RhrwucRVnfuDj29CMLTsplM5f5wSV5hUpm\nUwp/vV7M4w4aGunt74koX71n4EdagCsL/Yk5+mAQU0+tue0JOfAV/R6t1k+Xk9s2\nHMQFeoxppfzAVC04FdG9M+AC2JWxmFSt6BCuh3CEey3fE52Qrj9YM75rtvIjsm/1\nHl+u//Wqxnu1ZQ4jpa+VpuZiGOlWrqSP9eogdOhCGisnyewWJwRQOqK16wiGyZeR\nxs/Bekw65vwSIaVkBruPiTfMOo0Zh4gVa8/qJgMbJbyrwwG97z/PRgmLKCDl8z3d\ntA0Z7qq7fta0Gl24uyuB05dqI5J1LvAzKuWdIjT1tP8qCoxSE/xpix8hX2dt3h+/\njujUgFPFZ0EVZ0xSyBNRF3MboGZnYXFUxpNjTWPKpagDHJQmqrAcDmWJnMsFY3jS\nu1igv3OefnWjSQ==\n-----END CERTIFICATE-----\n\n"
  },
  {
    "path": "test/data/empty.js",
    "content": ""
  },
  {
    "path": "test/data/gzip.txt",
    "content": "hi\n"
  },
  {
    "path": "test/data/index.html",
    "content": "hi\n"
  },
  {
    "path": "test/data/range.txt",
    "content": "Faith of consciousness is freedom\nFaith of feeling is weakness\nFaith of body is stupidity.\nLove of consciousness evokes the same in response\nLove of feeling evokes the opposite\nLove of body depends only on type and polarity.\nHope of consciousness is strength\nHope of feelings is slavery\nHope of body is disease.\n"
  },
  {
    "path": "test/data/secret/secret.txt",
    "content": "secret\n"
  },
  {
    "path": "test/data/ss_ca.pem",
    "content": "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number:\n            11:2a:0e:3c:6a:8c:85:ff:6e:6a:bc:db:95:51:70:ce:b4:30:78:c7\n        Signature Algorithm: ecdsa-with-SHA256\n        Issuer: C = IE, L = Dublin, O = Cesanta, CN = Test Root\n        Validity\n            Not Before: May  9 21:51:44 2020 GMT\n            Not After : May  9 21:51:44 2050 GMT\n        Subject: C = IE, L = Dublin, O = Cesanta, CN = Test Root\n        Subject Public Key Info:\n            Public Key Algorithm: id-ecPublicKey\n                Public-Key: (256 bit)\n                pub:\n                    04:2c:ab:d1:02:66:24:96:d7:12:3e:09:50:4f:f1:\n                    50:ee:51:e8:55:03:5e:ba:b1:1d:98:b2:72:79:27:\n                    a8:1b:31:0d:5d:50:21:ff:42:f2:da:74:17:5e:53:\n                    b2:65:41:c1:fc:84:de:4a:11:b9:8c:f4:19:d9:c4:\n                    ca:2b:ea:eb:2c\n                ASN1 OID: prime256v1\n                NIST CURVE: P-256\n        X509v3 extensions:\n            X509v3 Basic Constraints: \n                CA:TRUE\n            X509v3 Key Usage: \n                Digital Signature, Key Encipherment, Key Agreement, Certificate Sign, CRL Sign\n    Signature Algorithm: ecdsa-with-SHA256\n         30:46:02:21:00:9c:71:6c:00:8c:06:41:0c:91:2f:cd:41:d3:\n         87:47:e9:df:3a:22:ad:25:7c:bf:0e:2b:39:dd:7a:0c:4e:68:\n         1d:02:21:00:8f:c1:22:30:10:61:5d:51:10:ea:08:2d:02:63:\n         67:67:32:b5:06:63:96:57:bb:78:47:0a:88:d9:19:2e:f3:be\n-----BEGIN CERTIFICATE-----\nMIIBqjCCAU+gAwIBAgIUESoOPGqMhf9uarzblVFwzrQweMcwCgYIKoZIzj0EAwIw\nRDELMAkGA1UEBhMCSUUxDzANBgNVBAcMBkR1YmxpbjEQMA4GA1UECgwHQ2VzYW50\nYTESMBAGA1UEAwwJVGVzdCBSb290MCAXDTIwMDUwOTIxNTE0NFoYDzIwNTAwNTA5\nMjE1MTQ0WjBEMQswCQYDVQQGEwJJRTEPMA0GA1UEBwwGRHVibGluMRAwDgYDVQQK\nDAdDZXNhbnRhMRIwEAYDVQQDDAlUZXN0IFJvb3QwWTATBgcqhkjOPQIBBggqhkjO\nPQMBBwNCAAQsq9ECZiSW1xI+CVBP8VDuUehVA166sR2YsnJ5J6gbMQ1dUCH/QvLa\ndBdeU7JlQcH8hN5KEbmM9BnZxMor6ussox0wGzAMBgNVHRMEBTADAQH/MAsGA1Ud\nDwQEAwIBrjAKBggqhkjOPQQDAgNJADBGAiEAnHFsAIwGQQyRL81B04dH6d86Iq0l\nfL8OKzndegxOaB0CIQCPwSIwEGFdURDqCC0CY2dnMrUGY5ZXu3hHCojZGS7zvg==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "test/data/ss_client.pem",
    "content": "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number:\n            03:d8:95:71:ba:5f:70:c8:4d:6a:e8:a6:0f:aa:40:d5:fc:d9:bc:6e\n        Signature Algorithm: ecdsa-with-SHA256\n        Issuer: C = IE, L = Dublin, O = Cesanta, CN = Test Root\n        Validity\n            Not Before: May  9 21:51:52 2020 GMT\n            Not After : May  9 21:51:52 2030 GMT\n        Subject: CN = client\n        Subject Public Key Info:\n            Public Key Algorithm: id-ecPublicKey\n                Public-Key: (256 bit)\n                pub:\n                    04:e2:2e:72:7b:b6:2d:a3:d3:3b:0e:b1:4e:8a:09:\n                    19:66:ff:d6:0e:d4:3f:47:8c:20:ab:06:db:25:77:\n                    8b:2a:ac:fa:a4:e2:f8:97:ba:10:c5:fa:5d:0b:ee:\n                    28:16:56:78:0f:30:17:2b:6b:04:6c:dc:c8:f8:12:\n                    23:d3:2f:01:58\n                ASN1 OID: prime256v1\n                NIST CURVE: P-256\n        X509v3 extensions:\n            X509v3 Basic Constraints: \n                CA:FALSE\n            X509v3 Key Usage: \n                Digital Signature, Key Encipherment, Key Agreement\n            X509v3 Extended Key Usage: \n                TLS Web Client Authentication\n    Signature Algorithm: ecdsa-with-SHA256\n         30:46:02:21:00:de:e5:30:ae:50:e9:a7:14:a0:c3:79:29:df:\n         bf:d3:a3:f8:19:b0:19:b5:ab:3e:6e:c9:29:18:86:ff:fe:a7:\n         b0:02:21:00:f5:ba:90:d6:1c:fe:ff:05:44:9a:b1:20:2c:ee:\n         00:68:20:85:f7:0f:86:a2:13:1e:86:9a:03:6d:74:aa:72:c2\n-----BEGIN CERTIFICATE-----\nMIIBhzCCASygAwIBAgIUA9iVcbpfcMhNauimD6pA1fzZvG4wCgYIKoZIzj0EAwIw\nRDELMAkGA1UEBhMCSUUxDzANBgNVBAcMBkR1YmxpbjEQMA4GA1UECgwHQ2VzYW50\nYTESMBAGA1UEAwwJVGVzdCBSb290MB4XDTIwMDUwOTIxNTE1MloXDTMwMDUwOTIx\nNTE1MlowETEPMA0GA1UEAwwGY2xpZW50MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD\nQgAE4i5ye7Yto9M7DrFOigkZZv/WDtQ/R4wgqwbbJXeLKqz6pOL4l7oQxfpdC+4o\nFlZ4DzAXK2sEbNzI+BIj0y8BWKMvMC0wCQYDVR0TBAIwADALBgNVHQ8EBAMCA6gw\nEwYDVR0lBAwwCgYIKwYBBQUHAwIwCgYIKoZIzj0EAwIDSQAwRgIhAN7lMK5Q6acU\noMN5Kd+/06P4GbAZtas+bskpGIb//qewAiEA9bqQ1hz+/wVEmrEgLO4AaCCF9w+G\nohMehpoDbXSqcsI=\n-----END CERTIFICATE-----\n-----BEGIN PRIVATE KEY-----\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgk5sv3YwDGTm29Czy\nUWuKlbfbvZqZv1fFRBOn2S0D7SuhRANCAATiLnJ7ti2j0zsOsU6KCRlm/9YO1D9H\njCCrBtsld4sqrPqk4viXuhDF+l0L7igWVngPMBcrawRs3Mj4EiPTLwFY\n-----END PRIVATE KEY-----\n"
  },
  {
    "path": "test/data/ss_server.pem",
    "content": "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number:\n            6e:73:28:55:df:13:b5:61:f5:4f:4f:5d:00:d9:0a:d8:b5:3a:21:4b\n        Signature Algorithm: ecdsa-with-SHA256\n        Issuer: C = IE, L = Dublin, O = Cesanta, CN = Test Root\n        Validity\n            Not Before: May  9 21:51:49 2020 GMT\n            Not After : May  9 21:51:49 2030 GMT\n        Subject: CN = server\n        Subject Public Key Info:\n            Public Key Algorithm: id-ecPublicKey\n                Public-Key: (256 bit)\n                pub:\n                    04:92:e0:46:9c:89:c3:37:a9:74:eb:35:55:43:55:\n                    5c:ac:eb:c7:e4:50:ee:f4:c0:ba:17:02:5c:d9:ed:\n                    b4:d4:ff:21:12:9a:b4:43:f4:89:4b:69:e4:6d:2b:\n                    96:1f:fc:01:4d:30:5a:79:73:76:ba:19:41:cc:c5:\n                    16:2b:bf:74:28\n                ASN1 OID: prime256v1\n                NIST CURVE: P-256\n        X509v3 extensions:\n            X509v3 Basic Constraints: \n                CA:FALSE\n            X509v3 Key Usage: \n                Digital Signature, Key Encipherment, Key Agreement\n            X509v3 Extended Key Usage: \n                TLS Web Server Authentication\n    Signature Algorithm: ecdsa-with-SHA256\n         30:46:02:21:00:fa:3a:c7:1e:cb:8c:27:59:41:8d:77:dd:7b:\n         cb:8c:08:15:16:b9:6e:70:e6:47:38:d1:55:42:e0:d7:66:c8:\n         f0:02:21:00:cc:70:4d:96:28:00:d3:c7:39:53:74:b2:49:87:\n         27:92:1b:ab:1a:0e:74:06:59:42:23:47:98:43:d8:20:a7:fa\n-----BEGIN CERTIFICATE-----\nMIIBhzCCASygAwIBAgIUbnMoVd8TtWH1T09dANkK2LU6IUswCgYIKoZIzj0EAwIw\nRDELMAkGA1UEBhMCSUUxDzANBgNVBAcMBkR1YmxpbjEQMA4GA1UECgwHQ2VzYW50\nYTESMBAGA1UEAwwJVGVzdCBSb290MB4XDTIwMDUwOTIxNTE0OVoXDTMwMDUwOTIx\nNTE0OVowETEPMA0GA1UEAwwGc2VydmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD\nQgAEkuBGnInDN6l06zVVQ1VcrOvH5FDu9MC6FwJc2e201P8hEpq0Q/SJS2nkbSuW\nH/wBTTBaeXN2uhlBzMUWK790KKMvMC0wCQYDVR0TBAIwADALBgNVHQ8EBAMCA6gw\nEwYDVR0lBAwwCgYIKwYBBQUHAwEwCgYIKoZIzj0EAwIDSQAwRgIhAPo6xx7LjCdZ\nQY133XvLjAgVFrlucOZHONFVQuDXZsjwAiEAzHBNligA08c5U3SySYcnkhurGg50\nBllCI0eYQ9ggp/o=\n-----END CERTIFICATE-----\n-----BEGIN PRIVATE KEY-----\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQglNni0t9Dg9icgG8w\nkbfxWSS+TuNgbtNybIQXcm3NHpmhRANCAASS4EacicM3qXTrNVVDVVys68fkUO70\nwLoXAlzZ7bTU/yESmrRD9IlLaeRtK5Yf/AFNMFp5c3a6GUHMxRYrv3Qo\n-----END PRIVATE KEY-----\n"
  },
  {
    "path": "test/data/ssi/f1.txt",
    "content": "this is f1\n"
  },
  {
    "path": "test/data/ssi/index.shtml",
    "content": "this is index\n<!--#include file=\"nested.shtml\" -->\n<!--#include file=\"recurse.shtml\" -->\n"
  },
  {
    "path": "test/data/ssi/nested.shtml",
    "content": "this is nested\n<!--#include virtual=\"/notexist.txt\"-->\n<!--#include virtual=\"/ssi/f1.txt\"-->\n"
  },
  {
    "path": "test/data/ssi/recurse.shtml",
    "content": "<!--#include file=\"recurse.shtml\"-->\nrecurse\n"
  },
  {
    "path": "test/data/ws.hex",
    "content": "0000  82 7e 00 b3 7b 22 6d 65 74 68 6f 64 22 3a 22 62  .~..{\"method\":\"b\n0010  6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22  le.adv\",\"params\"\n0020  3a 7b 22 61 64 64 72 22 3a 22 63 64 35 31 33 38  :{\"addr\":\"cd5138\n0030  35 35 35 36 61 36 22 2c 22 72 73 73 69 22 3a 2d  5556a6\",\"rssi\":-\n0040  35 35 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36  55,\"adv\":\"020106\n0050  31 62 66 66 34 63 30 30 30 32 31 35 62 37 37 39  1bff4c000215b779\n0060  64 33 35 66 30 61 37 65 34 37 61 66 62 64 34 32  d35f0a7e47afbd42\n0070  66 62 31 66 39 36 61 62 64 34 32 34 66 66 66 66  fb1f96abd424ffff\n0080  66 66 66 66 63 36 36 34 22 2c 22 72 73 70 22 3a  ffffc664\",\"rsp\":\n0090  22 30 39 30 39 36 39 34 32 34 62 35 33 32 30 35  \"090969424b53205\n00a0  35 35 33 34 32 22 2c 22 74 22 3a 31 35 39 33 30  55342\",\"t\":15930\n00b0  31 31 32 34 38 7d 7d 82 7e 00 93 7b 22 6d 65 74  11248}}.~..{\"met\n00c0  68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22  hod\":\"ble.adv\",\"\n00d0  70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a  params\":{\"addr\":\n00e0  22 66 34 37 63 64 39 62 36 32 63 62 39 22 2c 22  \"f47cd9b62cb9\",\"\n00f0  72 73 73 69 22 3a 2d 37 39 2c 22 61 64 76 22 3a  rssi\":-79,\"adv\":\n0100  22 30 32 30 31 30 36 30 64 31 36 36 61 66 65 30  \"0201060d166afe0\n0110  32 30 38 30 31 31 36 36 34 65 63 33 39 34 64 36  208011664ec394d6\n0120  63 37 37 22 2c 22 72 73 70 22 3a 22 30 37 30 39  c77\",\"rsp\":\"0709\n0130  33 33 33 38 32 64 37 31 36 31 33 33 22 2c 22 74  33382d716133\",\"t\n0140  22 3a 31 35 39 33 30 31 31 32 34 38 7d 7d 82 7e  \":1593011248}}.~\n0150  00 99 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65  ..{\"method\":\"ble\n0160  2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b  .adv\",\"params\":{\n0170  22 61 64 64 72 22 3a 22 66 63 66 31 33 36 31 66  \"addr\":\"fcf1361f\n0180  62 39 36 65 22 2c 22 72 73 73 69 22 3a 2d 37 30  b96e\",\"rssi\":-70\n0190  2c 22 61 64 76 22 3a 22 31 62 66 66 37 35 30 30  ,\"adv\":\"1bff7500\n01a0  34 32 30 34 30 31 38 30 32 30 66 63 66 31 33 36  4204018020fcf136\n01b0  31 66 62 39 36 65 66 65 66 31 33 36 31 66 62 39  1fb96efef1361fb9\n01c0  36 64 30 31 30 30 30 30 30 30 30 30 30 30 30 30  6d01000000000000\n01d0  22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31  \",\"rsp\":\"\",\"t\":1\n01e0  35 39 33 30 31 31 32 34 38 7d 7d 82 7d 7b 22 6d  593011248}}.}{\"m\n01f0  65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22  ethod\":\"ble.adv\"\n0200  2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72  ,\"params\":{\"addr\n0210  22 3a 22 35 63 66 63 34 35 62 33 32 64 61 31 22  \":\"5cfc45b32da1\"\n0220  2c 22 72 73 73 69 22 3a 2d 35 30 2c 22 61 64 76  ,\"rssi\":-50,\"adv\n0230  22 3a 22 30 32 30 31 30 36 30 61 66 66 34 63 30  \":\"0201060aff4c0\n0240  30 31 30 30 35 30 62 31 63 32 30 37 37 65 63 22  010050b1c2077ec\"\n0250  2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35  ,\"rsp\":\"\",\"t\":15\n0260  39 33 30 31 31 32 34 38 7d 7d 82 7e 00 a5 7b 22  93011248}}.~..{\"\n0270  6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76  method\":\"ble.adv\n0280  22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64  \",\"params\":{\"add\n0290  72 22 3a 22 65 34 32 37 37 61 32 32 61 34 33 32  r\":\"e4277a22a432\n02a0  22 2c 22 72 73 73 69 22 3a 2d 37 31 2c 22 61 64  \",\"rssi\":-71,\"ad\n02b0  76 22 3a 22 30 32 30 31 30 36 30 33 30 33 61 61  v\":\"0201060303aa\n02c0  66 65 31 31 31 36 61 61 66 65 32 30 30 30 30 62  fe1116aafe20000b\n02d0  38 35 31 36 34 62 30 32 37 34 38 38 62 37 30 36  85164b027488b706\n02e0  36 32 31 38 65 30 22 2c 22 72 73 70 22 3a 22 30  6218e0\",\"rsp\":\"0\n02f0  38 30 39 36 39 34 32 34 62 35 33 33 31 33 30 33  80969424b5331303\n0300  35 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 34  5\",\"t\":159301124\n0310  38 7d 7d 82 7e 00 9b 7b 22 6d 65 74 68 6f 64 22  8}}.~..{\"method\"\n0320  3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61  :\"ble.adv\",\"para\n0330  6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 63 31 31  ms\":{\"addr\":\"c11\n0340  38 62 31 30 31 63 66 30 39 22 2c 22 72 73 73 69  8b101cf09\",\"rssi\n0350  22 3a 2d 37 39 2c 22 61 64 76 22 3a 22 30 32 30  \":-79,\"adv\":\"020\n0360  31 30 36 30 33 30 33 61 61 66 65 31 35 31 36 61  1060303aafe1516a\n0370  61 66 65 30 30 64 63 31 31 31 31 31 31 31 31 35  afe00dc111111115\n0380  35 35 35 35 35 35 35 36 36 36 36 63 35 66 35 30  55555556666c5f50\n0390  30 30 30 63 35 66 35 22 2c 22 72 73 70 22 3a 22  000c5f5\",\"rsp\":\"\n03a0  22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 34 38  \",\"t\":1593011248\n03b0  7d 7d 82 7e 00 93 7b 22 6d 65 74 68 6f 64 22 3a  }}.~..{\"method\":\n03c0  22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d  \"ble.adv\",\"param\n03d0  73 22 3a 7b 22 61 64 64 72 22 3a 22 66 39 31 35  s\":{\"addr\":\"f915\n03e0  64 61 39 31 32 39 37 32 22 2c 22 72 73 73 69 22  da912972\",\"rssi\"\n03f0  3a 2d 37 38 2c 22 61 64 76 22 3a 22 30 32 30 31  :-78,\"adv\":\"0201\n0400  30 36 30 33 30 33 61 61 66 65 31 31 31 36 61 61  060303aafe1116aa\n0410  66 65 32 30 30 30 30 62 38 34 31 36 34 30 30 39  fe20000b84164009\n0420  35 64 39 38 36 64 30 36 38 39 30 62 34 63 22 2c  5d986d06890b4c\",\n0430  22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39  \"rsp\":\"\",\"t\":159\n0440  33 30 31 31 32 34 38 7d 7d 82 7e 00 99 7b 22 6d  3011248}}.~..{\"m\n0450  65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22  ethod\":\"ble.adv\"\n0460  2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72  ,\"params\":{\"addr\n0470  22 3a 22 66 63 66 31 33 36 31 66 62 39 36 65 22  \":\"fcf1361fb96e\"\n0480  2c 22 72 73 73 69 22 3a 2d 36 36 2c 22 61 64 76  ,\"rssi\":-66,\"adv\n0490  22 3a 22 31 62 66 66 37 35 30 30 34 32 30 34 30  \":\"1bff750042040\n04a0  31 38 30 32 30 66 63 66 31 33 36 31 66 62 39 36  18020fcf1361fb96\n04b0  65 66 65 66 31 33 36 31 66 62 39 36 64 30 31 30  efef1361fb96d010\n04c0  30 30 30 30 30 30 30 30 30 30 30 22 2c 22 72 73  00000000000\",\"rs\n04d0  70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31  p\":\"\",\"t\":159301\n04e0  31 32 34 38 7d 7d 82 7e 00 93 7b 22 6d 65 74 68  1248}}.~..{\"meth\n04f0  6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70  od\":\"ble.adv\",\"p\n0500  61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22  arams\":{\"addr\":\"\n0510  63 38 66 36 65 34 62 66 36 33 33 34 22 2c 22 72  c8f6e4bf6334\",\"r\n0520  73 73 69 22 3a 2d 39 33 2c 22 61 64 76 22 3a 22  ssi\":-93,\"adv\":\"\n0530  30 32 30 31 30 36 30 33 30 33 61 61 66 65 31 31  0201060303aafe11\n0540  31 36 61 61 66 65 32 30 30 30 30 62 61 65 31 62  16aafe20000bae1b\n0550  34 30 30 39 35 30 65 36 64 34 30 36 37 61 66 36  400950e6d4067af6\n0560  37 34 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22  74\",\"rsp\":\"\",\"t\"\n0570  3a 31 35 39 33 30 31 31 32 34 38 7d 7d 82 7e 00  :1593011248}}.~.\n0580  9b 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e  .{\"method\":\"ble.\n0590  61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22  adv\",\"params\":{\"\n05a0  61 64 64 72 22 3a 22 63 65 37 33 65 63 66 37 65  addr\":\"ce73ecf7e\n05b0  36 32 61 22 2c 22 72 73 73 69 22 3a 2d 38 34 2c  62a\",\"rssi\":-84,\n05c0  22 61 64 76 22 3a 22 30 32 30 31 30 36 30 33 30  \"adv\":\"020106030\n05d0  33 61 61 66 65 31 35 31 36 61 61 66 65 30 30 64  3aafe1516aafe00d\n05e0  63 31 31 31 31 31 31 31 31 35 35 35 35 35 35 35  c111111115555555\n05f0  35 36 36 36 36 64 35 66 35 30 30 30 30 64 35 66  56666d5f50000d5f\n0600  35 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a  5\",\"rsp\":\"\",\"t\":\n0610  31 35 39 33 30 31 31 32 34 38 7d 7d 82 7e 00 99  1593011248}}.~..\n0620  7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61  {\"method\":\"ble.a\n0630  64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61  dv\",\"params\":{\"a\n0640  64 64 72 22 3a 22 66 63 66 31 33 36 31 66 62 39  ddr\":\"fcf1361fb9\n0650  36 65 22 2c 22 72 73 73 69 22 3a 2d 37 31 2c 22  6e\",\"rssi\":-71,\"\n0660  61 64 76 22 3a 22 31 62 66 66 37 35 30 30 34 32  adv\":\"1bff750042\n0670  30 34 30 31 38 30 32 30 66 63 66 31 33 36 31 66  04018020fcf1361f\n0680  62 39 36 65 66 65 66 31 33 36 31 66 62 39 36 64  b96efef1361fb96d\n0690  30 31 30 30 30 30 30 30 30 30 30 30 30 30 22 2c  01000000000000\",\n06a0  22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39  \"rsp\":\"\",\"t\":159\n06b0  33 30 31 31 32 34 38 7d 7d 82 7e 00 93 7b 22 6d  3011248}}.~..{\"m\n06c0  65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22  ethod\":\"ble.adv\"\n06d0  2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72  ,\"params\":{\"addr\n06e0  22 3a 22 64 35 64 62 66 38 61 64 39 32 33 39 22  \":\"d5dbf8ad9239\"\n06f0  2c 22 72 73 73 69 22 3a 2d 38 38 2c 22 61 64 76  ,\"rssi\":-88,\"adv\n0700  22 3a 22 30 32 30 31 30 36 30 33 30 33 61 61 66  \":\"0201060303aaf\n0710  65 31 31 31 36 61 61 66 65 32 30 30 30 30 62 30  e1116aafe20000b0\n0720  61 31 39 63 30 30 39 35 64 64 66 61 31 30 36 38  a19c0095ddfa1068\n0730  39 31 38 33 61 22 2c 22 72 73 70 22 3a 22 22 2c  9183a\",\"rsp\":\"\",\n0740  22 74 22 3a 31 35 39 33 30 31 31 32 34 38 7d 7d  \"t\":1593011248}}\n0750  82 7e 00 b1 7b 22 6d 65 74 68 6f 64 22 3a 22 62  .~..{\"method\":\"b\n0760  6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22  le.adv\",\"params\"\n0770  3a 7b 22 61 64 64 72 22 3a 22 65 34 32 37 37 61  :{\"addr\":\"e4277a\n0780  32 32 61 34 33 32 22 2c 22 72 73 73 69 22 3a 2d  22a432\",\"rssi\":-\n0790  37 37 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36  77,\"adv\":\"020106\n07a0  30 33 30 33 61 61 66 65 31 37 31 36 61 61 66 65  0303aafe1716aafe\n07b0  30 30 64 35 31 31 31 31 31 32 32 32 32 32 33 33  00d5111112222233\n07c0  33 33 33 34 34 34 34 34 61 35 66 35 61 35 66 35  33344444a5f5a5f5\n07d0  61 35 66 35 30 30 30 30 22 2c 22 72 73 70 22 3a  a5f50000\",\"rsp\":\n07e0  22 30 38 30 39 36 39 34 32 34 62 35 33 33 31 33  \"080969424b53313\n07f0  30 33 35 22 2c 22 74 22 3a 31 35 39 33 30 31 31  035\",\"t\":1593011\n0800  32 34 38 7d 7d 82 7e 00 93 7b 22 6d 65 74 68 6f  248}}.~..{\"metho\n0810  64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61  d\":\"ble.adv\",\"pa\n0820  72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 63  rams\":{\"addr\":\"c\n0830  31 31 38 62 31 30 31 63 66 30 39 22 2c 22 72 73  118b101cf09\",\"rs\n0840  73 69 22 3a 2d 38 33 2c 22 61 64 76 22 3a 22 30  si\":-83,\"adv\":\"0\n0850  32 30 31 30 36 30 33 30 33 61 61 66 65 31 31 31  201060303aafe111\n0860  36 61 61 66 65 32 30 30 30 30 62 37 34 31 37 38  6aafe20000b74178\n0870  30 31 31 64 33 66 35 33 61 30 66 39 38 38 64 35  011d3f53a0f988d5\n0880  32 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a  2\",\"rsp\":\"\",\"t\":\n0890  31 35 39 33 30 31 31 32 34 38 7d 7d 82 7e 00 97  1593011248}}.~..\n08a0  7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61  {\"method\":\"ble.a\n08b0  64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61  dv\",\"params\":{\"a\n08c0  64 64 72 22 3a 22 63 39 65 63 39 33 64 39 66 35  ddr\":\"c9ec93d9f5\n08d0  38 65 22 2c 22 72 73 73 69 22 3a 2d 38 39 2c 22  8e\",\"rssi\":-89,\"\n08e0  61 64 76 22 3a 22 30 32 30 31 30 36 30 66 31 36  adv\":\"0201060f16\n08f0  36 61 66 65 30 32 30 38 30 31 31 36 36 34 65 63  6afe0208011664ec\n0900  36 34 37 34 37 35 34 66 33 38 36 33 22 2c 22 72  6474754f3863\",\"r\n0910  73 70 22 3a 22 30 37 30 39 33 33 33 35 32 64 37  sp\":\"070933352d7\n0920  31 36 31 33 33 22 2c 22 74 22 3a 31 35 39 33 30  16133\",\"t\":15930\n0930  31 31 32 34 39 7d 7d 82 7e 00 9b 7b 22 6d 65 74  11249}}.~..{\"met\n0940  68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22  hod\":\"ble.adv\",\"\n0950  70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a  params\":{\"addr\":\n0960  22 66 39 31 35 64 61 39 31 32 39 37 32 22 2c 22  \"f915da912972\",\"\n0970  72 73 73 69 22 3a 2d 38 38 2c 22 61 64 76 22 3a  rssi\":-88,\"adv\":\n0980  22 30 32 30 31 30 36 30 33 30 33 61 61 66 65 31  \"0201060303aafe1\n0990  35 31 36 61 61 66 65 30 30 64 35 31 31 31 31 31  516aafe00d511111\n09a0  31 31 31 35 35 35 35 35 35 35 35 36 36 36 36 30  1115555555566660\n09b0  30 31 61 30 30 30 30 30 36 66 61 22 2c 22 72 73  01a000006fa\",\"rs\n09c0  70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31  p\":\"\",\"t\":159301\n09d0  31 32 34 39 7d 7d 82 7e 00 9b 7b 22 6d 65 74 68  1249}}.~..{\"meth\n09e0  6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70  od\":\"ble.adv\",\"p\n09f0  61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22  arams\":{\"addr\":\"\n0a00  63 38 66 36 65 34 62 66 36 33 33 34 22 2c 22 72  c8f6e4bf6334\",\"r\n0a10  73 73 69 22 3a 2d 38 30 2c 22 61 64 76 22 3a 22  ssi\":-80,\"adv\":\"\n0a20  30 32 30 31 30 36 30 33 30 33 61 61 66 65 31 35  0201060303aafe15\n0a30  31 36 61 61 66 65 30 30 64 35 31 31 31 31 31 31  16aafe00d5111111\n0a40  31 31 35 35 35 35 35 35 35 35 36 36 36 36 30 35  1155555555666605\n0a50  31 39 30 30 30 30 30 30 30 37 22 2c 22 72 73 70  1900000007\",\"rsp\n0a60  22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31 31  \":\"\",\"t\":1593011\n0a70  32 34 39 7d 7d 82 7e 00 99 7b 22 6d 65 74 68 6f  249}}.~..{\"metho\n0a80  64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61  d\":\"ble.adv\",\"pa\n0a90  72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 66  rams\":{\"addr\":\"f\n0aa0  63 66 31 33 36 31 66 62 39 36 65 22 2c 22 72 73  cf1361fb96e\",\"rs\n0ab0  73 69 22 3a 2d 37 34 2c 22 61 64 76 22 3a 22 31  si\":-74,\"adv\":\"1\n0ac0  62 66 66 37 35 30 30 34 32 30 34 30 31 38 30 32  bff7500420401802\n0ad0  30 66 63 66 31 33 36 31 66 62 39 36 65 66 65 66  0fcf1361fb96efef\n0ae0  31 33 36 31 66 62 39 36 64 30 31 30 30 30 30 30  1361fb96d0100000\n0af0  30 30 30 30 30 30 30 22 2c 22 72 73 70 22 3a 22  0000000\",\"rsp\":\"\n0b00  22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 34 39  \",\"t\":1593011249\n0b10  7d 7d 82 7e 00 93 7b 22 6d 65 74 68 6f 64 22 3a  }}.~..{\"method\":\n0b20  22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d  \"ble.adv\",\"param\n0b30  73 22 3a 7b 22 61 64 64 72 22 3a 22 65 31 63 39  s\":{\"addr\":\"e1c9\n0b40  32 65 62 62 63 34 66 64 22 2c 22 72 73 73 69 22  2ebbc4fd\",\"rssi\"\n0b50  3a 2d 38 30 2c 22 61 64 76 22 3a 22 30 32 30 31  :-80,\"adv\":\"0201\n0b60  30 36 30 33 30 33 61 61 66 65 31 31 31 36 61 61  060303aafe1116aa\n0b70  66 65 32 30 30 30 30 62 38 66 31 36 63 30 30 37  fe20000b8f16c007\n0b80  31 66 34 36 62 37 30 36 33 61 35 31 62 65 22 2c  1f46b7063a51be\",\n0b90  22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39  \"rsp\":\"\",\"t\":159\n0ba0  33 30 31 31 32 34 39 7d 7d 82 7e 00 97 7b 22 6d  3011249}}.~..{\"m\n0bb0  65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22  ethod\":\"ble.adv\"\n0bc0  2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72  ,\"params\":{\"addr\n0bd0  22 3a 22 63 61 38 65 61 35 33 31 66 38 61 38 22  \":\"ca8ea531f8a8\"\n0be0  2c 22 72 73 73 69 22 3a 2d 36 30 2c 22 61 64 76  ,\"rssi\":-60,\"adv\n0bf0  22 3a 22 30 32 30 31 30 36 30 66 31 36 36 61 66  \":\"0201060f166af\n0c00  65 30 32 30 38 30 31 31 36 36 34 65 63 34 61 37  e0208011664ec4a7\n0c10  33 33 32 34 39 37 30 33 39 22 2c 22 72 73 70 22  332497039\",\"rsp\"\n0c20  3a 22 30 37 30 39 33 31 33 38 32 64 37 31 36 31  :\"070931382d7161\n0c30  33 33 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32  33\",\"t\":15930112\n0c40  34 39 7d 7d 82 7e 00 9b 7b 22 6d 65 74 68 6f 64  49}}.~..{\"method\n0c50  22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72  \":\"ble.adv\",\"par\n0c60  61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 63 63  ams\":{\"addr\":\"cc\n0c70  39 66 33 39 34 35 33 61 39 63 22 2c 22 72 73 73  9f39453a9c\",\"rss\n0c80  69 22 3a 2d 37 37 2c 22 61 64 76 22 3a 22 30 32  i\":-77,\"adv\":\"02\n0c90  30 31 30 36 30 33 30 33 61 61 66 65 31 35 31 36  01060303aafe1516\n0ca0  61 61 66 65 30 30 64 63 31 31 31 31 31 31 31 31  aafe00dc11111111\n0cb0  35 35 35 35 35 35 35 35 36 36 36 36 37 37 37 65  555555556666777e\n0cc0  30 30 30 30 30 30 31 65 22 2c 22 72 73 70 22 3a  0000001e\",\"rsp\":\n0cd0  22 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 34  \"\",\"t\":159301124\n0ce0  39 7d 7d 82 7e 00 93 7b 22 6d 65 74 68 6f 64 22  9}}.~..{\"method\"\n0cf0  3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61  :\"ble.adv\",\"para\n0d00  6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 65 63 39  ms\":{\"addr\":\"ec9\n0d10  66 34 66 32 65 35 37 33 34 22 2c 22 72 73 73 69  f4f2e5734\",\"rssi\n0d20  22 3a 2d 39 32 2c 22 61 64 76 22 3a 22 30 32 30  \":-92,\"adv\":\"020\n0d30  31 30 36 30 33 30 33 61 61 66 65 31 31 31 36 61  1060303aafe1116a\n0d40  61 66 65 32 30 30 30 30 62 30 62 31 37 63 30 30  afe20000b0b17c00\n0d50  39 35 30 63 66 36 37 30 36 37 61 66 33 30 34 22  950cf67067af304\"\n0d60  2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35  ,\"rsp\":\"\",\"t\":15\n0d70  39 33 30 31 31 32 34 39 7d 7d 82 7e 00 97 7b 22  93011249}}.~..{\"\n0d80  6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76  method\":\"ble.adv\n0d90  22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64  \",\"params\":{\"add\n0da0  72 22 3a 22 63 65 31 31 34 37 30 66 35 32 32 33  r\":\"ce11470f5223\n0db0  22 2c 22 72 73 73 69 22 3a 2d 38 33 2c 22 61 64  \",\"rssi\":-83,\"ad\n0dc0  76 22 3a 22 30 32 30 31 30 36 30 66 31 36 36 61  v\":\"0201060f166a\n0dd0  66 65 30 32 30 38 30 31 31 35 36 34 66 34 34 34  fe0208011564f444\n0de0  37 34 35 31 35 30 34 34 34 37 22 2c 22 72 73 70  7451504447\",\"rsp\n0df0  22 3a 22 30 37 30 39 33 35 33 30 32 64 37 31 36  \":\"070935302d716\n0e00  31 33 33 22 2c 22 74 22 3a 31 35 39 33 30 31 31  133\",\"t\":1593011\n0e10  32 34 39 7d 7d 82 7e 00 93 7b 22 6d 65 74 68 6f  249}}.~..{\"metho\n0e20  64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61  d\":\"ble.adv\",\"pa\n0e30  72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 63  rams\":{\"addr\":\"c\n0e40  35 31 36 30 32 64 35 64 35 63 39 22 2c 22 72 73  51602d5d5c9\",\"rs\n0e50  73 69 22 3a 2d 39 31 2c 22 61 64 76 22 3a 22 30  si\":-91,\"adv\":\"0\n0e60  32 30 31 30 36 30 33 30 33 61 61 66 65 31 31 31  201060303aafe111\n0e70  36 61 61 66 65 32 30 30 30 30 62 39 31 31 36 30  6aafe20000b91160\n0e80  30 30 37 65 39 34 64 66 61 30 36 66 32 63 39 30  007e94dfa06f2c90\n0e90  36 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a  6\",\"rsp\":\"\",\"t\":\n0ea0  31 35 39 33 30 31 31 32 34 39 7d 7d 82 7d 7b 22  1593011249}}.}{\"\n0eb0  6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76  method\":\"ble.adv\n0ec0  22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64  \",\"params\":{\"add\n0ed0  72 22 3a 22 35 63 66 63 34 35 62 33 32 64 61 31  r\":\"5cfc45b32da1\n0ee0  22 2c 22 72 73 73 69 22 3a 2d 35 30 2c 22 61 64  \",\"rssi\":-50,\"ad\n0ef0  76 22 3a 22 30 32 30 31 30 36 30 61 66 66 34 63  v\":\"0201060aff4c\n0f00  30 30 31 30 30 35 30 62 31 63 32 30 37 37 65 63  0010050b1c2077ec\n0f10  22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31  \",\"rsp\":\"\",\"t\":1\n0f20  35 39 33 30 31 31 32 34 39 7d 7d 82 7e 00 9b 7b  593011249}}.~..{\n0f30  22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64  \"method\":\"ble.ad\n0f40  76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64  v\",\"params\":{\"ad\n0f50  64 72 22 3a 22 63 31 31 38 62 31 30 31 63 66 30  dr\":\"c118b101cf0\n0f60  39 22 2c 22 72 73 73 69 22 3a 2d 38 32 2c 22 61  9\",\"rssi\":-82,\"a\n0f70  64 76 22 3a 22 30 32 30 31 30 36 30 33 30 33 61  dv\":\"0201060303a\n0f80  61 66 65 31 35 31 36 61 61 66 65 30 30 64 63 31  afe1516aafe00dc1\n0f90  31 31 31 31 31 31 31 35 35 35 35 35 35 35 35 36  1111111555555556\n0fa0  36 36 36 63 35 66 35 30 30 30 30 63 35 66 35 22  666c5f50000c5f5\"\n0fb0  2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35  ,\"rsp\":\"\",\"t\":15\n0fc0  39 33 30 31 31 32 34 39 7d 7d 82 7e 00 9b 7b 22  93011249}}.~..{\"\n0fd0  6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76  method\":\"ble.adv\n0fe0  22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64  \",\"params\":{\"add\n0ff0  72 22 3a 22 66 61 31 63 31 39 65 62 61 32 66 65  r\":\"fa1c19eba2fe\n1000  22 2c 22 72 73 73 69 22 3a 2d 37 33 2c 22 61 64  \",\"rssi\":-73,\"ad\n1010  76 22 3a 22 30 32 30 31 30 36 30 33 30 33 61 61  v\":\"0201060303aa\n1020  66 65 31 35 31 36 61 61 66 65 30 30 64 63 31 31  fe1516aafe00dc11\n1030  31 31 31 31 31 31 35 35 35 35 35 35 35 35 36 36  1111115555555566\n1040  36 36 34 39 34 39 30 30 30 30 34 39 34 39 22 2c  66494900004949\",\n1050  22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39  \"rsp\":\"\",\"t\":159\n1060  33 30 31 31 32 34 39 7d 7d 82 7e 00 b3 7b 22 6d  3011249}}.~..{\"m\n1070  65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22  ethod\":\"ble.adv\"\n1080  2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72  ,\"params\":{\"addr\n1090  22 3a 22 63 64 35 31 33 38 35 35 35 36 61 36 22  \":\"cd51385556a6\"\n10a0  2c 22 72 73 73 69 22 3a 2d 35 38 2c 22 61 64 76  ,\"rssi\":-58,\"adv\n10b0  22 3a 22 30 32 30 31 30 36 31 62 66 66 34 63 30  \":\"0201061bff4c0\n10c0  30 30 32 31 35 62 37 37 39 64 33 35 66 30 61 37  00215b779d35f0a7\n10d0  65 34 37 61 66 62 64 34 32 66 62 31 66 39 36 61  e47afbd42fb1f96a\n10e0  62 64 34 32 34 66 66 66 66 66 66 66 66 63 36 36  bd424ffffffffc66\n10f0  34 22 2c 22 72 73 70 22 3a 22 30 39 30 39 36 39  4\",\"rsp\":\"090969\n1100  34 32 34 62 35 33 32 30 35 35 35 33 34 32 22 2c  424b5320555342\",\n1110  22 74 22 3a 31 35 39 33 30 31 31 32 34 39 7d 7d  \"t\":1593011249}}\n1120  82 7e 00 ad 7b 22 6d 65 74 68 6f 64 22 3a 22 62  .~..{\"method\":\"b\n1130  6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22  le.adv\",\"params\"\n1140  3a 7b 22 61 64 64 72 22 3a 22 65 38 36 66 38 63  :{\"addr\":\"e86f8c\n1150  63 63 34 64 36 39 22 2c 22 72 73 73 69 22 3a 2d  cc4d69\",\"rssi\":-\n1160  37 31 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36  71,\"adv\":\"020106\n1170  30 39 66 66 35 39 30 30 65 38 36 66 38 63 63 63  09ff5900e86f8ccc\n1180  34 64 36 39 22 2c 22 72 73 70 22 3a 22 31 31 30  4d69\",\"rsp\":\"110\n1190  37 31 62 63 35 64 35 61 35 30 32 30 30 62 38 39  71bc5d5a50200b89\n11a0  66 65 36 31 31 34 64 32 32 30 30 30 64 61 32 63  fe6114d22000da2c\n11b0  62 30 36 31 36 30 30 30 64 34 38 30 30 36 33 22  b0616000d480063\"\n11c0  2c 22 74 22 3a 31 35 39 33 30 31 31 32 34 39 7d  ,\"t\":1593011249}\n11d0  7d 82 7e 00 93 7b 22 6d 65 74 68 6f 64 22 3a 22  }.~..{\"method\":\"\n11e0  62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73  ble.adv\",\"params\n11f0  22 3a 7b 22 61 64 64 72 22 3a 22 63 38 66 36 65  \":{\"addr\":\"c8f6e\n1200  34 62 66 36 33 33 34 22 2c 22 72 73 73 69 22 3a  4bf6334\",\"rssi\":\n1210  2d 39 30 2c 22 61 64 76 22 3a 22 30 32 30 31 30  -90,\"adv\":\"02010\n1220  36 30 33 30 33 61 61 66 65 31 31 31 36 61 61 66  60303aafe1116aaf\n1230  65 32 30 30 30 30 62 61 65 31 62 34 30 30 39 35  e20000bae1b40095\n1240  30 65 36 64 64 30 36 37 61 66 36 37 65 22 2c 22  0e6dd067af67e\",\"\n1250  72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33  rsp\":\"\",\"t\":1593\n1260  30 31 31 32 34 39 7d 7d 82 7e 00 93 7b 22 6d 65  011249}}.~..{\"me\n1270  74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c  thod\":\"ble.adv\",\n1280  22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22  \"params\":{\"addr\"\n1290  3a 22 66 34 37 63 64 39 62 36 32 63 62 39 22 2c  :\"f47cd9b62cb9\",\n12a0  22 72 73 73 69 22 3a 2d 39 32 2c 22 61 64 76 22  \"rssi\":-92,\"adv\"\n12b0  3a 22 30 32 30 31 30 36 30 64 31 36 36 61 66 65  :\"0201060d166afe\n12c0  30 32 30 38 30 31 31 36 36 34 65 63 33 39 34 64  0208011664ec394d\n12d0  36 63 37 37 22 2c 22 72 73 70 22 3a 22 30 37 30  6c77\",\"rsp\":\"070\n12e0  39 33 33 33 38 32 64 37 31 36 31 33 33 22 2c 22  933382d716133\",\"\n12f0  74 22 3a 31 35 39 33 30 31 31 32 34 39 7d 7d 82  t\":1593011249}}.\n1300  7e 00 b3 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c  ~..{\"method\":\"bl\n1310  65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a  e.adv\",\"params\":\n1320  7b 22 61 64 64 72 22 3a 22 63 64 35 31 33 38 35  {\"addr\":\"cd51385\n1330  35 35 36 61 36 22 2c 22 72 73 73 69 22 3a 2d 35  556a6\",\"rssi\":-5\n1340  35 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 31  5,\"adv\":\"0201061\n1350  62 66 66 34 63 30 30 30 32 31 35 62 37 37 39 64  bff4c000215b779d\n1360  33 35 66 30 61 37 65 34 37 61 66 62 64 34 32 66  35f0a7e47afbd42f\n1370  62 31 66 39 36 61 62 64 34 32 34 66 66 66 66 66  b1f96abd424fffff\n1380  66 66 66 63 36 36 34 22 2c 22 72 73 70 22 3a 22  fffc664\",\"rsp\":\"\n1390  30 39 30 39 36 39 34 32 34 62 35 33 32 30 35 35  090969424b532055\n13a0  35 33 34 32 22 2c 22 74 22 3a 31 35 39 33 30 31  5342\",\"t\":159301\n13b0  31 32 34 39 7d 7d 82 7e 00 9b 7b 22 6d 65 74 68  1249}}.~..{\"meth\n13c0  6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70  od\":\"ble.adv\",\"p\n13d0  61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22  arams\":{\"addr\":\"\n13e0  63 65 37 33 65 63 66 37 65 36 32 61 22 2c 22 72  ce73ecf7e62a\",\"r\n13f0  73 73 69 22 3a 2d 38 32 2c 22 61 64 76 22 3a 22  ssi\":-82,\"adv\":\"\n1400  30 32 30 31 30 36 30 33 30 33 61 61 66 65 31 35  0201060303aafe15\n1410  31 36 61 61 66 65 30 30 64 63 31 31 31 31 31 31  16aafe00dc111111\n1420  31 31 35 35 35 35 35 35 35 35 36 36 36 36 64 35  11555555556666d5\n1430  66 35 30 30 30 30 64 35 66 35 22 2c 22 72 73 70  f50000d5f5\",\"rsp\n1440  22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31 31  \":\"\",\"t\":1593011\n1450  32 34 39 7d 7d 82 7e 00 ad 7b 22 6d 65 74 68 6f  249}}.~..{\"metho\n1460  64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61  d\":\"ble.adv\",\"pa\n1470  72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 64  rams\":{\"addr\":\"d\n1480  66 65 35 61 30 66 39 65 30 65 35 22 2c 22 72 73  fe5a0f9e0e5\",\"rs\n1490  73 69 22 3a 2d 37 30 2c 22 61 64 76 22 3a 22 30  si\":-70,\"adv\":\"0\n14a0  32 30 31 30 36 30 39 66 66 35 39 30 30 64 66 65  2010609ff5900dfe\n14b0  35 61 30 66 39 65 30 65 35 22 2c 22 72 73 70 22  5a0f9e0e5\",\"rsp\"\n14c0  3a 22 31 31 30 37 31 62 63 35 64 35 61 35 30 32  :\"11071bc5d5a502\n14d0  30 30 62 38 39 66 65 36 31 31 34 64 32 32 30 30  00b89fe6114d2200\n14e0  30 64 61 32 63 62 30 36 31 36 30 30 30 64 34 38  0da2cb0616000d48\n14f0  30 30 36 33 22 2c 22 74 22 3a 31 35 39 33 30 31  0063\",\"t\":159301\n1500  31 32 34 39 7d 7d 82 7e 00 9b 7b 22 6d 65 74 68  1249}}.~..{\"meth\n1510  6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70  od\":\"ble.adv\",\"p\n1520  61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22  arams\":{\"addr\":\"\n1530  65 31 63 39 32 65 62 62 63 34 66 64 22 2c 22 72  e1c92ebbc4fd\",\"r\n1540  73 73 69 22 3a 2d 38 30 2c 22 61 64 76 22 3a 22  ssi\":-80,\"adv\":\"\n1550  30 32 30 31 30 36 30 33 30 33 61 61 66 65 31 35  0201060303aafe15\n1560  31 36 61 61 66 65 30 30 64 35 31 31 31 31 31 31  16aafe00d5111111\n1570  31 31 35 35 35 35 35 35 35 35 36 36 36 36 35 37  1155555555666657\n1580  34 30 30 30 30 30 30 30 32 30 22 2c 22 72 73 70  4000000020\",\"rsp\n1590  22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31 31  \":\"\",\"t\":1593011\n15a0  32 34 39 7d 7d 82 7e 00 b1 7b 22 6d 65 74 68 6f  249}}.~..{\"metho\n15b0  64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61  d\":\"ble.adv\",\"pa\n15c0  72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 65  rams\":{\"addr\":\"e\n15d0  34 32 37 37 61 32 32 61 34 33 32 22 2c 22 72 73  4277a22a432\",\"rs\n15e0  73 69 22 3a 2d 37 30 2c 22 61 64 76 22 3a 22 30  si\":-70,\"adv\":\"0\n15f0  32 30 31 30 36 30 33 30 33 61 61 66 65 31 37 31  201060303aafe171\n1600  36 61 61 66 65 30 30 64 35 31 31 31 31 31 32 32  6aafe00d51111122\n1610  32 32 32 33 33 33 33 33 34 34 34 34 34 61 35 66  2223333344444a5f\n1620  35 61 35 66 35 61 35 66 35 30 30 30 30 22 2c 22  5a5f5a5f50000\",\"\n1630  72 73 70 22 3a 22 30 38 30 39 36 39 34 32 34 62  rsp\":\"080969424b\n1640  35 33 33 31 33 30 33 35 22 2c 22 74 22 3a 31 35  53313035\",\"t\":15\n1650  39 33 30 31 31 32 34 39 7d 7d 82 7e 00 ab 7b 22  93011249}}.~..{\"\n1660  6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76  method\":\"ble.adv\n1670  22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64  \",\"params\":{\"add\n1680  72 22 3a 22 63 35 31 39 66 61 64 66 31 66 61 30  r\":\"c519fadf1fa0\n1690  22 2c 22 72 73 73 69 22 3a 2d 36 33 2c 22 61 64  \",\"rssi\":-63,\"ad\n16a0  76 22 3a 22 30 32 30 31 30 36 30 39 66 66 35 39  v\":\"02010609ff59\n16b0  30 30 63 35 31 39 66 61 64 66 31 66 61 30 22 2c  00c519fadf1fa0\",\n16c0  22 72 73 70 22 3a 22 31 31 30 37 31 62 63 35 64  \"rsp\":\"11071bc5d\n16d0  35 61 35 30 32 30 30 62 38 39 66 65 36 31 31 34  5a50200b89fe6114\n16e0  64 32 32 30 30 30 64 61 32 63 62 30 35 31 36 30  d22000da2cb05160\n16f0  30 30 64 36 64 30 30 22 2c 22 74 22 3a 31 35 39  00d6d00\",\"t\":159\n1700  33 30 31 31 32 34 39 7d 7d 82 7e 00 93 7b 22 6d  3011249}}.~..{\"m\n1710  65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22  ethod\":\"ble.adv\"\n1720  2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72  ,\"params\":{\"addr\n1730  22 3a 22 63 31 31 38 62 31 30 31 63 66 30 39 22  \":\"c118b101cf09\"\n1740  2c 22 72 73 73 69 22 3a 2d 37 38 2c 22 61 64 76  ,\"rssi\":-78,\"adv\n1750  22 3a 22 30 32 30 31 30 36 30 33 30 33 61 61 66  \":\"0201060303aaf\n1760  65 31 31 31 36 61 61 66 65 32 30 30 30 30 62 37  e1116aafe20000b7\n1770  34 31 37 38 30 31 31 64 33 66 35 34 33 30 66 39  4178011d3f5430f9\n1780  38 38 64 35 63 22 2c 22 72 73 70 22 3a 22 22 2c  88d5c\",\"rsp\":\"\",\n1790  22 74 22 3a 31 35 39 33 30 31 31 32 34 39 7d 7d  \"t\":1593011249}}\n17a0  82 7e 00 93 7b 22 6d 65 74 68 6f 64 22 3a 22 62  .~..{\"method\":\"b\n17b0  6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22  le.adv\",\"params\"\n17c0  3a 7b 22 61 64 64 72 22 3a 22 64 34 65 64 35 65  :{\"addr\":\"d4ed5e\n17d0  66 34 33 66 39 63 22 2c 22 72 73 73 69 22 3a 2d  f43f9c\",\"rssi\":-\n17e0  38 35 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36  85,\"adv\":\"020106\n17f0  30 33 30 33 61 61 66 65 31 31 31 36 61 61 66 65  0303aafe1116aafe\n1800  32 30 30 30 30 62 38 37 31 39 38 30 30 32 35 61  20000b871980025a\n1810  35 38 62 61 30 32 30 65 61 32 35 63 22 2c 22 72  58ba020ea25c\",\"r\n1820  73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30  sp\":\"\",\"t\":15930\n1830  31 31 32 34 39 7d 7d 82 7e 00 93 7b 22 6d 65 74  11249}}.~..{\"met\n1840  68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22  hod\":\"ble.adv\",\"\n1850  70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a  params\":{\"addr\":\n1860  22 66 61 31 63 31 39 65 62 61 32 66 65 22 2c 22  \"fa1c19eba2fe\",\"\n1870  72 73 73 69 22 3a 2d 37 36 2c 22 61 64 76 22 3a  rssi\":-76,\"adv\":\n1880  22 30 32 30 31 30 36 30 33 30 33 61 61 66 65 31  \"0201060303aafe1\n1890  31 31 36 61 61 66 65 32 30 30 30 30 62 39 35 31  116aafe20000b951\n18a0  38 34 30 30 39 32 34 36 30 62 37 30 38 34 37 63  840092460b70847c\n18b0  62 62 63 22 2c 22 72 73 70 22 3a 22 22 2c 22 74  bbc\",\"rsp\":\"\",\"t\n18c0  22 3a 31 35 39 33 30 31 31 32 34 39 7d 7d 82 7e  \":1593011249}}.~\n18d0  00 97 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65  ..{\"method\":\"ble\n18e0  2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b  .adv\",\"params\":{\n18f0  22 61 64 64 72 22 3a 22 65 62 36 38 30 63 63 62  \"addr\":\"eb680ccb\n1900  62 33 63 66 22 2c 22 72 73 73 69 22 3a 2d 38 32  b3cf\",\"rssi\":-82\n1910  2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 30 66  ,\"adv\":\"0201060f\n1920  31 36 36 61 66 65 30 32 30 38 30 31 31 36 36 34  166afe0208011664\n1930  66 34 35 33 37 34 34 32 36 31 35 37 35 34 22 2c  f4537442615754\",\n1940  22 72 73 70 22 3a 22 30 37 30 39 33 35 33 32 32  \"rsp\":\"070935322\n1950  64 37 31 36 31 33 33 22 2c 22 74 22 3a 31 35 39  d716133\",\"t\":159\n1960  33 30 31 31 32 34 39 7d 7d 82 7e 00 9b 7b 22 6d  3011249}}.~..{\"m\n1970  65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22  ethod\":\"ble.adv\"\n1980  2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72  ,\"params\":{\"addr\n1990  22 3a 22 63 63 39 66 33 39 34 35 33 61 39 63 22  \":\"cc9f39453a9c\"\n19a0  2c 22 72 73 73 69 22 3a 2d 38 32 2c 22 61 64 76  ,\"rssi\":-82,\"adv\n19b0  22 3a 22 30 32 30 31 30 36 30 33 30 33 61 61 66  \":\"0201060303aaf\n19c0  65 31 35 31 36 61 61 66 65 30 30 64 63 31 31 31  e1516aafe00dc111\n19d0  31 31 31 31 31 35 35 35 35 35 35 35 35 36 36 36  1111155555555666\n19e0  36 37 37 37 65 30 30 30 30 30 30 31 65 22 2c 22  6777e0000001e\",\"\n19f0  72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33  rsp\":\"\",\"t\":1593\n1a00  30 31 31 32 34 39 7d 7d 82 7e 00 9b 7b 22 6d 65  011249}}.~..{\"me\n1a10  74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c  thod\":\"ble.adv\",\n1a20  22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22  \"params\":{\"addr\"\n1a30  3a 22 66 31 65 31 64 63 65 63 64 36 38 34 22 2c  :\"f1e1dcecd684\",\n1a40  22 72 73 73 69 22 3a 2d 36 31 2c 22 61 64 76 22  \"rssi\":-61,\"adv\"\n1a50  3a 22 30 32 30 31 30 36 30 33 30 33 61 61 66 65  :\"0201060303aafe\n1a60  31 35 31 36 61 61 66 65 30 30 64 35 31 31 31 31  1516aafe00d51111\n1a70  31 31 31 31 35 35 35 35 35 35 35 35 36 36 36 36  1111555555556666\n1a80  64 35 34 37 30 30 30 30 30 30 32 63 22 2c 22 72  d5470000002c\",\"r\n1a90  73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30  sp\":\"\",\"t\":15930\n1aa0  31 31 32 35 30 7d 7d 82 7e 00 93 7b 22 6d 65 74  11250}}.~..{\"met\n1ab0  68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22  hod\":\"ble.adv\",\"\n1ac0  70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a  params\":{\"addr\":\n1ad0  22 63 38 66 36 65 34 62 66 36 33 33 34 22 2c 22  \"c8f6e4bf6334\",\"\n1ae0  72 73 73 69 22 3a 2d 37 39 2c 22 61 64 76 22 3a  rssi\":-79,\"adv\":\n1af0  22 30 32 30 31 30 36 30 33 30 33 61 61 66 65 31  \"0201060303aafe1\n1b00  31 31 36 61 61 66 65 32 30 30 30 30 62 61 65 31  116aafe20000bae1\n1b10  62 34 30 30 39 35 30 65 36 65 39 30 36 37 61 66  b400950e6e9067af\n1b20  36 38 38 22 2c 22 72 73 70 22 3a 22 22 2c 22 74  688\",\"rsp\":\"\",\"t\n1b30  22 3a 31 35 39 33 30 31 31 32 35 30 7d 7d 82 7e  \":1593011250}}.~\n1b40  00 b3 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65  ..{\"method\":\"ble\n1b50  2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b  .adv\",\"params\":{\n1b60  22 61 64 64 72 22 3a 22 63 64 35 31 33 38 35 35  \"addr\":\"cd513855\n1b70  35 36 61 36 22 2c 22 72 73 73 69 22 3a 2d 35 34  56a6\",\"rssi\":-54\n1b80  2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 31 62  ,\"adv\":\"0201061b\n1b90  66 66 34 63 30 30 30 32 31 35 62 37 37 39 64 33  ff4c000215b779d3\n1ba0  35 66 30 61 37 65 34 37 61 66 62 64 34 32 66 62  5f0a7e47afbd42fb\n1bb0  31 66 39 36 61 62 64 34 32 34 66 66 66 66 66 66  1f96abd424ffffff\n1bc0  66 66 63 36 36 34 22 2c 22 72 73 70 22 3a 22 30  ffc664\",\"rsp\":\"0\n1bd0  39 30 39 36 39 34 32 34 62 35 33 32 30 35 35 35  90969424b5320555\n1be0  33 34 32 22 2c 22 74 22 3a 31 35 39 33 30 31 31  342\",\"t\":1593011\n1bf0  32 35 30 7d 7d 82 7e 00 97 7b 22 6d 65 74 68 6f  250}}.~..{\"metho\n1c00  64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61  d\":\"ble.adv\",\"pa\n1c10  72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 63  rams\":{\"addr\":\"c\n1c20  61 38 65 61 35 33 31 66 38 61 38 22 2c 22 72 73  a8ea531f8a8\",\"rs\n1c30  73 69 22 3a 2d 36 34 2c 22 61 64 76 22 3a 22 30  si\":-64,\"adv\":\"0\n1c40  32 30 31 30 36 30 66 31 36 36 61 66 65 30 32 30  201060f166afe020\n1c50  38 30 31 31 36 36 34 65 63 34 61 37 33 33 32 34  8011664ec4a73324\n1c60  39 37 30 33 39 22 2c 22 72 73 70 22 3a 22 30 37  97039\",\"rsp\":\"07\n1c70  30 39 33 31 33 38 32 64 37 31 36 31 33 33 22 2c  0931382d716133\",\n1c80  22 74 22 3a 31 35 39 33 30 31 31 32 35 30 7d 7d  \"t\":1593011250}}\n1c90  82 7e 00 93 7b 22 6d 65 74 68 6f 64 22 3a 22 62  .~..{\"method\":\"b\n1ca0  6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22  le.adv\",\"params\"\n1cb0  3a 7b 22 61 64 64 72 22 3a 22 63 63 39 66 33 39  :{\"addr\":\"cc9f39\n1cc0  34 35 33 61 39 63 22 2c 22 72 73 73 69 22 3a 2d  453a9c\",\"rssi\":-\n1cd0  37 38 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36  78,\"adv\":\"020106\n1ce0  30 33 30 33 61 61 66 65 31 31 31 36 61 61 66 65  0303aafe1116aafe\n1cf0  32 30 30 30 30 62 35 35 31 61 38 30 30 31 66 66  20000b551a8001ff\n1d00  30 63 66 38 30 31 62 66 31 32 64 63 22 2c 22 72  0cf801bf12dc\",\"r\n1d10  73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30  sp\":\"\",\"t\":15930\n1d20  31 31 32 35 30 7d 7d 82 7e 00 97 7b 22 6d 65 74  11250}}.~..{\"met\n1d30  68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22  hod\":\"ble.adv\",\"\n1d40  70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a  params\":{\"addr\":\n1d50  22 63 65 31 31 34 37 30 66 35 32 32 33 22 2c 22  \"ce11470f5223\",\"\n1d60  72 73 73 69 22 3a 2d 37 38 2c 22 61 64 76 22 3a  rssi\":-78,\"adv\":\n1d70  22 30 32 30 31 30 36 30 66 31 36 36 61 66 65 30  \"0201060f166afe0\n1d80  32 30 38 30 31 31 35 36 34 66 34 34 34 37 34 35  208011564f444745\n1d90  31 35 30 34 34 34 37 22 2c 22 72 73 70 22 3a 22  1504447\",\"rsp\":\"\n1da0  30 37 30 39 33 35 33 30 32 64 37 31 36 31 33 33  070935302d716133\n1db0  22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 35 30  \",\"t\":1593011250\n1dc0  7d 7d 82 7e 00 91 7b 22 6d 65 74 68 6f 64 22 3a  }}.~..{\"method\":\n1dd0  22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d  \"ble.adv\",\"param\n1de0  73 22 3a 7b 22 61 64 64 72 22 3a 22 66 38 37 38  s\":{\"addr\":\"f878\n1df0  31 66 38 33 31 61 63 33 22 2c 22 72 73 73 69 22  1f831ac3\",\"rssi\"\n1e00  3a 2d 38 37 2c 22 61 64 76 22 3a 22 30 32 30 31  :-87,\"adv\":\"0201\n1e10  30 36 30 64 31 36 36 61 66 65 30 32 30 38 30 31  060d166afe020801\n1e20  31 36 35 62 65 63 35 36 35 34 36 34 33 33 22 2c  165bec56546433\",\n1e30  22 72 73 70 22 3a 22 30 36 30 39 33 35 32 64 37  \"rsp\":\"0609352d7\n1e40  31 36 31 33 33 22 2c 22 74 22 3a 31 35 39 33 30  16133\",\"t\":15930\n1e50  31 31 32 35 30 7d 7d 82 7e 00 ab 7b 22 6d 65 74  11250}}.~..{\"met\n1e60  68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22  hod\":\"ble.adv\",\"\n1e70  70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a  params\":{\"addr\":\n1e80  22 63 35 31 39 66 61 64 66 31 66 61 30 22 2c 22  \"c519fadf1fa0\",\"\n1e90  72 73 73 69 22 3a 2d 37 32 2c 22 61 64 76 22 3a  rssi\":-72,\"adv\":\n1ea0  22 30 32 30 31 30 36 30 39 66 66 35 39 30 30 63  \"02010609ff5900c\n1eb0  35 31 39 66 61 64 66 31 66 61 30 22 2c 22 72 73  519fadf1fa0\",\"rs\n1ec0  70 22 3a 22 31 31 30 37 31 62 63 35 64 35 61 35  p\":\"11071bc5d5a5\n1ed0  30 32 30 30 62 38 39 66 65 36 31 31 34 64 32 32  0200b89fe6114d22\n1ee0  30 30 30 64 61 32 63 62 30 35 31 36 30 30 30 64  000da2cb0516000d\n1ef0  36 64 30 30 22 2c 22 74 22 3a 31 35 39 33 30 31  6d00\",\"t\":159301\n1f00  31 32 35 30 7d 7d 82 7e 00 b1 7b 22 6d 65 74 68  1250}}.~..{\"meth\n1f10  6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70  od\":\"ble.adv\",\"p\n1f20  61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22  arams\":{\"addr\":\"\n1f30  65 34 32 37 37 61 32 32 61 34 33 32 22 2c 22 72  e4277a22a432\",\"r\n1f40  73 73 69 22 3a 2d 37 30 2c 22 61 64 76 22 3a 22  ssi\":-70,\"adv\":\"\n1f50  30 32 30 31 30 36 30 33 30 33 61 61 66 65 31 37  0201060303aafe17\n1f60  31 36 61 61 66 65 30 30 64 35 31 31 31 31 31 32  16aafe00d5111112\n1f70  32 32 32 32 33 33 33 33 33 34 34 34 34 34 61 35  22223333344444a5\n1f80  66 35 61 35 66 35 61 35 66 35 30 30 30 30 22 2c  f5a5f5a5f50000\",\n1f90  22 72 73 70 22 3a 22 30 38 30 39 36 39 34 32 34  \"rsp\":\"080969424\n1fa0  62 35 33 33 31 33 30 33 35 22 2c 22 74 22 3a 31  b53313035\",\"t\":1\n1fb0  35 39 33 30 31 31 32 35 30 7d 7d 82 7d 7b 22 6d  593011250}}.}{\"m\n1fc0  65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22  ethod\":\"ble.adv\"\n1fd0  2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72  ,\"params\":{\"addr\n1fe0  22 3a 22 35 63 66 63 34 35 62 33 32 64 61 31 22  \":\"5cfc45b32da1\"\n1ff0  2c 22 72 73 73 69 22 3a 2d 35 39 2c 22 61 64 76  ,\"rssi\":-59,\"adv\n\n0000  22 3a 22 30 32 30 31 30 36 30 61 66 66 34 63 30  \":\"0201060aff4c0\n0010  30 31 30 30 35 30 62 31 63 32 30 37 37 65 63 22  010050b1c2077ec\"\n0020  2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35  ,\"rsp\":\"\",\"t\":15\n0030  39 33 30 31 31 32 35 30 7d 7d 82 7e 00 b3 7b 22  93011250}}.~..{\"\n0040  6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76  method\":\"ble.adv\n0050  22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64  \",\"params\":{\"add\n0060  72 22 3a 22 63 64 35 31 33 38 35 35 35 36 61 36  r\":\"cd51385556a6\n0070  22 2c 22 72 73 73 69 22 3a 2d 35 37 2c 22 61 64  \",\"rssi\":-57,\"ad\n0080  76 22 3a 22 30 32 30 31 30 36 31 62 66 66 34 63  v\":\"0201061bff4c\n0090  30 30 30 32 31 35 62 37 37 39 64 33 35 66 30 61  000215b779d35f0a\n00a0  37 65 34 37 61 66 62 64 34 32 66 62 31 66 39 36  7e47afbd42fb1f96\n00b0  61 62 64 34 32 34 66 66 66 66 66 66 66 66 63 36  abd424ffffffffc6\n00c0  36 34 22 2c 22 72 73 70 22 3a 22 30 39 30 39 36  64\",\"rsp\":\"09096\n00d0  39 34 32 34 62 35 33 32 30 35 35 35 33 34 32 22  9424b5320555342\"\n00e0  2c 22 74 22 3a 31 35 39 33 30 31 31 32 35 30 7d  ,\"t\":1593011250}\n00f0  7d 82 7e 00 93 7b 22 6d 65 74 68 6f 64 22 3a 22  }.~..{\"method\":\"\n0100  62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73  ble.adv\",\"params\n0110  22 3a 7b 22 61 64 64 72 22 3a 22 66 61 31 63 31  \":{\"addr\":\"fa1c1\n0120  39 65 62 61 32 66 65 22 2c 22 72 73 73 69 22 3a  9eba2fe\",\"rssi\":\n0130  2d 37 33 2c 22 61 64 76 22 3a 22 30 32 30 31 30  -73,\"adv\":\"02010\n0140  36 30 33 30 33 61 61 66 65 31 31 31 36 61 61 66  60303aafe1116aaf\n0150  65 32 30 30 30 30 62 39 35 31 38 34 30 30 39 32  e20000b951840092\n0160  34 36 30 63 30 30 38 34 37 63 62 62 63 22 2c 22  460c00847cbbc\",\"\n0170  72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33  rsp\":\"\",\"t\":1593\n0180  30 31 31 32 35 30 7d 7d 82 7e 00 93 7b 22 6d 65  011250}}.~..{\"me\n0190  74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c  thod\":\"ble.adv\",\n01a0  22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22  \"params\":{\"addr\"\n01b0  3a 22 66 31 65 31 64 63 65 63 64 36 38 34 22 2c  :\"f1e1dcecd684\",\n01c0  22 72 73 73 69 22 3a 2d 36 36 2c 22 61 64 76 22  \"rssi\":-66,\"adv\"\n01d0  3a 22 30 32 30 31 30 36 30 33 30 33 61 61 66 65  :\"0201060303aafe\n01e0  31 31 31 36 61 61 66 65 32 30 30 30 30 62 38 30  1116aafe20000b80\n01f0  31 36 63 30 30 37 65 39 35 37 33 66 30 36 66 32  16c007e9573f06f2\n0200  63 64 64 65 22 2c 22 72 73 70 22 3a 22 22 2c 22  cdde\",\"rsp\":\"\",\"\n0210  74 22 3a 31 35 39 33 30 31 31 32 35 30 7d 7d 82  t\":1593011250}}.\n0220  7e 00 93 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c  ~..{\"method\":\"bl\n0230  65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a  e.adv\",\"params\":\n0240  7b 22 61 64 64 72 22 3a 22 63 34 63 35 66 65 37  {\"addr\":\"c4c5fe7\n0250  37 34 31 66 39 22 2c 22 72 73 73 69 22 3a 2d 39  741f9\",\"rssi\":-9\n0260  30 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 30  0,\"adv\":\"0201060\n0270  64 31 36 36 61 66 65 30 32 30 38 30 31 31 36 35  d166afe020801165\n0280  62 65 63 37 61 36 38 37 32 34 64 22 2c 22 72 73  bec7a68724d\",\"rs\n0290  70 22 3a 22 30 37 30 39 33 33 33 39 32 64 37 31  p\":\"070933392d71\n02a0  36 31 33 33 22 2c 22 74 22 3a 31 35 39 33 30 31  6133\",\"t\":159301\n02b0  31 32 35 30 7d 7d 82 7e 00 93 7b 22 6d 65 74 68  1250}}.~..{\"meth\n02c0  6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70  od\":\"ble.adv\",\"p\n02d0  61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22  arams\":{\"addr\":\"\n02e0  66 34 37 63 64 39 62 36 32 63 62 39 22 2c 22 72  f47cd9b62cb9\",\"r\n02f0  73 73 69 22 3a 2d 39 30 2c 22 61 64 76 22 3a 22  ssi\":-90,\"adv\":\"\n0300  30 32 30 31 30 36 30 64 31 36 36 61 66 65 30 32  0201060d166afe02\n0310  30 38 30 31 31 36 36 34 65 63 33 39 34 64 36 63  08011664ec394d6c\n0320  37 37 22 2c 22 72 73 70 22 3a 22 30 37 30 39 33  77\",\"rsp\":\"07093\n0330  33 33 38 32 64 37 31 36 31 33 33 22 2c 22 74 22  3382d716133\",\"t\"\n0340  3a 31 35 39 33 30 31 31 32 35 30 7d 7d 82 7e 00  :1593011250}}.~.\n0350  9b 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e  .{\"method\":\"ble.\n0360  61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22  adv\",\"params\":{\"\n0370  61 64 64 72 22 3a 22 63 38 66 36 65 34 62 66 36  addr\":\"c8f6e4bf6\n0380  33 33 34 22 2c 22 72 73 73 69 22 3a 2d 38 38 2c  334\",\"rssi\":-88,\n0390  22 61 64 76 22 3a 22 30 32 30 31 30 36 30 33 30  \"adv\":\"020106030\n03a0  33 61 61 66 65 31 35 31 36 61 61 66 65 30 30 64  3aafe1516aafe00d\n03b0  35 31 31 31 31 31 31 31 31 35 35 35 35 35 35 35  5111111115555555\n03c0  35 36 36 36 36 30 35 31 39 30 30 30 30 30 30 30  5666605190000000\n03d0  37 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a  7\",\"rsp\":\"\",\"t\":\n03e0  31 35 39 33 30 31 31 32 35 30 7d 7d 82 7e 00 b3  1593011250}}.~..\n03f0  7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61  {\"method\":\"ble.a\n0400  64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61  dv\",\"params\":{\"a\n0410  64 64 72 22 3a 22 63 64 35 31 33 38 35 35 35 36  ddr\":\"cd51385556\n0420  61 36 22 2c 22 72 73 73 69 22 3a 2d 35 35 2c 22  a6\",\"rssi\":-55,\"\n0430  61 64 76 22 3a 22 30 32 30 31 30 36 31 62 66 66  adv\":\"0201061bff\n0440  34 63 30 30 30 32 31 35 62 37 37 39 64 33 35 66  4c000215b779d35f\n0450  30 61 37 65 34 37 61 66 62 64 34 32 66 62 31 66  0a7e47afbd42fb1f\n0460  39 36 61 62 64 34 32 34 66 66 66 66 66 66 66 66  96abd424ffffffff\n0470  63 36 36 34 22 2c 22 72 73 70 22 3a 22 30 39 30  c664\",\"rsp\":\"090\n0480  39 36 39 34 32 34 62 35 33 32 30 35 35 35 33 34  969424b532055534\n0490  32 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 35  2\",\"t\":159301125\n04a0  30 7d 7d 82 7e 00 93 7b 22 6d 65 74 68 6f 64 22  0}}.~..{\"method\"\n04b0  3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61  :\"ble.adv\",\"para\n04c0  6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 63 65 37  ms\":{\"addr\":\"ce7\n04d0  33 65 63 66 37 65 36 32 61 22 2c 22 72 73 73 69  3ecf7e62a\",\"rssi\n04e0  22 3a 2d 38 34 2c 22 61 64 76 22 3a 22 30 32 30  \":-84,\"adv\":\"020\n04f0  31 30 36 30 33 30 33 61 61 66 65 31 31 31 36 61  1060303aafe1116a\n0500  61 66 65 32 30 30 30 30 62 38 64 31 38 34 30 30  afe20000b8d18400\n0510  32 35 38 65 31 34 35 30 32 30 64 61 37 64 30 22  258e145020da7d0\"\n0520  2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35  ,\"rsp\":\"\",\"t\":15\n0530  39 33 30 31 31 32 35 30 7d 7d 82 7e 00 99 7b 22  93011250}}.~..{\"\n0540  6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76  method\":\"ble.adv\n0550  22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64  \",\"params\":{\"add\n0560  72 22 3a 22 66 63 66 31 33 36 31 66 62 39 36 65  r\":\"fcf1361fb96e\n0570  22 2c 22 72 73 73 69 22 3a 2d 36 38 2c 22 61 64  \",\"rssi\":-68,\"ad\n0580  76 22 3a 22 31 62 66 66 37 35 30 30 34 32 30 34  v\":\"1bff75004204\n0590  30 31 38 30 32 30 66 63 66 31 33 36 31 66 62 39  018020fcf1361fb9\n05a0  36 65 66 65 66 31 33 36 31 66 62 39 36 64 30 31  6efef1361fb96d01\n05b0  30 30 30 30 30 30 30 30 30 30 30 30 22 2c 22 72  000000000000\",\"r\n05c0  73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30  sp\":\"\",\"t\":15930\n05d0  31 31 32 35 30 7d 7d 82 7e 00 93 7b 22 6d 65 74  11250}}.~..{\"met\n05e0  68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22  hod\":\"ble.adv\",\"\n05f0  70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a  params\":{\"addr\":\n0600  22 65 31 63 39 32 65 62 62 63 34 66 64 22 2c 22  \"e1c92ebbc4fd\",\"\n0610  72 73 73 69 22 3a 2d 38 30 2c 22 61 64 76 22 3a  rssi\":-80,\"adv\":\n0620  22 30 32 30 31 30 36 30 33 30 33 61 61 66 65 31  \"0201060303aafe1\n0630  31 31 36 61 61 66 65 32 30 30 30 30 62 38 66 31  116aafe20000b8f1\n0640  36 63 30 30 37 31 66 34 36 63 39 30 36 33 61 35  6c0071f46c9063a5\n0650  31 63 38 22 2c 22 72 73 70 22 3a 22 22 2c 22 74  1c8\",\"rsp\":\"\",\"t\n0660  22 3a 31 35 39 33 30 31 31 32 35 30 7d 7d 82 7e  \":1593011250}}.~\n0670  00 9b 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65  ..{\"method\":\"ble\n0680  2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b  .adv\",\"params\":{\n0690  22 61 64 64 72 22 3a 22 63 63 39 66 33 39 34 35  \"addr\":\"cc9f3945\n06a0  33 61 39 63 22 2c 22 72 73 73 69 22 3a 2d 37 38  3a9c\",\"rssi\":-78\n06b0  2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 30 33  ,\"adv\":\"02010603\n06c0  30 33 61 61 66 65 31 35 31 36 61 61 66 65 30 30  03aafe1516aafe00\n06d0  64 63 31 31 31 31 31 31 31 31 35 35 35 35 35 35  dc11111111555555\n06e0  35 35 36 36 36 36 37 37 37 65 30 30 30 30 30 30  556666777e000000\n06f0  31 65 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22  1e\",\"rsp\":\"\",\"t\"\n0700  3a 31 35 39 33 30 31 31 32 35 30 7d 7d 82 7e 00  :1593011250}}.~.\n0710  b1 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e  .{\"method\":\"ble.\n0720  61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22  adv\",\"params\":{\"\n0730  61 64 64 72 22 3a 22 65 34 32 37 37 61 32 32 61  addr\":\"e4277a22a\n0740  34 33 32 22 2c 22 72 73 73 69 22 3a 2d 37 30 2c  432\",\"rssi\":-70,\n0750  22 61 64 76 22 3a 22 30 32 30 31 30 36 30 33 30  \"adv\":\"020106030\n0760  33 61 61 66 65 31 37 31 36 61 61 66 65 30 30 64  3aafe1716aafe00d\n0770  35 31 31 31 31 31 32 32 32 32 32 33 33 33 33 33  5111112222233333\n0780  34 34 34 34 34 61 35 66 35 61 35 66 35 61 35 66  44444a5f5a5f5a5f\n0790  35 30 30 30 30 22 2c 22 72 73 70 22 3a 22 30 38  50000\",\"rsp\":\"08\n07a0  30 39 36 39 34 32 34 62 35 33 33 31 33 30 33 35  0969424b53313035\n07b0  22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 35 30  \",\"t\":1593011250\n07c0  7d 7d 82 7e 00 99 7b 22 6d 65 74 68 6f 64 22 3a  }}.~..{\"method\":\n07d0  22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d  \"ble.adv\",\"param\n07e0  73 22 3a 7b 22 61 64 64 72 22 3a 22 66 63 66 31  s\":{\"addr\":\"fcf1\n07f0  33 36 31 66 62 39 36 65 22 2c 22 72 73 73 69 22  361fb96e\",\"rssi\"\n0800  3a 2d 35 38 2c 22 61 64 76 22 3a 22 31 62 66 66  :-58,\"adv\":\"1bff\n0810  37 35 30 30 34 32 30 34 30 31 38 30 32 30 66 63  75004204018020fc\n0820  66 31 33 36 31 66 62 39 36 65 66 65 66 31 33 36  f1361fb96efef136\n0830  31 66 62 39 36 64 30 31 30 30 30 30 30 30 30 30  1fb96d0100000000\n0840  30 30 30 30 22 2c 22 72 73 70 22 3a 22 22 2c 22  0000\",\"rsp\":\"\",\"\n0850  74 22 3a 31 35 39 33 30 31 31 32 35 30 7d 7d 82  t\":1593011250}}.\n0860  7e 00 97 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c  ~..{\"method\":\"bl\n0870  65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a  e.adv\",\"params\":\n0880  7b 22 61 64 64 72 22 3a 22 65 62 36 38 30 63 63  {\"addr\":\"eb680cc\n0890  62 62 33 63 66 22 2c 22 72 73 73 69 22 3a 2d 37  bb3cf\",\"rssi\":-7\n08a0  39 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 30  9,\"adv\":\"0201060\n08b0  66 31 36 36 61 66 65 30 32 30 38 30 31 31 36 36  f166afe020801166\n08c0  34 66 34 35 33 37 34 34 32 36 31 35 37 35 34 22  4f4537442615754\"\n08d0  2c 22 72 73 70 22 3a 22 30 37 30 39 33 35 33 32  ,\"rsp\":\"07093532\n08e0  32 64 37 31 36 31 33 33 22 2c 22 74 22 3a 31 35  2d716133\",\"t\":15\n08f0  39 33 30 31 31 32 35 30 7d 7d 82 7e 00 93 7b 22  93011250}}.~..{\"\n0900  6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76  method\":\"ble.adv\n0910  22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64  \",\"params\":{\"add\n0920  72 22 3a 22 63 38 66 36 65 34 62 66 36 33 33 34  r\":\"c8f6e4bf6334\n0930  22 2c 22 72 73 73 69 22 3a 2d 39 30 2c 22 61 64  \",\"rssi\":-90,\"ad\n0940  76 22 3a 22 30 32 30 31 30 36 30 33 30 33 61 61  v\":\"0201060303aa\n0950  66 65 31 31 31 36 61 61 66 65 32 30 30 30 30 62  fe1116aafe20000b\n0960  61 65 31 62 34 30 30 39 35 30 65 36 66 32 30 36  ae1b400950e6f206\n0970  37 61 66 36 38 38 22 2c 22 72 73 70 22 3a 22 22  7af688\",\"rsp\":\"\"\n0980  2c 22 74 22 3a 31 35 39 33 30 31 31 32 35 30 7d  ,\"t\":1593011250}\n0990  7d 82 7e 00 99 7b 22 6d 65 74 68 6f 64 22 3a 22  }.~..{\"method\":\"\n09a0  62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73  ble.adv\",\"params\n09b0  22 3a 7b 22 61 64 64 72 22 3a 22 66 63 66 31 33  \":{\"addr\":\"fcf13\n09c0  36 31 66 62 39 36 65 22 2c 22 72 73 73 69 22 3a  61fb96e\",\"rssi\":\n09d0  2d 35 37 2c 22 61 64 76 22 3a 22 31 62 66 66 37  -57,\"adv\":\"1bff7\n09e0  35 30 30 34 32 30 34 30 31 38 30 32 30 66 63 66  5004204018020fcf\n09f0  31 33 36 31 66 62 39 36 65 66 65 66 31 33 36 31  1361fb96efef1361\n0a00  66 62 39 36 64 30 31 30 30 30 30 30 30 30 30 30  fb96d01000000000\n0a10  30 30 30 22 2c 22 72 73 70 22 3a 22 22 2c 22 74  000\",\"rsp\":\"\",\"t\n0a20  22 3a 31 35 39 33 30 31 31 32 35 30 7d 7d 82 7e  \":1593011250}}.~\n0a30  00 9b 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65  ..{\"method\":\"ble\n0a40  2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b  .adv\",\"params\":{\n0a50  22 61 64 64 72 22 3a 22 65 31 63 39 32 65 62 62  \"addr\":\"e1c92ebb\n0a60  63 34 66 64 22 2c 22 72 73 73 69 22 3a 2d 37 38  c4fd\",\"rssi\":-78\n0a70  2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 30 33  ,\"adv\":\"02010603\n0a80  30 33 61 61 66 65 31 35 31 36 61 61 66 65 30 30  03aafe1516aafe00\n0a90  64 35 31 31 31 31 31 31 31 31 35 35 35 35 35 35  d511111111555555\n0aa0  35 35 36 36 36 36 35 37 34 30 30 30 30 30 30 30  5566665740000000\n0ab0  32 30 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22  20\",\"rsp\":\"\",\"t\"\n0ac0  3a 31 35 39 33 30 31 31 32 35 30 7d 7d 82 7d 7b  :1593011250}}.}{\n0ad0  22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64  \"method\":\"ble.ad\n0ae0  76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64  v\",\"params\":{\"ad\n0af0  64 72 22 3a 22 35 63 66 63 34 35 62 33 32 64 61  dr\":\"5cfc45b32da\n0b00  31 22 2c 22 72 73 73 69 22 3a 2d 34 39 2c 22 61  1\",\"rssi\":-49,\"a\n0b10  64 76 22 3a 22 30 32 30 31 30 36 30 61 66 66 34  dv\":\"0201060aff4\n0b20  63 30 30 31 30 30 35 30 62 31 63 32 30 37 37 65  c0010050b1c2077e\n0b30  63 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a  c\",\"rsp\":\"\",\"t\":\n0b40  31 35 39 33 30 31 31 32 35 31 7d 7d 82 7e 00 b1  1593011251}}.~..\n0b50  7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61  {\"method\":\"ble.a\n0b60  64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61  dv\",\"params\":{\"a\n0b70  64 64 72 22 3a 22 65 34 32 37 37 61 32 32 61 34  ddr\":\"e4277a22a4\n0b80  33 32 22 2c 22 72 73 73 69 22 3a 2d 37 36 2c 22  32\",\"rssi\":-76,\"\n0b90  61 64 76 22 3a 22 30 32 30 31 30 36 30 33 30 33  adv\":\"0201060303\n0ba0  61 61 66 65 31 37 31 36 61 61 66 65 30 30 64 35  aafe1716aafe00d5\n0bb0  31 31 31 31 31 32 32 32 32 32 33 33 33 33 33 34  1111122222333334\n0bc0  34 34 34 34 61 35 66 35 61 35 66 35 61 35 66 35  4444a5f5a5f5a5f5\n0bd0  30 30 30 30 22 2c 22 72 73 70 22 3a 22 30 38 30  0000\",\"rsp\":\"080\n0be0  39 36 39 34 32 34 62 35 33 33 31 33 30 33 35 22  969424b53313035\"\n0bf0  2c 22 74 22 3a 31 35 39 33 30 31 31 32 35 31 7d  ,\"t\":1593011251}\n0c00  7d 82 7e 00 99 7b 22 6d 65 74 68 6f 64 22 3a 22  }.~..{\"method\":\"\n0c10  62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73  ble.adv\",\"params\n0c20  22 3a 7b 22 61 64 64 72 22 3a 22 66 63 66 31 33  \":{\"addr\":\"fcf13\n0c30  36 31 66 62 39 36 65 22 2c 22 72 73 73 69 22 3a  61fb96e\",\"rssi\":\n0c40  2d 35 37 2c 22 61 64 76 22 3a 22 31 62 66 66 37  -57,\"adv\":\"1bff7\n0c50  35 30 30 34 32 30 34 30 31 38 30 32 30 66 63 66  5004204018020fcf\n0c60  31 33 36 31 66 62 39 36 65 66 65 66 31 33 36 31  1361fb96efef1361\n0c70  66 62 39 36 64 30 31 30 30 30 30 30 30 30 30 30  fb96d01000000000\n0c80  30 30 30 22 2c 22 72 73 70 22 3a 22 22 2c 22 74  000\",\"rsp\":\"\",\"t\n0c90  22 3a 31 35 39 33 30 31 31 32 35 31 7d 7d 82 7e  \":1593011251}}.~\n0ca0  00 9b 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65  ..{\"method\":\"ble\n0cb0  2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b  .adv\",\"params\":{\n0cc0  22 61 64 64 72 22 3a 22 66 39 31 35 64 61 39 31  \"addr\":\"f915da91\n0cd0  32 39 37 32 22 2c 22 72 73 73 69 22 3a 2d 38 32  2972\",\"rssi\":-82\n0ce0  2c 22 61 64 76 22 3a 22 30 32 30 31 30 36 30 33  ,\"adv\":\"02010603\n0cf0  30 33 61 61 66 65 31 35 31 36 61 61 66 65 30 30  03aafe1516aafe00\n0d00  64 35 31 31 31 31 31 31 31 31 35 35 35 35 35 35  d511111111555555\n0d10  35 35 36 36 36 36 30 30 31 61 30 30 30 30 30 36  556666001a000006\n0d20  66 61 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22  fa\",\"rsp\":\"\",\"t\"\n0d30  3a 31 35 39 33 30 31 31 32 35 31 7d 7d 82 7e 00  :1593011251}}.~.\n0d40  93 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e  .{\"method\":\"ble.\n0d50  61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22  adv\",\"params\":{\"\n0d60  61 64 64 72 22 3a 22 64 34 65 64 35 65 66 34 33  addr\":\"d4ed5ef43\n0d70  66 39 63 22 2c 22 72 73 73 69 22 3a 2d 39 30 2c  f9c\",\"rssi\":-90,\n0d80  22 61 64 76 22 3a 22 30 32 30 31 30 36 30 33 30  \"adv\":\"020106030\n0d90  33 61 61 66 65 31 31 31 36 61 61 66 65 32 30 30  3aafe1116aafe200\n0da0  30 30 62 38 37 31 39 38 30 30 32 35 61 35 38 63  00b871980025a58c\n0db0  63 30 32 30 65 61 32 37 30 22 2c 22 72 73 70 22  c020ea270\",\"rsp\"\n0dc0  3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32  :\"\",\"t\":15930112\n0dd0  35 31 7d 7d 82 7e 00 b3 7b 22 6d 65 74 68 6f 64  51}}.~..{\"method\n0de0  22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72  \":\"ble.adv\",\"par\n0df0  61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 63 64  ams\":{\"addr\":\"cd\n0e00  35 31 33 38 35 35 35 36 61 36 22 2c 22 72 73 73  51385556a6\",\"rss\n0e10  69 22 3a 2d 35 38 2c 22 61 64 76 22 3a 22 30 32  i\":-58,\"adv\":\"02\n0e20  30 31 30 36 31 62 66 66 34 63 30 30 30 32 31 35  01061bff4c000215\n0e30  62 37 37 39 64 33 35 66 30 61 37 65 34 37 61 66  b779d35f0a7e47af\n0e40  62 64 34 32 66 62 31 66 39 36 61 62 64 34 32 34  bd42fb1f96abd424\n0e50  66 66 66 66 66 66 66 66 63 36 36 34 22 2c 22 72  ffffffffc664\",\"r\n0e60  73 70 22 3a 22 30 39 30 39 36 39 34 32 34 62 35  sp\":\"090969424b5\n0e70  33 32 30 35 35 35 33 34 32 22 2c 22 74 22 3a 31  320555342\",\"t\":1\n0e80  35 39 33 30 31 31 32 35 31 7d 7d 82 7e 00 93 7b  593011251}}.~..{\n0e90  22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64  \"method\":\"ble.ad\n0ea0  76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64  v\",\"params\":{\"ad\n0eb0  64 72 22 3a 22 63 65 37 33 65 63 66 37 65 36 32  dr\":\"ce73ecf7e62\n0ec0  61 22 2c 22 72 73 73 69 22 3a 2d 38 31 2c 22 61  a\",\"rssi\":-81,\"a\n0ed0  64 76 22 3a 22 30 32 30 31 30 36 30 33 30 33 61  dv\":\"0201060303a\n0ee0  61 66 65 31 31 31 36 61 61 66 65 32 30 30 30 30  afe1116aafe20000\n0ef0  62 38 64 31 38 34 30 30 32 35 38 65 31 34 65 30  b8d18400258e14e0\n0f00  32 30 64 61 37 64 30 22 2c 22 72 73 70 22 3a 22  20da7d0\",\"rsp\":\"\n0f10  22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 35 31  \",\"t\":1593011251\n0f20  7d 7d 82 7e 00 97 7b 22 6d 65 74 68 6f 64 22 3a  }}.~..{\"method\":\n0f30  22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d  \"ble.adv\",\"param\n0f40  73 22 3a 7b 22 61 64 64 72 22 3a 22 63 65 31 31  s\":{\"addr\":\"ce11\n0f50  34 37 30 66 35 32 32 33 22 2c 22 72 73 73 69 22  470f5223\",\"rssi\"\n0f60  3a 2d 38 33 2c 22 61 64 76 22 3a 22 30 32 30 31  :-83,\"adv\":\"0201\n0f70  30 36 30 66 31 36 36 61 66 65 30 32 30 38 30 31  060f166afe020801\n0f80  31 35 36 34 66 34 34 34 37 34 35 31 35 30 34 34  1564f44474515044\n0f90  34 37 22 2c 22 72 73 70 22 3a 22 30 37 30 39 33  47\",\"rsp\":\"07093\n0fa0  35 33 30 32 64 37 31 36 31 33 33 22 2c 22 74 22  5302d716133\",\"t\"\n0fb0  3a 31 35 39 33 30 31 31 32 35 31 7d 7d 82 7e 00  :1593011251}}.~.\n0fc0  93 7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e  .{\"method\":\"ble.\n0fd0  61 64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22  adv\",\"params\":{\"\n0fe0  61 64 64 72 22 3a 22 65 31 63 39 32 65 62 62 63  addr\":\"e1c92ebbc\n0ff0  34 66 64 22 2c 22 72 73 73 69 22 3a 2d 38 30 2c  4fd\",\"rssi\":-80,\n1000  22 61 64 76 22 3a 22 30 32 30 31 30 36 30 33 30  \"adv\":\"020106030\n1010  33 61 61 66 65 31 31 31 36 61 61 66 65 32 30 30  3aafe1116aafe200\n1020  30 30 62 38 66 31 36 63 30 30 37 31 66 34 36 64  00b8f16c0071f46d\n1030  32 30 36 33 61 35 31 64 32 22 2c 22 72 73 70 22  2063a51d2\",\"rsp\"\n1040  3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32  :\"\",\"t\":15930112\n1050  35 31 7d 7d 82 7e 00 9b 7b 22 6d 65 74 68 6f 64  51}}.~..{\"method\n1060  22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72  \":\"ble.adv\",\"par\n1070  61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 64 35  ams\":{\"addr\":\"d5\n1080  64 62 66 38 61 64 39 32 33 39 22 2c 22 72 73 73  dbf8ad9239\",\"rss\n1090  69 22 3a 2d 38 35 2c 22 61 64 76 22 3a 22 30 32  i\":-85,\"adv\":\"02\n10a0  30 31 30 36 30 33 30 33 61 61 66 65 31 35 31 36  01060303aafe1516\n10b0  61 61 66 65 30 30 64 35 31 31 31 31 31 31 31 31  aafe00d511111111\n10c0  35 35 35 35 35 35 35 35 36 36 36 36 33 33 30 31  5555555566663301\n10d0  30 30 30 30 30 30 30 36 22 2c 22 72 73 70 22 3a  00000006\",\"rsp\":\n10e0  22 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 35  \"\",\"t\":159301125\n10f0  31 7d 7d 82 7e 00 99 7b 22 6d 65 74 68 6f 64 22  1}}.~..{\"method\"\n1100  3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61  :\"ble.adv\",\"para\n1110  6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 66 63 66  ms\":{\"addr\":\"fcf\n1120  31 33 36 31 66 62 39 36 65 22 2c 22 72 73 73 69  1361fb96e\",\"rssi\n1130  22 3a 2d 35 37 2c 22 61 64 76 22 3a 22 31 62 66  \":-57,\"adv\":\"1bf\n1140  66 37 35 30 30 34 32 30 34 30 31 38 30 32 30 66  f75004204018020f\n1150  63 66 31 33 36 31 66 62 39 36 65 66 65 66 31 33  cf1361fb96efef13\n1160  36 31 66 62 39 36 64 30 31 30 30 30 30 30 30 30  61fb96d010000000\n1170  30 30 30 30 30 22 2c 22 72 73 70 22 3a 22 22 2c  00000\",\"rsp\":\"\",\n1180  22 74 22 3a 31 35 39 33 30 31 31 32 35 31 7d 7d  \"t\":1593011251}}\n1190  82 7e 00 b1 7b 22 6d 65 74 68 6f 64 22 3a 22 62  .~..{\"method\":\"b\n11a0  6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22  le.adv\",\"params\"\n11b0  3a 7b 22 61 64 64 72 22 3a 22 65 34 32 37 37 61  :{\"addr\":\"e4277a\n11c0  32 32 61 34 33 32 22 2c 22 72 73 73 69 22 3a 2d  22a432\",\"rssi\":-\n11d0  37 30 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36  70,\"adv\":\"020106\n11e0  30 33 30 33 61 61 66 65 31 37 31 36 61 61 66 65  0303aafe1716aafe\n11f0  30 30 64 35 31 31 31 31 31 32 32 32 32 32 33 33  00d5111112222233\n1200  33 33 33 34 34 34 34 34 61 35 66 35 61 35 66 35  33344444a5f5a5f5\n1210  61 35 66 35 30 30 30 30 22 2c 22 72 73 70 22 3a  a5f50000\",\"rsp\":\n1220  22 30 38 30 39 36 39 34 32 34 62 35 33 33 31 33  \"080969424b53313\n1230  30 33 35 22 2c 22 74 22 3a 31 35 39 33 30 31 31  035\",\"t\":1593011\n1240  32 35 31 7d 7d 82 7e 00 9b 7b 22 6d 65 74 68 6f  251}}.~..{\"metho\n1250  64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61  d\":\"ble.adv\",\"pa\n1260  72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 63  rams\":{\"addr\":\"c\n1270  31 31 38 62 31 30 31 63 66 30 39 22 2c 22 72 73  118b101cf09\",\"rs\n1280  73 69 22 3a 2d 37 39 2c 22 61 64 76 22 3a 22 30  si\":-79,\"adv\":\"0\n1290  32 30 31 30 36 30 33 30 33 61 61 66 65 31 35 31  201060303aafe151\n12a0  36 61 61 66 65 30 30 64 63 31 31 31 31 31 31 31  6aafe00dc1111111\n12b0  31 35 35 35 35 35 35 35 35 36 36 36 36 63 35 66  1555555556666c5f\n12c0  35 30 30 30 30 63 35 66 35 22 2c 22 72 73 70 22  50000c5f5\",\"rsp\"\n12d0  3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31 31 32  :\"\",\"t\":15930112\n12e0  35 31 7d 7d 82 7e 00 93 7b 22 6d 65 74 68 6f 64  51}}.~..{\"method\n12f0  22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72  \":\"ble.adv\",\"par\n1300  61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 66 39  ams\":{\"addr\":\"f9\n1310  31 35 64 61 39 31 32 39 37 32 22 2c 22 72 73 73  15da912972\",\"rss\n1320  69 22 3a 2d 38 31 2c 22 61 64 76 22 3a 22 30 32  i\":-81,\"adv\":\"02\n1330  30 31 30 36 30 33 30 33 61 61 66 65 31 31 31 36  01060303aafe1116\n1340  61 61 66 65 32 30 30 30 30 62 38 34 31 36 34 30  aafe20000b841640\n1350  30 39 35 64 39 38 39 37 30 36 38 39 30 62 36 61  095d989706890b6a\n1360  22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31  \",\"rsp\":\"\",\"t\":1\n1370  35 39 33 30 31 31 32 35 31 7d 7d 82 7e 00 b3 7b  593011251}}.~..{\n1380  22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64  \"method\":\"ble.ad\n1390  76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64  v\",\"params\":{\"ad\n13a0  64 72 22 3a 22 63 64 35 31 33 38 35 35 35 36 61  dr\":\"cd51385556a\n13b0  36 22 2c 22 72 73 73 69 22 3a 2d 35 37 2c 22 61  6\",\"rssi\":-57,\"a\n13c0  64 76 22 3a 22 30 32 30 31 30 36 31 62 66 66 34  dv\":\"0201061bff4\n13d0  63 30 30 30 32 31 35 62 37 37 39 64 33 35 66 30  c000215b779d35f0\n13e0  61 37 65 34 37 61 66 62 64 34 32 66 62 31 66 39  a7e47afbd42fb1f9\n13f0  36 61 62 64 34 32 34 66 66 66 66 66 66 66 66 63  6abd424ffffffffc\n1400  36 36 34 22 2c 22 72 73 70 22 3a 22 30 39 30 39  664\",\"rsp\":\"0909\n1410  36 39 34 32 34 62 35 33 32 30 35 35 35 33 34 32  69424b5320555342\n1420  22 2c 22 74 22 3a 31 35 39 33 30 31 31 32 35 31  \",\"t\":1593011251\n1430  7d 7d 82 7e 00 93 7b 22 6d 65 74 68 6f 64 22 3a  }}.~..{\"method\":\n1440  22 62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d  \"ble.adv\",\"param\n1450  73 22 3a 7b 22 61 64 64 72 22 3a 22 66 34 37 63  s\":{\"addr\":\"f47c\n1460  64 39 62 36 32 63 62 39 22 2c 22 72 73 73 69 22  d9b62cb9\",\"rssi\"\n1470  3a 2d 38 30 2c 22 61 64 76 22 3a 22 30 32 30 31  :-80,\"adv\":\"0201\n1480  30 36 30 64 31 36 36 61 66 65 30 32 30 38 30 31  060d166afe020801\n1490  31 36 36 34 65 63 33 39 34 64 36 63 37 37 22 2c  1664ec394d6c77\",\n14a0  22 72 73 70 22 3a 22 30 37 30 39 33 33 33 38 32  \"rsp\":\"070933382\n14b0  64 37 31 36 31 33 33 22 2c 22 74 22 3a 31 35 39  d716133\",\"t\":159\n14c0  33 30 31 31 32 35 31 7d 7d 82 7e 00 99 7b 22 6d  3011251}}.~..{\"m\n14d0  65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22  ethod\":\"ble.adv\"\n14e0  2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72  ,\"params\":{\"addr\n14f0  22 3a 22 66 63 66 31 33 36 31 66 62 39 36 65 22  \":\"fcf1361fb96e\"\n1500  2c 22 72 73 73 69 22 3a 2d 35 36 2c 22 61 64 76  ,\"rssi\":-56,\"adv\n1510  22 3a 22 31 62 66 66 37 35 30 30 34 32 30 34 30  \":\"1bff750042040\n1520  31 38 30 32 30 66 63 66 31 33 36 31 66 62 39 36  18020fcf1361fb96\n1530  65 66 65 66 31 33 36 31 66 62 39 36 64 30 31 30  efef1361fb96d010\n1540  30 30 30 30 30 30 30 30 30 30 30 22 2c 22 72 73  00000000000\",\"rs\n1550  70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31  p\":\"\",\"t\":159301\n1560  31 32 35 31 7d 7d 82 7e 00 9b 7b 22 6d 65 74 68  1251}}.~..{\"meth\n1570  6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70  od\":\"ble.adv\",\"p\n1580  61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22  arams\":{\"addr\":\"\n1590  66 31 65 31 64 63 65 63 64 36 38 34 22 2c 22 72  f1e1dcecd684\",\"r\n15a0  73 73 69 22 3a 2d 36 35 2c 22 61 64 76 22 3a 22  ssi\":-65,\"adv\":\"\n15b0  30 32 30 31 30 36 30 33 30 33 61 61 66 65 31 35  0201060303aafe15\n15c0  31 36 61 61 66 65 30 30 64 35 31 31 31 31 31 31  16aafe00d5111111\n15d0  31 31 35 35 35 35 35 35 35 35 36 36 36 36 64 35  11555555556666d5\n15e0  34 37 30 30 30 30 30 30 32 63 22 2c 22 72 73 70  470000002c\",\"rsp\n15f0  22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31 31  \":\"\",\"t\":1593011\n1600  32 35 31 7d 7d 82 7e 00 bf 7b 22 6d 65 74 68 6f  251}}.~..{\"metho\n1610  64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70 61  d\":\"ble.adv\",\"pa\n1620  72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22 32  rams\":{\"addr\":\"2\n1630  63 61 61 38 65 30 30 35 34 65 62 22 2c 22 72 73  caa8e0054eb\",\"rs\n1640  73 69 22 3a 2d 35 36 2c 22 61 64 76 22 3a 22 30  si\":-56,\"adv\":\"0\n1650  32 30 31 30 35 30 37 30 33 39 35 66 65 36 37 62  20105070395fe67b\n1660  31 65 37 66 65 30 64 66 66 34 39 30 36 30 32 30  1e7fe0dff4906020\n1670  32 30 30 30 30 32 63 61 61 38 65 30 30 35 34 65  200002caa8e0054e\n1680  62 22 2c 22 72 73 70 22 3a 22 30 35 30 39 35 37  b\",\"rsp\":\"050957\n1690  35 39 35 61 34 35 30 66 31 36 39 35 66 65 33 31  595a450f1695fe31\n16a0  32 30 38 66 30 33 30 30 32 63 61 61 38 65 30 30  208f03002caa8e00\n16b0  35 34 65 62 30 39 22 2c 22 74 22 3a 31 35 39 33  54eb09\",\"t\":1593\n16c0  30 31 31 32 35 31 7d 7d 22 2c 22 72 73 73 69 22  011251}}\",\"rssi\"\n16d0  3a 2d 38 30 2c 22 61 64 76 22 3a 22 30 32 30 31  :-80,\"adv\":\"0201\n16e0  30 36 30 33 30 33 61 61 66 65 31 31 31 36 61 61  060303aafe1116aa\n16f0  66 65 32 30 30 30 30 62 38 64 31 38 34 30 30 32  fe20000b8d184002\n1700  35 38 65 31 35 37 30 32 30 64 61 37 64 61 22 2c  58e157020da7da\",\n1710  22 72 73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39  \"rsp\":\"\",\"t\":159\n1720  33 30 31 31 32 35 32 7d 7d 82 7e 00 99 7b 22 6d  3011252}}.~..{\"m\n1730  65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64 76 22  ethod\":\"ble.adv\"\n1740  2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64 64 72  ,\"params\":{\"addr\n1750  22 3a 22 66 63 66 31 33 36 31 66 62 39 36 65 22  \":\"fcf1361fb96e\"\n1760  2c 22 72 73 73 69 22 3a 2d 37 35 2c 22 61 64 76  ,\"rssi\":-75,\"adv\n1770  22 3a 22 31 62 66 66 37 35 30 30 34 32 30 34 30  \":\"1bff750042040\n1780  31 38 30 32 30 66 63 66 31 33 36 31 66 62 39 36  18020fcf1361fb96\n1790  65 66 65 66 31 33 36 31 66 62 39 36 64 30 31 30  efef1361fb96d010\n17a0  30 30 30 30 30 30 30 30 30 30 30 22 2c 22 72 73  00000000000\",\"rs\n17b0  70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30 31  p\":\"\",\"t\":159301\n17c0  31 32 35 32 7d 7d 82 7e 00 93 7b 22 6d 65 74 68  1252}}.~..{\"meth\n17d0  6f 64 22 3a 22 62 6c 65 2e 61 64 76 22 2c 22 70  od\":\"ble.adv\",\"p\n17e0  61 72 61 6d 73 22 3a 7b 22 61 64 64 72 22 3a 22  arams\":{\"addr\":\"\n17f0  63 34 63 35 66 65 37 37 34 31 66 39 22 2c 22 72  c4c5fe7741f9\",\"r\n1800  73 73 69 22 3a 2d 39 32 2c 22 61 64 76 22 3a 22  ssi\":-92,\"adv\":\"\n1810  30 32 30 31 30 36 30 64 31 36 36 61 66 65 30 32  0201060d166afe02\n1820  30 38 30 31 31 36 35 62 65 63 37 61 36 38 37 32  0801165bec7a6872\n1830  34 64 22 2c 22 72 73 70 22 3a 22 30 37 30 39 33  4d\",\"rsp\":\"07093\n1840  33 33 39 32 64 37 31 36 31 33 33 22 2c 22 74 22  3392d716133\",\"t\"\n1850  3a 31 35 39 33 30 31 31 32 35 32 7d 7d 82 7d 7b  :1593011252}}.}{\n1860  22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61 64  \"method\":\"ble.ad\n1870  76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61 64  v\",\"params\":{\"ad\n1880  64 72 22 3a 22 35 63 66 63 34 35 62 33 32 64 61  dr\":\"5cfc45b32da\n1890  31 22 2c 22 72 73 73 69 22 3a 2d 35 37 2c 22 61  1\",\"rssi\":-57,\"a\n18a0  64 76 22 3a 22 30 32 30 31 30 36 30 61 66 66 34  dv\":\"0201060aff4\n18b0  63 30 30 31 30 30 35 30 62 31 63 32 30 37 37 65  c0010050b1c2077e\n18c0  63 22 2c 22 72 73 70 22 3a 22 22 2c 22 74 22 3a  c\",\"rsp\":\"\",\"t\":\n18d0  31 35 39 33 30 31 31 32 35 32 7d 7d 82 7e 00 b1  1593011252}}.~..\n18e0  7b 22 6d 65 74 68 6f 64 22 3a 22 62 6c 65 2e 61  {\"method\":\"ble.a\n18f0  64 76 22 2c 22 70 61 72 61 6d 73 22 3a 7b 22 61  dv\",\"params\":{\"a\n1900  64 64 72 22 3a 22 65 34 32 37 37 61 32 32 61 34  ddr\":\"e4277a22a4\n1910  33 32 22 2c 22 72 73 73 69 22 3a 2d 37 37 2c 22  32\",\"rssi\":-77,\"\n1920  61 64 76 22 3a 22 30 32 30 31 30 36 30 33 30 33  adv\":\"0201060303\n1930  61 61 66 65 31 37 31 36 61 61 66 65 30 30 64 35  aafe1716aafe00d5\n1940  31 31 31 31 31 32 32 32 32 32 33 33 33 33 33 34  1111122222333334\n1950  34 34 34 34 61 35 66 35 61 35 66 35 61 35 66 35  4444a5f5a5f5a5f5\n1960  30 30 30 30 22 2c 22 72 73 70 22 3a 22 30 38 30  0000\",\"rsp\":\"080\n1970  39 36 39 34 32 34 62 35 33 33 31 33 30 33 35 22  969424b53313035\"\n1980  2c 22 74 22 3a 31 35 39 33 30 31 31 32 35 32 7d  ,\"t\":1593011252}\n1990  7d 82 7e 00 9b 7b 22 6d 65 74 68 6f 64 22 3a 22  }.~..{\"method\":\"\n19a0  62 6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73  ble.adv\",\"params\n19b0  22 3a 7b 22 61 64 64 72 22 3a 22 63 31 31 38 62  \":{\"addr\":\"c118b\n19c0  31 30 31 63 66 30 39 22 2c 22 72 73 73 69 22 3a  101cf09\",\"rssi\":\n19d0  2d 38 32 2c 22 61 64 76 22 3a 22 30 32 30 31 30  -82,\"adv\":\"02010\n19e0  36 30 33 30 33 61 61 66 65 31 35 31 36 61 61 66  60303aafe1516aaf\n19f0  65 30 30 64 63 31 31 31 31 31 31 31 31 35 35 35  e00dc11111111555\n1a00  35 35 35 35 35 36 36 36 36 63 35 66 35 30 30 30  555556666c5f5000\n1a10  30 63 35 66 35 22 2c 22 72 73 70 22 3a 22 22 2c  0c5f5\",\"rsp\":\"\",\n1a20  22 74 22 3a 31 35 39 33 30 31 31 32 35 32 7d 7d  \"t\":1593011252}}\n1a30  82 7e 00 93 7b 22 6d 65 74 68 6f 64 22 3a 22 62  .~..{\"method\":\"b\n1a40  6c 65 2e 61 64 76 22 2c 22 70 61 72 61 6d 73 22  le.adv\",\"params\"\n1a50  3a 7b 22 61 64 64 72 22 3a 22 66 39 31 35 64 61  :{\"addr\":\"f915da\n1a60  39 31 32 39 37 32 22 2c 22 72 73 73 69 22 3a 2d  912972\",\"rssi\":-\n1a70  38 32 2c 22 61 64 76 22 3a 22 30 32 30 31 30 36  82,\"adv\":\"020106\n1a80  30 33 30 33 61 61 66 65 31 31 31 36 61 61 66 65  0303aafe1116aafe\n1a90  32 30 30 30 30 62 38 34 31 36 34 30 30 39 35 64  20000b841640095d\n1aa0  39 38 61 30 30 36 38 39 30 62 36 61 22 2c 22 72  98a006890b6a\",\"r\n1ab0  73 70 22 3a 22 22 2c 22 74 22 3a 31 35 39 33 30  sp\":\"\",\"t\":15930\n1ac0  31 31 32 35 32 7d 7d                             11252}}\n\n"
  },
  {
    "path": "test/data/київ.txt",
    "content": "є\n"
  },
  {
    "path": "test/dhcpd.conf",
    "content": "# Network:\t\t192.168.32.0/255.255.255.0\n# Domain name:\t\tmos.host\n# Name servers:\t\t1.1.1.1 and 8.8.8.8\n# Default router:\t192.168.32.1\n# Addresses:\t\t192.168.32.32 - 192.168.1.127\n#\noption  domain-name \"mos.host\";\noption  domain-name-servers 1.1.1.1, 8.8.8.8;\n\nsubnet 192.168.32.0 netmask 255.255.255.0 {\n\toption routers 192.168.32.1;\n\trange 192.168.32.32 192.168.32.127;\n}"
  },
  {
    "path": "test/driver_mock.c",
    "content": "static bool mock_init(struct mg_tcpip_if *ifp) {\n  (void) ifp;\n  return true;\n}\n\nstatic size_t mock_tx(const void *buf, size_t len, struct mg_tcpip_if *ifp) {\n  (void) buf, (void) len, (void) ifp;\n  return len;\n}\n\nstatic size_t mock_rx(void *buf, size_t len, struct mg_tcpip_if *ifp) {\n  (void) buf, (void) len, (void) ifp;\n  return 0;\n}\n\nstatic bool mock_poll(struct mg_tcpip_if *ifp, bool s1) {\n  (void) ifp;\n  return s1;\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_mock = {mock_init, mock_tx, mock_rx, mock_poll};\n"
  },
  {
    "path": "test/esp-idf/Makefile",
    "content": "ROOT ?= $(realpath $(CURDIR)/../..)\nPROJECTS ?= ../../tutorials/http/device-dashboard/esp32/ ../../tutorials/micropython/esp32/ ../../tutorials/http/uart-bridge/esp32/\nTARGET ?= Debug\nDOCKER = docker run --rm -v $(ROOT):$(ROOT) -v $(CURDIR):/root -w $(CURDIR) \nIMAGE ?= espressif/idf\n\n\nall: $(PROJECTS)\n\techo\n\n$(PROJECTS): FORCE\n\t(make -C $@ build && make -C $@ clean) || ( \\\n\t$(DOCKER) $(IMAGE) /bin/bash -c 'cd $@ && idf.py build' && \\\n\t$(DOCKER) $(IMAGE) /bin/bash -c 'rm -rf .cache && cd $@ && rm -rf build sdkconfig')\n\nFORCE:\t\n"
  },
  {
    "path": "test/fuzz.c",
    "content": "// https://llvm.org/docs/LibFuzzer.html\n\n#define MG_ENABLE_SOCKET 0\n#define MG_ENABLE_LOG 0\n#define MG_ENABLE_LINES 1\n#define MG_ENABLE_TCPIP 1\n#define MG_IO_SIZE (32 * 1024 * 1024)  // Big IO size for fast resizes\n\n#include \"mongoose.c\"\n\n#include \"driver_mock.c\"\n\n#ifdef __cplusplus\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t *, size_t);\n#else\nint LLVMFuzzerTestOneInput(const uint8_t *, size_t);\n#endif\n\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  struct mg_http_serve_opts opts = {.root_dir = \".\"};\n  if (ev == MG_EV_HTTP_MSG) {\n    mg_http_serve_dir(c, (struct mg_http_message *) ev_data, &opts);\n  }\n}\n\nint LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {\n  mg_log_set(MG_LL_INFO);\n\n  struct mg_dns_message dm;\n  mg_dns_parse(data, size, &dm);\n  mg_dns_parse(NULL, 0, &dm);\n\n  struct mg_http_message hm;\n  if (mg_http_parse((const char *) data, size, &hm) > 0) {\n    mg_crc32(0, hm.method.buf, hm.method.len);\n    mg_crc32(0, hm.uri.buf, hm.uri.len);\n    mg_crc32(0, hm.uri.buf, hm.uri.len);\n    for (size_t i = 0; i < sizeof(hm.headers) / sizeof(hm.headers[0]); i++) {\n      struct mg_str *k = &hm.headers[i].name, *v = &hm.headers[i].value;\n      mg_crc32(0, k->buf, k->len);\n      mg_crc32(0, v->buf, v->len);\n    }\n  }\n  mg_http_parse(NULL, 0, &hm);\n\n  struct mg_str body = mg_str_n((const char *) data, size);\n  char tmp[256];\n  mg_http_get_var(&body, \"key\", tmp, sizeof(tmp));\n  mg_http_get_var(&body, \"key\", NULL, 0);\n  mg_url_decode((char *) data, size, tmp, sizeof(tmp), 1);\n  mg_url_decode((char *) data, size, tmp, 1, 1);\n  mg_url_decode(NULL, 0, tmp, 1, 1);\n\n  struct mg_mqtt_message mm;\n  if (mg_mqtt_parse(data, size, 0, &mm) == MQTT_OK) {\n    mg_crc32(0, mm.topic.buf, mm.topic.len);\n    mg_crc32(0, mm.data.buf, mm.data.len);\n    mg_crc32(0, mm.dgram.buf, mm.dgram.len);\n  }\n  mg_mqtt_parse(NULL, 0, 0, &mm);\n  if (mg_mqtt_parse(data, size, 5, &mm) == MQTT_OK) {\n    mg_crc32(0, mm.topic.buf, mm.topic.len);\n    mg_crc32(0, mm.data.buf, mm.data.len);\n    mg_crc32(0, mm.dgram.buf, mm.dgram.len);\n    {\n      struct mg_mqtt_prop prop;\n      size_t ofs = 0;\n      while ((ofs = mg_mqtt_next_prop(&mm, &prop, ofs)) > 0) {\n          mg_crc32(0, prop.key.buf, prop.key.len);\n          mg_crc32(0, prop.val.buf, prop.val.len);\n      }\n    }\n  }\n  mg_mqtt_parse(NULL, 0, 5, &mm);\n\n  mg_sntp_parse(data, size);\n  mg_sntp_parse(NULL, 0);\n\n  char buf[size * 4 / 3 + 5];  // At least 4 chars and nul termination\n  mg_base64_decode((char *) data, size, buf, sizeof(buf));\n  mg_base64_decode(NULL, 0, buf, sizeof(buf));\n  mg_base64_encode(data, size, buf, sizeof(buf));\n  mg_base64_encode(NULL, 0, buf, sizeof(buf));\n\n  mg_match(mg_str_n((char *) data, size), mg_str_n((char *) data, size), NULL);\n\n  struct mg_str entry, s = mg_str_n((char *) data, size);\n  while (mg_span(s, &entry, &s, ',')) entry.len = 0;\n\n  int n;\n  mg_json_get(mg_str_n((char *) data, size), \"$\", &n);\n  mg_json_get(mg_str_n((char *) data, size), \"$.a.b\", &n);\n  mg_json_get(mg_str_n((char *) data, size), \"$[0]\", &n);\n\n  // Test built-in TCP/IP stack\n  if (size > 0) {\n    struct mg_tcpip_if mif = {.ip = 1,\n                              .mask = 255,\n                              .gw = 1,\n                              .gw_ready = true,\n                              .state = MG_TCPIP_STATE_READY,\n#if MG_ENABLE_IPV6\n                              .ip6[0] = 1;\n                              .prefix[0] = 1;\n                              .prefix_len = 64;\n                              .gw6[0] = 1;\n                              .gw6_ready = true;\n                              .state6 = MG_TCPIP_STATE_READY;  // so mg_send() works and RS stops\n#endif\n                              .driver = &mg_tcpip_driver_mock};\n    struct mg_mgr mgr;\n    mg_mgr_init(&mgr);\n    mg_tcpip_init(&mgr, &mif);\n\n    // Make a copy of the random data, in order to modify it\n    void *pkt = malloc(size);\n    struct eth *eth = (struct eth *) pkt;\n    memcpy(pkt, data, size);\n    if (size > sizeof(*eth)) {\n      static size_t i;\n      // eth_types[] exists in l2_eth.c\n      memcpy(eth->dst, mif.mac, 6);  // Set valid destination MAC\n      // send all handled eth types, then 2 random ones\n      if (i >= (sizeof(eth_types) / sizeof(eth_types[0]) + 2)) i = 0;\n      if (i < (sizeof(eth_types) / sizeof(eth_types[0]))) eth->type = mg_htons(eth_types[i++]);\n      // build proper layer-3 datagrams, to be able to exercise layers above\n      if (eth->type == mg_htons(0x800) && size > (sizeof(*eth) + sizeof(struct ip))) {             // IPv4\n        static size_t j;\n        uint8_t ip_protos[] = {1, 6, 17}; // ICMP, TCP, UDP\n        struct ip *ip4 = (struct ip *) (eth + 1);\n        ip4->ver = (ip4->ver & ~0xf0) | (4 << 4);\n        // send all handled IP protos, then 2 random ones\n        if (j >= (sizeof(ip_protos) / sizeof(ip_protos[0]) + 2)) j = 0;\n        if (j < (sizeof(ip_protos) / sizeof(ip_protos[0]))) ip4->proto = (ip_protos[j++]);\n        if (ip4->proto == 1) { // ICMP\n        } else if (ip4->proto == 6) { // TCP\n        } else if (ip4->proto == 17) { // UDP\n          if (size > (sizeof(*eth) + sizeof(struct ip) + sizeof(struct udp))) {\n            static size_t k;\n            uint16_t udp_ports[] = {67, 68}; // DHCP server and client\n            struct udp *udp = (struct udp *) (ip4 + 1);\n            // send all handled UDP ports, then 2 random ones\n            if (k >= (sizeof(udp_ports) / sizeof(udp_ports[0]) + 2)) k = 0;\n            if (k < (sizeof(udp_ports) / sizeof(udp_ports[0]))) udp->dport = mg_htons(udp_ports[k++]);\n          }\n        }\n      } else if (eth->type == mg_htons(0x806)) {      // ARP\n\n      } else if (eth->type == mg_htons(0x86dd) && size > (sizeof(*eth) + sizeof(struct ip6))) {     // IPv6\n        static size_t j;\n        uint8_t ip6_protos[] = {6, 17, 58}; // TCP, UDP, ICMPv6\n        struct ip6 *ip6 = (struct ip6 *) (eth + 1);\n        ip6->ver = (ip6->ver & ~0xf0) | (6 << 4);\n        // send all handled IPv6 \"next headers\", then 2 random ones\n        if (j >= (sizeof(ip6_protos) / sizeof(ip6_protos[0]) + 2)) j = 0;\n        if (j < (sizeof(ip6_protos) / sizeof(ip6_protos[0]))) ip6->next = (ip6_protos[j++]);\n        if (ip6->next == 6) { // TCP\n        } else if (ip6->next == 17) { // UDP\n        } else if (ip6->next == 58) { // ICMPv6\n          if (size >= (sizeof(*eth) + sizeof(struct ip6) + sizeof(struct icmp6))) {\n            static size_t k;\n            uint8_t icmp6_types[] = {128, 134, 135, 136}; // Echo Request, RA, NS, NA\n            struct icmp6 *icmp6 = (struct icmp6 *) (ip6 + 1);\n            // send all handled ICMPv6 types, then 2 random ones\n            if (k >= (sizeof(icmp6_types) / sizeof(icmp6_types[0]) + 2)) k = 0;\n            if (k < (sizeof(icmp6_types) / sizeof(icmp6_types[0]))) icmp6->type = icmp6_types[k++];\n          }\n        }\n      }\n    }\n\n#if defined(MAIN)\n    printf(\"Sending to net_builtin:\\n\");\n    mg_hexdump(pkt, size);\n#endif\n    mg_tcpip_rx(&mif, pkt, size);\n\n    // Test HTTP serving (via our built-in TCP/IP stack)\n    const char *url = \"http://localhost:12345\";\n    struct mg_connection *c = mg_http_connect(&mgr, url, fn, NULL);\n    mg_iobuf_add(&c->recv, 0, data, size);\n    c->pfn(c, MG_EV_READ, NULL); // manually invoke protocol event handler\n\n    free(pkt);\n    mg_mgr_free(&mgr);\n  }\n\n  return 0;\n}\n\n#if defined(MAIN)\nint main(int argc, char *argv[]) {\n  int res = EXIT_FAILURE;\n  if (argc > 1) {\n    struct mg_str data = mg_file_read(&mg_fs_posix, argv[1]);\n    if (data.buf != NULL) {\n      LLVMFuzzerTestOneInput((uint8_t *) data.buf, data.len);\n      res = EXIT_SUCCESS;\n    }\n    free(data.buf);\n  }\n  return res;\n}\n#endif\n"
  },
  {
    "path": "test/fuzz_tls.c",
    "content": "// https://llvm.org/docs/LibFuzzer.html\n\n#define MG_ENABLE_SOCKET 1\n#define MG_ENABLE_LOG 0\n#define MG_ENABLE_LINES 1\n#define MG_ENABLE_TCPIP 0\n#define MG_IO_SIZE (1 * 1024 * 1024)  // Big IO size for fast resizes\n#define MG_TLS MG_TLS_BUILTIN\n\n#include \"mongoose.c\"\n\n#ifdef __cplusplus\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t *, size_t);\n#else\nint LLVMFuzzerTestOneInput(const uint8_t *, size_t);\n#endif\n\n// Preprocessor magic, just add/remove functions here and leave the rest alone\n#define TABLE(_) \\\n_(mg_tls_server_recv_hello) \\\n_(mg_tls_server_recv_finish) \\\n_(mg_tls_client_recv_hello) \\\n_(mg_tls_client_recv_finish) \\\n_(mg_tls_client_recv_ext) \\\n_(mg_tls_recv_cert_verify) \\\n// ... \n\nstruct f {\n  int (*f)(struct mg_connection *);\n  const char *name;\n};\n\nstruct f f_[] = {\n#define ENTRY(func) { func, #func },\nTABLE(ENTRY)\n#undef ENTRY\n};\n// end of preprocessor magic\n\n\n\nint LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {\n  struct mg_connection c_[sizeof(f_)/sizeof(struct f)], *c = &c_[0];\n  struct tls_data tls_[sizeof(f_)/sizeof(struct f)];\n  int i;\n  if (size == 0) return 0;\n  mg_log_set(MG_LL_INFO);\n  memset(c, 0, sizeof(*c));\n  c->send.align = c->recv.align = c->rtls.align = MG_IO_SIZE;  \n  c->is_tls = c->is_tls_hs = 1;\n  for (i = 0; i < (int)(sizeof(f_)/sizeof(struct f)); i++) {\n    struct mg_iobuf *io;\n    c = &c_[i];\n    io = &c->rtls;\n    if (i > 0) memcpy(c, &c_[0], sizeof(*c)); // copy from 1st one\n    if (i > 1) c->is_client = 1;  // from 2 on, client functions\n    memset(&tls_[i], 0, sizeof(struct tls_data));\n    if (io->size - io->len < size && !mg_iobuf_resize(io, io->len + size)) {\n      mg_error(c, \"oom\");\n      return 0; // drop it\n    }\n    memcpy(&io->buf[io->len], data, size);\n    io->len += size;\n    c->tls = &tls_[i];\n#ifdef PRINT_FUNCNAME\n    printf(\"CALLING %s\\n\", f_[i].name);\n#endif\n    f_[i].f(c);\n    mg_iobuf_free(io);\n  }\n\n  // mg_tls_recv_cert() has an extra bool parameter \n  c = &c_[0]; // reuse first one\n  c->tls = &tls_[0];\n  for (i = 0; i < 2; i++) {\n    struct mg_iobuf *io;\n    io = &c->rtls;\n    c->is_client = (i > 0);\n    memset(c->tls, 0, sizeof(struct tls_data));\n    if (io->size - io->len < size && !mg_iobuf_resize(io, io->len + size)) {\n      mg_error(c, \"oom\");\n      return 0; // drop it\n    }\n    memcpy(&io->buf[io->len], data, size);\n    io->len += size;\n#ifdef PRINT_FUNCNAME\n    printf(\"CALLING mg_tls_recv_cert\\n\");\n#endif\n    mg_tls_recv_cert(c, !c->is_client); // call server for client and client for server\n    mg_iobuf_free(io);\n  }\n\n  return 0;\n}\n\n#if defined(MAIN)\nint main(int argc, char *argv[]) {\n  int res = EXIT_FAILURE;\n  if (argc > 1) {\n    struct mg_str data = mg_file_read(&mg_fs_posix, argv[1]);\n    if (data.buf != NULL) {\n      LLVMFuzzerTestOneInput((uint8_t *) data.buf, data.len);\n      res = EXIT_SUCCESS;\n    }\n    free(data.buf);\n  }\n  return res;\n}\n#endif\n"
  },
  {
    "path": "test/ga_docker_daemon.json",
    "content": "{\n \"data-root\": \"/mnt/docker\"\n}\n"
  },
  {
    "path": "test/gcc+make/Makefile",
    "content": "PROJECTS ?= $(wildcard ../../tutorials/*/*-make-*)\n\nall: $(PROJECTS)\n\techo\n\n$(PROJECTS): FORCE\n\t$(MAKE) -C $@ build clean\n\nFORCE:\n"
  },
  {
    "path": "test/health.awk",
    "content": "#!/usr/bin/env -S gawk -f\n# gawk used to avoid \"towc\" errors seen on MacOS. env used to circumvent brew installing it wherever they like\n\nBEGIN {\n\tFS=\"\\t\"\n\tprint \"{\"\n}\n/HEALTH_DASHBOARD/ { print $2 }\nEND {\n\tprint \"}\"\n}\n"
  },
  {
    "path": "test/health.sh",
    "content": "#!/bin/bash\n\ncd /data/downloads/health\nfind . -mtime +28 -not -name 'index*.json' -delete\nfind . -name \"*.json\" -not -name 'index*.json' | jq -R . | jq -s . > index.json\n"
  },
  {
    "path": "test/keil/Clean",
    "content": "# Do NOT use parenthesis on Windows project dir names\nPROJECTS ?= $(wildcard ../../tutorials/stm32/nucleo-*-keil-*)\n\nMAKEFILEPATH := $(dir $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))\nBATPATH := $(subst /,\\,$(MAKEFILEPATH))\n\nall: $(PROJECTS)\n\t\n$(PROJECTS): FORCE\n\t$(BATPATH)uniclean.bat $(subst /,\\,$@)\n\nFORCE:\n"
  },
  {
    "path": "test/keil/Makefile",
    "content": "# Do NOT use parenthesis on Windows project dir names\nPROJECTS ?= $(wildcard ../../tutorials/stm32/nucleo-*-keil-*)\nTARGET ?= \"Target 1\"\n\nall: $(PROJECTS)\n\t\n# Need to test inside .bat to check and transfer errors\n$(PROJECTS): FORCE\n\tunitest.bat $(subst /,\\,$@) $(TARGET)\n\nFORCE:\n\n# Automated remote test. See https://vcon.io/automated-firmware-tests/\nURL ?= https://dash.vcon.io/api/v3/devices\nupdate: $(PROJECTS)\n\tcurl -su :$(VCON_API_KEY) $(URL)/$(DEVICE)/ota?hex=1 --data-binary @$</Objects/firmware.hex\n\ntest update: TARGET = Test\ntest: update\n\tcurl --fail-with-body -su :$(VCON_API_KEY) $(URL)/$(DEVICE)/tx?t=5\n# TODO(): no tee, no grep\n#| tee /tmp/output.txt\n#\tgrep 'READY, IP:' /tmp/output.txt       # Check for network init\n"
  },
  {
    "path": "test/keil/uniclean.bat",
    "content": "cd %*\nC:\\Keil_v5\\UV4\\UV4.exe -c device-dashboard.uvprojx -j0\ndel /S /Q DebugConfig Listings Objects\nrd /S /Q DebugConfig\nrd /S /Q Listings\nrd /S /Q Objects\n"
  },
  {
    "path": "test/keil/unitest.bat",
    "content": "cd %1\nstart /WAIT /B C:\\Keil_v5\\UV4\\UV4.exe -cr device-dashboard.uvprojx -j0 -o output.txt -t %2\nif %ERRORLEVEL% NEQ 0 (\n\ttype output.txt\n\texit /B %ERRORLEVEL%\n)\ndel output.txt\n"
  },
  {
    "path": "test/match_changed_files.sh",
    "content": "#!/bin/bash\n#\n# Usage: $0 PATTERN\n# If files in the last commit match PATTERN, exit 0. Else, exit 1\n#\n# Usage in github actions:\n#  <job_name>:\n#    runs-on: ubuntu-latest\n#    steps:\n#    - uses: actions/checkout@v3\n#      with: { fetch-depth: 2 }         # Important for git diff to work\n#    - run: if ./match_changed_files.sh '.*' ; then echo RUN=1 >> $GITHUB_ENV ; fi\n#    - if: ${{ env.RUN == 1 }}\n#      run: echo yohoo!\n\nCHANGED_FILES=`git --no-pager diff --name-only HEAD~1 HEAD | xargs`\necho \"Pattern: [$1], files: $CHANGED_FILES\"\nfor FILE in $CHANGED_FILES; do [[ \"$FILE\" =~ $1 ]] && exit 0; done\nexit 1 \n"
  },
  {
    "path": "test/mip_curl.sh",
    "content": "curl -s $*/a.txt -o /tmp/a.txt && diff /tmp/a.txt data/a.txt && rm /tmp/a.txt &&\ncurl -s -H Expect: $*/body --data-binary @./Makefile -o /tmp/Makefile && diff /tmp/Makefile ./Makefile && rm /tmp/Makefile\n"
  },
  {
    "path": "test/mip_port_test.c",
    "content": "#define MIPPORTTEST_USING_DHCP 1\n\n#include <sys/socket.h>\n#include <sys/ioctl.h>\n\n#include \"mip_x_test.c\"\n\nstruct port_driver_data {\n  int sockfd;\n  struct sockaddr_in port_addr;\n  struct sockaddr_in tap_addr;\n};\n\n// MIP Socket driver\nstatic size_t sock_rx(void *buf, size_t len, struct mg_tcpip_if *ifp) {\n  ssize_t received = recv(((struct port_driver_data *)ifp->driver_data)->sockfd, buf, len, 0); \n  usleep(1);  // This is to avoid 100% CPU\n  if (received < 0) return 0;\n  return (size_t) received;\n}\n\nstatic size_t sock_tx(const void *buf, size_t len, struct mg_tcpip_if *ifp) {\n  ssize_t res = send(((struct port_driver_data *)ifp->driver_data)->sockfd, buf, len, 0); \n  if (res < 0) {\n    MG_ERROR((\"sock_tx failed: %d\", errno));\n    return 0;\n  }\n  return (size_t) res;\n}\n\nstatic bool sock_poll(struct mg_tcpip_if *ifp, bool s1) {\n  return s1 && ifp->driver_data ? true : false;\n}\n\n\nint main(void) {\n  bool result;\n  const char *debug_level = getenv(\"V\");\n  // Setup interface\n  const uint16_t port = 0xAA55;           // UDP port\n  const uint16_t tap_port = 0x55AA;       // UDP port for TAP socket\n  const char *mac = \"02:00:01:02:03:78\";  // MAC address\n\n\tstruct port_driver_data pdd;\n  pdd.sockfd = socket(AF_INET, SOCK_DGRAM, 0); \n\tpdd.port_addr.sin_family = AF_INET;\n\tpdd.port_addr.sin_addr.s_addr = htonl(INADDR_ANY);\n\tpdd.port_addr.sin_port = htons(port);\n\tif (bind(pdd.sockfd, (struct sockaddr *) &pdd.port_addr, sizeof(pdd.port_addr)) < 0) return EXIT_FAILURE; \n  printf(\"Opened UDP socket: 127.0.0.1:%u (0x%04x)\\n\", port, port);\n\n\tpdd.tap_addr.sin_family = AF_INET;\n\tpdd.tap_addr.sin_addr.s_addr =  htonl(0x7f000001U);  // 127.0.0.1\n\tpdd.tap_addr.sin_port = htons(0x55AA);\n\tif (connect(pdd.sockfd, (struct sockaddr *) &pdd.tap_addr, sizeof(pdd.tap_addr)) < 0) return EXIT_FAILURE; \n  printf(\"Connected to TAP UDP socket: 127.0.0.1:%u (0x%04x)\\n\", tap_port, tap_port);\n\n  usleep(200000);  // 200 ms\n\n  if (debug_level == NULL) debug_level = \"3\";\n  mg_log_set(atoi(debug_level));\n\n  struct mg_mgr mgr;  // Event manager\n  mg_mgr_init(&mgr);  // Initialise event manager\n\n  // MIP driver\n  struct mg_tcpip_driver driver;\n  memset(&driver, 0, sizeof(driver));\n\n  driver.tx = sock_tx;\n  driver.poll = sock_poll;\n  driver.rx = sock_rx;\n\n  struct mg_tcpip_if mif;\n  memset(&mif, 0, sizeof(mif));\n\n  mif.driver = &driver;\n  mif.driver_data = &pdd;\n\n#if MIPPORTTEST_USING_DHCP == 1\n#else\n  mif.ip = mg_htonl(MG_U32(192, 168, 32, 2));  // Triggering a network failure\n  mif.mask = mg_htonl(MG_U32(255, 255, 255, 0));\n  mif.gw = mg_htonl(MG_U32(192, 168, 32, 1));\n#endif\n\n  sscanf(mac, \"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx\", &mif.mac[0], &mif.mac[1],\n         &mif.mac[2], &mif.mac[3], &mif.mac[4], &mif.mac[5]);\n\n  mg_tcpip_init(&mgr, &mif);\n  MG_INFO((\"Init done, starting main loop\"));\n  usleep(200000);  // 200 ms\n\n  // Stack initialization, Network configuration (DHCP lease, ...)\n#if MIPPORTTEST_USING_DHCP == 0\n  MG_INFO((\"MIF configuration: Static IP\"));\n  ASSERT(mif.ip != 0);     // Check we have a satic IP assigned\n  mg_mgr_poll(&mgr, 100);  // For initialisation\n#else\n  MG_INFO((\"MIF configuration: DHCP\"));\n  ASSERT(!mif.ip);  // Check we are set for DHCP\n  int pc = 500;     // Timeout on DHCP lease 500 ~ approx 5s (typical delay <1s)\n  while (((pc--) > 0) && !mif.ip) {\n    mg_mgr_poll(&mgr, 100);\n    usleep(10000);  // 10 ms\n  }\n  if (!mif.ip) MG_ERROR((\"No ip assigned (DHCP lease may have failed).\\n\"));\n  ASSERT(mif.ip);  // We have an IP (lease or static)\n#endif\n  while (mif.state != MG_TCPIP_STATE_READY) {\n    mg_mgr_poll(&mgr, 100);\n    usleep(10000);  // 10 ms\n  }\n\n  // RUN TESTS\n  result = mip_x_test(&mgr);\n  close(pdd.sockfd);\n  if (!result) return EXIT_FAILURE;\n  return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/mip_tap_test.c",
    "content": "#define MIPTAPTEST_USING_DHCP 1\n\n#include <sys/socket.h>\n#ifndef __OpenBSD__\n#include <linux/if.h>\n#include <linux/if_tun.h>\n#else\n#include <net/if.h>\n#include <net/if_tun.h>\n#include <net/if_types.h>\n#endif\n#include <sys/ioctl.h>\n\n#include \"mip_x_test.c\"\n\n\n// MIP TUNTAP driver\nstatic size_t tap_rx(void *buf, size_t len, struct mg_tcpip_if *ifp) {\n  ssize_t received = read(*(int *) ifp->driver_data, buf, len);\n  usleep(1);  // This is to avoid 100% CPU\n  if (received < 0) return 0;\n  return (size_t) received;\n}\n\nstatic size_t tap_tx(const void *buf, size_t len, struct mg_tcpip_if *ifp) {\n  ssize_t res = write(*(int *) ifp->driver_data, buf, len);\n  if (res < 0) {\n    MG_ERROR((\"tap_tx failed: %d\", errno));\n    return 0;\n  }\n  return (size_t) res;\n}\n\nstatic bool tap_poll(struct mg_tcpip_if *ifp, bool s1) {\n  return s1 && ifp->driver_data ? true : false;\n}\n\n\nint main(void) {\n  bool result;\n  const char *debug_level = getenv(\"V\");\n  // Setup interface\n  const char *iface = \"tap0\";             // Network iface\n  const char *mac = \"02:00:01:02:03:78\";  // MAC address\n#ifndef __OpenBSD__\n  const char *tuntap_device = \"/dev/net/tun\";\n#else\n  const char *tuntap_device = \"/dev/tap0\";\n#endif\n  int fd = open(tuntap_device, O_RDWR);\n  struct ifreq ifr;\n  memset(&ifr, 0, sizeof(ifr));\n  strncpy(ifr.ifr_name, iface, IFNAMSIZ);\n#ifndef __OpenBSD__\n  ifr.ifr_flags = IFF_TAP | IFF_NO_PI;\n  if (ioctl(fd, TUNSETIFF, (void *) &ifr) < 0) {\n    MG_ERROR((\"Failed to setup TAP interface: %s\", ifr.ifr_name));\n    ABORT();  // return EXIT_FAILURE;\n  }\n#else\n  ifr.ifr_flags = (short) (IFF_UP | IFF_BROADCAST | IFF_MULTICAST);\n  if (ioctl(fd, TUNSIFMODE, (void *) &ifr) < 0) {\n    MG_ERROR((\"Failed to setup TAP interface: %s\", ifr.ifr_name));\n    ABORT();  // return EXIT_FAILURE;\n  }\n#endif\n  fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);  // Non-blocking mode\n\n  MG_INFO((\"Opened TAP interface: %s\", iface));\n  usleep(200000);  // 200 ms\n\n  if (debug_level == NULL) debug_level = \"3\";\n  mg_log_set(atoi(debug_level));\n\n  struct mg_mgr mgr;  // Event manager\n  mg_mgr_init(&mgr);  // Initialise event manager\n\n  // MIP driver\n  struct mg_tcpip_driver driver;\n  memset(&driver, 0, sizeof(driver));\n\n  driver.tx = tap_tx;\n  driver.poll = tap_poll;\n  driver.rx = tap_rx;\n\n  struct mg_tcpip_if mif;\n  memset(&mif, 0, sizeof(mif));\n\n  mif.driver = &driver;\n  mif.driver_data = &fd;\n\n#if MIPTAPTEST_USING_DHCP == 1\n#else\n  mif.ip = mg_htonl(MG_U32(192, 168, 32, 2));  // Triggering a network failure\n  mif.mask = mg_htonl(MG_U32(255, 255, 255, 0));\n  mif.gw = mg_htonl(MG_U32(192, 168, 32, 1));\n#endif\n\n  sscanf(mac, \"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx\", &mif.mac[0], &mif.mac[1],\n         &mif.mac[2], &mif.mac[3], &mif.mac[4], &mif.mac[5]);\n\n  mg_tcpip_init(&mgr, &mif);\n  MG_INFO((\"Init done, starting main loop\"));\n  usleep(200000);  // 200 ms\n\n  // Stack initialization, Network configuration (DHCP lease, ...)\n#if MIPTAPTEST_USING_DHCP == 0\n  MG_INFO((\"MIF configuration: Static IP\"));\n  ASSERT(mif.ip != 0);     // Check we have a satic IP assigned\n  mg_mgr_poll(&mgr, 100);  // For initialisation\n#else\n  MG_INFO((\"MIF configuration: DHCP\"));\n  ASSERT(!mif.ip);  // Check we are set for DHCP\n  int pc = 500;     // Timeout on DHCP lease 500 ~ approx 5s (typical delay <1s)\n  while (((pc--) > 0) && !mif.ip) {\n    mg_mgr_poll(&mgr, 100);\n    usleep(10000);  // 10 ms\n  }\n  if (!mif.ip) MG_ERROR((\"No ip assigned (DHCP lease may have failed).\\n\"));\n  ASSERT(mif.ip);  // We have an IP (lease or static)\n#endif\n  while (mif.state != MG_TCPIP_STATE_READY) {\n    mg_mgr_poll(&mgr, 100);\n    usleep(10000);  // 10 ms\n  }\n\n  // RUN TESTS\n  result = mip_x_test(&mgr);\n  close(fd);\n  if (!result) return EXIT_FAILURE;\n  return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/mip_test.c",
    "content": "#define MG_ENABLE_TCPIP 1\n#define MG_ENABLE_TCPIP_DRIVER_INIT 0\n\n#include \"mongoose.c\"  // order is important, this one first\n\n#include \"driver_mock.c\"\n\nstatic int s_num_tests = 0;\nstatic bool s_error = false;\nstatic int s_sent_fragment = 0;\nstatic int s_seg_sent = 0;\n\n#ifdef NO_ABORT\nstatic int s_abort = 0;\n#define ABORT() ++s_abort, s_error = true\n#else\n#ifdef NO_SLEEP_ABORT\n#define ABORT() abort()\n#else\n#define ABORT()                       \\\n  sleep(2); /* 2s, GH print reason */ \\\n  abort();\n#endif\n#endif\n\n#define ASSERT(expr)                                            \\\n  do {                                                          \\\n    s_num_tests++;                                              \\\n    if (!(expr)) {                                              \\\n      printf(\"FAILURE %s:%d: %s\\n\", __FILE__, __LINE__, #expr); \\\n      fflush(stdout);                                           \\\n      ABORT();                                                  \\\n    }                                                           \\\n  } while (0)\n\nstruct ipp {\n  struct ip *ip4;\n  struct ip6 *ip6;\n};\n\nstatic void test_csum(void) {\n  uint8_t ip[20] = {0x45, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x28, 0x11,\n                    0x94, 0xcf, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00, 0x00, 0x01};\n  uint8_t pseudo_udp_odd[53] = {\n      0xc0, 0xa8, 0x45, 0x58, 0x08, 0x08, 0x08, 0x08, 0x00, 0x11, 0x00,\n      0x29, 0xad, 0x67, 0x00, 0x35, 0x00, 0x29, 0xaf, 0xf8, 0x00, 0x01,\n      0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,\n      0x74, 0x69, 0x6d, 0x65, 0x06, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,\n      0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01};\n\n  ASSERT(ipcsum(ip, 20) == 0);\n  ASSERT(ipcsum(pseudo_udp_odd, 53) == 0);\n  // UDP and TCP checksum calc funcions use the same basic calls as ipcsum()\n}\n\n#if !MG_ENABLE_IPV6\n#define udp6csum_ok(d, u) true\n#define tcp6csum_ok(d, t) true\n#endif\n\nstatic bool executed = false;\n\nstatic void mif_fn(struct mg_tcpip_if *ifp, int ev, void *ev_data) {\n  if (ev == MG_TCPIP_EV_ST_CHG) {\n    ASSERT(*(uint8_t *) ev_data == MG_TCPIP_STATE_READY);\n    executed = true;\n  }\n  (void) ifp;\n}\n\nstatic void test_statechange(void) {\n  struct mg_tcpip_if iface;\n  memset(&iface, 0, sizeof(iface));\n  iface.ip = mg_htonl(0x01020304);\n  iface.state = MG_TCPIP_STATE_READY;\n  iface.driver = &mg_tcpip_driver_mock;\n  iface.fn = mif_fn;\n  onstatechange(&iface);\n  ASSERT(executed == true);\n  executed = false;\n}\n#if MG_ENABLE_IPV6\nstatic void mif6_fn(struct mg_tcpip_if *ifp, int ev, void *ev_data) {\n  if (ev == MG_TCPIP_EV_ST6_CHG) {\n    ASSERT(*(uint8_t *) ev_data == MG_TCPIP_STATE_READY);\n    executed = true;\n  }\n  (void) ifp;\n}\n\nstatic void test_state6change(void) {\n  struct mg_tcpip_if iface;\n  memset(&iface, 0, sizeof(iface));\n  iface.ip6[0] = mg_htonll(0x01020304);\n  iface.ip6[1] = mg_htonll(0x05060708);\n  iface.state6 = MG_TCPIP_STATE_READY;\n  iface.driver = &mg_tcpip_driver_mock;\n  iface.fn = mif6_fn;\n  onstate6change(&iface);\n  ASSERT(executed == true);\n  executed = false;\n}\n#endif\n\nstatic void ph(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_POLL) ++(*(int *) c->fn_data);\n  (void) c, (void) ev_data;\n}\n\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  (void) c, (void) ev, (void) ev_data;\n}\n\nstatic void tcpclosure_fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_ACCEPT) c->is_draining = 1;\n  (void) c, (void) ev_data;\n}\n\nstatic void client_fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_ERROR || ev == MG_EV_CONNECT) (*(int *) c->fn_data) = ev;\n  (void) c, (void) ev_data;\n}\n\nstatic void frag_recv_fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_ERROR) {\n    if (s_sent_fragment > 0) {\n      ASSERT(s_sent_fragment == 1);\n      ASSERT(strcmp((char *) ev_data, \"Received fragmented packet\") == 0);\n      s_sent_fragment = 2;\n    }\n  }\n  (void) c, (void) ev_data;\n}\n\n// mock send to a non-existent peer using the listener connection\nstatic void frag_send_fn(struct mg_connection *c, int ev, void *ev_data) {\n  static bool s_sent;\n  static int s_seg_sizes[] = {416, 416, 368};  // based on len=1200 and MTU=500\n  if (ev == MG_EV_POLL) {\n    if (!s_sent) {\n      struct connstate *s = (struct connstate *) (c + 1);\n      s->dmss = 1500;      // mock set some destination MSS way larger\n      c->send.len = 1200;  // setting TCP payload size\n      s_sent = true;\n    }\n  } else if (ev == MG_EV_WRITE) {\n    // Checking TCP segment sizes (ev_data points to the TCP payload length)\n    ASSERT(*(int *) ev_data == s_seg_sizes[s_seg_sent++]);\n  }\n  (void) c, (void) ev_data;\n}\n\nstatic void test_poll(void) {\n  int count = 0, i;\n  struct mg_tcpip_if mif;\n  struct mg_mgr mgr;\n  mg_mgr_init(&mgr);\n  memset(&mif, 0, sizeof(mif));\n  mif.driver = &mg_tcpip_driver_mock;\n  mg_tcpip_init(&mgr, &mif);\n  mg_http_listen(&mgr, \"http://0.0.0.0:12346\", ph, &count);\n  for (i = 0; i < 10; i++) mg_mgr_poll(&mgr, 0);\n  ASSERT(count == 10);\n  mg_mgr_free(&mgr);\n}\n\n#define DRIVER_BUF_SIZE 1540\n\nstruct driver_data {\n  char buf[DRIVER_BUF_SIZE];\n  size_t len;\n  bool tx_ready;  // data can be read from tx\n};\n\nstatic struct driver_data s_driver_data;\n\nstatic size_t if_tx(const void *buf, size_t len, struct mg_tcpip_if *ifp) {\n  struct driver_data *driver_data = (struct driver_data *) ifp->driver_data;\n  if (len > DRIVER_BUF_SIZE) len = DRIVER_BUF_SIZE;\n  driver_data->len = len;\n  memcpy(driver_data->buf, buf, len);\n  driver_data->tx_ready = true;\n  return len;\n}\n\nstatic bool if_poll(struct mg_tcpip_if *ifp, bool s1) {\n  return s1 && ifp->driver_data ? true : false;\n}\n\nstatic size_t if_rx(void *buf, size_t len, struct mg_tcpip_if *ifp) {\n  struct driver_data *driver_data = (struct driver_data *) ifp->driver_data;\n  if (driver_data->len == 0) return 0;\n  if (len > driver_data->len) len = driver_data->len;\n  memcpy(buf, driver_data->buf, len);\n  driver_data->len = 0;  // cleaning up the buffer\n  driver_data->tx_ready = false;\n  return len;\n}\n\nstatic bool received_response(struct driver_data *driver) {\n  bool was_ready = driver->tx_ready;\n  driver->tx_ready = false;\n  return was_ready;\n}\n\nstatic void create_tcp_seg(struct eth *e, struct ipp *ipp, uint32_t seq,\n                           uint32_t ack, uint8_t flags, uint16_t sport,\n                           uint16_t dport, size_t payload_len, void *opts,\n                           unsigned int opts_len) {\n  struct tcp t;\n  memset(&t, 0, sizeof(t));\n  t.flags = flags;\n  t.seq = mg_htonl(seq);\n  t.ack = mg_htonl(ack);\n  t.sport = mg_htons(sport);\n  t.dport = mg_htons(dport);\n  t.off = (uint8_t) ((sizeof(t) / 4) << 4) + (uint8_t) ((opts_len / 4) << 4);\n  memcpy(s_driver_data.buf, e, sizeof(*e));\n#if MG_ENABLE_IPV6\n  if (ipp->ip6 != NULL) {\n    struct ip6 *ip = ipp->ip6;\n    struct tcp *tcp =\n        (struct tcp *) (s_driver_data.buf + sizeof(*e) + sizeof(*ip));\n    ip->plen = mg_htons((uint16_t) (4 * (t.off >> 4) + payload_len));\n    memcpy(s_driver_data.buf + sizeof(*e), ip, sizeof(*ip));\n    memcpy(tcp, &t, sizeof(t));\n    if (opts != NULL && opts_len)\n      memcpy(s_driver_data.buf + sizeof(*e) + sizeof(*ip) + sizeof(t), opts,\n             opts_len);\n    tcp->csum = p6csum(ip, tcp, (4 * (t.off >> 4) + payload_len));\n    s_driver_data.len =\n        sizeof(*e) + sizeof(*ip) + sizeof(t) + payload_len + opts_len;\n  } else\n#endif\n  {\n    struct ip *ip = ipp->ip4;\n    struct tcp *tcp =\n        (struct tcp *) (s_driver_data.buf + sizeof(*e) + sizeof(*ip));\n    ip->len =\n        mg_htons((uint16_t) (sizeof(*ip) + 4 * (t.off >> 4) + payload_len));\n    ip->csum = ipcsum(ip, sizeof(*ip));  // no options\n    memcpy(s_driver_data.buf + sizeof(*e), ip, sizeof(*ip));\n    ip->csum = 0;\n    memcpy(tcp, &t, sizeof(t));\n    if (opts != NULL && opts_len)\n      memcpy(s_driver_data.buf + sizeof(*e) + sizeof(*ip) + sizeof(t), opts,\n             opts_len);\n    tcp->csum = pcsum(ip, tcp, (4 * (t.off >> 4) + payload_len));\n    s_driver_data.len =\n        sizeof(*e) + sizeof(*ip) + sizeof(t) + payload_len + opts_len;\n  }\n  if (s_driver_data.len < 64) s_driver_data.len = 64;  // add padding if needed\n}\n\nstatic void create_tcp_simpleseg(struct eth *e, struct ipp *ipp, uint32_t seq,\n                                 uint32_t ack, uint8_t flags,\n                                 size_t payload_len) {\n  // use sport=1 to ease seqno stuff, dport=80 due to init_tcp_tests() below\n  create_tcp_seg(e, ipp, seq, ack, flags, 1, 80, payload_len, NULL, 0);\n}\n\nstatic void init_tests(struct mg_mgr *mgr, struct eth *e, struct ipp *ipp,\n                       struct mg_tcpip_driver *driver, struct mg_tcpip_if *mif,\n                       uint8_t proto) {\n  mg_mgr_init(mgr);\n  memset(mif, 0, sizeof(*mif));\n  memset(&s_driver_data, 0, sizeof(struct driver_data));\n  driver->init = NULL, driver->tx = if_tx, driver->poll = if_poll,\n  driver->rx = if_rx;\n  mif->driver = driver;\n  mif->driver_data = &s_driver_data;\n#if MG_ENABLE_IPV6\n  if (ipp->ip6 != NULL) {\n    mif->ip6[0] = mg_htonll(0x100000000000000);\n    mif->prefix[0] = 1;\n    mif->prefix_len = 64;\n    mif->gw6[0] = mg_htonll(0x100000000000000);\n    mif->gw6_ready = true;\n    mif->state = MG_TCPIP_STATE_READY;   // so DHCP stops\n    mif->state6 = MG_TCPIP_STATE_READY;  // so mg_send() works and RS stops\n  } else\n#endif\n  {\n    mif->ip = mg_htonl(0x1000000);\n    mif->gw = mg_htonl(0x1000000);\n    mif->gw_ready = true;\n    mif->mask = 255;  // use router, to avoid firing an ARP request\n    mif->state = MG_TCPIP_STATE_READY;  // so mg_send() works and DHCP stops\n  }\n  mg_tcpip_init(mgr, mif);\n\n  // setting the Ethernet header\n  memset(e, 0, sizeof(*e));\n  memcpy(e->dst, mif->mac, 6 * sizeof(uint8_t));\n  e->type = mg_htons(ipp->ip4 != NULL ? 0x800 : 0x86dd);\n\n  // setting the IP header\n#if MG_ENABLE_IPV6\n  if (ipp->ip6 != NULL) {\n    struct ip6 *ip = ipp->ip6;\n    memset(ip, 0, sizeof(*ip));\n    ip->ver = 0x60;\n    ip->next = proto;\n    // must be outside of Mongoose network to avoid firing NS requests\n    ip->src[0] = mg_htonll(0x200000000000000);\n    ip->dst[0] = mif->ip6[0];\n  } else\n#endif\n  {\n    struct ip *ip = ipp->ip4;\n    memset(ip, 0, sizeof(*ip));\n    ip->ver = (4 << 4) | 5;\n    ip->proto = proto;\n    // must be outside of Mongoose network to avoid firing ARP requests\n    ip->src = mg_htonl(0x2000000);\n    ip->dst = mif->ip;\n  }\n}\n\nstatic void init_tcp_tests(struct mg_mgr *mgr, struct eth *e, struct ipp *ipp,\n                           struct mg_tcpip_driver *driver,\n                           struct mg_tcpip_if *mif, mg_event_handler_t f) {\n  init_tests(mgr, e, ipp, driver, mif, 6);  // 6 -> TCP\n#if MG_ENABLE_IPV6\n  if (ipp->ip6 != NULL) {\n    mg_http_listen(mgr, \"http://[::]:80\", f, NULL);\n  } else\n#endif\n  {\n    mg_http_listen(mgr, \"http://0.0.0.0:80\", f, NULL);\n  }\n  mgr->conns->pfn = NULL;  // HTTP handler not needed\n  mg_mgr_poll(mgr, 0);\n}\n\nstatic void init_tcp_handshake(struct eth *e, struct ipp *ipp,\n                               struct mg_mgr *mgr) {\n  struct tcp *t =\n      (struct tcp *) (s_driver_data.buf + sizeof(*e) +\n                      (ipp->ip4 ? sizeof(struct ip) : sizeof(struct ip6)));\n\n  // SYN\n  create_tcp_simpleseg(e, ipp, 1000, 0, TH_SYN, 0);\n  MG_VERBOSE((\"SYN     -->\"));\n  mg_mgr_poll(mgr, 0);  // make sure we clean former stuff in buffer\n\n  // SYN-ACK\n  while (!received_response(&s_driver_data)) mg_mgr_poll(mgr, 0);\n  ASSERT((t->flags == (TH_SYN | TH_ACK)));\n  ASSERT((t->ack == mg_htonl(1001)));\n  MG_VERBOSE((\"SYN+ACK <--\"));\n\n  // ACK\n  create_tcp_simpleseg(e, ipp, 1001, 2, TH_ACK, 0);\n  MG_VERBOSE((\"ACK     -->\"));\n  mg_mgr_poll(mgr, 0);  // this may have data on return !\n}\n\n// DHCP discovery works as a 1 second timeout, we take advantage of it\n// (something is received within 1s) and we mask it when doing longer waits\n// (verify received data is TCP by checking IP's protocol field)\nstatic void test_tcp_basics(bool ipv6) {\n  struct mg_mgr mgr;\n  struct eth e;\n  struct ip ip;\n  struct ip6 ip6;\n  struct ipp ipp;\n  struct tcp *t = (struct tcp *) (s_driver_data.buf + sizeof(e) +\n                                  (!ipv6 ? sizeof(ip) : sizeof(ip6)));\n  struct ip *i = (struct ip *) (s_driver_data.buf + sizeof(e));\n  struct ip6 *i6 = (struct ip6 *) (s_driver_data.buf + sizeof(e));\n  uint64_t start, now;\n  struct mg_tcpip_driver driver;\n  struct mg_tcpip_if mif;\n\n  ipp.ip4 = !ipv6 ? &ip : NULL;\n  ipp.ip6 = ipv6 ? &ip6 : NULL;\n\n  init_tcp_tests(&mgr, &e, &ipp, &driver, &mif, fn);\n\n  // https://datatracker.ietf.org/doc/html/rfc9293#section-3.5.2\tReset\n  // Generation non-used port. Group 1 in RFC send SYN, expect RST + ACK\n  create_tcp_seg(&e, &ipp, 1234, 4321, TH_SYN, 1, 69, 0, NULL, 0);\n  mg_mgr_poll(&mgr, 0);  // make sure we clean former stuff in buffer\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT(t->flags == (TH_RST | TH_ACK));\n  ASSERT(t->seq == mg_htonl(0));\n  ASSERT(t->ack == mg_htonl(1235));\n  if (ipv6) {\n    ASSERT(i6->src[0] == mg_htonll(0x100000000000000) && i6->src[1] == 0 &&\n           i6->dst[0] == mg_htonll(0x200000000000000) && i6->dst[1] == 0);\n    ASSERT(tcp6csum_ok(i6, t));\n  } else {\n    ASSERT(i->src == mg_htonl(0x1000000) && i->dst == mg_htonl(0x2000000));\n    ASSERT(tcpcsum_ok(i, t));\n  }\n\n  // send SYN+ACK, expect RST\n  create_tcp_seg(&e, &ipp, 1234, 4321, TH_SYN | TH_ACK, 1, 69, 0, NULL, 0);\n  mg_mgr_poll(&mgr, 0);  // make sure we clean former stuff in buffer\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT(t->flags == TH_RST);\n  ASSERT(t->seq == mg_htonl(4321));\n  // send data, expect RST + ACK\n  create_tcp_seg(&e, &ipp, 1234, 4321, TH_PUSH, 1, 69, 2, NULL, 0);\n  mg_mgr_poll(&mgr, 0);\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT(t->flags == (TH_RST | TH_ACK));\n  ASSERT(t->seq == mg_htonl(0));\n  ASSERT(t->ack == mg_htonl(1236));\n\n  // send ACK, expect RST\n  create_tcp_seg(&e, &ipp, 1234, 4321, TH_ACK, 1, 69, 0, NULL, 0);\n  mg_mgr_poll(&mgr, 0);\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT(t->flags == TH_RST);\n  ASSERT(t->seq == mg_htonl(4321));\n\n  // send FIN, expect RST + ACK\n  create_tcp_seg(&e, &ipp, 1234, 4321, TH_FIN, 1, 69, 0, NULL, 0);\n  mg_mgr_poll(&mgr, 0);  // make sure we clean former stuff in buffer\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT(t->flags == (TH_RST | TH_ACK));  // Linux answers RST only\n  ASSERT(t->seq == mg_htonl(0));\n  ASSERT(t->ack == mg_htonl(1235));\n\n  // send FIN+ACK, expect RST\n  create_tcp_seg(&e, &ipp, 1234, 4321, TH_FIN | TH_ACK, 1, 69, 0, NULL, 0);\n  mg_mgr_poll(&mgr, 0);  // make sure we clean former stuff in buffer\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT(t->flags == TH_RST);\n  ASSERT(t->seq == mg_htonl(4321));\n\n  // listening, non-connected port. Group 2 in RFC\n  // send data, expect no response\n  create_tcp_seg(&e, &ipp, 1234, 4321, TH_PUSH, 1, 80, 2, NULL, 0);\n  mg_mgr_poll(&mgr, 0);\n  ASSERT(!received_response(&s_driver_data));\n\n  // send ACK, expect RST\n  create_tcp_seg(&e, &ipp, 1234, 4321, TH_ACK, 1, 80, 0, NULL, 0);\n  mg_mgr_poll(&mgr, 0);\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT(t->flags == TH_RST);\n  ASSERT(t->seq == mg_htonl(4321));\n  if (ipv6) {\n    ASSERT(i6->src[0] == mg_htonll(0x100000000000000) && i6->src[1] == 0 &&\n           i6->dst[0] == mg_htonll(0x200000000000000) && i6->dst[1] == 0);\n  } else {\n    ASSERT(i->src == mg_htonl(0x1000000) && i->dst == mg_htonl(0x2000000));\n  }\n\n  // send SYN+ACK, expect RST\n  create_tcp_seg(&e, &ipp, 1234, 4321, TH_SYN | TH_ACK, 1, 80, 0, NULL, 0);\n  mg_mgr_poll(&mgr, 0);  // make sure we clean former stuff in buffer\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT(t->flags == TH_RST);\n  ASSERT(t->seq == mg_htonl(4321));\n\n  // send FIN, expect no response\n  create_tcp_seg(&e, &ipp, 1234, 4321, TH_FIN, 1, 80, 0, NULL, 0);\n  mg_mgr_poll(&mgr, 0);\n  ASSERT(!received_response(&s_driver_data));\n\n  // send FIN+ACK, expect RST\n  create_tcp_seg(&e, &ipp, 1234, 4321, TH_FIN | TH_ACK, 1, 80, 0, NULL, 0);\n  mg_mgr_poll(&mgr, 0);  // make sure we clean former stuff in buffer\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT(t->flags == TH_RST);\n  ASSERT(t->seq == mg_htonl(4321));\n\n  // we currently don't validate checksum, no silently discarded segment test\n\n  init_tcp_handshake(&e, &ipp, &mgr);  // starts with seq_no=1000, ackno=2\n\n  // no MSS sent, so it must default to 536/1220 (RFC-9293 3.7.1)\n  ASSERT(((struct connstate *) (mgr.conns + 1))->dmss == (ipv6 ? 1220 : 536));\n\n  // segment with seq_no within window\n  create_tcp_simpleseg(&e, &ipp, 1010, 2, TH_PUSH, 2);\n  mg_mgr_poll(&mgr, 0);\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT((t->flags == TH_ACK));\n  ASSERT((t->ack == mg_htonl(1001)));  // expecting 1001, dude\n  if (ipv6) {\n    ASSERT(i6->src[0] == mg_htonll(0x100000000000000) && i6->src[1] == 0 &&\n           i6->dst[0] == mg_htonll(0x200000000000000) && i6->dst[1] == 0);\n  } else {\n    ASSERT(i->src == mg_htonl(0x1000000) && i->dst == mg_htonl(0x2000000));\n  }\n\n  // segment with seq_no way out of window\n  create_tcp_simpleseg(&e, &ipp, 1000000, 2, TH_PUSH, 2);\n  mg_mgr_poll(&mgr, 0);\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT((t->flags == TH_ACK));\n  ASSERT((t->ack == mg_htonl(1001)));  // expecting 1001, dude\n\n  // Initiate closure, send FIN (test client-initiated closure)\n  // https://datatracker.ietf.org/doc/html/rfc9293#section-3.6\n  // We are case 1, Mongoose is case 2\n  create_tcp_simpleseg(&e, &ipp, 1001, 2, TH_FIN, 0);\n  mg_mgr_poll(&mgr, 0);  // make sure we clean former stuff in buffer\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  // Mongoose does a fast reduced (\"3-way instead of 4-way\" closure)\n  ASSERT((t->flags == (TH_FIN | TH_ACK)));  // Mongoose ACKs our FIN, sends FIN\n  ASSERT((t->seq == mg_htonl(2)));\n  ASSERT((t->ack == mg_htonl(1002)));\n  // make sure it is still open\n  ASSERT(mgr.conns->next !=\n         NULL);  // more than one connection: the listener + us\n  create_tcp_simpleseg(&e, &ipp, 1002, 3, TH_ACK, 0);  // ACK Mongoose FIN\n  mg_mgr_poll(&mgr, 0);\n  ASSERT(!received_response(&s_driver_data));\n  // make sure it is closed\n  ASSERT(mgr.conns->next == NULL);  // only one connection: the listener\n\n  s_driver_data.len = 0;\n  mg_mgr_free(&mgr);\n\n  // Test client-initiated closure timeout, do not ACK\n  init_tcp_tests(&mgr, &e, &ipp, &driver, &mif, fn);\n  init_tcp_handshake(&e, &ipp, &mgr);  // starts with seq_no=1000, ackno=2\n  create_tcp_simpleseg(&e, &ipp, 1001, 2, TH_FIN, 0);\n  mg_mgr_poll(&mgr, 0);  // make sure we clean former stuff in buffer\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  // Mongoose does a fast reduced (\"3-way instead of 4-way\" closure)\n  ASSERT((t->flags == (TH_FIN | TH_ACK)));  // Mongoose ACKs our FIN, sends FIN\n  ASSERT((t->seq == mg_htonl(2)));\n  ASSERT((t->ack == mg_htonl(1002)));\n  // make sure it is still open\n  ASSERT(mgr.conns->next !=\n         NULL);           // more than one connection: the listener + us\n  s_driver_data.len = 0;  // avoid Mongoose \"receiving itself\"\n  start = mg_millis();\n  now = 0;\n  do {\n    mg_mgr_poll(&mgr, 0);\n    if (received_response(&s_driver_data) && (ipv6 ? i6->next : i->proto) == 6)\n      break;  // check first\n    now = mg_millis() - start;\n  } while (now < (12 * MG_TCPIP_FIN_MS) / 10);\n  ASSERT(now > MG_TCPIP_FIN_MS);\n  // make sure it is closed\n  ASSERT(mgr.conns->next == NULL);  // only one connection: the listener\n\n  s_driver_data.len = 0;\n  mg_mgr_free(&mgr);\n\n  // Test server-initiated closure, abbreviated 3-way: respond FIN+ACK\n  // https://datatracker.ietf.org/doc/html/rfc9293#section-3.6\n  // We are case 2, Mongoose is case 1\n  init_tcp_tests(&mgr, &e, &ipp, &driver, &mif, tcpclosure_fn);\n  init_tcp_handshake(&e, &ipp, &mgr);  // starts with seq_no=1000, ackno=2\n  // we should have already received the FIN due to the call above\n  start = mg_millis();\n  while (!received_response(&s_driver_data)) {\n    mg_mgr_poll(&mgr, 0);\n    now = mg_millis() - start;\n    if (now > 2 * MG_TCPIP_ACK_MS)\n      ASSERT(0);  // response should have been received by now\n  }\n  ASSERT((t->seq == mg_htonl(2)));\n  ASSERT((t->ack == mg_htonl(1001)));\n  ASSERT(t->flags == (TH_FIN | TH_ACK));  // Mongoose ACKs last data, sends FIN\n  // send FIN + ACK\n  create_tcp_simpleseg(&e, &ipp, 1001, 3, TH_FIN | TH_ACK,\n                       0);  // ACK FIN, send FIN\n  mg_mgr_poll(&mgr, 0);     // make sure we clean former stuff in buffer\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT((t->flags == TH_ACK));  // Mongoose ACKs our FIN\n  ASSERT((t->seq == mg_htonl(3)));\n  ASSERT((t->ack == mg_htonl(1002)));\n  // make sure it is closed\n  ASSERT(mgr.conns->next == NULL);  // only one connection: the listener\n\n  s_driver_data.len = 0;\n  mg_mgr_free(&mgr);\n\n  // Test server-initiated closure, long 4-way closure: respond ACK\n  init_tcp_tests(&mgr, &e, &ipp, &driver, &mif, tcpclosure_fn);\n  init_tcp_handshake(&e, &ipp, &mgr);  // starts with seq_no=1000, ackno=2\n  // we should have already received the FIN, tested in above tst\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT((t->seq == mg_htonl(2)));\n  ASSERT((t->ack == mg_htonl(1001)));\n  ASSERT(t->flags == (TH_FIN | TH_ACK));  // Mongoose ACKs last data, sends FIN\n  // ACK Mongoose FIN, do *not* send FIN yet\n  create_tcp_simpleseg(&e, &ipp, 1001, 3, TH_ACK, 0);  // ACK FIN\n  mg_mgr_poll(&mgr, 0);  // make sure we clean former stuff in buffer\n  start = mg_millis();\n  now = 0;\n  do {\n    if (received_response(&s_driver_data)) break;  // check first\n    mg_mgr_poll(&mgr, 0);\n    now = mg_millis() - start;\n  } while (now < 2 * MG_TCPIP_ACK_MS);  // keep timeout below 1s (DHCP discover)\n  ASSERT(now >= 2 * MG_TCPIP_ACK_MS);\n  // make sure it is still open\n  ASSERT(mgr.conns->next !=\n         NULL);  // more than one connection: the listener + us\n  create_tcp_simpleseg(&e, &ipp, 1001, 3, TH_FIN, 0);  // send FIN\n  mg_mgr_poll(&mgr, 0);  // make sure we clean former stuff in buffer\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT((t->flags == TH_ACK));  // Mongoose ACKs our FIN\n  ASSERT((t->seq == mg_htonl(3)));\n  ASSERT((t->ack == mg_htonl(1002)));\n  // make sure it is closed\n  ASSERT(mgr.conns->next == NULL);  // only one connection: the listener\n\n  s_driver_data.len = 0;\n  mg_mgr_free(&mgr);\n\n  // Test server-initiated closure, FIN retransmission: do not ACK FIN\n  // Actual data retransmission is tested on another unit test\n  init_tcp_tests(&mgr, &e, &ipp, &driver, &mif, tcpclosure_fn);\n  init_tcp_handshake(&e, &ipp, &mgr);  // starts with seq_no=1000, ackno=2\n  // we should have already received the FIN, tested in some tst above\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT((t->seq == mg_htonl(2)));\n  ASSERT((t->ack == mg_htonl(1001)));\n  ASSERT(t->flags == (TH_FIN | TH_ACK));  // Mongoose ACKs last data, sends FIN\n  s_driver_data.len = 0;                  // avoid Mongoose \"receiving itself\"\n  start = mg_millis();\n  now = 0;\n  do {\n    if (received_response(&s_driver_data)) break;  // check first\n    mg_mgr_poll(&mgr, 0);\n    now = mg_millis() - start;\n  } while (now < 2 * MG_TCPIP_ACK_MS);  // keep timeout below 1s (DHCP discover)\n  //  ASSERT(now < 2 * MG_TCPIP_ACK_MS); ******** WE FAIL THIS, Mongoose does\n  //  not retransmit, FIN is not an additional element in the stream\n  //  ASSERT((t->seq\n  //  == mg_htonl(2))); ASSERT((t->ack == mg_htonl(1001))); ASSERT(t->flags ==\n  //  (TH_FIN | TH_ACK)); // Mongoose retransmits FIN\n  // send FIN + ACK\n  create_tcp_simpleseg(&e, &ipp, 1001, 3, TH_FIN | TH_ACK,\n                       0);  // ACK FIN, send FIN\n  mg_mgr_poll(&mgr, 0);     // make sure we clean former stuff in buffer\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT((t->flags == TH_ACK));  // Mongoose ACKs our FIN\n  ASSERT((t->seq == mg_htonl(3)));\n  ASSERT((t->ack == mg_htonl(1002)));\n  // make sure it is closed\n  ASSERT(mgr.conns->next == NULL);  // only one connection: the listener\n\n  s_driver_data.len = 0;\n  mg_mgr_free(&mgr);\n\n  // Test simultaneous closure\n  // https://datatracker.ietf.org/doc/html/rfc9293#section-3.6 case 3\n  init_tcp_tests(&mgr, &e, &ipp, &driver, &mif, tcpclosure_fn);\n  init_tcp_handshake(&e, &ipp, &mgr);  // starts with seq_no=1000, ackno=2\n  // we should have already received the FIN due to the call above\n  start = mg_millis();\n  while (!received_response(&s_driver_data)) {\n    mg_mgr_poll(&mgr, 0);\n    now = mg_millis() - start;\n    if (now > 2 * MG_TCPIP_ACK_MS)\n      ASSERT(0);  // response should have been received by now\n  }\n  ASSERT((t->seq == mg_htonl(2)));\n  ASSERT((t->ack == mg_htonl(1001)));\n  ASSERT(t->flags == (TH_FIN | TH_ACK));  // Mongoose ACKs last data, sends FIN\n  // Also initiate closure, send FIN, do *not* ACK Mongoose FIN\n  create_tcp_simpleseg(&e, &ipp, 1001, 2, TH_FIN, 0);\n  mg_mgr_poll(&mgr, 0);  // make sure we clean former stuff in buffer\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT((t->flags == TH_ACK));  // Mongoose ACKs our FIN\n  ASSERT((t->seq == mg_htonl(3)));\n  ASSERT((t->ack == mg_htonl(1002)));\n  // make sure it is still open   ******** WE FAIL THIS, Mongoose closes\n  // immediately, does not wait to retransmit its ACK nor to get the other end\n  // ACK\n  //  ASSERT(mgr.conns->next != NULL);  // more than one connection: the\n  //  listener + us create_tcp_simpleseg(&e, &ipp, 1002, 3, TH_ACK, 0); // ACK\n  //  FIN mg_mgr_poll(&mgr, 0);\n  // make sure it is closed\n  ASSERT(mgr.conns->next == NULL);  // only one connection: the listener\n\n  s_driver_data.len = 0;\n  mg_mgr_free(&mgr);\n\n  // Test responses to a connecting client\n  // https://datatracker.ietf.org/doc/html/rfc9293#section-3.5\n  // NOTE: Mongoose ignores any data until connection is actually established\n  // NOTE: Mongoose does not support the concept of \"simultaneous open\",\n  // Mongoose is either client or server\n  {\n    struct mg_connection *c;\n    int event = 255;\n    uint32_t ackno;\n    // this creates a listener we won't use\n    init_tcp_tests(&mgr, &e, &ipp, &driver, &mif, tcpclosure_fn);\n\n    // must be outside of our network to avoid firing ARP requests\n    if (ipv6) {\n      c = mg_connect(&mgr, \"tcp://[200::]:1234/\", client_fn, &event);\n    } else {\n      c = mg_connect(&mgr, \"tcp://2.0.0.0:1234/\", client_fn, &event);\n    }\n    ASSERT(c != NULL);\n    ASSERT(received_response(&s_driver_data));\n    ASSERT((t->flags == TH_SYN));\n    ASSERT(event == 255);\n    if (ipv6) {\n      ASSERT(i6->src[0] == mg_htonll(0x100000000000000) && i6->src[1] == 0 &&\n             i6->dst[0] == mg_htonll(0x200000000000000) && i6->dst[1] == 0);\n      ASSERT(tcp6csum_ok(i6, t));\n    } else {\n      ASSERT(i->src == mg_htonl(0x1000000) && i->dst == mg_htonl(0x2000000));\n      ASSERT(tcpcsum_ok(i, t));\n    }\n\n    // invalid SYN + ACK to connecting client (after SYN...), send ACK != seq\n    ackno = mg_ntohl(t->seq) + 1000;\n    //  create_tcp_seg(&e, &ipp, 4321, ackno, TH_SYN | TH_ACK, 1234,\n    //  mg_ntohs(c->loc.port), 0, NULL, 0); mg_mgr_poll(&mgr, 0);\n    //  while(!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n    //  ASSERT((t->flags == (TH_RST | TH_ACK)));\n    // ******** WE FAIL THIS, Mongoose does not validate the ACK number\n    //  ASSERT((t->seq == mg_htonl(ackno)));\n    //  ASSERT((t->ack == mg_htonl(4322)));\n\n    // connect\n    ackno = mg_ntohl(t->seq) + 1;\n    create_tcp_seg(&e, &ipp, 4321, ackno, TH_SYN | TH_ACK, 1234,\n                   mg_ntohs(c->loc.port), 0, NULL, 0);\n    mg_mgr_poll(&mgr, 0);  // make sure we clean former stuff in buffer\n    while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n    ASSERT(t->flags == TH_ACK);\n    ASSERT(t->seq == mg_htonl(ackno));\n    ASSERT((t->ack == mg_htonl(4322)));\n    ASSERT(event == MG_EV_CONNECT);\n\n    event = 255;\n    s_driver_data.len = 0;\n    mg_mgr_free(&mgr);\n\n    // test connection failure, send RST+ACK\n    // this creates a listener we won't use\n    init_tcp_tests(&mgr, &e, &ipp, &driver, &mif, tcpclosure_fn);\n    if (ipv6) {\n      c = mg_connect(&mgr, \"tcp://[200::]:1234/\", client_fn, &event);\n    } else {\n      c = mg_connect(&mgr, \"tcp://2.0.0.0:1234/\", client_fn, &event);\n    }\n    received_response(&s_driver_data);  // get the SYN\n    ackno = mg_ntohl(t->seq) + 1;\n    create_tcp_seg(&e, &ipp, 4321, ackno, TH_RST + TH_ACK, 1234,\n                   mg_ntohs(c->loc.port), 0, NULL, 0);\n    mg_mgr_poll(&mgr, 0);\n    MG_DEBUG((\"event: %d\", event));\n    ASSERT(event == MG_EV_ERROR);\n    ASSERT(!received_response(&s_driver_data));\n  }\n\n  s_driver_data.len = 0;\n  mg_mgr_free(&mgr);\n}\n\n// NOTE: a 1-byte payload could be an erroneous Keep-Alive, keep length > 1 in\n// this operation, we're testing retransmissions and having len=1 won't work\n\nstatic void test_tcp_retransmit(void) {\n  struct mg_mgr mgr;\n  struct eth e;\n  struct ip ip;\n  struct ipp ipp;\n  struct tcp *t = (struct tcp *) (s_driver_data.buf + sizeof(e) + sizeof(ip));\n  uint64_t start, now;\n  bool response_recv = true;\n  struct mg_tcpip_driver driver;\n  struct mg_tcpip_if mif;\n\n  ipp.ip4 = &ip;\n  ipp.ip6 = NULL;\n\n  init_tcp_tests(&mgr, &e, &ipp, &driver, &mif, fn);\n\n  init_tcp_handshake(&e, &ipp, &mgr);  // starts with seq_no=1000, ackno=2\n\n  // packet with seq_no = 1001\n  create_tcp_simpleseg(&e, &ipp, 1001, 2, TH_PUSH | TH_ACK, 2);\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT((t->flags == TH_ACK));\n  ASSERT((t->ack == mg_htonl(1003)));  // OK\n\n  // resend packet with seq_no = 1001 (e.g.: MIP ACK lost)\n  create_tcp_simpleseg(&e, &ipp, 1001, 2, TH_PUSH | TH_ACK, 2);\n  mg_mgr_poll(&mgr, 0);\n  start = mg_millis();\n  while (!received_response(&s_driver_data)) {\n    mg_mgr_poll(&mgr, 0);\n    now = mg_millis() - start;\n    // we wait enough time for a reply\n    if (now > 2 * MG_TCPIP_ACK_MS) {\n      response_recv = false;\n      break;\n    }\n  }\n  ASSERT((!response_recv));  // replies should not be sent for duplicate packets\n\n  // packet with seq_no = 1003 got lost/delayed, send seq_no = 1005\n  create_tcp_simpleseg(&e, &ipp, 1005, 2, TH_PUSH | TH_ACK, 2);\n  mg_mgr_poll(&mgr, 0);\n  start = mg_millis();\n  while (!received_response(&s_driver_data)) {\n    mg_mgr_poll(&mgr, 0);\n    now = mg_millis() - start;\n    if (now > 2 * MG_TCPIP_ACK_MS)\n      ASSERT(0);  // response should have been received by now\n  }\n  ASSERT((t->flags == TH_ACK));\n  ASSERT((t->ack == mg_htonl(1003)));  // dup ACK\n\n  // retransmitting packet with seq_no = 1003\n  create_tcp_simpleseg(&e, &ipp, 1003, 2, TH_PUSH | TH_ACK, 2);\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT((t->flags == TH_ACK));\n  ASSERT((t->ack == mg_htonl(1005)));  // OK\n\n  // packet with seq_no = 1005 got delayed, send FIN with seq_no = 1007\n  create_tcp_simpleseg(&e, &ipp, 1007, 2, TH_FIN, 0);\n  mg_mgr_poll(&mgr, 0);\n  start = mg_millis();\n  while (!received_response(&s_driver_data)) {\n    mg_mgr_poll(&mgr, 0);\n    now = mg_millis() - start;\n    if (now > 2 * MG_TCPIP_ACK_MS)\n      ASSERT(0);  // response should have been received by now\n  }\n  ASSERT((t->flags == TH_ACK));\n  ASSERT((t->ack == mg_htonl(1005)));  // dup ACK\n\n  // retransmitting packet with seq_no = 1005\n  create_tcp_simpleseg(&e, &ipp, 1005, 2, TH_PUSH | TH_ACK, 2);\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT((t->flags == TH_ACK));\n  ASSERT((t->ack == mg_htonl(1007)));  // OK\n\n  // retransmitting FIN packet with seq_no = 1007\n  create_tcp_simpleseg(&e, &ipp, 1007, 2, TH_FIN | TH_ACK, 0);\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT((t->flags == (TH_FIN | TH_ACK)));  // check we respond with FIN ACK\n  ASSERT((t->ack == mg_htonl(1008)));       // OK\n\n  s_driver_data.len = 0;\n  mg_mgr_free(&mgr);\n}\n\nstatic void test_frag_recv_path(void) {\n  struct mg_mgr mgr;\n  struct eth e;\n  struct ip ip;\n  struct ipp ipp;\n  struct mg_tcpip_driver driver;\n  struct mg_tcpip_if mif;\n\n  ipp.ip4 = &ip;\n  ipp.ip6 = NULL;\n\n  init_tcp_tests(&mgr, &e, &ipp, &driver, &mif, frag_recv_fn);\n\n  init_tcp_handshake(&e, &ipp, &mgr);  // starts with seq_no=1000, ackno=2\n\n  // send fragmented TCP packet\n  ip.frag |= IP_MORE_FRAGS_MSK;  // setting More Fragments bit to 1\n  create_tcp_simpleseg(&e, &ipp, 1001, 2, TH_PUSH | TH_ACK, 1000);\n  s_sent_fragment = 1;           // \"enable\" fn\n  mg_mgr_poll(&mgr, 0);          // call it (process fake frag IP)\n  ASSERT(s_sent_fragment == 2);  // check it followed the right path\n\n  s_driver_data.len = 0;\n  mg_mgr_free(&mgr);\n}\n\nstatic void test_frag_send_path(void) {\n  struct mg_mgr mgr;\n  struct mg_tcpip_driver driver;\n  struct mg_tcpip_if mif;\n  unsigned int i;\n\n  mg_mgr_init(&mgr);\n  memset(&mif, 0, sizeof(mif));\n  memset(&s_driver_data, 0, sizeof(struct driver_data));\n  driver.init = NULL, driver.tx = if_tx, driver.poll = if_poll,\n  driver.rx = if_rx;\n  mif.driver = &driver;\n  mif.driver_data = &s_driver_data;\n  mg_tcpip_init(&mgr, &mif);\n  mif.mtu = 500;  // force ad hoc small MTU to fragment IP\n  mg_http_listen(&mgr, \"http://0.0.0.0:80\", frag_send_fn, NULL);\n  mgr.conns->pfn = NULL;\n  for (i = 0; i < 10; i++) mg_mgr_poll(&mgr, 0);\n  ASSERT(s_seg_sent == 3);\n  s_driver_data.len = 0;\n  mg_mgr_free(&mgr);\n}\n\nstatic void test_fragmentation(void) {\n  test_frag_recv_path();\n  test_frag_send_path();\n}\n\nstatic void test_tcp_backlog(void) {\n  struct mg_mgr mgr;\n  struct eth e;\n  struct ip ip;\n  struct ipp ipp;\n  struct tcp *t = (struct tcp *) (s_driver_data.buf + sizeof(e) + sizeof(ip));\n  struct ip *i = (struct ip *) (s_driver_data.buf + sizeof(e));\n  uint64_t start, now;\n  struct mg_tcpip_driver driver;\n  struct mg_tcpip_if mif;\n  uint16_t opts[4 / 2];  // Send MSS, RFC-9293 3.7.1\n  struct mg_connection *c;\n  unsigned int j;\n#define LOGSZ (sizeof(c->data) / sizeof(struct mg_backlog))\n  uint32_t seqnos[LOGSZ];\n\n  ipp.ip4 = &ip;\n  ipp.ip6 = NULL;\n\n  init_tcp_tests(&mgr, &e, &ipp, &driver, &mif, fn);\n\n  // test expired connection attempts cleanup\n  create_tcp_seg(&e, &ipp, 1234, 0, TH_SYN, 1, 80, 0, NULL, 0);\n  mg_mgr_poll(&mgr, 0);  // make sure we clean former stuff in buffer\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT(t->flags == (TH_SYN | TH_ACK));\n  // delay ACK so conn attempt is removed from the backlog\n  s_driver_data.len = 0;  // avoid Mongoose \"receiving itself\"\n  start = mg_millis();\n  do {\n    mg_mgr_poll(&mgr, 0);\n    now = mg_millis() - start;\n  } while (now < 2100);\n  // check backlog is empty\n  c = mgr.conns;\n  ASSERT(c->next == NULL);\n  for (j = 0; j < LOGSZ; j++) {\n    struct mg_backlog *b = (struct mg_backlog *) (c->data) + j;\n    ASSERT(b->port == 0);\n  }\n  // Mongoose may have retransmitted SYN + ACK, and DHCP sent discover\n  received_response(&s_driver_data);  // make sure we clean buffer\n\n  opts[0] = mg_htons(0x0204);  // RFC-9293 3.2\n  // fill the backlog\n  for (j = 0; j < LOGSZ; j++) {\n    // assign one MSS for each connection\n    opts[1] = mg_htons((uint16_t) (1010 + j));\n    create_tcp_seg(&e, &ipp, 100 + j, 0, TH_SYN, (uint16_t) (j + 1), 80, 0,\n                   opts, sizeof(opts));\n    while (!received_response(&s_driver_data) || i->proto != 6)\n      mg_mgr_poll(&mgr, 0);\n    ASSERT(t->flags == (TH_SYN | TH_ACK));\n    seqnos[j] = mg_ntohl(t->seq);\n    MG_VERBOSE((\"SEQ: %p\", seqnos[j]));\n  }\n  // check backlog is full and MSS are there\n  c = mgr.conns;\n  for (j = 0; j < LOGSZ; j++) {\n    struct mg_backlog *b = (struct mg_backlog *) (c->data) + j;\n    ASSERT(b->port != 0);\n    MG_DEBUG((\"SEQ: %p, MSS: %u\", seqnos[j], (unsigned int) b->mss));\n    ASSERT(b->mss == (1010 + j));\n  }\n  // one more attempt, it must fail\n  opts[1] = mg_htons((uint16_t) (1010 + j));\n  create_tcp_seg(&e, &ipp, 100 + j, 0, TH_SYN, (uint16_t) (j + 1), 80, 0, opts,\n                 sizeof(opts));\n  mg_mgr_poll(&mgr, 0);\n  ASSERT(!received_response(&s_driver_data) || i->proto != 6);\n  // a late response for this attempt would break what follows\n  // establish all connections\n  for (j = 0; j < LOGSZ; j++) {\n    create_tcp_seg(&e, &ipp, 100 + j + 1, seqnos[j] + 1, TH_ACK,\n                   (uint16_t) (j + 1), 80, 0, NULL, 0);\n    mg_mgr_poll(&mgr, 0);\n    ASSERT(!received_response(&s_driver_data) || i->proto != 6);\n  }\n  // check backlog is now empty\n  c = mgr.conns;  // last one is the listener\n  for (; c->next != NULL; c = c->next)\n    ;\n  for (j = 0; j < LOGSZ; j++) {\n    struct mg_backlog *b = (struct mg_backlog *) (c->data) + j;\n    ASSERT(b->port == 0);\n  }\n  c = mgr.conns;  // first one is more recent\n  // check MSS is what we sent, everything's fine\n  for (j = LOGSZ; j > 0; j--, c = c->next) {\n    struct connstate *s = (struct connstate *) (c + 1);\n    ASSERT(c != NULL);\n    MG_DEBUG((\"MSS: %u\", (unsigned int) s->dmss));\n    ASSERT(s->dmss == (1010 + j - 1));\n  }\n  ASSERT(c != NULL);  // last one is the listener\n  ASSERT(c->next == NULL);\n\n  s_driver_data.len = 0;\n  mg_mgr_free(&mgr);\n}\n\nstatic void test_tcp(bool ipv6) {\n  test_tcp_basics(ipv6);\n  if (!ipv6) {\n    test_tcp_backlog();\n    test_tcp_retransmit();\n  }\n}\n\nstatic void udp_fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_READ && c->recv.len == 2 && c->recv.buf[0] == 'p')\n    mg_send(c, \"P90\", 3);\n  (void) ev_data;\n}\n\nstatic void create_udp_dat(struct eth *e, struct ipp *ipp, uint16_t sport,\n                           uint16_t dport, size_t payload_len) {\n  struct udp u;\n  memset(&u, 0, sizeof(u));\n  u.sport = mg_htons(sport);\n  u.dport = mg_htons(dport);\n  u.len = mg_htons((uint16_t) (sizeof(u) + payload_len));\n  memcpy(s_driver_data.buf, e, sizeof(*e));\n#if MG_ENABLE_IPV6\n  if (ipp->ip6 != NULL) {\n    struct ip6 *ip = ipp->ip6;\n    struct udp *udp =\n        (struct udp *) (s_driver_data.buf + sizeof(*e) + sizeof(*ip));\n    ip->plen = mg_htons((uint16_t) (sizeof(u) + payload_len));\n    memcpy(s_driver_data.buf + sizeof(*e), ip, sizeof(*ip));\n    memcpy(udp, &u, sizeof(u));\n    *(s_driver_data.buf + sizeof(*e) + sizeof(*ip) + sizeof(u)) = 'p';\n    udp->csum = p6csum(ip, udp, (sizeof(u) + payload_len));\n    s_driver_data.len = sizeof(*e) + sizeof(*ip) + sizeof(u) + payload_len;\n  } else\n#endif\n  {\n    struct ip *ip = ipp->ip4;\n    struct udp *udp =\n        (struct udp *) (s_driver_data.buf + sizeof(*e) + sizeof(*ip));\n    ip->len = mg_htons((uint16_t) (sizeof(*ip) + sizeof(u) + payload_len));\n    ip->csum = ipcsum(ip, sizeof(*ip));  // no options\n    memcpy(s_driver_data.buf + sizeof(*e), ip, sizeof(*ip));\n    ip->csum = 0;\n    memcpy(udp, &u, sizeof(u));\n    *(s_driver_data.buf + sizeof(*e) + sizeof(*ip) + sizeof(u)) = 'p';\n    udp->csum = pcsum(ip, udp, (sizeof(u) + payload_len));\n    s_driver_data.len = sizeof(*e) + sizeof(*ip) + sizeof(u) + payload_len;\n  }\n  if (s_driver_data.len < 64) s_driver_data.len = 64;  // add padding if needed\n}\n\nstatic void init_udp_tests(struct mg_mgr *mgr, struct eth *e, struct ipp *ipp,\n                           struct mg_tcpip_driver *driver,\n                           struct mg_tcpip_if *mif, mg_event_handler_t f) {\n  init_tests(mgr, e, ipp, driver, mif, 17);  // 17 -> UDP\n#if MG_ENABLE_IPV6\n  if (ipp->ip6 != NULL) {\n    mif->state = MG_TCPIP_STATE_READY;   // so DHCP stops\n    mif->state6 = MG_TCPIP_STATE_READY;  // so mg_send() works and RS stops\n    mg_listen(mgr, \"udp://[::]:888\", f, NULL);\n  } else\n#endif\n  {\n    mif->state = MG_TCPIP_STATE_READY;  // so mg_send() works and DHCP stops\n    mg_listen(mgr, \"udp://0.0.0.0:888\", f, NULL);\n  }\n  mg_mgr_poll(mgr, 0);\n}\n\nstatic void test_udp(bool ipv6) {\n  struct mg_mgr mgr;\n  struct eth e;\n  struct ip ip;\n  struct ip6 ip6;\n  struct ipp ipp;\n  struct udp *u = (struct udp *) (s_driver_data.buf + sizeof(e) +\n                                  (!ipv6 ? sizeof(ip) : sizeof(ip6)));\n  struct ip *i = (struct ip *) (s_driver_data.buf + sizeof(e));\n  struct ip6 *i6 = (struct ip6 *) (s_driver_data.buf + sizeof(e));\n  struct mg_tcpip_driver driver;\n  struct mg_tcpip_if mif;\n\n  ipp.ip4 = !ipv6 ? &ip : NULL;\n  ipp.ip6 = ipv6 ? &ip6 : NULL;\n\n  init_udp_tests(&mgr, &e, &ipp, &driver, &mif, udp_fn);\n  received_response(&s_driver_data);\n  s_driver_data.len = 0;\n\n  // send data to a non-open port, expect no response (we don't send Destination\n  // Unreachable)\n  create_udp_dat(&e, &ipp, 1, 800, 2);\n  mg_mgr_poll(&mgr, 0);\n  ASSERT(!received_response(&s_driver_data));\n\n  // send data to an open port, expect response\n  create_udp_dat(&e, &ipp, 1, 888, 2);\n  mg_mgr_poll(&mgr, 0);\n  ASSERT(received_response(&s_driver_data));\n  ASSERT(u->sport == mg_htons(888));\n  ASSERT(u->len == mg_htons(sizeof(*u) + 3));\n  ASSERT(*((char *) (u + 1)) == 'P');\n  if (ipv6) {\n    ASSERT(i6->src[0] == mg_htonll(0x100000000000000) && i6->src[1] == 0 &&\n           i6->dst[0] == mg_htonll(0x200000000000000) && i6->dst[1] == 0);\n    ASSERT(udp6csum_ok(i6, u));\n  } else {\n    ASSERT(i->src == mg_htonl(0x1000000) && i->dst == mg_htonl(0x2000000));\n    ASSERT(udpcsum_ok(i, u));\n  }\n\n  s_driver_data.len = 0;\n  mg_mgr_free(&mgr);\n}\n\nstatic void create_icmp_dat(struct eth *e, struct ipp *ipp, uint8_t type,\n                            uint8_t code, size_t payload_len) {\n  struct ip *ip = ipp->ip4;\n  struct icmp i,\n      *icmp = (struct icmp *) (s_driver_data.buf + sizeof(*e) + sizeof(*ip));\n  memset(&i, 0, sizeof(i));\n  i.type = type;\n  i.code = code;\n  memcpy(s_driver_data.buf, e, sizeof(*e));\n  ip->len = mg_htons((uint16_t) (sizeof(*ip) + sizeof(*icmp) + payload_len));\n  ip->csum = ipcsum(ip, sizeof(*ip));\n  memcpy(s_driver_data.buf + sizeof(*e), ip, sizeof(*ip));\n  ip->csum = 0;\n  memcpy(icmp, &i, sizeof(i));\n  icmp->csum = ipcsum(icmp, sizeof(*icmp) + payload_len);\n  s_driver_data.len = sizeof(*e) + sizeof(*ip) + sizeof(*icmp) + payload_len;\n  if (s_driver_data.len < 64) s_driver_data.len = 64;  // add padding if needed\n}\n\nstatic void init_icmp_tests(struct mg_mgr *mgr, struct eth *e, struct ipp *ipp,\n                            struct mg_tcpip_driver *driver,\n                            struct mg_tcpip_if *mif) {\n  init_tests(mgr, e, ipp, driver, mif, 1);  // 1 -> ICMP\n#if MG_ENABLE_IPV6\n  mif->state6 = MG_TCPIP_STATE_READY;  // so RS stops\n  mg_mgr_poll(mgr, 0);\n#endif\n}\n\nstatic void test_icmp_basics(void) {\n  struct mg_mgr mgr;\n  struct eth e;\n  struct ip ip;\n  struct ipp ipp;\n  struct icmp *icmp =\n      (struct icmp *) (s_driver_data.buf + sizeof(e) + sizeof(ip));\n  struct ip *i = (struct ip *) (s_driver_data.buf + sizeof(e));\n  struct mg_tcpip_driver driver;\n  struct mg_tcpip_if mif;\n\n  ipp.ip4 = &ip;\n  ipp.ip6 = NULL;\n  init_icmp_tests(&mgr, &e, &ipp, &driver, &mif);\n\n  create_icmp_dat(&e, &ipp, 8, 0, 0);  // Echo Request\n  mg_mgr_poll(&mgr, 0);  // make sure we clean former stuff in buffer\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT(i->src == mg_htonl(0x1000000) && i->dst == mg_htonl(0x2000000));\n  ASSERT(i->proto == 1);\n  ASSERT(i->len == mg_htons(sizeof(*i) + sizeof(*icmp) + 0));\n  ASSERT(ipcsum_ok(i));     // Bonus, not tested elsewhere\n  ASSERT(icmp->type == 0);  // Echo Reply\n  ASSERT(icmp->code == 0);\n  ASSERT(icmpcsum_ok(icmp, sizeof(*icmp) + 0));\n\n  create_icmp_dat(&e, &ipp, 8, 0, 69);  // Echo Request\n  mg_mgr_poll(&mgr, 0);  // make sure we clean former stuff in buffer\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT(i->src == mg_htonl(0x1000000) && i->dst == mg_htonl(0x2000000));\n  ASSERT(i->proto == 1);\n  ASSERT(i->len == mg_htons(sizeof(*i) + sizeof(*icmp) + 69));\n  ASSERT(icmp->type == 0);  // Echo Reply\n  ASSERT(icmp->code == 0);\n  ASSERT(ipcsum(icmp, sizeof(*icmp) + 69) == 0);\n\n  s_driver_data.len = 0;\n  mg_mgr_free(&mgr);\n}\n\nstatic void test_icmp(void) {\n  test_icmp_basics();\n}\n\n#if MG_ENABLE_IPV6\nstatic void create_icmp6_dat(struct eth *e, struct ipp *ipp, uint8_t type,\n                             uint8_t code, uint8_t *payload,\n                             size_t payload_len) {\n  struct ip6 *ip6 = ipp->ip6;\n  struct icmp6 i6,\n      *icmp6 = (struct icmp6 *) (s_driver_data.buf + sizeof(*e) + sizeof(*ip6));\n  memset(&i6, 0, sizeof(i6));\n  i6.type = type;\n  i6.code = code;\n  if (payload != NULL)\n    memcpy(s_driver_data.buf + sizeof(*e) + sizeof(*ip6) + sizeof(*icmp6),\n           payload, payload_len);\n  ip6->plen = mg_htons((uint16_t) (sizeof(*icmp6) + payload_len));\n  memcpy(s_driver_data.buf, e, sizeof(*e));\n  memcpy(s_driver_data.buf + sizeof(*e), ip6, sizeof(*ip6));\n  memcpy(icmp6, &i6, sizeof(i6));\n  icmp6->csum = p6csum(ip6, icmp6, sizeof(*icmp6) + payload_len);\n  s_driver_data.len = sizeof(*e) + sizeof(*ip6) + sizeof(*icmp6) + payload_len;\n  if (s_driver_data.len < 64) s_driver_data.len = 64;  // add padding if needed\n}\n\nstatic void init_icmp6_tests(struct mg_mgr *mgr, struct eth *e, struct ipp *ipp,\n                             struct mg_tcpip_driver *driver,\n                             struct mg_tcpip_if *mif) {\n  init_tests(mgr, e, ipp, driver, mif, 58);  // 58 -> ICMPv6\n}\n\nstatic void test_icmp6_basics(void) {\n  struct mg_mgr mgr;\n  struct eth e;\n  struct ip6 ip6;\n  struct ipp ipp;\n  struct icmp6 *icmp6 =\n      (struct icmp6 *) (s_driver_data.buf + sizeof(e) + sizeof(ip6));\n  struct ip6 *i = (struct ip6 *) (s_driver_data.buf + sizeof(e));\n  struct mg_tcpip_driver driver;\n  struct mg_tcpip_if mif;\n  uint8_t payload[28], *p = (uint8_t *) (icmp6 + 1);\n\n  ipp.ip4 = NULL;\n  ipp.ip6 = &ip6;\n  init_icmp6_tests(&mgr, &e, &ipp, &driver, &mif);\n\n  create_icmp6_dat(&e, &ipp, 128, 0, NULL, 0);  // Echo Request\n  mg_mgr_poll(&mgr, 0);  // make sure we clean former stuff in buffer\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT(i->src[0] == mg_htonll(0x100000000000000) && i->src[1] == 0 &&\n         i->dst[0] == mg_htonll(0x200000000000000) && i->dst[1] == 0);\n  ASSERT(i->next == 58);\n  ASSERT(i->plen == mg_htons(sizeof(*icmp6) + 0));\n  ASSERT(icmp6->type == 129);  // Echo Reply\n  ASSERT(icmp6->code == 0);\n  ASSERT(icmp6csum_ok(i, icmp6));\n\n  create_icmp6_dat(&e, &ipp, 128, 0, NULL, 69);  // Echo Request\n  mg_mgr_poll(&mgr, 0);  // make sure we clean former stuff in buffer\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT(i->src[0] == mg_htonll(0x100000000000000) && i->src[1] == 0 &&\n         i->dst[0] == mg_htonll(0x200000000000000) && i->dst[1] == 0);\n  ASSERT(i->next == 58);\n  ASSERT(i->plen == mg_htons(sizeof(*icmp6) + 69));\n  ASSERT(icmp6->type == 129);  // Echo Reply\n  ASSERT(icmp6->code == 0);\n  ASSERT(icmp6csum_ok(i, icmp6));\n\n  // Neighbor Solicitation\n  memset(payload, 0, sizeof(payload));\n  memcpy(payload + 4, mif.ip6, 16);\n  payload[20] = 1;  // source hwaddr\n  payload[21] = 1;  // hwaddr len\n  create_icmp6_dat(&e, &ipp, 135, 0, payload, 28);\n  mg_mgr_poll(&mgr, 0);  // make sure we clean former stuff in buffer\n  while (!received_response(&s_driver_data)) mg_mgr_poll(&mgr, 0);\n  ASSERT(i->src[0] == mg_htonll(0x100000000000000) && i->src[1] == 0 &&\n         i->dst[0] == mg_htonll(0x200000000000000) && i->dst[1] == 0);\n  ASSERT(i->next == 58);\n  ASSERT(i->plen == mg_htons(sizeof(*icmp6) + 28));\n  ASSERT(icmp6->type == 136);  // Neighbor Advertisement\n  ASSERT(icmp6->code == 0);\n  ASSERT(p[0] == 0x60);                     // solicited + override\n  ASSERT(memcmp(p + 4, mif.ip6, 16) == 0);  // target address\n  ASSERT(p[20] == 2);                       // target hwaddr\n  ASSERT(p[21] == 1);                       // hwaddr len\n  ASSERT(memcmp(p + 22, mif.mac, 6) == 0);\n\n  s_driver_data.len = 0;\n  mg_mgr_free(&mgr);\n}\n\nstatic void test_icmp6(void) {\n  test_icmp6_basics();\n}\n#endif\n\n#define DASHBOARD(x) \\\n  printf(\"HEALTH_DASHBOARD\\t\\\"%s\\\": %s,\\n\", x, s_error ? \"false\" : \"true\");\n\nint main(void) {\n  s_error = false;\n  test_csum();\n  DASHBOARD(\"checksum\");\n\n  s_error = false;\n  test_statechange();\n  DASHBOARD(\"statechange\");\n\n  s_error = false;\n  test_poll();\n  DASHBOARD(\"poll\");\n\n  s_error = false;\n  test_icmp();\n  DASHBOARD(\"icmp\");\n\n  s_error = false;\n  test_tcp(false);\n  DASHBOARD(\"tcp\");\n\n  s_error = false;\n  test_udp(false);\n  DASHBOARD(\"udp\");\n\n#if MG_ENABLE_IPV6\n  s_error = false;\n  test_icmp6();\n  DASHBOARD(\"icmp6\");\n\n  s_error = false;\n  test_state6change();\n  DASHBOARD(\"state6change\");\n\n  s_error = false;\n  test_tcp(true);\n  DASHBOARD(\"tcp_ipv6\");\n\n  s_error = false;\n  test_udp(true);\n  DASHBOARD(\"udp_ipv6\");\n\n#endif\n\n  s_error = false;\n  test_fragmentation();\n  printf(\"HEALTH_DASHBOARD\\t\\\"ipfrag\\\": %s\\n\", s_error ? \"false\" : \"true\");\n  // last entry with no comma\n\n#ifdef NO_ABORT\n  if (s_abort != 0) return EXIT_FAILURE;\n#endif\n\n  printf(\"SUCCESS. Total tests: %d\\n\", s_num_tests);\n  return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/mip_x_test.c",
    "content": "#define MG_ENABLE_TCPIP 1\n#define MG_ENABLE_TCPIP_DRIVER_INIT 0\n\n#define FETCH_BUF_SIZE (16 * 1024)\n\n#include \"mongoose.c\"\n\nbool mip_x_test(struct mg_mgr *);\n\n\n#ifdef MQTT_LOCALHOST\n#define MQTT_URL \"mqtt://127.0.0.1:1883\"\n#else\n#define MQTT_URL \"mqtt://broker.hivemq.com:1883\"\n#endif\n#if MG_TLS == MG_TLS_BUILTIN\n#define MQTTS_URL \"mqtts://mongoose.ws:8883\"  // test requires TLS 1.3\n#define MQTTS_CA mg_str(s_ca_cert)\nstatic const char *s_ca_cert =\n    \"-----BEGIN CERTIFICATE-----\\n\"\n    \"MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\\n\"\n    \"TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\\n\"\n    \"cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\\n\"\n    \"WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\\n\"\n    \"ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\\n\"\n    \"MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\\n\"\n    \"h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\\n\"\n    \"0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\\n\"\n    \"A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\\n\"\n    \"T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\\n\"\n    \"B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\\n\"\n    \"B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\\n\"\n    \"KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\\n\"\n    \"OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\\n\"\n    \"jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\\n\"\n    \"qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\\n\"\n    \"rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\\n\"\n    \"HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\\n\"\n    \"hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\\n\"\n    \"ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\\n\"\n    \"3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\\n\"\n    \"NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\\n\"\n    \"ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\\n\"\n    \"TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\\n\"\n    \"jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\\n\"\n    \"oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\\n\"\n    \"4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\\n\"\n    \"mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\\n\"\n    \"emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=\\n\"\n    \"-----END CERTIFICATE-----\\n\";\n#elif MG_TLS\n#ifdef MQTT_LOCALHOST\n// we'll generate MQTTS_URL\n#define MQTTS_CA mg_str(s_ca_cert)\nstatic const char *s_ca_cert =\n    \"-----BEGIN CERTIFICATE-----\\n\"\n    \"MIIBFTCBvAIJAMNTFtpfcq8NMAoGCCqGSM49BAMCMBMxETAPBgNVBAMMCE1vbmdv\\n\"\n    \"b3NlMB4XDTI0MDUwNzE0MzczNloXDTM0MDUwNTE0MzczNlowEzERMA8GA1UEAwwI\\n\"\n    \"TW9uZ29vc2UwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASuP+86T/rOWnGpEVhl\\n\"\n    \"fxYZ+pjMbCmDZ+vdnP0rjoxudwRMRQCv5slRlDK7Lxue761sdvqxWr0Ma6TFGTNg\\n\"\n    \"epsRMAoGCCqGSM49BAMCA0gAMEUCIQCwb2CxuAKm51s81S6BIoy1IcandXSohnqs\\n\"\n    \"us64BAA7QgIgGGtUrpkgFSS0oPBlCUG6YPHFVw42vTfpTC0ySwAS0M4=\\n\"\n    \"-----END CERTIFICATE-----\\n\";\n#else\n#define MQTTS_URL \"mqtts://broker.hivemq.com:8883\"\n#define MQTTS_CA mg_unpacked(\"/data/ca.pem\")\n#endif // MQTT_LOCALHOST\n#endif\n\nstatic char *host_ip;\n\nstatic int s_num_tests = 0;\nstatic bool s_error = false;\n\n#ifdef NO_ABORT\nstatic int s_abort = 0;\n#define ABORT() ++s_abort, s_error = true\n#else\n#ifdef NO_SLEEP_ABORT\n#define ABORT() abort()\n#else\n#define ABORT()                       \\\n  sleep(2); /* 2s, GH print reason */ \\\n  abort();\n#endif\n#endif\n\n#define ASSERT(expr)                                            \\\n  do {                                                          \\\n    s_num_tests++;                                              \\\n    if (!(expr)) {                                              \\\n      printf(\"FAILURE %s:%d: %s\\n\", __FILE__, __LINE__, #expr); \\\n      fflush(stdout);                                           \\\n      ABORT();                                                  \\\n    }                                                           \\\n  } while (0)\n\n\nstatic struct mg_http_message gethm(const char *buf) {\n  struct mg_http_message hm;\n  memset(&hm, 0, sizeof(hm));\n  mg_http_parse(buf, strlen(buf), &hm);\n  return hm;\n}\n\nstatic int cmpbody(const char *buf, const char *str) {\n  struct mg_str s = mg_str(str);\n  struct mg_http_message hm = gethm(buf);\n  size_t len = strlen(buf);\n  if (hm.body.len > len) hm.body.len = len - (size_t) (hm.body.buf - buf);\n  return mg_strcmp(hm.body, s);\n}\n\n#ifndef NO_HTTPSERVER_TEST\nstatic void eh1(struct mg_connection *c, int ev, void *ev_data) {\n  struct mg_tls_opts *topts = (struct mg_tls_opts *) c->fn_data;\n  if (ev == MG_EV_ACCEPT && topts != NULL) mg_tls_init(c, topts);\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    MG_DEBUG((\"[%.*s %.*s] message len %d\", (int) hm->method.len,\n              hm->method.buf, (int) hm->uri.len, hm->uri.buf,\n              (int) hm->message.len));\n    if (mg_match(hm->uri, mg_str(\"/foo/*\"), NULL)) {\n      mg_http_reply(c, 200, \"\", \"uri: %.*s\", hm->uri.len - 5, hm->uri.buf + 5);\n    } else if (mg_match(hm->uri, mg_str(\"/ws\"), NULL)) {\n      mg_ws_upgrade(c, hm, NULL);\n    } else if (mg_match(hm->uri, mg_str(\"/body\"), NULL)) {\n      mg_http_reply(c, 200, \"\", \"%.*s\", (int) hm->body.len, hm->body.buf);\n    } else {\n      struct mg_http_serve_opts sopts;\n      memset(&sopts, 0, sizeof(sopts));\n      sopts.root_dir = \"./data\";\n      mg_http_serve_dir(c, hm, &sopts);\n    }\n  } else if (ev == MG_EV_WS_OPEN) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    ASSERT(mg_strcmp(hm->uri, mg_str(\"/ws\")) == 0);\n    mg_ws_send(c, \"opened\", 6, WEBSOCKET_OP_BINARY);\n  } else if (ev == MG_EV_WS_MSG) {\n    struct mg_ws_message *wm = (struct mg_ws_message *) ev_data;\n    mg_ws_send(c, wm->data.buf, wm->data.len, WEBSOCKET_OP_BINARY);\n  }\n}\n#endif\n\nstruct fetch_data {\n  char *buf;\n  const char *url;\n  int code, closed;\n};\n\nstatic void fcb(struct mg_connection *c, int ev, void *ev_data) {\n  struct fetch_data *fd = (struct fetch_data *) c->fn_data;\n  if (ev == MG_EV_CONNECT) {\n    MG_DEBUG((\"CONNECT\"));\n    if (mg_url_is_ssl(fd->url)) {\n      struct mg_tls_opts opts;\n      memset(&opts, 0, sizeof(opts));  // read CA from packed_fs\n      if (host_ip != NULL && strstr(fd->url, host_ip) != NULL) {\n        MG_DEBUG((\"Local connection, using self-signed certificates\"));\n        opts.name = mg_str_s(\"localhost\");\n        opts.ca = mg_unpacked(\"/certs/ca.crt\");\n      } else {\n        opts.name = mg_url_host(fd->url);\n        opts.ca = mg_unpacked(\"/data/ca.pem\");\n#if MG_TLS == MG_TLS_BUILTIN\n        // our TLS does not search for the proper CA in a bundle\n        opts.ca = mg_file_read(&mg_fs_posix, \"data/e5.crt\");\n#endif\n      }\n      mg_tls_init(c, &opts);\n#if MG_TLS == MG_TLS_BUILTIN\n      mg_free((void *) opts.ca.buf);\n#endif\n    }\n  } else if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    snprintf(fd->buf, FETCH_BUF_SIZE, \"%.*s\", (int) hm->message.len,\n             hm->message.buf);\n    fd->code = atoi(hm->uri.buf);\n    fd->closed = 1;\n    c->is_closing = 1;\n    MG_DEBUG((\"CODE: %d, MSG: %.*s\", fd->code, (int) hm->message.len,\n              hm->message.buf));\n    (void) c;\n  } else if (ev == MG_EV_CLOSE) {\n    MG_DEBUG((\"CLOSE\"));\n    fd->closed = 1;\n  } else if (ev == MG_EV_READ) {\n    long bytes = *(long *) ev_data;\n    MG_DEBUG((\"READ %d: %.*s\", (int) bytes, (int) bytes, c->recv.buf));\n  }\n}\n\nstatic int fetch(struct mg_mgr *mgr, char *buf, const char *url,\n                 const char *fmt, ...) {\n  struct fetch_data fd = {buf, url, 0, 0};\n  int i;\n  struct mg_connection *c = NULL;\n  va_list ap;\n  mg_mgr_poll(mgr, 0);  // update ifp->now to avoid ARP lookup using an old\n                        // timestamp (from an ancient call in other test)\n  c = mg_http_connect(mgr, url, fcb, &fd);\n  ASSERT(c != NULL);\n  va_start(ap, fmt);\n  mg_vprintf(c, fmt, &ap);\n  va_end(ap);\n  buf[0] = '\\0';\n  // - TLS: multiple (small) records: allow enough loops so mg_mgr_poll can\n  // process buffered records when no more frames are coming in\n  for (i = 0; i < 500 && buf[0] == '\\0' && !fd.closed; i++) {\n    mg_mgr_poll(mgr, 0);\n    usleep(5000);  // 5 ms. Slow down poll loop to ensure packet transit, but\n                   // allow enough loops to get the ARP response, otherwise,\n                   // given enough traffic, the timer expires before we get a\n                   // chance to see the response\n  }\n  if (!fd.closed) c->is_closing = 1;\n  mg_mgr_poll(mgr, 0);\n  return fd.code;\n}\n\nstatic void test_http_client(struct mg_mgr *mgr) {\n  char buf[FETCH_BUF_SIZE];\n  int rc = 0;\n  const bool ipv6 = MG_ENABLE_IPV6;\n#if MG_TLS\n  if (ipv6) {\n    rc = fetch(mgr, buf, \"https://ipv6.google.com\",\n               \"GET / HTTP/1.0\\r\\nHost: ipv6.google.com\\r\\n\\r\\n\");\n  } else {\n    rc = fetch(mgr, buf, \"https://cesanta.com\",\n               \"GET /robots.txt HTTP/1.0\\r\\nHost: cesanta.com\\r\\n\\r\\n\");\n  }\n  ASSERT(rc == 200);  // OK\n#else\n  if (ipv6) {\n    rc = fetch(mgr, buf, \"http://ipv6.google.com\",\n               \"GET / HTTP/1.0\\r\\nHost: ipv6.google.com\\r\\n\\r\\n\");\n    ASSERT(rc == 200);  // OK\n  } else {\n    rc = fetch(mgr, buf, \"http://cesanta.com\",\n               \"GET /robots.txt HTTP/1.0\\r\\nHost: cesanta.com\\r\\n\\r\\n\");\n    ASSERT(rc == 301);  // OK: Permanently moved (HTTP->HTTPS redirect)\n  }\n\n#endif\n}\n\nstatic struct mg_connection *s_conn;\nstatic char s_topic[16];\n\nstruct mqtt_data {\n  char *url;\n  bool passed;\n};\n\nstatic void mqtt_fn(struct mg_connection *c, int ev, void *ev_data) {\n  struct mqtt_data *data = (struct mqtt_data *) c->fn_data;\n  if (ev == MG_EV_CONNECT) {\n    MG_DEBUG((\"CONNECT\"));\n#if MG_TLS\n    struct mg_tls_opts opts;\n    memset(&opts, 0, sizeof(opts));\n    opts.ca = MQTTS_CA;\n    opts.name = mg_url_host(data->url);\n    mg_tls_init(c, &opts);\n#endif\n  } else if (ev == MG_EV_MQTT_OPEN) {\n    MG_DEBUG((\"MQTT CONNECT\"));\n    struct mg_mqtt_opts sub_opts;\n    memset(&sub_opts, 0, sizeof(sub_opts));\n    sub_opts.topic = mg_str(mg_random_str(s_topic, sizeof(s_topic)));\n    sub_opts.qos = 1;\n    mg_mqtt_sub(c, &sub_opts);\n    struct mg_mqtt_opts pub_opts;\n    memset(&pub_opts, 0, sizeof(pub_opts));\n    pub_opts.topic = sub_opts.topic;\n    pub_opts.message = mg_str(\"hi\");\n    pub_opts.qos = 1, pub_opts.retain = false;\n    mg_mqtt_pub(c, &pub_opts);\n  } else if (ev == MG_EV_MQTT_MSG) {\n    struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;\n    MG_DEBUG((\"TOPIC: %.*s, MSG: %.*s\", (int) mm->topic.len, mm->topic.buf,\n              mm->data.len > 10 ? 10 : (int) mm->data.len, mm->data.buf));\n    ASSERT(mm->topic.len == strlen(s_topic) &&\n           strncmp(mm->topic.buf, s_topic, mm->topic.len) == 0);\n    if (mm->data.len == 2 && strncmp(mm->data.buf, \"hi\", 2) == 0) {\n      struct mg_mqtt_opts pub_opts;\n      memset(&pub_opts, 0, sizeof(pub_opts));\n      pub_opts.topic = mm->topic;\n      // send more than 1 record, content is not relevant\n      pub_opts.message = mg_str_n((char *)(size_t) mqtt_fn, 21098);\n      pub_opts.qos = 1, pub_opts.retain = false;\n      mg_mqtt_pub(c, &pub_opts);\n    } else if (mm->data.len == 8 && strncmp(mm->data.buf, \"farewell\", 8) == 0) {\n      // close on farewell\n      MG_INFO((\"%lu CLOSING\", c->id));\n      mg_mqtt_disconnect(c, NULL);\n      data->passed = true;\n    } else if (mm->data.len == 21098) {\n      struct mg_mqtt_opts pub_opts;\n      ASSERT(memcmp((const char *) (size_t) mqtt_fn, mm->data.buf, 21098) == 0);\n      // send farewell after receiving big data\n      memset(&pub_opts, 0, sizeof(pub_opts));\n      pub_opts.topic = mm->topic;\n      pub_opts.message = mg_str(\"farewell\");\n      pub_opts.qos = 1, pub_opts.retain = false;\n      mg_mqtt_pub(c, &pub_opts);\n    }\n  } else if (ev == MG_EV_CLOSE) {\n    MG_DEBUG((\"CLOSE\"));\n    s_conn = NULL;\n  } else if (ev == MG_EV_ERROR) {\n    MG_ERROR((\"%lu ERROR %s\", c->id, (char *) ev_data));\n  }\n}\n\nstatic void test_mqtt_connsubpub(struct mg_mgr *mgr) {\n  struct mqtt_data data;\n  struct mg_mqtt_opts opts;\n  memset(&opts, 0, sizeof(opts));\n  opts.clean = true, opts.version = 4;\n  data.passed = false;\n#if defined(MQTT_LOCALHOST) && MG_TLS != MG_TLS_BUILTIN\n  if (host_ip == NULL) {\n    printf(\"\\nMQTT_LOCALHOST defined but no HOST_IP provided, skipping MQTTS tests\\n\");\n    return;\n  }\n  printf(\"HOST_IP: %s\\n\", host_ip);\n#endif\n#if MG_TLS\n#if defined(MQTT_LOCALHOST) && MG_TLS != MG_TLS_BUILTIN\n  data.url = mg_mprintf(\"mqtts://%s:8883\", host_ip);\n#else\n  data.url = strdup(MQTTS_URL);\n#endif\n#else\n#ifdef MQTT_LOCALHOST\n  data.url = mg_mprintf(\"mqtt://%s:1883\", host_ip);\n#else\n  data.url = strdup(MQTT_URL);\n#endif\n#endif\n  s_conn = mg_mqtt_connect(mgr, data.url, &opts, mqtt_fn, &data);\n  ASSERT(s_conn != NULL);\n  for (int i = 0; i < 1000 && s_conn != NULL && !s_conn->is_closing; i++) {\n    mg_mgr_poll(mgr, 0);\n    usleep(10000);  // 10 ms. Slow down poll loop to ensure packets transit\n  }\n  ASSERT(data.passed);\n  mg_mgr_poll(mgr, 0);\n  free(data.url);\n}\n\n#ifndef NO_HTTPSERVER_TEST\n#include <pthread.h>\nstatic void *poll_thread(void *p) {\n  struct mg_mgr *mgr = (struct mg_mgr *) p;\n  int i;\n  for (i = 0; i < 300; i++) {\n    mg_mgr_poll(mgr, 0);\n    usleep(10000);  // 10 ms. Slow down poll loop to ensure packet transit\n  }\n  return NULL;\n}\n#endif\n\nstatic void test_http_server(struct mg_mgr *mgr) {\n#ifdef NO_HTTPSERVER_TEST\n  (void) mgr;\n#else\n  struct mg_connection *c;\n  char *cmd;\n  pthread_t thread_id = (pthread_t) 0;\n#if MG_TLS\n  struct mg_tls_opts opts;\n  memset(&opts, 0, sizeof(opts));\n  // opts.ca = mg_str(s_tls_ca);\n  opts.cert = mg_unpacked(\"/certs/server.crt\");\n  opts.key = mg_unpacked(\"/certs/server.key\");\n  c = mg_http_listen(mgr, \"https://0.0.0.0:12347\", eh1, &opts);\n  cmd = mg_mprintf(\"./mip_curl.sh --insecure https://%M:12347\", mg_print_ip4,\n                   &mgr->ifp->ip);\n#else\n  c = mg_http_listen(mgr, \"http://0.0.0.0:12347\", eh1, NULL);\n  cmd =\n      mg_mprintf(\"./mip_curl.sh http://%M:12347\", mg_print_ip4, &mgr->ifp->ip);\n#endif\n  ASSERT(c != NULL);\n  ASSERT (mg_send(c, \"NADA\", 0)); // check mg_send allows len=0\n  pthread_create(&thread_id, NULL, poll_thread,\n                 mgr);  // simpler this way, no concurrency anyway\n  MG_DEBUG((\"CURL\"));\n  ASSERT(system(cmd) == 0);  // wait for curl\n  MG_DEBUG((\"MONGOOSE\"));\n  pthread_join(thread_id, NULL);  // wait for Mongoose\n  MG_DEBUG((\"DONE\"));\n  free(cmd);\n#endif\n}\n\nstatic void test_tls(struct mg_mgr *mgr) {\n#if MG_TLS\n  char *url;\n  char buf[FETCH_BUF_SIZE];  // make sure it can hold Makefile\n  struct mg_str data = mg_unpacked(\"/Makefile\");\n  if (host_ip == NULL) {\n    printf(\"\\nNo HOST_IP provided, skipping TLS tests\\n\");\n    return;\n  }\n  printf(\"HOST_IP: %s\\n\", host_ip);\n  // - POST a large file, make sure we drain TLS buffers and read all: done at\n  // server test, using curl as POSTing client\n  // - Fire patched server, test multiple TLS records per TCP segment handling\n  url = mg_mprintf(\"https://%s:8443\", host_ip);  // for historic reasons\n  ASSERT(system(\"tls_multirec/server -d tls_multirec &\") == 0);\n  sleep(1);\n  ASSERT(fetch(mgr, buf, url, \"GET /thefile HTTP/1.0\\n\\n\") == 200);\n  ASSERT(cmpbody(buf, data.buf) == 0);  // \"thefile\" links to Makefile\n  ASSERT(system(\"killall tls_multirec/server\") == 0);\n  free(url);\n#else\n  (void) cmpbody(\"\", \"\");\n  (void) mgr;\n#endif\n}\n\nbool mip_x_test(struct mg_mgr *mgr) {\n\n  host_ip = getenv(\"HOST_IP\");\n\n#define DASHBOARD(x)  printf(\"HEALTH_DASHBOARD\\t\\\"%s\\\": %s,\\n\", x, s_error ? \"false\":\"true\");\n\n  usleep(500000);  // 500 ms\n  s_error = false;\n  test_http_client(mgr);\n  DASHBOARD(\"http_client\");\n\n  usleep(500000);  // 500 ms\n  s_error = false;\n  test_http_server(mgr);\n  DASHBOARD(\"http_server\");\n\n  usleep(500000);  // 500 ms\n  s_error = false;\n  test_tls(mgr);\n  DASHBOARD(\"tls\");\n\n  usleep(500000);  // 500 ms\n  s_error = false;\n  test_mqtt_connsubpub(mgr);\n  DASHBOARD(\"mqtt\");\n\n  // Clear\n  s_error = false;\n  mg_mgr_free(mgr);\n  ASSERT(mgr->conns == NULL);  // Deconstruction OK\n  printf(\"HEALTH_DASHBOARD\\t\\\"cleanup\\\": %s\\n\", s_error ? \"false\":\"true\");\n // last entry with no comma\n\n#ifdef NO_ABORT\n  if (s_abort != 0) return false;\n#endif\n\n  printf(\"SUCCESS. Total tests: %d\\n\", s_num_tests);\n  return true;\n}\n"
  },
  {
    "path": "test/mongoose_custom.c",
    "content": "#include \"mongoose.h\"\n\nint mkdir(const char *path, mode_t mode) {\n  (void) path, (void) mode;\n  return -1;\n}\n\nvoid mg_connect_resolved(struct mg_connection *c) {\n  (void) c;\n}\n\nbool mg_open_listener(struct mg_connection *c, const char *url) {\n  (void) c, (void) url;\n  return false;\n}\n\nvoid mg_mgr_poll(struct mg_mgr *mgr, int ms) {\n  (void) mgr, (void) ms;\n}\n\nbool mg_send(struct mg_connection *c, const void *buf, size_t len) {\n  (void) c, (void) buf, (void) len;\n  return false;\n}\n\nint mg_mkpipe(struct mg_mgr *m, mg_event_handler_t fn, void *d, bool udp) {\n  (void) m, (void) fn, (void) d, (void) udp;\n  return -1;\n}\n\nvoid _fini(void);\nvoid _fini(void) {\n}\n"
  },
  {
    "path": "test/mosquitto.conf",
    "content": "allow_anonymous true\nlistener 8883 127.0.0.1\ncafile /etc/mosquitto/certs/ca.crt\ncertfile /etc/mosquitto/certs/server.crt\nkeyfile /etc/mosquitto/certs/server.key\n#\nlistener 1883 127.0.0.1\n"
  },
  {
    "path": "test/mosquitto.conf.macos",
    "content": "allow_anonymous true\nlistener 8883 127.0.0.1\ncafile /Users/runner/work/mongoose/mongoose/test/certs/ca.crt\ncertfile /Users/runner/work/mongoose/mongoose/test/certs/server.crt\nkeyfile /Users/runner/work/mongoose/mongoose/test/certs/server.key\n#\nlistener 1883 127.0.0.1\n"
  },
  {
    "path": "test/pack.c",
    "content": "// Copyright (c) Cesanta Software Limited\n// All rights reserved.\n\n// This program is used to pack arbitrary data into a C binary. It takes\n// a list of files as an input, and produces a .c data file that contains\n// contents of all these files as a collection of byte arrays.\n//\n// Usage:\n//   1. Compile this file:\n//      cc -o pack pack.c\n//\n//   2. Convert list of files into single .c:\n//      ./pack file1.data file2.data > fs.c\n//\n//   3. In your application code, you can access files using this function:\n//      const char *mg_unpack(const char *file_name, size_t *size);\n//\n//   4. Build your app with fs.c:\n//      cc -o my_app my_app.c fs.c\n\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/stat.h>\n\nstatic const char *code =\n    \"static int scmp(const char *a, const char *b) {\\n\"\n    \"  while (*a && (*a == *b)) a++, b++;\\n\"\n    \"  return *(const unsigned char *) a - *(const unsigned char *) b;\\n\"\n    \"}\\n\"\n    \"const char *mg_unlist(size_t no) {\\n\"\n    \"  return packed_files[no].name;\\n\"\n    \"}\\n\"\n    \"const char *mg_unpack(const char *name, size_t *size, time_t *mtime) {\\n\"\n    \"  const struct packed_file *p;\\n\"\n    \"  for (p = packed_files; p->name != NULL; p++) {\\n\"\n    \"    if (scmp(p->name, name) != 0) continue;\\n\"\n    \"    if (size != NULL) *size = p->size - 1;\\n\"\n    \"    if (mtime != NULL) *mtime = p->mtime;\\n\"\n    \"    return (const char *) p->data;\\n\"\n    \"  }\\n\"\n    \"  return NULL;\\n\"\n    \"}\\n\";\n\nint main(int argc, char *argv[]) {\n  int i, j, ch;\n  const char *strip_prefix = \"\";\n\n  printf(\"%s\", \"#include \\\"mongoose.h\\\"\\n\");\n  printf(\"%s\", \"\\n\");\n  printf(\"%s\", \"#if defined(__cplusplus)\\nextern \\\"C\\\" {\\n#endif\\n\");\n  printf(\"%s\", \"const char *mg_unlist(size_t no);\\n\");\n  printf(\"%s\", \"const char *mg_unpack(const char *, size_t *, time_t *);\\n\");\n  printf(\"%s\", \"#if defined(__cplusplus)\\n}\\n#endif\\n\\n\");\n\n  for (i = 1; i < argc; i++) {\n    if (strcmp(argv[i], \"-s\") == 0) {\n      strip_prefix = argv[++i];\n    } else if (strcmp(argv[i], \"-h\") == 0 || strcmp(argv[i], \"--help\") == 0) {\n      fprintf(stderr, \"Usage: %s[-s STRIP_PREFIX] files...\\n\", argv[0]);\n      exit(EXIT_FAILURE);\n    } else {\n      char ascii[12];\n      FILE *fp = fopen(argv[i], \"rb\");\n      if (fp == NULL) {\n        fprintf(stderr, \"Cannot open [%s]: %s\\n\", argv[i], strerror(errno));\n        exit(EXIT_FAILURE);\n      }\n\n      printf(\"static const unsigned char v%d[] = {\\n\", i);\n      for (j = 0; (ch = fgetc(fp)) != EOF; j++) {\n        if (j == (int) sizeof(ascii)) {\n          printf(\" // %.*s\\n\", j, ascii);\n          j = 0;\n        }\n        ascii[j] = (char) ((ch >= ' ' && ch <= '~' && ch != '\\\\') ? ch : '.');\n        printf(\" %3u,\", ch);\n      }\n      // Append zero byte at the end, to make text files appear in memory\n      // as nul-terminated strings.\n      // printf(\" 0 // %.*s\\n\", (int) sizeof(ascii), ascii);\n      printf(\" 0 // %.*s\\n};\\n\", j, ascii);\n      fclose(fp);\n    }\n  }\n\n  printf(\"%s\", \"\\nstatic const struct packed_file {\\n\");\n  printf(\"%s\", \"  const char *name;\\n\");\n  printf(\"%s\", \"  const unsigned char *data;\\n\");\n  printf(\"%s\", \"  size_t size;\\n\");\n  printf(\"%s\", \"  time_t mtime;\\n\");\n  printf(\"%s\", \"} packed_files[] = {\\n\");\n\n  for (i = 1; i < argc; i++) {\n    struct stat st;\n    const char *name = argv[i];\n    size_t n = strlen(strip_prefix);\n    if (strcmp(argv[i], \"-s\") == 0) {\n      i++;\n      continue;\n    }\n    stat(argv[i], &st);\n    if (strncmp(name, strip_prefix, n) == 0) name += n;\n    printf(\"  {\\\"/%s\\\", v%d, sizeof(v%d), %lu},\\n\", name, i, i,\n           (unsigned long) st.st_mtime);\n  }\n  printf(\"%s\", \"  {NULL, NULL, 0, 0}\\n\");\n  printf(\"%s\", \"};\\n\\n\");\n  printf(\"%s\", code);\n\n  return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/pack.js",
    "content": "// Copyright (c) 2013-2024 Cesanta Software Limited\n\nconst Pack = async function(files) {\n  let out = `// DO NOT EDIT. This file is generated\n#include \"mongoose.h\"\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\nconst char *mg_unlist(size_t no);\nconst char *mg_unpack(const char *, size_t *, time_t *);\n\n#if defined(__cplusplus)\n}\n#endif\n`;\n  //const str2bytes = str => new TextEncoder().encode(str);\n  let no = 1;\n  for (const f of files) {\n    let byteArray = new TextEncoder().encode(f.data);\n    if (f.zip) {\n       const cs = new CompressionStream('gzip');\n       const writer = cs.writable.getWriter();\n       writer.write(byteArray);\n       writer.close();\n       const resp = new Response(cs.readable);\n       const arr = await resp.arrayBuffer();\n       byteArray = new Uint8Array(arr);\n    }\n    const bytes = Array.from(byteArray);\n\n    // console.log(f.path, bytes);\n    out += `\nstatic const unsigned char v${no}[] = {`;\n    // concat(0) appends trailing 0, in order to make any file an asciz string\n    out += bytes.concat(0).join(',');\n    out +=`};`;\n    no++;\n  }\n\n  out += `\n\nstatic const struct packed_file {\n  const char *name;\n  const unsigned char *data;\n  size_t size;\n  time_t mtime;\n} packed_files[] = {`;\n\n  no = 1;\n  for (const f of files) {\n    out += `\n  {\"/${f.path}${f.zip ? '.gz' : ''}\", v${no}, sizeof(v${no}), 0},`;\n    no++;\n  }\n    out +=`\n  {NULL, NULL, 0, 0}\n};\n`;\n\n  out += `\nstatic int scmp(const char *a, const char *b) {\n  while (*a && (*a == *b)) a++, b++;\n  return *(const unsigned char *) a - *(const unsigned char *) b;\n}\n\nconst char *mg_unlist(size_t no) {\n  return packed_files[no].name;\n}\n\nconst char *mg_unpack(const char *name, size_t *size, time_t *mtime) {\n  const struct packed_file *p;\n  for (p = packed_files; p->name != NULL; p++) {\n    if (scmp(p->name, name) != 0) continue;\n    if (size != NULL) *size = p->size - 1;\n    if (mtime != NULL) *mtime = p->mtime;\n    return (const char *) p->data;\n  }\n  return NULL;\n};\n`;\n\n  return out;\n};\n\n// Script entry point\n\nconst fs = require('fs');\nconst path = require('path');\nconst [, , ...args] = process.argv;\n\nconst files = args.map(f => ({\n  path: f,\n  data: fs.readFileSync(f, 'utf8'),\n  zip: !!f.match(/web_root\\/.+/),\n}));\n\n(async () => {\n  const text = await Pack(files);\n  process.stdout.write(text);\n})();\n\n"
  },
  {
    "path": "test/pico-sdk/Makefile",
    "content": "PROJECTS ?= $(wildcard ../../tutorials/pico-sdk/*-picosdk-*)\nSDK_PATH ?= $(realpath $(PWD))/pico-sdk\nSDK_VERSION ?= 2.1.0\n\nall: $(PROJECTS)\n\techo \n\n$(PROJECTS): pico-sdk FORCE\n\t(make -C $@ build SDK_PATH=$(SDK_PATH) && make -C $@ clean) || ( \\\n\tln -s $(SDK_PATH) $@/pico-sdk && \\\n\tcd $@ && rm -rf build && mkdir -p build && \\\n\tcd build && cmake -DPICO_BOARD=$(SDKBNAME) -G \"Unix Makefiles\" .. && make && \\\n\tcd .. && rm -rf build pico-sdk )\n\nFORCE:\n\npico-sdk:\n\ttest -d $(SDK_PATH) || ( git clone --depth 1 -b $(SDK_VERSION) https://github.com/raspberrypi/pico-sdk $@ && \\\n\tcd $@ && git submodule update --init )\n\nclean:\n\trm -rf $(SDK_PATH)\n\n# Wizard-style board name --> Pico-SDK board name; SDKBNAME = table[BOARD]\nSDK_evb-pico  := pico\nSDK_evb-pico2 := pico2\nSDK_evb-pico2-w5100 := pico2\nSDK_pico-w   := pico_w\nSDK_pico2-w  := pico2_w\nSDKBNAME = $(SDK_$(BOARD))\n"
  },
  {
    "path": "test/port_tap_bridge.c",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <time.h>\n#include <unistd.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <fcntl.h>\n#include <sys/ioctl.h>\n#include <sys/poll.h>\n\n#ifndef __OpenBSD__\n#include <linux/if.h>\n#include <linux/if_tun.h>\n#else\n#include <net/if.h>\n#include <net/if_tun.h>\n#include <net/if_types.h>\n#endif\n\nstatic int s_signo;\nvoid signal_handler(int signo) {\n  s_signo = signo;\n}\n\nint main(void) {\n  // Setup interface\n  const char *iface = \"tap0\";             // Network iface\n  const uint16_t port = 0x55AA;           // UDP port\n#ifndef __OpenBSD__\n  const char *tuntap_device = \"/dev/net/tun\";\n#else\n  const char *tuntap_device = \"/dev/tap0\";\n#endif\n  int fd = open(tuntap_device, O_RDWR);\n  struct ifreq ifr;\n  memset(&ifr, 0, sizeof(ifr));\n  strncpy(ifr.ifr_name, iface, IFNAMSIZ);\n#ifndef __OpenBSD__\n  ifr.ifr_flags = IFF_TAP | IFF_NO_PI;\n  if (ioctl(fd, TUNSETIFF, (void *) &ifr) < 0) {\n#else\n  ifr.ifr_flags = (short) (IFF_UP | IFF_BROADCAST | IFF_MULTICAST);\n  if (ioctl(fd, TUNSIFMODE, (void *) &ifr) < 0) {\n#endif\n    printf(\"Failed to setup TAP interface: %s\", ifr.ifr_name);\n    return EXIT_FAILURE;\n  }\n  printf(\"Opened TAP interface: %s\\n\", iface);\n\n  int sockfd;\n  struct sockaddr_in tap_addr, port_addr;\n\n\tsockfd = socket(AF_INET, SOCK_DGRAM, 0); \n\ttap_addr.sin_family = AF_INET;\n\ttap_addr.sin_addr.s_addr = htonl(0x7f000001U);  // 127.0.0.1\n\ttap_addr.sin_port = htons(port);\n\tif (bind(sockfd, (struct sockaddr *) &tap_addr, sizeof(tap_addr)) < 0) return EXIT_FAILURE; \n  printf(\"Opened UDP socket: 127.0.0.1:%u (0x%04x)\\n\", port, port);\n\n  memset(&port_addr, 0, sizeof(port_addr));\n\n  while (s_signo == 0) {\n    struct pollfd pfd[2];\n\t\tint result;\n\t\tdo {\n\t\t\tpfd[0].fd = fd;\n\t\t\tpfd[0].events = POLLIN | POLLPRI;\t\t// will wait for input available (read ready), use POLLOUT for write\n\t\t\tpfd[1].fd = sockfd;\n\t\t\tpfd[1].events = POLLIN | POLLPRI;\t\t// will wait for input available (read ready), use POLLOUT for write\n\t\t\t\n\t\t\t// only read ready shown here, for write ready use the 3rd arg, and the 4th for exceptions\n\t\t\tresult = poll(pfd, 2, 1000);\t\t// 2 pfd, TIMEOUT in milliseconds\n\t\t\tswitch(result) {\n\t\t\tcase -1: \t// error\n\t\t\t\tbreak;\n\t\t\tcase 0: \t// timeout (if a timeout struct was passed to select)\n\t\t\t\tbreak;\n\t\t\tdefault: \t// the number of fd/sockets with data available (see pfd.revents for each one);\n        uint8_t buf[1540];\n        if (pfd[0].revents & (POLLIN | POLLPRI)) {\n          ssize_t nread = read(fd, buf, 1540);\n//        printf(\"Got at TAP: %d bytes\\n\", (int) nread);\n          if (port_addr.sin_family != 0) { // something has been written to this struct (we got a conterpart)\n    \t\t\t\tsendto(sockfd, buf, (size_t) nread, 0, (struct sockaddr *) &port_addr, sizeof(port_addr)); \n//  \t\t\t\tprintf(\"Sent to %s port %d\\n\", inet_ntoa(port_addr.sin_addr), ntohs(port_addr.sin_port));\n          }\n        }\n        if (pfd[1].revents & (POLLIN | POLLPRI)) {\n  \t\t\t\tsocklen_t len = sizeof(port_addr);\n  \t\t\t\tssize_t nread = recvfrom(sockfd, buf, 1540, 0, (struct sockaddr *) &port_addr, &len); \n//        printf(\"Got at UDP: %d bytes from %s port %d\\n\", nread, inet_ntoa(port_addr.sin_addr), ntohs(port_addr.sin_port));\n  \t\t\t\twrite(fd, buf, (size_t) nread);\n// \t\t\t\tprintf(\"Sent to TAP\\n\");\n        }\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} while (result >= 0);\n    printf(\"looks like we got an error here... should I quit ? Waiting for CTRL-C\\n\");\n\t} \n  close(sockfd);\n  close(fd);\n}\n"
  },
  {
    "path": "test/setup_ga_docker_filesystem.sh",
    "content": "#!/bin/sh\ndf\nls -l /mnt\nsudo systemctl stop docker\nsudo mkdir -p /mnt/docker\nsudo cp test/ga_docker_daemon.json /etc/docker/daemon.json\nsudo systemctl start docker\n\n"
  },
  {
    "path": "test/setup_ga_network.sh",
    "content": "#!/bin/sh\nBRIDGE=mg_bridge0\nBRIDGE_BROADCAST=192.168.32.255\nBRIDGE_IP=192.168.32.1\nBRIDGE_NETWORK=192.168.32.0/24\nBRIDGE_MASK=255.255.255.0\n// Host network is 'eth0'\nTAP=tap0\n\n# see our network configuration\necho \"Network configuration:\"\ntimeout 1s ifconfig\ntimeout 1s sudo route -n    # see our gateway\ntimeout 1s bridge link\ntimeout 1s bridge fdb\necho\n\n# Package installation\necho \"Package installation\"\nsudo apt-get -y install isc-dhcp-server net-tools\n# sudo apt-get -y install build-essential sshpassecho \"Network configuration script: Bridge\"\necho\n\necho \"Network configuration script: TAP\"\nsudo ip link add $BRIDGE type bridge\t# Create brige\nsudo ifconfig $BRIDGE $BRIDGE_IP netmask $BRIDGE_MASK up\necho\n\necho \"Create $TAP attached to $BRIDGE\"\nsudo ip tuntap add dev $TAP mode tap\t# Create tuntap\nsudo ip link set $TAP master $BRIDGE\t# Link tap-bridge\nsudo ip link set $TAP up\necho\n\necho \"Network configuration script: NAT\"\nsudo iptables -A FORWARD -d $BRIDGE_NETWORK -o $BRIDGE -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT\nsudo iptables -A FORWARD -s $BRIDGE_NETWORK -i $BRIDGE -j ACCEPT\nsudo iptables -A FORWARD -i $BRIDGE -o $BRIDGE -j ACCEPT\nsudo iptables -A FORWARD -o $BRIDGE -j REJECT --reject-with icmp-port-unreachable\nsudo iptables -A FORWARD -i $BRIDGE -j REJECT --reject-with icmp-port-unreachable\nsudo iptables -t nat -A POSTROUTING -s $BRIDGE_NETWORK -d 224.0.0.0/24 -j RETURN\nsudo iptables -t nat -A POSTROUTING -s $BRIDGE_NETWORK -d 255.255.255.255/32 -j RETURN\nsudo iptables -t nat -A POSTROUTING -s $BRIDGE_NETWORK ! -d $BRIDGE_NETWORK -p tcp -j MASQUERADE --to-ports 1024-65535\nsudo iptables -t nat -A POSTROUTING -s $BRIDGE_NETWORK ! -d $BRIDGE_NETWORK -p udp -j MASQUERADE --to-ports 1024-65535\nsudo iptables -t nat -A POSTROUTING -s $BRIDGE_NETWORK ! -d $BRIDGE_NETWORK -j MASQUERADE\necho 1 | sudo tee /proc/sys/net/ipv4/ip_forward\necho\n\n# Setup DHCP server\necho \"Network configuration script: DHCP server\"\necho \"Serving from $BRIDGE_IP\"\nHOST_IP=$BRIDGE_IP\nexport HOST_IP\necho \"dhcpd.conf:\"\ncat test/dhcpd.conf\necho\nsudo cp test/dhcpd.conf /etc/dhcp/dhcpd.conf\nsudo chmod a+w /var/lib/dhcp/*\nsudo dhcpd mg_bridge0 &\necho\n\n# Do we have connectivity ?\necho \"Check connectivity:\"\nwget https://cesanta.com/robots.txt\necho robots.txt:\ncat  robots.txt\nrm   robots.txt\necho\n\n# Confirm OK\necho \"Done:\"\ntimeout 1s ifconfig       \ntimeout 1s sudo route -n\ntimeout 1s bridge fdb\ntimeout 1s bridge link\n"
  },
  {
    "path": "test/setup_mqtt_server.sh",
    "content": "#!/bin/sh\n\nsudo apt-get -y install mosquitto\n# \"for some reason\" they think starting the server is cool\nsudo cp test/mosquitto.conf /etc/mosquitto/conf.d/\nsudo cp test/certs/ca.crt /etc/mosquitto/certs/\nsudo cp test/certs/server.crt /etc/mosquitto/certs/\nsudo cp test/certs/server.key /etc/mosquitto/certs/\nsudo ss -tpln | grep 883\n# so we need to restart it with the actual config\nsudo systemctl restart mosquitto\nsudo ss -tpln | grep 883\nsudo cat /var/log/mosquitto/*\n"
  },
  {
    "path": "test/tls_multirec/Makefile",
    "content": "CFLAGS = -g -I.  # This is a known version, no need to check\nCFLAGS_MONGOOSE += -DMG_ENABLE_LINES=1 -DMG_ENABLE_IPV6=1\nCFLAGS_EXTRA ?= -DMG_TLS=MG_TLS_BUILTIN\n\nserver: main.c patched_mongoose.c mongoose.h Makefile\n\t$(CC) main.c patched_mongoose.c $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) -o $@\n\nclean:\n\trm -rf server *.exe *.o *.dSYM\n"
  },
  {
    "path": "test/tls_multirec/main.c",
    "content": "// Copyright (c) 2020 Cesanta Software Limited\n// All rights reserved\n\n#include <signal.h>\n#include \"mongoose.h\"\n\nstatic int s_debug_level = MG_LL_INFO;\nstatic const char *s_root_dir = \".\";\nstatic const char *s_addr1 = \"http://0.0.0.0:8000\";\nstatic const char *s_addr2 = \"https://0.0.0.0:8443\";\nstatic const char *s_enable_hexdump = \"no\";\nstatic const char *s_ssi_pattern = \"#.html\";\nstatic const char *s_upload_dir = NULL;  // File uploads disabled by default\n\n// Self signed certificates, see\n// https://github.com/cesanta/mongoose/blob/master/test/certs/generate.sh\n#ifdef TLS_TWOWAY\nstatic const char *s_tls_ca =\n    \"-----BEGIN CERTIFICATE-----\\n\"\n    \"MIIBFTCBvAIJAMNTFtpfcq8NMAoGCCqGSM49BAMCMBMxETAPBgNVBAMMCE1vbmdv\\n\"\n    \"b3NlMB4XDTI0MDUwNzE0MzczNloXDTM0MDUwNTE0MzczNlowEzERMA8GA1UEAwwI\\n\"\n    \"TW9uZ29vc2UwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASuP+86T/rOWnGpEVhl\\n\"\n    \"fxYZ+pjMbCmDZ+vdnP0rjoxudwRMRQCv5slRlDK7Lxue761sdvqxWr0Ma6TFGTNg\\n\"\n    \"epsRMAoGCCqGSM49BAMCA0gAMEUCIQCwb2CxuAKm51s81S6BIoy1IcandXSohnqs\\n\"\n    \"us64BAA7QgIgGGtUrpkgFSS0oPBlCUG6YPHFVw42vTfpTC0ySwAS0M4=\\n\"\n    \"-----END CERTIFICATE-----\\n\";\n#endif\nstatic const char *s_tls_cert =\n    \"-----BEGIN CERTIFICATE-----\\n\"\n    \"MIIBMTCB2aADAgECAgkAluqkgeuV/zUwCgYIKoZIzj0EAwIwEzERMA8GA1UEAwwI\\n\"\n    \"TW9uZ29vc2UwHhcNMjQwNTA3MTQzNzM2WhcNMzQwNTA1MTQzNzM2WjARMQ8wDQYD\\n\"\n    \"VQQDDAZzZXJ2ZXIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASo3oEiG+BuTt5y\\n\"\n    \"ZRyfwNr0C+SP+4M0RG2pYkb2v+ivbpfi72NHkmXiF/kbHXtgmSrn/PeTqiA8M+mg\\n\"\n    \"BhYjDX+zoxgwFjAUBgNVHREEDTALgglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDRwAw\\n\"\n    \"RAIgTXW9MITQSwzqbNTxUUdt9DcB+8pPUTbWZpiXcA26GMYCIBiYw+DSFMLHmkHF\\n\"\n    \"+5U3NXW3gVCLN9ntD5DAx8LTG8sB\\n\"\n    \"-----END CERTIFICATE-----\\n\";\n\nstatic const char *s_tls_key =\n    \"-----BEGIN EC PRIVATE KEY-----\\n\"\n    \"MHcCAQEEIAVdo8UAScxG7jiuNY2UZESNX/KPH8qJ0u0gOMMsAzYWoAoGCCqGSM49\\n\"\n    \"AwEHoUQDQgAEqN6BIhvgbk7ecmUcn8Da9Avkj/uDNERtqWJG9r/or26X4u9jR5Jl\\n\"\n    \"4hf5Gx17YJkq5/z3k6ogPDPpoAYWIw1/sw==\\n\"\n    \"-----END EC PRIVATE KEY-----\\n\";\n\n// Handle interrupts, like Ctrl-C\nstatic int s_signo;\nstatic void signal_handler(int signo) {\n  s_signo = signo;\n}\n\n// Event handler for the listening connection.\n// Simply serve static files from `s_root_dir`\nstatic void cb(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_ACCEPT && c->fn_data != NULL) {\n    struct mg_tls_opts opts;\n    memset(&opts, 0, sizeof(opts));\n#ifdef TLS_TWOWAY\n    opts.ca = mg_str(s_tls_ca);\n#endif\n    opts.cert = mg_str(s_tls_cert);\n    opts.key = mg_str(s_tls_key);\n    mg_tls_init(c, &opts);\n  }\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n\n    if (mg_match(hm->uri, mg_str(\"/upload\"), NULL)) {\n      // Serve file upload\n      if (s_upload_dir == NULL) {\n        mg_http_reply(c, 403, \"\", \"Denied: file upload directory not set\\n\");\n      } else {\n        struct mg_http_part part;\n        size_t pos = 0, total_bytes = 0, num_files = 0;\n        while ((pos = mg_http_next_multipart(hm->body, pos, &part)) > 0) {\n          char path[MG_PATH_MAX];\n          MG_INFO((\"Chunk name: [%.*s] filename: [%.*s] length: %lu bytes\",\n                   part.name.len, part.name.buf, part.filename.len,\n                   part.filename.buf, part.body.len));\n          mg_snprintf(path, sizeof(path), \"%s/%.*s\", s_upload_dir,\n                      part.filename.len, part.filename.buf);\n          if (mg_path_is_sane(mg_str(path))) {\n            mg_file_write(&mg_fs_posix, path, part.body.buf, part.body.len);\n            total_bytes += part.body.len;\n            num_files++;\n          } else {\n            MG_ERROR((\"Rejecting dangerous path %s\", path));\n          }\n        }\n        mg_http_reply(c, 200, \"\", \"Uploaded %lu files, %lu bytes\\n\", num_files,\n                      total_bytes);\n      }\n    } else {\n      // Serve web root directory\n      struct mg_http_serve_opts opts = {0};\n      opts.root_dir = s_root_dir;\n      opts.ssi_pattern = s_ssi_pattern;\n      mg_http_serve_dir(c, hm, &opts);\n    }\n\n    // Log request\n    MG_INFO((\"%.*s %.*s %lu -> %.*s %lu\", hm->method.len, hm->method.buf,\n             hm->uri.len, hm->uri.buf, hm->body.len, 3, c->send.buf + 9,\n             c->send.len));\n  }\n}\n\nstatic void usage(const char *prog) {\n  fprintf(stderr,\n          \"Mongoose v.%s\\n\"\n          \"Usage: %s OPTIONS\\n\"\n          \"  -H yes|no - enable traffic hexdump, default: '%s'\\n\"\n          \"  -S PAT    - SSI filename pattern, default: '%s'\\n\"\n          \"  -d DIR    - directory to serve, default: '%s'\\n\"\n          \"  -l ADDR   - listening address, default: '%s'\\n\"\n          \"  -u DIR    - file upload directory, default: unset\\n\"\n          \"  -v LEVEL  - debug level, from 0 to 4, default: %d\\n\",\n          MG_VERSION, prog, s_enable_hexdump, s_ssi_pattern, s_root_dir,\n          s_addr1, s_debug_level);\n  exit(EXIT_FAILURE);\n}\n\nint main(int argc, char *argv[]) {\n  char path[MG_PATH_MAX] = \".\";\n  struct mg_mgr mgr;\n  struct mg_connection *c;\n  int i;\n\n  // Parse command-line flags\n  for (i = 1; i < argc; i++) {\n    if (strcmp(argv[i], \"-d\") == 0) {\n      s_root_dir = argv[++i];\n    } else if (strcmp(argv[i], \"-H\") == 0) {\n      s_enable_hexdump = argv[++i];\n    } else if (strcmp(argv[i], \"-S\") == 0) {\n      s_ssi_pattern = argv[++i];\n    } else if (strcmp(argv[i], \"-l\") == 0) {\n      s_addr1 = argv[++i];\n    } else if (strcmp(argv[i], \"-l2\") == 0) {\n      s_addr2 = argv[++i];\n    } else if (strcmp(argv[i], \"-u\") == 0) {\n      s_upload_dir = argv[++i];\n    } else if (strcmp(argv[i], \"-v\") == 0) {\n      s_debug_level = atoi(argv[++i]);\n    } else {\n      usage(argv[0]);\n    }\n  }\n\n  // Root directory must not contain double dots. Make it absolute\n  // Do the conversion only if the root dir spec does not contain overrides\n  if (strchr(s_root_dir, ',') == NULL) {\n    realpath(s_root_dir, path);\n    s_root_dir = path;\n  }\n\n  // Initialise stuff\n  signal(SIGINT, signal_handler);\n  signal(SIGTERM, signal_handler);\n  mg_log_set(s_debug_level);\n  mg_mgr_init(&mgr);\n  if ((c = mg_http_listen(&mgr, s_addr1, cb, NULL)) == NULL) {\n    MG_ERROR((\"Cannot listen on %s. Use http://ADDR:PORT or :PORT\",\n              s_addr1));\n    exit(EXIT_FAILURE);\n  }\n  if ((c = mg_http_listen(&mgr, s_addr2, cb, (void *) 1)) == NULL) {\n    MG_ERROR((\"Cannot listen on %s. Use http://ADDR:PORT or :PORT\",\n              s_addr2));\n    exit(EXIT_FAILURE);\n  }\n  if (mg_casecmp(s_enable_hexdump, \"yes\") == 0) c->is_hexdumping = 1;\n\n  // Start infinite event loop\n  MG_INFO((\"Mongoose version : v%s\", MG_VERSION));\n  MG_INFO((\"HTTP listener    : %s\", s_addr1));\n  MG_INFO((\"HTTPS listener   : %s\", s_addr2));\n  MG_INFO((\"Web root         : [%s]\", s_root_dir));\n  MG_INFO((\"Upload dir       : [%s]\", s_upload_dir ? s_upload_dir : \"unset\"));\n  while (s_signo == 0) mg_mgr_poll(&mgr, 1000);\n  mg_mgr_free(&mgr);\n  MG_INFO((\"Exiting on signal %d\", s_signo));\n  return 0;\n}\n"
  },
  {
    "path": "test/tls_multirec/mongoose.h",
    "content": "// Copyright (c) 2004-2013 Sergey Lyubka\n// Copyright (c) 2013-2024 Cesanta Software Limited\n// All rights reserved\n//\n// This software is dual-licensed: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License version 2 as\n// published by the Free Software Foundation. For the terms of this\n// license, see http://www.gnu.org/licenses/\n//\n// You are free to use this software under the terms of the GNU General\n// Public License, but WITHOUT ANY WARRANTY; without even the implied\n// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n// See the GNU General Public License for more details.\n//\n// Alternatively, you can license this software under a commercial\n// license, as set out in https://www.mongoose.ws/licensing/\n//\n// SPDX-License-Identifier: GPL-2.0-only or commercial\n\n#ifndef MONGOOSE_H\n#define MONGOOSE_H\n\n#define MG_VERSION \"7.16\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n#define MG_ARCH_CUSTOM 0        // User creates its own mongoose_config.h\n#define MG_ARCH_UNIX 1          // Linux, BSD, Mac, ...\n#define MG_ARCH_WIN32 2         // Windows\n#define MG_ARCH_ESP32 3         // ESP32\n#define MG_ARCH_ESP8266 4       // ESP8266\n#define MG_ARCH_FREERTOS 5      // FreeRTOS\n#define MG_ARCH_AZURERTOS 6     // MS Azure RTOS\n#define MG_ARCH_ZEPHYR 7        // Zephyr RTOS\n#define MG_ARCH_ARMGCC 8        // Bare metal ARM\n#define MG_ARCH_CMSIS_RTOS1 9   // CMSIS-RTOS API v1 (Keil RTX)\n#define MG_ARCH_TIRTOS 10       // Texas Semi TI-RTOS\n#define MG_ARCH_PICOSDK 11      // Raspberry Pi Pico-SDK (RP2040, RP2350)\n#define MG_ARCH_ARMCC 12        // Keil MDK-Core with Configuration Wizard\n#define MG_ARCH_CMSIS_RTOS2 13  // CMSIS-RTOS API v2 (Keil RTX5, FreeRTOS)\n#define MG_ARCH_RTTHREAD 14     // RT-Thread RTOS\n#define MG_ARCH_ARMCGT 15       // Texas Semi ARM-CGT\n\n#if !defined(MG_ARCH)\n#if defined(__unix__) || defined(__APPLE__)\n#define MG_ARCH MG_ARCH_UNIX\n#elif defined(_WIN32)\n#define MG_ARCH MG_ARCH_WIN32\n#endif\n#endif  // !defined(MG_ARCH)\n\n#if !defined(MG_ARCH) || (MG_ARCH == MG_ARCH_CUSTOM)\n#include \"mongoose_config.h\"  // keep this include\n#endif\n\n#if !defined(MG_ARCH)\n#error \"MG_ARCH is not specified and we couldn't guess it. Define MG_ARCH=... in your compiler\"\n#endif\n\n// http://esr.ibiblio.org/?p=5095\n#define MG_BIG_ENDIAN (*(uint16_t *) \"\\0\\xff\" < 0x100)\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#if MG_ARCH == MG_ARCH_ARMCGT\n\n#include <ctype.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/types.h>\n#include <time.h>\n\n#define MG_PATH_MAX 100\n#define MG_ENABLE_SOCKET 0\n#define MG_ENABLE_DIRLIST 0\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_AZURERTOS\n\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <time.h>\n\n#include <fx_api.h>\n#include <tx_api.h>\n\n#include <nx_api.h>\n#include <nx_bsd.h>\n#include <nx_port.h>\n#include <tx_port.h>\n\n#define PATH_MAX FX_MAXIMUM_PATH\n#define MG_DIRSEP '\\\\'\n\n#define socklen_t int\n#define closesocket(x) soc_close(x)\n\n#undef FOPEN_MAX\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_ESP32\n\n#include <ctype.h>\n#include <dirent.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <limits.h>\n#include <netdb.h>\n#include <stdarg.h>\n#include <stddef.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <time.h>\n\n#include <esp_ota_ops.h>  // Use angle brackets to avoid\n#include <esp_timer.h>    // amalgamation ditching them\n\n#define MG_PATH_MAX 128\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_ESP8266\n\n#include <ctype.h>\n#include <dirent.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <limits.h>\n#include <netdb.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stddef.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/time.h>\n#include <sys/types.h>\n#include <time.h>\n\n#include <esp_system.h>\n\n#define MG_PATH_MAX 128\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_FREERTOS\n\n#include <ctype.h>\n#if !defined(MG_ENABLE_LWIP) || !MG_ENABLE_LWIP\n#include <errno.h>\n#endif\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stddef.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>  // rand(), strtol(), atoi()\n#include <string.h>\n#if defined(__ARMCC_VERSION)\n#define mode_t size_t\n#include <alloca.h>\n#include <time.h>\n#elif defined(__CCRH__)\n#else\n#include <sys/stat.h>\n#endif\n\n#include <FreeRTOS.h>\n#include <task.h>\n\n#define calloc(a, b) mg_calloc(a, b)\n#define free(a) vPortFree(a)\n#define malloc(a) pvPortMalloc(a)\n#define strdup(s) ((char *) mg_strdup(mg_str(s)).buf)\n\n// Re-route calloc/free to the FreeRTOS's functions, don't use stdlib\nstatic inline void *mg_calloc(size_t cnt, size_t size) {\n  void *p = pvPortMalloc(cnt * size);\n  if (p != NULL) memset(p, 0, size * cnt);\n  return p;\n}\n\n#define mkdir(a, b) mg_mkdir(a, b)\nstatic inline int mg_mkdir(const char *path, mode_t mode) {\n  (void) path, (void) mode;\n  return -1;\n}\n\n#endif  // MG_ARCH == MG_ARCH_FREERTOS\n\n\n#if MG_ARCH == MG_ARCH_ARMGCC\n#define _POSIX_TIMERS\n\n#include <ctype.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/time.h>\n#include <sys/types.h>\n#include <time.h>\n#include <unistd.h>\n\n#define MG_PATH_MAX 100\n#define MG_ENABLE_SOCKET 0\n#define MG_ENABLE_DIRLIST 0\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_PICOSDK\n#if !defined(MG_ENABLE_LWIP) || !MG_ENABLE_LWIP\n#include <errno.h>\n#endif\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <time.h>\n\n#include <pico/stdlib.h>\n#include <pico/rand.h>\nint mkdir(const char *, mode_t);\n\n#if MG_OTA == MG_OTA_PICOSDK\n#include <hardware/flash.h>\n#if PICO_RP2040\n#include <pico/bootrom.h>\n#endif\n#endif\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_RTTHREAD\n\n#include <rtthread.h>\n#include <ctype.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <sys/socket.h>\n#include <sys/select.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/types.h>\n#include <time.h>\n\n#ifndef MG_IO_SIZE\n#define MG_IO_SIZE 1460\n#endif\n\n#endif // MG_ARCH == MG_ARCH_RTTHREAD\n\n\n#if MG_ARCH == MG_ARCH_ARMCC || MG_ARCH == MG_ARCH_CMSIS_RTOS1 || \\\n    MG_ARCH == MG_ARCH_CMSIS_RTOS2\n\n#include <ctype.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stddef.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <alloca.h>\n#include <string.h>\n#include <time.h>\n#if MG_ARCH == MG_ARCH_CMSIS_RTOS1\n#include \"cmsis_os.h\"  // keep this include\n// https://developer.arm.com/documentation/ka003821/latest\nextern uint32_t rt_time_get(void);\n#elif MG_ARCH == MG_ARCH_CMSIS_RTOS2\n#include \"cmsis_os2.h\"  // keep this include\n#endif\n\n#define strdup(s) ((char *) mg_strdup(mg_str(s)).buf)\n\n#if defined(__ARMCC_VERSION)\n#define mode_t size_t\n#define mkdir(a, b) mg_mkdir(a, b)\nstatic inline int mg_mkdir(const char *path, mode_t mode) {\n  (void) path, (void) mode;\n  return -1;\n}\n#endif\n\n#if (MG_ARCH == MG_ARCH_CMSIS_RTOS1 || MG_ARCH == MG_ARCH_CMSIS_RTOS2) &&     \\\n    !defined MG_ENABLE_RL && (!defined(MG_ENABLE_LWIP) || !MG_ENABLE_LWIP) && \\\n    (!defined(MG_ENABLE_TCPIP) || !MG_ENABLE_TCPIP)\n#define MG_ENABLE_RL 1\n#ifndef MG_SOCK_LISTEN_BACKLOG_SIZE\n#define MG_SOCK_LISTEN_BACKLOG_SIZE 3\n#endif\n#endif\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_TIRTOS\n\n#include <stdlib.h>\n#include <ctype.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <string.h>\n#include <time.h>\n\n#include <serrno.h>\n#include <sys/socket.h>\n\n#include <ti/sysbios/knl/Clock.h>\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_UNIX\n\n#define _DARWIN_UNLIMITED_SELECT 1  // No limit on file descriptors\n\n#if defined(__APPLE__)\n#include <mach/mach_time.h>\n#endif\n\n#if !defined(MG_ENABLE_EPOLL) && defined(__linux__)\n#define MG_ENABLE_EPOLL 1\n#elif !defined(MG_ENABLE_POLL)\n#define MG_ENABLE_POLL 1\n#endif\n\n#include <arpa/inet.h>\n#include <ctype.h>\n#include <dirent.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <inttypes.h>\n#include <limits.h>\n#include <netdb.h>\n#include <netinet/in.h>\n#include <netinet/tcp.h>\n#include <signal.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stddef.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#if defined(MG_ENABLE_EPOLL) && MG_ENABLE_EPOLL\n#include <sys/epoll.h>\n#elif defined(MG_ENABLE_POLL) && MG_ENABLE_POLL\n#include <poll.h>\n#else\n#include <sys/select.h>\n#endif\n\n#include <sys/socket.h>\n#include <sys/stat.h>\n#include <sys/time.h>\n#include <sys/types.h>\n#include <time.h>\n#include <unistd.h>\n\n#ifndef MG_ENABLE_DIRLIST\n#define MG_ENABLE_DIRLIST 1\n#endif\n\n#ifndef MG_PATH_MAX\n#define MG_PATH_MAX FILENAME_MAX\n#endif\n\n#ifndef MG_ENABLE_POSIX_FS\n#define MG_ENABLE_POSIX_FS 1\n#endif\n\n#ifndef MG_IO_SIZE\n#define MG_IO_SIZE 16384\n#endif\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_WIN32\n\n#ifndef _CRT_RAND_S\n#define _CRT_RAND_S\n#endif\n\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n\n#ifndef _CRT_SECURE_NO_WARNINGS\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n\n#ifndef _WINSOCK_DEPRECATED_NO_WARNINGS\n#define _WINSOCK_DEPRECATED_NO_WARNINGS\n#endif\n\n#include <ctype.h>\n#include <direct.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <limits.h>\n#include <signal.h>\n#include <stdarg.h>\n#include <stddef.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <time.h>\n\n#if defined(_MSC_VER) && _MSC_VER < 1700\n#define __func__ \"\"\ntypedef __int64 int64_t;\ntypedef unsigned __int64 uint64_t;\ntypedef unsigned char uint8_t;\ntypedef char int8_t;\ntypedef unsigned short uint16_t;\ntypedef short int16_t;\ntypedef unsigned int uint32_t;\ntypedef int int32_t;\ntypedef enum { false = 0, true = 1 } bool;\n#else\n#include <stdbool.h>\n#include <stdint.h>\n#include <ws2tcpip.h>\n#endif\n\n#include <process.h>\n#include <winerror.h>\n#include <winsock2.h>\n\n// For mg_random()\n#if defined(_MSC_VER) && _MSC_VER < 1700\n#ifndef _WIN32_WINNT\n#define _WIN32_WINNT 0x400  // Let vc98 pick up wincrypt.h\n#endif\n#include <wincrypt.h>\n#pragma comment(lib, \"advapi32.lib\")\n#endif\n\n// Protect from calls like std::snprintf in app code\n// See https://github.com/cesanta/mongoose/issues/1047\n#ifndef __cplusplus\n#define snprintf _snprintf\n#define vsnprintf _vsnprintf\n#ifndef strdup  // For MSVC with _DEBUG, see #1359\n#define strdup(x) _strdup(x)\n#endif\n#endif\n\n#define MG_INVALID_SOCKET INVALID_SOCKET\n#define MG_SOCKET_TYPE SOCKET\ntypedef unsigned long nfds_t;\n#if defined(_MSC_VER)\n#pragma comment(lib, \"ws2_32.lib\")\n#ifndef alloca\n#define alloca(a) _alloca(a)\n#endif\n#endif\n#define poll(a, b, c) WSAPoll((a), (b), (c))\n#define closesocket(x) closesocket(x)\n\ntypedef int socklen_t;\n#define MG_DIRSEP '\\\\'\n\n#ifndef MG_PATH_MAX\n#define MG_PATH_MAX FILENAME_MAX\n#endif\n\n#ifndef SO_EXCLUSIVEADDRUSE\n#define SO_EXCLUSIVEADDRUSE ((int) (~SO_REUSEADDR))\n#endif\n\n#define MG_SOCK_ERR(errcode) ((errcode) < 0 ? WSAGetLastError() : 0)\n\n#define MG_SOCK_PENDING(errcode)                                            \\\n  (((errcode) < 0) &&                                                       \\\n   (WSAGetLastError() == WSAEINTR || WSAGetLastError() == WSAEINPROGRESS || \\\n    WSAGetLastError() == WSAEWOULDBLOCK))\n\n#define MG_SOCK_RESET(errcode) \\\n  (((errcode) < 0) && (WSAGetLastError() == WSAECONNRESET))\n\n#define realpath(a, b) _fullpath((b), (a), MG_PATH_MAX)\n#define sleep(x) Sleep((x) * 1000)\n#define mkdir(a, b) _mkdir(a)\n#define timegm(x) _mkgmtime(x)\n\n#ifndef S_ISDIR\n#define S_ISDIR(x) (((x) & _S_IFMT) == _S_IFDIR)\n#endif\n\n#ifndef MG_ENABLE_DIRLIST\n#define MG_ENABLE_DIRLIST 1\n#endif\n\n#ifndef SIGPIPE\n#define SIGPIPE 0\n#endif\n\n#ifndef MG_ENABLE_POSIX_FS\n#define MG_ENABLE_POSIX_FS 1\n#endif\n\n#ifndef MG_IO_SIZE\n#define MG_IO_SIZE 16384\n#endif\n\n#endif\n\n\n#if MG_ARCH == MG_ARCH_ZEPHYR\n\n#include <zephyr/kernel.h>\n\n#include <ctype.h>\n#include <errno.h>\n#include <zephyr/net/socket.h>\n#include <zephyr/posix/fcntl.h>\n#include <zephyr/posix/sys/select.h>\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/types.h>\n#include <time.h>\n\n#define MG_PUTCHAR(x) printk(\"%c\", x)\n#ifndef strdup\n#define strdup(s) ((char *) mg_strdup(mg_str(s)).buf)\n#endif\n#define strerror(x) zsock_gai_strerror(x)\n\n#ifndef FD_CLOEXEC\n#define FD_CLOEXEC 0\n#endif\n\n#ifndef F_SETFD\n#define F_SETFD 0\n#endif\n\n#define MG_ENABLE_SSI 0\n\nint rand(void);\nint sscanf(const char *, const char *, ...);\n\n#endif\n\n\n#if defined(MG_ENABLE_FREERTOS_TCP) && MG_ENABLE_FREERTOS_TCP\n\n#include <limits.h>\n#include <list.h>\n\n#include <FreeRTOS_IP.h>\n#include <FreeRTOS_Sockets.h>\n\n#define MG_SOCKET_TYPE Socket_t\n#define MG_INVALID_SOCKET FREERTOS_INVALID_SOCKET\n\n// Why FreeRTOS-TCP did not implement a clean BSD API, but its own thing\n// with FreeRTOS_ prefix, is beyond me\n#define IPPROTO_TCP FREERTOS_IPPROTO_TCP\n#define IPPROTO_UDP FREERTOS_IPPROTO_UDP\n#define AF_INET FREERTOS_AF_INET\n#define SOCK_STREAM FREERTOS_SOCK_STREAM\n#define SOCK_DGRAM FREERTOS_SOCK_DGRAM\n#define SO_BROADCAST 0\n#define SO_ERROR 0\n#define SOL_SOCKET 0\n#define SO_REUSEADDR 0\n\n#define MG_SOCK_ERR(errcode) ((errcode) < 0 ? (errcode) : 0)\n\n#define MG_SOCK_PENDING(errcode)                 \\\n  ((errcode) == -pdFREERTOS_ERRNO_EWOULDBLOCK || \\\n   (errcode) == -pdFREERTOS_ERRNO_EISCONN ||     \\\n   (errcode) == -pdFREERTOS_ERRNO_EINPROGRESS || \\\n   (errcode) == -pdFREERTOS_ERRNO_EAGAIN)\n\n#define MG_SOCK_RESET(errcode) ((errcode) == -pdFREERTOS_ERRNO_ENOTCONN)\n\n// actually only if optional timeout is enabled\n#define MG_SOCK_INTR(fd) (fd == NULL)\n\n#define sockaddr_in freertos_sockaddr\n#define sockaddr freertos_sockaddr\n#if ipFR_TCP_VERSION_MAJOR >= 4\n#define sin_addr sin_address.ulIP_IPv4\n#endif\n#define accept(a, b, c) FreeRTOS_accept((a), (b), (c))\n#define connect(a, b, c) FreeRTOS_connect((a), (b), (c))\n#define bind(a, b, c) FreeRTOS_bind((a), (b), (c))\n#define listen(a, b) FreeRTOS_listen((a), (b))\n#define socket(a, b, c) FreeRTOS_socket((a), (b), (c))\n#define send(a, b, c, d) FreeRTOS_send((a), (b), (c), (d))\n#define recv(a, b, c, d) FreeRTOS_recv((a), (b), (c), (d))\n#define setsockopt(a, b, c, d, e) FreeRTOS_setsockopt((a), (b), (c), (d), (e))\n#define sendto(a, b, c, d, e, f) FreeRTOS_sendto((a), (b), (c), (d), (e), (f))\n#define recvfrom(a, b, c, d, e, f) \\\n  FreeRTOS_recvfrom((a), (b), (c), (d), (e), (f))\n#define closesocket(x) FreeRTOS_closesocket(x)\n#define gethostbyname(x) FreeRTOS_gethostbyname(x)\n#define getsockname(a, b, c) mg_getsockname((a), (b), (c))\n#define getpeername(a, b, c) mg_getpeername((a), (b), (c))\n\nstatic inline int mg_getsockname(MG_SOCKET_TYPE fd, void *buf, socklen_t *len) {\n  (void) fd, (void) buf, (void) len;\n  return -1;\n}\n\nstatic inline int mg_getpeername(MG_SOCKET_TYPE fd, void *buf, socklen_t *len) {\n  (void) fd, (void) buf, (void) len;\n  return 0;\n}\n#endif\n\n\n#if defined(MG_ENABLE_LWIP) && MG_ENABLE_LWIP\n\n#if defined(__GNUC__) && !defined(__ARMCC_VERSION)\n#include <sys/stat.h>\n#endif\n\nstruct timeval;\n\n#include <lwip/sockets.h>\n\n#if !LWIP_TIMEVAL_PRIVATE\n#if defined(__GNUC__) && !defined(__ARMCC_VERSION) // armclang sets both\n#include <sys/time.h>\n#else\nstruct timeval {\n  time_t tv_sec;\n  long tv_usec;\n};\n#endif\n#endif\n\n#if LWIP_SOCKET != 1\n// Sockets support disabled in LWIP by default\n#error Set LWIP_SOCKET variable to 1 (in lwipopts.h)\n#endif\n#endif\n\n\n#if defined(MG_ENABLE_RL) && MG_ENABLE_RL\n#include <rl_net.h>\n\n#define closesocket(x) closesocket(x)\n\n#define TCP_NODELAY SO_KEEPALIVE\n\n#define MG_SOCK_ERR(errcode) ((errcode) < 0 ? (errcode) : 0)\n\n#define MG_SOCK_PENDING(errcode)                                \\\n  ((errcode) == BSD_EWOULDBLOCK || (errcode) == BSD_EALREADY || \\\n   (errcode) == BSD_EINPROGRESS)\n\n#define MG_SOCK_RESET(errcode) \\\n  ((errcode) == BSD_ECONNABORTED || (errcode) == BSD_ECONNRESET)\n\n// In blocking mode, which is enabled by default, accept() waits for a\n// connection request. In non blocking mode, you must call accept()\n// again if the error code BSD_EWOULDBLOCK is returned.\n#define MG_SOCK_INTR(fd) (fd == BSD_EWOULDBLOCK)\n\n#define socklen_t int\n#endif\n\n\n#ifndef MG_ENABLE_LOG\n#define MG_ENABLE_LOG 1\n#endif\n\n#ifndef MG_ENABLE_CUSTOM_LOG\n#define MG_ENABLE_CUSTOM_LOG 0  // Let user define their own MG_LOG\n#endif\n\n#ifndef MG_ENABLE_TCPIP\n#define MG_ENABLE_TCPIP 0  // Mongoose built-in network stack\n#endif\n\n#ifndef MG_ENABLE_LWIP\n#define MG_ENABLE_LWIP 0  // lWIP network stack\n#endif\n\n#ifndef MG_ENABLE_FREERTOS_TCP\n#define MG_ENABLE_FREERTOS_TCP 0  // Amazon FreeRTOS-TCP network stack\n#endif\n\n#ifndef MG_ENABLE_RL\n#define MG_ENABLE_RL 0  // ARM MDK network stack\n#endif\n\n#ifndef MG_ENABLE_SOCKET\n#define MG_ENABLE_SOCKET !MG_ENABLE_TCPIP\n#endif\n\n#ifndef MG_ENABLE_POLL\n#define MG_ENABLE_POLL 0\n#endif\n\n#ifndef MG_ENABLE_EPOLL\n#define MG_ENABLE_EPOLL 0\n#endif\n\n#ifndef MG_ENABLE_FATFS\n#define MG_ENABLE_FATFS 0\n#endif\n\n#ifndef MG_ENABLE_SSI\n#define MG_ENABLE_SSI 0\n#endif\n\n#ifndef MG_ENABLE_IPV6\n#define MG_ENABLE_IPV6 0\n#endif\n\n#ifndef MG_IPV6_V6ONLY\n#define MG_IPV6_V6ONLY 0  // IPv6 socket binds only to V6, not V4 address\n#endif\n\n#ifndef MG_ENABLE_MD5\n#define MG_ENABLE_MD5 1\n#endif\n\n// Set MG_ENABLE_WINSOCK=0 for Win32 builds with external IP stack (like LWIP)\n#ifndef MG_ENABLE_WINSOCK\n#define MG_ENABLE_WINSOCK 1\n#endif\n\n#ifndef MG_ENABLE_DIRLIST\n#define MG_ENABLE_DIRLIST 0\n#endif\n\n#ifndef MG_ENABLE_CUSTOM_RANDOM\n#define MG_ENABLE_CUSTOM_RANDOM 0\n#endif\n\n#ifndef MG_ENABLE_CUSTOM_MILLIS\n#define MG_ENABLE_CUSTOM_MILLIS 0\n#endif\n\n#ifndef MG_ENABLE_PACKED_FS\n#define MG_ENABLE_PACKED_FS 0\n#endif\n\n#ifndef MG_ENABLE_ASSERT\n#define MG_ENABLE_ASSERT 0\n#endif\n\n#ifndef MG_IO_SIZE\n#define MG_IO_SIZE 512  // Granularity of the send/recv IO buffer growth\n#endif\n\n#ifndef MG_MAX_RECV_SIZE\n#define MG_MAX_RECV_SIZE (3UL * 1024UL * 1024UL)  // Maximum recv IO buffer size\n#endif\n\n#ifndef MG_DATA_SIZE\n#define MG_DATA_SIZE 32  // struct mg_connection :: data size\n#endif\n\n#ifndef MG_MAX_HTTP_HEADERS\n#define MG_MAX_HTTP_HEADERS 30\n#endif\n\n#ifndef MG_HTTP_INDEX\n#define MG_HTTP_INDEX \"index.html\"\n#endif\n\n#ifndef MG_PATH_MAX\n#ifdef PATH_MAX\n#define MG_PATH_MAX PATH_MAX\n#else\n#define MG_PATH_MAX 128\n#endif\n#endif\n\n#ifndef MG_SOCK_LISTEN_BACKLOG_SIZE\n#define MG_SOCK_LISTEN_BACKLOG_SIZE 128\n#endif\n\n#ifndef MG_DIRSEP\n#define MG_DIRSEP '/'\n#endif\n\n#ifndef MG_ENABLE_POSIX_FS\n#define MG_ENABLE_POSIX_FS 0\n#endif\n\n#ifndef MG_INVALID_SOCKET\n#define MG_INVALID_SOCKET (-1)\n#endif\n\n#ifndef MG_SOCKET_TYPE\n#define MG_SOCKET_TYPE int\n#endif\n\n#ifndef MG_SOCKET_ERRNO\n#define MG_SOCKET_ERRNO errno\n#endif\n\n#if MG_ENABLE_EPOLL\n#define MG_EPOLL_ADD(c)                                                    \\\n  do {                                                                     \\\n    struct epoll_event ev = {EPOLLIN | EPOLLERR | EPOLLHUP, {c}};          \\\n    epoll_ctl(c->mgr->epoll_fd, EPOLL_CTL_ADD, (int) (size_t) c->fd, &ev); \\\n  } while (0)\n#define MG_EPOLL_MOD(c, wr)                                                \\\n  do {                                                                     \\\n    struct epoll_event ev = {EPOLLIN | EPOLLERR | EPOLLHUP, {c}};          \\\n    if (wr) ev.events |= EPOLLOUT;                                         \\\n    epoll_ctl(c->mgr->epoll_fd, EPOLL_CTL_MOD, (int) (size_t) c->fd, &ev); \\\n  } while (0)\n#else\n#define MG_EPOLL_ADD(c)\n#define MG_EPOLL_MOD(c, wr)\n#endif\n\n#ifndef MG_ENABLE_PROFILE\n#define MG_ENABLE_PROFILE 0\n#endif\n\n#ifndef MG_ENABLE_TCPIP_DRIVER_INIT    // mg_mgr_init() will also initialize\n#define MG_ENABLE_TCPIP_DRIVER_INIT 1  // enabled built-in driver for\n#endif                                 // Mongoose built-in network stack\n\n#ifndef MG_TCPIP_IP                      // e.g. MG_IPV4(192, 168, 0, 223)\n#define MG_TCPIP_IP MG_IPV4(0, 0, 0, 0)  // Default is 0.0.0.0 (DHCP)\n#endif\n\n#ifndef MG_TCPIP_MASK\n#define MG_TCPIP_MASK MG_IPV4(0, 0, 0, 0)  // Default is 0.0.0.0 (DHCP)\n#endif\n\n#ifndef MG_TCPIP_GW\n#define MG_TCPIP_GW MG_IPV4(0, 0, 0, 0)  // Default is 0.0.0.0 (DHCP)\n#endif\n\n#ifndef MG_SET_MAC_ADDRESS\n#define MG_SET_MAC_ADDRESS(mac)\n#endif\n\n#ifndef MG_SET_WIFI_CREDS\n#define MG_SET_WIFI_CREDS(ssid, pass)\n#endif\n\n#ifndef MG_ENABLE_TCPIP_PRINT_DEBUG_STATS\n#define MG_ENABLE_TCPIP_PRINT_DEBUG_STATS 0\n#endif\n\n\n\n\n// Describes an arbitrary chunk of memory\nstruct mg_str {\n  char *buf;   // String data\n  size_t len;  // String length\n};\n\n// Using macro to avoid shadowing C++ struct constructor, see #1298\n#define mg_str(s) mg_str_s(s)\n\nstruct mg_str mg_str(const char *s);\nstruct mg_str mg_str_n(const char *s, size_t n);\nint mg_casecmp(const char *s1, const char *s2);\nint mg_strcmp(const struct mg_str str1, const struct mg_str str2);\nint mg_strcasecmp(const struct mg_str str1, const struct mg_str str2);\nstruct mg_str mg_strdup(const struct mg_str s);\nbool mg_match(struct mg_str str, struct mg_str pattern, struct mg_str *caps);\nbool mg_span(struct mg_str s, struct mg_str *a, struct mg_str *b, char delim);\n\nbool mg_str_to_num(struct mg_str, int base, void *val, size_t val_len);\n\n\n\n\n// Single producer, single consumer non-blocking queue\n\nstruct mg_queue {\n  char *buf;\n  size_t size;\n  volatile size_t tail;\n  volatile size_t head;\n};\n\nvoid mg_queue_init(struct mg_queue *, char *, size_t);        // Init queue\nsize_t mg_queue_book(struct mg_queue *, char **buf, size_t);  // Reserve space\nvoid mg_queue_add(struct mg_queue *, size_t);                 // Add new message\nsize_t mg_queue_next(struct mg_queue *, char **);  // Get oldest message\nvoid mg_queue_del(struct mg_queue *, size_t);      // Delete oldest message\n\n\n\n\ntypedef void (*mg_pfn_t)(char, void *);                  // Output function\ntypedef size_t (*mg_pm_t)(mg_pfn_t, void *, va_list *);  // %M printer\n\nsize_t mg_vxprintf(void (*)(char, void *), void *, const char *fmt, va_list *);\nsize_t mg_xprintf(void (*fn)(char, void *), void *, const char *fmt, ...);\n\n\n\n\n\n\n// Convenience wrappers around mg_xprintf\nsize_t mg_vsnprintf(char *buf, size_t len, const char *fmt, va_list *ap);\nsize_t mg_snprintf(char *, size_t, const char *fmt, ...);\nchar *mg_vmprintf(const char *fmt, va_list *ap);\nchar *mg_mprintf(const char *fmt, ...);\nsize_t mg_queue_vprintf(struct mg_queue *, const char *fmt, va_list *);\nsize_t mg_queue_printf(struct mg_queue *, const char *fmt, ...);\n\n// %M print helper functions\nsize_t mg_print_base64(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_esc(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_hex(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_ip(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_ip_port(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_ip4(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_ip6(void (*out)(char, void *), void *arg, va_list *ap);\nsize_t mg_print_mac(void (*out)(char, void *), void *arg, va_list *ap);\n\n// Various output functions\nvoid mg_pfn_iobuf(char ch, void *param);  // param: struct mg_iobuf *\nvoid mg_pfn_stdout(char c, void *param);  // param: ignored\n\n// A helper macro for printing JSON: mg_snprintf(buf, len, \"%m\", MG_ESC(\"hi\"))\n#define MG_ESC(str) mg_print_esc, 0, (str)\n\n\n\n\n\n\nenum { MG_LL_NONE, MG_LL_ERROR, MG_LL_INFO, MG_LL_DEBUG, MG_LL_VERBOSE };\nextern int mg_log_level;  // Current log level, one of MG_LL_*\n\nvoid mg_log(const char *fmt, ...);\nvoid mg_log_prefix(int ll, const char *file, int line, const char *fname);\n// bool mg_log2(int ll, const char *file, int line, const char *fmt, ...);\nvoid mg_hexdump(const void *buf, size_t len);\nvoid mg_log_set_fn(mg_pfn_t fn, void *param);\n\n#define mg_log_set(level_) mg_log_level = (level_)\n\n#if MG_ENABLE_LOG\n#define MG_LOG(level, args)                                 \\\n  do {                                                      \\\n    if ((level) <= mg_log_level) {                          \\\n      mg_log_prefix((level), __FILE__, __LINE__, __func__); \\\n      mg_log args;                                          \\\n    }                                                       \\\n  } while (0)\n#else\n#define MG_LOG(level, args) \\\n  do {                      \\\n    if (0) mg_log args;     \\\n  } while (0)\n#endif\n\n#define MG_ERROR(args) MG_LOG(MG_LL_ERROR, args)\n#define MG_INFO(args) MG_LOG(MG_LL_INFO, args)\n#define MG_DEBUG(args) MG_LOG(MG_LL_DEBUG, args)\n#define MG_VERBOSE(args) MG_LOG(MG_LL_VERBOSE, args)\n\n\n\n\nstruct mg_timer {\n  unsigned long id;         // Timer ID\n  uint64_t period_ms;       // Timer period in milliseconds\n  uint64_t expire;          // Expiration timestamp in milliseconds\n  unsigned flags;           // Possible flags values below\n#define MG_TIMER_ONCE 0     // Call function once\n#define MG_TIMER_REPEAT 1   // Call function periodically\n#define MG_TIMER_RUN_NOW 2  // Call immediately when timer is set\n  void (*fn)(void *);       // Function to call\n  void *arg;                // Function argument\n  struct mg_timer *next;    // Linkage\n};\n\nvoid mg_timer_init(struct mg_timer **head, struct mg_timer *timer,\n                   uint64_t milliseconds, unsigned flags, void (*fn)(void *),\n                   void *arg);\nvoid mg_timer_free(struct mg_timer **head, struct mg_timer *);\nvoid mg_timer_poll(struct mg_timer **head, uint64_t new_ms);\nbool mg_timer_expired(uint64_t *expiration, uint64_t period, uint64_t now);\n\n\n\n\n\nenum { MG_FS_READ = 1, MG_FS_WRITE = 2, MG_FS_DIR = 4 };\n\n// Filesystem API functions\n// st() returns MG_FS_* flags and populates file size and modification time\n// ls() calls fn() for every directory entry, allowing to list a directory\n//\n// NOTE: UNIX-style shorthand names for the API functions are deliberately\n// chosen to avoid conflicts with some libraries that make macros for e.g.\n// stat(), write(), read() calls.\nstruct mg_fs {\n  int (*st)(const char *path, size_t *size, time_t *mtime);  // stat file\n  void (*ls)(const char *path, void (*fn)(const char *, void *),\n             void *);  // List directory entries: call fn(file_name, fn_data)\n                       // for each directory entry\n  void *(*op)(const char *path, int flags);             // Open file\n  void (*cl)(void *fd);                                 // Close file\n  size_t (*rd)(void *fd, void *buf, size_t len);        // Read file\n  size_t (*wr)(void *fd, const void *buf, size_t len);  // Write file\n  size_t (*sk)(void *fd, size_t offset);                // Set file position\n  bool (*mv)(const char *from, const char *to);         // Rename file\n  bool (*rm)(const char *path);                         // Delete file\n  bool (*mkd)(const char *path);                        // Create directory\n};\n\nextern struct mg_fs mg_fs_posix;   // POSIX open/close/read/write/seek\nextern struct mg_fs mg_fs_packed;  // Packed FS, see examples/device-dashboard\nextern struct mg_fs mg_fs_fat;     // FAT FS\n\n// File descriptor\nstruct mg_fd {\n  void *fd;\n  struct mg_fs *fs;\n};\n\nstruct mg_fd *mg_fs_open(struct mg_fs *fs, const char *path, int flags);\nvoid mg_fs_close(struct mg_fd *fd);\nbool mg_fs_ls(struct mg_fs *fs, const char *path, char *buf, size_t len);\nstruct mg_str mg_file_read(struct mg_fs *fs, const char *path);\nbool mg_file_write(struct mg_fs *fs, const char *path, const void *, size_t);\nbool mg_file_printf(struct mg_fs *fs, const char *path, const char *fmt, ...);\n\n// Packed API\nconst char *mg_unpack(const char *path, size_t *size, time_t *mtime);\nconst char *mg_unlist(size_t no);             // Get no'th packed filename\nstruct mg_str mg_unpacked(const char *path);  // Packed file as mg_str\n\n\n\n\n\n\n\n#if MG_ENABLE_ASSERT\n#include <assert.h>\n#elif !defined(assert)\n#define assert(x)\n#endif\n\nvoid mg_bzero(volatile unsigned char *buf, size_t len);\nbool mg_random(void *buf, size_t len);\nchar *mg_random_str(char *buf, size_t len);\nuint16_t mg_ntohs(uint16_t net);\nuint32_t mg_ntohl(uint32_t net);\nuint32_t mg_crc32(uint32_t crc, const char *buf, size_t len);\nuint64_t mg_millis(void);  // Return milliseconds since boot\nbool mg_path_is_sane(const struct mg_str path);\n\n#define mg_htons(x) mg_ntohs(x)\n#define mg_htonl(x) mg_ntohl(x)\n\n#define MG_U32(a, b, c, d)                                           \\\n  (((uint32_t) ((a) & 255) << 24) | ((uint32_t) ((b) & 255) << 16) | \\\n   ((uint32_t) ((c) & 255) << 8) | (uint32_t) ((d) & 255))\n\n#define MG_IPV4(a, b, c, d) mg_htonl(MG_U32(a, b, c, d))\n\n// For printing IPv4 addresses: printf(\"%d.%d.%d.%d\\n\", MG_IPADDR_PARTS(&ip))\n#define MG_U8P(ADDR) ((uint8_t *) (ADDR))\n#define MG_IPADDR_PARTS(ADDR) \\\n  MG_U8P(ADDR)[0], MG_U8P(ADDR)[1], MG_U8P(ADDR)[2], MG_U8P(ADDR)[3]\n\n#define MG_LOAD_BE16(p) ((uint16_t) ((MG_U8P(p)[0] << 8U) | MG_U8P(p)[1]))\n#define MG_LOAD_BE24(p) \\\n  ((uint32_t) ((MG_U8P(p)[0] << 16U) | (MG_U8P(p)[1] << 8U) | MG_U8P(p)[2]))\n#define MG_STORE_BE16(p, n)           \\\n  do {                                \\\n    MG_U8P(p)[0] = ((n) >> 8U) & 255; \\\n    MG_U8P(p)[1] = (n) &255;          \\\n  } while (0)\n\n#define MG_REG(x) ((volatile uint32_t *) (x))[0]\n#define MG_BIT(x) (((uint32_t) 1U) << (x))\n#define MG_SET_BITS(R, CLRMASK, SETMASK) (R) = ((R) & ~(CLRMASK)) | (SETMASK)\n\n#define MG_ROUND_UP(x, a) ((a) == 0 ? (x) : ((((x) + (a) -1) / (a)) * (a)))\n#define MG_ROUND_DOWN(x, a) ((a) == 0 ? (x) : (((x) / (a)) * (a)))\n\n#if defined(__GNUC__)\n#define MG_ARM_DISABLE_IRQ() asm volatile(\"cpsid i\" : : : \"memory\")\n#define MG_ARM_ENABLE_IRQ() asm volatile(\"cpsie i\" : : : \"memory\")\n#elif defined(__CCRH__)\n#define MG_RH850_DISABLE_IRQ() __DI()\n#define MG_RH850_ENABLE_IRQ() __EI()\n#else\n#define MG_ARM_DISABLE_IRQ()\n#define MG_ARM_ENABLE_IRQ()\n#endif\n\n#if defined(__CC_ARM)\n#define MG_DSB() __dsb(0xf)\n#elif defined(__ARMCC_VERSION)\n#define MG_DSB() __builtin_arm_dsb(0xf)\n#elif defined(__GNUC__) && defined(__arm__) && defined(__thumb__)\n#define MG_DSB() asm(\"DSB 0xf\")\n#elif defined(__ICCARM__)\n#define MG_DSB() __iar_builtin_DSB()\n#else\n#define MG_DSB()\n#endif\n\nstruct mg_addr;\nint mg_check_ip_acl(struct mg_str acl, struct mg_addr *remote_ip);\n\n// Linked list management macros\n#define LIST_ADD_HEAD(type_, head_, elem_) \\\n  do {                                     \\\n    (elem_)->next = (*head_);              \\\n    *(head_) = (elem_);                    \\\n  } while (0)\n\n#define LIST_ADD_TAIL(type_, head_, elem_) \\\n  do {                                     \\\n    type_ **h = head_;                     \\\n    while (*h != NULL) h = &(*h)->next;    \\\n    *h = (elem_);                          \\\n  } while (0)\n\n#define LIST_DELETE(type_, head_, elem_)   \\\n  do {                                     \\\n    type_ **h = head_;                     \\\n    while (*h != (elem_)) h = &(*h)->next; \\\n    *h = (elem_)->next;                    \\\n  } while (0)\n\n\n\nunsigned short mg_url_port(const char *url);\nint mg_url_is_ssl(const char *url);\nstruct mg_str mg_url_host(const char *url);\nstruct mg_str mg_url_user(const char *url);\nstruct mg_str mg_url_pass(const char *url);\nconst char *mg_url_uri(const char *url);\n\n\n\n\nstruct mg_iobuf {\n  unsigned char *buf;  // Pointer to stored data\n  size_t size;         // Total size available\n  size_t len;          // Current number of bytes\n  size_t align;        // Alignment during allocation\n};\n\nint mg_iobuf_init(struct mg_iobuf *, size_t, size_t);\nint mg_iobuf_resize(struct mg_iobuf *, size_t);\nvoid mg_iobuf_free(struct mg_iobuf *);\nsize_t mg_iobuf_add(struct mg_iobuf *, size_t, const void *, size_t);\nsize_t mg_iobuf_del(struct mg_iobuf *, size_t ofs, size_t len);\n\n\nsize_t mg_base64_update(unsigned char input_byte, char *buf, size_t len);\nsize_t mg_base64_final(char *buf, size_t len);\nsize_t mg_base64_encode(const unsigned char *p, size_t n, char *buf, size_t);\nsize_t mg_base64_decode(const char *src, size_t n, char *dst, size_t);\n\n\n\n\ntypedef struct {\n  uint32_t buf[4];\n  uint32_t bits[2];\n  unsigned char in[64];\n} mg_md5_ctx;\n\nvoid mg_md5_init(mg_md5_ctx *c);\nvoid mg_md5_update(mg_md5_ctx *c, const unsigned char *data, size_t len);\nvoid mg_md5_final(mg_md5_ctx *c, unsigned char[16]);\n\n\n\n\ntypedef struct {\n  uint32_t state[5];\n  uint32_t count[2];\n  unsigned char buffer[64];\n} mg_sha1_ctx;\n\nvoid mg_sha1_init(mg_sha1_ctx *);\nvoid mg_sha1_update(mg_sha1_ctx *, const unsigned char *data, size_t len);\nvoid mg_sha1_final(unsigned char digest[20], mg_sha1_ctx *);\n// https://github.com/B-Con/crypto-algorithms\n// Author:     Brad Conte (brad AT bradconte.com)\n// Disclaimer: This code is presented \"as is\" without any guarantees.\n// Details:    Defines the API for the corresponding SHA1 implementation.\n// Copyright:  public domain\n\n\n\n\n\ntypedef struct {\n  uint32_t state[8];\n  uint64_t bits;\n  uint32_t len;\n  unsigned char buffer[64];\n} mg_sha256_ctx;\n\nvoid mg_sha256_init(mg_sha256_ctx *);\nvoid mg_sha256_update(mg_sha256_ctx *, const unsigned char *data, size_t len);\nvoid mg_sha256_final(unsigned char digest[32], mg_sha256_ctx *);\nvoid mg_hmac_sha256(uint8_t dst[32], uint8_t *key, size_t keysz, uint8_t *data,\n                    size_t datasz);\n#ifndef TLS_X15519_H\n#define TLS_X15519_H\n\n\n\n#define X25519_BYTES 32\nextern const uint8_t X25519_BASE_POINT[X25519_BYTES];\n\nint mg_tls_x25519(uint8_t out[X25519_BYTES], const uint8_t scalar[X25519_BYTES],\n                  const uint8_t x1[X25519_BYTES], int clamp);\n\n\n#endif /* TLS_X15519_H */\n/******************************************************************************\n *\n * THIS SOURCE CODE IS HEREBY PLACED INTO THE PUBLIC DOMAIN FOR THE GOOD OF ALL\n *\n * This is a simple and straightforward implementation of AES-GCM authenticated\n * encryption. The focus of this work was correctness & accuracy. It is written\n * in straight 'C' without any particular focus upon optimization or speed. It\n * should be endian (memory byte order) neutral since the few places that care\n * are handled explicitly.\n *\n * This implementation of AES-GCM was created by Steven M. Gibson of GRC.com.\n *\n * It is intended for general purpose use, but was written in support of GRC's\n * reference implementation of the SQRL (Secure Quick Reliable Login) client.\n *\n * See:    http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf\n *         http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/ \\\n *         gcm/gcm-revised-spec.pdf\n *\n * NO COPYRIGHT IS CLAIMED IN THIS WORK, HOWEVER, NEITHER IS ANY WARRANTY MADE\n * REGARDING ITS FITNESS FOR ANY PARTICULAR PURPOSE. USE IT AT YOUR OWN RISK.\n *\n *******************************************************************************/\n#ifndef TLS_AES128_H\n#define TLS_AES128_H\n\n/******************************************************************************\n *  AES_CONTEXT : cipher context / holds inter-call data\n ******************************************************************************/\ntypedef struct {\n  int mode;          // 1 for Encryption, 0 for Decryption\n  int rounds;        // keysize-based rounds count\n  uint32_t *rk;      // pointer to current round key\n  uint32_t buf[68];  // key expansion buffer\n} aes_context;\n\n\n#define GCM_AUTH_FAILURE 0x55555555  // authentication failure\n\n/******************************************************************************\n *  GCM_CONTEXT : MUST be called once before ANY use of this library\n ******************************************************************************/\nint mg_gcm_initialize(void);\n\n//\n//  aes-gcm.h\n//  MKo\n//\n//  Created by Markus Kosmal on 20/11/14.\n//\n//\nint mg_aes_gcm_encrypt(unsigned char *output, const unsigned char *input,\n                       size_t input_length, const unsigned char *key,\n                       const size_t key_len, const unsigned char *iv,\n                       const size_t iv_len, unsigned char *aead,\n                       size_t aead_len, unsigned char *tag,\n                       const size_t tag_len);\n\nint mg_aes_gcm_decrypt(unsigned char *output, const unsigned char *input,\n                       size_t input_length, const unsigned char *key,\n                       const size_t key_len, const unsigned char *iv,\n                       const size_t iv_len);\n\n#endif /* TLS_AES128_H */\n\n// End of aes128 PD\n\n\n\n#define MG_UECC_SUPPORTS_secp256r1 1\n/* Copyright 2014, Kenneth MacKay. Licensed under the BSD 2-clause license. */\n\n#ifndef _UECC_H_\n#define _UECC_H_\n\n/* Platform selection options.\nIf MG_UECC_PLATFORM is not defined, the code will try to guess it based on\ncompiler macros. Possible values for MG_UECC_PLATFORM are defined below: */\n#define mg_uecc_arch_other 0\n#define mg_uecc_x86 1\n#define mg_uecc_x86_64 2\n#define mg_uecc_arm 3\n#define mg_uecc_arm_thumb 4\n#define mg_uecc_arm_thumb2 5\n#define mg_uecc_arm64 6\n#define mg_uecc_avr 7\n\n/* If desired, you can define MG_UECC_WORD_SIZE as appropriate for your platform\n(1, 4, or 8 bytes). If MG_UECC_WORD_SIZE is not explicitly defined then it will\nbe automatically set based on your platform. */\n\n/* Optimization level; trade speed for code size.\n   Larger values produce code that is faster but larger.\n   Currently supported values are 0 - 4; 0 is unusably slow for most\n   applications. Optimization level 4 currently only has an effect ARM platforms\n   where more than one curve is enabled. */\n#ifndef MG_UECC_OPTIMIZATION_LEVEL\n#define MG_UECC_OPTIMIZATION_LEVEL 2\n#endif\n\n/* MG_UECC_SQUARE_FUNC - If enabled (defined as nonzero), this will cause a\nspecific function to be used for (scalar) squaring instead of the generic\nmultiplication function. This can make things faster somewhat faster, but\nincreases the code size. */\n#ifndef MG_UECC_SQUARE_FUNC\n#define MG_UECC_SQUARE_FUNC 0\n#endif\n\n/* MG_UECC_VLI_NATIVE_LITTLE_ENDIAN - If enabled (defined as nonzero), this will\nswitch to native little-endian format for *all* arrays passed in and out of the\npublic API. This includes public and private keys, shared secrets, signatures\nand message hashes. Using this switch reduces the amount of call stack memory\nused by uECC, since less intermediate translations are required. Note that this\nwill *only* work on native little-endian processors and it will treat the\nuint8_t arrays passed into the public API as word arrays, therefore requiring\nthe provided byte arrays to be word aligned on architectures that do not support\nunaligned accesses. IMPORTANT: Keys and signatures generated with\nMG_UECC_VLI_NATIVE_LITTLE_ENDIAN=1 are incompatible with keys and signatures\ngenerated with MG_UECC_VLI_NATIVE_LITTLE_ENDIAN=0; all parties must use the same\nendianness. */\n#ifndef MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n#define MG_UECC_VLI_NATIVE_LITTLE_ENDIAN 0\n#endif\n\n/* Curve support selection. Set to 0 to remove that curve. */\n#ifndef MG_UECC_SUPPORTS_secp160r1\n#define MG_UECC_SUPPORTS_secp160r1 0\n#endif\n#ifndef MG_UECC_SUPPORTS_secp192r1\n#define MG_UECC_SUPPORTS_secp192r1 0\n#endif\n#ifndef MG_UECC_SUPPORTS_secp224r1\n#define MG_UECC_SUPPORTS_secp224r1 0\n#endif\n#ifndef MG_UECC_SUPPORTS_secp256r1\n#define MG_UECC_SUPPORTS_secp256r1 1\n#endif\n#ifndef MG_UECC_SUPPORTS_secp256k1\n#define MG_UECC_SUPPORTS_secp256k1 0\n#endif\n\n/* Specifies whether compressed point format is supported.\n   Set to 0 to disable point compression/decompression functions. */\n#ifndef MG_UECC_SUPPORT_COMPRESSED_POINT\n#define MG_UECC_SUPPORT_COMPRESSED_POINT 1\n#endif\n\nstruct MG_UECC_Curve_t;\ntypedef const struct MG_UECC_Curve_t *MG_UECC_Curve;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if MG_UECC_SUPPORTS_secp160r1\nMG_UECC_Curve mg_uecc_secp160r1(void);\n#endif\n#if MG_UECC_SUPPORTS_secp192r1\nMG_UECC_Curve mg_uecc_secp192r1(void);\n#endif\n#if MG_UECC_SUPPORTS_secp224r1\nMG_UECC_Curve mg_uecc_secp224r1(void);\n#endif\n#if MG_UECC_SUPPORTS_secp256r1\nMG_UECC_Curve mg_uecc_secp256r1(void);\n#endif\n#if MG_UECC_SUPPORTS_secp256k1\nMG_UECC_Curve mg_uecc_secp256k1(void);\n#endif\n\n/* MG_UECC_RNG_Function type\nThe RNG function should fill 'size' random bytes into 'dest'. It should return 1\nif 'dest' was filled with random data, or 0 if the random data could not be\ngenerated. The filled-in values should be either truly random, or from a\ncryptographically-secure PRNG.\n\nA correctly functioning RNG function must be set (using mg_uecc_set_rng())\nbefore calling mg_uecc_make_key() or mg_uecc_sign().\n\nSetting a correctly functioning RNG function improves the resistance to\nside-channel attacks for mg_uecc_shared_secret() and\nmg_uecc_sign_deterministic().\n\nA correct RNG function is set by default when building for Windows, Linux, or OS\nX. If you are building on another POSIX-compliant system that supports\n/dev/random or /dev/urandom, you can define MG_UECC_POSIX to use the predefined\nRNG. For embedded platforms there is no predefined RNG function; you must\nprovide your own.\n*/\ntypedef int (*MG_UECC_RNG_Function)(uint8_t *dest, unsigned size);\n\n/* mg_uecc_set_rng() function.\nSet the function that will be used to generate random bytes. The RNG function\nshould return 1 if the random data was generated, or 0 if the random data could\nnot be generated.\n\nOn platforms where there is no predefined RNG function (eg embedded platforms),\nthis must be called before mg_uecc_make_key() or mg_uecc_sign() are used.\n\nInputs:\n    rng_function - The function that will be used to generate random bytes.\n*/\nvoid mg_uecc_set_rng(MG_UECC_RNG_Function rng_function);\n\n/* mg_uecc_get_rng() function.\n\nReturns the function that will be used to generate random bytes.\n*/\nMG_UECC_RNG_Function mg_uecc_get_rng(void);\n\n/* mg_uecc_curve_private_key_size() function.\n\nReturns the size of a private key for the curve in bytes.\n*/\nint mg_uecc_curve_private_key_size(MG_UECC_Curve curve);\n\n/* mg_uecc_curve_public_key_size() function.\n\nReturns the size of a public key for the curve in bytes.\n*/\nint mg_uecc_curve_public_key_size(MG_UECC_Curve curve);\n\n/* mg_uecc_make_key() function.\nCreate a public/private key pair.\n\nOutputs:\n    public_key  - Will be filled in with the public key. Must be at least 2 *\nthe curve size (in bytes) long. For example, if the curve is secp256r1,\npublic_key must be 64 bytes long. private_key - Will be filled in with the\nprivate key. Must be as long as the curve order; this is typically the same as\nthe curve size, except for secp160r1. For example, if the curve is secp256r1,\nprivate_key must be 32 bytes long.\n\n                  For secp160r1, private_key must be 21 bytes long! Note that\nthe first byte will almost always be 0 (there is about a 1 in 2^80 chance of it\nbeing non-zero).\n\nReturns 1 if the key pair was generated successfully, 0 if an error occurred.\n*/\nint mg_uecc_make_key(uint8_t *public_key, uint8_t *private_key,\n                     MG_UECC_Curve curve);\n\n/* mg_uecc_shared_secret() function.\nCompute a shared secret given your secret key and someone else's public key. If\nthe public key is not from a trusted source and has not been previously\nverified, you should verify it first using mg_uecc_valid_public_key(). Note: It\nis recommended that you hash the result of mg_uecc_shared_secret() before using\nit for symmetric encryption or HMAC.\n\nInputs:\n    public_key  - The public key of the remote party.\n    private_key - Your private key.\n\nOutputs:\n    secret - Will be filled in with the shared secret value. Must be the same\nsize as the curve size; for example, if the curve is secp256r1, secret must be\n32 bytes long.\n\nReturns 1 if the shared secret was generated successfully, 0 if an error\noccurred.\n*/\nint mg_uecc_shared_secret(const uint8_t *public_key, const uint8_t *private_key,\n                          uint8_t *secret, MG_UECC_Curve curve);\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n/* mg_uecc_compress() function.\nCompress a public key.\n\nInputs:\n    public_key - The public key to compress.\n\nOutputs:\n    compressed - Will be filled in with the compressed public key. Must be at\nleast (curve size + 1) bytes long; for example, if the curve is secp256r1,\n                 compressed must be 33 bytes long.\n*/\nvoid mg_uecc_compress(const uint8_t *public_key, uint8_t *compressed,\n                      MG_UECC_Curve curve);\n\n/* mg_uecc_decompress() function.\nDecompress a compressed public key.\n\nInputs:\n    compressed - The compressed public key.\n\nOutputs:\n    public_key - Will be filled in with the decompressed public key.\n*/\nvoid mg_uecc_decompress(const uint8_t *compressed, uint8_t *public_key,\n                        MG_UECC_Curve curve);\n#endif /* MG_UECC_SUPPORT_COMPRESSED_POINT */\n\n/* mg_uecc_valid_public_key() function.\nCheck to see if a public key is valid.\n\nNote that you are not required to check for a valid public key before using any\nother uECC functions. However, you may wish to avoid spending CPU time computing\na shared secret or verifying a signature using an invalid public key.\n\nInputs:\n    public_key - The public key to check.\n\nReturns 1 if the public key is valid, 0 if it is invalid.\n*/\nint mg_uecc_valid_public_key(const uint8_t *public_key, MG_UECC_Curve curve);\n\n/* mg_uecc_compute_public_key() function.\nCompute the corresponding public key for a private key.\n\nInputs:\n    private_key - The private key to compute the public key for\n\nOutputs:\n    public_key - Will be filled in with the corresponding public key\n\nReturns 1 if the key was computed successfully, 0 if an error occurred.\n*/\nint mg_uecc_compute_public_key(const uint8_t *private_key, uint8_t *public_key,\n                               MG_UECC_Curve curve);\n\n/* mg_uecc_sign() function.\nGenerate an ECDSA signature for a given hash value.\n\nUsage: Compute a hash of the data you wish to sign (SHA-2 is recommended) and\npass it in to this function along with your private key.\n\nInputs:\n    private_key  - Your private key.\n    message_hash - The hash of the message to sign.\n    hash_size    - The size of message_hash in bytes.\n\nOutputs:\n    signature - Will be filled in with the signature value. Must be at least 2 *\ncurve size long. For example, if the curve is secp256r1, signature must be 64\nbytes long.\n\nReturns 1 if the signature generated successfully, 0 if an error occurred.\n*/\nint mg_uecc_sign(const uint8_t *private_key, const uint8_t *message_hash,\n                 unsigned hash_size, uint8_t *signature, MG_UECC_Curve curve);\n\n/* MG_UECC_HashContext structure.\nThis is used to pass in an arbitrary hash function to\nmg_uecc_sign_deterministic(). The structure will be used for multiple hash\ncomputations; each time a new hash is computed, init_hash() will be called,\nfollowed by one or more calls to update_hash(), and finally a call to\nfinish_hash() to produce the resulting hash.\n\nThe intention is that you will create a structure that includes\nMG_UECC_HashContext followed by any hash-specific data. For example:\n\ntypedef struct SHA256_HashContext {\n    MG_UECC_HashContext uECC;\n    SHA256_CTX ctx;\n} SHA256_HashContext;\n\nvoid init_SHA256(MG_UECC_HashContext *base) {\n    SHA256_HashContext *context = (SHA256_HashContext *)base;\n    SHA256_Init(&context->ctx);\n}\n\nvoid update_SHA256(MG_UECC_HashContext *base,\n                   const uint8_t *message,\n                   unsigned message_size) {\n    SHA256_HashContext *context = (SHA256_HashContext *)base;\n    SHA256_Update(&context->ctx, message, message_size);\n}\n\nvoid finish_SHA256(MG_UECC_HashContext *base, uint8_t *hash_result) {\n    SHA256_HashContext *context = (SHA256_HashContext *)base;\n    SHA256_Final(hash_result, &context->ctx);\n}\n\n... when signing ...\n{\n    uint8_t tmp[32 + 32 + 64];\n    SHA256_HashContext ctx = {{&init_SHA256, &update_SHA256, &finish_SHA256, 64,\n32, tmp}}; mg_uecc_sign_deterministic(key, message_hash, &ctx.uECC, signature);\n}\n*/\ntypedef struct MG_UECC_HashContext {\n  void (*init_hash)(const struct MG_UECC_HashContext *context);\n  void (*update_hash)(const struct MG_UECC_HashContext *context,\n                      const uint8_t *message, unsigned message_size);\n  void (*finish_hash)(const struct MG_UECC_HashContext *context,\n                      uint8_t *hash_result);\n  unsigned\n      block_size; /* Hash function block size in bytes, eg 64 for SHA-256. */\n  unsigned\n      result_size; /* Hash function result size in bytes, eg 32 for SHA-256. */\n  uint8_t *tmp;    /* Must point to a buffer of at least (2 * result_size +\n                      block_size) bytes. */\n} MG_UECC_HashContext;\n\n/* mg_uecc_sign_deterministic() function.\nGenerate an ECDSA signature for a given hash value, using a deterministic\nalgorithm (see RFC 6979). You do not need to set the RNG using mg_uecc_set_rng()\nbefore calling this function; however, if the RNG is defined it will improve\nresistance to side-channel attacks.\n\nUsage: Compute a hash of the data you wish to sign (SHA-2 is recommended) and\npass it to this function along with your private key and a hash context. Note\nthat the message_hash does not need to be computed with the same hash function\nused by hash_context.\n\nInputs:\n    private_key  - Your private key.\n    message_hash - The hash of the message to sign.\n    hash_size    - The size of message_hash in bytes.\n    hash_context - A hash context to use.\n\nOutputs:\n    signature - Will be filled in with the signature value.\n\nReturns 1 if the signature generated successfully, 0 if an error occurred.\n*/\nint mg_uecc_sign_deterministic(const uint8_t *private_key,\n                               const uint8_t *message_hash, unsigned hash_size,\n                               const MG_UECC_HashContext *hash_context,\n                               uint8_t *signature, MG_UECC_Curve curve);\n\n/* mg_uecc_verify() function.\nVerify an ECDSA signature.\n\nUsage: Compute the hash of the signed data using the same hash as the signer and\npass it to this function along with the signer's public key and the signature\nvalues (r and s).\n\nInputs:\n    public_key   - The signer's public key.\n    message_hash - The hash of the signed data.\n    hash_size    - The size of message_hash in bytes.\n    signature    - The signature value.\n\nReturns 1 if the signature is valid, 0 if it is invalid.\n*/\nint mg_uecc_verify(const uint8_t *public_key, const uint8_t *message_hash,\n                   unsigned hash_size, const uint8_t *signature,\n                   MG_UECC_Curve curve);\n\n#ifdef __cplusplus\n} /* end of extern \"C\" */\n#endif\n\n#endif /* _UECC_H_ */\n\n/* Copyright 2015, Kenneth MacKay. Licensed under the BSD 2-clause license. */\n\n#ifndef _UECC_TYPES_H_\n#define _UECC_TYPES_H_\n\n#ifndef MG_UECC_PLATFORM\n#if defined(__AVR__) && __AVR__\n#define MG_UECC_PLATFORM mg_uecc_avr\n#elif defined(__thumb2__) || \\\n    defined(_M_ARMT) /* I think MSVC only supports Thumb-2 targets */\n#define MG_UECC_PLATFORM mg_uecc_arm_thumb2\n#elif defined(__thumb__)\n#define MG_UECC_PLATFORM mg_uecc_arm_thumb\n#elif defined(__arm__) || defined(_M_ARM)\n#define MG_UECC_PLATFORM mg_uecc_arm\n#elif defined(__aarch64__)\n#define MG_UECC_PLATFORM mg_uecc_arm64\n#elif defined(__i386__) || defined(_M_IX86) || defined(_X86_) || \\\n    defined(__I86__)\n#define MG_UECC_PLATFORM mg_uecc_x86\n#elif defined(__amd64__) || defined(_M_X64)\n#define MG_UECC_PLATFORM mg_uecc_x86_64\n#else\n#define MG_UECC_PLATFORM mg_uecc_arch_other\n#endif\n#endif\n\n#ifndef MG_UECC_ARM_USE_UMAAL\n#if (MG_UECC_PLATFORM == mg_uecc_arm) && (__ARM_ARCH >= 6)\n#define MG_UECC_ARM_USE_UMAAL 1\n#elif (MG_UECC_PLATFORM == mg_uecc_arm_thumb2) && (__ARM_ARCH >= 6) && \\\n    (!defined(__ARM_ARCH_7M__) || !__ARM_ARCH_7M__)\n#define MG_UECC_ARM_USE_UMAAL 1\n#else\n#define MG_UECC_ARM_USE_UMAAL 0\n#endif\n#endif\n\n#ifndef MG_UECC_WORD_SIZE\n#if MG_UECC_PLATFORM == mg_uecc_avr\n#define MG_UECC_WORD_SIZE 1\n#elif (MG_UECC_PLATFORM == mg_uecc_x86_64 || MG_UECC_PLATFORM == mg_uecc_arm64)\n#define MG_UECC_WORD_SIZE 8\n#else\n#define MG_UECC_WORD_SIZE 4\n#endif\n#endif\n\n#if (MG_UECC_WORD_SIZE != 1) && (MG_UECC_WORD_SIZE != 4) && \\\n    (MG_UECC_WORD_SIZE != 8)\n#error \"Unsupported value for MG_UECC_WORD_SIZE\"\n#endif\n\n#if ((MG_UECC_PLATFORM == mg_uecc_avr) && (MG_UECC_WORD_SIZE != 1))\n#pragma message(\"MG_UECC_WORD_SIZE must be 1 for AVR\")\n#undef MG_UECC_WORD_SIZE\n#define MG_UECC_WORD_SIZE 1\n#endif\n\n#if ((MG_UECC_PLATFORM == mg_uecc_arm ||         \\\n      MG_UECC_PLATFORM == mg_uecc_arm_thumb ||   \\\n      MG_UECC_PLATFORM == mg_uecc_arm_thumb2) && \\\n     (MG_UECC_WORD_SIZE != 4))\n#pragma message(\"MG_UECC_WORD_SIZE must be 4 for ARM\")\n#undef MG_UECC_WORD_SIZE\n#define MG_UECC_WORD_SIZE 4\n#endif\n\ntypedef int8_t wordcount_t;\ntypedef int16_t bitcount_t;\ntypedef int8_t cmpresult_t;\n\n#if (MG_UECC_WORD_SIZE == 1)\n\ntypedef uint8_t mg_uecc_word_t;\ntypedef uint16_t mg_uecc_dword_t;\n\n#define HIGH_BIT_SET 0x80\n#define MG_UECC_WORD_BITS 8\n#define MG_UECC_WORD_BITS_SHIFT 3\n#define MG_UECC_WORD_BITS_MASK 0x07\n\n#elif (MG_UECC_WORD_SIZE == 4)\n\ntypedef uint32_t mg_uecc_word_t;\ntypedef uint64_t mg_uecc_dword_t;\n\n#define HIGH_BIT_SET 0x80000000\n#define MG_UECC_WORD_BITS 32\n#define MG_UECC_WORD_BITS_SHIFT 5\n#define MG_UECC_WORD_BITS_MASK 0x01F\n\n#elif (MG_UECC_WORD_SIZE == 8)\n\ntypedef uint64_t mg_uecc_word_t;\n\n#define HIGH_BIT_SET 0x8000000000000000U\n#define MG_UECC_WORD_BITS 64\n#define MG_UECC_WORD_BITS_SHIFT 6\n#define MG_UECC_WORD_BITS_MASK 0x03F\n\n#endif /* MG_UECC_WORD_SIZE */\n\n#endif /* _UECC_TYPES_H_ */\n\n/* Copyright 2015, Kenneth MacKay. Licensed under the BSD 2-clause license. */\n\n#ifndef _UECC_VLI_H_\n#define _UECC_VLI_H_\n\n// \n// \n\n/* Functions for raw large-integer manipulation. These are only available\n   if uECC.c is compiled with MG_UECC_ENABLE_VLI_API defined to 1. */\n#ifndef MG_UECC_ENABLE_VLI_API\n#define MG_UECC_ENABLE_VLI_API 0\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if MG_UECC_ENABLE_VLI_API\n\nvoid mg_uecc_vli_clear(mg_uecc_word_t *vli, wordcount_t num_words);\n\n/* Constant-time comparison to zero - secure way to compare long integers */\n/* Returns 1 if vli == 0, 0 otherwise. */\nmg_uecc_word_t mg_uecc_vli_isZero(const mg_uecc_word_t *vli,\n                                  wordcount_t num_words);\n\n/* Returns nonzero if bit 'bit' of vli is set. */\nmg_uecc_word_t mg_uecc_vli_testBit(const mg_uecc_word_t *vli, bitcount_t bit);\n\n/* Counts the number of bits required to represent vli. */\nbitcount_t mg_uecc_vli_numBits(const mg_uecc_word_t *vli,\n                               const wordcount_t max_words);\n\n/* Sets dest = src. */\nvoid mg_uecc_vli_set(mg_uecc_word_t *dest, const mg_uecc_word_t *src,\n                     wordcount_t num_words);\n\n/* Constant-time comparison function - secure way to compare long integers */\n/* Returns one if left == right, zero otherwise */\nmg_uecc_word_t mg_uecc_vli_equal(const mg_uecc_word_t *left,\n                                 const mg_uecc_word_t *right,\n                                 wordcount_t num_words);\n\n/* Constant-time comparison function - secure way to compare long integers */\n/* Returns sign of left - right, in constant time. */\ncmpresult_t mg_uecc_vli_cmp(const mg_uecc_word_t *left,\n                            const mg_uecc_word_t *right, wordcount_t num_words);\n\n/* Computes vli = vli >> 1. */\nvoid mg_uecc_vli_rshift1(mg_uecc_word_t *vli, wordcount_t num_words);\n\n/* Computes result = left + right, returning carry. Can modify in place. */\nmg_uecc_word_t mg_uecc_vli_add(mg_uecc_word_t *result,\n                               const mg_uecc_word_t *left,\n                               const mg_uecc_word_t *right,\n                               wordcount_t num_words);\n\n/* Computes result = left - right, returning borrow. Can modify in place. */\nmg_uecc_word_t mg_uecc_vli_sub(mg_uecc_word_t *result,\n                               const mg_uecc_word_t *left,\n                               const mg_uecc_word_t *right,\n                               wordcount_t num_words);\n\n/* Computes result = left * right. Result must be 2 * num_words long. */\nvoid mg_uecc_vli_mult(mg_uecc_word_t *result, const mg_uecc_word_t *left,\n                      const mg_uecc_word_t *right, wordcount_t num_words);\n\n/* Computes result = left^2. Result must be 2 * num_words long. */\nvoid mg_uecc_vli_square(mg_uecc_word_t *result, const mg_uecc_word_t *left,\n                        wordcount_t num_words);\n\n/* Computes result = (left + right) % mod.\n   Assumes that left < mod and right < mod, and that result does not overlap\n   mod. */\nvoid mg_uecc_vli_modAdd(mg_uecc_word_t *result, const mg_uecc_word_t *left,\n                        const mg_uecc_word_t *right, const mg_uecc_word_t *mod,\n                        wordcount_t num_words);\n\n/* Computes result = (left - right) % mod.\n   Assumes that left < mod and right < mod, and that result does not overlap\n   mod. */\nvoid mg_uecc_vli_modSub(mg_uecc_word_t *result, const mg_uecc_word_t *left,\n                        const mg_uecc_word_t *right, const mg_uecc_word_t *mod,\n                        wordcount_t num_words);\n\n/* Computes result = product % mod, where product is 2N words long.\n   Currently only designed to work for mod == curve->p or curve_n. */\nvoid mg_uecc_vli_mmod(mg_uecc_word_t *result, mg_uecc_word_t *product,\n                      const mg_uecc_word_t *mod, wordcount_t num_words);\n\n/* Calculates result = product (mod curve->p), where product is up to\n   2 * curve->num_words long. */\nvoid mg_uecc_vli_mmod_fast(mg_uecc_word_t *result, mg_uecc_word_t *product,\n                           MG_UECC_Curve curve);\n\n/* Computes result = (left * right) % mod.\n   Currently only designed to work for mod == curve->p or curve_n. */\nvoid mg_uecc_vli_modMult(mg_uecc_word_t *result, const mg_uecc_word_t *left,\n                         const mg_uecc_word_t *right, const mg_uecc_word_t *mod,\n                         wordcount_t num_words);\n\n/* Computes result = (left * right) % curve->p. */\nvoid mg_uecc_vli_modMult_fast(mg_uecc_word_t *result,\n                              const mg_uecc_word_t *left,\n                              const mg_uecc_word_t *right, MG_UECC_Curve curve);\n\n/* Computes result = left^2 % mod.\n   Currently only designed to work for mod == curve->p or curve_n. */\nvoid mg_uecc_vli_modSquare(mg_uecc_word_t *result, const mg_uecc_word_t *left,\n                           const mg_uecc_word_t *mod, wordcount_t num_words);\n\n/* Computes result = left^2 % curve->p. */\nvoid mg_uecc_vli_modSquare_fast(mg_uecc_word_t *result,\n                                const mg_uecc_word_t *left,\n                                MG_UECC_Curve curve);\n\n/* Computes result = (1 / input) % mod.*/\nvoid mg_uecc_vli_modInv(mg_uecc_word_t *result, const mg_uecc_word_t *input,\n                        const mg_uecc_word_t *mod, wordcount_t num_words);\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n/* Calculates a = sqrt(a) (mod curve->p) */\nvoid mg_uecc_vli_mod_sqrt(mg_uecc_word_t *a, MG_UECC_Curve curve);\n#endif\n\n/* Converts an integer in uECC native format to big-endian bytes. */\nvoid mg_uecc_vli_nativeToBytes(uint8_t *bytes, int num_bytes,\n                               const mg_uecc_word_t *native);\n/* Converts big-endian bytes to an integer in uECC native format. */\nvoid mg_uecc_vli_bytesToNative(mg_uecc_word_t *native, const uint8_t *bytes,\n                               int num_bytes);\n\nunsigned mg_uecc_curve_num_words(MG_UECC_Curve curve);\nunsigned mg_uecc_curve_num_bytes(MG_UECC_Curve curve);\nunsigned mg_uecc_curve_num_bits(MG_UECC_Curve curve);\nunsigned mg_uecc_curve_num_n_words(MG_UECC_Curve curve);\nunsigned mg_uecc_curve_num_n_bytes(MG_UECC_Curve curve);\nunsigned mg_uecc_curve_num_n_bits(MG_UECC_Curve curve);\n\nconst mg_uecc_word_t *mg_uecc_curve_p(MG_UECC_Curve curve);\nconst mg_uecc_word_t *mg_uecc_curve_n(MG_UECC_Curve curve);\nconst mg_uecc_word_t *mg_uecc_curve_G(MG_UECC_Curve curve);\nconst mg_uecc_word_t *mg_uecc_curve_b(MG_UECC_Curve curve);\n\nint mg_uecc_valid_point(const mg_uecc_word_t *point, MG_UECC_Curve curve);\n\n/* Multiplies a point by a scalar. Points are represented by the X coordinate\n   followed by the Y coordinate in the same array, both coordinates are\n   curve->num_words long. Note that scalar must be curve->num_n_words long (NOT\n   curve->num_words). */\nvoid mg_uecc_point_mult(mg_uecc_word_t *result, const mg_uecc_word_t *point,\n                        const mg_uecc_word_t *scalar, MG_UECC_Curve curve);\n\n/* Generates a random integer in the range 0 < random < top.\n   Both random and top have num_words words. */\nint mg_uecc_generate_random_int(mg_uecc_word_t *random,\n                                const mg_uecc_word_t *top,\n                                wordcount_t num_words);\n\n#endif /* MG_UECC_ENABLE_VLI_API */\n\n#ifdef __cplusplus\n} /* end of extern \"C\" */\n#endif\n\n#endif /* _UECC_VLI_H_ */\n\n// End of uecc BSD-2\n// portable8439 v1.0.1\n// Source: https://github.com/DavyLandman/portable8439\n// Licensed under CC0-1.0\n// Contains poly1305-donna e6ad6e091d30d7f4ec2d4f978be1fcfcbce72781 (Public\n// Domain)\n\n\n\n\n#ifndef __PORTABLE_8439_H\n#define __PORTABLE_8439_H\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n// provide your own decl specificier like -DPORTABLE_8439_DECL=ICACHE_RAM_ATTR\n#ifndef PORTABLE_8439_DECL\n#define PORTABLE_8439_DECL\n#endif\n\n/*\n This library implements RFC 8439 a.k.a. ChaCha20-Poly1305 AEAD\n\n You can use this library to avoid attackers mutating or reusing your\n encrypted messages. This does assume you never reuse a nonce+key pair and,\n if possible, carefully pick your associated data.\n*/\n\n/* Make sure we are either nested in C++ or running in a C99+ compiler\n#if !defined(__cplusplus) && !defined(_MSC_VER) && \\\n    (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L)\n#error \"C99 or newer required\"\n#endif */\n\n// #if CHAR_BIT > 8\n// #    error \"Systems without native octals not suppoted\"\n// #endif\n\n#if defined(_MSC_VER) || defined(__cplusplus)\n// add restrict support is possible\n#if (defined(_MSC_VER) && _MSC_VER >= 1900) || defined(__clang__) || \\\n    defined(__GNUC__)\n#define restrict __restrict\n#else\n#define restrict\n#endif\n#endif\n\n#define RFC_8439_TAG_SIZE (16)\n#define RFC_8439_KEY_SIZE (32)\n#define RFC_8439_NONCE_SIZE (12)\n\n/*\n    Encrypt/Seal plain text bytes into a cipher text that can only be\n    decrypted by knowing the key, nonce and associated data.\n\n    input:\n        - key: RFC_8439_KEY_SIZE bytes that all parties have agreed\n            upon beforehand\n        - nonce: RFC_8439_NONCE_SIZE bytes that should never be repeated\n            for the same key. A counter or a pseudo-random value are fine.\n        - ad: associated data to include with calculating the tag of the\n            cipher text. Can be null for empty.\n        - plain_text: data to be encrypted, pointer + size should not overlap\n            with cipher_text pointer\n\n    output:\n        - cipher_text: encrypted plain_text with a tag appended. Make sure to\n            allocate at least plain_text_size + RFC_8439_TAG_SIZE\n\n    returns:\n        - size of bytes written to cipher_text, can be -1 if overlapping\n            pointers are passed for plain_text and cipher_text\n*/\nPORTABLE_8439_DECL size_t mg_chacha20_poly1305_encrypt(\n    uint8_t *restrict cipher_text, const uint8_t key[RFC_8439_KEY_SIZE],\n    const uint8_t nonce[RFC_8439_NONCE_SIZE], const uint8_t *restrict ad,\n    size_t ad_size, const uint8_t *restrict plain_text, size_t plain_text_size);\n\n/*\n    Decrypt/unseal cipher text given the right key, nonce, and additional data.\n\n    input:\n        - key: RFC_8439_KEY_SIZE bytes that all parties have agreed\n            upon beforehand\n        - nonce: RFC_8439_NONCE_SIZE bytes that should never be repeated for\n            the same key. A counter or a pseudo-random value are fine.\n        - ad: associated data to include with calculating the tag of the\n            cipher text. Can be null for empty.\n        - cipher_text: encrypted message.\n\n    output:\n        - plain_text: data to be encrypted, pointer + size should not overlap\n            with cipher_text pointer, leave at least enough room for\n            cipher_text_size - RFC_8439_TAG_SIZE\n\n    returns:\n        - size of bytes written to plain_text, -1 signals either:\n            - incorrect key/nonce/ad\n            - corrupted cipher_text\n            - overlapping pointers are passed for plain_text and cipher_text\n*/\nPORTABLE_8439_DECL size_t mg_chacha20_poly1305_decrypt(\n    uint8_t *restrict plain_text, const uint8_t key[RFC_8439_KEY_SIZE],\n    const uint8_t nonce[RFC_8439_NONCE_SIZE],\n    const uint8_t *restrict cipher_text, size_t cipher_text_size);\n#if defined(__cplusplus)\n}\n#endif\n#endif\n\n\nstruct mg_connection;\ntypedef void (*mg_event_handler_t)(struct mg_connection *, int ev,\n                                   void *ev_data);\nvoid mg_call(struct mg_connection *c, int ev, void *ev_data);\nvoid mg_error(struct mg_connection *c, const char *fmt, ...);\n\nenum {\n  MG_EV_ERROR,      // Error                        char *error_message\n  MG_EV_OPEN,       // Connection created           NULL\n  MG_EV_POLL,       // mg_mgr_poll iteration        uint64_t *uptime_millis\n  MG_EV_RESOLVE,    // Host name is resolved        NULL\n  MG_EV_CONNECT,    // Connection established       NULL\n  MG_EV_ACCEPT,     // Connection accepted          NULL\n  MG_EV_TLS_HS,     // TLS handshake succeeded      NULL\n  MG_EV_READ,       // Data received from socket    long *bytes_read\n  MG_EV_WRITE,      // Data written to socket       long *bytes_written\n  MG_EV_CLOSE,      // Connection closed            NULL\n  MG_EV_HTTP_HDRS,  // HTTP headers                 struct mg_http_message *\n  MG_EV_HTTP_MSG,   // Full HTTP request/response   struct mg_http_message *\n  MG_EV_WS_OPEN,    // Websocket handshake done     struct mg_http_message *\n  MG_EV_WS_MSG,     // Websocket msg, text or bin   struct mg_ws_message *\n  MG_EV_WS_CTL,     // Websocket control msg        struct mg_ws_message *\n  MG_EV_MQTT_CMD,   // MQTT low-level command       struct mg_mqtt_message *\n  MG_EV_MQTT_MSG,   // MQTT PUBLISH received        struct mg_mqtt_message *\n  MG_EV_MQTT_OPEN,  // MQTT CONNACK received        int *connack_status_code\n  MG_EV_SNTP_TIME,  // SNTP time received           uint64_t *epoch_millis\n  MG_EV_WAKEUP,     // mg_wakeup() data received    struct mg_str *data\n  MG_EV_USER        // Starting ID for user events\n};\n\n\n\n\n\n\n\n\n\n\nstruct mg_dns {\n  const char *url;          // DNS server URL\n  struct mg_connection *c;  // DNS server connection\n};\n\nstruct mg_addr {\n  uint8_t ip[16];    // Holds IPv4 or IPv6 address, in network byte order\n  uint16_t port;     // TCP or UDP port in network byte order\n  uint8_t scope_id;  // IPv6 scope ID\n  bool is_ip6;       // True when address is IPv6 address\n};\n\nstruct mg_mgr {\n  struct mg_connection *conns;  // List of active connections\n  struct mg_dns dns4;           // DNS for IPv4\n  struct mg_dns dns6;           // DNS for IPv6\n  int dnstimeout;               // DNS resolve timeout in milliseconds\n  bool use_dns6;                // Use DNS6 server by default, see #1532\n  unsigned long nextid;         // Next connection ID\n  unsigned long timerid;        // Next timer ID\n  void *userdata;               // Arbitrary user data pointer\n  void *tls_ctx;                // TLS context shared by all TLS sessions\n  uint16_t mqtt_id;             // MQTT IDs for pub/sub\n  void *active_dns_requests;    // DNS requests in progress\n  struct mg_timer *timers;      // Active timers\n  int epoll_fd;                 // Used when MG_EPOLL_ENABLE=1\n  struct mg_tcpip_if *ifp;      // Builtin TCP/IP stack only. Interface pointer\n  size_t extraconnsize;         // Builtin TCP/IP stack only. Extra space\n  MG_SOCKET_TYPE pipe;          // Socketpair end for mg_wakeup()\n#if MG_ENABLE_FREERTOS_TCP\n  SocketSet_t ss;  // NOTE(lsm): referenced from socket struct\n#endif\n};\n\nstruct mg_connection {\n  struct mg_connection *next;  // Linkage in struct mg_mgr :: connections\n  struct mg_mgr *mgr;          // Our container\n  struct mg_addr loc;          // Local address\n  struct mg_addr rem;          // Remote address\n  void *fd;                    // Connected socket, or LWIP data\n  unsigned long id;            // Auto-incrementing unique connection ID\n  struct mg_iobuf recv;        // Incoming data\n  struct mg_iobuf send;        // Outgoing data\n  struct mg_iobuf prof;        // Profile data enabled by MG_ENABLE_PROFILE\n  struct mg_iobuf rtls;        // TLS only. Incoming encrypted data\n  mg_event_handler_t fn;       // User-specified event handler function\n  void *fn_data;               // User-specified function parameter\n  mg_event_handler_t pfn;      // Protocol-specific handler function\n  void *pfn_data;              // Protocol-specific function parameter\n  char data[MG_DATA_SIZE];     // Arbitrary connection data\n  void *tls;                   // TLS specific data\n  unsigned is_listening : 1;   // Listening connection\n  unsigned is_client : 1;      // Outbound (client) connection\n  unsigned is_accepted : 1;    // Accepted (server) connection\n  unsigned is_resolving : 1;   // Non-blocking DNS resolution is in progress\n  unsigned is_arplooking : 1;  // Non-blocking ARP resolution is in progress\n  unsigned is_connecting : 1;  // Non-blocking connect is in progress\n  unsigned is_tls : 1;         // TLS-enabled connection\n  unsigned is_tls_hs : 1;      // TLS handshake is in progress\n  unsigned is_udp : 1;         // UDP connection\n  unsigned is_websocket : 1;   // WebSocket connection\n  unsigned is_mqtt5 : 1;       // For MQTT connection, v5 indicator\n  unsigned is_hexdumping : 1;  // Hexdump in/out traffic\n  unsigned is_draining : 1;    // Send remaining data, then close and free\n  unsigned is_closing : 1;     // Close and free the connection immediately\n  unsigned is_full : 1;        // Stop reads, until cleared\n  unsigned is_resp : 1;        // Response is still being generated\n  unsigned is_readable : 1;    // Connection is ready to read\n  unsigned is_writable : 1;    // Connection is ready to write\n};\n\nvoid mg_mgr_poll(struct mg_mgr *, int ms);\nvoid mg_mgr_init(struct mg_mgr *);\nvoid mg_mgr_free(struct mg_mgr *);\n\nstruct mg_connection *mg_listen(struct mg_mgr *, const char *url,\n                                mg_event_handler_t fn, void *fn_data);\nstruct mg_connection *mg_connect(struct mg_mgr *, const char *url,\n                                 mg_event_handler_t fn, void *fn_data);\nstruct mg_connection *mg_wrapfd(struct mg_mgr *mgr, int fd,\n                                mg_event_handler_t fn, void *fn_data);\nvoid mg_connect_resolved(struct mg_connection *);\nbool mg_send(struct mg_connection *, const void *, size_t);\nsize_t mg_printf(struct mg_connection *, const char *fmt, ...);\nsize_t mg_vprintf(struct mg_connection *, const char *fmt, va_list *ap);\nbool mg_aton(struct mg_str str, struct mg_addr *addr);\n\n// These functions are used to integrate with custom network stacks\nstruct mg_connection *mg_alloc_conn(struct mg_mgr *);\nvoid mg_close_conn(struct mg_connection *c);\nbool mg_open_listener(struct mg_connection *c, const char *url);\n\n// Utility functions\nbool mg_wakeup(struct mg_mgr *, unsigned long id, const void *buf, size_t len);\nbool mg_wakeup_init(struct mg_mgr *);\nstruct mg_timer *mg_timer_add(struct mg_mgr *mgr, uint64_t milliseconds,\n                              unsigned flags, void (*fn)(void *), void *arg);\n\n\n\n\n\n\n\n\nstruct mg_http_header {\n  struct mg_str name;   // Header name\n  struct mg_str value;  // Header value\n};\n\nstruct mg_http_message {\n  struct mg_str method, uri, query, proto;             // Request/response line\n  struct mg_http_header headers[MG_MAX_HTTP_HEADERS];  // Headers\n  struct mg_str body;                                  // Body\n  struct mg_str head;                                  // Request + headers\n  struct mg_str message;  // Request + headers + body\n};\n\n// Parameter for mg_http_serve_dir()\nstruct mg_http_serve_opts {\n  const char *root_dir;       // Web root directory, must be non-NULL\n  const char *ssi_pattern;    // SSI file name pattern, e.g. #.shtml\n  const char *extra_headers;  // Extra HTTP headers to add in responses\n  const char *mime_types;     // Extra mime types, ext1=type1,ext2=type2,..\n  const char *page404;        // Path to the 404 page, or NULL by default\n  struct mg_fs *fs;           // Filesystem implementation. Use NULL for POSIX\n};\n\n// Parameter for mg_http_next_multipart\nstruct mg_http_part {\n  struct mg_str name;      // Form field name\n  struct mg_str filename;  // Filename for file uploads\n  struct mg_str body;      // Part contents\n};\n\nint mg_http_parse(const char *s, size_t len, struct mg_http_message *);\nint mg_http_get_request_len(const unsigned char *buf, size_t buf_len);\nvoid mg_http_printf_chunk(struct mg_connection *cnn, const char *fmt, ...);\nvoid mg_http_write_chunk(struct mg_connection *c, const char *buf, size_t len);\nvoid mg_http_delete_chunk(struct mg_connection *c, struct mg_http_message *hm);\nstruct mg_connection *mg_http_listen(struct mg_mgr *, const char *url,\n                                     mg_event_handler_t fn, void *fn_data);\nstruct mg_connection *mg_http_connect(struct mg_mgr *, const char *url,\n                                      mg_event_handler_t fn, void *fn_data);\nvoid mg_http_serve_dir(struct mg_connection *, struct mg_http_message *hm,\n                       const struct mg_http_serve_opts *);\nvoid mg_http_serve_file(struct mg_connection *, struct mg_http_message *hm,\n                        const char *path, const struct mg_http_serve_opts *);\nvoid mg_http_reply(struct mg_connection *, int status_code, const char *headers,\n                   const char *body_fmt, ...);\nstruct mg_str *mg_http_get_header(struct mg_http_message *, const char *name);\nstruct mg_str mg_http_var(struct mg_str buf, struct mg_str name);\nint mg_http_get_var(const struct mg_str *, const char *name, char *, size_t);\nint mg_url_decode(const char *s, size_t n, char *to, size_t to_len, int form);\nsize_t mg_url_encode(const char *s, size_t n, char *buf, size_t len);\nvoid mg_http_creds(struct mg_http_message *, char *, size_t, char *, size_t);\nlong mg_http_upload(struct mg_connection *c, struct mg_http_message *hm,\n                    struct mg_fs *fs, const char *dir, size_t max_size);\nvoid mg_http_bauth(struct mg_connection *, const char *user, const char *pass);\nstruct mg_str mg_http_get_header_var(struct mg_str s, struct mg_str v);\nsize_t mg_http_next_multipart(struct mg_str, size_t, struct mg_http_part *);\nint mg_http_status(const struct mg_http_message *hm);\nvoid mg_hello(const char *url);\n\n\nvoid mg_http_serve_ssi(struct mg_connection *c, const char *root,\n                       const char *fullpath);\n\n\n#define MG_TLS_NONE 0     // No TLS support\n#define MG_TLS_MBED 1     // mbedTLS\n#define MG_TLS_OPENSSL 2  // OpenSSL\n#define MG_TLS_WOLFSSL 5  // WolfSSL (based on OpenSSL)\n#define MG_TLS_BUILTIN 3  // Built-in\n#define MG_TLS_CUSTOM 4   // Custom implementation\n\n#ifndef MG_TLS\n#define MG_TLS MG_TLS_NONE\n#endif\n\n\n\n\n\nstruct mg_tls_opts {\n  struct mg_str ca;       // PEM or DER\n  struct mg_str cert;     // PEM or DER\n  struct mg_str key;      // PEM or DER\n  struct mg_str name;     // If not empty, enable host name verification\n  int skip_verification;  // Skip certificate and host name verification\n};\n\nvoid mg_tls_init(struct mg_connection *, const struct mg_tls_opts *opts);\nvoid mg_tls_free(struct mg_connection *);\nlong mg_tls_send(struct mg_connection *, const void *buf, size_t len);\nlong mg_tls_recv(struct mg_connection *, void *buf, size_t len);\nsize_t mg_tls_pending(struct mg_connection *);\nvoid mg_tls_handshake(struct mg_connection *);\n\n// Private\nvoid mg_tls_ctx_init(struct mg_mgr *);\nvoid mg_tls_ctx_free(struct mg_mgr *);\n\n// Low-level IO primives used by TLS layer\nenum { MG_IO_ERR = -1, MG_IO_WAIT = -2, MG_IO_RESET = -3 };\nlong mg_io_send(struct mg_connection *c, const void *buf, size_t len);\nlong mg_io_recv(struct mg_connection *c, void *buf, size_t len);\n\n\n\n\n\n\n\n#if MG_TLS == MG_TLS_MBED\n#include <mbedtls/debug.h>\n#include <mbedtls/net_sockets.h>\n#include <mbedtls/ssl.h>\n#include <mbedtls/ssl_ticket.h>\n\nstruct mg_tls_ctx {\n  int dummy;\n#ifdef MBEDTLS_SSL_SESSION_TICKETS\n  mbedtls_ssl_ticket_context tickets;\n#endif\n};\n\nstruct mg_tls {\n  mbedtls_x509_crt ca;      // Parsed CA certificate\n  mbedtls_x509_crt cert;    // Parsed certificate\n  mbedtls_pk_context pk;    // Private key context\n  mbedtls_ssl_context ssl;  // SSL/TLS context\n  mbedtls_ssl_config conf;  // SSL-TLS config\n#ifdef MBEDTLS_SSL_SESSION_TICKETS\n  mbedtls_ssl_ticket_context ticket;  // Session tickets context\n#endif\n};\n#endif\n\n\n#if MG_TLS == MG_TLS_OPENSSL || MG_TLS == MG_TLS_WOLFSSL\n\n#include <openssl/err.h>\n#include <openssl/ssl.h>\n\nstruct mg_tls {\n  BIO_METHOD *bm;\n  SSL_CTX *ctx;\n  SSL *ssl;\n};\n#endif\n\n\n#define WEBSOCKET_OP_CONTINUE 0\n#define WEBSOCKET_OP_TEXT 1\n#define WEBSOCKET_OP_BINARY 2\n#define WEBSOCKET_OP_CLOSE 8\n#define WEBSOCKET_OP_PING 9\n#define WEBSOCKET_OP_PONG 10\n\n\n\nstruct mg_ws_message {\n  struct mg_str data;  // Websocket message data\n  uint8_t flags;       // Websocket message flags\n};\n\nstruct mg_connection *mg_ws_connect(struct mg_mgr *, const char *url,\n                                    mg_event_handler_t fn, void *fn_data,\n                                    const char *fmt, ...);\nvoid mg_ws_upgrade(struct mg_connection *, struct mg_http_message *,\n                   const char *fmt, ...);\nsize_t mg_ws_send(struct mg_connection *, const void *buf, size_t len, int op);\nsize_t mg_ws_wrap(struct mg_connection *, size_t len, int op);\nsize_t mg_ws_printf(struct mg_connection *c, int op, const char *fmt, ...);\nsize_t mg_ws_vprintf(struct mg_connection *c, int op, const char *fmt,\n                     va_list *);\n\n\n\n\nstruct mg_connection *mg_sntp_connect(struct mg_mgr *mgr, const char *url,\n                                      mg_event_handler_t fn, void *fn_data);\nvoid mg_sntp_request(struct mg_connection *c);\nint64_t mg_sntp_parse(const unsigned char *buf, size_t len);\n\nuint64_t mg_now(void);     // Return milliseconds since Epoch\n\n\n\n\n\n#define MQTT_CMD_CONNECT 1\n#define MQTT_CMD_CONNACK 2\n#define MQTT_CMD_PUBLISH 3\n#define MQTT_CMD_PUBACK 4\n#define MQTT_CMD_PUBREC 5\n#define MQTT_CMD_PUBREL 6\n#define MQTT_CMD_PUBCOMP 7\n#define MQTT_CMD_SUBSCRIBE 8\n#define MQTT_CMD_SUBACK 9\n#define MQTT_CMD_UNSUBSCRIBE 10\n#define MQTT_CMD_UNSUBACK 11\n#define MQTT_CMD_PINGREQ 12\n#define MQTT_CMD_PINGRESP 13\n#define MQTT_CMD_DISCONNECT 14\n#define MQTT_CMD_AUTH 15\n\n#define MQTT_PROP_PAYLOAD_FORMAT_INDICATOR 0x01\n#define MQTT_PROP_MESSAGE_EXPIRY_INTERVAL 0x02\n#define MQTT_PROP_CONTENT_TYPE 0x03\n#define MQTT_PROP_RESPONSE_TOPIC 0x08\n#define MQTT_PROP_CORRELATION_DATA 0x09\n#define MQTT_PROP_SUBSCRIPTION_IDENTIFIER 0x0B\n#define MQTT_PROP_SESSION_EXPIRY_INTERVAL 0x11\n#define MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER 0x12\n#define MQTT_PROP_SERVER_KEEP_ALIVE 0x13\n#define MQTT_PROP_AUTHENTICATION_METHOD 0x15\n#define MQTT_PROP_AUTHENTICATION_DATA 0x16\n#define MQTT_PROP_REQUEST_PROBLEM_INFORMATION 0x17\n#define MQTT_PROP_WILL_DELAY_INTERVAL 0x18\n#define MQTT_PROP_REQUEST_RESPONSE_INFORMATION 0x19\n#define MQTT_PROP_RESPONSE_INFORMATION 0x1A\n#define MQTT_PROP_SERVER_REFERENCE 0x1C\n#define MQTT_PROP_REASON_STRING 0x1F\n#define MQTT_PROP_RECEIVE_MAXIMUM 0x21\n#define MQTT_PROP_TOPIC_ALIAS_MAXIMUM 0x22\n#define MQTT_PROP_TOPIC_ALIAS 0x23\n#define MQTT_PROP_MAXIMUM_QOS 0x24\n#define MQTT_PROP_RETAIN_AVAILABLE 0x25\n#define MQTT_PROP_USER_PROPERTY 0x26\n#define MQTT_PROP_MAXIMUM_PACKET_SIZE 0x27\n#define MQTT_PROP_WILDCARD_SUBSCRIPTION_AVAILABLE 0x28\n#define MQTT_PROP_SUBSCRIPTION_IDENTIFIER_AVAILABLE 0x29\n#define MQTT_PROP_SHARED_SUBSCRIPTION_AVAILABLE 0x2A\n\nenum {\n  MQTT_PROP_TYPE_BYTE,\n  MQTT_PROP_TYPE_STRING,\n  MQTT_PROP_TYPE_STRING_PAIR,\n  MQTT_PROP_TYPE_BINARY_DATA,\n  MQTT_PROP_TYPE_VARIABLE_INT,\n  MQTT_PROP_TYPE_INT,\n  MQTT_PROP_TYPE_SHORT\n};\n\nenum { MQTT_OK, MQTT_INCOMPLETE, MQTT_MALFORMED };\n\nstruct mg_mqtt_prop {\n  uint8_t id;         // Enumerated at MQTT5 Reference\n  uint32_t iv;        // Integer value for 8-, 16-, 32-bit integers types\n  struct mg_str key;  // Non-NULL only for user property type\n  struct mg_str val;  // Non-NULL only for UTF-8 types and user properties\n};\n\nstruct mg_mqtt_opts {\n  struct mg_str user;               // Username, can be empty\n  struct mg_str pass;               // Password, can be empty\n  struct mg_str client_id;          // Client ID\n  struct mg_str topic;              // message/subscription topic\n  struct mg_str message;            // message content\n  uint8_t qos;                      // message quality of service\n  uint8_t version;                  // Can be 4 (3.1.1), or 5. If 0, assume 4\n  uint16_t keepalive;               // Keep-alive timer in seconds\n  uint16_t retransmit_id;           // For PUBLISH, init to 0\n  bool retain;                      // Retain flag\n  bool clean;                       // Clean session flag\n  struct mg_mqtt_prop *props;       // MQTT5 props array\n  size_t num_props;                 // number of props\n  struct mg_mqtt_prop *will_props;  // Valid only for CONNECT packet (MQTT5)\n  size_t num_will_props;            // Number of will props\n};\n\nstruct mg_mqtt_message {\n  struct mg_str topic;  // Parsed topic for PUBLISH\n  struct mg_str data;   // Parsed message for PUBLISH\n  struct mg_str dgram;  // Whole MQTT packet, including headers\n  uint16_t id;          // For PUBACK, PUBREC, PUBREL, PUBCOMP, SUBACK, PUBLISH\n  uint8_t cmd;          // MQTT command, one of MQTT_CMD_*\n  uint8_t qos;          // Quality of service\n  uint8_t ack;          // CONNACK return code, 0 = success\n  size_t props_start;   // Offset to the start of the properties (MQTT5)\n  size_t props_size;    // Length of the properties\n};\n\nstruct mg_connection *mg_mqtt_connect(struct mg_mgr *, const char *url,\n                                      const struct mg_mqtt_opts *opts,\n                                      mg_event_handler_t fn, void *fn_data);\nstruct mg_connection *mg_mqtt_listen(struct mg_mgr *mgr, const char *url,\n                                     mg_event_handler_t fn, void *fn_data);\nvoid mg_mqtt_login(struct mg_connection *c, const struct mg_mqtt_opts *opts);\nuint16_t mg_mqtt_pub(struct mg_connection *c, const struct mg_mqtt_opts *opts);\nvoid mg_mqtt_sub(struct mg_connection *, const struct mg_mqtt_opts *opts);\nint mg_mqtt_parse(const uint8_t *, size_t, uint8_t, struct mg_mqtt_message *);\nvoid mg_mqtt_send_header(struct mg_connection *, uint8_t cmd, uint8_t flags,\n                         uint32_t len);\nvoid mg_mqtt_ping(struct mg_connection *);\nvoid mg_mqtt_pong(struct mg_connection *);\nvoid mg_mqtt_disconnect(struct mg_connection *, const struct mg_mqtt_opts *);\nsize_t mg_mqtt_next_prop(struct mg_mqtt_message *, struct mg_mqtt_prop *,\n                         size_t ofs);\n\n\n\n\n\n// Mongoose sends DNS queries that contain only one question:\n// either A (IPv4) or AAAA (IPv6) address lookup.\n// Therefore, we expect zero or one answer.\n// If `resolved` is true, then `addr` contains resolved IPv4 or IPV6 address.\nstruct mg_dns_message {\n  uint16_t txnid;       // Transaction ID\n  bool resolved;        // Resolve successful, addr is set\n  struct mg_addr addr;  // Resolved address\n  char name[256];       // Host name\n};\n\nstruct mg_dns_header {\n  uint16_t txnid;  // Transaction ID\n  uint16_t flags;\n  uint16_t num_questions;\n  uint16_t num_answers;\n  uint16_t num_authority_prs;\n  uint16_t num_other_prs;\n};\n\n// DNS resource record\nstruct mg_dns_rr {\n  uint16_t nlen;    // Name or pointer length\n  uint16_t atype;   // Address type\n  uint16_t aclass;  // Address class\n  uint16_t alen;    // Address length\n};\n\nvoid mg_resolve(struct mg_connection *, const char *url);\nvoid mg_resolve_cancel(struct mg_connection *);\nbool mg_dns_parse(const uint8_t *buf, size_t len, struct mg_dns_message *);\nsize_t mg_dns_parse_rr(const uint8_t *buf, size_t len, size_t ofs,\n                       bool is_question, struct mg_dns_rr *);\n\n\n\n\n\n#ifndef MG_JSON_MAX_DEPTH\n#define MG_JSON_MAX_DEPTH 30\n#endif\n\n// Error return values - negative. Successful returns are >= 0\nenum { MG_JSON_TOO_DEEP = -1, MG_JSON_INVALID = -2, MG_JSON_NOT_FOUND = -3 };\nint mg_json_get(struct mg_str json, const char *path, int *toklen);\n\nstruct mg_str mg_json_get_tok(struct mg_str json, const char *path);\nbool mg_json_get_num(struct mg_str json, const char *path, double *v);\nbool mg_json_get_bool(struct mg_str json, const char *path, bool *v);\nlong mg_json_get_long(struct mg_str json, const char *path, long dflt);\nchar *mg_json_get_str(struct mg_str json, const char *path);\nchar *mg_json_get_hex(struct mg_str json, const char *path, int *len);\nchar *mg_json_get_b64(struct mg_str json, const char *path, int *len);\n\nbool mg_json_unescape(struct mg_str str, char *buf, size_t len);\nsize_t mg_json_next(struct mg_str obj, size_t ofs, struct mg_str *key,\n                    struct mg_str *val);\n\n\n\n\n// JSON-RPC request descriptor\nstruct mg_rpc_req {\n  struct mg_rpc **head;  // RPC handlers list head\n  struct mg_rpc *rpc;    // RPC handler being called\n  mg_pfn_t pfn;          // Response printing function\n  void *pfn_data;        // Response printing function data\n  void *req_data;        // Arbitrary request data\n  struct mg_str frame;   // Request, e.g. {\"id\":1,\"method\":\"add\",\"params\":[1,2]}\n};\n\n// JSON-RPC method handler\nstruct mg_rpc {\n  struct mg_rpc *next;              // Next in list\n  struct mg_str method;             // Method pattern\n  void (*fn)(struct mg_rpc_req *);  // Handler function\n  void *fn_data;                    // Handler function argument\n};\n\nvoid mg_rpc_add(struct mg_rpc **head, struct mg_str method_pattern,\n                void (*handler)(struct mg_rpc_req *), void *handler_data);\nvoid mg_rpc_del(struct mg_rpc **head, void (*handler)(struct mg_rpc_req *));\nvoid mg_rpc_process(struct mg_rpc_req *);\n\n// Helper functions to print result or error frame\nvoid mg_rpc_ok(struct mg_rpc_req *, const char *fmt, ...);\nvoid mg_rpc_vok(struct mg_rpc_req *, const char *fmt, va_list *ap);\nvoid mg_rpc_err(struct mg_rpc_req *, int code, const char *fmt, ...);\nvoid mg_rpc_verr(struct mg_rpc_req *, int code, const char *fmt, va_list *);\nvoid mg_rpc_list(struct mg_rpc_req *r);\n// Copyright (c) 2023 Cesanta Software Limited\n// All rights reserved\n\n\n\n\n\n#define MG_OTA_NONE 0       // No OTA support\n#define MG_OTA_STM32H5 1    // STM32 H5\n#define MG_OTA_STM32H7 2    // STM32 H7\n#define MG_OTA_STM32H7_DUAL_CORE 3 // STM32 H7 dual core\n#define MG_OTA_STM32F  4    // STM32 F7/F4/F2\n#define MG_OTA_CH32V307 100 // WCH CH32V307\n#define MG_OTA_U2A 200      // Renesas U2A16, U2A8, U2A6\n#define MG_OTA_RT1020 300   // IMXRT1020\n#define MG_OTA_RT1060 301   // IMXRT1060\n#define MG_OTA_RT1064 302   // IMXRT1064\n#define MG_OTA_RT1170 303   // IMXRT1170\n#define MG_OTA_MCXN 310 \t  // MCXN947\n#define MG_OTA_FLASH 900    // OTA via an internal flash\n#define MG_OTA_ESP32 910    // ESP32 OTA implementation\n#define MG_OTA_PICOSDK 920  // RP2040/2350 using Pico-SDK hardware_flash\n#define MG_OTA_CUSTOM 1000  // Custom implementation\n\n#ifndef MG_OTA\n#define MG_OTA MG_OTA_NONE\n#else\n#ifndef MG_IRAM\n#if defined(__GNUC__)\n#define MG_IRAM __attribute__((noinline, section(\".iram\")))\n#else\n#define MG_IRAM\n#endif // compiler\n#endif // IRAM\n#endif // OTA\n\n// Firmware update API\nbool mg_ota_begin(size_t new_firmware_size);     // Start writing\nbool mg_ota_write(const void *buf, size_t len);  // Write chunk, aligned to 1k\nbool mg_ota_end(void);                           // Stop writing\n\n\n\n#if MG_OTA != MG_OTA_NONE && MG_OTA != MG_OTA_CUSTOM\n\nstruct mg_flash {\n  void *start;    // Address at which flash starts\n  size_t size;    // Flash size\n  size_t secsz;   // Sector size\n  size_t align;   // Write alignment\n  bool (*write_fn)(void *, const void *, size_t);  // Write function\n  bool (*swap_fn)(void);                           // Swap partitions\n};\n\nbool mg_ota_flash_begin(size_t new_firmware_size, struct mg_flash *flash);\nbool mg_ota_flash_write(const void *buf, size_t len, struct mg_flash *flash);\nbool mg_ota_flash_end(struct mg_flash *flash);\n\n#endif\n\n\n\n\n\n\n\nstruct mg_tcpip_if;  // Mongoose TCP/IP network interface\n\nstruct mg_tcpip_driver {\n  bool (*init)(struct mg_tcpip_if *);                         // Init driver\n  size_t (*tx)(const void *, size_t, struct mg_tcpip_if *);   // Transmit frame\n  size_t (*rx)(void *buf, size_t len, struct mg_tcpip_if *);  // Receive frame\n  bool (*up)(struct mg_tcpip_if *);                           // Up/down status\n};\n\ntypedef void (*mg_tcpip_event_handler_t)(struct mg_tcpip_if *ifp, int ev,\n                                         void *ev_data);\n\nenum {\n  MG_TCPIP_EV_ST_CHG,     // state change             uint8_t * (&ifp->state)\n  MG_TCPIP_EV_DHCP_DNS,   // DHCP DNS assignment      uint32_t *ipaddr\n  MG_TCPIP_EV_DHCP_SNTP,  // DHCP SNTP assignment     uint32_t *ipaddr\n  MG_TCPIP_EV_ARP,        // Got ARP packet           struct mg_str *\n  MG_TCPIP_EV_TIMER_1S,   // 1 second timer           NULL\n  MG_TCPIP_EV_USER        // Starting ID for user events\n};\n\n// Network interface\nstruct mg_tcpip_if {\n  uint8_t mac[6];                  // MAC address. Must be set to a valid MAC\n  uint32_t ip, mask, gw;           // IP address, mask, default gateway\n  struct mg_str tx;                // Output (TX) buffer\n  bool enable_dhcp_client;         // Enable DCHP client\n  bool enable_dhcp_server;         // Enable DCHP server\n  bool enable_get_gateway;         // DCHP server sets client as gateway\n  bool enable_req_dns;             // DCHP client requests DNS server\n  bool enable_req_sntp;            // DCHP client requests SNTP server\n  bool enable_crc32_check;         // Do a CRC check on RX frames and strip it\n  bool enable_mac_check;           // Do a MAC check on RX frames\n  struct mg_tcpip_driver *driver;  // Low level driver\n  void *driver_data;               // Driver-specific data\n  mg_tcpip_event_handler_t fn;     // User-specified event handler function\n  struct mg_mgr *mgr;              // Mongoose event manager\n  struct mg_queue recv_queue;      // Receive queue\n  uint16_t mtu;                    // Interface MTU\n#define MG_TCPIP_MTU_DEFAULT 1500\n\n  // Internal state, user can use it but should not change it\n  uint8_t gwmac[6];             // Router's MAC\n  uint64_t now;                 // Current time\n  uint64_t timer_1000ms;        // 1000 ms timer: for DHCP and link state\n  uint64_t lease_expire;        // Lease expiration time, in ms\n  uint16_t eport;               // Next ephemeral port\n  volatile uint32_t ndrop;      // Number of received, but dropped frames\n  volatile uint32_t nrecv;      // Number of received frames\n  volatile uint32_t nsent;      // Number of transmitted frames\n  volatile uint32_t nerr;       // Number of driver errors\n  uint8_t state;                // Current state\n#define MG_TCPIP_STATE_DOWN 0   // Interface is down\n#define MG_TCPIP_STATE_UP 1     // Interface is up\n#define MG_TCPIP_STATE_REQ 2    // Interface is up, DHCP REQUESTING state\n#define MG_TCPIP_STATE_IP 3     // Interface is up and has an IP assigned\n#define MG_TCPIP_STATE_READY 4  // Interface has fully come up, ready to work\n};\n\nvoid mg_tcpip_init(struct mg_mgr *, struct mg_tcpip_if *);\nvoid mg_tcpip_free(struct mg_tcpip_if *);\nvoid mg_tcpip_qwrite(void *buf, size_t len, struct mg_tcpip_if *ifp);\nvoid mg_tcpip_arp_request(struct mg_tcpip_if *ifp, uint32_t ip, uint8_t *mac);\n\nextern struct mg_tcpip_driver mg_tcpip_driver_stm32f;\nextern struct mg_tcpip_driver mg_tcpip_driver_w5500;\nextern struct mg_tcpip_driver mg_tcpip_driver_tm4c;\nextern struct mg_tcpip_driver mg_tcpip_driver_tms570;\nextern struct mg_tcpip_driver mg_tcpip_driver_stm32h;\nextern struct mg_tcpip_driver mg_tcpip_driver_imxrt;\nextern struct mg_tcpip_driver mg_tcpip_driver_same54;\nextern struct mg_tcpip_driver mg_tcpip_driver_cmsis;\nextern struct mg_tcpip_driver mg_tcpip_driver_ra;\nextern struct mg_tcpip_driver mg_tcpip_driver_xmc;\nextern struct mg_tcpip_driver mg_tcpip_driver_xmc7;\nextern struct mg_tcpip_driver mg_tcpip_driver_ppp;\nextern struct mg_tcpip_driver mg_tcpip_driver_pico_w;\n\n// Drivers that require SPI, can use this SPI abstraction\nstruct mg_tcpip_spi {\n  void *spi;                        // Opaque SPI bus descriptor\n  void (*begin)(void *);            // SPI begin: slave select low\n  void (*end)(void *);              // SPI end: slave select high\n  uint8_t (*txn)(void *, uint8_t);  // SPI transaction: write 1 byte, read reply\n};\n\n\n\n// Macros to record timestamped events that happens with a connection.\n// They are saved into a c->prof IO buffer, each event is a name and a 32-bit\n// timestamp in milliseconds since connection init time.\n//\n// Test (run in two separate terminals):\n//   make -C examples/http-server/ CFLAGS_EXTRA=-DMG_ENABLE_PROFILE=1\n//   curl localhost:8000\n// Output:\n//   1ea1f1e7 2 net.c:150:mg_close_conn      3 profile:                                                            \n//   1ea1f1e8 2 net.c:150:mg_close_conn      1ea1f1e6 init                                                         \n//   1ea1f1e8 2 net.c:150:mg_close_conn          0 EV_OPEN\n//   1ea1f1e8 2 net.c:150:mg_close_conn          0 EV_ACCEPT \n//   1ea1f1e8 2 net.c:150:mg_close_conn          0 EV_READ\n//   1ea1f1e8 2 net.c:150:mg_close_conn          0 EV_HTTP_MSG\n//   1ea1f1e8 2 net.c:150:mg_close_conn          0 EV_WRITE\n//   1ea1f1e8 2 net.c:150:mg_close_conn          1 EV_CLOSE\n//\n// Usage:\n//   Enable profiling by setting MG_ENABLE_PROFILE=1\n//   Invoke MG_PROF_ADD(c, \"MY_EVENT_1\") in the places you'd like to measure\n\n#if MG_ENABLE_PROFILE\nstruct mg_profitem {\n  const char *name;    // Event name\n  uint32_t timestamp;  // Milliseconds since connection creation (MG_EV_OPEN)\n};\n\n#define MG_PROFILE_ALLOC_GRANULARITY 256  // Can save 32 items wih to realloc\n\n// Adding a profile item to the c->prof. Must be as fast as possible.\n// Reallocation of the c->prof iobuf is not desirable here, that's why we\n// pre-allocate c->prof with MG_PROFILE_ALLOC_GRANULARITY.\n// This macro just inits and copies 8 bytes, and calls mg_millis(),\n// which should be fast enough.\n#define MG_PROF_ADD(c, name_)                                             \\\n  do {                                                                    \\\n    struct mg_iobuf *io = &c->prof;                                       \\\n    uint32_t inittime = ((struct mg_profitem *) io->buf)->timestamp;      \\\n    struct mg_profitem item = {name_, (uint32_t) mg_millis() - inittime}; \\\n    mg_iobuf_add(io, io->len, &item, sizeof(item));                       \\\n  } while (0)\n\n// Initialising profile for a new connection. Not time sensitive\n#define MG_PROF_INIT(c)                                          \\\n  do {                                                           \\\n    struct mg_profitem first = {\"init\", (uint32_t) mg_millis()}; \\\n    mg_iobuf_init(&(c)->prof, 0, MG_PROFILE_ALLOC_GRANULARITY);  \\\n    mg_iobuf_add(&c->prof, c->prof.len, &first, sizeof(first));  \\\n  } while (0)\n\n#define MG_PROF_FREE(c) mg_iobuf_free(&(c)->prof)\n\n// Dumping the profile. Not time sensitive\n#define MG_PROF_DUMP(c)                                            \\\n  do {                                                             \\\n    struct mg_iobuf *io = &c->prof;                                \\\n    struct mg_profitem *p = (struct mg_profitem *) io->buf;        \\\n    struct mg_profitem *e = &p[io->len / sizeof(*p)];              \\\n    MG_INFO((\"%lu profile:\", c->id));                              \\\n    while (p < e) {                                                \\\n      MG_INFO((\"%5lx %s\", (unsigned long) p->timestamp, p->name)); \\\n      p++;                                                         \\\n    }                                                              \\\n  } while (0)\n\n#else\n#define MG_PROF_INIT(c)\n#define MG_PROF_FREE(c)\n#define MG_PROF_ADD(c, name)\n#define MG_PROF_DUMP(c)\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_CMSIS) && MG_ENABLE_DRIVER_CMSIS\n\n#include \"Driver_ETH_MAC.h\"  // keep this include\n#include \"Driver_ETH_PHY.h\"  // keep this include\n\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_IMXRT) && MG_ENABLE_DRIVER_IMXRT\n\nstruct mg_tcpip_driver_imxrt_data {\n  // MDC clock divider. MDC clock is derived from IPS Bus clock (ipg_clk),\n  // must not exceed 2.5MHz. Configuration for clock range 2.36~2.50 MHz\n  // 37.5.1.8.2, Table 37-46 : f = ipg_clk / (2(mdc_cr + 1))\n  //    ipg_clk       mdc_cr VALUE\n  //    --------------------------\n  //                  -1  <-- TODO() tell driver to guess the value\n  //    25 MHz         4\n  //    33 MHz         6\n  //    40 MHz         7\n  //    50 MHz         9\n  //    66 MHz        13\n  int mdc_cr;  // Valid values: -1 to 63\n\n  uint8_t phy_addr;  // PHY address\n};\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 2\n#endif\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 24\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                \\\n  do {                                                           \\\n    static struct mg_tcpip_driver_imxrt_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                              \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                      \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                   \\\n    mif_.ip = MG_TCPIP_IP;                                       \\\n    mif_.mask = MG_TCPIP_MASK;                                   \\\n    mif_.gw = MG_TCPIP_GW;                                       \\\n    mif_.driver = &mg_tcpip_driver_imxrt;                        \\\n    mif_.driver_data = &driver_data_;                            \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                                \\\n    mg_tcpip_init(mgr, &mif_);                                   \\\n    MG_INFO((\"Driver: imxrt, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n\n\n\n\nstruct mg_phy {\n  uint16_t (*read_reg)(uint8_t addr, uint8_t reg);\n  void (*write_reg)(uint8_t addr, uint8_t reg, uint16_t value);\n};\n\n// PHY configuration settings, bitmask\nenum {\n  // Set if PHY LEDs are connected to ground\n  MG_PHY_LEDS_ACTIVE_HIGH = (1 << 0),\n  // Set when PHY clocks MAC. Otherwise, MAC clocks PHY\n  MG_PHY_CLOCKS_MAC = (1 << 1),\n};\n\nenum { MG_PHY_SPEED_10M, MG_PHY_SPEED_100M, MG_PHY_SPEED_1000M };\n\nvoid mg_phy_init(struct mg_phy *, uint8_t addr, uint8_t config);\nbool mg_phy_up(struct mg_phy *, uint8_t addr, bool *full_duplex,\n               uint8_t *speed);\n\n\n#if MG_ENABLE_TCPIP && MG_ARCH == MG_ARCH_PICOSDK && \\\n    defined(MG_ENABLE_DRIVER_PICO_W) && MG_ENABLE_DRIVER_PICO_W\n\n#include \"cyw43.h\"              // keep this include\n#include \"pico/cyw43_arch.h\"    // keep this include\n#include \"pico/unique_id.h\"     // keep this include\n\nstruct mg_tcpip_driver_pico_w_data {\n  char *ssid;\n  char *pass;\n};\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_pico_w_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    MG_SET_WIFI_CREDS(&driver_data_.ssid, &driver_data_.pass);    \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_pico_w;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    mif_.recv_queue.size = 8192;                                  \\\n    mif_.mac[0] = 2; /* MAC read from OTP at driver init */       \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_INFO((\"Driver: pico-w, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n\n\nstruct mg_tcpip_driver_ppp_data {\n  void *uart;                   // Opaque UART bus descriptor\n  void (*reset)(void *);        // Modem hardware reset\n  void (*tx)(void *, uint8_t);  // UART transmit single byte\n  int (*rx)(void *);            // UART receive single byte\n  const char **script;          // List of AT commands and expected replies\n  int script_index;             // Index of the current AT command in the list\n  uint64_t deadline;            // AT command deadline in ms\n};\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_RA) && MG_ENABLE_DRIVER_RA\n\nstruct mg_tcpip_driver_ra_data {\n  // MDC clock \"divider\". MDC clock is software generated,\n  uint32_t clock;    // core clock frequency in Hz\n  uint16_t irqno;    // IRQn, R_ICU->IELSR[irqno]\n  uint8_t phy_addr;  // PHY address\n};\n\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_SAME54) && MG_ENABLE_DRIVER_SAME54\n\nstruct mg_tcpip_driver_same54_data {\n    int mdc_cr;\n};\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 5\n#endif\n\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_STM32F) && \\\n    MG_ENABLE_DRIVER_STM32F\n\nstruct mg_tcpip_driver_stm32f_data {\n  // MDC clock divider. MDC clock is derived from HCLK, must not exceed 2.5MHz\n  //    HCLK range    DIVIDER    mdc_cr VALUE\n  //    -------------------------------------\n  //                                -1  <-- tell driver to guess the value\n  //    60-100 MHz    HCLK/42        0\n  //    100-150 MHz   HCLK/62        1\n  //    20-35 MHz     HCLK/16        2\n  //    35-60 MHz     HCLK/26        3\n  //    150-216 MHz   HCLK/102       4  <-- value for Nucleo-F* on max speed\n  //    216-310 MHz   HCLK/124       5\n  //    110, 111 Reserved\n  int mdc_cr;  // Valid values: -1, 0, 1, 2, 3, 4, 5\n\n  uint8_t phy_addr;  // PHY address\n};\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 0\n#endif\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 4\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_stm32f_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                       \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                    \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_stm32f;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                                 \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_INFO((\"Driver: stm32f, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n\n\n#if MG_ENABLE_TCPIP\n#if !defined(MG_ENABLE_DRIVER_STM32H)\n#define MG_ENABLE_DRIVER_STM32H 0\n#endif\n#if !defined(MG_ENABLE_DRIVER_MCXN)\n#define MG_ENABLE_DRIVER_MCXN 0\n#endif\n#if MG_ENABLE_DRIVER_STM32H || MG_ENABLE_DRIVER_MCXN\n\nstruct mg_tcpip_driver_stm32h_data {\n  // MDC clock divider. MDC clock is derived from HCLK, must not exceed 2.5MHz\n  //    HCLK range    DIVIDER    mdc_cr VALUE\n  //    -------------------------------------\n  //                                -1  <-- tell driver to guess the value\n  //    60-100 MHz    HCLK/42        0\n  //    100-150 MHz   HCLK/62        1\n  //    20-35 MHz     HCLK/16        2\n  //    35-60 MHz     HCLK/26        3\n  //    150-250 MHz   HCLK/102       4  <-- value for max speed HSI\n  //    250-300 MHz   HCLK/124       5  <-- value for Nucleo-H* on CSI\n  //    300-500 MHz   HCLK/204       6\n  //    500-800 MHz   HCLK/324       7\n  int mdc_cr;  // Valid values: -1, 0, 1, 2, 3, 4, 5\n\n  uint8_t phy_addr;  // PHY address\n  uint8_t phy_conf;  // PHY config\n};\n\n#ifndef MG_TCPIP_PHY_CONF\n#define MG_TCPIP_PHY_CONF MG_PHY_CLOCKS_MAC\n#endif\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 0\n#endif\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 4\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_stm32h_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                       \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                    \\\n    driver_data_.phy_conf = MG_TCPIP_PHY_CONF;                    \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_stm32h;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                                 \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_INFO((\"Driver: stm32h, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_TM4C) && MG_ENABLE_DRIVER_TM4C\n\nstruct mg_tcpip_driver_tm4c_data {\n  // MDC clock divider. MDC clock is derived from SYSCLK, must not exceed 2.5MHz\n  //    SYSCLK range   DIVIDER   mdc_cr VALUE\n  //    -------------------------------------\n  //                                -1  <-- tell driver to guess the value\n  //    60-100 MHz    SYSCLK/42      0\n  //    100-150 MHz   SYSCLK/62      1  <-- value for EK-TM4C129* on max speed\n  //    20-35 MHz     SYSCLK/16      2\n  //    35-60 MHz     SYSCLK/26      3\n  //    0x4-0xF Reserved\n  int mdc_cr;  // Valid values: -1, 0, 1, 2, 3\n};\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 1\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                               \\\n  do {                                                          \\\n    static struct mg_tcpip_driver_tm4c_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                             \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                     \\\n    mif_.ip = MG_TCPIP_IP;                                      \\\n    mif_.mask = MG_TCPIP_MASK;                                  \\\n    mif_.gw = MG_TCPIP_GW;                                      \\\n    mif_.driver = &mg_tcpip_driver_tm4c;                        \\\n    mif_.driver_data = &driver_data_;                           \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                               \\\n    mg_tcpip_init(mgr, &mif_);                                  \\\n    MG_INFO((\"Driver: tm4c, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_TMS570) && MG_ENABLE_DRIVER_TMS570\nstruct mg_tcpip_driver_tms570_data {\n  int mdc_cr;\n  int phy_addr;\n};\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 0\n#endif\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 1\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                               \\\n  do {                                                          \\\n    static struct mg_tcpip_driver_tms570_data driver_data_;     \\\n    static struct mg_tcpip_if mif_;                             \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                     \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                  \\\n    mif_.ip = MG_TCPIP_IP;                                      \\\n    mif_.mask = MG_TCPIP_MASK;                                  \\\n    mif_.gw = MG_TCPIP_GW;                                      \\\n    mif_.driver = &mg_tcpip_driver_tms570;                      \\\n    mif_.driver_data = &driver_data_;                           \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                               \\\n    mg_tcpip_init(mgr, &mif_);                                  \\\n    MG_INFO((\"Driver: tms570, MAC: %M\", mg_print_mac, mif_.mac));\\\n  } while (0)\n#endif\n\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_XMC) && MG_ENABLE_DRIVER_XMC\n\nstruct mg_tcpip_driver_xmc_data {\n  // 13.2.8.1 Station Management Functions\n  // MDC clock divider (). MDC clock is derived from ETH MAC clock\n  // It must not exceed 2.5MHz\n  // ETH Clock range  DIVIDER       mdc_cr VALUE\n  // --------------------------------------------\n  //                                     -1  <-- tell driver to guess the value\n  // 60-100 MHz       ETH Clock/42        0\n  // 100-150 MHz      ETH Clock/62        1\n  // 20-35 MHz        ETH Clock/16        2\n  // 35-60 MHz        ETH Clock/26        3\n  // 150-250 MHz      ETH Clock/102       4\n  // 250-300 MHz      ETH Clock/124       5\n  // 110, 111 Reserved\n  int mdc_cr;  // Valid values: -1, 0, 1, 2, 3, 4, 5\n  uint8_t phy_addr;\n};\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 0\n#endif\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 4\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_xmc_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                       \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                    \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_xmc;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                                 \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_INFO((\"Driver: xmc, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_XMC7) && MG_ENABLE_DRIVER_XMC7\n\nstruct mg_tcpip_driver_xmc7_data {\n  int mdc_cr;  // Valid values: -1, 0, 1, 2, 3, 4, 5\n  uint8_t phy_addr;\n};\n\n#ifndef MG_TCPIP_PHY_ADDR\n#define MG_TCPIP_PHY_ADDR 0\n#endif\n\n#ifndef MG_DRIVER_MDC_CR\n#define MG_DRIVER_MDC_CR 3\n#endif\n\n#define MG_TCPIP_DRIVER_INIT(mgr)                                 \\\n  do {                                                            \\\n    static struct mg_tcpip_driver_xmc7_data driver_data_;       \\\n    static struct mg_tcpip_if mif_;                               \\\n    driver_data_.mdc_cr = MG_DRIVER_MDC_CR;                       \\\n    driver_data_.phy_addr = MG_TCPIP_PHY_ADDR;                    \\\n    mif_.ip = MG_TCPIP_IP;                                        \\\n    mif_.mask = MG_TCPIP_MASK;                                    \\\n    mif_.gw = MG_TCPIP_GW;                                        \\\n    mif_.driver = &mg_tcpip_driver_xmc7;                        \\\n    mif_.driver_data = &driver_data_;                             \\\n    MG_SET_MAC_ADDRESS(mif_.mac);                                 \\\n    mg_tcpip_init(mgr, &mif_);                                    \\\n    MG_INFO((\"Driver: xmc7, MAC: %M\", mg_print_mac, mif_.mac)); \\\n  } while (0)\n\n#endif\n\n\n#ifdef __cplusplus\n}\n#endif\n#endif  // MONGOOSE_H\n"
  },
  {
    "path": "test/tls_multirec/patched_mongoose.c",
    "content": "// Copyright (c) 2004-2013 Sergey Lyubka\n// Copyright (c) 2013-2024 Cesanta Software Limited\n// All rights reserved\n//\n// This software is dual-licensed: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License version 2 as\n// published by the Free Software Foundation. For the terms of this\n// license, see http://www.gnu.org/licenses/\n//\n// You are free to use this software under the terms of the GNU General\n// Public License, but WITHOUT ANY WARRANTY; without even the implied\n// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n// See the GNU General Public License for more details.\n//\n// Alternatively, you can license this software under a commercial\n// license, as set out in https://www.mongoose.ws/licensing/\n//\n// SPDX-License-Identifier: GPL-2.0-only or commercial\n\n#include \"mongoose.h\"\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/base64.c\"\n#endif\n\n\nstatic int mg_base64_encode_single(int c) {\n  if (c < 26) {\n    return c + 'A';\n  } else if (c < 52) {\n    return c - 26 + 'a';\n  } else if (c < 62) {\n    return c - 52 + '0';\n  } else {\n    return c == 62 ? '+' : '/';\n  }\n}\n\nstatic int mg_base64_decode_single(int c) {\n  if (c >= 'A' && c <= 'Z') {\n    return c - 'A';\n  } else if (c >= 'a' && c <= 'z') {\n    return c + 26 - 'a';\n  } else if (c >= '0' && c <= '9') {\n    return c + 52 - '0';\n  } else if (c == '+') {\n    return 62;\n  } else if (c == '/') {\n    return 63;\n  } else if (c == '=') {\n    return 64;\n  } else {\n    return -1;\n  }\n}\n\nsize_t mg_base64_update(unsigned char ch, char *to, size_t n) {\n  unsigned long rem = (n & 3) % 3;\n  if (rem == 0) {\n    to[n] = (char) mg_base64_encode_single(ch >> 2);\n    to[++n] = (char) ((ch & 3) << 4);\n  } else if (rem == 1) {\n    to[n] = (char) mg_base64_encode_single(to[n] | (ch >> 4));\n    to[++n] = (char) ((ch & 15) << 2);\n  } else {\n    to[n] = (char) mg_base64_encode_single(to[n] | (ch >> 6));\n    to[++n] = (char) mg_base64_encode_single(ch & 63);\n    n++;\n  }\n  return n;\n}\n\nsize_t mg_base64_final(char *to, size_t n) {\n  size_t saved = n;\n  // printf(\"---[%.*s]\\n\", n, to);\n  if (n & 3) n = mg_base64_update(0, to, n);\n  if ((saved & 3) == 2) n--;\n  // printf(\"    %d[%.*s]\\n\", n, n, to);\n  while (n & 3) to[n++] = '=';\n  to[n] = '\\0';\n  return n;\n}\n\nsize_t mg_base64_encode(const unsigned char *p, size_t n, char *to, size_t dl) {\n  size_t i, len = 0;\n  if (dl > 0) to[0] = '\\0';\n  if (dl < ((n / 3) + (n % 3 ? 1 : 0)) * 4 + 1) return 0;\n  for (i = 0; i < n; i++) len = mg_base64_update(p[i], to, len);\n  len = mg_base64_final(to, len);\n  return len;\n}\n\nsize_t mg_base64_decode(const char *src, size_t n, char *dst, size_t dl) {\n  const char *end = src == NULL ? NULL : src + n;  // Cannot add to NULL\n  size_t len = 0;\n  if (dl < n / 4 * 3 + 1) goto fail;\n  while (src != NULL && src + 3 < end) {\n    int a = mg_base64_decode_single(src[0]),\n        b = mg_base64_decode_single(src[1]),\n        c = mg_base64_decode_single(src[2]),\n        d = mg_base64_decode_single(src[3]);\n    if (a == 64 || a < 0 || b == 64 || b < 0 || c < 0 || d < 0) {\n      goto fail;\n    }\n    dst[len++] = (char) ((a << 2) | (b >> 4));\n    if (src[2] != '=') {\n      dst[len++] = (char) ((b << 4) | (c >> 2));\n      if (src[3] != '=') dst[len++] = (char) ((c << 6) | d);\n    }\n    src += 4;\n  }\n  dst[len] = '\\0';\n  return len;\nfail:\n  if (dl > 0) dst[0] = '\\0';\n  return 0;\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/dns.c\"\n#endif\n\n\n\n\n\n\n\n\nstruct dns_data {\n  struct dns_data *next;\n  struct mg_connection *c;\n  uint64_t expire;\n  uint16_t txnid;\n};\n\nstatic void mg_sendnsreq(struct mg_connection *, struct mg_str *, int,\n                         struct mg_dns *, bool);\n\nstatic void mg_dns_free(struct dns_data **head, struct dns_data *d) {\n  LIST_DELETE(struct dns_data, head, d);\n  free(d);\n}\n\nvoid mg_resolve_cancel(struct mg_connection *c) {\n  struct dns_data *tmp, *d;\n  struct dns_data **head = (struct dns_data **) &c->mgr->active_dns_requests;\n  for (d = *head; d != NULL; d = tmp) {\n    tmp = d->next;\n    if (d->c == c) mg_dns_free(head, d);\n  }\n}\n\nstatic size_t mg_dns_parse_name_depth(const uint8_t *s, size_t len, size_t ofs,\n                                      char *to, size_t tolen, size_t j,\n                                      int depth) {\n  size_t i = 0;\n  if (tolen > 0 && depth == 0) to[0] = '\\0';\n  if (depth > 5) return 0;\n  // MG_INFO((\"ofs %lx %x %x\", (unsigned long) ofs, s[ofs], s[ofs + 1]));\n  while (ofs + i + 1 < len) {\n    size_t n = s[ofs + i];\n    if (n == 0) {\n      i++;\n      break;\n    }\n    if (n & 0xc0) {\n      size_t ptr = (((n & 0x3f) << 8) | s[ofs + i + 1]);  // 12 is hdr len\n      // MG_INFO((\"PTR %lx\", (unsigned long) ptr));\n      if (ptr + 1 < len && (s[ptr] & 0xc0) == 0 &&\n          mg_dns_parse_name_depth(s, len, ptr, to, tolen, j, depth + 1) == 0)\n        return 0;\n      i += 2;\n      break;\n    }\n    if (ofs + i + n + 1 >= len) return 0;\n    if (j > 0) {\n      if (j < tolen) to[j] = '.';\n      j++;\n    }\n    if (j + n < tolen) memcpy(&to[j], &s[ofs + i + 1], n);\n    j += n;\n    i += n + 1;\n    if (j < tolen) to[j] = '\\0';  // Zero-terminate this chunk\n    // MG_INFO((\"--> [%s]\", to));\n  }\n  if (tolen > 0) to[tolen - 1] = '\\0';  // Make sure make sure it is nul-term\n  return i;\n}\n\nstatic size_t mg_dns_parse_name(const uint8_t *s, size_t n, size_t ofs,\n                                char *dst, size_t dstlen) {\n  return mg_dns_parse_name_depth(s, n, ofs, dst, dstlen, 0, 0);\n}\n\nsize_t mg_dns_parse_rr(const uint8_t *buf, size_t len, size_t ofs,\n                       bool is_question, struct mg_dns_rr *rr) {\n  const uint8_t *s = buf + ofs, *e = &buf[len];\n\n  memset(rr, 0, sizeof(*rr));\n  if (len < sizeof(struct mg_dns_header)) return 0;  // Too small\n  if (len > 512) return 0;  //  Too large, we don't expect that\n  if (s >= e) return 0;     //  Overflow\n\n  if ((rr->nlen = (uint16_t) mg_dns_parse_name(buf, len, ofs, NULL, 0)) == 0)\n    return 0;\n  s += rr->nlen + 4;\n  if (s > e) return 0;\n  rr->atype = (uint16_t) (((uint16_t) s[-4] << 8) | s[-3]);\n  rr->aclass = (uint16_t) (((uint16_t) s[-2] << 8) | s[-1]);\n  if (is_question) return (size_t) (rr->nlen + 4);\n\n  s += 6;\n  if (s > e) return 0;\n  rr->alen = (uint16_t) (((uint16_t) s[-2] << 8) | s[-1]);\n  if (s + rr->alen > e) return 0;\n  return (size_t) (rr->nlen + rr->alen + 10);\n}\n\nbool mg_dns_parse(const uint8_t *buf, size_t len, struct mg_dns_message *dm) {\n  const struct mg_dns_header *h = (struct mg_dns_header *) buf;\n  struct mg_dns_rr rr;\n  size_t i, n, num_answers, ofs = sizeof(*h);\n  memset(dm, 0, sizeof(*dm));\n\n  if (len < sizeof(*h)) return 0;                // Too small, headers dont fit\n  if (mg_ntohs(h->num_questions) > 1) return 0;  // Sanity\n  num_answers = mg_ntohs(h->num_answers);\n  if (num_answers > 10) {\n    MG_DEBUG((\"Got %u answers, ignoring beyond 10th one\", num_answers));\n    num_answers = 10;  // Sanity cap\n  }\n  dm->txnid = mg_ntohs(h->txnid);\n\n  for (i = 0; i < mg_ntohs(h->num_questions); i++) {\n    if ((n = mg_dns_parse_rr(buf, len, ofs, true, &rr)) == 0) return false;\n    // MG_INFO((\"Q %lu %lu %hu/%hu\", ofs, n, rr.atype, rr.aclass));\n    ofs += n;\n  }\n  for (i = 0; i < num_answers; i++) {\n    if ((n = mg_dns_parse_rr(buf, len, ofs, false, &rr)) == 0) return false;\n    // MG_INFO((\"A -- %lu %lu %hu/%hu %s\", ofs, n, rr.atype, rr.aclass,\n    // dm->name));\n    mg_dns_parse_name(buf, len, ofs, dm->name, sizeof(dm->name));\n    ofs += n;\n\n    if (rr.alen == 4 && rr.atype == 1 && rr.aclass == 1) {\n      dm->addr.is_ip6 = false;\n      memcpy(&dm->addr.ip, &buf[ofs - 4], 4);\n      dm->resolved = true;\n      break;  // Return success\n    } else if (rr.alen == 16 && rr.atype == 28 && rr.aclass == 1) {\n      dm->addr.is_ip6 = true;\n      memcpy(&dm->addr.ip, &buf[ofs - 16], 16);\n      dm->resolved = true;\n      break;  // Return success\n    }\n  }\n  return true;\n}\n\nstatic void dns_cb(struct mg_connection *c, int ev, void *ev_data) {\n  struct dns_data *d, *tmp;\n  struct dns_data **head = (struct dns_data **) &c->mgr->active_dns_requests;\n  if (ev == MG_EV_POLL) {\n    uint64_t now = *(uint64_t *) ev_data;\n    for (d = *head; d != NULL; d = tmp) {\n      tmp = d->next;\n      // MG_DEBUG (\"%lu %lu dns poll\", d->expire, now));\n      if (now > d->expire) mg_error(d->c, \"DNS timeout\");\n    }\n  } else if (ev == MG_EV_READ) {\n    struct mg_dns_message dm;\n    int resolved = 0;\n    if (mg_dns_parse(c->recv.buf, c->recv.len, &dm) == false) {\n      MG_ERROR((\"Unexpected DNS response:\"));\n      mg_hexdump(c->recv.buf, c->recv.len);\n    } else {\n      // MG_VERBOSE((\"%s %d\", dm.name, dm.resolved));\n      for (d = *head; d != NULL; d = tmp) {\n        tmp = d->next;\n        // MG_INFO((\"d %p %hu %hu\", d, d->txnid, dm.txnid));\n        if (dm.txnid != d->txnid) continue;\n        if (d->c->is_resolving) {\n          if (dm.resolved) {\n            dm.addr.port = d->c->rem.port;  // Save port\n            d->c->rem = dm.addr;            // Copy resolved address\n            MG_DEBUG(\n                (\"%lu %s is %M\", d->c->id, dm.name, mg_print_ip, &d->c->rem));\n            mg_connect_resolved(d->c);\n#if MG_ENABLE_IPV6\n          } else if (dm.addr.is_ip6 == false && dm.name[0] != '\\0' &&\n                     c->mgr->use_dns6 == false) {\n            struct mg_str x = mg_str(dm.name);\n            mg_sendnsreq(d->c, &x, c->mgr->dnstimeout, &c->mgr->dns6, true);\n#endif\n          } else {\n            mg_error(d->c, \"%s DNS lookup failed\", dm.name);\n          }\n        } else {\n          MG_ERROR((\"%lu already resolved\", d->c->id));\n        }\n        mg_dns_free(head, d);\n        resolved = 1;\n      }\n    }\n    if (!resolved) MG_ERROR((\"stray DNS reply\"));\n    c->recv.len = 0;\n  } else if (ev == MG_EV_CLOSE) {\n    for (d = *head; d != NULL; d = tmp) {\n      tmp = d->next;\n      mg_error(d->c, \"DNS error\");\n      mg_dns_free(head, d);\n    }\n  }\n}\n\nstatic bool mg_dns_send(struct mg_connection *c, const struct mg_str *name,\n                        uint16_t txnid, bool ipv6) {\n  struct {\n    struct mg_dns_header header;\n    uint8_t data[256];\n  } pkt;\n  size_t i, n;\n  memset(&pkt, 0, sizeof(pkt));\n  pkt.header.txnid = mg_htons(txnid);\n  pkt.header.flags = mg_htons(0x100);\n  pkt.header.num_questions = mg_htons(1);\n  for (i = n = 0; i < sizeof(pkt.data) - 5; i++) {\n    if (name->buf[i] == '.' || i >= name->len) {\n      pkt.data[n] = (uint8_t) (i - n);\n      memcpy(&pkt.data[n + 1], name->buf + n, i - n);\n      n = i + 1;\n    }\n    if (i >= name->len) break;\n  }\n  memcpy(&pkt.data[n], \"\\x00\\x00\\x01\\x00\\x01\", 5);  // A query\n  n += 5;\n  if (ipv6) pkt.data[n - 3] = 0x1c;  // AAAA query\n  // memcpy(&pkt.data[n], \"\\xc0\\x0c\\x00\\x1c\\x00\\x01\", 6);  // AAAA query\n  // n += 6;\n  return mg_send(c, &pkt, sizeof(pkt.header) + n);\n}\n\nstatic void mg_sendnsreq(struct mg_connection *c, struct mg_str *name, int ms,\n                         struct mg_dns *dnsc, bool ipv6) {\n  struct dns_data *d = NULL;\n  if (dnsc->url == NULL) {\n    mg_error(c, \"DNS server URL is NULL. Call mg_mgr_init()\");\n  } else if (dnsc->c == NULL) {\n    dnsc->c = mg_connect(c->mgr, dnsc->url, NULL, NULL);\n    if (dnsc->c != NULL) {\n      dnsc->c->pfn = dns_cb;\n      // dnsc->c->is_hexdumping = 1;\n    }\n  }\n  if (dnsc->c == NULL) {\n    mg_error(c, \"resolver\");\n  } else if ((d = (struct dns_data *) calloc(1, sizeof(*d))) == NULL) {\n    mg_error(c, \"resolve OOM\");\n  } else {\n    struct dns_data *reqs = (struct dns_data *) c->mgr->active_dns_requests;\n    d->txnid = reqs ? (uint16_t) (reqs->txnid + 1) : 1;\n    d->next = (struct dns_data *) c->mgr->active_dns_requests;\n    c->mgr->active_dns_requests = d;\n    d->expire = mg_millis() + (uint64_t) ms;\n    d->c = c;\n    c->is_resolving = 1;\n    MG_VERBOSE((\"%lu resolving %.*s @ %s, txnid %hu\", c->id, (int) name->len,\n                name->buf, dnsc->url, d->txnid));\n    if (!mg_dns_send(dnsc->c, name, d->txnid, ipv6)) {\n      mg_error(dnsc->c, \"DNS send\");\n    }\n  }\n}\n\nvoid mg_resolve(struct mg_connection *c, const char *url) {\n  struct mg_str host = mg_url_host(url);\n  c->rem.port = mg_htons(mg_url_port(url));\n  if (mg_aton(host, &c->rem)) {\n    // host is an IP address, do not fire name resolution\n    mg_connect_resolved(c);\n  } else {\n    // host is not an IP, send DNS resolution request\n    struct mg_dns *dns = c->mgr->use_dns6 ? &c->mgr->dns6 : &c->mgr->dns4;\n    mg_sendnsreq(c, &host, c->mgr->dnstimeout, dns, c->mgr->use_dns6);\n  }\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/event.c\"\n#endif\n\n\n\n\n\n\nvoid mg_call(struct mg_connection *c, int ev, void *ev_data) {\n#if MG_ENABLE_PROFILE\n  const char *names[] = {\n      \"EV_ERROR\",    \"EV_OPEN\",      \"EV_POLL\",      \"EV_RESOLVE\",\n      \"EV_CONNECT\",  \"EV_ACCEPT\",    \"EV_TLS_HS\",    \"EV_READ\",\n      \"EV_WRITE\",    \"EV_CLOSE\",     \"EV_HTTP_MSG\",  \"EV_HTTP_CHUNK\",\n      \"EV_WS_OPEN\",  \"EV_WS_MSG\",    \"EV_WS_CTL\",    \"EV_MQTT_CMD\",\n      \"EV_MQTT_MSG\", \"EV_MQTT_OPEN\", \"EV_SNTP_TIME\", \"EV_USER\"};\n  if (ev != MG_EV_POLL && ev < (int) (sizeof(names) / sizeof(names[0]))) {\n    MG_PROF_ADD(c, names[ev]);\n  }\n#endif\n  // Fire protocol handler first, user handler second. See #2559\n  if (c->pfn != NULL) c->pfn(c, ev, ev_data);\n  if (c->fn != NULL) c->fn(c, ev, ev_data);\n}\n\nvoid mg_error(struct mg_connection *c, const char *fmt, ...) {\n  char buf[64];\n  va_list ap;\n  va_start(ap, fmt);\n  mg_vsnprintf(buf, sizeof(buf), fmt, &ap);\n  va_end(ap);\n  MG_ERROR((\"%lu %ld %s\", c->id, c->fd, buf));\n  c->is_closing = 1;             // Set is_closing before sending MG_EV_CALL\n  mg_call(c, MG_EV_ERROR, buf);  // Let user handler override it\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/flash.c\"\n#endif\n\n\n\n\n\n#if MG_OTA != MG_OTA_NONE && MG_OTA != MG_OTA_CUSTOM\n\nstatic char *s_addr;      // Current address to write to\nstatic size_t s_size;     // Firmware size to flash. In-progress indicator\nstatic uint32_t s_crc32;  // Firmware checksum\n\nbool mg_ota_flash_begin(size_t new_firmware_size, struct mg_flash *flash) {\n  bool ok = false;\n  if (s_size) {\n    MG_ERROR((\"OTA already in progress. Call mg_ota_end()\"));\n  } else {\n    size_t half = flash->size / 2;\n    s_crc32 = 0;\n    s_addr = (char *) flash->start + half;\n    MG_DEBUG((\"FW %lu bytes, max %lu\", new_firmware_size, half));\n    if (new_firmware_size < half) {\n      ok = true;\n      s_size = new_firmware_size;\n      MG_INFO((\"Starting OTA, firmware size %lu\", s_size));\n    } else {\n      MG_ERROR((\"Firmware %lu is too big to fit %lu\", new_firmware_size, half));\n    }\n  }\n  return ok;\n}\n\nbool mg_ota_flash_write(const void *buf, size_t len, struct mg_flash *flash) {\n  bool ok = false;\n  if (s_size == 0) {\n    MG_ERROR((\"OTA is not started, call mg_ota_begin()\"));\n  } else {\n    size_t len_aligned_down = MG_ROUND_DOWN(len, flash->align);\n    if (len_aligned_down) ok = flash->write_fn(s_addr, buf, len_aligned_down);\n    if (len_aligned_down < len) {\n      size_t left = len - len_aligned_down;\n      char tmp[flash->align];\n      memset(tmp, 0xff, sizeof(tmp));\n      memcpy(tmp, (char *) buf + len_aligned_down, left);\n      ok = flash->write_fn(s_addr + len_aligned_down, tmp, sizeof(tmp));\n    }\n    s_crc32 = mg_crc32(s_crc32, (char *) buf, len);  // Update CRC\n    MG_DEBUG((\"%#x %p %lu -> %d\", s_addr - len, buf, len, ok));\n    s_addr += len;\n  }\n  return ok;\n}\n\nbool mg_ota_flash_end(struct mg_flash *flash) {\n  char *base = (char *) flash->start + flash->size / 2;\n  bool ok = false;\n  if (s_size) {\n    size_t size = (size_t) (s_addr - base);\n    uint32_t crc32 = mg_crc32(0, base, s_size);\n    if (size == s_size && crc32 == s_crc32) ok = true;\n    MG_DEBUG((\"CRC: %x/%x, size: %lu/%lu, status: %s\", s_crc32, crc32, s_size,\n              size, ok ? \"ok\" : \"fail\"));\n    s_size = 0;\n    if (ok) ok = flash->swap_fn();\n  }\n  MG_INFO((\"Finishing OTA: %s\", ok ? \"ok\" : \"fail\"));\n  return ok;\n}\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/fmt.c\"\n#endif\n\n\n\n\nstatic bool is_digit(int c) {\n  return c >= '0' && c <= '9';\n}\n\nstatic int addexp(char *buf, int e, int sign) {\n  int n = 0;\n  buf[n++] = 'e';\n  buf[n++] = (char) sign;\n  if (e > 400) return 0;\n  if (e < 10) buf[n++] = '0';\n  if (e >= 100) buf[n++] = (char) (e / 100 + '0'), e -= 100 * (e / 100);\n  if (e >= 10) buf[n++] = (char) (e / 10 + '0'), e -= 10 * (e / 10);\n  buf[n++] = (char) (e + '0');\n  return n;\n}\n\nstatic int xisinf(double x) {\n  union {\n    double f;\n    uint64_t u;\n  } ieee754 = {x};\n  return ((unsigned) (ieee754.u >> 32) & 0x7fffffff) == 0x7ff00000 &&\n         ((unsigned) ieee754.u == 0);\n}\n\nstatic int xisnan(double x) {\n  union {\n    double f;\n    uint64_t u;\n  } ieee754 = {x};\n  return ((unsigned) (ieee754.u >> 32) & 0x7fffffff) +\n             ((unsigned) ieee754.u != 0) >\n         0x7ff00000;\n}\n\nstatic size_t mg_dtoa(char *dst, size_t dstlen, double d, int width, bool tz) {\n  char buf[40];\n  int i, s = 0, n = 0, e = 0;\n  double t, mul, saved;\n  if (d == 0.0) return mg_snprintf(dst, dstlen, \"%s\", \"0\");\n  if (xisinf(d)) return mg_snprintf(dst, dstlen, \"%s\", d > 0 ? \"inf\" : \"-inf\");\n  if (xisnan(d)) return mg_snprintf(dst, dstlen, \"%s\", \"nan\");\n  if (d < 0.0) d = -d, buf[s++] = '-';\n\n  // Round\n  saved = d;\n  if (tz) {\n    mul = 1.0;\n    while (d >= 10.0 && d / mul >= 10.0) mul *= 10.0;\n  } else {\n    mul = 0.1;\n  }\n\n  while (d <= 1.0 && d / mul <= 1.0) mul /= 10.0;\n  for (i = 0, t = mul * 5; i < width; i++) t /= 10.0;\n\n  d += t;\n\n  // Calculate exponent, and 'mul' for scientific representation\n  mul = 1.0;\n  while (d >= 10.0 && d / mul >= 10.0) mul *= 10.0, e++;\n  while (d < 1.0 && d / mul < 1.0) mul /= 10.0, e--;\n  // printf(\" --> %g %d %g %g\\n\", saved, e, t, mul);\n\n  if (tz && e >= width && width > 1) {\n    n = (int) mg_dtoa(buf, sizeof(buf), saved / mul, width, tz);\n    // printf(\" --> %.*g %d [%.*s]\\n\", 10, d / t, e, n, buf);\n    n += addexp(buf + s + n, e, '+');\n    return mg_snprintf(dst, dstlen, \"%.*s\", n, buf);\n  } else if (tz && e <= -width && width > 1) {\n    n = (int) mg_dtoa(buf, sizeof(buf), saved / mul, width, tz);\n    // printf(\" --> %.*g %d [%.*s]\\n\", 10, d / mul, e, n, buf);\n    n += addexp(buf + s + n, -e, '-');\n    return mg_snprintf(dst, dstlen, \"%.*s\", n, buf);\n  } else {\n    int targ_width = width;\n    for (i = 0, t = mul; t >= 1.0 && s + n < (int) sizeof(buf); i++) {\n      int ch = (int) (d / t);\n      if (n > 0 || ch > 0) buf[s + n++] = (char) (ch + '0');\n      d -= ch * t;\n      t /= 10.0;\n    }\n    // printf(\" --> [%g] -> %g %g (%d) [%.*s]\\n\", saved, d, t, n, s + n, buf);\n    if (n == 0) buf[s++] = '0';\n    while (t >= 1.0 && n + s < (int) sizeof(buf)) buf[n++] = '0', t /= 10.0;\n    if (s + n < (int) sizeof(buf)) buf[n + s++] = '.';\n    // printf(\" 1--> [%g] -> [%.*s]\\n\", saved, s + n, buf);\n    if (!tz && n > 0) targ_width = width + n;\n    for (i = 0, t = 0.1; s + n < (int) sizeof(buf) && n < targ_width; i++) {\n      int ch = (int) (d / t);\n      buf[s + n++] = (char) (ch + '0');\n      d -= ch * t;\n      t /= 10.0;\n    }\n  }\n\n  while (tz && n > 0 && buf[s + n - 1] == '0') n--;  // Trim trailing zeroes\n  if (tz && n > 0 && buf[s + n - 1] == '.') n--;           // Trim trailing dot\n  n += s;\n  if (n >= (int) sizeof(buf)) n = (int) sizeof(buf) - 1;\n  buf[n] = '\\0';\n  return mg_snprintf(dst, dstlen, \"%s\", buf);\n}\n\nstatic size_t mg_lld(char *buf, int64_t val, bool is_signed, bool is_hex) {\n  const char *letters = \"0123456789abcdef\";\n  uint64_t v = (uint64_t) val;\n  size_t s = 0, n, i;\n  if (is_signed && val < 0) buf[s++] = '-', v = (uint64_t) (-val);\n  // This loop prints a number in reverse order. I guess this is because we\n  // write numbers from right to left: least significant digit comes last.\n  // Maybe because we use Arabic numbers, and Arabs write RTL?\n  if (is_hex) {\n    for (n = 0; v; v >>= 4) buf[s + n++] = letters[v & 15];\n  } else {\n    for (n = 0; v; v /= 10) buf[s + n++] = letters[v % 10];\n  }\n  // Reverse a string\n  for (i = 0; i < n / 2; i++) {\n    char t = buf[s + i];\n    buf[s + i] = buf[s + n - i - 1], buf[s + n - i - 1] = t;\n  }\n  if (val == 0) buf[n++] = '0';  // Handle special case\n  return n + s;\n}\n\nstatic size_t scpy(void (*out)(char, void *), void *ptr, char *buf,\n                          size_t len) {\n  size_t i = 0;\n  while (i < len && buf[i] != '\\0') out(buf[i++], ptr);\n  return i;\n}\n\nsize_t mg_xprintf(void (*out)(char, void *), void *ptr, const char *fmt, ...) {\n  size_t len = 0;\n  va_list ap;\n  va_start(ap, fmt);\n  len = mg_vxprintf(out, ptr, fmt, &ap);\n  va_end(ap);\n  return len;\n}\n\nsize_t mg_vxprintf(void (*out)(char, void *), void *param, const char *fmt,\n                   va_list *ap) {\n  size_t i = 0, n = 0;\n  while (fmt[i] != '\\0') {\n    if (fmt[i] == '%') {\n      size_t j, k, x = 0, is_long = 0, w = 0 /* width */, pr = ~0U /* prec */;\n      char pad = ' ', minus = 0, c = fmt[++i];\n      if (c == '#') x++, c = fmt[++i];\n      if (c == '-') minus++, c = fmt[++i];\n      if (c == '0') pad = '0', c = fmt[++i];\n      while (is_digit(c)) w *= 10, w += (size_t) (c - '0'), c = fmt[++i];\n      if (c == '.') {\n        c = fmt[++i];\n        if (c == '*') {\n          pr = (size_t) va_arg(*ap, int);\n          c = fmt[++i];\n        } else {\n          pr = 0;\n          while (is_digit(c)) pr *= 10, pr += (size_t) (c - '0'), c = fmt[++i];\n        }\n      }\n      while (c == 'h') c = fmt[++i];  // Treat h and hh as int\n      if (c == 'l') {\n        is_long++, c = fmt[++i];\n        if (c == 'l') is_long++, c = fmt[++i];\n      }\n      if (c == 'p') x = 1, is_long = 1;\n      if (c == 'd' || c == 'u' || c == 'x' || c == 'X' || c == 'p' ||\n          c == 'g' || c == 'f') {\n        bool s = (c == 'd'), h = (c == 'x' || c == 'X' || c == 'p');\n        char tmp[40];\n        size_t xl = x ? 2 : 0;\n        if (c == 'g' || c == 'f') {\n          double v = va_arg(*ap, double);\n          if (pr == ~0U) pr = 6;\n          k = mg_dtoa(tmp, sizeof(tmp), v, (int) pr, c == 'g');\n        } else if (is_long == 2) {\n          int64_t v = va_arg(*ap, int64_t);\n          k = mg_lld(tmp, v, s, h);\n        } else if (is_long == 1) {\n          long v = va_arg(*ap, long);\n          k = mg_lld(tmp, s ? (int64_t) v : (int64_t) (unsigned long) v, s, h);\n        } else {\n          int v = va_arg(*ap, int);\n          k = mg_lld(tmp, s ? (int64_t) v : (int64_t) (unsigned) v, s, h);\n        }\n        for (j = 0; j < xl && w > 0; j++) w--;\n        for (j = 0; pad == ' ' && !minus && k < w && j + k < w; j++)\n          n += scpy(out, param, &pad, 1);\n        n += scpy(out, param, (char *) \"0x\", xl);\n        for (j = 0; pad == '0' && k < w && j + k < w; j++)\n          n += scpy(out, param, &pad, 1);\n        n += scpy(out, param, tmp, k);\n        for (j = 0; pad == ' ' && minus && k < w && j + k < w; j++)\n          n += scpy(out, param, &pad, 1);\n      } else if (c == 'm' || c == 'M') {\n        mg_pm_t f = va_arg(*ap, mg_pm_t);\n        if (c == 'm') out('\"', param);\n        n += f(out, param, ap);\n        if (c == 'm') n += 2, out('\"', param);\n      } else if (c == 'c') {\n        int ch = va_arg(*ap, int);\n        out((char) ch, param);\n        n++;\n      } else if (c == 's') {\n        char *p = va_arg(*ap, char *);\n        if (pr == ~0U) pr = p == NULL ? 0 : strlen(p);\n        for (j = 0; !minus && pr < w && j + pr < w; j++)\n          n += scpy(out, param, &pad, 1);\n        n += scpy(out, param, p, pr);\n        for (j = 0; minus && pr < w && j + pr < w; j++)\n          n += scpy(out, param, &pad, 1);\n      } else if (c == '%') {\n        out('%', param);\n        n++;\n      } else {\n        out('%', param);\n        out(c, param);\n        n += 2;\n      }\n      i++;\n    } else {\n      out(fmt[i], param), n++, i++;\n    }\n  }\n  return n;\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/fs.c\"\n#endif\n\n\n\n\nstruct mg_fd *mg_fs_open(struct mg_fs *fs, const char *path, int flags) {\n  struct mg_fd *fd = (struct mg_fd *) calloc(1, sizeof(*fd));\n  if (fd != NULL) {\n    fd->fd = fs->op(path, flags);\n    fd->fs = fs;\n    if (fd->fd == NULL) {\n      free(fd);\n      fd = NULL;\n    }\n  }\n  return fd;\n}\n\nvoid mg_fs_close(struct mg_fd *fd) {\n  if (fd != NULL) {\n    fd->fs->cl(fd->fd);\n    free(fd);\n  }\n}\n\nstruct mg_str mg_file_read(struct mg_fs *fs, const char *path) {\n  struct mg_str result = {NULL, 0};\n  void *fp;\n  fs->st(path, &result.len, NULL);\n  if ((fp = fs->op(path, MG_FS_READ)) != NULL) {\n    result.buf = (char *) calloc(1, result.len + 1);\n    if (result.buf != NULL &&\n        fs->rd(fp, (void *) result.buf, result.len) != result.len) {\n      free((void *) result.buf);\n      result.buf = NULL;\n    }\n    fs->cl(fp);\n  }\n  if (result.buf == NULL) result.len = 0;\n  return result;\n}\n\nbool mg_file_write(struct mg_fs *fs, const char *path, const void *buf,\n                   size_t len) {\n  bool result = false;\n  struct mg_fd *fd;\n  char tmp[MG_PATH_MAX];\n  mg_snprintf(tmp, sizeof(tmp), \"%s..%d\", path, rand());\n  if ((fd = mg_fs_open(fs, tmp, MG_FS_WRITE)) != NULL) {\n    result = fs->wr(fd->fd, buf, len) == len;\n    mg_fs_close(fd);\n    if (result) {\n      fs->rm(path);\n      fs->mv(tmp, path);\n    } else {\n      fs->rm(tmp);\n    }\n  }\n  return result;\n}\n\nbool mg_file_printf(struct mg_fs *fs, const char *path, const char *fmt, ...) {\n  va_list ap;\n  char *data;\n  bool result = false;\n  va_start(ap, fmt);\n  data = mg_vmprintf(fmt, &ap);\n  va_end(ap);\n  result = mg_file_write(fs, path, data, strlen(data));\n  free(data);\n  return result;\n}\n\n// This helper function allows to scan a filesystem in a sequential way,\n// without using callback function:\n//      char buf[100] = \"\";\n//      while (mg_fs_ls(&mg_fs_posix, \"./\", buf, sizeof(buf))) {\n//        ...\nstatic void mg_fs_ls_fn(const char *filename, void *param) {\n  struct mg_str *s = (struct mg_str *) param;\n  if (s->buf[0] == '\\0') {\n    mg_snprintf((char *) s->buf, s->len, \"%s\", filename);\n  } else if (strcmp(s->buf, filename) == 0) {\n    ((char *) s->buf)[0] = '\\0';  // Fetch next file\n  }\n}\n\nbool mg_fs_ls(struct mg_fs *fs, const char *path, char *buf, size_t len) {\n  struct mg_str s = {buf, len};\n  fs->ls(path, mg_fs_ls_fn, &s);\n  return buf[0] != '\\0';\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/fs_fat.c\"\n#endif\n\n\n\n#if MG_ENABLE_FATFS\n#include <ff.h>\n\nstatic int mg_days_from_epoch(int y, int m, int d) {\n  y -= m <= 2;\n  int era = y / 400;\n  int yoe = y - era * 400;\n  int doy = (153 * (m + (m > 2 ? -3 : 9)) + 2) / 5 + d - 1;\n  int doe = yoe * 365 + yoe / 4 - yoe / 100 + doy;\n  return era * 146097 + doe - 719468;\n}\n\nstatic time_t mg_timegm(const struct tm *t) {\n  int year = t->tm_year + 1900;\n  int month = t->tm_mon;  // 0-11\n  if (month > 11) {\n    year += month / 12;\n    month %= 12;\n  } else if (month < 0) {\n    int years_diff = (11 - month) / 12;\n    year -= years_diff;\n    month += 12 * years_diff;\n  }\n  int x = mg_days_from_epoch(year, month + 1, t->tm_mday);\n  return 60 * (60 * (24L * x + t->tm_hour) + t->tm_min) + t->tm_sec;\n}\n\nstatic time_t ff_time_to_epoch(uint16_t fdate, uint16_t ftime) {\n  struct tm tm;\n  memset(&tm, 0, sizeof(struct tm));\n  tm.tm_sec = (ftime << 1) & 0x3e;\n  tm.tm_min = ((ftime >> 5) & 0x3f);\n  tm.tm_hour = ((ftime >> 11) & 0x1f);\n  tm.tm_mday = (fdate & 0x1f);\n  tm.tm_mon = ((fdate >> 5) & 0x0f) - 1;\n  tm.tm_year = ((fdate >> 9) & 0x7f) + 80;\n  return mg_timegm(&tm);\n}\n\nstatic int ff_stat(const char *path, size_t *size, time_t *mtime) {\n  FILINFO fi;\n  if (path[0] == '\\0') {\n    if (size) *size = 0;\n    if (mtime) *mtime = 0;\n    return MG_FS_DIR;\n  } else if (f_stat(path, &fi) == 0) {\n    if (size) *size = (size_t) fi.fsize;\n    if (mtime) *mtime = ff_time_to_epoch(fi.fdate, fi.ftime);\n    return MG_FS_READ | MG_FS_WRITE | ((fi.fattrib & AM_DIR) ? MG_FS_DIR : 0);\n  } else {\n    return 0;\n  }\n}\n\nstatic void ff_list(const char *dir, void (*fn)(const char *, void *),\n                    void *userdata) {\n  DIR d;\n  FILINFO fi;\n  if (f_opendir(&d, dir) == FR_OK) {\n    while (f_readdir(&d, &fi) == FR_OK && fi.fname[0] != '\\0') {\n      if (!strcmp(fi.fname, \".\") || !strcmp(fi.fname, \"..\")) continue;\n      fn(fi.fname, userdata);\n    }\n    f_closedir(&d);\n  }\n}\n\nstatic void *ff_open(const char *path, int flags) {\n  FIL f;\n  unsigned char mode = FA_READ;\n  if (flags & MG_FS_WRITE) mode |= FA_WRITE | FA_OPEN_ALWAYS | FA_OPEN_APPEND;\n  if (f_open(&f, path, mode) == 0) {\n    FIL *fp;\n    if ((fp = calloc(1, sizeof(*fp))) != NULL) {\n      memcpy(fp, &f, sizeof(*fp));\n      return fp;\n    }\n  }\n  return NULL;\n}\n\nstatic void ff_close(void *fp) {\n  if (fp != NULL) {\n    f_close((FIL *) fp);\n    free(fp);\n  }\n}\n\nstatic size_t ff_read(void *fp, void *buf, size_t len) {\n  UINT n = 0, misalign = ((size_t) buf) & 3;\n  if (misalign) {\n    char aligned[4];\n    f_read((FIL *) fp, aligned, len > misalign ? misalign : len, &n);\n    memcpy(buf, aligned, n);\n  } else {\n    f_read((FIL *) fp, buf, len, &n);\n  }\n  return n;\n}\n\nstatic size_t ff_write(void *fp, const void *buf, size_t len) {\n  UINT n = 0;\n  return f_write((FIL *) fp, (char *) buf, len, &n) == FR_OK ? n : 0;\n}\n\nstatic size_t ff_seek(void *fp, size_t offset) {\n  f_lseek((FIL *) fp, offset);\n  return offset;\n}\n\nstatic bool ff_rename(const char *from, const char *to) {\n  return f_rename(from, to) == FR_OK;\n}\n\nstatic bool ff_remove(const char *path) {\n  return f_unlink(path) == FR_OK;\n}\n\nstatic bool ff_mkdir(const char *path) {\n  return f_mkdir(path) == FR_OK;\n}\n\nstruct mg_fs mg_fs_fat = {ff_stat,  ff_list, ff_open,   ff_close,  ff_read,\n                          ff_write, ff_seek, ff_rename, ff_remove, ff_mkdir};\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/fs_packed.c\"\n#endif\n\n\n\n\nstruct packed_file {\n  const char *data;\n  size_t size;\n  size_t pos;\n};\n\n#if MG_ENABLE_PACKED_FS\n#else\nconst char *mg_unpack(const char *path, size_t *size, time_t *mtime) {\n  if (size != NULL) *size = 0;\n  if (mtime != NULL) *mtime = 0;\n  (void) path;\n  return NULL;\n}\nconst char *mg_unlist(size_t no) {\n  (void) no;\n  return NULL;\n}\n#endif\n\nstruct mg_str mg_unpacked(const char *path) {\n  size_t len = 0;\n  const char *buf = mg_unpack(path, &len, NULL);\n  return mg_str_n(buf, len);\n}\n\nstatic int is_dir_prefix(const char *prefix, size_t n, const char *path) {\n  // MG_INFO((\"[%.*s] [%s] %c\", (int) n, prefix, path, path[n]));\n  return n < strlen(path) && strncmp(prefix, path, n) == 0 &&\n         (n == 0 || path[n] == '/' || path[n - 1] == '/');\n}\n\nstatic int packed_stat(const char *path, size_t *size, time_t *mtime) {\n  const char *p;\n  size_t i, n = strlen(path);\n  if (mg_unpack(path, size, mtime)) return MG_FS_READ;  // Regular file\n  // Scan all files. If `path` is a dir prefix for any of them, it's a dir\n  for (i = 0; (p = mg_unlist(i)) != NULL; i++) {\n    if (is_dir_prefix(path, n, p)) return MG_FS_DIR;\n  }\n  return 0;\n}\n\nstatic void packed_list(const char *dir, void (*fn)(const char *, void *),\n                        void *userdata) {\n  char buf[MG_PATH_MAX], tmp[sizeof(buf)];\n  const char *path, *begin, *end;\n  size_t i, n = strlen(dir);\n  tmp[0] = '\\0';  // Previously listed entry\n  for (i = 0; (path = mg_unlist(i)) != NULL; i++) {\n    if (!is_dir_prefix(dir, n, path)) continue;\n    begin = &path[n + 1];\n    end = strchr(begin, '/');\n    if (end == NULL) end = begin + strlen(begin);\n    mg_snprintf(buf, sizeof(buf), \"%.*s\", (int) (end - begin), begin);\n    buf[sizeof(buf) - 1] = '\\0';\n    // If this entry has been already listed, skip\n    // NOTE: we're assuming that file list is sorted alphabetically\n    if (strcmp(buf, tmp) == 0) continue;\n    fn(buf, userdata);  // Not yet listed, call user function\n    strcpy(tmp, buf);   // And save this entry as listed\n  }\n}\n\nstatic void *packed_open(const char *path, int flags) {\n  size_t size = 0;\n  const char *data = mg_unpack(path, &size, NULL);\n  struct packed_file *fp = NULL;\n  if (data == NULL) return NULL;\n  if (flags & MG_FS_WRITE) return NULL;\n  if ((fp = (struct packed_file *) calloc(1, sizeof(*fp))) != NULL) {\n    fp->size = size;\n    fp->data = data;\n  }\n  return (void *) fp;\n}\n\nstatic void packed_close(void *fp) {\n  if (fp != NULL) free(fp);\n}\n\nstatic size_t packed_read(void *fd, void *buf, size_t len) {\n  struct packed_file *fp = (struct packed_file *) fd;\n  if (fp->pos + len > fp->size) len = fp->size - fp->pos;\n  memcpy(buf, &fp->data[fp->pos], len);\n  fp->pos += len;\n  return len;\n}\n\nstatic size_t packed_write(void *fd, const void *buf, size_t len) {\n  (void) fd, (void) buf, (void) len;\n  return 0;\n}\n\nstatic size_t packed_seek(void *fd, size_t offset) {\n  struct packed_file *fp = (struct packed_file *) fd;\n  fp->pos = offset;\n  if (fp->pos > fp->size) fp->pos = fp->size;\n  return fp->pos;\n}\n\nstatic bool packed_rename(const char *from, const char *to) {\n  (void) from, (void) to;\n  return false;\n}\n\nstatic bool packed_remove(const char *path) {\n  (void) path;\n  return false;\n}\n\nstatic bool packed_mkdir(const char *path) {\n  (void) path;\n  return false;\n}\n\nstruct mg_fs mg_fs_packed = {\n    packed_stat,  packed_list, packed_open,   packed_close,  packed_read,\n    packed_write, packed_seek, packed_rename, packed_remove, packed_mkdir};\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/fs_posix.c\"\n#endif\n\n\n#if MG_ENABLE_POSIX_FS\n\n#ifndef MG_STAT_STRUCT\n#define MG_STAT_STRUCT stat\n#endif\n\n#ifndef MG_STAT_FUNC\n#define MG_STAT_FUNC stat\n#endif\n\nstatic int p_stat(const char *path, size_t *size, time_t *mtime) {\n#if !defined(S_ISDIR)\n  MG_ERROR((\"stat() API is not supported. %p %p %p\", path, size, mtime));\n  return 0;\n#else\n#if MG_ARCH == MG_ARCH_WIN32\n  struct _stati64 st;\n  wchar_t tmp[MG_PATH_MAX];\n  MultiByteToWideChar(CP_UTF8, 0, path, -1, tmp, sizeof(tmp) / sizeof(tmp[0]));\n  if (_wstati64(tmp, &st) != 0) return 0;\n  // If path is a symlink, windows reports 0 in st.st_size.\n  // Get a real file size by opening it and jumping to the end\n  if (st.st_size == 0 && (st.st_mode & _S_IFREG)) {\n    FILE *fp = _wfopen(tmp, L\"rb\");\n    if (fp != NULL) {\n      fseek(fp, 0, SEEK_END);\n      if (ftell(fp) > 0) st.st_size = ftell(fp);  // Use _ftelli64 on win10+\n      fclose(fp);\n    }\n  }\n#else\n  struct MG_STAT_STRUCT st;\n  if (MG_STAT_FUNC(path, &st) != 0) return 0;\n#endif\n  if (size) *size = (size_t) st.st_size;\n  if (mtime) *mtime = st.st_mtime;\n  return MG_FS_READ | MG_FS_WRITE | (S_ISDIR(st.st_mode) ? MG_FS_DIR : 0);\n#endif\n}\n\n#if MG_ARCH == MG_ARCH_WIN32\nstruct dirent {\n  char d_name[MAX_PATH];\n};\n\ntypedef struct win32_dir {\n  HANDLE handle;\n  WIN32_FIND_DATAW info;\n  struct dirent result;\n} DIR;\n\n#if 0\nint gettimeofday(struct timeval *tv, void *tz) {\n  FILETIME ft;\n  unsigned __int64 tmpres = 0;\n\n  if (tv != NULL) {\n    GetSystemTimeAsFileTime(&ft);\n    tmpres |= ft.dwHighDateTime;\n    tmpres <<= 32;\n    tmpres |= ft.dwLowDateTime;\n    tmpres /= 10;  // convert into microseconds\n    tmpres -= (int64_t) 11644473600000000;\n    tv->tv_sec = (long) (tmpres / 1000000UL);\n    tv->tv_usec = (long) (tmpres % 1000000UL);\n  }\n  (void) tz;\n  return 0;\n}\n#endif\n\nstatic int to_wchar(const char *path, wchar_t *wbuf, size_t wbuf_len) {\n  int ret;\n  char buf[MAX_PATH * 2], buf2[MAX_PATH * 2], *p;\n  strncpy(buf, path, sizeof(buf));\n  buf[sizeof(buf) - 1] = '\\0';\n  // Trim trailing slashes. Leave backslash for paths like \"X:\\\"\n  p = buf + strlen(buf) - 1;\n  while (p > buf && p[-1] != ':' && (p[0] == '\\\\' || p[0] == '/')) *p-- = '\\0';\n  memset(wbuf, 0, wbuf_len * sizeof(wchar_t));\n  ret = MultiByteToWideChar(CP_UTF8, 0, buf, -1, wbuf, (int) wbuf_len);\n  // Convert back to Unicode. If doubly-converted string does not match the\n  // original, something is fishy, reject.\n  WideCharToMultiByte(CP_UTF8, 0, wbuf, (int) wbuf_len, buf2, sizeof(buf2),\n                      NULL, NULL);\n  if (strcmp(buf, buf2) != 0) {\n    wbuf[0] = L'\\0';\n    ret = 0;\n  }\n  return ret;\n}\n\nDIR *opendir(const char *name) {\n  DIR *d = NULL;\n  wchar_t wpath[MAX_PATH];\n  DWORD attrs;\n\n  if (name == NULL) {\n    SetLastError(ERROR_BAD_ARGUMENTS);\n  } else if ((d = (DIR *) calloc(1, sizeof(*d))) == NULL) {\n    SetLastError(ERROR_NOT_ENOUGH_MEMORY);\n  } else {\n    to_wchar(name, wpath, sizeof(wpath) / sizeof(wpath[0]));\n    attrs = GetFileAttributesW(wpath);\n    if (attrs != 0Xffffffff && (attrs & FILE_ATTRIBUTE_DIRECTORY)) {\n      (void) wcscat(wpath, L\"\\\\*\");\n      d->handle = FindFirstFileW(wpath, &d->info);\n      d->result.d_name[0] = '\\0';\n    } else {\n      free(d);\n      d = NULL;\n    }\n  }\n  return d;\n}\n\nint closedir(DIR *d) {\n  int result = 0;\n  if (d != NULL) {\n    if (d->handle != INVALID_HANDLE_VALUE)\n      result = FindClose(d->handle) ? 0 : -1;\n    free(d);\n  } else {\n    result = -1;\n    SetLastError(ERROR_BAD_ARGUMENTS);\n  }\n  return result;\n}\n\nstruct dirent *readdir(DIR *d) {\n  struct dirent *result = NULL;\n  if (d != NULL) {\n    memset(&d->result, 0, sizeof(d->result));\n    if (d->handle != INVALID_HANDLE_VALUE) {\n      result = &d->result;\n      WideCharToMultiByte(CP_UTF8, 0, d->info.cFileName, -1, result->d_name,\n                          sizeof(result->d_name), NULL, NULL);\n      if (!FindNextFileW(d->handle, &d->info)) {\n        FindClose(d->handle);\n        d->handle = INVALID_HANDLE_VALUE;\n      }\n    } else {\n      SetLastError(ERROR_FILE_NOT_FOUND);\n    }\n  } else {\n    SetLastError(ERROR_BAD_ARGUMENTS);\n  }\n  return result;\n}\n#endif\n\nstatic void p_list(const char *dir, void (*fn)(const char *, void *),\n                   void *userdata) {\n#if MG_ENABLE_DIRLIST\n  struct dirent *dp;\n  DIR *dirp;\n  if ((dirp = (opendir(dir))) == NULL) return;\n  while ((dp = readdir(dirp)) != NULL) {\n    if (!strcmp(dp->d_name, \".\") || !strcmp(dp->d_name, \"..\")) continue;\n    fn(dp->d_name, userdata);\n  }\n  closedir(dirp);\n#else\n  (void) dir, (void) fn, (void) userdata;\n#endif\n}\n\nstatic void *p_open(const char *path, int flags) {\n#if MG_ARCH == MG_ARCH_WIN32\n  const char *mode = flags == MG_FS_READ ? \"rb\" : \"a+b\";\n  wchar_t b1[MG_PATH_MAX], b2[10];\n  MultiByteToWideChar(CP_UTF8, 0, path, -1, b1, sizeof(b1) / sizeof(b1[0]));\n  MultiByteToWideChar(CP_UTF8, 0, mode, -1, b2, sizeof(b2) / sizeof(b2[0]));\n  return (void *) _wfopen(b1, b2);\n#else\n  const char *mode = flags == MG_FS_READ ? \"rbe\" : \"a+be\";  // e for CLOEXEC\n  return (void *) fopen(path, mode);\n#endif\n}\n\nstatic void p_close(void *fp) {\n  fclose((FILE *) fp);\n}\n\nstatic size_t p_read(void *fp, void *buf, size_t len) {\n  return fread(buf, 1, len, (FILE *) fp);\n}\n\nstatic size_t p_write(void *fp, const void *buf, size_t len) {\n  return fwrite(buf, 1, len, (FILE *) fp);\n}\n\nstatic size_t p_seek(void *fp, size_t offset) {\n#if (defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS == 64) ||  \\\n    (defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 200112L) || \\\n    (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 600)\n  if (fseeko((FILE *) fp, (off_t) offset, SEEK_SET) != 0) (void) 0;\n#else\n  if (fseek((FILE *) fp, (long) offset, SEEK_SET) != 0) (void) 0;\n#endif\n  return (size_t) ftell((FILE *) fp);\n}\n\nstatic bool p_rename(const char *from, const char *to) {\n  return rename(from, to) == 0;\n}\n\nstatic bool p_remove(const char *path) {\n  return remove(path) == 0;\n}\n\nstatic bool p_mkdir(const char *path) {\n  return mkdir(path, 0775) == 0;\n}\n\n#else\n\nstatic int p_stat(const char *path, size_t *size, time_t *mtime) {\n  (void) path, (void) size, (void) mtime;\n  return 0;\n}\nstatic void p_list(const char *path, void (*fn)(const char *, void *),\n                   void *userdata) {\n  (void) path, (void) fn, (void) userdata;\n}\nstatic void *p_open(const char *path, int flags) {\n  (void) path, (void) flags;\n  return NULL;\n}\nstatic void p_close(void *fp) {\n  (void) fp;\n}\nstatic size_t p_read(void *fd, void *buf, size_t len) {\n  (void) fd, (void) buf, (void) len;\n  return 0;\n}\nstatic size_t p_write(void *fd, const void *buf, size_t len) {\n  (void) fd, (void) buf, (void) len;\n  return 0;\n}\nstatic size_t p_seek(void *fd, size_t offset) {\n  (void) fd, (void) offset;\n  return (size_t) ~0;\n}\nstatic bool p_rename(const char *from, const char *to) {\n  (void) from, (void) to;\n  return false;\n}\nstatic bool p_remove(const char *path) {\n  (void) path;\n  return false;\n}\nstatic bool p_mkdir(const char *path) {\n  (void) path;\n  return false;\n}\n#endif\n\nstruct mg_fs mg_fs_posix = {p_stat,  p_list, p_open,   p_close,  p_read,\n                            p_write, p_seek, p_rename, p_remove, p_mkdir};\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/http.c\"\n#endif\n\n\n\n\n\n\n\n\n\n\n\n\n\nstatic int mg_ncasecmp(const char *s1, const char *s2, size_t len) {\n  int diff = 0;\n  if (len > 0) do {\n      int c = *s1++, d = *s2++;\n      if (c >= 'A' && c <= 'Z') c += 'a' - 'A';\n      if (d >= 'A' && d <= 'Z') d += 'a' - 'A';\n      diff = c - d;\n    } while (diff == 0 && s1[-1] != '\\0' && --len > 0);\n  return diff;\n}\n\nbool mg_to_size_t(struct mg_str str, size_t *val);\nbool mg_to_size_t(struct mg_str str, size_t *val) {\n  size_t i = 0, max = (size_t) -1, max2 = max / 10, result = 0, ndigits = 0;\n  while (i < str.len && (str.buf[i] == ' ' || str.buf[i] == '\\t')) i++;\n  if (i < str.len && str.buf[i] == '-') return false;\n  while (i < str.len && str.buf[i] >= '0' && str.buf[i] <= '9') {\n    size_t digit = (size_t) (str.buf[i] - '0');\n    if (result > max2) return false;  // Overflow\n    result *= 10;\n    if (result > max - digit) return false;  // Overflow\n    result += digit;\n    i++, ndigits++;\n  }\n  while (i < str.len && (str.buf[i] == ' ' || str.buf[i] == '\\t')) i++;\n  if (ndigits == 0) return false;  // #2322: Content-Length = 1 * DIGIT\n  if (i != str.len) return false;  // Ditto\n  *val = (size_t) result;\n  return true;\n}\n\n// Chunk deletion marker is the MSB in the \"processed\" counter\n#define MG_DMARK ((size_t) 1 << (sizeof(size_t) * 8 - 1))\n\n// Multipart POST example:\n// --xyz\n// Content-Disposition: form-data; name=\"val\"\n//\n// abcdef\n// --xyz\n// Content-Disposition: form-data; name=\"foo\"; filename=\"a.txt\"\n// Content-Type: text/plain\n//\n// hello world\n//\n// --xyz--\nsize_t mg_http_next_multipart(struct mg_str body, size_t ofs,\n                              struct mg_http_part *part) {\n  struct mg_str cd = mg_str_n(\"Content-Disposition\", 19);\n  const char *s = body.buf;\n  size_t b = ofs, h1, h2, b1, b2, max = body.len;\n\n  // Init part params\n  if (part != NULL) part->name = part->filename = part->body = mg_str_n(0, 0);\n\n  // Skip boundary\n  while (b + 2 < max && s[b] != '\\r' && s[b + 1] != '\\n') b++;\n  if (b <= ofs || b + 2 >= max) return 0;\n  // MG_INFO((\"B: %zu %zu [%.*s]\", ofs, b - ofs, (int) (b - ofs), s));\n\n  // Skip headers\n  h1 = h2 = b + 2;\n  for (;;) {\n    while (h2 + 2 < max && s[h2] != '\\r' && s[h2 + 1] != '\\n') h2++;\n    if (h2 == h1) break;\n    if (h2 + 2 >= max) return 0;\n    // MG_INFO((\"Header: [%.*s]\", (int) (h2 - h1), &s[h1]));\n    if (part != NULL && h1 + cd.len + 2 < h2 && s[h1 + cd.len] == ':' &&\n        mg_ncasecmp(&s[h1], cd.buf, cd.len) == 0) {\n      struct mg_str v = mg_str_n(&s[h1 + cd.len + 2], h2 - (h1 + cd.len + 2));\n      part->name = mg_http_get_header_var(v, mg_str_n(\"name\", 4));\n      part->filename = mg_http_get_header_var(v, mg_str_n(\"filename\", 8));\n    }\n    h1 = h2 = h2 + 2;\n  }\n  b1 = b2 = h2 + 2;\n  while (b2 + 2 + (b - ofs) + 2 < max && !(s[b2] == '\\r' && s[b2 + 1] == '\\n' &&\n                                           memcmp(&s[b2 + 2], s, b - ofs) == 0))\n    b2++;\n\n  if (b2 + 2 >= max) return 0;\n  if (part != NULL) part->body = mg_str_n(&s[b1], b2 - b1);\n  // MG_INFO((\"Body: [%.*s]\", (int) (b2 - b1), &s[b1]));\n  return b2 + 2;\n}\n\nvoid mg_http_bauth(struct mg_connection *c, const char *user,\n                   const char *pass) {\n  struct mg_str u = mg_str(user), p = mg_str(pass);\n  size_t need = c->send.len + 36 + (u.len + p.len) * 2;\n  if (c->send.size < need) mg_iobuf_resize(&c->send, need);\n  if (c->send.size >= need) {\n    size_t i, n = 0;\n    char *buf = (char *) &c->send.buf[c->send.len];\n    memcpy(buf, \"Authorization: Basic \", 21);  // DON'T use mg_send!\n    for (i = 0; i < u.len; i++) {\n      n = mg_base64_update(((unsigned char *) u.buf)[i], buf + 21, n);\n    }\n    if (p.len > 0) {\n      n = mg_base64_update(':', buf + 21, n);\n      for (i = 0; i < p.len; i++) {\n        n = mg_base64_update(((unsigned char *) p.buf)[i], buf + 21, n);\n      }\n    }\n    n = mg_base64_final(buf + 21, n);\n    c->send.len += 21 + (size_t) n + 2;\n    memcpy(&c->send.buf[c->send.len - 2], \"\\r\\n\", 2);\n  } else {\n    MG_ERROR((\"%lu oom %d->%d \", c->id, (int) c->send.size, (int) need));\n  }\n}\n\nstruct mg_str mg_http_var(struct mg_str buf, struct mg_str name) {\n  struct mg_str entry, k, v, result = mg_str_n(NULL, 0);\n  while (mg_span(buf, &entry, &buf, '&')) {\n    if (mg_span(entry, &k, &v, '=') && name.len == k.len &&\n        mg_ncasecmp(name.buf, k.buf, k.len) == 0) {\n      result = v;\n      break;\n    }\n  }\n  return result;\n}\n\nint mg_http_get_var(const struct mg_str *buf, const char *name, char *dst,\n                    size_t dst_len) {\n  int len;\n  if (dst != NULL && dst_len > 0) {\n    dst[0] = '\\0';  // If destination buffer is valid, always nul-terminate it\n  }\n  if (dst == NULL || dst_len == 0) {\n    len = -2;  // Bad destination\n  } else if (buf->buf == NULL || name == NULL || buf->len == 0) {\n    len = -1;  // Bad source\n  } else {\n    struct mg_str v = mg_http_var(*buf, mg_str(name));\n    if (v.buf == NULL) {\n      len = -4;  // Name does not exist\n    } else {\n      len = mg_url_decode(v.buf, v.len, dst, dst_len, 1);\n      if (len < 0) len = -3;  // Failed to decode\n    }\n  }\n  return len;\n}\n\nstatic bool isx(int c) {\n  return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') ||\n         (c >= 'A' && c <= 'F');\n}\n\nint mg_url_decode(const char *src, size_t src_len, char *dst, size_t dst_len,\n                  int is_form_url_encoded) {\n  size_t i, j;\n  for (i = j = 0; i < src_len && j + 1 < dst_len; i++, j++) {\n    if (src[i] == '%') {\n      // Use `i + 2 < src_len`, not `i < src_len - 2`, note small src_len\n      if (i + 2 < src_len && isx(src[i + 1]) && isx(src[i + 2])) {\n        mg_str_to_num(mg_str_n(src + i + 1, 2), 16, &dst[j], sizeof(uint8_t));\n        i += 2;\n      } else {\n        return -1;\n      }\n    } else if (is_form_url_encoded && src[i] == '+') {\n      dst[j] = ' ';\n    } else {\n      dst[j] = src[i];\n    }\n  }\n  if (j < dst_len) dst[j] = '\\0';  // Null-terminate the destination\n  return i >= src_len && j < dst_len ? (int) j : -1;\n}\n\nstatic bool isok(uint8_t c) {\n  return c == '\\n' || c == '\\r' || c == '\\t' || c >= ' ';\n}\n\nint mg_http_get_request_len(const unsigned char *buf, size_t buf_len) {\n  size_t i;\n  for (i = 0; i < buf_len; i++) {\n    if (!isok(buf[i])) return -1;\n    if ((i > 0 && buf[i] == '\\n' && buf[i - 1] == '\\n') ||\n        (i > 3 && buf[i] == '\\n' && buf[i - 1] == '\\r' && buf[i - 2] == '\\n'))\n      return (int) i + 1;\n  }\n  return 0;\n}\nstruct mg_str *mg_http_get_header(struct mg_http_message *h, const char *name) {\n  size_t i, n = strlen(name), max = sizeof(h->headers) / sizeof(h->headers[0]);\n  for (i = 0; i < max && h->headers[i].name.len > 0; i++) {\n    struct mg_str *k = &h->headers[i].name, *v = &h->headers[i].value;\n    if (n == k->len && mg_ncasecmp(k->buf, name, n) == 0) return v;\n  }\n  return NULL;\n}\n\n// Is it a valid utf-8 continuation byte\nstatic bool vcb(uint8_t c) {\n  return (c & 0xc0) == 0x80;\n}\n\n// Get character length (valid utf-8). Used to parse method, URI, headers\nstatic size_t clen(const char *s, const char *end) {\n  const unsigned char *u = (unsigned char *) s, c = *u;\n  long n = (long) (end - s);\n  if (c > ' ' && c < '~') return 1;  // Usual ascii printed char\n  if ((c & 0xe0) == 0xc0 && n > 1 && vcb(u[1])) return 2;  // 2-byte UTF8\n  if ((c & 0xf0) == 0xe0 && n > 2 && vcb(u[1]) && vcb(u[2])) return 3;\n  if ((c & 0xf8) == 0xf0 && n > 3 && vcb(u[1]) && vcb(u[2]) && vcb(u[3]))\n    return 4;\n  return 0;\n}\n\n// Skip until the newline. Return advanced `s`, or NULL on error\nstatic const char *skiptorn(const char *s, const char *end, struct mg_str *v) {\n  v->buf = (char *) s;\n  while (s < end && s[0] != '\\n' && s[0] != '\\r') s++, v->len++;  // To newline\n  if (s >= end || (s[0] == '\\r' && s[1] != '\\n')) return NULL;    // Stray \\r\n  if (s < end && s[0] == '\\r') s++;                               // Skip \\r\n  if (s >= end || *s++ != '\\n') return NULL;                      // Skip \\n\n  return s;\n}\n\nstatic bool mg_http_parse_headers(const char *s, const char *end,\n                                  struct mg_http_header *h, size_t max_hdrs) {\n  size_t i, n;\n  for (i = 0; i < max_hdrs; i++) {\n    struct mg_str k = {NULL, 0}, v = {NULL, 0};\n    if (s >= end) return false;\n    if (s[0] == '\\n' || (s[0] == '\\r' && s[1] == '\\n')) break;\n    k.buf = (char *) s;\n    while (s < end && s[0] != ':' && (n = clen(s, end)) > 0) s += n, k.len += n;\n    if (k.len == 0) return false;                     // Empty name\n    if (s >= end || clen(s, end) == 0) return false;  // Invalid UTF-8\n    if (*s++ != ':') return false;  // Invalid, not followed by :\n    // if (clen(s, end) == 0) return false;        // Invalid UTF-8\n    while (s < end && (s[0] == ' ' || s[0] == '\\t')) s++;  // Skip spaces\n    if ((s = skiptorn(s, end, &v)) == NULL) return false;\n    while (v.len > 0 && (v.buf[v.len - 1] == ' ' || v.buf[v.len - 1] == '\\t')) {\n      v.len--;  // Trim spaces\n    }\n    // MG_INFO((\"--HH [%.*s] [%.*s]\", (int) k.len, k.buf, (int) v.len, v.buf));\n    h[i].name = k, h[i].value = v;  // Success. Assign values\n  }\n  return true;\n}\n\nint mg_http_parse(const char *s, size_t len, struct mg_http_message *hm) {\n  int is_response, req_len = mg_http_get_request_len((unsigned char *) s, len);\n  const char *end = s == NULL ? NULL : s + req_len, *qs;  // Cannot add to NULL\n  const struct mg_str *cl;\n  size_t n;\n  bool version_prefix_valid;\n\n  memset(hm, 0, sizeof(*hm));\n  if (req_len <= 0) return req_len;\n\n  hm->message.buf = hm->head.buf = (char *) s;\n  hm->body.buf = (char *) end;\n  hm->head.len = (size_t) req_len;\n  hm->message.len = hm->body.len = (size_t) -1;  // Set body length to infinite\n\n  // Parse request line\n  hm->method.buf = (char *) s;\n  while (s < end && (n = clen(s, end)) > 0) s += n, hm->method.len += n;\n  while (s < end && s[0] == ' ') s++;  // Skip spaces\n  hm->uri.buf = (char *) s;\n  while (s < end && (n = clen(s, end)) > 0) s += n, hm->uri.len += n;\n  while (s < end && s[0] == ' ') s++;  // Skip spaces\n  is_response = hm->method.len > 5 &&\n                (mg_ncasecmp(hm->method.buf, \"HTTP/\", 5) == 0);\n  if ((s = skiptorn(s, end, &hm->proto)) == NULL) return false;\n  // If we're given a version, check that it is HTTP/x.x\n  version_prefix_valid = hm->proto.len > 5 &&\n                         (mg_ncasecmp(hm->proto.buf, \"HTTP/\", 5) == 0);\n  if (!is_response && hm->proto.len > 0 &&\n    (!version_prefix_valid || hm->proto.len != 8 ||\n    (hm->proto.buf[5] < '0' || hm->proto.buf[5] > '9') ||\n    (hm->proto.buf[6] != '.') ||\n    (hm->proto.buf[7] < '0' || hm->proto.buf[7] > '9'))) {\n    return -1;\n  }\n\n  // If URI contains '?' character, setup query string\n  if ((qs = (const char *) memchr(hm->uri.buf, '?', hm->uri.len)) != NULL) {\n    hm->query.buf = (char *) qs + 1;\n    hm->query.len = (size_t) (&hm->uri.buf[hm->uri.len] - (qs + 1));\n    hm->uri.len = (size_t) (qs - hm->uri.buf);\n  }\n\n  // Sanity check. Allow protocol/reason to be empty\n  // Do this check after hm->method.len and hm->uri.len are finalised\n  if (hm->method.len == 0 || hm->uri.len == 0) return -1;\n\n  if (!mg_http_parse_headers(s, end, hm->headers,\n                             sizeof(hm->headers) / sizeof(hm->headers[0])))\n    return -1;  // error when parsing\n  if ((cl = mg_http_get_header(hm, \"Content-Length\")) != NULL) {\n    if (mg_to_size_t(*cl, &hm->body.len) == false) return -1;\n    hm->message.len = (size_t) req_len + hm->body.len;\n  }\n\n  // mg_http_parse() is used to parse both HTTP requests and HTTP\n  // responses. If HTTP response does not have Content-Length set, then\n  // body is read until socket is closed, i.e. body.len is infinite (~0).\n  //\n  // For HTTP requests though, according to\n  // http://tools.ietf.org/html/rfc7231#section-8.1.3,\n  // only POST and PUT methods have defined body semantics.\n  // Therefore, if Content-Length is not specified and methods are\n  // not one of PUT or POST, set body length to 0.\n  //\n  // So, if it is HTTP request, and Content-Length is not set,\n  // and method is not (PUT or POST) then reset body length to zero.\n  if (hm->body.len == (size_t) ~0 && !is_response &&\n      mg_strcasecmp(hm->method, mg_str(\"PUT\")) != 0 &&\n      mg_strcasecmp(hm->method, mg_str(\"POST\")) != 0) {\n    hm->body.len = 0;\n    hm->message.len = (size_t) req_len;\n  }\n\n  // The 204 (No content) responses also have 0 body length\n  if (hm->body.len == (size_t) ~0 && is_response &&\n      mg_strcasecmp(hm->uri, mg_str(\"204\")) == 0) {\n    hm->body.len = 0;\n    hm->message.len = (size_t) req_len;\n  }\n  if (hm->message.len < (size_t) req_len) return -1;  // Overflow protection\n\n  return req_len;\n}\n\nstatic void mg_http_vprintf_chunk(struct mg_connection *c, const char *fmt,\n                                  va_list *ap) {\n  size_t len = c->send.len;\n  mg_send(c, \"        \\r\\n\", 10);\n  mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, ap);\n  if (c->send.len >= len + 10) {\n    mg_snprintf((char *) c->send.buf + len, 9, \"%08lx\", c->send.len - len - 10);\n    c->send.buf[len + 8] = '\\r';\n    if (c->send.len == len + 10) c->is_resp = 0;  // Last chunk, reset marker\n  }\n  mg_send(c, \"\\r\\n\", 2);\n}\n\nvoid mg_http_printf_chunk(struct mg_connection *c, const char *fmt, ...) {\n  va_list ap;\n  va_start(ap, fmt);\n  mg_http_vprintf_chunk(c, fmt, &ap);\n  va_end(ap);\n}\n\nvoid mg_http_write_chunk(struct mg_connection *c, const char *buf, size_t len) {\n  mg_printf(c, \"%lx\\r\\n\", (unsigned long) len);\n  mg_send(c, buf, len);\n  mg_send(c, \"\\r\\n\", 2);\n  if (len == 0) c->is_resp = 0;\n}\n\n// clang-format off\nstatic const char *mg_http_status_code_str(int status_code) {\n  switch (status_code) {\n    case 100: return \"Continue\";\n    case 101: return \"Switching Protocols\";\n    case 102: return \"Processing\";\n    case 200: return \"OK\";\n    case 201: return \"Created\";\n    case 202: return \"Accepted\";\n    case 203: return \"Non-authoritative Information\";\n    case 204: return \"No Content\";\n    case 205: return \"Reset Content\";\n    case 206: return \"Partial Content\";\n    case 207: return \"Multi-Status\";\n    case 208: return \"Already Reported\";\n    case 226: return \"IM Used\";\n    case 300: return \"Multiple Choices\";\n    case 301: return \"Moved Permanently\";\n    case 302: return \"Found\";\n    case 303: return \"See Other\";\n    case 304: return \"Not Modified\";\n    case 305: return \"Use Proxy\";\n    case 307: return \"Temporary Redirect\";\n    case 308: return \"Permanent Redirect\";\n    case 400: return \"Bad Request\";\n    case 401: return \"Unauthorized\";\n    case 402: return \"Payment Required\";\n    case 403: return \"Forbidden\";\n    case 404: return \"Not Found\";\n    case 405: return \"Method Not Allowed\";\n    case 406: return \"Not Acceptable\";\n    case 407: return \"Proxy Authentication Required\";\n    case 408: return \"Request Timeout\";\n    case 409: return \"Conflict\";\n    case 410: return \"Gone\";\n    case 411: return \"Length Required\";\n    case 412: return \"Precondition Failed\";\n    case 413: return \"Payload Too Large\";\n    case 414: return \"Request-URI Too Long\";\n    case 415: return \"Unsupported Media Type\";\n    case 416: return \"Requested Range Not Satisfiable\";\n    case 417: return \"Expectation Failed\";\n    case 418: return \"I'm a teapot\";\n    case 421: return \"Misdirected Request\";\n    case 422: return \"Unprocessable Entity\";\n    case 423: return \"Locked\";\n    case 424: return \"Failed Dependency\";\n    case 426: return \"Upgrade Required\";\n    case 428: return \"Precondition Required\";\n    case 429: return \"Too Many Requests\";\n    case 431: return \"Request Header Fields Too Large\";\n    case 444: return \"Connection Closed Without Response\";\n    case 451: return \"Unavailable For Legal Reasons\";\n    case 499: return \"Client Closed Request\";\n    case 500: return \"Internal Server Error\";\n    case 501: return \"Not Implemented\";\n    case 502: return \"Bad Gateway\";\n    case 503: return \"Service Unavailable\";\n    case 504: return \"Gateway Timeout\";\n    case 505: return \"HTTP Version Not Supported\";\n    case 506: return \"Variant Also Negotiates\";\n    case 507: return \"Insufficient Storage\";\n    case 508: return \"Loop Detected\";\n    case 510: return \"Not Extended\";\n    case 511: return \"Network Authentication Required\";\n    case 599: return \"Network Connect Timeout Error\";\n    default: return \"\";\n  }\n}\n// clang-format on\n\nvoid mg_http_reply(struct mg_connection *c, int code, const char *headers,\n                   const char *fmt, ...) {\n  va_list ap;\n  size_t len;\n  mg_printf(c, \"HTTP/1.1 %d %s\\r\\n%sContent-Length:            \\r\\n\\r\\n\", code,\n            mg_http_status_code_str(code), headers == NULL ? \"\" : headers);\n  len = c->send.len;\n  va_start(ap, fmt);\n  mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, &ap);\n  va_end(ap);\n  if (c->send.len > 16) {\n    size_t n = mg_snprintf((char *) &c->send.buf[len - 15], 11, \"%-10lu\",\n                           (unsigned long) (c->send.len - len));\n    c->send.buf[len - 15 + n] = ' ';  // Change ending 0 to space\n  }\n  c->is_resp = 0;\n}\n\nstatic void http_cb(struct mg_connection *, int, void *);\nstatic void restore_http_cb(struct mg_connection *c) {\n  mg_fs_close((struct mg_fd *) c->pfn_data);\n  c->pfn_data = NULL;\n  c->pfn = http_cb;\n  c->is_resp = 0;\n}\n\nchar *mg_http_etag(char *buf, size_t len, size_t size, time_t mtime);\nchar *mg_http_etag(char *buf, size_t len, size_t size, time_t mtime) {\n  mg_snprintf(buf, len, \"\\\"%lld.%lld\\\"\", (int64_t) mtime, (int64_t) size);\n  return buf;\n}\n\nstatic void static_cb(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_WRITE || ev == MG_EV_POLL) {\n    struct mg_fd *fd = (struct mg_fd *) c->pfn_data;\n    // Read to send IO buffer directly, avoid extra on-stack buffer\n    size_t n, max = MG_IO_SIZE, space;\n    size_t *cl = (size_t *) &c->data[(sizeof(c->data) - sizeof(size_t)) /\n                                     sizeof(size_t) * sizeof(size_t)];\n    if (c->send.size < max) mg_iobuf_resize(&c->send, max);\n    if (c->send.len >= c->send.size) return;  // Rate limit\n    if ((space = c->send.size - c->send.len) > *cl) space = *cl;\n    n = fd->fs->rd(fd->fd, c->send.buf + c->send.len, space);\n    c->send.len += n;\n    *cl -= n;\n    if (n == 0) restore_http_cb(c);\n  } else if (ev == MG_EV_CLOSE) {\n    restore_http_cb(c);\n  }\n  (void) ev_data;\n}\n\n// Known mime types. Keep it outside guess_content_type() function, since\n// some environments don't like it defined there.\n// clang-format off\n#define MG_C_STR(a) { (char *) (a), sizeof(a) - 1 }\nstatic struct mg_str s_known_types[] = {\n    MG_C_STR(\"html\"), MG_C_STR(\"text/html; charset=utf-8\"),\n    MG_C_STR(\"htm\"), MG_C_STR(\"text/html; charset=utf-8\"),\n    MG_C_STR(\"css\"), MG_C_STR(\"text/css; charset=utf-8\"),\n    MG_C_STR(\"js\"), MG_C_STR(\"text/javascript; charset=utf-8\"),\n    MG_C_STR(\"gif\"), MG_C_STR(\"image/gif\"),\n    MG_C_STR(\"png\"), MG_C_STR(\"image/png\"),\n    MG_C_STR(\"jpg\"), MG_C_STR(\"image/jpeg\"),\n    MG_C_STR(\"jpeg\"), MG_C_STR(\"image/jpeg\"),\n    MG_C_STR(\"woff\"), MG_C_STR(\"font/woff\"),\n    MG_C_STR(\"ttf\"), MG_C_STR(\"font/ttf\"),\n    MG_C_STR(\"svg\"), MG_C_STR(\"image/svg+xml\"),\n    MG_C_STR(\"txt\"), MG_C_STR(\"text/plain; charset=utf-8\"),\n    MG_C_STR(\"avi\"), MG_C_STR(\"video/x-msvideo\"),\n    MG_C_STR(\"csv\"), MG_C_STR(\"text/csv\"),\n    MG_C_STR(\"doc\"), MG_C_STR(\"application/msword\"),\n    MG_C_STR(\"exe\"), MG_C_STR(\"application/octet-stream\"),\n    MG_C_STR(\"gz\"), MG_C_STR(\"application/gzip\"),\n    MG_C_STR(\"ico\"), MG_C_STR(\"image/x-icon\"),\n    MG_C_STR(\"json\"), MG_C_STR(\"application/json\"),\n    MG_C_STR(\"mov\"), MG_C_STR(\"video/quicktime\"),\n    MG_C_STR(\"mp3\"), MG_C_STR(\"audio/mpeg\"),\n    MG_C_STR(\"mp4\"), MG_C_STR(\"video/mp4\"),\n    MG_C_STR(\"mpeg\"), MG_C_STR(\"video/mpeg\"),\n    MG_C_STR(\"pdf\"), MG_C_STR(\"application/pdf\"),\n    MG_C_STR(\"shtml\"), MG_C_STR(\"text/html; charset=utf-8\"),\n    MG_C_STR(\"tgz\"), MG_C_STR(\"application/tar-gz\"),\n    MG_C_STR(\"wav\"), MG_C_STR(\"audio/wav\"),\n    MG_C_STR(\"webp\"), MG_C_STR(\"image/webp\"),\n    MG_C_STR(\"zip\"), MG_C_STR(\"application/zip\"),\n    MG_C_STR(\"3gp\"), MG_C_STR(\"video/3gpp\"),\n    {0, 0},\n};\n// clang-format on\n\nstatic struct mg_str guess_content_type(struct mg_str path, const char *extra) {\n  struct mg_str entry, k, v, s = mg_str(extra), asterisk = mg_str_n(\"*\", 1);\n  size_t i = 0;\n\n  // Shrink path to its extension only\n  while (i < path.len && path.buf[path.len - i - 1] != '.') i++;\n  path.buf += path.len - i;\n  path.len = i;\n\n  // Process user-provided mime type overrides, if any\n  while (mg_span(s, &entry, &s, ',')) {\n    if (mg_span(entry, &k, &v, '=') &&\n        (mg_strcmp(asterisk, k) == 0 || mg_strcmp(path, k) == 0))\n      return v;\n  }\n\n  // Process built-in mime types\n  for (i = 0; s_known_types[i].buf != NULL; i += 2) {\n    if (mg_strcmp(path, s_known_types[i]) == 0) return s_known_types[i + 1];\n  }\n\n  return mg_str(\"text/plain; charset=utf-8\");\n}\n\nstatic int getrange(struct mg_str *s, size_t *a, size_t *b) {\n  size_t i, numparsed = 0;\n  for (i = 0; i + 6 < s->len; i++) {\n    struct mg_str k, v = mg_str_n(s->buf + i + 6, s->len - i - 6);\n    if (memcmp(&s->buf[i], \"bytes=\", 6) != 0) continue;\n    if (mg_span(v, &k, &v, '-')) {\n      if (mg_to_size_t(k, a)) numparsed++;\n      if (v.len > 0 && mg_to_size_t(v, b)) numparsed++;\n    } else {\n      if (mg_to_size_t(v, a)) numparsed++;\n    }\n    break;\n  }\n  return (int) numparsed;\n}\n\nvoid mg_http_serve_file(struct mg_connection *c, struct mg_http_message *hm,\n                        const char *path,\n                        const struct mg_http_serve_opts *opts) {\n  char etag[64], tmp[MG_PATH_MAX];\n  struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs;\n  struct mg_fd *fd = NULL;\n  size_t size = 0;\n  time_t mtime = 0;\n  struct mg_str *inm = NULL;\n  struct mg_str mime = guess_content_type(mg_str(path), opts->mime_types);\n  bool gzip = false;\n\n  if (path != NULL) {\n    // If a browser sends us \"Accept-Encoding: gzip\", try to open .gz first\n    struct mg_str *ae = mg_http_get_header(hm, \"Accept-Encoding\");\n    if (ae != NULL) {\n      char *ae_ = mg_mprintf(\"%.*s\", ae->len, ae->buf);\n      if (ae_ != NULL && strstr(ae_, \"gzip\") != NULL) {\n        mg_snprintf(tmp, sizeof(tmp), \"%s.gz\", path);\n        fd = mg_fs_open(fs, tmp, MG_FS_READ);\n        if (fd != NULL) gzip = true, path = tmp;\n      }\n      free(ae_);\n    }\n    // No luck opening .gz? Open what we've told to open\n    if (fd == NULL) fd = mg_fs_open(fs, path, MG_FS_READ);\n  }\n\n  // Failed to open, and page404 is configured? Open it, then\n  if (fd == NULL && opts->page404 != NULL) {\n    fd = mg_fs_open(fs, opts->page404, MG_FS_READ);\n    path = opts->page404;\n    mime = guess_content_type(mg_str(path), opts->mime_types);\n  }\n\n  if (fd == NULL || fs->st(path, &size, &mtime) == 0) {\n    mg_http_reply(c, 404, opts->extra_headers, \"Not found\\n\");\n    mg_fs_close(fd);\n    // NOTE: mg_http_etag() call should go first!\n  } else if (mg_http_etag(etag, sizeof(etag), size, mtime) != NULL &&\n             (inm = mg_http_get_header(hm, \"If-None-Match\")) != NULL &&\n             mg_strcasecmp(*inm, mg_str(etag)) == 0) {\n    mg_fs_close(fd);\n    mg_http_reply(c, 304, opts->extra_headers, \"\");\n  } else {\n    int n, status = 200;\n    char range[100];\n    size_t r1 = 0, r2 = 0, cl = size;\n\n    // Handle Range header\n    struct mg_str *rh = mg_http_get_header(hm, \"Range\");\n    range[0] = '\\0';\n    if (rh != NULL && (n = getrange(rh, &r1, &r2)) > 0) {\n      // If range is specified like \"400-\", set second limit to content len\n      if (n == 1) r2 = cl - 1;\n      if (r1 > r2 || r2 >= cl) {\n        status = 416;\n        cl = 0;\n        mg_snprintf(range, sizeof(range), \"Content-Range: bytes */%lld\\r\\n\",\n                    (int64_t) size);\n      } else {\n        status = 206;\n        cl = r2 - r1 + 1;\n        mg_snprintf(range, sizeof(range),\n                    \"Content-Range: bytes %llu-%llu/%llu\\r\\n\", (uint64_t) r1,\n                    (uint64_t) (r1 + cl - 1), (uint64_t) size);\n        fs->sk(fd->fd, r1);\n      }\n    }\n    mg_printf(c,\n              \"HTTP/1.1 %d %s\\r\\n\"\n              \"Content-Type: %.*s\\r\\n\"\n              \"Etag: %s\\r\\n\"\n              \"Content-Length: %llu\\r\\n\"\n              \"%s%s%s\\r\\n\",\n              status, mg_http_status_code_str(status), (int) mime.len, mime.buf,\n              etag, (uint64_t) cl, gzip ? \"Content-Encoding: gzip\\r\\n\" : \"\",\n              range, opts->extra_headers ? opts->extra_headers : \"\");\n    if (mg_strcasecmp(hm->method, mg_str(\"HEAD\")) == 0) {\n      c->is_resp = 0;\n      mg_fs_close(fd);\n    } else {\n      // Track to-be-sent content length at the end of c->data, aligned\n      size_t *clp = (size_t *) &c->data[(sizeof(c->data) - sizeof(size_t)) /\n                                        sizeof(size_t) * sizeof(size_t)];\n      c->pfn = static_cb;\n      c->pfn_data = fd;\n      *clp = cl;\n    }\n  }\n}\n\nstruct printdirentrydata {\n  struct mg_connection *c;\n  struct mg_http_message *hm;\n  const struct mg_http_serve_opts *opts;\n  const char *dir;\n};\n\n#if MG_ENABLE_DIRLIST\nstatic void printdirentry(const char *name, void *userdata) {\n  struct printdirentrydata *d = (struct printdirentrydata *) userdata;\n  struct mg_fs *fs = d->opts->fs == NULL ? &mg_fs_posix : d->opts->fs;\n  size_t size = 0;\n  time_t t = 0;\n  char path[MG_PATH_MAX], sz[40], mod[40];\n  int flags, n = 0;\n\n  // MG_DEBUG((\"[%s] [%s]\", d->dir, name));\n  if (mg_snprintf(path, sizeof(path), \"%s%c%s\", d->dir, '/', name) >\n      sizeof(path)) {\n    MG_ERROR((\"%s truncated\", name));\n  } else if ((flags = fs->st(path, &size, &t)) == 0) {\n    MG_ERROR((\"%lu stat(%s): %d\", d->c->id, path, errno));\n  } else {\n    const char *slash = flags & MG_FS_DIR ? \"/\" : \"\";\n    if (flags & MG_FS_DIR) {\n      mg_snprintf(sz, sizeof(sz), \"%s\", \"[DIR]\");\n    } else {\n      mg_snprintf(sz, sizeof(sz), \"%lld\", (uint64_t) size);\n    }\n#if defined(MG_HTTP_DIRLIST_TIME_FMT)\n    {\n      char time_str[40];\n      struct tm *time_info = localtime(&t);\n      strftime(time_str, sizeof time_str, \"%Y/%m/%d %H:%M:%S\", time_info);\n      mg_snprintf(mod, sizeof(mod), \"%s\", time_str);\n    }\n#else\n    mg_snprintf(mod, sizeof(mod), \"%lu\", (unsigned long) t);\n#endif\n    n = (int) mg_url_encode(name, strlen(name), path, sizeof(path));\n    mg_printf(d->c,\n              \"  <tr><td><a href=\\\"%.*s%s\\\">%s%s</a></td>\"\n              \"<td name=%lu>%s</td><td name=%lld>%s</td></tr>\\n\",\n              n, path, slash, name, slash, (unsigned long) t, mod,\n              flags & MG_FS_DIR ? (int64_t) -1 : (int64_t) size, sz);\n  }\n}\n\nstatic void listdir(struct mg_connection *c, struct mg_http_message *hm,\n                    const struct mg_http_serve_opts *opts, char *dir) {\n  const char *sort_js_code =\n      \"<script>function srt(tb, sc, so, d) {\"\n      \"var tr = Array.prototype.slice.call(tb.rows, 0),\"\n      \"tr = tr.sort(function (a, b) { var c1 = a.cells[sc], c2 = b.cells[sc],\"\n      \"n1 = c1.getAttribute('name'), n2 = c2.getAttribute('name'), \"\n      \"t1 = a.cells[2].getAttribute('name'), \"\n      \"t2 = b.cells[2].getAttribute('name'); \"\n      \"return so * (t1 < 0 && t2 >= 0 ? -1 : t2 < 0 && t1 >= 0 ? 1 : \"\n      \"n1 ? parseInt(n2) - parseInt(n1) : \"\n      \"c1.textContent.trim().localeCompare(c2.textContent.trim())); });\";\n  const char *sort_js_code2 =\n      \"for (var i = 0; i < tr.length; i++) tb.appendChild(tr[i]); \"\n      \"if (!d) window.location.hash = ('sc=' + sc + '&so=' + so); \"\n      \"};\"\n      \"window.onload = function() {\"\n      \"var tb = document.getElementById('tb');\"\n      \"var m = /sc=([012]).so=(1|-1)/.exec(window.location.hash) || [0, 2, 1];\"\n      \"var sc = m[1], so = m[2]; document.onclick = function(ev) { \"\n      \"var c = ev.target.rel; if (c) {if (c == sc) so *= -1; srt(tb, c, so); \"\n      \"sc = c; ev.preventDefault();}};\"\n      \"srt(tb, sc, so, true);\"\n      \"}\"\n      \"</script>\";\n  struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs;\n  struct printdirentrydata d = {c, hm, opts, dir};\n  char tmp[10], buf[MG_PATH_MAX];\n  size_t off, n;\n  int len = mg_url_decode(hm->uri.buf, hm->uri.len, buf, sizeof(buf), 0);\n  struct mg_str uri = len > 0 ? mg_str_n(buf, (size_t) len) : hm->uri;\n\n  mg_printf(c,\n            \"HTTP/1.1 200 OK\\r\\n\"\n            \"Content-Type: text/html; charset=utf-8\\r\\n\"\n            \"%s\"\n            \"Content-Length:         \\r\\n\\r\\n\",\n            opts->extra_headers == NULL ? \"\" : opts->extra_headers);\n  off = c->send.len;  // Start of body\n  mg_printf(c,\n            \"<!DOCTYPE html><html><head><title>Index of %.*s</title>%s%s\"\n            \"<style>th,td {text-align: left; padding-right: 1em; \"\n            \"font-family: monospace; }</style></head>\"\n            \"<body><h1>Index of %.*s</h1><table cellpadding=\\\"0\\\"><thead>\"\n            \"<tr><th><a href=\\\"#\\\" rel=\\\"0\\\">Name</a></th><th>\"\n            \"<a href=\\\"#\\\" rel=\\\"1\\\">Modified</a></th>\"\n            \"<th><a href=\\\"#\\\" rel=\\\"2\\\">Size</a></th></tr>\"\n            \"<tr><td colspan=\\\"3\\\"><hr></td></tr>\"\n            \"</thead>\"\n            \"<tbody id=\\\"tb\\\">\\n\",\n            (int) uri.len, uri.buf, sort_js_code, sort_js_code2, (int) uri.len,\n            uri.buf);\n  mg_printf(c, \"%s\",\n            \"  <tr><td><a href=\\\"..\\\">..</a></td>\"\n            \"<td name=-1></td><td name=-1>[DIR]</td></tr>\\n\");\n\n  fs->ls(dir, printdirentry, &d);\n  mg_printf(c,\n            \"</tbody><tfoot><tr><td colspan=\\\"3\\\"><hr></td></tr></tfoot>\"\n            \"</table><address>Mongoose v.%s</address></body></html>\\n\",\n            MG_VERSION);\n  n = mg_snprintf(tmp, sizeof(tmp), \"%lu\", (unsigned long) (c->send.len - off));\n  if (n > sizeof(tmp)) n = 0;\n  memcpy(c->send.buf + off - 12, tmp, n);  // Set content length\n  c->is_resp = 0;                          // Mark response end\n}\n#endif\n\n// Resolve requested file into `path` and return its fs->st() result\nstatic int uri_to_path2(struct mg_connection *c, struct mg_http_message *hm,\n                        struct mg_fs *fs, struct mg_str url, struct mg_str dir,\n                        char *path, size_t path_size) {\n  int flags, tmp;\n  // Append URI to the root_dir, and sanitize it\n  size_t n = mg_snprintf(path, path_size, \"%.*s\", (int) dir.len, dir.buf);\n  if (n + 2 >= path_size) {\n    mg_http_reply(c, 400, \"\", \"Exceeded path size\");\n    return -1;\n  }\n  path[path_size - 1] = '\\0';\n  // Terminate root dir with slash\n  if (n > 0 && path[n - 1] != '/') path[n++] = '/', path[n] = '\\0';\n  if (url.len < hm->uri.len) {\n    mg_url_decode(hm->uri.buf + url.len, hm->uri.len - url.len, path + n,\n                  path_size - n, 0);\n  }\n  path[path_size - 1] = '\\0';  // Double-check\n  if (!mg_path_is_sane(mg_str_n(path, path_size))) {\n    mg_http_reply(c, 400, \"\", \"Invalid path\");\n    return -1;\n  }\n  n = strlen(path);\n  while (n > 1 && path[n - 1] == '/') path[--n] = 0;  // Trim trailing slashes\n  flags = mg_strcmp(hm->uri, mg_str(\"/\")) == 0 ? MG_FS_DIR\n                                               : fs->st(path, NULL, NULL);\n  MG_VERBOSE((\"%lu %.*s -> %s %d\", c->id, (int) hm->uri.len, hm->uri.buf, path,\n              flags));\n  if (flags == 0) {\n    // Do nothing - let's caller decide\n  } else if ((flags & MG_FS_DIR) && hm->uri.len > 0 &&\n             hm->uri.buf[hm->uri.len - 1] != '/') {\n    mg_printf(c,\n              \"HTTP/1.1 301 Moved\\r\\n\"\n              \"Location: %.*s/\\r\\n\"\n              \"Content-Length: 0\\r\\n\"\n              \"\\r\\n\",\n              (int) hm->uri.len, hm->uri.buf);\n    c->is_resp = 0;\n    flags = -1;\n  } else if (flags & MG_FS_DIR) {\n    if (((mg_snprintf(path + n, path_size - n, \"/\" MG_HTTP_INDEX) > 0 &&\n          (tmp = fs->st(path, NULL, NULL)) != 0) ||\n         (mg_snprintf(path + n, path_size - n, \"/index.shtml\") > 0 &&\n          (tmp = fs->st(path, NULL, NULL)) != 0))) {\n      flags = tmp;\n    } else if ((mg_snprintf(path + n, path_size - n, \"/\" MG_HTTP_INDEX \".gz\") >\n                    0 &&\n                (tmp = fs->st(path, NULL, NULL)) !=\n                    0)) {  // check for gzipped index\n      flags = tmp;\n      path[n + 1 + strlen(MG_HTTP_INDEX)] =\n          '\\0';  // Remove appended .gz in index file name\n    } else {\n      path[n] = '\\0';  // Remove appended index file name\n    }\n  }\n  return flags;\n}\n\nstatic int uri_to_path(struct mg_connection *c, struct mg_http_message *hm,\n                       const struct mg_http_serve_opts *opts, char *path,\n                       size_t path_size) {\n  struct mg_fs *fs = opts->fs == NULL ? &mg_fs_posix : opts->fs;\n  struct mg_str k, v, part, s = mg_str(opts->root_dir), u = {NULL, 0}, p = u;\n  while (mg_span(s, &part, &s, ',')) {\n    if (!mg_span(part, &k, &v, '=')) k = part, v = mg_str_n(NULL, 0);\n    if (v.len == 0) v = k, k = mg_str(\"/\"), u = k, p = v;\n    if (hm->uri.len < k.len) continue;\n    if (mg_strcmp(k, mg_str_n(hm->uri.buf, k.len)) != 0) continue;\n    u = k, p = v;\n  }\n  return uri_to_path2(c, hm, fs, u, p, path, path_size);\n}\n\nvoid mg_http_serve_dir(struct mg_connection *c, struct mg_http_message *hm,\n                       const struct mg_http_serve_opts *opts) {\n  char path[MG_PATH_MAX];\n  const char *sp = opts->ssi_pattern;\n  int flags = uri_to_path(c, hm, opts, path, sizeof(path));\n  if (flags < 0) {\n    // Do nothing: the response has already been sent by uri_to_path()\n  } else if (flags & MG_FS_DIR) {\n#if MG_ENABLE_DIRLIST\n    listdir(c, hm, opts, path);\n#else\n    mg_http_reply(c, 403, \"\", \"Forbidden\\n\");\n#endif\n  } else if (flags && sp != NULL && mg_match(mg_str(path), mg_str(sp), NULL)) {\n    mg_http_serve_ssi(c, opts->root_dir, path);\n  } else {\n    mg_http_serve_file(c, hm, path, opts);\n  }\n}\n\nstatic bool mg_is_url_safe(int c) {\n  return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') ||\n         (c >= 'A' && c <= 'Z') || c == '.' || c == '_' || c == '-' || c == '~';\n}\n\nsize_t mg_url_encode(const char *s, size_t sl, char *buf, size_t len) {\n  size_t i, n = 0;\n  for (i = 0; i < sl; i++) {\n    int c = *(unsigned char *) &s[i];\n    if (n + 4 >= len) return 0;\n    if (mg_is_url_safe(c)) {\n      buf[n++] = s[i];\n    } else {\n      mg_snprintf(&buf[n], 4, \"%%%M\", mg_print_hex, 1, &s[i]);\n      n += 3;\n    }\n  }\n  if (len > 0 && n < len - 1) buf[n] = '\\0';  // Null-terminate the destination\n  if (len > 0) buf[len - 1] = '\\0';           // Always.\n  return n;\n}\n\nvoid mg_http_creds(struct mg_http_message *hm, char *user, size_t userlen,\n                   char *pass, size_t passlen) {\n  struct mg_str *v = mg_http_get_header(hm, \"Authorization\");\n  user[0] = pass[0] = '\\0';\n  if (v != NULL && v->len > 6 && memcmp(v->buf, \"Basic \", 6) == 0) {\n    char buf[256];\n    size_t n = mg_base64_decode(v->buf + 6, v->len - 6, buf, sizeof(buf));\n    const char *p = (const char *) memchr(buf, ':', n > 0 ? n : 0);\n    if (p != NULL) {\n      mg_snprintf(user, userlen, \"%.*s\", p - buf, buf);\n      mg_snprintf(pass, passlen, \"%.*s\", n - (size_t) (p - buf) - 1, p + 1);\n    }\n  } else if (v != NULL && v->len > 7 && memcmp(v->buf, \"Bearer \", 7) == 0) {\n    mg_snprintf(pass, passlen, \"%.*s\", (int) v->len - 7, v->buf + 7);\n  } else if ((v = mg_http_get_header(hm, \"Cookie\")) != NULL) {\n    struct mg_str t = mg_http_get_header_var(*v, mg_str_n(\"access_token\", 12));\n    if (t.len > 0) mg_snprintf(pass, passlen, \"%.*s\", (int) t.len, t.buf);\n  } else {\n    mg_http_get_var(&hm->query, \"access_token\", pass, passlen);\n  }\n}\n\nstatic struct mg_str stripquotes(struct mg_str s) {\n  return s.len > 1 && s.buf[0] == '\"' && s.buf[s.len - 1] == '\"'\n             ? mg_str_n(s.buf + 1, s.len - 2)\n             : s;\n}\n\nstruct mg_str mg_http_get_header_var(struct mg_str s, struct mg_str v) {\n  size_t i;\n  for (i = 0; v.len > 0 && i + v.len + 2 < s.len; i++) {\n    if (s.buf[i + v.len] == '=' && memcmp(&s.buf[i], v.buf, v.len) == 0) {\n      const char *p = &s.buf[i + v.len + 1], *b = p, *x = &s.buf[s.len];\n      int q = p < x && *p == '\"' ? 1 : 0;\n      while (p < x &&\n             (q ? p == b || *p != '\"' : *p != ';' && *p != ' ' && *p != ','))\n        p++;\n      // MG_INFO((\"[%.*s] [%.*s] [%.*s]\", (int) s.len, s.buf, (int) v.len,\n      // v.buf, (int) (p - b), b));\n      return stripquotes(mg_str_n(b, (size_t) (p - b + q)));\n    }\n  }\n  return mg_str_n(NULL, 0);\n}\n\nlong mg_http_upload(struct mg_connection *c, struct mg_http_message *hm,\n                    struct mg_fs *fs, const char *dir, size_t max_size) {\n  char buf[20] = \"0\", file[MG_PATH_MAX], path[MG_PATH_MAX];\n  long res = 0, offset;\n  mg_http_get_var(&hm->query, \"offset\", buf, sizeof(buf));\n  mg_http_get_var(&hm->query, \"file\", file, sizeof(file));\n  offset = strtol(buf, NULL, 0);\n  mg_snprintf(path, sizeof(path), \"%s%c%s\", dir, MG_DIRSEP, file);\n  if (hm->body.len == 0) {\n    mg_http_reply(c, 200, \"\", \"%ld\", res);  // Nothing to write\n  } else if (file[0] == '\\0') {\n    mg_http_reply(c, 400, \"\", \"file required\");\n    res = -1;\n  } else if (mg_path_is_sane(mg_str(file)) == false) {\n    mg_http_reply(c, 400, \"\", \"%s: invalid file\", file);\n    res = -2;\n  } else if (offset < 0) {\n    mg_http_reply(c, 400, \"\", \"offset required\");\n    res = -3;\n  } else if ((size_t) offset + hm->body.len > max_size) {\n    mg_http_reply(c, 400, \"\", \"%s: over max size of %lu\", path,\n                  (unsigned long) max_size);\n    res = -4;\n  } else {\n    struct mg_fd *fd;\n    size_t current_size = 0;\n    MG_DEBUG((\"%s -> %lu bytes @ %ld\", path, hm->body.len, offset));\n    if (offset == 0) fs->rm(path);  // If offset if 0, truncate file\n    fs->st(path, &current_size, NULL);\n    if (offset > 0 && current_size != (size_t) offset) {\n      mg_http_reply(c, 400, \"\", \"%s: offset mismatch\", path);\n      res = -5;\n    } else if ((fd = mg_fs_open(fs, path, MG_FS_WRITE)) == NULL) {\n      mg_http_reply(c, 400, \"\", \"open(%s): %d\", path, errno);\n      res = -6;\n    } else {\n      res = offset + (long) fs->wr(fd->fd, hm->body.buf, hm->body.len);\n      mg_fs_close(fd);\n      mg_http_reply(c, 200, \"\", \"%ld\", res);\n    }\n  }\n  return res;\n}\n\nint mg_http_status(const struct mg_http_message *hm) {\n  return atoi(hm->uri.buf);\n}\n\nstatic bool is_hex_digit(int c) {\n  return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') ||\n         (c >= 'A' && c <= 'F');\n}\n\nstatic int skip_chunk(const char *buf, int len, int *pl, int *dl) {\n  int i = 0, n = 0;\n  if (len < 3) return 0;\n  while (i < len && is_hex_digit(buf[i])) i++;\n  if (i == 0) return -1;                     // Error, no length specified\n  if (i > (int) sizeof(int) * 2) return -1;  // Chunk length is too big\n  if (len < i + 1 || buf[i] != '\\r' || buf[i + 1] != '\\n') return -1;  // Error\n  if (mg_str_to_num(mg_str_n(buf, (size_t) i), 16, &n, sizeof(int)) == false)\n    return -1;                    // Decode chunk length, overflow\n  if (n < 0) return -1;           // Error. TODO(): some checks now redundant\n  if (n > len - i - 4) return 0;  // Chunk not yet fully buffered\n  if (buf[i + n + 2] != '\\r' || buf[i + n + 3] != '\\n') return -1;  // Error\n  *pl = i + 2, *dl = n;\n  return i + 2 + n + 2;\n}\n\nstatic void http_cb(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_READ || ev == MG_EV_CLOSE ||\n      (ev == MG_EV_POLL && c->is_accepted && !c->is_draining &&\n       c->recv.len > 0)) {  // see #2796\n    struct mg_http_message hm;\n    size_t ofs = 0;  // Parsing offset\n    while (c->is_resp == 0 && ofs < c->recv.len) {\n      const char *buf = (char *) c->recv.buf + ofs;\n      int n = mg_http_parse(buf, c->recv.len - ofs, &hm);\n      struct mg_str *te;  // Transfer - encoding header\n      bool is_chunked = false;\n      size_t old_len = c->recv.len;\n      if (n < 0) {\n        // We don't use mg_error() here, to avoid closing pipelined requests\n        // prematurely, see #2592\n        MG_ERROR((\"HTTP parse, %lu bytes\", c->recv.len));\n        c->is_draining = 1;\n        mg_hexdump(buf, c->recv.len - ofs > 16 ? 16 : c->recv.len - ofs);\n        c->recv.len = 0;\n        return;\n      }\n      if (n == 0) break;                 // Request is not buffered yet\n      mg_call(c, MG_EV_HTTP_HDRS, &hm);  // Got all HTTP headers\n      if (c->recv.len != old_len) {\n        // User manipulated received data. Wash our hands\n        MG_DEBUG((\"%lu detaching HTTP handler\", c->id));\n        c->pfn = NULL;\n        return;\n      }\n      if (ev == MG_EV_CLOSE) {           // If client did not set Content-Length\n        hm.message.len = c->recv.len - ofs;  // and closes now, deliver MSG\n        hm.body.len = hm.message.len - (size_t) (hm.body.buf - hm.message.buf);\n      }\n      if ((te = mg_http_get_header(&hm, \"Transfer-Encoding\")) != NULL) {\n        if (mg_strcasecmp(*te, mg_str(\"chunked\")) == 0) {\n          is_chunked = true;\n        } else {\n          mg_error(c, \"Invalid Transfer-Encoding\");  // See #2460\n          return;\n        }\n      } else if (mg_http_get_header(&hm, \"Content-length\") == NULL) {\n        // #2593: HTTP packets must contain either Transfer-Encoding or\n        // Content-length\n        bool is_response = mg_ncasecmp(hm.method.buf, \"HTTP/\", 5) == 0;\n        bool require_content_len = false;\n        if (!is_response && (mg_strcasecmp(hm.method, mg_str(\"POST\")) == 0 ||\n                             mg_strcasecmp(hm.method, mg_str(\"PUT\")) == 0)) {\n          // POST and PUT should include an entity body. Therefore, they should\n          // contain a Content-length header. Other requests can also contain a\n          // body, but their content has no defined semantics (RFC 7231)\n          require_content_len = true;\n          ofs += (size_t) n;  // this request has been processed\n        } else if (is_response) {\n          // HTTP spec 7.2 Entity body: All other responses must include a body\n          // or Content-Length header field defined with a value of 0.\n          int status = mg_http_status(&hm);\n          require_content_len = status >= 200 && status != 204 && status != 304;\n        }\n        if (require_content_len) {\n          if (!c->is_client) mg_http_reply(c, 411, \"\", \"\");\n          MG_ERROR((\"Content length missing from %s\", is_response ? \"response\" : \"request\"));\n        }\n      }\n\n      if (is_chunked) {\n        // For chunked data, strip off prefixes and suffixes from chunks\n        // and relocate them right after the headers, then report a message\n        char *s = (char *) c->recv.buf + ofs + n;\n        int o = 0, pl, dl, cl, len = (int) (c->recv.len - ofs - (size_t) n);\n\n        // Find zero-length chunk (the end of the body)\n        while ((cl = skip_chunk(s + o, len - o, &pl, &dl)) > 0 && dl) o += cl;\n        if (cl == 0) break;  // No zero-len chunk, buffer more data\n        if (cl < 0) {\n          mg_error(c, \"Invalid chunk\");\n          break;\n        }\n\n        // Zero chunk found. Second pass: strip + relocate\n        o = 0, hm.body.len = 0, hm.message.len = (size_t) n;\n        while ((cl = skip_chunk(s + o, len - o, &pl, &dl)) > 0) {\n          memmove(s + hm.body.len, s + o + pl, (size_t) dl);\n          o += cl, hm.body.len += (size_t) dl, hm.message.len += (size_t) dl;\n          if (dl == 0) break;\n        }\n        ofs += (size_t) (n + o);\n      } else {  // Normal, non-chunked data\n        size_t len = c->recv.len - ofs - (size_t) n;\n        if (hm.body.len > len) break;  // Buffer more data\n        ofs += (size_t) n + hm.body.len;\n      }\n\n      if (c->is_accepted) c->is_resp = 1;  // Start generating response\n      mg_call(c, MG_EV_HTTP_MSG, &hm);     // User handler can clear is_resp\n      if (c->is_accepted && !c->is_resp) {\n        struct mg_str *cc = mg_http_get_header(&hm, \"Connection\");\n        if (cc != NULL && mg_strcasecmp(*cc, mg_str(\"close\")) == 0) {\n          c->is_draining = 1;  // honor \"Connection: close\"\n          break;\n        }\n      }\n    }\n    if (ofs > 0) mg_iobuf_del(&c->recv, 0, ofs);  // Delete processed data\n  }\n  (void) ev_data;\n}\n\nstatic void mg_hfn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    if (mg_match(hm->uri, mg_str(\"/quit\"), NULL)) {\n      mg_http_reply(c, 200, \"\", \"ok\\n\");\n      c->is_draining = 1;\n      c->data[0] = 'X';\n    } else if (mg_match(hm->uri, mg_str(\"/debug\"), NULL)) {\n      int level = (int) mg_json_get_long(hm->body, \"$.level\", MG_LL_DEBUG);\n      mg_log_set(level);\n      mg_http_reply(c, 200, \"\", \"Debug level set to %d\\n\", level);\n    } else {\n      mg_http_reply(c, 200, \"\", \"hi\\n\");\n    }\n  } else if (ev == MG_EV_CLOSE) {\n    if (c->data[0] == 'X') *(bool *) c->fn_data = true;\n  }\n}\n\nvoid mg_hello(const char *url) {\n  struct mg_mgr mgr;\n  bool done = false;\n  mg_mgr_init(&mgr);\n  if (mg_http_listen(&mgr, url, mg_hfn, &done) == NULL) done = true;\n  while (done == false) mg_mgr_poll(&mgr, 100);\n  mg_mgr_free(&mgr);\n}\n\nstruct mg_connection *mg_http_connect(struct mg_mgr *mgr, const char *url,\n                                      mg_event_handler_t fn, void *fn_data) {\n  struct mg_connection *c = mg_connect(mgr, url, fn, fn_data);\n  if (c != NULL) c->pfn = http_cb;\n  return c;\n}\n\nstruct mg_connection *mg_http_listen(struct mg_mgr *mgr, const char *url,\n                                     mg_event_handler_t fn, void *fn_data) {\n  struct mg_connection *c = mg_listen(mgr, url, fn, fn_data);\n  if (c != NULL) c->pfn = http_cb;\n  return c;\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/iobuf.c\"\n#endif\n\n\n\n\n\nstatic size_t roundup(size_t size, size_t align) {\n  return align == 0 ? size : (size + align - 1) / align * align;\n}\n\nint mg_iobuf_resize(struct mg_iobuf *io, size_t new_size) {\n  int ok = 1;\n  new_size = roundup(new_size, io->align);\n  if (new_size == 0) {\n    mg_bzero(io->buf, io->size);\n    free(io->buf);\n    io->buf = NULL;\n    io->len = io->size = 0;\n  } else if (new_size != io->size) {\n    // NOTE(lsm): do not use realloc here. Use calloc/free only, to ease the\n    // porting to some obscure platforms like FreeRTOS\n    void *p = calloc(1, new_size);\n    if (p != NULL) {\n      size_t len = new_size < io->len ? new_size : io->len;\n      if (len > 0 && io->buf != NULL) memmove(p, io->buf, len);\n      mg_bzero(io->buf, io->size);\n      free(io->buf);\n      io->buf = (unsigned char *) p;\n      io->size = new_size;\n    } else {\n      ok = 0;\n      MG_ERROR((\"%lld->%lld\", (uint64_t) io->size, (uint64_t) new_size));\n    }\n  }\n  return ok;\n}\n\nint mg_iobuf_init(struct mg_iobuf *io, size_t size, size_t align) {\n  io->buf = NULL;\n  io->align = align;\n  io->size = io->len = 0;\n  return mg_iobuf_resize(io, size);\n}\n\nsize_t mg_iobuf_add(struct mg_iobuf *io, size_t ofs, const void *buf,\n                    size_t len) {\n  size_t new_size = roundup(io->len + len, io->align);\n  mg_iobuf_resize(io, new_size);      // Attempt to resize\n  if (new_size != io->size) len = 0;  // Resize failure, append nothing\n  if (ofs < io->len) memmove(io->buf + ofs + len, io->buf + ofs, io->len - ofs);\n  if (buf != NULL) memmove(io->buf + ofs, buf, len);\n  if (ofs > io->len) io->len += ofs - io->len;\n  io->len += len;\n  return len;\n}\n\nsize_t mg_iobuf_del(struct mg_iobuf *io, size_t ofs, size_t len) {\n  if (ofs > io->len) ofs = io->len;\n  if (ofs + len > io->len) len = io->len - ofs;\n  if (io->buf) memmove(io->buf + ofs, io->buf + ofs + len, io->len - ofs - len);\n  if (io->buf) mg_bzero(io->buf + io->len - len, len);\n  io->len -= len;\n  return len;\n}\n\nvoid mg_iobuf_free(struct mg_iobuf *io) {\n  mg_iobuf_resize(io, 0);\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/json.c\"\n#endif\n\n\n\n\nstatic const char *escapeseq(int esc) {\n  return esc ? \"\\b\\f\\n\\r\\t\\\\\\\"\" : \"bfnrt\\\\\\\"\";\n}\n\nstatic char json_esc(int c, int esc) {\n  const char *p, *esc1 = escapeseq(esc), *esc2 = escapeseq(!esc);\n  for (p = esc1; *p != '\\0'; p++) {\n    if (*p == c) return esc2[p - esc1];\n  }\n  return 0;\n}\n\nstatic int mg_pass_string(const char *s, int len) {\n  int i;\n  for (i = 0; i < len; i++) {\n    if (s[i] == '\\\\' && i + 1 < len && json_esc(s[i + 1], 1)) {\n      i++;\n    } else if (s[i] == '\\0') {\n      return MG_JSON_INVALID;\n    } else if (s[i] == '\"') {\n      return i;\n    }\n  }\n  return MG_JSON_INVALID;\n}\n\nstatic double mg_atod(const char *p, int len, int *numlen) {\n  double d = 0.0;\n  int i = 0, sign = 1;\n\n  // Sign\n  if (i < len && *p == '-') {\n    sign = -1, i++;\n  } else if (i < len && *p == '+') {\n    i++;\n  }\n\n  // Decimal\n  for (; i < len && p[i] >= '0' && p[i] <= '9'; i++) {\n    d *= 10.0;\n    d += p[i] - '0';\n  }\n  d *= sign;\n\n  // Fractional\n  if (i < len && p[i] == '.') {\n    double frac = 0.0, base = 0.1;\n    i++;\n    for (; i < len && p[i] >= '0' && p[i] <= '9'; i++) {\n      frac += base * (p[i] - '0');\n      base /= 10.0;\n    }\n    d += frac * sign;\n  }\n\n  // Exponential\n  if (i < len && (p[i] == 'e' || p[i] == 'E')) {\n    int j, exp = 0, minus = 0;\n    i++;\n    if (i < len && p[i] == '-') minus = 1, i++;\n    if (i < len && p[i] == '+') i++;\n    while (i < len && p[i] >= '0' && p[i] <= '9' && exp < 308)\n      exp = exp * 10 + (p[i++] - '0');\n    if (minus) exp = -exp;\n    for (j = 0; j < exp; j++) d *= 10.0;\n    for (j = 0; j < -exp; j++) d /= 10.0;\n  }\n\n  if (numlen != NULL) *numlen = i;\n  return d;\n}\n\n// Iterate over object or array elements\nsize_t mg_json_next(struct mg_str obj, size_t ofs, struct mg_str *key,\n                    struct mg_str *val) {\n  if (ofs >= obj.len) {\n    ofs = 0;  // Out of boundaries, stop scanning\n  } else if (obj.len < 2 || (*obj.buf != '{' && *obj.buf != '[')) {\n    ofs = 0;  // Not an array or object, stop\n  } else {\n    struct mg_str sub = mg_str_n(obj.buf + ofs, obj.len - ofs);\n    if (ofs == 0) ofs++, sub.buf++, sub.len--;\n    if (*obj.buf == '[') {  // Iterate over an array\n      int n = 0, o = mg_json_get(sub, \"$\", &n);\n      if (n < 0 || o < 0 || (size_t) (o + n) > sub.len) {\n        ofs = 0;  // Error parsing key, stop scanning\n      } else {\n        if (key) *key = mg_str_n(NULL, 0);\n        if (val) *val = mg_str_n(sub.buf + o, (size_t) n);\n        ofs = (size_t) (&sub.buf[o + n] - obj.buf);\n      }\n    } else {  // Iterate over an object\n      int n = 0, o = mg_json_get(sub, \"$\", &n);\n      if (n < 0 || o < 0 || (size_t) (o + n) > sub.len) {\n        ofs = 0;  // Error parsing key, stop scanning\n      } else {\n        if (key) *key = mg_str_n(sub.buf + o, (size_t) n);\n        sub.buf += o + n, sub.len -= (size_t) (o + n);\n        while (sub.len > 0 && *sub.buf != ':') sub.len--, sub.buf++;\n        if (sub.len > 0 && *sub.buf == ':') sub.len--, sub.buf++;\n        n = 0, o = mg_json_get(sub, \"$\", &n);\n        if (n < 0 || o < 0 || (size_t) (o + n) > sub.len) {\n          ofs = 0;  // Error parsing value, stop scanning\n        } else {\n          if (val) *val = mg_str_n(sub.buf + o, (size_t) n);\n          ofs = (size_t) (&sub.buf[o + n] - obj.buf);\n        }\n      }\n    }\n    // MG_INFO((\"SUB ofs %u %.*s\", ofs, sub.len, sub.buf));\n    while (ofs && ofs < obj.len &&\n           (obj.buf[ofs] == ' ' || obj.buf[ofs] == '\\t' ||\n            obj.buf[ofs] == '\\n' || obj.buf[ofs] == '\\r')) {\n      ofs++;\n    }\n    if (ofs && ofs < obj.len && obj.buf[ofs] == ',') ofs++;\n    if (ofs > obj.len) ofs = 0;\n  }\n  return ofs;\n}\n\nint mg_json_get(struct mg_str json, const char *path, int *toklen) {\n  const char *s = json.buf;\n  int len = (int) json.len;\n  enum { S_VALUE, S_KEY, S_COLON, S_COMMA_OR_EOO } expecting = S_VALUE;\n  unsigned char nesting[MG_JSON_MAX_DEPTH];\n  int i = 0;             // Current offset in `s`\n  int j = 0;             // Offset in `s` we're looking for (return value)\n  int depth = 0;         // Current depth (nesting level)\n  int ed = 0;            // Expected depth\n  int pos = 1;           // Current position in `path`\n  int ci = -1, ei = -1;  // Current and expected index in array\n\n  if (toklen) *toklen = 0;\n  if (path[0] != '$') return MG_JSON_INVALID;\n\n#define MG_CHECKRET(x)                                  \\\n  do {                                                  \\\n    if (depth == ed && path[pos] == '\\0' && ci == ei) { \\\n      if (toklen) *toklen = i - j + 1;                  \\\n      return j;                                         \\\n    }                                                   \\\n  } while (0)\n\n// In the ascii table, the distance between `[` and `]` is 2.\n// Ditto for `{` and `}`. Hence +2 in the code below.\n#define MG_EOO(x)                                            \\\n  do {                                                       \\\n    if (depth == ed && ci != ei) return MG_JSON_NOT_FOUND;   \\\n    if (c != nesting[depth - 1] + 2) return MG_JSON_INVALID; \\\n    depth--;                                                 \\\n    MG_CHECKRET(x);                                          \\\n  } while (0)\n\n  for (i = 0; i < len; i++) {\n    unsigned char c = ((unsigned char *) s)[i];\n    if (c == ' ' || c == '\\t' || c == '\\n' || c == '\\r') continue;\n    switch (expecting) {\n      case S_VALUE:\n        // p(\"V %s [%.*s] %d %d %d %d\\n\", path, pos, path, depth, ed, ci, ei);\n        if (depth == ed) j = i;\n        if (c == '{') {\n          if (depth >= (int) sizeof(nesting)) return MG_JSON_TOO_DEEP;\n          if (depth == ed && path[pos] == '.' && ci == ei) {\n            // If we start the object, reset array indices\n            ed++, pos++, ci = ei = -1;\n          }\n          nesting[depth++] = c;\n          expecting = S_KEY;\n          break;\n        } else if (c == '[') {\n          if (depth >= (int) sizeof(nesting)) return MG_JSON_TOO_DEEP;\n          if (depth == ed && path[pos] == '[' && ei == ci) {\n            ed++, pos++, ci = 0;\n            for (ei = 0; path[pos] != ']' && path[pos] != '\\0'; pos++) {\n              ei *= 10;\n              ei += path[pos] - '0';\n            }\n            if (path[pos] != 0) pos++;\n          }\n          nesting[depth++] = c;\n          break;\n        } else if (c == ']' && depth > 0) {  // Empty array\n          MG_EOO(']');\n        } else if (c == 't' && i + 3 < len && memcmp(&s[i], \"true\", 4) == 0) {\n          i += 3;\n        } else if (c == 'n' && i + 3 < len && memcmp(&s[i], \"null\", 4) == 0) {\n          i += 3;\n        } else if (c == 'f' && i + 4 < len && memcmp(&s[i], \"false\", 5) == 0) {\n          i += 4;\n        } else if (c == '-' || ((c >= '0' && c <= '9'))) {\n          int numlen = 0;\n          mg_atod(&s[i], len - i, &numlen);\n          i += numlen - 1;\n        } else if (c == '\"') {\n          int n = mg_pass_string(&s[i + 1], len - i - 1);\n          if (n < 0) return n;\n          i += n + 1;\n        } else {\n          return MG_JSON_INVALID;\n        }\n        MG_CHECKRET('V');\n        if (depth == ed && ei >= 0) ci++;\n        expecting = S_COMMA_OR_EOO;\n        break;\n\n      case S_KEY:\n        if (c == '\"') {\n          int n = mg_pass_string(&s[i + 1], len - i - 1);\n          if (n < 0) return n;\n          if (i + 1 + n >= len) return MG_JSON_NOT_FOUND;\n          if (depth < ed) return MG_JSON_NOT_FOUND;\n          if (depth == ed && path[pos - 1] != '.') return MG_JSON_NOT_FOUND;\n          // printf(\"K %s [%.*s] [%.*s] %d %d %d %d %d\\n\", path, pos, path, n,\n          //        &s[i + 1], n, depth, ed, ci, ei);\n          //  NOTE(cpq): in the check sequence below is important.\n          //  strncmp() must go first: it fails fast if the remaining length\n          //  of the path is smaller than `n`.\n          if (depth == ed && path[pos - 1] == '.' &&\n              strncmp(&s[i + 1], &path[pos], (size_t) n) == 0 &&\n              (path[pos + n] == '\\0' || path[pos + n] == '.' ||\n               path[pos + n] == '[')) {\n            pos += n;\n          }\n          i += n + 1;\n          expecting = S_COLON;\n        } else if (c == '}') {  // Empty object\n          MG_EOO('}');\n          expecting = S_COMMA_OR_EOO;\n          if (depth == ed && ei >= 0) ci++;\n        } else {\n          return MG_JSON_INVALID;\n        }\n        break;\n\n      case S_COLON:\n        if (c == ':') {\n          expecting = S_VALUE;\n        } else {\n          return MG_JSON_INVALID;\n        }\n        break;\n\n      case S_COMMA_OR_EOO:\n        if (depth <= 0) {\n          return MG_JSON_INVALID;\n        } else if (c == ',') {\n          expecting = (nesting[depth - 1] == '{') ? S_KEY : S_VALUE;\n        } else if (c == ']' || c == '}') {\n          if (depth == ed && c == '}' && path[pos - 1] == '.')\n            return MG_JSON_NOT_FOUND;\n          if (depth == ed && c == ']' && path[pos - 1] == ',')\n            return MG_JSON_NOT_FOUND;\n          MG_EOO('O');\n          if (depth == ed && ei >= 0) ci++;\n        } else {\n          return MG_JSON_INVALID;\n        }\n        break;\n    }\n  }\n  return MG_JSON_NOT_FOUND;\n}\n\nstruct mg_str mg_json_get_tok(struct mg_str json, const char *path) {\n  int len = 0, ofs = mg_json_get(json, path, &len);\n  return mg_str_n(ofs < 0 ? NULL : json.buf + ofs,\n                  (size_t) (len < 0 ? 0 : len));\n}\n\nbool mg_json_get_num(struct mg_str json, const char *path, double *v) {\n  int n, toklen, found = 0;\n  if ((n = mg_json_get(json, path, &toklen)) >= 0 &&\n      (json.buf[n] == '-' || (json.buf[n] >= '0' && json.buf[n] <= '9'))) {\n    if (v != NULL) *v = mg_atod(json.buf + n, toklen, NULL);\n    found = 1;\n  }\n  return found;\n}\n\nbool mg_json_get_bool(struct mg_str json, const char *path, bool *v) {\n  int found = 0, off = mg_json_get(json, path, NULL);\n  if (off >= 0 && (json.buf[off] == 't' || json.buf[off] == 'f')) {\n    if (v != NULL) *v = json.buf[off] == 't';\n    found = 1;\n  }\n  return found;\n}\n\nbool mg_json_unescape(struct mg_str s, char *to, size_t n) {\n  size_t i, j;\n  for (i = 0, j = 0; i < s.len && j < n; i++, j++) {\n    if (s.buf[i] == '\\\\' && i + 5 < s.len && s.buf[i + 1] == 'u') {\n      //  \\uXXXX escape. We process simple one-byte chars \\u00xx within ASCII\n      //  range. More complex chars would require dragging in a UTF8 library,\n      //  which is too much for us\n      if (mg_str_to_num(mg_str_n(s.buf + i + 2, 4), 16, &to[j],\n                        sizeof(uint8_t)) == false)\n        return false;\n      i += 5;\n    } else if (s.buf[i] == '\\\\' && i + 1 < s.len) {\n      char c = json_esc(s.buf[i + 1], 0);\n      if (c == 0) return false;\n      to[j] = c;\n      i++;\n    } else {\n      to[j] = s.buf[i];\n    }\n  }\n  if (j >= n) return false;\n  if (n > 0) to[j] = '\\0';\n  return true;\n}\n\nchar *mg_json_get_str(struct mg_str json, const char *path) {\n  char *result = NULL;\n  int len = 0, off = mg_json_get(json, path, &len);\n  if (off >= 0 && len > 1 && json.buf[off] == '\"') {\n    if ((result = (char *) calloc(1, (size_t) len)) != NULL &&\n        !mg_json_unescape(mg_str_n(json.buf + off + 1, (size_t) (len - 2)),\n                          result, (size_t) len)) {\n      free(result);\n      result = NULL;\n    }\n  }\n  return result;\n}\n\nchar *mg_json_get_b64(struct mg_str json, const char *path, int *slen) {\n  char *result = NULL;\n  int len = 0, off = mg_json_get(json, path, &len);\n  if (off >= 0 && json.buf[off] == '\"' && len > 1 &&\n      (result = (char *) calloc(1, (size_t) len)) != NULL) {\n    size_t k = mg_base64_decode(json.buf + off + 1, (size_t) (len - 2), result,\n                                (size_t) len);\n    if (slen != NULL) *slen = (int) k;\n  }\n  return result;\n}\n\nchar *mg_json_get_hex(struct mg_str json, const char *path, int *slen) {\n  char *result = NULL;\n  int len = 0, off = mg_json_get(json, path, &len);\n  if (off >= 0 && json.buf[off] == '\"' && len > 1 &&\n      (result = (char *) calloc(1, (size_t) len / 2)) != NULL) {\n    int i;\n    for (i = 0; i < len - 2; i += 2) {\n      mg_str_to_num(mg_str_n(json.buf + off + 1 + i, 2), 16, &result[i >> 1],\n                    sizeof(uint8_t));\n    }\n    result[len / 2 - 1] = '\\0';\n    if (slen != NULL) *slen = len / 2 - 1;\n  }\n  return result;\n}\n\nlong mg_json_get_long(struct mg_str json, const char *path, long dflt) {\n  double dv;\n  long result = dflt;\n  if (mg_json_get_num(json, path, &dv)) result = (long) dv;\n  return result;\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/log.c\"\n#endif\n\n\n\n\n\nint mg_log_level = MG_LL_INFO;\nstatic mg_pfn_t s_log_func = mg_pfn_stdout;\nstatic void *s_log_func_param = NULL;\n\nvoid mg_log_set_fn(mg_pfn_t fn, void *param) {\n  s_log_func = fn;\n  s_log_func_param = param;\n}\n\nstatic void logc(unsigned char c) {\n  s_log_func((char) c, s_log_func_param);\n}\n\nstatic void logs(const char *buf, size_t len) {\n  size_t i;\n  for (i = 0; i < len; i++) logc(((unsigned char *) buf)[i]);\n}\n\n#if MG_ENABLE_CUSTOM_LOG\n// Let user define their own mg_log_prefix() and mg_log()\n#else\nvoid mg_log_prefix(int level, const char *file, int line, const char *fname) {\n  const char *p = strrchr(file, '/');\n  char buf[41];\n  size_t n;\n  if (p == NULL) p = strrchr(file, '\\\\');\n  n = mg_snprintf(buf, sizeof(buf), \"%-6llx %d %s:%d:%s\", mg_millis(), level,\n                  p == NULL ? file : p + 1, line, fname);\n  if (n > sizeof(buf) - 2) n = sizeof(buf) - 2;\n  while (n < sizeof(buf)) buf[n++] = ' ';\n  logs(buf, n - 1);\n}\n\nvoid mg_log(const char *fmt, ...) {\n  va_list ap;\n  va_start(ap, fmt);\n  mg_vxprintf(s_log_func, s_log_func_param, fmt, &ap);\n  va_end(ap);\n  logs(\"\\r\\n\", 2);\n}\n#endif\n\nstatic unsigned char nibble(unsigned c) {\n  return (unsigned char) (c < 10 ? c + '0' : c + 'W');\n}\n\n#define ISPRINT(x) ((x) >= ' ' && (x) <= '~')\nvoid mg_hexdump(const void *buf, size_t len) {\n  const unsigned char *p = (const unsigned char *) buf;\n  unsigned char ascii[16], alen = 0;\n  size_t i;\n  for (i = 0; i < len; i++) {\n    if ((i % 16) == 0) {\n      // Print buffered ascii chars\n      if (i > 0) logs(\"  \", 2), logs((char *) ascii, 16), logc('\\n'), alen = 0;\n      // Print hex address, then \\t\n      logc(nibble((i >> 12) & 15)), logc(nibble((i >> 8) & 15)),\n          logc(nibble((i >> 4) & 15)), logc('0'), logs(\"   \", 3);\n    }\n    logc(nibble(p[i] >> 4)), logc(nibble(p[i] & 15));  // Two nibbles, e.g. c5\n    logc(' ');                                         // Space after hex number\n    ascii[alen++] = ISPRINT(p[i]) ? p[i] : '.';        // Add to the ascii buf\n  }\n  while (alen < 16) logs(\"   \", 3), ascii[alen++] = ' ';\n  logs(\"  \", 2), logs((char *) ascii, 16), logc('\\n');\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/md5.c\"\n#endif\n\n\n\n//  This code implements the MD5 message-digest algorithm.\n//  The algorithm is due to Ron Rivest.  This code was\n//  written by Colin Plumb in 1993, no copyright is claimed.\n//  This code is in the public domain; do with it what you wish.\n//\n//  Equivalent code is available from RSA Data Security, Inc.\n//  This code has been tested against that, and is equivalent,\n//  except that you don't need to include two pages of legalese\n//  with every copy.\n//\n//  To compute the message digest of a chunk of bytes, declare an\n//  MD5Context structure, pass it to MD5Init, call MD5Update as\n//  needed on buffers full of bytes, and then call MD5Final, which\n//  will fill a supplied 16-byte array with the digest.\n\n#if defined(MG_ENABLE_MD5) && MG_ENABLE_MD5\n\nstatic void mg_byte_reverse(unsigned char *buf, unsigned longs) {\n  if (MG_BIG_ENDIAN) {\n    do {\n      uint32_t t = (uint32_t) ((unsigned) buf[3] << 8 | buf[2]) << 16 |\n                   ((unsigned) buf[1] << 8 | buf[0]);\n      *(uint32_t *) buf = t;\n      buf += 4;\n    } while (--longs);\n  } else {\n    (void) buf, (void) longs;  // Little endian. Do nothing\n  }\n}\n\n#define F1(x, y, z) (z ^ (x & (y ^ z)))\n#define F2(x, y, z) F1(z, x, y)\n#define F3(x, y, z) (x ^ y ^ z)\n#define F4(x, y, z) (y ^ (x | ~z))\n\n#define MD5STEP(f, w, x, y, z, data, s) \\\n  (w += f(x, y, z) + data, w = w << s | w >> (32 - s), w += x)\n\n/*\n * Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious\n * initialization constants.\n */\nvoid mg_md5_init(mg_md5_ctx *ctx) {\n  ctx->buf[0] = 0x67452301;\n  ctx->buf[1] = 0xefcdab89;\n  ctx->buf[2] = 0x98badcfe;\n  ctx->buf[3] = 0x10325476;\n\n  ctx->bits[0] = 0;\n  ctx->bits[1] = 0;\n}\n\nstatic void mg_md5_transform(uint32_t buf[4], uint32_t const in[16]) {\n  uint32_t a, b, c, d;\n\n  a = buf[0];\n  b = buf[1];\n  c = buf[2];\n  d = buf[3];\n\n  MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);\n  MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);\n  MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);\n  MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);\n  MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);\n  MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);\n  MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);\n  MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);\n  MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);\n  MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);\n  MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);\n  MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);\n  MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);\n  MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);\n  MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);\n  MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);\n\n  MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);\n  MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);\n  MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);\n  MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);\n  MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);\n  MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);\n  MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);\n  MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);\n  MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);\n  MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);\n  MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);\n  MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);\n  MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);\n  MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);\n  MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);\n  MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);\n\n  MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);\n  MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);\n  MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);\n  MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);\n  MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);\n  MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);\n  MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);\n  MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);\n  MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);\n  MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);\n  MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);\n  MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);\n  MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);\n  MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);\n  MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);\n  MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);\n\n  MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);\n  MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);\n  MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);\n  MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);\n  MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);\n  MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);\n  MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);\n  MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);\n  MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);\n  MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);\n  MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);\n  MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);\n  MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);\n  MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);\n  MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);\n  MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);\n\n  buf[0] += a;\n  buf[1] += b;\n  buf[2] += c;\n  buf[3] += d;\n}\n\nvoid mg_md5_update(mg_md5_ctx *ctx, const unsigned char *buf, size_t len) {\n  uint32_t t;\n\n  t = ctx->bits[0];\n  if ((ctx->bits[0] = t + ((uint32_t) len << 3)) < t) ctx->bits[1]++;\n  ctx->bits[1] += (uint32_t) len >> 29;\n\n  t = (t >> 3) & 0x3f;\n\n  if (t) {\n    unsigned char *p = (unsigned char *) ctx->in + t;\n\n    t = 64 - t;\n    if (len < t) {\n      memcpy(p, buf, len);\n      return;\n    }\n    memcpy(p, buf, t);\n    mg_byte_reverse(ctx->in, 16);\n    mg_md5_transform(ctx->buf, (uint32_t *) ctx->in);\n    buf += t;\n    len -= t;\n  }\n\n  while (len >= 64) {\n    memcpy(ctx->in, buf, 64);\n    mg_byte_reverse(ctx->in, 16);\n    mg_md5_transform(ctx->buf, (uint32_t *) ctx->in);\n    buf += 64;\n    len -= 64;\n  }\n\n  memcpy(ctx->in, buf, len);\n}\n\nvoid mg_md5_final(mg_md5_ctx *ctx, unsigned char digest[16]) {\n  unsigned count;\n  unsigned char *p;\n  uint32_t *a;\n\n  count = (ctx->bits[0] >> 3) & 0x3F;\n\n  p = ctx->in + count;\n  *p++ = 0x80;\n  count = 64 - 1 - count;\n  if (count < 8) {\n    memset(p, 0, count);\n    mg_byte_reverse(ctx->in, 16);\n    mg_md5_transform(ctx->buf, (uint32_t *) ctx->in);\n    memset(ctx->in, 0, 56);\n  } else {\n    memset(p, 0, count - 8);\n  }\n  mg_byte_reverse(ctx->in, 14);\n\n  a = (uint32_t *) ctx->in;\n  a[14] = ctx->bits[0];\n  a[15] = ctx->bits[1];\n\n  mg_md5_transform(ctx->buf, (uint32_t *) ctx->in);\n  mg_byte_reverse((unsigned char *) ctx->buf, 4);\n  memcpy(digest, ctx->buf, 16);\n  memset((char *) ctx, 0, sizeof(*ctx));\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/mqtt.c\"\n#endif\n\n\n\n\n\n\n\n\n#define MQTT_CLEAN_SESSION 0x02\n#define MQTT_HAS_WILL 0x04\n#define MQTT_WILL_RETAIN 0x20\n#define MQTT_HAS_PASSWORD 0x40\n#define MQTT_HAS_USER_NAME 0x80\n\nstruct mg_mqtt_pmap {\n  uint8_t id;\n  uint8_t type;\n};\n\nstatic const struct mg_mqtt_pmap s_prop_map[] = {\n    {MQTT_PROP_PAYLOAD_FORMAT_INDICATOR, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_MESSAGE_EXPIRY_INTERVAL, MQTT_PROP_TYPE_INT},\n    {MQTT_PROP_CONTENT_TYPE, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_RESPONSE_TOPIC, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_CORRELATION_DATA, MQTT_PROP_TYPE_BINARY_DATA},\n    {MQTT_PROP_SUBSCRIPTION_IDENTIFIER, MQTT_PROP_TYPE_VARIABLE_INT},\n    {MQTT_PROP_SESSION_EXPIRY_INTERVAL, MQTT_PROP_TYPE_INT},\n    {MQTT_PROP_ASSIGNED_CLIENT_IDENTIFIER, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_SERVER_KEEP_ALIVE, MQTT_PROP_TYPE_SHORT},\n    {MQTT_PROP_AUTHENTICATION_METHOD, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_AUTHENTICATION_DATA, MQTT_PROP_TYPE_BINARY_DATA},\n    {MQTT_PROP_REQUEST_PROBLEM_INFORMATION, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_WILL_DELAY_INTERVAL, MQTT_PROP_TYPE_INT},\n    {MQTT_PROP_REQUEST_RESPONSE_INFORMATION, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_RESPONSE_INFORMATION, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_SERVER_REFERENCE, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_REASON_STRING, MQTT_PROP_TYPE_STRING},\n    {MQTT_PROP_RECEIVE_MAXIMUM, MQTT_PROP_TYPE_SHORT},\n    {MQTT_PROP_TOPIC_ALIAS_MAXIMUM, MQTT_PROP_TYPE_SHORT},\n    {MQTT_PROP_TOPIC_ALIAS, MQTT_PROP_TYPE_SHORT},\n    {MQTT_PROP_MAXIMUM_QOS, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_RETAIN_AVAILABLE, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_USER_PROPERTY, MQTT_PROP_TYPE_STRING_PAIR},\n    {MQTT_PROP_MAXIMUM_PACKET_SIZE, MQTT_PROP_TYPE_INT},\n    {MQTT_PROP_WILDCARD_SUBSCRIPTION_AVAILABLE, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_SUBSCRIPTION_IDENTIFIER_AVAILABLE, MQTT_PROP_TYPE_BYTE},\n    {MQTT_PROP_SHARED_SUBSCRIPTION_AVAILABLE, MQTT_PROP_TYPE_BYTE}};\n\nvoid mg_mqtt_send_header(struct mg_connection *c, uint8_t cmd, uint8_t flags,\n                         uint32_t len) {\n  uint8_t buf[1 + sizeof(len)], *vlen = &buf[1];\n  buf[0] = (uint8_t) ((cmd << 4) | flags);\n  do {\n    *vlen = len % 0x80;\n    len /= 0x80;\n    if (len > 0) *vlen |= 0x80;\n    vlen++;\n  } while (len > 0 && vlen < &buf[sizeof(buf)]);\n  mg_send(c, buf, (size_t) (vlen - buf));\n}\n\nstatic void mg_send_u16(struct mg_connection *c, uint16_t value) {\n  mg_send(c, &value, sizeof(value));\n}\n\nstatic void mg_send_u32(struct mg_connection *c, uint32_t value) {\n  mg_send(c, &value, sizeof(value));\n}\n\nstatic uint8_t varint_size(size_t length) {\n  uint8_t bytes_needed = 0;\n  do {\n    bytes_needed++;\n    length /= 0x80;\n  } while (length > 0);\n  return bytes_needed;\n}\n\nstatic size_t encode_varint(uint8_t *buf, size_t value) {\n  size_t len = 0;\n\n  do {\n    uint8_t b = (uint8_t) (value % 128);\n    value /= 128;\n    if (value > 0) b |= 0x80;\n    buf[len++] = b;\n  } while (value > 0);\n\n  return len;\n}\n\nstatic size_t decode_varint(const uint8_t *buf, size_t len, size_t *value) {\n  size_t multiplier = 1, offset;\n  *value = 0;\n\n  for (offset = 0; offset < 4 && offset < len; offset++) {\n    uint8_t encoded_byte = buf[offset];\n    *value += (encoded_byte & 0x7f) * multiplier;\n    multiplier *= 128;\n\n    if ((encoded_byte & 0x80) == 0) return offset + 1;\n  }\n\n  return 0;\n}\n\nstatic int mqtt_prop_type_by_id(uint8_t prop_id) {\n  size_t i, num_properties = sizeof(s_prop_map) / sizeof(s_prop_map[0]);\n  for (i = 0; i < num_properties; ++i) {\n    if (s_prop_map[i].id == prop_id) return s_prop_map[i].type;\n  }\n  return -1;  // Property ID not found\n}\n\n// Returns the size of the properties section, without the\n// size of the content's length\nstatic size_t get_properties_length(struct mg_mqtt_prop *props, size_t count) {\n  size_t i, size = 0;\n  for (i = 0; i < count; i++) {\n    size++;  // identifier\n    switch (mqtt_prop_type_by_id(props[i].id)) {\n      case MQTT_PROP_TYPE_STRING_PAIR:\n        size += (uint32_t) (props[i].val.len + props[i].key.len +\n                            2 * sizeof(uint16_t));\n        break;\n      case MQTT_PROP_TYPE_STRING:\n        size += (uint32_t) (props[i].val.len + sizeof(uint16_t));\n        break;\n      case MQTT_PROP_TYPE_BINARY_DATA:\n        size += (uint32_t) (props[i].val.len + sizeof(uint16_t));\n        break;\n      case MQTT_PROP_TYPE_VARIABLE_INT:\n        size += varint_size((uint32_t) props[i].iv);\n        break;\n      case MQTT_PROP_TYPE_INT:\n        size += (uint32_t) sizeof(uint32_t);\n        break;\n      case MQTT_PROP_TYPE_SHORT:\n        size += (uint32_t) sizeof(uint16_t);\n        break;\n      case MQTT_PROP_TYPE_BYTE:\n        size += (uint32_t) sizeof(uint8_t);\n        break;\n      default:\n        return size;  // cannot parse further down\n    }\n  }\n\n  return size;\n}\n\n// returns the entire size of the properties section, including the\n// size of the variable length of the content\nstatic size_t get_props_size(struct mg_mqtt_prop *props, size_t count) {\n  size_t size = get_properties_length(props, count);\n  size += varint_size(size);\n  return size;\n}\n\nstatic void mg_send_mqtt_properties(struct mg_connection *c,\n                                    struct mg_mqtt_prop *props, size_t nprops) {\n  size_t total_size = get_properties_length(props, nprops);\n  uint8_t buf_v[4] = {0, 0, 0, 0};\n  uint8_t buf[4] = {0, 0, 0, 0};\n  size_t i, len = encode_varint(buf, total_size);\n\n  mg_send(c, buf, (size_t) len);\n  for (i = 0; i < nprops; i++) {\n    mg_send(c, &props[i].id, sizeof(props[i].id));\n    switch (mqtt_prop_type_by_id(props[i].id)) {\n      case MQTT_PROP_TYPE_STRING_PAIR:\n        mg_send_u16(c, mg_htons((uint16_t) props[i].key.len));\n        mg_send(c, props[i].key.buf, props[i].key.len);\n        mg_send_u16(c, mg_htons((uint16_t) props[i].val.len));\n        mg_send(c, props[i].val.buf, props[i].val.len);\n        break;\n      case MQTT_PROP_TYPE_BYTE:\n        mg_send(c, &props[i].iv, sizeof(uint8_t));\n        break;\n      case MQTT_PROP_TYPE_SHORT:\n        mg_send_u16(c, mg_htons((uint16_t) props[i].iv));\n        break;\n      case MQTT_PROP_TYPE_INT:\n        mg_send_u32(c, mg_htonl((uint32_t) props[i].iv));\n        break;\n      case MQTT_PROP_TYPE_STRING:\n        mg_send_u16(c, mg_htons((uint16_t) props[i].val.len));\n        mg_send(c, props[i].val.buf, props[i].val.len);\n        break;\n      case MQTT_PROP_TYPE_BINARY_DATA:\n        mg_send_u16(c, mg_htons((uint16_t) props[i].val.len));\n        mg_send(c, props[i].val.buf, props[i].val.len);\n        break;\n      case MQTT_PROP_TYPE_VARIABLE_INT:\n        len = encode_varint(buf_v, props[i].iv);\n        mg_send(c, buf_v, (size_t) len);\n        break;\n    }\n  }\n}\n\nsize_t mg_mqtt_next_prop(struct mg_mqtt_message *msg, struct mg_mqtt_prop *prop,\n                         size_t ofs) {\n  uint8_t *i = (uint8_t *) msg->dgram.buf + msg->props_start + ofs;\n  uint8_t *end = (uint8_t *) msg->dgram.buf + msg->dgram.len;\n  size_t new_pos = ofs, len;\n  prop->id = i[0];\n\n  if (ofs >= msg->dgram.len || ofs >= msg->props_start + msg->props_size)\n    return 0;\n  i++, new_pos++;\n\n  switch (mqtt_prop_type_by_id(prop->id)) {\n    case MQTT_PROP_TYPE_STRING_PAIR:\n      prop->key.len = (uint16_t) ((((uint16_t) i[0]) << 8) | i[1]);\n      prop->key.buf = (char *) i + 2;\n      i += 2 + prop->key.len;\n      prop->val.len = (uint16_t) ((((uint16_t) i[0]) << 8) | i[1]);\n      prop->val.buf = (char *) i + 2;\n      new_pos += 2 * sizeof(uint16_t) + prop->val.len + prop->key.len;\n      break;\n    case MQTT_PROP_TYPE_BYTE:\n      prop->iv = (uint8_t) i[0];\n      new_pos++;\n      break;\n    case MQTT_PROP_TYPE_SHORT:\n      prop->iv = (uint16_t) ((((uint16_t) i[0]) << 8) | i[1]);\n      new_pos += sizeof(uint16_t);\n      break;\n    case MQTT_PROP_TYPE_INT:\n      prop->iv = ((uint32_t) i[0] << 24) | ((uint32_t) i[1] << 16) |\n                 ((uint32_t) i[2] << 8) | i[3];\n      new_pos += sizeof(uint32_t);\n      break;\n    case MQTT_PROP_TYPE_STRING:\n      prop->val.len = (uint16_t) ((((uint16_t) i[0]) << 8) | i[1]);\n      prop->val.buf = (char *) i + 2;\n      new_pos += 2 + prop->val.len;\n      break;\n    case MQTT_PROP_TYPE_BINARY_DATA:\n      prop->val.len = (uint16_t) ((((uint16_t) i[0]) << 8) | i[1]);\n      prop->val.buf = (char *) i + 2;\n      new_pos += 2 + prop->val.len;\n      break;\n    case MQTT_PROP_TYPE_VARIABLE_INT:\n      len = decode_varint(i, (size_t) (end - i), (size_t *) &prop->iv);\n      new_pos = (!len) ? 0 : new_pos + len;\n      break;\n    default:\n      new_pos = 0;\n  }\n\n  return new_pos;\n}\n\nvoid mg_mqtt_login(struct mg_connection *c, const struct mg_mqtt_opts *opts) {\n  char client_id[21];\n  struct mg_str cid = opts->client_id;\n  size_t total_len = 7 + 1 + 2 + 2;\n  uint8_t hdr[8] = {0, 4, 'M', 'Q', 'T', 'T', opts->version, 0};\n\n  if (cid.len == 0) {\n    mg_random_str(client_id, sizeof(client_id) - 1);\n    client_id[sizeof(client_id) - 1] = '\\0';\n    cid = mg_str(client_id);\n  }\n\n  if (hdr[6] == 0) hdr[6] = 4;  // If version is not set, use 4 (3.1.1)\n  c->is_mqtt5 = hdr[6] == 5;    // Set version 5 flag\n  hdr[7] = (uint8_t) ((opts->qos & 3) << 3);  // Connection flags\n  if (opts->user.len > 0) {\n    total_len += 2 + (uint32_t) opts->user.len;\n    hdr[7] |= MQTT_HAS_USER_NAME;\n  }\n  if (opts->pass.len > 0) {\n    total_len += 2 + (uint32_t) opts->pass.len;\n    hdr[7] |= MQTT_HAS_PASSWORD;\n  }\n  if (opts->topic.len > 0) {  // allow zero-length msgs, message.len is size_t\n    total_len += 4 + (uint32_t) opts->topic.len + (uint32_t) opts->message.len;\n    hdr[7] |= MQTT_HAS_WILL;\n  }\n  if (opts->clean || cid.len == 0) hdr[7] |= MQTT_CLEAN_SESSION;\n  if (opts->retain) hdr[7] |= MQTT_WILL_RETAIN;\n  total_len += (uint32_t) cid.len;\n  if (c->is_mqtt5) {\n    total_len += get_props_size(opts->props, opts->num_props);\n    if (hdr[7] & MQTT_HAS_WILL)\n      total_len += get_props_size(opts->will_props, opts->num_will_props);\n  }\n\n  mg_mqtt_send_header(c, MQTT_CMD_CONNECT, 0, (uint32_t) total_len);\n  mg_send(c, hdr, sizeof(hdr));\n  // keepalive == 0 means \"do not disconnect us!\"\n  mg_send_u16(c, mg_htons((uint16_t) opts->keepalive));\n\n  if (c->is_mqtt5) mg_send_mqtt_properties(c, opts->props, opts->num_props);\n\n  mg_send_u16(c, mg_htons((uint16_t) cid.len));\n  mg_send(c, cid.buf, cid.len);\n\n  if (hdr[7] & MQTT_HAS_WILL) {\n    if (c->is_mqtt5)\n      mg_send_mqtt_properties(c, opts->will_props, opts->num_will_props);\n\n    mg_send_u16(c, mg_htons((uint16_t) opts->topic.len));\n    mg_send(c, opts->topic.buf, opts->topic.len);\n    mg_send_u16(c, mg_htons((uint16_t) opts->message.len));\n    mg_send(c, opts->message.buf, opts->message.len);\n  }\n  if (opts->user.len > 0) {\n    mg_send_u16(c, mg_htons((uint16_t) opts->user.len));\n    mg_send(c, opts->user.buf, opts->user.len);\n  }\n  if (opts->pass.len > 0) {\n    mg_send_u16(c, mg_htons((uint16_t) opts->pass.len));\n    mg_send(c, opts->pass.buf, opts->pass.len);\n  }\n}\n\nuint16_t mg_mqtt_pub(struct mg_connection *c, const struct mg_mqtt_opts *opts) {\n  uint16_t id = opts->retransmit_id;\n  uint8_t flags = (uint8_t) (((opts->qos & 3) << 1) | (opts->retain ? 1 : 0));\n  size_t len = 2 + opts->topic.len + opts->message.len;\n  MG_DEBUG((\"%lu [%.*s] <- [%.*s%c\", c->id, (int) opts->topic.len,\n            (char *) opts->topic.buf,\n            (int) (opts->message.len <= 10 ? opts->message.len : 10),\n            (char *) opts->message.buf, opts->message.len <= 10 ? ']' : ' '));\n  if (opts->qos > 0) len += 2;\n  if (c->is_mqtt5) len += get_props_size(opts->props, opts->num_props);\n\n  if (opts->qos > 0 && id != 0) flags |= 1 << 3;\n  mg_mqtt_send_header(c, MQTT_CMD_PUBLISH, flags, (uint32_t) len);\n  mg_send_u16(c, mg_htons((uint16_t) opts->topic.len));\n  mg_send(c, opts->topic.buf, opts->topic.len);\n  if (opts->qos > 0) {  // need to send 'id' field\n    if (id == 0) {      // generate new one if not resending\n      if (++c->mgr->mqtt_id == 0) ++c->mgr->mqtt_id;\n      id = c->mgr->mqtt_id;\n    }\n    mg_send_u16(c, mg_htons(id));\n  }\n\n  if (c->is_mqtt5) mg_send_mqtt_properties(c, opts->props, opts->num_props);\n\n  if (opts->message.len > 0) mg_send(c, opts->message.buf, opts->message.len);\n  return id;\n}\n\nvoid mg_mqtt_sub(struct mg_connection *c, const struct mg_mqtt_opts *opts) {\n  uint8_t qos_ = opts->qos & 3;\n  size_t plen = c->is_mqtt5 ? get_props_size(opts->props, opts->num_props) : 0;\n  size_t len = 2 + opts->topic.len + 2 + 1 + plen;\n\n  mg_mqtt_send_header(c, MQTT_CMD_SUBSCRIBE, 2, (uint32_t) len);\n  if (++c->mgr->mqtt_id == 0) ++c->mgr->mqtt_id;\n  mg_send_u16(c, mg_htons(c->mgr->mqtt_id));\n  if (c->is_mqtt5) mg_send_mqtt_properties(c, opts->props, opts->num_props);\n\n  mg_send_u16(c, mg_htons((uint16_t) opts->topic.len));\n  mg_send(c, opts->topic.buf, opts->topic.len);\n  mg_send(c, &qos_, sizeof(qos_));\n}\n\nint mg_mqtt_parse(const uint8_t *buf, size_t len, uint8_t version,\n                  struct mg_mqtt_message *m) {\n  uint8_t lc = 0, *p, *end;\n  uint32_t n = 0, len_len = 0;\n\n  memset(m, 0, sizeof(*m));\n  m->dgram.buf = (char *) buf;\n  if (len < 2) return MQTT_INCOMPLETE;\n  m->cmd = (uint8_t) (buf[0] >> 4);\n  m->qos = (buf[0] >> 1) & 3;\n\n  n = len_len = 0;\n  p = (uint8_t *) buf + 1;\n  while ((size_t) (p - buf) < len) {\n    lc = *((uint8_t *) p++);\n    n += (uint32_t) ((lc & 0x7f) << 7 * len_len);\n    len_len++;\n    if (!(lc & 0x80)) break;\n    if (len_len >= 4) return MQTT_MALFORMED;\n  }\n  end = p + n;\n  if ((lc & 0x80) || (end > buf + len)) return MQTT_INCOMPLETE;\n  m->dgram.len = (size_t) (end - buf);\n\n  switch (m->cmd) {\n    case MQTT_CMD_CONNACK:\n      if (end - p < 2) return MQTT_MALFORMED;\n      m->ack = p[1];\n      break;\n    case MQTT_CMD_PUBACK:\n    case MQTT_CMD_PUBREC:\n    case MQTT_CMD_PUBREL:\n    case MQTT_CMD_PUBCOMP:\n    case MQTT_CMD_SUBSCRIBE:\n    case MQTT_CMD_SUBACK:\n    case MQTT_CMD_UNSUBSCRIBE:\n    case MQTT_CMD_UNSUBACK:\n      if (p + 2 > end) return MQTT_MALFORMED;\n      m->id = (uint16_t) ((((uint16_t) p[0]) << 8) | p[1]);\n      p += 2;\n      break;\n    case MQTT_CMD_PUBLISH: {\n      if (p + 2 > end) return MQTT_MALFORMED;\n      m->topic.len = (uint16_t) ((((uint16_t) p[0]) << 8) | p[1]);\n      m->topic.buf = (char *) p + 2;\n      p += 2 + m->topic.len;\n      if (p > end) return MQTT_MALFORMED;\n      if (m->qos > 0) {\n        if (p + 2 > end) return MQTT_MALFORMED;\n        m->id = (uint16_t) ((((uint16_t) p[0]) << 8) | p[1]);\n        p += 2;\n      }\n      if (p > end) return MQTT_MALFORMED;\n      if (version == 5 && p + 2 < end) {\n        len_len =\n            (uint32_t) decode_varint(p, (size_t) (end - p), &m->props_size);\n        if (!len_len) return MQTT_MALFORMED;\n        m->props_start = (size_t) (p + len_len - buf);\n        p += len_len + m->props_size;\n      }\n      if (p > end) return MQTT_MALFORMED;\n      m->data.buf = (char *) p;\n      m->data.len = (size_t) (end - p);\n      break;\n    }\n    default:\n      break;\n  }\n  return MQTT_OK;\n}\n\nstatic void mqtt_cb(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_READ) {\n    for (;;) {\n      uint8_t version = c->is_mqtt5 ? 5 : 4;\n      struct mg_mqtt_message mm;\n      int rc = mg_mqtt_parse(c->recv.buf, c->recv.len, version, &mm);\n      if (rc == MQTT_MALFORMED) {\n        MG_ERROR((\"%lu MQTT malformed message\", c->id));\n        c->is_closing = 1;\n        break;\n      } else if (rc == MQTT_OK) {\n        MG_VERBOSE((\"%lu MQTT CMD %d len %d [%.*s]\", c->id, mm.cmd,\n                    (int) mm.dgram.len, (int) mm.data.len, mm.data.buf));\n        switch (mm.cmd) {\n          case MQTT_CMD_CONNACK:\n            mg_call(c, MG_EV_MQTT_OPEN, &mm.ack);\n            if (mm.ack == 0) {\n              MG_DEBUG((\"%lu Connected\", c->id));\n            } else {\n              MG_ERROR((\"%lu MQTT auth failed, code %d\", c->id, mm.ack));\n              c->is_closing = 1;\n            }\n            break;\n          case MQTT_CMD_PUBLISH: {\n            MG_DEBUG((\"%lu [%.*s] -> [%.*s%c\", c->id, (int) mm.topic.len,\n                      mm.topic.buf,\n                      (int) (mm.data.len <= 10 ? mm.data.len : 10), mm.data.buf,\n                      mm.data.len <= 10 ? ']' : ' '));\n            if (mm.qos > 0) {\n              uint16_t id = mg_ntohs(mm.id);\n              uint32_t remaining_len = sizeof(id);\n              if (c->is_mqtt5) remaining_len += 2;  // 3.4.2\n\n              mg_mqtt_send_header(\n                  c,\n                  (uint8_t) (mm.qos == 2 ? MQTT_CMD_PUBREC : MQTT_CMD_PUBACK),\n                  0, remaining_len);\n              mg_send(c, &id, sizeof(id));\n\n              if (c->is_mqtt5) {\n                uint16_t zero = 0;\n                mg_send(c, &zero, sizeof(zero));\n              }\n            }\n            mg_call(c, MG_EV_MQTT_MSG, &mm);  // let the app handle qos stuff\n            break;\n          }\n          case MQTT_CMD_PUBREC: {  // MQTT5: 3.5.2-1 TODO(): variable header rc\n            uint16_t id = mg_ntohs(mm.id);\n            uint32_t remaining_len = sizeof(id);  // MQTT5 3.6.2-1\n            mg_mqtt_send_header(c, MQTT_CMD_PUBREL, 2, remaining_len);\n            mg_send(c, &id, sizeof(id));  // MQTT5 3.6.1-1, flags = 2\n            break;\n          }\n          case MQTT_CMD_PUBREL: {  // MQTT5: 3.6.2-1 TODO(): variable header rc\n            uint16_t id = mg_ntohs(mm.id);\n            uint32_t remaining_len = sizeof(id);  // MQTT5 3.7.2-1\n            mg_mqtt_send_header(c, MQTT_CMD_PUBCOMP, 0, remaining_len);\n            mg_send(c, &id, sizeof(id));\n            break;\n          }\n        }\n        mg_call(c, MG_EV_MQTT_CMD, &mm);\n        mg_iobuf_del(&c->recv, 0, mm.dgram.len);\n      } else {\n        break;\n      }\n    }\n  }\n  (void) ev_data;\n}\n\nvoid mg_mqtt_ping(struct mg_connection *nc) {\n  mg_mqtt_send_header(nc, MQTT_CMD_PINGREQ, 0, 0);\n}\n\nvoid mg_mqtt_pong(struct mg_connection *nc) {\n  mg_mqtt_send_header(nc, MQTT_CMD_PINGRESP, 0, 0);\n}\n\nvoid mg_mqtt_disconnect(struct mg_connection *c,\n                        const struct mg_mqtt_opts *opts) {\n  size_t len = 0;\n  if (c->is_mqtt5) len = 1 + get_props_size(opts->props, opts->num_props);\n  mg_mqtt_send_header(c, MQTT_CMD_DISCONNECT, 0, (uint32_t) len);\n\n  if (c->is_mqtt5) {\n    uint8_t zero = 0;\n    mg_send(c, &zero, sizeof(zero));  // reason code\n    mg_send_mqtt_properties(c, opts->props, opts->num_props);\n  }\n}\n\nstruct mg_connection *mg_mqtt_connect(struct mg_mgr *mgr, const char *url,\n                                      const struct mg_mqtt_opts *opts,\n                                      mg_event_handler_t fn, void *fn_data) {\n  struct mg_connection *c = mg_connect(mgr, url, fn, fn_data);\n  if (c != NULL) {\n    struct mg_mqtt_opts empty;\n    memset(&empty, 0, sizeof(empty));\n    mg_mqtt_login(c, opts == NULL ? &empty : opts);\n    c->pfn = mqtt_cb;\n  }\n  return c;\n}\n\nstruct mg_connection *mg_mqtt_listen(struct mg_mgr *mgr, const char *url,\n                                     mg_event_handler_t fn, void *fn_data) {\n  struct mg_connection *c = mg_listen(mgr, url, fn, fn_data);\n  if (c != NULL) c->pfn = mqtt_cb, c->pfn_data = mgr;\n  return c;\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/net.c\"\n#endif\n\n\n\n\n\n\n\n\n\nsize_t mg_vprintf(struct mg_connection *c, const char *fmt, va_list *ap) {\n  size_t old = c->send.len;\n  mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, ap);\n  return c->send.len - old;\n}\n\nsize_t mg_printf(struct mg_connection *c, const char *fmt, ...) {\n  size_t len = 0;\n  va_list ap;\n  va_start(ap, fmt);\n  len = mg_vprintf(c, fmt, &ap);\n  va_end(ap);\n  return len;\n}\n\nstatic bool mg_atonl(struct mg_str str, struct mg_addr *addr) {\n  uint32_t localhost = mg_htonl(0x7f000001);\n  if (mg_strcasecmp(str, mg_str(\"localhost\")) != 0) return false;\n  memcpy(addr->ip, &localhost, sizeof(uint32_t));\n  addr->is_ip6 = false;\n  return true;\n}\n\nstatic bool mg_atone(struct mg_str str, struct mg_addr *addr) {\n  if (str.len > 0) return false;\n  memset(addr->ip, 0, sizeof(addr->ip));\n  addr->is_ip6 = false;\n  return true;\n}\n\nstatic bool mg_aton4(struct mg_str str, struct mg_addr *addr) {\n  uint8_t data[4] = {0, 0, 0, 0};\n  size_t i, num_dots = 0;\n  for (i = 0; i < str.len; i++) {\n    if (str.buf[i] >= '0' && str.buf[i] <= '9') {\n      int octet = data[num_dots] * 10 + (str.buf[i] - '0');\n      if (octet > 255) return false;\n      data[num_dots] = (uint8_t) octet;\n    } else if (str.buf[i] == '.') {\n      if (num_dots >= 3 || i == 0 || str.buf[i - 1] == '.') return false;\n      num_dots++;\n    } else {\n      return false;\n    }\n  }\n  if (num_dots != 3 || str.buf[i - 1] == '.') return false;\n  memcpy(&addr->ip, data, sizeof(data));\n  addr->is_ip6 = false;\n  return true;\n}\n\nstatic bool mg_v4mapped(struct mg_str str, struct mg_addr *addr) {\n  int i;\n  uint32_t ipv4;\n  if (str.len < 14) return false;\n  if (str.buf[0] != ':' || str.buf[1] != ':' || str.buf[6] != ':') return false;\n  for (i = 2; i < 6; i++) {\n    if (str.buf[i] != 'f' && str.buf[i] != 'F') return false;\n  }\n  // struct mg_str s = mg_str_n(&str.buf[7], str.len - 7);\n  if (!mg_aton4(mg_str_n(&str.buf[7], str.len - 7), addr)) return false;\n  memcpy(&ipv4, addr->ip, sizeof(ipv4));\n  memset(addr->ip, 0, sizeof(addr->ip));\n  addr->ip[10] = addr->ip[11] = 255;\n  memcpy(&addr->ip[12], &ipv4, 4);\n  addr->is_ip6 = true;\n  return true;\n}\n\nstatic bool mg_aton6(struct mg_str str, struct mg_addr *addr) {\n  size_t i, j = 0, n = 0, dc = 42;\n  addr->scope_id = 0;\n  if (str.len > 2 && str.buf[0] == '[') str.buf++, str.len -= 2;\n  if (mg_v4mapped(str, addr)) return true;\n  for (i = 0; i < str.len; i++) {\n    if ((str.buf[i] >= '0' && str.buf[i] <= '9') ||\n        (str.buf[i] >= 'a' && str.buf[i] <= 'f') ||\n        (str.buf[i] >= 'A' && str.buf[i] <= 'F')) {\n      unsigned long val = 0;  // TODO(): This loops on chars, refactor\n      if (i > j + 3) return false;\n      // MG_DEBUG((\"%lu %lu [%.*s]\", i, j, (int) (i - j + 1), &str.buf[j]));\n      mg_str_to_num(mg_str_n(&str.buf[j], i - j + 1), 16, &val, sizeof(val));\n      addr->ip[n] = (uint8_t) ((val >> 8) & 255);\n      addr->ip[n + 1] = (uint8_t) (val & 255);\n    } else if (str.buf[i] == ':') {\n      j = i + 1;\n      if (i > 0 && str.buf[i - 1] == ':') {\n        dc = n;  // Double colon\n        if (i > 1 && str.buf[i - 2] == ':') return false;\n      } else if (i > 0) {\n        n += 2;\n      }\n      if (n > 14) return false;\n      addr->ip[n] = addr->ip[n + 1] = 0;  // For trailing ::\n    } else if (str.buf[i] == '%') {       // Scope ID, last in string\n      return mg_str_to_num(mg_str_n(&str.buf[i + 1], str.len - i - 1), 10,\n                           &addr->scope_id, sizeof(uint8_t));\n    } else {\n      return false;\n    }\n  }\n  if (n < 14 && dc == 42) return false;\n  if (n < 14) {\n    memmove(&addr->ip[dc + (14 - n)], &addr->ip[dc], n - dc + 2);\n    memset(&addr->ip[dc], 0, 14 - n);\n  }\n\n  addr->is_ip6 = true;\n  return true;\n}\n\nbool mg_aton(struct mg_str str, struct mg_addr *addr) {\n  // MG_INFO((\"[%.*s]\", (int) str.len, str.buf));\n  return mg_atone(str, addr) || mg_atonl(str, addr) || mg_aton4(str, addr) ||\n         mg_aton6(str, addr);\n}\n\nstruct mg_connection *mg_alloc_conn(struct mg_mgr *mgr) {\n  struct mg_connection *c =\n      (struct mg_connection *) calloc(1, sizeof(*c) + mgr->extraconnsize);\n  if (c != NULL) {\n    c->mgr = mgr;\n    c->send.align = c->recv.align = c->rtls.align = MG_IO_SIZE;\n    c->id = ++mgr->nextid;\n    MG_PROF_INIT(c);\n  }\n  return c;\n}\n\nvoid mg_close_conn(struct mg_connection *c) {\n  mg_resolve_cancel(c);  // Close any pending DNS query\n  LIST_DELETE(struct mg_connection, &c->mgr->conns, c);\n  if (c == c->mgr->dns4.c) c->mgr->dns4.c = NULL;\n  if (c == c->mgr->dns6.c) c->mgr->dns6.c = NULL;\n  // Order of operations is important. `MG_EV_CLOSE` event must be fired\n  // before we deallocate received data, see #1331\n  mg_call(c, MG_EV_CLOSE, NULL);\n  MG_DEBUG((\"%lu %ld closed\", c->id, c->fd));\n  MG_PROF_DUMP(c);\n  MG_PROF_FREE(c);\n\n  mg_tls_free(c);\n  mg_iobuf_free(&c->recv);\n  mg_iobuf_free(&c->send);\n  mg_iobuf_free(&c->rtls);\n  mg_bzero((unsigned char *) c, sizeof(*c));\n  free(c);\n}\n\nstruct mg_connection *mg_connect(struct mg_mgr *mgr, const char *url,\n                                 mg_event_handler_t fn, void *fn_data) {\n  struct mg_connection *c = NULL;\n  if (url == NULL || url[0] == '\\0') {\n    MG_ERROR((\"null url\"));\n  } else if ((c = mg_alloc_conn(mgr)) == NULL) {\n    MG_ERROR((\"OOM\"));\n  } else {\n    LIST_ADD_HEAD(struct mg_connection, &mgr->conns, c);\n    c->is_udp = (strncmp(url, \"udp:\", 4) == 0);\n    c->fd = (void *) (size_t) MG_INVALID_SOCKET;\n    c->fn = fn;\n    c->is_client = true;\n    c->fn_data = fn_data;\n    MG_DEBUG((\"%lu %ld %s\", c->id, c->fd, url));\n    mg_call(c, MG_EV_OPEN, (void *) url);\n    mg_resolve(c, url);\n  }\n  return c;\n}\n\nstruct mg_connection *mg_listen(struct mg_mgr *mgr, const char *url,\n                                mg_event_handler_t fn, void *fn_data) {\n  struct mg_connection *c = NULL;\n  if ((c = mg_alloc_conn(mgr)) == NULL) {\n    MG_ERROR((\"OOM %s\", url));\n  } else if (!mg_open_listener(c, url)) {\n    MG_ERROR((\"Failed: %s, errno %d\", url, errno));\n    MG_PROF_FREE(c);\n    free(c);\n    c = NULL;\n  } else {\n    c->is_listening = 1;\n    c->is_udp = strncmp(url, \"udp:\", 4) == 0;\n    LIST_ADD_HEAD(struct mg_connection, &mgr->conns, c);\n    c->fn = fn;\n    c->fn_data = fn_data;\n    mg_call(c, MG_EV_OPEN, NULL);\n    if (mg_url_is_ssl(url)) c->is_tls = 1;  // Accepted connection must\n    MG_DEBUG((\"%lu %ld %s\", c->id, c->fd, url));\n  }\n  return c;\n}\n\nstruct mg_connection *mg_wrapfd(struct mg_mgr *mgr, int fd,\n                                mg_event_handler_t fn, void *fn_data) {\n  struct mg_connection *c = mg_alloc_conn(mgr);\n  if (c != NULL) {\n    c->fd = (void *) (size_t) fd;\n    c->fn = fn;\n    c->fn_data = fn_data;\n    MG_EPOLL_ADD(c);\n    mg_call(c, MG_EV_OPEN, NULL);\n    LIST_ADD_HEAD(struct mg_connection, &mgr->conns, c);\n  }\n  return c;\n}\n\nstruct mg_timer *mg_timer_add(struct mg_mgr *mgr, uint64_t milliseconds,\n                              unsigned flags, void (*fn)(void *), void *arg) {\n  struct mg_timer *t = (struct mg_timer *) calloc(1, sizeof(*t));\n  if (t != NULL) {\n    mg_timer_init(&mgr->timers, t, milliseconds, flags, fn, arg);\n    t->id = mgr->timerid++;\n  }\n  return t;\n}\n\nlong mg_io_recv(struct mg_connection *c, void *buf, size_t len) {\n  if (c->rtls.len == 0) return MG_IO_WAIT;\n  if (len > c->rtls.len) len = c->rtls.len;\n  memcpy(buf, c->rtls.buf, len);\n  mg_iobuf_del(&c->rtls, 0, len);\n  return (long) len;\n}\n\nvoid mg_mgr_free(struct mg_mgr *mgr) {\n  struct mg_connection *c;\n  struct mg_timer *tmp, *t = mgr->timers;\n  while (t != NULL) tmp = t->next, free(t), t = tmp;\n  mgr->timers = NULL;  // Important. Next call to poll won't touch timers\n  for (c = mgr->conns; c != NULL; c = c->next) c->is_closing = 1;\n  mg_mgr_poll(mgr, 0);\n#if MG_ENABLE_FREERTOS_TCP\n  FreeRTOS_DeleteSocketSet(mgr->ss);\n#endif\n  MG_DEBUG((\"All connections closed\"));\n#if MG_ENABLE_EPOLL\n  if (mgr->epoll_fd >= 0) close(mgr->epoll_fd), mgr->epoll_fd = -1;\n#endif\n  mg_tls_ctx_free(mgr);\n}\n\nvoid mg_mgr_init(struct mg_mgr *mgr) {\n  memset(mgr, 0, sizeof(*mgr));\n#if MG_ENABLE_EPOLL\n  if ((mgr->epoll_fd = epoll_create1(EPOLL_CLOEXEC)) < 0)\n    MG_ERROR((\"epoll_create1 errno %d\", errno));\n#else\n  mgr->epoll_fd = -1;\n#endif\n#if MG_ARCH == MG_ARCH_WIN32 && MG_ENABLE_WINSOCK\n  // clang-format off\n  { WSADATA data; WSAStartup(MAKEWORD(2, 2), &data); }\n  // clang-format on\n#elif MG_ENABLE_FREERTOS_TCP\n  mgr->ss = FreeRTOS_CreateSocketSet();\n#elif defined(__unix) || defined(__unix__) || defined(__APPLE__)\n  // Ignore SIGPIPE signal, so if client cancels the request, it\n  // won't kill the whole process.\n  signal(SIGPIPE, SIG_IGN);\n#elif MG_ENABLE_TCPIP_DRIVER_INIT && defined(MG_TCPIP_DRIVER_INIT)\n  MG_TCPIP_DRIVER_INIT(mgr);\n#endif\n  mgr->pipe = MG_INVALID_SOCKET;\n  mgr->dnstimeout = 3000;\n  mgr->dns4.url = \"udp://8.8.8.8:53\";\n  mgr->dns6.url = \"udp://[2001:4860:4860::8888]:53\";\n  mg_tls_ctx_init(mgr);\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/net_builtin.c\"\n#endif\n\n\n#if defined(MG_ENABLE_TCPIP) && MG_ENABLE_TCPIP\n#define MG_EPHEMERAL_PORT_BASE 32768\n#define PDIFF(a, b) ((size_t) (((char *) (b)) - ((char *) (a))))\n\n#ifndef MIP_TCP_KEEPALIVE_MS\n#define MIP_TCP_KEEPALIVE_MS 45000  // TCP keep-alive period, ms\n#endif\n\n#define MIP_TCP_ACK_MS 150    // Timeout for ACKing\n#define MIP_ARP_RESP_MS 100   // Timeout for ARP response\n#define MIP_TCP_SYN_MS 15000  // Timeout for connection establishment\n#define MIP_TCP_FIN_MS 1000   // Timeout for closing connection\n#define MIP_TCP_WIN 6000      // TCP window size\n\nstruct connstate {\n  uint32_t seq, ack;           // TCP seq/ack counters\n  uint64_t timer;              // TCP keep-alive / ACK timer\n  uint32_t acked;              // Last ACK-ed number\n  size_t unacked;              // Not acked bytes\n  uint8_t mac[6];              // Peer MAC address\n  uint8_t ttype;               // Timer type. 0: ack, 1: keep-alive\n#define MIP_TTYPE_KEEPALIVE 0  // Connection is idle for long, send keepalive\n#define MIP_TTYPE_ACK 1        // Peer sent us data, we have to ack it soon\n#define MIP_TTYPE_ARP 2        // ARP resolve sent, waiting for response\n#define MIP_TTYPE_SYN 3        // SYN sent, waiting for response\n#define MIP_TTYPE_FIN 4  // FIN sent, waiting until terminating the connection\n  uint8_t tmiss;         // Number of keep-alive misses\n  struct mg_iobuf raw;   // For TLS only. Incoming raw data\n};\n\n#pragma pack(push, 1)\n\nstruct lcp {\n  uint8_t addr, ctrl, proto[2], code, id, len[2];\n};\n\nstruct eth {\n  uint8_t dst[6];  // Destination MAC address\n  uint8_t src[6];  // Source MAC address\n  uint16_t type;   // Ethernet type\n};\n\nstruct ip {\n  uint8_t ver;    // Version\n  uint8_t tos;    // Unused\n  uint16_t len;   // Length\n  uint16_t id;    // Unused\n  uint16_t frag;  // Fragmentation\n#define IP_FRAG_OFFSET_MSK 0x1fff\n#define IP_MORE_FRAGS_MSK 0x2000\n  uint8_t ttl;    // Time to live\n  uint8_t proto;  // Upper level protocol\n  uint16_t csum;  // Checksum\n  uint32_t src;   // Source IP\n  uint32_t dst;   // Destination IP\n};\n\nstruct ip6 {\n  uint8_t ver;      // Version\n  uint8_t opts[3];  // Options\n  uint16_t len;     // Length\n  uint8_t proto;    // Upper level protocol\n  uint8_t ttl;      // Time to live\n  uint8_t src[16];  // Source IP\n  uint8_t dst[16];  // Destination IP\n};\n\nstruct icmp {\n  uint8_t type;\n  uint8_t code;\n  uint16_t csum;\n};\n\nstruct arp {\n  uint16_t fmt;    // Format of hardware address\n  uint16_t pro;    // Format of protocol address\n  uint8_t hlen;    // Length of hardware address\n  uint8_t plen;    // Length of protocol address\n  uint16_t op;     // Operation\n  uint8_t sha[6];  // Sender hardware address\n  uint32_t spa;    // Sender protocol address\n  uint8_t tha[6];  // Target hardware address\n  uint32_t tpa;    // Target protocol address\n};\n\nstruct tcp {\n  uint16_t sport;  // Source port\n  uint16_t dport;  // Destination port\n  uint32_t seq;    // Sequence number\n  uint32_t ack;    // Acknowledgement number\n  uint8_t off;     // Data offset\n  uint8_t flags;   // TCP flags\n#define TH_FIN 0x01\n#define TH_SYN 0x02\n#define TH_RST 0x04\n#define TH_PUSH 0x08\n#define TH_ACK 0x10\n#define TH_URG 0x20\n#define TH_ECE 0x40\n#define TH_CWR 0x80\n  uint16_t win;   // Window\n  uint16_t csum;  // Checksum\n  uint16_t urp;   // Urgent pointer\n};\n\nstruct udp {\n  uint16_t sport;  // Source port\n  uint16_t dport;  // Destination port\n  uint16_t len;    // UDP length\n  uint16_t csum;   // UDP checksum\n};\n\nstruct dhcp {\n  uint8_t op, htype, hlen, hops;\n  uint32_t xid;\n  uint16_t secs, flags;\n  uint32_t ciaddr, yiaddr, siaddr, giaddr;\n  uint8_t hwaddr[208];\n  uint32_t magic;\n  uint8_t options[32];\n};\n\n#pragma pack(pop)\n\nstruct pkt {\n  struct mg_str raw;  // Raw packet data\n  struct mg_str pay;  // Payload data\n  struct eth *eth;\n  struct llc *llc;\n  struct arp *arp;\n  struct ip *ip;\n  struct ip6 *ip6;\n  struct icmp *icmp;\n  struct tcp *tcp;\n  struct udp *udp;\n  struct dhcp *dhcp;\n};\n\nstatic void mg_tcpip_call(struct mg_tcpip_if *ifp, int ev, void *ev_data) {\n  if (ifp->fn != NULL) ifp->fn(ifp, ev, ev_data);\n}\n\nstatic void send_syn(struct mg_connection *c);\n\nstatic void mkpay(struct pkt *pkt, void *p) {\n  pkt->pay =\n      mg_str_n((char *) p, (size_t) (&pkt->raw.buf[pkt->raw.len] - (char *) p));\n}\n\nstatic uint32_t csumup(uint32_t sum, const void *buf, size_t len) {\n  size_t i;\n  const uint8_t *p = (const uint8_t *) buf;\n  for (i = 0; i < len; i++) sum += i & 1 ? p[i] : ((uint32_t) p[i]) << 8;\n  return sum;\n}\n\nstatic uint16_t csumfin(uint32_t sum) {\n  while (sum >> 16) sum = (sum & 0xffff) + (sum >> 16);\n  return mg_htons(~sum & 0xffff);\n}\n\nstatic uint16_t ipcsum(const void *buf, size_t len) {\n  uint32_t sum = csumup(0, buf, len);\n  return csumfin(sum);\n}\n\nstatic void settmout(struct mg_connection *c, uint8_t type) {\n  struct mg_tcpip_if *ifp = c->mgr->ifp;\n  struct connstate *s = (struct connstate *) (c + 1);\n  unsigned n = type == MIP_TTYPE_ACK   ? MIP_TCP_ACK_MS\n               : type == MIP_TTYPE_ARP ? MIP_ARP_RESP_MS\n               : type == MIP_TTYPE_SYN ? MIP_TCP_SYN_MS\n               : type == MIP_TTYPE_FIN ? MIP_TCP_FIN_MS\n                                       : MIP_TCP_KEEPALIVE_MS;\n  s->timer = ifp->now + n;\n  s->ttype = type;\n  MG_VERBOSE((\"%lu %d -> %llx\", c->id, type, s->timer));\n}\n\nstatic size_t ether_output(struct mg_tcpip_if *ifp, size_t len) {\n  size_t n = ifp->driver->tx(ifp->tx.buf, len, ifp);\n  if (n == len) ifp->nsent++;\n  return n;\n}\n\nvoid mg_tcpip_arp_request(struct mg_tcpip_if *ifp, uint32_t ip, uint8_t *mac) {\n  struct eth *eth = (struct eth *) ifp->tx.buf;\n  struct arp *arp = (struct arp *) (eth + 1);\n  memset(eth->dst, 255, sizeof(eth->dst));\n  memcpy(eth->src, ifp->mac, sizeof(eth->src));\n  eth->type = mg_htons(0x806);\n  memset(arp, 0, sizeof(*arp));\n  arp->fmt = mg_htons(1), arp->pro = mg_htons(0x800), arp->hlen = 6,\n  arp->plen = 4;\n  arp->op = mg_htons(1), arp->tpa = ip, arp->spa = ifp->ip;\n  memcpy(arp->sha, ifp->mac, sizeof(arp->sha));\n  if (mac != NULL) memcpy(arp->tha, mac, sizeof(arp->tha));\n  ether_output(ifp, PDIFF(eth, arp + 1));\n}\n\nstatic void onstatechange(struct mg_tcpip_if *ifp) {\n  if (ifp->state == MG_TCPIP_STATE_READY) {\n    MG_INFO((\"READY, IP: %M\", mg_print_ip4, &ifp->ip));\n    MG_INFO((\"       GW: %M\", mg_print_ip4, &ifp->gw));\n    MG_INFO((\"      MAC: %M\", mg_print_mac, &ifp->mac));\n  } else if (ifp->state == MG_TCPIP_STATE_IP) {\n    MG_ERROR((\"Got IP\"));\n    mg_tcpip_arp_request(ifp, ifp->gw, NULL);  // unsolicited GW ARP request\n  } else if (ifp->state == MG_TCPIP_STATE_UP) {\n    MG_ERROR((\"Link up\"));\n    srand((unsigned int) mg_millis());\n  } else if (ifp->state == MG_TCPIP_STATE_DOWN) {\n    MG_ERROR((\"Link down\"));\n  }\n  mg_tcpip_call(ifp, MG_TCPIP_EV_ST_CHG, &ifp->state);\n}\n\nstatic struct ip *tx_ip(struct mg_tcpip_if *ifp, uint8_t *mac_dst,\n                        uint8_t proto, uint32_t ip_src, uint32_t ip_dst,\n                        size_t plen) {\n  struct eth *eth = (struct eth *) ifp->tx.buf;\n  struct ip *ip = (struct ip *) (eth + 1);\n  memcpy(eth->dst, mac_dst, sizeof(eth->dst));\n  memcpy(eth->src, ifp->mac, sizeof(eth->src));  // Use our MAC\n  eth->type = mg_htons(0x800);\n  memset(ip, 0, sizeof(*ip));\n  ip->ver = 0x45;               // Version 4, header length 5 words\n  ip->frag = mg_htons(0x4000);  // Don't fragment\n  ip->len = mg_htons((uint16_t) (sizeof(*ip) + plen));\n  ip->ttl = 64;\n  ip->proto = proto;\n  ip->src = ip_src;\n  ip->dst = ip_dst;\n  ip->csum = ipcsum(ip, sizeof(*ip));\n  return ip;\n}\n\nstatic void tx_udp(struct mg_tcpip_if *ifp, uint8_t *mac_dst, uint32_t ip_src,\n                   uint16_t sport, uint32_t ip_dst, uint16_t dport,\n                   const void *buf, size_t len) {\n  struct ip *ip =\n      tx_ip(ifp, mac_dst, 17, ip_src, ip_dst, len + sizeof(struct udp));\n  struct udp *udp = (struct udp *) (ip + 1);\n  // MG_DEBUG((\"UDP XX LEN %d %d\", (int) len, (int) ifp->tx.len));\n  udp->sport = sport;\n  udp->dport = dport;\n  udp->len = mg_htons((uint16_t) (sizeof(*udp) + len));\n  udp->csum = 0;\n  uint32_t cs = csumup(0, udp, sizeof(*udp));\n  cs = csumup(cs, buf, len);\n  cs = csumup(cs, &ip->src, sizeof(ip->src));\n  cs = csumup(cs, &ip->dst, sizeof(ip->dst));\n  cs += (uint32_t) (ip->proto + sizeof(*udp) + len);\n  udp->csum = csumfin(cs);\n  memmove(udp + 1, buf, len);\n  // MG_DEBUG((\"UDP LEN %d %d\", (int) len, (int) ifp->frame_len));\n  ether_output(ifp, sizeof(struct eth) + sizeof(*ip) + sizeof(*udp) + len);\n}\n\nstatic void tx_dhcp(struct mg_tcpip_if *ifp, uint8_t *mac_dst, uint32_t ip_src,\n                    uint32_t ip_dst, uint8_t *opts, size_t optslen,\n                    bool ciaddr) {\n  // https://datatracker.ietf.org/doc/html/rfc2132#section-9.6\n  struct dhcp dhcp = {1, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, {0}, 0, {0}};\n  dhcp.magic = mg_htonl(0x63825363);\n  memcpy(&dhcp.hwaddr, ifp->mac, sizeof(ifp->mac));\n  memcpy(&dhcp.xid, ifp->mac + 2, sizeof(dhcp.xid));\n  memcpy(&dhcp.options, opts, optslen);\n  if (ciaddr) dhcp.ciaddr = ip_src;\n  tx_udp(ifp, mac_dst, ip_src, mg_htons(68), ip_dst, mg_htons(67), &dhcp,\n         sizeof(dhcp));\n}\n\nstatic const uint8_t broadcast[] = {255, 255, 255, 255, 255, 255};\n\n// RFC-2131 #4.3.6, #4.4.1; RFC-2132 #9.8\nstatic void tx_dhcp_request_sel(struct mg_tcpip_if *ifp, uint32_t ip_req,\n                                uint32_t ip_srv) {\n  uint8_t opts[] = {\n      53, 1, 3,                   // Type: DHCP request\n      12, 3, 'm', 'i', 'p',       // Host name: \"mip\"\n      54, 4, 0,   0,   0,   0,    // DHCP server ID\n      50, 4, 0,   0,   0,   0,    // Requested IP\n      55, 2, 1,   3,   255, 255,  // GW, mask [DNS] [SNTP]\n      255                         // End of options\n  };\n  uint8_t addopts = 0;\n  memcpy(opts + 10, &ip_srv, sizeof(ip_srv));\n  memcpy(opts + 16, &ip_req, sizeof(ip_req));\n  if (ifp->enable_req_dns) opts[24 + addopts++] = 6;    // DNS\n  if (ifp->enable_req_sntp) opts[24 + addopts++] = 42;  // SNTP\n  opts[21] += addopts;\n  tx_dhcp(ifp, (uint8_t *) broadcast, 0, 0xffffffff, opts,\n          sizeof(opts) + addopts - 2, false);\n  MG_DEBUG((\"DHCP req sent\"));\n}\n\n// RFC-2131 #4.3.6, #4.4.5 (renewing: unicast, rebinding: bcast)\nstatic void tx_dhcp_request_re(struct mg_tcpip_if *ifp, uint8_t *mac_dst,\n                               uint32_t ip_src, uint32_t ip_dst) {\n  uint8_t opts[] = {\n      53, 1, 3,  // Type: DHCP request\n      255        // End of options\n  };\n  tx_dhcp(ifp, mac_dst, ip_src, ip_dst, opts, sizeof(opts), true);\n  MG_DEBUG((\"DHCP req sent\"));\n}\n\nstatic void tx_dhcp_discover(struct mg_tcpip_if *ifp) {\n  uint8_t opts[] = {\n      53, 1, 1,     // Type: DHCP discover\n      55, 2, 1, 3,  // Parameters: ip, mask\n      255           // End of options\n  };\n  tx_dhcp(ifp, (uint8_t *) broadcast, 0, 0xffffffff, opts, sizeof(opts), false);\n  MG_DEBUG((\"DHCP discover sent. Our MAC: %M\", mg_print_mac, ifp->mac));\n}\n\nstatic struct mg_connection *getpeer(struct mg_mgr *mgr, struct pkt *pkt,\n                                     bool lsn) {\n  struct mg_connection *c = NULL;\n  for (c = mgr->conns; c != NULL; c = c->next) {\n    if (c->is_arplooking && pkt->arp &&\n        memcmp(&pkt->arp->spa, c->rem.ip, sizeof(pkt->arp->spa)) == 0)\n      break;\n    if (c->is_udp && pkt->udp && c->loc.port == pkt->udp->dport) break;\n    if (!c->is_udp && pkt->tcp && c->loc.port == pkt->tcp->dport &&\n        lsn == c->is_listening && (lsn || c->rem.port == pkt->tcp->sport))\n      break;\n  }\n  return c;\n}\n\nstatic void mac_resolved(struct mg_connection *c);\n\nstatic void rx_arp(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  if (pkt->arp->op == mg_htons(1) && pkt->arp->tpa == ifp->ip) {\n    // ARP request. Make a response, then send\n    // MG_DEBUG((\"ARP op %d %M: %M\", mg_ntohs(pkt->arp->op), mg_print_ip4,\n    //          &pkt->arp->spa, mg_print_ip4, &pkt->arp->tpa));\n    struct eth *eth = (struct eth *) ifp->tx.buf;\n    struct arp *arp = (struct arp *) (eth + 1);\n    memcpy(eth->dst, pkt->eth->src, sizeof(eth->dst));\n    memcpy(eth->src, ifp->mac, sizeof(eth->src));\n    eth->type = mg_htons(0x806);\n    *arp = *pkt->arp;\n    arp->op = mg_htons(2);\n    memcpy(arp->tha, pkt->arp->sha, sizeof(pkt->arp->tha));\n    memcpy(arp->sha, ifp->mac, sizeof(pkt->arp->sha));\n    arp->tpa = pkt->arp->spa;\n    arp->spa = ifp->ip;\n    MG_DEBUG((\"ARP: tell %M we're %M\", mg_print_ip4, &arp->tpa, mg_print_mac,\n              &ifp->mac));\n    ether_output(ifp, PDIFF(eth, arp + 1));\n  } else if (pkt->arp->op == mg_htons(2)) {\n    if (memcmp(pkt->arp->tha, ifp->mac, sizeof(pkt->arp->tha)) != 0) return;\n    if (pkt->arp->spa == ifp->gw) {\n      // Got response for the GW ARP request. Set ifp->gwmac and IP -> READY\n      memcpy(ifp->gwmac, pkt->arp->sha, sizeof(ifp->gwmac));\n      if (ifp->state == MG_TCPIP_STATE_IP) {\n        ifp->state = MG_TCPIP_STATE_READY;\n        onstatechange(ifp);\n      }\n    } else {\n      struct mg_connection *c = getpeer(ifp->mgr, pkt, false);\n      if (c != NULL && c->is_arplooking) {\n        struct connstate *s = (struct connstate *) (c + 1);\n        memcpy(s->mac, pkt->arp->sha, sizeof(s->mac));\n        MG_DEBUG((\"%lu ARP resolved %M -> %M\", c->id, mg_print_ip4, c->rem.ip,\n                  mg_print_mac, s->mac));\n        c->is_arplooking = 0;\n        mac_resolved(c);\n      }\n    }\n  }\n}\n\nstatic void rx_icmp(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  // MG_DEBUG((\"ICMP %d\", (int) len));\n  if (pkt->icmp->type == 8 && pkt->ip != NULL && pkt->ip->dst == ifp->ip) {\n    size_t hlen = sizeof(struct eth) + sizeof(struct ip) + sizeof(struct icmp);\n    size_t space = ifp->tx.len - hlen, plen = pkt->pay.len;\n    if (plen > space) plen = space;\n    struct ip *ip = tx_ip(ifp, pkt->eth->src, 1, ifp->ip, pkt->ip->src,\n                          sizeof(struct icmp) + plen);\n    struct icmp *icmp = (struct icmp *) (ip + 1);\n    memset(icmp, 0, sizeof(*icmp));        // Set csum to 0\n    memcpy(icmp + 1, pkt->pay.buf, plen);  // Copy RX payload to TX\n    icmp->csum = ipcsum(icmp, sizeof(*icmp) + plen);\n    ether_output(ifp, hlen + plen);\n  }\n}\n\nstatic void rx_dhcp_client(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  uint32_t ip = 0, gw = 0, mask = 0, lease = 0, dns = 0, sntp = 0;\n  uint8_t msgtype = 0, state = ifp->state;\n  // perform size check first, then access fields\n  uint8_t *p = pkt->dhcp->options,\n          *end = (uint8_t *) &pkt->raw.buf[pkt->raw.len];\n  if (end < (uint8_t *) (pkt->dhcp + 1)) return;\n  if (memcmp(&pkt->dhcp->xid, ifp->mac + 2, sizeof(pkt->dhcp->xid))) return;\n  while (p + 1 < end && p[0] != 255) {  // Parse options RFC-1533 #9\n    if (p[0] == 1 && p[1] == sizeof(ifp->mask) && p + 6 < end) {  // Mask\n      memcpy(&mask, p + 2, sizeof(mask));\n    } else if (p[0] == 3 && p[1] == sizeof(ifp->gw) && p + 6 < end) {  // GW\n      memcpy(&gw, p + 2, sizeof(gw));\n      ip = pkt->dhcp->yiaddr;\n    } else if (ifp->enable_req_dns && p[0] == 6 && p[1] == sizeof(dns) &&\n               p + 6 < end) {  // DNS\n      memcpy(&dns, p + 2, sizeof(dns));\n    } else if (ifp->enable_req_sntp && p[0] == 42 && p[1] == sizeof(sntp) &&\n               p + 6 < end) {  // SNTP\n      memcpy(&sntp, p + 2, sizeof(sntp));\n    } else if (p[0] == 51 && p[1] == 4 && p + 6 < end) {  // Lease\n      memcpy(&lease, p + 2, sizeof(lease));\n      lease = mg_ntohl(lease);\n    } else if (p[0] == 53 && p[1] == 1 && p + 6 < end) {  // Msg Type\n      msgtype = p[2];\n    }\n    p += p[1] + 2;\n  }\n  // Process message type, RFC-1533 (9.4); RFC-2131 (3.1, 4)\n  if (msgtype == 6 && ifp->ip == ip) {  // DHCPNACK, release IP\n    ifp->state = MG_TCPIP_STATE_UP, ifp->ip = 0;\n  } else if (msgtype == 2 && ifp->state == MG_TCPIP_STATE_UP && ip && gw &&\n             lease) {  // DHCPOFFER\n    // select IP, (4.4.1) (fallback to IP source addr on foul play)\n    tx_dhcp_request_sel(ifp, ip,\n                        pkt->dhcp->siaddr ? pkt->dhcp->siaddr : pkt->ip->src);\n    ifp->state = MG_TCPIP_STATE_REQ;  // REQUESTING state\n  } else if (msgtype == 5) {          // DHCPACK\n    if (ifp->state == MG_TCPIP_STATE_REQ && ip && gw && lease) {  // got an IP\n      ifp->lease_expire = ifp->now + lease * 1000;\n      MG_INFO((\"Lease: %u sec (%lld)\", lease, ifp->lease_expire / 1000));\n      // assume DHCP server = router until ARP resolves\n      memcpy(ifp->gwmac, pkt->eth->src, sizeof(ifp->gwmac));\n      ifp->ip = ip, ifp->gw = gw, ifp->mask = mask;\n      ifp->state = MG_TCPIP_STATE_IP;  // BOUND state\n      uint64_t rand;\n      mg_random(&rand, sizeof(rand));\n      srand((unsigned int) (rand + mg_millis()));\n      if (ifp->enable_req_dns && dns != 0)\n        mg_tcpip_call(ifp, MG_TCPIP_EV_DHCP_DNS, &dns);\n      if (ifp->enable_req_sntp && sntp != 0)\n        mg_tcpip_call(ifp, MG_TCPIP_EV_DHCP_SNTP, &sntp);\n    } else if (ifp->state == MG_TCPIP_STATE_READY && ifp->ip == ip) {  // renew\n      ifp->lease_expire = ifp->now + lease * 1000;\n      MG_INFO((\"Lease: %u sec (%lld)\", lease, ifp->lease_expire / 1000));\n    }  // TODO(): accept provided T1/T2 and store server IP for renewal (4.4)\n  }\n  if (ifp->state != state) onstatechange(ifp);\n}\n\n// Simple DHCP server that assigns a next IP address: ifp->ip + 1\nstatic void rx_dhcp_server(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  uint8_t op = 0, *p = pkt->dhcp->options,\n          *end = (uint8_t *) &pkt->raw.buf[pkt->raw.len];\n  if (end < (uint8_t *) (pkt->dhcp + 1)) return;\n  // struct dhcp *req = pkt->dhcp;\n  struct dhcp res = {2, 1, 6, 0, 0, 0, 0, 0, 0, 0, 0, {0}, 0, {0}};\n  res.yiaddr = ifp->ip;\n  ((uint8_t *) (&res.yiaddr))[3]++;                // Offer our IP + 1\n  while (p + 1 < end && p[0] != 255) {             // Parse options\n    if (p[0] == 53 && p[1] == 1 && p + 2 < end) {  // Message type\n      op = p[2];\n    }\n    p += p[1] + 2;\n  }\n  if (op == 1 || op == 3) {         // DHCP Discover or DHCP Request\n    uint8_t msg = op == 1 ? 2 : 5;  // Message type: DHCP OFFER or DHCP ACK\n    uint8_t opts[] = {\n        53, 1, msg,                 // Message type\n        1,  4, 0,   0,   0,   0,    // Subnet mask\n        54, 4, 0,   0,   0,   0,    // Server ID\n        12, 3, 'm', 'i', 'p',       // Host name: \"mip\"\n        51, 4, 255, 255, 255, 255,  // Lease time\n        255                         // End of options\n    };\n    memcpy(&res.hwaddr, pkt->dhcp->hwaddr, 6);\n    memcpy(opts + 5, &ifp->mask, sizeof(ifp->mask));\n    memcpy(opts + 11, &ifp->ip, sizeof(ifp->ip));\n    memcpy(&res.options, opts, sizeof(opts));\n    res.magic = pkt->dhcp->magic;\n    res.xid = pkt->dhcp->xid;\n    if (ifp->enable_get_gateway) {\n      ifp->gw = res.yiaddr;  // set gw IP, best-effort gwmac as DHCP server's\n      memcpy(ifp->gwmac, pkt->eth->src, sizeof(ifp->gwmac));\n    }\n    tx_udp(ifp, pkt->eth->src, ifp->ip, mg_htons(67),\n           op == 1 ? ~0U : res.yiaddr, mg_htons(68), &res, sizeof(res));\n  }\n}\n\nstatic void rx_udp(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  struct mg_connection *c = getpeer(ifp->mgr, pkt, true);\n  if (c == NULL) {\n    // No UDP listener on this port. Should send ICMP, but keep silent.\n  } else {\n    c->rem.port = pkt->udp->sport;\n    memcpy(c->rem.ip, &pkt->ip->src, sizeof(uint32_t));\n    struct connstate *s = (struct connstate *) (c + 1);\n    memcpy(s->mac, pkt->eth->src, sizeof(s->mac));\n    if (c->recv.len >= MG_MAX_RECV_SIZE) {\n      mg_error(c, \"max_recv_buf_size reached\");\n    } else if (c->recv.size - c->recv.len < pkt->pay.len &&\n               !mg_iobuf_resize(&c->recv, c->recv.len + pkt->pay.len)) {\n      mg_error(c, \"oom\");\n    } else {\n      memcpy(&c->recv.buf[c->recv.len], pkt->pay.buf, pkt->pay.len);\n      c->recv.len += pkt->pay.len;\n      mg_call(c, MG_EV_READ, &pkt->pay.len);\n    }\n  }\n}\n\nstatic size_t tx_tcp(struct mg_tcpip_if *ifp, uint8_t *dst_mac, uint32_t dst_ip,\n                     uint8_t flags, uint16_t sport, uint16_t dport,\n                     uint32_t seq, uint32_t ack, const void *buf, size_t len) {\n#if 0\n  uint8_t opts[] = {2, 4, 5, 0xb4, 4, 2, 0, 0};  // MSS = 1460, SACK permitted\n  if (flags & TH_SYN) {\n    // Handshake? Set MSS\n    buf = opts;\n    len = sizeof(opts);\n  }\n#endif\n  struct ip *ip =\n      tx_ip(ifp, dst_mac, 6, ifp->ip, dst_ip, sizeof(struct tcp) + len);\n  struct tcp *tcp = (struct tcp *) (ip + 1);\n  memset(tcp, 0, sizeof(*tcp));\n  if (buf != NULL && len) memmove(tcp + 1, buf, len);\n  tcp->sport = sport;\n  tcp->dport = dport;\n  tcp->seq = seq;\n  tcp->ack = ack;\n  tcp->flags = flags;\n  tcp->win = mg_htons(MIP_TCP_WIN);\n  tcp->off = (uint8_t) (sizeof(*tcp) / 4 << 4);\n  // if (flags & TH_SYN) tcp->off = 0x70;  // Handshake? header size 28 bytes\n\n  uint32_t cs = 0;\n  uint16_t n = (uint16_t) (sizeof(*tcp) + len);\n  uint8_t pseudo[] = {0, ip->proto, (uint8_t) (n >> 8), (uint8_t) (n & 255)};\n  cs = csumup(cs, tcp, n);\n  cs = csumup(cs, &ip->src, sizeof(ip->src));\n  cs = csumup(cs, &ip->dst, sizeof(ip->dst));\n  cs = csumup(cs, pseudo, sizeof(pseudo));\n  tcp->csum = csumfin(cs);\n  MG_VERBOSE((\"TCP %M:%hu -> %M:%hu fl %x len %u\", mg_print_ip4, &ip->src,\n              mg_ntohs(tcp->sport), mg_print_ip4, &ip->dst,\n              mg_ntohs(tcp->dport), tcp->flags, len));\n  // mg_hexdump(ifp->tx.buf, PDIFF(ifp->tx.buf, tcp + 1) + len);\n  return ether_output(ifp, PDIFF(ifp->tx.buf, tcp + 1) + len);\n}\n\nstatic size_t tx_tcp_pkt(struct mg_tcpip_if *ifp, struct pkt *pkt,\n                         uint8_t flags, uint32_t seq, const void *buf,\n                         size_t len) {\n  uint32_t delta = (pkt->tcp->flags & (TH_SYN | TH_FIN)) ? 1 : 0;\n  return tx_tcp(ifp, pkt->eth->src, pkt->ip->src, flags, pkt->tcp->dport,\n                pkt->tcp->sport, seq, mg_htonl(mg_ntohl(pkt->tcp->seq) + delta),\n                buf, len);\n}\n\nstatic struct mg_connection *accept_conn(struct mg_connection *lsn,\n                                         struct pkt *pkt) {\n  struct mg_connection *c = mg_alloc_conn(lsn->mgr);\n  if (c == NULL) {\n    MG_ERROR((\"OOM\"));\n    return NULL;\n  }\n  struct connstate *s = (struct connstate *) (c + 1);\n  s->seq = mg_ntohl(pkt->tcp->ack), s->ack = mg_ntohl(pkt->tcp->seq);\n  memcpy(s->mac, pkt->eth->src, sizeof(s->mac));\n  settmout(c, MIP_TTYPE_KEEPALIVE);\n  memcpy(c->rem.ip, &pkt->ip->src, sizeof(uint32_t));\n  c->rem.port = pkt->tcp->sport;\n  MG_DEBUG((\"%lu accepted %M\", c->id, mg_print_ip_port, &c->rem));\n  LIST_ADD_HEAD(struct mg_connection, &lsn->mgr->conns, c);\n  c->is_accepted = 1;\n  c->is_hexdumping = lsn->is_hexdumping;\n  c->pfn = lsn->pfn;\n  c->loc = lsn->loc;\n  c->pfn_data = lsn->pfn_data;\n  c->fn = lsn->fn;\n  c->fn_data = lsn->fn_data;\n  mg_call(c, MG_EV_OPEN, NULL);\n  mg_call(c, MG_EV_ACCEPT, NULL);\n  return c;\n}\n\nstatic size_t trim_len(struct mg_connection *c, size_t len) {\n  struct mg_tcpip_if *ifp = c->mgr->ifp;\n  size_t eth_h_len = 14, ip_max_h_len = 24, tcp_max_h_len = 60, udp_h_len = 8;\n  size_t max_headers_len =\n      eth_h_len + ip_max_h_len + (c->is_udp ? udp_h_len : tcp_max_h_len);\n  size_t min_mtu = c->is_udp ? 68 /* RFC-791 */ : max_headers_len - eth_h_len;\n\n  // If the frame exceeds the available buffer, trim the length\n  if (len + max_headers_len > ifp->tx.len) {\n    len = ifp->tx.len - max_headers_len;\n  }\n  // Ensure the MTU isn't lower than the minimum allowed value\n  if (ifp->mtu < min_mtu) {\n    MG_ERROR((\"MTU is lower than minimum, capping to %lu\", min_mtu));\n    ifp->mtu = (uint16_t) min_mtu;\n  }\n  // If the total packet size exceeds the MTU, trim the length\n  if (len + max_headers_len - eth_h_len > ifp->mtu) {\n    len = ifp->mtu - max_headers_len + eth_h_len;\n    if (c->is_udp) {\n      MG_ERROR((\"UDP datagram exceeds MTU. Truncating it.\"));\n    }\n  }\n\n  return len;\n}\n\nlong mg_io_send(struct mg_connection *c, const void *buf, size_t len) {\n  struct mg_tcpip_if *ifp = c->mgr->ifp;\n  struct connstate *s = (struct connstate *) (c + 1);\n  uint32_t dst_ip = *(uint32_t *) c->rem.ip;\n  len = trim_len(c, len);\n  if (c->is_udp) {\n    tx_udp(ifp, s->mac, ifp->ip, c->loc.port, dst_ip, c->rem.port, buf, len);\n  } else {\n    size_t sent =\n        tx_tcp(ifp, s->mac, dst_ip, TH_PUSH | TH_ACK, c->loc.port, c->rem.port,\n               mg_htonl(s->seq), mg_htonl(s->ack), buf, len);\n    if (sent == 0) {\n      return MG_IO_WAIT;\n    } else if (sent == (size_t) -1) {\n      return MG_IO_ERR;\n    } else {\n      s->seq += (uint32_t) len;\n      if (s->ttype == MIP_TTYPE_ACK) settmout(c, MIP_TTYPE_KEEPALIVE);\n    }\n  }\n  return (long) len;\n}\n\nstatic void handle_tls_recv(struct mg_connection *c) {\n  size_t avail = mg_tls_pending(c); \n  size_t min = avail > MG_MAX_RECV_SIZE ? MG_MAX_RECV_SIZE : avail;\n  struct mg_iobuf *io = &c->recv;\n  if (io->size - io->len < min && !mg_iobuf_resize(io, io->len + min)) {\n    mg_error(c, \"oom\");\n  } else {\n    // Decrypt data directly into c->recv\n    long n = mg_tls_recv(c, &io->buf[io->len], io->size - io->len);\n    if (n == MG_IO_ERR) {\n      mg_error(c, \"TLS recv error\");\n    } else if (n > 0) {\n      // Decrypted successfully - trigger MG_EV_READ\n      io->len += (size_t) n;\n      mg_call(c, MG_EV_READ, &n);\n    } // else n < 0: outstanding data to be moved to c->recv\n  }\n}\n\nstatic void read_conn(struct mg_connection *c, struct pkt *pkt) {\n  struct connstate *s = (struct connstate *) (c + 1);\n  struct mg_iobuf *io = c->is_tls ? &c->rtls : &c->recv;\n  uint32_t seq = mg_ntohl(pkt->tcp->seq);\n  uint32_t rem_ip;\n  memcpy(&rem_ip, c->rem.ip, sizeof(uint32_t));\n  if (pkt->tcp->flags & TH_FIN) {\n    // If we initiated the closure, we reply with ACK upon receiving FIN\n    // If we didn't initiate it, we reply with FIN as part of the normal TCP\n    // closure process\n    uint8_t flags = TH_ACK;\n    s->ack = (uint32_t) (mg_htonl(pkt->tcp->seq) + pkt->pay.len + 1);\n    if (c->is_draining && s->ttype == MIP_TTYPE_FIN) {\n      if (s->seq == mg_htonl(pkt->tcp->ack)) {  // Simultaneous closure ?\n        s->seq++;                               // Yes. Increment our SEQ\n      } else {                                  // Otherwise,\n        s->seq = mg_htonl(pkt->tcp->ack);       // Set to peer's ACK\n      }\n    } else {\n      flags |= TH_FIN;\n      c->is_draining = 1;\n      settmout(c, MIP_TTYPE_FIN);\n    }\n    tx_tcp(c->mgr->ifp, s->mac, rem_ip, flags, c->loc.port, c->rem.port,\n           mg_htonl(s->seq), mg_htonl(s->ack), \"\", 0);\n  } else if (pkt->pay.len == 0) {\n    // TODO(cpq): handle this peer's ACK\n  } else if (seq != s->ack) {\n    uint32_t ack = (uint32_t) (mg_htonl(pkt->tcp->seq) + pkt->pay.len);\n    if (s->ack == ack) {\n      MG_VERBOSE((\"ignoring duplicate pkt\"));\n    } else {\n      MG_VERBOSE((\"SEQ != ACK: %x %x %x\", seq, s->ack, ack));\n      tx_tcp(c->mgr->ifp, s->mac, rem_ip, TH_ACK, c->loc.port, c->rem.port,\n             mg_htonl(s->seq), mg_htonl(s->ack), \"\", 0);\n    }\n  } else if (io->size - io->len < pkt->pay.len &&\n             !mg_iobuf_resize(io, io->len + pkt->pay.len)) {\n    mg_error(c, \"oom\");\n  } else {\n    // Copy TCP payload into the IO buffer. If the connection is plain text,\n    // we copy to c->recv. If the connection is TLS, this data is encrypted,\n    // therefore we copy that encrypted data to the c->rtls iobuffer instead,\n    // and then call mg_tls_recv() to decrypt it. NOTE: mg_tls_recv() will\n    // call back mg_io_recv() which grabs raw data from c->rtls\n    memcpy(&io->buf[io->len], pkt->pay.buf, pkt->pay.len);\n    io->len += pkt->pay.len;\n\n    MG_VERBOSE((\"%lu SEQ %x -> %x\", c->id, mg_htonl(pkt->tcp->seq), s->ack));\n    // Advance ACK counter\n    s->ack = (uint32_t) (mg_htonl(pkt->tcp->seq) + pkt->pay.len);\n    s->unacked += pkt->pay.len;\n    // size_t diff = s->acked <= s->ack ? s->ack - s->acked : s->ack;\n    if (s->unacked > MIP_TCP_WIN / 2 && s->acked != s->ack) {\n      // Send ACK immediately\n      MG_VERBOSE((\"%lu imm ACK %lu\", c->id, s->acked));\n      tx_tcp(c->mgr->ifp, s->mac, rem_ip, TH_ACK, c->loc.port, c->rem.port,\n             mg_htonl(s->seq), mg_htonl(s->ack), NULL, 0);\n      s->unacked = 0;\n      s->acked = s->ack;\n      if (s->ttype != MIP_TTYPE_KEEPALIVE) settmout(c, MIP_TTYPE_KEEPALIVE);\n    } else {\n      // if not already running, setup a timer to send an ACK later\n      if (s->ttype != MIP_TTYPE_ACK) settmout(c, MIP_TTYPE_ACK);\n    }\n\n    if (c->is_tls && c->is_tls_hs) {\n      mg_tls_handshake(c);\n    } else if (c->is_tls) {\n      handle_tls_recv(c);\n    } else {\n      // Plain text connection, data is already in c->recv, trigger MG_EV_READ\n      mg_call(c, MG_EV_READ, &pkt->pay.len);\n    }\n  }\n}\n\nstatic void rx_tcp(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  struct mg_connection *c = getpeer(ifp->mgr, pkt, false);\n  struct connstate *s = c == NULL ? NULL : (struct connstate *) (c + 1);\n#if 0\n  MG_INFO((\"%lu %hhu %d\", c ? c->id : 0, pkt->tcp->flags, (int) pkt->pay.len));\n#endif\n  if (c != NULL && c->is_connecting && pkt->tcp->flags == (TH_SYN | TH_ACK)) {\n    s->seq = mg_ntohl(pkt->tcp->ack), s->ack = mg_ntohl(pkt->tcp->seq) + 1;\n    tx_tcp_pkt(ifp, pkt, TH_ACK, pkt->tcp->ack, NULL, 0);\n    c->is_connecting = 0;  // Client connected\n    settmout(c, MIP_TTYPE_KEEPALIVE);\n    mg_call(c, MG_EV_CONNECT, NULL);  // Let user know\n    if (c->is_tls_hs) mg_tls_handshake(c);\n  } else if (c != NULL && c->is_connecting && pkt->tcp->flags != TH_ACK) {\n    // mg_hexdump(pkt->raw.buf, pkt->raw.len);\n    tx_tcp_pkt(ifp, pkt, TH_RST | TH_ACK, pkt->tcp->ack, NULL, 0);\n  } else if (c != NULL && pkt->tcp->flags & TH_RST) {\n    mg_error(c, \"peer RST\");  // RFC-1122 4.2.2.13\n  } else if (c != NULL) {\n#if 0\n    MG_DEBUG((\"%lu %d %M:%hu -> %M:%hu\", c->id, (int) pkt->raw.len,\n              mg_print_ip4, &pkt->ip->src, mg_ntohs(pkt->tcp->sport),\n              mg_print_ip4, &pkt->ip->dst, mg_ntohs(pkt->tcp->dport)));\n    mg_hexdump(pkt->pay.buf, pkt->pay.len);\n#endif\n    s->tmiss = 0;                         // Reset missed keep-alive counter\n    if (s->ttype == MIP_TTYPE_KEEPALIVE)  // Advance keep-alive timer\n      settmout(c,\n               MIP_TTYPE_KEEPALIVE);  // unless a former ACK timeout is pending\n    read_conn(c, pkt);  // Override timer with ACK timeout if needed\n  } else if ((c = getpeer(ifp->mgr, pkt, true)) == NULL) {\n    tx_tcp_pkt(ifp, pkt, TH_RST | TH_ACK, pkt->tcp->ack, NULL, 0);\n  } else if (pkt->tcp->flags & TH_RST) {\n    if (c->is_accepted) mg_error(c, \"peer RST\");  // RFC-1122 4.2.2.13\n    // ignore RST if not connected\n  } else if (pkt->tcp->flags & TH_SYN) {\n    // Use peer's source port as ISN, in order to recognise the handshake\n    uint32_t isn = mg_htonl((uint32_t) mg_ntohs(pkt->tcp->sport));\n    tx_tcp_pkt(ifp, pkt, TH_SYN | TH_ACK, isn, NULL, 0);\n  } else if (pkt->tcp->flags & TH_FIN) {\n    tx_tcp_pkt(ifp, pkt, TH_FIN | TH_ACK, pkt->tcp->ack, NULL, 0);\n  } else if (mg_htonl(pkt->tcp->ack) == mg_htons(pkt->tcp->sport) + 1U) {\n    accept_conn(c, pkt);\n  } else if (!c->is_accepted) {  // no peer\n    tx_tcp_pkt(ifp, pkt, TH_RST | TH_ACK, pkt->tcp->ack, NULL, 0);\n  } else {\n    // MG_VERBOSE((\"dropped silently..\"));\n  }\n}\n\nstatic void rx_ip(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  uint16_t frag = mg_ntohs(pkt->ip->frag);\n  if (frag & IP_MORE_FRAGS_MSK || frag & IP_FRAG_OFFSET_MSK) {\n    if (pkt->ip->proto == 17) pkt->udp = (struct udp *) (pkt->ip + 1);\n    if (pkt->ip->proto == 6) pkt->tcp = (struct tcp *) (pkt->ip + 1);\n    struct mg_connection *c = getpeer(ifp->mgr, pkt, false);\n    if (c) mg_error(c, \"Received fragmented packet\");\n  } else if (pkt->ip->proto == 1) {\n    pkt->icmp = (struct icmp *) (pkt->ip + 1);\n    if (pkt->pay.len < sizeof(*pkt->icmp)) return;\n    mkpay(pkt, pkt->icmp + 1);\n    rx_icmp(ifp, pkt);\n  } else if (pkt->ip->proto == 17) {\n    pkt->udp = (struct udp *) (pkt->ip + 1);\n    if (pkt->pay.len < sizeof(*pkt->udp)) return;\n    mkpay(pkt, pkt->udp + 1);\n    MG_VERBOSE((\"UDP %M:%hu -> %M:%hu len %u\", mg_print_ip4, &pkt->ip->src,\n                mg_ntohs(pkt->udp->sport), mg_print_ip4, &pkt->ip->dst,\n                mg_ntohs(pkt->udp->dport), (int) pkt->pay.len));\n    if (ifp->enable_dhcp_client && pkt->udp->dport == mg_htons(68)) {\n      pkt->dhcp = (struct dhcp *) (pkt->udp + 1);\n      mkpay(pkt, pkt->dhcp + 1);\n      rx_dhcp_client(ifp, pkt);\n    } else if (ifp->enable_dhcp_server && pkt->udp->dport == mg_htons(67)) {\n      pkt->dhcp = (struct dhcp *) (pkt->udp + 1);\n      mkpay(pkt, pkt->dhcp + 1);\n      rx_dhcp_server(ifp, pkt);\n    } else {\n      rx_udp(ifp, pkt);\n    }\n  } else if (pkt->ip->proto == 6) {\n    pkt->tcp = (struct tcp *) (pkt->ip + 1);\n    if (pkt->pay.len < sizeof(*pkt->tcp)) return;\n    mkpay(pkt, pkt->tcp + 1);\n    uint16_t iplen = mg_ntohs(pkt->ip->len);\n    uint16_t off = (uint16_t) (sizeof(*pkt->ip) + ((pkt->tcp->off >> 4) * 4U));\n    if (iplen >= off) pkt->pay.len = (size_t) (iplen - off);\n    MG_VERBOSE((\"TCP %M:%hu -> %M:%hu len %u\", mg_print_ip4, &pkt->ip->src,\n                mg_ntohs(pkt->tcp->sport), mg_print_ip4, &pkt->ip->dst,\n                mg_ntohs(pkt->tcp->dport), (int) pkt->pay.len));\n    rx_tcp(ifp, pkt);\n  }\n}\n\nstatic void rx_ip6(struct mg_tcpip_if *ifp, struct pkt *pkt) {\n  // MG_DEBUG((\"IP %d\", (int) len));\n  if (pkt->ip6->proto == 1 || pkt->ip6->proto == 58) {\n    pkt->icmp = (struct icmp *) (pkt->ip6 + 1);\n    if (pkt->pay.len < sizeof(*pkt->icmp)) return;\n    mkpay(pkt, pkt->icmp + 1);\n    rx_icmp(ifp, pkt);\n  } else if (pkt->ip6->proto == 17) {\n    pkt->udp = (struct udp *) (pkt->ip6 + 1);\n    if (pkt->pay.len < sizeof(*pkt->udp)) return;\n    // MG_DEBUG((\"  UDP %u %u -> %u\", len, mg_htons(udp->sport),\n    // mg_htons(udp->dport)));\n    mkpay(pkt, pkt->udp + 1);\n  }\n}\n\nstatic void mg_tcpip_rx(struct mg_tcpip_if *ifp, void *buf, size_t len) {\n  struct pkt pkt;\n  memset(&pkt, 0, sizeof(pkt));\n  pkt.raw.buf = (char *) buf;\n  pkt.raw.len = len;\n  pkt.eth = (struct eth *) buf;\n  // mg_hexdump(buf, len > 16 ? 16: len);\n  if (pkt.raw.len < sizeof(*pkt.eth)) return;  // Truncated - runt?\n  if (ifp->enable_mac_check &&\n      memcmp(pkt.eth->dst, ifp->mac, sizeof(pkt.eth->dst)) != 0 &&\n      memcmp(pkt.eth->dst, broadcast, sizeof(pkt.eth->dst)) != 0)\n    return;\n  if (ifp->enable_crc32_check && len > 4) {\n    len -= 4;  // TODO(scaprile): check on bigendian\n    uint32_t crc = mg_crc32(0, (const char *) buf, len);\n    if (memcmp((void *) ((size_t) buf + len), &crc, sizeof(crc))) return;\n  }\n  if (pkt.eth->type == mg_htons(0x806)) {\n    pkt.arp = (struct arp *) (pkt.eth + 1);\n    if (sizeof(*pkt.eth) + sizeof(*pkt.arp) > pkt.raw.len) return;  // Truncated\n    mg_tcpip_call(ifp, MG_TCPIP_EV_ARP, &pkt.raw);\n    rx_arp(ifp, &pkt);\n  } else if (pkt.eth->type == mg_htons(0x86dd)) {\n    pkt.ip6 = (struct ip6 *) (pkt.eth + 1);\n    if (pkt.raw.len < sizeof(*pkt.eth) + sizeof(*pkt.ip6)) return;  // Truncated\n    if ((pkt.ip6->ver >> 4) != 0x6) return;                         // Not IP\n    mkpay(&pkt, pkt.ip6 + 1);\n    rx_ip6(ifp, &pkt);\n  } else if (pkt.eth->type == mg_htons(0x800)) {\n    pkt.ip = (struct ip *) (pkt.eth + 1);\n    if (pkt.raw.len < sizeof(*pkt.eth) + sizeof(*pkt.ip)) return;  // Truncated\n    // Truncate frame to what IP header tells us\n    if ((size_t) mg_ntohs(pkt.ip->len) + sizeof(struct eth) < pkt.raw.len) {\n      pkt.raw.len = (size_t) mg_ntohs(pkt.ip->len) + sizeof(struct eth);\n    }\n    if (pkt.raw.len < sizeof(*pkt.eth) + sizeof(*pkt.ip)) return;  // Truncated\n    if ((pkt.ip->ver >> 4) != 4) return;                           // Not IP\n    mkpay(&pkt, pkt.ip + 1);\n    rx_ip(ifp, &pkt);\n  } else {\n    MG_DEBUG((\"Unknown eth type %x\", mg_htons(pkt.eth->type)));\n    if (mg_log_level >= MG_LL_VERBOSE) mg_hexdump(buf, len >= 32 ? 32 : len);\n  }\n}\n\nstatic void mg_tcpip_poll(struct mg_tcpip_if *ifp, uint64_t now) {\n  struct mg_connection *c;\n  bool expired_1000ms = mg_timer_expired(&ifp->timer_1000ms, 1000, now);\n  ifp->now = now;\n\n  if (expired_1000ms) {\n#if MG_ENABLE_TCPIP_PRINT_DEBUG_STATS\n    const char *names[] = {\"down\", \"up\", \"req\", \"ip\", \"ready\"};\n    MG_INFO((\"Status: %s, IP: %M, rx:%u, tx:%u, dr:%u, er:%u\",\n             names[ifp->state], mg_print_ip4, &ifp->ip, ifp->nrecv, ifp->nsent,\n             ifp->ndrop, ifp->nerr));\n#endif\n  }\n  // Handle gw ARP request timeout, order is important\n  if (expired_1000ms && ifp->state == MG_TCPIP_STATE_IP) {\n    ifp->state = MG_TCPIP_STATE_READY;  // keep best-effort MAC\n    onstatechange(ifp);\n  }\n  // Handle physical interface up/down status\n  if (expired_1000ms && ifp->driver->up) {\n    bool up = ifp->driver->up(ifp);\n    bool current = ifp->state != MG_TCPIP_STATE_DOWN;\n    if (!up && ifp->enable_dhcp_client) ifp->ip = 0;\n    if (up != current) {  // link state has changed\n      ifp->state = up == false ? MG_TCPIP_STATE_DOWN\n                   : ifp->enable_dhcp_client || ifp->ip == 0\n                       ? MG_TCPIP_STATE_UP\n                       : MG_TCPIP_STATE_IP;\n      onstatechange(ifp);\n    } else if (!ifp->enable_dhcp_client && ifp->state == MG_TCPIP_STATE_UP &&\n               ifp->ip) {\n      ifp->state = MG_TCPIP_STATE_IP;  // ifp->fn has set an IP\n      onstatechange(ifp);\n    }\n    if (ifp->state == MG_TCPIP_STATE_DOWN) MG_ERROR((\"Network is down\"));\n    mg_tcpip_call(ifp, MG_TCPIP_EV_TIMER_1S, NULL);\n  }\n  if (ifp->state == MG_TCPIP_STATE_DOWN) return;\n\n  // DHCP RFC-2131 (4.4)\n  if (ifp->enable_dhcp_client && expired_1000ms) {\n    if (ifp->state == MG_TCPIP_STATE_UP) {\n      tx_dhcp_discover(ifp);  // INIT (4.4.1)\n    } else if (ifp->state == MG_TCPIP_STATE_READY &&\n               ifp->lease_expire > 0) {  // BOUND / RENEWING / REBINDING\n      if (ifp->now >= ifp->lease_expire) {\n        ifp->state = MG_TCPIP_STATE_UP, ifp->ip = 0;  // expired, release IP\n        onstatechange(ifp);\n      } else if (ifp->now + 30UL * 60UL * 1000UL > ifp->lease_expire &&\n                 ((ifp->now / 1000) % 60) == 0) {\n        // hack: 30 min before deadline, try to rebind (4.3.6) every min\n        tx_dhcp_request_re(ifp, (uint8_t *) broadcast, ifp->ip, 0xffffffff);\n      }  // TODO(): Handle T1 (RENEWING) and T2 (REBINDING) (4.4.5)\n    }\n  }\n\n  // Read data from the network\n  if (ifp->driver->rx != NULL) {  // Polling driver. We must call it\n    size_t len =\n        ifp->driver->rx(ifp->recv_queue.buf, ifp->recv_queue.size, ifp);\n    if (len > 0) {\n      ifp->nrecv++;\n      mg_tcpip_rx(ifp, ifp->recv_queue.buf, len);\n    }\n  } else {  // Interrupt-based driver. Fills recv queue itself\n    char *buf;\n    size_t len = mg_queue_next(&ifp->recv_queue, &buf);\n    if (len > 0) {\n      mg_tcpip_rx(ifp, buf, len);\n      mg_queue_del(&ifp->recv_queue, len);\n    }\n  }\n\n  // Process timeouts\n  for (c = ifp->mgr->conns; c != NULL; c = c->next) {\n    if ((c->is_udp && !c->is_arplooking) || c->is_listening || c->is_resolving)\n      continue;\n    struct connstate *s = (struct connstate *) (c + 1);\n    uint32_t rem_ip;\n    memcpy(&rem_ip, c->rem.ip, sizeof(uint32_t));\n    if (now > s->timer) {\n      if (s->ttype == MIP_TTYPE_ARP) {\n        mg_error(c, \"ARP timeout\");\n      } else if (c->is_udp) {\n        continue;\n      } else if (s->ttype == MIP_TTYPE_ACK && s->acked != s->ack) {\n        MG_VERBOSE((\"%lu ack %x %x\", c->id, s->seq, s->ack));\n        tx_tcp(ifp, s->mac, rem_ip, TH_ACK, c->loc.port, c->rem.port,\n               mg_htonl(s->seq), mg_htonl(s->ack), NULL, 0);\n        s->acked = s->ack;\n      } else if (s->ttype == MIP_TTYPE_SYN) {\n        mg_error(c, \"Connection timeout\");\n      } else if (s->ttype == MIP_TTYPE_FIN) {\n        c->is_closing = 1;\n        continue;\n      } else {\n        if (s->tmiss++ > 2) {\n          mg_error(c, \"keepalive\");\n        } else {\n          MG_VERBOSE((\"%lu keepalive\", c->id));\n          tx_tcp(ifp, s->mac, rem_ip, TH_ACK, c->loc.port, c->rem.port,\n                 mg_htonl(s->seq - 1), mg_htonl(s->ack), NULL, 0);\n        }\n      }\n\n      settmout(c, MIP_TTYPE_KEEPALIVE);\n    }\n  }\n}\n\n// This function executes in interrupt context, thus it should copy data\n// somewhere fast. Note that newlib's malloc is not thread safe, thus use\n// our lock-free queue with preallocated buffer to copy data and return asap\nvoid mg_tcpip_qwrite(void *buf, size_t len, struct mg_tcpip_if *ifp) {\n  char *p;\n  if (mg_queue_book(&ifp->recv_queue, &p, len) >= len) {\n    memcpy(p, buf, len);\n    mg_queue_add(&ifp->recv_queue, len);\n    ifp->nrecv++;\n  } else {\n    ifp->ndrop++;\n  }\n}\n\nvoid mg_tcpip_init(struct mg_mgr *mgr, struct mg_tcpip_if *ifp) {\n  // If MAC address is not set, make a random one\n  if (ifp->mac[0] == 0 && ifp->mac[1] == 0 && ifp->mac[2] == 0 &&\n      ifp->mac[3] == 0 && ifp->mac[4] == 0 && ifp->mac[5] == 0) {\n    ifp->mac[0] = 0x02;  // Locally administered, unicast\n    mg_random(&ifp->mac[1], sizeof(ifp->mac) - 1);\n    MG_INFO((\"MAC not set. Generated random: %M\", mg_print_mac, ifp->mac));\n  }\n\n  if (ifp->driver->init && !ifp->driver->init(ifp)) {\n    MG_ERROR((\"driver init failed\"));\n  } else {\n    size_t framesize = 1540;\n    ifp->tx.buf = (char *) calloc(1, framesize), ifp->tx.len = framesize;\n    if (ifp->recv_queue.size == 0)\n      ifp->recv_queue.size = ifp->driver->rx ? framesize : 8192;\n    ifp->recv_queue.buf = (char *) calloc(1, ifp->recv_queue.size);\n    ifp->timer_1000ms = mg_millis();\n    mgr->ifp = ifp;\n    ifp->mgr = mgr;\n    ifp->mtu = MG_TCPIP_MTU_DEFAULT;\n    mgr->extraconnsize = sizeof(struct connstate);\n    if (ifp->ip == 0) ifp->enable_dhcp_client = true;\n    memset(ifp->gwmac, 255, sizeof(ifp->gwmac));  // Set best-effort to bcast\n    mg_random(&ifp->eport, sizeof(ifp->eport));   // Random from 0 to 65535\n    ifp->eport |= MG_EPHEMERAL_PORT_BASE;         // Random from\n                                           // MG_EPHEMERAL_PORT_BASE to 65535\n    if (ifp->tx.buf == NULL || ifp->recv_queue.buf == NULL) MG_ERROR((\"OOM\"));\n  }\n}\n\nvoid mg_tcpip_free(struct mg_tcpip_if *ifp) {\n  free(ifp->recv_queue.buf);\n  free(ifp->tx.buf);\n}\n\nstatic void send_syn(struct mg_connection *c) {\n  struct connstate *s = (struct connstate *) (c + 1);\n  uint32_t isn = mg_htonl((uint32_t) mg_ntohs(c->loc.port));\n  uint32_t rem_ip;\n  memcpy(&rem_ip, c->rem.ip, sizeof(uint32_t));\n  tx_tcp(c->mgr->ifp, s->mac, rem_ip, TH_SYN, c->loc.port, c->rem.port, isn, 0,\n         NULL, 0);\n}\n\nstatic void mac_resolved(struct mg_connection *c) {\n  if (c->is_udp) {\n    c->is_connecting = 0;\n    mg_call(c, MG_EV_CONNECT, NULL);\n  } else {\n    send_syn(c);\n    settmout(c, MIP_TTYPE_SYN);\n  }\n}\n\nvoid mg_connect_resolved(struct mg_connection *c) {\n  struct mg_tcpip_if *ifp = c->mgr->ifp;\n  uint32_t rem_ip;\n  memcpy(&rem_ip, c->rem.ip, sizeof(uint32_t));\n  c->is_resolving = 0;\n  if (ifp->eport < MG_EPHEMERAL_PORT_BASE) ifp->eport = MG_EPHEMERAL_PORT_BASE;\n  memcpy(c->loc.ip, &ifp->ip, sizeof(uint32_t));\n  c->loc.port = mg_htons(ifp->eport++);\n  MG_DEBUG((\"%lu %M -> %M\", c->id, mg_print_ip_port, &c->loc, mg_print_ip_port,\n            &c->rem));\n  mg_call(c, MG_EV_RESOLVE, NULL);\n  c->is_connecting = 1;\n  if (c->is_udp && (rem_ip == 0xffffffff || rem_ip == (ifp->ip | ~ifp->mask))) {\n    struct connstate *s = (struct connstate *) (c + 1);\n    memset(s->mac, 0xFF, sizeof(s->mac));  // global or local broadcast\n    mac_resolved(c);\n  } else if (ifp->ip && ((rem_ip & ifp->mask) == (ifp->ip & ifp->mask)) &&\n             rem_ip != ifp->gw) {  // skip if gw (onstatechange -> READY -> ARP)\n    // If we're in the same LAN, fire an ARP lookup.\n    MG_DEBUG((\"%lu ARP lookup...\", c->id));\n    mg_tcpip_arp_request(ifp, rem_ip, NULL);\n    settmout(c, MIP_TTYPE_ARP);\n    c->is_arplooking = 1;\n  } else if ((*((uint8_t *) &rem_ip) & 0xE0) == 0xE0) {\n    struct connstate *s = (struct connstate *) (c + 1);  // 224 to 239, E0 to EF\n    uint8_t mcastp[3] = {0x01, 0x00, 0x5E};              // multicast group\n    memcpy(s->mac, mcastp, 3);\n    memcpy(s->mac + 3, ((uint8_t *) &rem_ip) + 1, 3);  // 23 LSb\n    s->mac[3] &= 0x7F;\n    mac_resolved(c);\n  } else {\n    struct connstate *s = (struct connstate *) (c + 1);\n    memcpy(s->mac, ifp->gwmac, sizeof(ifp->gwmac));\n    mac_resolved(c);\n  }\n}\n\nbool mg_open_listener(struct mg_connection *c, const char *url) {\n  c->loc.port = mg_htons(mg_url_port(url));\n  return true;\n}\n\nstatic void write_conn(struct mg_connection *c) {\n  long len = c->is_tls ? mg_tls_send(c, c->send.buf, c->send.len)\n                       : mg_io_send(c, c->send.buf, c->send.len);\n  if (len == MG_IO_ERR) {\n    mg_error(c, \"tx err\");\n  } else if (len > 0) {\n    mg_iobuf_del(&c->send, 0, (size_t) len);\n    mg_call(c, MG_EV_WRITE, &len);\n  }\n}\n\nstatic void init_closure(struct mg_connection *c) {\n  struct connstate *s = (struct connstate *) (c + 1);\n  if (c->is_udp == false && c->is_listening == false &&\n      c->is_connecting == false) {  // For TCP conns,\n    uint32_t rem_ip;\n    memcpy(&rem_ip, c->rem.ip, sizeof(uint32_t));\n    tx_tcp(c->mgr->ifp, s->mac, rem_ip, TH_FIN | TH_ACK, c->loc.port,\n           c->rem.port, mg_htonl(s->seq), mg_htonl(s->ack), NULL, 0);\n    settmout(c, MIP_TTYPE_FIN);\n  }\n}\n\nstatic void close_conn(struct mg_connection *c) {\n  struct connstate *s = (struct connstate *) (c + 1);\n  mg_iobuf_free(&s->raw);  // For TLS connections, release raw data\n  mg_close_conn(c);\n}\n\nstatic bool can_write(struct mg_connection *c) {\n  return c->is_connecting == 0 && c->is_resolving == 0 && c->send.len > 0 &&\n         c->is_tls_hs == 0 && c->is_arplooking == 0;\n}\n\nvoid mg_mgr_poll(struct mg_mgr *mgr, int ms) {\n  struct mg_connection *c, *tmp;\n  uint64_t now = mg_millis();\n  mg_timer_poll(&mgr->timers, now);\n  if (mgr->ifp == NULL || mgr->ifp->driver == NULL) return;\n  mg_tcpip_poll(mgr->ifp, now);\n  for (c = mgr->conns; c != NULL; c = tmp) {\n    tmp = c->next;\n    struct connstate *s = (struct connstate *) (c + 1);\n    mg_call(c, MG_EV_POLL, &now);\n    MG_VERBOSE((\"%lu .. %c%c%c%c%c\", c->id, c->is_tls ? 'T' : 't',\n                c->is_connecting ? 'C' : 'c', c->is_tls_hs ? 'H' : 'h',\n                c->is_resolving ? 'R' : 'r', c->is_closing ? 'C' : 'c'));\n    if (c->is_tls && mg_tls_pending(c) > 0) handle_tls_recv(c);\n    if (can_write(c)) write_conn(c);\n    if (c->is_draining && c->send.len == 0 && s->ttype != MIP_TTYPE_FIN)\n      init_closure(c);\n    if (c->is_closing) close_conn(c);\n  }\n  (void) ms;\n}\n\nbool mg_send(struct mg_connection *c, const void *buf, size_t len) {\n  struct mg_tcpip_if *ifp = c->mgr->ifp;\n  bool res = false;\n  uint32_t rem_ip;\n  memcpy(&rem_ip, c->rem.ip, sizeof(uint32_t));\n  if (ifp->ip == 0 || ifp->state != MG_TCPIP_STATE_READY) {\n    mg_error(c, \"net down\");\n  } else if (c->is_udp && (c->is_arplooking || c->is_resolving)) {\n    // Fail to send, no target MAC or IP\n    MG_VERBOSE((\"still resolving...\"));\n  } else if (c->is_udp) {\n    struct connstate *s = (struct connstate *) (c + 1);\n    len = trim_len(c, len);  // Trimming length if necessary\n    tx_udp(ifp, s->mac, ifp->ip, c->loc.port, rem_ip, c->rem.port, buf, len);\n    res = true;\n  } else {\n    res = mg_iobuf_add(&c->send, c->send.len, buf, len);\n  }\n  return res;\n}\n#endif  // MG_ENABLE_TCPIP\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ota_ch32v307.c\"\n#endif\n\n\n\n\n#if MG_OTA == MG_OTA_CH32V307\n// RM: https://www.wch-ic.com/downloads/CH32FV2x_V3xRM_PDF.html\n\nstatic bool mg_ch32v307_write(void *, const void *, size_t);\nstatic bool mg_ch32v307_swap(void);\n\nstatic struct mg_flash s_mg_flash_ch32v307 = {\n    (void *) 0x08000000,  // Start\n    480 * 1024,           // Size, first 320k is 0-wait\n    4 * 1024,             // Sector size, 4k\n    4,                    // Align, 32 bit\n    mg_ch32v307_write,\n    mg_ch32v307_swap,\n};\n\n#define FLASH_BASE 0x40022000\n#define FLASH_ACTLR (FLASH_BASE + 0)\n#define FLASH_KEYR (FLASH_BASE + 4)\n#define FLASH_OBKEYR (FLASH_BASE + 8)\n#define FLASH_STATR (FLASH_BASE + 12)\n#define FLASH_CTLR (FLASH_BASE + 16)\n#define FLASH_ADDR (FLASH_BASE + 20)\n#define FLASH_OBR (FLASH_BASE + 28)\n#define FLASH_WPR (FLASH_BASE + 32)\n\nMG_IRAM static void flash_unlock(void) {\n  static bool unlocked;\n  if (unlocked == false) {\n    MG_REG(FLASH_KEYR) = 0x45670123;\n    MG_REG(FLASH_KEYR) = 0xcdef89ab;\n    unlocked = true;\n  }\n}\n\nMG_IRAM static void flash_wait(void) {\n  while (MG_REG(FLASH_STATR) & MG_BIT(0)) (void) 0;\n}\n\nMG_IRAM static void mg_ch32v307_erase(void *addr) {\n  // MG_INFO((\"%p\", addr));\n  flash_unlock();\n  flash_wait();\n  MG_REG(FLASH_ADDR) = (uint32_t) addr;\n  MG_REG(FLASH_CTLR) |= MG_BIT(1) | MG_BIT(6);  // PER | STRT;\n  flash_wait();\n}\n\nMG_IRAM static bool is_page_boundary(const void *addr) {\n  uint32_t val = (uint32_t) addr;\n  return (val & (s_mg_flash_ch32v307.secsz - 1)) == 0;\n}\n\nMG_IRAM static bool mg_ch32v307_write(void *addr, const void *buf, size_t len) {\n  // MG_INFO((\"%p %p %lu\", addr, buf, len));\n  // mg_hexdump(buf, len);\n  flash_unlock();\n  const uint16_t *src = (uint16_t *) buf, *end = &src[len / 2];\n  uint16_t *dst = (uint16_t *) addr;\n  MG_REG(FLASH_CTLR) |= MG_BIT(0);  // Set PG\n  // MG_INFO((\"CTLR: %#lx\", MG_REG(FLASH_CTLR)));\n  while (src < end) {\n    if (is_page_boundary(dst)) mg_ch32v307_erase(dst);\n    *dst++ = *src++;\n    flash_wait();\n  }\n  MG_REG(FLASH_CTLR) &= ~MG_BIT(0);  // Clear PG\n  return true;\n}\n\nMG_IRAM bool mg_ch32v307_swap(void) {\n  return true;\n}\n\n// just overwrite instead of swap\nMG_IRAM static void single_bank_swap(char *p1, char *p2, size_t s, size_t ss) {\n  // no stdlib calls here\n  for (size_t ofs = 0; ofs < s; ofs += ss) {\n    mg_ch32v307_write(p1 + ofs, p2 + ofs, ss);\n  }\n  *((volatile uint32_t *) 0xbeef0000) |= 1U << 7;  // NVIC_SystemReset()\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_ch32v307);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_ch32v307);\n}\n\nbool mg_ota_end(void) {\n  if (mg_ota_flash_end(&s_mg_flash_ch32v307)) {\n    // Swap partitions. Pray power does not go away\n    MG_INFO((\"Swapping partitions, size %u (%u sectors)\",\n             s_mg_flash_ch32v307.size,\n             s_mg_flash_ch32v307.size / s_mg_flash_ch32v307.secsz));\n    MG_INFO((\"Do NOT power off...\"));\n    mg_log_level = MG_LL_NONE;\n    // TODO() disable IRQ, s_flash_irq_disabled = true;\n    // Runs in RAM, will reset when finished\n    single_bank_swap(\n        (char *) s_mg_flash_ch32v307.start,\n        (char *) s_mg_flash_ch32v307.start + s_mg_flash_ch32v307.size / 2,\n        s_mg_flash_ch32v307.size / 2, s_mg_flash_ch32v307.secsz);\n  }\n  return false;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ota_dummy.c\"\n#endif\n\n\n\n#if MG_OTA == MG_OTA_NONE\nbool mg_ota_begin(size_t new_firmware_size) {\n  (void) new_firmware_size;\n  return true;\n}\nbool mg_ota_write(const void *buf, size_t len) {\n  (void) buf, (void) len;\n  return true;\n}\nbool mg_ota_end(void) {\n  return true;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ota_esp32.c\"\n#endif\n\n\n#if MG_ARCH == MG_ARCH_ESP32 && MG_OTA == MG_OTA_ESP32\n\nstatic const esp_partition_t *s_ota_update_partition;\nstatic esp_ota_handle_t s_ota_update_handle;\nstatic bool s_ota_success;\n\n// Those empty macros do nothing, but mark places in the code which could\n// potentially trigger a watchdog reboot due to the log flash erase operation\n#define disable_wdt()\n#define enable_wdt()\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  if (s_ota_update_partition != NULL) {\n    MG_ERROR((\"Update in progress. Call mg_ota_end() ?\"));\n    return false;\n  } else {\n    s_ota_success = false;\n    disable_wdt();\n    s_ota_update_partition = esp_ota_get_next_update_partition(NULL);\n    esp_err_t err = esp_ota_begin(s_ota_update_partition, new_firmware_size,\n                                  &s_ota_update_handle);\n    enable_wdt();\n    MG_DEBUG((\"esp_ota_begin(): %d\", err));\n    s_ota_success = (err == ESP_OK);\n  }\n  return s_ota_success;\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  disable_wdt();\n  esp_err_t err = esp_ota_write(s_ota_update_handle, buf, len);\n  enable_wdt();\n  MG_INFO((\"esp_ota_write(): %d\", err));\n  s_ota_success = err == ESP_OK;\n  return s_ota_success;\n}\n\nbool mg_ota_end(void) {\n  esp_err_t err = esp_ota_end(s_ota_update_handle);\n  MG_DEBUG((\"esp_ota_end(%p): %d\", s_ota_update_handle, err));\n  if (s_ota_success && err == ESP_OK) {\n    err = esp_ota_set_boot_partition(s_ota_update_partition);\n    s_ota_success = (err == ESP_OK);\n  }\n  MG_DEBUG((\"Finished ESP32 OTA, success: %d\", s_ota_success));\n  s_ota_update_partition = NULL;\n  return s_ota_success;\n}\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ota_imxrt.c\"\n#endif\n\n\n\n\n#if MG_OTA >= MG_OTA_RT1020 && MG_OTA <= MG_OTA_RT1170\n\nstatic bool mg_imxrt_write(void *, const void *, size_t);\nstatic bool mg_imxrt_swap(void);\n\n#if MG_OTA <= MG_OTA_RT1060\n#define MG_IMXRT_FLASH_START 0x60000000\n#define FLEXSPI_NOR_INSTANCE 0\n#elif MG_OTA == MG_OTA_RT1064\n#define MG_IMXRT_FLASH_START 0x70000000\n#define FLEXSPI_NOR_INSTANCE 1\n#else // RT1170\n#define MG_IMXRT_FLASH_START 0x30000000\n#define FLEXSPI_NOR_INSTANCE 1\n#endif\n\n// TODO(): fill at init, support more devices in a dynamic way\n// TODO(): then, check alignment is <= 256, see Wizard's #251\nstatic struct mg_flash s_mg_flash_imxrt = {\n    (void *) MG_IMXRT_FLASH_START,  // Start,\n    4 * 1024 * 1024,                // Size, 4mb\n    4 * 1024,                       // Sector size, 4k\n    256,                            // Align,\n    mg_imxrt_write,\n    mg_imxrt_swap,\n};\n\nstruct mg_flexspi_lut_seq {\n  uint8_t seqNum;\n  uint8_t seqId;\n  uint16_t reserved;\n};\n\nstruct mg_flexspi_mem_config {\n  uint32_t tag;\n  uint32_t version;\n  uint32_t reserved0;\n  uint8_t readSampleClkSrc;\n  uint8_t csHoldTime;\n  uint8_t csSetupTime;\n  uint8_t columnAddressWidth;\n  uint8_t deviceModeCfgEnable;\n  uint8_t deviceModeType;\n  uint16_t waitTimeCfgCommands;\n  struct mg_flexspi_lut_seq deviceModeSeq;\n  uint32_t deviceModeArg;\n  uint8_t configCmdEnable;\n  uint8_t configModeType[3];\n  struct mg_flexspi_lut_seq configCmdSeqs[3];\n  uint32_t reserved1;\n  uint32_t configCmdArgs[3];\n  uint32_t reserved2;\n  uint32_t controllerMiscOption;\n  uint8_t deviceType;\n  uint8_t sflashPadType;\n  uint8_t serialClkFreq;\n  uint8_t lutCustomSeqEnable;\n  uint32_t reserved3[2];\n  uint32_t sflashA1Size;\n  uint32_t sflashA2Size;\n  uint32_t sflashB1Size;\n  uint32_t sflashB2Size;\n  uint32_t csPadSettingOverride;\n  uint32_t sclkPadSettingOverride;\n  uint32_t dataPadSettingOverride;\n  uint32_t dqsPadSettingOverride;\n  uint32_t timeoutInMs;\n  uint32_t commandInterval;\n  uint16_t dataValidTime[2];\n  uint16_t busyOffset;\n  uint16_t busyBitPolarity;\n  uint32_t lookupTable[64];\n  struct mg_flexspi_lut_seq lutCustomSeq[12];\n  uint32_t reserved4[4];\n};\n\nstruct mg_flexspi_nor_config {\n  struct mg_flexspi_mem_config memConfig;\n  uint32_t pageSize;\n  uint32_t sectorSize;\n  uint8_t ipcmdSerialClkFreq;\n  uint8_t isUniformBlockSize;\n  uint8_t reserved0[2];\n  uint8_t serialNorType;\n  uint8_t needExitNoCmdMode;\n  uint8_t halfClkForNonReadCmd;\n  uint8_t needRestoreNoCmdMode;\n  uint32_t blockSize;\n  uint32_t reserve2[11];\n};\n\n/* FLEXSPI memory config block related defintions */\n#define MG_FLEXSPI_CFG_BLK_TAG (0x42464346UL)      // ascii \"FCFB\" Big Endian\n#define MG_FLEXSPI_CFG_BLK_VERSION (0x56010400UL)  // V1.4.0\n\n#define MG_FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)       \\\n  (MG_FLEXSPI_LUT_OPERAND0(op0) | MG_FLEXSPI_LUT_NUM_PADS0(pad0) | \\\n   MG_FLEXSPI_LUT_OPCODE0(cmd0) | MG_FLEXSPI_LUT_OPERAND1(op1) |   \\\n   MG_FLEXSPI_LUT_NUM_PADS1(pad1) | MG_FLEXSPI_LUT_OPCODE1(cmd1))\n\n#define MG_CMD_SDR 0x01\n#define MG_CMD_DDR 0x21\n#define MG_DUMMY_SDR 0x0C\n#define MG_DUMMY_DDR 0x2C\n#define MG_RADDR_SDR 0x02\n#define MG_RADDR_DDR 0x22\n#define MG_READ_SDR 0x09\n#define MG_READ_DDR 0x29\n#define MG_WRITE_SDR 0x08\n#define MG_WRITE_DDR 0x28\n#define MG_STOP 0\n\n#define MG_FLEXSPI_1PAD 0\n#define MG_FLEXSPI_2PAD 1\n#define MG_FLEXSPI_4PAD 2\n#define MG_FLEXSPI_8PAD 3\n\n#define MG_FLEXSPI_QSPI_LUT                                                    \\\n  {                                                                            \\\n    [0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0xEB, MG_RADDR_SDR,  \\\n                             MG_FLEXSPI_4PAD, 0x18),                           \\\n    [1] = MG_FLEXSPI_LUT_SEQ(MG_DUMMY_SDR, MG_FLEXSPI_4PAD, 0x06, MG_READ_SDR, \\\n                             MG_FLEXSPI_4PAD, 0x04),                           \\\n    [4 * 1 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x05,        \\\n                                     MG_READ_SDR, MG_FLEXSPI_1PAD, 0x04),      \\\n    [4 * 3 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x06,        \\\n                                     MG_STOP, MG_FLEXSPI_1PAD, 0x0),           \\\n    [4 * 5 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x20,        \\\n                                     MG_RADDR_SDR, MG_FLEXSPI_1PAD, 0x18),     \\\n    [4 * 8 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0xD8,        \\\n                                     MG_RADDR_SDR, MG_FLEXSPI_1PAD, 0x18),     \\\n    [4 * 9 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x02,        \\\n                                     MG_RADDR_SDR, MG_FLEXSPI_1PAD, 0x18),     \\\n    [4 * 9 + 1] = MG_FLEXSPI_LUT_SEQ(MG_WRITE_SDR, MG_FLEXSPI_1PAD, 0x04,      \\\n                                     MG_STOP, MG_FLEXSPI_1PAD, 0x0),           \\\n    [4 * 11 + 0] = MG_FLEXSPI_LUT_SEQ(MG_CMD_SDR, MG_FLEXSPI_1PAD, 0x60,       \\\n                                      MG_STOP, MG_FLEXSPI_1PAD, 0x0),          \\\n  }\n\n#define MG_FLEXSPI_LUT_OPERAND0(x) (((uint32_t) (((uint32_t) (x)))) & 0xFFU)\n#define MG_FLEXSPI_LUT_NUM_PADS0(x) \\\n  (((uint32_t) (((uint32_t) (x)) << 8U)) & 0x300U)\n#define MG_FLEXSPI_LUT_OPCODE0(x) \\\n  (((uint32_t) (((uint32_t) (x)) << 10U)) & 0xFC00U)\n#define MG_FLEXSPI_LUT_OPERAND1(x) \\\n  (((uint32_t) (((uint32_t) (x)) << 16U)) & 0xFF0000U)\n#define MG_FLEXSPI_LUT_NUM_PADS1(x) \\\n  (((uint32_t) (((uint32_t) (x)) << 24U)) & 0x3000000U)\n#define MG_FLEXSPI_LUT_OPCODE1(x) \\\n  (((uint32_t) (((uint32_t) (x)) << 26U)) & 0xFC000000U)\n\n#if MG_OTA == MG_OTA_RT1020\n// RT102X boards support ROM API version 1.4\nstruct mg_flexspi_nor_driver_interface {\n  uint32_t version;\n  int (*init)(uint32_t instance, struct mg_flexspi_nor_config *config);\n  int (*program)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                 uint32_t dst_addr, const uint32_t *src);\n  uint32_t reserved;\n  int (*erase)(uint32_t instance, struct mg_flexspi_nor_config *config,\n               uint32_t start, uint32_t lengthInBytes);\n  uint32_t reserved2;\n  int (*update_lut)(uint32_t instance, uint32_t seqIndex,\n                    const uint32_t *lutBase, uint32_t seqNumber);\n  int (*xfer)(uint32_t instance, char *xfer);\n  void (*clear_cache)(uint32_t instance);\n};\n#elif MG_OTA <= MG_OTA_RT1064\n// RT104x and RT106x support ROM API version 1.5\nstruct mg_flexspi_nor_driver_interface {\n  uint32_t version;\n  int (*init)(uint32_t instance, struct mg_flexspi_nor_config *config);\n  int (*program)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                 uint32_t dst_addr, const uint32_t *src);\n  int (*erase_all)(uint32_t instance, struct mg_flexspi_nor_config *config);\n  int (*erase)(uint32_t instance, struct mg_flexspi_nor_config *config,\n               uint32_t start, uint32_t lengthInBytes);\n  int (*read)(uint32_t instance, struct mg_flexspi_nor_config *config,\n              uint32_t *dst, uint32_t addr, uint32_t lengthInBytes);\n  void (*clear_cache)(uint32_t instance);\n  int (*xfer)(uint32_t instance, char *xfer);\n  int (*update_lut)(uint32_t instance, uint32_t seqIndex,\n                    const uint32_t *lutBase, uint32_t seqNumber);\n  int (*get_config)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                    uint32_t *option);\n};\n#else\n// RT117x support ROM API version 1.7\nstruct mg_flexspi_nor_driver_interface {\n  uint32_t version;\n  int (*init)(uint32_t instance, struct mg_flexspi_nor_config *config);\n  int (*program)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                 uint32_t dst_addr, const uint32_t *src);\n  int (*erase_all)(uint32_t instance, struct mg_flexspi_nor_config *config);\n  int (*erase)(uint32_t instance, struct mg_flexspi_nor_config *config,\n               uint32_t start, uint32_t lengthInBytes);\n  int (*read)(uint32_t instance, struct mg_flexspi_nor_config *config,\n              uint32_t *dst, uint32_t addr, uint32_t lengthInBytes);\n  uint32_t reserved;\n  int (*xfer)(uint32_t instance, char *xfer);\n  int (*update_lut)(uint32_t instance, uint32_t seqIndex,\n                    const uint32_t *lutBase, uint32_t seqNumber);\n  int (*get_config)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                    uint32_t *option);\n  int (*erase_sector)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                      uint32_t address);\n  int (*erase_block)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                     uint32_t address);\n  void (*hw_reset)(uint32_t instance, uint32_t resetLogic);\n  int (*wait_busy)(uint32_t instance, struct mg_flexspi_nor_config *config,\n                  bool isParallelMode, uint32_t address);\n  int (*set_clock_source)(uint32_t instance, uint32_t clockSrc);\n  void (*config_clock)(uint32_t instance, uint32_t freqOption,\n                  uint32_t sampleClkMode);\n};\n#endif\n\n#if MG_OTA <= MG_OTA_RT1064\n#define MG_FLEXSPI_BASE 0x402A8000\n#define flexspi_nor                                                          \\\n  (*((struct mg_flexspi_nor_driver_interface **) (*(uint32_t *) 0x0020001c + \\\n                                                  16)))\n#else\n#define MG_FLEXSPI_BASE 0x400CC000\n#define flexspi_nor                                                          \\\n  (*((struct mg_flexspi_nor_driver_interface **) (*(uint32_t *) 0x0021001c + \\\n                                                  12)))\n#endif\n\nstatic bool s_flash_irq_disabled;\n\nMG_IRAM static bool flash_page_start(volatile uint32_t *dst) {\n  char *base = (char *) s_mg_flash_imxrt.start, *end = base + s_mg_flash_imxrt.size;\n  volatile char *p = (char *) dst;\n  return p >= base && p < end && ((p - base) % s_mg_flash_imxrt.secsz) == 0;\n}\n\n// Note: the get_config function below works both for RT1020 and 1060\n// must reside in RAM, as flash will be erased\nstatic struct mg_flexspi_nor_config default_config = {\n  .memConfig = {.tag = MG_FLEXSPI_CFG_BLK_TAG,\n                .version = MG_FLEXSPI_CFG_BLK_VERSION,\n                .readSampleClkSrc = 1,  // ReadSampleClk_LoopbackFromDqsPad\n                .csHoldTime = 3,\n                .csSetupTime = 3,\n                .controllerMiscOption = MG_BIT(4),\n                .deviceType = 1,  // serial NOR\n                .sflashPadType = 4,\n                .serialClkFreq = 7,  // 133MHz\n                .sflashA1Size = 8 * 1024 * 1024,\n                .lookupTable = MG_FLEXSPI_QSPI_LUT},\n  .pageSize = 256,\n  .sectorSize = 4 * 1024,\n  .ipcmdSerialClkFreq = 1,\n  .blockSize = 64 * 1024,\n  .isUniformBlockSize = false\n};\nMG_IRAM static int flexspi_nor_get_config(\n  struct mg_flexspi_nor_config **config) {\n  *config = &default_config;\n  return 0;\n}\n\n#if 0\n// ROM API get_config call (ROM version >= 1.5)\nMG_IRAM static int flexspi_nor_get_config(\n    struct mg_flexspi_nor_config **config) {\n  uint32_t options[] = {0xc0000000, 0x00};\n\n  MG_ARM_DISABLE_IRQ();\n  uint32_t status =\n      flexspi_nor->get_config(FLEXSPI_NOR_INSTANCE, *config, options);\n  if (!s_flash_irq_disabled) {\n    MG_ARM_ENABLE_IRQ();\n  }\n  if (status) {\n    MG_ERROR((\"Failed to extract flash configuration: status %u\", status));\n  }\n  return status;\n}\n#endif\n\nMG_IRAM static void mg_spin(volatile uint32_t count) {\n  while (count--) (void) 0;\n}\n\nMG_IRAM static void flash_wait(void) {\n  while ((*((volatile uint32_t *) (MG_FLEXSPI_BASE + 0xE0)) & MG_BIT(1)) == 0)\n    mg_spin(1);\n}\n\nMG_IRAM static bool flash_erase(struct mg_flexspi_nor_config *config,\n                                void *addr) {\n  if (flash_page_start(addr) == false) {\n    MG_ERROR((\"%p is not on a sector boundary\", addr));\n    return false;\n  }\n\n  void *dst = (void *) ((char *) addr - (char *) s_mg_flash_imxrt.start);\n\n  bool ok = (flexspi_nor->erase(FLEXSPI_NOR_INSTANCE, config, (uint32_t) dst,\n                                s_mg_flash_imxrt.secsz) == 0);\n  MG_DEBUG((\"Sector starting at %p erasure: %s\", addr, ok ? \"ok\" : \"fail\"));\n  return ok;\n}\n\n#if 0\n// standalone erase call\nMG_IRAM static bool mg_imxrt_erase(void *addr) {\n  struct mg_flexspi_nor_config config, *config_ptr = &config;\n  bool ret;\n  // Interrupts must be disabled before calls to ROM API in RT1020 and 1060\n  MG_ARM_DISABLE_IRQ();\n  ret = (flexspi_nor_get_config(&config_ptr) == 0);\n  if (ret) ret = flash_erase(config_ptr, addr);\n  MG_ARM_ENABLE_IRQ();\n  return ret;\n}\n#endif\n\nMG_IRAM bool mg_imxrt_swap(void) {\n  return true;\n}\n\nMG_IRAM static bool mg_imxrt_write(void *addr, const void *buf, size_t len) {\n  struct mg_flexspi_nor_config config, *config_ptr = &config;\n  bool ok = false;\n  // Interrupts must be disabled before calls to ROM API in RT1020 and 1060\n  MG_ARM_DISABLE_IRQ();\n  if (flexspi_nor_get_config(&config_ptr) != 0) goto fwxit;\n  if ((len % s_mg_flash_imxrt.align) != 0) {\n    MG_ERROR((\"%lu is not aligned to %lu\", len, s_mg_flash_imxrt.align));\n    goto fwxit;\n  }\n  if ((char *) addr < (char *) s_mg_flash_imxrt.start) {\n    MG_ERROR((\"Invalid flash write address: %p\", addr));\n    goto fwxit;\n  }\n\n  uint32_t *dst = (uint32_t *) addr;\n  uint32_t *src = (uint32_t *) buf;\n  uint32_t *end = (uint32_t *) ((char *) buf + len);\n  ok = true;\n\n  while (ok && src < end) {\n    if (flash_page_start(dst) && flash_erase(config_ptr, dst) == false) {\n      ok = false;\n      break;\n    }\n    uint32_t status;\n    uint32_t dst_ofs = (uint32_t) dst - (uint32_t) s_mg_flash_imxrt.start;\n    if ((char *) buf >= (char *) s_mg_flash_imxrt.start) {\n      // If we copy from FLASH to FLASH, then we first need to copy the source\n      // to RAM\n      size_t tmp_buf_size = s_mg_flash_imxrt.align / sizeof(uint32_t);\n      uint32_t tmp[tmp_buf_size];\n\n      for (size_t i = 0; i < tmp_buf_size; i++) {\n        flash_wait();\n        tmp[i] = src[i];\n      }\n      status = flexspi_nor->program(FLEXSPI_NOR_INSTANCE, config_ptr,\n                                    (uint32_t) dst_ofs, tmp);\n    } else {\n      status = flexspi_nor->program(FLEXSPI_NOR_INSTANCE, config_ptr,\n                                    (uint32_t) dst_ofs, src);\n    }\n    src = (uint32_t *) ((char *) src + s_mg_flash_imxrt.align);\n    dst = (uint32_t *) ((char *) dst + s_mg_flash_imxrt.align);\n    if (status != 0) {\n      ok = false;\n    }\n  }\n  MG_DEBUG((\"Flash write %lu bytes @ %p: %s.\", len, dst, ok ? \"ok\" : \"fail\"));\nfwxit:\n  if (!s_flash_irq_disabled) MG_ARM_ENABLE_IRQ();\n  return ok;\n}\n\n// just overwrite instead of swap\nMG_IRAM static void single_bank_swap(char *p1, char *p2, size_t s, size_t ss) {\n  // no stdlib calls here\n  for (size_t ofs = 0; ofs < s; ofs += ss) {\n    mg_imxrt_write(p1 + ofs, p2 + ofs, ss);\n  }\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_imxrt);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_imxrt);\n}\n\nbool mg_ota_end(void) {\n  if (mg_ota_flash_end(&s_mg_flash_imxrt)) {\n    if (0) {  // is_dualbank()\n      // TODO(): no devices so far\n      *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n    } else {\n      // Swap partitions. Pray power does not go away\n      MG_INFO((\"Swapping partitions, size %u (%u sectors)\",\n               s_mg_flash_imxrt.size,\n               s_mg_flash_imxrt.size / s_mg_flash_imxrt.secsz));\n      MG_INFO((\"Do NOT power off...\"));\n      mg_log_level = MG_LL_NONE;\n      s_flash_irq_disabled = true;\n      // Runs in RAM, will reset when finished\n      single_bank_swap(\n          (char *) s_mg_flash_imxrt.start,\n          (char *) s_mg_flash_imxrt.start + s_mg_flash_imxrt.size / 2,\n          s_mg_flash_imxrt.size / 2, s_mg_flash_imxrt.secsz);\n    }\n  }\n  return false;\n}\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ota_mcxn.c\"\n#endif\n\n\n\n\n#if MG_OTA == MG_OTA_MCXN\n\n// - Flash phrase: 16 bytes; smallest portion programmed in one operation.\n// - Flash page: 128 bytes; largest portion programmed in one operation.\n// - Flash sector: 8 KB; smallest portion that can be erased in one operation.\n// - Flash API mg_flash_driver->program: \"start\" and \"len\" must be page-size\n// aligned; to use 'phrase', FMU register access is needed. Using ROM\n\nstatic bool mg_mcxn_write(void *, const void *, size_t);\nstatic bool mg_mcxn_swap(void);\n\nstatic struct mg_flash s_mg_flash_mcxn = {\n    (void *) 0,  // Start, filled at init\n    0,           // Size, filled at init\n    0,           // Sector size, filled at init\n    0,           // Align, filled at init\n    mg_mcxn_write,\n    mg_mcxn_swap,\n};\n\nstruct mg_flash_config {\n  uint32_t addr;\n  uint32_t size;\n  uint32_t blocks;\n  uint32_t page_size;\n  uint32_t sector_size;\n  uint32_t ffr[6];\n  uint32_t reserved0[5];\n  uint32_t *bootctx;\n  bool useahb;\n};\n\nstruct mg_flash_driver_interface {\n  uint32_t version;\n  uint32_t (*init)(struct mg_flash_config *);\n  uint32_t (*erase)(struct mg_flash_config *, uint32_t start, uint32_t len,\n                    uint32_t key);\n  uint32_t (*program)(struct mg_flash_config *, uint32_t start, uint8_t *src,\n                      uint32_t len);\n  uint32_t (*verify_erase)(struct mg_flash_config *, uint32_t start,\n                           uint32_t len);\n  uint32_t (*verify_program)(struct mg_flash_config *, uint32_t start,\n                             uint32_t len, const uint8_t *expected,\n                             uint32_t *addr, uint32_t *failed);\n  uint32_t reserved1[12];\n  uint32_t (*read)(struct mg_flash_config *, uint32_t start, uint8_t *dest,\n                   uint32_t len);\n  uint32_t reserved2[4];\n  uint32_t (*deinit)(struct mg_flash_config *);\n};\n#define mg_flash_driver \\\n  ((struct mg_flash_driver_interface *) (*((uint32_t *) 0x1303fc00 + 4)))\n#define MG_MCXN_FLASK_KEY (('k' << 24) | ('e' << 16) | ('f' << 8) | 'l')\n\nMG_IRAM static bool flash_sector_start(volatile uint32_t *dst) {\n  char *base = (char *) s_mg_flash_mcxn.start,\n       *end = base + s_mg_flash_mcxn.size;\n  volatile char *p = (char *) dst;\n  return p >= base && p < end && ((p - base) % s_mg_flash_mcxn.secsz) == 0;\n}\n\nMG_IRAM static bool flash_erase(struct mg_flash_config *config, void *addr) {\n  if (flash_sector_start(addr) == false) {\n    MG_ERROR((\"%p is not on a sector boundary\", addr));\n    return false;\n  }\n  uint32_t dst =\n      (uint32_t) addr - (uint32_t) s_mg_flash_mcxn.start;  // future-proof\n  uint32_t status = mg_flash_driver->erase(config, dst, s_mg_flash_mcxn.secsz,\n                                           MG_MCXN_FLASK_KEY);\n  bool ok = (status == 0);\n  if (!ok) MG_ERROR((\"Flash write error: %lu\", status));\n  MG_DEBUG((\"Sector starting at %p erasure: %s\", addr, ok ? \"ok\" : \"fail\"));\n  return ok;\n}\n\n#if 0\n// read-while-write, no need to disable IRQs for standalone usage\nMG_IRAM static bool mg_mcxn_erase(void *addr) {\n  uint32_t status;\n  struct mg_flash_config config;\n  if ((status = mg_flash_driver->init(&config)) != 0) {\n    MG_ERROR((\"Flash driver init error: %lu\", status));\n    return false;\n  }\n  bool ok = flash_erase(&config, addr);\n  mg_flash_driver->deinit(&config);\n  return ok;\n}\n#endif\n\nMG_IRAM static bool mg_mcxn_swap(void) {\n  // TODO(): no devices so far\n  return true;\n}\n\nstatic bool s_flash_irq_disabled;\n\nMG_IRAM static bool mg_mcxn_write(void *addr, const void *buf, size_t len) {\n  bool ok = false;\n  uint32_t status;\n  struct mg_flash_config config;\n  if ((status = mg_flash_driver->init(&config)) != 0) {\n    MG_ERROR((\"Flash driver init error: %lu\", status));\n    return false;\n  }\n  if ((len % s_mg_flash_mcxn.align) != 0) {\n    MG_ERROR((\"%lu is not aligned to %lu\", len, s_mg_flash_mcxn.align));\n    goto fwxit;\n  }\n  if ((((size_t) addr - (size_t) s_mg_flash_mcxn.start) %\n       s_mg_flash_mcxn.align) != 0) {\n    MG_ERROR((\"%p is not on a page boundary\", addr));\n    goto fwxit;\n  }\n\n  uint32_t *dst = (uint32_t *) addr;\n  uint32_t *src = (uint32_t *) buf;\n  uint32_t *end = (uint32_t *) ((char *) buf + len);\n  ok = true;\n\n  MG_ARM_DISABLE_IRQ();\n  while (ok && src < end) {\n    if (flash_sector_start(dst) && flash_erase(&config, dst) == false) {\n      ok = false;\n      break;\n    }\n    uint32_t dst_ofs = (uint32_t) dst - (uint32_t) s_mg_flash_mcxn.start;\n    // assume source is in RAM or in a different bank or read-while-write\n    status = mg_flash_driver->program(&config, dst_ofs, (uint8_t *) src,\n                                      s_mg_flash_mcxn.align);\n    src = (uint32_t *) ((char *) src + s_mg_flash_mcxn.align);\n    dst = (uint32_t *) ((char *) dst + s_mg_flash_mcxn.align);\n    if (status != 0) {\n      MG_ERROR((\"Flash write error: %lu\", status));\n      ok = false;\n    }\n  }\n  if (!s_flash_irq_disabled) MG_ARM_ENABLE_IRQ();\n  MG_DEBUG((\"Flash write %lu bytes @ %p: %s.\", len, dst, ok ? \"ok\" : \"fail\"));\n\nfwxit:\n  mg_flash_driver->deinit(&config);\n  return ok;\n}\n\n// try to swap (honor dual image), otherwise just overwrite\nMG_IRAM static void single_bank_swap(char *p1, char *p2, size_t s, size_t ss) {\n  char *tmp = malloc(ss);\n  // no stdlib calls here\n  for (size_t ofs = 0; ofs < s; ofs += ss) {\n    if (tmp != NULL)\n      for (size_t i = 0; i < ss; i++) tmp[i] = p1[ofs + i];\n    mg_mcxn_write(p1 + ofs, p2 + ofs, ss);\n    if (tmp != NULL) mg_mcxn_write(p2 + ofs, tmp, ss);\n  }\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  uint32_t status;\n  struct mg_flash_config config;\n  if ((status = mg_flash_driver->init(&config)) != 0) {\n    MG_ERROR((\"Flash driver init error: %lu\", status));\n    return false;\n  }\n  s_mg_flash_mcxn.start = (void *) config.addr;\n  s_mg_flash_mcxn.size = config.size;\n  s_mg_flash_mcxn.secsz = config.sector_size;\n  s_mg_flash_mcxn.align = config.page_size;\n  mg_flash_driver->deinit(&config);\n  MG_DEBUG(\n      (\"%lu-byte flash @%p, using %lu-byte sectors with %lu-byte-aligned pages\",\n       s_mg_flash_mcxn.size, s_mg_flash_mcxn.start, s_mg_flash_mcxn.secsz,\n       s_mg_flash_mcxn.align));\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_mcxn);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_mcxn);\n}\n\nbool mg_ota_end(void) {\n  if (mg_ota_flash_end(&s_mg_flash_mcxn)) {\n    if (0) {  // is_dualbank()\n      // TODO(): no devices so far\n      *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n    } else {\n      // Swap partitions. Pray power does not go away\n      MG_INFO((\"Swapping partitions, size %u (%u sectors)\",\n               s_mg_flash_mcxn.size,\n               s_mg_flash_mcxn.size / s_mg_flash_mcxn.secsz));\n      MG_INFO((\"Do NOT power off...\"));\n      mg_log_level = MG_LL_NONE;\n      s_flash_irq_disabled = true;\n      // Runs in RAM, will reset when finished\n      single_bank_swap(\n          (char *) s_mg_flash_mcxn.start,\n          (char *) s_mg_flash_mcxn.start + s_mg_flash_mcxn.size / 2,\n          s_mg_flash_mcxn.size / 2, s_mg_flash_mcxn.secsz);\n    }\n  }\n  return false;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ota_picosdk.c\"\n#endif\n\n\n\n\n#if MG_OTA == MG_OTA_PICOSDK\n\n// Both RP2040 and RP2350 have no flash, low-level flash access support in\n// bootrom, and high-level support in Pico-SDK (2.0+ for the RP2350)\n// - The RP2350 in RISC-V mode is not yet (fully) supported (nor tested)\n\nstatic bool mg_picosdk_write(void *, const void *, size_t);\nstatic bool mg_picosdk_swap(void);\n\nstatic struct mg_flash s_mg_flash_picosdk = {\n    (void *) 0x10000000,  // Start, not used here; functions handle offset\n#ifdef PICO_FLASH_SIZE_BYTES\n    PICO_FLASH_SIZE_BYTES,  // Size, from board definitions\n#else\n    0x200000,  // Size, guess... is 2M enough ?\n#endif\n    FLASH_SECTOR_SIZE,  // Sector size, from hardware_flash\n    FLASH_PAGE_SIZE,    // Align, from hardware_flash\n    mg_picosdk_write,      mg_picosdk_swap,\n};\n\n#define MG_MODULO2(x, m) ((x) & ((m) -1))\n\nstatic bool __no_inline_not_in_flash_func(flash_sector_start)(\n    volatile uint32_t *dst) {\n  char *base = (char *) s_mg_flash_picosdk.start,\n       *end = base + s_mg_flash_picosdk.size;\n  volatile char *p = (char *) dst;\n  return p >= base && p < end &&\n         MG_MODULO2(p - base, s_mg_flash_picosdk.secsz) == 0;\n}\n\nstatic bool __no_inline_not_in_flash_func(flash_erase)(void *addr) {\n  if (flash_sector_start(addr) == false) {\n    MG_ERROR((\"%p is not on a sector boundary\", addr));\n    return false;\n  }\n  void *dst = (void *) ((char *) addr - (char *) s_mg_flash_picosdk.start);\n  flash_range_erase((uint32_t) dst, s_mg_flash_picosdk.secsz);\n  MG_DEBUG((\"Sector starting at %p erasure\", addr));\n  return true;\n}\n\nstatic bool __no_inline_not_in_flash_func(mg_picosdk_swap)(void) {\n  // TODO(): RP2350 might have some A/B functionality (DS 5.1)\n  return true;\n}\n\nstatic bool s_flash_irq_disabled;\n\nstatic bool __no_inline_not_in_flash_func(mg_picosdk_write)(void *addr,\n                                                            const void *buf,\n                                                            size_t len) {\n  if ((len % s_mg_flash_picosdk.align) != 0) {\n    MG_ERROR((\"%lu is not aligned to %lu\", len, s_mg_flash_picosdk.align));\n    return false;\n  }\n  if ((((size_t) addr - (size_t) s_mg_flash_picosdk.start) %\n       s_mg_flash_picosdk.align) != 0) {\n    MG_ERROR((\"%p is not on a page boundary\", addr));\n    return false;\n  }\n\n  uint32_t *dst = (uint32_t *) addr;\n  uint32_t *src = (uint32_t *) buf;\n  uint32_t *end = (uint32_t *) ((char *) buf + len);\n\n#ifndef __riscv\n  MG_ARM_DISABLE_IRQ();\n#else\n  asm volatile(\"csrrc zero, mstatus, %0\" : : \"i\"(1 << 3) : \"memory\");\n#endif\n  while (src < end) {\n    uint32_t dst_ofs = (uint32_t) dst - (uint32_t) s_mg_flash_picosdk.start;\n    if (flash_sector_start(dst) && flash_erase(dst) == false) break;\n    // flash_range_program() runs in RAM and handles writing up to\n    // FLASH_PAGE_SIZE bytes. Source must not be in flash\n    flash_range_program((uint32_t) dst_ofs, (uint8_t *) src,\n                        s_mg_flash_picosdk.align);\n    src = (uint32_t *) ((char *) src + s_mg_flash_picosdk.align);\n    dst = (uint32_t *) ((char *) dst + s_mg_flash_picosdk.align);\n  }\n  if (!s_flash_irq_disabled) {\n#ifndef __riscv\n    MG_ARM_ENABLE_IRQ();\n#else\n    asm volatile(\"csrrs mstatus, %0\" : : \"i\"(1 << 3) : \"memory\");\n#endif\n  }\n  MG_DEBUG((\"Flash write %lu bytes @ %p.\", len, dst));\n  return true;\n}\n\n// just overwrite instead of swap\nstatic void __no_inline_not_in_flash_func(single_bank_swap)(char *p1, char *p2,\n                                                            size_t s,\n                                                            size_t ss) {\n  char *tmp = malloc(ss);\n  if (tmp == NULL) return;\n#if PICO_RP2040\n  uint32_t xip[256 / sizeof(uint32_t)];\n  void *dst = (void *) ((char *) p1 - (char *) s_mg_flash_picosdk.start);\n  size_t count = MG_ROUND_UP(s, ss);\n  // use SDK function calls to get BootROM function pointers\n  rom_connect_internal_flash_fn connect = (rom_connect_internal_flash_fn) rom_func_lookup_inline(ROM_FUNC_CONNECT_INTERNAL_FLASH);\n  rom_flash_exit_xip_fn xit = (rom_flash_exit_xip_fn) rom_func_lookup_inline(ROM_FUNC_FLASH_EXIT_XIP);\n  rom_flash_range_program_fn program = (rom_flash_range_program_fn) rom_func_lookup_inline(ROM_FUNC_FLASH_RANGE_PROGRAM);\n  rom_flash_flush_cache_fn flush = (rom_flash_flush_cache_fn) rom_func_lookup_inline(ROM_FUNC_FLASH_FLUSH_CACHE);\n  // no stdlib calls here.\n  MG_ARM_DISABLE_IRQ();\n  // 2nd bootloader (XIP) is in flash, SDK functions copy it to RAM on entry\n  for (size_t i = 0; i < 256 / sizeof(uint32_t); i++)\n    xip[i] = ((uint32_t *) (s_mg_flash_picosdk.start))[i];\n  flash_range_erase((uint32_t) dst, count);\n  // flash has been erased, no XIP to copy. Only BootROM calls possible\n  for (uint32_t ofs = 0; ofs < s; ofs += ss) {\n    for (size_t i = 0; i < ss; i++) tmp[i] = p2[ofs + i];\n    __compiler_memory_barrier();\n    connect();\n    xit();\n    program((uint32_t) dst + ofs, tmp, ss);\n    flush();\n    ((void (*)(void))((intptr_t) xip + 1))(); // enter XIP again\n  }\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;  // AIRCR = SYSRESETREQ\n#else\n  // RP2350 has bootram and copies second bootloader there, SDK uses that copy,\n  // It might also be able to take advantage of partition swapping\n  for (size_t ofs = 0; ofs < s; ofs += ss) {\n    for (size_t i = 0; i < ss; i++) tmp[i] = p2[ofs + i];\n    mg_picosdk_write(p1 + ofs, tmp, ss);\n  }\n#ifndef __riscv\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;  // AIRCR = SYSRESETREQ\n#else\n  // TODO(): find a way to do a system reset, like block resets and watchdog\n#endif\n#endif\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_picosdk);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_picosdk);\n}\n\nbool mg_ota_end(void) {\n  if (mg_ota_flash_end(&s_mg_flash_picosdk)) {\n    // Swap partitions. Pray power does not go away\n    MG_INFO((\"Swapping partitions, size %u (%u sectors)\",\n             s_mg_flash_picosdk.size,\n             s_mg_flash_picosdk.size / s_mg_flash_picosdk.secsz));\n    MG_INFO((\"Do NOT power off...\"));\n    mg_log_level = MG_LL_NONE;\n    s_flash_irq_disabled = true;\n    // Runs in RAM, will reset when finished or return on failure\n    single_bank_swap(\n        (char *) s_mg_flash_picosdk.start,\n        (char *) s_mg_flash_picosdk.start + s_mg_flash_picosdk.size / 2,\n        s_mg_flash_picosdk.size / 2, s_mg_flash_picosdk.secsz);\n  }\n  return false;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ota_stm32f.c\"\n#endif\n\n\n\n\n#if MG_OTA == MG_OTA_STM32F\n\nstatic bool mg_stm32f_write(void *, const void *, size_t);\nstatic bool mg_stm32f_swap(void);\n\nstatic struct mg_flash s_mg_flash_stm32f = {\n    (void *) 0x08000000,  // Start\n    0,                    // Size, FLASH_SIZE_REG\n    0,                    // Irregular sector size\n    32,                   // Align, 256 bit\n    mg_stm32f_write,\n    mg_stm32f_swap,\n};\n\n#define MG_FLASH_BASE 0x40023c00\n#define MG_FLASH_KEYR 0x04\n#define MG_FLASH_SR 0x0c\n#define MG_FLASH_CR 0x10\n#define MG_FLASH_OPTCR 0x14\n#define MG_FLASH_SIZE_REG_F7 0x1FF0F442\n#define MG_FLASH_SIZE_REG_F4 0x1FFF7A22\n\n#define STM_DBGMCU_IDCODE 0xE0042000\n#define STM_DEV_ID (MG_REG(STM_DBGMCU_IDCODE) & (MG_BIT(12) - 1))\n#define SYSCFG_MEMRMP 0x40013800\n\n#define MG_FLASH_SIZE_REG_LOCATION \\\n  ((STM_DEV_ID >= 0x449) ? MG_FLASH_SIZE_REG_F7 : MG_FLASH_SIZE_REG_F4)\n\nstatic size_t flash_size(void) {\n  return (MG_REG(MG_FLASH_SIZE_REG_LOCATION) & 0xFFFF) * 1024;\n}\n\nMG_IRAM static int is_dualbank(void) {\n  // only F42x/F43x series (0x419) support dual bank\n  return STM_DEV_ID == 0x419;\n}\n\nMG_IRAM static void flash_unlock(void) {\n  static bool unlocked = false;\n  if (unlocked == false) {\n    MG_REG(MG_FLASH_BASE + MG_FLASH_KEYR) = 0x45670123;\n    MG_REG(MG_FLASH_BASE + MG_FLASH_KEYR) = 0xcdef89ab;\n    unlocked = true;\n  }\n}\n\n#define MG_FLASH_CONFIG_16_64_128 1   // used by STM32F7\n#define MG_FLASH_CONFIG_32_128_256 2  // used by STM32F4 and F2\n\nMG_IRAM static bool flash_page_start(volatile uint32_t *dst) {\n  char *base = (char *) s_mg_flash_stm32f.start;\n  char *end = base + s_mg_flash_stm32f.size;\n\n  if (is_dualbank() && dst >= (uint32_t *) (base + (end - base) / 2)) {\n    dst = (uint32_t *) ((uint32_t) dst - (end - base) / 2);\n  }\n\n  uint32_t flash_config = MG_FLASH_CONFIG_16_64_128;\n  if (STM_DEV_ID >= 0x449) {\n    flash_config = MG_FLASH_CONFIG_32_128_256;\n  }\n\n  volatile char *p = (char *) dst;\n  if (p >= base && p < end) {\n    if (p < base + 16 * 1024 * 4 * flash_config) {\n      if ((p - base) % (16 * 1024 * flash_config) == 0) return true;\n    } else if (p == base + 16 * 1024 * 4 * flash_config) {\n      return true;\n    } else if ((p - base) % (128 * 1024 * flash_config) == 0) {\n      return true;\n    }\n  }\n  return false;\n}\n\nMG_IRAM static int flash_sector(volatile uint32_t *addr) {\n  char *base = (char *) s_mg_flash_stm32f.start;\n  char *end = base + s_mg_flash_stm32f.size;\n  bool addr_in_bank_2 = false;\n  if (is_dualbank() && addr >= (uint32_t *) (base + (end - base) / 2)) {\n    addr = (uint32_t *) ((uint32_t) addr - (end - base) / 2);\n    addr_in_bank_2 = true;\n  }\n  volatile char *p = (char *) addr;\n  uint32_t flash_config = MG_FLASH_CONFIG_16_64_128;\n  if (STM_DEV_ID >= 0x449) {\n    flash_config = MG_FLASH_CONFIG_32_128_256;\n  }\n  int sector = -1;\n  if (p >= base && p < end) {\n    if (p < base + 16 * 1024 * 4 * flash_config) {\n      sector = (p - base) / (16 * 1024 * flash_config);\n    } else if (p >= base + 64 * 1024 * flash_config &&\n               p < base + 128 * 1024 * flash_config) {\n      sector = 4;\n    } else {\n      sector = (p - base) / (128 * 1024 * flash_config) + 4;\n    }\n  }\n  if (sector == -1) return -1;\n  if (addr_in_bank_2) sector += 12;  // a bank has 12 sectors\n  return sector;\n}\n\nMG_IRAM static bool flash_is_err(void) {\n  return MG_REG(MG_FLASH_BASE + MG_FLASH_SR) & ((MG_BIT(7) - 1) << 1);\n}\n\nMG_IRAM static void flash_wait(void) {\n  while (MG_REG(MG_FLASH_BASE + MG_FLASH_SR) & (MG_BIT(16))) (void) 0;\n}\n\nMG_IRAM static void flash_clear_err(void) {\n  flash_wait();                                // Wait until ready\n  MG_REG(MG_FLASH_BASE + MG_FLASH_SR) = 0xf2;  // Clear all errors\n}\n\nMG_IRAM static bool mg_stm32f_erase(void *addr) {\n  bool ok = false;\n  if (flash_page_start(addr) == false) {\n    MG_ERROR((\"%p is not on a sector boundary\", addr));\n  } else {\n    int sector = flash_sector(addr);\n    if (sector < 0) return false;\n    uint32_t sector_reg = sector;\n    if (is_dualbank() && sector >= 12) {\n      // 3.9.8 Flash control register (FLASH_CR) for F42xxx and F43xxx\n      // BITS[7:3]\n      sector_reg -= 12;\n      sector_reg |= MG_BIT(4);\n    }\n    flash_unlock();\n    flash_wait();\n    uint32_t cr = MG_BIT(1);       // SER\n    cr |= MG_BIT(16);              // STRT\n    cr |= (sector_reg & 31) << 3;  // sector\n    MG_REG(MG_FLASH_BASE + MG_FLASH_CR) = cr;\n    ok = !flash_is_err();\n    MG_DEBUG((\"Erase sector %lu @ %p %s. CR %#lx SR %#lx\", sector, addr,\n              ok ? \"ok\" : \"fail\", MG_REG(MG_FLASH_BASE + MG_FLASH_CR),\n              MG_REG(MG_FLASH_BASE + MG_FLASH_SR)));\n    // After we have erased the sector, set CR flags for programming\n    // 2 << 8 is word write parallelism, bit(0) is PG. RM0385, section 3.7.5\n    MG_REG(MG_FLASH_BASE + MG_FLASH_CR) = MG_BIT(0) | (2 << 8);\n    flash_clear_err();\n  }\n  return ok;\n}\n\nMG_IRAM static bool mg_stm32f_swap(void) {\n  // STM32 F42x/F43x support dual bank, however, the memory mapping\n  // change will not be carried through a hard reset. Therefore, we will use\n  // the single bank approach for this family as well.\n  return true;\n}\n\nstatic bool s_flash_irq_disabled;\n\nMG_IRAM static bool mg_stm32f_write(void *addr, const void *buf, size_t len) {\n  if ((len % s_mg_flash_stm32f.align) != 0) {\n    MG_ERROR((\"%lu is not aligned to %lu\", len, s_mg_flash_stm32f.align));\n    return false;\n  }\n  uint32_t *dst = (uint32_t *) addr;\n  uint32_t *src = (uint32_t *) buf;\n  uint32_t *end = (uint32_t *) ((char *) buf + len);\n  bool ok = true;\n  MG_ARM_DISABLE_IRQ();\n  flash_unlock();\n  flash_clear_err();\n  MG_REG(MG_FLASH_BASE + MG_FLASH_CR) = MG_BIT(0) | MG_BIT(9);  // PG, 32-bit\n  flash_wait();\n  MG_DEBUG((\"Writing flash @ %p, %lu bytes\", addr, len));\n  while (ok && src < end) {\n    if (flash_page_start(dst) && mg_stm32f_erase(dst) == false) break;\n    *(volatile uint32_t *) dst++ = *src++;\n    MG_DSB();  // ensure flash is written with no errors\n    flash_wait();\n    if (flash_is_err()) ok = false;\n  }\n  if (!s_flash_irq_disabled) MG_ARM_ENABLE_IRQ();\n  MG_DEBUG((\"Flash write %lu bytes @ %p: %s. CR %#lx SR %#lx\", len, dst,\n            ok ? \"ok\" : \"fail\", MG_REG(MG_FLASH_BASE + MG_FLASH_CR),\n            MG_REG(MG_FLASH_BASE + MG_FLASH_SR)));\n  MG_REG(MG_FLASH_BASE + MG_FLASH_CR) &= ~MG_BIT(0);  // Clear programming flag\n  return ok;\n}\n\n// just overwrite instead of swap\nMG_IRAM void single_bank_swap(char *p1, char *p2, size_t size) {\n  // no stdlib calls here\n  mg_stm32f_write(p1, p2, size);\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  s_mg_flash_stm32f.size = flash_size();\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_stm32f);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_stm32f);\n}\n\nbool mg_ota_end(void) {\n  if (mg_ota_flash_end(&s_mg_flash_stm32f)) {\n    // Swap partitions. Pray power does not go away\n    MG_INFO((\"Swapping partitions, size %u (%u sectors)\",\n             s_mg_flash_stm32f.size, STM_DEV_ID == 0x449 ? 8 : 12));\n    MG_INFO((\"Do NOT power off...\"));\n    mg_log_level = MG_LL_NONE;\n    s_flash_irq_disabled = true;\n    char *p1 = (char *) s_mg_flash_stm32f.start;\n    char *p2 = p1 + s_mg_flash_stm32f.size / 2;\n    size_t size = s_mg_flash_stm32f.size / 2;\n    // Runs in RAM, will reset when finished\n    single_bank_swap(p1, p2, size);\n  }\n  return false;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ota_stm32h5.c\"\n#endif\n\n\n\n\n#if MG_OTA == MG_OTA_STM32H5\n\nstatic bool mg_stm32h5_write(void *, const void *, size_t);\nstatic bool mg_stm32h5_swap(void);\n\nstatic struct mg_flash s_mg_flash_stm32h5 = {\n    (void *) 0x08000000,  // Start\n    2 * 1024 * 1024,      // Size, 2Mb\n    8 * 1024,             // Sector size, 8k\n    16,                   // Align, 128 bit\n    mg_stm32h5_write,\n    mg_stm32h5_swap,\n};\n\n#define MG_FLASH_BASE 0x40022000          // Base address of the flash controller\n#define FLASH_KEYR (MG_FLASH_BASE + 0x4)  // See RM0481 7.11\n#define FLASH_OPTKEYR (MG_FLASH_BASE + 0xc)\n#define FLASH_OPTCR (MG_FLASH_BASE + 0x1c)\n#define FLASH_NSSR (MG_FLASH_BASE + 0x20)\n#define FLASH_NSCR (MG_FLASH_BASE + 0x28)\n#define FLASH_NSCCR (MG_FLASH_BASE + 0x30)\n#define FLASH_OPTSR_CUR (MG_FLASH_BASE + 0x50)\n#define FLASH_OPTSR_PRG (MG_FLASH_BASE + 0x54)\n\nstatic void flash_unlock(void) {\n  static bool unlocked = false;\n  if (unlocked == false) {\n    MG_REG(FLASH_KEYR) = 0x45670123;\n    MG_REG(FLASH_KEYR) = 0Xcdef89ab;\n    MG_REG(FLASH_OPTKEYR) = 0x08192a3b;\n    MG_REG(FLASH_OPTKEYR) = 0x4c5d6e7f;\n    unlocked = true;\n  }\n}\n\nstatic int flash_page_start(volatile uint32_t *dst) {\n  char *base = (char *) s_mg_flash_stm32h5.start,\n       *end = base + s_mg_flash_stm32h5.size;\n  volatile char *p = (char *) dst;\n  return p >= base && p < end && ((p - base) % s_mg_flash_stm32h5.secsz) == 0;\n}\n\nstatic bool flash_is_err(void) {\n  return MG_REG(FLASH_NSSR) & ((MG_BIT(8) - 1) << 17);  // RM0481 7.11.9\n}\n\nstatic void flash_wait(void) {\n  while ((MG_REG(FLASH_NSSR) & MG_BIT(0)) &&\n         (MG_REG(FLASH_NSSR) & MG_BIT(16)) == 0) {\n    (void) 0;\n  }\n}\n\nstatic void flash_clear_err(void) {\n  flash_wait();                                    // Wait until ready\n  MG_REG(FLASH_NSCCR) = ((MG_BIT(9) - 1) << 16U);  // Clear all errors\n}\n\nstatic bool flash_bank_is_swapped(void) {\n  return MG_REG(FLASH_OPTCR) & MG_BIT(31);  // RM0481 7.11.8\n}\n\nstatic bool mg_stm32h5_erase(void *location) {\n  bool ok = false;\n  if (flash_page_start(location) == false) {\n    MG_ERROR((\"%p is not on a sector boundary\"));\n  } else {\n    uintptr_t diff = (char *) location - (char *) s_mg_flash_stm32h5.start;\n    uint32_t sector = diff / s_mg_flash_stm32h5.secsz;\n    uint32_t saved_cr = MG_REG(FLASH_NSCR);  // Save CR value\n    flash_unlock();\n    flash_clear_err();\n    MG_REG(FLASH_NSCR) = 0;\n    if ((sector < 128 && flash_bank_is_swapped()) ||\n        (sector > 127 && !flash_bank_is_swapped())) {\n      MG_REG(FLASH_NSCR) |= MG_BIT(31);  // Set FLASH_CR_BKSEL\n    }\n    if (sector > 127) sector -= 128;\n    MG_REG(FLASH_NSCR) |= MG_BIT(2) | (sector << 6);  // Erase | sector_num\n    MG_REG(FLASH_NSCR) |= MG_BIT(5);                  // Start erasing\n    flash_wait();\n    ok = !flash_is_err();\n    MG_DEBUG((\"Erase sector %lu @ %p: %s. CR %#lx SR %#lx\", sector, location,\n              ok ? \"ok\" : \"fail\", MG_REG(FLASH_NSCR), MG_REG(FLASH_NSSR)));\n    // mg_hexdump(location, 32);\n    MG_REG(FLASH_NSCR) = saved_cr;  // Restore saved CR\n  }\n  return ok;\n}\n\nstatic bool mg_stm32h5_swap(void) {\n  uint32_t desired = flash_bank_is_swapped() ? 0 : MG_BIT(31);\n  flash_unlock();\n  flash_clear_err();\n  // printf(\"OPTSR_PRG 1 %#lx\\n\", FLASH->OPTSR_PRG);\n  MG_SET_BITS(MG_REG(FLASH_OPTSR_PRG), MG_BIT(31), desired);\n  // printf(\"OPTSR_PRG 2 %#lx\\n\", FLASH->OPTSR_PRG);\n  MG_REG(FLASH_OPTCR) |= MG_BIT(1);  // OPTSTART\n  while ((MG_REG(FLASH_OPTSR_CUR) & MG_BIT(31)) != desired) (void) 0;\n  return true;\n}\n\nstatic bool mg_stm32h5_write(void *addr, const void *buf, size_t len) {\n  if ((len % s_mg_flash_stm32h5.align) != 0) {\n    MG_ERROR((\"%lu is not aligned to %lu\", len, s_mg_flash_stm32h5.align));\n    return false;\n  }\n  uint32_t *dst = (uint32_t *) addr;\n  uint32_t *src = (uint32_t *) buf;\n  uint32_t *end = (uint32_t *) ((char *) buf + len);\n  bool ok = true;\n  MG_ARM_DISABLE_IRQ();\n  flash_unlock();\n  flash_clear_err();\n  MG_REG(FLASH_NSCR) = MG_BIT(1);  // Set programming flag\n  while (ok && src < end) {\n    if (flash_page_start(dst) && mg_stm32h5_erase(dst) == false) {\n      ok = false;\n      break;\n    }\n    *(volatile uint32_t *) dst++ = *src++;\n    flash_wait();\n    if (flash_is_err()) ok = false;\n  }\n  MG_ARM_ENABLE_IRQ();\n  MG_DEBUG((\"Flash write %lu bytes @ %p: %s. CR %#lx SR %#lx\", len, dst,\n            flash_is_err() ? \"fail\" : \"ok\", MG_REG(FLASH_NSCR),\n            MG_REG(FLASH_NSSR)));\n  MG_REG(FLASH_NSCR) = 0;  // Clear flags\n  return ok;\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_stm32h5);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_stm32h5);\n}\n\n// Actual bank swap is deferred until reset, it is safe to execute in flash\nbool mg_ota_end(void) {\n  if(!mg_ota_flash_end(&s_mg_flash_stm32h5)) return false;\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n  return true;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ota_stm32h7.c\"\n#endif\n\n\n\n\n#if MG_OTA == MG_OTA_STM32H7 || MG_OTA == MG_OTA_STM32H7_DUAL_CORE\n\n// - H723/735 RM 4.3.3: Note: The application can simultaneously request a read\n// and a write operation through the AXI interface.\n//   - We only need IRAM for partition swapping in the H723, however, all\n//   related functions must reside in IRAM for this to be possible.\n// - Linker files for other devices won't define a .iram section so there's no\n// associated penalty\n\nstatic bool mg_stm32h7_write(void *, const void *, size_t);\nstatic bool mg_stm32h7_swap(void);\n\nstatic struct mg_flash s_mg_flash_stm32h7 = {\n    (void *) 0x08000000,  // Start\n    0,                    // Size, FLASH_SIZE_REG\n    128 * 1024,           // Sector size, 128k\n    32,                   // Align, 256 bit\n    mg_stm32h7_write,\n    mg_stm32h7_swap,\n};\n\n#define FLASH_BASE1 0x52002000  // Base address for bank1\n#define FLASH_BASE2 0x52002100  // Base address for bank2\n#define FLASH_KEYR 0x04         // See RM0433 4.9.2\n#define FLASH_OPTKEYR 0x08\n#define FLASH_OPTCR 0x18\n#define FLASH_SR 0x10\n#define FLASH_CR 0x0c\n#define FLASH_CCR 0x14\n#define FLASH_OPTSR_CUR 0x1c\n#define FLASH_OPTSR_PRG 0x20\n#define FLASH_SIZE_REG 0x1ff1e880\n\n#define IS_DUALCORE() (MG_OTA == MG_OTA_STM32H7_DUAL_CORE)\n\nMG_IRAM static bool is_dualbank(void) {\n  if (IS_DUALCORE()) {\n    // H745/H755 and H747/H757 are running on dual core.\n    // Using only the 1st bank (mapped to CM7), in order not to interfere\n    // with the 2nd bank (CM4), possibly causing CM4 to boot unexpectedly.\n    return false;\n  }\n  return (s_mg_flash_stm32h7.size < 2 * 1024 * 1024) ? false : true;\n}\n\nMG_IRAM static void flash_unlock(void) {\n  static bool unlocked = false;\n  if (unlocked == false) {\n    MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0x45670123;\n    MG_REG(FLASH_BASE1 + FLASH_KEYR) = 0xcdef89ab;\n    if (is_dualbank()) {\n      MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0x45670123;\n      MG_REG(FLASH_BASE2 + FLASH_KEYR) = 0xcdef89ab;\n    }\n    MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x08192a3b;  // opt reg is \"shared\"\n    MG_REG(FLASH_BASE1 + FLASH_OPTKEYR) = 0x4c5d6e7f;  // thus unlock once\n    unlocked = true;\n  }\n}\n\nMG_IRAM static bool flash_page_start(volatile uint32_t *dst) {\n  char *base = (char *) s_mg_flash_stm32h7.start,\n       *end = base + s_mg_flash_stm32h7.size;\n  volatile char *p = (char *) dst;\n  return p >= base && p < end && ((p - base) % s_mg_flash_stm32h7.secsz) == 0;\n}\n\nMG_IRAM static bool flash_is_err(uint32_t bank) {\n  return MG_REG(bank + FLASH_SR) & ((MG_BIT(11) - 1) << 17);  // RM0433 4.9.5\n}\n\nMG_IRAM static void flash_wait(uint32_t bank) {\n  while (MG_REG(bank + FLASH_SR) & (MG_BIT(0) | MG_BIT(2))) (void) 0;\n}\n\nMG_IRAM static void flash_clear_err(uint32_t bank) {\n  flash_wait(bank);                                      // Wait until ready\n  MG_REG(bank + FLASH_CCR) = ((MG_BIT(11) - 1) << 16U);  // Clear all errors\n}\n\nMG_IRAM static bool flash_bank_is_swapped(uint32_t bank) {\n  return MG_REG(bank + FLASH_OPTCR) & MG_BIT(31);  // RM0433 4.9.7\n}\n\n// Figure out flash bank based on the address\nMG_IRAM static uint32_t flash_bank(void *addr) {\n  size_t ofs = (char *) addr - (char *) s_mg_flash_stm32h7.start;\n  if (!is_dualbank()) return FLASH_BASE1;\n  return ofs < s_mg_flash_stm32h7.size / 2 ? FLASH_BASE1 : FLASH_BASE2;\n}\n\n// read-while-write, no need to disable IRQs for standalone usage\nMG_IRAM static bool mg_stm32h7_erase(void *addr) {\n  bool ok = false;\n  if (flash_page_start(addr) == false) {\n    MG_ERROR((\"%p is not on a sector boundary\", addr));\n  } else {\n    uintptr_t diff = (char *) addr - (char *) s_mg_flash_stm32h7.start;\n    uint32_t sector = diff / s_mg_flash_stm32h7.secsz;\n    uint32_t bank = flash_bank(addr);\n    uint32_t saved_cr = MG_REG(bank + FLASH_CR);  // Save CR value\n\n    flash_unlock();\n    if (sector > 7) sector -= 8;\n\n    flash_clear_err(bank);\n    MG_REG(bank + FLASH_CR) = MG_BIT(5);             // 32-bit write parallelism\n    MG_REG(bank + FLASH_CR) |= (sector & 7U) << 8U;  // Sector to erase\n    MG_REG(bank + FLASH_CR) |= MG_BIT(2);            // Sector erase bit\n    MG_REG(bank + FLASH_CR) |= MG_BIT(7);            // Start erasing\n    ok = !flash_is_err(bank);\n    MG_DEBUG((\"Erase sector %lu @ %p %s. CR %#lx SR %#lx\", sector, addr,\n              ok ? \"ok\" : \"fail\", MG_REG(bank + FLASH_CR),\n              MG_REG(bank + FLASH_SR)));\n    MG_REG(bank + FLASH_CR) = saved_cr;  // Restore CR\n  }\n  return ok;\n}\n\nMG_IRAM static bool mg_stm32h7_swap(void) {\n  if (!is_dualbank()) return true;\n  uint32_t bank = FLASH_BASE1;\n  uint32_t desired = flash_bank_is_swapped(bank) ? 0 : MG_BIT(31);\n  flash_unlock();\n  flash_clear_err(bank);\n  // printf(\"OPTSR_PRG 1 %#lx\\n\", FLASH->OPTSR_PRG);\n  MG_SET_BITS(MG_REG(bank + FLASH_OPTSR_PRG), MG_BIT(31), desired);\n  // printf(\"OPTSR_PRG 2 %#lx\\n\", FLASH->OPTSR_PRG);\n  MG_REG(bank + FLASH_OPTCR) |= MG_BIT(1);  // OPTSTART\n  while ((MG_REG(bank + FLASH_OPTSR_CUR) & MG_BIT(31)) != desired) (void) 0;\n  return true;\n}\n\nstatic bool s_flash_irq_disabled;\n\nMG_IRAM static bool mg_stm32h7_write(void *addr, const void *buf, size_t len) {\n  if ((len % s_mg_flash_stm32h7.align) != 0) {\n    MG_ERROR((\"%lu is not aligned to %lu\", len, s_mg_flash_stm32h7.align));\n    return false;\n  }\n  uint32_t bank = flash_bank(addr);\n  uint32_t *dst = (uint32_t *) addr;\n  uint32_t *src = (uint32_t *) buf;\n  uint32_t *end = (uint32_t *) ((char *) buf + len);\n  bool ok = true;\n  MG_ARM_DISABLE_IRQ();\n  flash_unlock();\n  flash_clear_err(bank);\n  MG_REG(bank + FLASH_CR) = MG_BIT(1);   // Set programming flag\n  MG_REG(bank + FLASH_CR) |= MG_BIT(5);  // 32-bit write parallelism\n  while (ok && src < end) {\n    if (flash_page_start(dst) && mg_stm32h7_erase(dst) == false) {\n      ok = false;\n      break;\n    }\n    *(volatile uint32_t *) dst++ = *src++;\n    flash_wait(bank);\n    if (flash_is_err(bank)) ok = false;\n  }\n  if (!s_flash_irq_disabled) MG_ARM_ENABLE_IRQ();\n  MG_DEBUG((\"Flash write %lu bytes @ %p: %s. CR %#lx SR %#lx\", len, dst,\n            ok ? \"ok\" : \"fail\", MG_REG(bank + FLASH_CR),\n            MG_REG(bank + FLASH_SR)));\n  MG_REG(bank + FLASH_CR) &= ~MG_BIT(1);  // Clear programming flag\n  return ok;\n}\n\n// just overwrite instead of swap\nMG_IRAM static void single_bank_swap(char *p1, char *p2, size_t s, size_t ss) {\n  // no stdlib calls here\n  for (size_t ofs = 0; ofs < s; ofs += ss) {\n    mg_stm32h7_write(p1 + ofs, p2 + ofs, ss);\n  }\n  *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  s_mg_flash_stm32h7.size = MG_REG(FLASH_SIZE_REG) * 1024;\n  if (IS_DUALCORE()) {\n    // Using only the 1st bank (mapped to CM7)\n    s_mg_flash_stm32h7.size /= 2;\n  }\n  return mg_ota_flash_begin(new_firmware_size, &s_mg_flash_stm32h7);\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  return mg_ota_flash_write(buf, len, &s_mg_flash_stm32h7);\n}\n\nbool mg_ota_end(void) {\n  if (mg_ota_flash_end(&s_mg_flash_stm32h7)) {\n    if (is_dualbank()) {\n      // Bank swap is deferred until reset, been executing in flash, reset\n      *(volatile unsigned long *) 0xe000ed0c = 0x5fa0004;\n    } else {\n      // Swap partitions. Pray power does not go away\n      MG_INFO((\"Swapping partitions, size %u (%u sectors)\",\n               s_mg_flash_stm32h7.size,\n               s_mg_flash_stm32h7.size / s_mg_flash_stm32h7.secsz));\n      MG_INFO((\"Do NOT power off...\"));\n      mg_log_level = MG_LL_NONE;\n      s_flash_irq_disabled = true;\n      // Runs in RAM, will reset when finished\n      single_bank_swap(\n          (char *) s_mg_flash_stm32h7.start,\n          (char *) s_mg_flash_stm32h7.start + s_mg_flash_stm32h7.size / 2,\n          s_mg_flash_stm32h7.size / 2, s_mg_flash_stm32h7.secsz);\n    }\n  }\n  return false;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/printf.c\"\n#endif\n\n\n\n\nsize_t mg_queue_vprintf(struct mg_queue *q, const char *fmt, va_list *ap) {\n  size_t len = mg_snprintf(NULL, 0, fmt, ap);\n  char *buf;\n  if (len == 0 || mg_queue_book(q, &buf, len + 1) < len + 1) {\n    len = 0;  // Nah. Not enough space\n  } else {\n    len = mg_vsnprintf((char *) buf, len + 1, fmt, ap);\n    mg_queue_add(q, len);\n  }\n  return len;\n}\n\nsize_t mg_queue_printf(struct mg_queue *q, const char *fmt, ...) {\n  va_list ap;\n  size_t len;\n  va_start(ap, fmt);\n  len = mg_queue_vprintf(q, fmt, &ap);\n  va_end(ap);\n  return len;\n}\n\nstatic void mg_pfn_iobuf_private(char ch, void *param, bool expand) {\n  struct mg_iobuf *io = (struct mg_iobuf *) param;\n  if (expand && io->len + 2 > io->size) mg_iobuf_resize(io, io->len + 2);\n  if (io->len + 2 <= io->size) {\n    io->buf[io->len++] = (uint8_t) ch;\n    io->buf[io->len] = 0;\n  } else if (io->len < io->size) {\n    io->buf[io->len++] = 0;  // Guarantee to 0-terminate\n  }\n}\n\nstatic void mg_putchar_iobuf_static(char ch, void *param) {\n  mg_pfn_iobuf_private(ch, param, false);\n}\n\nvoid mg_pfn_iobuf(char ch, void *param) {\n  mg_pfn_iobuf_private(ch, param, true);\n}\n\nsize_t mg_vsnprintf(char *buf, size_t len, const char *fmt, va_list *ap) {\n  struct mg_iobuf io = {(uint8_t *) buf, len, 0, 0};\n  size_t n = mg_vxprintf(mg_putchar_iobuf_static, &io, fmt, ap);\n  if (n < len) buf[n] = '\\0';\n  return n;\n}\n\nsize_t mg_snprintf(char *buf, size_t len, const char *fmt, ...) {\n  va_list ap;\n  size_t n;\n  va_start(ap, fmt);\n  n = mg_vsnprintf(buf, len, fmt, &ap);\n  va_end(ap);\n  return n;\n}\n\nchar *mg_vmprintf(const char *fmt, va_list *ap) {\n  struct mg_iobuf io = {0, 0, 0, 256};\n  mg_vxprintf(mg_pfn_iobuf, &io, fmt, ap);\n  return (char *) io.buf;\n}\n\nchar *mg_mprintf(const char *fmt, ...) {\n  char *s;\n  va_list ap;\n  va_start(ap, fmt);\n  s = mg_vmprintf(fmt, &ap);\n  va_end(ap);\n  return s;\n}\n\nvoid mg_pfn_stdout(char c, void *param) {\n  putchar(c);\n  (void) param;\n}\n\nstatic size_t print_ip4(void (*out)(char, void *), void *arg, uint8_t *p) {\n  return mg_xprintf(out, arg, \"%d.%d.%d.%d\", p[0], p[1], p[2], p[3]);\n}\n\nstatic size_t print_ip6(void (*out)(char, void *), void *arg, uint16_t *p) {\n  return mg_xprintf(out, arg, \"[%x:%x:%x:%x:%x:%x:%x:%x]\", mg_ntohs(p[0]),\n                    mg_ntohs(p[1]), mg_ntohs(p[2]), mg_ntohs(p[3]),\n                    mg_ntohs(p[4]), mg_ntohs(p[5]), mg_ntohs(p[6]),\n                    mg_ntohs(p[7]));\n}\n\nsize_t mg_print_ip4(void (*out)(char, void *), void *arg, va_list *ap) {\n  uint8_t *p = va_arg(*ap, uint8_t *);\n  return print_ip4(out, arg, p);\n}\n\nsize_t mg_print_ip6(void (*out)(char, void *), void *arg, va_list *ap) {\n  uint16_t *p = va_arg(*ap, uint16_t *);\n  return print_ip6(out, arg, p);\n}\n\nsize_t mg_print_ip(void (*out)(char, void *), void *arg, va_list *ap) {\n  struct mg_addr *addr = va_arg(*ap, struct mg_addr *);\n  if (addr->is_ip6) return print_ip6(out, arg, (uint16_t *) addr->ip);\n  return print_ip4(out, arg, (uint8_t *) &addr->ip);\n}\n\nsize_t mg_print_ip_port(void (*out)(char, void *), void *arg, va_list *ap) {\n  struct mg_addr *a = va_arg(*ap, struct mg_addr *);\n  return mg_xprintf(out, arg, \"%M:%hu\", mg_print_ip, a, mg_ntohs(a->port));\n}\n\nsize_t mg_print_mac(void (*out)(char, void *), void *arg, va_list *ap) {\n  uint8_t *p = va_arg(*ap, uint8_t *);\n  return mg_xprintf(out, arg, \"%02x:%02x:%02x:%02x:%02x:%02x\", p[0], p[1], p[2],\n                    p[3], p[4], p[5]);\n}\n\nstatic char mg_esc(int c, bool esc) {\n  const char *p, *esc1 = \"\\b\\f\\n\\r\\t\\\\\\\"\", *esc2 = \"bfnrt\\\\\\\"\";\n  for (p = esc ? esc1 : esc2; *p != '\\0'; p++) {\n    if (*p == c) return esc ? esc2[p - esc1] : esc1[p - esc2];\n  }\n  return 0;\n}\n\nstatic char mg_escape(int c) {\n  return mg_esc(c, true);\n}\n\nstatic size_t qcpy(void (*out)(char, void *), void *ptr, char *buf,\n                   size_t len) {\n  size_t i = 0, extra = 0;\n  for (i = 0; i < len && buf[i] != '\\0'; i++) {\n    char c = mg_escape(buf[i]);\n    if (c) {\n      out('\\\\', ptr), out(c, ptr), extra++;\n    } else {\n      out(buf[i], ptr);\n    }\n  }\n  return i + extra;\n}\n\nstatic size_t bcpy(void (*out)(char, void *), void *arg, uint8_t *buf,\n                   size_t len) {\n  size_t i, j, n = 0;\n  const char *t =\n      \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n  for (i = 0; i < len; i += 3) {\n    uint8_t c1 = buf[i], c2 = i + 1 < len ? buf[i + 1] : 0,\n            c3 = i + 2 < len ? buf[i + 2] : 0;\n    char tmp[4] = {t[c1 >> 2], t[(c1 & 3) << 4 | (c2 >> 4)], '=', '='};\n    if (i + 1 < len) tmp[2] = t[(c2 & 15) << 2 | (c3 >> 6)];\n    if (i + 2 < len) tmp[3] = t[c3 & 63];\n    for (j = 0; j < sizeof(tmp) && tmp[j] != '\\0'; j++) out(tmp[j], arg);\n    n += j;\n  }\n  return n;\n}\n\nsize_t mg_print_hex(void (*out)(char, void *), void *arg, va_list *ap) {\n  size_t bl = (size_t) va_arg(*ap, int);\n  uint8_t *p = va_arg(*ap, uint8_t *);\n  const char *hex = \"0123456789abcdef\";\n  size_t j;\n  for (j = 0; j < bl; j++) {\n    out(hex[(p[j] >> 4) & 0x0F], arg);\n    out(hex[p[j] & 0x0F], arg);\n  }\n  return 2 * bl;\n}\nsize_t mg_print_base64(void (*out)(char, void *), void *arg, va_list *ap) {\n  size_t len = (size_t) va_arg(*ap, int);\n  uint8_t *buf = va_arg(*ap, uint8_t *);\n  return bcpy(out, arg, buf, len);\n}\n\nsize_t mg_print_esc(void (*out)(char, void *), void *arg, va_list *ap) {\n  size_t len = (size_t) va_arg(*ap, int);\n  char *p = va_arg(*ap, char *);\n  if (len == 0) len = p == NULL ? 0 : strlen(p);\n  return qcpy(out, arg, p, len);\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/queue.c\"\n#endif\n\n\n\n#if (defined(__GNUC__) && (__GNUC__ > 4) ||                                \\\n     (defined(__GNUC_MINOR__) && __GNUC__ == 4 && __GNUC_MINOR__ >= 1)) || \\\n    defined(__clang__)\n#define MG_MEMORY_BARRIER() __sync_synchronize()\n#elif defined(_MSC_VER) && _MSC_VER >= 1700\n#define MG_MEMORY_BARRIER() MemoryBarrier()\n#elif !defined(MG_MEMORY_BARRIER)\n#define MG_MEMORY_BARRIER()\n#endif\n\n// Every message in a queue is prepended by a 32-bit message length (ML).\n// If ML is 0, then it is the end, and reader must wrap to the beginning.\n//\n//  Queue when q->tail <= q->head:\n//  |----- free -----| ML | message1 | ML | message2 |  ----- free ------|\n//  ^                ^                               ^                   ^\n// buf              tail                            head                len\n//\n//  Queue when q->tail > q->head:\n//  | ML | message2 |----- free ------| ML | message1 | 0 |---- free ----|\n//  ^               ^                 ^                                  ^\n// buf             head              tail                               len\n\nvoid mg_queue_init(struct mg_queue *q, char *buf, size_t size) {\n  q->size = size;\n  q->buf = buf;\n  q->head = q->tail = 0;\n}\n\nstatic size_t mg_queue_read_len(struct mg_queue *q) {\n  uint32_t n = 0;\n  MG_MEMORY_BARRIER();\n  memcpy(&n, q->buf + q->tail, sizeof(n));\n  assert(q->tail + n + sizeof(n) <= q->size);\n  return n;\n}\n\nstatic void mg_queue_write_len(struct mg_queue *q, size_t len) {\n  uint32_t n = (uint32_t) len;\n  memcpy(q->buf + q->head, &n, sizeof(n));\n  MG_MEMORY_BARRIER();\n}\n\nsize_t mg_queue_book(struct mg_queue *q, char **buf, size_t len) {\n  size_t space = 0, hs = sizeof(uint32_t) * 2;  // *2 is for the 0 marker\n  if (q->head >= q->tail && q->head + len + hs <= q->size) {\n    space = q->size - q->head - hs;  // There is enough space\n  } else if (q->head >= q->tail && q->tail > hs) {\n    mg_queue_write_len(q, 0);  // Not enough space ahead\n    q->head = 0;               // Wrap head to the beginning\n  }\n  if (q->head + hs + len < q->tail) space = q->tail - q->head - hs;\n  if (buf != NULL) *buf = q->buf + q->head + sizeof(uint32_t);\n  return space;\n}\n\nsize_t mg_queue_next(struct mg_queue *q, char **buf) {\n  size_t len = 0;\n  if (q->tail != q->head) {\n    len = mg_queue_read_len(q);\n    if (len == 0) {  // Zero (head wrapped) ?\n      q->tail = 0;   // Reset tail to the start\n      if (q->head > q->tail) len = mg_queue_read_len(q);  // Read again\n    }\n  }\n  if (buf != NULL) *buf = q->buf + q->tail + sizeof(uint32_t);\n  assert(q->tail + len <= q->size);\n  return len;\n}\n\nvoid mg_queue_add(struct mg_queue *q, size_t len) {\n  assert(len > 0);\n  mg_queue_write_len(q, len);\n  assert(q->head + sizeof(uint32_t) * 2 + len <= q->size);\n  q->head += len + sizeof(uint32_t);\n}\n\nvoid mg_queue_del(struct mg_queue *q, size_t len) {\n  q->tail += len + sizeof(uint32_t);\n  assert(q->tail + sizeof(uint32_t) <= q->size);\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/rpc.c\"\n#endif\n\n\n\nvoid mg_rpc_add(struct mg_rpc **head, struct mg_str method,\n                void (*fn)(struct mg_rpc_req *), void *fn_data) {\n  struct mg_rpc *rpc = (struct mg_rpc *) calloc(1, sizeof(*rpc));\n  if (rpc != NULL) {\n    rpc->method = mg_strdup(method);\n    rpc->fn = fn;\n    rpc->fn_data = fn_data;\n    rpc->next = *head, *head = rpc;\n  }\n}\n\nvoid mg_rpc_del(struct mg_rpc **head, void (*fn)(struct mg_rpc_req *)) {\n  struct mg_rpc *r;\n  while ((r = *head) != NULL) {\n    if (r->fn == fn || fn == NULL) {\n      *head = r->next;\n      free((void *) r->method.buf);\n      free(r);\n    } else {\n      head = &(*head)->next;\n    }\n  }\n}\n\nstatic void mg_rpc_call(struct mg_rpc_req *r, struct mg_str method) {\n  struct mg_rpc *h = r->head == NULL ? NULL : *r->head;\n  while (h != NULL && !mg_match(method, h->method, NULL)) h = h->next;\n  if (h != NULL) {\n    r->rpc = h;\n    h->fn(r);\n  } else {\n    mg_rpc_err(r, -32601, \"\\\"%.*s not found\\\"\", (int) method.len, method.buf);\n  }\n}\n\nvoid mg_rpc_process(struct mg_rpc_req *r) {\n  int len, off = mg_json_get(r->frame, \"$.method\", &len);\n  if (off > 0 && r->frame.buf[off] == '\"') {\n    struct mg_str method = mg_str_n(&r->frame.buf[off + 1], (size_t) len - 2);\n    mg_rpc_call(r, method);\n  } else if ((off = mg_json_get(r->frame, \"$.result\", &len)) > 0 ||\n             (off = mg_json_get(r->frame, \"$.error\", &len)) > 0) {\n    mg_rpc_call(r, mg_str(\"\"));  // JSON response! call \"\" method handler\n  } else {\n    mg_rpc_err(r, -32700, \"%m\", mg_print_esc, (int) r->frame.len,\n               r->frame.buf);  // Invalid\n  }\n}\n\nvoid mg_rpc_vok(struct mg_rpc_req *r, const char *fmt, va_list *ap) {\n  int len, off = mg_json_get(r->frame, \"$.id\", &len);\n  if (off > 0) {\n    mg_xprintf(r->pfn, r->pfn_data, \"{%m:%.*s,%m:\", mg_print_esc, 0, \"id\", len,\n               &r->frame.buf[off], mg_print_esc, 0, \"result\");\n    mg_vxprintf(r->pfn, r->pfn_data, fmt == NULL ? \"null\" : fmt, ap);\n    mg_xprintf(r->pfn, r->pfn_data, \"}\");\n  }\n}\n\nvoid mg_rpc_ok(struct mg_rpc_req *r, const char *fmt, ...) {\n  va_list ap;\n  va_start(ap, fmt);\n  mg_rpc_vok(r, fmt, &ap);\n  va_end(ap);\n}\n\nvoid mg_rpc_verr(struct mg_rpc_req *r, int code, const char *fmt, va_list *ap) {\n  int len, off = mg_json_get(r->frame, \"$.id\", &len);\n  mg_xprintf(r->pfn, r->pfn_data, \"{\");\n  if (off > 0) {\n    mg_xprintf(r->pfn, r->pfn_data, \"%m:%.*s,\", mg_print_esc, 0, \"id\", len,\n               &r->frame.buf[off]);\n  }\n  mg_xprintf(r->pfn, r->pfn_data, \"%m:{%m:%d,%m:\", mg_print_esc, 0, \"error\",\n             mg_print_esc, 0, \"code\", code, mg_print_esc, 0, \"message\");\n  mg_vxprintf(r->pfn, r->pfn_data, fmt == NULL ? \"null\" : fmt, ap);\n  mg_xprintf(r->pfn, r->pfn_data, \"}}\");\n}\n\nvoid mg_rpc_err(struct mg_rpc_req *r, int code, const char *fmt, ...) {\n  va_list ap;\n  va_start(ap, fmt);\n  mg_rpc_verr(r, code, fmt, &ap);\n  va_end(ap);\n}\n\nstatic size_t print_methods(mg_pfn_t pfn, void *pfn_data, va_list *ap) {\n  struct mg_rpc *h, **head = (struct mg_rpc **) va_arg(*ap, void **);\n  size_t len = 0;\n  for (h = *head; h != NULL; h = h->next) {\n    if (h->method.len == 0) continue;  // Ignore response handler\n    len += mg_xprintf(pfn, pfn_data, \"%s%m\", h == *head ? \"\" : \",\",\n                      mg_print_esc, (int) h->method.len, h->method.buf);\n  }\n  return len;\n}\n\nvoid mg_rpc_list(struct mg_rpc_req *r) {\n  mg_rpc_ok(r, \"[%M]\", print_methods, r->head);\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/sha1.c\"\n#endif\n/* Copyright(c) By Steve Reid <steve@edmweb.com> */\n/* 100% Public Domain */\n\n\n\nunion char64long16 {\n  unsigned char c[64];\n  uint32_t l[16];\n};\n\n#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits))))\n\nstatic uint32_t blk0(union char64long16 *block, int i) {\n  if (MG_BIG_ENDIAN) {\n  } else {\n    block->l[i] = (rol(block->l[i], 24) & 0xFF00FF00) |\n                  (rol(block->l[i], 8) & 0x00FF00FF);\n  }\n  return block->l[i];\n}\n\n/* Avoid redefine warning (ARM /usr/include/sys/ucontext.h define R0~R4) */\n#undef blk\n#undef R0\n#undef R1\n#undef R2\n#undef R3\n#undef R4\n\n#define blk(i)                                                               \\\n  (block->l[i & 15] = rol(block->l[(i + 13) & 15] ^ block->l[(i + 8) & 15] ^ \\\n                              block->l[(i + 2) & 15] ^ block->l[i & 15],     \\\n                          1))\n#define R0(v, w, x, y, z, i)                                          \\\n  z += ((w & (x ^ y)) ^ y) + blk0(block, i) + 0x5A827999 + rol(v, 5); \\\n  w = rol(w, 30);\n#define R1(v, w, x, y, z, i)                                  \\\n  z += ((w & (x ^ y)) ^ y) + blk(i) + 0x5A827999 + rol(v, 5); \\\n  w = rol(w, 30);\n#define R2(v, w, x, y, z, i)                          \\\n  z += (w ^ x ^ y) + blk(i) + 0x6ED9EBA1 + rol(v, 5); \\\n  w = rol(w, 30);\n#define R3(v, w, x, y, z, i)                                        \\\n  z += (((w | x) & y) | (w & x)) + blk(i) + 0x8F1BBCDC + rol(v, 5); \\\n  w = rol(w, 30);\n#define R4(v, w, x, y, z, i)                          \\\n  z += (w ^ x ^ y) + blk(i) + 0xCA62C1D6 + rol(v, 5); \\\n  w = rol(w, 30);\n\nstatic void mg_sha1_transform(uint32_t state[5],\n                              const unsigned char *buffer) {\n  uint32_t a, b, c, d, e;\n  union char64long16 block[1];\n\n  memcpy(block, buffer, 64);\n  a = state[0];\n  b = state[1];\n  c = state[2];\n  d = state[3];\n  e = state[4];\n  R0(a, b, c, d, e, 0);\n  R0(e, a, b, c, d, 1);\n  R0(d, e, a, b, c, 2);\n  R0(c, d, e, a, b, 3);\n  R0(b, c, d, e, a, 4);\n  R0(a, b, c, d, e, 5);\n  R0(e, a, b, c, d, 6);\n  R0(d, e, a, b, c, 7);\n  R0(c, d, e, a, b, 8);\n  R0(b, c, d, e, a, 9);\n  R0(a, b, c, d, e, 10);\n  R0(e, a, b, c, d, 11);\n  R0(d, e, a, b, c, 12);\n  R0(c, d, e, a, b, 13);\n  R0(b, c, d, e, a, 14);\n  R0(a, b, c, d, e, 15);\n  R1(e, a, b, c, d, 16);\n  R1(d, e, a, b, c, 17);\n  R1(c, d, e, a, b, 18);\n  R1(b, c, d, e, a, 19);\n  R2(a, b, c, d, e, 20);\n  R2(e, a, b, c, d, 21);\n  R2(d, e, a, b, c, 22);\n  R2(c, d, e, a, b, 23);\n  R2(b, c, d, e, a, 24);\n  R2(a, b, c, d, e, 25);\n  R2(e, a, b, c, d, 26);\n  R2(d, e, a, b, c, 27);\n  R2(c, d, e, a, b, 28);\n  R2(b, c, d, e, a, 29);\n  R2(a, b, c, d, e, 30);\n  R2(e, a, b, c, d, 31);\n  R2(d, e, a, b, c, 32);\n  R2(c, d, e, a, b, 33);\n  R2(b, c, d, e, a, 34);\n  R2(a, b, c, d, e, 35);\n  R2(e, a, b, c, d, 36);\n  R2(d, e, a, b, c, 37);\n  R2(c, d, e, a, b, 38);\n  R2(b, c, d, e, a, 39);\n  R3(a, b, c, d, e, 40);\n  R3(e, a, b, c, d, 41);\n  R3(d, e, a, b, c, 42);\n  R3(c, d, e, a, b, 43);\n  R3(b, c, d, e, a, 44);\n  R3(a, b, c, d, e, 45);\n  R3(e, a, b, c, d, 46);\n  R3(d, e, a, b, c, 47);\n  R3(c, d, e, a, b, 48);\n  R3(b, c, d, e, a, 49);\n  R3(a, b, c, d, e, 50);\n  R3(e, a, b, c, d, 51);\n  R3(d, e, a, b, c, 52);\n  R3(c, d, e, a, b, 53);\n  R3(b, c, d, e, a, 54);\n  R3(a, b, c, d, e, 55);\n  R3(e, a, b, c, d, 56);\n  R3(d, e, a, b, c, 57);\n  R3(c, d, e, a, b, 58);\n  R3(b, c, d, e, a, 59);\n  R4(a, b, c, d, e, 60);\n  R4(e, a, b, c, d, 61);\n  R4(d, e, a, b, c, 62);\n  R4(c, d, e, a, b, 63);\n  R4(b, c, d, e, a, 64);\n  R4(a, b, c, d, e, 65);\n  R4(e, a, b, c, d, 66);\n  R4(d, e, a, b, c, 67);\n  R4(c, d, e, a, b, 68);\n  R4(b, c, d, e, a, 69);\n  R4(a, b, c, d, e, 70);\n  R4(e, a, b, c, d, 71);\n  R4(d, e, a, b, c, 72);\n  R4(c, d, e, a, b, 73);\n  R4(b, c, d, e, a, 74);\n  R4(a, b, c, d, e, 75);\n  R4(e, a, b, c, d, 76);\n  R4(d, e, a, b, c, 77);\n  R4(c, d, e, a, b, 78);\n  R4(b, c, d, e, a, 79);\n  state[0] += a;\n  state[1] += b;\n  state[2] += c;\n  state[3] += d;\n  state[4] += e;\n  /* Erase working structures. The order of operations is important,\n   * used to ensure that compiler doesn't optimize those out. */\n  memset(block, 0, sizeof(block));\n  a = b = c = d = e = 0;\n  (void) a;\n  (void) b;\n  (void) c;\n  (void) d;\n  (void) e;\n}\n\nvoid mg_sha1_init(mg_sha1_ctx *context) {\n  context->state[0] = 0x67452301;\n  context->state[1] = 0xEFCDAB89;\n  context->state[2] = 0x98BADCFE;\n  context->state[3] = 0x10325476;\n  context->state[4] = 0xC3D2E1F0;\n  context->count[0] = context->count[1] = 0;\n}\n\nvoid mg_sha1_update(mg_sha1_ctx *context, const unsigned char *data,\n                    size_t len) {\n  size_t i, j;\n\n  j = context->count[0];\n  if ((context->count[0] += (uint32_t) len << 3) < j) context->count[1]++;\n  context->count[1] += (uint32_t) (len >> 29);\n  j = (j >> 3) & 63;\n  if ((j + len) > 63) {\n    memcpy(&context->buffer[j], data, (i = 64 - j));\n    mg_sha1_transform(context->state, context->buffer);\n    for (; i + 63 < len; i += 64) {\n      mg_sha1_transform(context->state, &data[i]);\n    }\n    j = 0;\n  } else\n    i = 0;\n  memcpy(&context->buffer[j], &data[i], len - i);\n}\n\nvoid mg_sha1_final(unsigned char digest[20], mg_sha1_ctx *context) {\n  unsigned i;\n  unsigned char finalcount[8], c;\n\n  for (i = 0; i < 8; i++) {\n    finalcount[i] = (unsigned char) ((context->count[(i >= 4 ? 0 : 1)] >>\n                                      ((3 - (i & 3)) * 8)) &\n                                     255);\n  }\n  c = 0200;\n  mg_sha1_update(context, &c, 1);\n  while ((context->count[0] & 504) != 448) {\n    c = 0000;\n    mg_sha1_update(context, &c, 1);\n  }\n  mg_sha1_update(context, finalcount, 8);\n  for (i = 0; i < 20; i++) {\n    digest[i] =\n        (unsigned char) ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255);\n  }\n  memset(context, '\\0', sizeof(*context));\n  memset(&finalcount, '\\0', sizeof(finalcount));\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/sha256.c\"\n#endif\n// https://github.com/B-Con/crypto-algorithms\n// Author:     Brad Conte (brad AT bradconte.com)\n// Disclaimer: This code is presented \"as is\" without any guarantees.\n// Details:    Defines the API for the corresponding SHA1 implementation.\n// Copyright:  public domain\n\n\n\n#define ror(x, n) (((x) >> (n)) | ((x) << (32 - (n))))\n#define ch(x, y, z) (((x) & (y)) ^ (~(x) & (z)))\n#define maj(x, y, z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))\n#define ep0(x) (ror(x, 2) ^ ror(x, 13) ^ ror(x, 22))\n#define ep1(x) (ror(x, 6) ^ ror(x, 11) ^ ror(x, 25))\n#define sig0(x) (ror(x, 7) ^ ror(x, 18) ^ ((x) >> 3))\n#define sig1(x) (ror(x, 17) ^ ror(x, 19) ^ ((x) >> 10))\n\nstatic const uint32_t mg_sha256_k[64] = {\n    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,\n    0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n    0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,\n    0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n    0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n    0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,\n    0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,\n    0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n    0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2};\n\nvoid mg_sha256_init(mg_sha256_ctx *ctx) {\n  ctx->len = 0;\n  ctx->bits = 0;\n  ctx->state[0] = 0x6a09e667;\n  ctx->state[1] = 0xbb67ae85;\n  ctx->state[2] = 0x3c6ef372;\n  ctx->state[3] = 0xa54ff53a;\n  ctx->state[4] = 0x510e527f;\n  ctx->state[5] = 0x9b05688c;\n  ctx->state[6] = 0x1f83d9ab;\n  ctx->state[7] = 0x5be0cd19;\n}\n\nstatic void mg_sha256_chunk(mg_sha256_ctx *ctx) {\n  int i, j;\n  uint32_t a, b, c, d, e, f, g, h;\n  uint32_t m[64];\n  for (i = 0, j = 0; i < 16; ++i, j += 4)\n    m[i] = (uint32_t) (((uint32_t) ctx->buffer[j] << 24) |\n                       ((uint32_t) ctx->buffer[j + 1] << 16) |\n                       ((uint32_t) ctx->buffer[j + 2] << 8) |\n                       ((uint32_t) ctx->buffer[j + 3]));\n  for (; i < 64; ++i)\n    m[i] = sig1(m[i - 2]) + m[i - 7] + sig0(m[i - 15]) + m[i - 16];\n\n  a = ctx->state[0];\n  b = ctx->state[1];\n  c = ctx->state[2];\n  d = ctx->state[3];\n  e = ctx->state[4];\n  f = ctx->state[5];\n  g = ctx->state[6];\n  h = ctx->state[7];\n\n  for (i = 0; i < 64; ++i) {\n    uint32_t t1 = h + ep1(e) + ch(e, f, g) + mg_sha256_k[i] + m[i];\n    uint32_t t2 = ep0(a) + maj(a, b, c);\n    h = g;\n    g = f;\n    f = e;\n    e = d + t1;\n    d = c;\n    c = b;\n    b = a;\n    a = t1 + t2;\n  }\n\n  ctx->state[0] += a;\n  ctx->state[1] += b;\n  ctx->state[2] += c;\n  ctx->state[3] += d;\n  ctx->state[4] += e;\n  ctx->state[5] += f;\n  ctx->state[6] += g;\n  ctx->state[7] += h;\n}\n\nvoid mg_sha256_update(mg_sha256_ctx *ctx, const unsigned char *data,\n                      size_t len) {\n  size_t i;\n  for (i = 0; i < len; i++) {\n    ctx->buffer[ctx->len] = data[i];\n    if ((++ctx->len) == 64) {\n      mg_sha256_chunk(ctx);\n      ctx->bits += 512;\n      ctx->len = 0;\n    }\n  }\n}\n\n// TODO: make final reusable (remove side effects)\nvoid mg_sha256_final(unsigned char digest[32], mg_sha256_ctx *ctx) {\n  uint32_t i = ctx->len;\n  if (i < 56) {\n    ctx->buffer[i++] = 0x80;\n    while (i < 56) {\n      ctx->buffer[i++] = 0x00;\n    }\n  } else {\n    ctx->buffer[i++] = 0x80;\n    while (i < 64) {\n      ctx->buffer[i++] = 0x00;\n    }\n    mg_sha256_chunk(ctx);\n    memset(ctx->buffer, 0, 56);\n  }\n\n  ctx->bits += ctx->len * 8;\n  ctx->buffer[63] = (uint8_t) ((ctx->bits) & 0xff);\n  ctx->buffer[62] = (uint8_t) ((ctx->bits >> 8) & 0xff);\n  ctx->buffer[61] = (uint8_t) ((ctx->bits >> 16) & 0xff);\n  ctx->buffer[60] = (uint8_t) ((ctx->bits >> 24) & 0xff);\n  ctx->buffer[59] = (uint8_t) ((ctx->bits >> 32) & 0xff);\n  ctx->buffer[58] = (uint8_t) ((ctx->bits >> 40) & 0xff);\n  ctx->buffer[57] = (uint8_t) ((ctx->bits >> 48) & 0xff);\n  ctx->buffer[56] = (uint8_t) ((ctx->bits >> 56) & 0xff);\n  mg_sha256_chunk(ctx);\n\n  for (i = 0; i < 4; ++i) {\n    digest[i] = (uint8_t) ((ctx->state[0] >> (24 - i * 8)) & 0xff);\n    digest[i + 4] = (uint8_t) ((ctx->state[1] >> (24 - i * 8)) & 0xff);\n    digest[i + 8] = (uint8_t) ((ctx->state[2] >> (24 - i * 8)) & 0xff);\n    digest[i + 12] = (uint8_t) ((ctx->state[3] >> (24 - i * 8)) & 0xff);\n    digest[i + 16] = (uint8_t) ((ctx->state[4] >> (24 - i * 8)) & 0xff);\n    digest[i + 20] = (uint8_t) ((ctx->state[5] >> (24 - i * 8)) & 0xff);\n    digest[i + 24] = (uint8_t) ((ctx->state[6] >> (24 - i * 8)) & 0xff);\n    digest[i + 28] = (uint8_t) ((ctx->state[7] >> (24 - i * 8)) & 0xff);\n  }\n}\n\nvoid mg_hmac_sha256(uint8_t dst[32], uint8_t *key, size_t keysz, uint8_t *data,\n                    size_t datasz) {\n  mg_sha256_ctx ctx;\n  uint8_t k[64] = {0};\n  uint8_t o_pad[64], i_pad[64];\n  unsigned int i;\n  memset(i_pad, 0x36, sizeof(i_pad));\n  memset(o_pad, 0x5c, sizeof(o_pad));\n  if (keysz < 64) {\n    if (keysz > 0) memmove(k, key, keysz);\n  } else {\n    mg_sha256_init(&ctx);\n    mg_sha256_update(&ctx, key, keysz);\n    mg_sha256_final(k, &ctx);\n  }\n  for (i = 0; i < sizeof(k); i++) {\n    i_pad[i] ^= k[i];\n    o_pad[i] ^= k[i];\n  }\n  mg_sha256_init(&ctx);\n  mg_sha256_update(&ctx, i_pad, sizeof(i_pad));\n  mg_sha256_update(&ctx, data, datasz);\n  mg_sha256_final(dst, &ctx);\n  mg_sha256_init(&ctx);\n  mg_sha256_update(&ctx, o_pad, sizeof(o_pad));\n  mg_sha256_update(&ctx, dst, 32);\n  mg_sha256_final(dst, &ctx);\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/sntp.c\"\n#endif\n\n\n\n\n\n\n#define SNTP_TIME_OFFSET 2208988800U  // (1970 - 1900) in seconds\n#define SNTP_MAX_FRAC 4294967295.0    // 2 ** 32 - 1\n\nstatic uint64_t s_boot_timestamp = 0;  // Updated by SNTP\n\nuint64_t mg_now(void) {\n  return mg_millis() + s_boot_timestamp;\n}\n\nstatic int64_t gettimestamp(const uint32_t *data) {\n  uint32_t sec = mg_ntohl(data[0]), frac = mg_ntohl(data[1]);\n  if (sec) sec -= SNTP_TIME_OFFSET;\n  return ((int64_t) sec) * 1000 + (int64_t) (frac / SNTP_MAX_FRAC * 1000.0);\n}\n\nint64_t mg_sntp_parse(const unsigned char *buf, size_t len) {\n  int64_t epoch_milliseconds = -1;\n  int mode = len > 0 ? buf[0] & 7 : 0;\n  int version = len > 0 ? (buf[0] >> 3) & 7 : 0;\n  if (len < 48) {\n    MG_ERROR((\"%s\", \"corrupt packet\"));\n  } else if (mode != 4 && mode != 5) {\n    MG_ERROR((\"%s\", \"not a server reply\"));\n  } else if (buf[1] == 0) {\n    MG_ERROR((\"%s\", \"server sent a kiss of death\"));\n  } else if (version == 4 || version == 3) {\n    // int64_t ref = gettimestamp((uint32_t *) &buf[16]);\n    int64_t origin_time = gettimestamp((uint32_t *) &buf[24]);\n    int64_t receive_time = gettimestamp((uint32_t *) &buf[32]);\n    int64_t transmit_time = gettimestamp((uint32_t *) &buf[40]);\n    int64_t now = (int64_t) mg_millis();\n    int64_t latency = (now - origin_time) - (transmit_time - receive_time);\n    epoch_milliseconds = transmit_time + latency / 2;\n    s_boot_timestamp = (uint64_t) (epoch_milliseconds - now);\n  } else {\n    MG_ERROR((\"unexpected version: %d\", version));\n  }\n  return epoch_milliseconds;\n}\n\nstatic void sntp_cb(struct mg_connection *c, int ev, void *ev_data) {\n  uint64_t *expiration_time = (uint64_t *) c->data;\n  if (ev == MG_EV_OPEN) {\n    *expiration_time = mg_millis() + 3000;  // Store expiration time in 3s\n  } else if (ev == MG_EV_CONNECT) {\n    mg_sntp_request(c);\n  } else if (ev == MG_EV_READ) {\n    int64_t milliseconds = mg_sntp_parse(c->recv.buf, c->recv.len);\n    if (milliseconds > 0) {\n      s_boot_timestamp = (uint64_t) milliseconds - mg_millis();\n      mg_call(c, MG_EV_SNTP_TIME, (uint64_t *) &milliseconds);\n      MG_DEBUG((\"%lu got time: %lld ms from epoch\", c->id, milliseconds));\n    }\n    // mg_iobuf_del(&c->recv, 0, c->recv.len);  // Free receive buffer\n    c->is_closing = 1;\n  } else if (ev == MG_EV_POLL) {\n    if (mg_millis() > *expiration_time) c->is_closing = 1;\n  } else if (ev == MG_EV_CLOSE) {\n  }\n  (void) ev_data;\n}\n\nvoid mg_sntp_request(struct mg_connection *c) {\n  if (c->is_resolving) {\n    MG_ERROR((\"%lu wait until resolved\", c->id));\n  } else {\n    int64_t now = (int64_t) mg_millis();  // Use int64_t, for vc98\n    uint8_t buf[48] = {0};\n    uint32_t *t = (uint32_t *) &buf[40];\n    double frac = ((double) (now % 1000)) / 1000.0 * SNTP_MAX_FRAC;\n    buf[0] = (0 << 6) | (4 << 3) | 3;\n    t[0] = mg_htonl((uint32_t) (now / 1000) + SNTP_TIME_OFFSET);\n    t[1] = mg_htonl((uint32_t) frac);\n    mg_send(c, buf, sizeof(buf));\n  }\n}\n\nstruct mg_connection *mg_sntp_connect(struct mg_mgr *mgr, const char *url,\n                                      mg_event_handler_t fn, void *fnd) {\n  struct mg_connection *c = NULL;\n  if (url == NULL) url = \"udp://time.google.com:123\";\n  if ((c = mg_connect(mgr, url, fn, fnd)) != NULL) {\n    c->pfn = sntp_cb;\n    sntp_cb(c, MG_EV_OPEN, (void *) url);\n  }\n  return c;\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/sock.c\"\n#endif\n\n\n\n\n\n\n\n\n\n\n\n#if MG_ENABLE_SOCKET\n\n#ifndef closesocket\n#define closesocket(x) close(x)\n#endif\n\n#define FD(c_) ((MG_SOCKET_TYPE) (size_t) (c_)->fd)\n#define S2PTR(s_) ((void *) (size_t) (s_))\n\n#ifndef MSG_NONBLOCKING\n#define MSG_NONBLOCKING 0\n#endif\n\n#ifndef AF_INET6\n#define AF_INET6 10\n#endif\n\n#ifndef MG_SOCK_ERR\n#define MG_SOCK_ERR(errcode) ((errcode) < 0 ? errno : 0)\n#endif\n\n#ifndef MG_SOCK_INTR\n#define MG_SOCK_INTR(fd) (fd == MG_INVALID_SOCKET && MG_SOCK_ERR(-1) == EINTR)\n#endif\n\n#ifndef MG_SOCK_PENDING\n#define MG_SOCK_PENDING(errcode) \\\n  (((errcode) < 0) && (errno == EINPROGRESS || errno == EWOULDBLOCK))\n#endif\n\n#ifndef MG_SOCK_RESET\n#define MG_SOCK_RESET(errcode) \\\n  (((errcode) < 0) && (errno == EPIPE || errno == ECONNRESET))\n#endif\n\nunion usa {\n  struct sockaddr sa;\n  struct sockaddr_in sin;\n#if MG_ENABLE_IPV6\n  struct sockaddr_in6 sin6;\n#endif\n};\n\nstatic socklen_t tousa(struct mg_addr *a, union usa *usa) {\n  socklen_t len = sizeof(usa->sin);\n  memset(usa, 0, sizeof(*usa));\n  usa->sin.sin_family = AF_INET;\n  usa->sin.sin_port = a->port;\n  memcpy(&usa->sin.sin_addr, a->ip, sizeof(uint32_t));\n#if MG_ENABLE_IPV6\n  if (a->is_ip6) {\n    usa->sin.sin_family = AF_INET6;\n    usa->sin6.sin6_port = a->port;\n    usa->sin6.sin6_scope_id = a->scope_id;\n    memcpy(&usa->sin6.sin6_addr, a->ip, sizeof(a->ip));\n    len = sizeof(usa->sin6);\n  }\n#endif\n  return len;\n}\n\nstatic void tomgaddr(union usa *usa, struct mg_addr *a, bool is_ip6) {\n  a->is_ip6 = is_ip6;\n  a->port = usa->sin.sin_port;\n  memcpy(&a->ip, &usa->sin.sin_addr, sizeof(uint32_t));\n#if MG_ENABLE_IPV6\n  if (is_ip6) {\n    memcpy(a->ip, &usa->sin6.sin6_addr, sizeof(a->ip));\n    a->port = usa->sin6.sin6_port;\n    a->scope_id = (uint8_t) usa->sin6.sin6_scope_id;\n  }\n#endif\n}\n\nstatic void setlocaddr(MG_SOCKET_TYPE fd, struct mg_addr *addr) {\n  union usa usa;\n  socklen_t n = sizeof(usa);\n  if (getsockname(fd, &usa.sa, &n) == 0) {\n    tomgaddr(&usa, addr, n != sizeof(usa.sin));\n  }\n}\n\nstatic void iolog(struct mg_connection *c, char *buf, long n, bool r) {\n  if (n == MG_IO_WAIT) {\n    // Do nothing\n  } else if (n <= 0) {\n    c->is_closing = 1;  // Termination. Don't call mg_error(): #1529\n  } else if (n > 0) {\n    if (c->is_hexdumping) {\n      MG_INFO((\"\\n-- %lu %M %s %M %ld\", c->id, mg_print_ip_port, &c->loc,\n               r ? \"<-\" : \"->\", mg_print_ip_port, &c->rem, n));\n      mg_hexdump(buf, (size_t) n);\n    }\n    if (r) {\n      c->recv.len += (size_t) n;\n      mg_call(c, MG_EV_READ, &n);\n    } else {\n      mg_iobuf_del(&c->send, 0, (size_t) n);\n      // if (c->send.len == 0) mg_iobuf_resize(&c->send, 0);\n      if (c->send.len == 0) {\n        MG_EPOLL_MOD(c, 0);\n      }\n      mg_call(c, MG_EV_WRITE, &n);\n    }\n  }\n}\n\nlong mg_io_send(struct mg_connection *c, const void *buf, size_t len) {\n  long n;\n  if (c->is_udp) {\n    union usa usa;\n    socklen_t slen = tousa(&c->rem, &usa);\n    n = sendto(FD(c), (char *) buf, len, 0, &usa.sa, slen);\n    if (n > 0) setlocaddr(FD(c), &c->loc);\n  } else {\n    n = send(FD(c), (char *) buf, len, MSG_NONBLOCKING);\n  }\n  MG_VERBOSE((\"%lu %ld %d\", c->id, n, MG_SOCK_ERR(n)));\n  if (MG_SOCK_PENDING(n)) return MG_IO_WAIT;\n  if (MG_SOCK_RESET(n)) return MG_IO_RESET;\n  if (n <= 0) return MG_IO_ERR;\n  return n;\n}\n\nbool mg_send(struct mg_connection *c, const void *buf, size_t len) {\n  if (c->is_udp) {\n    long n = mg_io_send(c, buf, len);\n    MG_DEBUG((\"%lu %ld %lu:%lu:%lu %ld err %d\", c->id, c->fd, c->send.len,\n              c->recv.len, c->rtls.len, n, MG_SOCK_ERR(n)));\n    iolog(c, (char *) buf, n, false);\n    return n > 0;\n  } else {\n    return mg_iobuf_add(&c->send, c->send.len, buf, len);\n  }\n}\n\nstatic void mg_set_non_blocking_mode(MG_SOCKET_TYPE fd) {\n#if defined(MG_CUSTOM_NONBLOCK)\n  MG_CUSTOM_NONBLOCK(fd);\n#elif MG_ARCH == MG_ARCH_WIN32 && MG_ENABLE_WINSOCK\n  unsigned long on = 1;\n  ioctlsocket(fd, FIONBIO, &on);\n#elif MG_ENABLE_RL\n  unsigned long on = 1;\n  ioctlsocket(fd, FIONBIO, &on);\n#elif MG_ENABLE_FREERTOS_TCP\n  const BaseType_t off = 0;\n  if (setsockopt(fd, 0, FREERTOS_SO_RCVTIMEO, &off, sizeof(off)) != 0) (void) 0;\n  if (setsockopt(fd, 0, FREERTOS_SO_SNDTIMEO, &off, sizeof(off)) != 0) (void) 0;\n#elif MG_ENABLE_LWIP\n  lwip_fcntl(fd, F_SETFL, O_NONBLOCK);\n#elif MG_ARCH == MG_ARCH_AZURERTOS\n  fcntl(fd, F_SETFL, O_NONBLOCK);\n#elif MG_ARCH == MG_ARCH_TIRTOS\n  int val = 0;\n  setsockopt(fd, SOL_SOCKET, SO_BLOCKING, &val, sizeof(val));\n  // SPRU524J section 3.3.3 page 63, SO_SNDLOWAT\n  int sz = sizeof(val);\n  getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &val, &sz);\n  val /= 2;  // set send low-water mark at half send buffer size\n  setsockopt(fd, SOL_SOCKET, SO_SNDLOWAT, &val, sizeof(val));\n#else\n  fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);  // Non-blocking mode\n  fcntl(fd, F_SETFD, FD_CLOEXEC);                          // Set close-on-exec\n#endif\n}\n\nbool mg_open_listener(struct mg_connection *c, const char *url) {\n  MG_SOCKET_TYPE fd = MG_INVALID_SOCKET;\n  bool success = false;\n  c->loc.port = mg_htons(mg_url_port(url));\n  if (!mg_aton(mg_url_host(url), &c->loc)) {\n    MG_ERROR((\"invalid listening URL: %s\", url));\n  } else {\n    union usa usa;\n    socklen_t slen = tousa(&c->loc, &usa);\n    int rc, on = 1, af = c->loc.is_ip6 ? AF_INET6 : AF_INET;\n    int type = strncmp(url, \"udp:\", 4) == 0 ? SOCK_DGRAM : SOCK_STREAM;\n    int proto = type == SOCK_DGRAM ? IPPROTO_UDP : IPPROTO_TCP;\n    (void) on;\n\n    if ((fd = socket(af, type, proto)) == MG_INVALID_SOCKET) {\n      MG_ERROR((\"socket: %d\", MG_SOCK_ERR(-1)));\n#if defined(SO_EXCLUSIVEADDRUSE)\n    } else if ((rc = setsockopt(fd, SOL_SOCKET, SO_EXCLUSIVEADDRUSE,\n                                (char *) &on, sizeof(on))) != 0) {\n      // \"Using SO_REUSEADDR and SO_EXCLUSIVEADDRUSE\"\n      MG_ERROR((\"setsockopt(SO_EXCLUSIVEADDRUSE): %d %d\", on, MG_SOCK_ERR(rc)));\n#elif defined(SO_REUSEADDR) && (!defined(LWIP_SOCKET) || SO_REUSE)\n    } else if ((rc = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *) &on,\n                                sizeof(on))) != 0) {\n      // 1. SO_REUSEADDR semantics on UNIX and Windows is different.  On\n      // Windows, SO_REUSEADDR allows to bind a socket to a port without error\n      // even if the port is already open by another program. This is not the\n      // behavior SO_REUSEADDR was designed for, and leads to hard-to-track\n      // failure scenarios.\n      //\n      // 2. For LWIP, SO_REUSEADDR should be explicitly enabled by defining\n      // SO_REUSE = 1 in lwipopts.h, otherwise the code below will compile but\n      // won't work! (setsockopt will return EINVAL)\n      MG_ERROR((\"setsockopt(SO_REUSEADDR): %d\", MG_SOCK_ERR(rc)));\n#endif\n#if MG_IPV6_V6ONLY\n      // Bind only to the V6 address, not V4 address on this port\n    } else if (c->loc.is_ip6 &&\n               (rc = setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char *) &on,\n                                sizeof(on))) != 0) {\n      // See #2089. Allow to bind v4 and v6 sockets on the same port\n      MG_ERROR((\"setsockopt(IPV6_V6ONLY): %d\", MG_SOCK_ERR(rc)));\n#endif\n    } else if ((rc = bind(fd, &usa.sa, slen)) != 0) {\n      MG_ERROR((\"bind: %d\", MG_SOCK_ERR(rc)));\n    } else if ((type == SOCK_STREAM &&\n                (rc = listen(fd, MG_SOCK_LISTEN_BACKLOG_SIZE)) != 0)) {\n      // NOTE(lsm): FreeRTOS uses backlog value as a connection limit\n      // In case port was set to 0, get the real port number\n      MG_ERROR((\"listen: %d\", MG_SOCK_ERR(rc)));\n    } else {\n      setlocaddr(fd, &c->loc);\n      mg_set_non_blocking_mode(fd);\n      c->fd = S2PTR(fd);\n      MG_EPOLL_ADD(c);\n      success = true;\n    }\n  }\n  if (success == false && fd != MG_INVALID_SOCKET) closesocket(fd);\n  return success;\n}\n\nstatic long recv_raw(struct mg_connection *c, void *buf, size_t len) {\n  long n = 0;\n  if (c->is_udp) {\n    union usa usa;\n    socklen_t slen = tousa(&c->rem, &usa);\n    n = recvfrom(FD(c), (char *) buf, len, 0, &usa.sa, &slen);\n    if (n > 0) tomgaddr(&usa, &c->rem, slen != sizeof(usa.sin));\n  } else {\n    n = recv(FD(c), (char *) buf, len, MSG_NONBLOCKING);\n  }\n  MG_VERBOSE((\"%lu %ld %d\", c->id, n, MG_SOCK_ERR(n)));\n  if (MG_SOCK_PENDING(n)) return MG_IO_WAIT;\n  if (MG_SOCK_RESET(n)) return MG_IO_RESET;\n  if (n <= 0) return MG_IO_ERR;\n  return n;\n}\n\nstatic bool ioalloc(struct mg_connection *c, struct mg_iobuf *io) {\n  bool res = false;\n  if (io->len >= MG_MAX_RECV_SIZE) {\n    mg_error(c, \"MG_MAX_RECV_SIZE\");\n  } else if (io->size <= io->len &&\n             !mg_iobuf_resize(io, io->size + MG_IO_SIZE)) {\n    mg_error(c, \"OOM\");\n  } else {\n    res = true;\n  }\n  return res;\n}\n\n// NOTE(lsm): do only one iteration of reads, cause some systems\n// (e.g. FreeRTOS stack) return 0 instead of -1/EWOULDBLOCK when no data\nstatic void read_conn(struct mg_connection *c) {\n  if (ioalloc(c, &c->recv)) {\n    char *buf = (char *) &c->recv.buf[c->recv.len];\n    size_t len = c->recv.size - c->recv.len;\n    long n = -1;\n    if (c->is_tls) {\n      // Do not read to the raw TLS buffer if it already has enough.\n      // This is to prevent overflowing c->rtls if our reads are slow\n      long m;\n      if (c->rtls.len < 16 * 1024 + 40) {  // TLS record, header, MAC, padding\n        if (!ioalloc(c, &c->rtls)) return;\n        n = recv_raw(c, (char *) &c->rtls.buf[c->rtls.len],\n                     c->rtls.size - c->rtls.len);\n        if (n > 0) c->rtls.len += (size_t) n;\n      }\n      // there can still be > 16K from last iteration, always mg_tls_recv()\n      m = c->is_tls_hs ? (long) MG_IO_WAIT : mg_tls_recv(c, buf, len);\n      if (n == MG_IO_ERR) {\n        if (c->rtls.len == 0 || m < 0) {\n          // Close only when we have fully drained both rtls and TLS buffers\n          c->is_closing = 1;  // or there's nothing we can do about it.\n          m = MG_IO_ERR;\n        } else { // see #2885\n          // TLS buffer is capped to max record size, even though, there can\n          // be more than one record, give TLS a chance to process them.\n        }\n      } else if (c->is_tls_hs) {\n        mg_tls_handshake(c);\n      }\n      n = m;\n    } else {\n      n = recv_raw(c, buf, len);\n    }\n    MG_DEBUG((\"%lu %ld %lu:%lu:%lu %ld err %d\", c->id, c->fd, c->send.len,\n              c->recv.len, c->rtls.len, n, MG_SOCK_ERR(n)));\n    iolog(c, buf, n, true);\n  }\n}\n\nstatic void write_conn(struct mg_connection *c) {\n  char *buf = (char *) c->send.buf;\n  size_t len = c->send.len;\n  long n = c->is_tls ? mg_tls_send(c, buf, len) : mg_io_send(c, buf, len);\n  MG_DEBUG((\"%lu %ld snd %ld/%ld rcv %ld/%ld n=%ld err=%d\", c->id, c->fd,\n            (long) c->send.len, (long) c->send.size, (long) c->recv.len,\n            (long) c->recv.size, n, MG_SOCK_ERR(n)));\n  iolog(c, buf, n, false);\n}\n\nstatic void close_conn(struct mg_connection *c) {\n  if (FD(c) != MG_INVALID_SOCKET) {\n#if MG_ENABLE_EPOLL\n    epoll_ctl(c->mgr->epoll_fd, EPOLL_CTL_DEL, FD(c), NULL);\n#endif\n    closesocket(FD(c));\n#if MG_ENABLE_FREERTOS_TCP\n    FreeRTOS_FD_CLR(c->fd, c->mgr->ss, eSELECT_ALL);\n#endif\n  }\n  mg_close_conn(c);\n}\n\nstatic void connect_conn(struct mg_connection *c) {\n  union usa usa;\n  socklen_t n = sizeof(usa);\n  // Use getpeername() to test whether we have connected\n  if (getpeername(FD(c), &usa.sa, &n) == 0) {\n    c->is_connecting = 0;\n    setlocaddr(FD(c), &c->loc);\n    mg_call(c, MG_EV_CONNECT, NULL);\n    MG_EPOLL_MOD(c, 0);\n    if (c->is_tls_hs) mg_tls_handshake(c);\n  } else {\n    mg_error(c, \"socket error\");\n  }\n}\n\nstatic void setsockopts(struct mg_connection *c) {\n#if MG_ENABLE_FREERTOS_TCP || MG_ARCH == MG_ARCH_AZURERTOS || \\\n    MG_ARCH == MG_ARCH_TIRTOS\n  (void) c;\n#else\n  int on = 1;\n#if !defined(SOL_TCP)\n#define SOL_TCP IPPROTO_TCP\n#endif\n  if (setsockopt(FD(c), SOL_TCP, TCP_NODELAY, (char *) &on, sizeof(on)) != 0)\n    (void) 0;\n  if (setsockopt(FD(c), SOL_SOCKET, SO_KEEPALIVE, (char *) &on, sizeof(on)) !=\n      0)\n    (void) 0;\n#endif\n}\n\nvoid mg_connect_resolved(struct mg_connection *c) {\n  int type = c->is_udp ? SOCK_DGRAM : SOCK_STREAM;\n  int proto = type == SOCK_DGRAM ? IPPROTO_UDP : IPPROTO_TCP;\n  int rc, af = c->rem.is_ip6 ? AF_INET6 : AF_INET;  // c->rem has resolved IP\n  c->fd = S2PTR(socket(af, type, proto));           // Create outbound socket\n  c->is_resolving = 0;                              // Clear resolving flag\n  if (FD(c) == MG_INVALID_SOCKET) {\n    mg_error(c, \"socket(): %d\", MG_SOCK_ERR(-1));\n  } else if (c->is_udp) {\n    MG_EPOLL_ADD(c);\n#if MG_ARCH == MG_ARCH_TIRTOS\n    union usa usa;  // TI-RTOS NDK requires binding to receive on UDP sockets\n    socklen_t slen = tousa(&c->loc, &usa);\n    if ((rc = bind(c->fd, &usa.sa, slen)) != 0)\n      MG_ERROR((\"bind: %d\", MG_SOCK_ERR(rc)));\n#endif\n    setlocaddr(FD(c), &c->loc);\n    mg_call(c, MG_EV_RESOLVE, NULL);\n    mg_call(c, MG_EV_CONNECT, NULL);\n  } else {\n    union usa usa;\n    socklen_t slen = tousa(&c->rem, &usa);\n    mg_set_non_blocking_mode(FD(c));\n    setsockopts(c);\n    MG_EPOLL_ADD(c);\n    mg_call(c, MG_EV_RESOLVE, NULL);\n    rc = connect(FD(c), &usa.sa, slen);  // Attempt to connect\n    if (rc == 0) {                       // Success\n      setlocaddr(FD(c), &c->loc);\n      mg_call(c, MG_EV_CONNECT, NULL);  // Send MG_EV_CONNECT to the user\n    } else if (MG_SOCK_PENDING(rc)) {   // Need to wait for TCP handshake\n      MG_DEBUG((\"%lu %ld -> %M pend\", c->id, c->fd, mg_print_ip_port, &c->rem));\n      c->is_connecting = 1;\n    } else {\n      mg_error(c, \"connect: %d\", MG_SOCK_ERR(rc));\n    }\n  }\n}\n\nstatic MG_SOCKET_TYPE raccept(MG_SOCKET_TYPE sock, union usa *usa,\n                              socklen_t *len) {\n  MG_SOCKET_TYPE fd = MG_INVALID_SOCKET;\n  do {\n    memset(usa, 0, sizeof(*usa));\n    fd = accept(sock, &usa->sa, len);\n  } while (MG_SOCK_INTR(fd));\n  return fd;\n}\n\nstatic void accept_conn(struct mg_mgr *mgr, struct mg_connection *lsn) {\n  struct mg_connection *c = NULL;\n  union usa usa;\n  socklen_t sa_len = sizeof(usa);\n  MG_SOCKET_TYPE fd = raccept(FD(lsn), &usa, &sa_len);\n  if (fd == MG_INVALID_SOCKET) {\n#if MG_ARCH == MG_ARCH_AZURERTOS || defined(__ECOS)\n    // AzureRTOS, in non-block socket mode can mark listening socket readable\n    // even it is not. See comment for 'select' func implementation in\n    // nx_bsd.c That's not an error, just should try later\n    if (errno != EAGAIN)\n#endif\n      MG_ERROR((\"%lu accept failed, errno %d\", lsn->id, MG_SOCK_ERR(-1)));\n#if (MG_ARCH != MG_ARCH_WIN32) && !MG_ENABLE_FREERTOS_TCP && \\\n    (MG_ARCH != MG_ARCH_TIRTOS) && !MG_ENABLE_POLL && !MG_ENABLE_EPOLL\n  } else if ((long) fd >= FD_SETSIZE) {\n    MG_ERROR((\"%ld > %ld\", (long) fd, (long) FD_SETSIZE));\n    closesocket(fd);\n#endif\n  } else if ((c = mg_alloc_conn(mgr)) == NULL) {\n    MG_ERROR((\"%lu OOM\", lsn->id));\n    closesocket(fd);\n  } else {\n    tomgaddr(&usa, &c->rem, sa_len != sizeof(usa.sin));\n    LIST_ADD_HEAD(struct mg_connection, &mgr->conns, c);\n    c->fd = S2PTR(fd);\n    MG_EPOLL_ADD(c);\n    mg_set_non_blocking_mode(FD(c));\n    setsockopts(c);\n    c->is_accepted = 1;\n    c->is_hexdumping = lsn->is_hexdumping;\n    c->loc = lsn->loc;\n    c->pfn = lsn->pfn;\n    c->pfn_data = lsn->pfn_data;\n    c->fn = lsn->fn;\n    c->fn_data = lsn->fn_data;\n    MG_DEBUG((\"%lu %ld accepted %M -> %M\", c->id, c->fd, mg_print_ip_port,\n              &c->rem, mg_print_ip_port, &c->loc));\n    mg_call(c, MG_EV_OPEN, NULL);\n    mg_call(c, MG_EV_ACCEPT, NULL);\n  }\n}\n\nstatic bool can_read(const struct mg_connection *c) {\n  return c->is_full == false;\n}\n\nstatic bool can_write(const struct mg_connection *c) {\n  return c->is_connecting || (c->send.len > 0 && c->is_tls_hs == 0);\n}\n\nstatic bool skip_iotest(const struct mg_connection *c) {\n  return (c->is_closing || c->is_resolving || FD(c) == MG_INVALID_SOCKET) ||\n         (can_read(c) == false && can_write(c) == false);\n}\n\nstatic void mg_iotest(struct mg_mgr *mgr, int ms) {\n#if MG_ENABLE_FREERTOS_TCP\n  struct mg_connection *c;\n  for (c = mgr->conns; c != NULL; c = c->next) {\n    c->is_readable = c->is_writable = 0;\n    if (skip_iotest(c)) continue;\n    if (can_read(c))\n      FreeRTOS_FD_SET(c->fd, mgr->ss, eSELECT_READ | eSELECT_EXCEPT);\n    if (can_write(c)) FreeRTOS_FD_SET(c->fd, mgr->ss, eSELECT_WRITE);\n    if (c->is_closing) ms = 1;\n  }\n  FreeRTOS_select(mgr->ss, pdMS_TO_TICKS(ms));\n  for (c = mgr->conns; c != NULL; c = c->next) {\n    EventBits_t bits = FreeRTOS_FD_ISSET(c->fd, mgr->ss);\n    c->is_readable = bits & (eSELECT_READ | eSELECT_EXCEPT) ? 1U : 0;\n    c->is_writable = bits & eSELECT_WRITE ? 1U : 0;\n    if (c->fd != MG_INVALID_SOCKET)\n      FreeRTOS_FD_CLR(c->fd, mgr->ss,\n                      eSELECT_READ | eSELECT_EXCEPT | eSELECT_WRITE);\n  }\n#elif MG_ENABLE_EPOLL\n  size_t max = 1;\n  for (struct mg_connection *c = mgr->conns; c != NULL; c = c->next) {\n    c->is_readable = c->is_writable = 0;\n    if (c->rtls.len > 0 || mg_tls_pending(c) > 0) ms = 1, c->is_readable = 1;\n    if (can_write(c)) MG_EPOLL_MOD(c, 1);\n    if (c->is_closing) ms = 1;\n    max++;\n  }\n  struct epoll_event *evs = (struct epoll_event *) alloca(max * sizeof(evs[0]));\n  int n = epoll_wait(mgr->epoll_fd, evs, (int) max, ms);\n  for (int i = 0; i < n; i++) {\n    struct mg_connection *c = (struct mg_connection *) evs[i].data.ptr;\n    if (evs[i].events & EPOLLERR) {\n      mg_error(c, \"socket error\");\n    } else if (c->is_readable == 0) {\n      bool rd = evs[i].events & (EPOLLIN | EPOLLHUP);\n      bool wr = evs[i].events & EPOLLOUT;\n      c->is_readable = can_read(c) && rd ? 1U : 0;\n      c->is_writable = can_write(c) && wr ? 1U : 0;\n      if (c->rtls.len > 0 || mg_tls_pending(c) > 0) c->is_readable = 1;\n    }\n  }\n  (void) skip_iotest;\n#elif MG_ENABLE_POLL\n  nfds_t n = 0;\n  for (struct mg_connection *c = mgr->conns; c != NULL; c = c->next) n++;\n  struct pollfd *fds = (struct pollfd *) alloca(n * sizeof(fds[0]));\n  memset(fds, 0, n * sizeof(fds[0]));\n  n = 0;\n  for (struct mg_connection *c = mgr->conns; c != NULL; c = c->next) {\n    c->is_readable = c->is_writable = 0;\n    if (c->is_closing) ms = 1;\n    if (skip_iotest(c)) {\n      // Socket not valid, ignore\n    } else {\n      // Don't wait if TLS is ready\n      if (c->rtls.len > 0 || mg_tls_pending(c) > 0) ms = 1;\n      fds[n].fd = FD(c);\n      if (can_read(c)) fds[n].events |= POLLIN;\n      if (can_write(c)) fds[n].events |= POLLOUT;\n      n++;\n    }\n  }\n\n  // MG_INFO((\"poll n=%d ms=%d\", (int) n, ms));\n  if (poll(fds, n, ms) < 0) {\n#if MG_ARCH == MG_ARCH_WIN32\n    if (n == 0) Sleep(ms);  // On Windows, poll fails if no sockets\n#endif\n    memset(fds, 0, n * sizeof(fds[0]));\n  }\n  n = 0;\n  for (struct mg_connection *c = mgr->conns; c != NULL; c = c->next) {\n    if (skip_iotest(c)) {\n      // Socket not valid, ignore\n    } else {\n      if (fds[n].revents & POLLERR) {\n        mg_error(c, \"socket error\");\n      } else {\n        c->is_readable =\n            (unsigned) (fds[n].revents & (POLLIN | POLLHUP) ? 1 : 0);\n        c->is_writable = (unsigned) (fds[n].revents & POLLOUT ? 1 : 0);\n        if (c->rtls.len > 0 || mg_tls_pending(c) > 0) c->is_readable = 1;\n      }\n      n++;\n    }\n  }\n#else\n  struct timeval tv = {ms / 1000, (ms % 1000) * 1000}, tv_zero = {0, 0}, *tvp;\n  struct mg_connection *c;\n  fd_set rset, wset, eset;\n  MG_SOCKET_TYPE maxfd = 0;\n  int rc;\n\n  FD_ZERO(&rset);\n  FD_ZERO(&wset);\n  FD_ZERO(&eset);\n  tvp = ms < 0 ? NULL : &tv;\n  for (c = mgr->conns; c != NULL; c = c->next) {\n    c->is_readable = c->is_writable = 0;\n    if (skip_iotest(c)) continue;\n    FD_SET(FD(c), &eset);\n    if (can_read(c)) FD_SET(FD(c), &rset);\n    if (can_write(c)) FD_SET(FD(c), &wset);\n    if (c->rtls.len > 0 || mg_tls_pending(c) > 0) tvp = &tv_zero;\n    if (FD(c) > maxfd) maxfd = FD(c);\n    if (c->is_closing) tvp = &tv_zero;\n  }\n\n  if ((rc = select((int) maxfd + 1, &rset, &wset, &eset, tvp)) < 0) {\n#if MG_ARCH == MG_ARCH_WIN32\n    if (maxfd == 0) Sleep(ms);  // On Windows, select fails if no sockets\n#else\n    MG_ERROR((\"select: %d %d\", rc, MG_SOCK_ERR(rc)));\n#endif\n    FD_ZERO(&rset);\n    FD_ZERO(&wset);\n    FD_ZERO(&eset);\n  }\n\n  for (c = mgr->conns; c != NULL; c = c->next) {\n    if (FD(c) != MG_INVALID_SOCKET && FD_ISSET(FD(c), &eset)) {\n      mg_error(c, \"socket error\");\n    } else {\n      c->is_readable = FD(c) != MG_INVALID_SOCKET && FD_ISSET(FD(c), &rset);\n      c->is_writable = FD(c) != MG_INVALID_SOCKET && FD_ISSET(FD(c), &wset);\n      if (c->rtls.len > 0 || mg_tls_pending(c) > 0) c->is_readable = 1;\n    }\n  }\n#endif\n}\n\nstatic bool mg_socketpair(MG_SOCKET_TYPE sp[2], union usa usa[2]) {\n  socklen_t n = sizeof(usa[0].sin);\n  bool success = false;\n\n  sp[0] = sp[1] = MG_INVALID_SOCKET;\n  (void) memset(&usa[0], 0, sizeof(usa[0]));\n  usa[0].sin.sin_family = AF_INET;\n  *(uint32_t *) &usa->sin.sin_addr = mg_htonl(0x7f000001U);  // 127.0.0.1\n  usa[1] = usa[0];\n\n  if ((sp[0] = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) != MG_INVALID_SOCKET &&\n      (sp[1] = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) != MG_INVALID_SOCKET &&\n      bind(sp[0], &usa[0].sa, n) == 0 &&          //\n      bind(sp[1], &usa[1].sa, n) == 0 &&          //\n      getsockname(sp[0], &usa[0].sa, &n) == 0 &&  //\n      getsockname(sp[1], &usa[1].sa, &n) == 0 &&  //\n      connect(sp[0], &usa[1].sa, n) == 0 &&       //\n      connect(sp[1], &usa[0].sa, n) == 0) {       //\n    success = true;\n  }\n  if (!success) {\n    if (sp[0] != MG_INVALID_SOCKET) closesocket(sp[0]);\n    if (sp[1] != MG_INVALID_SOCKET) closesocket(sp[1]);\n    sp[0] = sp[1] = MG_INVALID_SOCKET;\n  }\n  return success;\n}\n\n// mg_wakeup() event handler\nstatic void wufn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_READ) {\n    unsigned long *id = (unsigned long *) c->recv.buf;\n    // MG_INFO((\"Got data\"));\n    // mg_hexdump(c->recv.buf, c->recv.len);\n    if (c->recv.len >= sizeof(*id)) {\n      struct mg_connection *t;\n      for (t = c->mgr->conns; t != NULL; t = t->next) {\n        if (t->id == *id) {\n          struct mg_str data = mg_str_n((char *) c->recv.buf + sizeof(*id),\n                                        c->recv.len - sizeof(*id));\n          mg_call(t, MG_EV_WAKEUP, &data);\n        }\n      }\n    }\n    c->recv.len = 0;  // Consume received data\n  } else if (ev == MG_EV_CLOSE) {\n    closesocket(c->mgr->pipe);         // When we're closing, close the other\n    c->mgr->pipe = MG_INVALID_SOCKET;  // side of the socketpair, too\n  }\n  (void) ev_data;\n}\n\nbool mg_wakeup_init(struct mg_mgr *mgr) {\n  bool ok = false;\n  if (mgr->pipe == MG_INVALID_SOCKET) {\n    union usa usa[2];\n    MG_SOCKET_TYPE sp[2] = {MG_INVALID_SOCKET, MG_INVALID_SOCKET};\n    struct mg_connection *c = NULL;\n    if (!mg_socketpair(sp, usa)) {\n      MG_ERROR((\"Cannot create socket pair\"));\n    } else if ((c = mg_wrapfd(mgr, (int) sp[1], wufn, NULL)) == NULL) {\n      closesocket(sp[0]);\n      closesocket(sp[1]);\n      sp[0] = sp[1] = MG_INVALID_SOCKET;\n    } else {\n      tomgaddr(&usa[0], &c->rem, false);\n      MG_DEBUG((\"%lu %p pipe %lu\", c->id, c->fd, (unsigned long) sp[0]));\n      mgr->pipe = sp[0];\n      ok = true;\n    }\n  }\n  return ok;\n}\n\nbool mg_wakeup(struct mg_mgr *mgr, unsigned long conn_id, const void *buf,\n               size_t len) {\n  if (mgr->pipe != MG_INVALID_SOCKET && conn_id > 0) {\n    char *extended_buf = (char *) alloca(len + sizeof(conn_id));\n    memcpy(extended_buf, &conn_id, sizeof(conn_id));\n    memcpy(extended_buf + sizeof(conn_id), buf, len);\n    send(mgr->pipe, extended_buf, len + sizeof(conn_id), MSG_NONBLOCKING);\n    return true;\n  }\n  return false;\n}\n\nvoid mg_mgr_poll(struct mg_mgr *mgr, int ms) {\n  struct mg_connection *c, *tmp;\n  uint64_t now;\n\n  mg_iotest(mgr, ms);\n  now = mg_millis();\n  mg_timer_poll(&mgr->timers, now);\n\n  for (c = mgr->conns; c != NULL; c = tmp) {\n    bool is_resp = c->is_resp;\n    tmp = c->next;\n    mg_call(c, MG_EV_POLL, &now);\n    if (is_resp && !c->is_resp) {\n      long n = 0;\n      mg_call(c, MG_EV_READ, &n);\n    }\n    MG_VERBOSE((\"%lu %c%c %c%c%c%c%c %lu %lu\", c->id,\n                c->is_readable ? 'r' : '-', c->is_writable ? 'w' : '-',\n                c->is_tls ? 'T' : 't', c->is_connecting ? 'C' : 'c',\n                c->is_tls_hs ? 'H' : 'h', c->is_resolving ? 'R' : 'r',\n                c->is_closing ? 'C' : 'c', mg_tls_pending(c), c->rtls.len));\n    if (c->is_resolving || c->is_closing) {\n      // Do nothing\n    } else if (c->is_listening && c->is_udp == 0) {\n      if (c->is_readable) accept_conn(mgr, c);\n    } else if (c->is_connecting) {\n      if (c->is_readable || c->is_writable) connect_conn(c);\n      //} else if (c->is_tls_hs) {\n      //  if ((c->is_readable || c->is_writable)) mg_tls_handshake(c);\n    } else {\n      if (c->is_readable) read_conn(c);\n      if (c->is_writable) write_conn(c);\n    }\n\n    if (c->is_draining && c->send.len == 0) c->is_closing = 1;\n    if (c->is_closing) close_conn(c);\n  }\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ssi.c\"\n#endif\n\n\n\n\n#ifndef MG_MAX_SSI_DEPTH\n#define MG_MAX_SSI_DEPTH 5\n#endif\n\n#ifndef MG_SSI_BUFSIZ\n#define MG_SSI_BUFSIZ 1024\n#endif\n\n#if MG_ENABLE_SSI\nstatic char *mg_ssi(const char *path, const char *root, int depth) {\n  struct mg_iobuf b = {NULL, 0, 0, MG_IO_SIZE};\n  FILE *fp = fopen(path, \"rb\");\n  if (fp != NULL) {\n    char buf[MG_SSI_BUFSIZ], arg[sizeof(buf)];\n    int ch, intag = 0;\n    size_t len = 0;\n    buf[0] = arg[0] = '\\0';\n    while ((ch = fgetc(fp)) != EOF) {\n      if (intag && ch == '>' && buf[len - 1] == '-' && buf[len - 2] == '-') {\n        buf[len++] = (char) (ch & 0xff);\n        buf[len] = '\\0';\n        if (sscanf(buf, \"<!--#include file=\\\"%[^\\\"]\", arg) > 0) {\n          char tmp[MG_PATH_MAX + MG_SSI_BUFSIZ + 10],\n              *p = (char *) path + strlen(path), *data;\n          while (p > path && p[-1] != MG_DIRSEP && p[-1] != '/') p--;\n          mg_snprintf(tmp, sizeof(tmp), \"%.*s%s\", (int) (p - path), path, arg);\n          if (depth < MG_MAX_SSI_DEPTH &&\n              (data = mg_ssi(tmp, root, depth + 1)) != NULL) {\n            mg_iobuf_add(&b, b.len, data, strlen(data));\n            free(data);\n          } else {\n            MG_ERROR((\"%s: file=%s error or too deep\", path, arg));\n          }\n        } else if (sscanf(buf, \"<!--#include virtual=\\\"%[^\\\"]\", arg) > 0) {\n          char tmp[MG_PATH_MAX + MG_SSI_BUFSIZ + 10], *data;\n          mg_snprintf(tmp, sizeof(tmp), \"%s%s\", root, arg);\n          if (depth < MG_MAX_SSI_DEPTH &&\n              (data = mg_ssi(tmp, root, depth + 1)) != NULL) {\n            mg_iobuf_add(&b, b.len, data, strlen(data));\n            free(data);\n          } else {\n            MG_ERROR((\"%s: virtual=%s error or too deep\", path, arg));\n          }\n        } else {\n          // Unknown SSI tag\n          MG_ERROR((\"Unknown SSI tag: %.*s\", (int) len, buf));\n          mg_iobuf_add(&b, b.len, buf, len);\n        }\n        intag = 0;\n        len = 0;\n      } else if (ch == '<') {\n        intag = 1;\n        if (len > 0) mg_iobuf_add(&b, b.len, buf, len);\n        len = 0;\n        buf[len++] = (char) (ch & 0xff);\n      } else if (intag) {\n        if (len == 5 && strncmp(buf, \"<!--#\", 5) != 0) {\n          intag = 0;\n        } else if (len >= sizeof(buf) - 2) {\n          MG_ERROR((\"%s: SSI tag is too large\", path));\n          len = 0;\n        }\n        buf[len++] = (char) (ch & 0xff);\n      } else {\n        buf[len++] = (char) (ch & 0xff);\n        if (len >= sizeof(buf)) {\n          mg_iobuf_add(&b, b.len, buf, len);\n          len = 0;\n        }\n      }\n    }\n    if (len > 0) mg_iobuf_add(&b, b.len, buf, len);\n    if (b.len > 0) mg_iobuf_add(&b, b.len, \"\", 1);  // nul-terminate\n    fclose(fp);\n  }\n  (void) depth;\n  (void) root;\n  return (char *) b.buf;\n}\n\nvoid mg_http_serve_ssi(struct mg_connection *c, const char *root,\n                       const char *fullpath) {\n  const char *headers = \"Content-Type: text/html; charset=utf-8\\r\\n\";\n  char *data = mg_ssi(fullpath, root, 0);\n  mg_http_reply(c, 200, headers, \"%s\", data == NULL ? \"\" : data);\n  free(data);\n}\n#else\nvoid mg_http_serve_ssi(struct mg_connection *c, const char *root,\n                       const char *fullpath) {\n  mg_http_reply(c, 501, NULL, \"SSI not enabled\");\n  (void) root, (void) fullpath;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/str.c\"\n#endif\n\n\nstruct mg_str mg_str_s(const char *s) {\n  struct mg_str str = {(char *) s, s == NULL ? 0 : strlen(s)};\n  return str;\n}\n\nstruct mg_str mg_str_n(const char *s, size_t n) {\n  struct mg_str str = {(char *) s, n};\n  return str;\n}\n\nstatic int mg_tolc(char c) {\n  return (c >= 'A' && c <= 'Z') ? c + 'a' - 'A' : c;\n}\n\nint mg_casecmp(const char *s1, const char *s2) {\n  int diff = 0;\n  do {\n    int c = mg_tolc(*s1++), d = mg_tolc(*s2++);\n    diff = c - d;\n  } while (diff == 0 && s1[-1] != '\\0');\n  return diff;\n}\n\nstruct mg_str mg_strdup(const struct mg_str s) {\n  struct mg_str r = {NULL, 0};\n  if (s.len > 0 && s.buf != NULL) {\n    char *sc = (char *) calloc(1, s.len + 1);\n    if (sc != NULL) {\n      memcpy(sc, s.buf, s.len);\n      sc[s.len] = '\\0';\n      r.buf = sc;\n      r.len = s.len;\n    }\n  }\n  return r;\n}\n\nint mg_strcmp(const struct mg_str str1, const struct mg_str str2) {\n  size_t i = 0;\n  while (i < str1.len && i < str2.len) {\n    int c1 = str1.buf[i];\n    int c2 = str2.buf[i];\n    if (c1 < c2) return -1;\n    if (c1 > c2) return 1;\n    i++;\n  }\n  if (i < str1.len) return 1;\n  if (i < str2.len) return -1;\n  return 0;\n}\n\nint mg_strcasecmp(const struct mg_str str1, const struct mg_str str2) {\n  size_t i = 0;\n  while (i < str1.len && i < str2.len) {\n    int c1 = mg_tolc(str1.buf[i]);\n    int c2 = mg_tolc(str2.buf[i]);\n    if (c1 < c2) return -1;\n    if (c1 > c2) return 1;\n    i++;\n  }\n  if (i < str1.len) return 1;\n  if (i < str2.len) return -1;\n  return 0;\n}\n\nbool mg_match(struct mg_str s, struct mg_str p, struct mg_str *caps) {\n  size_t i = 0, j = 0, ni = 0, nj = 0;\n  if (caps) caps->buf = NULL, caps->len = 0;\n  while (i < p.len || j < s.len) {\n    if (i < p.len && j < s.len &&\n        (p.buf[i] == '?' ||\n         (p.buf[i] != '*' && p.buf[i] != '#' && s.buf[j] == p.buf[i]))) {\n      if (caps == NULL) {\n      } else if (p.buf[i] == '?') {\n        caps->buf = &s.buf[j], caps->len = 1;     // Finalize `?` cap\n        caps++, caps->buf = NULL, caps->len = 0;  // Init next cap\n      } else if (caps->buf != NULL && caps->len == 0) {\n        caps->len = (size_t) (&s.buf[j] - caps->buf);  // Finalize current cap\n        caps++, caps->len = 0, caps->buf = NULL;       // Init next cap\n      }\n      i++, j++;\n    } else if (i < p.len && (p.buf[i] == '*' || p.buf[i] == '#')) {\n      if (caps && !caps->buf) caps->len = 0, caps->buf = &s.buf[j];  // Init cap\n      ni = i++, nj = j + 1;\n    } else if (nj > 0 && nj <= s.len && (p.buf[ni] == '#' || s.buf[j] != '/')) {\n      i = ni, j = nj;\n      if (caps && caps->buf == NULL && caps->len == 0) {\n        caps--, caps->len = 0;  // Restart previous cap\n      }\n    } else {\n      return false;\n    }\n  }\n  if (caps && caps->buf && caps->len == 0) {\n    caps->len = (size_t) (&s.buf[j] - caps->buf);\n  }\n  return true;\n}\n\nbool mg_span(struct mg_str s, struct mg_str *a, struct mg_str *b, char sep) {\n  if (s.len == 0 || s.buf == NULL) {\n    return false;  // Empty string, nothing to span - fail\n  } else {\n    size_t len = 0;\n    while (len < s.len && s.buf[len] != sep) len++;  // Find separator\n    if (a) *a = mg_str_n(s.buf, len);                // Init a\n    if (b) *b = mg_str_n(s.buf + len, s.len - len);  // Init b\n    if (b && len < s.len) b->buf++, b->len--;        // Skip separator\n    return true;\n  }\n}\n\nbool mg_str_to_num(struct mg_str str, int base, void *val, size_t val_len) {\n  size_t i = 0, ndigits = 0;\n  uint64_t max = val_len == sizeof(uint8_t)    ? 0xFF\n                 : val_len == sizeof(uint16_t) ? 0xFFFF\n                 : val_len == sizeof(uint32_t) ? 0xFFFFFFFF\n                                               : (uint64_t) ~0;\n  uint64_t result = 0;\n  if (max == (uint64_t) ~0 && val_len != sizeof(uint64_t)) return false;\n  if (base == 0 && str.len >= 2) {\n    if (str.buf[i] == '0') {\n      i++;\n      base = str.buf[i] == 'b' ? 2 : str.buf[i] == 'x' ? 16 : 10;\n      if (base != 10) ++i;\n    } else {\n      base = 10;\n    }\n  }\n  switch (base) {\n    case 2:\n      while (i < str.len && (str.buf[i] == '0' || str.buf[i] == '1')) {\n        uint64_t digit = (uint64_t) (str.buf[i] - '0');\n        if (result > max / 2) return false;  // Overflow\n        result *= 2;\n        if (result > max - digit) return false;  // Overflow\n        result += digit;\n        i++, ndigits++;\n      }\n      break;\n    case 10:\n      while (i < str.len && str.buf[i] >= '0' && str.buf[i] <= '9') {\n        uint64_t digit = (uint64_t) (str.buf[i] - '0');\n        if (result > max / 10) return false;  // Overflow\n        result *= 10;\n        if (result > max - digit) return false;  // Overflow\n        result += digit;\n        i++, ndigits++;\n      }\n      break;\n    case 16:\n      while (i < str.len) {\n        char c = str.buf[i];\n        uint64_t digit = (c >= '0' && c <= '9')   ? (uint64_t) (c - '0')\n                         : (c >= 'A' && c <= 'F') ? (uint64_t) (c - '7')\n                         : (c >= 'a' && c <= 'f') ? (uint64_t) (c - 'W')\n                                                  : (uint64_t) ~0;\n        if (digit == (uint64_t) ~0) break;\n        if (result > max / 16) return false;  // Overflow\n        result *= 16;\n        if (result > max - digit) return false;  // Overflow\n        result += digit;\n        i++, ndigits++;\n      }\n      break;\n    default:\n      return false;\n  }\n  if (ndigits == 0) return false;\n  if (i != str.len) return false;\n  if (val_len == 1) {\n    *((uint8_t *) val) = (uint8_t) result;\n  } else if (val_len == 2) {\n    *((uint16_t *) val) = (uint16_t) result;\n  } else if (val_len == 4) {\n    *((uint32_t *) val) = (uint32_t) result;\n  } else {\n    *((uint64_t *) val) = (uint64_t) result;\n  }\n  return true;\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/timer.c\"\n#endif\n\n\n\n#define MG_TIMER_CALLED 4\n\nvoid mg_timer_init(struct mg_timer **head, struct mg_timer *t, uint64_t ms,\n                   unsigned flags, void (*fn)(void *), void *arg) {\n  t->id = 0, t->period_ms = ms, t->expire = 0;\n  t->flags = flags, t->fn = fn, t->arg = arg, t->next = *head;\n  *head = t;\n}\n\nvoid mg_timer_free(struct mg_timer **head, struct mg_timer *t) {\n  while (*head && *head != t) head = &(*head)->next;\n  if (*head) *head = t->next;\n}\n\n// t: expiration time, prd: period, now: current time. Return true if expired\nbool mg_timer_expired(uint64_t *t, uint64_t prd, uint64_t now) {\n  if (now + prd < *t) *t = 0;                    // Time wrapped? Reset timer\n  if (*t == 0) *t = now + prd;                   // Firt poll? Set expiration\n  if (*t > now) return false;                    // Not expired yet, return\n  *t = (now - *t) > prd ? now + prd : *t + prd;  // Next expiration time\n  return true;                                   // Expired, return true\n}\n\nvoid mg_timer_poll(struct mg_timer **head, uint64_t now_ms) {\n  struct mg_timer *t, *tmp;\n  for (t = *head; t != NULL; t = tmp) {\n    bool once = t->expire == 0 && (t->flags & MG_TIMER_RUN_NOW) &&\n                !(t->flags & MG_TIMER_CALLED);  // Handle MG_TIMER_NOW only once\n    bool expired = mg_timer_expired(&t->expire, t->period_ms, now_ms);\n    tmp = t->next;\n    if (!once && !expired) continue;\n    if ((t->flags & MG_TIMER_REPEAT) || !(t->flags & MG_TIMER_CALLED)) {\n      t->fn(t->arg);\n    }\n    t->flags |= MG_TIMER_CALLED;\n  }\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/tls_aes128.c\"\n#endif\n/******************************************************************************\n *\n * THIS SOURCE CODE IS HEREBY PLACED INTO THE PUBLIC DOMAIN FOR THE GOOD OF ALL\n *\n * This is a simple and straightforward implementation of the AES Rijndael\n * 128-bit block cipher designed by Vincent Rijmen and Joan Daemen. The focus\n * of this work was correctness & accuracy.  It is written in 'C' without any\n * particular focus upon optimization or speed. It should be endian (memory\n * byte order) neutral since the few places that care are handled explicitly.\n *\n * This implementation of Rijndael was created by Steven M. Gibson of GRC.com.\n *\n * It is intended for general purpose use, but was written in support of GRC's\n * reference implementation of the SQRL (Secure Quick Reliable Login) client.\n *\n * See:    http://csrc.nist.gov/archive/aes/rijndael/wsdindex.html\n *\n * NO COPYRIGHT IS CLAIMED IN THIS WORK, HOWEVER, NEITHER IS ANY WARRANTY MADE\n * REGARDING ITS FITNESS FOR ANY PARTICULAR PURPOSE. USE IT AT YOUR OWN RISK.\n *\n *******************************************************************************/\n\n/******************************************************************************/\n#define AES_DECRYPTION 1  // whether AES decryption is supported\n/******************************************************************************/\n\n#define MG_ENCRYPT 1  // specify whether we're encrypting\n#define MG_DECRYPT 0  // or decrypting\n\n\n\n\n\n#if MG_TLS == MG_TLS_BUILTIN\n/******************************************************************************\n *  AES_INIT_KEYGEN_TABLES : MUST be called once before any AES use\n ******************************************************************************/\nstatic void aes_init_keygen_tables(void);\n\n/******************************************************************************\n *  AES_SETKEY : called to expand the key for encryption or decryption\n ******************************************************************************/\nstatic int aes_setkey(aes_context *ctx,  // pointer to context\n                      int mode,          // 1 or 0 for Encrypt/Decrypt\n                      const unsigned char *key,  // AES input key\n                      unsigned int keysize);  // size in bytes (must be 16, 24, 32 for\n                                      // 128, 192 or 256-bit keys respectively)\n                                      // returns 0 for success\n\n/******************************************************************************\n *  AES_CIPHER : called to encrypt or decrypt ONE 128-bit block of data\n ******************************************************************************/\nstatic int aes_cipher(aes_context *ctx,       // pointer to context\n                      const unsigned char input[16],  // 128-bit block to en/decipher\n                      unsigned char output[16]);      // 128-bit output result block\n                                              // returns 0 for success\n\n/******************************************************************************\n *  GCM_CONTEXT : GCM context / holds keytables, instance data, and AES ctx\n ******************************************************************************/\ntypedef struct {\n  int mode;             // cipher direction: encrypt/decrypt\n  uint64_t len;         // cipher data length processed so far\n  uint64_t add_len;     // total add data length\n  uint64_t HL[16];      // precalculated lo-half HTable\n  uint64_t HH[16];      // precalculated hi-half HTable\n  unsigned char base_ectr[16];  // first counter-mode cipher output for tag\n  unsigned char y[16];          // the current cipher-input IV|Counter value\n  unsigned char buf[16];        // buf working value\n  aes_context aes_ctx;  // cipher context used\n} gcm_context;\n\n/******************************************************************************\n *  GCM_SETKEY : sets the GCM (and AES) keying material for use\n ******************************************************************************/\nstatic int gcm_setkey(\n    gcm_context *ctx,   // caller-provided context ptr\n    const unsigned char *key,   // pointer to cipher key\n    const unsigned int keysize  // size in bytes (must be 16, 24, 32 for\n                        // 128, 192 or 256-bit keys respectively)\n);                      // returns 0 for success\n\n/******************************************************************************\n *\n *  GCM_CRYPT_AND_TAG\n *\n *  This either encrypts or decrypts the user-provided data and, either\n *  way, generates an authentication tag of the requested length. It must be\n *  called with a GCM context whose key has already been set with GCM_SETKEY.\n *\n *  The user would typically call this explicitly to ENCRYPT a buffer of data\n *  and optional associated data, and produce its an authentication tag.\n *\n *  To reverse the process the user would typically call the companion\n *  GCM_AUTH_DECRYPT function to decrypt data and verify a user-provided\n *  authentication tag.  The GCM_AUTH_DECRYPT function calls this function\n *  to perform its decryption and tag generation, which it then compares.\n *\n ******************************************************************************/\nstatic int gcm_crypt_and_tag(\n    gcm_context *ctx,    // gcm context with key already setup\n    int mode,            // cipher direction: MG_ENCRYPT (1) or MG_DECRYPT (0)\n    const unsigned char *iv,     // pointer to the 12-byte initialization vector\n    size_t iv_len,       // byte length if the IV. should always be 12\n    const unsigned char *add,    // pointer to the non-ciphered additional data\n    size_t add_len,      // byte length of the additional AEAD data\n    const unsigned char *input,  // pointer to the cipher data source\n    unsigned char *output,       // pointer to the cipher data destination\n    size_t length,       // byte length of the cipher data\n    unsigned char *tag,          // pointer to the tag to be generated\n    size_t tag_len);     // byte length of the tag to be generated\n\n/******************************************************************************\n *\n *  GCM_START\n *\n *  Given a user-provided GCM context, this initializes it, sets the encryption\n *  mode, and preprocesses the initialization vector and additional AEAD data.\n *\n ******************************************************************************/\nstatic int gcm_start(\n    gcm_context *ctx,  // pointer to user-provided GCM context\n    int mode,          // MG_ENCRYPT (1) or MG_DECRYPT (0)\n    const unsigned char *iv,   // pointer to initialization vector\n    size_t iv_len,     // IV length in bytes (should == 12)\n    const unsigned char *add,  // pointer to additional AEAD data (NULL if none)\n    size_t add_len);   // length of additional AEAD data (bytes)\n\n/******************************************************************************\n *\n *  GCM_UPDATE\n *\n *  This is called once or more to process bulk plaintext or ciphertext data.\n *  We give this some number of bytes of input and it returns the same number\n *  of output bytes. If called multiple times (which is fine) all but the final\n *  invocation MUST be called with length mod 16 == 0. (Only the final call can\n *  have a partial block length of < 128 bits.)\n *\n ******************************************************************************/\nstatic int gcm_update(gcm_context *ctx,  // pointer to user-provided GCM context\n                      size_t length,     // length, in bytes, of data to process\n                      const unsigned char *input,  // pointer to source data\n                      unsigned char *output);      // pointer to destination data\n\n/******************************************************************************\n *\n *  GCM_FINISH\n *\n *  This is called once after all calls to GCM_UPDATE to finalize the GCM.\n *  It performs the final GHASH to produce the resulting authentication TAG.\n *\n ******************************************************************************/\nstatic int gcm_finish(\n    gcm_context *ctx,  // pointer to user-provided GCM context\n    unsigned char *tag,        // ptr to tag buffer - NULL if tag_len = 0\n    size_t tag_len);   // length, in bytes, of the tag-receiving buf\n\n/******************************************************************************\n *\n *  GCM_ZERO_CTX\n *\n *  The GCM context contains both the GCM context and the AES context.\n *  This includes keying and key-related material which is security-\n *  sensitive, so it MUST be zeroed after use. This function does that.\n *\n ******************************************************************************/\nstatic void gcm_zero_ctx(gcm_context *ctx);\n\n/******************************************************************************\n *\n * THIS SOURCE CODE IS HEREBY PLACED INTO THE PUBLIC DOMAIN FOR THE GOOD OF ALL\n *\n * This is a simple and straightforward implementation of the AES Rijndael\n * 128-bit block cipher designed by Vincent Rijmen and Joan Daemen. The focus\n * of this work was correctness & accuracy.  It is written in 'C' without any\n * particular focus upon optimization or speed. It should be endian (memory\n * byte order) neutral since the few places that care are handled explicitly.\n *\n * This implementation of Rijndael was created by Steven M. Gibson of GRC.com.\n *\n * It is intended for general purpose use, but was written in support of GRC's\n * reference implementation of the SQRL (Secure Quick Reliable Login) client.\n *\n * See:    http://csrc.nist.gov/archive/aes/rijndael/wsdindex.html\n *\n * NO COPYRIGHT IS CLAIMED IN THIS WORK, HOWEVER, NEITHER IS ANY WARRANTY MADE\n * REGARDING ITS FITNESS FOR ANY PARTICULAR PURPOSE. USE IT AT YOUR OWN RISK.\n *\n *******************************************************************************/\n\n\n\n\nstatic int aes_tables_inited = 0;  // run-once flag for performing key\n                                   // expasion table generation (see below)\n/*\n *  The following static local tables must be filled-in before the first use of\n *  the GCM or AES ciphers. They are used for the AES key expansion/scheduling\n *  and once built are read-only and thread safe. The \"gcm_initialize\" function\n *  must be called once during system initialization to populate these arrays\n *  for subsequent use by the AES key scheduler. If they have not been built\n *  before attempted use, an error will be returned to the caller.\n *\n *  NOTE: GCM Encryption/Decryption does NOT REQUIRE AES decryption. Since\n *  GCM uses AES in counter-mode, where the AES cipher output is XORed with\n *  the GCM input, we ONLY NEED AES encryption.  Thus, to save space AES\n *  decryption is typically disabled by setting AES_DECRYPTION to 0 in aes.h.\n */\n// We always need our forward tables\nstatic unsigned char FSb[256];     // Forward substitution box (FSb)\nstatic uint32_t FT0[256];  // Forward key schedule assembly tables\nstatic uint32_t FT1[256];\nstatic uint32_t FT2[256];\nstatic uint32_t FT3[256];\n\n#if AES_DECRYPTION         // We ONLY need reverse for decryption\nstatic unsigned char RSb[256];     // Reverse substitution box (RSb)\nstatic uint32_t RT0[256];  // Reverse key schedule assembly tables\nstatic uint32_t RT1[256];\nstatic uint32_t RT2[256];\nstatic uint32_t RT3[256];\n#endif /* AES_DECRYPTION */\n\nstatic uint32_t RCON[10];  // AES round constants\n\n/*\n * Platform Endianness Neutralizing Load and Store Macro definitions\n * AES wants platform-neutral Little Endian (LE) byte ordering\n */\n#define GET_UINT32_LE(n, b, i)                                               \\\n  {                                                                          \\\n    (n) = ((uint32_t) (b)[(i)]) | ((uint32_t) (b)[(i) + 1] << 8) |           \\\n          ((uint32_t) (b)[(i) + 2] << 16) | ((uint32_t) (b)[(i) + 3] << 24); \\\n  }\n\n#define PUT_UINT32_LE(n, b, i)          \\\n  {                                     \\\n    (b)[(i)] = (unsigned char) ((n));           \\\n    (b)[(i) + 1] = (unsigned char) ((n) >> 8);  \\\n    (b)[(i) + 2] = (unsigned char) ((n) >> 16); \\\n    (b)[(i) + 3] = (unsigned char) ((n) >> 24); \\\n  }\n\n/*\n *  AES forward and reverse encryption round processing macros\n */\n#define AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3)          \\\n  {                                                         \\\n    X0 = *RK++ ^ FT0[(Y0) & 0xFF] ^ FT1[(Y1 >> 8) & 0xFF] ^ \\\n         FT2[(Y2 >> 16) & 0xFF] ^ FT3[(Y3 >> 24) & 0xFF];   \\\n                                                            \\\n    X1 = *RK++ ^ FT0[(Y1) & 0xFF] ^ FT1[(Y2 >> 8) & 0xFF] ^ \\\n         FT2[(Y3 >> 16) & 0xFF] ^ FT3[(Y0 >> 24) & 0xFF];   \\\n                                                            \\\n    X2 = *RK++ ^ FT0[(Y2) & 0xFF] ^ FT1[(Y3 >> 8) & 0xFF] ^ \\\n         FT2[(Y0 >> 16) & 0xFF] ^ FT3[(Y1 >> 24) & 0xFF];   \\\n                                                            \\\n    X3 = *RK++ ^ FT0[(Y3) & 0xFF] ^ FT1[(Y0 >> 8) & 0xFF] ^ \\\n         FT2[(Y1 >> 16) & 0xFF] ^ FT3[(Y2 >> 24) & 0xFF];   \\\n  }\n\n#define AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3)          \\\n  {                                                         \\\n    X0 = *RK++ ^ RT0[(Y0) & 0xFF] ^ RT1[(Y3 >> 8) & 0xFF] ^ \\\n         RT2[(Y2 >> 16) & 0xFF] ^ RT3[(Y1 >> 24) & 0xFF];   \\\n                                                            \\\n    X1 = *RK++ ^ RT0[(Y1) & 0xFF] ^ RT1[(Y0 >> 8) & 0xFF] ^ \\\n         RT2[(Y3 >> 16) & 0xFF] ^ RT3[(Y2 >> 24) & 0xFF];   \\\n                                                            \\\n    X2 = *RK++ ^ RT0[(Y2) & 0xFF] ^ RT1[(Y1 >> 8) & 0xFF] ^ \\\n         RT2[(Y0 >> 16) & 0xFF] ^ RT3[(Y3 >> 24) & 0xFF];   \\\n                                                            \\\n    X3 = *RK++ ^ RT0[(Y3) & 0xFF] ^ RT1[(Y2 >> 8) & 0xFF] ^ \\\n         RT2[(Y1 >> 16) & 0xFF] ^ RT3[(Y0 >> 24) & 0xFF];   \\\n  }\n\n/*\n *  These macros improve the readability of the key\n *  generation initialization code by collapsing\n *  repetitive common operations into logical pieces.\n */\n#define ROTL8(x) ((x << 8) & 0xFFFFFFFF) | (x >> 24)\n#define XTIME(x) ((x << 1) ^ ((x & 0x80) ? 0x1B : 0x00))\n#define MUL(x, y) ((x && y) ? pow[(log[x] + log[y]) % 255] : 0)\n#define MIX(x, y)                     \\\n  {                                   \\\n    y = ((y << 1) | (y >> 7)) & 0xFF; \\\n    x ^= y;                           \\\n  }\n#define CPY128     \\\n  {                \\\n    *RK++ = *SK++; \\\n    *RK++ = *SK++; \\\n    *RK++ = *SK++; \\\n    *RK++ = *SK++; \\\n  }\n\n/******************************************************************************\n *\n *  AES_INIT_KEYGEN_TABLES\n *\n *  Fills the AES key expansion tables allocated above with their static\n *  data. This is not \"per key\" data, but static system-wide read-only\n *  table data. THIS FUNCTION IS NOT THREAD SAFE. It must be called once\n *  at system initialization to setup the tables for all subsequent use.\n *\n ******************************************************************************/\nvoid aes_init_keygen_tables(void) {\n  int i, x, y, z;  // general purpose iteration and computation locals\n  int pow[256];\n  int log[256];\n\n  if (aes_tables_inited) return;\n\n  // fill the 'pow' and 'log' tables over GF(2^8)\n  for (i = 0, x = 1; i < 256; i++) {\n    pow[i] = x;\n    log[x] = i;\n    x = (x ^ XTIME(x)) & 0xFF;\n  }\n  // compute the round constants\n  for (i = 0, x = 1; i < 10; i++) {\n    RCON[i] = (uint32_t) x;\n    x = XTIME(x) & 0xFF;\n  }\n  // fill the forward and reverse substitution boxes\n  FSb[0x00] = 0x63;\n#if AES_DECRYPTION  // whether AES decryption is supported\n  RSb[0x63] = 0x00;\n#endif /* AES_DECRYPTION */\n\n  for (i = 1; i < 256; i++) {\n    x = y = pow[255 - log[i]];\n    MIX(x, y);\n    MIX(x, y);\n    MIX(x, y);\n    MIX(x, y);\n    FSb[i] = (unsigned char) (x ^= 0x63);\n#if AES_DECRYPTION  // whether AES decryption is supported\n    RSb[x] = (unsigned char) i;\n#endif /* AES_DECRYPTION */\n  }\n  // generate the forward and reverse key expansion tables\n  for (i = 0; i < 256; i++) {\n    x = FSb[i];\n    y = XTIME(x) & 0xFF;\n    z = (y ^ x) & 0xFF;\n\n    FT0[i] = ((uint32_t) y) ^ ((uint32_t) x << 8) ^ ((uint32_t) x << 16) ^\n             ((uint32_t) z << 24);\n\n    FT1[i] = ROTL8(FT0[i]);\n    FT2[i] = ROTL8(FT1[i]);\n    FT3[i] = ROTL8(FT2[i]);\n\n#if AES_DECRYPTION  // whether AES decryption is supported\n    x = RSb[i];\n\n    RT0[i] = ((uint32_t) MUL(0x0E, x)) ^ ((uint32_t) MUL(0x09, x) << 8) ^\n             ((uint32_t) MUL(0x0D, x) << 16) ^ ((uint32_t) MUL(0x0B, x) << 24);\n\n    RT1[i] = ROTL8(RT0[i]);\n    RT2[i] = ROTL8(RT1[i]);\n    RT3[i] = ROTL8(RT2[i]);\n#endif /* AES_DECRYPTION */\n  }\n  aes_tables_inited = 1;  // flag that the tables have been generated\n}  // to permit subsequent use of the AES cipher\n\n/******************************************************************************\n *\n *  AES_SET_ENCRYPTION_KEY\n *\n *  This is called by 'aes_setkey' when we're establishing a key for\n *  subsequent encryption.  We give it a pointer to the encryption\n *  context, a pointer to the key, and the key's length in bytes.\n *  Valid lengths are: 16, 24 or 32 bytes (128, 192, 256 bits).\n *\n ******************************************************************************/\nstatic int aes_set_encryption_key(aes_context *ctx, const unsigned char *key,\n                                  unsigned int keysize) {\n  unsigned int i;                  // general purpose iteration local\n  uint32_t *RK = ctx->rk;  // initialize our RoundKey buffer pointer\n\n  for (i = 0; i < (keysize >> 2); i++) {\n    GET_UINT32_LE(RK[i], key, i << 2);\n  }\n\n  switch (ctx->rounds) {\n    case 10:\n      for (i = 0; i < 10; i++, RK += 4) {\n        RK[4] = RK[0] ^ RCON[i] ^ ((uint32_t) FSb[(RK[3] >> 8) & 0xFF]) ^\n                ((uint32_t) FSb[(RK[3] >> 16) & 0xFF] << 8) ^\n                ((uint32_t) FSb[(RK[3] >> 24) & 0xFF] << 16) ^\n                ((uint32_t) FSb[(RK[3]) & 0xFF] << 24);\n\n        RK[5] = RK[1] ^ RK[4];\n        RK[6] = RK[2] ^ RK[5];\n        RK[7] = RK[3] ^ RK[6];\n      }\n      break;\n\n    case 12:\n      for (i = 0; i < 8; i++, RK += 6) {\n        RK[6] = RK[0] ^ RCON[i] ^ ((uint32_t) FSb[(RK[5] >> 8) & 0xFF]) ^\n                ((uint32_t) FSb[(RK[5] >> 16) & 0xFF] << 8) ^\n                ((uint32_t) FSb[(RK[5] >> 24) & 0xFF] << 16) ^\n                ((uint32_t) FSb[(RK[5]) & 0xFF] << 24);\n\n        RK[7] = RK[1] ^ RK[6];\n        RK[8] = RK[2] ^ RK[7];\n        RK[9] = RK[3] ^ RK[8];\n        RK[10] = RK[4] ^ RK[9];\n        RK[11] = RK[5] ^ RK[10];\n      }\n      break;\n\n    case 14:\n      for (i = 0; i < 7; i++, RK += 8) {\n        RK[8] = RK[0] ^ RCON[i] ^ ((uint32_t) FSb[(RK[7] >> 8) & 0xFF]) ^\n                ((uint32_t) FSb[(RK[7] >> 16) & 0xFF] << 8) ^\n                ((uint32_t) FSb[(RK[7] >> 24) & 0xFF] << 16) ^\n                ((uint32_t) FSb[(RK[7]) & 0xFF] << 24);\n\n        RK[9] = RK[1] ^ RK[8];\n        RK[10] = RK[2] ^ RK[9];\n        RK[11] = RK[3] ^ RK[10];\n\n        RK[12] = RK[4] ^ ((uint32_t) FSb[(RK[11]) & 0xFF]) ^\n                 ((uint32_t) FSb[(RK[11] >> 8) & 0xFF] << 8) ^\n                 ((uint32_t) FSb[(RK[11] >> 16) & 0xFF] << 16) ^\n                 ((uint32_t) FSb[(RK[11] >> 24) & 0xFF] << 24);\n\n        RK[13] = RK[5] ^ RK[12];\n        RK[14] = RK[6] ^ RK[13];\n        RK[15] = RK[7] ^ RK[14];\n      }\n      break;\n\n    default:\n      return -1;\n  }\n  return (0);\n}\n\n#if AES_DECRYPTION  // whether AES decryption is supported\n\n/******************************************************************************\n *\n *  AES_SET_DECRYPTION_KEY\n *\n *  This is called by 'aes_setkey' when we're establishing a\n *  key for subsequent decryption.  We give it a pointer to\n *  the encryption context, a pointer to the key, and the key's\n *  length in bits. Valid lengths are: 128, 192, or 256 bits.\n *\n ******************************************************************************/\nstatic int aes_set_decryption_key(aes_context *ctx, const unsigned char *key,\n                                  unsigned int keysize) {\n  int i, j;\n  aes_context cty;         // a calling aes context for set_encryption_key\n  uint32_t *RK = ctx->rk;  // initialize our RoundKey buffer pointer\n  uint32_t *SK;\n  int ret;\n\n  cty.rounds = ctx->rounds;  // initialize our local aes context\n  cty.rk = cty.buf;          // round count and key buf pointer\n\n  if ((ret = aes_set_encryption_key(&cty, key, keysize)) != 0) return (ret);\n\n  SK = cty.rk + cty.rounds * 4;\n\n  CPY128  // copy a 128-bit block from *SK to *RK\n\n      for (i = ctx->rounds - 1, SK -= 8; i > 0; i--, SK -= 8) {\n    for (j = 0; j < 4; j++, SK++) {\n      *RK++ = RT0[FSb[(*SK) & 0xFF]] ^ RT1[FSb[(*SK >> 8) & 0xFF]] ^\n              RT2[FSb[(*SK >> 16) & 0xFF]] ^ RT3[FSb[(*SK >> 24) & 0xFF]];\n    }\n  }\n  CPY128  // copy a 128-bit block from *SK to *RK\n      memset(&cty, 0, sizeof(aes_context));  // clear local aes context\n  return (0);\n}\n\n#endif /* AES_DECRYPTION */\n\n/******************************************************************************\n *\n *  AES_SETKEY\n *\n *  Invoked to establish the key schedule for subsequent encryption/decryption\n *\n ******************************************************************************/\nstatic int aes_setkey(aes_context *ctx,  // AES context provided by our caller\n                      int mode,          // ENCRYPT or DECRYPT flag\n                      const unsigned char *key,  // pointer to the key\n                      unsigned int keysize)      // key length in bytes\n{\n  // since table initialization is not thread safe, we could either add\n  // system-specific mutexes and init the AES key generation tables on\n  // demand, or ask the developer to simply call \"gcm_initialize\" once during\n  // application startup before threading begins. That's what we choose.\n  if (!aes_tables_inited) return (-1);  // fail the call when not inited.\n\n  ctx->mode = mode;    // capture the key type we're creating\n  ctx->rk = ctx->buf;  // initialize our round key pointer\n\n  switch (keysize)  // set the rounds count based upon the keysize\n  {\n    case 16:\n      ctx->rounds = 10;\n      break;  // 16-byte, 128-bit key\n    case 24:\n      ctx->rounds = 12;\n      break;  // 24-byte, 192-bit key\n    case 32:\n      ctx->rounds = 14;\n      break;  // 32-byte, 256-bit key\n    default:\n      return (-1);\n  }\n\n#if AES_DECRYPTION\n  if (mode == MG_DECRYPT)  // expand our key for encryption or decryption\n    return (aes_set_decryption_key(ctx, key, keysize));\n  else /* MG_ENCRYPT */\n#endif /* AES_DECRYPTION */\n    return (aes_set_encryption_key(ctx, key, keysize));\n}\n\n/******************************************************************************\n *\n *  AES_CIPHER\n *\n *  Perform AES encryption and decryption.\n *  The AES context will have been setup with the encryption mode\n *  and all keying information appropriate for the task.\n *\n ******************************************************************************/\nstatic int aes_cipher(aes_context *ctx, const unsigned char input[16],\n                      unsigned char output[16]) {\n  int i;\n  uint32_t *RK, X0, X1, X2, X3, Y0, Y1, Y2, Y3;  // general purpose locals\n\n  RK = ctx->rk;\n\n  GET_UINT32_LE(X0, input, 0);\n  X0 ^= *RK++;  // load our 128-bit\n  GET_UINT32_LE(X1, input, 4);\n  X1 ^= *RK++;  // input buffer in a storage\n  GET_UINT32_LE(X2, input, 8);\n  X2 ^= *RK++;  // memory endian-neutral way\n  GET_UINT32_LE(X3, input, 12);\n  X3 ^= *RK++;\n\n#if AES_DECRYPTION  // whether AES decryption is supported\n\n  if (ctx->mode == MG_DECRYPT) {\n    for (i = (ctx->rounds >> 1) - 1; i > 0; i--) {\n      AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3);\n      AES_RROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3);\n    }\n\n    AES_RROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3);\n\n    X0 = *RK++ ^ ((uint32_t) RSb[(Y0) & 0xFF]) ^\n         ((uint32_t) RSb[(Y3 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) RSb[(Y2 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) RSb[(Y1 >> 24) & 0xFF] << 24);\n\n    X1 = *RK++ ^ ((uint32_t) RSb[(Y1) & 0xFF]) ^\n         ((uint32_t) RSb[(Y0 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) RSb[(Y3 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) RSb[(Y2 >> 24) & 0xFF] << 24);\n\n    X2 = *RK++ ^ ((uint32_t) RSb[(Y2) & 0xFF]) ^\n         ((uint32_t) RSb[(Y1 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) RSb[(Y0 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) RSb[(Y3 >> 24) & 0xFF] << 24);\n\n    X3 = *RK++ ^ ((uint32_t) RSb[(Y3) & 0xFF]) ^\n         ((uint32_t) RSb[(Y2 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) RSb[(Y1 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) RSb[(Y0 >> 24) & 0xFF] << 24);\n  } else /* MG_ENCRYPT */\n  {\n#endif /* AES_DECRYPTION */\n\n    for (i = (ctx->rounds >> 1) - 1; i > 0; i--) {\n      AES_FROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3);\n      AES_FROUND(X0, X1, X2, X3, Y0, Y1, Y2, Y3);\n    }\n\n    AES_FROUND(Y0, Y1, Y2, Y3, X0, X1, X2, X3);\n\n    X0 = *RK++ ^ ((uint32_t) FSb[(Y0) & 0xFF]) ^\n         ((uint32_t) FSb[(Y1 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) FSb[(Y2 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) FSb[(Y3 >> 24) & 0xFF] << 24);\n\n    X1 = *RK++ ^ ((uint32_t) FSb[(Y1) & 0xFF]) ^\n         ((uint32_t) FSb[(Y2 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) FSb[(Y3 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) FSb[(Y0 >> 24) & 0xFF] << 24);\n\n    X2 = *RK++ ^ ((uint32_t) FSb[(Y2) & 0xFF]) ^\n         ((uint32_t) FSb[(Y3 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) FSb[(Y0 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) FSb[(Y1 >> 24) & 0xFF] << 24);\n\n    X3 = *RK++ ^ ((uint32_t) FSb[(Y3) & 0xFF]) ^\n         ((uint32_t) FSb[(Y0 >> 8) & 0xFF] << 8) ^\n         ((uint32_t) FSb[(Y1 >> 16) & 0xFF] << 16) ^\n         ((uint32_t) FSb[(Y2 >> 24) & 0xFF] << 24);\n\n#if AES_DECRYPTION  // whether AES decryption is supported\n  }\n#endif /* AES_DECRYPTION */\n\n  PUT_UINT32_LE(X0, output, 0);\n  PUT_UINT32_LE(X1, output, 4);\n  PUT_UINT32_LE(X2, output, 8);\n  PUT_UINT32_LE(X3, output, 12);\n\n  return (0);\n}\n/* end of aes.c */\n/******************************************************************************\n *\n * THIS SOURCE CODE IS HEREBY PLACED INTO THE PUBLIC DOMAIN FOR THE GOOD OF ALL\n *\n * This is a simple and straightforward implementation of AES-GCM authenticated\n * encryption. The focus of this work was correctness & accuracy. It is written\n * in straight 'C' without any particular focus upon optimization or speed. It\n * should be endian (memory byte order) neutral since the few places that care\n * are handled explicitly.\n *\n * This implementation of AES-GCM was created by Steven M. Gibson of GRC.com.\n *\n * It is intended for general purpose use, but was written in support of GRC's\n * reference implementation of the SQRL (Secure Quick Reliable Login) client.\n *\n * See:    http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf\n *         http://csrc.nist.gov/groups/ST/toolkit/BCM/documents/proposedmodes/\n *         gcm/gcm-revised-spec.pdf\n *\n * NO COPYRIGHT IS CLAIMED IN THIS WORK, HOWEVER, NEITHER IS ANY WARRANTY MADE\n * REGARDING ITS FITNESS FOR ANY PARTICULAR PURPOSE. USE IT AT YOUR OWN RISK.\n *\n *******************************************************************************/\n\n/******************************************************************************\n *                      ==== IMPLEMENTATION WARNING ====\n *\n *  This code was developed for use within SQRL's fixed environmnent. Thus, it\n *  is somewhat less \"general purpose\" than it would be if it were designed as\n *  a general purpose AES-GCM library. Specifically, it bothers with almost NO\n *  error checking on parameter limits, buffer bounds, etc. It assumes that it\n *  is being invoked by its author or by someone who understands the values it\n *  expects to receive. Its behavior will be undefined otherwise.\n *\n *  All functions that might fail are defined to return 'ints' to indicate a\n *  problem. Most do not do so now. But this allows for error propagation out\n *  of internal functions if robust error checking should ever be desired.\n *\n ******************************************************************************/\n\n/* Calculating the \"GHASH\"\n *\n * There are many ways of calculating the so-called GHASH in software, each with\n * a traditional size vs performance tradeoff.  The GHASH (Galois field hash) is\n * an intriguing construction which takes two 128-bit strings (also the cipher's\n * block size and the fundamental operation size for the system) and hashes them\n * into a third 128-bit result.\n *\n * Many implementation solutions have been worked out that use large precomputed\n * table lookups in place of more time consuming bit fiddling, and this approach\n * can be scaled easily upward or downward as needed to change the time/space\n * tradeoff. It's been studied extensively and there's a solid body of theory\n * and practice.  For example, without using any lookup tables an implementation\n * might obtain 119 cycles per byte throughput, whereas using a simple, though\n * large, key-specific 64 kbyte 8-bit lookup table the performance jumps to 13\n * cycles per byte.\n *\n * And Intel's processors have, since 2010, included an instruction which does\n * the entire 128x128->128 bit job in just several 64x64->128 bit pieces.\n *\n * Since SQRL is interactive, and only processing a few 128-bit blocks, I've\n * settled upon a relatively slower but appealing small-table compromise which\n * folds a bunch of not only time consuming but also bit twiddling into a simple\n * 16-entry table which is attributed to Victor Shoup's 1996 work while at\n * Bellcore: \"On Fast and Provably Secure MessageAuthentication Based on\n * Universal Hashing.\"  See: http://www.shoup.net/papers/macs.pdf\n * See, also section 4.1 of the \"gcm-revised-spec\" cited above.\n */\n\n/*\n *  This 16-entry table of pre-computed constants is used by the\n *  GHASH multiplier to improve over a strictly table-free but\n *  significantly slower 128x128 bit multiple within GF(2^128).\n */\nstatic const uint64_t last4[16] = {\n    0x0000, 0x1c20, 0x3840, 0x2460, 0x7080, 0x6ca0, 0x48c0, 0x54e0,\n    0xe100, 0xfd20, 0xd940, 0xc560, 0x9180, 0x8da0, 0xa9c0, 0xb5e0};\n\n/*\n * Platform Endianness Neutralizing Load and Store Macro definitions\n * GCM wants platform-neutral Big Endian (BE) byte ordering\n */\n#define GET_UINT32_BE(n, b, i)                                            \\\n  {                                                                       \\\n    (n) = ((uint32_t) (b)[(i)] << 24) | ((uint32_t) (b)[(i) + 1] << 16) | \\\n          ((uint32_t) (b)[(i) + 2] << 8) | ((uint32_t) (b)[(i) + 3]);     \\\n  }\n\n#define PUT_UINT32_BE(n, b, i)          \\\n  {                                     \\\n    (b)[(i)] = (unsigned char) ((n) >> 24);     \\\n    (b)[(i) + 1] = (unsigned char) ((n) >> 16); \\\n    (b)[(i) + 2] = (unsigned char) ((n) >> 8);  \\\n    (b)[(i) + 3] = (unsigned char) ((n));       \\\n  }\n\n/******************************************************************************\n *\n *  GCM_INITIALIZE\n *\n *  Must be called once to initialize the GCM library.\n *\n *  At present, this only calls the AES keygen table generator, which expands\n *  the AES keying tables for use. This is NOT A THREAD-SAFE function, so it\n *  MUST be called during system initialization before a multi-threading\n *  environment is running.\n *\n ******************************************************************************/\nint mg_gcm_initialize(void) {\n  aes_init_keygen_tables();\n  return (0);\n}\n\n/******************************************************************************\n *\n *  GCM_MULT\n *\n *  Performs a GHASH operation on the 128-bit input vector 'x', setting\n *  the 128-bit output vector to 'x' times H using our precomputed tables.\n *  'x' and 'output' are seen as elements of GCM's GF(2^128) Galois field.\n *\n ******************************************************************************/\nstatic void gcm_mult(gcm_context *ctx,   // pointer to established context\n                     const unsigned char x[16],  // pointer to 128-bit input vector\n                     unsigned char output[16])   // pointer to 128-bit output vector\n{\n  int i;\n  unsigned char lo, hi, rem;\n  uint64_t zh, zl;\n\n  lo = (unsigned char) (x[15] & 0x0f);\n  hi = (unsigned char) (x[15] >> 4);\n  zh = ctx->HH[lo];\n  zl = ctx->HL[lo];\n\n  for (i = 15; i >= 0; i--) {\n    lo = (unsigned char) (x[i] & 0x0f);\n    hi = (unsigned char) (x[i] >> 4);\n\n    if (i != 15) {\n      rem = (unsigned char) (zl & 0x0f);\n      zl = (zh << 60) | (zl >> 4);\n      zh = (zh >> 4);\n      zh ^= (uint64_t) last4[rem] << 48;\n      zh ^= ctx->HH[lo];\n      zl ^= ctx->HL[lo];\n    }\n    rem = (unsigned char) (zl & 0x0f);\n    zl = (zh << 60) | (zl >> 4);\n    zh = (zh >> 4);\n    zh ^= (uint64_t) last4[rem] << 48;\n    zh ^= ctx->HH[hi];\n    zl ^= ctx->HL[hi];\n  }\n  PUT_UINT32_BE(zh >> 32, output, 0);\n  PUT_UINT32_BE(zh, output, 4);\n  PUT_UINT32_BE(zl >> 32, output, 8);\n  PUT_UINT32_BE(zl, output, 12);\n}\n\n/******************************************************************************\n *\n *  GCM_SETKEY\n *\n *  This is called to set the AES-GCM key. It initializes the AES key\n *  and populates the gcm context's pre-calculated HTables.\n *\n ******************************************************************************/\nstatic int gcm_setkey(\n    gcm_context *ctx,    // pointer to caller-provided gcm context\n    const unsigned char *key,    // pointer to the AES encryption key\n    const unsigned int keysize)  // size in bytes (must be 16, 24, 32 for\n                         // 128, 192 or 256-bit keys respectively)\n{\n  int ret, i, j;\n  uint64_t hi, lo;\n  uint64_t vl, vh;\n  unsigned char h[16];\n\n  memset(ctx, 0, sizeof(gcm_context));  // zero caller-provided GCM context\n  memset(h, 0, 16);                     // initialize the block to encrypt\n\n  // encrypt the null 128-bit block to generate a key-based value\n  // which is then used to initialize our GHASH lookup tables\n  if ((ret = aes_setkey(&ctx->aes_ctx, MG_ENCRYPT, key, keysize)) != 0)\n    return (ret);\n  if ((ret = aes_cipher(&ctx->aes_ctx, h, h)) != 0) return (ret);\n\n  GET_UINT32_BE(hi, h, 0);  // pack h as two 64-bit ints, big-endian\n  GET_UINT32_BE(lo, h, 4);\n  vh = (uint64_t) hi << 32 | lo;\n\n  GET_UINT32_BE(hi, h, 8);\n  GET_UINT32_BE(lo, h, 12);\n  vl = (uint64_t) hi << 32 | lo;\n\n  ctx->HL[8] = vl;  // 8 = 1000 corresponds to 1 in GF(2^128)\n  ctx->HH[8] = vh;\n  ctx->HH[0] = 0;  // 0 corresponds to 0 in GF(2^128)\n  ctx->HL[0] = 0;\n\n  for (i = 4; i > 0; i >>= 1) {\n    uint32_t T = (uint32_t) (vl & 1) * 0xe1000000U;\n    vl = (vh << 63) | (vl >> 1);\n    vh = (vh >> 1) ^ ((uint64_t) T << 32);\n    ctx->HL[i] = vl;\n    ctx->HH[i] = vh;\n  }\n  for (i = 2; i < 16; i <<= 1) {\n    uint64_t *HiL = ctx->HL + i, *HiH = ctx->HH + i;\n    vh = *HiH;\n    vl = *HiL;\n    for (j = 1; j < i; j++) {\n      HiH[j] = vh ^ ctx->HH[j];\n      HiL[j] = vl ^ ctx->HL[j];\n    }\n  }\n  return (0);\n}\n\n/******************************************************************************\n *\n *    GCM processing occurs four phases: SETKEY, START, UPDATE and FINISH.\n *\n *  SETKEY:\n *\n *   START: Sets the Encryption/Decryption mode.\n *          Accepts the initialization vector and additional data.\n *\n *  UPDATE: Encrypts or decrypts the plaintext or ciphertext.\n *\n *  FINISH: Performs a final GHASH to generate the authentication tag.\n *\n ******************************************************************************\n *\n *  GCM_START\n *\n *  Given a user-provided GCM context, this initializes it, sets the encryption\n *  mode, and preprocesses the initialization vector and additional AEAD data.\n *\n ******************************************************************************/\nint gcm_start(gcm_context *ctx,  // pointer to user-provided GCM context\n              int mode,          // GCM_ENCRYPT or GCM_DECRYPT\n              const unsigned char *iv,   // pointer to initialization vector\n              size_t iv_len,     // IV length in bytes (should == 12)\n              const unsigned char *add,  // ptr to additional AEAD data (NULL if none)\n              size_t add_len)    // length of additional AEAD data (bytes)\n{\n  int ret;             // our error return if the AES encrypt fails\n  unsigned char work_buf[16];  // XOR source built from provided IV if len != 16\n  const unsigned char *p;      // general purpose array pointer\n  size_t use_len;      // byte count to process, up to 16 bytes\n  size_t i;            // local loop iterator\n\n  // since the context might be reused under the same key\n  // we zero the working buffers for this next new process\n  memset(ctx->y, 0x00, sizeof(ctx->y));\n  memset(ctx->buf, 0x00, sizeof(ctx->buf));\n  ctx->len = 0;\n  ctx->add_len = 0;\n\n  ctx->mode = mode;                // set the GCM encryption/decryption mode\n  ctx->aes_ctx.mode = MG_ENCRYPT;  // GCM *always* runs AES in ENCRYPTION mode\n\n  if (iv_len == 12) {            // GCM natively uses a 12-byte, 96-bit IV\n    memcpy(ctx->y, iv, iv_len);  // copy the IV to the top of the 'y' buff\n    ctx->y[15] = 1;              // start \"counting\" from 1 (not 0)\n  } else  // if we don't have a 12-byte IV, we GHASH whatever we've been given\n  {\n    memset(work_buf, 0x00, 16);               // clear the working buffer\n    PUT_UINT32_BE(iv_len * 8, work_buf, 12);  // place the IV into buffer\n\n    p = iv;\n    while (iv_len > 0) {\n      use_len = (iv_len < 16) ? iv_len : 16;\n      for (i = 0; i < use_len; i++) ctx->y[i] ^= p[i];\n      gcm_mult(ctx, ctx->y, ctx->y);\n      iv_len -= use_len;\n      p += use_len;\n    }\n    for (i = 0; i < 16; i++) ctx->y[i] ^= work_buf[i];\n    gcm_mult(ctx, ctx->y, ctx->y);\n  }\n  if ((ret = aes_cipher(&ctx->aes_ctx, ctx->y, ctx->base_ectr)) != 0)\n    return (ret);\n\n  ctx->add_len = add_len;\n  p = add;\n  while (add_len > 0) {\n    use_len = (add_len < 16) ? add_len : 16;\n    for (i = 0; i < use_len; i++) ctx->buf[i] ^= p[i];\n    gcm_mult(ctx, ctx->buf, ctx->buf);\n    add_len -= use_len;\n    p += use_len;\n  }\n  return (0);\n}\n\n/******************************************************************************\n *\n *  GCM_UPDATE\n *\n *  This is called once or more to process bulk plaintext or ciphertext data.\n *  We give this some number of bytes of input and it returns the same number\n *  of output bytes. If called multiple times (which is fine) all but the final\n *  invocation MUST be called with length mod 16 == 0. (Only the final call can\n *  have a partial block length of < 128 bits.)\n *\n ******************************************************************************/\nint gcm_update(gcm_context *ctx,    // pointer to user-provided GCM context\n               size_t length,       // length, in bytes, of data to process\n               const unsigned char *input,  // pointer to source data\n               unsigned char *output)       // pointer to destination data\n{\n  int ret;         // our error return if the AES encrypt fails\n  unsigned char ectr[16];  // counter-mode cipher output for XORing\n  size_t use_len;  // byte count to process, up to 16 bytes\n  size_t i;        // local loop iterator\n\n  ctx->len += length;  // bump the GCM context's running length count\n\n  while (length > 0) {\n    // clamp the length to process at 16 bytes\n    use_len = (length < 16) ? length : 16;\n\n    // increment the context's 128-bit IV||Counter 'y' vector\n    for (i = 16; i > 12; i--)\n      if (++ctx->y[i - 1] != 0) break;\n\n    // encrypt the context's 'y' vector under the established key\n    if ((ret = aes_cipher(&ctx->aes_ctx, ctx->y, ectr)) != 0) return (ret);\n\n    // encrypt or decrypt the input to the output\n    if (ctx->mode == MG_ENCRYPT) {\n      for (i = 0; i < use_len; i++) {\n        // XOR the cipher's ouptut vector (ectr) with our input\n        output[i] = (unsigned char) (ectr[i] ^ input[i]);\n        // now we mix in our data into the authentication hash.\n        // if we're ENcrypting we XOR in the post-XOR (output)\n        // results, but if we're DEcrypting we XOR in the input\n        // data\n        ctx->buf[i] ^= output[i];\n      }\n    } else {\n      for (i = 0; i < use_len; i++) {\n        // but if we're DEcrypting we XOR in the input data first,\n        // i.e. before saving to ouput data, otherwise if the input\n        // and output buffer are the same (inplace decryption) we\n        // would not get the correct auth tag\n\n        ctx->buf[i] ^= input[i];\n\n        // XOR the cipher's ouptut vector (ectr) with our input\n        output[i] = (unsigned char) (ectr[i] ^ input[i]);\n      }\n    }\n    gcm_mult(ctx, ctx->buf, ctx->buf);  // perform a GHASH operation\n\n    length -= use_len;  // drop the remaining byte count to process\n    input += use_len;   // bump our input pointer forward\n    output += use_len;  // bump our output pointer forward\n  }\n  return (0);\n}\n\n/******************************************************************************\n *\n *  GCM_FINISH\n *\n *  This is called once after all calls to GCM_UPDATE to finalize the GCM.\n *  It performs the final GHASH to produce the resulting authentication TAG.\n *\n ******************************************************************************/\nint gcm_finish(gcm_context *ctx,  // pointer to user-provided GCM context\n               unsigned char *tag,        // pointer to buffer which receives the tag\n               size_t tag_len)    // length, in bytes, of the tag-receiving buf\n{\n  unsigned char work_buf[16];\n  uint64_t orig_len = ctx->len * 8;\n  uint64_t orig_add_len = ctx->add_len * 8;\n  size_t i;\n\n  if (tag_len != 0) memcpy(tag, ctx->base_ectr, tag_len);\n\n  if (orig_len || orig_add_len) {\n    memset(work_buf, 0x00, 16);\n\n    PUT_UINT32_BE((orig_add_len >> 32), work_buf, 0);\n    PUT_UINT32_BE((orig_add_len), work_buf, 4);\n    PUT_UINT32_BE((orig_len >> 32), work_buf, 8);\n    PUT_UINT32_BE((orig_len), work_buf, 12);\n\n    for (i = 0; i < 16; i++) ctx->buf[i] ^= work_buf[i];\n    gcm_mult(ctx, ctx->buf, ctx->buf);\n    for (i = 0; i < tag_len; i++) tag[i] ^= ctx->buf[i];\n  }\n  return (0);\n}\n\n/******************************************************************************\n *\n *  GCM_CRYPT_AND_TAG\n *\n *  This either encrypts or decrypts the user-provided data and, either\n *  way, generates an authentication tag of the requested length. It must be\n *  called with a GCM context whose key has already been set with GCM_SETKEY.\n *\n *  The user would typically call this explicitly to ENCRYPT a buffer of data\n *  and optional associated data, and produce its an authentication tag.\n *\n *  To reverse the process the user would typically call the companion\n *  GCM_AUTH_DECRYPT function to decrypt data and verify a user-provided\n *  authentication tag.  The GCM_AUTH_DECRYPT function calls this function\n *  to perform its decryption and tag generation, which it then compares.\n *\n ******************************************************************************/\nint gcm_crypt_and_tag(\n    gcm_context *ctx,    // gcm context with key already setup\n    int mode,            // cipher direction: GCM_ENCRYPT or GCM_DECRYPT\n    const unsigned char *iv,     // pointer to the 12-byte initialization vector\n    size_t iv_len,       // byte length if the IV. should always be 12\n    const unsigned char *add,    // pointer to the non-ciphered additional data\n    size_t add_len,      // byte length of the additional AEAD data\n    const unsigned char *input,  // pointer to the cipher data source\n    unsigned char *output,       // pointer to the cipher data destination\n    size_t length,       // byte length of the cipher data\n    unsigned char *tag,          // pointer to the tag to be generated\n    size_t tag_len)      // byte length of the tag to be generated\n{                        /*\n                            assuming that the caller has already invoked gcm_setkey to\n                            prepare the gcm context with the keying material, we simply\n                            invoke each of the three GCM sub-functions in turn...\n                         */\n  gcm_start(ctx, mode, iv, iv_len, add, add_len);\n  gcm_update(ctx, length, input, output);\n  gcm_finish(ctx, tag, tag_len);\n  return (0);\n}\n\n/******************************************************************************\n *\n *  GCM_ZERO_CTX\n *\n *  The GCM context contains both the GCM context and the AES context.\n *  This includes keying and key-related material which is security-\n *  sensitive, so it MUST be zeroed after use. This function does that.\n *\n ******************************************************************************/\nvoid gcm_zero_ctx(gcm_context *ctx) {\n  // zero the context originally provided to us\n  memset(ctx, 0, sizeof(gcm_context));\n}\n//\n//  aes-gcm.c\n//  Pods\n//\n//  Created by Markus Kosmal on 20/11/14.\n//\n//\n\nint mg_aes_gcm_encrypt(unsigned char *output,  //\n                       const unsigned char *input, size_t input_length,\n                       const unsigned char *key, const size_t key_len,\n                       const unsigned char *iv, const size_t iv_len,\n                       unsigned char *aead, size_t aead_len, unsigned char *tag,\n                       const size_t tag_len) {\n  int ret = 0;      // our return value\n  gcm_context ctx;  // includes the AES context structure\n\n  gcm_setkey(&ctx, key, (unsigned int) key_len);\n\n  ret = gcm_crypt_and_tag(&ctx, MG_ENCRYPT, iv, iv_len, aead, aead_len, input,\n                          output, input_length, tag, tag_len);\n\n  gcm_zero_ctx(&ctx);\n\n  return (ret);\n}\n\nint mg_aes_gcm_decrypt(unsigned char *output, const unsigned char *input,\n                       size_t input_length, const unsigned char *key,\n                       const size_t key_len, const unsigned char *iv,\n                       const size_t iv_len) {\n  int ret = 0;      // our return value\n  gcm_context ctx;  // includes the AES context structure\n\n  size_t tag_len = 0;\n  unsigned char *tag_buf = NULL;\n\n  gcm_setkey(&ctx, key, (unsigned int) key_len);\n\n  ret = gcm_crypt_and_tag(&ctx, MG_DECRYPT, iv, iv_len, NULL, 0, input, output,\n                          input_length, tag_buf, tag_len);\n\n  gcm_zero_ctx(&ctx);\n\n  return (ret);\n}\n#endif\n// End of aes128 PD\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/tls_builtin.c\"\n#endif\n\n\n\n\n\n\n\n\n\n\n\n#if MG_TLS == MG_TLS_BUILTIN\n\n#define CHACHA20 1\n\n/* TLS 1.3 Record Content Type (RFC8446 B.1) */\n#define MG_TLS_CHANGE_CIPHER 20\n#define MG_TLS_ALERT 21\n#define MG_TLS_HANDSHAKE 22\n#define MG_TLS_APP_DATA 23\n#define MG_TLS_HEARTBEAT 24\n\n/* TLS 1.3 Handshake Message Type (RFC8446 B.3) */\n#define MG_TLS_CLIENT_HELLO 1\n#define MG_TLS_SERVER_HELLO 2\n#define MG_TLS_ENCRYPTED_EXTENSIONS 8\n#define MG_TLS_CERTIFICATE 11\n#define MG_TLS_CERTIFICATE_REQUEST 13\n#define MG_TLS_CERTIFICATE_VERIFY 15\n#define MG_TLS_FINISHED 20\n\n// handshake is re-entrant, so we need to keep track of its state state names\n// refer to RFC8446#A.1\nenum mg_tls_hs_state {\n  // Client state machine:\n  MG_TLS_STATE_CLIENT_START,          // Send ClientHello\n  MG_TLS_STATE_CLIENT_WAIT_SH,        // Wait for ServerHello\n  MG_TLS_STATE_CLIENT_WAIT_EE,        // Wait for EncryptedExtensions\n  MG_TLS_STATE_CLIENT_WAIT_CERT,      // Wait for Certificate\n  MG_TLS_STATE_CLIENT_WAIT_CV,        // Wait for CertificateVerify\n  MG_TLS_STATE_CLIENT_WAIT_FINISHED,  // Wait for Finished\n  MG_TLS_STATE_CLIENT_CONNECTED,      // Done\n\n  // Server state machine:\n  MG_TLS_STATE_SERVER_START,       // Wait for ClientHello\n  MG_TLS_STATE_SERVER_NEGOTIATED,  // Wait for Finished\n  MG_TLS_STATE_SERVER_CONNECTED    // Done\n};\n\n// encryption keys for a TLS connection\nstruct tls_enc {\n  uint32_t sseq;  // server sequence number, used in encryption\n  uint32_t cseq;  // client sequence number, used in decryption\n  // keys for AES encryption or ChaCha20\n  uint8_t handshake_secret[32];\n  uint8_t server_write_key[32];\n  uint8_t server_write_iv[12];\n  uint8_t server_finished_key[32];\n  uint8_t client_write_key[32];\n  uint8_t client_write_iv[12];\n  uint8_t client_finished_key[32];\n};\n\n// per-connection TLS data\nstruct tls_data {\n  enum mg_tls_hs_state state;  // keep track of connection handshake progress\n\n  struct mg_iobuf send;  // For the receive path, we're reusing c->rtls\n  size_t recv_offset;    // While c->rtls contains full records, reuse that\n  size_t recv_len;       // buffer but point at individual decrypted messages\n\n  uint8_t content_type;  // Last received record content type\n\n  mg_sha256_ctx sha256;  // incremental SHA-256 hash for TLS handshake\n\n  uint8_t random[32];      // client random from ClientHello\n  uint8_t session_id[32];  // client session ID between the handshake states\n  uint8_t x25519_cli[32];  // client X25519 key between the handshake states\n  uint8_t x25519_sec[32];  // x25519 secret between the handshake states\n\n  int skip_verification;   // perform checks on server certificate?\n  int cert_requested;      // client received a CertificateRequest?\n  struct mg_str cert_der;  // certificate in DER format\n  uint8_t ec_key[32];      // EC private key\n  char hostname[254];      // server hostname (client extension)\n\n  uint8_t certhash[32];  // certificate message hash\n  uint8_t pubkey[64];    // server EC public key to verify cert\n  uint8_t sighash[32];   // server EC public key to verify cert\n\n  struct tls_enc enc;\n};\n\n#define TLS_RECHDR_SIZE 5  // 1 byte type, 2 bytes version, 2 bytes length\n#define TLS_MSGHDR_SIZE 4  // 1 byte type, 3 bytes length\n\n#ifdef MG_TLS_SSLKEYLOGFILE\n#include <stdio.h>\nstatic void mg_ssl_key_log(const char *label, uint8_t client_random[32],\n                           uint8_t *secret, size_t secretsz) {\n  char *keylogfile = getenv(\"SSLKEYLOGFILE\");\n  size_t i;\n  if (keylogfile != NULL) {\n    MG_DEBUG((\"Dumping key log into %s\", keylogfile));\n    FILE *f = fopen(keylogfile, \"a\");\n    if (f != NULL) {\n      fprintf(f, \"%s \", label);\n      for (i = 0; i < 32; i++) {\n        fprintf(f, \"%02x\", client_random[i]);\n      }\n      fprintf(f, \" \");\n      for (i = 0; i < secretsz; i++) {\n        fprintf(f, \"%02x\", secret[i]);\n      }\n      fprintf(f, \"\\n\");\n      fclose(f);\n    } else {\n      MG_ERROR((\"Cannot open %s\", keylogfile));\n    }\n  }\n}\n#endif\n\n// for derived tls keys we need SHA256([0]*32)\nstatic uint8_t zeros[32] = {0};\nstatic uint8_t zeros_sha256_digest[32] = {\n    0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4,\n    0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b,\n    0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55};\n\n// helper to hexdump buffers inline\nstatic void mg_tls_hexdump(const char *msg, uint8_t *buf, size_t bufsz) {\n  MG_VERBOSE((\"%s: %M\", msg, mg_print_hex, bufsz, buf));\n}\n\n// helper utilities to parse ASN.1 DER\nstruct mg_der_tlv {\n  uint8_t type;\n  uint32_t len;\n  uint8_t *value;\n};\n\n// parse DER into a TLV record\nstatic int mg_der_to_tlv(uint8_t *der, size_t dersz, struct mg_der_tlv *tlv) {\n  if (dersz < 2) {\n    return -1;\n  }\n  tlv->type = der[0];\n  tlv->len = der[1];\n  tlv->value = der + 2;\n  if (tlv->len > 0x7f) {\n    uint32_t i, n = tlv->len - 0x80;\n    tlv->len = 0;\n    for (i = 0; i < n; i++) {\n      tlv->len = (tlv->len << 8) | (der[2 + i]);\n    }\n    tlv->value = der + 2 + n;\n  }\n  if (der + dersz < tlv->value + tlv->len) {\n    return -1;\n  }\n  return 0;\n}\n\nstatic int mg_der_find(uint8_t *der, size_t dersz, uint8_t *oid, size_t oidsz,\n                       struct mg_der_tlv *tlv) {\n  uint8_t *p, *end;\n  struct mg_der_tlv child = {0, 0, NULL};\n  if (mg_der_to_tlv(der, dersz, tlv) < 0) {\n    return -1;                  // invalid DER\n  } else if (tlv->type == 6) {  // found OID, check value\n    return (tlv->len == oidsz && memcmp(tlv->value, oid, oidsz) == 0);\n  } else if ((tlv->type & 0x20) == 0) {\n    return 0;  // Primitive, but not OID: not found\n  }\n  // Constructed object: scan children\n  p = tlv->value;\n  end = tlv->value + tlv->len;\n  while (end > p) {\n    int r;\n    mg_der_to_tlv(p, (size_t) (end - p), &child);\n    r = mg_der_find(p, (size_t) (end - p), oid, oidsz, tlv);\n    if (r < 0) return -1;  // error\n    if (r > 0) return 1;   // found OID!\n    p = child.value + child.len;\n  }\n  return 0;  // not found\n}\n\n// Did we receive a full TLS record in the c->rtls buffer?\nstatic bool mg_tls_got_record(struct mg_connection *c) {\n  return c->rtls.len >= (size_t) TLS_RECHDR_SIZE &&\n         c->rtls.len >=\n             (size_t) (TLS_RECHDR_SIZE + MG_LOAD_BE16(c->rtls.buf + 3));\n}\n\n// Remove a single TLS record from the recv buffer\nstatic void mg_tls_drop_record(struct mg_connection *c) {\n  struct mg_iobuf *rio = &c->rtls;\n  uint16_t n = MG_LOAD_BE16(rio->buf + 3) + TLS_RECHDR_SIZE;\n  mg_iobuf_del(rio, 0, n);\n}\n\n// Remove a single TLS message from decrypted buffer, remove the wrapping\n// record if it was the last message within a record\nstatic void mg_tls_drop_message(struct mg_connection *c) {\n  uint32_t len;\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf = &c->rtls.buf[tls->recv_offset];\n  if (tls->recv_len == 0) return;\n  len = MG_LOAD_BE24(recv_buf + 1) + TLS_MSGHDR_SIZE;\n  if (tls->recv_len < len) {\n    mg_error(c, \"wrong size\");\n    return;\n  }\n  mg_sha256_update(&tls->sha256, recv_buf, len);\n  tls->recv_offset += len;\n  tls->recv_len -= len;\n  if (tls->recv_len == 0) {\n    mg_tls_drop_record(c);\n  }\n}\n\n// TLS1.3 secret derivation based on the key label\nstatic void mg_tls_derive_secret(const char *label, uint8_t *key, size_t keysz,\n                                 uint8_t *data, size_t datasz, uint8_t *hash,\n                                 size_t hashsz) {\n  size_t labelsz = strlen(label);\n  uint8_t secret[32];\n  uint8_t packed[256] = {0, (uint8_t) hashsz, (uint8_t) labelsz};\n  // TODO: assert lengths of label, key, data and hash\n  if (labelsz > 0) memmove(packed + 3, label, labelsz);\n  packed[3 + labelsz] = (uint8_t) datasz;\n  if (datasz > 0) memmove(packed + labelsz + 4, data, datasz);\n  packed[4 + labelsz + datasz] = 1;\n\n  mg_hmac_sha256(secret, key, keysz, packed, 5 + labelsz + datasz);\n  memmove(hash, secret, hashsz);\n}\n\n// at this point we have x25519 shared secret, we can generate a set of derived\n// handshake encryption keys\nstatic void mg_tls_generate_handshake_keys(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n\n  mg_sha256_ctx sha256;\n  uint8_t early_secret[32];\n  uint8_t pre_extract_secret[32];\n  uint8_t hello_hash[32];\n  uint8_t server_hs_secret[32];\n  uint8_t client_hs_secret[32];\n#if CHACHA20\n  const size_t keysz = 32;\n#else\n  const size_t keysz = 16;\n#endif\n\n  mg_hmac_sha256(early_secret, NULL, 0, zeros, sizeof(zeros));\n  mg_tls_derive_secret(\"tls13 derived\", early_secret, 32, zeros_sha256_digest,\n                       32, pre_extract_secret, 32);\n  mg_hmac_sha256(tls->enc.handshake_secret, pre_extract_secret,\n                 sizeof(pre_extract_secret), tls->x25519_sec,\n                 sizeof(tls->x25519_sec));\n  mg_tls_hexdump(\"hs secret\", tls->enc.handshake_secret, 32);\n\n  // mg_sha256_final is not idempotent, need to copy sha256 context to calculate\n  // the digest\n  memmove(&sha256, &tls->sha256, sizeof(mg_sha256_ctx));\n  mg_sha256_final(hello_hash, &sha256);\n\n  mg_tls_hexdump(\"hello hash\", hello_hash, 32);\n  // derive keys needed for the rest of the handshake\n  mg_tls_derive_secret(\"tls13 s hs traffic\", tls->enc.handshake_secret, 32,\n                       hello_hash, 32, server_hs_secret, 32);\n  mg_tls_derive_secret(\"tls13 c hs traffic\", tls->enc.handshake_secret, 32,\n                       hello_hash, 32, client_hs_secret, 32);\n\n  mg_tls_derive_secret(\"tls13 key\", server_hs_secret, 32, NULL, 0,\n                       tls->enc.server_write_key, keysz);\n  mg_tls_derive_secret(\"tls13 iv\", server_hs_secret, 32, NULL, 0,\n                       tls->enc.server_write_iv, 12);\n  mg_tls_derive_secret(\"tls13 finished\", server_hs_secret, 32, NULL, 0,\n                       tls->enc.server_finished_key, 32);\n\n  mg_tls_derive_secret(\"tls13 key\", client_hs_secret, 32, NULL, 0,\n                       tls->enc.client_write_key, keysz);\n  mg_tls_derive_secret(\"tls13 iv\", client_hs_secret, 32, NULL, 0,\n                       tls->enc.client_write_iv, 12);\n  mg_tls_derive_secret(\"tls13 finished\", client_hs_secret, 32, NULL, 0,\n                       tls->enc.client_finished_key, 32);\n\n  mg_tls_hexdump(\"s hs traffic\", server_hs_secret, 32);\n  mg_tls_hexdump(\"s key\", tls->enc.server_write_key, keysz);\n  mg_tls_hexdump(\"s iv\", tls->enc.server_write_iv, 12);\n  mg_tls_hexdump(\"s finished\", tls->enc.server_finished_key, 32);\n  mg_tls_hexdump(\"c hs traffic\", client_hs_secret, 32);\n  mg_tls_hexdump(\"c key\", tls->enc.client_write_key, keysz);\n  mg_tls_hexdump(\"c iv\", tls->enc.client_write_iv, 12);\n  mg_tls_hexdump(\"c finished\", tls->enc.client_finished_key, 32);\n\n#ifdef MG_TLS_SSLKEYLOGFILE\n  mg_ssl_key_log(\"SERVER_HANDSHAKE_TRAFFIC_SECRET\", tls->random,\n                 server_hs_secret, 32);\n  mg_ssl_key_log(\"CLIENT_HANDSHAKE_TRAFFIC_SECRET\", tls->random,\n                 client_hs_secret, 32);\n#endif\n}\n\nstatic void mg_tls_generate_application_keys(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  uint8_t hash[32];\n  uint8_t premaster_secret[32];\n  uint8_t master_secret[32];\n  uint8_t server_secret[32];\n  uint8_t client_secret[32];\n#if CHACHA20\n  const size_t keysz = 32;\n#else\n  const size_t keysz = 16;\n#endif\n\n  mg_sha256_ctx sha256;\n  memmove(&sha256, &tls->sha256, sizeof(mg_sha256_ctx));\n  mg_sha256_final(hash, &sha256);\n\n  mg_tls_derive_secret(\"tls13 derived\", tls->enc.handshake_secret, 32,\n                       zeros_sha256_digest, 32, premaster_secret, 32);\n  mg_hmac_sha256(master_secret, premaster_secret, 32, zeros, 32);\n\n  mg_tls_derive_secret(\"tls13 s ap traffic\", master_secret, 32, hash, 32,\n                       server_secret, 32);\n  mg_tls_derive_secret(\"tls13 key\", server_secret, 32, NULL, 0,\n                       tls->enc.server_write_key, keysz);\n  mg_tls_derive_secret(\"tls13 iv\", server_secret, 32, NULL, 0,\n                       tls->enc.server_write_iv, 12);\n  mg_tls_derive_secret(\"tls13 c ap traffic\", master_secret, 32, hash, 32,\n                       client_secret, 32);\n  mg_tls_derive_secret(\"tls13 key\", client_secret, 32, NULL, 0,\n                       tls->enc.client_write_key, keysz);\n  mg_tls_derive_secret(\"tls13 iv\", client_secret, 32, NULL, 0,\n                       tls->enc.client_write_iv, 12);\n\n  mg_tls_hexdump(\"s ap traffic\", server_secret, 32);\n  mg_tls_hexdump(\"s key\", tls->enc.server_write_key, keysz);\n  mg_tls_hexdump(\"s iv\", tls->enc.server_write_iv, 12);\n  mg_tls_hexdump(\"s finished\", tls->enc.server_finished_key, 32);\n  mg_tls_hexdump(\"c ap traffic\", client_secret, 32);\n  mg_tls_hexdump(\"c key\", tls->enc.client_write_key, keysz);\n  mg_tls_hexdump(\"c iv\", tls->enc.client_write_iv, 12);\n  mg_tls_hexdump(\"c finished\", tls->enc.client_finished_key, 32);\n  tls->enc.sseq = tls->enc.cseq = 0;\n\n#ifdef MG_TLS_SSLKEYLOGFILE\n  mg_ssl_key_log(\"SERVER_TRAFFIC_SECRET_0\", tls->random, server_secret, 32);\n  mg_ssl_key_log(\"CLIENT_TRAFFIC_SECRET_0\", tls->random, client_secret, 32);\n#endif\n}\n\n// AES GCM encryption of the message + put encoded data into the write buffer\nstatic void mg_tls_encrypt(struct mg_connection *c, const uint8_t *msg,\n                           size_t msgsz, uint8_t msgtype) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  struct mg_iobuf *wio = &tls->send;\n  uint8_t *outmsg;\n  uint8_t *tag;\n  size_t encsz = msgsz + 16 + 1;\n  uint8_t hdr[5] = {MG_TLS_APP_DATA, 0x03, 0x03,\n                    (uint8_t) ((encsz >> 8) & 0xff), (uint8_t) (encsz & 0xff)};\n  uint8_t associated_data[5] = {MG_TLS_APP_DATA, 0x03, 0x03,\n                                (uint8_t) ((encsz >> 8) & 0xff),\n                                (uint8_t) (encsz & 0xff)};\n  uint8_t nonce[12];\n\n  uint32_t seq = c->is_client ? tls->enc.cseq : tls->enc.sseq;\n  uint8_t *key =\n      c->is_client ? tls->enc.client_write_key : tls->enc.server_write_key;\n  uint8_t *iv =\n      c->is_client ? tls->enc.client_write_iv : tls->enc.server_write_iv;\n\n#if !CHACHA20\n  mg_gcm_initialize();\n#endif\n\n  memmove(nonce, iv, sizeof(nonce));\n  nonce[8] ^= (uint8_t) ((seq >> 24) & 255U);\n  nonce[9] ^= (uint8_t) ((seq >> 16) & 255U);\n  nonce[10] ^= (uint8_t) ((seq >> 8) & 255U);\n  nonce[11] ^= (uint8_t) ((seq) &255U);\n\n  mg_iobuf_add(wio, wio->len, hdr, sizeof(hdr));\n  mg_iobuf_resize(wio, wio->len + encsz);\n  outmsg = wio->buf + wio->len;\n  tag = wio->buf + wio->len + msgsz + 1;\n  memmove(outmsg, msg, msgsz);\n  outmsg[msgsz] = msgtype;\n#if CHACHA20\n  (void) tag;  // tag is only used in aes gcm\n  {\n    size_t maxlen = MG_IO_SIZE > 16384 ? 16384 : MG_IO_SIZE;\n    uint8_t *enc = (uint8_t *) calloc(1, maxlen + 256 + 1);\n    if (enc == NULL) {\n      mg_error(c, \"TLS OOM\");\n      return;\n    } else {\n      size_t n = mg_chacha20_poly1305_encrypt(enc, key, nonce, associated_data,\n                                              sizeof(associated_data), outmsg,\n                                              msgsz + 1);\n      memmove(outmsg, enc, n);\n      free(enc);\n    }\n  }\n#else\n  mg_aes_gcm_encrypt(outmsg, outmsg, msgsz + 1, key, 16, nonce, sizeof(nonce),\n                     associated_data, sizeof(associated_data), tag, 16);\n#endif\n  c->is_client ? tls->enc.cseq++ : tls->enc.sseq++;\n  wio->len += encsz;\n}\n\n// read an encrypted record, decrypt it in place\nstatic int mg_tls_recv_record(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  struct mg_iobuf *rio = &c->rtls;\n  uint16_t msgsz;\n  uint8_t *msg;\n  uint8_t nonce[12];\n  int r;\n\n  uint32_t seq = c->is_client ? tls->enc.sseq : tls->enc.cseq;\n  uint8_t *key =\n      c->is_client ? tls->enc.server_write_key : tls->enc.client_write_key;\n  uint8_t *iv =\n      c->is_client ? tls->enc.server_write_iv : tls->enc.client_write_iv;\n\n  if (tls->recv_len > 0) {\n    return 0; /* some data from previous record is still present */\n  }\n  for (;;) {\n    if (!mg_tls_got_record(c)) {\n      return MG_IO_WAIT;\n    }\n    if (rio->buf[0] == MG_TLS_APP_DATA) {\n      break;\n    } else if (rio->buf[0] ==\n               MG_TLS_CHANGE_CIPHER) {  // Skip ChangeCipher messages\n      mg_tls_drop_record(c);\n    } else if (rio->buf[0] == MG_TLS_ALERT) {  // Skip Alerts\n      MG_INFO((\"TLS ALERT packet received\"));\n      mg_tls_drop_record(c);\n    } else {\n      mg_error(c, \"unexpected packet\");\n      return -1;\n    }\n  }\n\n  msgsz = MG_LOAD_BE16(rio->buf + 3);\n  msg = rio->buf + 5;\n  if (msgsz < 16) {\n    mg_error(c, \"wrong size\");\n    return -1;\n  }\n\n  memmove(nonce, iv, sizeof(nonce));\n  nonce[8] ^= (uint8_t) ((seq >> 24) & 255U);\n  nonce[9] ^= (uint8_t) ((seq >> 16) & 255U);\n  nonce[10] ^= (uint8_t) ((seq >> 8) & 255U);\n  nonce[11] ^= (uint8_t) ((seq) &255U);\n\n#if CHACHA20\n  {\n    uint8_t *dec = (uint8_t *) calloc(1, msgsz);\n    size_t n;\n    if (dec == NULL) {\n      mg_error(c, \"TLS OOM\");\n      return -1;\n    }\n    n = mg_chacha20_poly1305_decrypt(dec, key, nonce, msg, msgsz);\n    memmove(msg, dec, n);\n    free(dec);\n  }\n#else\n  mg_gcm_initialize();\n  mg_aes_gcm_decrypt(msg, msg, msgsz - 16, key, 16, nonce, sizeof(nonce));\n#endif\n\n  r = msgsz - 16 - 1;\n  tls->content_type = msg[msgsz - 16 - 1];\n  tls->recv_offset = (size_t) msg - (size_t) rio->buf;\n  tls->recv_len = msgsz - 16 - 1;\n  c->is_client ? tls->enc.sseq++ : tls->enc.cseq++;\n  return r;\n}\n\nstatic void mg_tls_calc_cert_verify_hash(struct mg_connection *c,\n                                         uint8_t hash[32], int is_client) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  uint8_t server_context[34] = \"TLS 1.3, server CertificateVerify\";\n  uint8_t client_context[34] = \"TLS 1.3, client CertificateVerify\";\n  uint8_t sig_content[130];\n  mg_sha256_ctx sha256;\n\n  memset(sig_content, 0x20, 64);\n  if (is_client) {\n    memmove(sig_content + 64, client_context, sizeof(client_context));\n  } else {\n    memmove(sig_content + 64, server_context, sizeof(server_context));\n  }\n\n  memmove(&sha256, &tls->sha256, sizeof(mg_sha256_ctx));\n  mg_sha256_final(sig_content + 98, &sha256);\n\n  mg_sha256_init(&sha256);\n  mg_sha256_update(&sha256, sig_content, sizeof(sig_content));\n  mg_sha256_final(hash, &sha256);\n}\n\n// read and parse ClientHello record\nstatic int mg_tls_server_recv_hello(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  struct mg_iobuf *rio = &c->rtls;\n  uint8_t session_id_len;\n  uint16_t j;\n  uint16_t cipher_suites_len;\n  uint16_t ext_len;\n  uint8_t *ext;\n  uint16_t msgsz;\n\n  if (!mg_tls_got_record(c)) {\n    return MG_IO_WAIT;\n  }\n  if (rio->buf[0] != MG_TLS_HANDSHAKE || rio->buf[5] != MG_TLS_CLIENT_HELLO) {\n    mg_error(c, \"not a client hello packet\");\n    return -1;\n  }\n  msgsz = MG_LOAD_BE16(rio->buf + 3);\n  mg_sha256_update(&tls->sha256, rio->buf + 5, msgsz);\n  // store client random\n  memmove(tls->random, rio->buf + 11, sizeof(tls->random));\n  // store session_id\n  session_id_len = rio->buf[43];\n  if (session_id_len == sizeof(tls->session_id)) {\n    memmove(tls->session_id, rio->buf + 44, session_id_len);\n  } else if (session_id_len != 0) {\n    MG_INFO((\"bad session id len\"));\n  }\n  cipher_suites_len = MG_LOAD_BE16(rio->buf + 44 + session_id_len);\n  if (cipher_suites_len > (rio->len - 46 - session_id_len)) goto fail;\n  ext_len = MG_LOAD_BE16(rio->buf + 48 + session_id_len + cipher_suites_len);\n  ext = rio->buf + 50 + session_id_len + cipher_suites_len;\n  if (ext_len > (rio->len - 50 - session_id_len - cipher_suites_len)) goto fail;\n  for (j = 0; j < ext_len;) {\n    uint16_t k;\n    uint16_t key_exchange_len;\n    uint8_t *key_exchange;\n    uint16_t n = MG_LOAD_BE16(ext + j + 2);\n    if (ext[j] != 0x00 ||\n        ext[j + 1] != 0x33) {  // not a key share extension, ignore\n      j += (uint16_t) (n + 4);\n      continue;\n    }\n    key_exchange_len = MG_LOAD_BE16(ext + j + 4);\n    key_exchange = ext + j + 6;\n    if (key_exchange_len >\n        rio->len - (uint16_t) ((size_t) key_exchange - (size_t) rio->buf) - 2)\n      goto fail;\n    for (k = 0; k < key_exchange_len;) {\n      uint16_t m = MG_LOAD_BE16(key_exchange + k + 2);\n      if (m > (key_exchange_len - k - 4)) goto fail;\n      if (m == 32 && key_exchange[k] == 0x00 && key_exchange[k + 1] == 0x1d) {\n        memmove(tls->x25519_cli, key_exchange + k + 4, m);\n        mg_tls_drop_record(c);\n        return 0;\n      }\n      k += (uint16_t) (m + 4);\n    }\n    j += (uint16_t) (n + 4);\n  }\nfail:\n  mg_error(c, \"bad client hello\");\n  return -1;\n}\n\n#define PLACEHOLDER_8B 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'\n#define PLACEHOLDER_16B PLACEHOLDER_8B, PLACEHOLDER_8B\n#define PLACEHOLDER_32B PLACEHOLDER_16B, PLACEHOLDER_16B\n\n// put ServerHello record into wio buffer\nstatic void mg_tls_server_send_hello(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  struct mg_iobuf *wio = &tls->send;\n\n  // clang-format off\n  uint8_t msg_server_hello[122] = {\n      // server hello, tls 1.2\n      0x02, 0x00, 0x00, 0x76, 0x03, 0x03,\n      // random (32 bytes)\n      PLACEHOLDER_32B,\n      // session ID length + session ID (32 bytes)\n      0x20, PLACEHOLDER_32B,\n#if defined(CHACHA20) && CHACHA20\n      // TLS_CHACHA20_POLY1305_SHA256 + no compression\n      0x13, 0x03, 0x00,\n#else\n      // TLS_AES_128_GCM_SHA256 + no compression\n      0x13, 0x01, 0x00,\n#endif\n      // extensions + keyshare\n      0x00, 0x2e, 0x00, 0x33, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x20,\n      // x25519 keyshare\n      PLACEHOLDER_32B,\n      // supported versions (tls1.3 == 0x304)\n      0x00, 0x2b, 0x00, 0x02, 0x03, 0x04};\n  // clang-format on\n\n  // calculate keyshare\n  uint8_t x25519_pub[X25519_BYTES];\n  uint8_t x25519_prv[X25519_BYTES];\n  if (!mg_random(x25519_prv, sizeof(x25519_prv))) mg_error(c, \"RNG\"); \n  mg_tls_x25519(x25519_pub, x25519_prv, X25519_BASE_POINT, 1);\n  mg_tls_x25519(tls->x25519_sec, x25519_prv, tls->x25519_cli, 1);\n  mg_tls_hexdump(\"s x25519 sec\", tls->x25519_sec, sizeof(tls->x25519_sec));\n\n  // fill in the gaps: random + session ID + keyshare\n  memmove(msg_server_hello + 6, tls->random, sizeof(tls->random));\n  memmove(msg_server_hello + 39, tls->session_id, sizeof(tls->session_id));\n  memmove(msg_server_hello + 84, x25519_pub, sizeof(x25519_pub));\n\n  // server hello message\n  mg_iobuf_add(wio, wio->len, \"\\x16\\x03\\x03\\x00\\x7a\", 5);\n  mg_iobuf_add(wio, wio->len, msg_server_hello, sizeof(msg_server_hello));\n  mg_sha256_update(&tls->sha256, msg_server_hello, sizeof(msg_server_hello));\n\n  // change cipher message\n  mg_iobuf_add(wio, wio->len, \"\\x14\\x03\\x03\\x00\\x01\\x01\", 6);\n}\n\nstatic void mg_tls_server_send_ext(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  // server extensions\n  uint8_t ext[6] = {0x08, 0, 0, 2, 0, 0};\n  mg_sha256_update(&tls->sha256, ext, sizeof(ext));\n  mg_tls_encrypt(c, ext, sizeof(ext), MG_TLS_HANDSHAKE);\n}\n\nstatic void mg_tls_server_send_cert(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  // server DER certificate (empty)\n  size_t n = tls->cert_der.len;\n  uint8_t *cert = (uint8_t *) calloc(1, 13 + n);\n  if (cert == NULL) {\n    mg_error(c, \"tls cert oom\");\n    return;\n  }\n  cert[0] = 0x0b;                                // handshake header\n  cert[1] = (uint8_t) (((n + 9) >> 16) & 255U);  // 3 bytes: payload length\n  cert[2] = (uint8_t) (((n + 9) >> 8) & 255U);\n  cert[3] = (uint8_t) ((n + 9) & 255U);\n  cert[4] = 0;                                   // request context\n  cert[5] = (uint8_t) (((n + 5) >> 16) & 255U);  // 3 bytes: cert (s) length\n  cert[6] = (uint8_t) (((n + 5) >> 8) & 255U);\n  cert[7] = (uint8_t) ((n + 5) & 255U);\n  cert[8] =\n      (uint8_t) (((n) >> 16) & 255U);  // 3 bytes: first (and only) cert len\n  cert[9] = (uint8_t) (((n) >> 8) & 255U);\n  cert[10] = (uint8_t) (n & 255U);\n  // bytes 11+ are certificate in DER format\n  memmove(cert + 11, tls->cert_der.buf, n);\n  cert[11 + n] = cert[12 + n] = 0;  // certificate extensions (none)\n  mg_sha256_update(&tls->sha256, cert, 13 + n);\n  mg_tls_encrypt(c, cert, 13 + n, MG_TLS_HANDSHAKE);\n  free(cert);\n}\n\n// type adapter between uECC hash context and our sha256 implementation\ntypedef struct SHA256_HashContext {\n  MG_UECC_HashContext uECC;\n  mg_sha256_ctx ctx;\n} SHA256_HashContext;\n\nstatic void init_SHA256(const MG_UECC_HashContext *base) {\n  SHA256_HashContext *c = (SHA256_HashContext *) base;\n  mg_sha256_init(&c->ctx);\n}\n\nstatic void update_SHA256(const MG_UECC_HashContext *base,\n                          const uint8_t *message, unsigned message_size) {\n  SHA256_HashContext *c = (SHA256_HashContext *) base;\n  mg_sha256_update(&c->ctx, message, message_size);\n}\nstatic void finish_SHA256(const MG_UECC_HashContext *base,\n                          uint8_t *hash_result) {\n  SHA256_HashContext *c = (SHA256_HashContext *) base;\n  mg_sha256_final(hash_result, &c->ctx);\n}\n\nstatic void mg_tls_send_cert_verify(struct mg_connection *c, int is_client) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  // server certificate verify packet\n  uint8_t verify[82] = {0x0f, 0x00, 0x00, 0x00, 0x04, 0x03, 0x00, 0x00};\n  size_t sigsz, verifysz = 0;\n  uint8_t hash[32] = {0}, tmp[2 * 32 + 64] = {0};\n  struct SHA256_HashContext ctx = {\n      {&init_SHA256, &update_SHA256, &finish_SHA256, 64, 32, tmp},\n      {{0}, 0, 0, {0}}};\n  int neg1, neg2;\n  uint8_t sig[64] = {0};\n\n  mg_tls_calc_cert_verify_hash(c, (uint8_t *) hash, is_client);\n\n  mg_uecc_sign_deterministic(tls->ec_key, hash, sizeof(hash), &ctx.uECC, sig,\n                             mg_uecc_secp256r1());\n\n  neg1 = !!(sig[0] & 0x80);\n  neg2 = !!(sig[32] & 0x80);\n  verify[8] = 0x30;  // ASN.1 SEQUENCE\n  verify[9] = (uint8_t) (68 + neg1 + neg2);\n  verify[10] = 0x02;  // ASN.1 INTEGER\n  verify[11] = (uint8_t) (32 + neg1);\n  memmove(verify + 12 + neg1, sig, 32);\n  verify[12 + 32 + neg1] = 0x02;  // ASN.1 INTEGER\n  verify[13 + 32 + neg1] = (uint8_t) (32 + neg2);\n  memmove(verify + 14 + 32 + neg1 + neg2, sig + 32, 32);\n\n  sigsz = (size_t) (70 + neg1 + neg2);\n  verifysz = 8U + sigsz;\n  verify[3] = (uint8_t) (sigsz + 4);\n  verify[7] = (uint8_t) sigsz;\n\n  mg_sha256_update(&tls->sha256, verify, verifysz);\n  mg_tls_encrypt(c, verify, verifysz, MG_TLS_HANDSHAKE);\n}\n\nstatic void mg_tls_server_send_finish(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  struct mg_iobuf *wio = &tls->send;\n  mg_sha256_ctx sha256;\n  uint8_t hash[32];\n  uint8_t finish[36] = {0x14, 0, 0, 32};\n  memmove(&sha256, &tls->sha256, sizeof(mg_sha256_ctx));\n  mg_sha256_final(hash, &sha256);\n  mg_hmac_sha256(finish + 4, tls->enc.server_finished_key, 32, hash, 32);\n  mg_tls_encrypt(c, finish, sizeof(finish), MG_TLS_HANDSHAKE);\n  mg_io_send(c, wio->buf, wio->len);\n  wio->len = 0;\n\n  mg_sha256_update(&tls->sha256, finish, sizeof(finish));\n}\n\nstatic int mg_tls_server_recv_finish(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf;\n  // we have to backup sha256 value to restore it later, since Finished record\n  // is exceptional and is not supposed to be added to the rolling hash\n  // calculation.\n  mg_sha256_ctx sha256 = tls->sha256;\n  if (mg_tls_recv_record(c) < 0) {\n    return -1;\n  }\n  recv_buf = &c->rtls.buf[tls->recv_offset];\n  if (recv_buf[0] != MG_TLS_FINISHED) {\n    mg_error(c, \"expected Finish but got msg 0x%02x\", recv_buf[0]);\n    return -1;\n  }\n  mg_tls_drop_message(c);\n\n  // restore hash\n  tls->sha256 = sha256;\n  return 0;\n}\n\nstatic void mg_tls_client_send_hello(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  struct mg_iobuf *wio = &tls->send;\n\n  uint8_t x25519_pub[X25519_BYTES];\n\n  // the only signature algorithm we actually support\n  uint8_t secp256r1_sig_algs[8] = {\n      0x00, 0x0d, 0x00, 0x04, 0x00, 0x02, 0x04, 0x03,\n  };\n  // all popular signature algorithms (if we don't care about verification)\n  uint8_t all_sig_algs[34] = {\n      0x00, 0x0d, 0x00, 0x1e, 0x00, 0x1c, 0x04, 0x03, 0x05, 0x03, 0x06, 0x03,\n      0x08, 0x07, 0x08, 0x08, 0x08, 0x09, 0x08, 0x0a, 0x08, 0x0b, 0x08, 0x04,\n      0x08, 0x05, 0x08, 0x06, 0x04, 0x01, 0x05, 0x01, 0x06, 0x01};\n  uint8_t server_name_ext[9] = {0x00, 0x00, 0x00, 0xfe, 0x00,\n                                0xfe, 0x00, 0x00, 0xfe};\n\n  // clang-format off\n  uint8_t msg_client_hello[145] = {\n      // TLS Client Hello header reported as TLS1.2 (5)\n      0x16, 0x03, 0x03, 0x00, 0xfe,\n      // client hello, tls 1.2 (6)\n      0x01, 0x00, 0x00, 0x8c, 0x03, 0x03,\n      // random (32 bytes)\n      PLACEHOLDER_32B,\n      // session ID length + session ID (32 bytes)\n      0x20, PLACEHOLDER_32B, 0x00,\n      0x02,  // size = 2 bytes\n#if defined(CHACHA20) && CHACHA20\n      // TLS_CHACHA20_POLY1305_SHA256\n      0x13, 0x03,\n#else\n      // TLS_AES_128_GCM_SHA256\n      0x13, 0x01,\n#endif\n      // no compression\n      0x01, 0x00,\n      // extensions + keyshare\n      0x00, 0xfe,\n      // x25519 keyshare\n      0x00, 0x33, 0x00, 0x26, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x20,\n      PLACEHOLDER_32B,\n      // supported groups (x25519)\n      0x00, 0x0a, 0x00, 0x04, 0x00, 0x02, 0x00, 0x1d,\n      // supported versions (tls1.3 == 0x304)\n      0x00, 0x2b, 0x00, 0x03, 0x02, 0x03, 0x04,\n      // session ticket (none)\n      0x00, 0x23, 0x00, 0x00, // 144 bytes till here\n\t};\n  // clang-format on\n  const char *hostname = tls->hostname;\n  size_t hostnamesz = strlen(tls->hostname);\n  size_t hostname_extsz = hostnamesz ? hostnamesz + 9 : 0;\n  uint8_t *sig_alg = tls->skip_verification ? all_sig_algs : secp256r1_sig_algs;\n  size_t sig_alg_sz = tls->skip_verification ? sizeof(all_sig_algs)\n                                             : sizeof(secp256r1_sig_algs);\n\n  // patch ClientHello with correct hostname ext length (if any)\n  MG_STORE_BE16(msg_client_hello + 3,\n                hostname_extsz + 183 - 9 - 34 + sig_alg_sz);\n  MG_STORE_BE16(msg_client_hello + 7,\n                hostname_extsz + 179 - 9 - 34 + sig_alg_sz);\n  MG_STORE_BE16(msg_client_hello + 82,\n                hostname_extsz + 104 - 9 - 34 + sig_alg_sz);\n\n  if (hostnamesz > 0) {\n    MG_STORE_BE16(server_name_ext + 2, hostnamesz + 5);\n    MG_STORE_BE16(server_name_ext + 4, hostnamesz + 3);\n    MG_STORE_BE16(server_name_ext + 7, hostnamesz);\n  }\n\n  // calculate keyshare\n  if (!mg_random(tls->x25519_cli, sizeof(tls->x25519_cli))) mg_error(c, \"RNG\");\n  mg_tls_x25519(x25519_pub, tls->x25519_cli, X25519_BASE_POINT, 1);\n\n  // fill in the gaps: random + session ID + keyshare\n  if (!mg_random(tls->session_id, sizeof(tls->session_id))) mg_error(c, \"RNG\");\n  if (!mg_random(tls->random, sizeof(tls->random))) mg_error(c, \"RNG\");\n  memmove(msg_client_hello + 11, tls->random, sizeof(tls->random));\n  memmove(msg_client_hello + 44, tls->session_id, sizeof(tls->session_id));\n  memmove(msg_client_hello + 94, x25519_pub, sizeof(x25519_pub));\n\n  // client hello message\n  mg_iobuf_add(wio, wio->len, msg_client_hello, sizeof(msg_client_hello));\n  mg_sha256_update(&tls->sha256, msg_client_hello + 5,\n                   sizeof(msg_client_hello) - 5);\n  mg_iobuf_add(wio, wio->len, sig_alg, sig_alg_sz);\n  mg_sha256_update(&tls->sha256, sig_alg, sig_alg_sz);\n  if (hostnamesz > 0) {\n    mg_iobuf_add(wio, wio->len, server_name_ext, sizeof(server_name_ext));\n    mg_iobuf_add(wio, wio->len, hostname, hostnamesz);\n    mg_sha256_update(&tls->sha256, server_name_ext, sizeof(server_name_ext));\n    mg_sha256_update(&tls->sha256, (uint8_t *) hostname, hostnamesz);\n  }\n\n  // change cipher message\n  mg_iobuf_add(wio, wio->len, (const char *) \"\\x14\\x03\\x03\\x00\\x01\\x01\", 6);\n  mg_io_send(c, wio->buf, wio->len);\n  wio->len = 0;\n}\n\nstatic int mg_tls_client_recv_hello(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  struct mg_iobuf *rio = &c->rtls;\n  uint16_t msgsz;\n  uint8_t *ext;\n  uint16_t ext_len;\n  int j;\n\n  if (!mg_tls_got_record(c)) {\n    return MG_IO_WAIT;\n  }\n  if (rio->buf[0] != MG_TLS_HANDSHAKE || rio->buf[5] != MG_TLS_SERVER_HELLO) {\n    if (rio->buf[0] == MG_TLS_ALERT && rio->len >= 7) {\n      mg_error(c, \"tls alert %d\", rio->buf[6]);\n      return -1;\n    }\n    MG_INFO((\"got packet type 0x%02x/0x%02x\", rio->buf[0], rio->buf[5]));\n    mg_error(c, \"not a server hello packet\");\n    return -1;\n  }\n\n  msgsz = MG_LOAD_BE16(rio->buf + 3);\n  mg_sha256_update(&tls->sha256, rio->buf + 5, msgsz);\n\n  ext_len = MG_LOAD_BE16(rio->buf + 5 + 39 + 32 + 3);\n  ext = rio->buf + 5 + 39 + 32 + 3 + 2;\n  if (ext_len > (rio->len - (5 + 39 + 32 + 3 + 2))) goto fail;\n\n  for (j = 0; j < ext_len;) {\n    uint16_t ext_type = MG_LOAD_BE16(ext + j);\n    uint16_t ext_len2 = MG_LOAD_BE16(ext + j + 2);\n    uint16_t group;\n    uint8_t *key_exchange;\n    uint16_t key_exchange_len;\n    if (ext_len2 > (ext_len - j - 4)) goto fail;\n    if (ext_type != 0x0033) {  // not a key share extension, ignore\n      j += (uint16_t) (ext_len2 + 4);\n      continue;\n    }\n    group = MG_LOAD_BE16(ext + j + 4);\n    if (group != 0x001d) {\n      mg_error(c, \"bad key exchange group\");\n      return -1;\n    }\n    key_exchange_len = MG_LOAD_BE16(ext + j + 6);\n    key_exchange = ext + j + 8;\n    if (key_exchange_len != 32) {\n      mg_error(c, \"bad key exchange length\");\n      return -1;\n    }\n    mg_tls_x25519(tls->x25519_sec, tls->x25519_cli, key_exchange, 1);\n    mg_tls_hexdump(\"c x25519 sec\", tls->x25519_sec, 32);\n    mg_tls_drop_record(c);\n    /* generate handshake keys */\n    mg_tls_generate_handshake_keys(c);\n    return 0;\n  }\nfail:\n  mg_error(c, \"bad client hello\");\n  return -1;\n}\n\nstatic int mg_tls_client_recv_ext(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf;\n  if (mg_tls_recv_record(c) < 0) {\n    return -1;\n  }\n  recv_buf = &c->rtls.buf[tls->recv_offset];\n  if (recv_buf[0] != MG_TLS_ENCRYPTED_EXTENSIONS) {\n    mg_error(c, \"expected server extensions but got msg 0x%02x\", recv_buf[0]);\n    return -1;\n  }\n  mg_tls_drop_message(c);\n  return 0;\n}\n\nstatic int mg_tls_client_recv_cert(struct mg_connection *c) {\n  uint8_t *cert;\n  uint32_t certsz;\n  struct mg_der_tlv oid, pubkey, seq, subj;\n  int subj_match = 0;\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf;\n  if (mg_tls_recv_record(c) < 0) {\n    return -1;\n  }\n  recv_buf = &c->rtls.buf[tls->recv_offset];\n  if (recv_buf[0] == MG_TLS_CERTIFICATE_REQUEST) {\n    MG_VERBOSE((\"got certificate request\"));\n    mg_tls_drop_message(c);\n    tls->cert_requested = 1;\n    return -1;\n  }\n  if (recv_buf[0] != MG_TLS_CERTIFICATE) {\n    mg_error(c, \"expected server certificate but got msg 0x%02x\", recv_buf[0]);\n    return -1;\n  }\n  if (tls->skip_verification) {\n    mg_tls_drop_message(c);\n    return 0;\n  }\n\n  if (tls->recv_len < 11) {\n    mg_error(c, \"certificate list too short\");\n    return -1;\n  }\n\n  cert = recv_buf + 11;\n  certsz = MG_LOAD_BE24(recv_buf + 8);\n  if (certsz > tls->recv_len - 11) {\n    mg_error(c, \"certificate too long: %d vs %d\", certsz, tls->recv_len - 11);\n    return -1;\n  }\n\n  do {\n    // secp256r1 public key\n    if (mg_der_find(cert, certsz,\n                    (uint8_t *) \"\\x2A\\x86\\x48\\xCE\\x3D\\x03\\x01\\x07\", 8,\n                    &oid) < 0) {\n      mg_error(c, \"certificate secp256r1 public key OID not found\");\n      return -1;\n    }\n    if (mg_der_to_tlv(oid.value + oid.len,\n                      (size_t) (cert + certsz - (oid.value + oid.len)),\n                      &pubkey) < 0) {\n      mg_error(c, \"certificate secp256r1 public key not found\");\n      return -1;\n    }\n\n    // expect BIT STRING, unpadded, uncompressed: [0]+[4]+32+32 content bytes\n    if (pubkey.type != 3 || pubkey.len != 66 || pubkey.value[0] != 0 ||\n        pubkey.value[1] != 4) {\n      mg_error(c, \"unsupported public key bitstring encoding\");\n      return -1;\n    }\n    memmove(tls->pubkey, pubkey.value + 2, pubkey.len - 2);\n  } while (0);\n\n  // Subject Alternative Names\n  do {\n    if (mg_der_find(cert, certsz, (uint8_t *) \"\\x55\\x1d\\x11\", 3, &oid) < 0) {\n      mg_error(c, \"certificate does not contain subject alternative names\");\n      return -1;\n    }\n    if (mg_der_to_tlv(oid.value + oid.len,\n                      (size_t) (cert + certsz - (oid.value + oid.len)),\n                      &seq) < 0) {\n      mg_error(c, \"certificate subject alternative names not found\");\n      return -1;\n    }\n    if (mg_der_to_tlv(seq.value, seq.len, &seq) < 0) {\n      mg_error(\n          c,\n          \"certificate subject alternative names is not a constructed object\");\n      return -1;\n    }\n    MG_VERBOSE((\"verify hostname %s\", tls->hostname));\n    while (seq.len > 0) {\n      if (mg_der_to_tlv(seq.value, seq.len, &subj) < 0) {\n        mg_error(c, \"bad subject alternative name\");\n        return -1;\n      }\n      MG_VERBOSE((\"subj=%.*s\", subj.len, subj.value));\n      if (mg_match(mg_str((const char *) tls->hostname),\n                   mg_str_n((const char *) subj.value, subj.len), NULL)) {\n        subj_match = 1;\n        break;\n      }\n      seq.len = (uint32_t) (seq.value + seq.len - (subj.value + subj.len));\n      seq.value = subj.value + subj.len;\n    }\n    if (!subj_match) {\n      mg_error(c, \"certificate did not match the hostname\");\n      return -1;\n    }\n  } while (0);\n\n  mg_tls_drop_message(c);\n  mg_tls_calc_cert_verify_hash(c, tls->sighash, 0);\n  return 0;\n}\n\nstatic int mg_tls_client_recv_cert_verify(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf;\n  if (mg_tls_recv_record(c) < 0) {\n    return -1;\n  }\n  recv_buf = &c->rtls.buf[tls->recv_offset];\n  if (recv_buf[0] != MG_TLS_CERTIFICATE_VERIFY) {\n    mg_error(c, \"expected server certificate verify but got msg 0x%02x\", recv_buf[0]);\n    return -1;\n  }\n  // Ignore CertificateVerify is strict checks are not required\n  if (tls->skip_verification) {\n    mg_tls_drop_message(c);\n    return 0;\n  }\n\n  // Extract certificate signature and verify it using pubkey and sighash\n  do {\n    uint8_t sig[64];\n    struct mg_der_tlv seq, a, b;\n    if (mg_der_to_tlv(recv_buf + 8, tls->recv_len - 8, &seq) < 0) {\n      mg_error(c, \"verification message is not an ASN.1 DER sequence\");\n      return -1;\n    }\n    if (mg_der_to_tlv(seq.value, seq.len, &a) < 0) {\n      mg_error(c, \"missing first part of the signature\");\n      return -1;\n    }\n    if (mg_der_to_tlv(a.value + a.len, seq.len - a.len, &b) < 0) {\n      mg_error(c, \"missing second part of the signature\");\n      return -1;\n    }\n    // Integers may be padded with zeroes\n    if (a.len > 32) {\n      a.value = a.value + (a.len - 32);\n      a.len = 32;\n    }\n    if (b.len > 32) {\n      b.value = b.value + (b.len - 32);\n      b.len = 32;\n    }\n\n    memmove(sig, a.value, a.len);\n    memmove(sig + 32, b.value, b.len);\n\n    if (mg_uecc_verify(tls->pubkey, tls->sighash, sizeof(tls->sighash), sig,\n                       mg_uecc_secp256r1()) != 1) {\n      mg_error(c, \"failed to verify certificate\");\n      return -1;\n    }\n  } while (0);\n\n  mg_tls_drop_message(c);\n  return 0;\n}\n\nstatic int mg_tls_client_recv_finish(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf;\n  if (mg_tls_recv_record(c) < 0) {\n    return -1;\n  }\n  recv_buf = &c->rtls.buf[tls->recv_offset];\n  if (recv_buf[0] != MG_TLS_FINISHED) {\n    mg_error(c, \"expected server finished but got msg 0x%02x\", recv_buf[0]);\n    return -1;\n  }\n  mg_tls_drop_message(c);\n  return 0;\n}\n\nstatic void mg_tls_client_send_finish(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  struct mg_iobuf *wio = &tls->send;\n  mg_sha256_ctx sha256;\n  uint8_t hash[32];\n  uint8_t finish[36] = {0x14, 0, 0, 32};\n  memmove(&sha256, &tls->sha256, sizeof(mg_sha256_ctx));\n  mg_sha256_final(hash, &sha256);\n  mg_hmac_sha256(finish + 4, tls->enc.client_finished_key, 32, hash, 32);\n  mg_tls_encrypt(c, finish, sizeof(finish), MG_TLS_HANDSHAKE);\n  mg_io_send(c, wio->buf, wio->len);\n  wio->len = 0;\n}\n\nstatic void mg_tls_client_handshake(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  switch (tls->state) {\n    case MG_TLS_STATE_CLIENT_START:\n      mg_tls_client_send_hello(c);\n      tls->state = MG_TLS_STATE_CLIENT_WAIT_SH;\n      // Fallthrough\n    case MG_TLS_STATE_CLIENT_WAIT_SH:\n      if (mg_tls_client_recv_hello(c) < 0) {\n        break;\n      }\n      tls->state = MG_TLS_STATE_CLIENT_WAIT_EE;\n      // Fallthrough\n    case MG_TLS_STATE_CLIENT_WAIT_EE:\n      if (mg_tls_client_recv_ext(c) < 0) {\n        break;\n      }\n      tls->state = MG_TLS_STATE_CLIENT_WAIT_CERT;\n      // Fallthrough\n    case MG_TLS_STATE_CLIENT_WAIT_CERT:\n      if (mg_tls_client_recv_cert(c) < 0) {\n        break;\n      }\n      tls->state = MG_TLS_STATE_CLIENT_WAIT_CV;\n      // Fallthrough\n    case MG_TLS_STATE_CLIENT_WAIT_CV:\n      if (mg_tls_client_recv_cert_verify(c) < 0) {\n        break;\n      }\n      tls->state = MG_TLS_STATE_CLIENT_WAIT_FINISHED;\n      // Fallthrough\n    case MG_TLS_STATE_CLIENT_WAIT_FINISHED:\n      if (mg_tls_client_recv_finish(c) < 0) {\n        break;\n      }\n      if (tls->cert_requested) {\n        /* for mTLS we should generate application keys at this point\n         * but then restore handshake keys and continue with\n         * the rest of the handshake */\n        struct tls_enc app_keys;\n        struct tls_enc hs_keys = tls->enc;\n        mg_tls_generate_application_keys(c);\n        app_keys = tls->enc;\n        tls->enc = hs_keys;\n        mg_tls_server_send_cert(c);\n        mg_tls_send_cert_verify(c, 1);\n        mg_tls_client_send_finish(c);\n        tls->enc = app_keys;\n      } else {\n        mg_tls_client_send_finish(c);\n        mg_tls_generate_application_keys(c);\n      }\n      tls->state = MG_TLS_STATE_CLIENT_CONNECTED;\n      c->is_tls_hs = 0;\n      break;\n    default:\n      mg_error(c, \"unexpected client state: %d\", tls->state);\n      break;\n  }\n}\n\nstatic void mg_tls_server_handshake(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  switch (tls->state) {\n    case MG_TLS_STATE_SERVER_START:\n      if (mg_tls_server_recv_hello(c) < 0) {\n        return;\n      }\n      mg_tls_server_send_hello(c);\n      mg_tls_generate_handshake_keys(c);\n      mg_tls_server_send_ext(c);\n      mg_tls_server_send_cert(c);\n      mg_tls_send_cert_verify(c, 0);\n      mg_tls_server_send_finish(c);\n      tls->state = MG_TLS_STATE_SERVER_NEGOTIATED;\n      // fallthrough\n    case MG_TLS_STATE_SERVER_NEGOTIATED:\n      if (mg_tls_server_recv_finish(c) < 0) {\n        return;\n      }\n      mg_tls_generate_application_keys(c);\n      tls->state = MG_TLS_STATE_SERVER_CONNECTED;\n      c->is_tls_hs = 0;\n      return;\n    default:\n      mg_error(c, \"unexpected server state: %d\", tls->state);\n      break;\n  }\n}\n\nvoid mg_tls_handshake(struct mg_connection *c) {\n  if (c->is_client) {\n    mg_tls_client_handshake(c);\n  } else {\n    mg_tls_server_handshake(c);\n  }\n}\n\nstatic int mg_parse_pem(const struct mg_str pem, const struct mg_str label,\n                        struct mg_str *der) {\n  size_t n = 0, m = 0;\n  char *s;\n  const char *c;\n  struct mg_str caps[6];  // number of wildcards + 1\n  if (!mg_match(pem, mg_str(\"#-----BEGIN #-----#-----END #-----#\"), caps)) {\n    *der = mg_strdup(pem);\n    return 0;\n  }\n  if (mg_strcmp(caps[1], label) != 0 || mg_strcmp(caps[3], label) != 0) {\n    return -1;  // bad label\n  }\n  if ((s = (char *) calloc(1, caps[2].len)) == NULL) {\n    return -1;\n  }\n\n  for (c = caps[2].buf; c < caps[2].buf + caps[2].len; c++) {\n    if (*c == ' ' || *c == '\\n' || *c == '\\r' || *c == '\\t') {\n      continue;\n    }\n    s[n++] = *c;\n  }\n  m = mg_base64_decode(s, n, s, n);\n  if (m == 0) {\n    free(s);\n    return -1;\n  }\n  der->buf = s;\n  der->len = m;\n  return 0;\n}\n\nvoid mg_tls_init(struct mg_connection *c, const struct mg_tls_opts *opts) {\n  struct mg_str key;\n  struct tls_data *tls = (struct tls_data *) calloc(1, sizeof(struct tls_data));\n  if (tls == NULL) {\n    mg_error(c, \"tls oom\");\n    return;\n  }\n\n  tls->state =\n      c->is_client ? MG_TLS_STATE_CLIENT_START : MG_TLS_STATE_SERVER_START;\n\n  tls->skip_verification = opts->skip_verification;\n  //tls->send.align = MG_IO_SIZE;\n\n  c->tls = tls;\n  c->is_tls = c->is_tls_hs = 1;\n  mg_sha256_init(&tls->sha256);\n\n  // save hostname (client extension)\n  if (opts->name.len > 0) {\n    if (opts->name.len >= sizeof(tls->hostname) - 1) {\n      mg_error(c, \"hostname too long\");\n      return;\n    }\n    strncpy((char *) tls->hostname, opts->name.buf, sizeof(tls->hostname) - 1);\n    tls->hostname[opts->name.len] = 0;\n  }\n\n  if (opts->cert.buf == NULL) {\n    MG_VERBOSE((\"no certificate provided\"));\n    return;\n  }\n\n  // parse PEM or DER certificate\n  if (mg_parse_pem(opts->cert, mg_str_s(\"CERTIFICATE\"), &tls->cert_der) < 0) {\n    MG_ERROR((\"Failed to load certificate\"));\n    return;\n  }\n\n  // parse PEM or DER EC key\n  if (opts->key.buf == NULL) {\n    mg_error(c, \"certificate provided without a private key\");\n    return;\n  }\n\n  if (mg_parse_pem(opts->key, mg_str_s(\"EC PRIVATE KEY\"), &key) == 0) {\n    if (key.len < 39) {\n      MG_ERROR((\"EC private key too short\"));\n      return;\n    }\n    // expect ASN.1 SEQUENCE=[INTEGER=1, BITSTRING of 32 bytes, ...]\n    // 30 nn 02 01 01 04 20 [key] ...\n    if (key.buf[0] != 0x30 || (key.buf[1] & 0x80) != 0) {\n      MG_ERROR((\"EC private key: ASN.1 bad sequence\"));\n      return;\n    }\n    if (memcmp(key.buf + 2, \"\\x02\\x01\\x01\\x04\\x20\", 5) != 0) {\n      MG_ERROR((\"EC private key: ASN.1 bad data\"));\n    }\n    memmove(tls->ec_key, key.buf + 7, 32);\n    free((void *) key.buf);\n  } else if (mg_parse_pem(opts->key, mg_str_s(\"PRIVATE KEY\"), &key) == 0) {\n    mg_error(c, \"PKCS8 private key format is not supported\");\n  } else {\n    mg_error(c, \"expected EC PRIVATE KEY or PRIVATE KEY\");\n  }\n}\n\nvoid mg_tls_free(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  if (tls != NULL) {\n    mg_iobuf_free(&tls->send);\n    free((void *) tls->cert_der.buf);\n  }\n  free(c->tls);\n  c->tls = NULL;\n}\n\nlong mg_tls_send(struct mg_connection *c, const void *buf, size_t len) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  long n = MG_IO_WAIT;\n  size_t maxsize = 256, encrypted = 0;\n  if (len > MG_IO_SIZE) len = MG_IO_SIZE;\n  if (len > 16384) len = 16384;\n  while (encrypted < len) {\n    const uint8_t *chunk = (const uint8_t *) buf + encrypted;\n    size_t chunksize = len - encrypted;\n    if (chunksize > maxsize) chunksize = maxsize;\n    mg_tls_encrypt(c, chunk, chunksize, MG_TLS_APP_DATA);\n    encrypted += chunksize;\n  }\n  while (tls->send.len > 0 &&\n         (n = mg_io_send(c, tls->send.buf, tls->send.len)) > 0) {\n    mg_iobuf_del(&tls->send, 0, (size_t) n);\n  }\n  if (n == MG_IO_ERR || n == MG_IO_WAIT) return n;\n  return (long) len;\n}\n\nlong mg_tls_recv(struct mg_connection *c, void *buf, size_t len) {\n  int r = 0;\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  unsigned char *recv_buf;\n  size_t minlen;\n\n  r = mg_tls_recv_record(c);\n  if (r < 0) {\n    return r;\n  }\n  recv_buf = &c->rtls.buf[tls->recv_offset];\n\n  if (tls->content_type != MG_TLS_APP_DATA) {\n    tls->recv_len = 0;\n    mg_tls_drop_record(c);\n    return MG_IO_WAIT;\n  }\n  minlen = len < tls->recv_len ? len : tls->recv_len;\n  memmove(buf, recv_buf, minlen);\n  tls->recv_offset += minlen;\n  tls->recv_len -= minlen;\n  if (tls->recv_len == 0) {\n    mg_tls_drop_record(c);\n  }\n  return (long) minlen;\n}\n\nsize_t mg_tls_pending(struct mg_connection *c) {\n  struct tls_data *tls = (struct tls_data *) c->tls;\n  return tls != NULL ? tls->recv_len : 0;\n}\n\nvoid mg_tls_ctx_init(struct mg_mgr *mgr) {\n  (void) mgr;\n}\n\nvoid mg_tls_ctx_free(struct mg_mgr *mgr) {\n  (void) mgr;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/tls_chacha20.c\"\n#endif\n// portable8439 v1.0.1\n// Source: https://github.com/DavyLandman/portable8439\n// Licensed under CC0-1.0\n// Contains poly1305-donna e6ad6e091d30d7f4ec2d4f978be1fcfcbce72781 (Public\n// Domain)\n\n\n\n\n#if MG_TLS == MG_TLS_BUILTIN\n// ******* BEGIN: chacha-portable/chacha-portable.h ********\n\n#if !defined(__cplusplus) && !defined(_MSC_VER) && \\\n    (!defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L)\n#error \"C99 or newer required\"\n#endif\n\n#define CHACHA20_KEY_SIZE (32)\n#define CHACHA20_NONCE_SIZE (12)\n\n#if defined(_MSC_VER) || defined(__cplusplus)\n// add restrict support\n#if (defined(_MSC_VER) && _MSC_VER >= 1900) || defined(__clang__) || \\\n    defined(__GNUC__)\n#define restrict __restrict\n#else\n#define restrict\n#endif\n#endif\n\n// xor data with a ChaCha20 keystream as per RFC8439\nstatic PORTABLE_8439_DECL void chacha20_xor_stream(\n    uint8_t *restrict dest, const uint8_t *restrict source, size_t length,\n    const uint8_t key[CHACHA20_KEY_SIZE],\n    const uint8_t nonce[CHACHA20_NONCE_SIZE], uint32_t counter);\n\nstatic PORTABLE_8439_DECL void rfc8439_keygen(\n    uint8_t poly_key[32], const uint8_t key[CHACHA20_KEY_SIZE],\n    const uint8_t nonce[CHACHA20_NONCE_SIZE]);\n\n// ******* END:   chacha-portable/chacha-portable.h ********\n// ******* BEGIN: poly1305-donna/poly1305-donna.h ********\n\n#include <stddef.h>\n\ntypedef struct poly1305_context {\n  size_t aligner;\n  unsigned char opaque[136];\n} poly1305_context;\n\nstatic PORTABLE_8439_DECL void poly1305_init(poly1305_context *ctx,\n                                             const unsigned char key[32]);\nstatic PORTABLE_8439_DECL void poly1305_update(poly1305_context *ctx,\n                                               const unsigned char *m,\n                                               size_t bytes);\nstatic PORTABLE_8439_DECL void poly1305_finish(poly1305_context *ctx,\n                                               unsigned char mac[16]);\n\n// ******* END:   poly1305-donna/poly1305-donna.h ********\n// ******* BEGIN: chacha-portable.c ********\n\n#include <assert.h>\n#include <string.h>\n\n// this is a fresh implementation of chacha20, based on the description in\n// rfc8349 it's such a nice compact algorithm that it is easy to do. In\n// relationship to other c implementation this implementation:\n//  - pure c99\n//  - big & little endian support\n//  - safe for architectures that don't support unaligned reads\n//\n// Next to this, we try to be fast as possible without resorting inline\n// assembly.\n\n// based on https://sourceforge.net/p/predef/wiki/Endianness/\n#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \\\n    __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__\n#define __HAVE_LITTLE_ENDIAN 1\n#elif defined(__LITTLE_ENDIAN__) || defined(__ARMEL__) ||                 \\\n    defined(__THUMBEL__) || defined(__AARCH64EL__) || defined(_MIPSEL) || \\\n    defined(__MIPSEL) || defined(__MIPSEL__) || defined(__XTENSA_EL__) || \\\n    defined(__AVR__) || defined(LITTLE_ENDIAN)\n#define __HAVE_LITTLE_ENDIAN 1\n#endif\n\n#ifndef TEST_SLOW_PATH\n#if defined(__HAVE_LITTLE_ENDIAN)\n#define FAST_PATH\n#endif\n#endif\n\n#define CHACHA20_STATE_WORDS (16)\n#define CHACHA20_BLOCK_SIZE (CHACHA20_STATE_WORDS * sizeof(uint32_t))\n\n#ifdef FAST_PATH\n#define store_32_le(target, source) memcpy(&(target), source, sizeof(uint32_t))\n#else\n#define store_32_le(target, source)                                 \\\n  target = (uint32_t) (source)[0] | ((uint32_t) (source)[1]) << 8 | \\\n           ((uint32_t) (source)[2]) << 16 | ((uint32_t) (source)[3]) << 24\n#endif\n\nstatic void initialize_state(uint32_t state[CHACHA20_STATE_WORDS],\n                             const uint8_t key[CHACHA20_KEY_SIZE],\n                             const uint8_t nonce[CHACHA20_NONCE_SIZE],\n                             uint32_t counter) {\n#ifdef static_assert\n  static_assert(sizeof(uint32_t) == 4,\n                \"We don't support systems that do not conform to standard of \"\n                \"uint32_t being exact 32bit wide\");\n#endif\n  state[0] = 0x61707865;\n  state[1] = 0x3320646e;\n  state[2] = 0x79622d32;\n  state[3] = 0x6b206574;\n  store_32_le(state[4], key);\n  store_32_le(state[5], key + 4);\n  store_32_le(state[6], key + 8);\n  store_32_le(state[7], key + 12);\n  store_32_le(state[8], key + 16);\n  store_32_le(state[9], key + 20);\n  store_32_le(state[10], key + 24);\n  store_32_le(state[11], key + 28);\n  state[12] = counter;\n  store_32_le(state[13], nonce);\n  store_32_le(state[14], nonce + 4);\n  store_32_le(state[15], nonce + 8);\n}\n\n#define increment_counter(state) (state)[12]++\n\n// source: http://blog.regehr.org/archives/1063\n#define rotl32a(x, n) ((x) << (n)) | ((x) >> (32 - (n)))\n\n#define Qround(a, b, c, d) \\\n  a += b;                  \\\n  d ^= a;                  \\\n  d = rotl32a(d, 16);      \\\n  c += d;                  \\\n  b ^= c;                  \\\n  b = rotl32a(b, 12);      \\\n  a += b;                  \\\n  d ^= a;                  \\\n  d = rotl32a(d, 8);       \\\n  c += d;                  \\\n  b ^= c;                  \\\n  b = rotl32a(b, 7);\n\n#define TIMES16(x)                                                          \\\n  x(0) x(1) x(2) x(3) x(4) x(5) x(6) x(7) x(8) x(9) x(10) x(11) x(12) x(13) \\\n      x(14) x(15)\n\nstatic void core_block(const uint32_t *restrict start,\n                       uint32_t *restrict output) {\n  int i;\n// instead of working on the output array,\n// we let the compiler allocate 16 local variables on the stack\n#define __LV(i) uint32_t __t##i = start[i];\n  TIMES16(__LV)\n\n#define __Q(a, b, c, d) Qround(__t##a, __t##b, __t##c, __t##d)\n\n  for (i = 0; i < 10; i++) {\n    __Q(0, 4, 8, 12);\n    __Q(1, 5, 9, 13);\n    __Q(2, 6, 10, 14);\n    __Q(3, 7, 11, 15);\n    __Q(0, 5, 10, 15);\n    __Q(1, 6, 11, 12);\n    __Q(2, 7, 8, 13);\n    __Q(3, 4, 9, 14);\n  }\n\n#define __FIN(i) output[i] = start[i] + __t##i;\n  TIMES16(__FIN)\n}\n\n#define U8(x) ((uint8_t) ((x) &0xFF))\n\n#ifdef FAST_PATH\n#define xor32_le(dst, src, pad)            \\\n  uint32_t __value;                        \\\n  memcpy(&__value, src, sizeof(uint32_t)); \\\n  __value ^= *(pad);                       \\\n  memcpy(dst, &__value, sizeof(uint32_t));\n#else\n#define xor32_le(dst, src, pad)           \\\n  (dst)[0] = (src)[0] ^ U8(*(pad));       \\\n  (dst)[1] = (src)[1] ^ U8(*(pad) >> 8);  \\\n  (dst)[2] = (src)[2] ^ U8(*(pad) >> 16); \\\n  (dst)[3] = (src)[3] ^ U8(*(pad) >> 24);\n#endif\n\n#define index8_32(a, ix) ((a) + ((ix) * sizeof(uint32_t)))\n\n#define xor32_blocks(dest, source, pad, words)                    \\\n  for (i = 0; i < words; i++) {                                   \\\n    xor32_le(index8_32(dest, i), index8_32(source, i), (pad) + i) \\\n  }\n\nstatic void xor_block(uint8_t *restrict dest, const uint8_t *restrict source,\n                      const uint32_t *restrict pad, unsigned int chunk_size) {\n  unsigned int i, full_blocks = chunk_size / (unsigned int) sizeof(uint32_t);\n  // have to be carefull, we are going back from uint32 to uint8, so endianness\n  // matters again\n  xor32_blocks(dest, source, pad, full_blocks)\n\n      dest += full_blocks * sizeof(uint32_t);\n  source += full_blocks * sizeof(uint32_t);\n  pad += full_blocks;\n\n  switch (chunk_size % sizeof(uint32_t)) {\n    case 1:\n      dest[0] = source[0] ^ U8(*pad);\n      break;\n    case 2:\n      dest[0] = source[0] ^ U8(*pad);\n      dest[1] = source[1] ^ U8(*pad >> 8);\n      break;\n    case 3:\n      dest[0] = source[0] ^ U8(*pad);\n      dest[1] = source[1] ^ U8(*pad >> 8);\n      dest[2] = source[2] ^ U8(*pad >> 16);\n      break;\n  }\n}\n\nstatic void chacha20_xor_stream(uint8_t *restrict dest,\n                                const uint8_t *restrict source, size_t length,\n                                const uint8_t key[CHACHA20_KEY_SIZE],\n                                const uint8_t nonce[CHACHA20_NONCE_SIZE],\n                                uint32_t counter) {\n  uint32_t state[CHACHA20_STATE_WORDS];\n  uint32_t pad[CHACHA20_STATE_WORDS];\n  size_t i, b, last_block, full_blocks = length / CHACHA20_BLOCK_SIZE;\n  initialize_state(state, key, nonce, counter);\n  for (b = 0; b < full_blocks; b++) {\n    core_block(state, pad);\n    increment_counter(state);\n    xor32_blocks(dest, source, pad, CHACHA20_STATE_WORDS) dest +=\n        CHACHA20_BLOCK_SIZE;\n    source += CHACHA20_BLOCK_SIZE;\n  }\n  last_block = length % CHACHA20_BLOCK_SIZE;\n  if (last_block > 0) {\n    core_block(state, pad);\n    xor_block(dest, source, pad, (unsigned int) last_block);\n  }\n}\n\n#ifdef FAST_PATH\n#define serialize(poly_key, result) memcpy(poly_key, result, 32)\n#else\n#define store32_le(target, source)   \\\n  (target)[0] = U8(*(source));       \\\n  (target)[1] = U8(*(source) >> 8);  \\\n  (target)[2] = U8(*(source) >> 16); \\\n  (target)[3] = U8(*(source) >> 24);\n\n#define serialize(poly_key, result)                 \\\n  for (i = 0; i < 32 / sizeof(uint32_t); i++) {     \\\n    store32_le(index8_32(poly_key, i), result + i); \\\n  }\n#endif\n\nstatic void rfc8439_keygen(uint8_t poly_key[32],\n                           const uint8_t key[CHACHA20_KEY_SIZE],\n                           const uint8_t nonce[CHACHA20_NONCE_SIZE]) {\n  uint32_t state[CHACHA20_STATE_WORDS];\n  uint32_t result[CHACHA20_STATE_WORDS];\n  size_t i;\n  initialize_state(state, key, nonce, 0);\n  core_block(state, result);\n  serialize(poly_key, result);\n  (void) i;\n}\n// ******* END: chacha-portable.c ********\n// ******* BEGIN: poly1305-donna.c ********\n\n/* auto detect between 32bit / 64bit */\n#if /* uint128 available on 64bit system*/                              \\\n    (defined(__SIZEOF_INT128__) &&                                      \\\n     defined(__LP64__))                       /* MSVC 64bit compiler */ \\\n    || (defined(_MSC_VER) && defined(_M_X64)) /* gcc >= 4.4 64bit */    \\\n    || (defined(__GNUC__) && defined(__LP64__) &&                       \\\n        ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4))))\n#define __GUESS64\n#else\n#define __GUESS32\n#endif\n\n#if defined(POLY1305_8BIT)\n/*\n        poly1305 implementation using 8 bit * 8 bit = 16 bit multiplication and\n32 bit addition\n\n        based on the public domain reference version in supercop by djb\nstatic */\n\n#if defined(_MSC_VER) && _MSC_VER < 1700\n#define POLY1305_NOINLINE\n#elif defined(_MSC_VER)\n#define POLY1305_NOINLINE __declspec(noinline)\n#elif defined(__GNUC__)\n#define POLY1305_NOINLINE __attribute__((noinline))\n#else\n#define POLY1305_NOINLINE\n#endif\n\n#define poly1305_block_size 16\n\n/* 17 + sizeof(size_t) + 51*sizeof(unsigned char) */\ntypedef struct poly1305_state_internal_t {\n  unsigned char buffer[poly1305_block_size];\n  size_t leftover;\n  unsigned char h[17];\n  unsigned char r[17];\n  unsigned char pad[17];\n  unsigned char final;\n} poly1305_state_internal_t;\n\nstatic void poly1305_init(poly1305_context *ctx, const unsigned char key[32]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  size_t i;\n\n  st->leftover = 0;\n\n  /* h = 0 */\n  for (i = 0; i < 17; i++) st->h[i] = 0;\n\n  /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */\n  st->r[0] = key[0] & 0xff;\n  st->r[1] = key[1] & 0xff;\n  st->r[2] = key[2] & 0xff;\n  st->r[3] = key[3] & 0x0f;\n  st->r[4] = key[4] & 0xfc;\n  st->r[5] = key[5] & 0xff;\n  st->r[6] = key[6] & 0xff;\n  st->r[7] = key[7] & 0x0f;\n  st->r[8] = key[8] & 0xfc;\n  st->r[9] = key[9] & 0xff;\n  st->r[10] = key[10] & 0xff;\n  st->r[11] = key[11] & 0x0f;\n  st->r[12] = key[12] & 0xfc;\n  st->r[13] = key[13] & 0xff;\n  st->r[14] = key[14] & 0xff;\n  st->r[15] = key[15] & 0x0f;\n  st->r[16] = 0;\n\n  /* save pad for later */\n  for (i = 0; i < 16; i++) st->pad[i] = key[i + 16];\n  st->pad[16] = 0;\n\n  st->final = 0;\n}\n\nstatic void poly1305_add(unsigned char h[17], const unsigned char c[17]) {\n  unsigned short u;\n  unsigned int i;\n  for (u = 0, i = 0; i < 17; i++) {\n    u += (unsigned short) h[i] + (unsigned short) c[i];\n    h[i] = (unsigned char) u & 0xff;\n    u >>= 8;\n  }\n}\n\nstatic void poly1305_squeeze(unsigned char h[17], unsigned long hr[17]) {\n  unsigned long u;\n  unsigned int i;\n  u = 0;\n  for (i = 0; i < 16; i++) {\n    u += hr[i];\n    h[i] = (unsigned char) u & 0xff;\n    u >>= 8;\n  }\n  u += hr[16];\n  h[16] = (unsigned char) u & 0x03;\n  u >>= 2;\n  u += (u << 2); /* u *= 5; */\n  for (i = 0; i < 16; i++) {\n    u += h[i];\n    h[i] = (unsigned char) u & 0xff;\n    u >>= 8;\n  }\n  h[16] += (unsigned char) u;\n}\n\nstatic void poly1305_freeze(unsigned char h[17]) {\n  const unsigned char minusp[17] = {0x05, 0x00, 0x00, 0x00, 0x00, 0x00,\n                                    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n                                    0x00, 0x00, 0x00, 0x00, 0xfc};\n  unsigned char horig[17], negative;\n  unsigned int i;\n\n  /* compute h + -p */\n  for (i = 0; i < 17; i++) horig[i] = h[i];\n  poly1305_add(h, minusp);\n\n  /* select h if h < p, or h + -p if h >= p */\n  negative = -(h[16] >> 7);\n  for (i = 0; i < 17; i++) h[i] ^= negative & (horig[i] ^ h[i]);\n}\n\nstatic void poly1305_blocks(poly1305_state_internal_t *st,\n                            const unsigned char *m, size_t bytes) {\n  const unsigned char hibit = st->final ^ 1; /* 1 << 128 */\n\n  while (bytes >= poly1305_block_size) {\n    unsigned long hr[17], u;\n    unsigned char c[17];\n    unsigned int i, j;\n\n    /* h += m */\n    for (i = 0; i < 16; i++) c[i] = m[i];\n    c[16] = hibit;\n    poly1305_add(st->h, c);\n\n    /* h *= r */\n    for (i = 0; i < 17; i++) {\n      u = 0;\n      for (j = 0; j <= i; j++) {\n        u += (unsigned short) st->h[j] * st->r[i - j];\n      }\n      for (j = i + 1; j < 17; j++) {\n        unsigned long v = (unsigned short) st->h[j] * st->r[i + 17 - j];\n        v = ((v << 8) + (v << 6)); /* v *= (5 << 6); */\n        u += v;\n      }\n      hr[i] = u;\n    }\n\n    /* (partial) h %= p */\n    poly1305_squeeze(st->h, hr);\n\n    m += poly1305_block_size;\n    bytes -= poly1305_block_size;\n  }\n}\n\nstatic POLY1305_NOINLINE void poly1305_finish(poly1305_context *ctx,\n                                              unsigned char mac[16]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  size_t i;\n\n  /* process the remaining block */\n  if (st->leftover) {\n    size_t i = st->leftover;\n    st->buffer[i++] = 1;\n    for (; i < poly1305_block_size; i++) st->buffer[i] = 0;\n    st->final = 1;\n    poly1305_blocks(st, st->buffer, poly1305_block_size);\n  }\n\n  /* fully reduce h */\n  poly1305_freeze(st->h);\n\n  /* h = (h + pad) % (1 << 128) */\n  poly1305_add(st->h, st->pad);\n  for (i = 0; i < 16; i++) mac[i] = st->h[i];\n\n  /* zero out the state */\n  for (i = 0; i < 17; i++) st->h[i] = 0;\n  for (i = 0; i < 17; i++) st->r[i] = 0;\n  for (i = 0; i < 17; i++) st->pad[i] = 0;\n}\n#elif defined(POLY1305_16BIT)\n/*\n        poly1305 implementation using 16 bit * 16 bit = 32 bit multiplication\nand 32 bit addition static */\n\n#if defined(_MSC_VER) && _MSC_VER < 1700\n#define POLY1305_NOINLINE\n#elif defined(_MSC_VER)\n#define POLY1305_NOINLINE __declspec(noinline)\n#elif defined(__GNUC__)\n#define POLY1305_NOINLINE __attribute__((noinline))\n#else\n#define POLY1305_NOINLINE\n#endif\n\n#define poly1305_block_size 16\n\n/* 17 + sizeof(size_t) + 18*sizeof(unsigned short) */\ntypedef struct poly1305_state_internal_t {\n  unsigned char buffer[poly1305_block_size];\n  size_t leftover;\n  unsigned short r[10];\n  unsigned short h[10];\n  unsigned short pad[8];\n  unsigned char final;\n} poly1305_state_internal_t;\n\n/* interpret two 8 bit unsigned integers as a 16 bit unsigned integer in little\n * endian */\nstatic unsigned short U8TO16(const unsigned char *p) {\n  return (((unsigned short) (p[0] & 0xff)) |\n          ((unsigned short) (p[1] & 0xff) << 8));\n}\n\n/* store a 16 bit unsigned integer as two 8 bit unsigned integers in little\n * endian */\nstatic void U16TO8(unsigned char *p, unsigned short v) {\n  p[0] = (v) &0xff;\n  p[1] = (v >> 8) & 0xff;\n}\n\nstatic void poly1305_init(poly1305_context *ctx, const unsigned char key[32]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  unsigned short t0, t1, t2, t3, t4, t5, t6, t7;\n  size_t i;\n\n  /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */\n  t0 = U8TO16(&key[0]);\n  st->r[0] = (t0) &0x1fff;\n  t1 = U8TO16(&key[2]);\n  st->r[1] = ((t0 >> 13) | (t1 << 3)) & 0x1fff;\n  t2 = U8TO16(&key[4]);\n  st->r[2] = ((t1 >> 10) | (t2 << 6)) & 0x1f03;\n  t3 = U8TO16(&key[6]);\n  st->r[3] = ((t2 >> 7) | (t3 << 9)) & 0x1fff;\n  t4 = U8TO16(&key[8]);\n  st->r[4] = ((t3 >> 4) | (t4 << 12)) & 0x00ff;\n  st->r[5] = ((t4 >> 1)) & 0x1ffe;\n  t5 = U8TO16(&key[10]);\n  st->r[6] = ((t4 >> 14) | (t5 << 2)) & 0x1fff;\n  t6 = U8TO16(&key[12]);\n  st->r[7] = ((t5 >> 11) | (t6 << 5)) & 0x1f81;\n  t7 = U8TO16(&key[14]);\n  st->r[8] = ((t6 >> 8) | (t7 << 8)) & 0x1fff;\n  st->r[9] = ((t7 >> 5)) & 0x007f;\n\n  /* h = 0 */\n  for (i = 0; i < 10; i++) st->h[i] = 0;\n\n  /* save pad for later */\n  for (i = 0; i < 8; i++) st->pad[i] = U8TO16(&key[16 + (2 * i)]);\n\n  st->leftover = 0;\n  st->final = 0;\n}\n\nstatic void poly1305_blocks(poly1305_state_internal_t *st,\n                            const unsigned char *m, size_t bytes) {\n  const unsigned short hibit = (st->final) ? 0 : (1 << 11); /* 1 << 128 */\n  unsigned short t0, t1, t2, t3, t4, t5, t6, t7;\n  unsigned long d[10];\n  unsigned long c;\n\n  while (bytes >= poly1305_block_size) {\n    size_t i, j;\n\n    /* h += m[i] */\n    t0 = U8TO16(&m[0]);\n    st->h[0] += (t0) &0x1fff;\n    t1 = U8TO16(&m[2]);\n    st->h[1] += ((t0 >> 13) | (t1 << 3)) & 0x1fff;\n    t2 = U8TO16(&m[4]);\n    st->h[2] += ((t1 >> 10) | (t2 << 6)) & 0x1fff;\n    t3 = U8TO16(&m[6]);\n    st->h[3] += ((t2 >> 7) | (t3 << 9)) & 0x1fff;\n    t4 = U8TO16(&m[8]);\n    st->h[4] += ((t3 >> 4) | (t4 << 12)) & 0x1fff;\n    st->h[5] += ((t4 >> 1)) & 0x1fff;\n    t5 = U8TO16(&m[10]);\n    st->h[6] += ((t4 >> 14) | (t5 << 2)) & 0x1fff;\n    t6 = U8TO16(&m[12]);\n    st->h[7] += ((t5 >> 11) | (t6 << 5)) & 0x1fff;\n    t7 = U8TO16(&m[14]);\n    st->h[8] += ((t6 >> 8) | (t7 << 8)) & 0x1fff;\n    st->h[9] += ((t7 >> 5)) | hibit;\n\n    /* h *= r, (partial) h %= p */\n    for (i = 0, c = 0; i < 10; i++) {\n      d[i] = c;\n      for (j = 0; j < 10; j++) {\n        d[i] += (unsigned long) st->h[j] *\n                ((j <= i) ? st->r[i - j] : (5 * st->r[i + 10 - j]));\n        /* Sum(h[i] * r[i] * 5) will overflow slightly above 6 products with an\n         * unclamped r, so carry at 5 */\n        if (j == 4) {\n          c = (d[i] >> 13);\n          d[i] &= 0x1fff;\n        }\n      }\n      c += (d[i] >> 13);\n      d[i] &= 0x1fff;\n    }\n    c = ((c << 2) + c); /* c *= 5 */\n    c += d[0];\n    d[0] = ((unsigned short) c & 0x1fff);\n    c = (c >> 13);\n    d[1] += c;\n\n    for (i = 0; i < 10; i++) st->h[i] = (unsigned short) d[i];\n\n    m += poly1305_block_size;\n    bytes -= poly1305_block_size;\n  }\n}\n\nstatic POLY1305_NOINLINE void poly1305_finish(poly1305_context *ctx,\n                                              unsigned char mac[16]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  unsigned short c;\n  unsigned short g[10];\n  unsigned short mask;\n  unsigned long f;\n  size_t i;\n\n  /* process the remaining block */\n  if (st->leftover) {\n    size_t i = st->leftover;\n    st->buffer[i++] = 1;\n    for (; i < poly1305_block_size; i++) st->buffer[i] = 0;\n    st->final = 1;\n    poly1305_blocks(st, st->buffer, poly1305_block_size);\n  }\n\n  /* fully carry h */\n  c = st->h[1] >> 13;\n  st->h[1] &= 0x1fff;\n  for (i = 2; i < 10; i++) {\n    st->h[i] += c;\n    c = st->h[i] >> 13;\n    st->h[i] &= 0x1fff;\n  }\n  st->h[0] += (c * 5);\n  c = st->h[0] >> 13;\n  st->h[0] &= 0x1fff;\n  st->h[1] += c;\n  c = st->h[1] >> 13;\n  st->h[1] &= 0x1fff;\n  st->h[2] += c;\n\n  /* compute h + -p */\n  g[0] = st->h[0] + 5;\n  c = g[0] >> 13;\n  g[0] &= 0x1fff;\n  for (i = 1; i < 10; i++) {\n    g[i] = st->h[i] + c;\n    c = g[i] >> 13;\n    g[i] &= 0x1fff;\n  }\n\n  /* select h if h < p, or h + -p if h >= p */\n  mask = (c ^ 1) - 1;\n  for (i = 0; i < 10; i++) g[i] &= mask;\n  mask = ~mask;\n  for (i = 0; i < 10; i++) st->h[i] = (st->h[i] & mask) | g[i];\n\n  /* h = h % (2^128) */\n  st->h[0] = ((st->h[0]) | (st->h[1] << 13)) & 0xffff;\n  st->h[1] = ((st->h[1] >> 3) | (st->h[2] << 10)) & 0xffff;\n  st->h[2] = ((st->h[2] >> 6) | (st->h[3] << 7)) & 0xffff;\n  st->h[3] = ((st->h[3] >> 9) | (st->h[4] << 4)) & 0xffff;\n  st->h[4] = ((st->h[4] >> 12) | (st->h[5] << 1) | (st->h[6] << 14)) & 0xffff;\n  st->h[5] = ((st->h[6] >> 2) | (st->h[7] << 11)) & 0xffff;\n  st->h[6] = ((st->h[7] >> 5) | (st->h[8] << 8)) & 0xffff;\n  st->h[7] = ((st->h[8] >> 8) | (st->h[9] << 5)) & 0xffff;\n\n  /* mac = (h + pad) % (2^128) */\n  f = (unsigned long) st->h[0] + st->pad[0];\n  st->h[0] = (unsigned short) f;\n  for (i = 1; i < 8; i++) {\n    f = (unsigned long) st->h[i] + st->pad[i] + (f >> 16);\n    st->h[i] = (unsigned short) f;\n  }\n\n  for (i = 0; i < 8; i++) U16TO8(mac + (i * 2), st->h[i]);\n\n  /* zero out the state */\n  for (i = 0; i < 10; i++) st->h[i] = 0;\n  for (i = 0; i < 10; i++) st->r[i] = 0;\n  for (i = 0; i < 8; i++) st->pad[i] = 0;\n}\n#elif defined(POLY1305_32BIT) || \\\n    (!defined(POLY1305_64BIT) && defined(__GUESS32))\n/*\n        poly1305 implementation using 32 bit * 32 bit = 64 bit multiplication\nand 64 bit addition static */\n\n#if defined(_MSC_VER) && _MSC_VER < 1700\n#define POLY1305_NOINLINE\n#elif defined(_MSC_VER)\n#define POLY1305_NOINLINE __declspec(noinline)\n#elif defined(__GNUC__)\n#define POLY1305_NOINLINE __attribute__((noinline))\n#else\n#define POLY1305_NOINLINE\n#endif\n\n#define poly1305_block_size 16\n\n/* 17 + sizeof(size_t) + 14*sizeof(unsigned long) */\ntypedef struct poly1305_state_internal_t {\n  unsigned long r[5];\n  unsigned long h[5];\n  unsigned long pad[4];\n  size_t leftover;\n  unsigned char buffer[poly1305_block_size];\n  unsigned char final;\n} poly1305_state_internal_t;\n\n/* interpret four 8 bit unsigned integers as a 32 bit unsigned integer in little\n * endian */\nstatic unsigned long U8TO32(const unsigned char *p) {\n  return (((unsigned long) (p[0] & 0xff)) |\n          ((unsigned long) (p[1] & 0xff) << 8) |\n          ((unsigned long) (p[2] & 0xff) << 16) |\n          ((unsigned long) (p[3] & 0xff) << 24));\n}\n\n/* store a 32 bit unsigned integer as four 8 bit unsigned integers in little\n * endian */\nstatic void U32TO8(unsigned char *p, unsigned long v) {\n  p[0] = (unsigned char) ((v) &0xff);\n  p[1] = (unsigned char) ((v >> 8) & 0xff);\n  p[2] = (unsigned char) ((v >> 16) & 0xff);\n  p[3] = (unsigned char) ((v >> 24) & 0xff);\n}\n\nstatic void poly1305_init(poly1305_context *ctx, const unsigned char key[32]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n\n  /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */\n  st->r[0] = (U8TO32(&key[0])) & 0x3ffffff;\n  st->r[1] = (U8TO32(&key[3]) >> 2) & 0x3ffff03;\n  st->r[2] = (U8TO32(&key[6]) >> 4) & 0x3ffc0ff;\n  st->r[3] = (U8TO32(&key[9]) >> 6) & 0x3f03fff;\n  st->r[4] = (U8TO32(&key[12]) >> 8) & 0x00fffff;\n\n  /* h = 0 */\n  st->h[0] = 0;\n  st->h[1] = 0;\n  st->h[2] = 0;\n  st->h[3] = 0;\n  st->h[4] = 0;\n\n  /* save pad for later */\n  st->pad[0] = U8TO32(&key[16]);\n  st->pad[1] = U8TO32(&key[20]);\n  st->pad[2] = U8TO32(&key[24]);\n  st->pad[3] = U8TO32(&key[28]);\n\n  st->leftover = 0;\n  st->final = 0;\n}\n\nstatic void poly1305_blocks(poly1305_state_internal_t *st,\n                            const unsigned char *m, size_t bytes) {\n  const unsigned long hibit = (st->final) ? 0 : (1UL << 24); /* 1 << 128 */\n  unsigned long r0, r1, r2, r3, r4;\n  unsigned long s1, s2, s3, s4;\n  unsigned long h0, h1, h2, h3, h4;\n  uint64_t d0, d1, d2, d3, d4;\n  unsigned long c;\n\n  r0 = st->r[0];\n  r1 = st->r[1];\n  r2 = st->r[2];\n  r3 = st->r[3];\n  r4 = st->r[4];\n\n  s1 = r1 * 5;\n  s2 = r2 * 5;\n  s3 = r3 * 5;\n  s4 = r4 * 5;\n\n  h0 = st->h[0];\n  h1 = st->h[1];\n  h2 = st->h[2];\n  h3 = st->h[3];\n  h4 = st->h[4];\n\n  while (bytes >= poly1305_block_size) {\n    /* h += m[i] */\n    h0 += (U8TO32(m + 0)) & 0x3ffffff;\n    h1 += (U8TO32(m + 3) >> 2) & 0x3ffffff;\n    h2 += (U8TO32(m + 6) >> 4) & 0x3ffffff;\n    h3 += (U8TO32(m + 9) >> 6) & 0x3ffffff;\n    h4 += (U8TO32(m + 12) >> 8) | hibit;\n\n    /* h *= r */\n    d0 = ((uint64_t) h0 * r0) + ((uint64_t) h1 * s4) + ((uint64_t) h2 * s3) +\n         ((uint64_t) h3 * s2) + ((uint64_t) h4 * s1);\n    d1 = ((uint64_t) h0 * r1) + ((uint64_t) h1 * r0) + ((uint64_t) h2 * s4) +\n         ((uint64_t) h3 * s3) + ((uint64_t) h4 * s2);\n    d2 = ((uint64_t) h0 * r2) + ((uint64_t) h1 * r1) + ((uint64_t) h2 * r0) +\n         ((uint64_t) h3 * s4) + ((uint64_t) h4 * s3);\n    d3 = ((uint64_t) h0 * r3) + ((uint64_t) h1 * r2) + ((uint64_t) h2 * r1) +\n         ((uint64_t) h3 * r0) + ((uint64_t) h4 * s4);\n    d4 = ((uint64_t) h0 * r4) + ((uint64_t) h1 * r3) + ((uint64_t) h2 * r2) +\n         ((uint64_t) h3 * r1) + ((uint64_t) h4 * r0);\n\n    /* (partial) h %= p */\n    c = (unsigned long) (d0 >> 26);\n    h0 = (unsigned long) d0 & 0x3ffffff;\n    d1 += c;\n    c = (unsigned long) (d1 >> 26);\n    h1 = (unsigned long) d1 & 0x3ffffff;\n    d2 += c;\n    c = (unsigned long) (d2 >> 26);\n    h2 = (unsigned long) d2 & 0x3ffffff;\n    d3 += c;\n    c = (unsigned long) (d3 >> 26);\n    h3 = (unsigned long) d3 & 0x3ffffff;\n    d4 += c;\n    c = (unsigned long) (d4 >> 26);\n    h4 = (unsigned long) d4 & 0x3ffffff;\n    h0 += c * 5;\n    c = (h0 >> 26);\n    h0 = h0 & 0x3ffffff;\n    h1 += c;\n\n    m += poly1305_block_size;\n    bytes -= poly1305_block_size;\n  }\n\n  st->h[0] = h0;\n  st->h[1] = h1;\n  st->h[2] = h2;\n  st->h[3] = h3;\n  st->h[4] = h4;\n}\n\nstatic POLY1305_NOINLINE void poly1305_finish(poly1305_context *ctx,\n                                              unsigned char mac[16]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  unsigned long h0, h1, h2, h3, h4, c;\n  unsigned long g0, g1, g2, g3, g4;\n  uint64_t f;\n  unsigned long mask;\n\n  /* process the remaining block */\n  if (st->leftover) {\n    size_t i = st->leftover;\n    st->buffer[i++] = 1;\n    for (; i < poly1305_block_size; i++) st->buffer[i] = 0;\n    st->final = 1;\n    poly1305_blocks(st, st->buffer, poly1305_block_size);\n  }\n\n  /* fully carry h */\n  h0 = st->h[0];\n  h1 = st->h[1];\n  h2 = st->h[2];\n  h3 = st->h[3];\n  h4 = st->h[4];\n\n  c = h1 >> 26;\n  h1 = h1 & 0x3ffffff;\n  h2 += c;\n  c = h2 >> 26;\n  h2 = h2 & 0x3ffffff;\n  h3 += c;\n  c = h3 >> 26;\n  h3 = h3 & 0x3ffffff;\n  h4 += c;\n  c = h4 >> 26;\n  h4 = h4 & 0x3ffffff;\n  h0 += c * 5;\n  c = h0 >> 26;\n  h0 = h0 & 0x3ffffff;\n  h1 += c;\n\n  /* compute h + -p */\n  g0 = h0 + 5;\n  c = g0 >> 26;\n  g0 &= 0x3ffffff;\n  g1 = h1 + c;\n  c = g1 >> 26;\n  g1 &= 0x3ffffff;\n  g2 = h2 + c;\n  c = g2 >> 26;\n  g2 &= 0x3ffffff;\n  g3 = h3 + c;\n  c = g3 >> 26;\n  g3 &= 0x3ffffff;\n  g4 = h4 + c - (1UL << 26);\n\n  /* select h if h < p, or h + -p if h >= p */\n  mask = (g4 >> ((sizeof(unsigned long) * 8) - 1)) - 1;\n  g0 &= mask;\n  g1 &= mask;\n  g2 &= mask;\n  g3 &= mask;\n  g4 &= mask;\n  mask = ~mask;\n  h0 = (h0 & mask) | g0;\n  h1 = (h1 & mask) | g1;\n  h2 = (h2 & mask) | g2;\n  h3 = (h3 & mask) | g3;\n  h4 = (h4 & mask) | g4;\n\n  /* h = h % (2^128) */\n  h0 = ((h0) | (h1 << 26)) & 0xffffffff;\n  h1 = ((h1 >> 6) | (h2 << 20)) & 0xffffffff;\n  h2 = ((h2 >> 12) | (h3 << 14)) & 0xffffffff;\n  h3 = ((h3 >> 18) | (h4 << 8)) & 0xffffffff;\n\n  /* mac = (h + pad) % (2^128) */\n  f = (uint64_t) h0 + st->pad[0];\n  h0 = (unsigned long) f;\n  f = (uint64_t) h1 + st->pad[1] + (f >> 32);\n  h1 = (unsigned long) f;\n  f = (uint64_t) h2 + st->pad[2] + (f >> 32);\n  h2 = (unsigned long) f;\n  f = (uint64_t) h3 + st->pad[3] + (f >> 32);\n  h3 = (unsigned long) f;\n\n  U32TO8(mac + 0, h0);\n  U32TO8(mac + 4, h1);\n  U32TO8(mac + 8, h2);\n  U32TO8(mac + 12, h3);\n\n  /* zero out the state */\n  st->h[0] = 0;\n  st->h[1] = 0;\n  st->h[2] = 0;\n  st->h[3] = 0;\n  st->h[4] = 0;\n  st->r[0] = 0;\n  st->r[1] = 0;\n  st->r[2] = 0;\n  st->r[3] = 0;\n  st->r[4] = 0;\n  st->pad[0] = 0;\n  st->pad[1] = 0;\n  st->pad[2] = 0;\n  st->pad[3] = 0;\n}\n\n#else\n/*\n        poly1305 implementation using 64 bit * 64 bit = 128 bit multiplication\nand 128 bit addition static */\n\n#if defined(_MSC_VER)\n\ntypedef struct uint128_t {\n  uint64_t lo;\n  uint64_t hi;\n} uint128_t;\n\n#define MUL128(out, x, y) out.lo = _umul128((x), (y), &out.hi)\n#define ADD(out, in)                \\\n  {                                 \\\n    uint64_t t = out.lo;            \\\n    out.lo += in.lo;                \\\n    out.hi += (out.lo < t) + in.hi; \\\n  }\n#define ADDLO(out, in)      \\\n  {                         \\\n    uint64_t t = out.lo;    \\\n    out.lo += in;           \\\n    out.hi += (out.lo < t); \\\n  }\n#define SHR(in, shift) (__shiftright128(in.lo, in.hi, (shift)))\n#define LO(in) (in.lo)\n\n#if defined(_MSC_VER) && _MSC_VER < 1700\n#define POLY1305_NOINLINE\n#else\n#define POLY1305_NOINLINE __declspec(noinline)\n#endif\n#elif defined(__GNUC__)\n#if defined(__SIZEOF_INT128__)\n// Get rid of GCC warning \"ISO C does not support '__int128' types\"\n#pragma GCC diagnostic push\n#pragma GCC diagnostic ignored \"-Wpedantic\"\ntypedef unsigned __int128 uint128_t;\n#pragma GCC diagnostic pop\n#else\ntypedef unsigned uint128_t __attribute__((mode(TI)));\n#endif\n\n#define MUL128(out, x, y) out = ((uint128_t) x * y)\n#define ADD(out, in) out += in\n#define ADDLO(out, in) out += in\n#define SHR(in, shift) (uint64_t)(in >> (shift))\n#define LO(in) (uint64_t)(in)\n\n#define POLY1305_NOINLINE __attribute__((noinline))\n#endif\n\n#define poly1305_block_size 16\n\n/* 17 + sizeof(size_t) + 8*sizeof(uint64_t) */\ntypedef struct poly1305_state_internal_t {\n  uint64_t r[3];\n  uint64_t h[3];\n  uint64_t pad[2];\n  size_t leftover;\n  unsigned char buffer[poly1305_block_size];\n  unsigned char final;\n} poly1305_state_internal_t;\n\n/* interpret eight 8 bit unsigned integers as a 64 bit unsigned integer in\n * little endian */\nstatic uint64_t U8TO64(const unsigned char *p) {\n  return (((uint64_t) (p[0] & 0xff)) | ((uint64_t) (p[1] & 0xff) << 8) |\n          ((uint64_t) (p[2] & 0xff) << 16) | ((uint64_t) (p[3] & 0xff) << 24) |\n          ((uint64_t) (p[4] & 0xff) << 32) | ((uint64_t) (p[5] & 0xff) << 40) |\n          ((uint64_t) (p[6] & 0xff) << 48) | ((uint64_t) (p[7] & 0xff) << 56));\n}\n\n/* store a 64 bit unsigned integer as eight 8 bit unsigned integers in little\n * endian */\nstatic void U64TO8(unsigned char *p, uint64_t v) {\n  p[0] = (unsigned char) ((v) &0xff);\n  p[1] = (unsigned char) ((v >> 8) & 0xff);\n  p[2] = (unsigned char) ((v >> 16) & 0xff);\n  p[3] = (unsigned char) ((v >> 24) & 0xff);\n  p[4] = (unsigned char) ((v >> 32) & 0xff);\n  p[5] = (unsigned char) ((v >> 40) & 0xff);\n  p[6] = (unsigned char) ((v >> 48) & 0xff);\n  p[7] = (unsigned char) ((v >> 56) & 0xff);\n}\n\nstatic void poly1305_init(poly1305_context *ctx, const unsigned char key[32]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  uint64_t t0, t1;\n\n  /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */\n  t0 = U8TO64(&key[0]);\n  t1 = U8TO64(&key[8]);\n\n  st->r[0] = (t0) &0xffc0fffffff;\n  st->r[1] = ((t0 >> 44) | (t1 << 20)) & 0xfffffc0ffff;\n  st->r[2] = ((t1 >> 24)) & 0x00ffffffc0f;\n\n  /* h = 0 */\n  st->h[0] = 0;\n  st->h[1] = 0;\n  st->h[2] = 0;\n\n  /* save pad for later */\n  st->pad[0] = U8TO64(&key[16]);\n  st->pad[1] = U8TO64(&key[24]);\n\n  st->leftover = 0;\n  st->final = 0;\n}\n\nstatic void poly1305_blocks(poly1305_state_internal_t *st,\n                            const unsigned char *m, size_t bytes) {\n  const uint64_t hibit = (st->final) ? 0 : ((uint64_t) 1 << 40); /* 1 << 128 */\n  uint64_t r0, r1, r2;\n  uint64_t s1, s2;\n  uint64_t h0, h1, h2;\n  uint64_t c;\n  uint128_t d0, d1, d2, d;\n\n  r0 = st->r[0];\n  r1 = st->r[1];\n  r2 = st->r[2];\n\n  h0 = st->h[0];\n  h1 = st->h[1];\n  h2 = st->h[2];\n\n  s1 = r1 * (5 << 2);\n  s2 = r2 * (5 << 2);\n\n  while (bytes >= poly1305_block_size) {\n    uint64_t t0, t1;\n\n    /* h += m[i] */\n    t0 = U8TO64(&m[0]);\n    t1 = U8TO64(&m[8]);\n\n    h0 += ((t0) &0xfffffffffff);\n    h1 += (((t0 >> 44) | (t1 << 20)) & 0xfffffffffff);\n    h2 += (((t1 >> 24)) & 0x3ffffffffff) | hibit;\n\n    /* h *= r */\n    MUL128(d0, h0, r0);\n    MUL128(d, h1, s2);\n    ADD(d0, d);\n    MUL128(d, h2, s1);\n    ADD(d0, d);\n    MUL128(d1, h0, r1);\n    MUL128(d, h1, r0);\n    ADD(d1, d);\n    MUL128(d, h2, s2);\n    ADD(d1, d);\n    MUL128(d2, h0, r2);\n    MUL128(d, h1, r1);\n    ADD(d2, d);\n    MUL128(d, h2, r0);\n    ADD(d2, d);\n\n    /* (partial) h %= p */\n    c = SHR(d0, 44);\n    h0 = LO(d0) & 0xfffffffffff;\n    ADDLO(d1, c);\n    c = SHR(d1, 44);\n    h1 = LO(d1) & 0xfffffffffff;\n    ADDLO(d2, c);\n    c = SHR(d2, 42);\n    h2 = LO(d2) & 0x3ffffffffff;\n    h0 += c * 5;\n    c = (h0 >> 44);\n    h0 = h0 & 0xfffffffffff;\n    h1 += c;\n\n    m += poly1305_block_size;\n    bytes -= poly1305_block_size;\n  }\n\n  st->h[0] = h0;\n  st->h[1] = h1;\n  st->h[2] = h2;\n}\n\nstatic POLY1305_NOINLINE void poly1305_finish(poly1305_context *ctx,\n                                              unsigned char mac[16]) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  uint64_t h0, h1, h2, c;\n  uint64_t g0, g1, g2;\n  uint64_t t0, t1;\n\n  /* process the remaining block */\n  if (st->leftover) {\n    size_t i = st->leftover;\n    st->buffer[i] = 1;\n    for (i = i + 1; i < poly1305_block_size; i++) st->buffer[i] = 0;\n    st->final = 1;\n    poly1305_blocks(st, st->buffer, poly1305_block_size);\n  }\n\n  /* fully carry h */\n  h0 = st->h[0];\n  h1 = st->h[1];\n  h2 = st->h[2];\n\n  c = (h1 >> 44);\n  h1 &= 0xfffffffffff;\n  h2 += c;\n  c = (h2 >> 42);\n  h2 &= 0x3ffffffffff;\n  h0 += c * 5;\n  c = (h0 >> 44);\n  h0 &= 0xfffffffffff;\n  h1 += c;\n  c = (h1 >> 44);\n  h1 &= 0xfffffffffff;\n  h2 += c;\n  c = (h2 >> 42);\n  h2 &= 0x3ffffffffff;\n  h0 += c * 5;\n  c = (h0 >> 44);\n  h0 &= 0xfffffffffff;\n  h1 += c;\n\n  /* compute h + -p */\n  g0 = h0 + 5;\n  c = (g0 >> 44);\n  g0 &= 0xfffffffffff;\n  g1 = h1 + c;\n  c = (g1 >> 44);\n  g1 &= 0xfffffffffff;\n  g2 = h2 + c - ((uint64_t) 1 << 42);\n\n  /* select h if h < p, or h + -p if h >= p */\n  c = (g2 >> ((sizeof(uint64_t) * 8) - 1)) - 1;\n  g0 &= c;\n  g1 &= c;\n  g2 &= c;\n  c = ~c;\n  h0 = (h0 & c) | g0;\n  h1 = (h1 & c) | g1;\n  h2 = (h2 & c) | g2;\n\n  /* h = (h + pad) */\n  t0 = st->pad[0];\n  t1 = st->pad[1];\n\n  h0 += ((t0) &0xfffffffffff);\n  c = (h0 >> 44);\n  h0 &= 0xfffffffffff;\n  h1 += (((t0 >> 44) | (t1 << 20)) & 0xfffffffffff) + c;\n  c = (h1 >> 44);\n  h1 &= 0xfffffffffff;\n  h2 += (((t1 >> 24)) & 0x3ffffffffff) + c;\n  h2 &= 0x3ffffffffff;\n\n  /* mac = h % (2^128) */\n  h0 = ((h0) | (h1 << 44));\n  h1 = ((h1 >> 20) | (h2 << 24));\n\n  U64TO8(&mac[0], h0);\n  U64TO8(&mac[8], h1);\n\n  /* zero out the state */\n  st->h[0] = 0;\n  st->h[1] = 0;\n  st->h[2] = 0;\n  st->r[0] = 0;\n  st->r[1] = 0;\n  st->r[2] = 0;\n  st->pad[0] = 0;\n  st->pad[1] = 0;\n}\n\n#endif\n\nstatic void poly1305_update(poly1305_context *ctx, const unsigned char *m,\n                            size_t bytes) {\n  poly1305_state_internal_t *st = (poly1305_state_internal_t *) ctx;\n  size_t i;\n\n  /* handle leftover */\n  if (st->leftover) {\n    size_t want = (poly1305_block_size - st->leftover);\n    if (want > bytes) want = bytes;\n    for (i = 0; i < want; i++) st->buffer[st->leftover + i] = m[i];\n    bytes -= want;\n    m += want;\n    st->leftover += want;\n    if (st->leftover < poly1305_block_size) return;\n    poly1305_blocks(st, st->buffer, poly1305_block_size);\n    st->leftover = 0;\n  }\n\n  /* process full blocks */\n  if (bytes >= poly1305_block_size) {\n    size_t want = (bytes & (size_t) ~(poly1305_block_size - 1));\n    poly1305_blocks(st, m, want);\n    m += want;\n    bytes -= want;\n  }\n\n  /* store leftover */\n  if (bytes) {\n    for (i = 0; i < bytes; i++) st->buffer[st->leftover + i] = m[i];\n    st->leftover += bytes;\n  }\n}\n\n// ******* END: poly1305-donna.c ********\n// ******* BEGIN: portable8439.c ********\n\n#define __CHACHA20_BLOCK_SIZE (64)\n#define __POLY1305_KEY_SIZE (32)\n\nstatic PORTABLE_8439_DECL uint8_t __ZEROES[16] = {0};\nstatic PORTABLE_8439_DECL void pad_if_needed(poly1305_context *ctx,\n                                             size_t size) {\n  size_t padding = size % 16;\n  if (padding != 0) {\n    poly1305_update(ctx, __ZEROES, 16 - padding);\n  }\n}\n\n#define __u8(v) ((uint8_t) ((v) &0xFF))\n\n// TODO: make this depending on the unaligned/native read size possible\nstatic PORTABLE_8439_DECL void write_64bit_int(poly1305_context *ctx,\n                                               uint64_t value) {\n  uint8_t result[8];\n  result[0] = __u8(value);\n  result[1] = __u8(value >> 8);\n  result[2] = __u8(value >> 16);\n  result[3] = __u8(value >> 24);\n  result[4] = __u8(value >> 32);\n  result[5] = __u8(value >> 40);\n  result[6] = __u8(value >> 48);\n  result[7] = __u8(value >> 56);\n  poly1305_update(ctx, result, 8);\n}\n\nstatic PORTABLE_8439_DECL void poly1305_calculate_mac(\n    uint8_t *mac, const uint8_t *cipher_text, size_t cipher_text_size,\n    const uint8_t key[RFC_8439_KEY_SIZE],\n    const uint8_t nonce[RFC_8439_NONCE_SIZE], const uint8_t *ad,\n    size_t ad_size) {\n  // init poly key (section 2.6)\n  uint8_t poly_key[__POLY1305_KEY_SIZE] = {0};\n  poly1305_context poly_ctx;\n  rfc8439_keygen(poly_key, key, nonce);\n  // start poly1305 mac\n  poly1305_init(&poly_ctx, poly_key);\n\n  if (ad != NULL && ad_size > 0) {\n    // write AD if present\n    poly1305_update(&poly_ctx, ad, ad_size);\n    pad_if_needed(&poly_ctx, ad_size);\n  }\n\n  // now write the cipher text\n  poly1305_update(&poly_ctx, cipher_text, cipher_text_size);\n  pad_if_needed(&poly_ctx, cipher_text_size);\n\n  // write sizes\n  write_64bit_int(&poly_ctx, ad_size);\n  write_64bit_int(&poly_ctx, cipher_text_size);\n\n  // calculate MAC\n  poly1305_finish(&poly_ctx, mac);\n}\n\n#define MG_PM(p) ((size_t) (p))\n\n// pointers overlap if the smaller either ahead of the end,\n// or its end is before the start of the other\n//\n// s_size should be smaller or equal to b_size\n#define MG_OVERLAPPING(s, s_size, b, b_size) \\\n  (MG_PM(s) < MG_PM((b) + (b_size))) && (MG_PM(b) < MG_PM((s) + (s_size)))\n\nPORTABLE_8439_DECL size_t mg_chacha20_poly1305_encrypt(\n    uint8_t *restrict cipher_text, const uint8_t key[RFC_8439_KEY_SIZE],\n    const uint8_t nonce[RFC_8439_NONCE_SIZE], const uint8_t *restrict ad,\n    size_t ad_size, const uint8_t *restrict plain_text,\n    size_t plain_text_size) {\n  size_t new_size = plain_text_size + RFC_8439_TAG_SIZE;\n  if (MG_OVERLAPPING(plain_text, plain_text_size, cipher_text, new_size)) {\n    return (size_t) -1;\n  }\n  chacha20_xor_stream(cipher_text, plain_text, plain_text_size, key, nonce, 1);\n  poly1305_calculate_mac(cipher_text + plain_text_size, cipher_text,\n                         plain_text_size, key, nonce, ad, ad_size);\n  return new_size;\n}\n\nPORTABLE_8439_DECL size_t mg_chacha20_poly1305_decrypt(\n    uint8_t *restrict plain_text, const uint8_t key[RFC_8439_KEY_SIZE],\n    const uint8_t nonce[RFC_8439_NONCE_SIZE],\n    const uint8_t *restrict cipher_text, size_t cipher_text_size) {\n  // first we calculate the mac and see if it lines up, only then do we decrypt\n  size_t actual_size = cipher_text_size - RFC_8439_TAG_SIZE;\n  if (MG_OVERLAPPING(plain_text, actual_size, cipher_text, cipher_text_size)) {\n    return (size_t) -1;\n  }\n\n  chacha20_xor_stream(plain_text, cipher_text, actual_size, key, nonce, 1);\n  return actual_size;\n}\n// ******* END:   portable8439.c ********\n#endif  // MG_TLS == MG_TLS_BUILTIN\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/tls_dummy.c\"\n#endif\n\n\n#if MG_TLS == MG_TLS_NONE\nvoid mg_tls_init(struct mg_connection *c, const struct mg_tls_opts *opts) {\n  (void) opts;\n  mg_error(c, \"TLS is not enabled\");\n}\nvoid mg_tls_handshake(struct mg_connection *c) {\n  (void) c;\n}\nvoid mg_tls_free(struct mg_connection *c) {\n  (void) c;\n}\nlong mg_tls_recv(struct mg_connection *c, void *buf, size_t len) {\n  return c == NULL || buf == NULL || len == 0 ? 0 : -1;\n}\nlong mg_tls_send(struct mg_connection *c, const void *buf, size_t len) {\n  return c == NULL || buf == NULL || len == 0 ? 0 : -1;\n}\nsize_t mg_tls_pending(struct mg_connection *c) {\n  (void) c;\n  return 0;\n}\nvoid mg_tls_ctx_init(struct mg_mgr *mgr) {\n  (void) mgr;\n}\nvoid mg_tls_ctx_free(struct mg_mgr *mgr) {\n  (void) mgr;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/tls_mbed.c\"\n#endif\n\n\n\n#if MG_TLS == MG_TLS_MBED\n\n#if defined(MBEDTLS_VERSION_NUMBER) && MBEDTLS_VERSION_NUMBER >= 0x03000000\n#define MG_MBEDTLS_RNG_GET , mg_mbed_rng, NULL\n#else\n#define MG_MBEDTLS_RNG_GET\n#endif\n\nstatic int mg_mbed_rng(void *ctx, unsigned char *buf, size_t len) {\n  mg_random(buf, len);\n  (void) ctx;\n  return 0;\n}\n\nstatic bool mg_load_cert(struct mg_str str, mbedtls_x509_crt *p) {\n  int rc;\n  if (str.buf == NULL || str.buf[0] == '\\0' || str.buf[0] == '*') return true;\n  if (str.buf[0] == '-') str.len++;  // PEM, include trailing NUL\n  if ((rc = mbedtls_x509_crt_parse(p, (uint8_t *) str.buf, str.len)) != 0) {\n    MG_ERROR((\"cert err %#x\", -rc));\n    return false;\n  }\n  return true;\n}\n\nstatic bool mg_load_key(struct mg_str str, mbedtls_pk_context *p) {\n  int rc;\n  if (str.buf == NULL || str.buf[0] == '\\0' || str.buf[0] == '*') return true;\n  if (str.buf[0] == '-') str.len++;  // PEM, include trailing NUL\n  if ((rc = mbedtls_pk_parse_key(p, (uint8_t *) str.buf, str.len, NULL,\n                                 0 MG_MBEDTLS_RNG_GET)) != 0) {\n    MG_ERROR((\"key err %#x\", -rc));\n    return false;\n  }\n  return true;\n}\n\nvoid mg_tls_free(struct mg_connection *c) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  if (tls != NULL) {\n    mbedtls_ssl_free(&tls->ssl);\n    mbedtls_pk_free(&tls->pk);\n    mbedtls_x509_crt_free(&tls->ca);\n    mbedtls_x509_crt_free(&tls->cert);\n    mbedtls_ssl_config_free(&tls->conf);\n#ifdef MBEDTLS_SSL_SESSION_TICKETS\n    mbedtls_ssl_ticket_free(&tls->ticket);\n#endif\n    free(tls);\n    c->tls = NULL;\n  }\n}\n\nstatic int mg_net_send(void *ctx, const unsigned char *buf, size_t len) {\n  long n = mg_io_send((struct mg_connection *) ctx, buf, len);\n  MG_VERBOSE((\"%lu n=%ld e=%d\", ((struct mg_connection *) ctx)->id, n, errno));\n  if (n == MG_IO_WAIT) return MBEDTLS_ERR_SSL_WANT_WRITE;\n  if (n == MG_IO_RESET) return MBEDTLS_ERR_NET_CONN_RESET;\n  if (n == MG_IO_ERR) return MBEDTLS_ERR_NET_SEND_FAILED;\n  return (int) n;\n}\n\nstatic int mg_net_recv(void *ctx, unsigned char *buf, size_t len) {\n  long n = mg_io_recv((struct mg_connection *) ctx, buf, len);\n  MG_VERBOSE((\"%lu n=%ld\", ((struct mg_connection *) ctx)->id, n));\n  if (n == MG_IO_WAIT) return MBEDTLS_ERR_SSL_WANT_WRITE;\n  if (n == MG_IO_RESET) return MBEDTLS_ERR_NET_CONN_RESET;\n  if (n == MG_IO_ERR) return MBEDTLS_ERR_NET_RECV_FAILED;\n  return (int) n;\n}\n\nvoid mg_tls_handshake(struct mg_connection *c) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  int rc = mbedtls_ssl_handshake(&tls->ssl);\n  if (rc == 0) {  // Success\n    MG_DEBUG((\"%lu success\", c->id));\n    c->is_tls_hs = 0;\n    mg_call(c, MG_EV_TLS_HS, NULL);\n  } else if (rc == MBEDTLS_ERR_SSL_WANT_READ ||\n             rc == MBEDTLS_ERR_SSL_WANT_WRITE) {  // Still pending\n    MG_VERBOSE((\"%lu pending, %d%d %d (-%#x)\", c->id, c->is_connecting,\n                c->is_tls_hs, rc, -rc));\n  } else {\n    mg_error(c, \"TLS handshake: -%#x\", -rc);  // Error\n  }\n}\n\nstatic void debug_cb(void *c, int lev, const char *s, int n, const char *s2) {\n  n = (int) strlen(s2) - 1;\n  MG_INFO((\"%lu %d %.*s\", ((struct mg_connection *) c)->id, lev, n, s2));\n  (void) s;\n}\n\nvoid mg_tls_init(struct mg_connection *c, const struct mg_tls_opts *opts) {\n  struct mg_tls *tls = (struct mg_tls *) calloc(1, sizeof(*tls));\n  int rc = 0;\n  c->tls = tls;\n  if (c->tls == NULL) {\n    mg_error(c, \"TLS OOM\");\n    goto fail;\n  }\n  if (c->is_listening) goto fail;\n  MG_DEBUG((\"%lu Setting TLS\", c->id));\n  MG_PROF_ADD(c, \"mbedtls_init_start\");\n#if defined(MBEDTLS_VERSION_NUMBER) && MBEDTLS_VERSION_NUMBER >= 0x03000000 && \\\n    defined(MBEDTLS_PSA_CRYPTO_C)\n  psa_crypto_init();  // https://github.com/Mbed-TLS/mbedtls/issues/9072#issuecomment-2084845711\n#endif\n  mbedtls_ssl_init(&tls->ssl);\n  mbedtls_ssl_config_init(&tls->conf);\n  mbedtls_x509_crt_init(&tls->ca);\n  mbedtls_x509_crt_init(&tls->cert);\n  mbedtls_pk_init(&tls->pk);\n  mbedtls_ssl_conf_dbg(&tls->conf, debug_cb, c);\n#if defined(MG_MBEDTLS_DEBUG_LEVEL)\n  mbedtls_debug_set_threshold(MG_MBEDTLS_DEBUG_LEVEL);\n#endif\n  if ((rc = mbedtls_ssl_config_defaults(\n           &tls->conf,\n           c->is_client ? MBEDTLS_SSL_IS_CLIENT : MBEDTLS_SSL_IS_SERVER,\n           MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT)) != 0) {\n    mg_error(c, \"tls defaults %#x\", -rc);\n    goto fail;\n  }\n  mbedtls_ssl_conf_rng(&tls->conf, mg_mbed_rng, c);\n\n  if (opts->ca.len == 0 || mg_strcmp(opts->ca, mg_str(\"*\")) == 0) {\n    // NOTE: MBEDTLS_SSL_VERIFY_NONE is not supported for TLS1.3 on client side\n    // See https://github.com/Mbed-TLS/mbedtls/issues/7075\n    mbedtls_ssl_conf_authmode(&tls->conf, MBEDTLS_SSL_VERIFY_NONE);\n  } else {\n    if (mg_load_cert(opts->ca, &tls->ca) == false) goto fail;\n    mbedtls_ssl_conf_ca_chain(&tls->conf, &tls->ca, NULL);\n    if (c->is_client && opts->name.buf != NULL && opts->name.buf[0] != '\\0') {\n      char *host = mg_mprintf(\"%.*s\", opts->name.len, opts->name.buf);\n      mbedtls_ssl_set_hostname(&tls->ssl, host);\n      MG_DEBUG((\"%lu hostname verification: %s\", c->id, host));\n      free(host);\n    }\n    mbedtls_ssl_conf_authmode(&tls->conf, MBEDTLS_SSL_VERIFY_REQUIRED);\n  }\n  if (!mg_load_cert(opts->cert, &tls->cert)) goto fail;\n  if (!mg_load_key(opts->key, &tls->pk)) goto fail;\n  if (tls->cert.version &&\n      (rc = mbedtls_ssl_conf_own_cert(&tls->conf, &tls->cert, &tls->pk)) != 0) {\n    mg_error(c, \"own cert %#x\", -rc);\n    goto fail;\n  }\n\n#ifdef MBEDTLS_SSL_SESSION_TICKETS\n  mbedtls_ssl_conf_session_tickets_cb(\n      &tls->conf, mbedtls_ssl_ticket_write, mbedtls_ssl_ticket_parse,\n      &((struct mg_tls_ctx *) c->mgr->tls_ctx)->tickets);\n#endif\n\n  if ((rc = mbedtls_ssl_setup(&tls->ssl, &tls->conf)) != 0) {\n    mg_error(c, \"setup err %#x\", -rc);\n    goto fail;\n  }\n  c->is_tls = 1;\n  c->is_tls_hs = 1;\n  mbedtls_ssl_set_bio(&tls->ssl, c, mg_net_send, mg_net_recv, 0);\n  MG_PROF_ADD(c, \"mbedtls_init_end\");\n  if (c->is_client && c->is_resolving == 0 && c->is_connecting == 0) {\n    mg_tls_handshake(c);\n  }\n  return;\nfail:\n  mg_tls_free(c);\n}\n\nsize_t mg_tls_pending(struct mg_connection *c) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  return tls == NULL ? 0 : mbedtls_ssl_get_bytes_avail(&tls->ssl);\n}\n\nlong mg_tls_recv(struct mg_connection *c, void *buf, size_t len) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  long n = mbedtls_ssl_read(&tls->ssl, (unsigned char *) buf, len);\n  if (n == MBEDTLS_ERR_SSL_WANT_READ || n == MBEDTLS_ERR_SSL_WANT_WRITE)\n    return MG_IO_WAIT;\n#if defined(MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET)\n  if (n == MBEDTLS_ERR_SSL_RECEIVED_NEW_SESSION_TICKET) {\n    return MG_IO_WAIT;\n  }\n#endif\n  if (n <= 0) return MG_IO_ERR;\n  return n;\n}\n\nlong mg_tls_send(struct mg_connection *c, const void *buf, size_t len) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  long n = mbedtls_ssl_write(&tls->ssl, (unsigned char *) buf, len);\n  if (n == MBEDTLS_ERR_SSL_WANT_READ || n == MBEDTLS_ERR_SSL_WANT_WRITE)\n    return MG_IO_WAIT;\n  if (n <= 0) return MG_IO_ERR;\n  return n;\n}\n\nvoid mg_tls_ctx_init(struct mg_mgr *mgr) {\n  struct mg_tls_ctx *ctx = (struct mg_tls_ctx *) calloc(1, sizeof(*ctx));\n  if (ctx == NULL) {\n    MG_ERROR((\"TLS context init OOM\"));\n  } else {\n#ifdef MBEDTLS_SSL_SESSION_TICKETS\n    int rc;\n    mbedtls_ssl_ticket_init(&ctx->tickets);\n    if ((rc = mbedtls_ssl_ticket_setup(&ctx->tickets, mg_mbed_rng, NULL,\n                                       MBEDTLS_CIPHER_AES_128_GCM, 86400)) !=\n        0) {\n      MG_ERROR((\" mbedtls_ssl_ticket_setup %#x\", -rc));\n    }\n#endif\n    mgr->tls_ctx = ctx;\n  }\n}\n\nvoid mg_tls_ctx_free(struct mg_mgr *mgr) {\n  struct mg_tls_ctx *ctx = (struct mg_tls_ctx *) mgr->tls_ctx;\n  if (ctx != NULL) {\n#ifdef MBEDTLS_SSL_SESSION_TICKETS\n    mbedtls_ssl_ticket_free(&ctx->tickets);\n#endif\n    free(ctx);\n    mgr->tls_ctx = NULL;\n  }\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/tls_openssl.c\"\n#endif\n\n\n\n#if MG_TLS == MG_TLS_OPENSSL || MG_TLS == MG_TLS_WOLFSSL\n\nstatic int tls_err_cb(const char *s, size_t len, void *c) {\n  int n = (int) len - 1;\n  MG_ERROR((\"%lu %.*s\", ((struct mg_connection *) c)->id, n, s));\n  return 0;  // undocumented\n}\n\nstatic int mg_tls_err(struct mg_connection *c, struct mg_tls *tls, int res) {\n  int err = SSL_get_error(tls->ssl, res);\n  // We've just fetched the last error from the queue.\n  // Now we need to clear the error queue. If we do not, then the following\n  // can happen (actually reported):\n  //  - A new connection is accept()-ed with cert error (e.g. self-signed cert)\n  //  - Since all accept()-ed connections share listener's context,\n  //  - *ALL* SSL accepted connection report read error on the next poll cycle.\n  //    Thus a single errored connection can close all the rest, unrelated ones.\n  // Clearing the error keeps the shared SSL_CTX in an OK state.\n\n  if (err != 0) ERR_print_errors_cb(tls_err_cb, c);\n  ERR_clear_error();\n  if (err == SSL_ERROR_WANT_READ) return 0;\n  if (err == SSL_ERROR_WANT_WRITE) return 0;\n  return err;\n}\n\nstatic STACK_OF(X509_INFO) * load_ca_certs(struct mg_str ca) {\n  BIO *bio = BIO_new_mem_buf(ca.buf, (int) ca.len);\n  STACK_OF(X509_INFO) *certs =\n      bio ? PEM_X509_INFO_read_bio(bio, NULL, NULL, NULL) : NULL;\n  if (bio) BIO_free(bio);\n  return certs;\n}\n\nstatic bool add_ca_certs(SSL_CTX *ctx, STACK_OF(X509_INFO) * certs) {\n  int i;\n  X509_STORE *cert_store = SSL_CTX_get_cert_store(ctx);\n  for (i = 0; i < sk_X509_INFO_num(certs); i++) {\n    X509_INFO *cert_info = sk_X509_INFO_value(certs, i);\n    if (cert_info->x509 && !X509_STORE_add_cert(cert_store, cert_info->x509))\n      return false;\n  }\n  return true;\n}\n\nstatic EVP_PKEY *load_key(struct mg_str s) {\n  BIO *bio = BIO_new_mem_buf(s.buf, (int) (long) s.len);\n  EVP_PKEY *key = bio ? PEM_read_bio_PrivateKey(bio, NULL, 0, NULL) : NULL;\n  if (bio) BIO_free(bio);\n  return key;\n}\n\nstatic X509 *load_cert(struct mg_str s) {\n  BIO *bio = BIO_new_mem_buf(s.buf, (int) (long) s.len);\n  X509 *cert = bio == NULL ? NULL\n               : s.buf[0] == '-'\n                   ? PEM_read_bio_X509(bio, NULL, NULL, NULL)  // PEM\n                   : d2i_X509_bio(bio, NULL);                  // DER\n  if (bio) BIO_free(bio);\n  return cert;\n}\n\nstatic long mg_bio_ctrl(BIO *b, int cmd, long larg, void *pargs) {\n  long ret = 0;\n  if (cmd == BIO_CTRL_PUSH) ret = 1;\n  if (cmd == BIO_CTRL_POP) ret = 1;\n  if (cmd == BIO_CTRL_FLUSH) ret = 1;\n#if MG_TLS == MG_TLS_OPENSSL\n  if (cmd == BIO_C_SET_NBIO) ret = 1;\n#endif\n  // MG_DEBUG((\"%d -> %ld\", cmd, ret));\n  (void) b, (void) cmd, (void) larg, (void) pargs;\n  return ret;\n}\n\nstatic int mg_bio_read(BIO *bio, char *buf, int len) {\n  struct mg_connection *c = (struct mg_connection *) BIO_get_data(bio);\n  long res = mg_io_recv(c, buf, (size_t) len);\n  // MG_DEBUG((\"%p %d %ld\", buf, len, res));\n  len = res > 0 ? (int) res : -1;\n  if (res == MG_IO_WAIT) BIO_set_retry_read(bio);\n  return len;\n}\n\nstatic int mg_bio_write(BIO *bio, const char *buf, int len) {\n  struct mg_connection *c = (struct mg_connection *) BIO_get_data(bio);\n  long res = mg_io_send(c, buf, (size_t) len);\n  // MG_DEBUG((\"%p %d %ld\", buf, len, res));\n  len = res > 0 ? (int) res : -1;\n  if (res == MG_IO_WAIT) BIO_set_retry_write(bio);\n  return len;\n}\n\n#ifdef MG_TLS_SSLKEYLOGFILE\nstatic void ssl_keylog_cb(const SSL *ssl, const char *line) {\n  char *keylogfile = getenv(\"SSLKEYLOGFILE\");\n  if (keylogfile == NULL) {\n    return;\n  }\n  FILE *f = fopen(keylogfile, \"a\");\n  fprintf(f, \"%s\\n\", line);\n  fflush(f);\n  fclose(f);\n}\n#endif\n\nvoid mg_tls_free(struct mg_connection *c) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  if (tls == NULL) return;\n  SSL_free(tls->ssl);\n  SSL_CTX_free(tls->ctx);\n  BIO_meth_free(tls->bm);\n  free(tls);\n  c->tls = NULL;\n}\n\nvoid mg_tls_init(struct mg_connection *c, const struct mg_tls_opts *opts) {\n  struct mg_tls *tls = (struct mg_tls *) calloc(1, sizeof(*tls));\n  const char *id = \"mongoose\";\n  static unsigned char s_initialised = 0;\n  BIO *bio = NULL;\n  int rc;\n  c->tls = tls;\n  if (tls == NULL) {\n    mg_error(c, \"TLS OOM\");\n    goto fail;\n  }\n\n  if (!s_initialised) {\n    SSL_library_init();\n    s_initialised++;\n  }\n  MG_DEBUG((\"%lu Setting TLS\", c->id));\n  tls->ctx = c->is_client ? SSL_CTX_new(TLS_client_method())\n                          : SSL_CTX_new(TLS_server_method());\n  if (tls->ctx == NULL) {\n    mg_error(c, \"SSL_CTX_new\");\n    goto fail;\n  }\n#ifdef MG_TLS_SSLKEYLOGFILE\n  SSL_CTX_set_keylog_callback(tls->ctx, ssl_keylog_cb);\n#endif\n  if ((tls->ssl = SSL_new(tls->ctx)) == NULL) {\n    mg_error(c, \"SSL_new\");\n    goto fail;\n  }\n  SSL_set_session_id_context(tls->ssl, (const uint8_t *) id,\n                             (unsigned) strlen(id));\n  // Disable deprecated protocols\n  SSL_set_options(tls->ssl, SSL_OP_NO_SSLv2);\n  SSL_set_options(tls->ssl, SSL_OP_NO_SSLv3);\n  SSL_set_options(tls->ssl, SSL_OP_NO_TLSv1);\n  SSL_set_options(tls->ssl, SSL_OP_NO_TLSv1_1);\n#ifdef MG_ENABLE_OPENSSL_NO_COMPRESSION\n  SSL_set_options(tls->ssl, SSL_OP_NO_COMPRESSION);\n#endif\n#ifdef MG_ENABLE_OPENSSL_CIPHER_SERVER_PREFERENCE\n  SSL_set_options(tls->ssl, SSL_OP_CIPHER_SERVER_PREFERENCE);\n#endif\n\n#if MG_TLS == MG_TLS_WOLFSSL && !defined(OPENSSL_COMPATIBLE_DEFAULTS)\n  if (opts->ca.len == 0 || mg_strcmp(opts->ca, mg_str(\"*\")) == 0) {\n    // Older versions require that either the CA is loaded or SSL_VERIFY_NONE\n    // explicitly set\n    SSL_set_verify(tls->ssl, SSL_VERIFY_NONE, NULL);\n  }\n#endif\n  if (opts->ca.buf != NULL && opts->ca.buf[0] != '\\0') {\n    SSL_set_verify(tls->ssl, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT,\n                   NULL);\n    STACK_OF(X509_INFO) *certs = load_ca_certs(opts->ca);\n    rc = add_ca_certs(tls->ctx, certs);\n    sk_X509_INFO_pop_free(certs, X509_INFO_free);\n    if (!rc) {\n      mg_error(c, \"CA err\");\n      goto fail;\n    }\n  }\n  if (opts->cert.buf != NULL && opts->cert.buf[0] != '\\0') {\n    X509 *cert = load_cert(opts->cert);\n    rc = cert == NULL ? 0 : SSL_use_certificate(tls->ssl, cert);\n    X509_free(cert);\n    if (cert == NULL || rc != 1) {\n      mg_error(c, \"CERT err %d\", mg_tls_err(c, tls, rc));\n      goto fail;\n    }\n  }\n  if (opts->key.buf != NULL && opts->key.buf[0] != '\\0') {\n    EVP_PKEY *key = load_key(opts->key);\n    rc = key == NULL ? 0 : SSL_use_PrivateKey(tls->ssl, key);\n    EVP_PKEY_free(key);\n    if (key == NULL || rc != 1) {\n      mg_error(c, \"KEY err %d\", mg_tls_err(c, tls, rc));\n      goto fail;\n    }\n  }\n\n  SSL_set_mode(tls->ssl, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);\n#if MG_TLS == MG_TLS_OPENSSL && OPENSSL_VERSION_NUMBER > 0x10002000L\n  (void) SSL_set_ecdh_auto(tls->ssl, 1);\n#endif\n#if OPENSSL_VERSION_NUMBER >= 0x10100000L\n  if (opts->name.len > 0) {\n    char *s = mg_mprintf(\"%.*s\", (int) opts->name.len, opts->name.buf);\n#if MG_TLS != MG_TLS_WOLFSSL || LIBWOLFSSL_VERSION_HEX >= 0x05005002\n    SSL_set1_host(tls->ssl, s);\n#else\n    X509_VERIFY_PARAM_set1_host(SSL_get0_param(tls->ssl), s, 0);\n#endif\n    SSL_set_tlsext_host_name(tls->ssl, s);\n    free(s);\n  }\n#endif\n#if MG_TLS == MG_TLS_WOLFSSL\n  tls->bm = BIO_meth_new(0, \"bio_mg\");\n#else\n  tls->bm = BIO_meth_new(BIO_get_new_index() | BIO_TYPE_SOURCE_SINK, \"bio_mg\");\n#endif\n  BIO_meth_set_write(tls->bm, mg_bio_write);\n  BIO_meth_set_read(tls->bm, mg_bio_read);\n  BIO_meth_set_ctrl(tls->bm, mg_bio_ctrl);\n\n  bio = BIO_new(tls->bm);\n  BIO_set_data(bio, c);\n  SSL_set_bio(tls->ssl, bio, bio);\n\n  c->is_tls = 1;\n  c->is_tls_hs = 1;\n  if (c->is_client && c->is_resolving == 0 && c->is_connecting == 0) {\n    mg_tls_handshake(c);\n  }\n  MG_DEBUG((\"%lu SSL %s OK\", c->id, c->is_accepted ? \"accept\" : \"client\"));\n  return;\nfail:\n  mg_tls_free(c);\n}\n\nvoid mg_tls_handshake(struct mg_connection *c) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  int rc = c->is_client ? SSL_connect(tls->ssl) : SSL_accept(tls->ssl);\n  if (rc == 1) {\n    MG_DEBUG((\"%lu success\", c->id));\n    c->is_tls_hs = 0;\n    mg_call(c, MG_EV_TLS_HS, NULL);\n  } else {\n    int code = mg_tls_err(c, tls, rc);\n    if (code != 0) mg_error(c, \"tls hs: rc %d, err %d\", rc, code);\n  }\n}\n\nsize_t mg_tls_pending(struct mg_connection *c) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  return tls == NULL ? 0 : (size_t) SSL_pending(tls->ssl);\n}\n\nlong mg_tls_recv(struct mg_connection *c, void *buf, size_t len) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  int n = SSL_read(tls->ssl, buf, (int) len);\n  if (n < 0 && mg_tls_err(c, tls, n) == 0) return MG_IO_WAIT;\n  if (n <= 0) return MG_IO_ERR;\n  return n;\n}\n\nlong mg_tls_send(struct mg_connection *c, const void *buf, size_t len) {\n  struct mg_tls *tls = (struct mg_tls *) c->tls;\n  int n = SSL_write(tls->ssl, buf, (int) len);\n  if (n < 0 && mg_tls_err(c, tls, n) == 0) return MG_IO_WAIT;\n  if (n <= 0) return MG_IO_ERR;\n  return n;\n}\n\nvoid mg_tls_ctx_init(struct mg_mgr *mgr) {\n  (void) mgr;\n}\n\nvoid mg_tls_ctx_free(struct mg_mgr *mgr) {\n  (void) mgr;\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/tls_uecc.c\"\n#endif\n/* Copyright 2014, Kenneth MacKay. Licensed under the BSD 2-clause license. */\n\n\n\n\n#if MG_TLS == MG_TLS_BUILTIN\n\n#ifndef MG_UECC_RNG_MAX_TRIES\n#define MG_UECC_RNG_MAX_TRIES 64\n#endif\n\n#if MG_UECC_ENABLE_VLI_API\n#define MG_UECC_VLI_API\n#else\n#define MG_UECC_VLI_API static\n#endif\n\n#if (MG_UECC_PLATFORM == mg_uecc_avr) || (MG_UECC_PLATFORM == mg_uecc_arm) || \\\n    (MG_UECC_PLATFORM == mg_uecc_arm_thumb) ||                                \\\n    (MG_UECC_PLATFORM == mg_uecc_arm_thumb2)\n#define MG_UECC_CONCATX(a, ...) a##__VA_ARGS__\n#define MG_UECC_CONCAT(a, ...) MG_UECC_CONCATX(a, __VA_ARGS__)\n\n#define STRX(a) #a\n#define STR(a) STRX(a)\n\n#define EVAL(...) EVAL1(EVAL1(EVAL1(EVAL1(__VA_ARGS__))))\n#define EVAL1(...) EVAL2(EVAL2(EVAL2(EVAL2(__VA_ARGS__))))\n#define EVAL2(...) EVAL3(EVAL3(EVAL3(EVAL3(__VA_ARGS__))))\n#define EVAL3(...) EVAL4(EVAL4(EVAL4(EVAL4(__VA_ARGS__))))\n#define EVAL4(...) __VA_ARGS__\n\n#define DEC_1 0\n#define DEC_2 1\n#define DEC_3 2\n#define DEC_4 3\n#define DEC_5 4\n#define DEC_6 5\n#define DEC_7 6\n#define DEC_8 7\n#define DEC_9 8\n#define DEC_10 9\n#define DEC_11 10\n#define DEC_12 11\n#define DEC_13 12\n#define DEC_14 13\n#define DEC_15 14\n#define DEC_16 15\n#define DEC_17 16\n#define DEC_18 17\n#define DEC_19 18\n#define DEC_20 19\n#define DEC_21 20\n#define DEC_22 21\n#define DEC_23 22\n#define DEC_24 23\n#define DEC_25 24\n#define DEC_26 25\n#define DEC_27 26\n#define DEC_28 27\n#define DEC_29 28\n#define DEC_30 29\n#define DEC_31 30\n#define DEC_32 31\n\n#define DEC(N) MG_UECC_CONCAT(DEC_, N)\n\n#define SECOND_ARG(_, val, ...) val\n#define SOME_CHECK_0 ~, 0\n#define GET_SECOND_ARG(...) SECOND_ARG(__VA_ARGS__, SOME, )\n#define SOME_OR_0(N) GET_SECOND_ARG(MG_UECC_CONCAT(SOME_CHECK_, N))\n\n#define MG_UECC_EMPTY(...)\n#define DEFER(...) __VA_ARGS__ MG_UECC_EMPTY()\n\n#define REPEAT_NAME_0() REPEAT_0\n#define REPEAT_NAME_SOME() REPEAT_SOME\n#define REPEAT_0(...)\n#define REPEAT_SOME(N, stuff) \\\n  DEFER(MG_UECC_CONCAT(REPEAT_NAME_, SOME_OR_0(DEC(N))))()(DEC(N), stuff) stuff\n#define REPEAT(N, stuff) EVAL(REPEAT_SOME(N, stuff))\n\n#define REPEATM_NAME_0() REPEATM_0\n#define REPEATM_NAME_SOME() REPEATM_SOME\n#define REPEATM_0(...)\n#define REPEATM_SOME(N, macro) \\\n  macro(N) DEFER(MG_UECC_CONCAT(REPEATM_NAME_, SOME_OR_0(DEC(N))))()(DEC(N), macro)\n#define REPEATM(N, macro) EVAL(REPEATM_SOME(N, macro))\n#endif\n\n// \n\n#if (MG_UECC_WORD_SIZE == 1)\n#if MG_UECC_SUPPORTS_secp160r1\n#define MG_UECC_MAX_WORDS 21 /* Due to the size of curve_n. */\n#endif\n#if MG_UECC_SUPPORTS_secp192r1\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 24\n#endif\n#if MG_UECC_SUPPORTS_secp224r1\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 28\n#endif\n#if (MG_UECC_SUPPORTS_secp256r1 || MG_UECC_SUPPORTS_secp256k1)\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 32\n#endif\n#elif (MG_UECC_WORD_SIZE == 4)\n#if MG_UECC_SUPPORTS_secp160r1\n#define MG_UECC_MAX_WORDS 6 /* Due to the size of curve_n. */\n#endif\n#if MG_UECC_SUPPORTS_secp192r1\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 6\n#endif\n#if MG_UECC_SUPPORTS_secp224r1\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 7\n#endif\n#if (MG_UECC_SUPPORTS_secp256r1 || MG_UECC_SUPPORTS_secp256k1)\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 8\n#endif\n#elif (MG_UECC_WORD_SIZE == 8)\n#if MG_UECC_SUPPORTS_secp160r1\n#define MG_UECC_MAX_WORDS 3\n#endif\n#if MG_UECC_SUPPORTS_secp192r1\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 3\n#endif\n#if MG_UECC_SUPPORTS_secp224r1\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 4\n#endif\n#if (MG_UECC_SUPPORTS_secp256r1 || MG_UECC_SUPPORTS_secp256k1)\n#undef MG_UECC_MAX_WORDS\n#define MG_UECC_MAX_WORDS 4\n#endif\n#endif /* MG_UECC_WORD_SIZE */\n\n#define BITS_TO_WORDS(num_bits)                                \\\n  ((wordcount_t) ((num_bits + ((MG_UECC_WORD_SIZE * 8) - 1)) / \\\n                  (MG_UECC_WORD_SIZE * 8)))\n#define BITS_TO_BYTES(num_bits) ((num_bits + 7) / 8)\n\nstruct MG_UECC_Curve_t {\n  wordcount_t num_words;\n  wordcount_t num_bytes;\n  bitcount_t num_n_bits;\n  mg_uecc_word_t p[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t n[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t G[MG_UECC_MAX_WORDS * 2];\n  mg_uecc_word_t b[MG_UECC_MAX_WORDS];\n  void (*double_jacobian)(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                          mg_uecc_word_t *Z1, MG_UECC_Curve curve);\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n  void (*mod_sqrt)(mg_uecc_word_t *a, MG_UECC_Curve curve);\n#endif\n  void (*x_side)(mg_uecc_word_t *result, const mg_uecc_word_t *x,\n                 MG_UECC_Curve curve);\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n  void (*mmod_fast)(mg_uecc_word_t *result, mg_uecc_word_t *product);\n#endif\n};\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\nstatic void bcopy(uint8_t *dst, const uint8_t *src, unsigned num_bytes) {\n  while (0 != num_bytes) {\n    num_bytes--;\n    dst[num_bytes] = src[num_bytes];\n  }\n}\n#endif\n\nstatic cmpresult_t mg_uecc_vli_cmp_unsafe(const mg_uecc_word_t *left,\n                                          const mg_uecc_word_t *right,\n                                          wordcount_t num_words);\n\n#if (MG_UECC_PLATFORM == mg_uecc_arm ||       \\\n     MG_UECC_PLATFORM == mg_uecc_arm_thumb || \\\n     MG_UECC_PLATFORM == mg_uecc_arm_thumb2)\n\n#endif\n\n#if (MG_UECC_PLATFORM == mg_uecc_avr)\n\n#endif\n\n#ifndef asm_clear\n#define asm_clear 0\n#endif\n#ifndef asm_set\n#define asm_set 0\n#endif\n#ifndef asm_add\n#define asm_add 0\n#endif\n#ifndef asm_sub\n#define asm_sub 0\n#endif\n#ifndef asm_mult\n#define asm_mult 0\n#endif\n#ifndef asm_rshift1\n#define asm_rshift1 0\n#endif\n#ifndef asm_mmod_fast_secp256r1\n#define asm_mmod_fast_secp256r1 0\n#endif\n\n#if defined(default_RNG_defined) && default_RNG_defined\nstatic MG_UECC_RNG_Function g_rng_function = &default_RNG;\n#else\nstatic MG_UECC_RNG_Function g_rng_function = 0;\n#endif\n\nvoid mg_uecc_set_rng(MG_UECC_RNG_Function rng_function) {\n  g_rng_function = rng_function;\n}\n\nMG_UECC_RNG_Function mg_uecc_get_rng(void) {\n  return g_rng_function;\n}\n\nint mg_uecc_curve_private_key_size(MG_UECC_Curve curve) {\n  return BITS_TO_BYTES(curve->num_n_bits);\n}\n\nint mg_uecc_curve_public_key_size(MG_UECC_Curve curve) {\n  return 2 * curve->num_bytes;\n}\n\n#if !asm_clear\nMG_UECC_VLI_API void mg_uecc_vli_clear(mg_uecc_word_t *vli,\n                                       wordcount_t num_words) {\n  wordcount_t i;\n  for (i = 0; i < num_words; ++i) {\n    vli[i] = 0;\n  }\n}\n#endif /* !asm_clear */\n\n/* Constant-time comparison to zero - secure way to compare long integers */\n/* Returns 1 if vli == 0, 0 otherwise. */\nMG_UECC_VLI_API mg_uecc_word_t mg_uecc_vli_isZero(const mg_uecc_word_t *vli,\n                                                  wordcount_t num_words) {\n  mg_uecc_word_t bits = 0;\n  wordcount_t i;\n  for (i = 0; i < num_words; ++i) {\n    bits |= vli[i];\n  }\n  return (bits == 0);\n}\n\n/* Returns nonzero if bit 'bit' of vli is set. */\nMG_UECC_VLI_API mg_uecc_word_t mg_uecc_vli_testBit(const mg_uecc_word_t *vli,\n                                                   bitcount_t bit) {\n  return (vli[bit >> MG_UECC_WORD_BITS_SHIFT] &\n          ((mg_uecc_word_t) 1 << (bit & MG_UECC_WORD_BITS_MASK)));\n}\n\n/* Counts the number of words in vli. */\nstatic wordcount_t vli_numDigits(const mg_uecc_word_t *vli,\n                                 const wordcount_t max_words) {\n  wordcount_t i;\n  /* Search from the end until we find a non-zero digit.\n     We do it in reverse because we expect that most digits will be nonzero. */\n  for (i = max_words - 1; i >= 0 && vli[i] == 0; --i) {\n  }\n\n  return (i + 1);\n}\n\n/* Counts the number of bits required to represent vli. */\nMG_UECC_VLI_API bitcount_t mg_uecc_vli_numBits(const mg_uecc_word_t *vli,\n                                               const wordcount_t max_words) {\n  mg_uecc_word_t i;\n  mg_uecc_word_t digit;\n\n  wordcount_t num_digits = vli_numDigits(vli, max_words);\n  if (num_digits == 0) {\n    return 0;\n  }\n\n  digit = vli[num_digits - 1];\n  for (i = 0; digit; ++i) {\n    digit >>= 1;\n  }\n\n  return (((bitcount_t) ((num_digits - 1) << MG_UECC_WORD_BITS_SHIFT)) +\n          (bitcount_t) i);\n}\n\n/* Sets dest = src. */\n#if !asm_set\nMG_UECC_VLI_API void mg_uecc_vli_set(mg_uecc_word_t *dest,\n                                     const mg_uecc_word_t *src,\n                                     wordcount_t num_words) {\n  wordcount_t i;\n  for (i = 0; i < num_words; ++i) {\n    dest[i] = src[i];\n  }\n}\n#endif /* !asm_set */\n\n/* Returns sign of left - right. */\nstatic cmpresult_t mg_uecc_vli_cmp_unsafe(const mg_uecc_word_t *left,\n                                          const mg_uecc_word_t *right,\n                                          wordcount_t num_words) {\n  wordcount_t i;\n  for (i = num_words - 1; i >= 0; --i) {\n    if (left[i] > right[i]) {\n      return 1;\n    } else if (left[i] < right[i]) {\n      return -1;\n    }\n  }\n  return 0;\n}\n\n/* Constant-time comparison function - secure way to compare long integers */\n/* Returns one if left == right, zero otherwise. */\nMG_UECC_VLI_API mg_uecc_word_t mg_uecc_vli_equal(const mg_uecc_word_t *left,\n                                                 const mg_uecc_word_t *right,\n                                                 wordcount_t num_words) {\n  mg_uecc_word_t diff = 0;\n  wordcount_t i;\n  for (i = num_words - 1; i >= 0; --i) {\n    diff |= (left[i] ^ right[i]);\n  }\n  return (diff == 0);\n}\n\nMG_UECC_VLI_API mg_uecc_word_t mg_uecc_vli_sub(mg_uecc_word_t *result,\n                                               const mg_uecc_word_t *left,\n                                               const mg_uecc_word_t *right,\n                                               wordcount_t num_words);\n\n/* Returns sign of left - right, in constant time. */\nMG_UECC_VLI_API cmpresult_t mg_uecc_vli_cmp(const mg_uecc_word_t *left,\n                                            const mg_uecc_word_t *right,\n                                            wordcount_t num_words) {\n  mg_uecc_word_t tmp[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t neg = !!mg_uecc_vli_sub(tmp, left, right, num_words);\n  mg_uecc_word_t equal = mg_uecc_vli_isZero(tmp, num_words);\n  return (cmpresult_t) (!equal - 2 * neg);\n}\n\n/* Computes vli = vli >> 1. */\n#if !asm_rshift1\nMG_UECC_VLI_API void mg_uecc_vli_rshift1(mg_uecc_word_t *vli,\n                                         wordcount_t num_words) {\n  mg_uecc_word_t *end = vli;\n  mg_uecc_word_t carry = 0;\n\n  vli += num_words;\n  while (vli-- > end) {\n    mg_uecc_word_t temp = *vli;\n    *vli = (temp >> 1) | carry;\n    carry = temp << (MG_UECC_WORD_BITS - 1);\n  }\n}\n#endif /* !asm_rshift1 */\n\n/* Computes result = left + right, returning carry. Can modify in place. */\n#if !asm_add\nMG_UECC_VLI_API mg_uecc_word_t mg_uecc_vli_add(mg_uecc_word_t *result,\n                                               const mg_uecc_word_t *left,\n                                               const mg_uecc_word_t *right,\n                                               wordcount_t num_words) {\n  mg_uecc_word_t carry = 0;\n  wordcount_t i;\n  for (i = 0; i < num_words; ++i) {\n    mg_uecc_word_t sum = left[i] + right[i] + carry;\n    if (sum != left[i]) {\n      carry = (sum < left[i]);\n    }\n    result[i] = sum;\n  }\n  return carry;\n}\n#endif /* !asm_add */\n\n/* Computes result = left - right, returning borrow. Can modify in place. */\n#if !asm_sub\nMG_UECC_VLI_API mg_uecc_word_t mg_uecc_vli_sub(mg_uecc_word_t *result,\n                                               const mg_uecc_word_t *left,\n                                               const mg_uecc_word_t *right,\n                                               wordcount_t num_words) {\n  mg_uecc_word_t borrow = 0;\n  wordcount_t i;\n  for (i = 0; i < num_words; ++i) {\n    mg_uecc_word_t diff = left[i] - right[i] - borrow;\n    if (diff != left[i]) {\n      borrow = (diff > left[i]);\n    }\n    result[i] = diff;\n  }\n  return borrow;\n}\n#endif /* !asm_sub */\n\n#if !asm_mult || (MG_UECC_SQUARE_FUNC && !asm_square) ||               \\\n    (MG_UECC_SUPPORTS_secp256k1 && (MG_UECC_OPTIMIZATION_LEVEL > 0) && \\\n     ((MG_UECC_WORD_SIZE == 1) || (MG_UECC_WORD_SIZE == 8)))\nstatic void muladd(mg_uecc_word_t a, mg_uecc_word_t b, mg_uecc_word_t *r0,\n                   mg_uecc_word_t *r1, mg_uecc_word_t *r2) {\n#if MG_UECC_WORD_SIZE == 8\n  uint64_t a0 = a & 0xffffffff;\n  uint64_t a1 = a >> 32;\n  uint64_t b0 = b & 0xffffffff;\n  uint64_t b1 = b >> 32;\n\n  uint64_t i0 = a0 * b0;\n  uint64_t i1 = a0 * b1;\n  uint64_t i2 = a1 * b0;\n  uint64_t i3 = a1 * b1;\n\n  uint64_t p0, p1;\n\n  i2 += (i0 >> 32);\n  i2 += i1;\n  if (i2 < i1) { /* overflow */\n    i3 += 0x100000000;\n  }\n\n  p0 = (i0 & 0xffffffff) | (i2 << 32);\n  p1 = i3 + (i2 >> 32);\n\n  *r0 += p0;\n  *r1 += (p1 + (*r0 < p0));\n  *r2 += ((*r1 < p1) || (*r1 == p1 && *r0 < p0));\n#else\n  mg_uecc_dword_t p = (mg_uecc_dword_t) a * b;\n  mg_uecc_dword_t r01 = ((mg_uecc_dword_t) (*r1) << MG_UECC_WORD_BITS) | *r0;\n  r01 += p;\n  *r2 += (r01 < p);\n  *r1 = (mg_uecc_word_t) (r01 >> MG_UECC_WORD_BITS);\n  *r0 = (mg_uecc_word_t) r01;\n#endif\n}\n#endif /* muladd needed */\n\n#if !asm_mult\nMG_UECC_VLI_API void mg_uecc_vli_mult(mg_uecc_word_t *result,\n                                      const mg_uecc_word_t *left,\n                                      const mg_uecc_word_t *right,\n                                      wordcount_t num_words) {\n  mg_uecc_word_t r0 = 0;\n  mg_uecc_word_t r1 = 0;\n  mg_uecc_word_t r2 = 0;\n  wordcount_t i, k;\n\n  /* Compute each digit of result in sequence, maintaining the carries. */\n  for (k = 0; k < num_words; ++k) {\n    for (i = 0; i <= k; ++i) {\n      muladd(left[i], right[k - i], &r0, &r1, &r2);\n    }\n    result[k] = r0;\n    r0 = r1;\n    r1 = r2;\n    r2 = 0;\n  }\n  for (k = num_words; k < num_words * 2 - 1; ++k) {\n    for (i = (wordcount_t) ((k + 1) - num_words); i < num_words; ++i) {\n      muladd(left[i], right[k - i], &r0, &r1, &r2);\n    }\n    result[k] = r0;\n    r0 = r1;\n    r1 = r2;\n    r2 = 0;\n  }\n  result[num_words * 2 - 1] = r0;\n}\n#endif /* !asm_mult */\n\n#if MG_UECC_SQUARE_FUNC\n\n#if !asm_square\nstatic void mul2add(mg_uecc_word_t a, mg_uecc_word_t b, mg_uecc_word_t *r0,\n                    mg_uecc_word_t *r1, mg_uecc_word_t *r2) {\n#if MG_UECC_WORD_SIZE == 8\n  uint64_t a0 = a & 0xffffffffull;\n  uint64_t a1 = a >> 32;\n  uint64_t b0 = b & 0xffffffffull;\n  uint64_t b1 = b >> 32;\n\n  uint64_t i0 = a0 * b0;\n  uint64_t i1 = a0 * b1;\n  uint64_t i2 = a1 * b0;\n  uint64_t i3 = a1 * b1;\n\n  uint64_t p0, p1;\n\n  i2 += (i0 >> 32);\n  i2 += i1;\n  if (i2 < i1) { /* overflow */\n    i3 += 0x100000000ull;\n  }\n\n  p0 = (i0 & 0xffffffffull) | (i2 << 32);\n  p1 = i3 + (i2 >> 32);\n\n  *r2 += (p1 >> 63);\n  p1 = (p1 << 1) | (p0 >> 63);\n  p0 <<= 1;\n\n  *r0 += p0;\n  *r1 += (p1 + (*r0 < p0));\n  *r2 += ((*r1 < p1) || (*r1 == p1 && *r0 < p0));\n#else\n  mg_uecc_dword_t p = (mg_uecc_dword_t) a * b;\n  mg_uecc_dword_t r01 = ((mg_uecc_dword_t) (*r1) << MG_UECC_WORD_BITS) | *r0;\n  *r2 += (p >> (MG_UECC_WORD_BITS * 2 - 1));\n  p *= 2;\n  r01 += p;\n  *r2 += (r01 < p);\n  *r1 = r01 >> MG_UECC_WORD_BITS;\n  *r0 = (mg_uecc_word_t) r01;\n#endif\n}\n\nMG_UECC_VLI_API void mg_uecc_vli_square(mg_uecc_word_t *result,\n                                        const mg_uecc_word_t *left,\n                                        wordcount_t num_words) {\n  mg_uecc_word_t r0 = 0;\n  mg_uecc_word_t r1 = 0;\n  mg_uecc_word_t r2 = 0;\n\n  wordcount_t i, k;\n\n  for (k = 0; k < num_words * 2 - 1; ++k) {\n    mg_uecc_word_t min = (k < num_words ? 0 : (k + 1) - num_words);\n    for (i = min; i <= k && i <= k - i; ++i) {\n      if (i < k - i) {\n        mul2add(left[i], left[k - i], &r0, &r1, &r2);\n      } else {\n        muladd(left[i], left[k - i], &r0, &r1, &r2);\n      }\n    }\n    result[k] = r0;\n    r0 = r1;\n    r1 = r2;\n    r2 = 0;\n  }\n\n  result[num_words * 2 - 1] = r0;\n}\n#endif /* !asm_square */\n\n#else /* MG_UECC_SQUARE_FUNC */\n\n#if MG_UECC_ENABLE_VLI_API\nMG_UECC_VLI_API void mg_uecc_vli_square(mg_uecc_word_t *result,\n                                        const mg_uecc_word_t *left,\n                                        wordcount_t num_words) {\n  mg_uecc_vli_mult(result, left, left, num_words);\n}\n#endif /* MG_UECC_ENABLE_VLI_API */\n\n#endif /* MG_UECC_SQUARE_FUNC */\n\n/* Computes result = (left + right) % mod.\n   Assumes that left < mod and right < mod, and that result does not overlap\n   mod. */\nMG_UECC_VLI_API void mg_uecc_vli_modAdd(mg_uecc_word_t *result,\n                                        const mg_uecc_word_t *left,\n                                        const mg_uecc_word_t *right,\n                                        const mg_uecc_word_t *mod,\n                                        wordcount_t num_words) {\n  mg_uecc_word_t carry = mg_uecc_vli_add(result, left, right, num_words);\n  if (carry || mg_uecc_vli_cmp_unsafe(mod, result, num_words) != 1) {\n    /* result > mod (result = mod + remainder), so subtract mod to get\n     * remainder. */\n    mg_uecc_vli_sub(result, result, mod, num_words);\n  }\n}\n\n/* Computes result = (left - right) % mod.\n   Assumes that left < mod and right < mod, and that result does not overlap\n   mod. */\nMG_UECC_VLI_API void mg_uecc_vli_modSub(mg_uecc_word_t *result,\n                                        const mg_uecc_word_t *left,\n                                        const mg_uecc_word_t *right,\n                                        const mg_uecc_word_t *mod,\n                                        wordcount_t num_words) {\n  mg_uecc_word_t l_borrow = mg_uecc_vli_sub(result, left, right, num_words);\n  if (l_borrow) {\n    /* In this case, result == -diff == (max int) - diff. Since -x % d == d - x,\n       we can get the correct result from result + mod (with overflow). */\n    mg_uecc_vli_add(result, result, mod, num_words);\n  }\n}\n\n/* Computes result = product % mod, where product is 2N words long. */\n/* Currently only designed to work for curve_p or curve_n. */\nMG_UECC_VLI_API void mg_uecc_vli_mmod(mg_uecc_word_t *result,\n                                      mg_uecc_word_t *product,\n                                      const mg_uecc_word_t *mod,\n                                      wordcount_t num_words) {\n  mg_uecc_word_t mod_multiple[2 * MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tmp[2 * MG_UECC_MAX_WORDS];\n  mg_uecc_word_t *v[2] = {tmp, product};\n  mg_uecc_word_t index;\n\n  /* Shift mod so its highest set bit is at the maximum position. */\n  bitcount_t shift = (bitcount_t) ((num_words * 2 * MG_UECC_WORD_BITS) -\n                                   mg_uecc_vli_numBits(mod, num_words));\n  wordcount_t word_shift = (wordcount_t) (shift / MG_UECC_WORD_BITS);\n  wordcount_t bit_shift = (wordcount_t) (shift % MG_UECC_WORD_BITS);\n  mg_uecc_word_t carry = 0;\n  mg_uecc_vli_clear(mod_multiple, word_shift);\n  if (bit_shift > 0) {\n    for (index = 0; index < (mg_uecc_word_t) num_words; ++index) {\n      mod_multiple[(mg_uecc_word_t) word_shift + index] =\n          (mg_uecc_word_t) (mod[index] << bit_shift) | carry;\n      carry = mod[index] >> (MG_UECC_WORD_BITS - bit_shift);\n    }\n  } else {\n    mg_uecc_vli_set(mod_multiple + word_shift, mod, num_words);\n  }\n\n  for (index = 1; shift >= 0; --shift) {\n    mg_uecc_word_t borrow = 0;\n    wordcount_t i;\n    for (i = 0; i < num_words * 2; ++i) {\n      mg_uecc_word_t diff = v[index][i] - mod_multiple[i] - borrow;\n      if (diff != v[index][i]) {\n        borrow = (diff > v[index][i]);\n      }\n      v[1 - index][i] = diff;\n    }\n    index = !(index ^ borrow); /* Swap the index if there was no borrow */\n    mg_uecc_vli_rshift1(mod_multiple, num_words);\n    mod_multiple[num_words - 1] |= mod_multiple[num_words]\n                                   << (MG_UECC_WORD_BITS - 1);\n    mg_uecc_vli_rshift1(mod_multiple + num_words, num_words);\n  }\n  mg_uecc_vli_set(result, v[index], num_words);\n}\n\n/* Computes result = (left * right) % mod. */\nMG_UECC_VLI_API void mg_uecc_vli_modMult(mg_uecc_word_t *result,\n                                         const mg_uecc_word_t *left,\n                                         const mg_uecc_word_t *right,\n                                         const mg_uecc_word_t *mod,\n                                         wordcount_t num_words) {\n  mg_uecc_word_t product[2 * MG_UECC_MAX_WORDS];\n  mg_uecc_vli_mult(product, left, right, num_words);\n  mg_uecc_vli_mmod(result, product, mod, num_words);\n}\n\nMG_UECC_VLI_API void mg_uecc_vli_modMult_fast(mg_uecc_word_t *result,\n                                              const mg_uecc_word_t *left,\n                                              const mg_uecc_word_t *right,\n                                              MG_UECC_Curve curve) {\n  mg_uecc_word_t product[2 * MG_UECC_MAX_WORDS];\n  mg_uecc_vli_mult(product, left, right, curve->num_words);\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n  curve->mmod_fast(result, product);\n#else\n  mg_uecc_vli_mmod(result, product, curve->p, curve->num_words);\n#endif\n}\n\n#if MG_UECC_SQUARE_FUNC\n\n#if MG_UECC_ENABLE_VLI_API\n/* Computes result = left^2 % mod. */\nMG_UECC_VLI_API void mg_uecc_vli_modSquare(mg_uecc_word_t *result,\n                                           const mg_uecc_word_t *left,\n                                           const mg_uecc_word_t *mod,\n                                           wordcount_t num_words) {\n  mg_uecc_word_t product[2 * MG_UECC_MAX_WORDS];\n  mg_uecc_vli_square(product, left, num_words);\n  mg_uecc_vli_mmod(result, product, mod, num_words);\n}\n#endif /* MG_UECC_ENABLE_VLI_API */\n\nMG_UECC_VLI_API void mg_uecc_vli_modSquare_fast(mg_uecc_word_t *result,\n                                                const mg_uecc_word_t *left,\n                                                MG_UECC_Curve curve) {\n  mg_uecc_word_t product[2 * MG_UECC_MAX_WORDS];\n  mg_uecc_vli_square(product, left, curve->num_words);\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n  curve->mmod_fast(result, product);\n#else\n  mg_uecc_vli_mmod(result, product, curve->p, curve->num_words);\n#endif\n}\n\n#else /* MG_UECC_SQUARE_FUNC */\n\n#if MG_UECC_ENABLE_VLI_API\nMG_UECC_VLI_API void mg_uecc_vli_modSquare(mg_uecc_word_t *result,\n                                           const mg_uecc_word_t *left,\n                                           const mg_uecc_word_t *mod,\n                                           wordcount_t num_words) {\n  mg_uecc_vli_modMult(result, left, left, mod, num_words);\n}\n#endif /* MG_UECC_ENABLE_VLI_API */\n\nMG_UECC_VLI_API void mg_uecc_vli_modSquare_fast(mg_uecc_word_t *result,\n                                                const mg_uecc_word_t *left,\n                                                MG_UECC_Curve curve) {\n  mg_uecc_vli_modMult_fast(result, left, left, curve);\n}\n\n#endif /* MG_UECC_SQUARE_FUNC */\n\n#define EVEN(vli) (!(vli[0] & 1))\nstatic void vli_modInv_update(mg_uecc_word_t *uv, const mg_uecc_word_t *mod,\n                              wordcount_t num_words) {\n  mg_uecc_word_t carry = 0;\n  if (!EVEN(uv)) {\n    carry = mg_uecc_vli_add(uv, uv, mod, num_words);\n  }\n  mg_uecc_vli_rshift1(uv, num_words);\n  if (carry) {\n    uv[num_words - 1] |= HIGH_BIT_SET;\n  }\n}\n\n/* Computes result = (1 / input) % mod. All VLIs are the same size.\n   See \"From Euclid's GCD to Montgomery Multiplication to the Great Divide\" */\nMG_UECC_VLI_API void mg_uecc_vli_modInv(mg_uecc_word_t *result,\n                                        const mg_uecc_word_t *input,\n                                        const mg_uecc_word_t *mod,\n                                        wordcount_t num_words) {\n  mg_uecc_word_t a[MG_UECC_MAX_WORDS], b[MG_UECC_MAX_WORDS],\n      u[MG_UECC_MAX_WORDS], v[MG_UECC_MAX_WORDS];\n  cmpresult_t cmpResult;\n\n  if (mg_uecc_vli_isZero(input, num_words)) {\n    mg_uecc_vli_clear(result, num_words);\n    return;\n  }\n\n  mg_uecc_vli_set(a, input, num_words);\n  mg_uecc_vli_set(b, mod, num_words);\n  mg_uecc_vli_clear(u, num_words);\n  u[0] = 1;\n  mg_uecc_vli_clear(v, num_words);\n  while ((cmpResult = mg_uecc_vli_cmp_unsafe(a, b, num_words)) != 0) {\n    if (EVEN(a)) {\n      mg_uecc_vli_rshift1(a, num_words);\n      vli_modInv_update(u, mod, num_words);\n    } else if (EVEN(b)) {\n      mg_uecc_vli_rshift1(b, num_words);\n      vli_modInv_update(v, mod, num_words);\n    } else if (cmpResult > 0) {\n      mg_uecc_vli_sub(a, a, b, num_words);\n      mg_uecc_vli_rshift1(a, num_words);\n      if (mg_uecc_vli_cmp_unsafe(u, v, num_words) < 0) {\n        mg_uecc_vli_add(u, u, mod, num_words);\n      }\n      mg_uecc_vli_sub(u, u, v, num_words);\n      vli_modInv_update(u, mod, num_words);\n    } else {\n      mg_uecc_vli_sub(b, b, a, num_words);\n      mg_uecc_vli_rshift1(b, num_words);\n      if (mg_uecc_vli_cmp_unsafe(v, u, num_words) < 0) {\n        mg_uecc_vli_add(v, v, mod, num_words);\n      }\n      mg_uecc_vli_sub(v, v, u, num_words);\n      vli_modInv_update(v, mod, num_words);\n    }\n  }\n  mg_uecc_vli_set(result, u, num_words);\n}\n\n/* ------ Point operations ------ */\n\n/* Copyright 2015, Kenneth MacKay. Licensed under the BSD 2-clause license. */\n\n#ifndef _UECC_CURVE_SPECIFIC_H_\n#define _UECC_CURVE_SPECIFIC_H_\n\n#define num_bytes_secp160r1 20\n#define num_bytes_secp192r1 24\n#define num_bytes_secp224r1 28\n#define num_bytes_secp256r1 32\n#define num_bytes_secp256k1 32\n\n#if (MG_UECC_WORD_SIZE == 1)\n\n#define num_words_secp160r1 20\n#define num_words_secp192r1 24\n#define num_words_secp224r1 28\n#define num_words_secp256r1 32\n#define num_words_secp256k1 32\n\n#define BYTES_TO_WORDS_8(a, b, c, d, e, f, g, h) \\\n  0x##a, 0x##b, 0x##c, 0x##d, 0x##e, 0x##f, 0x##g, 0x##h\n#define BYTES_TO_WORDS_4(a, b, c, d) 0x##a, 0x##b, 0x##c, 0x##d\n\n#elif (MG_UECC_WORD_SIZE == 4)\n\n#define num_words_secp160r1 5\n#define num_words_secp192r1 6\n#define num_words_secp224r1 7\n#define num_words_secp256r1 8\n#define num_words_secp256k1 8\n\n#define BYTES_TO_WORDS_8(a, b, c, d, e, f, g, h) 0x##d##c##b##a, 0x##h##g##f##e\n#define BYTES_TO_WORDS_4(a, b, c, d) 0x##d##c##b##a\n\n#elif (MG_UECC_WORD_SIZE == 8)\n\n#define num_words_secp160r1 3\n#define num_words_secp192r1 3\n#define num_words_secp224r1 4\n#define num_words_secp256r1 4\n#define num_words_secp256k1 4\n\n#define BYTES_TO_WORDS_8(a, b, c, d, e, f, g, h) 0x##h##g##f##e##d##c##b##a##U\n#define BYTES_TO_WORDS_4(a, b, c, d) 0x##d##c##b##a##U\n\n#endif /* MG_UECC_WORD_SIZE */\n\n#if MG_UECC_SUPPORTS_secp160r1 || MG_UECC_SUPPORTS_secp192r1 || \\\n    MG_UECC_SUPPORTS_secp224r1 || MG_UECC_SUPPORTS_secp256r1\nstatic void double_jacobian_default(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                                    mg_uecc_word_t *Z1, MG_UECC_Curve curve) {\n  /* t1 = X, t2 = Y, t3 = Z */\n  mg_uecc_word_t t4[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t t5[MG_UECC_MAX_WORDS];\n  wordcount_t num_words = curve->num_words;\n\n  if (mg_uecc_vli_isZero(Z1, num_words)) {\n    return;\n  }\n\n  mg_uecc_vli_modSquare_fast(t4, Y1, curve);   /* t4 = y1^2 */\n  mg_uecc_vli_modMult_fast(t5, X1, t4, curve); /* t5 = x1*y1^2 = A */\n  mg_uecc_vli_modSquare_fast(t4, t4, curve);   /* t4 = y1^4 */\n  mg_uecc_vli_modMult_fast(Y1, Y1, Z1, curve); /* t2 = y1*z1 = z3 */\n  mg_uecc_vli_modSquare_fast(Z1, Z1, curve);   /* t3 = z1^2 */\n\n  mg_uecc_vli_modAdd(X1, X1, Z1, curve->p, num_words); /* t1 = x1 + z1^2 */\n  mg_uecc_vli_modAdd(Z1, Z1, Z1, curve->p, num_words); /* t3 = 2*z1^2 */\n  mg_uecc_vli_modSub(Z1, X1, Z1, curve->p, num_words); /* t3 = x1 - z1^2 */\n  mg_uecc_vli_modMult_fast(X1, X1, Z1, curve);         /* t1 = x1^2 - z1^4 */\n\n  mg_uecc_vli_modAdd(Z1, X1, X1, curve->p,\n                     num_words); /* t3 = 2*(x1^2 - z1^4) */\n  mg_uecc_vli_modAdd(X1, X1, Z1, curve->p,\n                     num_words); /* t1 = 3*(x1^2 - z1^4) */\n  if (mg_uecc_vli_testBit(X1, 0)) {\n    mg_uecc_word_t l_carry = mg_uecc_vli_add(X1, X1, curve->p, num_words);\n    mg_uecc_vli_rshift1(X1, num_words);\n    X1[num_words - 1] |= l_carry << (MG_UECC_WORD_BITS - 1);\n  } else {\n    mg_uecc_vli_rshift1(X1, num_words);\n  }\n  /* t1 = 3/2*(x1^2 - z1^4) = B */\n\n  mg_uecc_vli_modSquare_fast(Z1, X1, curve);           /* t3 = B^2 */\n  mg_uecc_vli_modSub(Z1, Z1, t5, curve->p, num_words); /* t3 = B^2 - A */\n  mg_uecc_vli_modSub(Z1, Z1, t5, curve->p, num_words); /* t3 = B^2 - 2A = x3 */\n  mg_uecc_vli_modSub(t5, t5, Z1, curve->p, num_words); /* t5 = A - x3 */\n  mg_uecc_vli_modMult_fast(X1, X1, t5, curve);         /* t1 = B * (A - x3) */\n  mg_uecc_vli_modSub(t4, X1, t4, curve->p,\n                     num_words); /* t4 = B * (A - x3) - y1^4 = y3 */\n\n  mg_uecc_vli_set(X1, Z1, num_words);\n  mg_uecc_vli_set(Z1, Y1, num_words);\n  mg_uecc_vli_set(Y1, t4, num_words);\n}\n\n/* Computes result = x^3 + ax + b. result must not overlap x. */\nstatic void x_side_default(mg_uecc_word_t *result, const mg_uecc_word_t *x,\n                           MG_UECC_Curve curve) {\n  mg_uecc_word_t _3[MG_UECC_MAX_WORDS] = {3}; /* -a = 3 */\n  wordcount_t num_words = curve->num_words;\n\n  mg_uecc_vli_modSquare_fast(result, x, curve);                /* r = x^2 */\n  mg_uecc_vli_modSub(result, result, _3, curve->p, num_words); /* r = x^2 - 3 */\n  mg_uecc_vli_modMult_fast(result, result, x, curve); /* r = x^3 - 3x */\n  mg_uecc_vli_modAdd(result, result, curve->b, curve->p,\n                     num_words); /* r = x^3 - 3x + b */\n}\n#endif /* MG_UECC_SUPPORTS_secp... */\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n#if MG_UECC_SUPPORTS_secp160r1 || MG_UECC_SUPPORTS_secp192r1 || \\\n    MG_UECC_SUPPORTS_secp256r1 || MG_UECC_SUPPORTS_secp256k1\n/* Compute a = sqrt(a) (mod curve_p). */\nstatic void mod_sqrt_default(mg_uecc_word_t *a, MG_UECC_Curve curve) {\n  bitcount_t i;\n  mg_uecc_word_t p1[MG_UECC_MAX_WORDS] = {1};\n  mg_uecc_word_t l_result[MG_UECC_MAX_WORDS] = {1};\n  wordcount_t num_words = curve->num_words;\n\n  /* When curve->p == 3 (mod 4), we can compute\n     sqrt(a) = a^((curve->p + 1) / 4) (mod curve->p). */\n  mg_uecc_vli_add(p1, curve->p, p1, num_words); /* p1 = curve_p + 1 */\n  for (i = mg_uecc_vli_numBits(p1, num_words) - 1; i > 1; --i) {\n    mg_uecc_vli_modSquare_fast(l_result, l_result, curve);\n    if (mg_uecc_vli_testBit(p1, i)) {\n      mg_uecc_vli_modMult_fast(l_result, l_result, a, curve);\n    }\n  }\n  mg_uecc_vli_set(a, l_result, num_words);\n}\n#endif /* MG_UECC_SUPPORTS_secp... */\n#endif /* MG_UECC_SUPPORT_COMPRESSED_POINT */\n\n#if MG_UECC_SUPPORTS_secp160r1\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\nstatic void vli_mmod_fast_secp160r1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product);\n#endif\n\nstatic const struct MG_UECC_Curve_t curve_secp160r1 = {\n    num_words_secp160r1,\n    num_bytes_secp160r1,\n    161, /* num_n_bits */\n    {BYTES_TO_WORDS_8(FF, FF, FF, 7F, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_4(FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(57, 22, 75, CA, D3, AE, 27, F9),\n     BYTES_TO_WORDS_8(C8, F4, 01, 00, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, 01, 00, 00, 00)},\n    {BYTES_TO_WORDS_8(82, FC, CB, 13, B9, 8B, C3, 68),\n     BYTES_TO_WORDS_8(89, 69, 64, 46, 28, 73, F5, 8E),\n     BYTES_TO_WORDS_4(68, B5, 96, 4A),\n\n     BYTES_TO_WORDS_8(32, FB, C5, 7A, 37, 51, 23, 04),\n     BYTES_TO_WORDS_8(12, C9, DC, 59, 7D, 94, 68, 31),\n     BYTES_TO_WORDS_4(55, 28, A6, 23)},\n    {BYTES_TO_WORDS_8(45, FA, 65, C5, AD, D4, D4, 81),\n     BYTES_TO_WORDS_8(9F, F8, AC, 65, 8B, 7A, BD, 54),\n     BYTES_TO_WORDS_4(FC, BE, 97, 1C)},\n    &double_jacobian_default,\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n    &mod_sqrt_default,\n#endif\n    &x_side_default,\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n    &vli_mmod_fast_secp160r1\n#endif\n};\n\nMG_UECC_Curve mg_uecc_secp160r1(void) {\n  return &curve_secp160r1;\n}\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0 && !asm_mmod_fast_secp160r1)\n/* Computes result = product % curve_p\n    see http://www.isys.uni-klu.ac.at/PDF/2001-0126-MT.pdf page 354\n\n    Note that this only works if log2(omega) < log2(p) / 2 */\nstatic void omega_mult_secp160r1(mg_uecc_word_t *result,\n                                 const mg_uecc_word_t *right);\n#if MG_UECC_WORD_SIZE == 8\nstatic void vli_mmod_fast_secp160r1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product) {\n  mg_uecc_word_t tmp[2 * num_words_secp160r1];\n  mg_uecc_word_t copy;\n\n  mg_uecc_vli_clear(tmp, num_words_secp160r1);\n  mg_uecc_vli_clear(tmp + num_words_secp160r1, num_words_secp160r1);\n\n  omega_mult_secp160r1(tmp,\n                       product + num_words_secp160r1 - 1); /* (Rq, q) = q * c */\n\n  product[num_words_secp160r1 - 1] &= 0xffffffff;\n  copy = tmp[num_words_secp160r1 - 1];\n  tmp[num_words_secp160r1 - 1] &= 0xffffffff;\n  mg_uecc_vli_add(result, product, tmp,\n                  num_words_secp160r1); /* (C, r) = r + q */\n  mg_uecc_vli_clear(product, num_words_secp160r1);\n  tmp[num_words_secp160r1 - 1] = copy;\n  omega_mult_secp160r1(product, tmp + num_words_secp160r1 - 1); /* Rq*c */\n  mg_uecc_vli_add(result, result, product,\n                  num_words_secp160r1); /* (C1, r) = r + Rq*c */\n\n  while (mg_uecc_vli_cmp_unsafe(result, curve_secp160r1.p,\n                                num_words_secp160r1) > 0) {\n    mg_uecc_vli_sub(result, result, curve_secp160r1.p, num_words_secp160r1);\n  }\n}\n\nstatic void omega_mult_secp160r1(uint64_t *result, const uint64_t *right) {\n  uint32_t carry;\n  unsigned i;\n\n  /* Multiply by (2^31 + 1). */\n  carry = 0;\n  for (i = 0; i < num_words_secp160r1; ++i) {\n    uint64_t tmp = (right[i] >> 32) | (right[i + 1] << 32);\n    result[i] = (tmp << 31) + tmp + carry;\n    carry = (tmp >> 33) + (result[i] < tmp || (carry && result[i] == tmp));\n  }\n  result[i] = carry;\n}\n#else\nstatic void vli_mmod_fast_secp160r1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product) {\n  mg_uecc_word_t tmp[2 * num_words_secp160r1];\n  mg_uecc_word_t carry;\n\n  mg_uecc_vli_clear(tmp, num_words_secp160r1);\n  mg_uecc_vli_clear(tmp + num_words_secp160r1, num_words_secp160r1);\n\n  omega_mult_secp160r1(tmp,\n                       product + num_words_secp160r1); /* (Rq, q) = q * c */\n\n  carry = mg_uecc_vli_add(result, product, tmp,\n                          num_words_secp160r1); /* (C, r) = r + q */\n  mg_uecc_vli_clear(product, num_words_secp160r1);\n  omega_mult_secp160r1(product, tmp + num_words_secp160r1); /* Rq*c */\n  carry += mg_uecc_vli_add(result, result, product,\n                           num_words_secp160r1); /* (C1, r) = r + Rq*c */\n\n  while (carry > 0) {\n    --carry;\n    mg_uecc_vli_sub(result, result, curve_secp160r1.p, num_words_secp160r1);\n  }\n  if (mg_uecc_vli_cmp_unsafe(result, curve_secp160r1.p, num_words_secp160r1) >\n      0) {\n    mg_uecc_vli_sub(result, result, curve_secp160r1.p, num_words_secp160r1);\n  }\n}\n#endif\n\n#if MG_UECC_WORD_SIZE == 1\nstatic void omega_mult_secp160r1(uint8_t *result, const uint8_t *right) {\n  uint8_t carry;\n  uint8_t i;\n\n  /* Multiply by (2^31 + 1). */\n  mg_uecc_vli_set(result + 4, right, num_words_secp160r1); /* 2^32 */\n  mg_uecc_vli_rshift1(result + 4, num_words_secp160r1);    /* 2^31 */\n  result[3] = right[0] << 7; /* get last bit from shift */\n\n  carry = mg_uecc_vli_add(result, result, right,\n                          num_words_secp160r1); /* 2^31 + 1 */\n  for (i = num_words_secp160r1; carry; ++i) {\n    uint16_t sum = (uint16_t) result[i] + carry;\n    result[i] = (uint8_t) sum;\n    carry = sum >> 8;\n  }\n}\n#elif MG_UECC_WORD_SIZE == 4\nstatic void omega_mult_secp160r1(uint32_t *result, const uint32_t *right) {\n  uint32_t carry;\n  unsigned i;\n\n  /* Multiply by (2^31 + 1). */\n  mg_uecc_vli_set(result + 1, right, num_words_secp160r1); /* 2^32 */\n  mg_uecc_vli_rshift1(result + 1, num_words_secp160r1);    /* 2^31 */\n  result[0] = right[0] << 31; /* get last bit from shift */\n\n  carry = mg_uecc_vli_add(result, result, right,\n                          num_words_secp160r1); /* 2^31 + 1 */\n  for (i = num_words_secp160r1; carry; ++i) {\n    uint64_t sum = (uint64_t) result[i] + carry;\n    result[i] = (uint32_t) sum;\n    carry = sum >> 32;\n  }\n}\n#endif /* MG_UECC_WORD_SIZE */\n#endif /* (MG_UECC_OPTIMIZATION_LEVEL > 0 && !asm_mmod_fast_secp160r1) */\n\n#endif /* MG_UECC_SUPPORTS_secp160r1 */\n\n#if MG_UECC_SUPPORTS_secp192r1\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\nstatic void vli_mmod_fast_secp192r1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product);\n#endif\n\nstatic const struct MG_UECC_Curve_t curve_secp192r1 = {\n    num_words_secp192r1,\n    num_bytes_secp192r1,\n    192, /* num_n_bits */\n    {BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FE, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(31, 28, D2, B4, B1, C9, 6B, 14),\n     BYTES_TO_WORDS_8(36, F8, DE, 99, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(12, 10, FF, 82, FD, 0A, FF, F4),\n     BYTES_TO_WORDS_8(00, 88, A1, 43, EB, 20, BF, 7C),\n     BYTES_TO_WORDS_8(F6, 90, 30, B0, 0E, A8, 8D, 18),\n\n     BYTES_TO_WORDS_8(11, 48, 79, 1E, A1, 77, F9, 73),\n     BYTES_TO_WORDS_8(D5, CD, 24, 6B, ED, 11, 10, 63),\n     BYTES_TO_WORDS_8(78, DA, C8, FF, 95, 2B, 19, 07)},\n    {BYTES_TO_WORDS_8(B1, B9, 46, C1, EC, DE, B8, FE),\n     BYTES_TO_WORDS_8(49, 30, 24, 72, AB, E9, A7, 0F),\n     BYTES_TO_WORDS_8(E7, 80, 9C, E5, 19, 05, 21, 64)},\n    &double_jacobian_default,\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n    &mod_sqrt_default,\n#endif\n    &x_side_default,\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n    &vli_mmod_fast_secp192r1\n#endif\n};\n\nMG_UECC_Curve mg_uecc_secp192r1(void) {\n  return &curve_secp192r1;\n}\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n/* Computes result = product % curve_p.\n   See algorithm 5 and 6 from http://www.isys.uni-klu.ac.at/PDF/2001-0126-MT.pdf\n */\n#if MG_UECC_WORD_SIZE == 1\nstatic void vli_mmod_fast_secp192r1(uint8_t *result, uint8_t *product) {\n  uint8_t tmp[num_words_secp192r1];\n  uint8_t carry;\n\n  mg_uecc_vli_set(result, product, num_words_secp192r1);\n\n  mg_uecc_vli_set(tmp, &product[24], num_words_secp192r1);\n  carry = mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  tmp[0] = tmp[1] = tmp[2] = tmp[3] = tmp[4] = tmp[5] = tmp[6] = tmp[7] = 0;\n  tmp[8] = product[24];\n  tmp[9] = product[25];\n  tmp[10] = product[26];\n  tmp[11] = product[27];\n  tmp[12] = product[28];\n  tmp[13] = product[29];\n  tmp[14] = product[30];\n  tmp[15] = product[31];\n  tmp[16] = product[32];\n  tmp[17] = product[33];\n  tmp[18] = product[34];\n  tmp[19] = product[35];\n  tmp[20] = product[36];\n  tmp[21] = product[37];\n  tmp[22] = product[38];\n  tmp[23] = product[39];\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  tmp[0] = tmp[8] = product[40];\n  tmp[1] = tmp[9] = product[41];\n  tmp[2] = tmp[10] = product[42];\n  tmp[3] = tmp[11] = product[43];\n  tmp[4] = tmp[12] = product[44];\n  tmp[5] = tmp[13] = product[45];\n  tmp[6] = tmp[14] = product[46];\n  tmp[7] = tmp[15] = product[47];\n  tmp[16] = tmp[17] = tmp[18] = tmp[19] = tmp[20] = tmp[21] = tmp[22] =\n      tmp[23] = 0;\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  while (carry || mg_uecc_vli_cmp_unsafe(curve_secp192r1.p, result,\n                                         num_words_secp192r1) != 1) {\n    carry -=\n        mg_uecc_vli_sub(result, result, curve_secp192r1.p, num_words_secp192r1);\n  }\n}\n#elif MG_UECC_WORD_SIZE == 4\nstatic void vli_mmod_fast_secp192r1(uint32_t *result, uint32_t *product) {\n  uint32_t tmp[num_words_secp192r1];\n  int carry;\n\n  mg_uecc_vli_set(result, product, num_words_secp192r1);\n\n  mg_uecc_vli_set(tmp, &product[6], num_words_secp192r1);\n  carry = mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  tmp[0] = tmp[1] = 0;\n  tmp[2] = product[6];\n  tmp[3] = product[7];\n  tmp[4] = product[8];\n  tmp[5] = product[9];\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  tmp[0] = tmp[2] = product[10];\n  tmp[1] = tmp[3] = product[11];\n  tmp[4] = tmp[5] = 0;\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  while (carry || mg_uecc_vli_cmp_unsafe(curve_secp192r1.p, result,\n                                         num_words_secp192r1) != 1) {\n    carry -=\n        mg_uecc_vli_sub(result, result, curve_secp192r1.p, num_words_secp192r1);\n  }\n}\n#else\nstatic void vli_mmod_fast_secp192r1(uint64_t *result, uint64_t *product) {\n  uint64_t tmp[num_words_secp192r1];\n  int carry;\n\n  mg_uecc_vli_set(result, product, num_words_secp192r1);\n\n  mg_uecc_vli_set(tmp, &product[3], num_words_secp192r1);\n  carry = (int) mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  tmp[0] = 0;\n  tmp[1] = product[3];\n  tmp[2] = product[4];\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  tmp[0] = tmp[1] = product[5];\n  tmp[2] = 0;\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp192r1);\n\n  while (carry || mg_uecc_vli_cmp_unsafe(curve_secp192r1.p, result,\n                                         num_words_secp192r1) != 1) {\n    carry -=\n        mg_uecc_vli_sub(result, result, curve_secp192r1.p, num_words_secp192r1);\n  }\n}\n#endif /* MG_UECC_WORD_SIZE */\n#endif /* (MG_UECC_OPTIMIZATION_LEVEL > 0) */\n\n#endif /* MG_UECC_SUPPORTS_secp192r1 */\n\n#if MG_UECC_SUPPORTS_secp224r1\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\nstatic void mod_sqrt_secp224r1(mg_uecc_word_t *a, MG_UECC_Curve curve);\n#endif\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\nstatic void vli_mmod_fast_secp224r1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product);\n#endif\n\nstatic const struct MG_UECC_Curve_t curve_secp224r1 = {\n    num_words_secp224r1,\n    num_bytes_secp224r1,\n    224, /* num_n_bits */\n    {BYTES_TO_WORDS_8(01, 00, 00, 00, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_4(FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(3D, 2A, 5C, 5C, 45, 29, DD, 13),\n     BYTES_TO_WORDS_8(3E, F0, B8, E0, A2, 16, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_4(FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(21, 1D, 5C, 11, D6, 80, 32, 34),\n     BYTES_TO_WORDS_8(22, 11, C2, 56, D3, C1, 03, 4A),\n     BYTES_TO_WORDS_8(B9, 90, 13, 32, 7F, BF, B4, 6B),\n     BYTES_TO_WORDS_4(BD, 0C, 0E, B7),\n\n     BYTES_TO_WORDS_8(34, 7E, 00, 85, 99, 81, D5, 44),\n     BYTES_TO_WORDS_8(64, 47, 07, 5A, A0, 75, 43, CD),\n     BYTES_TO_WORDS_8(E6, DF, 22, 4C, FB, 23, F7, B5),\n     BYTES_TO_WORDS_4(88, 63, 37, BD)},\n    {BYTES_TO_WORDS_8(B4, FF, 55, 23, 43, 39, 0B, 27),\n     BYTES_TO_WORDS_8(BA, D8, BF, D7, B7, B0, 44, 50),\n     BYTES_TO_WORDS_8(56, 32, 41, F5, AB, B3, 04, 0C),\n     BYTES_TO_WORDS_4(85, 0A, 05, B4)},\n    &double_jacobian_default,\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n    &mod_sqrt_secp224r1,\n#endif\n    &x_side_default,\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n    &vli_mmod_fast_secp224r1\n#endif\n};\n\nMG_UECC_Curve mg_uecc_secp224r1(void) {\n  return &curve_secp224r1;\n}\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n/* Routine 3.2.4 RS;  from http://www.nsa.gov/ia/_files/nist-routines.pdf */\nstatic void mod_sqrt_secp224r1_rs(mg_uecc_word_t *d1, mg_uecc_word_t *e1,\n                                  mg_uecc_word_t *f1, const mg_uecc_word_t *d0,\n                                  const mg_uecc_word_t *e0,\n                                  const mg_uecc_word_t *f0) {\n  mg_uecc_word_t t[num_words_secp224r1];\n\n  mg_uecc_vli_modSquare_fast(t, d0, &curve_secp224r1);    /* t <-- d0 ^ 2 */\n  mg_uecc_vli_modMult_fast(e1, d0, e0, &curve_secp224r1); /* e1 <-- d0 * e0 */\n  mg_uecc_vli_modAdd(d1, t, f0, curve_secp224r1.p,\n                     num_words_secp224r1); /* d1 <-- t  + f0 */\n  mg_uecc_vli_modAdd(e1, e1, e1, curve_secp224r1.p,\n                     num_words_secp224r1);               /* e1 <-- e1 + e1 */\n  mg_uecc_vli_modMult_fast(f1, t, f0, &curve_secp224r1); /* f1 <-- t  * f0 */\n  mg_uecc_vli_modAdd(f1, f1, f1, curve_secp224r1.p,\n                     num_words_secp224r1); /* f1 <-- f1 + f1 */\n  mg_uecc_vli_modAdd(f1, f1, f1, curve_secp224r1.p,\n                     num_words_secp224r1); /* f1 <-- f1 + f1 */\n}\n\n/* Routine 3.2.5 RSS;  from http://www.nsa.gov/ia/_files/nist-routines.pdf */\nstatic void mod_sqrt_secp224r1_rss(mg_uecc_word_t *d1, mg_uecc_word_t *e1,\n                                   mg_uecc_word_t *f1, const mg_uecc_word_t *d0,\n                                   const mg_uecc_word_t *e0,\n                                   const mg_uecc_word_t *f0,\n                                   const bitcount_t j) {\n  bitcount_t i;\n\n  mg_uecc_vli_set(d1, d0, num_words_secp224r1); /* d1 <-- d0 */\n  mg_uecc_vli_set(e1, e0, num_words_secp224r1); /* e1 <-- e0 */\n  mg_uecc_vli_set(f1, f0, num_words_secp224r1); /* f1 <-- f0 */\n  for (i = 1; i <= j; i++) {\n    mod_sqrt_secp224r1_rs(d1, e1, f1, d1, e1, f1); /* RS (d1,e1,f1,d1,e1,f1) */\n  }\n}\n\n/* Routine 3.2.6 RM;  from http://www.nsa.gov/ia/_files/nist-routines.pdf */\nstatic void mod_sqrt_secp224r1_rm(mg_uecc_word_t *d2, mg_uecc_word_t *e2,\n                                  mg_uecc_word_t *f2, const mg_uecc_word_t *c,\n                                  const mg_uecc_word_t *d0,\n                                  const mg_uecc_word_t *e0,\n                                  const mg_uecc_word_t *d1,\n                                  const mg_uecc_word_t *e1) {\n  mg_uecc_word_t t1[num_words_secp224r1];\n  mg_uecc_word_t t2[num_words_secp224r1];\n\n  mg_uecc_vli_modMult_fast(t1, e0, e1, &curve_secp224r1); /* t1 <-- e0 * e1 */\n  mg_uecc_vli_modMult_fast(t1, t1, c, &curve_secp224r1);  /* t1 <-- t1 * c */\n  /* t1 <-- p  - t1 */\n  mg_uecc_vli_modSub(t1, curve_secp224r1.p, t1, curve_secp224r1.p,\n                     num_words_secp224r1);\n  mg_uecc_vli_modMult_fast(t2, d0, d1, &curve_secp224r1); /* t2 <-- d0 * d1 */\n  mg_uecc_vli_modAdd(t2, t2, t1, curve_secp224r1.p,\n                     num_words_secp224r1);                /* t2 <-- t2 + t1 */\n  mg_uecc_vli_modMult_fast(t1, d0, e1, &curve_secp224r1); /* t1 <-- d0 * e1 */\n  mg_uecc_vli_modMult_fast(e2, d1, e0, &curve_secp224r1); /* e2 <-- d1 * e0 */\n  mg_uecc_vli_modAdd(e2, e2, t1, curve_secp224r1.p,\n                     num_words_secp224r1);               /* e2 <-- e2 + t1 */\n  mg_uecc_vli_modSquare_fast(f2, e2, &curve_secp224r1);  /* f2 <-- e2^2 */\n  mg_uecc_vli_modMult_fast(f2, f2, c, &curve_secp224r1); /* f2 <-- f2 * c */\n  /* f2 <-- p  - f2 */\n  mg_uecc_vli_modSub(f2, curve_secp224r1.p, f2, curve_secp224r1.p,\n                     num_words_secp224r1);\n  mg_uecc_vli_set(d2, t2, num_words_secp224r1); /* d2 <-- t2 */\n}\n\n/* Routine 3.2.7 RP;  from http://www.nsa.gov/ia/_files/nist-routines.pdf */\nstatic void mod_sqrt_secp224r1_rp(mg_uecc_word_t *d1, mg_uecc_word_t *e1,\n                                  mg_uecc_word_t *f1, const mg_uecc_word_t *c,\n                                  const mg_uecc_word_t *r) {\n  wordcount_t i;\n  wordcount_t pow2i = 1;\n  mg_uecc_word_t d0[num_words_secp224r1];\n  mg_uecc_word_t e0[num_words_secp224r1] = {1}; /* e0 <-- 1 */\n  mg_uecc_word_t f0[num_words_secp224r1];\n\n  mg_uecc_vli_set(d0, r, num_words_secp224r1); /* d0 <-- r */\n  /* f0 <-- p  - c */\n  mg_uecc_vli_modSub(f0, curve_secp224r1.p, c, curve_secp224r1.p,\n                     num_words_secp224r1);\n  for (i = 0; i <= 6; i++) {\n    mod_sqrt_secp224r1_rss(d1, e1, f1, d0, e0, f0,\n                           pow2i); /* RSS (d1,e1,f1,d0,e0,f0,2^i) */\n    mod_sqrt_secp224r1_rm(d1, e1, f1, c, d1, e1, d0,\n                          e0); /* RM (d1,e1,f1,c,d1,e1,d0,e0) */\n    mg_uecc_vli_set(d0, d1, num_words_secp224r1); /* d0 <-- d1 */\n    mg_uecc_vli_set(e0, e1, num_words_secp224r1); /* e0 <-- e1 */\n    mg_uecc_vli_set(f0, f1, num_words_secp224r1); /* f0 <-- f1 */\n    pow2i *= 2;\n  }\n}\n\n/* Compute a = sqrt(a) (mod curve_p). */\n/* Routine 3.2.8 mp_mod_sqrt_224; from\n * http://www.nsa.gov/ia/_files/nist-routines.pdf */\nstatic void mod_sqrt_secp224r1(mg_uecc_word_t *a, MG_UECC_Curve curve) {\n  (void) curve;\n  bitcount_t i;\n  mg_uecc_word_t e1[num_words_secp224r1];\n  mg_uecc_word_t f1[num_words_secp224r1];\n  mg_uecc_word_t d0[num_words_secp224r1];\n  mg_uecc_word_t e0[num_words_secp224r1];\n  mg_uecc_word_t f0[num_words_secp224r1];\n  mg_uecc_word_t d1[num_words_secp224r1];\n\n  /* s = a; using constant instead of random value */\n  mod_sqrt_secp224r1_rp(d0, e0, f0, a, a); /* RP (d0, e0, f0, c, s) */\n  mod_sqrt_secp224r1_rs(d1, e1, f1, d0, e0,\n                        f0); /* RS (d1, e1, f1, d0, e0, f0) */\n  for (i = 1; i <= 95; i++) {\n    mg_uecc_vli_set(d0, d1, num_words_secp224r1); /* d0 <-- d1 */\n    mg_uecc_vli_set(e0, e1, num_words_secp224r1); /* e0 <-- e1 */\n    mg_uecc_vli_set(f0, f1, num_words_secp224r1); /* f0 <-- f1 */\n    mod_sqrt_secp224r1_rs(d1, e1, f1, d0, e0,\n                          f0); /* RS (d1, e1, f1, d0, e0, f0) */\n    if (mg_uecc_vli_isZero(d1, num_words_secp224r1)) { /* if d1 == 0 */\n      break;\n    }\n  }\n  mg_uecc_vli_modInv(f1, e0, curve_secp224r1.p,\n                     num_words_secp224r1);               /* f1 <-- 1 / e0 */\n  mg_uecc_vli_modMult_fast(a, d0, f1, &curve_secp224r1); /* a  <-- d0 / e0 */\n}\n#endif /* MG_UECC_SUPPORT_COMPRESSED_POINT */\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n/* Computes result = product % curve_p\n   from http://www.nsa.gov/ia/_files/nist-routines.pdf */\n#if MG_UECC_WORD_SIZE == 1\nstatic void vli_mmod_fast_secp224r1(uint8_t *result, uint8_t *product) {\n  uint8_t tmp[num_words_secp224r1];\n  int8_t carry;\n\n  /* t */\n  mg_uecc_vli_set(result, product, num_words_secp224r1);\n\n  /* s1 */\n  tmp[0] = tmp[1] = tmp[2] = tmp[3] = 0;\n  tmp[4] = tmp[5] = tmp[6] = tmp[7] = 0;\n  tmp[8] = tmp[9] = tmp[10] = tmp[11] = 0;\n  tmp[12] = product[28];\n  tmp[13] = product[29];\n  tmp[14] = product[30];\n  tmp[15] = product[31];\n  tmp[16] = product[32];\n  tmp[17] = product[33];\n  tmp[18] = product[34];\n  tmp[19] = product[35];\n  tmp[20] = product[36];\n  tmp[21] = product[37];\n  tmp[22] = product[38];\n  tmp[23] = product[39];\n  tmp[24] = product[40];\n  tmp[25] = product[41];\n  tmp[26] = product[42];\n  tmp[27] = product[43];\n  carry = mg_uecc_vli_add(result, result, tmp, num_words_secp224r1);\n\n  /* s2 */\n  tmp[12] = product[44];\n  tmp[13] = product[45];\n  tmp[14] = product[46];\n  tmp[15] = product[47];\n  tmp[16] = product[48];\n  tmp[17] = product[49];\n  tmp[18] = product[50];\n  tmp[19] = product[51];\n  tmp[20] = product[52];\n  tmp[21] = product[53];\n  tmp[22] = product[54];\n  tmp[23] = product[55];\n  tmp[24] = tmp[25] = tmp[26] = tmp[27] = 0;\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp224r1);\n\n  /* d1 */\n  tmp[0] = product[28];\n  tmp[1] = product[29];\n  tmp[2] = product[30];\n  tmp[3] = product[31];\n  tmp[4] = product[32];\n  tmp[5] = product[33];\n  tmp[6] = product[34];\n  tmp[7] = product[35];\n  tmp[8] = product[36];\n  tmp[9] = product[37];\n  tmp[10] = product[38];\n  tmp[11] = product[39];\n  tmp[12] = product[40];\n  tmp[13] = product[41];\n  tmp[14] = product[42];\n  tmp[15] = product[43];\n  tmp[16] = product[44];\n  tmp[17] = product[45];\n  tmp[18] = product[46];\n  tmp[19] = product[47];\n  tmp[20] = product[48];\n  tmp[21] = product[49];\n  tmp[22] = product[50];\n  tmp[23] = product[51];\n  tmp[24] = product[52];\n  tmp[25] = product[53];\n  tmp[26] = product[54];\n  tmp[27] = product[55];\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp224r1);\n\n  /* d2 */\n  tmp[0] = product[44];\n  tmp[1] = product[45];\n  tmp[2] = product[46];\n  tmp[3] = product[47];\n  tmp[4] = product[48];\n  tmp[5] = product[49];\n  tmp[6] = product[50];\n  tmp[7] = product[51];\n  tmp[8] = product[52];\n  tmp[9] = product[53];\n  tmp[10] = product[54];\n  tmp[11] = product[55];\n  tmp[12] = tmp[13] = tmp[14] = tmp[15] = 0;\n  tmp[16] = tmp[17] = tmp[18] = tmp[19] = 0;\n  tmp[20] = tmp[21] = tmp[22] = tmp[23] = 0;\n  tmp[24] = tmp[25] = tmp[26] = tmp[27] = 0;\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp224r1);\n\n  if (carry < 0) {\n    do {\n      carry += mg_uecc_vli_add(result, result, curve_secp224r1.p,\n                               num_words_secp224r1);\n    } while (carry < 0);\n  } else {\n    while (carry || mg_uecc_vli_cmp_unsafe(curve_secp224r1.p, result,\n                                           num_words_secp224r1) != 1) {\n      carry -= mg_uecc_vli_sub(result, result, curve_secp224r1.p,\n                               num_words_secp224r1);\n    }\n  }\n}\n#elif MG_UECC_WORD_SIZE == 4\nstatic void vli_mmod_fast_secp224r1(uint32_t *result, uint32_t *product) {\n  uint32_t tmp[num_words_secp224r1];\n  int carry;\n\n  /* t */\n  mg_uecc_vli_set(result, product, num_words_secp224r1);\n\n  /* s1 */\n  tmp[0] = tmp[1] = tmp[2] = 0;\n  tmp[3] = product[7];\n  tmp[4] = product[8];\n  tmp[5] = product[9];\n  tmp[6] = product[10];\n  carry = mg_uecc_vli_add(result, result, tmp, num_words_secp224r1);\n\n  /* s2 */\n  tmp[3] = product[11];\n  tmp[4] = product[12];\n  tmp[5] = product[13];\n  tmp[6] = 0;\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp224r1);\n\n  /* d1 */\n  tmp[0] = product[7];\n  tmp[1] = product[8];\n  tmp[2] = product[9];\n  tmp[3] = product[10];\n  tmp[4] = product[11];\n  tmp[5] = product[12];\n  tmp[6] = product[13];\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp224r1);\n\n  /* d2 */\n  tmp[0] = product[11];\n  tmp[1] = product[12];\n  tmp[2] = product[13];\n  tmp[3] = tmp[4] = tmp[5] = tmp[6] = 0;\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp224r1);\n\n  if (carry < 0) {\n    do {\n      carry += mg_uecc_vli_add(result, result, curve_secp224r1.p,\n                               num_words_secp224r1);\n    } while (carry < 0);\n  } else {\n    while (carry || mg_uecc_vli_cmp_unsafe(curve_secp224r1.p, result,\n                                           num_words_secp224r1) != 1) {\n      carry -= mg_uecc_vli_sub(result, result, curve_secp224r1.p,\n                               num_words_secp224r1);\n    }\n  }\n}\n#else\nstatic void vli_mmod_fast_secp224r1(uint64_t *result, uint64_t *product) {\n  uint64_t tmp[num_words_secp224r1];\n  int carry = 0;\n\n  /* t */\n  mg_uecc_vli_set(result, product, num_words_secp224r1);\n  result[num_words_secp224r1 - 1] &= 0xffffffff;\n\n  /* s1 */\n  tmp[0] = 0;\n  tmp[1] = product[3] & 0xffffffff00000000ull;\n  tmp[2] = product[4];\n  tmp[3] = product[5] & 0xffffffff;\n  mg_uecc_vli_add(result, result, tmp, num_words_secp224r1);\n\n  /* s2 */\n  tmp[1] = product[5] & 0xffffffff00000000ull;\n  tmp[2] = product[6];\n  tmp[3] = 0;\n  mg_uecc_vli_add(result, result, tmp, num_words_secp224r1);\n\n  /* d1 */\n  tmp[0] = (product[3] >> 32) | (product[4] << 32);\n  tmp[1] = (product[4] >> 32) | (product[5] << 32);\n  tmp[2] = (product[5] >> 32) | (product[6] << 32);\n  tmp[3] = product[6] >> 32;\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp224r1);\n\n  /* d2 */\n  tmp[0] = (product[5] >> 32) | (product[6] << 32);\n  tmp[1] = product[6] >> 32;\n  tmp[2] = tmp[3] = 0;\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp224r1);\n\n  if (carry < 0) {\n    do {\n      carry += mg_uecc_vli_add(result, result, curve_secp224r1.p,\n                               num_words_secp224r1);\n    } while (carry < 0);\n  } else {\n    while (mg_uecc_vli_cmp_unsafe(curve_secp224r1.p, result,\n                                  num_words_secp224r1) != 1) {\n      mg_uecc_vli_sub(result, result, curve_secp224r1.p, num_words_secp224r1);\n    }\n  }\n}\n#endif /* MG_UECC_WORD_SIZE */\n#endif /* (MG_UECC_OPTIMIZATION_LEVEL > 0) */\n\n#endif /* MG_UECC_SUPPORTS_secp224r1 */\n\n#if MG_UECC_SUPPORTS_secp256r1\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\nstatic void vli_mmod_fast_secp256r1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product);\n#endif\n\nstatic const struct MG_UECC_Curve_t curve_secp256r1 = {\n    num_words_secp256r1,\n    num_bytes_secp256r1,\n    256, /* num_n_bits */\n    {BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(01, 00, 00, 00, FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(51, 25, 63, FC, C2, CA, B9, F3),\n     BYTES_TO_WORDS_8(84, 9E, 17, A7, AD, FA, E6, BC),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(96, C2, 98, D8, 45, 39, A1, F4),\n     BYTES_TO_WORDS_8(A0, 33, EB, 2D, 81, 7D, 03, 77),\n     BYTES_TO_WORDS_8(F2, 40, A4, 63, E5, E6, BC, F8),\n     BYTES_TO_WORDS_8(47, 42, 2C, E1, F2, D1, 17, 6B),\n\n     BYTES_TO_WORDS_8(F5, 51, BF, 37, 68, 40, B6, CB),\n     BYTES_TO_WORDS_8(CE, 5E, 31, 6B, 57, 33, CE, 2B),\n     BYTES_TO_WORDS_8(16, 9E, 0F, 7C, 4A, EB, E7, 8E),\n     BYTES_TO_WORDS_8(9B, 7F, 1A, FE, E2, 42, E3, 4F)},\n    {BYTES_TO_WORDS_8(4B, 60, D2, 27, 3E, 3C, CE, 3B),\n     BYTES_TO_WORDS_8(F6, B0, 53, CC, B0, 06, 1D, 65),\n     BYTES_TO_WORDS_8(BC, 86, 98, 76, 55, BD, EB, B3),\n     BYTES_TO_WORDS_8(E7, 93, 3A, AA, D8, 35, C6, 5A)},\n    &double_jacobian_default,\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n    &mod_sqrt_default,\n#endif\n    &x_side_default,\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n    &vli_mmod_fast_secp256r1\n#endif\n};\n\nMG_UECC_Curve mg_uecc_secp256r1(void) {\n  return &curve_secp256r1;\n}\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0 && !asm_mmod_fast_secp256r1)\n/* Computes result = product % curve_p\n   from http://www.nsa.gov/ia/_files/nist-routines.pdf */\n#if MG_UECC_WORD_SIZE == 1\nstatic void vli_mmod_fast_secp256r1(uint8_t *result, uint8_t *product) {\n  uint8_t tmp[num_words_secp256r1];\n  int8_t carry;\n\n  /* t */\n  mg_uecc_vli_set(result, product, num_words_secp256r1);\n\n  /* s1 */\n  tmp[0] = tmp[1] = tmp[2] = tmp[3] = 0;\n  tmp[4] = tmp[5] = tmp[6] = tmp[7] = 0;\n  tmp[8] = tmp[9] = tmp[10] = tmp[11] = 0;\n  tmp[12] = product[44];\n  tmp[13] = product[45];\n  tmp[14] = product[46];\n  tmp[15] = product[47];\n  tmp[16] = product[48];\n  tmp[17] = product[49];\n  tmp[18] = product[50];\n  tmp[19] = product[51];\n  tmp[20] = product[52];\n  tmp[21] = product[53];\n  tmp[22] = product[54];\n  tmp[23] = product[55];\n  tmp[24] = product[56];\n  tmp[25] = product[57];\n  tmp[26] = product[58];\n  tmp[27] = product[59];\n  tmp[28] = product[60];\n  tmp[29] = product[61];\n  tmp[30] = product[62];\n  tmp[31] = product[63];\n  carry = mg_uecc_vli_add(tmp, tmp, tmp, num_words_secp256r1);\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s2 */\n  tmp[12] = product[48];\n  tmp[13] = product[49];\n  tmp[14] = product[50];\n  tmp[15] = product[51];\n  tmp[16] = product[52];\n  tmp[17] = product[53];\n  tmp[18] = product[54];\n  tmp[19] = product[55];\n  tmp[20] = product[56];\n  tmp[21] = product[57];\n  tmp[22] = product[58];\n  tmp[23] = product[59];\n  tmp[24] = product[60];\n  tmp[25] = product[61];\n  tmp[26] = product[62];\n  tmp[27] = product[63];\n  tmp[28] = tmp[29] = tmp[30] = tmp[31] = 0;\n  carry += mg_uecc_vli_add(tmp, tmp, tmp, num_words_secp256r1);\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s3 */\n  tmp[0] = product[32];\n  tmp[1] = product[33];\n  tmp[2] = product[34];\n  tmp[3] = product[35];\n  tmp[4] = product[36];\n  tmp[5] = product[37];\n  tmp[6] = product[38];\n  tmp[7] = product[39];\n  tmp[8] = product[40];\n  tmp[9] = product[41];\n  tmp[10] = product[42];\n  tmp[11] = product[43];\n  tmp[12] = tmp[13] = tmp[14] = tmp[15] = 0;\n  tmp[16] = tmp[17] = tmp[18] = tmp[19] = 0;\n  tmp[20] = tmp[21] = tmp[22] = tmp[23] = 0;\n  tmp[24] = product[56];\n  tmp[25] = product[57];\n  tmp[26] = product[58];\n  tmp[27] = product[59];\n  tmp[28] = product[60];\n  tmp[29] = product[61];\n  tmp[30] = product[62];\n  tmp[31] = product[63];\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s4 */\n  tmp[0] = product[36];\n  tmp[1] = product[37];\n  tmp[2] = product[38];\n  tmp[3] = product[39];\n  tmp[4] = product[40];\n  tmp[5] = product[41];\n  tmp[6] = product[42];\n  tmp[7] = product[43];\n  tmp[8] = product[44];\n  tmp[9] = product[45];\n  tmp[10] = product[46];\n  tmp[11] = product[47];\n  tmp[12] = product[52];\n  tmp[13] = product[53];\n  tmp[14] = product[54];\n  tmp[15] = product[55];\n  tmp[16] = product[56];\n  tmp[17] = product[57];\n  tmp[18] = product[58];\n  tmp[19] = product[59];\n  tmp[20] = product[60];\n  tmp[21] = product[61];\n  tmp[22] = product[62];\n  tmp[23] = product[63];\n  tmp[24] = product[52];\n  tmp[25] = product[53];\n  tmp[26] = product[54];\n  tmp[27] = product[55];\n  tmp[28] = product[32];\n  tmp[29] = product[33];\n  tmp[30] = product[34];\n  tmp[31] = product[35];\n  carry += mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* d1 */\n  tmp[0] = product[44];\n  tmp[1] = product[45];\n  tmp[2] = product[46];\n  tmp[3] = product[47];\n  tmp[4] = product[48];\n  tmp[5] = product[49];\n  tmp[6] = product[50];\n  tmp[7] = product[51];\n  tmp[8] = product[52];\n  tmp[9] = product[53];\n  tmp[10] = product[54];\n  tmp[11] = product[55];\n  tmp[12] = tmp[13] = tmp[14] = tmp[15] = 0;\n  tmp[16] = tmp[17] = tmp[18] = tmp[19] = 0;\n  tmp[20] = tmp[21] = tmp[22] = tmp[23] = 0;\n  tmp[24] = product[32];\n  tmp[25] = product[33];\n  tmp[26] = product[34];\n  tmp[27] = product[35];\n  tmp[28] = product[40];\n  tmp[29] = product[41];\n  tmp[30] = product[42];\n  tmp[31] = product[43];\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d2 */\n  tmp[0] = product[48];\n  tmp[1] = product[49];\n  tmp[2] = product[50];\n  tmp[3] = product[51];\n  tmp[4] = product[52];\n  tmp[5] = product[53];\n  tmp[6] = product[54];\n  tmp[7] = product[55];\n  tmp[8] = product[56];\n  tmp[9] = product[57];\n  tmp[10] = product[58];\n  tmp[11] = product[59];\n  tmp[12] = product[60];\n  tmp[13] = product[61];\n  tmp[14] = product[62];\n  tmp[15] = product[63];\n  tmp[16] = tmp[17] = tmp[18] = tmp[19] = 0;\n  tmp[20] = tmp[21] = tmp[22] = tmp[23] = 0;\n  tmp[24] = product[36];\n  tmp[25] = product[37];\n  tmp[26] = product[38];\n  tmp[27] = product[39];\n  tmp[28] = product[44];\n  tmp[29] = product[45];\n  tmp[30] = product[46];\n  tmp[31] = product[47];\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d3 */\n  tmp[0] = product[52];\n  tmp[1] = product[53];\n  tmp[2] = product[54];\n  tmp[3] = product[55];\n  tmp[4] = product[56];\n  tmp[5] = product[57];\n  tmp[6] = product[58];\n  tmp[7] = product[59];\n  tmp[8] = product[60];\n  tmp[9] = product[61];\n  tmp[10] = product[62];\n  tmp[11] = product[63];\n  tmp[12] = product[32];\n  tmp[13] = product[33];\n  tmp[14] = product[34];\n  tmp[15] = product[35];\n  tmp[16] = product[36];\n  tmp[17] = product[37];\n  tmp[18] = product[38];\n  tmp[19] = product[39];\n  tmp[20] = product[40];\n  tmp[21] = product[41];\n  tmp[22] = product[42];\n  tmp[23] = product[43];\n  tmp[24] = tmp[25] = tmp[26] = tmp[27] = 0;\n  tmp[28] = product[48];\n  tmp[29] = product[49];\n  tmp[30] = product[50];\n  tmp[31] = product[51];\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d4 */\n  tmp[0] = product[56];\n  tmp[1] = product[57];\n  tmp[2] = product[58];\n  tmp[3] = product[59];\n  tmp[4] = product[60];\n  tmp[5] = product[61];\n  tmp[6] = product[62];\n  tmp[7] = product[63];\n  tmp[8] = tmp[9] = tmp[10] = tmp[11] = 0;\n  tmp[12] = product[36];\n  tmp[13] = product[37];\n  tmp[14] = product[38];\n  tmp[15] = product[39];\n  tmp[16] = product[40];\n  tmp[17] = product[41];\n  tmp[18] = product[42];\n  tmp[19] = product[43];\n  tmp[20] = product[44];\n  tmp[21] = product[45];\n  tmp[22] = product[46];\n  tmp[23] = product[47];\n  tmp[24] = tmp[25] = tmp[26] = tmp[27] = 0;\n  tmp[28] = product[52];\n  tmp[29] = product[53];\n  tmp[30] = product[54];\n  tmp[31] = product[55];\n  carry -= mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  if (carry < 0) {\n    do {\n      carry += mg_uecc_vli_add(result, result, curve_secp256r1.p,\n                               num_words_secp256r1);\n    } while (carry < 0);\n  } else {\n    while (carry || mg_uecc_vli_cmp_unsafe(curve_secp256r1.p, result,\n                                           num_words_secp256r1) != 1) {\n      carry -= mg_uecc_vli_sub(result, result, curve_secp256r1.p,\n                               num_words_secp256r1);\n    }\n  }\n}\n#elif MG_UECC_WORD_SIZE == 4\nstatic void vli_mmod_fast_secp256r1(uint32_t *result, uint32_t *product) {\n  uint32_t tmp[num_words_secp256r1];\n  int carry;\n\n  /* t */\n  mg_uecc_vli_set(result, product, num_words_secp256r1);\n\n  /* s1 */\n  tmp[0] = tmp[1] = tmp[2] = 0;\n  tmp[3] = product[11];\n  tmp[4] = product[12];\n  tmp[5] = product[13];\n  tmp[6] = product[14];\n  tmp[7] = product[15];\n  carry = (int) mg_uecc_vli_add(tmp, tmp, tmp, num_words_secp256r1);\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s2 */\n  tmp[3] = product[12];\n  tmp[4] = product[13];\n  tmp[5] = product[14];\n  tmp[6] = product[15];\n  tmp[7] = 0;\n  carry += (int) mg_uecc_vli_add(tmp, tmp, tmp, num_words_secp256r1);\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s3 */\n  tmp[0] = product[8];\n  tmp[1] = product[9];\n  tmp[2] = product[10];\n  tmp[3] = tmp[4] = tmp[5] = 0;\n  tmp[6] = product[14];\n  tmp[7] = product[15];\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s4 */\n  tmp[0] = product[9];\n  tmp[1] = product[10];\n  tmp[2] = product[11];\n  tmp[3] = product[13];\n  tmp[4] = product[14];\n  tmp[5] = product[15];\n  tmp[6] = product[13];\n  tmp[7] = product[8];\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* d1 */\n  tmp[0] = product[11];\n  tmp[1] = product[12];\n  tmp[2] = product[13];\n  tmp[3] = tmp[4] = tmp[5] = 0;\n  tmp[6] = product[8];\n  tmp[7] = product[10];\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d2 */\n  tmp[0] = product[12];\n  tmp[1] = product[13];\n  tmp[2] = product[14];\n  tmp[3] = product[15];\n  tmp[4] = tmp[5] = 0;\n  tmp[6] = product[9];\n  tmp[7] = product[11];\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d3 */\n  tmp[0] = product[13];\n  tmp[1] = product[14];\n  tmp[2] = product[15];\n  tmp[3] = product[8];\n  tmp[4] = product[9];\n  tmp[5] = product[10];\n  tmp[6] = 0;\n  tmp[7] = product[12];\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d4 */\n  tmp[0] = product[14];\n  tmp[1] = product[15];\n  tmp[2] = 0;\n  tmp[3] = product[9];\n  tmp[4] = product[10];\n  tmp[5] = product[11];\n  tmp[6] = 0;\n  tmp[7] = product[13];\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  if (carry < 0) {\n    do {\n      carry += (int) mg_uecc_vli_add(result, result, curve_secp256r1.p,\n                                     num_words_secp256r1);\n    } while (carry < 0);\n  } else {\n    while (carry || mg_uecc_vli_cmp_unsafe(curve_secp256r1.p, result,\n                                           num_words_secp256r1) != 1) {\n      carry -= (int) mg_uecc_vli_sub(result, result, curve_secp256r1.p,\n                                     num_words_secp256r1);\n    }\n  }\n}\n#else\nstatic void vli_mmod_fast_secp256r1(uint64_t *result, uint64_t *product) {\n  uint64_t tmp[num_words_secp256r1];\n  int carry;\n\n  /* t */\n  mg_uecc_vli_set(result, product, num_words_secp256r1);\n\n  /* s1 */\n  tmp[0] = 0;\n  tmp[1] = product[5] & 0xffffffff00000000U;\n  tmp[2] = product[6];\n  tmp[3] = product[7];\n  carry = (int) mg_uecc_vli_add(tmp, tmp, tmp, num_words_secp256r1);\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s2 */\n  tmp[1] = product[6] << 32;\n  tmp[2] = (product[6] >> 32) | (product[7] << 32);\n  tmp[3] = product[7] >> 32;\n  carry += (int) mg_uecc_vli_add(tmp, tmp, tmp, num_words_secp256r1);\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s3 */\n  tmp[0] = product[4];\n  tmp[1] = product[5] & 0xffffffff;\n  tmp[2] = 0;\n  tmp[3] = product[7];\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* s4 */\n  tmp[0] = (product[4] >> 32) | (product[5] << 32);\n  tmp[1] = (product[5] >> 32) | (product[6] & 0xffffffff00000000U);\n  tmp[2] = product[7];\n  tmp[3] = (product[6] >> 32) | (product[4] << 32);\n  carry += (int) mg_uecc_vli_add(result, result, tmp, num_words_secp256r1);\n\n  /* d1 */\n  tmp[0] = (product[5] >> 32) | (product[6] << 32);\n  tmp[1] = (product[6] >> 32);\n  tmp[2] = 0;\n  tmp[3] = (product[4] & 0xffffffff) | (product[5] << 32);\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d2 */\n  tmp[0] = product[6];\n  tmp[1] = product[7];\n  tmp[2] = 0;\n  tmp[3] = (product[4] >> 32) | (product[5] & 0xffffffff00000000);\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d3 */\n  tmp[0] = (product[6] >> 32) | (product[7] << 32);\n  tmp[1] = (product[7] >> 32) | (product[4] << 32);\n  tmp[2] = (product[4] >> 32) | (product[5] << 32);\n  tmp[3] = (product[6] << 32);\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  /* d4 */\n  tmp[0] = product[7];\n  tmp[1] = product[4] & 0xffffffff00000000U;\n  tmp[2] = product[5];\n  tmp[3] = product[6] & 0xffffffff00000000U;\n  carry -= (int) mg_uecc_vli_sub(result, result, tmp, num_words_secp256r1);\n\n  if (carry < 0) {\n    do {\n      carry += (int) mg_uecc_vli_add(result, result, curve_secp256r1.p,\n                                     num_words_secp256r1);\n    } while (carry < 0);\n  } else {\n    while (carry || mg_uecc_vli_cmp_unsafe(curve_secp256r1.p, result,\n                                           num_words_secp256r1) != 1) {\n      carry -= (int) mg_uecc_vli_sub(result, result, curve_secp256r1.p,\n                                     num_words_secp256r1);\n    }\n  }\n}\n#endif /* MG_UECC_WORD_SIZE */\n#endif /* (MG_UECC_OPTIMIZATION_LEVEL > 0 && !asm_mmod_fast_secp256r1) */\n\n#endif /* MG_UECC_SUPPORTS_secp256r1 */\n\n#if MG_UECC_SUPPORTS_secp256k1\n\nstatic void double_jacobian_secp256k1(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                                      mg_uecc_word_t *Z1, MG_UECC_Curve curve);\nstatic void x_side_secp256k1(mg_uecc_word_t *result, const mg_uecc_word_t *x,\n                             MG_UECC_Curve curve);\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\nstatic void vli_mmod_fast_secp256k1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product);\n#endif\n\nstatic const struct MG_UECC_Curve_t curve_secp256k1 = {\n    num_words_secp256k1,\n    num_bytes_secp256k1,\n    256, /* num_n_bits */\n    {BYTES_TO_WORDS_8(2F, FC, FF, FF, FE, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(41, 41, 36, D0, 8C, 5E, D2, BF),\n     BYTES_TO_WORDS_8(3B, A0, 48, AF, E6, DC, AE, BA),\n     BYTES_TO_WORDS_8(FE, FF, FF, FF, FF, FF, FF, FF),\n     BYTES_TO_WORDS_8(FF, FF, FF, FF, FF, FF, FF, FF)},\n    {BYTES_TO_WORDS_8(98, 17, F8, 16, 5B, 81, F2, 59),\n     BYTES_TO_WORDS_8(D9, 28, CE, 2D, DB, FC, 9B, 02),\n     BYTES_TO_WORDS_8(07, 0B, 87, CE, 95, 62, A0, 55),\n     BYTES_TO_WORDS_8(AC, BB, DC, F9, 7E, 66, BE, 79),\n\n     BYTES_TO_WORDS_8(B8, D4, 10, FB, 8F, D0, 47, 9C),\n     BYTES_TO_WORDS_8(19, 54, 85, A6, 48, B4, 17, FD),\n     BYTES_TO_WORDS_8(A8, 08, 11, 0E, FC, FB, A4, 5D),\n     BYTES_TO_WORDS_8(65, C4, A3, 26, 77, DA, 3A, 48)},\n    {BYTES_TO_WORDS_8(07, 00, 00, 00, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, 00, 00, 00, 00),\n     BYTES_TO_WORDS_8(00, 00, 00, 00, 00, 00, 00, 00)},\n    &double_jacobian_secp256k1,\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\n    &mod_sqrt_default,\n#endif\n    &x_side_secp256k1,\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n    &vli_mmod_fast_secp256k1\n#endif\n};\n\nMG_UECC_Curve mg_uecc_secp256k1(void) {\n  return &curve_secp256k1;\n}\n\n/* Double in place */\nstatic void double_jacobian_secp256k1(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                                      mg_uecc_word_t *Z1, MG_UECC_Curve curve) {\n  /* t1 = X, t2 = Y, t3 = Z */\n  mg_uecc_word_t t4[num_words_secp256k1];\n  mg_uecc_word_t t5[num_words_secp256k1];\n\n  if (mg_uecc_vli_isZero(Z1, num_words_secp256k1)) {\n    return;\n  }\n\n  mg_uecc_vli_modSquare_fast(t5, Y1, curve);   /* t5 = y1^2 */\n  mg_uecc_vli_modMult_fast(t4, X1, t5, curve); /* t4 = x1*y1^2 = A */\n  mg_uecc_vli_modSquare_fast(X1, X1, curve);   /* t1 = x1^2 */\n  mg_uecc_vli_modSquare_fast(t5, t5, curve);   /* t5 = y1^4 */\n  mg_uecc_vli_modMult_fast(Z1, Y1, Z1, curve); /* t3 = y1*z1 = z3 */\n\n  mg_uecc_vli_modAdd(Y1, X1, X1, curve->p,\n                     num_words_secp256k1); /* t2 = 2*x1^2 */\n  mg_uecc_vli_modAdd(Y1, Y1, X1, curve->p,\n                     num_words_secp256k1); /* t2 = 3*x1^2 */\n  if (mg_uecc_vli_testBit(Y1, 0)) {\n    mg_uecc_word_t carry =\n        mg_uecc_vli_add(Y1, Y1, curve->p, num_words_secp256k1);\n    mg_uecc_vli_rshift1(Y1, num_words_secp256k1);\n    Y1[num_words_secp256k1 - 1] |= carry << (MG_UECC_WORD_BITS - 1);\n  } else {\n    mg_uecc_vli_rshift1(Y1, num_words_secp256k1);\n  }\n  /* t2 = 3/2*(x1^2) = B */\n\n  mg_uecc_vli_modSquare_fast(X1, Y1, curve); /* t1 = B^2 */\n  mg_uecc_vli_modSub(X1, X1, t4, curve->p,\n                     num_words_secp256k1); /* t1 = B^2 - A */\n  mg_uecc_vli_modSub(X1, X1, t4, curve->p,\n                     num_words_secp256k1); /* t1 = B^2 - 2A = x3 */\n\n  mg_uecc_vli_modSub(t4, t4, X1, curve->p,\n                     num_words_secp256k1);     /* t4 = A - x3 */\n  mg_uecc_vli_modMult_fast(Y1, Y1, t4, curve); /* t2 = B * (A - x3) */\n  mg_uecc_vli_modSub(Y1, Y1, t5, curve->p,\n                     num_words_secp256k1); /* t2 = B * (A - x3) - y1^4 = y3 */\n}\n\n/* Computes result = x^3 + b. result must not overlap x. */\nstatic void x_side_secp256k1(mg_uecc_word_t *result, const mg_uecc_word_t *x,\n                             MG_UECC_Curve curve) {\n  mg_uecc_vli_modSquare_fast(result, x, curve);       /* r = x^2 */\n  mg_uecc_vli_modMult_fast(result, result, x, curve); /* r = x^3 */\n  mg_uecc_vli_modAdd(result, result, curve->b, curve->p,\n                     num_words_secp256k1); /* r = x^3 + b */\n}\n\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0 && !asm_mmod_fast_secp256k1)\nstatic void omega_mult_secp256k1(mg_uecc_word_t *result,\n                                 const mg_uecc_word_t *right);\nstatic void vli_mmod_fast_secp256k1(mg_uecc_word_t *result,\n                                    mg_uecc_word_t *product) {\n  mg_uecc_word_t tmp[2 * num_words_secp256k1];\n  mg_uecc_word_t carry;\n\n  mg_uecc_vli_clear(tmp, num_words_secp256k1);\n  mg_uecc_vli_clear(tmp + num_words_secp256k1, num_words_secp256k1);\n\n  omega_mult_secp256k1(tmp,\n                       product + num_words_secp256k1); /* (Rq, q) = q * c */\n\n  carry = mg_uecc_vli_add(result, product, tmp,\n                          num_words_secp256k1); /* (C, r) = r + q       */\n  mg_uecc_vli_clear(product, num_words_secp256k1);\n  omega_mult_secp256k1(product, tmp + num_words_secp256k1); /* Rq*c */\n  carry += mg_uecc_vli_add(result, result, product,\n                           num_words_secp256k1); /* (C1, r) = r + Rq*c */\n\n  while (carry > 0) {\n    --carry;\n    mg_uecc_vli_sub(result, result, curve_secp256k1.p, num_words_secp256k1);\n  }\n  if (mg_uecc_vli_cmp_unsafe(result, curve_secp256k1.p, num_words_secp256k1) >\n      0) {\n    mg_uecc_vli_sub(result, result, curve_secp256k1.p, num_words_secp256k1);\n  }\n}\n\n#if MG_UECC_WORD_SIZE == 1\nstatic void omega_mult_secp256k1(uint8_t *result, const uint8_t *right) {\n  /* Multiply by (2^32 + 2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1). */\n  mg_uecc_word_t r0 = 0;\n  mg_uecc_word_t r1 = 0;\n  mg_uecc_word_t r2 = 0;\n  wordcount_t k;\n\n  /* Multiply by (2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1). */\n  muladd(0xD1, right[0], &r0, &r1, &r2);\n  result[0] = r0;\n  r0 = r1;\n  r1 = r2;\n  /* r2 is still 0 */\n\n  for (k = 1; k < num_words_secp256k1; ++k) {\n    muladd(0x03, right[k - 1], &r0, &r1, &r2);\n    muladd(0xD1, right[k], &r0, &r1, &r2);\n    result[k] = r0;\n    r0 = r1;\n    r1 = r2;\n    r2 = 0;\n  }\n  muladd(0x03, right[num_words_secp256k1 - 1], &r0, &r1, &r2);\n  result[num_words_secp256k1] = r0;\n  result[num_words_secp256k1 + 1] = r1;\n  /* add the 2^32 multiple */\n  result[4 + num_words_secp256k1] =\n      mg_uecc_vli_add(result + 4, result + 4, right, num_words_secp256k1);\n}\n#elif MG_UECC_WORD_SIZE == 4\nstatic void omega_mult_secp256k1(uint32_t *result, const uint32_t *right) {\n  /* Multiply by (2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1). */\n  uint32_t carry = 0;\n  wordcount_t k;\n\n  for (k = 0; k < num_words_secp256k1; ++k) {\n    uint64_t p = (uint64_t) 0x3D1 * right[k] + carry;\n    result[k] = (uint32_t) p;\n    carry = p >> 32;\n  }\n  result[num_words_secp256k1] = carry;\n  /* add the 2^32 multiple */\n  result[1 + num_words_secp256k1] =\n      mg_uecc_vli_add(result + 1, result + 1, right, num_words_secp256k1);\n}\n#else\nstatic void omega_mult_secp256k1(uint64_t *result, const uint64_t *right) {\n  mg_uecc_word_t r0 = 0;\n  mg_uecc_word_t r1 = 0;\n  mg_uecc_word_t r2 = 0;\n  wordcount_t k;\n\n  /* Multiply by (2^32 + 2^9 + 2^8 + 2^7 + 2^6 + 2^4 + 1). */\n  for (k = 0; k < num_words_secp256k1; ++k) {\n    muladd(0x1000003D1ull, right[k], &r0, &r1, &r2);\n    result[k] = r0;\n    r0 = r1;\n    r1 = r2;\n    r2 = 0;\n  }\n  result[num_words_secp256k1] = r0;\n}\n#endif /* MG_UECC_WORD_SIZE */\n#endif /* (MG_UECC_OPTIMIZATION_LEVEL > 0 &&  && !asm_mmod_fast_secp256k1) */\n\n#endif /* MG_UECC_SUPPORTS_secp256k1 */\n\n#endif /* _UECC_CURVE_SPECIFIC_H_ */\n\n/* Returns 1 if 'point' is the point at infinity, 0 otherwise. */\n#define EccPoint_isZero(point, curve) \\\n  mg_uecc_vli_isZero((point), (wordcount_t) ((curve)->num_words * 2))\n\n/* Point multiplication algorithm using Montgomery's ladder with co-Z\ncoordinates. From http://eprint.iacr.org/2011/338.pdf\n*/\n\n/* Modify (x1, y1) => (x1 * z^2, y1 * z^3) */\nstatic void apply_z(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                    const mg_uecc_word_t *const Z, MG_UECC_Curve curve) {\n  mg_uecc_word_t t1[MG_UECC_MAX_WORDS];\n\n  mg_uecc_vli_modSquare_fast(t1, Z, curve);    /* z^2 */\n  mg_uecc_vli_modMult_fast(X1, X1, t1, curve); /* x1 * z^2 */\n  mg_uecc_vli_modMult_fast(t1, t1, Z, curve);  /* z^3 */\n  mg_uecc_vli_modMult_fast(Y1, Y1, t1, curve); /* y1 * z^3 */\n}\n\n/* P = (x1, y1) => 2P, (x2, y2) => P' */\nstatic void XYcZ_initial_double(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                                mg_uecc_word_t *X2, mg_uecc_word_t *Y2,\n                                const mg_uecc_word_t *const initial_Z,\n                                MG_UECC_Curve curve) {\n  mg_uecc_word_t z[MG_UECC_MAX_WORDS];\n  wordcount_t num_words = curve->num_words;\n  if (initial_Z) {\n    mg_uecc_vli_set(z, initial_Z, num_words);\n  } else {\n    mg_uecc_vli_clear(z, num_words);\n    z[0] = 1;\n  }\n\n  mg_uecc_vli_set(X2, X1, num_words);\n  mg_uecc_vli_set(Y2, Y1, num_words);\n\n  apply_z(X1, Y1, z, curve);\n  curve->double_jacobian(X1, Y1, z, curve);\n  apply_z(X2, Y2, z, curve);\n}\n\n/* Input P = (x1, y1, Z), Q = (x2, y2, Z)\n   Output P' = (x1', y1', Z3), P + Q = (x3, y3, Z3)\n   or P => P', Q => P + Q\n*/\nstatic void XYcZ_add(mg_uecc_word_t *X1, mg_uecc_word_t *Y1, mg_uecc_word_t *X2,\n                     mg_uecc_word_t *Y2, MG_UECC_Curve curve) {\n  /* t1 = X1, t2 = Y1, t3 = X2, t4 = Y2 */\n  mg_uecc_word_t t5[MG_UECC_MAX_WORDS] = {0};\n  wordcount_t num_words = curve->num_words;\n\n  mg_uecc_vli_modSub(t5, X2, X1, curve->p, num_words); /* t5 = x2 - x1 */\n  mg_uecc_vli_modSquare_fast(t5, t5, curve);   /* t5 = (x2 - x1)^2 = A */\n  mg_uecc_vli_modMult_fast(X1, X1, t5, curve); /* t1 = x1*A = B */\n  mg_uecc_vli_modMult_fast(X2, X2, t5, curve); /* t3 = x2*A = C */\n  mg_uecc_vli_modSub(Y2, Y2, Y1, curve->p, num_words); /* t4 = y2 - y1 */\n  mg_uecc_vli_modSquare_fast(t5, Y2, curve); /* t5 = (y2 - y1)^2 = D */\n\n  mg_uecc_vli_modSub(t5, t5, X1, curve->p, num_words); /* t5 = D - B */\n  mg_uecc_vli_modSub(t5, t5, X2, curve->p, num_words); /* t5 = D - B - C = x3 */\n  mg_uecc_vli_modSub(X2, X2, X1, curve->p, num_words); /* t3 = C - B */\n  mg_uecc_vli_modMult_fast(Y1, Y1, X2, curve);         /* t2 = y1*(C - B) */\n  mg_uecc_vli_modSub(X2, X1, t5, curve->p, num_words); /* t3 = B - x3 */\n  mg_uecc_vli_modMult_fast(Y2, Y2, X2, curve); /* t4 = (y2 - y1)*(B - x3) */\n  mg_uecc_vli_modSub(Y2, Y2, Y1, curve->p, num_words); /* t4 = y3 */\n\n  mg_uecc_vli_set(X2, t5, num_words);\n}\n\n/* Input P = (x1, y1, Z), Q = (x2, y2, Z)\n   Output P + Q = (x3, y3, Z3), P - Q = (x3', y3', Z3)\n   or P => P - Q, Q => P + Q\n*/\nstatic void XYcZ_addC(mg_uecc_word_t *X1, mg_uecc_word_t *Y1,\n                      mg_uecc_word_t *X2, mg_uecc_word_t *Y2,\n                      MG_UECC_Curve curve) {\n  /* t1 = X1, t2 = Y1, t3 = X2, t4 = Y2 */\n  mg_uecc_word_t t5[MG_UECC_MAX_WORDS] = {0};\n  mg_uecc_word_t t6[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t t7[MG_UECC_MAX_WORDS];\n  wordcount_t num_words = curve->num_words;\n\n  mg_uecc_vli_modSub(t5, X2, X1, curve->p, num_words); /* t5 = x2 - x1 */\n  mg_uecc_vli_modSquare_fast(t5, t5, curve);   /* t5 = (x2 - x1)^2 = A */\n  mg_uecc_vli_modMult_fast(X1, X1, t5, curve); /* t1 = x1*A = B */\n  mg_uecc_vli_modMult_fast(X2, X2, t5, curve); /* t3 = x2*A = C */\n  mg_uecc_vli_modAdd(t5, Y2, Y1, curve->p, num_words); /* t5 = y2 + y1 */\n  mg_uecc_vli_modSub(Y2, Y2, Y1, curve->p, num_words); /* t4 = y2 - y1 */\n\n  mg_uecc_vli_modSub(t6, X2, X1, curve->p, num_words); /* t6 = C - B */\n  mg_uecc_vli_modMult_fast(Y1, Y1, t6, curve); /* t2 = y1 * (C - B) = E */\n  mg_uecc_vli_modAdd(t6, X1, X2, curve->p, num_words); /* t6 = B + C */\n  mg_uecc_vli_modSquare_fast(X2, Y2, curve); /* t3 = (y2 - y1)^2 = D */\n  mg_uecc_vli_modSub(X2, X2, t6, curve->p,\n                     num_words); /* t3 = D - (B + C) = x3 */\n\n  mg_uecc_vli_modSub(t7, X1, X2, curve->p, num_words); /* t7 = B - x3 */\n  mg_uecc_vli_modMult_fast(Y2, Y2, t7, curve); /* t4 = (y2 - y1)*(B - x3) */\n  mg_uecc_vli_modSub(Y2, Y2, Y1, curve->p,\n                     num_words); /* t4 = (y2 - y1)*(B - x3) - E = y3 */\n\n  mg_uecc_vli_modSquare_fast(t7, t5, curve); /* t7 = (y2 + y1)^2 = F */\n  mg_uecc_vli_modSub(t7, t7, t6, curve->p,\n                     num_words); /* t7 = F - (B + C) = x3' */\n  mg_uecc_vli_modSub(t6, t7, X1, curve->p, num_words); /* t6 = x3' - B */\n  mg_uecc_vli_modMult_fast(t6, t6, t5, curve); /* t6 = (y2+y1)*(x3' - B) */\n  mg_uecc_vli_modSub(Y1, t6, Y1, curve->p,\n                     num_words); /* t2 = (y2+y1)*(x3' - B) - E = y3' */\n\n  mg_uecc_vli_set(X1, t7, num_words);\n}\n\n/* result may overlap point. */\nstatic void EccPoint_mult(mg_uecc_word_t *result, const mg_uecc_word_t *point,\n                          const mg_uecc_word_t *scalar,\n                          const mg_uecc_word_t *initial_Z, bitcount_t num_bits,\n                          MG_UECC_Curve curve) {\n  /* R0 and R1 */\n  mg_uecc_word_t Rx[2][MG_UECC_MAX_WORDS];\n  mg_uecc_word_t Ry[2][MG_UECC_MAX_WORDS];\n  mg_uecc_word_t z[MG_UECC_MAX_WORDS];\n  bitcount_t i;\n  mg_uecc_word_t nb;\n  wordcount_t num_words = curve->num_words;\n\n  mg_uecc_vli_set(Rx[1], point, num_words);\n  mg_uecc_vli_set(Ry[1], point + num_words, num_words);\n\n  XYcZ_initial_double(Rx[1], Ry[1], Rx[0], Ry[0], initial_Z, curve);\n\n  for (i = num_bits - 2; i > 0; --i) {\n    nb = !mg_uecc_vli_testBit(scalar, i);\n    XYcZ_addC(Rx[1 - nb], Ry[1 - nb], Rx[nb], Ry[nb], curve);\n    XYcZ_add(Rx[nb], Ry[nb], Rx[1 - nb], Ry[1 - nb], curve);\n  }\n\n  nb = !mg_uecc_vli_testBit(scalar, 0);\n  XYcZ_addC(Rx[1 - nb], Ry[1 - nb], Rx[nb], Ry[nb], curve);\n\n  /* Find final 1/Z value. */\n  mg_uecc_vli_modSub(z, Rx[1], Rx[0], curve->p, num_words); /* X1 - X0 */\n  mg_uecc_vli_modMult_fast(z, z, Ry[1 - nb], curve);        /* Yb * (X1 - X0) */\n  mg_uecc_vli_modMult_fast(z, z, point, curve);  /* xP * Yb * (X1 - X0) */\n  mg_uecc_vli_modInv(z, z, curve->p, num_words); /* 1 / (xP * Yb * (X1 - X0)) */\n  /* yP / (xP * Yb * (X1 - X0)) */\n  mg_uecc_vli_modMult_fast(z, z, point + num_words, curve);\n  mg_uecc_vli_modMult_fast(z, z, Rx[1 - nb],\n                           curve); /* Xb * yP / (xP * Yb * (X1 - X0)) */\n  /* End 1/Z calculation */\n\n  XYcZ_add(Rx[nb], Ry[nb], Rx[1 - nb], Ry[1 - nb], curve);\n  apply_z(Rx[0], Ry[0], z, curve);\n\n  mg_uecc_vli_set(result, Rx[0], num_words);\n  mg_uecc_vli_set(result + num_words, Ry[0], num_words);\n}\n\nstatic mg_uecc_word_t regularize_k(const mg_uecc_word_t *const k,\n                                   mg_uecc_word_t *k0, mg_uecc_word_t *k1,\n                                   MG_UECC_Curve curve) {\n  wordcount_t num_n_words = BITS_TO_WORDS(curve->num_n_bits);\n  bitcount_t num_n_bits = curve->num_n_bits;\n  mg_uecc_word_t carry =\n      mg_uecc_vli_add(k0, k, curve->n, num_n_words) ||\n      (num_n_bits < ((bitcount_t) num_n_words * MG_UECC_WORD_SIZE * 8) &&\n       mg_uecc_vli_testBit(k0, num_n_bits));\n  mg_uecc_vli_add(k1, k0, curve->n, num_n_words);\n  return carry;\n}\n\n/* Generates a random integer in the range 0 < random < top.\n   Both random and top have num_words words. */\nMG_UECC_VLI_API int mg_uecc_generate_random_int(mg_uecc_word_t *random,\n                                                const mg_uecc_word_t *top,\n                                                wordcount_t num_words) {\n  mg_uecc_word_t mask = (mg_uecc_word_t) -1;\n  mg_uecc_word_t tries;\n  bitcount_t num_bits = mg_uecc_vli_numBits(top, num_words);\n\n  if (!g_rng_function) {\n    return 0;\n  }\n\n  for (tries = 0; tries < MG_UECC_RNG_MAX_TRIES; ++tries) {\n    if (!g_rng_function((uint8_t *) random,\n                        (unsigned int) (num_words * MG_UECC_WORD_SIZE))) {\n      return 0;\n    }\n    random[num_words - 1] &=\n        mask >> ((bitcount_t) (num_words * MG_UECC_WORD_SIZE * 8 - num_bits));\n    if (!mg_uecc_vli_isZero(random, num_words) &&\n        mg_uecc_vli_cmp(top, random, num_words) == 1) {\n      return 1;\n    }\n  }\n  return 0;\n}\n\nstatic mg_uecc_word_t EccPoint_compute_public_key(mg_uecc_word_t *result,\n                                                  mg_uecc_word_t *private_key,\n                                                  MG_UECC_Curve curve) {\n  mg_uecc_word_t tmp1[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tmp2[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t *p2[2] = {tmp1, tmp2};\n  mg_uecc_word_t *initial_Z = 0;\n  mg_uecc_word_t carry;\n\n  /* Regularize the bitcount for the private key so that attackers cannot use a\n     side channel attack to learn the number of leading zeros. */\n  carry = regularize_k(private_key, tmp1, tmp2, curve);\n\n  /* If an RNG function was specified, try to get a random initial Z value to\n     improve protection against side-channel attacks. */\n  if (g_rng_function) {\n    if (!mg_uecc_generate_random_int(p2[carry], curve->p, curve->num_words)) {\n      return 0;\n    }\n    initial_Z = p2[carry];\n  }\n  EccPoint_mult(result, curve->G, p2[!carry], initial_Z,\n                (bitcount_t) (curve->num_n_bits + 1), curve);\n\n  if (EccPoint_isZero(result, curve)) {\n    return 0;\n  }\n  return 1;\n}\n\n#if MG_UECC_WORD_SIZE == 1\n\nMG_UECC_VLI_API void mg_uecc_vli_nativeToBytes(uint8_t *bytes, int num_bytes,\n                                               const uint8_t *native) {\n  wordcount_t i;\n  for (i = 0; i < num_bytes; ++i) {\n    bytes[i] = native[(num_bytes - 1) - i];\n  }\n}\n\nMG_UECC_VLI_API void mg_uecc_vli_bytesToNative(uint8_t *native,\n                                               const uint8_t *bytes,\n                                               int num_bytes) {\n  mg_uecc_vli_nativeToBytes(native, num_bytes, bytes);\n}\n\n#else\n\nMG_UECC_VLI_API void mg_uecc_vli_nativeToBytes(uint8_t *bytes, int num_bytes,\n                                               const mg_uecc_word_t *native) {\n  int i;\n  for (i = 0; i < num_bytes; ++i) {\n    unsigned b = (unsigned) (num_bytes - 1 - i);\n    bytes[i] = (uint8_t) (native[b / MG_UECC_WORD_SIZE] >>\n                          (8 * (b % MG_UECC_WORD_SIZE)));\n  }\n}\n\nMG_UECC_VLI_API void mg_uecc_vli_bytesToNative(mg_uecc_word_t *native,\n                                               const uint8_t *bytes,\n                                               int num_bytes) {\n  int i;\n  mg_uecc_vli_clear(native,\n                    (wordcount_t) ((num_bytes + (MG_UECC_WORD_SIZE - 1)) /\n                                   MG_UECC_WORD_SIZE));\n  for (i = 0; i < num_bytes; ++i) {\n    unsigned b = (unsigned) (num_bytes - 1 - i);\n    native[b / MG_UECC_WORD_SIZE] |= (mg_uecc_word_t) bytes[i]\n                                     << (8 * (b % MG_UECC_WORD_SIZE));\n  }\n}\n\n#endif /* MG_UECC_WORD_SIZE */\n\nint mg_uecc_make_key(uint8_t *public_key, uint8_t *private_key,\n                     MG_UECC_Curve curve) {\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  mg_uecc_word_t *_private = (mg_uecc_word_t *) private_key;\n  mg_uecc_word_t *_public = (mg_uecc_word_t *) public_key;\n#else\n  mg_uecc_word_t _private[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t _public[MG_UECC_MAX_WORDS * 2];\n#endif\n  mg_uecc_word_t tries;\n\n  for (tries = 0; tries < MG_UECC_RNG_MAX_TRIES; ++tries) {\n    if (!mg_uecc_generate_random_int(_private, curve->n,\n                                     BITS_TO_WORDS(curve->num_n_bits))) {\n      return 0;\n    }\n\n    if (EccPoint_compute_public_key(_public, _private, curve)) {\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN == 0\n      mg_uecc_vli_nativeToBytes(private_key, BITS_TO_BYTES(curve->num_n_bits),\n                                _private);\n      mg_uecc_vli_nativeToBytes(public_key, curve->num_bytes, _public);\n      mg_uecc_vli_nativeToBytes(public_key + curve->num_bytes, curve->num_bytes,\n                                _public + curve->num_words);\n#endif\n      return 1;\n    }\n  }\n  return 0;\n}\n\nint mg_uecc_shared_secret(const uint8_t *public_key, const uint8_t *private_key,\n                          uint8_t *secret, MG_UECC_Curve curve) {\n  mg_uecc_word_t _public[MG_UECC_MAX_WORDS * 2];\n  mg_uecc_word_t _private[MG_UECC_MAX_WORDS];\n\n  mg_uecc_word_t tmp[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t *p2[2] = {_private, tmp};\n  mg_uecc_word_t *initial_Z = 0;\n  mg_uecc_word_t carry;\n  wordcount_t num_words = curve->num_words;\n  wordcount_t num_bytes = curve->num_bytes;\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy((uint8_t *) _private, private_key, num_bytes);\n  bcopy((uint8_t *) _public, public_key, num_bytes * 2);\n#else\n  mg_uecc_vli_bytesToNative(_private, private_key,\n                            BITS_TO_BYTES(curve->num_n_bits));\n  mg_uecc_vli_bytesToNative(_public, public_key, num_bytes);\n  mg_uecc_vli_bytesToNative(_public + num_words, public_key + num_bytes,\n                            num_bytes);\n#endif\n\n  /* Regularize the bitcount for the private key so that attackers cannot use a\n     side channel attack to learn the number of leading zeros. */\n  carry = regularize_k(_private, _private, tmp, curve);\n\n  /* If an RNG function was specified, try to get a random initial Z value to\n     improve protection against side-channel attacks. */\n  if (g_rng_function) {\n    if (!mg_uecc_generate_random_int(p2[carry], curve->p, num_words)) {\n      return 0;\n    }\n    initial_Z = p2[carry];\n  }\n\n  EccPoint_mult(_public, _public, p2[!carry], initial_Z,\n                (bitcount_t) (curve->num_n_bits + 1), curve);\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy((uint8_t *) secret, (uint8_t *) _public, num_bytes);\n#else\n  mg_uecc_vli_nativeToBytes(secret, num_bytes, _public);\n#endif\n  return !EccPoint_isZero(_public, curve);\n}\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\nvoid mg_uecc_compress(const uint8_t *public_key, uint8_t *compressed,\n                      MG_UECC_Curve curve) {\n  wordcount_t i;\n  for (i = 0; i < curve->num_bytes; ++i) {\n    compressed[i + 1] = public_key[i];\n  }\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  compressed[0] = 2 + (public_key[curve->num_bytes] & 0x01);\n#else\n  compressed[0] = 2 + (public_key[curve->num_bytes * 2 - 1] & 0x01);\n#endif\n}\n\nvoid mg_uecc_decompress(const uint8_t *compressed, uint8_t *public_key,\n                        MG_UECC_Curve curve) {\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  mg_uecc_word_t *point = (mg_uecc_word_t *) public_key;\n#else\n  mg_uecc_word_t point[MG_UECC_MAX_WORDS * 2];\n#endif\n  mg_uecc_word_t *y = point + curve->num_words;\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy(public_key, compressed + 1, curve->num_bytes);\n#else\n  mg_uecc_vli_bytesToNative(point, compressed + 1, curve->num_bytes);\n#endif\n  curve->x_side(y, point, curve);\n  curve->mod_sqrt(y, curve);\n\n  if ((uint8_t) (y[0] & 0x01) != (compressed[0] & 0x01)) {\n    mg_uecc_vli_sub(y, curve->p, y, curve->num_words);\n  }\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN == 0\n  mg_uecc_vli_nativeToBytes(public_key, curve->num_bytes, point);\n  mg_uecc_vli_nativeToBytes(public_key + curve->num_bytes, curve->num_bytes, y);\n#endif\n}\n#endif /* MG_UECC_SUPPORT_COMPRESSED_POINT */\n\nMG_UECC_VLI_API int mg_uecc_valid_point(const mg_uecc_word_t *point,\n                                        MG_UECC_Curve curve) {\n  mg_uecc_word_t tmp1[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tmp2[MG_UECC_MAX_WORDS];\n  wordcount_t num_words = curve->num_words;\n\n  /* The point at infinity is invalid. */\n  if (EccPoint_isZero(point, curve)) {\n    return 0;\n  }\n\n  /* x and y must be smaller than p. */\n  if (mg_uecc_vli_cmp_unsafe(curve->p, point, num_words) != 1 ||\n      mg_uecc_vli_cmp_unsafe(curve->p, point + num_words, num_words) != 1) {\n    return 0;\n  }\n\n  mg_uecc_vli_modSquare_fast(tmp1, point + num_words, curve);\n  curve->x_side(tmp2, point, curve); /* tmp2 = x^3 + ax + b */\n\n  /* Make sure that y^2 == x^3 + ax + b */\n  return (int) (mg_uecc_vli_equal(tmp1, tmp2, num_words));\n}\n\nint mg_uecc_valid_public_key(const uint8_t *public_key, MG_UECC_Curve curve) {\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  mg_uecc_word_t *_public = (mg_uecc_word_t *) public_key;\n#else\n  mg_uecc_word_t _public[MG_UECC_MAX_WORDS * 2];\n#endif\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN == 0\n  mg_uecc_vli_bytesToNative(_public, public_key, curve->num_bytes);\n  mg_uecc_vli_bytesToNative(_public + curve->num_words,\n                            public_key + curve->num_bytes, curve->num_bytes);\n#endif\n  return mg_uecc_valid_point(_public, curve);\n}\n\nint mg_uecc_compute_public_key(const uint8_t *private_key, uint8_t *public_key,\n                               MG_UECC_Curve curve) {\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  mg_uecc_word_t *_private = (mg_uecc_word_t *) private_key;\n  mg_uecc_word_t *_public = (mg_uecc_word_t *) public_key;\n#else\n  mg_uecc_word_t _private[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t _public[MG_UECC_MAX_WORDS * 2];\n#endif\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN == 0\n  mg_uecc_vli_bytesToNative(_private, private_key,\n                            BITS_TO_BYTES(curve->num_n_bits));\n#endif\n\n  /* Make sure the private key is in the range [1, n-1]. */\n  if (mg_uecc_vli_isZero(_private, BITS_TO_WORDS(curve->num_n_bits))) {\n    return 0;\n  }\n\n  if (mg_uecc_vli_cmp(curve->n, _private, BITS_TO_WORDS(curve->num_n_bits)) !=\n      1) {\n    return 0;\n  }\n\n  /* Compute public key. */\n  if (!EccPoint_compute_public_key(_public, _private, curve)) {\n    return 0;\n  }\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN == 0\n  mg_uecc_vli_nativeToBytes(public_key, curve->num_bytes, _public);\n  mg_uecc_vli_nativeToBytes(public_key + curve->num_bytes, curve->num_bytes,\n                            _public + curve->num_words);\n#endif\n  return 1;\n}\n\n/* -------- ECDSA code -------- */\n\nstatic void bits2int(mg_uecc_word_t *native, const uint8_t *bits,\n                     unsigned bits_size, MG_UECC_Curve curve) {\n  unsigned num_n_bytes = (unsigned) BITS_TO_BYTES(curve->num_n_bits);\n  unsigned num_n_words = (unsigned) BITS_TO_WORDS(curve->num_n_bits);\n  int shift;\n  mg_uecc_word_t carry;\n  mg_uecc_word_t *ptr;\n\n  if (bits_size > num_n_bytes) {\n    bits_size = num_n_bytes;\n  }\n\n  mg_uecc_vli_clear(native, (wordcount_t) num_n_words);\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy((uint8_t *) native, bits, bits_size);\n#else\n  mg_uecc_vli_bytesToNative(native, bits, (int) bits_size);\n#endif\n  if (bits_size * 8 <= (unsigned) curve->num_n_bits) {\n    return;\n  }\n  shift = (int) bits_size * 8 - curve->num_n_bits;\n  carry = 0;\n  ptr = native + num_n_words;\n  while (ptr-- > native) {\n    mg_uecc_word_t temp = *ptr;\n    *ptr = (temp >> shift) | carry;\n    carry = temp << (MG_UECC_WORD_BITS - shift);\n  }\n\n  /* Reduce mod curve_n */\n  if (mg_uecc_vli_cmp_unsafe(curve->n, native, (wordcount_t) num_n_words) !=\n      1) {\n    mg_uecc_vli_sub(native, native, curve->n, (wordcount_t) num_n_words);\n  }\n}\n\nstatic int mg_uecc_sign_with_k_internal(const uint8_t *private_key,\n                                        const uint8_t *message_hash,\n                                        unsigned hash_size, mg_uecc_word_t *k,\n                                        uint8_t *signature,\n                                        MG_UECC_Curve curve) {\n  mg_uecc_word_t tmp[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t s[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t *k2[2] = {tmp, s};\n  mg_uecc_word_t *initial_Z = 0;\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  mg_uecc_word_t *p = (mg_uecc_word_t *) signature;\n#else\n  mg_uecc_word_t p[MG_UECC_MAX_WORDS * 2];\n#endif\n  mg_uecc_word_t carry;\n  wordcount_t num_words = curve->num_words;\n  wordcount_t num_n_words = BITS_TO_WORDS(curve->num_n_bits);\n  bitcount_t num_n_bits = curve->num_n_bits;\n\n  /* Make sure 0 < k < curve_n */\n  if (mg_uecc_vli_isZero(k, num_words) ||\n      mg_uecc_vli_cmp(curve->n, k, num_n_words) != 1) {\n    return 0;\n  }\n\n  carry = regularize_k(k, tmp, s, curve);\n  /* If an RNG function was specified, try to get a random initial Z value to\n     improve protection against side-channel attacks. */\n  if (g_rng_function) {\n    if (!mg_uecc_generate_random_int(k2[carry], curve->p, num_words)) {\n      return 0;\n    }\n    initial_Z = k2[carry];\n  }\n  EccPoint_mult(p, curve->G, k2[!carry], initial_Z,\n                (bitcount_t) (num_n_bits + 1), curve);\n  if (mg_uecc_vli_isZero(p, num_words)) {\n    return 0;\n  }\n\n  /* If an RNG function was specified, get a random number\n     to prevent side channel analysis of k. */\n  if (!g_rng_function) {\n    mg_uecc_vli_clear(tmp, num_n_words);\n    tmp[0] = 1;\n  } else if (!mg_uecc_generate_random_int(tmp, curve->n, num_n_words)) {\n    return 0;\n  }\n\n  /* Prevent side channel analysis of mg_uecc_vli_modInv() to determine\n     bits of k / the private key by premultiplying by a random number */\n  mg_uecc_vli_modMult(k, k, tmp, curve->n, num_n_words); /* k' = rand * k */\n  mg_uecc_vli_modInv(k, k, curve->n, num_n_words);       /* k = 1 / k' */\n  mg_uecc_vli_modMult(k, k, tmp, curve->n, num_n_words); /* k = 1 / k */\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN == 0\n  mg_uecc_vli_nativeToBytes(signature, curve->num_bytes, p); /* store r */\n#endif\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy((uint8_t *) tmp, private_key, BITS_TO_BYTES(curve->num_n_bits));\n#else\n  mg_uecc_vli_bytesToNative(tmp, private_key,\n                            BITS_TO_BYTES(curve->num_n_bits)); /* tmp = d */\n#endif\n\n  s[num_n_words - 1] = 0;\n  mg_uecc_vli_set(s, p, num_words);\n  mg_uecc_vli_modMult(s, tmp, s, curve->n, num_n_words); /* s = r*d */\n\n  bits2int(tmp, message_hash, hash_size, curve);\n  mg_uecc_vli_modAdd(s, tmp, s, curve->n, num_n_words); /* s = e + r*d */\n  mg_uecc_vli_modMult(s, s, k, curve->n, num_n_words);  /* s = (e + r*d) / k */\n  if (mg_uecc_vli_numBits(s, num_n_words) > (bitcount_t) curve->num_bytes * 8) {\n    return 0;\n  }\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy((uint8_t *) signature + curve->num_bytes, (uint8_t *) s,\n        curve->num_bytes);\n#else\n  mg_uecc_vli_nativeToBytes(signature + curve->num_bytes, curve->num_bytes, s);\n#endif\n  return 1;\n}\n\n#if 0\n/* For testing - sign with an explicitly specified k value */\nint mg_uecc_sign_with_k(const uint8_t *private_key, const uint8_t *message_hash,\n                     unsigned hash_size, const uint8_t *k, uint8_t *signature,\n                     MG_UECC_Curve curve) {\n  mg_uecc_word_t k2[MG_UECC_MAX_WORDS];\n  bits2int(k2, k, (unsigned) BITS_TO_BYTES(curve->num_n_bits), curve);\n  return mg_uecc_sign_with_k_internal(private_key, message_hash, hash_size, k2,\n                                   signature, curve);\n}\n#endif\n\nint mg_uecc_sign(const uint8_t *private_key, const uint8_t *message_hash,\n                 unsigned hash_size, uint8_t *signature, MG_UECC_Curve curve) {\n  mg_uecc_word_t k[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tries;\n\n  for (tries = 0; tries < MG_UECC_RNG_MAX_TRIES; ++tries) {\n    if (!mg_uecc_generate_random_int(k, curve->n,\n                                     BITS_TO_WORDS(curve->num_n_bits))) {\n      return 0;\n    }\n\n    if (mg_uecc_sign_with_k_internal(private_key, message_hash, hash_size, k,\n                                     signature, curve)) {\n      return 1;\n    }\n  }\n  return 0;\n}\n\n/* Compute an HMAC using K as a key (as in RFC 6979). Note that K is always\n   the same size as the hash result size. */\nstatic void HMAC_init(const MG_UECC_HashContext *hash_context,\n                      const uint8_t *K) {\n  uint8_t *pad = hash_context->tmp + 2 * hash_context->result_size;\n  unsigned i;\n  for (i = 0; i < hash_context->result_size; ++i) pad[i] = K[i] ^ 0x36;\n  for (; i < hash_context->block_size; ++i) pad[i] = 0x36;\n\n  hash_context->init_hash(hash_context);\n  hash_context->update_hash(hash_context, pad, hash_context->block_size);\n}\n\nstatic void HMAC_update(const MG_UECC_HashContext *hash_context,\n                        const uint8_t *message, unsigned message_size) {\n  hash_context->update_hash(hash_context, message, message_size);\n}\n\nstatic void HMAC_finish(const MG_UECC_HashContext *hash_context,\n                        const uint8_t *K, uint8_t *result) {\n  uint8_t *pad = hash_context->tmp + 2 * hash_context->result_size;\n  unsigned i;\n  for (i = 0; i < hash_context->result_size; ++i) pad[i] = K[i] ^ 0x5c;\n  for (; i < hash_context->block_size; ++i) pad[i] = 0x5c;\n\n  hash_context->finish_hash(hash_context, result);\n\n  hash_context->init_hash(hash_context);\n  hash_context->update_hash(hash_context, pad, hash_context->block_size);\n  hash_context->update_hash(hash_context, result, hash_context->result_size);\n  hash_context->finish_hash(hash_context, result);\n}\n\n/* V = HMAC_K(V) */\nstatic void update_V(const MG_UECC_HashContext *hash_context, uint8_t *K,\n                     uint8_t *V) {\n  HMAC_init(hash_context, K);\n  HMAC_update(hash_context, V, hash_context->result_size);\n  HMAC_finish(hash_context, K, V);\n}\n\n/* Deterministic signing, similar to RFC 6979. Differences are:\n    * We just use H(m) directly rather than bits2octets(H(m))\n      (it is not reduced modulo curve_n).\n    * We generate a value for k (aka T) directly rather than converting\n   endianness.\n\n   Layout of hash_context->tmp: <K> | <V> | (1 byte overlapped 0x00 or 0x01) /\n   <HMAC pad> */\nint mg_uecc_sign_deterministic(const uint8_t *private_key,\n                               const uint8_t *message_hash, unsigned hash_size,\n                               const MG_UECC_HashContext *hash_context,\n                               uint8_t *signature, MG_UECC_Curve curve) {\n  uint8_t *K = hash_context->tmp;\n  uint8_t *V = K + hash_context->result_size;\n  wordcount_t num_bytes = curve->num_bytes;\n  wordcount_t num_n_words = BITS_TO_WORDS(curve->num_n_bits);\n  bitcount_t num_n_bits = curve->num_n_bits;\n  mg_uecc_word_t tries;\n  unsigned i;\n  for (i = 0; i < hash_context->result_size; ++i) {\n    V[i] = 0x01;\n    K[i] = 0;\n  }\n\n  /* K = HMAC_K(V || 0x00 || int2octets(x) || h(m)) */\n  HMAC_init(hash_context, K);\n  V[hash_context->result_size] = 0x00;\n  HMAC_update(hash_context, V, hash_context->result_size + 1);\n  HMAC_update(hash_context, private_key, (unsigned int) num_bytes);\n  HMAC_update(hash_context, message_hash, hash_size);\n  HMAC_finish(hash_context, K, K);\n\n  update_V(hash_context, K, V);\n\n  /* K = HMAC_K(V || 0x01 || int2octets(x) || h(m)) */\n  HMAC_init(hash_context, K);\n  V[hash_context->result_size] = 0x01;\n  HMAC_update(hash_context, V, hash_context->result_size + 1);\n  HMAC_update(hash_context, private_key, (unsigned int) num_bytes);\n  HMAC_update(hash_context, message_hash, hash_size);\n  HMAC_finish(hash_context, K, K);\n\n  update_V(hash_context, K, V);\n\n  for (tries = 0; tries < MG_UECC_RNG_MAX_TRIES; ++tries) {\n    mg_uecc_word_t T[MG_UECC_MAX_WORDS];\n    uint8_t *T_ptr = (uint8_t *) T;\n    wordcount_t T_bytes = 0;\n    for (;;) {\n      update_V(hash_context, K, V);\n      for (i = 0; i < hash_context->result_size; ++i) {\n        T_ptr[T_bytes++] = V[i];\n        if (T_bytes >= num_n_words * MG_UECC_WORD_SIZE) {\n          goto filled;\n        }\n      }\n    }\n  filled:\n    if ((bitcount_t) num_n_words * MG_UECC_WORD_SIZE * 8 > num_n_bits) {\n      mg_uecc_word_t mask = (mg_uecc_word_t) -1;\n      T[num_n_words - 1] &=\n          mask >>\n          ((bitcount_t) (num_n_words * MG_UECC_WORD_SIZE * 8 - num_n_bits));\n    }\n\n    if (mg_uecc_sign_with_k_internal(private_key, message_hash, hash_size, T,\n                                     signature, curve)) {\n      return 1;\n    }\n\n    /* K = HMAC_K(V || 0x00) */\n    HMAC_init(hash_context, K);\n    V[hash_context->result_size] = 0x00;\n    HMAC_update(hash_context, V, hash_context->result_size + 1);\n    HMAC_finish(hash_context, K, K);\n\n    update_V(hash_context, K, V);\n  }\n  return 0;\n}\n\nstatic bitcount_t smax(bitcount_t a, bitcount_t b) {\n  return (a > b ? a : b);\n}\n\nint mg_uecc_verify(const uint8_t *public_key, const uint8_t *message_hash,\n                   unsigned hash_size, const uint8_t *signature,\n                   MG_UECC_Curve curve) {\n  mg_uecc_word_t u1[MG_UECC_MAX_WORDS], u2[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t z[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t sum[MG_UECC_MAX_WORDS * 2];\n  mg_uecc_word_t rx[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t ry[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tx[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t ty[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tz[MG_UECC_MAX_WORDS];\n  const mg_uecc_word_t *points[4];\n  const mg_uecc_word_t *point;\n  bitcount_t num_bits;\n  bitcount_t i;\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  mg_uecc_word_t *_public = (mg_uecc_word_t *) public_key;\n#else\n  mg_uecc_word_t _public[MG_UECC_MAX_WORDS * 2];\n#endif\n  mg_uecc_word_t r[MG_UECC_MAX_WORDS], s[MG_UECC_MAX_WORDS];\n  wordcount_t num_words = curve->num_words;\n  wordcount_t num_n_words = BITS_TO_WORDS(curve->num_n_bits);\n\n  rx[num_n_words - 1] = 0;\n  r[num_n_words - 1] = 0;\n  s[num_n_words - 1] = 0;\n\n#if MG_UECC_VLI_NATIVE_LITTLE_ENDIAN\n  bcopy((uint8_t *) r, signature, curve->num_bytes);\n  bcopy((uint8_t *) s, signature + curve->num_bytes, curve->num_bytes);\n#else\n  mg_uecc_vli_bytesToNative(_public, public_key, curve->num_bytes);\n  mg_uecc_vli_bytesToNative(_public + num_words, public_key + curve->num_bytes,\n                            curve->num_bytes);\n  mg_uecc_vli_bytesToNative(r, signature, curve->num_bytes);\n  mg_uecc_vli_bytesToNative(s, signature + curve->num_bytes, curve->num_bytes);\n#endif\n\n  /* r, s must not be 0. */\n  if (mg_uecc_vli_isZero(r, num_words) || mg_uecc_vli_isZero(s, num_words)) {\n    return 0;\n  }\n\n  /* r, s must be < n. */\n  if (mg_uecc_vli_cmp_unsafe(curve->n, r, num_n_words) != 1 ||\n      mg_uecc_vli_cmp_unsafe(curve->n, s, num_n_words) != 1) {\n    return 0;\n  }\n\n  /* Calculate u1 and u2. */\n  mg_uecc_vli_modInv(z, s, curve->n, num_n_words); /* z = 1/s */\n  u1[num_n_words - 1] = 0;\n  bits2int(u1, message_hash, hash_size, curve);\n  mg_uecc_vli_modMult(u1, u1, z, curve->n, num_n_words); /* u1 = e/s */\n  mg_uecc_vli_modMult(u2, r, z, curve->n, num_n_words);  /* u2 = r/s */\n\n  /* Calculate sum = G + Q. */\n  mg_uecc_vli_set(sum, _public, num_words);\n  mg_uecc_vli_set(sum + num_words, _public + num_words, num_words);\n  mg_uecc_vli_set(tx, curve->G, num_words);\n  mg_uecc_vli_set(ty, curve->G + num_words, num_words);\n  mg_uecc_vli_modSub(z, sum, tx, curve->p, num_words); /* z = x2 - x1 */\n  XYcZ_add(tx, ty, sum, sum + num_words, curve);\n  mg_uecc_vli_modInv(z, z, curve->p, num_words); /* z = 1/z */\n  apply_z(sum, sum + num_words, z, curve);\n\n  /* Use Shamir's trick to calculate u1*G + u2*Q */\n  points[0] = 0;\n  points[1] = curve->G;\n  points[2] = _public;\n  points[3] = sum;\n  num_bits = smax(mg_uecc_vli_numBits(u1, num_n_words),\n                  mg_uecc_vli_numBits(u2, num_n_words));\n  point =\n      points[(!!mg_uecc_vli_testBit(u1, (bitcount_t) (num_bits - 1))) |\n             ((!!mg_uecc_vli_testBit(u2, (bitcount_t) (num_bits - 1))) << 1)];\n  mg_uecc_vli_set(rx, point, num_words);\n  mg_uecc_vli_set(ry, point + num_words, num_words);\n  mg_uecc_vli_clear(z, num_words);\n  z[0] = 1;\n\n  for (i = num_bits - 2; i >= 0; --i) {\n    mg_uecc_word_t index;\n    curve->double_jacobian(rx, ry, z, curve);\n\n    index = (!!mg_uecc_vli_testBit(u1, i)) |\n            (mg_uecc_word_t) ((!!mg_uecc_vli_testBit(u2, i)) << 1);\n    point = points[index];\n    if (point) {\n      mg_uecc_vli_set(tx, point, num_words);\n      mg_uecc_vli_set(ty, point + num_words, num_words);\n      apply_z(tx, ty, z, curve);\n      mg_uecc_vli_modSub(tz, rx, tx, curve->p, num_words); /* Z = x2 - x1 */\n      XYcZ_add(tx, ty, rx, ry, curve);\n      mg_uecc_vli_modMult_fast(z, z, tz, curve);\n    }\n  }\n\n  mg_uecc_vli_modInv(z, z, curve->p, num_words); /* Z = 1/Z */\n  apply_z(rx, ry, z, curve);\n\n  /* v = x1 (mod n) */\n  if (mg_uecc_vli_cmp_unsafe(curve->n, rx, num_n_words) != 1) {\n    mg_uecc_vli_sub(rx, rx, curve->n, num_n_words);\n  }\n\n  /* Accept only if v == r. */\n  return (int) (mg_uecc_vli_equal(rx, r, num_words));\n}\n\n#if MG_UECC_ENABLE_VLI_API\n\nunsigned mg_uecc_curve_num_words(MG_UECC_Curve curve) {\n  return curve->num_words;\n}\n\nunsigned mg_uecc_curve_num_bytes(MG_UECC_Curve curve) {\n  return curve->num_bytes;\n}\n\nunsigned mg_uecc_curve_num_bits(MG_UECC_Curve curve) {\n  return curve->num_bytes * 8;\n}\n\nunsigned mg_uecc_curve_num_n_words(MG_UECC_Curve curve) {\n  return BITS_TO_WORDS(curve->num_n_bits);\n}\n\nunsigned mg_uecc_curve_num_n_bytes(MG_UECC_Curve curve) {\n  return BITS_TO_BYTES(curve->num_n_bits);\n}\n\nunsigned mg_uecc_curve_num_n_bits(MG_UECC_Curve curve) {\n  return curve->num_n_bits;\n}\n\nconst mg_uecc_word_t *mg_uecc_curve_p(MG_UECC_Curve curve) {\n  return curve->p;\n}\n\nconst mg_uecc_word_t *mg_uecc_curve_n(MG_UECC_Curve curve) {\n  return curve->n;\n}\n\nconst mg_uecc_word_t *mg_uecc_curve_G(MG_UECC_Curve curve) {\n  return curve->G;\n}\n\nconst mg_uecc_word_t *mg_uecc_curve_b(MG_UECC_Curve curve) {\n  return curve->b;\n}\n\n#if MG_UECC_SUPPORT_COMPRESSED_POINT\nvoid mg_uecc_vli_mod_sqrt(mg_uecc_word_t *a, MG_UECC_Curve curve) {\n  curve->mod_sqrt(a, curve);\n}\n#endif\n\nvoid mg_uecc_vli_mmod_fast(mg_uecc_word_t *result, mg_uecc_word_t *product,\n                           MG_UECC_Curve curve) {\n#if (MG_UECC_OPTIMIZATION_LEVEL > 0)\n  curve->mmod_fast(result, product);\n#else\n  mg_uecc_vli_mmod(result, product, curve->p, curve->num_words);\n#endif\n}\n\nvoid mg_uecc_point_mult(mg_uecc_word_t *result, const mg_uecc_word_t *point,\n                        const mg_uecc_word_t *scalar, MG_UECC_Curve curve) {\n  mg_uecc_word_t tmp1[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t tmp2[MG_UECC_MAX_WORDS];\n  mg_uecc_word_t *p2[2] = {tmp1, tmp2};\n  mg_uecc_word_t carry = regularize_k(scalar, tmp1, tmp2, curve);\n\n  EccPoint_mult(result, point, p2[!carry], 0, curve->num_n_bits + 1, curve);\n}\n\n#endif  /* MG_UECC_ENABLE_VLI_API */\n#endif  // MG_TLS_BUILTIN\n// End of uecc BSD-2\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/tls_x25519.c\"\n#endif\n/**\n * Adapted from STROBE: https://strobe.sourceforge.io/\n * Copyright (c) 2015-2016 Cryptography Research, Inc.\n * Author: Mike Hamburg\n * License: MIT License\n */\n\n\n\nconst uint8_t X25519_BASE_POINT[X25519_BYTES] = {9};\n\n#define X25519_WBITS 32\n\ntypedef uint32_t limb_t;\ntypedef uint64_t dlimb_t;\ntypedef int64_t sdlimb_t;\n\n#define NLIMBS (256 / X25519_WBITS)\ntypedef limb_t mg_fe[NLIMBS];\n\nstatic limb_t umaal(limb_t *carry, limb_t acc, limb_t mand, limb_t mier) {\n  dlimb_t tmp = (dlimb_t) mand * mier + acc + *carry;\n  *carry = (limb_t) (tmp >> X25519_WBITS);\n  return (limb_t) tmp;\n}\n\n// These functions are implemented in terms of umaal on ARM\nstatic limb_t adc(limb_t *carry, limb_t acc, limb_t mand) {\n  dlimb_t total = (dlimb_t) *carry + acc + mand;\n  *carry = (limb_t) (total >> X25519_WBITS);\n  return (limb_t) total;\n}\n\nstatic limb_t adc0(limb_t *carry, limb_t acc) {\n  dlimb_t total = (dlimb_t) *carry + acc;\n  *carry = (limb_t) (total >> X25519_WBITS);\n  return (limb_t) total;\n}\n\n// - Precondition: carry is small.\n// - Invariant: result of propagate is < 2^255 + 1 word\n// - In particular, always less than 2p.\n// - Also, output x >= min(x,19)\nstatic void propagate(mg_fe x, limb_t over) {\n  unsigned i;\n  limb_t carry;\n  over = x[NLIMBS - 1] >> (X25519_WBITS - 1) | over << 1;\n  x[NLIMBS - 1] &= ~((limb_t) 1 << (X25519_WBITS - 1));\n\n  carry = over * 19;\n  for (i = 0; i < NLIMBS; i++) {\n    x[i] = adc0(&carry, x[i]);\n  }\n}\n\nstatic void add(mg_fe out, const mg_fe a, const mg_fe b) {\n  unsigned i;\n  limb_t carry = 0;\n  for (i = 0; i < NLIMBS; i++) {\n    out[i] = adc(&carry, a[i], b[i]);\n  }\n  propagate(out, carry);\n}\n\nstatic void sub(mg_fe out, const mg_fe a, const mg_fe b) {\n  unsigned i;\n  sdlimb_t carry = -38;\n  for (i = 0; i < NLIMBS; i++) {\n    carry = carry + a[i] - b[i];\n    out[i] = (limb_t) carry;\n    carry >>= X25519_WBITS;\n  }\n  propagate(out, (limb_t) (1 + carry));\n}\n\n// `b` can contain less than 8 limbs, thus we use `limb_t *` instead of `mg_fe`\n// to avoid build warnings\nstatic void mul(mg_fe out, const mg_fe a, const limb_t *b, unsigned nb) {\n  limb_t accum[2 * NLIMBS] = {0};\n  unsigned i, j;\n\n  limb_t carry2;\n  for (i = 0; i < nb; i++) {\n    limb_t mand = b[i];\n    carry2 = 0;\n    for (j = 0; j < NLIMBS; j++) {\n      limb_t tmp;                        // \"a\" may be misaligned\n      memcpy(&tmp, &a[j], sizeof(tmp));  // So make an aligned copy\n      accum[i + j] = umaal(&carry2, accum[i + j], mand, tmp);\n    }\n    accum[i + j] = carry2;\n  }\n\n  carry2 = 0;\n  for (j = 0; j < NLIMBS; j++) {\n    out[j] = umaal(&carry2, accum[j], 38, accum[j + NLIMBS]);\n  }\n  propagate(out, carry2);\n}\n\nstatic void sqr(mg_fe out, const mg_fe a) {\n  mul(out, a, a, NLIMBS);\n}\nstatic void mul1(mg_fe out, const mg_fe a) {\n  mul(out, a, out, NLIMBS);\n}\nstatic void sqr1(mg_fe a) {\n  mul1(a, a);\n}\n\nstatic void condswap(limb_t a[2 * NLIMBS], limb_t b[2 * NLIMBS],\n                     limb_t doswap) {\n  unsigned i;\n  for (i = 0; i < 2 * NLIMBS; i++) {\n    limb_t xor_ab = (a[i] ^ b[i]) & doswap;\n    a[i] ^= xor_ab;\n    b[i] ^= xor_ab;\n  }\n}\n\n// Canonicalize a field element x, reducing it to the least residue which is\n// congruent to it mod 2^255-19\n// - Precondition: x < 2^255 + 1 word\nstatic limb_t canon(mg_fe x) {\n  // First, add 19.\n  unsigned i;\n  limb_t carry0 = 19;\n  limb_t res;\n  sdlimb_t carry;\n  for (i = 0; i < NLIMBS; i++) {\n    x[i] = adc0(&carry0, x[i]);\n  }\n  propagate(x, carry0);\n\n  // Here, 19 <= x2 < 2^255\n  // - This is because we added 19, so before propagate it can't be less\n  // than 19. After propagate, it still can't be less than 19, because if\n  // propagate does anything it adds 19.\n  // - We know that the high bit must be clear, because either the input was ~\n  // 2^255 + one word + 19 (in which case it propagates to at most 2 words) or\n  // it was < 2^255. So now, if we subtract 19, we will get back to something in\n  // [0,2^255-19).\n  carry = -19;\n  res = 0;\n  for (i = 0; i < NLIMBS; i++) {\n    carry += x[i];\n    res |= x[i] = (limb_t) carry;\n    carry >>= X25519_WBITS;\n  }\n  return (limb_t) (((dlimb_t) res - 1) >> X25519_WBITS);\n}\n\nstatic const limb_t a24[1] = {121665};\n\nstatic void ladder_part1(mg_fe xs[5]) {\n  limb_t *x2 = xs[0], *z2 = xs[1], *x3 = xs[2], *z3 = xs[3], *t1 = xs[4];\n  add(t1, x2, z2);                                 // t1 = A\n  sub(z2, x2, z2);                                 // z2 = B\n  add(x2, x3, z3);                                 // x2 = C\n  sub(z3, x3, z3);                                 // z3 = D\n  mul1(z3, t1);                                    // z3 = DA\n  mul1(x2, z2);                                    // x3 = BC\n  add(x3, z3, x2);                                 // x3 = DA+CB\n  sub(z3, z3, x2);                                 // z3 = DA-CB\n  sqr1(t1);                                        // t1 = AA\n  sqr1(z2);                                        // z2 = BB\n  sub(x2, t1, z2);                                 // x2 = E = AA-BB\n  mul(z2, x2, a24, sizeof(a24) / sizeof(a24[0]));  // z2 = E*a24\n  add(z2, z2, t1);                                 // z2 = E*a24 + AA\n}\n\nstatic void ladder_part2(mg_fe xs[5], const mg_fe x1) {\n  limb_t *x2 = xs[0], *z2 = xs[1], *x3 = xs[2], *z3 = xs[3], *t1 = xs[4];\n  sqr1(z3);         // z3 = (DA-CB)^2\n  mul1(z3, x1);     // z3 = x1 * (DA-CB)^2\n  sqr1(x3);         // x3 = (DA+CB)^2\n  mul1(z2, x2);     // z2 = AA*(E*a24+AA)\n  sub(x2, t1, x2);  // x2 = BB again\n  mul1(x2, t1);     // x2 = AA*BB\n}\n\nstatic void x25519_core(mg_fe xs[5], const uint8_t scalar[X25519_BYTES],\n                        const uint8_t *x1, int clamp) {\n  int i;\n  mg_fe x1_limbs;\n  limb_t swap = 0;\n  limb_t *x2 = xs[0], *x3 = xs[2], *z3 = xs[3];\n  memset(xs, 0, 4 * sizeof(mg_fe));\n  x2[0] = z3[0] = 1;\n  for (i = 0; i < NLIMBS; i++) {\n    x3[i] = x1_limbs[i] =\n        MG_U32(x1[i * 4 + 3], x1[i * 4 + 2], x1[i * 4 + 1], x1[i * 4]);\n  }\n\n  for (i = 255; i >= 0; i--) {\n    uint8_t bytei = scalar[i / 8];\n    limb_t doswap;\n    if (clamp) {\n      if (i / 8 == 0) {\n        bytei &= (uint8_t) ~7U;\n      } else if (i / 8 == X25519_BYTES - 1) {\n        bytei &= 0x7F;\n        bytei |= 0x40;\n      }\n    }\n    doswap = 0 - (limb_t) ((bytei >> (i % 8)) & 1);\n    condswap(x2, x3, swap ^ doswap);\n    swap = doswap;\n\n    ladder_part1(xs);\n    ladder_part2(xs, (const limb_t *) x1_limbs);\n  }\n  condswap(x2, x3, swap);\n}\n\nint mg_tls_x25519(uint8_t out[X25519_BYTES], const uint8_t scalar[X25519_BYTES],\n                  const uint8_t x1[X25519_BYTES], int clamp) {\n  int i, ret;\n  mg_fe xs[5], out_limbs;\n  limb_t *x2, *z2, *z3, *prev;\n  static const struct {\n    uint8_t a, c, n;\n  } steps[13] = {{2, 1, 1},  {2, 1, 1},  {4, 2, 3},  {2, 4, 6},  {3, 1, 1},\n                 {3, 2, 12}, {4, 3, 25}, {2, 3, 25}, {2, 4, 50}, {3, 2, 125},\n                 {3, 1, 2},  {3, 1, 2},  {3, 1, 1}};\n  x25519_core(xs, scalar, x1, clamp);\n\n  // Precomputed inversion chain\n  x2 = xs[0];\n  z2 = xs[1];\n  z3 = xs[3];\n\n  prev = z2;\n  for (i = 0; i < 13; i++) {\n    int j;\n    limb_t *a = xs[steps[i].a];\n    for (j = steps[i].n; j > 0; j--) {\n      sqr(a, prev);\n      prev = a;\n    }\n    mul1(a, xs[steps[i].c]);\n  }\n\n  // Here prev = z3\n  // x2 /= z2\n  mul(out_limbs, x2, z3, NLIMBS);\n  ret = (int) canon(out_limbs);\n  if (!clamp) ret = 0;\n  for (i = 0; i < NLIMBS; i++) {\n    uint32_t n = out_limbs[i];\n    out[i * 4] = (uint8_t) (n & 0xff);\n    out[i * 4 + 1] = (uint8_t) ((n >> 8) & 0xff);\n    out[i * 4 + 2] = (uint8_t) ((n >> 16) & 0xff);\n    out[i * 4 + 3] = (uint8_t) ((n >> 24) & 0xff);\n  }\n  return ret;\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/url.c\"\n#endif\n\n\nstruct url {\n  size_t key, user, pass, host, port, uri, end;\n};\n\nint mg_url_is_ssl(const char *url) {\n  return strncmp(url, \"wss:\", 4) == 0 || strncmp(url, \"https:\", 6) == 0 ||\n         strncmp(url, \"mqtts:\", 6) == 0 || strncmp(url, \"ssl:\", 4) == 0 ||\n         strncmp(url, \"tls:\", 4) == 0 || strncmp(url, \"tcps:\", 5) == 0;\n}\n\nstatic struct url urlparse(const char *url) {\n  size_t i;\n  struct url u;\n  memset(&u, 0, sizeof(u));\n  for (i = 0; url[i] != '\\0'; i++) {\n    if (url[i] == '/' && i > 0 && u.host == 0 && url[i - 1] == '/') {\n      u.host = i + 1;\n      u.port = 0;\n    } else if (url[i] == ']') {\n      u.port = 0;  // IPv6 URLs, like http://[::1]/bar\n    } else if (url[i] == ':' && u.port == 0 && u.uri == 0) {\n      u.port = i + 1;\n    } else if (url[i] == '@' && u.user == 0 && u.pass == 0 && u.uri == 0) {\n      u.user = u.host;\n      u.pass = u.port;\n      u.host = i + 1;\n      u.port = 0;\n    } else if (url[i] == '/' && u.host && u.uri == 0) {\n      u.uri = i;\n    }\n  }\n  u.end = i;\n#if 0\n  printf(\"[%s] %d %d %d %d %d\\n\", url, u.user, u.pass, u.host, u.port, u.uri);\n#endif\n  return u;\n}\n\nstruct mg_str mg_url_host(const char *url) {\n  struct url u = urlparse(url);\n  size_t n = u.port  ? u.port - u.host - 1\n             : u.uri ? u.uri - u.host\n                     : u.end - u.host;\n  struct mg_str s = mg_str_n(url + u.host, n);\n  return s;\n}\n\nconst char *mg_url_uri(const char *url) {\n  struct url u = urlparse(url);\n  return u.uri ? url + u.uri : \"/\";\n}\n\nunsigned short mg_url_port(const char *url) {\n  struct url u = urlparse(url);\n  unsigned short port = 0;\n  if (strncmp(url, \"http:\", 5) == 0 || strncmp(url, \"ws:\", 3) == 0) port = 80;\n  if (strncmp(url, \"wss:\", 4) == 0 || strncmp(url, \"https:\", 6) == 0)\n    port = 443;\n  if (strncmp(url, \"mqtt:\", 5) == 0) port = 1883;\n  if (strncmp(url, \"mqtts:\", 6) == 0) port = 8883;\n  if (u.port) port = (unsigned short) atoi(url + u.port);\n  return port;\n}\n\nstruct mg_str mg_url_user(const char *url) {\n  struct url u = urlparse(url);\n  struct mg_str s = mg_str(\"\");\n  if (u.user && (u.pass || u.host)) {\n    size_t n = u.pass ? u.pass - u.user - 1 : u.host - u.user - 1;\n    s = mg_str_n(url + u.user, n);\n  }\n  return s;\n}\n\nstruct mg_str mg_url_pass(const char *url) {\n  struct url u = urlparse(url);\n  struct mg_str s = mg_str_n(\"\", 0UL);\n  if (u.pass && u.host) {\n    size_t n = u.host - u.pass - 1;\n    s = mg_str_n(url + u.pass, n);\n  }\n  return s;\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/util.c\"\n#endif\n\n\n\n// Not using memset for zeroing memory, cause it can be dropped by compiler\n// See https://github.com/cesanta/mongoose/pull/1265\nvoid mg_bzero(volatile unsigned char *buf, size_t len) {\n  if (buf != NULL) {\n    while (len--) *buf++ = 0;\n  }\n}\n\n#if MG_ENABLE_CUSTOM_RANDOM\n#else\nbool mg_random(void *buf, size_t len) {\n  bool success = false;\n  unsigned char *p = (unsigned char *) buf;\n#if MG_ARCH == MG_ARCH_ESP32\n  while (len--) *p++ = (unsigned char) (esp_random() & 255);\n  success = true;\n#elif MG_ARCH == MG_ARCH_PICOSDK\n  while (len--) *p++ = (unsigned char) (get_rand_32() & 255);\n  success = true;\n#elif MG_ARCH == MG_ARCH_WIN32\n#if defined(_MSC_VER) && _MSC_VER < 1700\n  static bool initialised = false;\n  static HCRYPTPROV hProv;\n  // CryptGenRandom() implementation earlier than 2008 is weak, see\n  // https://en.wikipedia.org/wiki/CryptGenRandom\n  if (!initialised) {\n    initialised = CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,\n                                      CRYPT_VERIFYCONTEXT);\n  }\n  if (initialised) success = CryptGenRandom(hProv, len, p);\n#else\n  size_t i;\n  for (i = 0; i < len; i++) {\n    unsigned int rand_v;\n    if (rand_s(&rand_v) == 0) {\n      p[i] = (unsigned char) (rand_v & 255);\n    } else {\n      break;\n    }\n  }\n  success = (i == len);\n#endif\n\n#elif MG_ARCH == MG_ARCH_UNIX\n  FILE *fp = fopen(\"/dev/urandom\", \"rb\");\n  if (fp != NULL) {\n    if (fread(buf, 1, len, fp) == len) success = true;\n    fclose(fp);\n  }\n#endif\n  // If everything above did not work, fallback to a pseudo random generator\n  if (success == false) {\n    MG_ERROR((\"Weak RNG: using rand()\"));\n    while (len--) *p++ = (unsigned char) (rand() & 255);\n  }\n  return success;\n}\n#endif\n\nchar *mg_random_str(char *buf, size_t len) {\n  size_t i;\n  mg_random(buf, len);\n  for (i = 0; i < len; i++) {\n    uint8_t c = ((uint8_t *) buf)[i] % 62U;\n    buf[i] = i == len - 1 ? (char) '\\0'            // 0-terminate last byte\n             : c < 26     ? (char) ('a' + c)       // lowercase\n             : c < 52     ? (char) ('A' + c - 26)  // uppercase\n                          : (char) ('0' + c - 52);     // numeric\n  }\n  return buf;\n}\n\nuint32_t mg_ntohl(uint32_t net) {\n  uint8_t data[4] = {0, 0, 0, 0};\n  memcpy(&data, &net, sizeof(data));\n  return (((uint32_t) data[3]) << 0) | (((uint32_t) data[2]) << 8) |\n         (((uint32_t) data[1]) << 16) | (((uint32_t) data[0]) << 24);\n}\n\nuint16_t mg_ntohs(uint16_t net) {\n  uint8_t data[2] = {0, 0};\n  memcpy(&data, &net, sizeof(data));\n  return (uint16_t) ((uint16_t) data[1] | (((uint16_t) data[0]) << 8));\n}\n\nuint32_t mg_crc32(uint32_t crc, const char *buf, size_t len) {\n  static const uint32_t crclut[16] = {\n      // table for polynomial 0xEDB88320 (reflected)\n      0x00000000, 0x1DB71064, 0x3B6E20C8, 0x26D930AC, 0x76DC4190, 0x6B6B51F4,\n      0x4DB26158, 0x5005713C, 0xEDB88320, 0xF00F9344, 0xD6D6A3E8, 0xCB61B38C,\n      0x9B64C2B0, 0x86D3D2D4, 0xA00AE278, 0xBDBDF21C};\n  crc = ~crc;\n  while (len--) {\n    uint8_t b = *(uint8_t *) buf++;\n    crc = crclut[(crc ^ b) & 0x0F] ^ (crc >> 4);\n    crc = crclut[(crc ^ (b >> 4)) & 0x0F] ^ (crc >> 4);\n  }\n  return ~crc;\n}\n\nstatic int isbyte(int n) {\n  return n >= 0 && n <= 255;\n}\n\nstatic int parse_net(const char *spec, uint32_t *net, uint32_t *mask) {\n  int n, a, b, c, d, slash = 32, len = 0;\n  if ((sscanf(spec, \"%d.%d.%d.%d/%d%n\", &a, &b, &c, &d, &slash, &n) == 5 ||\n       sscanf(spec, \"%d.%d.%d.%d%n\", &a, &b, &c, &d, &n) == 4) &&\n      isbyte(a) && isbyte(b) && isbyte(c) && isbyte(d) && slash >= 0 &&\n      slash < 33) {\n    len = n;\n    *net = ((uint32_t) a << 24) | ((uint32_t) b << 16) | ((uint32_t) c << 8) |\n           (uint32_t) d;\n    *mask = slash ? (uint32_t) (0xffffffffU << (32 - slash)) : (uint32_t) 0;\n  }\n  return len;\n}\n\nint mg_check_ip_acl(struct mg_str acl, struct mg_addr *remote_ip) {\n  struct mg_str entry;\n  int allowed = acl.len == 0 ? '+' : '-';  // If any ACL is set, deny by default\n  uint32_t remote_ip4;\n  if (remote_ip->is_ip6) {\n    return -1;  // TODO(): handle IPv6 ACL and addresses\n  } else {      // IPv4\n    memcpy((void *) &remote_ip4, remote_ip->ip, sizeof(remote_ip4));\n    while (mg_span(acl, &entry, &acl, ',')) {\n      uint32_t net, mask;\n      if (entry.buf[0] != '+' && entry.buf[0] != '-') return -1;\n      if (parse_net(&entry.buf[1], &net, &mask) == 0) return -2;\n      if ((mg_ntohl(remote_ip4) & mask) == net) allowed = entry.buf[0];\n    }\n  }\n  return allowed == '+';\n}\n\nbool mg_path_is_sane(const struct mg_str path) {\n  const char *s = path.buf;\n  size_t n = path.len;\n  if (path.buf[0] == '.' && path.buf[1] == '.') return false;  // Starts with ..\n  for (; s[0] != '\\0' && n > 0; s++, n--) {\n    if ((s[0] == '/' || s[0] == '\\\\') && n >= 2) {   // Subdir?\n      if (s[1] == '.' && s[2] == '.') return false;  // Starts with ..\n    }\n  }\n  return true;\n}\n\n#if MG_ENABLE_CUSTOM_MILLIS\n#else\nuint64_t mg_millis(void) {\n#if MG_ARCH == MG_ARCH_WIN32\n  return GetTickCount();\n#elif MG_ARCH == MG_ARCH_PICOSDK\n  return time_us_64() / 1000;\n#elif MG_ARCH == MG_ARCH_ESP8266 || MG_ARCH == MG_ARCH_ESP32 || \\\n    MG_ARCH == MG_ARCH_FREERTOS\n  return xTaskGetTickCount() * portTICK_PERIOD_MS;\n#elif MG_ARCH == MG_ARCH_AZURERTOS\n  return tx_time_get() * (1000 /* MS per SEC */ / TX_TIMER_TICKS_PER_SECOND);\n#elif MG_ARCH == MG_ARCH_TIRTOS\n  return (uint64_t) Clock_getTicks();\n#elif MG_ARCH == MG_ARCH_ZEPHYR\n  return (uint64_t) k_uptime_get();\n#elif MG_ARCH == MG_ARCH_CMSIS_RTOS1\n  return (uint64_t) rt_time_get();\n#elif MG_ARCH == MG_ARCH_CMSIS_RTOS2\n  return (uint64_t) ((osKernelGetTickCount() * 1000) / osKernelGetTickFreq());\n#elif MG_ARCH == MG_ARCH_RTTHREAD\n  return (uint64_t) ((rt_tick_get() * 1000) / RT_TICK_PER_SECOND);\n#elif MG_ARCH == MG_ARCH_UNIX && defined(__APPLE__)\n  // Apple CLOCK_MONOTONIC_RAW is equivalent to CLOCK_BOOTTIME on linux\n  // Apple CLOCK_UPTIME_RAW is equivalent to CLOCK_MONOTONIC_RAW on linux\n  return clock_gettime_nsec_np(CLOCK_UPTIME_RAW) / 1000000;\n#elif MG_ARCH == MG_ARCH_UNIX\n  struct timespec ts = {0, 0};\n  // See #1615 - prefer monotonic clock\n#if defined(CLOCK_MONOTONIC_RAW)\n  // Raw hardware-based time that is not subject to NTP adjustment\n  clock_gettime(CLOCK_MONOTONIC_RAW, &ts);\n#elif defined(CLOCK_MONOTONIC)\n  // Affected by the incremental adjustments performed by adjtime and NTP\n  clock_gettime(CLOCK_MONOTONIC, &ts);\n#else\n  // Affected by discontinuous jumps in the system time and by the incremental\n  // adjustments performed by adjtime and NTP\n  clock_gettime(CLOCK_REALTIME, &ts);\n#endif\n  return ((uint64_t) ts.tv_sec * 1000 + (uint64_t) ts.tv_nsec / 1000000);\n#elif defined(ARDUINO)\n  return (uint64_t) millis();\n#else\n  return (uint64_t) (time(NULL) * 1000);\n#endif\n}\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/ws.c\"\n#endif\n\n\n\n\n\n\n\n\n\n\n\nstruct ws_msg {\n  uint8_t flags;\n  size_t header_len;\n  size_t data_len;\n};\n\nsize_t mg_ws_vprintf(struct mg_connection *c, int op, const char *fmt,\n                     va_list *ap) {\n  size_t len = c->send.len;\n  size_t n = mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, ap);\n  mg_ws_wrap(c, c->send.len - len, op);\n  return n;\n}\n\nsize_t mg_ws_printf(struct mg_connection *c, int op, const char *fmt, ...) {\n  size_t len = 0;\n  va_list ap;\n  va_start(ap, fmt);\n  len = mg_ws_vprintf(c, op, fmt, &ap);\n  va_end(ap);\n  return len;\n}\n\nstatic void ws_handshake(struct mg_connection *c, const struct mg_str *wskey,\n                         const struct mg_str *wsproto, const char *fmt,\n                         va_list *ap) {\n  const char *magic = \"258EAFA5-E914-47DA-95CA-C5AB0DC85B11\";\n  unsigned char sha[20], b64_sha[30];\n\n  mg_sha1_ctx sha_ctx;\n  mg_sha1_init(&sha_ctx);\n  mg_sha1_update(&sha_ctx, (unsigned char *) wskey->buf, wskey->len);\n  mg_sha1_update(&sha_ctx, (unsigned char *) magic, 36);\n  mg_sha1_final(sha, &sha_ctx);\n  mg_base64_encode(sha, sizeof(sha), (char *) b64_sha, sizeof(b64_sha));\n  mg_xprintf(mg_pfn_iobuf, &c->send,\n             \"HTTP/1.1 101 Switching Protocols\\r\\n\"\n             \"Upgrade: websocket\\r\\n\"\n             \"Connection: Upgrade\\r\\n\"\n             \"Sec-WebSocket-Accept: %s\\r\\n\",\n             b64_sha);\n  if (fmt != NULL) mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, ap);\n  if (wsproto != NULL) {\n    mg_printf(c, \"Sec-WebSocket-Protocol: %.*s\\r\\n\", (int) wsproto->len,\n              wsproto->buf);\n  }\n  mg_send(c, \"\\r\\n\", 2);\n}\n\nstatic uint32_t be32(const uint8_t *p) {\n  return (((uint32_t) p[3]) << 0) | (((uint32_t) p[2]) << 8) |\n         (((uint32_t) p[1]) << 16) | (((uint32_t) p[0]) << 24);\n}\n\nstatic size_t ws_process(uint8_t *buf, size_t len, struct ws_msg *msg) {\n  size_t i, n = 0, mask_len = 0;\n  memset(msg, 0, sizeof(*msg));\n  if (len >= 2) {\n    n = buf[1] & 0x7f;                // Frame length\n    mask_len = buf[1] & 128 ? 4 : 0;  // last bit is a mask bit\n    msg->flags = buf[0];\n    if (n < 126 && len >= mask_len) {\n      msg->data_len = n;\n      msg->header_len = 2 + mask_len;\n    } else if (n == 126 && len >= 4 + mask_len) {\n      msg->header_len = 4 + mask_len;\n      msg->data_len = (((size_t) buf[2]) << 8) | buf[3];\n    } else if (len >= 10 + mask_len) {\n      msg->header_len = 10 + mask_len;\n      msg->data_len =\n          (size_t) (((uint64_t) be32(buf + 2) << 32) + be32(buf + 6));\n    }\n  }\n  // Sanity check, and integer overflow protection for the boundary check below\n  // data_len should not be larger than 1 Gb\n  if (msg->data_len > 1024 * 1024 * 1024) return 0;\n  if (msg->header_len + msg->data_len > len) return 0;\n  if (mask_len > 0) {\n    uint8_t *p = buf + msg->header_len, *m = p - mask_len;\n    for (i = 0; i < msg->data_len; i++) p[i] ^= m[i & 3];\n  }\n  return msg->header_len + msg->data_len;\n}\n\nstatic size_t mkhdr(size_t len, int op, bool is_client, uint8_t *buf) {\n  size_t n = 0;\n  buf[0] = (uint8_t) (op | 128);\n  if (len < 126) {\n    buf[1] = (unsigned char) len;\n    n = 2;\n  } else if (len < 65536) {\n    uint16_t tmp = mg_htons((uint16_t) len);\n    buf[1] = 126;\n    memcpy(&buf[2], &tmp, sizeof(tmp));\n    n = 4;\n  } else {\n    uint32_t tmp;\n    buf[1] = 127;\n    tmp = mg_htonl((uint32_t) (((uint64_t) len) >> 32));\n    memcpy(&buf[2], &tmp, sizeof(tmp));\n    tmp = mg_htonl((uint32_t) (len & 0xffffffffU));\n    memcpy(&buf[6], &tmp, sizeof(tmp));\n    n = 10;\n  }\n  if (is_client) {\n    buf[1] |= 1 << 7;  // Set masking flag\n    mg_random(&buf[n], 4);\n    n += 4;\n  }\n  return n;\n}\n\nstatic void mg_ws_mask(struct mg_connection *c, size_t len) {\n  if (c->is_client && c->send.buf != NULL) {\n    size_t i;\n    uint8_t *p = c->send.buf + c->send.len - len, *mask = p - 4;\n    for (i = 0; i < len; i++) p[i] ^= mask[i & 3];\n  }\n}\n\nsize_t mg_ws_send(struct mg_connection *c, const void *buf, size_t len,\n                  int op) {\n  uint8_t header[14];\n  size_t header_len = mkhdr(len, op, c->is_client, header);\n  if (!mg_send(c, header, header_len)) return 0;\n  if (!mg_send(c, buf, len)) return header_len;\n  MG_VERBOSE((\"WS out: %d [%.*s]\", (int) len, (int) len, buf));\n  mg_ws_mask(c, len);\n  return header_len + len;\n}\n\nstatic bool mg_ws_client_handshake(struct mg_connection *c) {\n  int n = mg_http_get_request_len(c->recv.buf, c->recv.len);\n  if (n < 0) {\n    mg_error(c, \"not http\");  // Some just, not an HTTP request\n  } else if (n > 0) {\n    if (n < 15 || memcmp(c->recv.buf + 9, \"101\", 3) != 0) {\n      mg_error(c, \"ws handshake error\");\n    } else {\n      struct mg_http_message hm;\n      if (mg_http_parse((char *) c->recv.buf, c->recv.len, &hm)) {\n        c->is_websocket = 1;\n        mg_call(c, MG_EV_WS_OPEN, &hm);\n      } else {\n        mg_error(c, \"ws handshake error\");\n      }\n    }\n    mg_iobuf_del(&c->recv, 0, (size_t) n);\n  } else {\n    return true;  // Request is not yet received, quit event handler\n  }\n  return false;  // Continue event handler\n}\n\nstatic void mg_ws_cb(struct mg_connection *c, int ev, void *ev_data) {\n  struct ws_msg msg;\n  size_t ofs = (size_t) c->pfn_data;\n\n  // assert(ofs < c->recv.len);\n  if (ev == MG_EV_READ) {\n    if (c->is_client && !c->is_websocket && mg_ws_client_handshake(c)) return;\n\n    while (ws_process(c->recv.buf + ofs, c->recv.len - ofs, &msg) > 0) {\n      char *s = (char *) c->recv.buf + ofs + msg.header_len;\n      struct mg_ws_message m = {{s, msg.data_len}, msg.flags};\n      size_t len = msg.header_len + msg.data_len;\n      uint8_t final = msg.flags & 128, op = msg.flags & 15;\n      // MG_VERBOSE (\"fin %d op %d len %d [%.*s]\", final, op,\n      //                       (int) m.data.len, (int) m.data.len, m.data.buf));\n      switch (op) {\n        case WEBSOCKET_OP_CONTINUE:\n          mg_call(c, MG_EV_WS_CTL, &m);\n          break;\n        case WEBSOCKET_OP_PING:\n          MG_DEBUG((\"%s\", \"WS PONG\"));\n          mg_ws_send(c, s, msg.data_len, WEBSOCKET_OP_PONG);\n          mg_call(c, MG_EV_WS_CTL, &m);\n          break;\n        case WEBSOCKET_OP_PONG:\n          mg_call(c, MG_EV_WS_CTL, &m);\n          break;\n        case WEBSOCKET_OP_TEXT:\n        case WEBSOCKET_OP_BINARY:\n          if (final) mg_call(c, MG_EV_WS_MSG, &m);\n          break;\n        case WEBSOCKET_OP_CLOSE:\n          MG_DEBUG((\"%lu WS CLOSE\", c->id));\n          mg_call(c, MG_EV_WS_CTL, &m);\n          // Echo the payload of the received CLOSE message back to the sender\n          mg_ws_send(c, m.data.buf, m.data.len, WEBSOCKET_OP_CLOSE);\n          c->is_draining = 1;\n          break;\n        default:\n          // Per RFC6455, close conn when an unknown op is recvd\n          mg_error(c, \"unknown WS op %d\", op);\n          break;\n      }\n\n      // Handle fragmented frames: strip header, keep in c->recv\n      if (final == 0 || op == 0) {\n        if (op) ofs++, len--, msg.header_len--;       // First frame\n        mg_iobuf_del(&c->recv, ofs, msg.header_len);  // Strip header\n        len -= msg.header_len;\n        ofs += len;\n        c->pfn_data = (void *) ofs;\n        // MG_INFO((\"FRAG %d [%.*s]\", (int) ofs, (int) ofs, c->recv.buf));\n      }\n      // Remove non-fragmented frame\n      if (final && op) mg_iobuf_del(&c->recv, ofs, len);\n      // Last chunk of the fragmented frame\n      if (final && !op) {\n        m.flags = c->recv.buf[0];\n        m.data = mg_str_n((char *) &c->recv.buf[1], (size_t) (ofs - 1));\n        mg_call(c, MG_EV_WS_MSG, &m);\n        mg_iobuf_del(&c->recv, 0, ofs);\n        ofs = 0;\n        c->pfn_data = NULL;\n      }\n    }\n  }\n  (void) ev_data;\n}\n\nstruct mg_connection *mg_ws_connect(struct mg_mgr *mgr, const char *url,\n                                    mg_event_handler_t fn, void *fn_data,\n                                    const char *fmt, ...) {\n  struct mg_connection *c = mg_connect(mgr, url, fn, fn_data);\n  if (c != NULL) {\n    char nonce[16], key[30];\n    struct mg_str host = mg_url_host(url);\n    mg_random(nonce, sizeof(nonce));\n    mg_base64_encode((unsigned char *) nonce, sizeof(nonce), key, sizeof(key));\n    mg_xprintf(mg_pfn_iobuf, &c->send,\n               \"GET %s HTTP/1.1\\r\\n\"\n               \"Upgrade: websocket\\r\\n\"\n               \"Host: %.*s\\r\\n\"\n               \"Connection: Upgrade\\r\\n\"\n               \"Sec-WebSocket-Version: 13\\r\\n\"\n               \"Sec-WebSocket-Key: %s\\r\\n\",\n               mg_url_uri(url), (int) host.len, host.buf, key);\n    if (fmt != NULL) {\n      va_list ap;\n      va_start(ap, fmt);\n      mg_vxprintf(mg_pfn_iobuf, &c->send, fmt, &ap);\n      va_end(ap);\n    }\n    mg_xprintf(mg_pfn_iobuf, &c->send, \"\\r\\n\");\n    c->pfn = mg_ws_cb;\n    c->pfn_data = NULL;\n  }\n  return c;\n}\n\nvoid mg_ws_upgrade(struct mg_connection *c, struct mg_http_message *hm,\n                   const char *fmt, ...) {\n  struct mg_str *wskey = mg_http_get_header(hm, \"Sec-WebSocket-Key\");\n  c->pfn = mg_ws_cb;\n  c->pfn_data = NULL;\n  if (wskey == NULL) {\n    mg_http_reply(c, 426, \"\", \"WS upgrade expected\\n\");\n    c->is_draining = 1;\n  } else {\n    struct mg_str *wsproto = mg_http_get_header(hm, \"Sec-WebSocket-Protocol\");\n    va_list ap;\n    va_start(ap, fmt);\n    ws_handshake(c, wskey, wsproto, fmt, &ap);\n    va_end(ap);\n    c->is_websocket = 1;\n    c->is_resp = 0;\n    mg_call(c, MG_EV_WS_OPEN, hm);\n  }\n}\n\nsize_t mg_ws_wrap(struct mg_connection *c, size_t len, int op) {\n  uint8_t header[14], *p;\n  size_t header_len = mkhdr(len, op, c->is_client, header);\n\n  // NOTE: order of operations is important!\n  if (mg_iobuf_add(&c->send, c->send.len, NULL, header_len) != 0) {\n    p = &c->send.buf[c->send.len - len];         // p points to data\n    memmove(p, p - header_len, len);             // Shift data\n    memcpy(p - header_len, header, header_len);  // Prepend header\n    mg_ws_mask(c, len);                          // Mask data\n  }\n  return c->send.len;\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/cmsis.c\"\n#endif\n// https://arm-software.github.io/CMSIS_5/Driver/html/index.html\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_CMSIS) && MG_ENABLE_DRIVER_CMSIS\n\n\n\n\n\nextern ARM_DRIVER_ETH_MAC Driver_ETH_MAC0;\nextern ARM_DRIVER_ETH_PHY Driver_ETH_PHY0;\n\nstatic struct mg_tcpip_if *s_ifp;\n\nstatic void mac_cb(uint32_t);\nstatic bool cmsis_init(struct mg_tcpip_if *);\nstatic bool cmsis_up(struct mg_tcpip_if *);\nstatic size_t cmsis_tx(const void *, size_t, struct mg_tcpip_if *);\nstatic size_t cmsis_rx(void *, size_t, struct mg_tcpip_if *);\n\nstruct mg_tcpip_driver mg_tcpip_driver_cmsis = {cmsis_init, cmsis_tx, NULL,\n                                                cmsis_up};\n\nstatic bool cmsis_init(struct mg_tcpip_if *ifp) {\n  ARM_ETH_MAC_ADDR addr;\n  s_ifp = ifp;\n\n  ARM_DRIVER_ETH_MAC *mac = &Driver_ETH_MAC0;\n  ARM_DRIVER_ETH_PHY *phy = &Driver_ETH_PHY0;\n  ARM_ETH_MAC_CAPABILITIES cap = mac->GetCapabilities();\n  if (mac->Initialize(mac_cb) != ARM_DRIVER_OK) return false;\n  if (phy->Initialize(mac->PHY_Read, mac->PHY_Write) != ARM_DRIVER_OK)\n    return false;\n  if (cap.event_rx_frame == 0)  // polled mode driver\n    mg_tcpip_driver_cmsis.rx = cmsis_rx;\n  mac->PowerControl(ARM_POWER_FULL);\n  if (cap.mac_address) {  // driver provides MAC address\n    mac->GetMacAddress(&addr);\n    memcpy(ifp->mac, &addr, sizeof(ifp->mac));\n  } else {  // we provide MAC address\n    memcpy(&addr, ifp->mac, sizeof(addr));\n    mac->SetMacAddress(&addr);\n  }\n  phy->PowerControl(ARM_POWER_FULL);\n  phy->SetInterface(cap.media_interface);\n  phy->SetMode(ARM_ETH_PHY_AUTO_NEGOTIATE);\n  return true;\n}\n\nstatic size_t cmsis_tx(const void *buf, size_t len, struct mg_tcpip_if *ifp) {\n  ARM_DRIVER_ETH_MAC *mac = &Driver_ETH_MAC0;\n  if (mac->SendFrame(buf, (uint32_t) len, 0) != ARM_DRIVER_OK) {\n    ifp->nerr++;\n    return 0;\n  }\n  ifp->nsent++;\n  return len;\n}\n\nstatic bool cmsis_up(struct mg_tcpip_if *ifp) {\n  ARM_DRIVER_ETH_PHY *phy = &Driver_ETH_PHY0;\n  ARM_DRIVER_ETH_MAC *mac = &Driver_ETH_MAC0;\n  bool up = (phy->GetLinkState() == ARM_ETH_LINK_UP) ? 1 : 0;  // link state\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {             // just went up\n    ARM_ETH_LINK_INFO st = phy->GetLinkInfo();\n    mac->Control(ARM_ETH_MAC_CONFIGURE,\n                 (st.speed << ARM_ETH_MAC_SPEED_Pos) |\n                     (st.duplex << ARM_ETH_MAC_DUPLEX_Pos) |\n                     ARM_ETH_MAC_ADDRESS_BROADCAST);\n    MG_DEBUG((\"Link is %uM %s-duplex\",\n              (st.speed == 2) ? 1000\n              : st.speed      ? 100\n                              : 10,\n              st.duplex ? \"full\" : \"half\"));\n    mac->Control(ARM_ETH_MAC_CONTROL_TX, 1);\n    mac->Control(ARM_ETH_MAC_CONTROL_RX, 1);\n  } else if ((ifp->state != MG_TCPIP_STATE_DOWN) && !up) {  // just went down\n    mac->Control(ARM_ETH_MAC_FLUSH,\n                 ARM_ETH_MAC_FLUSH_TX | ARM_ETH_MAC_FLUSH_RX);\n    mac->Control(ARM_ETH_MAC_CONTROL_TX, 0);\n    mac->Control(ARM_ETH_MAC_CONTROL_RX, 0);\n  }\n  return up;\n}\n\nstatic void mac_cb(uint32_t ev) {\n  if ((ev & ARM_ETH_MAC_EVENT_RX_FRAME) == 0) return;\n  ARM_DRIVER_ETH_MAC *mac = &Driver_ETH_MAC0;\n  uint32_t len = mac->GetRxFrameSize();  // CRC already stripped\n  if (len >= 60 && len <= 1518) {        // proper frame\n    char *p;\n    if (mg_queue_book(&s_ifp->recv_queue, &p, len) >= len) {  // have room\n      if ((len = mac->ReadFrame((uint8_t *) p, len)) > 0) {   // copy succeeds\n        mg_queue_add(&s_ifp->recv_queue, len);\n        s_ifp->nrecv++;\n      }\n      return;\n    }\n    s_ifp->ndrop++;\n  }\n  mac->ReadFrame(NULL, 0);  // otherwise, discard\n}\n\nstatic size_t cmsis_rx(void *buf, size_t buflen, struct mg_tcpip_if *ifp) {\n  ARM_DRIVER_ETH_MAC *mac = &Driver_ETH_MAC0;\n  uint32_t len = mac->GetRxFrameSize();  // CRC already stripped\n  if (len >= 60 && len <= 1518 &&\n      ((len = mac->ReadFrame(buf, (uint32_t) buflen)) > 0))\n    return len;\n  if (len > 0) mac->ReadFrame(NULL, 0);  // discard bad frames\n  (void) ifp;\n  return 0;\n}\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/imxrt.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_IMXRT) && MG_ENABLE_DRIVER_IMXRT\nstruct imxrt_enet {\n  volatile uint32_t RESERVED0, EIR, EIMR, RESERVED1, RDAR, TDAR, RESERVED2[3],\n      ECR, RESERVED3[6], MMFR, MSCR, RESERVED4[7], MIBC, RESERVED5[7], RCR,\n      RESERVED6[15], TCR, RESERVED7[7], PALR, PAUR, OPD, TXIC0, TXIC1, TXIC2,\n      RESERVED8, RXIC0, RXIC1, RXIC2, RESERVED9[3], IAUR, IALR, GAUR, GALR,\n      RESERVED10[7], TFWR, RESERVED11[14], RDSR, TDSR, MRBR[2], RSFL, RSEM,\n      RAEM, RAFL, TSEM, TAEM, TAFL, TIPG, FTRL, RESERVED12[3], TACC, RACC,\n      RESERVED13[15], RMON_T_PACKETS, RMON_T_BC_PKT, RMON_T_MC_PKT,\n      RMON_T_CRC_ALIGN, RMON_T_UNDERSIZE, RMON_T_OVERSIZE, RMON_T_FRAG,\n      RMON_T_JAB, RMON_T_COL, RMON_T_P64, RMON_T_P65TO127, RMON_T_P128TO255,\n      RMON_T_P256TO511, RMON_T_P512TO1023, RMON_T_P1024TO2048, RMON_T_GTE2048,\n      RMON_T_OCTETS, IEEE_T_DROP, IEEE_T_FRAME_OK, IEEE_T_1COL, IEEE_T_MCOL,\n      IEEE_T_DEF, IEEE_T_LCOL, IEEE_T_EXCOL, IEEE_T_MACERR, IEEE_T_CSERR,\n      IEEE_T_SQE, IEEE_T_FDXFC, IEEE_T_OCTETS_OK, RESERVED14[3], RMON_R_PACKETS,\n      RMON_R_BC_PKT, RMON_R_MC_PKT, RMON_R_CRC_ALIGN, RMON_R_UNDERSIZE,\n      RMON_R_OVERSIZE, RMON_R_FRAG, RMON_R_JAB, RESERVED15, RMON_R_P64,\n      RMON_R_P65TO127, RMON_R_P128TO255, RMON_R_P256TO511, RMON_R_P512TO1023,\n      RMON_R_P1024TO2047, RMON_R_GTE2048, RMON_R_OCTETS, IEEE_R_DROP,\n      IEEE_R_FRAME_OK, IEEE_R_CRC, IEEE_R_ALIGN, IEEE_R_MACERR, IEEE_R_FDXFC,\n      IEEE_R_OCTETS_OK, RESERVED16[71], ATCR, ATVR, ATOFF, ATPER, ATCOR, ATINC,\n      ATSTMP, RESERVED17[122], TGSR, TCSR0, TCCR0, TCSR1, TCCR1, TCSR2, TCCR2,\n      TCSR3;\n};\n\n#undef ENET\n#if defined(MG_DRIVER_IMXRT_RT11) && MG_DRIVER_IMXRT_RT11\n#define ENET ((struct imxrt_enet *) (uintptr_t) 0x40424000U)\n#define ETH_DESC_CNT 5     // Descriptors count\n#else\n#define ENET ((struct imxrt_enet *) (uintptr_t) 0x402D8000U)\n#define ETH_DESC_CNT 4     // Descriptors count\n#endif\n\n#define ETH_PKT_SIZE 1536  // Max frame size, 64-bit aligned\n\nstruct enet_desc {\n  uint16_t length;   // Data length\n  uint16_t control;  // Control and status\n  uint32_t *buffer;  // Data ptr\n};\n\n// TODO(): handle these in a portable compiler-independent CMSIS-friendly way\n#define MG_64BYTE_ALIGNED __attribute__((aligned((64U))))\n\n// Descriptors: in non-cached area (TODO(scaprile)), (37.5.1.22.2 37.5.1.23.2)\n// Buffers: 64-byte aligned (37.3.14)\nstatic volatile struct enet_desc s_rxdesc[ETH_DESC_CNT] MG_64BYTE_ALIGNED;\nstatic volatile struct enet_desc s_txdesc[ETH_DESC_CNT] MG_64BYTE_ALIGNED;\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_64BYTE_ALIGNED;\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_64BYTE_ALIGNED;\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\n\nstatic uint16_t enet_read_phy(uint8_t addr, uint8_t reg) {\n  ENET->EIR |= MG_BIT(23);  // MII interrupt clear\n  ENET->MMFR = (1 << 30) | (2 << 28) | (addr << 23) | (reg << 18) | (2 << 16);\n  while ((ENET->EIR & MG_BIT(23)) == 0) (void) 0;\n  return ENET->MMFR & 0xffff;\n}\n\nstatic void enet_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  ENET->EIR |= MG_BIT(23);  // MII interrupt clear\n  ENET->MMFR =\n      (1 << 30) | (1 << 28) | (addr << 23) | (reg << 18) | (2 << 16) | val;\n  while ((ENET->EIR & MG_BIT(23)) == 0) (void) 0;\n}\n\n//  MDC clock is generated from IPS Bus clock (ipg_clk); as per 802.3,\n//  it must not exceed 2.5MHz\n// The PHY receives the PLL6-generated 50MHz clock\nstatic bool mg_tcpip_driver_imxrt_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_imxrt_data *d =\n      (struct mg_tcpip_driver_imxrt_data *) ifp->driver_data;\n  s_ifp = ifp;\n\n  // Init RX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i].control = MG_BIT(15);              // Own (E)\n    s_rxdesc[i].buffer = (uint32_t *) s_rxbuf[i];  // Point to data buffer\n  }\n  s_rxdesc[ETH_DESC_CNT - 1].control |= MG_BIT(13);  // Wrap last descriptor\n\n  // Init TX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    // s_txdesc[i].control = MG_BIT(10);  // Own (TC)\n    s_txdesc[i].buffer = (uint32_t *) s_txbuf[i];\n  }\n  s_txdesc[ETH_DESC_CNT - 1].control |= MG_BIT(13);  // Wrap last descriptor\n\n  ENET->ECR = MG_BIT(0);                     // Software reset, disable\n  while ((ENET->ECR & MG_BIT(0))) (void) 0;  // Wait until done\n\n  // Set MDC clock divider. If user told us the value, use it.\n  // TODO(): Otherwise, guess (currently assuming max freq)\n  int cr = (d == NULL || d->mdc_cr < 0) ? 24 : d->mdc_cr;\n  ENET->MSCR = (1 << 8) | ((cr & 0x3f) << 1);  // HOLDTIME 2 clks\n  struct mg_phy phy = {enet_read_phy, enet_write_phy};\n  mg_phy_init(&phy, d->phy_addr, MG_PHY_LEDS_ACTIVE_HIGH); // MAC clocks PHY  \n  // Select RMII mode, 100M, keep CRC, set max rx length, disable loop\n  ENET->RCR = (1518 << 16) | MG_BIT(8) | MG_BIT(2);\n  // ENET->RCR |= MG_BIT(3);     // Receive all\n  ENET->TCR = MG_BIT(2);  // Full-duplex\n  ENET->RDSR = (uint32_t) (uintptr_t) s_rxdesc;\n  ENET->TDSR = (uint32_t) (uintptr_t) s_txdesc;\n  ENET->MRBR[0] = ETH_PKT_SIZE;  // Same size for RX/TX buffers\n  // MAC address filtering (bytes in reversed order)\n  ENET->PAUR = ((uint32_t) ifp->mac[4] << 24U) | (uint32_t) ifp->mac[5] << 16U;\n  ENET->PALR = (uint32_t) (ifp->mac[0] << 24U) |\n               ((uint32_t) ifp->mac[1] << 16U) |\n               ((uint32_t) ifp->mac[2] << 8U) | ifp->mac[3];\n  ENET->ECR = MG_BIT(8) | MG_BIT(1);  // Little-endian CPU, Enable\n  ENET->EIMR = MG_BIT(25);            // Set interrupt mask\n  ENET->RDAR = MG_BIT(24);            // Receive Descriptors have changed\n  ENET->TDAR = MG_BIT(24);            // Transmit Descriptors have changed\n  // ENET->OPD = 0x10014;\n  return true;\n}\n\n// Transmit frame\nstatic size_t mg_tcpip_driver_imxrt_tx(const void *buf, size_t len,\n                                       struct mg_tcpip_if *ifp) {\n  static int s_txno;  // Current descriptor index\n  if (len > sizeof(s_txbuf[ETH_DESC_CNT])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = (size_t) -1;  // fail\n  } else if ((s_txdesc[s_txno].control & MG_BIT(15))) {\n    ifp->nerr++;\n    MG_ERROR((\"No descriptors available\"));\n    len = 0;  // retry later\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);         // Copy data\n    s_txdesc[s_txno].length = (uint16_t) len;  // Set data len\n    // Table 37-34, R, L, TC (Ready, last, transmit CRC after frame\n    s_txdesc[s_txno].control |=\n        (uint16_t) (MG_BIT(15) | MG_BIT(11) | MG_BIT(10));\n    ENET->TDAR = MG_BIT(24);  // Descriptor ring updated\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n  (void) ifp;\n  return len;\n}\n\nstatic bool mg_tcpip_driver_imxrt_up(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_imxrt_data *d =\n      (struct mg_tcpip_driver_imxrt_data *) ifp->driver_data;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {enet_read_phy, enet_write_phy};\n  up = mg_phy_up(&phy, d->phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    // tmp = reg with flags set to the most likely situation: 100M full-duplex\n    // if(link is slow or half) set flags otherwise\n    // reg = tmp\n    uint32_t tcr = ENET->TCR | MG_BIT(2);             // Full-duplex\n    uint32_t rcr = ENET->RCR & ~MG_BIT(9);            // 100M\n    if (speed == MG_PHY_SPEED_10M) rcr |= MG_BIT(9);  // 10M\n    if (full_duplex == false) tcr &= ~MG_BIT(2);      // Half-duplex\n    ENET->TCR = tcr;  // IRQ handler does not fiddle with these registers\n    ENET->RCR = rcr;\n    MG_DEBUG((\"Link is %uM %s-duplex\", rcr & MG_BIT(9) ? 10 : 100,\n              tcr & MG_BIT(2) ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\nvoid ENET_IRQHandler(void);\nstatic uint32_t s_rxno;\nvoid ENET_IRQHandler(void) {\n  ENET->EIR = MG_BIT(25);  // Ack IRQ\n  // Frame received, loop\n  for (uint32_t i = 0; i < 10; i++) {  // read as they arrive but not forever\n    uint32_t r = s_rxdesc[s_rxno].control;\n    if (r & MG_BIT(15)) break;  // exit when done\n    // skip partial/errored frames (Table 37-32)\n    if ((r & MG_BIT(11)) &&\n        !(r & (MG_BIT(5) | MG_BIT(4) | MG_BIT(2) | MG_BIT(1) | MG_BIT(0)))) {\n      size_t len = s_rxdesc[s_rxno].length;\n      mg_tcpip_qwrite(s_rxbuf[s_rxno], len > 4 ? len - 4 : len, s_ifp);\n    }\n    s_rxdesc[s_rxno].control |= MG_BIT(15);\n    if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n  }\n  ENET->RDAR = MG_BIT(24);  // Receive Descriptors have changed\n  // If b24 == 0, descriptors were exhausted and probably frames were dropped\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_imxrt = {mg_tcpip_driver_imxrt_init,\n                                                mg_tcpip_driver_imxrt_tx, NULL,\n                                                mg_tcpip_driver_imxrt_up};\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/phy.c\"\n#endif\n\n\nenum {                      // ID1  ID2\n  MG_PHY_KSZ8x = 0x22,      // 0022 1561 - KSZ8081RNB\n  MG_PHY_DP83x = 0x2000,\n  MG_PHY_DP83867 = 0xa231,  // 2000 a231 - TI DP83867I\n  MG_PHY_DP83825 = 0xa140,  // 2000 a140 - TI DP83825I\n  MG_PHY_DP83848 = 0x5ca2,  // 2000 5ca2 - TI DP83848I\n  MG_PHY_LAN87x = 0x7,      // 0007 c0fx - LAN8720\n  MG_PHY_RTL8201 = 0x1C     // 001c c816 - RTL8201\n};\n\nenum {\n  MG_PHY_REG_BCR = 0,\n  MG_PHY_REG_BSR = 1,\n  MG_PHY_REG_ID1 = 2,\n  MG_PHY_REG_ID2 = 3,\n  MG_PHY_DP83x_REG_PHYSTS = 16,\n  MG_PHY_DP83867_REG_PHYSTS = 17,\n  MG_PHY_DP83x_REG_RCSR = 23,\n  MG_PHY_DP83x_REG_LEDCR = 24,\n  MG_PHY_KSZ8x_REG_PC1R = 30,\n  MG_PHY_KSZ8x_REG_PC2R = 31,\n  MG_PHY_LAN87x_REG_SCSR = 31,\n  MG_PHY_RTL8201_REG_RMSR = 16,  // in page 7\n  MG_PHY_RTL8201_REG_PAGESEL = 31\n};\n\nstatic const char *mg_phy_id_to_str(uint16_t id1, uint16_t id2) {\n  switch (id1) {\n    case MG_PHY_DP83x:\n      switch (id2) {\n        case MG_PHY_DP83867:\n          return \"DP83867\";\n        case MG_PHY_DP83848:\n          return \"DP83848\";\n        case MG_PHY_DP83825:\n          return \"DP83825\";\n        default:\n          return \"DP83x\";\n      }\n    case MG_PHY_KSZ8x:\n      return \"KSZ8x\";\n    case MG_PHY_LAN87x:\n      return \"LAN87x\";\n    case MG_PHY_RTL8201:\n      return \"RTL8201\";\n    default:\n      return \"unknown\";\n  }\n  (void) id2;\n}\n\nvoid mg_phy_init(struct mg_phy *phy, uint8_t phy_addr, uint8_t config) {\n  uint16_t id1, id2;\n  phy->write_reg(phy_addr, MG_PHY_REG_BCR, MG_BIT(15));  // Reset PHY\n  while (phy->read_reg(phy_addr, MG_PHY_REG_BCR) & MG_BIT(15)) (void) 0;\n  // MG_PHY_REG_BCR[12]: Autonegotiation is default unless hw says otherwise\n\n  id1 = phy->read_reg(phy_addr, MG_PHY_REG_ID1);\n  id2 = phy->read_reg(phy_addr, MG_PHY_REG_ID2);\n  MG_INFO((\"PHY ID: %#04x %#04x (%s)\", id1, id2, mg_phy_id_to_str(id1, id2)));\n\n  if (id1 == MG_PHY_DP83x && id2 == MG_PHY_DP83867) {\n    phy->write_reg(phy_addr, 0x0d, 0x1f);  // write 0x10d to IO_MUX_CFG (0x0170)\n    phy->write_reg(phy_addr, 0x0e, 0x170);\n    phy->write_reg(phy_addr, 0x0d, 0x401f);\n    phy->write_reg(phy_addr, 0x0e, 0x10d);\n  }\n\n  if (config & MG_PHY_CLOCKS_MAC) {\n    // Use PHY crystal oscillator (preserve defaults)\n    // nothing to do\n  } else {  // MAC clocks PHY, PHY has no xtal\n    // Enable 50 MHz external ref clock at XI (preserve defaults)\n    if (id1 == MG_PHY_DP83x && id2 != MG_PHY_DP83867 && id2 != MG_PHY_DP83848) {\n      phy->write_reg(phy_addr, MG_PHY_DP83x_REG_RCSR, MG_BIT(7) | MG_BIT(0));\n    } else if (id1 == MG_PHY_KSZ8x) {\n      // Disable isolation (override hw, it doesn't make sense at this point)\n      phy->write_reg(  // #2848, some NXP boards set ISO, even though\n          phy_addr, MG_PHY_REG_BCR,  // docs say they don't\n          phy->read_reg(phy_addr, MG_PHY_REG_BCR) & (uint16_t) ~MG_BIT(10));\n      phy->write_reg(phy_addr, MG_PHY_KSZ8x_REG_PC2R,  // now do clock stuff\n                     MG_BIT(15) | MG_BIT(8) | MG_BIT(7));\n    } else if (id1 == MG_PHY_LAN87x) {\n      // nothing to do\n    } else if (id1 == MG_PHY_RTL8201) {\n      // assume PHY has been hardware strapped properly\n#if 0\n      phy->write_reg(phy_addr, MG_PHY_RTL8201_REG_PAGESEL, 7);  // Select page 7\n      phy->write_reg(phy_addr, MG_PHY_RTL8201_REG_RMSR, 0x1ffa);\n      phy->write_reg(phy_addr, MG_PHY_RTL8201_REG_PAGESEL, 0);  // Select page 0\n#endif\n    }\n  }\n\n  if (config & MG_PHY_LEDS_ACTIVE_HIGH && id1 == MG_PHY_DP83x) {\n    phy->write_reg(phy_addr, MG_PHY_DP83x_REG_LEDCR,\n                   MG_BIT(9) | MG_BIT(7));  // LED status, active high\n  }  // Other PHYs do not support this feature\n}\n\nbool mg_phy_up(struct mg_phy *phy, uint8_t phy_addr, bool *full_duplex,\n               uint8_t *speed) {\n  bool up = false;\n  uint16_t bsr = phy->read_reg(phy_addr, MG_PHY_REG_BSR);\n  if ((bsr & MG_BIT(5)) && !(bsr & MG_BIT(2)))  // some PHYs latch down events\n    bsr = phy->read_reg(phy_addr, MG_PHY_REG_BSR);  // read again\n  up = bsr & MG_BIT(2);\n  if (up && full_duplex != NULL && speed != NULL) {\n    uint16_t id1 = phy->read_reg(phy_addr, MG_PHY_REG_ID1);\n    if (id1 == MG_PHY_DP83x) {\n      uint16_t id2 = phy->read_reg(phy_addr, MG_PHY_REG_ID2);\n      if (id2 == MG_PHY_DP83867) {\n        uint16_t physts = phy->read_reg(phy_addr, MG_PHY_DP83867_REG_PHYSTS);\n        *full_duplex = physts & MG_BIT(13);\n        *speed = (physts & MG_BIT(15))   ? MG_PHY_SPEED_1000M\n                 : (physts & MG_BIT(14)) ? MG_PHY_SPEED_100M\n                                         : MG_PHY_SPEED_10M;\n      } else {\n        uint16_t physts = phy->read_reg(phy_addr, MG_PHY_DP83x_REG_PHYSTS);\n        *full_duplex = physts & MG_BIT(2);\n        *speed = (physts & MG_BIT(1)) ? MG_PHY_SPEED_10M : MG_PHY_SPEED_100M;\n      }\n    } else if (id1 == MG_PHY_KSZ8x) {\n      uint16_t pc1r = phy->read_reg(phy_addr, MG_PHY_KSZ8x_REG_PC1R);\n      *full_duplex = pc1r & MG_BIT(2);\n      *speed = (pc1r & 3) == 1 ? MG_PHY_SPEED_10M : MG_PHY_SPEED_100M;\n    } else if (id1 == MG_PHY_LAN87x) {\n      uint16_t scsr = phy->read_reg(phy_addr, MG_PHY_LAN87x_REG_SCSR);\n      *full_duplex = scsr & MG_BIT(4);\n      *speed = (scsr & MG_BIT(3)) ? MG_PHY_SPEED_100M : MG_PHY_SPEED_10M;\n    } else if (id1 == MG_PHY_RTL8201) {\n      uint16_t bcr = phy->read_reg(phy_addr, MG_PHY_REG_BCR);\n      *full_duplex = bcr & MG_BIT(8);\n      *speed = (bcr & MG_BIT(13)) ? MG_PHY_SPEED_100M : MG_PHY_SPEED_10M;\n    }\n  }\n  return up;\n}\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/pico-w.c\"\n#endif\n#if MG_ENABLE_TCPIP && MG_ARCH == MG_ARCH_PICOSDK && \\\n    defined(MG_ENABLE_DRIVER_PICO_W) && MG_ENABLE_DRIVER_PICO_W\n\n\n\n\n\nstatic struct mg_tcpip_if *s_ifp;\n\nstatic bool mg_tcpip_driver_pico_w_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_pico_w_data *d =\n      (struct mg_tcpip_driver_pico_w_data *) ifp->driver_data;\n  s_ifp = ifp;\n  if (cyw43_arch_init() != 0)\n    return false;  // initialize async_context and WiFi chip\n  cyw43_arch_enable_sta_mode();\n  // start connecting to network\n  if (cyw43_arch_wifi_connect_bssid_async(d->ssid, NULL, d->pass,\n                                          CYW43_AUTH_WPA2_AES_PSK) != 0)\n    return false;\n  cyw43_wifi_get_mac(&cyw43_state, CYW43_ITF_STA, ifp->mac);\n  return true;\n}\n\nstatic size_t mg_tcpip_driver_pico_w_tx(const void *buf, size_t len,\n                                        struct mg_tcpip_if *ifp) {\n  (void) ifp;\n  return cyw43_send_ethernet(&cyw43_state, CYW43_ITF_STA, len, buf, false)\n             ? 0\n             : len;\n}\n\nstatic bool mg_tcpip_driver_pico_w_up(struct mg_tcpip_if *ifp) {\n  (void) ifp;\n  return (cyw43_wifi_link_status(&cyw43_state, CYW43_ITF_STA) ==\n          CYW43_LINK_JOIN);\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_pico_w = {\n    mg_tcpip_driver_pico_w_init,\n    mg_tcpip_driver_pico_w_tx,\n    NULL,\n    mg_tcpip_driver_pico_w_up,\n};\n\n// Called once per outstanding frame by async_context\nvoid cyw43_cb_process_ethernet(void *cb_data, int itf, size_t len,\n                               const uint8_t *buf) {\n  if (itf != CYW43_ITF_STA) return;\n  mg_tcpip_qwrite((void *) buf, len, s_ifp);\n  (void) cb_data;\n}\n\n// Called by async_context\nvoid cyw43_cb_tcpip_set_link_up(cyw43_t *self, int itf) {}\nvoid cyw43_cb_tcpip_set_link_down(cyw43_t *self, int itf) {}\n\n// there's life beyond lwIP\nvoid pbuf_copy_partial(void) {(void) 0;}\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/ppp.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_PPP) && MG_ENABLE_DRIVER_PPP\n\n#define MG_PPP_FLAG 0x7e  // PPP frame delimiter\n#define MG_PPP_ESC 0x7d   // PPP escape byte for special characters\n#define MG_PPP_ADDR 0xff\n#define MG_PPP_CTRL 0x03\n\n#define MG_PPP_PROTO_IP 0x0021\n#define MG_PPP_PROTO_LCP 0xc021\n#define MG_PPP_PROTO_IPCP 0x8021\n\n#define MG_PPP_IPCP_REQ 1\n#define MG_PPP_IPCP_ACK 2\n#define MG_PPP_IPCP_NACK 3\n#define MG_PPP_IPCP_IPADDR 3\n\n#define MG_PPP_LCP_CFG_REQ 1\n#define MG_PPP_LCP_CFG_ACK 2\n#define MG_PPP_LCP_CFG_NACK 3\n#define MG_PPP_LCP_CFG_REJECT 4\n#define MG_PPP_LCP_CFG_TERM_REQ 5\n#define MG_PPP_LCP_CFG_TERM_ACK 6\n\n#define MG_PPP_AT_TIMEOUT 2000\n\nstatic size_t print_atcmd(void (*out)(char, void *), void *arg, va_list *ap) {\n  struct mg_str s = va_arg(*ap, struct mg_str);\n  for (size_t i = 0; i < s.len; i++) out(s.buf[i] < 0x20 ? '.' : s.buf[i], arg);\n  return s.len;\n}\n\nstatic void mg_ppp_reset(struct mg_tcpip_driver_ppp_data *dd) {\n  dd->script_index = 0;\n  dd->deadline = 0;\n  if (dd->reset) dd->reset(dd->uart);\n}\n\nstatic bool mg_ppp_atcmd_handle(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_ppp_data *dd =\n      (struct mg_tcpip_driver_ppp_data *) ifp->driver_data;\n  if (dd->script == NULL || dd->script_index < 0) return true;\n  if (dd->deadline == 0) dd->deadline = mg_millis() + MG_PPP_AT_TIMEOUT;\n  for (;;) {\n    if (dd->script_index % 2 == 0) {  // send AT command\n      const char *cmd = dd->script[dd->script_index];\n      MG_DEBUG((\"send AT[%d]: %M\", dd->script_index, print_atcmd, mg_str(cmd)));\n      while (*cmd) dd->tx(dd->uart, *cmd++);\n      dd->script_index++;\n      ifp->recv_queue.head = 0;\n    } else {  // check AT command response\n      const char *expect = dd->script[dd->script_index];\n      struct mg_queue *q = &ifp->recv_queue;\n      for (;;) {\n        int c;\n        int is_timeout = dd->deadline > 0 && mg_millis() > dd->deadline;\n        int is_overflow = q->head >= q->size - 1;\n        if (is_timeout || is_overflow) {\n          MG_ERROR((\"AT error: %s, retrying...\",\n                    is_timeout ? \"timeout\" : \"overflow\"));\n          mg_ppp_reset(dd);\n          return false;  // FAIL: timeout\n        }\n        if ((c = dd->rx(dd->uart)) < 0) return false;  // no data\n        q->buf[q->head++] = c;\n        if (mg_match(mg_str_n(q->buf, q->head), mg_str(expect), NULL)) {\n          MG_DEBUG((\"recv AT[%d]: %M\", dd->script_index, print_atcmd,\n                    mg_str_n(q->buf, q->head)));\n          dd->script_index++;\n          q->head = 0;\n          break;\n        }\n      }\n    }\n    if (dd->script[dd->script_index] == NULL) {\n      MG_DEBUG((\"finished AT script\"));\n      dd->script_index = -1;\n      return true;\n    }\n  }\n}\n\nstatic bool mg_ppp_init(struct mg_tcpip_if *ifp) {\n  ifp->recv_queue.size = 3000;  // MTU=1500, worst case escaping = 2x\n  return true;\n}\n\n// Calculate FCS/CRC for PPP frames. Could be implemented faster using lookup\n// tables.\nstatic uint32_t fcs_do(uint32_t fcs, uint8_t x) {\n  for (int i = 0; i < 8; i++) {\n    fcs = ((fcs ^ x) & 1) ? (fcs >> 1) ^ 0x8408 : fcs >> 1;\n    x >>= 1;\n  }\n  return fcs;\n}\n\nstatic bool mg_ppp_up(struct mg_tcpip_if *ifp) {\n  return ifp->driver_data != NULL;\n}\n\n// Transmit a single byte as part of the PPP frame (escaped, if needed)\nstatic void mg_ppp_tx_byte(struct mg_tcpip_driver_ppp_data *dd, uint8_t b) {\n  if ((b < 0x20) || (b == MG_PPP_ESC) || (b == MG_PPP_FLAG)) {\n    dd->tx(dd->uart, MG_PPP_ESC);\n    dd->tx(dd->uart, b ^ 0x20);\n  } else {\n    dd->tx(dd->uart, b);\n  }\n}\n\n// Transmit a single PPP frame for the given protocol\nstatic void mg_ppp_tx_frame(struct mg_tcpip_driver_ppp_data *dd, uint16_t proto,\n                            uint8_t *data, size_t datasz) {\n  uint16_t crc;\n  uint32_t fcs = 0xffff;\n\n  dd->tx(dd->uart, MG_PPP_FLAG);\n  mg_ppp_tx_byte(dd, MG_PPP_ADDR);\n  mg_ppp_tx_byte(dd, MG_PPP_CTRL);\n  mg_ppp_tx_byte(dd, proto >> 8);\n  mg_ppp_tx_byte(dd, proto & 0xff);\n  fcs = fcs_do(fcs, MG_PPP_ADDR);\n  fcs = fcs_do(fcs, MG_PPP_CTRL);\n  fcs = fcs_do(fcs, proto >> 8);\n  fcs = fcs_do(fcs, proto & 0xff);\n  for (unsigned int i = 0; i < datasz; i++) {\n    mg_ppp_tx_byte(dd, data[i]);\n    fcs = fcs_do(fcs, data[i]);\n  }\n  crc = fcs & 0xffff;\n  mg_ppp_tx_byte(dd, ~crc);  // send CRC, note the byte order\n  mg_ppp_tx_byte(dd, ~crc >> 8);\n  dd->tx(dd->uart, MG_PPP_FLAG);  // end of frame\n}\n\n// Send Ethernet frame as PPP frame\nstatic size_t mg_ppp_tx(const void *buf, size_t len, struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_ppp_data *dd =\n      (struct mg_tcpip_driver_ppp_data *) ifp->driver_data;\n  if (ifp->state != MG_TCPIP_STATE_READY) return 0;\n  // XXX: what if not an IP protocol?\n  mg_ppp_tx_frame(dd, MG_PPP_PROTO_IP, (uint8_t *) buf + 14, len - 14);\n  return len;\n}\n\n// Given a full PPP frame, unescape it in place and verify FCS, returns actual\n// data size on success or 0 on error.\nstatic size_t mg_ppp_verify_frame(uint8_t *buf, size_t bufsz) {\n  int unpack = 0;\n  uint16_t crc;\n  size_t pktsz = 0;\n  uint32_t fcs = 0xffff;\n  for (unsigned int i = 0; i < bufsz; i++) {\n    if (unpack == 0) {\n      if (buf[i] == 0x7d) {\n        unpack = 1;\n      } else {\n        buf[pktsz] = buf[i];\n        fcs = fcs_do(fcs, buf[pktsz]);\n        pktsz++;\n      }\n    } else {\n      unpack = 0;\n      buf[pktsz] = buf[i] ^ 0x20;\n      fcs = fcs_do(fcs, buf[pktsz]);\n      pktsz++;\n    }\n  }\n  crc = fcs & 0xffff;\n  if (crc != 0xf0b8) {\n    MG_DEBUG((\"bad crc: %04x\", crc));\n    return 0;\n  }\n  if (pktsz < 6 || buf[0] != MG_PPP_ADDR || buf[1] != MG_PPP_CTRL) {\n    return 0;\n  }\n  return pktsz - 2;  // strip FCS\n}\n\n// fetch as much data as we can, until a single PPP frame is received\nstatic size_t mg_ppp_rx_frame(struct mg_tcpip_driver_ppp_data *dd,\n                              struct mg_queue *q) {\n  while (q->head < q->size) {\n    int c;\n    if ((c = dd->rx(dd->uart)) < 0) {\n      return 0;\n    }\n    if (c == MG_PPP_FLAG) {\n      if (q->head > 0) {\n        break;\n      } else {\n        continue;\n      }\n    }\n    q->buf[q->head++] = c;\n  }\n\n  size_t n = mg_ppp_verify_frame((uint8_t *) q->buf, q->head);\n  if (n == 0) {\n    MG_DEBUG((\"invalid PPP frame of %d bytes\", q->head));\n    q->head = 0;\n    return 0;\n  }\n  q->head = n;\n  return q->head;\n}\n\nstatic void mg_ppp_handle_lcp(struct mg_tcpip_if *ifp, uint8_t *lcp,\n                              size_t lcpsz) {\n  uint8_t id;\n  uint16_t len;\n  struct mg_tcpip_driver_ppp_data *dd =\n      (struct mg_tcpip_driver_ppp_data *) ifp->driver_data;\n  if (lcpsz < 4) return;\n  id = lcp[1];\n  len = (((uint16_t) lcp[2]) << 8) | (lcp[3]);\n  switch (lcp[0]) {\n    case MG_PPP_LCP_CFG_REQ: {\n      if (len == 4) {\n        MG_DEBUG((\"LCP config request of %d bytes, acknowledging...\", len));\n        lcp[0] = MG_PPP_LCP_CFG_ACK;\n        mg_ppp_tx_frame(dd, MG_PPP_PROTO_LCP, lcp, len);\n        lcp[0] = MG_PPP_LCP_CFG_REQ;\n        mg_ppp_tx_frame(dd, MG_PPP_PROTO_LCP, lcp, len);\n      } else {\n        MG_DEBUG((\"LCP config request of %d bytes, rejecting...\", len));\n        lcp[0] = MG_PPP_LCP_CFG_REJECT;\n        mg_ppp_tx_frame(dd, MG_PPP_PROTO_LCP, lcp, len);\n      }\n    } break;\n    case MG_PPP_LCP_CFG_TERM_REQ: {\n      uint8_t ack[4] = {MG_PPP_LCP_CFG_TERM_ACK, id, 0, 4};\n      MG_DEBUG((\"LCP termination request, acknowledging...\"));\n      mg_ppp_tx_frame(dd, MG_PPP_PROTO_LCP, ack, sizeof(ack));\n      mg_ppp_reset(dd);\n      ifp->state = MG_TCPIP_STATE_UP;\n      if (dd->reset) dd->reset(dd->uart);\n    } break;\n  }\n}\n\nstatic void mg_ppp_handle_ipcp(struct mg_tcpip_if *ifp, uint8_t *ipcp,\n                               size_t ipcpsz) {\n  struct mg_tcpip_driver_ppp_data *dd =\n      (struct mg_tcpip_driver_ppp_data *) ifp->driver_data;\n  uint16_t len;\n  uint8_t id;\n  uint8_t req[] = {\n      MG_PPP_IPCP_REQ, 0, 0, 10, MG_PPP_IPCP_IPADDR, 6, 0, 0, 0, 0};\n  if (ipcpsz < 4) return;\n  id = ipcp[1];\n  len = (((uint16_t) ipcp[2]) << 8) | (ipcp[3]);\n  switch (ipcp[0]) {\n    case MG_PPP_IPCP_REQ:\n      MG_DEBUG((\"got IPCP config request, acknowledging...\"));\n      if (len >= 10 && ipcp[4] == MG_PPP_IPCP_IPADDR) {\n        uint8_t *ip = ipcp + 6;\n        MG_DEBUG((\"host ip: %d.%d.%d.%d\", ip[0], ip[1], ip[2], ip[3]));\n      }\n      ipcp[0] = MG_PPP_IPCP_ACK;\n      mg_ppp_tx_frame(dd, MG_PPP_PROTO_IPCP, ipcp, len);\n      req[1] = id;\n      // Request IP address 0.0.0.0\n      mg_ppp_tx_frame(dd, MG_PPP_PROTO_IPCP, req, sizeof(req));\n      break;\n    case MG_PPP_IPCP_ACK:\n      // This usually does not happen, as our \"preferred\" IP address is invalid\n      MG_DEBUG((\"got IPCP config ack, link is online now\"));\n      ifp->state = MG_TCPIP_STATE_READY;\n      break;\n    case MG_PPP_IPCP_NACK:\n      MG_DEBUG((\"got IPCP config nack\"));\n      // NACK contains our \"suggested\" IP address, use it\n      if (len >= 10 && ipcp[4] == MG_PPP_IPCP_IPADDR) {\n        uint8_t *ip = ipcp + 6;\n        MG_DEBUG((\"ipcp ack, ip: %d.%d.%d.%d\", ip[0], ip[1], ip[2], ip[3]));\n        ipcp[0] = MG_PPP_IPCP_REQ;\n        mg_ppp_tx_frame(dd, MG_PPP_PROTO_IPCP, ipcp, len);\n        ifp->ip = ifp->mask = MG_IPV4(ip[0], ip[1], ip[2], ip[3]);\n        ifp->state = MG_TCPIP_STATE_READY;\n      }\n      break;\n  }\n}\n\nstatic size_t mg_ppp_rx(void *ethbuf, size_t ethlen, struct mg_tcpip_if *ifp) {\n  uint8_t *eth = ethbuf;\n  size_t ethsz = 0;\n  struct mg_tcpip_driver_ppp_data *dd =\n      (struct mg_tcpip_driver_ppp_data *) ifp->driver_data;\n  uint8_t *buf = (uint8_t *) ifp->recv_queue.buf;\n\n  if (!mg_ppp_atcmd_handle(ifp)) return 0;\n\n  size_t bufsz = mg_ppp_rx_frame(dd, &ifp->recv_queue);\n  if (!bufsz) return 0;\n  uint16_t proto = (((uint16_t) buf[2]) << 8) | (uint16_t) buf[3];\n  switch (proto) {\n    case MG_PPP_PROTO_LCP: mg_ppp_handle_lcp(ifp, buf + 4, bufsz - 4); break;\n    case MG_PPP_PROTO_IPCP: mg_ppp_handle_ipcp(ifp, buf + 4, bufsz - 4); break;\n    case MG_PPP_PROTO_IP:\n      MG_VERBOSE((\"got IP packet of %d bytes\", bufsz - 4));\n      memmove(eth + 14, buf + 4, bufsz - 4);\n      memmove(eth, ifp->mac, 6);\n      memmove(eth + 6, \"\\xff\\xff\\xff\\xff\\xff\\xff\", 6);\n      eth[12] = 0x08;\n      eth[13] = 0x00;\n      ethsz = bufsz - 4 + 14;\n      ifp->recv_queue.head = 0;\n      return ethsz;\n#if 0\n    default:\n      MG_DEBUG((\"unknown PPP frame:\"));\n      mg_hexdump(ppp->buf, ppp->bufsz);\n#endif\n  }\n  ifp->recv_queue.head = 0;\n  return 0;\n  (void) ethlen;\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_ppp = {mg_ppp_init, mg_ppp_tx, mg_ppp_rx,\n                                              mg_ppp_up};\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/ra.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_RA) && MG_ENABLE_DRIVER_RA\nstruct ra_etherc {\n  volatile uint32_t ECMR, RESERVED, RFLR, RESERVED1, ECSR, RESERVED2, ECSIPR,\n      RESERVED3, PIR, RESERVED4, PSR, RESERVED5[5], RDMLR, RESERVED6[3], IPGR,\n      APR, MPR, RESERVED7, RFCF, TPAUSER, TPAUSECR, BCFRR, RESERVED8[20], MAHR,\n      RESERVED9, MALR, RESERVED10, TROCR, CDCR, LCCR, CNDCR, RESERVED11, CEFCR,\n      FRECR, TSFRCR, TLFRCR, RFCR, MAFCR;\n};\n\nstruct ra_edmac {\n  volatile uint32_t EDMR, RESERVED, EDTRR, RESERVED1, EDRRR, RESERVED2, TDLAR,\n      RESERVED3, RDLAR, RESERVED4, EESR, RESERVED5, EESIPR, RESERVED6, TRSCER,\n      RESERVED7, RMFCR, RESERVED8, TFTR, RESERVED9, FDR, RESERVED10, RMCR,\n      RESERVED11[2], TFUCR, RFOCR, IOSR, FCFTR, RESERVED12, RPADIR, TRIMD,\n      RESERVED13[18], RBWAR, RDFAR, RESERVED14, TBRAR, TDFAR;\n};\n\n#undef ETHERC\n#define ETHERC ((struct ra_etherc *) (uintptr_t) 0x40114100U)\n#undef EDMAC\n#define EDMAC ((struct ra_edmac *) (uintptr_t) 0x40114000U)\n#undef RASYSC\n#define RASYSC ((uint32_t *) (uintptr_t) 0x4001E000U)\n#undef ICU_IELSR\n#define ICU_IELSR ((uint32_t *) (uintptr_t) 0x40006300U)\n\n#define ETH_PKT_SIZE 1536  // Max frame size, multiple of 32\n#define ETH_DESC_CNT 4     // Descriptors count\n\n// TODO(): handle these in a portable compiler-independent CMSIS-friendly way\n#define MG_16BYTE_ALIGNED __attribute__((aligned((16U))))\n#define MG_32BYTE_ALIGNED __attribute__((aligned((32U))))\n\n// Descriptors: 16-byte aligned\n// Buffers: 32-byte aligned (27.3.1)\nstatic volatile uint32_t s_rxdesc[ETH_DESC_CNT][4] MG_16BYTE_ALIGNED;\nstatic volatile uint32_t s_txdesc[ETH_DESC_CNT][4] MG_16BYTE_ALIGNED;\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_32BYTE_ALIGNED;\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE] MG_32BYTE_ALIGNED;\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\n\n// fastest is 3 cycles (SUB + BNE) on a 3-stage pipeline or equivalent\nstatic inline void raspin(volatile uint32_t count) {\n  while (count--) (void) 0;\n}\n// count to get the 200ns SMC semi-cycle period (2.5MHz) calling raspin():\n// SYS_FREQUENCY * 200ns / 3 = SYS_FREQUENCY / 15000000\nstatic uint32_t s_smispin;\n\n// Bit-banged SMI\nstatic void smi_preamble(void) {\n  unsigned int i = 32;\n  uint32_t pir = MG_BIT(1) | MG_BIT(2);  // write, mdio = 1, mdc = 0\n  ETHERC->PIR = pir;\n  while (i--) {\n    pir &= ~MG_BIT(0);  // mdc = 0\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n    pir |= MG_BIT(0);  // mdc = 1\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n  }\n}\nstatic void smi_wr(uint16_t header, uint16_t data) {\n  uint32_t word = (header << 16) | data;\n  smi_preamble();\n  unsigned int i = 32;\n  while (i--) {\n    uint32_t pir = MG_BIT(1) |\n                   (word & 0x80000000 ? MG_BIT(2) : 0);  // write, mdc = 0, data\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n    pir |= MG_BIT(0);  // mdc = 1\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n    word <<= 1;\n  }\n}\nstatic uint16_t smi_rd(uint16_t header) {\n  smi_preamble();\n  unsigned int i = 16;  // 2 LSb as turnaround\n  uint32_t pir;\n  while (i--) {\n    pir = (i > 1 ? MG_BIT(1) : 0) |\n          (header & 0x8000\n               ? MG_BIT(2)\n               : 0);  // mdc = 0, header, set read direction at turnaround\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n    pir |= MG_BIT(0);  // mdc = 1\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n    header <<= 1;\n  }\n  i = 16;\n  uint16_t data = 0;\n  while (i--) {\n    data <<= 1;\n    pir = 0;  // read, mdc = 0\n    ETHERC->PIR = pir;\n    raspin(s_smispin / 2);  // 1/4 clock period, 300ns max access time\n    data |= (uint16_t)(ETHERC->PIR & MG_BIT(3) ? 1 : 0);  // read mdio\n    raspin(s_smispin / 2);                    // 1/4 clock period\n    pir |= MG_BIT(0);                         // mdc = 1\n    ETHERC->PIR = pir;\n    raspin(s_smispin);\n  }\n  return data;\n}\n\nstatic uint16_t raeth_read_phy(uint8_t addr, uint8_t reg) {\n  return smi_rd((uint16_t)((1 << 14) | (2 << 12) | (addr << 7) | (reg << 2) | (2 << 0)));\n}\n\nstatic void raeth_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  smi_wr((uint16_t)((1 << 14) | (1 << 12) | (addr << 7) | (reg << 2) | (2 << 0)), val);\n}\n\n// MDC clock is generated manually; as per 802.3, it must not exceed 2.5MHz\nstatic bool mg_tcpip_driver_ra_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_ra_data *d =\n      (struct mg_tcpip_driver_ra_data *) ifp->driver_data;\n  s_ifp = ifp;\n\n  // Init SMI clock timing. If user told us the clock value, use it.\n  // TODO(): Otherwise, guess\n  s_smispin = d->clock / 15000000;\n\n  // Init RX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i][0] = MG_BIT(31);             // RACT\n    s_rxdesc[i][1] = ETH_PKT_SIZE << 16;     // RBL\n    s_rxdesc[i][2] = (uint32_t) s_rxbuf[i];  // Point to data buffer\n  }\n  s_rxdesc[ETH_DESC_CNT - 1][0] |= MG_BIT(30);  // Wrap last descriptor\n\n  // Init TX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    // TACT = 0\n    s_txdesc[i][2] = (uint32_t) s_txbuf[i];\n  }\n  s_txdesc[ETH_DESC_CNT - 1][0] |= MG_BIT(30);  // Wrap last descriptor\n\n  EDMAC->EDMR = MG_BIT(0);  // Software reset, wait 64 PCLKA clocks (27.2.1)\n  uint32_t sckdivcr = RASYSC[8];  // get divisors from SCKDIVCR (8.2.2)\n  uint32_t ick = 1 << ((sckdivcr >> 24) & 7);   // sys_clock div\n  uint32_t pcka = 1 << ((sckdivcr >> 12) & 7);  // pclka div\n  raspin((64U * pcka) / (3U * ick));\n  EDMAC->EDMR = MG_BIT(6);  // Initialize, little-endian (27.2.1)\n\n  MG_DEBUG((\"PHY addr: %d, smispin: %d\", d->phy_addr, s_smispin));\n  struct mg_phy phy = {raeth_read_phy, raeth_write_phy};\n  mg_phy_init(&phy, d->phy_addr, 0); // MAC clocks PHY\n\n  // Select RMII mode,\n  ETHERC->ECMR = MG_BIT(2) | MG_BIT(1);  // 100M, Full-duplex, CRC\n  // ETHERC->ECMR |= MG_BIT(0);             // Receive all\n  ETHERC->RFLR = 1518;  // Set max rx length\n\n  EDMAC->RDLAR = (uint32_t) (uintptr_t) s_rxdesc;\n  EDMAC->TDLAR = (uint32_t) (uintptr_t) s_txdesc;\n  // MAC address filtering (bytes in reversed order)\n  ETHERC->MAHR = (uint32_t) (ifp->mac[0] << 24U) |\n                 ((uint32_t) ifp->mac[1] << 16U) |\n                 ((uint32_t) ifp->mac[2] << 8U) | ifp->mac[3];\n  ETHERC->MALR = ((uint32_t) ifp->mac[4] << 8U) | ifp->mac[5];\n\n  EDMAC->TFTR = 0;                        // Store and forward (27.2.10)\n  EDMAC->FDR = 0x070f;                    // (27.2.11)\n  EDMAC->RMCR = MG_BIT(0);                // (27.2.12)\n  ETHERC->ECMR |= MG_BIT(6) | MG_BIT(5);  // TE RE\n  EDMAC->EESIPR = MG_BIT(18);             // Enable Rx IRQ\n  EDMAC->EDRRR = MG_BIT(0);               // Receive Descriptors have changed\n  EDMAC->EDTRR = MG_BIT(0);               // Transmit Descriptors have changed\n  return true;\n}\n\n// Transmit frame\nstatic size_t mg_tcpip_driver_ra_tx(const void *buf, size_t len,\n                                    struct mg_tcpip_if *ifp) {\n  static int s_txno;  // Current descriptor index\n  if (len > sizeof(s_txbuf[ETH_DESC_CNT])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = (size_t) -1;  // fail\n  } else if ((s_txdesc[s_txno][0] & MG_BIT(31))) {\n    ifp->nerr++;\n    MG_ERROR((\"No descriptors available\"));\n    len = 0;  // retry later\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);            // Copy data\n    s_txdesc[s_txno][1] = len << 16;              // Set data len\n    s_txdesc[s_txno][0] |= MG_BIT(31) | 3 << 28;  // (27.3.1.1) mark valid\n    EDMAC->EDTRR = MG_BIT(0);                     // Transmit request\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n  return len;\n}\n\nstatic bool mg_tcpip_driver_ra_up(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_ra_data *d =\n      (struct mg_tcpip_driver_ra_data *) ifp->driver_data;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {raeth_read_phy, raeth_write_phy};\n  up = mg_phy_up(&phy, d->phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    // tmp = reg with flags set to the most likely situation: 100M full-duplex\n    // if(link is slow or half) set flags otherwise\n    // reg = tmp\n    uint32_t ecmr = ETHERC->ECMR | MG_BIT(2) | MG_BIT(1);  // 100M Full-duplex\n    if (speed == MG_PHY_SPEED_10M) ecmr &= ~MG_BIT(2);     // 10M\n    if (full_duplex == false) ecmr &= ~MG_BIT(1);          // Half-duplex\n    ETHERC->ECMR = ecmr;  // IRQ handler does not fiddle with these registers\n    MG_DEBUG((\"Link is %uM %s-duplex\", ecmr & MG_BIT(2) ? 100 : 10,\n              ecmr & MG_BIT(1) ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\nvoid EDMAC_IRQHandler(void);\nstatic uint32_t s_rxno;\nvoid EDMAC_IRQHandler(void) {\n  struct mg_tcpip_driver_ra_data *d =\n      (struct mg_tcpip_driver_ra_data *) s_ifp->driver_data;\n  EDMAC->EESR = MG_BIT(18);            // Ack IRQ in EDMAC 1st\n  ICU_IELSR[d->irqno] &= ~MG_BIT(16);  // Ack IRQ in ICU last\n  // Frame received, loop\n  for (uint32_t i = 0; i < 10; i++) {  // read as they arrive but not forever\n    uint32_t r = s_rxdesc[s_rxno][0];\n    if (r & MG_BIT(31)) break;  // exit when done\n    // skip partial/errored frames (27.3.1.2)\n    if ((r & (MG_BIT(29) | MG_BIT(28)) && !(r & MG_BIT(27)))) {\n      size_t len = s_rxdesc[s_rxno][1] & 0xffff;\n      mg_tcpip_qwrite(s_rxbuf[s_rxno], len, s_ifp);  // CRC already stripped\n    }\n    s_rxdesc[s_rxno][0] |= MG_BIT(31);\n    if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n  }\n  EDMAC->EDRRR = MG_BIT(0);  // Receive Descriptors have changed\n  // If b0 == 0, descriptors were exhausted and probably frames were dropped,\n  // (27.2.9 RMFCR counts them)\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_ra = {mg_tcpip_driver_ra_init,\n                                             mg_tcpip_driver_ra_tx, NULL,\n                                             mg_tcpip_driver_ra_up};\n\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/same54.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_SAME54) && MG_ENABLE_DRIVER_SAME54\n\n#include <sam.h>\n\n#define ETH_PKT_SIZE 1536  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 2           // Descriptor size (words)\n\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE];\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE];\nstatic uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS];  // RX descriptors\nstatic uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS];  // TX descriptors\nstatic uint8_t s_txno;                           // Current TX descriptor\nstatic uint8_t s_rxno;                           // Current RX descriptor\n\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\nenum { MG_PHY_ADDR = 0, MG_PHYREG_BCR = 0, MG_PHYREG_BSR = 1 };\n\n#define MG_PHYREGBIT_BCR_DUPLEX_MODE MG_BIT(8)\n#define MG_PHYREGBIT_BCR_SPEED MG_BIT(13)\n#define MG_PHYREGBIT_BSR_LINK_STATUS MG_BIT(2)\n\nstatic uint16_t eth_read_phy(uint8_t addr, uint8_t reg) {\n  GMAC_REGS->GMAC_MAN = GMAC_MAN_CLTTO_Msk |\n                        GMAC_MAN_OP(2) |  // Setting the read operation\n                        GMAC_MAN_WTN(2) | GMAC_MAN_PHYA(addr) |  // PHY address\n                        GMAC_MAN_REGA(reg);  // Setting the register\n  while (!(GMAC_REGS->GMAC_NSR & GMAC_NSR_IDLE_Msk)) (void) 0;\n  return GMAC_REGS->GMAC_MAN & GMAC_MAN_DATA_Msk;  // Getting the read value\n}\n\n#if 0\nstatic void eth_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  GMAC_REGS->GMAC_MAN = GMAC_MAN_CLTTO_Msk | GMAC_MAN_OP(1) |   // Setting the write operation\n                        GMAC_MAN_WTN(2) | GMAC_MAN_PHYA(addr) | // PHY address\n                        GMAC_MAN_REGA(reg) | GMAC_MAN_DATA(val);  // Setting the register\n  while (!(GMAC_REGS->GMAC_NSR & GMAC_NSR_IDLE_Msk)); // Waiting until the write op is complete\n}\n#endif\n\nint get_clock_rate(struct mg_tcpip_driver_same54_data *d) {\n  if (d && d->mdc_cr >= 0 && d->mdc_cr <= 5) {\n    return d->mdc_cr;\n  } else {\n    // get MCLK from GCLK_GENERATOR 0\n    uint32_t div = 512;\n    uint32_t mclk;\n    if (!(GCLK_REGS->GCLK_GENCTRL[0] & GCLK_GENCTRL_DIVSEL_Msk)) {\n      div = ((GCLK_REGS->GCLK_GENCTRL[0] & 0x00FF0000) >> 16);\n      if (div == 0) div = 1;\n    }\n    switch (GCLK_REGS->GCLK_GENCTRL[0] & GCLK_GENCTRL_SRC_Msk) {\n      case GCLK_GENCTRL_SRC_XOSC0_Val:\n        mclk = 32000000UL; /* 32MHz */\n        break;\n      case GCLK_GENCTRL_SRC_XOSC1_Val:\n        mclk = 32000000UL; /* 32MHz */\n        break;\n      case GCLK_GENCTRL_SRC_OSCULP32K_Val:\n        mclk = 32000UL;\n        break;\n      case GCLK_GENCTRL_SRC_XOSC32K_Val:\n        mclk = 32000UL;\n        break;\n      case GCLK_GENCTRL_SRC_DFLL_Val:\n        mclk = 48000000UL; /* 48MHz */\n        break;\n      case GCLK_GENCTRL_SRC_DPLL0_Val:\n        mclk = 200000000UL; /* 200MHz */\n        break;\n      case GCLK_GENCTRL_SRC_DPLL1_Val:\n        mclk = 200000000UL; /* 200MHz */\n        break;\n      default:\n        mclk = 200000000UL; /* 200MHz */\n    }\n\n    mclk /= div;\n    uint8_t crs[] = {0, 1, 2, 3, 4, 5};            // GMAC->NCFGR::CLK values\n    uint8_t dividers[] = {8, 16, 32, 48, 64, 96};  // Respective CLK dividers\n    for (int i = 0; i < 6; i++) {\n      if (mclk / dividers[i] <= 2375000UL /* 2.5MHz - 5% */) {\n        return crs[i];\n      }\n    }\n\n    return 5;\n  }\n}\n\nstatic bool mg_tcpip_driver_same54_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_same54_data *d =\n      (struct mg_tcpip_driver_same54_data *) ifp->driver_data;\n  s_ifp = ifp;\n\n  MCLK_REGS->MCLK_APBCMASK |= MCLK_APBCMASK_GMAC_Msk;\n  MCLK_REGS->MCLK_AHBMASK |= MCLK_AHBMASK_GMAC_Msk;\n  GMAC_REGS->GMAC_NCFGR = GMAC_NCFGR_CLK(get_clock_rate(d));  // Set MDC divider\n  GMAC_REGS->GMAC_NCR = 0;                                    // Disable RX & TX\n  GMAC_REGS->GMAC_NCR |= GMAC_NCR_MPE_Msk;  // Enable MDC & MDIO\n\n  for (int i = 0; i < ETH_DESC_CNT; i++) {   // Init TX descriptors\n    s_txdesc[i][0] = (uint32_t) s_txbuf[i];  // Point to data buffer\n    s_txdesc[i][1] = MG_BIT(31);             // OWN bit\n  }\n  s_txdesc[ETH_DESC_CNT - 1][1] |= MG_BIT(30);  // Last tx descriptor - wrap\n\n  GMAC_REGS->GMAC_DCFGR = GMAC_DCFGR_DRBS(0x18)  // DMA recv buf 1536\n                          | GMAC_DCFGR_RXBMS(GMAC_DCFGR_RXBMS_FULL_Val) |\n                          GMAC_DCFGR_TXPBMS(1);  // See #2487\n  for (int i = 0; i < ETH_DESC_CNT; i++) {       // Init RX descriptors\n    s_rxdesc[i][0] = (uint32_t) s_rxbuf[i];      // Address of the data buffer\n    s_rxdesc[i][1] = 0;                          // Clear status\n  }\n  s_rxdesc[ETH_DESC_CNT - 1][0] |= MG_BIT(1);  // Last rx descriptor - wrap\n\n  GMAC_REGS->GMAC_TBQB = (uint32_t) s_txdesc;  // about the descriptor addresses\n  GMAC_REGS->GMAC_RBQB = (uint32_t) s_rxdesc;  // Let the controller know\n\n  GMAC_REGS->SA[0].GMAC_SAB =\n      MG_U32(ifp->mac[3], ifp->mac[2], ifp->mac[1], ifp->mac[0]);\n  GMAC_REGS->SA[0].GMAC_SAT = MG_U32(0, 0, ifp->mac[5], ifp->mac[4]);\n\n  GMAC_REGS->GMAC_UR &= ~GMAC_UR_MII_Msk;  // Disable MII, use RMII\n  GMAC_REGS->GMAC_NCFGR |= GMAC_NCFGR_MAXFS_Msk | GMAC_NCFGR_MTIHEN_Msk |\n                           GMAC_NCFGR_EFRHD_Msk | GMAC_NCFGR_CAF_Msk;\n  GMAC_REGS->GMAC_TSR = GMAC_TSR_HRESP_Msk | GMAC_TSR_UND_Msk |\n                        GMAC_TSR_TXCOMP_Msk | GMAC_TSR_TFC_Msk |\n                        GMAC_TSR_TXGO_Msk | GMAC_TSR_RLE_Msk |\n                        GMAC_TSR_COL_Msk | GMAC_TSR_UBR_Msk;\n  GMAC_REGS->GMAC_RSR = GMAC_RSR_HNO_Msk | GMAC_RSR_RXOVR_Msk |\n                        GMAC_RSR_REC_Msk | GMAC_RSR_BNA_Msk;\n  GMAC_REGS->GMAC_IDR = ~0U;  // Disable interrupts, then enable required\n  GMAC_REGS->GMAC_IER = GMAC_IER_HRESP_Msk | GMAC_IER_ROVR_Msk |\n                        GMAC_IER_TCOMP_Msk | GMAC_IER_TFC_Msk |\n                        GMAC_IER_RLEX_Msk | GMAC_IER_TUR_Msk |\n                        GMAC_IER_RXUBR_Msk | GMAC_IER_RCOMP_Msk;\n  GMAC_REGS->GMAC_NCR |= GMAC_NCR_TXEN_Msk | GMAC_NCR_RXEN_Msk;\n  NVIC_EnableIRQ(GMAC_IRQn);\n\n  return true;\n}\n\nstatic size_t mg_tcpip_driver_same54_tx(const void *buf, size_t len,\n                                        struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // Frame is too big\n  } else if ((s_txdesc[s_txno][1] & MG_BIT(31)) == 0) {\n    ifp->nerr++;\n    MG_ERROR((\"No free descriptors\"));\n    len = 0;  // All descriptors are busy, fail\n  } else {\n    uint32_t status = len | MG_BIT(15);  // Frame length, last chunk\n    if (s_txno == ETH_DESC_CNT - 1) status |= MG_BIT(30);  // wrap\n    memcpy(s_txbuf[s_txno], buf, len);                     // Copy data\n    s_txdesc[s_txno][1] = status;\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n  __DSB();  // Ensure descriptors have been written\n  GMAC_REGS->GMAC_NCR |= GMAC_NCR_TSTART_Msk;  // Enable transmission\n  return len;\n}\n\nstatic bool mg_tcpip_driver_same54_up(struct mg_tcpip_if *ifp) {\n  uint16_t bsr = eth_read_phy(MG_PHY_ADDR, MG_PHYREG_BSR);\n  bool up = bsr & MG_PHYREGBIT_BSR_LINK_STATUS ? 1 : 0;\n\n  // If PHY is ready, update NCFGR accordingly\n  if (ifp->state == MG_TCPIP_STATE_DOWN && up) {\n    uint16_t bcr = eth_read_phy(MG_PHY_ADDR, MG_PHYREG_BCR);\n    bool fd = bcr & MG_PHYREGBIT_BCR_DUPLEX_MODE ? 1 : 0;\n    bool spd = bcr & MG_PHYREGBIT_BCR_SPEED ? 1 : 0;\n    GMAC_REGS->GMAC_NCFGR = (GMAC_REGS->GMAC_NCFGR &\n                             ~(GMAC_NCFGR_SPD_Msk | MG_PHYREGBIT_BCR_SPEED)) |\n                            GMAC_NCFGR_SPD(spd) | GMAC_NCFGR_FD(fd);\n  }\n\n  return up;\n}\n\nvoid GMAC_Handler(void);\nvoid GMAC_Handler(void) {\n  uint32_t isr = GMAC_REGS->GMAC_ISR;\n  uint32_t rsr = GMAC_REGS->GMAC_RSR;\n  uint32_t tsr = GMAC_REGS->GMAC_TSR;\n  if (isr & GMAC_ISR_RCOMP_Msk) {\n    if (rsr & GMAC_ISR_RCOMP_Msk) {\n      for (uint8_t i = 0; i < ETH_DESC_CNT; i++) {\n        if ((s_rxdesc[s_rxno][0] & MG_BIT(0)) == 0) break;\n        size_t len = s_rxdesc[s_rxno][1] & (MG_BIT(13) - 1);\n        mg_tcpip_qwrite(s_rxbuf[s_rxno], len, s_ifp);\n        s_rxdesc[s_rxno][0] &= ~MG_BIT(0);  // Disown\n        if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n      }\n    }\n  }\n\n  if ((tsr & (GMAC_TSR_HRESP_Msk | GMAC_TSR_UND_Msk | GMAC_TSR_TXCOMP_Msk |\n              GMAC_TSR_TFC_Msk | GMAC_TSR_TXGO_Msk | GMAC_TSR_RLE_Msk |\n              GMAC_TSR_COL_Msk | GMAC_TSR_UBR_Msk)) != 0) {\n    // MG_INFO((\" --> %#x %#x\", s_txdesc[s_txno][1], tsr));\n    if (!(s_txdesc[s_txno][1] & MG_BIT(31))) s_txdesc[s_txno][1] |= MG_BIT(31);\n  }\n\n  GMAC_REGS->GMAC_RSR = rsr;\n  GMAC_REGS->GMAC_TSR = tsr;\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_same54 = {\n    mg_tcpip_driver_same54_init, mg_tcpip_driver_same54_tx, NULL,\n    mg_tcpip_driver_same54_up};\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/stm32f.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_STM32F) && \\\n    MG_ENABLE_DRIVER_STM32F\nstruct stm32f_eth {\n  volatile uint32_t MACCR, MACFFR, MACHTHR, MACHTLR, MACMIIAR, MACMIIDR, MACFCR,\n      MACVLANTR, RESERVED0[2], MACRWUFFR, MACPMTCSR, RESERVED1, MACDBGR, MACSR,\n      MACIMR, MACA0HR, MACA0LR, MACA1HR, MACA1LR, MACA2HR, MACA2LR, MACA3HR,\n      MACA3LR, RESERVED2[40], MMCCR, MMCRIR, MMCTIR, MMCRIMR, MMCTIMR,\n      RESERVED3[14], MMCTGFSCCR, MMCTGFMSCCR, RESERVED4[5], MMCTGFCR,\n      RESERVED5[10], MMCRFCECR, MMCRFAECR, RESERVED6[10], MMCRGUFCR,\n      RESERVED7[334], PTPTSCR, PTPSSIR, PTPTSHR, PTPTSLR, PTPTSHUR, PTPTSLUR,\n      PTPTSAR, PTPTTHR, PTPTTLR, RESERVED8, PTPTSSR, PTPPPSCR, RESERVED9[564],\n      DMABMR, DMATPDR, DMARPDR, DMARDLAR, DMATDLAR, DMASR, DMAOMR, DMAIER,\n      DMAMFBOCR, DMARSWTR, RESERVED10[8], DMACHTDR, DMACHRDR, DMACHTBAR,\n      DMACHRBAR;\n};\n#undef ETH\n#define ETH ((struct stm32f_eth *) (uintptr_t) 0x40028000)\n\n#define ETH_PKT_SIZE 1540  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 4           // Descriptor size (words)\n\nstatic uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS];      // RX descriptors\nstatic uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS];      // TX descriptors\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE];  // RX ethernet buffers\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE];  // TX ethernet buffers\nstatic uint8_t s_txno;                               // Current TX descriptor\nstatic uint8_t s_rxno;                               // Current RX descriptor\n\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\n\nstatic uint16_t eth_read_phy(uint8_t addr, uint8_t reg) {\n  ETH->MACMIIAR &= (7 << 2);\n  ETH->MACMIIAR |= ((uint32_t) addr << 11) | ((uint32_t) reg << 6);\n  ETH->MACMIIAR |= MG_BIT(0);\n  while (ETH->MACMIIAR & MG_BIT(0)) (void) 0;\n  return ETH->MACMIIDR & 0xffff;\n}\n\nstatic void eth_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  ETH->MACMIIDR = val;\n  ETH->MACMIIAR &= (7 << 2);\n  ETH->MACMIIAR |= ((uint32_t) addr << 11) | ((uint32_t) reg << 6) | MG_BIT(1);\n  ETH->MACMIIAR |= MG_BIT(0);\n  while (ETH->MACMIIAR & MG_BIT(0)) (void) 0;\n}\n\nstatic uint32_t get_hclk(void) {\n  struct rcc {\n    volatile uint32_t CR, PLLCFGR, CFGR;\n  } *rcc = (struct rcc *) 0x40023800;\n  uint32_t clk = 0, hsi = 16000000 /* 16 MHz */, hse = 8000000 /* 8MHz */;\n\n  if (rcc->CFGR & (1 << 2)) {\n    clk = hse;\n  } else if (rcc->CFGR & (1 << 3)) {\n    uint32_t vco, m, n, p;\n    m = (rcc->PLLCFGR & (0x3f << 0)) >> 0;\n    n = (rcc->PLLCFGR & (0x1ff << 6)) >> 6;\n    p = (((rcc->PLLCFGR & (3 << 16)) >> 16) + 1) * 2;\n    clk = (rcc->PLLCFGR & (1 << 22)) ? hse : hsi;\n    vco = (uint32_t) ((uint64_t) clk * n / m);\n    clk = vco / p;\n  } else {\n    clk = hsi;\n  }\n  uint32_t hpre = (rcc->CFGR & (15 << 4)) >> 4;\n  if (hpre < 8) return clk;\n\n  uint8_t ahbptab[8] = {1, 2, 3, 4, 6, 7, 8, 9};  // log2(div)\n  return ((uint32_t) clk) >> ahbptab[hpre - 8];\n}\n\n//  Guess CR from HCLK. MDC clock is generated from HCLK (AHB); as per 802.3,\n//  it must not exceed 2.5MHz As the AHB clock can be (and usually is) derived\n//  from the HSI (internal RC), and it can go above specs, the datasheets\n//  specify a range of frequencies and activate one of a series of dividers to\n//  keep the MDC clock safely below 2.5MHz. We guess a divider setting based on\n//  HCLK with a +5% drift. If the user uses a different clock from our\n//  defaults, needs to set the macros on top Valid for STM32F74xxx/75xxx\n//  (38.8.1) and STM32F42xxx/43xxx (33.8.1) (both 4.5% worst case drift)\nstatic int guess_mdc_cr(void) {\n  uint8_t crs[] = {2, 3, 0, 1, 4, 5};          // ETH->MACMIIAR::CR values\n  uint8_t div[] = {16, 26, 42, 62, 102, 124};  // Respective HCLK dividers\n  uint32_t hclk = get_hclk();                  // Guess system HCLK\n  int result = -1;                             // Invalid CR value\n  if (hclk < 25000000) {\n    MG_ERROR((\"HCLK too low\"));\n  } else {\n    for (int i = 0; i < 6; i++) {\n      if (hclk / div[i] <= 2375000UL /* 2.5MHz - 5% */) {\n        result = crs[i];\n        break;\n      }\n    }\n    if (result < 0) MG_ERROR((\"HCLK too high\"));\n  }\n  MG_DEBUG((\"HCLK: %u, CR: %d\", hclk, result));\n  return result;\n}\n\nstatic bool mg_tcpip_driver_stm32f_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_stm32f_data *d =\n      (struct mg_tcpip_driver_stm32f_data *) ifp->driver_data;\n  uint8_t phy_addr = d == NULL ? 0 : d->phy_addr;\n  s_ifp = ifp;\n\n  // Init RX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i][0] = MG_BIT(31);                         // Own\n    s_rxdesc[i][1] = sizeof(s_rxbuf[i]) | MG_BIT(14);    // 2nd address chained\n    s_rxdesc[i][2] = (uint32_t) (uintptr_t) s_rxbuf[i];  // Point to data buffer\n    s_rxdesc[i][3] =\n        (uint32_t) (uintptr_t) s_rxdesc[(i + 1) % ETH_DESC_CNT];  // Chain\n  }\n\n  // Init TX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_txdesc[i][2] = (uint32_t) (uintptr_t) s_txbuf[i];  // Buf pointer\n    s_txdesc[i][3] =\n        (uint32_t) (uintptr_t) s_txdesc[(i + 1) % ETH_DESC_CNT];  // Chain\n  }\n\n  ETH->DMABMR |= MG_BIT(0);                         // Software reset\n  while ((ETH->DMABMR & MG_BIT(0)) != 0) (void) 0;  // Wait until done\n\n  // Set MDC clock divider. If user told us the value, use it. Otherwise, guess\n  int cr = (d == NULL || d->mdc_cr < 0) ? guess_mdc_cr() : d->mdc_cr;\n  ETH->MACMIIAR = ((uint32_t) cr & 7) << 2;\n\n  // NOTE(cpq): we do not use extended descriptor bit 7, and do not use\n  // hardware checksum. Therefore, descriptor size is 4, not 8\n  // ETH->DMABMR = MG_BIT(13) | MG_BIT(16) | MG_BIT(22) | MG_BIT(23) |\n  // MG_BIT(25);\n  ETH->MACIMR = MG_BIT(3) | MG_BIT(9);  // Mask timestamp & PMT IT\n  ETH->MACFCR = MG_BIT(7);              // Disable zero quarta pause\n  // ETH->MACFFR = MG_BIT(31);                            // Receive all\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  mg_phy_init(&phy, phy_addr, MG_PHY_CLOCKS_MAC);\n  ETH->DMARDLAR = (uint32_t) (uintptr_t) s_rxdesc;  // RX descriptors\n  ETH->DMATDLAR = (uint32_t) (uintptr_t) s_txdesc;  // RX descriptors\n  ETH->DMAIER = MG_BIT(6) | MG_BIT(16);             // RIE, NISE\n  ETH->MACCR =\n      MG_BIT(2) | MG_BIT(3) | MG_BIT(11) | MG_BIT(14);  // RE, TE, Duplex, Fast\n  ETH->DMAOMR =\n      MG_BIT(1) | MG_BIT(13) | MG_BIT(21) | MG_BIT(25);  // SR, ST, TSF, RSF\n\n  // MAC address filtering\n  ETH->MACA0HR = ((uint32_t) ifp->mac[5] << 8U) | ifp->mac[4];\n  ETH->MACA0LR = (uint32_t) (ifp->mac[3] << 24) |\n                 ((uint32_t) ifp->mac[2] << 16) |\n                 ((uint32_t) ifp->mac[1] << 8) | ifp->mac[0];\n  return true;\n}\n\nstatic size_t mg_tcpip_driver_stm32f_tx(const void *buf, size_t len,\n                                        struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // Frame is too big\n  } else if ((s_txdesc[s_txno][0] & MG_BIT(31))) {\n    ifp->nerr++;\n    MG_ERROR((\"No free descriptors\"));\n    // printf(\"D0 %lx SR %lx\\n\", (long) s_txdesc[0][0], (long) ETH->DMASR);\n    len = 0;  // All descriptors are busy, fail\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);                           // Copy data\n    s_txdesc[s_txno][1] = (uint32_t) len;                        // Set data len\n    s_txdesc[s_txno][0] = MG_BIT(20) | MG_BIT(28) | MG_BIT(29);  // Chain,FS,LS\n    s_txdesc[s_txno][0] |= MG_BIT(31);  // Set OWN bit - let DMA take over\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n  MG_DSB();                            // ensure descriptors have been written\n  ETH->DMASR = MG_BIT(2) | MG_BIT(5);  // Clear any prior TBUS/TUS\n  ETH->DMATPDR = 0;                    // and resume\n  return len;\n}\n\nstatic bool mg_tcpip_driver_stm32f_up(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_stm32f_data *d =\n      (struct mg_tcpip_driver_stm32f_data *) ifp->driver_data;\n  uint8_t phy_addr = d == NULL ? 0 : d->phy_addr;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  up = mg_phy_up(&phy, phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    // tmp = reg with flags set to the most likely situation: 100M full-duplex\n    // if(link is slow or half) set flags otherwise\n    // reg = tmp\n    uint32_t maccr = ETH->MACCR | MG_BIT(14) | MG_BIT(11);  // 100M, Full-duplex\n    if (speed == MG_PHY_SPEED_10M) maccr &= ~MG_BIT(14);    // 10M\n    if (full_duplex == false) maccr &= ~MG_BIT(11);         // Half-duplex\n    ETH->MACCR = maccr;  // IRQ handler does not fiddle with this register\n    MG_DEBUG((\"Link is %uM %s-duplex\", maccr & MG_BIT(14) ? 100 : 10,\n              maccr & MG_BIT(11) ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\n#ifdef __riscv\n__attribute__((interrupt()))  // For RISCV CH32V307, which share the same MAC\n#endif\nvoid ETH_IRQHandler(void);\nvoid ETH_IRQHandler(void) {\n  if (ETH->DMASR & MG_BIT(6)) {           // Frame received, loop\n    ETH->DMASR = MG_BIT(16) | MG_BIT(6);  // Clear flag\n    for (uint32_t i = 0; i < 10; i++) {   // read as they arrive but not forever\n      if (s_rxdesc[s_rxno][0] & MG_BIT(31)) break;  // exit when done\n      if (((s_rxdesc[s_rxno][0] & (MG_BIT(8) | MG_BIT(9))) ==\n           (MG_BIT(8) | MG_BIT(9))) &&\n          !(s_rxdesc[s_rxno][0] & MG_BIT(15))) {  // skip partial/errored frames\n        uint32_t len = ((s_rxdesc[s_rxno][0] >> 16) & (MG_BIT(14) - 1));\n        //  printf(\"%lx %lu %lx %.8lx\\n\", s_rxno, len, s_rxdesc[s_rxno][0],\n        //  ETH->DMASR);\n        mg_tcpip_qwrite(s_rxbuf[s_rxno], len > 4 ? len - 4 : len, s_ifp);\n      }\n      s_rxdesc[s_rxno][0] = MG_BIT(31);\n      if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n    }\n  }\n  // Cleanup flags\n  ETH->DMASR = MG_BIT(16)    // NIS, normal interrupt summary\n               | MG_BIT(7);  // Clear possible RBUS while processing\n  ETH->DMARPDR = 0;          // and resume RX\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_stm32f = {\n    mg_tcpip_driver_stm32f_init, mg_tcpip_driver_stm32f_tx, NULL,\n    mg_tcpip_driver_stm32f_up};\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/stm32h.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && (MG_ENABLE_DRIVER_STM32H || MG_ENABLE_DRIVER_MCXN)\n// STM32H: vendor modded single-queue Synopsys v4.2\n// MCXNx4x: dual-queue Synopsys v5.2\n// RT1170 ENET_QOS: quad-queue Synopsys v5.1\nstruct synopsys_enet_qos {\n  volatile uint32_t MACCR, MACECR, MACPFR, MACWTR, MACHT0R, MACHT1R,\n      RESERVED1[14], MACVTR, RESERVED2, MACVHTR, RESERVED3, MACVIR, MACIVIR,\n      RESERVED4[2], MACTFCR, RESERVED5[7], MACRFCR, RESERVED6[7], MACISR,\n      MACIER, MACRXTXSR, RESERVED7, MACPCSR, MACRWKPFR, RESERVED8[2], MACLCSR,\n      MACLTCR, MACLETR, MAC1USTCR, RESERVED9[12], MACVR, MACDR, RESERVED10,\n      MACHWF0R, MACHWF1R, MACHWF2R, RESERVED11[54], MACMDIOAR, MACMDIODR,\n      RESERVED12[2], MACARPAR, RESERVED13[59], MACA0HR, MACA0LR, MACA1HR,\n      MACA1LR, MACA2HR, MACA2LR, MACA3HR, MACA3LR, RESERVED14[248], MMCCR,\n      MMCRIR, MMCTIR, MMCRIMR, MMCTIMR, RESERVED15[14], MMCTSCGPR, MMCTMCGPR,\n      RESERVED16[5], MMCTPCGR, RESERVED17[10], MMCRCRCEPR, MMCRAEPR,\n      RESERVED18[10], MMCRUPGR, RESERVED19[9], MMCTLPIMSTR, MMCTLPITCR,\n      MMCRLPIMSTR, MMCRLPITCR, RESERVED20[65], MACL3L4C0R, MACL4A0R,\n      RESERVED21[2], MACL3A0R0R, MACL3A1R0R, MACL3A2R0R, MACL3A3R0R,\n      RESERVED22[4], MACL3L4C1R, MACL4A1R, RESERVED23[2], MACL3A0R1R,\n      MACL3A1R1R, MACL3A2R1R, MACL3A3R1R, RESERVED24[108], MACTSCR, MACSSIR,\n      MACSTSR, MACSTNR, MACSTSUR, MACSTNUR, MACTSAR, RESERVED25, MACTSSR,\n      RESERVED26[3], MACTTSSNR, MACTTSSSR, RESERVED27[2], MACACR, RESERVED28,\n      MACATSNR, MACATSSR, MACTSIACR, MACTSEACR, MACTSICNR, MACTSECNR,\n      RESERVED29[4], MACPPSCR, RESERVED30[3], MACPPSTTSR, MACPPSTTNR, MACPPSIR,\n      MACPPSWR, RESERVED31[12], MACPOCR, MACSPI0R, MACSPI1R, MACSPI2R, MACLMIR,\n      RESERVED32[11], MTLOMR, RESERVED33[7], MTLISR, RESERVED34[55], MTLTQOMR,\n      MTLTQUR, MTLTQDR, RESERVED35[8], MTLQICSR, MTLRQOMR, MTLRQMPOCR, MTLRQDR,\n      RESERVED36[177], DMAMR, DMASBMR, DMAISR, DMADSR, RESERVED37[60], DMACCR,\n      DMACTCR, DMACRCR, RESERVED38[2], DMACTDLAR, RESERVED39, DMACRDLAR,\n      DMACTDTPR, RESERVED40, DMACRDTPR, DMACTDRLR, DMACRDRLR, DMACIER,\n      DMACRIWTR, DMACSFCSR, RESERVED41, DMACCATDR, RESERVED42, DMACCARDR,\n      RESERVED43, DMACCATBR, RESERVED44, DMACCARBR, DMACSR, RESERVED45[2],\n      DMACMFCR;\n};\n#undef ETH\n#if MG_ENABLE_DRIVER_STM32H\n#define ETH                                                                \\\n  ((struct synopsys_enet_qos *) (uintptr_t) (0x40000000UL + 0x00020000UL + \\\n                                             0x8000UL))\n#elif MG_ENABLE_DRIVER_MCXN\n#define ETH ((struct synopsys_enet_qos *) (uintptr_t) 0x40100000UL)\n#endif\n\n#define ETH_PKT_SIZE 1540  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 4           // Descriptor size (words)\n\nstatic volatile uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS];  // RX descriptors\nstatic volatile uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS];  // TX descriptors\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE];       // RX ethernet buffers\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE];       // TX ethernet buffers\nstatic struct mg_tcpip_if *s_ifp;                         // MIP interface\n\nstatic uint16_t eth_read_phy(uint8_t addr, uint8_t reg) {\n  ETH->MACMDIOAR &= (0xF << 8);\n  ETH->MACMDIOAR |= ((uint32_t) addr << 21) | ((uint32_t) reg << 16) | 3 << 2;\n  ETH->MACMDIOAR |= MG_BIT(0);\n  while (ETH->MACMDIOAR & MG_BIT(0)) (void) 0;\n  return (uint16_t) ETH->MACMDIODR;\n}\n\nstatic void eth_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  ETH->MACMDIODR = val;\n  ETH->MACMDIOAR &= (0xF << 8);\n  ETH->MACMDIOAR |= ((uint32_t) addr << 21) | ((uint32_t) reg << 16) | 1 << 2;\n  ETH->MACMDIOAR |= MG_BIT(0);\n  while (ETH->MACMDIOAR & MG_BIT(0)) (void) 0;\n}\n\nstatic bool mg_tcpip_driver_stm32h_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_stm32h_data *d =\n      (struct mg_tcpip_driver_stm32h_data *) ifp->driver_data;\n  s_ifp = ifp;\n  uint8_t phy_addr = d == NULL ? 0 : d->phy_addr;\n  uint8_t phy_conf = d == NULL ? MG_PHY_CLOCKS_MAC : d->phy_conf;\n\n  // Init RX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i][0] = (uint32_t) (uintptr_t) s_rxbuf[i];  // Point to data buffer\n    s_rxdesc[i][3] = MG_BIT(31) | MG_BIT(30) | MG_BIT(24);  // OWN, IOC, BUF1V\n  }\n\n  // Init TX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_txdesc[i][0] = (uint32_t) (uintptr_t) s_txbuf[i];  // Buf pointer\n  }\n\n  ETH->DMAMR |= MG_BIT(0);  // Software reset\n  for (int i = 0; i < 4; i++)\n    (void) 0;  // wait at least 4 clocks before reading\n  while ((ETH->DMAMR & MG_BIT(0)) != 0) (void) 0;  // Wait until done\n\n  // Set MDC clock divider. Get user value, else, assume max freq\n  int cr = (d == NULL || d->mdc_cr < 0) ? 7 : d->mdc_cr;\n  ETH->MACMDIOAR = ((uint32_t) cr & 0xF) << 8;\n\n  // NOTE(scaprile): We do not use timing facilities so the DMA engine does not\n  // re-write buffer address\n  ETH->DMAMR = 0 << 16;        // use interrupt mode 0 (58.8.1) (reset value)\n  ETH->DMASBMR |= MG_BIT(12);  // AAL NOTE(scaprile): is this actually needed\n  ETH->MACIER = 0;  // Do not enable additional irq sources (reset value)\n  ETH->MACTFCR = MG_BIT(7);  // Disable zero-quanta pause\n  // ETH->MACPFR = MG_BIT(31);  // Receive all\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  mg_phy_init(&phy, phy_addr, phy_conf);\n  ETH->DMACRDLAR =\n      (uint32_t) (uintptr_t) s_rxdesc;  // RX descriptors start address\n  ETH->DMACRDRLR = ETH_DESC_CNT - 1;    // ring length\n  ETH->DMACRDTPR =\n      (uint32_t) (uintptr_t) &s_rxdesc[ETH_DESC_CNT -\n                                       1];  // last valid descriptor address\n  ETH->DMACTDLAR =\n      (uint32_t) (uintptr_t) s_txdesc;  // TX descriptors start address\n  ETH->DMACTDRLR = ETH_DESC_CNT - 1;    // ring length\n  ETH->DMACTDTPR =\n      (uint32_t) (uintptr_t) s_txdesc;  // first available descriptor address\n  ETH->DMACCR = 0;  // DSL = 0 (contiguous descriptor table) (reset value)\n#if !MG_ENABLE_DRIVER_STM32H\n  MG_SET_BITS(ETH->DMACTCR, 0x3F << 16, MG_BIT(16));\n  MG_SET_BITS(ETH->DMACRCR, 0x3F << 16, MG_BIT(16));\n#endif\n  ETH->DMACIER = MG_BIT(6) | MG_BIT(15);  // RIE, NIE\n  ETH->MACCR = MG_BIT(0) | MG_BIT(1) | MG_BIT(13) | MG_BIT(14) |\n               MG_BIT(15);  // RE, TE, Duplex, Fast, Reserved\n#if MG_ENABLE_DRIVER_STM32H\n  ETH->MTLTQOMR |= MG_BIT(1);  // TSF\n  ETH->MTLRQOMR |= MG_BIT(5);  // RSF\n#else\n  ETH->MTLTQOMR |= (7 << 16) | MG_BIT(3) | MG_BIT(1);  // 2KB Q0, TSF\n  ETH->MTLRQOMR |= (7 << 20) | MG_BIT(5);              // 2KB Q, RSF\n  MG_SET_BITS(ETH->RESERVED6[3], 3, 2);  // Enable RxQ0 (MAC_RXQ_CTRL0)\n#endif\n  ETH->DMACTCR |= MG_BIT(0);  // ST\n  ETH->DMACRCR |= MG_BIT(0);  // SR\n\n  // MAC address filtering\n  ETH->MACA0HR = ((uint32_t) ifp->mac[5] << 8U) | ifp->mac[4];\n  ETH->MACA0LR = (uint32_t) (ifp->mac[3] << 24) |\n                 ((uint32_t) ifp->mac[2] << 16) |\n                 ((uint32_t) ifp->mac[1] << 8) | ifp->mac[0];\n  return true;\n}\n\nstatic uint32_t s_txno;\nstatic size_t mg_tcpip_driver_stm32h_tx(const void *buf, size_t len,\n                                        struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // Frame is too big\n  } else if ((s_txdesc[s_txno][3] & MG_BIT(31))) {\n    ifp->nerr++;\n    MG_ERROR((\"No free descriptors: %u %08X %08X %08X\", s_txno,\n              s_txdesc[s_txno][3], ETH->DMACSR, ETH->DMACTCR));\n    for (int i = 0; i < ETH_DESC_CNT; i++) MG_ERROR((\"%08X\", s_txdesc[i][3]));\n    len = 0;  // All descriptors are busy, fail\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);              // Copy data\n    s_txdesc[s_txno][2] = (uint32_t) len;           // Set data len\n    s_txdesc[s_txno][3] = MG_BIT(28) | MG_BIT(29);  // FD, LD\n    s_txdesc[s_txno][3] |= MG_BIT(31);  // Set OWN bit - let DMA take over\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n  ETH->DMACSR |= MG_BIT(2) | MG_BIT(1);  // Clear any prior TBU, TPS\n  ETH->DMACTDTPR = (uint32_t) (uintptr_t) &s_txdesc[s_txno];  // and resume\n  return len;\n  (void) ifp;\n}\n\nstatic bool mg_tcpip_driver_stm32h_up(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_stm32h_data *d =\n      (struct mg_tcpip_driver_stm32h_data *) ifp->driver_data;\n  uint8_t phy_addr = d == NULL ? 0 : d->phy_addr;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  up = mg_phy_up(&phy, phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    // tmp = reg with flags set to the most likely situation: 100M full-duplex\n    // if(link is slow or half) set flags otherwise\n    // reg = tmp\n    uint32_t maccr = ETH->MACCR | MG_BIT(14) | MG_BIT(13);  // 100M, Full-duplex\n    if (speed == MG_PHY_SPEED_10M) maccr &= ~MG_BIT(14);    // 10M\n    if (full_duplex == false) maccr &= ~MG_BIT(13);         // Half-duplex\n    ETH->MACCR = maccr;  // IRQ handler does not fiddle with this register\n    MG_DEBUG((\"Link is %uM %s-duplex\", maccr & MG_BIT(14) ? 100 : 10,\n              maccr & MG_BIT(13) ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\nstatic uint32_t s_rxno;\n#if MG_ENABLE_DRIVER_MCXN\nvoid ETHERNET_IRQHandler(void);\nvoid ETHERNET_IRQHandler(void) {\n#else\nvoid ETH_IRQHandler(void);\nvoid ETH_IRQHandler(void) {\n#endif\n  if (ETH->DMACSR & MG_BIT(6)) {           // Frame received, loop\n    ETH->DMACSR = MG_BIT(15) | MG_BIT(6);  // Clear flag\n    for (uint32_t i = 0; i < 10; i++) {  // read as they arrive but not forever\n      if (s_rxdesc[s_rxno][3] & MG_BIT(31)) break;  // exit when done\n      if (((s_rxdesc[s_rxno][3] & (MG_BIT(28) | MG_BIT(29))) ==\n           (MG_BIT(28) | MG_BIT(29))) &&\n          !(s_rxdesc[s_rxno][3] & MG_BIT(15))) {  // skip partial/errored frames\n        uint32_t len = s_rxdesc[s_rxno][3] & (MG_BIT(15) - 1);\n        // MG_DEBUG((\"%lx %lu %lx %08lx\", s_rxno, len, s_rxdesc[s_rxno][3],\n        // ETH->DMACSR));\n        mg_tcpip_qwrite(s_rxbuf[s_rxno], len > 4 ? len - 4 : len, s_ifp);\n      }\n      s_rxdesc[s_rxno][3] =\n          MG_BIT(31) | MG_BIT(30) | MG_BIT(24);  // OWN, IOC, BUF1V\n      if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n    }\n  }\n  ETH->DMACSR =\n      MG_BIT(7) | MG_BIT(8);  // Clear possible RBU RPS while processing\n  ETH->DMACRDTPR =\n      (uint32_t) (uintptr_t) &s_rxdesc[ETH_DESC_CNT - 1];  // and resume RX\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_stm32h = {\n    mg_tcpip_driver_stm32h_init, mg_tcpip_driver_stm32h_tx, NULL,\n    mg_tcpip_driver_stm32h_up};\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/tm4c.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_TM4C) && MG_ENABLE_DRIVER_TM4C\nstruct tm4c_emac {\n  volatile uint32_t EMACCFG, EMACFRAMEFLTR, EMACHASHTBLH, EMACHASHTBLL,\n      EMACMIIADDR, EMACMIIDATA, EMACFLOWCTL, EMACVLANTG, RESERVED0, EMACSTATUS,\n      EMACRWUFF, EMACPMTCTLSTAT, RESERVED1[2], EMACRIS, EMACIM, EMACADDR0H,\n      EMACADDR0L, EMACADDR1H, EMACADDR1L, EMACADDR2H, EMACADDR2L, EMACADDR3H,\n      EMACADDR3L, RESERVED2[31], EMACWDOGTO, RESERVED3[8], EMACMMCCTRL,\n      EMACMMCRXRIS, EMACMMCTXRIS, EMACMMCRXIM, EMACMMCTXIM, RESERVED4,\n      EMACTXCNTGB, RESERVED5[12], EMACTXCNTSCOL, EMACTXCNTMCOL, RESERVED6[4],\n      EMACTXOCTCNTG, RESERVED7[6], EMACRXCNTGB, RESERVED8[4], EMACRXCNTCRCERR,\n      EMACRXCNTALGNERR, RESERVED9[10], EMACRXCNTGUNI, RESERVED10[239],\n      EMACVLNINCREP, EMACVLANHASH, RESERVED11[93], EMACTIMSTCTRL, EMACSUBSECINC,\n      EMACTIMSEC, EMACTIMNANO, EMACTIMSECU, EMACTIMNANOU, EMACTIMADD,\n      EMACTARGSEC, EMACTARGNANO, EMACHWORDSEC, EMACTIMSTAT, EMACPPSCTRL,\n      RESERVED12[12], EMACPPS0INTVL, EMACPPS0WIDTH, RESERVED13[294],\n      EMACDMABUSMOD, EMACTXPOLLD, EMACRXPOLLD, EMACRXDLADDR, EMACTXDLADDR,\n      EMACDMARIS, EMACDMAOPMODE, EMACDMAIM, EMACMFBOC, EMACRXINTWDT,\n      RESERVED14[8], EMACHOSTXDESC, EMACHOSRXDESC, EMACHOSTXBA, EMACHOSRXBA,\n      RESERVED15[218], EMACPP, EMACPC, EMACCC, RESERVED16, EMACEPHYRIS,\n      EMACEPHYIM, EMACEPHYIMSC;\n};\n#undef EMAC\n#define EMAC ((struct tm4c_emac *) (uintptr_t) 0x400EC000)\n\n#define ETH_PKT_SIZE 1540  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 4           // Descriptor size (words)\n\nstatic uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS];      // RX descriptors\nstatic uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS];      // TX descriptors\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE];  // RX ethernet buffers\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE];  // TX ethernet buffers\nstatic struct mg_tcpip_if *s_ifp;                    // MIP interface\nenum {\n  EPHY_ADDR = 0,\n  EPHYBMCR = 0,\n  EPHYBMSR = 1,\n  EPHYSTS = 16\n};  // PHY constants\n\nstatic inline void tm4cspin(volatile uint32_t count) {\n  while (count--) (void) 0;\n}\n\nstatic uint32_t emac_read_phy(uint8_t addr, uint8_t reg) {\n  EMAC->EMACMIIADDR &= (0xf << 2);\n  EMAC->EMACMIIADDR |= ((uint32_t) addr << 11) | ((uint32_t) reg << 6);\n  EMAC->EMACMIIADDR |= MG_BIT(0);\n  while (EMAC->EMACMIIADDR & MG_BIT(0)) tm4cspin(1);\n  return EMAC->EMACMIIDATA;\n}\n\nstatic void emac_write_phy(uint8_t addr, uint8_t reg, uint32_t val) {\n  EMAC->EMACMIIDATA = val;\n  EMAC->EMACMIIADDR &= (0xf << 2);\n  EMAC->EMACMIIADDR |= ((uint32_t) addr << 11) | ((uint32_t) reg << 6) | MG_BIT(1);\n  EMAC->EMACMIIADDR |= MG_BIT(0);\n  while (EMAC->EMACMIIADDR & MG_BIT(0)) tm4cspin(1);\n}\n\nstatic uint32_t get_sysclk(void) {\n  struct sysctl {\n    volatile uint32_t DONTCARE0[44], RSCLKCFG, DONTCARE1[43], PLLFREQ0,\n        PLLFREQ1;\n  } *sysctl = (struct sysctl *) 0x400FE000;\n  uint32_t clk = 0, piosc = 16000000 /* 16 MHz */, mosc = 25000000 /* 25MHz */;\n  if (sysctl->RSCLKCFG & (1 << 28)) {  // USEPLL\n    uint32_t fin, vco, mdiv, n, q, psysdiv;\n    uint32_t pllsrc = (sysctl->RSCLKCFG & (0xf << 24)) >> 24;\n    if (pllsrc == 0) {\n      clk = piosc;\n    } else if (pllsrc == 3) {\n      clk = mosc;\n    } else {\n      MG_ERROR((\"Unsupported clock source\"));\n    }\n    q = (sysctl->PLLFREQ1 & (0x1f << 8)) >> 8;\n    n = (sysctl->PLLFREQ1 & (0x1f << 0)) >> 0;\n    fin = clk / ((q + 1) * (n + 1));\n    mdiv = (sysctl->PLLFREQ0 & (0x3ff << 0)) >>\n           0;  // mint + (mfrac / 1024); MFRAC not supported\n    psysdiv = (sysctl->RSCLKCFG & (0x3f << 0)) >> 0;\n    vco = (uint32_t) ((uint64_t) fin * mdiv);\n    return vco / (psysdiv + 1);\n  }\n  uint32_t oscsrc = (sysctl->RSCLKCFG & (0xf << 20)) >> 20;\n  if (oscsrc == 0) {\n    clk = piosc;\n  } else if (oscsrc == 3) {\n    clk = mosc;\n  } else {\n    MG_ERROR((\"Unsupported clock source\"));\n  }\n  uint32_t osysdiv = (sysctl->RSCLKCFG & (0xf << 16)) >> 16;\n  return clk / (osysdiv + 1);\n}\n\n//  Guess CR from SYSCLK. MDC clock is generated from SYSCLK (AHB); as per\n//  802.3, it must not exceed 2.5MHz (also 20.4.2.6) As the AHB clock can be\n//  derived from the PIOSC (internal RC), and it can go above  specs, the\n//  datasheets specify a range of frequencies and activate one of a series of\n//  dividers to keep the MDC clock safely below 2.5MHz. We guess a divider\n//  setting based on SYSCLK with a +5% drift. If the user uses a different clock\n//  from our defaults, needs to set the macros on top Valid for TM4C129x (20.7)\n//  (4.5% worst case drift)\n// The PHY receives the main oscillator (MOSC) (20.3.1)\nstatic int guess_mdc_cr(void) {\n  uint8_t crs[] = {2, 3, 0, 1};      // EMAC->MACMIIAR::CR values\n  uint8_t div[] = {16, 26, 42, 62};  // Respective HCLK dividers\n  uint32_t sysclk = get_sysclk();    // Guess system SYSCLK\n  int result = -1;                   // Invalid CR value\n  if (sysclk < 25000000) {\n    MG_ERROR((\"SYSCLK too low\"));\n  } else {\n    for (int i = 0; i < 4; i++) {\n      if (sysclk / div[i] <= 2375000UL /* 2.5MHz - 5% */) {\n        result = crs[i];\n        break;\n      }\n    }\n    if (result < 0) MG_ERROR((\"SYSCLK too high\"));\n  }\n  MG_DEBUG((\"SYSCLK: %u, CR: %d\", sysclk, result));\n  return result;\n}\n\nstatic bool mg_tcpip_driver_tm4c_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_tm4c_data *d =\n      (struct mg_tcpip_driver_tm4c_data *) ifp->driver_data;\n  s_ifp = ifp;\n\n  // Init RX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i][0] = MG_BIT(31);                            // Own\n    s_rxdesc[i][1] = sizeof(s_rxbuf[i]) | MG_BIT(14);       // 2nd address chained\n    s_rxdesc[i][2] = (uint32_t) (uintptr_t) s_rxbuf[i];  // Point to data buffer\n    s_rxdesc[i][3] =\n        (uint32_t) (uintptr_t) s_rxdesc[(i + 1) % ETH_DESC_CNT];  // Chain\n    // MG_DEBUG((\"%d %p\", i, s_rxdesc[i]));\n  }\n\n  // Init TX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_txdesc[i][2] = (uint32_t) (uintptr_t) s_txbuf[i];  // Buf pointer\n    s_txdesc[i][3] =\n        (uint32_t) (uintptr_t) s_txdesc[(i + 1) % ETH_DESC_CNT];  // Chain\n  }\n\n  EMAC->EMACDMABUSMOD |= MG_BIT(0);                            // Software reset\n  while ((EMAC->EMACDMABUSMOD & MG_BIT(0)) != 0) tm4cspin(1);  // Wait until done\n\n  // Set MDC clock divider. If user told us the value, use it. Otherwise, guess\n  int cr = (d == NULL || d->mdc_cr < 0) ? guess_mdc_cr() : d->mdc_cr;\n  EMAC->EMACMIIADDR = ((uint32_t) cr & 0xf) << 2;\n\n  // NOTE(cpq): we do not use extended descriptor bit 7, and do not use\n  // hardware checksum. Therefore, descriptor size is 4, not 8\n  // EMAC->EMACDMABUSMOD = MG_BIT(13) | MG_BIT(16) | MG_BIT(22) | MG_BIT(23) | MG_BIT(25);\n  EMAC->EMACIM = MG_BIT(3) | MG_BIT(9);  // Mask timestamp & PMT IT\n  EMAC->EMACFLOWCTL = MG_BIT(7);      // Disable zero-quanta pause\n  // EMAC->EMACFRAMEFLTR = MG_BIT(31);   // Receive all\n  // EMAC->EMACPC defaults to internal PHY (EPHY) in MMI mode\n  emac_write_phy(EPHY_ADDR, EPHYBMCR, MG_BIT(15));  // Reset internal PHY (EPHY)\n  emac_write_phy(EPHY_ADDR, EPHYBMCR, MG_BIT(12));  // Set autonegotiation\n  EMAC->EMACRXDLADDR = (uint32_t) (uintptr_t) s_rxdesc;  // RX descriptors\n  EMAC->EMACTXDLADDR = (uint32_t) (uintptr_t) s_txdesc;  // TX descriptors\n  EMAC->EMACDMAIM = MG_BIT(6) | MG_BIT(16);                    // RIE, NIE\n  EMAC->EMACCFG = MG_BIT(2) | MG_BIT(3) | MG_BIT(11) | MG_BIT(14);   // RE, TE, Duplex, Fast\n  EMAC->EMACDMAOPMODE =\n      MG_BIT(1) | MG_BIT(13) | MG_BIT(21) | MG_BIT(25);  // SR, ST, TSF, RSF\n  EMAC->EMACADDR0H = ((uint32_t) ifp->mac[5] << 8U) | ifp->mac[4];\n  EMAC->EMACADDR0L = (uint32_t) (ifp->mac[3] << 24) |\n                     ((uint32_t) ifp->mac[2] << 16) |\n                     ((uint32_t) ifp->mac[1] << 8) | ifp->mac[0];\n  // NOTE(scaprile) There are 3 additional slots for filtering, disabled by\n  // default. This also applies to the STM32 driver (at least for F7)\n  return true;\n}\n\nstatic uint32_t s_txno;\nstatic size_t mg_tcpip_driver_tm4c_tx(const void *buf, size_t len,\n                                      struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // fail\n  } else if ((s_txdesc[s_txno][0] & MG_BIT(31))) {\n    ifp->nerr++;\n    MG_ERROR((\"No descriptors available\"));\n    // printf(\"D0 %lx SR %lx\\n\", (long) s_txdesc[0][0], (long)\n    // EMAC->EMACDMARIS);\n    len = 0;  // fail\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);     // Copy data\n    s_txdesc[s_txno][1] = (uint32_t) len;  // Set data len\n    s_txdesc[s_txno][0] =\n        MG_BIT(20) | MG_BIT(28) | MG_BIT(29) | MG_BIT(30);  // Chain,FS,LS,IC\n    s_txdesc[s_txno][0] |= MG_BIT(31);  // Set OWN bit - let DMA take over\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n  EMAC->EMACDMARIS = MG_BIT(2) | MG_BIT(5);  // Clear any prior TU/UNF\n  EMAC->EMACTXPOLLD = 0;               // and resume\n  return len;\n  (void) ifp;\n}\n\nstatic bool mg_tcpip_driver_tm4c_up(struct mg_tcpip_if *ifp) {\n  uint32_t bmsr = emac_read_phy(EPHY_ADDR, EPHYBMSR);\n  bool up = (bmsr & MG_BIT(2)) ? 1 : 0;\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    uint32_t sts = emac_read_phy(EPHY_ADDR, EPHYSTS);\n    // tmp = reg with flags set to the most likely situation: 100M full-duplex\n    // if(link is slow or half) set flags otherwise\n    // reg = tmp\n    uint32_t emaccfg = EMAC->EMACCFG | MG_BIT(14) | MG_BIT(11);  // 100M, Full-duplex\n    if (sts & MG_BIT(1)) emaccfg &= ~MG_BIT(14);                 // 10M\n    if ((sts & MG_BIT(2)) == 0) emaccfg &= ~MG_BIT(11);          // Half-duplex\n    EMAC->EMACCFG = emaccfg;  // IRQ handler does not fiddle with this register\n    MG_DEBUG((\"Link is %uM %s-duplex\", emaccfg & MG_BIT(14) ? 100 : 10,\n              emaccfg & MG_BIT(11) ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\nvoid EMAC0_IRQHandler(void);\nstatic uint32_t s_rxno;\nvoid EMAC0_IRQHandler(void) {\n  if (EMAC->EMACDMARIS & MG_BIT(6)) {        // Frame received, loop\n    EMAC->EMACDMARIS = MG_BIT(16) | MG_BIT(6);  // Clear flag\n    for (uint32_t i = 0; i < 10; i++) {   // read as they arrive but not forever\n      if (s_rxdesc[s_rxno][0] & MG_BIT(31)) break;  // exit when done\n      if (((s_rxdesc[s_rxno][0] & (MG_BIT(8) | MG_BIT(9))) == (MG_BIT(8) | MG_BIT(9))) &&\n          !(s_rxdesc[s_rxno][0] & MG_BIT(15))) {  // skip partial/errored frames\n        uint32_t len = ((s_rxdesc[s_rxno][0] >> 16) & (MG_BIT(14) - 1));\n        //  printf(\"%lx %lu %lx %.8lx\\n\", s_rxno, len, s_rxdesc[s_rxno][0],\n        //  EMAC->EMACDMARIS);\n        mg_tcpip_qwrite(s_rxbuf[s_rxno], len > 4 ? len - 4 : len, s_ifp);\n      }\n      s_rxdesc[s_rxno][0] = MG_BIT(31);\n      if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n    }\n  }\n  EMAC->EMACDMARIS = MG_BIT(7);  // Clear possible RU while processing\n  EMAC->EMACRXPOLLD = 0;      // and resume RX\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_tm4c = {mg_tcpip_driver_tm4c_init,\n                                               mg_tcpip_driver_tm4c_tx, NULL,\n                                               mg_tcpip_driver_tm4c_up};\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/tms570.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_TMS570) && MG_ENABLE_DRIVER_TMS570\nstruct tms570_emac_ctrl {\n  volatile uint32_t REVID, SOFTRESET, RESERVED1[1], INTCONTROL, C0RXTHRESHEN,\n  C0RXEN, C0TXEN, C0MISCEN, RESERVED2[8],\n  C0RXTHRESHSTAT, C0RXSTAT, C0TXSTAT, C0MISCSTAT,\n  RESERVED3[8],\n  C0RXIMAX, C0TXIMAX;\n};\nstruct tms570_emac {\n  volatile uint32_t TXREVID, TXCONTROL, TXTEARDOWN, RESERVED1[1], RXREVID,\n  RXCONTROL, RXTEARDOWN, RESERVED2[25], TXINTSTATRAW,TXINTSTATMASKED,\n  TXINTMASKSET, TXINTMASKCLEAR, MACINVECTOR, MACEOIVECTOR, RESERVED8[2], RXINTSTATRAW,\n  RXINTSTATMASKED, RXINTMASKSET, RXINTMASKCLEAR, MACINTSTATRAW, MACINTSTATMASKED,\n  MACINTMASKSET, MACINTMASKCLEAR, RESERVED3[16], RXMBPENABLE, RXUNICASTSET,\n  RXUNICASTCLEAR, RXMAXLEN, RXBUFFEROFFSET, RXFILTERLOWTHRESH, RESERVED9[2], RXFLOWTHRESH[8],\n  RXFREEBUFFER[8], MACCONTROL, MACSTATUS, EMCONTROL, FIFOCONTROL, MACCONFIG,\n  SOFTRESET, RESERVED4[22], MACSRCADDRLO, MACSRCADDRHI, MACHASH1, MACHASH2,\n  BOFFTEST, TPACETEST, RXPAUSE, TXPAUSE, RESERVED5[4], RXGOODFRAMES, RXBCASTFRAMES,\n  RXMCASTFRAMES, RXPAUSEFRAMES, RXCRCERRORS, RXALIGNCODEERRORS, RXOVERSIZED,\n  RXJABBER, RXUNDERSIZED, RXFRAGMENTS, RXFILTERED, RXQOSFILTERED, RXOCTETS,\n  TXGOODFRAMES, TXBCASTFRAMES, TXMCASTFRAMES, TXPAUSEFRAMES, TXDEFERRED,\n  TXCOLLISION, TXSINGLECOLL, TXMULTICOLL, TXEXCESSIVECOLL, TXLATECOLL,\n  TXUNDERRUN, TXCARRIERSENSE, TXOCTETS, FRAME64, FRAME65T127, FRAME128T255,\n  FRAME256T511, FRAME512T1023, FRAME1024TUP, NETOCTETS, RXSOFOVERRUNS,\n  RXMOFOVERRUNS, RXDMAOVERRUNS, RESERVED6[156], MACADDRLO, MACADDRHI,\n  MACINDEX, RESERVED7[61], TXHDP[8], RXHDP[8], TXCP[8], RXCP[8];\n};\nstruct tms570_mdio {\n  volatile uint32_t REVID, CONTROL, ALIVE, LINK, LINKINTRAW, LINKINTMASKED,\n  RESERVED1[2], USERINTRAW, USERINTMASKED, USERINTMASKSET, USERINTMASKCLEAR,\n  RESERVED2[20], USERACCESS0, USERPHYSEL0, USERACCESS1, USERPHYSEL1;\n};\n#define SWAP32(x) ( (((x) & 0x000000FF) << 24) | \\\n                              (((x) & 0x0000FF00) << 8)  | \\\n                              (((x) & 0x00FF0000) >> 8)  | \\\n                              (((x) & 0xFF000000) >> 24) )\n#undef EMAC\n#undef EMAC_CTRL\n#undef MDIO\n#define EMAC ((struct tms570_emac *) (uintptr_t) 0xFCF78000)\n#define EMAC_CTRL ((struct tms570_emac_ctrl *) (uintptr_t) 0xFCF78800)\n#define MDIO ((struct tms570_mdio *) (uintptr_t) 0xFCF78900)\n#define ETH_PKT_SIZE 1540  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 4           // Descriptor size (words)\nstatic uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS] \n  __attribute__((section(\".ETH_CPPI\"), aligned(4)));      // TX descriptors\nstatic uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS] \n  __attribute__((section(\".ETH_CPPI\"), aligned(4)));      // RX descriptors\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE] \n  __attribute__((aligned(4)));  // RX ethernet buffers\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE] \n  __attribute__((aligned(4)));  // TX ethernet buffers\nstatic struct mg_tcpip_if *s_ifp;                    // MIP interface\nstatic uint16_t emac_read_phy(uint8_t addr, uint8_t reg) {\n  while(MDIO->USERACCESS0 & MG_BIT(31)) (void) 0;\n  MDIO->USERACCESS0 = MG_BIT(31) | ((reg & 0x1f) << 21) |\n                      ((addr & 0x1f) << 16);\n  while(MDIO->USERACCESS0 & MG_BIT(31)) (void) 0;\n  return MDIO->USERACCESS0 & 0xffff;\n}\nstatic void emac_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  while(MDIO->USERACCESS0 & MG_BIT(31)) (void) 0;\n  MDIO->USERACCESS0 = MG_BIT(31) | MG_BIT(30) | ((reg & 0x1f) << 21) |\n                      ((addr & 0x1f) << 16) | (val & 0xffff);\n  while(MDIO->USERACCESS0 & MG_BIT(31)) (void) 0;\n}\nstatic bool mg_tcpip_driver_tms570_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_tms570_data *d =\n      (struct mg_tcpip_driver_tms570_data *) ifp->driver_data;\n  s_ifp = ifp;\n  EMAC_CTRL->SOFTRESET = MG_BIT(0); // Reset the EMAC Control Module\n  while(EMAC_CTRL->SOFTRESET & MG_BIT(0)) (void) 0; // wait\n  EMAC->SOFTRESET = MG_BIT(0); // Reset the EMAC Module\n  while(EMAC->SOFTRESET & MG_BIT(0)) (void) 0;\n  EMAC->MACCONTROL = 0;\n  EMAC->RXCONTROL = 0;\n  EMAC->TXCONTROL = 0;\n  // Initialize all the header descriptor pointer registers\n  uint32_t i;\n  for(i =  0; i < ETH_DESC_CNT; i++) {\n    EMAC->RXHDP[i] = 0;\n    EMAC->TXHDP[i] = 0;\n    EMAC->RXCP[i] = 0;\n    EMAC->TXCP[i] = 0;\n    ///EMAC->RXFREEBUFFER[i] = 0xff;\n  }\n  // Clear the interrupt enable for all the channels\n  EMAC->TXINTMASKCLEAR = 0xff;\n  EMAC->RXINTMASKCLEAR = 0xff;\n  EMAC->MACHASH1 = 0;\n  EMAC->MACHASH2 = 0;\n  EMAC->RXBUFFEROFFSET = 0;\n  EMAC->RXUNICASTCLEAR = 0xff;\n  EMAC->RXUNICASTSET = 0;\n  EMAC->RXMBPENABLE = 0;\n  // init MDIO\n  // MDIO_CLK frequency = VCLK3/(CLKDIV + 1). (MDIO must be between 1.0 - 2.5Mhz)\n  uint32_t clkdiv = 75; // VCLK is configured to 75Mhz\n  // CLKDIV, ENABLE, PREAMBLE, FAULTENB\n  MDIO->CONTROL = (clkdiv - 1) | MG_BIT(30) | MG_BIT(20) | MG_BIT(18);\n  volatile int delay = 0xfff;\n  while (delay-- != 0) (void) 0;\n  struct mg_phy phy = {emac_read_phy, emac_write_phy};\n  mg_phy_init(&phy, d->phy_addr, MG_PHY_CLOCKS_MAC);\n  // set the mac address\n  EMAC->MACSRCADDRHI = ifp->mac[0] | (ifp->mac[1] << 8) | (ifp->mac[2] << 16) |\n                       (ifp->mac[3] << 24);\n  EMAC->MACSRCADDRLO = ifp->mac[4] | (ifp->mac[5] << 8);\n  uint32_t channel;\n  for (channel = 0; channel < 8; channel++) {\n    EMAC->MACINDEX = channel;\n    EMAC->MACADDRHI = ifp->mac[0] | (ifp->mac[1] << 8) | (ifp->mac[2] << 16) |\n                       (ifp->mac[3] << 24);\n    EMAC->MACADDRLO = ifp->mac[4] | (ifp->mac[5] << 8) | MG_BIT(20) |\n                      MG_BIT(19) | (channel << 16);\n  }\n  EMAC->RXUNICASTSET = 1; // accept unicast frames;\n  EMAC->RXMBPENABLE = MG_BIT(30) | MG_BIT(13); // CRC, broadcast;\n  \n  // Initialize the descriptors\n  for (i = 0; i < ETH_DESC_CNT; i++) {\n    if (i < ETH_DESC_CNT - 1) {\n      s_txdesc[i][0] = 0;\n      s_rxdesc[i][0] = SWAP32(((uint32_t) &s_rxdesc[i + 1][0]));\n    }\n    s_txdesc[i][1] = SWAP32(((uint32_t) s_txbuf[i]));\n    s_rxdesc[i][1] = SWAP32(((uint32_t) s_rxbuf[i]));\n    s_txdesc[i][2] = 0;\n    s_rxdesc[i][2] = SWAP32(ETH_PKT_SIZE);\n    s_txdesc[i][3] = 0;\n    s_rxdesc[i][3] = SWAP32(MG_BIT(29)); // OWN\n  }\n  s_txdesc[ETH_DESC_CNT - 1][0] = 0;\n  s_rxdesc[ETH_DESC_CNT - 1][0] = 0;\n  \n  EMAC->MACCONTROL = MG_BIT(5) | MG_BIT(0); // Enable MII, Full-duplex\n  //EMAC->TXINTMASKSET = 1; // Enable TX interrupt\n  EMAC->RXINTMASKSET = 1; // Enable RX interrupt\n  //EMAC_CTRL->C0TXEN = 1; // TX completion interrupt\n  EMAC_CTRL->C0RXEN = 1; // RX completion interrupt\n  EMAC->TXCONTROL = 1; // TXEN\n  EMAC->RXCONTROL = 1; // RXEN\n  EMAC->RXHDP[0] = (uint32_t) &s_rxdesc[0][0];\n  return true;\n}\nstatic uint32_t s_txno;\nstatic size_t mg_tcpip_driver_tms570_tx(const void *buf, size_t len,\n                                      struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // fail\n  } else if ((s_txdesc[s_txno][3] & SWAP32(MG_BIT(29)))) {\n    ifp->nerr++;\n    MG_ERROR((\"No descriptors available\"));\n    len = 0;  // fail\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);     // Copy data\n    if (len < 128) len = 128;\n    s_txdesc[s_txno][2] = SWAP32((uint32_t) len);  // Set data len\n    s_txdesc[s_txno][3] =\n        SWAP32(MG_BIT(31) | MG_BIT(30) | MG_BIT(29) | len);  // SOP, EOP, OWN, length\n    \n    while(EMAC->TXHDP[0] != 0) (void) 0;\n    EMAC->TXHDP[0] = (uint32_t) &s_txdesc[s_txno][0];\n    if(++s_txno == ETH_DESC_CNT) {\n      s_txno = 0;\n    }\n  }\n  return len;\n  (void) ifp;\n}\nstatic bool mg_tcpip_driver_tms570_up(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_tms570_data *d =\n      (struct mg_tcpip_driver_tms570_data *) ifp->driver_data;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {emac_read_phy, emac_write_phy};\n  up = mg_phy_up(&phy, d->phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {\n    // link state just went up\n    MG_DEBUG((\"Link is %uM %s-duplex\", speed == MG_PHY_SPEED_10M ? 10 : 100,\n              full_duplex ? \"full\" : \"half\"));\n  }\n  return up;\n}\n#pragma CODE_STATE(EMAC_TX_IRQHandler, 32)\n#pragma INTERRUPT(EMAC_TX_IRQHandler, IRQ)\nvoid EMAC_TX_IRQHandler(void) {\n  uint32_t status = EMAC_CTRL->C0TXSTAT;\n  if (status & 1) { // interrupt caused on channel 0\n    while(s_txdesc[s_txno][3] & SWAP32(MG_BIT(29))) (void) 0;\n    EMAC->TXCP[0] = (uint32_t) &s_txdesc[s_txno][0];\n  }\n  //Write the DMA end of interrupt vector\n  EMAC->MACEOIVECTOR = 2;\n}\nstatic uint32_t s_rxno;\n#pragma CODE_STATE(EMAC_RX_IRQHandler, 32)\n#pragma INTERRUPT(EMAC_RX_IRQHandler, IRQ)\nvoid EMAC_RX_IRQHandler(void) {\n  uint32_t status = EMAC_CTRL->C0RXSTAT;\n  if (status & 1) { // Frame received, loop\n    uint32_t i;\n    //MG_INFO((\"RX interrupt\"));\n    for (i = 0; i < 10; i++) {   // read as they arrive but not forever\n      if ((s_rxdesc[s_rxno][3] & SWAP32(MG_BIT(29))) == 0) {\n        uint32_t len = SWAP32(s_rxdesc[s_rxno][3]) & 0xffff;\n        //MG_INFO((\"recv len: %d\", len));\n        //mg_hexdump(s_rxbuf[s_rxno], len);\n        mg_tcpip_qwrite(s_rxbuf[s_rxno], len > 4 ? len - 4 : len, s_ifp);\n        uint32_t flags = s_rxdesc[s_rxno][3];\n        s_rxdesc[s_rxno][3] = SWAP32(MG_BIT(29));\n        s_rxdesc[s_rxno][2] = SWAP32(ETH_PKT_SIZE);\n        EMAC->RXCP[0] = (uint32_t) &s_rxdesc[s_rxno][0];\n        if (flags & SWAP32(MG_BIT(28))) {\n          //MG_INFO((\"EOQ detected\"));\n          EMAC->RXHDP[0] = (uint32_t) &s_rxdesc[0][0];\n        }\n      }\n      if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n    }\n  }\n  //Write the DMA end of interrupt vector\n  EMAC->MACEOIVECTOR = 1;\n}\nstruct mg_tcpip_driver mg_tcpip_driver_tms570 = {mg_tcpip_driver_tms570_init,\n                                               mg_tcpip_driver_tms570_tx, NULL,\n                                               mg_tcpip_driver_tms570_up};\n#endif\n\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/w5100.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_W5100) && MG_ENABLE_DRIVER_W5100\n\nstatic void w5100_txn(struct mg_tcpip_spi *s, uint16_t addr,\n                      bool wr, void *buf, size_t len) {\n  size_t i;\n  uint8_t *p = (uint8_t *) buf;\n  uint8_t control = wr ? 0xF0 : 0x0F;\n  uint8_t cmd[] = {control, (uint8_t) (addr >> 8), (uint8_t) (addr & 255)};\n  s->begin(s->spi);\n  for (i = 0; i < sizeof(cmd); i++) s->txn(s->spi, cmd[i]);\n  for (i = 0; i < len; i++) {\n    uint8_t r = s->txn(s->spi, p[i]);\n    if (!wr) p[i] = r;\n  }\n  s->end(s->spi);\n}\n\n// clang-format off\nstatic  void w5100_wn(struct mg_tcpip_spi *s, uint16_t addr, void *buf, size_t len) { w5100_txn(s, addr, true, buf, len); }\nstatic  void w5100_w1(struct mg_tcpip_spi *s, uint16_t addr, uint8_t val) { w5100_wn(s, addr, &val, 1); }\nstatic  void w5100_w2(struct mg_tcpip_spi *s, uint16_t addr, uint16_t val) { uint8_t buf[2] = {(uint8_t) (val >> 8), (uint8_t) (val & 255)}; w5100_wn(s, addr, buf, sizeof(buf)); }\nstatic  void w5100_rn(struct mg_tcpip_spi *s, uint16_t addr, void *buf, size_t len) { w5100_txn(s, addr, false, buf, len); }\nstatic  uint8_t w5100_r1(struct mg_tcpip_spi *s, uint16_t addr) { uint8_t r = 0; w5100_rn(s, addr, &r, 1); return r; }\nstatic  uint16_t w5100_r2(struct mg_tcpip_spi *s, uint16_t addr) { uint8_t buf[2] = {0, 0}; w5100_rn(s, addr, buf, sizeof(buf)); return (uint16_t) ((buf[0] << 8) | buf[1]); }\n// clang-format on\n\nstatic size_t w5100_rx(void *buf, size_t buflen, struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data;\n  uint16_t r = 0, n = 0, len = (uint16_t) buflen, n2;     // Read recv len\n  while ((n2 = w5100_r2(s, 0x426)) > n) n = n2;  // Until it is stable\n  if (n > 0) {\n    uint16_t ptr = w5100_r2(s, 0x428);  // Get read pointer\n    if (n <= len + 2 && n > 1) {\n      r = (uint16_t) (n - 2);\n    }\n    uint16_t rxbuf_size = (1 << (w5100_r1(s, 0x1a) & 3)) * 1024;\n    uint16_t rxbuf_addr = 0x6000;\n    uint16_t ptr_ofs = (ptr + 2) & (rxbuf_size - 1);\n    if (ptr_ofs + r < rxbuf_size) {\n      w5100_rn(s, rxbuf_addr + ptr_ofs, buf, r);\n    } else {\n      uint16_t remaining_len = rxbuf_size - ptr_ofs;\n      w5100_rn(s, rxbuf_addr + ptr_ofs, buf, remaining_len);\n      w5100_rn(s, rxbuf_addr, buf + remaining_len, n - remaining_len);\n    }\n    w5100_w2(s, 0x428, (uint16_t) (ptr + n));\n    w5100_w1(s, 0x401, 0x40);                     // Sock0 CR -> RECV\n  }\n  return r;\n}\n\nstatic size_t w5100_tx(const void *buf, size_t buflen,\n                       struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data;\n  uint16_t i, n = 0, ptr = 0, len = (uint16_t) buflen;\n  while (n < len) n = w5100_r2(s, 0x420);      // Wait for space\n  ptr = w5100_r2(s, 0x424);                    // Get write pointer\n  uint16_t txbuf_size = (1 << (w5100_r1(s, 0x1b) & 3)) * 1024;\n  uint16_t ptr_ofs = ptr & (txbuf_size - 1);\n  uint16_t txbuf_addr = 0x4000;\n  if (ptr_ofs + len > txbuf_size) {\n    uint16_t size = txbuf_size - ptr_ofs;\n    w5100_wn(s, txbuf_addr + ptr_ofs, (char*) buf, size);\n    w5100_wn(s, txbuf_addr, (char*) buf + size, len - size);\n  } else {\n    w5100_wn(s, txbuf_addr + ptr_ofs, (char*) buf, len);\n  }\n  w5100_w2(s, 0x424, (uint16_t) (ptr + len));  // Advance write pointer\n  w5100_w1(s, 0x401, 0x20);                       // Sock0 CR -> SEND\n  for (i = 0; i < 40; i++) {\n    uint8_t ir = w5100_r1(s, 0x402);  // Read S0 IR\n    if (ir == 0) continue;\n    // printf(\"IR %d, len=%d, free=%d, ptr %d\\n\", ir, (int) len, (int) n, ptr);\n    w5100_w1(s, 0x402, ir);  // Write S0 IR: clear it!\n    if (ir & 8) len = 0;           // Timeout. Report error\n    if (ir & (16 | 8)) break;      // Stop on SEND_OK or timeout\n  }\n  return len;\n}\n\nstatic bool w5100_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data;\n  s->end(s->spi);\n  w5100_w1(s, 0, 0x80);     // Reset chip: CR -> 0x80\n  w5100_w1(s, 0x72, 0x53);  // CR PHYLCKR -> unlock PHY\n  w5100_w1(s, 0x46, 0);     // CR PHYCR0 -> autonegotiation\n  w5100_w1(s, 0x47, 0);     // CR PHYCR1 -> reset\n  w5100_w1(s, 0x72, 0x00);  // CR PHYLCKR -> lock PHY\n  w5100_w1(s, 0x1a, 6);          // Sock0 RX buf size - 4KB\n  w5100_w1(s, 0x1b, 6);          // Sock0 TX buf size - 4KB\n  w5100_w1(s, 0x400, 4);              // Sock0 MR -> MACRAW\n  w5100_w1(s, 0x401, 1);              // Sock0 CR -> OPEN\n  return w5100_r1(s, 0x403) == 0x42;  // Sock0 SR == MACRAW\n}\n\nstatic bool w5100_up(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_spi *spi = (struct mg_tcpip_spi *) ifp->driver_data;\n  uint8_t physr0 = w5100_r1(spi, 0x3c);\n  return physr0 & 1;  // Bit 0 of PHYSR is LNK (0 - down, 1 - up)\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_w5100 = {w5100_init, w5100_tx, w5100_rx,\n                                                w5100_up};\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/w5500.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_W5500) && MG_ENABLE_DRIVER_W5500\n\nenum { W5500_CR = 0, W5500_S0 = 1, W5500_TX0 = 2, W5500_RX0 = 3 };\n\nstatic void w5500_txn(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr,\n                      bool wr, void *buf, size_t len) {\n  size_t i;\n  uint8_t *p = (uint8_t *) buf;\n  uint8_t cmd[] = {(uint8_t) (addr >> 8), (uint8_t) (addr & 255),\n                   (uint8_t) ((block << 3) | (wr ? 4 : 0))};\n  s->begin(s->spi);\n  for (i = 0; i < sizeof(cmd); i++) s->txn(s->spi, cmd[i]);\n  for (i = 0; i < len; i++) {\n    uint8_t r = s->txn(s->spi, p[i]);\n    if (!wr) p[i] = r;\n  }\n  s->end(s->spi);\n}\n\n// clang-format off\nstatic  void w5500_wn(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr, void *buf, size_t len) { w5500_txn(s, block, addr, true, buf, len); }\nstatic  void w5500_w1(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr, uint8_t val) { w5500_wn(s, block, addr, &val, 1); }\nstatic  void w5500_w2(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr, uint16_t val) { uint8_t buf[2] = {(uint8_t) (val >> 8), (uint8_t) (val & 255)}; w5500_wn(s, block, addr, buf, sizeof(buf)); }\nstatic  void w5500_rn(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr, void *buf, size_t len) { w5500_txn(s, block, addr, false, buf, len); }\nstatic  uint8_t w5500_r1(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr) { uint8_t r = 0; w5500_rn(s, block, addr, &r, 1); return r; }\nstatic  uint16_t w5500_r2(struct mg_tcpip_spi *s, uint8_t block, uint16_t addr) { uint8_t buf[2] = {0, 0}; w5500_rn(s, block, addr, buf, sizeof(buf)); return (uint16_t) ((buf[0] << 8) | buf[1]); }\n// clang-format on\n\nstatic size_t w5500_rx(void *buf, size_t buflen, struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data;\n  uint16_t r = 0, n = 0, len = (uint16_t) buflen, n2;     // Read recv len\n  while ((n2 = w5500_r2(s, W5500_S0, 0x26)) > n) n = n2;  // Until it is stable\n  // printf(\"RSR: %d\\n\", (int) n);\n  if (n > 0) {\n    uint16_t ptr = w5500_r2(s, W5500_S0, 0x28);  // Get read pointer\n    n = w5500_r2(s, W5500_RX0, ptr);             // Read frame length\n    if (n <= len + 2 && n > 1) {\n      r = (uint16_t) (n - 2);\n      w5500_rn(s, W5500_RX0, (uint16_t) (ptr + 2), buf, r);\n    }\n    w5500_w2(s, W5500_S0, 0x28, (uint16_t) (ptr + n));  // Advance read pointer\n    w5500_w1(s, W5500_S0, 1, 0x40);                     // Sock0 CR -> RECV\n    // printf(\"  RX_RD: tot=%u n=%u r=%u\\n\", n2, n, r);\n  }\n  return r;\n}\n\nstatic size_t w5500_tx(const void *buf, size_t buflen,\n                       struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data;\n  uint16_t i, ptr, n = 0, len = (uint16_t) buflen;\n  while (n < len) n = w5500_r2(s, W5500_S0, 0x20);      // Wait for space\n  ptr = w5500_r2(s, W5500_S0, 0x24);                    // Get write pointer\n  w5500_wn(s, W5500_TX0, ptr, (void *) buf, len);       // Write data\n  w5500_w2(s, W5500_S0, 0x24, (uint16_t) (ptr + len));  // Advance write pointer\n  w5500_w1(s, W5500_S0, 1, 0x20);                       // Sock0 CR -> SEND\n  for (i = 0; i < 40; i++) {\n    uint8_t ir = w5500_r1(s, W5500_S0, 2);  // Read S0 IR\n    if (ir == 0) continue;\n    // printf(\"IR %d, len=%d, free=%d, ptr %d\\n\", ir, (int) len, (int) n, ptr);\n    w5500_w1(s, W5500_S0, 2, ir);  // Write S0 IR: clear it!\n    if (ir & 8) len = 0;           // Timeout. Report error\n    if (ir & (16 | 8)) break;      // Stop on SEND_OK or timeout\n  }\n  return len;\n}\n\nstatic bool w5500_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_spi *s = (struct mg_tcpip_spi *) ifp->driver_data;\n  s->end(s->spi);\n  w5500_w1(s, W5500_CR, 0, 0x80);     // Reset chip: CR -> 0x80\n  w5500_w1(s, W5500_CR, 0x2e, 0);     // CR PHYCFGR -> reset\n  w5500_w1(s, W5500_CR, 0x2e, 0xf8);  // CR PHYCFGR -> set\n  // w5500_wn(s, W5500_CR, 9, s->mac, 6);      // Set source MAC\n  w5500_w1(s, W5500_S0, 0x1e, 16);          // Sock0 RX buf size\n  w5500_w1(s, W5500_S0, 0x1f, 16);          // Sock0 TX buf size\n  w5500_w1(s, W5500_S0, 0, 4);              // Sock0 MR -> MACRAW\n  w5500_w1(s, W5500_S0, 1, 1);              // Sock0 CR -> OPEN\n  return w5500_r1(s, W5500_S0, 3) == 0x42;  // Sock0 SR == MACRAW\n}\n\nstatic bool w5500_up(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_spi *spi = (struct mg_tcpip_spi *) ifp->driver_data;\n  uint8_t phycfgr = w5500_r1(spi, W5500_CR, 0x2e);\n  return phycfgr & 1;  // Bit 0 of PHYCFGR is LNK (0 - down, 1 - up)\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_w5500 = {w5500_init, w5500_tx, w5500_rx,\n                                                w5500_up};\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/xmc.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_XMC) && MG_ENABLE_DRIVER_XMC\n\nstruct ETH_GLOBAL_TypeDef {\n  volatile uint32_t MAC_CONFIGURATION, MAC_FRAME_FILTER, HASH_TABLE_HIGH,\n  HASH_TABLE_LOW, GMII_ADDRESS, GMII_DATA, FLOW_CONTROL, VLAN_TAG, VERSION,\n  DEBUG, REMOTE_WAKE_UP_FRAME_FILTER, PMT_CONTROL_STATUS, RESERVED[2],\n  INTERRUPT_STATUS, INTERRUPT_MASK, MAC_ADDRESS0_HIGH, MAC_ADDRESS0_LOW,\n  MAC_ADDRESS1_HIGH, MAC_ADDRESS1_LOW, MAC_ADDRESS2_HIGH, MAC_ADDRESS2_LOW,\n  MAC_ADDRESS3_HIGH, MAC_ADDRESS3_LOW, RESERVED1[40], MMC_CONTROL,\n  MMC_RECEIVE_INTERRUPT, MMC_TRANSMIT_INTERRUPT, MMC_RECEIVE_INTERRUPT_MASK,\n  MMC_TRANSMIT_INTERRUPT_MASK, TX_STATISTICS[26], RESERVED2,\n  RX_STATISTICS_1[26], RESERVED3[6], MMC_IPC_RECEIVE_INTERRUPT_MASK,\n  RESERVED4, MMC_IPC_RECEIVE_INTERRUPT, RESERVED5, RX_STATISTICS_2[30],\n  RESERVED7[286], TIMESTAMP_CONTROL, SUB_SECOND_INCREMENT,\n  SYSTEM_TIME_SECONDS, SYSTEM_TIME_NANOSECONDS,\n  SYSTEM_TIME_SECONDS_UPDATE, SYSTEM_TIME_NANOSECONDS_UPDATE,\n  TIMESTAMP_ADDEND, TARGET_TIME_SECONDS, TARGET_TIME_NANOSECONDS,\n  SYSTEM_TIME_HIGHER_WORD_SECONDS, TIMESTAMP_STATUS,\n  PPS_CONTROL, RESERVED8[564], BUS_MODE, TRANSMIT_POLL_DEMAND,\n  RECEIVE_POLL_DEMAND, RECEIVE_DESCRIPTOR_LIST_ADDRESS,\n  TRANSMIT_DESCRIPTOR_LIST_ADDRESS, STATUS, OPERATION_MODE,\n  INTERRUPT_ENABLE, MISSED_FRAME_AND_BUFFER_OVERFLOW_COUNTER,\n  RECEIVE_INTERRUPT_WATCHDOG_TIMER, RESERVED9, AHB_STATUS,\n  RESERVED10[6], CURRENT_HOST_TRANSMIT_DESCRIPTOR,\n  CURRENT_HOST_RECEIVE_DESCRIPTOR, CURRENT_HOST_TRANSMIT_BUFFER_ADDRESS,\n  CURRENT_HOST_RECEIVE_BUFFER_ADDRESS, HW_FEATURE;\n};\n\n#undef ETH0\n#define ETH0  ((struct ETH_GLOBAL_TypeDef*) 0x5000C000UL)\n\n#define ETH_PKT_SIZE 1536 // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 4           // Descriptor size (words)\n\n#ifndef ETH_RAM_SECTION\n// if no section is specified, then the data will be placed in the default\n// bss section\n#define ETH_RAM_SECTION\n#endif\n\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE] ETH_RAM_SECTION;\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE] ETH_RAM_SECTION;\nstatic uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS] ETH_RAM_SECTION;  // RX descriptors\nstatic uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS] ETH_RAM_SECTION;  // TX descriptors\nstatic uint8_t s_txno;                           // Current TX descriptor\nstatic uint8_t s_rxno;                           // Current RX descriptor\n\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\nenum { MG_PHY_ADDR = 0, MG_PHYREG_BCR = 0, MG_PHYREG_BSR = 1 };\n\nstatic uint16_t eth_read_phy(uint8_t addr, uint8_t reg) {\n  ETH0->GMII_ADDRESS = (ETH0->GMII_ADDRESS & 0x3c) |\n                        ((uint32_t)addr << 11) |\n                        ((uint32_t)reg << 6) | 1;\n  while ((ETH0->GMII_ADDRESS & 1) != 0) (void) 0;\n  return (uint16_t)(ETH0->GMII_DATA & 0xffff);\n}\n\nstatic void eth_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  ETH0->GMII_DATA  = val;\n  ETH0->GMII_ADDRESS = (ETH0->GMII_ADDRESS & 0x3c) |\n                        ((uint32_t)addr << 11) |\n                        ((uint32_t)reg << 6) | 3;\n  while ((ETH0->GMII_ADDRESS & 1) != 0) (void) 0;\n}\n\nstatic uint32_t get_clock_rate(struct mg_tcpip_driver_xmc_data *d) {\n  if (d->mdc_cr == -1) {\n    // assume ETH clock is 60MHz by default\n    // then according to 13.2.8.1, we need to set value 3\n    return 3;\n  }\n\n  return d->mdc_cr;\n}\n\nstatic bool mg_tcpip_driver_xmc_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_xmc_data *d =\n      (struct mg_tcpip_driver_xmc_data *) ifp->driver_data;\n  s_ifp = ifp;\n\n  // reset MAC\n  ETH0->BUS_MODE |= 1;\n  while (ETH0->BUS_MODE & 1) (void) 0;\n\n  // set clock rate\n  ETH0->GMII_ADDRESS = get_clock_rate(d) << 2;\n\n  // init phy\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  mg_phy_init(&phy, d->phy_addr, MG_PHY_CLOCKS_MAC);\n\n  // configure MAC: DO, DM, FES, TC\n  ETH0->MAC_CONFIGURATION = MG_BIT(13) | MG_BIT(11) | MG_BIT(14) | MG_BIT(24);\n\n  // set the MAC address\n  ETH0->MAC_ADDRESS0_HIGH = MG_U32(0, 0, ifp->mac[5], ifp->mac[4]);\n  ETH0->MAC_ADDRESS0_LOW = \n        MG_U32(ifp->mac[3], ifp->mac[2], ifp->mac[1], ifp->mac[0]);\n\n  // Configure the receive filter\n  ETH0->MAC_FRAME_FILTER = MG_BIT(10) | MG_BIT(2); // HFP, HMC\n  // Disable flow control\n  ETH0->FLOW_CONTROL = 0;\n  // Enable store and forward mode\n  ETH0->OPERATION_MODE = MG_BIT(25) | MG_BIT(21); // RSF, TSF\n\n  // Configure DMA bus mode (AAL, USP, RPBL, PBL)\n  ETH0->BUS_MODE = MG_BIT(25) | MG_BIT(23) | (32 << 17) |  (32 << 8);\n\n  // init RX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i][0] = MG_BIT(31); // OWN descriptor\n    s_rxdesc[i][1] = MG_BIT(14) | ETH_PKT_SIZE;\n    s_rxdesc[i][2] = (uint32_t) s_rxbuf[i];\n    if (i == ETH_DESC_CNT - 1) {\n      s_rxdesc[i][3] = (uint32_t) &s_rxdesc[0][0];\n    } else {\n      s_rxdesc[i][3] = (uint32_t) &s_rxdesc[i + 1][0];\n    }\n  }\n  ETH0->RECEIVE_DESCRIPTOR_LIST_ADDRESS = (uint32_t) &s_rxdesc[0][0];\n\n  // init TX descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_txdesc[i][0] = MG_BIT(30) | MG_BIT(20);\n    s_txdesc[i][2] = (uint32_t) s_txbuf[i];\n    if (i == ETH_DESC_CNT - 1) {\n      s_txdesc[i][3] = (uint32_t) &s_txdesc[0][0];\n    } else {\n      s_txdesc[i][3] = (uint32_t) &s_txdesc[i + 1][0];\n    }\n  }\n  ETH0->TRANSMIT_DESCRIPTOR_LIST_ADDRESS = (uint32_t) &s_txdesc[0][0];\n\n  // Clear interrupts\n  ETH0->STATUS = 0xFFFFFFFF;\n\n  // Disable MAC interrupts\n  ETH0->MMC_TRANSMIT_INTERRUPT_MASK = 0xFFFFFFFF;\n  ETH0->MMC_RECEIVE_INTERRUPT_MASK = 0xFFFFFFFF;\n  ETH0->MMC_IPC_RECEIVE_INTERRUPT_MASK = 0xFFFFFFFF;\n  ETH0->INTERRUPT_MASK = MG_BIT(9) | MG_BIT(3); // TSIM, PMTIM\n\n  //Enable interrupts (NIE, RIE, TIE)\n  ETH0->INTERRUPT_ENABLE = MG_BIT(16) | MG_BIT(6) | MG_BIT(0);\n\n  // Enable MAC transmission and reception (TE, RE)\n  ETH0->MAC_CONFIGURATION |= MG_BIT(3) | MG_BIT(2);\n  // Enable DMA transmission and reception (ST, SR)\n  ETH0->OPERATION_MODE |= MG_BIT(13) | MG_BIT(1);\n  return true;\n}\n\nstatic size_t mg_tcpip_driver_xmc_tx(const void *buf, size_t len,\n                                        struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // Frame is too big\n  } else if ((s_txdesc[s_txno][0] & MG_BIT(31))) {\n    ifp->nerr++;\n    MG_ERROR((\"No free descriptors\"));\n    len = 0;  // All descriptors are busy, fail\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);\n    s_txdesc[s_txno][1] = len;\n    // Table 13-19 Transmit Descriptor Word 0 (IC, LS, FS, TCH)\n    s_txdesc[s_txno][0] = MG_BIT(30) | MG_BIT(29) | MG_BIT(28) | MG_BIT(20);\n    s_txdesc[s_txno][0] |= MG_BIT(31);  // OWN bit: handle control to DMA\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n\n  // Resume processing\n  ETH0->STATUS = MG_BIT(2); // clear Transmit unavailable\n  ETH0->TRANSMIT_POLL_DEMAND = 0;\n  return len;\n}\n\nstatic bool mg_tcpip_driver_xmc_up(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_xmc_data *d =\n      (struct mg_tcpip_driver_xmc_data *) ifp->driver_data;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  up = mg_phy_up(&phy, d->phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    MG_DEBUG((\"Link is %uM %s-duplex\", speed == MG_PHY_SPEED_10M ? 10 : 100,\n              full_duplex ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\nvoid ETH0_0_IRQHandler(void);\nvoid ETH0_0_IRQHandler(void) {\n  uint32_t irq_status = ETH0->STATUS;\n\n  // check if a frame was received\n  if (irq_status & MG_BIT(6)) {\n    for (uint8_t i = 0; i < ETH_DESC_CNT; i++) {\n      if ((s_rxdesc[s_rxno][0] & MG_BIT(31)) == 0) {\n        size_t len = (s_rxdesc[s_rxno][0] & 0x3fff0000) >> 16;\n        mg_tcpip_qwrite(s_rxbuf[s_rxno], len, s_ifp);\n        s_rxdesc[s_rxno][0] = MG_BIT(31);   // OWN bit: handle control to DMA\n        // Resume processing\n        ETH0->STATUS = MG_BIT(7) | MG_BIT(6); // clear RU and RI\n        ETH0->RECEIVE_POLL_DEMAND = 0;\n        if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n      }\n    }\n    ETH0->STATUS = MG_BIT(6);\n  }\n\n  // clear Successful transmission interrupt\n  if (irq_status & 1) {\n    ETH0->STATUS = 1;\n  }\n\n  // clear normal interrupt\n  if (irq_status & MG_BIT(16)) {\n    ETH0->STATUS = MG_BIT(16);\n  }\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_xmc = {\n    mg_tcpip_driver_xmc_init, mg_tcpip_driver_xmc_tx, NULL,\n    mg_tcpip_driver_xmc_up};\n#endif\n\n#ifdef MG_ENABLE_LINES\n#line 1 \"src/drivers/xmc7.c\"\n#endif\n\n\n#if MG_ENABLE_TCPIP && defined(MG_ENABLE_DRIVER_XMC7) && MG_ENABLE_DRIVER_XMC7\n\nstruct ETH_Type {\n  volatile uint32_t CTL, STATUS, RESERVED[1022], NETWORK_CONTROL,\n      NETWORK_CONFIG, NETWORK_STATUS, USER_IO_REGISTER, DMA_CONFIG,\n      TRANSMIT_STATUS, RECEIVE_Q_PTR, TRANSMIT_Q_PTR, RECEIVE_STATUS,\n      INT_STATUS, INT_ENABLE, INT_DISABLE, INT_MASK, PHY_MANAGEMENT, PAUSE_TIME,\n      TX_PAUSE_QUANTUM, PBUF_TXCUTTHRU, PBUF_RXCUTTHRU, JUMBO_MAX_LENGTH,\n      EXTERNAL_FIFO_INTERFACE, RESERVED1, AXI_MAX_PIPELINE, RSC_CONTROL,\n      INT_MODERATION, SYS_WAKE_TIME, RESERVED2[7], HASH_BOTTOM, HASH_TOP,\n      SPEC_ADD1_BOTTOM, SPEC_ADD1_TOP, SPEC_ADD2_BOTTOM, SPEC_ADD2_TOP,\n      SPEC_ADD3_BOTTOM, SPEC_ADD3_TOP, SPEC_ADD4_BOTTOM, SPEC_ADD4_TOP,\n      SPEC_TYPE1, SPEC_TYPE2, SPEC_TYPE3, SPEC_TYPE4, WOL_REGISTER,\n      STRETCH_RATIO, STACKED_VLAN, TX_PFC_PAUSE, MASK_ADD1_BOTTOM,\n      MASK_ADD1_TOP, DMA_ADDR_OR_MASK, RX_PTP_UNICAST, TX_PTP_UNICAST,\n      TSU_NSEC_CMP, TSU_SEC_CMP, TSU_MSB_SEC_CMP, TSU_PTP_TX_MSB_SEC,\n      TSU_PTP_RX_MSB_SEC, TSU_PEER_TX_MSB_SEC, TSU_PEER_RX_MSB_SEC,\n      DPRAM_FILL_DBG, REVISION_REG, OCTETS_TXED_BOTTOM, OCTETS_TXED_TOP,\n      FRAMES_TXED_OK, BROADCAST_TXED, MULTICAST_TXED, PAUSE_FRAMES_TXED,\n      FRAMES_TXED_64, FRAMES_TXED_65, FRAMES_TXED_128, FRAMES_TXED_256,\n      FRAMES_TXED_512, FRAMES_TXED_1024, FRAMES_TXED_1519, TX_UNDERRUNS,\n      SINGLE_COLLISIONS, MULTIPLE_COLLISIONS, EXCESSIVE_COLLISIONS,\n      LATE_COLLISIONS, DEFERRED_FRAMES, CRS_ERRORS, OCTETS_RXED_BOTTOM,\n      OCTETS_RXED_TOP, FRAMES_RXED_OK, BROADCAST_RXED, MULTICAST_RXED,\n      PAUSE_FRAMES_RXED, FRAMES_RXED_64, FRAMES_RXED_65, FRAMES_RXED_128,\n      FRAMES_RXED_256, FRAMES_RXED_512, FRAMES_RXED_1024, FRAMES_RXED_1519,\n      UNDERSIZE_FRAMES, EXCESSIVE_RX_LENGTH, RX_JABBERS, FCS_ERRORS,\n      RX_LENGTH_ERRORS, RX_SYMBOL_ERRORS, ALIGNMENT_ERRORS, RX_RESOURCE_ERRORS,\n      RX_OVERRUNS, RX_IP_CK_ERRORS, RX_TCP_CK_ERRORS, RX_UDP_CK_ERRORS,\n      AUTO_FLUSHED_PKTS, RESERVED3, TSU_TIMER_INCR_SUB_NSEC, TSU_TIMER_MSB_SEC,\n      TSU_STROBE_MSB_SEC, TSU_STROBE_SEC, TSU_STROBE_NSEC, TSU_TIMER_SEC,\n      TSU_TIMER_NSEC, TSU_TIMER_ADJUST, TSU_TIMER_INCR, TSU_PTP_TX_SEC,\n      TSU_PTP_TX_NSEC, TSU_PTP_RX_SEC, TSU_PTP_RX_NSEC, TSU_PEER_TX_SEC,\n      TSU_PEER_TX_NSEC, TSU_PEER_RX_SEC, TSU_PEER_RX_NSEC, PCS_CONTROL,\n      PCS_STATUS, RESERVED4[2], PCS_AN_ADV, PCS_AN_LP_BASE, PCS_AN_EXP,\n      PCS_AN_NP_TX, PCS_AN_LP_NP, RESERVED5[6], PCS_AN_EXT_STATUS, RESERVED6[8],\n      TX_PAUSE_QUANTUM1, TX_PAUSE_QUANTUM2, TX_PAUSE_QUANTUM3, RESERVED7,\n      RX_LPI, RX_LPI_TIME, TX_LPI, TX_LPI_TIME, DESIGNCFG_DEBUG1,\n      DESIGNCFG_DEBUG2, DESIGNCFG_DEBUG3, DESIGNCFG_DEBUG4, DESIGNCFG_DEBUG5,\n      DESIGNCFG_DEBUG6, DESIGNCFG_DEBUG7, DESIGNCFG_DEBUG8, DESIGNCFG_DEBUG9,\n      DESIGNCFG_DEBUG10, RESERVED8[22], SPEC_ADD5_BOTTOM, SPEC_ADD5_TOP,\n      RESERVED9[60], SPEC_ADD36_BOTTOM, SPEC_ADD36_TOP, INT_Q1_STATUS,\n      INT_Q2_STATUS, INT_Q3_STATUS, RESERVED10[11], INT_Q15_STATUS, RESERVED11,\n      TRANSMIT_Q1_PTR, TRANSMIT_Q2_PTR, TRANSMIT_Q3_PTR, RESERVED12[11],\n      TRANSMIT_Q15_PTR, RESERVED13, RECEIVE_Q1_PTR, RECEIVE_Q2_PTR,\n      RECEIVE_Q3_PTR, RESERVED14[3], RECEIVE_Q7_PTR, RESERVED15,\n      DMA_RXBUF_SIZE_Q1, DMA_RXBUF_SIZE_Q2, DMA_RXBUF_SIZE_Q3, RESERVED16[3],\n      DMA_RXBUF_SIZE_Q7, CBS_CONTROL, CBS_IDLESLOPE_Q_A, CBS_IDLESLOPE_Q_B,\n      UPPER_TX_Q_BASE_ADDR, TX_BD_CONTROL, RX_BD_CONTROL, UPPER_RX_Q_BASE_ADDR,\n      RESERVED17[2], HIDDEN_REG0, HIDDEN_REG1, HIDDEN_REG2, HIDDEN_REG3,\n      RESERVED18[2], HIDDEN_REG4, HIDDEN_REG5;\n};\n\n#define ETH0 ((struct ETH_Type *) 0x40490000)\n\n#define ETH_PKT_SIZE 1536  // Max frame size\n#define ETH_DESC_CNT 4     // Descriptors count\n#define ETH_DS 2           // Descriptor size (words)\n\n// TODO(): handle these in a portable compiler-independent CMSIS-friendly way\n#define MG_8BYTE_ALIGNED __attribute__((aligned((8U))))\n\nstatic uint8_t s_rxbuf[ETH_DESC_CNT][ETH_PKT_SIZE];\nstatic uint8_t s_txbuf[ETH_DESC_CNT][ETH_PKT_SIZE];\nstatic uint32_t s_rxdesc[ETH_DESC_CNT][ETH_DS] MG_8BYTE_ALIGNED;\nstatic uint32_t s_txdesc[ETH_DESC_CNT][ETH_DS] MG_8BYTE_ALIGNED;\nstatic uint8_t s_txno MG_8BYTE_ALIGNED;     // Current TX descriptor\nstatic uint8_t s_rxno MG_8BYTE_ALIGNED;     // Current RX descriptor\n\nstatic struct mg_tcpip_if *s_ifp;  // MIP interface\nenum { MG_PHY_ADDR = 0, MG_PHYREG_BCR = 0, MG_PHYREG_BSR = 1 };\n\nstatic uint16_t eth_read_phy(uint8_t addr, uint8_t reg) {\n  // WRITE1, READ OPERATION, PHY, REG, WRITE10\n  ETH0->PHY_MANAGEMENT = MG_BIT(30) | MG_BIT(29) | ((addr & 0xf) << 24) |\n                         ((reg & 0x1f) << 18) | MG_BIT(17);\n  while ((ETH0->NETWORK_STATUS & MG_BIT(2)) == 0) (void) 0;\n  return ETH0->PHY_MANAGEMENT & 0xffff;\n}\n\nstatic void eth_write_phy(uint8_t addr, uint8_t reg, uint16_t val) {\n  ETH0->PHY_MANAGEMENT = MG_BIT(30) | MG_BIT(28) | ((addr & 0xf) << 24) |\n                         ((reg & 0x1f) << 18) | MG_BIT(17) | val;\n  while ((ETH0->NETWORK_STATUS & MG_BIT(2)) == 0) (void) 0;\n}\n\nstatic uint32_t get_clock_rate(struct mg_tcpip_driver_xmc7_data *d) {\n  // see ETH0 -> NETWORK_CONFIG register\n  (void) d;\n  return 3;\n}\n\nstatic bool mg_tcpip_driver_xmc7_init(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_xmc7_data *d =\n      (struct mg_tcpip_driver_xmc7_data *) ifp->driver_data;\n  s_ifp = ifp;\n\n  // enable controller, set RGMII mode\n  ETH0->CTL = MG_BIT(31) | (4 << 8) | 2;\n\n  uint32_t cr = get_clock_rate(d);\n  // set NSP change, ignore RX FCS, data bus width, clock rate\n  // frame length 1536, full duplex, speed\n  ETH0->NETWORK_CONFIG = MG_BIT(29) | MG_BIT(26) | MG_BIT(21) |\n                         ((cr & 7) << 18) | MG_BIT(8) | MG_BIT(4) | MG_BIT(1) |\n                         MG_BIT(0);\n\n  // config DMA settings: Force TX burst, Discard on Error, set RX buffer size\n  // to 1536, TX_PBUF_SIZE, RX_PBUF_SIZE, AMBA_BURST_LENGTH\n  ETH0->DMA_CONFIG =\n      MG_BIT(26) | MG_BIT(24) | (0x18 << 16) | MG_BIT(10) | (3 << 8) | 4;\n\n  // initialize descriptors\n  for (int i = 0; i < ETH_DESC_CNT; i++) {\n    s_rxdesc[i][0] = (uint32_t) s_rxbuf[i];\n    if (i == ETH_DESC_CNT - 1) {\n      s_rxdesc[i][0] |= MG_BIT(1);  // mark last descriptor\n    }\n\n    s_txdesc[i][0] = (uint32_t) s_txbuf[i];\n    s_txdesc[i][1] = MG_BIT(31);  // OWN descriptor\n    if (i == ETH_DESC_CNT - 1) {\n      s_txdesc[i][1] |= MG_BIT(30);  // mark last descriptor\n    }\n  }\n  ETH0->RECEIVE_Q_PTR = (uint32_t) s_rxdesc;\n  ETH0->TRANSMIT_Q_PTR = (uint32_t) s_txdesc;\n\n  // disable other queues\n  ETH0->TRANSMIT_Q2_PTR = 1;\n  ETH0->TRANSMIT_Q1_PTR = 1;\n  ETH0->RECEIVE_Q2_PTR = 1;\n  ETH0->RECEIVE_Q1_PTR = 1;\n\n  // enable interrupts (RX complete)\n  ETH0->INT_ENABLE = MG_BIT(1);\n\n  // set MAC address\n  ETH0->SPEC_ADD1_BOTTOM =\n      ifp->mac[3] << 24 | ifp->mac[2] << 16 | ifp->mac[1] << 8 | ifp->mac[0];\n  ETH0->SPEC_ADD1_TOP = ifp->mac[5] << 8 | ifp->mac[4];\n\n  // enable MDIO, TX, RX\n  ETH0->NETWORK_CONTROL = MG_BIT(4) | MG_BIT(3) | MG_BIT(2);\n\n  // start transmission\n  ETH0->NETWORK_CONTROL |= MG_BIT(9);\n\n  // init phy\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  mg_phy_init(&phy, d->phy_addr, MG_PHY_CLOCKS_MAC);\n\n  (void) d;\n  return true;\n}\n\nstatic size_t mg_tcpip_driver_xmc7_tx(const void *buf, size_t len,\n                                      struct mg_tcpip_if *ifp) {\n  if (len > sizeof(s_txbuf[s_txno])) {\n    MG_ERROR((\"Frame too big, %ld\", (long) len));\n    len = 0;  // Frame is too big\n  } else if (((s_txdesc[s_txno][1] & MG_BIT(31)) == 0)) {\n    ifp->nerr++;\n    MG_ERROR((\"No free descriptors\"));\n    len = 0;  // All descriptors are busy, fail\n  } else {\n    memcpy(s_txbuf[s_txno], buf, len);\n    s_txdesc[s_txno][1] = (s_txno == ETH_DESC_CNT - 1 ? MG_BIT(30) : 0) |\n                          MG_BIT(15) | len;  // Last buffer and length\n\n    ETH0->NETWORK_CONTROL |= MG_BIT(9);  // enable transmission\n    if (++s_txno >= ETH_DESC_CNT) s_txno = 0;\n  }\n\n  MG_DSB();\n  ETH0->TRANSMIT_STATUS = ETH0->TRANSMIT_STATUS;\n  ETH0->NETWORK_CONTROL |= MG_BIT(9);  // enable transmission\n\n  return len;\n}\n\nstatic bool mg_tcpip_driver_xmc7_up(struct mg_tcpip_if *ifp) {\n  struct mg_tcpip_driver_xmc7_data *d =\n      (struct mg_tcpip_driver_xmc7_data *) ifp->driver_data;\n  uint8_t speed = MG_PHY_SPEED_10M;\n  bool up = false, full_duplex = false;\n  struct mg_phy phy = {eth_read_phy, eth_write_phy};\n  up = mg_phy_up(&phy, d->phy_addr, &full_duplex, &speed);\n  if ((ifp->state == MG_TCPIP_STATE_DOWN) && up) {  // link state just went up\n    // tmp = reg with flags set to the most likely situation: 100M full-duplex\n    // if(link is slow or half) set flags otherwise\n    // reg = tmp\n    uint32_t netconf = ETH0->NETWORK_CONFIG;\n    MG_SET_BITS(netconf, MG_BIT(10),\n                MG_BIT(1) | MG_BIT(0));  // 100M, Full-duplex\n    uint32_t ctl = ETH0->CTL;\n    MG_SET_BITS(ctl, 0xFF00, 4 << 8);  // /5 for 25M clock\n    if (speed == MG_PHY_SPEED_1000M) {\n      netconf |= MG_BIT(10);        // 1000M\n      MG_SET_BITS(ctl, 0xFF00, 0);  // /1 for 125M clock TODO() IS THIS NEEDED ?\n    } else if (speed == MG_PHY_SPEED_10M) {\n      netconf &= ~MG_BIT(0);         // 10M\n      MG_SET_BITS(ctl, 0xFF00, 49);  // /50 for 2.5M clock\n    }\n    if (full_duplex == false) netconf &= ~MG_BIT(1);  // Half-duplex\n    ETH0->NETWORK_CONFIG = netconf;  // IRQ handler does not fiddle with these\n    ETH0->CTL = ctl;\n    MG_DEBUG((\"Link is %uM %s-duplex\",\n              speed == MG_PHY_SPEED_10M\n                  ? 10\n                  : (speed == MG_PHY_SPEED_100M ? 100 : 1000),\n              full_duplex ? \"full\" : \"half\"));\n  }\n  return up;\n}\n\nvoid ETH_IRQHandler(void) {\n  uint32_t irq_status = ETH0->INT_STATUS;\n  if (irq_status & MG_BIT(1)) {\n    for (uint8_t i = 0; i < ETH_DESC_CNT; i++) {\n      if (s_rxdesc[s_rxno][0] & MG_BIT(0)) {\n        size_t len = s_rxdesc[s_rxno][1] & (MG_BIT(13) - 1);\n        mg_tcpip_qwrite(s_rxbuf[s_rxno], len, s_ifp);\n        s_rxdesc[s_rxno][0] &= ~MG_BIT(0);  // OWN bit: handle control to DMA\n        if (++s_rxno >= ETH_DESC_CNT) s_rxno = 0;\n      }\n    }\n  }\n\n  ETH0->INT_STATUS = irq_status;\n}\n\nstruct mg_tcpip_driver mg_tcpip_driver_xmc7 = {mg_tcpip_driver_xmc7_init,\n                                               mg_tcpip_driver_xmc7_tx, NULL,\n                                               mg_tcpip_driver_xmc7_up};\n#endif\n"
  },
  {
    "path": "test/tls_multirec/tls_multirec.diff",
    "content": "diff --git a/mongoose.c b/mongoose.c\nindex 44539e81..b3f1c83a 100644\n--- a/mongoose.c\n+++ b/mongoose.c\n@@ -11300,9 +11300,16 @@ void mg_tls_free(struct mg_connection *c) {\n long mg_tls_send(struct mg_connection *c, const void *buf, size_t len) {\n   struct tls_data *tls = (struct tls_data *) c->tls;\n   long n = MG_IO_WAIT;\n+  size_t maxsize = 256, encrypted = 0;\n   if (len > MG_IO_SIZE) len = MG_IO_SIZE;\n   if (len > 16384) len = 16384;\n-  mg_tls_encrypt(c, (const uint8_t *) buf, len, MG_TLS_APP_DATA);\n+  while (encrypted < len) {\n+    const uint8_t *chunk = (const uint8_t *) buf + encrypted;\n+    size_t chunksize = len - encrypted;\n+    if (chunksize > maxsize) chunksize = maxsize;\n+    mg_tls_encrypt(c, chunk, chunksize, MG_TLS_APP_DATA);\n+    encrypted += chunksize;\n+  }\n   while (tls->send.len > 0 &&\n          (n = mg_io_send(c, tls->send.buf, tls->send.len)) > 0) {\n     mg_iobuf_del(&tls->send, 0, (size_t) n);\n"
  },
  {
    "path": "test/unit_test.c",
    "content": "#include \"mongoose.h\"\n\n#include \"float.h\"  // For DBL_EPSILON and HUGE_VAL\n#include \"math.h\"\n\nstatic int s_num_tests = 0;\nstatic bool s_error = false;\n\n#ifdef NO_ABORT\nstatic int s_abort = 0;\n#define ABORT() ++s_abort, s_error = true\n#else\n#ifdef NO_SLEEP_ABORT\n#define ABORT() abort()\n#else\n#define ABORT()                       \\\n  sleep(2); /* 2s, GH print reason */ \\\n  abort();\n#endif\n#endif\n\n#define ASSERT(expr)                                            \\\n  do {                                                          \\\n    s_num_tests++;                                              \\\n    if (!(expr)) {                                              \\\n      printf(\"FAILURE %s:%d: %s\\n\", __FILE__, __LINE__, #expr); \\\n      fflush(stdout);                                           \\\n      ABORT();                                                  \\\n    }                                                           \\\n  } while (0)\n\n#define FETCH_BUF_SIZE (256 * 1024)\n\n// Important: we use different port numbers for the Windows bug workaround. See\n// https://support.microsoft.com/en-ae/help/3039044/error-10013-wsaeacces-is-returned-when-a-second-bind-to-a-excluded-por\n\nstatic void test_match(void) {\n  ASSERT(mg_match(mg_str_n(\"\", 0), mg_str_n(\"\", 0), NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"a\", 1), mg_str_n(\"*\", 1), NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"ab\", 2), mg_str_n(\"*\", 1), NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"a\", 1), mg_str_n(\"\", 0), NULL) == 0);\n  ASSERT(mg_match(mg_str_n(\"/foo\", 4), mg_str_n(\"/\", 1), NULL) == 0);\n  ASSERT(mg_match(mg_str_n(\"/x/bar\", 6), mg_str_n(\"/*/foo\", 6), NULL) == 0);\n  ASSERT(mg_match(mg_str_n(\"/x/foo\", 6), mg_str_n(\"/*/foo\", 6), NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"/x/foox\", 7), mg_str_n(\"/*/foo\", 6), NULL) == 0);\n  ASSERT(mg_match(mg_str_n(\"/x/foox\", 7), mg_str_n(\"/*/foo*\", 7), NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"/abc\", 4), mg_str_n(\"/*\", 2), NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"/ab/\", 4), mg_str_n(\"/*\", 2), NULL) == 0);\n  ASSERT(mg_match(mg_str_n(\"/\", 1), mg_str_n(\"/*\", 2), NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"/x/2\", 4), mg_str_n(\"/x/*\", 4), NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"/x/2/foo\", 8), mg_str_n(\"/x/*\", 4), NULL) == 0);\n  ASSERT(mg_match(mg_str_n(\"/x/2/foo\", 8), mg_str_n(\"/x/*/*\", 6), NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"///\", 3), mg_str_n(\"#\", 1), NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"/api/foo\", 8), mg_str_n(\"/api/*\", 6), NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"/api/log/static\", 15), mg_str_n(\"/api/*\", 6),\n                  NULL) == 0);\n  ASSERT(mg_match(mg_str_n(\"/api/log/static\", 15), mg_str_n(\"/api/#\", 6),\n                  NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"/ssi/index.shtml\", 16), mg_str_n(\"#.shtml\", 7),\n                  NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\".c\", 2), mg_str_n(\"#.c\", 3), NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"ab\", 2), mg_str_n(\"abc\", 3), NULL) == 0);\n  ASSERT(mg_match(mg_str_n(\"a.c\", 3), mg_str_n(\"#.c\", 3), NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"..c\", 3), mg_str_n(\"#.c\", 3), NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"/.c\", 3), mg_str_n(\"#.c\", 3), NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"//a.c\", 5), mg_str_n(\"#.c\", 3), NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"x/a.c\", 5), mg_str_n(\"#.c\", 3), NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"./a.c\", 5), mg_str_n(\"#.c\", 3), NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"./ssi/index.shtml\", 17), mg_str_n(\"#.shtml\", 7),\n                  NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"caabba\", 6), mg_str_n(\"#aa#bb#\", 7), NULL) == 1);\n  ASSERT(mg_match(mg_str_n(\"caabxa\", 6), mg_str_n(\"#aa#bb#\", 7), NULL) == 0);\n  ASSERT(mg_match(mg_str_n(\"a__b_c\", 6), mg_str_n(\"a*b*c\", 5), NULL) == 1);\n\n  {\n    struct mg_str caps[3];\n    ASSERT(mg_match(mg_str(\"//a.c\"), mg_str(\"#.c\"), NULL) == true);\n    ASSERT(mg_match(mg_str(\"a\"), mg_str(\"#\"), caps) == true);\n    ASSERT(mg_strcmp(caps[0], mg_str(\"a\")) == 0);\n    ASSERT(mg_match(mg_str(\"//a.c\"), mg_str(\"#.c\"), caps) == true);\n    ASSERT(mg_match(mg_str(\"a_b_c_\"), mg_str(\"a*b*c\"), caps) == false);\n    ASSERT(mg_match(mg_str(\"a__b_c\"), mg_str(\"a*b*c\"), caps) == true);\n    ASSERT(mg_strcmp(caps[0], mg_str(\"__\")) == 0);\n    ASSERT(mg_strcmp(caps[1], mg_str(\"_\")) == 0);\n    ASSERT(mg_match(mg_str(\"a_b_c__c\"), mg_str(\"a*b*c\"), caps) == true);\n    ASSERT(mg_strcmp(caps[0], mg_str(\"_\")) == 0);\n    ASSERT(mg_strcmp(caps[1], mg_str(\"_c__\")) == 0);\n    ASSERT(mg_match(mg_str(\"a_xb_.c__c\"), mg_str(\"a*b*c\"), caps) == true);\n    ASSERT(mg_strcmp(caps[0], mg_str(\"_x\")) == 0);\n    ASSERT(mg_strcmp(caps[1], mg_str(\"_.c__\")) == 0);\n    ASSERT(mg_match(mg_str(\"a\"), mg_str(\"#a\"), caps) == true);\n    ASSERT(mg_strcmp(caps[0], mg_str(\"\")) == 0);\n\n    ASSERT(mg_match(mg_str(\".aa..b...b\"), mg_str(\"#a#b\"), caps) == true);\n    ASSERT(mg_strcmp(caps[0], mg_str(\".\")) == 0);\n    ASSERT(mg_strcmp(caps[1], mg_str(\"a..b...\")) == 0);\n    ASSERT(mg_strcmp(caps[2], mg_str(\"\")) == 0);\n\n    ASSERT(mg_match(mg_str(\"/foo/bar\"), mg_str(\"/*/*\"), caps) == true);\n    ASSERT(mg_strcmp(caps[0], mg_str(\"foo\")) == 0);\n    ASSERT(mg_strcmp(caps[1], mg_str(\"bar\")) == 0);\n    ASSERT(mg_strcmp(caps[2], mg_str(\"\")) == 0);\n\n    ASSERT(mg_match(mg_str(\"/foo/\"), mg_str(\"/*/*\"), caps) == true);\n    ASSERT(mg_strcmp(caps[0], mg_str(\"foo\")) == 0);\n    ASSERT(mg_strcmp(caps[1], mg_str(\"\")) == 0);\n    ASSERT(mg_strcmp(caps[2], mg_str(\"\")) == 0);\n\n    ASSERT(mg_match(mg_str(\"abc\"), mg_str(\"?#\"), caps) == true);\n    ASSERT(mg_strcmp(caps[0], mg_str(\"a\")) == 0);\n    ASSERT(mg_strcmp(caps[1], mg_str(\"bc\")) == 0);\n    ASSERT(mg_strcmp(caps[2], mg_str(\"\")) == 0);\n\n    ASSERT(mg_match(mg_str(\"a#c\"), mg_str(\"?#\"), caps) == true);\n    ASSERT(mg_strcmp(caps[0], mg_str(\"a\")) == 0);\n    ASSERT(mg_strcmp(caps[1], mg_str(\"#c\")) == 0);\n    ASSERT(mg_strcmp(caps[2], mg_str(\"\")) == 0);\n\n    ASSERT(mg_match(mg_str(\"a*c\"), mg_str(\"?*\"), caps) == true);\n    ASSERT(mg_strcmp(caps[0], mg_str(\"a\")) == 0);\n    ASSERT(mg_strcmp(caps[1], mg_str(\"*c\")) == 0);\n    ASSERT(mg_strcmp(caps[2], mg_str(\"\")) == 0);\n  }\n}\n\nstatic void test_http_get_var(void) {\n  char buf[256];\n  struct mg_str body;\n  body = mg_str(\"key1=value1&key2=value2&key3=value%203&key4=value+4\");\n  ASSERT(mg_http_get_var(&body, \"key1\", buf, sizeof(buf)) == 6);\n  ASSERT(strcmp(buf, \"value1\") == 0);\n  ASSERT(mg_http_get_var(&body, \"KEY1\", buf, sizeof(buf)) == 6);\n  ASSERT(strcmp(buf, \"value1\") == 0);\n  ASSERT(mg_http_get_var(&body, \"key2\", buf, sizeof(buf)) == 6);\n  ASSERT(strcmp(buf, \"value2\") == 0);\n  ASSERT(mg_http_get_var(&body, \"key3\", buf, sizeof(buf)) == 7);\n  ASSERT(strcmp(buf, \"value 3\") == 0);\n  ASSERT(mg_http_get_var(&body, \"key4\", buf, sizeof(buf)) == 7);\n  ASSERT(strcmp(buf, \"value 4\") == 0);\n\n  ASSERT(mg_http_get_var(&body, \"key\", buf, sizeof(buf)) == -4);\n  ASSERT(mg_http_get_var(&body, \"key1\", NULL, sizeof(buf)) == -2);\n  ASSERT(mg_http_get_var(&body, \"key1\", buf, 0) == -2);\n  ASSERT(mg_http_get_var(&body, NULL, buf, sizeof(buf)) == -1);\n  ASSERT(mg_http_get_var(&body, \"key1\", buf, 1) == -3);\n\n  body = mg_str(\"key=broken%2\");\n  ASSERT(mg_http_get_var(&body, \"key\", buf, sizeof(buf)) == -3);\n\n  body = mg_str(\"key=broken%2x\");\n  ASSERT(mg_http_get_var(&body, \"key\", buf, sizeof(buf)) == -3);\n  ASSERT(mg_http_get_var(&body, \"inexistent\", buf, sizeof(buf)) == -4);\n  body = mg_str(\"key=%\");\n  ASSERT(mg_http_get_var(&body, \"key\", buf, sizeof(buf)) == -3);\n  body = mg_str(\"&&&kEy=%\");\n  ASSERT(mg_http_get_var(&body, \"kEy\", buf, sizeof(buf)) == -3);\n}\n\nstatic int vcmp(struct mg_str s1, const char *s2) {\n  return mg_strcmp(s1, mg_str(s2)) == 0;\n}\nstatic bool is_space(int c) {\n  return c == ' ' || c == '\\r' || c == '\\n' || c == '\\t';\n}\nstatic struct mg_str strstrip(struct mg_str s) {\n  while (s.len > 0 && is_space((int) *s.buf)) s.buf++, s.len--;\n  while (s.len > 0 && is_space((int) *(s.buf + s.len - 1))) s.len--;\n  return s;\n}\nstatic const char *mgstrstr(const struct mg_str haystack,\n                            const struct mg_str needle) {\n  size_t i;\n  if (needle.len > haystack.len) return NULL;\n  if (needle.len == 0) return haystack.buf;\n  for (i = 0; i <= haystack.len - needle.len; i++) {\n    if (memcmp(haystack.buf + i, needle.buf, needle.len) == 0) {\n      return haystack.buf + i;\n    }\n  }\n  return NULL;\n}\n\nstatic void test_url(void) {\n  // Host\n  ASSERT(vcmp(mg_url_host(\"foo\"), \"foo\"));\n  ASSERT(vcmp(mg_url_host(\"//foo\"), \"foo\"));\n  ASSERT(vcmp(mg_url_host(\"foo:1234\"), \"foo\"));\n  ASSERT(vcmp(mg_url_host(\":1234\"), \"\"));\n  ASSERT(vcmp(mg_url_host(\"//foo:1234\"), \"foo\"));\n  ASSERT(vcmp(mg_url_host(\"p://foo\"), \"foo\"));\n  ASSERT(vcmp(mg_url_host(\"p://foo/\"), \"foo\"));\n  ASSERT(vcmp(mg_url_host(\"p://foo/x\"), \"foo\"));\n  ASSERT(vcmp(mg_url_host(\"p://foo/x/\"), \"foo\"));\n  ASSERT(vcmp(mg_url_host(\"p://foo/x//\"), \"foo\"));\n  ASSERT(vcmp(mg_url_host(\"p://foo//x\"), \"foo\"));\n  ASSERT(vcmp(mg_url_host(\"p://foo///x\"), \"foo\"));\n  ASSERT(vcmp(mg_url_host(\"p://foo///x//\"), \"foo\"));\n  ASSERT(vcmp(mg_url_host(\"p://bar:1234\"), \"bar\"));\n  ASSERT(vcmp(mg_url_host(\"p://bar:1234/\"), \"bar\"));\n  ASSERT(vcmp(mg_url_host(\"p://bar:1234/a\"), \"bar\"));\n  ASSERT(vcmp(mg_url_host(\"p://u@bar:1234/a\"), \"bar\"));\n  ASSERT(vcmp(mg_url_host(\"p://u:p@bar:1234/a\"), \"bar\"));\n  ASSERT(vcmp(mg_url_host(\"p://u:p@[::1]:1234/a\"), \"[::1]\"));\n  ASSERT(vcmp(mg_url_host(\"p://u:p@[1:2::3]:1234/a\"), \"[1:2::3]\"));\n  ASSERT(vcmp(mg_url_host(\"p://foo/x:y/z\"), \"foo\"));\n\n  // Port\n  ASSERT(mg_url_port(\"foo:1234\") == 1234);\n  ASSERT(mg_url_port(\":1234\") == 1234);\n  ASSERT(mg_url_port(\"x://foo:1234\") == 1234);\n  ASSERT(mg_url_port(\"x://foo:1234/\") == 1234);\n  ASSERT(mg_url_port(\"x://foo:1234/xx\") == 1234);\n  ASSERT(mg_url_port(\"x://foo:1234\") == 1234);\n  ASSERT(mg_url_port(\"p://bar:1234/a\") == 1234);\n  ASSERT(mg_url_port(\"p://bar:1234/a:b\") == 1234);\n  ASSERT(mg_url_port(\"http://bar\") == 80);\n  ASSERT(mg_url_port(\"http://localhost:1234\") == 1234);\n  ASSERT(mg_url_port(\"https://bar\") == 443);\n  ASSERT(mg_url_port(\"wss://bar\") == 443);\n  ASSERT(mg_url_port(\"wss://u:p@bar\") == 443);\n  ASSERT(mg_url_port(\"wss://u:p@bar:123\") == 123);\n  ASSERT(mg_url_port(\"wss://u:p@bar:123/\") == 123);\n  ASSERT(mg_url_port(\"wss://u:p@bar:123/abc\") == 123);\n  ASSERT(mg_url_port(\"http://u:p@[::1]/abc\") == 80);\n  ASSERT(mg_url_port(\"http://u:p@[::1]:2121/abc\") == 2121);\n  ASSERT(mg_url_port(\"http://u:p@[::1]:2121/abc/cd:ef\") == 2121);\n\n  // User / pass\n  ASSERT(vcmp(mg_url_user(\"p://foo\"), \"\"));\n  ASSERT(vcmp(mg_url_pass(\"p://foo\"), \"\"));\n  ASSERT(vcmp(mg_url_user(\"p://:@foo\"), \"\"));\n  ASSERT(vcmp(mg_url_pass(\"p://:@foo\"), \"\"));\n  ASSERT(vcmp(mg_url_user(\"p://u@foo\"), \"u\"));\n  ASSERT(vcmp(mg_url_pass(\"p://u@foo\"), \"\"));\n  ASSERT(vcmp(mg_url_user(\"p://u:@foo\"), \"u\"));\n  ASSERT(vcmp(mg_url_pass(\"p://u:@foo\"), \"\"));\n  ASSERT(vcmp(mg_url_user(\"p://:p@foo\"), \"\"));\n  ASSERT(vcmp(mg_url_pass(\"p://:p@foo\"), \"p\"));\n  ASSERT(vcmp(mg_url_user(\"p://u:p@foo\"), \"u\"));\n  ASSERT(vcmp(mg_url_pass(\"p://u:p@foo\"), \"p\"));\n  ASSERT(vcmp(mg_url_pass(\"p://u:p@foo//a@b\"), \"p\"));\n  ASSERT(vcmp(mg_url_user(\"p://foo/q?mail=a@b.c\"), \"\"));\n  ASSERT(vcmp(mg_url_pass(\"p://foo/q?mail=a@b.c\"), \"\"));\n\n  // URI\n  ASSERT(strcmp(mg_url_uri(\"p://foo\"), \"/\") == 0);\n  ASSERT(strcmp(mg_url_uri(\"p://foo/\"), \"/\") == 0);\n  ASSERT(strcmp(mg_url_uri(\"p://foo:12/\"), \"/\") == 0);\n  ASSERT(strcmp(mg_url_uri(\"p://foo:12/abc\"), \"/abc\") == 0);\n  ASSERT(strcmp(mg_url_uri(\"p://foo:12/a/b/c\"), \"/a/b/c\") == 0);\n  ASSERT(strcmp(mg_url_uri(\"p://[::1]:12/a/b/c\"), \"/a/b/c\") == 0);\n  ASSERT(strcmp(mg_url_uri(\"p://[ab::1]:12/a/b/c\"), \"/a/b/c\") == 0);\n  ASSERT(strcmp(mg_url_uri(\"p://foo/q?mail=a@b.c\"), \"/q?mail=a@b.c\") == 0);\n}\n\nstatic void test_base64(void) {\n  char buf[128];\n\n  ASSERT(mg_base64_encode((uint8_t *) \"\", 0, buf, sizeof(buf)) == 0);\n  ASSERT(strcmp(buf, \"\") == 0);\n  ASSERT(mg_base64_encode((uint8_t *) \"x\", 1, buf, sizeof(buf)) == 4);\n  ASSERT(strcmp(buf, \"eA==\") == 0);\n  ASSERT(mg_base64_encode((uint8_t *) \"xyz\", 3, buf, sizeof(buf)) == 4);\n  ASSERT(strcmp(buf, \"eHl6\") == 0);\n  ASSERT(mg_base64_encode((uint8_t *) \"abcdef\", 6, buf, sizeof(buf)) == 8);\n  ASSERT(strcmp(buf, \"YWJjZGVm\") == 0);\n  ASSERT(mg_base64_encode((uint8_t *) \"ы\", 2, buf, sizeof(buf)) == 4);\n  ASSERT(strcmp(buf, \"0Ys=\") == 0);\n  ASSERT(mg_base64_encode((uint8_t *) \"xy\", 3, buf, sizeof(buf)) == 4);\n  ASSERT(strcmp(buf, \"eHkA\") == 0);\n  ASSERT(mg_base64_encode((uint8_t *) \"test\", 4, buf, sizeof(buf)) == 8);\n  ASSERT(strcmp(buf, \"dGVzdA==\") == 0);\n  ASSERT(mg_base64_encode((uint8_t *) \"abcde\", 5, buf, sizeof(buf)) == 8);\n  ASSERT(strcmp(buf, \"YWJjZGU=\") == 0);\n  ASSERT(mg_base64_encode((uint8_t *) \"a\", 1, buf, 0) == 0);\n  ASSERT(mg_base64_encode((uint8_t *) \"a\", 1, buf, 1) == 0);\n  ASSERT(mg_base64_encode((uint8_t *) \"a\", 1, buf, 2) == 0);\n  ASSERT(mg_base64_encode((uint8_t *) \"a\", 1, buf, 3) == 0);\n  ASSERT(mg_base64_encode((uint8_t *) \"a\", 1, buf, 4) == 0);\n  ASSERT(mg_base64_encode((uint8_t *) \"a\", 1, buf, 5) == 4);\n\n  ASSERT(mg_base64_decode(\"кю\", 4, buf, sizeof(buf)) == 0);\n  ASSERT(mg_base64_decode(\"A\", 1, buf, sizeof(buf)) == 0);\n  ASSERT(mg_base64_decode(\"A=\", 2, buf, sizeof(buf)) == 0);\n  ASSERT(mg_base64_decode(\"AA=\", 3, buf, sizeof(buf)) == 0);\n  ASSERT(mg_base64_decode(\"AAA=\", 4, buf, sizeof(buf)) == 2);\n  ASSERT(mg_base64_decode(\"AAAA====\", 8, buf, sizeof(buf)) == 0);\n  ASSERT(mg_base64_decode(\"AAAA----\", 8, buf, sizeof(buf)) == 0);\n  ASSERT(mg_base64_decode(\"Q2VzYW50YQ==\", 12, buf, sizeof(buf)) == 7);\n  ASSERT(strcmp(buf, \"Cesanta\") == 0);\n\n  ASSERT(mg_base64_decode(\"AAA=\", 4, buf, 0) == 0);\n  ASSERT(mg_base64_decode(\"AAA=\", 4, buf, 1) == 0);\n  ASSERT(mg_base64_decode(\"AAA=\", 4, buf, 2) == 0);\n  ASSERT(mg_base64_decode(\"AAA=\", 4, buf, 3) == 0);\n  ASSERT(mg_base64_decode(\"AAA=\", 4, buf, 4) == 2);\n}\n\nstatic void test_iobuf(void) {\n  struct mg_iobuf io = {0, 0, 0, 10};\n  ASSERT(io.buf == NULL && io.size == 0 && io.len == 0);\n  mg_iobuf_resize(&io, 1);\n  ASSERT(io.buf != NULL && io.size == 10 && io.len == 0);\n  ASSERT(memcmp(io.buf, \"\\x00\", 1) == 0);\n  mg_iobuf_add(&io, 3, \"hi\", 2);\n  ASSERT(io.buf != NULL && io.size == 10 && io.len == 5);\n  ASSERT(memcmp(io.buf, \"\\x00\\x00\\x00hi\", 5) == 0);\n  mg_iobuf_add(&io, io.len, \"!\", 1);\n  ASSERT(io.buf != NULL && io.size == 10 && io.len == 6);\n  ASSERT(memcmp(io.buf, \"\\x00\\x00\\x00hi!\", 6) == 0);\n  mg_iobuf_add(&io, 0, \"x\", 1);\n  ASSERT(memcmp(io.buf, \"x\\x00\\x00\\x00hi!\", 7) == 0);\n  ASSERT(io.buf != NULL && io.size == 10 && io.len == 7);\n  mg_iobuf_del(&io, 1, 3);\n  ASSERT(io.buf != NULL && io.size == 10 && io.len == 4);\n  ASSERT(memcmp(io.buf, \"xhi!\", 3) == 0);\n  mg_iobuf_del(&io, 10, 100);\n  ASSERT(io.buf != NULL && io.size == 10 && io.len == 4);\n  ASSERT(memcmp(io.buf, \"xhi!\", io.len) == 0);\n  mg_iobuf_add(&io, io.len, \"123456\", 6);\n  ASSERT(io.buf != NULL && io.size == 10 && io.len == 10);\n  mg_iobuf_add(&io, io.len, \"a\", 1);\n  ASSERT(io.buf != NULL && io.size == 20 && io.len == 11);\n  ASSERT(memcmp(io.buf, \"xhi!123456a\", io.len) == 0);\n  mg_iobuf_resize(&io, 1);\n  ASSERT(io.buf != NULL && io.size == 10 && io.len == 10);\n  mg_iobuf_free(&io);\n}\n\nstatic void sntp_cb(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_SNTP_TIME) {\n    int64_t received = *(int64_t *) ev_data;\n    *(int64_t *) c->fn_data = received;\n    MG_DEBUG((\"got time: %lld\", received));\n#if MG_ARCH == MG_ARCH_UNIX\n    struct timeval tv = {0, 0};\n    gettimeofday(&tv, 0);\n    int64_t ms = (int64_t) tv.tv_sec * 1000 + tv.tv_usec / 1000;\n    int64_t diff = ms > received ? ms - received : received - ms;\n    MG_DEBUG((\"diff: %lld\", diff));\n    // ASSERT(diff < 100);\n#endif\n  } else if (ev == MG_EV_OPEN) {\n    c->is_hexdumping = 1;\n  }\n  (void) c;\n}\n\nstatic bool test_sntp_server(const char *url) {\n  int64_t ms = 0;\n  struct mg_mgr mgr;\n  struct mg_connection *c = NULL;\n  int i;\n\n  mg_mgr_init(&mgr);\n  c = mg_sntp_connect(&mgr, url, sntp_cb, &ms);\n  ASSERT(c != NULL);\n  ASSERT(c->is_udp == 1);\n  for (i = 0; i < 60 && ms == 0; i++) mg_mgr_poll(&mgr, 50);\n  MG_DEBUG((\"server: %s, ms: %lld\", url ? url : \"(default)\", ms));\n  mg_mgr_free(&mgr);\n  return ms > 0;\n}\n\nstatic void test_sntp(void) {\n  bool result;\n  const unsigned char bad[] =\n      \"\\x55\\x02\\x00\\xeb\\x00\\x00\\x00\\x1e\\x00\\x00\\x07\\xb6\\x3e\\xc9\\xd6\\xa2\"\n      \"\\xdb\\xde\\xea\\x30\\x91\\x86\\xb7\\x10\\xdb\\xde\\xed\\x98\\x00\\x00\\x00\\xde\"\n      \"\\xdb\\xde\\xed\\x99\\x0a\\xe2\\xc7\\x96\\xdb\\xde\\xed\\x99\\x0a\\xe4\\x6b\\xda\";\n\n  ASSERT(mg_sntp_parse(bad, sizeof(bad)) < 0);\n  ASSERT(mg_sntp_parse(NULL, 0) == -1);\n  // NOTE(): historical NTP port blockage issue; expect at least one to be\n  // reachable and work. https://github.com/actions/runner-images/issues/5615\n  result = test_sntp_server(\"udp://time.apple.com:123\") ||\n           test_sntp_server(\"udp://time.windows.com:123\") ||\n           test_sntp_server(NULL);\n#if defined(NO_SNTP_CHECK)\n  (void) result;\n#else\n  ASSERT(result);\n#endif\n}\n\n#ifdef MQTT_LOCALHOST\n#define MQTT_URL \"mqtt://127.0.0.1:1883\"\n#else\n#define MQTT_URL \"mqtt://broker.hivemq.com:1883\"\n#endif\n#if MG_TLS == MG_TLS_BUILTIN\n#define MQTTS_URL \"mqtts://mongoose.ws:8883\"  // test requires TLS 1.3\n#define MQTTS_CA mg_str(s_ca_cert)\nstatic const char *s_ca_cert =\n    \"-----BEGIN CERTIFICATE-----\\n\"\n    \"MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw\\n\"\n    \"TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh\\n\"\n    \"cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4\\n\"\n    \"WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu\\n\"\n    \"ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY\\n\"\n    \"MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc\\n\"\n    \"h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+\\n\"\n    \"0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U\\n\"\n    \"A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW\\n\"\n    \"T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH\\n\"\n    \"B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC\\n\"\n    \"B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv\\n\"\n    \"KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn\\n\"\n    \"OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn\\n\"\n    \"jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw\\n\"\n    \"qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI\\n\"\n    \"rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV\\n\"\n    \"HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq\\n\"\n    \"hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL\\n\"\n    \"ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ\\n\"\n    \"3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK\\n\"\n    \"NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5\\n\"\n    \"ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur\\n\"\n    \"TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC\\n\"\n    \"jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc\\n\"\n    \"oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq\\n\"\n    \"4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA\\n\"\n    \"mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d\\n\"\n    \"emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=\\n\"\n    \"-----END CERTIFICATE-----\\n\";\n#elif MG_TLS\n#ifdef MQTT_LOCALHOST\n#define MQTTS_URL \"mqtts://127.0.0.1:8883\"\n#define MQTTS_CA mg_str(s_ca_cert)\nstatic const char *s_ca_cert =\n    \"-----BEGIN CERTIFICATE-----\\n\"\n    \"MIIBFTCBvAIJAMNTFtpfcq8NMAoGCCqGSM49BAMCMBMxETAPBgNVBAMMCE1vbmdv\\n\"\n    \"b3NlMB4XDTI0MDUwNzE0MzczNloXDTM0MDUwNTE0MzczNlowEzERMA8GA1UEAwwI\\n\"\n    \"TW9uZ29vc2UwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASuP+86T/rOWnGpEVhl\\n\"\n    \"fxYZ+pjMbCmDZ+vdnP0rjoxudwRMRQCv5slRlDK7Lxue761sdvqxWr0Ma6TFGTNg\\n\"\n    \"epsRMAoGCCqGSM49BAMCA0gAMEUCIQCwb2CxuAKm51s81S6BIoy1IcandXSohnqs\\n\"\n    \"us64BAA7QgIgGGtUrpkgFSS0oPBlCUG6YPHFVw42vTfpTC0ySwAS0M4=\\n\"\n    \"-----END CERTIFICATE-----\\n\";\n#else\n#define MQTTS_URL \"mqtts://broker.hivemq.com:8883\"\n#define MQTTS_CA mg_unpacked(\"/data/ca.pem\")\n#endif  // MQTT_LOCALHOST\n#endif\n\nstruct mqtt_data {\n  char *topic;\n  char *msg;\n  size_t topicsize;\n  size_t msgsize;\n  int flags;\n};\n#define flags_subscribed (1 << 0)\n#define flags_published (1 << 1)\n#define flags_received (1 << 2)\n#define flags_released (1 << 3)\n#define flags_completed (1 << 4)\n#define flags_unsubscribed (1 << 5)\n\nstatic void mqtt_cb(struct mg_connection *c, int ev, void *ev_data) {\n  struct mqtt_data *test_data = (struct mqtt_data *) c->fn_data;\n  char *buf = test_data->msg;\n#if MG_TLS\n  if (c->is_tls && ev == MG_EV_CONNECT) {\n    struct mg_tls_opts opts;\n    memset(&opts, 0, sizeof(opts));\n    opts.ca = MQTTS_CA;\n#if defined(MQTT_LOCALHOST) && MG_TLS != MG_TLS_BUILTIN\n    MG_ERROR((\"Hostname not tested\"));\n#else\n    opts.name = mg_url_host(MQTTS_URL);\n#endif\n    mg_tls_init(c, &opts);\n  } else\n#endif\n      if (ev == MG_EV_MQTT_OPEN) {\n    buf[0] = *(int *) ev_data == 0 ? 'X' : 'Y';\n  } else if (ev == MG_EV_CLOSE) {\n    buf[0] = 0;\n  } else if (ev == MG_EV_MQTT_CMD) {\n    struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;\n    if (mm->cmd == MQTT_CMD_SUBACK) {\n      test_data->flags = flags_subscribed;\n    } else if (mm->cmd == MQTT_CMD_PUBACK) {  // here we assume the broker\n      test_data->flags = flags_published;     // reported no errors,\n    } else if (mm->cmd == MQTT_CMD_PUBREC) {  // either no var header or\n      test_data->flags |= flags_received;     // reason code 0x00\n    } else if (mm->cmd == MQTT_CMD_PUBREL) {\n      test_data->flags |= flags_released;\n    } else if (mm->cmd == MQTT_CMD_PUBCOMP) {\n      test_data->flags |= flags_completed;\n    } else if (mm->cmd == MQTT_CMD_UNSUBACK) {\n      test_data->flags = flags_unsubscribed;\n    }\n  } else if (ev == MG_EV_MQTT_MSG) {\n    struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;\n    snprintf(test_data->topic, test_data->topicsize, \"%.*s\",\n             (int) mm->topic.len, mm->topic.buf);\n    snprintf(buf + 1, test_data->msgsize - 2, \"%.*s\", (int) mm->data.len,\n             mm->data.buf);\n\n    if (mm->cmd == MQTT_CMD_PUBLISH && c->is_mqtt5) {\n      size_t pos = 0, i = 0, j = 0;\n      struct mg_mqtt_prop prop;\n\n      for (i = 0; i < 5; i++) {\n        ASSERT((pos = mg_mqtt_next_prop(mm, &prop, pos)) > 0);\n        if (prop.id == MQTT_PROP_MESSAGE_EXPIRY_INTERVAL) {\n          ASSERT(prop.iv == 10);\n          j += 1;\n        } else if (prop.id == MQTT_PROP_PAYLOAD_FORMAT_INDICATOR) {\n          j += 2;\n          continue;\n        } else if (prop.id == MQTT_PROP_CONTENT_TYPE) {\n          ASSERT(strncmp(prop.val.buf, \"test_content_val_2\", prop.val.len) ==\n                     0 &&\n                 prop.val.len == strlen(\"test_content_val_2\"));\n          j += 4;\n        } else if (prop.id == MQTT_PROP_USER_PROPERTY) {\n          if (strncmp(prop.key.buf, \"test_key_1\", prop.key.len) == 0 &&\n              prop.key.len == strlen(\"test_key_1\")) {\n            ASSERT(strncmp(prop.val.buf, \"test_value_1\", prop.val.len) == 0 &&\n                   prop.val.len == strlen(\"test_value_1\"));\n            j += 8;\n          } else if (strncmp(prop.key.buf, \"test_key_2\", prop.key.len) == 0 &&\n                     prop.key.len == strlen(\"test_key_2\")) {\n            ASSERT(strncmp(prop.val.buf, \"test_value_2\", prop.val.len) == 0 &&\n                   prop.val.len == strlen(\"test_value_2\"));\n            j += 16;\n          } else {\n            ASSERT(0);\n          }\n        }\n      }\n      ASSERT((pos = mg_mqtt_next_prop(mm, &prop, pos)) == 0);\n      ASSERT(j == 31);\n    }\n  }\n  (void) c;\n}\n\nstatic void construct_props(struct mg_mqtt_prop *props) {\n  props[0].id = MQTT_PROP_MESSAGE_EXPIRY_INTERVAL;\n  props[0].iv = 10;\n\n  props[1].id = MQTT_PROP_USER_PROPERTY;\n  props[1].key = mg_str(\"test_key_1\");\n  props[1].val = mg_str(\"test_value_1\");\n\n  props[2].id = MQTT_PROP_USER_PROPERTY;\n  props[2].key = mg_str(\"test_key_2\");\n  props[2].val = mg_str(\"test_value_2\");\n\n  props[3].id = MQTT_PROP_CONTENT_TYPE;\n  props[3].val = mg_str(\"test_content_val_2\");\n\n  props[4].id = MQTT_PROP_PAYLOAD_FORMAT_INDICATOR;\n  props[4].iv = 1;\n}\n\nstatic void test_mqtt_base(void);\nstatic void test_mqtt_base(void) {\n  char buf[10] = {0};  // we won't use it\n  struct mqtt_data test_data = {buf, buf, 10, 10, 0};\n  struct mg_mgr mgr;\n  struct mg_connection *c;\n  const char *url = MQTT_URL;\n  int i;\n  mg_mgr_init(&mgr);\n\n  // Ping the client\n  c = mg_mqtt_connect(&mgr, url, NULL, mqtt_cb, &test_data);\n  mg_mqtt_ping(c);\n  for (i = 0; i < 300 && !(c->is_client && !c->is_connecting); i++)\n    mg_mgr_poll(&mgr, 10);\n  ASSERT(c->is_client && !c->is_connecting);\n\n  mg_mgr_free(&mgr);\n  ASSERT(mgr.conns == NULL);\n}\n\nstatic void check_mqtt_message(struct mg_mqtt_opts *opts,\n                               struct mqtt_data *data, bool enforce) {\n  if (opts->topic.len != strlen(data->topic) ||\n      strcmp(opts->topic.buf, data->topic)) {\n    MG_INFO((\"TOPIC[%s]\", data->topic));\n    if (enforce) ASSERT(0);\n  }\n  if (*data->msg != 'X' || opts->message.len != (strlen(&data->msg[1])) ||\n      strcmp(opts->message.buf, &data->msg[1])) {\n    MG_INFO((\"MSG[%s]\", data->msg));\n    if (enforce) ASSERT(0);\n  }\n}\n\n// generate a random string ending in three digits taken from current time\nstatic struct mg_str genstring(char *t, unsigned int sz) {\n  mg_random_str(t, sz - 3);\n  snprintf(t + sz - 4, 4, \"%03u\", (unsigned int) mg_millis() % 1000);\n  return mg_str(t);\n}\n\nstatic void test_mqtt_basic(void) {\n  char tbuf[16], mbuf[50] = {0}, topic[16];\n  struct mqtt_data test_data = {tbuf, mbuf, 16, 50, 0};\n  struct mg_mgr mgr;\n  struct mg_connection *c;\n  struct mg_mqtt_opts opts;\n#if MG_TLS\n  const char *url = MQTTS_URL;\n#else\n  const char *url = MQTT_URL;\n#endif\n  int i, retries;\n\n  // Connect with empty client ID, no options, ergo MQTT = 3.1.1\n  mg_mgr_init(&mgr);\n  c = mg_mqtt_connect(&mgr, url, NULL, mqtt_cb, &test_data);\n  for (i = 0; i < 300 && mbuf[0] == 0; i++) mg_mgr_poll(&mgr, 10);\n  if (mbuf[0] != 'X') MG_INFO((\"[%s]\", mbuf));\n  ASSERT(mbuf[0] == 'X');\n  ASSERT(test_data.flags == 0);\n\n  // Subscribe with QoS1\n  opts.topic = genstring(topic, sizeof(topic));\n  opts.qos = 1;\n  mg_mqtt_sub(c, &opts);\n  for (i = 0; i < 500 && test_data.flags == 0; i++) mg_mgr_poll(&mgr, 10);\n  ASSERT(test_data.flags == flags_subscribed);\n  test_data.flags = 0;\n\n  // Publish with QoS0 to subscribed topic and check reception\n  // keep former opts.topic\n  opts.message = mg_str(\"hi0\"), opts.qos = 0, opts.retain = false;\n  mg_mqtt_pub(c, &opts);\n  for (i = 0; i < 500 && mbuf[1] == 0; i++) mg_mgr_poll(&mgr, 10);\n  ASSERT(!(test_data.flags & flags_published));  // No PUBACK for QoS0\n  check_mqtt_message(&opts, &test_data, false);  // We may not get the msg\n  memset(mbuf + 1, 0, sizeof(mbuf) - 1);\n  test_data.flags = 0;\n\n  // Publish with QoS1 to subscribed topic and check reception\n  // keep former opts.topic\n  opts.message = mg_str(\"hi1\"), opts.qos = 1, opts.retain = false,\n  opts.retransmit_id = 0;\n  retries = 0;  // don't do retries for test speed\n  do {          // retry on failure after an expected timeout\n    opts.retransmit_id = mg_mqtt_pub(c, &opts);  // save id for possible resend\n    for (i = 0; i < 500 && test_data.flags == 0; i++) mg_mgr_poll(&mgr, 10);\n  } while (test_data.flags == 0 && retries--);\n  ASSERT(test_data.flags == flags_published);\n  for (i = 0; i < 500 && mbuf[1] == 0; i++) mg_mgr_poll(&mgr, 10);\n  check_mqtt_message(&opts, &test_data, true);\n  memset(mbuf + 1, 0, sizeof(mbuf) - 1);\n  test_data.flags = 0;\n  opts.retransmit_id = 0;\n\n#if MG_TLS\n  // send more than 1 record, content is not relevant\n  {\n    static char somedata[21098];\n    mg_random(somedata, sizeof(somedata));\n    opts.message = mg_str_n(somedata, sizeof(somedata));\n  }\n  opts.qos = 1, opts.retain = false, opts.retransmit_id = 0;\n  mg_mqtt_pub(c, &opts);\n  tbuf[0] = 0;\n  for (i = 0; i < 1000 && test_data.flags == 0; i++) mg_mgr_poll(&mgr, 10);\n  ASSERT(test_data.flags == flags_published);\n  for (i = 0; i < 1000 && tbuf[0] == 0; i++) mg_mgr_poll(&mgr, 10);\n  ASSERT(tbuf[0] != 0);  // just check we were able to send and receive\n  memset(mbuf + 1, 0, sizeof(mbuf) - 1);\n  test_data.flags = 0;\n  opts.retransmit_id = 0;\n#endif\n\n  // Clean Disconnect !\n  mg_mqtt_disconnect(c, NULL);\n  for (i = 0; i < 10 && mbuf[0] != 0; i++) mg_mgr_poll(&mgr, 10);\n  mg_mgr_free(&mgr);\n  ASSERT(mgr.conns == NULL);\n}\n\nstatic void test_mqtt_ver(uint8_t mqtt_version) {\n  char tbuf[16], mbuf[50] = {0}, client_id[16], topic[16];\n  struct mqtt_data test_data = {tbuf, mbuf, 16, 50, 0};\n  struct mg_mgr mgr;\n  struct mg_connection *c;\n  struct mg_mqtt_opts opts;\n  struct mg_mqtt_prop properties[5];\n  const char *url = MQTT_URL;\n  int i, retries;\n\n  MG_DEBUG((\"ver: %u\", mqtt_version));\n  // Connect with options: version, clean session, last will, keepalive\n  // time. Don't set retain, some runners are not random\n  test_data.flags = 0;\n  memset(mbuf, 0, sizeof(mbuf));\n  memset(&opts, 0, sizeof(opts));\n  mg_mgr_init(&mgr);\n\n  opts.clean = true, opts.qos = 1, opts.retain = false, opts.keepalive = 20;\n  opts.version = mqtt_version;\n  opts.topic = genstring(topic, sizeof(topic));\n  opts.message = mg_str(\"mg_will_messsage\");\n  opts.client_id = genstring(client_id, sizeof(client_id));\n  c = mg_mqtt_connect(&mgr, url, &opts, mqtt_cb, &test_data);\n  for (i = 0; i < 500 && mbuf[0] == 0; i++) mg_mgr_poll(&mgr, 10);\n  if (mbuf[0] != 'X') MG_INFO((\"[%s]\", mbuf));\n  ASSERT(mbuf[0] == 'X');\n  ASSERT(test_data.flags == 0);\n\n  // Subscribe with QoS2 (reception downgrades to published QoS)\n  opts.topic = genstring(topic, sizeof(topic));\n  opts.qos = 2;\n  mg_mqtt_sub(c, &opts);\n  for (i = 0; i < 500 && test_data.flags == 0; i++) mg_mgr_poll(&mgr, 10);\n  ASSERT(test_data.flags == flags_subscribed);\n  test_data.flags = 0;\n\n  // Publish with QoS1 to subscribed topic and check reception\n  // keep former opts.topic\n  opts.message = mg_str(\"hi1\"), opts.qos = 1, opts.retain = false;\n  if (mqtt_version == 5) {\n    opts.props = properties;\n    opts.num_props = 5;\n    construct_props(properties);\n  }\n  retries = 0;  // don't do retries for test speed\n  do {          // retry on failure after an expected timeout\n    opts.retransmit_id = mg_mqtt_pub(c, &opts);  // save id for possible resend\n    for (i = 0; i < 500 && test_data.flags == 0; i++) mg_mgr_poll(&mgr, 10);\n  } while (test_data.flags == 0 && retries--);\n  ASSERT(test_data.flags == flags_published);\n  for (i = 0; i < 500 && mbuf[1] == 0; i++) mg_mgr_poll(&mgr, 10);\n  check_mqtt_message(&opts, &test_data, true);\n  memset(mbuf + 1, 0, sizeof(mbuf) - 1);\n  test_data.flags = 0;\n  opts.retransmit_id = 0;\n\n  // Publish with QoS2 to subscribed topic and check (simultaneous) reception\n  // keep former opts.topic\n  opts.message = mg_str(\"hi2\"), opts.qos = 2, opts.retain = false;\n  if (mqtt_version == 5) {\n    opts.props = properties;\n    opts.num_props = 5;\n    construct_props(properties);\n  }\n  retries = 0;  // don't do retries for test speed\n  do {          // retry on failure after an expected timeout\n    opts.retransmit_id = mg_mqtt_pub(c, &opts);  // save id for possible resend\n    for (i = 0; i < 500 && !(test_data.flags & flags_received); i++)\n      mg_mgr_poll(&mgr, 10);\n  } while (!(test_data.flags & flags_received) && retries--);\n  ASSERT(test_data.flags & flags_received);\n  test_data.flags &= ~flags_received;\n  opts.retransmit_id = 0;\n  // Mongoose sent PUBREL, wait for PUBCOMP\n  for (i = 0; i < 500 && !(test_data.flags & flags_completed); i++)\n    mg_mgr_poll(&mgr, 10);\n  // TODO(): retry sending PUBREL on failure after an expected timeout\n  // or broker sends PUBREC again\n  ASSERT(test_data.flags & flags_completed);\n  for (i = 0; i < 500 && mbuf[1] == 0; i++) mg_mgr_poll(&mgr, 10);\n  check_mqtt_message(&opts, &test_data, true);\n  for (i = 0; i < 500 && !(test_data.flags & flags_released); i++)\n    mg_mgr_poll(&mgr, 10);\n  ASSERT(test_data.flags & flags_released);  // Mongoose sent PUBCOMP\n  memset(mbuf + 1, 0, sizeof(mbuf) - 1);\n  test_data.flags = 0;\n\n  opts.props = 0; opts.num_props = 0;\n  mg_mqtt_unsub(c, &opts);\n  for (i = 0; i < 500 && test_data.flags == 0; i++) mg_mgr_poll(&mgr, 10);\n  ASSERT(test_data.flags == flags_unsubscribed);\n  test_data.flags = 0;\n\n  // dirty disconnect\n  mg_mgr_free(&mgr);\n  ASSERT(mgr.conns == NULL);\n}\n\nstatic void test_mqtt(void) {\n  test_mqtt_base();\n#ifdef NO_MQTT_TESTS\n  MG_ERROR((\"MQTT tests skipped on request\"));\n  (void) test_mqtt_basic, (void) test_mqtt_ver;\n#else\n  test_mqtt_basic();\n  test_mqtt_ver(4);\n  test_mqtt_ver(5);\n#endif\n}\n\nstatic void eh1(struct mg_connection *c, int ev, void *ev_data) {\n  struct mg_tls_opts *topts = (struct mg_tls_opts *) c->fn_data;\n  if (ev == MG_EV_ACCEPT && topts != NULL) mg_tls_init(c, topts);\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    MG_INFO((\"[%.*s %.*s] message len %d\", (int) hm->method.len, hm->method.buf,\n             (int) hm->uri.len, hm->uri.buf, (int) hm->message.len));\n    if (mg_match(hm->uri, mg_str(\"/foo/*\"), NULL)) {\n      mg_http_reply(c, 200, \"\", \"uri: %.*s\", hm->uri.len - 5, hm->uri.buf + 5);\n    } else if (mg_match(hm->uri, mg_str(\"/ws\"), NULL)) {\n      mg_ws_upgrade(c, hm, NULL);\n    } else if (mg_match(hm->uri, mg_str(\"/body\"), NULL)) {\n      mg_http_reply(c, 200, \"\", \"%.*s\", (int) hm->body.len, hm->body.buf);\n    } else if (mg_match(hm->uri, mg_str(\"/bar\"), NULL)) {\n      mg_http_reply(c, 404, \"\", \"not found\");\n    } else if (mg_match(hm->uri, mg_str(\"/no_reason\"), NULL)) {\n      mg_printf(c, \"%s\", \"HTTP/1.0 200\\r\\nContent-Length: 2\\r\\n\\r\\nok\");\n    } else if (mg_match(hm->uri, mg_str(\"/badroot\"), NULL)) {\n      struct mg_http_serve_opts sopts;\n      memset(&sopts, 0, sizeof(sopts));\n      sopts.root_dir = \"/BAAADDD!\";\n      mg_http_serve_dir(c, hm, &sopts);\n    } else if (mg_match(hm->uri, mg_str(\"/creds\"), NULL)) {\n      char user[100], pass[100];\n      mg_http_creds(hm, user, sizeof(user), pass, sizeof(pass));\n      mg_http_reply(c, 200, \"\", \"[%s]:[%s]\", user, pass);\n    } else if (mg_match(hm->uri, mg_str(\"/upload\"), NULL)) {\n      mg_http_upload(c, hm, &mg_fs_posix, \".\", 99999);\n      c->is_hexdumping = 1;\n    } else if (mg_match(hm->uri, mg_str(\"/dirtest/\"), NULL)) {\n      struct mg_http_serve_opts sopts;\n      memset(&sopts, 0, sizeof(sopts));\n      sopts.root_dir = \".\";\n      sopts.extra_headers = \"A: B\\r\\nE: F\\r\\n\";\n      mg_http_serve_dir(c, hm, &sopts);\n    } else if (mg_match(hm->uri, mg_str(\"/servefile\"), NULL)) {\n      struct mg_http_serve_opts sopts;\n      memset(&sopts, 0, sizeof(sopts));\n      sopts.mime_types = \"foo=a/b,txt=c/d\";\n      mg_http_serve_file(c, hm, \"data/a.txt\", &sopts);\n    } else if (mg_match(hm->uri, mg_str(\"/servefile2\"), NULL)) {\n      struct mg_http_serve_opts sopts;\n      memset(&sopts, 0, sizeof(sopts));\n      sopts.mime_types = \"*=a/b,txt=c/d\";\n      mg_http_serve_file(c, hm, \"data/a.txt\", &sopts);\n    } else {\n      struct mg_http_serve_opts sopts;\n      memset(&sopts, 0, sizeof(sopts));\n      sopts.root_dir = \"./data\";\n      sopts.ssi_pattern = \"#.shtml\";\n      sopts.extra_headers = \"C: D\\r\\n\";\n      mg_http_serve_dir(c, hm, &sopts);\n    }\n  } else if (ev == MG_EV_WS_OPEN) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    ASSERT(mg_strcmp(hm->uri, mg_str(\"/ws\")) == 0);\n    mg_ws_send(c, \"opened\", 6, WEBSOCKET_OP_BINARY);\n  } else if (ev == MG_EV_WS_MSG) {\n    struct mg_ws_message *wm = (struct mg_ws_message *) ev_data;\n    mg_ws_send(c, wm->data.buf, wm->data.len, WEBSOCKET_OP_BINARY);\n  }\n}\n\nstruct fetch_data {\n  char *buf;\n  int code, closed;\n};\n\nstatic void fcb(struct mg_connection *c, int ev, void *ev_data) {\n  struct fetch_data *fd = (struct fetch_data *) c->fn_data;\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    snprintf(fd->buf, FETCH_BUF_SIZE, \"%.*s\", (int) hm->message.len,\n             hm->message.buf);\n    fd->code = atoi(hm->uri.buf);\n    fd->closed = 1;\n    c->is_closing = 1;\n    (void) c;\n  } else if (ev == MG_EV_CLOSE) {\n    fd->closed = 1;\n  }\n}\n\nstatic int fetch(struct mg_mgr *mgr, char *buf, const char *url,\n                 const char *fmt, ...) {\n  struct fetch_data fd = {buf, 0, 0};\n  int i;\n  struct mg_connection *c = NULL;\n  va_list ap;\n  c = mg_http_connect(mgr, url, fcb, &fd);\n  ASSERT(c != NULL);\n  if (c != NULL && mg_url_is_ssl(url)) {\n    struct mg_tls_opts opts;\n    memset(&opts, 0, sizeof(opts));  // read CA from packed_fs\n    opts.name = mg_url_host(url);\n    opts.ca = mg_unpacked(\"/data/ca.pem\");\n    if (strstr(url, \"localhost\") != NULL) {\n      // Local connection, use self-signed certificates\n      opts.ca = mg_unpacked(\"/certs/ca.crt\");\n      if (strstr(url, \"23456\") != NULL) {  // hinted from caller\n        opts.cert = mg_unpacked(\"/certs/client.crt\");\n        opts.key = mg_unpacked(\"/certs/client.key\");\n      }\n    }\n    mg_tls_init(c, &opts);\n  }\n  // c->is_hexdumping = 1;\n  va_start(ap, fmt);\n  mg_vprintf(c, fmt, &ap);\n  va_end(ap);\n  buf[0] = '\\0';\n  for (i = 0; i < 100 && buf[0] == '\\0'; i++) mg_mgr_poll(mgr, 1);\n  if (!fd.closed) c->is_closing = 1;\n  mg_mgr_poll(mgr, 1);\n  return fd.code;\n}\n\nstatic struct mg_http_message gethm(const char *buf) {\n  struct mg_http_message hm;\n  memset(&hm, 0, sizeof(hm));\n  mg_http_parse(buf, strlen(buf), &hm);\n  return hm;\n}\n\nstatic int cmpbody(const char *buf, const char *str) {\n  struct mg_str s = mg_str(str);\n  struct mg_http_message hm = gethm(buf);\n  size_t len = strlen(buf);\n  if (hm.body.len > len) hm.body.len = len - (size_t) (hm.body.buf - buf);\n  return mg_strcmp(hm.body, s);\n}\n\nstatic bool cmpheader(const char *buf, const char *name, const char *value) {\n  struct mg_http_message hm = gethm(buf);\n  struct mg_str *h = mg_http_get_header(&hm, name);\n  return h != NULL && mg_strcmp(*h, mg_str(value)) == 0;\n}\n\nstatic void wcb(struct mg_connection *c, int ev, void *ev_data) {\n  int *p = (int *) c->fn_data;\n  if (ev == MG_EV_WS_OPEN) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    struct mg_str *wsproto = mg_http_get_header(hm, \"Sec-WebSocket-Protocol\");\n    ASSERT(wsproto != NULL);\n    mg_ws_send(c, \"hello\", 0, 0);\n    mg_ws_printf(c, WEBSOCKET_OP_BINARY, \"%.3s\", \"boo!!!!\");\n    mg_ws_printf(c, WEBSOCKET_OP_BINARY, \"%s\", \"foobar\");\n    mg_ws_send(c, \"\", 0, WEBSOCKET_OP_PING);\n    p[0] += 100;\n  } else if (ev == MG_EV_WS_MSG) {\n    struct mg_ws_message *wm = (struct mg_ws_message *) ev_data;\n    if (mgstrstr(wm->data, mg_str(\"foobar\")))\n      mg_ws_send(c, \"\", 0, WEBSOCKET_OP_CLOSE);\n    if (mgstrstr(wm->data, mg_str(\"boo\"))) p[0] += 2;\n    if (mgstrstr(wm->data, mg_str(\"foobar\"))) p[0] += 3;\n  } else if (ev == MG_EV_CLOSE) {\n    p[0] += 10;\n  }\n}\n\nstatic void ew2(struct mg_connection *c, int ev, void *ev_data) {\n  size_t size = 65 * 1024 + 737;\n  if (ev == MG_EV_WS_OPEN) {\n    char *msg = (char *) calloc(1, size + 1);\n    memset(msg, 'A', size);\n    mg_ws_printf(c, WEBSOCKET_OP_TEXT, \"%s\", msg);\n    free(msg);\n  } else if (ev == MG_EV_WS_MSG) {\n    struct mg_ws_message *wm = (struct mg_ws_message *) ev_data;\n    if (wm->data.len == 6) {\n      // Ignore the \"opened\" message from server\n    } else {\n      size_t ok = 1, i;\n      ASSERT(wm->data.len == size);\n      for (i = 0; i < size; i++) {\n        if (wm->data.buf[i] != 'A') ok = 0;\n      }\n      ASSERT(ok == 1);\n      *(int *) c->fn_data = 1;\n    }\n  }\n}\n\nstatic void test_ws(void) {\n  char buf[FETCH_BUF_SIZE];\n  const char *url = \"ws://LOCALHOST:12343/ws\";\n  struct mg_mgr mgr;\n  int i, done = 0;\n\n  mg_mgr_init(&mgr);\n  ASSERT(mg_http_listen(&mgr, url, eh1, NULL) != NULL);\n  mg_ws_connect(&mgr, url, wcb, &done, \"%s\", \"Sec-WebSocket-Protocol: meh\\r\\n\");\n  for (i = 0; i < 30; i++) mg_mgr_poll(&mgr, 1);\n  // MG_INFO((\"--> %d\", done));\n  ASSERT(done == 115);\n\n  // Test that non-WS requests fail\n  ASSERT(fetch(&mgr, buf, url, \"GET /ws HTTP/1.0\\r\\n\\n\") == 426);\n\n  // Test large WS frames, over 64k\n  done = 0;\n  mg_ws_connect(&mgr, url, ew2, &done, NULL);\n  for (i = 0; i < 1000 && done == 0; i++) mg_mgr_poll(&mgr, 1);\n  ASSERT(done == 1);\n\n  mg_mgr_free(&mgr);\n  ASSERT(mgr.conns == NULL);\n}\n\nstatic void eh9(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_ERROR) {\n    ASSERT(!strcmp((char *) ev_data, \"socket error\"));\n    *(int *) c->fn_data = 7;\n  }\n  (void) c;\n}\n\nstruct fpr_data {\n  char *buf;\n  int len, reqs, closed;\n};\n\nstatic void fprcb(struct mg_connection *c, int ev, void *ev_data) {\n  struct fpr_data *fd = (struct fpr_data *) c->fn_data;\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    int code = atoi(hm->uri.buf);\n    if (code == 200) {\n      snprintf(fd->buf + fd->len, FETCH_BUF_SIZE - (unsigned int) fd->len,\n               \"%.*s\", (int) hm->message.len, hm->message.buf);\n      fd->len += (int) hm->message.len;\n      ++fd->reqs;\n      if (fd->reqs == 2) {\n        fd->closed = 1;\n        c->is_closing = 1;\n      }\n    } else {  // allow testing for other codes and catching wrong responses\n      MG_INFO((\"reqs: %d, code: %d\", fd->reqs, code));\n      fd->reqs += code;\n    }\n    (void) c;\n  } else if (ev == MG_EV_CLOSE) {\n    fd->closed = 1;\n  }\n}\n\nstatic int fpr(struct mg_mgr *mgr, char *buf, const char *url, const char *fmt,\n               ...) {\n  struct fpr_data fd = {buf, 0, 0, 0};\n  int i;\n  struct mg_connection *c = NULL;\n  va_list ap;\n  c = mg_http_connect(mgr, url, fprcb, &fd);\n  ASSERT(c != NULL);\n  va_start(ap, fmt);\n  mg_vprintf(c, fmt, &ap);\n  va_end(ap);\n  buf[0] = '\\0';\n  for (i = 0; i < 500 && !fd.closed; i++) mg_mgr_poll(mgr, 1);\n  if (!fd.closed) c->is_closing = 1;\n  mg_mgr_poll(mgr, 1);\n  return fd.reqs;\n}\n\nstatic void test_http_server(void) {\n  struct mg_mgr mgr;\n  const char *url = \"http://127.0.0.1:12346\";\n  char buf[FETCH_BUF_SIZE];\n\n  mg_mgr_init(&mgr);\n  mg_http_listen(&mgr, url, eh1, NULL);\n\n  ASSERT(fetch(&mgr, buf, url, \"GET /a.txt HTTP/1.0\\n\\n\") == 200);\n  ASSERT(cmpbody(buf, \"hello\\n\") == 0);\n  ASSERT(cmpheader(buf, \"C\", \"D\"));\n\n  ASSERT(fetch(&mgr, buf, url, \"GET /a.txt HTTP/1.0\\nA:\\tB\\n\\n\") == 200);\n  ASSERT(cmpbody(buf, \"hello\\n\") == 0);\n  ASSERT(cmpheader(buf, \"A\", \"B\") == 0);\n\n  ASSERT(fetch(&mgr, buf, url, \"GET /%%61.txt HTTP/1.0\\n\\n\") == 200);\n  ASSERT(cmpbody(buf, \"hello\\n\") == 0);\n\n  // Invalid header: failure\n  ASSERT(fetch(&mgr, buf, url, \"GET /a.txt HTTP/1.0\\nA B\\n\\n\") == 0);\n\n  // Pipelined requests\n  ASSERT(fpr(&mgr, buf, url,\n             \"GET /foo/bar HTTP/1.1\\n\\nGET /foo/foobar HTTP/1.1\\n\\n\") == 2);\n  // Pipelined requests with file requests other than the last one (see #2796)\n  ASSERT(fpr(&mgr, buf, url,\n             \"GET /a.txt HTTP/1.1\\n\\nGET /a.txt HTTP/1.1\\n\\n\") == 2);\n  /*ASSERT(fpr(&mgr, buf, url,\n             \"HEAD /a.txt HTTP/1.1\\n\\nGET /a.txt HTTP/1.1\\n\\n\") == 2);*/\n  // Connection: close\n  ASSERT(fpr(&mgr, buf, url,\n             \"GET /foo/bar HTTP/1.1\\nConnection: close\\n\\nGET /foo/foobar \"\n             \"HTTP/1.1\\n\\n\") == 1);\n  ASSERT(cmpbody(buf, \"uri: bar\") == 0);\n\n  // Responses with missing reason phrase must also work\n  ASSERT(fetch(&mgr, buf, url, \"GET /no_reason HTTP/1.0\\n\\n\") == 200);\n  ASSERT(cmpbody(buf, \"ok\") == 0);\n\n  // Fetch file with unicode chars in filename\n  ASSERT(fetch(&mgr, buf, url, \"GET /київ.txt HTTP/1.0\\n\\n\") == 200);\n  MG_INFO((\"%s\", buf));\n  ASSERT(cmpbody(buf, \"є\\n\") == 0);\n\n  ASSERT(fetch(&mgr, buf, url, \"GET /../fuzz.c HTTP/1.0\\n\\n\") == 400);\n  ASSERT(fetch(&mgr, buf, url, \"GET /.%%2e/fuzz.c HTTP/1.0\\n\\n\") == 400);\n  ASSERT(fetch(&mgr, buf, url, \"GET /.%%2e%%2ffuzz.c HTTP/1.0\\n\\n\") == 400);\n  ASSERT(fetch(&mgr, buf, url, \"GET /..%%2f%%20fuzz.c HTTP/1.0\\n\\n\") == 400);\n  ASSERT(fetch(&mgr, buf, url, \"GET /..%%2ffuzz.c%%20 HTTP/1.0\\n\\n\") == 400);\n\n  ASSERT(fetch(&mgr, buf, url, \"GET /dredir HTTP/1.0\\n\\n\") == 301);\n  ASSERT(cmpheader(buf, \"Location\", \"/dredir/\"));\n\n  ASSERT(fetch(&mgr, buf, url, \"GET /dredir/ HTTP/1.0\\n\\n\") == 200);\n  ASSERT(cmpbody(buf, \"hi\\n\") == 0);\n\n  ASSERT(fetch(&mgr, buf, url,\n               \"GET /dredirgz/ HTTP/1.0\\n\"\n               \"Accept-Encoding: gzip\\n\\n\") == 200);\n  ASSERT(cmpheader(buf, \"Content-Type\", \"text/html; charset=utf-8\"));\n  ASSERT(cmpheader(buf, \"Content-Encoding\", \"gzip\"));\n\n  ASSERT(fetch(&mgr, buf, url, \"GET /gzip.txt HTTP/1.0\\n\\n\") == 200);\n  ASSERT(cmpbody(buf, \"hi\\n\") == 0);\n  ASSERT(gethm(buf).body.len == 3);\n  ASSERT(cmpheader(buf, \"Content-Encoding\", \"gzip\") == false);\n\n  ASSERT(fetch(&mgr, buf, url,\n               \"GET /gzip.txt HTTP/1.0\\n\"\n               \"Accept-Encoding: foo,gzip\\n\\n\") == 200);\n  mg_hexdump(buf, strlen(buf));\n  ASSERT(cmpheader(buf, \"Content-Encoding\", \"gzip\") == true);\n  ASSERT(gethm(buf).body.len == 23);\n\n  ASSERT(fetch(&mgr, buf, url, \"GET /..ddot HTTP/1.0\\n\\n\") == 400);\n  ASSERT(fetch(&mgr, buf, url, \"GET /..ddot/ HTTP/1.0\\n\\n\") == 400);\n  ASSERT(fetch(&mgr, buf, url,\n               \"GET /a.txt HTTP/1.0\\n\"\n               \"Content-Length: -123\\n\\n\") == 0);\n  ASSERT(fetch(&mgr, buf, url,\n               \"POST /a.txt HTTP/1.0\\n\"\n               \"Content-Length: -123\\n\\n\") == 0);\n  ASSERT(fetch(&mgr, buf, url,\n               \"GET /a.txt HTTP/1.0\\n\"\n               \"Content-Length: 19000000000000000000\\n\\n\") == 0);\n  ASSERT(fetch(&mgr, buf, url,\n               \"POST /a.txt HTTP/1.0\\n\"\n               \"Content-Length: 19000000000000000000\\n\\n\") == 0);\n  ASSERT(fetch(&mgr, buf, url,\n               \"GET /a.txt HTTP/1.0\\n\"\n               \":\\n\"  // truncated header\n               \"Content-Length: 1\\n\\n\") == 0);\n\n  {\n    extern char *mg_http_etag(char *, size_t, size_t, time_t);\n    struct mg_http_message hm;\n    char etag[100];\n    size_t size = 0;\n    time_t mtime = 0;\n    ASSERT(mg_fs_posix.st(\"./data/a.txt\", &size, &mtime) != 0);\n    ASSERT(mg_http_etag(etag, sizeof(etag), size, mtime) == etag);\n    ASSERT(fetch(&mgr, buf, url, \"GET /a.txt HTTP/1.0\\nIf-None-Match: %s\\n\\n\",\n                 etag) == 304);\n    ASSERT(mg_http_parse(buf, strlen(buf), &hm) > 0);\n    MG_INFO((\"%s\", buf));\n    ASSERT(mg_http_get_header(&hm, \"C\") != NULL);\n    ASSERT(mg_strcmp(*mg_http_get_header(&hm, \"C\"), mg_str(\"D\")) == 0);\n  }\n\n  // Text mime type override\n  ASSERT(fetch(&mgr, buf, url, \"GET /servefile HTTP/1.0\\n\\n\") == 200);\n  ASSERT(cmpbody(buf, \"hello\\n\") == 0);\n  {\n    struct mg_http_message hm;\n    struct mg_str *s;\n    mg_http_parse(buf, strlen(buf), &hm);\n    ASSERT((s = mg_http_get_header(&hm, \"Content-Type\")) != NULL);\n    ASSERT(mg_strcmp(*s, mg_str(\"c/d\")) == 0);\n  }\n\n  ASSERT(fetch(&mgr, buf, url, \"GET /servefile2 HTTP/1.0\\n\\n\") == 200);\n  ASSERT(cmpbody(buf, \"hello\\n\") == 0);\n  {\n    struct mg_http_message hm;\n    struct mg_str *s;\n    mg_http_parse(buf, strlen(buf), &hm);\n    ASSERT((s = mg_http_get_header(&hm, \"Content-Type\")) != NULL);\n    ASSERT(mg_strcmp(*s, mg_str(\"a/b\")) == 0);\n  }\n\n  ASSERT(fetch(&mgr, buf, url, \"GET /foo/1 HTTP/1.0\\r\\n\\n\") == 200);\n  // MG_INFO((\"%d %.*s\", (int) hm.len, (int) hm.len, hm.buf));\n  ASSERT(cmpbody(buf, \"uri: 1\") == 0);\n\n  ASSERT(fetch(&mgr, buf, url, \"%s\",\n               \"POST /body HTTP/1.1\\r\\n\"\n               \"Content-Length: 4\\r\\n\\r\\nkuku\") == 200);\n  ASSERT(cmpbody(buf, \"kuku\") == 0);\n\n  ASSERT(fetch(&mgr, buf, url, \"GET /ssi HTTP/1.1\\r\\n\\r\\n\") == 301);\n  ASSERT(fetch(&mgr, buf, url, \"GET /ssi/ HTTP/1.1\\r\\n\\r\\n\") == 200);\n  ASSERT(cmpbody(buf,\n                 \"this is index\\n\"\n                 \"this is nested\\n\\n\"\n                 \"this is f1\\n\\n\\n\\n\"\n                 \"recurse\\n\\n\"\n                 \"recurse\\n\\n\"\n                 \"recurse\\n\\n\"\n                 \"recurse\\n\\n\"\n                 \"recurse\\n\\n\") == 0);\n  {\n    struct mg_http_message hm;\n    mg_http_parse(buf, strlen(buf), &hm);\n    ASSERT(mg_http_get_header(&hm, \"Content-Length\") != NULL);\n    ASSERT(mg_http_get_header(&hm, \"Content-Type\") != NULL);\n    ASSERT(mg_strcmp(*mg_http_get_header(&hm, \"Content-Type\"),\n                     mg_str(\"text/html; charset=utf-8\")) == 0);\n  }\n\n  ASSERT(fetch(&mgr, buf, url, \"GET /badroot HTTP/1.0\\r\\n\\n\") == 404);\n  // ASSERT(cmpbody(buf, \"Invalid web root [/BAAADDD!]\\n\") == 0);\n\n  {\n    struct mg_str data = mg_file_read(&mg_fs_posix, \"./data/ca.pem\");\n    ASSERT(fetch(&mgr, buf, url, \"GET /ca.pem HTTP/1.0\\r\\n\\n\") == 200);\n    ASSERT(cmpbody(buf, data.buf) == 0);\n    mg_free((void *) data.buf);\n  }\n\n  {\n    // Test mime type\n    struct mg_http_message hm;\n    ASSERT(fetch(&mgr, buf, url, \"GET /empty.js HTTP/1.0\\r\\n\\n\") == 200);\n    mg_http_parse(buf, strlen(buf), &hm);\n    ASSERT(mg_http_get_header(&hm, \"Content-Type\") != NULL);\n    ASSERT(mg_strcmp(*mg_http_get_header(&hm, \"Content-Type\"),\n                     mg_str(\"text/javascript; charset=utf-8\")) == 0);\n  }\n\n  {\n    // Test connection refused\n    int i, errored = 0;\n    mg_connect(&mgr, \"tcp://127.0.0.1:55117\", eh9, &errored);\n    // Give it a couple of seconds, see #1605\n    for (i = 0; i < 200 && errored == 0; i++) mg_mgr_poll(&mgr, 10);\n    MG_INFO((\"errored: %d, expected: 7\", errored));\n    ASSERT(errored == 7);\n  }\n\n  // Directory listing\n  fetch(&mgr, buf, url, \"GET /dirtest/ HTTP/1.0\\n\\n\");\n  ASSERT(fetch(&mgr, buf, url, \"GET /dirtest/ HTTP/1.0\\n\\n\") == 200);\n  ASSERT(mgstrstr(mg_str(buf), mg_str(\">Index of /dirtest/<\")) != NULL);\n  ASSERT(mgstrstr(mg_str(buf), mg_str(\">fuzz.c<\")) != NULL);\n  ASSERT(cmpheader(buf, \"A\", \"B\"));\n  ASSERT(!cmpheader(buf, \"C\", \"D\"));\n  ASSERT(cmpheader(buf, \"E\", \"F\"));\n\n  {\n    // Credentials\n    struct mg_http_message hm;\n    ASSERT(fetch(&mgr, buf, url, \"%s\",\n                 \"GET /creds?access_token=x HTTP/1.0\\r\\n\\r\\n\") == 200);\n    mg_http_parse(buf, strlen(buf), &hm);\n    ASSERT(mg_strcmp(hm.body, mg_str(\"[]:[x]\")) == 0);\n\n    ASSERT(fetch(&mgr, buf, url, \"%s\",\n                 \"GET /creds HTTP/1.0\\r\\n\"\n                 \"Authorization: Bearer x\\r\\n\\r\\n\") == 200);\n    mg_http_parse(buf, strlen(buf), &hm);\n    ASSERT(mg_strcmp(hm.body, mg_str(\"[]:[x]\")) == 0);\n\n    ASSERT(fetch(&mgr, buf, url, \"%s\",\n                 \"GET /creds HTTP/1.0\\r\\n\"\n                 \"Authorization: Basic Zm9vOmJhcg==\\r\\n\\r\\n\") == 200);\n    mg_http_parse(buf, strlen(buf), &hm);\n    ASSERT(mg_strcmp(hm.body, mg_str(\"[foo]:[bar]\")) == 0);\n\n    ASSERT(fetch(&mgr, buf, url, \"%s\",\n                 \"GET /creds HTTP/1.0\\r\\n\"\n                 \"Cookie: blah; access_token=hello\\r\\n\\r\\n\") == 200);\n    mg_http_parse(buf, strlen(buf), &hm);\n    ASSERT(mg_strcmp(hm.body, mg_str(\"[]:[hello]\")) == 0);\n  }\n\n  {\n    // Test upload\n    struct mg_str s;\n    remove(\"uploaded.txt\");\n    s = mg_file_read(&mg_fs_posix, \"uploaded.txt\");\n    ASSERT(s.buf == NULL);\n    ASSERT(fetch(&mgr, buf, url,\n                 \"POST /upload HTTP/1.0\\n\"\n                 \"Content-Length: 1\\n\\nx\") == 400);\n\n    ASSERT(fetch(&mgr, buf, url,\n                 \"POST /upload?file=uploaded.txt HTTP/1.0\\r\\n\"\n                 \"Content-Length: 5\\r\\n\"\n                 \"\\r\\nhello\") == 200);\n    ASSERT(fetch(&mgr, buf, url,\n                 \"POST /upload?file=uploaded.txt&offset=5 HTTP/1.0\\r\\n\"\n                 \"Content-Length: 6\\r\\n\"\n                 \"\\r\\n\\nworld\") == 200);\n    s = mg_file_read(&mg_fs_posix, \"uploaded.txt\");\n    ASSERT(s.buf != NULL);\n    ASSERT(strcmp(s.buf, \"hello\\nworld\") == 0);\n    mg_free((void *) s.buf);\n    remove(\"uploaded.txt\");\n  }\n\n  {\n    // Test upload directory traversal\n    struct mg_str s;\n    remove(\"uploaded.txt\");\n    s = mg_file_read(&mg_fs_posix, \"uploaded.txt\");\n    ASSERT(s.buf == NULL);\n    ASSERT(fetch(&mgr, buf, url,\n                 \"POST /upload?file=../uploaded.txt HTTP/1.0\\r\\n\"\n                 \"Content-Length: 5\\r\\n\"\n                 \"\\r\\nhello\") == 400);\n    s = mg_file_read(&mg_fs_posix, \"uploaded.txt\");\n    ASSERT(s.buf == NULL);\n  }\n\n  // HEAD request\n  ASSERT(fetch(&mgr, buf, url, \"GET /a.txt HTTP/1.0\\n\\n\") == 200);\n  ASSERT(fetch(&mgr, buf, url, \"HEAD /a.txt HTTP/1.0\\n\\n\") == 200);\n\n  // Pre-compressed files\n  {\n    struct mg_http_message hm;\n    ASSERT(fetch(&mgr, buf, url,\n                 \"HEAD /hello.txt HTTP/1.0\\n\"\n                 \"Accept-Encoding: gzip\\n\\n\") == 200);\n    mg_http_parse(buf, strlen(buf), &hm);\n    ASSERT(mg_http_get_header(&hm, \"Content-Encoding\") != NULL);\n    ASSERT(mg_strcmp(*mg_http_get_header(&hm, \"Content-Encoding\"),\n                     mg_str(\"gzip\")) == 0);\n  }\n\n#if MG_ENABLE_IPV6\n  {\n    const char *url6 = \"http://[::1]:12366\";\n    ASSERT(mg_http_listen(&mgr, url6, eh1, NULL) != NULL);\n    ASSERT(fetch(&mgr, buf, url6, \"GET /a.txt HTTP/1.0\\n\\n\") == 200);\n    ASSERT(cmpbody(buf, \"hello\\n\") == 0);\n  }\n#endif\n\n  // #2552, reject chunks with no length\n  ASSERT(fetch(&mgr, buf, url,\n               \"POST / HTTP/1.1\\r\\n\"\n               \"Transfer-Encoding: chunked\\r\\n\\r\\n\"\n               \"1\\r\\n\"\n               \"Z\\r\\n\"\n               \"?\\r\\n\"\n               \"\\r\\n\") == 0);\n  ASSERT(fetch(&mgr, buf, url,\n               \"POST / HTTP/1.1\\r\\n\"\n               \"Transfer-Encoding: chunked\\r\\n\\r\\n\"\n               \"1\\r\\n\"\n               \"Z\\r\\n\"\n               \"\\r\\n\"\n               \"\\r\\n\") == 0);\n\n  mg_mgr_free(&mgr);\n  ASSERT(mgr.conns == NULL);\n}\n\nstatic void h4(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    MG_INFO((\"[%.*s %.*s] message len %d\", (int) hm->method.len, hm->method.buf,\n             (int) hm->uri.len, hm->uri.buf, (int) hm->message.len));\n    if (mg_match(hm->uri, mg_str(\"/a/#\"), NULL)) {\n      struct mg_http_serve_opts opts;\n      memset(&opts, 0, sizeof(opts));\n      opts.root_dir = \"/a=./data\";\n      opts.page404 = \"./data/404.html\";  // existing 404 page\n      mg_http_serve_dir(c, hm, &opts);\n    } else if (mg_match(hm->uri, mg_str(\"/b/#\"), NULL)) {\n      struct mg_http_serve_opts opts;\n      memset(&opts, 0, sizeof(opts));\n      opts.root_dir = \"/b=./data\";\n      opts.page404 = \"./data/nooooo.html\";  // non-existing 404 page\n      mg_http_serve_dir(c, hm, &opts);\n    } else {  // null 404 page\n      struct mg_http_serve_opts opts;\n      memset(&opts, 0, sizeof(opts));\n      opts.root_dir = \"./data\";\n      mg_http_serve_dir(c, hm, &opts);\n    }\n  }\n}\n\nstatic void test_http_404(void) {\n  struct mg_mgr mgr;\n  const char *url = \"http://127.0.0.1:22343\";\n  char buf[FETCH_BUF_SIZE];\n\n  mg_mgr_init(&mgr);\n  mg_http_listen(&mgr, url, h4, NULL);\n\n  ASSERT(fetch(&mgr, buf, url, \"GET /a.txt HTTP/1.0\\n\\n\") == 200);\n  ASSERT(cmpbody(buf, \"hello\\n\") == 0);\n  ASSERT(fetch(&mgr, buf, url, \"GET /a/a.txt HTTP/1.0\\n\\n\") == 200);\n  ASSERT(cmpbody(buf, \"hello\\n\") == 0);\n  ASSERT(fetch(&mgr, buf, url, \"GET /b/a.txt HTTP/1.0\\n\\n\") == 200);\n  ASSERT(cmpbody(buf, \"hello\\n\") == 0);\n\n  ASSERT(fetch(&mgr, buf, url, \"GET /xx.txt HTTP/1.0\\n\\n\") == 404);\n  ASSERT(cmpbody(buf, \"Not found\\n\") == 0);\n  ASSERT(fetch(&mgr, buf, url, \"GET /a/xx.txt HTTP/1.0\\n\\n\") == 200);\n  ASSERT(cmpbody(buf, \"boo\\n\") == 0);\n  {  // txt requested, existent 404 is html\n    struct mg_http_message hm;\n    struct mg_str *cl;\n    mg_http_parse(buf, strlen(buf), &hm);\n    cl = mg_http_get_header(&hm, \"Content-Type\");\n    ASSERT(cl != NULL);\n    if (cl->len > 9) cl->len = 9;  // restrict to text/html len max\n    ASSERT(mg_strcmp(*cl, mg_str(\"text/html\")) == 0);\n  }\n  ASSERT(fetch(&mgr, buf, url, \"GET /b/xx.txt HTTP/1.0\\n\\n\") == 404);\n  ASSERT(cmpbody(buf, \"Not found\\n\") == 0);\n\n  mg_mgr_free(&mgr);\n  ASSERT(mgr.conns == NULL);\n}\n\nstatic void test_tls(void) {\n//  return;\n#if MG_TLS\n  struct mg_mgr mgr;\n  struct mg_connection *c;\n  const char *url = \"https://localhost:12347\";\n  char buf[FETCH_BUF_SIZE];\n  struct mg_tls_opts opts;\n  struct mg_str data = mg_unpacked(\"/Makefile\");\n  char bigdata[FETCH_BUF_SIZE - 256];  // leave extra room\n  struct mg_str bd;\n  ASSERT(data.buf != NULL && data.len > 0);\n  memset(&opts, 0, sizeof(opts));\n  opts.cert = mg_unpacked(\"/certs/server.crt\");\n  opts.key = mg_unpacked(\"/certs/server.key\");\n  mg_mgr_init(&mgr);\n  c = mg_http_listen(&mgr, url, eh1, &opts);\n  ASSERT(c != NULL);\n  ASSERT(fetch(&mgr, buf, url, \"GET /a.txt HTTP/1.0\\n\\n\") == 200);\n  // MG_INFO((\"%s\", buf));\n  ASSERT(cmpbody(buf, \"hello\\n\") == 0);\n  // POST a large file, several MSS but less than max TLS record length\n  // make sure we drain TLS buffers and read all, #2619\n  ASSERT(data.len > 3100 && data.len < 16384);  // pick another file on failure\n  ASSERT(fetch(&mgr, buf, url,\n               \"POST /body HTTP/1.0\\n\"\n               \"Content-Length: %lu\\n\\n\"\n               \"%s\",\n               data.len, data.buf) == 200);\n  // /body returns data back, so verify contents (both server and client send\n  // and receive the whole file\n  ASSERT(cmpbody(buf, data.buf) == 0);\n  // repeat with a really large \"file\", several times max TLS record length\n  bd = genstring(bigdata, sizeof(bigdata));\n  ASSERT(fetch(&mgr, buf, url,\n               \"POST /body HTTP/1.0\\n\"\n               \"Content-Length: %lu\\n\\n\"\n               \"%s\",\n               bd.len, bd.buf) == 200);\n  ASSERT(cmpbody(buf, bd.buf) == 0);\n#if MG_TLS == MG_TLS_BUILTIN && defined(__linux__) && MG_ENABLE_CHACHA20  // skip for non-CHACHA tests\n  // fire patched server, test multiple TLS records per TCP segment handling\n  // skip other TLS stacks to avoid \"bad client hello\", we are 1.3 only\n  if (access(\"tls_multirec/server\", X_OK) == 0) {\n    ASSERT(system(\"tls_multirec/server -d tls_multirec &\") == 0);\n    sleep(1);\n    // fetch() needs to loop enough times in order to process all TLS records;\n    // otherwise it will end with 200 and shorter file contents\n    ASSERT(fetch(&mgr, buf, \"https://localhost:8443\",\n                 \"GET /thefile HTTP/1.0\\n\\n\") == 200);\n    ASSERT(cmpbody(buf, data.buf) == 0);  // \"thefile\" links to Makefile\n    ASSERT(system(\"killall tls_multirec/server\") == 0);\n  } else {\n    MG_ERROR(\n        (\"SKIPPED TLS MULTIPLE RECORDS TEST, tls_multirec/server NOT PRESENT\"));\n  }\n#else\n  printf(\n      \"\\n Skipping multiple TLS records per TCP segment handling test, server \"\n      \"is 1.3 only; re-enable when other stacks can be easily configured for \"\n      \"1.3\\n\");\n#endif\n\n  // Repeat the simplest test with two-way authentication\n  opts.ca = mg_unpacked(\"/certs/ca.crt\");  // configure the server for two-way\n  // make it fail: the client will not use 2-way\n  ASSERT(fetch(&mgr, buf, url, \"GET /a.txt HTTP/1.0\\n\\n\") != 200);\n  // make it work\n  mg_mgr_free(&mgr);\n  ASSERT(mgr.conns == NULL);\n  mg_mgr_init(&mgr);\n  url = \"https://localhost:23456\";  // port # hints the client to use two-way\n  c = mg_http_listen(&mgr, url, eh1, &opts);\n  ASSERT(c != NULL);\n  ASSERT(fetch(&mgr, buf, url, \"GET /a.txt HTTP/1.0\\n\\n\") == 200);\n  ASSERT(cmpbody(buf, \"hello\\n\") == 0);\n  mg_mgr_free(&mgr);\n  ASSERT(mgr.conns == NULL);\n#endif\n}\n\nstatic void f3(struct mg_connection *c, int ev, void *ev_data) {\n  int *ok = (int *) c->fn_data;\n  // MG_INFO((\"%d\", ev));\n  if (ev == MG_EV_CONNECT) {\n    // c->is_hexdumping = 1;\n    ASSERT((c->loc.addr.ip[0] !=\n            0));  // Make sure that c->loc address is populated\n    mg_printf(c, \"GET /%s HTTP/1.0\\r\\nHost: %s\\r\\n\\r\\n\",\n              c->rem.is_ip6 ? \"\" : \"/robots.txt\",\n              c->rem.is_ip6 ? \"ipv6.google.com\" : \"cesanta.com\");\n  } else if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    // MG_INFO((\"-->[%.*s]\", (int) hm->message.len, hm->message.buf));\n    // ASSERT(vcmp(hm->method, \"HTTP/1.1\"));\n    // ASSERT(vcmp(hm->uri, \"301\"));\n    *ok = mg_http_status(hm);\n    c->is_closing = 1;\n  } else if (ev == MG_EV_CLOSE) {\n    if (*ok == 0) *ok = 888;\n  } else if (ev == MG_EV_ERROR) {\n    if (*ok == 0) *ok = 777;\n  }\n}\n\nstatic void test_http_client(void) {\n  struct mg_mgr mgr;\n  struct mg_connection *c = NULL;\n  const char *url = \"http://cesanta.com\";\n  int i, ok = 0;\n  struct mg_tls_opts opts;\n  memset(&opts, 0, sizeof(opts));\n  opts.ca = mg_unpacked(\"/data/ca.pem\");\n  opts.name = mg_url_host(url);\n  ASSERT(opts.ca.len > 0);\n  ASSERT(opts.name.len > 0);\n  mg_mgr_init(&mgr);\n  c = mg_http_connect(&mgr, url, f3, &ok);\n  ASSERT(c != NULL);\n  for (i = 0; i < 1000 && ok <= 0; i++) mg_mgr_poll(&mgr, 1);\n  MG_INFO((\"OK: %d\", ok));\n  ASSERT(ok == 301 || ok == 200);\n  mg_mgr_poll(&mgr, 0);\n  ok = 0;\n#if MG_TLS\n  url = \"https://cesanta.com\";\n  opts.name = mg_url_host(url);\n#if MG_TLS == MG_TLS_BUILTIN\n  // our TLS does not search for the proper CA in a bundle\n  opts.ca = mg_file_read(&mg_fs_posix, \"data/e8.crt\");\n#endif\n  c = mg_http_connect(&mgr, url, f3, &ok);\n  ASSERT(c != NULL);\n  mg_tls_init(c, &opts);\n  for (i = 0; i < 1500 && ok <= 0; i++) mg_mgr_poll(&mgr, 1);\n  MG_INFO((\"OK: %d\", ok));\n  ASSERT(ok == 200);\n  mg_mgr_poll(&mgr, 1);\n\n  // Make host validation fail\n  c = mg_http_connect(&mgr, url, f3, &ok);\n  ASSERT(c != NULL);\n  opts.name = mg_str(\"dummy\");  // Set some invalid hostname value\n  mg_tls_init(c, &opts);\n  ok = 0;\n  for (i = 0; i < 500 && ok <= 0; i++) mg_mgr_poll(&mgr, 10);\n  MG_INFO((\"OK: %d\", ok));\n  ASSERT(ok == 777);\n  mg_mgr_poll(&mgr, 1);\n  // Skip host validation\n  c = mg_http_connect(&mgr, url, f3, &ok);\n  ASSERT(c != NULL);\n  opts.name = mg_str(\"\");\n  mg_tls_init(c, &opts);\n  ok = 0;\n  for (i = 0; i < 500 && ok <= 0; i++) mg_mgr_poll(&mgr, 10);\n  MG_INFO((\"OK: %d\", ok));\n  ASSERT(ok == 200);\n  mg_mgr_poll(&mgr, 1);\n  opts.name = mg_url_host(url);\n#if MG_TLS == MG_TLS_BUILTIN\n  mg_free((void *) opts.ca.buf);\n#endif\n\n  // Test empty CA\n  // Disable mbedTLS: https://github.com/Mbed-TLS/mbedtls/issues/7075\n#if MG_TLS != MG_TLS_MBED\n  opts.ca = mg_str(\"\");\n  c = mg_http_connect(&mgr, url, f3, &ok);\n  mg_tls_init(c, &opts);\n  ok = 0;\n  for (i = 0; i < 1000 && ok <= 0; i++) mg_mgr_poll(&mgr, 10);\n  MG_INFO((\"OK: %d\", ok));\n  ASSERT(ok == 200);\n  mg_mgr_poll(&mgr, 1);\n#endif\n#endif\n\n#if MG_ENABLE_IPV6\n  ok = 0;\n  // ipv6.google.com does not have IPv4 address, only IPv6, therefore\n  // it is guaranteed to hit IPv6 resolution path.\n  c = mg_http_connect(&mgr, \"http://ipv6.google.com\", f3, &ok);\n  for (i = 0; i < 500 && ok <= 0; i++) mg_mgr_poll(&mgr, 10);\n  MG_INFO((\"OK: %d\", ok));\n  ASSERT(ok == 200);\n#endif\n\n  mg_mgr_free(&mgr);\n  ASSERT(mgr.conns == NULL);\n}\n\nstatic void f4(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    mg_printf(c, \"HTTP/1.0 200 OK\\n\\n%.*s/%s\", (int) hm->uri.len, hm->uri.buf,\n              \"abcdef\");\n    strcat((char *) c->fn_data, \"m\");\n    c->is_draining = 1;\n  } else if (ev == MG_EV_CLOSE) {\n    strcat((char *) c->fn_data, \"c\");\n  }\n}\n\nstatic void f4c(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_CONNECT) {\n    mg_printf(c, \"GET /foo/bar HTTP/1.0\\n\\n\");\n  } else if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    ASSERT(mg_strcmp(hm->body, mg_str(\"/foo/bar/abcdef\")) == 0);\n    strcat((char *) c->fn_data, \"m\");\n  } else if (ev == MG_EV_CLOSE) {\n    strcat((char *) c->fn_data, \"c\");\n  }\n}\n\nstatic void f41(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    mg_printf(c, \"HTTP/1.0 200 OK\\n\\n%.*s/%s\", (int) hm->uri.len, hm->uri.buf,\n              \"abcdef\");\n  }\n}\n\nstatic void test_http_no_content_length(void) {\n  char buf1[10] = {0}, buf2[10] = {0};\n  char buf[100];\n  struct mg_mgr mgr;\n  const char *url = \"http://127.0.0.1:12348\";\n  const char *url2 = \"http://127.0.0.1:12349\";\n  int i;\n  const char *post_req =\n      \"POST / HTTP/1.1\\r\\nContent-Type:\"\n      \"b/a\\r\\nContent-Length: 15\\r\\n\\r\\n\"\n      \"{\\\"key\\\": \\\"value\\\"}\";\n  mg_mgr_init(&mgr);\n  mg_http_listen(&mgr, url, f4, (void *) buf1);\n  mg_http_connect(&mgr, url, f4c, (void *) buf2);\n  for (i = 0; i < 1000 && strchr(buf2, 'c') == NULL; i++) mg_mgr_poll(&mgr, 10);\n  MG_INFO((\"[%s] [%s]\", buf1, buf2));\n  ASSERT(strcmp(buf1, \"mc\") == 0);\n  ASSERT(strcmp(buf2, \"mc\") == 0);\n  mg_mgr_free(&mgr);\n  // 12348 is in TIME_WAIT, use another port\n  mg_mgr_init(&mgr);\n  mg_http_listen(&mgr, url2, f41, (void *) NULL);\n  ASSERT(fetch(&mgr, buf, url2, \"POST / HTTP/1.1\\r\\n\\r\\n\") == 200);\n  ASSERT(fetch(&mgr, buf, url2, \"HTTP/1.1 200\\r\\n\\r\\n\") == 411);\n  ASSERT(fetch(&mgr, buf, url2, \"HTTP/1.1 100\\r\\n\\r\\n\") != 411);\n  ASSERT(fetch(&mgr, buf, url2, \"HTTP/1.1 304\\r\\n\\r\\n\") != 411);\n  ASSERT(fetch(&mgr, buf, url2, \"HTTP/1.1 305\\r\\n\\r\\n\") == 411);\n  ASSERT(fetch(&mgr, buf, url2, post_req) != 411);\n  mg_mgr_free(&mgr);\n  ASSERT(mgr.conns == NULL);\n}\n\nstatic void f5(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    mg_http_reply(c, 200, \"\", \"%.*s\", (int) hm->uri.len, hm->uri.buf);\n    (*(int *) c->fn_data)++;\n  }\n}\n\nstatic void f6(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    (*(int *) c->fn_data)++;\n    (void) ev_data;\n  }\n}\n\nstatic void test_http_pipeline(void) {\n  struct mg_mgr mgr;\n  const char *url = \"http://127.0.0.1:12377\";\n  struct mg_connection *c;\n  int i, ok = 0, ok2 = 0;\n  mg_mgr_init(&mgr);\n  mg_http_listen(&mgr, url, f5, (void *) &ok);\n  c = mg_http_connect(&mgr, url, f6, &ok2);\n  mg_printf(c, \"POST / HTTP/1.0\\nContent-Length: 5\\n\\n12345GET / HTTP/1.0\\n\\n\");\n  for (i = 0; i < 20; i++) mg_mgr_poll(&mgr, 1);\n  ASSERT(ok == 2);\n  ASSERT(ok2 == 2);\n  // Fire a valid, then invalid request, see #2592. First one should serve\n  ok = ok2 = 0;\n  c = mg_http_connect(&mgr, url, f6, (void *) &ok2);\n  mg_printf(c, \"GET / HTTP/1.1\\n\\nInvalid\\n\\n\");\n  for (i = 0; i < 20; i++) mg_mgr_poll(&mgr, 1);\n  ASSERT(ok == 1);\n  ASSERT(ok2 == 1);\n  // MG_INFO((\"-----> [%d] [%d]\", ok, ok2));\n  mg_mgr_free(&mgr);\n  ASSERT(mgr.conns == NULL);\n}\n\nstatic void test_http_parse(void) {\n  struct mg_str *v;\n  struct mg_http_message req;\n\n  {\n    const char *s = \"GET / HTTP/1.0\\n\\n\";\n    ASSERT(mg_http_parse(\"\\b23\", 3, &req) == -1);\n    ASSERT(mg_http_parse(\"get\\n\\n\", 5, &req) == -1);\n    ASSERT(mg_http_parse(s, strlen(s) - 1, &req) == 0);\n    ASSERT(mg_http_parse(s, strlen(s), &req) == (int) strlen(s));\n    ASSERT(req.message.len == strlen(s));\n    ASSERT(req.body.len == 0);\n  }\n\n  {\n    const char *s = \"GET / \\r\\n\";\n    ASSERT(mg_http_parse(s, strlen(s), &req) == 0);\n  }\n\n  {\n    const char *s = \"GET / invalid\\n\\n\";\n    ASSERT(mg_http_parse(s, strlen(s), &req) == -1);\n  }\n\n  {\n    const char *s = \"GET /blah HTTP/1.0\\r\\nFoo:  bar  \\r\\n\\r\\n\";\n    size_t idx, len = strlen(s);\n    ASSERT(mg_http_parse(s, strlen(s), &req) == (int) len);\n    ASSERT(vcmp(req.headers[0].name, \"Foo\"));\n    ASSERT(vcmp(req.headers[0].value, \"bar\"));\n    ASSERT(req.headers[1].name.len == 0);\n    ASSERT(req.headers[1].name.buf == NULL);\n    ASSERT(req.query.len == 0);\n    ASSERT(req.message.len == len);\n    ASSERT(req.body.len == 0);\n    ASSERT(vcmp(req.method, \"GET\"));\n    ASSERT(vcmp(req.uri, \"/blah\"));\n    ASSERT(vcmp(req.proto, \"HTTP/1.0\"));\n    for (idx = 0; idx < len; idx++) ASSERT(mg_http_parse(s, idx, &req) == 0);\n  }\n\n  {\n    const char *s = \"get b HTTP/1.1\\nb: t\\nv:vv\\n\\n xx\";\n    ASSERT(mg_http_parse(s, strlen(s), &req) == (int) strlen(s) - 3);\n  }\n\n  {\n    const char *s = \"get b HTTP/1.1\\nb: t\\nv:\\n\\n xx\";\n    ASSERT(mg_http_parse(s, strlen(s), &req) == (int) strlen(s) - 3);\n  }\n\n  {\n    const char *s = \"get b HTTP/1.1\\nb: t\\nv v\\n\\n xx\";\n    ASSERT(mg_http_parse(s, strlen(s), &req) == -1);\n  }\n\n  {\n    const char *s = \"get b HTTP/1.1\\nb: t\\n : aa\\n\\n\";\n    ASSERT(mg_http_parse(s, strlen(s), &req) == -1);\n  }\n\n  {\n    const char *s = \"get b HTTP/1.1\\nz:  k \\nb: t\\nv:k\\n\\n xx\";\n    ASSERT(mg_http_parse(s, strlen(s), &req) == (int) strlen(s) - 3);\n    ASSERT(req.headers[3].name.len == 0);\n    ASSERT(vcmp(req.headers[0].name, \"z\"));\n    ASSERT(vcmp(req.headers[0].value, \"k\"));\n    ASSERT(vcmp(req.headers[1].name, \"b\"));\n    ASSERT(vcmp(req.headers[1].value, \"t\"));\n    ASSERT(vcmp(req.headers[2].name, \"v\"));\n    ASSERT(vcmp(req.headers[2].value, \"k\"));\n    ASSERT(req.body.len == 0);\n  }\n\n  // #2292: fail on stray \\r inside the headers\n  ASSERT(mg_http_parse(\"a є\\n\\n\", 6, &req) == 6);\n  ASSERT(mg_http_parse(\"a b\\n\\n\", 5, &req) == 5);\n  ASSERT(mg_http_parse(\"a b\\na:\\n\\n\", 8, &req) > 0);\n  ASSERT(mg_http_parse(\"a b\\na:\\r\\n\\n\", 9, &req) > 0);\n  ASSERT(mg_http_parse(\"a b\\n\\ra:\\r\\n\\n\", 10, &req) == -1);\n  ASSERT(mg_http_parse(\"a b\\na:\\r1\\n\\n\", 10, &req) == -1);\n  ASSERT(mg_http_parse(\"a b\\na: \\r1\\n\\n\", 11, &req) == -1);\n  ASSERT(mg_http_parse(\"a b\\na: \\rb:\\n\\n\", 12, &req) == -1);\n  ASSERT(mg_http_parse(\"a b\\na: \\nb:\\n\\n\", 12, &req) > 0);\n\n  {\n    const char *s = \"ґєт /слеш HTTP/1.0\\nмісто:  кіїв \\n\\n\";\n    ASSERT(mg_http_parse(s, strlen(s), &req) == (int) strlen(s));\n    ASSERT(req.body.len == 0);\n    ASSERT(req.headers[1].name.len == 0);\n    ASSERT(vcmp(req.headers[0].name, \"місто\"));\n    ASSERT(vcmp(req.headers[0].value, \"кіїв\"));\n    ASSERT((v = mg_http_get_header(&req, \"місто\")) != NULL);\n    ASSERT(vcmp(req.method, \"ґєт\"));\n    ASSERT(vcmp(req.uri, \"/слеш\"));\n    ASSERT(vcmp(req.proto, \"HTTP/1.0\"));\n  }\n\n  {\n    const char *s =\n        \"a b HTTP/1.0\\r\\nContent-Length: 21 \\r\\nb: t\\r\\nv:v\\r\\n\\r\\nabc\";\n    ASSERT(mg_http_parse(s, strlen(s), &req) == (int) strlen(s) - 3);\n    ASSERT(req.body.len == 21);\n    ASSERT(req.message.len == 21 - 3 + strlen(s));\n    ASSERT(mg_http_get_header(&req, \"foo\") == NULL);\n    ASSERT((v = mg_http_get_header(&req, \"contENT-Length\")) != NULL);\n    ASSERT(vcmp(*v, \"21\"));\n    ASSERT((v = mg_http_get_header(&req, \"B\")) != NULL);\n    ASSERT(vcmp(*v, \"t\"));\n  }\n\n  {\n    const char *s = \"GET /foo?a=b&c=d HTTP/1.0\\n\\n\";\n    ASSERT(mg_http_parse(s, strlen(s), &req) == (int) strlen(s));\n    ASSERT(vcmp(req.uri, \"/foo\"));\n    ASSERT(vcmp(req.query, \"a=b&c=d\"));\n  }\n\n  {\n    const char *s = \"POST /x HTTP/1.0\\n\\n\";\n    ASSERT(mg_http_parse(s, strlen(s), &req) == (int) strlen(s));\n    ASSERT(req.body.len == 0);\n  }\n\n  {\n    const char *s = \"WOHOO /x HTTP/1.0\\n\\n\";\n    ASSERT(mg_http_parse(s, strlen(s), &req) == (int) strlen(s));\n    ASSERT(req.body.len == 0);\n  }\n\n  {\n    const char *s = \"HTTP/1.0 200 OK\\n\\n\";\n    ASSERT(mg_http_parse(s, strlen(s), &req) == (int) strlen(s));\n    ASSERT(vcmp(req.method, \"HTTP/1.0\"));\n    ASSERT(vcmp(req.uri, \"200\"));\n    ASSERT(vcmp(req.proto, \"OK\"));\n    ASSERT(req.body.len == (size_t) ~0);\n  }\n\n  {\n    static const char *s = \"HTTP/1.0 999 OMGWTFBBQ\\n\\n\";\n    ASSERT(mg_http_parse(s, strlen(s), &req) == (int) strlen(s));\n  }\n\n  {\n    const char *s =\n        \"GET / HTTP/1.0\\r\\nhost:127.0.0.1:18888\\r\\nCookie:\\r\\nX-PlayID: \"\n        \"45455\\r\\nRange:  0-1 \\r\\n\\r\\n\";\n    ASSERT(mg_http_parse(s, strlen(s), &req) == (int) strlen(s));\n    ASSERT((v = mg_http_get_header(&req, \"Host\")) != NULL);\n    ASSERT(vcmp(*v, \"127.0.0.1:18888\"));\n    ASSERT((v = mg_http_get_header(&req, \"Cookie\")) != NULL);\n    ASSERT(v->len == 0);\n    ASSERT((v = mg_http_get_header(&req, \"X-PlayID\")) != NULL);\n    ASSERT(vcmp(*v, \"45455\"));\n    ASSERT((v = mg_http_get_header(&req, \"Range\")) != NULL);\n    ASSERT(vcmp(*v, \"0-1\"));\n  }\n\n  {\n    static const char *s =\n        \"a b HTTP/1.0\\na:1\\nb:2\\nc:3\\nd:4\\ne:5\\nf:6\\ng:7\\nh:8\\n\\n\";\n    ASSERT(mg_http_parse(s, strlen(s), &req) == (int) strlen(s));\n    ASSERT((v = mg_http_get_header(&req, \"e\")) != NULL);\n    ASSERT(vcmp(*v, \"5\"));\n    ASSERT((v = mg_http_get_header(&req, \"g\")) != NULL);\n    ASSERT(vcmp(*v, \"7\"));\n    ASSERT((v = mg_http_get_header(&req, \"h\")) == NULL);  // MG_MAX_HTTP_HEADERS\n  }\n\n  {\n    struct mg_connection c;\n    struct mg_str s,\n        res = mg_str(\"GET /\\r\\nAuthorization: Basic Zm9vOmJhcg==\\r\\n\\r\\n\");\n    memset(&c, 0, sizeof(c));\n    mg_printf(&c, \"%s\", \"GET /\\r\\n\");\n    mg_http_bauth(&c, \"foo\", \"bar\");\n    mg_printf(&c, \"%s\", \"\\r\\n\");\n    s = mg_str_n((char *) c.send.buf, c.send.len);\n    ASSERT(mg_strcmp(s, res) == 0);\n    mg_iobuf_free(&c.send);\n  }\n\n  {\n    struct mg_http_message hm;\n    const char *s = \"GET /foo?bar=baz HTTP/1.0\\n\\n \";\n    ASSERT(mg_http_parse(s, strlen(s), &hm) == (int) strlen(s) - 1);\n    ASSERT(mg_strcmp(hm.uri, mg_str(\"/foo\")) == 0);\n    ASSERT(mg_strcmp(hm.query, mg_str(\"bar=baz\")) == 0);\n  }\n\n  {\n    struct mg_http_message hm;\n    const char *s = \"a b HTTP/1.0\\n\\n\";\n    ASSERT(mg_http_parse(s, strlen(s), &hm) == (int) strlen(s));\n    s = \"a b\\nc:d\\n\\n\";\n    ASSERT(mg_http_parse(s, strlen(s), &hm) == (int) strlen(s));\n    s = \"a\\nb:b\\nc:c\\n\\n\";\n    ASSERT(mg_http_parse(s, strlen(s), &hm) < 0);\n    s = \"a b\\nc: \\xc0\\n\\n\";  // Invalid UTF in the header value: accept\n    ASSERT(mg_http_parse(s, strlen(s), &hm) == (int) strlen(s));\n    ASSERT((v = mg_http_get_header(&hm, \"c\")) != NULL);\n    ASSERT(vcmp(*v, \"\\xc0\"));\n    s = \"a b\\n\\xc0: 2\\n\\n\";  // Invalid UTF in the header name: do NOT accept\n    ASSERT(mg_http_parse(s, strlen(s), &hm) == -1);\n  }\n\n  {\n    struct mg_http_message hm;\n    const char *s;\n    s = \"a b HTTP/1.0\\nd:e\\n\\n\";\n    ASSERT(mg_http_parse(s, strlen(s), &hm) == (int) strlen(s));\n    s = \"a b HTTP/1.0\\nd: e\\n\\n\";\n    ASSERT(mg_http_parse(s, strlen(s), &hm) == (int) strlen(s));\n    s = \"a b HTTP/1.0\\nd:\\te\\n\\n\";\n    ASSERT(mg_http_parse(s, strlen(s), &hm) == (int) strlen(s));\n    s = \"a b HTTP/1.0\\nd:\\t e\\n\\n\";\n    ASSERT(mg_http_parse(s, strlen(s), &hm) == (int) strlen(s));\n    s = \"a b HTTP/1.0\\nd: \\te\\t \\n\\n\";\n    ASSERT(mg_http_parse(s, strlen(s), &hm) == (int) strlen(s));\n    ASSERT(mg_strcmp(hm.headers[0].value, mg_str(\"e\")) == 0);\n  }\n}\n\nstatic void ehr(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    struct mg_http_serve_opts opts;\n    memset(&opts, 0, sizeof(opts));\n    opts.root_dir = \"./data\";\n    mg_http_serve_dir(c, hm, &opts);\n  }\n}\n\nstatic void test_http_range(void) {\n  struct mg_mgr mgr;\n  const char *url = \"http://127.0.0.1:12350\";\n  struct mg_http_message hm;\n  char buf[FETCH_BUF_SIZE];\n\n  mg_mgr_init(&mgr);\n  mg_http_listen(&mgr, url, ehr, NULL);\n\n  ASSERT(fetch(&mgr, buf, url, \"GET /range.txt HTTP/1.0\\n\\n\") == 200);\n  ASSERT(mg_http_parse(buf, strlen(buf), &hm) > 0);\n  ASSERT(hm.body.len == 312);\n\n  fetch(&mgr, buf, url, \"%s\", \"GET /range.txt HTTP/1.0\\nRange: bytes=5-10\\n\\n\");\n  ASSERT(mg_http_parse(buf, strlen(buf), &hm) > 0);\n  printf(\"%s\", buf);\n  ASSERT(mg_strcmp(hm.uri, mg_str(\"206\")) == 0);\n  ASSERT(mg_strcmp(hm.proto, mg_str(\"Partial Content\")) == 0);\n  ASSERT(mg_strcmp(hm.body, mg_str(\" of co\")) == 0);\n  ASSERT(mg_strcmp(*mg_http_get_header(&hm, \"Content-Range\"),\n                   mg_str(\"bytes 5-10/312\")) == 0);\n\n  // Fetch till EOF\n  fetch(&mgr, buf, url, \"%s\", \"GET /range.txt HTTP/1.0\\nRange: bytes=300-\\n\\n\");\n  ASSERT(mg_http_parse(buf, strlen(buf), &hm) > 0);\n  ASSERT(mg_strcmp(hm.uri, mg_str(\"206\")) == 0);\n  ASSERT(mg_strcmp(hm.body, mg_str(\"is disease.\\n\")) == 0);\n  // MG_INFO((\"----%d\\n[%s]\", (int) hm.body.len, buf));\n\n  // Fetch past EOF, must trigger 416 response\n  fetch(&mgr, buf, url, \"%s\", \"GET /range.txt HTTP/1.0\\nRange: bytes=999-\\n\\n\");\n  ASSERT(mg_http_parse(buf, strlen(buf), &hm) > 0);\n  ASSERT(mg_strcmp(hm.uri, mg_str(\"416\")) == 0);\n  ASSERT(hm.body.len == 0);\n  ASSERT(mg_strcmp(*mg_http_get_header(&hm, \"Content-Range\"),\n                   mg_str(\"bytes */312\")) == 0);\n\n  fetch(&mgr, buf, url, \"%s\",\n        \"GET /range.txt HTTP/1.0\\nRange: bytes=0-312\\n\\n\");\n  ASSERT(mg_http_parse(buf, strlen(buf), &hm) > 0);\n  ASSERT(mg_strcmp(hm.uri, mg_str(\"416\")) == 0);\n\n  mg_mgr_free(&mgr);\n  ASSERT(mgr.conns == NULL);\n}\n\nstatic void f1(void *arg) {\n  (*(int *) arg)++;\n}\n\nstatic void test_timer(void) {\n  int v1 = 0, v2 = 0, v3 = 0;\n  struct mg_timer t1, t2, t3, *head = NULL;\n\n  mg_timer_init(&head, &t1, 5, MG_TIMER_REPEAT, f1, &v1);\n  mg_timer_init(&head, &t2, 15, MG_TIMER_ONCE, f1, &v2);\n  mg_timer_init(&head, &t3, 10, MG_TIMER_REPEAT | MG_TIMER_RUN_NOW, f1, &v3);\n\n  ASSERT(head == &t3);\n  ASSERT(head->next == &t2);\n\n  mg_timer_poll(&head, 0);\n  ASSERT(v1 == 0);\n  ASSERT(v2 == 0);\n  ASSERT(v3 == 1);\n\n  mg_timer_poll(&head, 1);\n  ASSERT(v1 == 0);\n  ASSERT(v2 == 0);\n  ASSERT(v3 == 1);\n\n  mg_timer_poll(&head, 5);\n  ASSERT(v1 == 1);\n  ASSERT(v2 == 0);\n  ASSERT(v3 == 1);\n\n  // Simulate long delay - timers must invalidate expiration times\n  mg_timer_poll(&head, 100);\n  ASSERT(v1 == 2);\n  ASSERT(v2 == 1);\n  ASSERT(v3 == 2);\n\n  mg_timer_poll(&head, 107);\n  ASSERT(v1 == 3);\n  ASSERT(v2 == 1);\n  ASSERT(v3 == 2);\n\n  mg_timer_poll(&head, 114);\n  ASSERT(v1 == 4);\n  ASSERT(v2 == 1);\n  ASSERT(v3 == 3);\n\n  mg_timer_poll(&head, 115);\n  ASSERT(v1 == 5);\n  ASSERT(v2 == 1);\n  ASSERT(v3 == 3);\n\n  mg_timer_free(&head, &t2);\n  mg_timer_init(&head, &t2, 3, 0, f1, &v2);\n  ASSERT(head == &t2);\n  ASSERT(head->next == &t3);\n  ASSERT(head->next->next == &t1);\n  ASSERT(head->next->next->next == NULL);\n\n  mg_timer_poll(&head, 120);\n  ASSERT(v1 == 6);\n  ASSERT(v2 == 1);\n  ASSERT(v3 == 4);\n\n  mg_timer_poll(&head, 125);\n  ASSERT(v1 == 7);\n  ASSERT(v2 == 2);\n  ASSERT(v3 == 4);\n\n  // Test millisecond counter wrap - when time goes back.\n  mg_timer_poll(&head, 0);\n  ASSERT(v1 == 7);\n  ASSERT(v2 == 2);\n  ASSERT(v3 == 4);\n\n  mg_timer_poll(&head, 7);\n  ASSERT(v1 == 8);\n  ASSERT(v2 == 2);\n  ASSERT(v3 == 4);\n\n  mg_timer_poll(&head, 11);\n  ASSERT(v1 == 9);\n  ASSERT(v2 == 2);\n  ASSERT(v3 == 5);\n\n  mg_timer_free(&head, &t1);\n  ASSERT(head == &t2);\n  ASSERT(head->next == &t3);\n  ASSERT(head->next->next == NULL);\n\n  mg_timer_free(&head, &t2);\n  ASSERT(head == &t3);\n  ASSERT(head->next == NULL);\n\n  mg_timer_free(&head, &t3);\n  ASSERT(head == NULL);\n\n  // Start a timer, then shift system time a long time back and long time forth\n  v1 = 0;\n  mg_timer_init(&head, &t1, 5, MG_TIMER_REPEAT, f1, &v1);\n  mg_timer_poll(&head, 0);\n  ASSERT(v1 == 0);\n\n  // Shift a long time forth, make sure it ticks\n  mg_timer_poll(&head, 100);\n  ASSERT(v1 == 1);\n  mg_timer_poll(&head, 101);\n  ASSERT(v1 == 1);\n  mg_timer_poll(&head, 102);\n  ASSERT(v1 == 1);\n  mg_timer_poll(&head, 103);\n  ASSERT(v1 == 1);\n  mg_timer_poll(&head, 104);\n  ASSERT(v1 == 1);\n  mg_timer_poll(&head, 105);\n  ASSERT(v1 == 2);\n\n  // Shift a long time back, make sure it ticks\n  mg_timer_poll(&head, 50);\n  ASSERT(v1 == 2);\n  mg_timer_poll(&head, 60);\n  ASSERT(v1 == 3);\n\n  mg_timer_free(&head, &t1);\n  ASSERT(head == NULL);\n\n  // Test proper timer deallocation, see #1539\n  {\n    struct mg_mgr mgr;\n    mg_mgr_init(&mgr);\n    mg_timer_add(&mgr, 1, MG_TIMER_REPEAT, f1, NULL);\n    ASSERT(mgr.timers != NULL);\n    mg_mgr_free(&mgr);\n    ASSERT(mgr.timers == NULL);\n    ASSERT(mgr.conns == NULL);\n  }\n\n  // Test that non-repeating called timers are deleted, see #2768\n  {\n    struct mg_mgr mgr;\n    int arg = 0;\n    mg_mgr_init(&mgr);\n    mg_timer_add(&mgr, 0, MG_TIMER_ONCE, f1, &arg);\n    ASSERT(mgr.timers != NULL);\n    mg_mgr_poll(&mgr, 10);\n    ASSERT(arg == 1);\n    ASSERT(mgr.timers == NULL);\n    mg_mgr_free(&mgr);\n    ASSERT(mgr.timers == NULL);\n    ASSERT(mgr.conns == NULL);\n  }\n}\n\nstatic bool sn(const char *fmt, ...) {\n  char buf[100], tmp[1] = {0}, buf2[sizeof(buf)];\n  size_t n, n2, n1;\n  va_list ap;\n  bool result;\n  va_start(ap, fmt);\n  n = (size_t) vsnprintf(buf2, sizeof(buf2), fmt, ap);\n  va_end(ap);\n  va_start(ap, fmt);\n  n1 = mg_vsnprintf(buf, sizeof(buf), fmt, &ap);\n  va_end(ap);\n  va_start(ap, fmt);\n  n2 = mg_vsnprintf(tmp, 0, fmt, &ap);\n  va_end(ap);\n  result = n1 == n2 && n1 == n && strcmp(buf, buf2) == 0;\n  if (!result)\n    MG_ERROR((\"[%s] -> [%s] != [%s] %d %d %d\\n\", fmt, buf, buf2, (int) n1,\n              (int) n2, (int) n));\n  return result;\n}\n\nstatic bool sccmp(const char *s1, const char *s2, int expected) {\n  int n1 = mg_casecmp(s1, s2);\n  // MG_INFO((\"[%s] [%s] %d %d\", s1, s2, n1, expected));\n  return n1 == expected;\n}\n\nstatic size_t pf1(void (*out)(char, void *), void *ptr, va_list *ap) {\n  int a = va_arg(*ap, int);\n  int b = va_arg(*ap, int);\n  return mg_xprintf(out, ptr, \"%d\", a + b);\n}\n\nstatic size_t pf2(void (*out)(char, void *), void *ptr, va_list *ap) {\n  int cnt = va_arg(*ap, int);\n  size_t n = 0;\n  while (cnt-- > 0) n += mg_xprintf(out, ptr, \"%d\", cnt);\n  return n;\n}\n\nstatic bool chkdbl(struct mg_str s, double val) {\n  double d, tolerance = 1e-14;\n  return mg_json_get_num(s, \"$\", &d) && fabs(val - d) < tolerance;\n}\n\nstatic void test_str(void) {\n  {\n    struct mg_str s = mg_strdup(mg_str(\"a\"));\n    ASSERT(mg_strcmp(s, mg_str(\"a\")) == 0);\n    mg_free((void *) s.buf);\n  }\n\n  {\n    const char *s;\n    struct mg_str a = mg_str(\"hello\"), b = mg_str(\"a\"), c = mg_str(NULL);\n    ASSERT((s = mgstrstr(a, b)) == NULL);\n    ASSERT((s = mgstrstr(a, c)) != NULL);\n    ASSERT(s == a.buf);\n  }\n\n  ASSERT(mg_strcmp(mg_str(\"\"), mg_str(NULL)) == 0);\n  ASSERT(mg_strcmp(mg_str(\"a\"), mg_str(\"b\")) < 0);\n  ASSERT(mg_strcmp(mg_str(\"b\"), mg_str(\"a\")) > 0);\n  ASSERT(mg_strcmp(mg_str(\"hi\"), strstrip(mg_str(\" \\thi\\r\\n\"))) == 0);\n\n  ASSERT(sccmp(\"\", \"\", 0));\n  ASSERT(sccmp(\"\", \"1\", -49));\n  ASSERT(sccmp(\"a\", \"A\", 0));\n  ASSERT(sccmp(\"a1\", \"A\", 49));\n  ASSERT(sccmp(\"a\", \"A1\", -49));\n\n  ASSERT(mg_strcasecmp(mg_str(\"\"), mg_str(NULL)) == 0);\n  ASSERT(mg_strcasecmp(mg_str(\"a\"), mg_str(\"B\")) < 0);\n  ASSERT(mg_strcasecmp(mg_str(\"b\"), mg_str(\"A\")) > 0);\n  ASSERT(mg_strcasecmp(mg_str(\"hi\"), mg_str(\"HI\")) == 0);\n\n  {\n    ASSERT(chkdbl(mg_str_n(\"1.23\", 3), 1.2));\n    ASSERT(chkdbl(mg_str(\"1.23 \"), 1.23));\n    ASSERT(chkdbl(mg_str(\"-0.01 \"), -0.01));\n    ASSERT(chkdbl(mg_str(\"-0.5e2\"), -50.0));\n    ASSERT(chkdbl(mg_str(\"123e-3\"), 0.123));\n  }\n\n  ASSERT(sn(\"%d\", 0));\n  ASSERT(sn(\"%d\", 1));\n  ASSERT(sn(\"%d\", -1));\n  ASSERT(sn(\"%.*s\", 0, \"ab\"));\n  ASSERT(sn(\"%.*s\", 1, \"ab\"));\n  ASSERT(sn(\"%.1s\", \"ab\"));\n  ASSERT(sn(\"%.99s\", \"a\"));\n  ASSERT(sn(\"%11s\", \"a\"));\n  ASSERT(sn(\"%s\", \"a\\0b\"));\n  ASSERT(sn(\"%2s\", \"a\"));\n  ASSERT(sn(\"%.*s\", 3, \"a\\0b\"));\n  ASSERT(sn(\"%d\", 7));\n  ASSERT(sn(\"%d\", 123));\n#if MG_ARCH == MG_ARCH_UNIX\n  ASSERT(sn(\"%lld\", (uint64_t) 0xffffffffff));\n  ASSERT(sn(\"%lld\", (uint64_t) -1));\n  ASSERT(sn(\"%llu\", (uint64_t) -1));\n  ASSERT(sn(\"%llx\", (uint64_t) 0xffffffffff));\n  ASSERT(sn(\"%p\", (void *) (size_t) 7));\n#endif\n  ASSERT(sn(\"%lx\", (unsigned long) 0x6204d754));\n  ASSERT(sn(\"ab\"));\n  ASSERT(sn(\"%dx\", 1));\n  ASSERT(sn(\"%sx\", \"a\"));\n  ASSERT(sn(\"%cx\", 32));\n  ASSERT(sn(\"%x\", 15));\n  ASSERT(sn(\"%2x\", 15));\n  ASSERT(sn(\"%02x\", 15));\n  ASSERT(sn(\"%hx:%hhx\", (short) 1, (char) 2));\n  ASSERT(sn(\"%hx:%hhx\", (short) 1, (char) 2));\n  ASSERT(sn(\"%%\"));\n  ASSERT(sn(\"%x\", 15));\n  ASSERT(sn(\"%#x\", 15));\n  ASSERT(sn(\"%#6x\", 15));\n  ASSERT(sn(\"%#06x\", 15));\n  ASSERT(sn(\"%#-6x\", 15));\n  ASSERT(sn(\"%-2s!\", \"a\"));\n  ASSERT(sn(\"%s %s\", \"a\", \"b\"));\n  ASSERT(sn(\"%s %s\", \"a\", \"b\"));\n  ASSERT(sn(\"ab%dc\", 123));\n  ASSERT(sn(\"%s \", \"a\"));\n  ASSERT(sn(\"%s %s\", \"a\", \"b\"));\n  ASSERT(sn(\"%2s %s\", \"a\", \"b\"));\n  {  // mg_queue_printf()\n    struct mg_queue q;\n    char buf[128];\n    uint32_t p = 0xffffffff;\n    size_t len;\n    mg_queue_init(&q, buf, sizeof(buf));\n    len = mg_queue_printf(&q, \"A%p%p%pB\", p, p, p);\n    ASSERT(len == 32);\n    ASSERT(memcmp(buf + 4, \"A0xffffffff0xffffffff0xffffffffB\", 32) == 0);\n  }\n\n  // Non-standard formatting\n  {\n    char buf[100], *p = NULL;\n    struct mg_iobuf io = {0, 0, 0, 16};\n    const char *expected;\n\n    expected = \"\\\"\\\"\";\n    mg_snprintf(buf, sizeof(buf), \"%m\", mg_print_esc, 0, \"\");\n    ASSERT(strcmp(buf, expected) == 0);\n\n    expected = \"\";\n    mg_snprintf(buf, 1, \"%s\", \"abc\");\n    ASSERT(strcmp(buf, expected) == 0);\n\n    expected = \"a\";\n    mg_snprintf(buf, 2, \"%s\", \"abc\");\n    ASSERT(strcmp(buf, expected) == 0);\n\n    expected = \"\\\"hi, \\\\\\\"\\\"\";\n    mg_snprintf(buf, sizeof(buf), \"\\\"hi, %M\\\"\", mg_print_esc, 0, \"\\\"\");\n    MG_INFO((\"[%s] [%s]\", buf, expected));\n    ASSERT(strcmp(buf, expected) == 0);\n\n    expected = \"\\\"a'b\\\"\";\n    mg_snprintf(buf, sizeof(buf), \"%m\", mg_print_esc, 0, \"a'b\");\n    ASSERT(strcmp(buf, expected) == 0);\n\n    expected = \"\\\"a\\\\b\\\\n\\\\f\\\\r\\\\t\\\\\\\"\\\"\";\n    mg_snprintf(buf, sizeof(buf), \"%m\", mg_print_esc, 0, \"a\\b\\n\\f\\r\\t\\\"\");\n    ASSERT(strcmp(buf, expected) == 0);\n\n    expected = \"\\\"abc\\\"\";\n    mg_snprintf(buf, sizeof(buf), \"%m\", mg_print_esc, 3, \"abcdef\");\n    ASSERT(strcmp(buf, expected) == 0);\n\n    p = mg_mprintf(\"[%s,%M,%s]\", \"null\", pf1, 2, 3, \"hi\");\n    ASSERT(strcmp(p, \"[null,5,hi]\") == 0);\n    mg_free(p);\n\n    p = mg_mprintf(\"[%M,%d]\", pf2, 10, 7);\n    ASSERT(strcmp(p, \"[9876543210,7]\") == 0);\n    mg_free(p);\n\n    mg_xprintf(mg_pfn_iobuf, &io, \"[%M\", pf2, 10);\n    mg_xprintf(mg_pfn_iobuf, &io, \",\");\n    mg_xprintf(mg_pfn_iobuf, &io, \"%d]\", 7);\n    ASSERT(strcmp((char *) io.buf, \"[9876543210,7]\") == 0);\n    mg_iobuf_free(&io);\n  }\n\n  {\n#if MG_ARCH == MG_ARCH_WIN32\n    bool is_windows = true;\n#else\n    bool is_windows = false;\n#endif\n\n#define DBLWIDTH(a, b) a, b\n#define TESTDOUBLE(fmt_, num_, res_)                             \\\n  do {                                                           \\\n    char t1[40] = \"\", t2[40] = \"\";                               \\\n    const char *N = #num_;                                       \\\n    mg_snprintf(t1, sizeof(t1), fmt_, num_);                     \\\n    snprintf(t2, sizeof(t2), fmt_, num_);                        \\\n    printf(\"[%s,%s] : [%s] [%s] [%s]\\n\", fmt_, N, res_, t2, t1); \\\n    ASSERT(strcmp(t1, res_) == 0);                               \\\n    if (!is_windows) ASSERT(strcmp(t1, t2) == 0);                \\\n  } while (0)\n\n#define TESTDOUBLE_NOHOSTCHECK(fmt_, num_, res_)                 \\\n  do {                                                           \\\n    char t1[40] = \"\", t2[40] = \"\";                               \\\n    const char *N = #num_;                                       \\\n    mg_snprintf(t1, sizeof(t1), fmt_, num_);                     \\\n    snprintf(t2, sizeof(t2), fmt_, num_);                        \\\n    printf(\"[%s,%s] : [%s] [%s] [%s]\\n\", fmt_, N, res_, t2, t1); \\\n    ASSERT(strcmp(t1, res_) == 0);                               \\\n  } while (0)\n\n    TESTDOUBLE(\"%g\", 0.0, \"0\");\n    TESTDOUBLE(\"%g\", 0.123, \"0.123\");\n    TESTDOUBLE(\"%g\", 0.00123, \"0.00123\");\n    TESTDOUBLE(\"%g\", 0.123456333, \"0.123456\");\n    TESTDOUBLE(\"%g\", 123.0, \"123\");\n    TESTDOUBLE(\"%g\", 11.5454, \"11.5454\");\n    TESTDOUBLE(\"%g\", 11.0001, \"11.0001\");\n    TESTDOUBLE(\"%g\", 0.999, \"0.999\");\n    TESTDOUBLE(\"%g\", 0.999999, \"0.999999\");\n    TESTDOUBLE(\"%g\", 0.9999999, \"1\");\n    TESTDOUBLE(\"%g\", 10.9, \"10.9\");\n    TESTDOUBLE(\"%g\", 10.01, \"10.01\");\n    TESTDOUBLE(\"%g\", 1.0, \"1\");\n    TESTDOUBLE(\"%g\", 10.0, \"10\");\n    TESTDOUBLE(\"%g\", 100.0, \"100\");\n    TESTDOUBLE(\"%g\", 1000.0, \"1000\");\n    TESTDOUBLE(\"%g\", 10000.0, \"10000\");\n    TESTDOUBLE(\"%g\", 100000.0, \"100000\");\n    TESTDOUBLE(\"%g\", 1000000.0, \"1e+06\");\n    TESTDOUBLE(\"%f\", 1000000.0, \"1000000.000000\");\n    TESTDOUBLE(\"%g\", 10000000.0, \"1e+07\");\n    TESTDOUBLE(\"%f\", 10000000.0, \"10000000.000000\");\n    TESTDOUBLE(\"%g\", 100000001.0, \"1e+08\");\n    TESTDOUBLE(\"%g\", 0.1, \"0.1\");\n    TESTDOUBLE(\"%g\", 0.01, \"0.01\");\n    TESTDOUBLE(\"%g\", 0.001, \"0.001\");\n    TESTDOUBLE(\"%g\", 0.0001, \"0.0001\");\n    TESTDOUBLE_NOHOSTCHECK(\"%g\", 0.00001, \"0.00001\");  // \"1e-05\"\n    TESTDOUBLE(\"%g\", 0.000001, \"1e-06\");\n    TESTDOUBLE(\"%g\", -0.0001, \"-0.0001\");\n    TESTDOUBLE_NOHOSTCHECK(\"%g\", -0.00001, \"-0.00001\");  // \"-1e-05\"\n    TESTDOUBLE(\"%g\", 10.5454, \"10.5454\");\n    TESTDOUBLE(\"%g\", 999999.0, \"999999\");\n    TESTDOUBLE(\"%g\", 9999999.0, \"1e+07\");\n    TESTDOUBLE(\"%g\", 44556677.0, \"4.45567e+07\");\n    TESTDOUBLE(\"%g\", 1234567.2, \"1.23457e+06\");\n    TESTDOUBLE(\"%g\", -987.65432, \"-987.654\");\n    TESTDOUBLE(\"%g\", 0.0000000001, \"1e-10\");\n    TESTDOUBLE(\"%g\", 2.34567e-57, \"2.34567e-57\");\n    TESTDOUBLE(\"%.*g\", DBLWIDTH(7, 9999999.0), \"9999999\");\n    TESTDOUBLE(\"%.*g\", DBLWIDTH(10, 0.123456333), \"0.123456333\");\n    TESTDOUBLE(\"%g\", 123.456222, \"123.456\");\n    TESTDOUBLE(\"%.*g\", DBLWIDTH(10, 123.456222), \"123.456222\");\n    TESTDOUBLE(\"%g\", 600.1234, \"600.123\");\n    TESTDOUBLE(\"%g\", -600.1234, \"-600.123\");\n    TESTDOUBLE(\"%g\", 599.1234, \"599.123\");\n    TESTDOUBLE(\"%g\", -599.1234, \"-599.123\");\n    TESTDOUBLE(\"%g\", 0.14, \"0.14\");\n    TESTDOUBLE(\"%f\", 0.14, \"0.140000\");\n    TESTDOUBLE(\"%.*f\", DBLWIDTH(4, 0.14), \"0.1400\");\n    TESTDOUBLE(\"%.*f\", DBLWIDTH(3, 0.14), \"0.140\");\n    TESTDOUBLE(\"%.*f\", DBLWIDTH(2, 0.14), \"0.14\");\n    TESTDOUBLE(\"%.*f\", DBLWIDTH(2, 25.14), \"25.14\");\n    TESTDOUBLE(\"%.*f\", DBLWIDTH(1, 0.14), \"0.1\");\n    TESTDOUBLE(\"%.*f\", DBLWIDTH(1, 0.19), \"0.2\");\n    TESTDOUBLE(\"%.*f\", DBLWIDTH(1, 0.16), \"0.2\");\n    TESTDOUBLE_NOHOSTCHECK(\"%.1f\", 0.15, \"0.2\");\n    TESTDOUBLE(\"%.3f\", 123.123456789, \"123.123\");\n    TESTDOUBLE(\"%.4f\", 123.123456789, \"123.1235\");\n    TESTDOUBLE(\"%.5f\", 123.1234567, \"123.12346\");\n    TESTDOUBLE_NOHOSTCHECK(\"%.*f\", DBLWIDTH(1, 0.15), \"0.2\");\n    TESTDOUBLE(\"%.5f\", 123.12345, \"123.12345\");\n    TESTDOUBLE(\"%.4f\", 789.01234, \"789.0123\");\n    TESTDOUBLE(\"%2.3f\", 1.23, \"1.230\");\n\n    TESTDOUBLE(\"%.1f\", 1.5, \"1.5\");\n\n    TESTDOUBLE(\"%.3f\", 500.0, \"500.000\");\n    TESTDOUBLE(\"%.1f\", 1.15, \"1.1\");\n    TESTDOUBLE(\"%.1f\", 0.155, \"0.2\");\n    TESTDOUBLE(\"%.1f\", 1.155, \"1.2\");\n    TESTDOUBLE(\"%.1f\", 0.155, \"0.2\");\n    TESTDOUBLE(\"%.2f\", 0.015, \"0.01\");\n    TESTDOUBLE(\"%.2f\", 0.0015, \"0.00\");\n    TESTDOUBLE(\"%.1f\", 0.155, \"0.2\");\n\n    TESTDOUBLE(\"%.3f\", 13.12505, \"13.125\");\n#if MG_ARCH == MG_ARCH_WIN32 && defined(_MSC_VER) && _MSC_VER < 1700\n    // TODO(): for some reason we round down in VC98; skip\n#else\n    TESTDOUBLE(\"%.3f\", 15.1255, \"15.126\");\n    TESTDOUBLE(\"%.3f\", 19.1255, \"19.125\");\n#endif\n    TESTDOUBLE(\"%.4f\", 100.15, \"100.1500\");\n    TESTDOUBLE(\"%.2f\", 5.55, \"5.55\");\n\n#ifndef _WIN32\n    TESTDOUBLE(\"%g\", (double) INFINITY, \"inf\");\n    TESTDOUBLE(\"%g\", (double) -INFINITY, \"-inf\");\n    TESTDOUBLE(\"%g\", (double) NAN, \"nan\");\n#else\n    TESTDOUBLE(\"%g\", HUGE_VAL, \"inf\");\n    TESTDOUBLE(\"%g\", -HUGE_VAL, \"-inf\");\n#endif\n  }\n\n  {\n    const char *expected = \"[\\\"MA==\\\",\\\"MAo=\\\",\\\"MAr+\\\",\\\"MAr+Zw==\\\"]\";\n    char tmp[100], s[] = \"0\\n\\xfeg\";\n    ASSERT(mg_snprintf(tmp, sizeof(tmp), \"[%m,%m,%m,%m]\", mg_print_base64, 1, s,\n                       mg_print_base64, 2, s, mg_print_base64, 3, s,\n                       mg_print_base64, 4, s) == 33);\n    ASSERT(strcmp(tmp, expected) == 0);\n  }\n\n  {\n    const char *expected = \"\\\"002001200220616263\\\"\";\n    char tmp[100], s[] = \"\\x00 \\x01 \\x02 abc\";\n    ASSERT(mg_snprintf(tmp, sizeof(tmp), \"%m\", mg_print_hex, 9, s) == 20);\n    ASSERT(strcmp(tmp, expected) == 0);\n  }\n\n  {\n    char tmp[3];\n    ASSERT(mg_snprintf(tmp, sizeof(tmp), \"%s\", \"0123456789\") == 10);\n    ASSERT(strcmp(tmp, \"01\") == 0);\n    ASSERT(tmp[2] == '\\0');\n  }\n\n  {\n    char buf[100];\n    struct mg_addr a;\n    uint32_t addr = mg_htonl(0x2000001);\n    memcpy(a.addr.ip, &addr, sizeof(uint32_t));\n    a.port = mg_htons(3);\n    a.is_ip6 = false;\n\n    ASSERT(mg_snprintf(buf, sizeof(buf), \"%M %d\", mg_print_ip, &a, 7) == 9);\n    ASSERT(strcmp(buf, \"2.0.0.1 7\") == 0);\n    ASSERT(mg_snprintf(buf, sizeof(buf), \"%M %d\", mg_print_ip_port, &a, 7) ==\n           11);\n    ASSERT(strcmp(buf, \"2.0.0.1:3 7\") == 0);\n\n    memset(a.addr.ip, 0, sizeof(a.addr.ip));\n    a.addr.ip[0] = 1, a.addr.ip[1] = 100, a.addr.ip[2] = 33;\n    a.is_ip6 = true;\n    ASSERT(mg_snprintf(buf, sizeof(buf), \"%M %d\", mg_print_ip, &a, 7) == 24);\n    ASSERT(strcmp(buf, \"[164:2100:0:0:0:0:0:0] 7\") == 0);\n    ASSERT(mg_snprintf(buf, sizeof(buf), \"%M %d\", mg_print_ip_port, &a, 7) ==\n           26);\n    ASSERT(strcmp(buf, \"[164:2100:0:0:0:0:0:0]:3 7\") == 0);\n  }\n\n  ASSERT(mg_path_is_sane(mg_str(\".\")) == true);\n  ASSERT(mg_path_is_sane(mg_str(\"\")) == true);\n  ASSERT(mg_path_is_sane(mg_str(\"a.b\")) == true);\n  ASSERT(mg_path_is_sane(mg_str(\"a..b\")) == true);\n  ASSERT(mg_path_is_sane(mg_str(\".a\")) == true);\n  ASSERT(mg_path_is_sane(mg_str(\".a.\")) == true);\n  ASSERT(mg_path_is_sane(mg_str(\"./\")) == true);\n  ASSERT(mg_path_is_sane(mg_str(\"a..\")) == true);\n  ASSERT(mg_path_is_sane(mg_str(\"././a..\")) == true);\n  ASSERT(mg_path_is_sane(mg_str(\"..\")) == false);\n  ASSERT(mg_path_is_sane(mg_str(\"../\")) == false);\n  ASSERT(mg_path_is_sane(mg_str(\"./..\")) == false);\n  ASSERT(mg_path_is_sane(mg_str(\"a/../\")) == false);\n  ASSERT(mg_path_is_sane(mg_str(\"a/../b\")) == false);\n  ASSERT(mg_path_is_sane(mg_str_n(\"a/..\", 2)) == true);\n  ASSERT(mg_path_is_sane(mg_str_n(\"a/../b\", 2)) == true);\n}\n\nstatic void fn1(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_ERROR) {\n    mg_free(*(char **) c->fn_data);  // See #2263\n    *(char **) c->fn_data = mg_mprintf(\"%s\", (char *) ev_data);\n  }\n  (void) c;\n}\n\nstatic void test_dns_error(const char *dns_server_url, const char *errstr) {\n  // Test timeout\n  struct mg_mgr mgr;\n  char *buf = NULL;\n  int i;\n  mg_mgr_init(&mgr);\n  mgr.dns4.url = dns_server_url;\n  mgr.dnstimeout = 10;\n  MG_DEBUG((\"opening dummy DNS listener @ [%s]...\", dns_server_url));\n  mg_listen(&mgr, mgr.dns4.url, NULL, NULL);  // Just discard our queries\n  mg_http_connect(&mgr, \"http://google.com\", fn1, &buf);\n  for (i = 0; i < 50 && buf == NULL; i++) mg_mgr_poll(&mgr, 1);\n  mg_mgr_free(&mgr);\n  // MG_DEBUG((\"buf: [%s] [%s]\", buf, errstr));\n  ASSERT(buf != NULL && strcmp(buf, errstr) == 0);\n  mg_free(buf);\n}\n\nstatic void test_dns(void) {\n  struct mg_dns_message dm;\n  //       txid  flags numQ  numA  numAP numOP\n  // 0000  00 01 81 80 00 01 00 01 00 00 00 00 07 63 65 73  .............ces\n  // 0010  61 6e 74 61 03 63 6f 6d 00 00 01 00 01 c0 0c 00  anta.com........\n  // 0020  01 00 01 00 00 02 57 00 04 94 fb 36 ec           ......W....6.\n  uint8_t data[] = {0,    1,    0x81, 0x80, 0,    1,    0,    1,    0,\n                    0,    0,    0,    7,    0x63, 0x65, 0x73, 0x61, 0x6e,\n                    0x74, 0x61, 0x03, 0x63, 0x6f, 0x6d, 0,    0,    1,\n                    0,    1,    0xc0, 0x0c, 0,    1,    0,    1,    0,\n                    0,    2,    0x57, 0,    4,    0x94, 0xfb, 0x36, 0xec};\n  ASSERT(mg_dns_parse(NULL, 0, &dm) == 0);\n  ASSERT(mg_dns_parse(data, sizeof(data), &dm) == 1);\n  ASSERT(strcmp(dm.name, \"cesanta.com\") == 0);\n  data[30] = 29;  // Point a pointer to itself\n  memset(&dm, 0, sizeof(dm));\n  ASSERT(mg_dns_parse(data, sizeof(data), &dm) == 1);\n  ASSERT(strcmp(dm.name, \"\") == 0);\n\n  {\n    // 0000  00 01 81 80 00 01 00 04 00 00 00 00 05 79 61 68  .............yah\n    // 0010  6f 6f 05 63 31 31 32 36 03 63 6f 6d 00 00 01 00  oo.c1126.com....\n    // 0020  01 c0 0c 00 05 00 01 00 00 0d 34 00 0c 03 77 77  ..........4...ww\n    // 0030  77 05 79 61 68 6f 6f c0 18 c0 2d 00 05 00 01 00  w.yahoo...-.....\n    // 0040  00 00 01 00 14 0b 6e 65 77 2d 66 70 2d 73 68 65  ......new-fp-she\n    // 0050  64 03 77 67 31 01 62 c0 31 c0 45 00 01 00 01 00  d.wg1.b.1.E.....\n    // 0060  00 00 0a 00 04 57 f8 64 d8 c0 45 00 01 00 01 00  .....W.d..E.....\n    // 0070  00 00 0a 00 04 57 f8 64 d7                       .....W.d.\n    uint8_t d[] = {\n        0x00, 0x01, 0x81, 0x80, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00,\n        0x00, 0x05, 0x79, 0x61, 0x68, 0x6f, 0x6f, 0x05, 0x63, 0x31, 0x31,\n        0x32, 0x36, 0x03, 0x63, 0x6f, 0x6d, 0x00, 0x00, 0x01, 0x00, 0x01,\n        0xc0, 0x0c, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x0d, 0x34, 0x00,\n        0x0c, 0x03, 0x77, 0x77, 0x77, 0x05, 0x79, 0x61, 0x68, 0x6f, 0x6f,\n        0xc0, 0x18, 0xc0, 0x2d, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00,\n        0x01, 0x00, 0x14, 0x0b, 0x6e, 0x65, 0x77, 0x2d, 0x66, 0x70, 0x2d,\n        0x73, 0x68, 0x65, 0x64, 0x03, 0x77, 0x67, 0x31, 0x01, 0x62, 0xc0,\n        0x31, 0xc0, 0x45, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0a,\n        0x00, 0x04, 0x57, 0xf8, 0x64, 0xd8, 0xc0, 0x45, 0x00, 0x01, 0x00,\n        0x01, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x04, 0x57, 0xf8, 0x64, 0xd7,\n    };\n    ASSERT(mg_dns_parse(d, sizeof(d), &dm) == 1);\n    // MG_INFO((\"[%s]\", dm.name));\n    ASSERT(strcmp(dm.name, \"new-fp-shed.wg1.b.yahoo.com\") == 0);\n  }\n\n  {\n    // DNS Query for domain abc.local\n    // 0000   00 00 00 00 00 01 00 00 00 00 00 00 03 61 62 63   .............abc\n    // 0010   05 6c 6f 63 61 6c 00 00 01 00 01                  .local.....\n    uint8_t d[] = {\n        0x00, 0x00,                          // txid: 0\n        0x00, 0x00,                          // flags: 0 (Query flag = 0)\n        0x00, 0x01,                          // numQuestions: 1\n        0x00, 0x00,                          // numAnswers: 1\n        0x00, 0x00, 0x00, 0x00,              // additional RRs\n        0x03, 0x61, 0x62, 0x63,              // \"abc\"\n        0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c,  // \"local\"\n        0x00, 0x00, 0x01, 0x00, 0x01         // domain end, type, class\n    };\n    memset(&dm, 0, sizeof(dm));\n    ASSERT(mg_dns_parse(d, sizeof(d), &dm) == 1);\n    ASSERT(dm.resolved == false);\n    ASSERT(strcmp(dm.name, \"abc.local\") == 0);\n  }\n\n  test_dns_error(\"udp://127.0.0.1:12345\", \"DNS timeout\");\n  test_dns_error(\"\", \"resolver\");\n  test_dns_error(\"tcp://0.0.0.0:0\", \"DNS error\");\n}\n\nstatic void test_util(void) {\n  const char *e;\n  char buf[100], *s;\n  struct mg_addr a;\n  uint64_t ipv3;\n  uint8_t d64[8] = {0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef};\n  uint32_t ipv4;\n  uint16_t port;\n  struct mg_str data;\n  memset(&a, 0xa5, sizeof(a));\n  ASSERT(mg_file_printf(&mg_fs_posix, \"data.txt\", \"%s\", \"hi\") == true);\n  // if (system(\"ls -l\") != 0) (void) 0;\n  data = mg_file_read(&mg_fs_posix, \"data.txt\");\n  ASSERT(data.buf != NULL);\n  ASSERT(strcmp(data.buf, \"hi\") == 0);\n  mg_free((void *) data.buf);\n  remove(\"data.txt\");\n  ASSERT(mg_aton(mg_str(\"0\"), &a) == false);\n  ASSERT(mg_aton(mg_str(\"0.0.0.\"), &a) == false);\n  ASSERT(mg_aton(mg_str(\"0.0.0.256\"), &a) == false);\n  ASSERT(mg_aton(mg_str(\"0.0.0.-1\"), &a) == false);\n  ASSERT(mg_aton(mg_str(\"127.0.0.1\"), &a) == true);\n  ASSERT(a.is_ip6 == false);\n  memcpy(&ipv4, &a.addr.ip4, sizeof(ipv4));\n  ASSERT(ipv4 == mg_htonl(0x7f000001));\n  ASSERT(mg_ntohl(ipv4) == 0x7f000001);\n  MG_STORE_BE32(&ipv4, 0x5678abcd);\n  ASSERT(((uint8_t *) &ipv4)[0] == 0x56 && ((uint8_t *) &ipv4)[1] == 0x78 &&\n         ((uint8_t *) &ipv4)[2] == 0xab && ((uint8_t *) &ipv4)[3] == 0xcd);\n  ASSERT(MG_LOAD_BE32(&ipv4) == 0x5678abcd);\n  MG_STORE_BE16(&port, 0x1234);\n  ASSERT(((uint8_t *) &port)[0] == 0x12 && ((uint8_t *) &port)[1] == 0x34);\n  ASSERT(MG_LOAD_BE16(&port) == 0x1234);\n  ASSERT(port == mg_htons(0x1234));\n  ASSERT(mg_ntohs(port) == 0x1234);\n  MG_STORE_BE24(&ipv4, 0xef2345);\n  ASSERT(((uint8_t *) &ipv4)[0] == 0xef && ((uint8_t *) &ipv4)[1] == 0x23 &&\n         ((uint8_t *) &ipv4)[2] == 0x45);\n  ASSERT(MG_LOAD_BE24(&ipv4) == 0xef2345);\n\n  memcpy(&ipv3, d64, sizeof(ipv3));\n#if defined(_MSC_VER) && _MSC_VER < 1700\n  // VC98 doesn't suppport LL suffix\n#else\n  ASSERT(ipv3 == mg_htonll(0x1234567890abcdefLL));\n  ASSERT(mg_ntohll(ipv3) == 0x1234567890abcdefLL);\n#endif\n  MG_STORE_BE64(&ipv3, 0x5678abcd12349ef0);\n  ASSERT(((uint8_t *) &ipv3)[0] == 0x56 && ((uint8_t *) &ipv3)[1] == 0x78 &&\n         ((uint8_t *) &ipv3)[2] == 0xab && ((uint8_t *) &ipv3)[3] == 0xcd &&\n         ((uint8_t *) &ipv3)[4] == 0x12 && ((uint8_t *) &ipv3)[5] == 0x34 &&\n         ((uint8_t *) &ipv3)[6] == 0x9e && ((uint8_t *) &ipv3)[7] == 0xf0);\n  ASSERT(MG_LOAD_BE64(&ipv3) == 0x5678abcd12349ef0);\n\n  memset(a.addr.ip, 0xa5, sizeof(a.addr.ip)), a.is_ip6 = false;\n  ASSERT(mg_aton(mg_str(\"1:2:3:4:5:6:7:8\"), &a) == true);\n  ASSERT(a.is_ip6 == true);\n  e = \"\\x00\\x01\\x00\\x02\\x00\\x03\\x00\\x04\\x00\\x05\\x00\\x06\\x00\\x07\\x00\\x08\";\n  ASSERT(memcmp(&a.addr.ip6, e, sizeof(a.addr.ip6)) == 0);\n\n  memset(a.addr.ip, 0xa5, sizeof(a.addr.ip)), a.is_ip6 = false;\n  ASSERT(mg_aton(mg_str(\"1:2::3\"), &a) == true);\n  ASSERT(a.is_ip6 == true);\n  e = \"\\x00\\x01\\x00\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x03\";\n  ASSERT(memcmp(&a.addr.ip6, e, sizeof(a.addr.ip6)) == 0);\n\n  memset(a.addr.ip, 0xaa, sizeof(a.addr.ip)), a.is_ip6 = false;\n  ASSERT(mg_aton(mg_str(\"1::1\"), &a) == true);\n  ASSERT(a.is_ip6 == true);\n  e = \"\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\";\n  ASSERT(memcmp(&a.addr.ip6, e, sizeof(a.addr.ip6)) == 0);\n\n  memset(a.addr.ip, 0xaa, sizeof(a.addr.ip)), a.is_ip6 = false;\n  ASSERT(mg_aton(mg_str(\"::fFff:1.2.3.4\"), &a) == true);\n  ASSERT(a.is_ip6 == true);\n  e = \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\xff\\xff\\x01\\x02\\x03\\x04\";\n  ASSERT(memcmp(&a.addr.ip6, e, sizeof(a.addr.ip6)) == 0);\n\n  memset(a.addr.ip, 0xaa, sizeof(a.addr.ip)), a.is_ip6 = false;\n  ASSERT(mg_aton(mg_str(\"::1\"), &a) == true);\n  ASSERT(a.is_ip6 == true);\n  ASSERT(a.scope_id == 0);\n  e = \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01\";\n  ASSERT(memcmp(&a.addr.ip6, e, sizeof(a.addr.ip6)) == 0);\n\n  memset(a.addr.ip, 0xaa, sizeof(a.addr.ip)), a.is_ip6 = false;\n  ASSERT(mg_aton(mg_str(\"1::\"), &a) == true);\n  ASSERT(a.is_ip6 == true);\n  e = \"\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\";\n  ASSERT(memcmp(&a.addr.ip6, e, sizeof(a.addr.ip6)) == 0);\n\n  memset(a.addr.ip, 0xaa, sizeof(a.addr.ip)), a.is_ip6 = false;\n  ASSERT(mg_aton(mg_str(\"2001:4860:4860::8888\"), &a) == true);\n  ASSERT(a.is_ip6 == true);\n  e = \"\\x20\\x01\\x48\\x60\\x48\\x60\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x88\\x88\";\n  ASSERT(memcmp(&a.addr.ip6, e, sizeof(a.addr.ip6)) == 0);\n\n  ASSERT(mg_url_decode(\"a=%\", 3, buf, sizeof(buf), 0) < 0);\n  ASSERT(mg_url_decode(\"&&&a=%\", 6, buf, sizeof(buf), 0) < 0);\n  ASSERT(mg_url_decode(\"a=%1\", 4, buf, sizeof(buf), 0) < 0);\n  ASSERT(mg_url_decode(\"a=%12\", 5, buf, sizeof(buf), 0) == 3 && buf[2] == 0x12);\n  ASSERT(mg_url_decode(\"a=%123\", 6, buf, sizeof(buf), 0) == 4 &&\n         buf[2] == 0x12 && buf[3] == '3');\n\n  memset(&a, 0, sizeof(a));\n  ASSERT(mg_aton(mg_str(\"::1%1\"), &a) == true);\n  ASSERT(a.is_ip6 == true);\n  ASSERT(a.scope_id == 1);\n\n  memset(&a, 0, sizeof(a));\n  ASSERT(mg_aton(mg_str(\"abcd::aabb:ccdd%17\"), &a) == true);\n  ASSERT(a.is_ip6 == true);\n  ASSERT(a.scope_id == 17);\n\n  memset(&a, 0xaa, sizeof(a)), a.is_ip6 = false;\n  ASSERT(mg_aton(mg_str(\"::1%17\"), &a) == true);\n  ASSERT(a.is_ip6 == true);\n  ASSERT(a.scope_id == 17);\n\n  memset(&a, 0xaa, sizeof(a)), a.is_ip6 = false;\n  ASSERT(mg_aton(mg_str(\"::1%255\"), &a) == true);\n  ASSERT(a.is_ip6 == true);\n  ASSERT(a.scope_id == 255);\n\n  {\n    size_t n;\n    ASSERT((n = mg_url_encode(\"\", 0, buf, sizeof(buf))) == 0);\n    ASSERT((n = mg_url_encode(\"a\", 1, buf, 0)) == 0);\n    ASSERT((n = mg_url_encode(\"a\", 1, buf, sizeof(buf))) == 1);\n    ASSERT(strncmp(buf, \"a\", n) == 0);\n    ASSERT((n = mg_url_encode(\"._-~\", 4, buf, sizeof(buf))) == 4);\n    ASSERT(strncmp(buf, \"._-~\", n) == 0);\n    ASSERT((n = mg_url_encode(\"a@%>\", 4, buf, sizeof(buf))) == 10);\n    ASSERT(strncmp(buf, \"a%40%25%3e\", n) == 0);\n    ASSERT((n = mg_url_encode(\"a@b.c\", 5, buf, sizeof(buf))) == 7);\n    ASSERT(strncmp(buf, \"a%40b.c\", n) == 0);\n  }\n\n  {\n    s = mg_mprintf(\"%3d\", 123);\n    ASSERT(strcmp(s, \"123\") == 0);\n    mg_free(s);\n  }\n\n  {\n    extern bool mg_to_size_t(struct mg_str, size_t *);\n    size_t val, max = (size_t) -1;\n    ASSERT(mg_to_size_t(mg_str(\"0\"), &val) && val == 0);\n    ASSERT(mg_to_size_t(mg_str(\"123\"), &val) && val == 123);\n    ASSERT(mg_to_size_t(mg_str(\" 123 \\t\"), &val) && val == 123);\n    ASSERT(mg_to_size_t(mg_str(\"\"), &val) == false);\n    ASSERT(mg_to_size_t(mg_str(\" 123x\"), &val) == false);\n    ASSERT(mg_to_size_t(mg_str(\"-\"), &val) == false);\n    mg_snprintf(buf, sizeof(buf), sizeof(max) == 8 ? \"%llu\" : \"%lu\", max);\n    ASSERT(mg_to_size_t(mg_str(buf), &val) && val == max);\n  }\n\n  {\n    uint64_t val, max = (uint64_t) -1;\n    ASSERT(mg_str_to_num(mg_str(\"0\"), 10, &val, sizeof(uint64_t)) && val == 0);\n    ASSERT(mg_str_to_num(mg_str(\"123\"), 10, &val, sizeof(uint64_t)) &&\n           val == 123);\n    ASSERT(mg_str_to_num(mg_str(\" 123\"), 10, &val, sizeof(uint64_t)) == false);\n    ASSERT(mg_str_to_num(mg_str(\"123 \"), 10, &val, sizeof(uint64_t)) == false);\n    ASSERT(mg_str_to_num(mg_str(\"\"), 10, &val, sizeof(uint64_t)) == false);\n    ASSERT(mg_str_to_num(mg_str(\" 123x\"), 10, &val, sizeof(uint64_t)) == false);\n    ASSERT(mg_str_to_num(mg_str(\"-\"), 10, &val, sizeof(uint64_t)) == false);\n    mg_snprintf(buf, sizeof(buf), \"%llu\", max);\n    ASSERT(mg_str_to_num(mg_str(buf), 10, &val, sizeof(uint64_t)) &&\n           val == max);\n    ASSERT(mg_str_to_num(mg_str(\"0\"), 2, &val, sizeof(uint64_t)) && val == 0);\n    ASSERT(mg_str_to_num(mg_str(\"1\"), 2, &val, sizeof(uint64_t)) && val == 1);\n    ASSERT(mg_str_to_num(mg_str(\"0123\"), 2, &val, sizeof(uint64_t)) == false);\n    ASSERT(mg_str_to_num(mg_str(\"123\"), 2, &val, sizeof(uint64_t)) == false);\n    ASSERT(mg_str_to_num(mg_str(\"01111011\"), 2, &val, sizeof(uint64_t)) &&\n           val == 123);\n    ASSERT(mg_str_to_num(mg_str(\"1111111111111111111111111111111111111111111111\"\n                                \"111111111111111111\"),\n                         2, &val, sizeof(uint64_t)) &&\n           val == max);\n    ASSERT(mg_str_to_num(mg_str(\"0\"), 16, &val, sizeof(uint64_t)) && val == 0);\n    ASSERT(mg_str_to_num(mg_str(\"123\"), 16, &val, sizeof(uint64_t)) &&\n           val == 0x123);\n    ASSERT(mg_str_to_num(mg_str(\"def\"), 16, &val, sizeof(uint64_t)) &&\n           val == 0xdef);\n    ASSERT(mg_str_to_num(mg_str(\"defg\"), 16, &val, sizeof(uint64_t)) == false);\n    mg_snprintf(buf, sizeof(buf), \"%llx\", max);\n    ASSERT(mg_str_to_num(mg_str(buf), 16, &val, sizeof(uint64_t)) &&\n           val == max);\n    ASSERT(mg_str_to_num(mg_str(\"0x123\"), 0, &val, sizeof(uint64_t)) &&\n           val == 0x123);\n    ASSERT(mg_str_to_num(mg_str(\"0b123\"), 0, &val, sizeof(uint64_t)) == false);\n    ASSERT(mg_str_to_num(mg_str(\"0c123\"), 0, &val, sizeof(uint64_t)) == false);\n    ASSERT(mg_str_to_num(mg_str(\"0b101\"), 0, &val, sizeof(uint64_t)) &&\n           val == 5);\n    ASSERT(mg_str_to_num(mg_str(\"0123\"), 0, &val, sizeof(uint64_t)) &&\n           val == 123);\n  }\n  {\n    uint32_t val, max = (uint32_t) -1;\n    ASSERT(mg_str_to_num(mg_str(\"123\"), 10, &val, sizeof(uint32_t)) &&\n           val == 123);\n    mg_snprintf(buf, sizeof(buf), \"%lu\", (unsigned long) max);\n    ASSERT(strcmp(buf, \"4294967295\") == 0);\n    ASSERT(mg_str_to_num(mg_str(buf), 10, &val, sizeof(uint32_t)) &&\n           val == max);\n    ASSERT(mg_str_to_num(mg_str(\"01111011\"), 2, &val, sizeof(uint32_t)) &&\n           val == 123);\n    ASSERT(mg_str_to_num(mg_str(\"11111111111111111111111111111111\"), 2, &val,\n                         sizeof(uint32_t)) &&\n           val == max);\n    ASSERT(mg_str_to_num(mg_str(\"0\"), 16, &val, sizeof(uint32_t)) && val == 0);\n    ASSERT(mg_str_to_num(mg_str(\"123\"), 16, &val, sizeof(uint32_t)) &&\n           val == 0x123);\n    mg_snprintf(buf, sizeof(buf), \"%lx\", max);\n    ASSERT(mg_str_to_num(mg_str(buf), 16, &val, sizeof(uint32_t)) &&\n           val == max);\n  }\n  {\n    uint16_t val, max = (uint16_t) -1;\n    ASSERT(mg_str_to_num(mg_str(\"123\"), 10, &val, sizeof(uint16_t)) &&\n           val == 123);\n    mg_snprintf(buf, sizeof(buf), \"%u\", max);\n    ASSERT(mg_str_to_num(mg_str(buf), 10, &val, sizeof(uint16_t)) &&\n           val == max);\n    ASSERT(mg_str_to_num(mg_str(\"01111011\"), 2, &val, sizeof(uint16_t)) &&\n           val == 123);\n    ASSERT(\n        mg_str_to_num(mg_str(\"1111111111111111\"), 2, &val, sizeof(uint16_t)) &&\n        val == max);\n    ASSERT(mg_str_to_num(mg_str(\"123\"), 16, &val, sizeof(uint16_t)) &&\n           val == 0x123);\n    mg_snprintf(buf, sizeof(buf), \"%x\", max);\n    ASSERT(mg_str_to_num(mg_str(buf), 16, &val, sizeof(uint16_t)) &&\n           val == max);\n  }\n  {\n    uint8_t val, max = (uint8_t) -1;\n    ASSERT(mg_str_to_num(mg_str(\"123\"), 10, &val, sizeof(uint8_t)) &&\n           val == 123);\n    mg_snprintf(buf, sizeof(buf), \"%u\", max);\n    ASSERT(mg_str_to_num(mg_str(buf), 10, &val, sizeof(uint8_t)) && val == max);\n    ASSERT(mg_str_to_num(mg_str(\"01111011\"), 2, &val, sizeof(uint8_t)) &&\n           val == 123);\n    ASSERT(mg_str_to_num(mg_str(\"11111111\"), 2, &val, sizeof(uint8_t)) &&\n           val == max);\n    ASSERT(mg_str_to_num(mg_str(\"12\"), 16, &val, sizeof(uint8_t)) &&\n           val == 0x12);\n    mg_snprintf(buf, sizeof(buf), \"%x\", max);\n    ASSERT(mg_str_to_num(mg_str(buf), 16, &val, sizeof(uint8_t)) && val == max);\n  }\n\n  {\n    size_t i;\n    memset(buf, ' ', sizeof(buf));\n    mg_random_str(buf, 0);\n    ASSERT(buf[0] == ' ');\n    mg_random_str(buf, 1);\n    ASSERT(buf[0] == '\\0');\n    ASSERT(buf[1] == ' ');\n    mg_random_str(buf, sizeof(buf));\n    ASSERT(buf[sizeof(buf) - 1] == '\\0');\n    for (i = 0; i < sizeof(buf) - 1; i++) ASSERT(isalnum((uint8_t) buf[i]));\n  }\n}\n\nstatic void test_crc32(void) {\n  //  echo -n aaa | cksum -o3\n  ASSERT(mg_crc32(0, 0, 0) == 0);\n  ASSERT(mg_crc32(0, \"a\", 1) == 3904355907);\n  ASSERT(mg_crc32(0, \"abc\", 3) == 891568578);\n  ASSERT(mg_crc32(mg_crc32(0, \"ab\", 2), \"c\", 1) == 891568578);\n}\n\nstatic void us(struct mg_connection *c, int ev, void *ev_data) {\n  struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n  if (ev == MG_EV_HTTP_MSG && mg_match(hm->uri, mg_str(\"/upload\"), NULL)) {\n    MG_DEBUG((\"Got all %lu bytes!\", (unsigned long) hm->body.len));\n    MG_DEBUG((\"Query string: [%.*s]\", (int) hm->query.len, hm->query.buf));\n    // MG_DEBUG((\"Body:\\n%.*s\", (int) hm->body.len, hm->body.buf));\n    mg_http_reply(c, 200, \"\", \"ok (%d %.*s)\\n\", (int) hm->body.len,\n                  (int) hm->body.len, hm->body.buf);\n  } else if (ev == MG_EV_HTTP_MSG) {\n    mg_http_reply(c, 200, \"\", \"ok\\n\");\n  }\n}\n\nstatic void uc(struct mg_connection *c, int ev, void *ev_data) {\n  const char **s = (const char **) c->fn_data;\n  if (ev == MG_EV_OPEN) {\n    // c->is_hexdumping = 1;\n  } else if (ev == MG_EV_CONNECT) {\n    mg_printf(c,\n              \"POST /upload HTTP/1.0\\r\\n\"\n              \"Transfer-Encoding: chunked\\r\\n\\r\\n\");\n    mg_http_printf_chunk(c, \"%s\", \"foo\\n\");\n    mg_http_printf_chunk(c, \"%s\", \"bar\\n\");\n    mg_http_printf_chunk(c, \"\");\n  } else if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    // MG_INFO((\"---> [%s] [%.*s]\", *s, hm->body.len, hm->body.buf));\n    ASSERT(mg_strcmp(hm->body, mg_str(*s)) == 0);\n    *s = NULL;\n  }\n}\n\nstatic void test_http_upload(void) {\n  struct mg_mgr mgr;\n  const char *url = \"http://127.0.0.1:12352\";\n  int i;\n  const char *s = \"ok (8 foo\\nbar\\n)\\n\";\n\n  mg_mgr_init(&mgr);\n  mg_http_listen(&mgr, url, us, NULL);\n  mg_http_connect(&mgr, url, uc, (void *) &s);\n  for (i = 0; i < 20; i++) mg_mgr_poll(&mgr, 5);\n  ASSERT(s == NULL);\n  mg_mgr_free(&mgr);\n  ASSERT(mgr.conns == NULL);\n}\n\n#define LONG_CHUNK \"chunk with length taking up more than two hex digits\"\n\nstatic void eX(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    mg_printf(c, \"HTTP/1.1 200 OK\\r\\nTransfer-Encoding: chunked\\r\\n\\r\\n\");\n    c->data[0] = 1;\n    // c->is_hexdumping = 1;\n  } else if (ev == MG_EV_POLL && c->data[0] != 0) {\n    c->data[0]++;\n    if (c->data[0] == 10) mg_http_printf_chunk(c, \"a\");\n    if (c->data[0] == 20) {\n      mg_http_printf_chunk(c, \"b\");\n      mg_http_printf_chunk(c, \"c\");\n    }\n    if (c->data[0] == 30) {\n      mg_http_printf_chunk(c, \"d\");\n      mg_http_printf_chunk(c, \"\");\n      c->data[0] = 0;\n    }\n  }\n  (void) ev_data;\n}\n\nstatic void eY(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    mg_printf(c, \"HTTP/1.1 200 OK\\r\\nContent-Length: 4\\r\\n\\r\\n\");\n    c->data[0] = 1;\n  } else if (ev == MG_EV_POLL && c->data[0] != 0) {\n    c->data[0]++;\n    if (c->data[0] == 10) mg_send(c, \"a\", 1);\n    if (c->data[0] == 12) mg_send(c, \"bc\", 2);\n    if (c->data[0] == 30) mg_send(c, \"d\", 1), c->is_resp = 0, c->data[0] = 0;\n  }\n  (void) ev_data;\n}\n\nstatic void eZ(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    mg_http_reply(c, 200, \"\", \"abcd\");\n  }\n  (void) ev_data;\n}\n\nstatic void eS(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    ASSERT(mg_send(c, \"NADA\", 0));\n    mg_http_reply(c, 200, \"\", \"abcd\");\n  }\n  (void) ev_data;\n}\n\n// Do not delete chunks as they arrive\nstatic void eh4(struct mg_connection *c, int ev, void *ev_data) {\n  uint32_t *crc = (uint32_t *) c->fn_data;\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    *crc = mg_crc32(*crc, hm->body.buf, hm->body.len);\n    MG_INFO((\"%lu M [%.*s]\", c->id, (int) hm->body.len, hm->body.buf));\n  }\n}\n\nstatic void test_http_chunked_case(mg_event_handler_t s, mg_event_handler_t c,\n                                   int req_count, const char *expected) {\n  char url[100];\n  struct mg_mgr mgr;\n  uint32_t i, crc = 0, expected_crc = mg_crc32(0, expected, strlen(expected));\n  struct mg_connection *conn;\n  static uint16_t port = 32344;  // To prevent bind errors on Windows\n  mg_snprintf(url, sizeof(url), \"http://127.0.0.1:%d\", port++);\n  mg_mgr_init(&mgr);\n  mg_http_listen(&mgr, url, s, NULL);\n  conn = mg_http_connect(&mgr, url, c, &crc);\n  while (conn != NULL && req_count-- > 0) {\n    mg_printf(conn, \"GET / HTTP/1.0\\n\\n\");\n  }\n  for (i = 0; i < 100 && crc != expected_crc; i++) {\n    mg_mgr_poll(&mgr, 1);\n  }\n  // MG_INFO((\"-------- %d [%s]\", i, expected));\n  ASSERT(i < 100);\n  ASSERT(crc == expected_crc);\n  mg_mgr_free(&mgr);\n  ASSERT(mgr.conns == NULL);\n}\n\nstatic void test_http_chunked(void) {\n  // test mg_send allows calls with 0 length\n  test_http_chunked_case(eS, eh4, 1, \"abcd\");\n\n  // Non-chunked encoding\n  test_http_chunked_case(eY, eh4, 1, \"abcd\");  // Chunks not deleted\n  test_http_chunked_case(eY, eh4, 2, \"abcdabcd\");\n  test_http_chunked_case(eZ, eh4, 1, \"abcd\");  // Not deleted\n  test_http_chunked_case(eZ, eh4, 2, \"abcdabcd\");\n\n  // Chunked encoding\n  test_http_chunked_case(eX, eh4, 1, \"abcd\");  // Chunks not deleted\n  test_http_chunked_case(eX, eh4, 2, \"abcdabcd\");\n}\n\nstatic void test_invalid_listen_addr(void) {\n  struct mg_mgr mgr;\n  struct mg_connection *c;\n  mg_mgr_init(&mgr);\n  c = mg_http_listen(&mgr, \"invalid:31:14\", eh1, NULL);\n  ASSERT(c == NULL);\n  mg_mgr_free(&mgr);\n  ASSERT(mgr.conns == NULL);\n}\n\nstruct stream_status {\n  uint32_t polls;\n  size_t sent;\n  size_t received;\n  uint32_t send_crc;\n  uint32_t recv_crc;\n};\n\n// Consume recv buffer after letting it reach MG_MAX_RECV_SIZE\nstatic void eh8(struct mg_connection *c, int ev, void *ev_data) {\n  struct stream_status *status = (struct stream_status *) c->fn_data;\n  if (c->is_listening) return;\n\n  ASSERT(c->recv.len <= MG_MAX_RECV_SIZE);\n\n  if (ev == MG_EV_ACCEPT) {\n    // Optimize recv buffer size near max to speed up test\n    mg_iobuf_resize(&c->recv, MG_MAX_RECV_SIZE - MG_IO_SIZE);\n    status->received = 0;\n    status->recv_crc = 0;\n  }\n\n  if (ev == MG_EV_CLOSE) {\n    ASSERT(status->received == status->sent);\n  }\n\n  // Let buffer fill up and start consuming after 10 full buffer poll events\n  if (status->polls >= 10 && ev == MG_EV_POLL) {\n    // consume at most a third of MG_MAX_RECV_SIZE on each poll\n    size_t consume;\n    if (MG_MAX_RECV_SIZE / 3 >= c->recv.len)\n      consume = c->recv.len;\n    else\n      consume = MG_MAX_RECV_SIZE / 3;\n    status->received += consume;\n    status->recv_crc =\n        mg_crc32(status->recv_crc, (const char *) c->recv.buf, consume);\n    mg_iobuf_del(&c->recv, 0, consume);\n  }\n\n  // count polls with full buffer to ensure c->is_full prevents reads\n  if (ev == MG_EV_POLL && c->recv.len == MG_MAX_RECV_SIZE) status->polls += 1;\n  (void) ev_data;\n}\n\n// Toggle c->is_full to prevent max_recv_buf_size reached read errors\nstatic void eh10(struct mg_connection *c, int ev, void *ev_data) {\n  if (c->recv.len >= MG_MAX_RECV_SIZE && ev == MG_EV_READ) c->is_full = true;\n\n  eh8(c, ev, ev_data);\n\n  if (c->recv.len < MG_MAX_RECV_SIZE && ev == MG_EV_POLL) c->is_full = false;\n}\n\n// Send buffer larger than MG_MAX_RECV_SIZE to server\nstatic void eh11(struct mg_connection *c, int ev, void *ev_data) {\n  struct stream_status *status = (struct stream_status *) c->fn_data;\n  if (ev == MG_EV_CONNECT) {\n    size_t len = MG_MAX_RECV_SIZE * 2;\n    struct mg_iobuf buf = {NULL, 0, 0, 0};\n    mg_iobuf_init(&buf, len, 0);\n    mg_random(buf.buf, buf.size);\n    buf.len = buf.size;\n    mg_send(c, buf.buf, buf.len);\n    status->sent = buf.len;\n    status->send_crc = mg_crc32(0, (const char *) buf.buf, buf.len);\n    mg_iobuf_free(&buf);\n  }\n  (void) ev_data;\n}\n\nstatic void test_http_stream_buffer(void) {\n  struct mg_mgr mgr;\n  const char *url = \"tcp://127.0.0.1:12344\";\n  uint32_t i;\n  struct stream_status status;\n  mg_mgr_init(&mgr);\n  mg_listen(&mgr, url, eh10, &status);\n\n  status.polls = 0;\n  mg_connect(&mgr, url, eh11, &status);\n  for (i = 0; i < (MG_MAX_RECV_SIZE / MG_IO_SIZE) * 50; i++) {\n    mg_mgr_poll(&mgr, 1);\n    if (status.polls >= 10 && status.sent == status.received) break;\n  }\n  ASSERT(status.sent == status.received);\n  ASSERT(status.send_crc == status.recv_crc);\n\n  mg_mgr_free(&mgr);\n  ASSERT(mgr.conns == NULL);\n}\n\nstatic void test_multipart(void) {\n  struct mg_http_part part;\n  size_t ofs;\n  const char *s =\n      \"--xyz\\r\\n\"\n      \"Content-Disposition: form-data; name=\\\"val\\\"\\r\\n\"\n      \"\\r\\n\"\n      \"abc\\r\\ndef\\r\\n\"\n      \"--xyz\\r\\n\"\n      \"Content-Disposition: form-data; name=\\\"foo\\\"; filename=\\\"a b.txt\\\"\\r\\n\"\n      \"Content-Type: text/plain\\r\\n\"\n      \"\\r\\n\"\n      \"hello world\\r\\n\"\n      \"\\r\\n\"\n      \"--xyz--\\r\\n\";\n  ASSERT(mg_http_next_multipart(mg_str(\"\"), 0, NULL) == 0);\n  ASSERT((ofs = mg_http_next_multipart(mg_str(s), 0, &part)) > 0);\n  ASSERT(mg_strcmp(part.name, mg_str(\"val\")) == 0);\n  // MG_INFO((\"--> [%.*s]\", (int) part.body.len, part.body.buf));\n  ASSERT(mg_strcmp(part.body, mg_str(\"abc\\r\\ndef\")) == 0);\n  ASSERT(part.filename.len == 0);\n  ASSERT((ofs = mg_http_next_multipart(mg_str(s), ofs, &part)) > 0);\n  ASSERT(mg_strcmp(part.name, mg_str(\"foo\")) == 0);\n  // MG_INFO((\"--> [%.*s]\", (int) part.filename.len, part.filename.buf));\n  ASSERT(mg_strcmp(part.filename, mg_str(\"a b.txt\")) == 0);\n  ASSERT(mg_strcmp(part.body, mg_str(\"hello world\\r\\n\")) == 0);\n  ASSERT(mg_http_next_multipart(mg_str(s), ofs, &part) == 0);\n}\n\nstatic void eh7(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    struct mg_http_serve_opts sopts;\n    memset(&sopts, 0, sizeof(sopts));\n    sopts.root_dir = \"/\";\n    sopts.fs = &mg_fs_packed;\n    mg_http_serve_dir(c, hm, &sopts);\n  }\n}\n\nstatic void test_packed(void) {\n  struct mg_mgr mgr;\n  const char *url = \"http://127.0.0.1:12351\";\n  char buf[FETCH_BUF_SIZE];\n  struct mg_str data = mg_file_read(&mg_fs_posix, \"Makefile\");\n  mg_mgr_init(&mgr);\n  mg_http_listen(&mgr, url, eh7, NULL);\n\n  // Load top level file directly\n  // fetch(&mgr, buf, url, \"GET /Makefile HTTP/1.0\\n\\n\");\n  // printf(\"---> %s\\n\", buf);\n  ASSERT(fetch(&mgr, buf, url, \"GET /Makefile HTTP/1.0\\n\\n\") == 200);\n  ASSERT(cmpbody(buf, data.buf) == 0);\n  mg_free((void *) data.buf);\n\n  // Load file deeper in the FS tree directly\n  data = mg_file_read(&mg_fs_posix, \"data/ssi.h\");\n  ASSERT(fetch(&mgr, buf, url, \"GET /data/ssi.h HTTP/1.0\\n\\n\") == 200);\n  ASSERT(cmpbody(buf, data.buf) == 0);\n  mg_free((void *) data.buf);\n\n  // List root dir\n  ASSERT(fetch(&mgr, buf, url, \"GET / HTTP/1.0\\n\\n\") == 200);\n  // printf(\"--------\\n%s\\n\", buf);\n\n  // List nested dir\n  ASSERT(fetch(&mgr, buf, url, \"GET /data HTTP/1.0\\n\\n\") == 301);\n  ASSERT(fetch(&mgr, buf, url, \"GET /data/ HTTP/1.0\\n\\n\") == 200);\n  // printf(\"--------\\n%s\\n\", buf);\n\n  mg_mgr_free(&mgr);\n  ASSERT(mgr.conns == NULL);\n}\n\n#if (MG_ENABLE_SOCKET == 0)\nint send(int sock, const void *buf, size_t len, int flags);\nint send(int sock, const void *buf, size_t len, int flags) {\n  (void) sock, (void) buf, (void) len, (void) flags;\n  return -1;\n}\n#endif\n\nstatic void u1(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_CONNECT) {\n    ((int *) c->fn_data)[0] += 1;\n    mg_send(c, \"hi\", 2);\n  } else if (ev == MG_EV_WRITE) {\n    ((int *) c->fn_data)[0] += 100;\n  } else if (ev == MG_EV_READ) {\n    ((int *) c->fn_data)[0] += 10;\n    mg_iobuf_free(&c->recv);\n  }\n  (void) ev_data;\n}\n\nstatic void test_udp(void) {\n  struct mg_mgr mgr;\n  const char *url = \"udp://127.0.0.1:12353\";\n  int i, done = 0;\n  mg_mgr_init(&mgr);\n  mg_listen(&mgr, url, u1, (void *) &done);\n  mg_connect(&mgr, url, u1, (void *) &done);\n  for (i = 0; i < 5; i++) mg_mgr_poll(&mgr, 1);\n  // MG_INFO((\"%d\", done));\n  ASSERT(done == 111);\n  mg_mgr_free(&mgr);\n  ASSERT(mgr.conns == NULL);\n}\n\nstatic void test_check_ip_acl(void) {\n  struct mg_addr ip = {{{1, 2, 3, 4}}, 0, 0, false};  // 1.2.3.4\n  ASSERT(mg_check_ip_acl(mg_str(NULL), &ip) == 1);\n  ASSERT(mg_check_ip_acl(mg_str(\"\"), &ip) == 1);\n  ASSERT(mg_check_ip_acl(mg_str(\"invalid\"), &ip) == -1);\n  ASSERT(mg_check_ip_acl(mg_str(\"+hi\"), &ip) == -2);\n  ASSERT(mg_check_ip_acl(mg_str(\"+//\"), &ip) == -2);\n  ASSERT(mg_check_ip_acl(mg_str(\"-0.0.0.0/0\"), &ip) == 0);\n  ASSERT(mg_check_ip_acl(mg_str(\"-0.0.0.0/0,+1.0.0.0/8\"), &ip) == 1);\n  ASSERT(mg_check_ip_acl(mg_str(\"-0.0.0.0/0,+1.2.3.4\"), &ip) == 1);\n  ASSERT(mg_check_ip_acl(mg_str(\"-0.0.0.0/0,+1.0.0.0/16\"), &ip) == 0);\n  ip.is_ip6 = true;\n  ASSERT(mg_check_ip_acl(mg_str(\"-0.0.0.0/0\"), &ip) ==\n         -1);  // not yet supported\n}\n\nstatic void w3(struct mg_connection *c, int ev, void *ev_data) {\n  // MG_INFO((\"ev %d\", ev));\n  if (ev == MG_EV_WS_OPEN) {\n    char buf[8192];\n    memset(buf, 'A', sizeof(buf));\n    mg_ws_send(c, \"hi there!\", 9, WEBSOCKET_OP_TEXT);\n    mg_ws_printf(c, WEBSOCKET_OP_TEXT, \"%s\", \"hi there2!\");\n    mg_printf(c, \"%s\", \"boo\");\n    mg_ws_wrap(c, 3, WEBSOCKET_OP_TEXT);\n    mg_ws_send(c, buf, sizeof(buf), WEBSOCKET_OP_TEXT);\n  } else if (ev == MG_EV_WS_MSG) {\n    struct mg_ws_message *wm = (struct mg_ws_message *) ev_data;\n    ASSERT(mg_strcmp(wm->data, mg_str(\"lebowski\")) == 0);\n    ((int *) c->fn_data)[0]++;\n  } else if (ev == MG_EV_CLOSE) {\n    ((int *) c->fn_data)[0] += 10;\n  }\n}\n\nstatic void w2(struct mg_connection *c, int ev, void *ev_data) {\n  struct mg_str msg = mg_str_n(\"lebowski\", 8);\n  if (ev == MG_EV_HTTP_MSG) {\n    mg_ws_upgrade(c, (struct mg_http_message *) ev_data, NULL);\n  } else if (ev == MG_EV_WS_OPEN) {\n    mg_ws_send(c, \"x\", 1, WEBSOCKET_OP_PONG);\n  } else if (ev == MG_EV_POLL && c->is_websocket) {\n    size_t ofs, n = (size_t) c->fn_data;\n    if (n < msg.len) {\n      // Send \"msg\" char by char using fragmented frames\n      // mg_ws_send() sets the FIN flag in the WS header. Clean it\n      // to send fragmented packet. Insert PONG messages between frames\n      uint8_t op = n == 0 ? WEBSOCKET_OP_TEXT : WEBSOCKET_OP_CONTINUE;\n      mg_ws_send(c, \":->\", 3, WEBSOCKET_OP_PING);\n      ofs = c->send.len;\n      mg_ws_send(c, &msg.buf[n], 1, op);\n      if (n < msg.len - 1) c->send.buf[ofs] = op;  // Clear FIN flag\n      c->fn_data = (void *) (n + 1);               // Point to the next char\n    } else {\n      mg_ws_send(c, \"\", 0, WEBSOCKET_OP_CLOSE);\n    }\n  } else if (ev == MG_EV_WS_MSG) {\n    struct mg_ws_message *wm = (struct mg_ws_message *) ev_data;\n    MG_INFO((\"Got WS, %lu\", wm->data.len));\n    // mg_hexdump(wm->data.buf, wm->data.len);\n    if (wm->data.len == 9) {\n      ASSERT(mg_strcmp(wm->data, mg_str(\"hi there!\")) == 0);\n    } else if (wm->data.len == 10) {\n      ASSERT(mg_strcmp(wm->data, mg_str(\"hi there2!\")) == 0);\n    } else if (wm->data.len == 3) {\n      ASSERT(mg_strcmp(wm->data, mg_str(\"boo\")) == 0);\n    } else {\n      MG_INFO((\"%lu\", wm->data.len));\n      ASSERT(wm->data.len == 8192);\n    }\n  }\n}\n\nstatic void test_ws_fragmentation(void) {\n  const char *url = \"ws://localhost:12357/ws\";\n  struct mg_mgr mgr;\n  int i, done = 0;\n\n  mg_mgr_init(&mgr);\n  ASSERT(mg_http_listen(&mgr, url, w2, NULL) != NULL);\n  mg_ws_connect(&mgr, url, w3, &done, \"%s\", \"Sec-WebSocket-Protocol: echo\\r\\n\");\n  for (i = 0; i < 25; i++) mg_mgr_poll(&mgr, 1);\n  // MG_INFO((\"--> %d\", done));\n  ASSERT(done == 11);\n\n  mg_mgr_free(&mgr);\n  ASSERT(mgr.conns == NULL);\n}\n\nstatic void h7(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    struct mg_http_serve_opts opts;\n    memset(&opts, 0, sizeof(opts));\n    opts.root_dir = \"./data,/foo=./dirtest\";\n    mg_http_serve_dir(c, hm, &opts);\n  }\n}\n\nstatic void test_rewrites(void) {\n  char buf[FETCH_BUF_SIZE];\n  const char *url = \"http://LOCALHOST:12358\";\n  const char *expected = \"#define MG_VERSION \\\"\" MG_VERSION \"\\\"\\n\";\n  struct mg_mgr mgr;\n  mg_mgr_init(&mgr);\n  ASSERT(mg_http_listen(&mgr, url, h7, NULL) != NULL);\n  ASSERT(fetch(&mgr, buf, url, \"GET /a.txt HTTP/1.0\\n\\n\") == 200);\n  ASSERT(cmpbody(buf, \"hello\\n\") == 0);\n  ASSERT(fetch(&mgr, buf, url, \"GET /foo/version.h HTTP/1.0\\n\\n\") == 200);\n  ASSERT(cmpbody(buf, expected) == 0);\n  ASSERT(fetch(&mgr, buf, url, \"GET /foo HTTP/1.0\\n\\n\") == 301);\n  ASSERT(fetch(&mgr, buf, url, \"GET /foo/ HTTP/1.0\\n\\n\") == 200);\n  // printf(\"-->[%s]\\n\", buf);\n  mg_mgr_free(&mgr);\n  ASSERT(mgr.conns == NULL);\n}\n\nstatic void test_get_header_var(void) {\n  struct mg_str empty = mg_str(\"\"), bar = mg_str(\"bar\"), baz = mg_str(\"baz\");\n  struct mg_str header = mg_str(\"Digest foo=\\\"bar\\\", blah,boo=baz, x=\\\"yy\\\"\");\n  struct mg_str yy = mg_str(\"yy\");\n  // struct mg_str x = mg_http_get_header_var(header, mg_str(\"x\"));\n  // MG_INFO((\"--> [%d] [%d]\", (int) x.len, yy.len));\n  ASSERT(mg_strcmp(empty, mg_http_get_header_var(empty, empty)) == 0);\n  ASSERT(mg_strcmp(empty, mg_http_get_header_var(header, empty)) == 0);\n  ASSERT(mg_strcmp(empty, mg_http_get_header_var(header, mg_str(\"fooo\"))) == 0);\n  ASSERT(mg_strcmp(empty, mg_http_get_header_var(header, mg_str(\"fo\"))) == 0);\n  ASSERT(mg_strcmp(empty, mg_http_get_header_var(header, mg_str(\"blah\"))) == 0);\n  ASSERT(mg_strcmp(bar, mg_http_get_header_var(header, mg_str(\"foo\"))) == 0);\n  ASSERT(mg_strcmp(baz, mg_http_get_header_var(header, mg_str(\"boo\"))) == 0);\n  ASSERT(mg_strcmp(yy, mg_http_get_header_var(header, mg_str(\"x\"))) == 0);\n}\n\nstatic void json_scan(struct mg_str json, int depth) {\n  int i, n = 0, o = mg_json_get(json, \"$\", &n);\n  for (i = 0; i < depth; i++) printf(\"  \");\n  printf(\"%.*s\\n\", n, json.buf + o);\n  if (json.buf[o] == '{' || json.buf[o] == '[') {  // Iterate over elems\n    struct mg_str key, val, sub = mg_str_n(json.buf + o, (size_t) n);\n    size_t ofs = 0;\n    while ((ofs = mg_json_next(sub, ofs, &key, &val)) > 0) {\n      for (i = 0; i < depth; i++) printf(\"  \");\n      printf(\"KEY: %.*s VAL: %.*s\\n\", (int) key.len, key.buf, (int) val.len,\n             val.buf);\n      if (*val.buf == '[' || *val.buf == '{') json_scan(val, depth + 1);\n    }\n  }\n}\n\nstatic void test_json(void) {\n  const char *s1 = \"{\\\"a\\\":{},\\\"b\\\":7,\\\"c\\\":[[],2]}\";\n  const char *s2 = \"{\\\"a\\\":{\\\"b1\\\":{}},\\\"c\\\":7,\\\"d\\\":{\\\"b2\\\":{}}}\";\n  int n;\n  struct mg_str json;\n\n  ASSERT(mg_json_get(mg_str_n(\" true \", 6), \"\", &n) == MG_JSON_INVALID);\n  ASSERT(mg_json_get(mg_str_n(\" true \", 6), \"$\", &n) == 1 && n == 4);\n  ASSERT(mg_json_get(mg_str_n(\"null \", 5), \"$\", &n) == 0 && n == 4);\n  json = mg_str(\"  \\\"hi\\\\nthere\\\"\");\n  ASSERT(mg_json_get(json, \"$\", &n) == 2 && n == 11);\n  ASSERT(mg_json_get(mg_str_n(\" { } \", 5), \"$\", &n) == 1);\n  ASSERT(mg_json_get(mg_str_n(\" [[]]\", 5), \"$\", &n) == 1);\n  ASSERT(mg_json_get(mg_str_n(\" [ ]  \", 5), \"$\", &n) == 1);\n\n  ASSERT(mg_json_get(mg_str_n(\"[1,2]\", 5), \"$\", &n) == 0 && n == 5);\n  ASSERT(mg_json_get(mg_str_n(\"[1,2]\", 5), \"$[0]\", &n) == 1 && n == 1);\n  ASSERT(mg_json_get(mg_str_n(\"[1,2]\", 5), \"$[1]\", &n) == 3 && n == 1);\n  ASSERT(mg_json_get(mg_str_n(\"[1,2]\", 5), \"$[3]\", &n) == MG_JSON_NOT_FOUND);\n\n  json = mg_str(\"{\\\"a\\\":[]}\");\n  ASSERT(mg_json_get(json, \"$.a\", &n) == 5 && n == 2);\n  json = mg_str(\"{\\\"a\\\":[1,2]}\");\n  ASSERT(mg_json_get(json, \"$.a\", &n) == 5 && n == 5);\n  json = mg_str(\"{\\\"a\\\":[1,[1]]}\");\n  ASSERT(mg_json_get(json, \"$.a\", &n) == 5 && n == 7);\n  json = mg_str(\"{\\\"a\\\":[[]]}\");\n  ASSERT(mg_json_get(json, \"$.a\", &n) == 5 && n == 4);\n  json = mg_str(\"{\\\"a\\\":[[1,2]]}\");\n  ASSERT(mg_json_get(json, \"$.a\", &n) == 5 && n == 7);\n  json = mg_str(\"{\\\"a\\\":{}}\");\n  ASSERT(mg_json_get(json, \"$.a\", &n) == 5 && n == 2);\n  json = mg_str(\"{\\\"a\\\":{\\\"a\\\":{}}}\");\n  ASSERT(mg_json_get(json, \"$.a\", &n) == 5 && n == 8);\n  json = mg_str(\"{\\\"a\\\":{\\\"a\\\":[]}}\");\n  ASSERT(mg_json_get(json, \"$.a\", &n) == 5 && n == 8);\n\n  json = mg_str(\"[[1,[2,3]],4]\");\n  ASSERT(mg_json_get(json, \"$\", &n) == 0 && n == 13);\n  ASSERT(mg_json_get(json, \"$[0]\", &n) == 1 && n == 9);\n  ASSERT(mg_json_get(json, \"$[1]\", &n) == 11);\n  ASSERT(mg_json_get(json, \"$[1]\", &n) == 11 && n == 1);\n  ASSERT(mg_json_get(json, \"$[2]\", &n) == MG_JSON_NOT_FOUND);\n  ASSERT(mg_json_get(json, \"$[0][0]\", &n) == 2 && n == 1);\n  ASSERT(mg_json_get(json, \"$[0][1]\", &n) == 4 && n == 5);\n  ASSERT(mg_json_get(json, \"$[0][2]\", &n) == MG_JSON_NOT_FOUND);\n  ASSERT(mg_json_get(json, \"$[0][1][0]\", &n) == 5 && n == 1);\n  ASSERT(mg_json_get(json, \"$[0][1][1]\", &n) == 7 && n == 1);\n\n  json = mg_str(\"[[1,2],3]\");\n  ASSERT(mg_json_get(json, \"$\", &n) == 0 && n == 9);\n  ASSERT(mg_json_get(json, \"$[0][0]\", &n) == 2 && n == 1);\n  ASSERT(mg_json_get(json, \"$[0][1]\", &n) == 4 && n == 1);\n  ASSERT(mg_json_get(json, \"$[0][2]\", &n) == MG_JSON_NOT_FOUND);\n  ASSERT(mg_json_get(json, \"$[1][0]\", &n) == MG_JSON_NOT_FOUND);\n  ASSERT(mg_json_get(json, \"$[1]\", &n) == 7 && n == 1);\n  ASSERT(mg_json_get(json, \"$[1][0]\", &n) == MG_JSON_NOT_FOUND);\n\n  ASSERT(mg_json_get(json, \"$\", &n) == 0 && n == 9);\n  ASSERT(mg_json_get(json, \"$[1][0]\", &n) == MG_JSON_NOT_FOUND);\n  ASSERT(mg_json_get(json, \"$[0][1]\", &n) == 4 && n == 1);\n\n  json = mg_str(s1);\n  ASSERT(mg_json_get(json, \"$.a\", &n) == 5 && n == 2);\n  ASSERT(mg_json_get(json, \"$.b\", &n) == 12 && n == 1);\n  ASSERT(mg_json_get(json, \"$.c\", &n) == 18 && n == 6);\n  ASSERT(mg_json_get(json, \"$.c[0]\", &n) == 19 && n == 2);\n  ASSERT(mg_json_get(json, \"$.c[1]\", &n) == 22 && n == 1);\n  ASSERT(mg_json_get(json, \"$.c[3]\", &n) == MG_JSON_NOT_FOUND);\n\n  json = mg_str(s2);\n  ASSERT(mg_json_get(json, \"$.a\", &n) == 5 && n == 9);\n  ASSERT(mg_json_get(json, \"$.a.b1\", &n) == 11 && n == 2);\n  ASSERT(mg_json_get(json, \"$.a.b2\", &n) == MG_JSON_NOT_FOUND);\n  ASSERT(mg_json_get(json, \"$.a.b\", &n) == MG_JSON_NOT_FOUND);\n  ASSERT(mg_json_get(json, \"$.a1\", &n) == MG_JSON_NOT_FOUND);\n  ASSERT(mg_json_get(json, \"$.c\", &n) == 19 && n == 1);\n\n  {\n    char to[4], expect[4] = {0, 0, 0, 0};\n    memset(to, 0, sizeof(to));\n    ASSERT(mg_json_unescape(mg_str(\"\\\\u0000\"), to, 4) &&\n           memcmp(to, expect, 4) == 0);\n    to[0] = 0;\n    expect[0] = (char) 0xff;\n    ASSERT(mg_json_unescape(mg_str(\"\\\\u00ff\"), to, 4) &&\n           memcmp(to, expect, 4) == 0);\n    ASSERT(!mg_json_unescape(mg_str(\"\\\\u0100\"), to, 4));\n    ASSERT(!mg_json_unescape(mg_str(\"\\\\u1000\"), to, 4));\n  }\n\n  {\n    double d = 0;\n    bool b = false;\n    int len;\n    char *str = NULL;\n\n    json = mg_str(\"{\\\"a\\\":\\\"b\\\"}\");\n    str = mg_json_get_str(json, \"$.a\");\n    ASSERT(str != NULL);\n    // printf(\"---> [%s]\\n\", str);\n    ASSERT(strcmp(str, \"b\") == 0);\n    mg_free(str);\n\n    json = mg_str(\"{\\\"a\\\": \\\"hi\\\\nthere\\\",\\\"b\\\": [12345, true]}\");\n    str = mg_json_get_str(json, \"$.a\");\n\n    ASSERT(str != NULL);\n    ASSERT(strcmp(str, \"hi\\nthere\") == 0);\n    mg_free(str);\n\n    ASSERT(mg_json_get_long(json, \"$.foo\", -42) == -42);\n    ASSERT(mg_json_get_long(json, \"$.b[0]\", -42) == 12345);\n\n    ASSERT(mg_json_get_num(json, \"$.a\", &d) == false);\n    ASSERT(mg_json_get_num(json, \"$.c\", &d) == false);\n    ASSERT(mg_json_get_num(json, \"$.b[0]\", &d) == true);\n    ASSERT(d == 12345);\n\n    ASSERT(mg_json_get_bool(json, \"$.b\", &b) == false);\n    ASSERT(mg_json_get_bool(json, \"$.b[0]\", &b) == false);\n    ASSERT(mg_json_get_bool(json, \"$.b[1]\", &b) == true);\n    ASSERT(b == true);\n    ASSERT(mg_json_get(json, \"$.b[2]\", &len) < 0);\n\n    json = mg_str(\"[\\\"YWJj\\\", \\\"0100026869\\\"]\");\n    ASSERT((str = mg_json_get_b64(json, \"$[0]\", &len)) != NULL);\n    ASSERT(len == 3 && memcmp(str, \"abc\", (size_t) len) == 0);\n    mg_free(str);\n    ASSERT((str = mg_json_get_hex(json, \"$[1]\", &len)) != NULL);\n    ASSERT(len == 5 && memcmp(str, \"\\x01\\x00\\x02hi\", (size_t) len) == 0);\n    mg_free(str);\n\n    json = mg_str(\"{\\\"a\\\":[1,2,3], \\\"ab\\\": 2}\");\n    ASSERT(mg_json_get_long(json, \"$.a[0]\", -42) == 1);\n    ASSERT(mg_json_get_long(json, \"$.ab\", -42) == 2);\n    ASSERT(mg_json_get_long(json, \"$.ac\", -42) == -42);\n\n    json = mg_str(\"{\\\"a\\\":[],\\\"b\\\":[1,2]}\");\n    ASSERT(mg_json_get_long(json, \"$.a[0]\", -42) == -42);\n    ASSERT(mg_json_get_long(json, \"$.b[0]\", -42) == 1);\n    ASSERT(mg_json_get_long(json, \"$.b[1]\", -42) == 2);\n    ASSERT(mg_json_get_long(json, \"$.b[2]\", -42) == -42);\n    json = mg_str(\"[{\\\"a\\\":1,\\\"b\\\":2},{\\\"a\\\":3, \\\"b\\\":4}]\");\n    ASSERT(mg_json_get_long(json, \"$[0].a\", -42) == 1);\n    ASSERT(mg_json_get_long(json, \"$[0].b\", -42) == 2);\n    ASSERT(mg_json_get_long(json, \"$[1].a\", -42) == 3);\n    ASSERT(mg_json_get_long(json, \"$[1].b\", -42) == 4);\n    ASSERT(mg_json_get_long(json, \"$[2].a\", -42) == -42);\n\n    json = mg_str(\"{\\\"a\\\":[1],\\\"b\\\":[2,3]}\");\n    ASSERT(mg_json_get_long(json, \"$.a[0]\", -42) == 1);\n    ASSERT(mg_json_get_long(json, \"$.a[1]\", -42) == -42);\n\n    json = mg_str(\"{\\\"a\\\":[1,[2,3], 4]}\");\n    ASSERT(mg_json_get_long(json, \"$.a[0]\", -42) == 1);\n    ASSERT(mg_json_get_long(json, \"$.a[1][0]\", -42) == 2);\n    ASSERT(mg_json_get_long(json, \"$.a[1][1]\", -42) == 3);\n    ASSERT(mg_json_get_long(json, \"$.a[1][2]\", -42) == -42);\n    ASSERT(mg_json_get_long(json, \"$.a[2]\", -42) == 4);\n    ASSERT(mg_json_get_long(json, \"$.a[3]\", -42) == -42);\n  }\n\n  json = mg_str(\"{\\\"a\\\":[],\\\"b\\\":[1,2]}\");\n  ASSERT(mg_json_get(json, \"$.a\", &n) == 5 && n == 2);\n  ASSERT(mg_json_get(json, \"$.a[0]\", &n) < 0 && n == 0);\n\n  json = mg_str(\"{\\\"a\\\":{},\\\"b\\\":[1,2]}\");\n  ASSERT(mg_json_get(json, \"$.a\", &n) == 5 && n == 2);\n  ASSERT(mg_json_get(json, \"$.a[0]\", &n) < 0 && n == 0);\n\n  json = mg_str(\"{\\\"a\\\":true,\\\"b\\\":[1,2]}\");\n  ASSERT(mg_json_get(json, \"$.a\", &n) == 5 && n == 4);\n  ASSERT(mg_json_get(json, \"$.a[0]\", &n) < 0 && n == 0);\n\n  json = mg_str(\"{\\\"a\\\":1,\\\"b\\\":[1,2]}\");\n  ASSERT(mg_json_get(json, \"$.a\", &n) == 5 && n == 1);\n  ASSERT(mg_json_get(json, \"$.a[0]\", &n) < 0 && n == 0);\n\n  ASSERT(mg_json_get_long(mg_str(\"[0, 42]\"), \"$[1]\", 0) == 42);\n  ASSERT(mg_json_get_long(mg_str(\"[[], 42]\"), \"$[1]\", 0) == 42);\n  ASSERT(mg_json_get_long(mg_str(\"[{}, 42]\"), \"$[1]\", 0) == 42);\n\n  json = mg_str(\"[{\\\"a\\\":1},{\\\"a\\\":2}]\");\n  ASSERT(mg_json_get_long(json, \"$[0]\", -1) == -1);\n  ASSERT(mg_json_get_long(json, \"$[0].a\", -1) == 1);\n  ASSERT(mg_json_get_long(json, \"$[1].a\", -1) == 2);\n  ASSERT(mg_json_get_long(json, \"$[2].a\", -1) == -1);\n\n  json = mg_str(\"[{\\\"a1\\\":1},{\\\"a\\\":2}]\");\n  ASSERT(mg_json_get_long(json, \"$[0]\", -1) == -1);\n  ASSERT(mg_json_get_long(json, \"$[0].a\", -1) == -1);\n  ASSERT(mg_json_get_long(json, \"$[1].a\", -1) == 2);\n  ASSERT(mg_json_get_long(json, \"$[2].a\", -1) == -1);\n\n  // mg_json_next()\n  json = mg_str(\"[1,true,{\\\"a\\\":[3],\\\"b\\\":42}]\");\n  json_scan(json, 0);\n  {\n    struct mg_str k, v, sub = mg_str_n(json.buf + 8, json.len - 8);\n    const char *a = \"\\\"a\\\"\", *b = \"\\\"b\\\"\";\n    ASSERT(mg_json_next(sub, 0, &k, &v) == 9);\n    ASSERT(vcmp(k, a));\n    ASSERT(vcmp(v, \"[3]\"));\n    ASSERT(mg_json_next(sub, 9, &k, &v) == 15);\n    ASSERT(vcmp(k, b));\n    ASSERT(vcmp(v, \"42\"));\n    ASSERT(mg_json_next(sub, 15, &k, &v) == 0);\n  }\n\n  {\n    struct mg_str expected = mg_str(\"\\\"b:c\\\"\"), val;\n    json = mg_str(\"{\\\"a\\\":\\\"b:c\\\"}\");\n    val = mg_json_get_tok(json, \"$.a\");\n    ASSERT(mg_strcmp(val, expected) == 0);\n  }\n}\n\nstatic void resp_rpc(struct mg_rpc_req *r) {\n  int len = 0, off = mg_json_get(r->frame, \"$.result\", &len);\n  mg_xprintf(r->pfn, r->pfn_data, \"%.*s\", len, &r->frame.buf[off]);\n}\n\nstatic void test_rpc(void) {\n  struct mg_rpc *head = NULL;\n  struct mg_iobuf io = {0, 0, 0, 256};\n  struct mg_rpc_req req = {&head, 0, mg_pfn_iobuf, &io, 0, {0, 0}};\n  mg_rpc_add(&head, mg_str(\"rpc.list\"), mg_rpc_list, NULL);\n\n  {\n    req.frame = mg_str(\"{\\\"method\\\":\\\"rpc.list\\\"}\");\n    mg_rpc_process(&req);\n    ASSERT(io.buf == NULL);\n  }\n\n  {\n    const char *resp = \"{\\\"id\\\":1,\\\"result\\\":[\\\"rpc.list\\\"]}\";\n    req.frame = mg_str(\"{\\\"id\\\": 1,\\\"method\\\":\\\"rpc.list\\\"}\");\n    mg_rpc_process(&req);\n    ASSERT(strcmp((char *) io.buf, resp) == 0);\n    mg_iobuf_free(&io);\n  }\n\n  {\n    const char *resp =\n        \"{\\\"id\\\":true,\\\"error\\\":{\\\"code\\\":-32601,\\\"message\\\":\\\"foo not \"\n        \"found\\\"}}\";\n    req.frame = mg_str(\"{\\\"id\\\": true,\\\"method\\\":\\\"foo\\\"}\");\n    mg_rpc_process(&req);\n    // MG_INFO((\"-> %s\", io.buf));\n    ASSERT(strcmp((char *) io.buf, resp) == 0);\n    mg_iobuf_free(&io);\n  }\n\n  {\n    const char *resp =\n        \"{\\\"id\\\":true,\\\"error\\\":{\\\"code\\\":-32601,\\\"message\\\":\\\"foo not \"\n        \"found\\\"}}\";\n    req.frame = mg_str(\"{\\\"id\\\": true,\\\"method\\\":\\\"foo\\\"}\");\n    req.head = NULL;\n    mg_rpc_process(&req);\n    // MG_INFO((\"-> %s\", io.buf));\n    ASSERT(strcmp((char *) io.buf, resp) == 0);\n    mg_iobuf_free(&io);\n    req.head = &head;\n  }\n\n  {\n    const char *resp = \"{\\\"error\\\":{\\\"code\\\":-32700,\\\"message\\\":\\\"haha\\\"}}\";\n    req.frame = mg_str(\"haha\");\n    mg_rpc_process(&req);\n    // MG_INFO((\"-> %s\", io.buf));\n    ASSERT(strcmp((char *) io.buf, resp) == 0);\n    mg_iobuf_free(&io);\n  }\n\n  {\n    const char *resp =\n        \"{\\\"id\\\":1,\\\"error\\\":{\\\"code\\\":-32601,\\\"message\\\":\\\" not found\\\"}}\";\n    req.frame = mg_str(\"{\\\"id\\\":1,\\\"result\\\":123}\");\n    mg_rpc_process(&req);\n    // MG_INFO((\"-> %s\", io.buf));\n    ASSERT(strcmp((char *) io.buf, resp) == 0);\n    mg_iobuf_free(&io);\n  }\n\n  {\n    req.frame = mg_str(\"{\\\"id\\\":1,\\\"result\\\":123}\");\n    mg_rpc_add(&head, mg_str(\"\"), resp_rpc, NULL);\n    mg_rpc_process(&req);\n    MG_INFO((\"-> %s\", io.buf));\n    ASSERT(strcmp((char *) io.buf, \"123\") == 0);\n    mg_iobuf_free(&io);\n  }\n\n  mg_rpc_del(&head, NULL);\n  ASSERT(head == NULL);\n}\n\nstatic void ph(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_POLL) ++(*(int *) c->fn_data);\n  (void) c, (void) ev_data;\n}\n\nstatic void test_poll(void) {\n  int count = 0, i;\n  struct mg_mgr mgr;\n  mg_mgr_init(&mgr);\n  mg_http_listen(&mgr, \"http://127.0.0.1:42346\", ph,\n                 &count);  // To prevent bind errors on Windows\n  for (i = 0; i < 10; i++) mg_mgr_poll(&mgr, 0);\n  ASSERT(count == 10);\n  mg_mgr_free(&mgr);\n}\n\n#define NMESSAGES 99999\nstatic uint32_t s_qcrc = 0;\nstatic int s_out, s_in;\nstatic void producer(void *param) {\n  struct mg_queue *q = (struct mg_queue *) param;\n  char tmp[64 * 1024], *buf;\n  size_t len, ofs = sizeof(tmp);\n  for (s_out = 0; s_out < NMESSAGES; s_out++) {\n    if (ofs >= sizeof(tmp)) mg_random(tmp, sizeof(tmp)), ofs = 0;\n    len = ((uint8_t *) tmp)[ofs] % 55U + 1U;\n    if (ofs + len > sizeof(tmp)) len = sizeof(tmp) - ofs;\n    while ((mg_queue_book(q, &buf, len)) < len) (void) 0;\n    memcpy(buf, &tmp[ofs], len);\n    s_qcrc = mg_crc32(s_qcrc, buf, len);\n    ofs += len;\n#if 0\n    fprintf(stderr, \"-->prod %3d  %8x  %-3lu %zu/%zu/%lu\\n\", s_out, s_qcrc, len, q->tail,\n           q->head, buf - q->buf);\n#endif\n    mg_queue_add(q, len);\n  }\n}\n\nstatic uint32_t consumer(struct mg_queue *q) {\n  uint32_t crc = 0;\n  for (s_in = 0; s_in < NMESSAGES; s_in++) {\n    char *buf;\n    size_t len;\n    while ((len = mg_queue_next(q, &buf)) == 0) (void) 0;\n    crc = mg_crc32(crc, buf, len);\n#if 0\n    fprintf(stderr, \"-->cons %3u  %8x  %-3lu %zu/%zu/%lu\\n\", s_in, crc, len, q->tail,\n           q->head, buf - q->buf);\n#endif\n    mg_queue_del(q, len);\n  }\n  return crc;\n}\n\n#if MG_ARCH == MG_ARCH_WIN32\nstatic void start_thread(void (*f)(void *), void *p) {\n  _beginthread((void(__cdecl *)(void *)) f, 0, p);\n}\n#elif MG_ARCH == MG_ARCH_UNIX\n#include <pthread.h>\nstatic void start_thread(void (*f)(void *), void *p) {\n  union {\n    void (*f1)(void *);\n    void *(*f2)(void *);\n  } u = {f};\n  pthread_t thread_id = (pthread_t) 0;\n  pthread_attr_t attr;\n  (void) pthread_attr_init(&attr);\n  (void) pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\n  pthread_create(&thread_id, &attr, u.f2, p);\n  pthread_attr_destroy(&attr);\n}\n#else\nstatic void start_thread(void (*f)(void *), void *p) {\n  (void) f, (void) p;\n}\n#endif\n\nstatic void test_queue(void) {\n  char buf[512];\n  struct mg_queue queue;\n  uint32_t crc;\n  memset(buf, 0x55, sizeof(buf));\n  mg_queue_init(&queue, buf, sizeof(buf));\n  start_thread(producer, &queue);  // Start producer in a separate thread\n  crc = consumer(&queue);          // Consumer eats data in this thread\n  MG_INFO((\"CRC1 %8x\", s_qcrc));   // Show CRCs\n  MG_INFO((\"CRC2 %8x\", crc));\n  ASSERT(s_qcrc == crc);\n}\n\nstatic void test_md5_str(const char *string,\n                         const unsigned char *expected_hash) {\n  mg_md5_ctx ctx;\n  unsigned char digest[16];\n  mg_md5_init(&ctx);\n  mg_md5_update(&ctx, (unsigned char *) string, strlen(string));\n  mg_md5_final(&ctx, digest);\n  ASSERT((memcmp(digest, expected_hash, 16) == 0));\n}\n\nstatic void test_md5(void) {\n  const unsigned char expected_hash_1[] = {0xe5, 0x45, 0x14, 0x96, 0xe1, 0x1d,\n                                           0x7d, 0xa9, 0x62, 0x9f, 0xe0, 0x64,\n                                           0xcb, 0x3d, 0x2b, 0x54};\n  const unsigned char expected_hash_2[] = {0x99, 0x33, 0xf6, 0x4d, 0x7a, 0xb5,\n                                           0x0b, 0x0f, 0xf4, 0x35, 0xdc, 0x61,\n                                           0x1d, 0xef, 0x20, 0xff};\n  const unsigned char expected_hash_3[] = {0xf7, 0x94, 0xc3, 0xa4, 0x56, 0x6d,\n                                           0xc1, 0x10, 0x95, 0xfc, 0x56, 0x87,\n                                           0xf8, 0xb1, 0x69, 0xf2};\n  test_md5_str(\"#&*%$DHFH(0x12345)^&*(^!@$%^^&&*\", expected_hash_1);\n  test_md5_str(\"1298**&^%DHKSHFLS)(*)&^^%$#!!!!\", expected_hash_2);\n  test_md5_str(\")_)+_)!&^*%$#>>>{}}}{{{][[[[]]]\", expected_hash_3);\n}\n\nstatic void test_sha1_str(const char *string,\n                          const unsigned char *expected_hash) {\n  mg_sha1_ctx ctx;\n  unsigned char digest[20];\n  mg_sha1_init(&ctx);\n  mg_sha1_update(&ctx, (unsigned char *) string, strlen(string));\n  mg_sha1_final(digest, &ctx);\n  ASSERT((memcmp(digest, expected_hash, 20) == 0));\n}\n\nstatic void test_sha1(void) {\n  const unsigned char expected_hash_1[] = {\n      0x02, 0xaf, 0x27, 0x00, 0xf7, 0xba, 0xb5, 0xf5, 0xf3, 0x69,\n      0xd8, 0x80, 0x01, 0x0d, 0x6a, 0x28, 0x31, 0x63, 0x1f, 0x92};\n  const unsigned char expected_hash_2[] = {\n      0xaa, 0xe4, 0x39, 0xe8, 0xb4, 0x72, 0x47, 0xe5, 0x1a, 0x6d,\n      0x82, 0x25, 0x5e, 0x9f, 0x32, 0xd9, 0x93, 0x0a, 0x5f, 0xfb};\n  const unsigned char expected_hash_3[] = {\n      0xa0, 0xdd, 0xd2, 0xa1, 0x52, 0xdf, 0xa9, 0xb8, 0x7e, 0x73,\n      0x32, 0x6a, 0x31, 0x28, 0xe9, 0x6d, 0x3a, 0x90, 0x82, 0x58};\n  test_sha1_str(\"#&*%$DHFH(0x12345)^&*(^!@$%^^&&*\", expected_hash_1);\n  test_sha1_str(\"1298**&^%DHKSHFLS)(*)&^^%$#!!!!\", expected_hash_2);\n  test_sha1_str(\")_)+_)!&^*%$#>>>{}}}{{{][[[[]]]\", expected_hash_3);\n}\n\nstatic void test_sha256_str(const char *string,\n                            const unsigned char *expected_hash) {\n  unsigned char digest[32];\n  mg_sha256(digest, (unsigned char *) string, strlen(string));\n  ASSERT((memcmp(digest, expected_hash, 32) == 0));\n}\n\nstatic void test_sha256(void) {\n  const unsigned char expected_hash_1[] = {\n      0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4,\n      0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b,\n      0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55};\n  const unsigned char expected_hash_2[] = {\n      0xbc, 0x07, 0x32, 0x21, 0x17, 0x8e, 0x81, 0xbd, 0x2f, 0x67, 0x13,\n      0x3a, 0xca, 0xb4, 0x07, 0xad, 0x5b, 0x61, 0x8b, 0x33, 0xd2, 0x95,\n      0x9e, 0x94, 0x45, 0x45, 0xdc, 0x24, 0x99, 0x0a, 0xff, 0x92};\n  const unsigned char expected_hash_3[] = {\n      0x1b, 0x65, 0x3e, 0xda, 0x9a, 0x2a, 0x24, 0x55, 0xa3, 0x56, 0x38,\n      0x08, 0xf4, 0xf7, 0xc5, 0xa6, 0xc5, 0x2d, 0x2c, 0xb1, 0x71, 0xe5,\n      0x90, 0x4c, 0x83, 0x9c, 0x77, 0x92, 0x51, 0xa2, 0x84, 0x4a};\n  test_sha256_str(\"\", expected_hash_1);\n  test_sha256_str(\n      \"#&*%$DHFH(0x12345)^&*(^!@$%^^&&*1298**&^%DHKSHFLS)(*)&^^%$#!!!!\",\n      expected_hash_2);\n  test_sha256_str(\")_)+_)!&^*%$#>>>{}}}{{{][[[[]]]\", expected_hash_3);\n}\n\nstatic void test_sha384_str(const char *string,\n                            const unsigned char *expected_hash) {\n  unsigned char digest[48];\n  mg_sha384(digest, (unsigned char *) string, strlen(string));\n  ASSERT((memcmp(digest, expected_hash, 48) == 0));\n}\n\nstatic void test_sha384(void) {\n  const unsigned char expected_hash_1[] = {\n      0x38, 0xb0, 0x60, 0xa7, 0x51, 0xac, 0x96, 0x38, 0x4c, 0xd9, 0x32, 0x7e,\n      0xb1, 0xb1, 0xe3, 0x6a, 0x21, 0xfd, 0xb7, 0x11, 0x14, 0xbe, 0x07, 0x43,\n      0x4c, 0x0c, 0xc7, 0xbf, 0x63, 0xf6, 0xe1, 0xda, 0x27, 0x4e, 0xde, 0xbf,\n      0xe7, 0x6f, 0x65, 0xfb, 0xd5, 0x1a, 0xd2, 0xf1, 0x48, 0x98, 0xb9, 0x5b};\n  const unsigned char expected_hash_2[] = {\n      0x77, 0xe7, 0x0a, 0x31, 0xe5, 0xcd, 0x68, 0xa4, 0xc5, 0xb3, 0x70, 0x55,\n      0x38, 0xd0, 0x90, 0xb0, 0xcd, 0xb6, 0xf4, 0x1c, 0x2e, 0xe6, 0xf4, 0xdd,\n      0xf6, 0xb4, 0xfc, 0x97, 0x01, 0x79, 0x3c, 0x89, 0x82, 0x3b, 0x13, 0xa2,\n      0x48, 0xa7, 0xfe, 0xd2, 0xd0, 0xc4, 0xbf, 0xed, 0x85, 0xb6, 0x20, 0xc7};\n  const unsigned char expected_hash_3[] = {\n      0x45, 0xa1, 0xc6, 0x4d, 0x99, 0x29, 0x42, 0x87, 0x49, 0x46, 0x73, 0x3c,\n      0x3b, 0xc8, 0xbc, 0x9c, 0x43, 0x10, 0x75, 0x23, 0x89, 0x22, 0x04, 0x41,\n      0xcd, 0xa3, 0x34, 0xeb, 0x97, 0x9f, 0x2a, 0xbf, 0x17, 0x94, 0x38, 0x72,\n      0x6b, 0xd8, 0x8e, 0xcc, 0xb5, 0x50, 0xc6, 0x5b, 0x35, 0x1f, 0x91, 0x90};\n  test_sha384_str(\"\", expected_hash_1);\n  test_sha384_str(\n      \"#&*%$DHFH(0x12345)^&*(^!@$%^^&&*1298**&^%DHKSHFLS)(*)&^^%$#!!!!\",\n      expected_hash_2);\n  test_sha384_str(\")_)+_)!&^*%$#>>>{}}}{{{][[[[]]]\", expected_hash_3);\n}\n\nstatic void test_split(void) {\n  struct mg_str a, b, s;\n\n  s = mg_str(\"\");\n  ASSERT(mg_span(s, &a, &s, '.') == false);\n  ASSERT(mg_span(s, &a, NULL, '.') == false);\n  ASSERT(mg_span(s, NULL, &b, '.') == false);\n  ASSERT(mg_span(s, NULL, NULL, '.') == false);\n  ASSERT(mg_span(s, &a, &b, '.') == false);\n\n  s = mg_str(\"aa.bb.cc\"), a = mg_str_n(NULL, 0), b = mg_str_n(NULL, 0);\n  ASSERT(mg_span(s, &a, &b, '.') == true);\n  ASSERT(mg_strcmp(a, mg_str(\"aa\")) == 0);\n  ASSERT(mg_strcmp(b, mg_str(\"bb.cc\")) == 0);\n  ASSERT(mg_strcmp(s, mg_str(\"aa.bb.cc\")) == 0);\n\n  s = mg_str(\"aa.bb.cc\"), a = mg_str_n(NULL, 0), b = mg_str_n(NULL, 0);\n  ASSERT(mg_span(s, &a, NULL, '.') == true);\n  ASSERT(mg_strcmp(a, mg_str(\"aa\")) == 0);\n  ASSERT(mg_strcmp(s, mg_str(\"aa.bb.cc\")) == 0);\n\n  s = mg_str(\"aa.bb.cc\"), a = mg_str_n(NULL, 0), b = mg_str_n(NULL, 0);\n  ASSERT(mg_span(s, NULL, &b, '.') == true);\n  ASSERT(mg_strcmp(b, mg_str(\"bb.cc\")) == 0);\n  ASSERT(mg_strcmp(s, mg_str(\"aa.bb.cc\")) == 0);\n\n  s = mg_str(\"aa.bb.cc\"), a = mg_str_n(NULL, 0), b = mg_str_n(NULL, 0);\n  ASSERT(mg_span(s, NULL, NULL, '.') == true);\n  ASSERT(mg_strcmp(s, mg_str(\"aa.bb.cc\")) == 0);\n\n  s = mg_str(\"aa.bb.cc\"), a = mg_str_n(NULL, 0), b = mg_str_n(NULL, 0);\n  ASSERT(mg_span(s, &a, &s, '.') == true);\n  ASSERT(mg_strcmp(a, mg_str(\"aa\")) == 0);\n  ASSERT(mg_strcmp(s, mg_str(\"bb.cc\")) == 0);\n\n  s = mg_str(\".aa\"), a = mg_str_n(NULL, 0), b = mg_str_n(NULL, 0);\n  ASSERT(mg_span(s, &a, &b, '.') == true);\n  ASSERT(mg_strcmp(a, mg_str(\"\")) == 0);\n  ASSERT(mg_strcmp(b, mg_str(\"aa\")) == 0);\n\n  s = mg_str(\"aa.\"), a = mg_str_n(NULL, 0), b = mg_str_n(NULL, 0);\n  ASSERT(mg_span(s, &a, &b, '.') == true);\n  ASSERT(mg_strcmp(a, mg_str(\"aa\")) == 0);\n  ASSERT(mg_strcmp(b, mg_str(\"\")) == 0);\n\n  s = mg_str(\"aa\"), a = mg_str_n(NULL, 0), b = mg_str_n(NULL, 0);\n  ASSERT(mg_span(s, &a, &b, '.') == true);\n  ASSERT(mg_strcmp(a, mg_str(\"aa\")) == 0);\n  ASSERT(mg_strcmp(b, mg_str(\"\")) == 0);\n}\n\nstatic void test_x25519(void) {\n#if MG_TLS == MG_TLS_BUILTIN\n  uint8_t key[X25519_BYTES];\n  uint8_t buf[X25519_BYTES];\n  char tmp[100];\n  size_t i;\n  for (i = 0; i < sizeof(key); i++) key[i] = (uint8_t) i;\n  for (i = 0; i < sizeof(buf); i++) buf[i] = 0;\n  mg_tls_x25519(buf, key, X25519_BASE_POINT, 1);\n  mg_snprintf(tmp, sizeof(tmp), \"%M\", mg_print_hex, sizeof(buf), buf);\n  MG_INFO((\"%s\", tmp));\n  ASSERT(mg_strcmp(mg_str(\"8f40c5adb6\"), mg_str_n(tmp, 10)) == 0);\n#endif\n}\n\nstatic void test_rsa(void) {\n#if MG_TLS == MG_TLS_BUILTIN\n  const unsigned char mod[] = {\n      0x00, 0xba, 0xee, 0x3b, 0x0b, 0x89, 0x58, 0xa6, 0x19, 0x0d, 0x4c, 0x89,\n      0x1a, 0x85, 0x9a, 0xf4, 0x55, 0xc2, 0xdd, 0x0d, 0xd4, 0x4a, 0xf5, 0xed,\n      0xda, 0x28, 0x55, 0x2f, 0x64, 0x46, 0x21, 0x9f, 0x46, 0x5c, 0xfa, 0x37,\n      0x88, 0x11, 0xdf, 0xcb, 0x51, 0x73, 0x42, 0x3d, 0x5e, 0x50, 0xde, 0x11,\n      0x30, 0x61, 0x04, 0x59, 0xd0, 0xf4, 0x57, 0xed, 0x13, 0x90, 0x32, 0xc5,\n      0x3f, 0xe6, 0x66, 0xfc, 0x2a, 0x12, 0xa3, 0x1f, 0xd1, 0x77, 0x21, 0x65,\n      0xdf, 0x9a, 0xcf, 0x04, 0x05, 0xc3, 0x1c, 0xf8, 0x79, 0xb5, 0xf5, 0x97,\n      0x68, 0x98, 0x2e, 0x96, 0x85, 0x3f, 0xee, 0x71, 0x91, 0xc1, 0x54, 0x71,\n      0x9a, 0x80, 0x1f, 0xbe, 0x21, 0xd9, 0xc1, 0x80, 0x9b, 0xd0, 0x5d, 0xb3,\n      0x76, 0x3e, 0xcc, 0x14, 0x3d, 0xec, 0xb7, 0x18, 0x74, 0xfb, 0xc4, 0x0e,\n      0x56, 0x8d, 0x3d, 0x78, 0xe6, 0xca, 0xcd, 0x9d, 0xc6, 0x20, 0x5a, 0xeb,\n      0x9b, 0xc8, 0x19, 0x5e, 0xeb, 0x80, 0xd2, 0xb2, 0xfe, 0x88, 0x15, 0x5c,\n      0x7c, 0x6b, 0x26, 0xe0, 0x43, 0xda, 0xa4, 0x07, 0x85, 0x73, 0xc4, 0x80,\n      0x28, 0xcb, 0xda, 0x18, 0x56, 0x37, 0x91, 0xd6, 0x41, 0xa1, 0x0b, 0xa2,\n      0x77, 0xd0, 0x62, 0x31, 0xc7, 0xc2, 0x67, 0x6d, 0x75, 0x08, 0x80, 0xe7,\n      0xb6, 0xbe, 0xc2, 0x25, 0xc9, 0xe0, 0x2c, 0x02, 0xbf, 0x39, 0x61, 0x7e,\n      0x32, 0xa4, 0xc9, 0xe7, 0x91, 0xe3, 0xa0, 0xcd, 0x94, 0x24, 0xbf, 0x8c,\n      0xeb, 0x47, 0x76, 0x53, 0x85, 0xb3, 0xb7, 0x31, 0x80, 0x3c, 0x77, 0x10,\n      0x69, 0xc3, 0x04, 0xd1, 0x60, 0x4c, 0x74, 0xda, 0x15, 0x18, 0x0b, 0x20,\n      0x6f, 0xb3, 0x03, 0x58, 0x4a, 0xfc, 0xd1, 0xd2, 0xcf, 0x37, 0x15, 0x0a,\n      0x63, 0xc8, 0xe9, 0xd5, 0x7d, 0xd5, 0xf2, 0x90, 0x78, 0x53, 0x49, 0xa9,\n      0xc5, 0x25, 0x65, 0x5c, 0x01};\n  const unsigned char exp[] = {1, 0, 1};  // 65537\n  const unsigned char sig[] = {\n      0x1e, 0xb1, 0x6a, 0xcb, 0x39, 0x63, 0x12, 0xed, 0x85, 0x62, 0x4b, 0x85,\n      0x47, 0x25, 0x67, 0xbd, 0xbd, 0x0e, 0xaa, 0x73, 0x34, 0x5f, 0x07, 0x2b,\n      0xbb, 0x4f, 0xf5, 0x21, 0x88, 0xb1, 0x04, 0x2c, 0xbb, 0x52, 0x72, 0x64,\n      0x89, 0x45, 0x50, 0x41, 0x73, 0xca, 0xda, 0x97, 0xae, 0x81, 0x89, 0x4f,\n      0x83, 0x8d, 0x48, 0x65, 0x63, 0xe7, 0x82, 0x03, 0xd2, 0x40, 0x07, 0x1c,\n      0x86, 0x58, 0xd5, 0xac, 0x89, 0xb1, 0xca, 0x5c, 0xde, 0x21, 0x06, 0x88,\n      0x88, 0x0c, 0xe1, 0x20, 0xc0, 0xdf, 0xf1, 0x92, 0x9b, 0xb8, 0xa5, 0xeb,\n      0x6d, 0x89, 0xcc, 0x5c, 0x5c, 0x24, 0x3e, 0x9b, 0x3c, 0x35, 0x32, 0xa5,\n      0x04, 0x9e, 0x8c, 0x49, 0x01, 0xee, 0xbf, 0x1f, 0x2c, 0xb0, 0x52, 0xa8,\n      0xab, 0x79, 0x11, 0xcf, 0xb5, 0x5a, 0x16, 0xa1, 0xee, 0x21, 0x6a, 0x5a,\n      0x2b, 0x14, 0xae, 0x32, 0x3c, 0xa2, 0x6c, 0xa2, 0x40, 0x0c, 0xcb, 0x9e,\n      0x8f, 0x69, 0xab, 0xd7, 0xf3, 0xd8, 0xd1, 0xfb, 0x2d, 0xfa, 0xa9, 0x13,\n      0x09, 0xbf, 0xa7, 0xca, 0xc8, 0x90, 0x74, 0x23, 0x7b, 0x3e, 0xdd, 0x81,\n      0x32, 0xa7, 0x88, 0x42, 0x56, 0x8a, 0xcb, 0xe8, 0x8f, 0xef, 0x06, 0x9f,\n      0x39, 0x7e, 0x8e, 0x24, 0x07, 0xb3, 0xae, 0x7e, 0x13, 0x6b, 0xf2, 0xf8,\n      0x35, 0xe4, 0x16, 0x3e, 0xae, 0xf2, 0x55, 0x79, 0x10, 0x39, 0xfa, 0x70,\n      0x3a, 0x1b, 0x02, 0xb3, 0x2b, 0x1d, 0x44, 0xac, 0x30, 0x81, 0xd3, 0x11,\n      0xdd, 0x34, 0x1e, 0xcd, 0x26, 0xf5, 0x89, 0xc6, 0x55, 0x23, 0x17, 0x09,\n      0xd2, 0xc1, 0xdc, 0x49, 0xf9, 0x99, 0x36, 0x2b, 0xf5, 0xae, 0x42, 0x5c,\n      0xb7, 0x80, 0xda, 0x32, 0x69, 0x28, 0xa3, 0xee, 0xb9, 0xd4, 0x90, 0xa6,\n      0xab, 0x34, 0x17, 0x5e, 0xa0, 0xd6, 0xc1, 0x54, 0xc6, 0x9c, 0x58, 0x3a,\n      0xaf, 0xbf, 0xdc, 0x64};\n  unsigned char v[256];  // 2048 bits\n  mg_rsa_mod_pow(mod, sizeof(mod), exp, sizeof(exp), sig, sizeof(sig), v,\n                 sizeof(v));\n  ASSERT(v[sizeof(v) - 1] == 0xbc);\n#endif\n}\n\nstatic void test_crypto(void) {\n  test_md5();\n  test_sha1();\n  test_sha256();\n  test_sha384();\n  test_x25519();\n  test_rsa();\n}\n\n#define DASHBOARD(x) \\\n  printf(\"HEALTH_DASHBOARD\\t\\\"%s\\\": %s,\\n\", x, s_error ? \"false\" : \"true\");\n\nint main(void) {\n  const char *debug_level = getenv(\"V\");\n  if (debug_level == NULL) debug_level = \"3\";\n  mg_log_set(atoi(debug_level));\n\n  s_error = false;\n  test_crypto();\n  DASHBOARD(\"crypto\");\n\n  s_error = false;\n  test_split();\n  test_util();\n  test_str();\n  test_match();\n  test_crc32();\n  DASHBOARD(\"misc\");\n\n  s_error = false;\n  test_json();\n  DASHBOARD(\"json\");\n\n  s_error = false;\n  test_queue();\n  DASHBOARD(\"queue\");\n\n  s_error = false;\n  test_rpc();\n  DASHBOARD(\"rpc\");\n\n  s_error = false;\n  test_check_ip_acl();\n  DASHBOARD(\"ip_acl\");\n\n  s_error = false;\n  test_udp();\n  DASHBOARD(\"udp\");\n\n  s_error = false;\n  test_get_header_var();\n  test_http_get_var();\n  test_http_parse();\n  test_rewrites();\n  test_multipart();\n  test_invalid_listen_addr();\n  test_http_chunked();\n  DASHBOARD(\"http_support\");\n\n  s_error = false;\n  test_packed();\n  DASHBOARD(\"packed_fs\");\n\n  s_error = false;\n  test_dns();\n  DASHBOARD(\"dns\");\n\n  s_error = false;\n  test_timer();\n  DASHBOARD(\"timers\");\n\n  s_error = false;\n  test_url();\n  DASHBOARD(\"url\");\n\n  s_error = false;\n  test_iobuf();\n  DASHBOARD(\"iobuf\");\n\n  s_error = false;\n  test_base64();\n  DASHBOARD(\"base64\");\n\n  s_error = false;\n  test_tls();\n  DASHBOARD(\"tls\");\n\n  s_error = false;\n  test_ws();\n  test_ws_fragmentation();\n  DASHBOARD(\"ws\");\n\n  s_error = false;\n  test_http_upload();\n  test_http_stream_buffer();\n  test_http_server();\n  test_http_404();\n  test_http_no_content_length();\n  test_http_pipeline();\n  test_http_range();\n  DASHBOARD(\"http_server\");\n\n#ifndef LOCALHOST_ONLY\n  s_error = false;\n  test_sntp();\n  DASHBOARD(\"sntp\");\n\n  s_error = false;\n  test_mqtt();  // sorry, MQTT_LOCALHOST is also skipped\n  DASHBOARD(\"mqtt\");\n\n  s_error = false;\n  test_http_client();\n  DASHBOARD(\"http_client\");\n\n#else\n  (void) test_sntp, (void) test_mqtt, (void) test_http_client;\n#endif\n  s_error = false;\n  test_poll();\n  printf(\"HEALTH_DASHBOARD\\t\\\"poll\\\": %s\\n\", s_error ? \"false\" : \"true\");\n  // last entry with no comma\n\n#ifdef NO_ABORT\n  if (s_abort != 0) return EXIT_FAILURE;\n#endif\n\n#if defined(MBEDTLS_VERSION_NUMBER) && MBEDTLS_VERSION_NUMBER >= 0x03000000 && \\\n    defined(MBEDTLS_PSA_CRYPTO_C)\n  // Call mbedtls_psa_crypto_free() here to avoid triggering memory-leak\n  // detectors. We are actually freeing all our resources and leaving\n  mbedtls_psa_crypto_free();\n#endif\n  printf(\"SUCCESS. Total tests: %d\\n\", s_num_tests);\n  return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "test/wizard/Makefile",
    "content": "WIZARD_URL ?= http://mongoose.ws/wizard\n\nall build example: firmware.bin\n\nifeq \"$(IDE)\" \"GCC+make\"\nBUILD = $(MAKE) -f ../gcc+make/Makefile PROJECTS=wizard\nendif\nifeq \"$(IDE)\" \"CubeIDE\"\nBUILD = mkdir -p workspace && $(MAKE) -k -f ../cube/Makefile PROJECTS=wizard && rmdir workspace\nendif\nifeq \"$(IDE)\" \"MCUXpresso\"\nBUILD = mkdir -p workspace && $(MAKE) -k -f ../xpresso/Makefile PROJECTS=wizard && rmdir workspace\nendif\nifeq \"$(IDE)\" \"ModusIDE\"\nBUILD = true\nendif\nifeq \"$(IDE)\" \"e2studio\"\nBUILD = true\nendif\nifeq \"$(IDE)\" \"Pico-SDK\"\nBUILD = $(MAKE) -f ../pico-sdk/Makefile PROJECTS=wizard BOARD=$(BOARD)\nendif\nifeq \"$(IDE)\" \"ESP-IDF\"\nBUILD = $(MAKE) -f ../esp-idf/Makefile PROJECTS=wizard\nendif\nifeq \"$(IDE)\" \"Keil\"\nBUILD = true\nendif\nifeq \"$(IDE)\" \"Arduino\"\nBUILD = true\nendif\nifeq \"$(IDE)\" \"CGT+make\"\nBUILD = $(MAKE) -f ../cgt+make/Makefile PROJECTS=wizard\nendif\nifeq \"$(IDE)\" \"Zephyr\"\nBUILD = $(MAKE) -f ../zephyr/Makefile PROJECTS=wizard BOARD=$(BOARD)\nendif\n\n\nfirmware.bin: wizard\n\t(test \"$(BUILD)\" == \"true\" && echo \"NOT TESTING $(BOARD) $(IDE) $(RTOS): don't know how to test $(IDE) projects\" >> test.log) || true\n\t$(BUILD) && rm -rf wizard*\n\nwizard: FORCE\n\thash=$$(curl -s -X POST -H \"Content-Type: application/json\" -d '{\"build\":{\"board\":\"$(BOARD)\",\"ide\":\"$(IDE)\",\"rtos\":\"$(RTOS)\"}}' $(WIZARD_URL)/api/hash | jq -r '.hash') \\\n\t&& curl -s $(WIZARD_URL)/api/zip/$(BOARD)/$(IDE)/$(RTOS)/$$hash -o wizard.zip\n\tunzip wizard.zip\n\nFORCE:\n"
  },
  {
    "path": "test/wizard/test.sh",
    "content": "#!/bin/bash\n\nRTOSES=\"baremetal FreeRTOS\"\nWIZARD_URL=\"\"\ntest \"$1\" != \"\" && WIZARD_URL=\"WIZARD_URL=$1\"\n\ndotest ()\n{\n\techo \"BOARD=$1 IDE=$2 RTOS=$3\" >> test.log\n\tmake BOARD=$1 IDE=$2 RTOS=$3 $4 $WIZARD_URL || ( \\\n\t\techo \"^^^ FAILED ^^^\" >> test.log && rm -rf wizard* workspace )\n}\n\n\ncd `dirname \"$0\"`\nrm test.log\n\n\nSTM32=\"f207 f429 f439 f746 f756 f767 h563 h573 h723 h735 h743 h745 h747 h753 h755\"\nSTIDES=\"GCC+make CubeIDE\"\n# Keil: f756\nfor board in $STM32; do\n\tfor ide in $STIDES; do\n\t\tfor rtos in $RTOSES; do\n\t\t\tdotest $board $ide $rtos\n\t\tdone\n\tdone\ndone\ndotest h7s3l8 GCC+make baremetal\n\n\nNXP=\"rt1020 rt1024 rt1040 rt1060 rt1064 rt1170 mcxn947\"\nNXPIDES=\"GCC+make MCUXpresso\"\nfor board in $NXP; do\n\tfor ide in $NXPIDES; do\n\t\tfor rtos in $RTOSES; do\n\t\t\tdotest $board $ide $rtos\n\t\tdone\n\tdone\ndone\nNXP=\"rw612\"\nfor board in $NXP; do\n\tfor ide in $NXPIDES; do\n\t\tfor rtos in \"baremetal\"; do\n\t\t\tdotest $board $ide $rtos\n\t\tdone\n\tdone\ndone\n\n\nTI=\"tm4c129\"\nTIIDES=\"GCC+make\"\nfor board in $TI; do\n\tfor ide in $TIIDES; do\n\t\tfor rtos in $RTOSES; do\n\t\t\tdotest $board $ide $rtos\n\t\tdone\n\tdone\ndone\ndotest \"tms570\" \"CGT+make\" \"baremetal\"\n\n\nINFINEON=\"xmc4400 xmc4700 xmc7200\"\nINFINEONIDES=\"GCC+make ModusIDE\"\nfor board in $INFINEON; do\n\tfor ide in $INFINEONIDES; do\n\t\tfor rtos in \"baremetal\"; do\n\t\t\tdotest $board $ide $rtos\n\t\tdone\n\tdone\ndone\n\n\nESP=\"esp32\"\nfor board in $ESP; do\n\tdotest $board \"ESP-IDF\" \"baremetal\"\ndone\n\n\nPICO=\"evb-pico evb-pico2 evb-pico2-w5100 pico-w pico2-w\"\nfor board in $PICO; do\n\tfor rtos in \"baremetal\"; do\n\t\tdotest $board \"Pico-SDK\" $rtos\n\tdone\ndone\n\n\n#NORDIC\n\nRENESAS=\"ra6 ra8m1\"\nRENESASIDES=\"GCC+make e2studio\"\nfor board in $RENESAS; do\n\tfor ide in $RENESASIDES; do\n\t\tfor rtos in \"baremetal\"; do\n\t\t\tdotest $board $ide $rtos\n\t\tdone\n\tdone\ndone\n\n\n# f439 not supported\n# h755 not supported in 3.7.0 branch; master branch currently not building\n# other ST boards (PHY address != 0) might build and not work\nZEPHYR=\"zephyr zephyr-w5500 f207 f429 f746 f756 f767 h563 h573 h723 h735 h743 h745 h747 h753 mcxn947 rt1060 rt1064 evb-pico nrf91\"\nfor board in $ZEPHYR; do\n\tdotest $board \"Zephyr\" \"baremetal\"\ndone\n\n\n#ARDUINO=\"arduino arduino-esp32 teensy41\"\n#for board in $ARDUINO; do\n#\tdotest $board \"Arduino\" \"baremetal\"\n#done\n\nrm -rf workspace pico-sdk mcuxpresso .cache .eclipse .p2 build\ncd -\n"
  },
  {
    "path": "test/xpresso/Makefile",
    "content": "# NXP command line tool is useless for this task, using Eclipse headless build\n\nROOT ?= $(realpath $(CURDIR)/../..)\nPROJECTS ?= $(wildcard ../../tutorials/nxp/*-xpresso-*)\nTARGET ?= Debug\nDOCKER = docker run --rm --ulimit nofile=1024:524288 -v $(ROOT):$(ROOT) -v $(CURDIR):/root -w $(CURDIR) \nIMAGE ?= scaprile/xpresso\nHEADLESS_BUILD = /usr/local/mcuxpressoide/ide/mcuxpressoide --launcher.suppressErrors -nosplash -application org.eclipse.cdt.managedbuilder.core.headlessbuild\n\nall: $(PROJECTS)\n\t$(DOCKER) $(IMAGE) $(HEADLESS_BUILD) -data workspace -removeAll workspace\n\t$(DOCKER) $(IMAGE) /bin/bash -c \"rm -rf workspace/.metadata workspace/.mcuxpressoide* workspace/.gitignore mcuxpresso .cache .p2 .eclipse\"\n\n$(PROJECTS): FORCE\n\t(make -C $@ && make -C $@ clean) || ( \\\n\tPROJNAME=`xq -r .projectDescription.name $@/.project` && \\\n\t($(DOCKER) $(IMAGE) $(HEADLESS_BUILD) -data workspace -import $@ -cleanBuild $$PROJNAME/$(TARGET) || true) && \\\n\ttest -f $(@F)/$(TARGET)/$$PROJNAME.axf && \\\n\t$(DOCKER) $(IMAGE) /bin/bash -c \"find $@/$(TARGET) -mindepth 1 ! -name '*.ld' -exec rm -rf {} +\")\n\nFORCE:\n"
  },
  {
    "path": "test/zephyr/Makefile",
    "content": "ROOT ?= $(realpath $(CURDIR)/../..)\nZEPHYR_DIR ?= $(ROOT)/tutorials/zephyr/zephyrproject\nDOCKER ?= docker run --rm -v $(ROOT):$(ROOT) -w $(CURDIR)/wizard\nIMAGE ?= zephyrprojectrtos/ci\nREVNO ?= --mr v3.7-branch\nYQ ?= $(DOCKER) --user=\"root\" mikefarah/yq\n\nall: zephyr $(PROJECTS)\n\techo\n\n$(PROJECTS): FORCE\n\t$(DOCKER) -e ZEPHYR_BASE=$(ZEPHYR_DIR)/zephyr $(IMAGE) west build -b $(ZBNAME) -p auto $(realpath $@)\n\trm -rf build\n\nFORCE:\n\nzephyr: $(ZEPHYR_DIR)/modules/hal/cmsis\n\n$(ZEPHYR_DIR)/modules/hal/cmsis: $(ZEPHYR_DIR)/zephyr/west.yml\n\t$(DOCKER) $(IMAGE) /bin/sh -c 'cd $(ZEPHYR_DIR) && west update'\n\ttouch $(ZEPHYR_DIR)/modules/hal/cmsis\n\n# use '(YQ) -i eval' for in-place minify; this allows proper dependency processing and update. ALWAYS include \"cmsis\"...\n$(ZEPHYR_DIR)/zephyr/west.yml: $(ZEPHYR_DIR)/zephyr/west.yml.orig\n\t$(YQ) eval '(.manifest.defaults, .manifest.remotes, .manifest.projects[] | select(.name == \"cmsis\" or .name == \"hal_stm32\" or .name == \"hal_nxp\" or .name == \"hal_espressif\" or .name == \"hal_rpi_pico\" or .name == \"segger\" or .name == \"mbedtls\" or .name == \"mcuboot\" or .name == \"picolibc\" | del(.null) ), .manifest.self) as $$i ireduce({};setpath($$i | path; $$i)) | del(.manifest.projects.[].null) | del(..|select(length==0))' $(ZEPHYR_DIR)/zephyr/west.yml.orig > $(ZEPHYR_DIR)/zephyr/west.yml\n\n$(ZEPHYR_DIR)/zephyr/west.yml.orig: FORCE\n\ttest -d $(ZEPHYR_DIR) || \\\n\t( mkdir -p $(ZEPHYR_DIR) && \\\n\t$(DOCKER) $(IMAGE) west init $(REVNO) $(ZEPHYR_DIR) && \\\n\tmv $(ZEPHYR_DIR)/zephyr/west.yml $(ZEPHYR_DIR)/zephyr/west.yml.orig )\n\n\n# Wizard-style board name --> Zephyr board name; ZBNAME = table[BOARD]\nZ_f207 := nucleo_f207zg\nZ_f429 := nucleo_f429zi\nZ_f746 := nucleo_f746zg\nZ_f756 := nucleo_f756zg\nZ_f767 := nucleo_f767zi\nZ_h563 := nucleo_h563zi\nZ_h573 := stm32h573i_dk\nZ_h723 := nucleo_h723zg\nZ_h735 := stm32h735g_disco\nZ_h743 := nucleo_h743zi\nZ_h745 := stm32h745i_disco/stm32h745xx/m7\nZ_h747 := stm32h747i_disco/stm32h747xx/m7\nZ_h753 := nucleo_h753zi\nZ_h755 := nucleo_h755zi_q/stm32h755xx/m7\nZ_mcxn947 := frdm_mcxn947/mcxn947/cpu0\nZ_rt1060 := mimxrt1060_evk\nZ_rt1064 := mimxrt1064_evk\nZ_evb-pico := w5500_evb_pico\nZBNAME = $(Z_$(BOARD))\n"
  },
  {
    "path": "tutorials/README.md",
    "content": "# Mongoose Network Library tutorials and example code\n\nThe fastest way to quickly get Mongoose running on your hardware is to follow our [Tutorials](https://mongoose.ws/documentation/#tutorials):\n\n- Browse for your desired protocol and function, read the tutorial\n- For embedded hardware specifics, browse to your desired board, or the closest one. You'll find links to different IDE, RTOS, and TCP/IP stack options, and a link to our [Wizard](https://mongoose.ws/documentation/#mongoose-wizard), a tool that generates UI code for you.\n\n## Navigating this tree\n\nSteps to get the most out of this code base:\n\n- Most code here has a README.md file that points to a verbose tutorial describing how to get the intended functionality out of Mongoose Network Library. Code there runs as is in Windows, Ubuntu Linux, and Mac (very few cases don't run in Windows).\n  - Navigate your way to the desired protocol or function, read the README.md file\n  - Follow the linked tutorial\n  - In cases were there is no tutorial:\n    - Follow the [Build Tools](https://mongoose.ws/documentation/tutorials/tools/) tutorial to setup your development environment.\n    - run `make all`\n- Embedded hardware tutorials are conveniently linked from OS tutorials, or grouped by vendor and board.\n  - Navigate your way to the desired board or the closest one, read the README.md file. In most cases you'll find a link to our [Wizard](https://mongoose.ws/wizard/); for others, there is a link to a [Tutorial](https://mongoose.ws/documentation/#tutorials), as described at the top of this text. The Wizard will also link you to the tutorials you'll need.\n  - In cases were there you don't find a link to a tutorial:\n    - Follow the [Build Tools](https://mongoose.ws/documentation/tutorials/tools/) tutorial to setup your development environment.\n    - run `make build`\n- Once you have a running example close to your needs, you can start developing your application\n  - Please read our [User Guide](https://mongoose.ws/documentation/#user-guide)\n\n## Contributing\n\nRules for creating a new example:\n\n- Makefile golden reference for desktop/server examples: [http-server](http/http-server/)\n- Makefile golden reference for embedded examples: [stm32/nucleo-f746zg-baremetal-builtin-rndis](stm32/nucleo-f746zg-baremetal-builtin-rndis/)\n- Examples must build on Windows, Mac and Ubuntu Linux systems\n- Assume that users installed their tools according to the [Build Tools](https://mongoose.ws/documentation/tutorials/tools/) tutorial\n- Makefiles must not include other Makefiles\n- Use `CFLAGS` for system-specific compilation options\n- Use `CFLAGS_MONGOOSE` for Mongoose-specific compilation options\n- Use `$(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA)` to compile\n- If an external repository is required, download it on demand using git shallow clone. See the embedded examples golden reference\n- Keep Makefiles as short as possible, but verbose to understand them easily\n- Symlink files when required, like `mongoose.c`, `ca.pem`, etc. Make no copies\n- Examples README.md files should contain only the title and the link to the corresponding mongoose.ws tutorial page\n"
  },
  {
    "path": "tutorials/core/README.md",
    "content": "See detailed tutorials at https://mongoose.ws/documentation/#core"
  },
  {
    "path": "tutorials/core/embedded-filesystem/Makefile",
    "content": "PROG ?= example                   # Program we are building\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c packed_fs.c      # Source code files\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\nPACK = ./pack             # Utility to pack files into a packed filesystem\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += -DMG_ENABLE_PACKED_FS=1\n\nFILES_TO_EMBED ?= $(wildcard web_root/*)\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= example.exe           # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\n  PACK = pack.exe\nendif\n\nall: $(PROG)              # Default target. Build and run program\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES) $(FILES_TO_EMBED)       # Build program from sources\n\t$(CC) ../../../test/pack.c -o $(PACK)\n\t$(PACK) $(FILES_TO_EMBED) > packed_fs.c\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nclean:                    # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(PROG) *.dSYM $(PACK)\n\n.PHONY: compress expand gzipped plain all\n\n# See tutorial at https://mongoose.ws/tutorials/embedded-filesystem/#build-and-try\ngzipped: compress\n\t$(MAKE) all\n\nplain: expand\n\t$(MAKE) all\n\ncompress:\n\tfor file in $(FILES_TO_EMBED) ; do \\\n\t\tgzip -q $$file ; \\\n\tdone\n\nexpand:\n\tfor file in $(FILES_TO_EMBED) ; do \\\n\t\tgunzip -q $$file ; \\\n\tdone\n\n"
  },
  {
    "path": "tutorials/core/embedded-filesystem/README.md",
    "content": "See detailed tutorial at https://mongoose.ws/tutorials/core/embedded-filesystem/\n"
  },
  {
    "path": "tutorials/core/embedded-filesystem/main.c",
    "content": "// Copyright (c) 2022 Cesanta Software Limited\n// All rights reserved\n\n#include \"mongoose.h\"\n\nconst char *s_listening_url = \"http://0.0.0.0:8000\";\n\n// HTTP request handler function\nvoid fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_serve_opts opts = {\n        .root_dir = \"/web_root\",\n        .fs = &mg_fs_packed\n      };\n    mg_http_serve_dir(c, ev_data, &opts);\n  }\n}\n\nint main(void) {\n  struct mg_mgr mgr;\n  mg_log_set(MG_LL_INFO);\n  mg_mgr_init(&mgr);\n  mg_http_listen(&mgr, s_listening_url, fn, NULL);\n  while (true) mg_mgr_poll(&mgr, 500);\n  mg_mgr_free(&mgr);\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/core/embedded-filesystem/packed_fs.c",
    "content": "#include <stddef.h>\n#include <string.h>\n#include <time.h>\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\nconst char *mg_unlist(size_t no);\nconst char *mg_unpack(const char *, size_t *, time_t *);\n#if defined(__cplusplus)\n}\n#endif\n\nstatic const unsigned char v1[] = {\n  31, 139,   8,   8, 219,  27, 244,  98,   0,   3, 112, 114, // .......b..pr\n 101,  97,  99, 116,  46, 109, 105, 110,  46, 106, 115,   0, // eact.min.js.\n 157,  91, 123, 119, 219, 182, 146, 255, 127,  63,  69, 164, // .[{w.....?E.\n 211, 163,  18,  43,  68, 177, 147, 182, 187,  75,   5, 213, // ...+D....K..\n 105,  29, 183, 238, 109, 234, 230,  38, 105, 123, 123,  85, // i...m..&i{{U\n  93,  30, 138, 132,  44, 214,  20, 169, 242,  97,  91,  53, // ]...,....a[5\n 245, 221, 247,  55,   3, 128, 164, 108, 185, 247, 236, 158, // ...7...l....\n  36,  34,  30, 131,   1,  48,  47, 204,  12, 144, 155, 176, // $\"...0/.....\n 120, 166, 101,  38,   3,  89, 201,  92,  22, 178, 150, 169, // x.e&.Y......\n 186, 223, 203,  68, 205,  23,  50,  82,  47, 194,  40, 169, // ...D..2R/.(.\n  26, 125, 231, 205, 252, 178, 185, 106, 178, 102, 219, 124, // .}.....j.f.|\n  34, 154,  98, 187, 110, 174, 138,  36, 110, 242, 219, 178, // \".b.n..$n...\n 217, 100,  81, 147,  85, 183,  77, 146, 233, 121, 180,  94, // .dQ.U.M..y.^\n  52, 127, 230, 121, 243, 175, 188, 136, 155, 164, 210,  69, // 4..y.......E\n 248,  34, 153, 174, 234,  44, 170, 146,  60, 123,  86, 122, // .\"...,..<{Vz\n 152,  72, 220, 175, 242, 194, 187, 193, 172, 193, 179,  36, // .H.........$\n 123, 150,   9,  61,  15,  22,  42, 195, 207, 180, 208,  85, // {..=..*....U\n  93, 100, 207, 244, 190,  29, 177, 242, 180, 184,  39, 216, // ]d........'.\n  76, 233, 201,  54,  44, 116,  86,  93, 230, 177, 158, 102, // L..6,tV]...f\n 163,  81,  54,  41, 244,  38, 191, 209, 103, 235,  36, 141, // .Q6).&..g.$.\n   1, 214,  13,  10,  61, 222, 141,  25, 216, 109, 105,  74, // ....=....miJ\n 243, 214,  52, 103,  32, 134, 215, 122,  55,  84, 170, 158, // ..4g ..z7T..\n 229,  42, 152, 215,  11, 127,  88, 232,  21, 215,  11,  83, // .*....X....S\n  79, 241, 195, 165, 105, 178, 242, 194, 226, 170, 222,  96, // O...i......`\n 230, 114, 146, 234, 236, 170,  90, 127, 249, 114,  52, 242, // .r....Z..r4.\n 210,  73,  68,  19,  99,  69, 234,  81, 255, 171, 153, 158, // .ID.cE.Q....\n  68,  97, 154, 118,  35, 229,  75, 225,  87,  66,  14, 221, // Da.v#.K.WB..\n  26,  49,  87, 181, 219, 234, 124, 245, 140, 118,  82, 167, // .1W...|..vR.\n 233,  64, 101, 147,  88, 175, 194,  58, 173, 222,  21, 249, // .@e.X..:....\n 182,  20, 237,  98,  31, 180, 223, 228,  73, 252, 236,  68, // ...b....I..D\n  41,  69,  75, 164, 117, 208,  74,  15,  97, 208,  34,  28, // )EK.u.J.a.\".\n  45, 183, 160,  69, 202, 124, 165,  89, 122,  68, 218, 130, // -..E.|.YzD..\n  23, 150, 225, 134,  80,  32,  17,  45, 201, 215, 114,  75, // ....P .-..rK\n  72, 252,  74, 130,  70,  62,   0, 244, 202,  47, 100,  16, // H.J.F>.../d.\n  92, 251, 132,   1,   5, 247,  93, 250,  39, 248, 213, 174, // ......].'...\n  26, 251, 102, 105,  40,  70, 174, 109, 109,  10,  81, 158, // ..fi(F.mm.Q.\n 149,  85,  81,  71,  85,  94, 116,  64,  55, 220,  71,  52, // .UQGU^t@7.G4\n  31, 143,   3, 191, 222, 187,  21,  59, 106, 220, 100,  96, // .......;j.d`\n  52, 177, 153,  11,  94,  42, 100, 218, 173, 126,  77, 114, // 4...^*d..~Mr\n 225, 196, 165, 229,  68, 215,  31,  27,  73, 171, 214,  73, // ....D...I..I\n  57, 225, 237,  40, 236, 150,  42,  88,  74, 165, 239,  42, // 9..(..*XJ..*\n 213, 131, 189,  49, 176,  96, 180,  89,  80,  38,  90, 196, // ...1.`.YP&Z.\n  65,  48,  67,  47,  62, 146, 126, 240, 247, 122, 146, 100, // A0C/>.~..z.d\n 177, 190, 251, 145, 228, 114, 124,  42, 120,  11, 211,  86, // .....r|*x..V\n 158, 167, 217, 107, 205,  64,  70,  14, 166, 217, 120,  44, // ...k.@F...x,\n  44, 218, 129, 242,   2, 197, 157, 243, 108,  33,  28, 207, // ,.......l!..\n   9, 165, 118, 211, 113, 197,  82, 225, 136, 160, 232,   9, // ..v.q.R.....\n  21, 104,  61, 102, 218, 110,   3, 187,  86,  73, 100,  48, // .h=f.n..VId0\n 237, 230, 211,  60,  95,  59,  23,  85,  34, 163, 124,  84, // ...<_;.U\".|T\n  52, 189, 209, 100,  25, 150,  90,  49, 151,  50, 117, 242, // 4..d..Z1.2u.\n 255, 220, 192, 253,  35, 132, 102,  47, 203,  66, 135, 215, // ....#.f/.B..\n 123, 187,  61,  90, 229, 190,  91, 244, 134,  22, 237,  13, // {.=Z..[.....\n 104,  76,  12,  49, 230, 175,  26, 156,   0, 115,  53, 217, // hL.1.....s5.\n 214,  37,  49, 120,  52,  26,  92, 161, 185,  24, 143, 155, // .%1x4.......\n 166,  24,  40, 150, 242, 101,  14,   4, 250, 189,   6,  23, // ..(..e......\n 138,  36, 187,   2, 140, 231,  21,  71, 123, 154,  38,  23, // .$.....G{.&.\n 222,  85,  79, 226, 175, 188, 206, 244, 232,  41,  99,  86, // .UO......)cV\n 149, 219, 169, 208,  40, 151, 121,  81, 121,  14, 222,  72, // ....(.yQy..H\n  69,  79,  20, 110, 240, 111, 249,  60, 115, 165, 189, 144, // EO.n.o.<s...\n  21, 217,  72, 141,  97,  27, 221,  27, 214, 242, 194, 233, // ..H.a.......\n 215, 212, 109, 178,  80,  94, 174,  60, 152,  50,  65,  72, // ..m.P^.<.2AH\n 232,  71,  75, 175,  86, 132, 242,  29, 237,  36,  32, 124, // .GK.V....$ |\n  94, 165,  74,  15,   6,  56,  23,  12, 165, 114, 250,  29, // ^.J..8...r..\n 159, 202, 119,  94,  13, 116, 149,  36, 232,  76,  26,  53, // ..w^.t.$.L.5\n   2,  81, 234,  73, 126, 155, 233, 226, 195, 207, 223, 158, // .Q.I~.......\n 167, 154, 108, 141,  52, 156, 161,  97, 235, 217, 188,  88, // ..l.4..a...X\n  88,  93, 148,  70, 184,  11,   8,  80,  46, 160, 208, 220, // X].F...P....\n  47, 228,  27,  47, 192,  76,  92, 211,   3,  85, 140,  70, // /../.L...U.F\n  59, 116,  11, 177, 239, 209, 237, 218,  59,  60,  30,  34, // ;t......;<.\"\n  89, 202, 149, 217, 100,  40,  99, 185, 147,  27, 121,  37, // Y...d(c...y%\n 175, 229, 157, 188,  80,  21, 113,  15,  34, 210,  52, 137, // ....P.q.\".4.\n  60,  87,  23, 142, 184,  68, 117, 214,  30, 218,  95,   8, // <W...Du..._.\n  49,  11,  95, 103, 174,  47,  60,  16, 177,  13,  75, 206, // 1._g./<...K.\n 245,  60,  92,  40, 179,  94, 180, 100, 168, 129, 155, 195, // .<.(.^.d....\n 101, 158, 167,  58, 236, 105, 196, 102,  70,  48, 254,  16, // e..:.i.fF0..\n 182,   5,  12, 239, 181,   3,  56, 171,  55,  75,  93,  28, // ......8.7K].\n 182,  45, 147, 171,  36, 171, 250, 227, 183,  60,  47,  54, // .-..$....</6\n  96,  20, 128, 203, 194, 255, 170,  40, 194, 221,  36,  41, // `......(..$)\n 249, 235, 109,   4, 192, 214, 242, 222,  25,  25, 127, 179, // ..m.........\n 239, 129, 179,  85, 245,  55,  36,  16,  95, 158,   0, 112, // ...U.7$._..p\n 195,  90,  42,  55, 198, 234, 224,  11,  35, 106,  17,  51, // .Z*7....#j.3\n 207, 253, 141,  96,  83,  67,  53,  21, 112, 227, 146, 247, // ...`SC5.p...\n 188,   4, 139, 205, 150, 149, 183,  83,  23, 102, 207, 187, // .......S.f..\n 209, 136,  49,  40, 181, 163,  15, 213,   8, 189, 162,  58, // ..1(.......:\n  21,   4, 193,  41,  35,  11,  83, 157, 150, 250,  25, 145, // ...)#.S.....\n  58,   6, 133, 227, 215, 231, 211,  24, 164, 165, 185,  24, // :...........\n  95,  76,  74, 251, 215, 200, 238,   9, 202,  97,  51, 186, // _LJ......a3.\n 187,  99,  54, 236, 223,  65,   4,  54, 114, 167, 118,  77, // .c6..A.6r.vM\n 147,  30,  72, 129, 188,  82,  27,  35, 198,  49,  10,  56, // ..H..R.#.1.8\n  42,  48, 201, 142, 190,   3,  69,   2, 127, 215,  52, 222, // *0....E...4.\n  29, 152,  46,  36,  55, 142,  70, 119,  70, 183, 185, 230, // ...$7.FwF...\n 232,  45, 109,  99, 204, 212, 136, 154, 230,  10, 141, 194, // .-mc........\n 138, 241, 213, 204,  90, 229, 107, 160, 187,  86,  87,  71, // ....Z.k..VWG\n 207,  80, 179,  17, 103, 147,   8, 203,  53, 237, 142,   4, // .P..g...5...\n 142,  54, 135, 239, 108, 195, 246, 165,  84,  75, 111, 131, // .6..l...TKo.\n 133, 195, 132, 150, 234, 204, 108,  74,  94,  64, 124,  75, // ......lJ^@|K\n  33,  87, 144, 144, 124, 203, 136, 161,  86, 129, 177, 182, // !W..|...V...\n  71,  38,  11, 236, 100,  44, 209,  64,  41, 124,  61, 185, // G&..d,.@)|=.\n   9, 211,  90, 171, 225,  16, 104, 105, 255, 100,  12,  21, // ..Z...hi.d..\n  74, 101, 207, 101, 129,   1, 198, 152,  82, 221, 120,  59, // Je.e....R.x;\n 168, 151, 211,   8, 173, 174, 161,  16, 231, 211, 240, 249, // ............\n 243, 169,  48, 203,  39, 150,   2, 242,  47, 102, 238, 224, // ..0.'.../f..\n   8, 195, 104, 228,  74, 138,   5,  41, 110, 151, 118, 227, // ..h.J..)n.v.\n  85,  50, 196,  41,  37, 228,  79,  30, 193,  72, 150,  42, // U2.)%.O..H.*\n  65,  71, 196,  29, 251,  23,  70,  21, 239, 250, 170, 248, // AG....F.....\n 209, 187,  35, 200, 187, 249, 120, 220, 126, 122, 182,  96, // ..#...x.~z.`\n 105, 108, 129, 209, 126,  24,   4,  86, 237,  10, 104, 170, // il..~..V..h.\n 195, 131, 163,   2,  42, 216,  58, 115,  94,  84,  36, 122, // ....*.:s^T$z\n  30, 153,  24, 156, 194, 153,  58, 178, 179, 220,  80, 123, // ......:...P{\n 233, 229, 140, 221,  63,  35, 171, 132,  63,  60, 222,  24, // ....?#..?<..\n  39,  24, 227, 214, 169, 233,  29, 222, 103, 125, 227, 100, // '.......g}.d\n 150,   5, 111,  79,  38, 180, 201, 214,  70, 146, 201, 140, // ..oO&...F...\n 133,  49, 180,  49,  27, 208, 248,  64, 105, 218, 163,  63, // .1.1...@i..?\n 192, 161,   1,  43, 216,  52, 166, 154, 247, 248,  39, 180, // ...+.4....'.\n 223, 130,   1, 160,  56,  96,  45,  44, 186, 158, 132, 219, // ....8`-,....\n  45,  14,  31, 227, 142, 194, 164, 214, 172,  58,  60,   1, // -........:<.\n  31,  59, 169,  42, 224,  84, 159,  76,  81,  72,  39,  25, // .;.*.T.LQH'.\n 124, 144,  15, 201,  50,  53,  71,  88, 242, 186,  61, 135, // |...25GX..=.\n 146, 177, 122,  73, 246, 144, 102,  23, 172, 131,  56, 171, // ..zI..f...8.\n  52, 188, 142,  82,  23, 213, 215,  26, 136, 180,  71,  59, // 4..R......G;\n   5, 250, 194, 157, 172, 221,  89,  48, 171, 253, 188, 143, // ......Y0....\n 187, 163, 211, 157,  99, 220, 240,  57, 200,  14, 155, 122, // ....c..9...z\n 178, 128, 147,  90, 106, 246,  24, 129, 122, 231,  49, 225, // ...Zj...z.1.\n  53,  14, 119, 107, 121, 131, 217, 112, 232,  59,  59,  58, // 5.wky..p.;;:\n 104, 101, 176, 105, 162,  73, 165, 203, 202, 203, 196,  44, // he.i.I.....,\n 240, 131, 241, 112, 123,  55, 236, 166, 185, 232, 216,  97, // ...p{7.....a\n 152,  81,  76, 153, 110, 176, 209, 187,  84, 243, 204, 194, // .QL.n...T...\n  84,  15,  77, 118,   0, 250,  49, 200,  36,  42, 203, 143, // T.Mv..1.$*..\n 228, 160,   5, 134, 114, 199, 128,  43, 246,  23,  14, 193, // ....r..+....\n  43, 210,  62, 248, 252,  68, 233, 140, 220, 230,  74,   4, // +.>..D....J.\n 208,  20, 246, 246, 155, 230, 206, 193,  99, 113, 128,  35, // ........cq.#\n 225,   8,  58, 208,  64,   0,  99,  64,  59, 199,  20, 248, // ..:.@.c@;...\n  28, 194,  83, 135, 216,  59,  57,  25, 230, 142, 124, 163, // ..S..;9...|.\n 209,  48,  51, 229, 211, 133, 128,  11,   2, 250, 227, 104, // .03........h\n 167, 168, 100, 155, 134, 145, 246,  94, 156, 133,  91, 176, // ..d....^..[.\n  71, 127, 242, 130, 166, 132,  61,  67,  95, 149, 191, 205, // G.....=C_...\n 111, 117, 113,   6,  23, 201,  19, 152,  89, 207,  30, 180, // ouq.....Y...\n  77, 202,  52, 193,  88,  68,  11,  89,  91, 132,  22, 164, // M.4.XD.Y[...\n 176, 163, 248,  69,  16, 195, 181, 121,  54,  46,  16, 158, // ...E...y6...\n 200,  96,  86,  53,  13,   4,  47, 142, 207, 111,  32, 139, // .`V5../..o .\n 111, 147, 178, 210, 240,   5, 192, 202,  98, 246, 193,  63, // o.......b..?\n 135, 152, 192,  54, 153,  40, 233,  41, 128,  86,   1, 134, // ...6.(.).V..\n 113, 152,  93, 233,  34, 175, 203, 116, 247,  65,  87, 223, // q.].\"..t.AW.\n 101, 128, 187, 248, 248, 195,  91,  50, 134, 198,  59, 206, // e.....[2..;.\n 197, 193, 246, 238,  32,  96, 215, 243,  11, 127, 189, 192, // .... `......\n   6, 215,  67, 209, 245, 148, 151, 225, 134, 183,  93,  14, // ..C.......].\n 123, 248, 215,  20,  98,  17,  50,  16,  46, 197,  66,  92, // {...b.2...B.\n  25, 108, 216, 184, 114,  21,  46, 191,  35, 255, 218, 213, // .l..r...#...\n  99, 248,  54, 105,  30, 198, 182, 206, 220, 210, 162,  42, // c.6i.......*\n 118, 247,  15,   5,  53, 152,  90, 101, 217,  71,  97,  21, // v...5.Ze.Ga.\n 113, 120, 176,  63, 102,  66,  65,  72, 235, 185,  66, 136, // qx.?fBAH..B.\n   6, 167,   3, 214, 249,  97, 216,  99, 106, 209,  50, 213, // .....a.cj.2.\n  40, 200,  87,  21, 196, 111,  89,  87, 218, 106, 136,  37, // (.W..oYW.j.%\n 104, 175,  89, 244, 253, 218, 115, 154, 154,  67, 141, 116, // h.Y...s..C.t\n 110,  92, 246, 241, 224, 116, 225, 101,  19,  77,  28, 152, // n....t.e.M..\n 217,  47,  57, 241, 253, 144, 245, 195, 145,  81,  39, 255, // ./9......Q'.\n 118,  20,  29, 203, 189, 176,  93,  38,  50,  50,  90, 183, // v.....]&22Z.\n 146, 161, 220, 202,  27, 235, 155,  45, 229,  25, 121, 103, // .......-..yg\n 240, 200, 204,   9, 114,  96,  27, 131,  73,  47,  58,  19, // ....r`..I/:.\n 189,  24, 108, 106, 232,  68, 254, 220,  26, 180, 138,  76, // ..lj.D.....L\n   9,  38, 204, 156,  91,  21,  27, 101,  42, 175,  77, 248, // .&..[..e*.M.\n  80, 171, 121, 130, 131, 222,  91, 177, 153,  93, 194, 172, // P.y...[..]..\n 145, 146,  77, 153,  89, 108,   2,  30, 115, 227, 156, 229, // ..M.Yl..s...\n 138, 252,  31, 227,  45, 157,  41, 140,  62, 119,  49, 218, // ....-.).>w1.\n  71, 242,  73,  70, 163, 124, 190,  34, 183,   0, 135, 145, // G.IF.|.\"....\n  90, 205, 206, 102, 103,   6, 214,  28, 185,  62, 117,  33, // Z..fg....>u!\n  70, 165, 197,  68, 179,  43, 133,  19, 141,  86, 100, 214, // F..D.+...Vd.\n  26, 145, 255, 172,  66, 252, 156, 251, 222,  16, 163, 170, // ....B.......\n 156, 230,  29,  66, 134, 206,  71, 163, 243,  73, 219,   2, // ...B..G..I..\n 142,  82, 208,  48,  51,  67,  67, 149, 233,  91, 176, 113, // .R.03CC..[.q\n  41, 239, 132, 239, 245, 219,  98, 110, 147,  97, 159,  98, // ).....bn.a.b\n 234,  28, 117,  51,  94, 125,  37, 228, 217, 104, 116,  54, // ..u3^}%..ht6\n  41, 235, 165,  23,  18, 156, 137,  60, 151,  40, 149,  85, // )......<.(.U\n  88, 105, 200, 158,  45, 177,  34, 135, 109,  48, 122,  39, // Xi..-.\".m0z'\n 105, 149, 153, 202, 229, 150, 215,  75, 129,  16,  55, 173, // i......K..7.\n 217, 119,  50,  98,  78, 117, 248,  20,  30, 127, 149,  69, // .w2bNu.....E\n 228, 220, 164, 243, 201, 149, 174, 222,  32, 240, 185, 209, // ........ ...\n 241,   7, 234, 248, 166, 200,  55, 156,  12, 104,  71, 184, // ......7..hG.\n  33, 109,   3,  71,  25,  92, 132, 117,  42,  77, 163, 124, // !m.G...u*M.|\n  26, 145, 183, 116, 192,  66, 222,  40, 187,  57, 248, 132, // ...t.B.(.9..\n  22, 173, 220,  10, 179, 206, 191,  90, 138,  89,  44, 109, // .......Z.Y,m\n 124, 179, 205,  51,  72, 244,  47,  73, 154, 254, 128, 192, // |..3H./I....\n  13,   6, 248,  88, 171, 231, 246, 215, 235, 124, 147, 196, // ...X.....|..\n 237,   8,  80, 200, 248, 142,  71, 250,  69, 123, 128, 252, // ..P...G.E{..\n 251, 117,  45, 161,   8,  55,  79,  44, 239, 189, 142,  52, // .u-..7O,...4\n 198,  88, 200, 191, 232,  52, 210,  49,   8, 141,  83, 230, // .X...4.1..S.\n 112, 149, 235, 188,  78, 227,  51,  55, 232, 167, 109, 204, // p...N.37..m.\n  60,  24, 156,  42, 245,  84, 175, 163,  52, 208,  53,  77, // <..*.T..4.5M\n 192,  65, 160,  98, 137, 190,  17, 247, 143, 132, 202, 200, // .A.b........\n   5,  43, 226, 205, 192, 130,  89,  22,  67, 140,  78,   5, // .+....Y.C.N.\n 163, 186, 161, 195, 226, 129, 218,  94, 115, 249, 218, 148, // .......^s...\n  39, 176, 194, 231,  33, 236, 102,  63, 140, 213,  54,  46, // '...!.f?..6.\n  87, 129, 216,  27,  60, 107, 235, 166, 140,  70, 169, 165, // W...<k...F..\n 187, 104, 237, 238,  81, 226, 185, 237,  30, 109, 238, 237, // .h..Q....m..\n 243,  40, 155, 187, 193,  45, 159, 219, 229,  17,  37,  30, // .(...-....%.\n 195, 122, 108, 242,  40, 122,  61,  84, 174, 227,  52, 179, // .zl.(z=T..4.\n 166, 170, 176, 166,  74,  58, 154, 181,  36, 163, 239,  59, // ....J:..$..;\n 248, 172,  43, 229, 116, 220, 115, 114, 239, 164, 190, 157, // ..+.t.sr....\n  71,  60,  64, 238,  54,   4, 161,  99, 151, 240, 204, 128, // G<@.6..c....\n 145,  35,  12, 205, 179,  17, 190, 124, 212, 239, 145, 122, // .#.....|...z\n 109, 157,   3, 202, 221,  31, 178, 112,  11,  57, 177, 222, // m......p.9..\n 159, 217,  40,  76, 201, 230, 233,  94,  34,   3, 208,  92, // ..(L...^\"...\n  40, 179,   8, 196,  93,  43,  23, 234, 173, 141, 100,  42, // (...]+....d*\n 181, 162,  24, 112, 182, 178, 214, 180,  13, 110,  87, 146, // ...p.....nW.\n 194, 253, 195,   8, 248,  66, 204,  46, 252, 249, 197, 226, // .....B......\n 209,  89, 131, 229, 119, 217, 158, 254,  89, 240, 132, 172, // .Y..w...Y...\n 200,  43,  43, 153, 231,  76,  36, 134,  53, 100, 215,  32, // .++..L$.5d. \n 187, 241, 177, 108,  82,  16,  14,  89,  95, 240, 103, 222, // ...lR..Y_.g.\n  67, 145, 181, 162,  44, 124,  83, 185, 245, 172, 100, 247, // C...,|S...d.\n 150,  24, 137,  41, 179,  56,  78,  86,  43,  29,  91,  46, // ...).8NV+.[.\n 119, 254, 129, 153, 128, 215, 235,  69, 134, 226,   3,  85, // w......E...U\n  11,  27,  62, 105, 149, 216,  29,  13,   6, 145, 172, 231, // ..>i........\n 117, 155, 249,  75, 196, 194, 174, 156, 164,  71, 155,  51, // u..K.....G.3\n 184, 239,   2, 188, 161,  38, 113,  79, 189,  17,  37,  48, // .....&qO..%0\n 241,  65,  60, 163, 197, 163,  84,  17, 128, 248, 120, 100, // .A<...T...xd\n   2, 174, 237, 116, 199,  83,  74,  54, 161,  76, 154, 216, // ...t.SJ6.L..\n 237, 160, 157, 159, 109, 195, 190, 159, 180, 185, 245, 250, // ....m.......\n  41, 155, 214,  49,  40, 217,  49,  88, 131, 118,  70, 140, // )..1(.1X.vF.\n 227, 246, 236, 221,  89, 231,  64, 110,  16, 163, 176, 215, // ....Y.@n....\n 125,  67,  46, 183, 218, 113, 222, 106, 112, 226,  84, 180, // }C...q.jp.T.\n 102, 191, 121, 186, 121,  93, 187, 144, 101,  99,  50,  56, // f.y.y]..ec28\n 136, 109, 235, 249, 134,  67, 189, 146,  60,  40, 136, 232, // .m...C..<(..\n 110,   6, 127,  38, 199, 194, 201,  33,   4,  42, 255,  21, // n..&...!.*..\n 194, 226,   9, 165, 115, 249, 108,  23, 216, 129,  42,  37, // ....s.l...*%\n 141,  50, 177, 146, 201,  57, 244,  18, 177, 157, 245,  86, // .2...9.....V\n  59, 231, 155, 196, 121, 196,  57, 245,  73,   4, 232,  74, // ;...y.9.I..J\n 147, 247,  79,  65, 152,  23, 139, 105, 166, 138, 217, 131, // ..OA...i....\n 110, 155,  20, 187, 252,   0,   7, 180, 170, 182, 254, 139, // n...........\n  23, 183, 183, 183, 147, 219,  87, 147, 188, 184, 122, 241, // ......W...z.\n 242, 228, 228, 228,   5, 237,  19, 234, 226,  31,  31, 232, // ............\n 237, 100,  12,  69,  24, 141,  98,  23, 209, 201, 136, 100, // .d.E..b....d\n 181, 191, 176,  53, 126,  99, 196,  69, 196, 107, 168,  95, // ...5~c.E.k._\n 104, 170, 158, 173, 196, 221,  65,  84, 147,  92,  91,  78, // h.....AT..[N\n 102,  70, 231, 104, 233,  37, 116,  64, 121,  45,  83, 154, // fF.h.%t@y-S.\n  38,  21, 147,  39, 188, 113,  56,   8, 241, 147, 125, 131, // &..'.q8...}.\n 168,  37, 152, 227, 211, 154, 174, 114, 136, 163, 155, 215, // .%.....r....\n 217,  36, 116,  46, 107, 217, 103, 221, 122, 222, 239,   1, // .$t.k.g.z...\n  47,  38,  25, 184,  69, 119,  10, 135, 173, 236, 112,  77, // /&..Ew....pM\n  61, 216, 166, 144, 120, 188,  37,  85,  30, 141, 182,  36, // =...x.%U...$\n 179, 213, 198, 250,  39,  84, 106, 154, 174,  13,  72,  18, // ....'Tj...H.\n 183,  60, 193,  36, 105, 171, 106, 219,  13, 134,   7, 142, // .<.$i.j.....\n   8, 137, 104, 218,  79, 190,  30, 134, 145, 180, 155, 194, // ..h.O.......\n  94, 222,  56, 107,  69, 242, 137,  88, 220,  94, 230, 112, // ^.8kE..X.^.p\n  88, 206,  55,  38,  77,  67, 113, 168, 185, 242,  64, 252, // X.7&MCq...@.\n  86,  44, 160, 159,  29, 130,  76, 228,  20, 118,  56, 111, // V,....L..v8o\n 180,  13, 109,  51,   0,   2, 217, 211, 200, 135,  76,   2, // ..m3......L.\n  87, 137, 214,  58, 186, 214, 177, 173, 210,  44,  28,  55, // W..:.....,.7\n  16,  14,  59,  59,  77, 108, 103, 223,  67,  29,  99, 185, // ..;;Mlg.C.c.\n  70,  43, 172, 230,  86, 184, 100, 104,  27,  29, 109, 156, // F+..V.dh..m.\n  30, 182, 150,  24, 118,  56, 147, 143,  50, 145,  27,  31, // ....v8..2...\n 172, 112, 138, 109, 130,  39, 157,  92, 101,  63,  46, 127, // .p.m.'..e?..\n 215,  17,  71,  84,  59, 214, 246, 122,  86,  35, 152, 241, // ..GT;..zV#..\n  43, 147,   9, 163,  60,  16, 244,  55,  58,  84, 225, 141, // +...<..7:T..\n 234,  52, 184, 203,  62, 145,  50, 146, 161, 100,  85, 158, // .4..>.2..dU.\n 194,  44, 122, 118, 215,  32,  92,  12,  84,  46, 108, 192, // .,zv. ..T.l.\n 240, 216, 136,   4,   9, 195, 134, 147,  44,  92,   5, 101, // ........,..e\n 176, 145, 171,  66, 151, 165,  53,  31, 131,  13,  64,  46, // ...B..5...@.\n 176,  27, 139,   9,  49, 201, 218, 192,  74, 242,  79,  90, // ....1...J.OZ\n  66,  30, 155, 193, 246,  81, 234, 146, 167, 176, 117, 139, // B....Q....u.\n 207, 141, 100, 140, 182,  66,  56, 197, 254, 113, 162, 232, // ..d..B8..q..\n 163, 181, 211, 108, 113, 143,  93, 175, 204, 180, 199, 225, // ...lq.].....\n  93,  84,  23, 148, 216,  81, 193,  99,  59, 123,  96, 229, // ]T...Q.c;{`.\n 127, 114,   8, 237,  45,  35, 223, 188,  76, 234, 108,  99, // .r..-#..L.lc\n 156, 211, 182,   8,   4, 146,  83,  97,  38,  59, 234, 229, // ......Sa&;..\n 110,   6, 132,  54, 174,  72,  25,  36, 154, 163, 105,  62, // n..6.H.$..i>\n  82,  10, 140, 197, 182,  77, 129, 218,  60,  90, 100,  18, // R....M..<Zd.\n 199, 249,   3,  79, 202,  76, 194,  49, 241, 241,  46, 239, // ...O.L.1....\n 216, 129,  33, 246, 185,  57, 186, 115, 118, 113,  56, 201, // ..!..9.svq8.\n  75, 200,  77, 198, 142, 229, 163, 128, 213,  40,  94, 231, // K.M......(^.\n  78,  70,  10, 152, 138,  28, 194,  60,  26, 253, 228, 229, // NF.....<....\n  44, 217, 242, 136,  14, 153, 216,  21,  81, 159, 243,  96, // ,.......Q..`\n 236, 182,  86, 230, 206,  73, 200, 238, 166, 200, 165, 224, // ..V..I......\n  58, 138, 126, 229, 114,  84, 150, 123, 238, 194, 206, 197, // :.~.rT.{....\n  90, 102, 225,  45, 248,  15,  94, 223,  64, 144, 220,  79, // Zf.-..^.@..O\n 105, 127, 230, 196, 165,  62, 178, 216, 216, 198, 177, 124, // i....>.....|\n 163,  48,  87,   7,  57, 241, 128, 239,  43, 140,  99, 193, // .0W.9...+.c.\n 151, 222, 239, 160,  46, 129, 242,   6, 208, 175,  28,  29, // ............\n 130, 117,  53, 244, 214, 134,  47, 243,   0,  17,  89,  77, // .u5.../...YM\n 121, 240, 180, 187, 132, 169,  30,  93, 194, 240, 232, 217, // y......]....\n  60,  95, 248, 181, 153, 170, 154, 172, 146, 162,  52, 190, // <_........4.\n 158, 187,  30, 174, 250, 103, 128, 185, 167,  73, 236, 200, // .....g...I..\n  28, 227, 106, 162, 213, 193,  64,  74, 252, 189, 241, 146, // ..j...@J....\n   3,  50, 124,  99,  46, 170, 248,   2,  82, 221, 243, 229, // .2|c....R...\n 171,  26, 226, 115,  54,  28, 215, 227,  49, 221, 215, 106, // ...s6...1..j\n   9, 231, 178, 196, 225,  86, 248,  79,  92, 110,  57, 163, // .....V.O.n9.\n 227, 101,  98,  47,  17, 204, 220,  36, 241,   1, 176,  69, // .eb/...$...E\n  47, 171, 105, 159,  53,  15,  92,  87, 216,  10, 119, 129, // /.i.5..W..w.\n 133, 240, 150, 242,  51,   4,  37, 143, 129, 170, 158,  31, // ....3.%.....\n 239,  48, 238,  13, 228, 209, 136,  72, 245, 151, 210,  93, // .0.....H...]\n 234,  26,  43, 194, 202, 195,  37, 114,  26, 217, 115,  66, // ..+...%r..sB\n   8,  96, 177, 213, 203, 131, 177, 129, 187,  91, 156, 186, // .`.......[..\n  71,   5, 199,  84, 102, 122, 188, 185, 191, 106,  76, 180, // G..Tfz...jL.\n 229, 252,  92, 208, 187,  17, 150,  48, 103, 252,  50, 129, // .......0g.2.\n 185,  75, 215, 157,  36, 240, 237, 237, 116, 123, 197,  29, // .K..$...t{..\n  76,  28, 141,  57, 186, 154,  56, 246, 244,  51,  31, 176, // L..9..8..3..\n  63, 112,  65,  77,  18,  80, 102, 196,  88, 253, 128, 123, // ?pAM.Pf.X..{\n 237, 181,  51, 105, 193,  52, 227,  88, 102, 202, 158,  88, // ..3i.4.Xf..X\n 192, 229, 136,  46,  80, 233, 164,  97, 227,  64, 237, 213, // ....P..a.@..\n 131, 108, 143, 139,  82, 171,  99, 161, 241, 121,  81, 228, // .l..R.c..yQ.\n   5,  59, 195,  37, 162,  12, 106, 245, 158, 134, 195, 102, // .;.%..j....f\n 133, 204, 205, 253, 131, 179,  91, 193,  65, 128, 118,  70, // ......[.A.vF\n  54, 136, 209,  61, 106,  37, 202, 181,  99, 243, 254, 117, // 6..=j%..c..u\n 248, 121, 107, 133, 177,  95, 173, 178, 125, 181,  46, 242, // .yk.._..}...\n  91,   4, 155, 123, 104, 232,   9,  60, 179,  46, 135, 227, // [..{h..<....\n  22, 169,  14, 137, 100, 238, 229,   3,  27,   9, 177,  76, // ....d......L\n 112,  26, 197, 149,  72, 121,  89,  80, 104, 236, 204, 181, // p...HyYPh...\n 250, 174,  96, 146,  36,  29, 196, 209, 235,  39, 142, 147, // ..`.$....'..\n 149,  54,  65,  29, 226, 200,  78,  64,  65,  20, 116, 150, // .6A...N@A.t.\n 198, 251, 183, 215, 240, 237, 220,  20, 166, 103, 109, 205, // .........gm.\n   6, 184, 153, 144,  27, 143, 154, 112, 136,  29, 236,  15, // .......p....\n 220, 142, 244,  83, 218,  96, 144, 217, 162, 166, 236, 145, // ...S.`......\n 126, 136,  88,  63, 133, 216,  38, 175, 214, 230,  54,  59, // ~.X?..&...6;\n  63, 102,  46,  33, 173, 155, 164, 212,  51, 251, 237,  13, // ?f.!....3...\n 174, 214,  58, 155,  44, 161,   1, 158, 235, 195, 193, 159, // ..:.,.......\n 167,  55,  26, 113, 172,  15, 150, 124,  76,  54,  58, 175, // .7.q...|L6:.\n  43, 105, 110, 219,  79,  96, 144,  79,  88, 243, 222, 202, // +in.O`.OX...\n  75, 249, 139, 124, 143, 150, 239, 104, 214,  31,  77, 206, // K..|...h..M.\n  80, 254, 108,   2, 114, 249,  71,  27, 181, 201, 175, 141, // P.l.r.G.....\n  44, 203,  79,  84, 123, 162, 118,  15, 138, 126, 239,  34, // ,.OT{.v..~.\"\n 173, 181, 177, 251, 107, 239,  82, 106, 249,  30,  14, 153, // ....k.Rj....\n  32, 244,  60,  89, 165,  46, 209, 115,   1, 251, 196,  95, //  .<Y...s..._\n 210,  37,  31, 147, 210, 243, 148, 249,  98, 223, 222,  42, // .%......b..*\n 233,  47,  57, 164, 108, 195,  86, 174,  48, 237,  40,  91, // ./9.l.V.0.([\n  71, 181, 185,  94, 116, 118, 247, 219, 222,  19, 148, 247, // G..^tv......\n 234,  84, 254, 233,  37,  90, 246, 179, 179, 127,  30, 220, // .T..%Z......\n 149, 169, 223, 189, 183,  48, 199,  47, 219, 233, 170,  73, // .....0./...I\n  69, 143,  82,  38, 124, 229, 201, 209, 171, 154,   7, 179, // E.R&|.......\n   0,  18, 224,  39, 218, 230, 103,  33, 193, 242, 209, 195, // ...'..g!....\n   2, 172, 178,  98, 120, 184, 120, 146, 206,  90,  83,  52, // ...bx.x..ZS4\n  41, 114, 139,  40,  51, 235,  61,  93,  44, 204,  12, 157, // )r.(3.=],...\n  14,  99,  47,  98, 111,  91, 213, 165, 217,  87, 183, 230, // .c/bo[...W..\n 191,  25, 130, 246,  87, 252,  74,  76,   7, 153,  81, 154, // ....W.JL..Q.\n  84,  51, 250,  11,  73, 175,  74, 204,  76, 102,   7,  23, // T3..I.J.Lf..\n  42, 144,  76, 219,  78, 222,  42, 209,  35, 197, 247, 143, // *.L.N.*.#...\n 209, 126, 246, 127,  64, 123,  12, 229, 223,  15, 200, 255, // .~..@{......\n 185, 252, 213, 123, 116, 166, 220,  91, 239, 202,  39, 123, // ...{t..[..'{\n  49, 239,  95,  99, 254, 195, 177, 230, 189, 250,  66, 126, // 1._c......B~\n 223,  31, 249, 132, 103, 152, 145,  60, 155, 124, 152, 243, // ....g..<.|..\n  15, 169, 105,  47, 221,  21,  68, 224, 179, 105, 133, 177, // ..i/..D..i..\n  34,  83, 216, 205, 244, 107, 255, 116,  54,  59, 255, 175, // \"S...k.t6;..\n  86,   4,  82, 205, 169, 134,  11,  64, 216, 172,   3, 172, // V.R....@....\n 136, 224, 112, 254,  66, 101,  54,  31, 160,  77,  67, 135, // ..p.Be6..MC.\n 242, 159,   7, 135, 247, 123, 245, 223, 199, 246,  14,  27, // .....{......\n   9, 160, 110, 144, 214, 157, 252,  92, 186, 115, 102, 206, // ..n......sf.\n 126,  37,  52, 193, 174, 236, 127,  68, 119,  66,  69, 116, // ~%4....DwBEt\n  87, 235,  46, 223,   3, 246, 171, 204,  10,  97,  92,  50, // W........a.2\n  78, 113,  95, 146, 135, 218,  63, 136, 201, 123, 238,  47, // Nq_...?..{./\n  52, 211,  78,  61, 235,  82, 191, 209, 203, 250, 234, 103, // 4.N=.R.....g\n 115,  74,  63, 104, 240,  72, 236,  31,  92, 109,   4, 189, // sJ?h.H...m..\n 245, 154, 197, 157,  34, 132,   9, 212, 183,  94, 119,  11, // ....\"....^w.\n 108,   4, 229, 242, 241, 129, 194, 154, 254, 168, 245, 192, // l...........\n 108, 246,  60,  69,  34,  48,  52, 133, 206, 107,   1, 247, // l.<E\"04..k..\n 142, 180, 170, 127, 208,  83, 151, 209,  70, 232,  77, 183, // .....S..F.M.\n  64, 168, 146, 184, 255, 238, 104, 222,  52,  49, 222, 238, // @.....h.41..\n  59, 115,  81, 213, 170, 133,   3,  45, 172,  27, 124, 216, // ;sQ....-..|.\n  90, 247,  91,  97,  19, 237, 185,  23, 136, 251, 126, 171, // Z.[a......~.\n  77,  57, 153, 247, 104, 156, 242,  97,   3, 186, 103, 243, // M9..h..a..g.\n 121, 176, 193,  75, 147, 172, 248, 113,  52, 250, 145, 118, // y..K...q4..v\n 198,   3, 139,   3, 136, 159,  71, 163, 159, 105, 243, 111, // ......G..i.o\n 173, 153, 204, 148, 119, 105,  35,  13, 154, 145, 222,  88, // ....wi#....X\n 122, 217, 163, 149, 103, 143,  86, 157, 217, 181, 241,  36, // z...g.V....$\n 198, 106,  31, 204, 243, 199, 104, 244, 135, 243, 184, 204, // .j....h.....\n  19, 178, 104,  26, 152, 252, 222, 133, 253,  28, 164,  11, // ..h.........\n  61, 186, 149, 251, 206, 168,  60,  89, 132,  95,  56, 143, // =.....<Y._8.\n  80, 232,  63, 106,  93,  86,  95, 101, 201,  38,  36, 204, // P.?j]V_e.&$.\n 223,  20, 225, 134, 210, 160, 222,  47,  79, 117,  10, 132, // ......./Ou..\n  29, 143,  31, 101, 245, 157, 184,  40, 213,  97,  97, 143, // ...e...(.aa.\n  40,  88,  23, 153,  67,  54, 163,  48, 139, 116, 122, 136, // (X..C6.0.tz.\n 137,  78, 229, 238,  48,  99, 114,  86, 170, 215,  16,  64, // .N..0crV...@\n  56,  79, 196, 148, 134, 123, 153,  58, 186,  24, 236,   4, // 8O...{.:....\n 226, 229,  85, 228,  39,  93, 186, 200, 135,  73,  23, 245, // ..U.']...I..\n  61, 150, 128,  61, 203, 135, 201,  63,  39,  71, 143, 101, // =..=...?'G.e\n 104, 173, 108, 123, 146,  86, 186,  56,  24, 100, 180, 132, // h.l{.V.8.d..\n  31, 216,  53,  77, 173,  89, 188, 173,  80,  85,  71, 103, // ..5M.Y..PUGg\n 209, 230,  20, 245, 116, 203,  79,  82, 184,  86, 230, 170, // ....t.OR.V..\n 158, 204, 125,  61,  26, 125, 109, 162,  49, 217, 158, 202, // ..}=.}m.1...\n   7,  60, 255, 100,  52, 250, 228,  33, 207, 233, 210, 221, // .<.d4..!....\n 242, 155,  53, 195, 113, 190, 191, 169, 167, 115, 155, 140, // ..5.q....s..\n  42, 215, 199, 220, 147, 163,   4, 239, 156, 132, 162, 111, // *..........o\n 250, 166,  71,  95,  86, 114, 162, 150,  63,  30, 177, 167, // ..G_Vr..?...\n 151,  54, 168,  15,   6,  51,   8, 111, 231,  33,  92, 170, // .6...3.o.!..\n 251,  86, 121, 160, 233,  94, 222,   8,  52, 231,  45,  76, // .Vy..^..4.-L\n  17,  65, 241,   3, 178, 247, 195,  93, 122,  65,  64, 111, // .A.....]zA@o\n 161, 251, 105, 220, 228,   0, 237, 177, 231, 195, 179, 140, // ..i.........\n  31, 132, 238, 105, 137, 209, 161, 247, 219,  75,  79,  76, // ...i.....KOL\n 233, 114,  27, 122, 238,  98, 134,  66, 157,  34, 184, 207, // .r.z.b.B.\"..\n 250, 193, 189, 121,  59,  67,  25, 172, 241, 120,  33,  83, // ...y;C...x!S\n  78, 101, 193, 254,  99,  92, 163, 234, 217, 169, 255, 146, // Ne..c.......\n  94,  66, 112, 231,   2, 243, 205, 199, 227,  98,  49, 125, // ^Bp......b1}\n 165, 232, 209,  73,  69, 184,  83, 255,  51,  91,  57,  93, // ...IE.S.3[9]\n  40, 147, 143, 154, 132, 101, 153,  92, 101,  30,  53,  53, // (....e..e.55\n  13, 124, 227,  84, 248, 159,  51,  16,  55,  41, 215, 142, // .|.T..3.7)..\n  88, 145, 209,  17, 146,  47,  90,  36, 174, 113, 172, 210, // X..../Z$.q..\n 241, 112, 136, 112, 152, 179,  19, 225, 118, 155, 238, 188, // .p.p....v...\n  84,  70,  68,  24, 122, 214,  56,  31,  14, 249,  16,  94, // TFD.z.8....^\n   8, 242, 101, 216, 104, 228,  66, 166, 244, 190, 197, 172, // ..e.h.B.....\n 253, 165, 143,  77,  20, 207,  95,  98, 251, 156, 146,  83, // ...M.._b...S\n  57, 142, 114,  11, 153, 182, 153,  34, 132, 159, 244,  14, // 9.r....\"....\n  86, 223,  62, 251,  33, 220, 202, 213, 161, 143, 109, 216, // V.>.!.....m.\n  15, 231,  22, 225, 143, 241, 161, 219,  51, 136, 146, 154, // ........3...\n 237, 176, 146, 195,  16, 134, 160, 231,  74,  18,  93,  88, // ........J.]X\n 167, 169, 242,  88, 109, 146, 160,   4,  68,  65,  93, 127, // ...Xm...DA].\n  14, 199,  25, 230,  26, 220,  73,  56, 226,  67,  89, 208, // ......I8.CY.\n  79, 173, 232,  72,  74,  15, 160, 233, 246, 144, 159, 193, // O..HJ.......\n   0,  95, 174, 242, 238, 237, 197, 191, 126,  43, 255, 243, // ._......~+..\n 183,  12,  63, 141,  43, 124, 242, 226, 138,  31, 160, 136, // ..?.+|......\n  89, 109,  54, 141, 224,   0,  81,  22, 229, 226,  29, 138, // Ym6...Q.....\n  92, 204,  60, 219, 249, 138,  59, 177, 130, 151, 194, 127, // ..<...;.....\n 105,  32, 134, 147, 201, 132,  82, 121,  57,  84, 196, 225, // i ....Ry9T..\n 248,  12,  96,  39,  45,   4, 122,   6, 109, 215, 231, 242, // ..`'-.z.m...\n  68, 194,  71, 192,  12, 213, 151, 234, 115, 122, 159, 155, // D.G.....sz..\n  55, 205,   0, 166, 145,  88,  95, 145, 163,  99,   1,  43, // 7....X_..c.+\n   0, 230,  28,  47, 169,  47,  56,  78, 234,  58, 128, 220, // ..././8N.:..\n 117,   8, 166, 196, 158, 159,  78,  37, 175, 117, 247,  78, // u.....N%.u.N\n 138, 222,  54, 210,  97,  97, 150, 144,  66,  33,  83,  47, // ..6.aa..B!S/\n  17, 162,  21, 241,   8,   3, 162, 215, 122, 158,  44, 220, // ........z.,.\n 152,   8,  99,  16, 242, 163, 101,  14, 167, 135,   7, 206, // ..c...e.....\n 134, 175, 249, 185, 199, 204,  35,   4, 160, 116,  13, 215, // ......#..t..\n  88, 189,  18, 126,  62,  86,  25,  75,  52,  64, 158,  63, // X..~>V.K4@.?\n 183, 219,  31, 126, 105, 129,  29, 131,   0, 167, 178, 113, // ...~i......q\n  78, 185, 214,  98, 150,  81,  38, 120,  70,  44,  51, 163, // N..b.Q&xF,3.\n  63,  29, 126, 106, 238,  65, 134, 159, 154,  97,   5,  26, // ?.~j.A...a..\n  91,  20,  52,  31, 208, 128,  74, 244, 216,  79, 181, 136, // [.4...J..O..\n  63, 135, 205, 205,  45, 242, 225,  11, 110,  38, 167, 248, // ?...-...n&..\n 245, 231, 192, 195,  99, 205, 250, 199, 244,  62, 133, 145, // ....c....>..\n  56,  62, 214, 138, 114, 190, 132, 180, 150, 174,  98, 232, // 8>..r.....b.\n 249,  18, 212, 172, 168,   3,  28,  27,  62,  27, 218,  69, // ........>..E\n 253,  86, 181, 165, 172,  45,  21,   7, 171, 123, 105, 232, // .V...-...{i.\n 208, 206,  49,  28, 180, 164, 192,  74,  63, 147, 118,  22, // ..1....J?.v.\n 167,  67,  76, 194,  61, 167,   2,  48, 166, 251, 191,  15, // .CL.=..0....\n  56,  74, 132, 251, 175,  17, 167, 179, 204,  39, 189, 220, // 8J.......'..\n 155, 168,  49,  20,  83, 125, 183, 205, 139, 234,  62, 124, // ..1.S}....>|\n  22, 150, 207, 214, 208,  60, 254,  86, 155,  84, 254,  64, // .....<.V.T.@\n  37,  19, 157, 202, 152, 202, 109,  82,  72, 126,  67,  85, // %.....mRH~CU\n 115,  79,  99,  51,  74, 242,  91, 106, 130,  91, 201,  81, // sOc3J.[j.[.Q\n 142, 252, 211, 214, 222, 235, 184, 142,  48, 254, 111, 182, // ........0.o.\n 126,  14, 239,  36, 170, 228, 247, 182, 250,  54, 220, 225, // ~..$.....6..\n 252, 182, 141, 127, 111, 199, 172, 228,  63, 108, 249, 187, // ....o...?l..\n 205,  86,  23,  56,  84, 110, 244,  69, 152, 197, 169, 150, // .V.8Tn.E....\n 191, 218, 142,  31, 244,  38, 151, 255, 180, 149, 179,  48, // .....&.....0\n  77, 151,  97, 116,  45, 181, 118,  45, 118,  85, 153, 107, // M.at-.v-vU.k\n 232, 188,  93,  25, 184,  54, 206, 156, 124, 141, 179,  51, // ..]..6..|..3\n  14, 139, 221, 126, 250,  31, 255,  11,  22,  19, 178, 116, // ...~.......t\n 138,  51,   0,   0, 0 // .3..\n};\nstatic const unsigned char v2[] = {\n  31, 139,   8,   8, 219,  27, 244,  98,   0,   3, 109,  97, // .......b..ma\n 105, 110,  46, 106, 115,   0, 165,  86, 237, 110, 219,  54, // in.js..V.n.6\n  20, 253, 239, 167, 184,   8,   6,  52,  65, 109,  41,  77, // .......4Am)M\n 246,   1,  52, 138,   1,  55,  93, 129,  20,  93,  61, 204, // ..4..7]..]=.\n 233, 218, 254,  43,  37, 210,  22,  91, 138,  84, 249,  97, // ...+%..[.T.a\n 205,  11, 242,  46, 125, 150,  62, 217,  14,  37, 217, 177, // ....}.>..%..\n  19, 103, 195, 218,  95, 166,  36, 222, 123,  15, 207, 185, // .g.._.$.{...\n 247, 208, 143, 130,  19, 228, 188, 149, 133, 127, 116,  54, // ..........t6\n 144,  85, 109, 172, 167, 107,  42, 135,  84, 250,  74,  13, // .Um..k*.T.J.\n 201,  10, 205, 133, 165,  27, 154,  91,  83, 209, 163,  36, // .......[S..$\n 173, 173,  96, 133,  79,  42, 169, 147, 143,  14,  33, 131, // ..`.O*....!.\n  65,  97, 180, 243, 244, 142, 206, 105,  30, 116, 225, 165, // Aa.....i.t..\n 209, 116, 120,  68, 215, 131,   1,  33, 218,   7, 171, 219, // .txD...!....\n  84,  31, 240, 152, 113, 185, 164,  66,  49, 231, 206,  15, // T...q..B1...\n  16, 229, 153, 212, 194,  30, 140, 241,   5, 223, 202, 147, // ............\n 245,  39,  39, 218,  44,   7, 227, 201, 179, 233, 155,  43, // .''.,......+\n 122,  51, 203, 210, 242, 164, 223, 181, 149, 193, 154, 166, // z3..........\n 143, 189, 155,  89, 141, 126, 217, 124, 193, 183, 122, 220, // ...Y.~.|..z.\n  45,  54, 111, 136,  46, 132,  99, 168,  79,  51,  51, 247, // -6o...c.O33.\n  13, 179, 130,  94, 121, 158, 144, 116,  84,  10, 198,  63, // ...^y..tT..?\n   7, 102, 189, 176, 130, 127, 253,  34,  53,  61,  15, 185, // .f.....\"5=..\n 146, 122,  72, 127, 136,  58, 174,  10,  50, 115, 186, 180, // .zH..:..2s..\n  66,  49, 205, 147, 219,  26, 105, 189,  83, 112, 231, 121, // B1....i.Sp.y\n  26,  44,  40,  54, 118,  69, 214,  24, 239,  40, 103, 197, // .,(6vE...(g.\n  39, 242, 134,  78, 142, 143, 127,  28,  82,  83,  10,  77, // '..N....RS.M\n 191,  25, 189,  48,   6,  82, 188,  21,  57, 205, 132,  93, // ...0.R..9..]\n 130, 243,  87,  50, 183, 204, 174, 190, 126, 225,  98,  41, // ..W2....~.b)\n 148, 169,  43, 161,  61, 242,  68, 108, 192, 154, 229, 118, // ..+.=.Dl...v\n  60, 216, 148, 152, 184, 189,  41,  22,  86,  52, 132,  51, // <.....).V4.3\n 212, 166,  14, 138,  89, 233,  87,   4, 216,  84,  49, 200, // ....Y.W..T1.\n  34,  56, 153, 184, 199, 151, 130, 230,  70,  41, 211,  72, // \"8......F).H\n 189, 160, 149,  96, 214,  13,  99, 204, 201, 241, 147, 211, // ...`..c.....\n  13,  79,  13, 115,  36,  80,  27,   4, 184,  18, 145,  64, // .O.s$P.....@\n  31,   5, 148,  58,   8, 146,  56, 210,  54, 196,  88,  97, // ...:..8.6.Xa\n   3, 172, 182, 102,  41,  57,  90,  44, 212, 109, 107,  33, // ...f)9Z,.mk!\n 208, 128, 142,  37,  83,   1, 105, 138,   0,  94,  42,  97, // ...%S.i..^*a\n 221, 195,  76, 190,  21,  20, 245,  65, 158, 208, 150,  45, // ..L....A...-\n 217,  18, 111,  42,  28, 182,  77, 180, 201, 128,  67, 233, // ..o*..M...C.\n  21, 101, 114, 252,   2, 101, 130,  22, 244, 211, 241, 113, // .er..e.....q\n 150, 202,  49, 112,  86,  53, 211,  82,  56, 194,  25,  26, // ..1pV5.R8...\n 161,  84, 252, 173,   4, 151, 161, 106, 161, 186, 138, 225, // .T.....j....\n 157, 147, 127,  11, 202, 131,  67,  71,  58,  39, 182, 240, // ......CG:'..\n  16, 184,  44, 194, 134,  58, 244, 134, 138, 107,  52,  65, // ..,..:...k4A\n  44, 239, 140,  10, 177,  87,  93, 236,  29,  70,  53, 179, // ,....W]..F5.\n 128,  22,  64, 194, 220,  88,  10, 174,  13, 105,   9, 198, // ..@..X...i..\n 204,  96, 193, 252,  94, 153,  16, 139,  49, 228, 148, 175, // .`..^...1...\n 232, 245, 100,  54,  33, 150,  27, 102, 187, 192,  75, 141, // ..d6!..f..K.\n  78, 212,  44, 214,  96, 138, 102,  53,  43,   4, 205, 124, // N.,.`.f5+..|\n 251,  28, 195, 182,  96, 198, 221,  57,  52, 138, 194, 204, // ....`..94...\n 165, 173, 186,  61,  96,  76, 250, 100, 135, 212, 150, 214, // ...=`L.d....\n 153, 212, 200,  20,  53,  30, 110,  68,  46, 163, 200, 127, // ....5.nD....\n 129,  44,  14,  44,  81,  85, 144, 206,   3, 128,  71, 229, // .,.,QU....G.\n 208,  34, 210,  36,  64, 189, 214, 186,  61,  27, 151, 209, // .\".$@...=...\n  59, 242, 224,   5, 137,  42,  23,  60,  70, 186, 245,  76, // ;....*.<F..L\n 197,  13,  37,  14, 210,  62,  52, 210, 151,  96,   5, 122, // ..%..>4..`.z\n  17,  96,   1, 163, 198, 148,  99, 119,  95, 227, 150, 170, // .`....cw_...\n 238, 196, 194,  71, 138, 175,  74, 244, 164, 235, 224, 175, // ...G..J.....\n  39,  61, 197, 168, 247, 102, 176,  94, 246, 139,  15, 103, // '=...f.^...g\n 131, 155, 179, 181,  31, 189, 255, 110,  63,  58, 189, 239, // .......n?:..\n  71, 155, 182, 187,  69, 109, 197,  83, 216, 211, 233,  55, // G...Em.S...7\n 219,  83,  22, 212, 150,  52, 153, 146, 219,  66,  81,   6, // .S...4...BQ.\n  85, 172, 152, 159,  31, 148, 222, 215, 238, 105, 154,  86, // U........i.V\n 125, 251,  36, 141,  75,  15, 198, 123, 154,  41,  75, 217, // }.$.K..{.)K.\n  78, 134,  17, 136, 189, 213, 166, 193,  62, 215,  53,  93, // N.......>.5]\n 228,  27,  52,  55, 198, 126, 138, 131, 175,  58, 183, 217, // ..47.~...:..\n 130, 146, 238,  96, 249,  79, 100,  75,  48, 152,  72,   3, // ...`.OdK0.H.\n  84, 127,  94,  76,  95,  99, 117,  31, 201, 196, 242,  32, // T.^L_cu.... \n 181,  25, 181,  35, 233, 101, 174, 208, 177, 177, 211,  93, // ...#.e.....]\n 215,  29, 121, 144, 202, 143,  96,  61, 177, 125, 219, 166, // ..y...`=.}..\n 153,  94,  77,  40, 212, 156, 121, 225, 182,  51, 117,  30, // .^M(..y..3u.\n 166, 217,  66, 180, 134, 195, 153,  43, 219,  60, 223,  14, // ..B....+.<..\n 190, 138,  57,  18, 208,   1, 248, 213, 243, 126, 189, 151, // ..9......~..\n  74, 152,   5,  32, 142,  12,  28, 230, 210,  92, 209, 239, // J.. ........\n 138,  97,  52, 108, 245,  29, 165, 123,  13,  71, 198,  37, // .a4l...{.G.%\n  32, 102,  75, 212, 233, 108,  47,   2,  83,  11,  11, 246, //  fK..l/.S...\n 160, 153,  91,  57,  47, 170, 214, 107,  96, 223, 163, 218, // ..[9/..k`...\n  52, 208, 181, 146, 133,  53, 177, 155,  45,  76,  29, 198, // 4....5..-L..\n 120,  23, 217, 255, 128, 182, 128,  42,  33, 143, 168, 210, // x......*!...\n 162, 243, 136, 180, 250, 232, 192, 208, 203, 253, 200,  54, // ...........6\n 109, 246, 146,  45, 217, 172, 176, 178, 246,  36, 244,   2, // m..-.....$..\n  83, 213,  98, 188,  72,  47,  30,  63, 126, 128, 168,  44, // S.b.H/.?~..,\n 189, 157, 131, 173,  17, 191,  63,  58,  63, 239, 222, 236, // ......?:?...\n  89,  62, 158, 238, 248, 112,  55, 144, 249, 238,  13, 188, // Y>...p7.....\n  59, 100, 237, 193,  37, 108, 102,   1,  30, 163, 213, 105, // ;d..%lf....i\n 184, 164,  47,  77, 192,  17, 209, 139, 240,  29, 156,  24, // ../M........\n 119,  74,  33,  97, 185, 235,  73, 191,  35, 107, 155, 131, // wJ!a..I.#k..\n 139,  90, 153,  85, 119,  29, 150,  65, 115, 220, 169, 109, // .Z.Uw..As..m\n 120,  37, 149, 106, 193, 192,  42,  37, 152, 107, 175, 224, // x%.j..*%.k..\n  46,  79, 116,  35, 161, 151, 210,  26,  29, 123, 247,  78, // .Ot#.....{.N\n 218,   7,  88, 248,  87, 163, 155, 212, 245, 142, 213, 161, // ..X.W.......\n  80, 237, 246, 249,  93,  86,  62,  25,  63,  99,  14, 255, // P...]V>.?c..\n  96, 126,  93, 235, 244,  66,  42, 209,  55,  17,  23,  21, // `~]..B*.7...\n  38,  22,  91,   6,  89,  95, 236, 135, 235, 242, 240, 221, // &.[.Y_......\n 209, 205, 160,  47, 186, 253, 250, 253, 230, 117,  15,   5, // .../.....u..\n 255,  29, 184, 105,  18, 163, 149,  97,  28, 112,  96, 184, // ...i...a.p`.\n 231, 227, 254, 207, 227,  97, 121,   8, 140,  71,  67, 226, // .....ay..GC.\n 112, 255, 120, 232,  36,  55, 124, 117, 116,  54, 248,   7, // p.x.$7|ut6..\n  71,  33,  75, 134, 124,  10,   0,   0, 0 // G!K.|...\n};\nstatic const unsigned char v3[] = {\n  39, 117, 115, 101,  32, 115, 116, 114, 105,  99, 116,  39, // 'use strict'\n  59,  10, 105, 109, 112, 111, 114, 116,  32, 123,  32, 104, // ;.import { h\n  44,  32, 104, 116, 109, 108,  44,  32, 114, 101, 110, 100, // , html, rend\n 101, 114,  32, 125,  32, 102, 114, 111, 109,  32,  39,  46, // er } from '.\n  47, 112, 114, 101,  97,  99, 116,  46, 109, 105, 110,  46, // /preact.min.\n 106, 115,  39,  59,  10,  10,  10,  99, 111, 110, 115, 116, // js';...const\n  32,  88,  32,  61,  32, 102, 117, 110,  99, 116, 105, 111, //  X = functio\n 110,  32,  40,  41,  32, 123,  10,  10,  32,  32, 114, 101, // n () {..  re\n 116, 117, 114, 110,  32, 104, 116, 109, 108,  96,  10,  32, // turn html`. \n  32,  60, 100, 105, 118,  32,  99, 108,  97, 115, 115,  61, //  <div class=\n  34,  99, 111, 110, 116,  97, 105, 110, 101, 114,  34,  62, // \"container\">\n  10,  32,  32,  32,  32,  60, 104,  50,  32,  99, 108,  97, // .    <h2 cla\n 115, 115,  61,  34, 115, 101,  99, 116, 105, 111, 110,  34, // ss=\"section\"\n  62,  65,  66,  79,  85,  84,  32,  85,  83,  60,  47, 104, // >ABOUT US</h\n  50,  62,  10,  32,  32,  32,  32,  60, 100, 105, 118,  32, // 2>.    <div \n  99, 108,  97, 115, 115,  61,  34, 114, 111, 119,  34,  62, // class=\"row\">\n  10,  32,  32,  32,  32,  32,  32,  60, 100, 105, 118,  32, // .      <div \n  99, 108,  97, 115, 115,  61,  34,  99, 111, 108,  45,  55, // class=\"col-7\n  34,  62,  10,  32,  32,  32,  32,  32,  32,  32,  32,  60, // \">.        <\n 112,  62,  32,  32,  32,  32,  32,  32,  10,  32,  32,  32, // p>      .   \n  32,  32,  32,  32,  32,  32,  32,  67, 101, 115,  97, 110, //        Cesan\n 116,  97,  32,  83, 111, 102, 116, 119,  97, 114, 101,  32, // ta Software \n  76, 116, 100,  46,  32, 105, 115,  32, 104, 101,  97, 100, // Ltd. is head\n 113, 117,  97, 114, 116, 101, 114, 101, 100, 194, 160, 105, // quartered..i\n 110,  32,  68, 117,  98, 108, 105, 110,  44,  32,  82, 101, // n Dublin, Re\n 112, 117,  98, 108, 105,  99,  32, 111, 102,  32,  73, 114, // public of Ir\n 101, 108,  97, 110, 100,  46,  10,  32,  32,  32,  32,  32, // eland..     \n  32,  32,  32,  60,  47, 112,  62,  10,  32,  32,  32,  32, //    </p>.    \n  32,  32,  32,  32,  60, 112,  62,  60,  47, 112,  62,  10, //     <p></p>.\n  32,  32,  32,  32,  32,  32,  32,  32,  79, 117, 114,  32, //         Our \n 115, 116, 111, 114, 121,  32, 114, 111, 111, 116, 115,  32, // story roots \n  98,  97,  99, 107,  32, 116, 111,  32,  50,  48,  48,  52, // back to 2004\n  44,  32, 119, 104, 101, 110,  32,  77, 111, 110, 103, 111, // , when Mongo\n 111, 115, 101,  32,  87, 101,  98,  32,  83, 101, 114, 118, // ose Web Serv\n 101, 114,  32,  76, 105,  98, 114,  97, 114, 121, 194, 160, // er Library..\n 100, 101, 118, 101, 108, 111, 112, 109, 101, 110, 116,  32, // development \n 115, 116,  97, 114, 116, 101, 100,  46,  32,  60,  98, 114, // started. <br\n  62,  10,  10,  32,  32,  32,  32,  32,  32,  32,  32,  65, // >..        A\n 115,  32,  77, 111, 110, 103, 111, 111, 115, 101,  32,  87, // s Mongoose W\n 101,  98,  32,  83, 101, 114, 118, 101, 114,  32, 103, 114, // eb Server gr\n 101, 119,  32, 105, 110,  32, 112, 111, 112, 117, 108,  97, // ew in popula\n 114, 105, 116, 121,  32,  97, 110, 100,  32, 109,  97, 116, // rity and mat\n 117, 114, 101, 100,  32, 111, 118, 101, 114,  32, 116, 104, // ured over th\n 101,  32, 102, 111, 108, 108, 111, 119, 105, 110, 103,  32, // e following \n 121, 101,  97, 114, 115,  44,  32, 105, 110,  32,  50,  48, // years, in 20\n  49,  51,  32,  67, 101, 115,  97, 110, 116,  97,  32, 119, // 13 Cesanta w\n  97, 115,  32, 101, 115, 116,  97,  98, 108, 105, 115, 104, // as establish\n 101, 100,  32, 116, 111,  32,  99, 111, 110, 116, 105, 110, // ed to contin\n 117, 101,  32, 105, 116, 115,  32, 100, 101, 118, 101, 108, // ue its devel\n 111, 112, 109, 101, 110, 116,  32,  97, 110, 100,  32,  10, // opment and .\n  32,  32,  32,  32,  32,  32,  32,  32, 112, 114, 111, 118, //         prov\n 105, 100, 101,  32, 115, 117, 112, 112, 111, 114, 116,  32, // ide support \n 116, 111,  32, 111, 117, 114,  32, 118,  97, 108, 117, 101, // to our value\n 100,  32,  99, 117, 115, 116, 111, 109, 101, 114, 115,  46, // d customers.\n  10,  32,  32,  32,  32,  32,  32,  32,  32,  60,  47, 112, // .        </p\n  62,  10,  32,  32,  32,  32,  32,  32,  32,  32,  60, 112, // >.        <p\n  62,  87, 101,  32,  97, 114, 101,  32, 112, 114, 111, 117, // >We are prou\n 100,  32, 116, 111,  32, 104,  97, 118, 101,  32,  97, 109, // d to have am\n 111, 110, 103,  32, 111, 117, 114,  32,  99, 117, 115, 116, // ong our cust\n 111, 109, 101, 114, 115,  32, 109,  97, 110, 121,  32,  60, // omers many <\n 105,  62,  70, 111, 114, 116, 117, 110, 101,  32,  53,  48, // i>Fortune 50\n  48,  60,  47, 105,  62,  32,  99, 111, 109, 112,  97, 110, // 0</i> compan\n 105, 101, 115,  32,  97, 115,  32, 119, 101, 108, 108,  32, // ies as well \n  97, 115,  32, 109, 101, 100, 105, 117, 109,  32,  97, 110, // as medium an\n 100,  32, 115, 109,  97, 108, 108,  32, 115, 105, 122, 101, // d small size\n  32,  98, 117, 115, 105, 110, 101, 115, 115, 101, 115,  46, //  businesses.\n  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  83, // .          S\n 101,  99, 117, 114, 105, 116, 121,  32,  97, 110, 100,  32, // ecurity and \n 113, 117,  97, 108, 105, 116, 121,  32, 111, 102,  32, 111, // quality of o\n 117, 114,  32, 115, 111, 108, 117, 116, 105, 111, 110, 115, // ur solutions\n  32, 105, 115,  32,  97,  32, 112,  97, 114,  97, 109, 111, //  is a paramo\n 117, 110, 116,  32, 102, 111, 114,  32, 117, 115,  32,  97, // unt for us a\n 110, 100,  32, 116, 104, 101,  32, 102,  97,  99, 116,  32, // nd the fact \n 116, 104,  97, 116,  32,  77, 111, 110, 103, 111, 111, 115, // that Mongoos\n 101,  32,  87, 101,  98,  32,  83, 101, 114, 118, 101, 114, // e Web Server\n  32, 105, 115,  32, 117, 115, 101, 100,  32,  98, 121,  32, //  is used by \n  78,  65,  83,  65,  32,  97,  98, 111,  97, 114, 100,  32, // NASA aboard \n 116, 104, 101,  32,  73, 110, 116, 101, 114, 110,  97, 116, // the Internat\n 105, 111, 110,  97, 108,  32,  83, 112,  97,  99, 101,  32, // ional Space \n  83, 116,  97, 116, 105, 111, 110,  32, 105, 115,  32,  10, // Station is .\n  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 116, 104, //           th\n 101,  32,  98, 101, 115, 116,  32,  99, 111, 110, 102, 105, // e best confi\n 114, 109,  97, 116, 105, 111, 110,  32, 116, 111,  32, 105, // rmation to i\n 116,  46,  60,  47, 112,  62,  10,  32,  32,  32,  32,  32, // t.</p>.     \n  32,  32,  32,  32,  32,  60, 112,  62,  83, 105, 110,  99, //      <p>Sinc\n 101,  32,  50,  48,  49,  51,  44,  32,  67, 101, 115,  97, // e 2013, Cesa\n 110, 116,  97,  32, 104,  97, 115,  32, 101, 120, 112,  97, // nta has expa\n 110, 100, 101, 100,  32, 105, 116, 115,  32, 112, 114, 111, // nded its pro\n 100, 117,  99, 116,  32, 112, 111, 114, 116, 102, 111, 108, // duct portfol\n 105, 111,  46,  32,  87, 101,  32, 100, 101, 118, 101, 108, // io. We devel\n 111, 112,  32,  97, 110, 100,  32, 100, 105, 115, 116, 114, // op and distr\n 105,  98, 117, 116, 101,  32, 101, 109,  98, 101, 100, 100, // ibute embedd\n 101, 100,  32, 115, 111, 102, 116, 119,  97, 114, 101,  32, // ed software \n  97, 110, 100,  32, 104,  97, 114, 100, 119,  97, 114, 101, // and hardware\n  32, 119, 105, 116, 104,  32, 102, 111,  99, 117, 115,  32, //  with focus \n 111, 110,  32,  99, 111, 110, 110, 101,  99, 116, 101, 100, // on connected\n  32, 112, 114, 111, 100, 117,  99, 116, 115,  32,  97, 110, //  products an\n 100,  32, 116, 104, 101,  32,  73, 110, 116, 101, 114, 110, // d the Intern\n 101, 116,  32, 111, 102,  32,  84, 104, 105, 110, 103, 115, // et of Things\n  46,  60,  47, 112,  62,  10,  10,  32,  32,  32,  32,  32, // .</p>..     \n  32,  60,  47, 100, 105, 118,  62,  10,  32,  32,  32,  32, //  </div>.    \n  60,  47, 100, 105, 118,  62,  10,  32,  32,  60,  47, 100, // </div>.  </d\n 105, 118,  62,  10,  96,  59,  10, 125,  59,  10,  10,  99, // iv>.`;.};..c\n 111, 110, 115, 116,  32,  89,  32,  61,  32, 102, 117, 110, // onst Y = fun\n  99, 116, 105, 111, 110,  32,  40,  41,  32, 123,  10,  10, // ction () {..\n  32,  32, 114, 101, 116, 117, 114, 110,  32, 104, 116, 109, //   return htm\n 108,  96,  10,  32,  32,  60, 100, 105, 118,  32,  99, 108, // l`.  <div cl\n  97, 115, 115,  61,  34,  99, 111, 110, 116,  97, 105, 110, // ass=\"contain\n 101, 114,  34,  62,  10,  32,  32,  32,  32,  60, 104,  51, // er\">.    <h3\n  32,  99, 108,  97, 115, 115,  61,  34, 115, 101,  99, 116, //  class=\"sect\n 105, 111, 110,  34,  62,  65, 109, 111, 110, 103,  32, 111, // ion\">Among o\n 117, 114,  32, 112, 114, 111, 100, 117,  99, 116, 115,  32, // ur products \n  97, 114, 101,  58,  60,  47, 104,  51,  62,  10,  32,  32, // are:</h3>.  \n  32,  32,  60, 100, 105, 118,  32,  99, 108,  97, 115, 115, //   <div class\n  61,  34, 114, 111, 119,  34,  62,  10,  32,  32,  32,  32, // =\"row\">.    \n  32,  32,  60, 100, 105, 118,  32,  99, 108,  97, 115, 115, //   <div class\n  61,  34,  99, 111, 108,  45,  55,  34,  62,  10,  32,  32, // =\"col-7\">.  \n  32,  32,  32,  32,  32,  60, 117, 108,  62,  10,  32,  32, //      <ul>.  \n  32,  32,  32,  32,  32,  32,  32,  60, 108, 105,  62,  10, //        <li>.\n  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  60, //            <\n  97,  32, 104, 114, 101, 102,  61,  34, 104, 116, 116, 112, // a href=\"http\n 115,  58,  47,  47, 109, 111, 110, 103, 111, 111, 115, 101, // s://mongoose\n  46, 119, 115,  47,  34,  62,  77, 111, 110, 103, 111, 111, // .ws/\">Mongoo\n 115, 101,  32,  87, 101,  98,  32,  83, 101, 114, 118, 101, // se Web Serve\n 114,  60,  47,  97,  62,  10,  32,  32,  32,  32,  32,  32, // r</a>.      \n  32,  32,  32,  32,  32,  45,  32,  97, 110,  32, 101, 109, //      - an em\n  98, 101, 100, 100, 101, 100,  32, 119, 101,  98,  32, 115, // bedded web s\n 101, 114, 118, 101, 114,  32,  97, 110, 100,  32, 110, 101, // erver and ne\n 116, 119, 111, 114, 107, 105, 110, 103,  32, 108, 105,  98, // tworking lib\n 114,  97, 114, 121,  10,  32,  32,  32,  32,  32,  32,  32, // rary.       \n  32,  32,  60,  47, 108, 105,  62,  10,  32,  32,  32,  32, //   </li>.    \n  32,  32,  32,  32,  32,  60, 108, 105,  62,  10,  32,  32, //      <li>.  \n  32,  32,  32,  32,  32,  32,  32,  32,  32,  60,  97,  32, //          <a \n 104, 114, 101, 102,  61,  34, 104, 116, 116, 112, 115,  58, // href=\"https:\n  47,  47, 118,  99, 111, 110,  46, 105, 111,  47,  34,  62, // //vcon.io/\">\n  86,  67,  79,  78,  46, 105, 111,  60,  47,  97,  62,  10, // VCON.io</a>.\n  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  45, //            -\n  32,  65, 114, 100, 117, 105, 110, 111,  45,  99, 111, 109, //  Arduino-com\n 112,  97, 116, 105,  98, 108, 101,  32,  98, 111,  97, 114, // patible boar\n 100, 115,  32, 119, 105, 116, 104,  32,  98, 117, 105, 108, // ds with buil\n 116,  45, 105, 110,  32, 102, 105, 114, 109, 119,  97, 114, // t-in firmwar\n 101,  32,  79,  84,  65,  32, 117, 112, 100,  97, 116, 101, // e OTA update\n 115,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, // s.          \n  32,  97, 110, 100,  32, 109,  97, 110,  97, 103, 101, 109, //  and managem\n 101, 110, 116,  32, 100,  97, 115, 104,  98, 111,  97, 114, // ent dashboar\n 100,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  60, // d.         <\n  47, 108, 105,  62,  10,  32,  32,  32,  32,  32,  32,  32, // /li>.       \n  32,  32,  60, 108, 105,  62,  10,  32,  32,  32,  32,  32, //   <li>.     \n  32,  32,  32,  32,  32,  32,  60,  97,  32, 104, 114, 101, //       <a hre\n 102,  61,  34, 104, 116, 116, 112, 115,  58,  47,  47, 109, // f=\"https://m\n 100,  97, 115, 104,  46, 110, 101, 116,  47,  34,  62, 109, // dash.net/\">m\n  68,  97, 115, 104,  46, 110, 101, 116,  60,  47,  97,  62, // Dash.net</a>\n  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, // .           \n  45,  32,  97, 110,  32,  97, 108, 108,  45, 105, 110,  45, // - an all-in-\n 111, 110, 101,  32,  73, 111,  84,  32,  80, 108,  97, 116, // one IoT Plat\n 102, 111, 114, 109,  10,  32,  32,  32,  32,  32,  32,  32, // form.       \n  32,  32,  60,  47, 108, 105,  62,  10,  32,  32,  32,  32, //   </li>.    \n  32,  32,  32,  32,  32,  60, 108, 105,  62,  10,  32,  32, //      <li>.  \n  32,  32,  32,  32,  32,  32,  32,  32,  32,  60,  97,  32, //          <a \n 104, 114, 101, 102,  61,  34, 104, 116, 116, 112, 115,  58, // href=\"https:\n  47,  47, 109, 111, 110, 103, 111, 111, 115, 101,  45, 111, // //mongoose-o\n 115,  46,  99, 111, 109,  34,  62,  77, 111, 110, 103, 111, // s.com\">Mongo\n 111, 115, 101,  32,  79,  83,  60,  47,  97,  62,  10,  32, // ose OS</a>. \n  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  45,  32, //           - \n  97, 110,  32, 111, 112, 101, 114,  97, 116, 105, 110, 103, // an operating\n  32, 115, 121, 115, 116, 101, 109,  32, 102, 111, 114,  32, //  system for \n 108, 111, 119,  45, 112, 111, 119, 101, 114,  32, 109, 105, // low-power mi\n  99, 114, 111,  99, 111, 110, 116, 114, 111, 108, 108, 101, // crocontrolle\n 114, 115,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32, // rs.         \n  60,  47, 108, 105,  62,  10,  10,  32,  32,  32,  32,  32, // </li>..     \n  32,  32,  32,  32,  60, 108, 105,  62,  10,  32,  32,  32, //     <li>.   \n  32,  32,  32,  32,  32,  32,  32,  32,  60,  97,  32, 104, //         <a h\n 114, 101, 102,  61,  34, 104, 116, 116, 112, 115,  58,  47, // ref=\"https:/\n  47, 103, 105, 116, 104, 117,  98,  46,  99, 111, 109,  47, // /github.com/\n  99, 101, 115,  97, 110, 116,  97,  47, 109, 106, 115,  34, // cesanta/mjs\"\n  62, 109,  74,  83,  60,  47,  97,  62,  10,  32,  32,  32, // >mJS</a>.   \n  32,  32,  32,  32,  32,  32,  32,  32,  45,  32,  97, 110, //         - an\n  32, 101, 109,  98, 101, 100, 100, 101, 100,  32,  74,  97, //  embedded Ja\n 118,  97,  83,  99, 114, 105, 112, 116,  32, 101, 110, 103, // vaScript eng\n 105, 110, 101,  32, 102, 111, 114,  32,  67,  47,  67,  43, // ine for C/C+\n  43,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  60, // +.         <\n  47, 108, 105,  62,  10,  32,  32,  32,  32,  32,  32,  32, // /li>.       \n  60,  47, 117, 108,  62,  10,  32,  32,  32,  32,  32,  32, // </ul>.      \n  60,  47, 100, 105, 118,  62,  10,  32,  32,  32,  32,  32, // </div>.     \n  32,  60, 100, 105, 118,  32,  99, 108,  97, 115, 115,  61, //  <div class=\n  34,  99, 111, 108,  45,  54,  34,  62,  10,  32,  32,  32, // \"col-6\">.   \n  32,  32,  32,  32,  32,  60, 112,  62,  60,  98,  62,  79, //      <p><b>O\n 117, 114,  32, 115, 111, 108, 117, 116, 105, 111, 110, 115, // ur solutions\n  32,  97, 114, 101,  58,  60,  47,  98,  62,  60,  47, 112, //  are:</b></p\n  62,  10,  32,  32,  32,  32,  32,  32,  32,  32,  60, 117, // >.        <u\n 108,  62,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32, // l>.         \n  32,  60, 108, 105,  62, 105, 110, 116, 101, 103, 114,  97, //  <li>integra\n 116, 101, 100,  32, 105, 110, 116, 111,  32, 116, 104, 111, // ted into tho\n 117, 115,  97, 110, 100, 115,  32, 111, 102,  32,  99, 111, // usands of co\n 109, 109, 101, 114,  99, 105,  97, 108,  32, 112, 114, 111, // mmercial pro\n 100, 117,  99, 116, 115,  60,  47, 108, 105,  62,  10,  32, // ducts</li>. \n  32,  32,  32,  32,  32,  32,  32,  32,  32,  60, 108, 105, //          <li\n  62, 100, 101, 112, 108, 111, 121, 101, 100,  32, 116, 111, // >deployed to\n  32, 104, 117, 110, 100, 114, 101, 100, 115,  32, 111, 102, //  hundreds of\n  32, 109, 105, 108, 108, 105, 111, 110, 115,  32, 100, 101, //  millions de\n 118, 105,  99, 101, 115,  32, 105, 110,  32, 112, 114, 111, // vices in pro\n 100, 117,  99, 116, 105, 111, 110,  32, 101, 110, 118, 105, // duction envi\n 114, 111, 110, 109, 101, 110, 116, 115,  60,  47, 108, 105, // ronments</li\n  62,  10,  32,  32,  32,  32,  32,  32,  32,  32,  60,  47, // >.        </\n 117, 108,  62,  10,  32,  32,  32,  32,  32,  32,  60,  47, // ul>.      </\n 100, 105, 118,  62,  10,  32,  32,  32,  32,  60,  47, 100, // div>.    </d\n 105, 118,  62,  10,  32,  32,  60,  47, 100, 105, 118,  62, // iv>.  </div>\n  10,  96,  59,  10, 125,  59,  10,  10,  99, 111, 110, 115, // .`;.};..cons\n 116,  32,  65, 112, 112,  32,  61,  32, 102, 117, 110,  99, // t App = func\n 116, 105, 111, 110,  32,  40, 112, 114, 111, 112, 115,  41, // tion (props)\n  32, 123,  10,  10,  32,  32, 114, 101, 116, 117, 114, 110, //  {..  return\n  32, 104, 116, 109, 108,  96,  10,  60, 104,  49,  62,  66, //  html`.<h1>B\n  97, 115, 105,  99,  32,  69, 109,  98, 101, 100, 100, 101, // asic Embedde\n 100,  32,  70, 105, 108, 101, 115, 121, 115, 116, 101, 109, // d Filesystem\n  32, 100, 101, 109, 111,  60,  47, 104,  49,  62,  10,  60, //  demo</h1>.<\n 100, 105, 118,  62,  10,  32,  32,  36, 123, 104,  40,  88, // div>.  ${h(X\n  41, 125,  10,  60,  47, 100, 105, 118,  62,  10,  60, 100, // )}.</div>.<d\n 105, 118,  62,  10,  32,  32,  36, 123, 104,  40,  89,  41, // iv>.  ${h(Y)\n 125,  10,  60,  47, 100, 105, 118,  62,  96,  59,  10, 125, // }.</div>`;.}\n  59,  10,  10, 119, 105, 110, 100, 111, 119,  46, 111, 110, // ;..window.on\n 108, 111,  97, 100,  32,  61,  32,  40,  41,  32,  61,  62, // load = () =>\n  32, 114, 101, 110, 100, 101, 114,  40, 104,  40,  65, 112, //  render(h(Ap\n 112,  41,  44,  32, 100, 111,  99, 117, 109, 101, 110, 116, // p), document\n  46,  98, 111, 100, 121,  41,  59,  10, 0 // .body);.\n};\nstatic const unsigned char v4[] = {\n 118,  97, 114,  32, 101,  44, 110,  44,  95,  44, 116,  44, // var e,n,_,t,\n 111,  44, 114,  44, 117,  44, 108,  61, 123, 125,  44, 105, // o,r,u,l={},i\n  61,  91,  93,  44,  99,  61,  47,  97,  99, 105, 116, 124, // =[],c=/acit|\n 101, 120,  40,  63,  58, 115, 124, 103, 124, 110, 124, 112, // ex(?:s|g|n|p\n 124,  36,  41, 124, 114, 112, 104, 124, 103, 114, 105, 100, // |$)|rph|grid\n 124, 111, 119, 115, 124, 109, 110,  99, 124, 110, 116, 119, // |ows|mnc|ntw\n 124, 105, 110, 101,  91,  99, 104,  93, 124, 122, 111, 111, // |ine[ch]|zoo\n 124,  94, 111, 114, 100, 124, 105, 116, 101, 114,  97,  47, // |^ord|itera/\n 105,  59, 102, 117, 110,  99, 116, 105, 111, 110,  32, 115, // i;function s\n  40, 101,  44, 110,  41, 123, 102, 111, 114,  40, 118,  97, // (e,n){for(va\n 114,  32,  95,  32, 105, 110,  32, 110,  41, 101,  91,  95, // r _ in n)e[_\n  93,  61, 110,  91,  95,  93,  59, 114, 101, 116, 117, 114, // ]=n[_];retur\n 110,  32, 101, 125, 102, 117, 110,  99, 116, 105, 111, 110, // n e}function\n  32, 102,  40, 101,  41, 123, 118,  97, 114,  32, 110,  61, //  f(e){var n=\n 101,  46, 112,  97, 114, 101, 110, 116,  78, 111, 100, 101, // e.parentNode\n  59, 110,  38,  38, 110,  46, 114, 101, 109, 111, 118, 101, // ;n&&n.remove\n  67, 104, 105, 108, 100,  40, 101,  41, 125, 102, 117, 110, // Child(e)}fun\n  99, 116, 105, 111, 110,  32,  97,  40, 110,  44,  95,  44, // ction a(n,_,\n 116,  41, 123, 118,  97, 114,  32, 111,  44, 114,  44, 117, // t){var o,r,u\n  44, 108,  61, 123, 125,  59, 102, 111, 114,  40, 117,  32, // ,l={};for(u \n 105, 110,  32,  95,  41,  34, 107, 101, 121,  34,  61,  61, // in _)\"key\"==\n 117,  63, 111,  61,  95,  91, 117,  93,  58,  34, 114, 101, // u?o=_[u]:\"re\n 102,  34,  61,  61, 117,  63, 114,  61,  95,  91, 117,  93, // f\"==u?r=_[u]\n  58, 108,  91, 117,  93,  61,  95,  91, 117,  93,  59, 105, // :l[u]=_[u];i\n 102,  40,  97, 114, 103, 117, 109, 101, 110, 116, 115,  46, // f(arguments.\n 108, 101, 110, 103, 116, 104,  62,  50,  38,  38,  40, 108, // length>2&&(l\n  46,  99, 104, 105, 108, 100, 114, 101, 110,  61,  97, 114, // .children=ar\n 103, 117, 109, 101, 110, 116, 115,  46, 108, 101, 110, 103, // guments.leng\n 116, 104,  62,  51,  63, 101,  46,  99,  97, 108, 108,  40, // th>3?e.call(\n  97, 114, 103, 117, 109, 101, 110, 116, 115,  44,  50,  41, // arguments,2)\n  58, 116,  41,  44,  34, 102, 117, 110,  99, 116, 105, 111, // :t),\"functio\n 110,  34,  61,  61, 116, 121, 112, 101, 111, 102,  32, 110, // n\"==typeof n\n  38,  38, 110, 117, 108, 108,  33,  61, 110,  46, 100, 101, // &&null!=n.de\n 102,  97, 117, 108, 116,  80, 114, 111, 112, 115,  41, 102, // faultProps)f\n 111, 114,  40, 117,  32, 105, 110,  32, 110,  46, 100, 101, // or(u in n.de\n 102,  97, 117, 108, 116,  80, 114, 111, 112, 115,  41, 118, // faultProps)v\n 111, 105, 100,  32,  48,  61,  61,  61, 108,  91, 117,  93, // oid 0===l[u]\n  38,  38,  40, 108,  91, 117,  93,  61, 110,  46, 100, 101, // &&(l[u]=n.de\n 102,  97, 117, 108, 116,  80, 114, 111, 112, 115,  91, 117, // faultProps[u\n  93,  41,  59, 114, 101, 116, 117, 114, 110,  32, 112,  40, // ]);return p(\n 110,  44, 108,  44, 111,  44, 114,  44, 110, 117, 108, 108, // n,l,o,r,null\n  41, 125, 102, 117, 110,  99, 116, 105, 111, 110,  32, 112, // )}function p\n  40, 101,  44, 116,  44, 111,  44, 114,  44, 117,  41, 123, // (e,t,o,r,u){\n 118,  97, 114,  32, 108,  61, 123, 116, 121, 112, 101,  58, // var l={type:\n 101,  44, 112, 114, 111, 112, 115,  58, 116,  44, 107, 101, // e,props:t,ke\n 121,  58, 111,  44, 114, 101, 102,  58, 114,  44,  95,  95, // y:o,ref:r,__\n 107,  58, 110, 117, 108, 108,  44,  95,  95,  58, 110, 117, // k:null,__:nu\n 108, 108,  44,  95,  95,  98,  58,  48,  44,  95,  95, 101, // ll,__b:0,__e\n  58, 110, 117, 108, 108,  44,  95,  95, 100,  58, 118, 111, // :null,__d:vo\n 105, 100,  32,  48,  44,  95,  95,  99,  58, 110, 117, 108, // id 0,__c:nul\n 108,  44,  95,  95, 104,  58, 110, 117, 108, 108,  44,  99, // l,__h:null,c\n 111, 110, 115, 116, 114, 117,  99, 116, 111, 114,  58, 118, // onstructor:v\n 111, 105, 100,  32,  48,  44,  95,  95, 118,  58, 110, 117, // oid 0,__v:nu\n 108, 108,  61,  61, 117,  63,  43,  43,  95,  58, 117, 125, // ll==u?++_:u}\n  59, 114, 101, 116, 117, 114, 110,  32, 110, 117, 108, 108, // ;return null\n  33,  61, 110,  46, 118, 110, 111, 100, 101,  38,  38, 110, // !=n.vnode&&n\n  46, 118, 110, 111, 100, 101,  40, 108,  41,  44, 108, 125, // .vnode(l),l}\n 102, 117, 110,  99, 116, 105, 111, 110,  32, 104,  40, 101, // function h(e\n  41, 123, 114, 101, 116, 117, 114, 110,  32, 101,  46,  99, // ){return e.c\n 104, 105, 108, 100, 114, 101, 110, 125, 102, 117, 110,  99, // hildren}func\n 116, 105, 111, 110,  32, 100,  40, 101,  44, 110,  41, 123, // tion d(e,n){\n 116, 104, 105, 115,  46, 112, 114, 111, 112, 115,  61, 101, // this.props=e\n  44, 116, 104, 105, 115,  46,  99, 111, 110, 116, 101, 120, // ,this.contex\n 116,  61, 110, 125, 102, 117, 110,  99, 116, 105, 111, 110, // t=n}function\n  32, 118,  40, 101,  44, 110,  41, 123, 105, 102,  40, 110, //  v(e,n){if(n\n 117, 108, 108,  61,  61, 110,  41, 114, 101, 116, 117, 114, // ull==n)retur\n 110,  32, 101,  46,  95,  95,  63, 118,  40, 101,  46,  95, // n e.__?v(e._\n  95,  44, 101,  46,  95,  95,  46,  95,  95, 107,  46, 105, // _,e.__.__k.i\n 110, 100, 101, 120,  79, 102,  40, 101,  41,  43,  49,  41, // ndexOf(e)+1)\n  58, 110, 117, 108, 108,  59, 102, 111, 114,  40, 118,  97, // :null;for(va\n 114,  32,  95,  59, 110,  60, 101,  46,  95,  95, 107,  46, // r _;n<e.__k.\n 108, 101, 110, 103, 116, 104,  59, 110,  43,  43,  41, 105, // length;n++)i\n 102,  40, 110, 117, 108, 108,  33,  61,  40,  95,  61, 101, // f(null!=(_=e\n  46,  95,  95, 107,  91, 110,  93,  41,  38,  38, 110, 117, // .__k[n])&&nu\n 108, 108,  33,  61,  95,  46,  95,  95, 101,  41, 114, 101, // ll!=_.__e)re\n 116, 117, 114, 110,  32,  95,  46,  95,  95, 101,  59, 114, // turn _.__e;r\n 101, 116, 117, 114, 110,  34, 102, 117, 110,  99, 116, 105, // eturn\"functi\n 111, 110,  34,  61,  61, 116, 121, 112, 101, 111, 102,  32, // on\"==typeof \n 101,  46, 116, 121, 112, 101,  63, 118,  40, 101,  41,  58, // e.type?v(e):\n 110, 117, 108, 108, 125, 102, 117, 110,  99, 116, 105, 111, // null}functio\n 110,  32, 121,  40, 101,  41, 123, 118,  97, 114,  32, 110, // n y(e){var n\n  44,  95,  59, 105, 102,  40, 110, 117, 108, 108,  33,  61, // ,_;if(null!=\n  40, 101,  61, 101,  46,  95,  95,  41,  38,  38, 110, 117, // (e=e.__)&&nu\n 108, 108,  33,  61, 101,  46,  95,  95,  99,  41, 123, 102, // ll!=e.__c){f\n 111, 114,  40, 101,  46,  95,  95, 101,  61, 101,  46,  95, // or(e.__e=e._\n  95,  99,  46,  98,  97, 115, 101,  61, 110, 117, 108, 108, // _c.base=null\n  44, 110,  61,  48,  59, 110,  60, 101,  46,  95,  95, 107, // ,n=0;n<e.__k\n  46, 108, 101, 110, 103, 116, 104,  59, 110,  43,  43,  41, // .length;n++)\n 105, 102,  40, 110, 117, 108, 108,  33,  61,  40,  95,  61, // if(null!=(_=\n 101,  46,  95,  95, 107,  91, 110,  93,  41,  38,  38, 110, // e.__k[n])&&n\n 117, 108, 108,  33,  61,  95,  46,  95,  95, 101,  41, 123, // ull!=_.__e){\n 101,  46,  95,  95, 101,  61, 101,  46,  95,  95,  99,  46, // e.__e=e.__c.\n  98,  97, 115, 101,  61,  95,  46,  95,  95, 101,  59,  98, // base=_.__e;b\n 114, 101,  97, 107, 125, 114, 101, 116, 117, 114, 110,  32, // reak}return \n 121,  40, 101,  41, 125, 125, 102, 117, 110,  99, 116, 105, // y(e)}}functi\n 111, 110,  32, 109,  40, 101,  41, 123,  40,  33, 101,  46, // on m(e){(!e.\n  95,  95, 100,  38,  38,  40, 101,  46,  95,  95, 100,  61, // __d&&(e.__d=\n  33,  48,  41,  38,  38, 116,  46, 112, 117, 115, 104,  40, // !0)&&t.push(\n 101,  41,  38,  38,  33, 103,  46,  95,  95, 114,  43,  43, // e)&&!g.__r++\n 124, 124, 114,  33,  61,  61, 110,  46, 100, 101,  98, 111, // ||r!==n.debo\n 117, 110,  99, 101,  82, 101, 110, 100, 101, 114, 105, 110, // unceRenderin\n 103,  41,  38,  38,  40,  40, 114,  61, 110,  46, 100, 101, // g)&&((r=n.de\n  98, 111, 117, 110,  99, 101,  82, 101, 110, 100, 101, 114, // bounceRender\n 105, 110, 103,  41, 124, 124, 111,  41,  40, 103,  41, 125, // ing)||o)(g)}\n 102, 117, 110,  99, 116, 105, 111, 110,  32, 103,  40,  41, // function g()\n 123, 102, 111, 114,  40, 118,  97, 114,  32, 101,  59, 103, // {for(var e;g\n  46,  95,  95, 114,  61, 116,  46, 108, 101, 110, 103, 116, // .__r=t.lengt\n 104,  59,  41, 101,  61, 116,  46, 115, 111, 114, 116,  40, // h;)e=t.sort(\n 102, 117, 110,  99, 116, 105, 111, 110,  40, 101,  44, 110, // function(e,n\n  41, 123, 114, 101, 116, 117, 114, 110,  32, 101,  46,  95, // ){return e._\n  95, 118,  46,  95,  95,  98,  45, 110,  46,  95,  95, 118, // _v.__b-n.__v\n  46,  95,  95,  98, 125,  41,  44, 116,  61,  91,  93,  44, // .__b}),t=[],\n 101,  46, 115, 111, 109, 101,  40, 102, 117, 110,  99, 116, // e.some(funct\n 105, 111, 110,  40, 101,  41, 123, 118,  97, 114,  32, 110, // ion(e){var n\n  44,  95,  44, 116,  44, 111,  44, 114,  44, 117,  59, 101, // ,_,t,o,r,u;e\n  46,  95,  95, 100,  38,  38,  40, 114,  61,  40, 111,  61, // .__d&&(r=(o=\n  40, 110,  61, 101,  41,  46,  95,  95, 118,  41,  46,  95, // (n=e).__v)._\n  95, 101,  44,  40, 117,  61, 110,  46,  95,  95,  80,  41, // _e,(u=n.__P)\n  38,  38,  40,  95,  61,  91,  93,  44,  40, 116,  61, 115, // &&(_=[],(t=s\n  40, 123, 125,  44, 111,  41,  41,  46,  95,  95, 118,  61, // ({},o)).__v=\n 111,  46,  95,  95, 118,  43,  49,  44,  80,  40, 117,  44, // o.__v+1,P(u,\n 111,  44, 116,  44, 110,  46,  95,  95, 110,  44, 118, 111, // o,t,n.__n,vo\n 105, 100,  32,  48,  33,  61,  61, 117,  46, 111, 119, 110, // id 0!==u.own\n 101, 114,  83,  86,  71,  69, 108, 101, 109, 101, 110, 116, // erSVGElement\n  44, 110, 117, 108, 108,  33,  61, 111,  46,  95,  95, 104, // ,null!=o.__h\n  63,  91, 114,  93,  58, 110, 117, 108, 108,  44,  95,  44, // ?[r]:null,_,\n 110, 117, 108, 108,  61,  61, 114,  63, 118,  40, 111,  41, // null==r?v(o)\n  58, 114,  44, 111,  46,  95,  95, 104,  41,  44,  68,  40, // :r,o.__h),D(\n  95,  44, 111,  41,  44, 111,  46,  95,  95, 101,  33,  61, // _,o),o.__e!=\n 114,  38,  38, 121,  40, 111,  41,  41,  41, 125,  41, 125, // r&&y(o)))})}\n 102, 117, 110,  99, 116, 105, 111, 110,  32, 107,  40, 101, // function k(e\n  44, 110,  44,  95,  44, 116,  44, 111,  44, 114,  44, 117, // ,n,_,t,o,r,u\n  44,  99,  44, 115,  44, 102,  41, 123, 118,  97, 114,  32, // ,c,s,f){var \n  97,  44, 100,  44, 121,  44, 109,  44, 103,  44, 107,  44, // a,d,y,m,g,k,\n 120,  44,  72,  61, 116,  38,  38, 116,  46,  95,  95, 107, // x,H=t&&t.__k\n 124, 124, 105,  44,  69,  61,  72,  46, 108, 101, 110, 103, // ||i,E=H.leng\n 116, 104,  59, 102, 111, 114,  40,  95,  46,  95,  95, 107, // th;for(_.__k\n  61,  91,  93,  44,  97,  61,  48,  59,  97,  60, 110,  46, // =[],a=0;a<n.\n 108, 101, 110, 103, 116, 104,  59,  97,  43,  43,  41, 105, // length;a++)i\n 102,  40, 110, 117, 108, 108,  33,  61,  40, 109,  61,  95, // f(null!=(m=_\n  46,  95,  95, 107,  91,  97,  93,  61, 110, 117, 108, 108, // .__k[a]=null\n  61,  61,  40, 109,  61, 110,  91,  97,  93,  41, 124, 124, // ==(m=n[a])||\n  34,  98, 111, 111, 108, 101,  97, 110,  34,  61,  61, 116, // \"boolean\"==t\n 121, 112, 101, 111, 102,  32, 109,  63, 110, 117, 108, 108, // ypeof m?null\n  58,  34, 115, 116, 114, 105, 110, 103,  34,  61,  61, 116, // :\"string\"==t\n 121, 112, 101, 111, 102,  32, 109, 124, 124,  34, 110, 117, // ypeof m||\"nu\n 109,  98, 101, 114,  34,  61,  61, 116, 121, 112, 101, 111, // mber\"==typeo\n 102,  32, 109, 124, 124,  34,  98, 105, 103, 105, 110, 116, // f m||\"bigint\n  34,  61,  61, 116, 121, 112, 101, 111, 102,  32, 109,  63, // \"==typeof m?\n 112,  40, 110, 117, 108, 108,  44, 109,  44, 110, 117, 108, // p(null,m,nul\n 108,  44, 110, 117, 108, 108,  44, 109,  41,  58,  65, 114, // l,null,m):Ar\n 114,  97, 121,  46, 105, 115,  65, 114, 114,  97, 121,  40, // ray.isArray(\n 109,  41,  63, 112,  40, 104,  44, 123,  99, 104, 105, 108, // m)?p(h,{chil\n 100, 114, 101, 110,  58, 109, 125,  44, 110, 117, 108, 108, // dren:m},null\n  44, 110, 117, 108, 108,  44, 110, 117, 108, 108,  41,  58, // ,null,null):\n 109,  46,  95,  95,  98,  62,  48,  63, 112,  40, 109,  46, // m.__b>0?p(m.\n 116, 121, 112, 101,  44, 109,  46, 112, 114, 111, 112, 115, // type,m.props\n  44, 109,  46, 107, 101, 121,  44, 110, 117, 108, 108,  44, // ,m.key,null,\n 109,  46,  95,  95, 118,  41,  58, 109,  41,  41, 123, 105, // m.__v):m)){i\n 102,  40, 109,  46,  95,  95,  61,  95,  44, 109,  46,  95, // f(m.__=_,m._\n  95,  98,  61,  95,  46,  95,  95,  98,  43,  49,  44, 110, // _b=_.__b+1,n\n 117, 108, 108,  61,  61,  61,  40, 121,  61,  72,  91,  97, // ull===(y=H[a\n  93,  41, 124, 124, 121,  38,  38, 109,  46, 107, 101, 121, // ])||y&&m.key\n  61,  61, 121,  46, 107, 101, 121,  38,  38, 109,  46, 116, // ==y.key&&m.t\n 121, 112, 101,  61,  61,  61, 121,  46, 116, 121, 112, 101, // ype===y.type\n  41,  72,  91,  97,  93,  61, 118, 111, 105, 100,  32,  48, // )H[a]=void 0\n  59, 101, 108, 115, 101,  32, 102, 111, 114,  40, 100,  61, // ;else for(d=\n  48,  59, 100,  60,  69,  59, 100,  43,  43,  41, 123, 105, // 0;d<E;d++){i\n 102,  40,  40, 121,  61,  72,  91, 100,  93,  41,  38,  38, // f((y=H[d])&&\n 109,  46, 107, 101, 121,  61,  61, 121,  46, 107, 101, 121, // m.key==y.key\n  38,  38, 109,  46, 116, 121, 112, 101,  61,  61,  61, 121, // &&m.type===y\n  46, 116, 121, 112, 101,  41, 123,  72,  91, 100,  93,  61, // .type){H[d]=\n 118, 111, 105, 100,  32,  48,  59,  98, 114, 101,  97, 107, // void 0;break\n 125, 121,  61, 110, 117, 108, 108, 125,  80,  40, 101,  44, // }y=null}P(e,\n 109,  44, 121,  61, 121, 124, 124, 108,  44, 111,  44, 114, // m,y=y||l,o,r\n  44, 117,  44,  99,  44, 115,  44, 102,  41,  44, 103,  61, // ,u,c,s,f),g=\n 109,  46,  95,  95, 101,  44,  40, 100,  61, 109,  46, 114, // m.__e,(d=m.r\n 101, 102,  41,  38,  38, 121,  46, 114, 101, 102,  33,  61, // ef)&&y.ref!=\n 100,  38,  38,  40, 120, 124, 124,  40, 120,  61,  91,  93, // d&&(x||(x=[]\n  41,  44, 121,  46, 114, 101, 102,  38,  38, 120,  46, 112, // ),y.ref&&x.p\n 117, 115, 104,  40, 121,  46, 114, 101, 102,  44, 110, 117, // ush(y.ref,nu\n 108, 108,  44, 109,  41,  44, 120,  46, 112, 117, 115, 104, // ll,m),x.push\n  40, 100,  44, 109,  46,  95,  95,  99, 124, 124, 103,  44, // (d,m.__c||g,\n 109,  41,  41,  44, 110, 117, 108, 108,  33,  61, 103,  63, // m)),null!=g?\n  40, 110, 117, 108, 108,  61,  61, 107,  38,  38,  40, 107, // (null==k&&(k\n  61, 103,  41,  44,  34, 102, 117, 110,  99, 116, 105, 111, // =g),\"functio\n 110,  34,  61,  61, 116, 121, 112, 101, 111, 102,  32, 109, // n\"==typeof m\n  46, 116, 121, 112, 101,  38,  38, 110, 117, 108, 108,  33, // .type&&null!\n  61, 109,  46,  95,  95, 107,  38,  38, 109,  46,  95,  95, // =m.__k&&m.__\n 107,  61,  61,  61, 121,  46,  95,  95, 107,  63, 109,  46, // k===y.__k?m.\n  95,  95, 100,  61, 115,  61,  98,  40, 109,  44, 115,  44, // __d=s=b(m,s,\n 101,  41,  58, 115,  61,  67,  40, 101,  44, 109,  44, 121, // e):s=C(e,m,y\n  44,  72,  44, 103,  44, 115,  41,  44, 102, 124, 124,  34, // ,H,g,s),f||\"\n 111, 112, 116, 105, 111, 110,  34,  33,  61,  61,  95,  46, // option\"!==_.\n 116, 121, 112, 101,  63,  34, 102, 117, 110,  99, 116, 105, // type?\"functi\n 111, 110,  34,  61,  61, 116, 121, 112, 101, 111, 102,  32, // on\"==typeof \n  95,  46, 116, 121, 112, 101,  38,  38,  40,  95,  46,  95, // _.type&&(_._\n  95, 100,  61, 115,  41,  58, 101,  46, 118,  97, 108, 117, // _d=s):e.valu\n 101,  61,  34,  34,  41,  58, 115,  38,  38, 121,  46,  95, // e=\"\"):s&&y._\n  95, 101,  61,  61, 115,  38,  38, 115,  46, 112,  97, 114, // _e==s&&s.par\n 101, 110, 116,  78, 111, 100, 101,  33,  61, 101,  38,  38, // entNode!=e&&\n  40, 115,  61, 118,  40, 121,  41,  41, 125, 102, 111, 114, // (s=v(y))}for\n  40,  95,  46,  95,  95, 101,  61, 107,  44,  97,  61,  69, // (_.__e=k,a=E\n  59,  97,  45,  45,  59,  41, 110, 117, 108, 108,  33,  61, // ;a--;)null!=\n  72,  91,  97,  93,  38,  38,  40,  34, 102, 117, 110,  99, // H[a]&&(\"func\n 116, 105, 111, 110,  34,  61,  61, 116, 121, 112, 101, 111, // tion\"==typeo\n 102,  32,  95,  46, 116, 121, 112, 101,  38,  38, 110, 117, // f _.type&&nu\n 108, 108,  33,  61,  72,  91,  97,  93,  46,  95,  95, 101, // ll!=H[a].__e\n  38,  38,  72,  91,  97,  93,  46,  95,  95, 101,  61,  61, // &&H[a].__e==\n  95,  46,  95,  95, 100,  38,  38,  40,  95,  46,  95,  95, // _.__d&&(_.__\n 100,  61, 118,  40, 116,  44,  97,  43,  49,  41,  41,  44, // d=v(t,a+1)),\n  85,  40,  72,  91,  97,  93,  44,  72,  91,  97,  93,  41, // U(H[a],H[a])\n  41,  59, 105, 102,  40, 120,  41, 102, 111, 114,  40,  97, // );if(x)for(a\n  61,  48,  59,  97,  60, 120,  46, 108, 101, 110, 103, 116, // =0;a<x.lengt\n 104,  59,  97,  43,  43,  41,  84,  40, 120,  91,  97,  93, // h;a++)T(x[a]\n  44, 120,  91,  43,  43,  97,  93,  44, 120,  91,  43,  43, // ,x[++a],x[++\n  97,  93,  41, 125, 102, 117, 110,  99, 116, 105, 111, 110, // a])}function\n  32,  98,  40, 101,  44, 110,  44,  95,  41, 123, 118,  97, //  b(e,n,_){va\n 114,  32, 116,  44, 111,  59, 102, 111, 114,  40, 116,  61, // r t,o;for(t=\n  48,  59, 116,  60, 101,  46,  95,  95, 107,  46, 108, 101, // 0;t<e.__k.le\n 110, 103, 116, 104,  59, 116,  43,  43,  41,  40, 111,  61, // ngth;t++)(o=\n 101,  46,  95,  95, 107,  91, 116,  93,  41,  38,  38,  40, // e.__k[t])&&(\n 111,  46,  95,  95,  61, 101,  44, 110,  61,  34, 102, 117, // o.__=e,n=\"fu\n 110,  99, 116, 105, 111, 110,  34,  61,  61, 116, 121, 112, // nction\"==typ\n 101, 111, 102,  32, 111,  46, 116, 121, 112, 101,  63,  98, // eof o.type?b\n  40, 111,  44, 110,  44,  95,  41,  58,  67,  40,  95,  44, // (o,n,_):C(_,\n 111,  44, 111,  44, 101,  46,  95,  95, 107,  44, 111,  46, // o,o,e.__k,o.\n  95,  95, 101,  44, 110,  41,  41,  59, 114, 101, 116, 117, // __e,n));retu\n 114, 110,  32, 110, 125, 102, 117, 110,  99, 116, 105, 111, // rn n}functio\n 110,  32,  67,  40, 101,  44, 110,  44,  95,  44, 116,  44, // n C(e,n,_,t,\n 111,  44, 114,  41, 123, 118,  97, 114,  32, 117,  44, 108, // o,r){var u,l\n  44, 105,  59, 105, 102,  40, 118, 111, 105, 100,  32,  48, // ,i;if(void 0\n  33,  61,  61, 110,  46,  95,  95, 100,  41, 117,  61, 110, // !==n.__d)u=n\n  46,  95,  95, 100,  44, 110,  46,  95,  95, 100,  61, 118, // .__d,n.__d=v\n 111, 105, 100,  32,  48,  59, 101, 108, 115, 101,  32, 105, // oid 0;else i\n 102,  40, 110, 117, 108, 108,  61,  61,  95, 124, 124, 111, // f(null==_||o\n  33,  61, 114, 124, 124, 110, 117, 108, 108,  61,  61, 111, // !=r||null==o\n  46, 112,  97, 114, 101, 110, 116,  78, 111, 100, 101,  41, // .parentNode)\n 101,  58, 105, 102,  40, 110, 117, 108, 108,  61,  61, 114, // e:if(null==r\n 124, 124, 114,  46, 112,  97, 114, 101, 110, 116,  78, 111, // ||r.parentNo\n 100, 101,  33,  61,  61, 101,  41, 101,  46,  97, 112, 112, // de!==e)e.app\n 101, 110, 100,  67, 104, 105, 108, 100,  40, 111,  41,  44, // endChild(o),\n 117,  61, 110, 117, 108, 108,  59, 101, 108, 115, 101, 123, // u=null;else{\n 102, 111, 114,  40, 108,  61, 114,  44, 105,  61,  48,  59, // for(l=r,i=0;\n  40, 108,  61, 108,  46, 110, 101, 120, 116,  83, 105,  98, // (l=l.nextSib\n 108, 105, 110, 103,  41,  38,  38, 105,  60, 116,  46, 108, // ling)&&i<t.l\n 101, 110, 103, 116, 104,  59, 105,  43,  61,  50,  41, 105, // ength;i+=2)i\n 102,  40, 108,  61,  61, 111,  41,  98, 114, 101,  97, 107, // f(l==o)break\n  32, 101,  59, 101,  46, 105, 110, 115, 101, 114, 116,  66, //  e;e.insertB\n 101, 102, 111, 114, 101,  40, 111,  44, 114,  41,  44, 117, // efore(o,r),u\n  61, 114, 125, 114, 101, 116, 117, 114, 110,  32, 118, 111, // =r}return vo\n 105, 100,  32,  48,  33,  61,  61, 117,  63, 117,  58, 111, // id 0!==u?u:o\n  46, 110, 101, 120, 116,  83, 105,  98, 108, 105, 110, 103, // .nextSibling\n 125, 102, 117, 110,  99, 116, 105, 111, 110,  32, 120,  40, // }function x(\n 101,  44, 110,  44,  95,  41, 123,  34,  45,  34,  61,  61, // e,n,_){\"-\"==\n  61, 110,  91,  48,  93,  63, 101,  46, 115, 101, 116,  80, // =n[0]?e.setP\n 114, 111, 112, 101, 114, 116, 121,  40, 110,  44,  95,  41, // roperty(n,_)\n  58, 101,  91, 110,  93,  61, 110, 117, 108, 108,  61,  61, // :e[n]=null==\n  95,  63,  34,  34,  58,  34, 110, 117, 109,  98, 101, 114, // _?\"\":\"number\n  34,  33,  61, 116, 121, 112, 101, 111, 102,  32,  95, 124, // \"!=typeof _|\n 124,  99,  46, 116, 101, 115, 116,  40, 110,  41,  63,  95, // |c.test(n)?_\n  58,  95,  43,  34, 112, 120,  34, 125, 102, 117, 110,  99, // :_+\"px\"}func\n 116, 105, 111, 110,  32,  72,  40, 101,  44, 110,  44,  95, // tion H(e,n,_\n  44, 116,  44, 111,  41, 123, 118,  97, 114,  32, 114,  59, // ,t,o){var r;\n 101,  58, 105, 102,  40,  34, 115, 116, 121, 108, 101,  34, // e:if(\"style\"\n  61,  61,  61, 110,  41, 105, 102,  40,  34, 115, 116, 114, // ===n)if(\"str\n 105, 110, 103,  34,  61,  61, 116, 121, 112, 101, 111, 102, // ing\"==typeof\n  32,  95,  41, 101,  46, 115, 116, 121, 108, 101,  46,  99, //  _)e.style.c\n 115, 115,  84, 101, 120, 116,  61,  95,  59, 101, 108, 115, // ssText=_;els\n 101, 123, 105, 102,  40,  34, 115, 116, 114, 105, 110, 103, // e{if(\"string\n  34,  61,  61, 116, 121, 112, 101, 111, 102,  32, 116,  38, // \"==typeof t&\n  38,  40, 101,  46, 115, 116, 121, 108, 101,  46,  99, 115, // &(e.style.cs\n 115,  84, 101, 120, 116,  61, 116,  61,  34,  34,  41,  44, // sText=t=\"\"),\n 116,  41, 102, 111, 114,  40, 110,  32, 105, 110,  32, 116, // t)for(n in t\n  41,  95,  38,  38, 110,  32, 105, 110,  32,  95, 124, 124, // )_&&n in _||\n 120,  40, 101,  46, 115, 116, 121, 108, 101,  44, 110,  44, // x(e.style,n,\n  34,  34,  41,  59, 105, 102,  40,  95,  41, 102, 111, 114, // \"\");if(_)for\n  40, 110,  32, 105, 110,  32,  95,  41, 116,  38,  38,  95, // (n in _)t&&_\n  91, 110,  93,  61,  61,  61, 116,  91, 110,  93, 124, 124, // [n]===t[n]||\n 120,  40, 101,  46, 115, 116, 121, 108, 101,  44, 110,  44, // x(e.style,n,\n  95,  91, 110,  93,  41, 125, 101, 108, 115, 101,  32, 105, // _[n])}else i\n 102,  40,  34, 111,  34,  61,  61,  61, 110,  91,  48,  93, // f(\"o\"===n[0]\n  38,  38,  34, 110,  34,  61,  61,  61, 110,  91,  49,  93, // &&\"n\"===n[1]\n  41, 114,  61, 110,  33,  61,  61,  40, 110,  61, 110,  46, // )r=n!==(n=n.\n 114, 101, 112, 108,  97,  99, 101,  40,  47,  67,  97, 112, // replace(/Cap\n 116, 117, 114, 101,  36,  47,  44,  34,  34,  41,  41,  44, // ture$/,\"\")),\n 110,  61, 110,  46, 116, 111,  76, 111, 119, 101, 114,  67, // n=n.toLowerC\n  97, 115, 101,  40,  41, 105, 110,  32, 101,  63, 110,  46, // ase()in e?n.\n 116, 111,  76, 111, 119, 101, 114,  67,  97, 115, 101,  40, // toLowerCase(\n  41,  46, 115, 108, 105,  99, 101,  40,  50,  41,  58, 110, // ).slice(2):n\n  46, 115, 108, 105,  99, 101,  40,  50,  41,  44, 101,  46, // .slice(2),e.\n 108, 124, 124,  40, 101,  46, 108,  61, 123, 125,  41,  44, // l||(e.l={}),\n 101,  46, 108,  91, 110,  43, 114,  93,  61,  95,  44,  95, // e.l[n+r]=_,_\n  63, 116, 124, 124, 101,  46,  97, 100, 100,  69, 118, 101, // ?t||e.addEve\n 110, 116,  76, 105, 115, 116, 101, 110, 101, 114,  40, 110, // ntListener(n\n  44, 114,  63,  83,  58,  69,  44, 114,  41,  58, 101,  46, // ,r?S:E,r):e.\n 114, 101, 109, 111, 118, 101,  69, 118, 101, 110, 116,  76, // removeEventL\n 105, 115, 116, 101, 110, 101, 114,  40, 110,  44, 114,  63, // istener(n,r?\n  83,  58,  69,  44, 114,  41,  59, 101, 108, 115, 101,  32, // S:E,r);else \n 105, 102,  40,  34, 100,  97, 110, 103, 101, 114, 111, 117, // if(\"dangerou\n 115, 108, 121,  83, 101, 116,  73, 110, 110, 101, 114,  72, // slySetInnerH\n  84,  77,  76,  34,  33,  61,  61, 110,  41, 123, 105, 102, // TML\"!==n){if\n  40, 111,  41, 110,  61, 110,  46, 114, 101, 112, 108,  97, // (o)n=n.repla\n  99, 101,  40,  47, 120, 108, 105, 110, 107,  91,  72,  58, // ce(/xlink[H:\n 104,  93,  47,  44,  34, 104,  34,  41,  46, 114, 101, 112, // h]/,\"h\").rep\n 108,  97,  99, 101,  40,  47, 115,  78,  97, 109, 101,  36, // lace(/sName$\n  47,  44,  34, 115,  34,  41,  59, 101, 108, 115, 101,  32, // /,\"s\");else \n 105, 102,  40,  34, 104, 114, 101, 102,  34,  33,  61,  61, // if(\"href\"!==\n 110,  38,  38,  34, 108, 105, 115, 116,  34,  33,  61,  61, // n&&\"list\"!==\n 110,  38,  38,  34, 102, 111, 114, 109,  34,  33,  61,  61, // n&&\"form\"!==\n 110,  38,  38,  34, 116,  97,  98,  73, 110, 100, 101, 120, // n&&\"tabIndex\n  34,  33,  61,  61, 110,  38,  38,  34, 100, 111, 119, 110, // \"!==n&&\"down\n 108, 111,  97, 100,  34,  33,  61,  61, 110,  38,  38, 110, // load\"!==n&&n\n  32, 105, 110,  32, 101,  41, 116, 114, 121, 123, 101,  91, //  in e)try{e[\n 110,  93,  61, 110, 117, 108, 108,  61,  61,  95,  63,  34, // n]=null==_?\"\n  34,  58,  95,  59,  98, 114, 101,  97, 107,  32, 101, 125, // \":_;break e}\n  99,  97, 116,  99, 104,  40, 101,  41, 123, 125,  34, 102, // catch(e){}\"f\n 117, 110,  99, 116, 105, 111, 110,  34,  61,  61, 116, 121, // unction\"==ty\n 112, 101, 111, 102,  32,  95, 124, 124,  40, 110, 117, 108, // peof _||(nul\n 108,  33,  61,  95,  38,  38,  40,  33,  49,  33,  61,  61, // l!=_&&(!1!==\n  95, 124, 124,  34,  97,  34,  61,  61,  61, 110,  91,  48, // _||\"a\"===n[0\n  93,  38,  38,  34, 114,  34,  61,  61,  61, 110,  91,  49, // ]&&\"r\"===n[1\n  93,  41,  63, 101,  46, 115, 101, 116,  65, 116, 116, 114, // ])?e.setAttr\n 105,  98, 117, 116, 101,  40, 110,  44,  95,  41,  58, 101, // ibute(n,_):e\n  46, 114, 101, 109, 111, 118, 101,  65, 116, 116, 114, 105, // .removeAttri\n  98, 117, 116, 101,  40, 110,  41,  41, 125, 125, 102, 117, // bute(n))}}fu\n 110,  99, 116, 105, 111, 110,  32,  69,  40, 101,  41, 123, // nction E(e){\n 116, 104, 105, 115,  46, 108,  91, 101,  46, 116, 121, 112, // this.l[e.typ\n 101,  43,  33,  49,  93,  40, 110,  46, 101, 118, 101, 110, // e+!1](n.even\n 116,  63, 110,  46, 101, 118, 101, 110, 116,  40, 101,  41, // t?n.event(e)\n  58, 101,  41, 125, 102, 117, 110,  99, 116, 105, 111, 110, // :e)}function\n  32,  83,  40, 101,  41, 123, 116, 104, 105, 115,  46, 108, //  S(e){this.l\n  91, 101,  46, 116, 121, 112, 101,  43,  33,  48,  93,  40, // [e.type+!0](\n 110,  46, 101, 118, 101, 110, 116,  63, 110,  46, 101, 118, // n.event?n.ev\n 101, 110, 116,  40, 101,  41,  58, 101,  41, 125, 102, 117, // ent(e):e)}fu\n 110,  99, 116, 105, 111, 110,  32,  80,  40, 101,  44,  95, // nction P(e,_\n  44, 116,  44, 111,  44, 114,  44, 117,  44, 108,  44, 105, // ,t,o,r,u,l,i\n  44,  99,  41, 123, 118,  97, 114,  32, 102,  44,  97,  44, // ,c){var f,a,\n 112,  44, 118,  44, 121,  44, 109,  44, 103,  44,  98,  44, // p,v,y,m,g,b,\n  67,  44, 120,  44,  72,  44,  69,  61,  95,  46, 116, 121, // C,x,H,E=_.ty\n 112, 101,  59, 105, 102,  40, 118, 111, 105, 100,  32,  48, // pe;if(void 0\n  33,  61,  61,  95,  46,  99, 111, 110, 115, 116, 114, 117, // !==_.constru\n  99, 116, 111, 114,  41, 114, 101, 116, 117, 114, 110,  32, // ctor)return \n 110, 117, 108, 108,  59, 110, 117, 108, 108,  33,  61, 116, // null;null!=t\n  46,  95,  95, 104,  38,  38,  40,  99,  61, 116,  46,  95, // .__h&&(c=t._\n  95, 104,  44, 105,  61,  95,  46,  95,  95, 101,  61, 116, // _h,i=_.__e=t\n  46,  95,  95, 101,  44,  95,  46,  95,  95, 104,  61, 110, // .__e,_.__h=n\n 117, 108, 108,  44, 117,  61,  91, 105,  93,  41,  44,  40, // ull,u=[i]),(\n 102,  61, 110,  46,  95,  95,  98,  41,  38,  38, 102,  40, // f=n.__b)&&f(\n  95,  41,  59, 116, 114, 121, 123, 101,  58, 105, 102,  40, // _);try{e:if(\n  34, 102, 117, 110,  99, 116, 105, 111, 110,  34,  61,  61, // \"function\"==\n 116, 121, 112, 101, 111, 102,  32,  69,  41, 123, 105, 102, // typeof E){if\n  40,  98,  61,  95,  46, 112, 114, 111, 112, 115,  44,  67, // (b=_.props,C\n  61,  40, 102,  61,  69,  46,  99, 111, 110, 116, 101, 120, // =(f=E.contex\n 116,  84, 121, 112, 101,  41,  38,  38, 111,  91, 102,  46, // tType)&&o[f.\n  95,  95,  99,  93,  44, 120,  61, 102,  63,  67,  63,  67, // __c],x=f?C?C\n  46, 112, 114, 111, 112, 115,  46, 118,  97, 108, 117, 101, // .props.value\n  58, 102,  46,  95,  95,  58, 111,  44, 116,  46,  95,  95, // :f.__:o,t.__\n  99,  63, 103,  61,  40,  97,  61,  95,  46,  95,  95,  99, // c?g=(a=_.__c\n  61, 116,  46,  95,  95,  99,  41,  46,  95,  95,  61,  97, // =t.__c).__=a\n  46,  95,  95,  69,  58,  40,  34, 112, 114, 111, 116, 111, // .__E:(\"proto\n 116, 121, 112, 101,  34, 105, 110,  32,  69,  38,  38,  69, // type\"in E&&E\n  46, 112, 114, 111, 116, 111, 116, 121, 112, 101,  46, 114, // .prototype.r\n 101, 110, 100, 101, 114,  63,  95,  46,  95,  95,  99,  61, // ender?_.__c=\n  97,  61, 110, 101, 119,  32,  69,  40,  98,  44, 120,  41, // a=new E(b,x)\n  58,  40,  95,  46,  95,  95,  99,  61,  97,  61, 110, 101, // :(_.__c=a=ne\n 119,  32, 100,  40,  98,  44, 120,  41,  44,  97,  46,  99, // w d(b,x),a.c\n 111, 110, 115, 116, 114, 117,  99, 116, 111, 114,  61,  69, // onstructor=E\n  44,  97,  46, 114, 101, 110, 100, 101, 114,  61,  65,  41, // ,a.render=A)\n  44,  67,  38,  38,  67,  46, 115, 117,  98,  40,  97,  41, // ,C&&C.sub(a)\n  44,  97,  46, 112, 114, 111, 112, 115,  61,  98,  44,  97, // ,a.props=b,a\n  46, 115, 116,  97, 116, 101, 124, 124,  40,  97,  46, 115, // .state||(a.s\n 116,  97, 116, 101,  61, 123, 125,  41,  44,  97,  46,  99, // tate={}),a.c\n 111, 110, 116, 101, 120, 116,  61, 120,  44,  97,  46,  95, // ontext=x,a._\n  95, 110,  61, 111,  44, 112,  61,  97,  46,  95,  95, 100, // _n=o,p=a.__d\n  61,  33,  48,  44,  97,  46,  95,  95, 104,  61,  91,  93, // =!0,a.__h=[]\n  41,  44, 110, 117, 108, 108,  61,  61,  97,  46,  95,  95, // ),null==a.__\n 115,  38,  38,  40,  97,  46,  95,  95, 115,  61,  97,  46, // s&&(a.__s=a.\n 115, 116,  97, 116, 101,  41,  44, 110, 117, 108, 108,  33, // state),null!\n  61,  69,  46, 103, 101, 116,  68, 101, 114, 105, 118, 101, // =E.getDerive\n 100,  83, 116,  97, 116, 101,  70, 114, 111, 109,  80, 114, // dStateFromPr\n 111, 112, 115,  38,  38,  40,  97,  46,  95,  95, 115,  61, // ops&&(a.__s=\n  61,  97,  46, 115, 116,  97, 116, 101,  38,  38,  40,  97, // =a.state&&(a\n  46,  95,  95, 115,  61, 115,  40, 123, 125,  44,  97,  46, // .__s=s({},a.\n  95,  95, 115,  41,  41,  44, 115,  40,  97,  46,  95,  95, // __s)),s(a.__\n 115,  44,  69,  46, 103, 101, 116,  68, 101, 114, 105, 118, // s,E.getDeriv\n 101, 100,  83, 116,  97, 116, 101,  70, 114, 111, 109,  80, // edStateFromP\n 114, 111, 112, 115,  40,  98,  44,  97,  46,  95,  95, 115, // rops(b,a.__s\n  41,  41,  41,  44, 118,  61,  97,  46, 112, 114, 111, 112, // ))),v=a.prop\n 115,  44, 121,  61,  97,  46, 115, 116,  97, 116, 101,  44, // s,y=a.state,\n 112,  41, 110, 117, 108, 108,  61,  61,  69,  46, 103, 101, // p)null==E.ge\n 116,  68, 101, 114, 105, 118, 101, 100,  83, 116,  97, 116, // tDerivedStat\n 101,  70, 114, 111, 109,  80, 114, 111, 112, 115,  38,  38, // eFromProps&&\n 110, 117, 108, 108,  33,  61,  97,  46,  99, 111, 109, 112, // null!=a.comp\n 111, 110, 101, 110, 116,  87, 105, 108, 108,  77, 111, 117, // onentWillMou\n 110, 116,  38,  38,  97,  46,  99, 111, 109, 112, 111, 110, // nt&&a.compon\n 101, 110, 116,  87, 105, 108, 108,  77, 111, 117, 110, 116, // entWillMount\n  40,  41,  44, 110, 117, 108, 108,  33,  61,  97,  46,  99, // (),null!=a.c\n 111, 109, 112, 111, 110, 101, 110, 116,  68, 105, 100,  77, // omponentDidM\n 111, 117, 110, 116,  38,  38,  97,  46,  95,  95, 104,  46, // ount&&a.__h.\n 112, 117, 115, 104,  40,  97,  46,  99, 111, 109, 112, 111, // push(a.compo\n 110, 101, 110, 116,  68, 105, 100,  77, 111, 117, 110, 116, // nentDidMount\n  41,  59, 101, 108, 115, 101, 123, 105, 102,  40, 110, 117, // );else{if(nu\n 108, 108,  61,  61,  69,  46, 103, 101, 116,  68, 101, 114, // ll==E.getDer\n 105, 118, 101, 100,  83, 116,  97, 116, 101,  70, 114, 111, // ivedStateFro\n 109,  80, 114, 111, 112, 115,  38,  38,  98,  33,  61,  61, // mProps&&b!==\n 118,  38,  38, 110, 117, 108, 108,  33,  61,  97,  46,  99, // v&&null!=a.c\n 111, 109, 112, 111, 110, 101, 110, 116,  87, 105, 108, 108, // omponentWill\n  82, 101,  99, 101, 105, 118, 101,  80, 114, 111, 112, 115, // ReceiveProps\n  38,  38,  97,  46,  99, 111, 109, 112, 111, 110, 101, 110, // &&a.componen\n 116,  87, 105, 108, 108,  82, 101,  99, 101, 105, 118, 101, // tWillReceive\n  80, 114, 111, 112, 115,  40,  98,  44, 120,  41,  44,  33, // Props(b,x),!\n  97,  46,  95,  95, 101,  38,  38, 110, 117, 108, 108,  33, // a.__e&&null!\n  61,  97,  46, 115, 104, 111, 117, 108, 100,  67, 111, 109, // =a.shouldCom\n 112, 111, 110, 101, 110, 116,  85, 112, 100,  97, 116, 101, // ponentUpdate\n  38,  38,  33,  49,  61,  61,  61,  97,  46, 115, 104, 111, // &&!1===a.sho\n 117, 108, 100,  67, 111, 109, 112, 111, 110, 101, 110, 116, // uldComponent\n  85, 112, 100,  97, 116, 101,  40,  98,  44,  97,  46,  95, // Update(b,a._\n  95, 115,  44, 120,  41, 124, 124,  95,  46,  95,  95, 118, // _s,x)||_.__v\n  61,  61,  61, 116,  46,  95,  95, 118,  41, 123,  97,  46, // ===t.__v){a.\n 112, 114, 111, 112, 115,  61,  98,  44,  97,  46, 115, 116, // props=b,a.st\n  97, 116, 101,  61,  97,  46,  95,  95, 115,  44,  95,  46, // ate=a.__s,_.\n  95,  95, 118,  33,  61,  61, 116,  46,  95,  95, 118,  38, // __v!==t.__v&\n  38,  40,  97,  46,  95,  95, 100,  61,  33,  49,  41,  44, // &(a.__d=!1),\n  97,  46,  95,  95, 118,  61,  95,  44,  95,  46,  95,  95, // a.__v=_,_.__\n 101,  61, 116,  46,  95,  95, 101,  44,  95,  46,  95,  95, // e=t.__e,_.__\n 107,  61, 116,  46,  95,  95, 107,  44,  95,  46,  95,  95, // k=t.__k,_.__\n 107,  46, 102, 111, 114,  69,  97,  99, 104,  40, 102, 117, // k.forEach(fu\n 110,  99, 116, 105, 111, 110,  40, 101,  41, 123, 101,  38, // nction(e){e&\n  38,  40, 101,  46,  95,  95,  61,  95,  41, 125,  41,  44, // &(e.__=_)}),\n  97,  46,  95,  95, 104,  46, 108, 101, 110, 103, 116, 104, // a.__h.length\n  38,  38, 108,  46, 112, 117, 115, 104,  40,  97,  41,  59, // &&l.push(a);\n  98, 114, 101,  97, 107,  32, 101, 125, 110, 117, 108, 108, // break e}null\n  33,  61,  97,  46,  99, 111, 109, 112, 111, 110, 101, 110, // !=a.componen\n 116,  87, 105, 108, 108,  85, 112, 100,  97, 116, 101,  38, // tWillUpdate&\n  38,  97,  46,  99, 111, 109, 112, 111, 110, 101, 110, 116, // &a.component\n  87, 105, 108, 108,  85, 112, 100,  97, 116, 101,  40,  98, // WillUpdate(b\n  44,  97,  46,  95,  95, 115,  44, 120,  41,  44, 110, 117, // ,a.__s,x),nu\n 108, 108,  33,  61,  97,  46,  99, 111, 109, 112, 111, 110, // ll!=a.compon\n 101, 110, 116,  68, 105, 100,  85, 112, 100,  97, 116, 101, // entDidUpdate\n  38,  38,  97,  46,  95,  95, 104,  46, 112, 117, 115, 104, // &&a.__h.push\n  40, 102, 117, 110,  99, 116, 105, 111, 110,  40,  41, 123, // (function(){\n  97,  46,  99, 111, 109, 112, 111, 110, 101, 110, 116,  68, // a.componentD\n 105, 100,  85, 112, 100,  97, 116, 101,  40, 118,  44, 121, // idUpdate(v,y\n  44, 109,  41, 125,  41, 125,  97,  46,  99, 111, 110, 116, // ,m)})}a.cont\n 101, 120, 116,  61, 120,  44,  97,  46, 112, 114, 111, 112, // ext=x,a.prop\n 115,  61,  98,  44,  97,  46, 115, 116,  97, 116, 101,  61, // s=b,a.state=\n  97,  46,  95,  95, 115,  44,  40, 102,  61, 110,  46,  95, // a.__s,(f=n._\n  95, 114,  41,  38,  38, 102,  40,  95,  41,  44,  97,  46, // _r)&&f(_),a.\n  95,  95, 100,  61,  33,  49,  44,  97,  46,  95,  95, 118, // __d=!1,a.__v\n  61,  95,  44,  97,  46,  95,  95,  80,  61, 101,  44, 102, // =_,a.__P=e,f\n  61,  97,  46, 114, 101, 110, 100, 101, 114,  40,  97,  46, // =a.render(a.\n 112, 114, 111, 112, 115,  44,  97,  46, 115, 116,  97, 116, // props,a.stat\n 101,  44,  97,  46,  99, 111, 110, 116, 101, 120, 116,  41, // e,a.context)\n  44,  97,  46, 115, 116,  97, 116, 101,  61,  97,  46,  95, // ,a.state=a._\n  95, 115,  44, 110, 117, 108, 108,  33,  61,  97,  46, 103, // _s,null!=a.g\n 101, 116,  67, 104, 105, 108, 100,  67, 111, 110, 116, 101, // etChildConte\n 120, 116,  38,  38,  40, 111,  61, 115,  40, 115,  40, 123, // xt&&(o=s(s({\n 125,  44, 111,  41,  44,  97,  46, 103, 101, 116,  67, 104, // },o),a.getCh\n 105, 108, 100,  67, 111, 110, 116, 101, 120, 116,  40,  41, // ildContext()\n  41,  41,  44, 112, 124, 124, 110, 117, 108, 108,  61,  61, // )),p||null==\n  97,  46, 103, 101, 116,  83, 110,  97, 112, 115, 104, 111, // a.getSnapsho\n 116,  66, 101, 102, 111, 114, 101,  85, 112, 100,  97, 116, // tBeforeUpdat\n 101, 124, 124,  40, 109,  61,  97,  46, 103, 101, 116,  83, // e||(m=a.getS\n 110,  97, 112, 115, 104, 111, 116,  66, 101, 102, 111, 114, // napshotBefor\n 101,  85, 112, 100,  97, 116, 101,  40, 118,  44, 121,  41, // eUpdate(v,y)\n  41,  44,  72,  61, 110, 117, 108, 108,  33,  61, 102,  38, // ),H=null!=f&\n  38, 102,  46, 116, 121, 112, 101,  61,  61,  61, 104,  38, // &f.type===h&\n  38, 110, 117, 108, 108,  61,  61, 102,  46, 107, 101, 121, // &null==f.key\n  63, 102,  46, 112, 114, 111, 112, 115,  46,  99, 104, 105, // ?f.props.chi\n 108, 100, 114, 101, 110,  58, 102,  44, 107,  40, 101,  44, // ldren:f,k(e,\n  65, 114, 114,  97, 121,  46, 105, 115,  65, 114, 114,  97, // Array.isArra\n 121,  40,  72,  41,  63,  72,  58,  91,  72,  93,  44,  95, // y(H)?H:[H],_\n  44, 116,  44, 111,  44, 114,  44, 117,  44, 108,  44, 105, // ,t,o,r,u,l,i\n  44,  99,  41,  44,  97,  46,  98,  97, 115, 101,  61,  95, // ,c),a.base=_\n  46,  95,  95, 101,  44,  95,  46,  95,  95, 104,  61, 110, // .__e,_.__h=n\n 117, 108, 108,  44,  97,  46,  95,  95, 104,  46, 108, 101, // ull,a.__h.le\n 110, 103, 116, 104,  38,  38, 108,  46, 112, 117, 115, 104, // ngth&&l.push\n  40,  97,  41,  44, 103,  38,  38,  40,  97,  46,  95,  95, // (a),g&&(a.__\n  69,  61,  97,  46,  95,  95,  61, 110, 117, 108, 108,  41, // E=a.__=null)\n  44,  97,  46,  95,  95, 101,  61,  33,  49, 125, 101, 108, // ,a.__e=!1}el\n 115, 101,  32, 110, 117, 108, 108,  61,  61, 117,  38,  38, // se null==u&&\n  95,  46,  95,  95, 118,  61,  61,  61, 116,  46,  95,  95, // _.__v===t.__\n 118,  63,  40,  95,  46,  95,  95, 107,  61, 116,  46,  95, // v?(_.__k=t._\n  95, 107,  44,  95,  46,  95,  95, 101,  61, 116,  46,  95, // _k,_.__e=t._\n  95, 101,  41,  58,  95,  46,  95,  95, 101,  61, 119,  40, // _e):_.__e=w(\n 116,  46,  95,  95, 101,  44,  95,  44, 116,  44, 111,  44, // t.__e,_,t,o,\n 114,  44, 117,  44, 108,  44,  99,  41,  59,  40, 102,  61, // r,u,l,c);(f=\n 110,  46, 100, 105, 102, 102, 101, 100,  41,  38,  38, 102, // n.diffed)&&f\n  40,  95,  41, 125,  99,  97, 116,  99, 104,  40, 101,  41, // (_)}catch(e)\n 123,  95,  46,  95,  95, 118,  61, 110, 117, 108, 108,  44, // {_.__v=null,\n  40,  99, 124, 124, 110, 117, 108, 108,  33,  61, 117,  41, // (c||null!=u)\n  38,  38,  40,  95,  46,  95,  95, 101,  61, 105,  44,  95, // &&(_.__e=i,_\n  46,  95,  95, 104,  61,  33,  33,  99,  44, 117,  91, 117, // .__h=!!c,u[u\n  46, 105, 110, 100, 101, 120,  79, 102,  40, 105,  41,  93, // .indexOf(i)]\n  61, 110, 117, 108, 108,  41,  44, 110,  46,  95,  95, 101, // =null),n.__e\n  40, 101,  44,  95,  44, 116,  41, 125, 125, 102, 117, 110, // (e,_,t)}}fun\n  99, 116, 105, 111, 110,  32,  68,  40, 101,  44,  95,  41, // ction D(e,_)\n 123, 110,  46,  95,  95,  99,  38,  38, 110,  46,  95,  95, // {n.__c&&n.__\n  99,  40,  95,  44, 101,  41,  44, 101,  46, 115, 111, 109, // c(_,e),e.som\n 101,  40, 102, 117, 110,  99, 116, 105, 111, 110,  40,  95, // e(function(_\n  41, 123, 116, 114, 121, 123, 101,  61,  95,  46,  95,  95, // ){try{e=_.__\n 104,  44,  95,  46,  95,  95, 104,  61,  91,  93,  44, 101, // h,_.__h=[],e\n  46, 115, 111, 109, 101,  40, 102, 117, 110,  99, 116, 105, // .some(functi\n 111, 110,  40, 101,  41, 123, 101,  46,  99,  97, 108, 108, // on(e){e.call\n  40,  95,  41, 125,  41, 125,  99,  97, 116,  99, 104,  40, // (_)})}catch(\n 101,  41, 123, 110,  46,  95,  95, 101,  40, 101,  44,  95, // e){n.__e(e,_\n  46,  95,  95, 118,  41, 125, 125,  41, 125, 102, 117, 110, // .__v)}})}fun\n  99, 116, 105, 111, 110,  32, 119,  40, 110,  44,  95,  44, // ction w(n,_,\n 116,  44, 111,  44, 114,  44, 117,  44, 105,  44,  99,  41, // t,o,r,u,i,c)\n 123, 118,  97, 114,  32, 115,  44,  97,  44, 112,  44, 104, // {var s,a,p,h\n  61, 116,  46, 112, 114, 111, 112, 115,  44, 100,  61,  95, // =t.props,d=_\n  46, 112, 114, 111, 112, 115,  44, 121,  61,  95,  46, 116, // .props,y=_.t\n 121, 112, 101,  44, 109,  61,  48,  59, 105, 102,  40,  34, // ype,m=0;if(\"\n 115, 118, 103,  34,  61,  61,  61, 121,  38,  38,  40, 114, // svg\"===y&&(r\n  61,  33,  48,  41,  44, 110, 117, 108, 108,  33,  61, 117, // =!0),null!=u\n  41, 102, 111, 114,  40,  59, 109,  60, 117,  46, 108, 101, // )for(;m<u.le\n 110, 103, 116, 104,  59, 109,  43,  43,  41, 105, 102,  40, // ngth;m++)if(\n  40, 115,  61, 117,  91, 109,  93,  41,  38,  38,  40, 115, // (s=u[m])&&(s\n  61,  61,  61, 110, 124, 124,  40, 121,  63, 115,  46, 108, // ===n||(y?s.l\n 111,  99,  97, 108,  78,  97, 109, 101,  61,  61, 121,  58, // ocalName==y:\n  51,  61,  61, 115,  46, 110, 111, 100, 101,  84, 121, 112, // 3==s.nodeTyp\n 101,  41,  41,  41, 123, 110,  61, 115,  44, 117,  91, 109, // e))){n=s,u[m\n  93,  61, 110, 117, 108, 108,  59,  98, 114, 101,  97, 107, // ]=null;break\n 125, 105, 102,  40, 110, 117, 108, 108,  61,  61, 110,  41, // }if(null==n)\n 123, 105, 102,  40, 110, 117, 108, 108,  61,  61,  61, 121, // {if(null===y\n  41, 114, 101, 116, 117, 114, 110,  32, 100, 111,  99, 117, // )return docu\n 109, 101, 110, 116,  46,  99, 114, 101,  97, 116, 101,  84, // ment.createT\n 101, 120, 116,  78, 111, 100, 101,  40, 100,  41,  59, 110, // extNode(d);n\n  61, 114,  63, 100, 111,  99, 117, 109, 101, 110, 116,  46, // =r?document.\n  99, 114, 101,  97, 116, 101,  69, 108, 101, 109, 101, 110, // createElemen\n 116,  78,  83,  40,  34, 104, 116, 116, 112,  58,  47,  47, // tNS(\"http://\n 119, 119, 119,  46, 119,  51,  46, 111, 114, 103,  47,  50, // www.w3.org/2\n  48,  48,  48,  47, 115, 118, 103,  34,  44, 121,  41,  58, // 000/svg\",y):\n 100, 111,  99, 117, 109, 101, 110, 116,  46,  99, 114, 101, // document.cre\n  97, 116, 101,  69, 108, 101, 109, 101, 110, 116,  40, 121, // ateElement(y\n  44, 100,  46, 105, 115,  38,  38, 100,  41,  44, 117,  61, // ,d.is&&d),u=\n 110, 117, 108, 108,  44,  99,  61,  33,  49, 125, 105, 102, // null,c=!1}if\n  40, 110, 117, 108, 108,  61,  61,  61, 121,  41, 104,  61, // (null===y)h=\n  61,  61, 100, 124, 124,  99,  38,  38, 110,  46, 100,  97, // ==d||c&&n.da\n 116,  97,  61,  61,  61, 100, 124, 124,  40, 110,  46, 100, // ta===d||(n.d\n  97, 116,  97,  61, 100,  41,  59, 101, 108, 115, 101, 123, // ata=d);else{\n 105, 102,  40, 117,  61, 117,  38,  38, 101,  46,  99,  97, // if(u=u&&e.ca\n 108, 108,  40, 110,  46,  99, 104, 105, 108, 100,  78, 111, // ll(n.childNo\n 100, 101, 115,  41,  44,  97,  61,  40, 104,  61, 116,  46, // des),a=(h=t.\n 112, 114, 111, 112, 115, 124, 124, 108,  41,  46, 100,  97, // props||l).da\n 110, 103, 101, 114, 111, 117, 115, 108, 121,  83, 101, 116, // ngerouslySet\n  73, 110, 110, 101, 114,  72,  84,  77,  76,  44, 112,  61, // InnerHTML,p=\n 100,  46, 100,  97, 110, 103, 101, 114, 111, 117, 115, 108, // d.dangerousl\n 121,  83, 101, 116,  73, 110, 110, 101, 114,  72,  84,  77, // ySetInnerHTM\n  76,  44,  33,  99,  41, 123, 105, 102,  40, 110, 117, 108, // L,!c){if(nul\n 108,  33,  61, 117,  41, 102, 111, 114,  40, 104,  61, 123, // l!=u)for(h={\n 125,  44, 109,  61,  48,  59, 109,  60, 110,  46,  97, 116, // },m=0;m<n.at\n 116, 114, 105,  98, 117, 116, 101, 115,  46, 108, 101, 110, // tributes.len\n 103, 116, 104,  59, 109,  43,  43,  41, 104,  91, 110,  46, // gth;m++)h[n.\n  97, 116, 116, 114, 105,  98, 117, 116, 101, 115,  91, 109, // attributes[m\n  93,  46, 110,  97, 109, 101,  93,  61, 110,  46,  97, 116, // ].name]=n.at\n 116, 114, 105,  98, 117, 116, 101, 115,  91, 109,  93,  46, // tributes[m].\n 118,  97, 108, 117, 101,  59,  40, 112, 124, 124,  97,  41, // value;(p||a)\n  38,  38,  40, 112,  38,  38,  40,  97,  38,  38, 112,  46, // &&(p&&(a&&p.\n  95,  95, 104, 116, 109, 108,  61,  61,  97,  46,  95,  95, // __html==a.__\n 104, 116, 109, 108, 124, 124, 112,  46,  95,  95, 104, 116, // html||p.__ht\n 109, 108,  61,  61,  61, 110,  46, 105, 110, 110, 101, 114, // ml===n.inner\n  72,  84,  77,  76,  41, 124, 124,  40, 110,  46, 105, 110, // HTML)||(n.in\n 110, 101, 114,  72,  84,  77,  76,  61, 112,  38,  38, 112, // nerHTML=p&&p\n  46,  95,  95, 104, 116, 109, 108, 124, 124,  34,  34,  41, // .__html||\"\")\n  41, 125, 105, 102,  40, 102, 117, 110,  99, 116, 105, 111, // )}if(functio\n 110,  40, 101,  44, 110,  44,  95,  44, 116,  44, 111,  41, // n(e,n,_,t,o)\n 123, 118,  97, 114,  32, 114,  59, 102, 111, 114,  40, 114, // {var r;for(r\n  32, 105, 110,  32,  95,  41,  34,  99, 104, 105, 108, 100, //  in _)\"child\n 114, 101, 110,  34,  61,  61,  61, 114, 124, 124,  34, 107, // ren\"===r||\"k\n 101, 121,  34,  61,  61,  61, 114, 124, 124, 114,  32, 105, // ey\"===r||r i\n 110,  32, 110, 124, 124,  72,  40, 101,  44, 114,  44, 110, // n n||H(e,r,n\n 117, 108, 108,  44,  95,  91, 114,  93,  44, 116,  41,  59, // ull,_[r],t);\n 102, 111, 114,  40, 114,  32, 105, 110,  32, 110,  41, 111, // for(r in n)o\n  38,  38,  34, 102, 117, 110,  99, 116, 105, 111, 110,  34, // &&\"function\"\n  33,  61, 116, 121, 112, 101, 111, 102,  32, 110,  91, 114, // !=typeof n[r\n  93, 124, 124,  34,  99, 104, 105, 108, 100, 114, 101, 110, // ]||\"children\n  34,  61,  61,  61, 114, 124, 124,  34, 107, 101, 121,  34, // \"===r||\"key\"\n  61,  61,  61, 114, 124, 124,  34, 118,  97, 108, 117, 101, // ===r||\"value\n  34,  61,  61,  61, 114, 124, 124,  34,  99, 104, 101,  99, // \"===r||\"chec\n 107, 101, 100,  34,  61,  61,  61, 114, 124, 124,  95,  91, // ked\"===r||_[\n 114,  93,  61,  61,  61, 110,  91, 114,  93, 124, 124,  72, // r]===n[r]||H\n  40, 101,  44, 114,  44, 110,  91, 114,  93,  44,  95,  91, // (e,r,n[r],_[\n 114,  93,  44, 116,  41, 125,  40, 110,  44, 100,  44, 104, // r],t)}(n,d,h\n  44, 114,  44,  99,  41,  44, 112,  41,  95,  46,  95,  95, // ,r,c),p)_.__\n 107,  61,  91,  93,  59, 101, 108, 115, 101,  32, 105, 102, // k=[];else if\n  40, 109,  61,  95,  46, 112, 114, 111, 112, 115,  46,  99, // (m=_.props.c\n 104, 105, 108, 100, 114, 101, 110,  44, 107,  40, 110,  44, // hildren,k(n,\n  65, 114, 114,  97, 121,  46, 105, 115,  65, 114, 114,  97, // Array.isArra\n 121,  40, 109,  41,  63, 109,  58,  91, 109,  93,  44,  95, // y(m)?m:[m],_\n  44, 116,  44, 111,  44, 114,  38,  38,  34, 102, 111, 114, // ,t,o,r&&\"for\n 101, 105, 103, 110,  79,  98, 106, 101,  99, 116,  34,  33, // eignObject\"!\n  61,  61, 121,  44, 117,  44, 105,  44, 117,  63, 117,  91, // ==y,u,i,u?u[\n  48,  93,  58, 116,  46,  95,  95, 107,  38,  38, 118,  40, // 0]:t.__k&&v(\n 116,  44,  48,  41,  44,  99,  41,  44, 110, 117, 108, 108, // t,0),c),null\n  33,  61, 117,  41, 102, 111, 114,  40, 109,  61, 117,  46, // !=u)for(m=u.\n 108, 101, 110, 103, 116, 104,  59, 109,  45,  45,  59,  41, // length;m--;)\n 110, 117, 108, 108,  33,  61, 117,  91, 109,  93,  38,  38, // null!=u[m]&&\n 102,  40, 117,  91, 109,  93,  41,  59,  99, 124, 124,  40, // f(u[m]);c||(\n  34, 118,  97, 108, 117, 101,  34, 105, 110,  32, 100,  38, // \"value\"in d&\n  38, 118, 111, 105, 100,  32,  48,  33,  61,  61,  40, 109, // &void 0!==(m\n  61, 100,  46, 118,  97, 108, 117, 101,  41,  38,  38,  40, // =d.value)&&(\n 109,  33,  61,  61, 110,  46, 118,  97, 108, 117, 101, 124, // m!==n.value|\n 124,  34, 112, 114, 111, 103, 114, 101, 115, 115,  34,  61, // |\"progress\"=\n  61,  61, 121,  38,  38,  33, 109,  41,  38,  38,  72,  40, // ==y&&!m)&&H(\n 110,  44,  34, 118,  97, 108, 117, 101,  34,  44, 109,  44, // n,\"value\",m,\n 104,  46, 118,  97, 108, 117, 101,  44,  33,  49,  41,  44, // h.value,!1),\n  34,  99, 104, 101,  99, 107, 101, 100,  34, 105, 110,  32, // \"checked\"in \n 100,  38,  38, 118, 111, 105, 100,  32,  48,  33,  61,  61, // d&&void 0!==\n  40, 109,  61, 100,  46,  99, 104, 101,  99, 107, 101, 100, // (m=d.checked\n  41,  38,  38, 109,  33,  61,  61, 110,  46,  99, 104, 101, // )&&m!==n.che\n  99, 107, 101, 100,  38,  38,  72,  40, 110,  44,  34,  99, // cked&&H(n,\"c\n 104, 101,  99, 107, 101, 100,  34,  44, 109,  44, 104,  46, // hecked\",m,h.\n  99, 104, 101,  99, 107, 101, 100,  44,  33,  49,  41,  41, // checked,!1))\n 125, 114, 101, 116, 117, 114, 110,  32, 110, 125, 102, 117, // }return n}fu\n 110,  99, 116, 105, 111, 110,  32,  84,  40, 101,  44,  95, // nction T(e,_\n  44, 116,  41, 123, 116, 114, 121, 123,  34, 102, 117, 110, // ,t){try{\"fun\n  99, 116, 105, 111, 110,  34,  61,  61, 116, 121, 112, 101, // ction\"==type\n 111, 102,  32, 101,  63, 101,  40,  95,  41,  58, 101,  46, // of e?e(_):e.\n  99, 117, 114, 114, 101, 110, 116,  61,  95, 125,  99,  97, // current=_}ca\n 116,  99, 104,  40, 101,  41, 123, 110,  46,  95,  95, 101, // tch(e){n.__e\n  40, 101,  44, 116,  41, 125, 125, 102, 117, 110,  99, 116, // (e,t)}}funct\n 105, 111, 110,  32,  85,  40, 101,  44,  95,  44, 116,  41, // ion U(e,_,t)\n 123, 118,  97, 114,  32, 111,  44, 114,  59, 105, 102,  40, // {var o,r;if(\n 110,  46, 117, 110, 109, 111, 117, 110, 116,  38,  38, 110, // n.unmount&&n\n  46, 117, 110, 109, 111, 117, 110, 116,  40, 101,  41,  44, // .unmount(e),\n  40, 111,  61, 101,  46, 114, 101, 102,  41,  38,  38,  40, // (o=e.ref)&&(\n 111,  46,  99, 117, 114, 114, 101, 110, 116,  38,  38, 111, // o.current&&o\n  46,  99, 117, 114, 114, 101, 110, 116,  33,  61,  61, 101, // .current!==e\n  46,  95,  95, 101, 124, 124,  84,  40, 111,  44, 110, 117, // .__e||T(o,nu\n 108, 108,  44,  95,  41,  41,  44, 110, 117, 108, 108,  33, // ll,_)),null!\n  61,  40, 111,  61, 101,  46,  95,  95,  99,  41,  41, 123, // =(o=e.__c)){\n 105, 102,  40, 111,  46,  99, 111, 109, 112, 111, 110, 101, // if(o.compone\n 110, 116,  87, 105, 108, 108,  85, 110, 109, 111, 117, 110, // ntWillUnmoun\n 116,  41, 116, 114, 121, 123, 111,  46,  99, 111, 109, 112, // t)try{o.comp\n 111, 110, 101, 110, 116,  87, 105, 108, 108,  85, 110, 109, // onentWillUnm\n 111, 117, 110, 116,  40,  41, 125,  99,  97, 116,  99, 104, // ount()}catch\n  40, 101,  41, 123, 110,  46,  95,  95, 101,  40, 101,  44, // (e){n.__e(e,\n  95,  41, 125, 111,  46,  98,  97, 115, 101,  61, 111,  46, // _)}o.base=o.\n  95,  95,  80,  61, 110, 117, 108, 108, 125, 105, 102,  40, // __P=null}if(\n 111,  61, 101,  46,  95,  95, 107,  41, 102, 111, 114,  40, // o=e.__k)for(\n 114,  61,  48,  59, 114,  60, 111,  46, 108, 101, 110, 103, // r=0;r<o.leng\n 116, 104,  59, 114,  43,  43,  41, 111,  91, 114,  93,  38, // th;r++)o[r]&\n  38,  85,  40, 111,  91, 114,  93,  44,  95,  44,  34, 102, // &U(o[r],_,\"f\n 117, 110,  99, 116, 105, 111, 110,  34,  33,  61, 116, 121, // unction\"!=ty\n 112, 101, 111, 102,  32, 101,  46, 116, 121, 112, 101,  41, // peof e.type)\n  59, 116, 124, 124, 110, 117, 108, 108,  61,  61, 101,  46, // ;t||null==e.\n  95,  95, 101, 124, 124, 102,  40, 101,  46,  95,  95, 101, // __e||f(e.__e\n  41,  44, 101,  46,  95,  95, 101,  61, 101,  46,  95,  95, // ),e.__e=e.__\n 100,  61, 118, 111, 105, 100,  32,  48, 125, 102, 117, 110, // d=void 0}fun\n  99, 116, 105, 111, 110,  32,  65,  40, 101,  44, 110,  44, // ction A(e,n,\n  95,  41, 123, 114, 101, 116, 117, 114, 110,  32, 116, 104, // _){return th\n 105, 115,  46,  99, 111, 110, 115, 116, 114, 117,  99, 116, // is.construct\n 111, 114,  40, 101,  44,  95,  41, 125, 102, 117, 110,  99, // or(e,_)}func\n 116, 105, 111, 110,  32,  77,  40,  95,  44, 116,  44, 111, // tion M(_,t,o\n  41, 123, 118,  97, 114,  32, 114,  44, 117,  44, 105,  59, // ){var r,u,i;\n 110,  46,  95,  95,  38,  38, 110,  46,  95,  95,  40,  95, // n.__&&n.__(_\n  44, 116,  41,  44, 117,  61,  40, 114,  61,  34, 102, 117, // ,t),u=(r=\"fu\n 110,  99, 116, 105, 111, 110,  34,  61,  61, 116, 121, 112, // nction\"==typ\n 101, 111, 102,  32, 111,  41,  63, 110, 117, 108, 108,  58, // eof o)?null:\n 111,  38,  38, 111,  46,  95,  95, 107, 124, 124, 116,  46, // o&&o.__k||t.\n  95,  95, 107,  44, 105,  61,  91,  93,  44,  80,  40, 116, // __k,i=[],P(t\n  44,  95,  61,  40,  33, 114,  38,  38, 111, 124, 124, 116, // ,_=(!r&&o||t\n  41,  46,  95,  95, 107,  61,  97,  40, 104,  44, 110, 117, // ).__k=a(h,nu\n 108, 108,  44,  91,  95,  93,  41,  44, 117, 124, 124, 108, // ll,[_]),u||l\n  44, 108,  44, 118, 111, 105, 100,  32,  48,  33,  61,  61, // ,l,void 0!==\n 116,  46, 111, 119, 110, 101, 114,  83,  86,  71,  69, 108, // t.ownerSVGEl\n 101, 109, 101, 110, 116,  44,  33, 114,  38,  38, 111,  63, // ement,!r&&o?\n  91, 111,  93,  58, 117,  63, 110, 117, 108, 108,  58, 116, // [o]:u?null:t\n  46, 102, 105, 114, 115, 116,  67, 104, 105, 108, 100,  63, // .firstChild?\n 101,  46,  99,  97, 108, 108,  40, 116,  46,  99, 104, 105, // e.call(t.chi\n 108, 100,  78, 111, 100, 101, 115,  41,  58, 110, 117, 108, // ldNodes):nul\n 108,  44, 105,  44,  33, 114,  38,  38, 111,  63, 111,  58, // l,i,!r&&o?o:\n 117,  63, 117,  46,  95,  95, 101,  58, 116,  46, 102, 105, // u?u.__e:t.fi\n 114, 115, 116,  67, 104, 105, 108, 100,  44, 114,  41,  44, // rstChild,r),\n  68,  40, 105,  44,  95,  41, 125, 102, 117, 110,  99, 116, // D(i,_)}funct\n 105, 111, 110,  32,  70,  40, 101,  44, 110,  41, 123, 118, // ion F(e,n){v\n  97, 114,  32,  95,  61, 123,  95,  95,  99,  58, 110,  61, // ar _={__c:n=\n  34,  95,  95,  99,  67,  34,  43, 117,  43,  43,  44,  95, // \"__cC\"+u++,_\n  95,  58, 101,  44,  67, 111, 110, 115, 117, 109, 101, 114, // _:e,Consumer\n  58, 102, 117, 110,  99, 116, 105, 111, 110,  40, 101,  44, // :function(e,\n 110,  41, 123, 114, 101, 116, 117, 114, 110,  32, 101,  46, // n){return e.\n  99, 104, 105, 108, 100, 114, 101, 110,  40, 110,  41, 125, // children(n)}\n  44,  80, 114, 111, 118, 105, 100, 101, 114,  58, 102, 117, // ,Provider:fu\n 110,  99, 116, 105, 111, 110,  40, 101,  41, 123, 118,  97, // nction(e){va\n 114,  32,  95,  44, 116,  59, 114, 101, 116, 117, 114, 110, // r _,t;return\n  32, 116, 104, 105, 115,  46, 103, 101, 116,  67, 104, 105, //  this.getChi\n 108, 100,  67, 111, 110, 116, 101, 120, 116, 124, 124,  40, // ldContext||(\n  95,  61,  91,  93,  44,  40, 116,  61, 123, 125,  41,  91, // _=[],(t={})[\n 110,  93,  61, 116, 104, 105, 115,  44, 116, 104, 105, 115, // n]=this,this\n  46, 103, 101, 116,  67, 104, 105, 108, 100,  67, 111, 110, // .getChildCon\n 116, 101, 120, 116,  61, 102, 117, 110,  99, 116, 105, 111, // text=functio\n 110,  40,  41, 123, 114, 101, 116, 117, 114, 110,  32, 116, // n(){return t\n 125,  44, 116, 104, 105, 115,  46, 115, 104, 111, 117, 108, // },this.shoul\n 100,  67, 111, 109, 112, 111, 110, 101, 110, 116,  85, 112, // dComponentUp\n 100,  97, 116, 101,  61, 102, 117, 110,  99, 116, 105, 111, // date=functio\n 110,  40, 101,  41, 123, 116, 104, 105, 115,  46, 112, 114, // n(e){this.pr\n 111, 112, 115,  46, 118,  97, 108, 117, 101,  33,  61,  61, // ops.value!==\n 101,  46, 118,  97, 108, 117, 101,  38,  38,  95,  46, 115, // e.value&&_.s\n 111, 109, 101,  40, 109,  41, 125,  44, 116, 104, 105, 115, // ome(m)},this\n  46, 115, 117,  98,  61, 102, 117, 110,  99, 116, 105, 111, // .sub=functio\n 110,  40, 101,  41, 123,  95,  46, 112, 117, 115, 104,  40, // n(e){_.push(\n 101,  41,  59, 118,  97, 114,  32, 110,  61, 101,  46,  99, // e);var n=e.c\n 111, 109, 112, 111, 110, 101, 110, 116,  87, 105, 108, 108, // omponentWill\n  85, 110, 109, 111, 117, 110, 116,  59, 101,  46,  99, 111, // Unmount;e.co\n 109, 112, 111, 110, 101, 110, 116,  87, 105, 108, 108,  85, // mponentWillU\n 110, 109, 111, 117, 110, 116,  61, 102, 117, 110,  99, 116, // nmount=funct\n 105, 111, 110,  40,  41, 123,  95,  46, 115, 112, 108, 105, // ion(){_.spli\n  99, 101,  40,  95,  46, 105, 110, 100, 101, 120,  79, 102, // ce(_.indexOf\n  40, 101,  41,  44,  49,  41,  44, 110,  38,  38, 110,  46, // (e),1),n&&n.\n  99,  97, 108, 108,  40, 101,  41, 125, 125,  41,  44, 101, // call(e)}}),e\n  46,  99, 104, 105, 108, 100, 114, 101, 110, 125, 125,  59, // .children}};\n 114, 101, 116, 117, 114, 110,  32,  95,  46,  80, 114, 111, // return _.Pro\n 118, 105, 100, 101, 114,  46,  95,  95,  61,  95,  46,  67, // vider.__=_.C\n 111, 110, 115, 117, 109, 101, 114,  46,  99, 111, 110, 116, // onsumer.cont\n 101, 120, 116,  84, 121, 112, 101,  61,  95, 125, 101,  61, // extType=_}e=\n 105,  46, 115, 108, 105,  99, 101,  44, 110,  61, 123,  95, // i.slice,n={_\n  95, 101,  58, 102, 117, 110,  99, 116, 105, 111, 110,  40, // _e:function(\n 101,  44, 110,  41, 123, 102, 111, 114,  40, 118,  97, 114, // e,n){for(var\n  32,  95,  44, 116,  44, 111,  59, 110,  61, 110,  46,  95, //  _,t,o;n=n._\n  95,  59,  41, 105, 102,  40,  40,  95,  61, 110,  46,  95, // _;)if((_=n._\n  95,  99,  41,  38,  38,  33,  95,  46,  95,  95,  41, 116, // _c)&&!_.__)t\n 114, 121, 123, 105, 102,  40,  40, 116,  61,  95,  46,  99, // ry{if((t=_.c\n 111, 110, 115, 116, 114, 117,  99, 116, 111, 114,  41,  38, // onstructor)&\n  38, 110, 117, 108, 108,  33,  61, 116,  46, 103, 101, 116, // &null!=t.get\n  68, 101, 114, 105, 118, 101, 100,  83, 116,  97, 116, 101, // DerivedState\n  70, 114, 111, 109,  69, 114, 114, 111, 114,  38,  38,  40, // FromError&&(\n  95,  46, 115, 101, 116,  83, 116,  97, 116, 101,  40, 116, // _.setState(t\n  46, 103, 101, 116,  68, 101, 114, 105, 118, 101, 100,  83, // .getDerivedS\n 116,  97, 116, 101,  70, 114, 111, 109,  69, 114, 114, 111, // tateFromErro\n 114,  40, 101,  41,  41,  44, 111,  61,  95,  46,  95,  95, // r(e)),o=_.__\n 100,  41,  44, 110, 117, 108, 108,  33,  61,  95,  46,  99, // d),null!=_.c\n 111, 109, 112, 111, 110, 101, 110, 116,  68, 105, 100,  67, // omponentDidC\n  97, 116,  99, 104,  38,  38,  40,  95,  46,  99, 111, 109, // atch&&(_.com\n 112, 111, 110, 101, 110, 116,  68, 105, 100,  67,  97, 116, // ponentDidCat\n  99, 104,  40, 101,  41,  44, 111,  61,  95,  46,  95,  95, // ch(e),o=_.__\n 100,  41,  44, 111,  41, 114, 101, 116, 117, 114, 110,  32, // d),o)return \n  95,  46,  95,  95,  69,  61,  95, 125,  99,  97, 116,  99, // _.__E=_}catc\n 104,  40, 110,  41, 123, 101,  61, 110, 125, 116, 104, 114, // h(n){e=n}thr\n 111, 119,  32, 101, 125, 125,  44,  95,  61,  48,  44, 100, // ow e}},_=0,d\n  46, 112, 114, 111, 116, 111, 116, 121, 112, 101,  46, 115, // .prototype.s\n 101, 116,  83, 116,  97, 116, 101,  61, 102, 117, 110,  99, // etState=func\n 116, 105, 111, 110,  40, 101,  44, 110,  41, 123, 118,  97, // tion(e,n){va\n 114,  32,  95,  59,  95,  61, 110, 117, 108, 108,  33,  61, // r _;_=null!=\n 116, 104, 105, 115,  46,  95,  95, 115,  38,  38, 116, 104, // this.__s&&th\n 105, 115,  46,  95,  95, 115,  33,  61,  61, 116, 104, 105, // is.__s!==thi\n 115,  46, 115, 116,  97, 116, 101,  63, 116, 104, 105, 115, // s.state?this\n  46,  95,  95, 115,  58, 116, 104, 105, 115,  46,  95,  95, // .__s:this.__\n 115,  61, 115,  40, 123, 125,  44, 116, 104, 105, 115,  46, // s=s({},this.\n 115, 116,  97, 116, 101,  41,  44,  34, 102, 117, 110,  99, // state),\"func\n 116, 105, 111, 110,  34,  61,  61, 116, 121, 112, 101, 111, // tion\"==typeo\n 102,  32, 101,  38,  38,  40, 101,  61, 101,  40, 115,  40, // f e&&(e=e(s(\n 123, 125,  44,  95,  41,  44, 116, 104, 105, 115,  46, 112, // {},_),this.p\n 114, 111, 112, 115,  41,  41,  44, 101,  38,  38, 115,  40, // rops)),e&&s(\n  95,  44, 101,  41,  44, 110, 117, 108, 108,  33,  61, 101, // _,e),null!=e\n  38,  38, 116, 104, 105, 115,  46,  95,  95, 118,  38,  38, // &&this.__v&&\n  40, 110,  38,  38, 116, 104, 105, 115,  46,  95,  95, 104, // (n&&this.__h\n  46, 112, 117, 115, 104,  40, 110,  41,  44, 109,  40, 116, // .push(n),m(t\n 104, 105, 115,  41,  41, 125,  44, 100,  46, 112, 114, 111, // his))},d.pro\n 116, 111, 116, 121, 112, 101,  46, 102, 111, 114,  99, 101, // totype.force\n  85, 112, 100,  97, 116, 101,  61, 102, 117, 110,  99, 116, // Update=funct\n 105, 111, 110,  40, 101,  41, 123, 116, 104, 105, 115,  46, // ion(e){this.\n  95,  95, 118,  38,  38,  40, 116, 104, 105, 115,  46,  95, // __v&&(this._\n  95, 101,  61,  33,  48,  44, 101,  38,  38, 116, 104, 105, // _e=!0,e&&thi\n 115,  46,  95,  95, 104,  46, 112, 117, 115, 104,  40, 101, // s.__h.push(e\n  41,  44, 109,  40, 116, 104, 105, 115,  41,  41, 125,  44, // ),m(this))},\n 100,  46, 112, 114, 111, 116, 111, 116, 121, 112, 101,  46, // d.prototype.\n 114, 101, 110, 100, 101, 114,  61, 104,  44, 116,  61,  91, // render=h,t=[\n  93,  44, 111,  61,  34, 102, 117, 110,  99, 116, 105, 111, // ],o=\"functio\n 110,  34,  61,  61, 116, 121, 112, 101, 111, 102,  32,  80, // n\"==typeof P\n 114, 111, 109, 105, 115, 101,  63,  80, 114, 111, 109, 105, // romise?Promi\n 115, 101,  46, 112, 114, 111, 116, 111, 116, 121, 112, 101, // se.prototype\n  46, 116, 104, 101, 110,  46,  98, 105, 110, 100,  40,  80, // .then.bind(P\n 114, 111, 109, 105, 115, 101,  46, 114, 101, 115, 111, 108, // romise.resol\n 118, 101,  40,  41,  41,  58, 115, 101, 116,  84, 105, 109, // ve()):setTim\n 101, 111, 117, 116,  44, 103,  46,  95,  95, 114,  61,  48, // eout,g.__r=0\n  44, 117,  61,  48,  59, 118,  97, 114,  32,  76,  44,  78, // ,u=0;var L,N\n  44,  87,  44,  82,  61,  48,  44,  73,  61,  91,  93,  44, // ,W,R=0,I=[],\n  79,  61, 110,  46,  95,  95,  98,  44,  86,  61, 110,  46, // O=n.__b,V=n.\n  95,  95, 114,  44, 113,  61, 110,  46, 100, 105, 102, 102, // __r,q=n.diff\n 101, 100,  44,  66,  61, 110,  46,  95,  95,  99,  44,  36, // ed,B=n.__c,$\n  61, 110,  46, 117, 110, 109, 111, 117, 110, 116,  59, 102, // =n.unmount;f\n 117, 110,  99, 116, 105, 111, 110,  32, 106,  40, 101,  44, // unction j(e,\n  95,  41, 123, 110,  46,  95,  95, 104,  38,  38, 110,  46, // _){n.__h&&n.\n  95,  95, 104,  40,  78,  44, 101,  44,  82, 124, 124,  95, // __h(N,e,R||_\n  41,  44,  82,  61,  48,  59, 118,  97, 114,  32, 116,  61, // ),R=0;var t=\n  78,  46,  95,  95,  72, 124, 124,  40,  78,  46,  95,  95, // N.__H||(N.__\n  72,  61, 123,  95,  95,  58,  91,  93,  44,  95,  95, 104, // H={__:[],__h\n  58,  91,  93, 125,  41,  59, 114, 101, 116, 117, 114, 110, // :[]});return\n  32, 101,  62,  61, 116,  46,  95,  95,  46, 108, 101, 110, //  e>=t.__.len\n 103, 116, 104,  38,  38, 116,  46,  95,  95,  46, 112, 117, // gth&&t.__.pu\n 115, 104,  40, 123, 125,  41,  44, 116,  46,  95,  95,  91, // sh({}),t.__[\n 101,  93, 125, 102, 117, 110,  99, 116, 105, 111, 110,  32, // e]}function \n  71,  40, 101,  41, 123, 114, 101, 116, 117, 114, 110,  32, // G(e){return \n  82,  61,  49,  44, 122,  40, 105, 101,  44, 101,  41, 125, // R=1,z(ie,e)}\n 102, 117, 110,  99, 116, 105, 111, 110,  32, 122,  40, 101, // function z(e\n  44, 110,  44,  95,  41, 123, 118,  97, 114,  32, 116,  61, // ,n,_){var t=\n 106,  40,  76,  43,  43,  44,  50,  41,  59, 114, 101, 116, // j(L++,2);ret\n 117, 114, 110,  32, 116,  46, 116,  61, 101,  44, 116,  46, // urn t.t=e,t.\n  95,  95,  99, 124, 124,  40, 116,  46,  95,  95,  61,  91, // __c||(t.__=[\n  95,  63,  95,  40, 110,  41,  58, 105, 101,  40, 118, 111, // _?_(n):ie(vo\n 105, 100,  32,  48,  44, 110,  41,  44, 102, 117, 110,  99, // id 0,n),func\n 116, 105, 111, 110,  40, 101,  41, 123, 118,  97, 114,  32, // tion(e){var \n 110,  61, 116,  46, 116,  40, 116,  46,  95,  95,  91,  48, // n=t.t(t.__[0\n  93,  44, 101,  41,  59, 116,  46,  95,  95,  91,  48,  93, // ],e);t.__[0]\n  33,  61,  61, 110,  38,  38,  40, 116,  46,  95,  95,  61, // !==n&&(t.__=\n  91, 110,  44, 116,  46,  95,  95,  91,  49,  93,  93,  44, // [n,t.__[1]],\n 116,  46,  95,  95,  99,  46, 115, 101, 116,  83, 116,  97, // t.__c.setSta\n 116, 101,  40, 123, 125,  41,  41, 125,  93,  44, 116,  46, // te({}))}],t.\n  95,  95,  99,  61,  78,  41,  44, 116,  46,  95,  95, 125, // __c=N),t.__}\n 102, 117, 110,  99, 116, 105, 111, 110,  32,  74,  40, 101, // function J(e\n  44,  95,  41, 123, 118,  97, 114,  32, 116,  61, 106,  40, // ,_){var t=j(\n  76,  43,  43,  44,  51,  41,  59,  33, 110,  46,  95,  95, // L++,3);!n.__\n 115,  38,  38, 108, 101,  40, 116,  46,  95,  95,  72,  44, // s&&le(t.__H,\n  95,  41,  38,  38,  40, 116,  46,  95,  95,  61, 101,  44, // _)&&(t.__=e,\n 116,  46,  95,  95,  72,  61,  95,  44,  78,  46,  95,  95, // t.__H=_,N.__\n  72,  46,  95,  95, 104,  46, 112, 117, 115, 104,  40, 116, // H.__h.push(t\n  41,  41, 125, 102, 117, 110,  99, 116, 105, 111, 110,  32, // ))}function \n  75,  40, 101,  44,  95,  41, 123, 118,  97, 114,  32, 116, // K(e,_){var t\n  61, 106,  40,  76,  43,  43,  44,  52,  41,  59,  33, 110, // =j(L++,4);!n\n  46,  95,  95, 115,  38,  38, 108, 101,  40, 116,  46,  95, // .__s&&le(t._\n  95,  72,  44,  95,  41,  38,  38,  40, 116,  46,  95,  95, // _H,_)&&(t.__\n  61, 101,  44, 116,  46,  95,  95,  72,  61,  95,  44,  78, // =e,t.__H=_,N\n  46,  95,  95, 104,  46, 112, 117, 115, 104,  40, 116,  41, // .__h.push(t)\n  41, 125, 102, 117, 110,  99, 116, 105, 111, 110,  32,  81, // )}function Q\n  40, 101,  41, 123, 114, 101, 116, 117, 114, 110,  32,  82, // (e){return R\n  61,  53,  44,  89,  40, 102, 117, 110,  99, 116, 105, 111, // =5,Y(functio\n 110,  40,  41, 123, 114, 101, 116, 117, 114, 110, 123,  99, // n(){return{c\n 117, 114, 114, 101, 110, 116,  58, 101, 125, 125,  44,  91, // urrent:e}},[\n  93,  41, 125, 102, 117, 110,  99, 116, 105, 111, 110,  32, // ])}function \n  88,  40, 101,  44, 110,  44,  95,  41, 123,  82,  61,  54, // X(e,n,_){R=6\n  44,  75,  40, 102, 117, 110,  99, 116, 105, 111, 110,  40, // ,K(function(\n  41, 123,  34, 102, 117, 110,  99, 116, 105, 111, 110,  34, // ){\"function\"\n  61,  61, 116, 121, 112, 101, 111, 102,  32, 101,  63, 101, // ==typeof e?e\n  40, 110,  40,  41,  41,  58, 101,  38,  38,  40, 101,  46, // (n()):e&&(e.\n  99, 117, 114, 114, 101, 110, 116,  61, 110,  40,  41,  41, // current=n())\n 125,  44, 110, 117, 108, 108,  61,  61,  95,  63,  95,  58, // },null==_?_:\n  95,  46,  99, 111, 110,  99,  97, 116,  40, 101,  41,  41, // _.concat(e))\n 125, 102, 117, 110,  99, 116, 105, 111, 110,  32,  89,  40, // }function Y(\n 101,  44, 110,  41, 123, 118,  97, 114,  32,  95,  61, 106, // e,n){var _=j\n  40,  76,  43,  43,  44,  55,  41,  59, 114, 101, 116, 117, // (L++,7);retu\n 114, 110,  32, 108, 101,  40,  95,  46,  95,  95,  72,  44, // rn le(_.__H,\n 110,  41,  38,  38,  40,  95,  46,  95,  95,  61, 101,  40, // n)&&(_.__=e(\n  41,  44,  95,  46,  95,  95,  72,  61, 110,  44,  95,  46, // ),_.__H=n,_.\n  95,  95, 104,  61, 101,  41,  44,  95,  46,  95,  95, 125, // __h=e),_.__}\n 102, 117, 110,  99, 116, 105, 111, 110,  32,  90,  40, 101, // function Z(e\n  44, 110,  41, 123, 114, 101, 116, 117, 114, 110,  32,  82, // ,n){return R\n  61,  56,  44,  89,  40, 102, 117, 110,  99, 116, 105, 111, // =8,Y(functio\n 110,  40,  41, 123, 114, 101, 116, 117, 114, 110,  32, 101, // n(){return e\n 125,  44, 110,  41, 125, 102, 117, 110,  99, 116, 105, 111, // },n)}functio\n 110,  32, 101, 101,  40, 101,  41, 123, 118,  97, 114,  32, // n ee(e){var \n 110,  61,  78,  46,  99, 111, 110, 116, 101, 120, 116,  91, // n=N.context[\n 101,  46,  95,  95,  99,  93,  44,  95,  61, 106,  40,  76, // e.__c],_=j(L\n  43,  43,  44,  57,  41,  59, 114, 101, 116, 117, 114, 110, // ++,9);return\n  32,  95,  46,  99,  61, 101,  44, 110,  63,  40, 110, 117, //  _.c=e,n?(nu\n 108, 108,  61,  61,  95,  46,  95,  95,  38,  38,  40,  95, // ll==_.__&&(_\n  46,  95,  95,  61,  33,  48,  44, 110,  46, 115, 117,  98, // .__=!0,n.sub\n  40,  78,  41,  41,  44, 110,  46, 112, 114, 111, 112, 115, // (N)),n.props\n  46, 118,  97, 108, 117, 101,  41,  58, 101,  46,  95,  95, // .value):e.__\n 125, 102, 117, 110,  99, 116, 105, 111, 110,  32, 110, 101, // }function ne\n  40, 101,  44,  95,  41, 123, 110,  46, 117, 115, 101,  68, // (e,_){n.useD\n 101,  98, 117, 103,  86,  97, 108, 117, 101,  38,  38, 110, // ebugValue&&n\n  46, 117, 115, 101,  68, 101,  98, 117, 103,  86,  97, 108, // .useDebugVal\n 117, 101,  40,  95,  63,  95,  40, 101,  41,  58, 101,  41, // ue(_?_(e):e)\n 125, 102, 117, 110,  99, 116, 105, 111, 110,  32,  95, 101, // }function _e\n  40, 101,  41, 123, 118,  97, 114,  32, 110,  61, 106,  40, // (e){var n=j(\n  76,  43,  43,  44,  49,  48,  41,  44,  95,  61,  71,  40, // L++,10),_=G(\n  41,  59, 114, 101, 116, 117, 114, 110,  32, 110,  46,  95, // );return n._\n  95,  61, 101,  44,  78,  46,  99, 111, 109, 112, 111, 110, // _=e,N.compon\n 101, 110, 116,  68, 105, 100,  67,  97, 116,  99, 104, 124, // entDidCatch|\n 124,  40,  78,  46,  99, 111, 109, 112, 111, 110, 101, 110, // |(N.componen\n 116,  68, 105, 100,  67,  97, 116,  99, 104,  61, 102, 117, // tDidCatch=fu\n 110,  99, 116, 105, 111, 110,  40, 101,  41, 123, 110,  46, // nction(e){n.\n  95,  95,  38,  38, 110,  46,  95,  95,  40, 101,  41,  44, // __&&n.__(e),\n  95,  91,  49,  93,  40, 101,  41, 125,  41,  44,  91,  95, // _[1](e)}),[_\n  91,  48,  93,  44, 102, 117, 110,  99, 116, 105, 111, 110, // [0],function\n  40,  41, 123,  95,  91,  49,  93,  40, 118, 111, 105, 100, // (){_[1](void\n  32,  48,  41, 125,  93, 125, 102, 117, 110,  99, 116, 105, //  0)}]}functi\n 111, 110,  32, 116, 101,  40,  41, 123,  73,  46, 102, 111, // on te(){I.fo\n 114,  69,  97,  99, 104,  40, 102, 117, 110,  99, 116, 105, // rEach(functi\n 111, 110,  40, 101,  41, 123, 105, 102,  40, 101,  46,  95, // on(e){if(e._\n  95,  80,  41, 116, 114, 121, 123, 101,  46,  95,  95,  72, // _P)try{e.__H\n  46,  95,  95, 104,  46, 102, 111, 114,  69,  97,  99, 104, // .__h.forEach\n  40, 114, 101,  41,  44, 101,  46,  95,  95,  72,  46,  95, // (re),e.__H._\n  95, 104,  46, 102, 111, 114,  69,  97,  99, 104,  40, 117, // _h.forEach(u\n 101,  41,  44, 101,  46,  95,  95,  72,  46,  95,  95, 104, // e),e.__H.__h\n  61,  91,  93, 125,  99,  97, 116,  99, 104,  40,  95,  41, // =[]}catch(_)\n 123, 101,  46,  95,  95,  72,  46,  95,  95, 104,  61,  91, // {e.__H.__h=[\n  93,  44, 110,  46,  95,  95, 101,  40,  95,  44, 101,  46, // ],n.__e(_,e.\n  95,  95, 118,  41, 125, 125,  41,  44,  73,  61,  91,  93, // __v)}}),I=[]\n 125, 110,  46,  95,  95,  98,  61, 102, 117, 110,  99, 116, // }n.__b=funct\n 105, 111, 110,  40, 101,  41, 123,  78,  61, 110, 117, 108, // ion(e){N=nul\n 108,  44,  79,  38,  38,  79,  40, 101,  41, 125,  44, 110, // l,O&&O(e)},n\n  46,  95,  95, 114,  61, 102, 117, 110,  99, 116, 105, 111, // .__r=functio\n 110,  40, 101,  41, 123,  86,  38,  38,  86,  40, 101,  41, // n(e){V&&V(e)\n  44,  76,  61,  48,  59, 118,  97, 114,  32, 110,  61,  40, // ,L=0;var n=(\n  78,  61, 101,  46,  95,  95,  99,  41,  46,  95,  95,  72, // N=e.__c).__H\n  59, 110,  38,  38,  40, 110,  46,  95,  95, 104,  46, 102, // ;n&&(n.__h.f\n 111, 114,  69,  97,  99, 104,  40, 114, 101,  41,  44, 110, // orEach(re),n\n  46,  95,  95, 104,  46, 102, 111, 114,  69,  97,  99, 104, // .__h.forEach\n  40, 117, 101,  41,  44, 110,  46,  95,  95, 104,  61,  91, // (ue),n.__h=[\n  93,  41, 125,  44, 110,  46, 100, 105, 102, 102, 101, 100, // ])},n.diffed\n  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, 101,  41, // =function(e)\n 123, 113,  38,  38, 113,  40, 101,  41,  59, 118,  97, 114, // {q&&q(e);var\n  32,  95,  61, 101,  46,  95,  95,  99,  59,  95,  38,  38, //  _=e.__c;_&&\n  95,  46,  95,  95,  72,  38,  38,  95,  46,  95,  95,  72, // _.__H&&_.__H\n  46,  95,  95, 104,  46, 108, 101, 110, 103, 116, 104,  38, // .__h.length&\n  38,  40,  49,  33,  61,  61,  73,  46, 112, 117, 115, 104, // &(1!==I.push\n  40,  95,  41,  38,  38,  87,  61,  61,  61, 110,  46, 114, // (_)&&W===n.r\n 101, 113, 117, 101, 115, 116,  65, 110, 105, 109,  97, 116, // equestAnimat\n 105, 111, 110,  70, 114,  97, 109, 101, 124, 124,  40,  40, // ionFrame||((\n  87,  61, 110,  46, 114, 101, 113, 117, 101, 115, 116,  65, // W=n.requestA\n 110, 105, 109,  97, 116, 105, 111, 110,  70, 114,  97, 109, // nimationFram\n 101,  41, 124, 124, 102, 117, 110,  99, 116, 105, 111, 110, // e)||function\n  40, 101,  41, 123, 118,  97, 114,  32, 110,  44,  95,  61, // (e){var n,_=\n 102, 117, 110,  99, 116, 105, 111, 110,  40,  41, 123,  99, // function(){c\n 108, 101,  97, 114,  84, 105, 109, 101, 111, 117, 116,  40, // learTimeout(\n 116,  41,  44, 111, 101,  38,  38,  99,  97, 110,  99, 101, // t),oe&&cance\n 108,  65, 110, 105, 109,  97, 116, 105, 111, 110,  70, 114, // lAnimationFr\n  97, 109, 101,  40, 110,  41,  44, 115, 101, 116,  84, 105, // ame(n),setTi\n 109, 101, 111, 117, 116,  40, 101,  41, 125,  44, 116,  61, // meout(e)},t=\n 115, 101, 116,  84, 105, 109, 101, 111, 117, 116,  40,  95, // setTimeout(_\n  44,  49,  48,  48,  41,  59, 111, 101,  38,  38,  40, 110, // ,100);oe&&(n\n  61, 114, 101, 113, 117, 101, 115, 116,  65, 110, 105, 109, // =requestAnim\n  97, 116, 105, 111, 110,  70, 114,  97, 109, 101,  40,  95, // ationFrame(_\n  41,  41, 125,  41,  40, 116, 101,  41,  41,  44,  78,  61, // ))})(te)),N=\n 118, 111, 105, 100,  32,  48, 125,  44, 110,  46,  95,  95, // void 0},n.__\n  99,  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, 101, // c=function(e\n  44,  95,  41, 123,  95,  46, 115, 111, 109, 101,  40, 102, // ,_){_.some(f\n 117, 110,  99, 116, 105, 111, 110,  40, 101,  41, 123, 116, // unction(e){t\n 114, 121, 123, 101,  46,  95,  95, 104,  46, 102, 111, 114, // ry{e.__h.for\n  69,  97,  99, 104,  40, 114, 101,  41,  44, 101,  46,  95, // Each(re),e._\n  95, 104,  61, 101,  46,  95,  95, 104,  46, 102, 105, 108, // _h=e.__h.fil\n 116, 101, 114,  40, 102, 117, 110,  99, 116, 105, 111, 110, // ter(function\n  40, 101,  41, 123, 114, 101, 116, 117, 114, 110,  33, 101, // (e){return!e\n  46,  95,  95, 124, 124, 117, 101,  40, 101,  41, 125,  41, // .__||ue(e)})\n 125,  99,  97, 116,  99, 104,  40, 116,  41, 123,  95,  46, // }catch(t){_.\n 115, 111, 109, 101,  40, 102, 117, 110,  99, 116, 105, 111, // some(functio\n 110,  40, 101,  41, 123, 101,  46,  95,  95, 104,  38,  38, // n(e){e.__h&&\n  40, 101,  46,  95,  95, 104,  61,  91,  93,  41, 125,  41, // (e.__h=[])})\n  44,  95,  61,  91,  93,  44, 110,  46,  95,  95, 101,  40, // ,_=[],n.__e(\n 116,  44, 101,  46,  95,  95, 118,  41, 125, 125,  41,  44, // t,e.__v)}}),\n  66,  38,  38,  66,  40, 101,  44,  95,  41, 125,  44, 110, // B&&B(e,_)},n\n  46, 117, 110, 109, 111, 117, 110, 116,  61, 102, 117, 110, // .unmount=fun\n  99, 116, 105, 111, 110,  40, 101,  41, 123,  36,  38,  38, // ction(e){$&&\n  36,  40, 101,  41,  59, 118,  97, 114,  32,  95,  61, 101, // $(e);var _=e\n  46,  95,  95,  99,  59, 105, 102,  40,  95,  38,  38,  95, // .__c;if(_&&_\n  46,  95,  95,  72,  41, 116, 114, 121, 123,  95,  46,  95, // .__H)try{_._\n  95,  72,  46,  95,  95,  46, 102, 111, 114,  69,  97,  99, // _H.__.forEac\n 104,  40, 114, 101,  41, 125,  99,  97, 116,  99, 104,  40, // h(re)}catch(\n 101,  41, 123, 110,  46,  95,  95, 101,  40, 101,  44,  95, // e){n.__e(e,_\n  46,  95,  95, 118,  41, 125, 125,  59, 118,  97, 114,  32, // .__v)}};var \n 111, 101,  61,  34, 102, 117, 110,  99, 116, 105, 111, 110, // oe=\"function\n  34,  61,  61, 116, 121, 112, 101, 111, 102,  32, 114, 101, // \"==typeof re\n 113, 117, 101, 115, 116,  65, 110, 105, 109,  97, 116, 105, // questAnimati\n 111, 110,  70, 114,  97, 109, 101,  59, 102, 117, 110,  99, // onFrame;func\n 116, 105, 111, 110,  32, 114, 101,  40, 101,  41, 123, 118, // tion re(e){v\n  97, 114,  32, 110,  61,  78,  59,  34, 102, 117, 110,  99, // ar n=N;\"func\n 116, 105, 111, 110,  34,  61,  61, 116, 121, 112, 101, 111, // tion\"==typeo\n 102,  32, 101,  46,  95,  95,  99,  38,  38, 101,  46,  95, // f e.__c&&e._\n  95,  99,  40,  41,  44,  78,  61, 110, 125, 102, 117, 110, // _c(),N=n}fun\n  99, 116, 105, 111, 110,  32, 117, 101,  40, 101,  41, 123, // ction ue(e){\n 118,  97, 114,  32, 110,  61,  78,  59, 101,  46,  95,  95, // var n=N;e.__\n  99,  61, 101,  46,  95,  95,  40,  41,  44,  78,  61, 110, // c=e.__(),N=n\n 125, 102, 117, 110,  99, 116, 105, 111, 110,  32, 108, 101, // }function le\n  40, 101,  44, 110,  41, 123, 114, 101, 116, 117, 114, 110, // (e,n){return\n  33, 101, 124, 124, 101,  46, 108, 101, 110, 103, 116, 104, // !e||e.length\n  33,  61,  61, 110,  46, 108, 101, 110, 103, 116, 104, 124, // !==n.length|\n 124, 110,  46, 115, 111, 109, 101,  40, 102, 117, 110,  99, // |n.some(func\n 116, 105, 111, 110,  40, 110,  44,  95,  41, 123, 114, 101, // tion(n,_){re\n 116, 117, 114, 110,  32, 110,  33,  61,  61, 101,  91,  95, // turn n!==e[_\n  93, 125,  41, 125, 102, 117, 110,  99, 116, 105, 111, 110, // ]})}function\n  32, 105, 101,  40, 101,  44, 110,  41, 123, 114, 101, 116, //  ie(e,n){ret\n 117, 114, 110,  34, 102, 117, 110,  99, 116, 105, 111, 110, // urn\"function\n  34,  61,  61, 116, 121, 112, 101, 111, 102,  32, 110,  63, // \"==typeof n?\n 110,  40, 101,  41,  58, 110, 125, 118,  97, 114,  32,  99, // n(e):n}var c\n 101,  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, 101, // e=function(e\n  44, 110,  44,  95,  44, 116,  41, 123, 118,  97, 114,  32, // ,n,_,t){var \n 111,  59, 110,  91,  48,  93,  61,  48,  59, 102, 111, 114, // o;n[0]=0;for\n  40, 118,  97, 114,  32, 114,  61,  49,  59, 114,  60, 110, // (var r=1;r<n\n  46, 108, 101, 110, 103, 116, 104,  59, 114,  43,  43,  41, // .length;r++)\n 123, 118,  97, 114,  32, 117,  61, 110,  91, 114,  43,  43, // {var u=n[r++\n  93,  44, 108,  61, 110,  91, 114,  93,  63,  40, 110,  91, // ],l=n[r]?(n[\n  48,  93, 124,  61, 117,  63,  49,  58,  50,  44,  95,  91, // 0]|=u?1:2,_[\n 110,  91, 114,  43,  43,  93,  93,  41,  58, 110,  91,  43, // n[r++]]):n[+\n  43, 114,  93,  59,  51,  61,  61,  61, 117,  63, 116,  91, // +r];3===u?t[\n  48,  93,  61, 108,  58,  52,  61,  61,  61, 117,  63, 116, // 0]=l:4===u?t\n  91,  49,  93,  61,  79,  98, 106, 101,  99, 116,  46,  97, // [1]=Object.a\n 115, 115, 105, 103, 110,  40, 116,  91,  49,  93, 124, 124, // ssign(t[1]||\n 123, 125,  44, 108,  41,  58,  53,  61,  61,  61, 117,  63, // {},l):5===u?\n  40, 116,  91,  49,  93,  61, 116,  91,  49,  93, 124, 124, // (t[1]=t[1]||\n 123, 125,  41,  91, 110,  91,  43,  43, 114,  93,  93,  61, // {})[n[++r]]=\n 108,  58,  54,  61,  61,  61, 117,  63, 116,  91,  49,  93, // l:6===u?t[1]\n  91, 110,  91,  43,  43, 114,  93,  93,  43,  61, 108,  43, // [n[++r]]+=l+\n  34,  34,  58, 117,  63,  40, 111,  61, 101,  46,  97, 112, // \"\":u?(o=e.ap\n 112, 108, 121,  40, 108,  44,  99, 101,  40, 101,  44, 108, // ply(l,ce(e,l\n  44,  95,  44,  91,  34,  34,  44, 110, 117, 108, 108,  93, // ,_,[\"\",null]\n  41,  41,  44, 116,  46, 112, 117, 115, 104,  40, 111,  41, // )),t.push(o)\n  44, 108,  91,  48,  93,  63, 110,  91,  48,  93, 124,  61, // ,l[0]?n[0]|=\n  50,  58,  40, 110,  91, 114,  45,  50,  93,  61,  48,  44, // 2:(n[r-2]=0,\n 110,  91, 114,  93,  61, 111,  41,  41,  58, 116,  46, 112, // n[r]=o)):t.p\n 117, 115, 104,  40, 108,  41, 125, 114, 101, 116, 117, 114, // ush(l)}retur\n 110,  32, 116, 125,  44, 115, 101,  61, 110, 101, 119,  32, // n t},se=new \n  77,  97, 112,  44, 102, 101,  61, 102, 117, 110,  99, 116, // Map,fe=funct\n 105, 111, 110,  40, 101,  41, 123, 118,  97, 114,  32, 110, // ion(e){var n\n  61, 115, 101,  46, 103, 101, 116,  40, 116, 104, 105, 115, // =se.get(this\n  41,  59, 114, 101, 116, 117, 114, 110,  32, 110, 124, 124, // );return n||\n  40, 110,  61, 110, 101, 119,  32,  77,  97, 112,  44, 115, // (n=new Map,s\n 101,  46, 115, 101, 116,  40, 116, 104, 105, 115,  44, 110, // e.set(this,n\n  41,  41,  44,  40, 110,  61,  99, 101,  40, 116, 104, 105, // )),(n=ce(thi\n 115,  44, 110,  46, 103, 101, 116,  40, 101,  41, 124, 124, // s,n.get(e)||\n  40, 110,  46, 115, 101, 116,  40, 101,  44, 110,  61, 102, // (n.set(e,n=f\n 117, 110,  99, 116, 105, 111, 110,  40, 101,  41, 123, 102, // unction(e){f\n 111, 114,  40, 118,  97, 114,  32, 110,  44,  95,  44, 116, // or(var n,_,t\n  61,  49,  44, 111,  61,  34,  34,  44, 114,  61,  34,  34, // =1,o=\"\",r=\"\"\n  44, 117,  61,  91,  48,  93,  44, 108,  61, 102, 117, 110, // ,u=[0],l=fun\n  99, 116, 105, 111, 110,  40, 101,  41, 123,  49,  61,  61, // ction(e){1==\n  61, 116,  38,  38,  40, 101, 124, 124,  40, 111,  61, 111, // =t&&(e||(o=o\n  46, 114, 101, 112, 108,  97,  99, 101,  40,  47,  94,  92, // .replace(/^.\n 115,  42,  92, 110,  92, 115,  42, 124,  92, 115,  42,  92, // s*.n.s*|.s*.\n 110,  92, 115,  42,  36,  47, 103,  44,  34,  34,  41,  41, // n.s*$/g,\"\"))\n  41,  63, 117,  46, 112, 117, 115, 104,  40,  48,  44, 101, // )?u.push(0,e\n  44, 111,  41,  58,  51,  61,  61,  61, 116,  38,  38,  40, // ,o):3===t&&(\n 101, 124, 124, 111,  41,  63,  40, 117,  46, 112, 117, 115, // e||o)?(u.pus\n 104,  40,  51,  44, 101,  44, 111,  41,  44, 116,  61,  50, // h(3,e,o),t=2\n  41,  58,  50,  61,  61,  61, 116,  38,  38,  34,  46,  46, // ):2===t&&\"..\n  46,  34,  61,  61,  61, 111,  38,  38, 101,  63, 117,  46, // .\"===o&&e?u.\n 112, 117, 115, 104,  40,  52,  44, 101,  44,  48,  41,  58, // push(4,e,0):\n  50,  61,  61,  61, 116,  38,  38, 111,  38,  38,  33, 101, // 2===t&&o&&!e\n  63, 117,  46, 112, 117, 115, 104,  40,  53,  44,  48,  44, // ?u.push(5,0,\n  33,  48,  44, 111,  41,  58, 116,  62,  61,  53,  38,  38, // !0,o):t>=5&&\n  40,  40, 111, 124, 124,  33, 101,  38,  38,  53,  61,  61, // ((o||!e&&5==\n  61, 116,  41,  38,  38,  40, 117,  46, 112, 117, 115, 104, // =t)&&(u.push\n  40, 116,  44,  48,  44, 111,  44,  95,  41,  44, 116,  61, // (t,0,o,_),t=\n  54,  41,  44, 101,  38,  38,  40, 117,  46, 112, 117, 115, // 6),e&&(u.pus\n 104,  40, 116,  44, 101,  44,  48,  44,  95,  41,  44, 116, // h(t,e,0,_),t\n  61,  54,  41,  41,  44, 111,  61,  34,  34, 125,  44, 105, // =6)),o=\"\"},i\n  61,  48,  59, 105,  60, 101,  46, 108, 101, 110, 103, 116, // =0;i<e.lengt\n 104,  59, 105,  43,  43,  41, 123, 105,  38,  38,  40,  49, // h;i++){i&&(1\n  61,  61,  61, 116,  38,  38, 108,  40,  41,  44, 108,  40, // ===t&&l(),l(\n 105,  41,  41,  59, 102, 111, 114,  40, 118,  97, 114,  32, // i));for(var \n  99,  61,  48,  59,  99,  60, 101,  91, 105,  93,  46, 108, // c=0;c<e[i].l\n 101, 110, 103, 116, 104,  59,  99,  43,  43,  41, 110,  61, // ength;c++)n=\n 101,  91, 105,  93,  91,  99,  93,  44,  49,  61,  61,  61, // e[i][c],1===\n 116,  63,  34,  60,  34,  61,  61,  61, 110,  63,  40, 108, // t?\"<\"===n?(l\n  40,  41,  44, 117,  61,  91, 117,  93,  44, 116,  61,  51, // (),u=[u],t=3\n  41,  58, 111,  43,  61, 110,  58,  52,  61,  61,  61, 116, // ):o+=n:4===t\n  63,  34,  45,  45,  34,  61,  61,  61, 111,  38,  38,  34, // ?\"--\"===o&&\"\n  62,  34,  61,  61,  61, 110,  63,  40, 116,  61,  49,  44, // >\"===n?(t=1,\n 111,  61,  34,  34,  41,  58, 111,  61, 110,  43, 111,  91, // o=\"\"):o=n+o[\n  48,  93,  58, 114,  63, 110,  61,  61,  61, 114,  63, 114, // 0]:r?n===r?r\n  61,  34,  34,  58, 111,  43,  61, 110,  58,  39,  34,  39, // =\"\":o+=n:'\"'\n  61,  61,  61, 110, 124, 124,  34,  39,  34,  61,  61,  61, // ===n||\"'\"===\n 110,  63, 114,  61, 110,  58,  34,  62,  34,  61,  61,  61, // n?r=n:\">\"===\n 110,  63,  40, 108,  40,  41,  44, 116,  61,  49,  41,  58, // n?(l(),t=1):\n 116,  38,  38,  40,  34,  61,  34,  61,  61,  61, 110,  63, // t&&(\"=\"===n?\n  40, 116,  61,  53,  44,  95,  61, 111,  44, 111,  61,  34, // (t=5,_=o,o=\"\n  34,  41,  58,  34,  47,  34,  61,  61,  61, 110,  38,  38, // \"):\"/\"===n&&\n  40, 116,  60,  53, 124, 124,  34,  62,  34,  61,  61,  61, // (t<5||\">\"===\n 101,  91, 105,  93,  91,  99,  43,  49,  93,  41,  63,  40, // e[i][c+1])?(\n 108,  40,  41,  44,  51,  61,  61,  61, 116,  38,  38,  40, // l(),3===t&&(\n 117,  61, 117,  91,  48,  93,  41,  44, 116,  61, 117,  44, // u=u[0]),t=u,\n  40, 117,  61, 117,  91,  48,  93,  41,  46, 112, 117, 115, // (u=u[0]).pus\n 104,  40,  50,  44,  48,  44, 116,  41,  44, 116,  61,  48, // h(2,0,t),t=0\n  41,  58,  34,  32,  34,  61,  61,  61, 110, 124, 124,  34, // ):\" \"===n||\"\n  92, 116,  34,  61,  61,  61, 110, 124, 124,  34,  92, 110, // .t\"===n||\".n\n  34,  61,  61,  61, 110, 124, 124,  34,  92, 114,  34,  61, // \"===n||\".r\"=\n  61,  61, 110,  63,  40, 108,  40,  41,  44, 116,  61,  50, // ==n?(l(),t=2\n  41,  58, 111,  43,  61, 110,  41,  44,  51,  61,  61,  61, // ):o+=n),3===\n 116,  38,  38,  34,  33,  45,  45,  34,  61,  61,  61, 111, // t&&\"!--\"===o\n  38,  38,  40, 116,  61,  52,  44, 117,  61, 117,  91,  48, // &&(t=4,u=u[0\n  93,  41, 125, 114, 101, 116, 117, 114, 110,  32, 108,  40, // ])}return l(\n  41,  44, 117, 125,  40, 101,  41,  41,  44, 110,  41,  44, // ),u}(e)),n),\n  97, 114, 103, 117, 109, 101, 110, 116, 115,  44,  91,  93, // arguments,[]\n  41,  41,  46, 108, 101, 110, 103, 116, 104,  62,  49,  63, // )).length>1?\n 110,  58, 110,  91,  48,  93, 125,  46,  98, 105, 110, 100, // n:n[0]}.bind\n  40,  97,  41,  59, 101, 120, 112, 111, 114, 116, 123,  97, // (a);export{a\n  32,  97, 115,  32, 104,  44, 102, 101,  32,  97, 115,  32, //  as h,fe as \n 104, 116, 109, 108,  44,  77,  32,  97, 115,  32, 114, 101, // html,M as re\n 110, 100, 101, 114,  44, 100,  32,  97, 115,  32,  67, 111, // nder,d as Co\n 109, 112, 111, 110, 101, 110, 116,  44,  70,  32,  97, 115, // mponent,F as\n  32,  99, 114, 101,  97, 116, 101,  67, 111, 110, 116, 101, //  createConte\n 120, 116,  44,  71,  32,  97, 115,  32, 117, 115, 101,  83, // xt,G as useS\n 116,  97, 116, 101,  44, 122,  32,  97, 115,  32, 117, 115, // tate,z as us\n 101,  82, 101, 100, 117,  99, 101, 114,  44,  74,  32,  97, // eReducer,J a\n 115,  32, 117, 115, 101,  69, 102, 102, 101,  99, 116,  44, // s useEffect,\n  75,  32,  97, 115,  32, 117, 115, 101,  76,  97, 121, 111, // K as useLayo\n 117, 116,  69, 102, 102, 101,  99, 116,  44,  81,  32,  97, // utEffect,Q a\n 115,  32, 117, 115, 101,  82, 101, 102,  44,  88,  32,  97, // s useRef,X a\n 115,  32, 117, 115, 101,  73, 109, 112, 101, 114,  97, 116, // s useImperat\n 105, 118, 101,  72,  97, 110, 100, 108, 101,  44,  89,  32, // iveHandle,Y \n  97, 115,  32, 117, 115, 101,  77, 101, 109, 111,  44,  90, // as useMemo,Z\n  32,  97, 115,  32, 117, 115, 101,  67,  97, 108, 108,  98, //  as useCallb\n  97,  99, 107,  44, 101, 101,  32,  97, 115,  32, 117, 115, // ack,ee as us\n 101,  67, 111, 110, 116, 101, 120, 116,  44, 110, 101,  32, // eContext,ne \n  97, 115,  32, 117, 115, 101,  68, 101,  98, 117, 103,  86, // as useDebugV\n  97, 108, 117, 101,  44,  95, 101,  32,  97, 115,  32, 117, // alue,_e as u\n 115, 101,  69, 114, 114, 111, 114,  66, 111, 117, 110, 100, // seErrorBound\n  97, 114, 121, 125,  59,  10, 0 // ary};.\n};\nstatic const unsigned char v5[] = {\n  60,  33,  68,  79,  67,  84,  89,  80,  69,  32, 104, 116, // <!DOCTYPE ht\n 109, 108,  62,  10,  60, 104, 116, 109, 108,  32, 108,  97, // ml>.<html la\n 110, 103,  61,  34, 101, 110,  34,  62,  10,  32,  32,  60, // ng=\"en\">.  <\n 104, 101,  97, 100,  62,  10,  32,  32,  32,  32,  60, 109, // head>.    <m\n 101, 116,  97,  32, 110,  97, 109, 101,  61,  34, 100, 101, // eta name=\"de\n 115,  99, 114, 105, 112, 116, 105, 111, 110,  34,  32,  99, // scription\" c\n 111, 110, 116, 101, 110, 116,  61,  34,  77, 111, 110, 103, // ontent=\"Mong\n 111, 111, 115, 101,  32,  69, 109,  98, 101, 100, 100, 101, // oose Embedde\n 100,  32,  70, 105, 108, 101, 115, 121, 116, 101, 109,  32, // d Filesytem \n 101, 120,  97, 109, 112, 108, 101,  34,  32,  47,  62,  10, // example\" />.\n  32,  32,  32,  32,  60, 109, 101, 116,  97,  32, 104, 116, //     <meta ht\n 116, 112,  45, 101, 113, 117, 105, 118,  61,  34,  67, 111, // tp-equiv=\"Co\n 110, 116, 101, 110, 116,  45,  84, 121, 112, 101,  34,  32, // ntent-Type\" \n  99, 111, 110, 116, 101, 110, 116,  61,  34, 116, 101, 120, // content=\"tex\n 116,  47, 104, 116, 109, 108,  59,  32,  99, 104,  97, 114, // t/html; char\n 115, 101, 116,  61,  85,  84,  70,  45,  56,  34,  62,  10, // set=UTF-8\">.\n  32,  32,  32,  32,  60, 109, 101, 116,  97,  32, 104, 116, //     <meta ht\n 116, 112,  45, 101, 113, 117, 105, 118,  61,  34,  88,  45, // tp-equiv=\"X-\n  85,  65,  45,  67, 111, 109, 112,  97, 116, 105,  98, 108, // UA-Compatibl\n 101,  34,  32,  99, 111, 110, 116, 101, 110, 116,  61,  34, // e\" content=\"\n  73,  69,  61, 101, 100, 103, 101,  34,  62,  10,  32,  32, // IE=edge\">.  \n  32,  32,  60, 109, 101, 116,  97,  32, 110,  97, 109, 101, //   <meta name\n  61,  34, 118, 105, 101, 119, 112, 111, 114, 116,  34,  32, // =\"viewport\" \n  99, 111, 110, 116, 101, 110, 116,  61,  34, 119, 105, 100, // content=\"wid\n 116, 104,  61, 100, 101, 118, 105,  99, 101,  45, 119, 105, // th=device-wi\n 100, 116, 104,  44,  32, 105, 110, 105, 116, 105,  97, 108, // dth, initial\n  45, 115,  99,  97, 108, 101,  61,  49,  34,  62,  10,  32, // -scale=1\">. \n  32,  32,  32,  32,  32,  32,  32,  60, 116, 105, 116, 108, //        <titl\n 101,  62,  77, 111, 110, 103, 111, 111, 115, 101,  32,  69, // e>Mongoose E\n 109,  98, 101, 100, 100, 101, 100,  32,  70, 105, 108, 101, // mbedded File\n 115, 121, 116, 101, 109,  32, 101, 120,  97, 109, 112, 108, // sytem exampl\n 101,  60,  47, 116, 105, 116, 108, 101,  62,  10,  32,  32, // e</title>.  \n  32,  32,  60, 108, 105, 110, 107,  32, 114, 101, 108,  61, //   <link rel=\n  34, 115, 116, 121, 108, 101, 115, 104, 101, 101, 116,  34, // \"stylesheet\"\n  32, 104, 114, 101, 102,  61,  34, 115, 116, 121, 108, 101, //  href=\"style\n  46,  99, 115, 115,  34,  32,  47,  62,  10,  32,  32,  60, // .css\" />.  <\n  47, 104, 101,  97, 100,  62,  10,  32,  32,  60,  98, 111, // /head>.  <bo\n 100, 121,  62,  60,  47,  98, 111, 100, 121,  62,  10,  32, // dy></body>. \n  32,  60, 115,  99, 114, 105, 112, 116,  32, 116, 121, 112, //  <script typ\n 101,  61,  34, 109, 111, 100, 117, 108, 101,  34,  32, 115, // e=\"module\" s\n 114,  99,  61,  34, 109,  97, 105, 110,  46, 106, 115,  34, // rc=\"main.js\"\n  62,  60,  47, 115,  99, 114, 105, 112, 116,  62,  10,  60, // ></script>.<\n  47, 104, 116, 109, 108,  62,  10, 0 // /html>.\n};\nstatic const unsigned char v6[] = {\n  31, 139,   8,   8, 219,  27, 244,  98,   0,   3, 105, 110, // .......b..in\n 100, 101, 120,  46, 104, 116, 109, 108,   0, 141, 145,  77, // dex.html...M\n  75,   3,  49,  16, 134, 239, 253,  21,  99, 206, 166, 139, // K.1.....c...\n  55, 193, 205, 130, 212,  22,  60, 136,  30,  90, 208,  99, // 7.....<..Z.c\n 154, 140, 205, 104,  62, 214, 205, 244,  99, 255, 189, 217, // ...h>...c...\n 110, 133,   5,  17,  60, 205,   7,  47,  15,  51, 239,  91, // n...<../.3.[\n  95,  61,  60,  47, 214, 111,  47,  75, 112,  28, 124,  51, // _=</.o/Kp.|3\n 171, 135,   2,  94, 199, 157,  18,  24,  69,  51,   3, 168, // ...^....E3..\n  29, 106,  59,  52, 165,  13, 200,  26, 162,  14, 168, 132, // .j;4........\n 197, 108,  58, 106, 153,  82,  20,  96,  82, 100, 140, 172, // .l:j.R.`Rd..\n 196,  83, 138, 187, 148,  50, 194,  50, 108, 209,  90, 180, // .S...2.2l.Z.\n 176,  34, 143, 185, 103,  12, 128,  39,  29,  90, 143,   2, // .\"..g..'.Z..\n 170,  41, 205,  49, 183,  18, 191, 246, 116,  80,  98,  49, // .).1....tPb1\n  98, 228, 186, 111, 113,   2, 101,  60, 113,  53,  28, 118, // b..oq.e<q5.v\n   7, 198, 233,  46,  35, 171, 205, 122,  37, 111, 197,  95, // ....#..z%o._\n 156,  87, 185, 185, 151, 139,  20,  90, 205, 180, 245,  83, // .W.....Z...S\n 212, 227,  82, 161, 221, 161, 248, 253, 207, 129, 240, 216, // ..R.........\n 166, 142,  39, 226,  35,  89, 118, 202, 226, 129,  12, 202, // ..'.#Yv.....\n 243, 112,  13,  20, 137,  73, 123, 153, 141, 246, 168, 110, // .p...I{....n\n  46, 160,  51, 140, 137,  61,  54, 255, 112, 160, 174,  70, // ..3..=6.p..F\n 233, 120, 131, 167, 248,   9,  29, 122,  37,  50, 247,  69, // .x.....z%2.E\n 233,  16, 203,  17, 174, 195, 247, 203, 102, 110, 114, 190, // ........fnr.\n 152,  86,  87,  63,  97, 212, 219, 100, 251, 166, 174, 206, // .VW?a..d....\n 101, 152, 199,  52, 128, 139, 117,  74, 132, 100, 247, 195, // e..4..uJ.d..\n 223, 185,  51, 101, 208,  20, 231,  31,  89,  20, 245,  40, // ..3e....Y..(\n  42,  49,  87,  99, 220, 223,  14, 156, 225,  97, 255,   1, // *1Wc.....a..\n   0,   0, 0 // ..\n};\nstatic const unsigned char v7[] = {\n  31, 139,   8,   8, 219,  27, 244,  98,   0,   3, 115, 116, // .......b..st\n 121, 108, 101,  46,  99, 115, 115,   0, 117,  84, 203, 110, // yle.css.uT.n\n 219,  48,  16, 188, 251,  43,  88,   4,   5, 218,  32,  82, // .0...+X... R\n  44,  41, 178,  99, 249, 210,  91,  63, 162, 232, 129,  18, // ,).c..[?....\n  87,  54,  17, 138,  84,  73,  58, 118,  90, 248, 223, 187, // W6..TI:vZ...\n 164,  30, 164, 226, 228,  98,  75, 187, 163, 125, 204,  12, // .....bK..}..\n 121,  79, 254, 145,  90,  93,  18, 195, 255, 114, 121, 168, // yO..Z]...ry.\n 240,  89,  51, 208,   9, 134, 246, 228, 186,  58, 218,  78, // .Y3......:.N\n  60,  96, 140, 189,  33, 172, 163, 250, 192, 101,  69, 214, // <`..!....eE.\n 123, 210,  83, 198,  60,  28, 159, 143, 192,  15,  71,  91, // {.S.<.....G[\n 145, 108, 189, 254, 186,  39, 173, 146, 238, 121, 211,  95, // .l...'...y._\n 136, 161, 210,  36,   6,  52, 111,  93,  41,   3,   2,  26, // ...$.4o])...\n 251,  64, 184, 236,  79, 248,  39, 104,  13, 162, 170, 106, // .@..O.'h...j\n 104, 149, 134,   7,  98, 225,  98, 169,   6, 138, 109, 212, // h...b.b...m.\n 201,  10,  46, 161,  34,  82,  73, 216,  15, 195,  29,  41, // ....\"RI....)\n  83, 231, 202,   5, 200,  23, 222, 245,  74,  91,  42, 237, // S.......J[*.\n 126,  28,  22, 219, 185, 110,  74, 112,  70, 238, 154, 166, // ~....nJpF...\n  89,  64, 174, 171,  70,  49, 108, 208, 107, 192, 218, 141, // Y@..F1l.k...\n  18,  10, 241, 119, 197, 182,  24,  70,  77,  90, 218, 113, // ...w...FMZ.q\n 241,  86, 145,  78,  73, 101, 122, 218, 192,  24,  63, 143, // .V.NIez...?.\n  91, 213,  74,  96, 139,  49, 136,  36, 225,  92, 166, 163, // [.J`.1.$....\n  66, 184,  88,  77, 155, 151, 131,  86,  39, 201, 176,  36, // B.XM...V'..$\n  99,  44, 230,  37, 205, 160, 195, 223,   2, 186, 105, 204, // c,.%......i.\n  68,  83, 198,  79, 198, 229, 114,  23, 189, 174, 166, 165, // DS.O..r.....\n 103,  82,  82, 252,  92,  73, 156,  51, 234, 150, 149, 253, // gRR..I.3....\n 229, 179,  77,  23,  13, 203, 161,  40,  86, 163, 213,  43, // ..M....(V..+\n  55, 220,   2, 115, 143, 180, 177, 252,  53, 222, 189,  44, // 7..s....5..,\n 189,  30, 115, 175, 197,  22,   0,  72,   0, 233, 184,  76, // ..s....H...L\n 206, 156, 217,  99,  69, 118,  88,  21, 193, 181,  69, 232, // ...cEvX...E.\n 138,  44, 193, 126, 130, 155, 229, 162, 149, 189,  63, 166, // .,.~......?.\n 190, 109, 139, 125, 155, 147,  54, 238, 173,  87,  92,  90, // .m.}..6..W.Z\n 228,  16,  75,  50, 110, 122,  65,  81,   2,  46, 157, 238, // ..K2nzAQ....\n  73,  45,  84, 243, 178, 216, 108, 131,  84, 122, 202,  62, // I-T...l.Tz.>\n  82, 102,  53,  76, 247,  11, 203, 208,  90,   0, 251, 237, // Rf5L....Z...\n  44, 132,  66, 114, 251, 230,  89,   9,  61, 233, 201,  42, // ,.Br..Y.=..*\n 183, 139, 233, 148, 178,  71, 132,  89, 141,  14, 229, 150, // .....G.Y....\n  43,  52,  53,  74,  74, 210, 220, 120, 102,  26, 108,  67, // +45JJ..xf.lC\n 113,  20,  29, 155, 158, 228, 107,  39, 196,  72, 139, 175, // q.....k'.H..\n 229, 176,  44, 105,   5,  92,  16,  56, 175, 225, 222, 199, // ..,i...8....\n 148,  55, 108, 148,  26,  28, 237,   6, 246, 244, 248, 163, // .7l.........\n 119, 163, 171,  55,  18,  98,  60, 203, 192, 102,  80,  68, // w..7.b<..fPD\n 241,  40, 117,  42, 213,  89, 211,  30,  17, 231,  35, 202, // .(u*.Y....#.\n 157, 120, 255, 186,  46,  46, 234,   1, 157,  57, 188,  87, // .x.......9.W\n 152,  65,  59, 139,  38, 160,  69,  34, 203, 208, 187, 220, // .A;.&.E\"....\n 177,  91,  79,  69, 102, 220, 185,  35,  62,  81, 226,  29, // .[OEf..#>Q..\n 238, 219,  24,  60, 217, 220, 155,  41, 208, 149, 141,  51, // ...<...)...3\n  90, 213, 243,   6, 173, 205, 168,  69, 107, 166, 127, 148, // Z......Ek...\n  65,  88, 220,  35, 247,   7, 165, 252, 240, 160,  60, 185, // AX.#......<.\n 232,  80,  51, 209, 131, 236,  35, 212, 149,  30, 106,  45, // .P3...#...j-\n 253, 219, 210, 208, 245, 125, 178, 133,  33, 233,  70, 121, // .....}..!.Fy\n 159, 163, 224,  79, 197, 234, 241, 158, 252, 212,  72, 197, // ...O......H.\n 253, 163,  83, 224, 124,  43, 172, 251,  77,  28, 193,  21, // ..S.|+..M...\n 153, 105,  70, 139, 127, 126,  63, 170,  87, 208, 173, 192, // .iF..~?.W...\n 235,  43, 152,   6, 241,  73, 150,  59, 221,   6,  55,  13, // .+...I.;..7.\n  87, 231, 148, 200,  66,  98, 151, 165, 155,  77, 148,  90, // W...Bb...M.Z\n 135, 212, 115, 145,  22,  69,  72, 237,  66, 102,  91, 134, // ..s..EH.Bf[.\n 240, 115,   8, 111,  54, 139,  90, 219, 144,  41, 159,  23, // .s.o6.Z..)..\n 165,  54,  81,  38, 154, 171,  12, 225, 167, 229,  88,  79, // .6Q&......XO\n  33,  83,  44, 167,  42,  66,  38, 143, 166, 138,  87,  95, // !S,.*B&...W_\n  78,  21, 237,  62,  15, 245, 163,   3, 198,  41, 249,  22, // N..>.....)..\n 221,  74,  89, 145, 225, 105, 252, 142, 224,  15,  15, 235, // .JY..i......\n  64, 244, 132, 205, 183, 254, 228,  94, 227,  82, 244,  50, // @......^.R.2\n  95, 112, 249,  84, 201, 201,  61,  74, 185, 212,   5,  63, // _p.T..=J...?\n 252,  15, 225, 232,  67, 124,  39,   7,   0,   0, 0 // ....C|'...\n};\nstatic const unsigned char v8[] = {\n  42,  32, 123,  32,  98, 111, 120,  45, 115, 105, 122, 105, // * { box-sizi\n 110, 103,  58,  32,  98, 111, 114, 100, 101, 114,  45,  98, // ng: border-b\n 111, 120,  59,  32, 125,  10, 104, 116, 109, 108,  44,  32, // ox; }.html, \n  98, 111, 100, 121,  32, 123,  32, 109,  97, 114, 103, 105, // body { margi\n 110,  58,  32,  48,  59,  32, 112,  97, 100, 100, 105, 110, // n: 0; paddin\n 103,  58,  32,  48,  59,  32, 104, 101, 105, 103, 104, 116, // g: 0; height\n  58,  32,  49,  48,  48,  37,  59,  32, 102, 111, 110, 116, // : 100%; font\n  58,  32,  49,  54, 112, 120,  32, 115,  97, 110, 115,  45, // : 16px sans-\n 115, 101, 114, 105, 102,  59,  32, 125,  10, 115, 101, 108, // serif; }.sel\n 101,  99, 116,  44,  32, 105, 110, 112, 117, 116,  44,  32, // ect, input, \n 108,  97,  98, 101, 108,  58,  58,  98, 101, 102, 111, 114, // label::befor\n 101,  44,  32, 116, 101, 120, 116,  97, 114, 101,  97,  32, // e, textarea \n 123,  32, 111, 117, 116, 108, 105, 110, 101,  58,  32, 110, // { outline: n\n 111, 110, 101,  59,  32,  98, 111, 120,  45, 115, 104,  97, // one; box-sha\n 100, 111, 119,  58, 110, 111, 110, 101,  32,  33, 105, 109, // dow:none !im\n 112, 111, 114, 116,  97, 110, 116,  59,  32,  98, 111, 114, // portant; bor\n 100, 101, 114,  58,  32,  49, 112, 120,  32, 115, 111, 108, // der: 1px sol\n 105, 100,  32,  35,  99,  99,  99,  32,  33, 105, 109, 112, // id #ccc !imp\n 111, 114, 116,  97, 110, 116,  59,  32, 125,  10,  99, 111, // ortant; }.co\n 100, 101,  44,  32, 112, 114, 101,  32, 123,  32,  99, 111, // de, pre { co\n 108, 111, 114,  58,  32,  35,  51,  55,  51,  59,  32, 102, // lor: #373; f\n 111, 110, 116,  45, 102,  97, 109, 105, 108, 121,  58,  32, // ont-family: \n 109, 111, 110, 111, 115, 112,  97,  99, 101,  59,  32, 102, // monospace; f\n 111, 110, 116,  45, 119, 101, 105, 103, 104, 116,  58,  32, // ont-weight: \n  98, 111, 108, 100, 101, 114,  59,  32, 102, 111, 110, 116, // bolder; font\n  45, 115, 105, 122, 101,  58,  32, 115, 109,  97, 108, 108, // -size: small\n 101, 114,  59,  32,  98,  97,  99, 107, 103, 114, 111, 117, // er; backgrou\n 110, 100,  58,  32,  35, 100, 100, 100,  59,  32, 112,  97, // nd: #ddd; pa\n 100, 100, 105, 110, 103,  58,  32,  48,  46,  49, 101, 109, // dding: 0.1em\n  32,  48,  46,  51, 101, 109,  59,  32,  98, 111, 114, 100, //  0.3em; bord\n 101, 114,  45, 114,  97, 100, 105, 117, 115,  58,  32,  48, // er-radius: 0\n  46,  50, 101, 109,  59,  32, 125,  10, 116, 101, 120, 116, // .2em; }.text\n  97, 114, 101,  97,  44,  32, 105, 110, 112, 117, 116,  44, // area, input,\n  32,  46,  97, 100, 100, 111, 110,  32, 123,  32, 102, 111, //  .addon { fo\n 110, 116,  45, 115, 105, 122, 101,  58,  32,  49,  53, 112, // nt-size: 15p\n 120,  59,  32,  98, 111, 114, 100, 101, 114,  58,  32,  49, // x; border: 1\n 112, 120,  32, 115, 111, 108, 105, 100,  32,  35,  99,  99, // px solid #cc\n  99,  59,  32, 112,  97, 100, 100, 105, 110, 103,  58,  32, // c; padding: \n  48,  46,  53, 101, 109,  59,  32, 125,  10,  97,  44,  32, // 0.5em; }.a, \n  97,  58, 118, 105, 115, 105, 116, 101, 100,  44,  32,  97, // a:visited, a\n  58,  97,  99, 116, 105, 118, 101,  32, 123,  32,  99, 111, // :active { co\n 108, 111, 114,  58,  32,  35,  53,  53, 102,  59,  32, 125, // lor: #55f; }\n  10,  46,  97, 100, 100, 111, 110,  32, 123,  32,  98,  97, // ..addon { ba\n  99, 107, 103, 114, 111, 117, 110, 100,  58,  32,  35, 101, // ckground: #e\n 101, 101,  59,  32,  32, 109, 105, 110,  45, 119, 105, 100, // ee;  min-wid\n 116, 104,  58,  32,  57, 101, 109,  59, 125,  10,  46,  98, // th: 9em;}..b\n 116, 110,  32, 123,  10,  32,  32,  98,  97,  99, 107, 103, // tn {.  backg\n 114, 111, 117, 110, 100,  58,  32,  35,  99,  99,  99,  59, // round: #ccc;\n  32,  98, 111, 114, 100, 101, 114,  45, 114,  97, 100, 105, //  border-radi\n 117, 115,  58,  32,  48,  46,  51, 101, 109,  59,  32,  98, // us: 0.3em; b\n 111, 114, 100, 101, 114,  58,  32,  48,  59,  32,  99, 111, // order: 0; co\n 108, 111, 114,  58,  32,  35, 102, 102, 102,  59,  32,  99, // lor: #fff; c\n 117, 114, 115, 111, 114,  58,  32, 112, 111, 105, 110, 116, // ursor: point\n 101, 114,  59,  10,  32,  32, 100, 105, 115, 112, 108,  97, // er;.  displa\n 121,  58,  32, 105, 110, 108, 105, 110, 101,  45,  98, 108, // y: inline-bl\n 111,  99, 107,  59,  32, 112,  97, 100, 100, 105, 110, 103, // ock; padding\n  58,  32,  48,  46,  54, 101, 109,  32,  50, 101, 109,  59, // : 0.6em 2em;\n  32, 102, 111, 110, 116,  45, 119, 101, 105, 103, 104, 116, //  font-weight\n  58,  32,  98, 111, 108, 100, 101, 114,  59,  10, 125,  10, // : bolder;.}.\n  46,  98, 116, 110,  91, 100, 105, 115,  97,  98, 108, 101, // .btn[disable\n 100,  93,  32, 123,  32, 111, 112,  97,  99, 105, 116, 121, // d] { opacity\n  58,  32,  48,  46,  53,  59,  32,  99, 117, 114, 115, 111, // : 0.5; curso\n 114,  58,  32,  97, 117, 116, 111,  59, 125,  10,  46, 115, // r: auto;}..s\n 109, 111, 111, 116, 104,  32, 123,  32, 116, 114,  97, 110, // mooth { tran\n 115, 105, 116, 105, 111, 110,  58,  32,  97, 108, 108,  32, // sition: all \n  46,  50, 115,  59,  32, 125,  10,  46,  99, 111, 110, 116, // .2s; }..cont\n  97, 105, 110, 101, 114,  32, 123,  32, 109,  97, 114, 103, // ainer { marg\n 105, 110,  58,  32,  48,  32,  50,  48, 112, 120,  59,  32, // in: 0 20px; \n 119, 105, 100, 116, 104,  58,  32,  97, 117, 116, 111,  59, // width: auto;\n  32, 125,  10,  46, 100,  45, 102, 108, 101, 120,  32, 123, //  }..d-flex {\n  32, 100, 105, 115, 112, 108,  97, 121,  58,  32, 102, 108, //  display: fl\n 101, 120,  59,  32, 125,  10,  46, 100,  45, 110, 111, 110, // ex; }..d-non\n 101,  32, 123,  32, 100, 105, 115, 112, 108,  97, 121,  58, // e { display:\n  32, 110, 111, 110, 101,  59,  32, 125,  10,  46,  98, 111, //  none; }..bo\n 114, 100, 101, 114,  32, 123,  32,  98, 111, 114, 100, 101, // rder { borde\n 114,  58,  32,  49, 112, 120,  32, 115, 111, 108, 105, 100, // r: 1px solid\n  32,  35, 100, 100, 100,  59,  32, 125,  10,  46, 114, 111, //  #ddd; }..ro\n 117, 110, 100, 101, 100,  32, 123,  32,  98, 111, 114, 100, // unded { bord\n 101, 114,  45, 114,  97, 100, 105, 117, 115,  58,  32,  48, // er-radius: 0\n  46,  53, 101, 109,  59,  32, 125,  10,  46, 110, 111, 119, // .5em; }..now\n 114,  97, 112,  32, 123,  32, 119, 104, 105, 116, 101,  45, // rap { white-\n 115, 112,  97,  99, 101,  58,  32, 110, 111, 119, 114,  97, // space: nowra\n 112,  59,  32, 125,  10,  46, 109, 115, 103,  32, 123,  32, // p; }..msg { \n  98,  97,  99, 107, 103, 114, 111, 117, 110, 100,  58,  32, // background: \n  35, 100, 101, 102,  59,  32,  98, 111, 114, 100, 101, 114, // #def; border\n  45, 108, 101, 102, 116,  58,  32,  53, 112, 120,  32, 115, // -left: 5px s\n 111, 108, 105, 100,  32,  35,  53,  57, 100,  59,  32, 112, // olid #59d; p\n  97, 100, 100, 105, 110, 103,  58,  32,  48,  46,  53, 101, // adding: 0.5e\n 109,  59,  32, 102, 111, 110, 116,  45, 115, 105, 122, 101, // m; font-size\n  58,  32,  57,  48,  37,  59,  32, 109,  97, 114, 103, 105, // : 90%; margi\n 110,  58,  32,  49, 101, 109,  32,  48,  59,  32, 125,  10, // n: 1em 0; }.\n  46, 115, 101,  99, 116, 105, 111, 110,  32, 123,  32, 109, // .section { m\n  97, 114, 103, 105, 110,  58,  32,  48,  32,  49, 101, 109, // argin: 0 1em\n  59,  32, 125,  10,  46, 116, 111, 112, 105,  99,  44,  32, // ; }..topic, \n  46, 100,  97, 116,  97,  44,  32,  46, 113, 111, 115,  32, // .data, .qos \n 123,  32,  32, 112,  97, 100, 100, 105, 110, 103,  58,  32, // {  padding: \n  48,  46,  50, 101, 109,  32,  48,  46,  53, 101, 109,  59, // 0.2em 0.5em;\n  32,  98, 111, 114, 100, 101, 114,  45, 114,  97, 100, 105, //  border-radi\n 117, 115,  58,  32,  48,  46,  52, 101, 109,  59,  32, 109, // us: 0.4em; m\n  97, 114, 103, 105, 110,  45, 114, 105, 103, 104, 116,  58, // argin-right:\n  32,  48,  46,  53, 101, 109,  59,  32,  32, 125,  10,  46, //  0.5em;  }..\n 113, 111, 115,  32, 123,  32,  98,  97,  99, 107, 103, 114, // qos { backgr\n 111, 117, 110, 100,  58,  32,  35, 101, 102,  97,  59,  32, // ound: #efa; \n 125,  10,  46, 116, 111, 112, 105,  99,  32, 123,  32,  98, // }..topic { b\n  97,  99, 107, 103, 114, 111, 117, 110, 100,  58,  32,  35, // ackground: #\n 102, 101,  97,  59,  32, 125,  10,  46, 100,  97, 116,  97, // fea; }..data\n  32, 123,  32,  98,  97,  99, 107, 103, 114, 111, 117, 110, //  { backgroun\n 100,  58,  32,  35,  97, 101, 102,  59,  32, 125,  10,  10, // d: #aef; }..\n  47,  42,  32,  71, 114, 105, 100,  32,  42,  47,  10,  46, // /* Grid */..\n 114, 111, 119,  32, 123,  32, 100, 105, 115, 112, 108,  97, // row { displa\n 121,  58,  32, 102, 108, 101, 120,  59,  32, 102, 108, 101, // y: flex; fle\n 120,  45, 119, 114,  97, 112,  58,  32, 119, 114,  97, 112, // x-wrap: wrap\n  59,  32, 125,  10,  46,  99, 111, 108,  32, 123,  32, 109, // ; }..col { m\n  97, 114, 103, 105, 110,  58,  32,  48,  59,  32, 112,  97, // argin: 0; pa\n 100, 100, 105, 110, 103,  58,  32,  48,  59,  32, 111, 118, // dding: 0; ov\n 101, 114, 102, 108, 111, 119,  58,  32,  97, 117, 116, 111, // erflow: auto\n  59,  32, 125,  10,  46,  99, 111, 108,  45,  49,  50,  32, // ; }..col-12 \n 123,  32, 119, 105, 100, 116, 104,  58,  32,  49,  48,  48, // { width: 100\n  37,  59,  32, 125,  10,  46,  99, 111, 108,  45,  49,  49, // %; }..col-11\n  32, 123,  32, 119, 105, 100, 116, 104,  58,  32,  57,  49, //  { width: 91\n  46,  54,  54,  37,  59,  32, 125,  10,  46,  99, 111, 108, // .66%; }..col\n  45,  49,  48,  32, 123,  32, 119, 105, 100, 116, 104,  58, // -10 { width:\n  32,  56,  51,  46,  51,  51,  37,  59,  32, 125,  10,  46, //  83.33%; }..\n  99, 111, 108,  45,  57,  32, 123,  32, 119, 105, 100, 116, // col-9 { widt\n 104,  58,  32,  55,  53,  37,  59,  32, 125,  10,  46,  99, // h: 75%; }..c\n 111, 108,  45,  56,  32, 123,  32, 119, 105, 100, 116, 104, // ol-8 { width\n  58,  32,  54,  54,  46,  54,  54,  37,  59,  32, 125,  10, // : 66.66%; }.\n  46,  99, 111, 108,  45,  55,  32, 123,  32, 119, 105, 100, // .col-7 { wid\n 116, 104,  58,  32,  53,  56,  46,  51,  51,  37,  59,  32, // th: 58.33%; \n 125,  10,  46,  99, 111, 108,  45,  54,  32, 123,  32, 119, // }..col-6 { w\n 105, 100, 116, 104,  58,  32,  53,  48,  37,  59,  32, 125, // idth: 50%; }\n  10,  46,  99, 111, 108,  45,  53,  32, 123,  32, 119, 105, // ..col-5 { wi\n 100, 116, 104,  58,  32,  52,  49,  46,  54,  54,  37,  59, // dth: 41.66%;\n  32, 125,  10,  46,  99, 111, 108,  45,  52,  32, 123,  32, //  }..col-4 { \n 119, 105, 100, 116, 104,  58,  32,  51,  51,  46,  51,  51, // width: 33.33\n  37,  59,  32, 125,  10,  46,  99, 111, 108,  45,  51,  32, // %; }..col-3 \n 123,  32, 119, 105, 100, 116, 104,  58,  32,  50,  53,  37, // { width: 25%\n  59,  32, 125,  10,  46,  99, 111, 108,  45,  50,  32, 123, // ; }..col-2 {\n  32, 119, 105, 100, 116, 104,  58,  32,  49,  54,  46,  54, //  width: 16.6\n  54,  37,  59,  32, 125,  10,  46,  99, 111, 108,  45,  49, // 6%; }..col-1\n  32, 123,  32, 119, 105, 100, 116, 104,  58,  32,  56,  46, //  { width: 8.\n  51,  51,  37,  59,  32, 125,  10,  64, 109, 101, 100, 105, // 33%; }.@medi\n  97,  32,  40, 109, 105, 110,  45, 119, 105, 100, 116, 104, // a (min-width\n  58,  32,  49,  51,  49,  48, 112, 120,  41,  32, 123,  32, // : 1310px) { \n  46,  99, 111, 110, 116,  97, 105, 110, 101, 114,  32, 123, // .container {\n  32, 109,  97, 114, 103, 105, 110,  58,  32,  97, 117, 116, //  margin: aut\n 111,  59,  32, 119, 105, 100, 116, 104,  58,  32,  49,  50, // o; width: 12\n  55,  48, 112, 120,  59,  32, 125,  32, 125,  10,  64, 109, // 70px; } }.@m\n 101, 100, 105,  97,  32,  40, 109,  97, 120,  45, 119, 105, // edia (max-wi\n 100, 116, 104,  58,  32,  57,  50,  48, 112, 120,  41,  32, // dth: 920px) \n 123,  32,  46, 114, 111, 119,  32,  46,  99, 111, 108,  32, // { .row .col \n 123,  32, 119, 105, 100, 116, 104,  58,  32,  49,  48,  48, // { width: 100\n  37,  59,  32, 125,  32, 125,  10, 0 // %; } }.\n};\n\nstatic const struct packed_file {\n  const char *name;\n  const unsigned char *data;\n  size_t size;\n  time_t mtime;\n} packed_files[] = {\n  {\"/web_root/preact.min.js.gz\", v1, sizeof(v1), 1660165083},\n  {\"/web_root/main.js.gz\", v2, sizeof(v2), 1660165083},\n  {\"/web_root/main.js\", v3, sizeof(v3), 1660586478},\n  {\"/web_root/preact.min.js\", v4, sizeof(v4), 1660586478},\n  {\"/web_root/index.html\", v5, sizeof(v5), 1660586478},\n  {\"/web_root/index.html.gz\", v6, sizeof(v6), 1660165083},\n  {\"/web_root/style.css.gz\", v7, sizeof(v7), 1660165083},\n  {\"/web_root/style.css\", v8, sizeof(v8), 1660586478},\n  {NULL, NULL, 0, 0}\n};\n\nstatic int scmp(const char *a, const char *b) {\n  while (*a && (*a == *b)) a++, b++;\n  return *(const unsigned char *) a - *(const unsigned char *) b;\n}\nconst char *mg_unlist(size_t no) {\n  return packed_files[no].name;\n}\nconst char *mg_unpack(const char *name, size_t *size, time_t *mtime) {\n  const struct packed_file *p;\n  for (p = packed_files; p->name != NULL; p++) {\n    if (scmp(p->name, name) != 0) continue;\n    if (size != NULL) *size = p->size - 1;\n    if (mtime != NULL) *mtime = p->mtime;\n    return (const char *) p->data;\n  }\n  return NULL;\n}\n"
  },
  {
    "path": "tutorials/core/embedded-filesystem/web_root/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <meta name=\"description\" content=\"Mongoose Embedded Filesytem example\" />\n    <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n        <title>Mongoose Embedded Filesytem example</title>\n    <link rel=\"stylesheet\" href=\"style.css\" />\n  </head>\n  <body></body>\n  <script type=\"module\" src=\"main.js\"></script>\n</html>\n"
  },
  {
    "path": "tutorials/core/embedded-filesystem/web_root/main.js",
    "content": "'use strict';\nimport { h, html, render } from './preact.min.js';\n\n\nconst X = function () {\n\n  return html`\n  <div class=\"container\">\n    <h2 class=\"section\">ABOUT US</h2>\n    <div class=\"row\">\n      <div class=\"col-7\">\n        <p>      \n          Cesanta Software Ltd. is headquartered in Dublin, Republic of Ireland.\n        </p>\n        <p></p>\n        Our story roots back to 2004, when Mongoose Web Server Library development started. <br>\n\n        As Mongoose Web Server grew in popularity and matured over the following years, in 2013 Cesanta was established to continue its development and \n        provide support to our valued customers.\n        </p>\n        <p>We are proud to have among our customers many <i>Fortune 500</i> companies as well as medium and small size businesses.\n          Security and quality of our solutions is a paramount for us and the fact that Mongoose Web Server is used by NASA aboard the International Space Station is \n          the best confirmation to it.</p>\n          <p>Since 2013, Cesanta has expanded its product portfolio. We develop and distribute embedded software and hardware with focus on connected products and the Internet of Things.</p>\n\n      </div>\n    </div>\n  </div>\n`;\n};\n\nconst Y = function () {\n\n  return html`\n  <div class=\"container\">\n    <h3 class=\"section\">Among our products are:</h3>\n    <div class=\"row\">\n      <div class=\"col-7\">\n       <ul>\n         <li>\n           <a href=\"https://mongoose.ws/\">Mongoose Web Server</a>\n           - an embedded web server and networking library\n         </li>\n         <li>\n           <a href=\"https://vcon.io/\">VCON.io</a>\n           - Arduino-compatible boards with built-in firmware OTA updates\n           and management dashboard\n         </li>\n         <li>\n           <a href=\"https://mdash.net/\">mDash.net</a>\n           - an all-in-one IoT Platform\n         </li>\n         <li>\n           <a href=\"https://mongoose-os.com\">Mongoose OS</a>\n           - an operating system for low-power microcontrollers\n         </li>\n\n         <li>\n           <a href=\"https://github.com/cesanta/mjs\">mJS</a>\n           - an embedded JavaScript engine for C/C++\n         </li>\n       </ul>\n      </div>\n      <div class=\"col-6\">\n        <p><b>Our solutions are:</b></p>\n        <ul>\n          <li>integrated into thousands of commercial products</li>\n          <li>deployed to hundreds of millions devices in production environments</li>\n        </ul>\n      </div>\n    </div>\n  </div>\n`;\n};\n\nconst App = function (props) {\n\n  return html`\n<h1>Basic Embedded Filesystem demo</h1>\n<div>\n  ${h(X)}\n</div>\n<div>\n  ${h(Y)}\n</div>`;\n};\n\nwindow.onload = () => render(h(App), document.body);\n"
  },
  {
    "path": "tutorials/core/embedded-filesystem/web_root/style.css",
    "content": "* { box-sizing: border-box; }\nhtml, body { margin: 0; padding: 0; height: 100%; font: 16px sans-serif; }\nselect, input, label::before, textarea { outline: none; box-shadow:none !important; border: 1px solid #ccc !important; }\ncode, pre { color: #373; font-family: monospace; font-weight: bolder; font-size: smaller; background: #ddd; padding: 0.1em 0.3em; border-radius: 0.2em; }\ntextarea, input, .addon { font-size: 15px; border: 1px solid #ccc; padding: 0.5em; }\na, a:visited, a:active { color: #55f; }\n.addon { background: #eee;  min-width: 9em;}\n.btn {\n  background: #ccc; border-radius: 0.3em; border: 0; color: #fff; cursor: pointer;\n  display: inline-block; padding: 0.6em 2em; font-weight: bolder;\n}\n.btn[disabled] { opacity: 0.5; cursor: auto;}\n.smooth { transition: all .2s; }\n.container { margin: 0 20px; width: auto; }\n.d-flex { display: flex; }\n.d-none { display: none; }\n.border { border: 1px solid #ddd; }\n.rounded { border-radius: 0.5em; }\n.nowrap { white-space: nowrap; }\n.msg { background: #def; border-left: 5px solid #59d; padding: 0.5em; font-size: 90%; margin: 1em 0; }\n.section { margin: 0 1em; }\n.topic, .data, .qos {  padding: 0.2em 0.5em; border-radius: 0.4em; margin-right: 0.5em;  }\n.qos { background: #efa; }\n.topic { background: #fea; }\n.data { background: #aef; }\n\n/* Grid */\n.row { display: flex; flex-wrap: wrap; }\n.col { margin: 0; padding: 0; overflow: auto; }\n.col-12 { width: 100%; }\n.col-11 { width: 91.66%; }\n.col-10 { width: 83.33%; }\n.col-9 { width: 75%; }\n.col-8 { width: 66.66%; }\n.col-7 { width: 58.33%; }\n.col-6 { width: 50%; }\n.col-5 { width: 41.66%; }\n.col-4 { width: 33.33%; }\n.col-3 { width: 25%; }\n.col-2 { width: 16.66%; }\n.col-1 { width: 8.33%; }\n@media (min-width: 1310px) { .container { margin: auto; width: 1270px; } }\n@media (max-width: 920px) { .row .col { width: 100%; } }\n"
  },
  {
    "path": "tutorials/core/memory/o1heap/Makefile",
    "content": "SOURCES = main.c mongoose.c       # Source code files\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# O(1) Heap\nSOURCES += o1heap/o1heap/o1heap.c\nCFLAGS += -Io1heap/o1heap\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += -DMG_ENABLE_CUSTOM_CALLOC\n\nifeq ($(OS),Windows_NT)\n  # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD\n  PROG ?= example.exe                 # Use .exe suffix for the binary\n  CC = gcc                            # Use MinGW gcc compiler\n  CFLAGS += -lws2_32                  # Link against Winsock library\n  DELETE = cmd /C del /f /q /s        # Command prompt command to delete files\nelse\n  # Mac, Linux\n  PROG ?= example\n  DELETE = rm -rf\nendif\n\nall: $(PROG)\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) -o $@\n\no1heap/o1heap/o1heap.c:  # O(1) Heap sources\n\tgit clone --depth 1 -b 2.1.0 https://github.com/pavel-kirienko/o1heap.git\n\nclean:\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM\n"
  },
  {
    "path": "tutorials/core/memory/o1heap/main.c",
    "content": "// Copyright (c) 2025 Cesanta Software Limited\n// All rights reserved\n\n#include \"mongoose.h\"\n#include \"o1heap.h\"\n\n#define POOL_SIZE (5 * MG_IO_SIZE)\n\nO1HeapInstance *s_mem;\n\n// memory allocation\nvoid *mg_calloc(size_t count, size_t size) {\n  size_t bytes = count * size;\n  void *ptr = o1heapAllocate(s_mem, bytes);\n  if (ptr != NULL) memset(ptr, 0, bytes);\n  if (ptr != NULL) MG_DEBUG((\"%lu bytes @%p\", bytes, ptr));\n  if (ptr == NULL) MG_ERROR((\"Failed to allocate %lu bytes\", bytes));\n  return ptr;\n}\n\nvoid mg_free(void *ptr) {\n  o1heapFree(s_mem, ptr);\n  if (ptr != NULL) MG_DEBUG((\"block @%p\", ptr));\n}\n\n// HTTP request callback\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    if (mg_match(hm->uri, mg_str(\"/hi\"), NULL)) {\n      mg_http_reply(c, 200, \"Host: foo.com\\r\\n\", \"hi\\n\");\n    } else if (mg_match(hm->uri, mg_str(\"/echo\"), NULL)) {\n      mg_http_reply(c, 200, \"\", \"%.*s\", (int) hm->body.len, hm->body.buf);\n    } else if (mg_match(hm->uri, mg_str(\"/stats\"), NULL)) {\n      struct mg_connection *t;\n      mg_printf(c, \"HTTP/1.1 200 OK\\r\\nTransfer-Encoding: chunked\\r\\n\\r\\n\");\n      mg_http_printf_chunk(c, \"ID PROTO TYPE      LOCAL           REMOTE\\n\");\n      for (t = c->mgr->conns; t != NULL; t = t->next) {\n        mg_http_printf_chunk(c, \"%-3lu %4s %s %M %M\\n\", t->id,\n                             t->is_udp ? \"UDP\" : \"TCP\",\n                             t->is_listening  ? \"LISTENING\"\n                             : t->is_accepted ? \"ACCEPTED \"\n                                              : \"CONNECTED\",\n                             mg_print_ip, &t->loc, mg_print_ip, &t->rem);\n      }\n      mg_http_printf_chunk(c, \"\");  // Don't forget the last empty chunk\n    } else {\n      struct mg_http_serve_opts opts;\n      memset(&opts, 0, sizeof(opts));\n      opts.root_dir = \".\";\n      mg_http_serve_dir(c, ev_data, &opts);\n    }\n  }\n}\n\nint main(void) {\n  struct mg_mgr mgr;\n\n  void *pool = malloc(POOL_SIZE + O1HEAP_ALIGNMENT);\n  void *aligned = (void *) (((uintptr_t) pool) & ~(O1HEAP_ALIGNMENT - 1));\n  O1HeapDiagnostics d;\n  s_mem = o1heapInit(aligned, POOL_SIZE);\n  d = o1heapGetDiagnostics(s_mem);\n  MG_INFO(\n      (\"Created aligned %lu-byte pool @%p, out of a %lu-byte allocated system \"\n       \"memory pool\",\n       d.capacity, s_mem, POOL_SIZE));\n\n  mg_mgr_init(&mgr);        // Initialise event manager\n  mg_log_set(MG_LL_DEBUG);  // Set debug log level\n  mg_http_listen(&mgr, \"http://localhost:8000\", fn, NULL);  // Create listener\n  for (;;) {                                                // Event loop\n    mg_mgr_poll(&mgr, 1000);\n  }\n  mg_mgr_free(&mgr);\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/core/multi-threaded/Makefile",
    "content": "SOURCES = main.c mongoose.c       # Source code files\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE +=\n\nifeq ($(OS),Windows_NT)\n  # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD\n  PROG ?= example.exe                 # Use .exe suffix for the binary\n  CC = gcc                            # Use MinGW gcc compiler\n  CFLAGS += -lws2_32                  # Link against Winsock library\n  CFLAGS += -Wno-cast-function-type   # Thread functions return void instead of void *\n  DELETE = cmd /C del /f /q /s        # Command prompt command to delete files\nelse\n  # Mac, Linux\n  PROG ?= example\n  CFLAGS += -lpthread                 # Link against POSIX threads library\n  DELETE = rm -rf\nendif\n\nall: $(PROG)\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) -o $@\n\nclean:\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM\n"
  },
  {
    "path": "tutorials/core/multi-threaded/README.md",
    "content": "See detailed tutorial at https://mongoose.ws/tutorials/core/multi-threaded/\n"
  },
  {
    "path": "tutorials/core/multi-threaded/main.c",
    "content": "// Copyright (c) 2020-2023 Cesanta Software Limited\n// All rights reserved\n//\n// Multithreading example.\n// For each incoming request, we spawn a separate thread, that sleeps for\n// some time to simulate long processing time, produces an output and\n// sends that output to the parent connection.\n\n#include \"mongoose.h\"\n\nstatic void start_thread(void *(*f)(void *), void *p) {\n#ifdef _WIN32\n  _beginthread((void(__cdecl *)(void *)) f, 0, p);\n#else\n#define closesocket(x) close(x)\n#include <pthread.h>\n  pthread_t thread_id = (pthread_t) 0;\n  pthread_attr_t attr;\n  (void) pthread_attr_init(&attr);\n  (void) pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\n  pthread_create(&thread_id, &attr, f, p);\n  pthread_attr_destroy(&attr);\n#endif\n}\n\nstruct thread_data {\n  struct mg_mgr *mgr;\n  unsigned long conn_id;  // Parent connection ID\n  struct mg_str message;  // Original HTTP request\n};\n\nstatic void *thread_function(void *param) {\n  struct thread_data *p = (struct thread_data *) param;\n  sleep(2);                                 // Simulate long execution\n  mg_wakeup(p->mgr, p->conn_id, \"hi!\", 3);  // Respond to parent\n  mg_free((void *) p->message.buf);         // Free all resources that were\n  free(p);                                  // passed to us\n  return NULL;\n}\n\n// HTTP request callback\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    if (mg_match(hm->uri, mg_str(\"/fast\"), NULL)) {\n      // Single-threaded code path, for performance comparison\n      // The /fast URI responds immediately\n      mg_http_reply(c, 200, \"Host: foo.com\\r\\n\", \"hi\\n\");\n    } else {\n      // Multithreading code path\n      struct thread_data *data =\n          (struct thread_data *) calloc(1, sizeof(*data));  // Worker owns it\n      data->message = mg_strdup(hm->message); // Pass message\n      data->conn_id = c->id;\n      data->mgr = c->mgr;\n      start_thread(thread_function, data);  // Start thread and pass data\n    }\n  } else if (ev == MG_EV_WAKEUP) {\n    struct mg_str *data = (struct mg_str *) ev_data;\n    mg_http_reply(c, 200, \"\", \"Result: %.*s\\n\", data->len, data->buf);\n  }\n}\n\nint main(void) {\n  struct mg_mgr mgr;\n  mg_mgr_init(&mgr);        // Initialise event manager\n  mg_log_set(MG_LL_DEBUG);  // Set debug log level\n  mg_http_listen(&mgr, \"http://localhost:8000\", fn, NULL);  // Create listener\n  mg_wakeup_init(&mgr);  // Initialise wakeup socket pair\n  for (;;) {             // Event loop\n    mg_mgr_poll(&mgr, 1000);\n  }\n  mg_mgr_free(&mgr);\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/core/multi-threaded-12m/Makefile",
    "content": "SOURCES = main.c mongoose.c       # Source code files\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE +=\n\nifeq ($(OS),Windows_NT)\n  # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD\n  PROG ?= example.exe                 # Use .exe suffix for the binary\n  CC = gcc                            # Use MinGW gcc compiler\n  CFLAGS += -lws2_32                  # Link against Winsock library\n  CFLAGS += -Wno-cast-function-type   # Thread functions return void instead of void *\n  DELETE = cmd /C del /f /q /s        # Command prompt command to delete files\nelse\n  # Mac, Linux\n  PROG ?= example\n  CFLAGS += -lpthread                 # Link against POSIX threads library\n  DELETE = rm -rf\nendif\n\nall: $(PROG)\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) -o $@\n\nclean:\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM\n"
  },
  {
    "path": "tutorials/core/multi-threaded-12m/README.md",
    "content": "See detailed tutorial at https://mongoose.ws/tutorials/core/multi-threaded/\n"
  },
  {
    "path": "tutorials/core/multi-threaded-12m/main.c",
    "content": "// Copyright (c) 2020-2023 Cesanta Software Limited\n// All rights reserved\n//\n// Multithreading example.\n// On creation, we spawn a separate thread that sleeps for\n// some time to simulate some processing time, then produces an output and\n// sends that output to the parent connection.\n// That connection then broadcasts that data to all connected WebSocket\n// connections\n\n#include \"mongoose.h\"\n\nstatic void start_thread(void *(*f)(void *), void *p) {\n#ifdef _WIN32\n  _beginthread((void(__cdecl *)(void *)) f, 0, p);\n#else\n#define closesocket(x) close(x)\n#include <pthread.h>\n  pthread_t thread_id = (pthread_t) 0;\n  pthread_attr_t attr;\n  (void) pthread_attr_init(&attr);\n  (void) pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\n  pthread_create(&thread_id, &attr, f, p);\n  pthread_attr_destroy(&attr);\n#endif\n}\n\nstruct thread_data {\n  struct mg_mgr *mgr;\n  unsigned long conn_id;  // Parent connection ID\n};\n\nstatic void *thread_function(void *param) {\n  struct thread_data *p = (struct thread_data *) param;\n  printf(\"THREAD STARTED\\n\");\n  for (;;) {\n    sleep(2);\n    mg_wakeup(p->mgr, p->conn_id, \"hi!\", 3);  // Send to parent\n  }\n  // Free all resources that were passed to us\n  free(p);\n  return NULL;\n}\n\n// HTTP request callback\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_OPEN && c->is_listening) {\n    // Start worker thread\n    struct thread_data *data = calloc(1, sizeof(*data));  // Worker owns it\n    data->conn_id = c->id;\n    data->mgr = c->mgr;\n    start_thread(thread_function, data);  // Start thread and pass data\n  } else if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    if (mg_match(hm->uri, mg_str(\"/websocket\"), NULL)) {\n      mg_ws_upgrade(c, hm, NULL);  // Upgrade HTTP to Websocket\n      c->data[0] = 'W';            // Set some unique mark on a connection\n    } else {\n      // Serve static files\n      // struct mg_http_serve_opts opts = {.root_dir = s_web_root};\n      // mg_http_serve_dir(c, ev_data, &opts);\n    }\n  } else if (ev == MG_EV_WS_MSG) {\n    // Got websocket frame. Received data is wm->data. Echo it back!\n    struct mg_ws_message *wm = (struct mg_ws_message *) ev_data;\n    mg_ws_send(c, wm->data.buf, wm->data.len, WEBSOCKET_OP_TEXT);\n    mg_iobuf_del(&c->recv, 0, c->recv.len);\n  } else if (ev == MG_EV_WAKEUP) {\n    struct mg_str *data = (struct mg_str *) ev_data;\n    // Broadcast message to all connected websocket clients.\n    // Traverse over all connections\n    for (struct mg_connection *wc = c->mgr->conns; wc != NULL; wc = wc->next) {\n      // Send only to marked connections\n      if (wc->data[0] == 'W')\n        mg_ws_send(wc, data->buf, data->len, WEBSOCKET_OP_TEXT);\n    }\n  }\n}\n\nint main(void) {\n  struct mg_mgr mgr;\n  mg_mgr_init(&mgr);        // Initialise event manager\n  mg_log_set(MG_LL_DEBUG);  // Set debug log level\n  mg_http_listen(&mgr, \"http://localhost:8000\", fn, NULL);  // Create listener\n  mg_wakeup_init(&mgr);  // Initialise wakeup socket pair\n  for (;;) {             // Event loop\n    mg_mgr_poll(&mgr, 1000);\n  }\n  mg_mgr_free(&mgr);\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/core/timers/Makefile",
    "content": "PROG ?= example                   # Program we are building\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c       # Source code files\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += -DMG_ENABLE_LINES\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= example.exe           # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\nendif\n\nall: $(PROG)              # Default target. Build and run program\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)       # Build program from sources\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nclean:                    # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM\n"
  },
  {
    "path": "tutorials/core/timers/README.md",
    "content": "See detailed tutorial at https://mongoose.ws/tutorials/core/timers/\n"
  },
  {
    "path": "tutorials/core/timers/main.c",
    "content": "// Copyright (c) 2020 Cesanta Software Limited\n// All rights reserved\n//\n// Example Websocket server with timers. This is a simple Websocket echo\n// server, which sends a message to all connected clients periodically,\n// using timer API.\n\n#include \"mongoose.h\"\n\nstatic const char *s_listen_on = \"http://localhost:8000\";\nstatic const char *s_web_root = \"web_root\";\n\n// This RESTful server implements the following endpoints:\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    if (mg_match(hm->uri, mg_str(\"/websocket\"), NULL)) {\n      mg_ws_upgrade(c, hm, NULL);  // Upgrade HTTP to Websocket\n      c->data[0] = 'W';           // Set some unique mark on a connection\n    } else {\n      // Serve static files\n      struct mg_http_serve_opts opts = {.root_dir = s_web_root};\n      mg_http_serve_dir(c, ev_data, &opts);\n    }\n  } else if (ev == MG_EV_WS_MSG) {\n    // Got websocket frame. Received data is wm->data. Echo it back!\n    struct mg_ws_message *wm = (struct mg_ws_message *) ev_data;\n    mg_ws_send(c, wm->data.buf, wm->data.len, WEBSOCKET_OP_TEXT);\n    mg_iobuf_del(&c->recv, 0, c->recv.len);\n  }\n}\n\nstatic void timer_fn(void *arg) {\n  struct mg_mgr *mgr = (struct mg_mgr *) arg;\n  // Broadcast \"hi\" message to all connected websocket clients.\n  // Traverse over all connections\n  for (struct mg_connection *c = mgr->conns; c != NULL; c = c->next) {\n    // Send only to marked connections\n    if (c->data[0] == 'W') mg_ws_send(c, \"hi\", 2, WEBSOCKET_OP_TEXT);\n  }\n}\n\nint main(void) {\n  struct mg_mgr mgr;        // Event manager\n  mg_mgr_init(&mgr);        // Initialise event manager\n  mg_log_set(MG_LL_DEBUG);  // Set log level\n  mg_timer_add(&mgr, 1000, MG_TIMER_REPEAT, timer_fn, &mgr);\n  mg_http_listen(&mgr, s_listen_on, fn, NULL);  // Create HTTP listener\n  for (;;) mg_mgr_poll(&mgr, 500);              // Infinite event loop\n  mg_mgr_free(&mgr);                            // Free manager resources\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/core/timers/web_root/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <body>\n    <h1>Websocket test client</h1>\n    <input id=\"url\" type=\"text\" placeholder=\"Type URL\" value=\"ws://localhost:8000/websocket\" style=\"width:20em;\" /> \n    <button id=\"connect\">connect</button>\n    <div style=\"height: 0.3em;\">&nbsp;</div>\n    <input id=\"message\" type=\"text\" placeholder=\"Type message\" style=\"width: 20em;\" /> \n    <button id=\"send\">send message</button>\n    <div style=\"margin-top: 1em;\">Event log:</div>\n    <div id=\"log\" style=\"background: #eee; height: 10em; padding: 0.5em;\"><div>\n  </body>\n  <script>\n    var ws, E = function(id) { return document.getElementById(id); };\n    var url = E('url'), connect = E('connect'), message = E('message'), send = E('send'), log = E('log');\n    var enable = function(en) { message.disabled = send.disabled = !en; url.disabled = en; connect.innerHTML = en ? 'disconnect' : 'connect'; };\n    enable(false)\n    connect.onclick = function() {\n      if (ws) { ws.close(); return; }\n      ws = new WebSocket(url.value);\n      if (!ws) return;\n      ws.onopen = function() { log.innerHTML += 'CONNECTION OPENED<br/>'; }\n      ws.onmessage = function(ev) { log.innerHTML += 'RECEIVED: ' + ev.data + '<br/>'; }\n      ws.onerror = function(ev) { log.innerHTML += 'ERROR: ' + ev + '<br/>'; }\n      ws.onclose = function() { log.innerHTML += 'CONNECTION CLOSED<br/>'; enable(false); ws = null; }\n      enable(true);\n    };\n    send.onclick = function() {\n      if (!ws) return;\n      log.innerHTML += 'SENT: ' + message.value + '<br/>';\n      ws.send(message.value);\n    }\n  </script>\n</html>\n"
  },
  {
    "path": "tutorials/http/README.md",
    "content": "See detailed tutorials at https://mongoose.ws/documentation/#http"
  },
  {
    "path": "tutorials/http/device-dashboard/Makefile",
    "content": "PROG ?= ./example       # Program we are building\nDELETE = rm -rf         # Command to remove files\nOUT ?= -o $(PROG)       # Compiler argument for output file\nSOURCES = main.c mongoose.c net.c packed_fs.c   # Source code files\nCFLAGS = -W -Wall -Wextra -g -I.                # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += -DMG_ENABLE_PACKED_FS=1\n\nifeq ($(OS),Windows_NT)         # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG = example.exe            # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\nendif\n\n# Default target. Build and run program\nall: $(PROG)\n\t$(RUN) $(PROG) $(ARGS)\n\n# Build program from sources\n$(PROG): $(SOURCES)\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\n# Bundle JS libraries (preact, preact-router, ...) into a single file\nweb_root/bundle.js:\n\tcurl -s https://npm.reversehttp.com/preact,preact/hooks,htm/preact,preact-router -o $@\n\n# Generate packed filesystem for serving Web UI\npacked_fs.c: $(wildcard web_root/*) $(wildcard certs/*) Makefile web_root/bundle.js\n\tnode pack.js $(addsuffix ::gzip, $(wildcard web_root/*)) certs/* > $@\n\nmbedtls:\n\tgit clone --depth 1 -b v2.28.2 https://github.com/mbed-tls/mbedtls $@\n\nifeq ($(TLS), mbedtls)\nCFLAGS += -DMG_TLS=MG_TLS_MBED -Wno-conversion -Imbedtls/include\nCFLAGS += -DMBEDTLS_CONFIG_FILE=\\\"mbedtls_config.h\\\" mbedtls/library/*.c\n$(PROG): mbedtls\nendif\n\n# Cleanup. Delete built program and all build artifacts\nclean:\n\t$(DELETE) $(PROG) $(PACK) *.o *.obj *.exe *.dSYM mbedtls\n"
  },
  {
    "path": "tutorials/http/device-dashboard/README.md",
    "content": "# A complete device dashboard\n\nThis example is a demonstration of how Mongoose Library could be integrated\ninto an embedded device and provide a complete device dashboard with the\nfollowing features:\n\n- Authentication: login-protected dashboard\n- Multiple logins (with possibly different permissions)\n- The Web UI can be fully embedded into the firmware binary, then not\n  needing a filesystem to serve it; so being resilient to FS problems\n- All changes are propagated to all connected clients\n\nSee a detailed tutorial at https://mongoose.ws/tutorials/device-dashboard/\n"
  },
  {
    "path": "tutorials/http/device-dashboard/certs/server_cert.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIBCTCBsAIJAK9wbIDkHnAoMAoGCCqGSM49BAMCMA0xCzAJBgNVBAYTAklFMB4X\nDTIzMDEyOTIxMjEzOFoXDTMzMDEyNjIxMjEzOFowDTELMAkGA1UEBhMCSUUwWTAT\nBgcqhkjOPQIBBggqhkjOPQMBBwNCAARzSQS5OHd17lUeNI+6kp9WYu0cxuEIi/JT\njphbCmdJD1cUvhmzM9/phvJT9ka10Z9toZhgnBq0o0xfTQ4jC1vwMAoGCCqGSM49\nBAMCA0gAMEUCIQCe0T2E0GOiVe9KwvIEPeX1J1J0T7TNacgR0Ya33HV9VgIgNvdn\naEWiBp1xshs4iz6WbpxrS1IHucrqkZuJLfNZGZI=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "tutorials/http/device-dashboard/certs/server_key.pem",
    "content": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEICBz3HOkQLPBDtdknqC7k1PNsWj6HfhyNB5MenfjmqiooAoGCCqGSM49\nAwEHoUQDQgAEc0kEuTh3de5VHjSPupKfVmLtHMbhCIvyU46YWwpnSQ9XFL4ZszPf\n6YbyU/ZGtdGfbaGYYJwatKNMX00OIwtb8A==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "tutorials/http/device-dashboard/esp32/CMakeLists.txt",
    "content": "# The following lines of boilerplate have to be in your project's\n# CMakeLists in this exact order for cmake to work correctly\ncmake_minimum_required(VERSION 3.5)\n\ninclude($ENV{IDF_PATH}/tools/cmake/project.cmake)\nproject(mongoose-esp32-example)\n"
  },
  {
    "path": "tutorials/http/device-dashboard/esp32/Makefile",
    "content": "THISDIR = $(realpath $(CURDIR))\nROOTDIR = $(realpath $(CURDIR)/../../../..)\nDOCKER ?= docker run --rm $(DA) -v $(ROOTDIR):$(ROOTDIR) -w $(THISDIR) espressif/idf\nCMD ?= idf.py build\nPORT ?= /dev/ttyUSB0\n\nall: example\n\nexample:\n\ttrue\n\nbuild: Makefile $(wildcard main/*)\n\t$(DOCKER) $(CMD)\n\nflash:\nflash: CMD = idf.py flash\nflash: DA = --device $(PORT)\nflash: build\n\n.PHONY: build\n\ndashboard.hex: build\n\tesputil mkhex \\\n\t\t0x8000 build/partition_table/partition-table.bin \\\n\t\t0x1000 build/bootloader/bootloader.bin \\\n\t\t0x100000 build/mongoose-esp32-example.bin > $@\n\nflash2: dashboard.hex\n\tesputil -p $(PORT) -b 921600 -fp 0x220 flash dashboard.hex\n\tesputil -p $(PORT) monitor\n\nESPTOOL ?= esptool.py\n\nflash3:\n\tcd build && $(ESPTOOL) --chip esp32 -p $(PORT) -b 460800 --before=default_reset --after=hard_reset write_flash --flash_mode dio --flash_freq 40m --flash_size 2MB 0x8000 partition_table/partition-table.bin 0x1000 bootloader/bootloader.bin 0x100000 mongoose-esp32-example.bin\n\nclean:\n\ttest -d build && $(DOCKER) rm -rf build sdkconfig || true\n"
  },
  {
    "path": "tutorials/http/device-dashboard/esp32/README.md",
    "content": "See detailed tutorial at https://mongoose.ws/tutorials/esp32/device-dashboard\n"
  },
  {
    "path": "tutorials/http/device-dashboard/esp32/main/CMakeLists.txt",
    "content": "idf_component_register(SRCS \"main.c\"\n                            \"wifi.c\"\n                            \"net.c\"\n                            \"packed_fs.c\"\n                            \"mongoose.c\")\ncomponent_compile_options(-DHTTP_URL=\"http://0.0.0.0:80\")\ncomponent_compile_options(-DHTTPS_URL=\"https://0.0.0.0:443\")\n"
  },
  {
    "path": "tutorials/http/device-dashboard/esp32/main/main.c",
    "content": "// Copyright (c) 2020 Cesanta Software Limited\n// All rights reserved\n\n#include \"mongoose.h\"\n#include \"net.h\"\n\n#define WIFI_SSID \"YOUR_WIFI_NETWORK_NAME\"  // SET THIS!\n#define WIFI_PASS \"YOUR_WIFI_PASSWORD\"      // SET THIS!\n\nvoid app_main(void) {\n  // Setup wifi. This function is implemented in wifi.c\n  // It blocks until connected to the configured WiFi network\n  void wifi_init(const char *ssid, const char *pass);\n  wifi_init(WIFI_SSID, WIFI_PASS);\n\n  // Connected to WiFi, now start HTTP server\n  struct mg_mgr mgr;\n  mg_log_set(MG_LL_DEBUG);  // Set log level\n  mg_mgr_init(&mgr);\n  MG_INFO((\"Mongoose version : v%s\", MG_VERSION));\n  MG_INFO((\"Listening on     : %s\", HTTP_URL));\n#if MG_ENABLE_MBEDTLS\n  MG_INFO((\"Listening on     : %s\", HTTPS_URL));\n#endif\n\n  web_init(&mgr);\n  for (;;) mg_mgr_poll(&mgr, 1000);  // Infinite event loop\n}\n\n#if MG_OTA == MG_OTA_CUSTOM\nenum {\n  MG_OTA_UNAVAILABLE = 0,  // No OTA information is present\n  MG_OTA_FIRST_BOOT = 1,   // Device booting the first time after the OTA\n  MG_OTA_UNCOMMITTED = 2,  // Ditto, but marking us for the rollback\n  MG_OTA_COMMITTED = 3     // The firmware is good\n};\nenum { MG_FIRMWARE_CURRENT = 0, MG_FIRMWARE_PREVIOUS = 1 };\n\nvoid *mg_flash_start(void) {\n  return NULL;\n}\nsize_t mg_flash_size(void) {\n  return 0;\n}\nsize_t mg_flash_sector_size(void) {\n  return 0;\n}\nsize_t mg_flash_write_align(void) {\n  return 0;\n}\nint mg_flash_bank(void) {\n  return 0;\n}\nbool mg_flash_erase(void *location) {\n  (void) location;\n  return false;\n}\nbool mg_flash_swap_bank(void) {\n  return true;\n}\nbool mg_flash_write(void *addr, const void *buf, size_t len) {\n  (void) addr, (void) buf, (void) len;\n  return false;\n}\nvoid mg_device_reset(void) {\n  esp_restart();\n}\n\n#include \"esp_app_format.h\"\n#include \"esp_ota_ops.h\"\n\nstatic size_t s_size = 0;           // Firmware size to flash. In-progress indicator\nstatic bool rx_checked = false;     // Whether firmware being received has been checked as valid\nconst esp_partition_t * update_partition = NULL;    // The partition the update is being applied to\nesp_ota_handle_t update_handle = 0; // Handle of the current update process\n\nconst esp_partition_t * get_partition_from_fw(int fw) {\n  if (MG_FIRMWARE_CURRENT == fw) {\n    return esp_ota_get_running_partition();\n  }\n  const esp_partition_t * p = esp_ota_get_last_invalid_partition();\n  if (NULL == p) {\n    p = esp_ota_get_next_update_partition(NULL);\n  }\n  return p;\n}\n\n// Returns true if the data buffer contains the header of a valid firmware\nconst size_t fw_size_required = sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t) + sizeof(esp_app_desc_t);\nbool check_fw_header(const void* buf, size_t len) {\n  // Ensure we have received enough data to do the check\n  if (len < fw_size_required) {\n    MG_ERROR((\"Insufficient data to check firmware header - %d bytes, require %d bytes\", len, fw_size_required));\n    return false;\n  }\n\n  // Check the magic word of the received firmare\n  esp_app_desc_t* rx_app_info = (esp_app_desc_t*)(((char*)buf) + sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t));\n  if (ESP_APP_DESC_MAGIC_WORD != rx_app_info->magic_word) {\n    MG_ERROR((\"Invalid app - invalid magic word\"));\n    return false;\n  }\n  MG_INFO((\"Received firmware: %s %s\", rx_app_info->project_name, rx_app_info->version));\n\n  // Get the name/version of the running firmware\n  const esp_partition_t *current = esp_ota_get_running_partition();\n  esp_app_desc_t curr_app_info;\n  esp_err_t res = esp_ota_get_partition_description(current, &curr_app_info);\n  if (ESP_OK != res) {\n    MG_ERROR((\"Unable to get name/version of running firmware\"));\n    return false;\n  }\n  MG_INFO((\"Running firmware: %s %s\", curr_app_info.project_name, curr_app_info.version));\n\n  // Check the name of the new firmware is the same as the old firmware\n  if (memcmp(curr_app_info.project_name, rx_app_info->project_name, sizeof(curr_app_info.project_name)) != 0) {\n    MG_ERROR((\"Firmware name is different. Wrong firmware uploaded! Current %s Uploaded %s\", curr_app_info.project_name, rx_app_info->project_name));\n    return false;\n  }\n\n  // Check the version of the new firmware is different from the old firmware\n  if (memcmp(curr_app_info.version, rx_app_info->version, sizeof(curr_app_info.version)) == 0) {\n    MG_ERROR((\"Firmware version is the same. Wrong firmware uploaded! Current %s, Uploaded %s\", curr_app_info.version, rx_app_info->version));\n    //return false;\n  }\n\n  return true;\n}\n\nsize_t mg_ota_size(int fw) {\n  const esp_partition_t *p = get_partition_from_fw(fw);\n  if (NULL == p) {\n    return 0;\n  }\n  return p->size;\n}\n\nbool mg_ota_begin(size_t new_firmware_size) {\n  rx_checked = false;\n  if (s_size) {\n    MG_ERROR((\"OTA already in progress. Call mg_ota_end()\"));\n    return false;\n  }\n  int partition_size = mg_ota_size(MG_FIRMWARE_PREVIOUS);\n  if (new_firmware_size > partition_size) {\n    MG_ERROR((\"Firmware %lu bytes, max %lu\", new_firmware_size, partition_size));\n    return false;\n  }\n  update_partition = esp_ota_get_next_update_partition(NULL);\n  if (NULL == update_partition) {\n    MG_ERROR((\"esp_ota_get_next_update_partition returned NULL\"));\n    return false;\n  }\n  esp_err_t res = esp_ota_begin(update_partition, OTA_WITH_SEQUENTIAL_WRITES, &update_handle);\n  if (res != ESP_OK) {\n    esp_ota_abort(update_handle);\n    MG_ERROR((\"esp_ota_begin failed (%s)\", esp_err_to_name(res)));\n    return false;\n  }\n  s_size = new_firmware_size;\n  MG_INFO((\"Starting OTA, firmware size %lu\", s_size));\n  return true;\n}\n\nbool mg_ota_write(const void *buf, size_t len) {\n  if (s_size == 0) {\n    MG_ERROR((\"OTA is not started, call mg_ota_begin()\"));\n    return false;\n  }\n  if (!rx_checked) {\n    if (!check_fw_header(buf, len)) {\n      return false;\n    }\n    rx_checked = true;\n  }\n  esp_err_t res = esp_ota_write(update_handle, buf, len);\n  if (res != ESP_OK) {\n    esp_ota_abort(update_handle);\n    MG_ERROR((\"esp_ota_write FAILED (%s)\", esp_err_to_name(res)));\n    return false;\n  }\n  return true;\n}\n\nbool mg_ota_end(void) {\n  if (0 == s_size) {\n    MG_INFO((\"Finishing OTA: fail\"));\n    return false;\n  }\n  s_size = 0;\n  esp_err_t err = esp_ota_end(update_handle);\n  if (err != ESP_OK) {\n    MG_ERROR((\"esp_ota_end failed (%s)!\", esp_err_to_name(err)));\n    return false;\n  }\n  err = esp_ota_set_boot_partition(update_partition);\n  if (err != ESP_OK) {\n    MG_ERROR((\"esp_ota_set_boot_partition failed (%s)!\", esp_err_to_name(err)));\n    return false;\n  }\n  return true;\n}\n\nbool mg_ota_commit(void) {\n  esp_ota_mark_app_valid_cancel_rollback();\n  return true;\n}\n\nbool mg_ota_rollback(void) {\n  if(esp_ota_check_rollback_is_possible()) {\n    esp_ota_mark_app_invalid_rollback_and_reboot();\n    return true;\n  }\n  MG_ERROR((\"Rollback NOT possible\"));\n  return false;\n}\n\nint mg_ota_status(int fw) {\n  const esp_partition_t *p = get_partition_from_fw(fw);\n  if (NULL == p) {\n    return 0;\n  }\n  int status = MG_OTA_UNAVAILABLE;\n\n  esp_ota_img_states_t img_state = ESP_OTA_IMG_UNDEFINED;\n  esp_err_t res = esp_ota_get_state_partition(p, &img_state);\n  if (ESP_OK == res) {\n    if (ESP_OTA_IMG_VALID == img_state) {\n      status = MG_OTA_COMMITTED;\n    } else if (ESP_OTA_IMG_UNDEFINED == img_state) {\n      status = MG_OTA_UNCOMMITTED;\n    } else if (ESP_OTA_IMG_INVALID == img_state) {\n      status = MG_OTA_UNAVAILABLE;\n    } else if (ESP_OTA_IMG_ABORTED == img_state) {\n      status = MG_OTA_UNAVAILABLE;\n    } else if (ESP_OTA_IMG_NEW == img_state) {\n      status = MG_OTA_FIRST_BOOT;\n    } else if (ESP_OTA_IMG_PENDING_VERIFY == img_state) {\n      status = MG_OTA_UNCOMMITTED;\n    }\n  }\n  return status;\n}\n\nuint32_t mg_ota_crc32(int fw) {\n  (void) fw;\n  return 0;\n}\n\nuint32_t mg_ota_timestamp(int fw) {\n  const esp_partition_t *p = get_partition_from_fw(fw);\n\n  esp_app_desc_t app;\n  esp_err_t res = esp_ota_get_partition_description(p, &app);\n  if (ESP_OK != res)\n    {\n    return 0;\n    }\n\n  struct tm datetime = {};\n  if (NULL == strptime(app.date, \"%b %d %Y\", &datetime))\n    {\n    return 0;\n    }\n  if (NULL == strptime(app.time, \"%H:%M:%S\", &datetime))\n    {\n    return 0;\n    }\n  return mktime(&datetime);\n}\n\n#endif\n"
  },
  {
    "path": "tutorials/http/device-dashboard/esp32/main/mongoose_config.h",
    "content": "#define MG_ARCH MG_ARCH_ESP32\n\n#define MG_ENABLE_PACKED_FS 1\n#define MG_TLS MG_TLS_NONE\t// change to 'MG_TLS_MBED' to enable TLS\n#define MG_OTA MG_OTA_CUSTOM\n"
  },
  {
    "path": "tutorials/http/device-dashboard/esp32/main/wifi.c",
    "content": "// Code taken from the ESP32 IDF WiFi station Example\n\n#include <string.h>\n#include \"esp_event.h\"\n#include \"esp_log.h\"\n#include \"esp_system.h\"\n#include \"esp_wifi.h\"\n#include \"freertos/FreeRTOS.h\"\n#include \"freertos/event_groups.h\"\n#include \"freertos/task.h\"\n#include \"nvs_flash.h\"\n\n#include \"lwip/err.h\"\n#include \"lwip/sys.h\"\n\n#include \"mongoose.h\"\n\nstatic EventGroupHandle_t s_wifi_event_group;\n\n/* The event group allows multiple bits for each event, but we only care about\n * two events:\n * - we are connected to the AP with an IP\n * - we failed to connect after the maximum amount of retries */\n#define WIFI_CONNECTED_BIT BIT0\n#define WIFI_FAIL_BIT BIT1\n\nstatic int s_retry_num = 0;\n\nstatic void event_handler(void *arg, esp_event_base_t event_base,\n                          int32_t event_id, void *event_data) {\n  if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {\n    esp_wifi_connect();\n  } else if (event_base == WIFI_EVENT &&\n             event_id == WIFI_EVENT_STA_DISCONNECTED) {\n    if (s_retry_num < 10) {\n      esp_wifi_connect();\n      s_retry_num++;\n      MG_INFO((\"retry to connect to the AP\"));\n    } else {\n      xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);\n    }\n    MG_ERROR((\"connect to the AP fail\"));\n  } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {\n    ip_event_got_ip_t *event = (ip_event_got_ip_t *) event_data;\n    MG_INFO((\"IP ADDRESS:\" IPSTR, IP2STR(&event->ip_info.ip)));\n    s_retry_num = 0;\n    xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);\n  }\n}\n\nvoid wifi_init(const char *ssid, const char *pass) {\n  esp_err_t ret = nvs_flash_init();\n  if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||\n      ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {\n    ESP_ERROR_CHECK(nvs_flash_erase());\n    ret = nvs_flash_init();\n  }\n  ESP_ERROR_CHECK(ret);\n\n  s_wifi_event_group = xEventGroupCreate();\n\n  ESP_ERROR_CHECK(esp_netif_init());\n\n  ESP_ERROR_CHECK(esp_event_loop_create_default());\n  esp_netif_create_default_wifi_sta();\n\n  wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();\n  ESP_ERROR_CHECK(esp_wifi_init(&cfg));\n\n  esp_event_handler_instance_t instance_any_id;\n  esp_event_handler_instance_t instance_got_ip;\n  ESP_ERROR_CHECK(esp_event_handler_instance_register(\n      WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL, &instance_any_id));\n  ESP_ERROR_CHECK(esp_event_handler_instance_register(\n      IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL, &instance_got_ip));\n\n  wifi_config_t c = {.sta = {.threshold = {.authmode = WIFI_AUTH_WPA2_PSK},\n                             .pmf_cfg = {.capable = true, .required = false}}};\n  snprintf((char *) c.sta.ssid, sizeof(c.sta.ssid), \"%s\", ssid);\n  snprintf((char *) c.sta.password, sizeof(c.sta.password), \"%s\", pass);\n  ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));\n  ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &c));\n  ESP_ERROR_CHECK(esp_wifi_start());\n  MG_DEBUG((\"wifi_init_sta finished.\"));\n\n  EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,\n                                         WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,\n                                         pdFALSE, pdFALSE, portMAX_DELAY);\n\n  if (bits & WIFI_CONNECTED_BIT) {\n    MG_INFO((\"connected to ap SSID:%s password:%s\", ssid, pass));\n  } else if (bits & WIFI_FAIL_BIT) {\n    MG_ERROR((\"Failed to connect to SSID:%s, password:%s\", ssid, pass));\n  } else {\n    MG_ERROR((\"UNEXPECTED EVENT\"));\n  }\n\n  /* The event will not be processed after unregister */\n  ESP_ERROR_CHECK(esp_event_handler_instance_unregister(\n      IP_EVENT, IP_EVENT_STA_GOT_IP, instance_got_ip));\n  ESP_ERROR_CHECK(esp_event_handler_instance_unregister(\n      WIFI_EVENT, ESP_EVENT_ANY_ID, instance_any_id));\n  vEventGroupDelete(s_wifi_event_group);\n}\n"
  },
  {
    "path": "tutorials/http/device-dashboard/esp32/partitions.csv",
    "content": "# Name,   Type, SubType, Offset,  Size, Flags\nnvs,      data, nvs,     ,        0x6000\notadata,  data, ota,     ,        0x2000,\nphy_init, data, phy,     ,        0x1000,\nota_0,    app,  ota_0,   ,        948K,\nota_1,    app,  ota_1,   ,        948K,\n"
  },
  {
    "path": "tutorials/http/device-dashboard/esp32/sdkconfig.defaults",
    "content": "CONFIG_PARTITION_TABLE_CUSTOM=y\nCONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions.csv\"\nCONFIG_PARTITION_TABLE_FILENAME=\"partitions.csv\"\nCONFIG_BOOTLOADER_APP_ROLLBACK_ENABLE=y\n#CONFIG_ESP_MAIN_TASK_STACK_SIZE=8192\n"
  },
  {
    "path": "tutorials/http/device-dashboard/main.c",
    "content": "// Copyright (c) 2020-2023 Cesanta Software Limited\n// All rights reserved\n\n#include \"mongoose.h\"\n#include \"net.h\"\n\nstatic int s_sig_num;\nstatic void signal_handler(int sig_num) {\n  signal(sig_num, signal_handler);\n  s_sig_num = sig_num;\n}\n\nint main(void) {\n  struct mg_mgr mgr;\n\n  signal(SIGPIPE, SIG_IGN);\n  signal(SIGINT, signal_handler);\n  signal(SIGTERM, signal_handler);\n\n  mg_log_set(MG_LL_DEBUG);  // Set debug log level\n  mg_mgr_init(&mgr);\n\n  web_init(&mgr);\n  while (s_sig_num == 0) {\n    mg_mgr_poll(&mgr, 50);\n  }\n\n  mg_mgr_free(&mgr);\n  MG_INFO((\"Exiting on signal %d\", s_sig_num));\n\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/http/device-dashboard/mbedtls_config.h",
    "content": "/* Workaround for some mbedtls source files using INT_MAX without including limits.h */\n#include <limits.h>\n\n#define MBEDTLS_NO_PLATFORM_ENTROPY\n//#define MBEDTLS_ENTROPY_HARDWARE_ALT\n#define MBEDTLS_SSL_OUT_CONTENT_LEN    2048\n#define MBEDTLS_ALLOW_PRIVATE_ACCESS\n#define MBEDTLS_HAVE_TIME\n#define MBEDTLS_SSL_SESSION_TICKETS\n\n#define MBEDTLS_CIPHER_MODE_CBC\n#define MBEDTLS_ECP_DP_SECP192R1_ENABLED\n#define MBEDTLS_ECP_DP_SECP224R1_ENABLED\n#define MBEDTLS_ECP_DP_SECP256R1_ENABLED\n#define MBEDTLS_ECP_DP_SECP384R1_ENABLED\n#define MBEDTLS_ECP_DP_SECP521R1_ENABLED\n#define MBEDTLS_ECP_DP_SECP192K1_ENABLED\n#define MBEDTLS_ECP_DP_SECP224K1_ENABLED\n#define MBEDTLS_ECP_DP_SECP256K1_ENABLED\n#define MBEDTLS_ECP_DP_BP256R1_ENABLED\n#define MBEDTLS_ECP_DP_BP384R1_ENABLED\n#define MBEDTLS_ECP_DP_BP512R1_ENABLED\n#define MBEDTLS_ECP_DP_CURVE25519_ENABLED\n#define MBEDTLS_KEY_EXCHANGE_RSA_ENABLED\n#define MBEDTLS_PKCS1_V15\n#define MBEDTLS_SHA256_SMALLER\n#define MBEDTLS_SSL_SERVER_NAME_INDICATION\n#define MBEDTLS_AES_C\n#define MBEDTLS_ASN1_PARSE_C\n#define MBEDTLS_BIGNUM_C\n#define MBEDTLS_CIPHER_C\n#define MBEDTLS_CTR_DRBG_C\n#define MBEDTLS_ENTROPY_C\n#define MBEDTLS_ERROR_C\n#define MBEDTLS_MD_C\n#define MBEDTLS_MD5_C\n#define MBEDTLS_OID_C\n#define MBEDTLS_PKCS5_C\n#define MBEDTLS_PK_C\n#define MBEDTLS_PK_PARSE_C\n#define MBEDTLS_PLATFORM_C\n#define MBEDTLS_RSA_C\n#define MBEDTLS_SHA1_C\n#define MBEDTLS_SHA224_C\n#define MBEDTLS_SHA256_C\n#define MBEDTLS_SHA512_C\n#define MBEDTLS_SSL_CLI_C\n#define MBEDTLS_SSL_SRV_C\n#define MBEDTLS_SSL_TLS_C\n#define MBEDTLS_X509_CRT_PARSE_C\n#define MBEDTLS_X509_USE_C\n#define MBEDTLS_AES_FEWER_TABLES\n#define MBEDTLS_PEM_PARSE_C\n#define MBEDTLS_BASE64_C\n#define MBEDTLS_SSL_TICKET_C\n\n#define MBEDTLS_SSL_PROTO_TLS1_3\n#define MBEDTLS_SSL_PROTO_TLS1_2\n#define MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED\n#define MBEDTLS_GCM_C\n#define MBEDTLS_ECDH_C\n#define MBEDTLS_ECP_C\n#define MBEDTLS_ECDSA_C\n#define MBEDTLS_ASN1_WRITE_C\n"
  },
  {
    "path": "tutorials/http/device-dashboard/microchip/same54-xpro/Makefile",
    "content": "CFLAGS  = -W -Wall -Wextra -Wundef -Wshadow -Wdouble-promotion\nCFLAGS += -Wformat-truncation -fno-common -Wconversion\nCFLAGS += -g3 -Os -ffunction-sections -fdata-sections\nCFLAGS += -I. -Icmsis_core/CMSIS/Core/Include\nCFLAGS += -D__SAME54P20A__ -Icmsis_sam/include\nCFLAGS += -mcpu=cortex-m4 -mthumb -mfloat-abi=softfp\nLDFLAGS ?= -Tlink.ld -nostartfiles -nostdlib --specs nano.specs -lc -lgcc -Wl,--gc-sections -Wl,-Map=$@.map\n\nSOURCES = main.c syscalls.c startup.c\n\n# Mongoose-specific source code files and build options. See https://mongoose.ws/documentation/#build-options\nSOURCES += mongoose.c net.c packed_fs.c\nCFLAGS += -DMG_ENABLE_TCPIP=1 -DMG_ARCH=MG_ARCH_ARMGCC -DMG_ENABLE_CUSTOM_MILLIS=1 -DMG_ENABLE_LINES=1\nCFLAGS += -DMG_ENABLE_DRIVER_SAME54=1 -DMG_ENABLE_CUSTOM_RANDOM=1 -DMG_ENABLE_PACKED_FS=1 $(CFLAGS_EXTRA)\n\n# Example specific build options. See README.md\nCFLAGS += -DHTTP_URL=\\\"http://0.0.0.0/\\\"\n\nifeq ($(OS),Windows_NT)\n  RM = cmd /C del /Q /F\nelse\n  RM = rm -rf\nendif\n\nbuild: firmware.bin\n\nfirmware.bin: firmware.elf\n\tarm-none-eabi-objcopy -O binary $< $@\n\nfirmware.elf: cmsis_core cmsis_sam hal.h link.ld Makefile $(SOURCES) \n\tarm-none-eabi-gcc $(SOURCES) $(CFLAGS) $(CFLAGS_EXTRA) $(LDFLAGS) -o $@\n\nflash: firmware.bin\n\tbossac -p /dev/cu.usb* -w -v -b $<\n\ncmsis_core:\n\tgit clone --depth 1 -b 5.9.0 https://github.com/ARM-software/CMSIS_5 $@\ncmsis_sam:\n\tcurl -sL https://packs.download.microchip.com/Microchip.SAME54_DFP.3.9.244.atpack -o $@.zip\n\tmkdir $@ && cd $@ && unzip ../$@.zip\n\n# Automated test via https://vcon.io/automated-firmware-tests/. Set VCON_API_KEY and update DEVICE_URL\nDEVICE_URL ?= https://dash.vcon.io/api/v3/devices/9\nupdate: firmware.bin\n\tcurl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/ota --data-binary @$<\n\ntest update: CFLAGS += -DUART_DEBUG=USART1\ntest: update\n\tcurl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/tx?t=5 | tee /tmp/output.txt\n\tgrep 'READY, IP:' /tmp/output.txt       # Check for network init\n\nclean:\n\t$(RM) firmware.* cmsis_core cmsis_sam *.zip\n"
  },
  {
    "path": "tutorials/http/device-dashboard/microchip/same54-xpro/hal.h",
    "content": "// Copyright (c) 2022 Cesanta Software Limited\n// SPDX-License-Identifier: MIT\n//\n// https://ww1.microchip.com/downloads/aemDocuments/documents/MCU32/ProductDocuments/DataSheets/SAM-D5x-E5x-Family-Data-Sheet-DS60001507.pdf\n// https://ww1.microchip.com/downloads/en/DeviceDoc/70005321A.pdf\n\n#ifndef LED_PIN\n#define LED_PIN PIN('C', 18)\n#endif\n\n#ifndef BUTTON_PIN\n#define BUTTON_PIN PIN('B', 31)\n#endif\n\n#ifndef UART_DEBUG\n#define UART_DEBUG USART1\n#endif\n\n#pragma once\n#include <sam.h>\n\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <string.h>\n\n#define BIT(x) (1UL << (x))\n#define SETBITS(R, CLEARMASK, SETMASK) (R) = ((R) & ~(CLEARMASK)) | (SETMASK)\n#define PIN(bank, num) ((((bank) - 'A') << 8) | (num))\n#define PINNO(pin) (pin & 255)\n#define PINBANK(pin) (pin >> 8)\n\nstatic inline void spin(volatile uint32_t count) {\n  while (count--) (void) 0;\n}\n\nstatic inline uint32_t clock_sys_freq(void) {\n  return 48000000U;\n}\n\nenum { GPIO_MODE_INPUT, GPIO_MODE_OUTPUT, GPIO_MODE_AF, GPIO_MODE_ANALOG };\nenum { GPIO_OTYPE_PUSH_PULL, GPIO_OTYPE_OPEN_DRAIN };\nenum { GPIO_SPEED_LOW, GPIO_SPEED_MEDIUM, GPIO_SPEED_HIGH, GPIO_SPEED_INSANE };\nenum { GPIO_PULL_NONE, GPIO_PULL_UP, GPIO_PULL_DOWN };\n#define GPIO(N) ((port_group_registers_t *) (PORT_BASE_ADDRESS + 0x80 * (N)))\ntypedef port_group_registers_t GPIO_TypeDef;\nstatic inline GPIO_TypeDef *gpio_bank(uint16_t pin) {\n  return GPIO(PINBANK(pin));\n}\nstatic inline void gpio_toggle(uint16_t pin) {\n  gpio_bank(pin)->PORT_OUTTGL = BIT(PINNO(pin));\n}\nstatic inline bool gpio_read(uint16_t pin) {\n  return gpio_bank(pin)->PORT_IN & BIT(PINNO(pin));\n}\nstatic inline void gpio_write(uint16_t pin, bool val) {\n  GPIO_TypeDef *gpio = gpio_bank(pin);\n  if (val) {\n    gpio->PORT_OUTSET = BIT(PINNO(pin));\n  } else {\n    gpio->PORT_OUTCLR = BIT(PINNO(pin));\n  }\n}\nstatic inline void gpio_init(uint16_t pin, uint8_t mode, uint8_t type,\n                             uint8_t speed, uint8_t pull, uint8_t af) {\n  (void) type, (void) speed, (void) pull, (void) af;\n  GPIO_TypeDef *gpio = gpio_bank(pin);\n  uint32_t mask = BIT(PINNO(pin));\n  MCLK_REGS->MCLK_APBBMASK |= MCLK_APBBMASK_PORT_Msk;\n  if (mode == GPIO_MODE_INPUT) {\n    gpio->PORT_DIRCLR = mask;\n  } else {\n    gpio->PORT_DIRSET = mask;\n  }\n}\nstatic inline void gpio_input(uint16_t pin) {\n  gpio_init(pin, GPIO_MODE_INPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,\n            GPIO_PULL_NONE, 0);\n}\nstatic inline void gpio_output(uint16_t pin) {\n  gpio_init(pin, GPIO_MODE_OUTPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,\n            GPIO_PULL_NONE, 0);\n}\n\ntypedef sercom_usart_int_registers_t USART_TypeDef;\n#define USART1 ((USART_TypeDef *) SERCOM0_BASE_ADDRESS)\n#define USART2 ((USART_TypeDef *) SERCOM1_BASE_ADDRESS)\n#define USART3 ((USART_TypeDef *) SERCOM2_BASE_ADDRESS)\nstatic inline bool uart_init(USART_TypeDef *uart, unsigned long baud) {\n  uint16_t rx = 0, tx = 0;  // Pins\n  uint8_t rx_mux = 0, tx_mux = 0;\n  if (uart == USART1) {\n    MCLK_REGS->MCLK_APBAMASK |= MCLK_APBAMASK_SERCOM0_Msk;\n    GCLK_REGS->GCLK_PCHCTRL[SERCOM0_GCLK_ID_CORE] =\n        GCLK_PCHCTRL_GEN_GCLK0 | GCLK_PCHCTRL_CHEN_Msk;\n    GCLK_REGS->GCLK_PCHCTRL[SERCOM0_GCLK_ID_SLOW] =\n        GCLK_PCHCTRL_GEN_GCLK3 | GCLK_PCHCTRL_CHEN_Msk;\n    tx = PIN('A', 4), rx = PIN('A', 5);\n    rx_mux = MUX_PA05D_SERCOM0_PAD1, tx_mux = MUX_PA04D_SERCOM0_PAD0;\n  } else if (uart == USART2) {\n    MCLK_REGS->MCLK_APBAMASK |= MCLK_APBAMASK_SERCOM1_Msk;\n    tx = PIN('C', 27), rx = PIN('C', 28);\n  } else if (uart == USART3) {\n    MCLK_REGS->MCLK_APBBMASK |= MCLK_APBBMASK_SERCOM2_Msk;\n    tx = PIN('A', 9), rx = PIN('A', 8);\n  } else {\n    return false;\n  }\n  gpio_bank(rx)->PORT_WRCONFIG =\n      PORT_WRCONFIG_PMUX(rx_mux) | PORT_WRCONFIG_WRPMUX(1) |\n      PORT_WRCONFIG_PMUXEN(1) | PORT_WRCONFIG_WRPINCFG(1) | BIT(PINNO(rx));\n  gpio_bank(tx)->PORT_WRCONFIG =\n      PORT_WRCONFIG_PMUX(tx_mux) | PORT_WRCONFIG_WRPMUX(1) |\n      PORT_WRCONFIG_PMUXEN(1) | PORT_WRCONFIG_WRPINCFG(1) | BIT(PINNO(tx));\n  uart->SERCOM_CTRLA = SERCOM_USART_INT_CTRLA_DORD(1) |\n                       SERCOM_USART_INT_CTRLA_MODE(1 /* INT_CLK */) |\n                       SERCOM_USART_INT_CTRLA_RXPO(1 /* PAD1 */) |\n                       SERCOM_USART_INT_CTRLA_TXPO(0 /* PAD0 */) |\n                       SERCOM_USART_INT_CTRLA_SAMPR(1);\n  uart->SERCOM_BAUD = (uint16_t) (clock_sys_freq() / (16 * baud));\n  uart->SERCOM_CTRLB = SERCOM_USART_INT_CTRLB_RXEN(1) |\n                       SERCOM_USART_INT_CTRLB_TXEN(1) |\n                       SERCOM_USART_INT_CTRLB_CHSIZE(0);\n  while (uart->SERCOM_SYNCBUSY & SERCOM_USART_INT_SYNCBUSY_CTRLB_Msk) spin(1);\n  uart->SERCOM_CTRLA |= SERCOM_USART_INT_CTRLA_ENABLE(1);\n  while (uart->SERCOM_SYNCBUSY & SERCOM_USART_INT_SYNCBUSY_ENABLE_Msk) spin(1);\n  return true;\n}\nstatic inline void uart_write_byte(USART_TypeDef *uart, uint8_t byte) {\n  while (!(uart->SERCOM_INTFLAG & SERCOM_USART_INT_INTFLAG_DRE_Msk)) spin(1);\n  uart->SERCOM_DATA = byte;\n}\nstatic inline void uart_write_buf(USART_TypeDef *uart, char *buf, size_t len) {\n  while (len-- > 0) uart_write_byte(uart, *(uint8_t *) buf++);\n}\nstatic inline bool uart_read_ready(USART_TypeDef *uart) {\n  return (uart->SERCOM_INTFLAG & SERCOM_USART_EXT_INTFLAG_RXC_Msk);\n}\nstatic inline uint8_t uart_read_byte(USART_TypeDef *uart) {\n  return (uint8_t) (uart->SERCOM_DATA & 255U);\n}\n\nstatic inline void rng_init(void) {\n  MCLK_REGS->MCLK_APBCMASK |= MCLK_APBCMASK_TRNG_Msk;\n  TRNG_REGS->TRNG_CTRLA = TRNG_CTRLA_ENABLE_Msk;\n}\nstatic inline uint32_t rng_read(void) {\n  while ((TRNG_REGS->TRNG_INTFLAG & TRNG_INTFLAG_DATARDY_Msk) == 0) spin(1);\n  return TRNG_REGS->TRNG_DATA;\n}\n\n#define UID_BASE_W0 0x008061FC    // Word 0 location of the 128-bit chip ID\n#define UID_BASE_W1_3 0x00806010  // Words 1-3 location of the 128-bit chip ID\n\n#define UUID(n) ((n >= 0 && n <= 3) ? \\\n                     (((uint8_t *) UID_BASE_W0)[n]) : \\\n                     (((uint8_t *) UID_BASE_W1_3)[n - 4]))\n\n#define GENERATE_LOCALLY_ADMINISTERED_MAC()                         \\\n  {                                                                 \\\n    2, UUID(0) ^ UUID(1) ^ UUID(2), UUID(3) ^ UUID(4) ^ UUID(5),    \\\n        UUID(6) ^ UUID(7) ^ UUID(8), UUID(9) ^ UUID(10) ^ UUID(11), \\\n        UUID(12) ^ UUID(13) ^ UUID(14) ^ UUID(15)                   \\\n  }\n\nstatic inline bool timer_expired(volatile uint64_t *t, uint64_t prd,\n                                 uint64_t now) {\n  if (now + prd < *t) *t = 0;                    // Time wrapped? Reset timer\n  if (*t == 0) *t = now + prd;                   // Firt poll? Set expiration\n  if (*t > now) return false;                    // Not expired yet, return\n  *t = (now - *t) > prd ? now + prd : *t + prd;  // Next expiration time\n  return true;                                   // Expired, return true\n}\n\nstatic inline void clock_init(void) {\n  SCB->CPACR |= (15U << 20);                // Enable FPU\n  SysTick_Config(clock_sys_freq() / 1000);  // Sys tick every 1ms\n}\n\nstatic inline void gpio_set_irq_handler(uint16_t pin, void (*fn)(void *),\n                                        void *arg) {\n  (void) pin, (void) fn, (void) arg;\n}\n\nstatic inline void ethernet_init(void) {\n  uint16_t pins[] = {PIN('A', 12), PIN('A', 13), PIN('A', 14), PIN('A', 15),\n                     PIN('A', 17), PIN('A', 18), PIN('A', 19), PIN('C', 11),\n                     PIN('C', 12), PIN('C', 20)};\n  uint32_t af[] = {MUX_PA12L_GMAC_GRX1,  MUX_PA13L_GMAC_GRX0,\n                   MUX_PA14L_GMAC_GTXCK, MUX_PA15L_GMAC_GRXER,\n                   MUX_PA17L_GMAC_GTXEN, MUX_PA18L_GMAC_GTX0,\n                   MUX_PA19L_GMAC_GTX1,  MUX_PC11L_GMAC_GMDC,\n                   MUX_PC12L_GMAC_GMDIO, MUX_PC20L_GMAC_GRXDV};\n\n  MCLK_REGS->MCLK_APBBMASK |= MCLK_APBBMASK_PORT_Msk;\n\n  for (size_t i = 0; i < sizeof(pins) / sizeof(pins[0]); i++) {\n    int bank = PINBANK(pins[i]), no = PINNO(pins[i]);\n    PORT_REGS->GROUP[bank].PORT_PINCFG[no] |= PORT_PINCFG_PMUXEN_Msk;\n    volatile uint8_t *m = &PORT_REGS->GROUP[bank].PORT_PMUX[no / 2], v = m[0];\n    if (no & 1) {\n      m[0] = (uint8_t) ((v & ~0xf0) | PORT_PMUX_PMUXO(af[i]));\n    } else {\n      m[0] = (uint8_t) ((v & ~0x0f) | PORT_PMUX_PMUXE(af[i]));\n    }\n  }\n\n  PORT_REGS->GROUP[0].PORT_PINCFG[17] |= PORT_PINCFG_DRVSTR_Msk;\n  PORT_REGS->GROUP[0].PORT_PINCFG[18] |= PORT_PINCFG_DRVSTR_Msk;\n  PORT_REGS->GROUP[0].PORT_PINCFG[19] |= PORT_PINCFG_DRVSTR_Msk;\n\n  // Reset PHY\n  uint16_t phy_pin = PIN('C', 21);\n  gpio_output(phy_pin);\n  gpio_write(phy_pin, false);\n  spin(999);\n  gpio_write(phy_pin, true);\n  spin(999);\n}\n"
  },
  {
    "path": "tutorials/http/device-dashboard/microchip/same54-xpro/link.ld",
    "content": "ENTRY(Reset_Handler);\nMEMORY {\n  flash(rx) : ORIGIN = 0x00000000, LENGTH = 1024k\n  sram(rwx) : ORIGIN = 0x20000000, LENGTH = 256k\n}\n_estack     = ORIGIN(sram) + LENGTH(sram);\n\nSECTIONS {\n  .vectors  : { FILL(256) KEEP(*(.vectors)) } > flash\n  .text     : { *(.text*) }         > flash\n  .rodata   : { *(.rodata*) }       > flash\n\n  .data : {\n    _sdata = .;\n    *(.first_data)\n    *(.data SORT(.data.*))\n    _edata = .;\n  } > sram AT > flash\n  _sidata = LOADADDR(.data);\n\n  .bss : { _sbss = .; *(.bss SORT(.bss.*) COMMON) _ebss = .; } > sram\n\n  . = ALIGN(8);\n  _end = .;\n}\n"
  },
  {
    "path": "tutorials/http/device-dashboard/microchip/same54-xpro/main.c",
    "content": "// SPDX-FileCopyrightText: 2022-2023 Cesanta Software Limited\n// SPDX-License-Identifier: MIT\n\n#include \"hal.h\"\n#include \"mongoose.h\"\n#include \"net.h\"\n\n#define BLINK_PERIOD_MS 500  // LED blinking period in millis\n#define LOG_PERIOD_MS 1000   // Info log period in millis\n\nvoid SystemInit(void) {  // Called automatically by startup code\n  clock_init();\n  rng_init();\n}\n\nstatic volatile uint64_t s_ticks;  // Milliseconds since boot\nvoid SysTick_Handler(void) {       // SyStick IRQ handler, triggered every 1ms\n  s_ticks++;\n}\n\nuint64_t mg_millis(void) {  // Let Mongoose use our uptime function\n  return s_ticks;           // Return number of milliseconds since boot\n}\n\nbool mg_random(void *buf, size_t len) {  // Use on-board RNG\n  for (size_t n = 0; n < len; n += sizeof(uint32_t)) {\n    uint32_t r = rng_read();\n    memcpy((char *) buf + n, &r, n + sizeof(r) > len ? len - n : sizeof(r));\n  }\n  return true;\n}\n\nstatic void timer_fn(void *arg) {\n  struct mg_tcpip_if *ifp = arg;  // show network stats\n  const char *names[] = {\"down\", \"up\", \"req\", \"ready\"};\n  MG_INFO((\"Ethernet: %s, IP: %M, rx:%u, tx:%u, dr:%u, er:%u\",\n           names[ifp->state], mg_print_ip4, &ifp->ip, ifp->nrecv, ifp->nsent,\n           ifp->ndrop, ifp->nerr));\n}\n\nint main(void) {\n  gpio_input(BUTTON_PIN);\n  gpio_output(LED_PIN);\n  uart_init(UART_DEBUG, 115200);\n  ethernet_init();\n\n  MG_INFO((\"Starting, CPU freq %g MHz\", (double) clock_sys_freq() / 1000000));\n\n  struct mg_mgr mgr;        // Initialise\n  mg_mgr_init(&mgr);        // Mongoose event manager\n  mg_log_set(MG_LL_DEBUG);  // Set log level\n\n  // Initialise Mongoose network stack\n  struct mg_tcpip_driver_same54_data driver_data = {.mdc_cr = 5};\n  struct mg_tcpip_if mif = {.mac = GENERATE_LOCALLY_ADMINISTERED_MAC()/*{2, 3, 4, 5, 6, 7}*/,\n                            // Uncomment below for static configuration:\n                            // .ip = mg_htonl(MG_U32(192, 168, 0, 223)),\n                            // .mask = mg_htonl(MG_U32(255, 255, 255, 0)),\n                            // .gw = mg_htonl(MG_U32(192, 168, 0, 1)),\n                            .driver = &mg_tcpip_driver_same54,\n                            .driver_data = &driver_data};\n  mg_tcpip_init(&mgr, &mif);\n  mg_timer_add(&mgr, LOG_PERIOD_MS, MG_TIMER_REPEAT, timer_fn, &mif);\n\n  MG_INFO((\"MAC: %M. Waiting for IP...\", mg_print_mac, mif.mac));\n  while (mif.state != MG_TCPIP_STATE_READY) {\n    mg_mgr_poll(&mgr, 0);\n  }\n\n  MG_INFO((\"Initialising application...\"));\n  web_init(&mgr);\n\n  MG_INFO((\"Starting event loop\"));\n  for (;;) {\n    mg_mgr_poll(&mgr, 0);\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/http/device-dashboard/microchip/same54-xpro/startup.c",
    "content": "// SPDX-FileCopyrightText: 2022-2023 Cesanta Software Limited\n// SPDX-License-Identifier: MIT\n\n#include \"hal.h\"\n\nvoid Reset_Handler(void);    // Defined below\nvoid Dummy_Handler(void);    // Defined below\nvoid SysTick_Handler(void);  // Defined in main.c\nvoid SystemInit(void);       // Defined in main.c, called by reset handler\nvoid _estack(void);          // Defined in link.ld\n\n#define WEAK_ALIAS __attribute__((weak, alias(\"Default_Handler\")))\n\nWEAK_ALIAS void NMI_Handler(void);\nWEAK_ALIAS void HardFault_Handler(void);\nWEAK_ALIAS void MemoryManagement_Handler(void);\nWEAK_ALIAS void BusFault_Handler(void);\nWEAK_ALIAS void UsageFault_Handler(void);\nWEAK_ALIAS void SVCall_Handler(void);\nWEAK_ALIAS void DebugMonitor_Handler(void);\nWEAK_ALIAS void PendSV_Handler(void);\nWEAK_ALIAS void SysTick_Handler(void);\n\nWEAK_ALIAS void PM_Handler(void);\nWEAK_ALIAS void MCLK_Handler(void);\nWEAK_ALIAS void OSCCTRL_XOSC0_Handler(void);\nWEAK_ALIAS void OSCCTRL_XOSC1_Handler(void);\nWEAK_ALIAS void OSCCTRL_DFLL_Handler(void);\nWEAK_ALIAS void OSCCTRL_DPLL0_Handler(void);\nWEAK_ALIAS void OSCCTRL_DPLL1_Handler(void);\nWEAK_ALIAS void OSC32KCTRL_Handler(void);\nWEAK_ALIAS void SUPC_OTHER_Handler(void);\nWEAK_ALIAS void SUPC_BODDET_Handler(void);\nWEAK_ALIAS void WDT_Handler(void);\nWEAK_ALIAS void RTC_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_0_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_1_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_2_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_3_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_4_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_5_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_6_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_7_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_8_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_9_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_10_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_11_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_12_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_13_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_14_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_15_Handler(void);\nWEAK_ALIAS void FREQM_Handler(void);\nWEAK_ALIAS void NVMCTRL_0_Handler(void);\nWEAK_ALIAS void NVMCTRL_1_Handler(void);\nWEAK_ALIAS void DMAC_0_Handler(void);\nWEAK_ALIAS void DMAC_1_Handler(void);\nWEAK_ALIAS void DMAC_2_Handler(void);\nWEAK_ALIAS void DMAC_3_Handler(void);\nWEAK_ALIAS void DMAC_OTHER_Handler(void);\nWEAK_ALIAS void EVSYS_0_Handler(void);\nWEAK_ALIAS void EVSYS_1_Handler(void);\nWEAK_ALIAS void EVSYS_2_Handler(void);\nWEAK_ALIAS void EVSYS_3_Handler(void);\nWEAK_ALIAS void EVSYS_OTHER_Handler(void);\nWEAK_ALIAS void PAC_Handler(void);\nWEAK_ALIAS void RAMECC_Handler(void);\nWEAK_ALIAS void SERCOM0_0_Handler(void);\nWEAK_ALIAS void SERCOM0_1_Handler(void);\nWEAK_ALIAS void SERCOM0_2_Handler(void);\nWEAK_ALIAS void SERCOM0_OTHER_Handler(void);\nWEAK_ALIAS void SERCOM1_0_Handler(void);\nWEAK_ALIAS void SERCOM1_1_Handler(void);\nWEAK_ALIAS void SERCOM1_2_Handler(void);\nWEAK_ALIAS void SERCOM1_OTHER_Handler(void);\nWEAK_ALIAS void SERCOM2_0_Handler(void);\nWEAK_ALIAS void SERCOM2_1_Handler(void);\nWEAK_ALIAS void SERCOM2_2_Handler(void);\nWEAK_ALIAS void SERCOM2_OTHER_Handler(void);\nWEAK_ALIAS void SERCOM3_0_Handler(void);\nWEAK_ALIAS void SERCOM3_1_Handler(void);\nWEAK_ALIAS void SERCOM3_2_Handler(void);\nWEAK_ALIAS void SERCOM3_OTHER_Handler(void);\nWEAK_ALIAS void SERCOM4_0_Handler(void);\nWEAK_ALIAS void SERCOM4_1_Handler(void);\nWEAK_ALIAS void SERCOM4_2_Handler(void);\nWEAK_ALIAS void SERCOM4_OTHER_Handler(void);\nWEAK_ALIAS void SERCOM5_0_Handler(void);\nWEAK_ALIAS void SERCOM5_1_Handler(void);\nWEAK_ALIAS void SERCOM5_2_Handler(void);\nWEAK_ALIAS void SERCOM5_OTHER_Handler(void);\nWEAK_ALIAS void SERCOM6_0_Handler(void);\nWEAK_ALIAS void SERCOM6_1_Handler(void);\nWEAK_ALIAS void SERCOM6_2_Handler(void);\nWEAK_ALIAS void SERCOM6_OTHER_Handler(void);\nWEAK_ALIAS void SERCOM7_0_Handler(void);\nWEAK_ALIAS void SERCOM7_1_Handler(void);\nWEAK_ALIAS void SERCOM7_2_Handler(void);\nWEAK_ALIAS void SERCOM7_OTHER_Handler(void);\nWEAK_ALIAS void CAN0_Handler(void);\nWEAK_ALIAS void CAN1_Handler(void);\nWEAK_ALIAS void USB_OTHER_Handler(void);\nWEAK_ALIAS void USB_SOF_HSOF_Handler(void);\nWEAK_ALIAS void USB_TRCPT0_Handler(void);\nWEAK_ALIAS void USB_TRCPT1_Handler(void);\nWEAK_ALIAS void GMAC_Handler(void);\nWEAK_ALIAS void TCC0_OTHER_Handler(void);\nWEAK_ALIAS void TCC0_MC0_Handler(void);\nWEAK_ALIAS void TCC0_MC1_Handler(void);\nWEAK_ALIAS void TCC0_MC2_Handler(void);\nWEAK_ALIAS void TCC0_MC3_Handler(void);\nWEAK_ALIAS void TCC0_MC4_Handler(void);\nWEAK_ALIAS void TCC0_MC5_Handler(void);\nWEAK_ALIAS void TCC1_OTHER_Handler(void);\nWEAK_ALIAS void TCC1_MC0_Handler(void);\nWEAK_ALIAS void TCC1_MC1_Handler(void);\nWEAK_ALIAS void TCC1_MC2_Handler(void);\nWEAK_ALIAS void TCC1_MC3_Handler(void);\nWEAK_ALIAS void TCC2_OTHER_Handler(void);\nWEAK_ALIAS void TCC2_MC0_Handler(void);\nWEAK_ALIAS void TCC2_MC1_Handler(void);\nWEAK_ALIAS void TCC2_MC2_Handler(void);\nWEAK_ALIAS void TCC3_OTHER_Handler(void);\nWEAK_ALIAS void TCC3_MC0_Handler(void);\nWEAK_ALIAS void TCC3_MC1_Handler(void);\nWEAK_ALIAS void TCC4_OTHER_Handler(void);\nWEAK_ALIAS void TCC4_MC0_Handler(void);\nWEAK_ALIAS void TCC4_MC1_Handler(void);\nWEAK_ALIAS void TC0_Handler(void);\nWEAK_ALIAS void TC1_Handler(void);\nWEAK_ALIAS void TC2_Handler(void);\nWEAK_ALIAS void TC3_Handler(void);\nWEAK_ALIAS void TC4_Handler(void);\nWEAK_ALIAS void TC5_Handler(void);\nWEAK_ALIAS void TC6_Handler(void);\nWEAK_ALIAS void TC7_Handler(void);\nWEAK_ALIAS void PDEC_OTHER_Handler(void);\nWEAK_ALIAS void PDEC_MC0_Handler(void);\nWEAK_ALIAS void PDEC_MC1_Handler(void);\nWEAK_ALIAS void ADC0_OTHER_Handler(void);\nWEAK_ALIAS void ADC0_RESRDY_Handler(void);\nWEAK_ALIAS void ADC1_OTHER_Handler(void);\nWEAK_ALIAS void ADC1_RESRDY_Handler(void);\nWEAK_ALIAS void AC_Handler(void);\nWEAK_ALIAS void DAC_OTHER_Handler(void);\nWEAK_ALIAS void DAC_EMPTY_0_Handler(void);\nWEAK_ALIAS void DAC_EMPTY_1_Handler(void);\nWEAK_ALIAS void DAC_RESRDY_0_Handler(void);\nWEAK_ALIAS void DAC_RESRDY_1_Handler(void);\nWEAK_ALIAS void I2S_Handler(void);\nWEAK_ALIAS void PCC_Handler(void);\nWEAK_ALIAS void AES_Handler(void);\nWEAK_ALIAS void TRNG_Handler(void);\nWEAK_ALIAS void ICM_Handler(void);\nWEAK_ALIAS void PUKCC_Handler(void);\nWEAK_ALIAS void QSPI_Handler(void);\nWEAK_ALIAS void SDHC0_Handler(void);\nWEAK_ALIAS void SDHC1_Handler(void);\n\n__attribute__((section(\".vectors\"))) void (*const tab[16 + 138])(void) = {\n    _estack,\n    Reset_Handler,\n    NMI_Handler,\n    HardFault_Handler,\n    MemoryManagement_Handler,\n    BusFault_Handler,\n    UsageFault_Handler,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    SVCall_Handler,\n    DebugMonitor_Handler,\n    NULL,\n    PendSV_Handler,\n    SysTick_Handler,\n    PM_Handler,  //  0 Power\n    MCLK_Handler,  //  1 Main\n    OSCCTRL_XOSC0_Handler,  //  2 Oscillators\n    OSCCTRL_XOSC1_Handler,  //  3 Oscillators\n    OSCCTRL_DFLL_Handler,  //  4 Oscillators\n    OSCCTRL_DPLL0_Handler,  //  5 Oscillators\n    OSCCTRL_DPLL1_Handler,  //  6 Oscillators\n    OSC32KCTRL_Handler,  //  7 32kHz\n    SUPC_OTHER_Handler,  //  8 Supply\n    SUPC_BODDET_Handler,  //  9 Supply\n    WDT_Handler,  //  10 Watchdog\n    RTC_Handler,  //  11 Real-Time\n    EIC_EXTINT_0_Handler,  //  12 External\n    EIC_EXTINT_1_Handler,  //  13 External\n    EIC_EXTINT_2_Handler,  //  14 External\n    EIC_EXTINT_3_Handler,  //  15 External\n    EIC_EXTINT_4_Handler,  //  16 External\n    EIC_EXTINT_5_Handler,  //  17 External\n    EIC_EXTINT_6_Handler,  //  18 External\n    EIC_EXTINT_7_Handler,  //  19 External\n    EIC_EXTINT_8_Handler,  //  20 External\n    EIC_EXTINT_9_Handler,  //  21 External\n    EIC_EXTINT_10_Handler,  //  22 External\n    EIC_EXTINT_11_Handler,  //  23 External\n    EIC_EXTINT_12_Handler,  //  24 External\n    EIC_EXTINT_13_Handler,  //  25 External\n    EIC_EXTINT_14_Handler,  //  26 External\n    EIC_EXTINT_15_Handler,  //  27 External\n    FREQM_Handler,  //  28 Frequency\n    NVMCTRL_0_Handler,  //  29 Non-Volatile\n    NVMCTRL_1_Handler,  //  30 Non-Volatile\n    DMAC_0_Handler,  //  31 Direct\n    DMAC_1_Handler,  //  32 Direct\n    DMAC_2_Handler,  //  33 Direct\n    DMAC_3_Handler,  //  34 Direct\n    DMAC_OTHER_Handler,  //  35 Direct\n    EVSYS_0_Handler,  //  36 Event\n    EVSYS_1_Handler,  //  37 Event\n    EVSYS_2_Handler,  //  38 Event\n    EVSYS_3_Handler,  //  39 Event\n    EVSYS_OTHER_Handler,  //  40 Event\n    PAC_Handler,  //  41 Peripheral\n    0,  //  42 Reserved\n    0,  //  43 Reserved\n    0,  //  44 Reserved\n    RAMECC_Handler,  //  45 RAM\n    SERCOM0_0_Handler,  //  46 Serial\n    SERCOM0_1_Handler,  //  47 Serial\n    SERCOM0_2_Handler,  //  48 Serial\n    SERCOM0_OTHER_Handler,  //  49 Serial\n    SERCOM1_0_Handler,  //  50 Serial\n    SERCOM1_1_Handler,  //  51 Serial\n    SERCOM1_2_Handler,  //  52 Serial\n    SERCOM1_OTHER_Handler,  //  53 Serial\n    SERCOM2_0_Handler,  //  54 Serial\n    SERCOM2_1_Handler,  //  55 Serial\n    SERCOM2_2_Handler,  //  56 Serial\n    SERCOM2_OTHER_Handler,  //  57 Serial\n    SERCOM3_0_Handler,  //  58 Serial\n    SERCOM3_1_Handler,  //  59 Serial\n    SERCOM3_2_Handler,  //  60 Serial\n    SERCOM3_OTHER_Handler,  //  61 Serial\n    SERCOM4_0_Handler,  //  62 Serial\n    SERCOM4_1_Handler,  //  63 Serial\n    SERCOM4_2_Handler,  //  64 Serial\n    SERCOM4_OTHER_Handler,  //  65 Serial\n    SERCOM5_0_Handler,  //  66 Serial\n    SERCOM5_1_Handler,  //  67 Serial\n    SERCOM5_2_Handler,  //  68 Serial\n    SERCOM5_OTHER_Handler,  //  69 Serial\n    SERCOM6_0_Handler,  //  70 Serial\n    SERCOM6_1_Handler,  //  71 Serial\n    SERCOM6_2_Handler,  //  72 Serial\n    SERCOM6_OTHER_Handler,  //  73 Serial\n    SERCOM7_0_Handler,  //  74 Serial\n    SERCOM7_1_Handler,  //  75 Serial\n    SERCOM7_2_Handler,  //  76 Serial\n    SERCOM7_OTHER_Handler,  //  77 Serial\n    CAN0_Handler,  //  78 Control\n    CAN1_Handler,  //  79 Control\n    USB_OTHER_Handler,  //  80 Universal\n    USB_SOF_HSOF_Handler,  //  81 Universal\n    USB_TRCPT0_Handler,  //  82 Universal\n    USB_TRCPT1_Handler,  //  83 Universal\n    GMAC_Handler,  //  84 Ethernet\n    TCC0_OTHER_Handler,  //  85 Timer\n    TCC0_MC0_Handler,  //  86 Timer\n    TCC0_MC1_Handler,  //  87 Timer\n    TCC0_MC2_Handler,  //  88 Timer\n    TCC0_MC3_Handler,  //  89 Timer\n    TCC0_MC4_Handler,  //  90 Timer\n    TCC0_MC5_Handler,  //  91 Timer\n    TCC1_OTHER_Handler,  //  92 Timer\n    TCC1_MC0_Handler,  //  93 Timer\n    TCC1_MC1_Handler,  //  94 Timer\n    TCC1_MC2_Handler,  //  95 Timer\n    TCC1_MC3_Handler,  //  96 Timer\n    TCC2_OTHER_Handler,  //  97 Timer\n    TCC2_MC0_Handler,  //  98 Timer\n    TCC2_MC1_Handler,  //  99 Timer\n    TCC2_MC2_Handler,  //  100 Timer\n    TCC3_OTHER_Handler,  //  101 Timer\n    TCC3_MC0_Handler,  //  102 Timer\n    TCC3_MC1_Handler,  //  103 Timer\n    TCC4_OTHER_Handler,  //  104 Timer\n    TCC4_MC0_Handler,  //  105 Timer\n    TCC4_MC1_Handler,  //  106 Timer\n    TC0_Handler,  //  107 Basic\n    TC1_Handler,  //  108 Basic\n    TC2_Handler,  //  109 Basic\n    TC3_Handler,  //  110 Basic\n    TC4_Handler,  //  111 Basic\n    TC5_Handler,  //  112 Basic\n    TC6_Handler,  //  113 Basic\n    TC7_Handler,  //  114 Basic\n    PDEC_OTHER_Handler,  //  115 Quadrature\n    PDEC_MC0_Handler,  //  116 Quadrature\n    PDEC_MC1_Handler,  //  117 Quadrature\n    ADC0_OTHER_Handler,  //  118 Analog\n    ADC0_RESRDY_Handler,  //  119 Analog\n    ADC1_OTHER_Handler,  //  120 Analog\n    ADC1_RESRDY_Handler,  //  121 Analog\n    AC_Handler,  //  122 Analog\n    DAC_OTHER_Handler,  //  123 Digital-to-Analog\n    DAC_EMPTY_0_Handler,  //  124 Digital-to-Analog\n    DAC_EMPTY_1_Handler,  //  125 Digital-to-Analog\n    DAC_RESRDY_0_Handler,  //  126 Digital-to-Analog\n    DAC_RESRDY_1_Handler,  //  127 Digital-to-Analog\n    I2S_Handler,  //  128 Inter-IC\n    PCC_Handler,  //  129 Parallel\n    AES_Handler,  //  130 Advanced\n    TRNG_Handler,  //  131 True\n    ICM_Handler,  //  132 Integrity\n    PUKCC_Handler,  //  133 PUblic-Key\n    QSPI_Handler,  //  134 Quad\n    SDHC0_Handler,  //  135 SD/MMC\n    SDHC1_Handler  //  136 SD/MMC\n};\n\n__attribute__((naked, noreturn)) void Reset_Handler(void) {\n  // Clear BSS section, and copy data section from flash to RAM\n  extern long _sbss, _ebss, _sdata, _edata, _sidata;\n  for (long *src = &_sbss; src < &_ebss; src++) *src = 0;\n  for (long *src = &_sdata, *dst = &_sidata; src < &_edata;) *src++ = *dst++;\n\n  SCB->VTOR = (uint32_t) &tab;\n  SystemInit();\n\n  // Call main()\n  extern void main(void);\n  main();\n  for (;;) (void) 0;  // Infinite loop\n}\n\nvoid Default_Handler(void) {\n  for (;;) (void) 0;\n}\n"
  },
  {
    "path": "tutorials/http/device-dashboard/microchip/same54-xpro/syscalls.c",
    "content": "// Copyright (c) 2022 Cesanta Software Limited\n// All rights reserved\n\n#include <sys/stat.h>\n\n#include \"hal.h\"\n\nint _fstat(int fd, struct stat *st) {\n  if (fd < 0) return -1;\n  st->st_mode = S_IFCHR;\n  return 0;\n}\n\nvoid *_sbrk(int incr) {\n  extern char _end;\n  static unsigned char *heap = NULL;\n  unsigned char *prev_heap;\n  if (heap == NULL) heap = (unsigned char *) &_end;\n  prev_heap = heap;\n  heap += incr;\n  return prev_heap;\n}\n\nint _open(const char *path) {\n  (void) path;\n  return -1;\n}\n\nint _close(int fd) {\n  (void) fd;\n  return -1;\n}\n\nint _isatty(int fd) {\n  (void) fd;\n  return 1;\n}\n\nint _lseek(int fd, int ptr, int dir) {\n  (void) fd, (void) ptr, (void) dir;\n  return 0;\n}\n\nvoid _exit(int status) {\n  (void) status;\n  for (;;) asm volatile(\"BKPT #0\");\n}\n\nvoid _kill(int pid, int sig) {\n  (void) pid, (void) sig;\n}\n\nint _getpid(void) {\n  return -1;\n}\n\nint _write(int fd, char *ptr, int len) {\n  (void) fd, (void) ptr, (void) len;\n  if (fd == 1) uart_write_buf(UART_DEBUG, ptr, (size_t) len);\n  return -1;\n}\n\nint _read(int fd, char *ptr, int len) {\n  (void) fd, (void) ptr, (void) len;\n  return -1;\n}\n\nint _link(const char *a, const char *b) {\n  (void) a, (void) b;\n  return -1;\n}\n\nint _unlink(const char *a) {\n  (void) a;\n  return -1;\n}\n\nint _stat(const char *path, struct stat *st) {\n  (void) path, (void) st;\n  return -1;\n}\n\nint mkdir(const char *path, mode_t mode) {\n  (void) path, (void) mode;\n  return -1;\n}\n\nvoid _init(void) {\n}\n"
  },
  {
    "path": "tutorials/http/device-dashboard/net.c",
    "content": "// Copyright (c) 2023 Cesanta Software Limited\n// All rights reserved\n\n#include \"net.h\"\n\n// Authenticated user.\n// A user can be authenticated by:\n//   - a name:pass pair, passed in a header Authorization: Basic .....\n//   - an access_token, passed in a header Cookie: access_token=....\n// When a user is shown a login screen, she enters a user:pass. If successful,\n// a server responds with a http-only access_token cookie set.\nstruct user {\n  const char *name, *pass, *access_token;\n};\n\n// Settings\nstruct settings {\n  bool log_enabled;\n  int log_level;\n  long brightness;\n  char *device_name;\n};\n\nstatic struct settings s_settings = {true, 1, 57, NULL};\n\nstatic const char *s_json_header =\n    \"Content-Type: application/json\\r\\n\"\n    \"Cache-Control: no-cache\\r\\n\";\n\nint ui_event_next(int no, struct ui_event *e) {\n  if (no < 0 || no >= MAX_EVENTS_NO) return 0;\n\n  srand((unsigned) no);\n  e->type = (uint8_t) rand() % 4;\n  e->prio = (uint8_t) rand() % 3;\n  e->timestamp =\n      (unsigned long) ((int64_t) mg_now() - 86400 * 1000 /* one day back */ +\n                       no * 300 * 1000 /* 5 mins between alerts */ +\n                       1000 * (rand() % 300) /* randomize event time */) /\n      1000UL;\n\n  mg_snprintf(e->text, MAX_EVENT_TEXT_SIZE, \"event#%d\", no);\n  return no + 1;\n}\n\nstatic void timer_sntp_fn(void *param) {  // SNTP timer function. Sync up time\n  mg_sntp_connect(param, \"udp://time.google.com:123\", NULL, NULL);\n}\n\n// Parse HTTP requests, return authenticated user or NULL\nstatic struct user *authenticate(struct mg_http_message *hm) {\n  // In production, make passwords strong and tokens randomly generated\n  // In this example, user list is kept in RAM. In production, it can\n  // be backed by file, database, or some other method.\n  static struct user users[] = {\n      {\"admin\", \"admin\", \"admin_token\"},\n      {\"user1\", \"user1\", \"user1_token\"},\n      {\"user2\", \"user2\", \"user2_token\"},\n      {NULL, NULL, NULL},\n  };\n  char user[64], pass[64];\n  struct user *u, *result = NULL;\n  mg_http_creds(hm, user, sizeof(user), pass, sizeof(pass));\n  MG_VERBOSE((\"user [%s] pass [%s]\", user, pass));\n\n  if (user[0] != '\\0' && pass[0] != '\\0') {\n    // Both user and password is set, search by user/password\n    for (u = users; result == NULL && u->name != NULL; u++)\n      if (strcmp(user, u->name) == 0 && strcmp(pass, u->pass) == 0) result = u;\n  } else if (user[0] == '\\0') {\n    // Only password is set, search by token\n    for (u = users; result == NULL && u->name != NULL; u++)\n      if (strcmp(pass, u->access_token) == 0) result = u;\n  }\n  return result;\n}\n\nstatic void handle_login(struct mg_connection *c, struct user *u) {\n  char cookie[256];\n  const char *cookie_name = c->is_tls ? \"secure_access_token\" : \"access_token\";\n  mg_snprintf(cookie, sizeof(cookie),\n              \"Set-Cookie: %s=%s; Path=/; \"\n              \"%sHttpOnly; SameSite=Lax; Max-Age=%d\\r\\n\",\n              cookie_name, u->access_token,\n              c->is_tls ? \"Secure; \" : \"\", 3600 * 24);\n  mg_http_reply(c, 200, cookie, \"{%m:%m}\", MG_ESC(\"user\"), MG_ESC(u->name));\n}\n\nstatic void handle_logout(struct mg_connection *c) {\n  char cookie[256];\n  const char *cookie_name = c->is_tls ? \"secure_access_token\" : \"access_token\";\n  mg_snprintf(cookie, sizeof(cookie),\n              \"Set-Cookie: %s=; Path=/; \"\n              \"Expires=Thu, 01 Jan 1970 00:00:00 UTC; \"\n              \"%sHttpOnly; Max-Age=0; \\r\\n\", cookie_name,\n              c->is_tls ? \"Secure; \" : \"\");\n  mg_http_reply(c, 200, cookie, \"true\\n\");\n}\n\nstatic void handle_debug(struct mg_connection *c, struct mg_http_message *hm) {\n  int level = (int) mg_json_get_long(hm->body, \"$.level\", MG_LL_DEBUG);\n  mg_log_set(level);\n  mg_http_reply(c, 200, \"\", \"Debug level set to %d\\n\", level);\n}\n\nstatic size_t print_int_arr(void (*out)(char, void *), void *ptr, va_list *ap) {\n  size_t i, len = 0, num = va_arg(*ap, size_t);  // Number of items in the array\n  int *arr = va_arg(*ap, int *);                 // Array ptr\n  for (i = 0; i < num; i++) {\n    len += mg_xprintf(out, ptr, \"%s%d\", i == 0 ? \"\" : \",\", arr[i]);\n  }\n  return len;\n}\n\nstatic void handle_stats_get(struct mg_connection *c) {\n  int points[] = {21, 22, 22, 19, 18, 20, 23, 23, 22, 22, 22, 23, 22};\n  mg_http_reply(c, 200, s_json_header, \"{%m:%d,%m:%d,%m:[%M]}\\n\",\n                MG_ESC(\"temperature\"), 21,  //\n                MG_ESC(\"humidity\"), 67,     //\n                MG_ESC(\"points\"), print_int_arr,\n                sizeof(points) / sizeof(points[0]), points);\n}\n\nstatic size_t print_events(void (*out)(char, void *), void *ptr, va_list *ap) {\n  size_t len = 0;\n  struct ui_event ev;\n  int pageno = va_arg(*ap, int);\n  int no = (pageno - 1) * EVENTS_PER_PAGE;\n  int end = no + EVENTS_PER_PAGE;\n\n  while ((no = ui_event_next(no, &ev)) != 0 && no <= end) {\n    len += mg_xprintf(out, ptr, \"%s{%m:%lu,%m:%d,%m:%d,%m:%m}\\n\",  //\n                      len == 0 ? \"\" : \",\",                         //\n                      MG_ESC(\"time\"), ev.timestamp,                //\n                      MG_ESC(\"type\"), ev.type,                     //\n                      MG_ESC(\"prio\"), ev.prio,                     //\n                      MG_ESC(\"text\"), MG_ESC(ev.text));\n  }\n\n  return len;\n}\n\nstatic void handle_events_get(struct mg_connection *c,\n                              struct mg_http_message *hm) {\n  int pageno = (int) mg_json_get_long(hm->body, \"$.page\", 1);\n  mg_http_reply(c, 200, s_json_header, \"{%m:[%M], %m:%d}\\n\", MG_ESC(\"arr\"),\n                print_events, pageno, MG_ESC(\"totalCount\"), MAX_EVENTS_NO);\n}\n\nstatic void handle_settings_set(struct mg_connection *c, struct mg_str body) {\n  struct settings settings;\n  char *s = mg_json_get_str(body, \"$.device_name\");\n  bool ok = true;\n  memset(&settings, 0, sizeof(settings));\n  mg_json_get_bool(body, \"$.log_enabled\", &settings.log_enabled);\n  settings.log_level = (int) mg_json_get_long(body, \"$.log_level\", 0);\n  settings.brightness = mg_json_get_long(body, \"$.brightness\", 0);\n  if (s && strlen(s) < MAX_DEVICE_NAME) {\n    mg_free(settings.device_name);\n    settings.device_name = s;\n  } else {\n    mg_free(s);\n  }\n  s_settings = settings;  // Save to the device flash\n  mg_http_reply(c, 200, s_json_header,\n                \"{%m:%s,%m:%m}\",                          //\n                MG_ESC(\"status\"), ok ? \"true\" : \"false\",  //\n                MG_ESC(\"message\"), MG_ESC(ok ? \"Success\" : \"Failed\"));\n}\n\nstatic void handle_settings_get(struct mg_connection *c) {\n  mg_http_reply(c, 200, s_json_header, \"{%m:%s,%m:%hhu,%m:%hhu,%m:%m}\\n\",  //\n                MG_ESC(\"log_enabled\"),\n                s_settings.log_enabled ? \"true\" : \"false\",    //\n                MG_ESC(\"log_level\"), s_settings.log_level,    //\n                MG_ESC(\"brightness\"), s_settings.brightness,  //\n                MG_ESC(\"device_name\"), MG_ESC(s_settings.device_name));\n}\n\nstatic void handle_firmware_upload(struct mg_connection *c,\n                                   struct mg_http_message *hm) {\n  char name[64], offset[20], total[20];\n  struct mg_str data = hm->body;\n  long ofs = -1, tot = -1;\n  name[0] = offset[0] = '\\0';\n  mg_http_get_var(&hm->query, \"name\", name, sizeof(name));\n  mg_http_get_var(&hm->query, \"offset\", offset, sizeof(offset));\n  mg_http_get_var(&hm->query, \"total\", total, sizeof(total));\n  MG_INFO((\"File %s, offset %s, len %lu\", name, offset, data.len));\n  if ((ofs = mg_json_get_long(mg_str(offset), \"$\", -1)) < 0 ||\n      (tot = mg_json_get_long(mg_str(total), \"$\", -1)) < 0) {\n    mg_http_reply(c, 500, \"\", \"offset and total not set\\n\");\n  } else if (ofs == 0 && mg_ota_begin((size_t) tot) == false) {\n    mg_http_reply(c, 500, \"\", \"mg_ota_begin(%ld) failed\\n\", tot);\n  } else if (data.len > 0 && mg_ota_write(data.buf, data.len) == false) {\n    mg_http_reply(c, 500, \"\", \"mg_ota_write(%lu) @%ld failed\\n\", data.len, ofs);\n    mg_ota_end();\n  } else if (data.len == 0 && mg_ota_end() == false) {\n    mg_http_reply(c, 500, \"\", \"mg_ota_end() failed\\n\", tot);\n  } else {\n    mg_http_reply(c, 200, s_json_header, \"true\\n\");\n  }\n}\n\n// HTTP request handler function\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_ACCEPT) {\n    if (c->is_tls) {  // TLS listener!\n      struct mg_tls_opts opts = {0};\n      opts.cert = mg_unpacked(\"/certs/server_cert.pem\");\n      opts.key = mg_unpacked(\"/certs/server_key.pem\");\n      mg_tls_init(c, &opts);\n    }\n  } else if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    struct user *u = authenticate(hm);\n\n    if (mg_match(hm->uri, mg_str(\"/api/#\"), NULL) && u == NULL) {\n      mg_http_reply(c, 403, \"\", \"Not Authorised\\n\");\n    } else if (mg_match(hm->uri, mg_str(\"/api/login\"), NULL)) {\n      handle_login(c, u);\n    } else if (mg_match(hm->uri, mg_str(\"/api/logout\"), NULL)) {\n      handle_logout(c);\n    } else if (mg_match(hm->uri, mg_str(\"/api/debug\"), NULL)) {\n      handle_debug(c, hm);\n    } else if (mg_match(hm->uri, mg_str(\"/api/stats/get\"), NULL)) {\n      handle_stats_get(c);\n    } else if (mg_match(hm->uri, mg_str(\"/api/events/get\"), NULL)) {\n      handle_events_get(c, hm);\n    } else if (mg_match(hm->uri, mg_str(\"/api/settings/get\"), NULL)) {\n      handle_settings_get(c);\n    } else if (mg_match(hm->uri, mg_str(\"/api/settings/set\"), NULL)) {\n      handle_settings_set(c, hm->body);\n    } else if (mg_match(hm->uri, mg_str(\"/api/firmware/upload\"), NULL)) {\n      handle_firmware_upload(c, hm);\n    } else {\n      struct mg_http_serve_opts opts;\n      memset(&opts, 0, sizeof(opts));\n#if MG_ARCH == MG_ARCH_UNIX || MG_ARCH == MG_ARCH_WIN32\n      opts.root_dir = \"web_root\";  // On workstations, use filesystem\n#else\n      opts.root_dir = \"/web_root\";  // On embedded, use packed files\n      opts.fs = &mg_fs_packed;\n#endif\n      mg_http_serve_dir(c, ev_data, &opts);\n    }\n    MG_DEBUG((\"%lu %.*s %.*s -> %.*s\", c->id, (int) hm->method.len,\n              hm->method.buf, (int) hm->uri.len, hm->uri.buf, (int) 3,\n              &c->send.buf[9]));\n  }\n}\n\nvoid web_init(struct mg_mgr *mgr) {\n  s_settings.device_name = strdup(\"My Device\");\n  mg_http_listen(mgr, HTTP_URL, fn, NULL);\n  mg_http_listen(mgr, HTTPS_URL, fn, NULL);\n  mg_timer_add(mgr, 3600 * 1000, MG_TIMER_RUN_NOW | MG_TIMER_REPEAT,\n               timer_sntp_fn, mgr);\n}\n"
  },
  {
    "path": "tutorials/http/device-dashboard/net.h",
    "content": "// Copyright (c) 2023 Cesanta Software Limited\n// All rights reserved\n#pragma once\n\n#include \"mongoose.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if !defined(HTTP_URL)\n#define HTTP_URL \"http://0.0.0.0:8000\"\n#endif\n\n#if !defined(HTTPS_URL)\n#define HTTPS_URL \"https://0.0.0.0:8443\"\n#endif\n\n#define MAX_DEVICE_NAME 40\n#define MAX_EVENTS_NO 400\n#define MAX_EVENT_TEXT_SIZE 10\n#define EVENTS_PER_PAGE 20\n\n// Event log entry\nstruct ui_event {\n  uint8_t type, prio;\n  unsigned long timestamp;\n  char text[10];\n};\n\nvoid web_init(struct mg_mgr *mgr);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "tutorials/http/device-dashboard/pack.js",
    "content": "// Copyright (c) 2024 Cesanta Software Limited\n//\n// Utility that generates packed filesystem C file compatible with the\n// Mongoose Network Library, https://github.com/cesanta/mongoose\n//\n// Usage:\n//    node pack.js FILE[:DESTINATION[:gzip]] ...\n\nconst fs = require('fs');\nconst zlib = require('zlib');\nconst argv = process.argv.slice(2);\n\n// Convert each command-line arguments into [ DATA_ARRAY, STRUCT_INITIALIZER ]\nconst entries = argv.map(function(filename, i) {\n  const parts = filename.split(':');\n  const stat = fs.statSync(parts[0]);\n  const data = fs.readFileSync(parts[0], null);\n  let bytes = Array.from(data);\n  let destination = (parts[1] || parts[0]).replace(/^\\.+[\\/\\\\]*/, '');\n  if (parts[2] == 'gzip') {\n    bytes = Array.from(zlib.gzipSync(data));\n    destination += '.gz';\n  }\n  \n  // concat(0) appends trailing 0, in order to make any file an asciz string\n  return [\n    `static const unsigned char v${i}[] = {${bytes.concat(0).join(',')}};`,\n    `  {\"/${destination}\", v${i}, sizeof(v${i}) - 1, ${parseInt(stat.mtimeMs / 1000)}}`,\n  ];\n});\n\nprocess.stdout.write(`// DO NOT EDIT. This file is generated using this command:\n// ${process.argv.join(' ')}\n\n#include <stddef.h>\n#include <string.h>\n#include <time.h>\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\nconst char *mg_unlist(size_t no);\nconst char *mg_unpack(const char *, size_t *, time_t *);\n\n#if defined(__cplusplus)\n}\n#endif\n\n${entries.map(x => x[0]).join('\\n\\n')}\n\nstatic const struct packed_file {\n  const char *name;\n  const unsigned char *data;\n  size_t size;\n  time_t mtime;\n} packed_files[] = {\n${entries.map(x => x[1]).join(',\\n')},\n  {NULL, NULL, 0, 0}\n};\n\nstatic int scmp(const char *a, const char *b) {\n  while (*a && (*a == *b)) a++, b++;\n  return *(const unsigned char *) a - *(const unsigned char *) b;\n}\n\nconst char *mg_unlist(size_t no) {\n  return packed_files[no].name;\n}\n\nconst char *mg_unpack(const char *name, size_t *size, time_t *mtime) {\n  const struct packed_file *p;\n  for (p = packed_files; p->name != NULL; p++) {\n    if (scmp(p->name, name) != 0) continue;\n    if (size != NULL) *size = p->size;\n    if (mtime != NULL) *mtime = p->mtime;\n    return (const char *) p->data;\n  }\n  return NULL;\n};\n`);\n"
  },
  {
    "path": "tutorials/http/device-dashboard/packed_fs.c",
    "content": "// DO NOT EDIT. This file is generated using this command:\n// /usr/local/lib/nodejs/node-v18.16.1-linux-x64/bin/node /home/scaprile/work/cesanta/mongoose/tutorials/http/device-dashboard/pack.js web_root/bundle.js::gzip web_root/components.js::gzip web_root/history.min.js::gzip web_root/index.html::gzip web_root/main.js::gzip certs/server_cert.pem certs/server_key.pem\n\n#include <stddef.h>\n#include <string.h>\n#include <time.h>\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\nconst char *mg_unlist(size_t no);\nconst char *mg_unpack(const char *, size_t *, time_t *);\n\n#if defined(__cplusplus)\n}\n#endif\n\nstatic const unsigned char v0[] = {31,139,8,0,0,0,0,0,0,3,173,60,139,114,219,56,146,191,18,105,83,90,98,132,200,118,102,178,119,71,25,81,37,30,79,156,153,60,188,118,30,187,171,209,170,40,10,178,56,166,64,153,132,228,120,76,221,183,95,119,227,65,82,166,231,246,182,174,42,17,65,60,27,141,126,163,233,109,148,63,81,92,115,201,167,60,231,25,79,248,134,167,60,22,247,59,30,137,241,132,23,226,32,138,19,93,202,111,193,40,44,202,171,82,149,235,242,41,43,243,245,178,188,202,147,121,153,221,22,229,74,197,165,210,183,101,162,228,56,94,78,202,223,179,172,252,103,150,207,203,68,203,60,58,72,134,139,141,138,117,146,169,39,139,0,22,99,247,139,44,15,182,176,178,124,146,168,39,154,169,177,156,8,13,63,195,92,234,77,174,158,168,157,31,177,14,20,187,199,190,90,168,193,58,202,165,210,31,178,185,28,234,94,79,15,114,185,202,182,242,100,153,164,115,232,86,13,90,6,180,35,51,208,110,11,182,52,196,117,19,92,83,178,238,181,188,235,10,145,140,114,33,199,201,36,236,230,114,65,239,153,121,223,192,15,149,134,201,34,136,242,171,205,10,86,46,6,169,84,87,122,249,242,121,175,23,108,6,49,46,12,16,137,7,237,223,143,212,32,142,210,180,26,201,159,179,112,202,120,215,193,8,107,233,187,181,204,22,79,96,39,106,147,166,29,161,7,115,185,136,54,169,62,207,179,117,193,60,176,123,245,219,44,153,63,57,20,66,32,136,8,7,66,218,236,3,53,204,225,114,14,184,216,208,217,226,42,53,36,1,202,220,161,27,68,1,138,16,164,80,241,53,78,18,78,57,224,40,204,57,96,38,204,248,116,122,29,226,12,80,112,207,89,120,8,191,210,189,206,67,3,26,20,99,87,183,52,133,56,83,133,206,55,177,206,242,170,211,150,218,16,231,253,190,12,147,157,63,125,83,91,161,101,171,224,196,241,188,169,16,108,24,223,84,219,216,6,236,222,12,188,143,55,57,210,7,77,187,171,122,172,144,132,220,220,254,208,170,246,59,67,148,122,153,20,3,218,185,128,119,124,1,168,181,252,166,133,174,250,94,153,190,64,19,6,74,205,252,196,211,233,8,90,225,193,241,7,254,93,15,18,53,151,223,62,66,95,214,63,98,4,214,208,147,254,80,31,43,234,100,72,102,168,251,125,102,167,237,136,64,10,106,28,235,9,115,120,144,80,33,221,114,244,98,17,214,66,83,106,128,5,132,199,44,91,109,96,230,249,137,203,97,181,158,162,245,252,90,248,18,27,62,197,162,129,38,30,204,162,2,138,120,160,90,28,254,155,27,184,127,48,161,217,203,44,151,209,245,206,110,15,161,172,157,224,53,2,29,116,112,204,28,40,158,158,162,115,8,51,231,131,245,166,88,66,115,175,215,57,129,234,188,223,47,203,172,35,136,33,102,25,76,32,47,36,156,66,158,168,43,232,19,4,89,107,75,89,38,44,56,169,49,199,73,96,176,228,100,35,138,16,32,99,58,190,124,80,100,185,6,50,28,42,1,229,101,178,208,1,27,50,7,157,134,74,131,18,62,21,150,216,51,87,72,69,144,16,114,24,244,222,226,143,228,65,76,40,56,71,248,166,40,116,1,200,69,0,18,56,97,212,75,36,248,219,63,226,159,130,24,192,200,56,246,86,220,204,8,91,141,7,217,173,146,249,229,151,55,167,169,68,97,195,13,190,113,216,114,52,78,39,150,25,185,33,217,20,200,34,97,97,202,169,157,241,139,96,10,43,209,155,236,136,180,215,155,65,51,227,110,19,47,53,98,217,238,152,13,9,201,226,176,194,212,183,224,161,254,40,12,242,22,124,205,151,124,203,239,248,140,95,243,19,49,237,245,136,47,202,50,226,223,196,137,35,28,196,41,110,233,26,247,190,0,194,90,28,107,223,214,32,170,45,33,234,122,188,152,8,179,23,168,209,240,6,231,215,157,101,89,42,163,26,15,108,161,242,33,103,108,71,56,50,236,130,56,130,131,111,246,86,155,213,76,230,205,186,89,114,149,40,93,31,63,39,104,96,91,244,48,101,22,190,202,243,232,110,144,20,244,12,182,12,186,173,248,189,19,54,225,118,87,235,78,130,56,220,194,86,102,47,15,161,227,150,184,149,111,141,244,129,39,200,93,248,5,185,59,162,95,115,126,91,162,152,112,203,72,252,224,155,144,84,57,35,172,204,128,64,12,82,68,176,20,39,6,43,203,94,143,102,19,98,137,15,124,195,165,4,190,99,129,97,63,75,155,67,153,22,242,9,30,198,26,206,96,125,252,109,184,6,228,227,90,52,223,26,25,249,143,39,187,199,94,110,54,195,207,75,58,168,221,39,32,146,45,95,138,101,89,198,13,58,225,119,98,107,152,96,45,104,175,176,200,18,159,29,177,6,118,0,82,9,144,44,24,167,202,94,239,218,240,59,189,57,220,115,91,185,38,108,196,101,9,200,3,2,54,52,115,55,178,146,122,6,211,205,196,93,171,10,54,27,193,13,33,21,226,126,224,57,218,146,152,73,197,105,176,5,88,65,146,166,226,179,217,7,63,1,154,78,91,167,146,118,42,162,104,24,205,96,24,110,9,101,30,50,87,90,51,98,64,206,66,199,84,92,5,75,6,178,199,178,129,20,51,224,130,111,195,197,179,103,32,84,104,19,120,74,208,243,15,150,171,250,225,12,189,158,43,9,162,141,185,135,231,85,48,101,3,5,74,237,50,153,165,40,249,248,215,0,251,114,34,24,134,26,225,154,44,15,195,135,215,117,62,124,31,32,231,241,235,113,191,239,31,53,145,121,106,4,65,101,221,129,68,48,74,0,196,223,225,48,239,245,178,99,39,84,134,25,204,7,194,46,31,103,19,18,123,72,205,48,92,180,108,113,106,116,217,41,136,41,156,62,252,28,160,176,65,113,51,37,202,209,204,219,58,53,69,125,102,20,181,107,16,186,44,65,186,24,82,80,109,226,2,42,131,38,19,43,6,86,92,145,173,100,16,184,105,81,15,153,153,119,112,176,218,41,31,198,107,43,127,174,11,68,35,8,137,218,17,183,94,102,107,60,13,150,152,39,167,223,6,27,122,3,67,150,101,222,17,89,89,154,215,188,70,62,76,133,190,27,116,200,26,148,5,26,70,13,162,245,26,84,156,177,143,115,16,241,196,140,180,0,29,210,70,100,160,144,14,135,80,216,52,136,2,200,244,120,234,142,42,237,139,35,148,193,27,88,157,17,87,63,81,67,5,182,77,33,115,253,90,194,68,50,192,157,194,244,153,211,223,126,159,201,40,9,243,250,220,21,158,94,213,44,17,62,29,250,173,24,219,5,142,104,95,68,155,134,186,193,101,44,24,36,49,162,89,45,234,6,201,179,163,161,126,137,102,202,179,103,8,126,211,34,1,218,123,21,72,198,220,108,211,186,241,89,193,120,94,157,165,129,53,35,109,149,89,31,194,137,119,128,17,79,192,250,20,116,24,100,184,151,229,7,152,192,88,222,92,2,173,131,79,82,77,0,182,99,175,87,17,124,199,59,4,208,17,38,123,124,242,238,54,74,55,210,189,196,75,25,95,203,185,125,197,85,160,100,230,48,171,99,217,173,94,109,237,210,177,107,247,89,151,6,28,78,144,220,37,121,16,112,178,119,129,182,236,34,71,221,110,8,140,167,0,117,162,86,229,244,165,7,28,14,173,24,104,89,232,64,179,145,12,101,191,187,254,214,173,86,252,240,16,153,68,193,112,208,119,41,109,71,51,243,218,60,119,32,244,1,117,25,196,69,241,9,13,114,105,104,184,173,243,148,236,195,102,247,169,232,118,25,108,158,104,4,49,63,101,232,78,208,33,150,229,165,235,15,192,65,63,36,41,89,117,149,12,102,148,184,115,33,166,240,104,246,199,6,182,115,28,219,205,28,38,225,92,149,41,31,77,24,152,156,192,9,64,157,232,176,174,211,40,150,193,193,73,180,6,114,147,79,15,112,73,16,31,208,166,179,119,217,173,204,79,192,36,14,24,172,172,70,123,117,131,34,77,96,236,115,20,60,174,8,190,70,10,130,11,126,193,191,165,183,177,238,3,5,72,46,71,83,16,26,131,104,62,63,221,130,84,120,151,20,90,130,149,8,167,154,141,126,12,111,129,97,67,101,29,232,199,58,120,81,212,157,71,234,74,230,217,166,72,239,46,165,126,171,160,223,217,167,247,239,186,40,201,200,68,200,89,99,123,223,128,213,175,131,179,50,92,50,216,225,178,203,170,166,226,67,180,162,125,23,221,218,2,183,201,92,47,105,58,64,221,82,38,87,75,237,223,208,51,183,229,20,128,116,101,56,162,149,43,235,104,246,22,125,45,247,62,7,139,56,205,162,185,125,167,147,84,76,231,119,247,251,68,108,29,143,39,106,23,71,58,70,97,126,191,107,211,179,136,100,39,144,59,71,112,180,64,65,192,57,56,255,248,7,228,28,131,202,87,26,232,113,182,209,18,88,32,36,118,170,213,0,183,213,189,154,219,154,95,74,254,102,58,54,34,174,223,57,154,4,122,32,241,88,70,246,73,158,92,141,125,127,124,124,240,225,255,58,24,205,177,189,136,143,225,200,136,23,100,179,207,193,202,185,50,86,59,63,229,103,252,51,127,197,207,249,165,48,230,70,67,147,201,65,205,185,103,53,41,58,52,54,9,42,105,48,67,193,201,161,18,40,28,99,228,24,229,141,101,99,35,130,250,0,87,133,241,32,34,165,56,3,33,29,1,35,14,233,208,72,76,60,60,149,75,162,61,180,127,141,229,124,45,96,244,165,243,219,63,161,182,0,231,101,28,161,89,8,38,142,136,70,215,163,107,211,119,64,50,52,196,166,208,88,18,241,232,74,4,5,65,103,96,141,209,251,18,5,252,156,134,65,23,70,233,12,215,237,2,45,93,246,122,151,3,95,3,103,143,142,228,200,12,45,132,146,183,32,94,103,252,132,133,65,189,238,142,234,120,81,199,152,184,132,119,51,94,124,1,83,22,77,220,98,51,11,10,236,103,162,17,51,40,21,58,210,72,131,182,68,204,94,5,40,78,56,66,9,222,40,95,19,188,232,28,83,213,146,98,120,131,105,49,35,35,218,80,48,54,20,112,34,244,20,118,70,103,47,95,14,174,164,254,17,188,226,173,156,95,98,195,79,121,182,162,160,146,31,225,134,248,10,114,86,169,8,162,108,97,42,249,227,19,5,51,215,25,204,122,97,119,201,231,110,90,106,4,79,143,175,153,129,247,143,64,50,64,35,38,86,235,76,1,169,127,77,210,244,61,120,247,192,245,109,181,129,219,103,173,241,199,100,238,71,0,202,140,81,215,210,206,188,214,249,223,225,154,1,103,44,31,1,239,66,198,18,198,216,158,127,208,104,200,165,83,24,147,222,205,85,44,179,77,58,63,113,131,62,175,231,116,22,36,148,30,105,117,24,135,233,192,66,32,244,10,34,241,173,177,214,169,170,99,171,232,88,247,40,207,208,12,183,180,117,196,168,36,161,196,247,153,249,154,202,215,166,60,128,201,79,35,144,170,13,3,90,217,16,142,144,104,69,243,83,176,209,78,143,137,72,157,201,121,10,222,65,227,44,160,109,124,58,97,67,71,202,134,184,109,247,94,111,99,251,49,47,204,91,17,239,80,213,90,93,195,81,43,137,84,131,61,92,213,174,216,125,91,231,128,4,41,110,114,151,44,130,38,187,86,8,158,78,207,193,245,57,35,169,151,243,207,226,144,255,11,178,198,156,91,251,233,240,179,94,239,12,68,39,143,132,19,45,238,68,121,197,99,22,24,198,95,1,254,95,53,241,255,170,13,255,175,106,248,55,38,207,60,187,255,55,215,108,0,190,187,5,75,87,146,216,0,71,181,223,255,124,252,252,5,46,85,223,155,59,17,224,56,114,103,78,204,76,64,73,57,136,31,18,64,57,78,187,215,30,160,140,89,59,231,137,154,47,85,180,6,38,177,158,139,57,40,16,172,219,199,91,241,24,97,154,115,97,128,136,64,49,185,192,199,202,176,165,16,17,70,68,70,145,213,45,62,236,19,113,12,143,53,221,202,115,54,58,15,199,231,147,7,26,24,192,175,226,161,117,205,248,8,177,243,43,43,129,79,9,73,212,183,226,76,115,68,62,150,222,224,250,81,176,207,170,150,133,89,104,94,222,5,150,163,107,32,198,108,72,186,121,158,44,22,114,110,213,115,101,53,153,5,8,222,32,54,24,239,136,132,217,200,131,20,169,221,81,167,19,243,100,156,248,216,120,202,38,22,114,100,0,105,44,147,186,153,116,129,85,236,30,91,99,188,4,128,71,32,185,66,99,119,207,57,199,94,104,45,16,6,151,118,61,244,250,91,188,120,123,63,67,34,168,218,132,7,129,100,227,14,219,60,28,239,130,189,48,103,101,50,45,64,143,77,189,30,115,214,200,214,154,75,124,5,28,70,190,202,22,29,21,129,18,54,195,240,181,139,211,146,183,49,92,29,39,142,255,86,38,234,9,232,78,198,43,116,87,187,117,67,18,133,66,36,0,145,56,209,22,136,46,205,96,47,104,86,227,228,225,247,2,201,17,111,74,200,0,130,77,137,136,227,60,198,251,55,113,185,218,5,70,165,208,196,214,217,111,243,44,166,107,171,65,12,189,181,68,47,10,195,10,193,28,236,49,145,141,246,154,109,216,249,195,101,208,93,106,189,14,15,14,110,111,111,7,183,223,15,178,252,234,224,249,225,225,225,1,238,28,163,164,237,3,131,45,159,3,123,244,122,115,23,163,0,43,17,40,184,14,216,18,126,231,101,153,34,5,0,83,70,230,53,176,47,243,74,55,39,116,115,100,78,87,27,78,68,208,209,158,194,192,168,61,166,178,4,235,238,17,175,134,47,196,252,209,182,78,234,17,230,78,110,137,183,165,120,198,171,99,61,136,220,41,21,245,195,92,142,235,45,112,22,3,5,199,133,215,118,205,90,50,74,135,193,2,28,105,228,156,5,50,120,175,183,64,66,214,43,107,186,97,169,44,171,58,152,36,113,224,49,66,137,127,21,139,106,112,89,162,167,137,56,61,7,66,158,131,145,159,97,8,115,193,92,232,221,59,99,43,71,193,94,142,129,20,211,123,82,108,197,70,171,16,64,118,44,97,28,50,112,220,212,199,217,111,50,38,47,109,75,124,146,140,18,240,136,67,146,53,189,222,85,48,229,64,249,105,147,248,87,162,162,253,42,236,137,68,219,235,173,3,98,130,33,250,185,54,242,1,12,0,154,194,187,32,48,124,110,80,135,72,91,81,120,141,94,97,207,176,145,171,92,22,133,101,188,206,10,234,178,181,117,35,176,6,187,47,253,232,15,176,81,187,8,95,113,91,207,209,226,241,113,150,182,197,109,27,51,211,105,247,110,231,115,35,105,70,251,130,115,178,221,195,184,229,123,43,0,73,146,181,221,236,141,80,206,129,107,105,47,59,133,124,40,189,26,226,243,171,155,208,222,133,163,36,210,131,141,90,25,147,215,23,97,2,30,96,192,214,4,225,131,220,173,128,215,63,182,136,97,69,92,163,44,223,7,185,141,106,249,72,123,144,219,107,67,19,16,216,179,177,204,34,228,130,183,55,5,109,98,24,48,100,116,98,110,204,36,186,61,33,143,202,224,31,201,217,6,153,137,142,48,208,188,23,101,198,16,115,175,247,53,200,41,10,198,167,245,91,161,206,94,104,113,56,117,166,130,221,230,218,92,127,50,90,84,84,55,151,46,88,91,161,249,139,11,167,213,125,242,154,159,103,118,227,187,255,20,212,227,96,200,39,67,220,180,209,111,216,134,146,16,182,211,66,1,57,51,87,88,57,30,12,221,166,25,53,190,65,85,247,9,216,75,138,160,3,252,152,67,3,35,222,94,6,43,115,88,99,9,78,96,130,119,48,113,117,125,56,125,112,125,72,163,71,227,124,18,38,102,169,233,96,145,228,133,177,172,92,102,195,180,46,91,205,13,213,198,142,204,97,28,93,39,54,6,98,136,248,34,216,52,208,240,214,68,233,127,34,228,189,173,53,124,108,203,224,32,51,79,27,217,196,254,189,100,14,123,58,255,127,9,29,115,96,38,82,242,27,14,8,215,116,117,151,97,193,93,80,213,54,245,212,236,150,174,255,197,61,102,73,104,209,133,199,73,183,159,246,251,148,88,193,193,112,45,96,129,60,172,140,149,218,61,70,149,190,16,104,182,227,224,37,110,147,121,163,179,157,158,251,128,54,17,226,158,89,12,146,84,210,69,243,20,3,9,24,17,195,94,188,173,171,168,249,56,46,86,190,51,61,91,93,77,81,7,165,74,169,48,130,148,228,7,149,208,32,109,51,202,200,118,61,228,120,225,143,198,151,93,104,51,107,76,43,221,189,203,208,37,6,181,9,148,97,123,117,125,67,0,195,154,2,169,178,150,170,193,65,216,147,96,164,243,198,60,4,100,127,159,54,226,211,84,228,192,161,159,124,217,129,59,185,122,248,9,164,51,16,147,137,214,114,141,103,46,27,7,107,104,220,93,152,17,157,15,53,121,130,67,50,0,115,42,199,152,221,128,171,144,248,196,250,76,228,141,176,155,139,14,100,109,33,137,211,60,207,114,146,232,96,69,82,109,240,120,63,186,205,74,72,222,206,157,100,207,27,190,237,9,74,105,163,32,246,107,81,247,148,37,198,166,252,12,137,51,41,115,114,84,114,43,228,129,164,149,208,59,189,204,179,91,112,215,119,32,180,14,249,180,113,202,181,80,34,93,148,250,188,39,85,223,250,142,223,213,156,99,183,65,209,228,30,147,112,35,173,3,71,52,69,33,48,87,66,157,77,132,134,99,71,174,54,116,5,43,120,124,143,214,139,95,138,106,8,101,124,81,232,82,209,62,106,72,176,195,172,211,226,182,99,39,71,27,94,187,55,240,192,137,178,193,67,190,14,176,10,89,160,190,63,160,148,88,62,198,104,118,50,83,36,54,170,150,89,58,150,121,100,98,27,129,92,241,28,229,66,210,166,119,128,218,87,73,33,71,246,89,27,172,151,82,13,102,192,65,129,107,3,139,43,75,183,18,220,239,16,142,228,83,178,146,217,70,163,4,111,23,106,0,57,134,124,159,105,87,218,113,155,103,66,247,147,120,124,191,241,27,254,154,255,194,223,64,221,239,8,227,207,248,243,87,19,43,230,127,179,209,147,191,123,255,148,255,195,176,14,87,64,103,206,198,169,18,17,181,170,188,202,165,209,186,203,224,134,43,254,166,44,225,240,222,216,85,167,226,6,90,206,64,94,210,19,25,56,132,101,49,175,109,60,217,249,123,103,245,146,220,103,239,162,211,11,33,28,6,124,9,127,6,134,192,170,177,154,84,202,64,214,137,252,141,56,226,83,21,92,43,94,15,211,79,149,51,42,12,44,0,244,111,160,39,158,211,29,213,116,0,130,143,119,166,198,45,54,55,232,99,57,162,139,135,107,101,227,243,128,101,190,175,27,52,193,250,97,68,191,206,50,135,39,199,24,128,198,91,63,112,242,58,116,193,65,179,126,128,105,13,248,71,147,137,137,148,87,130,228,30,165,180,173,21,55,188,115,51,216,48,171,180,69,83,208,145,85,104,192,69,84,90,177,208,49,120,206,133,111,64,212,45,146,84,203,188,169,27,106,196,18,239,76,166,66,142,183,27,249,93,91,63,202,21,251,176,243,23,188,29,186,32,55,78,33,170,58,3,18,173,157,128,171,57,244,66,170,53,98,105,111,153,63,84,153,168,132,177,161,183,10,63,144,129,248,193,101,121,57,67,153,110,2,193,35,5,95,31,99,9,188,19,116,18,67,29,177,13,0,226,61,61,116,105,7,143,237,134,128,79,97,113,148,1,45,182,170,92,96,215,155,182,136,230,176,181,182,237,88,156,204,112,132,150,13,125,194,90,110,187,241,76,76,119,0,124,242,0,202,29,127,4,46,16,246,206,98,64,228,24,59,181,162,238,220,178,96,131,182,191,103,195,142,54,194,121,166,136,252,206,184,172,101,136,76,7,137,144,252,198,18,138,149,106,211,122,152,38,107,155,246,135,127,121,218,182,41,55,77,86,125,193,99,213,136,253,238,167,159,162,197,48,174,167,198,164,30,217,111,196,95,120,214,54,186,213,213,11,192,204,11,88,141,133,43,54,8,140,109,9,150,55,244,242,206,32,222,111,180,116,246,237,148,221,192,108,10,238,142,249,11,126,25,210,53,30,232,102,212,255,21,224,113,93,129,58,100,254,135,151,123,128,75,73,184,212,204,132,20,191,128,2,100,28,172,41,161,93,0,147,158,95,76,96,177,154,56,106,170,128,55,226,63,219,145,10,182,1,195,108,27,63,176,168,201,177,27,103,106,141,73,42,160,4,179,32,254,23,171,172,180,24,19,139,92,22,152,36,39,139,96,69,5,169,233,174,237,6,111,224,235,118,42,250,215,117,104,23,94,91,108,10,249,163,156,109,174,190,24,35,118,175,34,64,249,187,119,215,186,174,1,108,161,59,58,4,28,9,80,0,85,226,146,33,195,155,135,38,21,169,158,7,181,117,38,158,26,45,102,93,71,124,231,18,68,53,89,208,224,241,161,100,175,155,188,216,100,206,31,4,119,45,101,94,185,140,87,15,229,17,9,89,146,164,149,141,170,73,35,110,237,229,46,94,174,19,99,173,156,5,106,141,87,107,196,90,186,193,14,20,153,130,167,24,31,242,195,9,51,178,179,123,222,237,35,132,253,238,51,44,28,77,250,253,93,77,208,215,146,213,17,60,7,131,26,42,241,123,149,120,107,165,243,57,134,253,80,179,80,12,216,75,8,39,208,239,148,241,226,155,181,87,245,90,188,216,48,230,105,198,238,235,181,54,52,157,81,87,140,11,147,213,209,176,192,110,76,112,226,175,189,222,95,17,243,52,34,111,244,248,91,175,247,55,52,192,126,179,182,133,22,193,141,141,152,224,82,248,69,67,240,26,20,194,205,136,16,69,235,222,212,1,120,228,54,13,101,171,187,81,51,90,138,192,252,34,126,182,74,73,1,59,58,142,7,131,204,204,222,192,139,126,128,19,7,1,112,198,107,113,131,219,49,102,85,99,71,127,239,245,254,238,188,48,155,209,61,148,230,170,225,204,50,153,193,182,179,139,130,35,32,144,223,141,132,69,241,251,11,69,47,115,121,179,145,133,126,165,146,85,132,83,255,148,71,43,188,146,9,126,121,172,145,149,229,74,177,96,142,190,138,91,229,49,236,36,22,55,103,136,7,139,26,128,226,231,58,202,190,96,189,67,146,195,30,34,11,55,111,132,38,97,36,222,227,187,105,139,15,235,168,239,33,229,45,133,173,127,212,186,33,94,43,203,43,101,221,95,67,140,178,125,33,101,76,215,64,185,163,66,11,99,90,81,171,244,212,10,245,255,232,245,254,97,34,131,220,91,195,141,179,84,224,43,40,229,79,147,79,237,121,218,156,237,51,171,43,31,199,52,238,251,142,0,175,174,132,132,162,197,105,160,195,174,52,130,10,225,51,55,208,96,229,224,146,91,213,26,236,106,59,254,202,140,95,85,194,149,203,186,103,31,167,50,202,173,223,1,202,156,111,97,123,113,164,98,153,54,167,66,87,171,242,80,136,115,167,162,86,33,65,88,31,2,78,148,73,236,111,131,6,211,8,107,31,147,212,245,19,119,92,209,150,81,100,143,46,246,136,65,77,127,211,248,216,164,62,215,208,116,198,223,96,175,223,172,161,76,59,10,243,190,12,203,145,60,54,69,140,73,237,17,81,35,94,137,38,235,88,78,26,87,94,215,141,137,219,190,93,26,81,110,145,222,33,144,39,106,207,182,244,241,187,33,230,196,97,66,177,21,224,153,56,26,102,85,146,63,134,105,77,158,44,230,45,246,251,19,240,20,49,105,17,4,33,140,43,69,50,58,10,159,99,174,29,53,78,96,189,113,191,159,77,134,120,211,149,140,208,202,22,155,240,7,251,114,52,17,230,6,98,16,21,69,2,40,196,42,12,74,240,13,11,95,80,39,170,18,174,158,141,205,116,56,201,95,252,36,174,178,47,54,253,110,55,132,65,24,103,142,214,235,244,46,216,240,19,220,225,6,118,56,238,118,201,136,154,16,153,147,96,203,25,223,96,50,165,129,253,57,200,219,113,246,236,57,108,159,18,49,69,14,34,216,246,220,248,11,128,233,142,127,83,148,35,244,62,90,87,228,125,90,35,128,111,10,99,54,198,121,247,102,3,42,85,55,12,102,64,191,204,152,230,26,224,129,38,128,211,188,210,88,101,174,135,176,19,230,90,215,185,215,171,119,60,53,112,70,115,1,27,203,240,39,17,104,65,108,26,189,49,213,132,18,45,97,190,92,228,85,114,223,63,127,45,190,251,85,193,79,233,10,79,15,174,40,197,145,141,18,179,105,144,175,60,103,116,75,105,167,200,193,120,180,141,223,83,35,64,240,156,133,207,77,143,238,96,48,192,171,154,28,228,147,155,227,7,232,118,232,123,64,75,199,55,189,224,135,28,12,59,88,97,250,82,188,192,47,126,242,178,236,0,251,226,209,227,7,78,110,169,41,116,204,209,177,153,138,191,80,128,166,106,128,201,93,3,35,76,236,40,12,145,30,171,42,39,26,40,54,69,133,102,64,216,0,75,110,130,148,49,79,226,49,12,136,143,213,56,157,184,49,49,140,129,195,130,154,49,152,170,52,112,212,61,166,44,209,81,128,19,0,166,19,112,165,197,247,44,204,251,66,19,69,67,151,103,207,236,246,187,47,109,103,119,64,208,79,232,126,142,62,124,54,210,152,255,59,194,35,51,163,255,220,253,51,246,46,203,238,159,205,176,12,42,253,20,184,30,76,3,88,194,239,10,132,159,248,5,136,172,220,78,222,61,160,106,148,252,199,47,96,30,26,107,224,239,31,77,152,153,196,157,99,34,240,150,15,39,77,184,123,49,248,124,14,216,156,98,3,156,88,247,73,215,2,245,171,246,37,229,75,121,3,186,231,6,15,126,141,110,199,163,2,32,253,129,219,85,28,15,17,10,119,38,27,159,241,42,78,143,70,140,11,227,31,141,116,136,124,73,242,234,76,137,83,27,183,90,26,181,247,89,209,87,162,62,67,93,253,159,63,87,61,111,134,108,0,147,7,193,40,252,117,20,140,255,249,167,201,119,192,5,193,159,6,223,177,209,211,3,96,46,53,88,145,166,164,204,124,88,23,236,216,172,215,203,48,101,216,173,184,17,248,74,81,106,29,116,123,93,102,9,113,211,32,68,67,111,27,164,53,219,83,96,30,243,120,46,227,108,46,63,95,188,245,142,121,16,35,198,38,162,173,197,230,20,31,177,193,111,89,162,104,14,182,83,226,22,118,228,25,60,119,233,202,80,171,233,70,217,19,124,36,222,71,122,9,91,250,22,56,54,225,78,194,227,221,251,225,176,56,142,134,133,201,108,208,227,2,115,164,67,147,35,93,76,6,241,50,202,95,233,224,208,6,143,22,166,214,203,149,224,159,97,57,238,127,55,154,244,159,50,35,80,248,90,208,44,22,135,7,182,245,0,68,220,103,197,80,244,2,116,124,41,254,123,237,67,251,221,62,12,155,55,106,190,131,154,45,208,116,65,221,201,221,193,75,98,252,94,166,214,107,212,101,199,135,101,185,4,224,166,24,44,242,41,20,9,126,61,213,130,203,45,227,160,111,231,236,158,58,40,139,217,130,1,176,235,224,97,127,135,241,131,174,77,96,219,249,148,114,220,34,105,230,98,210,88,220,80,94,208,193,120,184,116,223,254,98,102,114,199,72,185,164,150,232,191,31,109,205,35,117,13,202,23,31,160,88,205,251,75,251,254,12,43,104,227,207,180,121,214,242,247,247,39,162,118,240,244,205,20,173,193,123,235,85,91,0,71,135,33,145,147,169,92,3,189,24,148,252,168,28,10,186,12,57,152,219,46,181,92,233,230,172,53,194,248,245,160,95,194,127,71,23,142,3,0,151,181,100,233,218,104,34,58,85,17,220,232,168,223,253,174,63,234,86,55,64,174,77,249,15,73,24,80,213,15,225,11,146,26,159,80,70,240,11,133,134,246,59,250,125,175,140,239,247,21,90,54,121,26,190,5,3,116,199,191,40,241,52,248,10,246,116,117,231,91,185,216,133,10,190,40,114,175,21,28,224,87,175,228,49,38,0,12,63,204,91,99,33,239,148,191,30,104,109,180,151,89,239,148,223,139,198,219,44,23,142,50,29,199,138,127,172,199,161,223,122,168,220,231,196,221,126,0,96,189,7,149,248,94,81,110,17,246,27,213,202,161,109,195,171,66,19,88,122,87,235,245,176,54,0,193,191,1,136,22,137,146,243,234,210,221,79,237,231,253,4,116,128,84,161,200,1,132,211,236,227,183,22,96,201,99,28,164,91,63,209,143,77,90,244,119,67,154,236,116,202,215,176,95,134,116,106,23,52,106,0,231,67,61,60,9,113,252,242,25,106,155,113,242,42,218,113,225,117,190,198,196,20,56,177,11,252,132,96,0,206,196,69,134,89,253,138,85,161,108,91,56,218,209,7,201,123,119,80,77,16,187,120,146,32,125,12,42,97,198,17,253,162,53,221,134,43,48,226,116,150,223,245,122,182,48,214,253,46,69,224,187,147,182,186,160,246,177,41,114,20,215,163,174,221,48,208,191,93,250,169,106,252,209,132,167,123,59,199,228,94,144,218,242,184,66,129,4,233,125,129,234,111,144,227,222,63,101,180,79,68,248,97,219,55,120,191,249,224,57,162,254,170,150,194,86,5,210,235,181,129,249,214,131,145,219,212,108,208,160,207,165,54,95,231,208,229,172,21,251,192,254,7,244,97,119,71,98,102,179,171,157,142,10,153,46,158,30,36,213,23,94,31,233,202,188,2,238,166,41,81,0,131,235,183,171,149,156,39,128,64,204,190,142,174,136,38,17,242,199,218,2,202,65,132,198,150,254,251,221,214,57,125,137,241,163,17,132,80,5,84,226,97,121,237,16,213,65,233,163,243,244,23,121,135,78,220,74,234,200,22,163,84,219,18,197,189,108,25,144,163,51,197,42,116,26,60,13,231,25,125,28,21,145,126,173,242,3,17,113,109,8,55,151,0,131,101,84,212,154,48,177,238,153,130,29,108,101,151,161,247,216,108,118,45,22,191,120,48,191,33,138,29,190,9,191,59,155,219,139,225,192,218,135,139,59,146,164,191,40,212,103,30,9,111,108,84,195,147,122,128,130,213,189,178,218,253,171,17,179,196,182,101,73,210,118,7,166,218,27,85,93,73,154,207,45,248,125,235,189,68,248,80,81,117,14,233,198,6,103,79,48,121,21,167,118,151,194,70,89,209,90,106,144,169,147,37,102,6,54,27,93,237,142,59,177,240,32,35,67,139,179,160,54,194,165,19,120,182,169,190,12,165,36,12,186,134,219,113,203,102,141,217,12,30,252,5,28,161,98,231,82,33,76,218,81,37,155,26,89,32,107,56,69,124,214,110,145,3,252,116,149,63,252,78,34,172,41,24,51,22,120,188,214,209,125,19,81,239,103,163,199,208,123,248,11,122,134,120,190,135,32,224,202,242,193,71,104,221,53,32,129,68,21,175,235,57,16,65,120,156,20,201,122,56,38,6,237,118,221,229,175,209,194,191,112,170,16,221,97,18,162,6,187,27,129,122,138,134,212,3,29,254,6,195,235,48,64,197,80,121,49,134,58,79,238,171,30,89,87,61,140,194,129,14,21,71,123,56,179,185,37,117,108,180,69,75,8,66,123,39,143,238,202,133,215,217,23,53,157,77,91,2,181,205,91,110,239,254,133,115,121,188,35,64,125,181,151,87,132,28,102,227,145,31,64,249,210,159,121,184,84,149,85,111,52,64,67,1,216,155,53,84,3,224,222,156,99,24,105,90,179,232,220,139,185,161,181,210,96,12,158,208,100,7,244,76,105,6,123,48,216,128,35,125,45,238,56,137,227,223,233,0,210,6,207,200,144,52,134,132,12,103,156,5,85,54,14,195,175,20,241,219,100,114,9,63,6,24,120,225,32,11,224,31,49,70,198,73,35,200,34,148,224,31,29,77,40,51,227,30,255,172,141,187,222,148,139,176,138,141,115,252,203,33,1,221,114,162,73,192,238,97,158,175,202,195,32,236,156,40,203,147,108,83,132,174,39,119,87,127,83,142,40,8,167,163,58,70,76,114,156,7,4,179,99,12,225,229,38,237,42,25,68,49,202,82,112,246,199,211,73,56,158,120,236,167,226,93,21,114,64,243,227,29,186,223,120,233,222,22,81,196,132,192,32,241,254,240,18,76,76,159,162,196,239,205,247,110,201,142,178,67,141,184,248,93,181,217,236,75,212,27,136,196,123,56,12,100,185,240,181,218,113,188,22,228,63,63,50,160,150,105,133,98,107,40,191,173,129,144,238,239,158,68,197,19,47,124,249,10,95,127,202,163,43,74,50,252,93,225,235,187,68,93,195,180,88,36,145,197,223,84,229,156,127,196,114,156,194,112,151,154,248,148,106,40,121,220,38,168,241,101,85,229,122,109,171,170,11,185,224,231,52,167,252,38,99,254,150,138,149,137,250,25,14,111,201,207,168,22,179,164,249,91,42,221,205,115,188,88,159,226,75,82,124,137,210,100,238,230,214,88,103,50,136,11,254,19,190,24,162,6,171,154,94,104,23,103,88,212,25,37,210,81,190,52,143,168,117,83,200,147,40,77,103,81,124,205,11,95,99,55,178,112,21,213,133,34,207,93,221,233,98,33,99,205,215,254,29,147,181,94,131,208,153,71,249,29,95,186,234,183,115,158,250,242,106,45,115,210,210,103,145,154,167,192,83,174,229,93,116,7,96,218,41,99,87,251,94,174,50,62,117,111,23,114,190,137,97,91,155,170,98,193,127,242,47,230,128,164,123,39,101,180,27,254,15,228,255,0,84,79,76,0,0,0};\n\nstatic const unsigned char v1[] = {31,139,8,0,0,0,0,0,0,3,237,93,235,115,219,70,146,255,238,191,98,162,242,45,169,181,0,225,77,64,182,148,114,156,77,57,85,246,94,42,78,244,37,151,59,67,36,40,34,198,131,7,64,148,100,133,255,251,245,175,103,0,12,64,74,206,195,187,117,167,219,84,12,14,230,61,253,238,158,38,53,185,170,19,81,55,85,58,111,38,207,159,164,249,186,172,26,113,39,86,71,162,74,138,69,82,29,9,234,240,174,137,155,132,75,127,91,46,147,121,195,197,239,147,229,145,88,53,121,118,36,190,47,175,154,164,18,91,177,172,202,92,136,137,121,124,113,85,44,178,196,252,165,166,73,159,28,31,139,215,73,182,166,30,203,171,98,222,164,101,33,154,85,220,208,10,205,85,85,212,34,22,107,26,151,210,70,84,117,93,102,155,132,234,151,152,117,145,100,241,237,147,121,89,212,141,248,26,101,113,42,166,121,125,36,54,113,118,40,78,207,68,145,92,139,239,228,4,83,53,22,213,117,210,252,144,230,9,109,173,173,61,18,237,176,67,218,85,114,195,103,149,19,127,139,15,154,248,238,137,16,171,36,174,154,19,236,105,93,99,34,156,241,253,139,122,115,41,230,89,92,215,167,79,239,184,201,228,183,173,184,201,179,162,62,61,88,53,205,250,228,248,248,250,250,218,188,118,205,178,186,60,118,44,203,58,166,97,7,98,153,102,217,233,65,81,22,201,129,216,164,201,245,87,229,205,233,129,37,44,225,120,244,255,193,217,139,117,220,172,128,133,242,67,98,100,105,145,204,227,245,233,65,85,18,16,15,244,234,95,202,180,24,215,95,167,139,102,117,122,224,28,136,197,233,193,91,207,116,237,80,4,120,198,158,233,11,252,163,133,44,11,117,129,247,198,118,132,99,161,148,205,204,32,116,12,126,14,122,26,220,209,232,186,83,15,55,200,12,27,83,202,231,158,238,194,250,72,167,56,198,49,232,131,206,124,246,254,136,32,185,40,175,139,151,85,85,226,192,255,76,128,142,96,99,155,126,91,117,122,48,191,170,136,178,155,87,101,86,86,7,103,226,15,129,30,144,142,68,104,58,254,235,153,233,199,14,21,4,63,24,34,221,235,38,26,53,117,111,171,125,45,60,112,99,140,155,140,174,237,181,237,211,178,182,147,185,194,205,169,41,115,13,55,55,232,229,28,173,7,226,152,142,211,3,255,106,253,47,208,127,78,208,231,150,225,102,6,64,14,208,3,236,57,189,156,219,59,128,159,151,151,143,14,226,166,31,121,194,53,35,111,110,90,145,97,250,158,99,250,129,65,239,194,54,109,27,133,21,213,68,238,220,244,1,58,219,36,176,186,81,200,173,212,152,153,142,237,210,139,19,218,52,65,224,154,238,12,146,202,37,233,19,152,129,231,155,225,204,180,168,202,242,76,219,163,98,232,154,142,99,218,206,204,116,29,170,138,2,115,6,44,204,48,241,204,167,6,47,163,201,236,153,97,122,126,16,211,34,132,48,249,36,184,208,138,238,204,244,34,116,137,2,96,211,155,237,244,49,76,39,160,87,207,181,33,219,44,203,53,67,103,54,167,218,136,150,246,104,94,55,52,3,219,69,129,14,16,57,49,109,193,143,132,124,98,2,75,208,134,124,26,97,89,180,203,89,104,218,52,130,246,230,17,148,176,180,101,209,169,156,112,110,122,116,2,215,55,125,215,51,35,223,107,151,197,170,14,1,232,158,221,209,17,130,136,206,192,187,107,15,74,139,185,190,111,208,74,180,175,25,21,172,153,131,205,207,2,64,132,118,72,0,226,135,58,32,32,24,98,16,29,193,14,105,140,31,210,210,17,13,12,60,207,12,131,40,51,58,188,224,32,132,101,15,189,2,194,24,182,192,168,179,87,6,48,235,81,7,160,22,235,57,6,112,107,180,152,151,179,24,18,187,52,77,128,246,25,193,208,181,169,68,24,230,245,12,194,49,182,232,8,126,180,91,52,128,101,236,209,193,193,34,234,75,103,2,170,229,193,12,198,181,132,193,94,92,75,72,25,64,55,67,116,102,236,135,40,193,221,144,232,6,106,176,27,90,150,250,99,49,143,234,9,194,132,110,19,231,151,216,142,92,236,20,79,198,182,193,216,6,178,113,184,16,72,8,37,18,228,16,73,69,60,111,184,151,216,120,245,236,161,45,130,108,13,198,57,142,27,48,198,9,225,1,240,77,43,1,30,142,232,161,194,216,39,142,1,203,80,141,69,44,36,193,25,18,194,81,32,38,242,73,197,3,227,10,1,132,113,154,217,147,168,250,40,229,214,31,21,9,54,109,221,137,73,10,130,221,109,35,160,15,249,98,217,1,204,129,145,80,36,107,172,73,139,203,250,245,99,19,141,182,69,150,80,176,138,8,67,170,76,136,5,90,125,9,24,2,73,78,255,244,74,11,149,111,129,83,17,64,139,81,187,237,240,12,185,129,231,160,183,181,111,10,139,167,32,221,207,189,121,142,200,8,86,46,79,225,254,174,41,228,130,188,250,125,56,59,127,108,56,35,17,76,188,113,206,224,178,4,142,62,128,150,5,243,202,112,7,192,226,58,129,17,231,196,154,126,78,162,205,253,83,19,24,129,17,181,19,184,191,125,130,136,39,176,204,93,100,205,227,226,177,225,137,232,154,97,243,58,120,57,52,204,36,239,108,104,209,183,0,166,236,100,135,195,94,54,121,58,142,234,6,200,157,239,116,32,87,137,251,172,12,116,49,72,177,143,87,178,121,37,59,220,24,188,214,111,150,121,66,250,63,73,253,161,41,215,143,13,45,228,131,204,96,47,67,227,205,226,22,2,80,240,145,128,205,225,188,1,226,28,123,5,3,35,112,108,126,188,108,251,1,136,176,223,103,231,60,75,78,154,209,33,43,122,104,122,219,189,41,255,218,167,199,24,43,194,246,207,81,159,19,10,173,17,113,216,176,195,132,187,103,156,229,138,110,208,57,97,242,119,46,233,240,146,99,198,139,179,228,159,27,46,248,167,104,53,178,15,97,110,195,22,39,56,145,117,236,17,175,200,15,0,146,236,92,223,227,112,192,203,208,140,130,153,144,79,197,84,16,82,27,178,142,206,163,151,129,8,120,64,32,162,13,164,220,184,55,1,157,204,68,178,180,44,199,153,219,230,140,76,157,0,158,134,15,51,217,10,125,129,149,32,4,93,59,247,205,153,237,145,18,35,219,135,140,49,161,62,120,22,213,212,117,233,120,84,85,144,182,37,147,73,16,93,242,126,35,33,159,24,235,195,10,36,217,10,235,15,108,28,143,59,16,73,7,33,2,30,99,204,95,36,89,246,47,196,255,63,68,124,149,44,171,164,94,61,58,220,3,25,46,33,209,245,194,149,7,63,104,3,247,214,126,235,152,17,33,196,142,224,70,108,12,110,65,16,68,246,201,185,194,69,56,138,124,14,91,224,233,198,144,240,28,166,145,34,153,8,200,114,97,153,190,37,191,197,181,105,141,48,240,135,157,236,190,147,54,19,45,196,243,219,27,60,119,52,236,69,92,213,222,99,195,3,219,28,80,53,43,105,41,178,137,67,100,248,27,94,119,68,20,193,199,125,148,240,65,36,134,143,44,95,201,129,210,192,209,1,111,12,143,172,188,44,175,30,159,182,118,24,4,126,214,71,39,169,64,162,112,101,144,224,123,235,216,48,91,35,17,73,201,8,235,71,200,55,22,218,123,156,245,120,147,60,58,24,181,126,2,187,95,184,217,176,161,70,160,25,4,106,164,47,6,23,224,126,63,194,185,199,127,184,207,107,56,31,215,7,188,131,21,188,13,90,105,101,68,99,200,39,121,156,62,58,155,194,177,91,134,221,192,115,189,215,236,38,55,108,111,35,63,206,49,62,39,29,228,239,26,252,145,146,128,59,227,181,27,1,53,116,99,58,158,59,94,4,65,53,178,52,34,59,200,192,48,52,87,176,111,39,46,25,9,111,92,211,117,96,35,216,251,38,49,120,18,222,234,14,102,111,214,113,177,120,108,168,101,66,199,131,212,179,207,170,218,95,161,100,240,253,224,27,146,50,178,11,179,9,76,7,120,226,59,157,108,146,81,204,99,204,29,220,139,155,250,73,223,144,215,24,229,16,235,36,193,152,84,250,78,253,172,232,181,123,31,83,175,170,180,248,240,216,32,79,160,61,167,35,227,243,181,250,124,211,97,3,46,58,163,132,11,175,219,66,102,48,4,241,64,44,35,2,22,184,112,222,22,50,180,25,109,7,219,111,123,216,26,130,179,110,146,49,164,203,223,1,229,207,5,66,17,87,105,108,172,210,197,34,33,0,53,213,85,242,39,67,27,208,165,111,152,200,4,31,156,157,154,223,175,67,151,143,80,144,115,172,24,143,76,165,0,40,130,48,212,235,239,135,210,213,58,43,227,199,39,21,217,162,216,56,187,1,40,102,29,199,94,33,254,60,106,2,236,194,62,60,140,30,70,4,59,69,154,116,45,136,81,177,65,227,110,180,177,188,46,254,5,205,125,208,148,198,159,237,176,213,23,176,182,176,56,70,105,59,185,130,235,185,187,235,91,150,217,163,243,20,164,97,74,224,202,96,137,25,44,230,24,42,244,182,130,39,254,134,121,92,90,108,168,167,174,175,49,104,135,115,87,101,254,232,124,4,166,30,219,201,66,220,212,27,120,250,115,211,227,108,128,8,23,181,190,211,22,253,200,38,18,106,193,244,22,68,20,41,251,214,118,252,185,37,16,242,54,125,203,19,250,45,47,63,95,203,32,153,103,134,51,234,104,180,29,13,173,139,44,175,176,157,57,218,57,163,130,106,198,19,158,19,237,123,188,160,222,203,232,187,201,137,206,89,131,133,138,89,194,161,226,150,180,158,61,66,11,137,104,215,70,56,47,8,7,41,107,160,121,15,121,109,142,231,117,154,107,208,65,79,129,203,128,98,216,245,244,68,164,208,69,246,132,227,232,213,247,166,207,237,157,221,210,150,223,65,67,189,74,147,236,209,9,240,251,140,170,220,112,201,221,178,220,224,37,50,77,252,72,168,15,233,65,251,81,40,2,174,138,212,83,222,224,208,72,47,34,14,35,110,64,248,214,12,233,32,196,118,14,236,12,234,23,56,184,228,177,103,72,184,112,201,85,139,8,23,24,101,112,155,195,25,44,46,50,50,224,209,249,51,42,209,66,124,103,110,175,12,176,248,220,0,221,144,171,71,3,225,213,57,94,104,128,103,168,218,9,253,221,75,62,132,216,160,122,31,27,214,92,25,84,68,144,132,202,145,204,112,112,89,35,200,92,5,106,6,129,111,108,71,197,156,144,14,195,222,7,95,236,145,172,121,3,45,60,219,39,111,98,164,38,62,70,168,145,206,100,152,176,141,145,33,16,96,4,12,18,7,241,115,50,149,187,170,253,48,185,122,116,183,197,234,228,27,67,193,132,15,47,90,160,192,125,232,42,198,54,198,117,92,61,70,2,137,54,174,202,245,113,73,50,33,25,18,169,125,97,128,155,47,31,153,110,92,7,21,30,121,161,44,131,15,103,54,223,147,97,183,102,200,9,119,97,219,201,224,78,111,108,100,104,70,60,34,148,51,34,109,129,26,45,215,81,165,144,164,42,25,46,102,16,205,96,10,219,78,240,145,49,228,35,242,130,251,252,13,61,194,215,182,188,250,9,119,204,190,180,88,150,143,14,37,118,23,87,202,76,203,35,149,96,57,49,114,57,103,173,193,128,148,213,208,119,50,195,156,89,200,217,12,221,64,235,96,181,29,220,110,184,253,105,87,152,240,207,210,18,80,15,91,168,159,67,211,236,0,61,185,33,120,230,49,190,57,241,67,149,198,197,101,246,232,76,239,255,227,108,209,172,174,242,139,31,31,157,236,14,204,192,117,217,57,156,155,161,21,176,135,225,35,251,216,243,144,88,109,185,28,246,14,227,8,116,47,228,83,222,156,135,1,236,43,111,110,206,28,234,238,134,192,8,108,231,136,239,247,3,31,120,154,217,176,140,189,8,119,236,120,130,149,76,215,1,78,130,153,115,238,234,60,200,169,182,179,113,82,78,123,247,57,183,90,247,204,145,9,223,72,144,118,64,68,142,29,162,146,250,249,161,105,115,152,223,9,201,26,101,23,138,74,43,228,7,4,115,100,53,203,227,69,158,79,84,224,225,116,62,54,77,155,164,99,249,166,231,80,77,16,18,151,227,131,7,251,49,27,172,210,108,109,47,9,2,162,180,153,233,59,72,133,118,195,208,244,144,130,27,133,51,90,50,194,193,44,31,165,215,72,58,0,49,122,33,81,46,117,32,159,193,180,102,72,170,246,0,48,7,95,53,48,109,206,213,181,60,248,15,150,45,228,147,189,140,174,219,107,223,140,44,239,173,188,203,138,216,101,124,203,85,50,252,49,151,185,244,22,44,98,90,17,17,147,25,237,193,33,11,119,102,202,37,65,251,100,4,59,204,4,100,2,71,22,51,73,24,177,169,60,67,14,188,207,95,253,137,56,219,220,13,194,24,156,209,166,112,211,73,105,167,190,53,155,163,187,239,211,106,145,228,173,128,196,164,77,22,162,27,133,175,136,247,194,25,155,233,22,236,74,59,152,177,7,32,164,35,176,162,67,250,46,185,218,51,204,74,246,61,217,246,62,161,140,192,130,164,12,63,20,242,169,142,238,90,176,27,130,64,161,61,162,179,147,161,239,144,185,239,18,101,121,204,232,187,66,244,34,158,127,32,131,226,209,121,87,80,52,4,106,219,70,212,33,4,29,69,224,89,32,27,244,70,232,143,102,51,220,107,217,86,72,216,176,2,103,39,243,28,64,141,72,123,105,125,94,142,251,208,50,236,74,111,136,141,28,247,99,171,52,63,207,202,111,200,64,36,146,32,38,177,247,164,197,171,153,212,202,59,95,183,89,165,143,78,238,114,172,198,229,252,86,132,13,248,235,78,46,167,45,114,170,42,87,218,142,94,149,147,121,45,211,96,245,126,60,15,172,239,115,178,72,100,228,152,163,159,54,42,114,118,216,236,112,80,103,64,72,17,67,238,220,211,90,195,155,216,251,191,41,21,236,136,105,11,219,189,231,250,183,255,98,214,199,156,183,227,172,162,77,180,50,162,141,17,237,162,58,206,147,42,126,108,200,14,240,93,20,130,143,205,112,115,109,193,15,153,161,102,135,1,66,69,46,43,19,104,36,40,65,98,40,27,162,216,118,61,12,122,229,152,81,196,74,39,148,96,13,33,142,101,145,80,63,243,206,237,240,222,111,195,217,187,129,115,149,187,192,67,89,168,91,193,140,191,234,130,32,12,20,82,104,57,6,114,227,162,216,155,33,143,75,168,15,37,158,105,91,6,246,37,134,135,129,72,96,117,230,147,23,76,71,102,101,98,7,49,116,17,164,55,158,106,134,153,11,11,205,114,35,225,145,18,35,107,78,125,112,179,207,210,222,18,251,199,9,30,199,11,216,156,60,24,252,217,239,185,200,171,3,144,124,31,197,35,131,30,150,188,30,52,164,119,18,138,156,122,204,193,244,206,170,95,177,197,200,57,251,59,4,205,46,127,253,216,8,90,102,127,191,113,199,119,45,234,38,135,175,107,114,139,111,184,16,33,154,169,78,10,210,111,101,21,190,212,50,6,215,162,156,63,54,88,113,86,10,91,111,27,24,143,142,31,179,245,34,109,24,73,215,92,148,79,150,234,59,170,25,128,36,144,217,152,131,218,31,156,225,53,84,66,46,185,157,108,71,90,112,110,200,203,3,163,187,98,208,175,34,54,28,191,123,240,66,99,197,220,241,137,43,8,54,23,148,59,76,59,138,148,116,239,144,187,29,127,35,191,73,215,12,220,246,91,249,151,85,146,20,39,98,114,113,105,112,209,176,45,75,52,201,77,163,94,35,122,173,210,162,109,117,45,107,2,146,185,77,178,172,188,150,227,100,185,31,168,222,187,145,234,189,29,90,37,11,57,142,10,253,32,188,116,35,240,34,187,107,251,239,126,228,224,171,171,166,41,139,233,93,147,54,89,114,36,202,98,158,165,243,15,71,98,145,214,241,69,150,44,142,136,112,235,35,145,210,129,241,115,11,75,122,231,19,31,137,85,185,73,42,126,233,123,243,235,246,144,129,33,65,244,83,189,78,105,100,157,52,239,168,240,51,1,170,253,173,134,233,50,206,234,228,240,121,215,117,126,65,173,237,198,166,201,70,78,211,182,86,9,160,172,246,39,190,108,75,211,67,113,34,138,171,44,123,206,125,211,165,192,47,41,136,191,252,69,52,183,235,164,148,175,230,60,110,230,171,67,113,122,122,42,38,237,10,147,118,126,209,238,110,138,204,140,195,231,170,178,27,55,157,242,79,56,200,237,154,205,42,41,84,77,59,76,182,168,129,91,122,110,81,196,86,190,144,192,58,84,64,163,3,0,87,23,217,85,98,4,132,31,6,225,73,91,227,83,77,11,200,174,210,35,204,61,103,68,227,119,40,164,60,121,242,226,130,177,198,71,60,61,144,47,7,74,194,28,164,5,152,216,88,102,201,141,248,229,170,110,210,229,173,49,39,49,144,84,34,109,146,188,110,95,46,227,181,225,8,102,243,100,33,214,55,184,106,16,235,91,112,167,164,162,58,23,203,178,160,207,36,79,47,202,108,33,107,175,87,52,139,168,87,241,130,200,144,186,60,189,147,103,219,162,148,213,219,3,153,123,78,146,142,158,219,22,77,244,58,191,216,118,199,163,215,182,40,126,253,85,128,70,182,226,140,70,62,149,132,8,32,190,120,122,135,122,66,53,255,240,133,169,18,218,9,221,32,198,109,123,220,107,195,19,93,207,73,92,164,57,209,150,129,247,9,117,157,76,182,96,225,39,47,142,143,207,222,239,101,128,191,151,4,161,116,206,129,171,233,93,73,164,143,99,130,236,203,58,25,144,50,215,92,52,133,164,225,239,147,229,20,116,167,17,48,255,178,8,161,184,169,226,162,206,176,141,91,130,112,185,142,231,105,115,107,88,162,206,79,244,166,81,5,33,96,210,207,213,148,227,153,172,110,38,240,249,104,168,165,13,253,169,169,152,225,126,168,134,236,70,187,227,205,118,63,145,50,237,152,173,101,5,30,53,109,202,195,231,162,123,87,191,79,146,108,64,242,29,12,136,193,218,178,169,244,140,41,89,243,222,150,233,225,17,25,240,150,197,155,216,30,137,159,126,214,96,7,58,161,65,180,97,185,208,157,218,139,220,181,190,17,238,119,36,92,76,36,57,109,200,27,139,116,35,243,173,178,116,67,220,65,68,146,84,13,21,59,6,249,72,0,20,107,82,114,196,5,70,178,161,253,213,6,244,171,136,47,234,50,187,34,234,78,11,90,143,0,206,60,36,153,38,41,152,71,60,112,72,0,232,203,234,186,137,137,152,232,117,109,4,7,32,96,94,94,45,196,195,175,141,37,81,9,79,101,16,167,12,121,176,38,140,2,183,94,63,35,45,196,19,13,167,26,109,55,190,34,250,80,51,231,241,141,193,156,8,97,178,132,114,144,137,102,45,107,27,217,165,32,105,50,224,91,170,98,221,96,203,143,139,44,38,196,113,177,165,49,146,1,32,175,101,89,229,34,137,235,196,32,208,139,197,85,197,124,2,125,34,219,83,230,33,226,218,106,171,118,61,218,183,225,117,245,123,128,163,1,81,235,182,219,209,144,249,145,134,53,232,197,50,162,252,208,73,8,42,158,168,34,50,219,58,17,177,34,140,93,211,63,213,121,162,105,100,136,87,136,137,78,109,162,66,138,12,109,149,227,227,251,54,151,227,71,54,174,21,169,16,56,215,68,54,100,130,141,118,185,110,187,15,228,106,158,44,210,171,188,181,15,226,91,168,236,131,51,130,37,85,108,95,28,175,239,155,68,161,55,111,104,189,118,194,126,18,31,147,188,44,110,65,208,215,41,25,124,49,39,78,144,95,90,136,162,188,102,27,82,52,171,180,134,101,153,152,163,117,30,62,170,39,57,226,65,140,236,85,77,82,33,180,98,65,215,10,138,239,183,251,180,87,75,192,249,162,39,224,254,160,94,167,64,7,135,39,216,206,175,234,19,34,87,158,136,13,231,225,22,105,147,196,119,69,187,98,93,25,101,145,221,30,156,189,194,70,200,216,163,182,221,1,157,5,79,212,228,19,198,253,177,53,142,255,91,107,253,147,201,159,163,233,133,178,205,165,167,237,132,72,92,213,111,119,164,131,11,183,49,120,19,242,15,154,200,171,108,164,22,204,180,142,182,213,247,179,225,1,82,33,187,183,159,33,251,201,33,22,247,51,134,253,212,194,70,59,33,175,221,109,240,227,136,77,246,208,207,46,65,233,175,218,75,87,84,5,254,96,165,253,124,175,214,126,83,94,146,225,117,151,225,227,27,178,47,241,157,153,111,217,70,85,134,44,153,230,63,128,143,6,182,40,105,62,169,26,127,164,194,64,57,78,38,154,46,250,105,77,136,230,126,223,81,225,254,126,244,184,186,200,211,230,33,179,149,36,245,106,181,168,160,204,191,138,235,116,46,38,226,153,184,104,202,120,138,205,80,121,114,130,26,172,168,12,72,57,110,149,196,139,68,58,22,47,105,138,178,74,63,178,232,61,105,103,220,202,222,74,247,45,19,24,170,147,120,157,30,51,76,38,71,226,78,77,177,85,54,171,130,213,161,185,76,139,56,203,110,167,149,178,97,113,72,28,76,234,229,253,10,181,163,253,78,153,13,21,217,200,208,36,118,149,150,137,99,89,59,106,241,162,172,104,95,157,229,217,177,54,121,57,129,88,27,254,30,245,151,67,33,173,97,77,125,114,105,152,181,55,154,214,33,21,209,18,135,166,16,108,167,245,120,231,183,113,193,198,184,122,183,53,170,126,177,178,59,45,4,137,221,91,193,55,25,75,106,208,26,12,216,9,211,227,100,59,38,227,157,83,184,253,190,178,248,34,201,58,152,100,37,105,224,86,154,231,23,36,218,23,113,245,225,164,55,185,15,206,64,180,69,156,147,136,226,161,221,68,105,177,38,221,44,5,46,250,31,128,68,202,121,153,175,179,164,233,195,0,6,8,14,162,248,191,175,82,210,116,29,23,234,7,44,72,221,199,89,143,146,14,71,18,101,242,67,138,90,152,0,202,2,233,166,106,149,224,45,148,32,187,20,67,237,38,214,100,104,36,43,130,226,64,106,147,36,239,167,216,145,222,108,234,42,192,80,49,35,170,134,161,18,244,190,18,29,176,46,43,234,220,24,49,188,99,237,112,186,63,197,107,217,186,147,53,212,154,221,160,178,96,144,146,118,146,182,168,18,24,196,219,38,89,42,151,73,99,110,98,242,205,14,183,130,63,169,31,64,187,21,226,31,136,124,48,233,53,129,255,33,228,175,85,159,251,8,160,111,255,7,16,193,31,199,253,103,194,249,103,195,53,203,195,29,92,119,35,90,156,175,57,130,71,246,203,42,46,46,19,54,101,164,58,216,62,76,7,141,49,211,133,147,12,192,108,165,222,58,61,120,151,94,22,226,91,50,153,224,228,210,164,210,156,149,95,9,29,218,77,237,98,228,116,15,93,141,161,64,60,248,212,110,90,111,159,229,181,215,134,144,110,106,41,224,164,22,253,141,90,153,13,158,100,49,189,147,225,34,229,72,203,240,64,171,136,57,14,242,235,175,50,18,34,23,237,226,86,242,53,218,27,242,208,77,54,221,72,220,137,105,216,50,140,209,154,225,79,121,51,240,74,101,44,86,190,107,225,3,95,172,12,142,226,190,231,168,195,158,117,36,127,234,54,187,102,153,50,165,35,108,210,194,109,224,89,177,39,217,199,72,52,243,254,97,72,194,218,232,130,114,18,142,10,23,92,104,77,29,21,126,28,1,249,94,245,221,91,239,240,68,59,6,87,140,221,199,116,218,227,221,100,82,16,117,152,2,31,203,26,77,8,132,123,116,124,231,139,178,167,186,207,19,109,157,105,71,236,209,247,251,49,75,144,238,57,103,199,167,34,203,186,152,199,3,23,65,186,3,29,218,14,206,186,248,146,232,252,158,251,216,194,222,99,106,236,108,98,229,14,118,65,240,234,118,49,10,157,85,228,97,131,32,154,244,114,213,19,4,219,14,253,126,195,22,188,125,149,195,254,104,111,51,43,250,25,155,205,35,194,221,221,122,199,203,188,164,244,70,6,19,19,99,40,246,221,50,4,79,123,238,111,101,145,34,188,173,162,54,89,243,74,69,255,254,176,41,143,37,206,33,83,167,119,44,90,217,240,94,22,122,8,90,83,29,71,172,235,142,68,188,88,148,197,247,0,166,42,191,73,150,40,54,8,126,229,8,57,231,241,13,77,213,36,107,42,94,101,35,79,224,226,146,151,249,234,114,104,221,183,212,57,25,5,202,100,188,247,142,99,186,88,95,32,144,92,92,229,23,73,53,57,20,243,85,50,255,64,123,159,62,227,133,159,241,202,207,164,222,120,174,69,186,176,25,41,250,236,137,220,20,191,217,90,8,92,205,164,123,20,253,97,54,90,152,238,171,203,241,110,101,196,153,122,67,214,109,196,11,64,225,80,235,218,222,16,40,214,197,43,136,75,31,27,223,200,177,103,88,239,183,142,221,246,219,71,244,19,135,52,115,142,155,31,255,167,249,236,63,204,169,249,236,240,88,243,154,22,233,101,218,192,177,201,197,151,34,255,201,254,217,204,146,226,178,65,96,215,26,196,3,89,175,246,1,65,222,38,25,52,180,63,212,13,212,115,127,134,93,236,180,65,254,123,176,212,197,251,49,237,179,233,58,174,234,228,155,172,36,241,75,224,62,102,44,145,3,85,126,147,222,144,98,147,123,215,34,253,66,18,235,116,211,131,98,255,46,120,155,188,130,44,253,245,254,153,31,22,223,74,201,15,152,123,100,161,233,193,249,139,203,173,82,131,29,151,244,186,240,62,157,170,155,129,157,64,99,29,215,18,128,24,40,239,193,102,198,246,225,200,20,244,135,22,70,183,43,86,137,239,25,168,186,81,75,50,6,176,108,229,228,100,239,29,66,111,136,243,167,66,12,17,34,213,224,99,11,94,160,114,142,107,6,194,59,138,241,205,86,58,46,3,11,78,22,183,194,52,77,218,27,9,19,57,151,130,17,131,115,8,29,165,124,90,12,252,22,99,120,246,123,141,225,207,101,244,234,171,194,128,237,223,148,248,86,232,96,177,250,25,168,36,251,44,84,210,199,181,235,121,85,102,25,238,170,111,97,42,19,54,229,181,247,137,240,173,127,123,222,81,19,111,191,35,167,135,140,172,36,35,225,190,87,247,148,107,244,168,123,37,52,80,31,77,249,109,129,168,207,13,4,211,13,24,157,197,6,85,78,73,108,126,57,120,59,17,55,15,72,53,41,61,120,190,29,151,99,143,48,168,121,199,251,73,182,51,104,153,2,91,130,28,120,116,82,60,244,84,105,107,16,15,246,211,94,75,224,15,208,224,193,94,150,148,244,164,224,72,10,97,61,221,244,9,17,178,186,231,218,159,172,159,183,66,30,142,103,65,5,192,42,217,249,12,21,246,207,18,165,135,159,192,233,117,74,170,103,15,78,7,8,108,175,145,135,104,248,66,169,236,174,219,197,37,245,248,66,86,227,226,64,187,187,229,91,131,150,231,28,75,191,127,107,170,225,40,253,158,206,151,183,13,59,55,119,191,225,122,119,24,51,167,210,118,40,150,116,214,148,55,30,182,61,12,213,11,133,59,117,153,212,153,229,76,48,138,33,157,182,192,123,36,66,38,118,213,174,122,12,101,183,118,55,65,116,116,121,63,68,204,136,43,162,61,36,36,171,216,29,82,41,9,36,138,136,147,233,108,53,99,75,133,200,89,65,51,250,21,240,152,134,164,248,217,141,161,247,135,39,33,189,247,58,111,224,189,169,168,189,118,171,53,60,253,240,130,76,109,115,184,117,237,194,235,190,227,227,15,12,200,251,131,23,199,18,111,247,203,30,254,221,218,41,167,3,73,210,132,109,35,53,223,105,111,20,183,22,133,76,27,234,236,10,9,56,178,43,218,1,26,221,223,55,132,217,75,31,210,139,191,135,204,142,62,101,73,186,43,151,85,186,16,120,128,22,106,34,24,153,72,144,147,224,159,72,140,13,130,91,187,174,200,238,157,21,52,98,14,218,211,125,236,118,221,62,200,218,123,45,131,182,46,58,241,144,3,137,49,171,41,31,253,72,166,103,29,126,210,9,255,46,190,76,11,149,24,64,50,191,137,179,111,49,227,145,156,248,187,164,162,14,36,94,84,120,77,190,112,252,232,50,193,157,132,98,149,145,230,160,89,208,1,6,240,219,184,89,153,243,36,205,166,253,228,100,114,234,179,107,194,136,44,22,212,124,175,244,135,211,183,100,73,93,255,64,90,224,221,109,78,206,38,181,29,188,56,232,91,47,171,132,36,77,53,236,112,166,117,96,194,127,135,155,104,180,8,173,5,59,1,218,137,122,170,132,228,85,186,73,196,189,177,23,210,39,174,22,8,225,91,78,112,207,71,98,18,89,52,54,105,157,146,114,104,197,195,254,90,38,131,125,245,229,114,169,174,229,247,54,119,146,249,249,110,156,73,107,235,14,7,96,2,228,248,83,45,119,164,178,129,189,180,126,57,231,83,110,217,225,155,178,241,39,85,86,252,164,13,24,190,82,98,184,75,2,146,8,159,98,138,46,78,216,73,39,5,67,164,199,116,179,127,41,222,247,105,51,125,148,247,61,116,195,72,70,15,153,100,55,180,164,210,201,148,21,213,37,20,41,35,106,178,149,145,206,214,55,71,212,242,82,217,199,47,142,227,179,247,84,58,100,152,12,184,255,211,225,152,54,198,120,145,52,215,73,82,12,194,58,76,5,206,222,116,128,58,63,225,185,212,39,29,165,203,123,104,51,34,242,147,241,220,50,73,2,225,34,94,66,190,22,229,117,21,175,149,205,176,123,203,187,39,60,212,7,24,119,194,66,131,27,203,122,85,94,19,80,71,1,149,225,245,143,156,103,38,239,235,167,154,0,16,134,176,15,201,185,211,121,88,60,19,246,86,233,5,106,223,157,183,221,198,211,59,150,8,100,215,14,166,252,235,72,222,244,194,226,176,155,182,92,18,110,123,70,222,14,78,244,155,79,210,207,220,77,92,37,53,249,169,245,224,10,87,203,24,0,114,7,112,47,226,14,217,105,93,98,242,129,196,48,90,100,174,245,235,125,101,0,176,222,56,61,232,197,238,56,183,32,30,188,62,196,139,18,144,241,205,24,55,71,132,158,195,237,104,26,181,223,189,34,142,233,121,87,125,117,238,218,239,229,72,132,254,180,45,125,113,42,108,216,136,67,174,87,153,107,59,2,116,71,20,238,100,18,60,189,27,42,131,17,33,16,203,63,25,214,60,189,107,229,224,150,101,32,193,210,222,118,114,240,116,184,91,228,79,218,219,241,173,255,176,207,217,80,81,61,19,14,157,111,215,145,212,4,227,167,64,168,209,169,11,58,37,223,92,81,231,123,9,167,209,110,94,86,52,210,68,226,216,244,78,134,150,78,68,199,88,189,2,62,26,110,244,175,180,81,98,212,195,237,145,152,254,23,105,2,38,168,142,140,156,129,154,39,74,210,199,30,210,192,244,144,125,156,53,131,233,140,65,73,160,176,225,69,115,249,133,174,250,181,203,136,29,232,179,128,126,8,1,178,3,60,161,241,193,245,158,131,245,12,142,237,233,72,177,15,255,217,88,209,182,115,198,52,127,47,4,250,158,15,194,65,239,118,220,45,250,231,4,198,72,242,62,131,192,232,215,249,223,38,57,52,144,126,86,17,178,99,49,238,145,34,250,43,201,124,61,169,71,83,9,218,139,44,222,99,105,255,200,63,177,246,77,154,37,42,31,93,115,139,218,220,29,238,34,179,119,184,56,136,220,203,76,92,33,142,143,213,92,237,159,235,235,39,168,169,227,149,76,235,121,199,197,157,196,30,108,147,38,120,37,161,172,126,247,77,200,113,125,76,224,129,4,224,214,179,26,182,62,225,89,223,33,131,52,22,25,34,60,156,122,39,230,171,171,226,131,184,184,149,133,110,146,154,58,2,18,95,199,77,172,223,3,92,85,217,17,15,252,123,156,39,178,132,46,71,114,248,187,244,99,210,198,186,149,45,167,255,205,193,110,150,238,207,12,86,201,47,100,57,105,225,113,153,194,156,22,105,189,66,162,253,135,62,232,142,255,58,176,247,103,214,199,201,236,124,233,148,149,133,130,220,151,163,138,41,178,171,119,79,160,226,255,195,68,126,252,247,199,146,249,37,4,62,149,187,207,153,160,10,24,252,29,2,9,143,233,161,118,180,173,72,104,216,96,226,123,135,105,163,84,105,251,124,0,89,160,245,21,99,92,195,169,100,66,125,239,155,184,82,132,113,218,3,168,190,186,136,161,212,84,255,35,33,63,73,62,105,184,135,135,60,121,62,152,168,92,243,69,203,93,158,52,171,18,95,20,249,238,223,223,253,48,57,18,23,229,226,246,68,142,221,14,71,32,24,242,99,5,23,145,200,13,217,105,95,202,165,78,145,164,214,174,170,193,99,242,23,22,66,220,60,194,167,24,117,68,234,18,247,75,138,121,185,72,126,252,254,219,87,101,190,38,195,189,104,166,45,81,28,142,246,255,225,185,78,128,146,109,167,19,73,136,176,209,219,101,49,22,187,165,163,221,146,135,32,244,221,138,137,105,78,6,123,153,14,193,215,209,31,117,133,33,189,231,44,218,190,100,166,157,130,19,7,138,235,67,109,110,73,99,58,187,13,41,179,163,106,100,43,35,85,94,219,1,41,70,235,176,39,148,123,182,249,124,48,27,248,84,200,233,134,13,74,8,160,9,122,103,58,24,183,125,96,203,232,189,111,207,95,148,31,14,117,44,252,173,170,202,234,132,161,197,67,142,148,240,32,46,39,81,74,18,239,155,56,205,118,102,217,61,175,220,40,143,120,91,86,74,44,214,248,2,4,32,49,116,205,186,213,85,228,29,200,21,95,19,13,65,158,169,63,5,37,22,201,38,157,39,100,143,76,70,176,26,237,239,101,150,181,139,209,74,205,0,60,207,199,76,220,99,197,106,175,255,218,43,191,125,209,253,61,249,160,12,195,62,198,15,10,171,127,178,126,238,0,208,221,111,34,124,12,217,13,37,240,61,231,112,226,155,19,203,193,173,103,59,90,37,129,154,164,177,23,47,107,182,124,191,186,90,46,105,200,242,176,109,43,249,23,55,245,77,13,190,249,164,196,186,174,118,84,232,80,106,28,179,96,105,141,29,253,72,166,69,200,139,76,177,36,60,67,218,153,99,121,97,47,54,71,183,24,136,29,77,180,182,117,197,33,218,175,147,101,76,163,123,170,84,223,41,209,191,52,114,17,215,73,251,205,17,5,242,61,16,87,113,252,61,0,7,44,151,197,115,237,140,76,53,75,232,239,27,237,218,251,139,101,161,130,162,227,239,171,72,131,226,239,101,107,10,164,5,52,26,153,71,156,30,188,42,175,165,34,95,164,113,86,94,234,170,119,89,244,59,189,247,58,119,112,151,214,38,229,12,191,32,42,243,106,164,89,49,200,254,63,80,151,3,88,191,77,175,231,110,219,253,151,67,241,124,158,172,155,46,150,43,95,149,39,183,147,132,54,140,174,14,51,209,218,31,112,29,231,240,243,125,132,220,7,103,248,119,41,34,234,56,122,150,200,224,11,34,77,123,239,55,140,209,192,66,198,229,45,184,125,39,248,43,171,199,241,219,255,1,166,194,210,173,39,122,0,0,0};\n\nstatic const unsigned char v2[] = {31,139,8,0,0,0,0,0,0,3,237,91,109,111,219,186,146,254,43,182,47,214,144,96,86,181,123,206,61,187,43,151,215,72,211,52,9,144,32,65,147,246,124,8,140,3,197,166,109,181,50,233,82,146,147,192,214,127,223,25,190,72,148,45,167,233,222,158,189,7,187,251,37,150,248,50,28,14,135,51,207,67,49,237,89,206,39,89,44,184,151,17,238,111,58,226,254,11,155,100,29,74,179,167,21,19,179,22,123,92,9,153,165,221,238,94,205,82,76,243,132,141,244,79,96,218,81,238,249,97,199,202,172,26,79,217,44,230,172,219,213,191,65,180,156,142,244,163,119,55,134,113,195,67,227,142,204,111,112,22,167,153,144,79,74,126,230,190,21,94,182,136,83,82,78,195,223,72,150,229,146,183,170,137,249,27,251,220,226,158,240,55,241,204,99,119,98,236,155,134,248,108,245,31,174,35,217,146,20,139,232,198,148,133,155,130,196,211,80,144,68,68,83,54,13,219,131,98,104,186,102,216,117,18,37,137,39,173,4,34,73,245,204,125,120,209,221,104,187,95,85,20,56,12,163,155,82,16,15,150,20,22,32,152,80,6,127,87,180,211,33,220,235,195,228,238,220,245,33,12,86,40,79,89,43,205,100,12,214,26,150,243,18,56,75,171,84,183,155,5,127,252,193,210,75,189,66,89,184,1,91,71,121,146,133,89,81,112,167,10,117,130,49,37,139,50,118,29,101,11,10,67,71,50,181,207,137,152,68,40,61,61,146,236,228,91,30,37,212,54,190,48,53,101,193,37,91,194,122,148,203,98,74,207,162,116,177,91,246,78,138,135,148,73,91,188,22,241,180,213,183,102,247,222,248,195,43,229,9,129,118,143,107,41,86,76,102,79,30,39,157,250,208,29,178,97,60,95,50,25,221,39,44,132,137,204,89,22,238,123,129,220,209,184,40,124,114,112,132,189,9,191,120,144,189,158,48,142,154,84,12,147,26,60,51,169,210,222,47,28,42,174,86,232,217,169,84,139,250,98,193,85,23,171,124,4,202,255,187,79,38,84,120,145,79,114,120,251,15,159,164,240,150,251,100,6,111,255,233,147,4,222,102,254,240,192,234,78,2,227,121,164,201,37,210,189,218,186,27,37,182,190,32,59,81,202,221,3,59,14,13,239,209,116,122,193,162,105,204,231,55,9,12,71,221,72,160,103,219,121,13,145,134,102,193,100,17,201,163,12,54,26,108,18,40,235,193,72,60,64,193,171,31,23,16,164,249,61,116,133,213,14,43,49,215,18,86,230,145,214,213,55,22,239,43,9,49,159,178,199,171,153,199,29,17,176,245,24,159,103,11,87,210,173,140,226,228,229,26,101,70,196,171,129,146,155,196,19,230,245,201,43,171,92,181,205,93,73,184,230,156,102,219,45,8,35,12,131,144,192,63,18,54,175,85,179,243,183,142,63,148,109,74,95,13,186,93,79,64,141,209,89,250,132,87,111,16,235,124,187,1,156,206,35,236,108,252,205,202,96,85,175,120,71,70,236,99,193,148,77,196,148,125,250,120,14,54,34,155,21,40,205,163,37,11,57,73,89,36,39,139,16,164,194,204,217,168,211,9,25,89,128,117,66,80,18,74,4,150,136,162,168,135,184,134,249,6,86,38,204,25,108,165,164,194,204,179,0,133,193,236,25,47,21,80,166,41,231,0,9,13,6,135,137,192,131,39,123,212,104,226,120,5,67,237,122,204,39,2,154,254,13,155,10,211,84,171,232,52,21,168,118,79,64,198,40,234,254,254,231,68,253,23,4,247,90,108,54,145,38,74,211,120,14,102,168,101,87,33,61,109,202,193,144,191,141,228,28,162,13,135,156,173,61,112,200,123,61,109,106,70,203,186,59,62,30,218,110,162,21,131,41,125,51,192,74,138,76,32,8,64,235,95,61,112,27,212,116,154,101,68,248,96,64,204,187,42,73,251,133,157,62,228,104,12,181,125,159,68,16,146,98,140,90,240,58,192,176,37,188,9,134,45,21,136,247,38,89,183,52,136,223,104,175,53,147,55,155,11,77,207,231,21,60,201,70,94,76,193,67,211,106,39,249,96,10,18,195,102,5,233,20,32,13,52,144,30,64,7,40,213,178,96,189,227,210,213,96,18,213,11,108,50,213,85,121,222,72,187,148,125,173,60,68,117,209,133,232,105,61,251,226,135,85,113,7,196,160,215,142,180,179,233,151,29,17,88,132,254,215,211,143,216,93,23,117,140,162,208,145,119,187,142,210,106,78,122,120,51,59,84,247,43,123,2,180,34,106,51,25,193,246,104,187,243,220,25,187,156,49,216,46,178,225,221,119,42,136,40,31,125,212,172,236,224,148,147,184,104,116,224,198,40,91,237,110,152,10,119,236,111,119,186,42,214,143,88,168,76,129,69,248,128,5,56,77,124,135,95,152,66,159,228,149,218,153,182,135,10,209,240,235,127,111,227,42,111,167,78,238,45,134,89,137,156,197,159,190,235,75,148,245,11,152,144,122,2,99,182,163,12,214,102,148,231,73,66,156,109,225,88,146,114,183,121,70,149,155,120,186,11,206,157,57,189,112,43,65,14,64,172,141,213,109,154,217,141,213,192,14,178,81,134,61,32,55,13,247,118,90,60,106,232,32,70,176,197,65,124,40,189,118,31,255,98,54,105,15,252,130,37,96,49,85,88,64,4,7,110,33,27,2,62,196,63,230,174,2,71,35,70,171,85,242,228,105,167,39,101,156,242,75,132,14,254,151,167,11,143,213,76,6,178,6,48,142,8,102,113,146,49,233,237,167,229,86,134,233,161,64,243,196,238,152,54,248,101,116,55,94,130,241,143,164,140,158,48,156,48,218,31,178,183,217,144,65,8,229,119,108,236,4,80,54,30,194,176,66,158,68,147,69,227,184,245,25,113,191,40,231,178,73,89,6,97,117,185,202,32,137,78,4,159,197,114,9,240,130,167,49,202,184,21,144,70,161,47,227,211,11,0,98,140,51,25,74,194,69,22,207,158,108,65,26,198,136,17,185,221,10,52,254,65,136,54,137,248,167,148,189,191,186,164,109,175,147,115,141,95,167,213,2,63,0,100,16,15,219,109,91,63,4,83,49,81,243,222,47,49,241,252,36,97,248,6,120,1,225,223,201,26,158,173,178,116,119,91,85,22,218,105,57,218,47,82,158,220,70,216,20,68,89,6,182,86,181,94,7,188,177,135,194,48,18,73,64,173,107,246,194,49,27,26,143,26,75,157,145,167,236,192,200,0,229,143,245,250,237,39,179,114,76,238,25,147,153,165,6,39,81,157,211,124,165,34,143,133,219,123,161,192,116,227,209,58,158,71,208,36,128,53,149,71,115,208,194,56,146,87,193,215,206,17,159,74,116,181,55,65,199,167,26,218,53,212,254,26,244,77,245,118,235,84,95,138,251,56,97,173,155,104,22,201,184,169,193,241,2,252,149,117,252,246,94,205,239,74,201,180,117,189,16,220,54,192,92,99,148,95,232,201,1,250,194,237,123,131,97,186,3,112,163,94,91,51,199,181,88,169,102,87,28,185,202,241,34,226,243,90,180,48,86,61,108,156,74,183,91,25,79,161,192,76,200,29,228,84,252,30,103,11,145,103,31,25,30,15,124,74,33,230,157,213,128,253,15,13,244,33,6,158,33,30,157,129,226,244,228,49,131,61,205,68,142,51,82,249,73,57,80,3,117,104,149,169,62,179,169,254,217,209,142,101,124,117,99,199,250,177,148,103,64,22,145,36,38,17,153,168,252,208,54,129,57,31,194,75,169,10,247,115,202,217,67,235,68,74,8,149,157,203,152,199,179,152,77,91,236,113,194,86,58,15,78,38,185,148,108,58,108,225,128,217,130,181,184,224,175,150,182,225,148,173,91,140,175,99,41,56,70,134,22,196,74,213,104,6,233,168,197,80,106,107,201,210,52,154,179,86,196,167,45,216,248,42,252,69,73,107,193,146,21,180,106,61,68,146,195,186,164,224,209,67,76,44,74,203,148,222,57,19,24,3,15,238,15,93,77,49,28,172,146,8,232,214,235,127,75,95,207,27,14,166,210,187,89,175,55,46,0,67,229,129,70,127,231,28,36,199,17,40,249,57,22,137,62,222,40,50,112,249,135,86,30,204,36,180,73,111,5,172,34,29,144,188,248,151,96,6,175,33,9,223,60,45,239,69,2,59,43,85,15,187,21,65,12,25,17,93,104,212,148,157,76,226,47,194,166,74,144,121,120,184,12,227,24,76,48,159,128,108,112,148,178,188,109,159,43,14,49,178,186,133,229,128,228,47,79,100,124,197,100,126,65,34,227,41,38,195,188,223,252,218,41,204,27,75,103,212,41,204,175,246,20,134,76,225,237,239,62,1,40,191,50,91,30,32,61,237,32,146,157,168,56,214,33,43,55,194,100,242,105,39,202,152,128,168,195,192,118,187,41,10,0,217,0,48,202,197,129,146,130,52,228,138,93,99,253,163,111,25,4,44,75,101,173,254,120,228,190,132,128,128,167,21,24,24,233,30,33,160,236,73,133,178,33,7,14,245,170,212,149,36,138,69,76,119,243,152,239,1,219,6,88,225,86,53,197,116,108,23,67,196,131,213,155,176,143,108,38,25,144,253,136,150,74,199,221,110,12,246,205,48,201,130,122,210,77,180,196,30,92,130,255,205,70,211,221,60,28,206,200,156,42,230,112,161,33,221,178,106,62,31,253,22,206,201,3,84,223,71,41,83,156,73,241,200,253,67,30,223,83,21,59,167,89,200,58,108,79,96,72,64,218,174,155,207,112,54,8,200,21,109,33,234,152,70,49,149,216,218,208,178,39,152,177,67,190,38,37,237,4,63,211,180,16,76,16,245,38,189,220,226,224,7,240,218,25,173,84,214,39,92,190,55,35,15,224,164,138,241,238,242,98,240,204,141,26,62,20,4,212,9,17,14,147,251,134,84,119,9,205,3,72,90,83,177,244,252,32,19,55,138,11,120,191,252,230,219,51,161,55,100,9,125,175,112,252,164,242,16,159,60,214,211,154,119,138,180,251,212,248,34,181,231,105,228,42,216,193,177,222,105,101,137,211,32,82,18,96,128,139,154,56,229,74,7,19,42,242,254,237,246,200,187,182,116,16,209,213,141,59,59,172,91,121,62,150,159,32,97,56,170,73,135,164,119,226,171,242,71,207,201,51,156,118,174,175,174,59,195,171,160,1,161,171,96,255,84,197,126,136,251,108,244,232,109,244,4,0,213,219,73,65,68,247,195,63,96,24,197,64,254,104,240,20,199,0,140,94,86,199,145,232,56,160,14,45,79,233,250,190,73,230,85,163,76,55,18,180,60,14,52,141,128,100,190,18,67,9,69,39,200,182,142,129,105,194,228,191,82,109,7,114,73,239,190,98,215,49,185,109,130,35,15,61,229,65,213,161,29,154,184,32,103,46,140,48,231,52,18,172,244,233,230,172,67,212,105,76,190,115,184,227,99,67,114,239,41,87,176,101,7,44,10,116,210,181,168,94,24,99,37,65,111,245,137,146,58,244,80,91,67,173,52,2,22,230,35,197,13,74,116,233,109,208,197,39,68,59,124,14,88,12,9,181,128,104,238,239,108,189,96,1,91,135,10,23,90,84,166,173,20,86,54,134,93,120,89,158,226,166,202,222,163,126,152,246,32,52,206,52,49,141,117,187,75,58,35,149,35,200,202,17,226,194,176,227,102,45,10,220,147,95,154,45,252,241,228,250,226,232,248,228,95,111,100,131,172,126,212,206,22,144,9,255,69,182,30,166,246,104,250,242,46,29,83,99,216,31,51,106,53,164,50,236,113,205,205,129,183,9,229,209,159,26,98,224,177,7,252,165,32,31,27,171,176,230,156,246,201,183,154,188,243,30,205,200,0,156,226,124,228,169,88,181,75,98,125,195,134,200,130,92,168,163,232,231,91,173,201,13,100,22,76,86,231,208,84,181,109,224,167,205,66,159,107,168,228,22,228,29,198,186,15,255,4,132,232,118,221,55,194,233,85,80,158,104,128,61,108,166,122,183,221,122,223,16,36,193,128,125,191,1,136,191,3,157,149,50,223,208,230,62,193,175,201,5,121,223,16,36,175,130,250,129,136,51,138,26,193,145,173,100,25,81,167,116,163,167,18,150,25,200,248,144,138,237,149,31,125,37,230,235,24,236,197,240,150,224,134,14,207,136,113,162,240,11,153,139,240,24,254,188,139,38,95,195,79,240,240,65,72,32,39,211,240,35,185,7,25,95,195,15,36,81,154,133,239,203,243,170,211,194,57,158,121,250,159,226,9,127,121,112,253,19,176,181,11,167,215,116,131,175,247,240,22,110,244,119,34,76,88,13,172,166,211,110,248,228,216,126,221,233,85,80,106,7,230,193,86,209,159,190,94,46,177,246,13,18,66,162,72,81,86,77,179,134,177,220,97,246,240,102,65,154,100,236,52,122,94,66,81,103,29,181,195,165,90,26,34,220,249,32,170,191,52,154,35,44,157,241,58,192,227,204,20,17,23,242,30,198,195,167,70,8,177,43,29,207,86,96,245,231,13,155,187,73,147,186,22,135,162,123,99,79,155,165,249,63,104,127,196,195,190,223,195,111,45,184,154,203,191,12,109,170,145,163,67,103,81,136,171,27,217,15,242,171,146,207,176,6,250,195,20,177,66,155,223,194,22,45,73,21,126,75,2,70,142,62,209,9,53,183,250,89,28,8,8,214,93,52,6,90,181,12,42,63,5,102,180,12,42,207,172,83,14,109,127,13,72,173,155,205,212,231,140,125,110,147,145,25,4,137,253,207,125,47,97,34,159,145,137,124,126,1,19,249,92,1,241,207,46,19,129,252,116,163,191,202,156,236,235,15,218,195,166,121,192,124,132,72,10,191,220,249,176,49,28,160,195,232,189,34,196,149,120,108,217,190,48,223,178,246,190,162,249,158,128,244,96,238,70,97,211,27,88,182,61,60,94,181,48,186,29,121,234,243,215,30,181,185,240,47,254,27,212,70,252,20,106,243,217,165,54,103,1,120,78,118,110,182,245,222,132,184,223,76,118,190,211,45,243,159,167,63,23,72,127,62,90,250,131,171,117,9,171,245,213,31,126,133,165,186,236,118,231,222,165,238,114,171,150,233,140,222,237,13,113,235,143,107,192,188,12,255,16,85,30,188,89,19,87,218,65,156,248,45,64,187,130,33,75,242,16,142,55,31,139,204,207,231,239,226,121,169,14,115,155,241,60,223,247,26,137,142,136,58,115,60,122,1,107,224,125,8,244,177,216,223,128,31,145,39,132,232,250,226,209,119,236,238,168,134,217,251,172,140,186,145,229,70,17,114,163,137,230,70,28,45,59,113,32,60,171,188,72,90,8,255,232,105,172,254,169,217,114,37,9,250,139,25,15,156,12,77,55,7,211,85,182,139,95,98,183,97,100,121,206,25,196,78,8,28,135,13,84,212,25,137,203,97,206,27,136,202,71,205,97,190,53,86,13,20,5,232,187,12,0,228,189,179,28,230,221,232,123,20,230,68,115,147,119,47,96,28,216,24,17,61,68,160,211,63,159,112,188,7,194,241,1,145,227,251,3,132,227,61,168,172,148,249,224,18,142,223,127,140,112,124,216,33,28,31,28,194,241,249,165,132,227,214,37,28,95,52,225,56,46,9,7,82,12,224,22,134,112,156,59,132,227,155,33,28,167,150,112,252,94,18,142,207,46,225,88,254,255,135,137,255,19,31,38,6,190,190,104,245,70,147,167,95,157,235,161,7,190,128,171,51,222,101,204,61,253,16,61,170,40,171,190,103,39,63,17,31,43,42,209,116,114,207,20,197,128,24,28,37,39,28,188,145,165,117,52,123,215,121,221,25,27,4,107,218,169,44,4,243,115,80,108,31,240,107,82,59,226,159,86,213,201,232,183,48,1,166,168,162,175,3,13,215,59,208,240,8,161,225,145,133,134,71,128,92,149,62,118,231,46,246,32,226,81,5,104,142,42,136,184,106,8,179,47,57,73,159,106,242,228,229,164,79,68,117,93,20,56,146,128,117,89,53,92,42,105,186,6,135,156,227,96,46,68,112,29,62,223,68,217,112,187,197,150,224,96,75,26,57,249,10,240,188,227,69,204,158,19,186,40,166,73,50,195,113,201,145,147,128,23,7,18,176,32,252,96,2,62,210,89,20,63,162,244,6,224,14,213,250,24,172,1,144,219,122,37,27,197,65,186,82,197,224,57,214,150,12,111,40,197,26,130,64,246,94,151,217,85,56,217,149,168,81,192,225,140,116,117,166,136,249,246,186,121,238,117,28,242,115,167,15,241,205,43,167,121,103,12,48,166,242,128,234,5,46,89,237,75,78,102,195,208,204,51,189,123,25,120,215,174,107,163,151,9,77,2,96,26,213,136,108,252,114,85,71,207,155,19,184,193,218,83,234,93,53,108,143,123,13,80,30,27,171,6,123,31,128,106,14,209,203,202,83,9,96,248,221,46,127,187,59,189,157,207,63,255,20,216,176,99,45,106,136,163,112,185,96,149,159,22,251,168,1,41,153,197,4,243,231,49,193,252,238,105,108,204,247,84,122,227,220,5,10,75,13,20,30,74,160,112,141,64,225,222,2,133,43,7,40,60,146,73,196,79,69,120,97,0,195,141,5,12,39,37,96,56,114,1,67,242,236,5,50,227,84,223,191,134,143,183,254,234,114,108,14,132,109,12,117,12,182,178,164,246,114,252,80,188,149,67,214,163,3,34,224,143,159,225,13,59,76,124,67,72,146,2,54,81,209,120,125,112,119,37,223,210,193,118,91,6,255,106,241,6,99,60,176,114,223,113,104,117,241,20,66,69,230,225,77,242,237,246,14,108,142,247,40,249,110,105,132,109,25,222,2,156,96,61,67,22,147,211,104,187,157,40,170,175,235,70,49,149,161,52,138,232,27,182,168,56,136,140,113,35,193,202,34,247,36,109,27,147,252,210,110,67,253,21,196,92,115,70,14,102,155,168,105,206,104,124,87,6,178,193,120,152,210,78,128,182,158,109,183,157,160,124,82,191,154,62,165,128,107,75,192,145,0,190,159,82,219,127,56,133,141,50,156,190,122,165,69,47,64,244,116,60,212,242,22,234,38,231,212,15,141,212,197,200,211,5,36,1,80,19,38,72,171,205,59,244,47,240,232,34,247,113,152,33,188,15,19,63,14,114,158,46,226,25,24,46,192,123,58,237,220,168,21,195,230,217,110,99,181,161,152,135,191,96,86,167,117,71,179,165,53,104,249,69,0,28,113,239,245,227,191,187,169,123,204,107,155,45,245,157,178,117,143,98,51,178,118,239,224,200,31,186,250,104,216,228,255,26,208,90,109,183,22,222,225,213,255,93,135,199,181,194,184,90,91,57,23,158,17,81,10,168,86,63,148,149,3,172,84,215,93,131,56,213,215,94,185,61,90,106,123,237,122,141,128,21,180,188,6,201,175,117,88,220,60,108,205,228,83,5,89,106,119,46,81,47,216,218,126,97,79,103,154,110,156,242,145,83,26,170,221,22,55,54,20,59,13,133,58,122,195,127,137,137,107,179,170,254,165,145,74,237,248,17,229,193,58,74,114,6,204,92,125,115,168,222,176,3,210,113,176,208,164,93,217,7,116,199,91,114,74,237,220,126,92,1,188,148,162,122,105,173,64,148,222,155,91,68,73,105,90,70,134,124,215,66,53,251,128,117,172,137,10,59,7,55,58,139,66,89,239,191,0,255,82,202,232,45,58,0,0,0};\n\nstatic const unsigned char v3[] = {31,139,8,0,0,0,0,0,0,3,109,83,201,110,219,48,16,189,231,43,166,188,240,208,136,218,23,7,162,129,52,205,161,135,162,61,180,69,123,100,36,218,98,194,197,37,105,43,254,251,82,150,237,36,78,1,129,51,122,243,102,33,103,166,253,240,249,219,221,143,63,223,239,97,240,74,46,175,218,73,128,100,122,77,17,215,8,58,201,156,163,104,136,86,91,41,225,97,29,141,131,240,28,45,175,0,218,129,179,126,82,130,234,133,151,124,217,198,179,156,49,197,61,131,110,96,214,113,79,209,214,175,162,6,65,252,218,56,120,191,137,248,223,173,216,81,244,59,250,121,27,221,25,181,97,94,60,72,30,50,27,237,185,14,158,95,238,41,239,215,252,194,87,51,197,41,218,9,62,110,140,245,175,232,163,232,253,64,123,190,19,29,143,14,63,215,32,180,240,130,201,200,117,76,114,154,146,228,37,152,20,250,9,44,151,20,137,16,2,129,223,111,66,92,161,216,154,199,110,183,254,248,172,36,130,193,242,21,69,61,243,236,230,141,229,186,13,10,4,69,59,138,167,219,220,196,241,56,142,100,204,137,177,235,56,75,146,100,162,98,88,9,41,41,214,70,115,12,83,205,159,204,51,197,9,36,144,21,225,195,224,188,53,79,199,114,41,78,73,121,130,40,238,182,214,134,139,221,25,105,44,94,66,27,30,104,56,241,67,241,188,99,27,138,173,217,234,30,191,134,31,141,208,103,188,167,248,107,90,144,166,172,33,173,73,210,100,44,203,73,83,52,112,20,161,146,164,36,69,89,68,41,201,211,219,134,44,170,26,230,51,152,210,180,129,5,169,203,93,68,234,95,139,219,10,170,131,67,5,139,93,64,217,37,59,202,66,140,12,42,146,100,89,151,146,58,207,73,85,64,78,202,10,194,203,55,37,76,153,74,152,50,169,146,212,105,1,9,203,10,146,5,236,40,14,81,142,166,51,37,135,60,24,210,179,1,135,22,66,59,61,239,242,162,155,115,183,166,118,184,208,15,235,148,35,138,199,34,204,135,157,79,210,57,135,230,166,59,191,151,220,13,156,251,99,144,54,62,141,117,251,96,250,253,219,5,64,97,196,39,244,96,118,157,21,27,15,206,118,47,201,186,94,19,207,132,28,133,238,67,18,210,25,53,249,204,212,247,94,194,121,99,247,68,9,77,30,221,255,137,243,60,42,211,111,167,165,56,184,41,246,142,31,170,62,172,239,63,221,71,42,213,207,3,0,0,0};\n\nstatic const unsigned char v4[] = {31,139,8,0,0,0,0,0,0,3,189,91,233,114,219,72,146,254,239,167,168,230,184,155,164,155,0,9,82,151,105,81,29,62,219,158,112,219,14,75,118,108,143,66,225,6,137,34,137,22,174,0,64,145,28,13,223,105,159,97,159,108,191,204,194,81,32,33,74,125,236,206,168,105,28,85,89,89,89,121,124,153,85,232,118,133,248,240,241,226,245,80,60,255,244,78,76,108,207,75,132,191,72,82,145,164,118,156,138,165,155,206,69,211,142,220,110,83,184,129,8,99,71,198,34,13,69,34,227,27,41,210,185,20,118,20,9,59,21,118,176,22,95,62,191,123,244,168,185,72,36,58,199,238,36,109,62,123,228,250,81,8,50,183,98,222,17,177,12,208,187,35,208,224,60,181,83,201,87,175,167,83,57,73,249,242,179,156,118,196,60,245,189,142,248,28,46,82,12,180,17,211,56,244,133,104,154,221,241,34,112,60,105,254,158,232,68,223,77,194,32,233,136,247,225,204,13,58,226,92,166,169,27,204,58,226,197,34,77,67,122,128,81,58,34,117,163,151,161,23,198,104,200,255,74,167,35,62,132,169,59,117,39,118,234,82,187,79,54,250,103,215,95,34,47,180,157,55,174,39,21,149,156,7,176,48,9,49,110,32,131,52,81,108,60,162,209,83,26,61,20,35,17,197,97,148,136,209,25,207,224,183,211,228,102,38,38,158,157,36,163,199,183,252,202,228,187,141,88,249,94,144,140,26,243,52,141,134,221,238,114,185,52,151,3,51,140,103,221,126,175,215,235,162,91,67,220,184,114,249,34,92,141,26,61,209,19,86,223,60,57,230,223,195,198,217,169,35,167,201,217,105,146,174,61,121,102,122,158,49,241,18,195,186,157,186,158,55,12,192,219,51,8,62,188,150,195,127,128,86,118,109,248,46,68,233,185,248,103,104,21,15,151,174,147,206,135,61,243,48,90,61,219,156,118,21,193,211,174,34,63,19,174,51,106,188,183,215,50,254,214,111,8,199,78,109,35,176,125,153,61,19,253,70,181,141,101,212,181,178,208,42,178,161,62,74,12,141,156,91,52,29,53,126,193,132,142,250,29,203,60,233,127,61,49,159,90,207,45,243,240,164,195,63,61,252,223,234,88,248,235,153,7,39,111,15,108,203,60,56,232,240,15,191,50,44,195,28,28,63,55,143,158,226,47,107,13,233,160,73,207,51,76,188,180,250,182,121,2,202,86,214,222,180,14,13,80,250,122,104,30,30,227,205,49,254,178,110,230,201,145,129,255,222,30,152,199,131,175,199,102,255,4,175,143,240,199,175,123,29,190,57,124,251,212,60,32,138,135,248,43,94,128,226,201,225,215,129,121,112,248,188,210,5,60,91,131,206,160,99,30,31,225,175,120,200,12,218,102,255,41,254,212,67,98,19,255,209,188,158,170,31,245,152,39,247,182,111,14,158,126,37,225,144,92,142,59,252,163,88,62,232,152,253,195,183,150,181,243,162,20,232,191,26,221,189,146,39,177,42,225,126,181,118,5,143,213,96,90,111,107,135,199,224,88,26,76,252,233,193,46,7,232,128,137,130,125,208,176,171,19,179,168,239,224,216,195,172,77,203,214,164,131,199,150,101,90,7,154,20,233,209,129,121,112,156,175,72,33,120,203,80,55,160,111,13,242,229,44,133,111,168,101,57,122,75,203,162,47,52,189,161,102,95,177,146,186,106,96,33,173,67,136,1,92,177,210,148,26,69,111,6,166,101,117,170,186,215,83,179,96,1,119,103,217,127,48,217,179,223,224,13,166,139,96,66,62,68,188,149,54,252,92,235,214,131,99,88,40,215,6,175,151,200,244,124,30,46,207,93,71,142,109,186,47,111,54,109,113,251,72,192,63,166,139,56,80,254,227,209,169,227,222,228,235,55,158,25,203,57,172,24,110,213,157,92,175,225,127,35,163,39,254,109,92,30,156,92,137,213,210,152,46,60,79,140,217,55,27,99,17,173,141,190,120,124,171,209,23,63,252,32,154,145,103,28,247,155,27,145,198,118,144,184,196,168,1,103,47,156,69,204,158,207,24,244,122,234,221,52,140,253,198,25,248,209,89,136,86,32,154,141,132,1,122,194,167,159,169,39,87,2,140,249,137,49,129,95,148,49,247,67,207,177,242,157,233,58,130,59,80,55,13,17,6,19,15,252,195,33,202,27,114,148,85,137,180,248,217,119,55,237,77,62,102,42,87,169,145,120,136,20,198,65,175,151,145,6,241,199,183,236,247,77,116,74,6,69,235,185,113,212,16,221,108,252,110,126,161,77,129,153,165,31,195,18,51,59,50,86,198,1,88,240,166,6,92,162,76,39,115,225,205,134,234,249,81,57,150,214,63,150,96,197,69,212,211,8,193,197,229,67,213,12,166,75,166,24,178,102,20,116,77,34,59,168,206,219,23,219,243,135,62,205,164,67,97,216,78,134,88,97,210,171,141,54,126,149,131,185,235,56,50,160,225,198,94,56,185,166,139,185,26,126,105,68,43,126,62,51,102,177,13,109,1,113,97,199,174,109,168,62,224,32,94,200,202,212,88,234,42,32,66,131,220,212,35,47,207,234,221,16,46,22,99,148,175,137,210,249,141,182,214,249,147,82,76,221,234,42,241,63,244,3,35,218,232,118,148,43,198,237,34,246,148,189,100,134,162,226,238,7,251,230,189,27,92,35,244,182,110,153,165,14,179,2,8,17,19,144,64,39,52,207,227,113,166,206,217,192,54,183,25,53,254,241,248,150,46,54,141,92,104,234,94,140,70,212,93,252,36,154,144,145,90,129,195,158,90,143,177,183,144,198,17,108,101,22,135,139,168,41,134,162,201,207,89,146,199,120,62,15,111,100,60,172,182,85,207,114,121,31,230,157,55,74,149,148,58,12,4,158,1,32,57,134,239,136,8,214,150,171,129,7,119,2,88,99,28,137,105,24,224,137,244,221,113,232,57,186,61,208,188,11,67,88,162,37,25,67,33,240,199,74,60,155,92,232,133,212,33,240,253,94,231,198,13,61,153,26,22,77,33,49,104,18,158,189,214,46,141,48,146,193,144,189,6,11,105,101,244,10,133,161,255,25,250,43,246,29,15,242,62,21,26,83,119,5,165,87,46,207,147,211,20,255,140,67,40,162,175,92,224,81,239,10,126,233,184,47,10,39,153,57,194,184,66,37,123,152,235,187,160,9,76,189,112,105,172,13,123,65,120,118,18,135,158,7,109,51,214,149,126,202,143,178,3,173,76,19,107,23,187,179,121,170,122,231,12,237,184,205,210,85,76,66,79,248,176,63,90,236,117,97,251,59,109,231,16,54,84,61,134,98,99,126,181,14,132,181,128,52,64,105,200,202,211,29,197,97,213,81,146,141,106,30,146,150,0,122,33,126,13,23,177,120,129,249,56,15,115,151,249,12,116,210,153,249,21,238,224,149,157,204,199,161,29,59,91,30,97,30,250,114,147,217,91,183,65,118,133,87,100,156,154,71,216,165,150,97,249,100,139,216,36,156,21,180,146,162,201,3,105,190,113,99,127,105,199,18,24,31,96,85,110,145,118,194,101,64,208,191,160,191,200,90,61,144,250,235,27,202,12,182,136,218,158,140,211,130,162,204,154,236,82,188,207,21,42,226,173,219,138,3,188,84,244,24,90,168,6,87,112,134,121,118,213,186,188,106,63,43,219,70,246,76,114,75,36,59,178,210,206,66,179,162,29,24,141,101,50,39,167,74,206,147,153,155,82,116,108,113,18,168,70,236,206,100,218,236,48,39,234,127,190,76,231,161,3,87,248,233,227,249,5,222,140,67,103,61,20,255,60,255,248,193,164,76,48,152,185,211,117,235,150,88,24,10,250,221,180,59,89,223,77,219,68,18,25,180,98,242,212,49,242,170,48,104,181,219,5,97,237,101,49,201,86,220,86,28,23,217,99,43,227,186,163,166,121,181,253,154,167,146,177,155,73,160,197,204,69,64,16,178,133,240,104,123,231,105,24,227,185,137,169,189,131,213,181,154,68,169,217,110,179,12,153,83,80,223,75,185,66,38,169,144,233,240,172,205,52,60,103,105,180,20,213,77,149,95,181,0,23,243,221,92,18,72,62,153,132,4,165,200,6,115,3,221,2,131,86,175,132,128,217,133,114,9,228,90,75,231,56,131,207,182,39,110,138,96,117,72,72,14,248,93,68,228,86,216,137,144,131,45,2,79,37,220,232,78,230,41,81,180,39,215,14,216,164,32,23,151,119,200,68,25,6,230,73,175,138,60,167,221,116,174,162,77,54,73,167,102,146,78,17,192,136,83,0,162,137,52,130,112,25,219,209,29,19,35,63,206,96,151,249,143,98,132,208,26,232,244,148,60,98,193,14,158,19,55,142,206,205,167,216,13,25,69,68,184,216,104,43,170,94,83,31,188,190,108,206,225,240,177,148,77,95,58,238,194,167,43,4,144,230,213,37,117,187,122,166,245,152,112,185,129,250,20,181,7,147,203,14,229,237,90,122,232,172,63,153,197,82,6,21,98,122,100,134,195,201,138,23,155,140,60,60,136,186,216,48,135,184,229,201,137,44,172,111,52,157,98,187,225,25,74,29,18,157,166,49,59,157,199,183,23,78,65,228,178,25,133,75,25,211,236,230,112,230,228,47,233,58,117,101,60,200,47,14,48,105,104,51,192,253,85,230,193,170,52,114,142,73,176,27,65,51,34,204,111,178,120,193,94,109,31,208,115,125,9,200,213,10,228,82,188,34,199,148,61,122,34,128,63,122,109,56,138,240,61,153,152,204,141,136,176,151,245,244,184,103,244,44,252,53,239,34,155,73,37,247,171,143,238,4,60,20,158,113,11,212,105,172,243,139,93,192,192,1,63,131,106,133,93,237,6,254,138,237,236,102,3,37,102,36,124,24,17,252,251,125,1,139,158,174,141,177,76,151,80,5,177,99,6,117,152,225,143,12,83,155,213,248,177,113,208,56,123,253,245,245,135,11,241,254,227,207,167,221,18,37,107,151,88,203,162,70,6,5,92,196,49,232,147,31,165,234,22,57,244,220,175,190,161,216,151,93,99,17,194,212,246,200,15,38,35,100,48,138,181,79,50,230,142,253,158,40,99,94,149,39,55,240,220,64,26,42,111,241,221,192,200,18,79,219,115,103,129,225,35,73,241,16,151,185,102,133,9,216,43,99,46,9,139,13,197,73,255,102,254,172,88,170,161,160,181,122,150,139,45,181,199,158,44,166,93,82,205,125,138,68,52,176,75,252,72,146,39,216,173,137,13,193,200,118,180,148,72,217,79,113,11,197,155,23,112,224,2,214,209,16,221,187,27,144,113,236,109,112,1,229,223,219,224,149,4,106,117,35,90,147,74,59,248,183,130,49,242,188,26,211,167,41,133,230,178,233,227,219,150,10,233,166,29,199,48,62,237,102,72,225,206,244,237,168,37,217,101,180,216,139,32,234,195,135,180,55,37,249,146,32,110,72,196,123,129,204,75,56,149,180,117,75,197,194,10,150,9,224,158,232,161,233,201,96,134,120,215,125,34,48,90,236,202,68,60,233,118,196,18,175,73,97,212,211,181,224,242,37,191,241,200,207,90,135,120,195,177,139,237,5,47,74,239,78,241,148,18,24,180,128,33,68,115,161,148,133,59,175,41,132,18,129,67,122,253,171,176,87,110,34,212,51,122,61,102,218,220,85,33,252,26,242,107,232,31,49,119,168,61,34,95,235,146,208,90,115,97,128,74,91,116,243,161,158,136,150,43,126,20,150,6,205,198,28,241,43,205,159,224,190,75,92,63,19,221,174,120,97,199,25,211,101,159,245,78,31,252,206,91,145,70,23,240,126,38,201,235,115,37,31,216,207,253,55,33,192,84,70,28,3,158,199,112,11,38,213,182,91,183,74,232,67,110,2,84,210,250,134,84,154,27,185,196,48,117,17,255,249,15,152,6,231,76,140,71,1,103,52,16,50,68,202,250,91,78,210,222,155,78,250,235,191,219,189,122,188,142,139,40,146,241,196,78,228,67,188,236,1,3,6,38,119,33,125,116,180,193,45,164,2,170,169,232,31,204,235,253,81,94,249,201,61,73,89,219,167,36,89,133,114,99,133,180,62,47,144,193,165,86,139,248,143,111,131,39,203,31,61,196,106,68,199,77,225,81,30,223,242,34,181,122,185,42,42,131,115,245,178,69,102,104,228,17,197,202,26,245,196,218,130,139,93,167,45,183,189,17,171,62,85,88,146,31,65,125,35,214,253,242,133,94,230,31,245,204,65,9,26,249,121,129,12,27,121,75,7,233,155,77,42,49,106,88,29,171,234,79,24,1,173,104,232,124,0,163,95,173,210,93,30,69,171,43,65,219,16,122,193,10,141,201,59,211,79,87,205,239,73,203,253,209,106,235,69,171,223,10,95,162,9,35,80,114,88,213,200,33,6,236,6,47,60,235,21,207,26,215,227,117,139,156,199,229,234,234,9,140,166,75,3,66,6,106,242,86,63,51,30,106,55,175,107,23,175,70,253,66,177,104,10,147,181,29,112,38,93,39,5,125,100,242,43,15,17,195,234,73,127,51,236,245,106,166,125,95,226,247,10,30,217,3,244,143,63,132,64,68,12,241,58,98,50,119,61,7,17,248,190,186,49,27,68,148,21,29,250,59,70,84,3,150,203,242,193,222,98,230,110,45,214,13,166,101,161,33,171,170,210,254,225,216,78,220,196,184,28,244,72,48,179,24,118,162,149,55,50,243,4,216,97,251,4,20,233,107,34,191,19,231,52,206,10,169,208,70,158,220,46,40,114,88,227,213,130,211,106,54,219,102,18,121,110,218,106,154,77,165,86,55,133,90,137,211,72,115,79,125,65,107,117,195,218,153,175,15,64,118,46,236,125,203,244,139,237,6,219,217,57,4,144,37,231,148,103,87,115,243,0,110,66,119,213,213,172,91,207,184,153,10,39,220,181,153,114,53,65,230,129,84,126,92,159,30,171,146,128,59,21,173,239,152,112,59,87,158,102,115,175,243,174,83,31,82,172,196,31,82,169,210,95,41,191,61,139,93,135,127,168,88,148,224,5,21,187,139,91,165,135,7,185,130,61,190,37,118,75,184,83,250,227,134,66,239,13,32,73,98,18,16,190,120,181,17,255,243,223,47,27,148,54,93,112,147,89,24,58,124,251,78,47,187,132,92,150,201,50,43,202,140,170,89,86,89,118,217,226,225,237,2,224,18,185,241,54,3,243,236,249,70,124,175,141,141,220,40,216,29,155,158,222,53,186,10,21,229,240,117,123,60,16,21,97,207,0,210,83,72,84,175,11,195,71,59,176,33,111,214,192,83,226,152,11,76,186,57,86,28,70,150,6,53,88,47,24,95,9,0,28,184,80,137,104,230,168,141,109,218,195,255,37,12,32,72,132,80,202,227,101,224,108,111,164,212,196,196,251,87,223,170,174,126,191,88,253,92,244,140,5,55,204,214,40,151,116,20,186,0,160,44,161,29,17,49,130,152,175,140,254,193,118,177,247,175,136,168,112,240,74,84,23,115,72,104,66,156,145,168,236,64,156,127,253,89,184,62,87,207,102,50,32,53,132,228,104,111,107,78,136,99,93,8,177,160,195,98,86,150,68,16,102,157,157,146,208,76,185,56,106,81,43,231,58,255,146,151,46,105,33,23,73,185,223,1,175,187,19,14,148,75,161,193,36,151,45,190,124,120,254,245,249,187,247,207,95,188,127,77,9,252,155,119,159,207,47,190,189,248,248,145,10,117,205,15,31,47,190,189,252,248,203,47,239,46,46,94,191,162,7,229,205,213,101,139,232,155,9,143,73,190,180,215,22,223,139,131,171,210,111,221,32,35,163,82,142,222,238,76,244,238,219,86,80,75,71,197,167,18,16,86,23,242,255,2,240,85,54,66,234,52,58,111,45,182,241,94,85,7,173,198,153,90,6,218,131,99,49,111,106,11,232,170,233,203,207,47,7,125,106,169,100,245,147,146,213,36,158,12,250,101,61,208,58,226,98,70,208,181,155,251,104,157,3,158,239,144,34,204,254,144,206,111,112,51,135,66,218,169,78,162,40,182,48,45,170,183,96,70,126,148,23,93,106,107,46,213,145,246,71,200,93,21,86,197,247,237,96,169,52,153,170,166,184,168,150,177,111,145,145,220,110,174,30,22,46,167,217,40,93,165,141,15,9,154,52,226,253,49,83,141,28,6,147,208,247,93,74,240,212,30,118,221,208,170,73,83,85,177,239,44,111,103,47,212,48,149,33,98,57,14,195,218,33,28,121,227,78,100,23,61,228,67,233,211,11,90,228,79,112,83,110,34,139,89,83,117,33,92,164,45,53,198,109,46,211,86,251,153,136,233,7,66,31,112,217,173,202,26,111,146,77,174,247,206,63,111,84,225,48,159,86,133,28,188,105,34,247,76,148,223,83,110,86,172,99,141,184,22,124,98,11,84,114,85,107,133,215,72,33,108,95,170,156,183,157,85,115,25,245,132,215,5,228,153,218,94,34,43,149,214,191,36,167,172,232,186,47,3,206,17,208,61,145,114,208,200,234,152,85,175,95,160,148,151,170,252,38,114,129,171,240,212,96,119,128,64,74,255,92,246,174,54,251,182,244,184,170,94,102,5,89,96,220,218,224,127,169,84,61,165,136,152,143,165,159,226,200,141,161,12,161,149,189,175,20,168,105,252,37,66,128,119,19,170,11,57,37,111,121,172,24,141,4,31,224,224,93,107,222,156,188,3,120,220,41,139,79,49,52,37,92,36,123,133,97,21,194,216,153,227,231,92,161,129,95,246,76,52,87,233,124,170,149,137,210,11,116,113,118,103,106,233,51,237,213,205,180,38,14,21,1,114,85,41,72,87,3,164,168,236,44,223,85,25,254,171,1,83,80,254,9,67,36,91,75,33,131,106,150,85,23,60,7,85,198,148,142,113,226,167,43,218,246,33,75,13,132,169,101,81,13,216,32,139,133,53,199,110,64,185,53,47,141,50,122,94,27,117,153,147,160,189,213,70,197,29,169,247,13,97,79,38,50,2,194,35,58,29,115,49,189,43,215,84,204,234,231,122,118,181,70,121,104,229,165,182,52,133,95,109,170,26,146,57,141,122,85,175,27,224,53,59,70,174,74,37,136,70,97,92,29,132,253,226,102,123,255,122,82,161,47,212,97,158,59,33,38,98,243,159,113,78,187,121,224,54,22,47,1,120,97,116,85,196,93,187,13,161,43,157,40,192,130,200,204,199,14,128,185,17,1,98,182,235,216,231,141,8,2,232,73,74,123,98,116,38,138,80,182,38,176,130,84,56,133,54,2,250,20,21,235,218,69,191,103,252,9,18,129,177,20,37,118,238,136,47,31,10,168,44,194,88,20,55,166,120,55,21,65,88,250,196,42,195,246,141,237,122,228,36,128,222,57,197,208,224,185,249,16,30,133,40,72,115,174,242,243,151,119,130,20,28,164,75,91,33,51,97,161,37,200,230,18,26,105,50,95,4,215,148,141,168,11,118,119,90,206,194,154,76,219,212,73,2,156,151,239,240,100,141,195,233,20,145,176,163,182,115,202,65,24,121,210,32,182,26,143,66,238,176,32,89,99,131,63,41,66,163,255,250,129,41,141,126,253,129,207,11,255,107,123,218,186,170,254,157,202,86,179,190,234,144,135,240,37,82,190,192,77,124,72,98,234,6,50,17,3,78,210,114,72,145,64,90,118,202,58,150,218,49,82,184,45,201,169,35,243,174,31,121,210,135,220,134,194,159,125,195,20,191,141,229,204,5,34,235,228,247,203,24,188,3,180,146,212,178,71,88,160,86,251,15,46,252,231,215,231,23,176,113,102,17,124,59,200,112,19,194,174,130,8,174,86,43,140,64,175,232,92,147,77,7,22,243,217,226,1,219,130,169,169,80,102,53,61,35,219,121,201,244,35,118,103,51,162,90,176,72,251,145,147,185,128,92,73,159,203,64,89,144,202,68,185,96,5,162,113,157,173,160,252,7,39,121,106,23,231,151,233,152,95,245,68,29,5,193,152,106,226,141,178,131,200,206,217,208,209,250,100,216,237,250,89,85,195,92,38,221,165,132,215,183,227,164,219,56,251,103,72,31,50,44,98,100,238,82,138,236,197,105,215,62,131,120,10,90,148,165,59,50,133,173,98,26,114,21,121,182,218,252,132,149,141,1,7,69,20,194,80,104,63,113,90,213,36,242,72,84,34,152,185,50,41,77,1,171,93,232,134,242,4,142,244,195,189,106,95,123,32,50,59,241,180,83,105,204,158,171,98,99,118,179,175,222,120,73,203,243,89,38,11,47,85,125,138,219,63,91,165,204,6,85,133,202,7,39,38,26,187,247,101,96,5,23,254,53,122,77,105,191,240,154,247,191,110,182,9,241,174,193,199,241,239,160,97,146,59,155,81,101,182,35,86,200,34,47,175,175,134,226,102,67,73,141,208,50,8,54,146,154,44,164,152,85,162,157,119,42,206,58,65,5,210,187,206,58,229,61,219,52,204,158,51,78,91,178,40,150,129,164,81,155,37,22,213,219,98,128,74,1,87,205,200,11,103,31,35,165,173,35,113,121,217,235,136,230,43,133,76,155,87,16,167,133,251,215,113,28,198,124,215,199,29,165,192,124,51,160,166,114,188,152,53,175,174,238,207,101,182,129,130,194,15,190,179,5,23,182,235,44,123,234,62,101,97,239,255,23,223,230,202,179,7,224,102,7,141,14,245,51,145,37,206,221,42,25,241,193,209,98,53,233,248,104,126,38,70,255,242,104,35,66,194,115,101,195,44,91,216,170,73,86,90,248,50,73,248,108,197,196,131,107,195,59,101,139,85,237,97,195,229,163,64,155,71,37,198,204,38,89,130,204,128,79,68,188,15,233,12,229,141,13,215,170,206,110,176,36,104,79,23,142,159,211,25,62,221,49,37,168,153,25,95,171,169,189,109,98,36,117,208,63,89,186,176,157,42,176,221,30,20,163,137,247,20,161,239,24,210,163,119,119,12,200,239,180,225,164,7,27,7,176,119,156,48,120,47,167,192,246,61,36,207,122,22,246,93,253,116,66,101,29,234,116,122,102,42,155,125,92,191,224,195,190,192,5,117,146,26,23,47,107,248,46,95,150,140,7,72,140,101,156,49,254,153,247,38,27,223,239,23,91,166,167,31,108,58,19,178,195,129,2,33,223,8,77,213,176,160,189,45,121,184,35,249,241,199,80,109,63,205,243,56,196,189,137,52,40,251,131,57,25,180,51,112,166,37,43,149,252,131,116,116,83,201,82,212,147,252,64,47,249,216,242,84,111,247,236,207,160,61,173,204,207,134,45,61,207,141,18,128,224,202,241,129,186,194,255,125,101,255,231,16,106,236,202,116,77,249,66,150,237,34,214,35,174,71,177,52,20,40,164,83,232,66,146,159,33,28,232,40,114,12,247,52,8,146,134,179,25,140,106,156,125,130,72,135,34,233,100,177,80,202,74,37,251,104,65,165,27,233,57,234,227,74,62,182,66,8,33,206,78,120,20,168,129,180,35,49,115,23,149,47,54,51,85,108,225,16,160,183,33,133,96,166,247,220,138,200,197,126,67,39,3,113,202,173,39,37,77,10,95,34,84,49,83,35,244,146,214,146,224,92,182,223,193,129,50,251,182,71,125,42,186,29,38,181,206,91,155,28,59,176,70,197,170,231,81,164,151,238,182,144,13,101,13,252,73,39,72,191,87,215,21,132,66,31,170,232,184,70,125,41,34,211,47,177,87,105,215,236,54,43,205,242,47,178,190,224,162,218,176,210,46,169,124,176,85,249,92,169,142,13,61,0,19,72,172,1,74,234,77,115,171,4,77,108,208,208,237,74,12,119,9,228,112,147,239,98,51,188,22,63,105,82,104,113,245,178,77,145,37,239,207,78,95,12,11,132,145,45,69,205,72,177,73,2,40,142,89,155,80,110,172,211,186,104,84,29,163,254,204,115,117,78,110,144,79,137,111,218,37,104,35,180,146,173,162,142,85,248,248,16,137,83,140,1,173,175,249,124,52,105,153,27,184,169,139,36,147,186,228,88,135,153,221,62,13,203,223,252,110,148,152,248,208,161,87,60,8,179,253,88,254,248,129,231,88,117,162,197,151,10,234,195,225,44,131,40,182,117,47,66,69,149,63,220,27,194,12,125,55,232,242,175,250,148,207,234,242,175,186,233,243,13,151,146,126,227,195,90,156,252,243,242,169,111,181,212,135,75,217,114,38,19,218,126,126,180,23,88,185,129,49,55,84,67,81,124,125,100,101,231,50,40,50,100,223,12,234,95,17,208,16,163,202,39,127,229,97,88,245,53,226,38,211,73,237,131,44,98,124,148,125,69,166,127,141,184,77,168,170,247,42,236,156,239,142,164,205,225,239,248,248,144,121,87,159,129,83,84,121,57,167,179,65,250,167,131,48,241,150,188,49,49,127,196,180,185,75,133,32,58,10,244,86,93,153,16,32,4,247,22,75,157,61,105,161,153,22,96,233,196,198,134,178,125,27,128,137,54,233,97,194,155,186,16,140,160,78,223,210,18,220,40,131,87,217,170,186,173,149,183,205,191,29,209,91,170,175,23,242,22,249,183,32,251,55,128,151,110,128,232,97,134,65,182,197,161,108,79,125,72,223,154,183,224,60,97,106,78,56,89,80,24,50,41,21,129,213,253,47,209,215,238,195,211,63,0,0,0};\n\nstatic const unsigned char v5[] = {45,45,45,45,45,66,69,71,73,78,32,67,69,82,84,73,70,73,67,65,84,69,45,45,45,45,45,10,77,73,73,66,67,84,67,66,115,65,73,74,65,75,57,119,98,73,68,107,72,110,65,111,77,65,111,71,67,67,113,71,83,77,52,57,66,65,77,67,77,65,48,120,67,122,65,74,66,103,78,86,66,65,89,84,65,107,108,70,77,66,52,88,10,68,84,73,122,77,68,69,121,79,84,73,120,77,106,69,122,79,70,111,88,68,84,77,122,77,68,69,121,78,106,73,120,77,106,69,122,79,70,111,119,68,84,69,76,77,65,107,71,65,49,85,69,66,104,77,67,83,85,85,119,87,84,65,84,10,66,103,99,113,104,107,106,79,80,81,73,66,66,103,103,113,104,107,106,79,80,81,77,66,66,119,78,67,65,65,82,122,83,81,83,53,79,72,100,49,55,108,85,101,78,73,43,54,107,112,57,87,89,117,48,99,120,117,69,73,105,47,74,84,10,106,112,104,98,67,109,100,74,68,49,99,85,118,104,109,122,77,57,47,112,104,118,74,84,57,107,97,49,48,90,57,116,111,90,104,103,110,66,113,48,111,48,120,102,84,81,52,106,67,49,118,119,77,65,111,71,67,67,113,71,83,77,52,57,10,66,65,77,67,65,48,103,65,77,69,85,67,73,81,67,101,48,84,50,69,48,71,79,105,86,101,57,75,119,118,73,69,80,101,88,49,74,49,74,48,84,55,84,78,97,99,103,82,48,89,97,51,51,72,86,57,86,103,73,103,78,118,100,110,10,97,69,87,105,66,112,49,120,115,104,115,52,105,122,54,87,98,112,120,114,83,49,73,72,117,99,114,113,107,90,117,74,76,102,78,90,71,90,73,61,10,45,45,45,45,45,69,78,68,32,67,69,82,84,73,70,73,67,65,84,69,45,45,45,45,45,10,0};\n\nstatic const unsigned char v6[] = {45,45,45,45,45,66,69,71,73,78,32,69,67,32,80,82,73,86,65,84,69,32,75,69,89,45,45,45,45,45,10,77,72,99,67,65,81,69,69,73,67,66,122,51,72,79,107,81,76,80,66,68,116,100,107,110,113,67,55,107,49,80,78,115,87,106,54,72,102,104,121,78,66,53,77,101,110,102,106,109,113,105,111,111,65,111,71,67,67,113,71,83,77,52,57,10,65,119,69,72,111,85,81,68,81,103,65,69,99,48,107,69,117,84,104,51,100,101,53,86,72,106,83,80,117,112,75,102,86,109,76,116,72,77,98,104,67,73,118,121,85,52,54,89,87,119,112,110,83,81,57,88,70,76,52,90,115,122,80,102,10,54,89,98,121,85,47,90,71,116,100,71,102,98,97,71,89,89,74,119,97,116,75,78,77,88,48,48,79,73,119,116,98,56,65,61,61,10,45,45,45,45,45,69,78,68,32,69,67,32,80,82,73,86,65,84,69,32,75,69,89,45,45,45,45,45,10,0};\n\nstatic const struct packed_file {\n  const char *name;\n  const unsigned char *data;\n  size_t size;\n  time_t mtime;\n} packed_files[] = {\n  {\"/web_root/bundle.js.gz\", v0, sizeof(v0) - 1, 1752671662},\n  {\"/web_root/components.js.gz\", v1, sizeof(v1) - 1, 1752671662},\n  {\"/web_root/history.min.js.gz\", v2, sizeof(v2) - 1, 1752671662},\n  {\"/web_root/index.html.gz\", v3, sizeof(v3) - 1, 1753452141},\n  {\"/web_root/main.js.gz\", v4, sizeof(v4) - 1, 1752671662},\n  {\"/certs/server_cert.pem\", v5, sizeof(v5) - 1, 1752671662},\n  {\"/certs/server_key.pem\", v6, sizeof(v6) - 1, 1752671662},\n  {NULL, NULL, 0, 0}\n};\n\nstatic int scmp(const char *a, const char *b) {\n  while (*a && (*a == *b)) a++, b++;\n  return *(const unsigned char *) a - *(const unsigned char *) b;\n}\n\nconst char *mg_unlist(size_t no) {\n  return packed_files[no].name;\n}\n\nconst char *mg_unpack(const char *name, size_t *size, time_t *mtime) {\n  const struct packed_file *p;\n  for (p = packed_files; p->name != NULL; p++) {\n    if (scmp(p->name, name) != 0) continue;\n    if (size != NULL) *size = p->size;\n    if (mtime != NULL) *mtime = p->mtime;\n    return (const char *) p->data;\n  }\n  return NULL;\n};\n"
  },
  {
    "path": "tutorials/http/device-dashboard/tailwind.config.js",
    "content": "module.exports = {\n  content: ['./web_root/*.{html,js}'],\n  xplugins: [ 'tailwindcss', 'xautoprefixer' ],\n  corePlugins: {outline: false},\n  theme: {\n    extend: {},\n    fontFamily: {\n      sans:\n      [\n        \"Inter var, Arial, Helvetica, sans-serif\", {\n          fontFeatureSettings: '\"cv11\", \"ss01\"',\n          fontVariationSettings: '\"opsz\" 32',\n        }\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "tutorials/http/device-dashboard/web_root/bundle.js",
    "content": "var n,t,e,_,r,o,i,u,l,c={},a=[],s=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;function f(n,t){for(var e in t)n[e]=t[e];return n}function p(n){var t=n.parentNode;t&&t.removeChild(n)}function h(t,e,_){var r,o,i,u={};for(i in e)\"key\"==i?r=e[i]:\"ref\"==i?o=e[i]:u[i]=e[i];if(arguments.length>2&&(u.children=arguments.length>3?n.call(arguments,2):_),\"function\"==typeof t&&null!=t.defaultProps)for(i in t.defaultProps)void 0===u[i]&&(u[i]=t.defaultProps[i]);return d(t,u,r,o,null)}function d(n,_,r,o,i){var u={type:n,props:_,key:r,ref:o,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:null==i?++e:i};return null==i&&null!=t.vnode&&t.vnode(u),u}function v(){return{current:null}}function m(n){return n.children}function y(n,t){this.props=n,this.context=t}function g(n,t){if(null==t)return n.__?g(n.__,n.__.__k.indexOf(n)+1):null;for(var e;t<n.__k.length;t++)if(null!=(e=n.__k[t])&&null!=e.__e)return e.__e;return\"function\"==typeof n.type?g(n):null}function b(n){var t,e;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,t=0;t<n.__k.length;t++)if(null!=(e=n.__k[t])&&null!=e.__e){n.__e=n.__c.base=e.__e;break}return b(n)}}function k(n){(!n.__d&&(n.__d=!0)&&r.push(n)&&!C.__r++||o!==t.debounceRendering)&&((o=t.debounceRendering)||i)(C)}function C(){var n,t,e,_,o,i,l,c;for(r.sort(u);n=r.shift();)n.__d&&(t=r.length,_=void 0,o=void 0,l=(i=(e=n).__v).__e,(c=e.__P)&&(_=[],(o=f({},i)).__v=i.__v+1,T(c,i,o,e.__n,void 0!==c.ownerSVGElement,null!=i.__h?[l]:null,_,null==l?g(i):l,i.__h),R(_,i),i.__e!=l&&b(i)),r.length>t&&r.sort(u));C.__r=0}function x(n,t,e,_,r,o,i,u,l,s){var f,p,h,v,y,b,k,C=_&&_.__k||a,x=C.length;for(e.__k=[],f=0;f<t.length;f++)if(null!=(v=e.__k[f]=null==(v=t[f])||\"boolean\"==typeof v||\"function\"==typeof v?null:\"string\"==typeof v||\"number\"==typeof v||\"bigint\"==typeof v?d(null,v,null,null,v):Array.isArray(v)?d(m,{children:v},null,null,null):v.__b>0?d(v.type,v.props,v.key,v.ref?v.ref:null,v.__v):v)){if(v.__=e,v.__b=e.__b+1,null===(h=C[f])||h&&v.key==h.key&&v.type===h.type)C[f]=void 0;else for(p=0;p<x;p++){if((h=C[p])&&v.key==h.key&&v.type===h.type){C[p]=void 0;break}h=null}T(n,v,h=h||c,r,o,i,u,l,s),y=v.__e,(p=v.ref)&&h.ref!=p&&(k||(k=[]),h.ref&&k.push(h.ref,null,v),k.push(p,v.__c||y,v)),null!=y?(null==b&&(b=y),\"function\"==typeof v.type&&v.__k===h.__k?v.__d=l=E(v,l,n):l=U(n,v,h,C,y,l),\"function\"==typeof e.type&&(e.__d=l)):l&&h.__e==l&&l.parentNode!=n&&(l=g(h))}for(e.__e=b,f=x;f--;)null!=C[f]&&(\"function\"==typeof e.type&&null!=C[f].__e&&C[f].__e==e.__d&&(e.__d=A(_).nextSibling),W(C[f],C[f]));if(k)for(f=0;f<k.length;f++)M(k[f],k[++f],k[++f])}function E(n,t,e){for(var _,r=n.__k,o=0;r&&o<r.length;o++)(_=r[o])&&(_.__=n,t=\"function\"==typeof _.type?E(_,t,e):U(e,_,_,r,_.__e,t));return t}function H(n,t){return t=t||[],null==n||\"boolean\"==typeof n||(Array.isArray(n)?n.some((function(n){H(n,t)})):t.push(n)),t}function U(n,t,e,_,r,o){var i,u,l;if(void 0!==t.__d)i=t.__d,t.__d=void 0;else if(null==e||r!=o||null==r.parentNode)n:if(null==o||o.parentNode!==n)n.appendChild(r),i=null;else{for(u=o,l=0;(u=u.nextSibling)&&l<_.length;l+=1)if(u==r)break n;n.insertBefore(r,o),i=o}return void 0!==i?i:r.nextSibling}function A(n){var t,e,_;if(null==n.type||\"string\"==typeof n.type)return n.__e;if(n.__k)for(t=n.__k.length-1;t>=0;t--)if((e=n.__k[t])&&(_=A(e)))return _;return null}function P(n,t,e,_,r){var o;for(o in e)\"children\"===o||\"key\"===o||o in t||N(n,o,null,e[o],_);for(o in t)r&&\"function\"!=typeof t[o]||\"children\"===o||\"key\"===o||\"value\"===o||\"checked\"===o||e[o]===t[o]||N(n,o,t[o],e[o],_)}function S(n,t,e){\"-\"===t[0]?n.setProperty(t,null==e?\"\":e):n[t]=null==e?\"\":\"number\"!=typeof e||s.test(t)?e:e+\"px\"}function N(n,t,e,_,r){var o;n:if(\"style\"===t)if(\"string\"==typeof e)n.style.cssText=e;else{if(\"string\"==typeof _&&(n.style.cssText=_=\"\"),_)for(t in _)e&&t in e||S(n.style,t,\"\");if(e)for(t in e)_&&e[t]===_[t]||S(n.style,t,e[t])}else if(\"o\"===t[0]&&\"n\"===t[1])o=t!==(t=t.replace(/Capture$/,\"\")),t=t.toLowerCase()in n?t.toLowerCase().slice(2):t.slice(2),n.l||(n.l={}),n.l[t+o]=e,e?_||n.addEventListener(t,o?D:w,o):n.removeEventListener(t,o?D:w,o);else if(\"dangerouslySetInnerHTML\"!==t){if(r)t=t.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"width\"!==t&&\"height\"!==t&&\"href\"!==t&&\"list\"!==t&&\"form\"!==t&&\"tabIndex\"!==t&&\"download\"!==t&&t in n)try{n[t]=null==e?\"\":e;break n}catch(n){}\"function\"==typeof e||(null==e||!1===e&&\"-\"!==t[4]?n.removeAttribute(t):n.setAttribute(t,e))}}function w(n){return this.l[n.type+!1](t.event?t.event(n):n)}function D(n){return this.l[n.type+!0](t.event?t.event(n):n)}function T(n,e,_,r,o,i,u,l,c){var a,s,p,h,d,v,g,b,k,C,E,H,U,A,P,S=e.type;if(void 0!==e.constructor)return null;null!=_.__h&&(c=_.__h,l=e.__e=_.__e,e.__h=null,i=[l]),(a=t.__b)&&a(e);try{n:if(\"function\"==typeof S){if(b=e.props,k=(a=S.contextType)&&r[a.__c],C=a?k?k.props.value:a.__:r,_.__c?g=(s=e.__c=_.__c).__=s.__E:(\"prototype\"in S&&S.prototype.render?e.__c=s=new S(b,C):(e.__c=s=new y(b,C),s.constructor=S,s.render=V),k&&k.sub(s),s.props=b,s.state||(s.state={}),s.context=C,s.__n=r,p=s.__d=!0,s.__h=[],s._sb=[]),null==s.__s&&(s.__s=s.state),null!=S.getDerivedStateFromProps&&(s.__s==s.state&&(s.__s=f({},s.__s)),f(s.__s,S.getDerivedStateFromProps(b,s.__s))),h=s.props,d=s.state,s.__v=e,p)null==S.getDerivedStateFromProps&&null!=s.componentWillMount&&s.componentWillMount(),null!=s.componentDidMount&&s.__h.push(s.componentDidMount);else{if(null==S.getDerivedStateFromProps&&b!==h&&null!=s.componentWillReceiveProps&&s.componentWillReceiveProps(b,C),!s.__e&&null!=s.shouldComponentUpdate&&!1===s.shouldComponentUpdate(b,s.__s,C)||e.__v===_.__v){for(e.__v!==_.__v&&(s.props=b,s.state=s.__s,s.__d=!1),s.__e=!1,e.__e=_.__e,e.__k=_.__k,e.__k.forEach((function(n){n&&(n.__=e)})),E=0;E<s._sb.length;E++)s.__h.push(s._sb[E]);s._sb=[],s.__h.length&&u.push(s);break n}null!=s.componentWillUpdate&&s.componentWillUpdate(b,s.__s,C),null!=s.componentDidUpdate&&s.__h.push((function(){s.componentDidUpdate(h,d,v)}))}if(s.context=C,s.props=b,s.__P=n,H=t.__r,U=0,\"prototype\"in S&&S.prototype.render){for(s.state=s.__s,s.__d=!1,H&&H(e),a=s.render(s.props,s.state,s.context),A=0;A<s._sb.length;A++)s.__h.push(s._sb[A]);s._sb=[]}else do{s.__d=!1,H&&H(e),a=s.render(s.props,s.state,s.context),s.state=s.__s}while(s.__d&&++U<25);s.state=s.__s,null!=s.getChildContext&&(r=f(f({},r),s.getChildContext())),p||null==s.getSnapshotBeforeUpdate||(v=s.getSnapshotBeforeUpdate(h,d)),P=null!=a&&a.type===m&&null==a.key?a.props.children:a,x(n,Array.isArray(P)?P:[P],e,_,r,o,i,u,l,c),s.base=e.__e,e.__h=null,s.__h.length&&u.push(s),g&&(s.__E=s.__=null),s.__e=!1}else null==i&&e.__v===_.__v?(e.__k=_.__k,e.__e=_.__e):e.__e=L(_.__e,e,_,r,o,i,u,c);(a=t.diffed)&&a(e)}catch(n){e.__v=null,(c||null!=i)&&(e.__e=l,e.__h=!!c,i[i.indexOf(l)]=null),t.__e(n,e,_)}}function R(n,e){t.__c&&t.__c(e,n),n.some((function(e){try{n=e.__h,e.__h=[],n.some((function(n){n.call(e)}))}catch(n){t.__e(n,e.__v)}}))}function L(t,e,_,r,o,i,u,l){var a,s,f,h=_.props,d=e.props,v=e.type,m=0;if(\"svg\"===v&&(o=!0),null!=i)for(;m<i.length;m++)if((a=i[m])&&\"setAttribute\"in a==!!v&&(v?a.localName===v:3===a.nodeType)){t=a,i[m]=null;break}if(null==t){if(null===v)return document.createTextNode(d);t=o?document.createElementNS(\"http://www.w3.org/2000/svg\",v):document.createElement(v,d.is&&d),i=null,l=!1}if(null===v)h===d||l&&t.data===d||(t.data=d);else{if(i=i&&n.call(t.childNodes),s=(h=_.props||c).dangerouslySetInnerHTML,f=d.dangerouslySetInnerHTML,!l){if(null!=i)for(h={},m=0;m<t.attributes.length;m++)h[t.attributes[m].name]=t.attributes[m].value;(f||s)&&(f&&(s&&f.__html==s.__html||f.__html===t.innerHTML)||(t.innerHTML=f&&f.__html||\"\"))}if(P(t,d,h,o,l),f)e.__k=[];else if(m=e.props.children,x(t,Array.isArray(m)?m:[m],e,_,r,o&&\"foreignObject\"!==v,i,u,i?i[0]:_.__k&&g(_,0),l),null!=i)for(m=i.length;m--;)null!=i[m]&&p(i[m]);l||(\"value\"in d&&void 0!==(m=d.value)&&(m!==t.value||\"progress\"===v&&!m||\"option\"===v&&m!==h.value)&&N(t,\"value\",m,h.value,!1),\"checked\"in d&&void 0!==(m=d.checked)&&m!==t.checked&&N(t,\"checked\",m,h.checked,!1))}return t}function M(n,e,_){try{\"function\"==typeof n?n(e):n.current=e}catch(n){t.__e(n,_)}}function W(n,e,_){var r,o;if(t.unmount&&t.unmount(n),(r=n.ref)&&(r.current&&r.current!==n.__e||M(r,null,e)),null!=(r=n.__c)){if(r.componentWillUnmount)try{r.componentWillUnmount()}catch(n){t.__e(n,e)}r.base=r.__P=null,n.__c=void 0}if(r=n.__k)for(o=0;o<r.length;o++)r[o]&&W(r[o],e,_||\"function\"!=typeof n.type);_||null==n.__e||p(n.__e),n.__=n.__e=n.__d=void 0}function V(n,t,e){return this.constructor(n,e)}function F(e,_,r){var o,i,u;t.__&&t.__(e,_),i=(o=\"function\"==typeof r)?null:r&&r.__k||_.__k,u=[],T(_,e=(!o&&r||_).__k=h(m,null,[e]),i||c,c,void 0!==_.ownerSVGElement,!o&&r?[r]:i?null:_.firstChild?n.call(_.childNodes):null,u,!o&&r?r:i?i.__e:_.firstChild,o),R(u,e)}function I(n,t){F(n,t,I)}function O(t,e,_){var r,o,i,u=f({},t.props);for(i in e)\"key\"==i?r=e[i]:\"ref\"==i?o=e[i]:u[i]=e[i];return arguments.length>2&&(u.children=arguments.length>3?n.call(arguments,2):_),d(t.type,u,r||t.key,o||t.ref,null)}function $(n,t){var e={__c:t=\"__cC\"+l++,__:n,Consumer:function(n,t){return n.children(t)},Provider:function(n){var e,_;return this.getChildContext||(e=[],(_={})[t]=this,this.getChildContext=function(){return _},this.shouldComponentUpdate=function(n){this.props.value!==n.value&&e.some((function(n){n.__e=!0,k(n)}))},this.sub=function(n){e.push(n);var t=n.componentWillUnmount;n.componentWillUnmount=function(){e.splice(e.indexOf(n),1),t&&t.call(n)}}),n.children}};return e.Provider.__=e.Consumer.contextType=e}n=a.slice,t={__e:function(n,t,e,_){for(var r,o,i;t=t.__;)if((r=t.__c)&&!r.__)try{if((o=r.constructor)&&null!=o.getDerivedStateFromError&&(r.setState(o.getDerivedStateFromError(n)),i=r.__d),null!=r.componentDidCatch&&(r.componentDidCatch(n,_||{}),i=r.__d),i)return r.__E=r}catch(t){n=t}throw n}},e=0,_=function(n){return null!=n&&void 0===n.constructor},y.prototype.setState=function(n,t){var e;e=null!=this.__s&&this.__s!==this.state?this.__s:this.__s=f({},this.state),\"function\"==typeof n&&(n=n(f({},e),this.props)),n&&f(e,n),null!=n&&this.__v&&(t&&this._sb.push(t),k(this))},y.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),k(this))},y.prototype.render=m,r=[],i=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,u=function(n,t){return n.__v.__b-t.__v.__b},C.__r=0,l=0;var j,q,B,K,G=0,z=[],J=[],Q=t.__b,X=t.__r,Y=t.diffed,Z=t.__c,nn=t.unmount;function tn(n,e){t.__h&&t.__h(q,n,G||e),G=0;var _=q.__H||(q.__H={__:[],__h:[]});return n>=_.__.length&&_.__.push({__V:J}),_.__[n]}function en(n){return G=1,_n(kn,n)}function _n(n,t,e){var _=tn(j++,2);if(_.t=n,!_.__c&&(_.__=[e?e(t):kn(void 0,t),function(n){var t=_.__N?_.__N[0]:_.__[0],e=_.t(t,n);t!==e&&(_.__N=[e,_.__[1]],_.__c.setState({}))}],_.__c=q,!q.u)){var r=function(n,t,e){if(!_.__c.__H)return!0;var r=_.__c.__H.__.filter((function(n){return n.__c}));if(r.every((function(n){return!n.__N})))return!o||o.call(this,n,t,e);var i=!1;return r.forEach((function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}})),!(!i&&_.__c.props===n)&&(!o||o.call(this,n,t,e))};q.u=!0;var o=q.shouldComponentUpdate,i=q.componentWillUpdate;q.componentWillUpdate=function(n,t,e){if(this.__e){var _=o;o=void 0,r(n,t,e),o=_}i&&i.call(this,n,t,e)},q.shouldComponentUpdate=r}return _.__N||_.__}function rn(n,e){var _=tn(j++,3);!t.__s&&bn(_.__H,e)&&(_.__=n,_.i=e,q.__H.__h.push(_))}function on(n,e){var _=tn(j++,4);!t.__s&&bn(_.__H,e)&&(_.__=n,_.i=e,q.__h.push(_))}function un(n){return G=5,cn((function(){return{current:n}}),[])}function ln(n,t,e){G=6,on((function(){return\"function\"==typeof n?(n(t()),function(){return n(null)}):n?(n.current=t(),function(){return n.current=null}):void 0}),null==e?e:e.concat(n))}function cn(n,t){var e=tn(j++,7);return bn(e.__H,t)?(e.__V=n(),e.i=t,e.__h=n,e.__V):e.__}function an(n,t){return G=8,cn((function(){return n}),t)}function sn(n){var t=q.context[n.__c],e=tn(j++,9);return e.c=n,t?(null==e.__&&(e.__=!0,t.sub(q)),t.props.value):n.__}function fn(n,e){t.useDebugValue&&t.useDebugValue(e?e(n):n)}function pn(n){var t=tn(j++,10),e=en();return t.__=n,q.componentDidCatch||(q.componentDidCatch=function(n,_){t.__&&t.__(n,_),e[1](n)}),[e[0],function(){e[1](void 0)}]}function hn(){var n=tn(j++,11);if(!n.__){for(var t=q.__v;null!==t&&!t.__m&&null!==t.__;)t=t.__;var e=t.__m||(t.__m=[0,0]);n.__=\"P\"+e[0]+\"-\"+e[1]++}return n.__}function dn(){for(var n;n=z.shift();)if(n.__P&&n.__H)try{n.__H.__h.forEach(yn),n.__H.__h.forEach(gn),n.__H.__h=[]}catch(o){n.__H.__h=[],t.__e(o,n.__v)}}t.__b=function(n){q=null,Q&&Q(n)},t.__r=function(n){X&&X(n),j=0;var t=(q=n.__c).__H;t&&(B===q?(t.__h=[],q.__h=[],t.__.forEach((function(n){n.__N&&(n.__=n.__N),n.__V=J,n.__N=n.i=void 0}))):(t.__h.forEach(yn),t.__h.forEach(gn),t.__h=[])),B=q},t.diffed=function(n){Y&&Y(n);var e=n.__c;e&&e.__H&&(e.__H.__h.length&&(1!==z.push(e)&&K===t.requestAnimationFrame||((K=t.requestAnimationFrame)||mn)(dn)),e.__H.__.forEach((function(n){n.i&&(n.__H=n.i),n.__V!==J&&(n.__=n.__V),n.i=void 0,n.__V=J}))),B=q=null},t.__c=function(n,_){_.some((function(n){try{n.__h.forEach(yn),n.__h=n.__h.filter((function(n){return!n.__||gn(n)}))}catch(e){_.some((function(n){n.__h&&(n.__h=[])})),_=[],t.__e(e,n.__v)}})),Z&&Z(n,_)},t.unmount=function(n){nn&&nn(n);var e,_=n.__c;_&&_.__H&&(_.__H.__.forEach((function(n){try{yn(n)}catch(n){e=n}})),_.__H=void 0,e&&t.__e(e,_.__v))};var vn=\"function\"==typeof requestAnimationFrame;function mn(n){var t,e=function(){clearTimeout(_),vn&&cancelAnimationFrame(t),setTimeout(n)},_=setTimeout(e,100);vn&&(t=requestAnimationFrame(e))}function yn(n){var t=q,e=n.__c;\"function\"==typeof e&&(n.__c=void 0,e()),q=t}function gn(n){var t=q;n.__c=n.__(),q=t}function bn(n,t){return!n||n.length!==t.length||t.some((function(t,e){return t!==n[e]}))}function kn(n,t){return\"function\"==typeof t?t(n):t}var Cn=function(n,t,e,_){var r;t[0]=0;for(var o=1;o<t.length;o++){var i=t[o++],u=t[o]?(t[0]|=i?1:2,e[t[o++]]):t[++o];3===i?_[0]=u:4===i?_[1]=Object.assign(_[1]||{},u):5===i?(_[1]=_[1]||{})[t[++o]]=u:6===i?_[1][t[++o]]+=u+\"\":i?(r=n.apply(u,Cn(n,u,e,[\"\",null])),_.push(r),u[0]?t[0]|=2:(t[o-2]=0,t[o]=r)):_.push(u)}return _},xn=new Map;function En(n){var t=xn.get(this);return t||(t=new Map,xn.set(this,t)),(t=Cn(this,t.get(n)||(t.set(n,t=function(n){for(var t,e,_=1,r=\"\",o=\"\",i=[0],u=function(n){1===_&&(n||(r=r.replace(/^\\s*\\n\\s*|\\s*\\n\\s*$/g,\"\")))?i.push(0,n,r):3===_&&(n||r)?(i.push(3,n,r),_=2):2===_&&\"...\"===r&&n?i.push(4,n,0):2===_&&r&&!n?i.push(5,0,!0,r):_>=5&&((r||!n&&5===_)&&(i.push(_,0,r,e),_=6),n&&(i.push(_,n,0,e),_=6)),r=\"\"},l=0;l<n.length;l++){l&&(1===_&&u(),u(l));for(var c=0;c<n[l].length;c++)t=n[l][c],1===_?\"<\"===t?(u(),i=[i],_=3):r+=t:4===_?\"--\"===r&&\">\"===t?(_=1,r=\"\"):r=t+r[0]:o?t===o?o=\"\":r+=t:'\"'===t||\"'\"===t?o=t:\">\"===t?(u(),_=1):_&&(\"=\"===t?(_=5,e=r,r=\"\"):\"/\"===t&&(_<5||\">\"===n[l][c+1])?(u(),3===_&&(i=i[0]),_=i,(i=i[0]).push(2,0,_),_=0):\" \"===t||\"\\t\"===t||\"\\n\"===t||\"\\r\"===t?(u(),_=2):r+=t),3===_&&\"!--\"===r&&(_=4,i=i[0])}return u(),i}(n)),t),arguments,[])).length>1?t:t[0]}var Hn=En.bind(h);var Un={};function An(n,t){for(var e in t)n[e]=t[e];return n}function Pn(n,t,e){var _,r=/(?:\\?([^#]*))?(#.*)?$/,o=n.match(r),i={};if(o&&o[1])for(var u=o[1].split(\"&\"),l=0;l<u.length;l++){var c=u[l].split(\"=\");i[decodeURIComponent(c[0])]=decodeURIComponent(c.slice(1).join(\"=\"))}n=wn(n.replace(r,\"\")),t=wn(t||\"\");for(var a=Math.max(n.length,t.length),s=0;s<a;s++)if(t[s]&&\":\"===t[s].charAt(0)){var f=t[s].replace(/(^:|[+*?]+$)/g,\"\"),p=(t[s].match(/[+*?]+$/)||Un)[0]||\"\",h=~p.indexOf(\"+\"),d=~p.indexOf(\"*\"),v=n[s]||\"\";if(!v&&!d&&(p.indexOf(\"?\")<0||h)){_=!1;break}if(i[f]=decodeURIComponent(v),h||d){i[f]=n.slice(s).map(decodeURIComponent).join(\"/\");break}}else if(t[s]!==n[s]){_=!1;break}return(!0===e.default||!1!==_)&&i}function Sn(n,t){return n.rank<t.rank?1:n.rank>t.rank?-1:n.index-t.index}function Nn(n,t){return n.index=t,n.rank=function(n){return n.props.default?0:wn(n.props.path).map(Dn).join(\"\")}(n),n.props}function wn(n){return n.replace(/(^\\/+|\\/+$)/g,\"\").split(\"/\")}function Dn(n){return\":\"==n.charAt(0)?1+\"*+?\".indexOf(n.charAt(n.length-1))||4:5}var Tn={},Rn=[],Ln=[],Mn=null,Wn={url:In()},Vn=$(Wn);function Fn(){var n=sn(Vn);if(n===Wn){var t=en()[1];rn((function(){return Ln.push(t),function(){return Ln.splice(Ln.indexOf(t),1)}}),[])}return[n,On]}function In(){var n;return\"\"+((n=Mn&&Mn.location?Mn.location:Mn&&Mn.getCurrentLocation?Mn.getCurrentLocation():\"undefined\"!=typeof location?location:Tn).pathname||\"\")+(n.search||\"\")}function On(n,t){return void 0===t&&(t=!1),\"string\"!=typeof n&&n.url&&(t=n.replace,n=n.url),function(n){for(var t=Rn.length;t--;)if(Rn[t].canRoute(n))return!0;return!1}(n)&&function(n,t){void 0===t&&(t=\"push\"),Mn&&Mn[t]?Mn[t](n):\"undefined\"!=typeof history&&history[t+\"State\"]&&history[t+\"State\"](null,null,n)}(n,t?\"replace\":\"push\"),$n(n)}function $n(n){for(var t=!1,e=0;e<Rn.length;e++)Rn[e].routeTo(n)&&(t=!0);return t}function jn(n){if(n&&n.getAttribute){var t=n.getAttribute(\"href\"),e=n.getAttribute(\"target\");if(t&&t.match(/^\\//g)&&(!e||e.match(/^_?self$/i)))return On(t)}}function qn(n){return n.stopImmediatePropagation&&n.stopImmediatePropagation(),n.stopPropagation&&n.stopPropagation(),n.preventDefault(),!1}function Bn(n){if(!(n.ctrlKey||n.metaKey||n.altKey||n.shiftKey||n.button)){var t=n.target;do{if(\"a\"===t.localName&&t.getAttribute(\"href\")){if(t.hasAttribute(\"data-native\")||t.hasAttribute(\"native\"))return;if(jn(t))return qn(n)}}while(t=t.parentNode)}}var Kn=!1;function Gn(n){n.history&&(Mn=n.history),this.state={url:n.url||In()}}An(Gn.prototype=new y,{shouldComponentUpdate:function(n){return!0!==n.static||n.url!==this.props.url||n.onChange!==this.props.onChange},canRoute:function(n){var t=H(this.props.children);return void 0!==this.g(t,n)},routeTo:function(n){this.setState({url:n});var t=this.canRoute(n);return this.p||this.forceUpdate(),t},componentWillMount:function(){this.p=!0},componentDidMount:function(){var n=this;Kn||(Kn=!0,Mn||addEventListener(\"popstate\",(function(){$n(In())})),addEventListener(\"click\",Bn)),Rn.push(this),Mn&&(this.u=Mn.listen((function(t){var e=t.location||t;n.routeTo(\"\"+(e.pathname||\"\")+(e.search||\"\"))}))),this.p=!1},componentWillUnmount:function(){\"function\"==typeof this.u&&this.u(),Rn.splice(Rn.indexOf(this),1)},componentWillUpdate:function(){this.p=!0},componentDidUpdate:function(){this.p=!1},g:function(n,t){n=n.filter(Nn).sort(Sn);for(var e=0;e<n.length;e++){var _=n[e],r=Pn(t,_.props.path,_.props);if(r)return[_,r]}},render:function(n,t){var e,_,r=n.onChange,o=t.url,i=this.c,u=this.g(H(n.children),o);if(u&&(_=O(u[0],An(An({url:o,matches:e=u[1]},e),{key:void 0,ref:void 0}))),o!==(i&&i.url)){An(Wn,i=this.c={url:o,previous:i&&i.url,current:_,path:_?_.props.path:null,matches:e}),i.router=this,i.active=_?[_]:[];for(var l=Ln.length;l--;)Ln[l]({});\"function\"==typeof r&&r(i)}return h(Vn.Provider,{value:i},_)}});var zn=function(n){return h(\"a\",An({onClick:Bn},n))},Jn=function(n){return h(n.component,n)};export{y as Component,m as Fragment,zn as Link,Jn as Route,Gn as Router,O as cloneElement,$ as createContext,h as createElement,v as createRef,Pn as exec,In as getCurrentUrl,h,Hn as html,I as hydrate,_ as isValidElement,t as options,F as render,On as route,H as toChildArray,an as useCallback,sn as useContext,fn as useDebugValue,rn as useEffect,pn as useErrorBoundary,hn as useId,ln as useImperativeHandle,on as useLayoutEffect,cn as useMemo,_n as useReducer,un as useRef,Fn as useRouter,en as useState};"
  },
  {
    "path": "tutorials/http/device-dashboard/web_root/components.js",
    "content": "'use strict';\nimport { h, render, useState, useEffect, useRef, html, Router } from  './bundle.js';\n\n// Helper function that returns a promise that resolves after delay\nconst Delay = (ms, val) => new Promise(resolve => setTimeout(resolve, ms, val));\n\nexport const Icons = {\n  heart: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z\"></path></svg>`,\n  downArrowBox: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 8.25H7.5a2.25 2.25 0 00-2.25 2.25v9a2.25 2.25 0 002.25 2.25h9a2.25 2.25 0 002.25-2.25v-9a2.25 2.25 0 00-2.25-2.25H15M9 12l3 3m0 0l3-3m-3 3V2.25\" /> </svg>`,\n  upArrowBox: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 8.25H7.5a2.25 2.25 0 00-2.25 2.25v9a2.25 2.25 0 002.25 2.25h9a2.25 2.25 0 002.25-2.25v-9a2.25 2.25 0 00-2.25-2.25H15m0-3l-3-3m0 0l-3 3m3-3V15\" /> </svg>`,\n  cog: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9.594 3.94c.09-.542.56-.94 1.11-.94h2.593c.55 0 1.02.398 1.11.94l.213 1.281c.063.374.313.686.645.87.074.04.147.083.22.127.324.196.72.257 1.075.124l1.217-.456a1.125 1.125 0 011.37.49l1.296 2.247a1.125 1.125 0 01-.26 1.431l-1.003.827c-.293.24-.438.613-.431.992a6.759 6.759 0 010 .255c-.007.378.138.75.43.99l1.005.828c.424.35.534.954.26 1.43l-1.298 2.247a1.125 1.125 0 01-1.369.491l-1.217-.456c-.355-.133-.75-.072-1.076.124a6.57 6.57 0 01-.22.128c-.331.183-.581.495-.644.869l-.213 1.28c-.09.543-.56.941-1.11.941h-2.594c-.55 0-1.02-.398-1.11-.94l-.213-1.281c-.062-.374-.312-.686-.644-.87a6.52 6.52 0 01-.22-.127c-.325-.196-.72-.257-1.076-.124l-1.217.456a1.125 1.125 0 01-1.369-.49l-1.297-2.247a1.125 1.125 0 01.26-1.431l1.004-.827c.292-.24.437-.613.43-.992a6.932 6.932 0 010-.255c.007-.378-.138-.75-.43-.99l-1.004-.828a1.125 1.125 0 01-.26-1.43l1.297-2.247a1.125 1.125 0 011.37-.491l1.216.456c.356.133.751.072 1.076-.124.072-.044.146-.087.22-.128.332-.183.582-.495.644-.869l.214-1.281z\" /> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" /> </svg>`,\n  settingsH: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M10.5 6h9.75M10.5 6a1.5 1.5 0 11-3 0m3 0a1.5 1.5 0 10-3 0M3.75 6H7.5m3 12h9.75m-9.75 0a1.5 1.5 0 01-3 0m3 0a1.5 1.5 0 00-3 0m-3.75 0H7.5m9-6h3.75m-3.75 0a1.5 1.5 0 01-3 0m3 0a1.5 1.5 0 00-3 0m-9.75 0h9.75\" /> </svg>`,\n  settingsV: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6 13.5V3.75m0 9.75a1.5 1.5 0 010 3m0-3a1.5 1.5 0 000 3m0 3.75V16.5m12-3V3.75m0 9.75a1.5 1.5 0 010 3m0-3a1.5 1.5 0 000 3m0 3.75V16.5m-6-9V3.75m0 3.75a1.5 1.5 0 010 3m0-3a1.5 1.5 0 000 3m0 9.75V10.5\" /> </svg>`,\n  scan: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M7.5 3.75H6A2.25 2.25 0 003.75 6v1.5M16.5 3.75H18A2.25 2.25 0 0120.25 6v1.5m0 9V18A2.25 2.25 0 0118 20.25h-1.5m-9 0H6A2.25 2.25 0 013.75 18v-1.5M15 12a3 3 0 11-6 0 3 3 0 016 0z\" /> </svg> `,\n  desktop: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 17.25v1.007a3 3 0 01-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0115 18.257V17.25m6-12V15a2.25 2.25 0 01-2.25 2.25H5.25A2.25 2.25 0 013 15V5.25m18 0A2.25 2.25 0 0018.75 3H5.25A2.25 2.25 0 003 5.25m18 0V12a2.25 2.25 0 01-2.25 2.25H5.25A2.25 2.25 0 013 12V5.25\" /> </svg>`,\n  alert: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0M3.124 7.5A8.969 8.969 0 015.292 3m13.416 0a8.969 8.969 0 012.168 4.5\" /> </svg>`,\n  bell: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0M3.124 7.5A8.969 8.969 0 015.292 3m13.416 0a8.969 8.969 0 012.168 4.5\" /> </svg>`,\n  refresh: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99\" /> </svg> `,\n  bars4: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.75 5.25h16.5m-16.5 4.5h16.5m-16.5 4.5h16.5m-16.5 4.5h16.5\" /> </svg>`,\n  bars3: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.75 6.75h16.5M3.75 12h16.5m-16.5 5.25h16.5\" /> </svg>`,\n  logout: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12.75 15l3-3m0 0l-3-3m3 3h-7.5M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" /> </svg>`,\n  save: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 3.75V16.5L12 14.25 7.5 16.5V3.75m9 0H18A2.25 2.25 0 0120.25 6v12A2.25 2.25 0 0118 20.25H6A2.25 2.25 0 013.75 18V6A2.25 2.25 0 016 3.75h1.5m9 0h-9\" /> </svg>`,\n  email: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M21.75 6.75v10.5a2.25 2.25 0 01-2.25 2.25h-15a2.25 2.25 0 01-2.25-2.25V6.75m19.5 0A2.25 2.25 0 0019.5 4.5h-15a2.25 2.25 0 00-2.25 2.25m19.5 0v.243a2.25 2.25 0 01-1.07 1.916l-7.5 4.615a2.25 2.25 0 01-2.36 0L3.32 8.91a2.25 2.25 0 01-1.07-1.916V6.75\" /> </svg>`,\n  expand: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.75 3.75v4.5m0-4.5h4.5m-4.5 0L9 9M3.75 20.25v-4.5m0 4.5h4.5m-4.5 0L9 15M20.25 3.75h-4.5m4.5 0v4.5m0-4.5L15 9m5.25 11.25h-4.5m4.5 0v-4.5m0 4.5L15 15\" /> </svg>`,\n  shrink: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 9V4.5M9 9H4.5M9 9L3.75 3.75M9 15v4.5M9 15H4.5M9 15l-5.25 5.25M15 9h4.5M15 9V4.5M15 9l5.25-5.25M15 15h4.5M15 15v4.5m0-4.5l5.25 5.25\" /> </svg>`,\n  ok: props => html`<svg class=${props.class} fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\" aria-hidden=\"true\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" /> </svg>`,\n  fail: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9.75 9.75l4.5 4.5m0-4.5l-4.5 4.5M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" /> </svg>`,\n  upload: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5m-13.5-9L12 3m0 0l4.5 4.5M12 3v13.5\" /> </svg> `,\n  download: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" /> </svg> `,\n  bolt: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3.75 13.5l10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75z\" /> </svg>`,\n  home: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M2.25 12l8.954-8.955c.44-.439 1.152-.439 1.591 0L21.75 12M4.5 9.75v10.125c0 .621.504 1.125 1.125 1.125H9.75v-4.875c0-.621.504-1.125 1.125-1.125h2.25c.621 0 1.125.504 1.125 1.125V21h4.125c.621 0 1.125-.504 1.125-1.125V9.75M8.25 21h8.25\" /> </svg> `,\n  link: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M13.19 8.688a4.5 4.5 0 011.242 7.244l-4.5 4.5a4.5 4.5 0 01-6.364-6.364l1.757-1.757m13.35-.622l1.757-1.757a4.5 4.5 0 00-6.364-6.364l-4.5 4.5a4.5 4.5 0 001.242 7.244\" /> </svg> `,\n  shield: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 12.75L11.25 15 15 9.75m-3-7.036A11.959 11.959 0 013.598 6 11.99 11.99 0 003 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285z\" /> </svg> `,\n  barsdown: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M3 4.5h14.25M3 9h9.75M3 13.5h9.75m4.5-4.5v12m0 0l-3.75-3.75M17.25 21L21 17.25\" /> </svg> `,\n  arrowdown: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 4.5v15m0 0l6.75-6.75M12 19.5l-6.75-6.75\" /> </svg> `,\n  arrowup: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 19.5v-15m0 0l-6.75 6.75M12 4.5l6.75 6.75\" /> </svg>`,\n  warn: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" /> </svg>`,\n  info: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z\" /> </svg>`,\n  exclamationTriangle: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z\" /> </svg>`,\n  thumbUp: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6.633 10.5c.806 0 1.533-.446 2.031-1.08a9.041 9.041 0 012.861-2.4c.723-.384 1.35-.956 1.653-1.715a4.498 4.498 0 00.322-1.672V3a.75.75 0 01.75-.75A2.25 2.25 0 0116.5 4.5c0 1.152-.26 2.243-.723 3.218-.266.558.107 1.282.725 1.282h3.126c1.026 0 1.945.694 2.054 1.715.045.422.068.85.068 1.285a11.95 11.95 0 01-2.649 7.521c-.388.482-.987.729-1.605.729H13.48c-.483 0-.964-.078-1.423-.23l-3.114-1.04a4.501 4.501 0 00-1.423-.23H5.904M14.25 9h2.25M5.904 18.75c.083.205.173.405.27.602.197.4-.078.898-.523.898h-.908c-.889 0-1.713-.518-1.972-1.368a12 12 0 01-.521-3.507c0-1.553.295-3.036.831-4.398C3.387 10.203 4.167 9.75 5 9.75h1.053c.472 0 .745.556.5.96a8.958 8.958 0 00-1.302 4.665c0 1.194.232 2.333.654 3.375z\" /> </svg>`,\n  backward: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M21 16.811c0 .864-.933 1.405-1.683.977l-7.108-4.062a1.125 1.125 0 010-1.953l7.108-4.062A1.125 1.125 0 0121 8.688v8.123zM11.25 16.811c0 .864-.933 1.405-1.683.977l-7.108-4.062a1.125 1.125 0 010-1.953L9.567 7.71a1.125 1.125 0 011.683.977v8.123z\" /> </svg>`,\n  chip: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M8.25 3v1.5M4.5 8.25H3m18 0h-1.5M4.5 12H3m18 0h-1.5m-15 3.75H3m18 0h-1.5M8.25 19.5V21M12 3v1.5m0 15V21m3.75-18v1.5m0 15V21m-9-1.5h10.5a2.25 2.25 0 002.25-2.25V6.75a2.25 2.25 0 00-2.25-2.25H6.75A2.25 2.25 0 004.5 6.75v10.5a2.25 2.25 0 002.25 2.25zm.75-12h9v9h-9v-9z\" /> </svg>`,\n  camera: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6.827 6.175A2.31 2.31 0 015.186 7.23c-.38.054-.757.112-1.134.175C2.999 7.58 2.25 8.507 2.25 9.574V18a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9.574c0-1.067-.75-1.994-1.802-2.169a47.865 47.865 0 00-1.134-.175 2.31 2.31 0 01-1.64-1.055l-.822-1.316a2.192 2.192 0 00-1.736-1.039 48.774 48.774 0 00-5.232 0 2.192 2.192 0 00-1.736 1.039l-.821 1.316z\" /> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M16.5 12.75a4.5 4.5 0 11-9 0 4.5 4.5 0 019 0zM18.75 10.5h.008v.008h-.008V10.5z\" /> </svg>`,\n  arrows: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M7.5 21L3 16.5m0 0L7.5 12M3 16.5h13.5m0-13.5L21 7.5m0 0L16.5 12M21 7.5H7.5\" /> </svg>`,\n  doc: props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"currentColor\"> <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\" /></svg>`,\n};\n\nexport const tipColors = {\n  green: 'bg-green-100 text-green-900 ring-green-300',\n  yellow: 'bg-yellow-100 text-yellow-900 ring-yellow-300',\n  red: 'bg-red-100 text-red-900 ring-red-300',\n};\n\nexport function Button({title, onclick, disabled, cls, icon, ref, colors, hovercolor, disabledcolor}) {\n  const [spin, setSpin] = useState(false);\n  const cb = function(ev) {\n    const res = onclick ? onclick() : null;\n    if (res && typeof (res.catch) === 'function') {\n      setSpin(true);\n      res.catch(() => false).then(() => setSpin(false));\n    }\n  };\n  if (!colors) colors = 'bg-blue-600 hover:bg-blue-500 disabled:bg-blue-400';\n  return html`\n<button type=\"button\" class=\"inline-flex justify-center items-center gap-2 rounded px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm ${colors} ${cls}\"\n  ref=${ref} onclick=${cb} disabled=${disabled || spin} >\n  ${title}\n  <${spin ? Icons.refresh : icon} class=\"w-4 ${spin ? 'animate-spin' : ''}\" />\n<//>`\n};\n\nexport function Notification({ok, text, close}) {\n  const closebtn = useRef(null);\n  const from = 'translate-y-2 opacity-0 sm:translate-y-0 sm:translate-x-2';\n  const to = 'translate-y-0 opacity-100 sm:translate-x-0';\n  const [tr, setTr] = useState(from);\n  useEffect(function() {\n    setTr(to); \n    setTimeout(ev => closebtn && closebtn.current.click && closebtn.current.click(), 1500);\n  }, []);\n  const onclose = ev => { setTr(from); setTimeout(close, 300); };\n  return html`\n<div aria-live=\"assertive\" class=\"z-10 pointer-events-none absolute inset-0 flex items-end px-4 py-6 sm:items-start sm:p-6\">\n  <div class=\"flex w-full flex-col items-center space-y-4 sm:items-end\">\n    <div class=\"pointer-events-auto w-full max-w-sm overflow-hidden rounded-lg bg-white shadow-lg ring-1 ring-black ring-opacity-5 transform ease-out duration-300 transition ${tr}\">\n      <div class=\"p-4\">\n        <div class=\"flex items-start\">\n          <div class=\"flex-shrink-0\">\n            <${ok ? Icons.ok : Icons.fail} class=\"h-6 w-6 ${ok ? 'text-green-400' : 'text-red-400'}\" />\n          <//>\n          <div class=\"ml-3 w-0 flex-1 pt-0.5\">\n            <p class=\"text-sm font-medium text-gray-900\">${text}</p>\n            <p class=\"hidden mt-1 text-sm text-gray-500\">Anyone with a link can now view this file.</p>\n          <//>\n          <div class=\"ml-4 flex flex-shrink-0\">\n            <button type=\"button\" ref=${closebtn} onclick=${onclose} class=\"inline-flex rounded-md bg-white text-gray-400 hover:text-gray-500 focus:outline-none\">\n              <span class=\"sr-only\">Close</span>\n              <svg class=\"h-5 w-5\" viewBox=\"0 0 20 20\" fill=\"currentColor\" aria-hidden=\"true\">\n                <path d=\"M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z\" />\n              <//>\n            <//>\n          <//>\n        <//>\n      <//>\n    <//>\n  <//>\n<//>`;\n};\n\nexport function Login({loginFn, logoIcon, title, tipText}) {\n  const [user, setUser] = useState('');\n  const [pass, setPass] = useState('');\n  const onsubmit = function(ev) {\n    const authhdr = 'Basic ' + btoa(user + ':' + pass);\n    const headers = {Authorization: authhdr};\n    return fetch('api/login', {headers}).then(loginFn).finally(r => setPass(''));\n  };\n  return html`\n<div class=\"h-full flex items-center justify-center bg-slate-200\">\n  <div class=\"border rounded bg-white w-96 p-5\">\n    <div class=\"my-5 py-2 flex items-center justify-center gap-x-4\">\n      <${logoIcon} class=\"h-12 stroke-cyan-600 stroke-1\" />\n      <h1 class=\"font-bold text-xl\">${title || 'Login'}<//>\n    <//>\n    <div class=\"my-3\">\n      <label class=\"block text-sm mb-1 dark:text-white\">Username</label>\n      <input type=\"text\" autocomplete=\"current-user\" required\n        class=\"font-normal bg-white rounded border border-gray-300 w-full \n        flex-1 py-0.5 px-2 text-gray-900 placeholder:text-gray-400\n        focus:outline-none sm:text-sm sm:leading-6 disabled:cursor-not-allowed\n        disabled:bg-gray-100 disabled:text-gray-500\"\n        oninput=${ev => setUser(ev.target.value)} value=${user}  />\n    <//>\n    <div class=\"my-3\">\n      <label class=\"block text-sm mb-1 dark:text-white\">Password</label>\n      <input type=\"password\" autocomplete=\"current-password\" required\n        class=\"font-normal bg-white rounded border border-gray-300 w-full flex-1 py-0.5 px-2 text-gray-900 placeholder:text-gray-400 focus:outline-none sm:text-sm sm:leading-6 disabled:cursor-not-allowed disabled:bg-gray-100 disabled:text-gray-500\"\n        oninput=${ev => setPass(ev.target.value)}\n        value=${pass} onchange=${onsubmit} />\n    <//>\n    <div class=\"mt-7\">\n      <${Button} title=\"Sign In\" icon=${Icons.logout} onclick=${onsubmit} cls=\"flex w-full justify-center\" />\n    <//>\n    <div class=\"mt-5 text-slate-400 text-xs\">${tipText}<//>\n  <//>\n<//>`;\n};\n\nexport function Colored({icon, text, colors}) {\n  colors ||= 'bg-slate-100 text-slate-900';\n  return html`\n<span class=\"inline-flex items-center gap-1.5 py-0.5\">\n  ${icon && html`<${icon} class=\"w-5 h-5\" />`}\n  <span class=\"inline-block font-medium rounded-md px-2 py-1 text-xs ring-1 ring-inset ${colors}\">${text}<//>\n<//>`;\n};\n\nexport function Stat({title, text, tipText, tipIcon, tipColors, colors}) {\n  return html`\n<div class=\"flex flex-col bg-white border shadow-sm rounded-xl dark:bg-slate-900 dark:border-gray-800\">\n  <div class=\"overflow-auto rounded-lg bg-white px-4 py-2 \">\n    <div class=\"flex items-center gap-x-2\">\n      <p class=\"text-sm truncate text-gray-500 font-medium\"> ${title} </p>\n    <//>\n    <div class=\"mt-1 flex items-center gap-x-2\">\n      <h3 class=\"text-xl truncate font-semibold tracking-tight ${colors || 'text-gray-800 dark:text-gray-200'}\">\n        ${text}\n      <//>\n      <span class=\"flex items-center ${tipText || 'hidden'}\">\n        <${Colored} text=${tipText} icon=${tipIcon} colors=${tipColors} />\n      <//>\n    <//>\n  <//>\n<//>`;\n};\n\nexport function TextValue({value, setfn, disabled, placeholder, type, addonRight, addonLeft, attr, min, max, step, mult}) {\n  const [bg, setBg] = useState('bg-white');\n  useEffect(() => { if (type == 'number') checkval(+min, +max, +value); }, []);\n  step ||= '1', mult ||= 1;\n  const checkval = function(min, max, v) {\n    setBg('bg-white');\n    if (min && v < min) setBg('bg-red-100 border-red-200');\n    if (max && v > max) setBg('bg-red-100 border-red-200');\n  };\n  const m = step.match(/^.+\\.(.+)/);\n  const digits = m ? m[1].length : 0;\n  const onchange = ev => {\n    let v = ev.target.value;\n    if (type == 'number') {\n      checkval(+min, +max, +v);\n      v = +(parseFloat(v) / mult).toFixed(digits);\n    }\n    setfn(v);\n  };\n  if (type == 'number') value = +(value * mult).toFixed(digits);\n  return html`\n<div class=\"flex w-full items-center rounded border shadow-sm ${bg}\">\n  ${addonLeft && html`<span class=\"inline-flex font-normal truncate py-1 border-r bg-slate-100 items-center border-gray-300 px-2 text-gray-500 text-xs\">${addonLeft}<//>` }\n  <input type=${type || 'text'} disabled=${disabled} value=${value}\n    step=${step} min=${min} max=${max} \n    onchange=${onchange} ...${attr}\n    class=\"${bg} font-normal text-sm rounded w-full flex-1 py-0.5 px-2 text-gray-700 placeholder:text-gray-400 focus:outline-none disabled:cursor-not-allowed disabled:bg-gray-100 disabled:text-gray-500\" placeholder=${placeholder} />\n  ${addonRight && html`<span class=\"inline-flex font-normal truncate py-1 border-l bg-slate-100 items-center border-gray-300 px-2 text-gray-500 text-xs overflow-scroll\" style=\"min-width: 50%;\">${addonRight}<//>` }\n<//>`;\n};\n\nexport function SelectValue({value, setfn, options, disabled}) {\n  const toInt = x => x == parseInt(x) ? parseInt(x) : x;\n  const onchange = ev => setfn(toInt(ev.target.value));\n  return html`\n<select onchange=${onchange} class=\"w-full rounded font-normal border py-0.5 px-1 text-gray-600 focus:outline-none text-sm disabled:cursor-not-allowed\" disabled=${disabled}>\n  ${options.map(v => html`<option value=${v[0]} selected=${v[0] == value}>${v[1]}<//>`) }\n<//>`;\n};\n\nexport function SwitchValue({value, setfn}) {\n  const onclick = ev => setfn(!value);\n  const bg = !!value ? 'bg-blue-600' : 'bg-gray-200';\n  const tr = !!value ? 'translate-x-5' : 'translate-x-0';\n  return html`\n<button type=\"button\" onclick=${onclick} class=\"${bg} inline-flex h-6 w-11 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none focus:ring-0 ring-0\" role=\"switch\" aria-checked=${!!value}>\n  <span aria-hidden=\"true\" class=\"${tr} pointer-events-none inline-block h-5 w-5 transform rounded-full bg-white shadow ring-0 focus:ring-0 transition duration-200 ease-in-out\"></span>\n</button>`;\n};\n\nexport function Setting(props) {\n  let input = TextValue;\n  if (props.type == 'switch') input = SwitchValue;\n  if (props.type == 'select') input = SelectValue;\n  return html`\n<div class=${props.cls || 'grid grid-cols-2 gap-2 my-1'}>\n  <label class=\"flex items-center text-sm text-gray-700 mr-2 font-medium ${props.title || 'hidden'}\">${props.title}<//>\n  <div class=\"flex items-center\">${h(input, props)}<//>\n<//>`;\n};\n\nexport function Pagination({ totalItems, itemsPerPage, currentPage, setPageFn, colors }) {\n  const totalPages = Math.ceil(totalItems / itemsPerPage);\n  const maxPageRange = 2;\n  const lessThanSymbol = \"<\";\n  const greaterThanSymbol = \">\";\n  const whiteSpace = \" \";\n  const itemcls = 'relative inline-flex items-center px-3 py-1 text-sm focus:z-20 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-0 focus-visible:outline-blue-600';\n  colors ||= 'bg-blue-600';\n\n  const PageItem = ({ page, isActive }) => (\n    html`<a\n      onClick=${() => setPageFn(page)}\n      class=\"${itemcls} ${isActive ? `${colors} text-white` : 'cursor-pointer text-gray-700 ring-1 ring-inset ring-gray-300 hover:bg-gray-50'}\"\n    >\n      ${page}\n    </a>`\n  );\n\n  return html`\n    <div class=\"flex items-center justify-between bg-white px-3 py-2\">\n      <div class=\"sm:flex sm:flex-1 sm:items-center sm:justify-between space-x-4 whitespace-nowrap select-none\">\n          <p class=\"text-sm text-slate-500 font-medium\">\n            showing <span class=\"font-bold text-slate-700\">${(currentPage - 1) * itemsPerPage + 1}</span> - <span class=\"font-medium\">${Math.min(currentPage * itemsPerPage, totalItems)}</span> of ${whiteSpace}\n            <span class=\"font-bold text-slate-700\">${totalItems}</span> results\n          </p>\n        <div>\n          <nav class=\"isolate inline-flex -space-x-px rounded-md\" aria-label=\"Pagination\">\n            <a\n              onClick=${() => setPageFn(Math.max(currentPage - 1, 1))}\n              class=\"relative inline-flex px-3 items-center text-gray-400 ring-1 ring-inset ring-gray-300 hover:bg-gray-50 ${currentPage != 1 ? 'cursor-pointer' : ''} focus:z-20 focus:outline-offset-0\">\n              ${lessThanSymbol}\n            </a>\n\n            <${PageItem} page=${1} isActive=${currentPage === 1} />\n            ${currentPage > maxPageRange + 2 ? html`<span class=\"${itemcls} ring-1 ring-inset ring-gray-300 text-slate-300\">...</span>` : ''}\n            ${Array.from({length: Math.min(totalPages, maxPageRange * 2 + 1)}, (_, i) => Math.max(2, currentPage - maxPageRange) + i).map(page => page > 1 && page < totalPages && html`<${PageItem} page=${page} isActive=${currentPage === page} />`)}\n            ${currentPage < totalPages - (maxPageRange + 1) ? html`<span class=\"${itemcls} ring-1 ring-inset ring-gray-300 text-slate-300\">...</span>` : ''}\n            ${totalPages > 1 ? html`<${PageItem} page=${totalPages} isActive=${currentPage === totalPages} />` : ''}\n\n            <a\n              onClick=${() => setPageFn(Math.min(currentPage + 1, totalPages))}\n              class=\"relative inline-flex px-3 items-center text-gray-400 ring-1 ring-inset ring-gray-300 hover:bg-gray-50 ${currentPage != totalPages ? 'cursor-pointer' : ''} focus:z-20 focus:outline-offset-0\">\n              ${greaterThanSymbol}\n            </a>\n          </nav>\n        </div>\n      </div>\n    </div>`;\n};\n\nexport function UploadFileButton(props) {\n  const [upload, setUpload] = useState(null);  // Upload promise\n  const [status, setStatus] = useState('');    // Current upload status\n  const btn = useRef(null);\n  const input = useRef(null);\n\n  // Send a large file chunk by chunk\n  const sendFileData = function(url, fileName, fileData, chunkSize) {\n    return new Promise(function(resolve, reject) {\n      const finish = ok => {\n        setUpload(null);\n        const res = props.onupload ? props.onupload(ok, fileName, fileData.length) : null;\n        if (res && typeof (res.catch) === 'function') {\n          res.catch(() => false).then(() => ok ? resolve() : reject());\n        } else {\n          ok ? resolve() : reject();\n        }\n      };\n      const sendChunk = function(offset) {\n        var chunk = fileData.subarray(offset, offset + chunkSize) || '';\n        var opts = {method: 'POST', body: chunk};\n        var fullUrl = url + '?offset=' + offset +\n          '&total=' + fileData.length  +\n          '&name=' + encodeURIComponent(fileName);\n        var ok;\n        setStatus('Uploading ' + fileName + ', bytes ' + offset + '..' +\n          (offset + chunk.length) + ' of ' + fileData.length);\n        fetch(fullUrl, opts)\n          .then(function(res) {\n            if (res.ok && chunk.length > 0) sendChunk(offset + chunk.length);\n            ok = res.ok;\n            return res.text();\n          })\n          .then(function(text) {\n            if (!ok) setStatus('Error: ' + text), finish(ok); // Fail\n            if (chunk.length > 0) return; // More chunks to send\n            setStatus(x => x + '. Done, resetting device...');\n            finish(ok); // All chunks sent\n          });\n      };\n      sendChunk(0);\n    });\n  };\n\n  const onchange = function(ev) {\n    if (!ev.target.files[0]) return;\n    let r = new FileReader(), f = ev.target.files[0];\n    r.readAsArrayBuffer(f);\n    r.onload = function() {\n      setUpload(sendFileData(props.url, f.name, new Uint8Array(r.result), 2048));\n      ev.target.value = '';\n      ev.preventDefault();\n      btn && btn.current.base.click();\n    };\n  };\n\n  const onclick = function(ev) {\n    let fn; setUpload(x => fn = x);\n    if (!fn) input.current.click();  // No upload in progress, show file dialog\n    return fn;\n  };\n\n  return html`\n<div class=\"inline-flex flex-col ${props.class}\">\n  <input class=\"hidden\" type=\"file\" ref=${input} onchange=${onchange} accept=${props.accept} />\n  <${Button} title=${props.title} icon=${Icons.download} onclick=${onclick} ref=${btn} colors=${props.colors} />\n  <div class=\"pt-2 text-sm text-slate-400 ${status || 'hidden'}\">${status}<//>\n<//>`;\n};\n"
  },
  {
    "path": "tutorials/http/device-dashboard/web_root/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" class=\"h-full bg-white\">\n  <head>\n    <title></title>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='currentColor'> <path stroke-linecap='round' stroke-linejoin='round' d='M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0' /> </svg>\" />\n    <link href=\"https://rsms.me/inter/inter.css\" rel=\"stylesheet\" />\n  </head>\n  <body class=\"h-full\"></body>\n  <script src=\"https://cdn.tailwindcss.com\"></script>\n  <script src=\"history.min.js\"></script>\n  <script type=\"module\" src=\"main.js\"></script>\n</html>\n"
  },
  {
    "path": "tutorials/http/device-dashboard/web_root/main.js",
    "content": "//  NOTE: API calls must start with 'api/' in order to serve the app at any URI\n\n'use strict';\nimport { h, render, useState, useEffect, useRef, html, Router } from  './bundle.js';\nimport { Icons, Login, Setting, Button, Stat, tipColors, Colored, Notification, Pagination, UploadFileButton } from './components.js';\n\nconst Logo = props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 12.87 12.85\"><defs><style>.ll-cls-1{fill:none;stroke:#000;stroke-miterlimit:10;stroke-width:0.5px;}</style></defs><g id=\"Layer_2\" data-name=\"Layer 2\"><g id=\"Layer_1-2\" data-name=\"Layer 1\"><path class=\"ll-cls-1\" d=\"M12.62,1.82V8.91A1.58,1.58,0,0,1,11,10.48H4a1.44,1.44,0,0,1-1-.37A.69.69,0,0,1,2.84,10l-.1-.12a.81.81,0,0,1-.15-.48V5.57a.87.87,0,0,1,.86-.86H4.73V7.28a.86.86,0,0,0,.86.85H9.42a.85.85,0,0,0,.85-.85V3.45A.86.86,0,0,0,10.13,3,.76.76,0,0,0,10,2.84a.29.29,0,0,0-.12-.1,1.49,1.49,0,0,0-1-.37H2.39V1.82A1.57,1.57,0,0,1,4,.25H11A1.57,1.57,0,0,1,12.62,1.82Z\"/><path class=\"ll-cls-1\" d=\"M10.48,10.48V11A1.58,1.58,0,0,1,8.9,12.6H1.82A1.57,1.57,0,0,1,.25,11V3.94A1.57,1.57,0,0,1,1.82,2.37H8.9a1.49,1.49,0,0,1,1,.37l.12.1a.76.76,0,0,1,.11.14.86.86,0,0,1,.14.47V7.28a.85.85,0,0,1-.85.85H8.13V5.57a.86.86,0,0,0-.85-.86H3.45a.87.87,0,0,0-.86.86V9.4a.81.81,0,0,0,.15.48l.1.12a.69.69,0,0,0,.13.11,1.44,1.44,0,0,0,1,.37Z\"/></g></g></svg>`;\n\nfunction Header({logout, user, setShowSidebar, showSidebar}) {\n  return html`\n<div class=\"bg-white sticky top-0 z-[48] xw-full border-b py-2 ${showSidebar && 'pl-72'} transition-all duration-300 transform\">\n  <div class=\"px-2 w-full py-0 my-0 flex items-center\">\n    <button type=\"button\" onclick=${ev => setShowSidebar(v => !v)} class=\"text-slate-400\">\n      <${Icons.bars3} class=\"h-6\" />\n    <//>\n    <div class=\"flex flex-1 gap-x-4 self-stretch lg:gap-x-6\">\n      <div class=\"relative flex flex-1\"><//>\n      <div class=\"flex items-center gap-x-4 lg:gap-x-6\">\n        <span class=\"text-sm text-slate-400\">logged in as: ${user}<//>\n        <div class=\"hidden lg:block lg:h-4 lg:w-px lg:bg-gray-200\" aria-hidden=\"true\"><//>\n        <${Button} title=\"Logout\" icon=${Icons.logout} onclick=${logout} />\n      <//>\n    <//>\n  <//>\n<//>`;\n};\n\nfunction Sidebar({url, show}) {\n  const NavLink = ({title, icon, href, url}) => html`\n  <div>\n    <a href=\"#${href}\" class=\"${href == url ? 'bg-slate-50 text-blue-600 group' : 'text-gray-700 hover:text-blue-600 hover:bg-gray-50 group'} flex gap-x-3 rounded-md p-2 text-sm leading-6 font-semibold\">\n      <${icon} class=\"w-6 h-6\"/>\n      ${title}\n    <///>\n  <//>`;\n  return html`\n<div class=\"bg-violet-100 hs-overlay hs-overlay-open:translate-x-0\n            -translate-x-full transition-all duration-300 transform\n            fixed top-0 left-0 bottom-0 z-[60] w-72 bg-white border-r\n            border-gray-200 overflow-y-auto scrollbar-y\n            ${show && 'translate-x-0'} right-auto bottom-0\">\n  <div class=\"flex flex-col m-4 gap-y-6\">\n    <div class=\"flex h-10 shrink-0 items-center gap-x-4 font-bold text-xl text-slate-500\">\n      <${Logo} class=\"h-full\"/> Your Brand\n    <//>\n    <div class=\"flex flex-1 flex-col\">\n      <${NavLink} title=\"Dashboard\" icon=${Icons.home} href=\"/\" url=${url} />\n      <${NavLink} title=\"Settings\" icon=${Icons.cog} href=\"/settings\" url=${url} />\n      <${NavLink} title=\"Firmware Update\" icon=${Icons.download} href=\"/update\" url=${url} />\n      <${NavLink} title=\"Events\" icon=${Icons.alert} href=\"/events\" url=${url} />\n    <//>\n  <//>\n<//>`;\n};\n\nfunction Events({}) {\n  const [events, setEvents] = useState([]);\n  const [page, setPage] = useState(1);\n\n  const refresh = () =>\n    fetch('api/events/get', {\n        method: 'POST', body: JSON.stringify({page: page}),\n      }).then(r => r.json())\n        .then(r => setEvents(r));\n\n  useEffect(refresh, [page]);\n\n  useEffect(() => {\n    setPage(JSON.parse(localStorage.getItem('page')));\n      }, []);\n\n  useEffect(() => {\n    localStorage.setItem('page', page.toString());\n  }, [page]);\n\n  const Th = props => html`<th scope=\"col\" class=\"sticky top-0 z-10 border-b border-slate-300 bg-white bg-opacity-75 py-1.5 px-4 text-left text-sm font-semibold text-slate-900 backdrop-blur backdrop-filter\">${props.title}</th>`;\n  const Td = props => html`<td class=\"whitespace-nowrap border-b border-slate-200 py-2 px-4 pr-3 text-sm text-slate-900\">${props.text}</td>`;\n  const Prio = ({prio}) => {\n    const text = ['high', 'medium', 'low'][prio];\n    const colors = [tipColors.red, tipColors.yellow, tipColors.green][prio];\n    return html`<${Colored} colors=${colors} text=${text} />`;\n  };\n\n  const Event = ({e}) => html`\n<tr>\n  <${Td} text=${['power', 'hardware', 'tier3', 'tier4'][e.type]} />\n  <${Td} text=${html`<${Prio} prio=${e.prio}/>`} />\n  <${Td} text=${e.time ? (new Date(e.time * 1000)).toLocaleString() : '1970-01-01'} />\n  <${Td} text=${e.text} />\n<//>`;\n\nreturn html`\n<div class=\"m-4 divide-y divide-gray-200 overflow-auto rounded bg-white\">\n  <div class=\"font-semibold flex items-center text-gray-600 px-3 justify-between whitespace-nowrap\">\n    <div class=\"font-semibold flex items-center text-gray-600\">\n      <div class=\"mr-4\">EVENT LOG</div>\n    </div>\n    <${Pagination} currentPage=${page} setPageFn=${setPage} totalItems=400 itemsPerPage=20 />\n  <//>\n  <div class=\"inline-block min-w-full align-middle\" style=\"max-height: 82vh; overflow: auto;\">\n    <table class=\"min-w-full border-separate border-spacing-0\">\n      <thead>\n        <tr>\n          <${Th} title=\"Type\" />\n          <${Th} title=\"Prio\" />\n          <${Th} title=\"Time\" />\n          <${Th} title=\"Description\" />\n        </tr>\n      </thead>\n      <tbody>\n        ${(events.arr ? events.arr : []).map(e => h(Event, {e}))}\n      </tbody>\n    </table>\n  <//>\n<//>`;\n};\n\nfunction Chart({data}) {\n  const n = data.length /* entries */, w = 20 /* entry width */, ls = 15/* left space */;\n  const h = 100 /* graph height */, yticks = 5 /* Y axis ticks */, bs = 10 /* bottom space */;\n  const ymax = 25;\n  const yt = i => (h - bs) / yticks * (i + 1);\n  const bh = p => (h - bs) * p / 100; // Bar height\n  const by = p => (h - bs) - bh(p);\n  const range = (start, size, step) => Array.from({length: size}, (_, i) => i * (step || 1) + start);\n  // console.log(ds);\n  return html`\n<div class=\"my-4 divide-y divide-gray-200 overflow-auto rounded bg-white\">\n  <div class=\"font-light uppercase flex items-center text-gray-600 px-4 py-2\">\n  Temperature, last 24h\n  <//>\n  <div class=\"relative\">\n    <svg class=\"bg-yellow-x50 w-full p-4\" viewBox=\"0 0 ${n*w+ls} ${h}\">\n      ${range(0, yticks).map(i => html`\n        <line x1=0 y1=${yt(i)} x2=${ls+n*w} y2=${yt(i)} stroke-width=0.3 class=\"stroke-slate-300\" stroke-dasharray=\"1,1\" />\n        <text x=0 y=${yt(i)-2} class=\"text-[6px] fill-slate-400\">${ymax-ymax/yticks*(i+1)}<//>\n      `)}\n      ${range(0, n).map(x => html`\n        <rect x=${ls+x*w} y=${by(data[x]*100/ymax)} width=12 height=${bh(data[x]*100/ymax)} rx=2 class=\"fill-cyan-500\" />\n        <text x=${ls+x*w} y=100 class=\"text-[6px] fill-slate-400\">${x*2}:00<//>\n      `)}\n    <//>\n  <//>\n<//>`;\n};\n\nfunction DeveloperNote({text, children}) {\n  return html`\n<div class=\"flex p-4 gap-2\">\n  <div class=\"text-sm text-slate-500\">\n    <div class=\"flex items-center\">\n      <${Icons.info} class=\"self-start basis-[30px] grow-0 shrink-0 text-green-600 mr-2\" />\n      <div class=\"font-semibold\">Developer Note<//>\n    <//>\n    ${(text || '').split('.').map(v => html` <p class=\"my-2 \">${v}<//>`)}\n    ${children}\n  <//>\n<//>`;\n};\n\nfunction Main({}) {\n  const [stats, setStats] = useState(null);\n  const refresh = () => fetch('api/stats/get').then(r => r.json()).then(r => setStats(r));\n  useEffect(refresh, []);\n  if (!stats) return '';\n  return html`\n<div class=\"p-2\">\n  <div class=\"p-4 sm:p-2 mx-auto grid grid-cols-2 lg:grid-cols-4 gap-4\">\n    <${Stat} title=\"Temperature\" text=\"${stats.temperature} °C\" tipText=\"good\" tipIcon=${Icons.ok} tipColors=${tipColors.green} />\n    <${Stat} title=\"Humidity\" text=\"${stats.humidity} %\" tipText=\"warn\" tipIcon=${Icons.warn} tipColors=${tipColors.yellow} />\n    <div class=\"bg-white col-span-2 border rounded-md shadow-lg\" role=\"alert\">\n      <${DeveloperNote} text=\"Stats data is received from the Mongoose backend\" />\n    <//>\n  <//>\n  <div class=\"p-4 sm:p-2 mx-auto grid grid-cols-1 lg:grid-cols-2 gap-4\">\n\n    <${Chart} data=${stats.points} />\n\n    <div class=\"my-4 hx-24 bg-white border rounded-md shadow-lg\" role=\"alert\">\n      <${DeveloperNote}\n        text=\"This chart is an SVG image, generated on the fly from the\n        data returned by the api/stats/get API call\" />\n    <//>\n  <//>\n<//>`;\n};\n\nfunction FirmwareStatus({title, info, children}) {\n  const state = ['UNAVAILABLE', 'FIRST_BOOT', 'NOT_COMMITTED', 'COMMITTED'][(info.status || 0) % 4];\n  const valid = info.status > 0;\n  return html`\n<div class=\"bg-white py-1 divide-y border rounded\">\n  <div class=\"font-light uppercase flex items-center text-gray-600 px-4 py-2\">\n    ${title}\n  <//>\n  <div class=\"px-4 py-2 relative\">\n    <div class=\"my-1\">Status: ${state}<//>\n    <div class=\"my-1\">CRC32: ${valid ? info.crc32.toString(16) : 'n/a'}<//>\n    <div class=\"my-1\">Size: ${valid ? info.size : 'n/a'}<//>\n    <div class=\"my-1\">Flashed at: ${valid ? new Date(info.timestamp * 1000).toLocaleString() : 'n/a'}<//>\n    ${children}\n  <//>\n<//>`;\n};\n\n\nfunction FirmwareUpdate({}) {\n  const [info, setInfo] = useState([{}, {}]);\n  const refresh = () => fetch('api/firmware/status').then(r => r.json()).then(r => setInfo(r));\n  useEffect(refresh, []);\n  const oncommit = ev => fetch('api/firmware/commit')\n    .then(r => r.json())\n    .then(refresh);\n  const onreboot = ev => fetch('api/device/reset')\n    .then(r => r.json())\n    .then(r => new Promise(r => setTimeout(ev => { refresh(); r(); }, 3000)));\n  const onrollback = ev => fetch('api/firmware/rollback')\n    .then(onreboot);\n  const onerase = ev => fetch('api/device/eraselast').then(refresh);\n  const onupload = function(ok, name, size) {\n    if (!ok) return false;\n    return new Promise(r => setTimeout(ev => { refresh(); r(); }, 3000));\n  };\n  return html`\n<div class=\"m-4 gap-4 grid grid-cols-1 lg:grid-cols-3\">\n  <${FirmwareStatus} title=\"Current firmware image\" info=${info[0]}>\n    <div class=\"flex flex-wrap gap-2\">\n      <${Button} title=\"Commit this firmware\" onclick=${oncommit}\n        icon=${Icons.thumbUp} disabled=${info[0].status == 3} cls=\"w-full\" />\n    <//>\n  <//>\n  <${FirmwareStatus} title=\"Previous firmware image\" info=${info[1]}>\n    <${Button} title=\"Rollback to this firmware\" onclick=${onrollback}\n      icon=${Icons.backward} disabled=${info[1].status == 0} cls=\"w-full\" />\n  <//>\n  <div class=\"bg-white xm-4 divide-y border rounded flex flex-col\">\n    <div class=\"font-light uppercase flex items-center text-gray-600 px-4 py-2\">\n      Device control\n    <//>\n    <div class=\"px-4 py-3 flex flex-col gap-2 grow\">\n      <${UploadFileButton}\n        title=\"Upload new firmware .bin file\" onupload=${onupload}\n      url=\"api/firmware/upload\" accept=\".bin,.uf2\" />\n      <div class=\"grow\"><//>\n      <${Button} title=\"Reboot device\" onclick=${onreboot} icon=${Icons.refresh} cls=\"w-full\" />\n      <${Button} title=\"Erase last sector\" onclick=${onerase} icon=${Icons.doc} cls=\"w-full hidden\" />\n    <//>\n  <//>\n<//>\n\n\n<div class=\"m-4 gap-4 grid grid-cols-1 lg:grid-cols-2\">\n  <div class=\"bg-white border shadow-lg\">\n    <${DeveloperNote}>\n      <div class=\"my-2\">\n        Firmware status and other information is stored in the last sector\n        of flash\n      <//>\n      <div class=\"my-2\">\n        Firmware status can be FIRST_BOOT, UNCOMMITTED or COMMITTED. If no\n        information is available, it is UNAVAILABLE.\n      <//>\n      <div class=\"my-2\">  \n        This GUI loads a firmware file and sends it chunk by chunk to the\n        device, passing current chunk offset, total firmware size and a file name:\n        api/firmware/upload?offset=X&total=Y&name=Z\n      <//>\n    <//>\n  <//>\n\n  <div class=\"bg-white border shadow-lg\">\n    <${DeveloperNote}>\n      <div>\n        Firmware update mechanism defines 3 API functions that the target\n        device must implement: mg_ota_begin(), mg_ota_write() and mg_ota_end()\n      <//>\n      <div class=\"my-2\">  \n        RESTful API handlers use ota_xxx() API to save firmware to flash.\n        The last 0-length chunk triggers ota_end() which performs firmware\n        update using saved firmware image\n      <//>\n      <div class=\"my-2\">  \n        <a class=\"link text-blue-600 underline\" \n          href=\"https://mongoose.ws/webinars/\">Join our free webinar</a> to\n        get detailed explanations about possible firmware updates strategies\n        and implementation demo\n      <//>\n    <//>\n  <//>\n\n<//>`;\n};\n\nfunction Settings({}) {\n  const [settings, setSettings] = useState(null);\n  const [saveResult, setSaveResult] = useState(null);\n  const refresh = () => fetch('api/settings/get')\n    .then(r => r.json())\n    .then(r => setSettings(r));\n  useEffect(refresh, []);\n\n  const mksetfn = k => (v => setSettings(x => Object.assign({}, x, {[k]: v}))); \n  const onsave = ev => fetch('api/settings/set', {\n    method: 'post', body: JSON.stringify(settings) \n  }).then(r => r.json())\n    .then(r => setSaveResult(r))\n    .then(refresh);\n\n  if (!settings) return '';\n  const logOptions = [[0, 'Disable'], [1, 'Error'], [2, 'Info'], [3, 'Debug']];\n  return html`\n<div class=\"m-4 grid grid-cols-1 gap-4 md:grid-cols-2\">\n\n  <div class=\"py-1 divide-y border rounded bg-white flex flex-col\">\n    <div class=\"font-light uppercase flex items-center text-gray-600 px-4 py-2\">\n      Device Settings\n    <//>\n    <div class=\"py-2 px-5 flex-1 flex flex-col relative\">\n      ${saveResult && html`<${Notification} ok=${saveResult.status}\n        text=${saveResult.message} close=${() => setSaveResult(null)} />`}\n\n      <${Setting} title=\"Enable Logs\" value=${settings.log_enabled} setfn=${mksetfn('log_enabled')} type=\"switch\" />\n      <${Setting} title=\"Log Level\" value=${settings.log_level} setfn=${mksetfn('log_level')} type=\"select\" addonLeft=\"0-3\" disabled=${!settings.log_enabled} options=${logOptions}/>\n      <${Setting} title=\"Brightness\" value=${settings.brightness} setfn=${mksetfn('brightness')} type=\"number\" addonRight=\"%\" />\n      <${Setting} title=\"Device Name\" value=${settings.device_name} setfn=${mksetfn('device_name')} type=\"\" />\n      <div class=\"mb-1 mt-3 flex place-content-end\"><${Button} icon=${Icons.save} onclick=${onsave} title=\"Save Settings\" /><//>\n    <//>\n  <//>\n\n  <div class=\"bg-white border rounded-md text-ellipsis overflow-auto\" role=\"alert\">\n    <${DeveloperNote}\n        text=\"A variety of controls are pre-defined to ease the development:\n          toggle button, dropdown select, input field with left and right\n          addons. Device settings are received by calling\n          api/settings/get API call, which returns settings JSON object.\n          Clicking on the save button calls api/settings/set\n          API call\" />\n  <//>\n\n<//>`;\n};\n\nconst App = function({}) {\n  const [loading, setLoading] = useState(true);\n  const [url, setUrl] = useState('/');\n  const [user, setUser] = useState('');\n  const [showSidebar, setShowSidebar] = useState(true);\n\n  const logout = () => fetch('api/logout').then(r => setUser(''));\n  const login = r => !r.ok ? setLoading(false) && setUser(null) : r.json()\n      .then(r => setUser(r.user))\n      .finally(r => setLoading(false));\n\n  useEffect(() => fetch('api/login').then(login), []);\n\n  if (loading) return '';  // Show blank page on initial load\n  if (!user) return html`<${Login} loginFn=${login} logoIcon=${Logo}\n    title=\"Device Dashboard Login\" \n    tipText=\"To login, use: admin/admin, user1/user1, user2/user2\" />`; // If not logged in, show login screen\n\n  return html`\n<div class=\"min-h-screen bg-slate-100\">\n  <${Sidebar} url=${url} show=${showSidebar} />\n  <${Header} logout=${logout} user=${user} showSidebar=${showSidebar} setShowSidebar=${setShowSidebar} />\n  <div class=\"${showSidebar && 'pl-72'} transition-all duration-300 transform\">\n    <${Router} onChange=${ev => setUrl(ev.url)} history=${History.createHashHistory()} >\n      <${Main} default=${true} />\n      <${Settings} path=\"settings\" />\n      <${FirmwareUpdate} path=\"update\" />\n      <${Events} path=\"events\" />\n    <//>\n  <//>\n<//>`;\n};\n\nwindow.onload = () => render(h(App), document.body);\n"
  },
  {
    "path": "tutorials/http/file-transfer/Makefile",
    "content": "SPROG ?= server                   # Program we are building\nCPROG ?= client                   # Program we are building\nDELETE = rm -rf                   # Command to remove files\nSOUT ?= -o $(SPROG)               # Compiler argument for output file\nCOUT ?= -o $(CPROG)               # Compiler argument for output file\nSSOURCES = server.c mongoose.c    # Source code files\nCSOURCES = client.c mongoose.c    # Source code files\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\n#CFLAGS_MONGOOSE += -DMG_ENABLE_LINES\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  SPROG ?= server.exe             # Use .exe suffix for the binary\n  CPROG ?= client.exe             # Use .exe suffix for the binary\n  CC = gcc                        # Use MinGW gcc compiler\n  CFLAGS += -lws2_32              # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S    # Command prompt command to delete files\n  SOUT ?= -o $(SPROG)             # Build output\n  COUT ?= -o $(CPROG)             # Build output\nendif\n\nall: example                      # Default target. Build all and run server\n\t$(RUN) ./$(SPROG) $(SARGS)\n\nexample: $(SPROG) $(CPROG)            \n\n$(SPROG): $(SSOURCES)       # Build program from sources\n\t$(CC) $(SSOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(SOUT)\n\n$(CPROG): $(CSOURCES)       # Build program from sources\n\t$(CC) $(CSOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(COUT)\n\nclean:                      # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(SPROG) $(CPROG) *.o *.obj *.exe *.dSYM\n"
  },
  {
    "path": "tutorials/http/file-transfer/README.md",
    "content": "# File Transfer\n\nThis example contains minimal HTTP client and server.\n\nThe client uploads a file to the server in a single POST, shaping traffic to send small data chunks.\n\nThe server manually processes requests in order to be able to write as soon as data arrives, to avoid buffering a whole (possibly huge) file not fitting in RAM.\n\nUploads are authenticated using Basic Auth. Both client and server have a default user/pass and can be configured using the command line. Only authenticated users can upload a file.\n\nThe server can also accept regular uploads from any HTTP client, for example curl:\n\n```sh\n\tcurl -su user:pass  http://localhost:8090/upload/foo.txt --data-binary @Makefile\n```\n\n- Follow the [Build Tools](../tools/) tutorial to setup your development environment.\n- Start a terminal in this project directory; and build the example:\n\n  ```sh\n  cd mongoose/examples/file-transfer\n  make clean all\n  ```\n\n- Manually start the server, either in background (to reuse the same terminal window) or in foreground; in which case you'll need another terminal to run the client. The server will listen at all interfaces in port 8090\n\n  ```sh\n  ./server\n  6332b7 2 server.c:157:main              Mongoose version : v7.12\n  6332b7 2 server.c:158:main              Listening on     : http://0.0.0.0:8090\n  6332b7 2 server.c:159:main              Web root         : [/home/mongoose/examples/file-transfer/web_root]\n  6332b7 2 server.c:160:main              Uploading to     : [/home/mongoose/examples/file-transfer/upload]\n  ```\n\n- Manually run the client to send a file, default is to send it as \"foo.txt\" to the server in localhost at port 8090\n\n  ```sh\n  ./client -f Makefile\n  ok\n  ```\n\nDefault operation is to assume hardcoded username and password. Call both server and client with no arguments to see usage instructions\n\nSee detailed tutorials at\n\thttps://mongoose.ws/tutorials/file-uploads/\n\thttps://mongoose.ws/tutorials/http-server/\n\thttps://mongoose.ws/tutorials/http-client/\n"
  },
  {
    "path": "tutorials/http/file-transfer/client.c",
    "content": "// Copyright (c) 2021 Cesanta Software Limited\n// All rights reserved\n//\n// Example HTTP client. Connect to `s_url`, send request, wait for a response,\n// print the response and exit.\n// You can change `s_url` from the command line by executing: ./example YOUR_URL\n//\n// To enable SSL/TLS, , see https://mongoose.ws/tutorials/tls/#how-to-build\n\n#include \"mongoose.h\"\n\nstatic int s_debug_level = MG_LL_INFO;\nstatic const char *s_user = \"user\";\nstatic const char *s_pass = \"pass\";\nstatic const char *s_fname = NULL;\nstatic struct mg_fd *fd;  // file descriptor\nstatic size_t fsize;\nstatic const char *s_url = \"http://localhost:8090/upload/foo.txt\";\nstatic const uint64_t s_timeout_ms = 1500;  // Connect timeout in milliseconds\n\n// Print HTTP response and signal that we're done\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_OPEN) {\n    // Connection created. Store connect expiration time in c->data\n    *(uint64_t *) c->data = mg_millis() + s_timeout_ms;\n  } else if (ev == MG_EV_POLL) {\n    if (mg_millis() > *(uint64_t *) c->data &&\n        (c->is_connecting || c->is_resolving)) {\n      mg_error(c, \"Connect timeout\");\n    }\n  } else if (ev == MG_EV_CONNECT) {\n    // Connected to server. Extract host name from URL\n    struct mg_str host = mg_url_host(s_url);\n    // Send request\n    MG_DEBUG((\"Connected, send request\"));\n    mg_printf(c,\n              \"POST %s HTTP/1.0\\r\\n\"\n              \"Host: %.*s\\r\\n\"\n              \"Content-Type: octet-stream\\r\\n\"\n              \"Content-Length: %d\\r\\n\",\n              mg_url_uri(s_url), (int) host.len, host.buf, fsize);\n    mg_http_bauth(c, s_user, s_pass);  // Add Basic auth header\n    mg_printf(c, \"%s\", \"\\r\\n\");        // End HTTP headers\n  } else if (ev == MG_EV_WRITE && c->send.len < MG_IO_SIZE) {\n    uint8_t *buf = alloca(MG_IO_SIZE);\n    size_t len = MG_IO_SIZE - c->send.len;\n    len = fsize < len ? fsize : len;\n    fd->fs->rd(fd->fd, buf, len);\n    mg_send(c, buf, len);\n    fsize -= len;\n    MG_DEBUG((\"sent %u bytes\", len));\n  } else if (ev == MG_EV_HTTP_MSG) {\n    MG_DEBUG((\"MSG\"));\n    // Response is received. Print it\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    printf(\"%.*s\", (int) hm->body.len, hm->body.buf);\n    c->is_draining = 1;  // Tell mongoose to close this connection\n    mg_fs_close(fd);\n    *(bool *) c->fn_data = true;  // Tell event loop to stop\n  } else if (ev == MG_EV_ERROR) {\n    MG_DEBUG((\"ERROR\"));\n    mg_fs_close(fd);\n    *(bool *) c->fn_data = true;  // Error, tell event loop to stop\n  }\n}\n\nstatic void usage(const char *prog) {\n  fprintf(stderr,\n          \"File Transfer client based on Mongoose v.%s\\n\"\n          \"Usage: %s -f NAME OPTIONS\\n\"\n          \"  -u NAME   - user name, default: '%s'\\n\"\n          \"  -p PWD    - password, default: '%s'\\n\"\n          \"  -U URL    - Full server URL, including destination file name; \"\n          \"default: '%s'\\n\"\n          \"  -f NAME   - File to send\\n\"\n          \"  -v LEVEL  - debug level, from 0 to 4, default: %d\\n\",\n          MG_VERSION, prog, s_user, s_pass, s_url, s_debug_level);\n  exit(EXIT_FAILURE);\n}\n\nint main(int argc, char *argv[]) {\n  struct mg_mgr mgr;  // Event manager\n  bool done = false;  // Event handler flips it to true\n  time_t mtime;\n  int i;\n\n  // Parse command-line flags\n  for (i = 1; i < argc; i++) {\n    if (strcmp(argv[i], \"-f\") == 0) {\n      s_fname = argv[++i];\n    } else if (strcmp(argv[i], \"-u\") == 0) {\n      s_user = argv[++i];\n    } else if (strcmp(argv[i], \"-p\") == 0) {\n      s_pass = argv[++i];\n    } else if (strcmp(argv[i], \"-U\") == 0) {\n      s_url = argv[++i];\n    } else if (strcmp(argv[i], \"-v\") == 0) {\n      s_debug_level = atoi(argv[++i]);\n    } else {\n      usage(argv[0]);\n    }\n  }\n  if (s_fname == NULL) usage(argv[0]);\n  mg_fs_posix.st(s_fname, &fsize, &mtime);\n  if (fsize == 0 ||\n      (fd = mg_fs_open(&mg_fs_posix, s_fname, MG_FS_READ)) == NULL) {\n    MG_ERROR((\"open failed: %d\", errno));\n    exit(EXIT_FAILURE);\n  }\n\n  mg_log_set(s_debug_level);\n  mg_mgr_init(&mgr);                        // Initialise event manager\n  mg_http_connect(&mgr, s_url, fn, &done);  // Create client connection\n  while (!done) mg_mgr_poll(&mgr, 50);      // Event manager loops until 'done'\n  mg_mgr_free(&mgr);                        // Free resources\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/http/file-transfer/server.c",
    "content": "// Copyright (c) 2024 Cesanta Software Limited\n// All rights reserved\n\n#include <signal.h>\n#include \"mongoose.h\"\n\nstatic int s_debug_level = MG_LL_INFO;\nstatic int s_max_size = 10000;\nstatic const char *s_root_dir = \"web_root\";\nstatic const char *s_upld_dir = \"upload\";\nstatic const char *s_listening_address = \"http://0.0.0.0:8090\";\nstatic const char *s_user = \"user\";\nstatic const char *s_pass = \"pass\";\n\n// Handle interrupts, like Ctrl-C\nstatic int s_signo;\nstatic void signal_handler(int signo) {\n  s_signo = signo;\n}\n\nstatic bool authuser(struct mg_http_message *hm) {\n  char user[256], pass[256];\n  mg_http_creds(hm, user, sizeof(user), pass, sizeof(pass));\n  if (strcmp(user, s_user) == 0 && strcmp(pass, s_pass) == 0) return true;\n  return false;\n}\n\nstruct upload_state {\n  size_t expected;  // POST data length, bytes\n  size_t received;  // Already received bytes\n  void *fp;         // Opened uploaded file\n};\n\nstatic void handle_uploads(struct mg_connection *c, int ev, void *ev_data) {\n  struct upload_state *us = (struct upload_state *) c->data;\n  struct mg_fs *fs = &mg_fs_posix;\n\n  // Catch /upload requests early, without buffering whole body\n  // When we receive MG_EV_HTTP_HDRS event, that means we've received all\n  // HTTP headers but not necessarily full HTTP body\n  if (ev == MG_EV_HTTP_HDRS) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    if (mg_match(hm->uri, mg_str(\"/upload/#\"), NULL)) {\n      c->pfn = NULL;  // Silence HTTP protocol handler, we'll take over\n      if (!authuser(hm)) {\n        mg_http_reply(c, 403, \"\", \"Denied\\n\");\n        c->is_draining = 1;  // Tell mongoose to close this connection\n      } else if (hm->body.len > (size_t) s_max_size) {\n        mg_http_reply(c, 400, \"\", \"Too long\\n\");\n        c->is_draining = 1;           // Tell mongoose to close this connection\n      } else if (hm->uri.len == 8) {  // 8: /upload/\n        mg_http_reply(c, 400, \"\", \"Name required\\n\");\n        c->is_draining = 1;  // Tell mongoose to close this connection\n      } else if (strlen(s_upld_dir) + (hm->uri.len - 8) + 2 >\n                 MG_PATH_MAX) {  // 2: MG_DIRSEP + NUL\n        mg_http_reply(c, 400, \"\", \"Path is too long\\n\");\n        c->is_draining = 1;  // Tell mongoose to close this connection\n      } else {\n        char fpath[MG_PATH_MAX];\n        snprintf(fpath, MG_PATH_MAX, \"%s%c\", s_upld_dir, MG_DIRSEP);\n        strncat(fpath, hm->uri.buf + 8, hm->uri.len - 8);\n        if (!mg_path_is_sane(mg_str(fpath))) {\n          mg_http_reply(c, 400, \"\", \"Invalid path\\n\");\n          c->is_draining = 1;  // Tell mongoose to close this connection\n        } else {\n          struct mg_fd *fd;\n          MG_DEBUG((\"Got request\"));\n          fs->rm(fpath);  // Delete file if it exists\n          if ((fd = fs->op(fpath, MG_FS_WRITE)) == NULL) {\n            mg_http_reply(c, 400, \"\", \"open failed: %d\\n\", errno);\n            c->is_draining = 1;  // Tell mongoose to close this connection\n          } else {\n            us->fp = fd;\n            us->expected = hm->body.len;  // Store number of bytes we expect\n            mg_iobuf_del(&c->recv, 0, hm->head.len);  // Delete HTTP headers\n          }\n        }\n      }\n    }\n  }\n\n  // Catch uploaded file data for both MG_EV_READ and MG_EV_HTTP_HDRS\n  if (us->expected > 0 && c->recv.len > 0) {\n    us->received += c->recv.len;\n    MG_DEBUG((\"Got chunk: %lu bytes, %lu so far, %lu total\", c->recv.len,\n              us->received, us->expected));\n    if (us->fp) fs->wr(us->fp, c->recv.buf, c->recv.len);  // Write to file\n    c->recv.len = 0;  // Delete received data\n    if (us->received >= us->expected) {\n      // Uploaded everything. Send response back\n      MG_INFO((\"Uploaded %lu bytes\", us->received));\n      mg_http_reply(c, 200, NULL, \"%lu ok\\n\", us->received);\n      if (us->fp) fs->cl(us->fp);  // Close file\n      memset(us, 0, sizeof(*us));  // Cleanup upload state\n      c->is_draining = 1;          // Close connection when response gets sent\n    }\n  }\n}\n\nstatic void cb(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_READ || ev == MG_EV_HTTP_HDRS) {\n    handle_uploads(c, ev, ev_data);\n  } else if (ev == MG_EV_HTTP_MSG && c->pfn != NULL) {\n    // Non-upload requests, we serve normally\n    // NOTE: handle_uploads() may delete request and reset c->pfn\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    struct mg_http_serve_opts opts = {0};\n    opts.root_dir = s_root_dir;\n    mg_http_serve_dir(c, hm, &opts);\n  }\n}\n\nstatic void usage(const char *prog) {\n  fprintf(stderr,\n          \"File Transfer server based on Mongoose v.%s\\n\"\n          \"Usage: %s OPTIONS\\n\"\n          \"  -u NAME   - user name, default: '%s'\\n\"\n          \"  -p PWD    - password, default: '%s'\\n\"\n          \"  -d DIR    - directory to serve, default: '%s'\\n\"\n          \"  -D DIR    - directory to store uploads, default: '%s'\\n\"\n          \"  -s SIZE   - maximum allowed file size, default: '%d'\\n\"\n          \"  -l ADDR   - listening address, default: '%s'\\n\"\n          \"  -v LEVEL  - debug level, from 0 to 4, default: %d\\n\",\n          MG_VERSION, prog, s_user, s_pass, s_root_dir, s_upld_dir, s_max_size,\n          s_listening_address, s_debug_level);\n  exit(EXIT_FAILURE);\n}\n\nint main(int argc, char *argv[]) {\n  char spath[MG_PATH_MAX] = \".\";\n  char upath[MG_PATH_MAX] = \".\";\n  struct mg_mgr mgr;\n  int i;\n\n  // Parse command-line flags\n  for (i = 1; i < argc; i++) {\n    if (strcmp(argv[i], \"-d\") == 0) {\n      s_root_dir = argv[++i];\n    } else if (strcmp(argv[i], \"-D\") == 0) {\n      s_upld_dir = argv[++i];\n    } else if (strcmp(argv[i], \"-u\") == 0) {\n      s_user = argv[++i];\n    } else if (strcmp(argv[i], \"-p\") == 0) {\n      s_pass = argv[++i];\n    } else if (strcmp(argv[i], \"-l\") == 0) {\n      s_listening_address = argv[++i];\n    } else if (strcmp(argv[i], \"-v\") == 0) {\n      s_debug_level = atoi(argv[++i]);\n    } else if (strcmp(argv[i], \"-s\") == 0) {\n      s_max_size = atoi(argv[++i]);\n    } else {\n      usage(argv[0]);\n    }\n  }\n\n  // Root directory must not contain double dots. Make it absolute\n  // Do the conversion only if the root dir spec does not contain overrides\n  if (strchr(s_root_dir, ',') == NULL) {\n    realpath(s_root_dir, spath);\n    s_root_dir = spath;\n  }\n  if (strchr(s_upld_dir, ',') == NULL) {\n    realpath(s_upld_dir, upath);\n    s_upld_dir = upath;\n  }\n\n  // Initialise stuff\n  signal(SIGINT, signal_handler);\n  signal(SIGTERM, signal_handler);\n  mg_log_set(s_debug_level);\n  mg_mgr_init(&mgr);\n  if (mg_http_listen(&mgr, s_listening_address, cb, NULL) == NULL) {\n    MG_ERROR((\"Cannot listen on %s.\", s_listening_address));\n    exit(EXIT_FAILURE);\n  }\n\n  // Start infinite event loop\n  MG_INFO((\"Mongoose version : v%s\", MG_VERSION));\n  MG_INFO((\"Listening on     : %s\", s_listening_address));\n  MG_INFO((\"Web root         : [%s]\", s_root_dir));\n  MG_INFO((\"Uploading to     : [%s]\", s_upld_dir));\n  while (s_signo == 0) mg_mgr_poll(&mgr, 1000);\n  mg_mgr_free(&mgr);\n  MG_INFO((\"Exiting on signal %d\", s_signo));\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/http/file-transfer/upload/README.md",
    "content": ""
  },
  {
    "path": "tutorials/http/file-transfer/web_root/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>File Transfer</title>\n  </head>\n  <body>\n    <p style=\"font-size:100px\">&#128515;</p>\n  </body>\n</html>\n"
  },
  {
    "path": "tutorials/http/file-upload-html-form/Makefile",
    "content": "PROG ?= example                   # Program we are building\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c       # Source code files\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\n#CFLAGS_MONGOOSE += -DMG_ENABLE_LINES\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= example.exe           # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\nendif\n\nall: $(PROG)              # Default target. Build and run program\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)       # Build program from sources\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nclean:                    # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM\n"
  },
  {
    "path": "tutorials/http/file-upload-html-form/README.md",
    "content": "See detailed tutorial at https://mongoose.ws/tutorials/http/file-uploads/\n"
  },
  {
    "path": "tutorials/http/file-upload-html-form/main.c",
    "content": "// Copyright (c) 2021 Cesanta Software Limited\n// All rights reserved\n\n#include \"mongoose.h\"\n\n// HTTP request handler function. It implements the following endpoints:\n//   /upload - prints all submitted form elements\n//   all other URI - serves web_root/ directory\n//\n// /////////////////           IMPORTANT        //////////////////////////\n//\n// Mongoose has a limit on input buffer, which also limits maximum upload size.\n// It is controlled by the MG_MAX_RECV_SIZE constant, which is set by\n// default to (3 * 1024 * 1024), i.e. 3 megabytes.\n// Use -DMG_MAX_BUF_SIZE=NEW_LIMIT to override it.\n//\n// Also, consider changing -DMG_IO_SIZE=SOME_BIG_VALUE to increase IO buffer\n// increment when reading data.\nstatic void cb(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    MG_INFO((\"New request to: [%.*s], body size: %lu\", (int) hm->uri.len,\n             hm->uri.buf, (unsigned long) hm->body.len));\n    if (mg_match(hm->uri, mg_str(\"/upload\"), NULL)) {\n      struct mg_http_part part;\n      size_t ofs = 0;\n      while ((ofs = mg_http_next_multipart(hm->body, ofs, &part)) > 0) {\n        MG_INFO((\"Chunk name: [%.*s] filename: [%.*s] length: %lu bytes\",\n                 (int) part.name.len, part.name.buf, (int) part.filename.len,\n                 part.filename.buf, (unsigned long) part.body.len));\n      }\n      mg_http_reply(c, 200, \"\", \"Thank you!\");\n    } else {\n      struct mg_http_serve_opts opts = {.root_dir = \"web_root\"};\n      mg_http_serve_dir(c, ev_data, &opts);\n    }\n  }\n}\n\nint main(void) {\n  struct mg_mgr mgr;\n\n  mg_mgr_init(&mgr);\n  mg_log_set(MG_LL_DEBUG);  // Set log level\n  mg_http_listen(&mgr, \"http://localhost:8000\", cb, NULL);\n\n  for (;;) mg_mgr_poll(&mgr, 50);\n  mg_mgr_free(&mgr);\n\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/http/file-upload-html-form/web_root/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>example</title>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <style>\n      #container { margin-right: auto; margin-left: auto; max-width: 480px; }\n      #info { background: #e0f0f0; border-radius: .5em; padding: 2em;  }\n      #wrapper { margin-top: 1em; }\n      form * { margin: 0.2em 0; }\n    </style>\n  </head>\n  <body>\n    <div id=\"container\">\n      <div id=\"info\">\n        Mongoose always buffers a full HTTP message before invoking\n        MG_EV_HTTP_MSG event. Big POST request require of lot\n        of RAM to buffer everything. Therefore, standard form uploads\n        should be used only when Mongoose runs on a system with lots of RAM.\n        Otherwise, please see <code>file-updload</code> example, how\n        a big file could be uploaded to a device with little RAM.\n        <br/><br/>\n        In this example, a standard HTML form upload is used, which uses\n        <code>multipart-form-data</code> encoding with\n        several variables and file upload. On a server side, a\n        <code>mg_http_next_multipart()</code> API is used to iterate over\n        all submitted form elements and print their payload.\n      </div>\n      <div id=\"wrapper\">\n        <form action=\"/upload\" method=\"post\" enctype=\"multipart/form-data\">\n          <input type=\"text\" name=\"field1\" value=\"type some text here\" /> <br/>\n          <input type=\"file\" name=\"file1\" /> </br>\n          <button type=\"submit\">submit form</button>\n        </form>\n      </div>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "tutorials/http/file-upload-multiple-posts/Makefile",
    "content": "PROG ?= example                   # Program we are building\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c       # Source code files\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\n#CFLAGS_MONGOOSE += -DMG_ENABLE_LINES\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= example.exe           # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\nendif\n\nall: $(PROG)              # Default target. Build and run program\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)       # Build program from sources\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nclean:                    # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM\n"
  },
  {
    "path": "tutorials/http/file-upload-multiple-posts/README.md",
    "content": "See detailed tutorial at https://mongoose.ws/tutorials/http/file-uploads/\n"
  },
  {
    "path": "tutorials/http/file-upload-multiple-posts/main.c",
    "content": "// Copyright (c) 2020 Cesanta Software Limited\n// All rights reserved\n\n#include \"mongoose.h\"\n\n// HTTP request handler function. It implements the following endpoints:\n//   /upload - Saves the next file chunk\n//   all other URI - serves web_root/ directory\nstatic void cb(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    if (mg_match(hm->uri, mg_str(\"/upload\"), NULL)) {\n      mg_http_upload(c, hm, &mg_fs_posix, \"/tmp\", 99999);\n    } else {\n      struct mg_http_serve_opts opts = {.root_dir = \"web_root\"};\n      mg_http_serve_dir(c, ev_data, &opts);\n    }\n  }\n}\n\nint main(void) {\n  struct mg_mgr mgr;\n\n  mg_mgr_init(&mgr);\n  mg_log_set(MG_LL_DEBUG);  // Set log level\n  mg_http_listen(&mgr, \"http://localhost:8000\", cb, NULL);\n\n  for (;;) mg_mgr_poll(&mgr, 50);\n  mg_mgr_free(&mgr);\n\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/http/file-upload-multiple-posts/web_root/app.js",
    "content": "// Copyright (c) 2020 Cesanta Software Limited\n// All rights reserved\n\n// Helper function to display upload status\nvar setStatus = function(text) {\n  document.getElementById('el3').innerText = text;\n};\n\n// When user clicks on a button, trigger file selection dialog\nvar button = document.getElementById('el2');\nbutton.onclick = function(ev) {\n  input.click();\n};\n\n// Send a large blob of data chunk by chunk\nvar sendFileData = function(name, data, chunkSize) {\n  var sendChunk = function(offset) {\n    var chunk = data.subarray(offset, offset + chunkSize) || '';\n    var opts = {method: 'POST', body: chunk};\n    var url = '/upload?offset=' + offset + '&file=' + encodeURIComponent(name);\n    var ok;\n    setStatus(\n        'Uploading ' + name + ', bytes ' + offset + '..' +\n        (offset + chunk.length) + ' of ' + data.length);\n    fetch(url, opts)\n        .then(function(res) {\n          if (res.ok && chunk.length > 0) sendChunk(offset + chunk.length);\n          ok = res.ok;\n          return res.text();\n        })\n        .then(function(text) {\n          if (!ok) setStatus('Error: ' + text);\n        });\n  };\n  sendChunk(0);\n};\n\n// If user selected a file, read it into memory and trigger sendFileData()\nvar input = document.getElementById('el1');\ninput.onchange = function(ev) {\n  if (!ev.target.files[0]) return;\n  var f = ev.target.files[0], r = new FileReader();\n  r.readAsArrayBuffer(f);\n  r.onload = function() {\n    ev.target.value = '';\n    sendFileData(f.name, new Uint8Array(r.result), 2048);\n  };\n};\n"
  },
  {
    "path": "tutorials/http/file-upload-multiple-posts/web_root/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>example</title>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <style>\n      #container { margin-right: auto; margin-left: auto; max-width: 480px; }\n      #info { background: #e0f0f0; border-radius: .5em; padding: 2em;  }\n      #wrapper { margin-top: 1em; }\n    </style>\n  </head>\n  <body>\n    <div id=\"container\">\n      <div id=\"info\">\n        Mongoose always buffers a full HTTP message before invoking\n        the MG_EV_HTTP_MSG event. A big POST request would require a lot\n        of RAM to buffer everything. Therefore, in order to upload large\n        files on memory-constrained systems, a large file should be sent\n        in small chunks.\n        <br/><br/>\n        In this example, the JavaScript code on this page sends the chosen\n        file in 2Kb chunks using the <code>/upload</code> endpoint.\n        The uploaded file is stored in the <code>/tmp</code> directory by\n        the helper API function <code>mg_http_upload()</code>\n      </div>\n      <div id=\"wrapper\">\n        <input type=\"file\" id=\"el1\" style=\"display: none\"/>\n        <button id=\"el2\">choose file...</button>\n        <div id=\"el3\"></div>\n      </div>\n    </div>\n  </body>\n  <script src=\"app.js\"></script>\n</html>\n"
  },
  {
    "path": "tutorials/http/file-upload-single-post/Makefile",
    "content": "PROG ?= example                   # Program we are building\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c       # Source code files\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\n#CFLAGS_MONGOOSE += \nCFLAGS_EXTRA ?= -DMG_TLS=MG_TLS_BUILTIN\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= example.exe           # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\nendif\n\nall: $(PROG)              # Default target. Build and run program\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)       # Build program from sources\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nclean:                    # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM\n"
  },
  {
    "path": "tutorials/http/file-upload-single-post/README.md",
    "content": "See detailed tutorial at https://mongoose.ws/tutorials/http/file-uploads/\n"
  },
  {
    "path": "tutorials/http/file-upload-single-post/main.c",
    "content": "// Copyright (c) 2020-2024 Cesanta Software Limited\n// All rights reserved\n//\n// Streaming upload example. Demonstrates how to use MG_EV_READ events\n// to save a large file without buffering it fully in memory.\n//\n// curl http://localhost:8000/upload?name=a.txt --data-binary @large_file.txt\n\n#include \"mongoose.h\"\n\n#define UPLOAD_DIR \"/tmp\"\n\nstatic const char *s_tls_cert =\n    \"-----BEGIN CERTIFICATE-----\\n\"\n    \"MIIBMTCB2aADAgECAgkAluqkgeuV/zUwCgYIKoZIzj0EAwIwEzERMA8GA1UEAwwI\\n\"\n    \"TW9uZ29vc2UwHhcNMjQwNTA3MTQzNzM2WhcNMzQwNTA1MTQzNzM2WjARMQ8wDQYD\\n\"\n    \"VQQDDAZzZXJ2ZXIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASo3oEiG+BuTt5y\\n\"\n    \"ZRyfwNr0C+SP+4M0RG2pYkb2v+ivbpfi72NHkmXiF/kbHXtgmSrn/PeTqiA8M+mg\\n\"\n    \"BhYjDX+zoxgwFjAUBgNVHREEDTALgglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDRwAw\\n\"\n    \"RAIgTXW9MITQSwzqbNTxUUdt9DcB+8pPUTbWZpiXcA26GMYCIBiYw+DSFMLHmkHF\\n\"\n    \"+5U3NXW3gVCLN9ntD5DAx8LTG8sB\\n\"\n    \"-----END CERTIFICATE-----\\n\";\n\nstatic const char *s_tls_key =\n    \"-----BEGIN EC PRIVATE KEY-----\\n\"\n    \"MHcCAQEEIAVdo8UAScxG7jiuNY2UZESNX/KPH8qJ0u0gOMMsAzYWoAoGCCqGSM49\\n\"\n    \"AwEHoUQDQgAEqN6BIhvgbk7ecmUcn8Da9Avkj/uDNERtqWJG9r/or26X4u9jR5Jl\\n\"\n    \"4hf5Gx17YJkq5/z3k6ogPDPpoAYWIw1/sw==\\n\"\n    \"-----END EC PRIVATE KEY-----\\n\";\n\nstruct upload_state {\n  size_t expected;  // POST data length, bytes\n  size_t received;  // Already received bytes\n  void *fp;         // Opened uploaded file\n};\n\nstatic void handle_uploads(struct mg_connection *c, int ev, void *ev_data) {\n  struct upload_state *us = (struct upload_state *) c->data;\n  struct mg_fs *fs = &mg_fs_posix;\n\n  // Catch /upload requests early, without buffering whole body\n  // When we receive MG_EV_HTTP_HDRS event, that means we've received all\n  // HTTP headers but not necessarily full HTTP body\n  if (ev == MG_EV_HTTP_HDRS) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    if (mg_match(hm->uri, mg_str(\"/upload/*\"), NULL)) {\n      char path[MG_PATH_MAX];\n      mg_snprintf(path, sizeof(path), \"%s/%.*s\", UPLOAD_DIR, hm->uri.len - 8,\n                  hm->uri.buf + 8);\n      us->expected = hm->body.len;  // Store number of bytes we expect\n      mg_iobuf_del(&c->recv, 0, hm->head.len);  // Delete HTTP headers\n      c->pfn = NULL;  // Silence HTTP protocol handler, we'll use MG_EV_READ\n      if (mg_path_is_sane(mg_str(path))) {\n        fs->rm(path);                        // Delete file if it exists\n        us->fp = fs->op(path, MG_FS_WRITE);  // Open file for writing\n      }\n    }\n  }\n\n  // Catch uploaded file data for both MG_EV_READ and MG_EV_HTTP_HDRS\n  if (us->expected > 0 && c->recv.len > 0) {\n    us->received += c->recv.len;\n    if (us->fp) fs->wr(us->fp, c->recv.buf, c->recv.len);  // Write to file\n    c->recv.len = 0;  // Delete received data\n    if (us->received >= us->expected) {\n      // Uploaded everything. Send response back\n      MG_INFO((\"Uploaded %lu bytes\", us->received));\n      mg_http_reply(c, 200, NULL, \"%lu ok\\n\", us->received);\n      if (us->fp) fs->cl(us->fp);  // Close file\n      memset(us, 0, sizeof(*us));  // Cleanup upload state\n      c->is_draining = 1;          // Close connection when response gets sent\n    }\n  }\n}\n\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_ACCEPT && c->is_tls) {\n    struct mg_tls_opts opts = {.cert = mg_str(s_tls_cert),\n                               .key = mg_str(s_tls_key)};\n    mg_tls_init(c, &opts);\n  }\n\n  handle_uploads(c, ev, ev_data);\n\n  // Non-upload requests, we serve normally\n  // NOTE: handle_uploads() may delete request and reset c->pfn\n  if (ev == MG_EV_HTTP_MSG && c->pfn != NULL) {\n    struct mg_http_serve_opts opts = {.root_dir = \"web_root\"};\n    mg_http_serve_dir(c, ev_data, &opts);\n  }\n}\n\nint main(void) {\n  struct mg_mgr mgr;\n\n  mg_mgr_init(&mgr);\n  mg_log_set(MG_LL_DEBUG);  // Set debug log level\n  mg_http_listen(&mgr, \"http://localhost:8000\", fn, NULL);\n  mg_http_listen(&mgr, \"https://0.0.0.0:8443\", fn, \"TLS!\");\n\n  for (;;) mg_mgr_poll(&mgr, 50);\n  mg_mgr_free(&mgr);\n\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/http/file-upload-single-post/web_root/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>example</title>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <style>\n      #container { margin-right: auto; margin-left: auto; max-width: 480px; }\n      #info { background: #e0f0f0; border-radius: .5em; padding: 2em;  }\n      #wrapper { margin-top: 1em; }\n    </style>\n  </head>\n  <body>\n    <div id=\"container\">\n      <div id=\"info\">\n        Mongoose always buffers a full HTTP message before invoking\n        MG_EV_HTTP_MSG event. Big POST request require of lot\n        of RAM to buffer everything.\n        <br><br>\n        In order to upload large files to a memory-constrained system, use\n        <code>MG_EV_READ</code> on a server side. It fires when\n        a partial HTTP message has been received. We discourage this method,\n        since the client can send chunked-encoded data. Instead, please\n        split the upload into smaller pieces and send sequentially.\n        <br><br>\n        In this example, JavaScript code uses \"fetch()\" browser API.\n        Uploaded file is not saved, but rather printed by server side.\n      </div>\n      <div id=\"wrapper\">\n        <input type=\"file\" id=\"el1\" style=\"display: none\"/>\n        <button id=\"el2\">choose file...</button>\n        <span>Selected file:</span> <span id=\"el4\"></span> <br/>\n        <button id=\"el5\" style=\"margin: 0.5em 0;\" disabled>upload file</button>\n        <div id=\"el3\" style=\"margin-top: 1em;\"></div>\n      </div>\n    </div>\n  </body>\n  <script>\n    var f; // selected file\n\n    // When user clicks on a button, trigger file selection dialog\n    document.getElementById('el2').onclick = function(ev) {\n      document.getElementById('el1').click();\n    };\n\n    document.getElementById('el5').onclick = function(ev) {\n      var r = new FileReader();\n      r.readAsArrayBuffer(f);\n      r.onload = function() {\n        ev.target.value = '';\n        document.getElementById('el3').innerText = 'Uploading...';\n        fetch(`/upload/${encodeURIComponent(f.name)}`, {\n          method: 'POST',\n          body: r.result,\n        }).then(function(res) {\n          document.getElementById('el3').innerText = 'Uploaded ' + r.result.byteLength + ' bytes';\n        });\n      };\n    };\n\n    // If user selected a file, read it into memory and trigger sendFileData()\n    document.getElementById('el1').onchange = function(ev) {\n      f = ev.target.files[0];\n      if (!f) return;\n      document.getElementById('el4').innerText = f.name;\n      document.getElementById('el5').removeAttribute('disabled');\n    };\n\n  </script>\n</html>\n"
  },
  {
    "path": "tutorials/http/http-client/Makefile",
    "content": "PROG ?= example                   # Program we are building\nPACK ?= ./pack                    # Packing executable\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c       # Source code files\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += -DMG_ENABLE_LINES=1\nCFLAGS_EXTRA ?= -DMG_TLS=MG_TLS_BUILTIN\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= example.exe           # Use .exe suffix for the binary\n  PACK = pack.exe               # Packing executable\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\n  MAKE += WINDOWS=1 CC=$(CC)\nendif\n\nall: $(PROG)              # Default target. Build and run program\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)       # Build program from sources\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nclean:                    # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM mbedtls $(PACK)\n"
  },
  {
    "path": "tutorials/http/http-client/README.md",
    "content": "See detailed tutorial at https://mongoose.ws/tutorials/http/http-client/\n"
  },
  {
    "path": "tutorials/http/http-client/esp8266/http-client-server/Makefile",
    "content": "THISDIR = $(realpath $(CURDIR))\nROOTDIR = $(realpath $(CURDIR)/../../../../..)\nDOCKER ?= docker run --rm $(DA) -v $(ROOTDIR):$(ROOTDIR) -w $(THISDIR) docker.io/mdashnet/8266\nCMD ?= make -C src defconfig app\nPORT ?= /dev/ttyUSB0\n\nall: example\n\nexample:\n\ttrue\n\nbuild: Makefile $(wildcard src/main/*)\n\t$(DOCKER) $(CMD)\n\nflash:\nflash: CMD = python /esp/components/esptool_py/esptool/esptool.py \\\n\t--chip esp8266 --port $(PORT) --baud 115200 --before default_reset \\\n\t--after hard_reset write_flash -z --flash_mode dio --flash_freq 40m \\\n\t--flash_size 2MB 0x10000 $(THISDIR)/src/build/mongoose-example.bin\nflash: DA = --device $(PORT)\nflash: build\n\nbuildall:\nbuildall: CMD = make -C src all\nbuildall: build\n\nflashall:\nflashall: CMD = python /esp/components/esptool_py/esptool/esptool.py \\\n\t--chip esp8266 --port $(PORT) --baud 115200 --before default_reset \\\n\t--after hard_reset write_flash -z --flash_mode dio --flash_freq 40m \\\n\t--flash_size 2MB 0x0 $(THISDIR)/src/build/bootloader/bootloader.bin \\\n\t0x10000 $(THISDIR)/src/build/mongoose-example.bin \\\n\t0x8000 $(THISDIR)/src/build/partitions_singleapp.bin\nflashall: DA = --device $(PORT)\nflashall: build\n\nmonitor:\nmonitor: CMD = /esp/tools/idf_monitor.py --port $(PORT) $(THISDIR)/src/build/mongoose-example.elf\nmonitor: build\n\n.PHONY: build\n\nclean:\n\ttest -d src/build && $(DOCKER) rm -rf src/build || true\n\n"
  },
  {
    "path": "tutorials/http/http-client/esp8266/http-client-server/README.md",
    "content": "See detailed tutorial at https://mongoose.ws/tutorials/esp8266/http-client-server/"
  },
  {
    "path": "tutorials/http/http-client/esp8266/http-client-server/src/Makefile",
    "content": "#\n# This is a project Makefile. It is assumed the directory this Makefile resides in is a\n# project subdirectory.\n#\n\nPROJECT_NAME := mongoose-example\n\ninclude $(IDF_PATH)/make/project.mk\n\n"
  },
  {
    "path": "tutorials/http/http-client/esp8266/http-client-server/src/main/component.mk",
    "content": "  #\n  # Main component makefile.\n  #\n  # This Makefile can be left empty. By default, it will take the sources in the \n  # src/ directory, compile them and link them into lib(subdirectory_name).a \n  # in the build directory. This behaviour is entirely configurable,\n  # please read the ESP-IDF documents if you need to do this.\n#\n\n"
  },
  {
    "path": "tutorials/http/http-client/esp8266/http-client-server/src/main/main.c",
    "content": "// Copyright (c) 2020 Cesanta Software Limited\n// All rights reserved\n\n#include \"mongoose.h\"\n\n#define WIFI_SSID \"WIFI_NETWORK\"   // SET THIS!\n#define WIFI_PASS \"WIFI_PASSWORD\"  // SET THIS!\n\n#define SERVER_URL \"http://0.0.0.0:80\"\n#define CLIENT_URL \"http://info.cern.ch\"\n\n// Event handler for a server (accepted) connection\nstatic void cb(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    mg_http_reply(c, 200, \"\", \"Hello from ESP!\\n\");\n  }\n}\n\n// Event handler for a client connection - fetch the first web page in history\n// To enable TLS for HTTP,\n//   1. Copy \"ca.pem\" file to the ESP8266 flash FS\n//   2. Add TLS init snippet for the connection, see examples/http-client\nstatic void cb2(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_CONNECT) {\n    struct mg_str s = mg_url_host(CLIENT_URL);\n    mg_printf(c, \"GET / HTTP/1.0\\r\\nHost: %.*s\\r\\n\\r\\n\", (int) s.len, s.buf);\n  } else if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = ev_data;  // Print HTTP response\n    MG_INFO((\"Fetched:\\n%.*s\", (int) hm->message.len, hm->message.buf));\n    c->is_draining = 1;\n  }\n}\n\n// Called after we're connected to WiFi network\nstatic void run_mongoose(void) {\n  struct mg_mgr mgr;\n  mg_log_set(MG_LL_DEBUG);  // Set log level\n  mg_mgr_init(&mgr);\n  mg_http_listen(&mgr, SERVER_URL, cb, &mgr);    // Listening server\n  mg_http_connect(&mgr, CLIENT_URL, cb2, &mgr);  // Example client\n  MG_INFO((\"Starting Mongoose web server v%s\", MG_VERSION));\n  for (;;) mg_mgr_poll(&mgr, 1000);\n  mg_mgr_free(&mgr);\n}\n\nvoid app_main(void) {\n  // Setup wifi. This function is implemented in wifi.c\n  // It blocks until connected to the configured WiFi network\n  void wifi_init(const char *ssid, const char *pass);\n  wifi_init(WIFI_SSID, WIFI_PASS);\n\n  // Done connecting to WiFi, now start HTTP server\n  run_mongoose();\n}\n"
  },
  {
    "path": "tutorials/http/http-client/esp8266/http-client-server/src/main/mongoose_config.h",
    "content": "#define MG_ARCH MG_ARCH_ESP8266\n\n"
  },
  {
    "path": "tutorials/http/http-client/esp8266/http-client-server/src/main/wifi.c",
    "content": "#include <string.h>\n#include \"esp_event.h\"\n#include \"esp_log.h\"\n#include \"esp_system.h\"\n#include \"esp_wifi.h\"\n#include \"freertos/FreeRTOS.h\"\n#include \"freertos/event_groups.h\"\n#include \"freertos/task.h\"\n#include \"nvs_flash.h\"\n\n#include \"lwip/err.h\"\n#include \"lwip/sys.h\"\n\n#include \"mongoose.h\"\n\nstatic EventGroupHandle_t s_wifi_event_group;\n\n/* The event group allows multiple bits for each event, but we only care about\n * two events:\n * - we are connected to the AP with an IP\n * - we failed to connect after the maximum amount of retries */\n#define WIFI_CONNECTED_BIT BIT0\n#define WIFI_FAIL_BIT BIT1\n\nstatic int s_retry_num = 0;\n\nstatic void event_handler(void *arg, esp_event_base_t event_base,\n                          int32_t event_id, void *event_data) {\n  if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {\n    esp_wifi_connect();\n  } else if (event_base == WIFI_EVENT &&\n             event_id == WIFI_EVENT_STA_DISCONNECTED) {\n    if (s_retry_num < 3) {\n      esp_wifi_connect();\n      s_retry_num++;\n      MG_DEBUG((\"retry to connect to the AP\"));\n    } else {\n      xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);\n    }\n    MG_ERROR((\"connect to the AP fail\"));\n  } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {\n    ip_event_got_ip_t *event = (ip_event_got_ip_t *) event_data;\n    MG_INFO((\"got ip:%s\", ip4addr_ntoa(&event->ip_info.ip)));\n    s_retry_num = 0;\n    xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);\n  }\n}\n\nvoid wifi_init(const char *ssid, const char *pass) {\n  s_wifi_event_group = xEventGroupCreate();\n  tcpip_adapter_init();\n  ESP_ERROR_CHECK(esp_event_loop_create_default());\n  wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();\n  ESP_ERROR_CHECK(esp_wifi_init(&cfg));\n  ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT, ESP_EVENT_ANY_ID,\n                                             &event_handler, NULL));\n  ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT, IP_EVENT_STA_GOT_IP,\n                                             &event_handler, NULL));\n\n  wifi_config_t c = {};\n  snprintf((char *) c.sta.ssid, sizeof(c.sta.ssid), \"%s\", ssid);\n  snprintf((char *) c.sta.password, sizeof(c.sta.password), \"%s\", pass);\n  if (pass != NULL && pass[0] != '\\0') {\n    c.sta.threshold.authmode = WIFI_AUTH_WPA2_PSK;\n  }\n  ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));\n  ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &c));\n  ESP_ERROR_CHECK(esp_wifi_start());\n  EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,\n                                         WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,\n                                         pdFALSE, pdFALSE, portMAX_DELAY);\n\n  if (bits & WIFI_CONNECTED_BIT) {\n    MG_INFO((\"connected to ap SSID:%s password:%s\", ssid, pass));\n  } else if (bits & WIFI_FAIL_BIT) {\n    MG_ERROR((\"Failed to connect to SSID:%s, password:%s\", ssid, pass));\n  } else {\n    MG_ERROR((\"UNEXPECTED EVENT\"));\n  }\n\n  ESP_ERROR_CHECK(esp_event_handler_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP,\n                                               &event_handler));\n  ESP_ERROR_CHECK(esp_event_handler_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID,\n                                               &event_handler));\n  vEventGroupDelete(s_wifi_event_group);\n}\n"
  },
  {
    "path": "tutorials/http/http-client/esp8266/http-client-server/src/sdkconfig",
    "content": "#\n# Automatically generated file. DO NOT EDIT.\n# Espressif IoT Development Framework (ESP-IDF) Project Configuration\n#\nCONFIG_IDF_TARGET_ESP8266=y\nCONFIG_IDF_TARGET=\"esp8266\"\n\n#\n# SDK tool configuration\n#\nCONFIG_SDK_TOOLPREFIX=\"xtensa-lx106-elf-\"\nCONFIG_SDK_PYTHON=\"python\"\n# CONFIG_SDK_MAKE_WARN_UNDEFINED_VARIABLES is not set\nCONFIG_BOOTLOADER_INIT_SPI_FLASH=y\n# CONFIG_BOOTLOADER_DISABLE_JTAG_IO is not set\n# CONFIG_BOOTLOADER_FAST_BOOT is not set\n# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set\n# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set\n# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set\nCONFIG_LOG_BOOTLOADER_LEVEL_INFO=y\n# CONFIG_LOG_BOOTLOADER_LEVEL_DEBUG is not set\n# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set\nCONFIG_LOG_BOOTLOADER_LEVEL=3\n# CONFIG_BOOTLOADER_APP_TEST is not set\nCONFIG_BOOTLOADER_STORE_OFFSET=0x0\nCONFIG_ESPTOOLPY_PORT=\"/dev/ttyACM0\"\nCONFIG_ESPTOOLPY_BAUD_115200B=y\n# CONFIG_ESPTOOLPY_BAUD_230400B is not set\n# CONFIG_ESPTOOLPY_BAUD_921600B is not set\n# CONFIG_ESPTOOLPY_BAUD_2MB is not set\n# CONFIG_ESPTOOLPY_BAUD_OTHER is not set\nCONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200\nCONFIG_ESPTOOLPY_BAUD=115200\nCONFIG_ESPTOOLPY_COMPRESSED=y\nCONFIG_ESPTOOLPY_FLASHMODE_QIO=y\n# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set\n# CONFIG_ESPTOOLPY_FLASHMODE_DIO is not set\n# CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set\nCONFIG_ESPTOOLPY_FLASHMODE=\"dio\"\nCONFIG_SPI_FLASH_MODE=0x0\n# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set\nCONFIG_ESPTOOLPY_FLASHFREQ_40M=y\n# CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set\n# CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set\nCONFIG_ESPTOOLPY_FLASHFREQ=\"40m\"\nCONFIG_SPI_FLASH_FREQ=0x0\n# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set\n# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set\nCONFIG_ESPTOOLPY_FLASHSIZE_4MB=y\n# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set\n# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set\nCONFIG_ESPTOOLPY_FLASHSIZE=\"4MB\"\nCONFIG_SPI_FLASH_SIZE=0x400000\nCONFIG_ESPTOOLPY_BEFORE_RESET=y\n# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set\nCONFIG_ESPTOOLPY_BEFORE=\"default_reset\"\nCONFIG_ESPTOOLPY_AFTER_HARD_RESET=y\n# CONFIG_ESPTOOLPY_AFTER_SOFT_RESET is not set\n# CONFIG_ESPTOOLPY_AFTER_NORESET is not set\nCONFIG_ESPTOOLPY_AFTER=\"hard_reset\"\n# CONFIG_ESPTOOLPY_MONITOR_BAUD_9600B is not set\n# CONFIG_ESPTOOLPY_MONITOR_BAUD_57600B is not set\n# CONFIG_ESPTOOLPY_MONITOR_BAUD_74880B is not set\nCONFIG_ESPTOOLPY_MONITOR_BAUD_115200B=y\n# CONFIG_ESPTOOLPY_MONITOR_BAUD_230400B is not set\n# CONFIG_ESPTOOLPY_MONITOR_BAUD_921600B is not set\n# CONFIG_ESPTOOLPY_MONITOR_BAUD_2MB is not set\n# CONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER is not set\nCONFIG_ESPTOOLPY_MONITOR_BAUD_OTHER_VAL=74880\nCONFIG_ESPTOOLPY_MONITOR_BAUD=115200\nCONFIG_PARTITION_TABLE_SINGLE_APP=y\n# CONFIG_PARTITION_TABLE_TWO_OTA is not set\n# CONFIG_PARTITION_TABLE_CUSTOM is not set\nCONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions.csv\"\nCONFIG_PARTITION_TABLE_OFFSET=0x8000\nCONFIG_PARTITION_TABLE_FILENAME=\"partitions_singleapp.csv\"\nCONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG=y\n# CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE is not set\nCONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y\n# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set\n# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set\n# CONFIG_COMPILER_CXX_EXCEPTIONS is not set\nCONFIG_COMPILER_STACK_CHECK_MODE_NONE=y\n# CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set\n# CONFIG_COMPILER_STACK_CHECK_MODE_STRONG is not set\n# CONFIG_COMPILER_STACK_CHECK_MODE_ALL is not set\n# CONFIG_COMPILER_STACK_CHECK is not set\n# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set\nCONFIG_APP_UPDATE_CHECK_APP_SUM=y\n# CONFIG_APP_UPDATE_CHECK_APP_HASH is not set\nCONFIG_APP_COMPILE_TIME_DATE=y\n# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set\n# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set\n# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set\n# CONFIG_ENABLE_COAP is not set\nCONFIG_ESP_TLS_USING_MBEDTLS=y\n# CONFIG_ESP_TLS_USING_WOLFSSL is not set\n# CONFIG_ESP_TLS_SERVER is not set\n# CONFIG_ESP_TLS_PSK_VERIFICATION is not set\n# CONFIG_ESP_WOLFSSL_INTERNAL is not set\n# CONFIG_WOLFSSL_DEBUG is not set\nCONFIG_ESP8266_NMI_WDT=y\n# CONFIG_ESP8266_XTAL_FREQ_40 is not set\nCONFIG_ESP8266_XTAL_FREQ_26=y\nCONFIG_ESP8266_XTAL_FREQ=26\n# CONFIG_ESP8266_DEFAULT_CPU_FREQ_80 is not set\nCONFIG_ESP8266_DEFAULT_CPU_FREQ_160=y\nCONFIG_ESP8266_DEFAULT_CPU_FREQ_MHZ=160\nCONFIG_ESP_FILENAME_MACRO_NO_PATH=y\n# CONFIG_ESP_FILENAME_MACRO_RAW is not set\n# CONFIG_ESP_FILENAME_MACRO_NULL is not set\nCONFIG_USING_NEW_ETS_VPRINTF=y\n# CONFIG_LINK_ETS_PRINTF_TO_IRAM is not set\nCONFIG_ETS_PRINTF_EXIT_WHEN_FLASH_RW=y\n# CONFIG_SOC_FULL_ICACHE is not set\nCONFIG_SOC_IRAM_SIZE=0xC000\n# CONFIG_DISABLE_ROM_UART_PRINT is not set\n# CONFIG_ESP_PANIC_PRINT_HALT is not set\nCONFIG_ESP_PANIC_PRINT_REBOOT=y\n# CONFIG_ESP_PANIC_SILENT_REBOOT is not set\n# CONFIG_ESP_PANIC_GDBSTUB is not set\nCONFIG_RESET_REASON=y\nCONFIG_WIFI_PPT_TASKSTACK_SIZE=5120\nCONFIG_ESP8266_CORE_GLOBAL_DATA_LINK_IRAM=y\n# CONFIG_ESP8266_OTA_FROM_OLD is not set\n# CONFIG_ESP8266_BOOT_COPY_APP is not set\nCONFIG_ESP8266_TIME_SYSCALL_USE_FRC1=y\n# CONFIG_ESP8266_TIME_SYSCALL_USE_NONE is not set\n# CONFIG_PM_ENABLE is not set\nCONFIG_SCAN_AP_MAX=99\nCONFIG_WIFI_TX_RATE_SEQUENCE_FROM_HIGH=y\n# CONFIG_ESP8266_WIFI_QOS_ENABLED is not set\n# CONFIG_ESP8266_WIFI_AMPDU_RX_ENABLED is not set\n# CONFIG_ESP8266_WIFI_AMSDU_ENABLED is not set\nCONFIG_ESP8266_WIFI_RX_BUFFER_NUM=16\nCONFIG_ESP8266_WIFI_LEFT_CONTINUOUS_RX_BUFFER_NUM=16\nCONFIG_ESP8266_WIFI_RX_PKT_NUM=7\nCONFIG_ESP8266_WIFI_TX_PKT_NUM=6\nCONFIG_ESP8266_WIFI_NVS_ENABLED=y\nCONFIG_ESP8266_WIFI_CONNECT_OPEN_ROUTER_WHEN_PWD_IS_SET=y\nCONFIG_ESP8266_WIFI_ENABLE_WPA3_SAE=y\n# CONFIG_ESP8266_WIFI_DEBUG_LOG_ENABLE is not set\nCONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y\n# CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set\nCONFIG_ESP_PHY_INIT_DATA_VDD33_CONST=33\nCONFIG_ESP8266_PHY_MAX_WIFI_TX_POWER=20\n# CONFIG_ESP8266_HSPI_HIGH_THROUGHPUT is not set\nCONFIG_ESP_ERR_TO_NAME_LOOKUP=y\nCONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32\nCONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2048\nCONFIG_ESP_MAIN_TASK_STACK_SIZE=3584\nCONFIG_ESP_TIMER_TASK_STACK_SIZE=3584\nCONFIG_ESP_CONSOLE_UART_DEFAULT=y\n# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set\n# CONFIG_ESP_CONSOLE_UART_NONE is not set\nCONFIG_ESP_CONSOLE_UART_NUM=0\nCONFIG_ESP_CONSOLE_UART_BAUDRATE=74880\n# CONFIG_ESP_UART0_SWAP_IO is not set\nCONFIG_ESP_TASK_WDT=y\nCONFIG_ESP_TASK_WDT_PANIC=y\n# CONFIG_ESP_TASK_WDT_TIMEOUT_13N is not set\n# CONFIG_ESP_TASK_WDT_TIMEOUT_14N is not set\nCONFIG_ESP_TASK_WDT_TIMEOUT_15N=y\nCONFIG_ESP_TASK_WDT_TIMEOUT_S=15\n# CONFIG_ESP_EVENT_LOOP_PROFILING is not set\nCONFIG_ESP_EVENT_POST_FROM_ISR=y\nCONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y\n# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set\nCONFIG_HTTP_BUF_SIZE=512\nCONFIG_HTTPD_MAX_REQ_HDR_LEN=512\nCONFIG_HTTPD_MAX_URI_LEN=512\nCONFIG_OTA_BUF_SIZE=256\n# CONFIG_OTA_ALLOW_HTTP is not set\n# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set\nCONFIG_FATFS_CODEPAGE_437=y\n# CONFIG_FATFS_CODEPAGE_720 is not set\n# CONFIG_FATFS_CODEPAGE_737 is not set\n# CONFIG_FATFS_CODEPAGE_771 is not set\n# CONFIG_FATFS_CODEPAGE_775 is not set\n# CONFIG_FATFS_CODEPAGE_850 is not set\n# CONFIG_FATFS_CODEPAGE_852 is not set\n# CONFIG_FATFS_CODEPAGE_855 is not set\n# CONFIG_FATFS_CODEPAGE_857 is not set\n# CONFIG_FATFS_CODEPAGE_860 is not set\n# CONFIG_FATFS_CODEPAGE_861 is not set\n# CONFIG_FATFS_CODEPAGE_862 is not set\n# CONFIG_FATFS_CODEPAGE_863 is not set\n# CONFIG_FATFS_CODEPAGE_864 is not set\n# CONFIG_FATFS_CODEPAGE_865 is not set\n# CONFIG_FATFS_CODEPAGE_866 is not set\n# CONFIG_FATFS_CODEPAGE_869 is not set\n# CONFIG_FATFS_CODEPAGE_932 is not set\n# CONFIG_FATFS_CODEPAGE_936 is not set\n# CONFIG_FATFS_CODEPAGE_949 is not set\n# CONFIG_FATFS_CODEPAGE_950 is not set\nCONFIG_FATFS_CODEPAGE=437\nCONFIG_FATFS_LFN_NONE=y\n# CONFIG_FATFS_LFN_HEAP is not set\n# CONFIG_FATFS_LFN_STACK is not set\nCONFIG_FATFS_FS_LOCK=0\nCONFIG_FATFS_TIMEOUT_MS=10000\nCONFIG_FATFS_PER_FILE_CACHE=y\nCONFIG_FMB_COMM_MODE_TCP_EN=y\nCONFIG_FMB_TCP_PORT_DEFAULT=502\nCONFIG_FMB_TCP_PORT_MAX_CONN=5\nCONFIG_FMB_TCP_CONNECTION_TOUT_SEC=20\nCONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND=150\nCONFIG_FMB_MASTER_DELAY_MS_CONVERT=200\nCONFIG_FMB_QUEUE_LENGTH=20\nCONFIG_FMB_PORT_TASK_STACK_SIZE=4096\nCONFIG_FMB_SERIAL_BUF_SIZE=256\nCONFIG_FMB_PORT_TASK_PRIO=10\nCONFIG_FMB_CONTROLLER_SLAVE_ID_SUPPORT=y\nCONFIG_FMB_CONTROLLER_SLAVE_ID=0x00112233\nCONFIG_FMB_CONTROLLER_NOTIFY_TIMEOUT=20\nCONFIG_FMB_CONTROLLER_NOTIFY_QUEUE_SIZE=20\nCONFIG_FMB_CONTROLLER_STACK_SIZE=4096\nCONFIG_FMB_EVENT_QUEUE_TIMEOUT=20\nCONFIG_FMB_TIMER_GROUP=0\nCONFIG_FMB_TIMER_INDEX=0\n# CONFIG_FMB_TIMER_ISR_IN_IRAM is not set\n# CONFIG_DISABLE_FREERTOS is not set\nCONFIG_FREERTOS_UNICORE=y\n# CONFIG_FREERTOS_ENABLE_REENT is not set\nCONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF\nCONFIG_FREERTOS_HZ=100\nCONFIG_FREERTOS_MAX_HOOK=2\nCONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1024\nCONFIG_FREERTOS_ISR_STACKSIZE=512\n# CONFIG_FREERTOS_EXTENED_HOOKS is not set\nCONFIG_FREERTOS_GLOBAL_DATA_LINK_IRAM=y\n# CONFIG_FREERTOS_CODE_LINK_TO_IRAM is not set\nCONFIG_FREERTOS_TIMER_STACKSIZE=2048\nCONFIG_TASK_SWITCH_FASTER=y\n# CONFIG_USE_QUEUE_SETS is not set\n# CONFIG_ENABLE_FREERTOS_SLEEP is not set\n# CONFIG_FREERTOS_USE_TRACE_FACILITY is not set\n# CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set\nCONFIG_FREERTOS_WATCHPOINT_END_OF_STACK=y\n# CONFIG_HEAP_DISABLE_IRAM is not set\n# CONFIG_HEAP_TRACING is not set\nCONFIG_LIBSODIUM_USE_MBEDTLS_SHA=y\n# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set\n# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set\n# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set\nCONFIG_LOG_DEFAULT_LEVEL_INFO=y\n# CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set\n# CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set\nCONFIG_LOG_DEFAULT_LEVEL=3\nCONFIG_LOG_COLORS=y\n# CONFIG_LOG_SET_LEVEL is not set\nCONFIG_LWIP_LOCAL_HOSTNAME=\"espressif\"\nCONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y\n# CONFIG_LWIP_L2_TO_L3_COPY is not set\n# CONFIG_LWIP_IRAM_OPTIMIZATION is not set\nCONFIG_LWIP_TIMERS_ONDEMAND=y\nCONFIG_LWIP_MAX_SOCKETS=10\n# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set\n# CONFIG_LWIP_SO_LINGER is not set\nCONFIG_LWIP_SO_REUSE=y\nCONFIG_LWIP_SO_REUSE_RXTOALL=y\n# CONFIG_LWIP_SO_RCVBUF is not set\n# CONFIG_LWIP_NETBUF_RECVINFO is not set\nCONFIG_LWIP_IP4_FRAG=y\nCONFIG_LWIP_IP6_FRAG=y\n# CONFIG_LWIP_IP4_REASSEMBLY is not set\n# CONFIG_LWIP_IP6_REASSEMBLY is not set\n# CONFIG_LWIP_IP_FORWARD is not set\n# CONFIG_LWIP_STATS is not set\n# CONFIG_LWIP_ETHARP_TRUST_IP_MAC is not set\nCONFIG_LWIP_ESP_GRATUITOUS_ARP=y\nCONFIG_LWIP_GARP_TMR_INTERVAL=60\nCONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32\nCONFIG_LWIP_DHCP_DOES_ARP_CHECK=y\n# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set\nCONFIG_LWIP_DHCPS_LEASE_UNIT=60\nCONFIG_LWIP_DHCPS_MAX_STATION_NUM=8\n# CONFIG_LWIP_AUTOIP is not set\n# CONFIG_LWIP_IPV6_AUTOCONFIG is not set\nCONFIG_LWIP_NETIF_LOOPBACK=y\nCONFIG_LWIP_LOOPBACK_MAX_PBUFS=8\nCONFIG_LWIP_MAX_ACTIVE_TCP=16\nCONFIG_LWIP_MAX_LISTENING_TCP=16\nCONFIG_LWIP_TCP_MAXRTX=12\nCONFIG_LWIP_TCP_SYNMAXRTX=6\nCONFIG_LWIP_TCP_MSS=1440\nCONFIG_LWIP_TCP_TMR_INTERVAL=250\nCONFIG_LWIP_TCP_MSL=60000\nCONFIG_LWIP_TCP_SND_BUF_DEFAULT=2880\nCONFIG_LWIP_TCP_WND_DEFAULT=5760\nCONFIG_LWIP_TCP_RECVMBOX_SIZE=6\nCONFIG_LWIP_TCP_QUEUE_OOSEQ=y\n# CONFIG_LWIP_TCP_SACK_OUT is not set\n# CONFIG_LWIP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set\nCONFIG_LWIP_TCP_OVERSIZE_MSS=y\n# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set\n# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set\nCONFIG_LWIP_TCP_RTO_TIME=3000\nCONFIG_LWIP_MAX_UDP_PCBS=16\nCONFIG_LWIP_UDP_RECVMBOX_SIZE=6\nCONFIG_LWIP_TCPIP_TASK_STACK_SIZE=2048\nCONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y\n# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set\nCONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF\n# CONFIG_LWIP_PPP_SUPPORT is not set\nCONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3\nCONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5\n# CONFIG_LWIP_MULTICAST_PING is not set\n# CONFIG_LWIP_BROADCAST_PING is not set\nCONFIG_LWIP_MAX_RAW_PCBS=16\n# CONFIG_LWIP_IPV6 is not set\nCONFIG_LWIP_DHCP_MAX_NTP_SERVERS=1\nCONFIG_LWIP_SNTP_UPDATE_DELAY=3600000\nCONFIG_LWIP_ESP_LWIP_ASSERT=y\n# CONFIG_LWIP_DEBUG is not set\nCONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y\n# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set\n# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set\nCONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y\nCONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384\nCONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096\n# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set\n# CONFIG_MBEDTLS_DEBUG is not set\nCONFIG_MBEDTLS_HAVE_TIME=y\n# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set\nCONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y\n# CONFIG_MBEDTLS_TLS_SERVER_ONLY is not set\n# CONFIG_MBEDTLS_TLS_CLIENT_ONLY is not set\n# CONFIG_MBEDTLS_TLS_DISABLED is not set\nCONFIG_MBEDTLS_TLS_SERVER=y\nCONFIG_MBEDTLS_TLS_CLIENT=y\nCONFIG_MBEDTLS_TLS_ENABLED=y\n# CONFIG_MBEDTLS_PSK_MODES is not set\nCONFIG_MBEDTLS_KEY_EXCHANGE_RSA=y\nCONFIG_MBEDTLS_KEY_EXCHANGE_DHE_RSA=y\nCONFIG_MBEDTLS_KEY_EXCHANGE_ELLIPTIC_CURVE=y\nCONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_RSA=y\nCONFIG_MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA=y\nCONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_ECDSA=y\nCONFIG_MBEDTLS_KEY_EXCHANGE_ECDH_RSA=y\nCONFIG_MBEDTLS_SSL_RENEGOTIATION=y\n# CONFIG_MBEDTLS_SSL_PROTO_SSL3 is not set\nCONFIG_MBEDTLS_SSL_PROTO_TLS1=y\nCONFIG_MBEDTLS_SSL_PROTO_TLS1_1=y\nCONFIG_MBEDTLS_SSL_PROTO_TLS1_2=y\n# CONFIG_MBEDTLS_SSL_PROTO_DTLS is not set\nCONFIG_MBEDTLS_SSL_ALPN=y\nCONFIG_MBEDTLS_CLIENT_SSL_SESSION_TICKETS=y\nCONFIG_MBEDTLS_SERVER_SSL_SESSION_TICKETS=y\nCONFIG_MBEDTLS_AES_C=y\n# CONFIG_MBEDTLS_CAMELLIA_C is not set\n# CONFIG_MBEDTLS_DES_C is not set\nCONFIG_MBEDTLS_RC4_DISABLED=y\n# CONFIG_MBEDTLS_RC4_ENABLED_NO_DEFAULT is not set\n# CONFIG_MBEDTLS_RC4_ENABLED is not set\n# CONFIG_MBEDTLS_BLOWFISH_C is not set\n# CONFIG_MBEDTLS_XTEA_C is not set\nCONFIG_MBEDTLS_CCM_C=y\nCONFIG_MBEDTLS_GCM_C=y\n# CONFIG_MBEDTLS_RIPEMD160_C is not set\nCONFIG_MBEDTLS_PEM_PARSE_C=y\nCONFIG_MBEDTLS_PEM_WRITE_C=y\nCONFIG_MBEDTLS_X509_CRL_PARSE_C=y\nCONFIG_MBEDTLS_X509_CSR_PARSE_C=y\nCONFIG_MBEDTLS_ECP_C=y\nCONFIG_MBEDTLS_ECDH_C=y\nCONFIG_MBEDTLS_ECDSA_C=y\nCONFIG_MBEDTLS_ECP_DP_SECP192R1_ENABLED=y\nCONFIG_MBEDTLS_ECP_DP_SECP224R1_ENABLED=y\nCONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y\nCONFIG_MBEDTLS_ECP_DP_SECP384R1_ENABLED=y\nCONFIG_MBEDTLS_ECP_DP_SECP521R1_ENABLED=y\nCONFIG_MBEDTLS_ECP_DP_SECP192K1_ENABLED=y\nCONFIG_MBEDTLS_ECP_DP_SECP224K1_ENABLED=y\nCONFIG_MBEDTLS_ECP_DP_SECP256K1_ENABLED=y\nCONFIG_MBEDTLS_ECP_DP_BP256R1_ENABLED=y\nCONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y\nCONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y\nCONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y\nCONFIG_MBEDTLS_ECP_NIST_OPTIM=y\n# CONFIG_util_assert is not set\n# CONFIG_ESP_SHA is not set\nCONFIG_ESP_AES=y\nCONFIG_ESP_MD5=y\nCONFIG_ESP_ARC4=y\n# CONFIG_ENABLE_MDNS is not set\nCONFIG_MQTT_PROTOCOL_311=y\nCONFIG_MQTT_TRANSPORT_SSL=y\nCONFIG_MQTT_TRANSPORT_WEBSOCKET=y\nCONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y\n# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set\n# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set\n# CONFIG_MQTT_CUSTOM_OUTBOX is not set\nCONFIG_NEWLIB_STDOUT_LINE_ENDING_CRLF=y\n# CONFIG_NEWLIB_STDOUT_LINE_ENDING_LF is not set\n# CONFIG_NEWLIB_STDOUT_LINE_ENDING_CR is not set\nCONFIG_NEWLIB_NANO_FORMAT=y\n# CONFIG_OPENSSL_DEBUG is not set\nCONFIG_OPENSSL_ASSERT_DO_NOTHING=y\n# CONFIG_OPENSSL_ASSERT_EXIT is not set\nCONFIG_PTHREAD_TASK_PRIO_DEFAULT=5\nCONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072\nCONFIG_PTHREAD_STACK_MIN=768\nCONFIG_PTHREAD_TASK_NAME_DEFAULT=\"pthread\"\nCONFIG_SPIFFS_MAX_PARTITIONS=3\nCONFIG_SPIFFS_CACHE=y\nCONFIG_SPIFFS_CACHE_WR=y\n# CONFIG_SPIFFS_CACHE_STATS is not set\nCONFIG_SPIFFS_PAGE_CHECK=y\nCONFIG_SPIFFS_GC_MAX_RUNS=10\n# CONFIG_SPIFFS_GC_STATS is not set\nCONFIG_SPIFFS_PAGE_SIZE=256\nCONFIG_SPIFFS_OBJ_NAME_LEN=32\nCONFIG_SPIFFS_USE_MAGIC=y\nCONFIG_SPIFFS_USE_MAGIC_LENGTH=y\nCONFIG_SPIFFS_META_LENGTH=4\nCONFIG_SPIFFS_USE_MTIME=y\n# CONFIG_SPIFFS_DBG is not set\n# CONFIG_SPIFFS_API_DBG is not set\n# CONFIG_SPIFFS_GC_DBG is not set\n# CONFIG_SPIFFS_CACHE_DBG is not set\n# CONFIG_SPIFFS_CHECK_DBG is not set\n# CONFIG_SPIFFS_TEST_VISUALISATION is not set\nCONFIG_IP_LOST_TIMER_INTERVAL=120\nCONFIG_TCPIP_ADAPTER_GLOBAL_DATA_LINK_IRAM=y\nCONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y\nCONFIG_VFS_SUPPORT_TERMIOS=y\nCONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1\nCONFIG_SEMIHOSTFS_HOST_PATH_MAX_LEN=128\n# CONFIG_WL_SECTOR_SIZE_512 is not set\nCONFIG_WL_SECTOR_SIZE_4096=y\nCONFIG_WL_SECTOR_SIZE=4096\n# CONFIG_ENABLE_UNIFIED_PROVISIONING is not set\nCONFIG_LTM_FAST=y\nCONFIG_WPA_MBEDTLS_CRYPTO=y\n# CONFIG_WPA_DEBUG_PRINT is not set\n# CONFIG_WPA_TESTING_OPTIONS is not set\n# CONFIG_WPA_WPS_WARS is not set\n# CONFIG_WPA_11KV_SUPPORT is not set\n\n# Deprecated options for backward compatibility\nCONFIG_TARGET_PLATFORM=\"esp8266\"\nCONFIG_TOOLPREFIX=\"xtensa-lx106-elf-\"\n# CONFIG_MAKE_WARN_UNDEFINED_VARIABLES is not set\nCONFIG_FLASHMODE_QIO=y\n# CONFIG_FLASHMODE_QOUT is not set\n# CONFIG_FLASHMODE_DIO is not set\n# CONFIG_FLASHMODE_DOUT is not set\n# CONFIG_MONITOR_BAUD_9600B is not set\n# CONFIG_MONITOR_BAUD_57600B is not set\n# CONFIG_MONITOR_BAUD_74880B is not set\nCONFIG_MONITOR_BAUD_115200B=y\n# CONFIG_MONITOR_BAUD_230400B is not set\n# CONFIG_MONITOR_BAUD_921600B is not set\n# CONFIG_MONITOR_BAUD_2MB is not set\n# CONFIG_MONITOR_BAUD_OTHER is not set\nCONFIG_MONITOR_BAUD_OTHER_VAL=74880\nCONFIG_MONITOR_BAUD=115200\nCONFIG_OPTIMIZATION_LEVEL_DEBUG=y\n# CONFIG_OPTIMIZATION_LEVEL_RELEASE is not set\nCONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y\n# CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set\n# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set\n# CONFIG_CXX_EXCEPTIONS is not set\nCONFIG_STACK_CHECK_NONE=y\n# CONFIG_STACK_CHECK_NORM is not set\n# CONFIG_STACK_CHECK_STRONG is not set\n# CONFIG_STACK_CHECK_ALL is not set\n# CONFIG_STACK_CHECK is not set\n# CONFIG_WARN_WRITE_STRINGS is not set\nCONFIG_MAIN_TASK_STACK_SIZE=3584\nCONFIG_CONSOLE_UART_DEFAULT=y\n# CONFIG_CONSOLE_UART_CUSTOM is not set\n# CONFIG_CONSOLE_UART_NONE is not set\nCONFIG_CONSOLE_UART_NUM=0\nCONFIG_CONSOLE_UART_BAUDRATE=74880\n# CONFIG_UART0_SWAP_IO is not set\nCONFIG_TASK_WDT=y\nCONFIG_TASK_WDT_PANIC=y\nCONFIG_TASK_WDT_TIMEOUT_S=15\nCONFIG_MB_MASTER_TIMEOUT_MS_RESPOND=150\nCONFIG_MB_MASTER_DELAY_MS_CONVERT=200\nCONFIG_MB_QUEUE_LENGTH=20\nCONFIG_MB_SERIAL_TASK_STACK_SIZE=4096\nCONFIG_MB_SERIAL_BUF_SIZE=256\nCONFIG_MB_SERIAL_TASK_PRIO=10\nCONFIG_MB_CONTROLLER_SLAVE_ID_SUPPORT=y\nCONFIG_MB_CONTROLLER_SLAVE_ID=0x00112233\nCONFIG_MB_CONTROLLER_NOTIFY_TIMEOUT=20\nCONFIG_MB_CONTROLLER_NOTIFY_QUEUE_SIZE=20\nCONFIG_MB_CONTROLLER_STACK_SIZE=4096\nCONFIG_MB_EVENT_QUEUE_TIMEOUT=20\nCONFIG_MB_TIMER_GROUP=0\nCONFIG_MB_TIMER_INDEX=0\n# CONFIG_L2_TO_L3_COPY is not set\n# CONFIG_USE_ONLY_LWIP_SELECT is not set\nCONFIG_ESP_GRATUITOUS_ARP=y\nCONFIG_GARP_TMR_INTERVAL=60\nCONFIG_TCPIP_RECVMBOX_SIZE=32\nCONFIG_TCP_MAXRTX=12\nCONFIG_TCP_SYNMAXRTX=6\nCONFIG_TCP_MSS=1440\nCONFIG_TCP_MSL=60000\nCONFIG_TCP_SND_BUF_DEFAULT=2880\nCONFIG_TCP_WND_DEFAULT=5760\nCONFIG_TCP_RECVMBOX_SIZE=6\nCONFIG_TCP_QUEUE_OOSEQ=y\n# CONFIG_ESP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set\nCONFIG_TCP_OVERSIZE_MSS=y\n# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set\n# CONFIG_TCP_OVERSIZE_DISABLE is not set\nCONFIG_UDP_RECVMBOX_SIZE=6\nCONFIG_TCPIP_TASK_STACK_SIZE=2048\nCONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y\n# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set\nCONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF\n# CONFIG_PPP_SUPPORT is not set\nCONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5\nCONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072\nCONFIG_ESP32_PTHREAD_STACK_MIN=768\nCONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT=\"pthread\"\nCONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y\nCONFIG_SUPPORT_TERMIOS=y\n# End of deprecated options\n"
  },
  {
    "path": "tutorials/http/http-client/main.c",
    "content": "// Copyright (c) 2021 Cesanta Software Limited\n// All rights reserved\n//\n// Example HTTP client. Connect to `s_url`, send request, wait for a response,\n// print the response and exit.\n// You can change `s_url` from the command line by executing: ./example YOUR_URL\n//\n// To enable SSL/TLS, , see https://mongoose.ws/tutorials/tls/#how-to-build\n\n#include \"mongoose.h\"\n\n// The very first web page in history. You can replace it from command line\nstatic const char *s_url = \"http://info.cern.ch/\";\nstatic struct mg_str s_ca_pem;              // CA PEM file\nstatic const char *s_post_data = NULL;      // POST data\nstatic const uint64_t s_timeout_ms = 1500;  // Connect timeout in milliseconds\n\n// Print HTTP response and signal that we're done\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_OPEN) {\n    // Connection created. Store connect expiration time in c->data\n    *(uint64_t *) c->data = mg_millis() + s_timeout_ms;\n  } else if (ev == MG_EV_POLL) {\n    if (mg_millis() > *(uint64_t *) c->data &&\n        (c->is_connecting || c->is_resolving)) {\n      mg_error(c, \"Connect timeout\");\n    }\n  } else if (ev == MG_EV_CONNECT) {\n    // Connected to server. Extract host name from URL\n    struct mg_str host = mg_url_host(s_url);\n\n    if (c->is_tls) {\n      struct mg_tls_opts opts = {.ca = s_ca_pem, .name = mg_url_host(s_url)};\n      mg_tls_init(c, &opts);\n    }\n\n    // Send request\n    int content_length = s_post_data ? strlen(s_post_data) : 0;\n    mg_printf(c,\n              \"%s %s HTTP/1.0\\r\\n\"\n              \"Host: %.*s\\r\\n\"\n              \"Content-Type: octet-stream\\r\\n\"\n              \"Content-Length: %d\\r\\n\"\n              \"\\r\\n\",\n              s_post_data ? \"POST\" : \"GET\", mg_url_uri(s_url), (int) host.len,\n              host.buf, content_length);\n    mg_send(c, s_post_data, content_length);\n  } else if (ev == MG_EV_HTTP_MSG) {\n    // Response is received. Print it\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    printf(\"%.*s\", (int) hm->message.len, hm->message.buf);\n    c->is_draining = 1;           // Tell mongoose to close this connection\n    *(bool *) c->fn_data = true;  // Tell event loop to stop\n  } else if (ev == MG_EV_ERROR) {\n    *(bool *) c->fn_data = true;  // Error, tell event loop to stop\n  }\n}\n\nint main(int argc, char *argv[]) {\n  struct mg_mgr mgr;  // Event manager\n  bool done = false;  // Event handler flips it to true\n  int i, log_level = MG_LL_DEBUG;\n\n  // Parse command-line flags\n  for (i = 1; i + 1 < argc; i++) {\n    if (strcmp(argv[i], \"-ca\") == 0) {\n      s_ca_pem = mg_file_read(&mg_fs_posix, argv[++i]);\n    } else if (strcmp(argv[i], \"-post\") == 0) {\n      s_post_data = argv[++i];\n    } else if (strcmp(argv[i], \"-url\") == 0) {\n      s_url = argv[++i];\n    } else if (strcmp(argv[i], \"-v\") == 0) {\n      log_level = atoi(argv[++i]);\n    } else {\n      fprintf(stderr,\n              \"Usage: %s OPTIONS\\n\"\n              \"  -ca PEM     - TLS CA PEM file path, default: not set\\n\"\n              \"  -post DATA  - data to POST, default: not set\\n\"\n              \"  -url URL    - URL to fetch, default: %s\\n\"\n              \"  -v LEVEL    - debug level, from 0 to 4, default: %d\\n\",\n              argv[0], s_url, log_level);\n      exit(EXIT_FAILURE);\n    }\n  }\n\n  mg_mgr_init(&mgr);                        // Initialise event manager\n  mg_log_set(log_level);                    // Set log level\n  mg_http_connect(&mgr, s_url, fn, &done);  // Create client connection\n  while (!done) mg_mgr_poll(&mgr, 50);      // Event manager loops until 'done'\n  mg_mgr_free(&mgr);                        // Free resources\n\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/http/http-client/packed_fs.c",
    "content": "#include <stddef.h>\n#include <string.h>\n#include <time.h>\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\nconst char *mg_unlist(size_t no);\nconst char *mg_unpack(const char *, size_t *, time_t *);\n#if defined(__cplusplus)\n}\n#endif\n\nstatic const unsigned char v1[] = {\n  45,  32,  77,  97, 107, 101,  32, 115, 117, 114, 101,  32, // - Make sure \n 121, 111, 117, 114,  32,  80,  69,  77,  32, 102, 105, 108, // your PEM fil\n 101,  32, 115, 116,  97, 114, 116, 115,  32, 119, 105, 116, // e starts wit\n 104,  32,  97,  32, 100,  97, 115, 104,  32,  45,  10,  10, // h a dash -..\n  10,  45,  45,  45,  45,  45,  66,  69,  71,  73,  78,  32, // .-----BEGIN \n  67,  69,  82,  84,  73,  70,  73,  67,  65,  84,  69,  45, // CERTIFICATE-\n  45,  45,  45,  45,  10,  77,  73,  73,  69,  86, 122,  67, // ----.MIIEVzC\n  67,  65, 106,  43, 103,  65, 119,  73,  66,  65, 103,  73, // CAj+gAwIBAgI\n  82,  65,  76,  66,  88,  80, 112,  70, 122, 108, 121, 100, // RALBXPpFzlyd\n 119,  50,  55,  83,  72, 121, 122, 112,  70,  75, 122, 103, // w27SHyzpFKzg\n 119,  68,  81,  89,  74,  75, 111,  90,  73, 104, 118,  99, // wDQYJKoZIhvc\n  78,  65,  81,  69,  76,  66,  81,  65, 119,  10,  84, 122, // NAQELBQAw.Tz\n  69,  76,  77,  65, 107,  71,  65,  49,  85,  69,  66, 104, // ELMAkGA1UEBh\n  77,  67,  86,  86,  77, 120,  75,  84,  65, 110,  66, 103, // MCVVMxKTAnBg\n  78,  86,  66,  65, 111,  84,  73,  69, 108, 117, 100,  71, // NVBAoTIEludG\n  86, 121,  98, 109,  86,  48,  73,  70,  78, 108,  89,  51, // VybmV0IFNlY3\n  86, 121,  97,  88,  82,  53,  73,  70,  74, 108,  99,  50, // VyaXR5IFJlc2\n  86, 104,  10,  99, 109,  78, 111,  73,  69, 100, 121,  98, // Vh.cmNoIEdyb\n  51,  86, 119,  77,  82,  85, 119,  69, 119,  89,  68,  86, // 3VwMRUwEwYDV\n  81,  81,  68,  69, 119, 120,  74,  85,  49,  74,  72,  73, // QQDEwxJU1JHI\n  70,  74, 118,  98,  51,  81, 103,  87,  68,  69, 119,  72, // FJvb3QgWDEwH\n 104,  99,  78,  77, 106,  81, 119,  77, 122,  69, 122,  77, // hcNMjQwMzEzM\n  68,  65, 119,  77,  68,  65, 119,  10,  87, 104,  99,  78, // DAwMDAw.WhcN\n  77, 106,  99, 119,  77, 122,  69, 121,  77, 106,  77,  49, // MjcwMzEyMjM1\n  79,  84,  85,  53,  87, 106,  65, 121,  77,  81, 115, 119, // OTU5WjAyMQsw\n  67,  81,  89,  68,  86,  81,  81,  71,  69, 119,  74,  86, // CQYDVQQGEwJV\n  85, 122,  69,  87,  77,  66,  81,  71,  65,  49,  85,  69, // UzEWMBQGA1UE\n  67, 104,  77,  78,  84,  71,  86,  48,  74,  51,  77, 103, // ChMNTGV0J3Mg\n  10,  82,  87,  53, 106,  99, 110, 108, 119, 100,  68,  69, // .RW5jcnlwdDE\n  76,  77,  65, 107,  71,  65,  49,  85,  69,  65, 120,  77, // LMAkGA1UEAxM\n  67,  82,  84,  89, 119, 100, 106,  65,  81,  66, 103,  99, // CRTYwdjAQBgc\n 113, 104, 107, 106,  79,  80,  81,  73,  66,  66, 103,  85, // qhkjOPQIBBgU\n 114, 103,  81,  81,  65,  73, 103,  78, 105,  65,  65,  84, // rgQQAIgNiAAT\n  90,  56,  90,  53,  71,  10, 104,  47, 103, 104,  99,  87, // Z8Z5G.h/ghcW\n  67, 111,  74, 117, 117, 106,  43, 114, 110, 113,  50, 104, // CoJuuj+rnq2h\n  50,  53,  69, 113, 102,  85,  74, 116, 108,  82,  70,  76, // 25EqfUJtlRFL\n  70, 104, 102,  72,  87,  87, 118, 121,  73,  76,  79,  82, // FhfHWWvyILOR\n  47,  86, 118, 116,  69,  75,  82, 113, 111, 116,  80,  69, // /VvtEKRqotPE\n 111,  74, 104,  67,  54,  43,  81,  74,  86,  86,  10,  54, // oJhC6+QJVV.6\n  82, 108,  65,  78,  50,  90,  49,  55,  84,  74,  79, 100, // RlAN2Z17TJOd\n 119,  82,  74,  43,  72,  66,  55, 119, 120, 106, 110, 122, // wRJ+HB7wxjnz\n 118, 100, 120,  69,  80,  54, 115, 100,  78, 103,  65,  49, // vdxEP6sdNgA1\n  79,  49, 116,  72,  72,  77,  87,  77, 120,  67,  99,  79, // O1tHHMWMxCcO\n 114,  76, 113,  98,  71,  76,  48, 118,  98, 105, 106, 103, // rLqbGL0vbijg\n 102, 103, 119,  10, 103, 102,  85, 119,  68, 103,  89,  68, // fgw.gfUwDgYD\n  86,  82,  48,  80,  65,  81,  72,  47,  66,  65,  81,  68, // VR0PAQH/BAQD\n  65, 103,  71,  71,  77,  66,  48,  71,  65,  49,  85, 100, // AgGGMB0GA1Ud\n  74,  81,  81,  87,  77,  66,  81,  71,  67,  67, 115,  71, // JQQWMBQGCCsG\n  65,  81,  85,  70,  66, 119,  77,  67,  66, 103, 103, 114, // AQUFBwMCBggr\n  66, 103,  69,  70,  66,  81,  99,  68,  10,  65,  84,  65, // BgEFBQcD.ATA\n  83,  66, 103,  78,  86,  72,  82,  77,  66,  65, 102,  56, // SBgNVHRMBAf8\n  69,  67,  68,  65,  71,  65,  81,  72,  47,  65, 103,  69, // ECDAGAQH/AgE\n  65,  77,  66,  48,  71,  65,  49,  85, 100,  68, 103,  81, // AMB0GA1UdDgQ\n  87,  66,  66,  83,  84,  74,  48,  97,  89,  65,  54, 108, // WBBSTJ0aYA6l\n  82,  97,  73,  54,  89,  49, 115,  82,  67,  83,  78, 115, // RaI6Y1sRCSNs\n 106,  10, 118,  49, 105,  85,  48, 106,  65, 102,  66, 103, // j.v1iU0jAfBg\n  78,  86,  72,  83,  77,  69,  71,  68,  65,  87, 103,  66, // NVHSMEGDAWgB\n  82,  53, 116,  70, 110, 109, 101,  55,  98, 108,  53,  65, // R5tFnme7bl5A\n  70, 122, 103,  65, 105,  73, 121,  66, 112,  89,  57, 117, // FzgAiIyBpY9u\n 109,  98,  98, 106,  65, 121,  66, 103, 103, 114,  66, 103, // mbbjAyBggrBg\n  69,  70,  66,  81,  99,  66,  10,  65,  81,  81, 109,  77, // EFBQcB.AQQmM\n  67,  81, 119,  73, 103,  89,  73,  75, 119,  89,  66,  66, // CQwIgYIKwYBB\n  81,  85,  72,  77,  65,  75,  71,  70, 109, 104,  48, 100, // QUHMAKGFmh0d\n  72,  65,  54,  76, 121,  57,  52,  77,  83,  53, 112,  76, // HA6Ly94MS5pL\n 109, 120, 108,  98, 109,  78, 121,  76, 109,  57, 121,  90, // mxlbmNyLm9yZ\n 121,  56, 119,  69, 119,  89,  68,  86,  82,  48, 103,  10, // y8wEwYDVR0g.\n  66,  65, 119, 119,  67, 106,  65,  73,  66, 103,  90, 110, // BAwwCjAIBgZn\n 103,  81, 119,  66,  65, 103,  69, 119,  74, 119,  89,  68, // gQwBAgEwJwYD\n  86,  82,  48, 102,  66,  67,  65, 119,  72, 106,  65,  99, // VR0fBCAwHjAc\n 111,  66, 113, 103,  71,  73,  89,  87,  97,  72,  82,  48, // oBqgGIYWaHR0\n  99,  68, 111, 118,  76,  51, 103, 120,  76, 109,  77, 117, // cDovL3gxLmMu\n  98,  71,  86, 117,  10,  89,  51,  73, 117,  98,  51,  74, // bGVu.Y3Iub3J\n 110,  76, 122,  65,  78,  66, 103, 107, 113, 104, 107, 105, // nLzANBgkqhki\n  71,  57, 119,  48,  66,  65,  81, 115,  70,  65,  65,  79, // G9w0BAQsFAAO\n  67,  65, 103,  69,  65, 102,  89, 116,  55,  83, 105,  65, // CAgEAfYt7SiA\n  49, 115, 103,  87,  71,  67,  73, 112, 117, 110, 107,  52, // 1sgWGCIpunk4\n  54, 114,  52,  65,  69, 120,  73,  82,  99,  10,  77, 120, // 6r4AExIRc.Mx\n 107,  75, 103,  85, 104,  78, 108, 114, 114, 118,  49,  66, // kKgUhNlrrv1B\n  50,  49, 104,  79,  97,  88,  78,  47,  53, 109, 105,  69, // 21hOaXN/5miE\n  43,  76,  79,  84,  98, 114,  99, 109,  85,  47,  77,  57, // +LOTbrcmU/M9\n 121, 118,  67,  54,  77,  86,  89,  55,  51,  48,  71,  78, // yvC6MVY730GN\n  70, 111,  76,  56,  73, 104,  74,  56, 106,  56, 118, 114, // FoL8IhJ8j8vr\n  79,  76,  10, 112,  77,  89,  50,  50,  79,  80,  54,  98, // OL.pMY22OP6b\n  97,  83,  49, 107,  57,  89,  77, 114, 116,  68,  84, 108, // aS1k9YMrtDTl\n 119,  74,  72, 111,  71,  98, 121,  48,  52,  84, 104,  84, // wJHoGby04ThT\n  85, 101,  66,  68, 107, 115,  83,  57,  82, 105, 117,  72, // UeBDksS9RiuH\n 118, 105,  99,  90, 113,  66, 101, 100,  81, 100,  73,  70, // vicZqBedQdIF\n  54,  53, 112,  90, 117, 104, 112,  10, 101,  68,  99,  71, // 65pZuhp.eDcG\n  66,  99,  76, 105,  89,  97, 115,  81, 114,  47,  69,  79, // BcLiYasQr/EO\n  53, 103, 120, 120, 116,  76, 121,  84, 109, 103, 115,  72, // 5gxxtLyTmgsH\n  83,  79,  86,  83,  66,  99,  70,  79, 110,  57, 108, 103, // SOVSBcFOn9lg\n 118,  55,  76,  69,  67,  80, 113,  57, 105,  55, 109, 102, // v7LECPq9i7mf\n  72,  51, 109, 112, 120, 103, 114,  82,  75,  83, 120,  72, // H3mpxgrRKSxH\n  10, 112,  79, 111,  90,  48,  75,  88,  77,  99,  66,  43, // .pOoZ0KXMcB+\n 104,  72, 117, 118, 108, 107, 108,  72, 110, 116, 118,  99, // hHuvlklHntvc\n  73,  48, 109,  77,  77,  81,  48, 109, 104,  89, 106,  54, // I0mMMQ0mhYj6\n 113, 116,  77,  70,  83, 116, 107,  70,  49,  82, 112,  67, // qtMFStkF1RpC\n  71,  51,  73,  80, 100,  73, 119, 112,  86,  67,  81, 113, // G3IPdIwpVCQq\n 117,  56,  71,  86,  55,  10, 115,  56, 117,  98, 107, 110, // u8GV7.s8ubkn\n  82, 122, 115,  43,  51,  67,  47,  66, 109,  49,  57,  82, // Rzs+3C/Bm19R\n  70,  79, 111, 105,  80, 112,  68, 107, 119, 118, 121,  78, // FOoiPpDkwvyN\n 102, 118, 109,  81,  49,  52,  88, 107, 121, 113, 113,  75, // fvmQ14XkyqqK\n  75,  53, 111,  90,  56, 122, 104,  68,  51,  50, 107,  70, // K5oZ8zhD32kF\n  82,  81, 107, 120,  97,  56, 117,  90,  83, 117,  10, 104, // RQkxa8uZSu.h\n  52,  97,  84,  73, 109,  70, 120, 107, 110, 117,  51,  57, // 4aTImFxknu39\n 119,  97,  66, 120,  73,  82,  88,  69,  52, 106,  75, 120, // waBxIRXE4jKx\n 108,  65, 109,  81,  99,  52,  81, 106,  70,  90, 111, 113, // lAmQc4QjFZoq\n  49,  75, 109,  81, 113,  81, 103,  48,  74,  47,  49,  74, // 1KmQqQg0J/1J\n  70,  56,  82, 108,  70, 118,  74,  97, 115,  49,  86,  99, // F8RlFvJas1Vc\n 106,  76, 118,  10,  89, 108, 118,  85,  66,  50, 116,  54, // jLv.YlvUB2t6\n 110, 112,  79,  54, 111,  81, 106,  66,  51, 108,  43,  80, // npO6oQjB3l+P\n  78, 102,  48,  68, 112,  81,  72,  55, 105,  85, 120,  51, // Nf0DpQH7iUx3\n  87, 122,  53,  65, 106,  81,  67, 105,  54,  76,  50,  53, // Wz5AjQCi6L25\n  70, 106, 121,  69,  48,  54, 113,  54,  66,  90,  47,  81, // FjyE06q6BZ/Q\n 108, 109, 116,  89, 100, 108,  47,  56,  10,  90,  89,  97, // lmtYdl/8.ZYa\n 111,  52,  83,  82, 113,  80,  69, 115,  47,  54,  99,  65, // o4SRqPEs/6cA\n 105,  70,  43,  81, 102,  53, 122, 103,  50,  85, 107,  97, // iF+Qf5zg2Uka\n  87, 116,  68, 112, 104, 108,  49,  76,  75,  77, 117,  84, // WtDphl1LKMuT\n  78,  76, 111, 116, 118, 115,  88,  57,  57,  72,  80,  54, // NLotvsX99HP6\n  57,  86,  50, 102,  97,  78, 121, 101, 103, 111, 100,  81, // 9V2faNyegodQ\n  48,  10,  76, 121,  84,  65, 112, 114,  47, 118,  84,  48, // 0.LyTApr/vT0\n  49,  89,  80,  69,  52,  54, 118,  78, 115,  68,  76, 103, // 1YPE46vNsDLg\n  75,  43,  52,  99,  76,  54,  84, 114, 122,  67,  47,  97, // K+4cL6TrzC/a\n  52,  87,  99, 109,  70,  53,  83,  82,  74,  57,  51,  56, // 4WcmF5SRJ938\n 122, 114, 118,  47, 100, 117,  74,  72,  76,  88,  81,  73, // zrv/duJHLXQI\n 107, 117,  53, 118,  48,  43,  10,  69, 119,  79, 121,  53, // ku5v0+.EwOy5\n  57,  72, 100, 109,  48,  80,  84,  47,  69, 114,  47,  56, // 9Hdm0PT/Er/8\n  52, 100,  68,  86,  48,  67,  83, 106, 100,  82,  47,  50, // 4dDV0CSjdR/2\n  88, 117,  90,  77,  51, 107, 112, 121, 115,  83,  75,  76, // XuZM3kpysSKL\n 103,  68,  49,  99,  75, 105,  68,  65,  43,  73,  82, 103, // gD1cKiDA+IRg\n 117,  79,  68,  67, 120, 102,  79,  57,  99, 121,  89,  10, // uODCxfO9cyY.\n  73, 103,  52,  54, 118,  57, 109,  70, 109,  66, 118, 121, // Ig46v9mFmBvy\n  72,  48,  52,  61,  10,  45,  45,  45,  45,  45,  69,  78, // H04=.-----EN\n  68,  32,  67,  69,  82,  84,  73,  70,  73,  67,  65,  84, // D CERTIFICAT\n  69,  45,  45,  45,  45,  45,  10,  10,  73, 115, 115, 117, // E-----..Issu\n 101, 114,  58,  32,  67,  61,  85,  83,  44,  32,  79,  61, // er: C=US, O=\n  73, 110, 116, 101, 114, 110, 101, 116,  32,  83, 101,  99, // Internet Sec\n 117, 114, 105, 116, 121,  32,  82, 101, 115, 101,  97, 114, // urity Resear\n  99, 104,  32,  71, 114, 111, 117, 112,  44,  32,  67,  78, // ch Group, CN\n  61,  73,  83,  82,  71,  32,  82, 111, 111, 116,  32,  88, // =ISRG Root X\n  49,  10,  78, 111, 116,  32,  66, 101, 102, 111, 114, 101, // 1.Not Before\n  58,  32,  77,  97, 114,  32,  49,  51,  32,  48,  48,  58, // : Mar 13 00:\n  48,  48,  58,  48,  48,  32,  50,  48,  50,  52,  32,  71, // 00:00 2024 G\n  77,  84,  10,  78, 111, 116,  32,  65, 102, 116, 101, 114, // MT.Not After\n  32,  58,  32,  77,  97, 114,  32,  49,  50,  32,  50,  51, //  : Mar 12 23\n  58,  53,  57,  58,  53,  57,  32,  50,  48,  50,  55,  32, // :59:59 2027 \n  71,  77,  84,  10,  45,  45,  45,  45,  45,  66,  69,  71, // GMT.-----BEG\n  73,  78,  32,  67,  69,  82,  84,  73,  70,  73,  67,  65, // IN CERTIFICA\n  84,  69,  45,  45,  45,  45,  45,  10,  77,  73,  73,  69, // TE-----.MIIE\n  86, 122,  67,  67,  65, 106,  43, 103,  65, 119,  73,  66, // VzCCAj+gAwIB\n  65, 103,  73,  82,  65,  73,  79,  80,  98,  71,  80,  79, // AgIRAIOPbGPO\n 115,  84, 109,  77,  89, 103,  90, 105, 103, 120,  88,  74, // sTmMYgZigxXJ\n  47, 100,  52, 119,  68,  81,  89,  74,  75, 111,  90,  73, // /d4wDQYJKoZI\n 104, 118,  99,  78,  65,  81,  69,  76,  66,  81,  65, 119, // hvcNAQELBQAw\n  10,  84, 122,  69,  76,  77,  65, 107,  71,  65,  49,  85, // .TzELMAkGA1U\n  69,  66, 104,  77,  67,  86,  86,  77, 120,  75,  84,  65, // EBhMCVVMxKTA\n 110,  66, 103,  78,  86,  66,  65, 111,  84,  73,  69, 108, // nBgNVBAoTIEl\n 117, 100,  71,  86, 121,  98, 109,  86,  48,  73,  70,  78, // udGVybmV0IFN\n 108,  89,  51,  86, 121,  97,  88,  82,  53,  73,  70,  74, // lY3VyaXR5IFJ\n 108,  99,  50,  86, 104,  10,  99, 109,  78, 111,  73,  69, // lc2Vh.cmNoIE\n 100, 121,  98,  51,  86, 119,  77,  82,  85, 119,  69, 119, // dyb3VwMRUwEw\n  89,  68,  86,  81,  81,  68,  69, 119, 120,  74,  85,  49, // YDVQQDEwxJU1\n  74,  72,  73,  70,  74, 118,  98,  51,  81, 103,  87,  68, // JHIFJvb3QgWD\n  69, 119,  72, 104,  99,  78,  77, 106,  81, 119,  77, 122, // EwHhcNMjQwMz\n  69, 122,  77,  68,  65, 119,  77,  68,  65, 119,  10,  87, // EzMDAwMDAw.W\n 104,  99,  78,  77, 106,  99, 119,  77, 122,  69, 121,  77, // hcNMjcwMzEyM\n 106,  77,  49,  79,  84,  85,  53,  87, 106,  65, 121,  77, // jM1OTU5WjAyM\n  81, 115, 119,  67,  81,  89,  68,  86,  81,  81,  71,  69, // QswCQYDVQQGE\n 119,  74,  86,  85, 122,  69,  87,  77,  66,  81,  71,  65, // wJVUzEWMBQGA\n  49,  85,  69,  67, 104,  77,  78,  84,  71,  86,  48,  74, // 1UEChMNTGV0J\n  51,  77, 103,  10,  82,  87,  53, 106,  99, 110, 108, 119, // 3Mg.RW5jcnlw\n 100,  68,  69,  76,  77,  65, 107,  71,  65,  49,  85,  69, // dDELMAkGA1UE\n  65, 120,  77,  67,  82,  84,  85, 119, 100, 106,  65,  81, // AxMCRTUwdjAQ\n  66, 103,  99, 113, 104, 107, 106,  79,  80,  81,  73,  66, // BgcqhkjOPQIB\n  66, 103,  85, 114, 103,  81,  81,  65,  73, 103,  78, 105, // BgUrgQQAIgNi\n  65,  65,  81,  78,  67, 122, 113,  75,  10,  97,  50,  71, // AAQNCzqK.a2G\n  79, 116, 117,  47,  99,  88,  49, 106, 110, 120, 107,  74, // Otu/cX1jnxkJ\n  70,  86,  75, 116, 106,  57, 109,  90, 104,  83,  65, 111, // FVKtj9mZhSAo\n 117,  87,  88,  87,  48, 103,  81,  73,  51,  85,  76,  99, // uWXW0gQI3ULc\n  47,  70, 110, 110,  99, 109,  79, 121, 104,  75,  74, 100, // /FnncmOyhKJd\n 121,  73,  66, 119, 115, 122,  57,  86,  56,  85, 105,  66, // yIBwsz9V8UiB\n  79,  10,  86,  72, 104,  98, 104,  66,  82, 114, 119,  74, // O.VHhbhBRrwJ\n  67, 117, 104, 101, 122,  65,  85,  85,  69,  56,  87, 111, // CuhezAUUE8Wo\n 100,  47,  66, 107,  51,  85,  47, 109,  68,  82,  43, 109, // d/Bk3U/mDR+m\n 119, 116,  52,  88,  50,  86,  69,  73, 105, 105,  67,  70, // wt4X2VEIiiCF\n  81,  80, 109,  82, 112,  77,  53, 117, 111,  75, 114,  78, // QPmRpM5uoKrN\n 105, 106, 103, 102, 103, 119,  10, 103, 102,  85, 119,  68, // ijgfgw.gfUwD\n 103,  89,  68,  86,  82,  48,  80,  65,  81,  72,  47,  66, // gYDVR0PAQH/B\n  65,  81,  68,  65, 103,  71,  71,  77,  66,  48,  71,  65, // AQDAgGGMB0GA\n  49,  85, 100,  74,  81,  81,  87,  77,  66,  81,  71,  67, // 1UdJQQWMBQGC\n  67, 115,  71,  65,  81,  85,  70,  66, 119,  77,  67,  66, // CsGAQUFBwMCB\n 103, 103, 114,  66, 103,  69,  70,  66,  81,  99,  68,  10, // ggrBgEFBQcD.\n  65,  84,  65,  83,  66, 103,  78,  86,  72,  82,  77,  66, // ATASBgNVHRMB\n  65, 102,  56,  69,  67,  68,  65,  71,  65,  81,  72,  47, // Af8ECDAGAQH/\n  65, 103,  69,  65,  77,  66,  48,  71,  65,  49,  85, 100, // AgEAMB0GA1Ud\n  68, 103,  81,  87,  66,  66,  83, 102,  75,  49,  47,  80, // DgQWBBSfK1/P\n  80,  67,  70,  80, 110,  81,  83,  51,  55,  83, 115, 115, // PCFPnQS37Sss\n 120,  77,  90, 119,  10, 105,  57,  76,  88,  68,  84,  65, // xMZw.i9LXDTA\n 102,  66, 103,  78,  86,  72,  83,  77,  69,  71,  68,  65, // fBgNVHSMEGDA\n  87, 103,  66,  82,  53, 116,  70, 110, 109, 101,  55,  98, // WgBR5tFnme7b\n 108,  53,  65,  70, 122, 103,  65, 105,  73, 121,  66, 112, // l5AFzgAiIyBp\n  89,  57, 117, 109,  98,  98, 106,  65, 121,  66, 103, 103, // Y9umbbjAyBgg\n 114,  66, 103,  69,  70,  66,  81,  99,  66,  10,  65,  81, // rBgEFBQcB.AQ\n  81, 109,  77,  67,  81, 119,  73, 103,  89,  73,  75, 119, // QmMCQwIgYIKw\n  89,  66,  66,  81,  85,  72,  77,  65,  75,  71,  70, 109, // YBBQUHMAKGFm\n 104,  48, 100,  72,  65,  54,  76, 121,  57,  52,  77,  83, // h0dHA6Ly94MS\n  53, 112,  76, 109, 120, 108,  98, 109,  78, 121,  76, 109, // 5pLmxlbmNyLm\n  57, 121,  90, 121,  56, 119,  69, 119,  89,  68,  86,  82, // 9yZy8wEwYDVR\n  48, 103,  10,  66,  65, 119, 119,  67, 106,  65,  73,  66, // 0g.BAwwCjAIB\n 103,  90, 110, 103,  81, 119,  66,  65, 103,  69, 119,  74, // gZngQwBAgEwJ\n 119,  89,  68,  86,  82,  48, 102,  66,  67,  65, 119,  72, // wYDVR0fBCAwH\n 106,  65,  99, 111,  66, 113, 103,  71,  73,  89,  87,  97, // jAcoBqgGIYWa\n  72,  82,  48,  99,  68, 111, 118,  76,  51, 103, 120,  76, // HR0cDovL3gxL\n 109,  77, 117,  98,  71,  86, 117,  10,  89,  51,  73, 117, // mMubGVu.Y3Iu\n  98,  51,  74, 110,  76, 122,  65,  78,  66, 103, 107, 113, // b3JnLzANBgkq\n 104, 107, 105,  71,  57, 119,  48,  66,  65,  81, 115,  70, // hkiG9w0BAQsF\n  65,  65,  79,  67,  65, 103,  69,  65,  72,  51,  75, 100, // AAOCAgEAH3Kd\n  78,  69,  86,  67,  81, 100, 113, 107,  48,  76,  75, 121, // NEVCQdqk0LKy\n 117,  78,  73, 109,  84,  75, 100,  82,  74,  89,  49,  67, // uNImTKdRJY1C\n  10,  50, 117, 119,  50,  83,  74,  97, 106, 117, 104, 113, // .2uw2SJajuhq\n 107, 121,  71,  80,  89,  56,  67,  43, 122, 122, 115, 117, // kyGPY8C+zzsu\n 102,  90,  43, 109, 103, 110, 104, 110, 113,  49,  65,  50, // fZ+mgnhnq1A2\n  75,  86,  81,  79,  83, 121, 107,  79,  69, 110,  85,  98, // KVQOSykOEnUb\n 120,  49,  99, 121,  54,  51,  55, 114,  66,  65, 105, 104, // x1cy637rBAih\n 120,  57,  55, 114,  43,  10,  98,  99, 119,  98,  90,  77, // x97r+.bcwbZM\n  54, 115,  84,  68,  73,  97,  69, 114, 105,  82,  47,  80, // 6sTDIaEriR/P\n  76, 107,  54,  76,  75, 115,  57,  66, 101,  48, 117, 111, // Lk6LKs9Be0uo\n  86, 120, 103,  79,  75,  68,  99, 112,  71,  57, 115, 118, // VxgOKDcpG9sv\n  68,  51,  51,  74,  43,  71,  57,  76,  99, 102, 118,  49, // D33J+G9Lcfv1\n  75,  57, 108, 117,  68, 109,  83,  84, 103,  71,  10,  54, // K9luDmSTgG.6\n  88,  78,  70,  73,  78,  53, 118, 102,  73,  53, 103, 115, // XNFIN5vfI5gs\n  47, 108,  77,  80, 121, 111, 106,  69,  77, 100,  73, 122, // /lMPyojEMdIz\n  75,  57,  98, 108,  99, 108,  50,  47,  49, 118,  75, 120, // K9blcl2/1vKx\n  79,  56,  87,  71,  67,  99, 106, 118, 115,  81,  49, 110, // O8WGCcjvsQ1n\n  74,  47,  80, 119, 116,  56,  76,  81,  90,  66, 102,  79, // J/Pwt8LQZBfO\n  70, 121,  86,  10,  88,  80,  56, 117,  98,  65, 112,  47, // FyV.XP8ubAp/\n  97, 117,  51, 100,  99,  52,  69,  75,  87,  71,  57,  77, // au3dc4EKWG9M\n  79,  53, 122,  99, 120,  49, 113,  84,  57,  43,  78,  88, // O5zcx1qT9+NX\n  82,  71, 100,  86,  87, 120,  71, 118, 109,  66,  70,  82, // RGdVWxGvmBFR\n  65,  97, 106,  99, 105,  77, 102,  88,  77,  69,  49,  90, // AajciMfXME1Z\n 117,  71, 109, 107,  51,  47,  71,  79,  10, 107, 111,  65, // uGmk3/GO.koA\n  77,  55,  90, 107, 106,  90, 109, 108, 101, 121, 111, 107, // M7ZkjZmleyok\n  80,  49,  76,  71, 122, 109, 102,  74,  99,  85, 100,  57, // P1LGzmfJcUd9\n 115,  55, 101, 101, 117,  49,  47,  57,  47, 101, 103,  53, // s7eeu1/9/eg5\n  88, 108,  88, 100,  47,  53,  53,  71, 116,  89, 106,  65, // XlXd/55GtYjA\n  77,  43,  67,  52,  68,  71,  53, 105,  55, 101,  97,  78, // M+C4DG5i7eaN\n 113,  10,  99, 109,  50,  70,  43, 121, 120,  89,  73,  80, // q.cm2F+yxYIP\n 116,  54,  99,  98,  98, 116,  89,  86,  78,  74,  67,  71, // t6cbbtYVNJCG\n 102,  72,  87, 113,  72,  69,  81,  52,  70,  89,  83, 116, // fHWqHEQ4FYSt\n  85, 121,  70, 110, 118,  56, 115, 106, 121, 113,  85,  56, // UyFnv8sjyqU8\n 121, 112, 103,  90,  97,  78,  74,  57,  97,  86,  99,  87, // ypgZaNJ9aVcW\n  83,  73,  67,  76,  79,  73,  10,  69,  49,  47,  81, 118, // SICLOI.E1/Qv\n  47,  55, 111,  75, 115, 110,  90,  67,  87,  74,  57,  50, // /7oKsnZCWJ92\n  54, 119,  85,  54,  82, 113,  71,  49,  79,  89,  80,  71, // 6wU6RqG1OYPG\n  79, 105,  49, 122, 117,  65,  66, 104,  76, 119,  54,  49, // Oi1zuABhLw61\n  99, 117,  80,  86,  68,  84,  50,  56, 110,  81,  83,  47, // cuPVDT28nQS/\n 101,  54, 122,  57,  53,  99,  74,  88, 113,  48, 101,  10, // e6z95cJXq0e.\n  75,  49,  66,  99,  97,  74,  54, 102,  74,  90, 115, 109, // K1BcaJ6fJZsm\n  98, 106,  82, 103,  68,  53, 112,  51, 109, 118,  69, 102, // bjRgD5p3mvEf\n  53, 118, 100,  81,  77,  55,  77,  67,  69, 118,  85,  48, // 5vdQM7MCEvU0\n 116,  72,  98, 115, 120,  50,  73,  53, 109,  72,  72,  74, // tHbsx2I5mHHJ\n 111,  65,  66,  72,  98,  56,  75,  86,  66, 103,  87, 112, // oABHb8KVBgWp\n  47, 108,  99,  88,  10,  71,  87, 105,  87,  97, 101,  79, // /lcX.GWiWaeO\n 121,  66,  55,  82,  80,  43,  79, 102,  68, 116, 118, 105, // yB7RP+OfDtvi\n  50,  79, 115,  97, 112, 120,  88, 105,  86,  55, 118,  78, // 2OsapxXiV7vN\n  86, 115,  55, 102,  77, 108, 114,  82, 106,  89,  49, 106, // Vs7fMlrRjY1j\n 111,  75,  97, 113, 109, 109, 121,  99, 110,  66, 118,  65, // oKaqmmycnBvA\n 113,  49,  52,  65,  69,  98, 116, 121,  76,  10, 115,  86, // q14AEbtyL.sV\n 102,  79,  83,  54,  54,  66,  56,  97, 112, 107, 101,  70, // fOS66B8apkeF\n  88,  50,  78,  89,  52,  88,  80,  69,  89,  86,  52,  90, // X2NY4XPEYV4Z\n  83,  67, 101,  56,  86,  72,  80, 114, 100, 114,  69,  82, // SCe8VHPrdrER\n 107,  50, 119,  73,  76,  71,  51,  84,  47,  69,  71, 109, // k2wILG3T/EGm\n  83,  73, 107,  67,  89,  86,  85,  77,  83, 110, 106, 109, // SIkCYVUMSnjm\n  74, 100,  10,  86,  81,  68,  57,  70,  54,  78,  97,  47, // Jd.VQD9F6Na/\n  43, 122, 109,  88,  67,  99,  61,  10,  45,  45,  45,  45, // +zmXCc=.----\n  45,  69,  78,  68,  32,  67,  69,  82,  84,  73,  70,  73, // -END CERTIFI\n  67,  65,  84,  69,  45,  45,  45,  45,  45,  10,  10,  10, // CATE-----...\n  73, 115, 115, 117, 101, 114,  58,  32,  67,  61,  85,  83, // Issuer: C=US\n  44,  32,  79,  61,  71, 111, 111, 103, 108, 101,  32,  84, // , O=Google T\n 114, 117, 115, 116,  32,  83, 101, 114, 118, 105,  99, 101, // rust Service\n 115,  32,  76,  76,  67,  44,  32,  67,  78,  61,  71,  84, // s LLC, CN=GT\n  83,  32,  82, 111, 111, 116,  32,  82,  49,  10,  78, 111, // S Root R1.No\n 116,  32,  66, 101, 102, 111, 114, 101,  58,  32,  74, 117, // t Before: Ju\n 110,  32,  50,  50,  32,  48,  48,  58,  48,  48,  58,  48, // n 22 00:00:0\n  48,  32,  50,  48,  49,  54,  32,  71,  77,  84,  10,  78, // 0 2016 GMT.N\n 111, 116,  32,  65, 102, 116, 101, 114,  32,  58,  32,  74, // ot After : J\n 117, 110,  32,  50,  50,  32,  48,  48,  58,  48,  48,  58, // un 22 00:00:\n  48,  48,  32,  50,  48,  51,  54,  32,  71,  77,  84,  10, // 00 2036 GMT.\n  45,  45,  45,  45,  45,  66,  69,  71,  73,  78,  32,  67, // -----BEGIN C\n  69,  82,  84,  73,  70,  73,  67,  65,  84,  69,  45,  45, // ERTIFICATE--\n  45,  45,  45,  10,  77,  73,  73,  70,  86, 122,  67,  67, // ---.MIIFVzCC\n  65, 122,  43, 103,  65, 119,  73,  66,  65, 103,  73,  78, // Az+gAwIBAgIN\n  65, 103,  80, 108, 107,  50,  56, 120, 115,  66,  78,  74, // AgPlk28xsBNJ\n 105,  71, 117, 105,  70, 122,  65,  78,  66, 103, 107, 113, // iGuiFzANBgkq\n 104, 107, 105,  71,  57, 119,  48,  66,  65,  81, 119,  70, // hkiG9w0BAQwF\n  65,  68,  66,  72,  77,  81, 115, 119,  10,  67,  81,  89, // ADBHMQsw.CQY\n  68,  86,  81,  81,  71,  69, 119,  74,  86,  85, 122,  69, // DVQQGEwJVUzE\n 105,  77,  67,  65,  71,  65,  49,  85,  69,  67, 104,  77, // iMCAGA1UEChM\n  90,  82,  50,  57, 118,  90,  50, 120, 108,  73,  70,  82, // ZR29vZ2xlIFR\n 121, 100,  88,  78,  48,  73,  70,  78, 108,  99, 110,  90, // ydXN0IFNlcnZ\n 112,  89,  50,  86, 122,  73,  69, 120,  77,  81, 122,  69, // pY2VzIExMQzE\n  85,  10,  77,  66,  73,  71,  65,  49,  85,  69,  65, 120, // U.MBIGA1UEAx\n  77,  76,  82,  49,  82,  84,  73,  70,  74, 118,  98,  51, // MLR1RTIFJvb3\n  81, 103,  85, 106,  69, 119,  72, 104,  99,  78,  77,  84, // QgUjEwHhcNMT\n  89, 119,  78, 106,  73, 121,  77,  68,  65, 119,  77,  68, // YwNjIyMDAwMD\n  65, 119,  87, 104,  99,  78,  77, 122,  89, 119,  78, 106, // AwWhcNMzYwNj\n  73, 121,  77,  68,  65, 119,  10,  77,  68,  65, 119,  87, // IyMDAw.MDAwW\n 106,  66,  72,  77,  81, 115, 119,  67,  81,  89,  68,  86, // jBHMQswCQYDV\n  81,  81,  71,  69, 119,  74,  86,  85, 122,  69, 105,  77, // QQGEwJVUzEiM\n  67,  65,  71,  65,  49,  85,  69,  67, 104,  77,  90,  82, // CAGA1UEChMZR\n  50,  57, 118,  90,  50, 120, 108,  73,  70,  82, 121, 100, // 29vZ2xlIFRyd\n  88,  78,  48,  73,  70,  78, 108,  99, 110,  90, 112,  10, // XN0IFNlcnZp.\n  89,  50,  86, 122,  73,  69, 120,  77,  81, 122,  69,  85, // Y2VzIExMQzEU\n  77,  66,  73,  71,  65,  49,  85,  69,  65, 120,  77,  76, // MBIGA1UEAxML\n  82,  49,  82,  84,  73,  70,  74, 118,  98,  51,  81, 103, // R1RTIFJvb3Qg\n  85, 106,  69, 119, 103, 103,  73, 105,  77,  65,  48,  71, // UjEwggIiMA0G\n  67,  83, 113,  71,  83,  73,  98,  51,  68,  81,  69,  66, // CSqGSIb3DQEB\n  65,  81,  85,  65,  10,  65,  52,  73,  67,  68, 119,  65, // AQUA.A4ICDwA\n 119, 103, 103,  73,  75,  65, 111,  73,  67,  65,  81,  67, // wggIKAoICAQC\n  50,  69,  81,  75,  76,  72, 117,  79, 104, 100,  53, 115, // 2EQKLHuOhd5s\n  55,  51,  76,  43,  85,  80, 114, 101,  86, 112,  48,  65, // 73L+UPreVp0A\n  56, 111, 102,  50,  67,  43,  88,  48, 121,  66, 111,  74, // 8of2C+X0yBoJ\n 120,  57, 118,  97,  77, 102,  47, 118, 111,  10,  50,  55, // x9vaMf/vo.27\n 120, 113,  76, 112, 101,  88, 111,  52, 120,  76,  43,  83, // xqLpeXo4xL+S\n 118,  50, 115, 102, 110,  79, 104,  66,  50, 120,  43,  99, // v2sfnOhB2x+c\n  87,  88,  51, 117,  43,  53,  56, 113,  80, 112, 118,  66, // WX3u+58qPpvB\n  75,  74,  88, 113, 101, 113,  85, 113, 118,  52,  73, 121, // KJXqeqUqv4Iy\n 102,  76, 112,  76,  71,  99,  89,  57, 118,  88, 109,  88, // fLpLGcY9vXmX\n  55, 119,  10,  67, 108,  55, 114,  97,  75,  98,  48, 120, // 7w.Cl7raKb0x\n 108, 112,  72,  68,  85,  48,  81,  77,  43,  78,  79, 115, // lpHDU0QM+NOs\n  82,  79, 106, 121,  66, 104, 115,  83,  43, 122,  56,  67, // ROjyBhsS+z8C\n  90,  68, 102, 110,  87,  81, 112,  74,  83,  77,  72, 111, // ZDfnWQpJSMHo\n  98,  84,  83,  80,  83,  53, 103,  52,  77,  47,  83,  67, // bTSPS5g4M/SC\n  89, 101,  55, 122,  85, 106, 119,  10,  84,  99,  76,  67, // Ye7zUjw.TcLC\n 101, 111, 105,  75, 117,  55, 114,  80,  87,  82, 110,  87, // eoiKu7rPWRnW\n 114,  52,  43, 119,  66,  55,  67, 101,  77, 102,  71,  67, // r4+wB7CeMfGC\n 119,  99,  68, 102,  76, 113,  90, 116,  98,  66, 107,  79, // wcDfLqZtbBkO\n 116, 100, 104,  43,  74, 104, 112,  70,  65, 122,  50, 119, // tdh+JhpFAz2w\n 101,  97,  83,  85,  75,  75,  48,  80, 102, 121,  98, 108, // eaSUKK0Pfybl\n  10, 113,  65, 106,  43, 108, 117, 103,  56,  97,  74,  82, // .qAj+lug8aJR\n  84,  55, 111,  77,  54, 105,  67, 115,  86, 108, 103, 109, // T7oM6iCsVlgm\n 121,  52,  72, 113,  77,  76, 110,  88,  87, 110,  79, 117, // y4HqMLnXWnOu\n 110,  86, 109,  83,  80, 108, 107,  57, 111, 114, 106,  50, // nVmSPlk9orj2\n  88, 119, 111,  83,  80, 119,  76, 120,  65, 119,  65, 116, // XwoSPwLxAwAt\n  99, 118, 102,  97,  72,  10, 115, 122,  86, 115, 114,  66, // cvfaH.szVsrB\n 104,  81, 102,  52,  84, 103,  84,  77,  50,  83,  48, 121, // hQf4TgTM2S0y\n  68, 112,  77,  55, 120,  83, 109,  97,  56, 121, 116,  83, // DpM7xSma8ytS\n 109, 122,  74,  83, 113,  48,  83,  80, 108, 121,  52,  99, // mzJSq0SPly4c\n 112, 107,  57,  43,  97,  67,  69,  73,  51, 111, 110,  99, // pk9+aCEI3onc\n  75,  75, 105,  80, 111,  52,  90, 111, 114,  56,  10,  89, // KKiPo4Zor8.Y\n  47, 107,  66,  43,  88, 106,  57, 101,  49, 120,  51,  43, // /kB+Xj9e1x3+\n 110,  97,  72,  43, 117, 122, 102, 115,  81,  53,  53, 108, // naH+uzfsQ55l\n  86, 101,  48, 118,  83,  98, 118,  49, 103,  72,  82,  54, // Ve0vSbv1gHR6\n 120,  89,  75, 117,  52,  52,  76, 116,  99,  88,  70, 105, // xYKu44LtcXFi\n 108,  87, 114,  48,  54, 122, 113, 107,  85, 115, 112, 122, // lWr06zqkUspz\n  66, 109, 107,  10,  77, 105,  86,  79,  75, 118,  70, 108, // Bmk.MiVOKvFl\n  82,  78,  65,  67, 122, 113, 114,  79,  83,  98,  84, 113, // RNACzqrOSbTq\n 110,  51, 121,  68, 115,  69,  66,  55,  53,  48,  79, 114, // n3yDsEB750Or\n 112,  50, 121, 106, 106,  51,  50,  74, 103, 102, 112,  77, // p2yjj32JgfpM\n 112, 102,  47,  86, 106, 115,  80,  79,  83,  43,  67,  49, // pf/VjsPOS+C1\n  50,  76,  79,  79,  82,  99,  57,  50,  10, 119,  79,  49, // 2LOORc92.wO1\n  65,  75,  47,  49,  84,  68,  55,  67, 110,  49,  84, 115, // AK/1TD7Cn1Ts\n  78, 115,  89, 113, 105,  65,  57,  52, 120, 114,  99, 120, // NsYqiA94xrcx\n  51,  54, 109,  57,  55,  80, 116,  98, 102, 107,  83,  73, // 36m97PtbfkSI\n  83,  53, 114,  55,  54,  50,  68,  76,  56,  69,  71,  77, // S5r762DL8EGM\n  85,  85,  88,  76, 101,  88, 100,  89,  87, 107,  55,  48, // UUXLeXdYWk70\n 112,  10,  97,  68,  80, 118,  79, 109,  98, 115,  66,  52, // p.aDPvOmbsB4\n 111, 109,  51, 120,  80,  88,  86,  50,  86,  52,  74,  57, // om3xPXV2V4J9\n  53, 101,  83,  82,  81,  65, 111, 103,  66,  47, 109, 113, // 5eSRQAogB/mq\n 103, 104, 116, 113, 109, 120, 108,  98,  67, 108, 117,  81, // ghtqmxlbCluQ\n  48,  87,  69, 100, 114,  72,  98,  69, 103,  56,  81,  79, // 0WEdrHbEg8QO\n  66,  43,  68,  86, 114,  78,  10,  86, 106, 122,  82, 108, // B+DVrN.VjzRl\n 119,  87,  53, 121,  48, 118, 116,  79,  85, 117,  99, 120, // wW5y0vtOUucx\n  68,  47,  83,  86,  82,  78, 117,  74,  76,  68,  87,  99, // D/SVRNuJLDWc\n 102, 114,  48, 119,  98, 114,  77,  55,  82, 118,  49,  47, // fr0wbrM7Rv1/\n 111,  70,  66,  50,  65,  67,  89,  80,  84, 114,  73, 114, // oFB2ACYPTrIr\n 110, 113,  89,  78, 120, 103,  70, 108,  81,  73,  68,  10, // nqYNxgFlQID.\n  65,  81,  65,  66, 111,  48,  73, 119,  81,  68,  65,  79, // AQABo0IwQDAO\n  66, 103,  78,  86,  72,  81,  56,  66,  65, 102,  56,  69, // BgNVHQ8BAf8E\n  66,  65,  77,  67,  65,  89,  89, 119,  68, 119,  89,  68, // BAMCAYYwDwYD\n  86,  82,  48,  84,  65,  81,  72,  47,  66,  65,  85, 119, // VR0TAQH/BAUw\n  65, 119,  69,  66,  47, 122,  65, 100,  66, 103,  78,  86, // AwEB/zAdBgNV\n  72,  81,  52,  69,  10,  70, 103,  81,  85,  53,  75,  56, // HQ4E.FgQU5K8\n 114,  74, 110,  69,  97,  75,  48, 103, 110, 104,  83,  57, // rJnEaK0gnhS9\n  83,  90, 105, 122, 118,  56,  73, 107,  84,  99,  84,  52, // SZizv8IkTcT4\n 119,  68,  81,  89,  74,  75, 111,  90,  73, 104, 118,  99, // wDQYJKoZIhvc\n  78,  65,  81,  69,  77,  66,  81,  65,  68, 103, 103,  73, // NAQEMBQADggI\n  66,  65,  74,  43, 113,  81, 105,  98,  98,  10,  67,  53, // BAJ+qQibb.C5\n 117,  43,  47, 120,  54,  87, 107, 105,  52,  43, 111, 109, // u+/x6Wki4+om\n  86,  75,  97, 112, 105,  54,  73, 115, 116,  57, 119,  84, // VKapi6Ist9wT\n 114,  89, 103, 103, 111,  71, 120, 118,  97, 108,  51, 115, // rYggoGxval3s\n  66,  79, 104,  50,  90,  53, 111, 102, 109, 109,  87,  74, // BOh2Z5ofmmWJ\n 121, 113,  43,  98,  88, 109,  89,  79, 102, 103,  54,  76, // yq+bXmYOfg6L\n  69, 101,  10,  81, 107,  69, 122,  67, 122,  99,  57, 122, // Ee.QkEzCzc9z\n 111, 108, 119,  70,  99, 113,  49,  74,  75, 106,  80,  97, // olwFcq1JKjPa\n  55,  88,  83,  81,  67,  71,  89, 122, 121,  73,  48, 122, // 7XSQCGYzyI0z\n 122, 118,  70,  73, 111,  84, 103, 120,  81,  54,  75, 102, // zvFIoTgxQ6Kf\n  70,  50,  73,  53,  68,  85, 107, 122, 112, 115,  43,  71, // F2I5DUkzps+G\n 108,  81, 101,  98, 116, 117, 121,  10, 104,  54, 102,  56, // lQebtuy.h6f8\n  56,  47, 113,  66,  86,  82,  82, 105,  67, 108, 109, 112, // 8/qBVRRiClmp\n  73, 103,  85, 120,  80, 111,  76,  87,  55, 116, 116,  88, // IgUxPoLW7ttX\n  78,  76, 119, 122, 108, 100,  77,  88,  71,  43, 103, 110, // NLwzldMXG+gn\n 111, 111, 116,  55,  84, 105,  89,  97, 101, 108, 112, 107, // oot7TiYaelpk\n 116, 116,  71, 115,  78,  47,  72,  57, 111,  80,  77,  52, // ttGsN/H9oPM4\n  10,  55,  72,  76, 119,  69,  88,  87, 100, 121, 122,  82, // .7HLwEXWdyzR\n  83, 106, 101,  90,  50,  97, 120, 102,  71,  51,  52,  97, // SjeZ2axfG34a\n 114,  74,  52,  53,  74,  75,  51,  86, 109, 103,  82,  65, // rJ45JK3VmgRA\n 104, 112, 117, 111,  43,  57,  75,  52, 108,  47,  51, 119, // hpuo+9K4l/3w\n  86,  51, 115,  54,  77,  74,  84,  47,  75,  89, 110,  65, // V3s6MJT/KYnA\n  75,  57, 121,  56,  74,  10,  90, 103, 102,  73,  80, 120, // K9y8J.ZgfIPx\n 122,  56,  56,  78, 116,  70,  77,  78,  57, 105, 105,  77, // z88NtFMN9iiM\n  71,  49,  68,  53,  51,  68, 110,  48, 114, 101,  87,  86, // G1D53Dn0reWV\n 108,  72, 120,  89,  99, 105,  78, 117,  97,  67, 112,  43, // lHxYciNuaCp+\n  48,  75, 117, 101,  73,  72, 111,  73,  49,  55, 101, 107, // 0KueIHoI17ek\n 111,  56,  99, 100,  76, 105,  65,  54,  69, 102,  10,  77, // o8cdLiA6Ef.M\n 103, 102, 100,  71,  43,  82,  67, 122, 103, 119,  65,  82, // gfdG+RCzgwAR\n  87,  71,  65, 116,  81, 115, 103,  87,  83, 108,  52, 118, // WGAtQsgWSl4v\n 102, 108,  86, 121,  50,  80,  70,  80,  69, 122,  48, 116, // flVy2PFPEz0t\n 118,  47,  98,  97, 108,  56, 120,  97,  53, 109, 101,  76, // v/bal8xa5meL\n  77,  70, 114,  85,  75,  84,  88,  53, 104, 103,  85, 118, // MFrUKTX5hgUv\n  89,  85,  47,  10,  90,  54, 116,  71, 110,  54,  68,  47, // YU/.Z6tGn6D/\n  81, 113,  99,  54, 102,  49, 122,  76,  88,  98,  66, 119, // Qqc6f1zLXbBw\n  72,  83, 115,  48,  57, 100,  82,  50,  67,  81, 122, 114, // HSs09dR2CQzr\n 101,  69, 120,  90,  66, 102,  77, 122,  81, 115,  78, 104, // eExZBfMzQsNh\n  70,  82,  65,  98, 100,  48,  51,  79,  73, 111, 122,  85, // FRAbd03OIozU\n 104, 102,  74,  70, 102,  98, 100,  84,  10,  54, 117,  57, // hfJFfbdT.6u9\n  65,  87, 112,  81,  75,  88,  67,  66, 102,  84, 107,  66, // AWpQKXCBfTkB\n 100,  89, 105,  74,  50,  51,  47,  47,  79,  89,  98,  50, // dYiJ23//OYb2\n  77,  73,  51, 106,  83,  78, 119,  76, 103, 106, 116,  55, // MI3jSNwLgjt7\n  82,  69,  84, 101,  74,  57, 114,  47, 116,  83,  81, 100, // RETeJ9r/tSQd\n 105, 114, 112,  76, 115,  81,  66, 113, 118,  70,  65, 110, // irpLsQBqvFAn\n  90,  10,  48,  69,  54, 121, 111, 118, 101,  43,  55, 117, // Z.0E6yove+7u\n  55,  89,  47,  57, 119,  97,  76, 100,  54,  52,  78, 110, // 7Y/9waLd64Nn\n  72, 105,  47,  72, 109,  51, 108,  67,  88,  82,  83,  72, // Hi/Hm3lCXRSH\n  78,  98, 111,  84,  88, 110, 115,  53, 108, 110, 100,  99, // NboTXns5lndc\n  69,  90,  79, 105, 116,  72,  84, 116,  78,  67, 106, 118, // EZOitHTtNCjv\n  48, 120, 121,  66,  90, 109,  10,  50, 116,  73,  77,  80, // 0xyBZm.2tIMP\n  78, 117, 122, 106, 115, 109, 104,  68,  89,  65,  80, 101, // NuzjsmhDYAPe\n 120,  90,  51,  70,  76,  47,  47,  50, 119, 109,  85, 115, // xZ3FL//2wmUs\n 112,  79,  56,  73,  70, 103,  86,  54, 100, 116, 120,  81, // pO8IFgV6dtxQ\n  47,  80, 101,  69,  77,  77,  65,  51,  75, 103, 113, 108, // /PeEMMA3Kgql\n  98,  98,  67,  49, 106,  43,  81,  97,  51,  98,  98,  10, // bbC1j+Qa3bb.\n  98,  80,  54,  77, 118,  80,  74, 119,  78,  81, 122,  99, // bP6MvPJwNQzc\n 109,  82, 107,  49,  51,  78, 102,  73,  82, 109,  80,  86, // mRk13NfIRmPV\n  78, 110,  71, 117,  86,  47, 117,  51, 103, 109,  51,  99, // NnGuV/u3gm3c\n  10,  45,  45,  45,  45,  45,  69,  78,  68,  32,  67,  69, // .-----END CE\n  82,  84,  73,  70,  73,  67,  65,  84,  69,  45,  45,  45, // RTIFICATE---\n  45,  45,  10,  10,  10,  73, 115, 115, 117, 101, 114,  58, // --...Issuer:\n  32,  79,  85,  61,  71, 108, 111,  98,  97, 108,  83, 105, //  OU=GlobalSi\n 103, 110,  32,  69,  67,  67,  32,  82, 111, 111, 116,  32, // gn ECC Root \n  67,  65,  32,  45,  32,  82,  52,  44,  32,  79,  61,  71, // CA - R4, O=G\n 108, 111,  98,  97, 108,  83, 105, 103, 110,  44,  32,  67, // lobalSign, C\n  78,  61,  71, 108, 111,  98,  97, 108,  83, 105, 103, 110, // N=GlobalSign\n  10,  78, 111, 116,  32,  66, 101, 102, 111, 114, 101,  58, // .Not Before:\n  32,  78, 111, 118,  32,  49,  51,  32,  48,  48,  58,  48, //  Nov 13 00:0\n  48,  58,  48,  48,  32,  50,  48,  49,  50,  32,  71,  77, // 0:00 2012 GM\n  84,  10,  78, 111, 116,  32,  65, 102, 116, 101, 114,  32, // T.Not After \n  58,  32,  74,  97, 110,  32,  49,  57,  32,  48,  51,  58, // : Jan 19 03:\n  49,  52,  58,  48,  55,  32,  50,  48,  51,  56,  32,  71, // 14:07 2038 G\n  77,  84,  10,  45,  45,  45,  45,  45,  66,  69,  71,  73, // MT.-----BEGI\n  78,  32,  67,  69,  82,  84,  73,  70,  73,  67,  65,  84, // N CERTIFICAT\n  69,  45,  45,  45,  45,  45,  10,  77,  73,  73,  66,  51, // E-----.MIIB3\n  68,  67,  67,  65,  89,  79, 103,  65, 119,  73,  66,  65, // DCCAYOgAwIBA\n 103,  73,  78,  65, 103,  80, 108, 102, 118,  85,  47, 107, // gINAgPlfvU/k\n  47,  50, 108,  67,  83,  71, 121, 112, 106,  65,  75,  66, // /2lCSGypjAKB\n 103, 103, 113, 104, 107, 106,  79,  80,  81,  81,  68,  65, // ggqhkjOPQQDA\n 106,  66,  81,  77,  83,  81, 119,  73, 103,  89,  68,  10, // jBQMSQwIgYD.\n  86,  81,  81,  76,  69, 120, 116,  72,  98,  71,  57, 105, // VQQLExtHbG9i\n  89,  87, 120,  84,  97,  87, 100, 117,  73,  69,  86,  68, // YWxTaWduIEVD\n  81, 121,  66,  83,  98,  50,  57,  48,  73,  69,  78,  66, // QyBSb290IENB\n  73,  67,  48, 103,  85, 106,  81, 120,  69, 122,  65,  82, // IC0gUjQxEzAR\n  66, 103,  78,  86,  66,  65, 111,  84,  67, 107, 100, 115, // BgNVBAoTCkds\n  98,  50,  74, 104,  10,  98,  70,  78, 112,  90,  50,  52, // b2Jh.bFNpZ24\n 120,  69, 122,  65,  82,  66, 103,  78,  86,  66,  65,  77, // xEzARBgNVBAM\n  84,  67, 107, 100, 115,  98,  50,  74, 104,  98,  70,  78, // TCkdsb2JhbFN\n 112,  90,  50,  52, 119,  72, 104,  99,  78,  77,  84,  73, // pZ24wHhcNMTI\n 120,  77,  84,  69, 122,  77,  68,  65, 119,  77,  68,  65, // xMTEzMDAwMDA\n 119,  87, 104,  99,  78,  77, 122, 103, 119,  10,  77,  84, // wWhcNMzgw.MT\n  69,  53,  77,  68,  77, 120,  78,  68,  65,  51,  87, 106, // E5MDMxNDA3Wj\n  66,  81,  77,  83,  81, 119,  73, 103,  89,  68,  86,  81, // BQMSQwIgYDVQ\n  81,  76,  69, 120, 116,  72,  98,  71,  57, 105,  89,  87, // QLExtHbG9iYW\n 120,  84,  97,  87, 100, 117,  73,  69,  86,  68,  81, 121, // xTaWduIEVDQy\n  66,  83,  98,  50,  57,  48,  73,  69,  78,  66,  73,  67, // BSb290IENBIC\n  48, 103,  10,  85, 106,  81, 120,  69, 122,  65,  82,  66, // 0g.UjQxEzARB\n 103,  78,  86,  66,  65, 111,  84,  67, 107, 100, 115,  98, // gNVBAoTCkdsb\n  50,  74, 104,  98,  70,  78, 112,  90,  50,  52, 120,  69, // 2JhbFNpZ24xE\n 122,  65,  82,  66, 103,  78,  86,  66,  65,  77,  84,  67, // zARBgNVBAMTC\n 107, 100, 115,  98,  50,  74, 104,  98,  70,  78, 112,  90, // kdsb2JhbFNpZ\n  50,  52, 119,  87,  84,  65,  84,  10,  66, 103,  99, 113, // 24wWTAT.Bgcq\n 104, 107, 106,  79,  80,  81,  73,  66,  66, 103, 103, 113, // hkjOPQIBBggq\n 104, 107, 106,  79,  80,  81,  77,  66,  66, 119,  78,  67, // hkjOPQMBBwNC\n  65,  65,  83,  52, 120, 110, 110,  84, 106,  50, 119, 108, // AAS4xnnTj2wl\n  68, 112,  56, 117,  79,  82, 107,  99,  65,  54,  83, 117, // Dp8uORkcA6Su\n 109, 117,  85,  53,  66, 119, 107,  87, 121, 109,  79, 120, // muU5BwkWymOx\n  10, 117,  89,  98,  52, 105, 108, 102,  66,  86,  56,  53, // .uYb4ilfBV85\n  67,  43, 110,  79, 104,  57,  50,  86,  67,  47, 120,  55, // C+nOh92VC/x7\n  66,  65,  76,  74, 117,  99, 119,  55,  47, 120, 121,  72, // BALJucw7/xyH\n 108,  71,  75,  83, 113,  50,  88,  69,  47, 113,  78,  83, // lGKSq2XE/qNS\n  53, 122, 111, 119, 100, 111,  48,  73, 119,  81,  68,  65, // 5zowdo0IwQDA\n  79,  66, 103,  78,  86,  10,  72,  81,  56,  66,  65, 102, // OBgNV.HQ8BAf\n  56,  69,  66,  65,  77,  67,  65,  89,  89, 119,  68, 119, // 8EBAMCAYYwDw\n  89,  68,  86,  82,  48,  84,  65,  81,  72,  47,  66,  65, // YDVR0TAQH/BA\n  85, 119,  65, 119,  69,  66,  47, 122,  65, 100,  66, 103, // UwAwEB/zAdBg\n  78,  86,  72,  81,  52,  69,  70, 103,  81,  85,  86,  76, // NVHQ4EFgQUVL\n  66,  55, 114,  85,  87,  52,  52, 107,  66,  47,  10,  43, // B7rUW44kB/.+\n 119, 112, 117,  43,  55,  52, 122, 121,  84, 121, 106, 104, // wpu+74zyTyjh\n  78,  85, 119,  67, 103,  89,  73,  75, 111,  90,  73, 122, // NUwCgYIKoZIz\n 106,  48,  69,  65, 119,  73,  68,  82, 119,  65, 119,  82, // j0EAwIDRwAwR\n  65,  73, 103,  73, 107,  57,  48,  99, 114, 108, 103, 114, // AIgIk90crlgr\n  47,  72, 109, 110,  75,  65,  87,  66,  86,  66, 102, 119, // /HmnKAWBVBfw\n  49,  52,  55,  10,  98, 109,  70,  48,  55,  55,  52,  66, // 147.bmF0774B\n 120,  76,  52,  89,  83,  70, 108, 104, 103, 106,  73,  67, // xL4YSFlhgjIC\n  73,  67,  97, 100,  86,  71,  78,  65,  51, 106, 100, 103, // ICadVGNA3jdg\n  85,  77,  47,  73,  50,  79,  50, 100, 103, 113,  52,  51, // UM/I2O2dgq43\n 109,  76, 121, 106, 106,  48, 120,  77, 113,  84,  81, 114, // mLyjj0xMqTQr\n  98,  79,  47,  55, 108,  90, 115, 109,  10,  45,  45,  45, // bO/7lZsm.---\n  45,  45,  69,  78,  68,  32,  67,  69,  82,  84,  73,  70, // --END CERTIF\n  73,  67,  65,  84,  69,  45,  45,  45,  45,  45,  10,  10, // ICATE-----..\n  10,  73, 115, 115, 117, 101, 114,  58,  32,  67,  61,  85, // .Issuer: C=U\n  83,  44,  32,  79,  61,  71, 111, 111, 103, 108, 101,  32, // S, O=Google \n  84, 114, 117, 115, 116,  32,  83, 101, 114, 118, 105,  99, // Trust Servic\n 101, 115,  32,  76,  76,  67,  44,  32,  67,  78,  61,  71, // es LLC, CN=G\n  84,  83,  32,  82, 111, 111, 116,  32,  82,  52,  10,  78, // TS Root R4.N\n 111, 116,  32,  66, 101, 102, 111, 114, 101,  58,  32,  74, // ot Before: J\n 117, 110,  32,  50,  50,  32,  48,  48,  58,  48,  48,  58, // un 22 00:00:\n  48,  48,  32,  50,  48,  49,  54,  32,  71,  77,  84,  10, // 00 2016 GMT.\n  78, 111, 116,  32,  65, 102, 116, 101, 114,  32,  58,  32, // Not After : \n  74, 117, 110,  32,  50,  50,  32,  48,  48,  58,  48,  48, // Jun 22 00:00\n  58,  48,  48,  32,  50,  48,  51,  54,  32,  71,  77,  84, // :00 2036 GMT\n  10,  45,  45,  45,  45,  45,  66,  69,  71,  73,  78,  32, // .-----BEGIN \n  67,  69,  82,  84,  73,  70,  73,  67,  65,  84,  69,  45, // CERTIFICATE-\n  45,  45,  45,  45,  10,  77,  73,  73,  67,  67,  84,  67, // ----.MIICCTC\n  67,  65,  89,  54, 103,  65, 119,  73,  66,  65, 103,  73, // CAY6gAwIBAgI\n  78,  65, 103,  80, 108, 119,  71, 106, 118,  89, 120, 113, // NAgPlwGjvYxq\n  99,  99, 112,  66,  81,  85, 106,  65,  75,  66, 103, 103, // ccpBQUjAKBgg\n 113, 104, 107, 106,  79,  80,  81,  81,  68,  65, 122,  66, // qhkjOPQQDAzB\n  72,  77,  81, 115, 119,  67,  81,  89,  68,  10,  86,  81, // HMQswCQYD.VQ\n  81,  71,  69, 119,  74,  86,  85, 122,  69, 105,  77,  67, // QGEwJVUzEiMC\n  65,  71,  65,  49,  85,  69,  67, 104,  77,  90,  82,  50, // AGA1UEChMZR2\n  57, 118,  90,  50, 120, 108,  73,  70,  82, 121, 100,  88, // 9vZ2xlIFRydX\n  78,  48,  73,  70,  78, 108,  99, 110,  90, 112,  89,  50, // N0IFNlcnZpY2\n  86, 122,  73,  69, 120,  77,  81, 122,  69,  85,  77,  66, // VzIExMQzEUMB\n  73,  71,  10,  65,  49,  85,  69,  65, 120,  77,  76,  82, // IG.A1UEAxMLR\n  49,  82,  84,  73,  70,  74, 118,  98,  51,  81, 103,  85, // 1RTIFJvb3QgU\n 106,  81, 119,  72, 104,  99,  78,  77,  84,  89, 119,  78, // jQwHhcNMTYwN\n 106,  73, 121,  77,  68,  65, 119,  77,  68,  65, 119,  87, // jIyMDAwMDAwW\n 104,  99,  78,  77, 122,  89, 119,  78, 106,  73, 121,  77, // hcNMzYwNjIyM\n  68,  65, 119,  77,  68,  65, 119,  10,  87, 106,  66,  72, // DAwMDAw.WjBH\n  77,  81, 115, 119,  67,  81,  89,  68,  86,  81,  81,  71, // MQswCQYDVQQG\n  69, 119,  74,  86,  85, 122,  69, 105,  77,  67,  65,  71, // EwJVUzEiMCAG\n  65,  49,  85,  69,  67, 104,  77,  90,  82,  50,  57, 118, // A1UEChMZR29v\n  90,  50, 120, 108,  73,  70,  82, 121, 100,  88,  78,  48, // Z2xlIFRydXN0\n  73,  70,  78, 108,  99, 110,  90, 112,  89,  50,  86, 122, // IFNlcnZpY2Vz\n  10,  73,  69, 120,  77,  81, 122,  69,  85,  77,  66,  73, // .IExMQzEUMBI\n  71,  65,  49,  85,  69,  65, 120,  77,  76,  82,  49,  82, // GA1UEAxMLR1R\n  84,  73,  70,  74, 118,  98,  51,  81, 103,  85, 106,  81, // TIFJvb3QgUjQ\n 119, 100, 106,  65,  81,  66, 103,  99, 113, 104, 107, 106, // wdjAQBgcqhkj\n  79,  80,  81,  73,  66,  66, 103,  85, 114, 103,  81,  81, // OPQIBBgUrgQQ\n  65,  73, 103,  78, 105,  10,  65,  65,  84, 122, 100,  72, // AIgNi.AATzdH\n  79, 110,  97,  73, 116, 103, 114, 107,  79,  52,  78,  99, // OnaItgrkO4Nc\n  87,  66,  77,  72, 116,  76,  83,  90,  51,  55, 119,  87, // WBMHtLSZ37wW\n  72,  79,  53, 116,  53,  71, 118,  87, 118,  86,  89,  82, // HO5t5GvWvVYR\n 103,  49, 114, 107,  68, 100,  99,  47, 101,  74, 107,  84, // g1rkDdc/eJkT\n  66,  97,  54, 122, 122, 117, 104,  88, 121, 105,  10,  81, // Ba6zzuhXyi.Q\n  72,  89,  55, 113,  99,  97,  52,  82,  57, 103, 113,  53, // HY7qca4R9gq5\n  53,  75,  82,  97, 110,  80, 112, 115,  88,  73,  53, 110, // 5KRanPpsXI5n\n 121, 109, 102, 111, 112, 106,  84,  88,  49,  53,  89, 104, // ymfopjTX15Yh\n 109,  85,  80, 111,  89,  82, 108,  66, 116,  72,  99, 105, // mUPoYRlBtHci\n  56, 110,  72,  99,  56, 105,  77,  97, 105,  47, 108, 120, // 8nHc8iMai/lx\n  75, 118,  82,  10,  72,  89, 113, 106,  81, 106,  66,  65, // KvR.HYqjQjBA\n  77,  65,  52,  71,  65,  49,  85, 100,  68, 119,  69,  66, // MA4GA1UdDwEB\n  47, 119,  81,  69,  65, 119,  73,  66, 104, 106,  65,  80, // /wQEAwIBhjAP\n  66, 103,  78,  86,  72,  82,  77,  66,  65, 102,  56,  69, // BgNVHRMBAf8E\n  66,  84,  65,  68,  65,  81,  72,  47,  77,  66,  48,  71, // BTADAQH/MB0G\n  65,  49,  85, 100,  68, 103,  81,  87,  10,  66,  66,  83, // A1UdDgQW.BBS\n  65,  84,  78,  98, 114, 100,  80,  57,  74,  78, 113,  80, // ATNbrdP9JNqP\n  86,  50,  80, 121,  49,  80, 115,  86, 113,  56,  74,  81, // V2Py1PsVq8JQ\n 100, 106,  68,  65,  75,  66, 103, 103, 113, 104, 107, 106, // djDAKBggqhkj\n  79,  80,  81,  81,  68,  65, 119,  78, 112,  65,  68,  66, // OPQQDAwNpADB\n 109,  65, 106,  69,  65,  54,  69,  68,  47, 103,  57,  52, // mAjEA6ED/g94\n  68,  10,  57,  74,  43, 117,  72,  88, 113, 110,  76, 114, // D.9J+uHXqnLr\n 109, 118,  84,  47,  97,  68,  72,  81,  52, 116, 104,  81, // mvT/aDHQ4thQ\n  69, 100,  48, 100, 108, 113,  55,  65,  47,  67, 114,  56, // Ed0dlq7A/Cr8\n 100, 101,  86, 108,  53,  99,  49,  82, 120,  89,  73, 105, // deVl5c1RxYIi\n 103,  76,  57, 122,  67,  50,  76,  55,  70,  56,  65, 106, // gL9zC2L7F8Aj\n  69,  65,  56,  71,  69,  56,  10, 112,  47,  83, 103, 103, // EA8GE8.p/Sgg\n 117,  77, 104,  49,  89,  81, 100,  99,  52,  97,  99,  76, // uMh1YQdc4acL\n  97,  47,  75,  78,  74, 118, 120, 110,  55, 107, 106,  78, // a/KNJvxn7kjN\n 117,  75,  56,  89,  65,  79, 100, 103,  76,  79,  97,  86, // uK8YAOdgLOaV\n 115, 106, 104,  52, 114, 115,  85, 101,  99, 114,  78,  73, // sjh4rsUecrNI\n 100,  83,  85, 116,  85, 108,  68,  10,  45,  45,  45,  45, // dSUtUlD.----\n  45,  69,  78,  68,  32,  67,  69,  82,  84,  73,  70,  73, // -END CERTIFI\n  67,  65,  84,  69,  45,  45,  45,  45,  45,  10,  10,  10, // CATE-----...\n  73, 115, 115, 117, 101, 114,  58,  32,  67,  32,  61,  32, // Issuer: C = \n  85,  83,  44,  32,  79,  32,  61,  32,  73, 110, 116, 101, // US, O = Inte\n 114, 110, 101, 116,  32,  83, 101,  99, 117, 114, 105, 116, // rnet Securit\n 121,  32,  82, 101, 115, 101,  97, 114,  99, 104,  32,  71, // y Research G\n 114, 111, 117, 112,  44,  32,  67,  78,  32,  61,  32,  73, // roup, CN = I\n  83,  82,  71,  32,  82, 111, 111, 116,  32,  88,  49,  10, // SRG Root X1.\n  78, 111, 116,  32,  66, 101, 102, 111, 114, 101,  58,  32, // Not Before: \n  74, 117, 110,  32,  32,  52,  32,  49,  49,  58,  48,  52, // Jun  4 11:04\n  58,  51,  56,  32,  50,  48,  49,  53,  32,  71,  77,  84, // :38 2015 GMT\n  10,  78, 111, 116,  32,  65, 102, 116, 101, 114,  32,  58, // .Not After :\n  32,  74, 117, 110,  32,  32,  52,  32,  49,  49,  58,  48, //  Jun  4 11:0\n  52,  58,  51,  56,  32,  50,  48,  51,  53,  32,  71,  77, // 4:38 2035 GM\n  84,  10,  45,  45,  45,  45,  45,  66,  69,  71,  73,  78, // T.-----BEGIN\n  32,  67,  69,  82,  84,  73,  70,  73,  67,  65,  84,  69, //  CERTIFICATE\n  45,  45,  45,  45,  45,  10,  77,  73,  73,  70,  97, 122, // -----.MIIFaz\n  67,  67,  65,  49,  79, 103,  65, 119,  73,  66,  65, 103, // CCA1OgAwIBAg\n  73,  82,  65,  73,  73,  81, 122,  55,  68,  83,  81,  79, // IRAIIQz7DSQO\n  78,  90,  82,  71,  80, 103, 117,  50,  79,  67, 105, 119, // NZRGPgu2OCiw\n  65, 119,  68,  81,  89,  74,  75, 111,  90,  73, 104, 118, // AwDQYJKoZIhv\n  99,  78,  65,  81,  69,  76,  66,  81,  65, 119,  10,  84, // cNAQELBQAw.T\n 122,  69,  76,  77,  65, 107,  71,  65,  49,  85,  69,  66, // zELMAkGA1UEB\n 104,  77,  67,  86,  86,  77, 120,  75,  84,  65, 110,  66, // hMCVVMxKTAnB\n 103,  78,  86,  66,  65, 111,  84,  73,  69, 108, 117, 100, // gNVBAoTIElud\n  71,  86, 121,  98, 109,  86,  48,  73,  70,  78, 108,  89, // GVybmV0IFNlY\n  51,  86, 121,  97,  88,  82,  53,  73,  70,  74, 108,  99, // 3VyaXR5IFJlc\n  50,  86, 104,  10,  99, 109,  78, 111,  73,  69, 100, 121, // 2Vh.cmNoIEdy\n  98,  51,  86, 119,  77,  82,  85, 119,  69, 119,  89,  68, // b3VwMRUwEwYD\n  86,  81,  81,  68,  69, 119, 120,  74,  85,  49,  74,  72, // VQQDEwxJU1JH\n  73,  70,  74, 118,  98,  51,  81, 103,  87,  68,  69, 119, // IFJvb3QgWDEw\n  72, 104,  99,  78,  77,  84,  85, 119,  78, 106,  65,  48, // HhcNMTUwNjA0\n  77,  84,  69, 119,  78,  68,  77,  52,  10,  87, 104,  99, // MTEwNDM4.Whc\n  78,  77, 122,  85, 119,  78, 106,  65,  48,  77,  84,  69, // NMzUwNjA0MTE\n 119,  78,  68,  77,  52,  87, 106,  66,  80,  77,  81, 115, // wNDM4WjBPMQs\n 119,  67,  81,  89,  68,  86,  81,  81,  71,  69, 119,  74, // wCQYDVQQGEwJ\n  86,  85, 122,  69, 112,  77,  67,  99,  71,  65,  49,  85, // VUzEpMCcGA1U\n  69,  67, 104,  77, 103,  83,  87,  53,  48,  90,  88,  74, // EChMgSW50ZXJ\n 117,  10,  90,  88,  81, 103,  85,  50,  86, 106, 100,  88, // u.ZXQgU2VjdX\n  74, 112, 100,  72, 107, 103,  85, 109,  86, 122,  90,  87, // JpdHkgUmVzZW\n  70, 121,  89,  50, 103, 103,  82,  51,  74, 118, 100,  88, // FyY2ggR3JvdX\n  65, 120,  70,  84,  65,  84,  66, 103,  78,  86,  66,  65, // AxFTATBgNVBA\n  77,  84,  68,  69, 108,  84,  85, 107,  99, 103,  85, 109, // MTDElTUkcgUm\n  57, 118, 100,  67,  66,  89,  10,  77,  84,  67,  67,  65, // 9vdCBY.MTCCA\n 105,  73, 119,  68,  81,  89,  74,  75, 111,  90,  73, 104, // iIwDQYJKoZIh\n 118,  99,  78,  65,  81,  69,  66,  66,  81,  65,  68, 103, // vcNAQEBBQADg\n 103,  73,  80,  65,  68,  67,  67,  65, 103, 111,  67, 103, // gIPADCCAgoCg\n 103,  73,  66,  65,  75,  51, 111,  74,  72,  80,  48,  70, // gIBAK3oJHP0F\n  68, 102, 122, 109,  53,  52, 114,  86, 121, 103,  99,  10, // Dfzm54rVygc.\n 104,  55,  55,  99, 116,  57,  56,  52, 107,  73, 120, 117, // h77ct984kIxu\n  80,  79,  90,  88, 111,  72, 106,  51, 100,  99,  75, 105, // POZXoHj3dcKi\n  47, 118,  86, 113,  98, 118,  89,  65,  84, 121, 106,  98, // /vVqbvYATyjb\n  51, 109, 105,  71,  98,  69,  83,  84, 116, 114,  70, 106, // 3miGbESTtrFj\n  47,  82,  81,  83,  97,  55,  56, 102,  48, 117, 111, 120, // /RQSa78f0uox\n 109, 121,  70,  43,  10,  48,  84,  77,  56, 117, 107, 106, // myF+.0TM8ukj\n  49,  51,  88, 110, 102, 115,  55, 106,  47,  69, 118,  69, // 13Xnfs7j/EvE\n 104, 109, 107, 118,  66, 105, 111,  90, 120,  97,  85, 112, // hmkvBioZxaUp\n 109,  90, 109, 121,  80, 102, 106, 120, 119, 118,  54,  48, // mZmyPfjxwv60\n 112,  73, 103,  98, 122,  53,  77,  68, 109, 103,  75,  55, // pIgbz5MDmgK7\n 105,  83,  52,  43,  51, 109,  88,  54,  85,  10,  65,  53, // iS4+3mX6U.A5\n  47,  84,  82,  53, 100,  56, 109,  85, 103, 106,  85,  43, // /TR5d8mUgjU+\n 103,  52, 114, 107,  56,  75,  98,  52,  77, 117,  48,  85, // g4rk8Kb4Mu0U\n 108,  88, 106,  73,  66,  48, 116, 116, 111, 118,  48,  68, // lXjIB0ttov0D\n 105,  78, 101, 119,  78, 119,  73,  82, 116,  49,  56, 106, // iNewNwIRt18j\n  65,  56,  43, 111,  43, 117,  51, 100, 112, 106, 113,  43, // A8+o+u3dpjq+\n 115,  87,  10,  84,  56,  75,  79,  69,  85, 116,  43, 122, // sW.T8KOEUt+z\n 119, 118, 111,  47,  55,  86,  51,  76, 118,  83, 121, 101, // wvo/7V3LvSye\n  48, 114, 103,  84,  66,  73, 108,  68,  72,  67,  78,  65, // 0rgTBIlDHCNA\n 121, 109, 103,  52,  86,  77, 107,  55,  66,  80,  90,  55, // ymg4VMk7BPZ7\n 104, 109,  47,  69,  76,  78,  75, 106,  68,  43,  74, 111, // hm/ELNKjD+Jo\n  50,  70,  82,  51, 113, 121,  72,  10,  66,  53,  84,  48, // 2FR3qyH.B5T0\n  89,  51,  72, 115,  76, 117,  74, 118,  87,  53, 105,  66, // Y3HsLuJvW5iB\n  52,  89, 108,  99,  78,  72, 108, 115, 100, 117,  56,  55, // 4YlcNHlsdu87\n 107,  71,  74,  53,  53, 116, 117, 107, 109, 105,  56, 109, // kGJ55tukmi8m\n 120, 100,  65,  81,  52,  81,  55, 101,  50,  82,  67,  79, // xdAQ4Q7e2RCO\n  70, 118, 117,  51,  57,  54, 106,  51, 120,  43,  85,  67, // Fvu396j3x+UC\n  10,  66,  53, 105,  80,  78, 103, 105,  86,  53,  43,  73, // .B5iPNgiV5+I\n  51, 108, 103,  48,  50, 100,  90,  55,  55,  68, 110,  75, // 3lg02dZ77DnK\n 120,  72,  90, 117,  56,  65,  47, 108,  74,  66, 100, 105, // xHZu8A/lJBdi\n  66,  51,  81,  87,  48,  75, 116,  90,  66,  54,  97, 119, // B3QW0KtZB6aw\n  66, 100, 112,  85,  75,  68,  57, 106, 102,  49,  98,  48, // BdpUKD9jf1b0\n  83,  72, 122,  85, 118,  10,  75,  66, 100, 115,  48, 112, // SHzUv.KBds0p\n 106,  66, 113,  65, 108, 107, 100,  50,  53,  72,  78,  55, // jBqAlkd25HN7\n 114,  79, 114,  70, 108, 101,  97,  74,  49,  47,  99, 116, // rOrFleaJ1/ct\n  97,  74, 120,  81,  90,  66,  75,  84,  53,  90,  80, 116, // aJxQZBKT5ZPt\n  48, 109,  57,  83,  84,  74,  69,  97, 100,  97, 111,  48, // 0m9STJEadao0\n 120,  65,  72,  48,  97, 104, 109,  98,  87, 110,  10,  79, // xAH0ahmbWn.O\n 108,  70, 117, 104, 106, 117, 101, 102,  88,  75, 110,  69, // lFuhjuefXKnE\n 103,  86,  52,  87, 101,  48,  43,  85,  88, 103,  86,  67, // gV4We0+UXgVC\n 119,  79,  80, 106, 100,  65, 118,  66,  98,  73,  43, 101, // wOPjdAvBbI+e\n  48, 111,  99,  83,  51,  77,  70,  69, 118, 122,  71,  54, // 0ocS3MFEvzG6\n 117,  66,  81,  69,  51, 120,  68, 107,  51,  83, 122, 121, // uBQE3xDk3Szy\n 110,  84, 110,  10, 106, 104,  56,  66,  67,  78,  65, 119, // nTn.jh8BCNAw\n  49,  70, 116, 120,  78, 114,  81,  72, 117, 115,  69, 119, // 1FtxNrQHusEw\n  77,  70, 120,  73, 116,  52,  73,  55, 109,  75,  90,  57, // MFxIt4I7mKZ9\n  89,  73, 113, 105, 111, 121, 109,  67, 122,  76, 113,  57, // YIqioymCzLq9\n 103, 119,  81,  98, 111, 111,  77,  68,  81,  97,  72,  87, // gwQbooMDQaHW\n  66, 102,  69,  98, 119, 114,  98, 119,  10, 113,  72, 121, // BfEbwrbw.qHy\n  71,  79,  48,  97, 111,  83,  67, 113,  73,  51,  72,  97, // GO0aoSCqI3Ha\n  97, 100, 114,  56, 102,  97, 113,  85,  57,  71,  89,  47, // adr8faqU9GY/\n 114,  79,  80,  78, 107,  51, 115, 103, 114,  68,  81, 111, // rOPNk3sgrDQo\n 111,  47,  47, 102,  98,  52, 104,  86,  67,  49,  67,  76, // o//fb4hVC1CL\n  81,  74,  49,  51, 104, 101, 102,  52,  89,  53,  51,  67, // QJ13hef4Y53C\n  73,  10, 114,  85,  55, 109,  50,  89, 115,  54, 120, 116, // I.rU7m2Ys6xt\n  48, 110,  85,  87,  55,  47, 118,  71,  84,  49,  77,  48, // 0nUW7/vGT1M0\n  78,  80,  65, 103,  77,  66,  65,  65,  71, 106,  81, 106, // NPAgMBAAGjQj\n  66,  65,  77,  65,  52,  71,  65,  49,  85, 100,  68, 119, // BAMA4GA1UdDw\n  69,  66,  47, 119,  81,  69,  65, 119,  73,  66,  66, 106, // EB/wQEAwIBBj\n  65,  80,  66, 103,  78,  86,  10,  72,  82,  77,  66,  65, // APBgNV.HRMBA\n 102,  56,  69,  66,  84,  65,  68,  65,  81,  72,  47,  77, // f8EBTADAQH/M\n  66,  48,  71,  65,  49,  85, 100,  68, 103,  81,  87,  66, // B0GA1UdDgQWB\n  66,  82,  53, 116,  70, 110, 109, 101,  55,  98, 108,  53, // BR5tFnme7bl5\n  65,  70, 122, 103,  65, 105,  73, 121,  66, 112,  89,  57, // AFzgAiIyBpY9\n 117, 109,  98,  98, 106,  65,  78,  66, 103, 107, 113,  10, // umbbjANBgkq.\n 104, 107, 105,  71,  57, 119,  48,  66,  65,  81, 115,  70, // hkiG9w0BAQsF\n  65,  65,  79,  67,  65, 103,  69,  65,  86,  82,  57,  89, // AAOCAgEAVR9Y\n 113,  98, 121, 121, 113,  70,  68,  81,  68,  76,  72,  89, // qbyyqFDQDLHY\n  71, 109, 107, 103,  74, 121, 107,  73, 114,  71,  70,  49, // GmkgJykIrGF1\n  88,  73, 112, 117,  43,  73,  76, 108,  97,  83,  47,  86, // XIpu+ILlaS/V\n  57, 108,  90,  76,  10, 117,  98, 104, 122,  69,  70, 110, // 9lZL.ubhzEFn\n  84,  73,  90, 100,  43,  53,  48, 120, 120,  43,  55,  76, // TIZd+50xx+7L\n  83,  89,  75,  48,  53, 113,  65, 118, 113,  70, 121,  70, // SYK05qAvqFyF\n  87, 104, 102,  70,  81,  68, 108, 110, 114, 122, 117,  66, // WhfFQDlnrzuB\n  90,  54,  98, 114,  74,  70, 101,  43,  71, 110,  89,  43, // Z6brJFe+GnY+\n  69, 103,  80,  98, 107,  54,  90,  71,  81,  10,  51,  66, // EgPbk6ZGQ.3B\n 101,  98,  89, 104, 116,  70,  56,  71,  97,  86,  48, 110, // ebYhtF8GaV0n\n 120, 118, 119, 117, 111,  55,  55, 120,  47,  80, 121,  57, // xvwuo77x/Py9\n  97, 117,  74,  47,  71, 112, 115,  77, 105, 117,  47,  88, // auJ/GpsMiu/X\n  49,  43, 109, 118, 111, 105,  66,  79, 118,  47,  50,  88, // 1+mvoiBOv/2X\n  47, 113, 107,  83, 115, 105, 115,  82,  99,  79, 106,  47, // /qkSsisRcOj/\n  75,  75,  10,  78,  70, 116,  89,  50,  80, 119,  66, 121, // KK.NFtY2PwBy\n  86,  83,  53, 117,  67,  98,  77, 105, 111, 103, 122, 105, // VS5uCbMiogzi\n  85, 119, 116, 104,  68, 121,  67,  51,  43,  54,  87,  86, // UwthDyC3+6WV\n 119,  87,  54,  76,  76, 118,  51, 120,  76, 102,  72,  84, // wW6LLv3xLfHT\n 106, 117,  67, 118, 106,  72,  73,  73, 110,  78, 122, 107, // juCvjHIInNzk\n 116,  72,  67, 103,  75,  81,  53,  10,  79,  82,  65, 122, // tHCgKQ5.ORAz\n  73,  52,  74,  77,  80,  74,  43,  71, 115, 108,  87,  89, // I4JMPJ+GslWY\n  72,  98,  52, 112, 104, 111, 119, 105, 109,  53,  55, 105, // Hb4phowim57i\n  97, 122, 116,  88,  79, 111,  74, 119,  84, 100, 119,  74, // aztXOoJwTdwJ\n 120,  52, 110,  76,  67, 103, 100,  78,  98,  79, 104, 100, // x4nLCgdNbOhd\n 106, 115, 110, 118, 122, 113, 118,  72, 117,  55,  85, 114, // jsnvzqvHu7Ur\n  10,  84, 107,  88,  87,  83, 116,  65, 109, 122,  79,  86, // .TkXWStAmzOV\n 121, 121, 103, 104, 113, 112,  90,  88, 106,  70,  97,  72, // yyghqpZXjFaH\n  51, 112,  79,  51,  74,  76,  70,  43, 108,  43,  47,  43, // 3pO3JLF+l+/+\n 115,  75,  65,  73, 117, 118, 116, 100,  55, 117,  43,  78, // sKAIuvtd7u+N\n 120, 101,  53,  65,  87,  48, 119, 100, 101,  82, 108,  78, // xe5AW0wdeRlN\n  56,  78, 119, 100,  67,  10, 106,  78,  80,  69, 108, 112, // 8NwdC.jNPElp\n 122,  86, 109,  98,  85, 113,  52,  74,  85,  97, 103,  69, // zVmbUq4JUagE\n 105, 117,  84,  68, 107,  72, 122, 115, 120,  72, 112,  70, // iuTDkHzsxHpF\n  75,  86,  75,  55, 113,  52,  43,  54,  51,  83,  77,  49, // KVK7q4+63SM1\n  78,  57,  53,  82,  49,  78,  98, 100,  87, 104, 115,  99, // N95R1NbdWhsc\n 100,  67,  98,  43,  90,  65,  74, 122,  86,  99,  10, 111, // dCb+ZAJzVc.o\n 121, 105,  51,  66,  52,  51, 110, 106,  84,  79,  81,  53, // yi3B43njTOQ5\n 121,  79, 102,  43,  49,  67,  99, 101,  87, 120,  71,  49, // yOf+1CceWxG1\n  98,  81,  86, 115,  53,  90, 117, 102, 112, 115,  77, 108, // bQVs5ZufpsMl\n 106, 113,  52,  85, 105,  48,  47,  49, 108, 118, 104,  43, // jq4Ui0/1lvh+\n 119, 106,  67, 104,  80,  52, 107, 113,  75,  79,  74,  50, // wjChP4kqKOJ2\n 113, 120, 113,  10,  52,  82, 103, 113, 115,  97, 104,  68, // qxq.4RgqsahD\n  89,  86, 118,  84,  72,  57, 119,  55, 106,  88,  98, 121, // YVvTH9w7jXby\n  76, 101, 105,  78, 100, 100,  56,  88,  77,  50, 119,  57, // LeiNdd8XM2w9\n  85,  47, 116,  55, 121,  48,  70, 102,  47,  57, 121, 105, // U/t7y0Ff/9yi\n  48,  71,  69,  52,  52,  90,  97,  52, 114,  70,  50,  76, // 0GE44Za4rF2L\n  78,  57, 100,  49,  49,  84,  80,  65,  10, 109,  82,  71, // N9d11TPA.mRG\n 117, 110,  85,  72,  66,  99, 110,  87,  69, 118, 103,  74, // unUHBcnWEvgJ\n  66,  81, 108,  57, 110,  74,  69, 105,  85,  48,  90, 115, // BQl9nJEiU0Zs\n 110, 118, 103,  99,  47, 117,  98, 104,  80, 103,  88,  82, // nvgc/ubhPgXR\n  82,  52,  88, 113,  51,  55,  90,  48, 106,  52, 114,  55, // R4Xq37Z0j4r7\n 103,  49,  83, 103,  69,  69, 122, 119, 120,  65,  53,  55, // g1SgEEzwxA57\n 100,  10, 101, 109, 121,  80, 120, 103,  99,  89, 120, 110, // d.emyPxgcYxn\n  47, 101,  82,  52,  52,  47,  75,  74,  52,  69,  66, 115, // /eR44/KJ4EBs\n  43, 108,  86,  68,  82,  51, 118, 101, 121,  74, 109,  43, // +lVDR3veyJm+\n 107,  88,  81,  57,  57,  98,  50,  49,  47,  43, 106, 104, // kXQ99b21/+jh\n  53,  88, 111, 115,  49,  65, 110,  88,  53, 105,  73, 116, // 5Xos1AnX5iIt\n 114, 101,  71,  67,  99,  61,  10,  45,  45,  45,  45,  45, // reGCc=.-----\n  69,  78,  68,  32,  67,  69,  82,  84,  73,  70,  73,  67, // END CERTIFIC\n  65,  84,  69,  45,  45,  45,  45,  45,  10,  10,  83, 117, // ATE-----..Su\n  98, 106, 101,  99, 116,  58,  32,  67,  61,  73,  69,  44, // bject: C=IE,\n  32,  79,  61,  66,  97, 108, 116, 105, 109, 111, 114, 101, //  O=Baltimore\n  44,  32,  79,  85,  61,  67, 121,  98, 101, 114,  84, 114, // , OU=CyberTr\n 117, 115, 116,  44,  32,  67,  78,  61,  66,  97, 108, 116, // ust, CN=Balt\n 105, 109, 111, 114, 101,  32,  67, 121,  98, 101, 114,  84, // imore CyberT\n 114, 117, 115, 116,  32,  82, 111, 111, 116,  10,  78, 111, // rust Root.No\n 116,  32,  66, 101, 102, 111, 114, 101,  58,  32,  77,  97, // t Before: Ma\n 121,  32,  49,  50,  32,  49,  56,  58,  52,  54,  58,  48, // y 12 18:46:0\n  48,  32,  50,  48,  48,  48,  32,  71,  77,  84,  10,  78, // 0 2000 GMT.N\n 111, 116,  32,  65, 102, 116, 101, 114,  32,  58,  32,  77, // ot After : M\n  97, 121,  32,  49,  50,  32,  50,  51,  58,  53,  57,  58, // ay 12 23:59:\n  48,  48,  32,  50,  48,  50,  53,  32,  71,  77,  84,  10, // 00 2025 GMT.\n  45,  45,  45,  45,  45,  66,  69,  71,  73,  78,  32,  67, // -----BEGIN C\n  69,  82,  84,  73,  70,  73,  67,  65,  84,  69,  45,  45, // ERTIFICATE--\n  45,  45,  45,  10,  77,  73,  73,  68, 100, 122,  67,  67, // ---.MIIDdzCC\n  65, 108,  43, 103,  65, 119,  73,  66,  65, 103,  73,  69, // Al+gAwIBAgIE\n  65, 103,  65,  65, 117,  84,  65,  78,  66, 103, 107, 113, // AgAAuTANBgkq\n 104, 107, 105,  71,  57, 119,  48,  66,  65,  81,  85,  70, // hkiG9w0BAQUF\n  65,  68,  66,  97,  77,  81, 115, 119,  67,  81,  89,  68, // ADBaMQswCQYD\n  86,  81,  81,  71,  69, 119,  74,  74,  10,  82,  84,  69, // VQQGEwJJ.RTE\n  83,  77,  66,  65,  71,  65,  49,  85,  69,  67, 104,  77, // SMBAGA1UEChM\n  74,  81, 109,  70, 115, 100,  71, 108, 116,  98,  51,  74, // JQmFsdGltb3J\n 108,  77,  82,  77, 119,  69,  81,  89,  68,  86,  81,  81, // lMRMwEQYDVQQ\n  76,  69, 119, 112,  68, 101,  87,  74, 108,  99, 108,  82, // LEwpDeWJlclR\n 121, 100,  88,  78,  48,  77,  83,  73, 119,  73,  65,  89, // ydXN0MSIwIAY\n  68,  10,  86,  81,  81,  68,  69, 120, 108,  67,  89,  87, // D.VQQDExlCYW\n 120,  48,  97,  87,  49, 118,  99, 109,  85, 103,  81,  51, // x0aW1vcmUgQ3\n 108, 105,  90,  88,  74,  85,  99, 110,  86, 122, 100,  67, // liZXJUcnVzdC\n  66,  83,  98,  50,  57,  48,  77,  66,  52,  88,  68,  84, // BSb290MB4XDT\n  65, 119,  77,  68,  85, 120,  77, 106,  69,  52,  78,  68, // AwMDUxMjE4ND\n  89, 119,  77,  70, 111,  88,  10,  68,  84,  73,  49,  77, // YwMFoX.DTI1M\n  68,  85, 120,  77, 106,  73, 122,  78,  84, 107, 119,  77, // DUxMjIzNTkwM\n  70, 111, 119,  87, 106,  69,  76,  77,  65, 107,  71,  65, // FowWjELMAkGA\n  49,  85,  69,  66, 104,  77,  67,  83,  85,  85, 120,  69, // 1UEBhMCSUUxE\n 106,  65,  81,  66, 103,  78,  86,  66,  65, 111,  84,  67, // jAQBgNVBAoTC\n  85,  74, 104,  98,  72,  82, 112,  98,  87,  57, 121,  10, // UJhbHRpbW9y.\n  90,  84,  69,  84,  77,  66,  69,  71,  65,  49,  85,  69, // ZTETMBEGA1UE\n  67, 120,  77,  75,  81,  51, 108, 105,  90,  88,  74,  85, // CxMKQ3liZXJU\n  99, 110,  86, 122, 100,  68,  69, 105,  77,  67,  65,  71, // cnVzdDEiMCAG\n  65,  49,  85,  69,  65, 120,  77,  90,  81, 109,  70, 115, // A1UEAxMZQmFs\n 100,  71, 108, 116,  98,  51,  74, 108,  73,  69,  78,  53, // dGltb3JlIEN5\n  89, 109,  86, 121,  10,  86,  72,  74,  49,  99,  51,  81, // YmVy.VHJ1c3Q\n 103,  85, 109,  57, 118, 100,  68,  67,  67,  65,  83,  73, // gUm9vdDCCASI\n 119,  68,  81,  89,  74,  75, 111,  90,  73, 104, 118,  99, // wDQYJKoZIhvc\n  78,  65,  81,  69,  66,  66,  81,  65,  68, 103, 103,  69, // NAQEBBQADggE\n  80,  65,  68,  67,  67,  65,  81, 111,  67, 103, 103,  69, // PADCCAQoCggE\n  66,  65,  75,  77,  69, 117, 121,  75, 114,  10, 109,  68, // BAKMEuyKr.mD\n  49,  88,  54,  67,  90, 121, 109, 114,  86,  53,  49,  67, // 1X6CZymrV51C\n 110, 105,  52, 101, 105,  86, 103,  76,  71, 119,  52,  49, // ni4eiVgLGw41\n 117,  79,  75, 121, 109,  97,  90,  78,  43, 104,  88, 101, // uOKymaZN+hXe\n  50, 119,  67,  81,  86, 116,  50, 121, 103, 117, 122, 109, // 2wCQVt2yguzm\n  75, 105,  89, 118,  54,  48, 105,  78, 111,  83,  54, 122, // KiYv60iNoS6z\n 106, 114,  10,  73,  90,  51,  65,  81,  83, 115,  66,  85, // jr.IZ3AQSsBU\n 110, 117,  73, 100,  57,  77,  99, 106,  56, 101,  54, 117, // nuId9Mcj8e6u\n  89, 105,  49,  97, 103, 110, 110,  99,  43, 103,  82,  81, // Yi1agnnc+gRQ\n  75, 102,  82, 122,  77, 112, 105, 106,  83,  51, 108, 106, // KfRzMpijS3lj\n 119, 117, 109,  85,  78,  75, 111,  85,  77,  77, 111,  54, // wumUNKoUMMo6\n 118,  87, 114,  74,  89, 101,  75,  10, 109, 112,  89,  99, // vWrJYeK.mpYc\n 113,  87, 101,  52,  80, 119, 122,  86,  57,  47, 108,  83, // qWe4PwzV9/lS\n  69, 121,  47,  67,  71,  57,  86, 119,  99,  80,  67,  80, // Ey/CG9VwcPCP\n 119,  66,  76,  75,  66, 115, 117,  97,  52, 100, 110,  75, // wBLKBsua4dnK\n  77,  51, 112,  51,  49, 118, 106, 115, 117, 102,  70, 111, // M3p31vjsufFo\n  82,  69,  74,  73,  69,  57,  76,  65, 119, 113,  83, 117, // REJIE9LAwqSu\n  10,  88, 109,  68,  43, 116, 113,  89,  70,  47,  76,  84, // .XmD+tqYF/LT\n 100,  66,  49, 107,  67,  49,  70, 107,  89, 109,  71,  80, // dB1kC1FkYmGP\n  49, 112,  87,  80, 103, 107,  65, 120,  57,  88,  98,  73, // 1pWPgkAx9XbI\n  71, 101, 118,  79,  70,  54, 117, 118,  85,  65,  54,  53, // GevOF6uvUA65\n 101, 104,  68,  53, 102,  47, 120,  88, 116,  97,  98, 122, // ehD5f/xXtabz\n  53,  79,  84,  90, 121,  10, 100,  99,  57,  51,  85, 107, // 5OTZy.dc93Uk\n  51, 122, 121,  90,  65, 115, 117,  84,  51, 108, 121,  83, // 3zyZAsuT3lyS\n  78,  84,  80, 120,  56, 107, 109,  67,  70,  99,  66,  53, // NTPx8kmCFcB5\n 107, 112, 118,  99,  89,  54,  55,  79, 100, 117, 104, 106, // kpvcY67Oduhj\n 112, 114, 108,  51,  82, 106,  77,  55,  49, 111,  71,  68, // prl3RjM71oGD\n  72, 119, 101,  73,  49,  50, 118,  47, 121, 101,  10, 106, // HweI12v/ye.j\n 108,  48, 113, 104, 113, 100,  78, 107,  78, 119, 110,  71, // l0qhqdNkNwnG\n 106, 107,  67,  65, 119,  69,  65,  65,  97,  78,  70,  77, // jkCAwEAAaNFM\n  69,  77, 119,  72,  81,  89,  68,  86,  82,  48,  79,  66, // EMwHQYDVR0OB\n  66,  89,  69,  70,  79,  87, 100,  87,  84,  67,  67,  82, // BYEFOWdWTCCR\n  49, 106,  77, 114,  80, 111,  73,  86,  68,  97,  71, 101, // 1jMrPoIVDaGe\n 122, 113,  49,  10,  66,  69,  51, 119,  77,  66,  73,  71, // zq1.BE3wMBIG\n  65,  49,  85, 100,  69, 119,  69,  66,  47, 119,  81,  73, // A1UdEwEB/wQI\n  77,  65,  89,  66,  65, 102,  56,  67,  65,  81,  77, 119, // MAYBAf8CAQMw\n  68, 103,  89,  68,  86,  82,  48,  80,  65,  81,  72,  47, // DgYDVR0PAQH/\n  66,  65,  81,  68,  65, 103,  69,  71,  77,  65,  48,  71, // BAQDAgEGMA0G\n  67,  83, 113,  71,  83,  73,  98,  51,  10,  68,  81,  69, // CSqGSIb3.DQE\n  66,  66,  81,  85,  65,  65,  52,  73,  66,  65,  81,  67, // BBQUAA4IBAQC\n  70,  68,  70,  50,  79,  53,  71,  57,  82,  97,  69,  73, // FDF2O5G9RaEI\n  70, 111,  78,  50,  55,  84, 121,  99, 108, 104,  65,  79, // FoN27TyclhAO\n  57,  57,  50,  84,  57,  76, 100,  99, 119,  52,  54,  81, // 992T9Ldcw46Q\n  81,  70,  43, 118,  97,  75,  83, 109,  50, 101,  84,  57, // QF+vaKSm2eT9\n  50,  10,  57, 104, 107,  84,  73,  55, 103,  81,  67, 118, // 2.9hkTI7gQCv\n 108,  89, 112,  78,  82, 104,  99,  76,  48,  69,  89,  87, // lYpNRhcL0EYW\n 111,  83, 105, 104, 102,  86,  67, 114,  51,  70, 118,  68, // oSihfVCr3FvD\n  66,  56,  49, 117, 107,  77,  74,  89,  50,  71,  81,  69, // B81ukMJY2GQE\n  47, 115, 122,  75,  78,  43,  79,  77,  89,  51,  69,  85, // /szKN+OMY3EU\n  47, 116,  51,  87, 103, 120,  10, 106, 107, 122,  83, 115, // /t3Wgx.jkzSs\n 119,  70,  48,  55, 114,  53,  49,  88, 103, 100,  73,  71, // wF07r51XgdIG\n 110,  57, 119,  47, 120,  90,  99, 104,  77,  66,  53, 104, // n9w/xZchMB5h\n  98, 103,  70,  47,  88,  43,  43,  90,  82,  71, 106,  68, // bgF/X++ZRGjD\n  56,  65,  67, 116,  80, 104,  83,  78, 122, 107,  69,  49, // 8ACtPhSNzkE1\n  97, 107, 120, 101, 104, 105,  47, 111,  67, 114,  48,  10, // akxehi/oCr0.\n  69, 112, 110,  51, 111,  48,  87,  67,  52, 122, 120, 101, // Epn3o0WC4zxe\n  57,  90,  50, 101, 116,  99, 105, 101, 102,  67,  55,  73, // 9Z2etciefC7I\n 112,  74,  53,  79,  67,  66,  82,  76,  98, 102,  49, 119, // pJ5OCBRLbf1w\n  98,  87, 115,  97,  89,  55,  49, 107,  53, 104,  43,  51, // bWsaY71k5h+3\n 122, 118,  68, 121, 110, 121,  54,  55,  71,  55, 102, 121, // zvDyny67G7fy\n  85,  73, 104, 122,  10, 107, 115,  76, 105,  52, 120,  97, // UIhz.ksLi4xa\n  78, 109, 106,  73,  67, 113,  52,  52,  89,  51, 101, 107, // NmjICq44Y3ek\n  81,  69, 101,  53,  43,  78,  97, 117,  81, 114, 122,  52, // QEe5+NauQrz4\n 119, 108,  72, 114,  81,  77, 122,  50, 110,  90,  81,  47, // wlHrQMz2nZQ/\n  49,  47,  73,  54, 101,  89, 115,  57,  72,  82,  67, 119, // 1/I6eYs9HRCw\n  66,  88,  98, 115, 100, 116,  84,  76,  83,  10,  82,  57, // BXbsdtTLS.R9\n  73,  52,  76, 116,  68,  43, 103, 100, 119, 121,  97, 104, // I4LtD+gdwyah\n  54,  49,  55, 106, 122,  86,  47,  79, 101,  66,  72,  82, // 617jzV/OeBHR\n 110,  68,  74,  69,  76, 113,  89, 122, 109, 112,  10,  45, // nDJELqYzmp.-\n  45,  45,  45,  45,  69,  78,  68,  32,  67,  69,  82,  84, // ----END CERT\n  73,  70,  73,  67,  65,  84,  69,  45,  45,  45,  45,  45, // IFICATE-----\n  10,  10,  83, 117,  98, 106, 101,  99, 116,  58,  32,  67, // ..Subject: C\n  61,  85,  83,  44,  32,  79,  61,  71, 101, 111,  84, 114, // =US, O=GeoTr\n 117, 115, 116,  32,  73, 110,  99,  46,  44,  32,  67,  78, // ust Inc., CN\n  61,  71, 101, 111,  84, 114, 117, 115, 116,  32,  71, 108, // =GeoTrust Gl\n 111,  98,  97, 108,  32,  67,  65,  10,  78, 111, 116,  32, // obal CA.Not \n  66, 101, 102, 111, 114, 101,  58,  32,  77,  97, 121,  32, // Before: May \n  50,  49,  32,  48,  52,  58,  48,  48,  58,  48,  48,  32, // 21 04:00:00 \n  50,  48,  48,  50,  32,  71,  77,  84,  10,  78, 111, 116, // 2002 GMT.Not\n  32,  65, 102, 116, 101, 114,  32,  58,  32,  77,  97, 121, //  After : May\n  32,  50,  49,  32,  48,  52,  58,  48,  48,  58,  48,  48, //  21 04:00:00\n  32,  50,  48,  50,  50,  32,  71,  77,  84,  10,  45,  45, //  2022 GMT.--\n  45,  45,  45,  66,  69,  71,  73,  78,  32,  67,  69,  82, // ---BEGIN CER\n  84,  73,  70,  73,  67,  65,  84,  69,  45,  45,  45,  45, // TIFICATE----\n  45,  10,  77,  73,  73,  68,  86,  68,  67,  67,  65, 106, // -.MIIDVDCCAj\n 121, 103,  65, 119,  73,  66,  65, 103,  73,  68,  65, 106, // ygAwIBAgIDAj\n  82,  87,  77,  65,  48,  71,  67,  83, 113,  71,  83,  73, // RWMA0GCSqGSI\n  98,  51,  68,  81,  69,  66,  66,  81,  85,  65,  77,  69, // b3DQEBBQUAME\n  73, 120,  67, 122,  65,  74,  66, 103,  78,  86,  66,  65, // IxCzAJBgNVBA\n  89,  84,  65, 108,  86,  84,  10,  77,  82,  89, 119,  70, // YTAlVT.MRYwF\n  65,  89,  68,  86,  81,  81,  75,  69, 119,  49,  72,  90, // AYDVQQKEw1HZ\n  87,  57,  85,  99, 110,  86, 122, 100,  67,  66,  74,  98, // W9UcnVzdCBJb\n 109,  77, 117,  77,  82, 115, 119,  71,  81,  89,  68,  86, // mMuMRswGQYDV\n  81,  81,  68,  69, 120,  74,  72,  90,  87,  57,  85,  99, // QQDExJHZW9Uc\n 110,  86, 122, 100,  67,  66,  72,  98,  71,  57, 105,  10, // nVzdCBHbG9i.\n  89,  87, 119, 103,  81,  48,  69, 119,  72, 104,  99,  78, // YWwgQ0EwHhcN\n  77,  68,  73, 119,  78,  84,  73, 120,  77,  68,  81, 119, // MDIwNTIxMDQw\n  77,  68,  65, 119,  87, 104,  99,  78,  77, 106,  73, 119, // MDAwWhcNMjIw\n  78,  84,  73, 120,  77,  68,  81, 119,  77,  68,  65, 119, // NTIxMDQwMDAw\n  87, 106,  66,  67,  77,  81, 115, 119,  67,  81,  89,  68, // WjBCMQswCQYD\n  86,  81,  81,  71,  10,  69, 119,  74,  86,  85, 122,  69, // VQQG.EwJVUzE\n  87,  77,  66,  81,  71,  65,  49,  85,  69,  67, 104,  77, // WMBQGA1UEChM\n  78,  82,  50,  86, 118,  86,  72,  74,  49,  99,  51,  81, // NR2VvVHJ1c3Q\n 103,  83,  87,  53, 106,  76, 106,  69,  98,  77,  66, 107, // gSW5jLjEbMBk\n  71,  65,  49,  85,  69,  65, 120,  77,  83,  82,  50,  86, // GA1UEAxMSR2V\n 118,  86,  72,  74,  49,  99,  51,  81, 103,  10,  82,  50, // vVHJ1c3Qg.R2\n 120, 118,  89, 109,  70, 115,  73,  69,  78,  66,  77,  73, // xvYmFsIENBMI\n  73,  66,  73, 106,  65,  78,  66, 103, 107, 113, 104, 107, // IBIjANBgkqhk\n 105,  71,  57, 119,  48,  66,  65,  81,  69,  70,  65,  65, // iG9w0BAQEFAA\n  79,  67,  65,  81,  56,  65,  77,  73,  73,  66,  67, 103, // OCAQ8AMIIBCg\n  75,  67,  65,  81,  69,  65,  50, 115, 119,  89,  89, 122, // KCAQEA2swYYz\n  68,  57,  10,  57,  66,  99, 106,  71, 108,  90,  43,  87, // D9.9BcjGlZ+W\n  57,  56,  56,  98,  68, 106, 107,  99,  98, 100,  52, 107, // 988bDjkcbd4k\n 100,  83,  56, 111, 100, 104,  77,  43,  75, 104,  68, 116, // dS8odhM+KhDt\n 103,  80, 112,  84,  83,  69,  72,  67,  73, 106,  97,  87, // gPpTSEHCIjaW\n  67,  57, 109,  79,  83, 109,  57,  66,  88, 105,  76, 110, // C9mOSm9BXiLn\n  84, 106, 111,  66,  98, 100, 113,  10, 102, 110,  71, 107, // TjoBbdq.fnGk\n  53, 115,  82, 103, 112, 114,  68, 118, 103,  79,  83,  74, // 5sRgprDvgOSJ\n  75,  65,  43, 101,  74, 100,  98, 116, 103,  47,  79, 116, // KA+eJdbtg/Ot\n 112, 112,  72,  72, 109,  77, 108,  67,  71,  68,  85,  85, // ppHHmMlCGDUU\n 110,  97,  50,  89,  82, 112,  73, 117,  84,  56, 114, 120, // na2YRpIuT8rx\n 104,  48,  80,  66,  70, 112,  86,  88,  76,  86,  68, 118, // h0PBFpVXLVDv\n  10, 105,  83,  50,  65, 101, 108, 101, 116,  56, 117,  53, // .iS2Aelet8u5\n 102,  97,  57,  73,  65, 106,  98, 107,  85,  43,  66,  81, // fa9IAjbkU+BQ\n  86,  78, 100, 110,  65,  82, 113,  78,  55,  99, 115, 105, // VNdnARqN7csi\n  82, 118,  56, 108,  86,  75,  56,  51,  81, 108, 122,  54, // Rv8lVK83Qlz6\n  99,  74, 109,  84,  77,  51,  56,  54,  68,  71,  88,  72, // cJmTM386DGXH\n  75,  84, 117,  98,  85,  10,  49,  88, 117, 112,  71,  99, // KTubU.1XupGc\n  49,  86,  51, 115, 106, 115,  48, 108,  52,  52,  85,  43, // 1V3sjs0l44U+\n  86,  99,  84,  52, 119, 116,  47, 108,  65, 106,  78, 118, // VcT4wt/lAjNv\n 120, 109,  53, 115, 117,  79, 112,  68, 107,  90,  65,  76, // xm5suOpDkZAL\n 101,  86,  65, 106, 109,  82,  67, 119,  55,  43,  79,  67, // eVAjmRCw7+OC\n  55,  82,  72,  81,  87,  97,  57, 107,  48,  43,  10,  98, // 7RHQWa9k0+.b\n 119,  56,  72,  72,  97,  56, 115,  72, 111,  57, 103,  79, // w8HHa8sHo9gO\n 101,  76,  54,  78, 108,  77,  84,  79, 100,  82, 101,  74, // eL6NlMTOdReJ\n 105, 118,  98,  80,  97, 103,  85, 118,  84,  76, 114,  71, // ivbPagUvTLrG\n  65,  77, 111,  85, 103,  82, 120,  53,  97, 115, 122,  80, // AMoUgRx5aszP\n 101,  69,  52, 117, 119,  99,  50, 104,  71,  75,  99, 101, // eE4uwc2hGKce\n 101, 111,  87,  10,  77,  80,  82, 102, 119,  67, 118, 111, // eoW.MPRfwCvo\n  99,  87, 118, 107,  43,  81,  73,  68,  65,  81,  65,  66, // cWvk+QIDAQAB\n 111,  49,  77, 119,  85,  84,  65,  80,  66, 103,  78,  86, // o1MwUTAPBgNV\n  72,  82,  77,  66,  65, 102,  56,  69,  66,  84,  65,  68, // HRMBAf8EBTAD\n  65,  81,  72,  47,  77,  66,  48,  71,  65,  49,  85, 100, // AQH/MB0GA1Ud\n  68, 103,  81,  87,  66,  66,  84,  65,  10, 101, 112, 104, // DgQWBBTA.eph\n 111, 106,  89, 110,  55, 113, 119,  86, 107,  68,  66,  70, // ojYn7qwVkDBF\n  57, 113, 110,  49, 108, 117,  77, 114,  77,  84, 106,  65, // 9qn1luMrMTjA\n 102,  66, 103,  78,  86,  72,  83,  77,  69,  71,  68,  65, // fBgNVHSMEGDA\n  87, 103,  66,  84,  65, 101, 112, 104, 111, 106,  89, 110, // WgBTAephojYn\n  55, 113, 119,  86, 107,  68,  66,  70,  57, 113, 110,  49, // 7qwVkDBF9qn1\n 108,  10, 117,  77, 114,  77,  84, 106,  65,  78,  66, 103, // l.uMrMTjANBg\n 107, 113, 104, 107, 105,  71,  57, 119,  48,  66,  65,  81, // kqhkiG9w0BAQ\n  85,  70,  65,  65,  79,  67,  65,  81,  69,  65,  78, 101, // UFAAOCAQEANe\n  77, 112,  97, 117,  85, 118,  88,  86,  83,  79,  75,  86, // MpauUvXVSOKV\n  67,  85, 110,  53, 107,  97,  70,  79,  83,  80, 101,  67, // CUn5kaFOSPeC\n 112, 105, 108,  75,  73, 110,  10,  90,  53,  55,  81, 122, // pilKIn.Z57Qz\n 120, 112, 101,  82,  43, 110,  66, 115, 113,  84,  80,  51, // xpeR+nBsqTP3\n  85,  69,  97,  66,  85,  54,  98,  83,  43,  53,  75,  98, // UEaBU6bS+5Kb\n  49,  86,  83, 115, 121,  83, 104,  78, 119, 114, 114,  90, // 1VSsyShNwrrZ\n  72,  89, 113,  76, 105, 122, 122,  47,  84, 116,  49, 107, // HYqLizz/Tt1k\n  76,  47,  54,  99, 100, 106,  72,  80,  84, 102,  83,  10, // L/6cdjHPTfS.\n 116,  81,  87,  86,  89, 114, 109, 109,  51, 111, 107,  57, // tQWVYrmm3ok9\n  78, 110, 115,  52, 100,  48, 105,  88, 114,  75,  89, 103, // Nns4d0iXrKYg\n 106, 121,  54, 109, 121,  81, 122,  67, 115, 112, 108,  70, // jy6myQzCsplF\n  65,  77, 102,  79,  69,  86,  69, 105,  73, 117,  67, 108, // AMfOEVEiIuCl\n  54, 114,  89,  86,  83,  65, 108, 107,  54, 108,  53,  80, // 6rYVSAlk6l5P\n 100,  80,  99,  70,  10,  80, 115, 101,  75,  85, 103, 122, // dPcF.PseKUgz\n  98,  70,  98,  83,  57,  98,  90, 118, 108, 120, 114,  70, // bFbS9bZvlxrF\n  85,  97,  75, 110, 106,  97,  90,  67,  50, 109, 113,  85, // UaKnjaZC2mqU\n  80, 117,  76, 107,  47,  73,  72,  50, 117,  83, 114,  87, // PuLk/IH2uSrW\n  52, 110,  79,  81, 100, 116, 113, 118, 109, 108,  75,  88, // 4nOQdtqvmlKX\n  66, 120,  52,  79, 116,  50,  47,  85, 110,  10, 104, 119, // Bx4Ot2/Un.hw\n  52,  69,  98,  78,  88,  47,  51,  97,  66, 100,  55,  89, // 4EbNX/3aBd7Y\n 100,  83, 116, 121, 115,  86,  65, 113,  52,  53, 112, 109, // dStysVAq45pm\n 112,  48,  54, 100, 114,  69,  53,  55, 120,  78,  78,  66, // p06drE57xNNB\n  54, 112,  88,  69,  48, 122,  88,  53,  73,  74,  76,  52, // 6pXE0zX5IJL4\n 104, 109,  88,  88, 101,  88, 120, 120,  49,  50,  69,  54, // hmXXeXxx12E6\n 110,  86,  10,  53, 102,  69,  87,  67,  82,  69,  49,  49, // nV.5fEWCRE11\n  97, 122,  98,  74,  72,  70, 119,  76,  74, 104,  87,  67, // azbJHFwLJhWC\n  57, 107,  88, 116,  78,  72, 106,  85,  83, 116, 101, 100, // 9kXtNHjUSted\n 101, 106,  86,  48,  78, 120,  80,  78,  79,  51,  67,  66, // ejV0NxPNO3CB\n  87,  97,  65, 111,  99, 118, 109,  77, 119,  61,  61,  10, // WaAocvmMw==.\n  45,  45,  45,  45,  45,  69,  78,  68,  32,  67,  69,  82, // -----END CER\n  84,  73,  70,  73,  67,  65,  84,  69,  45,  45,  45,  45, // TIFICATE----\n  45,  10,  10,  83, 117,  98, 106, 101,  99, 116,  58,  32, // -..Subject: \n  67,  61,  85,  83,  44,  32,  79,  61,  83, 121, 109,  97, // C=US, O=Syma\n 110, 116, 101,  99,  32,  67, 111, 114, 112, 111, 114,  97, // ntec Corpora\n 116, 105, 111, 110,  44,  32,  79,  85,  61,  83, 121, 109, // tion, OU=Sym\n  97, 110, 116, 101,  99,  32,  84, 114, 117, 115, 116,  32, // antec Trust \n  78, 101, 116, 119, 111, 114, 107,  44,  32,  67,  78,  61, // Network, CN=\n  83, 121, 109,  97, 110, 116, 101,  99,  32,  67, 108,  97, // Symantec Cla\n 115, 115,  32,  51,  32,  69,  67,  67,  32,  50,  53,  54, // ss 3 ECC 256\n  32,  98, 105, 116,  32,  83,  83,  76,  32,  67,  65,  32, //  bit SSL CA \n  45,  32,  71,  50,  10,  78, 111, 116,  32,  66, 101, 102, // - G2.Not Bef\n 111, 114, 101,  58,  32,  77,  97, 121,  32,  49,  50,  32, // ore: May 12 \n  48,  48,  58,  48,  48,  58,  48,  48,  32,  50,  48,  49, // 00:00:00 201\n  53,  32,  71,  77,  84,  10,  78, 111, 116,  32,  65, 102, // 5 GMT.Not Af\n 116, 101, 114,  32,  58,  32,  77,  97, 121,  32,  49,  49, // ter : May 11\n  32,  50,  51,  58,  53,  57,  58,  53,  57,  32,  50,  48, //  23:59:59 20\n  50,  53,  32,  71,  77,  84,  10,  45,  45,  45,  45,  45, // 25 GMT.-----\n  66,  69,  71,  73,  78,  32,  67,  69,  82,  84,  73,  70, // BEGIN CERTIF\n  73,  67,  65,  84,  69,  45,  45,  45,  45,  45,  10,  77, // ICATE-----.M\n  73,  73,  69,  97, 106,  67,  67,  65,  49,  75, 103,  65, // IIEajCCA1KgA\n 119,  73,  66,  65, 103,  73,  81,  80,  53,  75,  72, 118, // wIBAgIQP5KHv\n 112,  48, 100, 112,  75,  78,  54, 110, 102,  89, 111,  76, // p0dpKN6nfYoL\n 110, 100,  97, 120,  68,  65,  78,  66, 103, 107, 113, 104, // ndaxDANBgkqh\n 107, 105,  71,  57, 119,  48,  66,  65,  81, 115,  70,  65, // kiG9w0BAQsFA\n  68,  67,  66,  10, 121, 106,  69,  76,  77,  65, 107,  71, // DCB.yjELMAkG\n  65,  49,  85,  69,  66, 104,  77,  67,  86,  86,  77, 120, // A1UEBhMCVVMx\n  70, 122,  65,  86,  66, 103,  78,  86,  66,  65, 111,  84, // FzAVBgNVBAoT\n  68, 108,  90, 108,  99, 109, 108,  84,  97,  87, 100, 117, // DlZlcmlTaWdu\n  76,  67,  66,  74,  98, 109,  77, 117,  77,  82,  56, 119, // LCBJbmMuMR8w\n  72,  81,  89,  68,  86,  81,  81,  76,  10,  69, 120,  90, // HQYDVQQL.ExZ\n  87,  90,  88,  74, 112,  85,  50, 108, 110,  98, 105,  66, // WZXJpU2lnbiB\n  85,  99, 110,  86, 122, 100,  67,  66,  79,  90,  88,  82, // UcnVzdCBOZXR\n  51,  98,  51,  74, 114,  77,  84, 111, 119,  79,  65,  89, // 3b3JrMTowOAY\n  68,  86,  81,  81,  76,  69, 122,  69, 111,  89, 121, 107, // DVQQLEzEoYyk\n 103,  77, 106,  65, 119,  78, 105,  66,  87,  90,  88,  74, // gMjAwNiBWZXJ\n 112,  10,  85,  50, 108, 110,  98, 105, 119, 103,  83,  87, // p.U2lnbiwgSW\n  53, 106,  76, 105,  65, 116,  73,  69,  90, 118,  99, 105, // 5jLiAtIEZvci\n  66, 104, 100,  88,  82, 111,  98,  51,  74, 112, 101, 109, // BhdXRob3Jpem\n  86, 107,  73,  72,  86, 122,  90,  83,  66, 118,  98, 109, // VkIHVzZSBvbm\n 120,  53,  77,  85,  85, 119,  81, 119,  89,  68,  86,  81, // x5MUUwQwYDVQ\n  81,  68,  69, 122, 120,  87,  10,  90,  88,  74, 112,  85, // QDEzxW.ZXJpU\n  50, 108, 110,  98, 105,  66,  68,  98,  71,  70, 122,  99, // 2lnbiBDbGFzc\n 121,  65, 122,  73,  70,  66,  49,  89, 109, 120, 112,  89, // yAzIFB1YmxpY\n 121,  66,  81,  99, 109, 108, 116,  89,  88,  74,  53,  73, // yBQcmltYXJ5I\n  69,  78, 108,  99, 110,  82, 112,  90, 109, 108, 106,  89, // ENlcnRpZmljY\n  88,  82, 112,  98,  50,  52, 103,  81,  88,  86,  48,  10, // XRpb24gQXV0.\n  97,  71,  57, 121,  97,  88,  82,  53,  73,  67,  48, 103, // aG9yaXR5IC0g\n  82, 122,  85, 119,  72, 104,  99,  78,  77,  84,  85, 119, // RzUwHhcNMTUw\n  78,  84,  69, 121,  77,  68,  65, 119,  77,  68,  65, 119, // NTEyMDAwMDAw\n  87, 104,  99,  78,  77, 106,  85, 119,  78,  84,  69, 120, // WhcNMjUwNTEx\n  77, 106,  77,  49,  79,  84,  85,  53,  87, 106,  67,  66, // MjM1OTU5WjCB\n 103,  68,  69,  76,  10,  77,  65, 107,  71,  65,  49,  85, // gDEL.MAkGA1U\n  69,  66, 104,  77,  67,  86,  86,  77, 120,  72,  84,  65, // EBhMCVVMxHTA\n  98,  66, 103,  78,  86,  66,  65, 111,  84,  70,  70,  78, // bBgNVBAoTFFN\n  53,  98,  87,  70, 117, 100,  71,  86, 106,  73,  69,  78, // 5bWFudGVjIEN\n 118,  99, 110,  66, 118,  99, 109,  70,  48,  97,  87,  57, // vcnBvcmF0aW9\n 117,  77,  82,  56, 119,  72,  81,  89,  68,  10,  86,  81, // uMR8wHQYD.VQ\n  81,  76,  69, 120,  90,  84, 101,  87,  49, 104,  98, 110, // QLExZTeW1hbn\n  82, 108,  89, 121,  66,  85,  99, 110,  86, 122, 100,  67, // RlYyBUcnVzdC\n  66,  79,  90,  88,  82,  51,  98,  51,  74, 114,  77,  84, // BOZXR3b3JrMT\n  69, 119,  76, 119,  89,  68,  86,  81,  81,  68,  69, 121, // EwLwYDVQQDEy\n 104,  84, 101,  87,  49, 104,  98, 110,  82, 108,  89, 121, // hTeW1hbnRlYy\n  66,  68,  10,  98,  71,  70, 122,  99, 121,  65, 122,  73, // BD.bGFzcyAzI\n  69,  86,  68,  81, 121,  65, 121,  78,  84,  89, 103,  89, // EVDQyAyNTYgY\n 109, 108,  48,  73,  70,  78,  84,  84,  67,  66,  68,  81, // ml0IFNTTCBDQ\n  83,  65, 116,  73,  69,  99, 121,  77,  70, 107, 119,  69, // SAtIEcyMFkwE\n 119,  89,  72,  75, 111,  90,  73, 122, 106,  48,  67,  65, // wYHKoZIzj0CA\n  81,  89,  73,  75, 111,  90,  73,  10, 122, 106,  48,  68, // QYIKoZI.zj0D\n  65,  81,  99,  68,  81, 103,  65,  69,  68, 120, 117, 107, // AQcDQgAEDxuk\n 107, 100, 102, 110, 114,  79, 102,  82,  84, 107,  54,  51, // kdfnrOfRTk63\n  90,  70, 118, 104, 106,  51,  57, 117,  66,  78,  79, 114, // ZFvhj39uBNOr\n  79,  78, 116,  69, 116,  48,  66,  99,  98,  98,  50,  87, // ONtEt0Bcbb2W\n 108, 106, 102, 102, 101,  89, 109,  71,  90,  47, 101, 120, // ljffeYmGZ/ex\n  10,  72, 119, 105, 101,  47,  87,  77,  55,  82, 111, 121, // .Hwie/WM7Roy\n 102, 118,  86,  80, 111,  70, 100, 121,  88,  80, 105, 117, // fvVPoFdyXPiu\n  66,  82, 113,  50,  71, 102, 119,  52,  66,  79,  97,  79, // BRq2Gfw4BOaO\n  67,  65,  86,  48, 119, 103, 103,  70,  90,  77,  67,  52, // CAV0wggFZMC4\n  71,  67,  67, 115,  71,  65,  81,  85,  70,  66, 119,  69, // GCCsGAQUFBwE\n  66,  66,  67,  73, 119,  10,  73,  68,  65, 101,  66, 103, // BBCIw.IDAeBg\n 103, 114,  66, 103,  69,  70,  66,  81,  99, 119,  65,  89, // grBgEFBQcwAY\n  89,  83,  97,  72,  82,  48,  99,  68, 111, 118,  76,  51, // YSaHR0cDovL3\n  77, 117,  99,  51, 108, 116,  89,  50,  81, 117,  89,  50, // Muc3ltY2QuY2\n  57, 116,  77,  66,  73,  71,  65,  49,  85, 100,  69, 119, // 9tMBIGA1UdEw\n  69,  66,  47, 119,  81,  73,  77,  65,  89,  66,  10,  65, // EB/wQIMAYB.A\n 102,  56,  67,  65,  81,  65, 119,  90,  81,  89,  68,  86, // f8CAQAwZQYDV\n  82,  48, 103,  66,  70,  52, 119,  88,  68,  66,  97,  66, // R0gBF4wXDBaB\n 103, 112, 103, 104, 107, 103,  66, 104, 118, 104,  70,  65, // gpghkgBhvhFA\n  81,  99,  50,  77,  69, 119, 119,  73, 119,  89,  73,  75, // Qc2MEwwIwYIK\n 119,  89,  66,  66,  81,  85,  72,  65, 103,  69,  87,  70, // wYBBQUHAgEWF\n  50, 104,  48,  10, 100,  72,  66, 122,  79, 105,  56, 118, // 2h0.dHBzOi8v\n  90,  67,  53, 122, 101,  87,  49, 106,  89, 105,  53, 106, // ZC5zeW1jYi5j\n  98,  50,  48, 118,  89,  51,  66, 122,  77,  67,  85,  71, // b20vY3BzMCUG\n  67,  67, 115,  71,  65,  81,  85,  70,  66, 119,  73,  67, // CCsGAQUFBwIC\n  77,  66, 107,  97,  70,  50, 104,  48, 100,  72,  66, 122, // MBkaF2h0dHBz\n  79, 105,  56, 118,  90,  67,  53, 122,  10, 101,  87,  49, // Oi8vZC5z.eW1\n 106,  89, 105,  53, 106,  98,  50,  48, 118,  99, 110,  66, // jYi5jb20vcnB\n 104,  77,  67,  56,  71,  65,  49,  85, 100,  72, 119,  81, // hMC8GA1UdHwQ\n 111,  77,  67,  89, 119,  74,  75,  65, 105, 111,  67,  67, // oMCYwJKAioCC\n  71,  72, 109, 104,  48, 100,  72,  65,  54,  76, 121,  57, // GHmh0dHA6Ly9\n 122,  76, 110,  78,  53,  98,  87,  78, 105,  76, 109,  78, // zLnN5bWNiLmN\n 118,  10,  98,  83,  57, 119,  89,  50,  69, 122,  76,  87, // v.bS9wY2EzLW\n  99,  49,  76, 109,  78, 121,  98,  68,  65,  79,  66, 103, // c1LmNybDAOBg\n  78,  86,  72,  81,  56,  66,  65, 102,  56,  69,  66,  65, // NVHQ8BAf8EBA\n  77,  67,  65,  81,  89, 119,  75, 119,  89,  68,  86,  82, // MCAQYwKwYDVR\n  48,  82,  66,  67,  81, 119,  73, 113,  81, 103,  77,  66, // 0RBCQwIqQgMB\n  52, 120,  72,  68,  65,  97,  10,  66, 103,  78,  86,  66, // 4xHDAa.BgNVB\n  65,  77,  84,  69,  49,  78,  90,  84,  85,  77, 116,  82, // AMTE1NZTUMtR\n  85,  78,  68,  76,  85,  78,  66,  76,  88,  65, 121,  78, // UNDLUNBLXAyN\n  84,  89, 116,  77, 106,  73, 119,  72,  81,  89,  68,  86, // TYtMjIwHQYDV\n  82,  48,  79,  66,  66,  89,  69,  70,  67,  88, 119, 105, // R0OBBYEFCXwi\n 117,  70,  76, 101, 116, 107,  66, 108,  81, 114, 116,  10, // uFLetkBlQrt.\n 120, 108,  80, 120, 106,  72, 103, 102,  50, 102,  80,  52, // xlPxjHgf2fP4\n  77,  66,  56,  71,  65,  49,  85, 100,  73, 119,  81,  89, // MB8GA1UdIwQY\n  77,  66,  97,  65,  70,  72,  47,  84,  90,  97, 102,  67, // MBaAFH/TZafC\n  51, 101, 121,  55,  56,  68,  65,  74,  56,  48,  77,  53, // 3ey78DAJ80M5\n  43, 103,  75, 118,  77, 122,  69, 122,  77,  65,  48,  71, // +gKvMzEzMA0G\n  67,  83, 113,  71,  10,  83,  73,  98,  51,  68,  81,  69, // CSqG.SIb3DQE\n  66,  67, 119,  85,  65,  65,  52,  73,  66,  65,  81,  65, // BCwUAA4IBAQA\n  77,  77,  71,  85,  88,  66,  97,  87,  84, 100,  97,  76, // MMGUXBaWTdaL\n 120, 115,  84,  71, 116,  99,  66,  47, 110,  97, 113, 106, // xsTGtcB/naqj\n  73,  81, 114,  76, 118, 111,  86,  57,  78,  71,  43,  55, // IQrLvoV9NG+7\n  77, 111,  72, 112,  71, 100,  47,  54,  57,  10, 100,  90, // MoHpGd/69.dZ\n  47, 104,  50, 122,  79, 121,  55, 115,  71,  70,  85,  72, // /h2zOy7sGFUH\n 111,  71,  47,  48,  72,  71,  82,  65,  57, 114, 120,  84, // oG/0HGRA9rxT\n  47,  53, 119,  53,  71, 107,  69,  86,  73,  86, 107, 120, // /5w5GkEVIVkx\n 116,  87, 121,  73,  87,  87, 113,  54, 114, 115,  52,  67, // tWyIWWq6rs4C\n  84,  90, 116,  56,  66, 101, 106,  47,  75,  72,  89,  82, // TZt8Bej/KHYR\n  98, 111,  10, 106, 116,  69,  68,  85, 107,  67,  84,  90, // bo.jtEDUkCTZ\n  83,  84,  76, 105,  67, 118, 103, 117,  80, 121, 118, 105, // STLiCvguPyvi\n 110,  88, 103, 120, 121,  43,  76,  72,  84,  43,  80, 109, // nXgxy+LHT+Pm\n 100, 116,  69, 102,  88, 115, 118,  99, 100,  98, 101,  66, // dtEfXsvcdbeB\n  83,  87,  85,  89, 112,  79, 115,  68,  89, 118,  68,  50, // SWUYpOsDYvD2\n 104,  78, 116, 122,  57, 100, 119,  10,  79, 100,  53, 110, // hNtz9dw.Od5n\n  66, 111, 115,  77,  65, 112, 109, 100, 120, 116,  43, 122, // BosMApmdxt+z\n  55,  76,  81, 121,  90, 117,  56, 119,  77, 110, 102,  73, // 7LQyZu8wMnfI\n  49,  85,  54,  73,  77,  79,  43,  82,  87, 111, 119, 120, // 1U6IMO+RWowx\n  90,  56, 117, 121,  48, 111, 115, 119, 100,  70,  89, 100, // Z8uy0oswdFYd\n  51,  50, 108,  57, 120, 101,  43,  97,  65,  69,  47, 107, // 32l9xe+aAE/k\n  10, 121,  57,  97, 108,  76, 117,  47,  77,  57, 112, 118, // .y9alLu/M9pv\n 120, 105,  85,  75, 117, 102, 113,  72,  74,  82, 103,  68, // xiUKufqHJRgD\n  66,  75,  65,  54, 117,  68, 106,  72,  76,  77,  80,  88, // BKA6uDjHLMPX\n  43,  47, 110, 120,  88,  97,  78,  67,  80,  88,  51,  83, // +/nxXaNCPX3S\n  73,  52,  75,  86,  90,  49, 115, 116,  72,  81,  47,  85, // I4KVZ1stHQ/U\n  53, 111,  78, 108,  77,  10, 100,  72,  78,  57, 117, 109, // 5oNlM.dHN9um\n  65, 118, 108,  85,  51,  49,  51, 103,  48,  73, 103,  74, // AvlU313g0IgJ\n 114, 106, 115,  81,  50, 110,  73, 100, 102,  57, 100, 115, // rjsQ2nIdf9ds\n 100,  80,  43,  54, 108, 114, 109,  80,  55, 115,  10,  45, // dP+6lrmP7s.-\n  45,  45,  45,  45,  69,  78,  68,  32,  67,  69,  82,  84, // ----END CERT\n  73,  70,  73,  67,  65,  84,  69,  45,  45,  45,  45,  45, // IFICATE-----\n  10,  10,  83, 117,  98, 106, 101,  99, 116,  58,  32,  67, // ..Subject: C\n  61,  85,  83,  44,  32,  79,  61,  86, 101, 114, 105,  83, // =US, O=VeriS\n 105, 103, 110,  44,  32,  73, 110,  99,  46,  44,  32,  79, // ign, Inc., O\n  85,  61,  86, 101, 114, 105,  83, 105, 103, 110,  32,  84, // U=VeriSign T\n 114, 117, 115, 116,  32,  78, 101, 116, 119, 111, 114, 107, // rust Network\n  44,  32,  79,  85,  61,  40,  99,  41,  32,  50,  48,  48, // , OU=(c) 200\n  54,  32,  86, 101, 114, 105,  83, 105, 103, 110,  44,  32, // 6 VeriSign, \n  73, 110,  99,  46,  32,  45,  32,  70, 111, 114,  32,  97, // Inc. - For a\n 117, 116, 104, 111, 114, 105, 122, 101, 100,  32, 117, 115, // uthorized us\n 101,  32, 111, 110, 108, 121,  44,  32,  67,  78,  61,  86, // e only, CN=V\n 101, 114, 105,  83, 105, 103, 110,  32,  67, 108,  97, 115, // eriSign Clas\n 115,  32,  51,  32,  80, 117,  98, 108, 105,  99,  32,  80, // s 3 Public P\n 114, 105, 109,  97, 114, 121,  32,  67, 101, 114, 116, 105, // rimary Certi\n 102, 105,  99,  97, 116, 105, 111, 110,  32,  65, 117, 116, // fication Aut\n 104, 111, 114, 105, 116, 121,  32,  45,  32,  71,  53,  10, // hority - G5.\n  78, 111, 116,  32,  66, 101, 102, 111, 114, 101,  58,  32, // Not Before: \n  78, 111, 118,  32,  32,  56,  32,  48,  48,  58,  48,  48, // Nov  8 00:00\n  58,  48,  48,  32,  50,  48,  48,  54,  32,  71,  77,  84, // :00 2006 GMT\n  10,  78, 111, 116,  32,  65, 102, 116, 101, 114,  32,  58, // .Not After :\n  32,  74, 117, 108,  32,  49,  54,  32,  50,  51,  58,  53, //  Jul 16 23:5\n  57,  58,  53,  57,  32,  50,  48,  51,  54,  32,  71,  77, // 9:59 2036 GM\n  84,  10,  45,  45,  45,  45,  45,  66,  69,  71,  73,  78, // T.-----BEGIN\n  32,  67,  69,  82,  84,  73,  70,  73,  67,  65,  84,  69, //  CERTIFICATE\n  45,  45,  45,  45,  45,  10,  77,  73,  73,  69,  48, 122, // -----.MIIE0z\n  67,  67,  65,  55, 117, 103,  65, 119,  73,  66,  65, 103, // CCA7ugAwIBAg\n  73,  81,  71,  78, 114,  82, 110, 105,  90,  57,  54,  76, // IQGNrRniZ96L\n 116,  75,  73,  86, 106,  78, 122,  71, 115,  55,  83, 106, // tKIVjNzGs7Sj\n  65,  78,  66, 103, 107, 113, 104, 107, 105,  71,  57, 119, // ANBgkqhkiG9w\n  48,  66,  65,  81,  85,  70,  65,  68,  67,  66,  10, 121, // 0BAQUFADCB.y\n 106,  69,  76,  77,  65, 107,  71,  65,  49,  85,  69,  66, // jELMAkGA1UEB\n 104,  77,  67,  86,  86,  77, 120,  70, 122,  65,  86,  66, // hMCVVMxFzAVB\n 103,  78,  86,  66,  65, 111,  84,  68, 108,  90, 108,  99, // gNVBAoTDlZlc\n 109, 108,  84,  97,  87, 100, 117,  76,  67,  66,  74,  98, // mlTaWduLCBJb\n 109,  77, 117,  77,  82,  56, 119,  72,  81,  89,  68,  86, // mMuMR8wHQYDV\n  81,  81,  76,  10,  69, 120,  90,  87,  90,  88,  74, 112, // QQL.ExZWZXJp\n  85,  50, 108, 110,  98, 105,  66,  85,  99, 110,  86, 122, // U2lnbiBUcnVz\n 100,  67,  66,  79,  90,  88,  82,  51,  98,  51,  74, 114, // dCBOZXR3b3Jr\n  77,  84, 111, 119,  79,  65,  89,  68,  86,  81,  81,  76, // MTowOAYDVQQL\n  69, 122,  69, 111,  89, 121, 107, 103,  77, 106,  65, 119, // EzEoYykgMjAw\n  78, 105,  66,  87,  90,  88,  74, 112,  10,  85,  50, 108, // NiBWZXJp.U2l\n 110,  98, 105, 119, 103,  83,  87,  53, 106,  76, 105,  65, // nbiwgSW5jLiA\n 116,  73,  69,  90, 118,  99, 105,  66, 104, 100,  88,  82, // tIEZvciBhdXR\n 111,  98,  51,  74, 112, 101, 109,  86, 107,  73,  72,  86, // ob3JpemVkIHV\n 122,  90,  83,  66, 118,  98, 109, 120,  53,  77,  85,  85, // zZSBvbmx5MUU\n 119,  81, 119,  89,  68,  86,  81,  81,  68,  69, 122, 120, // wQwYDVQQDEzx\n  87,  10,  90,  88,  74, 112,  85,  50, 108, 110,  98, 105, // W.ZXJpU2lnbi\n  66,  68,  98,  71,  70, 122,  99, 121,  65, 122,  73,  70, // BDbGFzcyAzIF\n  66,  49,  89, 109, 120, 112,  89, 121,  66,  81,  99, 109, // B1YmxpYyBQcm\n 108, 116,  89,  88,  74,  53,  73,  69,  78, 108,  99, 110, // ltYXJ5IENlcn\n  82, 112,  90, 109, 108, 106,  89,  88,  82, 112,  98,  50, // RpZmljYXRpb2\n  52, 103,  81,  88,  86,  48,  10,  97,  71,  57, 121,  97, // 4gQXV0.aG9ya\n  88,  82,  53,  73,  67,  48, 103,  82, 122,  85, 119,  72, // XR5IC0gRzUwH\n 104,  99,  78,  77,  68,  89, 120,  77,  84,  65,  52,  77, // hcNMDYxMTA4M\n  68,  65, 119,  77,  68,  65, 119,  87, 104,  99,  78,  77, // DAwMDAwWhcNM\n 122,  89, 119,  78, 122,  69,  50,  77, 106,  77,  49,  79, // zYwNzE2MjM1O\n  84,  85,  53,  87, 106,  67,  66, 121, 106,  69,  76,  10, // TU5WjCByjEL.\n  77,  65, 107,  71,  65,  49,  85,  69,  66, 104,  77,  67, // MAkGA1UEBhMC\n  86,  86,  77, 120,  70, 122,  65,  86,  66, 103,  78,  86, // VVMxFzAVBgNV\n  66,  65, 111,  84,  68, 108,  90, 108,  99, 109, 108,  84, // BAoTDlZlcmlT\n  97,  87, 100, 117,  76,  67,  66,  74,  98, 109,  77, 117, // aWduLCBJbmMu\n  77,  82,  56, 119,  72,  81,  89,  68,  86,  81,  81,  76, // MR8wHQYDVQQL\n  69, 120,  90,  87,  10,  90,  88,  74, 112,  85,  50, 108, // ExZW.ZXJpU2l\n 110,  98, 105,  66,  85,  99, 110,  86, 122, 100,  67,  66, // nbiBUcnVzdCB\n  79,  90,  88,  82,  51,  98,  51,  74, 114,  77,  84, 111, // OZXR3b3JrMTo\n 119,  79,  65,  89,  68,  86,  81,  81,  76,  69, 122,  69, // wOAYDVQQLEzE\n 111,  89, 121, 107, 103,  77, 106,  65, 119,  78, 105,  66, // oYykgMjAwNiB\n  87,  90,  88,  74, 112,  85,  50, 108, 110,  10,  98, 105, // WZXJpU2ln.bi\n 119, 103,  83,  87,  53, 106,  76, 105,  65, 116,  73,  69, // wgSW5jLiAtIE\n  90, 118,  99, 105,  66, 104, 100,  88,  82, 111,  98,  51, // ZvciBhdXRob3\n  74, 112, 101, 109,  86, 107,  73,  72,  86, 122,  90,  83, // JpemVkIHVzZS\n  66, 118,  98, 109, 120,  53,  77,  85,  85, 119,  81, 119, // Bvbmx5MUUwQw\n  89,  68,  86,  81,  81,  68,  69, 122, 120,  87,  90,  88, // YDVQQDEzxWZX\n  74, 112,  10,  85,  50, 108, 110,  98, 105,  66,  68,  98, // Jp.U2lnbiBDb\n  71,  70, 122,  99, 121,  65, 122,  73,  70,  66,  49,  89, // GFzcyAzIFB1Y\n 109, 120, 112,  89, 121,  66,  81,  99, 109, 108, 116,  89, // mxpYyBQcmltY\n  88,  74,  53,  73,  69,  78, 108,  99, 110,  82, 112,  90, // XJ5IENlcnRpZ\n 109, 108, 106,  89,  88,  82, 112,  98,  50,  52, 103,  81, // mljYXRpb24gQ\n  88,  86,  48,  97,  71,  57, 121,  10,  97,  88,  82,  53, // XV0aG9y.aXR5\n  73,  67,  48, 103,  82, 122,  85, 119, 103, 103,  69, 105, // IC0gRzUwggEi\n  77,  65,  48,  71,  67,  83, 113,  71,  83,  73,  98,  51, // MA0GCSqGSIb3\n  68,  81,  69,  66,  65,  81,  85,  65,  65,  52,  73,  66, // DQEBAQUAA4IB\n  68, 119,  65, 119, 103, 103,  69,  75,  65, 111,  73,  66, // DwAwggEKAoIB\n  65,  81,  67, 118,  74,  65, 103,  73,  75,  88, 111,  49, // AQCvJAgIKXo1\n  10, 110, 109,  65,  77, 113, 117, 100,  76,  79,  48,  55, // .nmAMqudLO07\n  99, 102,  76, 119,  56,  82,  82, 121,  55,  75,  43,  68, // cfLw8RRy7K+D\n  43,  75,  81,  76,  53,  86, 119, 105, 106,  90,  73,  85, // +KQL5VwijZIU\n  86,  74,  47,  88, 120, 114,  99, 103, 120, 105,  86,  48, // VJ/XxrcgxiV0\n 105,  54,  67, 113, 113, 112, 107,  75, 122, 106,  47, 105, // i6CqqpkKzj/i\n  53,  86,  98, 101, 120,  10, 116,  48, 117, 122,  47, 111, // 5Vbex.t0uz/o\n  57,  43,  66,  49, 102, 115,  55,  48,  80,  98,  90, 109, // 9+B1fs70PbZm\n  73,  86,  89,  99,  57, 103,  68,  97,  84,  89,  51, 118, // IVYc9gDaTY3v\n 106, 103, 119,  50,  73,  73,  80,  86,  81,  84,  54,  48, // jgw2IIPVQT60\n 110,  75,  87,  86,  83,  70,  74, 117,  85, 114, 106, 120, // nKWVSFJuUrjx\n 117, 102,  54,  47,  87, 104, 107,  99,  73, 122,  10,  83, // uf6/WhkcIz.S\n 100, 104,  68,  89,  50, 112,  83,  83,  57,  75,  80,  54, // dhDY2pSS9KP6\n  72,  66,  82,  84, 100,  71,  74,  97,  88, 118,  72,  99, // HBRTdGJaXvHc\n  80,  97, 122,  51,  66,  74,  48,  50,  51, 116, 100,  83, // Paz3BJ023tdS\n  49,  98,  84, 108, 114,  56,  86, 100,  54,  71, 119,  57, // 1bTlr8Vd6Gw9\n  75,  73, 108,  56, 113,  56,  99, 107, 109,  99,  89,  53, // KIl8q8ckmcY5\n 102,  81,  71,  10,  66,  79,  43,  81, 117, 101,  81,  65, // fQG.BO+QueQA\n  53,  78,  48,  54, 116,  82, 110,  47,  65, 114, 114,  48, // 5N06tRn/Arr0\n  80,  79,  55, 103, 105,  43, 115,  51, 105,  43, 122,  48, // PO7gi+s3i+z0\n  49,  54, 122, 121,  57, 118,  65,  57, 114,  57,  49,  49, // 16zy9vA9r911\n 107,  84,  77,  90,  72,  82, 120,  65, 121,  51,  81, 107, // kTMZHRxAy3Qk\n  71,  83,  71,  84,  50,  82,  84,  43,  10, 114,  67, 112, // GSGT2RT+.rCp\n  83, 120,  52,  47,  86,  66,  69, 110, 107, 106,  87,  78, // Sx4/VBEnkjWN\n  72, 105,  68, 120, 112, 103,  56, 118,  43,  82,  55,  48, // HiDxpg8v+R70\n 114, 102, 107,  47,  70, 108,  97,  52,  79, 110, 100,  84, // rfk/Fla4OndT\n  82,  81,  56,  66, 110,  99,  43,  77,  85,  67,  72,  55, // RQ8Bnc+MUCH7\n 108,  80,  53,  57, 122, 117,  68,  77,  75, 122,  49,  48, // lP59zuDMKz10\n  47,  10,  78,  73, 101,  87, 105, 117,  53,  84,  54,  67, // /.NIeWiu5T6C\n  85,  86,  65, 103,  77,  66,  65,  65,  71, 106, 103,  98, // UVAgMBAAGjgb\n  73, 119, 103,  97,  56, 119,  68, 119,  89,  68,  86,  82, // Iwga8wDwYDVR\n  48,  84,  65,  81,  72,  47,  66,  65,  85, 119,  65, 119, // 0TAQH/BAUwAw\n  69,  66,  47, 122,  65,  79,  66, 103,  78,  86,  72,  81, // EB/zAOBgNVHQ\n  56,  66,  65, 102,  56,  69,  10,  66,  65,  77,  67,  65, // 8BAf8E.BAMCA\n  81,  89, 119,  98,  81,  89,  73,  75, 119,  89,  66,  66, // QYwbQYIKwYBB\n  81,  85,  72,  65,  81, 119,  69,  89,  84,  66, 102, 111, // QUHAQwEYTBfo\n  86,  50, 103,  87, 122,  66,  90,  77,  70,  99, 119,  86, // V2gWzBZMFcwV\n  82,  89,  74,  97,  87,  49, 104,  90,  50,  85, 118,  90, // RYJaW1hZ2UvZ\n  50, 108, 109,  77,  67,  69, 119,  72, 122,  65,  72,  10, // 2lmMCEwHzAH.\n  66, 103,  85, 114,  68, 103,  77,  67,  71, 103,  81,  85, // BgUrDgMCGgQU\n 106,  43,  88,  84,  71, 111,  97, 115, 106,  89,  53, 114, // j+XTGoasjY5r\n 119,  56,  43,  65,  97, 116,  82,  73,  71,  67, 120,  55, // w8+AatRIGCx7\n  71,  83,  52, 119,  74,  82,  89, 106,  97,  72,  82,  48, // GS4wJRYjaHR0\n  99,  68, 111, 118,  76,  50, 120, 118,  90,  50,  56, 117, // cDovL2xvZ28u\n 100, 109,  86, 121,  10,  97,  88,  78, 112,  90,  50,  52, // dmVy.aXNpZ24\n 117,  89,  50,  57, 116,  76,  51,  90, 122,  98,  71,  57, // uY29tL3ZzbG9\n 110,  98, 121,  53, 110,  97,  87,  89, 119,  72,  81,  89, // nby5naWYwHQY\n  68,  86,  82,  48,  79,  66,  66,  89,  69,  70,  72,  47, // DVR0OBBYEFH/\n  84,  90,  97, 102,  67,  51, 101, 121,  55,  56,  68,  65, // TZafC3ey78DA\n  74,  56,  48,  77,  53,  43, 103,  75, 118,  10,  77, 122, // J80M5+gKv.Mz\n  69, 122,  77,  65,  48,  71,  67,  83, 113,  71,  83,  73, // EzMA0GCSqGSI\n  98,  51,  68,  81,  69,  66,  66,  81,  85,  65,  65,  52, // b3DQEBBQUAA4\n  73,  66,  65,  81,  67,  84,  74,  69, 111, 119,  88,  50, // IBAQCTJEowX2\n  76,  80,  50,  66, 113,  89,  76, 122,  51, 113,  51,  74, // LP2BqYLz3q3J\n 107, 116, 118,  88, 102,  50, 112,  88, 107, 105,  79,  79, // ktvXf2pXkiOO\n 122,  69,  10, 112,  54,  66,  52,  69, 113,  49, 105,  68, // zE.p6B4Eq1iD\n 107,  86, 119,  90,  77,  88, 110, 108,  50,  89, 116, 109, // kVwZMXnl2Ytm\n  65, 108,  43,  88,  54,  47,  87, 122,  67, 104, 108,  56, // Al+X6/WzChl8\n 103,  71, 113,  67,  66, 112,  72,  51, 118, 110,  53, 102, // gGqCBpH3vn5f\n  74,  74,  97,  67,  71, 107, 103,  68, 100, 107,  43,  98, // JJaCGkgDdk+b\n  87,  52,  56,  68,  87,  55,  89,  10,  53, 103,  97,  82, // W48DW7Y.5gaR\n  81,  66, 105,  53,  43,  77,  72, 116,  51,  57, 116,  66, // QBi5+MHt39tB\n 113, 117,  67,  87,  73,  77, 110,  78,  90,  66,  85,  52, // quCWIMnNZBU4\n 103,  99, 109,  85,  55, 113,  75,  69,  75,  81, 115,  84, // gcmU7qKEKQsT\n  98,  52,  55,  98,  68,  78,  48, 108,  65, 116, 117, 107, // b47bDN0lAtuk\n 105, 120, 108,  69,  48, 107,  70,  54,  66,  87, 108,  75, // ixlE0kF6BWlK\n  10,  87,  69,  57, 103, 121, 110,  54,  67,  97, 103, 115, // .WE9gyn6Cags\n  67, 113, 105,  85,  88,  79,  98,  88,  98, 102,  43, 101, // CqiUXObXbf+e\n  69,  90,  83, 113,  86, 105, 114,  50,  71,  51, 108,  54, // EZSqVir2G3l6\n  66,  70, 111,  77, 116,  69,  77, 122, 101,  47,  97, 105, // BFoMtEMze/ai\n  67,  75, 109,  48, 111,  72, 119,  48,  76, 120,  79,  88, // CKm0oHw0LxOX\n 110,  71, 105,  89,  90,  10,  52, 102,  81,  82,  98, 120, // nGiYZ.4fQRbx\n  67,  49, 108, 102, 122, 110,  81, 103,  85, 121,  50,  56, // C1lfznQgUy28\n  54, 100,  85,  86,  52, 111, 116, 112,  54,  70,  48,  49, // 6dUV4otp6F01\n 118, 118, 112,  88,  49,  70,  81,  72,  75,  79, 116, 119, // vvpX1FQHKOtw\n  53, 114,  68, 103,  98,  55,  77, 122,  86,  73,  99,  98, // 5rDgb7MzVIcb\n 105, 100,  74,  52, 118,  69,  90,  86,  56,  78,  10, 104, // idJ4vEZV8N.h\n 110,  97,  99,  82,  72, 114,  50, 108,  86, 122,  50,  88, // nacRHr2lVz2X\n  84,  73,  73,  77,  54,  82,  85, 116, 104, 103,  47,  97, // TIIM6RUthg/a\n  70, 122, 121,  81, 107, 113,  70,  79,  70,  83,  68,  88, // FzyQkqFOFSDX\n  57,  72, 111,  76,  80,  75, 115,  69, 100,  97, 111,  55, // 9HoLPKsEdao7\n  87,  78, 113,  10,  45,  45,  45,  45,  45,  69,  78,  68, // WNq.-----END\n  32,  67,  69,  82,  84,  73,  70,  73,  67,  65,  84,  69, //  CERTIFICATE\n  45,  45,  45,  45,  45,  10,  10,  83, 117,  98, 106, 101, // -----..Subje\n  99, 116,  58,  32,  67,  61,  85,  83,  44,  32,  79,  61, // ct: C=US, O=\n  84, 104, 101,  32,  71, 111,  32,  68,  97, 100, 100, 121, // The Go Daddy\n  32,  71, 114, 111, 117, 112,  44,  32,  73, 110,  99,  46, //  Group, Inc.\n  44,  32,  79,  85,  61,  71, 111,  32,  68,  97, 100, 100, // , OU=Go Dadd\n 121,  32,  67, 108,  97, 115, 115,  32,  50,  32,  67, 101, // y Class 2 Ce\n 114, 116, 105, 102, 105,  99,  97, 116, 105, 111, 110,  32, // rtification \n  65, 117, 116, 104, 111, 114, 105, 116, 121,  10,  78, 111, // Authority.No\n 116,  32,  66, 101, 102, 111, 114, 101,  58,  32,  74, 117, // t Before: Ju\n 110,  32,  50,  57,  32,  49,  55,  58,  48,  54,  58,  50, // n 29 17:06:2\n  48,  32,  50,  48,  48,  52,  32,  71,  77,  84,  10,  78, // 0 2004 GMT.N\n 111, 116,  32,  65, 102, 116, 101, 114,  32,  58,  32,  74, // ot After : J\n 117, 110,  32,  50,  57,  32,  49,  55,  58,  48,  54,  58, // un 29 17:06:\n  50,  48,  32,  50,  48,  51,  52,  32,  71,  77,  84,  10, // 20 2034 GMT.\n  45,  45,  45,  45,  45,  66,  69,  71,  73,  78,  32,  67, // -----BEGIN C\n  69,  82,  84,  73,  70,  73,  67,  65,  84,  69,  45,  45, // ERTIFICATE--\n  45,  45,  45,  10,  77,  73,  73,  69,  65,  68,  67,  67, // ---.MIIEADCC\n  65, 117, 105, 103,  65, 119,  73,  66,  65, 103,  73,  66, // AuigAwIBAgIB\n  65,  68,  65,  78,  66, 103, 107, 113, 104, 107, 105,  71, // ADANBgkqhkiG\n  57, 119,  48,  66,  65,  81,  85,  70,  65,  68,  66, 106, // 9w0BAQUFADBj\n  77,  81, 115, 119,  67,  81,  89,  68,  86,  81,  81,  71, // MQswCQYDVQQG\n  69, 119,  74,  86,  85, 122,  69, 104,  10,  77,  66,  56, // EwJVUzEh.MB8\n  71,  65,  49,  85,  69,  67, 104,  77,  89,  86,  71, 104, // GA1UEChMYVGh\n 108,  73,  69, 100, 118,  73,  69,  82, 104,  90,  71,  82, // lIEdvIERhZGR\n  53,  73,  69, 100, 121,  98,  51,  86, 119,  76,  67,  66, // 5IEdyb3VwLCB\n  74,  98, 109,  77, 117,  77,  84,  69, 119,  76, 119,  89, // JbmMuMTEwLwY\n  68,  86,  81,  81,  76,  69, 121, 104,  72,  98, 121,  66, // DVQQLEyhHbyB\n  69,  10,  89,  87,  82, 107, 101,  83,  66,  68,  98,  71, // E.YWRkeSBDbG\n  70, 122,  99, 121,  65, 121,  73,  69,  78, 108,  99, 110, // FzcyAyIENlcn\n  82, 112,  90, 109, 108, 106,  89,  88,  82, 112,  98,  50, // RpZmljYXRpb2\n  52, 103,  81,  88,  86,  48,  97,  71,  57, 121,  97,  88, // 4gQXV0aG9yaX\n  82,  53,  77,  66,  52,  88,  68,  84,  65,  48,  77,  68, // R5MB4XDTA0MD\n  89, 121,  79,  84,  69,  51,  10,  77,  68,  89, 121,  77, // YyOTE3.MDYyM\n  70, 111,  88,  68,  84,  77,  48,  77,  68,  89, 121,  79, // FoXDTM0MDYyO\n  84,  69,  51,  77,  68,  89, 121,  77,  70, 111, 119,  89, // TE3MDYyMFowY\n 122,  69,  76,  77,  65, 107,  71,  65,  49,  85,  69,  66, // zELMAkGA1UEB\n 104,  77,  67,  86,  86,  77, 120,  73,  84,  65, 102,  66, // hMCVVMxITAfB\n 103,  78,  86,  66,  65, 111,  84,  71,  70,  82, 111,  10, // gNVBAoTGFRo.\n  90,  83,  66,  72,  98, 121,  66,  69,  89,  87,  82, 107, // ZSBHbyBEYWRk\n 101,  83,  66,  72,  99, 109,  57,  49,  99,  67, 119, 103, // eSBHcm91cCwg\n  83,  87,  53, 106,  76, 106,  69, 120,  77,  67,  56,  71, // SW5jLjExMC8G\n  65,  49,  85,  69,  67, 120,  77, 111,  82,  50,  56, 103, // A1UECxMoR28g\n  82,  71,  70, 107,  90,  72, 107, 103,  81,  50, 120, 104, // RGFkZHkgQ2xh\n  99,  51,  77, 103,  10,  77, 105,  66,  68,  90,  88,  74, // c3Mg.MiBDZXJ\n  48,  97,  87,  90, 112,  89,  50,  70,  48,  97,  87,  57, // 0aWZpY2F0aW9\n 117,  73,  69,  70,  49, 100,  71, 104, 118,  99, 109, 108, // uIEF1dGhvcml\n  48, 101,  84,  67,  67,  65,  83,  65, 119,  68,  81,  89, // 0eTCCASAwDQY\n  74,  75, 111,  90,  73, 104, 118,  99,  78,  65,  81,  69, // JKoZIhvcNAQE\n  66,  66,  81,  65,  68, 103, 103,  69,  78,  10,  65,  68, // BBQADggEN.AD\n  67,  67,  65,  81, 103,  67, 103, 103,  69,  66,  65,  78, // CCAQgCggEBAN\n  54, 100,  49,  43, 112,  88,  71,  69, 109, 104,  87,  43, // 6d1+pXGEmhW+\n 118,  88,  88,  48, 105,  71,  54, 114,  55, 100,  47,  43, // vXX0iG6r7d/+\n  84, 118,  90, 120, 122,  48,  90,  87, 105, 122,  86,  51, // TvZxz0ZWizV3\n  71, 103,  88, 110, 101,  55,  55,  90, 116,  74,  54,  88, // GgXne77ZtJ6X\n  67,  65,  10,  80,  86,  89,  89,  89, 119, 104, 118,  50, // CA.PVYYYwhv2\n 118,  76,  77,  48,  68,  57,  47,  65, 108,  81, 105,  86, // vLM0D9/AlQiV\n  66,  68,  89, 115, 111,  72,  85, 119,  72,  85,  57,  83, // BDYsoHUwHU9S\n  51,  47,  72, 100,  56,  77,  43, 101,  75, 115,  97,  65, // 3/Hd8M+eKsaA\n  55,  85, 103,  97, 121,  57, 113,  75,  55,  72,  70, 105, // 7Ugay9qK7HFi\n  72,  55,  69, 117, 120,  54, 119,  10, 119, 100, 104,  70, // H7Eux6w.wdhF\n  74,  50,  43, 113,  78,  49, 106,  51, 104, 121,  98,  88, // J2+qN1j3hybX\n  50,  67,  51,  50, 113,  82, 101,  51,  72,  51,  73,  50, // 2C32qRe3H3I2\n  84, 113,  89,  88,  80,  50,  87,  89, 107, 116, 115, 113, // TqYXP2WYktsq\n  98, 108,  50, 105,  47, 111, 106, 103,  67,  57,  53,  47, // bl2i/ojgC95/\n  53,  89,  48,  86,  52, 101, 118,  76,  79, 116,  88, 105, // 5Y0V4evLOtXi\n  10,  69, 113,  73,  84,  76, 100, 105,  79, 114,  49,  56, // .EqITLdiOr18\n  83,  80,  97,  65,  73,  66,  81, 105,  50,  88,  75,  86, // SPaAIBQi2XKV\n 108,  79,  65,  82,  70, 109,  82,  54, 106,  89,  71,  66, // lOARFmR6jYGB\n  48, 120,  85,  71, 108,  99, 109,  73,  98,  89, 115,  85, // 0xUGlcmIbYsU\n 102,  98,  49,  56,  97,  81, 114,  52,  67,  85,  87,  87, // fb18aQr4CUWW\n 111, 114, 105,  77,  89,  10,  97, 118, 120,  52,  65,  54, // oriMY.avx4A6\n 108,  78, 102,  52,  68,  68,  43, 113, 116,  97,  47,  75, // lNf4DD+qta/K\n  70,  65, 112,  77, 111,  90,  70, 118,  54, 121, 121,  79, // FApMoZFv6yyO\n  57, 101,  99, 119,  51, 117, 100,  55,  50,  97,  57, 110, // 9ecw3ud72a9n\n 109,  89, 118,  76,  69,  72,  90,  54,  73,  86,  68, 100, // mYvLEHZ6IVDd\n  50, 103,  87,  77,  90,  69, 101, 119, 111,  43,  10,  89, // 2gWMZEewo+.Y\n 105, 104, 102, 117, 107,  69,  72,  85,  49, 106,  80,  69, // ihfukEHU1jPE\n  88,  52,  52, 100,  77,  88,  52,  47,  55,  86, 112, 107, // X44dMX4/7Vpk\n  73,  43,  69, 100,  79, 113,  88,  71,  54,  56,  67,  65, // I+EdOqXG68CA\n  81,  79, 106, 103,  99,  65, 119, 103,  98,  48, 119,  72, // QOjgcAwgb0wH\n  81,  89,  68,  86,  82,  48,  79,  66,  66,  89,  69,  70, // QYDVR0OBBYEF\n  78,  76,  69,  10, 115,  78,  75,  82,  49,  69, 119,  82, // NLE.sNKR1EwR\n  99,  98,  78, 104, 121, 122,  50, 104,  47, 116,  50, 111, // cbNhyz2h/t2o\n  97, 116,  84, 106,  77,  73,  71,  78,  66, 103,  78,  86, // atTjMIGNBgNV\n  72,  83,  77,  69, 103,  89,  85, 119, 103,  89,  75,  65, // HSMEgYUwgYKA\n  70,  78,  76,  69, 115,  78,  75,  82,  49,  69, 119,  82, // FNLEsNKR1EwR\n  99,  98,  78, 104, 121, 122,  50, 104,  10,  47, 116,  50, // cbNhyz2h./t2\n 111,  97, 116,  84, 106, 111,  87, 101, 107,  90,  84,  66, // oatTjoWekZTB\n 106,  77,  81, 115, 119,  67,  81,  89,  68,  86,  81,  81, // jMQswCQYDVQQ\n  71,  69, 119,  74,  86,  85, 122,  69, 104,  77,  66,  56, // GEwJVUzEhMB8\n  71,  65,  49,  85,  69,  67, 104,  77,  89,  86,  71, 104, // GA1UEChMYVGh\n 108,  73,  69, 100, 118,  73,  69,  82, 104,  90,  71,  82, // lIEdvIERhZGR\n  53,  10,  73,  69, 100, 121,  98,  51,  86, 119,  76,  67, // 5.IEdyb3VwLC\n  66,  74,  98, 109,  77, 117,  77,  84,  69, 119,  76, 119, // BJbmMuMTEwLw\n  89,  68,  86,  81,  81,  76,  69, 121, 104,  72,  98, 121, // YDVQQLEyhHby\n  66,  69,  89,  87,  82, 107, 101,  83,  66,  68,  98,  71, // BEYWRkeSBDbG\n  70, 122,  99, 121,  65, 121,  73,  69,  78, 108,  99, 110, // FzcyAyIENlcn\n  82, 112,  90, 109, 108, 106,  10,  89,  88,  82, 112,  98, // RpZmlj.YXRpb\n  50,  52, 103,  81,  88,  86,  48,  97,  71,  57, 121,  97, // 24gQXV0aG9ya\n  88,  82,  53, 103, 103,  69,  65,  77,  65, 119,  71,  65, // XR5ggEAMAwGA\n  49,  85, 100,  69, 119,  81,  70,  77,  65,  77,  66,  65, // 1UdEwQFMAMBA\n 102,  56, 119,  68,  81,  89,  74,  75, 111,  90,  73, 104, // f8wDQYJKoZIh\n 118,  99,  78,  65,  81,  69,  70,  66,  81,  65,  68,  10, // vcNAQEFBQAD.\n 103, 103,  69,  66,  65,  68,  74,  76,  56,  55,  76,  75, // ggEBADJL87LK\n  80, 112,  72,  56,  69, 115,  97, 104,  66,  52, 121,  79, // PpH8EsahB4yO\n 100,  54,  65, 122,  66, 104,  82,  99, 107,  66,  52,  89, // d6AzBhRckB4Y\n  57, 119, 105, 109,  80,  81, 111,  90,  43,  89, 101,  65, // 9wimPQoZ+YeA\n  69,  87,  53, 112,  53,  74,  89,  88,  77,  80,  56,  48, // EW5p5JYXMP80\n 107,  87,  78, 121,  10,  79,  79,  55,  77,  72,  65,  71, // kWNy.OO7MHAG\n 106,  72,  90,  81, 111, 112,  68,  72,  50, 101, 115,  82, // jHZQopDH2esR\n  85,  49,  47,  98, 108,  77,  86, 103,  68, 111, 115, 122, // U1/blMVgDosz\n  79,  89, 116, 117,  85,  82,  88,  79,  49, 118,  48,  88, // OYtuURXO1v0X\n  74,  74,  76,  88,  86, 103, 103,  75, 116,  73,  51, 108, // JJLXVggKtI3l\n 112, 106,  98, 105,  50,  84,  99,  55,  80,  10,  84,  77, // pjbi2Tc7P.TM\n 111, 122,  73,  43, 103,  99, 105,  75, 113, 100, 105,  48, // ozI+gciKqdi0\n  70, 117,  70, 115, 107, 103,  53,  89, 109, 101, 122,  84, // FuFskg5YmezT\n 118,  97,  99,  80, 100,  43, 109,  83,  89, 103,  70,  70, // vacPd+mSYgFF\n  81, 108, 113,  50,  53, 122, 104, 101,  97,  98,  73,  90, // Qlq25zheabIZ\n  48,  75,  98,  73,  73,  79, 113,  80, 106,  67,  68,  80, // 0KbIIOqPjCDP\n 111,  81,  10,  72, 109, 121,  87,  55,  52,  99,  78, 120, // oQ.HmyW74cNx\n  65,  57, 104, 105,  54,  51, 117, 103, 121, 117,  86,  43, // A9hi63ugyuV+\n  73,  54,  83, 104,  72,  73,  53,  54, 121,  68, 113, 103, // I6ShHI56yDqg\n  43,  50,  68, 122,  90, 100, 117,  67,  76, 122, 114,  84, // +2DzZduCLzrT\n 105,  97,  50,  99, 121, 118, 107,  48,  47,  90,  77,  47, // ia2cyvk0/ZM/\n 105,  90, 120,  52, 109,  69,  82,  10, 100,  69, 114,  47, // iZx4mER.dEr/\n  86, 120, 113,  72,  68,  51,  86,  73,  76, 115,  57,  82, // VxqHD3VILs9R\n  97,  82, 101, 103,  65, 104,  74, 104, 108, 100,  88,  82, // aRegAhJhldXR\n  81,  76,  73,  81,  84,  79,  55,  69, 114,  66,  66,  68, // QLIQTO7ErBBD\n 112, 113,  87, 101,  67, 116,  87,  86,  89, 112, 111,  78, // pqWeCtWVYpoN\n 122,  52, 105,  67, 120,  84,  73,  77,  53,  67, 117, 102, // z4iCxTIM5Cuf\n  10,  82, 101,  89,  78, 110, 121, 105,  99, 115,  98, 107, // .ReYNnyicsbk\n 113,  87, 108, 101, 116,  78, 119,  43, 118,  72,  88,  47, // qWletNw+vHX/\n  98, 118,  90,  56,  61,  10,  45,  45,  45,  45,  45,  69, // bvZ8=.-----E\n  78,  68,  32,  67,  69,  82,  84,  73,  70,  73,  67,  65, // ND CERTIFICA\n  84,  69,  45,  45,  45,  45,  45,  10,  10,  35,  32,  78, // TE-----..# N\n 111, 116, 101,  58,  32,  65, 109,  97, 122, 111, 110,  32, // ote: Amazon \n  65,  84,  83,  32, 101, 110, 100, 112, 111, 105, 110, 116, // ATS endpoint\n  32, 117, 115, 101, 115,  32, 116, 104, 105, 115,  32,  40, //  uses this (\n  50,  48,  49,  56,  47,  49,  50,  47,  49,  56,  41,  10, // 2018/12/18).\n  83, 117,  98, 106, 101,  99, 116,  58,  32,  67,  61,  85, // Subject: C=U\n  83,  44,  32,  79,  61,  83, 116,  97, 114, 102, 105, 101, // S, O=Starfie\n 108, 100,  32,  84, 101,  99, 104, 110, 111, 108, 111, 103, // ld Technolog\n 105, 101, 115,  44,  32,  73, 110,  99,  46,  44,  32,  79, // ies, Inc., O\n  85,  61,  83, 116,  97, 114, 102, 105, 101, 108, 100,  32, // U=Starfield \n  67, 108,  97, 115, 115,  32,  50,  32,  67, 101, 114, 116, // Class 2 Cert\n 105, 102, 105,  99,  97, 116, 105, 111, 110,  32,  65, 117, // ification Au\n 116, 104, 111, 114, 105, 116, 121,  10,  78, 111, 116,  32, // thority.Not \n  66, 101, 102, 111, 114, 101,  58,  32,  74, 117, 110,  32, // Before: Jun \n  50,  57,  32,  49,  55,  58,  51,  57,  58,  49,  54,  32, // 29 17:39:16 \n  50,  48,  48,  52,  32,  71,  77,  84,  10,  78, 111, 116, // 2004 GMT.Not\n  32,  65, 102, 116, 101, 114,  32,  58,  32,  74, 117, 110, //  After : Jun\n  32,  50,  57,  32,  49,  55,  58,  51,  57,  58,  49,  54, //  29 17:39:16\n  32,  50,  48,  51,  52,  32,  71,  77,  84,  10,  45,  45, //  2034 GMT.--\n  45,  45,  45,  66,  69,  71,  73,  78,  32,  67,  69,  82, // ---BEGIN CER\n  84,  73,  70,  73,  67,  65,  84,  69,  45,  45,  45,  45, // TIFICATE----\n  45,  10,  77,  73,  73,  69,  68, 122,  67,  67,  65, 118, // -.MIIEDzCCAv\n 101, 103,  65, 119,  73,  66,  65, 103,  73,  66,  65,  68, // egAwIBAgIBAD\n  65,  78,  66, 103, 107, 113, 104, 107, 105,  71,  57, 119, // ANBgkqhkiG9w\n  48,  66,  65,  81,  85,  70,  65,  68,  66, 111,  77,  81, // 0BAQUFADBoMQ\n 115, 119,  67,  81,  89,  68,  86,  81,  81,  71,  69, 119, // swCQYDVQQGEw\n  74,  86,  85, 122,  69, 108,  10,  77,  67,  77,  71,  65, // JVUzEl.MCMGA\n  49,  85,  69,  67, 104,  77,  99,  85,  51,  82, 104,  99, // 1UEChMcU3Rhc\n 109,  90, 112,  90,  87, 120, 107,  73,  70,  82, 108,  89, // mZpZWxkIFRlY\n  50, 104, 117,  98,  50, 120, 118,  90,  50, 108, 108,  99, // 2hub2xvZ2llc\n 121, 119, 103,  83,  87,  53, 106,  76, 106,  69, 121,  77, // ywgSW5jLjEyM\n  68,  65,  71,  65,  49,  85,  69,  67, 120,  77, 112,  10, // DAGA1UECxMp.\n  85,  51,  82, 104,  99, 109,  90, 112,  90,  87, 120, 107, // U3RhcmZpZWxk\n  73,  69,  78, 115,  89,  88,  78, 122,  73,  68,  73, 103, // IENsYXNzIDIg\n  81,  50,  86, 121, 100,  71, 108, 109,  97,  87,  78, 104, // Q2VydGlmaWNh\n 100,  71, 108, 118,  98, 105,  66,  66, 100,  88,  82, 111, // dGlvbiBBdXRo\n  98,  51,  74, 112, 100,  72, 107, 119,  72, 104,  99,  78, // b3JpdHkwHhcN\n  77,  68,  81, 119,  10,  78, 106,  73,  53,  77,  84,  99, // MDQw.NjI5MTc\n 122,  79,  84,  69,  50,  87, 104,  99,  78,  77, 122,  81, // zOTE2WhcNMzQ\n 119,  78, 106,  73,  53,  77,  84,  99, 122,  79,  84,  69, // wNjI5MTczOTE\n  50,  87, 106,  66, 111,  77,  81, 115, 119,  67,  81,  89, // 2WjBoMQswCQY\n  68,  86,  81,  81,  71,  69, 119,  74,  86,  85, 122,  69, // DVQQGEwJVUzE\n 108,  77,  67,  77,  71,  65,  49,  85,  69,  10,  67, 104, // lMCMGA1UE.Ch\n  77,  99,  85,  51,  82, 104,  99, 109,  90, 112,  90,  87, // McU3RhcmZpZW\n 120, 107,  73,  70,  82, 108,  89,  50, 104, 117,  98,  50, // xkIFRlY2hub2\n 120, 118,  90,  50, 108, 108,  99, 121, 119, 103,  83,  87, // xvZ2llcywgSW\n  53, 106,  76, 106,  69, 121,  77,  68,  65,  71,  65,  49, // 5jLjEyMDAGA1\n  85,  69,  67, 120,  77, 112,  85,  51,  82, 104,  99, 109, // UECxMpU3Rhcm\n  90, 112,  10,  90,  87, 120, 107,  73,  69,  78, 115,  89, // Zp.ZWxkIENsY\n  88,  78, 122,  73,  68,  73, 103,  81,  50,  86, 121, 100, // XNzIDIgQ2Vyd\n  71, 108, 109,  97,  87,  78, 104, 100,  71, 108, 118,  98, // GlmaWNhdGlvb\n 105,  66,  66, 100,  88,  82, 111,  98,  51,  74, 112, 100, // iBBdXRob3Jpd\n  72, 107, 119, 103, 103,  69, 103,  77,  65,  48,  71,  67, // HkwggEgMA0GC\n  83, 113,  71,  83,  73,  98,  51,  10,  68,  81,  69,  66, // SqGSIb3.DQEB\n  65,  81,  85,  65,  65,  52,  73,  66,  68,  81,  65, 119, // AQUAA4IBDQAw\n 103, 103,  69,  73,  65, 111,  73,  66,  65,  81,  67,  51, // ggEIAoIBAQC3\n  77, 115, 106,  43,  54,  88,  71, 109,  66,  73,  87, 116, // Msj+6XGmBIWt\n  68,  66,  70, 107,  51,  56,  53,  78,  55,  56, 103,  68, // DBFk385N78gD\n  71,  73,  99,  47, 111,  97, 118,  55,  80,  75,  97, 102, // GIc/oav7PKaf\n  10,  56,  77,  79, 104,  50, 116,  84,  89,  98, 105, 116, // .8MOh2tTYbit\n  84, 107,  80, 115, 107, 112,  68,  54,  69,  56,  74,  55, // TkPskpD6E8J7\n 111,  88,  43, 122, 108,  74,  48,  84,  49,  75,  75,  89, // oX+zlJ0T1KKY\n  47, 101,  57,  55, 103,  75, 118,  68,  73, 114,  49,  77, // /e97gKvDIr1M\n 118, 110, 115, 111,  70,  65,  90,  77, 101, 106,  50,  89, // vnsoFAZMej2Y\n  99,  79,  97, 100,  78,  10,  43, 108, 113,  50,  99, 119, // cOadN.+lq2cw\n  81, 108,  90, 117, 116,  51, 102,  43, 100,  90, 120, 107, // QlZut3f+dZxk\n 113,  90,  74,  82,  82,  85,  54, 121,  98,  72,  56,  51, // qZJRRU6ybH83\n  56,  90,  49,  84,  66, 119, 106,  54,  43, 119,  82, 105, // 8Z1TBwj6+wRi\n 114,  47, 114, 101, 115, 112,  55, 100, 101, 102, 113, 103, // r/resp7defqg\n  83,  72, 111,  57,  84,  53, 105,  97,  85,  48,  10,  88, // SHo9T5iaU0.X\n  57, 116,  68, 107,  89,  73,  50,  50,  87,  89,  56, 115, // 9tDkYI22WY8s\n  98, 105,  53, 103, 118,  50,  99,  79, 106,  52,  81, 121, // bi5gv2cOj4Qy\n  68, 118, 118,  66, 109,  86, 109, 101, 112, 115,  90,  71, // DvvBmVmepsZG\n  68,  51,  47,  99,  86,  69,  56,  77,  67,  53, 102, 118, // D3/cVE8MC5fv\n 106,  49,  51,  99,  55,  74, 100,  66, 109, 122,  68,  73, // j13c7JdBmzDI\n  49,  97,  97,  10,  75,  52,  85, 109, 107, 104, 121, 110, // 1aa.K4Umkhyn\n  65, 114,  80, 107,  80, 119,  50, 118,  67,  72, 109,  67, // ArPkPw2vCHmC\n 117,  68,  89,  57,  54, 112, 122,  84,  78,  98,  79,  56, // uDY96pzTNbO8\n  97,  99, 114,  49, 122,  74,  51, 111,  47,  87,  83,  78, // acr1zJ3o/WSN\n  70,  52,  65, 122,  98, 108,  53,  75,  88,  90, 110,  74, // F4Azbl5KXZnJ\n  72, 111, 101,  48, 110,  82, 114,  65,  10,  49,  87,  52, // Hoe0nRrA.1W4\n  84,  78,  83,  78, 101,  51,  53, 116, 102,  80, 101,  47, // TNSNe35tfPe/\n  87,  57,  51,  98,  67,  54, 106,  54,  55, 101,  65,  48, // W93bC6j67eA0\n  99,  81, 109, 100, 114,  66,  78, 106,  52,  49, 116, 112, // cQmdrBNj41tp\n 118, 105,  47,  74,  69, 111,  65,  71, 114,  65, 103,  69, // vi/JEoAGrAgE\n  68, 111,  52,  72,  70,  77,  73,  72,  67,  77,  66,  48, // Do4HFMIHCMB0\n  71,  10,  65,  49,  85, 100,  68, 103,  81,  87,  66,  66, // G.A1UdDgQWBB\n  83,  47,  88,  55, 102,  82, 122, 116,  48, 102, 104, 118, // S/X7fRzt0fhv\n  82,  98,  86,  97, 122,  99,  49, 120,  68,  67,  68, 113, // RbVazc1xDCDq\n 109,  73,  53, 122,  67,  66, 107, 103,  89,  68,  86,  82, // mI5zCBkgYDVR\n  48, 106,  66,  73,  71,  75,  77,  73,  71,  72, 103,  66, // 0jBIGKMIGHgB\n  83,  47,  88,  55, 102,  82,  10, 122, 116,  48, 102, 104, // S/X7fR.zt0fh\n 118,  82,  98,  86,  97, 122,  99,  49, 120,  68,  67,  68, // vRbVazc1xDCD\n 113, 109,  73,  53,  54,  70, 115, 112,  71, 111, 119,  97, // qmI56FspGowa\n  68,  69,  76,  77,  65, 107,  71,  65,  49,  85,  69,  66, // DELMAkGA1UEB\n 104,  77,  67,  86,  86,  77, 120,  74,  84,  65, 106,  66, // hMCVVMxJTAjB\n 103,  78,  86,  66,  65, 111,  84,  72,  70,  78,  48,  10, // gNVBAoTHFN0.\n  89,  88,  74, 109,  97,  87,  86, 115,  90,  67,  66,  85, // YXJmaWVsZCBU\n  90,  87,  78, 111,  98, 109,  57, 115,  98,  50, 100, 112, // ZWNobm9sb2dp\n  90,  88,  77, 115,  73,  69, 108, 117,  89, 121,  52, 120, // ZXMsIEluYy4x\n  77, 106,  65, 119,  66, 103,  78,  86,  66,  65, 115,  84, // MjAwBgNVBAsT\n  75,  86,  78,  48,  89,  88,  74, 109,  97,  87,  86, 115, // KVN0YXJmaWVs\n  90,  67,  66,  68,  10,  98,  71,  70, 122,  99, 121,  65, // ZCBD.bGFzcyA\n 121,  73,  69,  78, 108,  99, 110,  82, 112,  90, 109, 108, // yIENlcnRpZml\n 106,  89,  88,  82, 112,  98,  50,  52, 103,  81,  88,  86, // jYXRpb24gQXV\n  48,  97,  71,  57, 121,  97,  88,  82,  53, 103, 103,  69, // 0aG9yaXR5ggE\n  65,  77,  65, 119,  71,  65,  49,  85, 100,  69, 119,  81, // AMAwGA1UdEwQ\n  70,  77,  65,  77,  66,  65, 102,  56, 119,  10,  68,  81, // FMAMBAf8w.DQ\n  89,  74,  75, 111,  90,  73, 104, 118,  99,  78,  65,  81, // YJKoZIhvcNAQ\n  69,  70,  66,  81,  65,  68, 103, 103,  69,  66,  65,  65, // EFBQADggEBAA\n  87, 100,  80,  52, 105, 100,  48,  99, 107,  97,  86,  97, // WdP4id0ckaVa\n  71, 115,  97, 102,  80, 122,  87, 100, 113,  98,  65,  89, // GsafPzWdqbAY\n  99,  97,  84,  49, 101, 112, 111,  88, 107,  74,  75, 116, // caT1epoXkJKt\n 118,  51,  10,  76,  55,  73, 101, 122,  77, 100, 101,  97, // v3.L7IezMdea\n 116, 105,  68, 104,  54,  71,  88,  55,  48, 107,  49,  80, // tiDh6GX70k1P\n 110,  99,  71,  81,  86, 104, 105, 118,  52,  53,  89, 117, // ncGQVhiv45Yu\n  65, 112, 110,  80,  43, 121, 122,  51,  83,  70, 109,  72, // ApnP+yz3SFmH\n  56, 108,  85,  43, 110,  76,  77,  80,  85, 120,  65,  50, // 8lU+nLMPUxA2\n  73,  71, 118, 100,  53,  54,  68,  10, 101, 114, 117, 105, // IGvd56D.erui\n 120,  47,  85,  48,  70,  52,  55,  90,  69,  85,  68,  48, // x/U0F47ZEUD0\n  47,  67, 119, 113,  84,  82,  86,  47, 112,  50,  74, 100, // /CwqTRV/p2Jd\n  76, 105,  88,  84,  65,  65, 115, 103,  71, 104,  49, 111, // LiXTAAsgGh1o\n  43,  82, 101,  52,  57,  76,  50,  76,  55,  83, 104,  90, // +Re49L2L7ShZ\n  51,  85,  48,  87, 105, 120, 101,  68, 121,  76,  74, 108, // 3U0WixeDyLJl\n  10, 120, 121,  49,  54, 112,  97, 113,  56,  85,  52,  90, // .xy16paq8U4Z\n 116,  51,  86, 101, 107, 121, 118, 103, 103,  81,  81, 116, // t3VekyvggQQt\n 111,  56,  80,  84,  55, 100,  76,  53,  87,  88,  88, 112, // o8PT7dL5WXXp\n  53,  57, 102, 107, 100, 104, 101,  77, 116, 108,  98,  55, // 59fkdheMtlb7\n  49,  99,  90,  66,  68, 122,  73,  48, 102, 109, 103,  65, // 1cZBDzI0fmgA\n  75, 104, 121, 110, 112,  10,  86,  83,  74,  89,  65,  67, // Khynp.VSJYAC\n  80, 113,  52, 120,  74,  68,  75,  86, 116,  72,  67,  78, // Pq4xJDKVtHCN\n  50,  77,  81,  87, 112, 108,  66, 113, 106, 108,  73,  97, // 2MQWplBqjlIa\n 112,  66, 116,  74,  85, 104, 108,  98, 108,  57,  48,  84, // pBtJUhlbl90T\n  83, 114,  69,  57,  97, 116, 118,  78, 122, 105,  80,  84, // SrE9atvNziPT\n 110,  78, 118,  84,  53,  49,  99,  75,  69,  89,  10,  87, // nNvT51cKEY.W\n  81,  80,  74,  73, 114,  83,  80, 110,  78,  86, 101,  75, // QPJIrSPnNVeK\n 116, 101, 108, 116, 116,  81,  75,  98, 102, 105,  51,  81, // telttQKbfi3Q\n  66,  70,  71, 109, 104,  57,  53,  68, 109,  75,  47,  68, // BFGmh95DmK/D\n  53, 102, 115,  52,  67,  56, 102,  70,  53,  81,  61,  10, // 5fs4C8fF5Q=.\n  45,  45,  45,  45,  45,  69,  78,  68,  32,  67,  69,  82, // -----END CER\n  84,  73,  70,  73,  67,  65,  84,  69,  45,  45,  45,  45, // TIFICATE----\n  45,  10,  10,  78, 111, 116,  32,  66, 101, 102, 111, 114, // -..Not Befor\n 101,  58,  32,  83, 101, 112,  32,  32,  49,  32,  48,  48, // e: Sep  1 00\n  58,  48,  48,  58,  48,  48,  32,  50,  48,  48,  57,  32, // :00:00 2009 \n  71,  77,  84,  10,  78, 111, 116,  32,  65, 102, 116, 101, // GMT.Not Afte\n 114,  32,  58,  32,  68, 101,  99,  32,  51,  49,  32,  50, // r : Dec 31 2\n  51,  58,  53,  57,  58,  53,  57,  32,  50,  48,  51,  55, // 3:59:59 2037\n  32,  71,  77,  84,  10,  83, 117,  98, 106, 101,  99, 116, //  GMT.Subject\n  58,  32,  67,  61,  85,  83,  44,  32,  83,  84,  61,  65, // : C=US, ST=A\n 114, 105, 122, 111, 110,  97,  44,  32,  76,  61,  83,  99, // rizona, L=Sc\n 111, 116, 116, 115, 100,  97, 108, 101,  44,  32,  79,  61, // ottsdale, O=\n  83, 116,  97, 114, 102, 105, 101, 108, 100,  32,  84, 101, // Starfield Te\n  99, 104, 110, 111, 108, 111, 103, 105, 101, 115,  44,  32, // chnologies, \n  73, 110,  99,  46,  44,  32,  67,  78,  61,  83, 116,  97, // Inc., CN=Sta\n 114, 102, 105, 101, 108, 100,  32,  82, 111, 111, 116,  32, // rfield Root \n  67, 101, 114, 116, 105, 102, 105,  99,  97, 116, 101,  32, // Certificate \n  65, 117, 116, 104, 111, 114, 105, 116, 121,  32,  45,  32, // Authority - \n  71,  50,  10,  45,  45,  45,  45,  45,  66,  69,  71,  73, // G2.-----BEGI\n  78,  32,  67,  69,  82,  84,  73,  70,  73,  67,  65,  84, // N CERTIFICAT\n  69,  45,  45,  45,  45,  45,  10,  77,  73,  73,  68,  51, // E-----.MIID3\n  84,  67,  67,  65, 115,  87, 103,  65, 119,  73,  66,  65, // TCCAsWgAwIBA\n 103,  73,  66,  65,  68,  65,  78,  66, 103, 107, 113, 104, // gIBADANBgkqh\n 107, 105,  71,  57, 119,  48,  66,  65,  81, 115,  70,  65, // kiG9w0BAQsFA\n  68,  67,  66, 106, 122,  69,  76,  77,  65, 107,  71,  65, // DCBjzELMAkGA\n  49,  85,  69,  66, 104,  77,  67,  86,  86,  77, 120,  10, // 1UEBhMCVVMx.\n  69,  68,  65,  79,  66, 103,  78,  86,  66,  65, 103,  84, // EDAOBgNVBAgT\n  66,  48,  70, 121,  97,  88, 112, 118,  98, 109,  69, 120, // B0FyaXpvbmEx\n  69, 122,  65,  82,  66, 103,  78,  86,  66,  65,  99,  84, // EzARBgNVBAcT\n  67, 108,  78, 106,  98,  51,  82,  48,  99,  50,  82, 104, // ClNjb3R0c2Rh\n  98,  71,  85, 120,  74,  84,  65, 106,  66, 103,  78,  86, // bGUxJTAjBgNV\n  66,  65, 111,  84,  10,  72,  70,  78,  48,  89,  88,  74, // BAoT.HFN0YXJ\n 109,  97,  87,  86, 115,  90,  67,  66,  85,  90,  87,  78, // maWVsZCBUZWN\n 111,  98, 109,  57, 115,  98,  50, 100, 112,  90,  88,  77, // obm9sb2dpZXM\n 115,  73,  69, 108, 117,  89, 121,  52, 120,  77, 106,  65, // sIEluYy4xMjA\n 119,  66, 103,  78,  86,  66,  65,  77,  84,  75,  86,  78, // wBgNVBAMTKVN\n  48,  89,  88,  74, 109,  97,  87,  86, 115,  10,  90,  67, // 0YXJmaWVs.ZC\n  66,  83,  98,  50,  57,  48,  73,  69,  78, 108,  99, 110, // BSb290IENlcn\n  82, 112,  90, 109, 108, 106,  89,  88,  82, 108,  73,  69, // RpZmljYXRlIE\n  70,  49, 100,  71, 104, 118,  99, 109, 108,  48, 101,  83, // F1dGhvcml0eS\n  65, 116,  73,  69,  99, 121,  77,  66,  52,  88,  68,  84, // AtIEcyMB4XDT\n  65,  53,  77,  68, 107, 119,  77,  84,  65, 119,  77,  68, // A5MDkwMTAwMD\n  65, 119,  10,  77,  70, 111,  88,  68,  84,  77,  51,  77, // Aw.MFoXDTM3M\n  84,  73, 122,  77,  84,  73, 122,  78,  84, 107,  49,  79, // TIzMTIzNTk1O\n  86, 111, 119, 103,  89,  56, 120,  67, 122,  65,  74,  66, // VowgY8xCzAJB\n 103,  78,  86,  66,  65,  89,  84,  65, 108,  86,  84,  77, // gNVBAYTAlVTM\n  82,  65, 119,  68, 103,  89,  68,  86,  81,  81,  73,  69, // RAwDgYDVQQIE\n 119, 100,  66,  99, 109, 108,  54,  10,  98,  50,  53, 104, // wdBcml6.b25h\n  77,  82,  77, 119,  69,  81,  89,  68,  86,  81,  81,  72, // MRMwEQYDVQQH\n  69, 119, 112,  84,  89,  50,  57,  48, 100,  72,  78, 107, // EwpTY290dHNk\n  89,  87, 120, 108,  77,  83,  85, 119,  73, 119,  89,  68, // YWxlMSUwIwYD\n  86,  81,  81,  75,  69, 120, 120,  84, 100,  71,  70, 121, // VQQKExxTdGFy\n  90, 109, 108, 108,  98,  71,  81, 103,  86,  71,  86, 106, // ZmllbGQgVGVj\n  10,  97,  71,  53, 118,  98,  71,  57, 110,  97,  87,  86, // .aG5vbG9naWV\n 122,  76,  67,  66,  74,  98, 109,  77, 117,  77,  84,  73, // zLCBJbmMuMTI\n 119,  77,  65,  89,  68,  86,  81,  81,  68,  69, 121, 108, // wMAYDVQQDEyl\n  84, 100,  71,  70, 121,  90, 109, 108, 108,  98,  71,  81, // TdGFyZmllbGQ\n 103,  85, 109,  57, 118, 100,  67,  66,  68,  90,  88,  74, // gUm9vdCBDZXJ\n  48,  97,  87,  90, 112,  10,  89,  50,  70,  48,  90,  83, // 0aWZp.Y2F0ZS\n  66,  66, 100,  88,  82, 111,  98,  51,  74, 112, 100,  72, // BBdXRob3JpdH\n 107, 103,  76,  83,  66,  72,  77, 106,  67,  67,  65,  83, // kgLSBHMjCCAS\n  73, 119,  68,  81,  89,  74,  75, 111,  90,  73, 104, 118, // IwDQYJKoZIhv\n  99,  78,  65,  81,  69,  66,  66,  81,  65,  68, 103, 103, // cNAQEBBQADgg\n  69,  80,  65,  68,  67,  67,  65,  81, 111,  67,  10, 103, // EPADCCAQoC.g\n 103,  69,  66,  65,  76,  51, 116, 119,  81,  80,  56,  57, // gEBAL3twQP89\n 111,  47,  56,  65, 114,  70, 118,  87,  53,  57,  73,  50, // o/8ArFvW59I2\n  90,  49,  53,  52, 113,  75,  51,  65,  50,  70,  87,  71, // Z154qK3A2FWG\n  77,  78,  72, 116, 116, 102,  75,  80,  84,  85, 117, 105, // MNHttfKPTUui\n  85,  80,  51, 111,  87, 109,  98,  51, 111, 111,  97,  47, // UP3oWmb3ooa/\n  82,  77, 103,  10, 110,  76,  82,  74, 100, 122,  73, 112, // RMg.nLRJdzIp\n  86, 118,  50,  53,  55,  73, 122, 100,  73, 118, 112, 121, // Vv257IzdIvpy\n  51,  67, 100, 104, 108,  43,  55,  50,  87, 111,  84, 115, // 3Cdhl+72WoTs\n  98, 104, 109,  53, 105,  83, 122,  99, 104,  70, 118,  86, // bhm5iSzchFvV\n 100,  80, 116, 114,  88,  56,  87,  74, 112,  82,  66,  83, // dPtrX8WJpRBS\n 105,  85,  90,  86,  57,  76, 104,  49,  10,  72,  79,  90, // iUZV9Lh1.HOZ\n  47,  53,  70,  83, 117,  83,  47, 104,  86,  99, 108,  99, // /5FSuS/hVclc\n  67,  71, 102, 103,  88,  99,  86, 110, 114,  72, 105, 103, // CGfgXcVnrHig\n  72, 100,  77,  87, 100,  83,  76,  53, 115, 116,  80,  83, // HdMWdSL5stPS\n 107, 115,  80,  78, 107,  78,  51, 109,  83, 119,  79, 120, // ksPNkN3mSwOx\n  71,  88, 110,  47, 104,  98,  86,  78,  77,  89, 113,  47, // GXn/hbVNMYq/\n  78,  10,  72, 119, 116, 106, 117, 122, 113, 100,  43,  47, // N.Hwtjuzqd+/\n 120,  53,  65,  74, 104, 104, 100,  77,  56, 109, 103, 107, // x5AJhhdM8mgk\n  66, 106,  56,  55,  74, 121,  97, 104, 107,  78, 109,  99, // Bj87JyahkNmc\n 114,  85,  68, 110,  88,  77,  78,  47, 117,  76, 105,  99, // rUDnXMN/uLic\n  70,  90,  56,  87,  74,  47,  88,  55,  78, 102,  90,  84, // FZ8WJ/X7NfZT\n  68,  52, 112,  55, 100,  78,  10, 100, 108, 111, 101, 100, // D4p7dN.dloed\n 108,  52,  48, 119,  79, 105,  87,  86, 112, 109,  75, 115, // l40wOiWVpmKs\n  47,  66,  47, 112,  77,  50,  57,  51,  68,  73, 120, 102, // /B/pM293DIxf\n  74,  72,  80,  52,  70,  56,  82,  43,  71, 117, 113,  83, // JHP4F8R+GuqS\n  86, 122,  82, 109,  90,  84,  82, 111, 117,  78, 106,  87, // VzRmZTRouNjW\n 119, 108,  50, 116,  86,  90, 105,  52,  85, 116,  48,  10, // wl2tVZi4Ut0.\n  72,  90,  98,  85,  74, 116,  81,  73,  66,  70, 110,  81, // HZbUJtQIBFnQ\n 109,  65,  52,  79,  53, 116,  55,  56, 119,  43, 119, 102, // mA4O5t78w+wf\n 107,  80,  69,  67,  65, 119,  69,  65,  65,  97,  78,  67, // kPECAwEAAaNC\n  77,  69,  65, 119,  68, 119,  89,  68,  86,  82,  48,  84, // MEAwDwYDVR0T\n  65,  81,  72,  47,  66,  65,  85, 119,  65, 119,  69,  66, // AQH/BAUwAwEB\n  47, 122,  65,  79,  10,  66, 103,  78,  86,  72,  81,  56, // /zAO.BgNVHQ8\n  66,  65, 102,  56,  69,  66,  65,  77,  67,  65,  81,  89, // BAf8EBAMCAQY\n 119,  72,  81,  89,  68,  86,  82,  48,  79,  66,  66,  89, // wHQYDVR0OBBY\n  69,  70,  72, 119,  77,  77, 104,  43, 110,  50,  84,  66, // EFHwMMh+n2TB\n  47, 120,  72,  49, 111, 111,  50,  75, 111, 111,  99,  54, // /xH1oo2Kooc6\n 114,  66,  49, 115, 110,  77,  65,  48,  71,  10,  67,  83, // rB1snMA0G.CS\n 113,  71,  83,  73,  98,  51,  68,  81,  69,  66,  67, 119, // qGSIb3DQEBCw\n  85,  65,  65,  52,  73,  66,  65,  81,  65,  82,  87, 102, // UAA4IBAQARWf\n 111, 108,  84, 119,  78, 118, 108,  74, 107,  55, 109, 104, // olTwNvlJk7mh\n  43,  67, 104,  84, 110,  85, 100, 103,  87,  85,  88, 117, // +ChTnUdgWUXu\n  69, 111, 107,  50,  49, 105,  88,  81, 110,  67, 111,  75, // Eok21iXQnCoK\n 106,  85,  10, 115,  72,  85,  52,  56,  84,  82, 113, 110, // jU.sHU48TRqn\n 101,  83, 102, 105, 111,  89, 109,  85, 101,  89, 115,  48, // eSfioYmUeYs0\n  99,  89, 116,  98, 112,  85, 103,  83, 112,  73,  66,  55, // cYtbpUgSpIB7\n  76, 105,  75,  90,  51, 115, 120,  52, 109,  99, 117, 106, // LiKZ3sx4mcuj\n  74,  85,  68,  74, 105,  53,  68, 110,  85, 111, 120,  57, // JUDJi5DnUox9\n 103,  54,  49,  68,  76, 117,  51,  10,  52, 106, 100,  47, // g61DLu3.4jd/\n  73, 114, 111,  65, 111, 119,  53,  55,  85, 118, 116, 114, // IroAow57Uvtr\n 117, 122, 118,  69,  48,  51, 108,  82,  84, 115,  50,  81, // uzvE03lRTs2Q\n  57,  71,  99,  72,  71,  99, 103,  56,  82, 110, 111,  78, // 9GcHGcg8RnoN\n  65,  88,  51,  70,  87,  79, 100, 116,  53, 111,  85, 119, // AX3FWOdt5oUw\n  70,  53, 111, 107, 120,  66,  68, 103,  66,  80, 102, 103, // F5okxBDgBPfg\n  10,  56, 110,  47,  85, 113, 103, 114,  47,  81, 104,  48, // .8n/Uqgr/Qh0\n  51,  55,  90,  84, 108,  90,  70, 107,  83,  73,  72,  99, // 37ZTlZFkSIHc\n  52,  48, 122,  73,  43,  79,  73,  70,  49, 108, 110,  80, // 40zI+OIF1lnP\n  54,  97,  73,  43, 120, 121,  56,  52, 102, 120, 101, 122, // 6aI+xy84fxez\n  54, 110,  72,  55,  80, 102, 114,  72, 120,  66, 121,  50, // 6nH7PfrHxBy2\n  50,  47,  76,  47,  75,  10, 112,  76,  47,  81, 108, 119, // 2/L/K.pL/Qlw\n  86,  75, 118,  79, 111,  89,  75,  65,  75,  81, 118,  86, // VKvOoYKAKQvV\n  82,  52,  67,  83,  70, 120,  48,  57,  70,  57,  72, 100, // R4CSFx09F9Hd\n 107,  87, 115,  75, 108, 104,  80, 100,  65,  75,  65,  67, // kWsKlhPdAKAC\n  76,  56, 120,  51, 118,  76,  67,  87,  82,  70,  67, 122, // L8x3vLCWRFCz\n 116,  65, 103, 102, 100,  57, 102,  68,  76,  49,  10, 109, // tAgfd9fDL1.m\n  77, 112,  89, 106, 110,  48, 113,  55, 112,  66,  90,  99, // MpYjn0q7pBZc\n  50,  84,  53,  78, 110,  82, 101,  74,  97,  72,  49,  90, // 2T5NnReJaH1Z\n 103,  85, 117, 102, 122, 107,  86, 113,  83, 114,  55,  85, // gUufzkVqSr7U\n  73, 117,  79, 104,  87, 110,  48,  10,  45,  45,  45,  45, // IuOhWn0.----\n  45,  69,  78,  68,  32,  67,  69,  82,  84,  73,  70,  73, // -END CERTIFI\n  67,  65,  84,  69,  45,  45,  45,  45,  45,  10,  10,  83, // CATE-----..S\n 117,  98, 106, 101,  99, 116,  58,  32,  67,  61,  85,  83, // ubject: C=US\n  44,  32,  83,  84,  61,  65, 114, 105, 122, 111, 110,  97, // , ST=Arizona\n  44,  32,  76,  61,  83,  99, 111, 116, 116, 115, 100,  97, // , L=Scottsda\n 108, 101,  44,  32,  79,  61,  83, 116,  97, 114, 102, 105, // le, O=Starfi\n 101, 108, 100,  32,  84, 101,  99, 104, 110, 111, 108, 111, // eld Technolo\n 103, 105, 101, 115,  44,  32,  73, 110,  99,  46,  44,  32, // gies, Inc., \n  67,  78,  61,  83, 116,  97, 114, 102, 105, 101, 108, 100, // CN=Starfield\n  32,  83, 101, 114, 118, 105,  99, 101, 115,  32,  82, 111, //  Services Ro\n 111, 116,  32,  67, 101, 114, 116, 105, 102, 105,  99,  97, // ot Certifica\n 116, 101,  32,  65, 117, 116, 104, 111, 114, 105, 116, 121, // te Authority\n  32,  45,  32,  71,  50,  10,  78, 111, 116,  32,  66, 101, //  - G2.Not Be\n 102, 111, 114, 101,  58,  32,  83, 101, 112,  32,  32,  49, // fore: Sep  1\n  32,  48,  48,  58,  48,  48,  58,  48,  48,  32,  50,  48, //  00:00:00 20\n  48,  57,  32,  71,  77,  84,  10,  78, 111, 116,  32,  65, // 09 GMT.Not A\n 102, 116, 101, 114,  32,  58,  32,  68, 101,  99,  32,  51, // fter : Dec 3\n  49,  32,  50,  51,  58,  53,  57,  58,  53,  57,  32,  50, // 1 23:59:59 2\n  48,  51,  55,  32,  71,  77,  84,  10,  45,  45,  45,  45, // 037 GMT.----\n  45,  66,  69,  71,  73,  78,  32,  67,  69,  82,  84,  73, // -BEGIN CERTI\n  70,  73,  67,  65,  84,  69,  45,  45,  45,  45,  45,  10, // FICATE-----.\n  77,  73,  73,  68,  55, 122,  67,  67,  65, 116, 101, 103, // MIID7zCCAteg\n  65, 119,  73,  66,  65, 103,  73,  66,  65,  68,  65,  78, // AwIBAgIBADAN\n  66, 103, 107, 113, 104, 107, 105,  71,  57, 119,  48,  66, // BgkqhkiG9w0B\n  65,  81, 115,  70,  65,  68,  67,  66, 109,  68,  69,  76, // AQsFADCBmDEL\n  77,  65, 107,  71,  65,  49,  85,  69,  66, 104,  77,  67, // MAkGA1UEBhMC\n  86,  86,  77, 120,  10,  69,  68,  65,  79,  66, 103,  78, // VVMx.EDAOBgN\n  86,  66,  65, 103,  84,  66,  48,  70, 121,  97,  88, 112, // VBAgTB0FyaXp\n 118,  98, 109,  69, 120,  69, 122,  65,  82,  66, 103,  78, // vbmExEzARBgN\n  86,  66,  65,  99,  84,  67, 108,  78, 106,  98,  51,  82, // VBAcTClNjb3R\n  48,  99,  50,  82, 104,  98,  71,  85, 120,  74,  84,  65, // 0c2RhbGUxJTA\n 106,  66, 103,  78,  86,  66,  65, 111,  84,  10,  72,  70, // jBgNVBAoT.HF\n  78,  48,  89,  88,  74, 109,  97,  87,  86, 115,  90,  67, // N0YXJmaWVsZC\n  66,  85,  90,  87,  78, 111,  98, 109,  57, 115,  98,  50, // BUZWNobm9sb2\n 100, 112,  90,  88,  77, 115,  73,  69, 108, 117,  89, 121, // dpZXMsIEluYy\n  52, 120,  79, 122,  65,  53,  66, 103,  78,  86,  66,  65, // 4xOzA5BgNVBA\n  77,  84,  77, 108,  78,  48,  89,  88,  74, 109,  97,  87, // MTMlN0YXJmaW\n  86, 115,  10,  90,  67,  66,  84,  90,  88,  74,  50,  97, // Vs.ZCBTZXJ2a\n  87,  78, 108,  99, 121,  66,  83,  98,  50,  57,  48,  73, // WNlcyBSb290I\n  69,  78, 108,  99, 110,  82, 112,  90, 109, 108, 106,  89, // ENlcnRpZmljY\n  88,  82, 108,  73,  69,  70,  49, 100,  71, 104, 118,  99, // XRlIEF1dGhvc\n 109, 108,  48, 101,  83,  65, 116,  73,  69,  99, 121,  77, // ml0eSAtIEcyM\n  66,  52,  88,  68,  84,  65,  53,  10,  77,  68, 107, 119, // B4XDTA5.MDkw\n  77,  84,  65, 119,  77,  68,  65, 119,  77,  70, 111,  88, // MTAwMDAwMFoX\n  68,  84,  77,  51,  77,  84,  73, 122,  77,  84,  73, 122, // DTM3MTIzMTIz\n  78,  84, 107,  49,  79,  86, 111, 119, 103,  90, 103, 120, // NTk1OVowgZgx\n  67, 122,  65,  74,  66, 103,  78,  86,  66,  65,  89,  84, // CzAJBgNVBAYT\n  65, 108,  86,  84,  77,  82,  65, 119,  68, 103,  89,  68, // AlVTMRAwDgYD\n  10,  86,  81,  81,  73,  69, 119, 100,  66,  99, 109, 108, // .VQQIEwdBcml\n  54,  98,  50,  53, 104,  77,  82,  77, 119,  69,  81,  89, // 6b25hMRMwEQY\n  68,  86,  81,  81,  72,  69, 119, 112,  84,  89,  50,  57, // DVQQHEwpTY29\n  48, 100,  72,  78, 107,  89,  87, 120, 108,  77,  83,  85, // 0dHNkYWxlMSU\n 119,  73, 119,  89,  68,  86,  81,  81,  75,  69, 120, 120, // wIwYDVQQKExx\n  84, 100,  71,  70, 121,  10,  90, 109, 108, 108,  98,  71, // TdGFy.ZmllbG\n  81, 103,  86,  71,  86, 106,  97,  71,  53, 118,  98,  71, // QgVGVjaG5vbG\n  57, 110,  97,  87,  86, 122,  76,  67,  66,  74,  98, 109, // 9naWVzLCBJbm\n  77, 117,  77,  84, 115, 119,  79,  81,  89,  68,  86,  81, // MuMTswOQYDVQ\n  81,  68,  69, 122,  74,  84, 100,  71,  70, 121,  90, 109, // QDEzJTdGFyZm\n 108, 108,  98,  71,  81, 103,  85,  50,  86, 121,  10, 100, // llbGQgU2Vy.d\n 109, 108, 106,  90,  88,  77, 103,  85, 109,  57, 118, 100, // mljZXMgUm9vd\n  67,  66,  68,  90,  88,  74,  48,  97,  87,  90, 112,  89, // CBDZXJ0aWZpY\n  50,  70,  48,  90,  83,  66,  66, 100,  88,  82, 111,  98, // 2F0ZSBBdXRob\n  51,  74, 112, 100,  72, 107, 103,  76,  83,  66,  72,  77, // 3JpdHkgLSBHM\n 106,  67,  67,  65,  83,  73, 119,  68,  81,  89,  74,  75, // jCCASIwDQYJK\n 111,  90,  73,  10, 104, 118,  99,  78,  65,  81,  69,  66, // oZI.hvcNAQEB\n  66,  81,  65,  68, 103, 103,  69,  80,  65,  68,  67,  67, // BQADggEPADCC\n  65,  81, 111,  67, 103, 103,  69,  66,  65,  78,  85,  77, // AQoCggEBANUM\n  79, 115,  81, 113,  43,  85,  55, 105,  57,  98,  52,  90, // OsQq+U7i9b4Z\n 108,  49,  43,  79, 105,  70,  79, 120,  72, 122,  47,  76, // l1+OiFOxHz/L\n 122,  53,  56, 103,  69,  50,  48, 112,  10,  79, 115, 103, // z58gE20p.Osg\n  80, 102,  84, 122,  51,  97,  51,  89,  52,  89,  57, 107, // PfTz3a3Y4Y9k\n  50,  89,  75, 105,  98,  88, 108, 119,  65, 103,  76,  73, // 2YKibXlwAgLI\n 118,  87,  88,  47,  50, 104,  47, 107, 108,  81,  52,  98, // vWX/2h/klQ4b\n 110,  97,  82, 116,  83, 109, 112,  68, 104,  99, 101,  80, // naRtSmpDhceP\n  89,  76,  81,  49,  79,  98,  47,  98,  73,  83, 100, 109, // YLQ1Ob/bISdm\n  50,  10,  56, 120, 112,  87, 114, 105, 117,  50, 100,  66, // 2.8xpWriu2dB\n  84, 114, 122,  47, 115, 109,  52, 120, 113,  54,  72,  90, // Trz/sm4xq6HZ\n  89, 117,  97, 106, 116,  89, 108,  73, 108,  72,  86, 118, // YuajtYlIlHVv\n  56, 108, 111,  74,  78, 119,  85,  52,  80,  97, 104,  72, // 8loJNwU4PahH\n  81,  85, 119,  50, 101, 101,  66,  71, 103,  54,  51,  52, // QUw2eeBGg634\n  53,  65,  87, 104,  49,  75,  10,  84, 115,  57,  68, 107, // 5AWh1K.Ts9Dk\n  84, 118, 110,  86, 116,  89,  65,  99,  77, 116,  83,  55, // TvnVtYAcMtS7\n 110, 116,  57, 114, 106, 114, 110, 118,  68,  72,  53,  82, // nt9rjrnvDH5R\n 102,  98,  67,  89,  77,  56,  84,  87,  81,  73, 114, 103, // fbCYM8TWQIrg\n  77, 119,  48,  82,  57,  43,  53,  51, 112,  66, 108,  98, // Mw0R9+53pBlb\n  81,  76,  80,  76,  74,  71, 109, 112, 117, 102, 101,  10, // QLPLJGmpufe.\n 104,  82, 104,  74, 102,  71,  90,  79, 111, 122, 112, 116, // hRhJfGZOozpt\n 113,  98,  88, 117,  78,  67,  54,  54,  68,  81,  79,  52, // qbXuNC66DQO4\n  77,  57,  57,  72,  54,  55,  70, 114, 106,  83,  88,  90, // M99H67FrjSXZ\n 109,  56,  54,  66,  48,  85,  86,  71,  77, 112,  90, 119, // m86B0UVGMpZw\n 104,  57,  52,  67,  68, 107, 108,  68, 104,  98,  90, 115, // h94CDklDhbZs\n  99,  55, 116, 107,  10,  54, 109,  70,  66, 114,  77, 110, // c7tk.6mFBrMn\n  85,  86,  78,  43,  72,  76,  56,  99, 105, 115, 105,  98, // UVN+HL8cisib\n  77, 110,  49, 108,  85,  97,  74,  47,  56, 118, 105, 111, // Mn1lUaJ/8vio\n 118, 120,  70,  85,  99, 100,  85,  66, 103,  70,  52,  85, // vxFUcdUBgF4U\n  67,  86,  84, 109,  76, 102, 119,  85,  67,  65, 119,  69, // CVTmLfwUCAwE\n  65,  65,  97,  78,  67,  77,  69,  65, 119,  10,  68, 119, // AAaNCMEAw.Dw\n  89,  68,  86,  82,  48,  84,  65,  81,  72,  47,  66,  65, // YDVR0TAQH/BA\n  85, 119,  65, 119,  69,  66,  47, 122,  65,  79,  66, 103, // UwAwEB/zAOBg\n  78,  86,  72,  81,  56,  66,  65, 102,  56,  69,  66,  65, // NVHQ8BAf8EBA\n  77,  67,  65,  81,  89, 119,  72,  81,  89,  68,  86,  82, // MCAQYwHQYDVR\n  48,  79,  66,  66,  89,  69,  70,  74, 120, 102,  65,  78, // 0OBBYEFJxfAN\n  43, 113,  10,  65, 100,  99, 119,  75, 122, 105,  73, 111, // +q.AdcwKziIo\n 114, 104, 116,  83, 112, 122, 121,  69,  90,  71,  68,  77, // rhtSpzyEZGDM\n  65,  48,  71,  67,  83, 113,  71,  83,  73,  98,  51,  68, // A0GCSqGSIb3D\n  81,  69,  66,  67, 119,  85,  65,  65,  52,  73,  66,  65, // QEBCwUAA4IBA\n  81,  66,  76,  78, 113,  97,  69, 100,  50, 110, 100,  79, // QBLNqaEd2ndO\n 120, 109, 102,  90, 121,  77,  73,  10,  98, 119,  53, 104, // xmfZyMI.bw5h\n 121, 102,  50,  69,  51,  70,  47,  89,  78, 111,  72,  78, // yf2E3F/YNoHN\n  50,  66, 116,  66,  76,  90,  57, 103,  51,  99,  99,  97, // 2BtBLZ9g3cca\n  97,  78, 110,  82,  98, 111,  98, 104, 105,  67,  80,  80, // aNnRbobhiCPP\n  69,  57,  53,  68, 122,  43,  73,  48, 115, 119,  83, 100, // E95Dz+I0swSd\n  72, 121, 110,  86, 118,  47, 104, 101, 121,  78,  88,  66, // HynVv/heyNXB\n  10, 118, 101,  54,  83,  98, 122,  74,  48,  56, 112,  71, // .ve6SbzJ08pG\n  67,  76,  55,  50,  67,  81, 110, 113, 116,  75, 114,  99, // CL72CQnqtKrc\n 103, 102,  85,  50,  56, 101, 108,  85,  83, 119, 104,  88, // gfU28elUSwhX\n 113, 118, 102, 100, 113, 108,  83,  53, 115, 100,  74,  47, // qvfdqlS5sdJ/\n  80,  72,  76,  84, 121, 120,  81,  71, 106, 104, 100,  66, // PHLTyxQGjhdB\n 121,  80, 113,  49, 122,  10, 113, 119, 117,  98, 100,  81, // yPq1z.qwubdQ\n 120, 116,  82,  98, 101,  79, 108,  75, 121,  87,  78,  55, // xtRbeOlKyWN7\n  87, 103,  48,  73,  56,  86,  82, 119,  55, 106,  54,  73, // Wg0I8VRw7j6I\n  80, 100, 106,  47,  51, 118,  81,  81,  70,  51, 122,  67, // Pdj/3vQQF3zC\n 101, 112,  89, 111,  85, 122,  56, 106,  99,  73,  55,  51, // epYoUz8jcI73\n  72,  80, 100, 119,  98, 101, 121,  66, 107, 100,  10, 105, // HPdwbeyBkd.i\n  69,  68,  80, 102,  85,  89, 100,  47, 120,  55,  72,  52, // EDPfUYd/x7H4\n  99,  55,  47,  73,  57, 118,  71,  43, 111,  49,  86,  84, // c7/I9vG+o1VT\n 113, 107,  67,  53,  48,  99,  82,  82, 106,  55,  48,  47, // qkC50cRRj70/\n  98,  49,  55,  75,  83,  97,  55, 113,  87,  70, 105,  78, // b17KSa7qWFiN\n 121, 105,  50,  76,  83, 114,  50,  69,  73,  90, 107, 121, // yi2LSr2EIZky\n  88,  67, 110,  10,  48, 113,  50,  51,  75,  88,  66,  53, // XCn.0q23KXB5\n  54, 106, 122,  97,  89, 121,  87, 102,  47,  87, 105,  51, // 6jzaYyWf/Wi3\n  77,  79, 120, 119,  43,  51,  87,  75, 116,  50,  49, 103, // MOxw+3WKt21g\n  90,  55,  73, 101, 121,  76, 110, 112,  50,  75, 104, 118, // Z7IeyLnp2Khv\n  65, 111, 116, 110,  68,  85,  48, 109,  86,  51,  72,  97, // AotnDU0mV3Ha\n  73,  80, 122,  66,  83, 108,  67,  78,  10, 115,  83, 105, // IPzBSlCN.sSi\n  54,  10,  45,  45,  45,  45,  45,  69,  78,  68,  32,  67, // 6.-----END C\n  69,  82,  84,  73,  70,  73,  67,  65,  84,  69,  45,  45, // ERTIFICATE--\n  45,  45,  45,  10,  10,  83, 117,  98, 106, 101,  99, 116, // ---..Subject\n  58,  32,  67,  32,  61,  32,  66,  69,  44,  32,  79,  32, // : C = BE, O \n  61,  32,  71, 108, 111,  98,  97, 108,  83, 105, 103, 110, // = GlobalSign\n  32, 110, 118,  45, 115,  97,  44,  32,  79,  85,  32,  61, //  nv-sa, OU =\n  32,  82, 111, 111, 116,  32,  67,  65,  44,  32,  67,  78, //  Root CA, CN\n  32,  61,  32,  71, 108, 111,  98,  97, 108,  83, 105, 103, //  = GlobalSig\n 110,  32,  82, 111, 111, 116,  32,  67,  65,  10,  78, 111, // n Root CA.No\n 116,  32,  66, 101, 102, 111, 114, 101,  58,  32,  83, 101, // t Before: Se\n 112,  32,  32,  49,  32,  49,  50,  58,  48,  48,  58,  48, // p  1 12:00:0\n  48,  32,  49,  57,  57,  56,  32,  71,  77,  84,  10,  78, // 0 1998 GMT.N\n 111, 116,  32,  65, 102, 116, 101, 114,  32,  58,  32,  74, // ot After : J\n  97, 110,  32,  50,  56,  32,  49,  50,  58,  48,  48,  58, // an 28 12:00:\n  48,  48,  32,  50,  48,  50,  56,  32,  71,  77,  84,  10, // 00 2028 GMT.\n  45,  45,  45,  45,  45,  66,  69,  71,  73,  78,  32,  67, // -----BEGIN C\n  69,  82,  84,  73,  70,  73,  67,  65,  84,  69,  45,  45, // ERTIFICATE--\n  45,  45,  45,  10,  77,  73,  73,  68, 100,  84,  67,  67, // ---.MIIDdTCC\n  65, 108,  50, 103,  65, 119,  73,  66,  65, 103,  73,  76, // Al2gAwIBAgIL\n  66,  65,  65,  65,  65,  65,  65,  66,  70,  85, 116,  97, // BAAAAAABFUta\n 119,  53,  81, 119,  68,  81,  89,  74,  75, 111,  90,  73, // w5QwDQYJKoZI\n 104, 118,  99,  78,  65,  81,  69,  70,  66,  81,  65, 119, // hvcNAQEFBQAw\n  86, 122,  69,  76,  77,  65, 107,  71,  10,  65,  49,  85, // VzELMAkG.A1U\n  69,  66, 104,  77,  67,  81, 107,  85, 120,  71,  84,  65, // EBhMCQkUxGTA\n  88,  66, 103,  78,  86,  66,  65, 111,  84,  69,  69, 100, // XBgNVBAoTEEd\n 115,  98,  50,  74, 104,  98,  70,  78, 112,  90,  50,  52, // sb2JhbFNpZ24\n 103,  98, 110,  89, 116,  99,  50,  69, 120,  69,  68,  65, // gbnYtc2ExEDA\n  79,  66, 103,  78,  86,  66,  65, 115,  84,  66,  49,  74, // OBgNVBAsTB1J\n 118,  10,  98,  51,  81, 103,  81,  48,  69, 120,  71, 122, // v.b3QgQ0ExGz\n  65,  90,  66, 103,  78,  86,  66,  65,  77,  84,  69, 107, // AZBgNVBAMTEk\n 100, 115,  98,  50,  74, 104,  98,  70,  78, 112,  90,  50, // dsb2JhbFNpZ2\n  52, 103,  85, 109,  57, 118, 100,  67,  66,  68,  81,  84, // 4gUm9vdCBDQT\n  65, 101,  70, 119,  48,  53,  79,  68,  65,  53,  77,  68, // AeFw05ODA5MD\n  69, 120,  77, 106,  65, 119,  10,  77,  68,  66,  97,  70, // ExMjAw.MDBaF\n 119,  48, 121,  79,  68,  65, 120,  77, 106, 103, 120,  77, // w0yODAxMjgxM\n 106,  65, 119,  77,  68,  66,  97,  77,  70,  99, 120,  67, // jAwMDBaMFcxC\n 122,  65,  74,  66, 103,  78,  86,  66,  65,  89,  84,  65, // zAJBgNVBAYTA\n 107,  74,  70,  77,  82, 107, 119,  70, 119,  89,  68,  86, // kJFMRkwFwYDV\n  81,  81,  75,  69, 120,  66,  72,  98,  71,  57, 105,  10, // QQKExBHbG9i.\n  89,  87, 120,  84,  97,  87, 100, 117,  73,  71,  53,  50, // YWxTaWduIG52\n  76,  88,  78, 104,  77,  82,  65, 119,  68, 103,  89,  68, // LXNhMRAwDgYD\n  86,  81,  81,  76,  69, 119, 100,  83,  98,  50,  57,  48, // VQQLEwdSb290\n  73,  69,  78,  66,  77,  82, 115, 119,  71,  81,  89,  68, // IENBMRswGQYD\n  86,  81,  81,  68,  69, 120,  74,  72,  98,  71,  57, 105, // VQQDExJHbG9i\n  89,  87, 120,  84,  10,  97,  87, 100, 117,  73,  70,  74, // YWxT.aWduIFJ\n 118,  98,  51,  81, 103,  81,  48,  69, 119, 103, 103,  69, // vb3QgQ0EwggE\n 105,  77,  65,  48,  71,  67,  83, 113,  71,  83,  73,  98, // iMA0GCSqGSIb\n  51,  68,  81,  69,  66,  65,  81,  85,  65,  65,  52,  73, // 3DQEBAQUAA4I\n  66,  68, 119,  65, 119, 103, 103,  69,  75,  65, 111,  73, // BDwAwggEKAoI\n  66,  65,  81,  68,  97,  68, 117,  97,  90,  10, 106,  99, // BAQDaDuaZ.jc\n  54, 106,  52,  48,  43,  75, 102, 118, 118, 120, 105,  52, // 6j40+Kfvvxi4\n  77, 108,  97,  43, 112,  73,  72,  47,  69, 113, 115,  76, // Mla+pIH/EqsL\n 109,  86,  69,  81,  83,  57,  56,  71,  80,  82,  52, 109, // mVEQS98GPR4m\n 100, 109, 122, 120, 122, 100, 122, 120, 116,  73,  75,  43, // dmzxzdzxtIK+\n  54,  78, 105,  89,  54,  97, 114, 121, 109,  65,  90,  97, // 6NiY6arymAZa\n 118, 112,  10, 120, 121,  48,  83, 121,  54, 115,  99,  84, // vp.xy0Sy6scT\n  72,  65,  72, 111,  84,  48,  75,  77,  77,  48,  86, 106, // HAHoT0KMM0Vj\n  85,  47,  52,  51, 100,  83,  77,  85,  66,  85,  99,  55, // U/43dSMUBUc7\n  49,  68, 117, 120,  67,  55,  51,  47,  79, 108,  83,  56, // 1DuxC73/OlS8\n 112,  70,  57,  52,  71,  51,  86,  78,  84,  67,  79,  88, // pF94G3VNTCOX\n 107,  78, 122,  56, 107,  72, 112,  10,  49,  87, 114, 106, // kNz8kHp.1Wrj\n 115, 111, 107,  54,  86, 106, 107,  52,  98, 119,  89,  56, // sok6Vjk4bwY8\n 105,  71, 108,  98,  75, 107,  51,  70, 112,  49,  83,  52, // iGlbKk3Fp1S4\n  98,  73, 110,  77, 109,  47, 107,  56, 121, 117,  88,  57, // bInMm/k8yuX9\n 105, 102,  85,  83,  80,  74,  74,  52, 108, 116,  98,  99, // ifUSPJJ4ltbc\n 100,  71,  54,  84,  82,  71,  72,  82, 106,  99, 100,  71, // dG6TRGHRjcdG\n  10, 115, 110,  85,  79, 104, 117, 103,  90, 105, 116,  86, // .snUOhugZitV\n 116,  98,  78,  86,  52,  70, 112,  87, 105,  54,  99, 103, // tbNV4FpWi6cg\n  75,  79,  79, 118, 121,  74,  66,  78,  80,  99,  49,  83, // KOOvyJBNPc1S\n  84,  69,  52,  85,  54,  71,  55, 119, 101,  78,  76,  87, // TE4U6G7weNLW\n  76,  66,  89, 121,  53, 100,  52, 117, 120,  50, 120,  56, // LBYy5d4ux2x8\n 103, 107,  97, 115,  74,  10,  85,  50,  54,  81, 122, 110, // gkasJ.U26Qzn\n 115,  51, 100,  76, 108, 119,  82,  53,  69, 105,  85,  87, // s3dLlwR5EiUW\n  77,  87, 101,  97,  54, 120, 114, 107,  69, 109,  67,  77, // MWea6xrkEmCM\n 103,  90,  75,  57,  70,  71, 113, 107, 106,  87,  90,  67, // gZK9FGqkjWZC\n 114,  88, 103, 122,  84,  47,  76,  67, 114,  66,  98,  66, // rXgzT/LCrBbB\n 108,  68,  83, 103, 101,  70,  53,  57,  78,  56,  10,  57, // lDSgeF59N8.9\n 105,  70, 111,  55,  43, 114, 121,  85, 112,  57,  47, 107, // iFo7+ryUp9/k\n  53,  68,  80,  65, 103,  77,  66,  65,  65,  71, 106,  81, // 5DPAgMBAAGjQ\n 106,  66,  65,  77,  65,  52,  71,  65,  49,  85, 100,  68, // jBAMA4GA1UdD\n 119,  69,  66,  47, 119,  81,  69,  65, 119,  73,  66,  66, // wEB/wQEAwIBB\n 106,  65,  80,  66, 103,  78,  86,  72,  82,  77,  66,  65, // jAPBgNVHRMBA\n 102,  56,  69,  10,  66,  84,  65,  68,  65,  81,  72,  47, // f8E.BTADAQH/\n  77,  66,  48,  71,  65,  49,  85, 100,  68, 103,  81,  87, // MB0GA1UdDgQW\n  66,  66,  82, 103, 101,  50,  89,  97,  82,  81,  50,  88, // BBRge2YaRQ2X\n 121, 111, 108,  81,  76,  51,  48,  69, 122,  84,  83, 111, // yolQL30EzTSo\n  47,  47, 122,  57,  83, 122,  65,  78,  66, 103, 107, 113, // //z9SzANBgkq\n 104, 107, 105,  71,  57, 119,  48,  66,  10,  65,  81,  85, // hkiG9w0B.AQU\n  70,  65,  65,  79,  67,  65,  81,  69,  65,  49, 110,  80, // FAAOCAQEA1nP\n 110, 102,  69,  57,  50,  48,  73,  50,  47,  55,  76, 113, // nfE920I2/7Lq\n 105, 118, 106,  84,  70,  75,  68,  75,  49, 102,  80, 120, // ivjTFKDK1fPx\n 115, 110,  67, 119, 114, 118,  81, 109, 101,  85,  55,  57, // snCwrvQmeU79\n 114,  88, 113, 111,  82,  83,  76,  98, 108,  67,  75,  79, // rXqoRSLblCKO\n 122,  10, 121, 106,  49, 104,  84, 100,  78,  71,  67,  98, // z.yj1hTdNGCb\n  77,  43, 119,  54,  68, 106,  89,  49,  85,  98,  56, 114, // M+w6DjY1Ub8r\n 114, 118, 114,  84, 110, 104,  81,  55, 107,  52, 111,  43, // rvrTnhQ7k4o+\n  89, 118, 105, 105,  89,  55,  55,  54,  66,  81,  86, 118, // YviiY776BQVv\n 110,  71,  67, 118,  48,  52, 122,  99,  81,  76,  99,  70, // nGCv04zcQLcF\n  71,  85, 108,  53, 103,  69,  10,  51,  56,  78, 102, 108, // GUl5gE.38Nfl\n  78,  85,  86, 121,  82,  82,  66, 110,  77,  82, 100, 100, // NUVyRRBnMRdd\n  87,  81,  86,  68, 102,  57,  86,  77,  79, 121,  71, 106, // WQVDf9VMOyGj\n  47,  56,  78,  55, 121, 121,  53,  89,  48,  98,  50, 113, // /8N7yy5Y0b2q\n 118, 122, 102, 118,  71, 110,  57,  76, 104,  74,  73,  90, // vzfvGn9LhJIZ\n  74, 114, 103, 108, 102,  67, 109,  55, 121, 109,  80,  10, // JrglfCm7ymP.\n  65,  98,  69,  86, 116,  81, 119, 100, 112, 102,  53, 112, // AbEVtQwdpf5p\n  76,  71, 107, 107, 101,  66,  54, 122, 112, 120, 120, 120, // LGkkeB6zpxxx\n  89, 117,  55,  75, 121,  74, 101, 115,  70,  49,  50,  75, // Yu7KyJesF12K\n 119, 118, 104,  72, 104, 109,  52, 113, 120,  70,  89, 120, // wvhHhm4qxFYx\n 108, 100,  66, 110, 105,  89,  85, 114,  43,  87, 121, 109, // ldBniYUr+Wym\n  88,  85,  97, 100,  10,  68,  75, 113,  67,  53,  74, 108, // XUad.DKqC5Jl\n  82,  51,  88,  67,  51,  50,  49,  89,  57,  89, 101,  82, // R3XC321Y9YeR\n 113,  52,  86, 122,  87,  57, 118,  52,  57,  51, 107,  72, // q4VzW9v493kH\n  77,  66,  54,  53, 106,  85, 114,  57,  84,  85,  47,  81, // MB65jUr9TU/Q\n 114,  54,  99, 102,  57, 116, 118, 101,  67,  88,  52,  88, // r6cf9tveCX4X\n  83,  81,  82, 106,  98, 103,  98,  77,  69,  10,  72,  77, // SQRjbgbME.HM\n  85, 102, 112,  73,  66, 118,  70,  83,  68,  74,  51, 103, // UfpIBvFSDJ3g\n 121,  73,  67, 104,  51,  87,  90, 108,  88, 105,  47,  69, // yICh3WZlXi/E\n 106,  74,  75,  83,  90, 112,  52,  65,  61,  61,  10,  45, // jJKSZp4A==.-\n  45,  45,  45,  45,  69,  78,  68,  32,  67,  69,  82,  84, // ----END CERT\n  73,  70,  73,  67,  65,  84,  69,  45,  45,  45,  45,  45, // IFICATE-----\n  10,  10,  83, 117,  98, 106, 101,  99, 116,  58,  32,  79, // ..Subject: O\n  85,  32,  61,  32,  71, 108, 111,  98,  97, 108,  83, 105, // U = GlobalSi\n 103, 110,  32,  69,  67,  67,  32,  82, 111, 111, 116,  32, // gn ECC Root \n  67,  65,  32,  45,  32,  82,  53,  44,  32,  79,  32,  61, // CA - R5, O =\n  32,  71, 108, 111,  98,  97, 108,  83, 105, 103, 110,  44, //  GlobalSign,\n  32,  67,  78,  32,  61,  32,  71, 108, 111,  98,  97, 108, //  CN = Global\n  83, 105, 103, 110,  10,  78, 111, 116,  32,  66, 101, 102, // Sign.Not Bef\n 111, 114, 101,  58,  32,  78, 111, 118,  32,  49,  51,  32, // ore: Nov 13 \n  48,  48,  58,  48,  48,  58,  48,  48,  32,  50,  48,  49, // 00:00:00 201\n  50,  32,  71,  77,  84,  10,  78, 111, 116,  32,  65, 102, // 2 GMT.Not Af\n 116, 101, 114,  32,  58,  32,  74,  97, 110,  32,  49,  57, // ter : Jan 19\n  32,  48,  51,  58,  49,  52,  58,  48,  55,  32,  50,  48, //  03:14:07 20\n  51,  56,  32,  71,  77,  84,  10,  45,  45,  45,  45,  45, // 38 GMT.-----\n  66,  69,  71,  73,  78,  32,  67,  69,  82,  84,  73,  70, // BEGIN CERTIF\n  73,  67,  65,  84,  69,  45,  45,  45,  45,  45,  10,  77, // ICATE-----.M\n  73,  73,  67,  72, 106,  67,  67,  65,  97,  83, 103,  65, // IICHjCCAaSgA\n 119,  73,  66,  65, 103,  73,  82,  89,  70, 108,  74,  52, // wIBAgIRYFlJ4\n  67,  89, 117, 117,  49,  88,  53,  67, 110, 101,  75,  99, // CYuu1X5CneKc\n 102, 108,  75,  50,  71, 119, 119,  67, 103,  89,  73,  75, // flK2GwwCgYIK\n 111,  90,  73, 122, 106,  48,  69,  65, 119,  77, 119,  85, // oZIzj0EAwMwU\n  68,  69, 107,  10,  77,  67,  73,  71,  65,  49,  85,  69, // DEk.MCIGA1UE\n  67, 120,  77,  98,  82,  50, 120, 118,  89, 109,  70, 115, // CxMbR2xvYmFs\n  85,  50, 108, 110,  98, 105,  66,  70,  81,  48,  77, 103, // U2lnbiBFQ0Mg\n  85, 109,  57, 118, 100,  67,  66,  68,  81,  83,  65, 116, // Um9vdCBDQSAt\n  73,  70,  73,  49,  77,  82,  77, 119,  69,  81,  89,  68, // IFI1MRMwEQYD\n  86,  81,  81,  75,  69, 119, 112,  72,  10,  98,  71,  57, // VQQKEwpH.bG9\n 105,  89,  87, 120,  84,  97,  87, 100, 117,  77,  82,  77, // iYWxTaWduMRM\n 119,  69,  81,  89,  68,  86,  81,  81,  68,  69, 119, 112, // wEQYDVQQDEwp\n  72,  98,  71,  57, 105,  89,  87, 120,  84,  97,  87, 100, // HbG9iYWxTaWd\n 117,  77,  66,  52,  88,  68,  84,  69, 121,  77,  84,  69, // uMB4XDTEyMTE\n 120,  77, 122,  65, 119,  77,  68,  65, 119,  77,  70, 111, // xMzAwMDAwMFo\n  88,  10,  68,  84,  77,  52,  77,  68,  69, 120,  79,  84, // X.DTM4MDExOT\n  65, 122,  77,  84,  81, 119,  78,  49, 111, 119,  85,  68, // AzMTQwN1owUD\n  69, 107,  77,  67,  73,  71,  65,  49,  85,  69,  67, 120, // EkMCIGA1UECx\n  77,  98,  82,  50, 120, 118,  89, 109,  70, 115,  85,  50, // MbR2xvYmFsU2\n 108, 110,  98, 105,  66,  70,  81,  48,  77, 103,  85, 109, // lnbiBFQ0MgUm\n  57, 118, 100,  67,  66,  68,  10,  81,  83,  65, 116,  73, // 9vdCBD.QSAtI\n  70,  73,  49,  77,  82,  77, 119,  69,  81,  89,  68,  86, // FI1MRMwEQYDV\n  81,  81,  75,  69, 119, 112,  72,  98,  71,  57, 105,  89, // QQKEwpHbG9iY\n  87, 120,  84,  97,  87, 100, 117,  77,  82,  77, 119,  69, // WxTaWduMRMwE\n  81,  89,  68,  86,  81,  81,  68,  69, 119, 112,  72,  98, // QYDVQQDEwpHb\n  71,  57, 105,  89,  87, 120,  84,  97,  87, 100, 117,  10, // G9iYWxTaWdu.\n  77,  72,  89, 119,  69,  65,  89,  72,  75, 111,  90,  73, // MHYwEAYHKoZI\n 122, 106,  48,  67,  65,  81,  89,  70,  75,  52,  69,  69, // zj0CAQYFK4EE\n  65,  67,  73,  68,  89, 103,  65,  69,  82,  48,  85,  79, // ACIDYgAER0UO\n 108, 118, 116,  57,  88,  98,  47, 112,  79, 100,  69, 104, // lvt9Xb/pOdEh\n  43,  74,  56,  76, 116, 116,  86,  55,  72, 112,  73,  54, // +J8LttV7HpI6\n  83,  70, 107,  99,  10,  56,  71,  73, 120,  76,  99,  66, // SFkc.8GIxLcB\n  54,  75,  80,  52,  97, 112,  49, 121, 122, 116, 115, 121, // 6KP4ap1yztsy\n  88,  53,  48,  88,  85,  87,  80, 114,  82, 100,  50,  49, // X50XUWPrRd21\n  68, 111, 115,  67,  72,  90,  84,  81,  75,  72,  51, 114, // DosCHZTQKH3r\n 100,  54, 122, 119, 122, 111,  99,  87, 100,  84,  97,  82, // d6zwzocWdTaR\n 118,  81,  90,  85,  52, 102,  56, 107, 101,  10, 104,  79, // vQZU4f8ke.hO\n 118,  82, 110, 107, 109,  83, 104,  53,  83,  72,  68,  68, // vRnkmSh5SHDD\n 113,  70,  83, 109,  97, 102, 110,  86, 109,  84,  84,  90, // qFSmafnVmTTZ\n 100, 104,  66, 111,  90,  75, 111,  48,  73, 119,  81,  68, // dhBoZKo0IwQD\n  65,  79,  66, 103,  78,  86,  72,  81,  56,  66,  65, 102, // AOBgNVHQ8BAf\n  56,  69,  66,  65,  77,  67,  65,  81,  89, 119,  68, 119, // 8EBAMCAQYwDw\n  89,  68,  10,  86,  82,  48,  84,  65,  81,  72,  47,  66, // YD.VR0TAQH/B\n  65,  85, 119,  65, 119,  69,  66,  47, 122,  65, 100,  66, // AUwAwEB/zAdB\n 103,  78,  86,  72,  81,  52,  69,  70, 103,  81,  85,  80, // gNVHQ4EFgQUP\n 101,  89, 112,  83,  74, 118, 113,  66,  56, 111, 104,  82, // eYpSJvqB8ohR\n  69, 111, 109,  51, 109,  55, 101,  48, 111,  80,  81, 110, // Eom3m7e0oPQn\n  49, 107, 119,  67, 103,  89,  73,  10,  75, 111,  90,  73, // 1kwCgYI.KoZI\n 122, 106,  48,  69,  65, 119,  77,  68,  97,  65,  65, 119, // zj0EAwMDaAAw\n  90,  81,  73, 120,  65,  79,  86, 112,  69, 115, 108, 117, // ZQIxAOVpEslu\n  50,  56,  89, 120, 117, 103, 108,  66,  52,  90, 102,  52, // 28YxuglB4Zf4\n  43,  47,  50,  97,  52, 110,  48,  83, 121, 101,  49,  56, // +/2a4n0Sye18\n  90,  78,  80,  76,  66,  83,  87,  76,  86, 116, 109, 103, // ZNPLBSWLVtmg\n  10,  53,  49,  53, 100,  84, 103, 117,  68, 110,  70, 116, // .515dTguDnFt\n  50,  75,  97,  65,  74,  74, 105,  70, 113,  89, 103,  73, // 2KaAJJiFqYgI\n 119,  99, 100,  75,  49, 106,  49, 122, 113,  79,  43,  70, // wcdK1j1zqO+F\n  52,  67,  89,  87, 111, 100,  90,  73,  55, 121,  70, 122, // 4CYWodZI7yFz\n  57,  83,  79,  56,  78, 100,  67,  75, 111,  67,  79,  74, // 9SO8NdCKoCOJ\n 117, 120,  85, 110,  79,  10, 120, 119, 121,  56, 112,  50, // uxUnO.xwy8p2\n  70, 112,  56, 102,  99,  55,  52,  83, 114,  76,  43,  83, // Fp8fc74SrL+S\n 118, 122,  90, 112,  65,  51,  10,  45,  45,  45,  45,  45, // vzZpA3.-----\n  69,  78,  68,  32,  67,  69,  82,  84,  73,  70,  73,  67, // END CERTIFIC\n  65,  84,  69,  45,  45,  45,  45,  45,  10,  10,  83, 117, // ATE-----..Su\n  98, 106, 101,  99, 116,  58,  32,  67,  61,  85,  83,  44, // bject: C=US,\n  32,  79,  61,  68, 105, 103, 105,  67, 101, 114, 116,  32, //  O=DigiCert \n  73, 110,  99,  44,  32,  79,  85,  61, 119, 119, 119,  46, // Inc, OU=www.\n 100, 105, 103, 105,  99, 101, 114, 116,  46,  99, 111, 109, // digicert.com\n  44,  32,  67,  78,  61,  68, 105, 103, 105,  67, 101, 114, // , CN=DigiCer\n 116,  32,  72, 105, 103, 104,  32,  65, 115, 115, 117, 114, // t High Assur\n  97, 110,  99, 101,  32,  69,  86,  32,  82, 111, 111, 116, // ance EV Root\n  32,  67,  65,  10,  78, 111, 116,  32,  66, 101, 102, 111, //  CA.Not Befo\n 114, 101,  58,  32,  78, 111, 118,  32,  49,  48,  32,  48, // re: Nov 10 0\n  48,  58,  48,  48,  58,  48,  48,  32,  50,  48,  48,  54, // 0:00:00 2006\n  32,  71,  77,  84,  10,  78, 111, 116,  32,  65, 102, 116, //  GMT.Not Aft\n 101, 114,  32,  58,  32,  78, 111, 118,  32,  49,  48,  32, // er : Nov 10 \n  48,  48,  58,  48,  48,  58,  48,  48,  32,  50,  48,  51, // 00:00:00 203\n  49,  32,  71,  77,  84,  10,  45,  45,  45,  45,  45,  66, // 1 GMT.-----B\n  69,  71,  73,  78,  32,  67,  69,  82,  84,  73,  70,  73, // EGIN CERTIFI\n  67,  65,  84,  69,  45,  45,  45,  45,  45,  10,  77,  73, // CATE-----.MI\n  73,  68, 120,  84,  67,  67,  65, 113,  50, 103,  65, 119, // IDxTCCAq2gAw\n  73,  66,  65, 103,  73,  81,  65, 113, 120,  99,  74, 109, // IBAgIQAqxcJm\n 111,  76,  81,  74, 117,  80,  67,  51, 110, 121, 114, 107, // oLQJuPC3nyrk\n  89, 108, 100, 122,  65,  78,  66, 103, 107, 113, 104, 107, // YldzANBgkqhk\n 105,  71,  57, 119,  48,  66,  65,  81,  85,  70,  65,  68, // iG9w0BAQUFAD\n  66, 115,  10,  77,  81, 115, 119,  67,  81,  89,  68,  86, // Bs.MQswCQYDV\n  81,  81,  71,  69, 119,  74,  86,  85, 122,  69,  86,  77, // QQGEwJVUzEVM\n  66,  77,  71,  65,  49,  85,  69,  67, 104,  77,  77,  82, // BMGA1UEChMMR\n  71, 108, 110,  97,  85,  78, 108,  99, 110,  81, 103,  83, // GlnaUNlcnQgS\n  87,  53, 106,  77,  82, 107, 119,  70, 119,  89,  68,  86, // W5jMRkwFwYDV\n  81,  81,  76,  69, 120,  66,  51,  10, 100,  51,  99, 117, // QQLExB3.d3cu\n  90,  71, 108, 110,  97,  87,  78, 108,  99, 110,  81, 117, // ZGlnaWNlcnQu\n  89,  50,  57, 116,  77,  83, 115, 119,  75,  81,  89,  68, // Y29tMSswKQYD\n  86,  81,  81,  68,  69, 121,  74,  69,  97,  87, 100, 112, // VQQDEyJEaWdp\n  81,  50,  86, 121, 100,  67,  66,  73,  97,  87, 100, 111, // Q2VydCBIaWdo\n  73,  69,  70, 122,  99,  51,  86, 121,  89,  87,  53, 106, // IEFzc3VyYW5j\n  10,  90,  83,  66,  70,  86, 105,  66,  83,  98,  50,  57, // .ZSBFViBSb29\n  48,  73,  69,  78,  66,  77,  66,  52,  88,  68,  84,  65, // 0IENBMB4XDTA\n  50,  77,  84,  69, 120,  77,  68,  65, 119,  77,  68,  65, // 2MTExMDAwMDA\n 119,  77,  70, 111,  88,  68,  84,  77, 120,  77,  84,  69, // wMFoXDTMxMTE\n 120,  77,  68,  65, 119,  77,  68,  65, 119,  77,  70, 111, // xMDAwMDAwMFo\n 119,  98,  68,  69,  76,  10,  77,  65, 107,  71,  65,  49, // wbDEL.MAkGA1\n  85,  69,  66, 104,  77,  67,  86,  86,  77, 120,  70,  84, // UEBhMCVVMxFT\n  65,  84,  66, 103,  78,  86,  66,  65, 111,  84,  68,  69, // ATBgNVBAoTDE\n  82, 112,  90,  50, 108,  68,  90,  88,  74,  48,  73,  69, // RpZ2lDZXJ0IE\n 108, 117,  89, 122,  69,  90,  77,  66,  99,  71,  65,  49, // luYzEZMBcGA1\n  85,  69,  67, 120,  77,  81, 100,  51, 100,  51,  10,  76, // UECxMQd3d3.L\n 109,  82, 112,  90,  50, 108, 106,  90,  88,  74,  48,  76, // mRpZ2ljZXJ0L\n 109,  78, 118,  98,  84,  69, 114,  77,  67, 107,  71,  65, // mNvbTErMCkGA\n  49,  85,  69,  65, 120,  77, 105,  82,  71, 108, 110,  97, // 1UEAxMiRGlna\n  85,  78, 108,  99, 110,  81, 103,  83,  71, 108, 110,  97, // UNlcnQgSGlna\n  67,  66,  66,  99,  51,  78,  49,  99, 109,  70, 117,  89, // CBBc3N1cmFuY\n  50,  85, 103,  10,  82,  86,  89, 103,  85, 109,  57, 118, // 2Ug.RVYgUm9v\n 100,  67,  66,  68,  81,  84,  67,  67,  65,  83,  73, 119, // dCBDQTCCASIw\n  68,  81,  89,  74,  75, 111,  90,  73, 104, 118,  99,  78, // DQYJKoZIhvcN\n  65,  81,  69,  66,  66,  81,  65,  68, 103, 103,  69,  80, // AQEBBQADggEP\n  65,  68,  67,  67,  65,  81, 111,  67, 103, 103,  69,  66, // ADCCAQoCggEB\n  65,  77,  98,  77,  53,  88,  80, 109,  10,  43,  57,  83, // AMbM5XPm.+9S\n  55,  53,  83,  48, 116,  77, 113,  98, 102,  53,  89,  69, // 75S0tMqbf5YE\n  47, 121,  99,  48, 108,  83,  98,  90, 120,  75, 115,  80, // /yc0lSbZxKsP\n  86, 108,  68,  82, 110, 111, 103, 111,  99, 115,  70,  57, // VlDRnogocsF9\n 112, 112, 107,  67, 120, 120,  76, 101, 121, 106,  57,  67, // ppkCxxLeyj9C\n  89, 112,  75, 108,  66,  87,  84, 114,  84,  51,  74,  84, // YpKlBWTrT3JT\n  87,  10,  80,  78, 116,  48,  79,  75,  82,  75, 122,  69, // W.PNt0OKRKzE\n  48, 108, 103, 118, 100,  75, 112,  86,  77,  83,  79,  79, // 0lgvdKpVMSOO\n  55, 122,  83,  87,  49, 120, 107,  88,  53, 106, 116, 113, // 7zSW1xkX5jtq\n 117, 109,  88,  56,  79, 107, 104,  80, 104,  80,  89, 108, // umX8OkhPhPYl\n  71,  43,  43,  77,  88, 115,  50, 122, 105,  83,  52, 119, // G++MXs2ziS4w\n  98, 108,  67,  74,  69,  77,  10, 120,  67, 104,  66,  86, // blCJEM.xChBV\n 102, 118,  76,  87, 111, 107,  86, 102, 110,  72, 111,  78, // fvLWokVfnHoN\n  98,  57,  78,  99, 103, 107,  57, 118, 106, 111,  52,  85, // b9Ncgk9vjo4U\n  70, 116,  51,  77,  82, 117,  78, 115,  56,  99, 107,  82, // Ft3MRuNs8ckR\n  90, 113, 110, 114,  71,  48,  65,  70,  70, 111,  69, 116, // ZqnrG0AFFoEt\n  55, 111,  84,  54,  49,  69,  75, 109,  69,  70,  66,  10, // 7oT61EKmEFB.\n  73, 107,  53, 108,  89,  89, 101,  66,  81,  86,  67, 109, // Ik5lYYeBQVCm\n 101,  86, 121,  74,  51, 104, 108,  75,  86,  57,  85, 117, // eVyJ3hlKV9Uu\n  53, 108,  48,  99,  85, 121, 120,  43, 109,  77,  48,  97, // 5l0cUyx+mM0a\n  66, 104,  97, 107,  97,  72,  80,  81,  78,  65,  81,  84, // BhakaHPQNAQT\n  88,  75,  70, 120,  48,  49, 112,  56,  86, 100, 116, 101, // XKFx01p8Vdte\n  90,  79,  69,  51,  10, 104, 122,  66,  87,  66,  79,  85, // ZOE3.hzBWBOU\n  82, 116,  67, 109,  65,  69, 118,  70,  53,  79,  89, 105, // RtCmAEvF5OYi\n 105,  65, 104,  70,  56,  74,  50,  97,  51, 105,  76, 100, // iAhF8J2a3iLd\n  52,  56, 115, 111,  75, 113,  68, 105, 114,  67, 109,  84, // 48soKqDirCmT\n  67, 118,  50,  90, 100, 108,  89,  84,  66, 111,  83,  85, // Cv2ZdlYTBoSU\n 101, 104,  49,  48,  97,  85,  65, 115, 103,  10,  69, 115, // eh10aUAsg.Es\n 120,  66, 117,  50,  52,  76,  85,  84, 105,  52,  83,  56, // xBu24LUTi4S8\n 115,  67,  65, 119,  69,  65,  65,  97,  78, 106,  77,  71, // sCAwEAAaNjMG\n  69, 119,  68, 103,  89,  68,  86,  82,  48,  80,  65,  81, // EwDgYDVR0PAQ\n  72,  47,  66,  65,  81,  68,  65, 103,  71,  71,  77,  65, // H/BAQDAgGGMA\n  56,  71,  65,  49,  85, 100,  69, 119,  69,  66,  47, 119, // 8GA1UdEwEB/w\n  81,  70,  10,  77,  65,  77,  66,  65, 102,  56, 119,  72, // QF.MAMBAf8wH\n  81,  89,  68,  86,  82,  48,  79,  66,  66,  89,  69,  70, // QYDVR0OBBYEF\n  76,  69,  43, 119,  50, 107,  68,  43,  76,  57,  72,  65, // LE+w2kD+L9HA\n 100,  83,  89,  74, 104, 111,  73,  65, 117,  57, 106,  90, // dSYJhoIAu9jZ\n  67, 118,  68,  77,  66,  56,  71,  65,  49,  85, 100,  73, // CvDMB8GA1UdI\n 119,  81,  89,  77,  66,  97,  65,  10,  70,  76,  69,  43, // wQYMBaA.FLE+\n 119,  50, 107,  68,  43,  76,  57,  72,  65, 100,  83,  89, // w2kD+L9HAdSY\n  74, 104, 111,  73,  65, 117,  57, 106,  90,  67, 118,  68, // JhoIAu9jZCvD\n  77,  65,  48,  71,  67,  83, 113,  71,  83,  73,  98,  51, // MA0GCSqGSIb3\n  68,  81,  69,  66,  66,  81,  85,  65,  65,  52,  73,  66, // DQEBBQUAA4IB\n  65,  81,  65,  99,  71, 103,  97,  88,  51,  78, 101,  99, // AQAcGgaX3Nec\n  10, 110, 122, 121,  73,  90, 103,  89,  73,  86, 121,  72, // .nzyIZgYIVyH\n  98,  73,  85, 102,  52,  75, 109, 101, 113, 118, 120, 103, // bIUf4Kmeqvxg\n 121, 100, 107,  65,  81,  86,  56,  71,  75,  56,  51, 114, // ydkAQV8GK83r\n  90,  69,  87,  87,  79,  78, 102, 113, 101,  47,  69,  87, // ZEWWONfqe/EW\n  49, 110, 116, 108,  77,  77,  85, 117,  52, 107, 101, 104, // 1ntlMMUu4keh\n  68,  76,  73,  54, 122,  10, 101,  77,  55,  98,  52,  49, // DLI6z.eM7b41\n  78,  53,  99, 100,  98, 108,  73,  90,  81,  66,  50, 108, // N5cdblIZQB2l\n  87,  72, 109, 105,  82, 107,  57, 111, 112, 109, 122,  78, // WHmiRk9opmzN\n  54,  99,  78,  56,  50, 111,  78,  76,  70, 112, 109, 121, // 6cN82oNLFpmy\n  80,  73, 110, 110, 103, 105,  75,  51,  66,  68,  52,  49, // PInngiK3BD41\n  86,  72,  77,  87,  69,  90,  55,  49, 106,  70,  10, 104, // VHMWEZ71jF.h\n  83,  57,  79,  77,  80,  97, 103,  77,  82,  89, 106, 121, // S9OMPagMRYjy\n  79, 102, 105,  90,  82,  89, 122, 121,  55,  56,  97,  71, // OfiZRYzy78aG\n  54,  65,  57,  43,  77, 112, 101, 105, 122,  71,  76,  89, // 6A9+MpeizGLY\n  65, 105,  74,  76,  81, 119,  71,  88,  70,  75,  51, 120, // AiJLQwGXFK3x\n  80, 107,  75, 109,  78,  69,  86,  88,  53,  56,  83, 118, // PkKmNEVX58Sv\n 110, 119,  50,  10,  89, 122, 105,  57,  82,  75,  82,  47, // nw2.Yzi9RKR/\n  53,  67,  89, 114,  67, 115,  83,  88,  97,  81,  51, 112, // 5CYrCsSXaQ3p\n 106,  79,  76,  65,  69,  70, 101,  52, 121,  72,  89,  83, // jOLAEFe4yHYS\n 107,  86,  88, 121,  83,  71, 110,  89, 118,  67, 111,  67, // kVXySGnYvCoC\n  87, 119,  57,  69,  49,  67,  65, 120,  50,  47,  83,  54, // Ww9E1CAx2/S6\n  99,  67,  90, 100, 107,  71,  67, 101,  10, 118,  69, 115, // cCZdkGCe.vEs\n  88,  67,  83,  43,  48, 121, 120,  53,  68,  97,  77, 107, // XCS+0yx5DaMk\n  72,  74,  56,  72,  83,  88,  80, 102, 113,  73,  98, 108, // HJ8HSXPfqIbl\n 111,  69, 112, 119,  56, 110,  76,  43, 101,  47,  73,  66, // oEpw8nL+e/IB\n  99, 109,  50,  80,  78,  55,  69, 101, 113,  74,  83, 100, // cm2PN7EeqJSd\n 110, 111,  68, 102, 122,  65,  73,  74,  57,  86,  78, 101, // noDfzAIJ9VNe\n 112,  10,  43,  79, 107, 117,  69,  54,  78,  51,  54,  66, // p.+OkuE6N36B\n  57,  75,  10,  45,  45,  45,  45,  45,  69,  78,  68,  32, // 9K.-----END \n  67,  69,  82,  84,  73,  70,  73,  67,  65,  84,  69,  45, // CERTIFICATE-\n  45,  45,  45,  45,  10,  10,  83, 117,  98, 106, 101,  99, // ----..Subjec\n 116,  58,  32,  67,  61,  85,  83,  44,  32,  79,  61,  68, // t: C=US, O=D\n 105, 103, 105,  67, 101, 114, 116,  32,  73, 110,  99,  44, // igiCert Inc,\n  32,  79,  85,  61, 119, 119, 119,  46, 100, 105, 103, 105, //  OU=www.digi\n  99, 101, 114, 116,  46,  99, 111, 109,  44,  32,  67,  78, // cert.com, CN\n  61,  68, 105, 103, 105,  67, 101, 114, 116,  32,  71, 108, // =DigiCert Gl\n 111,  98,  97, 108,  32,  82, 111, 111, 116,  32,  67,  65, // obal Root CA\n  10,  78, 111, 116,  32,  66, 101, 102, 111, 114, 101,  58, // .Not Before:\n  32,  78, 111, 118,  32,  49,  48,  32,  48,  48,  58,  48, //  Nov 10 00:0\n  48,  58,  48,  48,  32,  50,  48,  48,  54,  32,  71,  77, // 0:00 2006 GM\n  84,  10,  78, 111, 116,  32,  65, 102, 116, 101, 114,  32, // T.Not After \n  58,  32,  78, 111, 118,  32,  49,  48,  32,  48,  48,  58, // : Nov 10 00:\n  48,  48,  58,  48,  48,  32,  50,  48,  51,  49,  32,  71, // 00:00 2031 G\n  77,  84,  10,  45,  45,  45,  45,  45,  66,  69,  71,  73, // MT.-----BEGI\n  78,  32,  67,  69,  82,  84,  73,  70,  73,  67,  65,  84, // N CERTIFICAT\n  69,  45,  45,  45,  45,  45,  10,  77,  73,  73,  68, 114, // E-----.MIIDr\n 122,  67,  67,  65, 112, 101, 103,  65, 119,  73,  66,  65, // zCCApegAwIBA\n 103,  73,  81,  67,  68, 118, 103,  86, 112,  66,  67,  82, // gIQCDvgVpBCR\n 114,  71, 104, 100,  87, 114,  74,  87,  90,  72,  72,  83, // rGhdWrJWZHHS\n 106,  65,  78,  66, 103, 107, 113, 104, 107, 105,  71,  57, // jANBgkqhkiG9\n 119,  48,  66,  65,  81,  85,  70,  65,  68,  66, 104,  10, // w0BAQUFADBh.\n  77,  81, 115, 119,  67,  81,  89,  68,  86,  81,  81,  71, // MQswCQYDVQQG\n  69, 119,  74,  86,  85, 122,  69,  86,  77,  66,  77,  71, // EwJVUzEVMBMG\n  65,  49,  85,  69,  67, 104,  77,  77,  82,  71, 108, 110, // A1UEChMMRGln\n  97,  85,  78, 108,  99, 110,  81, 103,  83,  87,  53, 106, // aUNlcnQgSW5j\n  77,  82, 107, 119,  70, 119,  89,  68,  86,  81,  81,  76, // MRkwFwYDVQQL\n  69, 120,  66,  51,  10, 100,  51,  99, 117,  90,  71, 108, // ExB3.d3cuZGl\n 110,  97,  87,  78, 108,  99, 110,  81, 117,  89,  50,  57, // naWNlcnQuY29\n 116,  77,  83,  65, 119,  72, 103,  89,  68,  86,  81,  81, // tMSAwHgYDVQQ\n  68,  69, 120, 100,  69,  97,  87, 100, 112,  81,  50,  86, // DExdEaWdpQ2V\n 121, 100,  67,  66,  72,  98,  71,  57, 105,  89,  87, 119, // ydCBHbG9iYWw\n 103,  85, 109,  57, 118, 100,  67,  66,  68,  10,  81,  84, // gUm9vdCBD.QT\n  65, 101,  70, 119,  48, 119,  78, 106,  69, 120,  77,  84, // AeFw0wNjExMT\n  65, 119,  77,  68,  65, 119,  77,  68,  66,  97,  70, 119, // AwMDAwMDBaFw\n  48, 122,  77,  84,  69, 120,  77,  84,  65, 119,  77,  68, // 0zMTExMTAwMD\n  65, 119,  77,  68,  66,  97,  77,  71,  69, 120,  67, 122, // AwMDBaMGExCz\n  65,  74,  66, 103,  78,  86,  66,  65,  89,  84,  65, 108, // AJBgNVBAYTAl\n  86,  84,  10,  77,  82,  85, 119,  69, 119,  89,  68,  86, // VT.MRUwEwYDV\n  81,  81,  75,  69, 119, 120,  69,  97,  87, 100, 112,  81, // QQKEwxEaWdpQ\n  50,  86, 121, 100,  67,  66,  74,  98, 109,  77, 120,  71, // 2VydCBJbmMxG\n  84,  65,  88,  66, 103,  78,  86,  66,  65, 115,  84,  69, // TAXBgNVBAsTE\n  72, 100,  51, 100, 121,  53, 107,  97,  87, 100, 112,  89, // Hd3dy5kaWdpY\n  50,  86, 121, 100,  67,  53, 106,  10,  98,  50,  48, 120, // 2VydC5j.b20x\n  73,  68,  65, 101,  66, 103,  78,  86,  66,  65,  77,  84, // IDAeBgNVBAMT\n  70,  48,  82, 112,  90,  50, 108,  68,  90,  88,  74,  48, // F0RpZ2lDZXJ0\n  73,  69, 100, 115,  98,  50,  74, 104,  98,  67,  66,  83, // IEdsb2JhbCBS\n  98,  50,  57,  48,  73,  69,  78,  66,  77,  73,  73,  66, // b290IENBMIIB\n  73, 106,  65,  78,  66, 103, 107, 113, 104, 107, 105,  71, // IjANBgkqhkiG\n  10,  57, 119,  48,  66,  65,  81,  69,  70,  65,  65,  79, // .9w0BAQEFAAO\n  67,  65,  81,  56,  65,  77,  73,  73,  66,  67, 103,  75, // CAQ8AMIIBCgK\n  67,  65,  81,  69,  65,  52, 106, 118, 104,  69,  88,  76, // CAQEA4jvhEXL\n 101, 113,  75,  84,  84, 111,  49, 101, 113,  85,  75,  75, // eqKTTo1eqUKK\n  80,  67,  51, 101,  81, 121,  97,  75, 108,  55, 104,  76, // PC3eQyaKl7hL\n  79, 108, 108, 115,  66,  10,  67,  83,  68,  77,  65,  90, // OllsB.CSDMAZ\n  79, 110,  84, 106,  67,  51,  85,  47, 100,  68, 120,  71, // OnTjC3U/dDxG\n 107,  65,  86,  53,  51, 105, 106,  83,  76, 100, 104, 119, // kAV53ijSLdhw\n  90,  65,  65,  73,  69,  74, 122, 115,  52,  98, 103,  55, // ZAAIEJzs4bg7\n  47, 102, 122,  84, 116, 120,  82, 117,  76,  87,  90, 115, // /fzTtxRuLWZs\n  99,  70, 115,  51,  89, 110,  70, 111,  57,  55,  10, 110, // cFs3YnFo97.n\n 104,  54,  86, 102, 101,  54,  51,  83,  75,  77,  73,  50, // h6Vfe63SKMI2\n 116,  97, 118, 101, 103, 119,  53,  66, 109,  86,  47,  83, // tavegw5BmV/S\n 108,  48, 102, 118,  66, 102,  52, 113,  55,  55, 117,  75, // l0fvBf4q77uK\n  78, 100,  48, 102,  51, 112,  52, 109,  86, 109,  70,  97, // Nd0f3p4mVmFa\n  71,  53,  99,  73, 122,  74,  76, 118,  48,  55,  65,  54, // G5cIzJLv07A6\n  70, 112, 116,  10,  52,  51,  67,  47, 100, 120,  67,  47, // Fpt.43C/dxC/\n  47,  65,  72,  50, 104, 100, 109, 111,  82,  66,  66,  89, // /AH2hdmoRBBY\n  77, 113, 108,  49,  71,  78,  88,  82, 111, 114,  53,  72, // Mql1GNXRor5H\n  52, 105, 100, 113,  57,  74, 111, 122,  43,  69, 107,  73, // 4idq9Joz+EkI\n  89,  73, 118,  85,  88,  55,  81,  54, 104,  76,  43, 104, // YIvUX7Q6hL+h\n 113, 107, 112,  77, 102,  84,  55,  80,  10,  84,  49,  57, // qkpMfT7P.T19\n 115, 100, 108,  54, 103,  83, 122, 101,  82, 110, 116, 119, // sdl6gSzeRntw\n 105,  53, 109,  51,  79,  70,  66, 113,  79,  97, 115, 118, // i5m3OFBqOasv\n  43, 122,  98,  77,  85,  90,  66, 102,  72,  87, 121, 109, // +zbMUZBfHWym\n 101,  77, 114,  47, 121,  55, 118, 114,  84,  67,  48,  76, // eMr/y7vrTC0L\n  85, 113,  55, 100,  66,  77, 116, 111,  77,  49,  79,  47, // Uq7dBMtoM1O/\n  52,  10, 103, 100,  87,  55, 106,  86, 103,  47, 116,  82, // 4.gdW7jVg/tR\n 118, 111,  83,  83, 105, 105,  99,  78, 111, 120,  66,  78, // voSSiicNoxBN\n  51,  51, 115, 104,  98, 121,  84,  65, 112,  79,  66,  54, // 33shbyTApOB6\n 106, 116,  83, 106,  49, 101, 116,  88,  43, 106, 107,  77, // jtSj1etX+jkM\n  79, 118,  74, 119,  73,  68,  65,  81,  65,  66, 111,  50, // OvJwIDAQABo2\n  77, 119,  89,  84,  65,  79,  10,  66, 103,  78,  86,  72, // MwYTAO.BgNVH\n  81,  56,  66,  65, 102,  56,  69,  66,  65,  77,  67,  65, // Q8BAf8EBAMCA\n  89,  89, 119,  68, 119,  89,  68,  86,  82,  48,  84,  65, // YYwDwYDVR0TA\n  81,  72,  47,  66,  65,  85, 119,  65, 119,  69,  66,  47, // QH/BAUwAwEB/\n 122,  65, 100,  66, 103,  78,  86,  72,  81,  52,  69,  70, // zAdBgNVHQ4EF\n 103,  81,  85,  65,  57,  53,  81,  78,  86,  98,  82,  10, // gQUA95QNVbR.\n  84,  76, 116, 109,  56,  75,  80, 105,  71, 120, 118,  68, // TLtm8KPiGxvD\n 108,  55,  73,  57,  48,  86,  85, 119,  72, 119,  89,  68, // l7I90VUwHwYD\n  86,  82,  48, 106,  66,  66, 103, 119,  70, 111,  65,  85, // VR0jBBgwFoAU\n  65,  57,  53,  81,  78,  86,  98,  82,  84,  76, 116, 109, // A95QNVbRTLtm\n  56,  75,  80, 105,  71, 120, 118,  68, 108,  55,  73,  57, // 8KPiGxvDl7I9\n  48,  86,  85, 119,  10,  68,  81,  89,  74,  75, 111,  90, // 0VUw.DQYJKoZ\n  73, 104, 118,  99,  78,  65,  81,  69,  70,  66,  81,  65, // IhvcNAQEFBQA\n  68, 103, 103,  69,  66,  65,  77, 117,  99,  78,  54, 112, // DggEBAMucN6p\n  73,  69, 120,  73,  75,  43, 116,  49,  69, 110,  69,  57, // IExIK+t1EnE9\n  83, 115,  80,  84, 102, 114, 103,  84,  49, 101,  88, 107, // SsPTfrgT1eXk\n  73, 111, 121,  81,  89,  47,  69, 115, 114,  10, 104,  77, // IoyQY/Esr.hM\n  65, 116, 117, 100,  88,  72,  47, 118,  84,  66,  72,  49, // AtudXH/vTBH1\n 106,  76, 117,  71,  50,  99, 101, 110,  84, 110, 109,  67, // jLuG2cenTnmC\n 109, 114,  69,  98,  88, 106,  99,  75,  67, 104, 122,  85, // mrEbXjcKChzU\n 121,  73, 109,  90,  79,  77, 107,  88,  68, 105, 113, 119, // yImZOMkXDiqw\n  56,  99, 118, 112,  79, 112,  47,  50,  80,  86,  53,  65, // 8cvpOp/2PV5A\n 100, 103,  10,  48,  54,  79,  47, 110,  86, 115,  74,  56, // dg.06O/nVsJ8\n 100,  87,  79,  52,  49,  80,  48, 106, 109,  80,  54,  80, // dWO41P0jmP6P\n  54, 102,  98, 116,  71,  98, 102,  89, 109,  98,  87,  48, // 6fbtGbfYmbW0\n  87,  53,  66, 106, 102,  73, 116, 116, 101, 112,  51,  83, // W5BjfIttep3S\n 112,  43, 100,  87,  79,  73, 114,  87,  99,  66,  65,  73, // p+dWOIrWcBAI\n  43,  48, 116,  75,  73,  74,  70,  10,  80, 110, 108,  85, // +0tKIJF.PnlU\n 107, 105,  97,  89,  52,  73,  66,  73, 113,  68, 102, 118, // kiaY4IBIqDfv\n  56,  78,  90,  53,  89,  66,  98, 101, 114,  79, 103,  79, // 8NZ5YBberOgO\n 122,  87,  54, 115,  82,  66,  99,  52,  76,  48, 110,  97, // zW6sRBc4L0na\n  52,  85,  85,  43,  75, 114, 107,  50,  85,  56,  56,  54, // 4UU+Krk2U886\n  85,  65,  98,  51,  76, 117, 106,  69,  86,  48, 108, 115, // UAb3LujEV0ls\n  10,  89,  83,  69,  89,  49,  81,  83, 116, 101,  68, 119, // .YSEY1QSteDw\n 115,  79, 111,  66, 114, 112,  43, 117, 118,  70,  82,  84, // sOoBrp+uvFRT\n 112,  50,  73, 110,  66, 117,  84, 104, 115,  52, 112,  70, // p2InBuThs4pF\n 115, 105, 118,  57, 107, 117,  88,  99, 108,  86, 122,  68, // siv9kuXclVzD\n  65,  71, 121,  83, 106,  52, 100, 122, 112,  51,  48, 100, // AGySj4dzp30d\n  56, 116,  98,  81, 107,  10,  67,  65,  85, 119,  55,  67, // 8tbQk.CAUw7C\n  50,  57,  67,  55,  57,  70, 118,  49,  67,  53, 113, 102, // 29C79Fv1C5qf\n  80, 114, 109,  65,  69,  83, 114,  99, 105,  73, 120, 112, // PrmAESrciIxp\n 103,  48,  88,  52,  48,  75,  80,  77,  98, 112,  49,  90, // g0X40KPMbp1Z\n  87,  86,  98, 100,  52,  61,  10,  45,  45,  45,  45,  45, // WVbd4=.-----\n  69,  78,  68,  32,  67,  69,  82,  84,  73,  70,  73,  67, // END CERTIFIC\n  65,  84,  69,  45,  45,  45,  45,  45,  10,  10,  35,  32, // ATE-----..# \n  42,  46,  97, 122, 117, 114, 101,  45, 100, 101, 118, 105, // *.azure-devi\n  99, 101, 115,  46, 100, 101,  32, 117, 115, 101,  32, 116, // ces.de use t\n 104, 105, 115,  32, 114, 111, 111, 116,  46,  10,  83, 117, // his root..Su\n  98, 106, 101,  99, 116,  58,  32,  67,  32,  61,  32,  68, // bject: C = D\n  69,  44,  32,  79,  32,  61,  32,  68,  45,  84, 114, 117, // E, O = D-Tru\n 115, 116,  32,  71, 109,  98,  72,  44,  32,  67,  78,  32, // st GmbH, CN \n  61,  32,  68,  45,  84,  82,  85,  83,  84,  32,  82, 111, // = D-TRUST Ro\n 111, 116,  32,  67, 108,  97, 115, 115,  32,  51,  32,  67, // ot Class 3 C\n  65,  32,  50,  32,  50,  48,  48,  57,  10,  78, 111, 116, // A 2 2009.Not\n  32,  66, 101, 102, 111, 114, 101,  58,  32,  78, 111, 118, //  Before: Nov\n  32,  32,  53,  32,  48,  56,  58,  51,  53,  58,  53,  56, //   5 08:35:58\n  32,  50,  48,  48,  57,  32,  71,  77,  84,  10,  78, 111, //  2009 GMT.No\n 116,  32,  65, 102, 116, 101, 114,  32,  58,  32,  78, 111, // t After : No\n 118,  32,  32,  53,  32,  48,  56,  58,  51,  53,  58,  53, // v  5 08:35:5\n  56,  32,  50,  48,  50,  57,  32,  71,  77,  84,  10,  45, // 8 2029 GMT.-\n  45,  45,  45,  45,  66,  69,  71,  73,  78,  32,  67,  69, // ----BEGIN CE\n  82,  84,  73,  70,  73,  67,  65,  84,  69,  45,  45,  45, // RTIFICATE---\n  45,  45,  10,  77,  73,  73,  69,  77, 122,  67,  67,  65, // --.MIIEMzCCA\n 120, 117, 103,  65, 119,  73,  66,  65, 103,  73,  68,  67, // xugAwIBAgIDC\n  89,  80, 122,  77,  65,  48,  71,  67,  83, 113,  71,  83, // YPzMA0GCSqGS\n  73,  98,  51,  68,  81,  69,  66,  67, 119,  85,  65,  77, // Ib3DQEBCwUAM\n  69,  48, 120,  67, 122,  65,  74,  66, 103,  78,  86,  66, // E0xCzAJBgNVB\n  65,  89,  84,  65, 107,  82,  70,  10,  77,  82,  85, 119, // AYTAkRF.MRUw\n  69, 119,  89,  68,  86,  81,  81,  75,  68,  65, 120,  69, // EwYDVQQKDAxE\n  76,  86,  82, 121, 100,  88,  78,  48,  73,  69, 100, 116, // LVRydXN0IEdt\n  89, 107, 103, 120,  74, 122,  65, 108,  66, 103,  78,  86, // YkgxJzAlBgNV\n  66,  65,  77,  77,  72, 107,  81, 116,  86,  70,  74,  86, // BAMMHkQtVFJV\n  85,  49,  81, 103,  85, 109,  57, 118, 100,  67,  66,  68, // U1QgUm9vdCBD\n  10,  98,  71,  70, 122,  99, 121,  65, 122,  73,  69,  78, // .bGFzcyAzIEN\n  66,  73,  68,  73, 103,  77, 106,  65, 119,  79,  84,  65, // BIDIgMjAwOTA\n 101,  70, 119,  48, 119,  79,  84,  69, 120,  77,  68,  85, // eFw0wOTExMDU\n 119,  79,  68,  77,  49,  78,  84, 104,  97,  70, 119,  48, // wODM1NThaFw0\n 121,  79,  84,  69, 120,  77,  68,  85, 119,  79,  68,  77, // yOTExMDUwODM\n  49,  78,  84, 104,  97,  10,  77,  69,  48, 120,  67, 122, // 1NTha.ME0xCz\n  65,  74,  66, 103,  78,  86,  66,  65,  89,  84,  65, 107, // AJBgNVBAYTAk\n  82,  70,  77,  82,  85, 119,  69, 119,  89,  68,  86,  81, // RFMRUwEwYDVQ\n  81,  75,  68,  65, 120,  69,  76,  86,  82, 121, 100,  88, // QKDAxELVRydX\n  78,  48,  73,  69, 100, 116,  89, 107, 103, 120,  74, 122, // N0IEdtYkgxJz\n  65, 108,  66, 103,  78,  86,  66,  65,  77,  77,  10,  72, // AlBgNVBAMM.H\n 107,  81, 116,  86,  70,  74,  86,  85,  49,  81, 103,  85, // kQtVFJVU1QgU\n 109,  57, 118, 100,  67,  66,  68,  98,  71,  70, 122,  99, // m9vdCBDbGFzc\n 121,  65, 122,  73,  69,  78,  66,  73,  68,  73, 103,  77, // yAzIENBIDIgM\n 106,  65, 119,  79,  84,  67,  67,  65,  83,  73, 119,  68, // jAwOTCCASIwD\n  81,  89,  74,  75, 111,  90,  73, 104, 118,  99,  78,  65, // QYJKoZIhvcNA\n  81,  69,  66,  10,  66,  81,  65,  68, 103, 103,  69,  80, // QEB.BQADggEP\n  65,  68,  67,  67,  65,  81, 111,  67, 103, 103,  69,  66, // ADCCAQoCggEB\n  65,  78,  79, 121,  83, 115,  57,  54,  82,  43,  57,  49, // ANOySs96R+91\n 109, 121,  80,  54,  79, 105,  47,  87,  85,  69,  87,  74, // myP6Oi/WUEWJ\n  78,  84, 114,  71,  97,  57, 118,  43,  50, 119,  66, 111, // NTrGa9v+2wBo\n 113,  79,  65,  68,  69,  82,  48,  51,  10,  85,  65, 105, // qOADER03.UAi\n 102,  84,  85, 112, 111, 108,  68,  87, 122,  85,  57,  71, // fTUpolDWzU9G\n  85,  89,  54,  99, 103,  86, 113,  47, 101,  85,  88, 106, // UY6cgVq/eUXj\n 115,  75, 106,  51, 122,  83,  69, 104,  81,  80, 103, 114, // sKj3zSEhQPgr\n 102,  82, 108,  87,  76,  74,  50,  51,  68,  69,  69,  48, // fRlWLJ23DEE0\n  78, 107,  86,  74,  68,  50,  73, 102, 103,  88,  85,  52, // NkVJD2IfgXU4\n  50,  10, 116,  83,  72,  75,  88, 122, 108,  65,  66,  70, // 2.tSHKXzlABF\n  57,  98, 102, 115, 121, 106, 120, 105, 117, 112,  81,  66, // 9bfsyjxiupQB\n  55,  90,  78, 111,  84,  87,  83,  80,  79,  83,  72, 106, // 7ZNoTWSPOSHj\n  82,  71,  73,  67,  84,  66, 112,  70,  71,  79,  83, 104, // RGICTBpFGOSh\n 114, 118,  85,  68,  57, 112,  88,  82, 108,  47,  82,  99, // rvUD9pXRl/Rc\n  80,  72,  65,  89,  57,  82,  10, 121,  83,  80, 111,  99, // PHAY9R.ySPoc\n 113,  54,  48, 118,  70,  89,  74, 102, 120,  76,  76,  72, // q60vFYJfxLLH\n  76,  71, 118,  75,  90,  65,  75, 121,  86,  88,  77,  68, // LGvKZAKyVXMD\n  57,  79,  48,  71, 117,  49,  72,  78,  86, 112,  75,  55, // 9O0Gu1HNVpK7\n  90, 120, 122,  66,  67,  72,  81, 113, 114,  48,  77,  69, // ZxzBCHQqr0ME\n  55,  85,  65, 121, 105,  90, 115, 120,  71, 115,  77,  10, // 7UAyiZsxGsM.\n 108,  70, 113,  86, 108,  78, 112,  81, 109, 118,  72,  47, // lFqVlNpQmvH/\n 112,  83, 116, 109,  77,  97,  84,  74,  79,  75,  68, 102, // pStmMaTJOKDf\n  72,  82,  43,  52,  67,  83,  55, 122, 112,  43, 104, 110, // HR+4CS7zp+hn\n  85, 113, 117,  86,  72,  43,  66,  71,  80, 116, 105, 107, // UquVH+BGPtik\n 119,  56, 112,  97, 120,  84,  71,  65,  54,  69, 105,  97, // w8paxTGA6Eia\n 110,  53,  82, 112,  10,  47, 104, 110, 100,  50,  72,  78, // n5Rp./hnd2HN\n  56, 103,  99, 113,  87,  51, 111,  55, 116, 115, 122,  73, // 8gcqW3o7tszI\n  70,  90,  89,  81,  48,  53, 117,  98,  57,  86, 120,  67, // FZYQ05ub9VxC\n  49,  88,  51,  97,  47,  76,  55,  65,  81,  68,  99,  85, // 1X3a/L7AQDcU\n  67,  65, 119,  69,  65,  65,  97,  79,  67,  65,  82, 111, // CAwEAAaOCARo\n 119, 103, 103,  69,  87,  77,  65,  56,  71,  10,  65,  49, // wggEWMA8G.A1\n  85, 100,  69, 119,  69,  66,  47, 119,  81,  70,  77,  65, // UdEwEB/wQFMA\n  77,  66,  65, 102,  56, 119,  72,  81,  89,  68,  86,  82, // MBAf8wHQYDVR\n  48,  79,  66,  66,  89,  69,  70,  80,  51,  97,  70,  77, // 0OBBYEFP3aFM\n  83, 102,  77,  78,  52, 104, 118,  82,  53,  67,  79, 102, // SfMN4hvR5COf\n 121, 114,  89, 121,  78,  74,  52,  80,  71,  69,  77,  65, // yrYyNJ4PGEMA\n  52,  71,  10,  65,  49,  85, 100,  68, 119,  69,  66,  47, // 4G.A1UdDwEB/\n 119,  81,  69,  65, 119,  73,  66,  66, 106,  67,  66,  48, // wQEAwIBBjCB0\n 119,  89,  68,  86,  82,  48, 102,  66,  73,  72,  76,  77, // wYDVR0fBIHLM\n  73,  72,  73,  77,  73,  71,  65, 111,  72,  54, 103, 102, // IHIMIGAoH6gf\n  73,  90,  54,  98,  71,  82, 104,  99,  68, 111, 118,  76, // IZ6bGRhcDovL\n  50,  82, 112,  99, 109,  86, 106,  10, 100,  71,  57, 121, // 2RpcmVj.dG9y\n 101,  83,  53, 107,  76,  88,  82, 121, 100,  88,  78,  48, // eS5kLXRydXN0\n  76, 109,  53, 108, 100,  67,  57,  68,  84, 106,  49,  69, // Lm5ldC9DTj1E\n  76,  86,  82,  83,  86,  86,  78,  85,  74,  84,  73, 119, // LVRSVVNUJTIw\n  85, 109,  57, 118, 100,  67,  85, 121,  77,  69,  78, 115, // Um9vdCUyMENs\n  89,  88,  78, 122,  74,  84,  73, 119,  77, 121,  85, 121, // YXNzJTIwMyUy\n  10,  77,  69,  78,  66,  74,  84,  73, 119,  77, 105,  85, // .MENBJTIwMiU\n 121,  77,  68,  73, 119,  77,  68, 107, 115,  84, 122,  49, // yMDIwMDksTz1\n  69,  76,  86,  82, 121, 100,  88,  78,  48,  74,  84,  73, // ELVRydXN0JTI\n 119,  82,  50,  49, 105,  83,  67, 120,  68,  80,  85,  82, // wR21iSCxDPUR\n  70,  80,  50,  78, 108,  99, 110,  82, 112,  90, 109, 108, // FP2NlcnRpZml\n 106,  89,  88,  82, 108,  10,  99, 109,  86,  50,  98,  50, // jYXRl.cmV2b2\n  78, 104, 100,  71, 108, 118,  98, 109, 120, 112,  99,  51, // NhdGlvbmxpc3\n  81, 119,  81,  54,  66,  66, 111,  68,  43,  71,  80,  87, // QwQ6BBoD+GPW\n 104,  48, 100,  72,  65,  54,  76, 121,  57,  51, 100,  51, // h0dHA6Ly93d3\n  99, 117,  90,  67,  49,  48,  99, 110,  86, 122, 100,  67, // cuZC10cnVzdC\n  53, 117,  90,  88,  81, 118,  89,  51,  74, 115,  10,  76, // 5uZXQvY3Js.L\n  50,  81, 116, 100,  72,  74,  49,  99,  51,  82, 102,  99, // 2QtdHJ1c3Rfc\n 109,  57, 118, 100,  70,  57, 106,  98,  71,  70, 122,  99, // m9vdF9jbGFzc\n  49,  56, 122,  88,  50,  78, 104,  88, 122,  74, 102,  77, // 18zX2NhXzJfM\n 106,  65, 119,  79,  83,  53, 106,  99, 109, 119, 119,  68, // jAwOS5jcmwwD\n  81,  89,  74,  75, 111,  90,  73, 104, 118,  99,  78,  65, // QYJKoZIhvcNA\n  81,  69,  76,  10,  66,  81,  65,  68, 103, 103,  69,  66, // QEL.BQADggEB\n  65,  72,  43,  88,  50, 122,  68,  73,  51,  54,  83,  99, // AH+X2zDI36Sc\n 102,  83,  70,  54, 103,  72,  68,  79,  70,  66,  74, 112, // fSF6gHDOFBJp\n 105,  66,  83,  86,  89,  69,  81,  66, 114,  76,  76, 112, // iBSVYEQBrLLp\n  77,  69,  43,  98,  85,  77,  74, 109,  50,  72,  54,  78, // ME+bUMJm2H6N\n  77,  76,  86, 119,  77, 101, 110, 105,  10,  97,  99, 102, // MLVwMeni.acf\n 122,  99,  78, 115, 103,  70,  89,  98,  81,  68, 102,  67, // zcNsgFYbQDfC\n  43, 114,  65,  70,  49, 104,  77,  53,  43, 110,  48,  50, // +rAF1hM5+n02\n  47, 116,  50,  65,  55, 110,  80,  80,  75,  72, 101,  74, // /t2A7nPPKHeJ\n 101,  97,  78, 105, 106, 110,  90, 102, 108,  81,  71,  68, // eaNijnZflQGD\n  83,  78, 105,  72,  43,  48,  76,  83,  52,  70,  57, 112, // SNiH+0LS4F9p\n  48,  10, 111,  51,  47,  85,  51,  55,  67,  89,  65, 113, // 0.o3/U37CYAq\n 120, 118,  97,  50, 115, 115,  74,  83,  82, 121, 111,  87, // xva2ssJSRyoW\n  88, 117,  74,  86, 114, 108,  53, 106,  76, 110,  56, 116, // XuJVrl5jLn8t\n  43, 114,  83, 102, 114, 122, 107,  71, 107, 106,  50, 119, // +rSfrzkGkj2w\n  84,  90,  53,  49, 120,  89,  47,  71,  88,  85, 108,  55, // TZ51xY/GXUl7\n  55,  77,  47,  67,  52,  75,  10, 122,  67,  85, 113,  78, // 7M/C4K.zCUqN\n  81,  84,  52,  89,  74,  69,  86, 100,  84,  49,  66,  47, // QT4YJEVdT1B/\n 121,  77, 102,  71,  99, 104, 115,  54,  52,  74,  84,  66, // yMfGchs64JTB\n  75,  98, 107,  84,  67,  74,  78, 106,  89, 121,  54, 122, // KbkTCJNjYy6z\n 108, 116, 122,  55,  71,  82,  85,  85,  71,  51,  82, 110, // ltz7GRUUG3Rn\n  70,  88,  55,  97,  99,  77,  50, 119,  52, 121,  56,  10, // FX7acM2w4y8.\n  80,  73,  87, 109,  97, 119, 111, 109,  68, 101,  67,  84, // PIWmawomDeCT\n 109,  71,  67, 117, 102, 115,  89, 107, 108,  52, 112, 104, // mGCufsYkl4ph\n  88,  53,  71,  79,  90, 112,  73,  74, 104, 122,  98,  78, // X5GOZpIJhzbN\n 105,  53, 115, 116,  80, 118,  90,  82,  49,  70,  68,  85, // i5stPvZR1FDU\n  87,  83, 105,  57, 103,  47,  76,  77,  75,  72, 116,  84, // WSi9g/LMKHtT\n 104, 109,  51,  89,  10,  74, 111, 104, 119,  49,  43, 113, // hm3Y.Johw1+q\n  82, 122,  84,  54,  53, 121, 115,  67,  81,  98, 108, 114, // RzT65ysCQblr\n  71,  88, 110,  82, 108,  49,  49, 122,  43, 111,  43,  73, // GXnRl11z+o+I\n  61,  10,  45,  45,  45,  45,  45,  69,  78,  68,  32,  67, // =.-----END C\n  69,  82,  84,  73,  70,  73,  67,  65,  84,  69,  45,  45, // ERTIFICATE--\n  45,  45,  45,  10,  10,  35,  32, 104, 116, 116, 112, 115, // ---..# https\n  58,  47,  47, 119, 119, 119,  46,  97, 109,  97, 122, 111, // ://www.amazo\n 110, 116, 114, 117, 115, 116,  46,  99, 111, 109,  47, 114, // ntrust.com/r\n 101, 112, 111, 115, 105, 116, 111, 114, 121,  47,  10,  83, // epository/.S\n 117,  98, 106, 101,  99, 116,  58,  32,  67,  32,  61,  32, // ubject: C = \n  85,  83,  44,  32,  79,  32,  61,  32,  65, 109,  97, 122, // US, O = Amaz\n 111, 110,  44,  32,  67,  78,  32,  61,  32,  65, 109,  97, // on, CN = Ama\n 122, 111, 110,  32,  82, 111, 111, 116,  32,  67,  65,  32, // zon Root CA \n  49,  10,  78, 111, 116,  32,  66, 101, 102, 111, 114, 101, // 1.Not Before\n  58,  32,  77,  97, 121,  32,  50,  54,  32,  48,  48,  58, // : May 26 00:\n  48,  48,  58,  48,  48,  32,  50,  48,  49,  53,  32,  71, // 00:00 2015 G\n  77,  84,  10,  78, 111, 116,  32,  65, 102, 116, 101, 114, // MT.Not After\n  32,  58,  32,  74,  97, 110,  32,  49,  55,  32,  48,  48, //  : Jan 17 00\n  58,  48,  48,  58,  48,  48,  32,  50,  48,  51,  56,  32, // :00:00 2038 \n  71,  77,  84,  10,  45,  45,  45,  45,  45,  66,  69,  71, // GMT.-----BEG\n  73,  78,  32,  67,  69,  82,  84,  73,  70,  73,  67,  65, // IN CERTIFICA\n  84,  69,  45,  45,  45,  45,  45,  10,  77,  73,  73,  68, // TE-----.MIID\n  81,  84,  67,  67,  65, 105, 109, 103,  65, 119,  73,  66, // QTCCAimgAwIB\n  65, 103,  73,  84,  66, 109, 121, 102, 122,  53, 109,  47, // AgITBmyfz5m/\n 106,  65, 111,  53,  52, 118,  66,  52, 105, 107,  80, 109, // jAo54vB4ikPm\n 108, 106,  90,  98, 121, 106,  65,  78,  66, 103, 107, 113, // ljZbyjANBgkq\n 104, 107, 105,  71,  57, 119,  48,  66,  65,  81, 115,  70, // hkiG9w0BAQsF\n  10,  65,  68,  65,  53,  77,  81, 115, 119,  67,  81,  89, // .ADA5MQswCQY\n  68,  86,  81,  81,  71,  69, 119,  74,  86,  85, 122,  69, // DVQQGEwJVUzE\n  80,  77,  65,  48,  71,  65,  49,  85,  69,  67, 104,  77, // PMA0GA1UEChM\n  71,  81,  87,  49, 104, 101, 109,  57, 117,  77,  82, 107, // GQW1hem9uMRk\n 119,  70, 119,  89,  68,  86,  81,  81,  68,  69, 120,  66, // wFwYDVQQDExB\n  66,  98,  87,  70,  54,  10,  98,  50,  52, 103,  85, 109, // BbWF6.b24gUm\n  57, 118, 100,  67,  66,  68,  81,  83,  65, 120,  77,  66, // 9vdCBDQSAxMB\n  52,  88,  68,  84,  69,  49,  77,  68,  85, 121,  78, 106, // 4XDTE1MDUyNj\n  65, 119,  77,  68,  65, 119,  77,  70, 111,  88,  68,  84, // AwMDAwMFoXDT\n  77,  52,  77,  68,  69, 120,  78, 122,  65, 119,  77,  68, // M4MDExNzAwMD\n  65, 119,  77,  70, 111, 119,  79,  84,  69,  76,  10,  77, // AwMFowOTEL.M\n  65, 107,  71,  65,  49,  85,  69,  66, 104,  77,  67,  86, // AkGA1UEBhMCV\n  86,  77, 120,  68, 122,  65,  78,  66, 103,  78,  86,  66, // VMxDzANBgNVB\n  65, 111,  84,  66, 107,  70, 116,  89,  88, 112, 118,  98, // AoTBkFtYXpvb\n 106,  69,  90,  77,  66,  99,  71,  65,  49,  85,  69,  65, // jEZMBcGA1UEA\n 120,  77,  81,  81,  87,  49, 104, 101, 109,  57, 117,  73, // xMQQW1hem9uI\n  70,  74, 118,  10,  98,  51,  81, 103,  81,  48,  69, 103, // FJv.b3QgQ0Eg\n  77,  84,  67,  67,  65,  83,  73, 119,  68,  81,  89,  74, // MTCCASIwDQYJ\n  75, 111,  90,  73, 104, 118,  99,  78,  65,  81,  69,  66, // KoZIhvcNAQEB\n  66,  81,  65,  68, 103, 103,  69,  80,  65,  68,  67,  67, // BQADggEPADCC\n  65,  81, 111,  67, 103, 103,  69,  66,  65,  76,  74,  52, // AQoCggEBALJ4\n 103,  72,  72,  75, 101,  78,  88, 106,  10,  99,  97,  57, // gHHKeNXj.ca9\n  72, 103,  70,  66,  48, 102,  87,  55,  89,  49,  52, 104, // HgFB0fW7Y14h\n  50,  57,  74, 108, 111,  57,  49, 103, 104,  89,  80, 108, // 29Jlo91ghYPl\n  48, 104,  65,  69, 118, 114,  65,  73, 116, 104, 116,  79, // 0hAEvrAIthtO\n 103,  81,  51, 112,  79, 115, 113,  84,  81,  78, 114, 111, // gQ3pOsqTQNro\n  66, 118, 111,  51,  98,  83,  77, 103,  72,  70, 122,  90, // Bvo3bSMgHFzZ\n  77,  10,  57,  79,  54,  73,  73,  56,  99,  43,  54, 122, // M.9O6II8c+6z\n 102,  49, 116,  82, 110,  52,  83,  87, 105, 119,  51, 116, // f1tRn4SWiw3t\n 101,  53, 100, 106, 103, 100,  89,  90,  54, 107,  47, 111, // e5djgdYZ6k/o\n  73,  50, 112, 101,  86,  75,  86, 117,  82,  70,  52, 102, // I2peVKVuRF4f\n 110,  57, 116,  66,  98,  54, 100,  78, 113,  99, 109, 122, // n9tBb6dNqcmz\n  85,  53,  76,  47, 113, 119,  10,  73,  70,  65,  71,  98, // U5L/qw.IFAGb\n  72, 114,  81, 103,  76,  75, 109,  43,  97,  47, 115,  82, // HrQgLKm+a/sR\n 120, 109,  80,  85,  68, 103,  72,  51,  75,  75,  72,  79, // xmPUDgH3KKHO\n  86, 106,  52, 117, 116,  87, 112,  43,  85, 104, 110,  77, // Vj4utWp+UhnM\n  74,  98, 117, 108,  72, 104, 101,  98,  52, 109, 106,  85, // JbulHheb4mjU\n  99,  65, 119, 104, 109,  97, 104,  82,  87,  97,  54,  10, // cAwhmahRWa6.\n  86,  79, 117, 106, 119,  53,  72,  53,  83,  78, 122,  47, // VOujw5H5SNz/\n  48, 101, 103, 119,  76,  88,  48, 116, 100,  72,  65,  49, // 0egwLX0tdHA1\n  49,  52, 103, 107,  57,  53,  55,  69,  87,  87,  54,  55, // 14gk957EWW67\n  99,  52,  99,  88,  56, 106,  74,  71,  75,  76, 104,  68, // c4cX8jJGKLhD\n  43, 114,  99, 100, 113, 115, 113,  48,  56, 112,  56, 107, // +rcdqsq08p8k\n  68, 105,  49,  76,  10,  57,  51,  70,  99,  88, 109, 110, // Di1L.93FcXmn\n  47,  54, 112,  85,  67, 121, 122, 105,  75, 114, 108,  65, // /6pUCyziKrlA\n  52,  98,  57, 118,  55,  76,  87,  73,  98, 120,  99,  99, // 4b9v7LWIbxcc\n 101,  86,  79,  70,  51,  52,  71, 102,  73,  68,  53, 121, // eVOF34GfID5y\n  72,  73,  57,  89,  47,  81,  67,  66,  47,  73,  73,  68, // HI9Y/QCB/IID\n  69, 103,  69, 119,  43,  79, 121,  81, 109,  10, 106, 103, // EgEw+OyQm.jg\n  83, 117,  98,  74, 114,  73, 113, 103,  48,  67,  65, 119, // SubJrIqg0CAw\n  69,  65,  65,  97,  78,  67,  77,  69,  65, 119,  68, 119, // EAAaNCMEAwDw\n  89,  68,  86,  82,  48,  84,  65,  81,  72,  47,  66,  65, // YDVR0TAQH/BA\n  85, 119,  65, 119,  69,  66,  47, 122,  65,  79,  66, 103, // UwAwEB/zAOBg\n  78,  86,  72,  81,  56,  66,  65, 102,  56,  69,  66,  65, // NVHQ8BAf8EBA\n  77,  67,  10,  65,  89,  89, 119,  72,  81,  89,  68,  86, // MC.AYYwHQYDV\n  82,  48,  79,  66,  66,  89,  69,  70,  73,  81,  89, 122, // R0OBBYEFIQYz\n  73,  85,  48,  55,  76, 119,  77, 108,  74,  81, 117,  67, // IU07LwMlJQuC\n  70, 109,  99, 120,  55,  73,  81,  84, 103, 111,  73,  77, // Fmcx7IQTgoIM\n  65,  48,  71,  67,  83, 113,  71,  83,  73,  98,  51,  68, // A0GCSqGSIb3D\n  81,  69,  66,  67, 119,  85,  65,  10,  65,  52,  73,  66, // QEBCwUA.A4IB\n  65,  81,  67,  89,  56, 106, 100,  97,  81,  90,  67, 104, // AQCY8jdaQZCh\n  71, 115,  86,  50,  85,  83, 103, 103,  78, 105,  77,  79, // GsV2USggNiMO\n 114, 117,  89, 111, 117,  54, 114,  52, 108,  75,  53,  73, // ruYou6r4lK5I\n 112,  68,  66,  47,  71,  47, 119, 107, 106,  85, 117,  48, // pDB/G/wkjUu0\n 121,  75,  71,  88,  57, 114,  98, 120, 101, 110,  68,  73, // yKGX9rbxenDI\n  10,  85,  53,  80,  77,  67,  67, 106, 106, 109,  67,  88, // .U5PMCCjjmCX\n  80,  73,  54,  84,  53,  51, 105,  72,  84, 102,  73,  85, // PI6T53iHTfIU\n  74, 114,  85,  54,  97, 100,  84, 114,  67,  67,  50, 113, // JrU6adTrCC2q\n  74, 101,  72,  90,  69,  82, 120, 104, 108,  98,  73,  49, // JeHZERxhlbI1\n  66, 106, 106, 116,  47, 109, 115, 118,  48, 116,  97, 100, // Bjjt/msv0tad\n  81,  49, 119,  85, 115,  10,  78,  43, 103,  68,  83,  54, // Q1wUs.N+gDS6\n  51, 112,  89,  97,  65,  67,  98, 118,  88, 121,  56,  77, // 3pYaACbvXy8M\n  87, 121,  55,  86, 117,  51,  51,  80, 113,  85,  88,  72, // Wy7Vu33PqUXH\n 101, 101,  69,  54,  86,  47,  85, 113,  50,  86,  56, 118, // eeE6V/Uq2V8v\n 105,  84,  79,  57,  54,  76,  88,  70, 118,  75,  87, 108, // iTO96LXFvKWl\n  74,  98,  89,  75,  56,  85,  57,  48, 118, 118,  10, 111, // JbYK8U90vv.o\n  47, 117, 102,  81,  74,  86, 116,  77,  86,  84,  56,  81, // /ufQJVtMVT8Q\n 116,  80,  72,  82, 104,  56, 106, 114, 100, 107,  80,  83, // tPHRh8jrdkPS\n  72,  67,  97,  50,  88,  86,  52,  99, 100,  70, 121,  81, // HCa2XV4cdFyQ\n 122,  82,  49,  98, 108, 100,  90, 119, 103,  74,  99,  74, // zR1bldZwgJcJ\n 109,  65, 112, 122, 121,  77,  90,  70, 111,  54,  73,  81, // mApzyMZFo6IQ\n  54,  88,  85,  10,  53,  77, 115,  73,  43, 121,  77,  82, // 6XU.5MsI+yMR\n  81,  43, 104,  68,  75,  88,  74, 105, 111,  97, 108, 100, // Q+hDKXJioald\n  88, 103, 106,  85, 107,  75,  54,  52,  50,  77,  52,  85, // XgjUkK642M4U\n 119, 116,  66,  86,  56, 111,  98,  50, 120,  74,  78,  68, // wtBV8ob2xJND\n 100,  50,  90, 104, 119,  76, 110, 111,  81, 100, 101,  88, // d2ZhwLnoQdeX\n 101,  71,  65,  68,  98, 107, 112, 121,  10, 114, 113,  88, // eGADbkpy.rqX\n  82, 102,  98, 111,  81, 110, 111,  90, 115,  71,  52, 113, // RfboQnoZsG4q\n  53,  87,  84,  80,  52,  54,  56,  83,  81, 118, 118,  71, // 5WTP468SQvvG\n  53,  10,  45,  45,  45,  45,  45,  69,  78,  68,  32,  67, // 5.-----END C\n  69,  82,  84,  73,  70,  73,  67,  65,  84,  69,  45,  45, // ERTIFICATE--\n  45,  45,  45,  10,  10,  83, 117,  98, 106, 101,  99, 116, // ---..Subject\n  58,  32,  67,  32,  61,  32,  85,  83,  44,  32,  79,  32, // : C = US, O \n  61,  32,  65, 109,  97, 122, 111, 110,  44,  32,  67,  78, // = Amazon, CN\n  32,  61,  32,  65, 109,  97, 122, 111, 110,  32,  82, 111, //  = Amazon Ro\n 111, 116,  32,  67,  65,  32,  50,  10,  78, 111, 116,  32, // ot CA 2.Not \n  66, 101, 102, 111, 114, 101,  58,  32,  77,  97, 121,  32, // Before: May \n  50,  54,  32,  48,  48,  58,  48,  48,  58,  48,  48,  32, // 26 00:00:00 \n  50,  48,  49,  53,  32,  71,  77,  84,  10,  78, 111, 116, // 2015 GMT.Not\n  32,  65, 102, 116, 101, 114,  32,  58,  32,  77,  97, 121, //  After : May\n  32,  50,  54,  32,  48,  48,  58,  48,  48,  58,  48,  48, //  26 00:00:00\n  32,  50,  48,  52,  48,  32,  71,  77,  84,  10,  45,  45, //  2040 GMT.--\n  45,  45,  45,  66,  69,  71,  73,  78,  32,  67,  69,  82, // ---BEGIN CER\n  84,  73,  70,  73,  67,  65,  84,  69,  45,  45,  45,  45, // TIFICATE----\n  45,  10,  77,  73,  73,  70,  81,  84,  67,  67,  65, 121, // -.MIIFQTCCAy\n 109, 103,  65, 119,  73,  66,  65, 103,  73,  84,  66, 109, // mgAwIBAgITBm\n 121, 102,  48, 112,  89,  49, 104, 112,  56,  75,  68,  43, // yf0pY1hp8KD+\n  87,  71, 101,  80, 104,  98,  74, 114, 117,  75,  78, 122, // WGePhbJruKNz\n  65,  78,  66, 103, 107, 113, 104, 107, 105,  71,  57, 119, // ANBgkqhkiG9w\n  48,  66,  65,  81, 119,  70,  10,  65,  68,  65,  53,  77, // 0BAQwF.ADA5M\n  81, 115, 119,  67,  81,  89,  68,  86,  81,  81,  71,  69, // QswCQYDVQQGE\n 119,  74,  86,  85, 122,  69,  80,  77,  65,  48,  71,  65, // wJVUzEPMA0GA\n  49,  85,  69,  67, 104,  77,  71,  81,  87,  49, 104, 101, // 1UEChMGQW1he\n 109,  57, 117,  77,  82, 107, 119,  70, 119,  89,  68,  86, // m9uMRkwFwYDV\n  81,  81,  68,  69, 120,  66,  66,  98,  87,  70,  54,  10, // QQDExBBbWF6.\n  98,  50,  52, 103,  85, 109,  57, 118, 100,  67,  66,  68, // b24gUm9vdCBD\n  81,  83,  65, 121,  77,  66,  52,  88,  68,  84,  69,  49, // QSAyMB4XDTE1\n  77,  68,  85, 121,  78, 106,  65, 119,  77,  68,  65, 119, // MDUyNjAwMDAw\n  77,  70, 111,  88,  68,  84,  81, 119,  77,  68,  85, 121, // MFoXDTQwMDUy\n  78, 106,  65, 119,  77,  68,  65, 119,  77,  70, 111, 119, // NjAwMDAwMFow\n  79,  84,  69,  76,  10,  77,  65, 107,  71,  65,  49,  85, // OTEL.MAkGA1U\n  69,  66, 104,  77,  67,  86,  86,  77, 120,  68, 122,  65, // EBhMCVVMxDzA\n  78,  66, 103,  78,  86,  66,  65, 111,  84,  66, 107,  70, // NBgNVBAoTBkF\n 116,  89,  88, 112, 118,  98, 106,  69,  90,  77,  66,  99, // tYXpvbjEZMBc\n  71,  65,  49,  85,  69,  65, 120,  77,  81,  81,  87,  49, // GA1UEAxMQQW1\n 104, 101, 109,  57, 117,  73,  70,  74, 118,  10,  98,  51, // hem9uIFJv.b3\n  81, 103,  81,  48,  69, 103,  77, 106,  67,  67,  65, 105, // QgQ0EgMjCCAi\n  73, 119,  68,  81,  89,  74,  75, 111,  90,  73, 104, 118, // IwDQYJKoZIhv\n  99,  78,  65,  81,  69,  66,  66,  81,  65,  68, 103, 103, // cNAQEBBQADgg\n  73,  80,  65,  68,  67,  67,  65, 103, 111,  67, 103, 103, // IPADCCAgoCgg\n  73,  66,  65,  75,  50,  87, 110, 121,  50,  99,  83, 107, // IBAK2Wny2cSk\n 120,  75,  10, 103,  88, 108,  82, 109, 101, 121,  75, 121, // xK.gXlRmeyKy\n  50, 116, 103,  85,  82,  79,  56,  84,  87,  48,  71,  47, // 2tgURO8TW0G/\n  76,  65,  73, 106, 100,  48,  90,  69,  71, 114,  72,  74, // LAIjd0ZEGrHJ\n 103, 119,  49,  50,  77,  66, 118,  73,  73,  84, 112, 108, // gw12MBvIITpl\n  76,  71,  98, 104,  81,  80,  68,  87,  57, 116,  75,  54, // LGbhQPDW9tK6\n  77, 106,  52, 107,  72,  98,  90,  10,  87,  48,  47, 106, // Mj4kHbZ.W0/j\n  84,  79, 103,  71,  78, 107,  51,  77, 109, 113, 119,  57, // TOgGNk3Mmqw9\n  68,  74,  65, 114, 107, 116,  81,  71,  71,  87,  67, 115, // DJArktQGGWCs\n  78,  48,  82,  53, 104,  89,  71,  67, 114,  86, 111,  51, // N0R5hYGCrVo3\n  52,  65,  51,  77, 110,  97,  90,  77,  85, 110,  98, 113, // 4A3MnaZMUnbq\n  81,  53,  50,  51,  66,  78,  70,  81,  57, 108,  88, 103, // Q523BNFQ9lXg\n  10,  49, 100,  75, 109,  83,  89,  88, 112,  78,  43, 110, // .1dKmSYXpN+n\n  75, 102, 113,  53,  99, 108,  85,  49,  73, 109, 106,  43, // Kfq5clU1Imj+\n 117,  73,  70, 112, 116, 105,  74,  88,  90,  78,  76, 104, // uIFptiJXZNLh\n  83,  71, 107,  79,  81, 115,  76,  57, 115,  66,  98, 109, // SGkOQsL9sBbm\n  50, 101,  76, 102, 113,  48,  79,  81,  54,  80,  66,  74, // 2eLfq0OQ6PBJ\n  84,  89, 118,  57,  75,  10,  56, 110, 117,  43,  78,  81, // TYv9K.8nu+NQ\n  87, 112,  69, 106,  84, 106,  56,  50,  82,  48,  89, 105, // WpEjTj82R0Yi\n 119,  57,  65,  69, 108,  97,  75,  80,  52, 121,  82,  76, // w9AElaKP4yRL\n 117,  72,  51,  87,  85, 110,  65, 110,  69,  55,  50, 107, // uH3WUnAnE72k\n 114,  51,  72,  57, 114,  78,  57, 121,  70,  86, 107,  69, // r3H9rN9yFVkE\n  56,  80,  55,  75,  54,  67,  52,  90,  57, 114,  10,  50, // 8P7K6C4Z9r.2\n  85,  88,  84, 117,  47,  66, 102, 104,  43,  48,  56,  76, // UXTu/Bfh+08L\n  68, 109,  71,  50, 106,  47, 101,  55,  72,  74,  86,  54, // DmG2j/e7HJV6\n  51, 109, 106, 114, 100, 118, 100, 102,  76,  67,  54,  72, // 3mjrdvdfLC6H\n  77,  55,  56,  51, 107,  56,  49, 100, 115,  56,  80,  43, // M783k81ds8P+\n  72, 103, 102,  97, 106,  90,  82,  82, 105, 100, 104,  87, // HgfajZRRidhW\n  43, 109, 101,  10, 122,  47,  67, 105,  86,  88,  49,  56, // +me.z/CiVX18\n  74,  89, 112, 118,  76,  55,  84,  70, 122,  52,  81, 117, // JYpvL7TFz4Qu\n  75,  47,  48,  78,  85,  82,  66, 115,  43,  49,  56,  98, // K/0NURBs+18b\n 118,  66, 116,  43, 120,  97,  52,  55, 109,  65,  69, 120, // vBt+xa47mAEx\n 107, 118,  56,  76,  86,  47,  83,  97, 115, 114, 108,  88, // kv8LV/SasrlX\n  54,  97, 118, 118,  68,  88,  98,  82,  10,  56,  79,  55, // 6avvDXbR.8O7\n  48, 122, 111,  97, 110,  52,  71,  55, 112, 116,  71, 109, // 0zoan4G7ptGm\n 104,  51,  50, 110,  50,  77,  56,  90, 112,  76, 112,  99, // h32n2M8ZpLpc\n  84, 110, 113,  87,  72, 115,  70,  99,  81, 103,  84, 102, // TnqWHsFcQgTf\n  74,  85,  55,  79,  55, 102,  47,  97,  83,  48,  90, 122, // JU7O7f/aS0Zz\n  81,  71,  80,  83,  83,  98, 116, 113,  68,  84,  54,  90, // QGPSSbtqDT6Z\n 106,  10, 109,  85, 121, 108,  43,  49,  55, 118,  73,  87, // j.mUyl+17vIW\n  82,  54,  73,  70,  57, 115,  90,  73,  85,  86, 121, 122, // R6IF9sZIUVyz\n 102, 112,  89, 103, 119,  76,  75, 104,  98,  99,  65,  83, // fpYgwLKhbcAS\n  52, 121,  50, 106,  53,  76,  57,  90,  52,  54,  57, 104, // 4y2j5L9Z469h\n 100,  65, 108,  79,  43, 101, 107,  81, 105,  71,  43, 114, // dAlO+ekQiG+r\n  53, 106, 113,  70, 111, 122,  10,  55,  77, 116,  48,  81, // 5jqFoz.7Mt0Q\n  53,  88,  53,  98,  71, 108,  83,  78, 115,  99, 112,  98, // 5X5bGlSNscpb\n  47, 120,  86,  65,  49, 119, 102,  43,  53,  43,  57,  82, // /xVA1wf+5+9R\n  43, 118, 110,  83,  85, 101,  86,  67,  48,  54,  74,  73, // +vnSUeVC06JI\n 103, 108,  74,  52,  80,  86, 104,  72, 118,  71,  47,  76, // glJ4PVhHvG/L\n 111, 112, 121,  98, 111,  66,  90,  47,  49,  99,  54,  10, // opyboBZ/1c6.\n  43,  88,  85, 121, 111,  48,  53, 102,  55,  79,  48, 111, // +XUyo05f7O0o\n  89, 116, 108,  78,  99,  47,  76,  77, 103,  82, 100, 103, // YtlNc/LMgRdg\n  55,  99,  51, 114,  51,  78, 117, 110, 121, 115,  86,  43, // 7c3r3NunysV+\n  65, 114,  51, 121,  86,  65, 104,  85,  47,  98,  81, 116, // Ar3yVAhU/bQt\n  67,  83, 119,  88,  86,  69, 113,  89,  48,  86,  84, 104, // CSwXVEqY0VTh\n  85,  87,  99,  73,  10,  48, 117,  49, 117, 102, 109,  56, // UWcI.0u1ufm8\n  47,  48, 105,  50,  66,  87,  83, 108, 109, 121,  53,  65, // /0i2BWSlmy5A\n  53, 108,  82,  69, 101, 100,  67, 102,  43,  51, 101, 117, // 5lREedCf+3eu\n 118,  65, 103,  77,  66,  65,  65,  71, 106,  81, 106,  66, // vAgMBAAGjQjB\n  65,  77,  65,  56,  71,  65,  49,  85, 100,  69, 119,  69, // AMA8GA1UdEwE\n  66,  47, 119,  81,  70,  77,  65,  77,  66,  10,  65, 102, // B/wQFMAMB.Af\n  56, 119,  68, 103,  89,  68,  86,  82,  48,  80,  65,  81, // 8wDgYDVR0PAQ\n  72,  47,  66,  65,  81,  68,  65, 103,  71,  71,  77,  66, // H/BAQDAgGGMB\n  48,  71,  65,  49,  85, 100,  68, 103,  81,  87,  66,  66, // 0GA1UdDgQWBB\n  83, 119,  68,  80,  66,  77,  77,  80,  81,  70,  87,  65, // SwDPBMMPQFWA\n  74,  73,  47,  84,  80, 108,  85, 113,  57,  76, 104,  79, // JI/TPlUq9LhO\n  78, 109,  10,  85, 106,  65,  78,  66, 103, 107, 113, 104, // Nm.UjANBgkqh\n 107, 105,  71,  57, 119,  48,  66,  65,  81, 119,  70,  65, // kiG9w0BAQwFA\n  65,  79,  67,  65, 103,  69,  65, 113, 113, 105,  65, 106, // AOCAgEAqqiAj\n 119,  53,  52, 111,  43,  67, 105,  49,  77,  51, 109,  57, // w54o+Ci1M3m9\n  90, 104,  54,  79,  43, 111,  65,  65,  55,  67,  88,  68, // Zh6O+oAA7CXD\n 112,  79,  56,  87, 113, 106,  50,  10,  76,  73, 120, 121, // pO8Wqj2.LIxy\n 104,  54, 109, 120,  47,  72,  57, 122,  47,  87,  78, 120, // h6mx/H9z/WNx\n 101,  75,  87,  72,  87,  99,  56, 119,  52,  81,  48,  81, // eKWHWc8w4Q0Q\n 115, 104,  78,  97,  98,  89,  76,  49,  97, 117,  97,  65, // shNabYL1auaA\n 110,  54,  65,  70,  67,  50, 106, 107,  82,  50, 118,  72, // n6AFC2jkR2vH\n  97, 116,  43,  50,  47,  88,  99, 121,  99, 117,  85,  89, // at+2/XcycuUY\n  10,  43, 103, 110,  48, 111,  74,  77, 115,  88, 100,  75, // .+gn0oJMsXdK\n  77, 100,  89,  86,  50,  90,  90,  65,  77,  65,  51, 109, // MdYV2ZZAMA3m\n  51,  77,  83,  78, 106, 114,  88, 105,  68,  67,  89,  90, // 3MSNjrXiDCYZ\n 111, 104,  77, 114,  47,  43,  99,  56, 109, 109, 112,  74, // ohMr/+c8mmpJ\n  53,  53,  56,  49,  76, 120, 101, 100, 104, 112, 120, 102, // 5581Lxedhpxf\n  76,  56,  54, 107,  83,  10, 107,  53,  78, 114, 112,  43, // L86kS.k5Nrp+\n 103, 118,  85,  53,  76,  69,  89,  70, 105, 119, 122,  65, // gvU5LEYFiwzA\n  74,  82,  71,  70, 117,  70, 106,  87,  74,  90,  89,  55, // JRGFuFjWJZY7\n  97, 116, 116,  78,  54,  97,  43, 121,  98,  51,  65,  67, // attN6a+yb3AC\n 102,  65,  88,  86,  85,  51, 100,  74, 110,  74,  85,  72, // fAXVU3dJnJUH\n  47, 106,  87,  83,  53,  69,  52, 121, 119, 108,  10,  55, // /jWS5E4ywl.7\n 117, 120,  77,  77, 110, 101,  48, 110, 120, 114, 112,  83, // uxMMne0nxrpS\n  49,  48, 103, 120, 100, 114,  57,  72,  73,  99,  87, 120, // 10gxdr9HIcWx\n 107,  80, 111,  49,  76, 115, 109, 109, 107,  86, 119,  88, // kPo1LsmmkVwX\n 113, 107,  76,  78,  49,  80, 105,  82, 110, 115, 110,  47, // qkLN1PiRnsn/\n 101,  66,  71,  56, 111, 109,  51, 122,  69,  75,  50, 121, // eBG8om3zEK2y\n 121, 103, 109,  10,  98, 116, 109, 108, 121,  84, 114,  73, // ygm.btmlyTrI\n  81,  82,  78, 103,  57,  49,  67,  77,  70,  97,  54, 121, // QRNg91CMFa6y\n  98,  82, 111,  86,  71, 108, 100,  52,  53, 112,  73, 113, // bRoVGld45pIq\n  50,  87,  87,  81, 103, 106,  57, 115,  65, 113,  43, 117, // 2WWQgj9sAq+u\n  69, 106, 111, 110, 108, 106,  89,  69,  49, 120,  50, 105, // EjonljYE1x2i\n 103,  71,  79, 112, 109,  47,  72, 108,  10, 117, 114,  82, // gGOpm/Hl.urR\n  56,  70,  76,  66,  79, 121,  98,  69, 102, 100,  70,  56, // 8FLBOybEfdF8\n  52,  57, 108,  72, 113, 109,  47, 111, 115, 111, 104,  72, // 49lHqm/osohH\n  85, 113,  83,  48, 110,  71, 107,  87, 120, 114,  55,  74, // UqS0nGkWxr7J\n  79,  99,  81,  51,  65,  87,  69,  98,  87,  97,  81,  98, // OcQ3AWEbWaQb\n  76,  85,  56, 117, 122,  47, 109, 116,  66, 122,  85,  70, // LU8uz/mtBzUF\n  43,  10, 102,  85, 119,  80, 102,  72,  74,  53, 101, 108, // +.fUwPfHJ5el\n 110,  78,  88, 107, 111,  79, 114,  74, 117, 112, 109,  72, // nNXkoOrJupmH\n  78,  53, 102,  76,  84,  48, 122,  76, 109,  52,  66, 119, // N5fLT0zLm4Bw\n 121, 121, 100,  70, 121,  52, 120,  50,  43,  73, 111,  90, // yydFy4x2+IoZ\n  67, 110,  57,  75, 114,  53, 118,  50,  99,  54,  57,  66, // Cn9Kr5v2c69B\n 111,  86,  89, 104,  54,  51,  10, 110,  55,  52,  57, 115, // oVYh63.n749s\n  83, 109, 118,  90,  54,  69,  83,  56, 108, 103,  81,  71, // SmvZ6ES8lgQG\n  86,  77,  68,  77,  66, 117,  52,  71, 111, 110,  50, 110, // VMDMBu4Gon2n\n  76,  50,  88,  65,  52,  54, 106,  67, 102,  77, 100, 105, // L2XA46jCfMdi\n 121,  72, 120, 116,  78,  47, 107,  72,  78,  71, 102,  90, // yHxtN/kHNGfZ\n  81,  73,  71,  54, 108, 122,  87,  69,  55,  79,  69,  10, // QIG6lzWE7OE.\n  55,  54,  75, 108,  88,  73, 120,  51,  75,  97, 100, 111, // 76KlXIx3Kado\n 119,  71, 117, 117,  81,  78,  75, 111, 116,  79, 114,  78, // wGuuQNKotOrN\n  56,  73,  49,  76,  79,  74, 119,  90, 109, 104, 115, 111, // 8I1LOJwZmhso\n  86,  76, 105,  74, 107,  79,  47,  75, 100,  89,  69,  43, // VLiJkO/KdYE+\n  72, 118,  74, 107,  74,  77,  99,  89, 114,  48,  55,  47, // HvJkJMcYr07/\n  82,  53,  52,  72,  10,  57, 106,  86, 108, 112,  78,  77, // R54H.9jVlpNM\n  75,  86, 118,  47,  49,  70,  50,  82, 115,  55,  54, 103, // KVv/1F2Rs76g\n 105,  74,  85, 109,  84, 116, 116,  56,  65,  70,  57, 112, // iJUmTtt8AF9p\n  89, 102, 108,  51, 117, 120,  82, 117, 119,  48, 100,  70, // Yfl3uxRuw0dF\n 102,  73,  82,  68,  72,  43, 102,  79,  54,  65, 103, 111, // fIRDH+fO6Ago\n 110,  66,  56,  88, 120,  49, 115, 102,  84,  10,  52,  80, // nB8Xx1sfT.4P\n 115,  74,  89,  71, 119,  61,  10,  45,  45,  45,  45,  45, // sJYGw=.-----\n  69,  78,  68,  32,  67,  69,  82,  84,  73,  70,  73,  67, // END CERTIFIC\n  65,  84,  69,  45,  45,  45,  45,  45,  10,  10,  78, 111, // ATE-----..No\n 116,  32,  66, 101, 102, 111, 114, 101,  58,  32,  77,  97, // t Before: Ma\n 121,  32,  50,  54,  32,  48,  48,  58,  48,  48,  58,  48, // y 26 00:00:0\n  48,  32,  50,  48,  49,  53,  32,  71,  77,  84,  10,  78, // 0 2015 GMT.N\n 111, 116,  32,  65, 102, 116, 101, 114,  32,  58,  32,  77, // ot After : M\n  97, 121,  32,  50,  54,  32,  48,  48,  58,  48,  48,  58, // ay 26 00:00:\n  48,  48,  32,  50,  48,  52,  48,  32,  71,  77,  84,  10, // 00 2040 GMT.\n  83, 117,  98, 106, 101,  99, 116,  58,  32,  67,  32,  61, // Subject: C =\n  32,  85,  83,  44,  32,  79,  32,  61,  32,  65, 109,  97, //  US, O = Ama\n 122, 111, 110,  44,  32,  67,  78,  32,  61,  32,  65, 109, // zon, CN = Am\n  97, 122, 111, 110,  32,  82, 111, 111, 116,  32,  67,  65, // azon Root CA\n  32,  51,  10,  45,  45,  45,  45,  45,  66,  69,  71,  73, //  3.-----BEGI\n  78,  32,  67,  69,  82,  84,  73,  70,  73,  67,  65,  84, // N CERTIFICAT\n  69,  45,  45,  45,  45,  45,  10,  77,  73,  73,  66, 116, // E-----.MIIBt\n 106,  67,  67,  65,  86, 117, 103,  65, 119,  73,  66,  65, // jCCAVugAwIBA\n 103,  73,  84,  66, 109, 121, 102,  49,  88,  83,  88,  78, // gITBmyf1XSXN\n 109,  89,  47,  79, 119, 117,  97,  50, 101, 105, 101, 100, // mY/Owua2eied\n 103,  80, 121,  83, 106,  65,  75,  66, 103, 103, 113, 104, // gPySjAKBggqh\n 107, 106,  79,  80,  81,  81,  68,  65, 106,  65,  53,  10, // kjOPQQDAjA5.\n  77,  81, 115, 119,  67,  81,  89,  68,  86,  81,  81,  71, // MQswCQYDVQQG\n  69, 119,  74,  86,  85, 122,  69,  80,  77,  65,  48,  71, // EwJVUzEPMA0G\n  65,  49,  85,  69,  67, 104,  77,  71,  81,  87,  49, 104, // A1UEChMGQW1h\n 101, 109,  57, 117,  77,  82, 107, 119,  70, 119,  89,  68, // em9uMRkwFwYD\n  86,  81,  81,  68,  69, 120,  66,  66,  98,  87,  70,  54, // VQQDExBBbWF6\n  98,  50,  52, 103,  10,  85, 109,  57, 118, 100,  67,  66, // b24g.Um9vdCB\n  68,  81,  83,  65, 122,  77,  66,  52,  88,  68,  84,  69, // DQSAzMB4XDTE\n  49,  77,  68,  85, 121,  78, 106,  65, 119,  77,  68,  65, // 1MDUyNjAwMDA\n 119,  77,  70, 111,  88,  68,  84,  81, 119,  77,  68,  85, // wMFoXDTQwMDU\n 121,  78, 106,  65, 119,  77,  68,  65, 119,  77,  70, 111, // yNjAwMDAwMFo\n 119,  79,  84,  69,  76,  77,  65, 107,  71,  10,  65,  49, // wOTELMAkG.A1\n  85,  69,  66, 104,  77,  67,  86,  86,  77, 120,  68, 122, // UEBhMCVVMxDz\n  65,  78,  66, 103,  78,  86,  66,  65, 111,  84,  66, 107, // ANBgNVBAoTBk\n  70, 116,  89,  88, 112, 118,  98, 106,  69,  90,  77,  66, // FtYXpvbjEZMB\n  99,  71,  65,  49,  85,  69,  65, 120,  77,  81,  81,  87, // cGA1UEAxMQQW\n  49, 104, 101, 109,  57, 117,  73,  70,  74, 118,  98,  51, // 1hem9uIFJvb3\n  81, 103,  10,  81,  48,  69, 103,  77, 122,  66,  90,  77, // Qg.Q0EgMzBZM\n  66,  77,  71,  66, 121, 113,  71,  83,  77,  52,  57,  65, // BMGByqGSM49A\n 103,  69,  71,  67,  67, 113,  71,  83,  77,  52,  57,  65, // gEGCCqGSM49A\n 119,  69,  72,  65,  48,  73,  65,  66,  67, 109,  88, 112, // wEHA0IABCmXp\n  56,  90,  66, 102,  56,  65,  78, 109,  43, 103,  66,  71, // 8ZBf8ANm+gBG\n  49,  98,  71,  56, 108,  75, 108,  10, 117, 105,  50, 121, // 1bG8lKl.ui2y\n  69, 117, 106,  83,  76, 116, 102,  54, 121,  99,  88,  89, // EujSLtf6ycXY\n 113, 109,  48, 102,  99,  52,  69,  55,  79,  53, 104, 114, // qm0fc4E7O5hr\n  79,  88, 119, 122, 112,  99,  86,  79, 104, 111,  54,  65, // OXwzpcVOho6A\n  70,  50, 104, 105,  82,  86, 100,  57,  82,  70, 103, 100, // F2hiRVd9RFgd\n 115, 122, 102, 108,  90, 119, 106, 114,  90, 116,  54, 106, // szflZwjrZt6j\n  10,  81, 106,  66,  65,  77,  65,  56,  71,  65,  49,  85, // .QjBAMA8GA1U\n 100,  69, 119,  69,  66,  47, 119,  81,  70,  77,  65,  77, // dEwEB/wQFMAM\n  66,  65, 102,  56, 119,  68, 103,  89,  68,  86,  82,  48, // BAf8wDgYDVR0\n  80,  65,  81,  72,  47,  66,  65,  81,  68,  65, 103,  71, // PAQH/BAQDAgG\n  71,  77,  66,  48,  71,  65,  49,  85, 100,  68, 103,  81, // GMB0GA1UdDgQ\n  87,  66,  66,  83, 114,  10, 116, 116, 118,  88,  66, 112, // WBBSr.ttvXBp\n  52,  51, 114,  68,  67,  71,  66,  53,  70, 119, 120,  53, // 43rDCGB5Fwx5\n 122,  69,  71,  98,  70,  52, 119,  68,  65,  75,  66, 103, // zEGbF4wDAKBg\n 103, 113, 104, 107, 106,  79,  80,  81,  81,  68,  65, 103, // gqhkjOPQQDAg\n  78,  74,  65,  68,  66,  71,  65, 105,  69,  65,  52,  73, // NJADBGAiEA4I\n  87,  83, 111, 120, 101,  51, 106, 102, 107, 114,  10,  66, // WSoxe3jfkr.B\n 113,  87,  84, 114,  66, 113,  89,  97,  71,  70, 121,  43, // qWTrBqYaGFy+\n 117,  71, 104,  48,  80, 115,  99, 101,  71,  67, 109,  81, // uGh0PsceGCmQ\n  53, 110,  70, 117,  77,  81,  67,  73,  81,  67,  99,  65, // 5nFuMQCIQCcA\n 117,  47, 120, 108,  74, 121, 122, 108, 118, 110, 114, 120, // u/xlJyzlvnrx\n 105, 114,  52, 116, 105, 122,  43,  79, 112,  65,  85,  70, // ir4tiz+OpAUF\n 116, 101,  77,  10,  89, 121,  82,  73,  72,  78,  56, 119, // teM.YyRIHN8w\n 102, 100,  86, 111,  79, 119,  61,  61,  10,  45,  45,  45, // fdVoOw==.---\n  45,  45,  69,  78,  68,  32,  67,  69,  82,  84,  73,  70, // --END CERTIF\n  73,  67,  65,  84,  69,  45,  45,  45,  45,  45,  10,  10, // ICATE-----..\n  78, 111, 116,  32,  66, 101, 102, 111, 114, 101,  58,  32, // Not Before: \n  77,  97, 121,  32,  50,  54,  32,  48,  48,  58,  48,  48, // May 26 00:00\n  58,  48,  48,  32,  50,  48,  49,  53,  32,  71,  77,  84, // :00 2015 GMT\n  10,  78, 111, 116,  32,  65, 102, 116, 101, 114,  32,  58, // .Not After :\n  32,  77,  97, 121,  32,  50,  54,  32,  48,  48,  58,  48, //  May 26 00:0\n  48,  58,  48,  48,  32,  50,  48,  52,  48,  32,  71,  77, // 0:00 2040 GM\n  84,  10,  83, 117,  98, 106, 101,  99, 116,  58,  32,  67, // T.Subject: C\n  32,  61,  32,  85,  83,  44,  32,  79,  32,  61,  32,  65, //  = US, O = A\n 109,  97, 122, 111, 110,  44,  32,  67,  78,  32,  61,  32, // mazon, CN = \n  65, 109,  97, 122, 111, 110,  32,  82, 111, 111, 116,  32, // Amazon Root \n  67,  65,  32,  52,  10,  45,  45,  45,  45,  45,  66,  69, // CA 4.-----BE\n  71,  73,  78,  32,  67,  69,  82,  84,  73,  70,  73,  67, // GIN CERTIFIC\n  65,  84,  69,  45,  45,  45,  45,  45,  10,  77,  73,  73, // ATE-----.MII\n  66,  56, 106,  67,  67,  65,  88, 105, 103,  65, 119,  73, // B8jCCAXigAwI\n  66,  65, 103,  73,  84,  66, 109, 121, 102,  49,  56,  71, // BAgITBmyf18G\n  55,  69,  69, 119, 112,  81,  43,  86, 120, 101,  51, 115, // 7EEwpQ+Vxe3s\n 115, 121,  66, 114,  66,  68, 106,  65,  75,  66, 103, 103, // syBrBDjAKBgg\n 113, 104, 107, 106,  79,  80,  81,  81,  68,  65, 122,  65, // qhkjOPQQDAzA\n  53,  10,  77,  81, 115, 119,  67,  81,  89,  68,  86,  81, // 5.MQswCQYDVQ\n  81,  71,  69, 119,  74,  86,  85, 122,  69,  80,  77,  65, // QGEwJVUzEPMA\n  48,  71,  65,  49,  85,  69,  67, 104,  77,  71,  81,  87, // 0GA1UEChMGQW\n  49, 104, 101, 109,  57, 117,  77,  82, 107, 119,  70, 119, // 1hem9uMRkwFw\n  89,  68,  86,  81,  81,  68,  69, 120,  66,  66,  98,  87, // YDVQQDExBBbW\n  70,  54,  98,  50,  52, 103,  10,  85, 109,  57, 118, 100, // F6b24g.Um9vd\n  67,  66,  68,  81,  83,  65,  48,  77,  66,  52,  88,  68, // CBDQSA0MB4XD\n  84,  69,  49,  77,  68,  85, 121,  78, 106,  65, 119,  77, // TE1MDUyNjAwM\n  68,  65, 119,  77,  70, 111,  88,  68,  84,  81, 119,  77, // DAwMFoXDTQwM\n  68,  85, 121,  78, 106,  65, 119,  77,  68,  65, 119,  77, // DUyNjAwMDAwM\n  70, 111, 119,  79,  84,  69,  76,  77,  65, 107,  71,  10, // FowOTELMAkG.\n  65,  49,  85,  69,  66, 104,  77,  67,  86,  86,  77, 120, // A1UEBhMCVVMx\n  68, 122,  65,  78,  66, 103,  78,  86,  66,  65, 111,  84, // DzANBgNVBAoT\n  66, 107,  70, 116,  89,  88, 112, 118,  98, 106,  69,  90, // BkFtYXpvbjEZ\n  77,  66,  99,  71,  65,  49,  85,  69,  65, 120,  77,  81, // MBcGA1UEAxMQ\n  81,  87,  49, 104, 101, 109,  57, 117,  73,  70,  74, 118, // QW1hem9uIFJv\n  98,  51,  81, 103,  10,  81,  48,  69, 103,  78,  68,  66, // b3Qg.Q0EgNDB\n  50,  77,  66,  65,  71,  66, 121, 113,  71,  83,  77,  52, // 2MBAGByqGSM4\n  57,  65, 103,  69,  71,  66,  83, 117,  66,  66,  65,  65, // 9AgEGBSuBBAA\n 105,  65,  50,  73,  65,  66,  78,  75, 114, 105, 106, 100, // iA2IABNKrijd\n  80, 111,  49,  77,  78,  47, 115,  71,  75, 101,  48, 117, // Po1MN/sGKe0u\n 111, 101,  48,  90,  76,  89,  55,  66, 105,  10,  57, 105, // oe0ZLY7Bi.9i\n  48,  98,  50, 119, 104, 120,  73, 100,  73,  65,  54,  71, // 0b2whxIdIA6G\n  79,  57, 109, 105, 102,  55,  56,  68, 108, 117,  88, 101, // O9mif78DluXe\n 111,  57, 112,  99, 109,  66, 113, 113,  78,  98,  73,  74, // o9pcmBqqNbIJ\n 104,  70,  88,  82,  98,  98,  47, 101, 103,  81,  98, 101, // hFXRbb/egQbe\n  79,  99,  52,  79,  79,  57,  88,  52,  82, 105,  56,  51, // Oc4OO9X4Ri83\n  66, 107,  10,  77,  54,  68,  76,  74,  67,  57, 119, 117, // Bk.M6DLJC9wu\n 111, 105, 104,  75, 113,  66,  49,  43,  73,  71, 117,  89, // oihKqB1+IGuY\n 103,  98,  69, 103, 100, 115,  53,  98, 105, 109, 119,  72, // gbEgds5bimwH\n 118, 111, 117,  88,  75,  78,  67,  77,  69,  65, 119,  68, // vouXKNCMEAwD\n 119,  89,  68,  86,  82,  48,  84,  65,  81,  72,  47,  66, // wYDVR0TAQH/B\n  65,  85, 119,  65, 119,  69,  66,  10,  47, 122,  65,  79, // AUwAwEB./zAO\n  66, 103,  78,  86,  72,  81,  56,  66,  65, 102,  56,  69, // BgNVHQ8BAf8E\n  66,  65,  77,  67,  65,  89,  89, 119,  72,  81,  89,  68, // BAMCAYYwHQYD\n  86,  82,  48,  79,  66,  66,  89,  69,  70,  78,  80, 115, // VR0OBBYEFNPs\n 120, 122, 112, 108,  98, 115, 122, 104,  50, 110,  97,  97, // xzplbszh2naa\n  86, 118, 117,  99,  56,  52,  90, 116,  86,  43,  87,  66, // Vvuc84ZtV+WB\n  10,  77,  65, 111,  71,  67,  67, 113,  71,  83,  77,  52, // .MAoGCCqGSM4\n  57,  66,  65,  77,  68,  65,  50, 103,  65,  77,  71,  85, // 9BAMDA2gAMGU\n  67,  77,  68, 113,  76,  73, 102,  71,  57, 102, 104,  71, // CMDqLIfG9fhG\n 116,  48,  79,  57,  89, 108, 105,  47,  87,  54,  53,  49, // t0O9Yli/W651\n  43, 107,  73,  48, 114, 122,  50,  90,  86, 119, 121, 122, // +kI0rz2ZVwyz\n 106,  75,  75, 108, 119,  10,  67, 107,  99,  79,  56,  68, // jKKlw.CkcO8D\n 100,  90,  69, 118,  56, 116, 109,  90,  81, 111,  84, 105, // dZEv8tmZQoTi\n 112,  80,  78,  85,  48, 122,  87, 103,  73, 120,  65,  79, // pPNU0zWgIxAO\n 112,  49,  65,  69,  52,  55, 120,  68, 113,  85,  69, 112, // p1AE47xDqUEp\n  72,  74,  87,  69,  97, 100,  73,  82,  78, 121, 112,  52, // HJWEadIRNyp4\n 105,  99, 105, 117,  82,  77,  83, 116, 117,  87,  10,  49, // iciuRMStuW.1\n  75, 121,  76,  97,  50, 116,  74,  69, 108,  77, 122, 114, // KyLa2tJElMzr\n 100, 102, 107, 118, 105,  84,  56, 116,  81, 112,  50,  49, // dfkviT8tQp21\n  75,  87,  56,  69,  65,  61,  61,  10,  45,  45,  45,  45, // KW8EA==.----\n  45,  69,  78,  68,  32,  67,  69,  82,  84,  73,  70,  73, // -END CERTIFI\n  67,  65,  84,  69,  45,  45,  45,  45,  45,  10,  10,  78, // CATE-----..N\n 111, 116,  32,  66, 101, 102, 111, 114, 101,  58,  32,  78, // ot Before: N\n 111, 118,  32,  49,  48,  32,  48,  48,  58,  48,  48,  58, // ov 10 00:00:\n  48,  48,  32,  50,  48,  48,  54,  32,  71,  77,  84,  10, // 00 2006 GMT.\n  78, 111, 116,  32,  65, 102, 116, 101, 114,  32,  58,  32, // Not After : \n  78, 111, 118,  32,  49,  48,  32,  48,  48,  58,  48,  48, // Nov 10 00:00\n  58,  48,  48,  32,  50,  48,  51,  49,  32,  71,  77,  84, // :00 2031 GMT\n  10,  83, 117,  98, 106, 101,  99, 116,  58,  32,  67,  32, // .Subject: C \n  61,  32,  85,  83,  44,  32,  79,  32,  61,  32,  68, 105, // = US, O = Di\n 103, 105,  67, 101, 114, 116,  32,  73, 110,  99,  44,  32, // giCert Inc, \n  79,  85,  32,  61,  32, 119, 119, 119,  46, 100, 105, 103, // OU = www.dig\n 105,  99, 101, 114, 116,  46,  99, 111, 109,  44,  32,  67, // icert.com, C\n  78,  32,  61,  32,  68, 105, 103, 105,  67, 101, 114, 116, // N = DigiCert\n  32,  71, 108, 111,  98,  97, 108,  32,  82, 111, 111, 116, //  Global Root\n  32,  67,  65,  10,  45,  45,  45,  45,  45,  66,  69,  71, //  CA.-----BEG\n  73,  78,  32,  67,  69,  82,  84,  73,  70,  73,  67,  65, // IN CERTIFICA\n  84,  69,  45,  45,  45,  45,  45,  10,  77,  73,  73,  68, // TE-----.MIID\n 114, 122,  67,  67,  65, 112, 101, 103,  65, 119,  73,  66, // rzCCApegAwIB\n  65, 103,  73,  81,  67,  68, 118, 103,  86, 112,  66,  67, // AgIQCDvgVpBC\n  82, 114,  71, 104, 100,  87, 114,  74,  87,  90,  72,  72, // RrGhdWrJWZHH\n  83, 106,  65,  78,  66, 103, 107, 113, 104, 107, 105,  71, // SjANBgkqhkiG\n  57, 119,  48,  66,  65,  81,  85,  70,  65,  68,  66, 104, // 9w0BAQUFADBh\n  10,  77,  81, 115, 119,  67,  81,  89,  68,  86,  81,  81, // .MQswCQYDVQQ\n  71,  69, 119,  74,  86,  85, 122,  69,  86,  77,  66,  77, // GEwJVUzEVMBM\n  71,  65,  49,  85,  69,  67, 104,  77,  77,  82,  71, 108, // GA1UEChMMRGl\n 110,  97,  85,  78, 108,  99, 110,  81, 103,  83,  87,  53, // naUNlcnQgSW5\n 106,  77,  82, 107, 119,  70, 119,  89,  68,  86,  81,  81, // jMRkwFwYDVQQ\n  76,  69, 120,  66,  51,  10, 100,  51,  99, 117,  90,  71, // LExB3.d3cuZG\n 108, 110,  97,  87,  78, 108,  99, 110,  81, 117,  89,  50, // lnaWNlcnQuY2\n  57, 116,  77,  83,  65, 119,  72, 103,  89,  68,  86,  81, // 9tMSAwHgYDVQ\n  81,  68,  69, 120, 100,  69,  97,  87, 100, 112,  81,  50, // QDExdEaWdpQ2\n  86, 121, 100,  67,  66,  72,  98,  71,  57, 105,  89,  87, // VydCBHbG9iYW\n 119, 103,  85, 109,  57, 118, 100,  67,  66,  68,  10,  81, // wgUm9vdCBD.Q\n  84,  65, 101,  70, 119,  48, 119,  78, 106,  69, 120,  77, // TAeFw0wNjExM\n  84,  65, 119,  77,  68,  65, 119,  77,  68,  66,  97,  70, // TAwMDAwMDBaF\n 119,  48, 122,  77,  84,  69, 120,  77,  84,  65, 119,  77, // w0zMTExMTAwM\n  68,  65, 119,  77,  68,  66,  97,  77,  71,  69, 120,  67, // DAwMDBaMGExC\n 122,  65,  74,  66, 103,  78,  86,  66,  65,  89,  84,  65, // zAJBgNVBAYTA\n 108,  86,  84,  10,  77,  82,  85, 119,  69, 119,  89,  68, // lVT.MRUwEwYD\n  86,  81,  81,  75,  69, 119, 120,  69,  97,  87, 100, 112, // VQQKEwxEaWdp\n  81,  50,  86, 121, 100,  67,  66,  74,  98, 109,  77, 120, // Q2VydCBJbmMx\n  71,  84,  65,  88,  66, 103,  78,  86,  66,  65, 115,  84, // GTAXBgNVBAsT\n  69,  72, 100,  51, 100, 121,  53, 107,  97,  87, 100, 112, // EHd3dy5kaWdp\n  89,  50,  86, 121, 100,  67,  53, 106,  10,  98,  50,  48, // Y2VydC5j.b20\n 120,  73,  68,  65, 101,  66, 103,  78,  86,  66,  65,  77, // xIDAeBgNVBAM\n  84,  70,  48,  82, 112,  90,  50, 108,  68,  90,  88,  74, // TF0RpZ2lDZXJ\n  48,  73,  69, 100, 115,  98,  50,  74, 104,  98,  67,  66, // 0IEdsb2JhbCB\n  83,  98,  50,  57,  48,  73,  69,  78,  66,  77,  73,  73, // Sb290IENBMII\n  66,  73, 106,  65,  78,  66, 103, 107, 113, 104, 107, 105, // BIjANBgkqhki\n  71,  10,  57, 119,  48,  66,  65,  81,  69,  70,  65,  65, // G.9w0BAQEFAA\n  79,  67,  65,  81,  56,  65,  77,  73,  73,  66,  67, 103, // OCAQ8AMIIBCg\n  75,  67,  65,  81,  69,  65,  52, 106, 118, 104,  69,  88, // KCAQEA4jvhEX\n  76, 101, 113,  75,  84,  84, 111,  49, 101, 113,  85,  75, // LeqKTTo1eqUK\n  75,  80,  67,  51, 101,  81, 121,  97,  75, 108,  55, 104, // KPC3eQyaKl7h\n  76,  79, 108, 108, 115,  66,  10,  67,  83,  68,  77,  65, // LOllsB.CSDMA\n  90,  79, 110,  84, 106,  67,  51,  85,  47, 100,  68, 120, // ZOnTjC3U/dDx\n  71, 107,  65,  86,  53,  51, 105, 106,  83,  76, 100, 104, // GkAV53ijSLdh\n 119,  90,  65,  65,  73,  69,  74, 122, 115,  52,  98, 103, // wZAAIEJzs4bg\n  55,  47, 102, 122,  84, 116, 120,  82, 117,  76,  87,  90, // 7/fzTtxRuLWZ\n 115,  99,  70, 115,  51,  89, 110,  70, 111,  57,  55,  10, // scFs3YnFo97.\n 110, 104,  54,  86, 102, 101,  54,  51,  83,  75,  77,  73, // nh6Vfe63SKMI\n  50, 116,  97, 118, 101, 103, 119,  53,  66, 109,  86,  47, // 2tavegw5BmV/\n  83, 108,  48, 102, 118,  66, 102,  52, 113,  55,  55, 117, // Sl0fvBf4q77u\n  75,  78, 100,  48, 102,  51, 112,  52, 109,  86, 109,  70, // KNd0f3p4mVmF\n  97,  71,  53,  99,  73, 122,  74,  76, 118,  48,  55,  65, // aG5cIzJLv07A\n  54,  70, 112, 116,  10,  52,  51,  67,  47, 100, 120,  67, // 6Fpt.43C/dxC\n  47,  47,  65,  72,  50, 104, 100, 109, 111,  82,  66,  66, // //AH2hdmoRBB\n  89,  77, 113, 108,  49,  71,  78,  88,  82, 111, 114,  53, // YMql1GNXRor5\n  72,  52, 105, 100, 113,  57,  74, 111, 122,  43,  69, 107, // H4idq9Joz+Ek\n  73,  89,  73, 118,  85,  88,  55,  81,  54, 104,  76,  43, // IYIvUX7Q6hL+\n 104, 113, 107, 112,  77, 102,  84,  55,  80,  10,  84,  49, // hqkpMfT7P.T1\n  57, 115, 100, 108,  54, 103,  83, 122, 101,  82, 110, 116, // 9sdl6gSzeRnt\n 119, 105,  53, 109,  51,  79,  70,  66, 113,  79,  97, 115, // wi5m3OFBqOas\n 118,  43, 122,  98,  77,  85,  90,  66, 102,  72,  87, 121, // v+zbMUZBfHWy\n 109, 101,  77, 114,  47, 121,  55, 118, 114,  84,  67,  48, // meMr/y7vrTC0\n  76,  85, 113,  55, 100,  66,  77, 116, 111,  77,  49,  79, // LUq7dBMtoM1O\n  47,  52,  10, 103, 100,  87,  55, 106,  86, 103,  47, 116, // /4.gdW7jVg/t\n  82, 118, 111,  83,  83, 105, 105,  99,  78, 111, 120,  66, // RvoSSiicNoxB\n  78,  51,  51, 115, 104,  98, 121,  84,  65, 112,  79,  66, // N33shbyTApOB\n  54, 106, 116,  83, 106,  49, 101, 116,  88,  43, 106, 107, // 6jtSj1etX+jk\n  77,  79, 118,  74, 119,  73,  68,  65,  81,  65,  66, 111, // MOvJwIDAQABo\n  50,  77, 119,  89,  84,  65,  79,  10,  66, 103,  78,  86, // 2MwYTAO.BgNV\n  72,  81,  56,  66,  65, 102,  56,  69,  66,  65,  77,  67, // HQ8BAf8EBAMC\n  65,  89,  89, 119,  68, 119,  89,  68,  86,  82,  48,  84, // AYYwDwYDVR0T\n  65,  81,  72,  47,  66,  65,  85, 119,  65, 119,  69,  66, // AQH/BAUwAwEB\n  47, 122,  65, 100,  66, 103,  78,  86,  72,  81,  52,  69, // /zAdBgNVHQ4E\n  70, 103,  81,  85,  65,  57,  53,  81,  78,  86,  98,  82, // FgQUA95QNVbR\n  10,  84,  76, 116, 109,  56,  75,  80, 105,  71, 120, 118, // .TLtm8KPiGxv\n  68, 108,  55,  73,  57,  48,  86,  85, 119,  72, 119,  89, // Dl7I90VUwHwY\n  68,  86,  82,  48, 106,  66,  66, 103, 119,  70, 111,  65, // DVR0jBBgwFoA\n  85,  65,  57,  53,  81,  78,  86,  98,  82,  84,  76, 116, // UA95QNVbRTLt\n 109,  56,  75,  80, 105,  71, 120, 118,  68, 108,  55,  73, // m8KPiGxvDl7I\n  57,  48,  86,  85, 119,  10,  68,  81,  89,  74,  75, 111, // 90VUw.DQYJKo\n  90,  73, 104, 118,  99,  78,  65,  81,  69,  70,  66,  81, // ZIhvcNAQEFBQ\n  65,  68, 103, 103,  69,  66,  65,  77, 117,  99,  78,  54, // ADggEBAMucN6\n 112,  73,  69, 120,  73,  75,  43, 116,  49,  69, 110,  69, // pIExIK+t1EnE\n  57,  83, 115,  80,  84, 102, 114, 103,  84,  49, 101,  88, // 9SsPTfrgT1eX\n 107,  73, 111, 121,  81,  89,  47,  69, 115, 114,  10, 104, // kIoyQY/Esr.h\n  77,  65, 116, 117, 100,  88,  72,  47, 118,  84,  66,  72, // MAtudXH/vTBH\n  49, 106,  76, 117,  71,  50,  99, 101, 110,  84, 110, 109, // 1jLuG2cenTnm\n  67, 109, 114,  69,  98,  88, 106,  99,  75,  67, 104, 122, // CmrEbXjcKChz\n  85, 121,  73, 109,  90,  79,  77, 107,  88,  68, 105, 113, // UyImZOMkXDiq\n 119,  56,  99, 118, 112,  79, 112,  47,  50,  80,  86,  53, // w8cvpOp/2PV5\n  65, 100, 103,  10,  48,  54,  79,  47, 110,  86, 115,  74, // Adg.06O/nVsJ\n  56, 100,  87,  79,  52,  49,  80,  48, 106, 109,  80,  54, // 8dWO41P0jmP6\n  80,  54, 102,  98, 116,  71,  98, 102,  89, 109,  98,  87, // P6fbtGbfYmbW\n  48,  87,  53,  66, 106, 102,  73, 116, 116, 101, 112,  51, // 0W5BjfIttep3\n  83, 112,  43, 100,  87,  79,  73, 114,  87,  99,  66,  65, // Sp+dWOIrWcBA\n  73,  43,  48, 116,  75,  73,  74,  70,  10,  80, 110, 108, // I+0tKIJF.Pnl\n  85, 107, 105,  97,  89,  52,  73,  66,  73, 113,  68, 102, // UkiaY4IBIqDf\n 118,  56,  78,  90,  53,  89,  66,  98, 101, 114,  79, 103, // v8NZ5YBberOg\n  79, 122,  87,  54, 115,  82,  66,  99,  52,  76,  48, 110, // OzW6sRBc4L0n\n  97,  52,  85,  85,  43,  75, 114, 107,  50,  85,  56,  56, // a4UU+Krk2U88\n  54,  85,  65,  98,  51,  76, 117, 106,  69,  86,  48, 108, // 6UAb3LujEV0l\n 115,  10,  89,  83,  69,  89,  49,  81,  83, 116, 101,  68, // s.YSEY1QSteD\n 119, 115,  79, 111,  66, 114, 112,  43, 117, 118,  70,  82, // wsOoBrp+uvFR\n  84, 112,  50,  73, 110,  66, 117,  84, 104, 115,  52, 112, // Tp2InBuThs4p\n  70, 115, 105, 118,  57, 107, 117,  88,  99, 108,  86, 122, // Fsiv9kuXclVz\n  68,  65,  71, 121,  83, 106,  52, 100, 122, 112,  51,  48, // DAGySj4dzp30\n 100,  56, 116,  98,  81, 107,  10,  67,  65,  85, 119,  55, // d8tbQk.CAUw7\n  67,  50,  57,  67,  55,  57,  70, 118,  49,  67,  53, 113, // C29C79Fv1C5q\n 102,  80, 114, 109,  65,  69,  83, 114,  99, 105,  73, 120, // fPrmAESrciIx\n 112, 103,  48,  88,  52,  48,  75,  80,  77,  98, 112,  49, // pg0X40KPMbp1\n  90,  87,  86,  98, 100,  52,  61,  10,  45,  45,  45,  45, // ZWVbd4=.----\n  45,  69,  78,  68,  32,  67,  69,  82,  84,  73,  70,  73, // -END CERTIFI\n  67,  65,  84,  69,  45,  45,  45,  45,  45,  10,  10,  78, // CATE-----..N\n 111, 116,  32,  66, 101, 102, 111, 114, 101,  58,  32,  78, // ot Before: N\n 111, 118,  32,  49,  51,  32,  48,  48,  58,  48,  48,  58, // ov 13 00:00:\n  48,  48,  32,  50,  48,  49,  50,  32,  71,  77,  84,  10, // 00 2012 GMT.\n  78, 111, 116,  32,  65, 102, 116, 101, 114,  32,  58,  32, // Not After : \n  74,  97, 110,  32,  49,  57,  32,  48,  51,  58,  49,  52, // Jan 19 03:14\n  58,  48,  55,  32,  50,  48,  51,  56,  32,  71,  77,  84, // :07 2038 GMT\n  10,  83, 117,  98, 106, 101,  99, 116,  58,  32,  79,  85, // .Subject: OU\n  32,  61,  32,  71, 108, 111,  98,  97, 108,  83, 105, 103, //  = GlobalSig\n 110,  32,  69,  67,  67,  32,  82, 111, 111, 116,  32,  67, // n ECC Root C\n  65,  32,  45,  32,  82,  52,  44,  32,  79,  32,  61,  32, // A - R4, O = \n  71, 108, 111,  98,  97, 108,  83, 105, 103, 110,  44,  32, // GlobalSign, \n  67,  78,  32,  61,  32,  71, 108, 111,  98,  97, 108,  83, // CN = GlobalS\n 105, 103, 110,  10,  45,  45,  45,  45,  45,  66,  69,  71, // ign.-----BEG\n  73,  78,  32,  67,  69,  82,  84,  73,  70,  73,  67,  65, // IN CERTIFICA\n  84,  69,  45,  45,  45,  45,  45,  10,  77,  73,  73,  66, // TE-----.MIIB\n  52,  84,  67,  67,  65,  89, 101, 103,  65, 119,  73,  66, // 4TCCAYegAwIB\n  65, 103,  73,  82,  75, 106, 105, 107,  72,  74,  89,  75, // AgIRKjikHJYK\n  66,  78,  53,  67, 115, 105, 105, 108,  67,  43, 103,  48, // BN5CsiilC+g0\n 109,  65,  73, 119,  67, 103,  89,  73,  75, 111,  90,  73, // mAIwCgYIKoZI\n 122, 106,  48,  69,  65, 119,  73, 119,  85,  68,  69, 107, // zj0EAwIwUDEk\n  10,  77,  67,  73,  71,  65,  49,  85,  69,  67, 120,  77, // .MCIGA1UECxM\n  98,  82,  50, 120, 118,  89, 109,  70, 115,  85,  50, 108, // bR2xvYmFsU2l\n 110,  98, 105,  66,  70,  81,  48,  77, 103,  85, 109,  57, // nbiBFQ0MgUm9\n 118, 100,  67,  66,  68,  81,  83,  65, 116,  73,  70,  73, // vdCBDQSAtIFI\n  48,  77,  82,  77, 119,  69,  81,  89,  68,  86,  81,  81, // 0MRMwEQYDVQQ\n  75,  69, 119, 112,  72,  10,  98,  71,  57, 105,  89,  87, // KEwpH.bG9iYW\n 120,  84,  97,  87, 100, 117,  77,  82,  77, 119,  69,  81, // xTaWduMRMwEQ\n  89,  68,  86,  81,  81,  68,  69, 119, 112,  72,  98,  71, // YDVQQDEwpHbG\n  57, 105,  89,  87, 120,  84,  97,  87, 100, 117,  77,  66, // 9iYWxTaWduMB\n  52,  88,  68,  84,  69, 121,  77,  84,  69, 120,  77, 122, // 4XDTEyMTExMz\n  65, 119,  77,  68,  65, 119,  77,  70, 111,  88,  10,  68, // AwMDAwMFoX.D\n  84,  77,  52,  77,  68,  69, 120,  79,  84,  65, 122,  77, // TM4MDExOTAzM\n  84,  81, 119,  78,  49, 111, 119,  85,  68,  69, 107,  77, // TQwN1owUDEkM\n  67,  73,  71,  65,  49,  85,  69,  67, 120,  77,  98,  82, // CIGA1UECxMbR\n  50, 120, 118,  89, 109,  70, 115,  85,  50, 108, 110,  98, // 2xvYmFsU2lnb\n 105,  66,  70,  81,  48,  77, 103,  85, 109,  57, 118, 100, // iBFQ0MgUm9vd\n  67,  66,  68,  10,  81,  83,  65, 116,  73,  70,  73,  48, // CBD.QSAtIFI0\n  77,  82,  77, 119,  69,  81,  89,  68,  86,  81,  81,  75, // MRMwEQYDVQQK\n  69, 119, 112,  72,  98,  71,  57, 105,  89,  87, 120,  84, // EwpHbG9iYWxT\n  97,  87, 100, 117,  77,  82,  77, 119,  69,  81,  89,  68, // aWduMRMwEQYD\n  86,  81,  81,  68,  69, 119, 112,  72,  98,  71,  57, 105, // VQQDEwpHbG9i\n  89,  87, 120,  84,  97,  87, 100, 117,  10,  77,  70, 107, // YWxTaWdu.MFk\n 119,  69, 119,  89,  72,  75, 111,  90,  73, 122, 106,  48, // wEwYHKoZIzj0\n  67,  65,  81,  89,  73,  75, 111,  90,  73, 122, 106,  48, // CAQYIKoZIzj0\n  68,  65,  81,  99,  68,  81, 103,  65,  69, 117,  77,  90, // DAQcDQgAEuMZ\n  53,  48,  52,  57, 115,  74,  81,  54, 102,  76, 106, 107, // 5049sJQ6fLjk\n  90,  72,  65,  79, 107, 114, 112, 114, 108,  79,  81,  99, // ZHAOkrprlOQc\n  74,  10,  70, 115, 112, 106, 115,  98, 109,  71,  43,  73, // J.FspjsbmG+I\n 112,  88, 119,  86, 102,  79,  81, 118, 112, 122, 111, 102, // pXwVfOQvpzof\n 100, 108,  81, 118,  56, 101, 119,  81,  67, 121,  98, 110, // dlQv8ewQCybn\n  77,  79,  47,  56,  99, 104,  53,  82, 105, 107, 113, 116, // MO/8ch5Rikqt\n 108, 120,  80,  54, 106,  85, 117,  99,  54,  77,  72,  97, // lxP6jUuc6MHa\n  78,  67,  77,  69,  65, 119,  10,  68, 103,  89,  68,  86, // NCMEAw.DgYDV\n  82,  48,  80,  65,  81,  72,  47,  66,  65,  81,  68,  65, // R0PAQH/BAQDA\n 103,  69,  71,  77,  65,  56,  71,  65,  49,  85, 100,  69, // gEGMA8GA1UdE\n 119,  69,  66,  47, 119,  81,  70,  77,  65,  77,  66,  65, // wEB/wQFMAMBA\n 102,  56, 119,  72,  81,  89,  68,  86,  82,  48,  79,  66, // f8wHQYDVR0OB\n  66,  89,  69,  70,  70,  83, 119, 101,  54,  49,  70,  10, // BYEFFSwe61F.\n 117,  79,  74,  65, 102,  47, 115,  75,  98, 118, 117,  43, // uOJAf/sKbvu+\n  77,  56, 107,  56, 111,  52,  84,  86,  77,  65, 111,  71, // M8k8o4TVMAoG\n  67,  67, 113,  71,  83,  77,  52,  57,  66,  65,  77,  67, // CCqGSM49BAMC\n  65,  48, 103,  65,  77,  69,  85,  67,  73,  81,  68,  99, // A0gAMEUCIQDc\n 107, 113,  71, 103,  69,  54,  98,  80,  65,  55,  68, 109, // kqGgE6bPA7Dm\n 120,  67,  71,  88,  10, 107,  80, 111,  85,  86, 121,  48, // xCGX.kPoUVy0\n  68,  55,  79,  52,  56,  48,  50,  55,  75, 113,  71, 120, // D7O48027KqGx\n  50, 118,  75,  76, 101, 117, 119,  73, 103,  74,  54, 105, // 2vKLeuwIgJ6i\n  70,  74, 122,  87,  98,  86, 115,  97, 106,  56, 107, 102, // FJzWbVsaj8kf\n  83, 116,  50,  52,  98,  65, 103,  65,  88, 113, 109, 101, // St24bAgAXqme\n 109,  70,  90,  72, 101,  43, 112,  84, 115,  10, 101, 119, // mFZHe+pTs.ew\n 118,  52, 110,  52,  81,  61,  10,  45,  45,  45,  45,  45, // v4n4Q=.-----\n  69,  78,  68,  32,  67,  69,  82,  84,  73,  70,  73,  67, // END CERTIFIC\n  65,  84,  69,  45,  45,  45,  45,  45,  10,  10,  78, 111, // ATE-----..No\n 116,  32,  66, 101, 102, 111, 114, 101,  58,  32,  78, 111, // t Before: No\n 118,  32,  32,  49,  32,  48,  48,  58,  48,  48,  58,  52, // v  1 00:00:4\n  50,  32,  50,  48,  49,  56,  32,  71,  77,  84,  10,  78, // 2 2018 GMT.N\n 111, 116,  32,  65, 102, 116, 101, 114,  32,  58,  32,  78, // ot After : N\n 111, 118,  32,  32,  49,  32,  48,  48,  58,  48,  48,  58, // ov  1 00:00:\n  52,  50,  32,  50,  48,  52,  50,  32,  71,  77,  84,  10, // 42 2042 GMT.\n  83, 117,  98, 106, 101,  99, 116,  58,  32,  67,  32,  61, // Subject: C =\n  32,  85,  83,  44,  32,  79,  32,  61,  32,  71, 111, 111, //  US, O = Goo\n 103, 108, 101,  32,  84, 114, 117, 115, 116,  32,  83, 101, // gle Trust Se\n 114, 118, 105,  99, 101, 115,  32,  76,  76,  67,  44,  32, // rvices LLC, \n  67,  78,  32,  61,  32,  71,  84,  83,  32,  76,  84,  83, // CN = GTS LTS\n  82,  10,  45,  45,  45,  45,  45,  66,  69,  71,  73,  78, // R.-----BEGIN\n  32,  67,  69,  82,  84,  73,  70,  73,  67,  65,  84,  69, //  CERTIFICATE\n  45,  45,  45,  45,  45,  10,  77,  73,  73,  66, 120,  84, // -----.MIIBxT\n  67,  67,  65,  87, 117, 103,  65, 119,  73,  66,  65, 103, // CCAWugAwIBAg\n  73,  78,  65, 102,  68,  51, 110,  86, 110, 100,  98, 108, // INAfD3nVndbl\n  68,  51,  81, 110,  78, 120,  85,  68,  65,  75,  66, 103, // D3QnNxUDAKBg\n 103, 113, 104, 107, 106,  79,  80,  81,  81,  68,  65, 106, // gqhkjOPQQDAj\n  66,  69,  77,  81, 115, 119,  67,  81,  89,  68,  10,  86, // BEMQswCQYD.V\n  81,  81,  71,  69, 119,  74,  86,  85, 122,  69, 105,  77, // QQGEwJVUzEiM\n  67,  65,  71,  65,  49,  85,  69,  67, 104,  77,  90,  82, // CAGA1UEChMZR\n  50,  57, 118,  90,  50, 120, 108,  73,  70,  82, 121, 100, // 29vZ2xlIFRyd\n  88,  78,  48,  73,  70,  78, 108,  99, 110,  90, 112,  89, // XN0IFNlcnZpY\n  50,  86, 122,  73,  69, 120,  77,  81, 122,  69,  82,  77, // 2VzIExMQzERM\n  65,  56,  71,  10,  65,  49,  85,  69,  65, 120,  77,  73, // A8G.A1UEAxMI\n  82,  49,  82,  84,  73,  69, 120,  85,  85,  49,  73, 119, // R1RTIExUU1Iw\n  72, 104,  99,  78,  77,  84, 103, 120,  77,  84,  65, 120, // HhcNMTgxMTAx\n  77,  68,  65, 119,  77,  68,  81, 121,  87, 104,  99,  78, // MDAwMDQyWhcN\n  78,  68,  73, 120,  77,  84,  65, 120,  77,  68,  65, 119, // NDIxMTAxMDAw\n  77,  68,  81, 121,  87, 106,  66,  69,  10,  77,  81, 115, // MDQyWjBE.MQs\n 119,  67,  81,  89,  68,  86,  81,  81,  71,  69, 119,  74, // wCQYDVQQGEwJ\n  86,  85, 122,  69, 105,  77,  67,  65,  71,  65,  49,  85, // VUzEiMCAGA1U\n  69,  67, 104,  77,  90,  82,  50,  57, 118,  90,  50, 120, // EChMZR29vZ2x\n 108,  73,  70,  82, 121, 100,  88,  78,  48,  73,  70,  78, // lIFRydXN0IFN\n 108,  99, 110,  90, 112,  89,  50,  86, 122,  73,  69, 120, // lcnZpY2VzIEx\n  77,  10,  81, 122,  69,  82,  77,  65,  56,  71,  65,  49, // M.QzERMA8GA1\n  85,  69,  65, 120,  77,  73,  82,  49,  82,  84,  73,  69, // UEAxMIR1RTIE\n 120,  85,  85,  49,  73, 119,  87,  84,  65,  84,  66, 103, // xUU1IwWTATBg\n  99, 113, 104, 107, 106,  79,  80,  81,  73,  66,  66, 103, // cqhkjOPQIBBg\n 103, 113, 104, 107, 106,  79,  80,  81,  77,  66,  66, 119, // gqhkjOPQMBBw\n  78,  67,  65,  65,  84,  78,  10,  56,  89, 121,  79,  50, // NCAATN.8YyO2\n 117,  43, 121,  67,  81, 111,  90, 100, 119,  65, 107,  85, // u+yCQoZdwAkU\n  78, 118,  53,  99,  51, 100, 111, 107, 102,  85,  76, 102, // Nv5c3dokfULf\n 114,  65,  54,  81,  74, 103,  70,  86,  50,  88,  77, 117, // rA6QJgFV2XMu\n  69,  78, 116,  81,  90,  73,  71,  53,  72,  85,  79,  83, // ENtQZIG5HUOS\n  54, 106,  70, 110,  56, 102,  48, 121,  83, 108,  86,  10, // 6jFn8f0ySlV.\n 101,  79,  82,  67, 120, 113,  70, 121, 106,  68,  74, 121, // eORCxqFyjDJy\n  82, 110,  56,  54, 100,  43,  73, 107, 111,  48,  73, 119, // Rn86d+Iko0Iw\n  81,  68,  65,  79,  66, 103,  78,  86,  72,  81,  56,  66, // QDAOBgNVHQ8B\n  65, 102,  56,  69,  66,  65,  77,  67,  65,  89,  89, 119, // Af8EBAMCAYYw\n  68, 119,  89,  68,  86,  82,  48,  84,  65,  81,  72,  47, // DwYDVR0TAQH/\n  66,  65,  85, 119,  10,  65, 119,  69,  66,  47, 122,  65, // BAUw.AwEB/zA\n 100,  66, 103,  78,  86,  72,  81,  52,  69,  70, 103,  81, // dBgNVHQ4EFgQ\n  85,  80, 118,  55,  47, 122,  70,  76, 114, 118, 122,  81, // UPv7/zFLrvzQ\n  43,  80, 102,  78,  65,  48,  79,  81, 108, 115,  86,  43, // +PfNA0OQlsV+\n  52, 117,  49,  73, 119,  67, 103,  89,  73,  75, 111,  90, // 4u1IwCgYIKoZ\n  73, 122, 106,  48,  69,  65, 119,  73,  68,  10,  83,  65, // Izj0EAwID.SA\n  65, 119,  82,  81,  73, 104,  65,  80,  75, 117, 102,  47, // AwRQIhAPKuf/\n  86, 116,  66,  72, 113,  71, 119,  51,  84,  85, 119,  85, // VtBHqGw3TUwU\n  73, 113,  55,  84, 102,  97,  69, 120, 112,  51,  98,  72, // Iq7TfaExp3bH\n  55,  98, 106,  67,  66, 109,  86,  88,  74, 117, 112,  84, // 7bjCBmVXJupT\n  57,  70,  65, 105,  66, 114,  48,  83, 109,  67, 116, 115, // 9FAiBr0SmCts\n 117, 107,  10, 109, 105,  71, 103, 112,  97, 106, 106, 102, // uk.miGgpajjf\n  47, 103,  70, 105, 103,  71,  77,  51,  52,  70,  57,  48, // /gFigGM34F90\n  50,  49,  98,  67,  87, 115,  49,  77,  98,  76,  48,  83, // 21bCWs1MbL0S\n  65,  61,  61,  10,  45,  45,  45,  45,  45,  69,  78,  68, // A==.-----END\n  32,  67,  69,  82,  84,  73,  70,  73,  67,  65,  84,  69, //  CERTIFICATE\n  45,  45,  45,  45,  45,  10,  10, 0 // -----..\n};\n\nstatic const struct packed_file {\n  const char *name;\n  const unsigned char *data;\n  size_t size;\n  time_t mtime;\n} packed_files[] = {\n  {\"/certs/ca.pem\", v1, sizeof(v1), 1739200860},\n  {NULL, NULL, 0, 0}\n};\n\nstatic int scmp(const char *a, const char *b) {\n  while (*a && (*a == *b)) a++, b++;\n  return *(const unsigned char *) a - *(const unsigned char *) b;\n}\nconst char *mg_unlist(size_t no) {\n  return packed_files[no].name;\n}\nconst char *mg_unpack(const char *name, size_t *size, time_t *mtime) {\n  const struct packed_file *p;\n  for (p = packed_files; p->name != NULL; p++) {\n    if (scmp(p->name, name) != 0) continue;\n    if (size != NULL) *size = p->size - 1;\n    if (mtime != NULL) *mtime = p->mtime;\n    return (const char *) p->data;\n  }\n  return NULL;\n}\n"
  },
  {
    "path": "tutorials/http/http-proxy-client/Makefile",
    "content": "PROG ?= example                   # Program we are building\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c  packed_fs.c      # Source code files, packed_fs.c contains ca.pem, which contains CA certs for TLS\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += -DMG_ENABLE_LINES=1 -DMG_ENABLE_PACKED_FS=1\n\n# See tutorial at https://mongoose.ws/tutorials/http-proxy-client/\nARGS ?= 167.235.63.238:3128 http://info.cern.ch/\t# default call arguments\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= example.exe           # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\n  MAKE += WINDOWS=1 CC=$(CC)\nendif\n\nall: $(PROG)              # Default target. Build and run program\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)       # Build program from sources\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nclean:                    # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM mbedtls\n\n# see https://mongoose.ws/tutorials/tls/#how-to-build for TLS build options\n\nmbedtls:                  # Pull and build mbedTLS library\n\tgit clone --depth 1 -b v2.28.2 https://github.com/mbed-tls/mbedtls $@\n\t$(MAKE) -C mbedtls/library\n"
  },
  {
    "path": "tutorials/http/http-proxy-client/README.md",
    "content": "See detailed tutorial at https://mongoose.ws/tutorials/http/http-proxy-client/ \n"
  },
  {
    "path": "tutorials/http/http-proxy-client/main.c",
    "content": "// Copyright (c) 2020 Cesanta Software Limited\n// All rights reserved\n//\n// Example HTTP client that uses a proxy server. Usage:\n//    make\n//    ./example PROXY:PORT http://www.ladyada.net\n//\n// To enable SSL/TLS, see https://mongoose.ws/tutorials/tls/#how-to-build\n//\n#include \"mongoose.h\"\n\n// Print HTTP response and signal that we're done\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  const char *url = c->fn_data;\n  static bool connected;\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    printf(\"%.*s\", (int) hm->message.len, hm->message.buf);\n    exit(EXIT_SUCCESS);\n  } else if (ev == MG_EV_CONNECT) {\n    // Proxy TCP connection established. Send CONNECT request\n    struct mg_str host = mg_url_host(url);\n\n    if (c->is_tls) {\n      struct mg_tls_opts opts = {.ca = mg_unpacked(\"/certs/ca.pem\"),\n                                 .name = host};\n      mg_tls_init(c, &opts);\n    }\n\n    // c->is_hexdumping = 1;\n    mg_printf(c, \"CONNECT %.*s:%hu HTTP/1.1\\r\\nHost: %.*s:%hu\\r\\n\\r\\n\",\n              (int) host.len, host.buf, mg_url_port(url), (int) host.len,\n              host.buf, mg_url_port(url));\n  } else if (!connected && ev == MG_EV_READ) {\n    struct mg_http_message hm;\n    int n = mg_http_parse((char *) c->recv.buf, c->recv.len, &hm);\n    if (n > 0) {\n      struct mg_str host = mg_url_host(url);\n      // CONNECT response - tunnel is established\n      connected = true;\n      MG_DEBUG(\n          (\"Connected to proxy, status: %.*s\", (int) hm.uri.len, hm.uri.buf));\n      mg_iobuf_del(&c->recv, 0, n);\n      // Send request to the target server\n      mg_printf(c,\n                \"GET %s HTTP/1.0\\r\\n\"\n                \"Host: %.*s\\r\\n\"\n                \"\\r\\n\",\n                mg_url_uri(url), (int) host.len, host.buf);\n    }\n  }\n}\n\nint main(int argc, char *argv[]) {\n  struct mg_mgr mgr;\n\n  if (argc != 3) {\n    fprintf(stderr, \"Usage: %s PROXY_URL URL\\n\", argv[0]);\n    return EXIT_FAILURE;\n  }\n\n  mg_mgr_init(&mgr);                            // Initialise event manager\n  mg_http_connect(&mgr, argv[1], fn, argv[2]);  // Connect to the proxy\n  for (;;) mg_mgr_poll(&mgr, 1000);             // Event loop\n  mg_mgr_free(&mgr);\n\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/http/http-restful-server/Makefile",
    "content": "PROG ?= example                   # Program we are building\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c       # Source code files\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += -DMG_ENABLE_LINES=1\nCFLAGS_EXTRA ?= -DMG_TLS=MG_TLS_BUILTIN\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= example.exe           # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\nendif\n\nall: $(PROG)\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES) Makefile\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nclean:\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM\n"
  },
  {
    "path": "tutorials/http/http-restful-server/README.md",
    "content": "See detailed tutorial at https://mongoose.ws/tutorials/http/http-server/\n"
  },
  {
    "path": "tutorials/http/http-restful-server/main.c",
    "content": "// Copyright (c) 2020 Cesanta Software Limited\n// All rights reserved\n//\n// HTTP server example. This server serves both static and dynamic content.\n// It opens two ports: plain HTTP on port 8000 and HTTP on port 8443.\n// It implements the following endpoints:\n//    /api/stats - respond with free-formatted stats on current connections\n//    /api/f2/:id - wildcard example, respond with JSON string {\"result\": \"URI\"}\n//    any other URI serves static files from s_root_dir\n//\n// To enable SSL/TLS (using self-signed certificates in PEM files),\n//    1. See https://mongoose.ws/tutorials/tls/#how-to-build\n//    2. curl -k https://127.0.0.1:8443\n\n#include \"mongoose.h\"\n\nstatic const char *s_http_addr = \"http://0.0.0.0:8000\";    // HTTP port\nstatic const char *s_https_addr = \"https://0.0.0.0:8443\";  // HTTPS port\nstatic const char *s_root_dir = \".\";\n\n// Self signed certificates, see\n// https://github.com/cesanta/mongoose/blob/master/test/certs/generate.sh\n#ifdef TLS_TWOWAY\nstatic const char *s_tls_ca =\n    \"-----BEGIN CERTIFICATE-----\\n\"\n    \"MIIBFTCBvAIJAMNTFtpfcq8NMAoGCCqGSM49BAMCMBMxETAPBgNVBAMMCE1vbmdv\\n\"\n    \"b3NlMB4XDTI0MDUwNzE0MzczNloXDTM0MDUwNTE0MzczNlowEzERMA8GA1UEAwwI\\n\"\n    \"TW9uZ29vc2UwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASuP+86T/rOWnGpEVhl\\n\"\n    \"fxYZ+pjMbCmDZ+vdnP0rjoxudwRMRQCv5slRlDK7Lxue761sdvqxWr0Ma6TFGTNg\\n\"\n    \"epsRMAoGCCqGSM49BAMCA0gAMEUCIQCwb2CxuAKm51s81S6BIoy1IcandXSohnqs\\n\"\n    \"us64BAA7QgIgGGtUrpkgFSS0oPBlCUG6YPHFVw42vTfpTC0ySwAS0M4=\\n\"\n    \"-----END CERTIFICATE-----\\n\";\n#endif\nstatic const char *s_tls_cert =\n    \"-----BEGIN CERTIFICATE-----\\n\"\n    \"MIIBMTCB2aADAgECAgkAluqkgeuV/zUwCgYIKoZIzj0EAwIwEzERMA8GA1UEAwwI\\n\"\n    \"TW9uZ29vc2UwHhcNMjQwNTA3MTQzNzM2WhcNMzQwNTA1MTQzNzM2WjARMQ8wDQYD\\n\"\n    \"VQQDDAZzZXJ2ZXIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASo3oEiG+BuTt5y\\n\"\n    \"ZRyfwNr0C+SP+4M0RG2pYkb2v+ivbpfi72NHkmXiF/kbHXtgmSrn/PeTqiA8M+mg\\n\"\n    \"BhYjDX+zoxgwFjAUBgNVHREEDTALgglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDRwAw\\n\"\n    \"RAIgTXW9MITQSwzqbNTxUUdt9DcB+8pPUTbWZpiXcA26GMYCIBiYw+DSFMLHmkHF\\n\"\n    \"+5U3NXW3gVCLN9ntD5DAx8LTG8sB\\n\"\n    \"-----END CERTIFICATE-----\\n\";\n\nstatic const char *s_tls_key =\n    \"-----BEGIN EC PRIVATE KEY-----\\n\"\n    \"MHcCAQEEIAVdo8UAScxG7jiuNY2UZESNX/KPH8qJ0u0gOMMsAzYWoAoGCCqGSM49\\n\"\n    \"AwEHoUQDQgAEqN6BIhvgbk7ecmUcn8Da9Avkj/uDNERtqWJG9r/or26X4u9jR5Jl\\n\"\n    \"4hf5Gx17YJkq5/z3k6ogPDPpoAYWIw1/sw==\\n\"\n    \"-----END EC PRIVATE KEY-----\\n\";\n\n// We use the same event handler function for HTTP and HTTPS connections\n// fn_data is NULL for plain HTTP, and non-NULL for HTTPS\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_ACCEPT && c->is_tls) {\n    struct mg_tls_opts opts;\n    memset(&opts, 0, sizeof(opts));\n#ifdef TLS_TWOWAY\n    opts.ca = mg_str(s_tls_ca);\n#endif\n    opts.cert = mg_str(s_tls_cert);\n    opts.key = mg_str(s_tls_key);\n    mg_tls_init(c, &opts);\n  }\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    if (mg_match(hm->uri, mg_str(\"/api/stats\"), NULL)) {\n      struct mg_connection *t;\n      // Print some statistics about currently established connections\n      mg_printf(c, \"HTTP/1.1 200 OK\\r\\nTransfer-Encoding: chunked\\r\\n\\r\\n\");\n      mg_http_printf_chunk(c, \"ID PROTO TYPE      LOCAL           REMOTE\\n\");\n      for (t = c->mgr->conns; t != NULL; t = t->next) {\n        mg_http_printf_chunk(c, \"%-3lu %4s %s %M %M\\n\", t->id,\n                             t->is_udp ? \"UDP\" : \"TCP\",\n                             t->is_listening  ? \"LISTENING\"\n                             : t->is_accepted ? \"ACCEPTED \"\n                                              : \"CONNECTED\",\n                             mg_print_ip, &t->loc, mg_print_ip, &t->rem);\n      }\n      mg_http_printf_chunk(c, \"\");  // Don't forget the last empty chunk\n    } else if (mg_match(hm->uri, mg_str(\"/api/f2/*\"), NULL)) {\n      mg_http_reply(c, 200, \"\", \"{\\\"result\\\": \\\"%.*s\\\"}\\n\", hm->uri.len,\n                    hm->uri.buf);\n    } else {\n      struct mg_http_serve_opts opts;\n      memset(&opts, 0, sizeof(opts));\n      opts.root_dir = s_root_dir;\n      mg_http_serve_dir(c, ev_data, &opts);\n    }\n  }\n}\n\nint main(void) {\n  struct mg_mgr mgr;                             // Event manager\n  mg_log_set(MG_LL_DEBUG);                       // Set log level\n  mg_mgr_init(&mgr);                             // Initialise event manager\n  mg_http_listen(&mgr, s_http_addr, fn, NULL);   // Create HTTP listener\n  mg_http_listen(&mgr, s_https_addr, fn, NULL);  // HTTPS listener\n  for (;;) mg_mgr_poll(&mgr, 1000);              // Infinite event loop\n  mg_mgr_free(&mgr);\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/http/http-restful-server/server.pem",
    "content": "Certificate:\n    Data:\n        Version: 3 (0x2)\n        Serial Number:\n            6e:73:28:55:df:13:b5:61:f5:4f:4f:5d:00:d9:0a:d8:b5:3a:21:4b\n        Signature Algorithm: ecdsa-with-SHA256\n        Issuer: C = IE, L = Dublin, O = Cesanta, CN = Test Root\n        Validity\n            Not Before: May  9 21:51:49 2020 GMT\n            Not After : May  9 21:51:49 2030 GMT\n        Subject: CN = server\n        Subject Public Key Info:\n            Public Key Algorithm: id-ecPublicKey\n                Public-Key: (256 bit)\n                pub:\n                    04:92:e0:46:9c:89:c3:37:a9:74:eb:35:55:43:55:\n                    5c:ac:eb:c7:e4:50:ee:f4:c0:ba:17:02:5c:d9:ed:\n                    b4:d4:ff:21:12:9a:b4:43:f4:89:4b:69:e4:6d:2b:\n                    96:1f:fc:01:4d:30:5a:79:73:76:ba:19:41:cc:c5:\n                    16:2b:bf:74:28\n                ASN1 OID: prime256v1\n                NIST CURVE: P-256\n        X509v3 extensions:\n            X509v3 Basic Constraints: \n                CA:FALSE\n            X509v3 Key Usage: \n                Digital Signature, Key Encipherment, Key Agreement\n            X509v3 Extended Key Usage: \n                TLS Web Server Authentication\n    Signature Algorithm: ecdsa-with-SHA256\n         30:46:02:21:00:fa:3a:c7:1e:cb:8c:27:59:41:8d:77:dd:7b:\n         cb:8c:08:15:16:b9:6e:70:e6:47:38:d1:55:42:e0:d7:66:c8:\n         f0:02:21:00:cc:70:4d:96:28:00:d3:c7:39:53:74:b2:49:87:\n         27:92:1b:ab:1a:0e:74:06:59:42:23:47:98:43:d8:20:a7:fa\n-----BEGIN CERTIFICATE-----\nMIIBhzCCASygAwIBAgIUbnMoVd8TtWH1T09dANkK2LU6IUswCgYIKoZIzj0EAwIw\nRDELMAkGA1UEBhMCSUUxDzANBgNVBAcMBkR1YmxpbjEQMA4GA1UECgwHQ2VzYW50\nYTESMBAGA1UEAwwJVGVzdCBSb290MB4XDTIwMDUwOTIxNTE0OVoXDTMwMDUwOTIx\nNTE0OVowETEPMA0GA1UEAwwGc2VydmVyMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcD\nQgAEkuBGnInDN6l06zVVQ1VcrOvH5FDu9MC6FwJc2e201P8hEpq0Q/SJS2nkbSuW\nH/wBTTBaeXN2uhlBzMUWK790KKMvMC0wCQYDVR0TBAIwADALBgNVHQ8EBAMCA6gw\nEwYDVR0lBAwwCgYIKwYBBQUHAwEwCgYIKoZIzj0EAwIDSQAwRgIhAPo6xx7LjCdZ\nQY133XvLjAgVFrlucOZHONFVQuDXZsjwAiEAzHBNligA08c5U3SySYcnkhurGg50\nBllCI0eYQ9ggp/o=\n-----END CERTIFICATE-----\n-----BEGIN PRIVATE KEY-----\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQglNni0t9Dg9icgG8w\nkbfxWSS+TuNgbtNybIQXcm3NHpmhRANCAASS4EacicM3qXTrNVVDVVys68fkUO70\nwLoXAlzZ7bTU/yESmrRD9IlLaeRtK5Yf/AFNMFp5c3a6GUHMxRYrv3Qo\n-----END PRIVATE KEY-----\n"
  },
  {
    "path": "tutorials/http/http-reverse-proxy/Makefile",
    "content": "PROG ?= example                   # Program we are building\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c  packed_fs.c      # Source code files, packed_fs.c contains ca.pem, which contains CA certs for TLS\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += -DMG_IO_SIZE=128 -DMG_ENABLE_LINES=1 -DMG_ENABLE_PACKED_FS=1\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= example.exe           # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\n  MAKE += WINDOWS=1 CC=$(CC)\nendif\n\nall: $(PROG)              # Default target. Build and run program\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)       # Build program from sources\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nclean:                    # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM mbedtls\n\n# see https://mongoose.ws/tutorials/tls/#how-to-build for TLS build options\n\nmbedtls:                  # Pull and build mbedTLS library\n\tgit clone --depth 1 -b v2.28.2 https://github.com/mbed-tls/mbedtls $@\n\t$(MAKE) -C mbedtls/library\n"
  },
  {
    "path": "tutorials/http/http-reverse-proxy/README.md",
    "content": "See detailed tutorial at https://mongoose.ws/tutorials/http/http-reverse-proxy/\n"
  },
  {
    "path": "tutorials/http/http-reverse-proxy/main.c",
    "content": "// Copyright (c) 2020 Cesanta Software Limited\n// All rights reserved\n//\n// Example HTTP reverse proxy\n//    1. Run `make`. This builds and starts a proxy on port 8000\n//    2. Start your browser, go to https://localhost:8000\n//\n// To enable SSL/TLS, see https://mongoose.ws/tutorials/tls/#how-to-build\n\n#include \"mongoose.h\"\n\nstatic const char *s_backend_url =\n#if MG_TLS\n    \"https://cesanta.com\";\n#else\n    \"http://info.cern.ch\";\n#endif\nstatic const char *s_listen_url = \"http://localhost:8000\";\n\n// Forward client request to the backend connection, rewriting the Host header\nstatic void forward_request(struct mg_http_message *hm,\n                            struct mg_connection *c) {\n  size_t i, max = sizeof(hm->headers) / sizeof(hm->headers[0]);\n  struct mg_str host = mg_url_host(s_backend_url);\n  mg_printf(c, \"%.*s\\r\\n\",\n            (int) (hm->proto.buf + hm->proto.len - hm->message.buf),\n            hm->message.buf);\n  for (i = 0; i < max && hm->headers[i].name.len > 0; i++) {\n    struct mg_str *k = &hm->headers[i].name, *v = &hm->headers[i].value;\n    if (mg_strcmp(*k, mg_str(\"Host\")) == 0) v = &host;\n    mg_printf(c, \"%.*s: %.*s\\r\\n\", (int) k->len, k->buf, (int) v->len, v->buf);\n  }\n  mg_send(c, \"\\r\\n\", 2);\n  mg_send(c, hm->body.buf, hm->body.len);\n  MG_DEBUG((\"FORWARDING: %.*s %.*s\", (int) hm->method.len, hm->method.buf,\n            (int) hm->uri.len, hm->uri.buf));\n}\n\nstatic void fn2(struct mg_connection *c, int ev, void *ev_data) {\n  struct mg_connection *c2 = (struct mg_connection *) c->fn_data;\n  if (ev == MG_EV_READ) {\n    // All incoming data from the backend, forward to the client\n    if (c2 != NULL) mg_send(c2, c->recv.buf, c->recv.len);\n    mg_iobuf_del(&c->recv, 0, c->recv.len);\n  } else if (ev == MG_EV_CLOSE) {\n    if (c2 != NULL) c2->fn_data = NULL;\n  }\n  (void) ev_data;\n}\n\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  struct mg_connection *c2 = c->fn_data;\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    // Client request, create backend connection Note that we're passing\n    // client connection `c` as fn_data for the created backend connection.\n    c2 = mg_connect(c->mgr, s_backend_url, fn2, c);\n    if (c2 == NULL) {\n      mg_error(c, \"Cannot create backend connection\");\n    } else {\n      if (c->is_tls) {\n        struct mg_tls_opts opts = {.ca = mg_unpacked(\"/certs/ca.pem\"),\n                                   .name = mg_url_host(s_backend_url)};\n        mg_tls_init(c2, &opts);\n      }\n      c->fn_data = c2;\n      forward_request(hm, c2);\n      c->is_resp = 0;  // process further msgs in keep-alive connection\n      c2->is_hexdumping = 1;\n    }\n  } else if (ev == MG_EV_CLOSE) {\n    if (c2 != NULL) c2->is_closing = 1;\n    if (c2 != NULL) c2->fn_data = NULL;\n  }\n}\n\nint main(void) {\n  struct mg_mgr mgr;\n\n  mg_log_set(MG_LL_DEBUG);                       // Set log level\n  mg_mgr_init(&mgr);                             // Initialise event manager\n  mg_http_listen(&mgr, s_listen_url, fn, NULL);  // Start proxy\n  for (;;) mg_mgr_poll(&mgr, 1000);              // Event loop\n  mg_mgr_free(&mgr);\n\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/http/http-server/Makefile",
    "content": "PROG ?= example                   # Program we are building\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c       # Source code files\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n#CFLAGS += -fsanitize=address,undefined,alignment\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += -DMG_HTTP_DIRLIST_TIME_FMT=\"%Y/%m/%d %H:%M:%S\"\nCFLAGS_MONGOOSE += -DMG_ENABLE_LINES=1 -DMG_ENABLE_IPV6=1 -DMG_ENABLE_SSI=1\nCFLAGS_EXTRA ?= -DMG_TLS=MG_TLS_BUILTIN\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= example.exe           # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32 -lbcrypt   # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\nendif\n\nall: $(PROG)              # Default target. Build and run program\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)       # Build program from sources\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nvc98:\n\tcl $(SOURCES) -DMG_ENABLE_SSI=1 -DMG_TLS=MG_TLS_BUILTIN\n\nclean:                    # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM\n"
  },
  {
    "path": "tutorials/http/http-server/README.md",
    "content": "See detailed tutorial at https://mongoose.ws/tutorials/http/http-server/\n"
  },
  {
    "path": "tutorials/http/http-server/arduino/esp32-http/esp32-http.ino",
    "content": "#include \"mongoose.h\"\n#include \"WiFi.h\"\n\n#define LED_PIN LED_BUILTIN\n#define WIFI_SSID \"wifi_network_name\"  // Change this\n#define WIFI_PASS \"wifi_password\"      // And this\n\nstruct mg_mgr mgr;\n\n// Crude function to get available RAM, for quick profiling\nsize_t getFreeRAM(void) {\n  size_t size = 0, increment = 1024;\n  void *p;\n  while ((p = malloc(size)) != NULL) free(p), size += increment;\n  return size;\n}\n\nvoid http_ev_handler(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *)ev_data;\n    if (mg_match(hm->uri, mg_str(\"/api/led/on\"), NULL)) {\n      digitalWrite(LED_PIN, HIGH);\n      mg_http_reply(c, 200, \"\", \"{%m: %d}\\n\", MG_ESC(\"led\"), digitalRead(LED_PIN));\n    } else if (mg_match(hm->uri, mg_str(\"/api/led/off\"), NULL)) {\n      digitalWrite(LED_PIN, LOW);\n      mg_http_reply(c, 200, \"\", \"{%m: %d}\\n\", MG_ESC(\"led\"), digitalRead(LED_PIN));\n    } else {\n      mg_http_reply(c, 200, \"\", \"ok, free RAM: %u\\n\", xPortGetFreeHeapSize());\n    }\n  }\n}\n\nvoid setup() {\n  pinMode(LED_PIN, OUTPUT);\n  Serial.begin(115200);\n  while (!Serial) delay(50);\n\n  WiFi.mode(WIFI_STA);\n  WiFi.begin(WIFI_SSID, WIFI_PASS);\n  while(WiFi.status() != WL_CONNECTED) Serial.print(\".\"), delay(100);\n\n  Serial.println(\"\\nConnected to the WiFi network\");\n  Serial.print(\"IP Address: \");\n  Serial.println(WiFi.localIP());\n\n  mg_mgr_init(&mgr);\n  mg_log_set(MG_LL_DEBUG);\n  mg_log_set_fn([](char ch, void *) { Serial.print(ch); }, NULL);\n  mg_http_listen(&mgr, \"http://0.0.0.0\", http_ev_handler, NULL);\n}\n\nvoid loop() {\n  mg_mgr_poll(&mgr, 0);\n}\n\nextern \"C\" int lwip_hook_ip6_input(struct pbuf *p, struct netif *inp) __attribute__((weak));\nextern \"C\" int lwip_hook_ip6_input(struct pbuf *p, struct netif *inp) {\n  if (ip6_addr_isany_val(inp->ip6_addr[0].u_addr.ip6)) {\n    pbuf_free(p);\n    return 1;\n  }\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/http/http-server/arduino/esp32-http/mongoose_config.h",
    "content": "#pragma once\n\n#include \"Arduino.h\"\n\n#define MG_ARCH MG_ARCH_ESP32\n"
  },
  {
    "path": "tutorials/http/http-server/arduino/teensy41-http/mongoose_config.h",
    "content": "#pragma once\n\n#define MG_ARCH MG_ARCH_ARMGCC     // Use ARM toolchain\n#define MG_ENABLE_TCPIP 1          // Enable built-in network stack\n#define MG_ENABLE_DRIVER_IMXRT10 1   // Enable RTxx driver\n#define MG_ENABLE_CUSTOM_MILLIS 1  // Let user implement mg_millis()\n#define MG_ENABLE_POSIX_FS 0       // Disable POSIX filesystem\n#define MG_ENABLE_PACKED_FS 1      // Enable packed filesystem\n\n#define HTTP_URL \"http://0.0.0.0\"\n#define HTTPS_URL \"https://0.0.0.0\"\n"
  },
  {
    "path": "tutorials/http/http-server/arduino/teensy41-http/teensy41-http.ino",
    "content": "#include \"mongoose.h\"\n#include \"net.h\"\n\nvoid ethernet_init(void);\nstruct mg_mgr mgr;\nstruct mg_tcpip_driver_imxrt_data data = {.mdc_cr = 24, .phy_addr = 0};\nstruct mg_tcpip_if mif = {\n    // Construct MAC address from the unique chip ID\n    .mac = {2, (uint8_t) (HW_OCOTP_CFG0 & 255),\n            (uint8_t) ((HW_OCOTP_CFG0 >> 10) & 255),\n            (uint8_t) (((HW_OCOTP_CFG0 >> 19) ^ (HW_OCOTP_CFG1 >> 19)) & 255),\n            (uint8_t) ((HW_OCOTP_CFG1 >> 10) & 255),\n            (uint8_t) (HW_OCOTP_CFG1 & 255)},\n    // The default is DHCP. Uncomment 3 lines below for static IP config:\n    // .ip = mg_htonl(MG_U32(192, 168, 0, 223)),\n    // .mask = mg_htonl(MG_U32(255, 255, 255, 0)),\n    // .gw = mg_htonl(MG_U32(192, 168, 0, 1)),\n    .driver = &mg_tcpip_driver_imxrt,\n    .driver_data = &data};\n\nuint64_t mg_millis(void) {  // Let Mongoose use our uptime function\n  return millis();\n}\n\n// Simple HTTP server that runs on port 8000\n// Mongoose event handler function, gets called by the mg_mgr_poll()\n// See https://mongoose.ws/documentation/#2-minute-integration-guide\nstatic void simple_http_listener(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    // The MG_EV_HTTP_MSG event means HTTP request. `hm` holds parsed request,\n    // see https://mongoose.ws/documentation/#struct-mg_http_message\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n\n    // If the requested URI is \"/api/hi\", send a simple JSON response back\n    if (mg_match(hm->uri, mg_str(\"/api/hi\"), NULL)) {\n      // Use mg_http_reply() API function to generate JSON response. It adds a\n      // Content-Length header automatically. In the response, we show\n      // the requested URI and HTTP body:\n      mg_http_reply(c, 200, \"\", \"{%m:%m,%m:%m}\\n\",  // See mg_snprintf doc\n                    MG_ESC(\"uri\"), mg_print_esc, hm->uri.len, hm->uri.buf,\n                    MG_ESC(\"body\"), mg_print_esc, hm->body.len, hm->body.buf);\n    } else {\n      // For all other URIs, serve some static content\n      mg_http_reply(c, 200, \"\", \"<html>millis: %lu</html>\", millis());\n    }\n  }\n}\n\nvoid setup() {\n  pinMode(LED_BUILTIN, OUTPUT);\n  Serial.begin(115200);\n  while (!Serial) delay(50);\n\n  mg_mgr_init(&mgr);        // Initialise Mongoose event manager\n  mg_log_set(MG_LL_DEBUG);  // Set log level and log function\n  mg_log_set_fn([](char ch, void *) { Serial.print(ch); }, NULL);\n\n  MG_INFO((\"CPU %g MHz. Starting TCP/IP stack\", (double) F_CPU / 1000000));\n  ethernet_init();\n  mg_tcpip_init(&mgr, &mif);  // Initialise built-in TCP/IP stack\n\n  MG_INFO((\"Waiting for IP...\"));\n  while (mif.state != MG_TCPIP_STATE_READY) mg_mgr_poll(&mgr, 1);\n\n  // We start two HTTP listeners: one is a simple one on port 8000,\n  // with event handler function defined above - simple_http_listener\n  // See https://mongoose.ws/documentation/#2-minute-integration-guide\n  // Another listener is for a more sophisticated Web device dashboard\n  MG_INFO((\"Starting web dashboard\"));\n  mg_http_listen(&mgr, \"http://0.0.0.0:8000\", simple_http_listener, NULL);\n  web_init(&mgr);  // Sophisticated Web UI, see net.c :: fn()\n}\n\nvoid loop() {\n  static uint64_t timer;\n  if (mg_timer_expired(&timer, 500, mg_millis())) {        // Every 500ms\n    digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));  // blink an LED\n  }\n\n  mg_mgr_poll(&mgr, 1);  // Process network events\n}\n\nextern \"C\" void ENET_IRQHandler(void);\n\n#define CLRSET(reg, clear, set) ((reg) = ((reg) & ~(clear)) | (set))\n#define RMII_PAD_INPUT_PULLDOWN 0x30E9\n#define RMII_PAD_INPUT_PULLUP 0xB0E9\n#define RMII_PAD_CLOCK 0x0031\n\n// initialize the ethernet hardware\nvoid ethernet_init(void) {\n  CCM_CCGR1 |= CCM_CCGR1_ENET(CCM_CCGR_ON);\n  // configure PLL6 for 50 MHz, pg 1173\n  CCM_ANALOG_PLL_ENET_CLR =\n      CCM_ANALOG_PLL_ENET_POWERDOWN | CCM_ANALOG_PLL_ENET_BYPASS | 0x0F;\n  CCM_ANALOG_PLL_ENET_SET = CCM_ANALOG_PLL_ENET_ENABLE |\n                            CCM_ANALOG_PLL_ENET_BYPASS\n                            /*| CCM_ANALOG_PLL_ENET_ENET2_REF_EN*/\n                            | CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN\n                            /*| CCM_ANALOG_PLL_ENET_ENET2_DIV_SELECT(1)*/\n                            | CCM_ANALOG_PLL_ENET_DIV_SELECT(1);\n  while (!(CCM_ANALOG_PLL_ENET & CCM_ANALOG_PLL_ENET_LOCK))\n    ;  // wait for PLL lock\n  CCM_ANALOG_PLL_ENET_CLR = CCM_ANALOG_PLL_ENET_BYPASS;\n  // configure REFCLK to be driven as output by PLL6, pg 326\n\n  CLRSET(IOMUXC_GPR_GPR1,\n         IOMUXC_GPR_GPR1_ENET1_CLK_SEL | IOMUXC_GPR_GPR1_ENET_IPG_CLK_S_EN,\n         IOMUXC_GPR_GPR1_ENET1_TX_CLK_DIR);\n\n  // Configure pins\n  IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_14 = 5;  // Reset   B0_14 Alt5 GPIO7.15\n  IOMUXC_SW_MUX_CTL_PAD_GPIO_B0_15 = 5;  // Power   B0_15 Alt5 GPIO7.14\n  GPIO7_GDIR |= (1 << 14) | (1 << 15);\n  GPIO7_DR_SET = (1 << 15);                                    // Power on\n  GPIO7_DR_CLEAR = (1 << 14);                                  // Reset PHY chip\n  IOMUXC_SW_PAD_CTL_PAD_GPIO_B1_04 = RMII_PAD_INPUT_PULLDOWN;  // PhyAdd[0] = 0\n  IOMUXC_SW_PAD_CTL_PAD_GPIO_B1_06 = RMII_PAD_INPUT_PULLDOWN;  // PhyAdd[1] = 1\n  IOMUXC_SW_PAD_CTL_PAD_GPIO_B1_05 = RMII_PAD_INPUT_PULLUP;    // Slave mode\n  IOMUXC_SW_PAD_CTL_PAD_GPIO_B1_11 = RMII_PAD_INPUT_PULLDOWN;  // Auto MDIX\n  IOMUXC_SW_PAD_CTL_PAD_GPIO_B1_07 = RMII_PAD_INPUT_PULLUP;\n  IOMUXC_SW_PAD_CTL_PAD_GPIO_B1_08 = RMII_PAD_INPUT_PULLUP;\n  IOMUXC_SW_PAD_CTL_PAD_GPIO_B1_09 = RMII_PAD_INPUT_PULLUP;\n  IOMUXC_SW_PAD_CTL_PAD_GPIO_B1_10 = RMII_PAD_CLOCK;\n  IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_05 = 3;         // RXD1    B1_05 Alt3, pg 525\n  IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_04 = 3;         // RXD0    B1_04 Alt3, pg 524\n  IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_10 = 6 | 0x10;  // REFCLK  B1_10 Alt6, pg 530\n  IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_11 = 3;         // RXER    B1_11 Alt3, pg 531\n  IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_06 = 3;         // RXEN    B1_06 Alt3, pg 526\n  IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_09 = 3;         // TXEN    B1_09 Alt3, pg 529\n  IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_07 = 3;         // TXD0    B1_07 Alt3, pg 527\n  IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_08 = 3;         // TXD1    B1_08 Alt3, pg 528\n  IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_15 = 0;         // MDIO    B1_15 Alt0, pg 535\n  IOMUXC_SW_MUX_CTL_PAD_GPIO_B1_14 = 0;         // MDC     B1_14 Alt0, pg 534\n  IOMUXC_ENET_MDIO_SELECT_INPUT = 2;            // GPIO_B1_15_ALT0, pg 792\n  IOMUXC_ENET0_RXDATA_SELECT_INPUT = 1;         // GPIO_B1_04_ALT3, pg 792\n  IOMUXC_ENET1_RXDATA_SELECT_INPUT = 1;         // GPIO_B1_05_ALT3, pg 793\n  IOMUXC_ENET_RXEN_SELECT_INPUT = 1;            // GPIO_B1_06_ALT3, pg 794\n  IOMUXC_ENET_RXERR_SELECT_INPUT = 1;           // GPIO_B1_11_ALT3, pg 795\n  IOMUXC_ENET_IPG_CLK_RMII_SELECT_INPUT = 1;    // GPIO_B1_10_ALT6, pg 791\n  delay(1);\n  GPIO7_DR_SET = (1 << 14);  // Start PHY chip\n  // ENET_MSCR = ENET_MSCR_MII_SPEED(9);\n  delay(1);\n\n  // Setup IRQ handler\n  attachInterruptVector(IRQ_ENET, ENET_IRQHandler);\n  NVIC_ENABLE_IRQ(IRQ_ENET);\n}\n"
  },
  {
    "path": "tutorials/http/http-server/arduino/w5500-http/mongoose_config.h",
    "content": "#pragma once\n\n#include \"Arduino.h\"\n\n#include <errno.h>\n#include <stdarg.h>\n#include <stdio.h>\n#include <time.h>\n\n#define MG_ARCH MG_ARCH_CUSTOM\n#define MG_ENABLE_TCPIP 1\n#define MG_ENABLE_DRIVER_W5500 1\n#define MG_ENABLE_TCPIP_DRIVER_INIT 0\n#define MG_ENABLE_TCPIP_PRINT_DEBUG_STATS 0\n#define MG_ENABLE_CUSTOM_MILLIS 1\n#define MG_ENABLE_CUSTOM_RANDOM 1\n#define MG_TLS MG_TLS_BUILTIN\n#define MG_IO_SIZE 256\n"
  },
  {
    "path": "tutorials/http/http-server/arduino/w5500-http/w5500-http.ino",
    "content": "#include <SPI.h>\n#include \"mongoose.h\"\n\n#define LED_PIN LED_BUILTIN  // LED pin\n#define SS_PIN 17            // Slave select pin for the W5500 module\n\nstruct mg_tcpip_spi spi = {\n    NULL,  // SPI metadata\n    [](void *) { digitalWrite(SS_PIN, LOW); SPI.beginTransaction(SPISettings()); },\n    [](void *) { digitalWrite(SS_PIN, HIGH); SPI.endTransaction(); },\n    [](void *, uint8_t c) { return SPI.transfer(c); }, // Execute transaction\n};\nstruct mg_mgr mgr;                                     // Mongoose event manager\nstruct mg_tcpip_if mif = {.mac = {2, 0, 1, 2, 3, 5}};  // Network interface\n\n// Used by Mongoose for time tracking\nuint64_t mg_millis(void) {\n  return millis();\n}\n\n// Used by Mongoose to generate random data\nbool mg_random(void *buf, size_t len) {  // For TLS\n  uint8_t *p = (uint8_t *) buf;\n  while (len--) *p++ = (unsigned char) (rand() & 255);\n  return true;\n}\n\n// Crude function to get available RAM, for quick profiling\nextern \"C\" char *sbrk(int);\nextern char *__brkval;\nint getFreeRAM() {\n  char top;\n#ifdef __arm__\n  return &top - (char *) sbrk(0);\n#elif defined(CORE_TEENSY) || (ARDUINO > 103 && ARDUINO != 151)\n  return &top - __brkval;\n#else\n  return __brkval ? &top - __brkval : &top - __malloc_heap_start;\n#endif\n}\n\nstatic void http_ev_handler(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    if (mg_match(hm->uri, mg_str(\"/api/led/on\"), NULL)) {\n      digitalWrite(LED_PIN, HIGH);\n      mg_http_reply(c, 200, \"\", \"{%m: %d}\\n\", MG_ESC(\"led\"), digitalRead(LED_PIN));\n    } else if (mg_match(hm->uri, mg_str(\"/api/led/off\"), NULL)) {\n      digitalWrite(LED_PIN, LOW);\n      mg_http_reply(c, 200, \"\", \"{%m: %d}\\n\", MG_ESC(\"led\"), digitalRead(LED_PIN));\n    } else {\n      mg_http_reply(c, 200, \"\", \"ok, free RAM: %u\\n\", getFreeRAM());\n    }\n  }\n  // Initialise TLS if we're a TLS listener\n  if (c->is_tls && ev == MG_EV_ACCEPT) {\n    struct mg_tls_opts opts;\n    memset(&opts, 0, sizeof(opts));\n\n    // Generated by https://mongoose.ws/tls/\n#define TLS_CERT \\\n  \"-----BEGIN CERTIFICATE-----\\n\" \\\n  \"MIIBkzCCATqgAwIBAgIEZ3E9lzAKBggqhkjOPQQDAjATMREwDwYDVQQDEwhNb25n\\n\" \\\n  \"b29zZTAeFw0yNDEyMjkxMjE2MjNaFw0zNDEyMjcxMjE2MjNaMBQxEjAQBgNVBAMT\\n\" \\\n  \"CWxvY2FsaG9zdDBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABHxxuByu5K2k7DYq\\n\" \\\n  \"b3eQsHb3VY5NWglWun7axh69OWF7V9OUUyON1y8ISirL0Gj5ZPOogIgrB9iOcz6K\\n\" \\\n  \"q9n8NQOjezB5MA4GA1UdDwEB/wQEAwIFoDATBgNVHSUEDDAKBggrBgEFBQcDATAM\\n\" \\\n  \"BgNVHRMBAf8EAjAAMB8GA1UdIwQYMBaAFGn8GpPWaM0JC7U4zlg+bCljSjLoMCMG\\n\" \\\n  \"A1UdEQQcMBqCCWxvY2FsaG9zdIINMTkyLjE2OC4wLjEwMDAKBggqhkjOPQQDAgNH\\n\" \\\n  \"ADBEAiAr1fO3QLLm+vjYarctNI+gfnxxB4edRTRmcFWHmBS8oQIgY5lkq2JCwATG\\n\" \\\n  \"YsVQUmS+2Tbc7ij7lkduXO42pvr/0fw=\\n\" \\\n  \"-----END CERTIFICATE-----\"\n\n  #define TLS_KEY \\\n  \"-----BEGIN EC PRIVATE KEY-----\\n\" \\\n  \"MHcCAQEEIHKu84eEw9dX8nez82g3F94OsZJ14LVbAN+OBW+++V2poAoGCCqGSM49\\n\" \\\n  \"AwEHoUQDQgAEfHG4HK7kraTsNipvd5CwdvdVjk1aCVa6ftrGHr05YXtX05RTI43X\\n\" \\\n  \"LwhKKsvQaPlk86iAiCsH2I5zPoqr2fw1Aw==\\n\" \\\n  \"-----END EC PRIVATE KEY-----\"\n\n    opts.cert = mg_str(TLS_CERT);\n    opts.key = mg_str(TLS_KEY);\n\n    mg_tls_init(c, &opts);\n  }\n}\n\nvoid setup() {\n  Serial.begin(115200);       // Initialise serial\n  while (!Serial) delay(50);  // for debug output\n\n  SPI.begin();               // Iniitialise SPI\n  pinMode(SS_PIN, OUTPUT);   // to communicate with W5500 Ethernet module\n  pinMode(LED_PIN, OUTPUT);  // Initialise LED\n\n  mg_mgr_init(&mgr);        // Initialise Mongoose event manager\n  mg_log_set(MG_LL_DEBUG);  // Set debug log level\n  mg_log_set_fn([](char ch, void *) { Serial.print(ch); }, NULL);  // Log serial\n  mif.driver = &mg_tcpip_driver_w5500;  // Use W5500 built-in driver\n  mif.driver_data = &spi;               // Pass SPI interface to W5500 driver\n  mg_tcpip_init(&mgr, &mif);            // Initialise built-in TCP/IP stack\n\n  // Setup HTTP & HTTPS listeners. Respond \"ok\" on any HTTP request\n  mg_http_listen(&mgr, \"http://0.0.0.0:80\", http_ev_handler, NULL);\n  mg_http_listen(&mgr, \"https://0.0.0.0:443\", http_ev_handler, NULL);\n}\n\nvoid loop() {\n  mg_mgr_poll(&mgr, 1);\n}\n"
  },
  {
    "path": "tutorials/http/http-server/ca.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIBFTCBvAIJAMNTFtpfcq8NMAoGCCqGSM49BAMCMBMxETAPBgNVBAMMCE1vbmdv\nb3NlMB4XDTI0MDUwNzE0MzczNloXDTM0MDUwNTE0MzczNlowEzERMA8GA1UEAwwI\nTW9uZ29vc2UwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASuP+86T/rOWnGpEVhl\nfxYZ+pjMbCmDZ+vdnP0rjoxudwRMRQCv5slRlDK7Lxue761sdvqxWr0Ma6TFGTNg\nepsRMAoGCCqGSM49BAMCA0gAMEUCIQCwb2CxuAKm51s81S6BIoy1IcandXSohnqs\nus64BAA7QgIgGGtUrpkgFSS0oPBlCUG6YPHFVw42vTfpTC0ySwAS0M4=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "tutorials/http/http-server/crt.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIIBMTCB2aADAgECAgkAluqkgeuV/zUwCgYIKoZIzj0EAwIwEzERMA8GA1UEAwwI\nTW9uZ29vc2UwHhcNMjQwNTA3MTQzNzM2WhcNMzQwNTA1MTQzNzM2WjARMQ8wDQYD\nVQQDDAZzZXJ2ZXIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASo3oEiG+BuTt5y\nZRyfwNr0C+SP+4M0RG2pYkb2v+ivbpfi72NHkmXiF/kbHXtgmSrn/PeTqiA8M+mg\nBhYjDX+zoxgwFjAUBgNVHREEDTALgglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDRwAw\nRAIgTXW9MITQSwzqbNTxUUdt9DcB+8pPUTbWZpiXcA26GMYCIBiYw+DSFMLHmkHF\n+5U3NXW3gVCLN9ntD5DAx8LTG8sB\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "tutorials/http/http-server/key.pem",
    "content": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIAVdo8UAScxG7jiuNY2UZESNX/KPH8qJ0u0gOMMsAzYWoAoGCCqGSM49\nAwEHoUQDQgAEqN6BIhvgbk7ecmUcn8Da9Avkj/uDNERtqWJG9r/or26X4u9jR5Jl\n4hf5Gx17YJkq5/z3k6ogPDPpoAYWIw1/sw==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "tutorials/http/http-server/main.c",
    "content": "// Copyright (c) 2020 Cesanta Software Limited\n// All rights reserved\n\n#include <signal.h>\n#include \"mongoose.h\"\n\nstatic int s_debug_level = MG_LL_INFO;\nstatic const char *s_root_dir = \".\";\nstatic const char *s_listening_addr = \"http://0.0.0.0:8000\";\nstatic const char *s_enable_hexdump = \"no\";\nstatic const char *s_ssi_pattern = \"#.html\";\nstatic const char *s_upload_dir = NULL;     // File uploads disabled by default\nstatic const char *s_ca_path = NULL;        // TLS CA file. Enables mutual TLS\nstatic const char *s_crt_path = \"crt.pem\";  // TLS cert file\nstatic const char *s_key_path = \"key.pem\";  // TLS key file\n\n// For self signed certificates, see\n// https://github.com/cesanta/mongoose/blob/master/test/certs/generate.sh\nstatic struct mg_str s_ca, s_crt, s_key;  // Initialised in main\n\n// Handle interrupts, like Ctrl-C\nstatic int s_signo;\nstatic void signal_handler(int signo) {\n  s_signo = signo;\n}\n\n// Event handler for the listening connection.\n// Simply serve static files from `s_root_dir`\nstatic void cb(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_ACCEPT && c->is_tls) {\n    struct mg_tls_opts opts;\n    memset(&opts, 0, sizeof(opts));\n    opts.cert = s_crt;\n    opts.key = s_key;\n    opts.ca = s_ca;\n    mg_tls_init(c, &opts);\n  }\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = ev_data;\n\n    if (mg_match(hm->uri, mg_str(\"/upload\"), NULL)) {\n      // Serve file upload\n      if (s_upload_dir == NULL) {\n        mg_http_reply(c, 403, \"\", \"Denied: file upload directory not set\\n\");\n      } else {\n        struct mg_http_part part;\n        size_t pos = 0, total_bytes = 0, num_files = 0;\n        while ((pos = mg_http_next_multipart(hm->body, pos, &part)) > 0) {\n          char path[MG_PATH_MAX];\n          MG_INFO((\"Chunk name: [%.*s] filename: [%.*s] length: %lu bytes\",\n                   part.name.len, part.name.buf, part.filename.len,\n                   part.filename.buf, part.body.len));\n          mg_snprintf(path, sizeof(path), \"%s/%.*s\", s_upload_dir,\n                      part.filename.len, part.filename.buf);\n          if (mg_path_is_sane(mg_str(path))) {\n            mg_file_write(&mg_fs_posix, path, part.body.buf, part.body.len);\n            total_bytes += part.body.len;\n            num_files++;\n          } else {\n            MG_ERROR((\"Rejecting dangerous path %s\", path));\n          }\n        }\n        mg_http_reply(c, 200, \"\", \"Uploaded %lu files, %lu bytes\\n\", num_files,\n                      total_bytes);\n      }\n    } else {\n      // Serve web root directory\n      struct mg_http_serve_opts opts = {0};\n      opts.root_dir = s_root_dir;\n      opts.ssi_pattern = s_ssi_pattern;\n      mg_http_serve_dir(c, hm, &opts);\n    }\n\n    // Log request\n    MG_INFO((\"%.*s %.*s %lu -> %.*s %lu\", hm->method.len, hm->method.buf,\n             hm->uri.len, hm->uri.buf, hm->body.len, 3, c->send.buf + 9,\n             c->send.len));\n  }\n}\n\nstatic void usage(const char *prog) {\n  fprintf(stderr,\n          \"Mongoose v.%s\\n\"\n          \"Usage: %s OPTIONS\\n\"\n          \"  -H yes|no - enable traffic hexdump, default: '%s'\\n\"\n          \"  -S PAT    - SSI filename pattern, default: '%s'\\n\"\n          \"  -d DIR    - directory to serve, default: '%s'\\n\"\n          \"  -l ADDR   - listening HTTP address, default: '%s'\\n\"\n          \"  -u DIR    - file upload directory, default: unset\\n\"\n          \"  -v LEVEL  - debug level, from 0 to 4, default: %d\\n\",\n          MG_VERSION, prog, s_enable_hexdump, s_ssi_pattern, s_root_dir,\n          s_listening_addr, s_debug_level);\n  exit(EXIT_FAILURE);\n}\n\nint main(int argc, char *argv[]) {\n  char path[MG_PATH_MAX] = \".\";\n  struct mg_mgr mgr;\n  struct mg_connection *c;\n  int i;\n\n  // Parse command-line flags\n  for (i = 1; i < argc; i++) {\n    if (strcmp(argv[i], \"-d\") == 0) {\n      s_root_dir = argv[++i];\n    } else if (strcmp(argv[i], \"-H\") == 0) {\n      s_enable_hexdump = argv[++i];\n    } else if (strcmp(argv[i], \"-S\") == 0) {\n      s_ssi_pattern = argv[++i];\n    } else if (strcmp(argv[i], \"-l\") == 0) {\n      s_listening_addr = argv[++i];\n    } else if (strcmp(argv[i], \"-u\") == 0) {\n      s_upload_dir = argv[++i];\n    } else if (strcmp(argv[i], \"-v\") == 0) {\n      s_debug_level = atoi(argv[++i]);\n    } else {\n      usage(argv[0]);\n    }\n  }\n\n  // Load certificates from files\n  s_ca = mg_file_read(&mg_fs_posix, s_ca_path);\n  s_crt = mg_file_read(&mg_fs_posix, s_crt_path);\n  s_key = mg_file_read(&mg_fs_posix, s_key_path);\n\n  // Root directory must not contain double dots. Make it absolute\n  // Do the conversion only if the root dir spec does not contain overrides\n  if (strchr(s_root_dir, ',') == NULL) {\n    realpath(s_root_dir, path);\n    s_root_dir = path;\n  }\n\n  // Initialise stuff\n  signal(SIGINT, signal_handler);\n  signal(SIGTERM, signal_handler);\n  setvbuf(stdout, NULL, _IONBF, 0);  // Switch off output buffering\n  mg_log_set(s_debug_level);\n  mg_mgr_init(&mgr);\n  if ((c = mg_http_listen(&mgr, s_listening_addr, cb, NULL)) == NULL) {\n    MG_ERROR((\"Cannot listen on %s. Use http://ADDR:PORT or :PORT\",\n              s_listening_addr));\n    exit(EXIT_FAILURE);\n  }\n  if (mg_casecmp(s_enable_hexdump, \"yes\") == 0) c->is_hexdumping = 1;\n\n  // Start infinite event loop\n  MG_INFO((\"Mongoose version : v%s\", MG_VERSION));\n  MG_INFO((\"Listening on     : %s\", s_listening_addr));\n  MG_INFO((\"Web root         : %s\", s_root_dir));\n  MG_INFO((\"Upload dir       : %s\", s_upload_dir ? s_upload_dir : \"(unset)\"));\n  while (s_signo == 0) {\n    mg_mgr_poll(&mgr, 1000);\n  }\n  mg_mgr_free(&mgr);\n  MG_INFO((\"Exiting on signal %d\", s_signo));\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/http/http-streaming-client/Makefile",
    "content": "PROG ?= example                   # Program we are building\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c  packed_fs.c      # Source code files, packed_fs.c contains ca.pem, which contains CA certs for TLS\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += -DMG_ENABLE_LINES=1 -DMG_ENABLE_PACKED_FS=1\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= example.exe           # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\n  MAKE += WINDOWS=1 CC=$(CC)\nendif\n\nall: $(PROG)              # Default target. Build and run program\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)       # Build program from sources\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nclean:                    # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM mbedtls\n\n# see https://mongoose.ws/tutorials/tls/#how-to-build for TLS build options\n\nmbedtls:                  # Pull and build mbedTLS library\n\tgit clone --depth 1 -b v2.28.2 https://github.com/mbed-tls/mbedtls $@\n\t$(MAKE) -C mbedtls/library\n"
  },
  {
    "path": "tutorials/http/http-streaming-client/main.c",
    "content": "// Copyright (c) 2021 Cesanta Software Limited\n// All rights reserved\n//\n// Example streaming HTTP client.\n// The default HTTP handler waits until the whole HTTP message is buffered in\n// c->recv IO buffer. It can be large. This example shows how to receive\n// a potentially large response in chunks by handling the MG_EV_READ events.\n//\n// You can change `s_url` from the command line by executing: ./example YOUR_URL\n// To enable SSL/TLS, see https://mongoose.ws/tutorials/tls/#how-to-build\n\n#include \"mongoose.h\"\n\n// The very first web page in history. You can replace it from command line\nstatic const char *s_url = \"http://info.cern.ch\";\n\n// Print HTTP response and signal that we're done\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_CONNECT) {\n    // Connected to server. Extract host name from URL\n    struct mg_str host = mg_url_host(s_url);\n    if (c->is_tls) {\n      struct mg_tls_opts opts = {.ca = mg_unpacked(\"/certs/ca.pem\"),\n                                 .name = host};\n      mg_tls_init(c, &opts);\n    }\n    // Send request\n    mg_printf(c,\n              \"GET %s HTTP/1.1\\r\\n\"\n              \"Connection: close\\r\\n\"\n              \"Host: %.*s\\r\\n\"\n              \"\\r\\n\",\n              mg_url_uri(s_url), (int) host.len, host.buf);\n  } else if (ev == MG_EV_READ) {\n    // c->data[0] holds a flag, whether we have parsed the request already\n    if (c->data[0] == 0) {\n      struct mg_http_message hm;\n      int n = mg_http_parse((char *) c->recv.buf, c->recv.len, &hm);\n      if (n < 0) mg_error(c, \"Bad response\");\n      if (n > 0) {\n        fwrite(c->recv.buf + n, 1, c->recv.len - n, stdout);  // Print body\n        c->recv.len = 0;  // Cleanup receive buffer\n        c->data[0] = 1;   // Request parsed, set the flag\n      }\n    } else {\n      fwrite(c->recv.buf, 1, c->recv.len, stdout);\n      c->recv.len = 0;  // Cleanup the receive buffer\n    }\n  } else if (ev == MG_EV_CLOSE) {\n    *(bool *) c->fn_data = true;  // Done, tell event loop to stop\n  } else if (ev == MG_EV_ERROR) {\n    *(bool *) c->fn_data = true;  // Error, Tell event loop to stop\n  }\n  (void) ev_data;\n}\n\nint main(int argc, char *argv[]) {\n  struct mg_mgr mgr;  // Event manager\n  bool done = false;  // Event handler flips it to true\n\n  mg_mgr_init(&mgr);       // Initialise event manager\n  mg_log_set(MG_LL_INFO);  // Set to 0 to disable debug log\n\n  if (argc > 1) s_url = argv[1];          // Use URL from command line\n  mg_connect(&mgr, s_url, fn, &done);     // Create client connection\n  while (!done) mg_mgr_poll(&mgr, 1000);  // Infinite event loop\n  mg_mgr_free(&mgr);                      // Free resources\n\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/http/huge-response/Makefile",
    "content": "PROG ?= example                   # Program we are building\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c       # Source code files\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += -DMG_ENABLE_LINES=1\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= example.exe           # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\nendif\n\nall: $(PROG)              # Default target. Build and run program\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)       # Build program from sources\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nclean:                    # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM\n"
  },
  {
    "path": "tutorials/http/huge-response/README.md",
    "content": "See detailed tutorial at https://mongoose.ws/tutorials/http/huge-response/\n"
  },
  {
    "path": "tutorials/http/huge-response/main.c",
    "content": "// Copyright (c) 2021 Cesanta Software Limited\n// All rights reserved\n//\n// Example that demonstrates how to send a large responses with limited memory.\n// We're going to send a JSON array of many integer values, s_data.\n// The idea is to send a response in small chunks, and let the client request\n// the next chunk.\n// Periodically, s_data changes, which is tracked by s_version.\n// Client requests a range and a version, to ensure data integrity.\n//\n//  1. Start this server, type `make`\n//  2. Open http://localhost:8000 in your browser\n\n#include \"mongoose.h\"\n\nstatic const char *s_listen_on = \"http://localhost:8000\";\nstatic const char *s_root_dir = \"web_root\";\n\n#define DATA_SIZE 10000        // Total number of elements\n#define CHUNK_SIZE 100         // Max number returned in one API call\nstatic int s_data[DATA_SIZE];  // Simulate some complex big data\nstatic long s_version = 0;     // Data \"version\"\n\nstatic long getparam(struct mg_http_message *hm, const char *json_path) {\n  double dv = 0;\n  mg_json_get_num(hm->body, json_path, &dv);\n  return dv;\n}\n\nstatic size_t printdata(mg_pfn_t out, void *ptr, va_list *ap) {\n  unsigned start = va_arg(*ap, unsigned);\n  unsigned max = start + CHUNK_SIZE;\n  const char *comma = \"\";\n  size_t n = 0;\n  if (max > DATA_SIZE) max = DATA_SIZE;\n  while (start < max) {\n    n += mg_xprintf(out, ptr, \"%s%d\", comma, s_data[start]);\n    comma = \",\";\n    start++;\n  }\n  return n;\n}\n\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = ev_data;\n    if (mg_match(hm->uri, mg_str(\"/api/data\"), NULL)) {\n      const char *headers = \"content-type: text/json\\r\\n\";\n      long start = getparam(hm, \"$.start\");\n      long version = getparam(hm, \"$.version\");\n      MG_DEBUG((\"%.*s\", (int) hm->body.len, hm->body.buf));\n      if (version > 0 && version != s_version) {\n        // Version mismatch: s_data has changed while client fetches it\n        // Tell client to restart\n        mg_http_reply(c, 200, headers, \"{%m:%m, %m:%ld}\", MG_ESC(\"error\"),\n                      MG_ESC(\"wrong version\"), MG_ESC(\"version\"), version);\n      } else {\n        // Return data, up to CHUNK_SIZE elements\n        mg_http_reply(c, 200, headers, \"{%m:%ld,%m:%ld,%m:[%M]}\",\n                      MG_ESC(\"version\"), s_version, MG_ESC(\"start\"), start,\n                      MG_ESC(\"data\"), printdata, start);\n      }\n    } else {\n      struct mg_http_serve_opts opts = {0};\n      opts.root_dir = s_root_dir;\n      mg_http_serve_dir(c, hm, &opts);\n    }\n  }\n}\n\nstatic void timer_fn(void *arg) {\n  for (int i = 0; i < DATA_SIZE; i++) {\n    s_data[i] = rand();\n  }\n  s_version++;\n  (void) arg;\n}\n\nint main(void) {\n  struct mg_mgr mgr;\n  mg_mgr_init(&mgr);\n  srand(time(NULL));\n  mg_timer_add(&mgr, 5000, MG_TIMER_REPEAT | MG_TIMER_RUN_NOW, timer_fn, NULL);\n  mg_http_listen(&mgr, s_listen_on, fn, NULL);\n  MG_INFO((\"Listening on %s\", s_listen_on));\n  for (;;) mg_mgr_poll(&mgr, 1000);\n  mg_mgr_free(&mgr);\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/http/huge-response/web_root/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>example</title>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <style>\n      #container { margin-right: auto; margin-left: auto; max-width: 480px; }\n      #info { background: #e0f0f0; border-radius: .5em; padding: 2em; margin-bottom: 1em; }\n      #result { margin-top: 1em; }\n    </style>\n  </head>\n  <body>\n    <div id=\"container\">\n      <div id=\"info\">\n        On devices with limited RAM, it is important to limit the response size\n        of API calls. This example demonstrates how to fetch a large\n        data in smaller chunks, and guarantee its integrity.\n        Data gets returned in a series of request/response transactions,\n        where each response is small enough to fit into available device RAM.\n        <br/><br/>\n        Data integrity is implemented by versioning.\n        The idea is that the first response includes the current \"version\" of the\n        data, and that version is passed to all subsequent requests.\n        If data version changes in the middle of the request series,\n        client fails with 'wrong version' error.\n      </div>\n      <button id=\"btn\">fetch data</button>\n      <div id=\"result\"></div>\n    </div>\n  </body>\n  <script>\n    const getchunk = (start, version) =>\n      fetch('/api/data', {method: 'POST', body:JSON.stringify({start, version})})\n        .then(r => r.json());\n    document.getElementById('btn').onclick = function() {\n      var data = [], version = 0;\n      const load = offset => getchunk(offset, version)\n        .then(r => {\n          // console.log(r);\n          if (r.error) {\n            document.getElementById('result').innerText = 'Error: ' + r.error;\n          } else {\n            version = r.version;\n            data = data.concat(r.data);\n            if (r.data.length == 0) {\n              document.getElementById('result').innerText = 'Version: ' +\n                version + ', data: \\n' +\n                JSON.stringify(data, null, 2);\n            } else {\n              load(offset + r.data.length, version);\n            }\n          }\n        });\n      load(0);\n    };\n  </script>\n</html>\n"
  },
  {
    "path": "tutorials/http/redirect-to-https/Makefile",
    "content": "PROG ?= example                   # Program we are building\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c       # Source code files\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n#CFLAGS += -fsanitize=address,undefined,alignment\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += -DMG_HTTP_DIRLIST_TIME_FMT=\"%Y/%m/%d %H:%M:%S\"\nCFLAGS_MONGOOSE += -DMG_ENABLE_LINES=1 -DMG_ENABLE_IPV6=1 -DMG_ENABLE_SSI=1\nCFLAGS_EXTRA ?= -DMG_TLS=MG_TLS_BUILTIN\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= example.exe           # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32 -lbcrypt   # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\nendif\n\nall: $(PROG)              # Default target. Build and run program\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)       # Build program from sources\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nvc98:\n\tcl $(SOURCES) -DMG_ENABLE_SSI=1 -DMG_TLS=MG_TLS_BUILTIN\n\nclean:                    # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM\n"
  },
  {
    "path": "tutorials/http/redirect-to-https/main.c",
    "content": "// Copyright (c) 2026 Cesanta Software Limited\n// All rights reserved\n\n#include \"mongoose.h\"\n\nstatic int s_debug_level = MG_LL_DEBUG;\nstatic const char *s_http_addr = \"http://0.0.0.0:8000\";\nstatic const char *s_https_addr = \"https://0.0.0.0:8443\";\n\n// Self signed certificates, see\n// https://github.com/cesanta/mongoose/blob/master/test/certs/generate.sh\nstatic const char *s_tls_cert =\n    \"-----BEGIN CERTIFICATE-----\\n\"\n    \"MIIBMTCB2aADAgECAgkAluqkgeuV/zUwCgYIKoZIzj0EAwIwEzERMA8GA1UEAwwI\\n\"\n    \"TW9uZ29vc2UwHhcNMjQwNTA3MTQzNzM2WhcNMzQwNTA1MTQzNzM2WjARMQ8wDQYD\\n\"\n    \"VQQDDAZzZXJ2ZXIwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAASo3oEiG+BuTt5y\\n\"\n    \"ZRyfwNr0C+SP+4M0RG2pYkb2v+ivbpfi72NHkmXiF/kbHXtgmSrn/PeTqiA8M+mg\\n\"\n    \"BhYjDX+zoxgwFjAUBgNVHREEDTALgglsb2NhbGhvc3QwCgYIKoZIzj0EAwIDRwAw\\n\"\n    \"RAIgTXW9MITQSwzqbNTxUUdt9DcB+8pPUTbWZpiXcA26GMYCIBiYw+DSFMLHmkHF\\n\"\n    \"+5U3NXW3gVCLN9ntD5DAx8LTG8sB\\n\"\n    \"-----END CERTIFICATE-----\\n\";\n\nstatic const char *s_tls_key =\n    \"-----BEGIN EC PRIVATE KEY-----\\n\"\n    \"MHcCAQEEIAVdo8UAScxG7jiuNY2UZESNX/KPH8qJ0u0gOMMsAzYWoAoGCCqGSM49\\n\"\n    \"AwEHoUQDQgAEqN6BIhvgbk7ecmUcn8Da9Avkj/uDNERtqWJG9r/or26X4u9jR5Jl\\n\"\n    \"4hf5Gx17YJkq5/z3k6ogPDPpoAYWIw1/sw==\\n\"\n    \"-----END EC PRIVATE KEY-----\\n\";\n\n// HTTPS listener serves requests\nstatic void https_ev_handler(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_ACCEPT && c->is_tls) {\n    struct mg_tls_opts opts;\n    memset(&opts, 0, sizeof(opts));\n    opts.cert = mg_str(s_tls_cert);\n    opts.key = mg_str(s_tls_key);\n    mg_tls_init(c, &opts);\n  }\n\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    if (mg_match(hm->uri, mg_str(\"/api/hello\"), NULL)) {\n      mg_http_reply(c, 200, \"\", \"{%m:%d}\\n\", MG_ESC(\"status\"), 1);\n    } else {\n      mg_http_reply(c, 200, \"\", \"Hi! Curent time is %llu\", mg_now());\n    }\n  }\n}\n\n// HTTP listener sends redirects to HTTPS\nstatic void http_ev_handler(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    char buf[256];\n    mg_snprintf(buf, sizeof(buf), \"Location: https://%M:%u%.*s\\r\\n\",\n                mg_print_ip, &c->loc, mg_url_port(s_https_addr), hm->uri.len,\n                hm->uri.buf);\n    // If you want to redirect to a name, you must provide a redirection URL:\n    // - static const char *s_https_redirect_addr = \"https://yourname:port\"\n    // - mg_snprintf(buf, sizeof(buf), \"Location: %s%.*s\\r\\n\",\n    //               s_https_redirect_addr, hm->uri.len, hm->uri.buf);\n    mg_http_reply(c, 302, buf, \"%s\", buf);  // 302 redirect\n  }\n}\n\nint main(void) {\n  struct mg_mgr mgr;\n\n  mg_log_set(s_debug_level);\n  mg_mgr_init(&mgr);\n\n  if (mg_http_listen(&mgr, s_http_addr, http_ev_handler, NULL) == NULL) {\n    exit(EXIT_FAILURE);\n  }\n\n  if (mg_http_listen(&mgr, s_https_addr, https_ev_handler, NULL) == NULL) {\n    exit(EXIT_FAILURE);\n  }\n\n  MG_INFO((\"Mongoose version : v%s\", MG_VERSION));\n  MG_INFO((\"HTTP listener    : %s\", s_http_addr));\n  MG_INFO((\"HTTPS listener   : %s\", s_https_addr));\n  for (;;) {\n    mg_mgr_poll(&mgr, 1000);\n  }\n\n  mg_mgr_free(&mgr);\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/http/singleton-client/Makefile",
    "content": "PROG ?= example                   # Program we are building\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c       # Source code files\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n#CFLAGS += -fsanitize=address,undefined,alignment\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += -DMG_ENABLE_LINES=1\nCFLAGS_EXTRA ?= -DMG_TLS=MG_TLS_BUILTIN\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= example.exe           # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32 -lbcrypt   # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\nendif\n\nall: $(PROG)              # Default target. Build and run program\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)       # Build program from sources\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nclean:                    # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM\n"
  },
  {
    "path": "tutorials/http/singleton-client/main.c",
    "content": "// Copyright (c) 2026 Cesanta Software Limited\n// All rights reserved\n//\n// This example shows how we can poll an external HTTP server periodically, and\n// make sure that not more than one instance of the active request in flight.\n// Each request has a configured timeout.\n\n#include \"mongoose.h\"\n\nstatic const char *s_url = \"https://mongoose.ws/tls/api/ca\";\nstatic const char *s_post_data = \"hi\";\nstatic const uint64_t s_connect_timeout_ms = 5500;  // milliseconds\nstatic struct mg_connection *s_conn = NULL;\n\n// TLS certificate, obtained using https://mongoose.ws/tls/\n#define TLS_CA                                                         \\\n  \"-----BEGIN CERTIFICATE-----\\n\"                                      \\\n  \"MIIEVjCCAj6gAwIBAgIQY5WTY8JOcIJxWRi/w9ftVjANBgkqhkiG9w0BAQsFADBP\\n\" \\\n  \"MQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJuZXQgU2VjdXJpdHkgUmVzZWFy\\n\" \\\n  \"Y2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBYMTAeFw0yNDAzMTMwMDAwMDBa\\n\" \\\n  \"Fw0yNzAzMTIyMzU5NTlaMDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBF\\n\" \\\n  \"bmNyeXB0MQswCQYDVQQDEwJFODB2MBAGByqGSM49AgEGBSuBBAAiA2IABNFl8l7c\\n\" \\\n  \"S7QMApzSsvru6WyrOq44ofTUOTIzxULUzDMMNMchIJBwXOhiLxxxs0LXeb5GDcHb\\n\" \\\n  \"R6EToMffgSZjO9SNHfY9gjMy9vQr5/WWOrQTZxh7az6NSNnq3u2ubT6HTKOB+DCB\\n\" \\\n  \"9TAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0lBBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMB\\n\" \\\n  \"MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFI8NE6L2Ln7RUGwzGDhdWY4j\\n\" \\\n  \"cpHKMB8GA1UdIwQYMBaAFHm0WeZ7tuXkAXOACIjIGlj26ZtuMDIGCCsGAQUFBwEB\\n\" \\\n  \"BCYwJDAiBggrBgEFBQcwAoYWaHR0cDovL3gxLmkubGVuY3Iub3JnLzATBgNVHSAE\\n\" \\\n  \"DDAKMAgGBmeBDAECATAnBgNVHR8EIDAeMBygGqAYhhZodHRwOi8veDEuYy5sZW5j\\n\" \\\n  \"ci5vcmcvMA0GCSqGSIb3DQEBCwUAA4ICAQBnE0hGINKsCYWi0Xx1ygxD5qihEjZ0\\n\" \\\n  \"RI3tTZz1wuATH3ZwYPIp97kWEayanD1j0cDhIYzy4CkDo2jB8D5t0a6zZWzlr98d\\n\" \\\n  \"AQFNh8uKJkIHdLShy+nUyeZxc5bNeMp1Lu0gSzE4McqfmNMvIpeiwWSYO9w82Ob8\\n\" \\\n  \"otvXcO2JUYi3svHIWRm3+707DUbL51XMcY2iZdlCq4Wa9nbuk3WTU4gr6LY8MzVA\\n\" \\\n  \"aDQG2+4U3eJ6qUF10bBnR1uuVyDYs9RhrwucRVnfuDj29CMLTsplM5f5wSV5hUpm\\n\" \\\n  \"Uwp/vV7M4w4aGunt74koX71n4EdagCsL/Yk5+mAQU0+tue0JOfAV/R6t1k+Xk9s2\\n\" \\\n  \"HMQFeoxppfzAVC04FdG9M+AC2JWxmFSt6BCuh3CEey3fE52Qrj9YM75rtvIjsm/1\\n\" \\\n  \"Hl+u//Wqxnu1ZQ4jpa+VpuZiGOlWrqSP9eogdOhCGisnyewWJwRQOqK16wiGyZeR\\n\" \\\n  \"xs/Bekw65vwSIaVkBruPiTfMOo0Zh4gVa8/qJgMbJbyrwwG97z/PRgmLKCDl8z3d\\n\" \\\n  \"tA0Z7qq7fta0Gl24uyuB05dqI5J1LvAzKuWdIjT1tP8qCoxSE/xpix8hX2dt3h+/\\n\" \\\n  \"jujUgFPFZ0EVZ0xSyBNRF3MboGZnYXFUxpNjTWPKpagDHJQmqrAcDmWJnMsFY3jS\\n\" \\\n  \"u1igv3OefnWjSQ==\\n\"                                                 \\\n  \"-----END CERTIFICATE-----\"\n\nstatic void http_ev_handler(struct mg_connection *c, int ev, void *ev_data) {\n  uint64_t *start_time = (uint64_t *) c->data;  // Stored start time\n  bool *success = (bool *) (start_time + 1);    // Stored success flag\n  if (ev == MG_EV_OPEN) {\n    *start_time = mg_millis();\n    MG_DEBUG((\"%lu Connection started, time: %llu\", c->id, *start_time));\n  } else if (ev == MG_EV_POLL) {\n    if (*start_time + s_connect_timeout_ms < mg_millis()) {\n      mg_error(c, \"Connect timeout\");\n    }\n  } else if (ev == MG_EV_CONNECT) {\n    // Connected to server. Extract host name from URL\n    struct mg_str host = mg_url_host(s_url);\n    if (c->is_tls) {\n      struct mg_tls_opts opts = {};\n      opts.ca = mg_str(TLS_CA);\n      opts.name = host;\n      mg_tls_init(c, &opts);\n    }\n    // Send request\n    int content_length = s_post_data ? strlen(s_post_data) : 0;\n    mg_printf(c,\n              \"%s %s HTTP/1.0\\r\\n\"\n              \"Host: %.*s\\r\\n\"\n              \"Content-Type: octet-stream\\r\\n\"\n              \"Content-Length: %d\\r\\n\"\n              \"\\r\\n\",\n              s_post_data ? \"POST\" : \"GET\", mg_url_uri(s_url), host.len,\n              host.buf, content_length);\n    mg_send(c, s_post_data, content_length);\n  } else if (ev == MG_EV_HTTP_MSG) {\n    // Response is received. Print it\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    MG_INFO((\"%lu Got response %lu bytes %lu\", c->id, hm->body.len, c->rtls.len));\n    *success = true;\n    c->is_closing = 1;\n  } else if (ev == MG_EV_ERROR) {\n    MG_ERROR((\"%lu Connection error: %s\", c->id, ev_data));\n  } else if (ev == MG_EV_CLOSE) {\n    MG_DEBUG((\"%lu Connection closed %lu\", c->id, mg_millis() - *start_time));\n    if (*success == false) MG_ERROR((\"%lu NO RESPONSE %lu\", c->id, c->rtls.len));\n    if (c->is_draining == 0) s_conn = NULL;\n  }\n}\n\nstatic void timer_fn(void *arg) {\n  struct mg_mgr *mgr = (struct mg_mgr *) arg;\n  // If connection is already there, do nothing. Otherwise, start it\n  if (s_conn != NULL) {\n    MG_DEBUG((\"Connection is already active...\"));\n  } else {\n    s_conn = mg_http_connect(mgr, s_url, http_ev_handler, NULL);\n  }\n}\n\nint main(void) {\n  struct mg_mgr mgr;\n  mg_log_set(MG_LL_INFO);\n  mg_mgr_init(&mgr);\n\n  // Attempt to start a POST request frequently\n  mg_timer_add(&mgr, 50, MG_TIMER_REPEAT, timer_fn, &mgr);\n\n  for (;;) mg_mgr_poll(&mgr, 10);\n  mg_mgr_free(&mgr);\n\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/http/uart-bridge/Makefile",
    "content": "PROG ?= example                   # Program we are building\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c net.c packed_fs.c      # Source code files\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += -DMG_ENABLE_PACKED_FS=1 -DMG_ENABLE_LINES=1\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= example.exe           # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\nendif\n\nall: $(PROG)              # Default target. Build and run program\n\t$(RUN) ./$(PROG) $(ARGS)\n\nifneq ($(OS),Windows_NT)\n# Before embedding files, gzip them to save space\npacked_fs.c: $(shell find web_root -type f) Makefile\n\trm -rf tmp/web_root && mkdir tmp && cp -r web_root tmp/\n\tfind tmp -type f | xargs -n1 gzip\n\t$(CC) ../../../test/pack.c -o pack\n\tcd tmp && ../pack `find web_root -type f` > ../$@\nendif\n\n$(PROG): $(SOURCES)       # Build program from sources\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nclean:                    # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM pack tmp\n\n\n"
  },
  {
    "path": "tutorials/http/uart-bridge/README.md",
    "content": "# A UART to network bridge\n\nThis example is a demonstration of how Mongoose Library could be integrated\ninto an embedded device and provide a UART-to-Network bridge capability:\n\n- The device opens listening TCP and Websocket ports and waits for connections\n- When a client connects, data is exchanged with the device's UART\n- Everything the client sends, is sent to the UART\n- Everything that is read from the UART, gets sent to the client\n- Multiple clients are allowed\n- Live UART console allows to talk to the UART from the web page\n- Web UI is hardcoded into the binary and does not need a filesystem\n\nSee a detailed tutorial at https://mongoose.ws/tutorials/uart-bridge/\n"
  },
  {
    "path": "tutorials/http/uart-bridge/esp32/CMakeLists.txt",
    "content": "# The following lines of boilerplate have to be in your project's\n# CMakeLists in this exact order for cmake to work correctly\ncmake_minimum_required(VERSION 3.5)\n\ninclude($ENV{IDF_PATH}/tools/cmake/project.cmake)\nproject(mongoose-esp32-example)\n"
  },
  {
    "path": "tutorials/http/uart-bridge/esp32/Makefile",
    "content": "CWD = $(realpath $(CURDIR))\nMNT = $(realpath $(CURDIR)/../../../..)\nPORT ?= /dev/ttyUSB0\nCMD ?= build\n\nall: example\n\nexample:\n\ttrue\n\nbuild: Makefile $(wildcard main/*)\n\tdocker run --rm $(DA) -v $(MNT):$(MNT) -w $(CWD) espressif/idf idf.py $(CMD)\n\nflash:\nflash: CMD = flash\nflash: DA = --device $(PORT)\nflash: build\n\n.PHONY: build\n\nbridge.hex: build\n\tesputil mkhex \\\n\t\t0x8000 build/partition_table/partition-table.bin \\\n\t\t0x1000 build/bootloader/bootloader.bin \\\n\t\t0x100000 build/mongoose-esp32-example.bin > $@\n\nflash2: bridge.hex\n\tesputil -p $(PORT) -b 921600 -fp 0x220 flash bridge.hex\n\tesputil -p $(PORT) monitor\n\nclean:\n\trm -rf build\n"
  },
  {
    "path": "tutorials/http/uart-bridge/esp32/README.md",
    "content": "# A UART to network bridge for ESP32\n\n![](../../uart-bridge/screenshots/dashboard.png)\n\n- See detailed tutorial at https://mongoose.ws/tutorials/esp32/uart-bridge/\n\n## Flash pre-built firmware\n\nYou can flash a pre-built firmware to the ESP32 device using the following\ninstructions:\n\n1. Connect your ESP32 device to the workstation. It should be accessible\n   via a serial port\n2. Download and unzip ESP32 flashing tool from https://mongoose.ws/downloads/esputil.zip\n3. Download a prebuilt firmware https://mongoose.ws/downloads/uart-bridge.hex into the unzipped directory\n4. Start command prompt (or terminal on Mac/Linux). Run `cd\n  PATH/TO/esputil`  to go into the unzipped `esputil/` directory. After that, run\n  the following command (change `COMPORT` to the board's serial port):\n\n  | OS      | Command |\n  | ------- | ------- |\n  | Windows | <pre><code class=\"language-bash\">.\\windows\\esputil -p COMPORT flash uart-bridge.hex</code></pre>|\n  | Linux   | <pre><code class=\"language-bash\">./linux/esputil -p COMPORT flash uart-bridge.hex</pre> |\n  | MacOS   | <pre><code class=\"language-bash\">./macos/esputil -p COMPORT flash uart-bridge.hex</code></pre> |\n\nNext step is to monitor and follow the instructions.\n\n```sh\nesputil -p COMPORT monitor\n```\n\nNote: if monitor command shows constant restarts, the flash parameters\nsettings can be wrong. Reflash your device with `-fp ...` flash parameters\nsettings. For example, WROOM-32 based boards use `-fp 0x220`:\n\n```sh\nesputil -p COMPORT -fp 0x220 flash uart-bridge.hex\n```\n\nFor more on possible options for flash parameters, see\nhttps://github.com/cpq/esputil#flash-parameters\n"
  },
  {
    "path": "tutorials/http/uart-bridge/esp32/main/CMakeLists.txt",
    "content": "idf_component_register(SRCS \"main.c\"\n                            \"wifi.c\"\n                            \"uart.c\"\n                            \"cli.c\"\n                            \"net.c\"\n                            \"packed_fs.c\"\n                            \"mongoose.c\")\ncomponent_compile_options(-DUART_API_IMPLEMENTED=1)\n"
  },
  {
    "path": "tutorials/http/uart-bridge/esp32/main/cli.c",
    "content": "#include \"main.h\"\n\nstatic void cli_wifi(const char *ssid, const char *pass) {\n  if (wifi_init(ssid, pass)) {\n    mg_file_printf(&mg_fs_posix, WIFI_FILE, \"{%m:%m,%m:%m}\\n\", mg_print_esc, 0,\n                   \"ssid\", mg_print_esc, 0, ssid, mg_print_esc, 0, \"pass\",\n                   mg_print_esc, 0, pass);\n    MG_INFO((\"Reboot now\"));\n  }\n}\n\nstatic void cli_ls(void) {\n  DIR *dirp = opendir(FS_ROOT);\n  struct dirent *dp;\n  if (dirp == NULL) {\n    MG_ERROR((\"Cannot open FS: %d\", errno));\n  } else {\n    while ((dp = readdir(dirp)) != NULL) {\n      /* Do not show current and parent dirs */\n      if (strcmp((const char *) dp->d_name, \".\") == 0 ||\n          strcmp((const char *) dp->d_name, \"..\") == 0) {\n        continue;\n      } else {\n        printf(\"%s\\n\", dp->d_name);\n      }\n    }\n    closedir(dirp);\n  }\n}\n\nstatic void cli_cat(const char *fname) {\n  char path[MG_PATH_MAX];\n  snprintf(path, sizeof(path), \"%s/%s\", FS_ROOT, fname);\n  FILE *fp = fopen(path, \"r\");\n  if (fp != NULL) {\n    int ch;\n    while ((ch = fgetc(fp)) != EOF) putchar(ch);\n    fclose(fp);\n  }\n}\n\nstatic void cli_rm(const char *fname) {\n  char path[100];\n  snprintf(path, sizeof(path), \"%s/%s\", FS_ROOT, fname);\n  remove(path);\n}\n\nstatic struct mg_iobuf in;\n\nvoid cli(uint8_t input_byte) {\n  if (input_byte == 0 || input_byte == 0xff) return;\n  if (in.len >= 128) in.len = 0;\n  mg_iobuf_add(&in, in.len, &input_byte, sizeof(input_byte));\n\n  if (input_byte == '\\n') {\n    const char *arrow = \"---\";\n    char buf0[10], buf1[50], buf2[250];\n\n    in.buf[in.len] = '\\0';\n    buf0[0] = buf1[0] = buf2[0] = '\\0';\n    sscanf((char *) in.buf, \"%9s %49s %249[^\\r\\n]\", buf0, buf1, buf2);\n\n    printf(\"%s CLI command: '%s'\\n\", arrow, buf0);\n    if (strcmp(buf0, \"reboot\") == 0) {\n      esp_restart();\n    } else if (strcmp(buf0, \"ls\") == 0) {\n      cli_ls();\n    } else if (strcmp(buf0, \"cat\") == 0) {\n      cli_cat(buf1);\n    } else if (strcmp(buf0, \"rm\") == 0) {\n      cli_rm(buf1);\n    } else if (strcmp(buf0, \"reboot\") == 0) {\n      esp_restart();\n    } else if (strcmp(buf0, \"ll\") == 0) {\n      mg_log_set(atoi(buf1));\n    } else if (strcmp(buf0, \"wifi\") == 0) {\n      cli_wifi(buf1, buf2);\n    } else {\n      printf(\"%s %s\\n\", arrow, \"Unknown command. Usage:\");\n      printf(\"%s %s\\n\", arrow, \"  set NAME VALUE\");\n      printf(\"%s %s\\n\", arrow, \"  rm FILENAME\");\n      printf(\"%s %s\\n\", arrow, \"  cat FILENAME\");\n      printf(\"%s %s\\n\", arrow, \"  ls\");\n      printf(\"%s %s\\n\", arrow, \"  reboot\");\n      printf(\"%s %s\\n\", arrow, \"  wifi WIFI_NET WIFI_PASS\");\n    }\n    printf(\"%s %s\\n\", arrow, \"CLI output end\");\n    in.len = 0;\n  }\n}\n\nvoid cli_init(void) {\n  mg_iobuf_init(&in, 0, 32);\n}\n"
  },
  {
    "path": "tutorials/http/uart-bridge/esp32/main/main.c",
    "content": "// Copyright (c) 2020 Cesanta Software Limited\n// All rights reserved\n\n#include \"main.h\"\n\nconst char *s_listening_url = \"http://0.0.0.0:80\";\n\nstruct mg_str config_read(void) {\n  return mg_file_read(&mg_fs_posix, FS_ROOT \"/config.json\");\n}\n\nvoid config_write(struct mg_str config) {\n  mg_file_write(&mg_fs_posix, FS_ROOT \"/config.json\", config.buf, config.len);\n}\n\nvoid app_main(void) {\n  // Mount filesystem\n  esp_vfs_spiffs_conf_t conf = {\n      .base_path = FS_ROOT, .max_files = 20, .format_if_mount_failed = true};\n  int res = esp_vfs_spiffs_register(&conf);\n  MG_INFO((\"FS at %s initialised, status: %d\", conf.base_path, res));\n\n  // Try to connect to wifi by using saved WiFi credentials\n  struct mg_str json = mg_file_read(&mg_fs_posix, WIFI_FILE);\n  if (json.buf != NULL) {\n    char *ssid = mg_json_get_str(json, \"$.ssid\");\n    char *pass = mg_json_get_str(json, \"$.pass\");\n    while (!wifi_init(ssid, pass)) (void) 0;\n    mg_free(ssid);\n    mg_free(pass);\n    mg_free((void *) json.buf);\n  } else {\n    // If WiFi is not configured, run CLI until configured\n    MG_INFO((\"WiFi is not configured, running CLI. Press enter\"));\n    cli_init();\n    for (;;) {\n      uint8_t ch = getchar();\n      cli(ch);\n      usleep(10000);\n    }\n  }\n\n  // Connected to WiFi, now start HTTP server\n  struct mg_mgr mgr;\n  mg_mgr_init(&mgr);\n  mg_log_set(MG_LL_DEBUG);  // Set log level\n  MG_INFO((\"Mongoose v%s on %s\", MG_VERSION, s_listening_url));\n  mg_http_listen(&mgr, s_listening_url, uart_bridge_fn, NULL);\n  for (;;) mg_mgr_poll(&mgr, 10);  // Infinite event loop\n}\n"
  },
  {
    "path": "tutorials/http/uart-bridge/esp32/main/main.h",
    "content": "#pragma once\n\n#include \"mongoose.h\"\n\n#include \"driver/gpio.h\"\n#include \"driver/uart.h\"\n#include \"esp_spiffs.h\"\n#include \"freertos/FreeRTOS.h\"\n\n#define FS_ROOT \"/spiffs\"\n#define WIFI_FILE FS_ROOT \"/wifi.json\"\n#define UART_NO 1\n\nvoid uart_bridge_fn(struct mg_connection *, int, void *);\nint uart_read(void *buf, size_t len);\nbool wifi_init(const char *ssid, const char *pass);\nvoid cli(uint8_t ch);\nvoid cli_init(void);\n"
  },
  {
    "path": "tutorials/http/uart-bridge/esp32/main/mongoose_config.h",
    "content": "#define MG_ARCH MG_ARCH_ESP32\n\n#define MG_ENABLE_PACKED_FS 1\n"
  },
  {
    "path": "tutorials/http/uart-bridge/esp32/main/uart.c",
    "content": "#include \"main.h\"\n#include \"esp_idf_version.h\"  // < 3.3 not supported, sadly\n\nint uart_close(int no) {\n  return uart_driver_delete(no);\n}\n\nint uart_open(int no, int rx, int tx, int cts, int rts, int baud) {\n  uart_config_t uart_config = {\n      .baud_rate = baud,\n      .data_bits = UART_DATA_8_BITS,\n      .parity = UART_PARITY_DISABLE,\n      .stop_bits = UART_STOP_BITS_1,\n      .flow_ctrl = cts > 0 && rts > 0 ? UART_HW_FLOWCTRL_CTS_RTS\n                   : cts > 0          ? UART_HW_FLOWCTRL_CTS\n                   : rts > 0          ? UART_HW_FLOWCTRL_RTS\n                                      : UART_HW_FLOWCTRL_DISABLE,\n  };\n  int e1 = uart_param_config(no, &uart_config);\n  int e2 = uart_set_pin(no, tx, rx, rts, cts);\n  int e3 =\n#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 2, 5)\n      uart_driver_install(no, UART_HW_FIFO_LEN(no) * 2, UART_HW_FIFO_LEN(no) * 2, 0, NULL, 0);\n#else\n      uart_driver_install(no, UART_FIFO_LEN * 2, UART_FIFO_LEN * 2, 0, NULL, 0);\n#endif\n  MG_INFO((\"%d: %d/%d/%d, %d %d %d\", no, rx, tx, baud, e1, e2, e3));\n  if (e1 != ESP_OK || e2 != ESP_OK || e3 != ESP_OK) return -1;\n  return no;\n}\n\nvoid uart_init(int tx, int rx, int baud) {\n  uart_open(UART_NO, rx, tx, -1, -1, baud);\n}\n\nint uart_read(void *buf, size_t len) {\n  size_t x = 0;\n  int no = UART_NO;\n  if (uart_get_buffered_data_len(no, &x) != ESP_OK || x == 0) return 0;\n  int n = uart_read_bytes(no, buf, len, 10 / portTICK_PERIOD_MS);\n  MG_DEBUG((\"%d bytes: [%.*s]\", n, n, (char *) buf));\n  return n;\n}\n\nint uart_write(const void *buf, int len) {\n  int no = UART_NO;\n  MG_DEBUG((\"%d bytes: [%.*s]\", len, len, (char *) buf));\n  return uart_write_bytes(no, (const char *) buf, len);\n}\n"
  },
  {
    "path": "tutorials/http/uart-bridge/esp32/main/wifi.c",
    "content": "// Code taken from the ESP32 IDF WiFi station Example\n\n#include <string.h>\n#include \"esp_event.h\"\n#include \"esp_log.h\"\n#include \"esp_system.h\"\n#include \"esp_wifi.h\"\n#include \"freertos/FreeRTOS.h\"\n#include \"freertos/event_groups.h\"\n#include \"freertos/task.h\"\n#include \"nvs_flash.h\"\n\n#include \"lwip/err.h\"\n#include \"lwip/sys.h\"\n\n#include \"mongoose.h\"\n\nstatic EventGroupHandle_t s_wifi_event_group;\n\n/* The event group allows multiple bits for each event, but we only care about\n * two events:\n * - we are connected to the AP with an IP\n * - we failed to connect after the maximum amount of retries */\n#define WIFI_CONNECTED_BIT BIT0\n#define WIFI_FAIL_BIT BIT1\n\nstatic int s_retry_num = 0;\n\nstatic void event_handler(void *arg, esp_event_base_t event_base,\n                          int32_t event_id, void *event_data) {\n  if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {\n    esp_wifi_connect();\n  } else if (event_base == WIFI_EVENT &&\n             event_id == WIFI_EVENT_STA_DISCONNECTED) {\n    if (s_retry_num < 3) {\n      esp_wifi_connect();\n      s_retry_num++;\n      MG_INFO((\"retry to connect to the AP\"));\n    } else {\n      xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT);\n    }\n    MG_ERROR((\"connect to the AP fail\"));\n  } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {\n    ip_event_got_ip_t *event = (ip_event_got_ip_t *) event_data;\n    MG_INFO((\"IP ADDRESS: \" IPSTR \". Go to:\", IP2STR(&event->ip_info.ip)));\n    MG_INFO((\"http://\" IPSTR, IP2STR(&event->ip_info.ip)));\n    s_retry_num = 0;\n    xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT);\n  }\n}\n\nbool wifi_init(const char *ssid, const char *pass) {\n  bool result = false;\n  esp_err_t ret = nvs_flash_init();\n  if (ret == ESP_ERR_NVS_NO_FREE_PAGES ||\n      ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {\n    ESP_ERROR_CHECK(nvs_flash_erase());\n    ret = nvs_flash_init();\n  }\n  ESP_ERROR_CHECK(ret);\n\n  s_wifi_event_group = xEventGroupCreate();\n\n  ESP_ERROR_CHECK(esp_netif_init());\n\n  ESP_ERROR_CHECK(esp_event_loop_create_default());\n  esp_netif_create_default_wifi_sta();\n\n  wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();\n  ESP_ERROR_CHECK(esp_wifi_init(&cfg));\n\n  esp_event_handler_instance_t instance_any_id;\n  esp_event_handler_instance_t instance_got_ip;\n  ESP_ERROR_CHECK(esp_event_handler_instance_register(\n      WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler, NULL, &instance_any_id));\n  ESP_ERROR_CHECK(esp_event_handler_instance_register(\n      IP_EVENT, IP_EVENT_STA_GOT_IP, &event_handler, NULL, &instance_got_ip));\n\n  wifi_config_t c = {.sta = {.threshold = {.authmode = WIFI_AUTH_WPA2_PSK},\n                             .pmf_cfg = {.capable = true, .required = false}}};\n  snprintf((char *) c.sta.ssid, sizeof(c.sta.ssid), \"%s\", ssid);\n  snprintf((char *) c.sta.password, sizeof(c.sta.password), \"%s\", pass);\n  ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));\n  ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &c));\n  ESP_ERROR_CHECK(esp_wifi_start());\n  MG_DEBUG((\"wifi_init_sta finished.\"));\n\n  EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group,\n                                         WIFI_CONNECTED_BIT | WIFI_FAIL_BIT,\n                                         pdFALSE, pdFALSE, portMAX_DELAY);\n\n  if (bits & WIFI_CONNECTED_BIT) {\n    MG_INFO((\"connected to ap SSID:%s\", ssid));\n    result = true;\n  } else if (bits & WIFI_FAIL_BIT) {\n    MG_ERROR((\"Failed to connect to SSID:%s, password:%s\", ssid, pass));\n  } else {\n    MG_ERROR((\"UNEXPECTED EVENT\"));\n  }\n\n  /* The event will not be processed after unregister */\n  ESP_ERROR_CHECK(esp_event_handler_instance_unregister(\n      IP_EVENT, IP_EVENT_STA_GOT_IP, instance_got_ip));\n  ESP_ERROR_CHECK(esp_event_handler_instance_unregister(\n      WIFI_EVENT, ESP_EVENT_ANY_ID, instance_any_id));\n  vEventGroupDelete(s_wifi_event_group);\n  return result;\n}\n"
  },
  {
    "path": "tutorials/http/uart-bridge/esp32/make",
    "content": ""
  },
  {
    "path": "tutorials/http/uart-bridge/esp32/partitions.csv",
    "content": "# Name,   Type, SubType, Offset,  Size, Flags\nnvs,      data, nvs,     0x9000,  0x6000,\nphy_init, data, phy,     0xf000,  0x1000,\nstorage,  data, spiffs,  0x10000, 0x10000,\nfactory,  app,  factory, 0x100000, 1M,\n"
  },
  {
    "path": "tutorials/http/uart-bridge/esp32/sdkconfig.defaults",
    "content": "CONFIG_PARTITION_TABLE_CUSTOM=y\nCONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions.csv\"\nCONFIG_PARTITION_TABLE_FILENAME=\"partitions.csv\"\n#CONFIG_ESP_MAIN_TASK_STACK_SIZE=8192\n"
  },
  {
    "path": "tutorials/http/uart-bridge/main.c",
    "content": "// Copyright (c) 2022 Cesanta Software Limited\n// All rights reserved\n\n#include \"mongoose.h\"\nconst char *s_listening_url = \"http://0.0.0.0:8000\";\n\nvoid uart_bridge_fn(struct mg_connection *, int, void *);\n\nint main(void) {\n  struct mg_mgr mgr;\n  mg_log_set(MG_LL_DEBUG);\n  mg_mgr_init(&mgr);\n  mg_http_listen(&mgr, s_listening_url, uart_bridge_fn, &mgr);\n  MG_INFO((\"Listening on %s\", s_listening_url));\n  while (mgr.conns != NULL) mg_mgr_poll(&mgr, 500);\n  mg_mgr_free(&mgr);\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/http/uart-bridge/net.c",
    "content": "// Copyright (c) 2022 Cesanta Software Limited\n// All rights reserved\n\n#include \"mongoose.h\"\n\n#define DEFAULT_TCP \"tcp://0.0.0.0:4001\"\n#define DEFAULT_WEBSOCKET \"ws://0.0.0.0:4002\"\n#define DEFAULT_MQTT \"mqtt://broker.hivemq.com:1883?tx=b/tx&rx=b/rx\"\n\nstruct endpoint {\n  char *url;\n  bool enable;\n  struct mg_connection *c;\n};\n\nstruct state {\n  struct endpoint tcp, websocket, mqtt;\n  int tx, rx, baud;\n} s_state = {.tcp = {.enable = true},\n             .websocket = {.enable = true},\n             .mqtt = {.enable = false},\n             .tx = 5,\n             .rx = 4,\n             .baud = 115200};\n\nvoid uart_init(int tx, int rx, int baud);\nint uart_read(void *buf, size_t len);\nvoid uart_write(const void *buf, size_t len);\nstruct mg_str config_read(void);\nvoid config_write(struct mg_str config);\n\n// Let users define their own UART API. If they don't, use a dummy one\n#if defined(UART_API_IMPLEMENTED)\n#else\nvoid uart_init(int tx, int rx, int baud) {\n  // We use stdin/stdout as UART. Make stdin non-blocking\n#if MG_ARCH != MG_ARCH_WIN32\n  fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);\n#endif\n  (void) tx, (void) rx, (void) baud;\n}\n\nvoid uart_write(const void *buf, size_t len) {\n  fwrite(buf, 1, len, stdout);  // Write to stdout\n  fflush(stdout);\n}\n\nint uart_read(void *buf, size_t len) {\n#if MG_ARCH == MG_ARCH_WIN32\n  (void) buf, (void) len;\n  return 0;\n#else\n  return read(0, buf, len);  // Read from stdin\n#endif\n}\n\nstruct mg_str config_read(void) {\n  return mg_file_read(&mg_fs_posix, \"config.json\");\n}\n\nvoid config_write(struct mg_str config) {\n  mg_file_write(&mg_fs_posix, \"config.json\", config.buf, config.len);\n}\n#endif\n\n// Event handler for a connected Websocket client\nstatic void ws_fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    mg_ws_upgrade(c, ev_data, NULL);\n  } else if (ev == MG_EV_WS_OPEN) {\n    // c->is_hexdumping = 1;\n    c->data[0] = 'W';  // When WS handhake is done, mark us as WS client\n  } else if (ev == MG_EV_WS_MSG) {\n    struct mg_ws_message *wm = (struct mg_ws_message *) ev_data;\n    uart_write(wm->data.buf, wm->data.len);  // Send to UART\n    c->recv.len = 0;                         // Discard received data\n  } else if (ev == MG_EV_CLOSE) {\n    if (c->is_listening) s_state.websocket.c = NULL;\n  }\n}\n\n// Event handler for a connected TCP client\nstatic void tcp_fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_ACCEPT) {\n    // c->is_hexdumping = 1;\n    c->data[0] = 'T';  // When client is connected, mark us as TCP client\n  } else if (ev == MG_EV_READ) {\n    uart_write(c->recv.buf, c->recv.len);  // Send to UART\n    c->recv.len = 0;                       // Discard received data\n  } else if (ev == MG_EV_CLOSE) {\n    if (c->is_listening) s_state.tcp.c = NULL;\n  }\n  (void) ev_data;\n}\n\n// Extract topic name from the MQTT address\nstatic struct mg_str mqtt_topic(const char *name, const char *dflt) {\n  struct mg_str qs = mg_str(strchr(s_state.mqtt.url, '?'));\n  struct mg_str v = mg_http_var(qs, mg_str(name));\n  return v.buf == NULL ? mg_str(dflt) : v;\n}\n\n// Event handler for MQTT connection\nstatic void mq_fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_OPEN) {\n    // c->is_hexdumping = 1;\n  } else if (ev == MG_EV_MQTT_OPEN) {\n    c->data[0] = 'M';\n    struct mg_mqtt_opts sub_opts;\n    memset(&sub_opts, 0, sizeof(sub_opts));\n    sub_opts.topic = mqtt_topic(\"rx\", \"b/rx\");\n    sub_opts.qos = 1;\n    mg_mqtt_sub(c, &sub_opts);  // Subscribe to RX topic\n  } else if (ev == MG_EV_MQTT_MSG) {\n    struct mg_mqtt_message *mm = ev_data;    // MQTT message\n    uart_write(mm->data.buf, mm->data.len);  // Send to UART\n  } else if (ev == MG_EV_CLOSE) {\n    s_state.mqtt.c = NULL;\n  }\n}\n\n// Software timer with a frequency close to the scheduling time slot\nstatic void timer_fn(void *param) {\n  // Start listeners if they're stopped for any reason\n  struct mg_mgr *mgr = (struct mg_mgr *) param;\n  if (s_state.tcp.c == NULL && s_state.tcp.enable) {\n    s_state.tcp.c = mg_listen(mgr, s_state.tcp.url, tcp_fn, 0);\n  }\n  if (s_state.websocket.c == NULL && s_state.websocket.enable) {\n    s_state.websocket.c = mg_http_listen(mgr, s_state.websocket.url, ws_fn, 0);\n  }\n  if (s_state.mqtt.c == NULL && s_state.mqtt.enable) {\n    struct mg_mqtt_opts opts = {.clean = true};\n    s_state.mqtt.c = mg_mqtt_connect(mgr, s_state.mqtt.url, &opts, mq_fn, 0);\n  }\n\n  // Read UART\n  char buf[512];\n  int len = uart_read(buf, sizeof(buf));\n  if (len > 0) {\n    // Iterate over all connections. Send data to WS and TCP clients\n    for (struct mg_connection *c = mgr->conns; c != NULL; c = c->next) {\n      if (c->data[0] == 'W') mg_ws_send(c, buf, len, WEBSOCKET_OP_TEXT);\n      if (c->data[0] == 'T') mg_send(c, buf, len);\n      if (c->data[0] == 'M') {\n        struct mg_mqtt_opts pub_opts;\n        memset(&pub_opts, 0, sizeof(pub_opts));\n        pub_opts.topic = mqtt_topic(\"tx\", \"b/tx\");\n        pub_opts.message = mg_str_n(buf, len);\n        pub_opts.qos = 1, pub_opts.retain = false;\n        mg_mqtt_pub(c, &pub_opts);\n      }\n    }\n  }\n}\n\nstatic void update_string(struct mg_str json, const char *path, char **value) {\n  char *jval;\n  if ((jval = mg_json_get_str(json, path)) != NULL) {\n    mg_free(*value);\n    *value = strdup(jval);\n  }\n}\n\nstatic void config_apply(struct mg_str s) {\n  MG_INFO((\"Applying config: %.*s\", (int) s.len, s.buf));\n\n  bool b;\n  if (mg_json_get_bool(s, \"$.tcp.enable\", &b)) s_state.tcp.enable = b;\n  if (mg_json_get_bool(s, \"$.ws.enable\", &b)) s_state.websocket.enable = b;\n  if (mg_json_get_bool(s, \"$.mqtt.enable\", &b)) s_state.mqtt.enable = b;\n\n  update_string(s, \"$.tcp.url\", &s_state.tcp.url);\n  update_string(s, \"$.mqtt.url\", &s_state.mqtt.url);\n  update_string(s, \"$.ws.url\", &s_state.websocket.url);\n\n  double v;\n  if (mg_json_get_num(s, \"$.rx\", &v)) s_state.rx = (int) v;\n  if (mg_json_get_num(s, \"$.tx\", &v)) s_state.tx = (int) v;\n  if (mg_json_get_num(s, \"$.baud\", &v)) s_state.baud = (int) v;\n\n  if (s_state.mqtt.c) s_state.mqtt.c->is_draining = 1;\n  if (s_state.tcp.c) s_state.tcp.c->is_draining = 1;\n  if (s_state.websocket.c) s_state.websocket.c->is_draining = 1;\n}\n\n// HTTP request handler function\nvoid uart_bridge_fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_OPEN && c->is_listening) {\n    struct mg_str config = mg_file_read(&mg_fs_posix, \"config.json\");\n    if (config.buf != NULL) config_apply(config);\n    mg_free(config.buf);\n    s_state.tcp.url = strdup(DEFAULT_TCP);\n    s_state.websocket.url = strdup(DEFAULT_WEBSOCKET);\n    s_state.mqtt.url = strdup(DEFAULT_MQTT);\n    mg_timer_add(c->mgr, 20, MG_TIMER_REPEAT, timer_fn, c->mgr);\n    uart_init(s_state.tx, s_state.rx, s_state.baud);\n    // mg_log_set(MG_LL_DEBUG);                  // Set log level\n  } else if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    if (mg_match(hm->uri, mg_str(\"/api/hi\"), NULL)) {\n      mg_http_reply(c, 200, \"\", \"hi\\n\");  // Testing endpoint\n    } else if (mg_match(hm->uri, mg_str(\"/api/config/set\"), NULL)) {\n      config_apply(hm->body);\n      config_write(hm->body);\n      mg_http_reply(c, 200, \"\", \"true\\n\");\n    } else if (mg_match(hm->uri, mg_str(\"/api/config/get\"), NULL)) {\n      mg_http_reply(c, 200, \"Content-Type: application/json\\r\\n\",\n                    \"{%m:{%m:%m,%m:%s},%m:{%m:%m,%m:%s},%m:{%m:%m,%m:%s},\"\n                    \"%m:%d,%m:%d,%m:%d}\\n\",\n                    mg_print_esc, 0, \"tcp\", mg_print_esc, 0, \"url\",\n                    mg_print_esc, 0, s_state.tcp.url, mg_print_esc, 0, \"enable\",\n                    s_state.tcp.enable ? \"true\" : \"false\", mg_print_esc, 0,\n                    \"ws\", mg_print_esc, 0, \"url\", mg_print_esc, 0,\n                    s_state.websocket.url, mg_print_esc, 0, \"enable\",\n                    s_state.websocket.enable ? \"true\" : \"false\", mg_print_esc,\n                    0, \"mqtt\", mg_print_esc, 0, \"url\", mg_print_esc, 0,\n                    s_state.mqtt.url, mg_print_esc, 0, \"enable\",\n                    s_state.mqtt.enable ? \"true\" : \"false\", mg_print_esc, 0,\n                    \"rx\", s_state.rx, mg_print_esc, 0, \"tx\", s_state.tx,\n                    mg_print_esc, 0, \"baud\", s_state.baud);\n    } else {\n      struct mg_http_serve_opts opts;\n      memset(&opts, 0, sizeof(opts));\n#if 1\n      opts.root_dir = \"/web_root\";\n      opts.fs = &mg_fs_packed;\n#else\n      opts.root_dir = \"web_root\";\n#endif\n      mg_http_serve_dir(c, ev_data, &opts);\n    }\n  }\n}\n"
  },
  {
    "path": "tutorials/http/uart-bridge/packed_fs.c",
    "content": "#include <stddef.h>\n#include <string.h>\n#include <time.h>\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\nconst char *mg_unlist(size_t no);\nconst char *mg_unpack(const char *, size_t *, time_t *);\n#if defined(__cplusplus)\n}\n#endif\n\nstatic const unsigned char v1[] = {\n  31, 139,   8,   8,  67, 234, 193, 103,   0,   3, 105, 110, // ....C..g..in\n 100, 101, 120,  46, 104, 116, 109, 108,   0,  93, 144, 177, // dex.html.]..\n  78, 196,  48,  12, 134, 247, 123, 138, 144, 153, 180, 176, // N.0...{.....\n  49,  36, 149, 208, 245,   6,  38,  24,  64, 130,  49,  77, // 1$....&.@.1M\n 124,  23,  67, 154, 148, 196, 237, 169, 111,  79, 218,  30, // |.C.....oO..\n 226, 196, 100, 255, 246, 103, 203, 254, 229,  77, 251, 188, // ..d..g...M..\n 127, 253, 120,  57,  48,  71, 189, 111, 118, 114,   9, 204, // ..x90G.ovr..\n 235, 112,  82,  28,   2, 111, 118, 140,  73,   7, 218,  46, // .pR..ov.I...\n  73,  73,   9, 201,  67, 211, 194, 132,   6,  88, 171, 179, // II..C....X..\n 235, 162,  78,  86, 214,  91, 125,  99, 122,  32, 205, 140, // ..NV.[}cz ..\n 211,  41,   3,  41,  62, 210,  81,  60, 112,  86,  95,  55, // .).)>.Q<pV_7\n  29, 209,  32, 224, 123, 196,  73, 241, 119, 241, 246,  40, // .. .{.I.w..(\n 246, 177,  31,  52,  97, 231, 129,  51,  19,   3,  65,  40, // ...4a..3..A(\n 147,  79,   7,   5, 246,   4, 255, 102, 131, 238,  65, 241, // .O.....f..A.\n   9, 225,  60, 196,  68,  87, 248,  25,  45,  57, 101, 215, // ..<.DW..-9e.\n 211, 196,  42, 110,  25,   6,  36, 212,  94, 100, 163,  61, // ..*n..$.^d.=\n 168, 251, 234, 238, 111, 153, 199, 240, 197,  18, 120, 197, // ....o.....x.\n  51, 205,  30, 178,   3,  40, 219,  92, 130, 227, 165,  82, // 3....(.....R\n 153, 156,  47, 184, 172, 127,  45, 144,  93, 180, 115,  35, // ../...-.].s#\n 235,  53,  44,  58, 155, 132,   3,  49, 154, 135, 114,  85, // .5,:...1..rU\n  31, 237, 184, 188, 144, 147,  41,  66,  99, 168,  62,  51, // ......)Bc.>3\n  47, 244,   6,  21, 115, 235, 205, 228,  31, 137, 226,  92, // /...s.......\n 130, 117,   1,   0,   0, 0 // .u...\n};\nstatic const unsigned char v2[] = {\n  31, 139,   8,   8,  67, 234, 193, 103,   0,   3, 109,  97, // ....C..g..ma\n 105, 110,  46, 106, 115,   0, 181,  88, 109, 111, 219,  70, // in.js..Xmo.F\n  18, 254, 174,  95,  49,  80, 125,  37, 121, 165,  72,  43, // ..._1P}%y.H+\n 113, 225, 131,  44, 235, 144,   6,  45, 112, 135,  38, 233, // q..,...-p.&.\n 217,  42, 114, 128,  99, 192,  75, 114,  37,  50,  33, 119, // .*r.c.Kr%2!w\n  89, 238, 210, 148, 161, 242, 191, 119, 118, 185, 164,  72, // Y......wv..H\n  89, 113, 172,   6,  81,   2, 152, 162, 102, 102, 103, 158, // Yq..Q...ffg.\n 121, 217, 153, 177,  74,  65,  65, 200,  34,   9, 165, 117, // y...JAA.\"..u\n  49,  74, 178, 156,  23,  18, 182, 175,  57,  62,  48, 202, // 1J......9>0.\n 164,  11,  49, 254, 151,  89, 234,  66,  65,  89,  68,  11, // ..1..Y.BAYD.\n  23, 144, 225, 231, 213, 138, 134,  82,  63,  94,  75,  34, // .......R?^K\"\n 169, 126, 186, 162, 171,  26,  86,   5, 207, 192, 242, 252, // .~....V.....\n 188, 160,  36, 148,  94, 150,  48, 239, 163,  64, 193, 163, // ..$.^.0..@..\n 144,  51,  33, 225,  13,  21, 130, 172,  41,  92,  66,   6, // .3!.....).B.\n 151,  11,  45, 248, 110,  46, 114, 194,  70, 128,  74,  60, // ..-.n.r.F.J<\n 164, 244, 114,  28, 242, 148,  23,  51,  56, 217, 102,  94, // ..r....38.f^\n 214,  80, 123,  37,  65, 157, 254,  13, 214, 119, 103, 103, // .P{%A....wgg\n 103,  22, 204, 240, 225, 229, 249,  75, 171, 190,  24,  47, // g......K.../\n 144, 173,  79,  24,  17,  73, 234, 209, 220,  87,  18,  23, // ..O..I...W..\n 119, 221, 169, 175, 242,  28,  79,  92, 149,  44, 148,   9, // w.....O..,..\n 103, 118,  94, 240,  92,  56, 176,  69, 230, 230, 247, 155, // gv^..8.E....\n 112, 181, 118,  65,  80, 249, 122, 181, 190,  69, 202, 214, // p.vAP.z..E..\n  44, 123,  43, 195, 124,   6, 219, 218, 133,  74,  52, 127, // ,{+.|....J4.\n 179,  63, 164,  84,  79, 181, 115, 177,  99,  55, 199,  11, // .?.TO.s.c7..\n  45, 195, 152,  40,   6, 130, 110, 110, 251, 244, 248, 135, // -..(..nn....\n  33, 126,  52, 106,  14, 109, 191,  13,  56,  86,  36,  21, // !~4j.m..8V$.\n 180, 207,  36,  55,  82, 147,  47,  55, 114,  64, 104,  89, // ..$7R./7r@hY\n 125, 170, 170,  81, 226, 253, 240, 120,  86, 166,  41,  82, // }..Q...xV.)R\n 117, 100,   5,  93,  21,  84, 196,  72,  98,  59, 232,   7, // ud.].T.Hb;..\n 124, 175,  62,  43,  42, 195, 216, 182, 124, 146,  39,  62, // |.>+*...|.'>\n 210, 173, 146, 181, 191, 166, 210, 114,  60,  25,  83, 102, // .......r<.Sf\n  23, 202,  97,   5, 122,  19,  17, 116, 250, 239,  26, 220, // ..a.z..t....\n 236, 194, 233, 159, 128, 140,  58, 146, 240, 132, 178, 192, // ......:.....\n 224, 185,  87, 231, 128, 173, 190, 192, 159, 127,   2,  42, // ..W........*\n 237, 101,  68,  29, 231, 123, 255, 156, 217,  31, 162,  31, // .eD..{......\n  28, 223,  81,  63, 220,  88,  22,  18, 223,  58,  55, 211, // ..Q?.X...:7.\n 219, 158, 180,  74, 145, 190, 167, 129, 224, 225,  39,  42, // ...J......'*\n 251, 190, 108, 220,   8, 224, 251,  96, 112,   4, 201, 161, // ..l....`p...\n  50, 164,   5,  40,  37,  92, 245,  10,  35,  59, 165,  25, // 2..(%...#;..\n  70,  52, 188, 191, 214,  82, 121,  74,  53, 231,  61,  41, // F4...RyJ5.=)\n  16,  15, 227, 146,  67, 162,  27,  18,  99, 141, 177, 203, // ....C...c...\n 198, 136, 241,  42, 225, 105, 219, 206,  78,  79,  95, 104, // ...*.i..NO_h\n  31, 180, 180,  41,  18,  86,   9, 139, 120, 229, 165,  60, // ...).V..x..<\n  36,  74, 154,  11,  24, 117, 168, 198,  37, 164, 158, 126, // $J...u..%..~\n 194,  48, 247,  10, 154, 167,  36,  68,  23, 198,  82, 230, // .0....$D..R.\n 104, 183,  85,   9, 107,  32,  72,  38,  24,  34,  10, 178, // h.U.k H&.\"..\n  75, 184,  59, 217, 106, 190, 218, 247,  79, 182, 169,  23, // K.;.j...O...\n 115,  33,  25, 201, 104,  61, 195, 247, 168,  80, 237,  87, // s!..h=...P.W\n 226, 174, 101,  69,  48, 140, 133, 120, 254,  90,  97,  62, // ..eE0..x.Za>\n 144,  90,   9, 148, 199, 104,   5, 136, 232, 181,  70, 116, // .Z...h....Ft\n  64, 130, 102, 113, 198, 115, 202, 218, 240, 232, 112, 128, // @.fq.s....p.\n  65, 184, 218, 178,  40, 105, 199,   5,  77, 216, 217, 149, // A...(i..M...\n 232,  94, 213,   3, 137,  89, 151, 250, 244, 126,  40, 116, // .^...Y...~(t\n  79,  93, 122, 239,  34, 137, 206, 229, 161, 244,  54, 179, // O]z.\".....6.\n 236, 141, 226, 223, 120, 200, 132, 224, 218,  55,  91,  69, // ....x....7[E\n  58, 107, 121,  16,  48,  44,  23,  51,  80, 218, 213, 183, // :ky.0,.3P...\n 206, 103, 180,   9,  83,  46, 232,  97, 111,  99, 208, 165, // .g..S..aoc..\n 148,  20, 203,  36, 163, 188, 148,  54, 250, 160, 167,   6, // ...$...6....\n 126,  67,  46, 149, 134, 230, 231,  46, 116,  92, 152, 158, // ~C......t...\n 158, 158,  14,  53, 222,  97, 181,  75, 231,  62,  88,  38, // ...5.a.K.>X&\n  47,   7,  10, 154,  63, 157,  92,  91,  19, 212,  58,  27, // /...?..[..:.\n 186, 210, 107, 247,  29,  99, 178, 217,  54, 146, 134, 201, // ..k..c..6...\n  98, 216,  93, 208,  37, 104, 151,  82,   2, 171, 249,  97, // b.].%h.R...a\n 151, 124,  25, 105,  44,  69, 240,   3,  88,  31, 152, 213, // .|.i,E..X...\n 130, 173, 205, 219, 161, 157, 172,  64,   5, 130, 130,  90, // .......@...Z\n 157,  99, 239,  24,  12,  65,  83, 199, 218, 218,  85, 247, // .c...AS...U.\n  82,  29,  79, 138,   9, 235,  41, 117, 160,  42,  33,  55, // R.O...)u.*!7\n 158, 188, 243, 215, 129,  79,  70, 101, 204,  35, 188,  42, // .....OFe.#.*\n 126, 123, 119, 189, 180, 220, 167,  72,  99,  74, 240,  94, // ~{w....HcJ.^\n  83, 245, 221,  66, 127,  73,  44,  17, 147, 229,  67,  78, // S..B.I,...CN\n  45, 100,  38, 121, 158,  38,  77,   2, 251, 170, 240,  89, // -d&y.&M....Y\n 245, 147, 146,   2,  30,  61, 204, 224, 191, 215, 239, 222, // .....=......\n 122, 234,  70, 101, 235, 100, 245, 160,  42, 133, 243,   4, // z.Fe.d..*...\n  87, 221,  47, 165, 152, 153, 223, 127, 175,  80, 211, 225, // W./......P..\n 105,  15,  42, 170, 208, 133, 143,   7,  31, 123,  53,  87, // i.*......{5W\n 187, 231,  93, 240,  17,  35, 194,  35,  66,  36, 107, 102, // ..]..#.#B$kf\n 111,  92,  69, 227, 244, 238,   4, 214, 112, 218, 204,  85, // o.E.....p..U\n  63, 124, 145, 123, 123, 195, 110, 103, 251, 175, 241, 157, // ?|.{{.ng....\n 230, 174, 251, 130, 181,  19,  59,  63, 225,  55, 188,  47, // ......;?.7./\n  55,  51, 200,  73,  33, 232, 127, 152, 196,  68, 246,  36, // 73.I!....D.$\n  41, 176,  98, 122, 247,  36, 197,  82,  81,  15, 121, 175, // ).bz.$.RQ.y.\n 246, 120, 139,  35, 120, 127,  34, 101,  52, 228,  14, 240, // .x.#x.\"e4...\n 205, 243, 249, 151,  97, 254, 187,  46, 171, 141,   4,   5, // ....a.......\n 145, 109, 225, 101, 175, 194,  10, 107, 225,  12, 238, 212, // .m.e...k....\n 205, 239, 251, 167, 158, 254, 135,  69, 118,  79,  96, 125, // .......EvO`}\n 183,  39, 241, 189, 120,  44,  16, 203, 185, 107, 196,  97, // .'..x,...k.a\n 255, 112, 140, 180,  55, 216, 102,  60, 150, 167, 154, 143, // .p..7.f<....\n  86, 226, 190, 132,  71, 246, 253, 204,  72, 199, 110, 247, // V...G...H.n.\n  12, 220,  82,  70, 130, 148, 246,  37, 132,  49, 197,  82, // ..RF...%.1.R\n  17, 213, 142, 219, 165, 159, 237, 236, 155, 119,  64, 158, // .........w@.\n 182, 239, 111, 137,  83, 246, 245,   4, 218, 125, 251, 224, // ..o.S....}..\n   8, 145,  35,  85, 253, 100,  89, 176, 166, 149,  28, 205, // ..#U.dY.....\n 163, 228,  30, 203,  55, 134, 173, 106,  36, 153,  36,   9, // ....7..j$.$.\n 163, 133, 110,  19, 231, 241, 180, 237,  48,  51, 148, 153, // ..n.....03..\n 176,  73, 192, 165, 228, 217,  12,  78, 177, 143, 252, 253, // .I.....N....\n 213, 213,  18,  62, 148,  47, 206, 127,  57, 199, 155,  81, // ...>./..9..Q\n  86, 188, 248,   4,  65, 145,  68,  88, 135, 230, 126,  60, // V...A.DX..~<\n 213,   2, 176, 165, 109,  69,  71,  19, 134, 221, 241, 120, // ....mEG....x\n 113, 178, 125, 156, 236,  46, 168, 170, 238, 194,  11, 167, // q.}.........\n 158, 171,  54,  88, 243, 246, 212,  42, 120,  53, 110,  58, // ..6X...*x5n:\n 174, 161, 178,  41, 162, 147,  78, 206, 198, 109,  55,  54, // ...)..N..m76\n 143,  95,  54, 106,  53,  69, 175,  44, 116,  25,  66, 109, // ._6j5E.,t.Bm\n  94, 118,  20,  61, 254, 104, 178,  74, 233,   6, 155, 140, // ^v.=.h.J....\n 201,  20, 178, 135, 201, 180,  19, 131, 100,  41,   9, 104, // ........d).h\n 218,  18, 146,  40, 226, 204,  24, 188, 252,  63, 228,   9, // ...(.....?..\n 138, 212,   4,  61, 134, 132, 229, 165, 108, 209, 170, 146, // ...=....l...\n  72, 198,  51, 248, 145, 102,  23,  99, 208, 177, 118, 121, // H.3..f.c..vy\n 178,  85, 237, 143, 220, 212, 157,  51, 240,  85, 251,  88, // .U.....3.U.X\n 247, 106,  29, 103,  90,  20, 254, 170, 107,  69,  13, 126, // .j.gZ...kE.~\n 167, 187, 143, 202,  47, 190, 218, 130, 171, 175, 178, 160, // ..../.......\n  56, 210, 130, 171, 163,  44, 120, 120, 150,   5, 170, 146, // 8....,xx....\n 253,  93, 253,  85, 205,  59, 206, 130, 159,  52, 199, 158, // .].U.;...4..\n  13, 163, 253, 199,   3, 113, 249, 175,  65,  92, 190,  53, // .....q..A..5\n  41, 114,  76, 104,  62, 199, 167, 191,  98, 183, 156, 194, // )rLh>...b...\n 242, 245, 111, 186, 221, 254,   2,  44,  56,  91,  78,  12, // ..o....,8[N.\n  52, 103,   8,  13, 168,  83, 102,  48,  85, 109, 216,  63, // 4g...Sf0Um.?\n  46, 198,  61,   4,  90, 200, 250, 189,  59, 150, 194, 174, // ..=.Z...;...\n 121, 159,  58,  71,   6, 178, 190,  60, 122,  48, 238,  91, // y.:G...<z0.[\n 147, 165,  24,   1, 198, 108, 253, 195, 120,  97,  84, 151, // .....l..xaT.\n 216,  88,  32, 168, 170, 154,   5, 124, 211,  87, 210,  84, // .X ....|.W.T\n 184,  54, 183,  80, 189, 166,  10,  14,  84, 235,  42, 187, // .6.P....T.*.\n  58,  28,  26, 130,  61, 148,  62,  27, 150, 207, 199,  31, // :...=.>.....\n   7, 164, 103, 192, 127,  20, 220, 131,  81, 233,  56, 180, // ..g.....Q.8.\n 245, 197, 250,  77, 193,  70, 229,  14,  99, 173,  47, 189, // ...M.F..c./.\n 111,   4, 245,  21, 205, 184, 164, 240, 230, 127, 203, 229, // o...........\n 215,   2, 173, 108,  80,  87, 167, 130, 248,  56, 108,  77, // ...lPW...8lM\n 155, 241,  77, 209, 213, 154,  29, 198, 215, 116,   1,  95, // ..M......t._\n  66, 120,  88, 159, 204, 195, 222, 173, 154, 137, 181,  65, // BxX........A\n 252,  45, 194,  58,  83,  19, 127,  59, 210, 243, 123,  90, // .-.:S..;..{Z\n 104, 156,  93,  48,  98, 245, 112,  59,  39,  16, 227, 228, // h.]0b.p;'...\n 116,  57,  86, 195,  55,  54, 103,  85,  85, 121, 113, 114, // t9V.76gUUyqr\n  79, 179,  63, 112, 220, 201, 252,   8, 253,  35, 252, 118, // O.?p.....#.v\n 145,  32,  39,  97, 154, 224, 100, 224, 247, 220, 106, 102, // . 'a..d...jf\n 214, 185,  79,  22,  46, 136,  50,  16,  97, 145,   4,  84, // ..O...2.a..T\n 157,  28, 248, 114,   3, 132,  69, 144, 151,  65, 154, 136, // ...r..E..A..\n 184, 121,  87, 108, 230,  65, 225,  63, 165,  36,  22,  62, // .yWl.A.?.$.>\n 189,  73,  83,  45,   8,  78,  29,  80, 202,  36,  77, 228, // .IS-.N.P.$M.\n 195, 108, 199, 119,   2,  44,   4, 156, 255, 205,  86,  97, // .l.w.,....Va\n 183,   6, 128,  39, 203, 219,  99, 216, 134, 173, 144, 228, // ...'..c.....\n 249,  12,  94, 168, 251, 197, 128,  29, 116, 173,  71,  99, // ..^.....t.Gc\n  98, 176, 208,  91, 186,  61, 182, 148, 174, 112, 246, 155, // b..[.=...p..\n 170, 226, 107, 182, 118, 223, 157, 159, 159, 163,  16, 117, // ..k.v......u\n  57, 136,   6, 109, 109,  24,  78,  56, 144, 246, 107, 139, // 9..mm.N8..k.\n 183, 219,  61, 160,  76,  34,  75,  28, 191, 204, 218, 174, // ..=.L\"K.....\n  93,   7, 170, 207, 254,  74, 176,  91, 156, 169, 109, 160, // ]....J.[..m.\n 164,  36, 213, 219, 192, 130,  70, 237,  50,  80, 125, 176, // .$....F.2P}.\n 141, 251,  49,  92, 237,  83, 119,  95,  52,  75, 148, 136, // ..1..Sw_4K..\n 221, 139, 186,  61, 122, 212,  15, 179,  71,  40,  97, 167, // ...=z...G(a.\n 232, 225,  29, 140, 253,  34,  32, 123, 158,  18, 156, 245, // .....\" {....\n  84,  94, 180, 152,  53, 105, 161,  55,  58,  49,  79, 113, // T^..5i.7:1Oq\n 164, 188,  28, 163, 131, 213, 252,  11, 205,  94,  66, 101, // .........^Be\n  76,  19,  22,  56, 174,  11, 140, 120,  73,  11, 207, 243, // L..8...xI...\n 198,  79,  38, 122, 155, 228,  56,  66, 239, 165,  79,  55, // .O&z..8B..O7\n 191, 183, 233, 189,  75, 237, 110,  46,  82,  67, 246, 163, // ....K.n.RC..\n  81, 168, 205, 246, 121,  80,  98,   7, 252, 121, 167, 142, // Q...yPb..y..\n  59, 185,  24, 252, 225, 167, 190, 220, 110,  65, 112, 115, // ;.......nAps\n 235, 212,  11, 189,  47, 193,  32, 209, 226, 134,  40, 170, // ..../. ...(.\n 166, 217, 200, 143, 105, 178, 142, 149, 104, 213, 200, 232, // ....i...h...\n 184,  88, 165, 188, 154,   1,  41,  37, 111, 189, 119, 178, // .X....)%o.w.\n 109, 119, 169,  94,  70, 114, 187,  91,  80,  44,  32, 182, // mw.^Fr.[P, .\n 205, 153,  56,  31, 180, 118,  59,  38, 178, 117, 151,  61, // ..8..v;&.u.=\n 106,  14, 189, 187,  24, 169, 117, 130,  89, 191, 113, 150, // j.....u.Y.q.\n 114,  18, 117, 139, 172, 102, 133, 109, 199, 246, 171,  60, // r.u..f.m...<\n 199,  81,  34, 226,  97, 169,  86, 130, 158,  26, 220, 113, // .Q\".a.V....q\n 154, 248,  11, 218, 252, 214, 171,  12,  23,   0,   0, 0 // ...........\n};\nstatic const unsigned char v3[] = {\n  31, 139,   8,   8,  67, 234, 193, 103,   0,   3, 112, 114, // ....C..g..pr\n 101,  97,  99, 116,  46, 109, 105, 110,  46, 106, 115,   0, // eact.min.js.\n 157,  91, 123, 119, 219, 182, 146, 255, 127,  63,  69, 164, // .[{w.....?E.\n 211, 163,  18,  43,  68, 177, 147, 182, 187,  75,   5, 213, // ...+D....K..\n 105,  29, 183, 238, 109, 234, 230,  38, 105, 123, 123,  85, // i...m..&i{{U\n  93,  30, 138, 132,  44, 214,  20, 169, 242,  97,  91,  53, // ]...,....a[5\n 245, 221, 247,  55,   3, 128, 164, 108, 185, 247, 236, 158, // ...7...l....\n  36,  34,  30, 131,   1,  48,  47, 204,  12, 144, 155, 176, // $\"...0/.....\n 120, 166, 101,  38,   3,  89, 201,  92,  22, 178, 150, 169, // x.e&.Y......\n 186, 223, 203,  68, 205,  23,  50,  82,  47, 194,  40, 169, // ...D..2R/.(.\n  26, 125, 231, 205, 252, 178, 185, 106, 178, 102, 219, 124, // .}.....j.f.|\n  34, 154,  98, 187, 110, 174, 138,  36, 110, 242, 219, 178, // \".b.n..$n...\n 217, 100,  81, 147,  85, 183,  77, 146, 233, 121, 180,  94, // .dQ.U.M..y.^\n  52, 127, 230, 121, 243, 175, 188, 136, 155, 164, 210,  69, // 4..y.......E\n 248,  34, 153, 174, 234,  44, 170, 146,  60, 123,  86, 122, // .\"...,..<{Vz\n 152,  72, 220, 175, 242, 194, 187, 193, 172, 193, 179,  36, // .H.........$\n 123, 150,   9,  61,  15,  22,  42, 195, 207, 180, 208,  85, // {..=..*....U\n  93, 100, 207, 244, 190,  29, 177, 242, 180, 184,  39, 216, // ]d........'.\n  76, 233, 201,  54,  44, 116,  86,  93, 230, 177, 158, 102, // L..6,tV]...f\n 163,  81,  54,  41, 244,  38, 191, 209, 103, 235,  36, 141, // .Q6).&..g.$.\n   1, 214,  13,  10,  61, 222, 141,  25, 216, 109, 105,  74, // ....=....miJ\n 243, 214,  52, 103,  32, 134, 215, 122,  55,  84, 170, 158, // ..4g ..z7T..\n 229,  42, 152, 215,  11, 127,  88, 232,  21, 215,  11,  83, // .*....X....S\n  79, 241, 195, 165, 105, 178, 242, 194, 226, 170, 222,  96, // O...i......`\n 230, 114, 146, 234, 236, 170,  90, 127, 249, 114,  52, 242, // .r....Z..r4.\n 210,  73,  68,  19,  99,  69, 234,  81, 255, 171, 153, 158, // .ID.cE.Q....\n  68,  97, 154, 118,  35, 229,  75, 225,  87,  66,  14, 221, // Da.v#.K.WB..\n  26,  49,  87, 181, 219, 234, 124, 245, 140, 118,  82, 167, // .1W...|..vR.\n 233,  64, 101, 147,  88, 175, 194,  58, 173, 222,  21, 249, // .@e.X..:....\n 182,  20, 237,  98,  31, 180, 223, 228,  73, 252, 236,  68, // ...b....I..D\n  41,  69,  75, 164, 117, 208,  74,  15,  97, 208,  34,  28, // )EK.u.J.a.\".\n  45, 183, 160,  69, 202, 124, 165,  89, 122,  68, 218, 130, // -..E.|.YzD..\n  23, 150, 225, 134,  80,  32,  17,  45, 201, 215, 114,  75, // ....P .-..rK\n  72, 252,  74, 130,  70,  62,   0, 244, 202,  47, 100,  16, // H.J.F>.../d.\n  92, 251, 132,   1,   5, 247,  93, 250,  39, 248, 213, 174, // ......].'...\n  26, 251, 102, 105,  40,  70, 174, 109, 109,  10,  81, 158, // ..fi(F.mm.Q.\n 149,  85,  81,  71,  85,  94, 116,  64,  55, 220,  71,  52, // .UQGU^t@7.G4\n  31, 143,   3, 191, 222, 187,  21,  59, 106, 220, 100,  96, // .......;j.d`\n  52, 177, 153,  11,  94,  42, 100, 218, 173, 126,  77, 114, // 4...^*d..~Mr\n 225, 196, 165, 229,  68, 215,  31,  27,  73, 171, 214,  73, // ....D...I..I\n  57, 225, 237,  40, 236, 150,  42,  88,  74, 165, 239,  42, // 9..(..*XJ..*\n 213, 131, 189,  49, 176,  96, 180,  89,  80,  38,  90, 196, // ...1.`.YP&Z.\n  65,  48,  67,  47,  62, 146, 126, 240, 247, 122, 146, 100, // A0C/>.~..z.d\n 177, 190, 251, 145, 228, 114, 124,  42, 120,  11, 211,  86, // .....r|*x..V\n 158, 167, 217, 107, 205,  64,  70,  14, 166, 217, 120,  44, // ...k.@F...x,\n  44, 218, 129, 242,   2, 197, 157, 243, 108,  33,  28, 207, // ,.......l!..\n   9, 165, 118, 211, 113, 197,  82, 225, 136, 160, 232,   9, // ..v.q.R.....\n  21, 104,  61, 102, 218, 110,   3, 187,  86,  73, 100,  48, // .h=f.n..VId0\n 237, 230, 211,  60,  95,  59,  23,  85,  34, 163, 124,  84, // ...<_;.U\".|T\n  52, 189, 209, 100,  25, 150,  90,  49, 151,  50, 117, 242, // 4..d..Z1.2u.\n 255, 220, 192, 253,  35, 132, 102,  47, 203,  66, 135, 215, // ....#.f/.B..\n 123, 187,  61,  90, 229, 190,  91, 244, 134,  22, 237,  13, // {.=Z..[.....\n 104,  76,  12,  49, 230, 175,  26, 156,   0, 115,  53, 217, // hL.1.....s5.\n 214,  37,  49, 120,  52,  26,  92, 161, 185,  24, 143, 155, // .%1x4.......\n 166,  24,  40, 150, 242, 101,  14,   4, 250, 189,   6,  23, // ..(..e......\n 138,  36, 187,   2, 140, 231,  21,  71, 123, 154,  38,  23, // .$.....G{.&.\n 222,  85,  79, 226, 175, 188, 206, 244, 232,  41,  99,  86, // .UO......)cV\n 149, 219, 169, 208,  40, 151, 121,  81, 121,  14, 222,  72, // ....(.yQy..H\n  69,  79,  20, 110, 240, 111, 249,  60, 115, 165, 189, 144, // EO.n.o.<s...\n  21, 217,  72, 141,  97,  27, 221,  27, 214, 242, 194, 233, // ..H.a.......\n 215, 212, 109, 178,  80,  94, 174,  60, 152,  50,  65,  72, // ..m.P^.<.2AH\n 232,  71,  75, 175,  86, 132, 242,  29, 237,  36,  32, 124, // .GK.V....$ |\n  94, 165,  74,  15,   6,  56,  23,  12, 165, 114, 250,  29, // ^.J..8...r..\n 159, 202, 119,  94,  13, 116, 149,  36, 232,  76,  26,  53, // ..w^.t.$.L.5\n   2,  81, 234,  73, 126, 155, 233, 226, 195, 207, 223, 158, // .Q.I~.......\n 167, 154, 108, 141,  52, 156, 161,  97, 235, 217, 188,  88, // ..l.4..a...X\n  88,  93, 148,  70, 184,  11,   8,  80,  46, 160, 208, 220, // X].F...P....\n  47, 228,  27,  47, 192,  76,  92, 211,   3,  85, 140,  70, // /../.L...U.F\n  59, 116,  11, 177, 239, 209, 237, 218,  59,  60,  30,  34, // ;t......;<.\"\n  89, 202, 149, 217, 100,  40,  99, 185, 147,  27, 121,  37, // Y...d(c...y%\n 175, 229, 157, 188,  80,  21, 113,  15,  34, 210,  52, 137, // ....P.q.\".4.\n  60,  87,  23, 142, 184,  68, 117, 214,  30, 218,  95,   8, // <W...Du..._.\n  49,  11,  95, 103, 174,  47,  60,  16, 177,  13,  75, 206, // 1._g./<...K.\n 245,  60,  92,  40, 179,  94, 180, 100, 168, 129, 155, 195, // .<.(.^.d....\n 101, 158, 167,  58, 236, 105, 196, 102,  70,  48, 254,  16, // e..:.i.fF0..\n 182,   5,  12, 239, 181,   3,  56, 171,  55,  75,  93,  28, // ......8.7K].\n 182,  45, 147, 171,  36, 171, 250, 227, 183,  60,  47,  54, // .-..$....</6\n  96,  20, 128, 203, 194, 255, 170,  40, 194, 221,  36,  41, // `......(..$)\n 249, 235, 109,   4, 192, 214, 242, 222,  25,  25, 127, 179, // ..m.........\n 239, 129, 179,  85, 245,  55,  36,  16,  95, 158,   0, 112, // ...U.7$._..p\n 195,  90,  42,  55, 198, 234, 224,  11,  35, 106,  17,  51, // .Z*7....#j.3\n 207, 253, 141,  96,  83,  67,  53,  21, 112, 227, 146, 247, // ...`SC5.p...\n 188,   4, 139, 205, 150, 149, 183,  83,  23, 102, 207, 187, // .......S.f..\n 209, 136,  49,  40, 181, 163,  15, 213,   8, 189, 162,  58, // ..1(.......:\n  21,   4, 193,  41,  35,  11,  83, 157, 150, 250,  25, 145, // ...)#.S.....\n  58,   6, 133, 227, 215, 231, 211,  24, 164, 165, 185,  24, // :...........\n  95,  76,  74, 251, 215, 200, 238,   9, 202,  97,  51, 186, // _LJ......a3.\n 187,  99,  54, 236, 223,  65,   4,  54, 114, 167, 118,  77, // .c6..A.6r.vM\n 147,  30,  72, 129, 188,  82,  27,  35, 198,  49,  10,  56, // ..H..R.#.1.8\n  42,  48, 201, 142, 190,   3,  69,   2, 127, 215,  52, 222, // *0....E...4.\n  29, 152,  46,  36,  55, 142,  70, 119,  70, 183, 185, 230, // ...$7.FwF...\n 232,  45, 109,  99, 204, 212, 136, 154, 230,  10, 141, 194, // .-mc........\n 138, 241, 213, 204,  90, 229, 107, 160, 187,  86,  87,  71, // ....Z.k..VWG\n 207,  80, 179,  17, 103, 147,   8, 203,  53, 237, 142,   4, // .P..g...5...\n 142,  54, 135, 239, 108, 195, 246, 165,  84,  75, 111, 131, // .6..l...TKo.\n 133, 195, 132, 150, 234, 204, 108,  74,  94,  64, 124,  75, // ......lJ^@|K\n  33,  87, 144, 144, 124, 203, 136, 161,  86, 129, 177, 182, // !W..|...V...\n  71,  38,  11, 236, 100,  44, 209,  64,  41, 124,  61, 185, // G&..d,.@)|=.\n   9, 211,  90, 171, 225,  16, 104, 105, 255, 100,  12,  21, // ..Z...hi.d..\n  74, 101, 207, 101, 129,   1, 198, 152,  82, 221, 120,  59, // Je.e....R.x;\n 168, 151, 211,   8, 173, 174, 161,  16, 231, 211, 240, 249, // ............\n 243, 169,  48, 203,  39, 150,   2, 242,  47, 102, 238, 224, // ..0.'.../f..\n   8, 195, 104, 228,  74, 138,   5,  41, 110, 151, 118, 227, // ..h.J..)n.v.\n  85,  50, 196,  41,  37, 228,  79,  30, 193,  72, 150,  42, // U2.)%.O..H.*\n  65,  71, 196,  29, 251,  23,  70,  21, 239, 250, 170, 248, // AG....F.....\n 209, 187,  35, 200, 187, 249, 120, 220, 126, 122, 182,  96, // ..#...x.~z.`\n 105, 108, 129, 209, 126,  24,   4,  86, 237,  10, 104, 170, // il..~..V..h.\n 195, 131, 163,   2,  42, 216,  58, 115,  94,  84,  36, 122, // ....*.:s^T$z\n  30, 153,  24, 156, 194, 153,  58, 178, 179, 220,  80, 123, // ......:...P{\n 233, 229, 140, 221,  63,  35, 171, 132,  63,  60, 222,  24, // ....?#..?<..\n  39,  24, 227, 214, 169, 233,  29, 222, 103, 125, 227, 100, // '.......g}.d\n 150,   5, 111,  79,  38, 180, 201, 214,  70, 146, 201, 140, // ..oO&...F...\n 133,  49, 180,  49,  27, 208, 248,  64, 105, 218, 163,  63, // .1.1...@i..?\n 192, 161,   1,  43, 216,  52, 166, 154, 247, 248,  39, 180, // ...+.4....'.\n 223, 130,   1, 160,  56,  96,  45,  44, 186, 158, 132, 219, // ....8`-,....\n  45,  14,  31, 227, 142, 194, 164, 214, 172,  58,  60,   1, // -........:<.\n  31,  59, 169,  42, 224,  84, 159,  76,  81,  72,  39,  25, // .;.*.T.LQH'.\n 124, 144,  15, 201,  50,  53,  71,  88, 242, 186,  61, 135, // |...25GX..=.\n 146, 177, 122,  73, 246, 144, 102,  23, 172, 131,  56, 171, // ..zI..f...8.\n  52, 188, 142,  82,  23, 213, 215,  26, 136, 180,  71,  59, // 4..R......G;\n   5, 250, 194, 157, 172, 221,  89,  48, 171, 253, 188, 143, // ......Y0....\n 187, 163, 211, 157,  99, 220, 240,  57, 200,  14, 155, 122, // ....c..9...z\n 178, 128, 147,  90, 106, 246,  24, 129, 122, 231,  49, 225, // ...Zj...z.1.\n  53,  14, 119, 107, 121, 131, 217, 112, 232,  59,  59,  58, // 5.wky..p.;;:\n 104, 101, 176, 105, 162,  73, 165, 203, 202, 203, 196,  44, // he.i.I.....,\n 240, 131, 241, 112, 123,  55, 236, 166, 185, 232, 216,  97, // ...p{7.....a\n 152,  81,  76, 153, 110, 176, 209, 187,  84, 243, 204, 194, // .QL.n...T...\n  84,  15,  77, 118,   0, 250,  49, 200,  36,  42, 203, 143, // T.Mv..1.$*..\n 228, 160,   5, 134, 114, 199, 128,  43, 246,  23,  14, 193, // ....r..+....\n  43, 210,  62, 248, 252,  68, 233, 140, 220, 230,  74,   4, // +.>..D....J.\n 208,  20, 246, 246, 155, 230, 206, 193,  99, 113, 128,  35, // ........cq.#\n 225,   8,  58, 208,  64,   0,  99,  64,  59, 199,  20, 248, // ..:.@.c@;...\n  28, 194,  83, 135, 216,  59,  57,  25, 230, 142, 124, 163, // ..S..;9...|.\n 209,  48,  51, 229, 211, 133, 128,  11,   2, 250, 227, 104, // .03........h\n 167, 168, 100, 155, 134, 145, 246,  94, 156, 133,  91, 176, // ..d....^..[.\n  71, 127, 242, 130, 166, 132,  61,  67,  95, 149, 191, 205, // G.....=C_...\n 111, 117, 113,   6,  23, 201,  19, 152,  89, 207,  30, 180, // ouq.....Y...\n  77, 202,  52, 193,  88,  68,  11,  89,  91, 132,  22, 164, // M.4.XD.Y[...\n 176, 163, 248,  69,  16, 195, 181, 121,  54,  46,  16, 158, // ...E...y6...\n 200,  96,  86,  53,  13,   4,  47, 142, 207, 111,  32, 139, // .`V5../..o .\n 111, 147, 178, 210, 240,   5, 192, 202,  98, 246, 193,  63, // o.......b..?\n 135, 152, 192,  54, 153,  40, 233,  41, 128,  86,   1, 134, // ...6.(.).V..\n 113, 152,  93, 233,  34, 175, 203, 116, 247,  65,  87, 223, // q.].\"..t.AW.\n 101, 128, 187, 248, 248, 195,  91,  50, 134, 198,  59, 206, // e.....[2..;.\n 197, 193, 246, 238,  32,  96, 215, 243,  11, 127, 189, 192, // .... `......\n   6, 215,  67, 209, 245, 148, 151, 225, 134, 183,  93,  14, // ..C.......].\n 123, 248, 215,  20,  98,  17,  50,  16,  46, 197,  66,  92, // {...b.2...B.\n  25, 108, 216, 184, 114,  21,  46, 191,  35, 255, 218, 213, // .l..r...#...\n  99, 248,  54, 105,  30, 198, 182, 206, 220, 210, 162,  42, // c.6i.......*\n 118, 247,  15,   5,  53, 152,  90, 101, 217,  71,  97,  21, // v...5.Ze.Ga.\n 113, 120, 176,  63, 102,  66,  65,  72, 235, 185,  66, 136, // qx.?fBAH..B.\n   6, 167,   3, 214, 249,  97, 216,  99, 106, 209,  50, 213, // .....a.cj.2.\n  40, 200,  87,  21, 196, 111,  89,  87, 218, 106, 136,  37, // (.W..oYW.j.%\n 104, 175,  89, 244, 253, 218, 115, 154, 154,  67, 141, 116, // h.Y...s..C.t\n 110,  92, 246, 241, 224, 116, 225, 101,  19,  77,  28, 152, // n....t.e.M..\n 217,  47,  57, 241, 253, 144, 245, 195, 145,  81,  39, 255, // ./9......Q'.\n 118,  20,  29, 203, 189, 176,  93,  38,  50,  50,  90, 183, // v.....]&22Z.\n 146, 161, 220, 202,  27, 235, 155,  45, 229,  25, 121, 103, // .......-..yg\n 240, 200, 204,   9, 114,  96,  27, 131,  73,  47,  58,  19, // ....r`..I/:.\n 189,  24, 108, 106, 232,  68, 254, 220,  26, 180, 138,  76, // ..lj.D.....L\n   9,  38, 204, 156,  91,  21,  27, 101,  42, 175,  77, 248, // .&..[..e*.M.\n  80, 171, 121, 130, 131, 222,  91, 177, 153,  93, 194, 172, // P.y...[..]..\n 145, 146,  77, 153,  89, 108,   2,  30, 115, 227, 156, 229, // ..M.Yl..s...\n 138, 252,  31, 227,  45, 157,  41, 140,  62, 119,  49, 218, // ....-.).>w1.\n  71, 242,  73,  70, 163, 124, 190,  34, 183,   0, 135, 145, // G.IF.|.\"....\n  90, 205, 206, 102, 103,   6, 214,  28, 185,  62, 117,  33, // Z..fg....>u!\n  70, 165, 197,  68, 179,  43, 133,  19, 141,  86, 100, 214, // F..D.+...Vd.\n  26, 145, 255, 172,  66, 252, 156, 251, 222,  16, 163, 170, // ....B.......\n 156, 230,  29,  66, 134, 206,  71, 163, 243,  73, 219,   2, // ...B..G..I..\n 142,  82, 208,  48,  51,  67,  67, 149, 233,  91, 176, 113, // .R.03CC..[.q\n  41, 239, 132, 239, 245, 219,  98, 110, 147,  97, 159,  98, // ).....bn.a.b\n 234,  28, 117,  51,  94, 125,  37, 228, 217, 104, 116,  54, // ..u3^}%..ht6\n  41, 235, 165,  23,  18, 156, 137,  60, 151,  40, 149,  85, // )......<.(.U\n  88, 105, 200, 158,  45, 177,  34, 135, 109,  48, 122,  39, // Xi..-.\".m0z'\n 105, 149, 153, 202, 229, 150, 215,  75, 129,  16,  55, 173, // i......K..7.\n 217, 119,  50,  98,  78, 117, 248,  20,  30, 127, 149,  69, // .w2bNu.....E\n 228, 220, 164, 243, 201, 149, 174, 222,  32, 240, 185, 209, // ........ ...\n 241,   7, 234, 248, 166, 200,  55, 156,  12, 104,  71, 184, // ......7..hG.\n  33, 109,   3,  71,  25,  92, 132, 117,  42,  77, 163, 124, // !m.G...u*M.|\n  26, 145, 183, 116, 192,  66, 222,  40, 187,  57, 248, 132, // ...t.B.(.9..\n  22, 173, 220,  10, 179, 206, 191,  90, 138,  89,  44, 109, // .......Z.Y,m\n 124, 179, 205,  51,  72, 244,  47,  73, 154, 254, 128, 192, // |..3H./I....\n  13,   6, 248,  88, 171, 231, 246, 215, 235, 124, 147, 196, // ...X.....|..\n 237,   8,  80, 200, 248, 142,  71, 250,  69, 123, 128, 252, // ..P...G.E{..\n 251, 117,  45, 161,   8,  55,  79,  44, 239, 189, 142,  52, // .u-..7O,...4\n 198,  88, 200, 191, 232,  52, 210,  49,   8, 141,  83, 230, // .X...4.1..S.\n 112, 149, 235, 188,  78, 227,  51,  55, 232, 167, 109, 204, // p...N.37..m.\n  60,  24, 156,  42, 245,  84, 175, 163,  52, 208,  53,  77, // <..*.T..4.5M\n 192,  65, 160,  98, 137, 190,  17, 247, 143, 132, 202, 200, // .A.b........\n   5,  43, 226, 205, 192, 130,  89,  22,  67, 140,  78,   5, // .+....Y.C.N.\n 163, 186, 161, 195, 226, 129, 218,  94, 115, 249, 218, 148, // .......^s...\n  39, 176, 194, 231,  33, 236, 102,  63, 140, 213,  54,  46, // '...!.f?..6.\n  87, 129, 216,  27,  60, 107, 235, 166, 140,  70, 169, 165, // W...<k...F..\n 187, 104, 237, 238,  81, 226, 185, 237,  30, 109, 238, 237, // .h..Q....m..\n 243,  40, 155, 187, 193,  45, 159, 219, 229,  17,  37,  30, // .(...-....%.\n 195, 122, 108, 242,  40, 122,  61,  84, 174, 227,  52, 179, // .zl.(z=T..4.\n 166, 170, 176, 166,  74,  58, 154, 181,  36, 163, 239,  59, // ....J:..$..;\n 248, 172,  43, 229, 116, 220, 115, 114, 239, 164, 190, 157, // ..+.t.sr....\n  71,  60,  64, 238,  54,   4, 161,  99, 151, 240, 204, 128, // G<@.6..c....\n 145,  35,  12, 205, 179,  17, 190, 124, 212, 239, 145, 122, // .#.....|...z\n 109, 157,   3, 202, 221,  31, 178, 112,  11,  57, 177, 222, // m......p.9..\n 159, 217,  40,  76, 201, 230, 233,  94,  34,   3, 208,  92, // ..(L...^\"...\n  40, 179,   8, 196,  93,  43,  23, 234, 173, 141, 100,  42, // (...]+....d*\n 181, 162,  24, 112, 182, 178, 214, 180,  13, 110,  87, 146, // ...p.....nW.\n 194, 253, 195,   8, 248,  66, 204,  46, 252, 249, 197, 226, // .....B......\n 209,  89, 131, 229, 119, 217, 158, 254,  89, 240, 132, 172, // .Y..w...Y...\n 200,  43,  43, 153, 231,  76,  36, 134,  53, 100, 215,  32, // .++..L$.5d. \n 187, 241, 177, 108,  82,  16,  14,  89,  95, 240, 103, 222, // ...lR..Y_.g.\n  67, 145, 181, 162,  44, 124,  83, 185, 245, 172, 100, 247, // C...,|S...d.\n 150,  24, 137,  41, 179,  56,  78,  86,  43,  29,  91,  46, // ...).8NV+.[.\n 119, 254, 129, 153, 128, 215, 235,  69, 134, 226,   3,  85, // w......E...U\n  11,  27,  62, 105, 149, 216,  29,  13,   6, 145, 172, 231, // ..>i........\n 117, 155, 249,  75, 196, 194, 174, 156, 164,  71, 155,  51, // u..K.....G.3\n 184, 239,   2, 188, 161,  38, 113,  79, 189,  17,  37,  48, // .....&qO..%0\n 241,  65,  60, 163, 197, 163,  84,  17, 128, 248, 120, 100, // .A<...T...xd\n   2, 174, 237, 116, 199,  83,  74,  54, 161,  76, 154, 216, // ...t.SJ6.L..\n 237, 160, 157, 159, 109, 195, 190, 159, 180, 185, 245, 250, // ....m.......\n  41, 155, 214,  49,  40, 217,  49,  88, 131, 118,  70, 140, // )..1(.1X.vF.\n 227, 246, 236, 221,  89, 231,  64, 110,  16, 163, 176, 215, // ....Y.@n....\n 125,  67,  46, 183, 218, 113, 222, 106, 112, 226,  84, 180, // }C...q.jp.T.\n 102, 191, 121, 186, 121,  93, 187, 144, 101,  99,  50,  56, // f.y.y]..ec28\n 136, 109, 235, 249, 134,  67, 189, 146,  60,  40, 136, 232, // .m...C..<(..\n 110,   6, 127,  38, 199, 194, 201,  33,   4,  42, 255,  21, // n..&...!.*..\n 194, 226,   9, 165, 115, 249, 108,  23, 216, 129,  42,  37, // ....s.l...*%\n 141,  50, 177, 146, 201,  57, 244,  18, 177, 157, 245,  86, // .2...9.....V\n  59, 231, 155, 196, 121, 196,  57, 245,  73,   4, 232,  74, // ;...y.9.I..J\n 147, 247,  79,  65, 152,  23, 139, 105, 166, 138, 217, 131, // ..OA...i....\n 110, 155,  20, 187, 252,   0,   7, 180, 170, 182, 254, 139, // n...........\n  23, 183, 183, 183, 147, 219,  87, 147, 188, 184, 122, 241, // ......W...z.\n 242, 228, 228, 228,   5, 237,  19, 234, 226,  31,  31, 232, // ............\n 237, 100,  12,  69,  24, 141,  98,  23, 209, 201, 136, 100, // .d.E..b....d\n 181, 191, 176,  53, 126,  99, 196,  69, 196, 107, 168,  95, // ...5~c.E.k._\n 104, 170, 158, 173, 196, 221,  65,  84, 147,  92,  91,  78, // h.....AT..[N\n 102,  70, 231, 104, 233,  37, 116,  64, 121,  45,  83, 154, // fF.h.%t@y-S.\n  38,  21, 147,  39, 188, 113,  56,   8, 241, 147, 125, 131, // &..'.q8...}.\n 168,  37, 152, 227, 211, 154, 174, 114, 136, 163, 155, 215, // .%.....r....\n 217,  36, 116,  46, 107, 217, 103, 221, 122, 222, 239,   1, // .$t.k.g.z...\n  47,  38,  25, 184,  69, 119,  10, 135, 173, 236, 112,  77, // /&..Ew....pM\n  61, 216, 166, 144, 120, 188,  37,  85,  30, 141, 182,  36, // =...x.%U...$\n 179, 213, 198, 250,  39,  84, 106, 154, 174,  13,  72,  18, // ....'Tj...H.\n 183,  60, 193,  36, 105, 171, 106, 219,  13, 134,   7, 142, // .<.$i.j.....\n   8, 137, 104, 218,  79, 190,  30, 134, 145, 180, 155, 194, // ..h.O.......\n  94, 222,  56, 107,  69, 242, 137,  88, 220,  94, 230, 112, // ^.8kE..X.^.p\n  88, 206,  55,  38,  77,  67, 113, 168, 185, 242,  64, 252, // X.7&MCq...@.\n  86,  44, 160, 159,  29, 130,  76, 228,  20, 118,  56, 111, // V,....L..v8o\n 180,  13, 109,  51,   0,   2, 217, 211, 200, 135,  76,   2, // ..m3......L.\n  87, 137, 214,  58, 186, 214, 177, 173, 210,  44,  28,  55, // W..:.....,.7\n  16,  14,  59,  59,  77, 108, 103, 223,  67,  29,  99, 185, // ..;;Mlg.C.c.\n  70,  43, 172, 230,  86, 184, 100, 104,  27,  29, 109, 156, // F+..V.dh..m.\n  30, 182, 150,  24, 118,  56, 147, 143,  50, 145,  27,  31, // ....v8..2...\n 172, 112, 138, 109, 130,  39, 157,  92, 101,  63,  46, 127, // .p.m.'..e?..\n 215,  17,  71,  84,  59, 214, 246, 122,  86,  35, 152, 241, // ..GT;..zV#..\n  43, 147,   9, 163,  60,  16, 244,  55,  58,  84, 225, 141, // +...<..7:T..\n 234,  52, 184, 203,  62, 145,  50, 146, 161, 100,  85, 158, // .4..>.2..dU.\n 194,  44, 122, 118, 215,  32,  92,  12,  84,  46, 108, 192, // .,zv. ..T.l.\n 240, 216, 136,   4,   9, 195, 134, 147,  44,  92,   5, 101, // ........,..e\n 176, 145, 171,  66, 151, 165,  53,  31, 131,  13,  64,  46, // ...B..5...@.\n 176,  27, 139,   9,  49, 201, 218, 192,  74, 242,  79,  90, // ....1...J.OZ\n  66,  30, 155, 193, 246,  81, 234, 146, 167, 176, 117, 139, // B....Q....u.\n 207, 141, 100, 140, 182,  66,  56, 197, 254, 113, 162, 232, // ..d..B8..q..\n 163, 181, 211, 108, 113, 143,  93, 175, 204, 180, 199, 225, // ...lq.].....\n  93,  84,  23, 148, 216,  81, 193,  99,  59, 123,  96, 229, // ]T...Q.c;{`.\n 127, 114,   8, 237,  45,  35, 223, 188,  76, 234, 108,  99, // .r..-#..L.lc\n 156, 211, 182,   8,   4, 146,  83,  97,  38,  59, 234, 229, // ......Sa&;..\n 110,   6, 132,  54, 174,  72,  25,  36, 154, 163, 105,  62, // n..6.H.$..i>\n  82,  10, 140, 197, 182,  77, 129, 218,  60,  90, 100,  18, // R....M..<Zd.\n 199, 249,   3,  79, 202,  76, 194,  49, 241, 241,  46, 239, // ...O.L.1....\n 216, 129,  33, 246, 185,  57, 186, 115, 118, 113,  56, 201, // ..!..9.svq8.\n  75, 200,  77, 198, 142, 229, 163, 128, 213,  40,  94, 231, // K.M......(^.\n  78,  70,  10, 152, 138,  28, 194,  60,  26, 253, 228, 229, // NF.....<....\n  44, 217, 242, 136,  14, 153, 216,  21,  81, 159, 243,  96, // ,.......Q..`\n 236, 182,  86, 230, 206,  73, 200, 238, 166, 200, 165, 224, // ..V..I......\n  58, 138, 126, 229, 114,  84, 150, 123, 238, 194, 206, 197, // :.~.rT.{....\n  90, 102, 225,  45, 248,  15,  94, 223,  64, 144, 220,  79, // Zf.-..^.@..O\n 105, 127, 230, 196, 165,  62, 178, 216, 216, 198, 177, 124, // i....>.....|\n 163,  48,  87,   7,  57, 241, 128, 239,  43, 140,  99, 193, // .0W.9...+.c.\n 151, 222, 239, 160,  46, 129, 242,   6, 208, 175,  28,  29, // ............\n 130, 117,  53, 244, 214, 134,  47, 243,   0,  17,  89,  77, // .u5.../...YM\n 121, 240, 180, 187, 132, 169,  30,  93, 194, 240, 232, 217, // y......]....\n  60,  95, 248, 181, 153, 170, 154, 172, 146, 162,  52, 190, // <_........4.\n 158, 187,  30, 174, 250, 103, 128, 185, 167,  73, 236, 200, // .....g...I..\n  28, 227, 106, 162, 213, 193,  64,  74, 252, 189, 241, 146, // ..j...@J....\n   3,  50, 124,  99,  46, 170, 248,   2,  82, 221, 243, 229, // .2|c....R...\n 171,  26, 226, 115,  54,  28, 215, 227,  49, 221, 215, 106, // ...s6...1..j\n   9, 231, 178, 196, 225,  86, 248,  79,  92, 110,  57, 163, // .....V.O.n9.\n 227, 101,  98,  47,  17, 204, 220,  36, 241,   1, 176,  69, // .eb/...$...E\n  47, 171, 105, 159,  53,  15,  92,  87, 216,  10, 119, 129, // /.i.5..W..w.\n 133, 240, 150, 242,  51,   4,  37, 143, 129, 170, 158,  31, // ....3.%.....\n 239,  48, 238,  13, 228, 209, 136,  72, 245, 151, 210,  93, // .0.....H...]\n 234,  26,  43, 194, 202, 195,  37, 114,  26, 217, 115,  66, // ..+...%r..sB\n   8,  96, 177, 213, 203, 131, 177, 129, 187,  91, 156, 186, // .`.......[..\n  71,   5, 199,  84, 102, 122, 188, 185, 191, 106,  76, 180, // G..Tfz...jL.\n 229, 252,  92, 208, 187,  17, 150,  48, 103, 252,  50, 129, // .......0g.2.\n 185,  75, 215, 157,  36, 240, 237, 237, 116, 123, 197,  29, // .K..$...t{..\n  76,  28, 141,  57, 186, 154,  56, 246, 244,  51,  31, 176, // L..9..8..3..\n  63, 112,  65,  77,  18,  80, 102, 196,  88, 253, 128, 123, // ?pAM.Pf.X..{\n 237, 181,  51, 105, 193,  52, 227,  88, 102, 202, 158,  88, // ..3i.4.Xf..X\n 192, 229, 136,  46,  80, 233, 164,  97, 227,  64, 237, 213, // ....P..a.@..\n 131, 108, 143, 139,  82, 171,  99, 161, 241, 121,  81, 228, // .l..R.c..yQ.\n   5,  59, 195,  37, 162,  12, 106, 245, 158, 134, 195, 102, // .;.%..j....f\n 133, 204, 205, 253, 131, 179,  91, 193,  65, 128, 118,  70, // ......[.A.vF\n  54, 136, 209,  61, 106,  37, 202, 181,  99, 243, 254, 117, // 6..=j%..c..u\n 248, 121, 107, 133, 177,  95, 173, 178, 125, 181,  46, 242, // .yk.._..}...\n  91,   4, 155, 123, 104, 232,   9,  60, 179,  46, 135, 227, // [..{h..<....\n  22, 169,  14, 137, 100, 238, 229,   3,  27,   9, 177,  76, // ....d......L\n 112,  26, 197, 149,  72, 121,  89,  80, 104, 236, 204, 181, // p...HyYPh...\n 250, 174,  96, 146,  36,  29, 196, 209, 235,  39, 142, 147, // ..`.$....'..\n 149,  54,  65,  29, 226, 200,  78,  64,  65,  20, 116, 150, // .6A...N@A.t.\n 198, 251, 183, 215, 240, 237, 220,  20, 166, 103, 109, 205, // .........gm.\n   6, 184, 153, 144,  27, 143, 154, 112, 136,  29, 236,  15, // .......p....\n 220, 142, 244,  83, 218,  96, 144, 217, 162, 166, 236, 145, // ...S.`......\n 126, 136,  88,  63, 133, 216,  38, 175, 214, 230,  54,  59, // ~.X?..&...6;\n  63, 102,  46,  33, 173, 155, 164, 212,  51, 251, 237,  13, // ?f.!....3...\n 174, 214,  58, 155,  44, 161,   1, 158, 235, 195, 193, 159, // ..:.,.......\n 167,  55,  26, 113, 172,  15, 150, 124,  76,  54,  58, 175, // .7.q...|L6:.\n  43, 105, 110, 219,  79,  96, 144,  79,  88, 243, 222, 202, // +in.O`.OX...\n  75, 249, 139, 124, 143, 150, 239, 104, 214,  31,  77, 206, // K..|...h..M.\n  80, 254, 108,   2, 114, 249,  71,  27, 181, 201, 175, 141, // P.l.r.G.....\n  44, 203,  79,  84, 123, 162, 118,  15, 138, 126, 239,  34, // ,.OT{.v..~.\"\n 173, 181, 177, 251, 107, 239,  82, 106, 249,  30,  14, 153, // ....k.Rj....\n  32, 244,  60,  89, 165,  46, 209, 115,   1, 251, 196,  95, //  .<Y...s..._\n 210,  37,  31, 147, 210, 243, 148, 249,  98, 223, 222,  42, // .%......b..*\n 233,  47,  57, 164, 108, 195,  86, 174,  48, 237,  40,  91, // ./9.l.V.0.([\n  71, 181, 185,  94, 116, 118, 247, 219, 222,  19, 148, 247, // G..^tv......\n 234,  84, 254, 233,  37,  90, 246, 179, 179, 127,  30, 220, // .T..%Z......\n 149, 169, 223, 189, 183,  48, 199,  47, 219, 233, 170,  73, // .....0./...I\n  69, 143,  82,  38, 124, 229, 201, 209, 171, 154,   7, 179, // E.R&|.......\n   0,  18, 224,  39, 218, 230, 103,  33, 193, 242, 209, 195, // ...'..g!....\n   2, 172, 178,  98, 120, 184, 120, 146, 206,  90,  83,  52, // ...bx.x..ZS4\n  41, 114, 139,  40,  51, 235,  61,  93,  44, 204,  12, 157, // )r.(3.=],...\n  14,  99,  47,  98, 111,  91, 213, 165, 217,  87, 183, 230, // .c/bo[...W..\n 191,  25, 130, 246,  87, 252,  74,  76,   7, 153,  81, 154, // ....W.JL..Q.\n  84,  51, 250,  11,  73, 175,  74, 204,  76, 102,   7,  23, // T3..I.J.Lf..\n  42, 144,  76, 219,  78, 222,  42, 209,  35, 197, 247, 143, // *.L.N.*.#...\n 209, 126, 246, 127,  64, 123,  12, 229, 223,  15, 200, 255, // .~..@{......\n 185, 252, 213, 123, 116, 166, 220,  91, 239, 202,  39, 123, // ...{t..[..'{\n  49, 239,  95,  99, 254, 195, 177, 230, 189, 250,  66, 126, // 1._c......B~\n 223,  31, 249, 132, 103, 152, 145,  60, 155, 124, 152, 243, // ....g..<.|..\n  15, 169, 105,  47, 221,  21,  68, 224, 179, 105, 133, 177, // ..i/..D..i..\n  34,  83, 216, 205, 244, 107, 255, 116,  54,  59, 255, 175, // \"S...k.t6;..\n  86,   4,  82, 205, 169, 134,  11,  64, 216, 172,   3, 172, // V.R....@....\n 136, 224, 112, 254,  66, 101,  54,  31, 160,  77,  67, 135, // ..p.Be6..MC.\n 242, 159,   7, 135, 247, 123, 245, 223, 199, 246,  14,  27, // .....{......\n   9, 160, 110, 144, 214, 157, 252,  92, 186, 115, 102, 206, // ..n......sf.\n 126,  37,  52, 193, 174, 236, 127,  68, 119,  66,  69, 116, // ~%4....DwBEt\n  87, 235,  46, 223,   3, 246, 171, 204,  10,  97,  92,  50, // W........a.2\n  78, 113,  95, 146, 135, 218,  63, 136, 201, 123, 238,  47, // Nq_...?..{./\n  52, 211,  78,  61, 235,  82, 191, 209, 203, 250, 234, 103, // 4.N=.R.....g\n 115,  74,  63, 104, 240,  72, 236,  31,  92, 109,   4, 189, // sJ?h.H...m..\n 245, 154, 197, 157,  34, 132,   9, 212, 183,  94, 119,  11, // ....\"....^w.\n 108,   4, 229, 242, 241, 129, 194, 154, 254, 168, 245, 192, // l...........\n 108, 246,  60,  69,  34,  48,  52, 133, 206, 107,   1, 247, // l.<E\"04..k..\n 142, 180, 170, 127, 208,  83, 151, 209,  70, 232,  77, 183, // .....S..F.M.\n  64, 168, 146, 184, 255, 238, 104, 222,  52,  49, 222, 238, // @.....h.41..\n  59, 115,  81, 213, 170, 133,   3,  45, 172,  27, 124, 216, // ;sQ....-..|.\n  90, 247,  91,  97,  19, 237, 185,  23, 136, 251, 126, 171, // Z.[a......~.\n  77,  57, 153, 247, 104, 156, 242,  97,   3, 186, 103, 243, // M9..h..a..g.\n 121, 176, 193,  75, 147, 172, 248, 113,  52, 250, 145, 118, // y..K...q4..v\n 198,   3, 139,   3, 136, 159,  71, 163, 159, 105, 243, 111, // ......G..i.o\n 173, 153, 204, 148, 119, 105,  35,  13, 154, 145, 222,  88, // ....wi#....X\n 122, 217, 163, 149, 103, 143,  86, 157, 217, 181, 241,  36, // z...g.V....$\n 198, 106,  31, 204, 243, 199, 104, 244, 135, 243, 184, 204, // .j....h.....\n  19, 178, 104,  26, 152, 252, 222, 133, 253,  28, 164,  11, // ..h.........\n  61, 186, 149, 251, 206, 168,  60,  89, 132,  95,  56, 143, // =.....<Y._8.\n  80, 232,  63, 106,  93,  86,  95, 101, 201,  38,  36, 204, // P.?j]V_e.&$.\n 223,  20, 225, 134, 210, 160, 222,  47,  79, 117,  10, 132, // ......./Ou..\n  29, 143,  31, 101, 245, 157, 184,  40, 213,  97,  97, 143, // ...e...(.aa.\n  40,  88,  23, 153,  67,  54, 163,  48, 139, 116, 122, 136, // (X..C6.0.tz.\n 137,  78, 229, 238,  48,  99, 114,  86, 170, 215,  16,  64, // .N..0crV...@\n  56,  79, 196, 148, 134, 123, 153,  58, 186,  24, 236,   4, // 8O...{.:....\n 226, 229,  85, 228,  39,  93, 186, 200, 135,  73,  23, 245, // ..U.']...I..\n  61, 150, 128,  61, 203, 135, 201,  63,  39,  71, 143, 101, // =..=...?'G.e\n 104, 173, 108, 123, 146,  86, 186,  56,  24, 100, 180, 132, // h.l{.V.8.d..\n  31, 216,  53,  77, 173,  89, 188, 173,  80,  85,  71, 103, // ..5M.Y..PUGg\n 209, 230,  20, 245, 116, 203,  79,  82, 184,  86, 230, 170, // ....t.OR.V..\n 158, 204, 125,  61,  26, 125, 109, 162,  49, 217, 158, 202, // ..}=.}m.1...\n   7,  60, 255, 100,  52, 250, 228,  33, 207, 233, 210, 221, // .<.d4..!....\n 242, 155,  53, 195, 113, 190, 191, 169, 167, 115, 155, 140, // ..5.q....s..\n  42, 215, 199, 220, 147, 163,   4, 239, 156, 132, 162, 111, // *..........o\n 250, 166,  71,  95,  86, 114, 162, 150,  63,  30, 177, 167, // ..G_Vr..?...\n 151,  54, 168,  15,   6,  51,   8, 111, 231,  33,  92, 170, // .6...3.o.!..\n 251,  86, 121, 160, 233,  94, 222,   8,  52, 231,  45,  76, // .Vy..^..4.-L\n  17,  65, 241,   3, 178, 247, 195,  93, 122,  65,  64, 111, // .A.....]zA@o\n 161, 251, 105, 220, 228,   0, 237, 177, 231, 195, 179, 140, // ..i.........\n  31, 132, 238, 105, 137, 209, 161, 247, 219,  75,  79,  76, // ...i.....KOL\n 233, 114,  27, 122, 238,  98, 134,  66, 157,  34, 184, 207, // .r.z.b.B.\"..\n 250, 193, 189, 121,  59,  67,  25, 172, 241, 120,  33,  83, // ...y;C...x!S\n  78, 101, 193, 254,  99,  92, 163, 234, 217, 169, 255, 146, // Ne..c.......\n  94,  66, 112, 231,   2, 243, 205, 199, 227,  98,  49, 125, // ^Bp......b1}\n 165, 232, 209,  73,  69, 184,  83, 255,  51,  91,  57,  93, // ...IE.S.3[9]\n  40, 147, 143, 154, 132, 101, 153,  92, 101,  30,  53,  53, // (....e..e.55\n  13, 124, 227,  84, 248, 159,  51,  16,  55,  41, 215, 142, // .|.T..3.7)..\n  88, 145, 209,  17, 146,  47,  90,  36, 174, 113, 172, 210, // X..../Z$.q..\n 241, 112, 136, 112, 152, 179,  19, 225, 118, 155, 238, 188, // .p.p....v...\n  84,  70,  68,  24, 122, 214,  56,  31,  14, 249,  16,  94, // TFD.z.8....^\n   8, 242, 101, 216, 104, 228,  66, 166, 244, 190, 197, 172, // ..e.h.B.....\n 253, 165, 143,  77,  20, 207,  95,  98, 251, 156, 146,  83, // ...M.._b...S\n  57, 142, 114,  11, 153, 182, 153,  34, 132, 159, 244,  14, // 9.r....\"....\n  86, 223,  62, 251,  33, 220, 202, 213, 161, 143, 109, 216, // V.>.!.....m.\n  15, 231,  22, 225, 143, 241, 161, 219,  51, 136, 146, 154, // ........3...\n 237, 176, 146, 195,  16, 134, 160, 231,  74,  18,  93,  88, // ........J.]X\n 167, 169, 242,  88, 109, 146, 160,   4,  68,  65,  93, 127, // ...Xm...DA].\n  14, 199,  25, 230,  26, 220,  73,  56, 226,  67,  89, 208, // ......I8.CY.\n  79, 173, 232,  72,  74,  15, 160, 233, 246, 144, 159, 193, // O..HJ.......\n   0,  95, 174, 242, 238, 237, 197, 191, 126,  43, 255, 243, // ._......~+..\n 183,  12,  63, 141,  43, 124, 242, 226, 138,  31, 160, 136, // ..?.+|......\n  89, 109,  54, 141, 224,   0,  81,  22, 229, 226,  29, 138, // Ym6...Q.....\n  92, 204,  60, 219, 249, 138,  59, 177, 130, 151, 194, 127, // ..<...;.....\n 105,  32, 134, 147, 201, 132,  82, 121,  57,  84, 196, 225, // i ....Ry9T..\n 248,  12,  96,  39,  45,   4, 122,   6, 109, 215, 231, 242, // ..`'-.z.m...\n  68, 194,  71, 192,  12, 213, 151, 234, 115, 122, 159, 155, // D.G.....sz..\n  55, 205,   0, 166, 145,  88,  95, 145, 163,  99,   1,  43, // 7....X_..c.+\n   0, 230,  28,  47, 169,  47,  56,  78, 234,  58, 128, 220, // ..././8N.:..\n 117,   8, 166, 196, 158, 159,  78,  37, 175, 117, 247,  78, // u.....N%.u.N\n 138, 222,  54, 210,  97,  97, 150, 144,  66,  33,  83,  47, // ..6.aa..B!S/\n  17, 162,  21, 241,   8,   3, 162, 215, 122, 158,  44, 220, // ........z.,.\n 152,   8,  99,  16, 242, 163, 101,  14, 167, 135,   7, 206, // ..c...e.....\n 134, 175, 249, 185, 199, 204,  35,   4, 160, 116,  13, 215, // ......#..t..\n  88, 189,  18, 126,  62,  86,  25,  75,  52,  64, 158,  63, // X..~>V.K4@.?\n 183, 219,  31, 126, 105, 129,  29, 131,   0, 167, 178, 113, // ...~i......q\n  78, 185, 214,  98, 150,  81,  38, 120,  70,  44,  51, 163, // N..b.Q&xF,3.\n  63,  29, 126, 106, 238,  65, 134, 159, 154,  97,   5,  26, // ?.~j.A...a..\n  91,  20,  52,  31, 208, 128,  74, 244, 216,  79, 181, 136, // [.4...J..O..\n  63, 135, 205, 205,  45, 242, 225,  11, 110,  38, 167, 248, // ?...-...n&..\n 245, 231, 192, 195,  99, 205, 250, 199, 244,  62, 133, 145, // ....c....>..\n  56,  62, 214, 138, 114, 190, 132, 180, 150, 174,  98, 232, // 8>..r.....b.\n 249,  18, 212, 172, 168,   3,  28,  27,  62,  27, 218,  69, // ........>..E\n 253,  86, 181, 165, 172,  45,  21,   7, 171, 123, 105, 232, // .V...-...{i.\n 208, 206,  49,  28, 180, 164, 192,  74,  63, 147, 118,  22, // ..1....J?.v.\n 167,  67,  76, 194,  61, 167,   2,  48, 166, 251, 191,  15, // .CL.=..0....\n  56,  74, 132, 251, 175,  17, 167, 179, 204,  39, 189, 220, // 8J.......'..\n 155, 168,  49,  20,  83, 125, 183, 205, 139, 234,  62, 124, // ..1.S}....>|\n  22, 150, 207, 214, 208,  60, 254,  86, 155,  84, 254,  64, // .....<.V.T.@\n  37,  19, 157, 202, 152, 202, 109,  82,  72, 126,  67,  85, // %.....mRH~CU\n 115,  79,  99,  51,  74, 242,  91, 106, 130,  91, 201,  81, // sOc3J.[j.[.Q\n 142, 252, 211, 214, 222, 235, 184, 142,  48, 254, 111, 182, // ........0.o.\n 126,  14, 239,  36, 170, 228, 247, 182, 250,  54, 220, 225, // ~..$.....6..\n 252, 182, 141, 127, 111, 199, 172, 228,  63, 108, 249, 187, // ....o...?l..\n 205,  86,  23,  56,  84, 110, 244,  69, 152, 197, 169, 150, // .V.8Tn.E....\n 191, 218, 142,  31, 244,  38, 151, 255, 180, 149, 179,  48, // .....&.....0\n  77, 151,  97, 116,  45, 181, 118,  45, 118,  85, 153, 107, // M.at-.v-vU.k\n 232, 188,  93,  25, 184,  54, 206, 156, 124, 141, 179,  51, // ..]..6..|..3\n  14, 139, 221, 126, 250,  31, 255,  11,  22,  19, 178, 116, // ...~.......t\n 138,  51,   0,   0, 0 // .3..\n};\nstatic const unsigned char v4[] = {\n  31, 139,   8,   8,  67, 234, 193, 103,   0,   3, 115, 116, // ....C..g..st\n 121, 108, 101,  46,  99, 115, 115,   0, 149,  85, 193, 142, // yle.css..U..\n 155,  48,  16, 189, 231,  43,  92, 173,  42, 181, 171, 192, // .0...+..*...\n 134,  16,  96,  33, 151, 222, 250,  17,  85,  15,   6, 155, // ..`!....U...\n 196,  90,  99,  35, 227, 108, 146,  86, 249, 247, 142, 109, // .Zc#.l.V...m\n 192,  70,  75,  85, 245, 146, 144, 153, 225, 205, 155, 247, // .FKU........\n 198, 206,  51, 250, 141, 106, 121, 139,   6, 246, 139, 137, // ..3..jy.....\n  83,   5, 207, 138,  80,  21,  65, 232, 136,  30, 155, 179, // S...P.A.....\n 238, 248,  22,  98, 228,  14, 101,  29,  86,  39,  38,  42, // ...b..e.V'&*\n 180,  59, 162,  30,  19,  98, 203, 225, 249,  76, 217, 233, // .;...b...L..\n 172,  43, 148, 236, 118, 159, 143, 168, 149, 194,  60, 231, // .+..v.....<.\n 253,  13,  13,  88,  12, 209,  64,  21, 107,  13, 212,  64, // ...X..@.k..@\n  57, 109, 244,  22,  49, 209,  95, 224, 139, 227, 154, 242, // 9m..1._.....\n 170, 170, 105,  43,  21, 221,  34,  77, 111,  26,  43, 138, // ..i+..\"Mo.+.\n 161, 141, 188, 104, 206,   4, 173, 144, 144, 130,  30,  29, // ...h........\n 185,  51,  38, 242,  90, 153,   0, 250, 196, 186,  94,  42, // .3&.Z.....^*\n 141, 133,  62, 142, 100, 161, 157, 233,  38,  57,  35, 232, // ..>.d...&9#.\n 169, 105, 154,  69, 201,  99, 211,  43,  10, 168, 141, 228, // .i.E.c.+....\n  18,  42, 159, 210,  34, 117,  36, 163,  22, 119, 140, 223, // .*..\"u$..w..\n  43, 212,  73,  33, 135,  30,  55, 116, 140,  95, 199, 121, // +.I!..7t._.y\n 106, 201,   1, 124,  12, 130,  60, 192, 104, 232,  48, 231, // j..|..<.h.0.\n  38,  86, 227, 230, 237, 164, 228,  69,  16, 128,  36, 132, // &V.....E..$.\n   4, 138,  36, 180, 155, 136,  69,  10,  19, 118,  25,  64, // ..$...E..v.@\n 165, 120, 111, 162, 143, 205,  52, 230,  40, 131, 213, 126, // .xo...4.(..~\n 109, 132,  80, 225,  56, 165,  29, 124, 102, 128, 240,   1, // m.P.8..|f...\n  96, 139,  98, 168, 147,   2, 190, 173, 160,   0,  24, 208, // `.b.........\n  77,  14, 189, 117,  17, 170, 113, 245, 206,   6, 166,  41, // M..u..q....)\n  49, 143, 184, 209, 236,  61,  20,  37, 203, 172,  69, 206, // 1....=.%..E.\n 231, 197, 108,  89, 150, 153, 140, 235,  18, 188,  81, 150, // ..lY......Q.\n 229,  17, 117,  76,  68,  87,  70, 244, 185,  66, 133, 229, // ..uLDWF..B..\n 135,  76, 233,  68, 100,  81,  10, 241,  90,   3, 192,   6, // .L.DdQ..Z...\n  45, 181, 179, 179, 126,  80,  43, 245,  26, 218,  21, 155, // -...~P+.....\n 160, 218,  22, 120,  54,  23,  53, 152,  95, 189, 100,  66, // ...x6.5._.dB\n 131,  25,   0,  73, 216, 208, 115,  12,  94,  50,  97,  86, // ...I..s.^2aV\n  39, 170, 185, 108, 222,  22,  26, 230, 160, 161, 245,  96, // '..l.......`\n 205, 226, 141,  99, 247,   3,  96, 112, 205,  41, 249, 105, // ...c..`p.).i\n 182,  16,  54, 130, 233, 187, 121,  55, 243,  61, 241,  69, // ..6...y7.=.E\n  75, 112,  33,  30,  58,  41, 245,  25, 202, 180, 130,  37, // Kp!.:).....%\n 103, 154,  73,  56,  23, 176,  27,  40, 222,  15, 118, 216, // g.I8...(..v.\n   6, 218,  96, 160, 162, 130, 115,   3, 253,  29,   0,  68, // ..`...s....D\n 110, 147, 112, 249, 126, 103,  76,  10,  69, 185, 158, 193, // n.p.~gL.E...\n 168, 127, 110,  84, 230,  54,  42,  38,  81, 203, 233,  13, // ..nT.6*&Q...\n 218, 204,  34, 152, 223,  71,  96, 195,  78,  34,   2, 164, // ..\"..G`.N\"..\n  14, 202,  27, 106, 165, 114, 245, 246,  24,   5, 245, 238, // ...j.r......\n 156,  25,  13, 108, 143, 245, 165, 180,  75,  14,  53, 150, // ...l....K.5.\n  35,  37, 115, 209,  10,  35,  33, 175,  10, 247,  80,  97, // #%s..#!...Pa\n   7, 137, 236, 217,  50,  93,  76, 212,  22, 116, 195, 201, // ....2]L..t..\n 188, 191,  56,  67, 180, 157, 103, 228, 180,   5, 111,  50, // ..8C..g...o2\n 223,  59,  43, 201, 194, 204, 108,  54, 210, 237, 121, 105, // .;+...l6..yi\n  46, 158,  73, 229, 196, 156,  22, 191,  50,  69,  81, 216, // ..I.....2EQ.\n 158, 243, 121,  11, 187, 182,  20,  47, 128, 141,  67, 235, // ..y..../..C.\n 106,  31, 198, 217, 224, 114,  90, 193, 193, 134, 253, 127, // j....rZ.....\n 225, 244,  42,  74,   0, 101, 124,  39,  82, 110,  31, 189, // ..*J.e|'Rn..\n 134, 221, 221, 230, 221,  80, 145, 150, 253, 124,  44, 198, // .....P...|,.\n  80,  45, 181, 150, 221,  20,  53, 111, 240, 240,  13, 167, // P-....5o....\n 225, 140, 183, 121, 121,  70, 223,  21, 104, 249, 252,  98, // ...yyF..h..b\n  44, 188, 126,  92,  23, 243,  25,  25, 135,  96, 255,  38, // ,.~......`.&\n 159,  64, 195, 191,  95, 251, 242, 157, 170, 150, 195, 173, // .@.._.......\n  60, 238, 180, 171, 143, 146, 189,  49, 222, 237, 182, 251, // <......1....\n  71, 152,  18, 137,  79, 148,  73, 156, 231,  65, 106, 231, // G...O.I..Aj.\n  83, 175, 105, 156, 166,  62,  85, 250,  76, 145, 249, 240, // S.i..>U.L...\n 171,  15, 231, 249,   2, 171, 240, 153, 236, 117,   1, 149, // .........u..\n   7, 153, 128,  87, 230, 195, 135,  37, 173, 131, 207, 164, // ...W...%....\n  75,  86, 169, 207, 236,   3,  86, 225, 232,  75,  86, 193, // KV....V..KV.\n 236,  51, 169, 111,  29,  37,  12, 163,  47, 193,  45, 154, // .3.o.%../.-.\n 164,   9, 220,   6,  95, 161, 120, 245,   2, 113,  66,  79, // ...._.x..qBO\n 181, 251, 194, 222,  28, 143,  16, 202, 223,  43, 229, 126, // .........+.~\n  66,  50, 118, 143,  86,  46, 125, 129,  23, 255,   0, 132, // B2v.V.}.....\n 122, 103,  55, 254,   7,   0,   0, 0 // zg7....\n};\n\nstatic const struct packed_file {\n  const char *name;\n  const unsigned char *data;\n  size_t size;\n  time_t mtime;\n} packed_files[] = {\n  {\"/web_root/index.html.gz\", v1, sizeof(v1), 1740761667},\n  {\"/web_root/main.js.gz\", v2, sizeof(v2), 1740761667},\n  {\"/web_root/preact.min.js.gz\", v3, sizeof(v3), 1740761667},\n  {\"/web_root/style.css.gz\", v4, sizeof(v4), 1740761667},\n  {NULL, NULL, 0, 0}\n};\n\nstatic int scmp(const char *a, const char *b) {\n  while (*a && (*a == *b)) a++, b++;\n  return *(const unsigned char *) a - *(const unsigned char *) b;\n}\nconst char *mg_unlist(size_t no) {\n  return packed_files[no].name;\n}\nconst char *mg_unpack(const char *name, size_t *size, time_t *mtime) {\n  const struct packed_file *p;\n  for (p = packed_files; p->name != NULL; p++) {\n    if (scmp(p->name, name) != 0) continue;\n    if (size != NULL) *size = p->size - 1;\n    if (mtime != NULL) *mtime = p->mtime;\n    return (const char *) p->data;\n  }\n  return NULL;\n}\n"
  },
  {
    "path": "tutorials/http/uart-bridge/web_root/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>Device Dashboard</title>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <link rel=\"stylesheet\" href=\"style.css\" />\n  </head>\n  <body></body>\n  <script type=\"module\" src=\"main.js\"></script>\n</html>\n"
  },
  {
    "path": "tutorials/http/uart-bridge/web_root/main.js",
    "content": "'use strict';\nimport {Component, h, html, render, useEffect, useState, useRef} from './preact.min.js';\n\nconst Message = m => html`<span\n  style=\"color: ${m.message.uart ? '#444' : '#373'};\">\n  ${m.message.data}\n</span>`;\n\nconst App = function(props) {\n  const [cfg, setCfg] = useState({tcp: {}, ws: {}, mqtt: {}});\n  const [messages, setMessages] = useState([]);\n  const [connected, setConnected] = useState(false);\n  const [txt, setTxt] = useState('');\n  const [ws, setWs] = useState(null);\n\n  const refresh = () =>\n      fetch('/api/config/get').then(r => r.json()).then(r => setCfg(r));\n\n  const getport = (url, v) => ((url || '').match(/.*:(\\d+)/) || ['', v])[1];\n\n  const watchWebsocket = function() {\n    // Connect to websocker port, to implement WS console\n    var reconnect = function() {\n      var port = getport(cfg.ws.url, 4002);\n      var l = window.location, proto = l.protocol.replace('http', 'ws');\n      var tid, url = `${proto}//${l.hostname}:${port}/ws`;\n      // console.log(url);\n      var ws = new WebSocket(url);\n      ws.onopen = () => {\n        setConnected(true);\n        setWs(ws);\n      };\n      ws.onmessage = ev => {\n        // console.log(ev, ev.data);\n        setMessages(x => x.concat([{data: ev.data, uart: true}]));\n      };\n      ws.onclose = function() {\n        clearTimeout(tid);\n        tid = setTimeout(reconnect, 1000);\n        setConnected(false);\n        setWs(null);\n      };\n    };\n    reconnect();\n  };\n\n  useEffect(() => {\n    refresh();\n    watchWebsocket();\n  }, []);\n\n\n  const sendmessage = ev => {\n    setMessages(x => x.concat([{data: txt + '\\n', uart: false}]));\n    if (ws) ws.send(txt + '\\n');\n    setTxt('');\n  };\n\n  const onchange = ev => fetch('/api/config/set', {\n                           method: 'POST',\n                           headers: {'Content-Type': 'application/json'},\n                           body: JSON.stringify(cfg),\n                         }).then(r => ws && ws.close());\n\n  const set = obj => setCfg(x => Object.assign(x, obj));\n  const nset = (n,obj) => setCfg(x => Object.assign(x, {[n]: Object.assign(x[n],obj)}));\n  const setTx = ev => set({tx: parseInt(ev.target.value)});\n  const setRx = ev => set({rx: parseInt(ev.target.value)});\n  const setBaud = ev => set({baud: parseInt(ev.target.value)});\n  const setTcpUrl = ev => nset('tcp', {url: `tcp://0.0.0.0:${ev.target.value}`});\n  const setWsUrl = ev => nset('ws',{url: `ws://0.0.0.0:${ev.target.value}`});\n  const setMqttUrl = ev => nset('mqtt',{url: ev.target.value});\n  const setTcpEna = ev => (nset('tcp',{enable: ev.target.checked}), onchange());\n  const setWsEna = ev => (nset('ws',{enable: ev.target.checked}), onchange());\n  const setMqttEna = ev =>(nset('mqtt', {enable: ev.target.checked}), onchange());\n\n  return html`\n<div class=\"container\">\n  <h1 style=\"margin-bottom: 0;\">UART \\u27F7 network bridge </h1>\n  <pre class=\"d-none\">${JSON.stringify(cfg, null, 2)}</pre>\n  <div class=\"row\">\n    <div class=\"col col-4\">\n      <h3>UART configuration</h3>\n      <div class=\"d-flex pr-1 my-1\">\n        <label class=\"addon\">UART TX pin</label>\n        <input style=\"width: 5em;\" value=${cfg.tx} onchange=${onchange}\n          oninput=${setTx} />\n      </div><div class=\"d-flex pr-1 my-1\">\n        <label class=\"addon\">UART RX pin</label>\n        <input style=\"width: 5em;\" value=${cfg.rx} onchange=${onchange}\n          oninput=${setRx} />\n      </div><div class=\"d-flex pr-1 my-y\">\n        <label class=\"addon\">UART Baud</label>\n        <input style=\"width: 5em;\" value=${cfg.baud} onchange=${onchange}\n          oninput=${setBaud} />\n      </div>\n    </div>\n    <div class=\"col col-8\">\n      <h3>Network configuration</h3>\n      <div class=\"d-flex my-1\">\n        <label class=\"addon\">Local TCP port</label>\n        <input style=\"min-width: 4em; flex: 1 100%;\"\n          value=${getport(cfg.tcp.url, 4001)} onchange=${onchange}\n          oninput=${setTcpUrl} />\n        <label class=\"ml-1 d-flex label\"><input type=\"checkbox\"\n          checked=${cfg.tcp.enable} onchange=${setTcpEna} /> enable</label>\n      </div><div class=\"d-flex my-1\">\n        <label class=\"addon\">Local WS port</label>\n        <input style=\"flex: 1 100%;\"\n          value=${getport(cfg.ws.url, 4002)} onchange=${onchange}\n          oninput=${setWsUrl} />\n        <label class=\"ml-1 d-flex label\"><input type=\"checkbox\"\n          checked=${cfg.ws.enable} onchange=${setWsEna} /> enable</label>\n      </div><div class=\"d-flex my-1\">\n        <label class=\"addon\">Remote MQTT</label>\n        <input style=\"flex: 1 100%;\"\n          value=${cfg.mqtt.url} onchange=${onchange}\n          oninput=${setMqttUrl} />\n        <label class=\"ml-1 d-flex label\"><input type=\"checkbox\"\n          checked=${cfg.mqtt.enable} onchange=${setMqttEna} /> enable</label>\n      </div>\n    </div>\n  </div>\n\n  <div class=\"msg\">\n    Note: to connect over MQTT, \n      open <a href=\"http://www.hivemq.com/demos/websocket-client/\">\n        console</a>, subscribe to b/tx and publish to b/rx<br/>\n    Note: to connect over TCP, use netcat utility:<br/>\n    $ nc ${location.hostname} ${getport(cfg.tcp.url, 4001)}\n  </div>\n\n  <div style=\"margin-top: 2em;\">\n    <b>UART console</b><span style=\"margin-left: 1em; color: #777;\">works \n    over the local WS port. WebSocket status: </span><span\n      style=\"color: ${connected ? 'teal' : 'red'};\">\n      \\u25cf ${connected ? 'connected' : 'disconnected'} </span>\n  </div>\n  <div style=\"margin: 0.5em 0; display: flex\">\n    <input placeholder=\"to send data, type and press enter...\" style=\"flex: 1 100%;\"\n      value=${txt} onchange=${sendmessage}\n      oninput=${ev => setTxt(ev.target.value)} />\n    <button style=\"margin-left: 1em;\"\n      onclick=${ev => setMessages([])}>clear</button>\n  </div>\n  <pre style=\"height: 15em; overflow: auto;\">\n    ${messages.map(message => h(Message, {message}))}\n  </pre>\n\n</div>`;\n};\n\nwindow.onload = () => render(h(App), document.body);\n"
  },
  {
    "path": "tutorials/http/uart-bridge/web_root/style.css",
    "content": "* { box-sizing: border-box; }\nhtml, body { margin: 0; padding: 0; height: 100%; font: 16px sans-serif; }\nselect, input, label::before, textarea { outline: none; box-shadow:none !important; border: 1px solid #ccc !important; }\npre { color: #373; font-family: monospace; font-weight: bolder; font-size: smaller; background: #ddd; padding: 1em; border-radius: 0.2em; }\ntextarea, input { border: 1px solid #ccc; padding: 0.3em 0.5em;}\ntextarea, input, .addon, .label { font-size: 14px; }\na, a:visited, a:active { color: #55f; }\nbody {background: #555; }\n.addon { color: #999; min-width: 7.5em;  }\n.label { color: #999; }\n.btn {\n  background: #ccc; border-radius: 0.3em; border: 0; color: #fff; cursor: pointer;\n  display: inline-block; padding: 0.6em 2em; font-weight: bolder;\n}\n.btn[disabled] { opacity: 0.5; cursor: auto;}\n.smooth { transition: all .2s; }\n.container { margin: 2em auto; max-width: 620px; background: white; padding: 1em; border-radius: 0.5em; }\n.d-flex { display: flex; align-items: center; }\n.d-none { display: none; }\n.border { border: 1px solid #ddd; }\n.rounded { border-radius: 0.5em; }\n.nowrap { white-space: nowrap; }\n.msg { background: #def; border-left: 5px solid #59d; padding: 0.5em; font-size: 90%; margin: 1em 0; color: #777; }\n.input { background: #fea; padding: 0.2em 1em; border-radius: 0.4em; }\n.output { background: #aef; padding: 0.2em 1em; border-radius: 0.4em; }\n.pr-1 { padding-right: 0.5em; }\n.my-1 { margin-top: 0.3em; margin-bottom: 0.3em;}\n.ml-1 { margin-left: 0.5em; }\n\n/* Grid */\n.row { display: flex; flex-wrap: wrap; }\n.col { margin: 0; padding: 0; overflow: auto; }\n.col-12 { width: 100%; }\n.col-11 { width: 91.66%; }\n.col-10 { width: 83.33%; }\n.col-9 { width: 75%; }\n.col-8 { width: 66.66%; }\n.col-7 { width: 58.33%; }\n.col-6 { width: 50%; }\n.col-5 { width: 41.66%; }\n.col-4 { width: 33.33%; }\n.col-3 { width: 25%; }\n.col-2 { width: 16.66%; }\n.col-1 { width: 8.33%; }\n@media (min-width: 1310px) { .container { margin: auto; width: 1270px; } }\n@media (max-width: 920px) { .row .col { width: 100%; } }\n"
  },
  {
    "path": "tutorials/http/video-stream/Makefile",
    "content": "PROG ?= example                   # Program we are building\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c       # Source code files\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\n#CFLAGS_MONGOOSE += -DMG_ENABLE_LINES\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= example.exe           # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\nendif\n\nall: $(PROG)              # Default target. Build and run program\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)       # Build program from sources\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nclean:                    # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM\n"
  },
  {
    "path": "tutorials/http/video-stream/README.md",
    "content": "See detailed tutorial at https://mongoose.ws/tutorials/http/video-stream/\n"
  },
  {
    "path": "tutorials/http/video-stream/main.c",
    "content": "// Copyright (c) 2020 Cesanta Software Limited\n// All rights reserved\n\n#include \"mongoose.h\"\n\n// HTTP request handler function. It implements the following endpoints:\n//   /api/video1 - hangs forever, returns MJPEG video stream\n//   all other URI - serves web_root/ directory\nstatic void cb(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    if (mg_match(hm->uri, mg_str(\"/api/video1\"), NULL)) {\n      c->data[0] = 'S';  // Mark that connection as live streamer\n      mg_printf(\n          c, \"%s\",\n          \"HTTP/1.0 200 OK\\r\\n\"\n          \"Cache-Control: no-cache\\r\\n\"\n          \"Pragma: no-cache\\r\\nExpires: Thu, 01 Dec 1994 16:00:00 GMT\\r\\n\"\n          \"Content-Type: multipart/x-mixed-replace; boundary=--foo\\r\\n\\r\\n\");\n    } else {\n      struct mg_http_serve_opts opts = {.root_dir = \"web_root\"};\n      mg_http_serve_dir(c, ev_data, &opts);\n    }\n  }\n}\n\n// The image stream is simulated by sending MJPEG frames specified by the\n// \"files\" array of file names.\nstatic void broadcast_mjpeg_frame(struct mg_mgr *mgr) {\n  const char *files[] = {\"images/1.jpg\", \"images/2.jpg\", \"images/3.jpg\",\n                         \"images/4.jpg\", \"images/5.jpg\", \"images/6.jpg\"};\n  size_t nfiles = sizeof(files) / sizeof(files[0]);\n  static size_t i;\n  const char *path = files[i++ % nfiles];\n  struct mg_str data = mg_file_read(&mg_fs_posix, path);  // Read next file\n  struct mg_connection *c;\n  for (c = mgr->conns; c != NULL; c = c->next) {\n    if (c->data[0] != 'S') continue;  // Skip non-stream connections\n    if (data.buf == NULL) continue;   // Skip on file read error\n    mg_printf(c,\n              \"--foo\\r\\nContent-Type: image/jpeg\\r\\n\"\n              \"Content-Length: %lu\\r\\n\\r\\n\",\n              data.len);\n    mg_send(c, data.buf, data.len);\n    mg_send(c, \"\\r\\n\", 2);\n  }\n  mg_free((void *) data.buf);\n}\n\nstatic void timer_callback(void *arg) {\n  broadcast_mjpeg_frame(arg);\n}\n\nint main(void) {\n  struct mg_mgr mgr;\n\n  mg_mgr_init(&mgr);\n  mg_http_listen(&mgr, \"http://localhost:8000\", cb, NULL);\n  mg_timer_add(&mgr, 500, MG_TIMER_REPEAT, timer_callback, &mgr);\n  for (;;) mg_mgr_poll(&mgr, 50);\n  mg_mgr_free(&mgr);\n\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/http/video-stream/web_root/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n  <head>\n    <title>example</title>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <style>\n      #container { margin-right: auto; margin-left: auto; max-width: 480px; }\n      #info { background: #e0f0f0; border-radius: .5em; padding: 2em;  }\n      img { width: 100%; margin-top: 1em; border: 1px solid #ccc; }\n\n    </style>\n  </head>\n  <body>\n    <div id=\"container\">\n      <div id=\"info\">\n        A div below shows live MJPEG video stream from the server, which\n        is simulated by reading files from the images/ directory.\n        <br/><br/>\n        You can also use <code>curl</code> command-line utility:\n        <br/><code>curl localhost:8000/api/video1</code>\n      </div>\n      <img src=\"/api/video1\" />\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "tutorials/http/wifi-router-dashboard/Makefile",
    "content": "PROG ?= ./example                 # Program we are building\nPACK ?= ./pack                    # Packing executable\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c net.c # Source code files\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += # -DMG_ENABLE_PACKED_FS=1\n\nifeq ($(OS),Windows_NT)         # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG = example.exe            # Use .exe suffix for the binary\n  PACK = pack.exe               # Packing executable\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\nendif\n\nall: $(PROG)              # Default target. Build and run program\n\t$(RUN) $(PROG) $(ARGS)\n\nweb_root/bundle.js:\n\tcurl -s https://npm.reversehttp.com/preact,preact/hooks,htm/preact,preact-router -o $@\n\npacked_fs.c: $(wildcard web_root/*) Makefile web_root/bundle.js\n\t$(CC) ../../../test/pack.c -o $(PACK)\n\t$(PACK) $(wildcard web_root/*) > $@\n\n$(PROG): $(SOURCES)       # Build program from sources\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nclean:                    # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(PROG) $(PACK) *.o *.obj *.exe *.dSYM\n\nmbedtls:                  # Pull and build mbedTLS library. See see https://mongoose.ws/tutorials/tls/#how-to-build\n\tgit clone --depth 1 -b v2.28.2 https://github.com/mbed-tls/mbedtls $@\n\t$(MAKE) -C mbedtls/library\n"
  },
  {
    "path": "tutorials/http/wifi-router-dashboard/README.md",
    "content": "# A template project for the wifi router\n"
  },
  {
    "path": "tutorials/http/wifi-router-dashboard/main.c",
    "content": "// Copyright (c) 2020-2022 Cesanta Software Limited\n// All rights reserved\n\n#include \"net.h\"\n\nstatic int s_sig_num;\nstatic void signal_handler(int sig_num) {\n  signal(sig_num, signal_handler);\n  s_sig_num = sig_num;\n}\n\nint main(void) {\n  struct mg_mgr mgr;\n\n  signal(SIGPIPE, SIG_IGN);\n  signal(SIGINT, signal_handler);\n  signal(SIGTERM, signal_handler);\n\n  mg_log_set(MG_LL_DEBUG);  // Set debug log level\n  mg_mgr_init(&mgr);\n \n  web_init(&mgr);\n  while (s_sig_num == 0) {\n    mg_mgr_poll(&mgr, 50);\n  }\n\n  mg_mgr_free(&mgr);\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/http/wifi-router-dashboard/net.c",
    "content": "// Copyright (c) 2023 Cesanta Software Limited\n// All rights reserved\n\n#include \"net.h\"\n\n// Authenticated user.\n// A user can be authenticated by:\n//   - a name:pass pair, passed in a header Authorization: Basic .....\n//   - an access_token, passed in a header Cookie: access_token=....\n// When a user is shown a login screen, she enters a user:pass. If successful,\n// a server responds with a http-only access_token cookie set.\nstruct user {\n  const char *name, *pass, *access_token;\n};\n\n// Event log entry\nstruct event {\n  int type, prio;\n  unsigned long timestamp;\n  const char *text;\n};\n\n// Connected Devices\nstruct device {\n  char *dev_name;\n  char *mac;\n  char *ip_addr;\n  int speed;\n  char *connected_to;\n  int lease_time_left;\n  char *last_seen;\n};\n\nstatic struct device s_devices[] = {{.dev_name = \"espressif\",\n                                     .mac = \"02:11:22:33:44:55\",\n                                     .ip_addr = \"192.168.1.1/24\",\n                                     .speed = 1000,\n                                     .connected_to = \"Ethernet\",\n                                     .lease_time_left = 1000,\n                                     .last_seen = \"13h20m ago\"},\n\n                                    {.dev_name = \"windows11\",\n                                     .mac = \"01:22:11:44:33:55\",\n                                     .ip_addr = \"192.168.1.2/24\",\n                                     .speed = 200,\n                                     .connected_to = \"Wifi 2.4 GHz\",\n                                     .lease_time_left = 4141,\n                                     .last_seen = \"23s ago\"},\n\n                                    {.dev_name = \"iRobot-2\",\n                                     .mac = \"01:22:11:44:33:42\",\n                                     .ip_addr = \"192.168.1.3/24\",\n                                     .speed = 600,\n                                     .connected_to = \"Wifi 5GHz\",\n                                     .lease_time_left = 1141,\n                                     .last_seen = \"20m ago\"}};\n\n// DHCP configuration\nstruct dhcp {\n  bool enabled;\n  uint8_t address_begin;\n  uint8_t address_end;\n  unsigned long lease_time_sec;\n};\n\nstatic struct dhcp s_dhcp = {true, 10, 250, 86400};\n\n// Mocked events\nstatic struct event s_events[] = {\n    {.type = 0, .prio = 0, .text = \"here goes event 1\"},\n    {.type = 1, .prio = 2, .text = \"event 2...\"},\n    {.type = 2, .prio = 1, .text = \"another event\"},\n    {.type = 1, .prio = 1, .text = \"something happened!\"},\n    {.type = 2, .prio = 0, .text = \"once more...\"},\n    {.type = 2, .prio = 0, .text = \"more again...\"},\n    {.type = 1, .prio = 1, .text = \"oops. it happened again\"},\n};\n\nstatic const char *s_json_header =\n    \"Content-Type: application/json\\r\\n\"\n    \"Cache-Control: no-cache\\r\\n\";\nstatic uint64_t s_boot_timestamp = 0;  // Updated by SNTP\n\n// Certificate generation procedure:\n// openssl ecparam -name prime256v1 -genkey -noout -out key.pem\n// openssl req -new -key key.pem -x509 -nodes -days 3650 -out cert.pem\nstatic const char *s_tls_cert =\n    \"-----BEGIN CERTIFICATE-----\\n\"\n    \"MIIBCTCBsAIJAK9wbIDkHnAoMAoGCCqGSM49BAMCMA0xCzAJBgNVBAYTAklFMB4X\\n\"\n    \"DTIzMDEyOTIxMjEzOFoXDTMzMDEyNjIxMjEzOFowDTELMAkGA1UEBhMCSUUwWTAT\\n\"\n    \"BgcqhkjOPQIBBggqhkjOPQMBBwNCAARzSQS5OHd17lUeNI+6kp9WYu0cxuEIi/JT\\n\"\n    \"jphbCmdJD1cUvhmzM9/phvJT9ka10Z9toZhgnBq0o0xfTQ4jC1vwMAoGCCqGSM49\\n\"\n    \"BAMCA0gAMEUCIQCe0T2E0GOiVe9KwvIEPeX1J1J0T7TNacgR0Ya33HV9VgIgNvdn\\n\"\n    \"aEWiBp1xshs4iz6WbpxrS1IHucrqkZuJLfNZGZI=\\n\"\n    \"-----END CERTIFICATE-----\\n\";\n\nstatic const char *s_tls_key =\n    \"-----BEGIN EC PRIVATE KEY-----\\n\"\n    \"MHcCAQEEICBz3HOkQLPBDtdknqC7k1PNsWj6HfhyNB5MenfjmqiooAoGCCqGSM49\\n\"\n    \"AwEHoUQDQgAEc0kEuTh3de5VHjSPupKfVmLtHMbhCIvyU46YWwpnSQ9XFL4ZszPf\\n\"\n    \"6YbyU/ZGtdGfbaGYYJwatKNMX00OIwtb8A==\\n\"\n    \"-----END EC PRIVATE KEY-----\\n\";\n\nstatic int event_next(int no, struct event *e) {\n  if (no < 0 || no >= (int) (sizeof(s_events) / sizeof(s_events[0]))) return 0;\n  *e = s_events[no];\n  return no + 1;\n}\n\n// SNTP connection event handler. When we get a response from an SNTP server,\n// adjust s_boot_timestamp. We'll get a valid time from that point on\nstatic void sfn(struct mg_connection *c, int ev, void *ev_data) {\n  uint64_t *expiration_time = (uint64_t *) c->data;\n  if (ev == MG_EV_OPEN) {\n    *expiration_time = mg_millis() + 3000;  // Store expiration time in 3s\n  } else if (ev == MG_EV_SNTP_TIME) {\n    uint64_t t = *(uint64_t *) ev_data;\n    s_boot_timestamp = t - mg_millis();\n    c->is_closing = 1;\n  } else if (ev == MG_EV_POLL) {\n    if (mg_millis() > *expiration_time) c->is_closing = 1;\n  }\n}\n\nstatic void timer_sntp_fn(void *param) {  // SNTP timer function. Sync up time\n  mg_sntp_connect(param, \"udp://time.google.com:123\", sfn, NULL);\n}\n\n// Parse HTTP requests, return authenticated user or NULL\nstatic struct user *authenticate(struct mg_http_message *hm) {\n  // In production, make passwords strong and tokens randomly generated\n  // In this example, user list is kept in RAM. In production, it can\n  // be backed by file, database, or some other method.\n  static struct user users[] = {\n      {\"admin\", \"admin\", \"admin_token\"},\n      {\"user1\", \"user1\", \"user1_token\"},\n      {\"user2\", \"user2\", \"user2_token\"},\n      {NULL, NULL, NULL},\n  };\n  char user[64], pass[64];\n  struct user *u, *result = NULL;\n  mg_http_creds(hm, user, sizeof(user), pass, sizeof(pass));\n  MG_INFO((\"user [%s] pass [%s]\", user, pass));\n\n  if (user[0] != '\\0' && pass[0] != '\\0') {\n    // Both user and password is set, search by user/password\n    for (u = users; result == NULL && u->name != NULL; u++)\n      if (strcmp(user, u->name) == 0 && strcmp(pass, u->pass) == 0) result = u;\n  } else if (user[0] == '\\0') {\n    // Only password is set, search by token\n    for (u = users; result == NULL && u->name != NULL; u++)\n      if (strcmp(pass, u->access_token) == 0) result = u;\n  }\n  return result;\n}\n\nstatic void handle_login(struct mg_connection *c, struct user *u) {\n  char cookie[256];\n  const char *cookie_name = c->is_tls ? \"secure_access_token\" : \"access_token\";\n  mg_snprintf(cookie, sizeof(cookie),\n              \"Set-Cookie: %s=%s;Path=/;\"\n              \"%sHttpOnly;SameSite=Lax;Max-Age=%d\\r\\n\", cookie_name,\n              u->access_token, c->is_tls ? \"Secure; \" : \"\", 3600 * 24);\n  mg_http_reply(c, 200, cookie, \"{%m:%m}\", MG_ESC(\"user\"), MG_ESC(u->name));\n}\n\nstatic void handle_logout(struct mg_connection *c) {\n  char cookie[256];\n  const char *cookie_name = c->is_tls ? \"secure_access_token\" : \"access_token\";\n  mg_snprintf(cookie, sizeof(cookie),\n              \"Set-Cookie: %s=; Path=/; \"\n              \"Expires=Thu, 01 Jan 1970 00:00:00 UTC; \"\n              \"%sHttpOnly; Max-Age=0; \\r\\n\", cookie_name,\n              c->is_tls ? \"Secure; \" : \"\");\n  mg_http_reply(c, 200, cookie, \"true\\n\");\n}\n\nstatic void handle_debug(struct mg_connection *c, struct mg_http_message *hm) {\n  int level = mg_json_get_long(hm->body, \"$.level\", MG_LL_DEBUG);\n  mg_log_set(level);\n  mg_http_reply(c, 200, \"\", \"Debug level set to %d\\n\", level);\n}\n\nstatic size_t print_int_arr(void (*out)(char, void *), void *ptr, va_list *ap) {\n  size_t len = 0, num = va_arg(*ap, size_t);  // Number of items in the array\n  int *arr = va_arg(*ap, int *);              // Array ptr\n  for (size_t i = 0; i < num; i++) {\n    len += mg_xprintf(out, ptr, \"%s%d\", i == 0 ? \"\" : \",\", arr[i]);\n  }\n  return len;\n}\n\nstatic void handle_stats_get(struct mg_connection *c) {\n  int us[] = {124, 123, 7, 7, 8, 8, 125, 125, 124, 125, 134, 145};\n  int ds[] = {430, 310, 56, 57, 68, 450, 470, 410, 420, 480, 490, 455};\n  mg_http_reply(\n      c, 200, s_json_header, \"{%m:%d,%m:%lu,%m:%lu,%m:[%M],%m:[%M]}\",\n      MG_ESC(\"connected_devices\"), 17,                                        //\n      MG_ESC(\"uploaded\"), 2187,                                               //\n      MG_ESC(\"downloaded\"), 17934,                                            //\n      MG_ESC(\"upload_speed\"), print_int_arr, sizeof(us) / sizeof(us[0]), us,  //\n      MG_ESC(\"download_speed\"), print_int_arr, sizeof(ds) / sizeof(ds[0]), ds);\n}\n\nstatic size_t print_events(void (*out)(char, void *), void *ptr, va_list *ap) {\n  size_t len = 0;\n  struct event e;\n  int no = 0;\n  while ((no = event_next(no, &e)) != 0) {\n    len += mg_xprintf(out, ptr, \"%s{%m:%lu,%m:%d,%m:%d,%m:%m}\",  //\n                      len == 0 ? \"\" : \",\",                       //\n                      MG_ESC(\"time\"), e.timestamp,               //\n                      MG_ESC(\"type\"), e.type,                    //\n                      MG_ESC(\"prio\"), e.prio,                    //\n                      MG_ESC(\"text\"), MG_ESC(e.text));\n  }\n  (void) ap;\n  return len;\n}\n\nstatic void handle_events_get(struct mg_connection *c) {\n  mg_http_reply(c, 200, s_json_header, \"[%M]\", print_events);\n}\n\nstatic void handle_devices_get(struct mg_connection *c) {\n  char test_json[1024];\n  int nr_devs = sizeof(s_devices) / sizeof(struct device);\n  memset(test_json, 0, sizeof(test_json));\n  test_json[0] = '[';\n  for (int i = 0; i < nr_devs; i++) {\n    size_t current_length = strlen(test_json);\n\n    mg_snprintf(\n        test_json + current_length, sizeof(test_json) - current_length,\n        \"{%m:\\\"%s\\\",%m:\\\"%s\\\", %m:\\\"%s\\\", %m:%d,%m:\\\"%s\\\",%m:%d,%m:\\\"%s\\\"}\",  //\n        MG_ESC(\"dev_name\"), s_devices[i].dev_name,                            //\n        MG_ESC(\"mac\"), s_devices[i].mac,                                      //\n        MG_ESC(\"ip\"), s_devices[i].ip_addr,                                   //\n        MG_ESC(\"speed\"), s_devices[i].speed,                                  //\n        MG_ESC(\"connected_to\"), s_devices[i].connected_to,                    //\n        MG_ESC(\"lease_time_left\"), s_devices[i].lease_time_left,              //\n        MG_ESC(\"last_seen\"), s_devices[i].last_seen);\n\n    if (i < nr_devs - 1) {\n      strncat(test_json, \",\", sizeof(test_json) - strlen(test_json) - 1);\n    }\n  }\n\n  strncat(test_json, \"]\", sizeof(test_json) - strlen(test_json) - 1);\n  mg_http_reply(c, 200, s_json_header, \"%s\", test_json);\n}\n\nstatic void handle_dhcp_set(struct mg_connection *c, struct mg_str body) {\n  struct dhcp dhcp;\n  memset(&dhcp, 0, sizeof(dhcp));\n  mg_json_get_bool(body, \"$.enabled\", &dhcp.enabled);\n  dhcp.address_begin = mg_json_get_long(body, \"$.address_begin\", 0);\n  dhcp.address_end = mg_json_get_long(body, \"$.address_end\", 0);\n  dhcp.lease_time_sec = mg_json_get_long(body, \"$.lease_time_sec\", 0);\n  s_dhcp = dhcp;  // Save to the device flash, too\n  bool ok = true;\n  mg_http_reply(c, 200, s_json_header,\n                \"{%m:%s,%m:%m}\",                          //\n                MG_ESC(\"status\"), ok ? \"true\" : \"false\",  //\n                MG_ESC(\"message\"), MG_ESC(ok ? \"Success\" : \"Failed\"));\n}\n\nstatic void handle_dhcp_get(struct mg_connection *c) {\n  mg_http_reply(c, 200, s_json_header, \"{%m:%s,%m:%hhu,%m:%hhu,%m:%lu}\",  //\n                MG_ESC(\"enabled\"), s_dhcp.enabled ? \"true\" : \"false\",     //\n                MG_ESC(\"address_begin\"), s_dhcp.address_begin,            //\n                MG_ESC(\"address_end\"), s_dhcp.address_end,                //\n                MG_ESC(\"lease_time_sec\"), s_dhcp.lease_time_sec);\n}\n\n// HTTP request handler function\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_ACCEPT) {\n    if (c->is_tls) {\n      struct mg_tls_opts opts = {0};\n      opts.cert = mg_str(s_tls_cert);\n      opts.key = mg_str(s_tls_key);\n      mg_tls_init(c, &opts);\n    }\n  } else if (ev == MG_EV_HTTP_MSG) {\n    struct mg_http_message *hm = (struct mg_http_message *) ev_data;\n    struct user *u = authenticate(hm);\n\n    if (mg_match(hm->uri, mg_str(\"/api/#\"), NULL) && u == NULL) {\n      mg_http_reply(c, 403, \"\", \"Not Authorised\\n\");\n    } else if (mg_match(hm->uri, mg_str(\"/api/login\"), NULL)) {\n      handle_login(c, u);\n    } else if (mg_match(hm->uri, mg_str(\"/api/logout\"), NULL)) {\n      handle_logout(c);\n    } else if (mg_match(hm->uri, mg_str(\"/api/debug\"), NULL)) {\n      handle_debug(c, hm);\n    } else if (mg_match(hm->uri, mg_str(\"/api/stats/get\"), NULL)) {\n      handle_stats_get(c);\n    } else if (mg_match(hm->uri, mg_str(\"/api/events/get\"), NULL)) {\n      handle_events_get(c);\n    } else if (mg_match(hm->uri, mg_str(\"/api/devices/get\"), NULL)) {\n      handle_devices_get(c);\n    } else if (mg_match(hm->uri, mg_str(\"/api/dhcp/get\"), NULL)) {\n      handle_dhcp_get(c);\n    } else if (mg_match(hm->uri, mg_str(\"/api/dhcp/set\"), NULL)) {\n      handle_dhcp_set(c, hm->body);\n    } else {\n      struct mg_http_serve_opts opts;\n      memset(&opts, 0, sizeof(opts));\n#if MG_ENABLE_PACKED_FS\n      opts.root_dir = \"/web_root\";\n      opts.fs = &mg_fs_packed;\n#else\n      opts.root_dir = \"web_root\";\n#endif\n      mg_http_serve_dir(c, ev_data, &opts);\n    }\n    MG_DEBUG((\"%lu %.*s %.*s -> %.*s\", c->id, (int) hm->method.len,\n              hm->method.buf, (int) hm->uri.len, hm->uri.buf, (int) 3,\n              &c->send.buf[9]));\n  }\n}\n\nvoid web_init(struct mg_mgr *mgr) {\n  mg_http_listen(mgr, HTTP_URL, fn, NULL);\n  mg_http_listen(mgr, HTTPS_URL, fn, NULL);\n\n  // mg_timer_add(c->mgr, 1000, MG_TIMER_REPEAT, timer_mqtt_fn, c->mgr);\n  mg_timer_add(mgr, 3600 * 1000, MG_TIMER_RUN_NOW | MG_TIMER_REPEAT,\n               timer_sntp_fn, mgr);\n}\n"
  },
  {
    "path": "tutorials/http/wifi-router-dashboard/net.h",
    "content": "// Copyright (c) 2023 Cesanta Software Limited\n// All rights reserved\n\n#pragma once\n\n#include \"mongoose.h\"\n\n#if !defined(HTTP_URL)\n#define HTTP_URL \"http://0.0.0.0:8000\"\n#endif\n\n#if !defined(HTTPS_URL)\n#define HTTPS_URL \"http://0.0.0.0:8443\"\n#endif\n\nvoid web_init(struct mg_mgr *mgr);\n"
  },
  {
    "path": "tutorials/http/wifi-router-dashboard/packed_fs.c",
    "content": "#include \"mongoose.h\"\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\nconst char *mg_unlist(size_t no);\nconst char *mg_unpack(const char *, size_t *, time_t *);\n#if defined(__cplusplus)\n}\n#endif\n\nstatic const unsigned char v1[] = {\n 118,  97, 114,  32, 110,  44, 116,  44, 101,  44,  95,  44, // var n,t,e,_,\n 114,  44, 111,  44, 105,  44, 117,  44, 108,  44,  99,  61, // r,o,i,u,l,c=\n 123, 125,  44,  97,  61,  91,  93,  44, 115,  61,  47,  97, // {},a=[],s=/a\n  99, 105, 116, 124, 101, 120,  40,  63,  58, 115, 124, 103, // cit|ex(?:s|g\n 124, 110, 124, 112, 124,  36,  41, 124, 114, 112, 104, 124, // |n|p|$)|rph|\n 103, 114, 105, 100, 124, 111, 119, 115, 124, 109, 110,  99, // grid|ows|mnc\n 124, 110, 116, 119, 124, 105, 110, 101,  91,  99, 104,  93, // |ntw|ine[ch]\n 124, 122, 111, 111, 124,  94, 111, 114, 100, 124, 105, 116, // |zoo|^ord|it\n 101, 114,  97,  47, 105,  59, 102, 117, 110,  99, 116, 105, // era/i;functi\n 111, 110,  32, 102,  40, 110,  44, 116,  41, 123, 102, 111, // on f(n,t){fo\n 114,  40, 118,  97, 114,  32, 101,  32, 105, 110,  32, 116, // r(var e in t\n  41, 110,  91, 101,  93,  61, 116,  91, 101,  93,  59, 114, // )n[e]=t[e];r\n 101, 116, 117, 114, 110,  32, 110, 125, 102, 117, 110,  99, // eturn n}func\n 116, 105, 111, 110,  32, 112,  40, 110,  41, 123, 118,  97, // tion p(n){va\n 114,  32, 116,  61, 110,  46, 112,  97, 114, 101, 110, 116, // r t=n.parent\n  78, 111, 100, 101,  59, 116,  38,  38, 116,  46, 114, 101, // Node;t&&t.re\n 109, 111, 118, 101,  67, 104, 105, 108, 100,  40, 110,  41, // moveChild(n)\n 125, 102, 117, 110,  99, 116, 105, 111, 110,  32, 104,  40, // }function h(\n 116,  44, 101,  44,  95,  41, 123, 118,  97, 114,  32, 114, // t,e,_){var r\n  44, 111,  44, 105,  44, 117,  61, 123, 125,  59, 102, 111, // ,o,i,u={};fo\n 114,  40, 105,  32, 105, 110,  32, 101,  41,  34, 107, 101, // r(i in e)\"ke\n 121,  34,  61,  61, 105,  63, 114,  61, 101,  91, 105,  93, // y\"==i?r=e[i]\n  58,  34, 114, 101, 102,  34,  61,  61, 105,  63, 111,  61, // :\"ref\"==i?o=\n 101,  91, 105,  93,  58, 117,  91, 105,  93,  61, 101,  91, // e[i]:u[i]=e[\n 105,  93,  59, 105, 102,  40,  97, 114, 103, 117, 109, 101, // i];if(argume\n 110, 116, 115,  46, 108, 101, 110, 103, 116, 104,  62,  50, // nts.length>2\n  38,  38,  40, 117,  46,  99, 104, 105, 108, 100, 114, 101, // &&(u.childre\n 110,  61,  97, 114, 103, 117, 109, 101, 110, 116, 115,  46, // n=arguments.\n 108, 101, 110, 103, 116, 104,  62,  51,  63, 110,  46,  99, // length>3?n.c\n  97, 108, 108,  40,  97, 114, 103, 117, 109, 101, 110, 116, // all(argument\n 115,  44,  50,  41,  58,  95,  41,  44,  34, 102, 117, 110, // s,2):_),\"fun\n  99, 116, 105, 111, 110,  34,  61,  61, 116, 121, 112, 101, // ction\"==type\n 111, 102,  32, 116,  38,  38, 110, 117, 108, 108,  33,  61, // of t&&null!=\n 116,  46, 100, 101, 102,  97, 117, 108, 116,  80, 114, 111, // t.defaultPro\n 112, 115,  41, 102, 111, 114,  40, 105,  32, 105, 110,  32, // ps)for(i in \n 116,  46, 100, 101, 102,  97, 117, 108, 116,  80, 114, 111, // t.defaultPro\n 112, 115,  41, 118, 111, 105, 100,  32,  48,  61,  61,  61, // ps)void 0===\n 117,  91, 105,  93,  38,  38,  40, 117,  91, 105,  93,  61, // u[i]&&(u[i]=\n 116,  46, 100, 101, 102,  97, 117, 108, 116,  80, 114, 111, // t.defaultPro\n 112, 115,  91, 105,  93,  41,  59, 114, 101, 116, 117, 114, // ps[i]);retur\n 110,  32, 100,  40, 116,  44, 117,  44, 114,  44, 111,  44, // n d(t,u,r,o,\n 110, 117, 108, 108,  41, 125, 102, 117, 110,  99, 116, 105, // null)}functi\n 111, 110,  32, 100,  40, 110,  44,  95,  44, 114,  44, 111, // on d(n,_,r,o\n  44, 105,  41, 123, 118,  97, 114,  32, 117,  61, 123, 116, // ,i){var u={t\n 121, 112, 101,  58, 110,  44, 112, 114, 111, 112, 115,  58, // ype:n,props:\n  95,  44, 107, 101, 121,  58, 114,  44, 114, 101, 102,  58, // _,key:r,ref:\n 111,  44,  95,  95, 107,  58, 110, 117, 108, 108,  44,  95, // o,__k:null,_\n  95,  58, 110, 117, 108, 108,  44,  95,  95,  98,  58,  48, // _:null,__b:0\n  44,  95,  95, 101,  58, 110, 117, 108, 108,  44,  95,  95, // ,__e:null,__\n 100,  58, 118, 111, 105, 100,  32,  48,  44,  95,  95,  99, // d:void 0,__c\n  58, 110, 117, 108, 108,  44,  95,  95, 104,  58, 110, 117, // :null,__h:nu\n 108, 108,  44,  99, 111, 110, 115, 116, 114, 117,  99, 116, // ll,construct\n 111, 114,  58, 118, 111, 105, 100,  32,  48,  44,  95,  95, // or:void 0,__\n 118,  58, 110, 117, 108, 108,  61,  61, 105,  63,  43,  43, // v:null==i?++\n 101,  58, 105, 125,  59, 114, 101, 116, 117, 114, 110,  32, // e:i};return \n 110, 117, 108, 108,  61,  61, 105,  38,  38, 110, 117, 108, // null==i&&nul\n 108,  33,  61, 116,  46, 118, 110, 111, 100, 101,  38,  38, // l!=t.vnode&&\n 116,  46, 118, 110, 111, 100, 101,  40, 117,  41,  44, 117, // t.vnode(u),u\n 125, 102, 117, 110,  99, 116, 105, 111, 110,  32, 118,  40, // }function v(\n  41, 123, 114, 101, 116, 117, 114, 110, 123,  99, 117, 114, // ){return{cur\n 114, 101, 110, 116,  58, 110, 117, 108, 108, 125, 125, 102, // rent:null}}f\n 117, 110,  99, 116, 105, 111, 110,  32, 109,  40, 110,  41, // unction m(n)\n 123, 114, 101, 116, 117, 114, 110,  32, 110,  46,  99, 104, // {return n.ch\n 105, 108, 100, 114, 101, 110, 125, 102, 117, 110,  99, 116, // ildren}funct\n 105, 111, 110,  32, 121,  40, 110,  44, 116,  41, 123, 116, // ion y(n,t){t\n 104, 105, 115,  46, 112, 114, 111, 112, 115,  61, 110,  44, // his.props=n,\n 116, 104, 105, 115,  46,  99, 111, 110, 116, 101, 120, 116, // this.context\n  61, 116, 125, 102, 117, 110,  99, 116, 105, 111, 110,  32, // =t}function \n 103,  40, 110,  44, 116,  41, 123, 105, 102,  40, 110, 117, // g(n,t){if(nu\n 108, 108,  61,  61, 116,  41, 114, 101, 116, 117, 114, 110, // ll==t)return\n  32, 110,  46,  95,  95,  63, 103,  40, 110,  46,  95,  95, //  n.__?g(n.__\n  44, 110,  46,  95,  95,  46,  95,  95, 107,  46, 105, 110, // ,n.__.__k.in\n 100, 101, 120,  79, 102,  40, 110,  41,  43,  49,  41,  58, // dexOf(n)+1):\n 110, 117, 108, 108,  59, 102, 111, 114,  40, 118,  97, 114, // null;for(var\n  32, 101,  59, 116,  60, 110,  46,  95,  95, 107,  46, 108, //  e;t<n.__k.l\n 101, 110, 103, 116, 104,  59, 116,  43,  43,  41, 105, 102, // ength;t++)if\n  40, 110, 117, 108, 108,  33,  61,  40, 101,  61, 110,  46, // (null!=(e=n.\n  95,  95, 107,  91, 116,  93,  41,  38,  38, 110, 117, 108, // __k[t])&&nul\n 108,  33,  61, 101,  46,  95,  95, 101,  41, 114, 101, 116, // l!=e.__e)ret\n 117, 114, 110,  32, 101,  46,  95,  95, 101,  59, 114, 101, // urn e.__e;re\n 116, 117, 114, 110,  34, 102, 117, 110,  99, 116, 105, 111, // turn\"functio\n 110,  34,  61,  61, 116, 121, 112, 101, 111, 102,  32, 110, // n\"==typeof n\n  46, 116, 121, 112, 101,  63, 103,  40, 110,  41,  58, 110, // .type?g(n):n\n 117, 108, 108, 125, 102, 117, 110,  99, 116, 105, 111, 110, // ull}function\n  32,  98,  40, 110,  41, 123, 118,  97, 114,  32, 116,  44, //  b(n){var t,\n 101,  59, 105, 102,  40, 110, 117, 108, 108,  33,  61,  40, // e;if(null!=(\n 110,  61, 110,  46,  95,  95,  41,  38,  38, 110, 117, 108, // n=n.__)&&nul\n 108,  33,  61, 110,  46,  95,  95,  99,  41, 123, 102, 111, // l!=n.__c){fo\n 114,  40, 110,  46,  95,  95, 101,  61, 110,  46,  95,  95, // r(n.__e=n.__\n  99,  46,  98,  97, 115, 101,  61, 110, 117, 108, 108,  44, // c.base=null,\n 116,  61,  48,  59, 116,  60, 110,  46,  95,  95, 107,  46, // t=0;t<n.__k.\n 108, 101, 110, 103, 116, 104,  59, 116,  43,  43,  41, 105, // length;t++)i\n 102,  40, 110, 117, 108, 108,  33,  61,  40, 101,  61, 110, // f(null!=(e=n\n  46,  95,  95, 107,  91, 116,  93,  41,  38,  38, 110, 117, // .__k[t])&&nu\n 108, 108,  33,  61, 101,  46,  95,  95, 101,  41, 123, 110, // ll!=e.__e){n\n  46,  95,  95, 101,  61, 110,  46,  95,  95,  99,  46,  98, // .__e=n.__c.b\n  97, 115, 101,  61, 101,  46,  95,  95, 101,  59,  98, 114, // ase=e.__e;br\n 101,  97, 107, 125, 114, 101, 116, 117, 114, 110,  32,  98, // eak}return b\n  40, 110,  41, 125, 125, 102, 117, 110,  99, 116, 105, 111, // (n)}}functio\n 110,  32, 107,  40, 110,  41, 123,  40,  33, 110,  46,  95, // n k(n){(!n._\n  95, 100,  38,  38,  40, 110,  46,  95,  95, 100,  61,  33, // _d&&(n.__d=!\n  48,  41,  38,  38, 114,  46, 112, 117, 115, 104,  40, 110, // 0)&&r.push(n\n  41,  38,  38,  33,  67,  46,  95,  95, 114,  43,  43, 124, // )&&!C.__r++|\n 124, 111,  33,  61,  61, 116,  46, 100, 101,  98, 111, 117, // |o!==t.debou\n 110,  99, 101,  82, 101, 110, 100, 101, 114, 105, 110, 103, // nceRendering\n  41,  38,  38,  40,  40, 111,  61, 116,  46, 100, 101,  98, // )&&((o=t.deb\n 111, 117, 110,  99, 101,  82, 101, 110, 100, 101, 114, 105, // ounceRenderi\n 110, 103,  41, 124, 124, 105,  41,  40,  67,  41, 125, 102, // ng)||i)(C)}f\n 117, 110,  99, 116, 105, 111, 110,  32,  67,  40,  41, 123, // unction C(){\n 118,  97, 114,  32, 110,  44, 116,  44, 101,  44,  95,  44, // var n,t,e,_,\n 111,  44, 105,  44, 108,  44,  99,  59, 102, 111, 114,  40, // o,i,l,c;for(\n 114,  46, 115, 111, 114, 116,  40, 117,  41,  59, 110,  61, // r.sort(u);n=\n 114,  46, 115, 104, 105, 102, 116,  40,  41,  59,  41, 110, // r.shift();)n\n  46,  95,  95, 100,  38,  38,  40, 116,  61, 114,  46, 108, // .__d&&(t=r.l\n 101, 110, 103, 116, 104,  44,  95,  61, 118, 111, 105, 100, // ength,_=void\n  32,  48,  44, 111,  61, 118, 111, 105, 100,  32,  48,  44, //  0,o=void 0,\n 108,  61,  40, 105,  61,  40, 101,  61, 110,  41,  46,  95, // l=(i=(e=n)._\n  95, 118,  41,  46,  95,  95, 101,  44,  40,  99,  61, 101, // _v).__e,(c=e\n  46,  95,  95,  80,  41,  38,  38,  40,  95,  61,  91,  93, // .__P)&&(_=[]\n  44,  40, 111,  61, 102,  40, 123, 125,  44, 105,  41,  41, // ,(o=f({},i))\n  46,  95,  95, 118,  61, 105,  46,  95,  95, 118,  43,  49, // .__v=i.__v+1\n  44,  84,  40,  99,  44, 105,  44, 111,  44, 101,  46,  95, // ,T(c,i,o,e._\n  95, 110,  44, 118, 111, 105, 100,  32,  48,  33,  61,  61, // _n,void 0!==\n  99,  46, 111, 119, 110, 101, 114,  83,  86,  71,  69, 108, // c.ownerSVGEl\n 101, 109, 101, 110, 116,  44, 110, 117, 108, 108,  33,  61, // ement,null!=\n 105,  46,  95,  95, 104,  63,  91, 108,  93,  58, 110, 117, // i.__h?[l]:nu\n 108, 108,  44,  95,  44, 110, 117, 108, 108,  61,  61, 108, // ll,_,null==l\n  63, 103,  40, 105,  41,  58, 108,  44, 105,  46,  95,  95, // ?g(i):l,i.__\n 104,  41,  44,  82,  40,  95,  44, 105,  41,  44, 105,  46, // h),R(_,i),i.\n  95,  95, 101,  33,  61, 108,  38,  38,  98,  40, 105,  41, // __e!=l&&b(i)\n  41,  44, 114,  46, 108, 101, 110, 103, 116, 104,  62, 116, // ),r.length>t\n  38,  38, 114,  46, 115, 111, 114, 116,  40, 117,  41,  41, // &&r.sort(u))\n  59,  67,  46,  95,  95, 114,  61,  48, 125, 102, 117, 110, // ;C.__r=0}fun\n  99, 116, 105, 111, 110,  32, 120,  40, 110,  44, 116,  44, // ction x(n,t,\n 101,  44,  95,  44, 114,  44, 111,  44, 105,  44, 117,  44, // e,_,r,o,i,u,\n 108,  44, 115,  41, 123, 118,  97, 114,  32, 102,  44, 112, // l,s){var f,p\n  44, 104,  44, 118,  44, 121,  44,  98,  44, 107,  44,  67, // ,h,v,y,b,k,C\n  61,  95,  38,  38,  95,  46,  95,  95, 107, 124, 124,  97, // =_&&_.__k||a\n  44, 120,  61,  67,  46, 108, 101, 110, 103, 116, 104,  59, // ,x=C.length;\n 102, 111, 114,  40, 101,  46,  95,  95, 107,  61,  91,  93, // for(e.__k=[]\n  44, 102,  61,  48,  59, 102,  60, 116,  46, 108, 101, 110, // ,f=0;f<t.len\n 103, 116, 104,  59, 102,  43,  43,  41, 105, 102,  40, 110, // gth;f++)if(n\n 117, 108, 108,  33,  61,  40, 118,  61, 101,  46,  95,  95, // ull!=(v=e.__\n 107,  91, 102,  93,  61, 110, 117, 108, 108,  61,  61,  40, // k[f]=null==(\n 118,  61, 116,  91, 102,  93,  41, 124, 124,  34,  98, 111, // v=t[f])||\"bo\n 111, 108, 101,  97, 110,  34,  61,  61, 116, 121, 112, 101, // olean\"==type\n 111, 102,  32, 118, 124, 124,  34, 102, 117, 110,  99, 116, // of v||\"funct\n 105, 111, 110,  34,  61,  61, 116, 121, 112, 101, 111, 102, // ion\"==typeof\n  32, 118,  63, 110, 117, 108, 108,  58,  34, 115, 116, 114, //  v?null:\"str\n 105, 110, 103,  34,  61,  61, 116, 121, 112, 101, 111, 102, // ing\"==typeof\n  32, 118, 124, 124,  34, 110, 117, 109,  98, 101, 114,  34, //  v||\"number\"\n  61,  61, 116, 121, 112, 101, 111, 102,  32, 118, 124, 124, // ==typeof v||\n  34,  98, 105, 103, 105, 110, 116,  34,  61,  61, 116, 121, // \"bigint\"==ty\n 112, 101, 111, 102,  32, 118,  63, 100,  40, 110, 117, 108, // peof v?d(nul\n 108,  44, 118,  44, 110, 117, 108, 108,  44, 110, 117, 108, // l,v,null,nul\n 108,  44, 118,  41,  58,  65, 114, 114,  97, 121,  46, 105, // l,v):Array.i\n 115,  65, 114, 114,  97, 121,  40, 118,  41,  63, 100,  40, // sArray(v)?d(\n 109,  44, 123,  99, 104, 105, 108, 100, 114, 101, 110,  58, // m,{children:\n 118, 125,  44, 110, 117, 108, 108,  44, 110, 117, 108, 108, // v},null,null\n  44, 110, 117, 108, 108,  41,  58, 118,  46,  95,  95,  98, // ,null):v.__b\n  62,  48,  63, 100,  40, 118,  46, 116, 121, 112, 101,  44, // >0?d(v.type,\n 118,  46, 112, 114, 111, 112, 115,  44, 118,  46, 107, 101, // v.props,v.ke\n 121,  44, 118,  46, 114, 101, 102,  63, 118,  46, 114, 101, // y,v.ref?v.re\n 102,  58, 110, 117, 108, 108,  44, 118,  46,  95,  95, 118, // f:null,v.__v\n  41,  58, 118,  41,  41, 123, 105, 102,  40, 118,  46,  95, // ):v)){if(v._\n  95,  61, 101,  44, 118,  46,  95,  95,  98,  61, 101,  46, // _=e,v.__b=e.\n  95,  95,  98,  43,  49,  44, 110, 117, 108, 108,  61,  61, // __b+1,null==\n  61,  40, 104,  61,  67,  91, 102,  93,  41, 124, 124, 104, // =(h=C[f])||h\n  38,  38, 118,  46, 107, 101, 121,  61,  61, 104,  46, 107, // &&v.key==h.k\n 101, 121,  38,  38, 118,  46, 116, 121, 112, 101,  61,  61, // ey&&v.type==\n  61, 104,  46, 116, 121, 112, 101,  41,  67,  91, 102,  93, // =h.type)C[f]\n  61, 118, 111, 105, 100,  32,  48,  59, 101, 108, 115, 101, // =void 0;else\n  32, 102, 111, 114,  40, 112,  61,  48,  59, 112,  60, 120, //  for(p=0;p<x\n  59, 112,  43,  43,  41, 123, 105, 102,  40,  40, 104,  61, // ;p++){if((h=\n  67,  91, 112,  93,  41,  38,  38, 118,  46, 107, 101, 121, // C[p])&&v.key\n  61,  61, 104,  46, 107, 101, 121,  38,  38, 118,  46, 116, // ==h.key&&v.t\n 121, 112, 101,  61,  61,  61, 104,  46, 116, 121, 112, 101, // ype===h.type\n  41, 123,  67,  91, 112,  93,  61, 118, 111, 105, 100,  32, // ){C[p]=void \n  48,  59,  98, 114, 101,  97, 107, 125, 104,  61, 110, 117, // 0;break}h=nu\n 108, 108, 125,  84,  40, 110,  44, 118,  44, 104,  61, 104, // ll}T(n,v,h=h\n 124, 124,  99,  44, 114,  44, 111,  44, 105,  44, 117,  44, // ||c,r,o,i,u,\n 108,  44, 115,  41,  44, 121,  61, 118,  46,  95,  95, 101, // l,s),y=v.__e\n  44,  40, 112,  61, 118,  46, 114, 101, 102,  41,  38,  38, // ,(p=v.ref)&&\n 104,  46, 114, 101, 102,  33,  61, 112,  38,  38,  40, 107, // h.ref!=p&&(k\n 124, 124,  40, 107,  61,  91,  93,  41,  44, 104,  46, 114, // ||(k=[]),h.r\n 101, 102,  38,  38, 107,  46, 112, 117, 115, 104,  40, 104, // ef&&k.push(h\n  46, 114, 101, 102,  44, 110, 117, 108, 108,  44, 118,  41, // .ref,null,v)\n  44, 107,  46, 112, 117, 115, 104,  40, 112,  44, 118,  46, // ,k.push(p,v.\n  95,  95,  99, 124, 124, 121,  44, 118,  41,  41,  44, 110, // __c||y,v)),n\n 117, 108, 108,  33,  61, 121,  63,  40, 110, 117, 108, 108, // ull!=y?(null\n  61,  61,  98,  38,  38,  40,  98,  61, 121,  41,  44,  34, // ==b&&(b=y),\"\n 102, 117, 110,  99, 116, 105, 111, 110,  34,  61,  61, 116, // function\"==t\n 121, 112, 101, 111, 102,  32, 118,  46, 116, 121, 112, 101, // ypeof v.type\n  38,  38, 118,  46,  95,  95, 107,  61,  61,  61, 104,  46, // &&v.__k===h.\n  95,  95, 107,  63, 118,  46,  95,  95, 100,  61, 108,  61, // __k?v.__d=l=\n  69,  40, 118,  44, 108,  44, 110,  41,  58, 108,  61,  85, // E(v,l,n):l=U\n  40, 110,  44, 118,  44, 104,  44,  67,  44, 121,  44, 108, // (n,v,h,C,y,l\n  41,  44,  34, 102, 117, 110,  99, 116, 105, 111, 110,  34, // ),\"function\"\n  61,  61, 116, 121, 112, 101, 111, 102,  32, 101,  46, 116, // ==typeof e.t\n 121, 112, 101,  38,  38,  40, 101,  46,  95,  95, 100,  61, // ype&&(e.__d=\n 108,  41,  41,  58, 108,  38,  38, 104,  46,  95,  95, 101, // l)):l&&h.__e\n  61,  61, 108,  38,  38, 108,  46, 112,  97, 114, 101, 110, // ==l&&l.paren\n 116,  78, 111, 100, 101,  33,  61, 110,  38,  38,  40, 108, // tNode!=n&&(l\n  61, 103,  40, 104,  41,  41, 125, 102, 111, 114,  40, 101, // =g(h))}for(e\n  46,  95,  95, 101,  61,  98,  44, 102,  61, 120,  59, 102, // .__e=b,f=x;f\n  45,  45,  59,  41, 110, 117, 108, 108,  33,  61,  67,  91, // --;)null!=C[\n 102,  93,  38,  38,  40,  34, 102, 117, 110,  99, 116, 105, // f]&&(\"functi\n 111, 110,  34,  61,  61, 116, 121, 112, 101, 111, 102,  32, // on\"==typeof \n 101,  46, 116, 121, 112, 101,  38,  38, 110, 117, 108, 108, // e.type&&null\n  33,  61,  67,  91, 102,  93,  46,  95,  95, 101,  38,  38, // !=C[f].__e&&\n  67,  91, 102,  93,  46,  95,  95, 101,  61,  61, 101,  46, // C[f].__e==e.\n  95,  95, 100,  38,  38,  40, 101,  46,  95,  95, 100,  61, // __d&&(e.__d=\n  65,  40,  95,  41,  46, 110, 101, 120, 116,  83, 105,  98, // A(_).nextSib\n 108, 105, 110, 103,  41,  44,  87,  40,  67,  91, 102,  93, // ling),W(C[f]\n  44,  67,  91, 102,  93,  41,  41,  59, 105, 102,  40, 107, // ,C[f]));if(k\n  41, 102, 111, 114,  40, 102,  61,  48,  59, 102,  60, 107, // )for(f=0;f<k\n  46, 108, 101, 110, 103, 116, 104,  59, 102,  43,  43,  41, // .length;f++)\n  77,  40, 107,  91, 102,  93,  44, 107,  91,  43,  43, 102, // M(k[f],k[++f\n  93,  44, 107,  91,  43,  43, 102,  93,  41, 125, 102, 117, // ],k[++f])}fu\n 110,  99, 116, 105, 111, 110,  32,  69,  40, 110,  44, 116, // nction E(n,t\n  44, 101,  41, 123, 102, 111, 114,  40, 118,  97, 114,  32, // ,e){for(var \n  95,  44, 114,  61, 110,  46,  95,  95, 107,  44, 111,  61, // _,r=n.__k,o=\n  48,  59, 114,  38,  38, 111,  60, 114,  46, 108, 101, 110, // 0;r&&o<r.len\n 103, 116, 104,  59, 111,  43,  43,  41,  40,  95,  61, 114, // gth;o++)(_=r\n  91, 111,  93,  41,  38,  38,  40,  95,  46,  95,  95,  61, // [o])&&(_.__=\n 110,  44, 116,  61,  34, 102, 117, 110,  99, 116, 105, 111, // n,t=\"functio\n 110,  34,  61,  61, 116, 121, 112, 101, 111, 102,  32,  95, // n\"==typeof _\n  46, 116, 121, 112, 101,  63,  69,  40,  95,  44, 116,  44, // .type?E(_,t,\n 101,  41,  58,  85,  40, 101,  44,  95,  44,  95,  44, 114, // e):U(e,_,_,r\n  44,  95,  46,  95,  95, 101,  44, 116,  41,  41,  59, 114, // ,_.__e,t));r\n 101, 116, 117, 114, 110,  32, 116, 125, 102, 117, 110,  99, // eturn t}func\n 116, 105, 111, 110,  32,  72,  40, 110,  44, 116,  41, 123, // tion H(n,t){\n 114, 101, 116, 117, 114, 110,  32, 116,  61, 116, 124, 124, // return t=t||\n  91,  93,  44, 110, 117, 108, 108,  61,  61, 110, 124, 124, // [],null==n||\n  34,  98, 111, 111, 108, 101,  97, 110,  34,  61,  61, 116, // \"boolean\"==t\n 121, 112, 101, 111, 102,  32, 110, 124, 124,  40,  65, 114, // ypeof n||(Ar\n 114,  97, 121,  46, 105, 115,  65, 114, 114,  97, 121,  40, // ray.isArray(\n 110,  41,  63, 110,  46, 115, 111, 109, 101,  40,  40, 102, // n)?n.some((f\n 117, 110,  99, 116, 105, 111, 110,  40, 110,  41, 123,  72, // unction(n){H\n  40, 110,  44, 116,  41, 125,  41,  41,  58, 116,  46, 112, // (n,t)})):t.p\n 117, 115, 104,  40, 110,  41,  41,  44, 116, 125, 102, 117, // ush(n)),t}fu\n 110,  99, 116, 105, 111, 110,  32,  85,  40, 110,  44, 116, // nction U(n,t\n  44, 101,  44,  95,  44, 114,  44, 111,  41, 123, 118,  97, // ,e,_,r,o){va\n 114,  32, 105,  44, 117,  44, 108,  59, 105, 102,  40, 118, // r i,u,l;if(v\n 111, 105, 100,  32,  48,  33,  61,  61, 116,  46,  95,  95, // oid 0!==t.__\n 100,  41, 105,  61, 116,  46,  95,  95, 100,  44, 116,  46, // d)i=t.__d,t.\n  95,  95, 100,  61, 118, 111, 105, 100,  32,  48,  59, 101, // __d=void 0;e\n 108, 115, 101,  32, 105, 102,  40, 110, 117, 108, 108,  61, // lse if(null=\n  61, 101, 124, 124, 114,  33,  61, 111, 124, 124, 110, 117, // =e||r!=o||nu\n 108, 108,  61,  61, 114,  46, 112,  97, 114, 101, 110, 116, // ll==r.parent\n  78, 111, 100, 101,  41, 110,  58, 105, 102,  40, 110, 117, // Node)n:if(nu\n 108, 108,  61,  61, 111, 124, 124, 111,  46, 112,  97, 114, // ll==o||o.par\n 101, 110, 116,  78, 111, 100, 101,  33,  61,  61, 110,  41, // entNode!==n)\n 110,  46,  97, 112, 112, 101, 110, 100,  67, 104, 105, 108, // n.appendChil\n 100,  40, 114,  41,  44, 105,  61, 110, 117, 108, 108,  59, // d(r),i=null;\n 101, 108, 115, 101, 123, 102, 111, 114,  40, 117,  61, 111, // else{for(u=o\n  44, 108,  61,  48,  59,  40, 117,  61, 117,  46, 110, 101, // ,l=0;(u=u.ne\n 120, 116,  83, 105,  98, 108, 105, 110, 103,  41,  38,  38, // xtSibling)&&\n 108,  60,  95,  46, 108, 101, 110, 103, 116, 104,  59, 108, // l<_.length;l\n  43,  61,  49,  41, 105, 102,  40, 117,  61,  61, 114,  41, // +=1)if(u==r)\n  98, 114, 101,  97, 107,  32, 110,  59, 110,  46, 105, 110, // break n;n.in\n 115, 101, 114, 116,  66, 101, 102, 111, 114, 101,  40, 114, // sertBefore(r\n  44, 111,  41,  44, 105,  61, 111, 125, 114, 101, 116, 117, // ,o),i=o}retu\n 114, 110,  32, 118, 111, 105, 100,  32,  48,  33,  61,  61, // rn void 0!==\n 105,  63, 105,  58, 114,  46, 110, 101, 120, 116,  83, 105, // i?i:r.nextSi\n  98, 108, 105, 110, 103, 125, 102, 117, 110,  99, 116, 105, // bling}functi\n 111, 110,  32,  65,  40, 110,  41, 123, 118,  97, 114,  32, // on A(n){var \n 116,  44, 101,  44,  95,  59, 105, 102,  40, 110, 117, 108, // t,e,_;if(nul\n 108,  61,  61, 110,  46, 116, 121, 112, 101, 124, 124,  34, // l==n.type||\"\n 115, 116, 114, 105, 110, 103,  34,  61,  61, 116, 121, 112, // string\"==typ\n 101, 111, 102,  32, 110,  46, 116, 121, 112, 101,  41, 114, // eof n.type)r\n 101, 116, 117, 114, 110,  32, 110,  46,  95,  95, 101,  59, // eturn n.__e;\n 105, 102,  40, 110,  46,  95,  95, 107,  41, 102, 111, 114, // if(n.__k)for\n  40, 116,  61, 110,  46,  95,  95, 107,  46, 108, 101, 110, // (t=n.__k.len\n 103, 116, 104,  45,  49,  59, 116,  62,  61,  48,  59, 116, // gth-1;t>=0;t\n  45,  45,  41, 105, 102,  40,  40, 101,  61, 110,  46,  95, // --)if((e=n._\n  95, 107,  91, 116,  93,  41,  38,  38,  40,  95,  61,  65, // _k[t])&&(_=A\n  40, 101,  41,  41,  41, 114, 101, 116, 117, 114, 110,  32, // (e)))return \n  95,  59, 114, 101, 116, 117, 114, 110,  32, 110, 117, 108, // _;return nul\n 108, 125, 102, 117, 110,  99, 116, 105, 111, 110,  32,  80, // l}function P\n  40, 110,  44, 116,  44, 101,  44,  95,  44, 114,  41, 123, // (n,t,e,_,r){\n 118,  97, 114,  32, 111,  59, 102, 111, 114,  40, 111,  32, // var o;for(o \n 105, 110,  32, 101,  41,  34,  99, 104, 105, 108, 100, 114, // in e)\"childr\n 101, 110,  34,  61,  61,  61, 111, 124, 124,  34, 107, 101, // en\"===o||\"ke\n 121,  34,  61,  61,  61, 111, 124, 124, 111,  32, 105, 110, // y\"===o||o in\n  32, 116, 124, 124,  78,  40, 110,  44, 111,  44, 110, 117, //  t||N(n,o,nu\n 108, 108,  44, 101,  91, 111,  93,  44,  95,  41,  59, 102, // ll,e[o],_);f\n 111, 114,  40, 111,  32, 105, 110,  32, 116,  41, 114,  38, // or(o in t)r&\n  38,  34, 102, 117, 110,  99, 116, 105, 111, 110,  34,  33, // &\"function\"!\n  61, 116, 121, 112, 101, 111, 102,  32, 116,  91, 111,  93, // =typeof t[o]\n 124, 124,  34,  99, 104, 105, 108, 100, 114, 101, 110,  34, // ||\"children\"\n  61,  61,  61, 111, 124, 124,  34, 107, 101, 121,  34,  61, // ===o||\"key\"=\n  61,  61, 111, 124, 124,  34, 118,  97, 108, 117, 101,  34, // ==o||\"value\"\n  61,  61,  61, 111, 124, 124,  34,  99, 104, 101,  99, 107, // ===o||\"check\n 101, 100,  34,  61,  61,  61, 111, 124, 124, 101,  91, 111, // ed\"===o||e[o\n  93,  61,  61,  61, 116,  91, 111,  93, 124, 124,  78,  40, // ]===t[o]||N(\n 110,  44, 111,  44, 116,  91, 111,  93,  44, 101,  91, 111, // n,o,t[o],e[o\n  93,  44,  95,  41, 125, 102, 117, 110,  99, 116, 105, 111, // ],_)}functio\n 110,  32,  83,  40, 110,  44, 116,  44, 101,  41, 123,  34, // n S(n,t,e){\"\n  45,  34,  61,  61,  61, 116,  91,  48,  93,  63, 110,  46, // -\"===t[0]?n.\n 115, 101, 116,  80, 114, 111, 112, 101, 114, 116, 121,  40, // setProperty(\n 116,  44, 110, 117, 108, 108,  61,  61, 101,  63,  34,  34, // t,null==e?\"\"\n  58, 101,  41,  58, 110,  91, 116,  93,  61, 110, 117, 108, // :e):n[t]=nul\n 108,  61,  61, 101,  63,  34,  34,  58,  34, 110, 117, 109, // l==e?\"\":\"num\n  98, 101, 114,  34,  33,  61, 116, 121, 112, 101, 111, 102, // ber\"!=typeof\n  32, 101, 124, 124, 115,  46, 116, 101, 115, 116,  40, 116, //  e||s.test(t\n  41,  63, 101,  58, 101,  43,  34, 112, 120,  34, 125, 102, // )?e:e+\"px\"}f\n 117, 110,  99, 116, 105, 111, 110,  32,  78,  40, 110,  44, // unction N(n,\n 116,  44, 101,  44,  95,  44, 114,  41, 123, 118,  97, 114, // t,e,_,r){var\n  32, 111,  59, 110,  58, 105, 102,  40,  34, 115, 116, 121, //  o;n:if(\"sty\n 108, 101,  34,  61,  61,  61, 116,  41, 105, 102,  40,  34, // le\"===t)if(\"\n 115, 116, 114, 105, 110, 103,  34,  61,  61, 116, 121, 112, // string\"==typ\n 101, 111, 102,  32, 101,  41, 110,  46, 115, 116, 121, 108, // eof e)n.styl\n 101,  46,  99, 115, 115,  84, 101, 120, 116,  61, 101,  59, // e.cssText=e;\n 101, 108, 115, 101, 123, 105, 102,  40,  34, 115, 116, 114, // else{if(\"str\n 105, 110, 103,  34,  61,  61, 116, 121, 112, 101, 111, 102, // ing\"==typeof\n  32,  95,  38,  38,  40, 110,  46, 115, 116, 121, 108, 101, //  _&&(n.style\n  46,  99, 115, 115,  84, 101, 120, 116,  61,  95,  61,  34, // .cssText=_=\"\n  34,  41,  44,  95,  41, 102, 111, 114,  40, 116,  32, 105, // \"),_)for(t i\n 110,  32,  95,  41, 101,  38,  38, 116,  32, 105, 110,  32, // n _)e&&t in \n 101, 124, 124,  83,  40, 110,  46, 115, 116, 121, 108, 101, // e||S(n.style\n  44, 116,  44,  34,  34,  41,  59, 105, 102,  40, 101,  41, // ,t,\"\");if(e)\n 102, 111, 114,  40, 116,  32, 105, 110,  32, 101,  41,  95, // for(t in e)_\n  38,  38, 101,  91, 116,  93,  61,  61,  61,  95,  91, 116, // &&e[t]===_[t\n  93, 124, 124,  83,  40, 110,  46, 115, 116, 121, 108, 101, // ]||S(n.style\n  44, 116,  44, 101,  91, 116,  93,  41, 125, 101, 108, 115, // ,t,e[t])}els\n 101,  32, 105, 102,  40,  34, 111,  34,  61,  61,  61, 116, // e if(\"o\"===t\n  91,  48,  93,  38,  38,  34, 110,  34,  61,  61,  61, 116, // [0]&&\"n\"===t\n  91,  49,  93,  41, 111,  61, 116,  33,  61,  61,  40, 116, // [1])o=t!==(t\n  61, 116,  46, 114, 101, 112, 108,  97,  99, 101,  40,  47, // =t.replace(/\n  67,  97, 112, 116, 117, 114, 101,  36,  47,  44,  34,  34, // Capture$/,\"\"\n  41,  41,  44, 116,  61, 116,  46, 116, 111,  76, 111, 119, // )),t=t.toLow\n 101, 114,  67,  97, 115, 101,  40,  41, 105, 110,  32, 110, // erCase()in n\n  63, 116,  46, 116, 111,  76, 111, 119, 101, 114,  67,  97, // ?t.toLowerCa\n 115, 101,  40,  41,  46, 115, 108, 105,  99, 101,  40,  50, // se().slice(2\n  41,  58, 116,  46, 115, 108, 105,  99, 101,  40,  50,  41, // ):t.slice(2)\n  44, 110,  46, 108, 124, 124,  40, 110,  46, 108,  61, 123, // ,n.l||(n.l={\n 125,  41,  44, 110,  46, 108,  91, 116,  43, 111,  93,  61, // }),n.l[t+o]=\n 101,  44, 101,  63,  95, 124, 124, 110,  46,  97, 100, 100, // e,e?_||n.add\n  69, 118, 101, 110, 116,  76, 105, 115, 116, 101, 110, 101, // EventListene\n 114,  40, 116,  44, 111,  63,  68,  58, 119,  44, 111,  41, // r(t,o?D:w,o)\n  58, 110,  46, 114, 101, 109, 111, 118, 101,  69, 118, 101, // :n.removeEve\n 110, 116,  76, 105, 115, 116, 101, 110, 101, 114,  40, 116, // ntListener(t\n  44, 111,  63,  68,  58, 119,  44, 111,  41,  59, 101, 108, // ,o?D:w,o);el\n 115, 101,  32, 105, 102,  40,  34, 100,  97, 110, 103, 101, // se if(\"dange\n 114, 111, 117, 115, 108, 121,  83, 101, 116,  73, 110, 110, // rouslySetInn\n 101, 114,  72,  84,  77,  76,  34,  33,  61,  61, 116,  41, // erHTML\"!==t)\n 123, 105, 102,  40, 114,  41, 116,  61, 116,  46, 114, 101, // {if(r)t=t.re\n 112, 108,  97,  99, 101,  40,  47, 120, 108, 105, 110, 107, // place(/xlink\n  40,  72, 124,  58, 104,  41,  47,  44,  34, 104,  34,  41, // (H|:h)/,\"h\")\n  46, 114, 101, 112, 108,  97,  99, 101,  40,  47, 115,  78, // .replace(/sN\n  97, 109, 101,  36,  47,  44,  34, 115,  34,  41,  59, 101, // ame$/,\"s\");e\n 108, 115, 101,  32, 105, 102,  40,  34, 119, 105, 100, 116, // lse if(\"widt\n 104,  34,  33,  61,  61, 116,  38,  38,  34, 104, 101, 105, // h\"!==t&&\"hei\n 103, 104, 116,  34,  33,  61,  61, 116,  38,  38,  34, 104, // ght\"!==t&&\"h\n 114, 101, 102,  34,  33,  61,  61, 116,  38,  38,  34, 108, // ref\"!==t&&\"l\n 105, 115, 116,  34,  33,  61,  61, 116,  38,  38,  34, 102, // ist\"!==t&&\"f\n 111, 114, 109,  34,  33,  61,  61, 116,  38,  38,  34, 116, // orm\"!==t&&\"t\n  97,  98,  73, 110, 100, 101, 120,  34,  33,  61,  61, 116, // abIndex\"!==t\n  38,  38,  34, 100, 111, 119, 110, 108, 111,  97, 100,  34, // &&\"download\"\n  33,  61,  61, 116,  38,  38, 116,  32, 105, 110,  32, 110, // !==t&&t in n\n  41, 116, 114, 121, 123, 110,  91, 116,  93,  61, 110, 117, // )try{n[t]=nu\n 108, 108,  61,  61, 101,  63,  34,  34,  58, 101,  59,  98, // ll==e?\"\":e;b\n 114, 101,  97, 107,  32, 110, 125,  99,  97, 116,  99, 104, // reak n}catch\n  40, 110,  41, 123, 125,  34, 102, 117, 110,  99, 116, 105, // (n){}\"functi\n 111, 110,  34,  61,  61, 116, 121, 112, 101, 111, 102,  32, // on\"==typeof \n 101, 124, 124,  40, 110, 117, 108, 108,  61,  61, 101, 124, // e||(null==e|\n 124,  33,  49,  61,  61,  61, 101,  38,  38,  34,  45,  34, // |!1===e&&\"-\"\n  33,  61,  61, 116,  91,  52,  93,  63, 110,  46, 114, 101, // !==t[4]?n.re\n 109, 111, 118, 101,  65, 116, 116, 114, 105,  98, 117, 116, // moveAttribut\n 101,  40, 116,  41,  58, 110,  46, 115, 101, 116,  65, 116, // e(t):n.setAt\n 116, 114, 105,  98, 117, 116, 101,  40, 116,  44, 101,  41, // tribute(t,e)\n  41, 125, 125, 102, 117, 110,  99, 116, 105, 111, 110,  32, // )}}function \n 119,  40, 110,  41, 123, 114, 101, 116, 117, 114, 110,  32, // w(n){return \n 116, 104, 105, 115,  46, 108,  91, 110,  46, 116, 121, 112, // this.l[n.typ\n 101,  43,  33,  49,  93,  40, 116,  46, 101, 118, 101, 110, // e+!1](t.even\n 116,  63, 116,  46, 101, 118, 101, 110, 116,  40, 110,  41, // t?t.event(n)\n  58, 110,  41, 125, 102, 117, 110,  99, 116, 105, 111, 110, // :n)}function\n  32,  68,  40, 110,  41, 123, 114, 101, 116, 117, 114, 110, //  D(n){return\n  32, 116, 104, 105, 115,  46, 108,  91, 110,  46, 116, 121, //  this.l[n.ty\n 112, 101,  43,  33,  48,  93,  40, 116,  46, 101, 118, 101, // pe+!0](t.eve\n 110, 116,  63, 116,  46, 101, 118, 101, 110, 116,  40, 110, // nt?t.event(n\n  41,  58, 110,  41, 125, 102, 117, 110,  99, 116, 105, 111, // ):n)}functio\n 110,  32,  84,  40, 110,  44, 101,  44,  95,  44, 114,  44, // n T(n,e,_,r,\n 111,  44, 105,  44, 117,  44, 108,  44,  99,  41, 123, 118, // o,i,u,l,c){v\n  97, 114,  32,  97,  44, 115,  44, 112,  44, 104,  44, 100, // ar a,s,p,h,d\n  44, 118,  44, 103,  44,  98,  44, 107,  44,  67,  44,  69, // ,v,g,b,k,C,E\n  44,  72,  44,  85,  44,  65,  44,  80,  44,  83,  61, 101, // ,H,U,A,P,S=e\n  46, 116, 121, 112, 101,  59, 105, 102,  40, 118, 111, 105, // .type;if(voi\n 100,  32,  48,  33,  61,  61, 101,  46,  99, 111, 110, 115, // d 0!==e.cons\n 116, 114, 117,  99, 116, 111, 114,  41, 114, 101, 116, 117, // tructor)retu\n 114, 110,  32, 110, 117, 108, 108,  59, 110, 117, 108, 108, // rn null;null\n  33,  61,  95,  46,  95,  95, 104,  38,  38,  40,  99,  61, // !=_.__h&&(c=\n  95,  46,  95,  95, 104,  44, 108,  61, 101,  46,  95,  95, // _.__h,l=e.__\n 101,  61,  95,  46,  95,  95, 101,  44, 101,  46,  95,  95, // e=_.__e,e.__\n 104,  61, 110, 117, 108, 108,  44, 105,  61,  91, 108,  93, // h=null,i=[l]\n  41,  44,  40,  97,  61, 116,  46,  95,  95,  98,  41,  38, // ),(a=t.__b)&\n  38,  97,  40, 101,  41,  59, 116, 114, 121, 123, 110,  58, // &a(e);try{n:\n 105, 102,  40,  34, 102, 117, 110,  99, 116, 105, 111, 110, // if(\"function\n  34,  61,  61, 116, 121, 112, 101, 111, 102,  32,  83,  41, // \"==typeof S)\n 123, 105, 102,  40,  98,  61, 101,  46, 112, 114, 111, 112, // {if(b=e.prop\n 115,  44, 107,  61,  40,  97,  61,  83,  46,  99, 111, 110, // s,k=(a=S.con\n 116, 101, 120, 116,  84, 121, 112, 101,  41,  38,  38, 114, // textType)&&r\n  91,  97,  46,  95,  95,  99,  93,  44,  67,  61,  97,  63, // [a.__c],C=a?\n 107,  63, 107,  46, 112, 114, 111, 112, 115,  46, 118,  97, // k?k.props.va\n 108, 117, 101,  58,  97,  46,  95,  95,  58, 114,  44,  95, // lue:a.__:r,_\n  46,  95,  95,  99,  63, 103,  61,  40, 115,  61, 101,  46, // .__c?g=(s=e.\n  95,  95,  99,  61,  95,  46,  95,  95,  99,  41,  46,  95, // __c=_.__c)._\n  95,  61, 115,  46,  95,  95,  69,  58,  40,  34, 112, 114, // _=s.__E:(\"pr\n 111, 116, 111, 116, 121, 112, 101,  34, 105, 110,  32,  83, // ototype\"in S\n  38,  38,  83,  46, 112, 114, 111, 116, 111, 116, 121, 112, // &&S.prototyp\n 101,  46, 114, 101, 110, 100, 101, 114,  63, 101,  46,  95, // e.render?e._\n  95,  99,  61, 115,  61, 110, 101, 119,  32,  83,  40,  98, // _c=s=new S(b\n  44,  67,  41,  58,  40, 101,  46,  95,  95,  99,  61, 115, // ,C):(e.__c=s\n  61, 110, 101, 119,  32, 121,  40,  98,  44,  67,  41,  44, // =new y(b,C),\n 115,  46,  99, 111, 110, 115, 116, 114, 117,  99, 116, 111, // s.constructo\n 114,  61,  83,  44, 115,  46, 114, 101, 110, 100, 101, 114, // r=S,s.render\n  61,  86,  41,  44, 107,  38,  38, 107,  46, 115, 117,  98, // =V),k&&k.sub\n  40, 115,  41,  44, 115,  46, 112, 114, 111, 112, 115,  61, // (s),s.props=\n  98,  44, 115,  46, 115, 116,  97, 116, 101, 124, 124,  40, // b,s.state||(\n 115,  46, 115, 116,  97, 116, 101,  61, 123, 125,  41,  44, // s.state={}),\n 115,  46,  99, 111, 110, 116, 101, 120, 116,  61,  67,  44, // s.context=C,\n 115,  46,  95,  95, 110,  61, 114,  44, 112,  61, 115,  46, // s.__n=r,p=s.\n  95,  95, 100,  61,  33,  48,  44, 115,  46,  95,  95, 104, // __d=!0,s.__h\n  61,  91,  93,  44, 115,  46,  95, 115,  98,  61,  91,  93, // =[],s._sb=[]\n  41,  44, 110, 117, 108, 108,  61,  61, 115,  46,  95,  95, // ),null==s.__\n 115,  38,  38,  40, 115,  46,  95,  95, 115,  61, 115,  46, // s&&(s.__s=s.\n 115, 116,  97, 116, 101,  41,  44, 110, 117, 108, 108,  33, // state),null!\n  61,  83,  46, 103, 101, 116,  68, 101, 114, 105, 118, 101, // =S.getDerive\n 100,  83, 116,  97, 116, 101,  70, 114, 111, 109,  80, 114, // dStateFromPr\n 111, 112, 115,  38,  38,  40, 115,  46,  95,  95, 115,  61, // ops&&(s.__s=\n  61, 115,  46, 115, 116,  97, 116, 101,  38,  38,  40, 115, // =s.state&&(s\n  46,  95,  95, 115,  61, 102,  40, 123, 125,  44, 115,  46, // .__s=f({},s.\n  95,  95, 115,  41,  41,  44, 102,  40, 115,  46,  95,  95, // __s)),f(s.__\n 115,  44,  83,  46, 103, 101, 116,  68, 101, 114, 105, 118, // s,S.getDeriv\n 101, 100,  83, 116,  97, 116, 101,  70, 114, 111, 109,  80, // edStateFromP\n 114, 111, 112, 115,  40,  98,  44, 115,  46,  95,  95, 115, // rops(b,s.__s\n  41,  41,  41,  44, 104,  61, 115,  46, 112, 114, 111, 112, // ))),h=s.prop\n 115,  44, 100,  61, 115,  46, 115, 116,  97, 116, 101,  44, // s,d=s.state,\n 115,  46,  95,  95, 118,  61, 101,  44, 112,  41, 110, 117, // s.__v=e,p)nu\n 108, 108,  61,  61,  83,  46, 103, 101, 116,  68, 101, 114, // ll==S.getDer\n 105, 118, 101, 100,  83, 116,  97, 116, 101,  70, 114, 111, // ivedStateFro\n 109,  80, 114, 111, 112, 115,  38,  38, 110, 117, 108, 108, // mProps&&null\n  33,  61, 115,  46,  99, 111, 109, 112, 111, 110, 101, 110, // !=s.componen\n 116,  87, 105, 108, 108,  77, 111, 117, 110, 116,  38,  38, // tWillMount&&\n 115,  46,  99, 111, 109, 112, 111, 110, 101, 110, 116,  87, // s.componentW\n 105, 108, 108,  77, 111, 117, 110, 116,  40,  41,  44, 110, // illMount(),n\n 117, 108, 108,  33,  61, 115,  46,  99, 111, 109, 112, 111, // ull!=s.compo\n 110, 101, 110, 116,  68, 105, 100,  77, 111, 117, 110, 116, // nentDidMount\n  38,  38, 115,  46,  95,  95, 104,  46, 112, 117, 115, 104, // &&s.__h.push\n  40, 115,  46,  99, 111, 109, 112, 111, 110, 101, 110, 116, // (s.component\n  68, 105, 100,  77, 111, 117, 110, 116,  41,  59, 101, 108, // DidMount);el\n 115, 101, 123, 105, 102,  40, 110, 117, 108, 108,  61,  61, // se{if(null==\n  83,  46, 103, 101, 116,  68, 101, 114, 105, 118, 101, 100, // S.getDerived\n  83, 116,  97, 116, 101,  70, 114, 111, 109,  80, 114, 111, // StateFromPro\n 112, 115,  38,  38,  98,  33,  61,  61, 104,  38,  38, 110, // ps&&b!==h&&n\n 117, 108, 108,  33,  61, 115,  46,  99, 111, 109, 112, 111, // ull!=s.compo\n 110, 101, 110, 116,  87, 105, 108, 108,  82, 101,  99, 101, // nentWillRece\n 105, 118, 101,  80, 114, 111, 112, 115,  38,  38, 115,  46, // iveProps&&s.\n  99, 111, 109, 112, 111, 110, 101, 110, 116,  87, 105, 108, // componentWil\n 108,  82, 101,  99, 101, 105, 118, 101,  80, 114, 111, 112, // lReceiveProp\n 115,  40,  98,  44,  67,  41,  44,  33, 115,  46,  95,  95, // s(b,C),!s.__\n 101,  38,  38, 110, 117, 108, 108,  33,  61, 115,  46, 115, // e&&null!=s.s\n 104, 111, 117, 108, 100,  67, 111, 109, 112, 111, 110, 101, // houldCompone\n 110, 116,  85, 112, 100,  97, 116, 101,  38,  38,  33,  49, // ntUpdate&&!1\n  61,  61,  61, 115,  46, 115, 104, 111, 117, 108, 100,  67, // ===s.shouldC\n 111, 109, 112, 111, 110, 101, 110, 116,  85, 112, 100,  97, // omponentUpda\n 116, 101,  40,  98,  44, 115,  46,  95,  95, 115,  44,  67, // te(b,s.__s,C\n  41, 124, 124, 101,  46,  95,  95, 118,  61,  61,  61,  95, // )||e.__v===_\n  46,  95,  95, 118,  41, 123, 102, 111, 114,  40, 101,  46, // .__v){for(e.\n  95,  95, 118,  33,  61,  61,  95,  46,  95,  95, 118,  38, // __v!==_.__v&\n  38,  40, 115,  46, 112, 114, 111, 112, 115,  61,  98,  44, // &(s.props=b,\n 115,  46, 115, 116,  97, 116, 101,  61, 115,  46,  95,  95, // s.state=s.__\n 115,  44, 115,  46,  95,  95, 100,  61,  33,  49,  41,  44, // s,s.__d=!1),\n 115,  46,  95,  95, 101,  61,  33,  49,  44, 101,  46,  95, // s.__e=!1,e._\n  95, 101,  61,  95,  46,  95,  95, 101,  44, 101,  46,  95, // _e=_.__e,e._\n  95, 107,  61,  95,  46,  95,  95, 107,  44, 101,  46,  95, // _k=_.__k,e._\n  95, 107,  46, 102, 111, 114,  69,  97,  99, 104,  40,  40, // _k.forEach((\n 102, 117, 110,  99, 116, 105, 111, 110,  40, 110,  41, 123, // function(n){\n 110,  38,  38,  40, 110,  46,  95,  95,  61, 101,  41, 125, // n&&(n.__=e)}\n  41,  41,  44,  69,  61,  48,  59,  69,  60, 115,  46,  95, // )),E=0;E<s._\n 115,  98,  46, 108, 101, 110, 103, 116, 104,  59,  69,  43, // sb.length;E+\n  43,  41, 115,  46,  95,  95, 104,  46, 112, 117, 115, 104, // +)s.__h.push\n  40, 115,  46,  95, 115,  98,  91,  69,  93,  41,  59, 115, // (s._sb[E]);s\n  46,  95, 115,  98,  61,  91,  93,  44, 115,  46,  95,  95, // ._sb=[],s.__\n 104,  46, 108, 101, 110, 103, 116, 104,  38,  38, 117,  46, // h.length&&u.\n 112, 117, 115, 104,  40, 115,  41,  59,  98, 114, 101,  97, // push(s);brea\n 107,  32, 110, 125, 110, 117, 108, 108,  33,  61, 115,  46, // k n}null!=s.\n  99, 111, 109, 112, 111, 110, 101, 110, 116,  87, 105, 108, // componentWil\n 108,  85, 112, 100,  97, 116, 101,  38,  38, 115,  46,  99, // lUpdate&&s.c\n 111, 109, 112, 111, 110, 101, 110, 116,  87, 105, 108, 108, // omponentWill\n  85, 112, 100,  97, 116, 101,  40,  98,  44, 115,  46,  95, // Update(b,s._\n  95, 115,  44,  67,  41,  44, 110, 117, 108, 108,  33,  61, // _s,C),null!=\n 115,  46,  99, 111, 109, 112, 111, 110, 101, 110, 116,  68, // s.componentD\n 105, 100,  85, 112, 100,  97, 116, 101,  38,  38, 115,  46, // idUpdate&&s.\n  95,  95, 104,  46, 112, 117, 115, 104,  40,  40, 102, 117, // __h.push((fu\n 110,  99, 116, 105, 111, 110,  40,  41, 123, 115,  46,  99, // nction(){s.c\n 111, 109, 112, 111, 110, 101, 110, 116,  68, 105, 100,  85, // omponentDidU\n 112, 100,  97, 116, 101,  40, 104,  44, 100,  44, 118,  41, // pdate(h,d,v)\n 125,  41,  41, 125, 105, 102,  40, 115,  46,  99, 111, 110, // }))}if(s.con\n 116, 101, 120, 116,  61,  67,  44, 115,  46, 112, 114, 111, // text=C,s.pro\n 112, 115,  61,  98,  44, 115,  46,  95,  95,  80,  61, 110, // ps=b,s.__P=n\n  44,  72,  61, 116,  46,  95,  95, 114,  44,  85,  61,  48, // ,H=t.__r,U=0\n  44,  34, 112, 114, 111, 116, 111, 116, 121, 112, 101,  34, // ,\"prototype\"\n 105, 110,  32,  83,  38,  38,  83,  46, 112, 114, 111, 116, // in S&&S.prot\n 111, 116, 121, 112, 101,  46, 114, 101, 110, 100, 101, 114, // otype.render\n  41, 123, 102, 111, 114,  40, 115,  46, 115, 116,  97, 116, // ){for(s.stat\n 101,  61, 115,  46,  95,  95, 115,  44, 115,  46,  95,  95, // e=s.__s,s.__\n 100,  61,  33,  49,  44,  72,  38,  38,  72,  40, 101,  41, // d=!1,H&&H(e)\n  44,  97,  61, 115,  46, 114, 101, 110, 100, 101, 114,  40, // ,a=s.render(\n 115,  46, 112, 114, 111, 112, 115,  44, 115,  46, 115, 116, // s.props,s.st\n  97, 116, 101,  44, 115,  46,  99, 111, 110, 116, 101, 120, // ate,s.contex\n 116,  41,  44,  65,  61,  48,  59,  65,  60, 115,  46,  95, // t),A=0;A<s._\n 115,  98,  46, 108, 101, 110, 103, 116, 104,  59,  65,  43, // sb.length;A+\n  43,  41, 115,  46,  95,  95, 104,  46, 112, 117, 115, 104, // +)s.__h.push\n  40, 115,  46,  95, 115,  98,  91,  65,  93,  41,  59, 115, // (s._sb[A]);s\n  46,  95, 115,  98,  61,  91,  93, 125, 101, 108, 115, 101, // ._sb=[]}else\n  32, 100, 111, 123, 115,  46,  95,  95, 100,  61,  33,  49, //  do{s.__d=!1\n  44,  72,  38,  38,  72,  40, 101,  41,  44,  97,  61, 115, // ,H&&H(e),a=s\n  46, 114, 101, 110, 100, 101, 114,  40, 115,  46, 112, 114, // .render(s.pr\n 111, 112, 115,  44, 115,  46, 115, 116,  97, 116, 101,  44, // ops,s.state,\n 115,  46,  99, 111, 110, 116, 101, 120, 116,  41,  44, 115, // s.context),s\n  46, 115, 116,  97, 116, 101,  61, 115,  46,  95,  95, 115, // .state=s.__s\n 125, 119, 104, 105, 108, 101,  40, 115,  46,  95,  95, 100, // }while(s.__d\n  38,  38,  43,  43,  85,  60,  50,  53,  41,  59, 115,  46, // &&++U<25);s.\n 115, 116,  97, 116, 101,  61, 115,  46,  95,  95, 115,  44, // state=s.__s,\n 110, 117, 108, 108,  33,  61, 115,  46, 103, 101, 116,  67, // null!=s.getC\n 104, 105, 108, 100,  67, 111, 110, 116, 101, 120, 116,  38, // hildContext&\n  38,  40, 114,  61, 102,  40, 102,  40, 123, 125,  44, 114, // &(r=f(f({},r\n  41,  44, 115,  46, 103, 101, 116,  67, 104, 105, 108, 100, // ),s.getChild\n  67, 111, 110, 116, 101, 120, 116,  40,  41,  41,  41,  44, // Context())),\n 112, 124, 124, 110, 117, 108, 108,  61,  61, 115,  46, 103, // p||null==s.g\n 101, 116,  83, 110,  97, 112, 115, 104, 111, 116,  66, 101, // etSnapshotBe\n 102, 111, 114, 101,  85, 112, 100,  97, 116, 101, 124, 124, // foreUpdate||\n  40, 118,  61, 115,  46, 103, 101, 116,  83, 110,  97, 112, // (v=s.getSnap\n 115, 104, 111, 116,  66, 101, 102, 111, 114, 101,  85, 112, // shotBeforeUp\n 100,  97, 116, 101,  40, 104,  44, 100,  41,  41,  44,  80, // date(h,d)),P\n  61, 110, 117, 108, 108,  33,  61,  97,  38,  38,  97,  46, // =null!=a&&a.\n 116, 121, 112, 101,  61,  61,  61, 109,  38,  38, 110, 117, // type===m&&nu\n 108, 108,  61,  61,  97,  46, 107, 101, 121,  63,  97,  46, // ll==a.key?a.\n 112, 114, 111, 112, 115,  46,  99, 104, 105, 108, 100, 114, // props.childr\n 101, 110,  58,  97,  44, 120,  40, 110,  44,  65, 114, 114, // en:a,x(n,Arr\n  97, 121,  46, 105, 115,  65, 114, 114,  97, 121,  40,  80, // ay.isArray(P\n  41,  63,  80,  58,  91,  80,  93,  44, 101,  44,  95,  44, // )?P:[P],e,_,\n 114,  44, 111,  44, 105,  44, 117,  44, 108,  44,  99,  41, // r,o,i,u,l,c)\n  44, 115,  46,  98,  97, 115, 101,  61, 101,  46,  95,  95, // ,s.base=e.__\n 101,  44, 101,  46,  95,  95, 104,  61, 110, 117, 108, 108, // e,e.__h=null\n  44, 115,  46,  95,  95, 104,  46, 108, 101, 110, 103, 116, // ,s.__h.lengt\n 104,  38,  38, 117,  46, 112, 117, 115, 104,  40, 115,  41, // h&&u.push(s)\n  44, 103,  38,  38,  40, 115,  46,  95,  95,  69,  61, 115, // ,g&&(s.__E=s\n  46,  95,  95,  61, 110, 117, 108, 108,  41,  44, 115,  46, // .__=null),s.\n  95,  95, 101,  61,  33,  49, 125, 101, 108, 115, 101,  32, // __e=!1}else \n 110, 117, 108, 108,  61,  61, 105,  38,  38, 101,  46,  95, // null==i&&e._\n  95, 118,  61,  61,  61,  95,  46,  95,  95, 118,  63,  40, // _v===_.__v?(\n 101,  46,  95,  95, 107,  61,  95,  46,  95,  95, 107,  44, // e.__k=_.__k,\n 101,  46,  95,  95, 101,  61,  95,  46,  95,  95, 101,  41, // e.__e=_.__e)\n  58, 101,  46,  95,  95, 101,  61,  76,  40,  95,  46,  95, // :e.__e=L(_._\n  95, 101,  44, 101,  44,  95,  44, 114,  44, 111,  44, 105, // _e,e,_,r,o,i\n  44, 117,  44,  99,  41,  59,  40,  97,  61, 116,  46, 100, // ,u,c);(a=t.d\n 105, 102, 102, 101, 100,  41,  38,  38,  97,  40, 101,  41, // iffed)&&a(e)\n 125,  99,  97, 116,  99, 104,  40, 110,  41, 123, 101,  46, // }catch(n){e.\n  95,  95, 118,  61, 110, 117, 108, 108,  44,  40,  99, 124, // __v=null,(c|\n 124, 110, 117, 108, 108,  33,  61, 105,  41,  38,  38,  40, // |null!=i)&&(\n 101,  46,  95,  95, 101,  61, 108,  44, 101,  46,  95,  95, // e.__e=l,e.__\n 104,  61,  33,  33,  99,  44, 105,  91, 105,  46, 105, 110, // h=!!c,i[i.in\n 100, 101, 120,  79, 102,  40, 108,  41,  93,  61, 110, 117, // dexOf(l)]=nu\n 108, 108,  41,  44, 116,  46,  95,  95, 101,  40, 110,  44, // ll),t.__e(n,\n 101,  44,  95,  41, 125, 125, 102, 117, 110,  99, 116, 105, // e,_)}}functi\n 111, 110,  32,  82,  40, 110,  44, 101,  41, 123, 116,  46, // on R(n,e){t.\n  95,  95,  99,  38,  38, 116,  46,  95,  95,  99,  40, 101, // __c&&t.__c(e\n  44, 110,  41,  44, 110,  46, 115, 111, 109, 101,  40,  40, // ,n),n.some((\n 102, 117, 110,  99, 116, 105, 111, 110,  40, 101,  41, 123, // function(e){\n 116, 114, 121, 123, 110,  61, 101,  46,  95,  95, 104,  44, // try{n=e.__h,\n 101,  46,  95,  95, 104,  61,  91,  93,  44, 110,  46, 115, // e.__h=[],n.s\n 111, 109, 101,  40,  40, 102, 117, 110,  99, 116, 105, 111, // ome((functio\n 110,  40, 110,  41, 123, 110,  46,  99,  97, 108, 108,  40, // n(n){n.call(\n 101,  41, 125,  41,  41, 125,  99,  97, 116,  99, 104,  40, // e)}))}catch(\n 110,  41, 123, 116,  46,  95,  95, 101,  40, 110,  44, 101, // n){t.__e(n,e\n  46,  95,  95, 118,  41, 125, 125,  41,  41, 125, 102, 117, // .__v)}}))}fu\n 110,  99, 116, 105, 111, 110,  32,  76,  40, 116,  44, 101, // nction L(t,e\n  44,  95,  44, 114,  44, 111,  44, 105,  44, 117,  44, 108, // ,_,r,o,i,u,l\n  41, 123, 118,  97, 114,  32,  97,  44, 115,  44, 102,  44, // ){var a,s,f,\n 104,  61,  95,  46, 112, 114, 111, 112, 115,  44, 100,  61, // h=_.props,d=\n 101,  46, 112, 114, 111, 112, 115,  44, 118,  61, 101,  46, // e.props,v=e.\n 116, 121, 112, 101,  44, 109,  61,  48,  59, 105, 102,  40, // type,m=0;if(\n  34, 115, 118, 103,  34,  61,  61,  61, 118,  38,  38,  40, // \"svg\"===v&&(\n 111,  61,  33,  48,  41,  44, 110, 117, 108, 108,  33,  61, // o=!0),null!=\n 105,  41, 102, 111, 114,  40,  59, 109,  60, 105,  46, 108, // i)for(;m<i.l\n 101, 110, 103, 116, 104,  59, 109,  43,  43,  41, 105, 102, // ength;m++)if\n  40,  40,  97,  61, 105,  91, 109,  93,  41,  38,  38,  34, // ((a=i[m])&&\"\n 115, 101, 116,  65, 116, 116, 114, 105,  98, 117, 116, 101, // setAttribute\n  34, 105, 110,  32,  97,  61,  61,  33,  33, 118,  38,  38, // \"in a==!!v&&\n  40, 118,  63,  97,  46, 108, 111,  99,  97, 108,  78,  97, // (v?a.localNa\n 109, 101,  61,  61,  61, 118,  58,  51,  61,  61,  61,  97, // me===v:3===a\n  46, 110, 111, 100, 101,  84, 121, 112, 101,  41,  41, 123, // .nodeType)){\n 116,  61,  97,  44, 105,  91, 109,  93,  61, 110, 117, 108, // t=a,i[m]=nul\n 108,  59,  98, 114, 101,  97, 107, 125, 105, 102,  40, 110, // l;break}if(n\n 117, 108, 108,  61,  61, 116,  41, 123, 105, 102,  40, 110, // ull==t){if(n\n 117, 108, 108,  61,  61,  61, 118,  41, 114, 101, 116, 117, // ull===v)retu\n 114, 110,  32, 100, 111,  99, 117, 109, 101, 110, 116,  46, // rn document.\n  99, 114, 101,  97, 116, 101,  84, 101, 120, 116,  78, 111, // createTextNo\n 100, 101,  40, 100,  41,  59, 116,  61, 111,  63, 100, 111, // de(d);t=o?do\n  99, 117, 109, 101, 110, 116,  46,  99, 114, 101,  97, 116, // cument.creat\n 101,  69, 108, 101, 109, 101, 110, 116,  78,  83,  40,  34, // eElementNS(\"\n 104, 116, 116, 112,  58,  47,  47, 119, 119, 119,  46, 119, // http://www.w\n  51,  46, 111, 114, 103,  47,  50,  48,  48,  48,  47, 115, // 3.org/2000/s\n 118, 103,  34,  44, 118,  41,  58, 100, 111,  99, 117, 109, // vg\",v):docum\n 101, 110, 116,  46,  99, 114, 101,  97, 116, 101,  69, 108, // ent.createEl\n 101, 109, 101, 110, 116,  40, 118,  44, 100,  46, 105, 115, // ement(v,d.is\n  38,  38, 100,  41,  44, 105,  61, 110, 117, 108, 108,  44, // &&d),i=null,\n 108,  61,  33,  49, 125, 105, 102,  40, 110, 117, 108, 108, // l=!1}if(null\n  61,  61,  61, 118,  41, 104,  61,  61,  61, 100, 124, 124, // ===v)h===d||\n 108,  38,  38, 116,  46, 100,  97, 116,  97,  61,  61,  61, // l&&t.data===\n 100, 124, 124,  40, 116,  46, 100,  97, 116,  97,  61, 100, // d||(t.data=d\n  41,  59, 101, 108, 115, 101, 123, 105, 102,  40, 105,  61, // );else{if(i=\n 105,  38,  38, 110,  46,  99,  97, 108, 108,  40, 116,  46, // i&&n.call(t.\n  99, 104, 105, 108, 100,  78, 111, 100, 101, 115,  41,  44, // childNodes),\n 115,  61,  40, 104,  61,  95,  46, 112, 114, 111, 112, 115, // s=(h=_.props\n 124, 124,  99,  41,  46, 100,  97, 110, 103, 101, 114, 111, // ||c).dangero\n 117, 115, 108, 121,  83, 101, 116,  73, 110, 110, 101, 114, // uslySetInner\n  72,  84,  77,  76,  44, 102,  61, 100,  46, 100,  97, 110, // HTML,f=d.dan\n 103, 101, 114, 111, 117, 115, 108, 121,  83, 101, 116,  73, // gerouslySetI\n 110, 110, 101, 114,  72,  84,  77,  76,  44,  33, 108,  41, // nnerHTML,!l)\n 123, 105, 102,  40, 110, 117, 108, 108,  33,  61, 105,  41, // {if(null!=i)\n 102, 111, 114,  40, 104,  61, 123, 125,  44, 109,  61,  48, // for(h={},m=0\n  59, 109,  60, 116,  46,  97, 116, 116, 114, 105,  98, 117, // ;m<t.attribu\n 116, 101, 115,  46, 108, 101, 110, 103, 116, 104,  59, 109, // tes.length;m\n  43,  43,  41, 104,  91, 116,  46,  97, 116, 116, 114, 105, // ++)h[t.attri\n  98, 117, 116, 101, 115,  91, 109,  93,  46, 110,  97, 109, // butes[m].nam\n 101,  93,  61, 116,  46,  97, 116, 116, 114, 105,  98, 117, // e]=t.attribu\n 116, 101, 115,  91, 109,  93,  46, 118,  97, 108, 117, 101, // tes[m].value\n  59,  40, 102, 124, 124, 115,  41,  38,  38,  40, 102,  38, // ;(f||s)&&(f&\n  38,  40, 115,  38,  38, 102,  46,  95,  95, 104, 116, 109, // &(s&&f.__htm\n 108,  61,  61, 115,  46,  95,  95, 104, 116, 109, 108, 124, // l==s.__html|\n 124, 102,  46,  95,  95, 104, 116, 109, 108,  61,  61,  61, // |f.__html===\n 116,  46, 105, 110, 110, 101, 114,  72,  84,  77,  76,  41, // t.innerHTML)\n 124, 124,  40, 116,  46, 105, 110, 110, 101, 114,  72,  84, // ||(t.innerHT\n  77,  76,  61, 102,  38,  38, 102,  46,  95,  95, 104, 116, // ML=f&&f.__ht\n 109, 108, 124, 124,  34,  34,  41,  41, 125, 105, 102,  40, // ml||\"\"))}if(\n  80,  40, 116,  44, 100,  44, 104,  44, 111,  44, 108,  41, // P(t,d,h,o,l)\n  44, 102,  41, 101,  46,  95,  95, 107,  61,  91,  93,  59, // ,f)e.__k=[];\n 101, 108, 115, 101,  32, 105, 102,  40, 109,  61, 101,  46, // else if(m=e.\n 112, 114, 111, 112, 115,  46,  99, 104, 105, 108, 100, 114, // props.childr\n 101, 110,  44, 120,  40, 116,  44,  65, 114, 114,  97, 121, // en,x(t,Array\n  46, 105, 115,  65, 114, 114,  97, 121,  40, 109,  41,  63, // .isArray(m)?\n 109,  58,  91, 109,  93,  44, 101,  44,  95,  44, 114,  44, // m:[m],e,_,r,\n 111,  38,  38,  34, 102, 111, 114, 101, 105, 103, 110,  79, // o&&\"foreignO\n  98, 106, 101,  99, 116,  34,  33,  61,  61, 118,  44, 105, // bject\"!==v,i\n  44, 117,  44, 105,  63, 105,  91,  48,  93,  58,  95,  46, // ,u,i?i[0]:_.\n  95,  95, 107,  38,  38, 103,  40,  95,  44,  48,  41,  44, // __k&&g(_,0),\n 108,  41,  44, 110, 117, 108, 108,  33,  61, 105,  41, 102, // l),null!=i)f\n 111, 114,  40, 109,  61, 105,  46, 108, 101, 110, 103, 116, // or(m=i.lengt\n 104,  59, 109,  45,  45,  59,  41, 110, 117, 108, 108,  33, // h;m--;)null!\n  61, 105,  91, 109,  93,  38,  38, 112,  40, 105,  91, 109, // =i[m]&&p(i[m\n  93,  41,  59, 108, 124, 124,  40,  34, 118,  97, 108, 117, // ]);l||(\"valu\n 101,  34, 105, 110,  32, 100,  38,  38, 118, 111, 105, 100, // e\"in d&&void\n  32,  48,  33,  61,  61,  40, 109,  61, 100,  46, 118,  97, //  0!==(m=d.va\n 108, 117, 101,  41,  38,  38,  40, 109,  33,  61,  61, 116, // lue)&&(m!==t\n  46, 118,  97, 108, 117, 101, 124, 124,  34, 112, 114, 111, // .value||\"pro\n 103, 114, 101, 115, 115,  34,  61,  61,  61, 118,  38,  38, // gress\"===v&&\n  33, 109, 124, 124,  34, 111, 112, 116, 105, 111, 110,  34, // !m||\"option\"\n  61,  61,  61, 118,  38,  38, 109,  33,  61,  61, 104,  46, // ===v&&m!==h.\n 118,  97, 108, 117, 101,  41,  38,  38,  78,  40, 116,  44, // value)&&N(t,\n  34, 118,  97, 108, 117, 101,  34,  44, 109,  44, 104,  46, // \"value\",m,h.\n 118,  97, 108, 117, 101,  44,  33,  49,  41,  44,  34,  99, // value,!1),\"c\n 104, 101,  99, 107, 101, 100,  34, 105, 110,  32, 100,  38, // hecked\"in d&\n  38, 118, 111, 105, 100,  32,  48,  33,  61,  61,  40, 109, // &void 0!==(m\n  61, 100,  46,  99, 104, 101,  99, 107, 101, 100,  41,  38, // =d.checked)&\n  38, 109,  33,  61,  61, 116,  46,  99, 104, 101,  99, 107, // &m!==t.check\n 101, 100,  38,  38,  78,  40, 116,  44,  34,  99, 104, 101, // ed&&N(t,\"che\n  99, 107, 101, 100,  34,  44, 109,  44, 104,  46,  99, 104, // cked\",m,h.ch\n 101,  99, 107, 101, 100,  44,  33,  49,  41,  41, 125, 114, // ecked,!1))}r\n 101, 116, 117, 114, 110,  32, 116, 125, 102, 117, 110,  99, // eturn t}func\n 116, 105, 111, 110,  32,  77,  40, 110,  44, 101,  44,  95, // tion M(n,e,_\n  41, 123, 116, 114, 121, 123,  34, 102, 117, 110,  99, 116, // ){try{\"funct\n 105, 111, 110,  34,  61,  61, 116, 121, 112, 101, 111, 102, // ion\"==typeof\n  32, 110,  63, 110,  40, 101,  41,  58, 110,  46,  99, 117, //  n?n(e):n.cu\n 114, 114, 101, 110, 116,  61, 101, 125,  99,  97, 116,  99, // rrent=e}catc\n 104,  40, 110,  41, 123, 116,  46,  95,  95, 101,  40, 110, // h(n){t.__e(n\n  44,  95,  41, 125, 125, 102, 117, 110,  99, 116, 105, 111, // ,_)}}functio\n 110,  32,  87,  40, 110,  44, 101,  44,  95,  41, 123, 118, // n W(n,e,_){v\n  97, 114,  32, 114,  44, 111,  59, 105, 102,  40, 116,  46, // ar r,o;if(t.\n 117, 110, 109, 111, 117, 110, 116,  38,  38, 116,  46, 117, // unmount&&t.u\n 110, 109, 111, 117, 110, 116,  40, 110,  41,  44,  40, 114, // nmount(n),(r\n  61, 110,  46, 114, 101, 102,  41,  38,  38,  40, 114,  46, // =n.ref)&&(r.\n  99, 117, 114, 114, 101, 110, 116,  38,  38, 114,  46,  99, // current&&r.c\n 117, 114, 114, 101, 110, 116,  33,  61,  61, 110,  46,  95, // urrent!==n._\n  95, 101, 124, 124,  77,  40, 114,  44, 110, 117, 108, 108, // _e||M(r,null\n  44, 101,  41,  41,  44, 110, 117, 108, 108,  33,  61,  40, // ,e)),null!=(\n 114,  61, 110,  46,  95,  95,  99,  41,  41, 123, 105, 102, // r=n.__c)){if\n  40, 114,  46,  99, 111, 109, 112, 111, 110, 101, 110, 116, // (r.component\n  87, 105, 108, 108,  85, 110, 109, 111, 117, 110, 116,  41, // WillUnmount)\n 116, 114, 121, 123, 114,  46,  99, 111, 109, 112, 111, 110, // try{r.compon\n 101, 110, 116,  87, 105, 108, 108,  85, 110, 109, 111, 117, // entWillUnmou\n 110, 116,  40,  41, 125,  99,  97, 116,  99, 104,  40, 110, // nt()}catch(n\n  41, 123, 116,  46,  95,  95, 101,  40, 110,  44, 101,  41, // ){t.__e(n,e)\n 125, 114,  46,  98,  97, 115, 101,  61, 114,  46,  95,  95, // }r.base=r.__\n  80,  61, 110, 117, 108, 108,  44, 110,  46,  95,  95,  99, // P=null,n.__c\n  61, 118, 111, 105, 100,  32,  48, 125, 105, 102,  40, 114, // =void 0}if(r\n  61, 110,  46,  95,  95, 107,  41, 102, 111, 114,  40, 111, // =n.__k)for(o\n  61,  48,  59, 111,  60, 114,  46, 108, 101, 110, 103, 116, // =0;o<r.lengt\n 104,  59, 111,  43,  43,  41, 114,  91, 111,  93,  38,  38, // h;o++)r[o]&&\n  87,  40, 114,  91, 111,  93,  44, 101,  44,  95, 124, 124, // W(r[o],e,_||\n  34, 102, 117, 110,  99, 116, 105, 111, 110,  34,  33,  61, // \"function\"!=\n 116, 121, 112, 101, 111, 102,  32, 110,  46, 116, 121, 112, // typeof n.typ\n 101,  41,  59,  95, 124, 124, 110, 117, 108, 108,  61,  61, // e);_||null==\n 110,  46,  95,  95, 101, 124, 124, 112,  40, 110,  46,  95, // n.__e||p(n._\n  95, 101,  41,  44, 110,  46,  95,  95,  61, 110,  46,  95, // _e),n.__=n._\n  95, 101,  61, 110,  46,  95,  95, 100,  61, 118, 111, 105, // _e=n.__d=voi\n 100,  32,  48, 125, 102, 117, 110,  99, 116, 105, 111, 110, // d 0}function\n  32,  86,  40, 110,  44, 116,  44, 101,  41, 123, 114, 101, //  V(n,t,e){re\n 116, 117, 114, 110,  32, 116, 104, 105, 115,  46,  99, 111, // turn this.co\n 110, 115, 116, 114, 117,  99, 116, 111, 114,  40, 110,  44, // nstructor(n,\n 101,  41, 125, 102, 117, 110,  99, 116, 105, 111, 110,  32, // e)}function \n  70,  40, 101,  44,  95,  44, 114,  41, 123, 118,  97, 114, // F(e,_,r){var\n  32, 111,  44, 105,  44, 117,  59, 116,  46,  95,  95,  38, //  o,i,u;t.__&\n  38, 116,  46,  95,  95,  40, 101,  44,  95,  41,  44, 105, // &t.__(e,_),i\n  61,  40, 111,  61,  34, 102, 117, 110,  99, 116, 105, 111, // =(o=\"functio\n 110,  34,  61,  61, 116, 121, 112, 101, 111, 102,  32, 114, // n\"==typeof r\n  41,  63, 110, 117, 108, 108,  58, 114,  38,  38, 114,  46, // )?null:r&&r.\n  95,  95, 107, 124, 124,  95,  46,  95,  95, 107,  44, 117, // __k||_.__k,u\n  61,  91,  93,  44,  84,  40,  95,  44, 101,  61,  40,  33, // =[],T(_,e=(!\n 111,  38,  38, 114, 124, 124,  95,  41,  46,  95,  95, 107, // o&&r||_).__k\n  61, 104,  40, 109,  44, 110, 117, 108, 108,  44,  91, 101, // =h(m,null,[e\n  93,  41,  44, 105, 124, 124,  99,  44,  99,  44, 118, 111, // ]),i||c,c,vo\n 105, 100,  32,  48,  33,  61,  61,  95,  46, 111, 119, 110, // id 0!==_.own\n 101, 114,  83,  86,  71,  69, 108, 101, 109, 101, 110, 116, // erSVGElement\n  44,  33, 111,  38,  38, 114,  63,  91, 114,  93,  58, 105, // ,!o&&r?[r]:i\n  63, 110, 117, 108, 108,  58,  95,  46, 102, 105, 114, 115, // ?null:_.firs\n 116,  67, 104, 105, 108, 100,  63, 110,  46,  99,  97, 108, // tChild?n.cal\n 108,  40,  95,  46,  99, 104, 105, 108, 100,  78, 111, 100, // l(_.childNod\n 101, 115,  41,  58, 110, 117, 108, 108,  44, 117,  44,  33, // es):null,u,!\n 111,  38,  38, 114,  63, 114,  58, 105,  63, 105,  46,  95, // o&&r?r:i?i._\n  95, 101,  58,  95,  46, 102, 105, 114, 115, 116,  67, 104, // _e:_.firstCh\n 105, 108, 100,  44, 111,  41,  44,  82,  40, 117,  44, 101, // ild,o),R(u,e\n  41, 125, 102, 117, 110,  99, 116, 105, 111, 110,  32,  73, // )}function I\n  40, 110,  44, 116,  41, 123,  70,  40, 110,  44, 116,  44, // (n,t){F(n,t,\n  73,  41, 125, 102, 117, 110,  99, 116, 105, 111, 110,  32, // I)}function \n  79,  40, 116,  44, 101,  44,  95,  41, 123, 118,  97, 114, // O(t,e,_){var\n  32, 114,  44, 111,  44, 105,  44, 117,  61, 102,  40, 123, //  r,o,i,u=f({\n 125,  44, 116,  46, 112, 114, 111, 112, 115,  41,  59, 102, // },t.props);f\n 111, 114,  40, 105,  32, 105, 110,  32, 101,  41,  34, 107, // or(i in e)\"k\n 101, 121,  34,  61,  61, 105,  63, 114,  61, 101,  91, 105, // ey\"==i?r=e[i\n  93,  58,  34, 114, 101, 102,  34,  61,  61, 105,  63, 111, // ]:\"ref\"==i?o\n  61, 101,  91, 105,  93,  58, 117,  91, 105,  93,  61, 101, // =e[i]:u[i]=e\n  91, 105,  93,  59, 114, 101, 116, 117, 114, 110,  32,  97, // [i];return a\n 114, 103, 117, 109, 101, 110, 116, 115,  46, 108, 101, 110, // rguments.len\n 103, 116, 104,  62,  50,  38,  38,  40, 117,  46,  99, 104, // gth>2&&(u.ch\n 105, 108, 100, 114, 101, 110,  61,  97, 114, 103, 117, 109, // ildren=argum\n 101, 110, 116, 115,  46, 108, 101, 110, 103, 116, 104,  62, // ents.length>\n  51,  63, 110,  46,  99,  97, 108, 108,  40,  97, 114, 103, // 3?n.call(arg\n 117, 109, 101, 110, 116, 115,  44,  50,  41,  58,  95,  41, // uments,2):_)\n  44, 100,  40, 116,  46, 116, 121, 112, 101,  44, 117,  44, // ,d(t.type,u,\n 114, 124, 124, 116,  46, 107, 101, 121,  44, 111, 124, 124, // r||t.key,o||\n 116,  46, 114, 101, 102,  44, 110, 117, 108, 108,  41, 125, // t.ref,null)}\n 102, 117, 110,  99, 116, 105, 111, 110,  32,  36,  40, 110, // function $(n\n  44, 116,  41, 123, 118,  97, 114,  32, 101,  61, 123,  95, // ,t){var e={_\n  95,  99,  58, 116,  61,  34,  95,  95,  99,  67,  34,  43, // _c:t=\"__cC\"+\n 108,  43,  43,  44,  95,  95,  58, 110,  44,  67, 111, 110, // l++,__:n,Con\n 115, 117, 109, 101, 114,  58, 102, 117, 110,  99, 116, 105, // sumer:functi\n 111, 110,  40, 110,  44, 116,  41, 123, 114, 101, 116, 117, // on(n,t){retu\n 114, 110,  32, 110,  46,  99, 104, 105, 108, 100, 114, 101, // rn n.childre\n 110,  40, 116,  41, 125,  44,  80, 114, 111, 118, 105, 100, // n(t)},Provid\n 101, 114,  58, 102, 117, 110,  99, 116, 105, 111, 110,  40, // er:function(\n 110,  41, 123, 118,  97, 114,  32, 101,  44,  95,  59, 114, // n){var e,_;r\n 101, 116, 117, 114, 110,  32, 116, 104, 105, 115,  46, 103, // eturn this.g\n 101, 116,  67, 104, 105, 108, 100,  67, 111, 110, 116, 101, // etChildConte\n 120, 116, 124, 124,  40, 101,  61,  91,  93,  44,  40,  95, // xt||(e=[],(_\n  61, 123, 125,  41,  91, 116,  93,  61, 116, 104, 105, 115, // ={})[t]=this\n  44, 116, 104, 105, 115,  46, 103, 101, 116,  67, 104, 105, // ,this.getChi\n 108, 100,  67, 111, 110, 116, 101, 120, 116,  61, 102, 117, // ldContext=fu\n 110,  99, 116, 105, 111, 110,  40,  41, 123, 114, 101, 116, // nction(){ret\n 117, 114, 110,  32,  95, 125,  44, 116, 104, 105, 115,  46, // urn _},this.\n 115, 104, 111, 117, 108, 100,  67, 111, 109, 112, 111, 110, // shouldCompon\n 101, 110, 116,  85, 112, 100,  97, 116, 101,  61, 102, 117, // entUpdate=fu\n 110,  99, 116, 105, 111, 110,  40, 110,  41, 123, 116, 104, // nction(n){th\n 105, 115,  46, 112, 114, 111, 112, 115,  46, 118,  97, 108, // is.props.val\n 117, 101,  33,  61,  61, 110,  46, 118,  97, 108, 117, 101, // ue!==n.value\n  38,  38, 101,  46, 115, 111, 109, 101,  40,  40, 102, 117, // &&e.some((fu\n 110,  99, 116, 105, 111, 110,  40, 110,  41, 123, 110,  46, // nction(n){n.\n  95,  95, 101,  61,  33,  48,  44, 107,  40, 110,  41, 125, // __e=!0,k(n)}\n  41,  41, 125,  44, 116, 104, 105, 115,  46, 115, 117,  98, // ))},this.sub\n  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, 110,  41, // =function(n)\n 123, 101,  46, 112, 117, 115, 104,  40, 110,  41,  59, 118, // {e.push(n);v\n  97, 114,  32, 116,  61, 110,  46,  99, 111, 109, 112, 111, // ar t=n.compo\n 110, 101, 110, 116,  87, 105, 108, 108,  85, 110, 109, 111, // nentWillUnmo\n 117, 110, 116,  59, 110,  46,  99, 111, 109, 112, 111, 110, // unt;n.compon\n 101, 110, 116,  87, 105, 108, 108,  85, 110, 109, 111, 117, // entWillUnmou\n 110, 116,  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, // nt=function(\n  41, 123, 101,  46, 115, 112, 108, 105,  99, 101,  40, 101, // ){e.splice(e\n  46, 105, 110, 100, 101, 120,  79, 102,  40, 110,  41,  44, // .indexOf(n),\n  49,  41,  44, 116,  38,  38, 116,  46,  99,  97, 108, 108, // 1),t&&t.call\n  40, 110,  41, 125, 125,  41,  44, 110,  46,  99, 104, 105, // (n)}}),n.chi\n 108, 100, 114, 101, 110, 125, 125,  59, 114, 101, 116, 117, // ldren}};retu\n 114, 110,  32, 101,  46,  80, 114, 111, 118, 105, 100, 101, // rn e.Provide\n 114,  46,  95,  95,  61, 101,  46,  67, 111, 110, 115, 117, // r.__=e.Consu\n 109, 101, 114,  46,  99, 111, 110, 116, 101, 120, 116,  84, // mer.contextT\n 121, 112, 101,  61, 101, 125, 110,  61,  97,  46, 115, 108, // ype=e}n=a.sl\n 105,  99, 101,  44, 116,  61, 123,  95,  95, 101,  58, 102, // ice,t={__e:f\n 117, 110,  99, 116, 105, 111, 110,  40, 110,  44, 116,  44, // unction(n,t,\n 101,  44,  95,  41, 123, 102, 111, 114,  40, 118,  97, 114, // e,_){for(var\n  32, 114,  44, 111,  44, 105,  59, 116,  61, 116,  46,  95, //  r,o,i;t=t._\n  95,  59,  41, 105, 102,  40,  40, 114,  61, 116,  46,  95, // _;)if((r=t._\n  95,  99,  41,  38,  38,  33, 114,  46,  95,  95,  41, 116, // _c)&&!r.__)t\n 114, 121, 123, 105, 102,  40,  40, 111,  61, 114,  46,  99, // ry{if((o=r.c\n 111, 110, 115, 116, 114, 117,  99, 116, 111, 114,  41,  38, // onstructor)&\n  38, 110, 117, 108, 108,  33,  61, 111,  46, 103, 101, 116, // &null!=o.get\n  68, 101, 114, 105, 118, 101, 100,  83, 116,  97, 116, 101, // DerivedState\n  70, 114, 111, 109,  69, 114, 114, 111, 114,  38,  38,  40, // FromError&&(\n 114,  46, 115, 101, 116,  83, 116,  97, 116, 101,  40, 111, // r.setState(o\n  46, 103, 101, 116,  68, 101, 114, 105, 118, 101, 100,  83, // .getDerivedS\n 116,  97, 116, 101,  70, 114, 111, 109,  69, 114, 114, 111, // tateFromErro\n 114,  40, 110,  41,  41,  44, 105,  61, 114,  46,  95,  95, // r(n)),i=r.__\n 100,  41,  44, 110, 117, 108, 108,  33,  61, 114,  46,  99, // d),null!=r.c\n 111, 109, 112, 111, 110, 101, 110, 116,  68, 105, 100,  67, // omponentDidC\n  97, 116,  99, 104,  38,  38,  40, 114,  46,  99, 111, 109, // atch&&(r.com\n 112, 111, 110, 101, 110, 116,  68, 105, 100,  67,  97, 116, // ponentDidCat\n  99, 104,  40, 110,  44,  95, 124, 124, 123, 125,  41,  44, // ch(n,_||{}),\n 105,  61, 114,  46,  95,  95, 100,  41,  44, 105,  41, 114, // i=r.__d),i)r\n 101, 116, 117, 114, 110,  32, 114,  46,  95,  95,  69,  61, // eturn r.__E=\n 114, 125,  99,  97, 116,  99, 104,  40, 116,  41, 123, 110, // r}catch(t){n\n  61, 116, 125, 116, 104, 114, 111, 119,  32, 110, 125, 125, // =t}throw n}}\n  44, 101,  61,  48,  44,  95,  61, 102, 117, 110,  99, 116, // ,e=0,_=funct\n 105, 111, 110,  40, 110,  41, 123, 114, 101, 116, 117, 114, // ion(n){retur\n 110,  32, 110, 117, 108, 108,  33,  61, 110,  38,  38, 118, // n null!=n&&v\n 111, 105, 100,  32,  48,  61,  61,  61, 110,  46,  99, 111, // oid 0===n.co\n 110, 115, 116, 114, 117,  99, 116, 111, 114, 125,  44, 121, // nstructor},y\n  46, 112, 114, 111, 116, 111, 116, 121, 112, 101,  46, 115, // .prototype.s\n 101, 116,  83, 116,  97, 116, 101,  61, 102, 117, 110,  99, // etState=func\n 116, 105, 111, 110,  40, 110,  44, 116,  41, 123, 118,  97, // tion(n,t){va\n 114,  32, 101,  59, 101,  61, 110, 117, 108, 108,  33,  61, // r e;e=null!=\n 116, 104, 105, 115,  46,  95,  95, 115,  38,  38, 116, 104, // this.__s&&th\n 105, 115,  46,  95,  95, 115,  33,  61,  61, 116, 104, 105, // is.__s!==thi\n 115,  46, 115, 116,  97, 116, 101,  63, 116, 104, 105, 115, // s.state?this\n  46,  95,  95, 115,  58, 116, 104, 105, 115,  46,  95,  95, // .__s:this.__\n 115,  61, 102,  40, 123, 125,  44, 116, 104, 105, 115,  46, // s=f({},this.\n 115, 116,  97, 116, 101,  41,  44,  34, 102, 117, 110,  99, // state),\"func\n 116, 105, 111, 110,  34,  61,  61, 116, 121, 112, 101, 111, // tion\"==typeo\n 102,  32, 110,  38,  38,  40, 110,  61, 110,  40, 102,  40, // f n&&(n=n(f(\n 123, 125,  44, 101,  41,  44, 116, 104, 105, 115,  46, 112, // {},e),this.p\n 114, 111, 112, 115,  41,  41,  44, 110,  38,  38, 102,  40, // rops)),n&&f(\n 101,  44, 110,  41,  44, 110, 117, 108, 108,  33,  61, 110, // e,n),null!=n\n  38,  38, 116, 104, 105, 115,  46,  95,  95, 118,  38,  38, // &&this.__v&&\n  40, 116,  38,  38, 116, 104, 105, 115,  46,  95, 115,  98, // (t&&this._sb\n  46, 112, 117, 115, 104,  40, 116,  41,  44, 107,  40, 116, // .push(t),k(t\n 104, 105, 115,  41,  41, 125,  44, 121,  46, 112, 114, 111, // his))},y.pro\n 116, 111, 116, 121, 112, 101,  46, 102, 111, 114,  99, 101, // totype.force\n  85, 112, 100,  97, 116, 101,  61, 102, 117, 110,  99, 116, // Update=funct\n 105, 111, 110,  40, 110,  41, 123, 116, 104, 105, 115,  46, // ion(n){this.\n  95,  95, 118,  38,  38,  40, 116, 104, 105, 115,  46,  95, // __v&&(this._\n  95, 101,  61,  33,  48,  44, 110,  38,  38, 116, 104, 105, // _e=!0,n&&thi\n 115,  46,  95,  95, 104,  46, 112, 117, 115, 104,  40, 110, // s.__h.push(n\n  41,  44, 107,  40, 116, 104, 105, 115,  41,  41, 125,  44, // ),k(this))},\n 121,  46, 112, 114, 111, 116, 111, 116, 121, 112, 101,  46, // y.prototype.\n 114, 101, 110, 100, 101, 114,  61, 109,  44, 114,  61,  91, // render=m,r=[\n  93,  44, 105,  61,  34, 102, 117, 110,  99, 116, 105, 111, // ],i=\"functio\n 110,  34,  61,  61, 116, 121, 112, 101, 111, 102,  32,  80, // n\"==typeof P\n 114, 111, 109, 105, 115, 101,  63,  80, 114, 111, 109, 105, // romise?Promi\n 115, 101,  46, 112, 114, 111, 116, 111, 116, 121, 112, 101, // se.prototype\n  46, 116, 104, 101, 110,  46,  98, 105, 110, 100,  40,  80, // .then.bind(P\n 114, 111, 109, 105, 115, 101,  46, 114, 101, 115, 111, 108, // romise.resol\n 118, 101,  40,  41,  41,  58, 115, 101, 116,  84, 105, 109, // ve()):setTim\n 101, 111, 117, 116,  44, 117,  61, 102, 117, 110,  99, 116, // eout,u=funct\n 105, 111, 110,  40, 110,  44, 116,  41, 123, 114, 101, 116, // ion(n,t){ret\n 117, 114, 110,  32, 110,  46,  95,  95, 118,  46,  95,  95, // urn n.__v.__\n  98,  45, 116,  46,  95,  95, 118,  46,  95,  95,  98, 125, // b-t.__v.__b}\n  44,  67,  46,  95,  95, 114,  61,  48,  44, 108,  61,  48, // ,C.__r=0,l=0\n  59, 118,  97, 114,  32, 106,  44, 113,  44,  66,  44,  75, // ;var j,q,B,K\n  44,  71,  61,  48,  44, 122,  61,  91,  93,  44,  74,  61, // ,G=0,z=[],J=\n  91,  93,  44,  81,  61, 116,  46,  95,  95,  98,  44,  88, // [],Q=t.__b,X\n  61, 116,  46,  95,  95, 114,  44,  89,  61, 116,  46, 100, // =t.__r,Y=t.d\n 105, 102, 102, 101, 100,  44,  90,  61, 116,  46,  95,  95, // iffed,Z=t.__\n  99,  44, 110, 110,  61, 116,  46, 117, 110, 109, 111, 117, // c,nn=t.unmou\n 110, 116,  59, 102, 117, 110,  99, 116, 105, 111, 110,  32, // nt;function \n 116, 110,  40, 110,  44, 101,  41, 123, 116,  46,  95,  95, // tn(n,e){t.__\n 104,  38,  38, 116,  46,  95,  95, 104,  40, 113,  44, 110, // h&&t.__h(q,n\n  44,  71, 124, 124, 101,  41,  44,  71,  61,  48,  59, 118, // ,G||e),G=0;v\n  97, 114,  32,  95,  61, 113,  46,  95,  95,  72, 124, 124, // ar _=q.__H||\n  40, 113,  46,  95,  95,  72,  61, 123,  95,  95,  58,  91, // (q.__H={__:[\n  93,  44,  95,  95, 104,  58,  91,  93, 125,  41,  59, 114, // ],__h:[]});r\n 101, 116, 117, 114, 110,  32, 110,  62,  61,  95,  46,  95, // eturn n>=_._\n  95,  46, 108, 101, 110, 103, 116, 104,  38,  38,  95,  46, // _.length&&_.\n  95,  95,  46, 112, 117, 115, 104,  40, 123,  95,  95,  86, // __.push({__V\n  58,  74, 125,  41,  44,  95,  46,  95,  95,  91, 110,  93, // :J}),_.__[n]\n 125, 102, 117, 110,  99, 116, 105, 111, 110,  32, 101, 110, // }function en\n  40, 110,  41, 123, 114, 101, 116, 117, 114, 110,  32,  71, // (n){return G\n  61,  49,  44,  95, 110,  40, 107, 110,  44, 110,  41, 125, // =1,_n(kn,n)}\n 102, 117, 110,  99, 116, 105, 111, 110,  32,  95, 110,  40, // function _n(\n 110,  44, 116,  44, 101,  41, 123, 118,  97, 114,  32,  95, // n,t,e){var _\n  61, 116, 110,  40, 106,  43,  43,  44,  50,  41,  59, 105, // =tn(j++,2);i\n 102,  40,  95,  46, 116,  61, 110,  44,  33,  95,  46,  95, // f(_.t=n,!_._\n  95,  99,  38,  38,  40,  95,  46,  95,  95,  61,  91, 101, // _c&&(_.__=[e\n  63, 101,  40, 116,  41,  58, 107, 110,  40, 118, 111, 105, // ?e(t):kn(voi\n 100,  32,  48,  44, 116,  41,  44, 102, 117, 110,  99, 116, // d 0,t),funct\n 105, 111, 110,  40, 110,  41, 123, 118,  97, 114,  32, 116, // ion(n){var t\n  61,  95,  46,  95,  95,  78,  63,  95,  46,  95,  95,  78, // =_.__N?_.__N\n  91,  48,  93,  58,  95,  46,  95,  95,  91,  48,  93,  44, // [0]:_.__[0],\n 101,  61,  95,  46, 116,  40, 116,  44, 110,  41,  59, 116, // e=_.t(t,n);t\n  33,  61,  61, 101,  38,  38,  40,  95,  46,  95,  95,  78, // !==e&&(_.__N\n  61,  91, 101,  44,  95,  46,  95,  95,  91,  49,  93,  93, // =[e,_.__[1]]\n  44,  95,  46,  95,  95,  99,  46, 115, 101, 116,  83, 116, // ,_.__c.setSt\n  97, 116, 101,  40, 123, 125,  41,  41, 125,  93,  44,  95, // ate({}))}],_\n  46,  95,  95,  99,  61, 113,  44,  33, 113,  46, 117,  41, // .__c=q,!q.u)\n  41, 123, 118,  97, 114,  32, 114,  61, 102, 117, 110,  99, // ){var r=func\n 116, 105, 111, 110,  40, 110,  44, 116,  44, 101,  41, 123, // tion(n,t,e){\n 105, 102,  40,  33,  95,  46,  95,  95,  99,  46,  95,  95, // if(!_.__c.__\n  72,  41, 114, 101, 116, 117, 114, 110,  33,  48,  59, 118, // H)return!0;v\n  97, 114,  32, 114,  61,  95,  46,  95,  95,  99,  46,  95, // ar r=_.__c._\n  95,  72,  46,  95,  95,  46, 102, 105, 108, 116, 101, 114, // _H.__.filter\n  40,  40, 102, 117, 110,  99, 116, 105, 111, 110,  40, 110, // ((function(n\n  41, 123, 114, 101, 116, 117, 114, 110,  32, 110,  46,  95, // ){return n._\n  95,  99, 125,  41,  41,  59, 105, 102,  40, 114,  46, 101, // _c}));if(r.e\n 118, 101, 114, 121,  40,  40, 102, 117, 110,  99, 116, 105, // very((functi\n 111, 110,  40, 110,  41, 123, 114, 101, 116, 117, 114, 110, // on(n){return\n  33, 110,  46,  95,  95,  78, 125,  41,  41,  41, 114, 101, // !n.__N})))re\n 116, 117, 114, 110,  33, 111, 124, 124, 111,  46,  99,  97, // turn!o||o.ca\n 108, 108,  40, 116, 104, 105, 115,  44, 110,  44, 116,  44, // ll(this,n,t,\n 101,  41,  59, 118,  97, 114,  32, 105,  61,  33,  49,  59, // e);var i=!1;\n 114, 101, 116, 117, 114, 110,  32, 114,  46, 102, 111, 114, // return r.for\n  69,  97,  99, 104,  40,  40, 102, 117, 110,  99, 116, 105, // Each((functi\n 111, 110,  40, 110,  41, 123, 105, 102,  40, 110,  46,  95, // on(n){if(n._\n  95,  78,  41, 123, 118,  97, 114,  32, 116,  61, 110,  46, // _N){var t=n.\n  95,  95,  91,  48,  93,  59, 110,  46,  95,  95,  61, 110, // __[0];n.__=n\n  46,  95,  95,  78,  44, 110,  46,  95,  95,  78,  61, 118, // .__N,n.__N=v\n 111, 105, 100,  32,  48,  44, 116,  33,  61,  61, 110,  46, // oid 0,t!==n.\n  95,  95,  91,  48,  93,  38,  38,  40, 105,  61,  33,  48, // __[0]&&(i=!0\n  41, 125, 125,  41,  41,  44,  33,  40,  33, 105,  38,  38, // )}})),!(!i&&\n  95,  46,  95,  95,  99,  46, 112, 114, 111, 112, 115,  61, // _.__c.props=\n  61,  61, 110,  41,  38,  38,  40,  33, 111, 124, 124, 111, // ==n)&&(!o||o\n  46,  99,  97, 108, 108,  40, 116, 104, 105, 115,  44, 110, // .call(this,n\n  44, 116,  44, 101,  41,  41, 125,  59, 113,  46, 117,  61, // ,t,e))};q.u=\n  33,  48,  59, 118,  97, 114,  32, 111,  61, 113,  46, 115, // !0;var o=q.s\n 104, 111, 117, 108, 100,  67, 111, 109, 112, 111, 110, 101, // houldCompone\n 110, 116,  85, 112, 100,  97, 116, 101,  44, 105,  61, 113, // ntUpdate,i=q\n  46,  99, 111, 109, 112, 111, 110, 101, 110, 116,  87, 105, // .componentWi\n 108, 108,  85, 112, 100,  97, 116, 101,  59, 113,  46,  99, // llUpdate;q.c\n 111, 109, 112, 111, 110, 101, 110, 116,  87, 105, 108, 108, // omponentWill\n  85, 112, 100,  97, 116, 101,  61, 102, 117, 110,  99, 116, // Update=funct\n 105, 111, 110,  40, 110,  44, 116,  44, 101,  41, 123, 105, // ion(n,t,e){i\n 102,  40, 116, 104, 105, 115,  46,  95,  95, 101,  41, 123, // f(this.__e){\n 118,  97, 114,  32,  95,  61, 111,  59, 111,  61, 118, 111, // var _=o;o=vo\n 105, 100,  32,  48,  44, 114,  40, 110,  44, 116,  44, 101, // id 0,r(n,t,e\n  41,  44, 111,  61,  95, 125, 105,  38,  38, 105,  46,  99, // ),o=_}i&&i.c\n  97, 108, 108,  40, 116, 104, 105, 115,  44, 110,  44, 116, // all(this,n,t\n  44, 101,  41, 125,  44, 113,  46, 115, 104, 111, 117, 108, // ,e)},q.shoul\n 100,  67, 111, 109, 112, 111, 110, 101, 110, 116,  85, 112, // dComponentUp\n 100,  97, 116, 101,  61, 114, 125, 114, 101, 116, 117, 114, // date=r}retur\n 110,  32,  95,  46,  95,  95,  78, 124, 124,  95,  46,  95, // n _.__N||_._\n  95, 125, 102, 117, 110,  99, 116, 105, 111, 110,  32, 114, // _}function r\n 110,  40, 110,  44, 101,  41, 123, 118,  97, 114,  32,  95, // n(n,e){var _\n  61, 116, 110,  40, 106,  43,  43,  44,  51,  41,  59,  33, // =tn(j++,3);!\n 116,  46,  95,  95, 115,  38,  38,  98, 110,  40,  95,  46, // t.__s&&bn(_.\n  95,  95,  72,  44, 101,  41,  38,  38,  40,  95,  46,  95, // __H,e)&&(_._\n  95,  61, 110,  44,  95,  46, 105,  61, 101,  44, 113,  46, // _=n,_.i=e,q.\n  95,  95,  72,  46,  95,  95, 104,  46, 112, 117, 115, 104, // __H.__h.push\n  40,  95,  41,  41, 125, 102, 117, 110,  99, 116, 105, 111, // (_))}functio\n 110,  32, 111, 110,  40, 110,  44, 101,  41, 123, 118,  97, // n on(n,e){va\n 114,  32,  95,  61, 116, 110,  40, 106,  43,  43,  44,  52, // r _=tn(j++,4\n  41,  59,  33, 116,  46,  95,  95, 115,  38,  38,  98, 110, // );!t.__s&&bn\n  40,  95,  46,  95,  95,  72,  44, 101,  41,  38,  38,  40, // (_.__H,e)&&(\n  95,  46,  95,  95,  61, 110,  44,  95,  46, 105,  61, 101, // _.__=n,_.i=e\n  44, 113,  46,  95,  95, 104,  46, 112, 117, 115, 104,  40, // ,q.__h.push(\n  95,  41,  41, 125, 102, 117, 110,  99, 116, 105, 111, 110, // _))}function\n  32, 117, 110,  40, 110,  41, 123, 114, 101, 116, 117, 114, //  un(n){retur\n 110,  32,  71,  61,  53,  44,  99, 110,  40,  40, 102, 117, // n G=5,cn((fu\n 110,  99, 116, 105, 111, 110,  40,  41, 123, 114, 101, 116, // nction(){ret\n 117, 114, 110, 123,  99, 117, 114, 114, 101, 110, 116,  58, // urn{current:\n 110, 125, 125,  41,  44,  91,  93,  41, 125, 102, 117, 110, // n}}),[])}fun\n  99, 116, 105, 111, 110,  32, 108, 110,  40, 110,  44, 116, // ction ln(n,t\n  44, 101,  41, 123,  71,  61,  54,  44, 111, 110,  40,  40, // ,e){G=6,on((\n 102, 117, 110,  99, 116, 105, 111, 110,  40,  41, 123, 114, // function(){r\n 101, 116, 117, 114, 110,  34, 102, 117, 110,  99, 116, 105, // eturn\"functi\n 111, 110,  34,  61,  61, 116, 121, 112, 101, 111, 102,  32, // on\"==typeof \n 110,  63,  40, 110,  40, 116,  40,  41,  41,  44, 102, 117, // n?(n(t()),fu\n 110,  99, 116, 105, 111, 110,  40,  41, 123, 114, 101, 116, // nction(){ret\n 117, 114, 110,  32, 110,  40, 110, 117, 108, 108,  41, 125, // urn n(null)}\n  41,  58, 110,  63,  40, 110,  46,  99, 117, 114, 114, 101, // ):n?(n.curre\n 110, 116,  61, 116,  40,  41,  44, 102, 117, 110,  99, 116, // nt=t(),funct\n 105, 111, 110,  40,  41, 123, 114, 101, 116, 117, 114, 110, // ion(){return\n  32, 110,  46,  99, 117, 114, 114, 101, 110, 116,  61, 110, //  n.current=n\n 117, 108, 108, 125,  41,  58, 118, 111, 105, 100,  32,  48, // ull}):void 0\n 125,  41,  44, 110, 117, 108, 108,  61,  61, 101,  63, 101, // }),null==e?e\n  58, 101,  46,  99, 111, 110,  99,  97, 116,  40, 110,  41, // :e.concat(n)\n  41, 125, 102, 117, 110,  99, 116, 105, 111, 110,  32,  99, // )}function c\n 110,  40, 110,  44, 116,  41, 123, 118,  97, 114,  32, 101, // n(n,t){var e\n  61, 116, 110,  40, 106,  43,  43,  44,  55,  41,  59, 114, // =tn(j++,7);r\n 101, 116, 117, 114, 110,  32,  98, 110,  40, 101,  46,  95, // eturn bn(e._\n  95,  72,  44, 116,  41,  63,  40, 101,  46,  95,  95,  86, // _H,t)?(e.__V\n  61, 110,  40,  41,  44, 101,  46, 105,  61, 116,  44, 101, // =n(),e.i=t,e\n  46,  95,  95, 104,  61, 110,  44, 101,  46,  95,  95,  86, // .__h=n,e.__V\n  41,  58, 101,  46,  95,  95, 125, 102, 117, 110,  99, 116, // ):e.__}funct\n 105, 111, 110,  32,  97, 110,  40, 110,  44, 116,  41, 123, // ion an(n,t){\n 114, 101, 116, 117, 114, 110,  32,  71,  61,  56,  44,  99, // return G=8,c\n 110,  40,  40, 102, 117, 110,  99, 116, 105, 111, 110,  40, // n((function(\n  41, 123, 114, 101, 116, 117, 114, 110,  32, 110, 125,  41, // ){return n})\n  44, 116,  41, 125, 102, 117, 110,  99, 116, 105, 111, 110, // ,t)}function\n  32, 115, 110,  40, 110,  41, 123, 118,  97, 114,  32, 116, //  sn(n){var t\n  61, 113,  46,  99, 111, 110, 116, 101, 120, 116,  91, 110, // =q.context[n\n  46,  95,  95,  99,  93,  44, 101,  61, 116, 110,  40, 106, // .__c],e=tn(j\n  43,  43,  44,  57,  41,  59, 114, 101, 116, 117, 114, 110, // ++,9);return\n  32, 101,  46,  99,  61, 110,  44, 116,  63,  40, 110, 117, //  e.c=n,t?(nu\n 108, 108,  61,  61, 101,  46,  95,  95,  38,  38,  40, 101, // ll==e.__&&(e\n  46,  95,  95,  61,  33,  48,  44, 116,  46, 115, 117,  98, // .__=!0,t.sub\n  40, 113,  41,  41,  44, 116,  46, 112, 114, 111, 112, 115, // (q)),t.props\n  46, 118,  97, 108, 117, 101,  41,  58, 110,  46,  95,  95, // .value):n.__\n 125, 102, 117, 110,  99, 116, 105, 111, 110,  32, 102, 110, // }function fn\n  40, 110,  44, 101,  41, 123, 116,  46, 117, 115, 101,  68, // (n,e){t.useD\n 101,  98, 117, 103,  86,  97, 108, 117, 101,  38,  38, 116, // ebugValue&&t\n  46, 117, 115, 101,  68, 101,  98, 117, 103,  86,  97, 108, // .useDebugVal\n 117, 101,  40, 101,  63, 101,  40, 110,  41,  58, 110,  41, // ue(e?e(n):n)\n 125, 102, 117, 110,  99, 116, 105, 111, 110,  32, 112, 110, // }function pn\n  40, 110,  41, 123, 118,  97, 114,  32, 116,  61, 116, 110, // (n){var t=tn\n  40, 106,  43,  43,  44,  49,  48,  41,  44, 101,  61, 101, // (j++,10),e=e\n 110,  40,  41,  59, 114, 101, 116, 117, 114, 110,  32, 116, // n();return t\n  46,  95,  95,  61, 110,  44, 113,  46,  99, 111, 109, 112, // .__=n,q.comp\n 111, 110, 101, 110, 116,  68, 105, 100,  67,  97, 116,  99, // onentDidCatc\n 104, 124, 124,  40, 113,  46,  99, 111, 109, 112, 111, 110, // h||(q.compon\n 101, 110, 116,  68, 105, 100,  67,  97, 116,  99, 104,  61, // entDidCatch=\n 102, 117, 110,  99, 116, 105, 111, 110,  40, 110,  44,  95, // function(n,_\n  41, 123, 116,  46,  95,  95,  38,  38, 116,  46,  95,  95, // ){t.__&&t.__\n  40, 110,  44,  95,  41,  44, 101,  91,  49,  93,  40, 110, // (n,_),e[1](n\n  41, 125,  41,  44,  91, 101,  91,  48,  93,  44, 102, 117, // )}),[e[0],fu\n 110,  99, 116, 105, 111, 110,  40,  41, 123, 101,  91,  49, // nction(){e[1\n  93,  40, 118, 111, 105, 100,  32,  48,  41, 125,  93, 125, // ](void 0)}]}\n 102, 117, 110,  99, 116, 105, 111, 110,  32, 104, 110,  40, // function hn(\n  41, 123, 118,  97, 114,  32, 110,  61, 116, 110,  40, 106, // ){var n=tn(j\n  43,  43,  44,  49,  49,  41,  59, 105, 102,  40,  33, 110, // ++,11);if(!n\n  46,  95,  95,  41, 123, 102, 111, 114,  40, 118,  97, 114, // .__){for(var\n  32, 116,  61, 113,  46,  95,  95, 118,  59, 110, 117, 108, //  t=q.__v;nul\n 108,  33,  61,  61, 116,  38,  38,  33, 116,  46,  95,  95, // l!==t&&!t.__\n 109,  38,  38, 110, 117, 108, 108,  33,  61,  61, 116,  46, // m&&null!==t.\n  95,  95,  59,  41, 116,  61, 116,  46,  95,  95,  59, 118, // __;)t=t.__;v\n  97, 114,  32, 101,  61, 116,  46,  95,  95, 109, 124, 124, // ar e=t.__m||\n  40, 116,  46,  95,  95, 109,  61,  91,  48,  44,  48,  93, // (t.__m=[0,0]\n  41,  59, 110,  46,  95,  95,  61,  34,  80,  34,  43, 101, // );n.__=\"P\"+e\n  91,  48,  93,  43,  34,  45,  34,  43, 101,  91,  49,  93, // [0]+\"-\"+e[1]\n  43,  43, 125, 114, 101, 116, 117, 114, 110,  32, 110,  46, // ++}return n.\n  95,  95, 125, 102, 117, 110,  99, 116, 105, 111, 110,  32, // __}function \n 100, 110,  40,  41, 123, 102, 111, 114,  40, 118,  97, 114, // dn(){for(var\n  32, 110,  59, 110,  61, 122,  46, 115, 104, 105, 102, 116, //  n;n=z.shift\n  40,  41,  59,  41, 105, 102,  40, 110,  46,  95,  95,  80, // ();)if(n.__P\n  38,  38, 110,  46,  95,  95,  72,  41, 116, 114, 121, 123, // &&n.__H)try{\n 110,  46,  95,  95,  72,  46,  95,  95, 104,  46, 102, 111, // n.__H.__h.fo\n 114,  69,  97,  99, 104,  40, 121, 110,  41,  44, 110,  46, // rEach(yn),n.\n  95,  95,  72,  46,  95,  95, 104,  46, 102, 111, 114,  69, // __H.__h.forE\n  97,  99, 104,  40, 103, 110,  41,  44, 110,  46,  95,  95, // ach(gn),n.__\n  72,  46,  95,  95, 104,  61,  91,  93, 125,  99,  97, 116, // H.__h=[]}cat\n  99, 104,  40, 111,  41, 123, 110,  46,  95,  95,  72,  46, // ch(o){n.__H.\n  95,  95, 104,  61,  91,  93,  44, 116,  46,  95,  95, 101, // __h=[],t.__e\n  40, 111,  44, 110,  46,  95,  95, 118,  41, 125, 125, 116, // (o,n.__v)}}t\n  46,  95,  95,  98,  61, 102, 117, 110,  99, 116, 105, 111, // .__b=functio\n 110,  40, 110,  41, 123, 113,  61, 110, 117, 108, 108,  44, // n(n){q=null,\n  81,  38,  38,  81,  40, 110,  41, 125,  44, 116,  46,  95, // Q&&Q(n)},t._\n  95, 114,  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, // _r=function(\n 110,  41, 123,  88,  38,  38,  88,  40, 110,  41,  44, 106, // n){X&&X(n),j\n  61,  48,  59, 118,  97, 114,  32, 116,  61,  40, 113,  61, // =0;var t=(q=\n 110,  46,  95,  95,  99,  41,  46,  95,  95,  72,  59, 116, // n.__c).__H;t\n  38,  38,  40,  66,  61,  61,  61, 113,  63,  40, 116,  46, // &&(B===q?(t.\n  95,  95, 104,  61,  91,  93,  44, 113,  46,  95,  95, 104, // __h=[],q.__h\n  61,  91,  93,  44, 116,  46,  95,  95,  46, 102, 111, 114, // =[],t.__.for\n  69,  97,  99, 104,  40,  40, 102, 117, 110,  99, 116, 105, // Each((functi\n 111, 110,  40, 110,  41, 123, 110,  46,  95,  95,  78,  38, // on(n){n.__N&\n  38,  40, 110,  46,  95,  95,  61, 110,  46,  95,  95,  78, // &(n.__=n.__N\n  41,  44, 110,  46,  95,  95,  86,  61,  74,  44, 110,  46, // ),n.__V=J,n.\n  95,  95,  78,  61, 110,  46, 105,  61, 118, 111, 105, 100, // __N=n.i=void\n  32,  48, 125,  41,  41,  41,  58,  40, 116,  46,  95,  95, //  0}))):(t.__\n 104,  46, 102, 111, 114,  69,  97,  99, 104,  40, 121, 110, // h.forEach(yn\n  41,  44, 116,  46,  95,  95, 104,  46, 102, 111, 114,  69, // ),t.__h.forE\n  97,  99, 104,  40, 103, 110,  41,  44, 116,  46,  95,  95, // ach(gn),t.__\n 104,  61,  91,  93,  41,  41,  44,  66,  61, 113, 125,  44, // h=[])),B=q},\n 116,  46, 100, 105, 102, 102, 101, 100,  61, 102, 117, 110, // t.diffed=fun\n  99, 116, 105, 111, 110,  40, 110,  41, 123,  89,  38,  38, // ction(n){Y&&\n  89,  40, 110,  41,  59, 118,  97, 114,  32, 101,  61, 110, // Y(n);var e=n\n  46,  95,  95,  99,  59, 101,  38,  38, 101,  46,  95,  95, // .__c;e&&e.__\n  72,  38,  38,  40, 101,  46,  95,  95,  72,  46,  95,  95, // H&&(e.__H.__\n 104,  46, 108, 101, 110, 103, 116, 104,  38,  38,  40,  49, // h.length&&(1\n  33,  61,  61, 122,  46, 112, 117, 115, 104,  40, 101,  41, // !==z.push(e)\n  38,  38,  75,  61,  61,  61, 116,  46, 114, 101, 113, 117, // &&K===t.requ\n 101, 115, 116,  65, 110, 105, 109,  97, 116, 105, 111, 110, // estAnimation\n  70, 114,  97, 109, 101, 124, 124,  40,  40,  75,  61, 116, // Frame||((K=t\n  46, 114, 101, 113, 117, 101, 115, 116,  65, 110, 105, 109, // .requestAnim\n  97, 116, 105, 111, 110,  70, 114,  97, 109, 101,  41, 124, // ationFrame)|\n 124, 109, 110,  41,  40, 100, 110,  41,  41,  44, 101,  46, // |mn)(dn)),e.\n  95,  95,  72,  46,  95,  95,  46, 102, 111, 114,  69,  97, // __H.__.forEa\n  99, 104,  40,  40, 102, 117, 110,  99, 116, 105, 111, 110, // ch((function\n  40, 110,  41, 123, 110,  46, 105,  38,  38,  40, 110,  46, // (n){n.i&&(n.\n  95,  95,  72,  61, 110,  46, 105,  41,  44, 110,  46,  95, // __H=n.i),n._\n  95,  86,  33,  61,  61,  74,  38,  38,  40, 110,  46,  95, // _V!==J&&(n._\n  95,  61, 110,  46,  95,  95,  86,  41,  44, 110,  46, 105, // _=n.__V),n.i\n  61, 118, 111, 105, 100,  32,  48,  44, 110,  46,  95,  95, // =void 0,n.__\n  86,  61,  74, 125,  41,  41,  41,  44,  66,  61, 113,  61, // V=J}))),B=q=\n 110, 117, 108, 108, 125,  44, 116,  46,  95,  95,  99,  61, // null},t.__c=\n 102, 117, 110,  99, 116, 105, 111, 110,  40, 110,  44,  95, // function(n,_\n  41, 123,  95,  46, 115, 111, 109, 101,  40,  40, 102, 117, // ){_.some((fu\n 110,  99, 116, 105, 111, 110,  40, 110,  41, 123, 116, 114, // nction(n){tr\n 121, 123, 110,  46,  95,  95, 104,  46, 102, 111, 114,  69, // y{n.__h.forE\n  97,  99, 104,  40, 121, 110,  41,  44, 110,  46,  95,  95, // ach(yn),n.__\n 104,  61, 110,  46,  95,  95, 104,  46, 102, 105, 108, 116, // h=n.__h.filt\n 101, 114,  40,  40, 102, 117, 110,  99, 116, 105, 111, 110, // er((function\n  40, 110,  41, 123, 114, 101, 116, 117, 114, 110,  33, 110, // (n){return!n\n  46,  95,  95, 124, 124, 103, 110,  40, 110,  41, 125,  41, // .__||gn(n)})\n  41, 125,  99,  97, 116,  99, 104,  40, 101,  41, 123,  95, // )}catch(e){_\n  46, 115, 111, 109, 101,  40,  40, 102, 117, 110,  99, 116, // .some((funct\n 105, 111, 110,  40, 110,  41, 123, 110,  46,  95,  95, 104, // ion(n){n.__h\n  38,  38,  40, 110,  46,  95,  95, 104,  61,  91,  93,  41, // &&(n.__h=[])\n 125,  41,  41,  44,  95,  61,  91,  93,  44, 116,  46,  95, // })),_=[],t._\n  95, 101,  40, 101,  44, 110,  46,  95,  95, 118,  41, 125, // _e(e,n.__v)}\n 125,  41,  41,  44,  90,  38,  38,  90,  40, 110,  44,  95, // })),Z&&Z(n,_\n  41, 125,  44, 116,  46, 117, 110, 109, 111, 117, 110, 116, // )},t.unmount\n  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, 110,  41, // =function(n)\n 123, 110, 110,  38,  38, 110, 110,  40, 110,  41,  59, 118, // {nn&&nn(n);v\n  97, 114,  32, 101,  44,  95,  61, 110,  46,  95,  95,  99, // ar e,_=n.__c\n  59,  95,  38,  38,  95,  46,  95,  95,  72,  38,  38,  40, // ;_&&_.__H&&(\n  95,  46,  95,  95,  72,  46,  95,  95,  46, 102, 111, 114, // _.__H.__.for\n  69,  97,  99, 104,  40,  40, 102, 117, 110,  99, 116, 105, // Each((functi\n 111, 110,  40, 110,  41, 123, 116, 114, 121, 123, 121, 110, // on(n){try{yn\n  40, 110,  41, 125,  99,  97, 116,  99, 104,  40, 110,  41, // (n)}catch(n)\n 123, 101,  61, 110, 125, 125,  41,  41,  44,  95,  46,  95, // {e=n}})),_._\n  95,  72,  61, 118, 111, 105, 100,  32,  48,  44, 101,  38, // _H=void 0,e&\n  38, 116,  46,  95,  95, 101,  40, 101,  44,  95,  46,  95, // &t.__e(e,_._\n  95, 118,  41,  41, 125,  59, 118,  97, 114,  32, 118, 110, // _v))};var vn\n  61,  34, 102, 117, 110,  99, 116, 105, 111, 110,  34,  61, // =\"function\"=\n  61, 116, 121, 112, 101, 111, 102,  32, 114, 101, 113, 117, // =typeof requ\n 101, 115, 116,  65, 110, 105, 109,  97, 116, 105, 111, 110, // estAnimation\n  70, 114,  97, 109, 101,  59, 102, 117, 110,  99, 116, 105, // Frame;functi\n 111, 110,  32, 109, 110,  40, 110,  41, 123, 118,  97, 114, // on mn(n){var\n  32, 116,  44, 101,  61, 102, 117, 110,  99, 116, 105, 111, //  t,e=functio\n 110,  40,  41, 123,  99, 108, 101,  97, 114,  84, 105, 109, // n(){clearTim\n 101, 111, 117, 116,  40,  95,  41,  44, 118, 110,  38,  38, // eout(_),vn&&\n  99,  97, 110,  99, 101, 108,  65, 110, 105, 109,  97, 116, // cancelAnimat\n 105, 111, 110,  70, 114,  97, 109, 101,  40, 116,  41,  44, // ionFrame(t),\n 115, 101, 116,  84, 105, 109, 101, 111, 117, 116,  40, 110, // setTimeout(n\n  41, 125,  44,  95,  61, 115, 101, 116,  84, 105, 109, 101, // )},_=setTime\n 111, 117, 116,  40, 101,  44,  49,  48,  48,  41,  59, 118, // out(e,100);v\n 110,  38,  38,  40, 116,  61, 114, 101, 113, 117, 101, 115, // n&&(t=reques\n 116,  65, 110, 105, 109,  97, 116, 105, 111, 110,  70, 114, // tAnimationFr\n  97, 109, 101,  40, 101,  41,  41, 125, 102, 117, 110,  99, // ame(e))}func\n 116, 105, 111, 110,  32, 121, 110,  40, 110,  41, 123, 118, // tion yn(n){v\n  97, 114,  32, 116,  61, 113,  44, 101,  61, 110,  46,  95, // ar t=q,e=n._\n  95,  99,  59,  34, 102, 117, 110,  99, 116, 105, 111, 110, // _c;\"function\n  34,  61,  61, 116, 121, 112, 101, 111, 102,  32, 101,  38, // \"==typeof e&\n  38,  40, 110,  46,  95,  95,  99,  61, 118, 111, 105, 100, // &(n.__c=void\n  32,  48,  44, 101,  40,  41,  41,  44, 113,  61, 116, 125, //  0,e()),q=t}\n 102, 117, 110,  99, 116, 105, 111, 110,  32, 103, 110,  40, // function gn(\n 110,  41, 123, 118,  97, 114,  32, 116,  61, 113,  59, 110, // n){var t=q;n\n  46,  95,  95,  99,  61, 110,  46,  95,  95,  40,  41,  44, // .__c=n.__(),\n 113,  61, 116, 125, 102, 117, 110,  99, 116, 105, 111, 110, // q=t}function\n  32,  98, 110,  40, 110,  44, 116,  41, 123, 114, 101, 116, //  bn(n,t){ret\n 117, 114, 110,  33, 110, 124, 124, 110,  46, 108, 101, 110, // urn!n||n.len\n 103, 116, 104,  33,  61,  61, 116,  46, 108, 101, 110, 103, // gth!==t.leng\n 116, 104, 124, 124, 116,  46, 115, 111, 109, 101,  40,  40, // th||t.some((\n 102, 117, 110,  99, 116, 105, 111, 110,  40, 116,  44, 101, // function(t,e\n  41, 123, 114, 101, 116, 117, 114, 110,  32, 116,  33,  61, // ){return t!=\n  61, 110,  91, 101,  93, 125,  41,  41, 125, 102, 117, 110, // =n[e]}))}fun\n  99, 116, 105, 111, 110,  32, 107, 110,  40, 110,  44, 116, // ction kn(n,t\n  41, 123, 114, 101, 116, 117, 114, 110,  34, 102, 117, 110, // ){return\"fun\n  99, 116, 105, 111, 110,  34,  61,  61, 116, 121, 112, 101, // ction\"==type\n 111, 102,  32, 116,  63, 116,  40, 110,  41,  58, 116, 125, // of t?t(n):t}\n 118,  97, 114,  32,  67, 110,  61, 102, 117, 110,  99, 116, // var Cn=funct\n 105, 111, 110,  40, 110,  44, 116,  44, 101,  44,  95,  41, // ion(n,t,e,_)\n 123, 118,  97, 114,  32, 114,  59, 116,  91,  48,  93,  61, // {var r;t[0]=\n  48,  59, 102, 111, 114,  40, 118,  97, 114,  32, 111,  61, // 0;for(var o=\n  49,  59, 111,  60, 116,  46, 108, 101, 110, 103, 116, 104, // 1;o<t.length\n  59, 111,  43,  43,  41, 123, 118,  97, 114,  32, 105,  61, // ;o++){var i=\n 116,  91, 111,  43,  43,  93,  44, 117,  61, 116,  91, 111, // t[o++],u=t[o\n  93,  63,  40, 116,  91,  48,  93, 124,  61, 105,  63,  49, // ]?(t[0]|=i?1\n  58,  50,  44, 101,  91, 116,  91, 111,  43,  43,  93,  93, // :2,e[t[o++]]\n  41,  58, 116,  91,  43,  43, 111,  93,  59,  51,  61,  61, // ):t[++o];3==\n  61, 105,  63,  95,  91,  48,  93,  61, 117,  58,  52,  61, // =i?_[0]=u:4=\n  61,  61, 105,  63,  95,  91,  49,  93,  61,  79,  98, 106, // ==i?_[1]=Obj\n 101,  99, 116,  46,  97, 115, 115, 105, 103, 110,  40,  95, // ect.assign(_\n  91,  49,  93, 124, 124, 123, 125,  44, 117,  41,  58,  53, // [1]||{},u):5\n  61,  61,  61, 105,  63,  40,  95,  91,  49,  93,  61,  95, // ===i?(_[1]=_\n  91,  49,  93, 124, 124, 123, 125,  41,  91, 116,  91,  43, // [1]||{})[t[+\n  43, 111,  93,  93,  61, 117,  58,  54,  61,  61,  61, 105, // +o]]=u:6===i\n  63,  95,  91,  49,  93,  91, 116,  91,  43,  43, 111,  93, // ?_[1][t[++o]\n  93,  43,  61, 117,  43,  34,  34,  58, 105,  63,  40, 114, // ]+=u+\"\":i?(r\n  61, 110,  46,  97, 112, 112, 108, 121,  40, 117,  44,  67, // =n.apply(u,C\n 110,  40, 110,  44, 117,  44, 101,  44,  91,  34,  34,  44, // n(n,u,e,[\"\",\n 110, 117, 108, 108,  93,  41,  41,  44,  95,  46, 112, 117, // null])),_.pu\n 115, 104,  40, 114,  41,  44, 117,  91,  48,  93,  63, 116, // sh(r),u[0]?t\n  91,  48,  93, 124,  61,  50,  58,  40, 116,  91, 111,  45, // [0]|=2:(t[o-\n  50,  93,  61,  48,  44, 116,  91, 111,  93,  61, 114,  41, // 2]=0,t[o]=r)\n  41,  58,  95,  46, 112, 117, 115, 104,  40, 117,  41, 125, // ):_.push(u)}\n 114, 101, 116, 117, 114, 110,  32,  95, 125,  44, 120, 110, // return _},xn\n  61, 110, 101, 119,  32,  77,  97, 112,  59, 102, 117, 110, // =new Map;fun\n  99, 116, 105, 111, 110,  32,  69, 110,  40, 110,  41, 123, // ction En(n){\n 118,  97, 114,  32, 116,  61, 120, 110,  46, 103, 101, 116, // var t=xn.get\n  40, 116, 104, 105, 115,  41,  59, 114, 101, 116, 117, 114, // (this);retur\n 110,  32, 116, 124, 124,  40, 116,  61, 110, 101, 119,  32, // n t||(t=new \n  77,  97, 112,  44, 120, 110,  46, 115, 101, 116,  40, 116, // Map,xn.set(t\n 104, 105, 115,  44, 116,  41,  41,  44,  40, 116,  61,  67, // his,t)),(t=C\n 110,  40, 116, 104, 105, 115,  44, 116,  46, 103, 101, 116, // n(this,t.get\n  40, 110,  41, 124, 124,  40, 116,  46, 115, 101, 116,  40, // (n)||(t.set(\n 110,  44, 116,  61, 102, 117, 110,  99, 116, 105, 111, 110, // n,t=function\n  40, 110,  41, 123, 102, 111, 114,  40, 118,  97, 114,  32, // (n){for(var \n 116,  44, 101,  44,  95,  61,  49,  44, 114,  61,  34,  34, // t,e,_=1,r=\"\"\n  44, 111,  61,  34,  34,  44, 105,  61,  91,  48,  93,  44, // ,o=\"\",i=[0],\n 117,  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, 110, // u=function(n\n  41, 123,  49,  61,  61,  61,  95,  38,  38,  40, 110, 124, // ){1===_&&(n|\n 124,  40, 114,  61, 114,  46, 114, 101, 112, 108,  97,  99, // |(r=r.replac\n 101,  40,  47,  94,  92, 115,  42,  92, 110,  92, 115,  42, // e(/^.s*.n.s*\n 124,  92, 115,  42,  92, 110,  92, 115,  42,  36,  47, 103, // |.s*.n.s*$/g\n  44,  34,  34,  41,  41,  41,  63, 105,  46, 112, 117, 115, // ,\"\")))?i.pus\n 104,  40,  48,  44, 110,  44, 114,  41,  58,  51,  61,  61, // h(0,n,r):3==\n  61,  95,  38,  38,  40, 110, 124, 124, 114,  41,  63,  40, // =_&&(n||r)?(\n 105,  46, 112, 117, 115, 104,  40,  51,  44, 110,  44, 114, // i.push(3,n,r\n  41,  44,  95,  61,  50,  41,  58,  50,  61,  61,  61,  95, // ),_=2):2===_\n  38,  38,  34,  46,  46,  46,  34,  61,  61,  61, 114,  38, // &&\"...\"===r&\n  38, 110,  63, 105,  46, 112, 117, 115, 104,  40,  52,  44, // &n?i.push(4,\n 110,  44,  48,  41,  58,  50,  61,  61,  61,  95,  38,  38, // n,0):2===_&&\n 114,  38,  38,  33, 110,  63, 105,  46, 112, 117, 115, 104, // r&&!n?i.push\n  40,  53,  44,  48,  44,  33,  48,  44, 114,  41,  58,  95, // (5,0,!0,r):_\n  62,  61,  53,  38,  38,  40,  40, 114, 124, 124,  33, 110, // >=5&&((r||!n\n  38,  38,  53,  61,  61,  61,  95,  41,  38,  38,  40, 105, // &&5===_)&&(i\n  46, 112, 117, 115, 104,  40,  95,  44,  48,  44, 114,  44, // .push(_,0,r,\n 101,  41,  44,  95,  61,  54,  41,  44, 110,  38,  38,  40, // e),_=6),n&&(\n 105,  46, 112, 117, 115, 104,  40,  95,  44, 110,  44,  48, // i.push(_,n,0\n  44, 101,  41,  44,  95,  61,  54,  41,  41,  44, 114,  61, // ,e),_=6)),r=\n  34,  34, 125,  44, 108,  61,  48,  59, 108,  60, 110,  46, // \"\"},l=0;l<n.\n 108, 101, 110, 103, 116, 104,  59, 108,  43,  43,  41, 123, // length;l++){\n 108,  38,  38,  40,  49,  61,  61,  61,  95,  38,  38, 117, // l&&(1===_&&u\n  40,  41,  44, 117,  40, 108,  41,  41,  59, 102, 111, 114, // (),u(l));for\n  40, 118,  97, 114,  32,  99,  61,  48,  59,  99,  60, 110, // (var c=0;c<n\n  91, 108,  93,  46, 108, 101, 110, 103, 116, 104,  59,  99, // [l].length;c\n  43,  43,  41, 116,  61, 110,  91, 108,  93,  91,  99,  93, // ++)t=n[l][c]\n  44,  49,  61,  61,  61,  95,  63,  34,  60,  34,  61,  61, // ,1===_?\"<\"==\n  61, 116,  63,  40, 117,  40,  41,  44, 105,  61,  91, 105, // =t?(u(),i=[i\n  93,  44,  95,  61,  51,  41,  58, 114,  43,  61, 116,  58, // ],_=3):r+=t:\n  52,  61,  61,  61,  95,  63,  34,  45,  45,  34,  61,  61, // 4===_?\"--\"==\n  61, 114,  38,  38,  34,  62,  34,  61,  61,  61, 116,  63, // =r&&\">\"===t?\n  40,  95,  61,  49,  44, 114,  61,  34,  34,  41,  58, 114, // (_=1,r=\"\"):r\n  61, 116,  43, 114,  91,  48,  93,  58, 111,  63, 116,  61, // =t+r[0]:o?t=\n  61,  61, 111,  63, 111,  61,  34,  34,  58, 114,  43,  61, // ==o?o=\"\":r+=\n 116,  58,  39,  34,  39,  61,  61,  61, 116, 124, 124,  34, // t:'\"'===t||\"\n  39,  34,  61,  61,  61, 116,  63, 111,  61, 116,  58,  34, // '\"===t?o=t:\"\n  62,  34,  61,  61,  61, 116,  63,  40, 117,  40,  41,  44, // >\"===t?(u(),\n  95,  61,  49,  41,  58,  95,  38,  38,  40,  34,  61,  34, // _=1):_&&(\"=\"\n  61,  61,  61, 116,  63,  40,  95,  61,  53,  44, 101,  61, // ===t?(_=5,e=\n 114,  44, 114,  61,  34,  34,  41,  58,  34,  47,  34,  61, // r,r=\"\"):\"/\"=\n  61,  61, 116,  38,  38,  40,  95,  60,  53, 124, 124,  34, // ==t&&(_<5||\"\n  62,  34,  61,  61,  61, 110,  91, 108,  93,  91,  99,  43, // >\"===n[l][c+\n  49,  93,  41,  63,  40, 117,  40,  41,  44,  51,  61,  61, // 1])?(u(),3==\n  61,  95,  38,  38,  40, 105,  61, 105,  91,  48,  93,  41, // =_&&(i=i[0])\n  44,  95,  61, 105,  44,  40, 105,  61, 105,  91,  48,  93, // ,_=i,(i=i[0]\n  41,  46, 112, 117, 115, 104,  40,  50,  44,  48,  44,  95, // ).push(2,0,_\n  41,  44,  95,  61,  48,  41,  58,  34,  32,  34,  61,  61, // ),_=0):\" \"==\n  61, 116, 124, 124,  34,  92, 116,  34,  61,  61,  61, 116, // =t||\".t\"===t\n 124, 124,  34,  92, 110,  34,  61,  61,  61, 116, 124, 124, // ||\".n\"===t||\n  34,  92, 114,  34,  61,  61,  61, 116,  63,  40, 117,  40, // \".r\"===t?(u(\n  41,  44,  95,  61,  50,  41,  58, 114,  43,  61, 116,  41, // ),_=2):r+=t)\n  44,  51,  61,  61,  61,  95,  38,  38,  34,  33,  45,  45, // ,3===_&&\"!--\n  34,  61,  61,  61, 114,  38,  38,  40,  95,  61,  52,  44, // \"===r&&(_=4,\n 105,  61, 105,  91,  48,  93,  41, 125, 114, 101, 116, 117, // i=i[0])}retu\n 114, 110,  32, 117,  40,  41,  44, 105, 125,  40, 110,  41, // rn u(),i}(n)\n  41,  44, 116,  41,  44,  97, 114, 103, 117, 109, 101, 110, // ),t),argumen\n 116, 115,  44,  91,  93,  41,  41,  46, 108, 101, 110, 103, // ts,[])).leng\n 116, 104,  62,  49,  63, 116,  58, 116,  91,  48,  93, 125, // th>1?t:t[0]}\n 118,  97, 114,  32,  72, 110,  61,  69, 110,  46,  98, 105, // var Hn=En.bi\n 110, 100,  40, 104,  41,  59, 118,  97, 114,  32,  85, 110, // nd(h);var Un\n  61, 123, 125,  59, 102, 117, 110,  99, 116, 105, 111, 110, // ={};function\n  32,  65, 110,  40, 110,  44, 116,  41, 123, 102, 111, 114, //  An(n,t){for\n  40, 118,  97, 114,  32, 101,  32, 105, 110,  32, 116,  41, // (var e in t)\n 110,  91, 101,  93,  61, 116,  91, 101,  93,  59, 114, 101, // n[e]=t[e];re\n 116, 117, 114, 110,  32, 110, 125, 102, 117, 110,  99, 116, // turn n}funct\n 105, 111, 110,  32,  80, 110,  40, 110,  44, 116,  44, 101, // ion Pn(n,t,e\n  41, 123, 118,  97, 114,  32,  95,  44, 114,  61,  47,  40, // ){var _,r=/(\n  63,  58,  92,  63,  40,  91,  94,  35,  93,  42,  41,  41, // ?:.?([^#]*))\n  63,  40,  35,  46,  42,  41,  63,  36,  47,  44, 111,  61, // ?(#.*)?$/,o=\n 110,  46, 109,  97, 116,  99, 104,  40, 114,  41,  44, 105, // n.match(r),i\n  61, 123, 125,  59, 105, 102,  40, 111,  38,  38, 111,  91, // ={};if(o&&o[\n  49,  93,  41, 102, 111, 114,  40, 118,  97, 114,  32, 117, // 1])for(var u\n  61, 111,  91,  49,  93,  46, 115, 112, 108, 105, 116,  40, // =o[1].split(\n  34,  38,  34,  41,  44, 108,  61,  48,  59, 108,  60, 117, // \"&\"),l=0;l<u\n  46, 108, 101, 110, 103, 116, 104,  59, 108,  43,  43,  41, // .length;l++)\n 123, 118,  97, 114,  32,  99,  61, 117,  91, 108,  93,  46, // {var c=u[l].\n 115, 112, 108, 105, 116,  40,  34,  61,  34,  41,  59, 105, // split(\"=\");i\n  91, 100, 101,  99, 111, 100, 101,  85,  82,  73,  67, 111, // [decodeURICo\n 109, 112, 111, 110, 101, 110, 116,  40,  99,  91,  48,  93, // mponent(c[0]\n  41,  93,  61, 100, 101,  99, 111, 100, 101,  85,  82,  73, // )]=decodeURI\n  67, 111, 109, 112, 111, 110, 101, 110, 116,  40,  99,  46, // Component(c.\n 115, 108, 105,  99, 101,  40,  49,  41,  46, 106, 111, 105, // slice(1).joi\n 110,  40,  34,  61,  34,  41,  41, 125, 110,  61, 119, 110, // n(\"=\"))}n=wn\n  40, 110,  46, 114, 101, 112, 108,  97,  99, 101,  40, 114, // (n.replace(r\n  44,  34,  34,  41,  41,  44, 116,  61, 119, 110,  40, 116, // ,\"\")),t=wn(t\n 124, 124,  34,  34,  41,  59, 102, 111, 114,  40, 118,  97, // ||\"\");for(va\n 114,  32,  97,  61,  77,  97, 116, 104,  46, 109,  97, 120, // r a=Math.max\n  40, 110,  46, 108, 101, 110, 103, 116, 104,  44, 116,  46, // (n.length,t.\n 108, 101, 110, 103, 116, 104,  41,  44, 115,  61,  48,  59, // length),s=0;\n 115,  60,  97,  59, 115,  43,  43,  41, 105, 102,  40, 116, // s<a;s++)if(t\n  91, 115,  93,  38,  38,  34,  58,  34,  61,  61,  61, 116, // [s]&&\":\"===t\n  91, 115,  93,  46,  99, 104,  97, 114,  65, 116,  40,  48, // [s].charAt(0\n  41,  41, 123, 118,  97, 114,  32, 102,  61, 116,  91, 115, // )){var f=t[s\n  93,  46, 114, 101, 112, 108,  97,  99, 101,  40,  47,  40, // ].replace(/(\n  94,  58, 124,  91,  43,  42,  63,  93,  43,  36,  41,  47, // ^:|[+*?]+$)/\n 103,  44,  34,  34,  41,  44, 112,  61,  40, 116,  91, 115, // g,\"\"),p=(t[s\n  93,  46, 109,  97, 116,  99, 104,  40,  47,  91,  43,  42, // ].match(/[+*\n  63,  93,  43,  36,  47,  41, 124, 124,  85, 110,  41,  91, // ?]+$/)||Un)[\n  48,  93, 124, 124,  34,  34,  44, 104,  61, 126, 112,  46, // 0]||\"\",h=~p.\n 105, 110, 100, 101, 120,  79, 102,  40,  34,  43,  34,  41, // indexOf(\"+\")\n  44, 100,  61, 126, 112,  46, 105, 110, 100, 101, 120,  79, // ,d=~p.indexO\n 102,  40,  34,  42,  34,  41,  44, 118,  61, 110,  91, 115, // f(\"*\"),v=n[s\n  93, 124, 124,  34,  34,  59, 105, 102,  40,  33, 118,  38, // ]||\"\";if(!v&\n  38,  33, 100,  38,  38,  40, 112,  46, 105, 110, 100, 101, // &!d&&(p.inde\n 120,  79, 102,  40,  34,  63,  34,  41,  60,  48, 124, 124, // xOf(\"?\")<0||\n 104,  41,  41, 123,  95,  61,  33,  49,  59,  98, 114, 101, // h)){_=!1;bre\n  97, 107, 125, 105, 102,  40, 105,  91, 102,  93,  61, 100, // ak}if(i[f]=d\n 101,  99, 111, 100, 101,  85,  82,  73,  67, 111, 109, 112, // ecodeURIComp\n 111, 110, 101, 110, 116,  40, 118,  41,  44, 104, 124, 124, // onent(v),h||\n 100,  41, 123, 105,  91, 102,  93,  61, 110,  46, 115, 108, // d){i[f]=n.sl\n 105,  99, 101,  40, 115,  41,  46, 109,  97, 112,  40, 100, // ice(s).map(d\n 101,  99, 111, 100, 101,  85,  82,  73,  67, 111, 109, 112, // ecodeURIComp\n 111, 110, 101, 110, 116,  41,  46, 106, 111, 105, 110,  40, // onent).join(\n  34,  47,  34,  41,  59,  98, 114, 101,  97, 107, 125, 125, // \"/\");break}}\n 101, 108, 115, 101,  32, 105, 102,  40, 116,  91, 115,  93, // else if(t[s]\n  33,  61,  61, 110,  91, 115,  93,  41, 123,  95,  61,  33, // !==n[s]){_=!\n  49,  59,  98, 114, 101,  97, 107, 125, 114, 101, 116, 117, // 1;break}retu\n 114, 110,  40,  33,  48,  61,  61,  61, 101,  46, 100, 101, // rn(!0===e.de\n 102,  97, 117, 108, 116, 124, 124,  33,  49,  33,  61,  61, // fault||!1!==\n  95,  41,  38,  38, 105, 125, 102, 117, 110,  99, 116, 105, // _)&&i}functi\n 111, 110,  32,  83, 110,  40, 110,  44, 116,  41, 123, 114, // on Sn(n,t){r\n 101, 116, 117, 114, 110,  32, 110,  46, 114,  97, 110, 107, // eturn n.rank\n  60, 116,  46, 114,  97, 110, 107,  63,  49,  58, 110,  46, // <t.rank?1:n.\n 114,  97, 110, 107,  62, 116,  46, 114,  97, 110, 107,  63, // rank>t.rank?\n  45,  49,  58, 110,  46, 105, 110, 100, 101, 120,  45, 116, // -1:n.index-t\n  46, 105, 110, 100, 101, 120, 125, 102, 117, 110,  99, 116, // .index}funct\n 105, 111, 110,  32,  78, 110,  40, 110,  44, 116,  41, 123, // ion Nn(n,t){\n 114, 101, 116, 117, 114, 110,  32, 110,  46, 105, 110, 100, // return n.ind\n 101, 120,  61, 116,  44, 110,  46, 114,  97, 110, 107,  61, // ex=t,n.rank=\n 102, 117, 110,  99, 116, 105, 111, 110,  40, 110,  41, 123, // function(n){\n 114, 101, 116, 117, 114, 110,  32, 110,  46, 112, 114, 111, // return n.pro\n 112, 115,  46, 100, 101, 102,  97, 117, 108, 116,  63,  48, // ps.default?0\n  58, 119, 110,  40, 110,  46, 112, 114, 111, 112, 115,  46, // :wn(n.props.\n 112,  97, 116, 104,  41,  46, 109,  97, 112,  40,  68, 110, // path).map(Dn\n  41,  46, 106, 111, 105, 110,  40,  34,  34,  41, 125,  40, // ).join(\"\")}(\n 110,  41,  44, 110,  46, 112, 114, 111, 112, 115, 125, 102, // n),n.props}f\n 117, 110,  99, 116, 105, 111, 110,  32, 119, 110,  40, 110, // unction wn(n\n  41, 123, 114, 101, 116, 117, 114, 110,  32, 110,  46, 114, // ){return n.r\n 101, 112, 108,  97,  99, 101,  40,  47,  40,  94,  92,  47, // eplace(/(^./\n  43, 124,  92,  47,  43,  36,  41,  47, 103,  44,  34,  34, // +|./+$)/g,\"\"\n  41,  46, 115, 112, 108, 105, 116,  40,  34,  47,  34,  41, // ).split(\"/\")\n 125, 102, 117, 110,  99, 116, 105, 111, 110,  32,  68, 110, // }function Dn\n  40, 110,  41, 123, 114, 101, 116, 117, 114, 110,  34,  58, // (n){return\":\n  34,  61,  61, 110,  46,  99, 104,  97, 114,  65, 116,  40, // \"==n.charAt(\n  48,  41,  63,  49,  43,  34,  42,  43,  63,  34,  46, 105, // 0)?1+\"*+?\".i\n 110, 100, 101, 120,  79, 102,  40, 110,  46,  99, 104,  97, // ndexOf(n.cha\n 114,  65, 116,  40, 110,  46, 108, 101, 110, 103, 116, 104, // rAt(n.length\n  45,  49,  41,  41, 124, 124,  52,  58,  53, 125, 118,  97, // -1))||4:5}va\n 114,  32,  84, 110,  61, 123, 125,  44,  82, 110,  61,  91, // r Tn={},Rn=[\n  93,  44,  76, 110,  61,  91,  93,  44,  77, 110,  61, 110, // ],Ln=[],Mn=n\n 117, 108, 108,  44,  87, 110,  61, 123, 117, 114, 108,  58, // ull,Wn={url:\n  73, 110,  40,  41, 125,  44,  86, 110,  61,  36,  40,  87, // In()},Vn=$(W\n 110,  41,  59, 102, 117, 110,  99, 116, 105, 111, 110,  32, // n);function \n  70, 110,  40,  41, 123, 118,  97, 114,  32, 110,  61, 115, // Fn(){var n=s\n 110,  40,  86, 110,  41,  59, 105, 102,  40, 110,  61,  61, // n(Vn);if(n==\n  61,  87, 110,  41, 123, 118,  97, 114,  32, 116,  61, 101, // =Wn){var t=e\n 110,  40,  41,  91,  49,  93,  59, 114, 110,  40,  40, 102, // n()[1];rn((f\n 117, 110,  99, 116, 105, 111, 110,  40,  41, 123, 114, 101, // unction(){re\n 116, 117, 114, 110,  32,  76, 110,  46, 112, 117, 115, 104, // turn Ln.push\n  40, 116,  41,  44, 102, 117, 110,  99, 116, 105, 111, 110, // (t),function\n  40,  41, 123, 114, 101, 116, 117, 114, 110,  32,  76, 110, // (){return Ln\n  46, 115, 112, 108, 105,  99, 101,  40,  76, 110,  46, 105, // .splice(Ln.i\n 110, 100, 101, 120,  79, 102,  40, 116,  41,  44,  49,  41, // ndexOf(t),1)\n 125, 125,  41,  44,  91,  93,  41, 125, 114, 101, 116, 117, // }}),[])}retu\n 114, 110,  91, 110,  44,  79, 110,  93, 125, 102, 117, 110, // rn[n,On]}fun\n  99, 116, 105, 111, 110,  32,  73, 110,  40,  41, 123, 118, // ction In(){v\n  97, 114,  32, 110,  59, 114, 101, 116, 117, 114, 110,  34, // ar n;return\"\n  34,  43,  40,  40, 110,  61,  77, 110,  38,  38,  77, 110, // \"+((n=Mn&&Mn\n  46, 108, 111,  99,  97, 116, 105, 111, 110,  63,  77, 110, // .location?Mn\n  46, 108, 111,  99,  97, 116, 105, 111, 110,  58,  77, 110, // .location:Mn\n  38,  38,  77, 110,  46, 103, 101, 116,  67, 117, 114, 114, // &&Mn.getCurr\n 101, 110, 116,  76, 111,  99,  97, 116, 105, 111, 110,  63, // entLocation?\n  77, 110,  46, 103, 101, 116,  67, 117, 114, 114, 101, 110, // Mn.getCurren\n 116,  76, 111,  99,  97, 116, 105, 111, 110,  40,  41,  58, // tLocation():\n  34, 117, 110, 100, 101, 102, 105, 110, 101, 100,  34,  33, // \"undefined\"!\n  61, 116, 121, 112, 101, 111, 102,  32, 108, 111,  99,  97, // =typeof loca\n 116, 105, 111, 110,  63, 108, 111,  99,  97, 116, 105, 111, // tion?locatio\n 110,  58,  84, 110,  41,  46, 112,  97, 116, 104, 110,  97, // n:Tn).pathna\n 109, 101, 124, 124,  34,  34,  41,  43,  40, 110,  46, 115, // me||\"\")+(n.s\n 101,  97, 114,  99, 104, 124, 124,  34,  34,  41, 125, 102, // earch||\"\")}f\n 117, 110,  99, 116, 105, 111, 110,  32,  79, 110,  40, 110, // unction On(n\n  44, 116,  41, 123, 114, 101, 116, 117, 114, 110,  32, 118, // ,t){return v\n 111, 105, 100,  32,  48,  61,  61,  61, 116,  38,  38,  40, // oid 0===t&&(\n 116,  61,  33,  49,  41,  44,  34, 115, 116, 114, 105, 110, // t=!1),\"strin\n 103,  34,  33,  61, 116, 121, 112, 101, 111, 102,  32, 110, // g\"!=typeof n\n  38,  38, 110,  46, 117, 114, 108,  38,  38,  40, 116,  61, // &&n.url&&(t=\n 110,  46, 114, 101, 112, 108,  97,  99, 101,  44, 110,  61, // n.replace,n=\n 110,  46, 117, 114, 108,  41,  44, 102, 117, 110,  99, 116, // n.url),funct\n 105, 111, 110,  40, 110,  41, 123, 102, 111, 114,  40, 118, // ion(n){for(v\n  97, 114,  32, 116,  61,  82, 110,  46, 108, 101, 110, 103, // ar t=Rn.leng\n 116, 104,  59, 116,  45,  45,  59,  41, 105, 102,  40,  82, // th;t--;)if(R\n 110,  91, 116,  93,  46,  99,  97, 110,  82, 111, 117, 116, // n[t].canRout\n 101,  40, 110,  41,  41, 114, 101, 116, 117, 114, 110,  33, // e(n))return!\n  48,  59, 114, 101, 116, 117, 114, 110,  33,  49, 125,  40, // 0;return!1}(\n 110,  41,  38,  38, 102, 117, 110,  99, 116, 105, 111, 110, // n)&&function\n  40, 110,  44, 116,  41, 123, 118, 111, 105, 100,  32,  48, // (n,t){void 0\n  61,  61,  61, 116,  38,  38,  40, 116,  61,  34, 112, 117, // ===t&&(t=\"pu\n 115, 104,  34,  41,  44,  77, 110,  38,  38,  77, 110,  91, // sh\"),Mn&&Mn[\n 116,  93,  63,  77, 110,  91, 116,  93,  40, 110,  41,  58, // t]?Mn[t](n):\n  34, 117, 110, 100, 101, 102, 105, 110, 101, 100,  34,  33, // \"undefined\"!\n  61, 116, 121, 112, 101, 111, 102,  32, 104, 105, 115, 116, // =typeof hist\n 111, 114, 121,  38,  38, 104, 105, 115, 116, 111, 114, 121, // ory&&history\n  91, 116,  43,  34,  83, 116,  97, 116, 101,  34,  93,  38, // [t+\"State\"]&\n  38, 104, 105, 115, 116, 111, 114, 121,  91, 116,  43,  34, // &history[t+\"\n  83, 116,  97, 116, 101,  34,  93,  40, 110, 117, 108, 108, // State\"](null\n  44, 110, 117, 108, 108,  44, 110,  41, 125,  40, 110,  44, // ,null,n)}(n,\n 116,  63,  34, 114, 101, 112, 108,  97,  99, 101,  34,  58, // t?\"replace\":\n  34, 112, 117, 115, 104,  34,  41,  44,  36, 110,  40, 110, // \"push\"),$n(n\n  41, 125, 102, 117, 110,  99, 116, 105, 111, 110,  32,  36, // )}function $\n 110,  40, 110,  41, 123, 102, 111, 114,  40, 118,  97, 114, // n(n){for(var\n  32, 116,  61,  33,  49,  44, 101,  61,  48,  59, 101,  60, //  t=!1,e=0;e<\n  82, 110,  46, 108, 101, 110, 103, 116, 104,  59, 101,  43, // Rn.length;e+\n  43,  41,  82, 110,  91, 101,  93,  46, 114, 111, 117, 116, // +)Rn[e].rout\n 101,  84, 111,  40, 110,  41,  38,  38,  40, 116,  61,  33, // eTo(n)&&(t=!\n  48,  41,  59, 114, 101, 116, 117, 114, 110,  32, 116, 125, // 0);return t}\n 102, 117, 110,  99, 116, 105, 111, 110,  32, 106, 110,  40, // function jn(\n 110,  41, 123, 105, 102,  40, 110,  38,  38, 110,  46, 103, // n){if(n&&n.g\n 101, 116,  65, 116, 116, 114, 105,  98, 117, 116, 101,  41, // etAttribute)\n 123, 118,  97, 114,  32, 116,  61, 110,  46, 103, 101, 116, // {var t=n.get\n  65, 116, 116, 114, 105,  98, 117, 116, 101,  40,  34, 104, // Attribute(\"h\n 114, 101, 102,  34,  41,  44, 101,  61, 110,  46, 103, 101, // ref\"),e=n.ge\n 116,  65, 116, 116, 114, 105,  98, 117, 116, 101,  40,  34, // tAttribute(\"\n 116,  97, 114, 103, 101, 116,  34,  41,  59, 105, 102,  40, // target\");if(\n 116,  38,  38, 116,  46, 109,  97, 116,  99, 104,  40,  47, // t&&t.match(/\n  94,  92,  47,  47, 103,  41,  38,  38,  40,  33, 101, 124, // ^.//g)&&(!e|\n 124, 101,  46, 109,  97, 116,  99, 104,  40,  47,  94,  95, // |e.match(/^_\n  63, 115, 101, 108, 102,  36,  47, 105,  41,  41,  41, 114, // ?self$/i)))r\n 101, 116, 117, 114, 110,  32,  79, 110,  40, 116,  41, 125, // eturn On(t)}\n 125, 102, 117, 110,  99, 116, 105, 111, 110,  32, 113, 110, // }function qn\n  40, 110,  41, 123, 114, 101, 116, 117, 114, 110,  32, 110, // (n){return n\n  46, 115, 116, 111, 112,  73, 109, 109, 101, 100, 105,  97, // .stopImmedia\n 116, 101,  80, 114, 111, 112,  97, 103,  97, 116, 105, 111, // tePropagatio\n 110,  38,  38, 110,  46, 115, 116, 111, 112,  73, 109, 109, // n&&n.stopImm\n 101, 100, 105,  97, 116, 101,  80, 114, 111, 112,  97, 103, // ediatePropag\n  97, 116, 105, 111, 110,  40,  41,  44, 110,  46, 115, 116, // ation(),n.st\n 111, 112,  80, 114, 111, 112,  97, 103,  97, 116, 105, 111, // opPropagatio\n 110,  38,  38, 110,  46, 115, 116, 111, 112,  80, 114, 111, // n&&n.stopPro\n 112,  97, 103,  97, 116, 105, 111, 110,  40,  41,  44, 110, // pagation(),n\n  46, 112, 114, 101, 118, 101, 110, 116,  68, 101, 102,  97, // .preventDefa\n 117, 108, 116,  40,  41,  44,  33,  49, 125, 102, 117, 110, // ult(),!1}fun\n  99, 116, 105, 111, 110,  32,  66, 110,  40, 110,  41, 123, // ction Bn(n){\n 105, 102,  40,  33,  40, 110,  46,  99, 116, 114, 108,  75, // if(!(n.ctrlK\n 101, 121, 124, 124, 110,  46, 109, 101, 116,  97,  75, 101, // ey||n.metaKe\n 121, 124, 124, 110,  46,  97, 108, 116,  75, 101, 121, 124, // y||n.altKey|\n 124, 110,  46, 115, 104, 105, 102, 116,  75, 101, 121, 124, // |n.shiftKey|\n 124, 110,  46,  98, 117, 116, 116, 111, 110,  41,  41, 123, // |n.button)){\n 118,  97, 114,  32, 116,  61, 110,  46, 116,  97, 114, 103, // var t=n.targ\n 101, 116,  59, 100, 111, 123, 105, 102,  40,  34,  97,  34, // et;do{if(\"a\"\n  61,  61,  61, 116,  46, 108, 111,  99,  97, 108,  78,  97, // ===t.localNa\n 109, 101,  38,  38, 116,  46, 103, 101, 116,  65, 116, 116, // me&&t.getAtt\n 114, 105,  98, 117, 116, 101,  40,  34, 104, 114, 101, 102, // ribute(\"href\n  34,  41,  41, 123, 105, 102,  40, 116,  46, 104,  97, 115, // \")){if(t.has\n  65, 116, 116, 114, 105,  98, 117, 116, 101,  40,  34, 100, // Attribute(\"d\n  97, 116,  97,  45, 110,  97, 116, 105, 118, 101,  34,  41, // ata-native\")\n 124, 124, 116,  46, 104,  97, 115,  65, 116, 116, 114, 105, // ||t.hasAttri\n  98, 117, 116, 101,  40,  34, 110,  97, 116, 105, 118, 101, // bute(\"native\n  34,  41,  41, 114, 101, 116, 117, 114, 110,  59, 105, 102, // \"))return;if\n  40, 106, 110,  40, 116,  41,  41, 114, 101, 116, 117, 114, // (jn(t))retur\n 110,  32, 113, 110,  40, 110,  41, 125, 125, 119, 104, 105, // n qn(n)}}whi\n 108, 101,  40, 116,  61, 116,  46, 112,  97, 114, 101, 110, // le(t=t.paren\n 116,  78, 111, 100, 101,  41, 125, 125, 118,  97, 114,  32, // tNode)}}var \n  75, 110,  61,  33,  49,  59, 102, 117, 110,  99, 116, 105, // Kn=!1;functi\n 111, 110,  32,  71, 110,  40, 110,  41, 123, 110,  46, 104, // on Gn(n){n.h\n 105, 115, 116, 111, 114, 121,  38,  38,  40,  77, 110,  61, // istory&&(Mn=\n 110,  46, 104, 105, 115, 116, 111, 114, 121,  41,  44, 116, // n.history),t\n 104, 105, 115,  46, 115, 116,  97, 116, 101,  61, 123, 117, // his.state={u\n 114, 108,  58, 110,  46, 117, 114, 108, 124, 124,  73, 110, // rl:n.url||In\n  40,  41, 125, 125,  65, 110,  40,  71, 110,  46, 112, 114, // ()}}An(Gn.pr\n 111, 116, 111, 116, 121, 112, 101,  61, 110, 101, 119,  32, // ototype=new \n 121,  44, 123, 115, 104, 111, 117, 108, 100,  67, 111, 109, // y,{shouldCom\n 112, 111, 110, 101, 110, 116,  85, 112, 100,  97, 116, 101, // ponentUpdate\n  58, 102, 117, 110,  99, 116, 105, 111, 110,  40, 110,  41, // :function(n)\n 123, 114, 101, 116, 117, 114, 110,  33,  48,  33,  61,  61, // {return!0!==\n 110,  46, 115, 116,  97, 116, 105,  99, 124, 124, 110,  46, // n.static||n.\n 117, 114, 108,  33,  61,  61, 116, 104, 105, 115,  46, 112, // url!==this.p\n 114, 111, 112, 115,  46, 117, 114, 108, 124, 124, 110,  46, // rops.url||n.\n 111, 110,  67, 104,  97, 110, 103, 101,  33,  61,  61, 116, // onChange!==t\n 104, 105, 115,  46, 112, 114, 111, 112, 115,  46, 111, 110, // his.props.on\n  67, 104,  97, 110, 103, 101, 125,  44,  99,  97, 110,  82, // Change},canR\n 111, 117, 116, 101,  58, 102, 117, 110,  99, 116, 105, 111, // oute:functio\n 110,  40, 110,  41, 123, 118,  97, 114,  32, 116,  61,  72, // n(n){var t=H\n  40, 116, 104, 105, 115,  46, 112, 114, 111, 112, 115,  46, // (this.props.\n  99, 104, 105, 108, 100, 114, 101, 110,  41,  59, 114, 101, // children);re\n 116, 117, 114, 110,  32, 118, 111, 105, 100,  32,  48,  33, // turn void 0!\n  61,  61, 116, 104, 105, 115,  46, 103,  40, 116,  44, 110, // ==this.g(t,n\n  41, 125,  44, 114, 111, 117, 116, 101,  84, 111,  58, 102, // )},routeTo:f\n 117, 110,  99, 116, 105, 111, 110,  40, 110,  41, 123, 116, // unction(n){t\n 104, 105, 115,  46, 115, 101, 116,  83, 116,  97, 116, 101, // his.setState\n  40, 123, 117, 114, 108,  58, 110, 125,  41,  59, 118,  97, // ({url:n});va\n 114,  32, 116,  61, 116, 104, 105, 115,  46,  99,  97, 110, // r t=this.can\n  82, 111, 117, 116, 101,  40, 110,  41,  59, 114, 101, 116, // Route(n);ret\n 117, 114, 110,  32, 116, 104, 105, 115,  46, 112, 124, 124, // urn this.p||\n 116, 104, 105, 115,  46, 102, 111, 114,  99, 101,  85, 112, // this.forceUp\n 100,  97, 116, 101,  40,  41,  44, 116, 125,  44,  99, 111, // date(),t},co\n 109, 112, 111, 110, 101, 110, 116,  87, 105, 108, 108,  77, // mponentWillM\n 111, 117, 110, 116,  58, 102, 117, 110,  99, 116, 105, 111, // ount:functio\n 110,  40,  41, 123, 116, 104, 105, 115,  46, 112,  61,  33, // n(){this.p=!\n  48, 125,  44,  99, 111, 109, 112, 111, 110, 101, 110, 116, // 0},component\n  68, 105, 100,  77, 111, 117, 110, 116,  58, 102, 117, 110, // DidMount:fun\n  99, 116, 105, 111, 110,  40,  41, 123, 118,  97, 114,  32, // ction(){var \n 110,  61, 116, 104, 105, 115,  59,  75, 110, 124, 124,  40, // n=this;Kn||(\n  75, 110,  61,  33,  48,  44,  77, 110, 124, 124,  97, 100, // Kn=!0,Mn||ad\n 100,  69, 118, 101, 110, 116,  76, 105, 115, 116, 101, 110, // dEventListen\n 101, 114,  40,  34, 112, 111, 112, 115, 116,  97, 116, 101, // er(\"popstate\n  34,  44,  40, 102, 117, 110,  99, 116, 105, 111, 110,  40, // \",(function(\n  41, 123,  36, 110,  40,  73, 110,  40,  41,  41, 125,  41, // ){$n(In())})\n  41,  44,  97, 100, 100,  69, 118, 101, 110, 116,  76, 105, // ),addEventLi\n 115, 116, 101, 110, 101, 114,  40,  34,  99, 108, 105,  99, // stener(\"clic\n 107,  34,  44,  66, 110,  41,  41,  44,  82, 110,  46, 112, // k\",Bn)),Rn.p\n 117, 115, 104,  40, 116, 104, 105, 115,  41,  44,  77, 110, // ush(this),Mn\n  38,  38,  40, 116, 104, 105, 115,  46, 117,  61,  77, 110, // &&(this.u=Mn\n  46, 108, 105, 115, 116, 101, 110,  40,  40, 102, 117, 110, // .listen((fun\n  99, 116, 105, 111, 110,  40, 116,  41, 123, 118,  97, 114, // ction(t){var\n  32, 101,  61, 116,  46, 108, 111,  99,  97, 116, 105, 111, //  e=t.locatio\n 110, 124, 124, 116,  59, 110,  46, 114, 111, 117, 116, 101, // n||t;n.route\n  84, 111,  40,  34,  34,  43,  40, 101,  46, 112,  97, 116, // To(\"\"+(e.pat\n 104, 110,  97, 109, 101, 124, 124,  34,  34,  41,  43,  40, // hname||\"\")+(\n 101,  46, 115, 101,  97, 114,  99, 104, 124, 124,  34,  34, // e.search||\"\"\n  41,  41, 125,  41,  41,  41,  44, 116, 104, 105, 115,  46, // ))}))),this.\n 112,  61,  33,  49, 125,  44,  99, 111, 109, 112, 111, 110, // p=!1},compon\n 101, 110, 116,  87, 105, 108, 108,  85, 110, 109, 111, 117, // entWillUnmou\n 110, 116,  58, 102, 117, 110,  99, 116, 105, 111, 110,  40, // nt:function(\n  41, 123,  34, 102, 117, 110,  99, 116, 105, 111, 110,  34, // ){\"function\"\n  61,  61, 116, 121, 112, 101, 111, 102,  32, 116, 104, 105, // ==typeof thi\n 115,  46, 117,  38,  38, 116, 104, 105, 115,  46, 117,  40, // s.u&&this.u(\n  41,  44,  82, 110,  46, 115, 112, 108, 105,  99, 101,  40, // ),Rn.splice(\n  82, 110,  46, 105, 110, 100, 101, 120,  79, 102,  40, 116, // Rn.indexOf(t\n 104, 105, 115,  41,  44,  49,  41, 125,  44,  99, 111, 109, // his),1)},com\n 112, 111, 110, 101, 110, 116,  87, 105, 108, 108,  85, 112, // ponentWillUp\n 100,  97, 116, 101,  58, 102, 117, 110,  99, 116, 105, 111, // date:functio\n 110,  40,  41, 123, 116, 104, 105, 115,  46, 112,  61,  33, // n(){this.p=!\n  48, 125,  44,  99, 111, 109, 112, 111, 110, 101, 110, 116, // 0},component\n  68, 105, 100,  85, 112, 100,  97, 116, 101,  58, 102, 117, // DidUpdate:fu\n 110,  99, 116, 105, 111, 110,  40,  41, 123, 116, 104, 105, // nction(){thi\n 115,  46, 112,  61,  33,  49, 125,  44, 103,  58, 102, 117, // s.p=!1},g:fu\n 110,  99, 116, 105, 111, 110,  40, 110,  44, 116,  41, 123, // nction(n,t){\n 110,  61, 110,  46, 102, 105, 108, 116, 101, 114,  40,  78, // n=n.filter(N\n 110,  41,  46, 115, 111, 114, 116,  40,  83, 110,  41,  59, // n).sort(Sn);\n 102, 111, 114,  40, 118,  97, 114,  32, 101,  61,  48,  59, // for(var e=0;\n 101,  60, 110,  46, 108, 101, 110, 103, 116, 104,  59, 101, // e<n.length;e\n  43,  43,  41, 123, 118,  97, 114,  32,  95,  61, 110,  91, // ++){var _=n[\n 101,  93,  44, 114,  61,  80, 110,  40, 116,  44,  95,  46, // e],r=Pn(t,_.\n 112, 114, 111, 112, 115,  46, 112,  97, 116, 104,  44,  95, // props.path,_\n  46, 112, 114, 111, 112, 115,  41,  59, 105, 102,  40, 114, // .props);if(r\n  41, 114, 101, 116, 117, 114, 110,  91,  95,  44, 114,  93, // )return[_,r]\n 125, 125,  44, 114, 101, 110, 100, 101, 114,  58, 102, 117, // }},render:fu\n 110,  99, 116, 105, 111, 110,  40, 110,  44, 116,  41, 123, // nction(n,t){\n 118,  97, 114,  32, 101,  44,  95,  44, 114,  61, 110,  46, // var e,_,r=n.\n 111, 110,  67, 104,  97, 110, 103, 101,  44, 111,  61, 116, // onChange,o=t\n  46, 117, 114, 108,  44, 105,  61, 116, 104, 105, 115,  46, // .url,i=this.\n  99,  44, 117,  61, 116, 104, 105, 115,  46, 103,  40,  72, // c,u=this.g(H\n  40, 110,  46,  99, 104, 105, 108, 100, 114, 101, 110,  41, // (n.children)\n  44, 111,  41,  59, 105, 102,  40, 117,  38,  38,  40,  95, // ,o);if(u&&(_\n  61,  79,  40, 117,  91,  48,  93,  44,  65, 110,  40,  65, // =O(u[0],An(A\n 110,  40, 123, 117, 114, 108,  58, 111,  44, 109,  97, 116, // n({url:o,mat\n  99, 104, 101, 115,  58, 101,  61, 117,  91,  49,  93, 125, // ches:e=u[1]}\n  44, 101,  41,  44, 123, 107, 101, 121,  58, 118, 111, 105, // ,e),{key:voi\n 100,  32,  48,  44, 114, 101, 102,  58, 118, 111, 105, 100, // d 0,ref:void\n  32,  48, 125,  41,  41,  41,  44, 111,  33,  61,  61,  40, //  0}))),o!==(\n 105,  38,  38, 105,  46, 117, 114, 108,  41,  41, 123,  65, // i&&i.url)){A\n 110,  40,  87, 110,  44, 105,  61, 116, 104, 105, 115,  46, // n(Wn,i=this.\n  99,  61, 123, 117, 114, 108,  58, 111,  44, 112, 114, 101, // c={url:o,pre\n 118, 105, 111, 117, 115,  58, 105,  38,  38, 105,  46, 117, // vious:i&&i.u\n 114, 108,  44,  99, 117, 114, 114, 101, 110, 116,  58,  95, // rl,current:_\n  44, 112,  97, 116, 104,  58,  95,  63,  95,  46, 112, 114, // ,path:_?_.pr\n 111, 112, 115,  46, 112,  97, 116, 104,  58, 110, 117, 108, // ops.path:nul\n 108,  44, 109,  97, 116,  99, 104, 101, 115,  58, 101, 125, // l,matches:e}\n  41,  44, 105,  46, 114, 111, 117, 116, 101, 114,  61, 116, // ),i.router=t\n 104, 105, 115,  44, 105,  46,  97,  99, 116, 105, 118, 101, // his,i.active\n  61,  95,  63,  91,  95,  93,  58,  91,  93,  59, 102, 111, // =_?[_]:[];fo\n 114,  40, 118,  97, 114,  32, 108,  61,  76, 110,  46, 108, // r(var l=Ln.l\n 101, 110, 103, 116, 104,  59, 108,  45,  45,  59,  41,  76, // ength;l--;)L\n 110,  91, 108,  93,  40, 123, 125,  41,  59,  34, 102, 117, // n[l]({});\"fu\n 110,  99, 116, 105, 111, 110,  34,  61,  61, 116, 121, 112, // nction\"==typ\n 101, 111, 102,  32, 114,  38,  38, 114,  40, 105,  41, 125, // eof r&&r(i)}\n 114, 101, 116, 117, 114, 110,  32, 104,  40,  86, 110,  46, // return h(Vn.\n  80, 114, 111, 118, 105, 100, 101, 114,  44, 123, 118,  97, // Provider,{va\n 108, 117, 101,  58, 105, 125,  44,  95,  41, 125, 125,  41, // lue:i},_)}})\n  59, 118,  97, 114,  32, 122, 110,  61, 102, 117, 110,  99, // ;var zn=func\n 116, 105, 111, 110,  40, 110,  41, 123, 114, 101, 116, 117, // tion(n){retu\n 114, 110,  32, 104,  40,  34,  97,  34,  44,  65, 110,  40, // rn h(\"a\",An(\n 123, 111, 110,  67, 108, 105,  99, 107,  58,  66, 110, 125, // {onClick:Bn}\n  44, 110,  41,  41, 125,  44,  74, 110,  61, 102, 117, 110, // ,n))},Jn=fun\n  99, 116, 105, 111, 110,  40, 110,  41, 123, 114, 101, 116, // ction(n){ret\n 117, 114, 110,  32, 104,  40, 110,  46,  99, 111, 109, 112, // urn h(n.comp\n 111, 110, 101, 110, 116,  44, 110,  41, 125,  59, 101, 120, // onent,n)};ex\n 112, 111, 114, 116, 123, 121,  32,  97, 115,  32,  67, 111, // port{y as Co\n 109, 112, 111, 110, 101, 110, 116,  44, 109,  32,  97, 115, // mponent,m as\n  32,  70, 114,  97, 103, 109, 101, 110, 116,  44, 122, 110, //  Fragment,zn\n  32,  97, 115,  32,  76, 105, 110, 107,  44,  74, 110,  32, //  as Link,Jn \n  97, 115,  32,  82, 111, 117, 116, 101,  44,  71, 110,  32, // as Route,Gn \n  97, 115,  32,  82, 111, 117, 116, 101, 114,  44,  79,  32, // as Router,O \n  97, 115,  32,  99, 108, 111, 110, 101,  69, 108, 101, 109, // as cloneElem\n 101, 110, 116,  44,  36,  32,  97, 115,  32,  99, 114, 101, // ent,$ as cre\n  97, 116, 101,  67, 111, 110, 116, 101, 120, 116,  44, 104, // ateContext,h\n  32,  97, 115,  32,  99, 114, 101,  97, 116, 101,  69, 108, //  as createEl\n 101, 109, 101, 110, 116,  44, 118,  32,  97, 115,  32,  99, // ement,v as c\n 114, 101,  97, 116, 101,  82, 101, 102,  44,  80, 110,  32, // reateRef,Pn \n  97, 115,  32, 101, 120, 101,  99,  44,  73, 110,  32,  97, // as exec,In a\n 115,  32, 103, 101, 116,  67, 117, 114, 114, 101, 110, 116, // s getCurrent\n  85, 114, 108,  44, 104,  44,  72, 110,  32,  97, 115,  32, // Url,h,Hn as \n 104, 116, 109, 108,  44,  73,  32,  97, 115,  32, 104, 121, // html,I as hy\n 100, 114,  97, 116, 101,  44,  95,  32,  97, 115,  32, 105, // drate,_ as i\n 115,  86,  97, 108, 105, 100,  69, 108, 101, 109, 101, 110, // sValidElemen\n 116,  44, 116,  32,  97, 115,  32, 111, 112, 116, 105, 111, // t,t as optio\n 110, 115,  44,  70,  32,  97, 115,  32, 114, 101, 110, 100, // ns,F as rend\n 101, 114,  44,  79, 110,  32,  97, 115,  32, 114, 111, 117, // er,On as rou\n 116, 101,  44,  72,  32,  97, 115,  32, 116, 111,  67, 104, // te,H as toCh\n 105, 108, 100,  65, 114, 114,  97, 121,  44,  97, 110,  32, // ildArray,an \n  97, 115,  32, 117, 115, 101,  67,  97, 108, 108,  98,  97, // as useCallba\n  99, 107,  44, 115, 110,  32,  97, 115,  32, 117, 115, 101, // ck,sn as use\n  67, 111, 110, 116, 101, 120, 116,  44, 102, 110,  32,  97, // Context,fn a\n 115,  32, 117, 115, 101,  68, 101,  98, 117, 103,  86,  97, // s useDebugVa\n 108, 117, 101,  44, 114, 110,  32,  97, 115,  32, 117, 115, // lue,rn as us\n 101,  69, 102, 102, 101,  99, 116,  44, 112, 110,  32,  97, // eEffect,pn a\n 115,  32, 117, 115, 101,  69, 114, 114, 111, 114,  66, 111, // s useErrorBo\n 117, 110, 100,  97, 114, 121,  44, 104, 110,  32,  97, 115, // undary,hn as\n  32, 117, 115, 101,  73, 100,  44, 108, 110,  32,  97, 115, //  useId,ln as\n  32, 117, 115, 101,  73, 109, 112, 101, 114,  97, 116, 105, //  useImperati\n 118, 101,  72,  97, 110, 100, 108, 101,  44, 111, 110,  32, // veHandle,on \n  97, 115,  32, 117, 115, 101,  76,  97, 121, 111, 117, 116, // as useLayout\n  69, 102, 102, 101,  99, 116,  44,  99, 110,  32,  97, 115, // Effect,cn as\n  32, 117, 115, 101,  77, 101, 109, 111,  44,  95, 110,  32, //  useMemo,_n \n  97, 115,  32, 117, 115, 101,  82, 101, 100, 117,  99, 101, // as useReduce\n 114,  44, 117, 110,  32,  97, 115,  32, 117, 115, 101,  82, // r,un as useR\n 101, 102,  44,  70, 110,  32,  97, 115,  32, 117, 115, 101, // ef,Fn as use\n  82, 111, 117, 116, 101, 114,  44, 101, 110,  32,  97, 115, // Router,en as\n  32, 117, 115, 101,  83, 116,  97, 116, 101, 125,  59, 0 //  useState};\n};\nstatic const unsigned char v2[] = {\n  39, 117, 115, 101,  32, 115, 116, 114, 105,  99, 116,  39, // 'use strict'\n  59,  10, 105, 109, 112, 111, 114, 116,  32, 123,  32, 104, // ;.import { h\n  44,  32, 114, 101, 110, 100, 101, 114,  44,  32, 117, 115, // , render, us\n 101,  83, 116,  97, 116, 101,  44,  32, 117, 115, 101,  69, // eState, useE\n 102, 102, 101,  99, 116,  44,  32, 117, 115, 101,  82, 101, // ffect, useRe\n 102,  44,  32, 104, 116, 109, 108,  44,  32,  82, 111, 117, // f, html, Rou\n 116, 101, 114,  32, 125,  32, 102, 114, 111, 109,  32,  32, // ter } from  \n  39,  46,  47,  98, 117, 110, 100, 108, 101,  46, 106, 115, // './bundle.js\n  39,  59,  10,  10,  47,  47,  32,  72, 101, 108, 112, 101, // ';..// Helpe\n 114,  32, 102, 117, 110,  99, 116, 105, 111, 110,  32, 116, // r function t\n 104,  97, 116,  32, 114, 101, 116, 117, 114, 110, 115,  32, // hat returns \n  97,  32, 112, 114, 111, 109, 105, 115, 101,  32, 116, 104, // a promise th\n  97, 116,  32, 114, 101, 115, 111, 108, 118, 101, 115,  32, // at resolves \n  97, 102, 116, 101, 114,  32, 100, 101, 108,  97, 121,  10, // after delay.\n  99, 111, 110, 115, 116,  32,  68, 101, 108,  97, 121,  32, // const Delay \n  61,  32,  40, 109, 115,  44,  32, 118,  97, 108,  41,  32, // = (ms, val) \n  61,  62,  32, 110, 101, 119,  32,  80, 114, 111, 109, 105, // => new Promi\n 115, 101,  40, 114, 101, 115, 111, 108, 118, 101,  32,  61, // se(resolve =\n  62,  32, 115, 101, 116,  84, 105, 109, 101, 111, 117, 116, // > setTimeout\n  40, 114, 101, 115, 111, 108, 118, 101,  44,  32, 109, 115, // (resolve, ms\n  44,  32, 118,  97, 108,  41,  41,  59,  10,  10, 101, 120, // , val));..ex\n 112, 111, 114, 116,  32,  99, 111, 110, 115, 116,  32,  73, // port const I\n  99, 111, 110, 115,  32,  61,  32, 123,  10,  32,  32, 104, // cons = {.  h\n 101,  97, 114, 116,  58,  32, 112, 114, 111, 112, 115,  32, // eart: props \n  61,  62,  32, 104, 116, 109, 108,  96,  60, 115, 118, 103, // => html`<svg\n  32,  99, 108,  97, 115, 115,  61,  36, 123, 112, 114, 111, //  class=${pro\n 112, 115,  46,  99, 108,  97, 115, 115, 125,  32, 120, 109, // ps.class} xm\n 108, 110, 115,  61,  34, 104, 116, 116, 112,  58,  47,  47, // lns=\"http://\n 119, 119, 119,  46, 119,  51,  46, 111, 114, 103,  47,  50, // www.w3.org/2\n  48,  48,  48,  47, 115, 118, 103,  34,  32, 102, 105, 108, // 000/svg\" fil\n 108,  61,  34, 110, 111, 110, 101,  34,  32, 118, 105, 101, // l=\"none\" vie\n 119,  66, 111, 120,  61,  34,  48,  32,  48,  32,  50,  52, // wBox=\"0 0 24\n  32,  50,  52,  34,  62,  60, 112,  97, 116, 104,  32, 115, //  24\"><path s\n 116, 114, 111, 107, 101,  45, 108, 105, 110, 101,  99,  97, // troke-lineca\n 112,  61,  34, 114, 111, 117, 110, 100,  34,  32, 115, 116, // p=\"round\" st\n 114, 111, 107, 101,  45, 108, 105, 110, 101, 106, 111, 105, // roke-linejoi\n 110,  61,  34, 114, 111, 117, 110, 100,  34,  32, 115, 116, // n=\"round\" st\n 114, 111, 107, 101,  45, 119, 105, 100, 116, 104,  61,  34, // roke-width=\"\n  50,  34,  32, 100,  61,  34,  77,  52,  46,  51,  49,  56, // 2\" d=\"M4.318\n  32,  54,  46,  51,  49,  56,  97,  52,  46,  53,  32,  52, //  6.318a4.5 4\n  46,  53,  32,  48,  32,  48,  48,  48,  32,  54,  46,  51, // .5 0 000 6.3\n  54,  52,  76,  49,  50,  32,  50,  48,  46,  51,  54,  52, // 64L12 20.364\n 108,  55,  46,  54,  56,  50,  45,  55,  46,  54,  56,  50, // l7.682-7.682\n  97,  52,  46,  53,  32,  52,  46,  53,  32,  48,  32,  48, // a4.5 4.5 0 0\n  48,  45,  54,  46,  51,  54,  52,  45,  54,  46,  51,  54, // 0-6.364-6.36\n  52,  76,  49,  50,  32,  55,  46,  54,  51,  54, 108,  45, // 4L12 7.636l-\n  49,  46,  51,  49,  56,  45,  49,  46,  51,  49,  56,  97, // 1.318-1.318a\n  52,  46,  53,  32,  52,  46,  53,  32,  48,  32,  48,  48, // 4.5 4.5 0 00\n  45,  54,  46,  51,  54,  52,  32,  48, 122,  34,  62,  60, // -6.364 0z\"><\n  47, 112,  97, 116, 104,  62,  60,  47, 115, 118, 103,  62, // /path></svg>\n  96,  44,  10,  32,  32, 100, 111, 119, 110,  65, 114, 114, // `,.  downArr\n 111, 119,  66, 111, 120,  58,  32, 112, 114, 111, 112, 115, // owBox: props\n  32,  61,  62,  32, 104, 116, 109, 108,  96,  60, 115, 118, //  => html`<sv\n 103,  32,  99, 108,  97, 115, 115,  61,  36, 123, 112, 114, // g class=${pr\n 111, 112, 115,  46,  99, 108,  97, 115, 115, 125,  32, 120, // ops.class} x\n 109, 108, 110, 115,  61,  34, 104, 116, 116, 112,  58,  47, // mlns=\"http:/\n  47, 119, 119, 119,  46, 119,  51,  46, 111, 114, 103,  47, // /www.w3.org/\n  50,  48,  48,  48,  47, 115, 118, 103,  34,  32, 102, 105, // 2000/svg\" fi\n 108, 108,  61,  34, 110, 111, 110, 101,  34,  32, 118, 105, // ll=\"none\" vi\n 101, 119,  66, 111, 120,  61,  34,  48,  32,  48,  32,  50, // ewBox=\"0 0 2\n  52,  32,  50,  52,  34,  32, 115, 116, 114, 111, 107, 101, // 4 24\" stroke\n  45, 119, 105, 100, 116, 104,  61,  34,  49,  46,  53,  34, // -width=\"1.5\"\n  32, 115, 116, 114, 111, 107, 101,  61,  34,  99, 117, 114, //  stroke=\"cur\n 114, 101, 110, 116,  67, 111, 108, 111, 114,  34,  62,  32, // rentColor\"> \n  60, 112,  97, 116, 104,  32, 115, 116, 114, 111, 107, 101, // <path stroke\n  45, 108, 105, 110, 101,  99,  97, 112,  61,  34, 114, 111, // -linecap=\"ro\n 117, 110, 100,  34,  32, 115, 116, 114, 111, 107, 101,  45, // und\" stroke-\n 108, 105, 110, 101, 106, 111, 105, 110,  61,  34, 114, 111, // linejoin=\"ro\n 117, 110, 100,  34,  32, 100,  61,  34,  77,  57,  32,  56, // und\" d=\"M9 8\n  46,  50,  53,  72,  55,  46,  53,  97,  50,  46,  50,  53, // .25H7.5a2.25\n  32,  50,  46,  50,  53,  32,  48,  32,  48,  48,  45,  50, //  2.25 0 00-2\n  46,  50,  53,  32,  50,  46,  50,  53, 118,  57,  97,  50, // .25 2.25v9a2\n  46,  50,  53,  32,  50,  46,  50,  53,  32,  48,  32,  48, // .25 2.25 0 0\n  48,  50,  46,  50,  53,  32,  50,  46,  50,  53, 104,  57, // 02.25 2.25h9\n  97,  50,  46,  50,  53,  32,  50,  46,  50,  53,  32,  48, // a2.25 2.25 0\n  32,  48,  48,  50,  46,  50,  53,  45,  50,  46,  50,  53, //  002.25-2.25\n 118,  45,  57,  97,  50,  46,  50,  53,  32,  50,  46,  50, // v-9a2.25 2.2\n  53,  32,  48,  32,  48,  48,  45,  50,  46,  50,  53,  45, // 5 0 00-2.25-\n  50,  46,  50,  53,  72,  49,  53,  77,  57,  32,  49,  50, // 2.25H15M9 12\n 108,  51,  32,  51, 109,  48,  32,  48, 108,  51,  45,  51, // l3 3m0 0l3-3\n 109,  45,  51,  32,  51,  86,  50,  46,  50,  53,  34,  32, // m-3 3V2.25\" \n  47,  62,  32,  60,  47, 115, 118, 103,  62,  96,  44,  10, // /> </svg>`,.\n  32,  32, 117, 112,  65, 114, 114, 111, 119,  66, 111, 120, //   upArrowBox\n  58,  32, 112, 114, 111, 112, 115,  32,  61,  62,  32, 104, // : props => h\n 116, 109, 108,  96,  60, 115, 118, 103,  32,  99, 108,  97, // tml`<svg cla\n 115, 115,  61,  36, 123, 112, 114, 111, 112, 115,  46,  99, // ss=${props.c\n 108,  97, 115, 115, 125,  32, 120, 109, 108, 110, 115,  61, // lass} xmlns=\n  34, 104, 116, 116, 112,  58,  47,  47, 119, 119, 119,  46, // \"http://www.\n 119,  51,  46, 111, 114, 103,  47,  50,  48,  48,  48,  47, // w3.org/2000/\n 115, 118, 103,  34,  32, 102, 105, 108, 108,  61,  34, 110, // svg\" fill=\"n\n 111, 110, 101,  34,  32, 118, 105, 101, 119,  66, 111, 120, // one\" viewBox\n  61,  34,  48,  32,  48,  32,  50,  52,  32,  50,  52,  34, // =\"0 0 24 24\"\n  32, 115, 116, 114, 111, 107, 101,  45, 119, 105, 100, 116, //  stroke-widt\n 104,  61,  34,  49,  46,  53,  34,  32, 115, 116, 114, 111, // h=\"1.5\" stro\n 107, 101,  61,  34,  99, 117, 114, 114, 101, 110, 116,  67, // ke=\"currentC\n 111, 108, 111, 114,  34,  62,  32,  60, 112,  97, 116, 104, // olor\"> <path\n  32, 115, 116, 114, 111, 107, 101,  45, 108, 105, 110, 101, //  stroke-line\n  99,  97, 112,  61,  34, 114, 111, 117, 110, 100,  34,  32, // cap=\"round\" \n 115, 116, 114, 111, 107, 101,  45, 108, 105, 110, 101, 106, // stroke-linej\n 111, 105, 110,  61,  34, 114, 111, 117, 110, 100,  34,  32, // oin=\"round\" \n 100,  61,  34,  77,  57,  32,  56,  46,  50,  53,  72,  55, // d=\"M9 8.25H7\n  46,  53,  97,  50,  46,  50,  53,  32,  50,  46,  50,  53, // .5a2.25 2.25\n  32,  48,  32,  48,  48,  45,  50,  46,  50,  53,  32,  50, //  0 00-2.25 2\n  46,  50,  53, 118,  57,  97,  50,  46,  50,  53,  32,  50, // .25v9a2.25 2\n  46,  50,  53,  32,  48,  32,  48,  48,  50,  46,  50,  53, // .25 0 002.25\n  32,  50,  46,  50,  53, 104,  57,  97,  50,  46,  50,  53, //  2.25h9a2.25\n  32,  50,  46,  50,  53,  32,  48,  32,  48,  48,  50,  46, //  2.25 0 002.\n  50,  53,  45,  50,  46,  50,  53, 118,  45,  57,  97,  50, // 25-2.25v-9a2\n  46,  50,  53,  32,  50,  46,  50,  53,  32,  48,  32,  48, // .25 2.25 0 0\n  48,  45,  50,  46,  50,  53,  45,  50,  46,  50,  53,  72, // 0-2.25-2.25H\n  49,  53, 109,  48,  45,  51, 108,  45,  51,  45,  51, 109, // 15m0-3l-3-3m\n  48,  32,  48, 108,  45,  51,  32,  51, 109,  51,  45,  51, // 0 0l-3 3m3-3\n  86,  49,  53,  34,  32,  47,  62,  32,  60,  47, 115, 118, // V15\" /> </sv\n 103,  62,  96,  44,  10,  32,  32,  99, 111, 103,  58,  32, // g>`,.  cog: \n 112, 114, 111, 112, 115,  32,  61,  62,  32, 104, 116, 109, // props => htm\n 108,  96,  60, 115, 118, 103,  32,  99, 108,  97, 115, 115, // l`<svg class\n  61,  36, 123, 112, 114, 111, 112, 115,  46,  99, 108,  97, // =${props.cla\n 115, 115, 125,  32, 120, 109, 108, 110, 115,  61,  34, 104, // ss} xmlns=\"h\n 116, 116, 112,  58,  47,  47, 119, 119, 119,  46, 119,  51, // ttp://www.w3\n  46, 111, 114, 103,  47,  50,  48,  48,  48,  47, 115, 118, // .org/2000/sv\n 103,  34,  32, 102, 105, 108, 108,  61,  34, 110, 111, 110, // g\" fill=\"non\n 101,  34,  32, 118, 105, 101, 119,  66, 111, 120,  61,  34, // e\" viewBox=\"\n  48,  32,  48,  32,  50,  52,  32,  50,  52,  34,  32, 115, // 0 0 24 24\" s\n 116, 114, 111, 107, 101,  45, 119, 105, 100, 116, 104,  61, // troke-width=\n  34,  49,  46,  53,  34,  32, 115, 116, 114, 111, 107, 101, // \"1.5\" stroke\n  61,  34,  99, 117, 114, 114, 101, 110, 116,  67, 111, 108, // =\"currentCol\n 111, 114,  34,  62,  32,  60, 112,  97, 116, 104,  32, 115, // or\"> <path s\n 116, 114, 111, 107, 101,  45, 108, 105, 110, 101,  99,  97, // troke-lineca\n 112,  61,  34, 114, 111, 117, 110, 100,  34,  32, 115, 116, // p=\"round\" st\n 114, 111, 107, 101,  45, 108, 105, 110, 101, 106, 111, 105, // roke-linejoi\n 110,  61,  34, 114, 111, 117, 110, 100,  34,  32, 100,  61, // n=\"round\" d=\n  34,  77,  57,  46,  53,  57,  52,  32,  51,  46,  57,  52, // \"M9.594 3.94\n  99,  46,  48,  57,  45,  46,  53,  52,  50,  46,  53,  54, // c.09-.542.56\n  45,  46,  57,  52,  32,  49,  46,  49,  49,  45,  46,  57, // -.94 1.11-.9\n  52, 104,  50,  46,  53,  57,  51,  99,  46,  53,  53,  32, // 4h2.593c.55 \n  48,  32,  49,  46,  48,  50,  46,  51,  57,  56,  32,  49, // 0 1.02.398 1\n  46,  49,  49,  46,  57,  52, 108,  46,  50,  49,  51,  32, // .11.94l.213 \n  49,  46,  50,  56,  49,  99,  46,  48,  54,  51,  46,  51, // 1.281c.063.3\n  55,  52,  46,  51,  49,  51,  46,  54,  56,  54,  46,  54, // 74.313.686.6\n  52,  53,  46,  56,  55,  46,  48,  55,  52,  46,  48,  52, // 45.87.074.04\n  46,  49,  52,  55,  46,  48,  56,  51,  46,  50,  50,  46, // .147.083.22.\n  49,  50,  55,  46,  51,  50,  52,  46,  49,  57,  54,  46, // 127.324.196.\n  55,  50,  46,  50,  53,  55,  32,  49,  46,  48,  55,  53, // 72.257 1.075\n  46,  49,  50,  52, 108,  49,  46,  50,  49,  55,  45,  46, // .124l1.217-.\n  52,  53,  54,  97,  49,  46,  49,  50,  53,  32,  49,  46, // 456a1.125 1.\n  49,  50,  53,  32,  48,  32,  48,  49,  49,  46,  51,  55, // 125 0 011.37\n  46,  52,  57, 108,  49,  46,  50,  57,  54,  32,  50,  46, // .49l1.296 2.\n  50,  52,  55,  97,  49,  46,  49,  50,  53,  32,  49,  46, // 247a1.125 1.\n  49,  50,  53,  32,  48,  32,  48,  49,  45,  46,  50,  54, // 125 0 01-.26\n  32,  49,  46,  52,  51,  49, 108,  45,  49,  46,  48,  48, //  1.431l-1.00\n  51,  46,  56,  50,  55,  99,  45,  46,  50,  57,  51,  46, // 3.827c-.293.\n  50,  52,  45,  46,  52,  51,  56,  46,  54,  49,  51,  45, // 24-.438.613-\n  46,  52,  51,  49,  46,  57,  57,  50,  97,  54,  46,  55, // .431.992a6.7\n  53,  57,  32,  54,  46,  55,  53,  57,  32,  48,  32,  48, // 59 6.759 0 0\n  49,  48,  32,  46,  50,  53,  53,  99,  45,  46,  48,  48, // 10 .255c-.00\n  55,  46,  51,  55,  56,  46,  49,  51,  56,  46,  55,  53, // 7.378.138.75\n  46,  52,  51,  46,  57,  57, 108,  49,  46,  48,  48,  53, // .43.99l1.005\n  46,  56,  50,  56,  99,  46,  52,  50,  52,  46,  51,  53, // .828c.424.35\n  46,  53,  51,  52,  46,  57,  53,  52,  46,  50,  54,  32, // .534.954.26 \n  49,  46,  52,  51, 108,  45,  49,  46,  50,  57,  56,  32, // 1.43l-1.298 \n  50,  46,  50,  52,  55,  97,  49,  46,  49,  50,  53,  32, // 2.247a1.125 \n  49,  46,  49,  50,  53,  32,  48,  32,  48,  49,  45,  49, // 1.125 0 01-1\n  46,  51,  54,  57,  46,  52,  57,  49, 108,  45,  49,  46, // .369.491l-1.\n  50,  49,  55,  45,  46,  52,  53,  54,  99,  45,  46,  51, // 217-.456c-.3\n  53,  53,  45,  46,  49,  51,  51,  45,  46,  55,  53,  45, // 55-.133-.75-\n  46,  48,  55,  50,  45,  49,  46,  48,  55,  54,  46,  49, // .072-1.076.1\n  50,  52,  97,  54,  46,  53,  55,  32,  54,  46,  53,  55, // 24a6.57 6.57\n  32,  48,  32,  48,  49,  45,  46,  50,  50,  46,  49,  50, //  0 01-.22.12\n  56,  99,  45,  46,  51,  51,  49,  46,  49,  56,  51,  45, // 8c-.331.183-\n  46,  53,  56,  49,  46,  52,  57,  53,  45,  46,  54,  52, // .581.495-.64\n  52,  46,  56,  54,  57, 108,  45,  46,  50,  49,  51,  32, // 4.869l-.213 \n  49,  46,  50,  56,  99,  45,  46,  48,  57,  46,  53,  52, // 1.28c-.09.54\n  51,  45,  46,  53,  54,  46,  57,  52,  49,  45,  49,  46, // 3-.56.941-1.\n  49,  49,  46,  57,  52,  49, 104,  45,  50,  46,  53,  57, // 11.941h-2.59\n  52,  99,  45,  46,  53,  53,  32,  48,  45,  49,  46,  48, // 4c-.55 0-1.0\n  50,  45,  46,  51,  57,  56,  45,  49,  46,  49,  49,  45, // 2-.398-1.11-\n  46,  57,  52, 108,  45,  46,  50,  49,  51,  45,  49,  46, // .94l-.213-1.\n  50,  56,  49,  99,  45,  46,  48,  54,  50,  45,  46,  51, // 281c-.062-.3\n  55,  52,  45,  46,  51,  49,  50,  45,  46,  54,  56,  54, // 74-.312-.686\n  45,  46,  54,  52,  52,  45,  46,  56,  55,  97,  54,  46, // -.644-.87a6.\n  53,  50,  32,  54,  46,  53,  50,  32,  48,  32,  48,  49, // 52 6.52 0 01\n  45,  46,  50,  50,  45,  46,  49,  50,  55,  99,  45,  46, // -.22-.127c-.\n  51,  50,  53,  45,  46,  49,  57,  54,  45,  46,  55,  50, // 325-.196-.72\n  45,  46,  50,  53,  55,  45,  49,  46,  48,  55,  54,  45, // -.257-1.076-\n  46,  49,  50,  52, 108,  45,  49,  46,  50,  49,  55,  46, // .124l-1.217.\n  52,  53,  54,  97,  49,  46,  49,  50,  53,  32,  49,  46, // 456a1.125 1.\n  49,  50,  53,  32,  48,  32,  48,  49,  45,  49,  46,  51, // 125 0 01-1.3\n  54,  57,  45,  46,  52,  57, 108,  45,  49,  46,  50,  57, // 69-.49l-1.29\n  55,  45,  50,  46,  50,  52,  55,  97,  49,  46,  49,  50, // 7-2.247a1.12\n  53,  32,  49,  46,  49,  50,  53,  32,  48,  32,  48,  49, // 5 1.125 0 01\n  46,  50,  54,  45,  49,  46,  52,  51,  49, 108,  49,  46, // .26-1.431l1.\n  48,  48,  52,  45,  46,  56,  50,  55,  99,  46,  50,  57, // 004-.827c.29\n  50,  45,  46,  50,  52,  46,  52,  51,  55,  45,  46,  54, // 2-.24.437-.6\n  49,  51,  46,  52,  51,  45,  46,  57,  57,  50,  97,  54, // 13.43-.992a6\n  46,  57,  51,  50,  32,  54,  46,  57,  51,  50,  32,  48, // .932 6.932 0\n  32,  48,  49,  48,  45,  46,  50,  53,  53,  99,  46,  48, //  010-.255c.0\n  48,  55,  45,  46,  51,  55,  56,  45,  46,  49,  51,  56, // 07-.378-.138\n  45,  46,  55,  53,  45,  46,  52,  51,  45,  46,  57,  57, // -.75-.43-.99\n 108,  45,  49,  46,  48,  48,  52,  45,  46,  56,  50,  56, // l-1.004-.828\n  97,  49,  46,  49,  50,  53,  32,  49,  46,  49,  50,  53, // a1.125 1.125\n  32,  48,  32,  48,  49,  45,  46,  50,  54,  45,  49,  46, //  0 01-.26-1.\n  52,  51, 108,  49,  46,  50,  57,  55,  45,  50,  46,  50, // 43l1.297-2.2\n  52,  55,  97,  49,  46,  49,  50,  53,  32,  49,  46,  49, // 47a1.125 1.1\n  50,  53,  32,  48,  32,  48,  49,  49,  46,  51,  55,  45, // 25 0 011.37-\n  46,  52,  57,  49, 108,  49,  46,  50,  49,  54,  46,  52, // .491l1.216.4\n  53,  54,  99,  46,  51,  53,  54,  46,  49,  51,  51,  46, // 56c.356.133.\n  55,  53,  49,  46,  48,  55,  50,  32,  49,  46,  48,  55, // 751.072 1.07\n  54,  45,  46,  49,  50,  52,  46,  48,  55,  50,  45,  46, // 6-.124.072-.\n  48,  52,  52,  46,  49,  52,  54,  45,  46,  48,  56,  55, // 044.146-.087\n  46,  50,  50,  45,  46,  49,  50,  56,  46,  51,  51,  50, // .22-.128.332\n  45,  46,  49,  56,  51,  46,  53,  56,  50,  45,  46,  52, // -.183.582-.4\n  57,  53,  46,  54,  52,  52,  45,  46,  56,  54,  57, 108, // 95.644-.869l\n  46,  50,  49,  52,  45,  49,  46,  50,  56,  49, 122,  34, // .214-1.281z\"\n  32,  47,  62,  32,  60, 112,  97, 116, 104,  32, 115, 116, //  /> <path st\n 114, 111, 107, 101,  45, 108, 105, 110, 101,  99,  97, 112, // roke-linecap\n  61,  34, 114, 111, 117, 110, 100,  34,  32, 115, 116, 114, // =\"round\" str\n 111, 107, 101,  45, 108, 105, 110, 101, 106, 111, 105, 110, // oke-linejoin\n  61,  34, 114, 111, 117, 110, 100,  34,  32, 100,  61,  34, // =\"round\" d=\"\n  77,  49,  53,  32,  49,  50,  97,  51,  32,  51,  32,  48, // M15 12a3 3 0\n  32,  49,  49,  45,  54,  32,  48,  32,  51,  32,  51,  32, //  11-6 0 3 3 \n  48,  32,  48,  49,  54,  32,  48, 122,  34,  32,  47,  62, // 0 016 0z\" />\n  32,  60,  47, 115, 118, 103,  62,  96,  44,  10,  32,  32, //  </svg>`,.  \n 115, 101, 116, 116, 105, 110, 103, 115,  72,  58,  32, 112, // settingsH: p\n 114, 111, 112, 115,  32,  61,  62,  32, 104, 116, 109, 108, // rops => html\n  96,  60, 115, 118, 103,  32,  99, 108,  97, 115, 115,  61, // `<svg class=\n  36, 123, 112, 114, 111, 112, 115,  46,  99, 108,  97, 115, // ${props.clas\n 115, 125,  32, 120, 109, 108, 110, 115,  61,  34, 104, 116, // s} xmlns=\"ht\n 116, 112,  58,  47,  47, 119, 119, 119,  46, 119,  51,  46, // tp://www.w3.\n 111, 114, 103,  47,  50,  48,  48,  48,  47, 115, 118, 103, // org/2000/svg\n  34,  32, 102, 105, 108, 108,  61,  34, 110, 111, 110, 101, // \" fill=\"none\n  34,  32, 118, 105, 101, 119,  66, 111, 120,  61,  34,  48, // \" viewBox=\"0\n  32,  48,  32,  50,  52,  32,  50,  52,  34,  32, 115, 116, //  0 24 24\" st\n 114, 111, 107, 101,  45, 119, 105, 100, 116, 104,  61,  34, // roke-width=\"\n  49,  46,  53,  34,  32, 115, 116, 114, 111, 107, 101,  61, // 1.5\" stroke=\n  34,  99, 117, 114, 114, 101, 110, 116,  67, 111, 108, 111, // \"currentColo\n 114,  34,  62,  32,  60, 112,  97, 116, 104,  32, 115, 116, // r\"> <path st\n 114, 111, 107, 101,  45, 108, 105, 110, 101,  99,  97, 112, // roke-linecap\n  61,  34, 114, 111, 117, 110, 100,  34,  32, 115, 116, 114, // =\"round\" str\n 111, 107, 101,  45, 108, 105, 110, 101, 106, 111, 105, 110, // oke-linejoin\n  61,  34, 114, 111, 117, 110, 100,  34,  32, 100,  61,  34, // =\"round\" d=\"\n  77,  49,  48,  46,  53,  32,  54, 104,  57,  46,  55,  53, // M10.5 6h9.75\n  77,  49,  48,  46,  53,  32,  54,  97,  49,  46,  53,  32, // M10.5 6a1.5 \n  49,  46,  53,  32,  48,  32,  49,  49,  45,  51,  32,  48, // 1.5 0 11-3 0\n 109,  51,  32,  48,  97,  49,  46,  53,  32,  49,  46,  53, // m3 0a1.5 1.5\n  32,  48,  32,  49,  48,  45,  51,  32,  48,  77,  51,  46, //  0 10-3 0M3.\n  55,  53,  32,  54,  72,  55,  46,  53, 109,  51,  32,  49, // 75 6H7.5m3 1\n  50, 104,  57,  46,  55,  53, 109,  45,  57,  46,  55,  53, // 2h9.75m-9.75\n  32,  48,  97,  49,  46,  53,  32,  49,  46,  53,  32,  48, //  0a1.5 1.5 0\n  32,  48,  49,  45,  51,  32,  48, 109,  51,  32,  48,  97, //  01-3 0m3 0a\n  49,  46,  53,  32,  49,  46,  53,  32,  48,  32,  48,  48, // 1.5 1.5 0 00\n  45,  51,  32,  48, 109,  45,  51,  46,  55,  53,  32,  48, // -3 0m-3.75 0\n  72,  55,  46,  53, 109,  57,  45,  54, 104,  51,  46,  55, // H7.5m9-6h3.7\n  53, 109,  45,  51,  46,  55,  53,  32,  48,  97,  49,  46, // 5m-3.75 0a1.\n  53,  32,  49,  46,  53,  32,  48,  32,  48,  49,  45,  51, // 5 1.5 0 01-3\n  32,  48, 109,  51,  32,  48,  97,  49,  46,  53,  32,  49, //  0m3 0a1.5 1\n  46,  53,  32,  48,  32,  48,  48,  45,  51,  32,  48, 109, // .5 0 00-3 0m\n  45,  57,  46,  55,  53,  32,  48, 104,  57,  46,  55,  53, // -9.75 0h9.75\n  34,  32,  47,  62,  32,  60,  47, 115, 118, 103,  62,  96, // \" /> </svg>`\n  44,  10,  32,  32, 115, 101, 116, 116, 105, 110, 103, 115, // ,.  settings\n  86,  58,  32, 112, 114, 111, 112, 115,  32,  61,  62,  32, // V: props => \n 104, 116, 109, 108,  96,  60, 115, 118, 103,  32,  99, 108, // html`<svg cl\n  97, 115, 115,  61,  36, 123, 112, 114, 111, 112, 115,  46, // ass=${props.\n  99, 108,  97, 115, 115, 125,  32, 120, 109, 108, 110, 115, // class} xmlns\n  61,  34, 104, 116, 116, 112,  58,  47,  47, 119, 119, 119, // =\"http://www\n  46, 119,  51,  46, 111, 114, 103,  47,  50,  48,  48,  48, // .w3.org/2000\n  47, 115, 118, 103,  34,  32, 102, 105, 108, 108,  61,  34, // /svg\" fill=\"\n 110, 111, 110, 101,  34,  32, 118, 105, 101, 119,  66, 111, // none\" viewBo\n 120,  61,  34,  48,  32,  48,  32,  50,  52,  32,  50,  52, // x=\"0 0 24 24\n  34,  32, 115, 116, 114, 111, 107, 101,  45, 119, 105, 100, // \" stroke-wid\n 116, 104,  61,  34,  49,  46,  53,  34,  32, 115, 116, 114, // th=\"1.5\" str\n 111, 107, 101,  61,  34,  99, 117, 114, 114, 101, 110, 116, // oke=\"current\n  67, 111, 108, 111, 114,  34,  62,  32,  60, 112,  97, 116, // Color\"> <pat\n 104,  32, 115, 116, 114, 111, 107, 101,  45, 108, 105, 110, // h stroke-lin\n 101,  99,  97, 112,  61,  34, 114, 111, 117, 110, 100,  34, // ecap=\"round\"\n  32, 115, 116, 114, 111, 107, 101,  45, 108, 105, 110, 101, //  stroke-line\n 106, 111, 105, 110,  61,  34, 114, 111, 117, 110, 100,  34, // join=\"round\"\n  32, 100,  61,  34,  77,  54,  32,  49,  51,  46,  53,  86, //  d=\"M6 13.5V\n  51,  46,  55,  53, 109,  48,  32,  57,  46,  55,  53,  97, // 3.75m0 9.75a\n  49,  46,  53,  32,  49,  46,  53,  32,  48,  32,  48,  49, // 1.5 1.5 0 01\n  48,  32,  51, 109,  48,  45,  51,  97,  49,  46,  53,  32, // 0 3m0-3a1.5 \n  49,  46,  53,  32,  48,  32,  48,  48,  48,  32,  51, 109, // 1.5 0 000 3m\n  48,  32,  51,  46,  55,  53,  86,  49,  54,  46,  53, 109, // 0 3.75V16.5m\n  49,  50,  45,  51,  86,  51,  46,  55,  53, 109,  48,  32, // 12-3V3.75m0 \n  57,  46,  55,  53,  97,  49,  46,  53,  32,  49,  46,  53, // 9.75a1.5 1.5\n  32,  48,  32,  48,  49,  48,  32,  51, 109,  48,  45,  51, //  0 010 3m0-3\n  97,  49,  46,  53,  32,  49,  46,  53,  32,  48,  32,  48, // a1.5 1.5 0 0\n  48,  48,  32,  51, 109,  48,  32,  51,  46,  55,  53,  86, // 00 3m0 3.75V\n  49,  54,  46,  53, 109,  45,  54,  45,  57,  86,  51,  46, // 16.5m-6-9V3.\n  55,  53, 109,  48,  32,  51,  46,  55,  53,  97,  49,  46, // 75m0 3.75a1.\n  53,  32,  49,  46,  53,  32,  48,  32,  48,  49,  48,  32, // 5 1.5 0 010 \n  51, 109,  48,  45,  51,  97,  49,  46,  53,  32,  49,  46, // 3m0-3a1.5 1.\n  53,  32,  48,  32,  48,  48,  48,  32,  51, 109,  48,  32, // 5 0 000 3m0 \n  57,  46,  55,  53,  86,  49,  48,  46,  53,  34,  32,  47, // 9.75V10.5\" /\n  62,  32,  60,  47, 115, 118, 103,  62,  96,  44,  10,  32, // > </svg>`,. \n  32, 115,  99,  97, 110,  58,  32, 112, 114, 111, 112, 115, //  scan: props\n  32,  61,  62,  32, 104, 116, 109, 108,  96,  60, 115, 118, //  => html`<sv\n 103,  32,  99, 108,  97, 115, 115,  61,  36, 123, 112, 114, // g class=${pr\n 111, 112, 115,  46,  99, 108,  97, 115, 115, 125,  32, 120, // ops.class} x\n 109, 108, 110, 115,  61,  34, 104, 116, 116, 112,  58,  47, // mlns=\"http:/\n  47, 119, 119, 119,  46, 119,  51,  46, 111, 114, 103,  47, // /www.w3.org/\n  50,  48,  48,  48,  47, 115, 118, 103,  34,  32, 102, 105, // 2000/svg\" fi\n 108, 108,  61,  34, 110, 111, 110, 101,  34,  32, 118, 105, // ll=\"none\" vi\n 101, 119,  66, 111, 120,  61,  34,  48,  32,  48,  32,  50, // ewBox=\"0 0 2\n  52,  32,  50,  52,  34,  32, 115, 116, 114, 111, 107, 101, // 4 24\" stroke\n  45, 119, 105, 100, 116, 104,  61,  34,  49,  46,  53,  34, // -width=\"1.5\"\n  32, 115, 116, 114, 111, 107, 101,  61,  34,  99, 117, 114, //  stroke=\"cur\n 114, 101, 110, 116,  67, 111, 108, 111, 114,  34,  62,  32, // rentColor\"> \n  60, 112,  97, 116, 104,  32, 115, 116, 114, 111, 107, 101, // <path stroke\n  45, 108, 105, 110, 101,  99,  97, 112,  61,  34, 114, 111, // -linecap=\"ro\n 117, 110, 100,  34,  32, 115, 116, 114, 111, 107, 101,  45, // und\" stroke-\n 108, 105, 110, 101, 106, 111, 105, 110,  61,  34, 114, 111, // linejoin=\"ro\n 117, 110, 100,  34,  32, 100,  61,  34,  77,  55,  46,  53, // und\" d=\"M7.5\n  32,  51,  46,  55,  53,  72,  54,  65,  50,  46,  50,  53, //  3.75H6A2.25\n  32,  50,  46,  50,  53,  32,  48,  32,  48,  48,  51,  46, //  2.25 0 003.\n  55,  53,  32,  54, 118,  49,  46,  53,  77,  49,  54,  46, // 75 6v1.5M16.\n  53,  32,  51,  46,  55,  53,  72,  49,  56,  65,  50,  46, // 5 3.75H18A2.\n  50,  53,  32,  50,  46,  50,  53,  32,  48,  32,  48,  49, // 25 2.25 0 01\n  50,  48,  46,  50,  53,  32,  54, 118,  49,  46,  53, 109, // 20.25 6v1.5m\n  48,  32,  57,  86,  49,  56,  65,  50,  46,  50,  53,  32, // 0 9V18A2.25 \n  50,  46,  50,  53,  32,  48,  32,  48,  49,  49,  56,  32, // 2.25 0 0118 \n  50,  48,  46,  50,  53, 104,  45,  49,  46,  53, 109,  45, // 20.25h-1.5m-\n  57,  32,  48,  72,  54,  65,  50,  46,  50,  53,  32,  50, // 9 0H6A2.25 2\n  46,  50,  53,  32,  48,  32,  48,  49,  51,  46,  55,  53, // .25 0 013.75\n  32,  49,  56, 118,  45,  49,  46,  53,  77,  49,  53,  32, //  18v-1.5M15 \n  49,  50,  97,  51,  32,  51,  32,  48,  32,  49,  49,  45, // 12a3 3 0 11-\n  54,  32,  48,  32,  51,  32,  51,  32,  48,  32,  48,  49, // 6 0 3 3 0 01\n  54,  32,  48, 122,  34,  32,  47,  62,  32,  60,  47, 115, // 6 0z\" /> </s\n 118, 103,  62,  32,  96,  44,  10,  32,  32, 100, 101, 115, // vg> `,.  des\n 107, 116, 111, 112,  58,  32, 112, 114, 111, 112, 115,  32, // ktop: props \n  61,  62,  32, 104, 116, 109, 108,  96,  60, 115, 118, 103, // => html`<svg\n  32,  99, 108,  97, 115, 115,  61,  36, 123, 112, 114, 111, //  class=${pro\n 112, 115,  46,  99, 108,  97, 115, 115, 125,  32, 120, 109, // ps.class} xm\n 108, 110, 115,  61,  34, 104, 116, 116, 112,  58,  47,  47, // lns=\"http://\n 119, 119, 119,  46, 119,  51,  46, 111, 114, 103,  47,  50, // www.w3.org/2\n  48,  48,  48,  47, 115, 118, 103,  34,  32, 102, 105, 108, // 000/svg\" fil\n 108,  61,  34, 110, 111, 110, 101,  34,  32, 118, 105, 101, // l=\"none\" vie\n 119,  66, 111, 120,  61,  34,  48,  32,  48,  32,  50,  52, // wBox=\"0 0 24\n  32,  50,  52,  34,  32, 115, 116, 114, 111, 107, 101,  45, //  24\" stroke-\n 119, 105, 100, 116, 104,  61,  34,  49,  46,  53,  34,  32, // width=\"1.5\" \n 115, 116, 114, 111, 107, 101,  61,  34,  99, 117, 114, 114, // stroke=\"curr\n 101, 110, 116,  67, 111, 108, 111, 114,  34,  62,  32,  60, // entColor\"> <\n 112,  97, 116, 104,  32, 115, 116, 114, 111, 107, 101,  45, // path stroke-\n 108, 105, 110, 101,  99,  97, 112,  61,  34, 114, 111, 117, // linecap=\"rou\n 110, 100,  34,  32, 115, 116, 114, 111, 107, 101,  45, 108, // nd\" stroke-l\n 105, 110, 101, 106, 111, 105, 110,  61,  34, 114, 111, 117, // inejoin=\"rou\n 110, 100,  34,  32, 100,  61,  34,  77,  57,  32,  49,  55, // nd\" d=\"M9 17\n  46,  50,  53, 118,  49,  46,  48,  48,  55,  97,  51,  32, // .25v1.007a3 \n  51,  32,  48,  32,  48,  49,  45,  46,  56,  55,  57,  32, // 3 0 01-.879 \n  50,  46,  49,  50,  50,  76,  55,  46,  53,  32,  50,  49, // 2.122L7.5 21\n 104,  57, 108,  45,  46,  54,  50,  49,  45,  46,  54,  50, // h9l-.621-.62\n  49,  65,  51,  32,  51,  32,  48,  32,  48,  49,  49,  53, // 1A3 3 0 0115\n  32,  49,  56,  46,  50,  53,  55,  86,  49,  55,  46,  50, //  18.257V17.2\n  53, 109,  54,  45,  49,  50,  86,  49,  53,  97,  50,  46, // 5m6-12V15a2.\n  50,  53,  32,  50,  46,  50,  53,  32,  48,  32,  48,  49, // 25 2.25 0 01\n  45,  50,  46,  50,  53,  32,  50,  46,  50,  53,  72,  53, // -2.25 2.25H5\n  46,  50,  53,  65,  50,  46,  50,  53,  32,  50,  46,  50, // .25A2.25 2.2\n  53,  32,  48,  32,  48,  49,  51,  32,  49,  53,  86,  53, // 5 0 013 15V5\n  46,  50,  53, 109,  49,  56,  32,  48,  65,  50,  46,  50, // .25m18 0A2.2\n  53,  32,  50,  46,  50,  53,  32,  48,  32,  48,  48,  49, // 5 2.25 0 001\n  56,  46,  55,  53,  32,  51,  72,  53,  46,  50,  53,  65, // 8.75 3H5.25A\n  50,  46,  50,  53,  32,  50,  46,  50,  53,  32,  48,  32, // 2.25 2.25 0 \n  48,  48,  51,  32,  53,  46,  50,  53, 109,  49,  56,  32, // 003 5.25m18 \n  48,  86,  49,  50,  97,  50,  46,  50,  53,  32,  50,  46, // 0V12a2.25 2.\n  50,  53,  32,  48,  32,  48,  49,  45,  50,  46,  50,  53, // 25 0 01-2.25\n  32,  50,  46,  50,  53,  72,  53,  46,  50,  53,  65,  50, //  2.25H5.25A2\n  46,  50,  53,  32,  50,  46,  50,  53,  32,  48,  32,  48, // .25 2.25 0 0\n  49,  51,  32,  49,  50,  86,  53,  46,  50,  53,  34,  32, // 13 12V5.25\" \n  47,  62,  32,  60,  47, 115, 118, 103,  62,  96,  44,  10, // /> </svg>`,.\n  32,  32,  97, 108, 101, 114, 116,  58,  32, 112, 114, 111, //   alert: pro\n 112, 115,  32,  61,  62,  32, 104, 116, 109, 108,  96,  60, // ps => html`<\n 115, 118, 103,  32,  99, 108,  97, 115, 115,  61,  36, 123, // svg class=${\n 112, 114, 111, 112, 115,  46,  99, 108,  97, 115, 115, 125, // props.class}\n  32, 120, 109, 108, 110, 115,  61,  34, 104, 116, 116, 112, //  xmlns=\"http\n  58,  47,  47, 119, 119, 119,  46, 119,  51,  46, 111, 114, // ://www.w3.or\n 103,  47,  50,  48,  48,  48,  47, 115, 118, 103,  34,  32, // g/2000/svg\" \n 102, 105, 108, 108,  61,  34, 110, 111, 110, 101,  34,  32, // fill=\"none\" \n 118, 105, 101, 119,  66, 111, 120,  61,  34,  48,  32,  48, // viewBox=\"0 0\n  32,  50,  52,  32,  50,  52,  34,  32, 115, 116, 114, 111, //  24 24\" stro\n 107, 101,  45, 119, 105, 100, 116, 104,  61,  34,  49,  46, // ke-width=\"1.\n  53,  34,  32, 115, 116, 114, 111, 107, 101,  61,  34,  99, // 5\" stroke=\"c\n 117, 114, 114, 101, 110, 116,  67, 111, 108, 111, 114,  34, // urrentColor\"\n  62,  32,  60, 112,  97, 116, 104,  32, 115, 116, 114, 111, // > <path stro\n 107, 101,  45, 108, 105, 110, 101,  99,  97, 112,  61,  34, // ke-linecap=\"\n 114, 111, 117, 110, 100,  34,  32, 115, 116, 114, 111, 107, // round\" strok\n 101,  45, 108, 105, 110, 101, 106, 111, 105, 110,  61,  34, // e-linejoin=\"\n 114, 111, 117, 110, 100,  34,  32, 100,  61,  34,  77,  49, // round\" d=\"M1\n  52,  46,  56,  53,  55,  32,  49,  55,  46,  48,  56,  50, // 4.857 17.082\n  97,  50,  51,  46,  56,  52,  56,  32,  50,  51,  46,  56, // a23.848 23.8\n  52,  56,  32,  48,  32,  48,  48,  53,  46,  52,  53,  52, // 48 0 005.454\n  45,  49,  46,  51,  49,  65,  56,  46,  57,  54,  55,  32, // -1.31A8.967 \n  56,  46,  57,  54,  55,  32,  48,  32,  48,  49,  49,  56, // 8.967 0 0118\n  32,  57,  46,  55,  53, 118,  45,  46,  55,  86,  57,  65, //  9.75v-.7V9A\n  54,  32,  54,  32,  48,  32,  48,  48,  54,  32,  57, 118, // 6 6 0 006 9v\n  46,  55,  53,  97,  56,  46,  57,  54,  55,  32,  56,  46, // .75a8.967 8.\n  57,  54,  55,  32,  48,  32,  48,  49,  45,  50,  46,  51, // 967 0 01-2.3\n  49,  50,  32,  54,  46,  48,  50,  50,  99,  49,  46,  55, // 12 6.022c1.7\n  51,  51,  46,  54,  52,  32,  51,  46,  53,  54,  32,  49, // 33.64 3.56 1\n  46,  48,  56,  53,  32,  53,  46,  52,  53,  53,  32,  49, // .085 5.455 1\n  46,  51,  49, 109,  53,  46,  55,  49,  52,  32,  48,  97, // .31m5.714 0a\n  50,  52,  46,  50,  53,  53,  32,  50,  52,  46,  50,  53, // 24.255 24.25\n  53,  32,  48,  32,  48,  49,  45,  53,  46,  55,  49,  52, // 5 0 01-5.714\n  32,  48, 109,  53,  46,  55,  49,  52,  32,  48,  97,  51, //  0m5.714 0a3\n  32,  51,  32,  48,  32,  49,  49,  45,  53,  46,  55,  49, //  3 0 11-5.71\n  52,  32,  48,  77,  51,  46,  49,  50,  52,  32,  55,  46, // 4 0M3.124 7.\n  53,  65,  56,  46,  57,  54,  57,  32,  56,  46,  57,  54, // 5A8.969 8.96\n  57,  32,  48,  32,  48,  49,  53,  46,  50,  57,  50,  32, // 9 0 015.292 \n  51, 109,  49,  51,  46,  52,  49,  54,  32,  48,  97,  56, // 3m13.416 0a8\n  46,  57,  54,  57,  32,  56,  46,  57,  54,  57,  32,  48, // .969 8.969 0\n  32,  48,  49,  50,  46,  49,  54,  56,  32,  52,  46,  53, //  012.168 4.5\n  34,  32,  47,  62,  32,  60,  47, 115, 118, 103,  62,  96, // \" /> </svg>`\n  44,  10,  32,  32,  98, 101, 108, 108,  58,  32, 112, 114, // ,.  bell: pr\n 111, 112, 115,  32,  61,  62,  32, 104, 116, 109, 108,  96, // ops => html`\n  60, 115, 118, 103,  32,  99, 108,  97, 115, 115,  61,  36, // <svg class=$\n 123, 112, 114, 111, 112, 115,  46,  99, 108,  97, 115, 115, // {props.class\n 125,  32, 120, 109, 108, 110, 115,  61,  34, 104, 116, 116, // } xmlns=\"htt\n 112,  58,  47,  47, 119, 119, 119,  46, 119,  51,  46, 111, // p://www.w3.o\n 114, 103,  47,  50,  48,  48,  48,  47, 115, 118, 103,  34, // rg/2000/svg\"\n  32, 102, 105, 108, 108,  61,  34, 110, 111, 110, 101,  34, //  fill=\"none\"\n  32, 118, 105, 101, 119,  66, 111, 120,  61,  34,  48,  32, //  viewBox=\"0 \n  48,  32,  50,  52,  32,  50,  52,  34,  32, 115, 116, 114, // 0 24 24\" str\n 111, 107, 101,  45, 119, 105, 100, 116, 104,  61,  34,  49, // oke-width=\"1\n  46,  53,  34,  32, 115, 116, 114, 111, 107, 101,  61,  34, // .5\" stroke=\"\n  99, 117, 114, 114, 101, 110, 116,  67, 111, 108, 111, 114, // currentColor\n  34,  62,  32,  60, 112,  97, 116, 104,  32, 115, 116, 114, // \"> <path str\n 111, 107, 101,  45, 108, 105, 110, 101,  99,  97, 112,  61, // oke-linecap=\n  34, 114, 111, 117, 110, 100,  34,  32, 115, 116, 114, 111, // \"round\" stro\n 107, 101,  45, 108, 105, 110, 101, 106, 111, 105, 110,  61, // ke-linejoin=\n  34, 114, 111, 117, 110, 100,  34,  32, 100,  61,  34,  77, // \"round\" d=\"M\n  49,  52,  46,  56,  53,  55,  32,  49,  55,  46,  48,  56, // 14.857 17.08\n  50,  97,  50,  51,  46,  56,  52,  56,  32,  50,  51,  46, // 2a23.848 23.\n  56,  52,  56,  32,  48,  32,  48,  48,  53,  46,  52,  53, // 848 0 005.45\n  52,  45,  49,  46,  51,  49,  65,  56,  46,  57,  54,  55, // 4-1.31A8.967\n  32,  56,  46,  57,  54,  55,  32,  48,  32,  48,  49,  49, //  8.967 0 011\n  56,  32,  57,  46,  55,  53, 118,  45,  46,  55,  86,  57, // 8 9.75v-.7V9\n  65,  54,  32,  54,  32,  48,  32,  48,  48,  54,  32,  57, // A6 6 0 006 9\n 118,  46,  55,  53,  97,  56,  46,  57,  54,  55,  32,  56, // v.75a8.967 8\n  46,  57,  54,  55,  32,  48,  32,  48,  49,  45,  50,  46, // .967 0 01-2.\n  51,  49,  50,  32,  54,  46,  48,  50,  50,  99,  49,  46, // 312 6.022c1.\n  55,  51,  51,  46,  54,  52,  32,  51,  46,  53,  54,  32, // 733.64 3.56 \n  49,  46,  48,  56,  53,  32,  53,  46,  52,  53,  53,  32, // 1.085 5.455 \n  49,  46,  51,  49, 109,  53,  46,  55,  49,  52,  32,  48, // 1.31m5.714 0\n  97,  50,  52,  46,  50,  53,  53,  32,  50,  52,  46,  50, // a24.255 24.2\n  53,  53,  32,  48,  32,  48,  49,  45,  53,  46,  55,  49, // 55 0 01-5.71\n  52,  32,  48, 109,  53,  46,  55,  49,  52,  32,  48,  97, // 4 0m5.714 0a\n  51,  32,  51,  32,  48,  32,  49,  49,  45,  53,  46,  55, // 3 3 0 11-5.7\n  49,  52,  32,  48,  77,  51,  46,  49,  50,  52,  32,  55, // 14 0M3.124 7\n  46,  53,  65,  56,  46,  57,  54,  57,  32,  56,  46,  57, // .5A8.969 8.9\n  54,  57,  32,  48,  32,  48,  49,  53,  46,  50,  57,  50, // 69 0 015.292\n  32,  51, 109,  49,  51,  46,  52,  49,  54,  32,  48,  97, //  3m13.416 0a\n  56,  46,  57,  54,  57,  32,  56,  46,  57,  54,  57,  32, // 8.969 8.969 \n  48,  32,  48,  49,  50,  46,  49,  54,  56,  32,  52,  46, // 0 012.168 4.\n  53,  34,  32,  47,  62,  32,  60,  47, 115, 118, 103,  62, // 5\" /> </svg>\n  96,  44,  10,  32,  32, 114, 101, 102, 114, 101, 115, 104, // `,.  refresh\n  58,  32, 112, 114, 111, 112, 115,  32,  61,  62,  32, 104, // : props => h\n 116, 109, 108,  96,  60, 115, 118, 103,  32,  99, 108,  97, // tml`<svg cla\n 115, 115,  61,  36, 123, 112, 114, 111, 112, 115,  46,  99, // ss=${props.c\n 108,  97, 115, 115, 125,  32, 120, 109, 108, 110, 115,  61, // lass} xmlns=\n  34, 104, 116, 116, 112,  58,  47,  47, 119, 119, 119,  46, // \"http://www.\n 119,  51,  46, 111, 114, 103,  47,  50,  48,  48,  48,  47, // w3.org/2000/\n 115, 118, 103,  34,  32, 102, 105, 108, 108,  61,  34, 110, // svg\" fill=\"n\n 111, 110, 101,  34,  32, 118, 105, 101, 119,  66, 111, 120, // one\" viewBox\n  61,  34,  48,  32,  48,  32,  50,  52,  32,  50,  52,  34, // =\"0 0 24 24\"\n  32, 115, 116, 114, 111, 107, 101,  45, 119, 105, 100, 116, //  stroke-widt\n 104,  61,  34,  49,  46,  53,  34,  32, 115, 116, 114, 111, // h=\"1.5\" stro\n 107, 101,  61,  34,  99, 117, 114, 114, 101, 110, 116,  67, // ke=\"currentC\n 111, 108, 111, 114,  34,  62,  32,  60, 112,  97, 116, 104, // olor\"> <path\n  32, 115, 116, 114, 111, 107, 101,  45, 108, 105, 110, 101, //  stroke-line\n  99,  97, 112,  61,  34, 114, 111, 117, 110, 100,  34,  32, // cap=\"round\" \n 115, 116, 114, 111, 107, 101,  45, 108, 105, 110, 101, 106, // stroke-linej\n 111, 105, 110,  61,  34, 114, 111, 117, 110, 100,  34,  32, // oin=\"round\" \n 100,  61,  34,  77,  49,  54,  46,  48,  50,  51,  32,  57, // d=\"M16.023 9\n  46,  51,  52,  56, 104,  52,  46,  57,  57,  50, 118,  45, // .348h4.992v-\n  46,  48,  48,  49,  77,  50,  46,  57,  56,  53,  32,  49, // .001M2.985 1\n  57,  46,  54,  52,  52, 118,  45,  52,  46,  57,  57,  50, // 9.644v-4.992\n 109,  48,  32,  48, 104,  52,  46,  57,  57,  50, 109,  45, // m0 0h4.992m-\n  52,  46,  57,  57,  51,  32,  48, 108,  51,  46,  49,  56, // 4.993 0l3.18\n  49,  32,  51,  46,  49,  56,  51,  97,  56,  46,  50,  53, // 1 3.183a8.25\n  32,  56,  46,  50,  53,  32,  48,  32,  48,  48,  49,  51, //  8.25 0 0013\n  46,  56,  48,  51,  45,  51,  46,  55,  77,  52,  46,  48, // .803-3.7M4.0\n  51,  49,  32,  57,  46,  56,  54,  53,  97,  56,  46,  50, // 31 9.865a8.2\n  53,  32,  56,  46,  50,  53,  32,  48,  32,  48,  49,  49, // 5 8.25 0 011\n  51,  46,  56,  48,  51,  45,  51,  46,  55, 108,  51,  46, // 3.803-3.7l3.\n  49,  56,  49,  32,  51,  46,  49,  56,  50, 109,  48,  45, // 181 3.182m0-\n  52,  46,  57,  57,  49, 118,  52,  46,  57,  57,  34,  32, // 4.991v4.99\" \n  47,  62,  32,  60,  47, 115, 118, 103,  62,  32,  96,  44, // /> </svg> `,\n  10,  32,  32,  98,  97, 114, 115,  52,  58,  32, 112, 114, // .  bars4: pr\n 111, 112, 115,  32,  61,  62,  32, 104, 116, 109, 108,  96, // ops => html`\n  60, 115, 118, 103,  32,  99, 108,  97, 115, 115,  61,  36, // <svg class=$\n 123, 112, 114, 111, 112, 115,  46,  99, 108,  97, 115, 115, // {props.class\n 125,  32, 120, 109, 108, 110, 115,  61,  34, 104, 116, 116, // } xmlns=\"htt\n 112,  58,  47,  47, 119, 119, 119,  46, 119,  51,  46, 111, // p://www.w3.o\n 114, 103,  47,  50,  48,  48,  48,  47, 115, 118, 103,  34, // rg/2000/svg\"\n  32, 102, 105, 108, 108,  61,  34, 110, 111, 110, 101,  34, //  fill=\"none\"\n  32, 118, 105, 101, 119,  66, 111, 120,  61,  34,  48,  32, //  viewBox=\"0 \n  48,  32,  50,  52,  32,  50,  52,  34,  32, 115, 116, 114, // 0 24 24\" str\n 111, 107, 101,  45, 119, 105, 100, 116, 104,  61,  34,  49, // oke-width=\"1\n  46,  53,  34,  32, 115, 116, 114, 111, 107, 101,  61,  34, // .5\" stroke=\"\n  99, 117, 114, 114, 101, 110, 116,  67, 111, 108, 111, 114, // currentColor\n  34,  62,  32,  60, 112,  97, 116, 104,  32, 115, 116, 114, // \"> <path str\n 111, 107, 101,  45, 108, 105, 110, 101,  99,  97, 112,  61, // oke-linecap=\n  34, 114, 111, 117, 110, 100,  34,  32, 115, 116, 114, 111, // \"round\" stro\n 107, 101,  45, 108, 105, 110, 101, 106, 111, 105, 110,  61, // ke-linejoin=\n  34, 114, 111, 117, 110, 100,  34,  32, 100,  61,  34,  77, // \"round\" d=\"M\n  51,  46,  55,  53,  32,  53,  46,  50,  53, 104,  49,  54, // 3.75 5.25h16\n  46,  53, 109,  45,  49,  54,  46,  53,  32,  52,  46,  53, // .5m-16.5 4.5\n 104,  49,  54,  46,  53, 109,  45,  49,  54,  46,  53,  32, // h16.5m-16.5 \n  52,  46,  53, 104,  49,  54,  46,  53, 109,  45,  49,  54, // 4.5h16.5m-16\n  46,  53,  32,  52,  46,  53, 104,  49,  54,  46,  53,  34, // .5 4.5h16.5\"\n  32,  47,  62,  32,  60,  47, 115, 118, 103,  62,  96,  44, //  /> </svg>`,\n  10,  32,  32,  98,  97, 114, 115,  51,  58,  32, 112, 114, // .  bars3: pr\n 111, 112, 115,  32,  61,  62,  32, 104, 116, 109, 108,  96, // ops => html`\n  60, 115, 118, 103,  32,  99, 108,  97, 115, 115,  61,  36, // <svg class=$\n 123, 112, 114, 111, 112, 115,  46,  99, 108,  97, 115, 115, // {props.class\n 125,  32, 120, 109, 108, 110, 115,  61,  34, 104, 116, 116, // } xmlns=\"htt\n 112,  58,  47,  47, 119, 119, 119,  46, 119,  51,  46, 111, // p://www.w3.o\n 114, 103,  47,  50,  48,  48,  48,  47, 115, 118, 103,  34, // rg/2000/svg\"\n  32, 102, 105, 108, 108,  61,  34, 110, 111, 110, 101,  34, //  fill=\"none\"\n  32, 118, 105, 101, 119,  66, 111, 120,  61,  34,  48,  32, //  viewBox=\"0 \n  48,  32,  50,  52,  32,  50,  52,  34,  32, 115, 116, 114, // 0 24 24\" str\n 111, 107, 101,  45, 119, 105, 100, 116, 104,  61,  34,  49, // oke-width=\"1\n  46,  53,  34,  32, 115, 116, 114, 111, 107, 101,  61,  34, // .5\" stroke=\"\n  99, 117, 114, 114, 101, 110, 116,  67, 111, 108, 111, 114, // currentColor\n  34,  62,  32,  60, 112,  97, 116, 104,  32, 115, 116, 114, // \"> <path str\n 111, 107, 101,  45, 108, 105, 110, 101,  99,  97, 112,  61, // oke-linecap=\n  34, 114, 111, 117, 110, 100,  34,  32, 115, 116, 114, 111, // \"round\" stro\n 107, 101,  45, 108, 105, 110, 101, 106, 111, 105, 110,  61, // ke-linejoin=\n  34, 114, 111, 117, 110, 100,  34,  32, 100,  61,  34,  77, // \"round\" d=\"M\n  51,  46,  55,  53,  32,  54,  46,  55,  53, 104,  49,  54, // 3.75 6.75h16\n  46,  53,  77,  51,  46,  55,  53,  32,  49,  50, 104,  49, // .5M3.75 12h1\n  54,  46,  53, 109,  45,  49,  54,  46,  53,  32,  53,  46, // 6.5m-16.5 5.\n  50,  53, 104,  49,  54,  46,  53,  34,  32,  47,  62,  32, // 25h16.5\" /> \n  60,  47, 115, 118, 103,  62,  96,  44,  10,  32,  32, 108, // </svg>`,.  l\n 111, 103, 111, 117, 116,  58,  32, 112, 114, 111, 112, 115, // ogout: props\n  32,  61,  62,  32, 104, 116, 109, 108,  96,  60, 115, 118, //  => html`<sv\n 103,  32,  99, 108,  97, 115, 115,  61,  36, 123, 112, 114, // g class=${pr\n 111, 112, 115,  46,  99, 108,  97, 115, 115, 125,  32, 120, // ops.class} x\n 109, 108, 110, 115,  61,  34, 104, 116, 116, 112,  58,  47, // mlns=\"http:/\n  47, 119, 119, 119,  46, 119,  51,  46, 111, 114, 103,  47, // /www.w3.org/\n  50,  48,  48,  48,  47, 115, 118, 103,  34,  32, 102, 105, // 2000/svg\" fi\n 108, 108,  61,  34, 110, 111, 110, 101,  34,  32, 118, 105, // ll=\"none\" vi\n 101, 119,  66, 111, 120,  61,  34,  48,  32,  48,  32,  50, // ewBox=\"0 0 2\n  52,  32,  50,  52,  34,  32, 115, 116, 114, 111, 107, 101, // 4 24\" stroke\n  45, 119, 105, 100, 116, 104,  61,  34,  49,  46,  53,  34, // -width=\"1.5\"\n  32, 115, 116, 114, 111, 107, 101,  61,  34,  99, 117, 114, //  stroke=\"cur\n 114, 101, 110, 116,  67, 111, 108, 111, 114,  34,  62,  32, // rentColor\"> \n  60, 112,  97, 116, 104,  32, 115, 116, 114, 111, 107, 101, // <path stroke\n  45, 108, 105, 110, 101,  99,  97, 112,  61,  34, 114, 111, // -linecap=\"ro\n 117, 110, 100,  34,  32, 115, 116, 114, 111, 107, 101,  45, // und\" stroke-\n 108, 105, 110, 101, 106, 111, 105, 110,  61,  34, 114, 111, // linejoin=\"ro\n 117, 110, 100,  34,  32, 100,  61,  34,  77,  49,  50,  46, // und\" d=\"M12.\n  55,  53,  32,  49,  53, 108,  51,  45,  51, 109,  48,  32, // 75 15l3-3m0 \n  48, 108,  45,  51,  45,  51, 109,  51,  32,  51, 104,  45, // 0l-3-3m3 3h-\n  55,  46,  53,  77,  50,  49,  32,  49,  50,  97,  57,  32, // 7.5M21 12a9 \n  57,  32,  48,  32,  49,  49,  45,  49,  56,  32,  48,  32, // 9 0 11-18 0 \n  57,  32,  57,  32,  48,  32,  48,  49,  49,  56,  32,  48, // 9 9 0 0118 0\n 122,  34,  32,  47,  62,  32,  60,  47, 115, 118, 103,  62, // z\" /> </svg>\n  96,  44,  10,  32,  32, 115,  97, 118, 101,  58,  32, 112, // `,.  save: p\n 114, 111, 112, 115,  32,  61,  62,  32, 104, 116, 109, 108, // rops => html\n  96,  60, 115, 118, 103,  32,  99, 108,  97, 115, 115,  61, // `<svg class=\n  36, 123, 112, 114, 111, 112, 115,  46,  99, 108,  97, 115, // ${props.clas\n 115, 125,  32, 120, 109, 108, 110, 115,  61,  34, 104, 116, // s} xmlns=\"ht\n 116, 112,  58,  47,  47, 119, 119, 119,  46, 119,  51,  46, // tp://www.w3.\n 111, 114, 103,  47,  50,  48,  48,  48,  47, 115, 118, 103, // org/2000/svg\n  34,  32, 102, 105, 108, 108,  61,  34, 110, 111, 110, 101, // \" fill=\"none\n  34,  32, 118, 105, 101, 119,  66, 111, 120,  61,  34,  48, // \" viewBox=\"0\n  32,  48,  32,  50,  52,  32,  50,  52,  34,  32, 115, 116, //  0 24 24\" st\n 114, 111, 107, 101,  45, 119, 105, 100, 116, 104,  61,  34, // roke-width=\"\n  49,  46,  53,  34,  32, 115, 116, 114, 111, 107, 101,  61, // 1.5\" stroke=\n  34,  99, 117, 114, 114, 101, 110, 116,  67, 111, 108, 111, // \"currentColo\n 114,  34,  62,  32,  60, 112,  97, 116, 104,  32, 115, 116, // r\"> <path st\n 114, 111, 107, 101,  45, 108, 105, 110, 101,  99,  97, 112, // roke-linecap\n  61,  34, 114, 111, 117, 110, 100,  34,  32, 115, 116, 114, // =\"round\" str\n 111, 107, 101,  45, 108, 105, 110, 101, 106, 111, 105, 110, // oke-linejoin\n  61,  34, 114, 111, 117, 110, 100,  34,  32, 100,  61,  34, // =\"round\" d=\"\n  77,  49,  54,  46,  53,  32,  51,  46,  55,  53,  86,  49, // M16.5 3.75V1\n  54,  46,  53,  76,  49,  50,  32,  49,  52,  46,  50,  53, // 6.5L12 14.25\n  32,  55,  46,  53,  32,  49,  54,  46,  53,  86,  51,  46, //  7.5 16.5V3.\n  55,  53, 109,  57,  32,  48,  72,  49,  56,  65,  50,  46, // 75m9 0H18A2.\n  50,  53,  32,  50,  46,  50,  53,  32,  48,  32,  48,  49, // 25 2.25 0 01\n  50,  48,  46,  50,  53,  32,  54, 118,  49,  50,  65,  50, // 20.25 6v12A2\n  46,  50,  53,  32,  50,  46,  50,  53,  32,  48,  32,  48, // .25 2.25 0 0\n  49,  49,  56,  32,  50,  48,  46,  50,  53,  72,  54,  65, // 118 20.25H6A\n  50,  46,  50,  53,  32,  50,  46,  50,  53,  32,  48,  32, // 2.25 2.25 0 \n  48,  49,  51,  46,  55,  53,  32,  49,  56,  86,  54,  65, // 013.75 18V6A\n  50,  46,  50,  53,  32,  50,  46,  50,  53,  32,  48,  32, // 2.25 2.25 0 \n  48,  49,  54,  32,  51,  46,  55,  53, 104,  49,  46,  53, // 016 3.75h1.5\n 109,  57,  32,  48, 104,  45,  57,  34,  32,  47,  62,  32, // m9 0h-9\" /> \n  60,  47, 115, 118, 103,  62,  96,  44,  10,  32,  32, 101, // </svg>`,.  e\n 109,  97, 105, 108,  58,  32, 112, 114, 111, 112, 115,  32, // mail: props \n  61,  62,  32, 104, 116, 109, 108,  96,  60, 115, 118, 103, // => html`<svg\n  32,  99, 108,  97, 115, 115,  61,  36, 123, 112, 114, 111, //  class=${pro\n 112, 115,  46,  99, 108,  97, 115, 115, 125,  32, 120, 109, // ps.class} xm\n 108, 110, 115,  61,  34, 104, 116, 116, 112,  58,  47,  47, // lns=\"http://\n 119, 119, 119,  46, 119,  51,  46, 111, 114, 103,  47,  50, // www.w3.org/2\n  48,  48,  48,  47, 115, 118, 103,  34,  32, 102, 105, 108, // 000/svg\" fil\n 108,  61,  34, 110, 111, 110, 101,  34,  32, 118, 105, 101, // l=\"none\" vie\n 119,  66, 111, 120,  61,  34,  48,  32,  48,  32,  50,  52, // wBox=\"0 0 24\n  32,  50,  52,  34,  32, 115, 116, 114, 111, 107, 101,  45, //  24\" stroke-\n 119, 105, 100, 116, 104,  61,  34,  49,  46,  53,  34,  32, // width=\"1.5\" \n 115, 116, 114, 111, 107, 101,  61,  34,  99, 117, 114, 114, // stroke=\"curr\n 101, 110, 116,  67, 111, 108, 111, 114,  34,  62,  32,  60, // entColor\"> <\n 112,  97, 116, 104,  32, 115, 116, 114, 111, 107, 101,  45, // path stroke-\n 108, 105, 110, 101,  99,  97, 112,  61,  34, 114, 111, 117, // linecap=\"rou\n 110, 100,  34,  32, 115, 116, 114, 111, 107, 101,  45, 108, // nd\" stroke-l\n 105, 110, 101, 106, 111, 105, 110,  61,  34, 114, 111, 117, // inejoin=\"rou\n 110, 100,  34,  32, 100,  61,  34,  77,  50,  49,  46,  55, // nd\" d=\"M21.7\n  53,  32,  54,  46,  55,  53, 118,  49,  48,  46,  53,  97, // 5 6.75v10.5a\n  50,  46,  50,  53,  32,  50,  46,  50,  53,  32,  48,  32, // 2.25 2.25 0 \n  48,  49,  45,  50,  46,  50,  53,  32,  50,  46,  50,  53, // 01-2.25 2.25\n 104,  45,  49,  53,  97,  50,  46,  50,  53,  32,  50,  46, // h-15a2.25 2.\n  50,  53,  32,  48,  32,  48,  49,  45,  50,  46,  50,  53, // 25 0 01-2.25\n  45,  50,  46,  50,  53,  86,  54,  46,  55,  53, 109,  49, // -2.25V6.75m1\n  57,  46,  53,  32,  48,  65,  50,  46,  50,  53,  32,  50, // 9.5 0A2.25 2\n  46,  50,  53,  32,  48,  32,  48,  48,  49,  57,  46,  53, // .25 0 0019.5\n  32,  52,  46,  53, 104,  45,  49,  53,  97,  50,  46,  50, //  4.5h-15a2.2\n  53,  32,  50,  46,  50,  53,  32,  48,  32,  48,  48,  45, // 5 2.25 0 00-\n  50,  46,  50,  53,  32,  50,  46,  50,  53, 109,  49,  57, // 2.25 2.25m19\n  46,  53,  32,  48, 118,  46,  50,  52,  51,  97,  50,  46, // .5 0v.243a2.\n  50,  53,  32,  50,  46,  50,  53,  32,  48,  32,  48,  49, // 25 2.25 0 01\n  45,  49,  46,  48,  55,  32,  49,  46,  57,  49,  54, 108, // -1.07 1.916l\n  45,  55,  46,  53,  32,  52,  46,  54,  49,  53,  97,  50, // -7.5 4.615a2\n  46,  50,  53,  32,  50,  46,  50,  53,  32,  48,  32,  48, // .25 2.25 0 0\n  49,  45,  50,  46,  51,  54,  32,  48,  76,  51,  46,  51, // 1-2.36 0L3.3\n  50,  32,  56,  46,  57,  49,  97,  50,  46,  50,  53,  32, // 2 8.91a2.25 \n  50,  46,  50,  53,  32,  48,  32,  48,  49,  45,  49,  46, // 2.25 0 01-1.\n  48,  55,  45,  49,  46,  57,  49,  54,  86,  54,  46,  55, // 07-1.916V6.7\n  53,  34,  32,  47,  62,  32,  60,  47, 115, 118, 103,  62, // 5\" /> </svg>\n  96,  44,  10,  32,  32, 101, 120, 112,  97, 110, 100,  58, // `,.  expand:\n  32, 112, 114, 111, 112, 115,  32,  61,  62,  32, 104, 116, //  props => ht\n 109, 108,  96,  60, 115, 118, 103,  32,  99, 108,  97, 115, // ml`<svg clas\n 115,  61,  36, 123, 112, 114, 111, 112, 115,  46,  99, 108, // s=${props.cl\n  97, 115, 115, 125,  32, 120, 109, 108, 110, 115,  61,  34, // ass} xmlns=\"\n 104, 116, 116, 112,  58,  47,  47, 119, 119, 119,  46, 119, // http://www.w\n  51,  46, 111, 114, 103,  47,  50,  48,  48,  48,  47, 115, // 3.org/2000/s\n 118, 103,  34,  32, 102, 105, 108, 108,  61,  34, 110, 111, // vg\" fill=\"no\n 110, 101,  34,  32, 118, 105, 101, 119,  66, 111, 120,  61, // ne\" viewBox=\n  34,  48,  32,  48,  32,  50,  52,  32,  50,  52,  34,  32, // \"0 0 24 24\" \n 115, 116, 114, 111, 107, 101,  45, 119, 105, 100, 116, 104, // stroke-width\n  61,  34,  49,  46,  53,  34,  32, 115, 116, 114, 111, 107, // =\"1.5\" strok\n 101,  61,  34,  99, 117, 114, 114, 101, 110, 116,  67, 111, // e=\"currentCo\n 108, 111, 114,  34,  62,  32,  60, 112,  97, 116, 104,  32, // lor\"> <path \n 115, 116, 114, 111, 107, 101,  45, 108, 105, 110, 101,  99, // stroke-linec\n  97, 112,  61,  34, 114, 111, 117, 110, 100,  34,  32, 115, // ap=\"round\" s\n 116, 114, 111, 107, 101,  45, 108, 105, 110, 101, 106, 111, // troke-linejo\n 105, 110,  61,  34, 114, 111, 117, 110, 100,  34,  32, 100, // in=\"round\" d\n  61,  34,  77,  51,  46,  55,  53,  32,  51,  46,  55,  53, // =\"M3.75 3.75\n 118,  52,  46,  53, 109,  48,  45,  52,  46,  53, 104,  52, // v4.5m0-4.5h4\n  46,  53, 109,  45,  52,  46,  53,  32,  48,  76,  57,  32, // .5m-4.5 0L9 \n  57,  77,  51,  46,  55,  53,  32,  50,  48,  46,  50,  53, // 9M3.75 20.25\n 118,  45,  52,  46,  53, 109,  48,  32,  52,  46,  53, 104, // v-4.5m0 4.5h\n  52,  46,  53, 109,  45,  52,  46,  53,  32,  48,  76,  57, // 4.5m-4.5 0L9\n  32,  49,  53,  77,  50,  48,  46,  50,  53,  32,  51,  46, //  15M20.25 3.\n  55,  53, 104,  45,  52,  46,  53, 109,  52,  46,  53,  32, // 75h-4.5m4.5 \n  48, 118,  52,  46,  53, 109,  48,  45,  52,  46,  53,  76, // 0v4.5m0-4.5L\n  49,  53,  32,  57, 109,  53,  46,  50,  53,  32,  49,  49, // 15 9m5.25 11\n  46,  50,  53, 104,  45,  52,  46,  53, 109,  52,  46,  53, // .25h-4.5m4.5\n  32,  48, 118,  45,  52,  46,  53, 109,  48,  32,  52,  46, //  0v-4.5m0 4.\n  53,  76,  49,  53,  32,  49,  53,  34,  32,  47,  62,  32, // 5L15 15\" /> \n  60,  47, 115, 118, 103,  62,  96,  44,  10,  32,  32, 115, // </svg>`,.  s\n 104, 114, 105, 110, 107,  58,  32, 112, 114, 111, 112, 115, // hrink: props\n  32,  61,  62,  32, 104, 116, 109, 108,  96,  60, 115, 118, //  => html`<sv\n 103,  32,  99, 108,  97, 115, 115,  61,  36, 123, 112, 114, // g class=${pr\n 111, 112, 115,  46,  99, 108,  97, 115, 115, 125,  32, 120, // ops.class} x\n 109, 108, 110, 115,  61,  34, 104, 116, 116, 112,  58,  47, // mlns=\"http:/\n  47, 119, 119, 119,  46, 119,  51,  46, 111, 114, 103,  47, // /www.w3.org/\n  50,  48,  48,  48,  47, 115, 118, 103,  34,  32, 102, 105, // 2000/svg\" fi\n 108, 108,  61,  34, 110, 111, 110, 101,  34,  32, 118, 105, // ll=\"none\" vi\n 101, 119,  66, 111, 120,  61,  34,  48,  32,  48,  32,  50, // ewBox=\"0 0 2\n  52,  32,  50,  52,  34,  32, 115, 116, 114, 111, 107, 101, // 4 24\" stroke\n  45, 119, 105, 100, 116, 104,  61,  34,  49,  46,  53,  34, // -width=\"1.5\"\n  32, 115, 116, 114, 111, 107, 101,  61,  34,  99, 117, 114, //  stroke=\"cur\n 114, 101, 110, 116,  67, 111, 108, 111, 114,  34,  62,  32, // rentColor\"> \n  60, 112,  97, 116, 104,  32, 115, 116, 114, 111, 107, 101, // <path stroke\n  45, 108, 105, 110, 101,  99,  97, 112,  61,  34, 114, 111, // -linecap=\"ro\n 117, 110, 100,  34,  32, 115, 116, 114, 111, 107, 101,  45, // und\" stroke-\n 108, 105, 110, 101, 106, 111, 105, 110,  61,  34, 114, 111, // linejoin=\"ro\n 117, 110, 100,  34,  32, 100,  61,  34,  77,  57,  32,  57, // und\" d=\"M9 9\n  86,  52,  46,  53,  77,  57,  32,  57,  72,  52,  46,  53, // V4.5M9 9H4.5\n  77,  57,  32,  57,  76,  51,  46,  55,  53,  32,  51,  46, // M9 9L3.75 3.\n  55,  53,  77,  57,  32,  49,  53, 118,  52,  46,  53,  77, // 75M9 15v4.5M\n  57,  32,  49,  53,  72,  52,  46,  53,  77,  57,  32,  49, // 9 15H4.5M9 1\n  53, 108,  45,  53,  46,  50,  53,  32,  53,  46,  50,  53, // 5l-5.25 5.25\n  77,  49,  53,  32,  57, 104,  52,  46,  53,  77,  49,  53, // M15 9h4.5M15\n  32,  57,  86,  52,  46,  53,  77,  49,  53,  32,  57, 108, //  9V4.5M15 9l\n  53,  46,  50,  53,  45,  53,  46,  50,  53,  77,  49,  53, // 5.25-5.25M15\n  32,  49,  53, 104,  52,  46,  53,  77,  49,  53,  32,  49, //  15h4.5M15 1\n  53, 118,  52,  46,  53, 109,  48,  45,  52,  46,  53, 108, // 5v4.5m0-4.5l\n  53,  46,  50,  53,  32,  53,  46,  50,  53,  34,  32,  47, // 5.25 5.25\" /\n  62,  32,  60,  47, 115, 118, 103,  62,  96,  44,  10,  32, // > </svg>`,. \n  32, 111, 107,  58,  32, 112, 114, 111, 112, 115,  32,  61, //  ok: props =\n  62,  32, 104, 116, 109, 108,  96,  60, 115, 118, 103,  32, // > html`<svg \n  99, 108,  97, 115, 115,  61,  36, 123, 112, 114, 111, 112, // class=${prop\n 115,  46,  99, 108,  97, 115, 115, 125,  32, 102, 105, 108, // s.class} fil\n 108,  61,  34, 110, 111, 110, 101,  34,  32, 118, 105, 101, // l=\"none\" vie\n 119,  66, 111, 120,  61,  34,  48,  32,  48,  32,  50,  52, // wBox=\"0 0 24\n  32,  50,  52,  34,  32, 115, 116, 114, 111, 107, 101,  45, //  24\" stroke-\n 119, 105, 100, 116, 104,  61,  34,  49,  46,  53,  34,  32, // width=\"1.5\" \n 115, 116, 114, 111, 107, 101,  61,  34,  99, 117, 114, 114, // stroke=\"curr\n 101, 110, 116,  67, 111, 108, 111, 114,  34,  32,  97, 114, // entColor\" ar\n 105,  97,  45, 104, 105, 100, 100, 101, 110,  61,  34, 116, // ia-hidden=\"t\n 114, 117, 101,  34,  62,  32,  60, 112,  97, 116, 104,  32, // rue\"> <path \n 115, 116, 114, 111, 107, 101,  45, 108, 105, 110, 101,  99, // stroke-linec\n  97, 112,  61,  34, 114, 111, 117, 110, 100,  34,  32, 115, // ap=\"round\" s\n 116, 114, 111, 107, 101,  45, 108, 105, 110, 101, 106, 111, // troke-linejo\n 105, 110,  61,  34, 114, 111, 117, 110, 100,  34,  32, 100, // in=\"round\" d\n  61,  34,  77,  57,  32,  49,  50,  46,  55,  53,  76,  49, // =\"M9 12.75L1\n  49,  46,  50,  53,  32,  49,  53,  32,  49,  53,  32,  57, // 1.25 15 15 9\n  46,  55,  53,  77,  50,  49,  32,  49,  50,  97,  57,  32, // .75M21 12a9 \n  57,  32,  48,  32,  49,  49,  45,  49,  56,  32,  48,  32, // 9 0 11-18 0 \n  57,  32,  57,  32,  48,  32,  48,  49,  49,  56,  32,  48, // 9 9 0 0118 0\n 122,  34,  32,  47,  62,  32,  60,  47, 115, 118, 103,  62, // z\" /> </svg>\n  96,  44,  10,  32,  32, 102,  97, 105, 108,  58,  32, 112, // `,.  fail: p\n 114, 111, 112, 115,  32,  61,  62,  32, 104, 116, 109, 108, // rops => html\n  96,  60, 115, 118, 103,  32,  99, 108,  97, 115, 115,  61, // `<svg class=\n  36, 123, 112, 114, 111, 112, 115,  46,  99, 108,  97, 115, // ${props.clas\n 115, 125,  32, 120, 109, 108, 110, 115,  61,  34, 104, 116, // s} xmlns=\"ht\n 116, 112,  58,  47,  47, 119, 119, 119,  46, 119,  51,  46, // tp://www.w3.\n 111, 114, 103,  47,  50,  48,  48,  48,  47, 115, 118, 103, // org/2000/svg\n  34,  32, 102, 105, 108, 108,  61,  34, 110, 111, 110, 101, // \" fill=\"none\n  34,  32, 118, 105, 101, 119,  66, 111, 120,  61,  34,  48, // \" viewBox=\"0\n  32,  48,  32,  50,  52,  32,  50,  52,  34,  32, 115, 116, //  0 24 24\" st\n 114, 111, 107, 101,  45, 119, 105, 100, 116, 104,  61,  34, // roke-width=\"\n  49,  46,  53,  34,  32, 115, 116, 114, 111, 107, 101,  61, // 1.5\" stroke=\n  34,  99, 117, 114, 114, 101, 110, 116,  67, 111, 108, 111, // \"currentColo\n 114,  34,  62,  32,  60, 112,  97, 116, 104,  32, 115, 116, // r\"> <path st\n 114, 111, 107, 101,  45, 108, 105, 110, 101,  99,  97, 112, // roke-linecap\n  61,  34, 114, 111, 117, 110, 100,  34,  32, 115, 116, 114, // =\"round\" str\n 111, 107, 101,  45, 108, 105, 110, 101, 106, 111, 105, 110, // oke-linejoin\n  61,  34, 114, 111, 117, 110, 100,  34,  32, 100,  61,  34, // =\"round\" d=\"\n  77,  57,  46,  55,  53,  32,  57,  46,  55,  53, 108,  52, // M9.75 9.75l4\n  46,  53,  32,  52,  46,  53, 109,  48,  45,  52,  46,  53, // .5 4.5m0-4.5\n 108,  45,  52,  46,  53,  32,  52,  46,  53,  77,  50,  49, // l-4.5 4.5M21\n  32,  49,  50,  97,  57,  32,  57,  32,  48,  32,  49,  49, //  12a9 9 0 11\n  45,  49,  56,  32,  48,  32,  57,  32,  57,  32,  48,  32, // -18 0 9 9 0 \n  48,  49,  49,  56,  32,  48, 122,  34,  32,  47,  62,  32, // 0118 0z\" /> \n  60,  47, 115, 118, 103,  62,  96,  44,  10,  32,  32, 117, // </svg>`,.  u\n 112, 108, 111,  97, 100,  58,  32, 112, 114, 111, 112, 115, // pload: props\n  32,  61,  62,  32, 104, 116, 109, 108,  96,  60, 115, 118, //  => html`<sv\n 103,  32,  99, 108,  97, 115, 115,  61,  36, 123, 112, 114, // g class=${pr\n 111, 112, 115,  46,  99, 108,  97, 115, 115, 125,  32, 120, // ops.class} x\n 109, 108, 110, 115,  61,  34, 104, 116, 116, 112,  58,  47, // mlns=\"http:/\n  47, 119, 119, 119,  46, 119,  51,  46, 111, 114, 103,  47, // /www.w3.org/\n  50,  48,  48,  48,  47, 115, 118, 103,  34,  32, 102, 105, // 2000/svg\" fi\n 108, 108,  61,  34, 110, 111, 110, 101,  34,  32, 118, 105, // ll=\"none\" vi\n 101, 119,  66, 111, 120,  61,  34,  48,  32,  48,  32,  50, // ewBox=\"0 0 2\n  52,  32,  50,  52,  34,  32, 115, 116, 114, 111, 107, 101, // 4 24\" stroke\n  45, 119, 105, 100, 116, 104,  61,  34,  49,  46,  53,  34, // -width=\"1.5\"\n  32, 115, 116, 114, 111, 107, 101,  61,  34,  99, 117, 114, //  stroke=\"cur\n 114, 101, 110, 116,  67, 111, 108, 111, 114,  34,  62,  32, // rentColor\"> \n  60, 112,  97, 116, 104,  32, 115, 116, 114, 111, 107, 101, // <path stroke\n  45, 108, 105, 110, 101,  99,  97, 112,  61,  34, 114, 111, // -linecap=\"ro\n 117, 110, 100,  34,  32, 115, 116, 114, 111, 107, 101,  45, // und\" stroke-\n 108, 105, 110, 101, 106, 111, 105, 110,  61,  34, 114, 111, // linejoin=\"ro\n 117, 110, 100,  34,  32, 100,  61,  34,  77,  51,  32,  49, // und\" d=\"M3 1\n  54,  46,  53, 118,  50,  46,  50,  53,  65,  50,  46,  50, // 6.5v2.25A2.2\n  53,  32,  50,  46,  50,  53,  32,  48,  32,  48,  48,  53, // 5 2.25 0 005\n  46,  50,  53,  32,  50,  49, 104,  49,  51,  46,  53,  65, // .25 21h13.5A\n  50,  46,  50,  53,  32,  50,  46,  50,  53,  32,  48,  32, // 2.25 2.25 0 \n  48,  48,  50,  49,  32,  49,  56,  46,  55,  53,  86,  49, // 0021 18.75V1\n  54,  46,  53, 109,  45,  49,  51,  46,  53,  45,  57,  76, // 6.5m-13.5-9L\n  49,  50,  32,  51, 109,  48,  32,  48, 108,  52,  46,  53, // 12 3m0 0l4.5\n  32,  52,  46,  53,  77,  49,  50,  32,  51, 118,  49,  51, //  4.5M12 3v13\n  46,  53,  34,  32,  47,  62,  32,  60,  47, 115, 118, 103, // .5\" /> </svg\n  62,  32,  96,  44,  10,  32,  32, 100, 111, 119, 110, 108, // > `,.  downl\n 111,  97, 100,  58,  32, 112, 114, 111, 112, 115,  32,  61, // oad: props =\n  62,  32, 104, 116, 109, 108,  96,  60, 115, 118, 103,  32, // > html`<svg \n  99, 108,  97, 115, 115,  61,  36, 123, 112, 114, 111, 112, // class=${prop\n 115,  46,  99, 108,  97, 115, 115, 125,  32, 120, 109, 108, // s.class} xml\n 110, 115,  61,  34, 104, 116, 116, 112,  58,  47,  47, 119, // ns=\"http://w\n 119, 119,  46, 119,  51,  46, 111, 114, 103,  47,  50,  48, // ww.w3.org/20\n  48,  48,  47, 115, 118, 103,  34,  32, 102, 105, 108, 108, // 00/svg\" fill\n  61,  34, 110, 111, 110, 101,  34,  32, 118, 105, 101, 119, // =\"none\" view\n  66, 111, 120,  61,  34,  48,  32,  48,  32,  50,  52,  32, // Box=\"0 0 24 \n  50,  52,  34,  32, 115, 116, 114, 111, 107, 101,  45, 119, // 24\" stroke-w\n 105, 100, 116, 104,  61,  34,  49,  46,  53,  34,  32, 115, // idth=\"1.5\" s\n 116, 114, 111, 107, 101,  61,  34,  99, 117, 114, 114, 101, // troke=\"curre\n 110, 116,  67, 111, 108, 111, 114,  34,  62,  32,  60, 112, // ntColor\"> <p\n  97, 116, 104,  32, 115, 116, 114, 111, 107, 101,  45, 108, // ath stroke-l\n 105, 110, 101,  99,  97, 112,  61,  34, 114, 111, 117, 110, // inecap=\"roun\n 100,  34,  32, 115, 116, 114, 111, 107, 101,  45, 108, 105, // d\" stroke-li\n 110, 101, 106, 111, 105, 110,  61,  34, 114, 111, 117, 110, // nejoin=\"roun\n 100,  34,  32, 100,  61,  34,  77,  51,  32,  49,  54,  46, // d\" d=\"M3 16.\n  53, 118,  50,  46,  50,  53,  65,  50,  46,  50,  53,  32, // 5v2.25A2.25 \n  50,  46,  50,  53,  32,  48,  32,  48,  48,  53,  46,  50, // 2.25 0 005.2\n  53,  32,  50,  49, 104,  49,  51,  46,  53,  65,  50,  46, // 5 21h13.5A2.\n  50,  53,  32,  50,  46,  50,  53,  32,  48,  32,  48,  48, // 25 2.25 0 00\n  50,  49,  32,  49,  56,  46,  55,  53,  86,  49,  54,  46, // 21 18.75V16.\n  53,  77,  49,  54,  46,  53,  32,  49,  50,  76,  49,  50, // 5M16.5 12L12\n  32,  49,  54,  46,  53, 109,  48,  32,  48,  76,  55,  46, //  16.5m0 0L7.\n  53,  32,  49,  50, 109,  52,  46,  53,  32,  52,  46,  53, // 5 12m4.5 4.5\n  86,  51,  34,  32,  47,  62,  32,  60,  47, 115, 118, 103, // V3\" /> </svg\n  62,  32,  96,  44,  10,  32,  32,  98, 111, 108, 116,  58, // > `,.  bolt:\n  32, 112, 114, 111, 112, 115,  32,  61,  62,  32, 104, 116, //  props => ht\n 109, 108,  96,  60, 115, 118, 103,  32,  99, 108,  97, 115, // ml`<svg clas\n 115,  61,  36, 123, 112, 114, 111, 112, 115,  46,  99, 108, // s=${props.cl\n  97, 115, 115, 125,  32, 120, 109, 108, 110, 115,  61,  34, // ass} xmlns=\"\n 104, 116, 116, 112,  58,  47,  47, 119, 119, 119,  46, 119, // http://www.w\n  51,  46, 111, 114, 103,  47,  50,  48,  48,  48,  47, 115, // 3.org/2000/s\n 118, 103,  34,  32, 102, 105, 108, 108,  61,  34, 110, 111, // vg\" fill=\"no\n 110, 101,  34,  32, 118, 105, 101, 119,  66, 111, 120,  61, // ne\" viewBox=\n  34,  48,  32,  48,  32,  50,  52,  32,  50,  52,  34,  32, // \"0 0 24 24\" \n 115, 116, 114, 111, 107, 101,  45, 119, 105, 100, 116, 104, // stroke-width\n  61,  34,  49,  46,  53,  34,  32, 115, 116, 114, 111, 107, // =\"1.5\" strok\n 101,  61,  34,  99, 117, 114, 114, 101, 110, 116,  67, 111, // e=\"currentCo\n 108, 111, 114,  34,  62,  32,  60, 112,  97, 116, 104,  32, // lor\"> <path \n 115, 116, 114, 111, 107, 101,  45, 108, 105, 110, 101,  99, // stroke-linec\n  97, 112,  61,  34, 114, 111, 117, 110, 100,  34,  32, 115, // ap=\"round\" s\n 116, 114, 111, 107, 101,  45, 108, 105, 110, 101, 106, 111, // troke-linejo\n 105, 110,  61,  34, 114, 111, 117, 110, 100,  34,  32, 100, // in=\"round\" d\n  61,  34,  77,  51,  46,  55,  53,  32,  49,  51,  46,  53, // =\"M3.75 13.5\n 108,  49,  48,  46,  53,  45,  49,  49,  46,  50,  53,  76, // l10.5-11.25L\n  49,  50,  32,  49,  48,  46,  53, 104,  56,  46,  50,  53, // 12 10.5h8.25\n  76,  57,  46,  55,  53,  32,  50,  49,  46,  55,  53,  32, // L9.75 21.75 \n  49,  50,  32,  49,  51,  46,  53,  72,  51,  46,  55,  53, // 12 13.5H3.75\n 122,  34,  32,  47,  62,  32,  60,  47, 115, 118, 103,  62, // z\" /> </svg>\n  96,  44,  10,  32,  32, 104, 111, 109, 101,  58,  32, 112, // `,.  home: p\n 114, 111, 112, 115,  32,  61,  62,  32, 104, 116, 109, 108, // rops => html\n  96,  60, 115, 118, 103,  32,  99, 108,  97, 115, 115,  61, // `<svg class=\n  36, 123, 112, 114, 111, 112, 115,  46,  99, 108,  97, 115, // ${props.clas\n 115, 125,  32, 120, 109, 108, 110, 115,  61,  34, 104, 116, // s} xmlns=\"ht\n 116, 112,  58,  47,  47, 119, 119, 119,  46, 119,  51,  46, // tp://www.w3.\n 111, 114, 103,  47,  50,  48,  48,  48,  47, 115, 118, 103, // org/2000/svg\n  34,  32, 102, 105, 108, 108,  61,  34, 110, 111, 110, 101, // \" fill=\"none\n  34,  32, 118, 105, 101, 119,  66, 111, 120,  61,  34,  48, // \" viewBox=\"0\n  32,  48,  32,  50,  52,  32,  50,  52,  34,  32, 115, 116, //  0 24 24\" st\n 114, 111, 107, 101,  45, 119, 105, 100, 116, 104,  61,  34, // roke-width=\"\n  49,  46,  53,  34,  32, 115, 116, 114, 111, 107, 101,  61, // 1.5\" stroke=\n  34,  99, 117, 114, 114, 101, 110, 116,  67, 111, 108, 111, // \"currentColo\n 114,  34,  62,  32,  60, 112,  97, 116, 104,  32, 115, 116, // r\"> <path st\n 114, 111, 107, 101,  45, 108, 105, 110, 101,  99,  97, 112, // roke-linecap\n  61,  34, 114, 111, 117, 110, 100,  34,  32, 115, 116, 114, // =\"round\" str\n 111, 107, 101,  45, 108, 105, 110, 101, 106, 111, 105, 110, // oke-linejoin\n  61,  34, 114, 111, 117, 110, 100,  34,  32, 100,  61,  34, // =\"round\" d=\"\n  77,  50,  46,  50,  53,  32,  49,  50, 108,  56,  46,  57, // M2.25 12l8.9\n  53,  52,  45,  56,  46,  57,  53,  53,  99,  46,  52,  52, // 54-8.955c.44\n  45,  46,  52,  51,  57,  32,  49,  46,  49,  53,  50,  45, // -.439 1.152-\n  46,  52,  51,  57,  32,  49,  46,  53,  57,  49,  32,  48, // .439 1.591 0\n  76,  50,  49,  46,  55,  53,  32,  49,  50,  77,  52,  46, // L21.75 12M4.\n  53,  32,  57,  46,  55,  53, 118,  49,  48,  46,  49,  50, // 5 9.75v10.12\n  53,  99,  48,  32,  46,  54,  50,  49,  46,  53,  48,  52, // 5c0 .621.504\n  32,  49,  46,  49,  50,  53,  32,  49,  46,  49,  50,  53, //  1.125 1.125\n  32,  49,  46,  49,  50,  53,  72,  57,  46,  55,  53, 118, //  1.125H9.75v\n  45,  52,  46,  56,  55,  53,  99,  48,  45,  46,  54,  50, // -4.875c0-.62\n  49,  46,  53,  48,  52,  45,  49,  46,  49,  50,  53,  32, // 1.504-1.125 \n  49,  46,  49,  50,  53,  45,  49,  46,  49,  50,  53, 104, // 1.125-1.125h\n  50,  46,  50,  53,  99,  46,  54,  50,  49,  32,  48,  32, // 2.25c.621 0 \n  49,  46,  49,  50,  53,  46,  53,  48,  52,  32,  49,  46, // 1.125.504 1.\n  49,  50,  53,  32,  49,  46,  49,  50,  53,  86,  50,  49, // 125 1.125V21\n 104,  52,  46,  49,  50,  53,  99,  46,  54,  50,  49,  32, // h4.125c.621 \n  48,  32,  49,  46,  49,  50,  53,  45,  46,  53,  48,  52, // 0 1.125-.504\n  32,  49,  46,  49,  50,  53,  45,  49,  46,  49,  50,  53, //  1.125-1.125\n  86,  57,  46,  55,  53,  77,  56,  46,  50,  53,  32,  50, // V9.75M8.25 2\n  49, 104,  56,  46,  50,  53,  34,  32,  47,  62,  32,  60, // 1h8.25\" /> <\n  47, 115, 118, 103,  62,  32,  96,  44,  10,  32,  32, 108, // /svg> `,.  l\n 105, 110, 107,  58,  32, 112, 114, 111, 112, 115,  32,  61, // ink: props =\n  62,  32, 104, 116, 109, 108,  96,  60, 115, 118, 103,  32, // > html`<svg \n  99, 108,  97, 115, 115,  61,  36, 123, 112, 114, 111, 112, // class=${prop\n 115,  46,  99, 108,  97, 115, 115, 125,  32, 120, 109, 108, // s.class} xml\n 110, 115,  61,  34, 104, 116, 116, 112,  58,  47,  47, 119, // ns=\"http://w\n 119, 119,  46, 119,  51,  46, 111, 114, 103,  47,  50,  48, // ww.w3.org/20\n  48,  48,  47, 115, 118, 103,  34,  32, 102, 105, 108, 108, // 00/svg\" fill\n  61,  34, 110, 111, 110, 101,  34,  32, 118, 105, 101, 119, // =\"none\" view\n  66, 111, 120,  61,  34,  48,  32,  48,  32,  50,  52,  32, // Box=\"0 0 24 \n  50,  52,  34,  32, 115, 116, 114, 111, 107, 101,  45, 119, // 24\" stroke-w\n 105, 100, 116, 104,  61,  34,  49,  46,  53,  34,  32, 115, // idth=\"1.5\" s\n 116, 114, 111, 107, 101,  61,  34,  99, 117, 114, 114, 101, // troke=\"curre\n 110, 116,  67, 111, 108, 111, 114,  34,  62,  32,  60, 112, // ntColor\"> <p\n  97, 116, 104,  32, 115, 116, 114, 111, 107, 101,  45, 108, // ath stroke-l\n 105, 110, 101,  99,  97, 112,  61,  34, 114, 111, 117, 110, // inecap=\"roun\n 100,  34,  32, 115, 116, 114, 111, 107, 101,  45, 108, 105, // d\" stroke-li\n 110, 101, 106, 111, 105, 110,  61,  34, 114, 111, 117, 110, // nejoin=\"roun\n 100,  34,  32, 100,  61,  34,  77,  49,  51,  46,  49,  57, // d\" d=\"M13.19\n  32,  56,  46,  54,  56,  56,  97,  52,  46,  53,  32,  52, //  8.688a4.5 4\n  46,  53,  32,  48,  32,  48,  49,  49,  46,  50,  52,  50, // .5 0 011.242\n  32,  55,  46,  50,  52,  52, 108,  45,  52,  46,  53,  32, //  7.244l-4.5 \n  52,  46,  53,  97,  52,  46,  53,  32,  52,  46,  53,  32, // 4.5a4.5 4.5 \n  48,  32,  48,  49,  45,  54,  46,  51,  54,  52,  45,  54, // 0 01-6.364-6\n  46,  51,  54,  52, 108,  49,  46,  55,  53,  55,  45,  49, // .364l1.757-1\n  46,  55,  53,  55, 109,  49,  51,  46,  51,  53,  45,  46, // .757m13.35-.\n  54,  50,  50, 108,  49,  46,  55,  53,  55,  45,  49,  46, // 622l1.757-1.\n  55,  53,  55,  97,  52,  46,  53,  32,  52,  46,  53,  32, // 757a4.5 4.5 \n  48,  32,  48,  48,  45,  54,  46,  51,  54,  52,  45,  54, // 0 00-6.364-6\n  46,  51,  54,  52, 108,  45,  52,  46,  53,  32,  52,  46, // .364l-4.5 4.\n  53,  97,  52,  46,  53,  32,  52,  46,  53,  32,  48,  32, // 5a4.5 4.5 0 \n  48,  48,  49,  46,  50,  52,  50,  32,  55,  46,  50,  52, // 001.242 7.24\n  52,  34,  32,  47,  62,  32,  60,  47, 115, 118, 103,  62, // 4\" /> </svg>\n  32,  96,  44,  10,  32,  32, 115, 104, 105, 101, 108, 100, //  `,.  shield\n  58,  32, 112, 114, 111, 112, 115,  32,  61,  62,  32, 104, // : props => h\n 116, 109, 108,  96,  60, 115, 118, 103,  32,  99, 108,  97, // tml`<svg cla\n 115, 115,  61,  36, 123, 112, 114, 111, 112, 115,  46,  99, // ss=${props.c\n 108,  97, 115, 115, 125,  32, 120, 109, 108, 110, 115,  61, // lass} xmlns=\n  34, 104, 116, 116, 112,  58,  47,  47, 119, 119, 119,  46, // \"http://www.\n 119,  51,  46, 111, 114, 103,  47,  50,  48,  48,  48,  47, // w3.org/2000/\n 115, 118, 103,  34,  32, 102, 105, 108, 108,  61,  34, 110, // svg\" fill=\"n\n 111, 110, 101,  34,  32, 118, 105, 101, 119,  66, 111, 120, // one\" viewBox\n  61,  34,  48,  32,  48,  32,  50,  52,  32,  50,  52,  34, // =\"0 0 24 24\"\n  32, 115, 116, 114, 111, 107, 101,  45, 119, 105, 100, 116, //  stroke-widt\n 104,  61,  34,  49,  46,  53,  34,  32, 115, 116, 114, 111, // h=\"1.5\" stro\n 107, 101,  61,  34,  99, 117, 114, 114, 101, 110, 116,  67, // ke=\"currentC\n 111, 108, 111, 114,  34,  62,  32,  60, 112,  97, 116, 104, // olor\"> <path\n  32, 115, 116, 114, 111, 107, 101,  45, 108, 105, 110, 101, //  stroke-line\n  99,  97, 112,  61,  34, 114, 111, 117, 110, 100,  34,  32, // cap=\"round\" \n 115, 116, 114, 111, 107, 101,  45, 108, 105, 110, 101, 106, // stroke-linej\n 111, 105, 110,  61,  34, 114, 111, 117, 110, 100,  34,  32, // oin=\"round\" \n 100,  61,  34,  77,  57,  32,  49,  50,  46,  55,  53,  76, // d=\"M9 12.75L\n  49,  49,  46,  50,  53,  32,  49,  53,  32,  49,  53,  32, // 11.25 15 15 \n  57,  46,  55,  53, 109,  45,  51,  45,  55,  46,  48,  51, // 9.75m-3-7.03\n  54,  65,  49,  49,  46,  57,  53,  57,  32,  49,  49,  46, // 6A11.959 11.\n  57,  53,  57,  32,  48,  32,  48,  49,  51,  46,  53,  57, // 959 0 013.59\n  56,  32,  54,  32,  49,  49,  46,  57,  57,  32,  49,  49, // 8 6 11.99 11\n  46,  57,  57,  32,  48,  32,  48,  48,  51,  32,  57,  46, // .99 0 003 9.\n  55,  52,  57,  99,  48,  32,  53,  46,  53,  57,  50,  32, // 749c0 5.592 \n  51,  46,  56,  50,  52,  32,  49,  48,  46,  50,  57,  32, // 3.824 10.29 \n  57,  32,  49,  49,  46,  54,  50,  51,  32,  53,  46,  49, // 9 11.623 5.1\n  55,  54,  45,  49,  46,  51,  51,  50,  32,  57,  45,  54, // 76-1.332 9-6\n  46,  48,  51,  32,  57,  45,  49,  49,  46,  54,  50,  50, // .03 9-11.622\n  32,  48,  45,  49,  46,  51,  49,  45,  46,  50,  49,  45, //  0-1.31-.21-\n  50,  46,  53,  55,  49,  45,  46,  53,  57,  56,  45,  51, // 2.571-.598-3\n  46,  55,  53,  49, 104,  45,  46,  49,  53,  50,  99,  45, // .751h-.152c-\n  51,  46,  49,  57,  54,  32,  48,  45,  54,  46,  49,  45, // 3.196 0-6.1-\n  49,  46,  50,  52,  56,  45,  56,  46,  50,  53,  45,  51, // 1.248-8.25-3\n  46,  50,  56,  53, 122,  34,  32,  47,  62,  32,  60,  47, // .285z\" /> </\n 115, 118, 103,  62,  32,  96,  44,  10,  32,  32,  98,  97, // svg> `,.  ba\n 114, 115, 100, 111, 119, 110,  58,  32, 112, 114, 111, 112, // rsdown: prop\n 115,  32,  61,  62,  32, 104, 116, 109, 108,  96,  60, 115, // s => html`<s\n 118, 103,  32,  99, 108,  97, 115, 115,  61,  36, 123, 112, // vg class=${p\n 114, 111, 112, 115,  46,  99, 108,  97, 115, 115, 125,  32, // rops.class} \n 120, 109, 108, 110, 115,  61,  34, 104, 116, 116, 112,  58, // xmlns=\"http:\n  47,  47, 119, 119, 119,  46, 119,  51,  46, 111, 114, 103, // //www.w3.org\n  47,  50,  48,  48,  48,  47, 115, 118, 103,  34,  32, 102, // /2000/svg\" f\n 105, 108, 108,  61,  34, 110, 111, 110, 101,  34,  32, 118, // ill=\"none\" v\n 105, 101, 119,  66, 111, 120,  61,  34,  48,  32,  48,  32, // iewBox=\"0 0 \n  50,  52,  32,  50,  52,  34,  32, 115, 116, 114, 111, 107, // 24 24\" strok\n 101,  45, 119, 105, 100, 116, 104,  61,  34,  49,  46,  53, // e-width=\"1.5\n  34,  32, 115, 116, 114, 111, 107, 101,  61,  34,  99, 117, // \" stroke=\"cu\n 114, 114, 101, 110, 116,  67, 111, 108, 111, 114,  34,  62, // rrentColor\">\n  32,  60, 112,  97, 116, 104,  32, 115, 116, 114, 111, 107, //  <path strok\n 101,  45, 108, 105, 110, 101,  99,  97, 112,  61,  34, 114, // e-linecap=\"r\n 111, 117, 110, 100,  34,  32, 115, 116, 114, 111, 107, 101, // ound\" stroke\n  45, 108, 105, 110, 101, 106, 111, 105, 110,  61,  34, 114, // -linejoin=\"r\n 111, 117, 110, 100,  34,  32, 100,  61,  34,  77,  51,  32, // ound\" d=\"M3 \n  52,  46,  53, 104,  49,  52,  46,  50,  53,  77,  51,  32, // 4.5h14.25M3 \n  57, 104,  57,  46,  55,  53,  77,  51,  32,  49,  51,  46, // 9h9.75M3 13.\n  53, 104,  57,  46,  55,  53, 109,  52,  46,  53,  45,  52, // 5h9.75m4.5-4\n  46,  53, 118,  49,  50, 109,  48,  32,  48, 108,  45,  51, // .5v12m0 0l-3\n  46,  55,  53,  45,  51,  46,  55,  53,  77,  49,  55,  46, // .75-3.75M17.\n  50,  53,  32,  50,  49,  76,  50,  49,  32,  49,  55,  46, // 25 21L21 17.\n  50,  53,  34,  32,  47,  62,  32,  60,  47, 115, 118, 103, // 25\" /> </svg\n  62,  32,  96,  44,  10,  32,  32,  97, 114, 114, 111, 119, // > `,.  arrow\n 100, 111, 119, 110,  58,  32, 112, 114, 111, 112, 115,  32, // down: props \n  61,  62,  32, 104, 116, 109, 108,  96,  60, 115, 118, 103, // => html`<svg\n  32,  99, 108,  97, 115, 115,  61,  36, 123, 112, 114, 111, //  class=${pro\n 112, 115,  46,  99, 108,  97, 115, 115, 125,  32, 120, 109, // ps.class} xm\n 108, 110, 115,  61,  34, 104, 116, 116, 112,  58,  47,  47, // lns=\"http://\n 119, 119, 119,  46, 119,  51,  46, 111, 114, 103,  47,  50, // www.w3.org/2\n  48,  48,  48,  47, 115, 118, 103,  34,  32, 102, 105, 108, // 000/svg\" fil\n 108,  61,  34, 110, 111, 110, 101,  34,  32, 118, 105, 101, // l=\"none\" vie\n 119,  66, 111, 120,  61,  34,  48,  32,  48,  32,  50,  52, // wBox=\"0 0 24\n  32,  50,  52,  34,  32, 115, 116, 114, 111, 107, 101,  45, //  24\" stroke-\n 119, 105, 100, 116, 104,  61,  34,  49,  46,  53,  34,  32, // width=\"1.5\" \n 115, 116, 114, 111, 107, 101,  61,  34,  99, 117, 114, 114, // stroke=\"curr\n 101, 110, 116,  67, 111, 108, 111, 114,  34,  62,  32,  60, // entColor\"> <\n 112,  97, 116, 104,  32, 115, 116, 114, 111, 107, 101,  45, // path stroke-\n 108, 105, 110, 101,  99,  97, 112,  61,  34, 114, 111, 117, // linecap=\"rou\n 110, 100,  34,  32, 115, 116, 114, 111, 107, 101,  45, 108, // nd\" stroke-l\n 105, 110, 101, 106, 111, 105, 110,  61,  34, 114, 111, 117, // inejoin=\"rou\n 110, 100,  34,  32, 100,  61,  34,  77,  49,  50,  32,  52, // nd\" d=\"M12 4\n  46,  53, 118,  49,  53, 109,  48,  32,  48, 108,  54,  46, // .5v15m0 0l6.\n  55,  53,  45,  54,  46,  55,  53,  77,  49,  50,  32,  49, // 75-6.75M12 1\n  57,  46,  53, 108,  45,  54,  46,  55,  53,  45,  54,  46, // 9.5l-6.75-6.\n  55,  53,  34,  32,  47,  62,  32,  60,  47, 115, 118, 103, // 75\" /> </svg\n  62,  32,  96,  44,  10,  32,  32,  97, 114, 114, 111, 119, // > `,.  arrow\n 117, 112,  58,  32, 112, 114, 111, 112, 115,  32,  61,  62, // up: props =>\n  32, 104, 116, 109, 108,  96,  60, 115, 118, 103,  32,  99, //  html`<svg c\n 108,  97, 115, 115,  61,  36, 123, 112, 114, 111, 112, 115, // lass=${props\n  46,  99, 108,  97, 115, 115, 125,  32, 120, 109, 108, 110, // .class} xmln\n 115,  61,  34, 104, 116, 116, 112,  58,  47,  47, 119, 119, // s=\"http://ww\n 119,  46, 119,  51,  46, 111, 114, 103,  47,  50,  48,  48, // w.w3.org/200\n  48,  47, 115, 118, 103,  34,  32, 102, 105, 108, 108,  61, // 0/svg\" fill=\n  34, 110, 111, 110, 101,  34,  32, 118, 105, 101, 119,  66, // \"none\" viewB\n 111, 120,  61,  34,  48,  32,  48,  32,  50,  52,  32,  50, // ox=\"0 0 24 2\n  52,  34,  32, 115, 116, 114, 111, 107, 101,  45, 119, 105, // 4\" stroke-wi\n 100, 116, 104,  61,  34,  49,  46,  53,  34,  32, 115, 116, // dth=\"1.5\" st\n 114, 111, 107, 101,  61,  34,  99, 117, 114, 114, 101, 110, // roke=\"curren\n 116,  67, 111, 108, 111, 114,  34,  62,  32,  60, 112,  97, // tColor\"> <pa\n 116, 104,  32, 115, 116, 114, 111, 107, 101,  45, 108, 105, // th stroke-li\n 110, 101,  99,  97, 112,  61,  34, 114, 111, 117, 110, 100, // necap=\"round\n  34,  32, 115, 116, 114, 111, 107, 101,  45, 108, 105, 110, // \" stroke-lin\n 101, 106, 111, 105, 110,  61,  34, 114, 111, 117, 110, 100, // ejoin=\"round\n  34,  32, 100,  61,  34,  77,  49,  50,  32,  49,  57,  46, // \" d=\"M12 19.\n  53, 118,  45,  49,  53, 109,  48,  32,  48, 108,  45,  54, // 5v-15m0 0l-6\n  46,  55,  53,  32,  54,  46,  55,  53,  77,  49,  50,  32, // .75 6.75M12 \n  52,  46,  53, 108,  54,  46,  55,  53,  32,  54,  46,  55, // 4.5l6.75 6.7\n  53,  34,  32,  47,  62,  32,  60,  47, 115, 118, 103,  62, // 5\" /> </svg>\n  96,  44,  10,  32,  32, 119,  97, 114, 110,  58,  32, 112, // `,.  warn: p\n 114, 111, 112, 115,  32,  61,  62,  32, 104, 116, 109, 108, // rops => html\n  96,  60, 115, 118, 103,  32,  99, 108,  97, 115, 115,  61, // `<svg class=\n  36, 123, 112, 114, 111, 112, 115,  46,  99, 108,  97, 115, // ${props.clas\n 115, 125,  32, 120, 109, 108, 110, 115,  61,  34, 104, 116, // s} xmlns=\"ht\n 116, 112,  58,  47,  47, 119, 119, 119,  46, 119,  51,  46, // tp://www.w3.\n 111, 114, 103,  47,  50,  48,  48,  48,  47, 115, 118, 103, // org/2000/svg\n  34,  32, 102, 105, 108, 108,  61,  34, 110, 111, 110, 101, // \" fill=\"none\n  34,  32, 118, 105, 101, 119,  66, 111, 120,  61,  34,  48, // \" viewBox=\"0\n  32,  48,  32,  50,  52,  32,  50,  52,  34,  32, 115, 116, //  0 24 24\" st\n 114, 111, 107, 101,  45, 119, 105, 100, 116, 104,  61,  34, // roke-width=\"\n  49,  46,  53,  34,  32, 115, 116, 114, 111, 107, 101,  61, // 1.5\" stroke=\n  34,  99, 117, 114, 114, 101, 110, 116,  67, 111, 108, 111, // \"currentColo\n 114,  34,  62,  32,  60, 112,  97, 116, 104,  32, 115, 116, // r\"> <path st\n 114, 111, 107, 101,  45, 108, 105, 110, 101,  99,  97, 112, // roke-linecap\n  61,  34, 114, 111, 117, 110, 100,  34,  32, 115, 116, 114, // =\"round\" str\n 111, 107, 101,  45, 108, 105, 110, 101, 106, 111, 105, 110, // oke-linejoin\n  61,  34, 114, 111, 117, 110, 100,  34,  32, 100,  61,  34, // =\"round\" d=\"\n  77,  49,  50,  32,  57, 118,  51,  46,  55,  53, 109,  45, // M12 9v3.75m-\n  57,  46,  51,  48,  51,  32,  51,  46,  51,  55,  54,  99, // 9.303 3.376c\n  45,  46,  56,  54,  54,  32,  49,  46,  53,  46,  50,  49, // -.866 1.5.21\n  55,  32,  51,  46,  51,  55,  52,  32,  49,  46,  57,  52, // 7 3.374 1.94\n  56,  32,  51,  46,  51,  55,  52, 104,  49,  52,  46,  55, // 8 3.374h14.7\n  49,  99,  49,  46,  55,  51,  32,  48,  32,  50,  46,  56, // 1c1.73 0 2.8\n  49,  51,  45,  49,  46,  56,  55,  52,  32,  49,  46,  57, // 13-1.874 1.9\n  52,  56,  45,  51,  46,  51,  55,  52,  76,  49,  51,  46, // 48-3.374L13.\n  57,  52,  57,  32,  51,  46,  51,  55,  56,  99,  45,  46, // 949 3.378c-.\n  56,  54,  54,  45,  49,  46,  53,  45,  51,  46,  48,  51, // 866-1.5-3.03\n  50,  45,  49,  46,  53,  45,  51,  46,  56,  57,  56,  32, // 2-1.5-3.898 \n  48,  76,  50,  46,  54,  57,  55,  32,  49,  54,  46,  49, // 0L2.697 16.1\n  50,  54, 122,  77,  49,  50,  32,  49,  53,  46,  55,  53, // 26zM12 15.75\n 104,  46,  48,  48,  55, 118,  46,  48,  48,  56,  72,  49, // h.007v.008H1\n  50, 118,  45,  46,  48,  48,  56, 122,  34,  32,  47,  62, // 2v-.008z\" />\n  32,  60,  47, 115, 118, 103,  62,  96,  44,  10,  32,  32, //  </svg>`,.  \n 105, 110, 102, 111,  58,  32, 112, 114, 111, 112, 115,  32, // info: props \n  61,  62,  32, 104, 116, 109, 108,  96,  60, 115, 118, 103, // => html`<svg\n  32,  99, 108,  97, 115, 115,  61,  36, 123, 112, 114, 111, //  class=${pro\n 112, 115,  46,  99, 108,  97, 115, 115, 125,  32, 120, 109, // ps.class} xm\n 108, 110, 115,  61,  34, 104, 116, 116, 112,  58,  47,  47, // lns=\"http://\n 119, 119, 119,  46, 119,  51,  46, 111, 114, 103,  47,  50, // www.w3.org/2\n  48,  48,  48,  47, 115, 118, 103,  34,  32, 102, 105, 108, // 000/svg\" fil\n 108,  61,  34, 110, 111, 110, 101,  34,  32, 118, 105, 101, // l=\"none\" vie\n 119,  66, 111, 120,  61,  34,  48,  32,  48,  32,  50,  52, // wBox=\"0 0 24\n  32,  50,  52,  34,  32, 115, 116, 114, 111, 107, 101,  45, //  24\" stroke-\n 119, 105, 100, 116, 104,  61,  34,  49,  46,  53,  34,  32, // width=\"1.5\" \n 115, 116, 114, 111, 107, 101,  61,  34,  99, 117, 114, 114, // stroke=\"curr\n 101, 110, 116,  67, 111, 108, 111, 114,  34,  62,  32,  60, // entColor\"> <\n 112,  97, 116, 104,  32, 115, 116, 114, 111, 107, 101,  45, // path stroke-\n 108, 105, 110, 101,  99,  97, 112,  61,  34, 114, 111, 117, // linecap=\"rou\n 110, 100,  34,  32, 115, 116, 114, 111, 107, 101,  45, 108, // nd\" stroke-l\n 105, 110, 101, 106, 111, 105, 110,  61,  34, 114, 111, 117, // inejoin=\"rou\n 110, 100,  34,  32, 100,  61,  34,  77,  49,  49,  46,  50, // nd\" d=\"M11.2\n  53,  32,  49,  49,  46,  50,  53, 108,  46,  48,  52,  49, // 5 11.25l.041\n  45,  46,  48,  50,  97,  46,  55,  53,  46,  55,  53,  32, // -.02a.75.75 \n  48,  32,  48,  49,  49,  46,  48,  54,  51,  46,  56,  53, // 0 011.063.85\n  50, 108,  45,  46,  55,  48,  56,  32,  50,  46,  56,  51, // 2l-.708 2.83\n  54,  97,  46,  55,  53,  46,  55,  53,  32,  48,  32,  48, // 6a.75.75 0 0\n  48,  49,  46,  48,  54,  51,  46,  56,  53,  51, 108,  46, // 01.063.853l.\n  48,  52,  49,  45,  46,  48,  50,  49,  77,  50,  49,  32, // 041-.021M21 \n  49,  50,  97,  57,  32,  57,  32,  48,  32,  49,  49,  45, // 12a9 9 0 11-\n  49,  56,  32,  48,  32,  57,  32,  57,  32,  48,  32,  48, // 18 0 9 9 0 0\n  49,  49,  56,  32,  48, 122, 109,  45,  57,  45,  51,  46, // 118 0zm-9-3.\n  55,  53, 104,  46,  48,  48,  56, 118,  46,  48,  48,  56, // 75h.008v.008\n  72,  49,  50,  86,  56,  46,  50,  53, 122,  34,  32,  47, // H12V8.25z\" /\n  62,  32,  60,  47, 115, 118, 103,  62,  96,  44,  10,  32, // > </svg>`,. \n  32, 101, 120,  99, 108,  97, 109,  97, 116, 105, 111, 110, //  exclamation\n  84, 114, 105,  97, 110, 103, 108, 101,  58,  32, 112, 114, // Triangle: pr\n 111, 112, 115,  32,  61,  62,  32, 104, 116, 109, 108,  96, // ops => html`\n  60, 115, 118, 103,  32,  99, 108,  97, 115, 115,  61,  36, // <svg class=$\n 123, 112, 114, 111, 112, 115,  46,  99, 108,  97, 115, 115, // {props.class\n 125,  32, 120, 109, 108, 110, 115,  61,  34, 104, 116, 116, // } xmlns=\"htt\n 112,  58,  47,  47, 119, 119, 119,  46, 119,  51,  46, 111, // p://www.w3.o\n 114, 103,  47,  50,  48,  48,  48,  47, 115, 118, 103,  34, // rg/2000/svg\"\n  32, 102, 105, 108, 108,  61,  34, 110, 111, 110, 101,  34, //  fill=\"none\"\n  32, 118, 105, 101, 119,  66, 111, 120,  61,  34,  48,  32, //  viewBox=\"0 \n  48,  32,  50,  52,  32,  50,  52,  34,  32, 115, 116, 114, // 0 24 24\" str\n 111, 107, 101,  45, 119, 105, 100, 116, 104,  61,  34,  49, // oke-width=\"1\n  46,  53,  34,  32, 115, 116, 114, 111, 107, 101,  61,  34, // .5\" stroke=\"\n  99, 117, 114, 114, 101, 110, 116,  67, 111, 108, 111, 114, // currentColor\n  34,  62,  32,  60, 112,  97, 116, 104,  32, 115, 116, 114, // \"> <path str\n 111, 107, 101,  45, 108, 105, 110, 101,  99,  97, 112,  61, // oke-linecap=\n  34, 114, 111, 117, 110, 100,  34,  32, 115, 116, 114, 111, // \"round\" stro\n 107, 101,  45, 108, 105, 110, 101, 106, 111, 105, 110,  61, // ke-linejoin=\n  34, 114, 111, 117, 110, 100,  34,  32, 100,  61,  34,  77, // \"round\" d=\"M\n  49,  50,  32,  57, 118,  51,  46,  55,  53, 109,  45,  57, // 12 9v3.75m-9\n  46,  51,  48,  51,  32,  51,  46,  51,  55,  54,  99,  45, // .303 3.376c-\n  46,  56,  54,  54,  32,  49,  46,  53,  46,  50,  49,  55, // .866 1.5.217\n  32,  51,  46,  51,  55,  52,  32,  49,  46,  57,  52,  56, //  3.374 1.948\n  32,  51,  46,  51,  55,  52, 104,  49,  52,  46,  55,  49, //  3.374h14.71\n  99,  49,  46,  55,  51,  32,  48,  32,  50,  46,  56,  49, // c1.73 0 2.81\n  51,  45,  49,  46,  56,  55,  52,  32,  49,  46,  57,  52, // 3-1.874 1.94\n  56,  45,  51,  46,  51,  55,  52,  76,  49,  51,  46,  57, // 8-3.374L13.9\n  52,  57,  32,  51,  46,  51,  55,  56,  99,  45,  46,  56, // 49 3.378c-.8\n  54,  54,  45,  49,  46,  53,  45,  51,  46,  48,  51,  50, // 66-1.5-3.032\n  45,  49,  46,  53,  45,  51,  46,  56,  57,  56,  32,  48, // -1.5-3.898 0\n  76,  50,  46,  54,  57,  55,  32,  49,  54,  46,  49,  50, // L2.697 16.12\n  54, 122,  77,  49,  50,  32,  49,  53,  46,  55,  53, 104, // 6zM12 15.75h\n  46,  48,  48,  55, 118,  46,  48,  48,  56,  72,  49,  50, // .007v.008H12\n 118,  45,  46,  48,  48,  56, 122,  34,  32,  47,  62,  32, // v-.008z\" /> \n  60,  47, 115, 118, 103,  62,  96,  44,  10,  32,  32, 116, // </svg>`,.  t\n 104, 117, 109,  98,  85, 112,  58,  32, 112, 114, 111, 112, // humbUp: prop\n 115,  32,  61,  62,  32, 104, 116, 109, 108,  96,  60, 115, // s => html`<s\n 118, 103,  32,  99, 108,  97, 115, 115,  61,  36, 123, 112, // vg class=${p\n 114, 111, 112, 115,  46,  99, 108,  97, 115, 115, 125,  32, // rops.class} \n 120, 109, 108, 110, 115,  61,  34, 104, 116, 116, 112,  58, // xmlns=\"http:\n  47,  47, 119, 119, 119,  46, 119,  51,  46, 111, 114, 103, // //www.w3.org\n  47,  50,  48,  48,  48,  47, 115, 118, 103,  34,  32, 102, // /2000/svg\" f\n 105, 108, 108,  61,  34, 110, 111, 110, 101,  34,  32, 118, // ill=\"none\" v\n 105, 101, 119,  66, 111, 120,  61,  34,  48,  32,  48,  32, // iewBox=\"0 0 \n  50,  52,  32,  50,  52,  34,  32, 115, 116, 114, 111, 107, // 24 24\" strok\n 101,  45, 119, 105, 100, 116, 104,  61,  34,  49,  46,  53, // e-width=\"1.5\n  34,  32, 115, 116, 114, 111, 107, 101,  61,  34,  99, 117, // \" stroke=\"cu\n 114, 114, 101, 110, 116,  67, 111, 108, 111, 114,  34,  62, // rrentColor\">\n  32,  60, 112,  97, 116, 104,  32, 115, 116, 114, 111, 107, //  <path strok\n 101,  45, 108, 105, 110, 101,  99,  97, 112,  61,  34, 114, // e-linecap=\"r\n 111, 117, 110, 100,  34,  32, 115, 116, 114, 111, 107, 101, // ound\" stroke\n  45, 108, 105, 110, 101, 106, 111, 105, 110,  61,  34, 114, // -linejoin=\"r\n 111, 117, 110, 100,  34,  32, 100,  61,  34,  77,  54,  46, // ound\" d=\"M6.\n  54,  51,  51,  32,  49,  48,  46,  53,  99,  46,  56,  48, // 633 10.5c.80\n  54,  32,  48,  32,  49,  46,  53,  51,  51,  45,  46,  52, // 6 0 1.533-.4\n  52,  54,  32,  50,  46,  48,  51,  49,  45,  49,  46,  48, // 46 2.031-1.0\n  56,  97,  57,  46,  48,  52,  49,  32,  57,  46,  48,  52, // 8a9.041 9.04\n  49,  32,  48,  32,  48,  49,  50,  46,  56,  54,  49,  45, // 1 0 012.861-\n  50,  46,  52,  99,  46,  55,  50,  51,  45,  46,  51,  56, // 2.4c.723-.38\n  52,  32,  49,  46,  51,  53,  45,  46,  57,  53,  54,  32, // 4 1.35-.956 \n  49,  46,  54,  53,  51,  45,  49,  46,  55,  49,  53,  97, // 1.653-1.715a\n  52,  46,  52,  57,  56,  32,  52,  46,  52,  57,  56,  32, // 4.498 4.498 \n  48,  32,  48,  48,  46,  51,  50,  50,  45,  49,  46,  54, // 0 00.322-1.6\n  55,  50,  86,  51,  97,  46,  55,  53,  46,  55,  53,  32, // 72V3a.75.75 \n  48,  32,  48,  49,  46,  55,  53,  45,  46,  55,  53,  65, // 0 01.75-.75A\n  50,  46,  50,  53,  32,  50,  46,  50,  53,  32,  48,  32, // 2.25 2.25 0 \n  48,  49,  49,  54,  46,  53,  32,  52,  46,  53,  99,  48, // 0116.5 4.5c0\n  32,  49,  46,  49,  53,  50,  45,  46,  50,  54,  32,  50, //  1.152-.26 2\n  46,  50,  52,  51,  45,  46,  55,  50,  51,  32,  51,  46, // .243-.723 3.\n  50,  49,  56,  45,  46,  50,  54,  54,  46,  53,  53,  56, // 218-.266.558\n  46,  49,  48,  55,  32,  49,  46,  50,  56,  50,  46,  55, // .107 1.282.7\n  50,  53,  32,  49,  46,  50,  56,  50, 104,  51,  46,  49, // 25 1.282h3.1\n  50,  54,  99,  49,  46,  48,  50,  54,  32,  48,  32,  49, // 26c1.026 0 1\n  46,  57,  52,  53,  46,  54,  57,  52,  32,  50,  46,  48, // .945.694 2.0\n  53,  52,  32,  49,  46,  55,  49,  53,  46,  48,  52,  53, // 54 1.715.045\n  46,  52,  50,  50,  46,  48,  54,  56,  46,  56,  53,  46, // .422.068.85.\n  48,  54,  56,  32,  49,  46,  50,  56,  53,  97,  49,  49, // 068 1.285a11\n  46,  57,  53,  32,  49,  49,  46,  57,  53,  32,  48,  32, // .95 11.95 0 \n  48,  49,  45,  50,  46,  54,  52,  57,  32,  55,  46,  53, // 01-2.649 7.5\n  50,  49,  99,  45,  46,  51,  56,  56,  46,  52,  56,  50, // 21c-.388.482\n  45,  46,  57,  56,  55,  46,  55,  50,  57,  45,  49,  46, // -.987.729-1.\n  54,  48,  53,  46,  55,  50,  57,  72,  49,  51,  46,  52, // 605.729H13.4\n  56,  99,  45,  46,  52,  56,  51,  32,  48,  45,  46,  57, // 8c-.483 0-.9\n  54,  52,  45,  46,  48,  55,  56,  45,  49,  46,  52,  50, // 64-.078-1.42\n  51,  45,  46,  50,  51, 108,  45,  51,  46,  49,  49,  52, // 3-.23l-3.114\n  45,  49,  46,  48,  52,  97,  52,  46,  53,  48,  49,  32, // -1.04a4.501 \n  52,  46,  53,  48,  49,  32,  48,  32,  48,  48,  45,  49, // 4.501 0 00-1\n  46,  52,  50,  51,  45,  46,  50,  51,  72,  53,  46,  57, // .423-.23H5.9\n  48,  52,  77,  49,  52,  46,  50,  53,  32,  57, 104,  50, // 04M14.25 9h2\n  46,  50,  53,  77,  53,  46,  57,  48,  52,  32,  49,  56, // .25M5.904 18\n  46,  55,  53,  99,  46,  48,  56,  51,  46,  50,  48,  53, // .75c.083.205\n  46,  49,  55,  51,  46,  52,  48,  53,  46,  50,  55,  46, // .173.405.27.\n  54,  48,  50,  46,  49,  57,  55,  46,  52,  45,  46,  48, // 602.197.4-.0\n  55,  56,  46,  56,  57,  56,  45,  46,  53,  50,  51,  46, // 78.898-.523.\n  56,  57,  56, 104,  45,  46,  57,  48,  56,  99,  45,  46, // 898h-.908c-.\n  56,  56,  57,  32,  48,  45,  49,  46,  55,  49,  51,  45, // 889 0-1.713-\n  46,  53,  49,  56,  45,  49,  46,  57,  55,  50,  45,  49, // .518-1.972-1\n  46,  51,  54,  56,  97,  49,  50,  32,  49,  50,  32,  48, // .368a12 12 0\n  32,  48,  49,  45,  46,  53,  50,  49,  45,  51,  46,  53, //  01-.521-3.5\n  48,  55,  99,  48,  45,  49,  46,  53,  53,  51,  46,  50, // 07c0-1.553.2\n  57,  53,  45,  51,  46,  48,  51,  54,  46,  56,  51,  49, // 95-3.036.831\n  45,  52,  46,  51,  57,  56,  67,  51,  46,  51,  56,  55, // -4.398C3.387\n  32,  49,  48,  46,  50,  48,  51,  32,  52,  46,  49,  54, //  10.203 4.16\n  55,  32,  57,  46,  55,  53,  32,  53,  32,  57,  46,  55, // 7 9.75 5 9.7\n  53, 104,  49,  46,  48,  53,  51,  99,  46,  52,  55,  50, // 5h1.053c.472\n  32,  48,  32,  46,  55,  52,  53,  46,  53,  53,  54,  46, //  0 .745.556.\n  53,  46,  57,  54,  97,  56,  46,  57,  53,  56,  32,  56, // 5.96a8.958 8\n  46,  57,  53,  56,  32,  48,  32,  48,  48,  45,  49,  46, // .958 0 00-1.\n  51,  48,  50,  32,  52,  46,  54,  54,  53,  99,  48,  32, // 302 4.665c0 \n  49,  46,  49,  57,  52,  46,  50,  51,  50,  32,  50,  46, // 1.194.232 2.\n  51,  51,  51,  46,  54,  53,  52,  32,  51,  46,  51,  55, // 333.654 3.37\n  53, 122,  34,  32,  47,  62,  32,  60,  47, 115, 118, 103, // 5z\" /> </svg\n  62,  96,  44,  10,  32,  32,  98,  97,  99, 107, 119,  97, // >`,.  backwa\n 114, 100,  58,  32, 112, 114, 111, 112, 115,  32,  61,  62, // rd: props =>\n  32, 104, 116, 109, 108,  96,  60, 115, 118, 103,  32,  99, //  html`<svg c\n 108,  97, 115, 115,  61,  36, 123, 112, 114, 111, 112, 115, // lass=${props\n  46,  99, 108,  97, 115, 115, 125,  32, 120, 109, 108, 110, // .class} xmln\n 115,  61,  34, 104, 116, 116, 112,  58,  47,  47, 119, 119, // s=\"http://ww\n 119,  46, 119,  51,  46, 111, 114, 103,  47,  50,  48,  48, // w.w3.org/200\n  48,  47, 115, 118, 103,  34,  32, 102, 105, 108, 108,  61, // 0/svg\" fill=\n  34, 110, 111, 110, 101,  34,  32, 118, 105, 101, 119,  66, // \"none\" viewB\n 111, 120,  61,  34,  48,  32,  48,  32,  50,  52,  32,  50, // ox=\"0 0 24 2\n  52,  34,  32, 115, 116, 114, 111, 107, 101,  45, 119, 105, // 4\" stroke-wi\n 100, 116, 104,  61,  34,  49,  46,  53,  34,  32, 115, 116, // dth=\"1.5\" st\n 114, 111, 107, 101,  61,  34,  99, 117, 114, 114, 101, 110, // roke=\"curren\n 116,  67, 111, 108, 111, 114,  34,  62,  32,  60, 112,  97, // tColor\"> <pa\n 116, 104,  32, 115, 116, 114, 111, 107, 101,  45, 108, 105, // th stroke-li\n 110, 101,  99,  97, 112,  61,  34, 114, 111, 117, 110, 100, // necap=\"round\n  34,  32, 115, 116, 114, 111, 107, 101,  45, 108, 105, 110, // \" stroke-lin\n 101, 106, 111, 105, 110,  61,  34, 114, 111, 117, 110, 100, // ejoin=\"round\n  34,  32, 100,  61,  34,  77,  50,  49,  32,  49,  54,  46, // \" d=\"M21 16.\n  56,  49,  49,  99,  48,  32,  46,  56,  54,  52,  45,  46, // 811c0 .864-.\n  57,  51,  51,  32,  49,  46,  52,  48,  53,  45,  49,  46, // 933 1.405-1.\n  54,  56,  51,  46,  57,  55,  55, 108,  45,  55,  46,  49, // 683.977l-7.1\n  48,  56,  45,  52,  46,  48,  54,  50,  97,  49,  46,  49, // 08-4.062a1.1\n  50,  53,  32,  49,  46,  49,  50,  53,  32,  48,  32,  48, // 25 1.125 0 0\n  49,  48,  45,  49,  46,  57,  53,  51, 108,  55,  46,  49, // 10-1.953l7.1\n  48,  56,  45,  52,  46,  48,  54,  50,  65,  49,  46,  49, // 08-4.062A1.1\n  50,  53,  32,  49,  46,  49,  50,  53,  32,  48,  32,  48, // 25 1.125 0 0\n  49,  50,  49,  32,  56,  46,  54,  56,  56, 118,  56,  46, // 121 8.688v8.\n  49,  50,  51, 122,  77,  49,  49,  46,  50,  53,  32,  49, // 123zM11.25 1\n  54,  46,  56,  49,  49,  99,  48,  32,  46,  56,  54,  52, // 6.811c0 .864\n  45,  46,  57,  51,  51,  32,  49,  46,  52,  48,  53,  45, // -.933 1.405-\n  49,  46,  54,  56,  51,  46,  57,  55,  55, 108,  45,  55, // 1.683.977l-7\n  46,  49,  48,  56,  45,  52,  46,  48,  54,  50,  97,  49, // .108-4.062a1\n  46,  49,  50,  53,  32,  49,  46,  49,  50,  53,  32,  48, // .125 1.125 0\n  32,  48,  49,  48,  45,  49,  46,  57,  53,  51,  76,  57, //  010-1.953L9\n  46,  53,  54,  55,  32,  55,  46,  55,  49,  97,  49,  46, // .567 7.71a1.\n  49,  50,  53,  32,  49,  46,  49,  50,  53,  32,  48,  32, // 125 1.125 0 \n  48,  49,  49,  46,  54,  56,  51,  46,  57,  55,  55, 118, // 011.683.977v\n  56,  46,  49,  50,  51, 122,  34,  32,  47,  62,  32,  60, // 8.123z\" /> <\n  47, 115, 118, 103,  62,  96,  44,  10,  32,  32,  99, 104, // /svg>`,.  ch\n 105, 112,  58,  32, 112, 114, 111, 112, 115,  32,  61,  62, // ip: props =>\n  32, 104, 116, 109, 108,  96,  60, 115, 118, 103,  32,  99, //  html`<svg c\n 108,  97, 115, 115,  61,  36, 123, 112, 114, 111, 112, 115, // lass=${props\n  46,  99, 108,  97, 115, 115, 125,  32, 120, 109, 108, 110, // .class} xmln\n 115,  61,  34, 104, 116, 116, 112,  58,  47,  47, 119, 119, // s=\"http://ww\n 119,  46, 119,  51,  46, 111, 114, 103,  47,  50,  48,  48, // w.w3.org/200\n  48,  47, 115, 118, 103,  34,  32, 102, 105, 108, 108,  61, // 0/svg\" fill=\n  34, 110, 111, 110, 101,  34,  32, 118, 105, 101, 119,  66, // \"none\" viewB\n 111, 120,  61,  34,  48,  32,  48,  32,  50,  52,  32,  50, // ox=\"0 0 24 2\n  52,  34,  32, 115, 116, 114, 111, 107, 101,  45, 119, 105, // 4\" stroke-wi\n 100, 116, 104,  61,  34,  49,  46,  53,  34,  32, 115, 116, // dth=\"1.5\" st\n 114, 111, 107, 101,  61,  34,  99, 117, 114, 114, 101, 110, // roke=\"curren\n 116,  67, 111, 108, 111, 114,  34,  62,  32,  60, 112,  97, // tColor\"> <pa\n 116, 104,  32, 115, 116, 114, 111, 107, 101,  45, 108, 105, // th stroke-li\n 110, 101,  99,  97, 112,  61,  34, 114, 111, 117, 110, 100, // necap=\"round\n  34,  32, 115, 116, 114, 111, 107, 101,  45, 108, 105, 110, // \" stroke-lin\n 101, 106, 111, 105, 110,  61,  34, 114, 111, 117, 110, 100, // ejoin=\"round\n  34,  32, 100,  61,  34,  77,  56,  46,  50,  53,  32,  51, // \" d=\"M8.25 3\n 118,  49,  46,  53,  77,  52,  46,  53,  32,  56,  46,  50, // v1.5M4.5 8.2\n  53,  72,  51, 109,  49,  56,  32,  48, 104,  45,  49,  46, // 5H3m18 0h-1.\n  53,  77,  52,  46,  53,  32,  49,  50,  72,  51, 109,  49, // 5M4.5 12H3m1\n  56,  32,  48, 104,  45,  49,  46,  53, 109,  45,  49,  53, // 8 0h-1.5m-15\n  32,  51,  46,  55,  53,  72,  51, 109,  49,  56,  32,  48, //  3.75H3m18 0\n 104,  45,  49,  46,  53,  77,  56,  46,  50,  53,  32,  49, // h-1.5M8.25 1\n  57,  46,  53,  86,  50,  49,  77,  49,  50,  32,  51, 118, // 9.5V21M12 3v\n  49,  46,  53, 109,  48,  32,  49,  53,  86,  50,  49, 109, // 1.5m0 15V21m\n  51,  46,  55,  53,  45,  49,  56, 118,  49,  46,  53, 109, // 3.75-18v1.5m\n  48,  32,  49,  53,  86,  50,  49, 109,  45,  57,  45,  49, // 0 15V21m-9-1\n  46,  53, 104,  49,  48,  46,  53,  97,  50,  46,  50,  53, // .5h10.5a2.25\n  32,  50,  46,  50,  53,  32,  48,  32,  48,  48,  50,  46, //  2.25 0 002.\n  50,  53,  45,  50,  46,  50,  53,  86,  54,  46,  55,  53, // 25-2.25V6.75\n  97,  50,  46,  50,  53,  32,  50,  46,  50,  53,  32,  48, // a2.25 2.25 0\n  32,  48,  48,  45,  50,  46,  50,  53,  45,  50,  46,  50, //  00-2.25-2.2\n  53,  72,  54,  46,  55,  53,  65,  50,  46,  50,  53,  32, // 5H6.75A2.25 \n  50,  46,  50,  53,  32,  48,  32,  48,  48,  52,  46,  53, // 2.25 0 004.5\n  32,  54,  46,  55,  53, 118,  49,  48,  46,  53,  97,  50, //  6.75v10.5a2\n  46,  50,  53,  32,  50,  46,  50,  53,  32,  48,  32,  48, // .25 2.25 0 0\n  48,  50,  46,  50,  53,  32,  50,  46,  50,  53, 122, 109, // 02.25 2.25zm\n  46,  55,  53,  45,  49,  50, 104,  57, 118,  57, 104,  45, // .75-12h9v9h-\n  57, 118,  45,  57, 122,  34,  32,  47,  62,  32,  60,  47, // 9v-9z\" /> </\n 115, 118, 103,  62,  96,  44,  10,  32,  32,  99,  97, 109, // svg>`,.  cam\n 101, 114,  97,  58,  32, 112, 114, 111, 112, 115,  32,  61, // era: props =\n  62,  32, 104, 116, 109, 108,  96,  60, 115, 118, 103,  32, // > html`<svg \n  99, 108,  97, 115, 115,  61,  36, 123, 112, 114, 111, 112, // class=${prop\n 115,  46,  99, 108,  97, 115, 115, 125,  32, 120, 109, 108, // s.class} xml\n 110, 115,  61,  34, 104, 116, 116, 112,  58,  47,  47, 119, // ns=\"http://w\n 119, 119,  46, 119,  51,  46, 111, 114, 103,  47,  50,  48, // ww.w3.org/20\n  48,  48,  47, 115, 118, 103,  34,  32, 102, 105, 108, 108, // 00/svg\" fill\n  61,  34, 110, 111, 110, 101,  34,  32, 118, 105, 101, 119, // =\"none\" view\n  66, 111, 120,  61,  34,  48,  32,  48,  32,  50,  52,  32, // Box=\"0 0 24 \n  50,  52,  34,  32, 115, 116, 114, 111, 107, 101,  45, 119, // 24\" stroke-w\n 105, 100, 116, 104,  61,  34,  49,  46,  53,  34,  32, 115, // idth=\"1.5\" s\n 116, 114, 111, 107, 101,  61,  34,  99, 117, 114, 114, 101, // troke=\"curre\n 110, 116,  67, 111, 108, 111, 114,  34,  62,  32,  60, 112, // ntColor\"> <p\n  97, 116, 104,  32, 115, 116, 114, 111, 107, 101,  45, 108, // ath stroke-l\n 105, 110, 101,  99,  97, 112,  61,  34, 114, 111, 117, 110, // inecap=\"roun\n 100,  34,  32, 115, 116, 114, 111, 107, 101,  45, 108, 105, // d\" stroke-li\n 110, 101, 106, 111, 105, 110,  61,  34, 114, 111, 117, 110, // nejoin=\"roun\n 100,  34,  32, 100,  61,  34,  77,  54,  46,  56,  50,  55, // d\" d=\"M6.827\n  32,  54,  46,  49,  55,  53,  65,  50,  46,  51,  49,  32, //  6.175A2.31 \n  50,  46,  51,  49,  32,  48,  32,  48,  49,  53,  46,  49, // 2.31 0 015.1\n  56,  54,  32,  55,  46,  50,  51,  99,  45,  46,  51,  56, // 86 7.23c-.38\n  46,  48,  53,  52,  45,  46,  55,  53,  55,  46,  49,  49, // .054-.757.11\n  50,  45,  49,  46,  49,  51,  52,  46,  49,  55,  53,  67, // 2-1.134.175C\n  50,  46,  57,  57,  57,  32,  55,  46,  53,  56,  32,  50, // 2.999 7.58 2\n  46,  50,  53,  32,  56,  46,  53,  48,  55,  32,  50,  46, // .25 8.507 2.\n  50,  53,  32,  57,  46,  53,  55,  52,  86,  49,  56,  97, // 25 9.574V18a\n  50,  46,  50,  53,  32,  50,  46,  50,  53,  32,  48,  32, // 2.25 2.25 0 \n  48,  48,  50,  46,  50,  53,  32,  50,  46,  50,  53, 104, // 002.25 2.25h\n  49,  53,  65,  50,  46,  50,  53,  32,  50,  46,  50,  53, // 15A2.25 2.25\n  32,  48,  32,  48,  48,  50,  49,  46,  55,  53,  32,  49, //  0 0021.75 1\n  56,  86,  57,  46,  53,  55,  52,  99,  48,  45,  49,  46, // 8V9.574c0-1.\n  48,  54,  55,  45,  46,  55,  53,  45,  49,  46,  57,  57, // 067-.75-1.99\n  52,  45,  49,  46,  56,  48,  50,  45,  50,  46,  49,  54, // 4-1.802-2.16\n  57,  97,  52,  55,  46,  56,  54,  53,  32,  52,  55,  46, // 9a47.865 47.\n  56,  54,  53,  32,  48,  32,  48,  48,  45,  49,  46,  49, // 865 0 00-1.1\n  51,  52,  45,  46,  49,  55,  53,  32,  50,  46,  51,  49, // 34-.175 2.31\n  32,  50,  46,  51,  49,  32,  48,  32,  48,  49,  45,  49, //  2.31 0 01-1\n  46,  54,  52,  45,  49,  46,  48,  53,  53, 108,  45,  46, // .64-1.055l-.\n  56,  50,  50,  45,  49,  46,  51,  49,  54,  97,  50,  46, // 822-1.316a2.\n  49,  57,  50,  32,  50,  46,  49,  57,  50,  32,  48,  32, // 192 2.192 0 \n  48,  48,  45,  49,  46,  55,  51,  54,  45,  49,  46,  48, // 00-1.736-1.0\n  51,  57,  32,  52,  56,  46,  55,  55,  52,  32,  52,  56, // 39 48.774 48\n  46,  55,  55,  52,  32,  48,  32,  48,  48,  45,  53,  46, // .774 0 00-5.\n  50,  51,  50,  32,  48,  32,  50,  46,  49,  57,  50,  32, // 232 0 2.192 \n  50,  46,  49,  57,  50,  32,  48,  32,  48,  48,  45,  49, // 2.192 0 00-1\n  46,  55,  51,  54,  32,  49,  46,  48,  51,  57, 108,  45, // .736 1.039l-\n  46,  56,  50,  49,  32,  49,  46,  51,  49,  54, 122,  34, // .821 1.316z\"\n  32,  47,  62,  32,  60, 112,  97, 116, 104,  32, 115, 116, //  /> <path st\n 114, 111, 107, 101,  45, 108, 105, 110, 101,  99,  97, 112, // roke-linecap\n  61,  34, 114, 111, 117, 110, 100,  34,  32, 115, 116, 114, // =\"round\" str\n 111, 107, 101,  45, 108, 105, 110, 101, 106, 111, 105, 110, // oke-linejoin\n  61,  34, 114, 111, 117, 110, 100,  34,  32, 100,  61,  34, // =\"round\" d=\"\n  77,  49,  54,  46,  53,  32,  49,  50,  46,  55,  53,  97, // M16.5 12.75a\n  52,  46,  53,  32,  52,  46,  53,  32,  48,  32,  49,  49, // 4.5 4.5 0 11\n  45,  57,  32,  48,  32,  52,  46,  53,  32,  52,  46,  53, // -9 0 4.5 4.5\n  32,  48,  32,  48,  49,  57,  32,  48, 122,  77,  49,  56, //  0 019 0zM18\n  46,  55,  53,  32,  49,  48,  46,  53, 104,  46,  48,  48, // .75 10.5h.00\n  56, 118,  46,  48,  48,  56, 104,  45,  46,  48,  48,  56, // 8v.008h-.008\n  86,  49,  48,  46,  53, 122,  34,  32,  47,  62,  32,  60, // V10.5z\" /> <\n  47, 115, 118, 103,  62,  96,  44,  10,  32,  32,  97, 114, // /svg>`,.  ar\n 114, 111, 119, 115,  58,  32, 112, 114, 111, 112, 115,  32, // rows: props \n  61,  62,  32, 104, 116, 109, 108,  96,  60, 115, 118, 103, // => html`<svg\n  32,  99, 108,  97, 115, 115,  61,  36, 123, 112, 114, 111, //  class=${pro\n 112, 115,  46,  99, 108,  97, 115, 115, 125,  32, 120, 109, // ps.class} xm\n 108, 110, 115,  61,  34, 104, 116, 116, 112,  58,  47,  47, // lns=\"http://\n 119, 119, 119,  46, 119,  51,  46, 111, 114, 103,  47,  50, // www.w3.org/2\n  48,  48,  48,  47, 115, 118, 103,  34,  32, 102, 105, 108, // 000/svg\" fil\n 108,  61,  34, 110, 111, 110, 101,  34,  32, 118, 105, 101, // l=\"none\" vie\n 119,  66, 111, 120,  61,  34,  48,  32,  48,  32,  50,  52, // wBox=\"0 0 24\n  32,  50,  52,  34,  32, 115, 116, 114, 111, 107, 101,  45, //  24\" stroke-\n 119, 105, 100, 116, 104,  61,  34,  49,  46,  53,  34,  32, // width=\"1.5\" \n 115, 116, 114, 111, 107, 101,  61,  34,  99, 117, 114, 114, // stroke=\"curr\n 101, 110, 116,  67, 111, 108, 111, 114,  34,  62,  32,  60, // entColor\"> <\n 112,  97, 116, 104,  32, 115, 116, 114, 111, 107, 101,  45, // path stroke-\n 108, 105, 110, 101,  99,  97, 112,  61,  34, 114, 111, 117, // linecap=\"rou\n 110, 100,  34,  32, 115, 116, 114, 111, 107, 101,  45, 108, // nd\" stroke-l\n 105, 110, 101, 106, 111, 105, 110,  61,  34, 114, 111, 117, // inejoin=\"rou\n 110, 100,  34,  32, 100,  61,  34,  77,  55,  46,  53,  32, // nd\" d=\"M7.5 \n  50,  49,  76,  51,  32,  49,  54,  46,  53, 109,  48,  32, // 21L3 16.5m0 \n  48,  76,  55,  46,  53,  32,  49,  50,  77,  51,  32,  49, // 0L7.5 12M3 1\n  54,  46,  53, 104,  49,  51,  46,  53, 109,  48,  45,  49, // 6.5h13.5m0-1\n  51,  46,  53,  76,  50,  49,  32,  55,  46,  53, 109,  48, // 3.5L21 7.5m0\n  32,  48,  76,  49,  54,  46,  53,  32,  49,  50,  77,  50, //  0L16.5 12M2\n  49,  32,  55,  46,  53,  72,  55,  46,  53,  34,  32,  47, // 1 7.5H7.5\" /\n  62,  32,  60,  47, 115, 118, 103,  62,  96,  44,  10,  32, // > </svg>`,. \n  32, 100, 111,  99,  58,  32, 112, 114, 111, 112, 115,  32, //  doc: props \n  61,  62,  32, 104, 116, 109, 108,  96,  60, 115, 118, 103, // => html`<svg\n  32,  99, 108,  97, 115, 115,  61,  36, 123, 112, 114, 111, //  class=${pro\n 112, 115,  46,  99, 108,  97, 115, 115, 125,  32, 120, 109, // ps.class} xm\n 108, 110, 115,  61,  34, 104, 116, 116, 112,  58,  47,  47, // lns=\"http://\n 119, 119, 119,  46, 119,  51,  46, 111, 114, 103,  47,  50, // www.w3.org/2\n  48,  48,  48,  47, 115, 118, 103,  34,  32, 102, 105, 108, // 000/svg\" fil\n 108,  61,  34, 110, 111, 110, 101,  34,  32, 118, 105, 101, // l=\"none\" vie\n 119,  66, 111, 120,  61,  34,  48,  32,  48,  32,  50,  52, // wBox=\"0 0 24\n  32,  50,  52,  34,  32, 115, 116, 114, 111, 107, 101,  45, //  24\" stroke-\n 119, 105, 100, 116, 104,  61,  34,  49,  46,  53,  34,  32, // width=\"1.5\" \n 115, 116, 114, 111, 107, 101,  61,  34,  99, 117, 114, 114, // stroke=\"curr\n 101, 110, 116,  67, 111, 108, 111, 114,  34,  62,  32,  60, // entColor\"> <\n 112,  97, 116, 104,  32, 115, 116, 114, 111, 107, 101,  45, // path stroke-\n 108, 105, 110, 101,  99,  97, 112,  61,  34, 114, 111, 117, // linecap=\"rou\n 110, 100,  34,  32, 115, 116, 114, 111, 107, 101,  45, 108, // nd\" stroke-l\n 105, 110, 101, 106, 111, 105, 110,  61,  34, 114, 111, 117, // inejoin=\"rou\n 110, 100,  34,  32, 100,  61,  34,  77,  49,  57,  46,  53, // nd\" d=\"M19.5\n  32,  49,  52,  46,  50,  53, 118,  45,  50,  46,  54,  50, //  14.25v-2.62\n  53,  97,  51,  46,  51,  55,  53,  32,  51,  46,  51,  55, // 5a3.375 3.37\n  53,  32,  48,  32,  48,  48,  45,  51,  46,  51,  55,  53, // 5 0 00-3.375\n  45,  51,  46,  51,  55,  53, 104,  45,  49,  46,  53,  65, // -3.375h-1.5A\n  49,  46,  49,  50,  53,  32,  49,  46,  49,  50,  53,  32, // 1.125 1.125 \n  48,  32,  48,  49,  49,  51,  46,  53,  32,  55,  46,  49, // 0 0113.5 7.1\n  50,  53, 118,  45,  49,  46,  53,  97,  51,  46,  51,  55, // 25v-1.5a3.37\n  53,  32,  51,  46,  51,  55,  53,  32,  48,  32,  48,  48, // 5 3.375 0 00\n  45,  51,  46,  51,  55,  53,  45,  51,  46,  51,  55,  53, // -3.375-3.375\n  72,  56,  46,  50,  53, 109,  50,  46,  50,  53,  32,  48, // H8.25m2.25 0\n  72,  53,  46,  54,  50,  53,  99,  45,  46,  54,  50,  49, // H5.625c-.621\n  32,  48,  45,  49,  46,  49,  50,  53,  46,  53,  48,  52, //  0-1.125.504\n  45,  49,  46,  49,  50,  53,  32,  49,  46,  49,  50,  53, // -1.125 1.125\n 118,  49,  55,  46,  50,  53,  99,  48,  32,  46,  54,  50, // v17.25c0 .62\n  49,  46,  53,  48,  52,  32,  49,  46,  49,  50,  53,  32, // 1.504 1.125 \n  49,  46,  49,  50,  53,  32,  49,  46,  49,  50,  53, 104, // 1.125 1.125h\n  49,  50,  46,  55,  53,  99,  46,  54,  50,  49,  32,  48, // 12.75c.621 0\n  32,  49,  46,  49,  50,  53,  45,  46,  53,  48,  52,  32, //  1.125-.504 \n  49,  46,  49,  50,  53,  45,  49,  46,  49,  50,  53,  86, // 1.125-1.125V\n  49,  49,  46,  50,  53,  97,  57,  32,  57,  32,  48,  32, // 11.25a9 9 0 \n  48,  48,  45,  57,  45,  57, 122,  34,  32,  47,  62,  60, // 00-9-9z\" /><\n  47, 115, 118, 103,  62,  96,  44,  10, 125,  59,  10,  10, // /svg>`,.};..\n 101, 120, 112, 111, 114, 116,  32,  99, 111, 110, 115, 116, // export const\n  32, 116, 105, 112,  67, 111, 108, 111, 114, 115,  32,  61, //  tipColors =\n  32, 123,  10,  32,  32, 103, 114, 101, 101, 110,  58,  32, //  {.  green: \n  39,  98, 103,  45, 103, 114, 101, 101, 110,  45,  49,  48, // 'bg-green-10\n  48,  32, 116, 101, 120, 116,  45, 103, 114, 101, 101, 110, // 0 text-green\n  45,  57,  48,  48,  32, 114, 105, 110, 103,  45, 103, 114, // -900 ring-gr\n 101, 101, 110,  45,  51,  48,  48,  39,  44,  10,  32,  32, // een-300',.  \n 121, 101, 108, 108, 111, 119,  58,  32,  39,  98, 103,  45, // yellow: 'bg-\n 121, 101, 108, 108, 111, 119,  45,  49,  48,  48,  32, 116, // yellow-100 t\n 101, 120, 116,  45, 121, 101, 108, 108, 111, 119,  45,  57, // ext-yellow-9\n  48,  48,  32, 114, 105, 110, 103,  45, 121, 101, 108, 108, // 00 ring-yell\n 111, 119,  45,  51,  48,  48,  39,  44,  10,  32,  32, 114, // ow-300',.  r\n 101, 100,  58,  32,  39,  98, 103,  45, 114, 101, 100,  45, // ed: 'bg-red-\n  49,  48,  48,  32, 116, 101, 120, 116,  45, 114, 101, 100, // 100 text-red\n  45,  57,  48,  48,  32, 114, 105, 110, 103,  45, 114, 101, // -900 ring-re\n 100,  45,  51,  48,  48,  39,  44,  10, 125,  59,  10,  10, // d-300',.};..\n 101, 120, 112, 111, 114, 116,  32, 102, 117, 110,  99, 116, // export funct\n 105, 111, 110,  32,  66, 117, 116, 116, 111, 110,  40, 123, // ion Button({\n 116, 105, 116, 108, 101,  44,  32, 111, 110,  99, 108, 105, // title, oncli\n  99, 107,  44,  32, 100, 105, 115,  97,  98, 108, 101, 100, // ck, disabled\n  44,  32,  99, 108, 115,  44,  32, 105,  99, 111, 110,  44, // , cls, icon,\n  32, 114, 101, 102,  44,  32,  99, 111, 108, 111, 114, 115, //  ref, colors\n  44,  32, 104, 111, 118, 101, 114,  99, 111, 108, 111, 114, // , hovercolor\n  44,  32, 100, 105, 115,  97,  98, 108, 101, 100,  99, 111, // , disabledco\n 108, 111, 114, 125,  41,  32, 123,  10,  32,  32,  99, 111, // lor}) {.  co\n 110, 115, 116,  32,  91, 115, 112, 105, 110,  44,  32, 115, // nst [spin, s\n 101, 116,  83, 112, 105, 110,  93,  32,  61,  32, 117, 115, // etSpin] = us\n 101,  83, 116,  97, 116, 101,  40, 102,  97, 108, 115, 101, // eState(false\n  41,  59,  10,  32,  32,  99, 111, 110, 115, 116,  32,  99, // );.  const c\n  98,  32,  61,  32, 102, 117, 110,  99, 116, 105, 111, 110, // b = function\n  40, 101, 118,  41,  32, 123,  10,  32,  32,  32,  32,  99, // (ev) {.    c\n 111, 110, 115, 116,  32, 114, 101, 115,  32,  61,  32, 111, // onst res = o\n 110,  99, 108, 105,  99, 107,  32,  63,  32, 111, 110,  99, // nclick ? onc\n 108, 105,  99, 107,  40,  41,  32,  58,  32, 110, 117, 108, // lick() : nul\n 108,  59,  10,  32,  32,  32,  32, 105, 102,  32,  40, 114, // l;.    if (r\n 101, 115,  32,  38,  38,  32, 116, 121, 112, 101, 111, 102, // es && typeof\n  32,  40, 114, 101, 115,  46,  99,  97, 116,  99, 104,  41, //  (res.catch)\n  32,  61,  61,  61,  32,  39, 102, 117, 110,  99, 116, 105, //  === 'functi\n 111, 110,  39,  41,  32, 123,  10,  32,  32,  32,  32,  32, // on') {.     \n  32, 115, 101, 116,  83, 112, 105, 110,  40, 116, 114, 117, //  setSpin(tru\n 101,  41,  59,  10,  32,  32,  32,  32,  32,  32, 114, 101, // e);.      re\n 115,  46,  99,  97, 116,  99, 104,  40,  40,  41,  32,  61, // s.catch(() =\n  62,  32, 102,  97, 108, 115, 101,  41,  46, 116, 104, 101, // > false).the\n 110,  40,  40,  41,  32,  61,  62,  32, 115, 101, 116,  83, // n(() => setS\n 112, 105, 110,  40, 102,  97, 108, 115, 101,  41,  41,  59, // pin(false));\n  10,  32,  32,  32,  32, 125,  10,  32,  32, 125,  59,  10, // .    }.  };.\n  32,  32, 105, 102,  32,  40,  33,  99, 111, 108, 111, 114, //   if (!color\n 115,  41,  32,  99, 111, 108, 111, 114, 115,  32,  61,  32, // s) colors = \n  39,  98, 103,  45,  98, 108, 117, 101,  45,  54,  48,  48, // 'bg-blue-600\n  32, 104, 111, 118, 101, 114,  58,  98, 103,  45,  98, 108, //  hover:bg-bl\n 117, 101,  45,  53,  48,  48,  32, 100, 105, 115,  97,  98, // ue-500 disab\n 108, 101, 100,  58,  98, 103,  45,  98, 108, 117, 101,  45, // led:bg-blue-\n  52,  48,  48,  39,  59,  10,  32,  32, 114, 101, 116, 117, // 400';.  retu\n 114, 110,  32, 104, 116, 109, 108,  96,  10,  60,  98, 117, // rn html`.<bu\n 116, 116, 111, 110,  32, 116, 121, 112, 101,  61,  34,  98, // tton type=\"b\n 117, 116, 116, 111, 110,  34,  32,  99, 108,  97, 115, 115, // utton\" class\n  61,  34, 105, 110, 108, 105, 110, 101,  45, 102, 108, 101, // =\"inline-fle\n 120,  32, 106, 117, 115, 116, 105, 102, 121,  45,  99, 101, // x justify-ce\n 110, 116, 101, 114,  32, 105, 116, 101, 109, 115,  45,  99, // nter items-c\n 101, 110, 116, 101, 114,  32, 103,  97, 112,  45,  50,  32, // enter gap-2 \n 114, 111, 117, 110, 100, 101, 100,  32, 112, 120,  45,  50, // rounded px-2\n  46,  53,  32, 112, 121,  45,  49,  46,  53,  32, 116, 101, // .5 py-1.5 te\n 120, 116,  45, 115, 109,  32, 102, 111, 110, 116,  45, 115, // xt-sm font-s\n 101, 109, 105,  98, 111, 108, 100,  32, 116, 101, 120, 116, // emibold text\n  45, 119, 104, 105, 116, 101,  32, 115, 104,  97, 100, 111, // -white shado\n 119,  45, 115, 109,  32,  36, 123,  99, 111, 108, 111, 114, // w-sm ${color\n 115, 125,  32,  36, 123,  99, 108, 115, 125,  34,  10,  32, // s} ${cls}\". \n  32, 114, 101, 102,  61,  36, 123, 114, 101, 102, 125,  32, //  ref=${ref} \n 111, 110,  99, 108, 105,  99, 107,  61,  36, 123,  99,  98, // onclick=${cb\n 125,  32, 100, 105, 115,  97,  98, 108, 101, 100,  61,  36, // } disabled=$\n 123, 100, 105, 115,  97,  98, 108, 101, 100,  32, 124, 124, // {disabled ||\n  32, 115, 112, 105, 110, 125,  32,  62,  10,  32,  32,  36, //  spin} >.  $\n 123, 116, 105, 116, 108, 101, 125,  10,  32,  32,  60,  36, // {title}.  <$\n 123, 115, 112, 105, 110,  32,  63,  32,  73,  99, 111, 110, // {spin ? Icon\n 115,  46, 114, 101, 102, 114, 101, 115, 104,  32,  58,  32, // s.refresh : \n 105,  99, 111, 110, 125,  32,  99, 108,  97, 115, 115,  61, // icon} class=\n  34, 119,  45,  52,  32,  36, 123, 115, 112, 105, 110,  32, // \"w-4 ${spin \n  63,  32,  39,  97, 110, 105, 109,  97, 116, 101,  45, 115, // ? 'animate-s\n 112, 105, 110,  39,  32,  58,  32,  39,  39, 125,  34,  32, // pin' : ''}\" \n  47,  62,  10,  60,  47,  47,  62,  96,  10, 125,  59,  10, // />.<//>`.};.\n  10, 101, 120, 112, 111, 114, 116,  32, 102, 117, 110,  99, // .export func\n 116, 105, 111, 110,  32,  78, 111, 116, 105, 102, 105,  99, // tion Notific\n  97, 116, 105, 111, 110,  40, 123, 111, 107,  44,  32, 116, // ation({ok, t\n 101, 120, 116,  44,  32,  99, 108, 111, 115, 101, 125,  41, // ext, close})\n  32, 123,  10,  32,  32,  99, 111, 110, 115, 116,  32,  99, //  {.  const c\n 108, 111, 115, 101,  98, 116, 110,  32,  61,  32, 117, 115, // losebtn = us\n 101,  82, 101, 102,  40, 110, 117, 108, 108,  41,  59,  10, // eRef(null);.\n  32,  32,  99, 111, 110, 115, 116,  32, 102, 114, 111, 109, //   const from\n  32,  61,  32,  39, 116, 114,  97, 110, 115, 108,  97, 116, //  = 'translat\n 101,  45, 121,  45,  50,  32, 111, 112,  97,  99, 105, 116, // e-y-2 opacit\n 121,  45,  48,  32, 115, 109,  58, 116, 114,  97, 110, 115, // y-0 sm:trans\n 108,  97, 116, 101,  45, 121,  45,  48,  32, 115, 109,  58, // late-y-0 sm:\n 116, 114,  97, 110, 115, 108,  97, 116, 101,  45, 120,  45, // translate-x-\n  50,  39,  59,  10,  32,  32,  99, 111, 110, 115, 116,  32, // 2';.  const \n 116, 111,  32,  61,  32,  39, 116, 114,  97, 110, 115, 108, // to = 'transl\n  97, 116, 101,  45, 121,  45,  48,  32, 111, 112,  97,  99, // ate-y-0 opac\n 105, 116, 121,  45,  49,  48,  48,  32, 115, 109,  58, 116, // ity-100 sm:t\n 114,  97, 110, 115, 108,  97, 116, 101,  45, 120,  45,  48, // ranslate-x-0\n  39,  59,  10,  32,  32,  99, 111, 110, 115, 116,  32,  91, // ';.  const [\n 116, 114,  44,  32, 115, 101, 116,  84, 114,  93,  32,  61, // tr, setTr] =\n  32, 117, 115, 101,  83, 116,  97, 116, 101,  40, 102, 114, //  useState(fr\n 111, 109,  41,  59,  10,  32,  32, 117, 115, 101,  69, 102, // om);.  useEf\n 102, 101,  99, 116,  40, 102, 117, 110,  99, 116, 105, 111, // fect(functio\n 110,  40,  41,  32, 123,  10,  32,  32,  32,  32, 115, 101, // n() {.    se\n 116,  84, 114,  40, 116, 111,  41,  59,  32,  10,  32,  32, // tTr(to); .  \n  32,  32, 115, 101, 116,  84, 105, 109, 101, 111, 117, 116, //   setTimeout\n  40, 101, 118,  32,  61,  62,  32,  99, 108, 111, 115, 101, // (ev => close\n  98, 116, 110,  32,  38,  38,  32,  99, 108, 111, 115, 101, // btn && close\n  98, 116, 110,  46,  99, 117, 114, 114, 101, 110, 116,  46, // btn.current.\n  99, 108, 105,  99, 107,  32,  38,  38,  32,  99, 108, 111, // click && clo\n 115, 101,  98, 116, 110,  46,  99, 117, 114, 114, 101, 110, // sebtn.curren\n 116,  46,  99, 108, 105,  99, 107,  40,  41,  44,  32,  49, // t.click(), 1\n  53,  48,  48,  41,  59,  10,  32,  32, 125,  44,  32,  91, // 500);.  }, [\n  93,  41,  59,  10,  32,  32,  99, 111, 110, 115, 116,  32, // ]);.  const \n 111, 110,  99, 108, 111, 115, 101,  32,  61,  32, 101, 118, // onclose = ev\n  32,  61,  62,  32, 123,  32, 115, 101, 116,  84, 114,  40, //  => { setTr(\n 102, 114, 111, 109,  41,  59,  32, 115, 101, 116,  84, 105, // from); setTi\n 109, 101, 111, 117, 116,  40,  99, 108, 111, 115, 101,  44, // meout(close,\n  32,  51,  48,  48,  41,  59,  32, 125,  59,  10,  32,  32, //  300); };.  \n 114, 101, 116, 117, 114, 110,  32, 104, 116, 109, 108,  96, // return html`\n  10,  60, 100, 105, 118,  32,  97, 114, 105,  97,  45, 108, // .<div aria-l\n 105, 118, 101,  61,  34,  97, 115, 115, 101, 114, 116, 105, // ive=\"asserti\n 118, 101,  34,  32,  99, 108,  97, 115, 115,  61,  34, 122, // ve\" class=\"z\n  45,  49,  48,  32, 112, 111, 105, 110, 116, 101, 114,  45, // -10 pointer-\n 101, 118, 101, 110, 116, 115,  45, 110, 111, 110, 101,  32, // events-none \n  97,  98, 115, 111, 108, 117, 116, 101,  32, 105, 110, 115, // absolute ins\n 101, 116,  45,  48,  32, 102, 108, 101, 120,  32, 105, 116, // et-0 flex it\n 101, 109, 115,  45, 101, 110, 100,  32, 112, 120,  45,  52, // ems-end px-4\n  32, 112, 121,  45,  54,  32, 115, 109,  58, 105, 116, 101, //  py-6 sm:ite\n 109, 115,  45, 115, 116,  97, 114, 116,  32, 115, 109,  58, // ms-start sm:\n 112,  45,  54,  34,  62,  10,  32,  32,  60, 100, 105, 118, // p-6\">.  <div\n  32,  99, 108,  97, 115, 115,  61,  34, 102, 108, 101, 120, //  class=\"flex\n  32, 119,  45, 102, 117, 108, 108,  32, 102, 108, 101, 120, //  w-full flex\n  45,  99, 111, 108,  32, 105, 116, 101, 109, 115,  45,  99, // -col items-c\n 101, 110, 116, 101, 114,  32, 115, 112,  97,  99, 101,  45, // enter space-\n 121,  45,  52,  32, 115, 109,  58, 105, 116, 101, 109, 115, // y-4 sm:items\n  45, 101, 110, 100,  34,  62,  10,  32,  32,  32,  32,  60, // -end\">.    <\n 100, 105, 118,  32,  99, 108,  97, 115, 115,  61,  34, 112, // div class=\"p\n 111, 105, 110, 116, 101, 114,  45, 101, 118, 101, 110, 116, // ointer-event\n 115,  45,  97, 117, 116, 111,  32, 119,  45, 102, 117, 108, // s-auto w-ful\n 108,  32, 109,  97, 120,  45, 119,  45, 115, 109,  32, 111, // l max-w-sm o\n 118, 101, 114, 102, 108, 111, 119,  45, 104, 105, 100, 100, // verflow-hidd\n 101, 110,  32, 114, 111, 117, 110, 100, 101, 100,  45, 108, // en rounded-l\n 103,  32,  98, 103,  45, 119, 104, 105, 116, 101,  32, 115, // g bg-white s\n 104,  97, 100, 111, 119,  45, 108, 103,  32, 114, 105, 110, // hadow-lg rin\n 103,  45,  49,  32, 114, 105, 110, 103,  45,  98, 108,  97, // g-1 ring-bla\n  99, 107,  32, 114, 105, 110, 103,  45, 111, 112,  97,  99, // ck ring-opac\n 105, 116, 121,  45,  53,  32, 116, 114,  97, 110, 115, 102, // ity-5 transf\n 111, 114, 109,  32, 101,  97, 115, 101,  45, 111, 117, 116, // orm ease-out\n  32, 100, 117, 114,  97, 116, 105, 111, 110,  45,  51,  48, //  duration-30\n  48,  32, 116, 114,  97, 110, 115, 105, 116, 105, 111, 110, // 0 transition\n  32,  36, 123, 116, 114, 125,  34,  62,  10,  32,  32,  32, //  ${tr}\">.   \n  32,  32,  32,  60, 100, 105, 118,  32,  99, 108,  97, 115, //    <div clas\n 115,  61,  34, 112,  45,  52,  34,  62,  10,  32,  32,  32, // s=\"p-4\">.   \n  32,  32,  32,  32,  32,  60, 100, 105, 118,  32,  99, 108, //      <div cl\n  97, 115, 115,  61,  34, 102, 108, 101, 120,  32, 105, 116, // ass=\"flex it\n 101, 109, 115,  45, 115, 116,  97, 114, 116,  34,  62,  10, // ems-start\">.\n  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  60, 100, //           <d\n 105, 118,  32,  99, 108,  97, 115, 115,  61,  34, 102, 108, // iv class=\"fl\n 101, 120,  45, 115, 104, 114, 105, 110, 107,  45,  48,  34, // ex-shrink-0\"\n  62,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, // >.          \n  32,  32,  60,  36, 123, 111, 107,  32,  63,  32,  73,  99, //   <${ok ? Ic\n 111, 110, 115,  46, 111, 107,  32,  58,  32,  73,  99, 111, // ons.ok : Ico\n 110, 115,  46, 102,  97, 105, 108, 125,  32,  99, 108,  97, // ns.fail} cla\n 115, 115,  61,  34, 104,  45,  54,  32, 119,  45,  54,  32, // ss=\"h-6 w-6 \n  36, 123, 111, 107,  32,  63,  32,  39, 116, 101, 120, 116, // ${ok ? 'text\n  45, 103, 114, 101, 101, 110,  45,  52,  48,  48,  39,  32, // -green-400' \n  58,  32,  39, 116, 101, 120, 116,  45, 114, 101, 100,  45, // : 'text-red-\n  52,  48,  48,  39, 125,  34,  32,  47,  62,  10,  32,  32, // 400'}\" />.  \n  32,  32,  32,  32,  32,  32,  32,  32,  60,  47,  47,  62, //         <//>\n  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  60, // .          <\n 100, 105, 118,  32,  99, 108,  97, 115, 115,  61,  34, 109, // div class=\"m\n 108,  45,  51,  32, 119,  45,  48,  32, 102, 108, 101, 120, // l-3 w-0 flex\n  45,  49,  32, 112, 116,  45,  48,  46,  53,  34,  62,  10, // -1 pt-0.5\">.\n  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, //             \n  60, 112,  32,  99, 108,  97, 115, 115,  61,  34, 116, 101, // <p class=\"te\n 120, 116,  45, 115, 109,  32, 102, 111, 110, 116,  45, 109, // xt-sm font-m\n 101, 100, 105, 117, 109,  32, 116, 101, 120, 116,  45, 103, // edium text-g\n 114,  97, 121,  45,  57,  48,  48,  34,  62,  36, 123, 116, // ray-900\">${t\n 101, 120, 116, 125,  60,  47, 112,  62,  10,  32,  32,  32, // ext}</p>.   \n  32,  32,  32,  32,  32,  32,  32,  32,  32,  60, 112,  32, //          <p \n  99, 108,  97, 115, 115,  61,  34, 104, 105, 100, 100, 101, // class=\"hidde\n 110,  32, 109, 116,  45,  49,  32, 116, 101, 120, 116,  45, // n mt-1 text-\n 115, 109,  32, 116, 101, 120, 116,  45, 103, 114,  97, 121, // sm text-gray\n  45,  53,  48,  48,  34,  62,  65, 110, 121, 111, 110, 101, // -500\">Anyone\n  32, 119, 105, 116, 104,  32,  97,  32, 108, 105, 110, 107, //  with a link\n  32,  99,  97, 110,  32, 110, 111, 119,  32, 118, 105, 101, //  can now vie\n 119,  32, 116, 104, 105, 115,  32, 102, 105, 108, 101,  46, // w this file.\n  60,  47, 112,  62,  10,  32,  32,  32,  32,  32,  32,  32, // </p>.       \n  32,  32,  32,  60,  47,  47,  62,  10,  32,  32,  32,  32, //    <//>.    \n  32,  32,  32,  32,  32,  32,  60, 100, 105, 118,  32,  99, //       <div c\n 108,  97, 115, 115,  61,  34, 109, 108,  45,  52,  32, 102, // lass=\"ml-4 f\n 108, 101, 120,  32, 102, 108, 101, 120,  45, 115, 104, 114, // lex flex-shr\n 105, 110, 107,  45,  48,  34,  62,  10,  32,  32,  32,  32, // ink-0\">.    \n  32,  32,  32,  32,  32,  32,  32,  32,  60,  98, 117, 116, //         <but\n 116, 111, 110,  32, 116, 121, 112, 101,  61,  34,  98, 117, // ton type=\"bu\n 116, 116, 111, 110,  34,  32, 114, 101, 102,  61,  36, 123, // tton\" ref=${\n  99, 108, 111, 115, 101,  98, 116, 110, 125,  32, 111, 110, // closebtn} on\n  99, 108, 105,  99, 107,  61,  36, 123, 111, 110,  99, 108, // click=${oncl\n 111, 115, 101, 125,  32,  99, 108,  97, 115, 115,  61,  34, // ose} class=\"\n 105, 110, 108, 105, 110, 101,  45, 102, 108, 101, 120,  32, // inline-flex \n 114, 111, 117, 110, 100, 101, 100,  45, 109, 100,  32,  98, // rounded-md b\n 103,  45, 119, 104, 105, 116, 101,  32, 116, 101, 120, 116, // g-white text\n  45, 103, 114,  97, 121,  45,  52,  48,  48,  32, 104, 111, // -gray-400 ho\n 118, 101, 114,  58, 116, 101, 120, 116,  45, 103, 114,  97, // ver:text-gra\n 121,  45,  53,  48,  48,  32, 102, 111,  99, 117, 115,  58, // y-500 focus:\n 111, 117, 116, 108, 105, 110, 101,  45, 110, 111, 110, 101, // outline-none\n  34,  62,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32, // \">.         \n  32,  32,  32,  32,  32,  60, 115, 112,  97, 110,  32,  99, //      <span c\n 108,  97, 115, 115,  61,  34, 115, 114,  45, 111, 110, 108, // lass=\"sr-onl\n 121,  34,  62,  67, 108, 111, 115, 101,  60,  47, 115, 112, // y\">Close</sp\n  97, 110,  62,  10,  32,  32,  32,  32,  32,  32,  32,  32, // an>.        \n  32,  32,  32,  32,  32,  32,  60, 115, 118, 103,  32,  99, //       <svg c\n 108,  97, 115, 115,  61,  34, 104,  45,  53,  32, 119,  45, // lass=\"h-5 w-\n  53,  34,  32, 118, 105, 101, 119,  66, 111, 120,  61,  34, // 5\" viewBox=\"\n  48,  32,  48,  32,  50,  48,  32,  50,  48,  34,  32, 102, // 0 0 20 20\" f\n 105, 108, 108,  61,  34,  99, 117, 114, 114, 101, 110, 116, // ill=\"current\n  67, 111, 108, 111, 114,  34,  32,  97, 114, 105,  97,  45, // Color\" aria-\n 104, 105, 100, 100, 101, 110,  61,  34, 116, 114, 117, 101, // hidden=\"true\n  34,  62,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32, // \">.         \n  32,  32,  32,  32,  32,  32,  32,  60, 112,  97, 116, 104, //        <path\n  32, 100,  61,  34,  77,  54,  46,  50,  56,  32,  53,  46, //  d=\"M6.28 5.\n  50,  50,  97,  46,  55,  53,  46,  55,  53,  32,  48,  32, // 22a.75.75 0 \n  48,  48,  45,  49,  46,  48,  54,  32,  49,  46,  48,  54, // 00-1.06 1.06\n  76,  56,  46,  57,  52,  32,  49,  48, 108,  45,  51,  46, // L8.94 10l-3.\n  55,  50,  32,  51,  46,  55,  50,  97,  46,  55,  53,  46, // 72 3.72a.75.\n  55,  53,  32,  48,  32,  49,  48,  49,  46,  48,  54,  32, // 75 0 101.06 \n  49,  46,  48,  54,  76,  49,  48,  32,  49,  49,  46,  48, // 1.06L10 11.0\n  54, 108,  51,  46,  55,  50,  32,  51,  46,  55,  50,  97, // 6l3.72 3.72a\n  46,  55,  53,  46,  55,  53,  32,  48,  32,  49,  48,  49, // .75.75 0 101\n  46,  48,  54,  45,  49,  46,  48,  54,  76,  49,  49,  46, // .06-1.06L11.\n  48,  54,  32,  49,  48, 108,  51,  46,  55,  50,  45,  51, // 06 10l3.72-3\n  46,  55,  50,  97,  46,  55,  53,  46,  55,  53,  32,  48, // .72a.75.75 0\n  32,  48,  48,  45,  49,  46,  48,  54,  45,  49,  46,  48, //  00-1.06-1.0\n  54,  76,  49,  48,  32,  56,  46,  57,  52,  32,  54,  46, // 6L10 8.94 6.\n  50,  56,  32,  53,  46,  50,  50, 122,  34,  32,  47,  62, // 28 5.22z\" />\n  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, // .           \n  32,  32,  32,  60,  47,  47,  62,  10,  32,  32,  32,  32, //    <//>.    \n  32,  32,  32,  32,  32,  32,  32,  32,  60,  47,  47,  62, //         <//>\n  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  60, // .          <\n  47,  47,  62,  10,  32,  32,  32,  32,  32,  32,  32,  32, // //>.        \n  60,  47,  47,  62,  10,  32,  32,  32,  32,  32,  32,  60, // <//>.      <\n  47,  47,  62,  10,  32,  32,  32,  32,  60,  47,  47,  62, // //>.    <//>\n  10,  32,  32,  60,  47,  47,  62,  10,  60,  47,  47,  62, // .  <//>.<//>\n  96,  59,  10, 125,  59,  10,  10, 101, 120, 112, 111, 114, // `;.};..expor\n 116,  32, 102, 117, 110,  99, 116, 105, 111, 110,  32,  76, // t function L\n 111, 103, 105, 110,  40, 123, 108, 111, 103, 105, 110,  70, // ogin({loginF\n 110,  44,  32, 108, 111, 103, 111,  73,  99, 111, 110,  44, // n, logoIcon,\n  32, 116, 105, 116, 108, 101,  44,  32, 116, 105, 112,  84, //  title, tipT\n 101, 120, 116, 125,  41,  32, 123,  10,  32,  32,  99, 111, // ext}) {.  co\n 110, 115, 116,  32,  91, 117, 115, 101, 114,  44,  32, 115, // nst [user, s\n 101, 116,  85, 115, 101, 114,  93,  32,  61,  32, 117, 115, // etUser] = us\n 101,  83, 116,  97, 116, 101,  40,  39,  39,  41,  59,  10, // eState('');.\n  32,  32,  99, 111, 110, 115, 116,  32,  91, 112,  97, 115, //   const [pas\n 115,  44,  32, 115, 101, 116,  80,  97, 115, 115,  93,  32, // s, setPass] \n  61,  32, 117, 115, 101,  83, 116,  97, 116, 101,  40,  39, // = useState('\n  39,  41,  59,  10,  32,  32,  99, 111, 110, 115, 116,  32, // ');.  const \n 111, 110, 115, 117,  98, 109, 105, 116,  32,  61,  32, 102, // onsubmit = f\n 117, 110,  99, 116, 105, 111, 110,  40, 101, 118,  41,  32, // unction(ev) \n 123,  10,  32,  32,  32,  32,  99, 111, 110, 115, 116,  32, // {.    const \n  97, 117, 116, 104, 104, 100, 114,  32,  61,  32,  39,  66, // authhdr = 'B\n  97, 115, 105,  99,  32,  39,  32,  43,  32,  98, 116, 111, // asic ' + bto\n  97,  40, 117, 115, 101, 114,  32,  43,  32,  39,  58,  39, // a(user + ':'\n  32,  43,  32, 112,  97, 115, 115,  41,  59,  10,  32,  32, //  + pass);.  \n  32,  32,  99, 111, 110, 115, 116,  32, 104, 101,  97, 100, //   const head\n 101, 114, 115,  32,  61,  32, 123,  65, 117, 116, 104, 111, // ers = {Autho\n 114, 105, 122,  97, 116, 105, 111, 110,  58,  32,  97, 117, // rization: au\n 116, 104, 104, 100, 114, 125,  59,  10,  32,  32,  32,  32, // thhdr};.    \n 114, 101, 116, 117, 114, 110,  32, 102, 101, 116,  99, 104, // return fetch\n  40,  39,  97, 112, 105,  47, 108, 111, 103, 105, 110,  39, // ('api/login'\n  44,  32, 123, 104, 101,  97, 100, 101, 114, 115, 125,  41, // , {headers})\n  46, 116, 104, 101, 110,  40, 108, 111, 103, 105, 110,  70, // .then(loginF\n 110,  41,  46, 102, 105, 110,  97, 108, 108, 121,  40, 114, // n).finally(r\n  32,  61,  62,  32, 115, 101, 116,  80,  97, 115, 115,  40, //  => setPass(\n  39,  39,  41,  41,  59,  10,  32,  32, 125,  59,  10,  32, // ''));.  };. \n  32, 114, 101, 116, 117, 114, 110,  32, 104, 116, 109, 108, //  return html\n  96,  10,  60, 100, 105, 118,  32,  99, 108,  97, 115, 115, // `.<div class\n  61,  34, 104,  45, 102, 117, 108, 108,  32, 102, 108, 101, // =\"h-full fle\n 120,  32, 105, 116, 101, 109, 115,  45,  99, 101, 110, 116, // x items-cent\n 101, 114,  32, 106, 117, 115, 116, 105, 102, 121,  45,  99, // er justify-c\n 101, 110, 116, 101, 114,  32,  98, 103,  45, 115, 108,  97, // enter bg-sla\n 116, 101,  45,  50,  48,  48,  34,  62,  10,  32,  32,  60, // te-200\">.  <\n 100, 105, 118,  32,  99, 108,  97, 115, 115,  61,  34,  98, // div class=\"b\n 111, 114, 100, 101, 114,  32, 114, 111, 117, 110, 100, 101, // order rounde\n 100,  32,  98, 103,  45, 119, 104, 105, 116, 101,  32, 119, // d bg-white w\n  45,  57,  54,  32, 112,  45,  53,  34,  62,  10,  32,  32, // -96 p-5\">.  \n  32,  32,  60, 100, 105, 118,  32,  99, 108,  97, 115, 115, //   <div class\n  61,  34, 109, 121,  45,  53,  32, 112, 121,  45,  50,  32, // =\"my-5 py-2 \n 102, 108, 101, 120,  32, 105, 116, 101, 109, 115,  45,  99, // flex items-c\n 101, 110, 116, 101, 114,  32, 106, 117, 115, 116, 105, 102, // enter justif\n 121,  45,  99, 101, 110, 116, 101, 114,  32, 103,  97, 112, // y-center gap\n  45, 120,  45,  52,  34,  62,  10,  32,  32,  32,  32,  32, // -x-4\">.     \n  32,  60,  36, 123, 108, 111, 103, 111,  73,  99, 111, 110, //  <${logoIcon\n 125,  32,  99, 108,  97, 115, 115,  61,  34, 104,  45,  49, // } class=\"h-1\n  50,  32, 115, 116, 114, 111, 107, 101,  45,  99, 121,  97, // 2 stroke-cya\n 110,  45,  54,  48,  48,  32, 115, 116, 114, 111, 107, 101, // n-600 stroke\n  45,  49,  34,  32,  47,  62,  10,  32,  32,  32,  32,  32, // -1\" />.     \n  32,  60, 104,  49,  32,  99, 108,  97, 115, 115,  61,  34, //  <h1 class=\"\n 102, 111, 110, 116,  45,  98, 111, 108, 100,  32, 116, 101, // font-bold te\n 120, 116,  45, 120, 108,  34,  62,  36, 123, 116, 105, 116, // xt-xl\">${tit\n 108, 101,  32, 124, 124,  32,  39,  76, 111, 103, 105, 110, // le || 'Login\n  39, 125,  60,  47,  47,  62,  10,  32,  32,  32,  32,  60, // '}<//>.    <\n  47,  47,  62,  10,  32,  32,  32,  32,  60, 100, 105, 118, // //>.    <div\n  32,  99, 108,  97, 115, 115,  61,  34, 109, 121,  45,  51, //  class=\"my-3\n  34,  62,  10,  32,  32,  32,  32,  32,  32,  60, 108,  97, // \">.      <la\n  98, 101, 108,  32,  99, 108,  97, 115, 115,  61,  34,  98, // bel class=\"b\n 108, 111,  99, 107,  32, 116, 101, 120, 116,  45, 115, 109, // lock text-sm\n  32, 109,  98,  45,  49,  32, 100,  97, 114, 107,  58, 116, //  mb-1 dark:t\n 101, 120, 116,  45, 119, 104, 105, 116, 101,  34,  62,  85, // ext-white\">U\n 115, 101, 114, 110,  97, 109, 101,  60,  47, 108,  97,  98, // sername</lab\n 101, 108,  62,  10,  32,  32,  32,  32,  32,  32,  60, 105, // el>.      <i\n 110, 112, 117, 116,  32, 116, 121, 112, 101,  61,  34, 116, // nput type=\"t\n 101, 120, 116,  34,  32,  97, 117, 116, 111,  99, 111, 109, // ext\" autocom\n 112, 108, 101, 116, 101,  61,  34,  99, 117, 114, 114, 101, // plete=\"curre\n 110, 116,  45, 117, 115, 101, 114,  34,  32, 114, 101, 113, // nt-user\" req\n 117, 105, 114, 101, 100,  10,  32,  32,  32,  32,  32,  32, // uired.      \n  32,  32,  99, 108,  97, 115, 115,  61,  34, 102, 111, 110, //   class=\"fon\n 116,  45, 110, 111, 114, 109,  97, 108,  32,  98, 103,  45, // t-normal bg-\n 119, 104, 105, 116, 101,  32, 114, 111, 117, 110, 100, 101, // white rounde\n 100,  32,  98, 111, 114, 100, 101, 114,  32,  98, 111, 114, // d border bor\n 100, 101, 114,  45, 103, 114,  97, 121,  45,  51,  48,  48, // der-gray-300\n  32, 119,  45, 102, 117, 108, 108,  32,  10,  32,  32,  32, //  w-full .   \n  32,  32,  32,  32,  32, 102, 108, 101, 120,  45,  49,  32, //      flex-1 \n 112, 121,  45,  48,  46,  53,  32, 112, 120,  45,  50,  32, // py-0.5 px-2 \n 116, 101, 120, 116,  45, 103, 114,  97, 121,  45,  57,  48, // text-gray-90\n  48,  32, 112, 108,  97,  99, 101, 104, 111, 108, 100, 101, // 0 placeholde\n 114,  58, 116, 101, 120, 116,  45, 103, 114,  97, 121,  45, // r:text-gray-\n  52,  48,  48,  10,  32,  32,  32,  32,  32,  32,  32,  32, // 400.        \n 102, 111,  99, 117, 115,  58, 111, 117, 116, 108, 105, 110, // focus:outlin\n 101,  45, 110, 111, 110, 101,  32, 115, 109,  58, 116, 101, // e-none sm:te\n 120, 116,  45, 115, 109,  32, 115, 109,  58, 108, 101,  97, // xt-sm sm:lea\n 100, 105, 110, 103,  45,  54,  32, 100, 105, 115,  97,  98, // ding-6 disab\n 108, 101, 100,  58,  99, 117, 114, 115, 111, 114,  45, 110, // led:cursor-n\n 111, 116,  45,  97, 108, 108, 111, 119, 101, 100,  10,  32, // ot-allowed. \n  32,  32,  32,  32,  32,  32,  32, 100, 105, 115,  97,  98, //        disab\n 108, 101, 100,  58,  98, 103,  45, 103, 114,  97, 121,  45, // led:bg-gray-\n  49,  48,  48,  32, 100, 105, 115,  97,  98, 108, 101, 100, // 100 disabled\n  58, 116, 101, 120, 116,  45, 103, 114,  97, 121,  45,  53, // :text-gray-5\n  48,  48,  34,  10,  32,  32,  32,  32,  32,  32,  32,  32, // 00\".        \n 111, 110, 105, 110, 112, 117, 116,  61,  36, 123, 101, 118, // oninput=${ev\n  32,  61,  62,  32, 115, 101, 116,  85, 115, 101, 114,  40, //  => setUser(\n 101, 118,  46, 116,  97, 114, 103, 101, 116,  46, 118,  97, // ev.target.va\n 108, 117, 101,  41, 125,  32, 118,  97, 108, 117, 101,  61, // lue)} value=\n  36, 123, 117, 115, 101, 114, 125,  32,  32,  47,  62,  10, // ${user}  />.\n  32,  32,  32,  32,  60,  47,  47,  62,  10,  32,  32,  32, //     <//>.   \n  32,  60, 100, 105, 118,  32,  99, 108,  97, 115, 115,  61, //  <div class=\n  34, 109, 121,  45,  51,  34,  62,  10,  32,  32,  32,  32, // \"my-3\">.    \n  32,  32,  60, 108,  97,  98, 101, 108,  32,  99, 108,  97, //   <label cla\n 115, 115,  61,  34,  98, 108, 111,  99, 107,  32, 116, 101, // ss=\"block te\n 120, 116,  45, 115, 109,  32, 109,  98,  45,  49,  32, 100, // xt-sm mb-1 d\n  97, 114, 107,  58, 116, 101, 120, 116,  45, 119, 104, 105, // ark:text-whi\n 116, 101,  34,  62,  80,  97, 115, 115, 119, 111, 114, 100, // te\">Password\n  60,  47, 108,  97,  98, 101, 108,  62,  10,  32,  32,  32, // </label>.   \n  32,  32,  32,  60, 105, 110, 112, 117, 116,  32, 116, 121, //    <input ty\n 112, 101,  61,  34, 112,  97, 115, 115, 119, 111, 114, 100, // pe=\"password\n  34,  32,  97, 117, 116, 111,  99, 111, 109, 112, 108, 101, // \" autocomple\n 116, 101,  61,  34,  99, 117, 114, 114, 101, 110, 116,  45, // te=\"current-\n 112,  97, 115, 115, 119, 111, 114, 100,  34,  32, 114, 101, // password\" re\n 113, 117, 105, 114, 101, 100,  10,  32,  32,  32,  32,  32, // quired.     \n  32,  32,  32,  99, 108,  97, 115, 115,  61,  34, 102, 111, //    class=\"fo\n 110, 116,  45, 110, 111, 114, 109,  97, 108,  32,  98, 103, // nt-normal bg\n  45, 119, 104, 105, 116, 101,  32, 114, 111, 117, 110, 100, // -white round\n 101, 100,  32,  98, 111, 114, 100, 101, 114,  32,  98, 111, // ed border bo\n 114, 100, 101, 114,  45, 103, 114,  97, 121,  45,  51,  48, // rder-gray-30\n  48,  32, 119,  45, 102, 117, 108, 108,  32, 102, 108, 101, // 0 w-full fle\n 120,  45,  49,  32, 112, 121,  45,  48,  46,  53,  32, 112, // x-1 py-0.5 p\n 120,  45,  50,  32, 116, 101, 120, 116,  45, 103, 114,  97, // x-2 text-gra\n 121,  45,  57,  48,  48,  32, 112, 108,  97,  99, 101, 104, // y-900 placeh\n 111, 108, 100, 101, 114,  58, 116, 101, 120, 116,  45, 103, // older:text-g\n 114,  97, 121,  45,  52,  48,  48,  32, 102, 111,  99, 117, // ray-400 focu\n 115,  58, 111, 117, 116, 108, 105, 110, 101,  45, 110, 111, // s:outline-no\n 110, 101,  32, 115, 109,  58, 116, 101, 120, 116,  45, 115, // ne sm:text-s\n 109,  32, 115, 109,  58, 108, 101,  97, 100, 105, 110, 103, // m sm:leading\n  45,  54,  32, 100, 105, 115,  97,  98, 108, 101, 100,  58, // -6 disabled:\n  99, 117, 114, 115, 111, 114,  45, 110, 111, 116,  45,  97, // cursor-not-a\n 108, 108, 111, 119, 101, 100,  32, 100, 105, 115,  97,  98, // llowed disab\n 108, 101, 100,  58,  98, 103,  45, 103, 114,  97, 121,  45, // led:bg-gray-\n  49,  48,  48,  32, 100, 105, 115,  97,  98, 108, 101, 100, // 100 disabled\n  58, 116, 101, 120, 116,  45, 103, 114,  97, 121,  45,  53, // :text-gray-5\n  48,  48,  34,  10,  32,  32,  32,  32,  32,  32,  32,  32, // 00\".        \n 111, 110, 105, 110, 112, 117, 116,  61,  36, 123, 101, 118, // oninput=${ev\n  32,  61,  62,  32, 115, 101, 116,  80,  97, 115, 115,  40, //  => setPass(\n 101, 118,  46, 116,  97, 114, 103, 101, 116,  46, 118,  97, // ev.target.va\n 108, 117, 101,  41, 125,  10,  32,  32,  32,  32,  32,  32, // lue)}.      \n  32,  32, 118,  97, 108, 117, 101,  61,  36, 123, 112,  97, //   value=${pa\n 115, 115, 125,  32, 111, 110,  99, 104,  97, 110, 103, 101, // ss} onchange\n  61,  36, 123, 111, 110, 115, 117,  98, 109, 105, 116, 125, // =${onsubmit}\n  32,  47,  62,  10,  32,  32,  32,  32,  60,  47,  47,  62, //  />.    <//>\n  10,  32,  32,  32,  32,  60, 100, 105, 118,  32,  99, 108, // .    <div cl\n  97, 115, 115,  61,  34, 109, 116,  45,  55,  34,  62,  10, // ass=\"mt-7\">.\n  32,  32,  32,  32,  32,  32,  60,  36, 123,  66, 117, 116, //       <${But\n 116, 111, 110, 125,  32, 116, 105, 116, 108, 101,  61,  34, // ton} title=\"\n  83, 105, 103, 110,  32,  73, 110,  34,  32, 105,  99, 111, // Sign In\" ico\n 110,  61,  36, 123,  73,  99, 111, 110, 115,  46, 108, 111, // n=${Icons.lo\n 103, 111, 117, 116, 125,  32, 111, 110,  99, 108, 105,  99, // gout} onclic\n 107,  61,  36, 123, 111, 110, 115, 117,  98, 109, 105, 116, // k=${onsubmit\n 125,  32,  99, 108, 115,  61,  34, 102, 108, 101, 120,  32, // } cls=\"flex \n 119,  45, 102, 117, 108, 108,  32, 106, 117, 115, 116, 105, // w-full justi\n 102, 121,  45,  99, 101, 110, 116, 101, 114,  34,  32,  47, // fy-center\" /\n  62,  10,  32,  32,  32,  32,  60,  47,  47,  62,  10,  32, // >.    <//>. \n  32,  32,  32,  60, 100, 105, 118,  32,  99, 108,  97, 115, //    <div clas\n 115,  61,  34, 109, 116,  45,  53,  32, 116, 101, 120, 116, // s=\"mt-5 text\n  45, 115, 108,  97, 116, 101,  45,  52,  48,  48,  32, 116, // -slate-400 t\n 101, 120, 116,  45, 120, 115,  34,  62,  36, 123, 116, 105, // ext-xs\">${ti\n 112,  84, 101, 120, 116, 125,  60,  47,  47,  62,  10,  32, // pText}<//>. \n  32,  60,  47,  47,  62,  10,  60,  47,  47,  62,  96,  59, //  <//>.<//>`;\n  10, 125,  59,  10,  10, 101, 120, 112, 111, 114, 116,  32, // .};..export \n 102, 117, 110,  99, 116, 105, 111, 110,  32,  67, 111, 108, // function Col\n 111, 114, 101, 100,  40, 123, 105,  99, 111, 110,  44,  32, // ored({icon, \n 116, 101, 120, 116,  44,  32,  99, 111, 108, 111, 114, 115, // text, colors\n 125,  41,  32, 123,  10,  32,  32,  99, 111, 108, 111, 114, // }) {.  color\n 115,  32, 124, 124,  61,  32,  39,  98, 103,  45, 115, 108, // s ||= 'bg-sl\n  97, 116, 101,  45,  49,  48,  48,  32, 116, 101, 120, 116, // ate-100 text\n  45, 115, 108,  97, 116, 101,  45,  57,  48,  48,  39,  59, // -slate-900';\n  10,  32,  32, 114, 101, 116, 117, 114, 110,  32, 104, 116, // .  return ht\n 109, 108,  96,  10,  60, 115, 112,  97, 110,  32,  99, 108, // ml`.<span cl\n  97, 115, 115,  61,  34, 105, 110, 108, 105, 110, 101,  45, // ass=\"inline-\n 102, 108, 101, 120,  32, 105, 116, 101, 109, 115,  45,  99, // flex items-c\n 101, 110, 116, 101, 114,  32, 103,  97, 112,  45,  49,  46, // enter gap-1.\n  53,  32, 112, 121,  45,  48,  46,  53,  34,  62,  10,  32, // 5 py-0.5\">. \n  32,  36, 123, 105,  99, 111, 110,  32,  38,  38,  32, 104, //  ${icon && h\n 116, 109, 108,  96,  60,  36, 123, 105,  99, 111, 110, 125, // tml`<${icon}\n  32,  99, 108,  97, 115, 115,  61,  34, 119,  45,  53,  32, //  class=\"w-5 \n 104,  45,  53,  34,  32,  47,  62,  96, 125,  10,  32,  32, // h-5\" />`}.  \n  60, 115, 112,  97, 110,  32,  99, 108,  97, 115, 115,  61, // <span class=\n  34, 105, 110, 108, 105, 110, 101,  45,  98, 108, 111,  99, // \"inline-bloc\n 107,  32, 102, 111, 110, 116,  45, 109, 101, 100, 105, 117, // k font-mediu\n 109,  32, 114, 111, 117, 110, 100, 101, 100,  45, 109, 100, // m rounded-md\n  32, 112, 120,  45,  50,  32, 112, 121,  45,  49,  32, 116, //  px-2 py-1 t\n 101, 120, 116,  45, 120, 115,  32, 114, 105, 110, 103,  45, // ext-xs ring-\n  49,  32, 114, 105, 110, 103,  45, 105, 110, 115, 101, 116, // 1 ring-inset\n  32,  36, 123,  99, 111, 108, 111, 114, 115, 125,  34,  62, //  ${colors}\">\n  36, 123, 116, 101, 120, 116, 125,  60,  47,  47,  62,  10, // ${text}<//>.\n  60,  47,  47,  62,  96,  59,  10, 125,  59,  10,  10, 101, // <//>`;.};..e\n 120, 112, 111, 114, 116,  32, 102, 117, 110,  99, 116, 105, // xport functi\n 111, 110,  32,  83, 116,  97, 116,  40, 123, 116, 105, 116, // on Stat({tit\n 108, 101,  44,  32, 116, 101, 120, 116,  44,  32, 116, 105, // le, text, ti\n 112,  84, 101, 120, 116,  44,  32, 116, 105, 112,  73,  99, // pText, tipIc\n 111, 110,  44,  32, 116, 105, 112,  67, 111, 108, 111, 114, // on, tipColor\n 115,  44,  32,  99, 111, 108, 111, 114, 115, 125,  41,  32, // s, colors}) \n 123,  10,  32,  32, 114, 101, 116, 117, 114, 110,  32, 104, // {.  return h\n 116, 109, 108,  96,  10,  60, 100, 105, 118,  32,  99, 108, // tml`.<div cl\n  97, 115, 115,  61,  34, 102, 108, 101, 120,  32, 102, 108, // ass=\"flex fl\n 101, 120,  45,  99, 111, 108,  32,  98, 103,  45, 119, 104, // ex-col bg-wh\n 105, 116, 101,  32,  98, 111, 114, 100, 101, 114,  32, 115, // ite border s\n 104,  97, 100, 111, 119,  45, 115, 109,  32, 114, 111, 117, // hadow-sm rou\n 110, 100, 101, 100,  45, 120, 108,  32, 100,  97, 114, 107, // nded-xl dark\n  58,  98, 103,  45, 115, 108,  97, 116, 101,  45,  57,  48, // :bg-slate-90\n  48,  32, 100,  97, 114, 107,  58,  98, 111, 114, 100, 101, // 0 dark:borde\n 114,  45, 103, 114,  97, 121,  45,  56,  48,  48,  34,  62, // r-gray-800\">\n  10,  32,  32,  60, 100, 105, 118,  32,  99, 108,  97, 115, // .  <div clas\n 115,  61,  34, 111, 118, 101, 114, 102, 108, 111, 119,  45, // s=\"overflow-\n  97, 117, 116, 111,  32, 114, 111, 117, 110, 100, 101, 100, // auto rounded\n  45, 108, 103,  32,  98, 103,  45, 119, 104, 105, 116, 101, // -lg bg-white\n  32, 112, 120,  45,  52,  32, 112, 121,  45,  50,  32,  34, //  px-4 py-2 \"\n  62,  10,  32,  32,  32,  32,  60, 100, 105, 118,  32,  99, // >.    <div c\n 108,  97, 115, 115,  61,  34, 102, 108, 101, 120,  32, 105, // lass=\"flex i\n 116, 101, 109, 115,  45,  99, 101, 110, 116, 101, 114,  32, // tems-center \n 103,  97, 112,  45, 120,  45,  50,  34,  62,  10,  32,  32, // gap-x-2\">.  \n  32,  32,  32,  32,  60, 112,  32,  99, 108,  97, 115, 115, //     <p class\n  61,  34, 116, 101, 120, 116,  45, 115, 109,  32, 116, 114, // =\"text-sm tr\n 117, 110,  99,  97, 116, 101,  32, 116, 101, 120, 116,  45, // uncate text-\n 103, 114,  97, 121,  45,  53,  48,  48,  32, 102, 111, 110, // gray-500 fon\n 116,  45, 109, 101, 100, 105, 117, 109,  34,  62,  32,  36, // t-medium\"> $\n 123, 116, 105, 116, 108, 101, 125,  32,  60,  47, 112,  62, // {title} </p>\n  10,  32,  32,  32,  32,  60,  47,  47,  62,  10,  32,  32, // .    <//>.  \n  32,  32,  60, 100, 105, 118,  32,  99, 108,  97, 115, 115, //   <div class\n  61,  34, 109, 116,  45,  49,  32, 102, 108, 101, 120,  32, // =\"mt-1 flex \n 105, 116, 101, 109, 115,  45,  99, 101, 110, 116, 101, 114, // items-center\n  32, 103,  97, 112,  45, 120,  45,  50,  34,  62,  10,  32, //  gap-x-2\">. \n  32,  32,  32,  32,  32,  60, 104,  51,  32,  99, 108,  97, //      <h3 cla\n 115, 115,  61,  34, 116, 101, 120, 116,  45, 120, 108,  32, // ss=\"text-xl \n 116, 114, 117, 110,  99,  97, 116, 101,  32, 102, 111, 110, // truncate fon\n 116,  45, 115, 101, 109, 105,  98, 111, 108, 100,  32, 116, // t-semibold t\n 114,  97,  99, 107, 105, 110, 103,  45, 116, 105, 103, 104, // racking-tigh\n 116,  32,  36, 123,  99, 111, 108, 111, 114, 115,  32, 124, // t ${colors |\n 124,  32,  39, 116, 101, 120, 116,  45, 103, 114,  97, 121, // | 'text-gray\n  45,  56,  48,  48,  32, 100,  97, 114, 107,  58, 116, 101, // -800 dark:te\n 120, 116,  45, 103, 114,  97, 121,  45,  50,  48,  48,  39, // xt-gray-200'\n 125,  34,  62,  10,  32,  32,  32,  32,  32,  32,  32,  32, // }\">.        \n  36, 123, 116, 101, 120, 116, 125,  10,  32,  32,  32,  32, // ${text}.    \n  32,  32,  60,  47,  47,  62,  10,  32,  32,  32,  32,  32, //   <//>.     \n  32,  60, 115, 112,  97, 110,  32,  99, 108,  97, 115, 115, //  <span class\n  61,  34, 102, 108, 101, 120,  32, 105, 116, 101, 109, 115, // =\"flex items\n  45,  99, 101, 110, 116, 101, 114,  32,  36, 123, 116, 105, // -center ${ti\n 112,  84, 101, 120, 116,  32, 124, 124,  32,  39, 104, 105, // pText || 'hi\n 100, 100, 101, 110,  39, 125,  34,  62,  10,  32,  32,  32, // dden'}\">.   \n  32,  32,  32,  32,  32,  60,  36, 123,  67, 111, 108, 111, //      <${Colo\n 114, 101, 100, 125,  32, 116, 101, 120, 116,  61,  36, 123, // red} text=${\n 116, 105, 112,  84, 101, 120, 116, 125,  32, 105,  99, 111, // tipText} ico\n 110,  61,  36, 123, 116, 105, 112,  73,  99, 111, 110, 125, // n=${tipIcon}\n  32,  99, 111, 108, 111, 114, 115,  61,  36, 123, 116, 105, //  colors=${ti\n 112,  67, 111, 108, 111, 114, 115, 125,  32,  47,  62,  10, // pColors} />.\n  32,  32,  32,  32,  32,  32,  60,  47,  47,  62,  10,  32, //       <//>. \n  32,  32,  32,  60,  47,  47,  62,  10,  32,  32,  60,  47, //    <//>.  </\n  47,  62,  10,  60,  47,  47,  62,  96,  59,  10, 125,  59, // />.<//>`;.};\n  10,  10, 101, 120, 112, 111, 114, 116,  32, 102, 117, 110, // ..export fun\n  99, 116, 105, 111, 110,  32,  84, 101, 120, 116,  86,  97, // ction TextVa\n 108, 117, 101,  40, 123, 118,  97, 108, 117, 101,  44,  32, // lue({value, \n 115, 101, 116, 102, 110,  44,  32, 100, 105, 115,  97,  98, // setfn, disab\n 108, 101, 100,  44,  32, 112, 108,  97,  99, 101, 104, 111, // led, placeho\n 108, 100, 101, 114,  44,  32, 116, 121, 112, 101,  44,  32, // lder, type, \n  97, 100, 100, 111, 110,  82, 105, 103, 104, 116,  44,  32, // addonRight, \n  97, 100, 100, 111, 110,  76, 101, 102, 116,  44,  32,  97, // addonLeft, a\n 116, 116, 114,  44,  32, 109, 105, 110,  44,  32, 109,  97, // ttr, min, ma\n 120,  44,  32, 115, 116, 101, 112,  44,  32, 109, 117, 108, // x, step, mul\n 116, 125,  41,  32, 123,  10,  32,  32,  99, 111, 110, 115, // t}) {.  cons\n 116,  32,  91,  98, 103,  44,  32, 115, 101, 116,  66, 103, // t [bg, setBg\n  93,  32,  61,  32, 117, 115, 101,  83, 116,  97, 116, 101, // ] = useState\n  40,  39,  98, 103,  45, 119, 104, 105, 116, 101,  39,  41, // ('bg-white')\n  59,  10,  32,  32, 117, 115, 101,  69, 102, 102, 101,  99, // ;.  useEffec\n 116,  40,  40,  41,  32,  61,  62,  32, 123,  32, 105, 102, // t(() => { if\n  32,  40, 116, 121, 112, 101,  32,  61,  61,  32,  39, 110, //  (type == 'n\n 117, 109,  98, 101, 114,  39,  41,  32,  99, 104, 101,  99, // umber') chec\n 107, 118,  97, 108,  40,  43, 109, 105, 110,  44,  32,  43, // kval(+min, +\n 109,  97, 120,  44,  32,  43, 118,  97, 108, 117, 101,  41, // max, +value)\n  59,  32, 125,  44,  32,  91,  93,  41,  59,  10,  32,  32, // ; }, []);.  \n 115, 116, 101, 112,  32, 124, 124,  61,  32,  39,  49,  39, // step ||= '1'\n  44,  32, 109, 117, 108, 116,  32, 124, 124,  61,  32,  49, // , mult ||= 1\n  59,  10,  32,  32,  99, 111, 110, 115, 116,  32,  99, 104, // ;.  const ch\n 101,  99, 107, 118,  97, 108,  32,  61,  32, 102, 117, 110, // eckval = fun\n  99, 116, 105, 111, 110,  40, 109, 105, 110,  44,  32, 109, // ction(min, m\n  97, 120,  44,  32, 118,  41,  32, 123,  10,  32,  32,  32, // ax, v) {.   \n  32, 115, 101, 116,  66, 103,  40,  39,  98, 103,  45, 119, //  setBg('bg-w\n 104, 105, 116, 101,  39,  41,  59,  10,  32,  32,  32,  32, // hite');.    \n 105, 102,  32,  40, 109, 105, 110,  32,  38,  38,  32, 118, // if (min && v\n  32,  60,  32, 109, 105, 110,  41,  32, 115, 101, 116,  66, //  < min) setB\n 103,  40,  39,  98, 103,  45, 114, 101, 100,  45,  49,  48, // g('bg-red-10\n  48,  32,  98, 111, 114, 100, 101, 114,  45, 114, 101, 100, // 0 border-red\n  45,  50,  48,  48,  39,  41,  59,  10,  32,  32,  32,  32, // -200');.    \n 105, 102,  32,  40, 109,  97, 120,  32,  38,  38,  32, 118, // if (max && v\n  32,  62,  32, 109,  97, 120,  41,  32, 115, 101, 116,  66, //  > max) setB\n 103,  40,  39,  98, 103,  45, 114, 101, 100,  45,  49,  48, // g('bg-red-10\n  48,  32,  98, 111, 114, 100, 101, 114,  45, 114, 101, 100, // 0 border-red\n  45,  50,  48,  48,  39,  41,  59,  10,  32,  32, 125,  59, // -200');.  };\n  10,  32,  32,  99, 111, 110, 115, 116,  32, 109,  32,  61, // .  const m =\n  32, 115, 116, 101, 112,  46, 109,  97, 116,  99, 104,  40, //  step.match(\n  47,  94,  46,  43,  92,  46,  40,  46,  43,  41,  47,  41, // /^.+..(.+)/)\n  59,  10,  32,  32,  99, 111, 110, 115, 116,  32, 100, 105, // ;.  const di\n 103, 105, 116, 115,  32,  61,  32, 109,  32,  63,  32, 109, // gits = m ? m\n  91,  49,  93,  46, 108, 101, 110, 103, 116, 104,  32,  58, // [1].length :\n  32,  48,  59,  10,  32,  32,  99, 111, 110, 115, 116,  32, //  0;.  const \n 111, 110,  99, 104,  97, 110, 103, 101,  32,  61,  32, 101, // onchange = e\n 118,  32,  61,  62,  32, 123,  10,  32,  32,  32,  32, 108, // v => {.    l\n 101, 116,  32, 118,  32,  61,  32, 101, 118,  46, 116,  97, // et v = ev.ta\n 114, 103, 101, 116,  46, 118,  97, 108, 117, 101,  59,  10, // rget.value;.\n  32,  32,  32,  32, 105, 102,  32,  40, 116, 121, 112, 101, //     if (type\n  32,  61,  61,  32,  39, 110, 117, 109,  98, 101, 114,  39, //  == 'number'\n  41,  32, 123,  10,  32,  32,  32,  32,  32,  32,  99, 104, // ) {.      ch\n 101,  99, 107, 118,  97, 108,  40,  43, 109, 105, 110,  44, // eckval(+min,\n  32,  43, 109,  97, 120,  44,  32,  43, 118,  41,  59,  10, //  +max, +v);.\n  32,  32,  32,  32,  32,  32, 118,  32,  61,  32,  43,  40, //       v = +(\n 112,  97, 114, 115, 101,  70, 108, 111,  97, 116,  40, 118, // parseFloat(v\n  41,  32,  47,  32, 109, 117, 108, 116,  41,  46, 116, 111, // ) / mult).to\n  70, 105, 120, 101, 100,  40, 100, 105, 103, 105, 116, 115, // Fixed(digits\n  41,  59,  10,  32,  32,  32,  32, 125,  10,  32,  32,  32, // );.    }.   \n  32, 115, 101, 116, 102, 110,  40, 118,  41,  59,  10,  32, //  setfn(v);. \n  32, 125,  59,  10,  32,  32, 105, 102,  32,  40, 116, 121, //  };.  if (ty\n 112, 101,  32,  61,  61,  32,  39, 110, 117, 109,  98, 101, // pe == 'numbe\n 114,  39,  41,  32, 118,  97, 108, 117, 101,  32,  61,  32, // r') value = \n  43,  40, 118,  97, 108, 117, 101,  32,  42,  32, 109, 117, // +(value * mu\n 108, 116,  41,  46, 116, 111,  70, 105, 120, 101, 100,  40, // lt).toFixed(\n 100, 105, 103, 105, 116, 115,  41,  59,  10,  32,  32, 114, // digits);.  r\n 101, 116, 117, 114, 110,  32, 104, 116, 109, 108,  96,  10, // eturn html`.\n  60, 100, 105, 118,  32,  99, 108,  97, 115, 115,  61,  34, // <div class=\"\n 102, 108, 101, 120,  32, 119,  45, 102, 117, 108, 108,  32, // flex w-full \n 105, 116, 101, 109, 115,  45,  99, 101, 110, 116, 101, 114, // items-center\n  32, 114, 111, 117, 110, 100, 101, 100,  32,  98, 111, 114, //  rounded bor\n 100, 101, 114,  32, 115, 104,  97, 100, 111, 119,  45, 115, // der shadow-s\n 109,  32,  36, 123,  98, 103, 125,  34,  62,  10,  32,  32, // m ${bg}\">.  \n  36, 123,  97, 100, 100, 111, 110,  76, 101, 102, 116,  32, // ${addonLeft \n  38,  38,  32, 104, 116, 109, 108,  96,  60, 115, 112,  97, // && html`<spa\n 110,  32,  99, 108,  97, 115, 115,  61,  34, 105, 110, 108, // n class=\"inl\n 105, 110, 101,  45, 102, 108, 101, 120,  32, 102, 111, 110, // ine-flex fon\n 116,  45, 110, 111, 114, 109,  97, 108,  32, 116, 114, 117, // t-normal tru\n 110,  99,  97, 116, 101,  32, 112, 121,  45,  49,  32,  98, // ncate py-1 b\n 111, 114, 100, 101, 114,  45, 114,  32,  98, 103,  45, 115, // order-r bg-s\n 108,  97, 116, 101,  45,  49,  48,  48,  32, 105, 116, 101, // late-100 ite\n 109, 115,  45,  99, 101, 110, 116, 101, 114,  32,  98, 111, // ms-center bo\n 114, 100, 101, 114,  45, 103, 114,  97, 121,  45,  51,  48, // rder-gray-30\n  48,  32, 112, 120,  45,  50,  32, 116, 101, 120, 116,  45, // 0 px-2 text-\n 103, 114,  97, 121,  45,  53,  48,  48,  32, 116, 101, 120, // gray-500 tex\n 116,  45, 120, 115,  34,  62,  36, 123,  97, 100, 100, 111, // t-xs\">${addo\n 110,  76, 101, 102, 116, 125,  60,  47,  47,  62,  96,  32, // nLeft}<//>` \n 125,  10,  32,  32,  60, 105, 110, 112, 117, 116,  32, 116, // }.  <input t\n 121, 112, 101,  61,  36, 123, 116, 121, 112, 101,  32, 124, // ype=${type |\n 124,  32,  39, 116, 101, 120, 116,  39, 125,  32, 100, 105, // | 'text'} di\n 115,  97,  98, 108, 101, 100,  61,  36, 123, 100, 105, 115, // sabled=${dis\n  97,  98, 108, 101, 100, 125,  32, 118,  97, 108, 117, 101, // abled} value\n  61,  36, 123, 118,  97, 108, 117, 101, 125,  10,  32,  32, // =${value}.  \n  32,  32, 115, 116, 101, 112,  61,  36, 123, 115, 116, 101, //   step=${ste\n 112, 125,  32, 109, 105, 110,  61,  36, 123, 109, 105, 110, // p} min=${min\n 125,  32, 109,  97, 120,  61,  36, 123, 109,  97, 120, 125, // } max=${max}\n  32,  10,  32,  32,  32,  32, 111, 110,  99, 104,  97, 110, //  .    onchan\n 103, 101,  61,  36, 123, 111, 110,  99, 104,  97, 110, 103, // ge=${onchang\n 101, 125,  32,  46,  46,  46,  36, 123,  97, 116, 116, 114, // e} ...${attr\n 125,  10,  32,  32,  32,  32,  99, 108,  97, 115, 115,  61, // }.    class=\n  34,  36, 123,  98, 103, 125,  32, 102, 111, 110, 116,  45, // \"${bg} font-\n 110, 111, 114, 109,  97, 108,  32, 116, 101, 120, 116,  45, // normal text-\n 115, 109,  32, 114, 111, 117, 110, 100, 101, 100,  32, 119, // sm rounded w\n  45, 102, 117, 108, 108,  32, 102, 108, 101, 120,  45,  49, // -full flex-1\n  32, 112, 121,  45,  48,  46,  53,  32, 112, 120,  45,  50, //  py-0.5 px-2\n  32, 116, 101, 120, 116,  45, 103, 114,  97, 121,  45,  55, //  text-gray-7\n  48,  48,  32, 112, 108,  97,  99, 101, 104, 111, 108, 100, // 00 placehold\n 101, 114,  58, 116, 101, 120, 116,  45, 103, 114,  97, 121, // er:text-gray\n  45,  52,  48,  48,  32, 102, 111,  99, 117, 115,  58, 111, // -400 focus:o\n 117, 116, 108, 105, 110, 101,  45, 110, 111, 110, 101,  32, // utline-none \n 100, 105, 115,  97,  98, 108, 101, 100,  58,  99, 117, 114, // disabled:cur\n 115, 111, 114,  45, 110, 111, 116,  45,  97, 108, 108, 111, // sor-not-allo\n 119, 101, 100,  32, 100, 105, 115,  97,  98, 108, 101, 100, // wed disabled\n  58,  98, 103,  45, 103, 114,  97, 121,  45,  49,  48,  48, // :bg-gray-100\n  32, 100, 105, 115,  97,  98, 108, 101, 100,  58, 116, 101, //  disabled:te\n 120, 116,  45, 103, 114,  97, 121,  45,  53,  48,  48,  34, // xt-gray-500\"\n  32, 112, 108,  97,  99, 101, 104, 111, 108, 100, 101, 114, //  placeholder\n  61,  36, 123, 112, 108,  97,  99, 101, 104, 111, 108, 100, // =${placehold\n 101, 114, 125,  32,  47,  62,  10,  32,  32,  36, 123,  97, // er} />.  ${a\n 100, 100, 111, 110,  82, 105, 103, 104, 116,  32,  38,  38, // ddonRight &&\n  32, 104, 116, 109, 108,  96,  60, 115, 112,  97, 110,  32, //  html`<span \n  99, 108,  97, 115, 115,  61,  34, 105, 110, 108, 105, 110, // class=\"inlin\n 101,  45, 102, 108, 101, 120,  32, 102, 111, 110, 116,  45, // e-flex font-\n 110, 111, 114, 109,  97, 108,  32, 116, 114, 117, 110,  99, // normal trunc\n  97, 116, 101,  32, 112, 121,  45,  49,  32,  98, 111, 114, // ate py-1 bor\n 100, 101, 114,  45, 108,  32,  98, 103,  45, 115, 108,  97, // der-l bg-sla\n 116, 101,  45,  49,  48,  48,  32, 105, 116, 101, 109, 115, // te-100 items\n  45,  99, 101, 110, 116, 101, 114,  32,  98, 111, 114, 100, // -center bord\n 101, 114,  45, 103, 114,  97, 121,  45,  51,  48,  48,  32, // er-gray-300 \n 112, 120,  45,  50,  32, 116, 101, 120, 116,  45, 103, 114, // px-2 text-gr\n  97, 121,  45,  53,  48,  48,  32, 116, 101, 120, 116,  45, // ay-500 text-\n 120, 115,  32, 111, 118, 101, 114, 102, 108, 111, 119,  45, // xs overflow-\n 115,  99, 114, 111, 108, 108,  34,  32, 115, 116, 121, 108, // scroll\" styl\n 101,  61,  34, 109, 105, 110,  45, 119, 105, 100, 116, 104, // e=\"min-width\n  58,  32,  53,  48,  37,  59,  34,  62,  36, 123,  97, 100, // : 50%;\">${ad\n 100, 111, 110,  82, 105, 103, 104, 116, 125,  60,  47,  47, // donRight}<//\n  62,  96,  32, 125,  10,  60,  47,  47,  62,  96,  59,  10, // >` }.<//>`;.\n 125,  59,  10,  10, 101, 120, 112, 111, 114, 116,  32, 102, // };..export f\n 117, 110,  99, 116, 105, 111, 110,  32,  83, 101, 108, 101, // unction Sele\n  99, 116,  86,  97, 108, 117, 101,  40, 123, 118,  97, 108, // ctValue({val\n 117, 101,  44,  32, 115, 101, 116, 102, 110,  44,  32, 111, // ue, setfn, o\n 112, 116, 105, 111, 110, 115,  44,  32, 100, 105, 115,  97, // ptions, disa\n  98, 108, 101, 100, 125,  41,  32, 123,  10,  32,  32,  99, // bled}) {.  c\n 111, 110, 115, 116,  32, 116, 111,  73, 110, 116,  32,  61, // onst toInt =\n  32, 120,  32,  61,  62,  32, 120,  32,  61,  61,  32, 112, //  x => x == p\n  97, 114, 115, 101,  73, 110, 116,  40, 120,  41,  32,  63, // arseInt(x) ?\n  32, 112,  97, 114, 115, 101,  73, 110, 116,  40, 120,  41, //  parseInt(x)\n  32,  58,  32, 120,  59,  10,  32,  32,  99, 111, 110, 115, //  : x;.  cons\n 116,  32, 111, 110,  99, 104,  97, 110, 103, 101,  32,  61, // t onchange =\n  32, 101, 118,  32,  61,  62,  32, 115, 101, 116, 102, 110, //  ev => setfn\n  40, 116, 111,  73, 110, 116,  40, 101, 118,  46, 116,  97, // (toInt(ev.ta\n 114, 103, 101, 116,  46, 118,  97, 108, 117, 101,  41,  41, // rget.value))\n  59,  10,  32,  32, 114, 101, 116, 117, 114, 110,  32, 104, // ;.  return h\n 116, 109, 108,  96,  10,  60, 115, 101, 108, 101,  99, 116, // tml`.<select\n  32, 111, 110,  99, 104,  97, 110, 103, 101,  61,  36, 123, //  onchange=${\n 111, 110,  99, 104,  97, 110, 103, 101, 125,  32,  99, 108, // onchange} cl\n  97, 115, 115,  61,  34, 119,  45, 102, 117, 108, 108,  32, // ass=\"w-full \n 114, 111, 117, 110, 100, 101, 100,  32, 102, 111, 110, 116, // rounded font\n  45, 110, 111, 114, 109,  97, 108,  32,  98, 111, 114, 100, // -normal bord\n 101, 114,  32, 112, 121,  45,  48,  46,  53,  32, 112, 120, // er py-0.5 px\n  45,  49,  32, 116, 101, 120, 116,  45, 103, 114,  97, 121, // -1 text-gray\n  45,  54,  48,  48,  32, 102, 111,  99, 117, 115,  58, 111, // -600 focus:o\n 117, 116, 108, 105, 110, 101,  45, 110, 111, 110, 101,  32, // utline-none \n 116, 101, 120, 116,  45, 115, 109,  32, 100, 105, 115,  97, // text-sm disa\n  98, 108, 101, 100,  58,  99, 117, 114, 115, 111, 114,  45, // bled:cursor-\n 110, 111, 116,  45,  97, 108, 108, 111, 119, 101, 100,  34, // not-allowed\"\n  32, 100, 105, 115,  97,  98, 108, 101, 100,  61,  36, 123, //  disabled=${\n 100, 105, 115,  97,  98, 108, 101, 100, 125,  62,  10,  32, // disabled}>. \n  32,  36, 123, 111, 112, 116, 105, 111, 110, 115,  46, 109, //  ${options.m\n  97, 112,  40, 118,  32,  61,  62,  32, 104, 116, 109, 108, // ap(v => html\n  96,  60, 111, 112, 116, 105, 111, 110,  32, 118,  97, 108, // `<option val\n 117, 101,  61,  36, 123, 118,  91,  48,  93, 125,  32, 115, // ue=${v[0]} s\n 101, 108, 101,  99, 116, 101, 100,  61,  36, 123, 118,  91, // elected=${v[\n  48,  93,  32,  61,  61,  32, 118,  97, 108, 117, 101, 125, // 0] == value}\n  62,  36, 123, 118,  91,  49,  93, 125,  60,  47,  47,  62, // >${v[1]}<//>\n  96,  41,  32, 125,  10,  60,  47,  47,  62,  96,  59,  10, // `) }.<//>`;.\n 125,  59,  10,  10, 101, 120, 112, 111, 114, 116,  32, 102, // };..export f\n 117, 110,  99, 116, 105, 111, 110,  32,  83, 119, 105, 116, // unction Swit\n  99, 104,  86,  97, 108, 117, 101,  40, 123, 118,  97, 108, // chValue({val\n 117, 101,  44,  32, 115, 101, 116, 102, 110, 125,  41,  32, // ue, setfn}) \n 123,  10,  32,  32,  99, 111, 110, 115, 116,  32, 111, 110, // {.  const on\n  99, 108, 105,  99, 107,  32,  61,  32, 101, 118,  32,  61, // click = ev =\n  62,  32, 115, 101, 116, 102, 110,  40,  33, 118,  97, 108, // > setfn(!val\n 117, 101,  41,  59,  10,  32,  32,  99, 111, 110, 115, 116, // ue);.  const\n  32,  98, 103,  32,  61,  32,  33,  33, 118,  97, 108, 117, //  bg = !!valu\n 101,  32,  63,  32,  39,  98, 103,  45,  98, 108, 117, 101, // e ? 'bg-blue\n  45,  54,  48,  48,  39,  32,  58,  32,  39,  98, 103,  45, // -600' : 'bg-\n 103, 114,  97, 121,  45,  50,  48,  48,  39,  59,  10,  32, // gray-200';. \n  32,  99, 111, 110, 115, 116,  32, 116, 114,  32,  61,  32, //  const tr = \n  33,  33, 118,  97, 108, 117, 101,  32,  63,  32,  39, 116, // !!value ? 't\n 114,  97, 110, 115, 108,  97, 116, 101,  45, 120,  45,  53, // ranslate-x-5\n  39,  32,  58,  32,  39, 116, 114,  97, 110, 115, 108,  97, // ' : 'transla\n 116, 101,  45, 120,  45,  48,  39,  59,  10,  32,  32, 114, // te-x-0';.  r\n 101, 116, 117, 114, 110,  32, 104, 116, 109, 108,  96,  10, // eturn html`.\n  60,  98, 117, 116, 116, 111, 110,  32, 116, 121, 112, 101, // <button type\n  61,  34,  98, 117, 116, 116, 111, 110,  34,  32, 111, 110, // =\"button\" on\n  99, 108, 105,  99, 107,  61,  36, 123, 111, 110,  99, 108, // click=${oncl\n 105,  99, 107, 125,  32,  99, 108,  97, 115, 115,  61,  34, // ick} class=\"\n  36, 123,  98, 103, 125,  32, 105, 110, 108, 105, 110, 101, // ${bg} inline\n  45, 102, 108, 101, 120,  32, 104,  45,  54,  32, 119,  45, // -flex h-6 w-\n  49,  49,  32, 102, 108, 101, 120,  45, 115, 104, 114, 105, // 11 flex-shri\n 110, 107,  45,  48,  32,  99, 117, 114, 115, 111, 114,  45, // nk-0 cursor-\n 112, 111, 105, 110, 116, 101, 114,  32, 114, 111, 117, 110, // pointer roun\n 100, 101, 100,  45, 102, 117, 108, 108,  32,  98, 111, 114, // ded-full bor\n 100, 101, 114,  45,  50,  32,  98, 111, 114, 100, 101, 114, // der-2 border\n  45, 116, 114,  97, 110, 115, 112,  97, 114, 101, 110, 116, // -transparent\n  32, 116, 114,  97, 110, 115, 105, 116, 105, 111, 110,  45, //  transition-\n  99, 111, 108, 111, 114, 115,  32, 100, 117, 114,  97, 116, // colors durat\n 105, 111, 110,  45,  50,  48,  48,  32, 101,  97, 115, 101, // ion-200 ease\n  45, 105, 110,  45, 111, 117, 116,  32, 102, 111,  99, 117, // -in-out focu\n 115,  58, 111, 117, 116, 108, 105, 110, 101,  45, 110, 111, // s:outline-no\n 110, 101,  32, 102, 111,  99, 117, 115,  58, 114, 105, 110, // ne focus:rin\n 103,  45,  48,  32, 114, 105, 110, 103,  45,  48,  34,  32, // g-0 ring-0\" \n 114, 111, 108, 101,  61,  34, 115, 119, 105, 116,  99, 104, // role=\"switch\n  34,  32,  97, 114, 105,  97,  45,  99, 104, 101,  99, 107, // \" aria-check\n 101, 100,  61,  36, 123,  33,  33, 118,  97, 108, 117, 101, // ed=${!!value\n 125,  62,  10,  32,  32,  60, 115, 112,  97, 110,  32,  97, // }>.  <span a\n 114, 105,  97,  45, 104, 105, 100, 100, 101, 110,  61,  34, // ria-hidden=\"\n 116, 114, 117, 101,  34,  32,  99, 108,  97, 115, 115,  61, // true\" class=\n  34,  36, 123, 116, 114, 125,  32, 112, 111, 105, 110, 116, // \"${tr} point\n 101, 114,  45, 101, 118, 101, 110, 116, 115,  45, 110, 111, // er-events-no\n 110, 101,  32, 105, 110, 108, 105, 110, 101,  45,  98, 108, // ne inline-bl\n 111,  99, 107,  32, 104,  45,  53,  32, 119,  45,  53,  32, // ock h-5 w-5 \n 116, 114,  97, 110, 115, 102, 111, 114, 109,  32, 114, 111, // transform ro\n 117, 110, 100, 101, 100,  45, 102, 117, 108, 108,  32,  98, // unded-full b\n 103,  45, 119, 104, 105, 116, 101,  32, 115, 104,  97, 100, // g-white shad\n 111, 119,  32, 114, 105, 110, 103,  45,  48,  32, 102, 111, // ow ring-0 fo\n  99, 117, 115,  58, 114, 105, 110, 103,  45,  48,  32, 116, // cus:ring-0 t\n 114,  97, 110, 115, 105, 116, 105, 111, 110,  32, 100, 117, // ransition du\n 114,  97, 116, 105, 111, 110,  45,  50,  48,  48,  32, 101, // ration-200 e\n  97, 115, 101,  45, 105, 110,  45, 111, 117, 116,  34,  62, // ase-in-out\">\n  60,  47, 115, 112,  97, 110,  62,  10,  60,  47,  98, 117, // </span>.</bu\n 116, 116, 111, 110,  62,  96,  59,  10, 125,  59,  10,  10, // tton>`;.};..\n 101, 120, 112, 111, 114, 116,  32, 102, 117, 110,  99, 116, // export funct\n 105, 111, 110,  32,  83, 101, 116, 116, 105, 110, 103,  40, // ion Setting(\n 112, 114, 111, 112, 115,  41,  32, 123,  10,  32,  32, 108, // props) {.  l\n 101, 116,  32, 105, 110, 112, 117, 116,  32,  61,  32,  84, // et input = T\n 101, 120, 116,  86,  97, 108, 117, 101,  59,  10,  32,  32, // extValue;.  \n 105, 102,  32,  40, 112, 114, 111, 112, 115,  46, 116, 121, // if (props.ty\n 112, 101,  32,  61,  61,  32,  39, 115, 119, 105, 116,  99, // pe == 'switc\n 104,  39,  41,  32, 105, 110, 112, 117, 116,  32,  61,  32, // h') input = \n  83, 119, 105, 116,  99, 104,  86,  97, 108, 117, 101,  59, // SwitchValue;\n  10,  32,  32, 105, 102,  32,  40, 112, 114, 111, 112, 115, // .  if (props\n  46, 116, 121, 112, 101,  32,  61,  61,  32,  39, 115, 101, // .type == 'se\n 108, 101,  99, 116,  39,  41,  32, 105, 110, 112, 117, 116, // lect') input\n  32,  61,  32,  83, 101, 108, 101,  99, 116,  86,  97, 108, //  = SelectVal\n 117, 101,  59,  10,  32,  32, 114, 101, 116, 117, 114, 110, // ue;.  return\n  32, 104, 116, 109, 108,  96,  10,  60, 100, 105, 118,  32, //  html`.<div \n  99, 108,  97, 115, 115,  61,  36, 123, 112, 114, 111, 112, // class=${prop\n 115,  46,  99, 108, 115,  32, 124, 124,  32,  39, 103, 114, // s.cls || 'gr\n 105, 100,  32, 103, 114, 105, 100,  45,  99, 111, 108, 115, // id grid-cols\n  45,  50,  32, 103,  97, 112,  45,  50,  32, 109, 121,  45, // -2 gap-2 my-\n  49,  39, 125,  62,  10,  32,  32,  60, 108,  97,  98, 101, // 1'}>.  <labe\n 108,  32,  99, 108,  97, 115, 115,  61,  34, 102, 108, 101, // l class=\"fle\n 120,  32, 105, 116, 101, 109, 115,  45,  99, 101, 110, 116, // x items-cent\n 101, 114,  32, 116, 101, 120, 116,  45, 115, 109,  32, 116, // er text-sm t\n 101, 120, 116,  45, 103, 114,  97, 121,  45,  55,  48,  48, // ext-gray-700\n  32, 109, 114,  45,  50,  32, 102, 111, 110, 116,  45, 109, //  mr-2 font-m\n 101, 100, 105, 117, 109,  32,  36, 123, 112, 114, 111, 112, // edium ${prop\n 115,  46, 116, 105, 116, 108, 101,  32, 124, 124,  32,  39, // s.title || '\n 104, 105, 100, 100, 101, 110,  39, 125,  34,  62,  36, 123, // hidden'}\">${\n 112, 114, 111, 112, 115,  46, 116, 105, 116, 108, 101, 125, // props.title}\n  60,  47,  47,  62,  10,  32,  32,  60, 100, 105, 118,  32, // <//>.  <div \n  99, 108,  97, 115, 115,  61,  34, 102, 108, 101, 120,  32, // class=\"flex \n 105, 116, 101, 109, 115,  45,  99, 101, 110, 116, 101, 114, // items-center\n  34,  62,  36, 123, 104,  40, 105, 110, 112, 117, 116,  44, // \">${h(input,\n  32, 112, 114, 111, 112, 115,  41, 125,  60,  47,  47,  62, //  props)}<//>\n  10,  60,  47,  47,  62,  96,  59,  10, 125,  59,  10,  10, // .<//>`;.};..\n 101, 120, 112, 111, 114, 116,  32, 102, 117, 110,  99, 116, // export funct\n 105, 111, 110,  32,  80,  97, 103, 105, 110,  97, 116, 105, // ion Paginati\n 111, 110,  40, 123,  32, 116, 111, 116,  97, 108,  73, 116, // on({ totalIt\n 101, 109, 115,  44,  32, 105, 116, 101, 109, 115,  80, 101, // ems, itemsPe\n 114,  80,  97, 103, 101,  44,  32,  99, 117, 114, 114, 101, // rPage, curre\n 110, 116,  80,  97, 103, 101,  44,  32, 115, 101, 116,  80, // ntPage, setP\n  97, 103, 101,  70, 110,  44,  32,  99, 111, 108, 111, 114, // ageFn, color\n 115,  32, 125,  41,  32, 123,  10,  32,  32,  99, 111, 110, // s }) {.  con\n 115, 116,  32, 116, 111, 116,  97, 108,  80,  97, 103, 101, // st totalPage\n 115,  32,  61,  32,  77,  97, 116, 104,  46,  99, 101, 105, // s = Math.cei\n 108,  40, 116, 111, 116,  97, 108,  73, 116, 101, 109, 115, // l(totalItems\n  32,  47,  32, 105, 116, 101, 109, 115,  80, 101, 114,  80, //  / itemsPerP\n  97, 103, 101,  41,  59,  10,  32,  32,  99, 111, 110, 115, // age);.  cons\n 116,  32, 109,  97, 120,  80,  97, 103, 101,  82,  97, 110, // t maxPageRan\n 103, 101,  32,  61,  32,  50,  59,  10,  32,  32,  99, 111, // ge = 2;.  co\n 110, 115, 116,  32, 108, 101, 115, 115,  84, 104,  97, 110, // nst lessThan\n  83, 121, 109,  98, 111, 108,  32,  61,  32,  34,  60,  34, // Symbol = \"<\"\n  59,  10,  32,  32,  99, 111, 110, 115, 116,  32, 103, 114, // ;.  const gr\n 101,  97, 116, 101, 114,  84, 104,  97, 110,  83, 121, 109, // eaterThanSym\n  98, 111, 108,  32,  61,  32,  34,  62,  34,  59,  10,  32, // bol = \">\";. \n  32,  99, 111, 110, 115, 116,  32, 119, 104, 105, 116, 101, //  const white\n  83, 112,  97,  99, 101,  32,  61,  32,  34,  32,  34,  59, // Space = \" \";\n  10,  32,  32,  99, 111, 110, 115, 116,  32, 105, 116, 101, // .  const ite\n 109,  99, 108, 115,  32,  61,  32,  39, 114, 101, 108,  97, // mcls = 'rela\n 116, 105, 118, 101,  32, 105, 110, 108, 105, 110, 101,  45, // tive inline-\n 102, 108, 101, 120,  32, 105, 116, 101, 109, 115,  45,  99, // flex items-c\n 101, 110, 116, 101, 114,  32, 112, 120,  45,  51,  32, 112, // enter px-3 p\n 121,  45,  49,  32, 116, 101, 120, 116,  45, 115, 109,  32, // y-1 text-sm \n 102, 111,  99, 117, 115,  58, 122,  45,  50,  48,  32, 102, // focus:z-20 f\n 111,  99, 117, 115,  45, 118, 105, 115, 105,  98, 108, 101, // ocus-visible\n  58, 111, 117, 116, 108, 105, 110, 101,  32, 102, 111,  99, // :outline foc\n 117, 115,  45, 118, 105, 115, 105,  98, 108, 101,  58, 111, // us-visible:o\n 117, 116, 108, 105, 110, 101,  45,  50,  32, 102, 111,  99, // utline-2 foc\n 117, 115,  45, 118, 105, 115, 105,  98, 108, 101,  58, 111, // us-visible:o\n 117, 116, 108, 105, 110, 101,  45, 111, 102, 102, 115, 101, // utline-offse\n 116,  45,  48,  32, 102, 111,  99, 117, 115,  45, 118, 105, // t-0 focus-vi\n 115, 105,  98, 108, 101,  58, 111, 117, 116, 108, 105, 110, // sible:outlin\n 101,  45,  98, 108, 117, 101,  45,  54,  48,  48,  39,  59, // e-blue-600';\n  10,  32,  32,  99, 111, 108, 111, 114, 115,  32, 124, 124, // .  colors ||\n  61,  32,  39,  98, 103,  45,  98, 108, 117, 101,  45,  54, // = 'bg-blue-6\n  48,  48,  39,  59,  10,  10,  32,  32,  99, 111, 110, 115, // 00';..  cons\n 116,  32,  80,  97, 103, 101,  73, 116, 101, 109,  32,  61, // t PageItem =\n  32,  40, 123,  32, 112,  97, 103, 101,  44,  32, 105, 115, //  ({ page, is\n  65,  99, 116, 105, 118, 101,  32, 125,  41,  32,  61,  62, // Active }) =>\n  32,  40,  10,  32,  32,  32,  32, 104, 116, 109, 108,  96, //  (.    html`\n  60,  97,  10,  32,  32,  32,  32,  32,  32, 111, 110,  67, // <a.      onC\n 108, 105,  99, 107,  61,  36, 123,  40,  41,  32,  61,  62, // lick=${() =>\n  32, 115, 101, 116,  80,  97, 103, 101,  70, 110,  40, 112, //  setPageFn(p\n  97, 103, 101,  41, 125,  10,  32,  32,  32,  32,  32,  32, // age)}.      \n  99, 108,  97, 115, 115,  61,  34,  36, 123, 105, 116, 101, // class=\"${ite\n 109,  99, 108, 115, 125,  32,  36, 123, 105, 115,  65,  99, // mcls} ${isAc\n 116, 105, 118, 101,  32,  63,  32,  96,  36, 123,  99, 111, // tive ? `${co\n 108, 111, 114, 115, 125,  32, 116, 101, 120, 116,  45, 119, // lors} text-w\n 104, 105, 116, 101,  96,  32,  58,  32,  39,  99, 117, 114, // hite` : 'cur\n 115, 111, 114,  45, 112, 111, 105, 110, 116, 101, 114,  32, // sor-pointer \n 116, 101, 120, 116,  45, 103, 114,  97, 121,  45,  55,  48, // text-gray-70\n  48,  32, 114, 105, 110, 103,  45,  49,  32, 114, 105, 110, // 0 ring-1 rin\n 103,  45, 105, 110, 115, 101, 116,  32, 114, 105, 110, 103, // g-inset ring\n  45, 103, 114,  97, 121,  45,  51,  48,  48,  32, 104, 111, // -gray-300 ho\n 118, 101, 114,  58,  98, 103,  45, 103, 114,  97, 121,  45, // ver:bg-gray-\n  53,  48,  39, 125,  34,  10,  32,  32,  32,  32,  62,  10, // 50'}\".    >.\n  32,  32,  32,  32,  32,  32,  36, 123, 112,  97, 103, 101, //       ${page\n 125,  10,  32,  32,  32,  32,  60,  47,  97,  62,  96,  10, // }.    </a>`.\n  32,  32,  41,  59,  10,  10,  32,  32, 114, 101, 116, 117, //   );..  retu\n 114, 110,  32, 104, 116, 109, 108,  96,  10,  32,  32,  32, // rn html`.   \n  32,  60, 100, 105, 118,  32,  99, 108,  97, 115, 115,  61, //  <div class=\n  34, 102, 108, 101, 120,  32, 105, 116, 101, 109, 115,  45, // \"flex items-\n  99, 101, 110, 116, 101, 114,  32, 106, 117, 115, 116, 105, // center justi\n 102, 121,  45,  98, 101, 116, 119, 101, 101, 110,  32,  98, // fy-between b\n 103,  45, 119, 104, 105, 116, 101,  32, 112, 120,  45,  51, // g-white px-3\n  32, 112, 121,  45,  50,  34,  62,  10,  32,  32,  32,  32, //  py-2\">.    \n  32,  32,  60, 100, 105, 118,  32,  99, 108,  97, 115, 115, //   <div class\n  61,  34, 115, 109,  58, 102, 108, 101, 120,  32, 115, 109, // =\"sm:flex sm\n  58, 102, 108, 101, 120,  45,  49,  32, 115, 109,  58, 105, // :flex-1 sm:i\n 116, 101, 109, 115,  45,  99, 101, 110, 116, 101, 114,  32, // tems-center \n 115, 109,  58, 106, 117, 115, 116, 105, 102, 121,  45,  98, // sm:justify-b\n 101, 116, 119, 101, 101, 110,  32, 115, 112,  97,  99, 101, // etween space\n  45, 120,  45,  52,  32, 119, 104, 105, 116, 101, 115, 112, // -x-4 whitesp\n  97,  99, 101,  45, 110, 111, 119, 114,  97, 112,  32, 115, // ace-nowrap s\n 101, 108, 101,  99, 116,  45, 110, 111, 110, 101,  34,  62, // elect-none\">\n  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  60, // .          <\n 112,  32,  99, 108,  97, 115, 115,  61,  34, 116, 101, 120, // p class=\"tex\n 116,  45, 115, 109,  32, 116, 101, 120, 116,  45, 115, 108, // t-sm text-sl\n  97, 116, 101,  45,  53,  48,  48,  32, 102, 111, 110, 116, // ate-500 font\n  45, 109, 101, 100, 105, 117, 109,  34,  62,  10,  32,  32, // -medium\">.  \n  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 115, 104, //           sh\n 111, 119, 105, 110, 103,  32,  60, 115, 112,  97, 110,  32, // owing <span \n  99, 108,  97, 115, 115,  61,  34, 102, 111, 110, 116,  45, // class=\"font-\n  98, 111, 108, 100,  32, 116, 101, 120, 116,  45, 115, 108, // bold text-sl\n  97, 116, 101,  45,  55,  48,  48,  34,  62,  36, 123,  40, // ate-700\">${(\n  99, 117, 114, 114, 101, 110, 116,  80,  97, 103, 101,  32, // currentPage \n  45,  32,  49,  41,  32,  42,  32, 105, 116, 101, 109, 115, // - 1) * items\n  80, 101, 114,  80,  97, 103, 101,  32,  43,  32,  49, 125, // PerPage + 1}\n  60,  47, 115, 112,  97, 110,  62,  32,  45,  32,  60, 115, // </span> - <s\n 112,  97, 110,  32,  99, 108,  97, 115, 115,  61,  34, 102, // pan class=\"f\n 111, 110, 116,  45, 109, 101, 100, 105, 117, 109,  34,  62, // ont-medium\">\n  36, 123,  77,  97, 116, 104,  46, 109, 105, 110,  40,  99, // ${Math.min(c\n 117, 114, 114, 101, 110, 116,  80,  97, 103, 101,  32,  42, // urrentPage *\n  32, 105, 116, 101, 109, 115,  80, 101, 114,  80,  97, 103, //  itemsPerPag\n 101,  44,  32, 116, 111, 116,  97, 108,  73, 116, 101, 109, // e, totalItem\n 115,  41, 125,  60,  47, 115, 112,  97, 110,  62,  32, 111, // s)}</span> o\n 102,  32,  36, 123, 119, 104, 105, 116, 101,  83, 112,  97, // f ${whiteSpa\n  99, 101, 125,  10,  32,  32,  32,  32,  32,  32,  32,  32, // ce}.        \n  32,  32,  32,  32,  60, 115, 112,  97, 110,  32,  99, 108, //     <span cl\n  97, 115, 115,  61,  34, 102, 111, 110, 116,  45,  98, 111, // ass=\"font-bo\n 108, 100,  32, 116, 101, 120, 116,  45, 115, 108,  97, 116, // ld text-slat\n 101,  45,  55,  48,  48,  34,  62,  36, 123, 116, 111, 116, // e-700\">${tot\n  97, 108,  73, 116, 101, 109, 115, 125,  60,  47, 115, 112, // alItems}</sp\n  97, 110,  62,  32, 114, 101, 115, 117, 108, 116, 115,  10, // an> results.\n  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  60,  47, //           </\n 112,  62,  10,  32,  32,  32,  32,  32,  32,  32,  32,  60, // p>.        <\n 100, 105, 118,  62,  10,  32,  32,  32,  32,  32,  32,  32, // div>.       \n  32,  32,  32,  60, 110,  97, 118,  32,  99, 108,  97, 115, //    <nav clas\n 115,  61,  34, 105, 115, 111, 108,  97, 116, 101,  32, 105, // s=\"isolate i\n 110, 108, 105, 110, 101,  45, 102, 108, 101, 120,  32,  45, // nline-flex -\n 115, 112,  97,  99, 101,  45, 120,  45, 112, 120,  32, 114, // space-x-px r\n 111, 117, 110, 100, 101, 100,  45, 109, 100,  34,  32,  97, // ounded-md\" a\n 114, 105,  97,  45, 108,  97,  98, 101, 108,  61,  34,  80, // ria-label=\"P\n  97, 103, 105, 110,  97, 116, 105, 111, 110,  34,  62,  10, // agination\">.\n  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, //             \n  60,  97,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32, // <a.         \n  32,  32,  32,  32,  32, 111, 110,  67, 108, 105,  99, 107, //      onClick\n  61,  36, 123,  40,  41,  32,  61,  62,  32, 115, 101, 116, // =${() => set\n  80,  97, 103, 101,  70, 110,  40,  77,  97, 116, 104,  46, // PageFn(Math.\n 109,  97, 120,  40,  99, 117, 114, 114, 101, 110, 116,  80, // max(currentP\n  97, 103, 101,  32,  45,  32,  49,  44,  32,  49,  41,  41, // age - 1, 1))\n 125,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, // }.          \n  32,  32,  32,  32,  99, 108,  97, 115, 115,  61,  34, 114, //     class=\"r\n 101, 108,  97, 116, 105, 118, 101,  32, 105, 110, 108, 105, // elative inli\n 110, 101,  45, 102, 108, 101, 120,  32, 112, 120,  45,  51, // ne-flex px-3\n  32, 105, 116, 101, 109, 115,  45,  99, 101, 110, 116, 101, //  items-cente\n 114,  32, 116, 101, 120, 116,  45, 103, 114,  97, 121,  45, // r text-gray-\n  52,  48,  48,  32, 114, 105, 110, 103,  45,  49,  32, 114, // 400 ring-1 r\n 105, 110, 103,  45, 105, 110, 115, 101, 116,  32, 114, 105, // ing-inset ri\n 110, 103,  45, 103, 114,  97, 121,  45,  51,  48,  48,  32, // ng-gray-300 \n 104, 111, 118, 101, 114,  58,  98, 103,  45, 103, 114,  97, // hover:bg-gra\n 121,  45,  53,  48,  32,  36, 123,  99, 117, 114, 114, 101, // y-50 ${curre\n 110, 116,  80,  97, 103, 101,  32,  33,  61,  32,  49,  32, // ntPage != 1 \n  63,  32,  39,  99, 117, 114, 115, 111, 114,  45, 112, 111, // ? 'cursor-po\n 105, 110, 116, 101, 114,  39,  32,  58,  32,  39,  39, 125, // inter' : ''}\n  32, 102, 111,  99, 117, 115,  58, 122,  45,  50,  48,  32, //  focus:z-20 \n 102, 111,  99, 117, 115,  58, 111, 117, 116, 108, 105, 110, // focus:outlin\n 101,  45, 111, 102, 102, 115, 101, 116,  45,  48,  34,  62, // e-offset-0\">\n  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, // .           \n  32,  32,  32,  36, 123, 108, 101, 115, 115,  84, 104,  97, //    ${lessTha\n 110,  83, 121, 109,  98, 111, 108, 125,  10,  32,  32,  32, // nSymbol}.   \n  32,  32,  32,  32,  32,  32,  32,  32,  32,  60,  47,  97, //          </a\n  62,  10,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32, // >..         \n  32,  32,  32,  60,  36, 123,  80,  97, 103, 101,  73, 116, //    <${PageIt\n 101, 109, 125,  32, 112,  97, 103, 101,  61,  36, 123,  49, // em} page=${1\n 125,  32, 105, 115,  65,  99, 116, 105, 118, 101,  61,  36, // } isActive=$\n 123,  99, 117, 114, 114, 101, 110, 116,  80,  97, 103, 101, // {currentPage\n  32,  61,  61,  61,  32,  49, 125,  32,  47,  62,  10,  32, //  === 1} />. \n  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  36, //            $\n 123,  99, 117, 114, 114, 101, 110, 116,  80,  97, 103, 101, // {currentPage\n  32,  62,  32, 109,  97, 120,  80,  97, 103, 101,  82,  97, //  > maxPageRa\n 110, 103, 101,  32,  43,  32,  50,  32,  63,  32, 104, 116, // nge + 2 ? ht\n 109, 108,  96,  60, 115, 112,  97, 110,  32,  99, 108,  97, // ml`<span cla\n 115, 115,  61,  34,  36, 123, 105, 116, 101, 109,  99, 108, // ss=\"${itemcl\n 115, 125,  32, 114, 105, 110, 103,  45,  49,  32, 114, 105, // s} ring-1 ri\n 110, 103,  45, 105, 110, 115, 101, 116,  32, 114, 105, 110, // ng-inset rin\n 103,  45, 103, 114,  97, 121,  45,  51,  48,  48,  32, 116, // g-gray-300 t\n 101, 120, 116,  45, 115, 108,  97, 116, 101,  45,  51,  48, // ext-slate-30\n  48,  34,  62,  46,  46,  46,  60,  47, 115, 112,  97, 110, // 0\">...</span\n  62,  96,  32,  58,  32,  39,  39, 125,  10,  32,  32,  32, // >` : ''}.   \n  32,  32,  32,  32,  32,  32,  32,  32,  32,  36, 123,  65, //          ${A\n 114, 114,  97, 121,  46, 102, 114, 111, 109,  40, 123, 108, // rray.from({l\n 101, 110, 103, 116, 104,  58,  32,  77,  97, 116, 104,  46, // ength: Math.\n 109, 105, 110,  40, 116, 111, 116,  97, 108,  80,  97, 103, // min(totalPag\n 101, 115,  44,  32, 109,  97, 120,  80,  97, 103, 101,  82, // es, maxPageR\n  97, 110, 103, 101,  32,  42,  32,  50,  32,  43,  32,  49, // ange * 2 + 1\n  41, 125,  44,  32,  40,  95,  44,  32, 105,  41,  32,  61, // )}, (_, i) =\n  62,  32,  77,  97, 116, 104,  46, 109,  97, 120,  40,  50, // > Math.max(2\n  44,  32,  99, 117, 114, 114, 101, 110, 116,  80,  97, 103, // , currentPag\n 101,  32,  45,  32, 109,  97, 120,  80,  97, 103, 101,  82, // e - maxPageR\n  97, 110, 103, 101,  41,  32,  43,  32, 105,  41,  46, 109, // ange) + i).m\n  97, 112,  40, 112,  97, 103, 101,  32,  61,  62,  32, 112, // ap(page => p\n  97, 103, 101,  32,  62,  32,  49,  32,  38,  38,  32, 112, // age > 1 && p\n  97, 103, 101,  32,  60,  32, 116, 111, 116,  97, 108,  80, // age < totalP\n  97, 103, 101, 115,  32,  38,  38,  32, 104, 116, 109, 108, // ages && html\n  96,  60,  36, 123,  80,  97, 103, 101,  73, 116, 101, 109, // `<${PageItem\n 125,  32, 112,  97, 103, 101,  61,  36, 123, 112,  97, 103, // } page=${pag\n 101, 125,  32, 105, 115,  65,  99, 116, 105, 118, 101,  61, // e} isActive=\n  36, 123,  99, 117, 114, 114, 101, 110, 116,  80,  97, 103, // ${currentPag\n 101,  32,  61,  61,  61,  32, 112,  97, 103, 101, 125,  32, // e === page} \n  47,  62,  96,  41, 125,  10,  32,  32,  32,  32,  32,  32, // />`)}.      \n  32,  32,  32,  32,  32,  32,  36, 123,  99, 117, 114, 114, //       ${curr\n 101, 110, 116,  80,  97, 103, 101,  32,  60,  32, 116, 111, // entPage < to\n 116,  97, 108,  80,  97, 103, 101, 115,  32,  45,  32,  40, // talPages - (\n 109,  97, 120,  80,  97, 103, 101,  82,  97, 110, 103, 101, // maxPageRange\n  32,  43,  32,  49,  41,  32,  63,  32, 104, 116, 109, 108, //  + 1) ? html\n  96,  60, 115, 112,  97, 110,  32,  99, 108,  97, 115, 115, // `<span class\n  61,  34,  36, 123, 105, 116, 101, 109,  99, 108, 115, 125, // =\"${itemcls}\n  32, 114, 105, 110, 103,  45,  49,  32, 114, 105, 110, 103, //  ring-1 ring\n  45, 105, 110, 115, 101, 116,  32, 114, 105, 110, 103,  45, // -inset ring-\n 103, 114,  97, 121,  45,  51,  48,  48,  32, 116, 101, 120, // gray-300 tex\n 116,  45, 115, 108,  97, 116, 101,  45,  51,  48,  48,  34, // t-slate-300\"\n  62,  46,  46,  46,  60,  47, 115, 112,  97, 110,  62,  96, // >...</span>`\n  32,  58,  32,  39,  39, 125,  10,  32,  32,  32,  32,  32, //  : ''}.     \n  32,  32,  32,  32,  32,  32,  32,  36, 123, 116, 111, 116, //        ${tot\n  97, 108,  80,  97, 103, 101, 115,  32,  62,  32,  49,  32, // alPages > 1 \n  63,  32, 104, 116, 109, 108,  96,  60,  36, 123,  80,  97, // ? html`<${Pa\n 103, 101,  73, 116, 101, 109, 125,  32, 112,  97, 103, 101, // geItem} page\n  61,  36, 123, 116, 111, 116,  97, 108,  80,  97, 103, 101, // =${totalPage\n 115, 125,  32, 105, 115,  65,  99, 116, 105, 118, 101,  61, // s} isActive=\n  36, 123,  99, 117, 114, 114, 101, 110, 116,  80,  97, 103, // ${currentPag\n 101,  32,  61,  61,  61,  32, 116, 111, 116,  97, 108,  80, // e === totalP\n  97, 103, 101, 115, 125,  32,  47,  62,  96,  32,  58,  32, // ages} />` : \n  39,  39, 125,  10,  10,  32,  32,  32,  32,  32,  32,  32, // ''}..       \n  32,  32,  32,  32,  32,  60,  97,  10,  32,  32,  32,  32, //      <a.    \n  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 111, 110, //           on\n  67, 108, 105,  99, 107,  61,  36, 123,  40,  41,  32,  61, // Click=${() =\n  62,  32, 115, 101, 116,  80,  97, 103, 101,  70, 110,  40, // > setPageFn(\n  77,  97, 116, 104,  46, 109, 105, 110,  40,  99, 117, 114, // Math.min(cur\n 114, 101, 110, 116,  80,  97, 103, 101,  32,  43,  32,  49, // rentPage + 1\n  44,  32, 116, 111, 116,  97, 108,  80,  97, 103, 101, 115, // , totalPages\n  41,  41, 125,  10,  32,  32,  32,  32,  32,  32,  32,  32, // ))}.        \n  32,  32,  32,  32,  32,  32,  99, 108,  97, 115, 115,  61, //       class=\n  34, 114, 101, 108,  97, 116, 105, 118, 101,  32, 105, 110, // \"relative in\n 108, 105, 110, 101,  45, 102, 108, 101, 120,  32, 112, 120, // line-flex px\n  45,  51,  32, 105, 116, 101, 109, 115,  45,  99, 101, 110, // -3 items-cen\n 116, 101, 114,  32, 116, 101, 120, 116,  45, 103, 114,  97, // ter text-gra\n 121,  45,  52,  48,  48,  32, 114, 105, 110, 103,  45,  49, // y-400 ring-1\n  32, 114, 105, 110, 103,  45, 105, 110, 115, 101, 116,  32, //  ring-inset \n 114, 105, 110, 103,  45, 103, 114,  97, 121,  45,  51,  48, // ring-gray-30\n  48,  32, 104, 111, 118, 101, 114,  58,  98, 103,  45, 103, // 0 hover:bg-g\n 114,  97, 121,  45,  53,  48,  32,  36, 123,  99, 117, 114, // ray-50 ${cur\n 114, 101, 110, 116,  80,  97, 103, 101,  32,  33,  61,  32, // rentPage != \n 116, 111, 116,  97, 108,  80,  97, 103, 101, 115,  32,  63, // totalPages ?\n  32,  39,  99, 117, 114, 115, 111, 114,  45, 112, 111, 105, //  'cursor-poi\n 110, 116, 101, 114,  39,  32,  58,  32,  39,  39, 125,  32, // nter' : ''} \n 102, 111,  99, 117, 115,  58, 122,  45,  50,  48,  32, 102, // focus:z-20 f\n 111,  99, 117, 115,  58, 111, 117, 116, 108, 105, 110, 101, // ocus:outline\n  45, 111, 102, 102, 115, 101, 116,  45,  48,  34,  62,  10, // -offset-0\">.\n  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, //             \n  32,  32,  36, 123, 103, 114, 101,  97, 116, 101, 114,  84, //   ${greaterT\n 104,  97, 110,  83, 121, 109,  98, 111, 108, 125,  10,  32, // hanSymbol}. \n  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  60, //            <\n  47,  97,  62,  10,  32,  32,  32,  32,  32,  32,  32,  32, // /a>.        \n  32,  32,  60,  47, 110,  97, 118,  62,  10,  32,  32,  32, //   </nav>.   \n  32,  32,  32,  32,  32,  60,  47, 100, 105, 118,  62,  10, //      </div>.\n  32,  32,  32,  32,  32,  32,  60,  47, 100, 105, 118,  62, //       </div>\n  10,  32,  32,  32,  32,  60,  47, 100, 105, 118,  62,  96, // .    </div>`\n  59,  10, 125,  59,  10,  10, 101, 120, 112, 111, 114, 116, // ;.};..export\n  32, 102, 117, 110,  99, 116, 105, 111, 110,  32,  85, 112, //  function Up\n 108, 111,  97, 100,  70, 105, 108, 101,  66, 117, 116, 116, // loadFileButt\n 111, 110,  40, 112, 114, 111, 112, 115,  41,  32, 123,  10, // on(props) {.\n  32,  32,  99, 111, 110, 115, 116,  32,  91, 117, 112, 108, //   const [upl\n 111,  97, 100,  44,  32, 115, 101, 116,  85, 112, 108, 111, // oad, setUplo\n  97, 100,  93,  32,  61,  32, 117, 115, 101,  83, 116,  97, // ad] = useSta\n 116, 101,  40, 110, 117, 108, 108,  41,  59,  32,  32,  47, // te(null);  /\n  47,  32,  85, 112, 108, 111,  97, 100,  32, 112, 114, 111, // / Upload pro\n 109, 105, 115, 101,  10,  32,  32,  99, 111, 110, 115, 116, // mise.  const\n  32,  91, 115, 116,  97, 116, 117, 115,  44,  32, 115, 101, //  [status, se\n 116,  83, 116,  97, 116, 117, 115,  93,  32,  61,  32, 117, // tStatus] = u\n 115, 101,  83, 116,  97, 116, 101,  40,  39,  39,  41,  59, // seState('');\n  32,  32,  32,  32,  47,  47,  32,  67, 117, 114, 114, 101, //     // Curre\n 110, 116,  32, 117, 112, 108, 111,  97, 100,  32, 115, 116, // nt upload st\n  97, 116, 117, 115,  10,  32,  32,  99, 111, 110, 115, 116, // atus.  const\n  32,  98, 116, 110,  32,  61,  32, 117, 115, 101,  82, 101, //  btn = useRe\n 102,  40, 110, 117, 108, 108,  41,  59,  10,  32,  32,  99, // f(null);.  c\n 111, 110, 115, 116,  32, 105, 110, 112, 117, 116,  32,  61, // onst input =\n  32, 117, 115, 101,  82, 101, 102,  40, 110, 117, 108, 108, //  useRef(null\n  41,  59,  10,  10,  32,  32,  47,  47,  32,  83, 101, 110, // );..  // Sen\n 100,  32,  97,  32, 108,  97, 114, 103, 101,  32, 102, 105, // d a large fi\n 108, 101,  32,  99, 104, 117, 110, 107,  32,  98, 121,  32, // le chunk by \n  99, 104, 117, 110, 107,  10,  32,  32,  99, 111, 110, 115, // chunk.  cons\n 116,  32, 115, 101, 110, 100,  70, 105, 108, 101,  68,  97, // t sendFileDa\n 116,  97,  32,  61,  32, 102, 117, 110,  99, 116, 105, 111, // ta = functio\n 110,  40, 117, 114, 108,  44,  32, 102, 105, 108, 101,  78, // n(url, fileN\n  97, 109, 101,  44,  32, 102, 105, 108, 101,  68,  97, 116, // ame, fileDat\n  97,  44,  32,  99, 104, 117, 110, 107,  83, 105, 122, 101, // a, chunkSize\n  41,  32, 123,  10,  32,  32,  32,  32, 114, 101, 116, 117, // ) {.    retu\n 114, 110,  32, 110, 101, 119,  32,  80, 114, 111, 109, 105, // rn new Promi\n 115, 101,  40, 102, 117, 110,  99, 116, 105, 111, 110,  40, // se(function(\n 114, 101, 115, 111, 108, 118, 101,  44,  32, 114, 101, 106, // resolve, rej\n 101,  99, 116,  41,  32, 123,  10,  32,  32,  32,  32,  32, // ect) {.     \n  32,  99, 111, 110, 115, 116,  32, 102, 105, 110, 105, 115, //  const finis\n 104,  32,  61,  32, 111, 107,  32,  61,  62,  32, 123,  10, // h = ok => {.\n  32,  32,  32,  32,  32,  32,  32,  32, 115, 101, 116,  85, //         setU\n 112, 108, 111,  97, 100,  40, 110, 117, 108, 108,  41,  59, // pload(null);\n  10,  32,  32,  32,  32,  32,  32,  32,  32,  99, 111, 110, // .        con\n 115, 116,  32, 114, 101, 115,  32,  61,  32, 112, 114, 111, // st res = pro\n 112, 115,  46, 111, 110, 117, 112, 108, 111,  97, 100,  32, // ps.onupload \n  63,  32, 112, 114, 111, 112, 115,  46, 111, 110, 117, 112, // ? props.onup\n 108, 111,  97, 100,  40, 111, 107,  44,  32, 102, 105, 108, // load(ok, fil\n 101,  78,  97, 109, 101,  44,  32, 102, 105, 108, 101,  68, // eName, fileD\n  97, 116,  97,  46, 108, 101, 110, 103, 116, 104,  41,  32, // ata.length) \n  58,  32, 110, 117, 108, 108,  59,  10,  32,  32,  32,  32, // : null;.    \n  32,  32,  32,  32, 105, 102,  32,  40, 114, 101, 115,  32, //     if (res \n  38,  38,  32, 116, 121, 112, 101, 111, 102,  32,  40, 114, // && typeof (r\n 101, 115,  46,  99,  97, 116,  99, 104,  41,  32,  61,  61, // es.catch) ==\n  61,  32,  39, 102, 117, 110,  99, 116, 105, 111, 110,  39, // = 'function'\n  41,  32, 123,  10,  32,  32,  32,  32,  32,  32,  32,  32, // ) {.        \n  32,  32, 114, 101, 115,  46,  99,  97, 116,  99, 104,  40, //   res.catch(\n  40,  41,  32,  61,  62,  32, 102,  97, 108, 115, 101,  41, // () => false)\n  46, 116, 104, 101, 110,  40,  40,  41,  32,  61,  62,  32, // .then(() => \n 111, 107,  32,  63,  32, 114, 101, 115, 111, 108, 118, 101, // ok ? resolve\n  40,  41,  32,  58,  32, 114, 101, 106, 101,  99, 116,  40, // () : reject(\n  41,  41,  59,  10,  32,  32,  32,  32,  32,  32,  32,  32, // ));.        \n 125,  32, 101, 108, 115, 101,  32, 123,  10,  32,  32,  32, // } else {.   \n  32,  32,  32,  32,  32,  32,  32, 111, 107,  32,  63,  32, //        ok ? \n 114, 101, 115, 111, 108, 118, 101,  40,  41,  32,  58,  32, // resolve() : \n 114, 101, 106, 101,  99, 116,  40,  41,  59,  10,  32,  32, // reject();.  \n  32,  32,  32,  32,  32,  32, 125,  10,  32,  32,  32,  32, //       }.    \n  32,  32, 125,  59,  10,  32,  32,  32,  32,  32,  32,  99, //   };.      c\n 111, 110, 115, 116,  32, 115, 101, 110, 100,  67, 104, 117, // onst sendChu\n 110, 107,  32,  61,  32, 102, 117, 110,  99, 116, 105, 111, // nk = functio\n 110,  40, 111, 102, 102, 115, 101, 116,  41,  32, 123,  10, // n(offset) {.\n  32,  32,  32,  32,  32,  32,  32,  32, 118,  97, 114,  32, //         var \n  99, 104, 117, 110, 107,  32,  61,  32, 102, 105, 108, 101, // chunk = file\n  68,  97, 116,  97,  46, 115, 117,  98,  97, 114, 114,  97, // Data.subarra\n 121,  40, 111, 102, 102, 115, 101, 116,  44,  32, 111, 102, // y(offset, of\n 102, 115, 101, 116,  32,  43,  32,  99, 104, 117, 110, 107, // fset + chunk\n  83, 105, 122, 101,  41,  32, 124, 124,  32,  39,  39,  59, // Size) || '';\n  10,  32,  32,  32,  32,  32,  32,  32,  32, 118,  97, 114, // .        var\n  32, 111, 112, 116, 115,  32,  61,  32, 123, 109, 101, 116, //  opts = {met\n 104, 111, 100,  58,  32,  39,  80,  79,  83,  84,  39,  44, // hod: 'POST',\n  32,  98, 111, 100, 121,  58,  32,  99, 104, 117, 110, 107, //  body: chunk\n 125,  59,  10,  32,  32,  32,  32,  32,  32,  32,  32, 118, // };.        v\n  97, 114,  32, 102, 117, 108, 108,  85, 114, 108,  32,  61, // ar fullUrl =\n  32, 117, 114, 108,  32,  43,  32,  39,  63, 111, 102, 102, //  url + '?off\n 115, 101, 116,  61,  39,  32,  43,  32, 111, 102, 102, 115, // set=' + offs\n 101, 116,  32,  43,  10,  32,  32,  32,  32,  32,  32,  32, // et +.       \n  32,  32,  32,  39,  38, 116, 111, 116,  97, 108,  61,  39, //    '&total='\n  32,  43,  32, 102, 105, 108, 101,  68,  97, 116,  97,  46, //  + fileData.\n 108, 101, 110, 103, 116, 104,  32,  32,  43,  10,  32,  32, // length  +.  \n  32,  32,  32,  32,  32,  32,  32,  32,  39,  38, 110,  97, //         '&na\n 109, 101,  61,  39,  32,  43,  32, 101, 110,  99, 111, 100, // me=' + encod\n 101,  85,  82,  73,  67, 111, 109, 112, 111, 110, 101, 110, // eURIComponen\n 116,  40, 102, 105, 108, 101,  78,  97, 109, 101,  41,  59, // t(fileName);\n  10,  32,  32,  32,  32,  32,  32,  32,  32, 118,  97, 114, // .        var\n  32, 111, 107,  59,  10,  32,  32,  32,  32,  32,  32,  32, //  ok;.       \n  32, 115, 101, 116,  83, 116,  97, 116, 117, 115,  40,  39, //  setStatus('\n  85, 112, 108, 111,  97, 100, 105, 110, 103,  32,  39,  32, // Uploading ' \n  43,  32, 102, 105, 108, 101,  78,  97, 109, 101,  32,  43, // + fileName +\n  32,  39,  44,  32,  98, 121, 116, 101, 115,  32,  39,  32, //  ', bytes ' \n  43,  32, 111, 102, 102, 115, 101, 116,  32,  43,  32,  39, // + offset + '\n  46,  46,  39,  32,  43,  10,  32,  32,  32,  32,  32,  32, // ..' +.      \n  32,  32,  32,  32,  40, 111, 102, 102, 115, 101, 116,  32, //     (offset \n  43,  32,  99, 104, 117, 110, 107,  46, 108, 101, 110, 103, // + chunk.leng\n 116, 104,  41,  32,  43,  32,  39,  32, 111, 102,  32,  39, // th) + ' of '\n  32,  43,  32, 102, 105, 108, 101,  68,  97, 116,  97,  46, //  + fileData.\n 108, 101, 110, 103, 116, 104,  41,  59,  10,  32,  32,  32, // length);.   \n  32,  32,  32,  32,  32, 102, 101, 116,  99, 104,  40, 102, //      fetch(f\n 117, 108, 108,  85, 114, 108,  44,  32, 111, 112, 116, 115, // ullUrl, opts\n  41,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, // ).          \n  46, 116, 104, 101, 110,  40, 102, 117, 110,  99, 116, 105, // .then(functi\n 111, 110,  40, 114, 101, 115,  41,  32, 123,  10,  32,  32, // on(res) {.  \n  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 105, 102, //           if\n  32,  40, 114, 101, 115,  46, 111, 107,  32,  38,  38,  32, //  (res.ok && \n  99, 104, 117, 110, 107,  46, 108, 101, 110, 103, 116, 104, // chunk.length\n  32,  62,  32,  48,  41,  32, 115, 101, 110, 100,  67, 104, //  > 0) sendCh\n 117, 110, 107,  40, 111, 102, 102, 115, 101, 116,  32,  43, // unk(offset +\n  32,  99, 104, 117, 110, 107,  46, 108, 101, 110, 103, 116, //  chunk.lengt\n 104,  41,  59,  10,  32,  32,  32,  32,  32,  32,  32,  32, // h);.        \n  32,  32,  32,  32, 111, 107,  32,  61,  32, 114, 101, 115, //     ok = res\n  46, 111, 107,  59,  10,  32,  32,  32,  32,  32,  32,  32, // .ok;.       \n  32,  32,  32,  32,  32, 114, 101, 116, 117, 114, 110,  32, //      return \n 114, 101, 115,  46, 116, 101, 120, 116,  40,  41,  59,  10, // res.text();.\n  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 125,  41, //           })\n  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  46, // .          .\n 116, 104, 101, 110,  40, 102, 117, 110,  99, 116, 105, 111, // then(functio\n 110,  40, 116, 101, 120, 116,  41,  32, 123,  10,  32,  32, // n(text) {.  \n  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, 105, 102, //           if\n  32,  40,  33, 111, 107,  41,  32, 115, 101, 116,  83, 116, //  (!ok) setSt\n  97, 116, 117, 115,  40,  39,  69, 114, 114, 111, 114,  58, // atus('Error:\n  32,  39,  32,  43,  32, 116, 101, 120, 116,  41,  44,  32, //  ' + text), \n 102, 105, 110, 105, 115, 104,  40, 111, 107,  41,  59,  32, // finish(ok); \n  47,  47,  32,  70,  97, 105, 108,  10,  32,  32,  32,  32, // // Fail.    \n  32,  32,  32,  32,  32,  32,  32,  32, 105, 102,  32,  40, //         if (\n  99, 104, 117, 110, 107,  46, 108, 101, 110, 103, 116, 104, // chunk.length\n  32,  62,  32,  48,  41,  32, 114, 101, 116, 117, 114, 110, //  > 0) return\n  59,  32,  47,  47,  32,  77, 111, 114, 101,  32,  99, 104, // ; // More ch\n 117, 110, 107, 115,  32, 116, 111,  32, 115, 101, 110, 100, // unks to send\n  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, // .           \n  32, 115, 101, 116,  83, 116,  97, 116, 117, 115,  40, 120, //  setStatus(x\n  32,  61,  62,  32, 120,  32,  43,  32,  39,  46,  32,  68, //  => x + '. D\n 111, 110, 101,  44,  32, 114, 101, 115, 101, 116, 116, 105, // one, resetti\n 110, 103,  32, 100, 101, 118, 105,  99, 101,  46,  46,  46, // ng device...\n  39,  41,  59,  10,  32,  32,  32,  32,  32,  32,  32,  32, // ');.        \n  32,  32,  32,  32, 102, 105, 110, 105, 115, 104,  40, 111, //     finish(o\n 107,  41,  59,  32,  47,  47,  32,  65, 108, 108,  32,  99, // k); // All c\n 104, 117, 110, 107, 115,  32, 115, 101, 110, 116,  10,  32, // hunks sent. \n  32,  32,  32,  32,  32,  32,  32,  32,  32, 125,  41,  59, //          });\n  10,  32,  32,  32,  32,  32,  32, 125,  59,  10,  32,  32, // .      };.  \n  32,  32,  32,  32, 115, 101, 110, 100,  67, 104, 117, 110, //     sendChun\n 107,  40,  48,  41,  59,  10,  32,  32,  32,  32, 125,  41, // k(0);.    })\n  59,  10,  32,  32, 125,  59,  10,  10,  32,  32,  99, 111, // ;.  };..  co\n 110, 115, 116,  32, 111, 110,  99, 104,  97, 110, 103, 101, // nst onchange\n  32,  61,  32, 102, 117, 110,  99, 116, 105, 111, 110,  40, //  = function(\n 101, 118,  41,  32, 123,  10,  32,  32,  32,  32, 105, 102, // ev) {.    if\n  32,  40,  33, 101, 118,  46, 116,  97, 114, 103, 101, 116, //  (!ev.target\n  46, 102, 105, 108, 101, 115,  91,  48,  93,  41,  32, 114, // .files[0]) r\n 101, 116, 117, 114, 110,  59,  10,  32,  32,  32,  32, 108, // eturn;.    l\n 101, 116,  32, 114,  32,  61,  32, 110, 101, 119,  32,  70, // et r = new F\n 105, 108, 101,  82, 101,  97, 100, 101, 114,  40,  41,  44, // ileReader(),\n  32, 102,  32,  61,  32, 101, 118,  46, 116,  97, 114, 103, //  f = ev.targ\n 101, 116,  46, 102, 105, 108, 101, 115,  91,  48,  93,  59, // et.files[0];\n  10,  32,  32,  32,  32, 114,  46, 114, 101,  97, 100,  65, // .    r.readA\n 115,  65, 114, 114,  97, 121,  66, 117, 102, 102, 101, 114, // sArrayBuffer\n  40, 102,  41,  59,  10,  32,  32,  32,  32, 114,  46, 111, // (f);.    r.o\n 110, 108, 111,  97, 100,  32,  61,  32, 102, 117, 110,  99, // nload = func\n 116, 105, 111, 110,  40,  41,  32, 123,  10,  32,  32,  32, // tion() {.   \n  32,  32,  32, 115, 101, 116,  85, 112, 108, 111,  97, 100, //    setUpload\n  40, 115, 101, 110, 100,  70, 105, 108, 101,  68,  97, 116, // (sendFileDat\n  97,  40, 112, 114, 111, 112, 115,  46, 117, 114, 108,  44, // a(props.url,\n  32, 102,  46, 110,  97, 109, 101,  44,  32, 110, 101, 119, //  f.name, new\n  32,  85, 105, 110, 116,  56,  65, 114, 114,  97, 121,  40, //  Uint8Array(\n 114,  46, 114, 101, 115, 117, 108, 116,  41,  44,  32,  50, // r.result), 2\n  48,  52,  56,  41,  41,  59,  10,  32,  32,  32,  32,  32, // 048));.     \n  32, 101, 118,  46, 116,  97, 114, 103, 101, 116,  46, 118, //  ev.target.v\n  97, 108, 117, 101,  32,  61,  32,  39,  39,  59,  10,  32, // alue = '';. \n  32,  32,  32,  32,  32, 101, 118,  46, 112, 114, 101, 118, //      ev.prev\n 101, 110, 116,  68, 101, 102,  97, 117, 108, 116,  40,  41, // entDefault()\n  59,  10,  32,  32,  32,  32,  32,  32,  98, 116, 110,  32, // ;.      btn \n  38,  38,  32,  98, 116, 110,  46,  99, 117, 114, 114, 101, // && btn.curre\n 110, 116,  46,  98,  97, 115, 101,  46,  99, 108, 105,  99, // nt.base.clic\n 107,  40,  41,  59,  10,  32,  32,  32,  32, 125,  59,  10, // k();.    };.\n  32,  32, 125,  59,  10,  10,  32,  32,  99, 111, 110, 115, //   };..  cons\n 116,  32, 111, 110,  99, 108, 105,  99, 107,  32,  61,  32, // t onclick = \n 102, 117, 110,  99, 116, 105, 111, 110,  40, 101, 118,  41, // function(ev)\n  32, 123,  10,  32,  32,  32,  32, 108, 101, 116,  32, 102, //  {.    let f\n 110,  59,  32, 115, 101, 116,  85, 112, 108, 111,  97, 100, // n; setUpload\n  40, 120,  32,  61,  62,  32, 102, 110,  32,  61,  32, 120, // (x => fn = x\n  41,  59,  10,  32,  32,  32,  32, 105, 102,  32,  40,  33, // );.    if (!\n 102, 110,  41,  32, 105, 110, 112, 117, 116,  46,  99, 117, // fn) input.cu\n 114, 114, 101, 110, 116,  46,  99, 108, 105,  99, 107,  40, // rrent.click(\n  41,  59,  32,  32,  47,  47,  32,  78, 111,  32, 117, 112, // );  // No up\n 108, 111,  97, 100,  32, 105, 110,  32, 112, 114, 111, 103, // load in prog\n 114, 101, 115, 115,  44,  32, 115, 104, 111, 119,  32, 102, // ress, show f\n 105, 108, 101,  32, 100, 105,  97, 108, 111, 103,  10,  32, // ile dialog. \n  32,  32,  32, 114, 101, 116, 117, 114, 110,  32, 102, 110, //    return fn\n  59,  10,  32,  32, 125,  59,  10,  10,  32,  32, 114, 101, // ;.  };..  re\n 116, 117, 114, 110,  32, 104, 116, 109, 108,  96,  10,  60, // turn html`.<\n 100, 105, 118,  32,  99, 108,  97, 115, 115,  61,  34, 105, // div class=\"i\n 110, 108, 105, 110, 101,  45, 102, 108, 101, 120,  32, 102, // nline-flex f\n 108, 101, 120,  45,  99, 111, 108,  32,  36, 123, 112, 114, // lex-col ${pr\n 111, 112, 115,  46,  99, 108,  97, 115, 115, 125,  34,  62, // ops.class}\">\n  10,  32,  32,  60, 105, 110, 112, 117, 116,  32,  99, 108, // .  <input cl\n  97, 115, 115,  61,  34, 104, 105, 100, 100, 101, 110,  34, // ass=\"hidden\"\n  32, 116, 121, 112, 101,  61,  34, 102, 105, 108, 101,  34, //  type=\"file\"\n  32, 114, 101, 102,  61,  36, 123, 105, 110, 112, 117, 116, //  ref=${input\n 125,  32, 111, 110,  99, 104,  97, 110, 103, 101,  61,  36, // } onchange=$\n 123, 111, 110,  99, 104,  97, 110, 103, 101, 125,  32,  97, // {onchange} a\n  99,  99, 101, 112, 116,  61,  36, 123, 112, 114, 111, 112, // ccept=${prop\n 115,  46,  97,  99,  99, 101, 112, 116, 125,  32,  47,  62, // s.accept} />\n  10,  32,  32,  60,  36, 123,  66, 117, 116, 116, 111, 110, // .  <${Button\n 125,  32, 116, 105, 116, 108, 101,  61,  36, 123, 112, 114, // } title=${pr\n 111, 112, 115,  46, 116, 105, 116, 108, 101, 125,  32, 105, // ops.title} i\n  99, 111, 110,  61,  36, 123,  73,  99, 111, 110, 115,  46, // con=${Icons.\n 100, 111, 119, 110, 108, 111,  97, 100, 125,  32, 111, 110, // download} on\n  99, 108, 105,  99, 107,  61,  36, 123, 111, 110,  99, 108, // click=${oncl\n 105,  99, 107, 125,  32, 114, 101, 102,  61,  36, 123,  98, // ick} ref=${b\n 116, 110, 125,  32,  99, 111, 108, 111, 114, 115,  61,  36, // tn} colors=$\n 123, 112, 114, 111, 112, 115,  46,  99, 111, 108, 111, 114, // {props.color\n 115, 125,  32,  47,  62,  10,  32,  32,  60, 100, 105, 118, // s} />.  <div\n  32,  99, 108,  97, 115, 115,  61,  34, 112, 116,  45,  50, //  class=\"pt-2\n  32, 116, 101, 120, 116,  45, 115, 109,  32, 116, 101, 120, //  text-sm tex\n 116,  45, 115, 108,  97, 116, 101,  45,  52,  48,  48,  32, // t-slate-400 \n  36, 123, 115, 116,  97, 116, 117, 115,  32, 124, 124,  32, // ${status || \n  39, 104, 105, 100, 100, 101, 110,  39, 125,  34,  62,  36, // 'hidden'}\">$\n 123, 115, 116,  97, 116, 117, 115, 125,  60,  47,  47,  62, // {status}<//>\n  10,  60,  47,  47,  62,  96,  59,  10, 125,  59,  10, 0 // .<//>`;.};.\n};\nstatic const unsigned char v3[] = {\n  33, 102, 117, 110,  99, 116, 105, 111, 110,  40, 116,  44, // !function(t,\n 110,  41, 123,  34, 111,  98, 106, 101,  99, 116,  34,  61, // n){\"object\"=\n  61, 116, 121, 112, 101, 111, 102,  32, 101, 120, 112, 111, // =typeof expo\n 114, 116, 115,  38,  38,  34, 111,  98, 106, 101,  99, 116, // rts&&\"object\n  34,  61,  61, 116, 121, 112, 101, 111, 102,  32, 109, 111, // \"==typeof mo\n 100, 117, 108, 101,  63, 109, 111, 100, 117, 108, 101,  46, // dule?module.\n 101, 120, 112, 111, 114, 116, 115,  61, 110,  40,  41,  58, // exports=n():\n  34, 102, 117, 110,  99, 116, 105, 111, 110,  34,  61,  61, // \"function\"==\n 116, 121, 112, 101, 111, 102,  32, 100, 101, 102, 105, 110, // typeof defin\n 101,  38,  38, 100, 101, 102, 105, 110, 101,  46,  97, 109, // e&&define.am\n 100,  63, 100, 101, 102, 105, 110, 101,  40,  91,  93,  44, // d?define([],\n 110,  41,  58,  34, 111,  98, 106, 101,  99, 116,  34,  61, // n):\"object\"=\n  61, 116, 121, 112, 101, 111, 102,  32, 101, 120, 112, 111, // =typeof expo\n 114, 116, 115,  63, 101, 120, 112, 111, 114, 116, 115,  46, // rts?exports.\n  72, 105, 115, 116, 111, 114, 121,  61, 110,  40,  41,  58, // History=n():\n 116,  46,  72, 105, 115, 116, 111, 114, 121,  61, 110,  40, // t.History=n(\n  41, 125,  40, 116, 104, 105, 115,  44, 102, 117, 110,  99, // )}(this,func\n 116, 105, 111, 110,  40,  41, 123, 114, 101, 116, 117, 114, // tion(){retur\n 110,  32, 102, 117, 110,  99, 116, 105, 111, 110,  40, 116, // n function(t\n  41, 123, 102, 117, 110,  99, 116, 105, 111, 110,  32, 110, // ){function n\n  40, 111,  41, 123, 105, 102,  40, 101,  91, 111,  93,  41, // (o){if(e[o])\n 114, 101, 116, 117, 114, 110,  32, 101,  91, 111,  93,  46, // return e[o].\n 101, 120, 112, 111, 114, 116, 115,  59, 118,  97, 114,  32, // exports;var \n 114,  61, 101,  91, 111,  93,  61, 123, 101, 120, 112, 111, // r=e[o]={expo\n 114, 116, 115,  58, 123, 125,  44, 105, 100,  58, 111,  44, // rts:{},id:o,\n 108, 111,  97, 100, 101, 100,  58,  33,  49, 125,  59, 114, // loaded:!1};r\n 101, 116, 117, 114, 110,  32, 116,  91, 111,  93,  46,  99, // eturn t[o].c\n  97, 108, 108,  40, 114,  46, 101, 120, 112, 111, 114, 116, // all(r.export\n 115,  44, 114,  44, 114,  46, 101, 120, 112, 111, 114, 116, // s,r,r.export\n 115,  44, 110,  41,  44, 114,  46, 108, 111,  97, 100, 101, // s,n),r.loade\n 100,  61,  33,  48,  44, 114,  46, 101, 120, 112, 111, 114, // d=!0,r.expor\n 116, 115, 125, 118,  97, 114,  32, 101,  61, 123, 125,  59, // ts}var e={};\n 114, 101, 116, 117, 114, 110,  32, 110,  46, 109,  61, 116, // return n.m=t\n  44, 110,  46,  99,  61, 101,  44, 110,  46, 112,  61,  34, // ,n.c=e,n.p=\"\n  34,  44, 110,  40,  48,  41, 125,  40,  91, 102, 117, 110, // \",n(0)}([fun\n  99, 116, 105, 111, 110,  40, 116,  44, 110,  44, 101,  41, // ction(t,n,e)\n 123,  34, 117, 115, 101,  32, 115, 116, 114, 105,  99, 116, // {\"use strict\n  34,  59, 102, 117, 110,  99, 116, 105, 111, 110,  32, 111, // \";function o\n  40, 116,  41, 123, 114, 101, 116, 117, 114, 110,  32, 116, // (t){return t\n  38,  38, 116,  46,  95,  95, 101, 115,  77, 111, 100, 117, // &&t.__esModu\n 108, 101,  63, 116,  58, 123, 100, 101, 102,  97, 117, 108, // le?t:{defaul\n 116,  58, 116, 125, 125, 110,  46,  95,  95, 101, 115,  77, // t:t}}n.__esM\n 111, 100, 117, 108, 101,  61,  33,  48,  44, 110,  46,  99, // odule=!0,n.c\n 114, 101,  97, 116, 101,  80,  97, 116, 104,  61, 110,  46, // reatePath=n.\n 112,  97, 114, 115, 101,  80,  97, 116, 104,  61, 110,  46, // parsePath=n.\n 108, 111,  99,  97, 116, 105, 111, 110, 115,  65, 114, 101, // locationsAre\n  69, 113, 117,  97, 108,  61, 110,  46,  99, 114, 101,  97, // Equal=n.crea\n 116, 101,  76, 111,  99,  97, 116, 105, 111, 110,  61, 110, // teLocation=n\n  46,  99, 114, 101,  97, 116, 101,  77, 101, 109, 111, 114, // .createMemor\n 121,  72, 105, 115, 116, 111, 114, 121,  61, 110,  46,  99, // yHistory=n.c\n 114, 101,  97, 116, 101,  72,  97, 115, 104,  72, 105, 115, // reateHashHis\n 116, 111, 114, 121,  61, 110,  46,  99, 114, 101,  97, 116, // tory=n.creat\n 101,  66, 114, 111, 119, 115, 101, 114,  72, 105, 115, 116, // eBrowserHist\n 111, 114, 121,  61, 118, 111, 105, 100,  32,  48,  59, 118, // ory=void 0;v\n  97, 114,  32, 114,  61, 101,  40,  50,  41,  59,  79,  98, // ar r=e(2);Ob\n 106, 101,  99, 116,  46, 100, 101, 102, 105, 110, 101,  80, // ject.defineP\n 114, 111, 112, 101, 114, 116, 121,  40, 110,  44,  34,  99, // roperty(n,\"c\n 114, 101,  97, 116, 101,  76, 111,  99,  97, 116, 105, 111, // reateLocatio\n 110,  34,  44, 123, 101, 110, 117, 109, 101, 114,  97,  98, // n\",{enumerab\n 108, 101,  58,  33,  48,  44, 103, 101, 116,  58, 102, 117, // le:!0,get:fu\n 110,  99, 116, 105, 111, 110,  40,  41, 123, 114, 101, 116, // nction(){ret\n 117, 114, 110,  32, 114,  46,  99, 114, 101,  97, 116, 101, // urn r.create\n  76, 111,  99,  97, 116, 105, 111, 110, 125, 125,  41,  44, // Location}}),\n  79,  98, 106, 101,  99, 116,  46, 100, 101, 102, 105, 110, // Object.defin\n 101,  80, 114, 111, 112, 101, 114, 116, 121,  40, 110,  44, // eProperty(n,\n  34, 108, 111,  99,  97, 116, 105, 111, 110, 115,  65, 114, // \"locationsAr\n 101,  69, 113, 117,  97, 108,  34,  44, 123, 101, 110, 117, // eEqual\",{enu\n 109, 101, 114,  97,  98, 108, 101,  58,  33,  48,  44, 103, // merable:!0,g\n 101, 116,  58, 102, 117, 110,  99, 116, 105, 111, 110,  40, // et:function(\n  41, 123, 114, 101, 116, 117, 114, 110,  32, 114,  46, 108, // ){return r.l\n 111,  99,  97, 116, 105, 111, 110, 115,  65, 114, 101,  69, // ocationsAreE\n 113, 117,  97, 108, 125, 125,  41,  59, 118,  97, 114,  32, // qual}});var \n 105,  61, 101,  40,  49,  41,  59,  79,  98, 106, 101,  99, // i=e(1);Objec\n 116,  46, 100, 101, 102, 105, 110, 101,  80, 114, 111, 112, // t.defineProp\n 101, 114, 116, 121,  40, 110,  44,  34, 112,  97, 114, 115, // erty(n,\"pars\n 101,  80,  97, 116, 104,  34,  44, 123, 101, 110, 117, 109, // ePath\",{enum\n 101, 114,  97,  98, 108, 101,  58,  33,  48,  44, 103, 101, // erable:!0,ge\n 116,  58, 102, 117, 110,  99, 116, 105, 111, 110,  40,  41, // t:function()\n 123, 114, 101, 116, 117, 114, 110,  32, 105,  46, 112,  97, // {return i.pa\n 114, 115, 101,  80,  97, 116, 104, 125, 125,  41,  44,  79, // rsePath}}),O\n  98, 106, 101,  99, 116,  46, 100, 101, 102, 105, 110, 101, // bject.define\n  80, 114, 111, 112, 101, 114, 116, 121,  40, 110,  44,  34, // Property(n,\"\n  99, 114, 101,  97, 116, 101,  80,  97, 116, 104,  34,  44, // createPath\",\n 123, 101, 110, 117, 109, 101, 114,  97,  98, 108, 101,  58, // {enumerable:\n  33,  48,  44, 103, 101, 116,  58, 102, 117, 110,  99, 116, // !0,get:funct\n 105, 111, 110,  40,  41, 123, 114, 101, 116, 117, 114, 110, // ion(){return\n  32, 105,  46,  99, 114, 101,  97, 116, 101,  80,  97, 116, //  i.createPat\n 104, 125, 125,  41,  59, 118,  97, 114,  32,  97,  61, 101, // h}});var a=e\n  40,  55,  41,  44,  99,  61, 111,  40,  97,  41,  44, 117, // (7),c=o(a),u\n  61, 101,  40,  56,  41,  44, 115,  61, 111,  40, 117,  41, // =e(8),s=o(u)\n  44, 102,  61, 101,  40,  57,  41,  44, 108,  61, 111,  40, // ,f=e(9),l=o(\n 102,  41,  59, 110,  46,  99, 114, 101,  97, 116, 101,  66, // f);n.createB\n 114, 111, 119, 115, 101, 114,  72, 105, 115, 116, 111, 114, // rowserHistor\n 121,  61,  99,  46, 100, 101, 102,  97, 117, 108, 116,  44, // y=c.default,\n 110,  46,  99, 114, 101,  97, 116, 101,  72,  97, 115, 104, // n.createHash\n  72, 105, 115, 116, 111, 114, 121,  61, 115,  46, 100, 101, // History=s.de\n 102,  97, 117, 108, 116,  44, 110,  46,  99, 114, 101,  97, // fault,n.crea\n 116, 101,  77, 101, 109, 111, 114, 121,  72, 105, 115, 116, // teMemoryHist\n 111, 114, 121,  61, 108,  46, 100, 101, 102,  97, 117, 108, // ory=l.defaul\n 116, 125,  44, 102, 117, 110,  99, 116, 105, 111, 110,  40, // t},function(\n 116,  44, 110,  41, 123,  34, 117, 115, 101,  32, 115, 116, // t,n){\"use st\n 114, 105,  99, 116,  34,  59, 110,  46,  95,  95, 101, 115, // rict\";n.__es\n  77, 111, 100, 117, 108, 101,  61,  33,  48,  59, 110,  46, // Module=!0;n.\n  97, 100, 100,  76, 101,  97, 100, 105, 110, 103,  83, 108, // addLeadingSl\n  97, 115, 104,  61, 102, 117, 110,  99, 116, 105, 111, 110, // ash=function\n  40, 116,  41, 123, 114, 101, 116, 117, 114, 110,  34,  47, // (t){return\"/\n  34,  61,  61,  61, 116,  46,  99, 104,  97, 114,  65, 116, // \"===t.charAt\n  40,  48,  41,  63, 116,  58,  34,  47,  34,  43, 116, 125, // (0)?t:\"/\"+t}\n  44, 110,  46, 115, 116, 114, 105, 112,  76, 101,  97, 100, // ,n.stripLead\n 105, 110, 103,  83, 108,  97, 115, 104,  61, 102, 117, 110, // ingSlash=fun\n  99, 116, 105, 111, 110,  40, 116,  41, 123, 114, 101, 116, // ction(t){ret\n 117, 114, 110,  34,  47,  34,  61,  61,  61, 116,  46,  99, // urn\"/\"===t.c\n 104,  97, 114,  65, 116,  40,  48,  41,  63, 116,  46, 115, // harAt(0)?t.s\n 117,  98, 115, 116, 114,  40,  49,  41,  58, 116, 125,  44, // ubstr(1):t},\n 110,  46, 115, 116, 114, 105, 112,  80, 114, 101, 102, 105, // n.stripPrefi\n 120,  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, 116, // x=function(t\n  44, 110,  41, 123, 114, 101, 116, 117, 114, 110,  32,  48, // ,n){return 0\n  61,  61,  61, 116,  46, 105, 110, 100, 101, 120,  79, 102, // ===t.indexOf\n  40, 110,  41,  63, 116,  46, 115, 117,  98, 115, 116, 114, // (n)?t.substr\n  40, 110,  46, 108, 101, 110, 103, 116, 104,  41,  58, 116, // (n.length):t\n 125,  44, 110,  46, 115, 116, 114, 105, 112,  84, 114,  97, // },n.stripTra\n 105, 108, 105, 110, 103,  83, 108,  97, 115, 104,  61, 102, // ilingSlash=f\n 117, 110,  99, 116, 105, 111, 110,  40, 116,  41, 123, 114, // unction(t){r\n 101, 116, 117, 114, 110,  34,  47,  34,  61,  61,  61, 116, // eturn\"/\"===t\n  46,  99, 104,  97, 114,  65, 116,  40, 116,  46, 108, 101, // .charAt(t.le\n 110, 103, 116, 104,  45,  49,  41,  63, 116,  46, 115, 108, // ngth-1)?t.sl\n 105,  99, 101,  40,  48,  44,  45,  49,  41,  58, 116, 125, // ice(0,-1):t}\n  44, 110,  46, 112,  97, 114, 115, 101,  80,  97, 116, 104, // ,n.parsePath\n  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, 116,  41, // =function(t)\n 123, 118,  97, 114,  32, 110,  61, 116, 124, 124,  34,  47, // {var n=t||\"/\n  34,  44, 101,  61,  34,  34,  44, 111,  61,  34,  34,  44, // \",e=\"\",o=\"\",\n 114,  61, 110,  46, 105, 110, 100, 101, 120,  79, 102,  40, // r=n.indexOf(\n  34,  35,  34,  41,  59, 114,  33,  61,  61,  45,  49,  38, // \"#\");r!==-1&\n  38,  40, 111,  61, 110,  46, 115, 117,  98, 115, 116, 114, // &(o=n.substr\n  40, 114,  41,  44, 110,  61, 110,  46, 115, 117,  98, 115, // (r),n=n.subs\n 116, 114,  40,  48,  44, 114,  41,  41,  59, 118,  97, 114, // tr(0,r));var\n  32, 105,  61, 110,  46, 105, 110, 100, 101, 120,  79, 102, //  i=n.indexOf\n  40,  34,  63,  34,  41,  59, 114, 101, 116, 117, 114, 110, // (\"?\");return\n  32, 105,  33,  61,  61,  45,  49,  38,  38,  40, 101,  61, //  i!==-1&&(e=\n 110,  46, 115, 117,  98, 115, 116, 114,  40, 105,  41,  44, // n.substr(i),\n 110,  61, 110,  46, 115, 117,  98, 115, 116, 114,  40,  48, // n=n.substr(0\n  44, 105,  41,  41,  44, 110,  61, 100, 101,  99, 111, 100, // ,i)),n=decod\n 101,  85,  82,  73,  40, 110,  41,  44, 123, 112,  97, 116, // eURI(n),{pat\n 104, 110,  97, 109, 101,  58, 110,  44, 115, 101,  97, 114, // hname:n,sear\n  99, 104,  58,  34,  63,  34,  61,  61,  61, 101,  63,  34, // ch:\"?\"===e?\"\n  34,  58, 101,  44, 104,  97, 115, 104,  58,  34,  35,  34, // \":e,hash:\"#\"\n  61,  61,  61, 111,  63,  34,  34,  58, 111, 125, 125,  44, // ===o?\"\":o}},\n 110,  46,  99, 114, 101,  97, 116, 101,  80,  97, 116, 104, // n.createPath\n  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, 116,  41, // =function(t)\n 123, 118,  97, 114,  32, 110,  61, 116,  46, 112,  97, 116, // {var n=t.pat\n 104, 110,  97, 109, 101,  44, 101,  61, 116,  46, 115, 101, // hname,e=t.se\n  97, 114,  99, 104,  44, 111,  61, 116,  46, 104,  97, 115, // arch,o=t.has\n 104,  44, 114,  61, 101, 110,  99, 111, 100, 101,  85,  82, // h,r=encodeUR\n  73,  40, 110, 124, 124,  34,  47,  34,  41,  59, 114, 101, // I(n||\"/\");re\n 116, 117, 114, 110,  32, 101,  38,  38,  34,  63,  34,  33, // turn e&&\"?\"!\n  61,  61, 101,  38,  38,  40, 114,  43,  61,  34,  63,  34, // ==e&&(r+=\"?\"\n  61,  61,  61, 101,  46,  99, 104,  97, 114,  65, 116,  40, // ===e.charAt(\n  48,  41,  63, 101,  58,  34,  63,  34,  43, 101,  41,  44, // 0)?e:\"?\"+e),\n 111,  38,  38,  34,  35,  34,  33,  61,  61, 111,  38,  38, // o&&\"#\"!==o&&\n  40, 114,  43,  61,  34,  35,  34,  61,  61,  61, 111,  46, // (r+=\"#\"===o.\n  99, 104,  97, 114,  65, 116,  40,  48,  41,  63, 111,  58, // charAt(0)?o:\n  34,  35,  34,  43, 111,  41,  44, 114, 125, 125,  44, 102, // \"#\"+o),r}},f\n 117, 110,  99, 116, 105, 111, 110,  40, 116,  44, 110,  44, // unction(t,n,\n 101,  41, 123,  34, 117, 115, 101,  32, 115, 116, 114, 105, // e){\"use stri\n  99, 116,  34,  59, 102, 117, 110,  99, 116, 105, 111, 110, // ct\";function\n  32, 111,  40, 116,  41, 123, 114, 101, 116, 117, 114, 110, //  o(t){return\n  32, 116,  38,  38, 116,  46,  95,  95, 101, 115,  77, 111, //  t&&t.__esMo\n 100, 117, 108, 101,  63, 116,  58, 123, 100, 101, 102,  97, // dule?t:{defa\n 117, 108, 116,  58, 116, 125, 125, 110,  46,  95,  95, 101, // ult:t}}n.__e\n 115,  77, 111, 100, 117, 108, 101,  61,  33,  48,  44, 110, // sModule=!0,n\n  46, 108, 111,  99,  97, 116, 105, 111, 110, 115,  65, 114, // .locationsAr\n 101,  69, 113, 117,  97, 108,  61, 110,  46,  99, 114, 101, // eEqual=n.cre\n  97, 116, 101,  76, 111,  99,  97, 116, 105, 111, 110,  61, // ateLocation=\n 118, 111, 105, 100,  32,  48,  59, 118,  97, 114,  32, 114, // void 0;var r\n  61,  79,  98, 106, 101,  99, 116,  46,  97, 115, 115, 105, // =Object.assi\n 103, 110, 124, 124, 102, 117, 110,  99, 116, 105, 111, 110, // gn||function\n  40, 116,  41, 123, 102, 111, 114,  40, 118,  97, 114,  32, // (t){for(var \n 110,  61,  49,  59, 110,  60,  97, 114, 103, 117, 109, 101, // n=1;n<argume\n 110, 116, 115,  46, 108, 101, 110, 103, 116, 104,  59, 110, // nts.length;n\n  43,  43,  41, 123, 118,  97, 114,  32, 101,  61,  97, 114, // ++){var e=ar\n 103, 117, 109, 101, 110, 116, 115,  91, 110,  93,  59, 102, // guments[n];f\n 111, 114,  40, 118,  97, 114,  32, 111,  32, 105, 110,  32, // or(var o in \n 101,  41,  79,  98, 106, 101,  99, 116,  46, 112, 114, 111, // e)Object.pro\n 116, 111, 116, 121, 112, 101,  46, 104,  97, 115,  79, 119, // totype.hasOw\n 110,  80, 114, 111, 112, 101, 114, 116, 121,  46,  99,  97, // nProperty.ca\n 108, 108,  40, 101,  44, 111,  41,  38,  38,  40, 116,  91, // ll(e,o)&&(t[\n 111,  93,  61, 101,  91, 111,  93,  41, 125, 114, 101, 116, // o]=e[o])}ret\n 117, 114, 110,  32, 116, 125,  44, 105,  61, 101,  40,  49, // urn t},i=e(1\n  48,  41,  44,  97,  61, 111,  40, 105,  41,  44,  99,  61, // 0),a=o(i),c=\n 101,  40,  49,  49,  41,  44, 117,  61, 111,  40,  99,  41, // e(11),u=o(c)\n  44, 115,  61, 101,  40,  49,  41,  59, 110,  46,  99, 114, // ,s=e(1);n.cr\n 101,  97, 116, 101,  76, 111,  99,  97, 116, 105, 111, 110, // eateLocation\n  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, 116,  44, // =function(t,\n 110,  44, 101,  44, 111,  41, 123, 118,  97, 114,  32, 105, // n,e,o){var i\n  61, 118, 111, 105, 100,  32,  48,  59, 114, 101, 116, 117, // =void 0;retu\n 114, 110,  34, 115, 116, 114, 105, 110, 103,  34,  61,  61, // rn\"string\"==\n 116, 121, 112, 101, 111, 102,  32, 116,  63,  40, 105,  61, // typeof t?(i=\n  40,  48,  44, 115,  46, 112,  97, 114, 115, 101,  80,  97, // (0,s.parsePa\n 116, 104,  41,  40, 116,  41,  44, 105,  46, 115, 116,  97, // th)(t),i.sta\n 116, 101,  61, 110,  41,  58,  40, 105,  61, 114,  40, 123, // te=n):(i=r({\n 125,  44, 116,  41,  44, 118, 111, 105, 100,  32,  48,  61, // },t),void 0=\n  61,  61, 105,  46, 112,  97, 116, 104, 110,  97, 109, 101, // ==i.pathname\n  38,  38,  40, 105,  46, 112,  97, 116, 104, 110,  97, 109, // &&(i.pathnam\n 101,  61,  34,  34,  41,  44, 105,  46, 115, 101,  97, 114, // e=\"\"),i.sear\n  99, 104,  63,  34,  63,  34,  33,  61,  61, 105,  46, 115, // ch?\"?\"!==i.s\n 101,  97, 114,  99, 104,  46,  99, 104,  97, 114,  65, 116, // earch.charAt\n  40,  48,  41,  38,  38,  40, 105,  46, 115, 101,  97, 114, // (0)&&(i.sear\n  99, 104,  61,  34,  63,  34,  43, 105,  46, 115, 101,  97, // ch=\"?\"+i.sea\n 114,  99, 104,  41,  58, 105,  46, 115, 101,  97, 114,  99, // rch):i.searc\n 104,  61,  34,  34,  44, 105,  46, 104,  97, 115, 104,  63, // h=\"\",i.hash?\n  34,  35,  34,  33,  61,  61, 105,  46, 104,  97, 115, 104, // \"#\"!==i.hash\n  46,  99, 104,  97, 114,  65, 116,  40,  48,  41,  38,  38, // .charAt(0)&&\n  40, 105,  46, 104,  97, 115, 104,  61,  34,  35,  34,  43, // (i.hash=\"#\"+\n 105,  46, 104,  97, 115, 104,  41,  58, 105,  46, 104,  97, // i.hash):i.ha\n 115, 104,  61,  34,  34,  44, 118, 111, 105, 100,  32,  48, // sh=\"\",void 0\n  33,  61,  61, 110,  38,  38, 118, 111, 105, 100,  32,  48, // !==n&&void 0\n  61,  61,  61, 105,  46, 115, 116,  97, 116, 101,  38,  38, // ===i.state&&\n  40, 105,  46, 115, 116,  97, 116, 101,  61, 110,  41,  41, // (i.state=n))\n  44, 105,  46, 107, 101, 121,  61, 101,  44, 111,  38,  38, // ,i.key=e,o&&\n  40, 105,  46, 112,  97, 116, 104, 110,  97, 109, 101,  63, // (i.pathname?\n  34,  47,  34,  33,  61,  61, 105,  46, 112,  97, 116, 104, // \"/\"!==i.path\n 110,  97, 109, 101,  46,  99, 104,  97, 114,  65, 116,  40, // name.charAt(\n  48,  41,  38,  38,  40, 105,  46, 112,  97, 116, 104, 110, // 0)&&(i.pathn\n  97, 109, 101,  61,  40,  48,  44,  97,  46, 100, 101, 102, // ame=(0,a.def\n  97, 117, 108, 116,  41,  40, 105,  46, 112,  97, 116, 104, // ault)(i.path\n 110,  97, 109, 101,  44, 111,  46, 112,  97, 116, 104, 110, // name,o.pathn\n  97, 109, 101,  41,  41,  58, 105,  46, 112,  97, 116, 104, // ame)):i.path\n 110,  97, 109, 101,  61, 111,  46, 112,  97, 116, 104, 110, // name=o.pathn\n  97, 109, 101,  41,  44, 105, 125,  44, 110,  46, 108, 111, // ame),i},n.lo\n  99,  97, 116, 105, 111, 110, 115,  65, 114, 101,  69, 113, // cationsAreEq\n 117,  97, 108,  61, 102, 117, 110,  99, 116, 105, 111, 110, // ual=function\n  40, 116,  44, 110,  41, 123, 114, 101, 116, 117, 114, 110, // (t,n){return\n  32, 116,  46, 112,  97, 116, 104, 110,  97, 109, 101,  61, //  t.pathname=\n  61,  61, 110,  46, 112,  97, 116, 104, 110,  97, 109, 101, // ==n.pathname\n  38,  38, 116,  46, 115, 101,  97, 114,  99, 104,  61,  61, // &&t.search==\n  61, 110,  46, 115, 101,  97, 114,  99, 104,  38,  38, 116, // =n.search&&t\n  46, 104,  97, 115, 104,  61,  61,  61, 110,  46, 104,  97, // .hash===n.ha\n 115, 104,  38,  38, 116,  46, 107, 101, 121,  61,  61,  61, // sh&&t.key===\n 110,  46, 107, 101, 121,  38,  38,  40,  48,  44, 117,  46, // n.key&&(0,u.\n 100, 101, 102,  97, 117, 108, 116,  41,  40, 116,  46, 115, // default)(t.s\n 116,  97, 116, 101,  44, 110,  46, 115, 116,  97, 116, 101, // tate,n.state\n  41, 125, 125,  44, 102, 117, 110,  99, 116, 105, 111, 110, // )}},function\n  40, 116,  44, 110,  44, 101,  41, 123,  34, 117, 115, 101, // (t,n,e){\"use\n  32, 115, 116, 114, 105,  99, 116,  34,  59, 118,  97, 114, //  strict\";var\n  32, 111,  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, //  o=function(\n  41, 123, 125,  59, 116,  46, 101, 120, 112, 111, 114, 116, // ){};t.export\n 115,  61, 111, 125,  44, 102, 117, 110,  99, 116, 105, 111, // s=o},functio\n 110,  40, 116,  44, 110,  44, 101,  41, 123,  34, 117, 115, // n(t,n,e){\"us\n 101,  32, 115, 116, 114, 105,  99, 116,  34,  59, 102, 117, // e strict\";fu\n 110,  99, 116, 105, 111, 110,  32, 111,  40, 116,  41, 123, // nction o(t){\n 114, 101, 116, 117, 114, 110,  32, 116,  38,  38, 116,  46, // return t&&t.\n  95,  95, 101, 115,  77, 111, 100, 117, 108, 101,  63, 116, // __esModule?t\n  58, 123, 100, 101, 102,  97, 117, 108, 116,  58, 116, 125, // :{default:t}\n 125, 110,  46,  95,  95, 101, 115,  77, 111, 100, 117, 108, // }n.__esModul\n 101,  61,  33,  48,  59, 118,  97, 114,  32, 114,  61, 101, // e=!0;var r=e\n  40,  51,  41,  44, 105,  61,  40, 111,  40, 114,  41,  44, // (3),i=(o(r),\n 102, 117, 110,  99, 116, 105, 111, 110,  40,  41, 123, 118, // function(){v\n  97, 114,  32, 116,  61, 110, 117, 108, 108,  44, 110,  61, // ar t=null,n=\n 102, 117, 110,  99, 116, 105, 111, 110,  40, 110,  41, 123, // function(n){\n 114, 101, 116, 117, 114, 110,  32, 116,  61, 110,  44, 102, // return t=n,f\n 117, 110,  99, 116, 105, 111, 110,  40,  41, 123, 116,  61, // unction(){t=\n  61,  61, 110,  38,  38,  40, 116,  61, 110, 117, 108, 108, // ==n&&(t=null\n  41, 125, 125,  44, 101,  61, 102, 117, 110,  99, 116, 105, // )}},e=functi\n 111, 110,  40, 110,  44, 101,  44, 111,  44, 114,  41, 123, // on(n,e,o,r){\n 105, 102,  40, 110, 117, 108, 108,  33,  61, 116,  41, 123, // if(null!=t){\n 118,  97, 114,  32, 105,  61,  34, 102, 117, 110,  99, 116, // var i=\"funct\n 105, 111, 110,  34,  61,  61, 116, 121, 112, 101, 111, 102, // ion\"==typeof\n  32, 116,  63, 116,  40, 110,  44, 101,  41,  58, 116,  59, //  t?t(n,e):t;\n  34, 115, 116, 114, 105, 110, 103,  34,  61,  61, 116, 121, // \"string\"==ty\n 112, 101, 111, 102,  32, 105,  63,  34, 102, 117, 110,  99, // peof i?\"func\n 116, 105, 111, 110,  34,  61,  61, 116, 121, 112, 101, 111, // tion\"==typeo\n 102,  32, 111,  63, 111,  40, 105,  44, 114,  41,  58, 114, // f o?o(i,r):r\n  40,  33,  48,  41,  58, 114,  40, 105,  33,  61,  61,  33, // (!0):r(i!==!\n  49,  41, 125, 101, 108, 115, 101,  32, 114,  40,  33,  48, // 1)}else r(!0\n  41, 125,  44, 111,  61,  91,  93,  44, 114,  61, 102, 117, // )},o=[],r=fu\n 110,  99, 116, 105, 111, 110,  40, 116,  41, 123, 118,  97, // nction(t){va\n 114,  32, 110,  61,  33,  48,  44, 101,  61, 102, 117, 110, // r n=!0,e=fun\n  99, 116, 105, 111, 110,  40,  41, 123, 110,  38,  38, 116, // ction(){n&&t\n  46,  97, 112, 112, 108, 121,  40, 118, 111, 105, 100,  32, // .apply(void \n  48,  44,  97, 114, 103, 117, 109, 101, 110, 116, 115,  41, // 0,arguments)\n 125,  59, 114, 101, 116, 117, 114, 110,  32, 111,  46, 112, // };return o.p\n 117, 115, 104,  40, 101,  41,  44, 102, 117, 110,  99, 116, // ush(e),funct\n 105, 111, 110,  40,  41, 123, 110,  61,  33,  49,  44, 111, // ion(){n=!1,o\n  61, 111,  46, 102, 105, 108, 116, 101, 114,  40, 102, 117, // =o.filter(fu\n 110,  99, 116, 105, 111, 110,  40, 116,  41, 123, 114, 101, // nction(t){re\n 116, 117, 114, 110,  32, 116,  33,  61,  61, 101, 125,  41, // turn t!==e})\n 125, 125,  44, 105,  61, 102, 117, 110,  99, 116, 105, 111, // }},i=functio\n 110,  40,  41, 123, 102, 111, 114,  40, 118,  97, 114,  32, // n(){for(var \n 116,  61,  97, 114, 103, 117, 109, 101, 110, 116, 115,  46, // t=arguments.\n 108, 101, 110, 103, 116, 104,  44, 110,  61,  65, 114, 114, // length,n=Arr\n  97, 121,  40, 116,  41,  44, 101,  61,  48,  59, 101,  60, // ay(t),e=0;e<\n 116,  59, 101,  43,  43,  41, 110,  91, 101,  93,  61,  97, // t;e++)n[e]=a\n 114, 103, 117, 109, 101, 110, 116, 115,  91, 101,  93,  59, // rguments[e];\n 111,  46, 102, 111, 114,  69,  97,  99, 104,  40, 102, 117, // o.forEach(fu\n 110,  99, 116, 105, 111, 110,  40, 116,  41, 123, 114, 101, // nction(t){re\n 116, 117, 114, 110,  32, 116,  46,  97, 112, 112, 108, 121, // turn t.apply\n  40, 118, 111, 105, 100,  32,  48,  44, 110,  41, 125,  41, // (void 0,n)})\n 125,  59, 114, 101, 116, 117, 114, 110, 123, 115, 101, 116, // };return{set\n  80, 114, 111, 109, 112, 116,  58, 110,  44,  99, 111, 110, // Prompt:n,con\n 102, 105, 114, 109,  84, 114,  97, 110, 115, 105, 116, 105, // firmTransiti\n 111, 110,  84, 111,  58, 101,  44,  97, 112, 112, 101, 110, // onTo:e,appen\n 100,  76, 105, 115, 116, 101, 110, 101, 114,  58, 114,  44, // dListener:r,\n 110, 111, 116, 105, 102, 121,  76, 105, 115, 116, 101, 110, // notifyListen\n 101, 114, 115,  58, 105, 125, 125,  41,  59, 110,  46, 100, // ers:i}});n.d\n 101, 102,  97, 117, 108, 116,  61, 105, 125,  44, 102, 117, // efault=i},fu\n 110,  99, 116, 105, 111, 110,  40, 116,  44, 110,  41, 123, // nction(t,n){\n  34, 117, 115, 101,  32, 115, 116, 114, 105,  99, 116,  34, // \"use strict\"\n  59, 110,  46,  95,  95, 101, 115,  77, 111, 100, 117, 108, // ;n.__esModul\n 101,  61,  33,  48,  59, 110,  46,  99,  97, 110,  85, 115, // e=!0;n.canUs\n 101,  68,  79,  77,  61,  33,  40,  34, 117, 110, 100, 101, // eDOM=!(\"unde\n 102, 105, 110, 101, 100,  34,  61,  61, 116, 121, 112, 101, // fined\"==type\n 111, 102,  32, 119, 105, 110, 100, 111, 119, 124, 124,  33, // of window||!\n 119, 105, 110, 100, 111, 119,  46, 100, 111,  99, 117, 109, // window.docum\n 101, 110, 116, 124, 124,  33, 119, 105, 110, 100, 111, 119, // ent||!window\n  46, 100, 111,  99, 117, 109, 101, 110, 116,  46,  99, 114, // .document.cr\n 101,  97, 116, 101,  69, 108, 101, 109, 101, 110, 116,  41, // eateElement)\n  44, 110,  46,  97, 100, 100,  69, 118, 101, 110, 116,  76, // ,n.addEventL\n 105, 115, 116, 101, 110, 101, 114,  61, 102, 117, 110,  99, // istener=func\n 116, 105, 111, 110,  40, 116,  44, 110,  44, 101,  41, 123, // tion(t,n,e){\n 114, 101, 116, 117, 114, 110,  32, 116,  46,  97, 100, 100, // return t.add\n  69, 118, 101, 110, 116,  76, 105, 115, 116, 101, 110, 101, // EventListene\n 114,  63, 116,  46,  97, 100, 100,  69, 118, 101, 110, 116, // r?t.addEvent\n  76, 105, 115, 116, 101, 110, 101, 114,  40, 110,  44, 101, // Listener(n,e\n  44,  33,  49,  41,  58, 116,  46,  97, 116, 116,  97,  99, // ,!1):t.attac\n 104,  69, 118, 101, 110, 116,  40,  34, 111, 110,  34,  43, // hEvent(\"on\"+\n 110,  44, 101,  41, 125,  44, 110,  46, 114, 101, 109, 111, // n,e)},n.remo\n 118, 101,  69, 118, 101, 110, 116,  76, 105, 115, 116, 101, // veEventListe\n 110, 101, 114,  61, 102, 117, 110,  99, 116, 105, 111, 110, // ner=function\n  40, 116,  44, 110,  44, 101,  41, 123, 114, 101, 116, 117, // (t,n,e){retu\n 114, 110,  32, 116,  46, 114, 101, 109, 111, 118, 101,  69, // rn t.removeE\n 118, 101, 110, 116,  76, 105, 115, 116, 101, 110, 101, 114, // ventListener\n  63, 116,  46, 114, 101, 109, 111, 118, 101,  69, 118, 101, // ?t.removeEve\n 110, 116,  76, 105, 115, 116, 101, 110, 101, 114,  40, 110, // ntListener(n\n  44, 101,  44,  33,  49,  41,  58, 116,  46, 100, 101, 116, // ,e,!1):t.det\n  97,  99, 104,  69, 118, 101, 110, 116,  40,  34, 111, 110, // achEvent(\"on\n  34,  43, 110,  44, 101,  41, 125,  44, 110,  46, 103, 101, // \"+n,e)},n.ge\n 116,  67, 111, 110, 102, 105, 114, 109,  97, 116, 105, 111, // tConfirmatio\n 110,  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, 116, // n=function(t\n  44, 110,  41, 123, 114, 101, 116, 117, 114, 110,  32, 110, // ,n){return n\n  40, 119, 105, 110, 100, 111, 119,  46,  99, 111, 110, 102, // (window.conf\n 105, 114, 109,  40, 116,  41,  41, 125,  44, 110,  46, 115, // irm(t))},n.s\n 117, 112, 112, 111, 114, 116, 115,  72, 105, 115, 116, 111, // upportsHisto\n 114, 121,  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, // ry=function(\n  41, 123, 118,  97, 114,  32, 116,  61, 119, 105, 110, 100, // ){var t=wind\n 111, 119,  46, 110,  97, 118, 105, 103,  97, 116, 111, 114, // ow.navigator\n  46, 117, 115, 101, 114,  65, 103, 101, 110, 116,  59, 114, // .userAgent;r\n 101, 116, 117, 114, 110,  40, 116,  46, 105, 110, 100, 101, // eturn(t.inde\n 120,  79, 102,  40,  34,  65, 110, 100, 114, 111, 105, 100, // xOf(\"Android\n  32,  50,  46,  34,  41,  61,  61,  61,  45,  49,  38,  38, //  2.\")===-1&&\n 116,  46, 105, 110, 100, 101, 120,  79, 102,  40,  34,  65, // t.indexOf(\"A\n 110, 100, 114, 111, 105, 100,  32,  52,  46,  48,  34,  41, // ndroid 4.0\")\n  61,  61,  61,  45,  49, 124, 124, 116,  46, 105, 110, 100, // ===-1||t.ind\n 101, 120,  79, 102,  40,  34,  77, 111,  98, 105, 108, 101, // exOf(\"Mobile\n  32,  83,  97, 102,  97, 114, 105,  34,  41,  61,  61,  61, //  Safari\")===\n  45,  49, 124, 124, 116,  46, 105, 110, 100, 101, 120,  79, // -1||t.indexO\n 102,  40,  34,  67, 104, 114, 111, 109, 101,  34,  41,  33, // f(\"Chrome\")!\n  61,  61,  45,  49, 124, 124, 116,  46, 105, 110, 100, 101, // ==-1||t.inde\n 120,  79, 102,  40,  34,  87, 105, 110, 100, 111, 119, 115, // xOf(\"Windows\n  32,  80, 104, 111, 110, 101,  34,  41,  33,  61,  61,  45, //  Phone\")!==-\n  49,  41,  38,  38,  40, 119, 105, 110, 100, 111, 119,  46, // 1)&&(window.\n 104, 105, 115, 116, 111, 114, 121,  38,  38,  34, 112, 117, // history&&\"pu\n 115, 104,  83, 116,  97, 116, 101,  34, 105, 110,  32, 119, // shState\"in w\n 105, 110, 100, 111, 119,  46, 104, 105, 115, 116, 111, 114, // indow.histor\n 121,  41, 125,  44, 110,  46, 115, 117, 112, 112, 111, 114, // y)},n.suppor\n 116, 115,  80, 111, 112,  83, 116,  97, 116, 101,  79, 110, // tsPopStateOn\n  72,  97, 115, 104,  67, 104,  97, 110, 103, 101,  61, 102, // HashChange=f\n 117, 110,  99, 116, 105, 111, 110,  40,  41, 123, 114, 101, // unction(){re\n 116, 117, 114, 110,  32, 119, 105, 110, 100, 111, 119,  46, // turn window.\n 110,  97, 118, 105, 103,  97, 116, 111, 114,  46, 117, 115, // navigator.us\n 101, 114,  65, 103, 101, 110, 116,  46, 105, 110, 100, 101, // erAgent.inde\n 120,  79, 102,  40,  34,  84, 114, 105, 100, 101, 110, 116, // xOf(\"Trident\n  34,  41,  61,  61,  61,  45,  49, 125,  44, 110,  46, 115, // \")===-1},n.s\n 117, 112, 112, 111, 114, 116, 115,  71, 111,  87, 105, 116, // upportsGoWit\n 104, 111, 117, 116,  82, 101, 108, 111,  97, 100,  85, 115, // houtReloadUs\n 105, 110, 103,  72,  97, 115, 104,  61, 102, 117, 110,  99, // ingHash=func\n 116, 105, 111, 110,  40,  41, 123, 114, 101, 116, 117, 114, // tion(){retur\n 110,  32, 119, 105, 110, 100, 111, 119,  46, 110,  97, 118, // n window.nav\n 105, 103,  97, 116, 111, 114,  46, 117, 115, 101, 114,  65, // igator.userA\n 103, 101, 110, 116,  46, 105, 110, 100, 101, 120,  79, 102, // gent.indexOf\n  40,  34,  70, 105, 114, 101, 102, 111, 120,  34,  41,  61, // (\"Firefox\")=\n  61,  61,  45,  49, 125,  44, 110,  46, 105, 115,  69, 120, // ==-1},n.isEx\n 116, 114,  97, 110, 101, 111, 117, 115,  80, 111, 112, 115, // traneousPops\n 116,  97, 116, 101,  69, 118, 101, 110, 116,  61, 102, 117, // tateEvent=fu\n 110,  99, 116, 105, 111, 110,  40, 116,  41, 123, 114, 101, // nction(t){re\n 116, 117, 114, 110,  32, 118, 111, 105, 100,  32,  48,  61, // turn void 0=\n  61,  61, 116,  46, 115, 116,  97, 116, 101,  38,  38, 110, // ==t.state&&n\n  97, 118, 105, 103,  97, 116, 111, 114,  46, 117, 115, 101, // avigator.use\n 114,  65, 103, 101, 110, 116,  46, 105, 110, 100, 101, 120, // rAgent.index\n  79, 102,  40,  34,  67, 114, 105,  79,  83,  34,  41,  61, // Of(\"CriOS\")=\n  61,  61,  45,  49, 125, 125,  44, 102, 117, 110,  99, 116, // ==-1}},funct\n 105, 111, 110,  40, 116,  44, 110,  44, 101,  41, 123,  34, // ion(t,n,e){\"\n 117, 115, 101,  32, 115, 116, 114, 105,  99, 116,  34,  59, // use strict\";\n 118,  97, 114,  32, 111,  61, 102, 117, 110,  99, 116, 105, // var o=functi\n 111, 110,  40, 116,  44, 110,  44, 101,  44, 111,  44, 114, // on(t,n,e,o,r\n  44, 105,  44,  97,  44,  99,  41, 123, 105, 102,  40,  33, // ,i,a,c){if(!\n 116,  41, 123, 118,  97, 114,  32, 117,  59, 105, 102,  40, // t){var u;if(\n 118, 111, 105, 100,  32,  48,  61,  61,  61, 110,  41, 117, // void 0===n)u\n  61, 110, 101, 119,  32,  69, 114, 114, 111, 114,  40,  34, // =new Error(\"\n  77, 105, 110, 105, 102, 105, 101, 100,  32, 101, 120,  99, // Minified exc\n 101, 112, 116, 105, 111, 110,  32, 111,  99,  99, 117, 114, // eption occur\n 114, 101, 100,  59,  32, 117, 115, 101,  32, 116, 104, 101, // red; use the\n  32, 110, 111, 110,  45, 109, 105, 110, 105, 102, 105, 101, //  non-minifie\n 100,  32, 100, 101, 118,  32, 101, 110, 118, 105, 114, 111, // d dev enviro\n 110, 109, 101, 110, 116,  32, 102, 111, 114,  32, 116, 104, // nment for th\n 101,  32, 102, 117, 108, 108,  32, 101, 114, 114, 111, 114, // e full error\n  32, 109, 101, 115, 115,  97, 103, 101,  32,  97, 110, 100, //  message and\n  32,  97, 100, 100, 105, 116, 105, 111, 110,  97, 108,  32, //  additional \n 104, 101, 108, 112, 102, 117, 108,  32, 119,  97, 114, 110, // helpful warn\n 105, 110, 103, 115,  46,  34,  41,  59, 101, 108, 115, 101, // ings.\");else\n 123, 118,  97, 114,  32, 115,  61,  91, 101,  44, 111,  44, // {var s=[e,o,\n 114,  44, 105,  44,  97,  44,  99,  93,  44, 102,  61,  48, // r,i,a,c],f=0\n  59, 117,  61, 110, 101, 119,  32,  69, 114, 114, 111, 114, // ;u=new Error\n  40, 110,  46, 114, 101, 112, 108,  97,  99, 101,  40,  47, // (n.replace(/\n  37, 115,  47, 103,  44, 102, 117, 110,  99, 116, 105, 111, // %s/g,functio\n 110,  40,  41, 123, 114, 101, 116, 117, 114, 110,  32, 115, // n(){return s\n  91, 102,  43,  43,  93, 125,  41,  41,  44, 117,  46, 110, // [f++]})),u.n\n  97, 109, 101,  61,  34,  73, 110, 118,  97, 114, 105,  97, // ame=\"Invaria\n 110, 116,  32,  86, 105, 111, 108,  97, 116, 105, 111, 110, // nt Violation\n  34, 125, 116, 104, 114, 111, 119,  32, 117,  46, 102, 114, // \"}throw u.fr\n  97, 109, 101, 115,  84, 111,  80, 111, 112,  61,  49,  44, // amesToPop=1,\n 117, 125, 125,  59, 116,  46, 101, 120, 112, 111, 114, 116, // u}};t.export\n 115,  61, 111, 125,  44, 102, 117, 110,  99, 116, 105, 111, // s=o},functio\n 110,  40, 116,  44, 110,  44, 101,  41, 123,  34, 117, 115, // n(t,n,e){\"us\n 101,  32, 115, 116, 114, 105,  99, 116,  34,  59, 102, 117, // e strict\";fu\n 110,  99, 116, 105, 111, 110,  32, 111,  40, 116,  41, 123, // nction o(t){\n 114, 101, 116, 117, 114, 110,  32, 116,  38,  38, 116,  46, // return t&&t.\n  95,  95, 101, 115,  77, 111, 100, 117, 108, 101,  63, 116, // __esModule?t\n  58, 123, 100, 101, 102,  97, 117, 108, 116,  58, 116, 125, // :{default:t}\n 125, 110,  46,  95,  95, 101, 115,  77, 111, 100, 117, 108, // }n.__esModul\n 101,  61,  33,  48,  59, 118,  97, 114,  32, 114,  61,  40, // e=!0;var r=(\n  34, 102, 117, 110,  99, 116, 105, 111, 110,  34,  61,  61, // \"function\"==\n 116, 121, 112, 101, 111, 102,  32,  83, 121, 109,  98, 111, // typeof Symbo\n 108,  38,  38,  34, 115, 121, 109,  98, 111, 108,  34,  61, // l&&\"symbol\"=\n  61, 116, 121, 112, 101, 111, 102,  32,  83, 121, 109,  98, // =typeof Symb\n 111, 108,  46, 105, 116, 101, 114,  97, 116, 111, 114,  63, // ol.iterator?\n 102, 117, 110,  99, 116, 105, 111, 110,  40, 116,  41, 123, // function(t){\n 114, 101, 116, 117, 114, 110,  32, 116, 121, 112, 101, 111, // return typeo\n 102,  32, 116, 125,  58, 102, 117, 110,  99, 116, 105, 111, // f t}:functio\n 110,  40, 116,  41, 123, 114, 101, 116, 117, 114, 110,  32, // n(t){return \n 116,  38,  38,  34, 102, 117, 110,  99, 116, 105, 111, 110, // t&&\"function\n  34,  61,  61, 116, 121, 112, 101, 111, 102,  32,  83, 121, // \"==typeof Sy\n 109,  98, 111, 108,  38,  38, 116,  46,  99, 111, 110, 115, // mbol&&t.cons\n 116, 114, 117,  99, 116, 111, 114,  61,  61,  61,  83, 121, // tructor===Sy\n 109,  98, 111, 108,  38,  38, 116,  33,  61,  61,  83, 121, // mbol&&t!==Sy\n 109,  98, 111, 108,  46, 112, 114, 111, 116, 111, 116, 121, // mbol.prototy\n 112, 101,  63,  34, 115, 121, 109,  98, 111, 108,  34,  58, // pe?\"symbol\":\n 116, 121, 112, 101, 111, 102,  32, 116, 125,  44,  79,  98, // typeof t},Ob\n 106, 101,  99, 116,  46,  97, 115, 115, 105, 103, 110, 124, // ject.assign|\n 124, 102, 117, 110,  99, 116, 105, 111, 110,  40, 116,  41, // |function(t)\n 123, 102, 111, 114,  40, 118,  97, 114,  32, 110,  61,  49, // {for(var n=1\n  59, 110,  60,  97, 114, 103, 117, 109, 101, 110, 116, 115, // ;n<arguments\n  46, 108, 101, 110, 103, 116, 104,  59, 110,  43,  43,  41, // .length;n++)\n 123, 118,  97, 114,  32, 101,  61,  97, 114, 103, 117, 109, // {var e=argum\n 101, 110, 116, 115,  91, 110,  93,  59, 102, 111, 114,  40, // ents[n];for(\n 118,  97, 114,  32, 111,  32, 105, 110,  32, 101,  41,  79, // var o in e)O\n  98, 106, 101,  99, 116,  46, 112, 114, 111, 116, 111, 116, // bject.protot\n 121, 112, 101,  46, 104,  97, 115,  79, 119, 110,  80, 114, // ype.hasOwnPr\n 111, 112, 101, 114, 116, 121,  46,  99,  97, 108, 108,  40, // operty.call(\n 101,  44, 111,  41,  38,  38,  40, 116,  91, 111,  93,  61, // e,o)&&(t[o]=\n 101,  91, 111,  93,  41, 125, 114, 101, 116, 117, 114, 110, // e[o])}return\n  32, 116, 125,  41,  44, 105,  61, 101,  40,  51,  41,  44, //  t}),i=e(3),\n  97,  61,  40, 111,  40, 105,  41,  44, 101,  40,  54,  41, // a=(o(i),e(6)\n  41,  44,  99,  61, 111,  40,  97,  41,  44, 117,  61, 101, // ),c=o(a),u=e\n  40,  50,  41,  44, 115,  61, 101,  40,  49,  41,  44, 102, // (2),s=e(1),f\n  61, 101,  40,  52,  41,  44, 108,  61, 111,  40, 102,  41, // =e(4),l=o(f)\n  44, 100,  61, 101,  40,  53,  41,  44, 104,  61,  34, 112, // ,d=e(5),h=\"p\n 111, 112, 115, 116,  97, 116, 101,  34,  44, 118,  61,  34, // opstate\",v=\"\n 104,  97, 115, 104,  99, 104,  97, 110, 103, 101,  34,  44, // hashchange\",\n 112,  61, 102, 117, 110,  99, 116, 105, 111, 110,  40,  41, // p=function()\n 123, 116, 114, 121, 123, 114, 101, 116, 117, 114, 110,  32, // {try{return \n 119, 105, 110, 100, 111, 119,  46, 104, 105, 115, 116, 111, // window.histo\n 114, 121,  46, 115, 116,  97, 116, 101, 124, 124, 123, 125, // ry.state||{}\n 125,  99,  97, 116,  99, 104,  40, 116,  41, 123, 114, 101, // }catch(t){re\n 116, 117, 114, 110, 123, 125, 125, 125,  44, 121,  61, 102, // turn{}}},y=f\n 117, 110,  99, 116, 105, 111, 110,  40,  41, 123, 118,  97, // unction(){va\n 114,  32, 116,  61,  97, 114, 103, 117, 109, 101, 110, 116, // r t=argument\n 115,  46, 108, 101, 110, 103, 116, 104,  62,  48,  38,  38, // s.length>0&&\n 118, 111, 105, 100,  32,  48,  33,  61,  61,  97, 114, 103, // void 0!==arg\n 117, 109, 101, 110, 116, 115,  91,  48,  93,  63,  97, 114, // uments[0]?ar\n 103, 117, 109, 101, 110, 116, 115,  91,  48,  93,  58, 123, // guments[0]:{\n 125,  59, 100,  46,  99,  97, 110,  85, 115, 101,  68,  79, // };d.canUseDO\n  77,  63, 118, 111, 105, 100,  32,  48,  58,  40,  48,  44, // M?void 0:(0,\n  99,  46, 100, 101, 102,  97, 117, 108, 116,  41,  40,  33, // c.default)(!\n  49,  41,  59, 118,  97, 114,  32, 110,  61, 119, 105, 110, // 1);var n=win\n 100, 111, 119,  46, 104, 105, 115, 116, 111, 114, 121,  44, // dow.history,\n 101,  61,  40,  48,  44, 100,  46, 115, 117, 112, 112, 111, // e=(0,d.suppo\n 114, 116, 115,  72, 105, 115, 116, 111, 114, 121,  41,  40, // rtsHistory)(\n  41,  44, 111,  61,  33,  40,  48,  44, 100,  46, 115, 117, // ),o=!(0,d.su\n 112, 112, 111, 114, 116, 115,  80, 111, 112,  83, 116,  97, // pportsPopSta\n 116, 101,  79, 110,  72,  97, 115, 104,  67, 104,  97, 110, // teOnHashChan\n 103, 101,  41,  40,  41,  44, 105,  61, 116,  46, 102, 111, // ge)(),i=t.fo\n 114,  99, 101,  82, 101, 102, 114, 101, 115, 104,  44,  97, // rceRefresh,a\n  61, 118, 111, 105, 100,  32,  48,  33,  61,  61, 105,  38, // =void 0!==i&\n  38, 105,  44, 102,  61, 116,  46, 103, 101, 116,  85, 115, // &i,f=t.getUs\n 101, 114,  67, 111, 110, 102, 105, 114, 109,  97, 116, 105, // erConfirmati\n 111, 110,  44, 121,  61, 118, 111, 105, 100,  32,  48,  61, // on,y=void 0=\n  61,  61, 102,  63, 100,  46, 103, 101, 116,  67, 111, 110, // ==f?d.getCon\n 102, 105, 114, 109,  97, 116, 105, 111, 110,  58, 102,  44, // firmation:f,\n 103,  61, 116,  46, 107, 101, 121,  76, 101, 110, 103, 116, // g=t.keyLengt\n 104,  44, 109,  61, 118, 111, 105, 100,  32,  48,  61,  61, // h,m=void 0==\n  61, 103,  63,  54,  58, 103,  44, 119,  61, 116,  46,  98, // =g?6:g,w=t.b\n  97, 115, 101, 110,  97, 109, 101,  63,  40,  48,  44, 115, // asename?(0,s\n  46, 115, 116, 114, 105, 112,  84, 114,  97, 105, 108, 105, // .stripTraili\n 110, 103,  83, 108,  97, 115, 104,  41,  40,  40,  48,  44, // ngSlash)((0,\n 115,  46,  97, 100, 100,  76, 101,  97, 100, 105, 110, 103, // s.addLeading\n  83, 108,  97, 115, 104,  41,  40, 116,  46,  98,  97, 115, // Slash)(t.bas\n 101, 110,  97, 109, 101,  41,  41,  58,  34,  34,  44,  80, // ename)):\"\",P\n  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, 116,  41, // =function(t)\n 123, 118,  97, 114,  32, 110,  61, 116, 124, 124, 123, 125, // {var n=t||{}\n  44, 101,  61, 110,  46, 107, 101, 121,  44, 111,  61, 110, // ,e=n.key,o=n\n  46, 115, 116,  97, 116, 101,  44, 105,  61, 119, 105, 110, // .state,i=win\n 100, 111, 119,  46, 108, 111,  99,  97, 116, 105, 111, 110, // dow.location\n  44,  97,  61, 105,  46, 112,  97, 116, 104, 110,  97, 109, // ,a=i.pathnam\n 101,  44,  99,  61, 105,  46, 115, 101,  97, 114,  99, 104, // e,c=i.search\n  44, 117,  61, 105,  46, 104,  97, 115, 104,  44, 102,  61, // ,u=i.hash,f=\n  97,  43,  99,  43, 117,  59, 114, 101, 116, 117, 114, 110, // a+c+u;return\n  32, 119,  38,  38,  40, 102,  61,  40,  48,  44, 115,  46, //  w&&(f=(0,s.\n 115, 116, 114, 105, 112,  80, 114, 101, 102, 105, 120,  41, // stripPrefix)\n  40, 102,  44, 119,  41,  41,  44, 114,  40, 123, 125,  44, // (f,w)),r({},\n  40,  48,  44, 115,  46, 112,  97, 114, 115, 101,  80,  97, // (0,s.parsePa\n 116, 104,  41,  40, 102,  41,  44, 123, 115, 116,  97, 116, // th)(f),{stat\n 101,  58, 111,  44, 107, 101, 121,  58, 101, 125,  41, 125, // e:o,key:e})}\n  44,  98,  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, // ,b=function(\n  41, 123, 114, 101, 116, 117, 114, 110,  32,  77,  97, 116, // ){return Mat\n 104,  46, 114,  97, 110, 100, 111, 109,  40,  41,  46, 116, // h.random().t\n 111,  83, 116, 114, 105, 110, 103,  40,  51,  54,  41,  46, // oString(36).\n 115, 117,  98, 115, 116, 114,  40,  50,  44, 109,  41, 125, // substr(2,m)}\n  44,  79,  61,  40,  48,  44, 108,  46, 100, 101, 102,  97, // ,O=(0,l.defa\n 117, 108, 116,  41,  40,  41,  44, 120,  61, 102, 117, 110, // ult)(),x=fun\n  99, 116, 105, 111, 110,  40, 116,  41, 123, 114,  40,  71, // ction(t){r(G\n  44, 116,  41,  44,  71,  46, 108, 101, 110, 103, 116, 104, // ,t),G.length\n  61, 110,  46, 108, 101, 110, 103, 116, 104,  44,  79,  46, // =n.length,O.\n 110, 111, 116, 105, 102, 121,  76, 105, 115, 116, 101, 110, // notifyListen\n 101, 114, 115,  40,  71,  46, 108, 111,  99,  97, 116, 105, // ers(G.locati\n 111, 110,  44,  71,  46,  97,  99, 116, 105, 111, 110,  41, // on,G.action)\n 125,  44,  76,  61, 102, 117, 110,  99, 116, 105, 111, 110, // },L=function\n  40, 116,  41, 123,  40,  48,  44, 100,  46, 105, 115,  69, // (t){(0,d.isE\n 120, 116, 114,  97, 110, 101, 111, 117, 115,  80, 111, 112, // xtraneousPop\n 115, 116,  97, 116, 101,  69, 118, 101, 110, 116,  41,  40, // stateEvent)(\n 116,  41, 124, 124,  65,  40,  80,  40, 116,  46, 115, 116, // t)||A(P(t.st\n  97, 116, 101,  41,  41, 125,  44,  83,  61, 102, 117, 110, // ate))},S=fun\n  99, 116, 105, 111, 110,  40,  41, 123,  65,  40,  80,  40, // ction(){A(P(\n 112,  40,  41,  41,  41, 125,  44,  69,  61,  33,  49,  44, // p()))},E=!1,\n  65,  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, 116, // A=function(t\n  41, 123, 105, 102,  40,  69,  41,  69,  61,  33,  49,  44, // ){if(E)E=!1,\n 120,  40,  41,  59, 101, 108, 115, 101, 123, 118,  97, 114, // x();else{var\n  32, 110,  61,  34,  80,  79,  80,  34,  59,  79,  46,  99, //  n=\"POP\";O.c\n 111, 110, 102, 105, 114, 109,  84, 114,  97, 110, 115, 105, // onfirmTransi\n 116, 105, 111, 110,  84, 111,  40, 116,  44, 110,  44, 121, // tionTo(t,n,y\n  44, 102, 117, 110,  99, 116, 105, 111, 110,  40, 101,  41, // ,function(e)\n 123, 101,  63, 120,  40, 123,  97,  99, 116, 105, 111, 110, // {e?x({action\n  58, 110,  44, 108, 111,  99,  97, 116, 105, 111, 110,  58, // :n,location:\n 116, 125,  41,  58,  95,  40, 116,  41, 125,  41, 125, 125, // t}):_(t)})}}\n  44,  95,  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, // ,_=function(\n 116,  41, 123, 118,  97, 114,  32, 110,  61,  71,  46, 108, // t){var n=G.l\n 111,  99,  97, 116, 105, 111, 110,  44, 101,  61,  77,  46, // ocation,e=M.\n 105, 110, 100, 101, 120,  79, 102,  40, 110,  46, 107, 101, // indexOf(n.ke\n 121,  41,  59, 101,  61,  61,  61,  45,  49,  38,  38,  40, // y);e===-1&&(\n 101,  61,  48,  41,  59, 118,  97, 114,  32, 111,  61,  77, // e=0);var o=M\n  46, 105, 110, 100, 101, 120,  79, 102,  40, 116,  46, 107, // .indexOf(t.k\n 101, 121,  41,  59, 111,  61,  61,  61,  45,  49,  38,  38, // ey);o===-1&&\n  40, 111,  61,  48,  41,  59, 118,  97, 114,  32, 114,  61, // (o=0);var r=\n 101,  45, 111,  59, 114,  38,  38,  40,  69,  61,  33,  48, // e-o;r&&(E=!0\n  44,  67,  40, 114,  41,  41, 125,  44, 107,  61,  80,  40, // ,C(r))},k=P(\n 112,  40,  41,  41,  44,  77,  61,  91, 107,  46, 107, 101, // p()),M=[k.ke\n 121,  93,  44,  84,  61, 102, 117, 110,  99, 116, 105, 111, // y],T=functio\n 110,  40, 116,  41, 123, 114, 101, 116, 117, 114, 110,  32, // n(t){return \n 119,  43,  40,  48,  44, 115,  46,  99, 114, 101,  97, 116, // w+(0,s.creat\n 101,  80,  97, 116, 104,  41,  40, 116,  41, 125,  44,  72, // ePath)(t)},H\n  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, 116,  44, // =function(t,\n 111,  41, 123, 118,  97, 114,  32, 114,  61,  34,  80,  85, // o){var r=\"PU\n  83,  72,  34,  44, 105,  61,  40,  48,  44, 117,  46,  99, // SH\",i=(0,u.c\n 114, 101,  97, 116, 101,  76, 111,  99,  97, 116, 105, 111, // reateLocatio\n 110,  41,  40, 116,  44, 111,  44,  98,  40,  41,  44,  71, // n)(t,o,b(),G\n  46, 108, 111,  99,  97, 116, 105, 111, 110,  41,  59,  79, // .location);O\n  46,  99, 111, 110, 102, 105, 114, 109,  84, 114,  97, 110, // .confirmTran\n 115, 105, 116, 105, 111, 110,  84, 111,  40, 105,  44, 114, // sitionTo(i,r\n  44, 121,  44, 102, 117, 110,  99, 116, 105, 111, 110,  40, // ,y,function(\n 116,  41, 123, 105, 102,  40, 116,  41, 123, 118,  97, 114, // t){if(t){var\n  32, 111,  61,  84,  40, 105,  41,  44,  99,  61, 105,  46, //  o=T(i),c=i.\n 107, 101, 121,  44, 117,  61, 105,  46, 115, 116,  97, 116, // key,u=i.stat\n 101,  59, 105, 102,  40, 101,  41, 105, 102,  40, 110,  46, // e;if(e)if(n.\n 112, 117, 115, 104,  83, 116,  97, 116, 101,  40, 123, 107, // pushState({k\n 101, 121,  58,  99,  44, 115, 116,  97, 116, 101,  58, 117, // ey:c,state:u\n 125,  44, 110, 117, 108, 108,  44, 111,  41,  44,  97,  41, // },null,o),a)\n 119, 105, 110, 100, 111, 119,  46, 108, 111,  99,  97, 116, // window.locat\n 105, 111, 110,  46, 104, 114, 101, 102,  61, 111,  59, 101, // ion.href=o;e\n 108, 115, 101, 123, 118,  97, 114,  32, 115,  61,  77,  46, // lse{var s=M.\n 105, 110, 100, 101, 120,  79, 102,  40,  71,  46, 108, 111, // indexOf(G.lo\n  99,  97, 116, 105, 111, 110,  46, 107, 101, 121,  41,  44, // cation.key),\n 102,  61,  77,  46, 115, 108, 105,  99, 101,  40,  48,  44, // f=M.slice(0,\n 115,  61,  61,  61,  45,  49,  63,  48,  58, 115,  43,  49, // s===-1?0:s+1\n  41,  59, 102,  46, 112, 117, 115, 104,  40, 105,  46, 107, // );f.push(i.k\n 101, 121,  41,  44,  77,  61, 102,  44, 120,  40, 123,  97, // ey),M=f,x({a\n  99, 116, 105, 111, 110,  58, 114,  44, 108, 111,  99,  97, // ction:r,loca\n 116, 105, 111, 110,  58, 105, 125,  41, 125, 101, 108, 115, // tion:i})}els\n 101,  32, 119, 105, 110, 100, 111, 119,  46, 108, 111,  99, // e window.loc\n  97, 116, 105, 111, 110,  46, 104, 114, 101, 102,  61, 111, // ation.href=o\n 125, 125,  41, 125,  44, 106,  61, 102, 117, 110,  99, 116, // }})},j=funct\n 105, 111, 110,  40, 116,  44, 111,  41, 123, 118,  97, 114, // ion(t,o){var\n  32, 114,  61,  34,  82,  69,  80,  76,  65,  67,  69,  34, //  r=\"REPLACE\"\n  44, 105,  61,  40,  48,  44, 117,  46,  99, 114, 101,  97, // ,i=(0,u.crea\n 116, 101,  76, 111,  99,  97, 116, 105, 111, 110,  41,  40, // teLocation)(\n 116,  44, 111,  44,  98,  40,  41,  44,  71,  46, 108, 111, // t,o,b(),G.lo\n  99,  97, 116, 105, 111, 110,  41,  59,  79,  46,  99, 111, // cation);O.co\n 110, 102, 105, 114, 109,  84, 114,  97, 110, 115, 105, 116, // nfirmTransit\n 105, 111, 110,  84, 111,  40, 105,  44, 114,  44, 121,  44, // ionTo(i,r,y,\n 102, 117, 110,  99, 116, 105, 111, 110,  40, 116,  41, 123, // function(t){\n 105, 102,  40, 116,  41, 123, 118,  97, 114,  32, 111,  61, // if(t){var o=\n  84,  40, 105,  41,  44,  99,  61, 105,  46, 107, 101, 121, // T(i),c=i.key\n  44, 117,  61, 105,  46, 115, 116,  97, 116, 101,  59, 105, // ,u=i.state;i\n 102,  40, 101,  41, 105, 102,  40, 110,  46, 114, 101, 112, // f(e)if(n.rep\n 108,  97,  99, 101,  83, 116,  97, 116, 101,  40, 123, 107, // laceState({k\n 101, 121,  58,  99,  44, 115, 116,  97, 116, 101,  58, 117, // ey:c,state:u\n 125,  44, 110, 117, 108, 108,  44, 111,  41,  44,  97,  41, // },null,o),a)\n 119, 105, 110, 100, 111, 119,  46, 108, 111,  99,  97, 116, // window.locat\n 105, 111, 110,  46, 114, 101, 112, 108,  97,  99, 101,  40, // ion.replace(\n 111,  41,  59, 101, 108, 115, 101, 123, 118,  97, 114,  32, // o);else{var \n 115,  61,  77,  46, 105, 110, 100, 101, 120,  79, 102,  40, // s=M.indexOf(\n  71,  46, 108, 111,  99,  97, 116, 105, 111, 110,  46, 107, // G.location.k\n 101, 121,  41,  59, 115,  33,  61,  61,  45,  49,  38,  38, // ey);s!==-1&&\n  40,  77,  91, 115,  93,  61, 105,  46, 107, 101, 121,  41, // (M[s]=i.key)\n  44, 120,  40, 123,  97,  99, 116, 105, 111, 110,  58, 114, // ,x({action:r\n  44, 108, 111,  99,  97, 116, 105, 111, 110,  58, 105, 125, // ,location:i}\n  41, 125, 101, 108, 115, 101,  32, 119, 105, 110, 100, 111, // )}else windo\n 119,  46, 108, 111,  99,  97, 116, 105, 111, 110,  46, 114, // w.location.r\n 101, 112, 108,  97,  99, 101,  40, 111,  41, 125, 125,  41, // eplace(o)}})\n 125,  44,  67,  61, 102, 117, 110,  99, 116, 105, 111, 110, // },C=function\n  40, 116,  41, 123, 110,  46, 103, 111,  40, 116,  41, 125, // (t){n.go(t)}\n  44,  85,  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, // ,U=function(\n  41, 123, 114, 101, 116, 117, 114, 110,  32,  67,  40,  45, // ){return C(-\n  49,  41, 125,  44,  82,  61, 102, 117, 110,  99, 116, 105, // 1)},R=functi\n 111, 110,  40,  41, 123, 114, 101, 116, 117, 114, 110,  32, // on(){return \n  67,  40,  49,  41, 125,  44,  73,  61,  48,  44, 113,  61, // C(1)},I=0,q=\n 102, 117, 110,  99, 116, 105, 111, 110,  40, 116,  41, 123, // function(t){\n  73,  43,  61, 116,  44,  49,  61,  61,  61,  73,  63,  40, // I+=t,1===I?(\n  40,  48,  44, 100,  46,  97, 100, 100,  69, 118, 101, 110, // (0,d.addEven\n 116,  76, 105, 115, 116, 101, 110, 101, 114,  41,  40, 119, // tListener)(w\n 105, 110, 100, 111, 119,  44, 104,  44,  76,  41,  44, 111, // indow,h,L),o\n  38,  38,  40,  48,  44, 100,  46,  97, 100, 100,  69, 118, // &&(0,d.addEv\n 101, 110, 116,  76, 105, 115, 116, 101, 110, 101, 114,  41, // entListener)\n  40, 119, 105, 110, 100, 111, 119,  44, 118,  44,  83,  41, // (window,v,S)\n  41,  58,  48,  61,  61,  61,  73,  38,  38,  40,  40,  48, // ):0===I&&((0\n  44, 100,  46, 114, 101, 109, 111, 118, 101,  69, 118, 101, // ,d.removeEve\n 110, 116,  76, 105, 115, 116, 101, 110, 101, 114,  41,  40, // ntListener)(\n 119, 105, 110, 100, 111, 119,  44, 104,  44,  76,  41,  44, // window,h,L),\n 111,  38,  38,  40,  48,  44, 100,  46, 114, 101, 109, 111, // o&&(0,d.remo\n 118, 101,  69, 118, 101, 110, 116,  76, 105, 115, 116, 101, // veEventListe\n 110, 101, 114,  41,  40, 119, 105, 110, 100, 111, 119,  44, // ner)(window,\n 118,  44,  83,  41,  41, 125,  44,  66,  61,  33,  49,  44, // v,S))},B=!1,\n  70,  61, 102, 117, 110,  99, 116, 105, 111, 110,  40,  41, // F=function()\n 123, 118,  97, 114,  32, 116,  61,  97, 114, 103, 117, 109, // {var t=argum\n 101, 110, 116, 115,  46, 108, 101, 110, 103, 116, 104,  62, // ents.length>\n  48,  38,  38, 118, 111, 105, 100,  32,  48,  33,  61,  61, // 0&&void 0!==\n  97, 114, 103, 117, 109, 101, 110, 116, 115,  91,  48,  93, // arguments[0]\n  38,  38,  97, 114, 103, 117, 109, 101, 110, 116, 115,  91, // &&arguments[\n  48,  93,  44, 110,  61,  79,  46, 115, 101, 116,  80, 114, // 0],n=O.setPr\n 111, 109, 112, 116,  40, 116,  41,  59, 114, 101, 116, 117, // ompt(t);retu\n 114, 110,  32,  66, 124, 124,  40, 113,  40,  49,  41,  44, // rn B||(q(1),\n  66,  61,  33,  48,  41,  44, 102, 117, 110,  99, 116, 105, // B=!0),functi\n 111, 110,  40,  41, 123, 114, 101, 116, 117, 114, 110,  32, // on(){return \n  66,  38,  38,  40,  66,  61,  33,  49,  44, 113,  40,  45, // B&&(B=!1,q(-\n  49,  41,  41,  44, 110,  40,  41, 125, 125,  44,  68,  61, // 1)),n()}},D=\n 102, 117, 110,  99, 116, 105, 111, 110,  40, 116,  41, 123, // function(t){\n 118,  97, 114,  32, 110,  61,  79,  46,  97, 112, 112, 101, // var n=O.appe\n 110, 100,  76, 105, 115, 116, 101, 110, 101, 114,  40, 116, // ndListener(t\n  41,  59, 114, 101, 116, 117, 114, 110,  32, 113,  40,  49, // );return q(1\n  41,  44, 102, 117, 110,  99, 116, 105, 111, 110,  40,  41, // ),function()\n 123, 113,  40,  45,  49,  41,  44, 110,  40,  41, 125, 125, // {q(-1),n()}}\n  44,  71,  61, 123, 108, 101, 110, 103, 116, 104,  58, 110, // ,G={length:n\n  46, 108, 101, 110, 103, 116, 104,  44,  97,  99, 116, 105, // .length,acti\n 111, 110,  58,  34,  80,  79,  80,  34,  44, 108, 111,  99, // on:\"POP\",loc\n  97, 116, 105, 111, 110,  58, 107,  44,  99, 114, 101,  97, // ation:k,crea\n 116, 101,  72, 114, 101, 102,  58,  84,  44, 112, 117, 115, // teHref:T,pus\n 104,  58,  72,  44, 114, 101, 112, 108,  97,  99, 101,  58, // h:H,replace:\n 106,  44, 103, 111,  58,  67,  44, 103, 111,  66,  97,  99, // j,go:C,goBac\n 107,  58,  85,  44, 103, 111,  70, 111, 114, 119,  97, 114, // k:U,goForwar\n 100,  58,  82,  44,  98, 108, 111,  99, 107,  58,  70,  44, // d:R,block:F,\n 108, 105, 115, 116, 101, 110,  58,  68, 125,  59, 114, 101, // listen:D};re\n 116, 117, 114, 110,  32,  71, 125,  59, 110,  46, 100, 101, // turn G};n.de\n 102,  97, 117, 108, 116,  61, 121, 125,  44, 102, 117, 110, // fault=y},fun\n  99, 116, 105, 111, 110,  40, 116,  44, 110,  44, 101,  41, // ction(t,n,e)\n 123,  34, 117, 115, 101,  32, 115, 116, 114, 105,  99, 116, // {\"use strict\n  34,  59, 102, 117, 110,  99, 116, 105, 111, 110,  32, 111, // \";function o\n  40, 116,  41, 123, 114, 101, 116, 117, 114, 110,  32, 116, // (t){return t\n  38,  38, 116,  46,  95,  95, 101, 115,  77, 111, 100, 117, // &&t.__esModu\n 108, 101,  63, 116,  58, 123, 100, 101, 102,  97, 117, 108, // le?t:{defaul\n 116,  58, 116, 125, 125, 110,  46,  95,  95, 101, 115,  77, // t:t}}n.__esM\n 111, 100, 117, 108, 101,  61,  33,  48,  59, 118,  97, 114, // odule=!0;var\n  32, 114,  61,  79,  98, 106, 101,  99, 116,  46,  97, 115, //  r=Object.as\n 115, 105, 103, 110, 124, 124, 102, 117, 110,  99, 116, 105, // sign||functi\n 111, 110,  40, 116,  41, 123, 102, 111, 114,  40, 118,  97, // on(t){for(va\n 114,  32, 110,  61,  49,  59, 110,  60,  97, 114, 103, 117, // r n=1;n<argu\n 109, 101, 110, 116, 115,  46, 108, 101, 110, 103, 116, 104, // ments.length\n  59, 110,  43,  43,  41, 123, 118,  97, 114,  32, 101,  61, // ;n++){var e=\n  97, 114, 103, 117, 109, 101, 110, 116, 115,  91, 110,  93, // arguments[n]\n  59, 102, 111, 114,  40, 118,  97, 114,  32, 111,  32, 105, // ;for(var o i\n 110,  32, 101,  41,  79,  98, 106, 101,  99, 116,  46, 112, // n e)Object.p\n 114, 111, 116, 111, 116, 121, 112, 101,  46, 104,  97, 115, // rototype.has\n  79, 119, 110,  80, 114, 111, 112, 101, 114, 116, 121,  46, // OwnProperty.\n  99,  97, 108, 108,  40, 101,  44, 111,  41,  38,  38,  40, // call(e,o)&&(\n 116,  91, 111,  93,  61, 101,  91, 111,  93,  41, 125, 114, // t[o]=e[o])}r\n 101, 116, 117, 114, 110,  32, 116, 125,  44, 105,  61, 101, // eturn t},i=e\n  40,  51,  41,  44,  97,  61,  40, 111,  40, 105,  41,  44, // (3),a=(o(i),\n 101,  40,  54,  41,  41,  44,  99,  61, 111,  40,  97,  41, // e(6)),c=o(a)\n  44, 117,  61, 101,  40,  50,  41,  44, 115,  61, 101,  40, // ,u=e(2),s=e(\n  49,  41,  44, 102,  61, 101,  40,  52,  41,  44, 108,  61, // 1),f=e(4),l=\n 111,  40, 102,  41,  44, 100,  61, 101,  40,  53,  41,  44, // o(f),d=e(5),\n 104,  61,  34, 104,  97, 115, 104,  99, 104,  97, 110, 103, // h=\"hashchang\n 101,  34,  44, 118,  61, 123, 104,  97, 115, 104,  98,  97, // e\",v={hashba\n 110, 103,  58, 123, 101, 110,  99, 111, 100, 101,  80,  97, // ng:{encodePa\n 116, 104,  58, 102, 117, 110,  99, 116, 105, 111, 110,  40, // th:function(\n 116,  41, 123, 114, 101, 116, 117, 114, 110,  34,  33,  34, // t){return\"!\"\n  61,  61,  61, 116,  46,  99, 104,  97, 114,  65, 116,  40, // ===t.charAt(\n  48,  41,  63, 116,  58,  34,  33,  47,  34,  43,  40,  48, // 0)?t:\"!/\"+(0\n  44, 115,  46, 115, 116, 114, 105, 112,  76, 101,  97, 100, // ,s.stripLead\n 105, 110, 103,  83, 108,  97, 115, 104,  41,  40, 116,  41, // ingSlash)(t)\n 125,  44, 100, 101,  99, 111, 100, 101,  80,  97, 116, 104, // },decodePath\n  58, 102, 117, 110,  99, 116, 105, 111, 110,  40, 116,  41, // :function(t)\n 123, 114, 101, 116, 117, 114, 110,  34,  33,  34,  61,  61, // {return\"!\"==\n  61, 116,  46,  99, 104,  97, 114,  65, 116,  40,  48,  41, // =t.charAt(0)\n  63, 116,  46, 115, 117,  98, 115, 116, 114,  40,  49,  41, // ?t.substr(1)\n  58, 116, 125, 125,  44, 110, 111, 115, 108,  97, 115, 104, // :t}},noslash\n  58, 123, 101, 110,  99, 111, 100, 101,  80,  97, 116, 104, // :{encodePath\n  58, 115,  46, 115, 116, 114, 105, 112,  76, 101,  97, 100, // :s.stripLead\n 105, 110, 103,  83, 108,  97, 115, 104,  44, 100, 101,  99, // ingSlash,dec\n 111, 100, 101,  80,  97, 116, 104,  58, 115,  46,  97, 100, // odePath:s.ad\n 100,  76, 101,  97, 100, 105, 110, 103,  83, 108,  97, 115, // dLeadingSlas\n 104, 125,  44, 115, 108,  97, 115, 104,  58, 123, 101, 110, // h},slash:{en\n  99, 111, 100, 101,  80,  97, 116, 104,  58, 115,  46,  97, // codePath:s.a\n 100, 100,  76, 101,  97, 100, 105, 110, 103,  83, 108,  97, // ddLeadingSla\n 115, 104,  44, 100, 101,  99, 111, 100, 101,  80,  97, 116, // sh,decodePat\n 104,  58, 115,  46,  97, 100, 100,  76, 101,  97, 100, 105, // h:s.addLeadi\n 110, 103,  83, 108,  97, 115, 104, 125, 125,  44, 112,  61, // ngSlash}},p=\n 102, 117, 110,  99, 116, 105, 111, 110,  40,  41, 123, 118, // function(){v\n  97, 114,  32, 116,  61, 119, 105, 110, 100, 111, 119,  46, // ar t=window.\n 108, 111,  99,  97, 116, 105, 111, 110,  46, 104, 114, 101, // location.hre\n 102,  44, 110,  61, 116,  46, 105, 110, 100, 101, 120,  79, // f,n=t.indexO\n 102,  40,  34,  35,  34,  41,  59, 114, 101, 116, 117, 114, // f(\"#\");retur\n 110,  32, 110,  61,  61,  61,  45,  49,  63,  34,  34,  58, // n n===-1?\"\":\n 116,  46, 115, 117,  98, 115, 116, 114, 105, 110, 103,  40, // t.substring(\n 110,  43,  49,  41, 125,  44, 121,  61, 102, 117, 110,  99, // n+1)},y=func\n 116, 105, 111, 110,  40, 116,  41, 123, 114, 101, 116, 117, // tion(t){retu\n 114, 110,  32, 119, 105, 110, 100, 111, 119,  46, 108, 111, // rn window.lo\n  99,  97, 116, 105, 111, 110,  46, 104,  97, 115, 104,  61, // cation.hash=\n 116, 125,  44, 103,  61, 102, 117, 110,  99, 116, 105, 111, // t},g=functio\n 110,  40, 116,  41, 123, 118,  97, 114,  32, 110,  61, 119, // n(t){var n=w\n 105, 110, 100, 111, 119,  46, 108, 111,  99,  97, 116, 105, // indow.locati\n 111, 110,  46, 104, 114, 101, 102,  46, 105, 110, 100, 101, // on.href.inde\n 120,  79, 102,  40,  34,  35,  34,  41,  59, 119, 105, 110, // xOf(\"#\");win\n 100, 111, 119,  46, 108, 111,  99,  97, 116, 105, 111, 110, // dow.location\n  46, 114, 101, 112, 108,  97,  99, 101,  40, 119, 105, 110, // .replace(win\n 100, 111, 119,  46, 108, 111,  99,  97, 116, 105, 111, 110, // dow.location\n  46, 104, 114, 101, 102,  46, 115, 108, 105,  99, 101,  40, // .href.slice(\n  48,  44, 110,  62,  61,  48,  63, 110,  58,  48,  41,  43, // 0,n>=0?n:0)+\n  34,  35,  34,  43, 116,  41, 125,  44, 109,  61, 102, 117, // \"#\"+t)},m=fu\n 110,  99, 116, 105, 111, 110,  40,  41, 123, 118,  97, 114, // nction(){var\n  32, 116,  61,  97, 114, 103, 117, 109, 101, 110, 116, 115, //  t=arguments\n  46, 108, 101, 110, 103, 116, 104,  62,  48,  38,  38, 118, // .length>0&&v\n 111, 105, 100,  32,  48,  33,  61,  61,  97, 114, 103, 117, // oid 0!==argu\n 109, 101, 110, 116, 115,  91,  48,  93,  63,  97, 114, 103, // ments[0]?arg\n 117, 109, 101, 110, 116, 115,  91,  48,  93,  58, 123, 125, // uments[0]:{}\n  59, 100,  46,  99,  97, 110,  85, 115, 101,  68,  79,  77, // ;d.canUseDOM\n  63, 118, 111, 105, 100,  32,  48,  58,  40,  48,  44,  99, // ?void 0:(0,c\n  46, 100, 101, 102,  97, 117, 108, 116,  41,  40,  33,  49, // .default)(!1\n  41,  59, 118,  97, 114,  32, 110,  61, 119, 105, 110, 100, // );var n=wind\n 111, 119,  46, 104, 105, 115, 116, 111, 114, 121,  44, 101, // ow.history,e\n  61,  40,  40,  48,  44, 100,  46, 115, 117, 112, 112, 111, // =((0,d.suppo\n 114, 116, 115,  71, 111,  87, 105, 116, 104, 111, 117, 116, // rtsGoWithout\n  82, 101, 108, 111,  97, 100,  85, 115, 105, 110, 103,  72, // ReloadUsingH\n  97, 115, 104,  41,  40,  41,  44, 116,  46, 103, 101, 116, // ash)(),t.get\n  85, 115, 101, 114,  67, 111, 110, 102, 105, 114, 109,  97, // UserConfirma\n 116, 105, 111, 110,  41,  44, 111,  61, 118, 111, 105, 100, // tion),o=void\n  32,  48,  61,  61,  61, 101,  63, 100,  46, 103, 101, 116, //  0===e?d.get\n  67, 111, 110, 102, 105, 114, 109,  97, 116, 105, 111, 110, // Confirmation\n  58, 101,  44, 105,  61, 116,  46, 104,  97, 115, 104,  84, // :e,i=t.hashT\n 121, 112, 101,  44,  97,  61, 118, 111, 105, 100,  32,  48, // ype,a=void 0\n  61,  61,  61, 105,  63,  34, 115, 108,  97, 115, 104,  34, // ===i?\"slash\"\n  58, 105,  44, 102,  61, 116,  46,  98,  97, 115, 101, 110, // :i,f=t.basen\n  97, 109, 101,  63,  40,  48,  44, 115,  46, 115, 116, 114, // ame?(0,s.str\n 105, 112,  84, 114,  97, 105, 108, 105, 110, 103,  83, 108, // ipTrailingSl\n  97, 115, 104,  41,  40,  40,  48,  44, 115,  46,  97, 100, // ash)((0,s.ad\n 100,  76, 101,  97, 100, 105, 110, 103,  83, 108,  97, 115, // dLeadingSlas\n 104,  41,  40, 116,  46,  98,  97, 115, 101, 110,  97, 109, // h)(t.basenam\n 101,  41,  41,  58,  34,  34,  44, 109,  61, 118,  91,  97, // e)):\"\",m=v[a\n  93,  44, 119,  61, 109,  46, 101, 110,  99, 111, 100, 101, // ],w=m.encode\n  80,  97, 116, 104,  44,  80,  61, 109,  46, 100, 101,  99, // Path,P=m.dec\n 111, 100, 101,  80,  97, 116, 104,  44,  98,  61, 102, 117, // odePath,b=fu\n 110,  99, 116, 105, 111, 110,  40,  41, 123, 118,  97, 114, // nction(){var\n  32, 116,  61,  80,  40, 112,  40,  41,  41,  59, 114, 101, //  t=P(p());re\n 116, 117, 114, 110,  32, 102,  38,  38,  40, 116,  61,  40, // turn f&&(t=(\n  48,  44, 115,  46, 115, 116, 114, 105, 112,  80, 114, 101, // 0,s.stripPre\n 102, 105, 120,  41,  40, 116,  44, 102,  41,  41,  44,  40, // fix)(t,f)),(\n  48,  44, 115,  46, 112,  97, 114, 115, 101,  80,  97, 116, // 0,s.parsePat\n 104,  41,  40, 116,  41, 125,  44,  79,  61,  40,  48,  44, // h)(t)},O=(0,\n 108,  46, 100, 101, 102,  97, 117, 108, 116,  41,  40,  41, // l.default)()\n  44, 120,  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, // ,x=function(\n 116,  41, 123, 114,  40,  86,  44, 116,  41,  44,  86,  46, // t){r(V,t),V.\n 108, 101, 110, 103, 116, 104,  61, 110,  46, 108, 101, 110, // length=n.len\n 103, 116, 104,  44,  79,  46, 110, 111, 116, 105, 102, 121, // gth,O.notify\n  76, 105, 115, 116, 101, 110, 101, 114, 115,  40,  86,  46, // Listeners(V.\n 108, 111,  99,  97, 116, 105, 111, 110,  44,  86,  46,  97, // location,V.a\n  99, 116, 105, 111, 110,  41, 125,  44,  76,  61,  33,  49, // ction)},L=!1\n  44,  83,  61, 110, 117, 108, 108,  44,  69,  61, 102, 117, // ,S=null,E=fu\n 110,  99, 116, 105, 111, 110,  40,  41, 123, 118,  97, 114, // nction(){var\n  32, 116,  61, 112,  40,  41,  44, 110,  61, 119,  40, 116, //  t=p(),n=w(t\n  41,  59, 105, 102,  40, 116,  33,  61,  61, 110,  41, 103, // );if(t!==n)g\n  40, 110,  41,  59, 101, 108, 115, 101, 123, 118,  97, 114, // (n);else{var\n  32, 101,  61,  98,  40,  41,  44, 111,  61,  86,  46, 108, //  e=b(),o=V.l\n 111,  99,  97, 116, 105, 111, 110,  59, 105, 102,  40,  33, // ocation;if(!\n  76,  38,  38,  40,  48,  44, 117,  46, 108, 111,  99,  97, // L&&(0,u.loca\n 116, 105, 111, 110, 115,  65, 114, 101,  69, 113, 117,  97, // tionsAreEqua\n 108,  41,  40, 111,  44, 101,  41,  41, 114, 101, 116, 117, // l)(o,e))retu\n 114, 110,  59, 105, 102,  40,  83,  61,  61,  61,  40,  48, // rn;if(S===(0\n  44, 115,  46,  99, 114, 101,  97, 116, 101,  80,  97, 116, // ,s.createPat\n 104,  41,  40, 101,  41,  41, 114, 101, 116, 117, 114, 110, // h)(e))return\n  59,  83,  61, 110, 117, 108, 108,  44,  65,  40, 101,  41, // ;S=null,A(e)\n 125, 125,  44,  65,  61, 102, 117, 110,  99, 116, 105, 111, // }},A=functio\n 110,  40, 116,  41, 123, 105, 102,  40,  76,  41,  76,  61, // n(t){if(L)L=\n  33,  49,  44, 120,  40,  41,  59, 101, 108, 115, 101, 123, // !1,x();else{\n 118,  97, 114,  32, 110,  61,  34,  80,  79,  80,  34,  59, // var n=\"POP\";\n  79,  46,  99, 111, 110, 102, 105, 114, 109,  84, 114,  97, // O.confirmTra\n 110, 115, 105, 116, 105, 111, 110,  84, 111,  40, 116,  44, // nsitionTo(t,\n 110,  44, 111,  44, 102, 117, 110,  99, 116, 105, 111, 110, // n,o,function\n  40, 101,  41, 123, 101,  63, 120,  40, 123,  97,  99, 116, // (e){e?x({act\n 105, 111, 110,  58, 110,  44, 108, 111,  99,  97, 116, 105, // ion:n,locati\n 111, 110,  58, 116, 125,  41,  58,  95,  40, 116,  41, 125, // on:t}):_(t)}\n  41, 125, 125,  44,  95,  61, 102, 117, 110,  99, 116, 105, // )}},_=functi\n 111, 110,  40, 116,  41, 123, 118,  97, 114,  32, 110,  61, // on(t){var n=\n  86,  46, 108, 111,  99,  97, 116, 105, 111, 110,  44, 101, // V.location,e\n  61,  72,  46, 108,  97, 115, 116,  73, 110, 100, 101, 120, // =H.lastIndex\n  79, 102,  40,  40,  48,  44, 115,  46,  99, 114, 101,  97, // Of((0,s.crea\n 116, 101,  80,  97, 116, 104,  41,  40, 110,  41,  41,  59, // tePath)(n));\n 101,  61,  61,  61,  45,  49,  38,  38,  40, 101,  61,  48, // e===-1&&(e=0\n  41,  59, 118,  97, 114,  32, 111,  61,  72,  46, 108,  97, // );var o=H.la\n 115, 116,  73, 110, 100, 101, 120,  79, 102,  40,  40,  48, // stIndexOf((0\n  44, 115,  46,  99, 114, 101,  97, 116, 101,  80,  97, 116, // ,s.createPat\n 104,  41,  40, 116,  41,  41,  59, 111,  61,  61,  61,  45, // h)(t));o===-\n  49,  38,  38,  40, 111,  61,  48,  41,  59, 118,  97, 114, // 1&&(o=0);var\n  32, 114,  61, 101,  45, 111,  59, 114,  38,  38,  40,  76, //  r=e-o;r&&(L\n  61,  33,  48,  44,  82,  40, 114,  41,  41, 125,  44, 107, // =!0,R(r))},k\n  61, 112,  40,  41,  44,  77,  61, 119,  40, 107,  41,  59, // =p(),M=w(k);\n 107,  33,  61,  61,  77,  38,  38, 103,  40,  77,  41,  59, // k!==M&&g(M);\n 118,  97, 114,  32,  84,  61,  98,  40,  41,  44,  72,  61, // var T=b(),H=\n  91,  40,  48,  44, 115,  46,  99, 114, 101,  97, 116, 101, // [(0,s.create\n  80,  97, 116, 104,  41,  40,  84,  41,  93,  44, 106,  61, // Path)(T)],j=\n 102, 117, 110,  99, 116, 105, 111, 110,  40, 116,  41, 123, // function(t){\n 114, 101, 116, 117, 114, 110,  34,  35,  34,  43, 119,  40, // return\"#\"+w(\n 102,  43,  40,  48,  44, 115,  46,  99, 114, 101,  97, 116, // f+(0,s.creat\n 101,  80,  97, 116, 104,  41,  40, 116,  41,  41, 125,  44, // ePath)(t))},\n  67,  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, 116, // C=function(t\n  44, 110,  41, 123, 118,  97, 114,  32, 101,  61,  34,  80, // ,n){var e=\"P\n  85,  83,  72,  34,  44, 114,  61,  40,  48,  44, 117,  46, // USH\",r=(0,u.\n  99, 114, 101,  97, 116, 101,  76, 111,  99,  97, 116, 105, // createLocati\n 111, 110,  41,  40, 116,  44, 118, 111, 105, 100,  32,  48, // on)(t,void 0\n  44, 118, 111, 105, 100,  32,  48,  44,  86,  46, 108, 111, // ,void 0,V.lo\n  99,  97, 116, 105, 111, 110,  41,  59,  79,  46,  99, 111, // cation);O.co\n 110, 102, 105, 114, 109,  84, 114,  97, 110, 115, 105, 116, // nfirmTransit\n 105, 111, 110,  84, 111,  40, 114,  44, 101,  44, 111,  44, // ionTo(r,e,o,\n 102, 117, 110,  99, 116, 105, 111, 110,  40, 116,  41, 123, // function(t){\n 105, 102,  40, 116,  41, 123, 118,  97, 114,  32, 110,  61, // if(t){var n=\n  40,  48,  44, 115,  46,  99, 114, 101,  97, 116, 101,  80, // (0,s.createP\n  97, 116, 104,  41,  40, 114,  41,  44, 111,  61, 119,  40, // ath)(r),o=w(\n 102,  43, 110,  41,  44, 105,  61, 112,  40,  41,  33,  61, // f+n),i=p()!=\n  61, 111,  59, 105, 102,  40, 105,  41, 123,  83,  61, 110, // =o;if(i){S=n\n  44, 121,  40, 111,  41,  59, 118,  97, 114,  32,  97,  61, // ,y(o);var a=\n  72,  46, 108,  97, 115, 116,  73, 110, 100, 101, 120,  79, // H.lastIndexO\n 102,  40,  40,  48,  44, 115,  46,  99, 114, 101,  97, 116, // f((0,s.creat\n 101,  80,  97, 116, 104,  41,  40,  86,  46, 108, 111,  99, // ePath)(V.loc\n  97, 116, 105, 111, 110,  41,  41,  44,  99,  61,  72,  46, // ation)),c=H.\n 115, 108, 105,  99, 101,  40,  48,  44,  97,  61,  61,  61, // slice(0,a===\n  45,  49,  63,  48,  58,  97,  43,  49,  41,  59,  99,  46, // -1?0:a+1);c.\n 112, 117, 115, 104,  40, 110,  41,  44,  72,  61,  99,  44, // push(n),H=c,\n 120,  40, 123,  97,  99, 116, 105, 111, 110,  58, 101,  44, // x({action:e,\n 108, 111,  99,  97, 116, 105, 111, 110,  58, 114, 125,  41, // location:r})\n 125, 101, 108, 115, 101,  32, 120,  40,  41, 125, 125,  41, // }else x()}})\n 125,  44,  85,  61, 102, 117, 110,  99, 116, 105, 111, 110, // },U=function\n  40, 116,  44, 110,  41, 123, 118,  97, 114,  32, 101,  61, // (t,n){var e=\n  34,  82,  69,  80,  76,  65,  67,  69,  34,  44, 114,  61, // \"REPLACE\",r=\n  40,  48,  44, 117,  46,  99, 114, 101,  97, 116, 101,  76, // (0,u.createL\n 111,  99,  97, 116, 105, 111, 110,  41,  40, 116,  44, 118, // ocation)(t,v\n 111, 105, 100,  32,  48,  44, 118, 111, 105, 100,  32,  48, // oid 0,void 0\n  44,  86,  46, 108, 111,  99,  97, 116, 105, 111, 110,  41, // ,V.location)\n  59,  79,  46,  99, 111, 110, 102, 105, 114, 109,  84, 114, // ;O.confirmTr\n  97, 110, 115, 105, 116, 105, 111, 110,  84, 111,  40, 114, // ansitionTo(r\n  44, 101,  44, 111,  44, 102, 117, 110,  99, 116, 105, 111, // ,e,o,functio\n 110,  40, 116,  41, 123, 105, 102,  40, 116,  41, 123, 118, // n(t){if(t){v\n  97, 114,  32, 110,  61,  40,  48,  44, 115,  46,  99, 114, // ar n=(0,s.cr\n 101,  97, 116, 101,  80,  97, 116, 104,  41,  40, 114,  41, // eatePath)(r)\n  44, 111,  61, 119,  40, 102,  43, 110,  41,  44, 105,  61, // ,o=w(f+n),i=\n 112,  40,  41,  33,  61,  61, 111,  59, 105,  38,  38,  40, // p()!==o;i&&(\n  83,  61, 110,  44, 103,  40, 111,  41,  41,  59, 118,  97, // S=n,g(o));va\n 114,  32,  97,  61,  72,  46, 105, 110, 100, 101, 120,  79, // r a=H.indexO\n 102,  40,  40,  48,  44, 115,  46,  99, 114, 101,  97, 116, // f((0,s.creat\n 101,  80,  97, 116, 104,  41,  40,  86,  46, 108, 111,  99, // ePath)(V.loc\n  97, 116, 105, 111, 110,  41,  41,  59,  97,  33,  61,  61, // ation));a!==\n  45,  49,  38,  38,  40,  72,  91,  97,  93,  61, 110,  41, // -1&&(H[a]=n)\n  44, 120,  40, 123,  97,  99, 116, 105, 111, 110,  58, 101, // ,x({action:e\n  44, 108, 111,  99,  97, 116, 105, 111, 110,  58, 114, 125, // ,location:r}\n  41, 125, 125,  41, 125,  44,  82,  61, 102, 117, 110,  99, // )}})},R=func\n 116, 105, 111, 110,  40, 116,  41, 123, 110,  46, 103, 111, // tion(t){n.go\n  40, 116,  41, 125,  44,  73,  61, 102, 117, 110,  99, 116, // (t)},I=funct\n 105, 111, 110,  40,  41, 123, 114, 101, 116, 117, 114, 110, // ion(){return\n  32,  82,  40,  45,  49,  41, 125,  44, 113,  61, 102, 117, //  R(-1)},q=fu\n 110,  99, 116, 105, 111, 110,  40,  41, 123, 114, 101, 116, // nction(){ret\n 117, 114, 110,  32,  82,  40,  49,  41, 125,  44,  66,  61, // urn R(1)},B=\n  48,  44,  70,  61, 102, 117, 110,  99, 116, 105, 111, 110, // 0,F=function\n  40, 116,  41, 123,  66,  43,  61, 116,  44,  49,  61,  61, // (t){B+=t,1==\n  61,  66,  63,  40,  48,  44, 100,  46,  97, 100, 100,  69, // =B?(0,d.addE\n 118, 101, 110, 116,  76, 105, 115, 116, 101, 110, 101, 114, // ventListener\n  41,  40, 119, 105, 110, 100, 111, 119,  44, 104,  44,  69, // )(window,h,E\n  41,  58,  48,  61,  61,  61,  66,  38,  38,  40,  48,  44, // ):0===B&&(0,\n 100,  46, 114, 101, 109, 111, 118, 101,  69, 118, 101, 110, // d.removeEven\n 116,  76, 105, 115, 116, 101, 110, 101, 114,  41,  40, 119, // tListener)(w\n 105, 110, 100, 111, 119,  44, 104,  44,  69,  41, 125,  44, // indow,h,E)},\n  68,  61,  33,  49,  44,  71,  61, 102, 117, 110,  99, 116, // D=!1,G=funct\n 105, 111, 110,  40,  41, 123, 118,  97, 114,  32, 116,  61, // ion(){var t=\n  97, 114, 103, 117, 109, 101, 110, 116, 115,  46, 108, 101, // arguments.le\n 110, 103, 116, 104,  62,  48,  38,  38, 118, 111, 105, 100, // ngth>0&&void\n  32,  48,  33,  61,  61,  97, 114, 103, 117, 109, 101, 110, //  0!==argumen\n 116, 115,  91,  48,  93,  38,  38,  97, 114, 103, 117, 109, // ts[0]&&argum\n 101, 110, 116, 115,  91,  48,  93,  44, 110,  61,  79,  46, // ents[0],n=O.\n 115, 101, 116,  80, 114, 111, 109, 112, 116,  40, 116,  41, // setPrompt(t)\n  59, 114, 101, 116, 117, 114, 110,  32,  68, 124, 124,  40, // ;return D||(\n  70,  40,  49,  41,  44,  68,  61,  33,  48,  41,  44, 102, // F(1),D=!0),f\n 117, 110,  99, 116, 105, 111, 110,  40,  41, 123, 114, 101, // unction(){re\n 116, 117, 114, 110,  32,  68,  38,  38,  40,  68,  61,  33, // turn D&&(D=!\n  49,  44,  70,  40,  45,  49,  41,  41,  44, 110,  40,  41, // 1,F(-1)),n()\n 125, 125,  44,  87,  61, 102, 117, 110,  99, 116, 105, 111, // }},W=functio\n 110,  40, 116,  41, 123, 118,  97, 114,  32, 110,  61,  79, // n(t){var n=O\n  46,  97, 112, 112, 101, 110, 100,  76, 105, 115, 116, 101, // .appendListe\n 110, 101, 114,  40, 116,  41,  59, 114, 101, 116, 117, 114, // ner(t);retur\n 110,  32,  70,  40,  49,  41,  44, 102, 117, 110,  99, 116, // n F(1),funct\n 105, 111, 110,  40,  41, 123,  70,  40,  45,  49,  41,  44, // ion(){F(-1),\n 110,  40,  41, 125, 125,  44,  86,  61, 123, 108, 101, 110, // n()}},V={len\n 103, 116, 104,  58, 110,  46, 108, 101, 110, 103, 116, 104, // gth:n.length\n  44,  97,  99, 116, 105, 111, 110,  58,  34,  80,  79,  80, // ,action:\"POP\n  34,  44, 108, 111,  99,  97, 116, 105, 111, 110,  58,  84, // \",location:T\n  44,  99, 114, 101,  97, 116, 101,  72, 114, 101, 102,  58, // ,createHref:\n 106,  44, 112, 117, 115, 104,  58,  67,  44, 114, 101, 112, // j,push:C,rep\n 108,  97,  99, 101,  58,  85,  44, 103, 111,  58,  82,  44, // lace:U,go:R,\n 103, 111,  66,  97,  99, 107,  58,  73,  44, 103, 111,  70, // goBack:I,goF\n 111, 114, 119,  97, 114, 100,  58, 113,  44,  98, 108, 111, // orward:q,blo\n  99, 107,  58,  71,  44, 108, 105, 115, 116, 101, 110,  58, // ck:G,listen:\n  87, 125,  59, 114, 101, 116, 117, 114, 110,  32,  86, 125, // W};return V}\n  59, 110,  46, 100, 101, 102,  97, 117, 108, 116,  61, 109, // ;n.default=m\n 125,  44, 102, 117, 110,  99, 116, 105, 111, 110,  40, 116, // },function(t\n  44, 110,  44, 101,  41, 123,  34, 117, 115, 101,  32, 115, // ,n,e){\"use s\n 116, 114, 105,  99, 116,  34,  59, 102, 117, 110,  99, 116, // trict\";funct\n 105, 111, 110,  32, 111,  40, 116,  41, 123, 114, 101, 116, // ion o(t){ret\n 117, 114, 110,  32, 116,  38,  38, 116,  46,  95,  95, 101, // urn t&&t.__e\n 115,  77, 111, 100, 117, 108, 101,  63, 116,  58, 123, 100, // sModule?t:{d\n 101, 102,  97, 117, 108, 116,  58, 116, 125, 125, 110,  46, // efault:t}}n.\n  95,  95, 101, 115,  77, 111, 100, 117, 108, 101,  61,  33, // __esModule=!\n  48,  59, 118,  97, 114,  32, 114,  61,  40,  34, 102, 117, // 0;var r=(\"fu\n 110,  99, 116, 105, 111, 110,  34,  61,  61, 116, 121, 112, // nction\"==typ\n 101, 111, 102,  32,  83, 121, 109,  98, 111, 108,  38,  38, // eof Symbol&&\n  34, 115, 121, 109,  98, 111, 108,  34,  61,  61, 116, 121, // \"symbol\"==ty\n 112, 101, 111, 102,  32,  83, 121, 109,  98, 111, 108,  46, // peof Symbol.\n 105, 116, 101, 114,  97, 116, 111, 114,  63, 102, 117, 110, // iterator?fun\n  99, 116, 105, 111, 110,  40, 116,  41, 123, 114, 101, 116, // ction(t){ret\n 117, 114, 110,  32, 116, 121, 112, 101, 111, 102,  32, 116, // urn typeof t\n 125,  58, 102, 117, 110,  99, 116, 105, 111, 110,  40, 116, // }:function(t\n  41, 123, 114, 101, 116, 117, 114, 110,  32, 116,  38,  38, // ){return t&&\n  34, 102, 117, 110,  99, 116, 105, 111, 110,  34,  61,  61, // \"function\"==\n 116, 121, 112, 101, 111, 102,  32,  83, 121, 109,  98, 111, // typeof Symbo\n 108,  38,  38, 116,  46,  99, 111, 110, 115, 116, 114, 117, // l&&t.constru\n  99, 116, 111, 114,  61,  61,  61,  83, 121, 109,  98, 111, // ctor===Symbo\n 108,  38,  38, 116,  33,  61,  61,  83, 121, 109,  98, 111, // l&&t!==Symbo\n 108,  46, 112, 114, 111, 116, 111, 116, 121, 112, 101,  63, // l.prototype?\n  34, 115, 121, 109,  98, 111, 108,  34,  58, 116, 121, 112, // \"symbol\":typ\n 101, 111, 102,  32, 116, 125,  44,  79,  98, 106, 101,  99, // eof t},Objec\n 116,  46,  97, 115, 115, 105, 103, 110, 124, 124, 102, 117, // t.assign||fu\n 110,  99, 116, 105, 111, 110,  40, 116,  41, 123, 102, 111, // nction(t){fo\n 114,  40, 118,  97, 114,  32, 110,  61,  49,  59, 110,  60, // r(var n=1;n<\n  97, 114, 103, 117, 109, 101, 110, 116, 115,  46, 108, 101, // arguments.le\n 110, 103, 116, 104,  59, 110,  43,  43,  41, 123, 118,  97, // ngth;n++){va\n 114,  32, 101,  61,  97, 114, 103, 117, 109, 101, 110, 116, // r e=argument\n 115,  91, 110,  93,  59, 102, 111, 114,  40, 118,  97, 114, // s[n];for(var\n  32, 111,  32, 105, 110,  32, 101,  41,  79,  98, 106, 101, //  o in e)Obje\n  99, 116,  46, 112, 114, 111, 116, 111, 116, 121, 112, 101, // ct.prototype\n  46, 104,  97, 115,  79, 119, 110,  80, 114, 111, 112, 101, // .hasOwnPrope\n 114, 116, 121,  46,  99,  97, 108, 108,  40, 101,  44, 111, // rty.call(e,o\n  41,  38,  38,  40, 116,  91, 111,  93,  61, 101,  91, 111, // )&&(t[o]=e[o\n  93,  41, 125, 114, 101, 116, 117, 114, 110,  32, 116, 125, // ])}return t}\n  41,  44, 105,  61, 101,  40,  51,  41,  44,  97,  61,  40, // ),i=e(3),a=(\n 111,  40, 105,  41,  44, 101,  40,  49,  41,  41,  44,  99, // o(i),e(1)),c\n  61, 101,  40,  50,  41,  44, 117,  61, 101,  40,  52,  41, // =e(2),u=e(4)\n  44, 115,  61, 111,  40, 117,  41,  44, 102,  61, 102, 117, // ,s=o(u),f=fu\n 110,  99, 116, 105, 111, 110,  40, 116,  44, 110,  44, 101, // nction(t,n,e\n  41, 123, 114, 101, 116, 117, 114, 110,  32,  77,  97, 116, // ){return Mat\n 104,  46, 109, 105, 110,  40,  77,  97, 116, 104,  46, 109, // h.min(Math.m\n  97, 120,  40, 116,  44, 110,  41,  44, 101,  41, 125,  44, // ax(t,n),e)},\n 108,  61, 102, 117, 110,  99, 116, 105, 111, 110,  40,  41, // l=function()\n 123, 118,  97, 114,  32, 116,  61,  97, 114, 103, 117, 109, // {var t=argum\n 101, 110, 116, 115,  46, 108, 101, 110, 103, 116, 104,  62, // ents.length>\n  48,  38,  38, 118, 111, 105, 100,  32,  48,  33,  61,  61, // 0&&void 0!==\n  97, 114, 103, 117, 109, 101, 110, 116, 115,  91,  48,  93, // arguments[0]\n  63,  97, 114, 103, 117, 109, 101, 110, 116, 115,  91,  48, // ?arguments[0\n  93,  58, 123, 125,  44, 110,  61, 116,  46, 103, 101, 116, // ]:{},n=t.get\n  85, 115, 101, 114,  67, 111, 110, 102, 105, 114, 109,  97, // UserConfirma\n 116, 105, 111, 110,  44, 101,  61, 116,  46, 105, 110, 105, // tion,e=t.ini\n 116, 105,  97, 108,  69, 110, 116, 114, 105, 101, 115,  44, // tialEntries,\n 111,  61, 118, 111, 105, 100,  32,  48,  61,  61,  61, 101, // o=void 0===e\n  63,  91,  34,  47,  34,  93,  58, 101,  44, 105,  61, 116, // ?[\"/\"]:e,i=t\n  46, 105, 110, 105, 116, 105,  97, 108,  73, 110, 100, 101, // .initialInde\n 120,  44, 117,  61, 118, 111, 105, 100,  32,  48,  61,  61, // x,u=void 0==\n  61, 105,  63,  48,  58, 105,  44, 108,  61, 116,  46, 107, // =i?0:i,l=t.k\n 101, 121,  76, 101, 110, 103, 116, 104,  44, 100,  61, 118, // eyLength,d=v\n 111, 105, 100,  32,  48,  61,  61,  61, 108,  63,  54,  58, // oid 0===l?6:\n 108,  44, 104,  61,  40,  48,  44, 115,  46, 100, 101, 102, // l,h=(0,s.def\n  97, 117, 108, 116,  41,  40,  41,  44, 118,  61, 102, 117, // ault)(),v=fu\n 110,  99, 116, 105, 111, 110,  40, 116,  41, 123, 114,  40, // nction(t){r(\n  65,  44, 116,  41,  44,  65,  46, 108, 101, 110, 103, 116, // A,t),A.lengt\n 104,  61,  65,  46, 101, 110, 116, 114, 105, 101, 115,  46, // h=A.entries.\n 108, 101, 110, 103, 116, 104,  44, 104,  46, 110, 111, 116, // length,h.not\n 105, 102, 121,  76, 105, 115, 116, 101, 110, 101, 114, 115, // ifyListeners\n  40,  65,  46, 108, 111,  99,  97, 116, 105, 111, 110,  44, // (A.location,\n  65,  46,  97,  99, 116, 105, 111, 110,  41, 125,  44, 112, // A.action)},p\n  61, 102, 117, 110,  99, 116, 105, 111, 110,  40,  41, 123, // =function(){\n 114, 101, 116, 117, 114, 110,  32,  77,  97, 116, 104,  46, // return Math.\n 114,  97, 110, 100, 111, 109,  40,  41,  46, 116, 111,  83, // random().toS\n 116, 114, 105, 110, 103,  40,  51,  54,  41,  46, 115, 117, // tring(36).su\n  98, 115, 116, 114,  40,  50,  44, 100,  41, 125,  44, 121, // bstr(2,d)},y\n  61, 102,  40, 117,  44,  48,  44, 111,  46, 108, 101, 110, // =f(u,0,o.len\n 103, 116, 104,  45,  49,  41,  44, 103,  61, 111,  46, 109, // gth-1),g=o.m\n  97, 112,  40, 102, 117, 110,  99, 116, 105, 111, 110,  40, // ap(function(\n 116,  41, 123, 114, 101, 116, 117, 114, 110,  34, 115, 116, // t){return\"st\n 114, 105, 110, 103,  34,  61,  61, 116, 121, 112, 101, 111, // ring\"==typeo\n 102,  32, 116,  63,  40,  48,  44,  99,  46,  99, 114, 101, // f t?(0,c.cre\n  97, 116, 101,  76, 111,  99,  97, 116, 105, 111, 110,  41, // ateLocation)\n  40, 116,  44, 118, 111, 105, 100,  32,  48,  44, 112,  40, // (t,void 0,p(\n  41,  41,  58,  40,  48,  44,  99,  46,  99, 114, 101,  97, // )):(0,c.crea\n 116, 101,  76, 111,  99,  97, 116, 105, 111, 110,  41,  40, // teLocation)(\n 116,  44, 118, 111, 105, 100,  32,  48,  44, 116,  46, 107, // t,void 0,t.k\n 101, 121, 124, 124, 112,  40,  41,  41, 125,  41,  44, 109, // ey||p())}),m\n  61,  97,  46,  99, 114, 101,  97, 116, 101,  80,  97, 116, // =a.createPat\n 104,  44, 119,  61, 102, 117, 110,  99, 116, 105, 111, 110, // h,w=function\n  40, 116,  44, 101,  41, 123, 118,  97, 114,  32, 111,  61, // (t,e){var o=\n  34,  80,  85,  83,  72,  34,  44, 114,  61,  40,  48,  44, // \"PUSH\",r=(0,\n  99,  46,  99, 114, 101,  97, 116, 101,  76, 111,  99,  97, // c.createLoca\n 116, 105, 111, 110,  41,  40, 116,  44, 101,  44, 112,  40, // tion)(t,e,p(\n  41,  44,  65,  46, 108, 111,  99,  97, 116, 105, 111, 110, // ),A.location\n  41,  59, 104,  46,  99, 111, 110, 102, 105, 114, 109,  84, // );h.confirmT\n 114,  97, 110, 115, 105, 116, 105, 111, 110,  84, 111,  40, // ransitionTo(\n 114,  44, 111,  44, 110,  44, 102, 117, 110,  99, 116, 105, // r,o,n,functi\n 111, 110,  40, 116,  41, 123, 105, 102,  40, 116,  41, 123, // on(t){if(t){\n 118,  97, 114,  32, 110,  61,  65,  46, 105, 110, 100, 101, // var n=A.inde\n 120,  44, 101,  61, 110,  43,  49,  44, 105,  61,  65,  46, // x,e=n+1,i=A.\n 101, 110, 116, 114, 105, 101, 115,  46, 115, 108, 105,  99, // entries.slic\n 101,  40,  48,  41,  59, 105,  46, 108, 101, 110, 103, 116, // e(0);i.lengt\n 104,  62, 101,  63, 105,  46, 115, 112, 108, 105,  99, 101, // h>e?i.splice\n  40, 101,  44, 105,  46, 108, 101, 110, 103, 116, 104,  45, // (e,i.length-\n 101,  44, 114,  41,  58, 105,  46, 112, 117, 115, 104,  40, // e,r):i.push(\n 114,  41,  44, 118,  40, 123,  97,  99, 116, 105, 111, 110, // r),v({action\n  58, 111,  44, 108, 111,  99,  97, 116, 105, 111, 110,  58, // :o,location:\n 114,  44, 105, 110, 100, 101, 120,  58, 101,  44, 101, 110, // r,index:e,en\n 116, 114, 105, 101, 115,  58, 105, 125,  41, 125, 125,  41, // tries:i})}})\n 125,  44,  80,  61, 102, 117, 110,  99, 116, 105, 111, 110, // },P=function\n  40, 116,  44, 101,  41, 123, 118,  97, 114,  32, 111,  61, // (t,e){var o=\n  34,  82,  69,  80,  76,  65,  67,  69,  34,  44, 114,  61, // \"REPLACE\",r=\n  40,  48,  44,  99,  46,  99, 114, 101,  97, 116, 101,  76, // (0,c.createL\n 111,  99,  97, 116, 105, 111, 110,  41,  40, 116,  44, 101, // ocation)(t,e\n  44, 112,  40,  41,  44,  65,  46, 108, 111,  99,  97, 116, // ,p(),A.locat\n 105, 111, 110,  41,  59, 104,  46,  99, 111, 110, 102, 105, // ion);h.confi\n 114, 109,  84, 114,  97, 110, 115, 105, 116, 105, 111, 110, // rmTransition\n  84, 111,  40, 114,  44, 111,  44, 110,  44, 102, 117, 110, // To(r,o,n,fun\n  99, 116, 105, 111, 110,  40, 116,  41, 123, 116,  38,  38, // ction(t){t&&\n  40,  65,  46, 101, 110, 116, 114, 105, 101, 115,  91,  65, // (A.entries[A\n  46, 105, 110, 100, 101, 120,  93,  61, 114,  44, 118,  40, // .index]=r,v(\n 123,  97,  99, 116, 105, 111, 110,  58, 111,  44, 108, 111, // {action:o,lo\n  99,  97, 116, 105, 111, 110,  58, 114, 125,  41,  41, 125, // cation:r}))}\n  41, 125,  44,  98,  61, 102, 117, 110,  99, 116, 105, 111, // )},b=functio\n 110,  40, 116,  41, 123, 118,  97, 114,  32, 101,  61, 102, // n(t){var e=f\n  40,  65,  46, 105, 110, 100, 101, 120,  43, 116,  44,  48, // (A.index+t,0\n  44,  65,  46, 101, 110, 116, 114, 105, 101, 115,  46, 108, // ,A.entries.l\n 101, 110, 103, 116, 104,  45,  49,  41,  44, 111,  61,  34, // ength-1),o=\"\n  80,  79,  80,  34,  44, 114,  61,  65,  46, 101, 110, 116, // POP\",r=A.ent\n 114, 105, 101, 115,  91, 101,  93,  59, 104,  46,  99, 111, // ries[e];h.co\n 110, 102, 105, 114, 109,  84, 114,  97, 110, 115, 105, 116, // nfirmTransit\n 105, 111, 110,  84, 111,  40, 114,  44, 111,  44, 110,  44, // ionTo(r,o,n,\n 102, 117, 110,  99, 116, 105, 111, 110,  40, 116,  41, 123, // function(t){\n 116,  63, 118,  40, 123,  97,  99, 116, 105, 111, 110,  58, // t?v({action:\n 111,  44, 108, 111,  99,  97, 116, 105, 111, 110,  58, 114, // o,location:r\n  44, 105, 110, 100, 101, 120,  58, 101, 125,  41,  58, 118, // ,index:e}):v\n  40,  41, 125,  41, 125,  44,  79,  61, 102, 117, 110,  99, // ()})},O=func\n 116, 105, 111, 110,  40,  41, 123, 114, 101, 116, 117, 114, // tion(){retur\n 110,  32,  98,  40,  45,  49,  41, 125,  44, 120,  61, 102, // n b(-1)},x=f\n 117, 110,  99, 116, 105, 111, 110,  40,  41, 123, 114, 101, // unction(){re\n 116, 117, 114, 110,  32,  98,  40,  49,  41, 125,  44,  76, // turn b(1)},L\n  61, 102, 117, 110,  99, 116, 105, 111, 110,  40, 116,  41, // =function(t)\n 123, 118,  97, 114,  32, 110,  61,  65,  46, 105, 110, 100, // {var n=A.ind\n 101, 120,  43, 116,  59, 114, 101, 116, 117, 114, 110,  32, // ex+t;return \n 110,  62,  61,  48,  38,  38, 110,  60,  65,  46, 101, 110, // n>=0&&n<A.en\n 116, 114, 105, 101, 115,  46, 108, 101, 110, 103, 116, 104, // tries.length\n 125,  44,  83,  61, 102, 117, 110,  99, 116, 105, 111, 110, // },S=function\n  40,  41, 123, 118,  97, 114,  32, 116,  61,  97, 114, 103, // (){var t=arg\n 117, 109, 101, 110, 116, 115,  46, 108, 101, 110, 103, 116, // uments.lengt\n 104,  62,  48,  38,  38, 118, 111, 105, 100,  32,  48,  33, // h>0&&void 0!\n  61,  61,  97, 114, 103, 117, 109, 101, 110, 116, 115,  91, // ==arguments[\n  48,  93,  38,  38,  97, 114, 103, 117, 109, 101, 110, 116, // 0]&&argument\n 115,  91,  48,  93,  59, 114, 101, 116, 117, 114, 110,  32, // s[0];return \n 104,  46, 115, 101, 116,  80, 114, 111, 109, 112, 116,  40, // h.setPrompt(\n 116,  41, 125,  44,  69,  61, 102, 117, 110,  99, 116, 105, // t)},E=functi\n 111, 110,  40, 116,  41, 123, 114, 101, 116, 117, 114, 110, // on(t){return\n  32, 104,  46,  97, 112, 112, 101, 110, 100,  76, 105, 115, //  h.appendLis\n 116, 101, 110, 101, 114,  40, 116,  41, 125,  44,  65,  61, // tener(t)},A=\n 123, 108, 101, 110, 103, 116, 104,  58, 103,  46, 108, 101, // {length:g.le\n 110, 103, 116, 104,  44,  97,  99, 116, 105, 111, 110,  58, // ngth,action:\n  34,  80,  79,  80,  34,  44, 108, 111,  99,  97, 116, 105, // \"POP\",locati\n 111, 110,  58, 103,  91, 121,  93,  44, 105, 110, 100, 101, // on:g[y],inde\n 120,  58, 121,  44, 101, 110, 116, 114, 105, 101, 115,  58, // x:y,entries:\n 103,  44,  99, 114, 101,  97, 116, 101,  72, 114, 101, 102, // g,createHref\n  58, 109,  44, 112, 117, 115, 104,  58, 119,  44, 114, 101, // :m,push:w,re\n 112, 108,  97,  99, 101,  58,  80,  44, 103, 111,  58,  98, // place:P,go:b\n  44, 103, 111,  66,  97,  99, 107,  58,  79,  44, 103, 111, // ,goBack:O,go\n  70, 111, 114, 119,  97, 114, 100,  58, 120,  44,  99,  97, // Forward:x,ca\n 110,  71, 111,  58,  76,  44,  98, 108, 111,  99, 107,  58, // nGo:L,block:\n  83,  44, 108, 105, 115, 116, 101, 110,  58,  69, 125,  59, // S,listen:E};\n 114, 101, 116, 117, 114, 110,  32,  65, 125,  59, 110,  46, // return A};n.\n 100, 101, 102,  97, 117, 108, 116,  61, 108, 125,  44, 102, // default=l},f\n 117, 110,  99, 116, 105, 111, 110,  40, 116,  44, 110,  41, // unction(t,n)\n 123,  34, 117, 115, 101,  32, 115, 116, 114, 105,  99, 116, // {\"use strict\n  34,  59, 118,  97, 114,  32, 101,  61, 102, 117, 110,  99, // \";var e=func\n 116, 105, 111, 110,  40, 116,  41, 123, 114, 101, 116, 117, // tion(t){retu\n 114, 110,  34,  47,  34,  61,  61,  61, 116,  46,  99, 104, // rn\"/\"===t.ch\n  97, 114,  65, 116,  40,  48,  41, 125,  44, 111,  61, 102, // arAt(0)},o=f\n 117, 110,  99, 116, 105, 111, 110,  40, 116,  44, 110,  41, // unction(t,n)\n 123, 102, 111, 114,  40, 118,  97, 114,  32, 101,  61, 110, // {for(var e=n\n  44, 111,  61, 101,  43,  49,  44, 114,  61, 116,  46, 108, // ,o=e+1,r=t.l\n 101, 110, 103, 116, 104,  59, 111,  60, 114,  59, 101,  43, // ength;o<r;e+\n  61,  49,  44, 111,  43,  61,  49,  41, 116,  91, 101,  93, // =1,o+=1)t[e]\n  61, 116,  91, 111,  93,  59, 116,  46, 112, 111, 112,  40, // =t[o];t.pop(\n  41, 125,  44, 114,  61, 102, 117, 110,  99, 116, 105, 111, // )},r=functio\n 110,  40, 116,  41, 123, 118,  97, 114,  32, 110,  61,  97, // n(t){var n=a\n 114, 103, 117, 109, 101, 110, 116, 115,  46, 108, 101, 110, // rguments.len\n 103, 116, 104,  60,  61,  49, 124, 124, 118, 111, 105, 100, // gth<=1||void\n  32,  48,  61,  61,  61,  97, 114, 103, 117, 109, 101, 110, //  0===argumen\n 116, 115,  91,  49,  93,  63,  34,  34,  58,  97, 114, 103, // ts[1]?\"\":arg\n 117, 109, 101, 110, 116, 115,  91,  49,  93,  44, 114,  61, // uments[1],r=\n 116,  38,  38, 116,  46, 115, 112, 108, 105, 116,  40,  34, // t&&t.split(\"\n  47,  34,  41, 124, 124,  91,  93,  44, 105,  61, 110,  38, // /\")||[],i=n&\n  38, 110,  46, 115, 112, 108, 105, 116,  40,  34,  47,  34, // &n.split(\"/\"\n  41, 124, 124,  91,  93,  44,  97,  61, 116,  38,  38, 101, // )||[],a=t&&e\n  40, 116,  41,  44,  99,  61, 110,  38,  38, 101,  40, 110, // (t),c=n&&e(n\n  41,  44, 117,  61,  97, 124, 124,  99,  59, 105, 102,  40, // ),u=a||c;if(\n 116,  38,  38, 101,  40, 116,  41,  63, 105,  61, 114,  58, // t&&e(t)?i=r:\n 114,  46, 108, 101, 110, 103, 116, 104,  38,  38,  40, 105, // r.length&&(i\n  46, 112, 111, 112,  40,  41,  44, 105,  61, 105,  46,  99, // .pop(),i=i.c\n 111, 110,  99,  97, 116,  40, 114,  41,  41,  44,  33, 105, // oncat(r)),!i\n  46, 108, 101, 110, 103, 116, 104,  41, 114, 101, 116, 117, // .length)retu\n 114, 110,  34,  47,  34,  59, 118,  97, 114,  32, 115,  61, // rn\"/\";var s=\n 118, 111, 105, 100,  32,  48,  59, 105, 102,  40, 105,  46, // void 0;if(i.\n 108, 101, 110, 103, 116, 104,  41, 123, 118,  97, 114,  32, // length){var \n 102,  61, 105,  91, 105,  46, 108, 101, 110, 103, 116, 104, // f=i[i.length\n  45,  49,  93,  59, 115,  61,  34,  46,  34,  61,  61,  61, // -1];s=\".\"===\n 102, 124, 124,  34,  46,  46,  34,  61,  61,  61, 102, 124, // f||\"..\"===f|\n 124,  34,  34,  61,  61,  61, 102, 125, 101, 108, 115, 101, // |\"\"===f}else\n  32, 115,  61,  33,  49,  59, 102, 111, 114,  40, 118,  97, //  s=!1;for(va\n 114,  32, 108,  61,  48,  44, 100,  61, 105,  46, 108, 101, // r l=0,d=i.le\n 110, 103, 116, 104,  59, 100,  62,  61,  48,  59, 100,  45, // ngth;d>=0;d-\n  45,  41, 123, 118,  97, 114,  32, 104,  61, 105,  91, 100, // -){var h=i[d\n  93,  59,  34,  46,  34,  61,  61,  61, 104,  63, 111,  40, // ];\".\"===h?o(\n 105,  44, 100,  41,  58,  34,  46,  46,  34,  61,  61,  61, // i,d):\"..\"===\n 104,  63,  40, 111,  40, 105,  44, 100,  41,  44, 108,  43, // h?(o(i,d),l+\n  43,  41,  58, 108,  38,  38,  40, 111,  40, 105,  44, 100, // +):l&&(o(i,d\n  41,  44, 108,  45,  45,  41, 125, 105, 102,  40,  33, 117, // ),l--)}if(!u\n  41, 102, 111, 114,  40,  59, 108,  45,  45,  59, 108,  41, // )for(;l--;l)\n 105,  46, 117, 110, 115, 104, 105, 102, 116,  40,  34,  46, // i.unshift(\".\n  46,  34,  41,  59,  33, 117, 124, 124,  34,  34,  61,  61, // .\");!u||\"\"==\n  61, 105,  91,  48,  93, 124, 124, 105,  91,  48,  93,  38, // =i[0]||i[0]&\n  38, 101,  40, 105,  91,  48,  93,  41, 124, 124, 105,  46, // &e(i[0])||i.\n 117, 110, 115, 104, 105, 102, 116,  40,  34,  34,  41,  59, // unshift(\"\");\n 118,  97, 114,  32, 118,  61, 105,  46, 106, 111, 105, 110, // var v=i.join\n  40,  34,  47,  34,  41,  59, 114, 101, 116, 117, 114, 110, // (\"/\");return\n  32, 115,  38,  38,  34,  47,  34,  33,  61,  61, 118,  46, //  s&&\"/\"!==v.\n 115, 117,  98, 115, 116, 114,  40,  45,  49,  41,  38,  38, // substr(-1)&&\n  40, 118,  43,  61,  34,  47,  34,  41,  44, 118, 125,  59, // (v+=\"/\"),v};\n 116,  46, 101, 120, 112, 111, 114, 116, 115,  61, 114, 125, // t.exports=r}\n  44, 102, 117, 110,  99, 116, 105, 111, 110,  40, 116,  44, // ,function(t,\n 110,  41, 123,  34, 117, 115, 101,  32, 115, 116, 114, 105, // n){\"use stri\n  99, 116,  34,  59, 110,  46,  95,  95, 101, 115,  77, 111, // ct\";n.__esMo\n 100, 117, 108, 101,  61,  33,  48,  59, 118,  97, 114,  32, // dule=!0;var \n 101,  61,  34, 102, 117, 110,  99, 116, 105, 111, 110,  34, // e=\"function\"\n  61,  61, 116, 121, 112, 101, 111, 102,  32,  83, 121, 109, // ==typeof Sym\n  98, 111, 108,  38,  38,  34, 115, 121, 109,  98, 111, 108, // bol&&\"symbol\n  34,  61,  61, 116, 121, 112, 101, 111, 102,  32,  83, 121, // \"==typeof Sy\n 109,  98, 111, 108,  46, 105, 116, 101, 114,  97, 116, 111, // mbol.iterato\n 114,  63, 102, 117, 110,  99, 116, 105, 111, 110,  40, 116, // r?function(t\n  41, 123, 114, 101, 116, 117, 114, 110,  32, 116, 121, 112, // ){return typ\n 101, 111, 102,  32, 116, 125,  58, 102, 117, 110,  99, 116, // eof t}:funct\n 105, 111, 110,  40, 116,  41, 123, 114, 101, 116, 117, 114, // ion(t){retur\n 110,  32, 116,  38,  38,  34, 102, 117, 110,  99, 116, 105, // n t&&\"functi\n 111, 110,  34,  61,  61, 116, 121, 112, 101, 111, 102,  32, // on\"==typeof \n  83, 121, 109,  98, 111, 108,  38,  38, 116,  46,  99, 111, // Symbol&&t.co\n 110, 115, 116, 114, 117,  99, 116, 111, 114,  61,  61,  61, // nstructor===\n  83, 121, 109,  98, 111, 108,  38,  38, 116,  33,  61,  61, // Symbol&&t!==\n  83, 121, 109,  98, 111, 108,  46, 112, 114, 111, 116, 111, // Symbol.proto\n 116, 121, 112, 101,  63,  34, 115, 121, 109,  98, 111, 108, // type?\"symbol\n  34,  58, 116, 121, 112, 101, 111, 102,  32, 116, 125,  44, // \":typeof t},\n 111,  61, 102, 117, 110,  99, 116, 105, 111, 110,  32, 116, // o=function t\n  40, 110,  44, 111,  41, 123, 105, 102,  40, 110,  61,  61, // (n,o){if(n==\n  61, 111,  41, 114, 101, 116, 117, 114, 110,  33,  48,  59, // =o)return!0;\n 105, 102,  40, 110, 117, 108, 108,  61,  61, 110, 124, 124, // if(null==n||\n 110, 117, 108, 108,  61,  61, 111,  41, 114, 101, 116, 117, // null==o)retu\n 114, 110,  33,  49,  59, 105, 102,  40,  65, 114, 114,  97, // rn!1;if(Arra\n 121,  46, 105, 115,  65, 114, 114,  97, 121,  40, 110,  41, // y.isArray(n)\n  41, 114, 101, 116, 117, 114, 110,  33,  40,  33,  65, 114, // )return!(!Ar\n 114,  97, 121,  46, 105, 115,  65, 114, 114,  97, 121,  40, // ray.isArray(\n 111,  41, 124, 124, 110,  46, 108, 101, 110, 103, 116, 104, // o)||n.length\n  33,  61,  61, 111,  46, 108, 101, 110, 103, 116, 104,  41, // !==o.length)\n  38,  38, 110,  46, 101, 118, 101, 114, 121,  40, 102, 117, // &&n.every(fu\n 110,  99, 116, 105, 111, 110,  40, 110,  44, 101,  41, 123, // nction(n,e){\n 114, 101, 116, 117, 114, 110,  32, 116,  40, 110,  44, 111, // return t(n,o\n  91, 101,  93,  41, 125,  41,  59, 118,  97, 114,  32, 114, // [e])});var r\n  61,  34, 117, 110, 100, 101, 102, 105, 110, 101, 100,  34, // =\"undefined\"\n  61,  61, 116, 121, 112, 101, 111, 102,  32, 110,  63,  34, // ==typeof n?\"\n 117, 110, 100, 101, 102, 105, 110, 101, 100,  34,  58, 101, // undefined\":e\n  40, 110,  41,  44, 105,  61,  34, 117, 110, 100, 101, 102, // (n),i=\"undef\n 105, 110, 101, 100,  34,  61,  61, 116, 121, 112, 101, 111, // ined\"==typeo\n 102,  32, 111,  63,  34, 117, 110, 100, 101, 102, 105, 110, // f o?\"undefin\n 101, 100,  34,  58, 101,  40, 111,  41,  59, 105, 102,  40, // ed\":e(o);if(\n 114,  33,  61,  61, 105,  41, 114, 101, 116, 117, 114, 110, // r!==i)return\n  33,  49,  59, 105, 102,  40,  34, 111,  98, 106, 101,  99, // !1;if(\"objec\n 116,  34,  61,  61,  61, 114,  41, 123, 118,  97, 114,  32, // t\"===r){var \n  97,  61, 110,  46, 118,  97, 108, 117, 101,  79, 102,  40, // a=n.valueOf(\n  41,  44,  99,  61, 111,  46, 118,  97, 108, 117, 101,  79, // ),c=o.valueO\n 102,  40,  41,  59, 105, 102,  40,  97,  33,  61,  61, 110, // f();if(a!==n\n 124, 124,  99,  33,  61,  61, 111,  41, 114, 101, 116, 117, // ||c!==o)retu\n 114, 110,  32, 116,  40,  97,  44,  99,  41,  59, 118,  97, // rn t(a,c);va\n 114,  32, 117,  61,  79,  98, 106, 101,  99, 116,  46, 107, // r u=Object.k\n 101, 121, 115,  40, 110,  41,  44, 115,  61,  79,  98, 106, // eys(n),s=Obj\n 101,  99, 116,  46, 107, 101, 121, 115,  40, 111,  41,  59, // ect.keys(o);\n 114, 101, 116, 117, 114, 110,  32, 117,  46, 108, 101, 110, // return u.len\n 103, 116, 104,  61,  61,  61, 115,  46, 108, 101, 110, 103, // gth===s.leng\n 116, 104,  38,  38, 117,  46, 101, 118, 101, 114, 121,  40, // th&&u.every(\n 102, 117, 110,  99, 116, 105, 111, 110,  40, 101,  41, 123, // function(e){\n 114, 101, 116, 117, 114, 110,  32, 116,  40, 110,  91, 101, // return t(n[e\n  93,  44, 111,  91, 101,  93,  41, 125,  41, 125, 114, 101, // ],o[e])})}re\n 116, 117, 114, 110,  33,  49, 125,  59, 110,  46, 100, 101, // turn!1};n.de\n 102,  97, 117, 108, 116,  61, 111, 125,  93,  41, 125,  41, // fault=o}])})\n  59, 0 // ;\n};\nstatic const unsigned char v4[] = {\n  60,  33,  68,  79,  67,  84,  89,  80,  69,  32, 104, 116, // <!DOCTYPE ht\n 109, 108,  62,  10,  60, 104, 116, 109, 108,  32, 108,  97, // ml>.<html la\n 110, 103,  61,  34, 101, 110,  34,  32,  99, 108,  97, 115, // ng=\"en\" clas\n 115,  61,  34, 104,  45, 102, 117, 108, 108,  32,  98, 103, // s=\"h-full bg\n  45, 119, 104, 105, 116, 101,  34,  62,  10,  32,  32,  60, // -white\">.  <\n 104, 101,  97, 100,  62,  10,  32,  32,  32,  32,  60, 116, // head>.    <t\n 105, 116, 108, 101,  62,  60,  47, 116, 105, 116, 108, 101, // itle></title\n  62,  10,  32,  32,  32,  32,  60, 109, 101, 116,  97,  32, // >.    <meta \n  99, 104,  97, 114, 115, 101, 116,  61,  34, 117, 116, 102, // charset=\"utf\n  45,  56,  34,  32,  47,  62,  10,  32,  32,  32,  32,  60, // -8\" />.    <\n 109, 101, 116,  97,  32, 104, 116, 116, 112,  45, 101, 113, // meta http-eq\n 117, 105, 118,  61,  34,  88,  45,  85,  65,  45,  67, 111, // uiv=\"X-UA-Co\n 109, 112,  97, 116, 105,  98, 108, 101,  34,  32,  99, 111, // mpatible\" co\n 110, 116, 101, 110, 116,  61,  34,  73,  69,  61, 101, 100, // ntent=\"IE=ed\n 103, 101,  34,  32,  47,  62,  10,  32,  32,  32,  32,  60, // ge\" />.    <\n 109, 101, 116,  97,  32, 110,  97, 109, 101,  61,  34, 118, // meta name=\"v\n 105, 101, 119, 112, 111, 114, 116,  34,  32,  99, 111, 110, // iewport\" con\n 116, 101, 110, 116,  61,  34, 119, 105, 100, 116, 104,  61, // tent=\"width=\n 100, 101, 118, 105,  99, 101,  45, 119, 105, 100, 116, 104, // device-width\n  44,  32, 105, 110, 105, 116, 105,  97, 108,  45, 115,  99, // , initial-sc\n  97, 108, 101,  61,  49,  46,  48,  34,  32,  47,  62,  10, // ale=1.0\" />.\n  32,  32,  32,  32,  60, 108, 105, 110, 107,  32, 114, 101, //     <link re\n 108,  61,  34, 105,  99, 111, 110,  34,  32, 116, 121, 112, // l=\"icon\" typ\n 101,  61,  34, 105, 109,  97, 103, 101,  47, 115, 118, 103, // e=\"image/svg\n  43, 120, 109, 108,  34,  32, 104, 114, 101, 102,  61,  34, // +xml\" href=\"\n 100,  97, 116,  97,  58, 105, 109,  97, 103, 101,  47, 115, // data:image/s\n 118, 103,  43, 120, 109, 108,  44,  60, 115, 118, 103,  32, // vg+xml,<svg \n 120, 109, 108, 110, 115,  61,  39, 104, 116, 116, 112,  58, // xmlns='http:\n  47,  47, 119, 119, 119,  46, 119,  51,  46, 111, 114, 103, // //www.w3.org\n  47,  50,  48,  48,  48,  47, 115, 118, 103,  39,  32, 102, // /2000/svg' f\n 105, 108, 108,  61,  39, 110, 111, 110, 101,  39,  32, 118, // ill='none' v\n 105, 101, 119,  66, 111, 120,  61,  39,  48,  32,  48,  32, // iewBox='0 0 \n  50,  52,  32,  50,  52,  39,  32, 115, 116, 114, 111, 107, // 24 24' strok\n 101,  45, 119, 105, 100, 116, 104,  61,  39,  49,  46,  53, // e-width='1.5\n  39,  32, 115, 116, 114, 111, 107, 101,  61,  39,  99, 117, // ' stroke='cu\n 114, 114, 101, 110, 116,  67, 111, 108, 111, 114,  39,  62, // rrentColor'>\n  32,  60, 112,  97, 116, 104,  32, 115, 116, 114, 111, 107, //  <path strok\n 101,  45, 108, 105, 110, 101,  99,  97, 112,  61,  39, 114, // e-linecap='r\n 111, 117, 110, 100,  39,  32, 115, 116, 114, 111, 107, 101, // ound' stroke\n  45, 108, 105, 110, 101, 106, 111, 105, 110,  61,  39, 114, // -linejoin='r\n 111, 117, 110, 100,  39,  32, 100,  61,  39,  77,  49,  52, // ound' d='M14\n  46,  56,  53,  55,  32,  49,  55,  46,  48,  56,  50,  97, // .857 17.082a\n  50,  51,  46,  56,  52,  56,  32,  50,  51,  46,  56,  52, // 23.848 23.84\n  56,  32,  48,  32,  48,  48,  53,  46,  52,  53,  52,  45, // 8 0 005.454-\n  49,  46,  51,  49,  65,  56,  46,  57,  54,  55,  32,  56, // 1.31A8.967 8\n  46,  57,  54,  55,  32,  48,  32,  48,  49,  49,  56,  32, // .967 0 0118 \n  57,  46,  55,  53, 118,  45,  46,  55,  86,  57,  65,  54, // 9.75v-.7V9A6\n  32,  54,  32,  48,  32,  48,  48,  54,  32,  57, 118,  46, //  6 0 006 9v.\n  55,  53,  97,  56,  46,  57,  54,  55,  32,  56,  46,  57, // 75a8.967 8.9\n  54,  55,  32,  48,  32,  48,  49,  45,  50,  46,  51,  49, // 67 0 01-2.31\n  50,  32,  54,  46,  48,  50,  50,  99,  49,  46,  55,  51, // 2 6.022c1.73\n  51,  46,  54,  52,  32,  51,  46,  53,  54,  32,  49,  46, // 3.64 3.56 1.\n  48,  56,  53,  32,  53,  46,  52,  53,  53,  32,  49,  46, // 085 5.455 1.\n  51,  49, 109,  53,  46,  55,  49,  52,  32,  48,  97,  50, // 31m5.714 0a2\n  52,  46,  50,  53,  53,  32,  50,  52,  46,  50,  53,  53, // 4.255 24.255\n  32,  48,  32,  48,  49,  45,  53,  46,  55,  49,  52,  32, //  0 01-5.714 \n  48, 109,  53,  46,  55,  49,  52,  32,  48,  97,  51,  32, // 0m5.714 0a3 \n  51,  32,  48,  32,  49,  49,  45,  53,  46,  55,  49,  52, // 3 0 11-5.714\n  32,  48,  39,  32,  47,  62,  32,  60,  47, 115, 118, 103, //  0' /> </svg\n  62,  34,  32,  47,  62,  10,  32,  32,  32,  32,  60, 108, // >\" />.    <l\n 105, 110, 107,  32, 104, 114, 101, 102,  61,  34, 104, 116, // ink href=\"ht\n 116, 112, 115,  58,  47,  47, 114, 115, 109, 115,  46, 109, // tps://rsms.m\n 101,  47, 105, 110, 116, 101, 114,  47, 105, 110, 116, 101, // e/inter/inte\n 114,  46,  99, 115, 115,  34,  32, 114, 101, 108,  61,  34, // r.css\" rel=\"\n 115, 116, 121, 108, 101, 115, 104, 101, 101, 116,  34,  32, // stylesheet\" \n  47,  62,  10,  32,  32,  60,  47, 104, 101,  97, 100,  62, // />.  </head>\n  10,  32,  32,  60,  98, 111, 100, 121,  32,  99, 108,  97, // .  <body cla\n 115, 115,  61,  34, 104,  45, 102, 117, 108, 108,  34,  62, // ss=\"h-full\">\n  60,  47,  98, 111, 100, 121,  62,  10,  32,  32,  60, 115, // </body>.  <s\n  99, 114, 105, 112, 116,  32, 115, 114,  99,  61,  34, 104, // cript src=\"h\n 116, 116, 112, 115,  58,  47,  47,  99, 100, 110,  46, 116, // ttps://cdn.t\n  97, 105, 108, 119, 105, 110, 100,  99, 115, 115,  46,  99, // ailwindcss.c\n 111, 109,  34,  62,  60,  47, 115,  99, 114, 105, 112, 116, // om\"></script\n  62,  10,  32,  32,  60, 115,  99, 114, 105, 112, 116,  32, // >.  <script \n 115, 114,  99,  61,  34, 104, 105, 115, 116, 111, 114, 121, // src=\"history\n  46, 109, 105, 110,  46, 106, 115,  34,  62,  60,  47, 115, // .min.js\"></s\n  99, 114, 105, 112, 116,  62,  10,  32,  32,  60, 115,  99, // cript>.  <sc\n 114, 105, 112, 116,  32, 116, 121, 112, 101,  61,  34, 109, // ript type=\"m\n 111, 100, 117, 108, 101,  34,  32, 115, 114,  99,  61,  34, // odule\" src=\"\n 109,  97, 105, 110,  46, 106, 115,  34,  62,  60,  47, 115, // main.js\"></s\n  99, 114, 105, 112, 116,  62,  10,  60,  47, 104, 116, 109, // cript>.</htm\n 108,  62,  10, 0 // l>.\n};\nstatic const unsigned char v5[] = {\n  39, 117, 115, 101,  32, 115, 116, 114, 105,  99, 116,  39, // 'use strict'\n  59,  10, 105, 109, 112, 111, 114, 116,  32, 123,  32, 104, // ;.import { h\n  44,  32, 114, 101, 110, 100, 101, 114,  44,  32, 117, 115, // , render, us\n 101,  83, 116,  97, 116, 101,  44,  32, 117, 115, 101,  69, // eState, useE\n 102, 102, 101,  99, 116,  44,  32, 104, 116, 109, 108,  44, // ffect, html,\n  32,  82, 111, 117, 116, 101, 114,  32, 125,  32, 102, 114, //  Router } fr\n 111, 109,  32,  32,  39,  46,  47,  98, 117, 110, 100, 108, // om  './bundl\n 101,  46, 106, 115,  39,  59,  10, 105, 109, 112, 111, 114, // e.js';.impor\n 116,  32, 123,  32,  73,  99, 111, 110, 115,  44,  32,  76, // t { Icons, L\n 111, 103, 105, 110,  44,  32,  83, 101, 116, 116, 105, 110, // ogin, Settin\n 103,  44,  32,  66, 117, 116, 116, 111, 110,  44,  32,  83, // g, Button, S\n 116,  97, 116,  44,  32, 116, 105, 112,  67, 111, 108, 111, // tat, tipColo\n 114, 115,  44,  32,  67, 111, 108, 111, 114, 101, 100,  44, // rs, Colored,\n  32,  78, 111, 116, 105, 102, 105,  99,  97, 116, 105, 111, //  Notificatio\n 110,  32, 125,  32, 102, 114, 111, 109,  32,  39,  46,  47, // n } from './\n  99, 111, 109, 112, 111, 110, 101, 110, 116, 115,  46, 106, // components.j\n 115,  39,  59,  10,  10,  99, 111, 110, 115, 116,  32,  76, // s';..const L\n 111, 103, 111,  32,  61,  32, 112, 114, 111, 112, 115,  32, // ogo = props \n  61,  62,  32, 104, 116, 109, 108,  96,  60, 115, 118, 103, // => html`<svg\n  32,  99, 108,  97, 115, 115,  61,  36, 123, 112, 114, 111, //  class=${pro\n 112, 115,  46,  99, 108,  97, 115, 115, 125,  32, 120, 109, // ps.class} xm\n 108, 110, 115,  61,  34, 104, 116, 116, 112,  58,  47,  47, // lns=\"http://\n 119, 119, 119,  46, 119,  51,  46, 111, 114, 103,  47,  50, // www.w3.org/2\n  48,  48,  48,  47, 115, 118, 103,  34,  32, 118, 105, 101, // 000/svg\" vie\n 119,  66, 111, 120,  61,  34,  48,  32,  48,  32,  49,  50, // wBox=\"0 0 12\n  46,  56,  55,  32,  49,  50,  46,  56,  53,  34,  62,  60, // .87 12.85\"><\n 100, 101, 102, 115,  62,  60, 115, 116, 121, 108, 101,  62, // defs><style>\n  46, 108, 108,  45,  99, 108, 115,  45,  49, 123, 102, 105, // .ll-cls-1{fi\n 108, 108,  58, 110, 111, 110, 101,  59, 115, 116, 114, 111, // ll:none;stro\n 107, 101,  58,  35,  48,  48,  48,  59, 115, 116, 114, 111, // ke:#000;stro\n 107, 101,  45, 109, 105, 116, 101, 114, 108, 105, 109, 105, // ke-miterlimi\n 116,  58,  49,  48,  59, 115, 116, 114, 111, 107, 101,  45, // t:10;stroke-\n 119, 105, 100, 116, 104,  58,  48,  46,  53, 112, 120,  59, // width:0.5px;\n 125,  60,  47, 115, 116, 121, 108, 101,  62,  60,  47, 100, // }</style></d\n 101, 102, 115,  62,  60, 103,  32, 105, 100,  61,  34,  76, // efs><g id=\"L\n  97, 121, 101, 114,  95,  50,  34,  32, 100,  97, 116,  97, // ayer_2\" data\n  45, 110,  97, 109, 101,  61,  34,  76,  97, 121, 101, 114, // -name=\"Layer\n  32,  50,  34,  62,  60, 103,  32, 105, 100,  61,  34,  76, //  2\"><g id=\"L\n  97, 121, 101, 114,  95,  49,  45,  50,  34,  32, 100,  97, // ayer_1-2\" da\n 116,  97,  45, 110,  97, 109, 101,  61,  34,  76,  97, 121, // ta-name=\"Lay\n 101, 114,  32,  49,  34,  62,  60, 112,  97, 116, 104,  32, // er 1\"><path \n  99, 108,  97, 115, 115,  61,  34, 108, 108,  45,  99, 108, // class=\"ll-cl\n 115,  45,  49,  34,  32, 100,  61,  34,  77,  49,  50,  46, // s-1\" d=\"M12.\n  54,  50,  44,  49,  46,  56,  50,  86,  56,  46,  57,  49, // 62,1.82V8.91\n  65,  49,  46,  53,  56,  44,  49,  46,  53,  56,  44,  48, // A1.58,1.58,0\n  44,  48,  44,  49,  44,  49,  49,  44,  49,  48,  46,  52, // ,0,1,11,10.4\n  56,  72,  52,  97,  49,  46,  52,  52,  44,  49,  46,  52, // 8H4a1.44,1.4\n  52,  44,  48,  44,  48,  44,  49,  45,  49,  45,  46,  51, // 4,0,0,1-1-.3\n  55,  65,  46,  54,  57,  46,  54,  57,  44,  48,  44,  48, // 7A.69.69,0,0\n  44,  49,  44,  50,  46,  56,  52,  44,  49,  48, 108,  45, // ,1,2.84,10l-\n  46,  49,  45,  46,  49,  50,  97,  46,  56,  49,  46,  56, // .1-.12a.81.8\n  49,  44,  48,  44,  48,  44,  49,  45,  46,  49,  53,  45, // 1,0,0,1-.15-\n  46,  52,  56,  86,  53,  46,  53,  55,  97,  46,  56,  55, // .48V5.57a.87\n  46,  56,  55,  44,  48,  44,  48,  44,  49,  44,  46,  56, // .87,0,0,1,.8\n  54,  45,  46,  56,  54,  72,  52,  46,  55,  51,  86,  55, // 6-.86H4.73V7\n  46,  50,  56,  97,  46,  56,  54,  46,  56,  54,  44,  48, // .28a.86.86,0\n  44,  48,  44,  48,  44,  46,  56,  54,  46,  56,  53,  72, // ,0,0,.86.85H\n  57,  46,  52,  50,  97,  46,  56,  53,  46,  56,  53,  44, // 9.42a.85.85,\n  48,  44,  48,  44,  48,  44,  46,  56,  53,  45,  46,  56, // 0,0,0,.85-.8\n  53,  86,  51,  46,  52,  53,  65,  46,  56,  54,  46,  56, // 5V3.45A.86.8\n  54,  44,  48,  44,  48,  44,  48,  44,  49,  48,  46,  49, // 6,0,0,0,10.1\n  51,  44,  51,  44,  46,  55,  54,  46,  55,  54,  44,  48, // 3,3,.76.76,0\n  44,  48,  44,  48,  44,  49,  48,  44,  50,  46,  56,  52, // ,0,0,10,2.84\n  97,  46,  50,  57,  46,  50,  57,  44,  48,  44,  48,  44, // a.29.29,0,0,\n  48,  45,  46,  49,  50,  45,  46,  49,  44,  49,  46,  52, // 0-.12-.1,1.4\n  57,  44,  49,  46,  52,  57,  44,  48,  44,  48,  44,  48, // 9,1.49,0,0,0\n  45,  49,  45,  46,  51,  55,  72,  50,  46,  51,  57,  86, // -1-.37H2.39V\n  49,  46,  56,  50,  65,  49,  46,  53,  55,  44,  49,  46, // 1.82A1.57,1.\n  53,  55,  44,  48,  44,  48,  44,  49,  44,  52,  44,  46, // 57,0,0,1,4,.\n  50,  53,  72,  49,  49,  65,  49,  46,  53,  55,  44,  49, // 25H11A1.57,1\n  46,  53,  55,  44,  48,  44,  48,  44,  49,  44,  49,  50, // .57,0,0,1,12\n  46,  54,  50,  44,  49,  46,  56,  50,  90,  34,  47,  62, // .62,1.82Z\"/>\n  60, 112,  97, 116, 104,  32,  99, 108,  97, 115, 115,  61, // <path class=\n  34, 108, 108,  45,  99, 108, 115,  45,  49,  34,  32, 100, // \"ll-cls-1\" d\n  61,  34,  77,  49,  48,  46,  52,  56,  44,  49,  48,  46, // =\"M10.48,10.\n  52,  56,  86,  49,  49,  65,  49,  46,  53,  56,  44,  49, // 48V11A1.58,1\n  46,  53,  56,  44,  48,  44,  48,  44,  49,  44,  56,  46, // .58,0,0,1,8.\n  57,  44,  49,  50,  46,  54,  72,  49,  46,  56,  50,  65, // 9,12.6H1.82A\n  49,  46,  53,  55,  44,  49,  46,  53,  55,  44,  48,  44, // 1.57,1.57,0,\n  48,  44,  49,  44,  46,  50,  53,  44,  49,  49,  86,  51, // 0,1,.25,11V3\n  46,  57,  52,  65,  49,  46,  53,  55,  44,  49,  46,  53, // .94A1.57,1.5\n  55,  44,  48,  44,  48,  44,  49,  44,  49,  46,  56,  50, // 7,0,0,1,1.82\n  44,  50,  46,  51,  55,  72,  56,  46,  57,  97,  49,  46, // ,2.37H8.9a1.\n  52,  57,  44,  49,  46,  52,  57,  44,  48,  44,  48,  44, // 49,1.49,0,0,\n  49,  44,  49,  44,  46,  51,  55, 108,  46,  49,  50,  46, // 1,1,.37l.12.\n  49,  97,  46,  55,  54,  46,  55,  54,  44,  48,  44,  48, // 1a.76.76,0,0\n  44,  49,  44,  46,  49,  49,  46,  49,  52,  46,  56,  54, // ,1,.11.14.86\n  46,  56,  54,  44,  48,  44,  48,  44,  49,  44,  46,  49, // .86,0,0,1,.1\n  52,  46,  52,  55,  86,  55,  46,  50,  56,  97,  46,  56, // 4.47V7.28a.8\n  53,  46,  56,  53,  44,  48,  44,  48,  44,  49,  45,  46, // 5.85,0,0,1-.\n  56,  53,  46,  56,  53,  72,  56,  46,  49,  51,  86,  53, // 85.85H8.13V5\n  46,  53,  55,  97,  46,  56,  54,  46,  56,  54,  44,  48, // .57a.86.86,0\n  44,  48,  44,  48,  45,  46,  56,  53,  45,  46,  56,  54, // ,0,0-.85-.86\n  72,  51,  46,  52,  53,  97,  46,  56,  55,  46,  56,  55, // H3.45a.87.87\n  44,  48,  44,  48,  44,  48,  45,  46,  56,  54,  46,  56, // ,0,0,0-.86.8\n  54,  86,  57,  46,  52,  97,  46,  56,  49,  46,  56,  49, // 6V9.4a.81.81\n  44,  48,  44,  48,  44,  48,  44,  46,  49,  53,  46,  52, // ,0,0,0,.15.4\n  56, 108,  46,  49,  46,  49,  50,  97,  46,  54,  57,  46, // 8l.1.12a.69.\n  54,  57,  44,  48,  44,  48,  44,  48,  44,  46,  49,  51, // 69,0,0,0,.13\n  46,  49,  49,  44,  49,  46,  52,  52,  44,  49,  46,  52, // .11,1.44,1.4\n  52,  44,  48,  44,  48,  44,  48,  44,  49,  44,  46,  51, // 4,0,0,0,1,.3\n  55,  90,  34,  47,  62,  60,  47, 103,  62,  60,  47, 103, // 7Z\"/></g></g\n  62,  60,  47, 115, 118, 103,  62,  96,  59,  10,  10, 102, // ></svg>`;..f\n 117, 110,  99, 116, 105, 111, 110,  32,  72, 101,  97, 100, // unction Head\n 101, 114,  40, 123, 108, 111, 103, 111, 117, 116,  44,  32, // er({logout, \n 117, 115, 101, 114,  44,  32, 115, 101, 116,  83, 104, 111, // user, setSho\n 119,  83, 105, 100, 101,  98,  97, 114,  44,  32, 115, 104, // wSidebar, sh\n 111, 119,  83, 105, 100, 101,  98,  97, 114, 125,  41,  32, // owSidebar}) \n 123,  10,  32,  32, 114, 101, 116, 117, 114, 110,  32, 104, // {.  return h\n 116, 109, 108,  96,  10,  60, 100, 105, 118,  32,  99, 108, // tml`.<div cl\n  97, 115, 115,  61,  34,  98, 103,  45, 119, 104, 105, 116, // ass=\"bg-whit\n 101,  32, 115, 116, 105,  99, 107, 121,  32, 116, 111, 112, // e sticky top\n  45,  48,  32, 122,  45,  91,  52,  56,  93,  32, 120, 119, // -0 z-[48] xw\n  45, 102, 117, 108, 108,  32,  98, 111, 114, 100, 101, 114, // -full border\n  45,  98,  32, 112, 121,  45,  50,  32,  36, 123, 115, 104, // -b py-2 ${sh\n 111, 119,  83, 105, 100, 101,  98,  97, 114,  32,  38,  38, // owSidebar &&\n  32,  39, 112, 108,  45,  55,  50,  39, 125,  32, 116, 114, //  'pl-72'} tr\n  97, 110, 115, 105, 116, 105, 111, 110,  45,  97, 108, 108, // ansition-all\n  32, 100, 117, 114,  97, 116, 105, 111, 110,  45,  51,  48, //  duration-30\n  48,  32, 116, 114,  97, 110, 115, 102, 111, 114, 109,  34, // 0 transform\"\n  62,  10,  32,  32,  60, 100, 105, 118,  32,  99, 108,  97, // >.  <div cla\n 115, 115,  61,  34, 112, 120,  45,  50,  32, 119,  45, 102, // ss=\"px-2 w-f\n 117, 108, 108,  32, 112, 121,  45,  48,  32, 109, 121,  45, // ull py-0 my-\n  48,  32, 102, 108, 101, 120,  32, 105, 116, 101, 109, 115, // 0 flex items\n  45,  99, 101, 110, 116, 101, 114,  34,  62,  10,  32,  32, // -center\">.  \n  32,  32,  60,  98, 117, 116, 116, 111, 110,  32, 116, 121, //   <button ty\n 112, 101,  61,  34,  98, 117, 116, 116, 111, 110,  34,  32, // pe=\"button\" \n 111, 110,  99, 108, 105,  99, 107,  61,  36, 123, 101, 118, // onclick=${ev\n  32,  61,  62,  32, 115, 101, 116,  83, 104, 111, 119,  83, //  => setShowS\n 105, 100, 101,  98,  97, 114,  40, 118,  32,  61,  62,  32, // idebar(v => \n  33, 118,  41, 125,  32,  99, 108,  97, 115, 115,  61,  34, // !v)} class=\"\n 116, 101, 120, 116,  45, 115, 108,  97, 116, 101,  45,  52, // text-slate-4\n  48,  48,  34,  62,  10,  32,  32,  32,  32,  32,  32,  60, // 00\">.      <\n  36, 123,  73,  99, 111, 110, 115,  46,  98,  97, 114, 115, // ${Icons.bars\n  51, 125,  32,  99, 108,  97, 115, 115,  61,  34, 104,  45, // 3} class=\"h-\n  54,  34,  32,  47,  62,  10,  32,  32,  32,  32,  60,  47, // 6\" />.    </\n  47,  62,  10,  32,  32,  32,  32,  60, 100, 105, 118,  32, // />.    <div \n  99, 108,  97, 115, 115,  61,  34, 102, 108, 101, 120,  32, // class=\"flex \n 102, 108, 101, 120,  45,  49,  32, 103,  97, 112,  45, 120, // flex-1 gap-x\n  45,  52,  32, 115, 101, 108, 102,  45, 115, 116, 114, 101, // -4 self-stre\n 116,  99, 104,  32, 108, 103,  58, 103,  97, 112,  45, 120, // tch lg:gap-x\n  45,  54,  34,  62,  10,  32,  32,  32,  32,  32,  32,  60, // -6\">.      <\n 100, 105, 118,  32,  99, 108,  97, 115, 115,  61,  34, 114, // div class=\"r\n 101, 108,  97, 116, 105, 118, 101,  32, 102, 108, 101, 120, // elative flex\n  32, 102, 108, 101, 120,  45,  49,  34,  62,  60,  47,  47, //  flex-1\"><//\n  62,  10,  32,  32,  32,  32,  32,  32,  60, 100, 105, 118, // >.      <div\n  32,  99, 108,  97, 115, 115,  61,  34, 102, 108, 101, 120, //  class=\"flex\n  32, 105, 116, 101, 109, 115,  45,  99, 101, 110, 116, 101, //  items-cente\n 114,  32, 103,  97, 112,  45, 120,  45,  52,  32, 108, 103, // r gap-x-4 lg\n  58, 103,  97, 112,  45, 120,  45,  54,  34,  62,  10,  32, // :gap-x-6\">. \n  32,  32,  32,  32,  32,  32,  32,  60, 115, 112,  97, 110, //        <span\n  32,  99, 108,  97, 115, 115,  61,  34, 116, 101, 120, 116, //  class=\"text\n  45, 115, 109,  32, 116, 101, 120, 116,  45, 115, 108,  97, // -sm text-sla\n 116, 101,  45,  52,  48,  48,  34,  62, 108, 111, 103, 103, // te-400\">logg\n 101, 100,  32, 105, 110,  32,  97, 115,  58,  32,  36, 123, // ed in as: ${\n 117, 115, 101, 114, 125,  60,  47,  47,  62,  10,  32,  32, // user}<//>.  \n  32,  32,  32,  32,  32,  32,  60, 100, 105, 118,  32,  99, //       <div c\n 108,  97, 115, 115,  61,  34, 104, 105, 100, 100, 101, 110, // lass=\"hidden\n  32, 108, 103,  58,  98, 108, 111,  99, 107,  32, 108, 103, //  lg:block lg\n  58, 104,  45,  52,  32, 108, 103,  58, 119,  45, 112, 120, // :h-4 lg:w-px\n  32, 108, 103,  58,  98, 103,  45, 103, 114,  97, 121,  45, //  lg:bg-gray-\n  50,  48,  48,  34,  32,  97, 114, 105,  97,  45, 104, 105, // 200\" aria-hi\n 100, 100, 101, 110,  61,  34, 116, 114, 117, 101,  34,  62, // dden=\"true\">\n  60,  47,  47,  62,  10,  32,  32,  32,  32,  32,  32,  32, // <//>.       \n  32,  60,  36, 123,  66, 117, 116, 116, 111, 110, 125,  32, //  <${Button} \n 116, 105, 116, 108, 101,  61,  34,  76, 111, 103, 111, 117, // title=\"Logou\n 116,  34,  32, 105,  99, 111, 110,  61,  36, 123,  73,  99, // t\" icon=${Ic\n 111, 110, 115,  46, 108, 111, 103, 111, 117, 116, 125,  32, // ons.logout} \n 111, 110,  99, 108, 105,  99, 107,  61,  36, 123, 108, 111, // onclick=${lo\n 103, 111, 117, 116, 125,  32,  47,  62,  10,  32,  32,  32, // gout} />.   \n  32,  32,  32,  60,  47,  47,  62,  10,  32,  32,  32,  32, //    <//>.    \n  60,  47,  47,  62,  10,  32,  32,  60,  47,  47,  62,  10, // <//>.  <//>.\n  60,  47,  47,  62,  96,  59,  10, 125,  59,  10,  10,  99, // <//>`;.};..c\n 111, 110, 115, 116,  32,  78,  97, 118,  76, 105, 110, 107, // onst NavLink\n  32,  61,  32,  40, 123, 116, 105, 116, 108, 101,  44,  32, //  = ({title, \n 105,  99, 111, 110,  44,  32, 104, 114, 101, 102,  44,  32, // icon, href, \n 117, 114, 108, 125,  41,  32,  61,  62,  32, 104, 116, 109, // url}) => htm\n 108,  96,  10,  60, 100, 105, 118,  62,  10,  32,  32,  60, // l`.<div>.  <\n  97,  32, 104, 114, 101, 102,  61,  34,  35,  36, 123, 104, // a href=\"#${h\n 114, 101, 102, 125,  34,  32,  99, 108,  97, 115, 115,  61, // ref}\" class=\n  34,  36, 123, 104, 114, 101, 102,  32,  61,  61,  32, 117, // \"${href == u\n 114, 108,  32,  63,  32,  39,  98, 103,  45, 115, 108,  97, // rl ? 'bg-sla\n 116, 101,  45,  53,  48,  32, 116, 101, 120, 116,  45,  98, // te-50 text-b\n 108, 117, 101,  45,  54,  48,  48,  32, 103, 114, 111, 117, // lue-600 grou\n 112,  39,  32,  58,  32,  39, 116, 101, 120, 116,  45, 103, // p' : 'text-g\n 114,  97, 121,  45,  55,  48,  48,  32, 104, 111, 118, 101, // ray-700 hove\n 114,  58, 116, 101, 120, 116,  45,  98, 108, 117, 101,  45, // r:text-blue-\n  54,  48,  48,  32, 104, 111, 118, 101, 114,  58,  98, 103, // 600 hover:bg\n  45, 103, 114,  97, 121,  45,  53,  48,  32, 103, 114, 111, // -gray-50 gro\n 117, 112,  39, 125,  32, 102, 108, 101, 120,  32, 103,  97, // up'} flex ga\n 112,  45, 120,  45,  51,  32, 114, 111, 117, 110, 100, 101, // p-x-3 rounde\n 100,  45, 109, 100,  32, 112,  45,  50,  32, 116, 101, 120, // d-md p-2 tex\n 116,  45, 115, 109,  32, 108, 101,  97, 100, 105, 110, 103, // t-sm leading\n  45,  54,  32, 102, 111, 110, 116,  45, 115, 101, 109, 105, // -6 font-semi\n  98, 111, 108, 100,  34,  62,  10,  32,  32,  32,  32,  60, // bold\">.    <\n  36, 123, 105,  99, 111, 110, 125,  32,  99, 108,  97, 115, // ${icon} clas\n 115,  61,  34, 119,  45,  54,  32, 104,  45,  54,  34,  47, // s=\"w-6 h-6\"/\n  62,  10,  32,  32,  32,  32,  36, 123, 116, 105, 116, 108, // >.    ${titl\n 101, 125,  10,  32,  32,  60,  47,  47,  47,  62,  10,  60, // e}.  <///>.<\n  47,  47,  62,  96,  59,  10,  10, 102, 117, 110,  99, 116, // //>`;..funct\n 105, 111, 110,  32,  83, 105, 100, 101,  98,  97, 114,  40, // ion Sidebar(\n 123, 117, 114, 108,  44,  32, 115, 104, 111, 119, 125,  41, // {url, show})\n  32, 123,  10,  32,  32, 114, 101, 116, 117, 114, 110,  32, //  {.  return \n 104, 116, 109, 108,  96,  10,  60, 100, 105, 118,  32,  99, // html`.<div c\n 108,  97, 115, 115,  61,  34,  98, 103,  45, 118, 105, 111, // lass=\"bg-vio\n 108, 101, 116,  45,  49,  48,  48,  32, 104, 115,  45, 111, // let-100 hs-o\n 118, 101, 114, 108,  97, 121,  32, 104, 115,  45, 111, 118, // verlay hs-ov\n 101, 114, 108,  97, 121,  45, 111, 112, 101, 110,  58, 116, // erlay-open:t\n 114,  97, 110, 115, 108,  97, 116, 101,  45, 120,  45,  48, // ranslate-x-0\n  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, // .           \n  32,  45, 116, 114,  97, 110, 115, 108,  97, 116, 101,  45, //  -translate-\n 120,  45, 102, 117, 108, 108,  32, 116, 114,  97, 110, 115, // x-full trans\n 105, 116, 105, 111, 110,  45,  97, 108, 108,  32, 100, 117, // ition-all du\n 114,  97, 116, 105, 111, 110,  45,  51,  48,  48,  32, 116, // ration-300 t\n 114,  97, 110, 115, 102, 111, 114, 109,  10,  32,  32,  32, // ransform.   \n  32,  32,  32,  32,  32,  32,  32,  32,  32, 102, 105, 120, //          fix\n 101, 100,  32, 116, 111, 112,  45,  48,  32, 108, 101, 102, // ed top-0 lef\n 116,  45,  48,  32,  98, 111, 116, 116, 111, 109,  45,  48, // t-0 bottom-0\n  32, 122,  45,  91,  54,  48,  93,  32, 119,  45,  55,  50, //  z-[60] w-72\n  32,  98, 103,  45, 119, 104, 105, 116, 101,  32,  98, 111, //  bg-white bo\n 114, 100, 101, 114,  45, 114,  10,  32,  32,  32,  32,  32, // rder-r.     \n  32,  32,  32,  32,  32,  32,  32,  98, 111, 114, 100, 101, //        borde\n 114,  45, 103, 114,  97, 121,  45,  50,  48,  48,  32, 111, // r-gray-200 o\n 118, 101, 114, 102, 108, 111, 119,  45, 121,  45,  97, 117, // verflow-y-au\n 116, 111,  32, 115,  99, 114, 111, 108, 108,  98,  97, 114, // to scrollbar\n  45, 121,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32, // -y.         \n  32,  32,  32,  36, 123, 115, 104, 111, 119,  32,  38,  38, //    ${show &&\n  32,  39, 116, 114,  97, 110, 115, 108,  97, 116, 101,  45, //  'translate-\n 120,  45,  48,  39, 125,  32, 114, 105, 103, 104, 116,  45, // x-0'} right-\n  97, 117, 116, 111,  32,  98, 111, 116, 116, 111, 109,  45, // auto bottom-\n  48,  34,  62,  10,  32,  32,  60, 100, 105, 118,  32,  99, // 0\">.  <div c\n 108,  97, 115, 115,  61,  34, 102, 108, 101, 120,  32, 102, // lass=\"flex f\n 108, 101, 120,  45,  99, 111, 108,  32, 109,  45,  52,  32, // lex-col m-4 \n 103,  97, 112,  45, 121,  45,  54,  34,  62,  10,  32,  32, // gap-y-6\">.  \n  32,  32,  60, 100, 105, 118,  32,  99, 108,  97, 115, 115, //   <div class\n  61,  34, 102, 108, 101, 120,  32, 104,  45,  49,  48,  32, // =\"flex h-10 \n 115, 104, 114, 105, 110, 107,  45,  48,  32, 105, 116, 101, // shrink-0 ite\n 109, 115,  45,  99, 101, 110, 116, 101, 114,  32, 103,  97, // ms-center ga\n 112,  45, 120,  45,  52,  32, 102, 111, 110, 116,  45,  98, // p-x-4 font-b\n 111, 108, 100,  32, 116, 101, 120, 116,  45, 120, 108,  32, // old text-xl \n 116, 101, 120, 116,  45, 115, 108,  97, 116, 101,  45,  53, // text-slate-5\n  48,  48,  34,  62,  10,  32,  32,  32,  32,  32,  32,  60, // 00\">.      <\n  36, 123,  76, 111, 103, 111, 125,  32,  99, 108,  97, 115, // ${Logo} clas\n 115,  61,  34, 104,  45, 102, 117, 108, 108,  34,  47,  62, // s=\"h-full\"/>\n  32,  89, 111, 117, 114,  32,  66, 114,  97, 110, 100,  10, //  Your Brand.\n  32,  32,  32,  32,  60,  47,  47,  62,  10,  32,  32,  32, //     <//>.   \n  32,  60, 100, 105, 118,  32,  99, 108,  97, 115, 115,  61, //  <div class=\n  34, 102, 108, 101, 120,  32, 102, 108, 101, 120,  45,  49, // \"flex flex-1\n  32, 102, 108, 101, 120,  45,  99, 111, 108,  34,  62,  10, //  flex-col\">.\n  32,  32,  32,  32,  32,  32,  60,  36, 123,  78,  97, 118, //       <${Nav\n  76, 105, 110, 107, 125,  32, 116, 105, 116, 108, 101,  61, // Link} title=\n  34,  68,  97, 115, 104,  98, 111,  97, 114, 100,  34,  32, // \"Dashboard\" \n 105,  99, 111, 110,  61,  36, 123,  73,  99, 111, 110, 115, // icon=${Icons\n  46, 104, 111, 109, 101, 125,  32, 104, 114, 101, 102,  61, // .home} href=\n  34,  47,  34,  32, 117, 114, 108,  61,  36, 123, 117, 114, // \"/\" url=${ur\n 108, 125,  32,  47,  62,  10,  32,  32,  32,  32,  32,  32, // l} />.      \n  60,  36, 123,  78,  97, 118,  76, 105, 110, 107, 125,  32, // <${NavLink} \n 116, 105, 116, 108, 101,  61,  34,  67, 111, 110, 110, 101, // title=\"Conne\n  99, 116, 101, 100,  32,  68, 101, 118, 105,  99, 101, 115, // cted Devices\n  34,  32, 105,  99, 111, 110,  61,  36, 123,  73,  99, 111, // \" icon=${Ico\n 110, 115,  46, 108, 105, 110, 107, 125,  32, 104, 114, 101, // ns.link} hre\n 102,  61,  34,  47, 100, 101, 118, 105,  99, 101, 115,  34, // f=\"/devices\"\n  32, 117, 114, 108,  61,  36, 123, 117, 114, 108, 125,  32, //  url=${url} \n  47,  62,  10,  32,  32,  32,  32,  32,  32,  60,  36, 123, // />.      <${\n  78,  97, 118,  76, 105, 110, 107, 125,  32, 116, 105, 116, // NavLink} tit\n 108, 101,  61,  34,  70, 105, 114, 101, 119,  97, 108, 108, // le=\"Firewall\n  34,  32, 105,  99, 111, 110,  61,  36, 123,  73,  99, 111, // \" icon=${Ico\n 110, 115,  46, 115, 104, 105, 101, 108, 100, 125,  32, 104, // ns.shield} h\n 114, 101, 102,  61,  34,  47, 102, 105, 114, 101, 119,  97, // ref=\"/firewa\n 108, 108,  34,  32, 117, 114, 108,  61,  36, 123, 117, 114, // ll\" url=${ur\n 108, 125,  32,  47,  62,  10,  32,  32,  32,  32,  32,  32, // l} />.      \n  60,  36, 123,  78,  97, 118,  76, 105, 110, 107, 125,  32, // <${NavLink} \n 116, 105, 116, 108, 101,  61,  34,  68,  72,  67,  80,  34, // title=\"DHCP\"\n  32, 105,  99, 111, 110,  61,  36, 123,  73,  99, 111, 110, //  icon=${Icon\n 115,  46,  98,  97, 114, 115, 100, 111, 119, 110, 125,  32, // s.barsdown} \n 104, 114, 101, 102,  61,  34,  47, 100, 104,  99, 112,  34, // href=\"/dhcp\"\n  32, 117, 114, 108,  61,  36, 123, 117, 114, 108, 125,  32, //  url=${url} \n  47,  62,  10,  32,  32,  32,  32,  32,  32,  60,  36, 123, // />.      <${\n  78,  97, 118,  76, 105, 110, 107, 125,  32, 116, 105, 116, // NavLink} tit\n 108, 101,  61,  34,  65, 100, 109, 105, 110, 105, 115, 116, // le=\"Administ\n 114,  97, 116, 105, 111, 110,  34,  32, 105,  99, 111, 110, // ration\" icon\n  61,  36, 123,  73,  99, 111, 110, 115,  46, 115, 101, 116, // =${Icons.set\n 116, 105, 110, 103, 115, 125,  32, 104, 114, 101, 102,  61, // tings} href=\n  34,  47,  97, 100, 109, 105, 110,  34,  32, 117, 114, 108, // \"/admin\" url\n  61,  36, 123, 117, 114, 108, 125,  32,  47,  62,  10,  32, // =${url} />. \n  32,  32,  32,  60,  47,  47,  62,  10,  32,  32,  60,  47, //    <//>.  </\n  47,  62,  10,  60,  47,  47,  62,  96,  59,  10, 125,  59, // />.<//>`;.};\n  10,  10, 102, 117, 110,  99, 116, 105, 111, 110,  32,  69, // ..function E\n 118, 101, 110, 116, 115,  40, 123, 125,  41,  32, 123,  10, // vents({}) {.\n  32,  32,  99, 111, 110, 115, 116,  32,  91, 101, 118, 101, //   const [eve\n 110, 116, 115,  44,  32, 115, 101, 116,  69, 118, 101, 110, // nts, setEven\n 116, 115,  93,  32,  61,  32, 117, 115, 101,  83, 116,  97, // ts] = useSta\n 116, 101,  40,  91,  93,  41,  59,  10,  32,  32,  99, 111, // te([]);.  co\n 110, 115, 116,  32, 114, 101, 102, 114, 101, 115, 104,  32, // nst refresh \n  61,  32,  40,  41,  32,  61,  62,  32, 102, 101, 116,  99, // = () => fetc\n 104,  40,  39,  97, 112, 105,  47, 101, 118, 101, 110, 116, // h('api/event\n 115,  47, 103, 101, 116,  39,  41,  46, 116, 104, 101, 110, // s/get').then\n  40, 114,  32,  61,  62,  32, 114,  46, 106, 115, 111, 110, // (r => r.json\n  40,  41,  41,  46, 116, 104, 101, 110,  40, 114,  32,  61, // ()).then(r =\n  62,  32, 115, 101, 116,  69, 118, 101, 110, 116, 115,  40, // > setEvents(\n 114,  41,  41,  46,  99,  97, 116,  99, 104,  40, 101,  32, // r)).catch(e \n  61,  62,  32,  99, 111, 110, 115, 111, 108, 101,  46, 108, // => console.l\n 111, 103,  40, 101,  41,  41,  59,  10,  32,  32, 117, 115, // og(e));.  us\n 101,  69, 102, 102, 101,  99, 116,  40, 114, 101, 102, 114, // eEffect(refr\n 101, 115, 104,  44,  32,  91,  93,  41,  59,  10,  10,  32, // esh, []);.. \n  32,  99, 111, 110, 115, 116,  32,  84, 104,  32,  61,  32, //  const Th = \n 112, 114, 111, 112, 115,  32,  61,  62,  32, 104, 116, 109, // props => htm\n 108,  96,  60, 116, 104,  32, 115,  99, 111, 112, 101,  61, // l`<th scope=\n  34,  99, 111, 108,  34,  32,  99, 108,  97, 115, 115,  61, // \"col\" class=\n  34, 115, 116, 105,  99, 107, 121,  32, 116, 111, 112,  45, // \"sticky top-\n  48,  32, 122,  45,  49,  48,  32,  98, 111, 114, 100, 101, // 0 z-10 borde\n 114,  45,  98,  32,  98, 111, 114, 100, 101, 114,  45, 115, // r-b border-s\n 108,  97, 116, 101,  45,  51,  48,  48,  32,  98, 103,  45, // late-300 bg-\n 119, 104, 105, 116, 101,  32,  98, 103,  45, 111, 112,  97, // white bg-opa\n  99, 105, 116, 121,  45,  55,  53,  32, 112, 121,  45,  49, // city-75 py-1\n  46,  53,  32, 112, 120,  45,  52,  32, 116, 101, 120, 116, // .5 px-4 text\n  45, 108, 101, 102, 116,  32, 116, 101, 120, 116,  45, 115, // -left text-s\n 109,  32, 102, 111, 110, 116,  45, 115, 101, 109, 105,  98, // m font-semib\n 111, 108, 100,  32, 116, 101, 120, 116,  45, 115, 108,  97, // old text-sla\n 116, 101,  45,  57,  48,  48,  32,  98,  97,  99, 107, 100, // te-900 backd\n 114, 111, 112,  45,  98, 108, 117, 114,  32,  98,  97,  99, // rop-blur bac\n 107, 100, 114, 111, 112,  45, 102, 105, 108, 116, 101, 114, // kdrop-filter\n  34,  62,  36, 123, 112, 114, 111, 112, 115,  46, 116, 105, // \">${props.ti\n 116, 108, 101, 125,  60,  47, 116, 104,  62,  96,  59,  10, // tle}</th>`;.\n  32,  32,  99, 111, 110, 115, 116,  32,  84, 100,  32,  61, //   const Td =\n  32, 112, 114, 111, 112, 115,  32,  61,  62,  32, 104, 116, //  props => ht\n 109, 108,  96,  60, 116, 100,  32,  99, 108,  97, 115, 115, // ml`<td class\n  61,  34, 119, 104, 105, 116, 101, 115, 112,  97,  99, 101, // =\"whitespace\n  45, 110, 111, 119, 114,  97, 112,  32,  98, 111, 114, 100, // -nowrap bord\n 101, 114,  45,  98,  32,  98, 111, 114, 100, 101, 114,  45, // er-b border-\n 115, 108,  97, 116, 101,  45,  50,  48,  48,  32, 112, 121, // slate-200 py\n  45,  50,  32, 112, 120,  45,  52,  32, 112, 114,  45,  51, // -2 px-4 pr-3\n  32, 116, 101, 120, 116,  45, 115, 109,  32, 116, 101, 120, //  text-sm tex\n 116,  45, 115, 108,  97, 116, 101,  45,  57,  48,  48,  34, // t-slate-900\"\n  62,  36, 123, 112, 114, 111, 112, 115,  46, 116, 101, 120, // >${props.tex\n 116, 125,  60,  47, 116, 100,  62,  96,  59,  10,  32,  32, // t}</td>`;.  \n  99, 111, 110, 115, 116,  32,  80, 114, 105, 111,  32,  61, // const Prio =\n  32,  40, 123, 112, 114, 105, 111, 125,  41,  32,  61,  62, //  ({prio}) =>\n  32, 123,  10,  32,  32,  32,  32,  99, 111, 110, 115, 116, //  {.    const\n  32, 116, 101, 120, 116,  32,  61,  32,  91,  39, 104, 105, //  text = ['hi\n 103, 104,  39,  44,  32,  39, 109, 101, 100, 105, 117, 109, // gh', 'medium\n  39,  44,  32,  39, 108, 111, 119,  39,  93,  91, 112, 114, // ', 'low'][pr\n 105, 111,  93,  59,  10,  32,  32,  32,  32,  99, 111, 110, // io];.    con\n 115, 116,  32,  99, 111, 108, 111, 114, 115,  32,  61,  32, // st colors = \n  91, 116, 105, 112,  67, 111, 108, 111, 114, 115,  46, 114, // [tipColors.r\n 101, 100,  44,  32, 116, 105, 112,  67, 111, 108, 111, 114, // ed, tipColor\n 115,  46, 121, 101, 108, 108, 111, 119,  44,  32, 116, 105, // s.yellow, ti\n 112,  67, 111, 108, 111, 114, 115,  46, 103, 114, 101, 101, // pColors.gree\n 110,  93,  91, 112, 114, 105, 111,  93,  59,  10,  32,  32, // n][prio];.  \n  32,  32, 114, 101, 116, 117, 114, 110,  32, 104, 116, 109, //   return htm\n 108,  96,  60,  36, 123,  67, 111, 108, 111, 114, 101, 100, // l`<${Colored\n 125,  32,  99, 111, 108, 111, 114, 115,  61,  36, 123,  99, // } colors=${c\n 111, 108, 111, 114, 115, 125,  32, 116, 101, 120, 116,  61, // olors} text=\n  36, 123, 116, 101, 120, 116, 125,  32,  47,  62,  96,  59, // ${text} />`;\n  10,  32,  32, 125,  59,  10,  32,  32,  99, 111, 110, 115, // .  };.  cons\n 116,  32,  69, 118, 101, 110, 116,  32,  61,  32,  40, 123, // t Event = ({\n 101, 125,  41,  32,  61,  62,  32, 104, 116, 109, 108,  96, // e}) => html`\n  10,  60, 116, 114,  62,  10,  32,  32,  60,  36, 123,  84, // .<tr>.  <${T\n 100, 125,  32, 116, 101, 120, 116,  61,  36, 123,  91,  39, // d} text=${['\n 110, 101, 116, 119, 111, 114, 107,  39,  44,  32,  39, 111, // network', 'o\n 112, 116, 105,  99,  39,  44,  32,  39, 112, 111, 119, 101, // ptic', 'powe\n 114,  39,  44,  32,  39, 114, 111, 117, 116, 105, 110, 103, // r', 'routing\n  39,  93,  91, 101,  46, 116, 121, 112, 101,  93, 125,  32, // '][e.type]} \n  47,  62,  10,  32,  32,  60,  36, 123,  84, 100, 125,  32, // />.  <${Td} \n 116, 101, 120, 116,  61,  36, 123, 104, 116, 109, 108,  96, // text=${html`\n  60,  36, 123,  80, 114, 105, 111, 125,  32, 112, 114, 105, // <${Prio} pri\n 111,  61,  36, 123, 101,  46, 112, 114, 105, 111, 125,  47, // o=${e.prio}/\n  62,  96, 125,  32,  47,  62,  10,  32,  32,  60,  36, 123, // >`} />.  <${\n  84, 100, 125,  32, 116, 101, 120, 116,  61,  36, 123, 101, // Td} text=${e\n  46, 116, 105, 109, 101,  32, 124, 124,  32,  39,  49,  57, // .time || '19\n  55,  48,  45,  48,  49,  45,  48,  49,  39, 125,  32,  47, // 70-01-01'} /\n  62,  10,  32,  32,  60,  36, 123,  84, 100, 125,  32, 116, // >.  <${Td} t\n 101, 120, 116,  61,  36, 123, 101,  46, 116, 101, 120, 116, // ext=${e.text\n 125,  32,  47,  62,  10,  60,  47,  47,  62,  96,  59,  10, // } />.<//>`;.\n  32,  32,  47,  47,  99, 111, 110, 115, 111, 108, 101,  46, //   //console.\n 108, 111, 103,  40, 101, 118, 101, 110, 116, 115,  41,  59, // log(events);\n  10,  10,  32,  32, 114, 101, 116, 117, 114, 110,  32, 104, // ..  return h\n 116, 109, 108,  96,  10,  60, 100, 105, 118,  32,  99, 108, // tml`.<div cl\n  97, 115, 115,  61,  34, 109,  45,  52,  32, 104,  45,  54, // ass=\"m-4 h-6\n  52,  32, 100, 105, 118, 105, 100, 101,  45, 121,  32, 100, // 4 divide-y d\n 105, 118, 105, 100, 101,  45, 103, 114,  97, 121,  45,  50, // ivide-gray-2\n  48,  48,  32, 111, 118, 101, 114, 102, 108, 111, 119,  45, // 00 overflow-\n  97, 117, 116, 111,  32, 114, 111, 117, 110, 100, 101, 100, // auto rounded\n  32,  98, 103,  45, 119, 104, 105, 116, 101,  34,  62,  10, //  bg-white\">.\n  32,  32,  60, 100, 105, 118,  32,  99, 108,  97, 115, 115, //   <div class\n  61,  34, 102, 111, 110, 116,  45, 108, 105, 103, 104, 116, // =\"font-light\n  32, 117, 112, 112, 101, 114,  99,  97, 115, 101,  32, 102, //  uppercase f\n 108, 101, 120,  32, 105, 116, 101, 109, 115,  45,  99, 101, // lex items-ce\n 110, 116, 101, 114,  32, 116, 101, 120, 116,  45, 115, 108, // nter text-sl\n  97, 116, 101,  45,  54,  48,  48,  32, 112, 120,  45,  52, // ate-600 px-4\n  32, 112, 121,  45,  50,  34,  62,  10,  32,  32,  32,  32, //  py-2\">.    \n  69, 118, 101, 110, 116,  32,  76, 111, 103,  10,  32,  32, // Event Log.  \n  60,  47,  47,  62,  10,  32,  32,  60, 100, 105, 118,  32, // <//>.  <div \n  99, 108,  97, 115, 115,  61,  34, 105, 110, 108, 105, 110, // class=\"inlin\n 101,  45,  98, 108, 111,  99, 107,  32, 109, 105, 110,  45, // e-block min-\n 119,  45, 102, 117, 108, 108,  32, 112, 121,  45,  50,  32, // w-full py-2 \n  97, 108, 105, 103, 110,  45, 109, 105, 100, 100, 108, 101, // align-middle\n  34,  62,  10,  32,  32,  32,  32,  60, 116,  97,  98, 108, // \">.    <tabl\n 101,  32,  99, 108,  97, 115, 115,  61,  34, 109, 105, 110, // e class=\"min\n  45, 119,  45, 102, 117, 108, 108,  32,  98, 111, 114, 100, // -w-full bord\n 101, 114,  45, 115, 101, 112,  97, 114,  97, 116, 101,  32, // er-separate \n  98, 111, 114, 100, 101, 114,  45, 115, 112,  97,  99, 105, // border-spaci\n 110, 103,  45,  48,  34,  62,  10,  32,  32,  32,  32,  32, // ng-0\">.     \n  32,  60, 116, 104, 101,  97, 100,  62,  10,  32,  32,  32, //  <thead>.   \n  32,  32,  32,  32,  32,  60, 116, 114,  62,  10,  32,  32, //      <tr>.  \n  32,  32,  32,  32,  32,  32,  32,  32,  60,  36, 123,  84, //         <${T\n 104, 125,  32, 116, 105, 116, 108, 101,  61,  34,  84, 121, // h} title=\"Ty\n 112, 101,  34,  32,  47,  62,  10,  32,  32,  32,  32,  32, // pe\" />.     \n  32,  32,  32,  32,  32,  60,  36, 123,  84, 104, 125,  32, //      <${Th} \n 116, 105, 116, 108, 101,  61,  34,  80, 114, 105, 111,  34, // title=\"Prio\"\n  32,  47,  62,  10,  32,  32,  32,  32,  32,  32,  32,  32, //  />.        \n  32,  32,  60,  36, 123,  84, 104, 125,  32, 116, 105, 116, //   <${Th} tit\n 108, 101,  61,  34,  84, 105, 109, 101,  34,  32,  47,  62, // le=\"Time\" />\n  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  60, // .          <\n  36, 123,  84, 104, 125,  32, 116, 105, 116, 108, 101,  61, // ${Th} title=\n  34,  68, 101, 115,  99, 114, 105, 112, 116, 105, 111, 110, // \"Description\n  34,  32,  47,  62,  10,  32,  32,  32,  32,  32,  32,  32, // \" />.       \n  32,  60,  47, 116, 114,  62,  10,  32,  32,  32,  32,  32, //  </tr>.     \n  32,  60,  47, 116, 104, 101,  97, 100,  62,  10,  32,  32, //  </thead>.  \n  32,  32,  32,  32,  60, 116,  98, 111, 100, 121,  62,  10, //     <tbody>.\n  32,  32,  32,  32,  32,  32,  32,  32,  36, 123, 101, 118, //         ${ev\n 101, 110, 116, 115,  46, 109,  97, 112,  40, 101,  32,  61, // ents.map(e =\n  62,  32, 104,  40,  69, 118, 101, 110, 116,  44,  32, 123, // > h(Event, {\n 101, 125,  41,  41, 125,  10,  32,  32,  32,  32,  32,  32, // e}))}.      \n  60,  47, 116,  98, 111, 100, 121,  62,  10,  32,  32,  32, // </tbody>.   \n  32,  60,  47, 116,  97,  98, 108, 101,  62,  10,  32,  32, //  </table>.  \n  60,  47,  47,  62,  10,  60,  47,  47,  62,  96,  59,  10, // <//>.<//>`;.\n 125,  59,  10,  10, 102, 117, 110,  99, 116, 105, 111, 110, // };..function\n  32,  77, 111, 100, 101, 109,  83, 116,  97, 116, 117, 115, //  ModemStatus\n  40, 123, 125,  41,  32, 123,  10,  32,  32,  99, 111, 110, // ({}) {.  con\n 115, 116,  32, 116, 104,  32,  61,  32, 112, 114, 111, 112, // st th = prop\n 115,  32,  61,  62,  32, 104, 116, 109, 108,  96,  60, 116, // s => html`<t\n 104,  32, 115,  99, 111, 112, 101,  61,  34,  99, 111, 108, // h scope=\"col\n  34,  32,  99, 108,  97, 115, 115,  61,  34, 112, 120,  45, // \" class=\"px-\n  52,  32, 112, 121,  45,  51,  32, 116, 101, 120, 116,  45, // 4 py-3 text-\n 120, 115,  32, 116, 101, 120, 116,  45, 108, 101, 102, 116, // xs text-left\n  32, 102, 111, 110, 116,  45, 108, 105, 103, 104, 116,  32, //  font-light \n 117, 112, 112, 101, 114,  99,  97, 115, 101,  32, 116, 101, // uppercase te\n 120, 116,  45, 103, 114,  97, 121,  45,  56,  48,  48,  34, // xt-gray-800\"\n  62,  32,  36, 123, 112, 114, 111, 112, 115,  46, 116, 105, // > ${props.ti\n 116, 108, 101, 125,  32,  60,  47,  47,  62,  96,  59,  10, // tle} <//>`;.\n  32,  32,  99, 111, 110, 115, 116,  32, 116, 100,  32,  61, //   const td =\n  32, 112, 114, 111, 112, 115,  32,  61,  62,  32, 104, 116, //  props => ht\n 109, 108,  96,  60, 116, 100,  32, 115,  99, 111, 112, 101, // ml`<td scope\n  61,  34,  99, 111, 108,  34,  32,  99, 108,  97, 115, 115, // =\"col\" class\n  61,  34, 112, 120,  45,  52,  32, 112, 121,  45,  51,  32, // =\"px-4 py-3 \n 116, 101, 120, 116,  45, 115, 109,  32, 116, 101, 120, 116, // text-sm text\n  45, 108, 101, 102, 116,  32, 102, 111, 110, 116,  45, 110, // -left font-n\n 111, 114, 109,  97, 108,  32, 116, 101, 120, 116,  45, 103, // ormal text-g\n 114,  97, 121,  45,  56,  48,  48,  34,  62,  32,  36, 123, // ray-800\"> ${\n 112, 114, 111, 112, 115,  46, 116, 101, 120, 116, 125,  32, // props.text} \n  60,  47,  47,  62,  96,  59,  10,  32,  32,  99, 111, 110, // <//>`;.  con\n 115, 116,  32, 116, 114,  32,  61,  32, 112, 114, 111, 112, // st tr = prop\n 115,  32,  61,  62,  32, 104, 116, 109, 108,  96,  60, 116, // s => html`<t\n 114,  32,  99, 108,  97, 115, 115,  61,  34, 104, 111, 118, // r class=\"hov\n 101, 114,  58,  98, 103,  45, 115, 108,  97, 116, 101,  45, // er:bg-slate-\n  53,  48,  34,  62,  36, 123, 112, 114, 111, 112, 115,  46, // 50\">${props.\n  99, 111, 108, 115,  46, 109,  97, 112,  40, 116, 101, 120, // cols.map(tex\n 116,  32,  61,  62,  32, 104,  40, 116, 100,  44,  32, 123, // t => h(td, {\n 116, 101, 120, 116, 125,  41,  41, 125,  60,  47,  47,  62, // text}))}<//>\n  96,  59,  10,  10,  32,  32, 114, 101, 116, 117, 114, 110, // `;..  return\n  32, 104, 116, 109, 108,  96,  10,  60, 100, 105, 118,  32, //  html`.<div \n  99, 108,  97, 115, 115,  61,  34, 109,  45,  52,  32, 100, // class=\"m-4 d\n 105, 118, 105, 100, 101,  45, 121,  32, 100, 105, 118, 105, // ivide-y divi\n 100, 101,  45, 103, 114,  97, 121,  45,  50,  48,  48,  32, // de-gray-200 \n 111, 118, 101, 114, 102, 108, 111, 119,  45,  97, 117, 116, // overflow-aut\n 111,  32, 114, 111, 117, 110, 100, 101, 100,  32,  98, 103, // o rounded bg\n  45, 119, 104, 105, 116, 101,  34,  62,  10,  32,  32,  60, // -white\">.  <\n 100, 105, 118,  32,  99, 108,  97, 115, 115,  61,  34, 102, // div class=\"f\n 111, 110, 116,  45, 108, 105, 103, 104, 116,  32, 117, 112, // ont-light up\n 112, 101, 114,  99,  97, 115, 101,  32, 102, 108, 101, 120, // percase flex\n  32, 105, 116, 101, 109, 115,  45,  99, 101, 110, 116, 101, //  items-cente\n 114,  32, 116, 101, 120, 116,  45, 103, 114,  97, 121,  45, // r text-gray-\n  54,  48,  48,  32, 112, 120,  45,  52,  32, 112, 121,  45, // 600 px-4 py-\n  50,  34,  62,  10,  32,  32,  32,  32,  67,  97,  98, 108, // 2\">.    Cabl\n 101,  32,  77, 111, 100, 101, 109,  32,  83, 116,  97, 116, // e Modem Stat\n 117, 115,  10,  32,  32,  60,  47,  47,  62,  10,  32,  32, // us.  <//>.  \n  60, 116,  97,  98, 108, 101,  32,  99, 108,  97, 115, 115, // <table class\n  61,  34, 109, 105, 110,  45, 119,  45, 102, 117, 108, 108, // =\"min-w-full\n  32, 100, 105, 118, 105, 100, 101,  45, 121,  32, 100, 105, //  divide-y di\n 118, 105, 100, 101,  45, 103, 114,  97, 121,  45,  50,  48, // vide-gray-20\n  48,  32, 100,  97, 114, 107,  58, 100, 105, 118, 105, 100, // 0 dark:divid\n 101,  45, 103, 114,  97, 121,  45,  55,  48,  48,  34,  62, // e-gray-700\">\n  10,  32,  32,  32,  32,  60, 116, 104, 101,  97, 100,  32, // .    <thead \n  99, 108,  97, 115, 115,  61,  34,  34,  62,  10,  32,  32, // class=\"\">.  \n  32,  32,  32,  32,  60, 116, 114,  62,  10,  32,  32,  32, //     <tr>.   \n  32,  32,  32,  32,  32,  60,  36, 123, 116, 104, 125,  32, //      <${th} \n 116, 105, 116, 108, 101,  61,  34,  34,  32,  47,  62,  10, // title=\"\" />.\n  32,  32,  32,  32,  32,  32,  32,  32,  60,  36, 123, 116, //         <${t\n 104, 125,  32, 116, 105, 116, 108, 101,  61,  34,  83, 116, // h} title=\"St\n  97, 116, 117, 115,  34,  32,  47,  62,  10,  32,  32,  32, // atus\" />.   \n  32,  32,  32,  32,  32,  60,  36, 123, 116, 104, 125,  32, //      <${th} \n 116, 105, 116, 108, 101,  61,  34,  67, 111, 109, 109, 101, // title=\"Comme\n 110, 116,  34,  32,  47,  62,  10,  32,  32,  32,  32,  32, // nt\" />.     \n  32,  60,  47, 116, 114,  62,  10,  32,  32,  32,  32,  60, //  </tr>.    <\n  47, 116, 104, 101,  97, 100,  62,  10,  32,  32,  32,  32, // /thead>.    \n  60, 116,  98, 111, 100, 121,  62,  10,  32,  32,  32,  32, // <tbody>.    \n  32,  32,  60,  36, 123, 116, 114, 125,  32,  99, 111, 108, //   <${tr} col\n 115,  61,  36, 123,  91,  39,  68, 111, 119, 110, 115, 116, // s=${['Downst\n 114, 101,  97, 109,  32,  67, 104,  97, 110, 110, 101, 108, // ream Channel\n  32,  40,  72, 122,  41,  39,  44,  32,  39,  52,  56,  50, //  (Hz)', '482\n  48,  48,  48,  48,  48,  48,  48,  39,  44,  32,  39,  76, // 0000000', 'L\n 111,  99, 107, 101, 100,  39,  93, 125,  32,  47,  62,  10, // ocked']} />.\n  32,  32,  32,  32,  32,  32,  60,  36, 123, 116, 114, 125, //       <${tr}\n  32,  99, 111, 108, 115,  61,  36, 123,  91,  39,  85, 112, //  cols=${['Up\n 115, 116, 114, 101,  97, 109,  32,  67, 104,  97, 110, 110, // stream Chann\n 101, 108,  32,  40,  72, 122,  41,  39,  44,  32,  39,  51, // el (Hz)', '3\n  50,  56,  48,  48,  48,  48,  39,  44,  32,  39,  82,  97, // 280000', 'Ra\n 110, 103, 101, 100,  39,  93, 125,  32,  47,  62,  10,  32, // nged']} />. \n  32,  32,  32,  32,  32,  60,  36, 123, 116, 114, 125,  32, //      <${tr} \n  99, 111, 108, 115,  61,  36, 123,  91,  39,  80, 114, 111, // cols=${['Pro\n 118, 105, 115, 105, 111, 110, 105, 110, 103,  32,  83, 116, // visioning St\n  97, 116, 101,  39,  44,  32,  39,  79, 110, 108, 105, 110, // ate', 'Onlin\n 101,  39,  44,  32,  39,  79, 112, 101, 114,  97, 116, 105, // e', 'Operati\n 111, 110,  97, 108,  39,  93, 125,  32,  47,  62,  10,  32, // onal']} />. \n  32,  32,  32,  60,  47, 116,  98, 111, 100, 121,  62,  10, //    </tbody>.\n  32,  32,  60,  47,  47,  62,  10,  60,  47,  47,  62,  96, //   <//>.<//>`\n  59,  10, 125,  59,  10,  10,  99, 111, 110, 115, 116,  32, // ;.};..const \n 114,  97, 110, 103, 101,  32,  61,  32,  40, 115, 116,  97, // range = (sta\n 114, 116,  44,  32, 115, 105, 122, 101,  44,  32, 115, 116, // rt, size, st\n 101, 112,  41,  32,  61,  62,  32,  65, 114, 114,  97, 121, // ep) => Array\n  46, 102, 114, 111, 109,  40, 123, 108, 101, 110, 103, 116, // .from({lengt\n 104,  58,  32, 115, 105, 122, 101, 125,  44,  32,  40,  95, // h: size}, (_\n  44,  32, 105,  41,  32,  61,  62,  32, 105,  32,  42,  32, // , i) => i * \n  40, 115, 116, 101, 112,  32, 124, 124,  32,  49,  41,  32, // (step || 1) \n  43,  32, 115, 116,  97, 114, 116,  41,  59,  10,  10, 102, // + start);..f\n 117, 110,  99, 116, 105, 111, 110,  32,  83, 112, 101, 101, // unction Spee\n 100,  67, 104,  97, 114, 116,  40, 123, 115, 116,  97, 116, // dChart({stat\n 115, 125,  41,  32, 123,  10,  32,  32,  99, 111, 110, 115, // s}) {.  cons\n 116,  32, 117, 115,  32,  61,  32, 115, 116,  97, 116, 115, // t us = stats\n  46, 117, 112, 108, 111,  97, 100,  95, 115, 112, 101, 101, // .upload_spee\n 100,  44,  32, 100, 115,  32,  61,  32, 115, 116,  97, 116, // d, ds = stat\n 115,  46, 100, 111, 119, 110, 108, 111,  97, 100,  95, 115, // s.download_s\n 112, 101, 101, 100,  59,  10,  32,  32,  99, 111, 110, 115, // peed;.  cons\n 116,  32, 110,  32,  61,  32, 117, 115,  46, 108, 101, 110, // t n = us.len\n 103, 116, 104,  32,  47,  42,  32, 101, 110, 116, 114, 105, // gth /* entri\n 101, 115,  32,  42,  47,  44,  32, 119,  32,  61,  32,  50, // es */, w = 2\n  48,  32,  47,  42,  32, 101, 110, 116, 114, 121,  32, 119, // 0 /* entry w\n 105, 100, 116, 104,  32,  42,  47,  44,  32, 108, 115,  32, // idth */, ls \n  61,  32,  49,  53,  47,  42,  32, 108, 101, 102, 116,  32, // = 15/* left \n 115, 112,  97,  99, 101,  32,  42,  47,  59,  10,  32,  32, // space */;.  \n  99, 111, 110, 115, 116,  32, 104,  32,  61,  32,  49,  48, // const h = 10\n  48,  32,  47,  42,  32, 103, 114,  97, 112, 104,  32, 104, // 0 /* graph h\n 101, 105, 103, 104, 116,  32,  42,  47,  44,  32, 121, 116, // eight */, yt\n 105,  99, 107, 115,  32,  61,  32,  53,  32,  47,  42,  32, // icks = 5 /* \n  89,  32,  97, 120, 105, 115,  32, 116, 105,  99, 107, 115, // Y axis ticks\n  32,  42,  47,  44,  32,  98, 115,  32,  61,  32,  49,  48, //  */, bs = 10\n  32,  47,  42,  32,  98, 111, 116, 116, 111, 109,  32, 115, //  /* bottom s\n 112,  97,  99, 101,  32,  42,  47,  59,  10,  32,  32,  99, // pace */;.  c\n 111, 110, 115, 116,  32, 121, 109,  97, 120,  32,  61,  32, // onst ymax = \n  53,  48,  48,  59,  10,  32,  32,  99, 111, 110, 115, 116, // 500;.  const\n  32, 121, 116,  32,  61,  32, 105,  32,  61,  62,  32,  40, //  yt = i => (\n 104,  32,  45,  32,  98, 115,  41,  32,  47,  32, 121, 116, // h - bs) / yt\n 105,  99, 107, 115,  32,  42,  32,  40, 105,  32,  43,  32, // icks * (i + \n  49,  41,  59,  10,  32,  32,  99, 111, 110, 115, 116,  32, // 1);.  const \n  98, 104,  32,  61,  32, 112,  32,  61,  62,  32,  40, 104, // bh = p => (h\n  32,  45,  32,  98, 115,  41,  32,  42,  32, 112,  32,  47, //  - bs) * p /\n  32,  49,  48,  48,  59,  32,  47,  47,  32,  66,  97, 114, //  100; // Bar\n  32, 104, 101, 105, 103, 104, 116,  10,  32,  32,  99, 111, //  height.  co\n 110, 115, 116,  32,  98, 121,  32,  61,  32, 112,  32,  61, // nst by = p =\n  62,  32,  40, 104,  32,  45,  32,  98, 115,  41,  32,  45, // > (h - bs) -\n  32,  98, 104,  40, 112,  41,  59,  10,  32,  32,  47,  47, //  bh(p);.  //\n  32,  99, 111, 110, 115, 111, 108, 101,  46, 108, 111, 103, //  console.log\n  40, 100, 115,  41,  59,  10,  32,  32, 114, 101, 116, 117, // (ds);.  retu\n 114, 110,  32, 104, 116, 109, 108,  96,  10,  60, 100, 105, // rn html`.<di\n 118,  32,  99, 108,  97, 115, 115,  61,  34, 109,  45,  52, // v class=\"m-4\n  32, 100, 105, 118, 105, 100, 101,  45, 121,  32, 100, 105, //  divide-y di\n 118, 105, 100, 101,  45, 103, 114,  97, 121,  45,  50,  48, // vide-gray-20\n  48,  32, 111, 118, 101, 114, 102, 108, 111, 119,  45,  97, // 0 overflow-a\n 117, 116, 111,  32, 114, 111, 117, 110, 100, 101, 100,  32, // uto rounded \n  98, 103,  45, 119, 104, 105, 116, 101,  34,  62,  10,  32, // bg-white\">. \n  32,  60, 100, 105, 118,  32,  99, 108,  97, 115, 115,  61, //  <div class=\n  34, 102, 111, 110, 116,  45, 108, 105, 103, 104, 116,  32, // \"font-light \n 117, 112, 112, 101, 114,  99,  97, 115, 101,  32, 102, 108, // uppercase fl\n 101, 120,  32, 105, 116, 101, 109, 115,  45,  99, 101, 110, // ex items-cen\n 116, 101, 114,  32, 116, 101, 120, 116,  45, 103, 114,  97, // ter text-gra\n 121,  45,  54,  48,  48,  32, 112, 120,  45,  52,  32, 112, // y-600 px-4 p\n 121,  45,  50,  34,  62,  10,  32,  32,  32,  32,  73, 110, // y-2\">.    In\n 116, 101, 114, 110, 101, 116,  32,  83, 112, 101, 101, 100, // ternet Speed\n  44,  32, 108,  97, 115, 116,  32,  50,  52, 104,  10,  32, // , last 24h. \n  32,  60,  47,  47,  62,  10,  32,  32,  60, 100, 105, 118, //  <//>.  <div\n  32,  99, 108,  97, 115, 115,  61,  34, 114, 101, 108,  97, //  class=\"rela\n 116, 105, 118, 101,  34,  62,  10,  32,  32,  32,  32,  60, // tive\">.    <\n 115, 118, 103,  32,  99, 108,  97, 115, 115,  61,  34,  98, // svg class=\"b\n 103,  45, 121, 101, 108, 108, 111, 119,  45, 120,  53,  48, // g-yellow-x50\n  32, 119,  45, 102, 117, 108, 108,  32, 112,  45,  52,  34, //  w-full p-4\"\n  32, 118, 105, 101, 119,  66, 111, 120,  61,  34,  48,  32, //  viewBox=\"0 \n  48,  32,  36, 123, 110,  42, 119,  43, 108, 115, 125,  32, // 0 ${n*w+ls} \n  36, 123, 104, 125,  34,  62,  10,  32,  32,  32,  32,  32, // ${h}\">.     \n  32,  36, 123, 114,  97, 110, 103, 101,  40,  48,  44,  32, //  ${range(0, \n 121, 116, 105,  99, 107, 115,  41,  46, 109,  97, 112,  40, // yticks).map(\n 105,  32,  61,  62,  32, 104, 116, 109, 108,  96,  10,  32, // i => html`. \n  32,  32,  32,  32,  32,  32,  32,  60, 108, 105, 110, 101, //        <line\n  32, 120,  49,  61,  48,  32, 121,  49,  61,  36, 123, 121, //  x1=0 y1=${y\n 116,  40, 105,  41, 125,  32, 120,  50,  61,  36, 123, 108, // t(i)} x2=${l\n 115,  43, 110,  42, 119, 125,  32, 121,  50,  61,  36, 123, // s+n*w} y2=${\n 121, 116,  40, 105,  41, 125,  32, 115, 116, 114, 111, 107, // yt(i)} strok\n 101,  45, 119, 105, 100, 116, 104,  61,  48,  46,  51,  32, // e-width=0.3 \n  99, 108,  97, 115, 115,  61,  34, 115, 116, 114, 111, 107, // class=\"strok\n 101,  45, 115, 108,  97, 116, 101,  45,  51,  48,  48,  34, // e-slate-300\"\n  32, 115, 116, 114, 111, 107, 101,  45, 100,  97, 115, 104, //  stroke-dash\n  97, 114, 114,  97, 121,  61,  34,  49,  44,  49,  34,  32, // array=\"1,1\" \n  47,  62,  10,  32,  32,  32,  32,  32,  32,  32,  32,  60, // />.        <\n 116, 101, 120, 116,  32, 120,  61,  48,  32, 121,  61,  36, // text x=0 y=$\n 123, 121, 116,  40, 105,  41,  45,  50, 125,  32,  99, 108, // {yt(i)-2} cl\n  97, 115, 115,  61,  34, 116, 101, 120, 116,  45,  91,  54, // ass=\"text-[6\n 112, 120,  93,  32, 102, 105, 108, 108,  45, 115, 108,  97, // px] fill-sla\n 116, 101,  45,  52,  48,  48,  34,  62,  36, 123, 121, 109, // te-400\">${ym\n  97, 120,  45, 121, 109,  97, 120,  47, 121, 116, 105,  99, // ax-ymax/ytic\n 107, 115,  42,  40, 105,  43,  49,  41, 125,  60,  47,  47, // ks*(i+1)}<//\n  62,  10,  32,  32,  32,  32,  32,  32,  96,  41, 125,  10, // >.      `)}.\n  32,  32,  32,  32,  32,  32,  36, 123, 114,  97, 110, 103, //       ${rang\n 101,  40,  48,  44,  32, 110,  41,  46, 109,  97, 112,  40, // e(0, n).map(\n 120,  32,  61,  62,  32, 104, 116, 109, 108,  96,  10,  32, // x => html`. \n  32,  32,  32,  32,  32,  32,  32,  60, 114, 101,  99, 116, //        <rect\n  32, 120,  61,  36, 123, 108, 115,  43, 120,  42, 119, 125, //  x=${ls+x*w}\n  32, 121,  61,  36, 123,  98, 121,  40, 100, 115,  91, 120, //  y=${by(ds[x\n  93,  42,  49,  48,  48,  47, 121, 109,  97, 120,  41, 125, // ]*100/ymax)}\n  32, 119, 105, 100, 116, 104,  61,  56,  32, 104, 101, 105, //  width=8 hei\n 103, 104, 116,  61,  36, 123,  98, 104,  40, 100, 115,  91, // ght=${bh(ds[\n 120,  93,  42,  49,  48,  48,  47, 121, 109,  97, 120,  41, // x]*100/ymax)\n 125,  32, 114, 120,  61,  50,  32,  99, 108,  97, 115, 115, // } rx=2 class\n  61,  34, 102, 105, 108, 108,  45, 115, 107, 121,  45,  56, // =\"fill-sky-8\n  48,  48,  34,  32,  47,  62,  10,  32,  32,  32,  32,  32, // 00\" />.     \n  32,  32,  32,  60, 114, 101,  99, 116,  32, 120,  61,  36, //    <rect x=$\n 123, 108, 115,  43, 120,  42, 119,  43,  56, 125,  32, 121, // {ls+x*w+8} y\n  61,  36, 123,  98, 121,  40, 117, 115,  91, 120,  93,  42, // =${by(us[x]*\n  49,  48,  48,  47, 121, 109,  97, 120,  41, 125,  32, 119, // 100/ymax)} w\n 105, 100, 116, 104,  61,  56,  32, 104, 101, 105, 103, 104, // idth=8 heigh\n 116,  61,  36, 123,  98, 104,  40, 117, 115,  91, 120,  93, // t=${bh(us[x]\n  42,  49,  48,  48,  47, 121, 109,  97, 120,  41, 125,  32, // *100/ymax)} \n 114, 120,  61,  50,  32,  99, 108,  97, 115, 115,  61,  34, // rx=2 class=\"\n 102, 105, 108, 108,  45, 115, 107, 121,  45,  52,  48,  48, // fill-sky-400\n  34,  32,  47,  62,  10,  32,  32,  32,  32,  32,  32,  32, // \" />.       \n  32,  60, 116, 101, 120, 116,  32, 120,  61,  36, 123, 108, //  <text x=${l\n 115,  43, 120,  42, 119, 125,  32, 121,  61,  49,  48,  48, // s+x*w} y=100\n  32,  99, 108,  97, 115, 115,  61,  34, 116, 101, 120, 116, //  class=\"text\n  45,  91,  54, 112, 120,  93,  32, 102, 105, 108, 108,  45, // -[6px] fill-\n 115, 108,  97, 116, 101,  45,  52,  48,  48,  34,  62,  36, // slate-400\">$\n 123, 120,  42,  50, 125,  58,  48,  48,  60,  47,  47,  62, // {x*2}:00<//>\n  10,  32,  32,  32,  32,  32,  32,  96,  41, 125,  10,  32, // .      `)}. \n  32,  32,  32,  60,  47,  47,  62,  10,  32,  32,  60,  47, //    <//>.  </\n  47,  62,  10,  60,  47,  47,  62,  96,  59,  10, 125,  59, // />.<//>`;.};\n  10,  10, 102, 117, 110,  99, 116, 105, 111, 110,  32,  77, // ..function M\n  97, 105, 110,  40, 123, 125,  41,  32, 123,  10,  32,  32, // ain({}) {.  \n  99, 111, 110, 115, 116,  32,  91, 115, 116,  97, 116, 115, // const [stats\n  44,  32, 115, 101, 116,  83, 116,  97, 116, 115,  93,  32, // , setStats] \n  61,  32, 117, 115, 101,  83, 116,  97, 116, 101,  40, 110, // = useState(n\n 117, 108, 108,  41,  59,  10,  32,  32,  99, 111, 110, 115, // ull);.  cons\n 116,  32, 114, 101, 102, 114, 101, 115, 104,  32,  61,  32, // t refresh = \n  40,  41,  32,  61,  62,  32, 102, 101, 116,  99, 104,  40, // () => fetch(\n  39,  97, 112, 105,  47, 115, 116,  97, 116, 115,  47, 103, // 'api/stats/g\n 101, 116,  39,  41,  46, 116, 104, 101, 110,  40, 114,  32, // et').then(r \n  61,  62,  32, 114,  46, 106, 115, 111, 110,  40,  41,  41, // => r.json())\n  46, 116, 104, 101, 110,  40, 114,  32,  61,  62,  32, 115, // .then(r => s\n 101, 116,  83, 116,  97, 116, 115,  40, 114,  41,  41,  59, // etStats(r));\n  10,  32,  32, 117, 115, 101,  69, 102, 102, 101,  99, 116, // .  useEffect\n  40, 114, 101, 102, 114, 101, 115, 104,  44,  32,  91,  93, // (refresh, []\n  41,  59,  10,  32,  32, 105, 102,  32,  40,  33, 115, 116, // );.  if (!st\n  97, 116, 115,  41,  32, 114, 101, 116, 117, 114, 110,  32, // ats) return \n  39,  39,  59,  10,  32,  32, 114, 101, 116, 117, 114, 110, // '';.  return\n  32, 104, 116, 109, 108,  96,  10,  60, 100, 105, 118,  32, //  html`.<div \n  99, 108,  97, 115, 115,  61,  34, 112,  45,  50,  34,  62, // class=\"p-2\">\n  10,  32,  32,  60, 100, 105, 118,  32,  99, 108,  97, 115, // .  <div clas\n 115,  61,  34, 109,  97, 120,  45, 119,  45,  91,  56,  53, // s=\"max-w-[85\n 114, 101, 109,  93,  32, 112, 120,  45,  52,  32, 115, 109, // rem] px-4 sm\n  58, 112, 120,  45,  50,  32, 108, 103,  58, 112, 120,  45, // :px-2 lg:px-\n  52,  32, 108, 103,  58, 112, 121,  45,  52,  32, 109, 120, // 4 lg:py-4 mx\n  45,  97, 117, 116, 111,  34,  62,  10,  32,  32,  32,  32, // -auto\">.    \n  60, 100, 105, 118,  32,  99, 108,  97, 115, 115,  61,  34, // <div class=\"\n 103, 114, 105, 100,  32, 115, 109,  58, 103, 114, 105, 100, // grid sm:grid\n  45,  99, 111, 108, 115,  45,  50,  32, 108, 103,  58, 103, // -cols-2 lg:g\n 114, 105, 100,  45,  99, 111, 108, 115,  45,  52,  32, 103, // rid-cols-4 g\n  97, 112,  45,  52,  32, 115, 109,  58, 103,  97, 112,  45, // ap-4 sm:gap-\n  54,  34,  62,  10,  32,  32,  32,  32,  32,  32,  60,  36, // 6\">.      <$\n 123,  83, 116,  97, 116, 125,  32, 116, 105, 116, 108, 101, // {Stat} title\n  61,  34,  68, 111, 119, 110, 108, 111,  97, 100,  32,  83, // =\"Download S\n 112, 101, 101, 100,  34,  32, 116, 101, 120, 116,  61,  34, // peed\" text=\"\n  36, 123, 115, 116,  97, 116, 115,  46, 100, 111, 119, 110, // ${stats.down\n 108, 111,  97, 100,  95, 115, 112, 101, 101, 100,  91,  48, // load_speed[0\n  93, 125,  32,  77,  98, 112, 115,  34,  32, 116, 105, 112, // ]} Mbps\" tip\n  84, 101, 120, 116,  61,  34, 115, 108, 111, 119,  34,  32, // Text=\"slow\" \n 116, 105, 112,  73,  99, 111, 110,  61,  36, 123,  73,  99, // tipIcon=${Ic\n 111, 110, 115,  46,  97, 108, 101, 114, 116, 125,  32, 116, // ons.alert} t\n 105, 112,  67, 111, 108, 111, 114, 115,  61,  36, 123, 116, // ipColors=${t\n 105, 112,  67, 111, 108, 111, 114, 115,  46, 114, 101, 100, // ipColors.red\n 125,  32,  47,  62,  10,  32,  32,  32,  32,  32,  32,  60, // } />.      <\n  36, 123,  83, 116,  97, 116, 125,  32, 116, 105, 116, 108, // ${Stat} titl\n 101,  61,  34,  85, 112, 108, 111,  97, 100,  32,  83, 112, // e=\"Upload Sp\n 101, 101, 100,  34,  32, 116, 101, 120, 116,  61,  34,  36, // eed\" text=\"$\n 123, 115, 116,  97, 116, 115,  46, 117, 112, 108, 111,  97, // {stats.uploa\n 100,  95, 115, 112, 101, 101, 100,  91,  48,  93, 125,  32, // d_speed[0]} \n  77,  98, 112, 115,  34,  32, 116, 105, 112,  84, 101, 120, // Mbps\" tipTex\n 116,  61,  34, 103, 111, 111, 100,  34,  32, 116, 105, 112, // t=\"good\" tip\n  73,  99, 111, 110,  61,  36, 123,  73,  99, 111, 110, 115, // Icon=${Icons\n  46, 111, 107, 125,  32, 116, 105, 112,  67, 111, 108, 111, // .ok} tipColo\n 114, 115,  61,  36, 123, 116, 105, 112,  67, 111, 108, 111, // rs=${tipColo\n 114, 115,  46, 103, 114, 101, 101, 110, 125,  32,  47,  62, // rs.green} />\n  10,  32,  32,  32,  32,  32,  32,  60,  36, 123,  83, 116, // .      <${St\n  97, 116, 125,  32, 116, 105, 116, 108, 101,  61,  34,  68, // at} title=\"D\n  97, 105, 108, 121,  32,  68, 111, 119, 110, 108, 111,  97, // aily Downloa\n 100, 101, 100,  34,  32, 116, 101, 120, 116,  61,  34,  36, // ded\" text=\"$\n 123, 115, 116,  97, 116, 115,  46, 100, 111, 119, 110, 108, // {stats.downl\n 111,  97, 100, 101, 100, 125,  32,  77,  98,  34,  32, 116, // oaded} Mb\" t\n 105, 112,  84, 101, 120, 116,  61,  34,  45,  50,  46,  50, // ipText=\"-2.2\n  37,  34,  32, 116, 105, 112,  73,  99, 111, 110,  61,  36, // %\" tipIcon=$\n 123,  73,  99, 111, 110, 115,  46,  97, 114, 114, 111, 119, // {Icons.arrow\n 100, 111, 119, 110, 125,  32,  47,  62,  10,  32,  32,  32, // down} />.   \n  32,  32,  32,  60,  36, 123,  83, 116,  97, 116, 125,  32, //    <${Stat} \n 116, 105, 116, 108, 101,  61,  34,  68,  97, 105, 108, 121, // title=\"Daily\n  32,  85, 112, 108, 111,  97, 100, 101, 100,  34,  32, 116, //  Uploaded\" t\n 101, 120, 116,  61,  34,  36, 123, 115, 116,  97, 116, 115, // ext=\"${stats\n  46, 117, 112, 108, 111,  97, 100, 101, 100, 125,  32,  77, // .uploaded} M\n  98,  34,  32, 116, 105, 112,  84, 101, 120, 116,  61,  34, // b\" tipText=\"\n  43,  49,  50,  46,  55,  37,  34,  32, 116, 105, 112,  73, // +12.7%\" tipI\n  99, 111, 110,  61,  36, 123,  73,  99, 111, 110, 115,  46, // con=${Icons.\n  97, 114, 114, 111, 119, 117, 112, 125,  32,  47,  62,  10, // arrowup} />.\n  32,  32,  32,  32,  60,  47,  47,  62,  10,  32,  32,  60, //     <//>.  <\n  47,  47,  62,  10,  32,  32,  60, 100, 105, 118,  32,  99, // //>.  <div c\n 108,  97, 115, 115,  61,  34, 103, 114, 105, 100,  32, 103, // lass=\"grid g\n 114, 105, 100,  45,  99, 111, 108, 115,  45,  49,  32, 108, // rid-cols-1 l\n 103,  58, 103, 114, 105, 100,  45,  99, 111, 108, 115,  45, // g:grid-cols-\n  50,  32, 103,  97, 112,  45,  50,  34,  62,  10,  32,  32, // 2 gap-2\">.  \n  32,  32,  60,  36, 123,  83, 112, 101, 101, 100,  67, 104, //   <${SpeedCh\n  97, 114, 116, 125,  32, 115, 116,  97, 116, 115,  61,  36, // art} stats=$\n 123, 115, 116,  97, 116, 115, 125,  32,  47,  62,  10,  32, // {stats} />. \n  32,  32,  32,  60,  36, 123,  69, 118, 101, 110, 116, 115, //    <${Events\n 125,  32,  47,  62,  10,  32,  32,  32,  32,  60,  36, 123, // } />.    <${\n  77, 111, 100, 101, 109,  83, 116,  97, 116, 117, 115, 125, // ModemStatus}\n  32,  47,  62,  10,  32,  32,  60,  47,  47,  62,  10,  60, //  />.  <//>.<\n  47,  47,  62,  96,  59,  10, 125,  59,  10,  10, 102, 117, // //>`;.};..fu\n 110,  99, 116, 105, 111, 110,  32,  68, 101, 118, 105,  99, // nction Devic\n 101, 115,  40, 123, 125,  41,  32, 123,  10,  32,  32,  99, // es({}) {.  c\n 111, 110, 115, 116,  32,  91, 100, 101, 118, 105,  99, 101, // onst [device\n 115,  44,  32, 115, 101, 116,  68, 101, 118, 105,  99, 101, // s, setDevice\n 115,  93,  32,  61,  32, 117, 115, 101,  83, 116,  97, 116, // s] = useStat\n 101,  40, 110, 117, 108, 108,  41,  59,  10,  32,  32,  99, // e(null);.  c\n 111, 110, 115, 116,  32, 114, 101, 102, 114, 101, 115, 104, // onst refresh\n  32,  61,  32,  40,  41,  32,  61,  62,  32, 102, 101, 116, //  = () => fet\n  99, 104,  40,  39,  97, 112, 105,  47, 100, 101, 118, 105, // ch('api/devi\n  99, 101, 115,  47, 103, 101, 116,  39,  41,  10,  32,  32, // ces/get').  \n  32,  32,  46, 116, 104, 101, 110,  40, 114,  32,  61,  62, //   .then(r =>\n  32, 114,  46, 106, 115, 111, 110,  40,  41,  41,  10,  32, //  r.json()). \n  32,  32,  32,  46, 116, 104, 101, 110,  40, 114,  32,  61, //    .then(r =\n  62,  32, 115, 101, 116,  68, 101, 118, 105,  99, 101, 115, // > setDevices\n  40, 114,  41,  41,  59,  10,  32,  32, 117, 115, 101,  69, // (r));.  useE\n 102, 102, 101,  99, 116,  40, 114, 101, 102, 114, 101, 115, // ffect(refres\n 104,  44,  32,  91,  93,  41,  59,  10,  10,  32,  32,  99, // h, []);..  c\n 111, 110, 115, 116,  32, 116, 104,  32,  61,  32, 112, 114, // onst th = pr\n 111, 112, 115,  32,  61,  62,  32, 104, 116, 109, 108,  96, // ops => html`\n  60, 116, 104,  32, 115,  99, 111, 112, 101,  61,  34,  99, // <th scope=\"c\n 111, 108,  34,  32,  99, 108,  97, 115, 115,  61,  34, 115, // ol\" class=\"s\n 116, 105,  99, 107, 121,  32, 116, 111, 112,  45,  48,  32, // ticky top-0 \n 122,  45,  49,  48,  32,  98, 111, 114, 100, 101, 114,  45, // z-10 border-\n  98,  32,  98, 111, 114, 100, 101, 114,  45, 115, 108,  97, // b border-sla\n 116, 101,  45,  51,  48,  48,  32,  98, 103,  45, 119, 104, // te-300 bg-wh\n 105, 116, 101,  32,  98, 103,  45, 111, 112,  97,  99, 105, // ite bg-opaci\n 116, 121,  45,  55,  53,  32, 112, 121,  45,  49,  46,  53, // ty-75 py-1.5\n  32, 112, 120,  45,  52,  32, 116, 101, 120, 116,  45, 108, //  px-4 text-l\n 101, 102, 116,  32, 116, 101, 120, 116,  45, 115, 109,  32, // eft text-sm \n 102, 111, 110, 116,  45, 115, 101, 109, 105,  98, 111, 108, // font-semibol\n 100,  32, 116, 101, 120, 116,  45, 115, 108,  97, 116, 101, // d text-slate\n  45,  57,  48,  48,  32,  98,  97,  99, 107, 100, 114, 111, // -900 backdro\n 112,  45,  98, 108, 117, 114,  32,  98,  97,  99, 107, 100, // p-blur backd\n 114, 111, 112,  45, 102, 105, 108, 116, 101, 114,  34,  62, // rop-filter\">\n  36, 123, 112, 114, 111, 112, 115,  46, 116, 105, 116, 108, // ${props.titl\n 101, 125,  60,  47, 116, 104,  62,  96,  59,  10,  32,  32, // e}</th>`;.  \n  99, 111, 110, 115, 116,  32, 116, 100,  32,  61,  32, 112, // const td = p\n 114, 111, 112, 115,  32,  61,  62,  32, 104, 116, 109, 108, // rops => html\n  96,  60, 116, 100,  32,  99, 108,  97, 115, 115,  61,  34, // `<td class=\"\n 119, 104, 105, 116, 101, 115, 112,  97,  99, 101,  45, 110, // whitespace-n\n 111, 119, 114,  97, 112,  32,  98, 111, 114, 100, 101, 114, // owrap border\n  45,  98,  32,  98, 111, 114, 100, 101, 114,  45, 115, 108, // -b border-sl\n  97, 116, 101,  45,  50,  48,  48,  32, 112, 121,  45,  50, // ate-200 py-2\n  32, 112, 120,  45,  52,  32, 112, 114,  45,  51,  32, 116, //  px-4 pr-3 t\n 101, 120, 116,  45, 115, 109,  32, 116, 101, 120, 116,  45, // ext-sm text-\n 115, 108,  97, 116, 101,  45,  57,  48,  48,  34,  62,  36, // slate-900\">$\n 123, 112, 114, 111, 112, 115,  46, 116, 101, 120, 116, 125, // {props.text}\n  60,  47, 116, 100,  62,  96,  59,  10,  10,  32,  32,  99, // </td>`;..  c\n 111, 110, 115, 116,  32,  68, 101, 118, 105,  99, 101,  32, // onst Device \n  61,  32,  40, 123, 100, 125,  41,  32,  61,  62,  32, 104, // = ({d}) => h\n 116, 109, 108,  96,  10,  60, 116, 114,  62,  10,  32,  32, // tml`.<tr>.  \n  60,  36, 123, 116, 100, 125,  32, 116, 101, 120, 116,  61, // <${td} text=\n  36, 123, 100,  46, 100, 101, 118,  95, 110,  97, 109, 101, // ${d.dev_name\n 125,  32,  47,  62,  10,  32,  32,  60,  36, 123, 116, 100, // } />.  <${td\n 125,  32, 116, 101, 120, 116,  61,  36, 123, 100,  46, 109, // } text=${d.m\n  97,  99, 125,  32,  47,  62,  10,  32,  32,  60,  36, 123, // ac} />.  <${\n 116, 100, 125,  32, 116, 101, 120, 116,  61,  36, 123, 100, // td} text=${d\n  46, 105, 112, 125,  32,  47,  62,  10,  32,  32,  60,  36, // .ip} />.  <$\n 123, 116, 100, 125,  32, 116, 101, 120, 116,  61,  36, 123, // {td} text=${\n 100,  46, 115, 112, 101, 101, 100, 125,  32,  47,  62,  10, // d.speed} />.\n  32,  32,  60,  36, 123, 116, 100, 125,  32, 116, 101, 120, //   <${td} tex\n 116,  61,  36, 123, 100,  46,  99, 111, 110, 110, 101,  99, // t=${d.connec\n 116, 101, 100,  95, 116, 111, 125,  32,  47,  62,  10,  32, // ted_to} />. \n  32,  60,  36, 123, 116, 100, 125,  32, 116, 101, 120, 116, //  <${td} text\n  61,  36, 123, 100,  46, 108, 101,  97, 115, 101,  95, 116, // =${d.lease_t\n 105, 109, 101,  95, 108, 101, 102, 116, 125,  32,  47,  62, // ime_left} />\n  10,  32,  32,  60,  36, 123, 116, 100, 125,  32, 116, 101, // .  <${td} te\n 120, 116,  61,  36, 123, 100,  46, 108,  97, 115, 116,  95, // xt=${d.last_\n 115, 101, 101, 110, 125,  32,  47,  62,  10,  60,  47,  47, // seen} />.<//\n  62,  96,  59,  10,  10, 105, 102,  32,  40,  33, 100, 101, // >`;..if (!de\n 118, 105,  99, 101, 115,  41,  32, 114, 101, 116, 117, 114, // vices) retur\n 110,  32,  39,  39,  59,  10, 114, 101, 116, 117, 114, 110, // n '';.return\n  32, 104, 116, 109, 108,  96,  10,  32,  32,  60, 100, 105, //  html`.  <di\n 118,  32,  99, 108,  97, 115, 115,  61,  34, 111, 118, 101, // v class=\"ove\n 114, 102, 108, 111, 119,  45, 120,  45,  97, 117, 116, 111, // rflow-x-auto\n  32, 115, 104,  97, 100, 111, 119,  45, 120, 108,  32, 114, //  shadow-xl r\n 111, 117, 110, 100, 101, 100,  45, 120, 108,  32,  98, 103, // ounded-xl bg\n  45, 119, 104, 105, 116, 101,  32, 100,  97, 114, 107,  58, // -white dark:\n  98, 103,  45, 103, 114,  97, 121,  45,  56,  48,  48,  32, // bg-gray-800 \n 109, 121,  45,  51,  32, 109, 120,  45,  52,  34,  62,  10, // my-3 mx-4\">.\n  32,  32,  32,  32,  60, 100, 105, 118,  32,  99, 108,  97, //     <div cla\n 115, 115,  61,  34, 102, 111, 110, 116,  45, 108, 105, 103, // ss=\"font-lig\n 104, 116,  32, 117, 112, 112, 101, 114,  99,  97, 115, 101, // ht uppercase\n  32, 102, 108, 101, 120,  32, 116, 101, 120, 116,  45, 115, //  flex text-s\n 108,  97, 116, 101,  45,  54,  48,  48,  32, 112, 120,  45, // late-600 px-\n  52,  32, 112, 121,  45,  50,  32, 106, 117, 115, 116, 105, // 4 py-2 justi\n 102, 121,  45,  98, 101, 116, 119, 101, 101, 110,  34,  62, // fy-between\">\n  10,  32,  32,  32,  32,  32,  32,  67, 111, 110, 110, 101, // .      Conne\n  99, 116, 101, 100,  32, 100, 101, 118, 105,  99, 101, 115, // cted devices\n  10,  32,  32,  32,  32,  32,  32,  60,  36, 123,  66, 117, // .      <${Bu\n 116, 116, 111, 110, 125,  32, 116, 105, 116, 108, 101,  61, // tton} title=\n  34,  82, 101, 102, 114, 101, 115, 104,  32, 116,  97,  98, // \"Refresh tab\n 108, 101,  34,  32, 105,  99, 111, 110,  61,  36, 123,  73, // le\" icon=${I\n  99, 111, 110, 115,  46, 114, 101, 102, 114, 101, 115, 104, // cons.refresh\n 125,  32, 111, 110,  99, 108, 105,  99, 107,  61,  36, 123, // } onclick=${\n 114, 101, 102, 114, 101, 115, 104, 125,  32, 109, 120,  45, // refresh} mx-\n  50,  32,  47,  62,  10,  32,  32,  32,  32,  60,  47,  47, // 2 />.    <//\n  62,  10,  32,  32,  32,  32,  60, 100, 105, 118,  32,  99, // >.    <div c\n 108,  97, 115, 115,  61,  34,  97, 108, 105, 103, 110,  45, // lass=\"align-\n 109, 105, 100, 100, 108, 101,  32, 105, 110, 108, 105, 110, // middle inlin\n 101,  45,  98, 108, 111,  99, 107,  32, 119,  45, 102, 117, // e-block w-fu\n 108, 108,  34,  62,  10,  32,  32,  32,  32,  32,  32,  60, // ll\">.      <\n 100, 105, 118,  32,  99, 108,  97, 115, 115,  61,  34, 111, // div class=\"o\n 118, 101, 114, 102, 108, 111, 119,  45, 104, 105, 100, 100, // verflow-hidd\n 101, 110,  34,  62,  10,  32,  32,  32,  32,  32,  32,  32, // en\">.       \n  32,  60, 116,  97,  98, 108, 101,  32,  99, 108,  97, 115, //  <table clas\n 115,  61,  34, 109, 105, 110,  45, 119,  45, 102, 117, 108, // s=\"min-w-ful\n 108,  32, 100, 105, 118, 105, 100, 101,  45, 121,  32, 100, // l divide-y d\n 105, 118, 105, 100, 101,  45, 103, 114,  97, 121,  45,  50, // ivide-gray-2\n  48,  48,  32, 100,  97, 114, 107,  58, 100, 105, 118, 105, // 00 dark:divi\n 100, 101,  45, 103, 114,  97, 121,  45,  55,  48,  48,  32, // de-gray-700 \n 116, 101, 120, 116,  45, 115, 109,  32, 109, 100,  58, 116, // text-sm md:t\n 101, 120, 116,  45,  98,  97, 115, 101,  32, 108, 103,  58, // ext-base lg:\n 116, 101, 120, 116,  45, 108, 103,  34,  62,  10,  32,  32, // text-lg\">.  \n  32,  32,  32,  32,  32,  32,  32,  32,  60, 116, 104, 101, //         <the\n  97, 100,  32,  99, 108,  97, 115, 115,  61,  34,  98, 103, // ad class=\"bg\n  45, 103, 114,  97, 121,  45,  50,  48,  48,  32, 100,  97, // -gray-200 da\n 114, 107,  58,  98, 103,  45, 103, 114,  97, 121,  45,  55, // rk:bg-gray-7\n  48,  48,  32, 116, 101, 120, 116,  45, 103, 114,  97, 121, // 00 text-gray\n  45,  54,  48,  48,  32, 100,  97, 114, 107,  58, 116, 101, // -600 dark:te\n 120, 116,  45, 103, 114,  97, 121,  45,  51,  48,  48,  34, // xt-gray-300\"\n  62,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, // >.          \n  32,  32,  60, 116, 114,  62,  10,  32,  32,  32,  32,  32, //   <tr>.     \n  32,  32,  32,  32,  32,  32,  32,  32,  32,  60,  36, 123, //          <${\n 116, 104, 125,  32, 116, 105, 116, 108, 101,  61,  34,  68, // th} title=\"D\n 101, 118, 105,  99, 101,  32,  78,  97, 109, 101,  34,  32, // evice Name\" \n  47,  62,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32, // />.         \n  32,  32,  32,  32,  32,  60,  36, 123, 116, 104, 125,  32, //      <${th} \n 116, 105, 116, 108, 101,  61,  34,  77,  65,  67,  32,  97, // title=\"MAC a\n 100, 100, 114, 101, 115, 115,  34,  32,  47,  62,  10,  32, // ddress\" />. \n  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, //             \n  32,  60,  36, 123, 116, 104, 125,  32, 116, 105, 116, 108, //  <${th} titl\n 101,  61,  34,  73,  80,  32,  97, 100, 100, 114, 101, 115, // e=\"IP addres\n 115,  34,  32,  47,  62,  10,  32,  32,  32,  32,  32,  32, // s\" />.      \n  32,  32,  32,  32,  32,  32,  32,  32,  60,  36, 123, 116, //         <${t\n 104, 125,  32, 116, 105, 116, 108, 101,  61,  34,  83, 112, // h} title=\"Sp\n 101, 101, 100,  32,  40,  77,  98, 112, 115,  41,  34,  32, // eed (Mbps)\" \n  47,  62,  10,  32,  32,  32,  32,  32,  32,  32,  32,  32, // />.         \n  32,  32,  32,  32,  32,  60,  36, 123, 116, 104, 125,  32, //      <${th} \n 116, 105, 116, 108, 101,  61,  34,  67, 111, 110, 110, 101, // title=\"Conne\n  99, 116, 101, 100,  32, 116, 111,  34,  32,  47,  62,  10, // cted to\" />.\n  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, //             \n  32,  32,  60,  36, 123, 116, 104, 125,  32, 116, 105, 116, //   <${th} tit\n 108, 101,  61,  34,  76, 101,  97, 115, 101,  32, 116, 105, // le=\"Lease ti\n 109, 101,  32, 108, 101, 102, 116,  34,  32,  47,  62,  10, // me left\" />.\n  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  32, //             \n  32,  32,  60,  36, 123, 116, 104, 125,  32, 116, 105, 116, //   <${th} tit\n 108, 101,  61,  34,  76,  97, 115, 116,  32, 115, 101, 101, // le=\"Last see\n 110,  34,  32,  47,  62,  10,  32,  32,  32,  32,  32,  32, // n\" />.      \n  32,  32,  32,  32,  32,  32,  60,  47, 116, 114,  62,  10, //       </tr>.\n  32,  32,  32,  32,  32,  32,  32,  32,  32,  32,  60,  47, //           </\n 116, 104, 101,  97, 100,  62,  10,  32,  32,  32,  32,  32, // thead>.     \n  32,  32,  32,  32,  32,  60, 116,  98, 111, 100, 121,  32, //      <tbody \n  99, 108,  97, 115, 115,  61,  34,  98, 103,  45, 119, 104, // class=\"bg-wh\n 105, 116, 101,  32, 100,  97, 114, 107,  58,  98, 103,  45, // ite dark:bg-\n 103, 114,  97, 121,  45,  57,  48,  48,  32, 116, 101, 120, // gray-900 tex\n 116,  45, 103, 114,  97, 121,  45,  56,  48,  48,  32, 100, // t-gray-800 d\n  97, 114, 107,  58, 116, 101, 120, 116,  45, 103, 114,  97, // ark:text-gra\n 121,  45,  50,  48,  48,  34,  62,  10,  32,  32,  32,  32, // y-200\">.    \n  32,  32,  32,  32,  32,  32,  32,  32,  36, 123, 100, 101, //         ${de\n 118, 105,  99, 101, 115,  46, 109,  97, 112,  40, 100,  32, // vices.map(d \n  61,  62,  32, 104,  40,  68, 101, 118, 105,  99, 101,  44, // => h(Device,\n  32, 123, 100, 125,  41,  41, 125,  10,  32,  32,  32,  32, //  {d}))}.    \n  32,  32,  32,  32,  32,  32,  60,  47, 116,  98, 111, 100, //       </tbod\n 121,  62,  10,  32,  32,  32,  32,  32,  32,  32,  32,  60, // y>.        <\n  47, 116,  97,  98, 108, 101,  62,  10,  32,  32,  32,  32, // /table>.    \n  32,  32,  60,  47, 100, 105, 118,  62,  10,  32,  32,  32, //   </div>.   \n  32,  60,  47, 100, 105, 118,  62,  10,  32,  32,  60,  47, //  </div>.  </\n 100, 105, 118,  62,  96,  59,  10, 125,  59,  10,  10, 102, // div>`;.};..f\n 117, 110,  99, 116, 105, 111, 110,  32,  68,  72,  67,  80, // unction DHCP\n  40, 123, 125,  41,  32, 123,  10,  32,  32,  99, 111, 110, // ({}) {.  con\n 115, 116,  32,  91, 100, 104,  99, 112,  44,  32, 115, 101, // st [dhcp, se\n 116,  68, 104,  99, 112,  93,  32,  61,  32, 117, 115, 101, // tDhcp] = use\n  83, 116,  97, 116, 101,  40, 110, 117, 108, 108,  41,  59, // State(null);\n  10,  32,  32,  99, 111, 110, 115, 116,  32,  91, 115,  97, // .  const [sa\n 118, 101,  82, 101, 115, 117, 108, 116,  44,  32, 115, 101, // veResult, se\n 116,  83,  97, 118, 101,  82, 101, 115, 117, 108, 116,  93, // tSaveResult]\n  32,  61,  32, 117, 115, 101,  83, 116,  97, 116, 101,  40, //  = useState(\n 110, 117, 108, 108,  41,  59,  10,  32,  32,  99, 111, 110, // null);.  con\n 115, 116,  32, 114, 101, 102, 114, 101, 115, 104,  32,  61, // st refresh =\n  32,  40,  41,  32,  61,  62,  32, 102, 101, 116,  99, 104, //  () => fetch\n  40,  39,  97, 112, 105,  47, 100, 104,  99, 112,  47, 103, // ('api/dhcp/g\n 101, 116,  39,  41,  10,  32,  32,  32,  32,  46, 116, 104, // et').    .th\n 101, 110,  40, 114,  32,  61,  62,  32, 114,  46, 106, 115, // en(r => r.js\n 111, 110,  40,  41,  41,  10,  32,  32,  32,  32,  46, 116, // on()).    .t\n 104, 101, 110,  40, 114,  32,  61,  62,  32, 115, 101, 116, // hen(r => set\n  68, 104,  99, 112,  40, 114,  41,  41,  59,  10,  32,  32, // Dhcp(r));.  \n 117, 115, 101,  69, 102, 102, 101,  99, 116,  40, 114, 101, // useEffect(re\n 102, 114, 101, 115, 104,  44,  32,  91,  93,  41,  59,  10, // fresh, []);.\n  10,  32,  32,  99, 111, 110, 115, 116,  32, 109, 107, 115, // .  const mks\n 101, 116, 102, 110,  32,  61,  32, 107,  32,  61,  62,  32, // etfn = k => \n  40, 118,  32,  61,  62,  32, 115, 101, 116,  68, 104,  99, // (v => setDhc\n 112,  40, 120,  32,  61,  62,  32,  79,  98, 106, 101,  99, // p(x => Objec\n 116,  46,  97, 115, 115, 105, 103, 110,  40, 123, 125,  44, // t.assign({},\n  32, 120,  44,  32, 123,  91, 107,  93,  58,  32, 118, 125, //  x, {[k]: v}\n  41,  41,  41,  59,  32,  10,  32,  32,  99, 111, 110, 115, // ))); .  cons\n 116,  32, 111, 110, 115,  97, 118, 101,  32,  61,  32, 101, // t onsave = e\n 118,  32,  61,  62,  32, 102, 101, 116,  99, 104,  40,  39, // v => fetch('\n  97, 112, 105,  47, 100, 104,  99, 112,  47, 115, 101, 116, // api/dhcp/set\n  39,  44,  32, 123,  10,  32,  32,  32,  32, 109, 101, 116, // ', {.    met\n 104, 111, 100,  58,  32,  39, 112, 111, 115, 116,  39,  44, // hod: 'post',\n  32,  98, 111, 100, 121,  58,  32,  74,  83,  79,  78,  46, //  body: JSON.\n 115, 116, 114, 105, 110, 103, 105, 102, 121,  40, 100, 104, // stringify(dh\n  99, 112,  41,  32,  10,  32,  32, 125,  41,  46, 116, 104, // cp) .  }).th\n 101, 110,  40, 114,  32,  61,  62,  32, 114,  46, 106, 115, // en(r => r.js\n 111, 110,  40,  41,  41,  10,  32,  32,  32,  32,  46, 116, // on()).    .t\n 104, 101, 110,  40, 114,  32,  61,  62,  32, 115, 101, 116, // hen(r => set\n  83,  97, 118, 101,  82, 101, 115, 117, 108, 116,  40, 114, // SaveResult(r\n  41,  41,  10,  32,  32,  32,  32,  46, 116, 104, 101, 110, // )).    .then\n  40, 114, 101, 102, 114, 101, 115, 104,  41,  59,  10,  10, // (refresh);..\n  32,  32, 105, 102,  32,  40,  33, 100, 104,  99, 112,  41, //   if (!dhcp)\n  32, 114, 101, 116, 117, 114, 110,  32,  39,  39,  59,  10, //  return '';.\n  32,  32, 114, 101, 116, 117, 114, 110,  32, 104, 116, 109, //   return htm\n 108,  96,  10,  60, 100, 105, 118,  32,  99, 108,  97, 115, // l`.<div clas\n 115,  61,  34, 109,  45,  52,  32, 103, 114, 105, 100,  32, // s=\"m-4 grid \n 103, 114, 105, 100,  45,  99, 111, 108, 115,  45,  49,  32, // grid-cols-1 \n 103,  97, 112,  45,  52,  32, 109, 100,  58, 103, 114, 105, // gap-4 md:gri\n 100,  45,  99, 111, 108, 115,  45,  50,  34,  62,  10,  10, // d-cols-2\">..\n  32,  32,  60, 100, 105, 118,  32,  99, 108,  97, 115, 115, //   <div class\n  61,  34, 112, 121,  45,  49,  32, 100, 105, 118, 105, 100, // =\"py-1 divid\n 101,  45, 121,  32,  98, 111, 114, 100, 101, 114,  32, 114, // e-y border r\n 111, 117, 110, 100, 101, 100,  32,  98, 103,  45, 119, 104, // ounded bg-wh\n 105, 116, 101,  32, 102, 108, 101, 120,  32, 102, 108, 101, // ite flex fle\n 120,  45,  99, 111, 108,  34,  62,  10,  32,  32,  32,  32, // x-col\">.    \n  60, 100, 105, 118,  32,  99, 108,  97, 115, 115,  61,  34, // <div class=\"\n 102, 111, 110, 116,  45, 108, 105, 103, 104, 116,  32, 117, // font-light u\n 112, 112, 101, 114,  99,  97, 115, 101,  32, 102, 108, 101, // ppercase fle\n 120,  32, 105, 116, 101, 109, 115,  45,  99, 101, 110, 116, // x items-cent\n 101, 114,  32, 116, 101, 120, 116,  45, 103, 114,  97, 121, // er text-gray\n  45,  54,  48,  48,  32, 112, 120,  45,  52,  32, 112, 121, // -600 px-4 py\n  45,  50,  34,  62,  10,  32,  32,  32,  32,  32,  32,  68, // -2\">.      D\n  72,  67,  80,  32,  83, 101, 114, 118, 101, 114,  32,  83, // HCP Server S\n 101, 116, 116, 105, 110, 103, 115,  10,  32,  32,  32,  32, // ettings.    \n  60,  47,  47,  62,  10,  32,  32,  32,  32,  60, 100, 105, // <//>.    <di\n 118,  32,  99, 108,  97, 115, 115,  61,  34, 112, 121,  45, // v class=\"py-\n  50,  32, 112, 120,  45,  53,  32, 102, 108, 101, 120,  45, // 2 px-5 flex-\n  49,  32, 102, 108, 101, 120,  32, 102, 108, 101, 120,  45, // 1 flex flex-\n  99, 111, 108,  32, 114, 101, 108,  97, 116, 105, 118, 101, // col relative\n  34,  62,  10,  32,  32,  32,  32,  32,  32,  36, 123, 115, // \">.      ${s\n  97, 118, 101,  82, 101, 115, 117, 108, 116,  32,  38,  38, // aveResult &&\n  32, 104, 116, 109, 108,  96,  60,  36, 123,  78, 111, 116, //  html`<${Not\n 105, 102, 105,  99,  97, 116, 105, 111, 110, 125,  32, 111, // ification} o\n 107,  61,  36, 123, 115,  97, 118, 101,  82, 101, 115, 117, // k=${saveResu\n 108, 116,  46, 115, 116,  97, 116, 117, 115, 125,  10,  32, // lt.status}. \n  32,  32,  32,  32,  32,  32,  32, 116, 101, 120, 116,  61, //        text=\n  36, 123, 115,  97, 118, 101,  82, 101, 115, 117, 108, 116, // ${saveResult\n  46, 109, 101, 115, 115,  97, 103, 101, 125,  32,  99, 108, // .message} cl\n 111, 115, 101,  61,  36, 123,  40,  41,  32,  61,  62,  32, // ose=${() => \n 115, 101, 116,  83,  97, 118, 101,  82, 101, 115, 117, 108, // setSaveResul\n 116,  40, 110, 117, 108, 108,  41, 125,  32,  47,  62,  96, // t(null)} />`\n 125,  10,  10,  32,  32,  32,  32,  32,  32,  60,  36, 123, // }..      <${\n  83, 101, 116, 116, 105, 110, 103, 125,  32, 116, 105, 116, // Setting} tit\n 108, 101,  61,  34,  69, 110,  97,  98, 108, 101, 100,  34, // le=\"Enabled\"\n  32, 118,  97, 108, 117, 101,  61,  36, 123, 100, 104,  99, //  value=${dhc\n 112,  46, 101, 110,  97,  98, 108, 101, 100, 125,  32, 115, // p.enabled} s\n 101, 116, 102, 110,  61,  36, 123, 109, 107, 115, 101, 116, // etfn=${mkset\n 102, 110,  40,  39, 101, 110,  97,  98, 108, 101, 100,  39, // fn('enabled'\n  41, 125,  32, 116, 121, 112, 101,  61,  34, 115, 119, 105, // )} type=\"swi\n 116,  99, 104,  34,  32,  47,  62,  10,  32,  32,  32,  32, // tch\" />.    \n  32,  32,  60,  36, 123,  83, 101, 116, 116, 105, 110, 103, //   <${Setting\n 125,  32, 116, 105, 116, 108, 101,  61,  34,  83, 116,  97, // } title=\"Sta\n 114, 116,  32,  65, 100, 100, 114, 101, 115, 115,  34,  32, // rt Address\" \n 118,  97, 108, 117, 101,  61,  36, 123, 100, 104,  99, 112, // value=${dhcp\n  46,  97, 100, 100, 114, 101, 115, 115,  95,  98, 101, 103, // .address_beg\n 105, 110, 125,  32, 115, 101, 116, 102, 110,  61,  36, 123, // in} setfn=${\n 109, 107, 115, 101, 116, 102, 110,  40,  39,  97, 100, 100, // mksetfn('add\n 114, 101, 115, 115,  95,  98, 101, 103, 105, 110,  39,  41, // ress_begin')\n 125,  32, 116, 121, 112, 101,  61,  34, 110, 117, 109,  98, // } type=\"numb\n 101, 114,  34,  32,  97, 100, 100, 111, 110,  76, 101, 102, // er\" addonLef\n 116,  61,  34,  49,  57,  50,  46,  49,  54,  56,  46,  48, // t=\"192.168.0\n  46,  34,  32, 100, 105, 115,  97,  98, 108, 101, 100,  61, // .\" disabled=\n  36, 123,  33, 100, 104,  99, 112,  46, 101, 110,  97,  98, // ${!dhcp.enab\n 108, 101, 100, 125,  32,  47,  62,  10,  32,  32,  32,  32, // led} />.    \n  32,  32,  60,  36, 123,  83, 101, 116, 116, 105, 110, 103, //   <${Setting\n 125,  32, 116, 105, 116, 108, 101,  61,  34,  69, 110, 100, // } title=\"End\n  32,  65, 100, 100, 114, 101, 115, 115,  34,  32, 118,  97, //  Address\" va\n 108, 117, 101,  61,  36, 123, 100, 104,  99, 112,  46,  97, // lue=${dhcp.a\n 100, 100, 114, 101, 115, 115,  95, 101, 110, 100, 125,  32, // ddress_end} \n 115, 101, 116, 102, 110,  61,  36, 123, 109, 107, 115, 101, // setfn=${mkse\n 116, 102, 110,  40,  39,  97, 100, 100, 114, 101, 115, 115, // tfn('address\n  95, 101, 110, 100,  39,  41, 125,  32, 116, 121, 112, 101, // _end')} type\n  61,  34, 110, 117, 109,  98, 101, 114,  34,  32,  97, 100, // =\"number\" ad\n 100, 111, 110,  76, 101, 102, 116,  61,  34,  49,  57,  50, // donLeft=\"192\n  46,  49,  54,  56,  46,  48,  46,  34,  32, 100, 105, 115, // .168.0.\" dis\n  97,  98, 108, 101, 100,  61,  36, 123,  33, 100, 104,  99, // abled=${!dhc\n 112,  46, 101, 110,  97,  98, 108, 101, 100, 125,  32,  47, // p.enabled} /\n  62,  10,  32,  32,  32,  32,  32,  32,  60,  36, 123,  83, // >.      <${S\n 101, 116, 116, 105, 110, 103, 125,  32, 116, 105, 116, 108, // etting} titl\n 101,  61,  34,  76, 101,  97, 115, 101,  32,  84, 105, 109, // e=\"Lease Tim\n 101,  34,  32, 118,  97, 108, 117, 101,  61,  36, 123, 100, // e\" value=${d\n 104,  99, 112,  46, 108, 101,  97, 115, 101,  95, 116, 105, // hcp.lease_ti\n 109, 101,  95, 115, 101,  99, 125,  32, 115, 101, 116, 102, // me_sec} setf\n 110,  61,  36, 123, 109, 107, 115, 101, 116, 102, 110,  40, // n=${mksetfn(\n  39, 108, 101,  97, 115, 101,  95, 116, 105, 109, 101,  95, // 'lease_time_\n 115, 101,  99,  39,  41, 125,  32, 116, 121, 112, 101,  61, // sec')} type=\n  34, 110, 117, 109,  98, 101, 114,  34,  32,  97, 100, 100, // \"number\" add\n 111, 110,  82, 105, 103, 104, 116,  61,  34, 115, 101,  99, // onRight=\"sec\n 111, 110, 100, 115,  34,  32, 100, 105, 115,  97,  98, 108, // onds\" disabl\n 101, 100,  61,  36, 123,  33, 100, 104,  99, 112,  46, 101, // ed=${!dhcp.e\n 110,  97,  98, 108, 101, 100, 125,  32,  47,  62,  10,  32, // nabled} />. \n  32,  32,  32,  32,  32,  60, 100, 105, 118,  32,  99, 108, //      <div cl\n  97, 115, 115,  61,  34, 109,  98,  45,  49,  32, 109, 116, // ass=\"mb-1 mt\n  45,  51,  32, 102, 108, 101, 120,  32, 112, 108,  97,  99, // -3 flex plac\n 101,  45,  99, 111, 110, 116, 101, 110, 116,  45, 101, 110, // e-content-en\n 100,  34,  62,  60,  36, 123,  66, 117, 116, 116, 111, 110, // d\"><${Button\n 125,  32, 105,  99, 111, 110,  61,  36, 123,  73,  99, 111, // } icon=${Ico\n 110, 115,  46, 115,  97, 118, 101, 125,  32, 111, 110,  99, // ns.save} onc\n 108, 105,  99, 107,  61,  36, 123, 111, 110, 115,  97, 118, // lick=${onsav\n 101, 125,  32, 116, 105, 116, 108, 101,  61,  34,  83,  97, // e} title=\"Sa\n 118, 101,  32,  83, 101, 116, 116, 105, 110, 103, 115,  34, // ve Settings\"\n  32,  47,  62,  60,  47,  47,  62,  10,  32,  32,  32,  32, //  /><//>.    \n  60,  47,  47,  62,  10,  32,  32,  60,  47,  47,  62,  10, // <//>.  <//>.\n  60,  47,  47,  62,  96,  59,  10, 125,  59,  10,  10,  99, // <//>`;.};..c\n 111, 110, 115, 116,  32,  65, 112, 112,  32,  61,  32, 102, // onst App = f\n 117, 110,  99, 116, 105, 111, 110,  40, 123, 125,  41,  32, // unction({}) \n 123,  10,  32,  32,  99, 111, 110, 115, 116,  32,  91, 108, // {.  const [l\n 111,  97, 100, 105, 110, 103,  44,  32, 115, 101, 116,  76, // oading, setL\n 111,  97, 100, 105, 110, 103,  93,  32,  61,  32, 117, 115, // oading] = us\n 101,  83, 116,  97, 116, 101,  40, 116, 114, 117, 101,  41, // eState(true)\n  59,  10,  32,  32,  99, 111, 110, 115, 116,  32,  91, 117, // ;.  const [u\n 114, 108,  44,  32, 115, 101, 116,  85, 114, 108,  93,  32, // rl, setUrl] \n  61,  32, 117, 115, 101,  83, 116,  97, 116, 101,  40,  39, // = useState('\n  47,  39,  41,  59,  10,  32,  32,  99, 111, 110, 115, 116, // /');.  const\n  32,  91, 117, 115, 101, 114,  44,  32, 115, 101, 116,  85, //  [user, setU\n 115, 101, 114,  93,  32,  61,  32, 117, 115, 101,  83, 116, // ser] = useSt\n  97, 116, 101,  40,  39,  39,  41,  59,  10,  32,  32,  99, // ate('');.  c\n 111, 110, 115, 116,  32,  91, 115, 104, 111, 119,  83, 105, // onst [showSi\n 100, 101,  98,  97, 114,  44,  32, 115, 101, 116,  83, 104, // debar, setSh\n 111, 119,  83, 105, 100, 101,  98,  97, 114,  93,  32,  61, // owSidebar] =\n  32, 117, 115, 101,  83, 116,  97, 116, 101,  40, 116, 114, //  useState(tr\n 117, 101,  41,  59,  10,  10,  32,  32,  99, 111, 110, 115, // ue);..  cons\n 116,  32, 108, 111, 103, 111, 117, 116,  32,  61,  32,  40, // t logout = (\n  41,  32,  61,  62,  32, 102, 101, 116,  99, 104,  40,  39, // ) => fetch('\n  97, 112, 105,  47, 108, 111, 103, 111, 117, 116,  39,  41, // api/logout')\n  46, 116, 104, 101, 110,  40, 114,  32,  61,  62,  32, 115, // .then(r => s\n 101, 116,  85, 115, 101, 114,  40,  39,  39,  41,  41,  59, // etUser(''));\n  10,  32,  32,  99, 111, 110, 115, 116,  32, 108, 111, 103, // .  const log\n 105, 110,  32,  61,  32, 114,  32,  61,  62,  32,  33, 114, // in = r => !r\n  46, 111, 107,  32,  63,  32, 115, 101, 116,  76, 111,  97, // .ok ? setLoa\n 100, 105, 110, 103,  40, 102,  97, 108, 115, 101,  41,  32, // ding(false) \n  58,  32, 114,  46, 106, 115, 111, 110,  40,  41,  10,  32, // : r.json(). \n  32,  32,  32,  32,  32,  46, 116, 104, 101, 110,  40, 114, //      .then(r\n  32,  61,  62,  32, 115, 101, 116,  85, 115, 101, 114,  40, //  => setUser(\n 114,  46, 117, 115, 101, 114,  41,  41,  10,  32,  32,  32, // r.user)).   \n  32,  32,  32,  46, 102, 105, 110,  97, 108, 108, 121,  40, //    .finally(\n 114,  32,  61,  62,  32, 115, 101, 116,  76, 111,  97, 100, // r => setLoad\n 105, 110, 103,  40, 102,  97, 108, 115, 101,  41,  41,  59, // ing(false));\n  10,  10,  32,  32, 117, 115, 101,  69, 102, 102, 101,  99, // ..  useEffec\n 116,  40,  40,  41,  32,  61,  62,  32, 102, 101, 116,  99, // t(() => fetc\n 104,  40,  39,  97, 112, 105,  47, 108, 111, 103, 105, 110, // h('api/login\n  39,  41,  46, 116, 104, 101, 110,  40, 108, 111, 103, 105, // ').then(logi\n 110,  41,  44,  32,  91,  93,  41,  59,  10,  10,  32,  32, // n), []);..  \n 105, 102,  32,  40, 108, 111,  97, 100, 105, 110, 103,  41, // if (loading)\n  32, 114, 101, 116, 117, 114, 110,  32,  39,  39,  59,  32, //  return ''; \n  32,  47,  47,  32,  83, 104, 111, 119,  32,  98, 108,  97, //  // Show bla\n 110, 107,  32, 112,  97, 103, 101,  32, 111, 110,  32, 105, // nk page on i\n 110, 105, 116, 105,  97, 108,  32, 108, 111,  97, 100,  10, // nitial load.\n  32,  32, 105, 102,  32,  40,  33, 117, 115, 101, 114,  41, //   if (!user)\n  32, 114, 101, 116, 117, 114, 110,  32, 104, 116, 109, 108, //  return html\n  96,  60,  36, 123,  76, 111, 103, 105, 110, 125,  32, 108, // `<${Login} l\n 111, 103, 105, 110,  70, 110,  61,  36, 123, 108, 111, 103, // oginFn=${log\n 105, 110, 125,  32, 108, 111, 103, 111,  73,  99, 111, 110, // in} logoIcon\n  61,  36, 123,  76, 111, 103, 111, 125,  32, 116, 105, 116, // =${Logo} tit\n 108, 101,  61,  34,  87, 105,  70, 105,  32,  82, 111, 117, // le=\"WiFi Rou\n 116, 101, 114,  32,  76, 111, 103, 105, 110,  34,  32, 116, // ter Login\" t\n 105, 112,  84, 101, 120, 116,  61,  34,  84, 111,  32, 108, // ipText=\"To l\n 111, 103, 105, 110,  44,  32, 117, 115, 101,  58,  32,  97, // ogin, use: a\n 100, 109, 105, 110,  47,  97, 100, 109, 105, 110,  44,  32, // dmin/admin, \n 117, 115, 101, 114,  49,  47, 117, 115, 101, 114,  49,  44, // user1/user1,\n  32, 117, 115, 101, 114,  50,  47, 117, 115, 101, 114,  50, //  user2/user2\n  34,  32,  47,  62,  96,  59,  32,  47,  47,  32,  73, 102, // \" />`; // If\n  32, 110, 111, 116,  32, 108, 111, 103, 103, 101, 100,  32, //  not logged \n 105, 110,  44,  32, 115, 104, 111, 119,  32, 108, 111, 103, // in, show log\n 105, 110,  32, 115,  99, 114, 101, 101, 110,  10,  10,  32, // in screen.. \n  32, 114, 101, 116, 117, 114, 110,  32, 104, 116, 109, 108, //  return html\n  96,  10,  60, 100, 105, 118,  32,  99, 108,  97, 115, 115, // `.<div class\n  61,  34, 109, 105, 110,  45, 104,  45, 115,  99, 114, 101, // =\"min-h-scre\n 101, 110,  32,  98, 103,  45, 115, 108,  97, 116, 101,  45, // en bg-slate-\n  49,  48,  48,  34,  62,  10,  32,  32,  60,  36, 123,  83, // 100\">.  <${S\n 105, 100, 101,  98,  97, 114, 125,  32, 117, 114, 108,  61, // idebar} url=\n  36, 123, 117, 114, 108, 125,  32, 115, 104, 111, 119,  61, // ${url} show=\n  36, 123, 115, 104, 111, 119,  83, 105, 100, 101,  98,  97, // ${showSideba\n 114, 125,  32,  47,  62,  10,  32,  32,  60,  36, 123,  72, // r} />.  <${H\n 101,  97, 100, 101, 114, 125,  32, 108, 111, 103, 111, 117, // eader} logou\n 116,  61,  36, 123, 108, 111, 103, 111, 117, 116, 125,  32, // t=${logout} \n 117, 115, 101, 114,  61,  36, 123, 117, 115, 101, 114, 125, // user=${user}\n  32, 115, 104, 111, 119,  83, 105, 100, 101,  98,  97, 114, //  showSidebar\n  61,  36, 123, 115, 104, 111, 119,  83, 105, 100, 101,  98, // =${showSideb\n  97, 114, 125,  32, 115, 101, 116,  83, 104, 111, 119,  83, // ar} setShowS\n 105, 100, 101,  98,  97, 114,  61,  36, 123, 115, 101, 116, // idebar=${set\n  83, 104, 111, 119,  83, 105, 100, 101,  98,  97, 114, 125, // ShowSidebar}\n  32,  47,  62,  10,  32,  32,  60, 100, 105, 118,  32,  99, //  />.  <div c\n 108,  97, 115, 115,  61,  34,  36, 123, 115, 104, 111, 119, // lass=\"${show\n  83, 105, 100, 101,  98,  97, 114,  32,  38,  38,  32,  39, // Sidebar && '\n 112, 108,  45,  55,  50,  39, 125,  32, 116, 114,  97, 110, // pl-72'} tran\n 115, 105, 116, 105, 111, 110,  45,  97, 108, 108,  32, 100, // sition-all d\n 117, 114,  97, 116, 105, 111, 110,  45,  51,  48,  48,  32, // uration-300 \n 116, 114,  97, 110, 115, 102, 111, 114, 109,  34,  62,  10, // transform\">.\n  32,  32,  32,  32,  60,  36, 123,  82, 111, 117, 116, 101, //     <${Route\n 114, 125,  32, 111, 110,  67, 104,  97, 110, 103, 101,  61, // r} onChange=\n  36, 123, 101, 118,  32,  61,  62,  32, 115, 101, 116,  85, // ${ev => setU\n 114, 108,  40, 101, 118,  46, 117, 114, 108,  41, 125,  32, // rl(ev.url)} \n 104, 105, 115, 116, 111, 114, 121,  61,  36, 123,  72, 105, // history=${Hi\n 115, 116, 111, 114, 121,  46,  99, 114, 101,  97, 116, 101, // story.create\n  72,  97, 115, 104,  72, 105, 115, 116, 111, 114, 121,  40, // HashHistory(\n  41, 125,  32,  62,  10,  32,  32,  32,  32,  32,  32,  60, // )} >.      <\n  36, 123,  77,  97, 105, 110, 125,  32, 100, 101, 102,  97, // ${Main} defa\n 117, 108, 116,  61,  36, 123, 116, 114, 117, 101, 125,  32, // ult=${true} \n  47,  62,  10,  32,  32,  32,  32,  32,  32,  60,  36, 123, // />.      <${\n  68,  72,  67,  80, 125,  32, 112,  97, 116, 104,  61,  34, // DHCP} path=\"\n 100, 104,  99, 112,  34,  32,  47,  62,  10,  32,  32,  32, // dhcp\" />.   \n  32,  32,  32,  60,  36, 123,  68, 101, 118, 105,  99, 101, //    <${Device\n 115, 125,  32, 112,  97, 116, 104,  61,  34, 100, 101, 118, // s} path=\"dev\n 105,  99, 101, 115,  34,  32,  47,  62,  10,  32,  32,  32, // ices\" />.   \n  32,  60,  47,  47,  62,  10,  32,  32,  60,  47,  47,  62, //  <//>.  <//>\n  10,  60,  47,  47,  62,  96,  59,  10, 125,  59,  10,  10, // .<//>`;.};..\n 119, 105, 110, 100, 111, 119,  46, 111, 110, 108, 111,  97, // window.onloa\n 100,  32,  61,  32, 101, 118,  32,  61,  62,  32, 114, 101, // d = ev => re\n 110, 100, 101, 114,  40, 104,  40,  65, 112, 112,  41,  44, // nder(h(App),\n  32, 100, 111,  99, 117, 109, 101, 110, 116,  46,  98, 111, //  document.bo\n 100, 121,  41,  59,  10, 0 // dy);.\n};\n\nstatic const struct packed_file {\n  const char *name;\n  const unsigned char *data;\n  size_t size;\n  time_t mtime;\n} packed_files[] = {\n  {\"/web_root/bundle.js\", v1, sizeof(v1), 1752671662},\n  {\"/web_root/components.js\", v2, sizeof(v2), 1752671662},\n  {\"/web_root/history.min.js\", v3, sizeof(v3), 1752671662},\n  {\"/web_root/index.html\", v4, sizeof(v4), 1753452141},\n  {\"/web_root/main.js\", v5, sizeof(v5), 1752671662},\n  {NULL, NULL, 0, 0}\n};\n\nstatic int scmp(const char *a, const char *b) {\n  while (*a && (*a == *b)) a++, b++;\n  return *(const unsigned char *) a - *(const unsigned char *) b;\n}\nconst char *mg_unlist(size_t no) {\n  return packed_files[no].name;\n}\nconst char *mg_unpack(const char *name, size_t *size, time_t *mtime) {\n  const struct packed_file *p;\n  for (p = packed_files; p->name != NULL; p++) {\n    if (scmp(p->name, name) != 0) continue;\n    if (size != NULL) *size = p->size - 1;\n    if (mtime != NULL) *mtime = p->mtime;\n    return (const char *) p->data;\n  }\n  return NULL;\n}\n"
  },
  {
    "path": "tutorials/http/wifi-router-dashboard/tailwind.config.js",
    "content": "module.exports = {\n  content: ['./web_root/*.{html,js}'],\n  xplugins: [ 'tailwindcss', 'xautoprefixer' ],\n  corePlugins: {outline: false},\n  theme: {\n    extend: {},\n    fontFamily: {\n      sans:\n      [\n        \"Inter var, Helvetica, sans-serif\", {\n          fontFeatureSettings: '\"cv11\", \"ss01\"',\n          fontVariationSettings: '\"opsz\" 32',\n        }\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "tutorials/http/wifi-router-dashboard/web_root/main.js",
    "content": "'use strict';\nimport { h, render, useState, useEffect, html, Router } from  './bundle.js';\nimport { Icons, Login, Setting, Button, Stat, tipColors, Colored, Notification } from './components.js';\n\nconst Logo = props => html`<svg class=${props.class} xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 12.87 12.85\"><defs><style>.ll-cls-1{fill:none;stroke:#000;stroke-miterlimit:10;stroke-width:0.5px;}</style></defs><g id=\"Layer_2\" data-name=\"Layer 2\"><g id=\"Layer_1-2\" data-name=\"Layer 1\"><path class=\"ll-cls-1\" d=\"M12.62,1.82V8.91A1.58,1.58,0,0,1,11,10.48H4a1.44,1.44,0,0,1-1-.37A.69.69,0,0,1,2.84,10l-.1-.12a.81.81,0,0,1-.15-.48V5.57a.87.87,0,0,1,.86-.86H4.73V7.28a.86.86,0,0,0,.86.85H9.42a.85.85,0,0,0,.85-.85V3.45A.86.86,0,0,0,10.13,3,.76.76,0,0,0,10,2.84a.29.29,0,0,0-.12-.1,1.49,1.49,0,0,0-1-.37H2.39V1.82A1.57,1.57,0,0,1,4,.25H11A1.57,1.57,0,0,1,12.62,1.82Z\"/><path class=\"ll-cls-1\" d=\"M10.48,10.48V11A1.58,1.58,0,0,1,8.9,12.6H1.82A1.57,1.57,0,0,1,.25,11V3.94A1.57,1.57,0,0,1,1.82,2.37H8.9a1.49,1.49,0,0,1,1,.37l.12.1a.76.76,0,0,1,.11.14.86.86,0,0,1,.14.47V7.28a.85.85,0,0,1-.85.85H8.13V5.57a.86.86,0,0,0-.85-.86H3.45a.87.87,0,0,0-.86.86V9.4a.81.81,0,0,0,.15.48l.1.12a.69.69,0,0,0,.13.11,1.44,1.44,0,0,0,1,.37Z\"/></g></g></svg>`;\n\nfunction Header({logout, user, setShowSidebar, showSidebar}) {\n  return html`\n<div class=\"bg-white sticky top-0 z-[48] xw-full border-b py-2 ${showSidebar && 'pl-72'} transition-all duration-300 transform\">\n  <div class=\"px-2 w-full py-0 my-0 flex items-center\">\n    <button type=\"button\" onclick=${ev => setShowSidebar(v => !v)} class=\"text-slate-400\">\n      <${Icons.bars3} class=\"h-6\" />\n    <//>\n    <div class=\"flex flex-1 gap-x-4 self-stretch lg:gap-x-6\">\n      <div class=\"relative flex flex-1\"><//>\n      <div class=\"flex items-center gap-x-4 lg:gap-x-6\">\n        <span class=\"text-sm text-slate-400\">logged in as: ${user}<//>\n        <div class=\"hidden lg:block lg:h-4 lg:w-px lg:bg-gray-200\" aria-hidden=\"true\"><//>\n        <${Button} title=\"Logout\" icon=${Icons.logout} onclick=${logout} />\n      <//>\n    <//>\n  <//>\n<//>`;\n};\n\nconst NavLink = ({title, icon, href, url}) => html`\n<div>\n  <a href=\"#${href}\" class=\"${href == url ? 'bg-slate-50 text-blue-600 group' : 'text-gray-700 hover:text-blue-600 hover:bg-gray-50 group'} flex gap-x-3 rounded-md p-2 text-sm leading-6 font-semibold\">\n    <${icon} class=\"w-6 h-6\"/>\n    ${title}\n  <///>\n<//>`;\n\nfunction Sidebar({url, show}) {\n  return html`\n<div class=\"bg-violet-100 hs-overlay hs-overlay-open:translate-x-0\n            -translate-x-full transition-all duration-300 transform\n            fixed top-0 left-0 bottom-0 z-[60] w-72 bg-white border-r\n            border-gray-200 overflow-y-auto scrollbar-y\n            ${show && 'translate-x-0'} right-auto bottom-0\">\n  <div class=\"flex flex-col m-4 gap-y-6\">\n    <div class=\"flex h-10 shrink-0 items-center gap-x-4 font-bold text-xl text-slate-500\">\n      <${Logo} class=\"h-full\"/> Your Brand\n    <//>\n    <div class=\"flex flex-1 flex-col\">\n      <${NavLink} title=\"Dashboard\" icon=${Icons.home} href=\"/\" url=${url} />\n      <${NavLink} title=\"Connected Devices\" icon=${Icons.link} href=\"/devices\" url=${url} />\n      <${NavLink} title=\"Firewall\" icon=${Icons.shield} href=\"/firewall\" url=${url} />\n      <${NavLink} title=\"DHCP\" icon=${Icons.barsdown} href=\"/dhcp\" url=${url} />\n      <${NavLink} title=\"Administration\" icon=${Icons.settings} href=\"/admin\" url=${url} />\n    <//>\n  <//>\n<//>`;\n};\n\nfunction Events({}) {\n  const [events, setEvents] = useState([]);\n  const refresh = () => fetch('api/events/get').then(r => r.json()).then(r => setEvents(r)).catch(e => console.log(e));\n  useEffect(refresh, []);\n\n  const Th = props => html`<th scope=\"col\" class=\"sticky top-0 z-10 border-b border-slate-300 bg-white bg-opacity-75 py-1.5 px-4 text-left text-sm font-semibold text-slate-900 backdrop-blur backdrop-filter\">${props.title}</th>`;\n  const Td = props => html`<td class=\"whitespace-nowrap border-b border-slate-200 py-2 px-4 pr-3 text-sm text-slate-900\">${props.text}</td>`;\n  const Prio = ({prio}) => {\n    const text = ['high', 'medium', 'low'][prio];\n    const colors = [tipColors.red, tipColors.yellow, tipColors.green][prio];\n    return html`<${Colored} colors=${colors} text=${text} />`;\n  };\n  const Event = ({e}) => html`\n<tr>\n  <${Td} text=${['network', 'optic', 'power', 'routing'][e.type]} />\n  <${Td} text=${html`<${Prio} prio=${e.prio}/>`} />\n  <${Td} text=${e.time || '1970-01-01'} />\n  <${Td} text=${e.text} />\n<//>`;\n  //console.log(events);\n\n  return html`\n<div class=\"m-4 h-64 divide-y divide-gray-200 overflow-auto rounded bg-white\">\n  <div class=\"font-light uppercase flex items-center text-slate-600 px-4 py-2\">\n    Event Log\n  <//>\n  <div class=\"inline-block min-w-full py-2 align-middle\">\n    <table class=\"min-w-full border-separate border-spacing-0\">\n      <thead>\n        <tr>\n          <${Th} title=\"Type\" />\n          <${Th} title=\"Prio\" />\n          <${Th} title=\"Time\" />\n          <${Th} title=\"Description\" />\n        </tr>\n      </thead>\n      <tbody>\n        ${events.map(e => h(Event, {e}))}\n      </tbody>\n    </table>\n  <//>\n<//>`;\n};\n\nfunction ModemStatus({}) {\n  const th = props => html`<th scope=\"col\" class=\"px-4 py-3 text-xs text-left font-light uppercase text-gray-800\"> ${props.title} <//>`;\n  const td = props => html`<td scope=\"col\" class=\"px-4 py-3 text-sm text-left font-normal text-gray-800\"> ${props.text} <//>`;\n  const tr = props => html`<tr class=\"hover:bg-slate-50\">${props.cols.map(text => h(td, {text}))}<//>`;\n\n  return html`\n<div class=\"m-4 divide-y divide-gray-200 overflow-auto rounded bg-white\">\n  <div class=\"font-light uppercase flex items-center text-gray-600 px-4 py-2\">\n    Cable Modem Status\n  <//>\n  <table class=\"min-w-full divide-y divide-gray-200 dark:divide-gray-700\">\n    <thead class=\"\">\n      <tr>\n        <${th} title=\"\" />\n        <${th} title=\"Status\" />\n        <${th} title=\"Comment\" />\n      </tr>\n    </thead>\n    <tbody>\n      <${tr} cols=${['Downstream Channel (Hz)', '4820000000', 'Locked']} />\n      <${tr} cols=${['Upstream Channel (Hz)', '3280000', 'Ranged']} />\n      <${tr} cols=${['Provisioning State', 'Online', 'Operational']} />\n    </tbody>\n  <//>\n<//>`;\n};\n\nconst range = (start, size, step) => Array.from({length: size}, (_, i) => i * (step || 1) + start);\n\nfunction SpeedChart({stats}) {\n  const us = stats.upload_speed, ds = stats.download_speed;\n  const n = us.length /* entries */, w = 20 /* entry width */, ls = 15/* left space */;\n  const h = 100 /* graph height */, yticks = 5 /* Y axis ticks */, bs = 10 /* bottom space */;\n  const ymax = 500;\n  const yt = i => (h - bs) / yticks * (i + 1);\n  const bh = p => (h - bs) * p / 100; // Bar height\n  const by = p => (h - bs) - bh(p);\n  // console.log(ds);\n  return html`\n<div class=\"m-4 divide-y divide-gray-200 overflow-auto rounded bg-white\">\n  <div class=\"font-light uppercase flex items-center text-gray-600 px-4 py-2\">\n    Internet Speed, last 24h\n  <//>\n  <div class=\"relative\">\n    <svg class=\"bg-yellow-x50 w-full p-4\" viewBox=\"0 0 ${n*w+ls} ${h}\">\n      ${range(0, yticks).map(i => html`\n        <line x1=0 y1=${yt(i)} x2=${ls+n*w} y2=${yt(i)} stroke-width=0.3 class=\"stroke-slate-300\" stroke-dasharray=\"1,1\" />\n        <text x=0 y=${yt(i)-2} class=\"text-[6px] fill-slate-400\">${ymax-ymax/yticks*(i+1)}<//>\n      `)}\n      ${range(0, n).map(x => html`\n        <rect x=${ls+x*w} y=${by(ds[x]*100/ymax)} width=8 height=${bh(ds[x]*100/ymax)} rx=2 class=\"fill-sky-800\" />\n        <rect x=${ls+x*w+8} y=${by(us[x]*100/ymax)} width=8 height=${bh(us[x]*100/ymax)} rx=2 class=\"fill-sky-400\" />\n        <text x=${ls+x*w} y=100 class=\"text-[6px] fill-slate-400\">${x*2}:00<//>\n      `)}\n    <//>\n  <//>\n<//>`;\n};\n\nfunction Main({}) {\n  const [stats, setStats] = useState(null);\n  const refresh = () => fetch('api/stats/get').then(r => r.json()).then(r => setStats(r));\n  useEffect(refresh, []);\n  if (!stats) return '';\n  return html`\n<div class=\"p-2\">\n  <div class=\"max-w-[85rem] px-4 sm:px-2 lg:px-4 lg:py-4 mx-auto\">\n    <div class=\"grid sm:grid-cols-2 lg:grid-cols-4 gap-4 sm:gap-6\">\n      <${Stat} title=\"Download Speed\" text=\"${stats.download_speed[0]} Mbps\" tipText=\"slow\" tipIcon=${Icons.alert} tipColors=${tipColors.red} />\n      <${Stat} title=\"Upload Speed\" text=\"${stats.upload_speed[0]} Mbps\" tipText=\"good\" tipIcon=${Icons.ok} tipColors=${tipColors.green} />\n      <${Stat} title=\"Daily Downloaded\" text=\"${stats.downloaded} Mb\" tipText=\"-2.2%\" tipIcon=${Icons.arrowdown} />\n      <${Stat} title=\"Daily Uploaded\" text=\"${stats.uploaded} Mb\" tipText=\"+12.7%\" tipIcon=${Icons.arrowup} />\n    <//>\n  <//>\n  <div class=\"grid grid-cols-1 lg:grid-cols-2 gap-2\">\n    <${SpeedChart} stats=${stats} />\n    <${Events} />\n    <${ModemStatus} />\n  <//>\n<//>`;\n};\n\nfunction Devices({}) {\n  const [devices, setDevices] = useState(null);\n  const refresh = () => fetch('api/devices/get')\n    .then(r => r.json())\n    .then(r => setDevices(r));\n  useEffect(refresh, []);\n\n  const th = props => html`<th scope=\"col\" class=\"sticky top-0 z-10 border-b border-slate-300 bg-white bg-opacity-75 py-1.5 px-4 text-left text-sm font-semibold text-slate-900 backdrop-blur backdrop-filter\">${props.title}</th>`;\n  const td = props => html`<td class=\"whitespace-nowrap border-b border-slate-200 py-2 px-4 pr-3 text-sm text-slate-900\">${props.text}</td>`;\n\n  const Device = ({d}) => html`\n<tr>\n  <${td} text=${d.dev_name} />\n  <${td} text=${d.mac} />\n  <${td} text=${d.ip} />\n  <${td} text=${d.speed} />\n  <${td} text=${d.connected_to} />\n  <${td} text=${d.lease_time_left} />\n  <${td} text=${d.last_seen} />\n<//>`;\n\nif (!devices) return '';\nreturn html`\n  <div class=\"overflow-x-auto shadow-xl rounded-xl bg-white dark:bg-gray-800 my-3 mx-4\">\n    <div class=\"font-light uppercase flex text-slate-600 px-4 py-2 justify-between\">\n      Connected devices\n      <${Button} title=\"Refresh table\" icon=${Icons.refresh} onclick=${refresh} mx-2 />\n    <//>\n    <div class=\"align-middle inline-block w-full\">\n      <div class=\"overflow-hidden\">\n        <table class=\"min-w-full divide-y divide-gray-200 dark:divide-gray-700 text-sm md:text-base lg:text-lg\">\n          <thead class=\"bg-gray-200 dark:bg-gray-700 text-gray-600 dark:text-gray-300\">\n            <tr>\n              <${th} title=\"Device Name\" />\n              <${th} title=\"MAC address\" />\n              <${th} title=\"IP address\" />\n              <${th} title=\"Speed (Mbps)\" />\n              <${th} title=\"Connected to\" />\n              <${th} title=\"Lease time left\" />\n              <${th} title=\"Last seen\" />\n            </tr>\n          </thead>\n          <tbody class=\"bg-white dark:bg-gray-900 text-gray-800 dark:text-gray-200\">\n            ${devices.map(d => h(Device, {d}))}\n          </tbody>\n        </table>\n      </div>\n    </div>\n  </div>`;\n};\n\nfunction DHCP({}) {\n  const [dhcp, setDhcp] = useState(null);\n  const [saveResult, setSaveResult] = useState(null);\n  const refresh = () => fetch('api/dhcp/get')\n    .then(r => r.json())\n    .then(r => setDhcp(r));\n  useEffect(refresh, []);\n\n  const mksetfn = k => (v => setDhcp(x => Object.assign({}, x, {[k]: v}))); \n  const onsave = ev => fetch('api/dhcp/set', {\n    method: 'post', body: JSON.stringify(dhcp) \n  }).then(r => r.json())\n    .then(r => setSaveResult(r))\n    .then(refresh);\n\n  if (!dhcp) return '';\n  return html`\n<div class=\"m-4 grid grid-cols-1 gap-4 md:grid-cols-2\">\n\n  <div class=\"py-1 divide-y border rounded bg-white flex flex-col\">\n    <div class=\"font-light uppercase flex items-center text-gray-600 px-4 py-2\">\n      DHCP Server Settings\n    <//>\n    <div class=\"py-2 px-5 flex-1 flex flex-col relative\">\n      ${saveResult && html`<${Notification} ok=${saveResult.status}\n        text=${saveResult.message} close=${() => setSaveResult(null)} />`}\n\n      <${Setting} title=\"Enabled\" value=${dhcp.enabled} setfn=${mksetfn('enabled')} type=\"switch\" />\n      <${Setting} title=\"Start Address\" value=${dhcp.address_begin} setfn=${mksetfn('address_begin')} type=\"number\" addonLeft=\"192.168.0.\" disabled=${!dhcp.enabled} />\n      <${Setting} title=\"End Address\" value=${dhcp.address_end} setfn=${mksetfn('address_end')} type=\"number\" addonLeft=\"192.168.0.\" disabled=${!dhcp.enabled} />\n      <${Setting} title=\"Lease Time\" value=${dhcp.lease_time_sec} setfn=${mksetfn('lease_time_sec')} type=\"number\" addonRight=\"seconds\" disabled=${!dhcp.enabled} />\n      <div class=\"mb-1 mt-3 flex place-content-end\"><${Button} icon=${Icons.save} onclick=${onsave} title=\"Save Settings\" /><//>\n    <//>\n  <//>\n<//>`;\n};\n\nconst App = function({}) {\n  const [loading, setLoading] = useState(true);\n  const [url, setUrl] = useState('/');\n  const [user, setUser] = useState('');\n  const [showSidebar, setShowSidebar] = useState(true);\n\n  const logout = () => fetch('api/logout').then(r => setUser(''));\n  const login = r => !r.ok ? setLoading(false) : r.json()\n      .then(r => setUser(r.user))\n      .finally(r => setLoading(false));\n\n  useEffect(() => fetch('api/login').then(login), []);\n\n  if (loading) return '';  // Show blank page on initial load\n  if (!user) return html`<${Login} loginFn=${login} logoIcon=${Logo} title=\"WiFi Router Login\" tipText=\"To login, use: admin/admin, user1/user1, user2/user2\" />`; // If not logged in, show login screen\n\n  return html`\n<div class=\"min-h-screen bg-slate-100\">\n  <${Sidebar} url=${url} show=${showSidebar} />\n  <${Header} logout=${logout} user=${user} showSidebar=${showSidebar} setShowSidebar=${setShowSidebar} />\n  <div class=\"${showSidebar && 'pl-72'} transition-all duration-300 transform\">\n    <${Router} onChange=${ev => setUrl(ev.url)} history=${History.createHashHistory()} >\n      <${Main} default=${true} />\n      <${DHCP} path=\"dhcp\" />\n      <${Devices} path=\"devices\" />\n    <//>\n  <//>\n<//>`;\n};\n\nwindow.onload = ev => render(h(App), document.body);\n"
  },
  {
    "path": "tutorials/infineon/xmc47_relax-make-baremetal-builtin/Makefile",
    "content": "BOARD = xmc4700\nIDE = GCC+make\nRTOS = baremetal\nWIZARD_URL ?= http://mongoose.ws/wizard\n\nall build example: firmware.bin\n\nfirmware.bin: wizard\n\tmake -C wizard CFLAGS_EXTRA=$(CFLAGS_EXTRA) && mv wizard/firmware.bin ./\n\nwizard:\n\thash=$$(curl -H 'Cookie: mongoose_wizard_uid=F2PPlAgQCqSthV1g' -s -X POST -H \"Content-Type: application/json\" -d '{\"build\":{\"board\":\"$(BOARD)\",\"ide\":\"$(IDE)\",\"rtos\":\"$(RTOS)\"},\"http\":{\"http\": true}}' $(WIZARD_URL)/api/hash | jq -r '.hash') \\\n\t&& curl -H 'Cookie: mongoose_wizard_uid=F2PPlAgQCqSthV1g' -s $(WIZARD_URL)/api/zip -o wizard.zip\n\tunzip wizard.zip\n\tcd wizard/mongoose ; rm mongoose.[ch] ; ln -s ../../../../../mongoose.c ; ln -s ../../../../../mongoose.h\n\n\n# Automated remote test. Requires env variable VCON_API_KEY set. See https://vcon.io/automated-firmware-tests/\nDEVICE_URL ?= https://dash.vcon.io/api/v3/devices/??\nupdate: firmware.bin\n\tcurl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/ota --data-binary @$<\n\ntest update: CFLAGS_EXTRA =\"-DUART_DEBUG=USART1\"\ntest: update\n\tcurl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/tx?t=15 | tee /tmp/output.txt\n\tgrep 'READY, IP:' /tmp/output.txt       # Check for network init\n\nclean:\n\trm -rf firmware.* wizard*\n"
  },
  {
    "path": "tutorials/infineon/xmc47_relax-make-baremetal-builtin/README.md",
    "content": "See [Wizard](https://mongoose.ws/wizard/#/output?board=xmc4700&ide=GCC+make&rtos=baremetal&file=README.md)\n"
  },
  {
    "path": "tutorials/infineon/xmc72_evk-make-baremetal-builtin/Makefile",
    "content": "BOARD = xmc7200\nIDE = GCC+make\nRTOS = baremetal\nWIZARD_URL ?= http://mongoose.ws/wizard\n\nall build example: firmware.bin\n\nfirmware.bin: wizard\n\tmake -C wizard CFLAGS_EXTRA=$(CFLAGS_EXTRA) && mv wizard/firmware.bin ./\n\nwizard:\n\thash=$$(curl -H 'Cookie: mongoose_wizard_uid=F2PPlAgQCqSthV1g' -s -X POST -H \"Content-Type: application/json\" -d '{\"build\":{\"board\":\"$(BOARD)\",\"ide\":\"$(IDE)\",\"rtos\":\"$(RTOS)\"},\"http\":{\"http\": true}}' $(WIZARD_URL)/api/hash | jq -r '.hash') \\\n\t&& curl -H 'Cookie: mongoose_wizard_uid=F2PPlAgQCqSthV1g' -s $(WIZARD_URL)/api/zip -o wizard.zip\n\tunzip wizard.zip\n\tcd wizard/mongoose ; rm mongoose.[ch] ; ln -s ../../../../../mongoose.c ; ln -s ../../../../../mongoose.h\n\n\n# Automated remote test. Requires env variable VCON_API_KEY set. See https://vcon.io/automated-firmware-tests/\nDEVICE_URL ?= https://dash.vcon.io/api/v3/devices/??\nupdate: firmware.bin\n\tcurl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/ota --data-binary @$<\n\ntest update: CFLAGS_EXTRA =\"-DUART_DEBUG=USART1\"\ntest: update\n\tcurl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/tx?t=15 | tee /tmp/output.txt\n\tgrep 'READY, IP:' /tmp/output.txt       # Check for network init\n\nclean:\n\trm -rf firmware.* wizard*\n"
  },
  {
    "path": "tutorials/infineon/xmc72_evk-make-baremetal-builtin/README.md",
    "content": "See [Wizard](https://mongoose.ws/wizard/#/output?board=xmc7200&ide=GCC+make&rtos=baremetal&file=README.md)\n"
  },
  {
    "path": "tutorials/infineon/xmc_plt2go_4400-make-baremetal-builtin/Makefile",
    "content": "BOARD = xmc4400\nIDE = GCC+make\nRTOS = baremetal\nWIZARD_URL ?= http://mongoose.ws/wizard\n\nall build example: firmware.bin\n\nfirmware.bin: wizard\n\tmake -C wizard CFLAGS_EXTRA=$(CFLAGS_EXTRA) && mv wizard/firmware.bin ./\n\nwizard:\n\thash=$$(curl -H 'Cookie: mongoose_wizard_uid=F2PPlAgQCqSthV1g' -s -X POST -H \"Content-Type: application/json\" -d '{\"build\":{\"board\":\"$(BOARD)\",\"ide\":\"$(IDE)\",\"rtos\":\"$(RTOS)\"},\"http\":{\"http\": true}}' $(WIZARD_URL)/api/hash | jq -r '.hash') \\\n\t&& curl -H 'Cookie: mongoose_wizard_uid=F2PPlAgQCqSthV1g' -s $(WIZARD_URL)/api/zip -o wizard.zip\n\tunzip wizard.zip\n\tcd wizard/mongoose ; rm mongoose.[ch] ; ln -s ../../../../../mongoose.c ; ln -s ../../../../../mongoose.h\n\n\n# Automated remote test. Requires env variable VCON_API_KEY set. See https://vcon.io/automated-firmware-tests/\nDEVICE_URL ?= https://dash.vcon.io/api/v3/devices/??\nupdate: firmware.bin\n\tcurl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/ota --data-binary @$<\n\ntest update: CFLAGS_EXTRA =\"-DUART_DEBUG=USART1\"\ntest: update\n\tcurl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/tx?t=15 | tee /tmp/output.txt\n\tgrep 'READY, IP:' /tmp/output.txt       # Check for network init\n\nclean:\n\trm -rf firmware.* wizard*\n"
  },
  {
    "path": "tutorials/infineon/xmc_plt2go_4400-make-baremetal-builtin/README.md",
    "content": "See [Wizard](https://mongoose.ws/wizard/#/output?board=xmc4400&ide=GCC+make&rtos=baremetal&file=README.md)\n"
  },
  {
    "path": "tutorials/micropython/Makefile",
    "content": "\nall: example\n\tmicropython/ports/unix/build-standard/micropython main.py\n\nexample: micropython\n\t$(MAKE) -C micropython/ports/unix submodules\n\t$(MAKE) -C micropython/ports/unix USER_C_MODULES=../../..\n\nmicropython:\n\tgit clone --depth 1 -b v1.22.2 https://github.com/micropython/micropython.git\n\nclean:\n\trm -rf micropython\n"
  },
  {
    "path": "tutorials/micropython/README.md",
    "content": "# Mongoose as a MicroPython user module\n\nThe most basic usage is in `main.py`.\n\nYou'll have to configure Mongoose for your desired platform, this example runs on the `unix` port and Mongoose detects it as a known architecture and hence configures itself to use sockets and time base. For other platforms, you'll have to do your homework (there's plenty of Mongoose examples for several platforms); also check respective MicroPython build instructions.\n\nFor more information, check this third-party article: [part 1](https://www.embeddedrelated.com/showarticle/1649.php), [part 2](https://www.embeddedrelated.com/showarticle/1670.php)\n\nCheck [_thread](https://docs.micropython.org/en/latest/library/_thread.html) support for more advanced usage\n\nhttps://docs.micropython.org/en/latest/develop/cmodules.html\n"
  },
  {
    "path": "tutorials/micropython/esp32/Makefile",
    "content": "\nTHISDIR = $(realpath $(CURDIR))\nROOTDIR = $(realpath $(CURDIR)/../../..)\nPORT ?= /dev/ttyUSB0\nDOCKER ?= docker run --rm $(DA) -v $(ROOTDIR):$(ROOTDIR) -w $(THISDIR) espressif/idf:v5.0.4\n# Note that the esp32 port needs the extra .. for relative paths due to the location of its main CMakeLists.txt file\nCMD ?= bash -c '$(MAKE) -C micropython/ports/esp32 submodules && $(MAKE) -C micropython/ports/esp32 USER_C_MODULES=../../../../mongoose/micropython.cmake'\n\nall: example\n\nexample:\n\ttrue\n\nbuild: micropython\n\t$(DOCKER) $(CMD)\n\nmicropython:\n\t$(DOCKER) git clone --depth 1 -b v1.22.2 https://github.com/micropython/micropython.git\n\nclean:\n\ttest -d micropython && $(DOCKER) rm -rf micropython || true\n\nflash:\nflash: DA = --device $(PORT)\nflash: CMD = bash -c '$(MAKE) -C micropython/ports/esp32 erase deploy'\nflash: build\n"
  },
  {
    "path": "tutorials/micropython/esp32/README.md",
    "content": "# Mongoose as a MicroPython user module on the ESP32\n\nThe most basic usage is:\n\n```python\nimport network\nimport mongoose\n\nsta_if = network.WLAN(network.STA_IF)\nsta_if.active(True)                      \nsta_if.connect(\"<SSID>\", \"<PASSWORD>\")\nwhile not sta_if.isconnected():\n    pass\n\nmongoose.init()\nwhile True:\n    mongoose.poll(1000)\n\n```\n\n[Please check the Linux example for more information and useful links](../README.md)\n"
  },
  {
    "path": "tutorials/micropython/esp32/mongoose/main.c",
    "content": "// Copyright (c) 2022 Cesanta Software Limited\n// All rights reserved\n\n#include \"mongoose.h\"\n\nstatic void t_fn(void *arg) {  // Tick periodically\n  MG_INFO((\"tick\"));\n  (void) arg;\n}\n\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) mg_http_reply(c, 200, \"\", \"hi\\n\");\n  (void) ev_data;\n}\n\nstatic struct mg_mgr mgr;\n\nvoid mgmp_init(void) {\n  mg_mgr_init(&mgr);        // Mongoose event manager\n  mg_log_set(MG_LL_DEBUG);  // Set log level\n\n  mg_timer_add(&mgr, 1000, MG_TIMER_REPEAT, t_fn, &mgr);\n  mg_http_listen(&mgr, \"http://0.0.0.0:80\", fn, &mgr);\n}\n\nvoid mgmp_poll(int t) {\n  mg_mgr_poll(&mgr, t);\n}\n"
  },
  {
    "path": "tutorials/micropython/esp32/mongoose/mongoose_config.h",
    "content": "#define MG_ARCH MG_ARCH_ESP32\n"
  },
  {
    "path": "tutorials/micropython/main.py",
    "content": "import mongoose\n\nmongoose.init()\nwhile True:\n    mongoose.poll(1000)\n"
  },
  {
    "path": "tutorials/micropython/mongoose/main.c",
    "content": "// Copyright (c) 2022 Cesanta Software Limited\n// All rights reserved\n\n#include \"mongoose.h\"\n\nstatic void t_fn(void *arg) {  // Tick periodically\n  MG_INFO((\"tick\"));\n  (void) arg;\n}\n\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_HTTP_MSG) mg_http_reply(c, 200, \"\", \"hi\\n\");\n  (void) ev_data;\n}\n\nstatic struct mg_mgr mgr;\n\nvoid mgmp_init(void) {\n  mg_mgr_init(&mgr);        // Mongoose event manager\n  mg_log_set(MG_LL_DEBUG);  // Set log level\n\n  mg_timer_add(&mgr, 1000, MG_TIMER_REPEAT, t_fn, &mgr);\n  mg_http_listen(&mgr, \"http://0.0.0.0:8000\", fn, &mgr);\n}\n\nvoid mgmp_poll(int t) {\n  mg_mgr_poll(&mgr, t);\n}\n"
  },
  {
    "path": "tutorials/micropython/mongoose/micropython.cmake",
    "content": "# Create an INTERFACE library for our C module.\nadd_library(usermod_mongoose INTERFACE)\n\n# Add our source files to the lib\ntarget_sources(usermod_mongoose INTERFACE\n    ${CMAKE_CURRENT_LIST_DIR}/module.c\n    ${CMAKE_CURRENT_LIST_DIR}/mongoose.c\n    ${CMAKE_CURRENT_LIST_DIR}/main.c\n)\n\n# Add the current directory as an include directory.\ntarget_include_directories(usermod_mongoose INTERFACE\n    ${CMAKE_CURRENT_LIST_DIR}\n)\n\n# Link our INTERFACE library to the usermod target.\ntarget_link_libraries(usermod INTERFACE usermod_mongoose)\n"
  },
  {
    "path": "tutorials/micropython/mongoose/micropython.mk",
    "content": "CEXAMPLE_MOD_DIR := $(USERMOD_DIR)\n\n# Add all C files to SRC_USERMOD.\nSRC_USERMOD += $(CEXAMPLE_MOD_DIR)/module.c\nSRC_USERMOD += $(CEXAMPLE_MOD_DIR)/mongoose.c\nSRC_USERMOD += $(CEXAMPLE_MOD_DIR)/main.c\n\n# add our module folder to include paths\nCFLAGS_USERMOD += -I$(CEXAMPLE_MOD_DIR)\n"
  },
  {
    "path": "tutorials/micropython/mongoose/module.c",
    "content": "#include \"py/runtime.h\"\n\nextern void mgmp_init(void);\nextern void mgmp_poll(int);\n\nSTATIC mp_obj_t mongoose_init(void) {\n    mgmp_init();\n    return mp_const_none;\n}\nSTATIC MP_DEFINE_CONST_FUN_OBJ_0(mongoose_init_obj, mongoose_init);\n\nSTATIC mp_obj_t mongoose_poll(mp_obj_t t_obj) {\n    mgmp_poll(mp_obj_get_int(t_obj));\n    return mp_const_none;\n}\nSTATIC MP_DEFINE_CONST_FUN_OBJ_1(mongoose_poll_obj, mongoose_poll);\n\nSTATIC const mp_rom_map_elem_t mongoose_module_globals_table[] = {\n    { MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_mongoose) },\n    { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&mongoose_init_obj) },\n    { MP_ROM_QSTR(MP_QSTR_poll), MP_ROM_PTR(&mongoose_poll_obj) },\n};\nSTATIC MP_DEFINE_CONST_DICT(mongoose_module_globals, mongoose_module_globals_table);\n\nconst mp_obj_module_t mongoose_module = {\n    .base = { &mp_type_module },\n    .globals = (mp_obj_dict_t *)&mongoose_module_globals,\n};\n\nMP_REGISTER_MODULE(MP_QSTR_mongoose, mongoose_module);\n"
  },
  {
    "path": "tutorials/mqtt/README.md",
    "content": "See detailed tutorials at https://mongoose.ws/documentation/#mqtt"
  },
  {
    "path": "tutorials/mqtt/mqtt-client/Makefile",
    "content": "PROG ?= example                   # Program we are building\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c  packed_fs.c      # Source code files, packed_fs.c contains ca.pem, which contains CA certs for TLS\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += -DMG_ENABLE_LINES=1 -DMG_ENABLE_PACKED_FS=1\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= example.exe           # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\n  MAKE += WINDOWS=1 CC=$(CC)\nendif\n\nall: $(PROG)              # Default target. Build and run program\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)       # Build program from sources\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nclean:                    # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM mbedtls\n\n# see https://mongoose.ws/tutorials/tls/#how-to-build for TLS build options\n\nmbedtls:                  # Pull and build mbedTLS library\n\tgit clone --depth 1 -b v2.28.2 https://github.com/mbed-tls/mbedtls $@\n\t$(MAKE) -C mbedtls/library\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-client/README.md",
    "content": "See detailed tutorial at https://mongoose.ws/tutorials/mqtt/mqtt-client/\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-client/arduino/esp32-mqtt/esp32-mqtt.ino",
    "content": "#include \"WiFi.h\"\n#include \"mongoose.h\"\n\n#define WIFI_SSID \"wifi_network_name\"  // Change this\n#define WIFI_PASS \"wifi_password\"      // And this\n\n#define MQTT_SERVER \"mqtt://broker.hivemq.com:1883\"\n#define MQTT_SUB_TOPIC \"mg/rx\"  // Subscribe to this topic\n#define MQTT_PUB_TOPIC \"mg/tx\"  // Publish to this topic\n\n#define LED_PIN 0\n\nstruct mg_mgr mgr;\nstruct mg_connection *mqtt_connection;\n\nvoid mqtt_publish(const char *message) {\n  struct mg_mqtt_opts opts = {};\n  opts.topic = mg_str(MQTT_PUB_TOPIC);\n  opts.message = mg_str(message);\n  if (mqtt_connection) mg_mqtt_pub(mqtt_connection, &opts);\n}\n\n// Crude function to get available RAM, for quick profiling\nsize_t getFreeRAM(void) {\n  size_t size = 0, increment = 100;\n  void *p;\n  while ((p = malloc(size)) != NULL) free(p), size += increment;\n  return size;\n}\n\n// Implement LED control over MQTT: \"on\" and \"off\" commands\nvoid handle_command(struct mg_str msg) {\n  if (msg.len == 3 && memcmp(msg.buf, \"off\", 3) == 0) {\n    digitalWrite(LED_PIN, LOW);\n    mqtt_publish(\"done - off\");\n  } else if (msg.len == 2 && memcmp(msg.buf, \"on\", 2) == 0) {\n    digitalWrite(LED_PIN, HIGH);\n    mqtt_publish(\"done - on\");\n  }\n  MG_INFO((\"Free RAM: %u bytes\", getFreeRAM()));\n}\n\nstatic void mqtt_ev_handler(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_MQTT_OPEN) {\n    MG_INFO((\"%lu CONNECTED to %s\", c->id, MQTT_SERVER));\n    struct mg_mqtt_opts opts = {};\n    opts.topic = mg_str(MQTT_SUB_TOPIC);\n    mg_mqtt_sub(c, &opts);\n    MG_INFO((\"%lu SUBSCRIBED to %s\", c->id, MQTT_SUB_TOPIC));\n  } else if (ev == MG_EV_MQTT_MSG) {\n    // Received MQTT message\n    struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;\n    MG_INFO((\"%lu RECEIVED %.*s <- %.*s\", c->id, (int) mm->data.len,\n             mm->data.buf, (int) mm->topic.len, mm->topic.buf));\n    handle_command(mm->data);\n  } else if (ev == MG_EV_CLOSE) {\n    MG_INFO((\"%lu CLOSED\", c->id));\n    mqtt_connection = NULL;\n  }\n}\n\nvoid reconnect_if_not_connected(void) {\n  if (mqtt_connection == NULL) {\n    struct mg_mqtt_opts opts = {};\n    opts.clean = true;\n    mqtt_connection =\n        mg_mqtt_connect(&mgr, MQTT_SERVER, &opts, mqtt_ev_handler, NULL);\n  }\n}\n\nvoid setup() {\n  pinMode(LED_PIN, OUTPUT);\n  Serial.begin(115200);\n  while (!Serial) delay(50);\n\n  WiFi.mode(WIFI_STA);\n  WiFi.begin(WIFI_SSID, WIFI_PASS);\n  while (WiFi.status() != WL_CONNECTED) Serial.print(\".\"), delay(100);\n\n  Serial.println(\"\\nConnected to the WiFi network\");\n  Serial.print(\"IP Address: \");\n  Serial.println(WiFi.localIP());\n\n  mg_mgr_init(&mgr);\n  mg_log_set(MG_LL_DEBUG);\n  mg_log_set_fn([](char ch, void *) { Serial.print(ch); }, NULL);\n}\n\nvoid loop() {\n  mg_mgr_poll(&mgr, 1);          // Process network events\n  reconnect_if_not_connected();  // Reconnect to MQTT server if needed\n}\n\nextern \"C\" int lwip_hook_ip6_input(struct pbuf *p, struct netif *inp)\n    __attribute__((weak));\nextern \"C\" int lwip_hook_ip6_input(struct pbuf *p, struct netif *inp) {\n  if (ip6_addr_isany_val(inp->ip6_addr[0].u_addr.ip6)) {\n    pbuf_free(p);\n    return 1;\n  }\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-client/arduino/esp32-mqtt/mongoose_config.h",
    "content": "#pragma once\n\n#define MG_ARCH MG_ARCH_ESP32\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-client/arduino/nano-w5500-mqtt/mongoose_config.h",
    "content": "#pragma once\n\n#include \"Arduino.h\"\n\n#include <errno.h>\n#include <stdarg.h>\n#include <stdio.h>\n#include <time.h>\n\n#define MG_ARCH MG_ARCH_CUSTOM\n#define MG_ENABLE_TCPIP 1\n#define MG_ENABLE_DRIVER_W5500 1\n#define MG_ENABLE_TCPIP_DRIVER_INIT 0\n#define MG_ENABLE_TCPIP_PRINT_DEBUG_STATS 0\n#define MG_ENABLE_CUSTOM_MILLIS 1\n#define MG_ENABLE_CUSTOM_RANDOM 1\n#define MG_TLS MG_TLS_NONE // no room for TLS\n#define MG_IO_SIZE 128\n\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-client/arduino/nano-w5500-mqtt/w5500-mqtt.ino",
    "content": "#include <SPI.h>\n#include \"mongoose.h\"\n\n#define MQTT_SERVER \"mqtt://broker.hivemq.com:1883\"\n#define MQTT_SUB_TOPIC \"mg/rx\"  // Subscribe to this topic\n#define MQTT_PUB_TOPIC \"mg/tx\"  // Publish to this topic\n#define SS_PIN 2                // Slave select pin\n#define LED_PIN 21              // LED pin\n\nstruct mg_connection *mqtt_connection;\nstruct mg_tcpip_spi spi = {\n    NULL,  // SPI metadata\n    [](void *) { digitalWrite(SS_PIN, LOW); SPI.beginTransaction(SPISettings()); },\n    [](void *) { digitalWrite(SS_PIN, HIGH); SPI.endTransaction(); },\n    [](void *, uint8_t c) { return SPI.transfer(c); }, // Execute transaction\n};\nstruct mg_mgr mgr;                                     // Mongoose event manager\nstruct mg_tcpip_if mif = {.mac = {2, 0, 1, 2, 3, 5}};  // Network interface\n\nuint64_t mg_millis(void) {\n  return millis();\n}\nbool mg_random(void *buf, size_t len) {  // For TLS\n  uint8_t *p = (uint8_t *) buf;\n  while (len--) *p++ = (unsigned char) (rand() & 255);\n  return true;\n}\n\nvoid mqtt_publish(const char *message) {\n  struct mg_mqtt_opts opts = {};\n  opts.topic = mg_str(MQTT_PUB_TOPIC);\n  opts.message = mg_str(message);\n  if (mqtt_connection) mg_mqtt_pub(mqtt_connection, &opts);\n}\n\n// Crude function to get available RAM, for quick profiling\nsize_t getFreeRAM(void) {\n  size_t size = 0, increment = 100;\n  void *p;\n  while ((p = malloc(size)) != NULL) free(p), size += increment;\n  return size;\n}\n\n// Implement LED control over MQTT: \"on\" and \"off\" commands\nvoid handle_command(struct mg_str msg) {\n  if (msg.len == 3 && memcmp(msg.buf, \"off\", 3) == 0) {\n    digitalWrite(LED_PIN, LOW);\n    mqtt_publish(\"done - off\");\n  } else if (msg.len == 2 && memcmp(msg.buf, \"on\", 2) == 0) {\n    digitalWrite(LED_PIN, HIGH);\n    mqtt_publish(\"done - on\");\n  }\n  MG_INFO((\"Free RAM: %u bytes\", getFreeRAM()));\n}\n\nstatic void mqtt_ev_handler(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_MQTT_OPEN) {\n    MG_INFO((\"%lu CONNECTED to %s\", c->id, MQTT_SERVER));\n    struct mg_mqtt_opts opts = {};\n    opts.topic = mg_str(MQTT_SUB_TOPIC);\n    mg_mqtt_sub(c, &opts);\n    MG_INFO((\"%lu SUBSCRIBED to %s\", c->id, MQTT_SUB_TOPIC));\n  } else if (ev == MG_EV_MQTT_MSG) {\n    // Received MQTT message\n    struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;\n    MG_INFO((\"%lu RECEIVED %.*s <- %.*s\", c->id, (int) mm->data.len,\n             mm->data.buf, (int) mm->topic.len, mm->topic.buf));\n    handle_command(mm->data);\n  } else if (ev == MG_EV_CLOSE) {\n    MG_INFO((\"%lu CLOSED\", c->id));\n    mqtt_connection = NULL;\n  }\n}\n\nvoid reconnect_if_not_connected(void) {\n  if (mif.state == MG_TCPIP_STATE_READY && mqtt_connection == NULL) {\n    struct mg_mqtt_opts opts = {};\n    opts.clean = true;\n    mqtt_connection =\n        mg_mqtt_connect(&mgr, MQTT_SERVER, &opts, mqtt_ev_handler, NULL);\n  }\n}\n\nvoid setup() {\n  Serial.begin(115200);       // Initialise serial\n  while (!Serial) delay(50);  // for debug output\n\n  SPI.begin();                   // Iniitialise SPI\n  pinMode(SS_PIN, OUTPUT);       // to communicate with W5500 Ethernet module\n  pinMode(LED_PIN, OUTPUT);  // Initialise LED\n\n  mg_mgr_init(&mgr);        // Initialise Mongoose event manager\n  mg_log_set(MG_LL_DEBUG);  // Set debug log level\n  mg_log_set_fn([](char ch, void *) { Serial.print(ch); }, NULL);  // Log serial\n  mif.driver = &mg_tcpip_driver_w5500;  // Use W5500 built-in driver\n  mif.driver_data = &spi;               // Pass SPI interface to W5500 driver\n  mg_tcpip_init(&mgr, &mif);            // Initialise built-in TCP/IP stack\n}\n\nvoid loop() {\n  mg_mgr_poll(&mgr, 1);          // Process network events\n  reconnect_if_not_connected();  // Reconnect to MQTT server if needed\n}\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-client/arduino/sim800-mqtt/mongoose_config.h",
    "content": "#pragma once\n\n#include \"Arduino.h\"\n\n#include <errno.h>\n#include <stdarg.h>\n#include <stdio.h>\n#include <time.h>\n\n#define MG_ARCH MG_ARCH_CUSTOM\n#define MG_ENABLE_SOCKET 0\n#define MG_ENABLE_TCPIP 1\n#define MG_ENABLE_DRIVER_PPP 1\n#define MG_ENABLE_TCPIP_DRIVER_INIT 0\n#define MG_ENABLE_TCPIP_PRINT_DEBUG_STATS 0\n#define MG_ENABLE_CUSTOM_MILLIS 1\n#define MG_ENABLE_CUSTOM_RANDOM 1\n#define MG_TLS MG_TLS_BUILTIN\n#define MG_IO_SIZE 128\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-client/arduino/sim800-mqtt/sim800-mqtt.ino",
    "content": "#include <SoftwareSerial.h>\n#include \"mongoose.h\"\n\n#define MQTT_SERVER \"mqtt://broker.hivemq.com:8883\"\n#define MQTT_SUB_TOPIC \"mg/rx\"  // Subscribe to this topic\n#define MQTT_PUB_TOPIC \"mg/tx\"  // Publish to this topic\n\nstatic const char *script[] = {\n  \"AT\\r\\n\", \"*OK\\r\\n\",\n  \"ATZ\\r\\n\", \"*OK\\r\\n\",\n  \"AT+CPIN?\\r\\n\", \"*OK\\r\\n\",\n  \"AT+CNMI=0,0,0,0,0\\r\\n\", \"*OK\\r\\n\",\n  \"AT+CGDCONT=1,\\\"IP\\\",\\\"iot.1nce.net\\\"\\r\\n\", \"*OK\\r\\n\",\n  \"AT+CGDATA=\\\"PPP\\\",1\\r\\n\", \"*CONNECT\\r\\n\",\n  NULL,\n};\n\n// Visit https://mongoose.ws/tls/ and copy-paste CA certificate for your server\n#define TLS_CA \\\n  \"\"\n\n// We use Serial1 or software serial to communicate with the modem\n#define LED_PIN LED_BUILTIN\n#define RST_PIN 10\n#define ModemSerial Serial1\n//#define RX_PIN 9\n//#define TX_PIN 8\n//SoftwareSerial ModemSerial(RX_PIN, TX_PIN);\n\nstruct mg_connection *mqtt_connection;\nstruct mg_tcpip_driver_ppp_data driver_data;\nstruct mg_mgr mgr;                                     // Mongoose event manager\nstruct mg_tcpip_if mif = {.mac = {2, 0, 1, 2, 3, 5}};  // Network interface\n\nuint64_t mg_millis(void) {\n  return millis();\n}\nbool mg_random(void *buf, size_t len) {  // For TLS\n  uint8_t *p = (uint8_t *) buf;\n  while (len--) *p++ = (unsigned char) (rand() & 255);\n  return true;\n}\n\nvoid mqtt_publish(const char *message) {\n  struct mg_mqtt_opts opts = {};\n  opts.topic = mg_str(MQTT_PUB_TOPIC);\n  opts.message = mg_str(message);\n  if (mqtt_connection) mg_mqtt_pub(mqtt_connection, &opts);\n}\n\nvoid handle_command(struct mg_str msg) {\n  if (msg.len == 3 && memcmp(msg.buf, \"off\", 3) == 0) {\n    digitalWrite(LED_PIN, LOW);\n    mqtt_publish(\"done - off\");\n  } else if (msg.len == 2 && memcmp(msg.buf, \"on\", 2) == 0) {\n    digitalWrite(LED_PIN, HIGH);\n    mqtt_publish(\"done - on\");\n  }\n}\n\nstatic void mqtt_ev_handler(struct mg_connection *c, int ev, void *ev_data) {\n  if (c->is_tls && ev == MG_EV_CONNECT) {\n    struct mg_tls_opts opts = {};\n    opts.ca = mg_str(TLS_CA);\n    mg_tls_init(c, &opts);\n  }\n  if (ev == MG_EV_MQTT_OPEN) {\n    MG_INFO((\"%lu CONNECTED to %s\", c->id, MQTT_SERVER));\n    struct mg_mqtt_opts opts = {};\n    opts.topic = mg_str(MQTT_SUB_TOPIC);\n    mg_mqtt_sub(c, &opts);\n    MG_INFO((\"%lu SUBSCRIBED to %s\", c->id, MQTT_SUB_TOPIC));\n  } else if (ev == MG_EV_MQTT_MSG) {\n    // Received MQTT message\n    struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;\n    MG_INFO((\"%lu RECEIVED %.*s <- %.*s\", c->id, (int) mm->data.len,\n             mm->data.buf, (int) mm->topic.len, mm->topic.buf));\n    handle_command(mm->data);\n  } else if (ev == MG_EV_CLOSE) {\n    MG_INFO((\"%lu CLOSED\", c->id));\n    mqtt_connection = NULL;\n  }\n}\n\nvoid reconnect_if_not_connected(void) {\n  if (mif.state == MG_TCPIP_STATE_READY && mqtt_connection == NULL) {\n    struct mg_mqtt_opts opts = {};\n    opts.clean = true;\n    mqtt_connection =\n        mg_mqtt_connect(&mgr, MQTT_SERVER, &opts, mqtt_ev_handler, NULL);\n  }\n}\n\nvoid setup() {\n  Serial.begin(115200);       // Initialise serial for logs\n  while (!Serial) delay(50);  // for debug output\n\n  pinMode(LED_PIN, OUTPUT);  // Initialise pins\n  pinMode(RST_PIN, OUTPUT);\n  digitalWrite(RST_PIN, HIGH);\n  //pinMode(RX_PIN, INPUT);   // Only required for\n  //pinMode(TX_PIN, OUTPUT);  // software serial\n  ModemSerial.begin(115200);  // Serial for modem communication\n\n  mg_mgr_init(&mgr);        // Initialise Mongoose event manager\n  mg_log_set(MG_LL_DEBUG);  // Set debug log level\n  mg_log_set_fn([](char c, void *) { Serial.print(c); }, NULL);  // Log serial\n\n  mif.driver = &mg_tcpip_driver_ppp;  // Initialise built-in TCP/IP stack\n  mif.driver_data = &driver_data;     // with the cellular driver\n  driver_data.script = script;\n  driver_data.reset = [](void *) { digitalWrite(RST_PIN, LOW); delay(1); digitalWrite(RST_PIN, HIGH); },\n  driver_data.tx = [](void *, uint8_t c) { ModemSerial.write(c); },\n  driver_data.rx = [](void *) { return ModemSerial.available() ? ModemSerial.read() : -1; },\n  mg_tcpip_init(&mgr, &mif);\n  mif.enable_dhcp_client = false;\n}\n\nvoid loop() {\n  mg_mgr_poll(&mgr, 1);          // Process network events\n  reconnect_if_not_connected();  // Reconnect to MQTT server if needed\n}\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-client/arduino/w5500-mqtt/mongoose_config.h",
    "content": "#pragma once\n\n#include \"Arduino.h\"\n\n#include <errno.h>\n#include <stdarg.h>\n#include <stdio.h>\n#include <time.h>\n\n#define MG_ARCH MG_ARCH_CUSTOM\n#define MG_ENABLE_SOCKET 0\n#define MG_ENABLE_TCPIP 1\n#define MG_ENABLE_DRIVER_W5500 1\n#define MG_ENABLE_TCPIP_DRIVER_INIT 0\n#define MG_ENABLE_TCPIP_PRINT_DEBUG_STATS 0\n#define MG_ENABLE_CUSTOM_MILLIS 1\n#define MG_ENABLE_CUSTOM_RANDOM 1\n// #define MG_TLS MG_TLS_BUILTIN\n#define MG_IO_SIZE 256\n\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-client/arduino/w5500-mqtt/w5500-mqtt.ino",
    "content": "#include <SPI.h>\n#include \"mongoose.h\"\n\n#define MQTT_SERVER \"mqtt://broker.hivemq.com:1883\"\n#define MQTT_SUB_TOPIC \"mg/rx\"  // Subscribe to this topic\n#define MQTT_PUB_TOPIC \"mg/tx\"  // Publish to this topic\n#define SS_PIN 2                // Slave select pin\n#define LED_PIN 21              // LED pin\n\nstruct mg_connection *mqtt_connection;\nstruct mg_tcpip_spi spi = {\n    NULL,  // SPI metadata\n    [](void *) { digitalWrite(SS_PIN, LOW); SPI.beginTransaction(SPISettings()); },\n    [](void *) { digitalWrite(SS_PIN, HIGH); SPI.endTransaction(); },\n    [](void *, uint8_t c) { return SPI.transfer(c); }, // Execute transaction\n};\nstruct mg_mgr mgr;                                     // Mongoose event manager\nstruct mg_tcpip_if mif = {.mac = {2, 0, 1, 2, 3, 5}};  // Network interface\n\nuint64_t mg_millis(void) {\n  return millis();\n}\nbool mg_random(void *buf, size_t len) {  // For TLS\n  uint8_t *p = (uint8_t *) buf;\n  while (len--) *p++ = (unsigned char) (rand() & 255);\n  return true;\n}\n\nvoid mqtt_publish(const char *message) {\n  struct mg_mqtt_opts opts = {};\n  opts.topic = mg_str(MQTT_PUB_TOPIC);\n  opts.message = mg_str(message);\n  if (mqtt_connection) mg_mqtt_pub(mqtt_connection, &opts);\n}\n\n// Crude function to get available RAM, for quick profiling\nsize_t getFreeRAM(void) {\n  size_t size = 0, increment = 100;\n  void *p;\n  while ((p = malloc(size)) != NULL) free(p), size += increment;\n  return size;\n}\n\n// Implement LED control over MQTT: \"on\" and \"off\" commands\nvoid handle_command(struct mg_str msg) {\n  if (msg.len == 3 && memcmp(msg.buf, \"off\", 3) == 0) {\n    digitalWrite(LED_PIN, LOW);\n    mqtt_publish(\"done - off\");\n  } else if (msg.len == 2 && memcmp(msg.buf, \"on\", 2) == 0) {\n    digitalWrite(LED_PIN, HIGH);\n    mqtt_publish(\"done - on\");\n  }\n  MG_INFO((\"Free RAM: %u bytes\", getFreeRAM()));\n}\n\nstatic void mqtt_ev_handler(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_MQTT_OPEN) {\n    MG_INFO((\"%lu CONNECTED to %s\", c->id, MQTT_SERVER));\n    struct mg_mqtt_opts opts = {};\n    opts.topic = mg_str(MQTT_SUB_TOPIC);\n    mg_mqtt_sub(c, &opts);\n    MG_INFO((\"%lu SUBSCRIBED to %s\", c->id, MQTT_SUB_TOPIC));\n  } else if (ev == MG_EV_MQTT_MSG) {\n    // Received MQTT message\n    struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;\n    MG_INFO((\"%lu RECEIVED %.*s <- %.*s\", c->id, (int) mm->data.len,\n             mm->data.buf, (int) mm->topic.len, mm->topic.buf));\n    handle_command(mm->data);\n  } else if (ev == MG_EV_CLOSE) {\n    MG_INFO((\"%lu CLOSED\", c->id));\n    mqtt_connection = NULL;\n  }\n}\n\nvoid reconnect_if_not_connected(void) {\n  if (mif.state == MG_TCPIP_STATE_READY && mqtt_connection == NULL) {\n    struct mg_mqtt_opts opts = {};\n    opts.clean = true;\n    mqtt_connection =\n        mg_mqtt_connect(&mgr, MQTT_SERVER, &opts, mqtt_ev_handler, NULL);\n  }\n}\n\nvoid setup() {\n  Serial.begin(115200);       // Initialise serial\n  while (!Serial) delay(50);  // for debug output\n\n  SPI.begin();                   // Iniitialise SPI\n  pinMode(SS_PIN, OUTPUT);       // to communicate with W5500 Ethernet module\n  pinMode(LED_PIN, OUTPUT);  // Initialise LED\n\n  mg_mgr_init(&mgr);        // Initialise Mongoose event manager\n  mg_log_set(MG_LL_DEBUG);  // Set debug log level\n  mg_log_set_fn([](char ch, void *) { Serial.print(ch); }, NULL);  // Log serial\n  mif.driver = &mg_tcpip_driver_w5500;  // Use W5500 built-in driver\n  mif.driver_data = &spi;               // Pass SPI interface to W5500 driver\n  mg_tcpip_init(&mgr, &mif);            // Initialise built-in TCP/IP stack\n}\n\nvoid loop() {\n  mg_mgr_poll(&mgr, 1);          // Process network events\n  reconnect_if_not_connected();  // Reconnect to MQTT server if needed\n}\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-client/main.c",
    "content": "// Copyright (c) 2023-2025 Cesanta Software Limited\n// All rights reserved\n//\n// Example MQTT client. It performs the following steps:\n//    1. Connects to the MQTT server specified by `s_url` variable\n//    2. When connected, subscribes to the topic `s_sub_topic`\n//    3. When it receives a message, echoes it back to `s_pub_topic`\n//    4. Timer-based reconnection logic revives the connection when it is down\n//    5. Ping server periodically. When disconnected, a last will is published\n//\n// To enable SSL/TLS, see https://mongoose.ws/tutorials/tls/#how-to-build\n\n#include \"mongoose.h\"\n\nstatic const char *s_url = \"mqtt://broker.hivemq.com:1883\";\nstatic const char *s_sub_topic = \"mg/123/rx\";  // Subscribe topic\nstatic const char *s_pub_topic = \"mg/123/tx\";  // Publish topic\nstatic uint8_t s_qos = 1;                      // MQTT QoS\nstatic struct mg_connection *s_mqtt_conn;      // Client connection\n\nstatic void subscribe(struct mg_connection *c, struct mg_str topic) {\n  struct mg_mqtt_opts opts = {};\n  memset(&opts, 0, sizeof(opts));\n  opts.topic = topic;\n  opts.qos = s_qos;\n  mg_mqtt_sub(c, &opts);\n  MG_INFO((\"%lu SUBSCRIBED to %.*s\", c->id, topic.len, topic.buf));\n}\n\nstatic void publish(struct mg_connection *c, struct mg_str topic,\n                    struct mg_str message) {\n  struct mg_mqtt_opts opts = {};\n  memset(&opts, 0, sizeof(opts));\n  opts.topic = topic;\n  opts.message = message;\n  opts.qos = s_qos;\n  mg_mqtt_pub(c, &opts);\n  MG_INFO((\"%lu PUBLISHED %.*s -> %.*s\", c->id, topic.len, topic.buf,\n           message.len, message.buf));\n}\n\nstatic void mqtt_ev_handler(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_OPEN) {\n    MG_INFO((\"%lu CREATED\", c->id));\n    // c->is_hexdumping = 1;\n  } else if (ev == MG_EV_CONNECT) {\n    if (c->is_tls) {\n      struct mg_tls_opts opts = {.ca = mg_unpacked(\"/certs/ca.pem\"),\n                                 .name = mg_url_host(s_url)};\n      mg_tls_init(c, &opts);\n    }\n  } else if (ev == MG_EV_ERROR) {\n    // On error, log error message\n    MG_ERROR((\"%lu ERROR %s\", c->id, (char *) ev_data));\n  } else if (ev == MG_EV_MQTT_OPEN) {\n    // MQTT connect is successful\n    MG_INFO((\"%lu CONNECTED to %s\", c->id, s_url));\n    subscribe(c, mg_str(s_sub_topic));\n  } else if (ev == MG_EV_MQTT_MSG) {\n    // When we get echo response, print it\n    char response[100];\n    struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;\n    mg_snprintf(response, sizeof(response), \"Got %.*s -> %.*s\", mm->topic.len,\n                mm->topic.buf, mm->data.len, mm->data.buf);\n    publish(c, mg_str(s_pub_topic), mg_str(response));\n  } else if (ev == MG_EV_MQTT_CMD) {\n    struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;\n    if (mm->cmd == MQTT_CMD_PINGREQ) mg_mqtt_pong(c);\n  } else if (ev == MG_EV_CLOSE) {\n    MG_INFO((\"%lu CLOSED\", c->id));\n    s_mqtt_conn = NULL;  // Mark that we're closed\n  }\n}\n\n// Timer function - recreate client connection if it is closed\nstatic void timer_fn(void *arg) {\n  if (s_mqtt_conn == NULL) {\n    struct mg_mgr *mgr = (struct mg_mgr *) arg;\n    struct mg_mqtt_opts opts = {.clean = true,\n                                .qos = s_qos,\n                                .topic = mg_str(s_pub_topic),\n                                .keepalive = 5,\n                                .version = 4,\n                                .message = mg_str(\"bye\")};\n    s_mqtt_conn = mg_mqtt_connect(mgr, s_url, &opts, mqtt_ev_handler, NULL);\n  } else {\n    mg_mqtt_ping(s_mqtt_conn);\n  }\n}\n\nint main(int argc, char *argv[]) {\n  struct mg_mgr mgr;\n  int i;\n\n  // Parse command-line flags\n  for (i = 1; i < argc; i++) {\n    if (strcmp(argv[i], \"-u\") == 0 && argv[i + 1] != NULL) {\n      s_url = argv[++i];\n    } else if (strcmp(argv[i], \"-p\") == 0 && argv[i + 1] != NULL) {\n      s_pub_topic = argv[++i];\n    } else if (strcmp(argv[i], \"-s\") == 0 && argv[i + 1] != NULL) {\n      s_sub_topic = argv[++i];\n    } else if (strcmp(argv[i], \"-v\") == 0 && argv[i + 1] != NULL) {\n      mg_log_set(atoi(argv[++i]));\n    } else {\n      MG_ERROR((\"Unknown option: %s. Usage:\", argv[i]));\n      MG_ERROR(\n          (\"%s [-u mqtts://SERVER:PORT] [-p PUB_TOPIC] [-s SUB_TOPIC] \"\n           \"[-v DEBUG_LEVEL]\",\n           argv[0], argv[i]));\n      return 1;\n    }\n  }\n\n  mg_mgr_init(&mgr);\n  mg_timer_add(&mgr, 3000, MG_TIMER_REPEAT | MG_TIMER_RUN_NOW, timer_fn, &mgr);\n  for (;;) {\n    mg_mgr_poll(&mgr, 1000);\n  }\n  mg_mgr_free(&mgr);\n\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-client/microchip/same54-xpro/Makefile",
    "content": "CFLAGS  = -W -Wall -Wextra -Wundef -Wshadow -Wdouble-promotion\nCFLAGS += -Wformat-truncation -fno-common -Wconversion\nCFLAGS += -g3 -Os -ffunction-sections -fdata-sections\nCFLAGS += -I. -Icmsis_core/CMSIS/Core/Include\nCFLAGS += -D__SAME54P20A__ -Icmsis_sam/include\nCFLAGS += -mcpu=cortex-m4 -mthumb -mfloat-abi=softfp\nLDFLAGS ?= -Tlink.ld -nostartfiles -nostdlib --specs nano.specs -lc -lgcc -Wl,--gc-sections -Wl,-Map=$@.map\n\nSOURCES = main.c syscalls.c startup.c\n\n# Mongoose-specific source code files and build options. See https://mongoose.ws/documentation/#build-options\nSOURCES += mongoose.c\nCFLAGS += -DMG_ENABLE_TCPIP=1 -DMG_ARCH=MG_ARCH_ARMGCC -DMG_ENABLE_CUSTOM_MILLIS=1 -DMG_ENABLE_LINES=1\nCFLAGS += -DMG_ENABLE_DRIVER_SAME54=1 -DMG_ENABLE_CUSTOM_RANDOM=1 -DMG_ENABLE_PACKED_FS=1 $(CFLAGS_EXTRA)\n\n# Example specific build options. See README.md\nCFLAGS += -DHTTP_URL=\\\"http://0.0.0.0/\\\"\n\nifeq ($(OS),Windows_NT)\n  RM = cmd /C del /Q /F\nelse\n  RM = rm -rf\nendif\n\nbuild: firmware.bin\n\nfirmware.bin: firmware.elf\n\tarm-none-eabi-objcopy -O binary $< $@\n\nfirmware.elf: cmsis_core cmsis_sam hal.h link.ld Makefile $(SOURCES) \n\tarm-none-eabi-gcc $(SOURCES) $(CFLAGS) $(CFLAGS_EXTRA) $(LDFLAGS) -o $@\n\nflash: firmware.bin\n\tbossac -p /dev/cu.usb* -w -v -b $<\n\ncmsis_core:\n\tgit clone --depth 1 -b 5.9.0 https://github.com/ARM-software/CMSIS_5 $@\ncmsis_sam:\n\tcurl -sL https://packs.download.microchip.com/Microchip.SAME54_DFP.3.9.244.atpack -o $@.zip\n\tmkdir $@ && cd $@ && unzip ../$@.zip\n\n# Automated test via https://vcon.io/automated-firmware-tests/. Set VCON_API_KEY and update DEVICE_URL\nDEVICE_URL ?= https://dash.vcon.io/api/v3/devices/9\nupdate: firmware.bin\n\tcurl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/ota --data-binary @$<\n\ntest update: CFLAGS += -DUART_DEBUG=USART1\ntest: update\n\tcurl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/tx?t=5 | tee /tmp/output.txt\n\tgrep 'READY, IP:' /tmp/output.txt       # Check for network init\n\tgrep 'RECEIVED hello' /tmp/output.txt   # Check for MQTT success\n\nclean:\n\t$(RM) firmware.* cmsis_core cmsis_sam *.zip\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-client/microchip/same54-xpro/hal.h",
    "content": "// Copyright (c) 2022 Cesanta Software Limited\n// SPDX-License-Identifier: MIT\n//\n// https://ww1.microchip.com/downloads/aemDocuments/documents/MCU32/ProductDocuments/DataSheets/SAM-D5x-E5x-Family-Data-Sheet-DS60001507.pdf\n// https://ww1.microchip.com/downloads/en/DeviceDoc/70005321A.pdf\n\n#ifndef LED_PIN\n#define LED_PIN PIN('C', 18)\n#endif\n\n#ifndef BUTTON_PIN\n#define BUTTON_PIN PIN('B', 31)\n#endif\n\n#ifndef UART_DEBUG\n#define UART_DEBUG USART1\n#endif\n\n#pragma once\n#include <sam.h>\n\n#include <stdbool.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <string.h>\n\n#define BIT(x) (1UL << (x))\n#define SETBITS(R, CLEARMASK, SETMASK) (R) = ((R) & ~(CLEARMASK)) | (SETMASK)\n#define PIN(bank, num) ((((bank) - 'A') << 8) | (num))\n#define PINNO(pin) (pin & 255)\n#define PINBANK(pin) (pin >> 8)\n\nstatic inline void spin(volatile uint32_t count) {\n  while (count--) (void) 0;\n}\n\nstatic inline uint32_t clock_sys_freq(void) {\n  return 48000000U;\n}\n\nenum { GPIO_MODE_INPUT, GPIO_MODE_OUTPUT, GPIO_MODE_AF, GPIO_MODE_ANALOG };\nenum { GPIO_OTYPE_PUSH_PULL, GPIO_OTYPE_OPEN_DRAIN };\nenum { GPIO_SPEED_LOW, GPIO_SPEED_MEDIUM, GPIO_SPEED_HIGH, GPIO_SPEED_INSANE };\nenum { GPIO_PULL_NONE, GPIO_PULL_UP, GPIO_PULL_DOWN };\n#define GPIO(N) ((port_group_registers_t *) (PORT_BASE_ADDRESS + 0x80 * (N)))\ntypedef port_group_registers_t GPIO_TypeDef;\nstatic inline GPIO_TypeDef *gpio_bank(uint16_t pin) {\n  return GPIO(PINBANK(pin));\n}\nstatic inline void gpio_toggle(uint16_t pin) {\n  gpio_bank(pin)->PORT_OUTTGL = BIT(PINNO(pin));\n}\nstatic inline bool gpio_read(uint16_t pin) {\n  return gpio_bank(pin)->PORT_IN & BIT(PINNO(pin));\n}\nstatic inline void gpio_write(uint16_t pin, bool val) {\n  GPIO_TypeDef *gpio = gpio_bank(pin);\n  if (val) {\n    gpio->PORT_OUTSET = BIT(PINNO(pin));\n  } else {\n    gpio->PORT_OUTCLR = BIT(PINNO(pin));\n  }\n}\nstatic inline void gpio_init(uint16_t pin, uint8_t mode, uint8_t type,\n                             uint8_t speed, uint8_t pull, uint8_t af) {\n  (void) type, (void) speed, (void) pull, (void) af;\n  GPIO_TypeDef *gpio = gpio_bank(pin);\n  uint32_t mask = BIT(PINNO(pin));\n  MCLK_REGS->MCLK_APBBMASK |= MCLK_APBBMASK_PORT_Msk;\n  if (mode == GPIO_MODE_INPUT) {\n    gpio->PORT_DIRCLR = mask;\n  } else {\n    gpio->PORT_DIRSET = mask;\n  }\n}\nstatic inline void gpio_input(uint16_t pin) {\n  gpio_init(pin, GPIO_MODE_INPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,\n            GPIO_PULL_NONE, 0);\n}\nstatic inline void gpio_output(uint16_t pin) {\n  gpio_init(pin, GPIO_MODE_OUTPUT, GPIO_OTYPE_PUSH_PULL, GPIO_SPEED_HIGH,\n            GPIO_PULL_NONE, 0);\n}\n\ntypedef sercom_usart_int_registers_t USART_TypeDef;\n#define USART1 ((USART_TypeDef *) SERCOM0_BASE_ADDRESS)\n#define USART2 ((USART_TypeDef *) SERCOM1_BASE_ADDRESS)\n#define USART3 ((USART_TypeDef *) SERCOM2_BASE_ADDRESS)\nstatic inline bool uart_init(USART_TypeDef *uart, unsigned long baud) {\n  uint16_t rx = 0, tx = 0;  // Pins\n  uint8_t rx_mux = 0, tx_mux = 0;\n  if (uart == USART1) {\n    MCLK_REGS->MCLK_APBAMASK |= MCLK_APBAMASK_SERCOM0_Msk;\n    GCLK_REGS->GCLK_PCHCTRL[SERCOM0_GCLK_ID_CORE] =\n        GCLK_PCHCTRL_GEN_GCLK0 | GCLK_PCHCTRL_CHEN_Msk;\n    GCLK_REGS->GCLK_PCHCTRL[SERCOM0_GCLK_ID_SLOW] =\n        GCLK_PCHCTRL_GEN_GCLK3 | GCLK_PCHCTRL_CHEN_Msk;\n    tx = PIN('A', 4), rx = PIN('A', 5);\n    rx_mux = MUX_PA05D_SERCOM0_PAD1, tx_mux = MUX_PA04D_SERCOM0_PAD0;\n  } else if (uart == USART2) {\n    MCLK_REGS->MCLK_APBAMASK |= MCLK_APBAMASK_SERCOM1_Msk;\n    tx = PIN('C', 27), rx = PIN('C', 28);\n  } else if (uart == USART3) {\n    MCLK_REGS->MCLK_APBBMASK |= MCLK_APBBMASK_SERCOM2_Msk;\n    tx = PIN('A', 9), rx = PIN('A', 8);\n  } else {\n    return false;\n  }\n  gpio_bank(rx)->PORT_WRCONFIG =\n      PORT_WRCONFIG_PMUX(rx_mux) | PORT_WRCONFIG_WRPMUX(1) |\n      PORT_WRCONFIG_PMUXEN(1) | PORT_WRCONFIG_WRPINCFG(1) | BIT(PINNO(rx));\n  gpio_bank(tx)->PORT_WRCONFIG =\n      PORT_WRCONFIG_PMUX(tx_mux) | PORT_WRCONFIG_WRPMUX(1) |\n      PORT_WRCONFIG_PMUXEN(1) | PORT_WRCONFIG_WRPINCFG(1) | BIT(PINNO(tx));\n  uart->SERCOM_CTRLA = SERCOM_USART_INT_CTRLA_DORD(1) |\n                       SERCOM_USART_INT_CTRLA_MODE(1 /* INT_CLK */) |\n                       SERCOM_USART_INT_CTRLA_RXPO(1 /* PAD1 */) |\n                       SERCOM_USART_INT_CTRLA_TXPO(0 /* PAD0 */) |\n                       SERCOM_USART_INT_CTRLA_SAMPR(1);\n  uart->SERCOM_BAUD = (uint16_t) (clock_sys_freq() / (16 * baud));\n  uart->SERCOM_CTRLB = SERCOM_USART_INT_CTRLB_RXEN(1) |\n                       SERCOM_USART_INT_CTRLB_TXEN(1) |\n                       SERCOM_USART_INT_CTRLB_CHSIZE(0);\n  while (uart->SERCOM_SYNCBUSY & SERCOM_USART_INT_SYNCBUSY_CTRLB_Msk) spin(1);\n  uart->SERCOM_CTRLA |= SERCOM_USART_INT_CTRLA_ENABLE(1);\n  while (uart->SERCOM_SYNCBUSY & SERCOM_USART_INT_SYNCBUSY_ENABLE_Msk) spin(1);\n  return true;\n}\nstatic inline void uart_write_byte(USART_TypeDef *uart, uint8_t byte) {\n  while (!(uart->SERCOM_INTFLAG & SERCOM_USART_INT_INTFLAG_DRE_Msk)) spin(1);\n  uart->SERCOM_DATA = byte;\n}\nstatic inline void uart_write_buf(USART_TypeDef *uart, char *buf, size_t len) {\n  while (len-- > 0) uart_write_byte(uart, *(uint8_t *) buf++);\n}\nstatic inline bool uart_read_ready(USART_TypeDef *uart) {\n  return (uart->SERCOM_INTFLAG & SERCOM_USART_EXT_INTFLAG_RXC_Msk);\n}\nstatic inline uint8_t uart_read_byte(USART_TypeDef *uart) {\n  return (uint8_t) (uart->SERCOM_DATA & 255U);\n}\n\nstatic inline void rng_init(void) {\n  MCLK_REGS->MCLK_APBCMASK |= MCLK_APBCMASK_TRNG_Msk;\n  TRNG_REGS->TRNG_CTRLA = TRNG_CTRLA_ENABLE_Msk;\n}\nstatic inline uint32_t rng_read(void) {\n  while ((TRNG_REGS->TRNG_INTFLAG & TRNG_INTFLAG_DATARDY_Msk) == 0) spin(1);\n  return TRNG_REGS->TRNG_DATA;\n}\n\n#define UID_BASE_W0 0x008061FC    // Word 0 location of the 128-bit chip ID\n#define UID_BASE_W1_3 0x00806010  // Words 1-3 location of the 128-bit chip ID\n\n#define UUID(n) ((n >= 0 && n <= 3) ? \\\n                     (((uint8_t *) UID_BASE_W0)[n]) : \\\n                     (((uint8_t *) UID_BASE_W1_3)[n - 4]))\n\n#define GENERATE_LOCALLY_ADMINISTERED_MAC()                         \\\n  {                                                                 \\\n    2, UUID(0) ^ UUID(1) ^ UUID(2), UUID(3) ^ UUID(4) ^ UUID(5),    \\\n        UUID(6) ^ UUID(7) ^ UUID(8), UUID(9) ^ UUID(10) ^ UUID(11), \\\n        UUID(12) ^ UUID(13) ^ UUID(14) ^ UUID(15)                   \\\n  }\n\nstatic inline bool timer_expired(volatile uint64_t *t, uint64_t prd,\n                                 uint64_t now) {\n  if (now + prd < *t) *t = 0;                    // Time wrapped? Reset timer\n  if (*t == 0) *t = now + prd;                   // Firt poll? Set expiration\n  if (*t > now) return false;                    // Not expired yet, return\n  *t = (now - *t) > prd ? now + prd : *t + prd;  // Next expiration time\n  return true;                                   // Expired, return true\n}\n\nstatic inline void clock_init(void) {\n  SCB->CPACR |= (15U << 20);                // Enable FPU\n  SysTick_Config(clock_sys_freq() / 1000);  // Sys tick every 1ms\n}\n\nstatic inline void gpio_set_irq_handler(uint16_t pin, void (*fn)(void *),\n                                        void *arg) {\n  (void) pin, (void) fn, (void) arg;\n}\n\nstatic inline void ethernet_init(void) {\n  uint16_t pins[] = {PIN('A', 12), PIN('A', 13), PIN('A', 14), PIN('A', 15),\n                     PIN('A', 17), PIN('A', 18), PIN('A', 19), PIN('C', 11),\n                     PIN('C', 12), PIN('C', 20)};\n  uint32_t af[] = {MUX_PA12L_GMAC_GRX1,  MUX_PA13L_GMAC_GRX0,\n                   MUX_PA14L_GMAC_GTXCK, MUX_PA15L_GMAC_GRXER,\n                   MUX_PA17L_GMAC_GTXEN, MUX_PA18L_GMAC_GTX0,\n                   MUX_PA19L_GMAC_GTX1,  MUX_PC11L_GMAC_GMDC,\n                   MUX_PC12L_GMAC_GMDIO, MUX_PC20L_GMAC_GRXDV};\n\n  MCLK_REGS->MCLK_APBBMASK |= MCLK_APBBMASK_PORT_Msk;\n\n  for (size_t i = 0; i < sizeof(pins) / sizeof(pins[0]); i++) {\n    int bank = PINBANK(pins[i]), no = PINNO(pins[i]);\n    PORT_REGS->GROUP[bank].PORT_PINCFG[no] |= PORT_PINCFG_PMUXEN_Msk;\n    volatile uint8_t *m = &PORT_REGS->GROUP[bank].PORT_PMUX[no / 2], v = m[0];\n    if (no & 1) {\n      m[0] = (uint8_t) ((v & ~0xf0) | PORT_PMUX_PMUXO(af[i]));\n    } else {\n      m[0] = (uint8_t) ((v & ~0x0f) | PORT_PMUX_PMUXE(af[i]));\n    }\n  }\n\n  PORT_REGS->GROUP[0].PORT_PINCFG[17] |= PORT_PINCFG_DRVSTR_Msk;\n  PORT_REGS->GROUP[0].PORT_PINCFG[18] |= PORT_PINCFG_DRVSTR_Msk;\n  PORT_REGS->GROUP[0].PORT_PINCFG[19] |= PORT_PINCFG_DRVSTR_Msk;\n\n  // Reset PHY\n  uint16_t phy_pin = PIN('C', 21);\n  gpio_output(phy_pin);\n  gpio_write(phy_pin, false);\n  spin(999);\n  gpio_write(phy_pin, true);\n  spin(999);\n}\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-client/microchip/same54-xpro/link.ld",
    "content": "ENTRY(Reset_Handler);\nMEMORY {\n  flash(rx) : ORIGIN = 0x00000000, LENGTH = 1024k\n  sram(rwx) : ORIGIN = 0x20000000, LENGTH = 256k\n}\n_estack     = ORIGIN(sram) + LENGTH(sram);\n\nSECTIONS {\n  .vectors  : { FILL(256) KEEP(*(.vectors)) } > flash\n  .text     : { *(.text*) }         > flash\n  .rodata   : { *(.rodata*) }       > flash\n\n  .data : {\n    _sdata = .;\n    *(.first_data)\n    *(.data SORT(.data.*))\n    _edata = .;\n  } > sram AT > flash\n  _sidata = LOADADDR(.data);\n\n  .bss : { _sbss = .; *(.bss SORT(.bss.*) COMMON) _ebss = .; } > sram\n\n  . = ALIGN(8);\n  _end = .;\n}\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-client/microchip/same54-xpro/main.c",
    "content": "// Copyright (c) 2023 Cesanta Software Limited\n// All rights reserved\n\n#include \"hal.h\"\n#include \"mongoose.h\"\n\nstatic const char *s_url = \"mqtt://broker.hivemq.com:1883\";\nstatic const char *s_sub_topic = \"mg/+/test\";     // Publish topic\nstatic const char *s_pub_topic = \"mg/clnt/test\";  // Subscribe topic\nstatic const uint8_t s_qos = 1;                   // MQTT QoS\nstatic struct mg_connection *s_conn;              // Client connection\n\nvoid SystemInit(void) {  // Called automatically by startup code\n  clock_init();\n  rng_init();\n}\n\nstatic volatile uint64_t s_ticks;  // Milliseconds since boot\nvoid SysTick_Handler(void) {       // SyStick IRQ handler, triggered every 1ms\n  s_ticks++;\n}\n\nuint64_t mg_millis(void) {  // Let Mongoose use our uptime function\n  return s_ticks;           // Return number of milliseconds since boot\n}\n\nbool mg_random(void *buf, size_t len) {  // Use on-board RNG\n  for (size_t n = 0; n < len; n += sizeof(uint32_t)) {\n    uint32_t r = rng_read();\n    memcpy((char *) buf + n, &r, n + sizeof(r) > len ? len - n : sizeof(r));\n  }\n  return true;\n}\n\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_OPEN) {\n    MG_INFO((\"%lu CREATED\", c->id));\n    // c->is_hexdumping = 1;\n  } else if (ev == MG_EV_ERROR) {\n    // On error, log error message\n    MG_ERROR((\"%lu ERROR %s\", c->id, (char *) ev_data));\n  } else if (ev == MG_EV_MQTT_OPEN) {\n    // MQTT connect is successful\n    struct mg_str subt = mg_str(s_sub_topic);\n    struct mg_str pubt = mg_str(s_pub_topic), data = mg_str(\"hello\");\n    MG_INFO((\"%lu CONNECTED to %s\", c->id, s_url));\n    struct mg_mqtt_opts sub_opts;\n    memset(&sub_opts, 0, sizeof(sub_opts));\n    sub_opts.topic = subt;\n    sub_opts.qos = s_qos;\n    mg_mqtt_sub(c, &sub_opts);\n    MG_INFO((\"%lu SUBSCRIBED to %.*s\", c->id, (int) subt.len, subt.buf));\n    struct mg_mqtt_opts pub_opts;\n    memset(&pub_opts, 0, sizeof(pub_opts));\n    pub_opts.topic = pubt;\n    pub_opts.message = data;\n    pub_opts.qos = s_qos, pub_opts.retain = false;\n    mg_mqtt_pub(c, &pub_opts);\n    MG_INFO((\"%lu PUBLISHED %.*s -> %.*s\", c->id, (int) data.len, data.buf,\n             (int) pubt.len, pubt.buf));\n  } else if (ev == MG_EV_MQTT_MSG) {\n    // When we get echo response, print it\n    struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;\n    MG_INFO((\"%lu RECEIVED %.*s <- %.*s\", c->id, (int) mm->data.len,\n             mm->data.buf, (int) mm->topic.len, mm->topic.buf));\n  } else if (ev == MG_EV_CLOSE) {\n    MG_INFO((\"%lu CLOSED\", c->id));\n    s_conn = NULL;  // Mark that we're closed\n  }\n}\n\n// Timer function - recreate client connection if it is closed\nstatic void timer_fn(void *arg) {\n  struct mg_mgr *mgr = (struct mg_mgr *) arg;\n  struct mg_mqtt_opts opts = {.clean = true,\n                              .qos = s_qos,\n                              .topic = mg_str(s_pub_topic),\n                              .version = 4,\n                              .message = mg_str(\"bye\")};\n  if (s_conn == NULL) s_conn = mg_mqtt_connect(mgr, s_url, &opts, fn, NULL);\n}\n\nint main(void) {\n  gpio_input(BUTTON_PIN);\n  gpio_output(LED_PIN);\n  uart_init(UART_DEBUG, 115200);\n  ethernet_init();\n  MG_INFO((\"Starting, CPU freq %g MHz\", (double) clock_sys_freq() / 1000000));\n\n  struct mg_mgr mgr;        // Initialise\n  mg_mgr_init(&mgr);        // Mongoose event manager\n  mg_log_set(MG_LL_DEBUG);  // Set log level\n\n  // Initialise Mongoose network stack\n  struct mg_tcpip_driver_same54_data driver_data = {.mdc_cr = 5};\n  struct mg_tcpip_if mif = {\n      .mac = GENERATE_LOCALLY_ADMINISTERED_MAC() /*{2, 3, 4, 5, 6, 7}*/,\n      // Uncomment below for static configuration:\n      // .ip = mg_htonl(MG_U32(192, 168, 0, 223)),\n      // .mask = mg_htonl(MG_U32(255, 255, 255, 0)),\n      // .gw = mg_htonl(MG_U32(192, 168, 0, 1)),\n      .driver = &mg_tcpip_driver_same54,\n      .driver_data = &driver_data};\n  mg_tcpip_init(&mgr, &mif);\n\n  MG_INFO((\"MAC: %M. Waiting for IP...\", mg_print_mac, mif.mac));\n  while (mif.state != MG_TCPIP_STATE_READY) {\n    mg_mgr_poll(&mgr, 0);\n  }\n\n  MG_INFO((\"Initialising application...\"));\n  mg_timer_add(&mgr, 3000, MG_TIMER_REPEAT | MG_TIMER_RUN_NOW, timer_fn, &mgr);\n\n  MG_INFO((\"Starting event loop\"));\n  for (;;) {\n    mg_mgr_poll(&mgr, 0);\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-client/microchip/same54-xpro/startup.c",
    "content": "// SPDX-FileCopyrightText: 2022-2023 Cesanta Software Limited\n// SPDX-License-Identifier: MIT\n\n#include \"hal.h\"\n\nvoid Reset_Handler(void);    // Defined below\nvoid Dummy_Handler(void);    // Defined below\nvoid SysTick_Handler(void);  // Defined in main.c\nvoid SystemInit(void);       // Defined in main.c, called by reset handler\nvoid _estack(void);          // Defined in link.ld\n\n#define WEAK_ALIAS __attribute__((weak, alias(\"Default_Handler\")))\n\nWEAK_ALIAS void NMI_Handler(void);\nWEAK_ALIAS void HardFault_Handler(void);\nWEAK_ALIAS void MemoryManagement_Handler(void);\nWEAK_ALIAS void BusFault_Handler(void);\nWEAK_ALIAS void UsageFault_Handler(void);\nWEAK_ALIAS void SVCall_Handler(void);\nWEAK_ALIAS void DebugMonitor_Handler(void);\nWEAK_ALIAS void PendSV_Handler(void);\nWEAK_ALIAS void SysTick_Handler(void);\n\nWEAK_ALIAS void PM_Handler(void);\nWEAK_ALIAS void MCLK_Handler(void);\nWEAK_ALIAS void OSCCTRL_XOSC0_Handler(void);\nWEAK_ALIAS void OSCCTRL_XOSC1_Handler(void);\nWEAK_ALIAS void OSCCTRL_DFLL_Handler(void);\nWEAK_ALIAS void OSCCTRL_DPLL0_Handler(void);\nWEAK_ALIAS void OSCCTRL_DPLL1_Handler(void);\nWEAK_ALIAS void OSC32KCTRL_Handler(void);\nWEAK_ALIAS void SUPC_OTHER_Handler(void);\nWEAK_ALIAS void SUPC_BODDET_Handler(void);\nWEAK_ALIAS void WDT_Handler(void);\nWEAK_ALIAS void RTC_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_0_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_1_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_2_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_3_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_4_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_5_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_6_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_7_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_8_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_9_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_10_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_11_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_12_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_13_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_14_Handler(void);\nWEAK_ALIAS void EIC_EXTINT_15_Handler(void);\nWEAK_ALIAS void FREQM_Handler(void);\nWEAK_ALIAS void NVMCTRL_0_Handler(void);\nWEAK_ALIAS void NVMCTRL_1_Handler(void);\nWEAK_ALIAS void DMAC_0_Handler(void);\nWEAK_ALIAS void DMAC_1_Handler(void);\nWEAK_ALIAS void DMAC_2_Handler(void);\nWEAK_ALIAS void DMAC_3_Handler(void);\nWEAK_ALIAS void DMAC_OTHER_Handler(void);\nWEAK_ALIAS void EVSYS_0_Handler(void);\nWEAK_ALIAS void EVSYS_1_Handler(void);\nWEAK_ALIAS void EVSYS_2_Handler(void);\nWEAK_ALIAS void EVSYS_3_Handler(void);\nWEAK_ALIAS void EVSYS_OTHER_Handler(void);\nWEAK_ALIAS void PAC_Handler(void);\nWEAK_ALIAS void RAMECC_Handler(void);\nWEAK_ALIAS void SERCOM0_0_Handler(void);\nWEAK_ALIAS void SERCOM0_1_Handler(void);\nWEAK_ALIAS void SERCOM0_2_Handler(void);\nWEAK_ALIAS void SERCOM0_OTHER_Handler(void);\nWEAK_ALIAS void SERCOM1_0_Handler(void);\nWEAK_ALIAS void SERCOM1_1_Handler(void);\nWEAK_ALIAS void SERCOM1_2_Handler(void);\nWEAK_ALIAS void SERCOM1_OTHER_Handler(void);\nWEAK_ALIAS void SERCOM2_0_Handler(void);\nWEAK_ALIAS void SERCOM2_1_Handler(void);\nWEAK_ALIAS void SERCOM2_2_Handler(void);\nWEAK_ALIAS void SERCOM2_OTHER_Handler(void);\nWEAK_ALIAS void SERCOM3_0_Handler(void);\nWEAK_ALIAS void SERCOM3_1_Handler(void);\nWEAK_ALIAS void SERCOM3_2_Handler(void);\nWEAK_ALIAS void SERCOM3_OTHER_Handler(void);\nWEAK_ALIAS void SERCOM4_0_Handler(void);\nWEAK_ALIAS void SERCOM4_1_Handler(void);\nWEAK_ALIAS void SERCOM4_2_Handler(void);\nWEAK_ALIAS void SERCOM4_OTHER_Handler(void);\nWEAK_ALIAS void SERCOM5_0_Handler(void);\nWEAK_ALIAS void SERCOM5_1_Handler(void);\nWEAK_ALIAS void SERCOM5_2_Handler(void);\nWEAK_ALIAS void SERCOM5_OTHER_Handler(void);\nWEAK_ALIAS void SERCOM6_0_Handler(void);\nWEAK_ALIAS void SERCOM6_1_Handler(void);\nWEAK_ALIAS void SERCOM6_2_Handler(void);\nWEAK_ALIAS void SERCOM6_OTHER_Handler(void);\nWEAK_ALIAS void SERCOM7_0_Handler(void);\nWEAK_ALIAS void SERCOM7_1_Handler(void);\nWEAK_ALIAS void SERCOM7_2_Handler(void);\nWEAK_ALIAS void SERCOM7_OTHER_Handler(void);\nWEAK_ALIAS void CAN0_Handler(void);\nWEAK_ALIAS void CAN1_Handler(void);\nWEAK_ALIAS void USB_OTHER_Handler(void);\nWEAK_ALIAS void USB_SOF_HSOF_Handler(void);\nWEAK_ALIAS void USB_TRCPT0_Handler(void);\nWEAK_ALIAS void USB_TRCPT1_Handler(void);\nWEAK_ALIAS void GMAC_Handler(void);\nWEAK_ALIAS void TCC0_OTHER_Handler(void);\nWEAK_ALIAS void TCC0_MC0_Handler(void);\nWEAK_ALIAS void TCC0_MC1_Handler(void);\nWEAK_ALIAS void TCC0_MC2_Handler(void);\nWEAK_ALIAS void TCC0_MC3_Handler(void);\nWEAK_ALIAS void TCC0_MC4_Handler(void);\nWEAK_ALIAS void TCC0_MC5_Handler(void);\nWEAK_ALIAS void TCC1_OTHER_Handler(void);\nWEAK_ALIAS void TCC1_MC0_Handler(void);\nWEAK_ALIAS void TCC1_MC1_Handler(void);\nWEAK_ALIAS void TCC1_MC2_Handler(void);\nWEAK_ALIAS void TCC1_MC3_Handler(void);\nWEAK_ALIAS void TCC2_OTHER_Handler(void);\nWEAK_ALIAS void TCC2_MC0_Handler(void);\nWEAK_ALIAS void TCC2_MC1_Handler(void);\nWEAK_ALIAS void TCC2_MC2_Handler(void);\nWEAK_ALIAS void TCC3_OTHER_Handler(void);\nWEAK_ALIAS void TCC3_MC0_Handler(void);\nWEAK_ALIAS void TCC3_MC1_Handler(void);\nWEAK_ALIAS void TCC4_OTHER_Handler(void);\nWEAK_ALIAS void TCC4_MC0_Handler(void);\nWEAK_ALIAS void TCC4_MC1_Handler(void);\nWEAK_ALIAS void TC0_Handler(void);\nWEAK_ALIAS void TC1_Handler(void);\nWEAK_ALIAS void TC2_Handler(void);\nWEAK_ALIAS void TC3_Handler(void);\nWEAK_ALIAS void TC4_Handler(void);\nWEAK_ALIAS void TC5_Handler(void);\nWEAK_ALIAS void TC6_Handler(void);\nWEAK_ALIAS void TC7_Handler(void);\nWEAK_ALIAS void PDEC_OTHER_Handler(void);\nWEAK_ALIAS void PDEC_MC0_Handler(void);\nWEAK_ALIAS void PDEC_MC1_Handler(void);\nWEAK_ALIAS void ADC0_OTHER_Handler(void);\nWEAK_ALIAS void ADC0_RESRDY_Handler(void);\nWEAK_ALIAS void ADC1_OTHER_Handler(void);\nWEAK_ALIAS void ADC1_RESRDY_Handler(void);\nWEAK_ALIAS void AC_Handler(void);\nWEAK_ALIAS void DAC_OTHER_Handler(void);\nWEAK_ALIAS void DAC_EMPTY_0_Handler(void);\nWEAK_ALIAS void DAC_EMPTY_1_Handler(void);\nWEAK_ALIAS void DAC_RESRDY_0_Handler(void);\nWEAK_ALIAS void DAC_RESRDY_1_Handler(void);\nWEAK_ALIAS void I2S_Handler(void);\nWEAK_ALIAS void PCC_Handler(void);\nWEAK_ALIAS void AES_Handler(void);\nWEAK_ALIAS void TRNG_Handler(void);\nWEAK_ALIAS void ICM_Handler(void);\nWEAK_ALIAS void PUKCC_Handler(void);\nWEAK_ALIAS void QSPI_Handler(void);\nWEAK_ALIAS void SDHC0_Handler(void);\nWEAK_ALIAS void SDHC1_Handler(void);\n\n__attribute__((section(\".vectors\"))) void (*const tab[16 + 138])(void) = {\n    _estack,\n    Reset_Handler,\n    NMI_Handler,\n    HardFault_Handler,\n    MemoryManagement_Handler,\n    BusFault_Handler,\n    UsageFault_Handler,\n    NULL,\n    NULL,\n    NULL,\n    NULL,\n    SVCall_Handler,\n    DebugMonitor_Handler,\n    NULL,\n    PendSV_Handler,\n    SysTick_Handler,\n    PM_Handler,  //  0 Power\n    MCLK_Handler,  //  1 Main\n    OSCCTRL_XOSC0_Handler,  //  2 Oscillators\n    OSCCTRL_XOSC1_Handler,  //  3 Oscillators\n    OSCCTRL_DFLL_Handler,  //  4 Oscillators\n    OSCCTRL_DPLL0_Handler,  //  5 Oscillators\n    OSCCTRL_DPLL1_Handler,  //  6 Oscillators\n    OSC32KCTRL_Handler,  //  7 32kHz\n    SUPC_OTHER_Handler,  //  8 Supply\n    SUPC_BODDET_Handler,  //  9 Supply\n    WDT_Handler,  //  10 Watchdog\n    RTC_Handler,  //  11 Real-Time\n    EIC_EXTINT_0_Handler,  //  12 External\n    EIC_EXTINT_1_Handler,  //  13 External\n    EIC_EXTINT_2_Handler,  //  14 External\n    EIC_EXTINT_3_Handler,  //  15 External\n    EIC_EXTINT_4_Handler,  //  16 External\n    EIC_EXTINT_5_Handler,  //  17 External\n    EIC_EXTINT_6_Handler,  //  18 External\n    EIC_EXTINT_7_Handler,  //  19 External\n    EIC_EXTINT_8_Handler,  //  20 External\n    EIC_EXTINT_9_Handler,  //  21 External\n    EIC_EXTINT_10_Handler,  //  22 External\n    EIC_EXTINT_11_Handler,  //  23 External\n    EIC_EXTINT_12_Handler,  //  24 External\n    EIC_EXTINT_13_Handler,  //  25 External\n    EIC_EXTINT_14_Handler,  //  26 External\n    EIC_EXTINT_15_Handler,  //  27 External\n    FREQM_Handler,  //  28 Frequency\n    NVMCTRL_0_Handler,  //  29 Non-Volatile\n    NVMCTRL_1_Handler,  //  30 Non-Volatile\n    DMAC_0_Handler,  //  31 Direct\n    DMAC_1_Handler,  //  32 Direct\n    DMAC_2_Handler,  //  33 Direct\n    DMAC_3_Handler,  //  34 Direct\n    DMAC_OTHER_Handler,  //  35 Direct\n    EVSYS_0_Handler,  //  36 Event\n    EVSYS_1_Handler,  //  37 Event\n    EVSYS_2_Handler,  //  38 Event\n    EVSYS_3_Handler,  //  39 Event\n    EVSYS_OTHER_Handler,  //  40 Event\n    PAC_Handler,  //  41 Peripheral\n    0,  //  42 Reserved\n    0,  //  43 Reserved\n    0,  //  44 Reserved\n    RAMECC_Handler,  //  45 RAM\n    SERCOM0_0_Handler,  //  46 Serial\n    SERCOM0_1_Handler,  //  47 Serial\n    SERCOM0_2_Handler,  //  48 Serial\n    SERCOM0_OTHER_Handler,  //  49 Serial\n    SERCOM1_0_Handler,  //  50 Serial\n    SERCOM1_1_Handler,  //  51 Serial\n    SERCOM1_2_Handler,  //  52 Serial\n    SERCOM1_OTHER_Handler,  //  53 Serial\n    SERCOM2_0_Handler,  //  54 Serial\n    SERCOM2_1_Handler,  //  55 Serial\n    SERCOM2_2_Handler,  //  56 Serial\n    SERCOM2_OTHER_Handler,  //  57 Serial\n    SERCOM3_0_Handler,  //  58 Serial\n    SERCOM3_1_Handler,  //  59 Serial\n    SERCOM3_2_Handler,  //  60 Serial\n    SERCOM3_OTHER_Handler,  //  61 Serial\n    SERCOM4_0_Handler,  //  62 Serial\n    SERCOM4_1_Handler,  //  63 Serial\n    SERCOM4_2_Handler,  //  64 Serial\n    SERCOM4_OTHER_Handler,  //  65 Serial\n    SERCOM5_0_Handler,  //  66 Serial\n    SERCOM5_1_Handler,  //  67 Serial\n    SERCOM5_2_Handler,  //  68 Serial\n    SERCOM5_OTHER_Handler,  //  69 Serial\n    SERCOM6_0_Handler,  //  70 Serial\n    SERCOM6_1_Handler,  //  71 Serial\n    SERCOM6_2_Handler,  //  72 Serial\n    SERCOM6_OTHER_Handler,  //  73 Serial\n    SERCOM7_0_Handler,  //  74 Serial\n    SERCOM7_1_Handler,  //  75 Serial\n    SERCOM7_2_Handler,  //  76 Serial\n    SERCOM7_OTHER_Handler,  //  77 Serial\n    CAN0_Handler,  //  78 Control\n    CAN1_Handler,  //  79 Control\n    USB_OTHER_Handler,  //  80 Universal\n    USB_SOF_HSOF_Handler,  //  81 Universal\n    USB_TRCPT0_Handler,  //  82 Universal\n    USB_TRCPT1_Handler,  //  83 Universal\n    GMAC_Handler,  //  84 Ethernet\n    TCC0_OTHER_Handler,  //  85 Timer\n    TCC0_MC0_Handler,  //  86 Timer\n    TCC0_MC1_Handler,  //  87 Timer\n    TCC0_MC2_Handler,  //  88 Timer\n    TCC0_MC3_Handler,  //  89 Timer\n    TCC0_MC4_Handler,  //  90 Timer\n    TCC0_MC5_Handler,  //  91 Timer\n    TCC1_OTHER_Handler,  //  92 Timer\n    TCC1_MC0_Handler,  //  93 Timer\n    TCC1_MC1_Handler,  //  94 Timer\n    TCC1_MC2_Handler,  //  95 Timer\n    TCC1_MC3_Handler,  //  96 Timer\n    TCC2_OTHER_Handler,  //  97 Timer\n    TCC2_MC0_Handler,  //  98 Timer\n    TCC2_MC1_Handler,  //  99 Timer\n    TCC2_MC2_Handler,  //  100 Timer\n    TCC3_OTHER_Handler,  //  101 Timer\n    TCC3_MC0_Handler,  //  102 Timer\n    TCC3_MC1_Handler,  //  103 Timer\n    TCC4_OTHER_Handler,  //  104 Timer\n    TCC4_MC0_Handler,  //  105 Timer\n    TCC4_MC1_Handler,  //  106 Timer\n    TC0_Handler,  //  107 Basic\n    TC1_Handler,  //  108 Basic\n    TC2_Handler,  //  109 Basic\n    TC3_Handler,  //  110 Basic\n    TC4_Handler,  //  111 Basic\n    TC5_Handler,  //  112 Basic\n    TC6_Handler,  //  113 Basic\n    TC7_Handler,  //  114 Basic\n    PDEC_OTHER_Handler,  //  115 Quadrature\n    PDEC_MC0_Handler,  //  116 Quadrature\n    PDEC_MC1_Handler,  //  117 Quadrature\n    ADC0_OTHER_Handler,  //  118 Analog\n    ADC0_RESRDY_Handler,  //  119 Analog\n    ADC1_OTHER_Handler,  //  120 Analog\n    ADC1_RESRDY_Handler,  //  121 Analog\n    AC_Handler,  //  122 Analog\n    DAC_OTHER_Handler,  //  123 Digital-to-Analog\n    DAC_EMPTY_0_Handler,  //  124 Digital-to-Analog\n    DAC_EMPTY_1_Handler,  //  125 Digital-to-Analog\n    DAC_RESRDY_0_Handler,  //  126 Digital-to-Analog\n    DAC_RESRDY_1_Handler,  //  127 Digital-to-Analog\n    I2S_Handler,  //  128 Inter-IC\n    PCC_Handler,  //  129 Parallel\n    AES_Handler,  //  130 Advanced\n    TRNG_Handler,  //  131 True\n    ICM_Handler,  //  132 Integrity\n    PUKCC_Handler,  //  133 PUblic-Key\n    QSPI_Handler,  //  134 Quad\n    SDHC0_Handler,  //  135 SD/MMC\n    SDHC1_Handler  //  136 SD/MMC\n};\n\n__attribute__((naked, noreturn)) void Reset_Handler(void) {\n  // Clear BSS section, and copy data section from flash to RAM\n  extern long _sbss, _ebss, _sdata, _edata, _sidata;\n  for (long *src = &_sbss; src < &_ebss; src++) *src = 0;\n  for (long *src = &_sdata, *dst = &_sidata; src < &_edata;) *src++ = *dst++;\n\n  SCB->VTOR = (uint32_t) &tab;\n  SystemInit();\n\n  // Call main()\n  extern void main(void);\n  main();\n  for (;;) (void) 0;  // Infinite loop\n}\n\nvoid Default_Handler(void) {\n  for (;;) (void) 0;\n}\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-client/microchip/same54-xpro/syscalls.c",
    "content": "// Copyright (c) 2022 Cesanta Software Limited\n// All rights reserved\n\n#include <sys/stat.h>\n\n#include \"hal.h\"\n\nint _fstat(int fd, struct stat *st) {\n  if (fd < 0) return -1;\n  st->st_mode = S_IFCHR;\n  return 0;\n}\n\nvoid *_sbrk(int incr) {\n  extern char _end;\n  static unsigned char *heap = NULL;\n  unsigned char *prev_heap;\n  if (heap == NULL) heap = (unsigned char *) &_end;\n  prev_heap = heap;\n  heap += incr;\n  return prev_heap;\n}\n\nint _open(const char *path) {\n  (void) path;\n  return -1;\n}\n\nint _close(int fd) {\n  (void) fd;\n  return -1;\n}\n\nint _isatty(int fd) {\n  (void) fd;\n  return 1;\n}\n\nint _lseek(int fd, int ptr, int dir) {\n  (void) fd, (void) ptr, (void) dir;\n  return 0;\n}\n\nvoid _exit(int status) {\n  (void) status;\n  for (;;) asm volatile(\"BKPT #0\");\n}\n\nvoid _kill(int pid, int sig) {\n  (void) pid, (void) sig;\n}\n\nint _getpid(void) {\n  return -1;\n}\n\nint _write(int fd, char *ptr, int len) {\n  (void) fd, (void) ptr, (void) len;\n  if (fd == 1) uart_write_buf(UART_DEBUG, ptr, (size_t) len);\n  return -1;\n}\n\nint _read(int fd, char *ptr, int len) {\n  (void) fd, (void) ptr, (void) len;\n  return -1;\n}\n\nint _link(const char *a, const char *b) {\n  (void) a, (void) b;\n  return -1;\n}\n\nint _unlink(const char *a) {\n  (void) a;\n  return -1;\n}\n\nint _stat(const char *path, struct stat *st) {\n  (void) path, (void) st;\n  return -1;\n}\n\nint mkdir(const char *path, mode_t mode) {\n  (void) path, (void) mode;\n  return -1;\n}\n\nvoid _init(void) {\n}\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-client-aws-iot/Makefile",
    "content": "PROG ?= client                    # Program we are building\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\nSOURCES = main.c mongoose.c  mongoose_fs.c\n\nCFLAGS_EXTRA ?= -DMG_TLS=MG_TLS_BUILTIN\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += -DMG_ENABLE_PACKED_FS=1\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= client.exe            # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\n  MAKE += WINDOWS=1 CC=$(CC)\nendif\n\nall: $(PROG)\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES) Makefile\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\ncsr: FORCE\n\topenssl ecparam -noout -name prime256v1 -genkey -out key.pem\n\topenssl req -new -key key.pem -subj /CN=Mongoose -out crt.csr\n\nmongoose_fs.c: ca.pem crt.pem key.pem\n\tnode ../../../test/pack.js ca.pem crt.pem key.pem > $@\n\nclean:\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM mbedtls\n\n# For automated test purposes only\nexample: FORCE\n\ttouch mongoose_fs.c\n\nFORCE:\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-client-aws-iot/README.md",
    "content": "- This example requires generating AWS and user credentials and downloading certificates\n- This example requires building with TLS support; before running, see detailed tutorial at https://mongoose.ws/tutorials/mqtt/mqtt-client-aws-iot/\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-client-aws-iot/main.c",
    "content": "// Copyright (c) 2020 Cesanta Software Limited\n// All rights reserved\n//\n// Example MQTT client. It performs the following steps:\n//    1. Connects to the AWS IoT MQTT server\n//    2. When connected, subscribes to the topic `s_rx_topic`\n//    3. Publishes message `hello` to the `s_tx_topic` periodically\n//\n\n// How to build and run this example:\n// 1. Login to AWS IoT\n// 2. Click \"Settings\" on the left bar, copy the domain, change s_url below\n// 3. Click Security -> Policies -> Create Policy, fill fields:\n//               Name        : PolicyAllow\n//               Action      : iot:*\n//               Resource ARN: *\n//               Effect      : allow\n//        then, click \"Create\"\n// 4. Create EC private key file and CSR (Certificate Signing Request)\n//      type \"make csr\", see Makefile\n// 5. Click Security -> Certificates -> Add Certificate -> Create Certificate\n//      Choose \"Create certificate with certificate signing request (CSR)\"\n//      Choose \"crt.csr\" created on a previous step\n//      Choose \"Active\" to activate certificate\n//      Click Create\n//      Attach PolicyAllow policy to the created certificate\n//      Downoad AmazonRootCA1.pem as ca.pem and generated certificate as crt.pem\n//      Select certificate, attach PolicyAllow to it\n// 6. Type \"make\" to build and run the example\n\nstatic const char *s_url =\n    \"mqtts://a1pjwh2bop1ojt-ats.iot.eu-west-1.amazonaws.com\";\nstatic const char *s_rx_topic = \"d/rx\";\nstatic const char *s_tx_topic = \"d/tx\";\nstatic int s_qos = 1;\n\n#include \"mongoose.h\"\n\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_OPEN) {\n    // c->is_hexdumping = 1;\n  } else if (ev == MG_EV_CONNECT) {\n    if (c->is_tls) {\n      struct mg_tls_opts opts = {.ca = mg_unpacked(\"/ca.pem\"),\n                                 .cert = mg_unpacked(\"/crt.pem\"),\n                                 .key = mg_unpacked(\"/key.pem\"),\n                                 .name = mg_url_host(s_url)};\n      mg_tls_init(c, &opts);\n    }\n  } else if (ev == MG_EV_ERROR) {\n    // On error, log error message\n    MG_ERROR((\"%p %s\", c->fd, (char *) ev_data));\n  } else if (ev == MG_EV_MQTT_OPEN) {\n    // MQTT connect is successful\n    struct mg_str topic = mg_str(s_rx_topic);\n    MG_INFO((\"Connected to %s\", s_url));\n    MG_INFO((\"Subscribing to %s\", s_rx_topic));\n    struct mg_mqtt_opts sub_opts;\n    memset(&sub_opts, 0, sizeof(sub_opts));\n    sub_opts.topic = topic;\n    sub_opts.qos = s_qos;\n    mg_mqtt_sub(c, &sub_opts);\n    c->data[0] = 'X';  // Set a label that we're logged in\n  } else if (ev == MG_EV_MQTT_MSG) {\n    // When we receive MQTT message, print it\n    struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;\n    MG_INFO((\"Received on %.*s : %.*s\", (int) mm->topic.len, mm->topic.buf,\n             (int) mm->data.len, mm->data.buf));\n  } else if (ev == MG_EV_POLL && c->data[0] == 'X') {\n    static unsigned long prev_second;\n    unsigned long now_second = (*(unsigned long *) ev_data) / 1000;\n    if (now_second != prev_second) {\n      struct mg_str topic = mg_str(s_tx_topic), data = mg_str(\"{\\\"a\\\":123}\");\n      MG_INFO((\"Publishing to %s\", s_tx_topic));\n      struct mg_mqtt_opts pub_opts;\n      memset(&pub_opts, 0, sizeof(pub_opts));\n      pub_opts.topic = topic;\n      pub_opts.message = data;\n      pub_opts.qos = s_qos, pub_opts.retain = false;\n      mg_mqtt_pub(c, &pub_opts);\n      prev_second = now_second;\n    }\n  }\n\n  if (ev == MG_EV_ERROR || ev == MG_EV_CLOSE) {\n    MG_INFO((\"Got event %d, stopping...\", ev));\n    *(bool *) c->fn_data = true;  // Signal that we're done\n  }\n}\n\nint main(void) {\n  struct mg_mgr mgr;\n  struct mg_mqtt_opts opts = {.clean = true};\n  bool done = false;\n  mg_log_set(MG_LL_DEBUG);\n  mg_mgr_init(&mgr);                               // Initialise event manager\n  MG_INFO((\"Connecting to %s\", s_url));            // Inform that we're starting\n  mg_mqtt_connect(&mgr, s_url, &opts, fn, &done);  // Create client connection\n  while (!done) mg_mgr_poll(&mgr, 1000);           // Loop until done\n  mg_mgr_free(&mgr);                               // Finished, cleanup\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-dashboard/Makefile",
    "content": "# for internal testing purposes\n\nall clean example:\n\t$(MAKE) -C device $@ CFLAGS_EXTRA=$(CFLAGS_EXTRA)\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-dashboard/dashboard/Makefile",
    "content": "all:\n\tmake -C ../../../http/http-server ARGS=\"-d $(CURDIR)\"\n\n# Bundle JS libraries (preact, preact-router, ...) into a single file\nbundle.js:\n\tcurl -s https://npm.reversehttp.com/preact,preact/hooks,htm/preact,preact-router,@preact/signals-core,@preact/signals -o $@\n\nclean:\n\ttrue\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-dashboard/dashboard/bundle.js",
    "content": "var t,n,e,i,o,r,_,u,l,f,s,c,a,h={},p=[],d=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,v=Array.isArray;function y(t,n){for(var e in n)t[e]=n[e];return t}function m(t){t&&t.parentNode&&t.parentNode.removeChild(t)}function g(n,e,i){var o,r,_,u={};for(_ in e)\"key\"==_?o=e[_]:\"ref\"==_?r=e[_]:u[_]=e[_];if(arguments.length>2&&(u.children=arguments.length>3?t.call(arguments,2):i),\"function\"==typeof n&&null!=n.defaultProps)for(_ in n.defaultProps)void 0===u[_]&&(u[_]=n.defaultProps[_]);return b(n,u,o,r,null)}function b(t,i,o,r,_){var u={type:t,props:i,key:o,ref:r,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:null==_?++e:_,__i:-1,__u:0};return null==_&&null!=n.vnode&&n.vnode(u),u}function k(){return{current:null}}function w(t){return t.children}function x(t,n){this.props=t,this.context=n}function S(t,n){if(null==n)return t.__?S(t.__,t.__i+1):null;for(var e;n<t.__k.length;n++)if(null!=(e=t.__k[n])&&null!=e.__e)return e.__e;return\"function\"==typeof t.type?S(t):null}function C(t){var n,e;if(null!=(t=t.__)&&null!=t.__c){for(t.__e=t.__c.base=null,n=0;n<t.__k.length;n++)if(null!=(e=t.__k[n])&&null!=e.__e){t.__e=t.__c.base=e.__e;break}return C(t)}}function U(t){(!t.__d&&(t.__d=!0)&&o.push(t)&&!E.__r++||r!=n.debounceRendering)&&((r=n.debounceRendering)||_)(E)}function E(){for(var t,e,i,r,_,l,f,s=1;o.length;)o.length>s&&o.sort(u),t=o.shift(),s=o.length,t.__d&&(i=void 0,_=(r=(e=t).__v).__e,l=[],f=[],e.__P&&((i=y({},r)).__v=r.__v+1,n.vnode&&n.vnode(i),F(e.__P,i,r,e.__n,e.__P.namespaceURI,32&r.__u?[_]:null,l,null==_?S(r):_,!!(32&r.__u),f),i.__v=r.__v,i.__.__k[i.__i]=i,R(l,i,f),i.__e!=_&&C(i)));E.__r=0}function P(t,n,e,i,o,r,_,u,l,f,s){var c,a,d,v,y,m,g=i&&i.__k||p,b=n.length;for(l=A(e,n,g,l,b),c=0;c<b;c++)null!=(d=e.__k[c])&&(a=-1==d.__i?h:g[d.__i]||h,d.__i=c,m=F(t,d,a,o,r,_,u,l,f,s),v=d.__e,d.ref&&a.ref!=d.ref&&(a.ref&&L(a.ref,null,d),s.push(d.ref,d.__c||v,d)),null==y&&null!=v&&(y=v),4&d.__u||a.__k===d.__k?l=N(d,l,t):\"function\"==typeof d.type&&void 0!==m?l=m:v&&(l=v.nextSibling),d.__u&=-7);return e.__e=y,l}function A(t,n,e,i,o){var r,_,u,l,f,s=e.length,c=s,a=0;for(t.__k=new Array(o),r=0;r<o;r++)null!=(_=n[r])&&\"boolean\"!=typeof _&&\"function\"!=typeof _?(l=r+a,(_=t.__k[r]=\"string\"==typeof _||\"number\"==typeof _||\"bigint\"==typeof _||_.constructor==String?b(null,_,null,null,null):v(_)?b(w,{children:_},null,null,null):null==_.constructor&&_.__b>0?b(_.type,_.props,_.key,_.ref?_.ref:null,_.__v):_).__=t,_.__b=t.__b+1,u=null,-1!=(f=_.__i=$(_,e,l,c))&&(c--,(u=e[f])&&(u.__u|=2)),null==u||null==u.__v?(-1==f&&(o>s?a--:o<s&&a++),\"function\"!=typeof _.type&&(_.__u|=4)):f!=l&&(f==l-1?a--:f==l+1?a++:(f>l?a--:a++,_.__u|=4))):t.__k[r]=null;if(c)for(r=0;r<s;r++)null!=(u=e[r])&&0==(2&u.__u)&&(u.__e==i&&(i=S(u)),I(u,u));return i}function N(t,n,e){var i,o;if(\"function\"==typeof t.type){for(i=t.__k,o=0;i&&o<i.length;o++)i[o]&&(i[o].__=t,n=N(i[o],n,e));return n}t.__e!=n&&(n&&t.type&&!e.contains(n)&&(n=S(t)),e.insertBefore(t.__e,n||null),n=t.__e);do{n=n&&n.nextSibling}while(null!=n&&8==n.nodeType);return n}function H(t,n){return n=n||[],null==t||\"boolean\"==typeof t||(v(t)?t.some((function(t){H(t,n)})):n.push(t)),n}function $(t,n,e,i){var o,r,_=t.key,u=t.type,l=n[e];if(null===l&&null==t.key||l&&_==l.key&&u==l.type&&0==(2&l.__u))return e;if(i>(null!=l&&0==(2&l.__u)?1:0))for(o=e-1,r=e+1;o>=0||r<n.length;){if(o>=0){if((l=n[o])&&0==(2&l.__u)&&_==l.key&&u==l.type)return o;o--}if(r<n.length){if((l=n[r])&&0==(2&l.__u)&&_==l.key&&u==l.type)return r;r++}}return-1}function T(t,n,e){\"-\"==n[0]?t.setProperty(n,null==e?\"\":e):t[n]=null==e?\"\":\"number\"!=typeof e||d.test(n)?e:e+\"px\"}function D(t,n,e,i,o){var r,_;t:if(\"style\"==n)if(\"string\"==typeof e)t.style.cssText=e;else{if(\"string\"==typeof i&&(t.style.cssText=i=\"\"),i)for(n in i)e&&n in e||T(t.style,n,\"\");if(e)for(n in e)i&&e[n]==i[n]||T(t.style,n,e[n])}else if(\"o\"==n[0]&&\"n\"==n[1])r=n!=(n=n.replace(l,\"$1\")),_=n.toLowerCase(),n=_ in t||\"onFocusOut\"==n||\"onFocusIn\"==n?_.slice(2):n.slice(2),t.l||(t.l={}),t.l[n+r]=e,e?i?e.u=i.u:(e.u=f,t.addEventListener(n,r?c:s,r)):t.removeEventListener(n,r?c:s,r);else{if(\"http://www.w3.org/2000/svg\"==o)n=n.replace(/xlink(H|:h)/,\"h\").replace(/sName$/,\"s\");else if(\"width\"!=n&&\"height\"!=n&&\"href\"!=n&&\"list\"!=n&&\"form\"!=n&&\"tabIndex\"!=n&&\"download\"!=n&&\"rowSpan\"!=n&&\"colSpan\"!=n&&\"role\"!=n&&\"popover\"!=n&&n in t)try{t[n]=null==e?\"\":e;break t}catch(t){}\"function\"==typeof e||(null==e||!1===e&&\"-\"!=n[4]?t.removeAttribute(n):t.setAttribute(n,\"popover\"==n&&1==e?\"\":e))}}function M(t){return function(e){if(this.l){var i=this.l[e.type+t];if(null==e.t)e.t=f++;else if(e.t<i.u)return;return i(n.event?n.event(e):e)}}}function F(t,e,i,o,r,_,u,l,f,s){var c,a,h,p,d,g,b,k,S,C,U,E,A,N,H,$,T,D=e.type;if(null!=e.constructor)return null;128&i.__u&&(f=!!(32&i.__u),_=[l=e.__e=i.__e]),(c=n.__b)&&c(e);t:if(\"function\"==typeof D)try{if(k=e.props,S=\"prototype\"in D&&D.prototype.render,C=(c=D.contextType)&&o[c.__c],U=c?C?C.props.value:c.__:o,i.__c?b=(a=e.__c=i.__c).__=a.__E:(S?e.__c=a=new D(k,U):(e.__c=a=new x(k,U),a.constructor=D,a.render=q),C&&C.sub(a),a.props=k,a.state||(a.state={}),a.context=U,a.__n=o,h=a.__d=!0,a.__h=[],a._sb=[]),S&&null==a.__s&&(a.__s=a.state),S&&null!=D.getDerivedStateFromProps&&(a.__s==a.state&&(a.__s=y({},a.__s)),y(a.__s,D.getDerivedStateFromProps(k,a.__s))),p=a.props,d=a.state,a.__v=e,h)S&&null==D.getDerivedStateFromProps&&null!=a.componentWillMount&&a.componentWillMount(),S&&null!=a.componentDidMount&&a.__h.push(a.componentDidMount);else{if(S&&null==D.getDerivedStateFromProps&&k!==p&&null!=a.componentWillReceiveProps&&a.componentWillReceiveProps(k,U),!a.__e&&null!=a.shouldComponentUpdate&&!1===a.shouldComponentUpdate(k,a.__s,U)||e.__v==i.__v){for(e.__v!=i.__v&&(a.props=k,a.state=a.__s,a.__d=!1),e.__e=i.__e,e.__k=i.__k,e.__k.some((function(t){t&&(t.__=e)})),E=0;E<a._sb.length;E++)a.__h.push(a._sb[E]);a._sb=[],a.__h.length&&u.push(a);break t}null!=a.componentWillUpdate&&a.componentWillUpdate(k,a.__s,U),S&&null!=a.componentDidUpdate&&a.__h.push((function(){a.componentDidUpdate(p,d,g)}))}if(a.context=U,a.props=k,a.__P=t,a.__e=!1,A=n.__r,N=0,S){for(a.state=a.__s,a.__d=!1,A&&A(e),c=a.render(a.props,a.state,a.context),H=0;H<a._sb.length;H++)a.__h.push(a._sb[H]);a._sb=[]}else do{a.__d=!1,A&&A(e),c=a.render(a.props,a.state,a.context),a.state=a.__s}while(a.__d&&++N<25);a.state=a.__s,null!=a.getChildContext&&(o=y(y({},o),a.getChildContext())),S&&!h&&null!=a.getSnapshotBeforeUpdate&&(g=a.getSnapshotBeforeUpdate(p,d)),$=c,null!=c&&c.type===w&&null==c.key&&($=W(c.props.children)),l=P(t,v($)?$:[$],e,i,o,r,_,u,l,f,s),a.base=e.__e,e.__u&=-161,a.__h.length&&u.push(a),b&&(a.__E=a.__=null)}catch(t){if(e.__v=null,f||null!=_)if(t.then){for(e.__u|=f?160:128;l&&8==l.nodeType&&l.nextSibling;)l=l.nextSibling;_[_.indexOf(l)]=null,e.__e=l}else for(T=_.length;T--;)m(_[T]);else e.__e=i.__e,e.__k=i.__k;n.__e(t,e,i)}else null==_&&e.__v==i.__v?(e.__k=i.__k,e.__e=i.__e):l=e.__e=O(i.__e,e,i,o,r,_,u,f,s);return(c=n.diffed)&&c(e),128&e.__u?void 0:l}function R(t,e,i){for(var o=0;o<i.length;o++)L(i[o],i[++o],i[++o]);n.__c&&n.__c(e,t),t.some((function(e){try{t=e.__h,e.__h=[],t.some((function(t){t.call(e)}))}catch(t){n.__e(t,e.__v)}}))}function W(t){return\"object\"!=typeof t||null==t||t.__b&&t.__b>0?t:v(t)?t.map(W):y({},t)}function O(e,i,o,r,_,u,l,f,s){var c,a,p,d,y,g,b,k=o.props,w=i.props,x=i.type;if(\"svg\"==x?_=\"http://www.w3.org/2000/svg\":\"math\"==x?_=\"http://www.w3.org/1998/Math/MathML\":_||(_=\"http://www.w3.org/1999/xhtml\"),null!=u)for(c=0;c<u.length;c++)if((y=u[c])&&\"setAttribute\"in y==!!x&&(x?y.localName==x:3==y.nodeType)){e=y,u[c]=null;break}if(null==e){if(null==x)return document.createTextNode(w);e=document.createElementNS(_,x,w.is&&w),f&&(n.__m&&n.__m(i,u),f=!1),u=null}if(null==x)k===w||f&&e.data==w||(e.data=w);else{if(u=u&&t.call(e.childNodes),k=o.props||h,!f&&null!=u)for(k={},c=0;c<e.attributes.length;c++)k[(y=e.attributes[c]).name]=y.value;for(c in k)if(y=k[c],\"children\"==c);else if(\"dangerouslySetInnerHTML\"==c)p=y;else if(!(c in w)){if(\"value\"==c&&\"defaultValue\"in w||\"checked\"==c&&\"defaultChecked\"in w)continue;D(e,c,null,y,_)}for(c in w)y=w[c],\"children\"==c?d=y:\"dangerouslySetInnerHTML\"==c?a=y:\"value\"==c?g=y:\"checked\"==c?b=y:f&&\"function\"!=typeof y||k[c]===y||D(e,c,y,k[c],_);if(a)f||p&&(a.__html==p.__html||a.__html==e.innerHTML)||(e.innerHTML=a.__html),i.__k=[];else if(p&&(e.innerHTML=\"\"),P(\"template\"==i.type?e.content:e,v(d)?d:[d],i,o,r,\"foreignObject\"==x?\"http://www.w3.org/1999/xhtml\":_,u,l,u?u[0]:o.__k&&S(o,0),f,s),null!=u)for(c=u.length;c--;)m(u[c]);f||(c=\"value\",\"progress\"==x&&null==g?e.removeAttribute(\"value\"):null!=g&&(g!==e[c]||\"progress\"==x&&!g||\"option\"==x&&g!=k[c])&&D(e,c,g,k[c],_),c=\"checked\",null!=b&&b!=e[c]&&D(e,c,b,k[c],_))}return e}function L(t,e,i){try{if(\"function\"==typeof t){var o=\"function\"==typeof t.__u;o&&t.__u(),o&&null==e||(t.__u=t(e))}else t.current=e}catch(t){n.__e(t,i)}}function I(t,e,i){var o,r;if(n.unmount&&n.unmount(t),(o=t.ref)&&(o.current&&o.current!=t.__e||L(o,null,e)),null!=(o=t.__c)){if(o.componentWillUnmount)try{o.componentWillUnmount()}catch(t){n.__e(t,e)}o.base=o.__P=null}if(o=t.__k)for(r=0;r<o.length;r++)o[r]&&I(o[r],e,i||\"function\"!=typeof t.type);i||m(t.__e),t.__c=t.__=t.__e=void 0}function q(t,n,e){return this.constructor(t,e)}function j(e,i,o){var r,_,u,l;i==document&&(i=document.documentElement),n.__&&n.__(e,i),_=(r=\"function\"==typeof o)?null:o&&o.__k||i.__k,u=[],l=[],F(i,e=(!r&&o||i).__k=g(w,null,[e]),_||h,h,i.namespaceURI,!r&&o?[o]:_?null:i.firstChild?t.call(i.childNodes):null,u,!r&&o?o:_?_.__e:i.firstChild,r,l),R(u,e,l)}function V(t,n){j(t,n,V)}function B(n,e,i){var o,r,_,u,l=y({},n.props);for(_ in n.type&&n.type.defaultProps&&(u=n.type.defaultProps),e)\"key\"==_?o=e[_]:\"ref\"==_?r=e[_]:l[_]=void 0===e[_]&&null!=u?u[_]:e[_];return arguments.length>2&&(l.children=arguments.length>3?t.call(arguments,2):i),b(n.type,l,o||n.key,r||n.ref,null)}function K(t){function n(t){var e,i;return this.getChildContext||(e=new Set,(i={})[n.__c]=this,this.getChildContext=function(){return i},this.componentWillUnmount=function(){e=null},this.shouldComponentUpdate=function(t){this.props.value!=t.value&&e.forEach((function(t){t.__e=!0,U(t)}))},this.sub=function(t){e.add(t);var n=t.componentWillUnmount;t.componentWillUnmount=function(){e&&e.delete(t),n&&n.call(t)}}),t.children}return n.__c=\"__cC\"+a++,n.__=t,n.Provider=n.__l=(n.Consumer=function(t,n){return t.children(n)}).contextType=n,n}t=p.slice,n={__e:function(t,n,e,i){for(var o,r,_;n=n.__;)if((o=n.__c)&&!o.__)try{if((r=o.constructor)&&null!=r.getDerivedStateFromError&&(o.setState(r.getDerivedStateFromError(t)),_=o.__d),null!=o.componentDidCatch&&(o.componentDidCatch(t,i||{}),_=o.__d),_)return o.__E=o}catch(n){t=n}throw t}},e=0,i=function(t){return null!=t&&null==t.constructor},x.prototype.setState=function(t,n){var e;e=null!=this.__s&&this.__s!=this.state?this.__s:this.__s=y({},this.state),\"function\"==typeof t&&(t=t(y({},e),this.props)),t&&y(e,t),null!=t&&this.__v&&(n&&this._sb.push(n),U(this))},x.prototype.forceUpdate=function(t){this.__v&&(this.__e=!0,t&&this.__h.push(t),U(this))},x.prototype.render=w,o=[],_=\"function\"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,u=function(t,n){return t.__v.__b-n.__v.__b},E.__r=0,l=/(PointerCapture)$|Capture$/i,f=0,s=M(!1),c=M(!0),a=0;var Z,z,G,J,Q=0,X=[],Y=n,tt=Y.__b,nt=Y.__r,et=Y.diffed,it=Y.__c,ot=Y.unmount,rt=Y.__;function _t(t,n){Y.__h&&Y.__h(z,t,Q||n),Q=0;var e=z.__H||(z.__H={__:[],__h:[]});return t>=e.__.length&&e.__.push({}),e.__[t]}function ut(t){return Q=1,lt(Ct,t)}function lt(t,n,e){var i=_t(Z++,2);if(i.t=t,!i.__c&&(i.__=[e?e(n):Ct(void 0,n),function(t){var n=i.__N?i.__N[0]:i.__[0],e=i.t(n,t);n!==e&&(i.__N=[e,i.__[1]],i.__c.setState({}))}],i.__c=z,!z.__f)){var o=function(t,n,e){if(!i.__c.__H)return!0;var o=i.__c.__H.__.filter((function(t){return!!t.__c}));if(o.every((function(t){return!t.__N})))return!r||r.call(this,t,n,e);var _=i.__c.props!==t;return o.forEach((function(t){if(t.__N){var n=t.__[0];t.__=t.__N,t.__N=void 0,n!==t.__[0]&&(_=!0)}})),r&&r.call(this,t,n,e)||_};z.__f=!0;var r=z.shouldComponentUpdate,_=z.componentWillUpdate;z.componentWillUpdate=function(t,n,e){if(this.__e){var i=r;r=void 0,o(t,n,e),r=i}_&&_.call(this,t,n,e)},z.shouldComponentUpdate=o}return i.__N||i.__}function ft(t,n){var e=_t(Z++,3);!Y.__s&&St(e.__H,n)&&(e.__=t,e.u=n,z.__H.__h.push(e))}function st(t,n){var e=_t(Z++,4);!Y.__s&&St(e.__H,n)&&(e.__=t,e.u=n,z.__h.push(e))}function ct(t){return Q=5,ht((function(){return{current:t}}),[])}function at(t,n,e){Q=6,st((function(){if(\"function\"==typeof t){var e=t(n());return function(){t(null),e&&\"function\"==typeof e&&e()}}if(t)return t.current=n(),function(){return t.current=null}}),null==e?e:e.concat(t))}function ht(t,n){var e=_t(Z++,7);return St(e.__H,n)&&(e.__=t(),e.__H=n,e.__h=t),e.__}function pt(t,n){return Q=8,ht((function(){return t}),n)}function dt(t){var n=z.context[t.__c],e=_t(Z++,9);return e.c=t,n?(null==e.__&&(e.__=!0,n.sub(z)),n.props.value):t.__}function vt(t,n){Y.useDebugValue&&Y.useDebugValue(n?n(t):t)}function yt(t){var n=_t(Z++,10),e=ut();return n.__=t,z.componentDidCatch||(z.componentDidCatch=function(t,i){n.__&&n.__(t,i),e[1](t)}),[e[0],function(){e[1](void 0)}]}function mt(){var t=_t(Z++,11);if(!t.__){for(var n=z.__v;null!==n&&!n.__m&&null!==n.__;)n=n.__;var e=n.__m||(n.__m=[0,0]);t.__=\"P\"+e[0]+\"-\"+e[1]++}return t.__}function gt(){for(var t;t=X.shift();)if(t.__P&&t.__H)try{t.__H.__h.forEach(wt),t.__H.__h.forEach(xt),t.__H.__h=[]}catch(i){t.__H.__h=[],Y.__e(i,t.__v)}}Y.__b=function(t){z=null,tt&&tt(t)},Y.__=function(t,n){t&&n.__k&&n.__k.__m&&(t.__m=n.__k.__m),rt&&rt(t,n)},Y.__r=function(t){nt&&nt(t),Z=0;var n=(z=t.__c).__H;n&&(G===z?(n.__h=[],z.__h=[],n.__.forEach((function(t){t.__N&&(t.__=t.__N),t.u=t.__N=void 0}))):(n.__h.forEach(wt),n.__h.forEach(xt),n.__h=[],Z=0)),G=z},Y.diffed=function(t){et&&et(t);var n=t.__c;n&&n.__H&&(n.__H.__h.length&&(1!==X.push(n)&&J===Y.requestAnimationFrame||((J=Y.requestAnimationFrame)||kt)(gt)),n.__H.__.forEach((function(t){t.u&&(t.__H=t.u),t.u=void 0}))),G=z=null},Y.__c=function(t,n){n.some((function(t){try{t.__h.forEach(wt),t.__h=t.__h.filter((function(t){return!t.__||xt(t)}))}catch(r){n.some((function(t){t.__h&&(t.__h=[])})),n=[],Y.__e(r,t.__v)}})),it&&it(t,n)},Y.unmount=function(t){ot&&ot(t);var n,e=t.__c;e&&e.__H&&(e.__H.__.forEach((function(t){try{wt(t)}catch(t){n=t}})),e.__H=void 0,n&&Y.__e(n,e.__v))};var bt=\"function\"==typeof requestAnimationFrame;function kt(t){var n,e=function(){clearTimeout(i),bt&&cancelAnimationFrame(n),setTimeout(t)},i=setTimeout(e,35);bt&&(n=requestAnimationFrame(e))}function wt(t){var n=z,e=t.__c;\"function\"==typeof e&&(t.__c=void 0,e()),z=n}function xt(t){var n=z;t.__c=t.__(),z=n}function St(t,n){return!t||t.length!==n.length||n.some((function(n,e){return n!==t[e]}))}function Ct(t,n){return\"function\"==typeof n?n(t):n}var Ut=function(t,n,e,i){var o;n[0]=0;for(var r=1;r<n.length;r++){var _=n[r++],u=n[r]?(n[0]|=_?1:2,e[n[r++]]):n[++r];3===_?i[0]=u:4===_?i[1]=Object.assign(i[1]||{},u):5===_?(i[1]=i[1]||{})[n[++r]]=u:6===_?i[1][n[++r]]+=u+\"\":_?(o=t.apply(u,Ut(t,u,e,[\"\",null])),i.push(o),u[0]?n[0]|=2:(n[r-2]=0,n[r]=o)):i.push(u)}return i},Et=new Map;function Pt(t){var n=Et.get(this);return n||(n=new Map,Et.set(this,n)),(n=Ut(this,n.get(t)||(n.set(t,n=function(t){for(var n,e,i=1,o=\"\",r=\"\",_=[0],u=function(t){1===i&&(t||(o=o.replace(/^\\s*\\n\\s*|\\s*\\n\\s*$/g,\"\")))?_.push(0,t,o):3===i&&(t||o)?(_.push(3,t,o),i=2):2===i&&\"...\"===o&&t?_.push(4,t,0):2===i&&o&&!t?_.push(5,0,!0,o):i>=5&&((o||!t&&5===i)&&(_.push(i,0,o,e),i=6),t&&(_.push(i,t,0,e),i=6)),o=\"\"},l=0;l<t.length;l++){l&&(1===i&&u(),u(l));for(var f=0;f<t[l].length;f++)n=t[l][f],1===i?\"<\"===n?(u(),_=[_],i=3):o+=n:4===i?\"--\"===o&&\">\"===n?(i=1,o=\"\"):o=n+o[0]:r?n===r?r=\"\":o+=n:'\"'===n||\"'\"===n?r=n:\">\"===n?(u(),i=1):i&&(\"=\"===n?(i=5,e=o,o=\"\"):\"/\"===n&&(i<5||\">\"===t[l][f+1])?(u(),3===i&&(_=_[0]),i=_,(_=_[0]).push(2,0,i),i=0):\" \"===n||\"\\t\"===n||\"\\n\"===n||\"\\r\"===n?(u(),i=2):o+=n),3===i&&\"!--\"===o&&(i=4,_=_[0])}return u(),_}(t)),n),arguments,[])).length>1?n:n[0]}var At=Pt.bind(g);var Nt={};function Ht(t,n){for(var e in n)t[e]=n[e];return t}function $t(t,n,e){var i,o=/(?:\\?([^#]*))?(#.*)?$/,r=t.match(o),_={};if(r&&r[1])for(var u=r[1].split(\"&\"),l=0;l<u.length;l++){var f=u[l].split(\"=\");_[decodeURIComponent(f[0])]=decodeURIComponent(f.slice(1).join(\"=\"))}t=Mt(t.replace(o,\"\")),n=Mt(n||\"\");for(var s=Math.max(t.length,n.length),c=0;c<s;c++)if(n[c]&&\":\"===n[c].charAt(0)){var a=n[c].replace(/(^:|[+*?]+$)/g,\"\"),h=(n[c].match(/[+*?]+$/)||Nt)[0]||\"\",p=~h.indexOf(\"+\"),d=~h.indexOf(\"*\"),v=t[c]||\"\";if(!v&&!d&&(h.indexOf(\"?\")<0||p)){i=!1;break}if(_[a]=decodeURIComponent(v),p||d){_[a]=t.slice(c).map(decodeURIComponent).join(\"/\");break}}else if(n[c]!==t[c]){i=!1;break}return(!0===e.default||!1!==i)&&_}function Tt(t,n){return t.rank<n.rank?1:t.rank>n.rank?-1:t.index-n.index}function Dt(t,n){return t.index=n,t.rank=function(t){return t.props.default?0:Mt(t.props.path).map(Ft).join(\"\")}(t),t.props}function Mt(t){return t.replace(/(^\\/+|\\/+$)/g,\"\").split(\"/\")}function Ft(t){return\":\"==t.charAt(0)?1+\"*+?\".indexOf(t.charAt(t.length-1))||4:5}var Rt={},Wt=[],Ot=[],Lt=null,It={url:Vt()},qt=K(It);function jt(){var t=dt(qt);if(t===It){var n=ut()[1];ft((function(){return Ot.push(n),function(){return Ot.splice(Ot.indexOf(n),1)}}),[])}return[t,Bt]}function Vt(){var t;return\"\"+((t=Lt&&Lt.location?Lt.location:Lt&&Lt.getCurrentLocation?Lt.getCurrentLocation():\"undefined\"!=typeof location?location:Rt).pathname||\"\")+(t.search||\"\")}function Bt(t,n){return void 0===n&&(n=!1),\"string\"!=typeof t&&t.url&&(n=t.replace,t=t.url),function(t){for(var n=Wt.length;n--;)if(Wt[n].canRoute(t))return!0;return!1}(t)&&function(t,n){void 0===n&&(n=\"push\"),Lt&&Lt[n]?Lt[n](t):\"undefined\"!=typeof history&&history[n+\"State\"]&&history[n+\"State\"](null,null,t)}(t,n?\"replace\":\"push\"),Kt(t)}function Kt(t){for(var n=!1,e=0;e<Wt.length;e++)Wt[e].routeTo(t)&&(n=!0);return n}function Zt(t){if(t&&t.getAttribute){var n=t.getAttribute(\"href\"),e=t.getAttribute(\"target\");if(n&&n.match(/^\\//g)&&(!e||e.match(/^_?self$/i)))return Bt(n)}}function zt(t){return t.stopImmediatePropagation&&t.stopImmediatePropagation(),t.stopPropagation&&t.stopPropagation(),t.preventDefault(),!1}function Gt(t){if(!(t.ctrlKey||t.metaKey||t.altKey||t.shiftKey||t.button)){var n=t.target;do{if(\"a\"===n.localName&&n.getAttribute(\"href\")){if(n.hasAttribute(\"data-native\")||n.hasAttribute(\"native\"))return;if(Zt(n))return zt(t)}}while(n=n.parentNode)}}var Jt=!1;function Qt(t){t.history&&(Lt=t.history),this.state={url:t.url||Vt()}}Ht(Qt.prototype=new x,{shouldComponentUpdate:function(t){return!0!==t.static||t.url!==this.props.url||t.onChange!==this.props.onChange},canRoute:function(t){var n=H(this.props.children);return void 0!==this.g(n,t)},routeTo:function(t){this.setState({url:t});var n=this.canRoute(t);return this.p||this.forceUpdate(),n},componentWillMount:function(){this.p=!0},componentDidMount:function(){var t=this;Jt||(Jt=!0,Lt||addEventListener(\"popstate\",(function(){Kt(Vt())})),addEventListener(\"click\",Gt)),Wt.push(this),Lt&&(this.u=Lt.listen((function(n){var e=n.location||n;t.routeTo(\"\"+(e.pathname||\"\")+(e.search||\"\"))}))),this.p=!1},componentWillUnmount:function(){\"function\"==typeof this.u&&this.u(),Wt.splice(Wt.indexOf(this),1)},componentWillUpdate:function(){this.p=!0},componentDidUpdate:function(){this.p=!1},g:function(t,n){t=t.filter(Dt).sort(Tt);for(var e=0;e<t.length;e++){var i=t[e],o=$t(n,i.props.path,i.props);if(o)return[i,o]}},render:function(t,n){var e,i,o=t.onChange,r=n.url,_=this.c,u=this.g(H(t.children),r);if(u&&(i=B(u[0],Ht(Ht({url:r,matches:e=u[1]},e),{key:void 0,ref:void 0}))),r!==(_&&_.url)){Ht(It,_=this.c={url:r,previous:_&&_.url,current:i,path:i?i.props.path:null,matches:e}),_.router=this,_.active=i?[i]:[];for(var l=Ot.length;l--;)Ot[l]({});\"function\"==typeof o&&o(_)}return g(qt.Provider,{value:_},i)}});var Xt=function(t){return g(\"a\",Ht({onClick:Gt},t))},Yt=function(t){return g(t.component,t)};const tn=Symbol.for(\"preact-signals\");function nn(){if(un>1){un--;return}let t,n=!1;while(void 0!==rn){let e=rn;rn=void 0;ln++;while(void 0!==e){const i=e.o;e.o=void 0;e.f&=-3;if(!(8&e.f)&&hn(e))try{e.c()}catch(_){if(!n){t=_;n=!0}}e=i}}ln=0;un--;if(n)throw t}function en(t){if(un>0)return t();un++;try{return t()}finally{nn()}}let on,rn;function _n(t){const n=on;on=void 0;try{return t()}finally{on=n}}let un=0,ln=0,fn=0;function sn(t){if(void 0===on)return;let n=t.n;if(void 0===n||n.t!==on){n={i:0,S:t,p:on.s,n:void 0,t:on,e:void 0,x:void 0,r:n};if(void 0!==on.s)on.s.n=n;on.s=n;t.n=n;if(32&on.f)t.S(n);return n}else if(-1===n.i){n.i=0;if(void 0!==n.n){n.n.p=n.p;if(void 0!==n.p)n.p.n=n.n;n.p=on.s;n.n=void 0;on.s.n=n;on.s=n}return n}}function cn(t,n){this.v=t;this.i=0;this.n=void 0;this.t=void 0;this.W=null==n?void 0:n.watched;this.Z=null==n?void 0:n.unwatched}cn.prototype.brand=tn;cn.prototype.h=function(){return!0};cn.prototype.S=function(t){const n=this.t;if(n!==t&&void 0===t.e){t.x=n;this.t=t;if(void 0!==n)n.e=t;else _n(()=>{var t;null==(t=this.W)||t.call(this)})}};cn.prototype.U=function(t){if(void 0!==this.t){const n=t.e,e=t.x;if(void 0!==n){n.x=e;t.e=void 0}if(void 0!==e){e.e=n;t.x=void 0}if(t===this.t){this.t=e;if(void 0===e)_n(()=>{var t;null==(t=this.Z)||t.call(this)})}}};cn.prototype.subscribe=function(t){return wn(()=>{const n=this.value,e=on;on=void 0;try{t(n)}finally{on=e}})};cn.prototype.valueOf=function(){return this.value};cn.prototype.toString=function(){return this.value+\"\"};cn.prototype.toJSON=function(){return this.value};cn.prototype.peek=function(){const t=on;on=void 0;try{return this.value}finally{on=t}};Object.defineProperty(cn.prototype,\"value\",{get(){const t=sn(this);if(void 0!==t)t.i=this.i;return this.v},set(t){if(t!==this.v){if(ln>100)throw new Error(\"Cycle detected\");this.v=t;this.i++;fn++;un++;try{for(let t=this.t;void 0!==t;t=t.x)t.t.N()}finally{nn()}}}});function an(t,n){return new cn(t,n)}function hn(t){for(let n=t.s;void 0!==n;n=n.n)if(n.S.i!==n.i||!n.S.h()||n.S.i!==n.i)return!0;return!1}function pn(t){for(let n=t.s;void 0!==n;n=n.n){const e=n.S.n;if(void 0!==e)n.r=e;n.S.n=n;n.i=-1;if(void 0===n.n){t.s=n;break}}}function dn(t){let n,e=t.s;while(void 0!==e){const t=e.p;if(-1===e.i){e.S.U(e);if(void 0!==t)t.n=e.n;if(void 0!==e.n)e.n.p=t}else n=e;e.S.n=e.r;if(void 0!==e.r)e.r=void 0;e=t}t.s=n}function vn(t,n){cn.call(this,void 0);this.x=t;this.s=void 0;this.g=fn-1;this.f=4;this.W=null==n?void 0:n.watched;this.Z=null==n?void 0:n.unwatched}vn.prototype=new cn;vn.prototype.h=function(){this.f&=-3;if(1&this.f)return!1;if(32==(36&this.f))return!0;this.f&=-5;if(this.g===fn)return!0;this.g=fn;this.f|=1;if(this.i>0&&!hn(this)){this.f&=-2;return!0}const t=on;try{pn(this);on=this;const t=this.x();if(16&this.f||this.v!==t||0===this.i){this.v=t;this.f&=-17;this.i++}}catch(t){this.v=t;this.f|=16;this.i++}on=t;dn(this);this.f&=-2;return!0};vn.prototype.S=function(t){if(void 0===this.t){this.f|=36;for(let t=this.s;void 0!==t;t=t.n)t.S.S(t)}cn.prototype.S.call(this,t)};vn.prototype.U=function(t){if(void 0!==this.t){cn.prototype.U.call(this,t);if(void 0===this.t){this.f&=-33;for(let t=this.s;void 0!==t;t=t.n)t.S.U(t)}}};vn.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(let t=this.t;void 0!==t;t=t.x)t.t.N()}};Object.defineProperty(vn.prototype,\"value\",{get(){if(1&this.f)throw new Error(\"Cycle detected\");const t=sn(this);this.h();if(void 0!==t)t.i=this.i;if(16&this.f)throw this.v;return this.v}});function yn(t,n){return new vn(t,n)}function mn(t){const n=t.u;t.u=void 0;if(\"function\"==typeof n){un++;const e=on;on=void 0;try{n()}catch(i){t.f&=-2;t.f|=8;gn(t);throw i}finally{on=e;nn()}}}function gn(t){for(let n=t.s;void 0!==n;n=n.n)n.S.U(n);t.x=void 0;t.s=void 0;mn(t)}function bn(t){if(on!==this)throw new Error(\"Out-of-order effect\");dn(this);on=t;this.f&=-2;if(8&this.f)gn(this);nn()}function kn(t){this.x=t;this.u=void 0;this.s=void 0;this.o=void 0;this.f=32}kn.prototype.c=function(){const t=this.S();try{if(8&this.f)return;if(void 0===this.x)return;const n=this.x();if(\"function\"==typeof n)this.u=n}finally{t()}};kn.prototype.S=function(){if(1&this.f)throw new Error(\"Cycle detected\");this.f|=1;this.f&=-9;mn(this);pn(this);un++;const t=on;on=this;return bn.bind(this,t)};kn.prototype.N=function(){if(!(2&this.f)){this.f|=2;this.o=rn;rn=this}};kn.prototype.d=function(){this.f|=8;if(!(1&this.f))gn(this)};kn.prototype.dispose=function(){this.d()};function wn(t){const n=new kn(t);try{n.c()}catch(t){n.d();throw t}return n.d.bind(n)}let xn,Sn,Cn,Un=[],En=[];wn((function(){xn=this.N}))();function Pn(t,e){n[t]=e.bind(null,n[t]||(()=>{}))}function An(t){if(Cn)Cn();Cn=t&&t.S()}function Nn({data:t}){const n=$n(t);n.value=t;const[e,o]=ht(()=>{let t=this,e=this.__v;while(e=e.__)if(e.__c){e.__c.__$f|=4;break}const o=yn(()=>{let t=n.value.value;return 0===t?0:!0===t?\"\":t||\"\"}),r=yn(()=>!Array.isArray(o.value)&&!i(o.value)),_=wn((function(){this.N=On;if(r.value){const n=o.value;if(t.__v&&t.__v.__e&&3===t.__v.__e.nodeType)t.__v.__e.data=n}})),u=this.__$u.d;this.__$u.d=function(){_();u.call(this)};return[r,o]},[]);return e.value?o.peek():o.value}Nn.displayName=\"_st\";Object.defineProperties(cn.prototype,{constructor:{configurable:!0,value:void 0},type:{configurable:!0,value:Nn},props:{configurable:!0,get(){return{data:this}}},__b:{configurable:!0,value:1}});Pn(\"__b\",(t,n)=>{if(\"string\"==typeof n.type){let t,e=n.props;for(let i in e){if(\"children\"===i)continue;let o=e[i];if(o instanceof cn){if(!t)n.__np=t={};t[i]=o;e[i]=o.peek()}}}t(n)});Pn(\"__r\",(t,n)=>{if(n.type!==w){An();let t,e=n.__c;if(e){e.__$f&=-2;t=e.__$u;if(void 0===t)e.__$u=t=function(t){let n;wn((function(){n=this}));n.c=()=>{e.__$f|=1;e.setState({})};return n}()}Sn=e;An(t)}t(n)});Pn(\"__e\",(t,n,e,i)=>{An();Sn=void 0;t(n,e,i)});Pn(\"diffed\",(t,n)=>{An();Sn=void 0;let e;if(\"string\"==typeof n.type&&(e=n.__e)){let t=n.__np,i=n.props;if(t){let n=e.U;if(n)for(let e in n){let i=n[e];if(void 0!==i&&!(e in t)){i.d();n[e]=void 0}}else{n={};e.U=n}for(let o in t){let r=n[o],_=t[o];if(void 0===r){r=Hn(e,o,_,i);n[o]=r}else r.o(_,i)}}}t(n)});function Hn(t,n,e,i){const o=n in t&&void 0===t.ownerSVGElement,r=an(e);return{o:(t,n)=>{r.value=t;i=n},d:wn((function(){this.N=On;const e=r.value.value;if(i[n]!==e){i[n]=e;if(o)t[n]=e;else if(e)t.setAttribute(n,e);else t.removeAttribute(n)}}))}}Pn(\"unmount\",(t,n)=>{if(\"string\"==typeof n.type){let t=n.__e;if(t){const n=t.U;if(n){t.U=void 0;for(let t in n){let e=n[t];if(e)e.d()}}}}else{let t=n.__c;if(t){const n=t.__$u;if(n){t.__$u=void 0;n.d()}}}t(n)});Pn(\"__h\",(t,n,e,i)=>{if(i<3||9===i)n.__$f|=2;t(n,e,i)});x.prototype.shouldComponentUpdate=function(t,n){const e=this.__$u,i=e&&void 0!==e.s;for(let o in n)return!0;if(this.__f||\"boolean\"==typeof this.u&&!0===this.u){const t=2&this.__$f;if(!(i||t||4&this.__$f))return!0;if(1&this.__$f)return!0}else{if(!(i||4&this.__$f))return!0;if(3&this.__$f)return!0}for(let o in t)if(\"__source\"!==o&&t[o]!==this.props[o])return!0;for(let o in this.props)if(!(o in t))return!0;return!1};function $n(t,n){return ht(()=>an(t,n),[])}function Tn(t,n){const e=ct(t);e.current=t;Sn.__$f|=4;return ht(()=>yn(()=>e.current(),n),[])}const Dn=\"undefined\"==typeof requestAnimationFrame?setTimeout:function(t){const n=()=>{clearTimeout(e);cancelAnimationFrame(i);t()},e=setTimeout(n,35),i=requestAnimationFrame(n)},Mn=t=>{queueMicrotask(()=>{queueMicrotask(t)})};function Fn(){en(()=>{let t;while(t=Un.shift())xn.call(t)})}function Rn(){if(1===Un.push(this))(n.requestAnimationFrame||Dn)(Fn)}function Wn(){en(()=>{let t;while(t=En.shift())xn.call(t)})}function On(){if(1===En.push(this))(n.requestAnimationFrame||Mn)(Wn)}function Ln(t){const n=ct(t);n.current=t;ft(()=>wn((function(){this.N=Rn;return n.current()})),[])}export{x as Component,w as Fragment,Xt as Link,Yt as Route,Qt as Router,cn as Signal,en as batch,B as cloneElement,yn as computed,K as createContext,g as createElement,k as createRef,wn as effect,$t as exec,Vt as getCurrentUrl,g as h,At as html,V as hydrate,i as isValidElement,n as options,j as render,Bt as route,an as signal,H as toChildArray,_n as untracked,pt as useCallback,Tn as useComputed,dt as useContext,vt as useDebugValue,ft as useEffect,yt as useErrorBoundary,mt as useId,at as useImperativeHandle,st as useLayoutEffect,ht as useMemo,lt as useReducer,ct as useRef,jt as useRouter,$n as useSignal,Ln as useSignalEffect,ut as useState};"
  },
  {
    "path": "tutorials/mqtt/mqtt-dashboard/dashboard/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" class=\"h-full bg-white\">\n  <head>\n    <title></title>\n    <meta charset=\"utf-8\" />\n    <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke-width='1.5' stroke='currentColor'> <path stroke-linecap='round' stroke-linejoin='round' d='M14.857 17.082a23.848 23.848 0 005.454-1.31A8.967 8.967 0 0118 9.75v-.7V9A6 6 0 006 9v.75a8.967 8.967 0 01-2.312 6.022c1.733.64 3.56 1.085 5.455 1.31m5.714 0a24.255 24.255 0 01-5.714 0m5.714 0a3 3 0 11-5.714 0' /> </svg>\" />\n    <script src=\"https://cdn.tailwindcss.com\"></script>\n    <script src=\"https://unpkg.com/mqtt/dist/mqtt.min.js\"></script>\n  </head>\n  <body class=\"h-full\"></body>\n  <script type=\"module\" src=\"main.js\"></script>\n</html>\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-dashboard/dashboard/main.js",
    "content": "'use strict';\nimport {h, html, render, useEffect, useRef, useSignal} from './bundle.js';\n\nconst DefaultTopic = 'mg_mqtt_dashboard';\nconst DefaultUrl = location.protocol == 'https:'\n  ? 'wss://broker.hivemq.com:8884/mqtt'\n  : 'ws://broker.hivemq.com:8000/mqtt';\n// const Delay = (ms, val) => new Promise(resolve => setTimeout(resolve, ms, val));\n// const handleFetchError = r => r.ok || alert(`Error: ${r.statusText}`);\nconst LabelClass = 'text-sm truncate font-medium my-auto whitespace-nowrap';\nconst BadgeClass = 'flex-inline text-sm rounded-md rounded px-2 py-0.5 ring-1 ring-inset';\nconst InputClass = 'font-normal text-sm rounded w-full flex-1 py-0.5 px-2 text-gray-700 placeholder:text-gray-400 focus:outline-none disabled:cursor-not-allowed disabled:bg-gray-100 disabled:text-gray-500 rounded border';\nconst TitleClass = 'font-semibold';\nconst Colors = {\n  green: 'bg-green-100 text-green-900 ring-green-300',\n  yellow: 'bg-yellow-100 text-yellow-900 ring-yellow-300',\n  info: 'bg-zinc-100 text-zinc-900 ring-zinc-300',\n  red: 'bg-red-100 text-red-900 ring-red-300',\n};\n\nlet MqttClient;\n\nconst Help = () => html`\n<div class=\"p-2 w-96 text-slate-600 bg-amber-100 overflow-auto text-sm\">\n  <div class=\"py-2\">This is a simple demonstration of the functional device dashboard\n    that manages a fleet of devices via an MQTT server. Source code\n    is <a class=\"text-blue-600\" href=\"https://github.com/cesanta/mongoose/tree/master/tutorials/mqtt/mqtt-dashboard\">available on GitHub<//>.\n  <//>\n  <div class=\"py-2\">\n  For the sake of simplicity, this dashboard does not implement authentication.\n  No external storage is used either to keep device list: for that, retained\n  MQTT messages are utilised. When a device goes online, it publishes its\n  state to the {root_topic}/{device_id}/status topic\n  - LED status and firmware version.\n  <//>\n  <div class=\"py-2\">\n  The last will message triggers\n  the \"offline\" message to the same topic. This is how this web page\n  is able to track online/offline status of devices.\n  <img src=\"mqtt.svg\" alt=\"diagram\" />\n  <//>\n  <div class=\"py-1\">\n  See developer console for the list of MQTT messages exchanged with\n  the MQTT server.\n  <//>\n<//>`;\n\nexport function Button({title, onclick, disabled, extraClass, ref, colors}) {\n  const sigSpin = useSignal(false);\n  const cb = function(ev) {\n    const res = onclick ? onclick() : null;\n    if (res && typeof (res.catch) === 'function') {\n      sigSpin.value = true;\n      res.catch(() => false).then(() => sigSpin.value = false);\n    }\n  };\n  if (!colors) colors = 'bg-blue-600 hover:bg-blue-500 disabled:bg-blue-400';\n  return html`\n<button type=\"button\" class=\"inline-flex justify-center items-center gap-2 rounded px-2.5 py-0.5 text-sm font-semibold text-white shadow-sm ${colors} ${extraClass} ${sigSpin.value ? 'animate-pulse' : ''}\"\n  ref=${ref} onclick=${cb} disabled=${disabled || sigSpin.value} >\n  ${title}\n<//>`\n};\n\nfunction Toggle({value, onclick, disabled}) {\n  const bg = !!value ? 'bg-blue-600' : 'bg-gray-200';\n  const tr = !!value ? 'translate-x-5' : 'translate-x-0';\n  return html`\n<button type=\"button\" onclick=${onclick} disabled=${disabled}\n  class=\"${bg} inline-flex h-6 w-11 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none focus:ring-0 ring-0\"\n  role=\"switch\" aria-checked=${!!value}>\n  <span aria-hidden=\"true\" class=\"${tr} pointer-events-none inline-block h-5 w-5 transform rounded-full bg-white shadow ring-0 focus:ring-0 transition duration-200 ease-in-out\"></span>\n</button>`;\n};\n\nfunction Header({sigTopic, sigUrl, connected}) {\n  const forbiddenChars = ['$', '*', '+', '#', '/'];\n  const onClick = () => {\n    const isValidTopic = val => !forbiddenChars.some(char => val.includes(char));\n    if (isValidTopic(topic)) {\n      localStorage.setItem('topic', topic)\n      sigTopic.value = topic;\n      window.location.reload();\n    } else {\n      setSaveResult('Error: The topic cannot contain these characters: ' + forbiddenChars);\n    }\n  };\n\n  return html`\n    <div class=\"py-2 bg-slate-700 text-slate-50\">\n      <div class=\"flex px-4\">\n        <div class=\"flex grow gap-4\">\n          <h1 class=\"text-2xl font-semibold\">IoT Fleet Management Dashboard</h1>\n        <//>\n        <div class=\"flex gap-2 items-center\">\n          <div class=\"flex w-96 align-center justify-between gap-2\">\n            <span class=${LabelClass}>MQTT Server<//>\n            <input disabled=${!connected} value=${sigUrl.value}\n              onchange=${ev => sigUrl.value = ev.target.value} class=${InputClass} />\n          <//>\n          <div class=\"flex w-64 align-center justify-between gap-2\">\n            <span class=${LabelClass}>Root Topic<//>\n            <input disabled=${!connected} value=${sigTopic.value}\n              onchange=${ev => sigTopic.value = ev.target.value} class=${InputClass} />\n          <//>\n          <${Button} extraClass=\"w-32\" onclick=${onClick} title=${connected ? 'Disconnect' : 'Connect'} />\n        <//>\n      <//>\n    <//>`;\n};\n\nfunction Sidebar({devices, onclick}) {\n  const Td = props => html`\n    <td class=\"whitespace-nowrap border-b py-2 px-4 pr-3 text-sm text-slate-700\">${props.text}</td>`;\n\n  const Device = ({d}) => html`\n    <div class=\"hover:bg-stone-100 cursor-pointer flex gap-3 px-4 py-2 justify-between\"\n        onclick=${ev => onclick(d.id)}>\n      <span>${d.id}</span>\n      <span class=\"${BadgeClass} ${d.online ? Colors.green : Colors.red} w-16 text-center\"> ${d.online ? 'online' : 'offline'} <//>\n    <//>`;\n\n  return html`\n    <div class=\"overflow-auto divide-y\">\n      <div class=\"${TitleClass} flex items-center px-4 py-2 text-slate-400\">\n        Device List\n      <//>\n      ${(devices ? devices : []).map(d => h(Device, {d}))}\n    <//>`;\n};\n\nexport function File({accept, fn, ...rest}) {\n  const btn = useRef(null);\n  const input = useRef(null);\n\n  const oncancel = function(ev) { input.resolve(); input.resolve = null; };\n  const onchange = function(ev) {\n    if (!ev.target.files[0]) { input.resolve(); input.resolve = null; return; }\n    const f = ev.target.files[0];\n    const reader = new FileReader();\n    reader.readAsArrayBuffer(f);\n    reader.onload = function() {\n      fn && fn(reader.result, f.type).then(() => {\n        input.resolve();\n      }).finally(() => {\n        input.resolve = null;\n      });\n    };\n    btn.current && btn.current.base.click();\n    ev.target.value = '';\n    ev.preventDefault();\n  };\n  const onclick = function() {\n    if (!input.fn) input.current.click();\n    return new Promise(resolve => { input.resolve = resolve; });\n  };\n\n  return html`\n<span>\n  <input style=\"display:none;\" type=\"file\" ref=${input} oncancel=${oncancel} onchange=${onchange} accept=${accept} />\n  <${Button} onclick=${onclick} ref=${btn} ...${rest} />\n<//>`;\n};\n\nfunction arrayBufferToBase64Async(buffer) {\n  return new Promise((resolve, reject) => {\n    const blob = new Blob([buffer]);\n    const reader = new FileReader();\n    reader.onload = () => {\n      const dataUrl = reader.result; // reader.result is like \"data:application/octet-stream;base64,AAAA...\"\n      resolve(dataUrl.split(\",\", 2)[1]);\n    };\n    reader.onerror = reject;\n    reader.readAsDataURL(blob);\n  });\n}\n\nfunction FirmwareUpdatePanel({device, rpc, connected}) {\n\n  const fn = function (fileData) {\n    // Split file in chunks\n    let chunkSize = 4096, offset = 0;\n    const chunks = Array.from({ length: Math.ceil(fileData.byteLength / chunkSize) }, (_, i) =>\n      fileData.slice(i * chunkSize, i * chunkSize + chunkSize)\n    );\n    function next(resolve, reject) {\n      const chunk = chunks.shift();\n      if (chunks.length == 0)  resolve();\n      return arrayBufferToBase64Async(chunk)\n        .then(encoded => rpc('ota.upload', {\n          offset: offset,\n          total: fileData.byteLength,\n          chunk: encoded,\n        }))\n        .then(response => {\n          if (response.result == 'ok') {\n            next(resolve, reject);\n            offset += chunkSize;\n          } else {\n            reject();\n          }\n        });\n    };\n    return new Promise((resolve, reject) => next(resolve, reject));\n  };\n\n  return html`\n<div class=\"divide-y border rounded bg-white w-72\">\n  <div class=\"px-4 py-2 flex justify-between items-center rounded\">\n    <span class=\"${TitleClass}\">Firmware Update<//>\n  <//>\n  <div class=\"p-4 flex flex-col gap-1\">\n    <div class=\"flex justify-between align-center gap-2\">\n      <div class=\"${LabelClass}\">Current firmware version<//>\n      <div class=\"text-bold\">${device.firmware_version || '??'}<//>\n    <//>\n\n    <div class=\"flex justify-between align-center gap-2\">\n      <div class=\"${LabelClass}\">Upload new firmware<//>\n      <${File} title=\"...\" disabled=${!device.online || !connected} fn=${fn} />\n    <//>\n  <//>\n<//>`;\n};\n\nfunction LedControlPanel({device, rpc, connected}) {\n  const ontoggle = () => rpc('state.set', {led_status: !device.led_status});\n\n  return html`\n<div class=\"divide-y border rounded bg-white xbg-slate-100 my-y w-64\">\n  <div class=\"px-4 py-2 flex justify-between items-center rounded ${TitleClass}\">\n    <div class=\"flex gap-2 items-center\">LED Control Panel<//>\n  <//>\n  <div class=\"p-4 flex justify-between align-center gap-2\">\n    <div class=\"${LabelClass}\">Toggle LED<//>\n    <${Toggle} onclick=${ontoggle} disabled=${!device.online || !connected} value=${device.led_status} />\n  <//>\n<//> `;\n};\n\nfunction DeviceDashboard({device, rpc, connected}) {\n  // To delete device, set an empty retained message\n  const onforget = function(ev) {\n    MqttClient.publish(device.topic, '', {retain: true});\n    location.reload();\n  };\n\n  if (!device) {\n    return html`\n    <div class=\"flex grow text-gray-400 justify-center items-center text-xl h-full\">\n      No device selected. Click on a device on a sidebar\n    <//>`;\n  }\n\n  return html`\n  <div class=\"p-3 flex flex-col gap-2\">\n    <div class=\"text-xl flex items-center gap-3\">\n      <span class=\"text-slate-400\">Device ${device.id}<//>\n      <${Button} title=\"Forget this device\" onclick=${onforget}/>\n    <//>\n    <div class=\"flex gap-2\">\n      <${LedControlPanel} device=${device} rpc=${rpc} connected=${connected} />\n      <${FirmwareUpdatePanel} device=${device} rpc=${rpc} connected=${connected} />\n    <//>\n  <//>`;\n}\n\nconst App = function() {\n  const sigDevices = useSignal([]);\n  const sigCurrentDevID = useSignal(localStorage.getItem('currentDevID') || '');\n  const sigUrl = useSignal(localStorage.getItem('url') || DefaultUrl);\n  const sigTopic = useSignal(localStorage.getItem('topic') || DefaultTopic);\n  const sigError = useSignal(null);\n  const sigLoading = useSignal(true);\n  const sigConnected = useSignal(false);\n  const responseHandlers = useRef({});\n\n  const getDeviceByID = (deviceID) => sigDevices.value.find(d => d.id === deviceID);\n\n\n  function addResponseHandler(correlationId, handler) {\n    responseHandlers[correlationId] = handler;\n  }\n\n  function removeResponseHandler(correlationId) {\n    delete responseHandlers[correlationId];\n  }\n\n  const onRefresh = () => window.location.reload();\n\n  const initConn = () => {\n    MqttClient = mqtt.connect(sigUrl.value, {connectTimeout: 5000, reconnectPeriod: 0});\n\n    MqttClient.on('connect', () => {\n      //console.log('Connected to the broker');\n      sigLoading.value = false;\n      sigError.value = null; // Reset error state upon successful connection\n      sigConnected.value = true;\n\n      const statusTopic = sigTopic.value + '/+/status'\n      const txTopic = sigTopic.value + '/+/tx'\n\n      const subscribe = (topic) => {\n        MqttClient.subscribe(topic, (err) => {\n          if (err) {\n            console.error('Error subscribing to topic:', err);\n            setError('Error subscribing to topic');\n          } else {\n            //console.log('Successfully subscribed to ', topic);\n          }\n        });\n      };\n\n      subscribe(statusTopic);\n      subscribe(txTopic);\n    });\n\n    MqttClient.on('message', (topic, message) => {\n      console.log(`Received message from ${topic}: ${message.toString()}`);\n      if (message.length == 0) return;\n      let response;\n      try {\n        response = JSON.parse(message.toString());\n      } catch (err) {\n        console.error(err);\n        return;\n      }\n\n      if (topic.endsWith('/status')) {\n        if (!response.params) {\n          console.error('Invalid response');\n          return;\n        }\n        let device = Object.assign(response.params, {topic: topic, id: topic.split('/')[1]});\n        device.online = response.params.status === 'online';\n        const devices = sigDevices.value.filter(d => d.id !== device.id);\n        devices.push(device);\n        devices.sort((a, b) => a.online && !b.online ? -1\n          :!a.online && b.online ? 1\n          : a.id < b.id ? -1 : 1);\n        sigDevices.value = devices;\n      } else if (topic.endsWith('/tx')) {\n        if (!response.id) {\n          console.error('Invalid response');\n          return;\n        }\n        const handler = responseHandlers[response.id];\n        if (handler) {\n          handler(response);\n          removeResponseHandler(response.id);\n        }\n      }\n    });\n\n    MqttClient.on('error', (err) => {\n      console.error('Connection error:', err);\n      sigError.value = 'Connection cannot be established.';\n    });\n\n    MqttClient.on('close', () => {\n      if (!sigConnected.value) {\n        console.error('Failed to connect to the broker.');\n        sigError.value = 'Connection cannot be established.';\n        sigLoading.value = false;\n      }\n    });\n  };\n\n  useEffect(() => initConn(), []);\n\n  const handlePublish = (methodName, parameters, timeout = 5000) => {\n    return new Promise((resolve, reject) => {\n      const randomIdGenerator = function(length) {\n        return Math.random().toString(36).substring(2, length + 2);\n      };\n      const randomID = randomIdGenerator(40);\n      const timeoutID = setTimeout(() => {\n        removeResponseHandler(randomID);\n        reject(new Error('Request timed out'));\n      }, timeout);\n\n      addResponseHandler(randomID, (messageData) => {\n        clearTimeout(timeoutID);\n        resolve(messageData);\n      });\n\n      if (sigCurrentDevID.value) {\n        const rxTopic = sigTopic.value + `/${sigCurrentDevID.value}/rx`;\n        const rpcPayload = {method: methodName, id: randomID};\n        if (parameters) {\n          rpcPayload.params = parameters;\n        }\n        console.log(`Sending message to ${rxTopic}: ${JSON.stringify(rpcPayload)}`);\n        MqttClient.publish(rxTopic, JSON.stringify(rpcPayload));\n      }\n    });\n  };\n\n  const onDeviceClick = (deviceID) => {\n    const device = getDeviceByID(deviceID);\n    if (device) {\n      sigCurrentDevID.value = device.id;\n      localStorage.setItem('currentDevID', device.id);\n    }\n  };\n\n  if (sigError.value) {\n    return html`\n    <div class=\"min-h-screen bg-slate-100 flex flex-col\">\n      <${Header} sigTopic=${sigTopic} sigUrl=${sigUrl} />\n      <div class=\"flex-grow flex items-center justify-center\">\n        <div class=\"bg-slate-300 p-8 rounded-lg shadow-md w-full max-w-md\">\n          <h1 class=\"text-2xl font-bold text-gray-700 mb-4 text-center\">Connection Error</h1>\n          <p class=\"text-gray-600 text-center mb-4\">\n            Unable to connect to the MQTT broker.\n          </p>\n          <div class=\"text-center relative\">\n            <${Button} title=\"Retry\" onclick=${onRefresh} class=\"absolute top-4 right-4\" />\n          </div>\n        </div>\n      </div>\n    </div>`;\n  }\n\n  return html`\n  <div class=\"h-full flex flex-col\">\n    <${Header} sigTopic=${sigTopic} sigUrl=${sigUrl} connected=${sigConnected.value} />\n    <div class=\"flex grow overflow-auto\">\n      <div class=\"w-64 overflow-auto\">\n        <${Sidebar} devices=${sigDevices.value} onclick=${onDeviceClick} />\n      <//>\n      <div class=\"grow bg-gray-200\">\n        <${DeviceDashboard}\n          device=${getDeviceByID(sigCurrentDevID.value)} connected=${sigConnected.value}\n          rpc=${handlePublish} />\n      <//>\n      <${Help} />\n    <//>\n  <//>`;\n};\n\nwindow.onload = () => render(h(App), document.body);\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-dashboard/dashboard/tailwind.config.js",
    "content": "module.exports = {\n  content: ['./*.{html,js}'],\n  xplugins: [ 'tailwindcss', 'xautoprefixer' ],\n  corePlugins: {outline: false},\n  theme: {\n    extend: {},\n    fontFamily: {\n      sans:\n      [\n        \"Inter var, Helvetica, sans-serif\", {\n          fontFeatureSettings: '\"cv11\", \"ss01\"',\n          fontVariationSettings: '\"opsz\" 32',\n        }\n      ]\n    }\n  }\n}\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-dashboard/device/Makefile",
    "content": "PROG ?= ./example     # Program we are building\nDELETE ?= rm -rf      # Command to remove files\nOUT ?= -o $(PROG)     # Compiler argument for output file\nSOURCES = main.c net.c hal.c mongoose.c # Source code files\nCFLAGS ?= -W -Wall -Wextra -g -I.       # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += -DMG_ENABLE_LINES=1\n\nifeq ($(OS),Windows_NT)   # Windows settings for MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feexample.exe\n  PROG = example.exe            # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against the Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\nendif\n\nall: $(PROG)\n\t$(RUN) $(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nclean:\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-dashboard/device/README.md",
    "content": ""
  },
  {
    "path": "tutorials/mqtt/mqtt-dashboard/device/hal.c",
    "content": "#include \"hal.h\"\n\n#define MAX_PIN_NO 144\n\n// Mocked device pins\nstatic bool s_pins[MAX_PIN_NO];\n\nbool gpio_write(uint16_t pin, bool status) {\n  bool ok = false;\n  if (pin < MAX_PIN_NO) {\n    s_pins[pin] = status;\n    ok = true;\n  }\n  return ok;\n}\n\nbool gpio_read(uint16_t pin) {\n  return (pin < MAX_PIN_NO) ? s_pins[pin] : false;\n}\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-dashboard/device/hal.h",
    "content": "#pragma once\n\n#include \"mongoose.h\"\n\nbool gpio_write(uint16_t pin, bool status);\nbool gpio_read(uint16_t pin);\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-dashboard/device/main.c",
    "content": "// Copyright (c) 2023 Cesanta Software Limited\n// All rights reserved\n\n#include \"net.h\"\n#include \"hal.h\"\n\n// Handle interrupts, like Ctrl-C\nchar *g_firmware_version = \"1.0.0\";\nstatic int s_signo;\nstatic void signal_handler(int signo) {\n  s_signo = signo;\n}\n\nint main(int argc, char *argv[]) {\n  struct mg_mgr mgr;\n  int i;\n\n  // Parse command-line flags\n  for (i = 1; i < argc; i++) {\n    if (strcmp(argv[i], \"-u\") == 0 && argv[i + 1] != NULL) {\n      g_mqtt_server_url = argv[++i];\n    } else if (strcmp(argv[i], \"-i\") == 0 && argv[i + 1] != NULL) {\n      g_device_id = strdup(argv[++i]);\n    } else if (strcmp(argv[i], \"-t\") == 0 && argv[i + 1] != NULL) {\n      g_root_topic = argv[++i];\n    } else if (strcmp(argv[i], \"-f\") == 0 && argv[i + 1] != NULL) {\n      g_firmware_version = argv[++i];\n    } else if (strcmp(argv[i], \"-v\") == 0 && argv[i + 1] != NULL) {\n      mg_log_set(atoi(argv[++i]));\n    } else {\n      MG_ERROR((\"Unknown option: %s. Usage:\", argv[i]));\n      MG_ERROR(\n          (\"%s [-u mqtt://SERVER:PORT] [-i DEVICE_ID] [-t TOPIC_NAME] [-v \"\n           \"DEBUG_LEVEL] [-f FIRMWARE_VERSION]\",\n           argv[0], argv[i]));\n      return 1;\n    }\n  }\n\n  signal(SIGINT, signal_handler);   // Setup signal handlers - exist event\n  signal(SIGTERM, signal_handler);  // manager loop on SIGINT and SIGTERM\n\n  mg_log_set(MG_LL_DEBUG);  // Set debug log level\n  mg_mgr_init(&mgr);\n\n  web_init(&mgr);\n  while (s_signo == 0) {\n    mg_mgr_poll(&mgr, 50);\n  }\n\n  web_free();\n  mg_mgr_free(&mgr);\n  MG_INFO((\"Exiting on signal %d\", s_signo));\n\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-dashboard/device/net.c",
    "content": "// Copyright (c) 2023 Cesanta Software Limited\n// All rights reserved\n\n#include \"net.h\"\n#include <string.h>\n#include \"mongoose.h\"\n\nchar *g_mqtt_server_url = MQTT_SERVER_URL;\nchar *g_root_topic = MQTT_ROOT_TOPIC;\nchar *g_device_id;\n\nstatic uint8_t s_qos = 1;             // MQTT QoS\nstatic struct mg_connection *s_conn;  // MQTT Client connection\nstatic struct mg_rpc *s_rpc = NULL;   // List of registered RPC methods\n\nstruct device_state {\n  bool led_status;\n  char firmware_version[20];\n};\n\nstatic struct device_state s_device_state;\n\n// Device ID generation function. Create an ID that is unique\n// for a given device, and does not change between device restarts.\nstatic void set_device_id(void) {\n  char buf[15] = \"\";\n\n#ifdef _WIN32\n  unsigned long serial = 0;\n  if (GetVolumeInformationA(\"c:\\\\\", NULL, 0, &serial, NULL, NULL, NULL, 0)) {\n    mg_snprintf(buf, sizeof(buf), \"%lx\", serial);\n  }\n#elif defined(__APPLE__)\n  FILE *fp = popen(\n      \"ioreg -l | grep IOPlatformSerialNumber | cut -d'\\\"' -f4 | tr -d $'\\n'\",\n      \"r\");\n  if (fp != NULL) {\n    fread(buf, 1, sizeof(buf), fp);\n    fclose(fp);\n  }\n#elif defined(__linux__)\n  struct mg_str id = mg_file_read(&mg_fs_posix, \"/etc/machine-id\");\n  if (id.buf != NULL) {\n    mg_snprintf(buf, sizeof(buf), \"%s\", id.buf);\n    mg_free((void *) id.buf);\n  }\n#endif\n\n  if (buf[0] == '\\0') mg_snprintf(buf, sizeof(buf), \"%s\", \"MyDeviceID\");\n\n  buf[sizeof(buf) - 1] = '\\0';\n  g_device_id = strdup(buf);\n}\n\nstatic void publish_status(struct mg_connection *c) {\n  char topic[100];\n  struct mg_mqtt_opts pub_opts;\n  struct mg_iobuf io = {0, 0, 0, 512};\n\n  // Print JSON notification into the io buffer\n  mg_xprintf(\n      mg_pfn_iobuf, &io,\n      \"{%m:%m,%m:{%m:%m,%m:%s,%m:%m}}\",                                    //\n      MG_ESC(\"method\"), MG_ESC(\"status.notify\"), MG_ESC(\"params\"),         //\n      MG_ESC(\"status\"), MG_ESC(\"online\"),                                  //\n      MG_ESC(\"led_status\"), s_device_state.led_status ? \"true\" : \"false\",  //\n      MG_ESC(\"firmware_version\"), MG_ESC(s_device_state.firmware_version));\n\n  memset(&pub_opts, 0, sizeof(pub_opts));\n  mg_snprintf(topic, sizeof(topic), \"%s/%s/status\", g_root_topic, g_device_id);\n  pub_opts.topic = mg_str(topic);\n  pub_opts.message = mg_str_n((char *) io.buf, io.len);\n  pub_opts.qos = s_qos;\n  pub_opts.retain = true;\n  mg_mqtt_pub(c, &pub_opts);\n  mg_iobuf_free(&io);\n}\n\nstatic void publish_response(struct mg_connection *c, char *buf, size_t len) {\n  struct mg_mqtt_opts pub_opts;\n  char topic[100];\n  mg_snprintf(topic, sizeof(topic), \"%s/%s/tx\", g_root_topic, g_device_id);\n  memset(&pub_opts, 0, sizeof(pub_opts));\n  pub_opts.topic = mg_str(topic);\n  pub_opts.message = mg_str_n(buf, len);\n  pub_opts.qos = s_qos;\n  mg_mqtt_pub(c, &pub_opts);\n}\n\nstatic void subscribe(struct mg_connection *c) {\n  char *rx_topic = mg_mprintf(\"%s/%s/rx\", g_root_topic, g_device_id);\n  struct mg_str subt = mg_str(rx_topic);\n  struct mg_mqtt_opts sub_opts;\n  memset(&sub_opts, 0, sizeof(sub_opts));\n  sub_opts.topic = subt;\n  sub_opts.qos = s_qos;\n  mg_mqtt_sub(c, &sub_opts);\n  MG_INFO((\"%lu SUBSCRIBED to %.*s\", c->id, (int) subt.len, subt.buf));\n  mg_free(rx_topic);\n}\n\nstatic void rpc_state_set(struct mg_rpc_req *r) {\n  mg_json_get_bool(r->frame, \"$.params.led_status\", &s_device_state.led_status);\n  mg_rpc_ok(r, \"true\");\n}\n\nstatic void rpc_ota_upload(struct mg_rpc_req *r) {\n  long ofs = mg_json_get_long(r->frame, \"$.params.offset\", -1);\n  long tot = mg_json_get_long(r->frame, \"$.params.total\", -1);\n  int len = 0;\n  char *buf = mg_json_get_b64(r->frame, \"$.params.chunk\", &len);\n  if (buf == NULL) {\n    mg_rpc_err(r, 1, \"Error processing the binary chunk.\");\n  } else {\n    if (ofs < 0 || tot < 0) {\n      mg_rpc_err(r, 1, \"offset and total not set\");\n    } else if (ofs == 0 && mg_ota_begin((size_t) tot) == false) {\n      mg_rpc_err(r, 1, \"mg_ota_begin(%ld) failed\\n\", tot);\n    } else if (len > 0 && mg_ota_write(buf, len) == false) {\n      mg_rpc_err(r, 1, \"mg_ota_write(%lu) @%ld failed\\n\", len, ofs);\n      mg_ota_end();\n    } else if (len == 0 && mg_ota_end() == false) {\n      mg_rpc_err(r, 1, \"mg_ota_end() failed\\n\", tot);\n    } else {\n      mg_rpc_ok(r, \"%m\", MG_ESC(\"ok\"));\n    }\n    mg_free(buf);\n  }\n}\n\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_OPEN) {\n    MG_INFO((\"%lu CREATED\", c->id));\n    // c->is_hexdumping = 1;\n  } else if (ev == MG_EV_CONNECT) {\n    MG_INFO((\"Device %s is connected\", g_device_id));\n  } else if (ev == MG_EV_ERROR) {\n    // On error, log error message\n    MG_ERROR((\"%lu ERROR %s\", c->id, (char *) ev_data));\n  } else if (ev == MG_EV_MQTT_OPEN) {\n    // MQTT connect is successful\n    MG_INFO((\"%lu CONNECTED to %s\", c->id, g_mqtt_server_url));\n    subscribe(c);\n    publish_status(c);\n  } else if (ev == MG_EV_MQTT_MSG) {\n    // When we get echo response, print it\n    struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;\n    struct mg_iobuf io = {0, 0, 0, 512};\n    struct mg_rpc_req r = {&s_rpc, NULL, mg_pfn_iobuf,\n                           &io,    NULL, {mm->data.buf, mm->data.len}};\n    size_t clipped_len = mm->data.len > 512 ? 512 : mm->data.len;\n    MG_INFO((\"%lu RECEIVED %.*s <- %.*s\", c->id, clipped_len, mm->data.buf,\n             mm->topic.len, mm->topic.buf));\n    mg_rpc_process(&r);\n    if (io.buf) {\n      publish_response(c, (char *) io.buf, io.len);\n      publish_status(c);\n    }\n    mg_iobuf_free(&io);\n  } else if (ev == MG_EV_CLOSE) {\n    MG_INFO((\"%lu CLOSED\", c->id));\n    s_conn = NULL;  // Mark that we're closed\n  }\n}\n\n// Timer function - recreate client connection if it is closed\nstatic void timer_reconnect(void *arg) {\n  struct mg_mgr *mgr = (struct mg_mgr *) arg;\n  if (s_conn == NULL) {\n    struct mg_mqtt_opts opts;\n    char topic[100], message[100];\n    mg_snprintf(topic, sizeof(topic), \"%s/%s/status\", g_root_topic,\n                g_device_id);\n    mg_snprintf(message, sizeof(message), \"{%m:%m,%m:{%m:%m}}\",\n                MG_ESC(\"method\"), MG_ESC(\"status.notify\"), MG_ESC(\"params\"),\n                MG_ESC(\"status\"), MG_ESC(\"offline\"));\n    memset(&opts, 0, sizeof(opts));\n    opts.clean = true;\n    opts.qos = s_qos;\n    opts.topic = mg_str(topic);\n    opts.version = 4;\n    opts.keepalive = MQTT_KEEPALIVE_SEC;\n    opts.retain = true;\n    opts.message = mg_str(message);\n    s_conn = mg_mqtt_connect(mgr, g_mqtt_server_url, &opts, fn, NULL);\n  }\n}\n\nstatic void timer_ping(void *arg) {\n  mg_mqtt_send_header(s_conn, MQTT_CMD_PINGREQ, 0, 0);\n  (void) arg;\n}\n\nstatic void timer_sntp(void *param) {  // SNTP timer function. Sync up time\n  static uint64_t hourly_timer = 0;\n  uint64_t t1 = mg_now(), t2 = mg_millis();\n  if (t1 < t2 + 3600 || mg_timer_expired(&hourly_timer, 3600000, t2)) {\n    mg_sntp_connect(param, \"udp://time.google.com:123\", NULL, NULL);\n  }\n}\n\nvoid web_init(struct mg_mgr *mgr) {\n  int ping_interval_ms = MQTT_KEEPALIVE_SEC * 1000 - 500;\n  int flags = MG_TIMER_REPEAT;\n  set_device_id();\n\n  // Initialize device state\n  s_device_state.led_status = false;\n  mg_snprintf(s_device_state.firmware_version,\n              sizeof(s_device_state.firmware_version), \"%s\",\n              g_firmware_version);\n\n  // Configure JSON-RPC functions we're going to handle\n  mg_rpc_add(&s_rpc, mg_str(\"state.set\"), rpc_state_set, NULL);\n  mg_rpc_add(&s_rpc, mg_str(\"ota.upload\"), rpc_ota_upload, NULL);\n\n  mg_timer_add(mgr, 3000, flags | MG_TIMER_RUN_NOW, timer_reconnect, mgr);\n  mg_timer_add(mgr, ping_interval_ms, flags, timer_ping, mgr);\n  mg_timer_add(mgr, 2000, flags, timer_sntp, mgr);\n}\n\nvoid web_free(void) {\n  mg_rpc_del(&s_rpc, NULL);  // Deallocate RPC handlers\n  free(g_device_id);\n}\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-dashboard/device/net.h",
    "content": "// Copyright (c) 2023 Cesanta Software Limited\n// All rights reserved\n#pragma once\n\n#include \"mongoose.h\"\n#include \"hal.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define MQTT_DASHBOARD 1\n#define MQTT_KEEPALIVE_SEC 60\n#define MQTT_SERVER_URL \"mqtt://broker.hivemq.com:1883\"\n#define MQTT_ROOT_TOPIC \"mg_mqtt_dashboard\"\n\nextern char *g_mqtt_server_url;\nextern char *g_device_id;\nextern char *g_root_topic;\nextern char *g_firmware_version;\n\nvoid web_init(struct mg_mgr *mgr);\nvoid web_free(void);\n\n#ifdef __cplusplus\n}\n#endif\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-over-ws-client/Makefile",
    "content": "PROG ?= example                   # Program we are building\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c  packed_fs.c      # Source code files, packed_fs.c contains ca.pem, which contains CA certs for TLS\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += -DMG_ENABLE_LINES=1 -DMG_ENABLE_PACKED_FS=1\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= example.exe           # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\n  MAKE += WINDOWS=1 CC=$(CC)\nendif\n\nall: $(PROG)              # Default target. Build and run program\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)       # Build program from sources\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nclean:                    # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM mbedtls\n\n# see https://mongoose.ws/tutorials/tls/#how-to-build for TLS build options\n\nmbedtls:                  # Pull and build mbedTLS library\n\tgit clone --depth 1 -b v2.28.2 https://github.com/mbed-tls/mbedtls $@\n\t$(MAKE) -C mbedtls/library\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-over-ws-client/README.md",
    "content": "See detailed tutorial at https://mongoose.ws/tutorials/mqtt/mqtt-over-ws-client/\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-over-ws-client/main.c",
    "content": "// Copyright (c) 2020 Cesanta Software Limited\n// All rights reserved\n//\n// Example MQTT client. It performs the following steps:\n//    1. Connects to the MQTT server specified by `s_url` variable\n//    2. When connected, subscribes to the topic `s_topic`\n//    3. Publishes message `hello` to the `s_topic`\n//    4. Receives that message back from the subscribed topic and exits\n//\n// To enable SSL/TLS, see https://mongoose.ws/tutorials/tls/#how-to-build\n\n#include \"mongoose.h\"\n\nstatic const char *s_url =\n#if MG_TLS\n    \"wss://broker.hivemq.com:8884/mqtt\";\n#else\n    \"ws://broker.hivemq.com:8000/mqtt\";\n#endif\n\nstatic const char *s_topic = \"mg/test\";\n\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_ERROR) {\n    // On error, log error message\n    MG_ERROR((\"%p %s\", c->fd, (char *) ev_data));\n  } else if (ev == MG_EV_CONNECT) {\n    if (c->is_tls) {\n      struct mg_tls_opts opts = {.ca = mg_unpacked(\"/certs/ca.pem\"),\n                                 .name = mg_url_host(s_url)};\n      mg_tls_init(c, &opts);\n    }\n  } else if (ev == MG_EV_WS_OPEN) {\n    // WS connection established. Perform MQTT login\n    MG_INFO((\"Connected to WS. Logging in to MQTT...\"));\n    struct mg_mqtt_opts opts = {\n        .qos = 1, .topic = mg_str(s_topic), .message = mg_str(\"goodbye\")};\n    size_t len = c->send.len;\n    mg_mqtt_login(c, &opts);\n    mg_ws_wrap(c, c->send.len - len, WEBSOCKET_OP_BINARY);\n    c->is_hexdumping = 1;\n  } else if (ev == MG_EV_WS_MSG) {\n    struct mg_mqtt_message mm;\n    struct mg_ws_message *wm = (struct mg_ws_message *) ev_data;\n    uint8_t version = c->is_mqtt5 ? 5 : 4;\n    MG_INFO((\"GOT %d bytes WS msg\", (int) wm->data.len));\n    while ((mg_mqtt_parse((uint8_t *) wm->data.buf, wm->data.len, version,\n                          &mm)) == MQTT_OK) {\n      switch (mm.cmd) {\n        case MQTT_CMD_CONNACK:\n          mg_call(c, MG_EV_MQTT_OPEN, &mm.ack);\n          if (mm.ack == 0) {\n            struct mg_str topic = mg_str(s_topic), data = mg_str(\"hello\");\n            size_t len = c->send.len;\n            MG_INFO((\"CONNECTED to %s\", s_url));\n            struct mg_mqtt_opts sub_opts;\n            memset(&sub_opts, 0, sizeof(sub_opts));\n            sub_opts.topic = topic;\n            sub_opts.qos = 1;\n            mg_mqtt_sub(c, &sub_opts);\n            len = mg_ws_wrap(c, c->send.len - len, WEBSOCKET_OP_BINARY);\n            MG_INFO((\"SUBSCRIBED to %.*s\", (int) topic.len, topic.buf));\n            struct mg_mqtt_opts pub_opts;\n            memset(&pub_opts, 0, sizeof(pub_opts));\n            pub_opts.topic = topic;\n            pub_opts.message = data;\n            pub_opts.qos = 1, pub_opts.retain = false;\n            mg_mqtt_pub(c, &pub_opts);\n            MG_INFO((\"PUBLISHED %.*s -> %.*s\", (int) data.len, data.buf,\n                     (int) topic.len, topic.buf));\n            len = mg_ws_wrap(c, c->send.len - len, WEBSOCKET_OP_BINARY);\n          } else {\n            MG_ERROR((\"%lu MQTT auth failed, code %d\", c->id, mm.ack));\n            c->is_draining = 1;\n          }\n          break;\n        case MQTT_CMD_PUBLISH: {\n          MG_DEBUG((\"%lu [%.*s] -> [%.*s]\", c->id, (int) mm.topic.len,\n                    mm.topic.buf, (int) mm.data.len, mm.data.buf));\n          MG_INFO((\"RECEIVED %.*s <- %.*s\", (int) mm.data.len, mm.data.buf,\n                   (int) mm.topic.len, mm.topic.buf));\n          c->is_draining = 1;\n          break;\n        }\n      }\n      wm->data.buf += mm.dgram.len;\n      wm->data.len -= mm.dgram.len;\n    }\n  }\n\n  if (ev == MG_EV_ERROR || ev == MG_EV_CLOSE) {\n    *(bool *) c->fn_data = true;  // Signal that we're done\n  }\n}\n\nint main(void) {\n  struct mg_mgr mgr;        // Event manager\n  bool done = false;        // Event handler flips it to true when done\n  mg_mgr_init(&mgr);        // Initialise event manager\n  mg_log_set(MG_LL_DEBUG);  // Set log level\n  mg_ws_connect(&mgr, s_url, fn, &done, \"%s\",  // Create client connection\n                \"Sec-Websocket-Protocol: mqtt\\r\\n\");  // Request MQTT protocol\n  while (done == false) mg_mgr_poll(&mgr, 1000);      // Event loop\n  mg_mgr_free(&mgr);                                  // Finished, cleanup\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-server/Makefile",
    "content": "PROG ?= example                   # Program we are building\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c       # Source code files\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += -DMG_ENABLE_LINES\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= example.exe           # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\nendif\n\nall: $(PROG)              # Default target. Build and run program\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)       # Build program from sources\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nclean:                    # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-server/README.md",
    "content": "See detailed tutorial at https://mongoose.ws/tutorials/mqtt/mqtt-server/\n"
  },
  {
    "path": "tutorials/mqtt/mqtt-server/main.c",
    "content": "// Copyright (c) 2020 Cesanta Software Limited\n// All rights reserved\n//\n// Example MQTT server. Usage:\n//  1. Start this server, type `make`\n//  2. Install mosquitto MQTT client\n//  3. In one terminal, run:   mosquitto_sub -h localhost -t foo -t bar\n//  4. In another, run:        mosquitto_pub -h localhost -t foo -m hi\n\n#include \"mongoose.h\"\n\nstatic const char *s_listen_on = \"mqtt://0.0.0.0:1883\";\n\n// A list of subscription, held in memory\nstruct sub {\n  struct sub *next;\n  struct mg_connection *c;\n  struct mg_str topic;\n  uint8_t qos;\n};\nstatic struct sub *s_subs = NULL;\n\n// Handle interrupts, like Ctrl-C\nstatic int s_signo;\nstatic void signal_handler(int signo) {\n  s_signo = signo;\n}\n\nstatic size_t mg_mqtt_next_topic(struct mg_mqtt_message *msg,\n                                 struct mg_str *topic, uint8_t *qos,\n                                 size_t pos) {\n  unsigned char *buf = (unsigned char *) msg->dgram.buf + pos;\n  size_t new_pos;\n  if (pos >= msg->dgram.len) return 0;\n\n  topic->len = (size_t) (((unsigned) buf[0]) << 8 | buf[1]);\n  topic->buf = (char *) buf + 2;\n  new_pos = pos + 2 + topic->len + (qos == NULL ? 0 : 1);\n  if ((size_t) new_pos > msg->dgram.len) return 0;\n  if (qos != NULL) *qos = buf[2 + topic->len];\n  return new_pos;\n}\n\nsize_t mg_mqtt_next_sub(struct mg_mqtt_message *msg, struct mg_str *topic,\n                        uint8_t *qos, size_t pos) {\n  uint8_t tmp;\n  return mg_mqtt_next_topic(msg, topic, qos == NULL ? &tmp : qos, pos);\n}\n\nsize_t mg_mqtt_next_unsub(struct mg_mqtt_message *msg, struct mg_str *topic,\n                          size_t pos) {\n  return mg_mqtt_next_topic(msg, topic, NULL, pos);\n}\n\n// Event handler function\nstatic void fn(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_MQTT_CMD) {\n    struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;\n    MG_DEBUG((\"cmd %d qos %d\", mm->cmd, mm->qos));\n    switch (mm->cmd) {\n      case MQTT_CMD_CONNECT: {\n        // Client connects\n        if (mm->dgram.len < 9) {\n          mg_error(c, \"Malformed MQTT frame\");\n        } else if (mm->dgram.buf[8] != 4) {\n          mg_error(c, \"Unsupported MQTT version %d\", mm->dgram.buf[8]);\n        } else {\n          uint8_t response[] = {0, 0};\n          mg_mqtt_send_header(c, MQTT_CMD_CONNACK, 0, sizeof(response));\n          mg_send(c, response, sizeof(response));\n        }\n        break;\n      }\n      case MQTT_CMD_SUBSCRIBE: {\n        // Client subscribes\n        size_t pos = 4;  // Initial topic offset, where ID ends\n        uint8_t qos, resp[256];\n        struct mg_str topic;\n        int num_topics = 0;\n        while ((pos = mg_mqtt_next_sub(mm, &topic, &qos, pos)) > 0) {\n          struct sub *sub = (struct sub *)calloc(1, sizeof(*sub));\n          sub->c = c;\n          sub->topic = mg_strdup(topic);\n          sub->qos = qos;\n          LIST_ADD_HEAD(struct sub, &s_subs, sub);\n          MG_INFO(\n              (\"SUB %p [%.*s]\", c->fd, (int) sub->topic.len, sub->topic.buf));\n          // Change '+' to '*' for topic matching using mg_match\n          for (size_t i = 0; i < sub->topic.len; i++) {\n            if (sub->topic.buf[i] == '+') ((char *) sub->topic.buf)[i] = '*';\n          }\n          resp[num_topics++] = qos;\n        }\n        mg_mqtt_send_header(c, MQTT_CMD_SUBACK, 0, num_topics + 2);\n        uint16_t id = mg_htons(mm->id);\n        mg_send(c, &id, 2);\n        mg_send(c, resp, num_topics);\n        break;\n      }\n      case MQTT_CMD_PUBLISH: {\n        // Client published message. Push to all subscribed channels\n        MG_INFO((\"PUB %p [%.*s] -> [%.*s]\", c->fd, (int) mm->data.len,\n                 mm->data.buf, (int) mm->topic.len, mm->topic.buf));\n        for (struct sub *sub = s_subs; sub != NULL; sub = sub->next) {\n          if (mg_match(mm->topic, sub->topic, NULL)) {\n            struct mg_mqtt_opts pub_opts;\n            memset(&pub_opts, 0, sizeof(pub_opts));\n            pub_opts.topic = mm->topic;\n            pub_opts.message = mm->data;\n            pub_opts.qos = 1, pub_opts.retain = false;\n            mg_mqtt_pub(sub->c, &pub_opts);\n          }\n        }\n        break;\n      }\n      case MQTT_CMD_PINGREQ: {\n        // The server must send a PINGRESP packet in response to a PINGREQ packet [MQTT-3.12.4-1]\n        MG_INFO((\"PINGREQ %p -> PINGRESP\", c->fd));\n        mg_mqtt_send_header(c, MQTT_CMD_PINGRESP, 0, 0);\n        break;\n      }\n    }\n  } else if (ev == MG_EV_ACCEPT) {\n    // c->is_hexdumping = 1;\n  } else if (ev == MG_EV_CLOSE) {\n    // Client disconnects. Remove from the subscription list\n    for (struct sub *next, *sub = s_subs; sub != NULL; sub = next) {\n      next = sub->next;\n      if (c != sub->c) continue;\n      MG_INFO((\"UNSUB %p [%.*s]\", c->fd, (int) sub->topic.len, sub->topic.buf));\n      mg_free(sub->topic.buf);\n      LIST_DELETE(struct sub, &s_subs, sub);\n      free(sub);\n    }\n  }\n}\n\nint main(void) {\n  struct mg_mgr mgr;                // Event manager\n  signal(SIGINT, signal_handler);   // Setup signal handlers - exist event\n  signal(SIGTERM, signal_handler);  // manager loop on SIGINT and SIGTERM\n  mg_mgr_init(&mgr);                // Initialise event manager\n  MG_INFO((\"Starting on %s\", s_listen_on));      // Inform that we're starting\n  mg_mqtt_listen(&mgr, s_listen_on, fn, NULL);   // Create MQTT listener\n  while (s_signo == 0) mg_mgr_poll(&mgr, 1000);  // Event loop, 1s timeout\n  mg_mgr_free(&mgr);                             // Cleanup\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/mqtt/ota-over-mqtt/Makefile",
    "content": "PROG ?= example                   # Program we are building\nDELETE = rm -rf                   # Command to remove files\nOUT ?= -o $(PROG)                 # Compiler argument for output file\nSOURCES = main.c mongoose.c       # Source code files, packed_fs.c contains ca.pem, which contains CA certs for TLS\nCFLAGS = -W -Wall -Wextra -g -I.  # Build options\n\n# Mongoose build options. See https://mongoose.ws/documentation/#build-options\nCFLAGS_MONGOOSE += -DMG_ENABLE_LINES=1\nCFLAGS_MONGOOSE += -DMG_TLS=MG_TLS_BUILTIN\n#CFLAGS_MONGOOSE += -DMG_TLS=MG_TLS_OPENSSL -L/opt/homebrew/opt/openssl/lib -I/opt/homebrew/opt/openssl/include -lssl -lcrypto\n#CFLAGS_MONGOOSE += -DMG_TLS=MG_TLS_MBED -L/opt/homebrew/opt/mbedtls/lib -I/opt/homebrew/opt/mbedtls/include -lmbedtls -lmbedcrypto -lmbedx509\n\nifeq ($(OS),Windows_NT)   # Windows settings. Assume MinGW compiler. To use VC: make CC=cl CFLAGS=/MD OUT=/Feprog.exe\n  PROG ?= example.exe           # Use .exe suffix for the binary\n  CC = gcc                      # Use MinGW gcc compiler\n  CFLAGS += -lws2_32            # Link against Winsock library\n  DELETE = cmd /C del /Q /F /S  # Command prompt command to delete files\n  OUT ?= -o $(PROG)             # Build output\nendif\n\nall: $(PROG)              # Default target. Build and run program\n\t$(RUN) ./$(PROG) $(ARGS)\n\n$(PROG): $(SOURCES)       # Build program from sources\n\t$(CC) $(SOURCES) $(CFLAGS) $(CFLAGS_MONGOOSE) $(CFLAGS_EXTRA) $(OUT)\n\nclean:                    # Cleanup. Delete built program and all build artifacts\n\t$(DELETE) $(PROG) *.o *.obj *.exe *.dSYM\n"
  },
  {
    "path": "tutorials/mqtt/ota-over-mqtt/main.c",
    "content": "// Copyright (c) 2013-2026 Cesanta Software Limited\n// All rights reserved\n//\n// This example implements a JSON-RPC server that connects to the MQTT server\n// and expects requests on MQTT_RX_TOPIC, and sends responses to the\n// MQTT_TX_TOPIC. Only a single RPC method is implemented, \"ota.update\",\n// which expects parameters {\"total\": XX, \"offset\": XX, \"chunk\": \"...\"}\n// The rpc_ota_update() function handles those requests and calls Mongoose\n// ota_begin(), ota_write(), ota_end() respectively.\n//\n// Visit https://mongoose.ws/mqtt/ web page to push the firmware binary.\n\n#include \"mongoose.h\"\n\n#define MQTT_SERVER_URL \"mqtt://broker.hivemq.com:1883\"\n#define MQTT_RX_TOPIC \"mg/123/rx\"\n#define MQTT_TX_TOPIC \"mg/123/tx\"\n\nstatic uint8_t s_qos = 1;             // MQTT QoS\nstatic struct mg_connection *s_conn;  // MQTT Client connection\nstatic struct mg_rpc *s_rpc = NULL;   // List of registered RPC methods\n\nstatic void rpc_ota_update(struct mg_rpc_req *r) {\n  long ofs = mg_json_get_long(r->frame, \"$.params.offset\", -1);\n  long tot = mg_json_get_long(r->frame, \"$.params.total\", -1);\n  int len = 0;\n  char *buf = mg_json_get_b64(r->frame, \"$.params.chunk\", &len);\n  if (buf == NULL) {\n    mg_rpc_err(r, 1, \"%m\", MG_ESC(\"Chunk decoding error\"));\n  } else if (ofs < 0 || tot < 0) {\n    mg_rpc_err(r, 1, \"%m\", MG_ESC(\"offset and total not set\"));\n  } else if (ofs == 0 && mg_ota_begin((size_t) tot) == false) {\n    mg_rpc_err(r, 1, \"\\\"mg_ota_begin(%ld) failed\\\"\", tot);\n  } else if (len > 0 && mg_ota_write(buf, len) == false) {\n    mg_rpc_err(r, 1, \"\\\"mg_ota_write(%lu) @%ld failed\\\"\", len, ofs);\n    mg_ota_end();\n  } else if (len == 0 && mg_ota_end() == false) {\n    mg_rpc_err(r, 1, \"\\\"mg_ota_end() failed\\\"\", tot);\n  } else {\n    mg_rpc_ok(r, \"%m\", MG_ESC(\"ok\"));\n  }\n  mg_free(buf);\n}\n\nstatic void subscribe(struct mg_connection *c, struct mg_str topic) {\n  struct mg_mqtt_opts opts = {};\n  memset(&opts, 0, sizeof(opts));\n  opts.topic = topic;\n  opts.qos = s_qos;\n  mg_mqtt_sub(c, &opts);\n  MG_INFO((\"%lu SUBSCRIBED to %.*s\", c->id, topic.len, topic.buf));\n}\n\nstatic void publish(struct mg_connection *c, struct mg_str topic,\n                    struct mg_str message) {\n  struct mg_mqtt_opts opts = {};\n  memset(&opts, 0, sizeof(opts));\n  opts.topic = topic;\n  opts.message = message;\n  opts.qos = s_qos;\n  mg_mqtt_pub(c, &opts);\n  MG_INFO((\"%lu PUBLISHED %.*s -> %.*s\", c->id, topic.len, topic.buf,\n           message.len, message.buf));\n}\n\nstatic void ev_handler(struct mg_connection *c, int ev, void *ev_data) {\n  if (ev == MG_EV_OPEN) {\n    MG_INFO((\"%lu CREATED\", c->id));\n    // c->is_hexdumping = 1;\n  } else if (ev == MG_EV_CONNECT) {\n    MG_INFO((\"Connected\"));\n  } else if (ev == MG_EV_ERROR) {\n    // On error, log error message\n    MG_ERROR((\"%lu ERROR %s\", c->id, (char *) ev_data));\n  } else if (ev == MG_EV_MQTT_OPEN) {\n    // MQTT connect is successful\n    MG_INFO((\"%lu CONNECTED\", c->id));\n    subscribe(c, mg_str(MQTT_RX_TOPIC));\n  } else if (ev == MG_EV_MQTT_MSG) {\n    // Treat this message as JSON-RPC: process an RPC request\n    struct mg_mqtt_message *mm = (struct mg_mqtt_message *) ev_data;\n    struct mg_iobuf io = {0, 0, 0, 512};\n    struct mg_rpc_req r = {&s_rpc, NULL, mg_pfn_iobuf,\n                           &io,    NULL, {mm->data.buf, mm->data.len}};\n    size_t clipped_len = mm->data.len > 512 ? 512 : mm->data.len;\n    MG_INFO((\"%lu RECEIVED %.*s <- %.*s\", c->id, clipped_len, mm->data.buf,\n             mm->topic.len, mm->topic.buf));\n    mg_rpc_process(&r);\n    if (io.buf != NULL && io.len > 0) {\n      publish(c, mg_str(MQTT_TX_TOPIC), mg_str_n((char *) io.buf, io.len));\n    }\n    mg_iobuf_free(&io);\n  } else if (ev == MG_EV_CLOSE) {\n    MG_INFO((\"%lu CLOSED\", c->id));\n    s_conn = NULL;  // Mark that we're closed\n  }\n}\n\n// SNTP timer function. Sync up time - may be needed for TLS on embedded\nstatic void timer_sntp(void *param) {\n  static uint64_t hourly_timer = 0;\n  uint64_t t1 = mg_now(), t2 = mg_millis();\n  if (t1 < t2 + 3600 || mg_timer_expired(&hourly_timer, 3600000, t2)) {\n    mg_sntp_connect(param, \"udp://time.google.com:123\", NULL, NULL);\n  }\n}\n\nstatic void timer_fn(void *arg) {\n  if (s_conn == NULL) {\n    struct mg_mgr *mgr = (struct mg_mgr *) arg;\n    struct mg_mqtt_opts opts = {.clean = true,\n                                .qos = s_qos,\n                                .topic = mg_str(MQTT_TX_TOPIC),\n                                .keepalive = 5,\n                                .version = 4,\n                                .message = mg_str(\"{\\\"method\\\":\\\"bye\\\"}\")};\n    s_conn = mg_mqtt_connect(mgr, MQTT_SERVER_URL, &opts, ev_handler, NULL);\n  } else {\n    mg_mqtt_ping(s_conn);\n  }\n}\n\nint main(void) {\n  struct mg_mgr mgr;\n  mg_log_set(MG_LL_INFO);\n  mg_mgr_init(&mgr);\n\n  mg_timer_add(&mgr, 3000, MG_TIMER_REPEAT | MG_TIMER_RUN_NOW, timer_fn, &mgr);\n  mg_timer_add(&mgr, 100, MG_TIMER_REPEAT, timer_sntp, &mgr);\n\n  mg_rpc_add(&s_rpc, mg_str(\"ota.update\"), rpc_ota_update, NULL);\n\n  for (;;) mg_mgr_poll(&mgr, 100);\n  mg_mgr_free(&mgr);\n\n  return 0;\n}\n"
  },
  {
    "path": "tutorials/nxp/frdm-mcxn947-make-baremetal-builtin/Makefile",
    "content": "BOARD = mcxn947\nIDE = GCC+make\nRTOS = baremetal\nWIZARD_URL ?= http://mongoose.ws/wizard\n\nall build example: firmware.bin\n\nfirmware.bin: wizard\n\tmake -C wizard CFLAGS_EXTRA=$(CFLAGS_EXTRA) && mv wizard/firmware.bin ./\n\nwizard:\n\thash=$$(curl -H 'Cookie: mongoose_wizard_uid=F2PPlAgQCqSthV1g' -s -X POST -H \"Content-Type: application/json\" -d '{\"build\":{\"board\":\"$(BOARD)\",\"ide\":\"$(IDE)\",\"rtos\":\"$(RTOS)\"},\"http\":{\"http\": true}}' $(WIZARD_URL)/api/hash | jq -r '.hash') \\\n\t&& curl -H 'Cookie: mongoose_wizard_uid=F2PPlAgQCqSthV1g' -s $(WIZARD_URL)/api/zip -o wizard.zip\n\tunzip wizard.zip\n\tcd wizard/mongoose ; rm mongoose.[ch] ; ln -s ../../../../../mongoose.c ; ln -s ../../../../../mongoose.h\n\n\n# Automated remote test. Requires env variable VCON_API_KEY set. See https://vcon.io/automated-firmware-tests/\nDEVICE_URL ?= https://dash.vcon.io/api/v3/devices/??\nupdate: firmware.bin\n\tcurl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/ota --data-binary @$<\n\ntest update: CFLAGS_EXTRA =\"-DUART_DEBUG=USART?\"\ntest: update\n\tcurl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/tx?t=15 | tee /tmp/output.txt\n\tgrep 'READY, IP:' /tmp/output.txt       # Check for network init\n\nclean:\n\trm -rf firmware.* wizard*\n"
  },
  {
    "path": "tutorials/nxp/frdm-mcxn947-make-baremetal-builtin/README.md",
    "content": "See [Wizard](https://mongoose.ws/wizard/#/output?board=mcxn947&ide=GCC+make&rtos=baremetal&file=README.md)\n"
  },
  {
    "path": "tutorials/nxp/frdm-mcxn947-make-freertos-builtin/Makefile",
    "content": "BOARD = mcxn947\nIDE = GCC+make\nRTOS = FreeRTOS\nWIZARD_URL ?= http://mongoose.ws/wizard\n\nall build example: firmware.bin\n\nfirmware.bin: wizard\n\tmake -C wizard CFLAGS_EXTRA=$(CFLAGS_EXTRA) && mv wizard/firmware.bin ./\n\nwizard:\n\thash=$$(curl -H 'Cookie: mongoose_wizard_uid=F2PPlAgQCqSthV1g' -s -X POST -H \"Content-Type: application/json\" -d '{\"build\":{\"board\":\"$(BOARD)\",\"ide\":\"$(IDE)\",\"rtos\":\"$(RTOS)\"},\"http\":{\"http\": true}}' $(WIZARD_URL)/api/hash | jq -r '.hash') \\\n\t&& curl -H 'Cookie: mongoose_wizard_uid=F2PPlAgQCqSthV1g' -s $(WIZARD_URL)/api/zip -o wizard.zip\n\tunzip wizard.zip\n\tcd wizard/mongoose ; rm mongoose.[ch] ; ln -s ../../../../../mongoose.c ; ln -s ../../../../../mongoose.h\n\n\n# Automated remote test. Requires env variable VCON_API_KEY set. See https://vcon.io/automated-firmware-tests/\nDEVICE_URL ?= https://dash.vcon.io/api/v3/devices/??\nupdate: firmware.bin\n\tcurl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/ota --data-binary @$<\n\ntest update: CFLAGS_EXTRA =\"-DUART_DEBUG=USART?\"\ntest: update\n\tcurl --fail-with-body -su :$(VCON_API_KEY) $(DEVICE_URL)/tx?t=15 | tee /tmp/output.txt\n\tgrep 'READY, IP:' /tmp/output.txt       # Check for network init\n\nclean:\n\trm -rf firmware.* wizard*\n"
  },
  {
    "path": "tutorials/nxp/frdm-mcxn947-make-freertos-builtin/README.md",
    "content": "See [Wizard](https://mongoose.ws/wizard/#/output?board=mcxn947&ide=GCC+make&rtos=FreeRTOS&file=README.md)\n"
  },
  {
    "path": "tutorials/nxp/frdm-mcxn947-xpresso-baremetal-builtin/Makefile",
    "content": "BOARD = mcxn947\nIDE = MCUXpresso\nRTOS = baremetal\nWIZARD_URL ?= http://mongoose.ws/wizard\n\nTARGET ?= Debug\nDOCKER = docker run --rm -v $(CURDIR):/root -w /root\nIMAGE ?= scaprile/xpresso\nHEADLESS_BUILD = /usr/local/mcuxpressoide/ide/mcuxpressoide --launcher.suppressErrors -nosplash -application org.eclipse.cdt.managedbuilder.core.headlessbuild\n\nall build example: firmware.axf\n\nfirmware.axf: wizard\n\tmkdir -p workspace\n\tPROJNAME=`xq -r .projectDescription.name wizard/.project` && \\\n\t($(DOCKER) $(IMAGE) $(HEADLESS_BUILD) -data workspace -import wizard -cleanBuild $$PROJNAME/$(TARGET) || true) && \\\n\tcp wizard/$(TARGET)/$$PROJNAME.axf firmware.axf\n\nwizard:\n\thash=$$(curl -H 'Cookie: mongoose_wizard_uid=F2PPlAgQCqSthV1g' -s -X POST -H \"Content-Type: application/json\" -d '{\"build\":{\"board\":\"$(BOARD)\",\"ide\":\"$(IDE)\",\"rtos\":\"$(RTOS)\"},\"http\":{\"http\": true}}' $(WIZARD_URL)/api/hash | jq -r '.hash') \\\n\t&& curl -H 'Cookie: mongoose_wizard_uid=F2PPlAgQCqSthV1g' -s $(WIZARD_URL)/api/zip -o wizard.zip\n\tunzip wizard.zip\n\tcd wizard/source ; rm mongoose.[ch] ; cp -rL ../../../../../mongoose.[ch] .\n\n\nclean:\n\tsudo rm -rf firmware.* wizard* workspace mcuxpresso .cache .eclipse .p2\n"
  },
  {
    "path": "tutorials/nxp/frdm-mcxn947-xpresso-baremetal-builtin/README.md",
    "content": "See [Wizard](https://mongoose.ws/wizard/#/output?board=f429&ide=CubeIDE&rtos=baremetal&file=README.md)\n"
  },
  {
    "path": "tutorials/nxp/frdm-mcxn947-xpresso-freertos-builtin/Makefile",
    "content": "BOARD = mcxn947\nIDE = MCUXpresso\nRTOS = FreeRTOS\nWIZARD_URL ?= http://mongoose.ws/wizard\n\nTARGET ?= Debug\nDOCKER = docker run --rm -v $(CURDIR):/root -w /root\nIMAGE ?= scaprile/xpresso\nHEADLESS_BUILD = /usr/local/mcuxpressoide/ide/mcuxpressoide --launcher.suppressErrors -nosplash -application org.eclipse.cdt.managedbuilder.core.headlessbuild\n\nall build example: firmware.axf\n\nfirmware.axf: wizard\n\tmkdir -p workspace\n\tPROJNAME=`xq -r .projectDescription.name wizard/.project` && \\\n\t($(DOCKER) $(IMAGE) $(HEADLESS_BUILD) -data workspace -import wizard -cleanBuild $$PROJNAME/$(TARGET) || true) && \\\n\tcp wizard/$(TARGET)/$$PROJNAME.axf firmware.axf\n\nwizard:\n\thash=$$(curl -H 'Cookie: mongoose_wizard_uid=F2PPlAgQCqSthV1g' -s -X POST -H \"Content-Type: application/json\" -d '{\"build\":{\"board\":\"$(BOARD)\",\"ide\":\"$(IDE)\",\"rtos\":\"$(RTOS)\"},\"http\":{\"http\": true}}' $(WIZARD_URL)/api/hash | jq -r '.hash') \\\n\t&& curl -H 'Cookie: mongoose_wizard_uid=F2PPlAgQCqSthV1g' -s $(WIZARD_URL)/api/zip -o wizard.zip\n\tunzip wizard.zip\n\tcd wizard/source ; rm mongoose.[ch] ; cp -rL ../../../../../mongoose.[ch] .\n\n\nclean:\n\tsudo rm -rf firmware.* wizard* workspace mcuxpresso .cache .eclipse .p2\n\n"
  },
  {
    "path": "tutorials/nxp/frdm-mcxn947-xpresso-freertos-builtin/README.md",
    "content": "See [Wizard](https://mongoose.ws/wizard/#/output?board=f429&ide=CubeIDE&rtos=baremetal&file=README.md)\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/.cproject",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<?fileVersion 4.0.0?><cproject storage_type_id=\"org.eclipse.cdt.core.XmlProjectDescriptionStorage\">\n\t<storageModule moduleId=\"org.eclipse.cdt.core.settings\">\n\t\t<cconfiguration id=\"com.crt.advproject.config.exe.debug.252552941\">\n\t\t\t<storageModule buildSystemId=\"org.eclipse.cdt.managedbuilder.core.configurationDataProvider\" id=\"com.crt.advproject.config.exe.debug.252552941\" moduleId=\"org.eclipse.cdt.core.settings\" name=\"Debug\">\n\t\t\t\t<externalSettings/>\n\t\t\t\t<extensions>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.ELF\" point=\"org.eclipse.cdt.core.BinaryParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GNU_ELF\" point=\"org.eclipse.cdt.core.BinaryParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GmakeErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GASErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GLDErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.CWDLocator\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GCCErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t</extensions>\n\t\t\t</storageModule>\n\t\t\t<storageModule moduleId=\"cdtBuildSystem\" version=\"4.0.0\">\n\t\t\t\t<configuration artifactExtension=\"axf\" artifactName=\"${ProjName}\" buildArtefactType=\"org.eclipse.cdt.build.core.buildArtefactType.exe\" buildProperties=\"org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe\" cleanCommand=\"rm -rf\" description=\"Debug build\" errorParsers=\"org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser\" id=\"com.crt.advproject.config.exe.debug.252552941\" name=\"Debug\" parent=\"com.crt.advproject.config.exe.debug\" postannouncebuildStep=\"Performing post-build steps\" postbuildStep=\"arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;; # arm-none-eabi-objcopy -v -O binary &quot;${BuildArtifactFileName}&quot; &quot;${BuildArtifactFileBaseName}.bin&quot; ; # checksum -p ${TargetChip} -d &quot;${BuildArtifactFileBaseName}.bin&quot;;  \">\n\t\t\t\t\t<folderInfo id=\"com.crt.advproject.config.exe.debug.252552941.\" name=\"/\" resourcePath=\"\">\n\t\t\t\t\t\t<toolChain id=\"com.crt.advproject.toolchain.exe.debug.1082653760\" name=\"NXP MCU Tools\" superClass=\"com.crt.advproject.toolchain.exe.debug\">\n\t\t\t\t\t\t\t<targetPlatform binaryParser=\"org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF\" id=\"com.crt.advproject.platform.exe.debug.1289303214\" name=\"ARM-based MCU (Debug)\" superClass=\"com.crt.advproject.platform.exe.debug\"/>\n\t\t\t\t\t\t\t<builder buildPath=\"${workspace_loc:/frdmrw612_wifi_webconfig}/Debug\" id=\"com.crt.advproject.builder.exe.debug.1379385878\" keepEnvironmentInBuildfile=\"false\" managedBuildOn=\"true\" name=\"Gnu Make Builder\" superClass=\"com.crt.advproject.builder.exe.debug\"/>\n\t\t\t\t\t\t\t<tool id=\"com.crt.advproject.cpp.exe.debug.20078202\" name=\"MCU C++ Compiler\" superClass=\"com.crt.advproject.cpp.exe.debug\">\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.hdrlib.1969693279\" name=\"Library headers\" superClass=\"com.crt.advproject.cpp.hdrlib\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.fpu.861184837\" name=\"Floating point\" superClass=\"com.crt.advproject.cpp.fpu\" useByScannerDiscovery=\"true\" value=\"com.crt.advproject.cpp.fpu.none\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.arch.735046025\" name=\"Architecture\" superClass=\"com.crt.advproject.cpp.arch\" useByScannerDiscovery=\"true\" value=\"com.crt.advproject.cpp.target.cm33_nodsp\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.misc.dialect.1816397705\" name=\"Language standard\" superClass=\"com.crt.advproject.cpp.misc.dialect\" useByScannerDiscovery=\"true\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.dialect.flags.748933619\" name=\"Other dialect flags\" superClass=\"gnu.cpp.compiler.option.dialect.flags\" useByScannerDiscovery=\"true\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.preprocessor.nostdinc.942118609\" name=\"Do not search system directories (-nostdinc)\" superClass=\"gnu.cpp.compiler.option.preprocessor.nostdinc\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.preprocessor.preprocess.1468896151\" name=\"Preprocess only (-E)\" superClass=\"gnu.cpp.compiler.option.preprocessor.preprocess\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option IS_BUILTIN_EMPTY=\"false\" IS_VALUE_EMPTY=\"false\" id=\"gnu.cpp.compiler.option.preprocessor.def.1357365192\" name=\"Defined symbols (-D)\" superClass=\"gnu.cpp.compiler.option.preprocessor.def\" useByScannerDiscovery=\"false\" valueType=\"definedSymbols\">\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"__NEWLIB__\"/>\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.preprocessor.undef.1769120289\" name=\"Undefined symbols (-U)\" superClass=\"gnu.cpp.compiler.option.preprocessor.undef\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.include.paths.1863145991\" name=\"Include paths (-I)\" superClass=\"gnu.cpp.compiler.option.include.paths\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.include.files.1778273605\" name=\"Include files (-include)\" superClass=\"gnu.cpp.compiler.option.include.files\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.exe.debug.option.optimization.level.260353844\" name=\"Optimization Level\" superClass=\"com.crt.advproject.cpp.exe.debug.option.optimization.level\" useByScannerDiscovery=\"true\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.optimization.flags.1353853346\" name=\"Other optimization flags\" superClass=\"gnu.cpp.compiler.option.optimization.flags\" useByScannerDiscovery=\"false\" value=\"-fno-common\" valueType=\"string\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.exe.debug.option.debugging.level.78129211\" name=\"Debug Level\" superClass=\"com.crt.advproject.cpp.exe.debug.option.debugging.level\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.exe.debug.option.debugging.other.395162337\" name=\"Other debugging flags\" superClass=\"com.crt.advproject.cpp.exe.debug.option.debugging.other\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.debugging.prof.1203773350\" name=\"Generate prof information (-p)\" superClass=\"gnu.cpp.compiler.option.debugging.prof\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.debugging.gprof.1525320205\" name=\"Generate gprof information (-pg)\" superClass=\"gnu.cpp.compiler.option.debugging.gprof\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.debugging.codecov.1866702658\" name=\"Generate gcov information (-ftest-coverage -fprofile-arcs)\" superClass=\"gnu.cpp.compiler.option.debugging.codecov\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.debugging.sanitaddress.1830476164\" name=\"Sanitize address (-fsanitize=address)\" superClass=\"gnu.cpp.compiler.option.debugging.sanitaddress\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.debugging.sanitpointers.1677754101\" name=\"Sanitize pointer operations (-fsanitize=pointer-compare -fsanitize=pointer-subtract)\" superClass=\"gnu.cpp.compiler.option.debugging.sanitpointers\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.debugging.sanitthread.415134260\" name=\"Sanitize data race in multi-thread (-fsanitize=thread)\" superClass=\"gnu.cpp.compiler.option.debugging.sanitthread\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.debugging.sanitleak.828910286\" name=\"Sanitize memory leak (-fsanitize=leak)\" superClass=\"gnu.cpp.compiler.option.debugging.sanitleak\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.debugging.sanitundef.1685807034\" name=\"Sanitize undefined behavior (-fsanitize=undefined)\" superClass=\"gnu.cpp.compiler.option.debugging.sanitundef\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.syntax.1817813827\" name=\"Check syntax only (-fsyntax-only)\" superClass=\"gnu.cpp.compiler.option.warnings.syntax\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.pedantic.807221211\" name=\"Pedantic (-pedantic)\" superClass=\"gnu.cpp.compiler.option.warnings.pedantic\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.pedantic.error.45396858\" name=\"Pedantic warnings as errors (-pedantic-errors)\" superClass=\"gnu.cpp.compiler.option.warnings.pedantic.error\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.nowarn.778770183\" name=\"Inhibit all warnings (-w)\" superClass=\"gnu.cpp.compiler.option.warnings.nowarn\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.allwarn.411834116\" name=\"All warnings (-Wall)\" superClass=\"gnu.cpp.compiler.option.warnings.allwarn\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.extrawarn.1688039191\" name=\"Extra warnings (-Wextra)\" superClass=\"gnu.cpp.compiler.option.warnings.extrawarn\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.toerrors.1257378271\" name=\"Warnings as errors (-Werror)\" superClass=\"gnu.cpp.compiler.option.warnings.toerrors\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wconversion.1743548296\" name=\"Implicit conversion warnings (-Wconversion)\" superClass=\"gnu.cpp.compiler.option.warnings.wconversion\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wcastalign.482852757\" name=\"Pointer cast with different alignment (-Wcast-align)\" superClass=\"gnu.cpp.compiler.option.warnings.wcastalign\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wcastqual.1891511534\" name=\"Removing type qualifier from cast target type (-Wcast-qual)\" superClass=\"gnu.cpp.compiler.option.warnings.wcastqual\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wctordtorprivacy.874831981\" name=\"All ctor and dtor private (-Wctor-dtor-privacy)\" superClass=\"gnu.cpp.compiler.option.warnings.wctordtorprivacy\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wdisabledopt.498402479\" name=\"Requested optimization pass is disabled (-Wdisabled-optimization)\" superClass=\"gnu.cpp.compiler.option.warnings.wdisabledopt\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wlogicalop.1621777758\" name=\"Suspicious uses of logical operators (-Wlogical-op)\" superClass=\"gnu.cpp.compiler.option.warnings.wlogicalop\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wmissingdecl.1856533978\" name=\"Global function without previous declaration (-Wmissing-declarations)\" superClass=\"gnu.cpp.compiler.option.warnings.wmissingdecl\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wmissingincdir.995129754\" name=\"User-supplied include directory does not exist (-Wmissing-include-dirs)\" superClass=\"gnu.cpp.compiler.option.warnings.wmissingincdir\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wnoexccept.144110502\" name=\"Noexcept false but never throw exception (-Wnoexcept)\" superClass=\"gnu.cpp.compiler.option.warnings.wnoexccept\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.woldstylecast.563047915\" name=\"C-style cast used (-Wold-style-cast)\" superClass=\"gnu.cpp.compiler.option.warnings.woldstylecast\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.woverloadedvirtual.1278041292\" name=\"Function hides virtual functions from base class (-Woverloaded-virtual)\" superClass=\"gnu.cpp.compiler.option.warnings.woverloadedvirtual\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wredundantdecl.2049252630\" name=\"More than one declaration in the same scope (-Wredundant-decls)\" superClass=\"gnu.cpp.compiler.option.warnings.wredundantdecl\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wshadow.800332262\" name=\"Local symbol shadows upper scope symbol (-Wshadow)\" superClass=\"gnu.cpp.compiler.option.warnings.wshadow\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wsignconv.1090419937\" name=\"Implicit conversions that may change the sign (-Wsign-conversion)\" superClass=\"gnu.cpp.compiler.option.warnings.wsignconv\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wsignpromo.1914548782\" name=\"Overload resolution promotes unsigned to signed type (-Wsign-promo)\" superClass=\"gnu.cpp.compiler.option.warnings.wsignpromo\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wstrictnullsent.514583760\" name=\"Use of an uncasted NULL as sentinel (-Wstrict-null-sentinel)\" superClass=\"gnu.cpp.compiler.option.warnings.wstrictnullsent\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wswitchdef.1412252291\" name=\"A switch statement does not have a default case (-Wswitch-default)\" superClass=\"gnu.cpp.compiler.option.warnings.wswitchdef\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wundef.316162512\" name=\"An undefined identifier is evaluated in an #if directive (-Wundef)\" superClass=\"gnu.cpp.compiler.option.warnings.wundef\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.weffcpp.1382236666\" name=\"Effective C++ guidelines (-Weffc++)\" superClass=\"gnu.cpp.compiler.option.warnings.weffcpp\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wfloatequal.540622252\" name=\"Direct float equal check (-Wfloat-equal)\" superClass=\"gnu.cpp.compiler.option.warnings.wfloatequal\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.other.other.1390627875\" name=\"Other flags\" superClass=\"gnu.cpp.compiler.option.other.other\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.other.otherExcludedFromScannerDiscovery.2124331980\" name=\"Other flags (excluded from discovery)\" superClass=\"gnu.cpp.compiler.option.other.otherExcludedFromScannerDiscovery\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.other.verbose.1822855032\" name=\"Verbose (-v)\" superClass=\"gnu.cpp.compiler.option.other.verbose\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.other.pic.766511103\" name=\"Position Independent Code (-fPIC)\" superClass=\"gnu.cpp.compiler.option.other.pic\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.misc.hardening.896557953\" name=\"Hardening options (-fstack-protector-all -Wformat=2 -Wformat-security -Wstrict-overflow)\" superClass=\"gnu.cpp.compiler.option.misc.hardening\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.misc.randomization.102048143\" name=\"Address randomization (-fPIE)\" superClass=\"gnu.cpp.compiler.option.misc.randomization\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.lto.830439902\" name=\"Enable Link-time optimization (-flto)\" superClass=\"com.crt.advproject.cpp.lto\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.lto.fat.1031319388\" name=\"Fat lto objects (-ffat-lto-objects)\" superClass=\"com.crt.advproject.cpp.lto.fat\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.merge.constants.1114784875\" name=\"Merge Identical Constants (-fmerge-constants)\" superClass=\"com.crt.advproject.cpp.merge.constants\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.prefixmap.2042027540\" name=\"Remove path from __FILE__ (-fmacro-prefix-map)\" superClass=\"com.crt.advproject.cpp.prefixmap\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.thumb.487042530\" name=\"Thumb mode\" superClass=\"com.crt.advproject.cpp.thumb\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.thumbinterwork.843678497\" name=\"Enable Thumb interworking\" superClass=\"com.crt.advproject.cpp.thumbinterwork\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.securestate.800498490\" name=\"TrustZone Project Type\" superClass=\"com.crt.advproject.cpp.securestate\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.specs.187448052\" name=\"Specs\" superClass=\"com.crt.advproject.cpp.specs\" useByScannerDiscovery=\"false\" value=\"com.crt.advproject.cpp.specs.newlibnano\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.stackusage.894379153\" name=\"Generate Stack Usage Info (-fstack-usage)\" superClass=\"com.crt.advproject.cpp.stackusage\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.config.755619280\" name=\"Obsolete (Config)\" superClass=\"com.crt.advproject.cpp.config\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.store.1067173068\" name=\"Obsolete (Store)\" superClass=\"com.crt.advproject.cpp.store\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"com.crt.advproject.gcc.exe.debug.587026796\" name=\"MCU C Compiler\" superClass=\"com.crt.advproject.gcc.exe.debug\">\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.hdrlib.1922178190\" name=\"Library headers\" superClass=\"com.crt.advproject.gcc.hdrlib\" useByScannerDiscovery=\"false\" value=\"com.crt.advproject.gcc.hdrlib.newlibnano\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option IS_BUILTIN_EMPTY=\"false\" IS_VALUE_EMPTY=\"false\" id=\"gnu.c.compiler.option.preprocessor.def.symbols.296857998\" name=\"Defined symbols (-D)\" superClass=\"gnu.c.compiler.option.preprocessor.def.symbols\" useByScannerDiscovery=\"false\" valueType=\"definedSymbols\">\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"FSL_SDK_DRIVER_QUICK_ACCESS_ENABLE=1\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"CONFIG_NET_DEBUG=1\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"USE_RTOS=1\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"PRINTF_ADVANCED_ENABLE=1\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"SDK_DEBUGCONSOLE_UART\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"CPU_RW612ETA2I\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"MCUXPRESSO_SDK\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"BOOT_HEADER_ENABLE=1\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"MFLASH_FILE_BASEADDR=7340032\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"FSL_OSA_TASK_ENABLE=1\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"OSA_USED\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"_XOPEN_SOURCE=500\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"SDK_OS_FREE_RTOS\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"SERIAL_PORT_TYPE_UART=1\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"CPU_RW612ETA2I_cm33_nodsp\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"SDK_DEBUGCONSOLE=1\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"CR_INTEGER_PRINTF\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"__MCUXPRESSO\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"__USE_CMSIS\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"DEBUG\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"__NEWLIB__\"/>\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.fpu.1016306384\" name=\"Floating point\" superClass=\"com.crt.advproject.gcc.fpu\" useByScannerDiscovery=\"true\" value=\"com.crt.advproject.gcc.fpu.fpv5sp.hard\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.thumb.452284926\" name=\"Thumb mode\" superClass=\"com.crt.advproject.gcc.thumb\" useByScannerDiscovery=\"false\" value=\"true\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.arch.569256829\" name=\"Architecture\" superClass=\"com.crt.advproject.gcc.arch\" useByScannerDiscovery=\"true\" value=\"com.crt.advproject.gcc.target.cm33_nodsp\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.c.misc.dialect.514925729\" name=\"Language standard\" superClass=\"com.crt.advproject.c.misc.dialect\" useByScannerDiscovery=\"true\" value=\"com.crt.advproject.misc.dialect.gnu99\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.dialect.flags.444085703\" name=\"Other dialect flags\" superClass=\"gnu.c.compiler.option.dialect.flags\" useByScannerDiscovery=\"true\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.preprocessor.nostdinc.1636374190\" name=\"Do not search system directories (-nostdinc)\" superClass=\"gnu.c.compiler.option.preprocessor.nostdinc\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.preprocessor.preprocess.1575111767\" name=\"Preprocess only (-E)\" superClass=\"gnu.c.compiler.option.preprocessor.preprocess\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.preprocessor.undef.symbol.1393623422\" name=\"Undefined symbols (-U)\" superClass=\"gnu.c.compiler.option.preprocessor.undef.symbol\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option IS_BUILTIN_EMPTY=\"false\" IS_VALUE_EMPTY=\"false\" id=\"gnu.c.compiler.option.include.paths.1682038716\" name=\"Include paths (-I)\" superClass=\"gnu.c.compiler.option.include.paths\" useByScannerDiscovery=\"false\" valueType=\"includePath\">\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/source}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/wifidriver}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/incl}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/incl/wlcmgr}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/wifidriver/incl}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/wifidriver/wpa_supp_if}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/wifidriver/wpa_supp_if/incl}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/certs}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/firmware_dnld}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/sdio_nxp_abs}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/sdio_nxp_abs/incl}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/drivers/freertos}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/osa}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/conn_fwloader/include}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/conn_fwloader/fw_bin}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/conn_fwloader/fw_bin/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/conn_fwloader/fw_bin/rw61x}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/conn_fwloader/fw_bin/script}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/flash/mflash/frdmrw612}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/flash/mflash}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/imu_adapter}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/utilities}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/lwip/src/apps/httpsrv}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/drivers}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/incl/wifidriver}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/incl/port/net}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/port/net}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/incl/port/net/hooks}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/lwip/port}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/lwip/src}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/lwip/src/include}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/edgefast_wifi/include}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/freertos/freertos-kernel/portable/GCC/ARM_CM33_NTZ/non_secure}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/flash_config}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/device}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/platforms/rw61x}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/incl/port/osa}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/wifi_bt_firmware}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/port/osa}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/wifi_bt_module/AzureWave/tx_pwr_limits}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/wifi_bt_module/Murata/tx_pwr_limits}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/wifi_bt_module/u-blox/tx_pwr_limits}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/dhcpd}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/lwip/src/include/lwip/apps}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/freertos/freertos-kernel/include}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/lists}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/serial_manager}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/uart}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/lwip/port/sys_arch/dynamic}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/CMSIS}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxClEls/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxClEls/inc/internal}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxClMemory/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxClMemory/inc/internal}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxCsslMemory/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxCsslMemory/inc/internal}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/platforms/rw61x/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxClBuffer/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxClBuffer/inc/internal}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxClCore/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxCsslParamIntegrity/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxCsslFlowProtection/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxCsslSecureCounter/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxCsslCPreProcessor/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/compiler}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxCsslDataIntegrity/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/board}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/.}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/template}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/lwip/template}&quot;\"/>\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.include.files.900514335\" name=\"Include files (-include)\" superClass=\"gnu.c.compiler.option.include.files\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.exe.debug.option.optimization.level.1241426306\" name=\"Optimization Level\" superClass=\"com.crt.advproject.gcc.exe.debug.option.optimization.level\" useByScannerDiscovery=\"true\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.optimization.flags.1115215475\" name=\"Other optimization flags\" superClass=\"gnu.c.compiler.option.optimization.flags\" useByScannerDiscovery=\"false\" value=\"-fno-common\" valueType=\"string\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.exe.debug.option.debugging.level.1378060781\" name=\"Debug Level\" superClass=\"com.crt.advproject.gcc.exe.debug.option.debugging.level\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.exe.debug.option.debugging.other.1592192583\" name=\"Other debugging flags\" superClass=\"com.crt.advproject.gcc.exe.debug.option.debugging.other\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.debugging.prof.1442859189\" name=\"Generate prof information (-p)\" superClass=\"gnu.c.compiler.option.debugging.prof\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.debugging.gprof.714659301\" name=\"Generate gprof information (-pg)\" superClass=\"gnu.c.compiler.option.debugging.gprof\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.debugging.codecov.1775514482\" name=\"Generate gcov information (-ftest-coverage -fprofile-arcs)\" superClass=\"gnu.c.compiler.option.debugging.codecov\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.debugging.sanitaddress.1526699091\" name=\"Sanitize address (-fsanitize=address)\" superClass=\"gnu.c.compiler.option.debugging.sanitaddress\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.debugging.sanitpointers.1111988373\" name=\"Sanitize pointer operations (-fsanitize=pointer-compare -fsanitize=pointer-subtract)\" superClass=\"gnu.c.compiler.option.debugging.sanitpointers\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.debugging.sanitthread.1797213367\" name=\"Sanitize data race in multi-thread (-fsanitize=thread)\" superClass=\"gnu.c.compiler.option.debugging.sanitthread\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.debugging.sanitleak.266547812\" name=\"Sanitize memory leak (-fsanitize=leak)\" superClass=\"gnu.c.compiler.option.debugging.sanitleak\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.debugging.sanitundef.1615796179\" name=\"Sanitize undefined behavior (-fsanitize=undefined)\" superClass=\"gnu.c.compiler.option.debugging.sanitundef\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.syntax.740449785\" name=\"Check syntax only (-fsyntax-only)\" superClass=\"gnu.c.compiler.option.warnings.syntax\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.pedantic.1219581095\" name=\"Pedantic (-pedantic)\" superClass=\"gnu.c.compiler.option.warnings.pedantic\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.pedantic.error.1726934965\" name=\"Pedantic warnings as errors (-pedantic-errors)\" superClass=\"gnu.c.compiler.option.warnings.pedantic.error\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.nowarn.1605965397\" name=\"Inhibit all warnings (-w)\" superClass=\"gnu.c.compiler.option.warnings.nowarn\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.allwarn.35952091\" name=\"All warnings (-Wall)\" superClass=\"gnu.c.compiler.option.warnings.allwarn\" useByScannerDiscovery=\"false\" value=\"false\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.extrawarn.847763109\" name=\"Extra warnings (-Wextra)\" superClass=\"gnu.c.compiler.option.warnings.extrawarn\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.toerrors.1344904244\" name=\"Warnings as errors (-Werror)\" superClass=\"gnu.c.compiler.option.warnings.toerrors\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wconversion.1632972470\" name=\"Implicit conversion warnings (-Wconversion)\" superClass=\"gnu.c.compiler.option.warnings.wconversion\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wcastalign.1030585779\" name=\"Pointer cast with different alignment (-Wcast-align)\" superClass=\"gnu.c.compiler.option.warnings.wcastalign\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wcastqual.306482754\" name=\"Removing type qualifier from cast target type (-Wcast-qual)\" superClass=\"gnu.c.compiler.option.warnings.wcastqual\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wdisabledopt.192295591\" name=\"Requested optimization pass is disabled (-Wdisabled-optimization)\" superClass=\"gnu.c.compiler.option.warnings.wdisabledopt\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wlogicalop.1480630565\" name=\"Suspicious uses of logical operators (-Wlogical-op)\" superClass=\"gnu.c.compiler.option.warnings.wlogicalop\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wmissingdecl.19350929\" name=\"Global function without previous declaration (-Wmissing-declarations)\" superClass=\"gnu.c.compiler.option.warnings.wmissingdecl\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wmissingincdir.209701985\" name=\"User-supplied include directory does not exist (-Wmissing-include-dirs)\" superClass=\"gnu.c.compiler.option.warnings.wmissingincdir\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wredundantdecl.958240042\" name=\"More than one declaration in the same scope (-Wredundant-decls)\" superClass=\"gnu.c.compiler.option.warnings.wredundantdecl\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wshadow.1871471829\" name=\"Local symbol shadows upper scope symbol (-Wshadow)\" superClass=\"gnu.c.compiler.option.warnings.wshadow\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wsignconv.904546300\" name=\"Implicit conversions that may change the sign (-Wsign-conversion)\" superClass=\"gnu.c.compiler.option.warnings.wsignconv\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wswitchdef.740518820\" name=\"A switch statement does not have a default case (-Wswitch-default)\" superClass=\"gnu.c.compiler.option.warnings.wswitchdef\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wundef.2020125093\" name=\"An undefined identifier is evaluated in an #if directive (-Wundef)\" superClass=\"gnu.c.compiler.option.warnings.wundef\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wwritestrings.593103216\" name=\"Treat strings always as const (-Wwrite-strings)\" superClass=\"gnu.c.compiler.option.warnings.wwritestrings\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wfloatequal.182346638\" name=\"Direct float equal check (-Wfloat-equal)\" superClass=\"gnu.c.compiler.option.warnings.wfloatequal\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.misc.other.896204121\" name=\"Other flags\" superClass=\"gnu.c.compiler.option.misc.other\" useByScannerDiscovery=\"false\" value=\"-mcpu=cortex-m33+nodsp -c -ffunction-sections -fdata-sections -fno-builtin\" valueType=\"string\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.misc.otherExcludedFromScannerDiscovery.162647352\" name=\"Other flags (excluded from discovery)\" superClass=\"gnu.c.compiler.option.misc.otherExcludedFromScannerDiscovery\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.misc.verbose.395773100\" name=\"Verbose (-v)\" superClass=\"gnu.c.compiler.option.misc.verbose\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.misc.ansi.738012596\" name=\"Support ANSI programs (-ansi)\" superClass=\"gnu.c.compiler.option.misc.ansi\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.misc.pic.951661366\" name=\"Position Independent Code (-fPIC)\" superClass=\"gnu.c.compiler.option.misc.pic\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.misc.hardening.640435001\" name=\"Hardening options (-fstack-protector-all -Wformat=2 -Wformat-security -Wstrict-overflow)\" superClass=\"gnu.c.compiler.option.misc.hardening\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.misc.randomization.1554824595\" name=\"Address randomization (-fPIE)\" superClass=\"gnu.c.compiler.option.misc.randomization\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.lto.1034853062\" name=\"Enable Link-time optimization (-flto)\" superClass=\"com.crt.advproject.gcc.lto\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.lto.fat.1145953934\" name=\"Fat lto objects (-ffat-lto-objects)\" superClass=\"com.crt.advproject.gcc.lto.fat\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.merge.constants.2102978090\" name=\"Merge Identical Constants (-fmerge-constants)\" superClass=\"com.crt.advproject.gcc.merge.constants\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.prefixmap.1085653287\" name=\"Remove path from __FILE__ (-fmacro-prefix-map)\" superClass=\"com.crt.advproject.gcc.prefixmap\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.thumbinterwork.689867021\" name=\"Enable Thumb interworking\" superClass=\"com.crt.advproject.gcc.thumbinterwork\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.securestate.720496309\" name=\"TrustZone Project Type\" superClass=\"com.crt.advproject.gcc.securestate\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.specs.1345213853\" name=\"Specs\" superClass=\"com.crt.advproject.gcc.specs\" useByScannerDiscovery=\"false\" value=\"com.crt.advproject.gcc.specs.newlibnano\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.stackusage.1005834270\" name=\"Generate Stack Usage Info (-fstack-usage)\" superClass=\"com.crt.advproject.gcc.stackusage\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.config.941542602\" name=\"Obsolete (Config)\" superClass=\"com.crt.advproject.gcc.config\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.store.1017261463\" name=\"Obsolete (Store)\" superClass=\"com.crt.advproject.gcc.store\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<inputType id=\"com.crt.advproject.compiler.input.1621627363\" superClass=\"com.crt.advproject.compiler.input\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"com.crt.advproject.gas.exe.debug.64345950\" name=\"MCU Assembler\" superClass=\"com.crt.advproject.gas.exe.debug\">\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gas.hdrlib.1921626762\" name=\"Library headers\" superClass=\"com.crt.advproject.gas.hdrlib\" value=\"com.crt.advproject.gas.hdrlib.newlibnano\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gas.fpu.1502081540\" name=\"Floating point\" superClass=\"com.crt.advproject.gas.fpu\" value=\"com.crt.advproject.gas.fpu.fpv5sp.hard\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gas.thumb.1514509848\" name=\"Thumb mode\" superClass=\"com.crt.advproject.gas.thumb\" value=\"true\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gas.arch.406950634\" name=\"Architecture\" superClass=\"com.crt.advproject.gas.arch\" value=\"com.crt.advproject.gas.target.cm33_nodsp\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.both.asm.option.flags.crt.1843278549\" name=\"Assembler flags\" superClass=\"gnu.both.asm.option.flags.crt\" value=\"-c -x assembler-with-cpp -D__NEWLIB__\" valueType=\"string\"/>\n\t\t\t\t\t\t\t\t<option IS_BUILTIN_EMPTY=\"false\" IS_VALUE_EMPTY=\"false\" id=\"gnu.both.asm.option.include.paths.420091040\" name=\"Include paths (-I)\" superClass=\"gnu.both.asm.option.include.paths\" valueType=\"includePath\">\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/source}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/freertos/freertos-kernel/include}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/board}&quot;\"/>\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option id=\"gnu.both.asm.option.warnings.nowarn.1245304946\" name=\"Suppress warnings (-W)\" superClass=\"gnu.both.asm.option.warnings.nowarn\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.both.asm.option.version.2082499958\" name=\"Announce version (-v)\" superClass=\"gnu.both.asm.option.version\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gas.exe.debug.option.debugging.level.762048533\" name=\"Debug level\" superClass=\"com.crt.advproject.gas.exe.debug.option.debugging.level\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gas.exe.debug.option.debugging.other.630573380\" name=\"Other debugging flags\" superClass=\"com.crt.advproject.gas.exe.debug.option.debugging.other\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gas.thumbinterwork.1805600562\" name=\"Enable Thumb interworking\" superClass=\"com.crt.advproject.gas.thumbinterwork\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gas.specs.1328541496\" name=\"Specs\" superClass=\"com.crt.advproject.gas.specs\" value=\"com.crt.advproject.gas.specs.newlibnano\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gas.config.114787772\" name=\"Obsolete (Config)\" superClass=\"com.crt.advproject.gas.config\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gas.store.636764708\" name=\"Obsolete (Store)\" superClass=\"com.crt.advproject.gas.store\"/>\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.assembler.input.210292267\" superClass=\"cdt.managedbuild.tool.gnu.assembler.input\"/>\n\t\t\t\t\t\t\t\t<inputType id=\"com.crt.advproject.assembler.input.67269995\" name=\"Additional Assembly Source Files\" superClass=\"com.crt.advproject.assembler.input\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"com.crt.advproject.link.cpp.exe.debug.737410983\" name=\"MCU C++ Linker\" superClass=\"com.crt.advproject.link.cpp.exe.debug\">\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.hdrlib.534146969\" name=\"Library\" superClass=\"com.crt.advproject.link.cpp.hdrlib\" value=\"com.crt.advproject.cpp.link.hdrlib.newlibnano.nohost\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.fpu.1639783583\" name=\"Floating point\" superClass=\"com.crt.advproject.link.cpp.fpu\" value=\"com.crt.advproject.link.cpp.fpu.none\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.arch.927510991\" name=\"Architecture\" superClass=\"com.crt.advproject.link.cpp.arch\" value=\"com.crt.advproject.link.cpp.target.cm33_nodsp\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.nostart.476482937\" name=\"Do not use standard start files (-nostartfiles)\" superClass=\"gnu.cpp.link.option.nostart\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.nodeflibs.1977093450\" name=\"Do not use default libraries (-nodefaultlibs)\" superClass=\"gnu.cpp.link.option.nodeflibs\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.nostdlibs.1028093310\" name=\"No startup or default libs (-nostdlib)\" superClass=\"gnu.cpp.link.option.nostdlibs\" value=\"true\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.strip.81714744\" name=\"Omit all symbol information (-s)\" superClass=\"gnu.cpp.link.option.strip\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.libs.227401254\" name=\"Libraries (-l)\" superClass=\"gnu.cpp.link.option.libs\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.paths.737370835\" name=\"Library search path (-L)\" superClass=\"gnu.cpp.link.option.paths\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.group.2011748493\" name=\"Group libraries (-Wl,--start-group  ...  -Wl,--end-group)\" superClass=\"gnu.cpp.link.option.group\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.flags.658695338\" name=\"Linker flags\" superClass=\"gnu.cpp.link.option.flags\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.other.1302990949\" name=\"Other options (-Xlinker [option])\" superClass=\"gnu.cpp.link.option.other\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.userobjs.340325064\" name=\"Other objects\" superClass=\"gnu.cpp.link.option.userobjs\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.shared.1613798438\" name=\"Shared (-shared)\" superClass=\"gnu.cpp.link.option.shared\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.soname.1602846096\" name=\"Shared object name (-Wl,-soname=)\" superClass=\"gnu.cpp.link.option.soname\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.implname.1871526169\" name=\"Import Library name (-Wl,--out-implib=)\" superClass=\"gnu.cpp.link.option.implname\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.defname.1943482693\" name=\"DEF file name (-Wl,--output-def=)\" superClass=\"gnu.cpp.link.option.defname\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.debugging.prof.244559222\" name=\"Generate prof information (-p)\" superClass=\"gnu.cpp.link.option.debugging.prof\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.debugging.gprof.1939978840\" name=\"Generate gprof information (-pg)\" superClass=\"gnu.cpp.link.option.debugging.gprof\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.debugging.codecov.1232918120\" name=\"Generate gcov information (-ftest-coverage -fprofile-arcs)\" superClass=\"gnu.cpp.link.option.debugging.codecov\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.lto.1152598303\" name=\"Enable Link-time optimization (-flto)\" superClass=\"com.crt.advproject.link.cpp.lto\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.lto.optmization.level.1370938200\" name=\"Link-time optimization level\" superClass=\"com.crt.advproject.link.cpp.lto.optmization.level\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.thumb.986042892\" name=\"Thumb mode\" superClass=\"com.crt.advproject.link.cpp.thumb\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.manage.66656067\" name=\"Manage linker script\" superClass=\"com.crt.advproject.link.cpp.manage\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.script.469689234\" name=\"Linker script\" superClass=\"com.crt.advproject.link.cpp.script\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.scriptdir.1583519820\" name=\"Script path\" superClass=\"com.crt.advproject.link.cpp.scriptdir\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.crpenable.245357532\" name=\"Enable automatic placement of Code Read Protection field in image\" superClass=\"com.crt.advproject.link.cpp.crpenable\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.flashconfigenable.637509264\" name=\"Enable automatic placement of Flash Configuration field in image\" superClass=\"com.crt.advproject.link.cpp.flashconfigenable\" value=\"true\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.ecrp.1866994673\" name=\"Enhanced CRP\" superClass=\"com.crt.advproject.link.cpp.ecrp\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.nanofloat.1524911893\" name=\"Enable printf float \" superClass=\"com.crt.advproject.link.cpp.nanofloat\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.nanofloat.scanf.431400149\" name=\"Enable scanf float \" superClass=\"com.crt.advproject.link.cpp.nanofloat.scanf\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.toram.1380094169\" name=\"Link application to RAM\" superClass=\"com.crt.advproject.link.cpp.toram\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.memory.load.image.cpp.1041357021\" name=\"Plain load image\" superClass=\"com.crt.advproject.link.memory.load.image.cpp\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.memory.heapAndStack.style.cpp.1711963072\" name=\"Heap and Stack placement\" superClass=\"com.crt.advproject.link.memory.heapAndStack.style.cpp\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.stackOffset.1965274562\" name=\"Stack offset\" superClass=\"com.crt.advproject.link.cpp.stackOffset\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.memory.heapAndStack.cpp.679317988\" name=\"Heap and Stack options\" superClass=\"com.crt.advproject.link.memory.heapAndStack.cpp\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.memory.data.cpp.2100090728\" name=\"Global data placement\" superClass=\"com.crt.advproject.link.memory.data.cpp\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.memory.sections.cpp.726514231\" name=\"Extra linker script input sections\" superClass=\"com.crt.advproject.link.memory.sections.cpp\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.multicore.slave.916968105\" name=\"Multicore configuration\" superClass=\"com.crt.advproject.link.cpp.multicore.slave\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.multicore.master.1358835556\" name=\"Multicore master\" superClass=\"com.crt.advproject.link.cpp.multicore.master\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.multicore.empty.1044500972\" name=\"No Multicore options for this project\" superClass=\"com.crt.advproject.link.cpp.multicore.empty\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.multicore.master.userobjs.2136453489\" name=\"Slave Objects (not visible)\" superClass=\"com.crt.advproject.link.cpp.multicore.master.userobjs\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.config.278781012\" name=\"Obsolete (Config)\" superClass=\"com.crt.advproject.link.cpp.config\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.store.545464579\" name=\"Obsolete (Store)\" superClass=\"com.crt.advproject.link.cpp.store\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.securestate.1296584123\" name=\"TrustZone Project Type\" superClass=\"com.crt.advproject.link.cpp.securestate\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.sgstubs.placement.366235322\" name=\"Secure Gateway Placement\" superClass=\"com.crt.advproject.link.cpp.sgstubs.placement\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.sgstubenable.410131207\" name=\"Enable generation of Secure Gateway Import Library\" superClass=\"com.crt.advproject.link.cpp.sgstubenable\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.nonsecureobject.1239598330\" name=\"Secure Gateway Import Library\" superClass=\"com.crt.advproject.link.cpp.nonsecureobject\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.inimplib.495980127\" name=\"Input Secure Gateway Import Library\" superClass=\"com.crt.advproject.link.cpp.inimplib\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"com.crt.advproject.link.exe.debug.769392292\" name=\"MCU Linker\" superClass=\"com.crt.advproject.link.exe.debug\">\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.gcc.multicore.slave.1515720382\" name=\"Multicore configuration\" superClass=\"com.crt.advproject.link.gcc.multicore.slave\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.gcc.multicore.master.944640407\" name=\"Multicore master\" superClass=\"com.crt.advproject.link.gcc.multicore.master\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.gcc.hdrlib.1542825156\" name=\"Library\" superClass=\"com.crt.advproject.link.gcc.hdrlib\" value=\"com.crt.advproject.gcc.link.hdrlib.newlibnano.nohost\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.fpu.1503247370\" name=\"Floating point\" superClass=\"com.crt.advproject.link.fpu\" value=\"com.crt.advproject.link.fpu.fpv5sp.hard\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.thumb.771060667\" name=\"Thumb mode\" superClass=\"com.crt.advproject.link.thumb\" value=\"true\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.memory.load.image.1895935545\" name=\"Plain load image\" superClass=\"com.crt.advproject.link.memory.load.image\" value=\"false;\" valueType=\"string\"/>\n\t\t\t\t\t\t\t\t<option defaultValue=\"com.crt.advproject.heapAndStack.mcuXpressoStyle\" id=\"com.crt.advproject.link.memory.heapAndStack.style.919445566\" name=\"Heap and Stack placement\" superClass=\"com.crt.advproject.link.memory.heapAndStack.style\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.memory.heapAndStack.2027001014\" name=\"Heap and Stack options\" superClass=\"com.crt.advproject.link.memory.heapAndStack\" value=\"&amp;Heap:Default;Post Data;0x20000&amp;Stack:Default;End;0x800\" valueType=\"string\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.memory.data.1833640464\" name=\"Global data placement\" superClass=\"com.crt.advproject.link.memory.data\" value=\"Default\" valueType=\"string\"/>\n\t\t\t\t\t\t\t\t<option IS_BUILTIN_EMPTY=\"false\" IS_VALUE_EMPTY=\"true\" id=\"com.crt.advproject.link.memory.sections.1557379102\" name=\"Extra linker script input sections\" superClass=\"com.crt.advproject.link.memory.sections\" valueType=\"stringList\"/>\n\t\t\t\t\t\t\t\t<option IS_BUILTIN_EMPTY=\"false\" IS_VALUE_EMPTY=\"true\" id=\"com.crt.advproject.link.gcc.multicore.master.userobjs.926713704\" name=\"Slave Objects (not visible)\" superClass=\"com.crt.advproject.link.gcc.multicore.master.userobjs\" valueType=\"userObjs\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.arch.356114823\" name=\"Architecture\" superClass=\"com.crt.advproject.link.arch\" value=\"com.crt.advproject.link.target.cm33_nodsp\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.nostart.39714644\" name=\"Do not use standard start files (-nostartfiles)\" superClass=\"gnu.c.link.option.nostart\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.nodeflibs.1661794950\" name=\"Do not use default libraries (-nodefaultlibs)\" superClass=\"gnu.c.link.option.nodeflibs\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.nostdlibs.1687864495\" name=\"No startup or default libs (-nostdlib)\" superClass=\"gnu.c.link.option.nostdlibs\" value=\"true\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.strip.2141959678\" name=\"Omit all symbol information (-s)\" superClass=\"gnu.c.link.option.strip\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.noshared.326849764\" name=\"No shared libraries (-static)\" superClass=\"gnu.c.link.option.noshared\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.libs.232916066\" name=\"Libraries (-l)\" superClass=\"gnu.c.link.option.libs\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.paths.1835228071\" name=\"Library search path (-L)\" superClass=\"gnu.c.link.option.paths\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.group.1121043738\" name=\"Group libraries (-Wl,--start-group  ...  -Wl,--end-group)\" superClass=\"gnu.c.link.option.group\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.ldflags.1597991572\" name=\"Linker flags\" superClass=\"gnu.c.link.option.ldflags\"/>\n\t\t\t\t\t\t\t\t<option IS_BUILTIN_EMPTY=\"false\" IS_VALUE_EMPTY=\"false\" id=\"gnu.c.link.option.other.1799645043\" name=\"Other options (-Xlinker [option])\" superClass=\"gnu.c.link.option.other\" valueType=\"stringList\">\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"-no-warn-rwx-segments\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"-Map=&quot;${BuildArtifactFileBaseName}.map&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"--gc-sections\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"-print-memory-usage\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"--sort-section=alignment\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"--cref\"/>\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.userobjs.1369998574\" name=\"Other objects\" superClass=\"gnu.c.link.option.userobjs\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.shared.1625219708\" name=\"Shared (-shared)\" superClass=\"gnu.c.link.option.shared\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.soname.458013285\" name=\"Shared object name (-Wl,-soname=)\" superClass=\"gnu.c.link.option.soname\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.implname.1838709141\" name=\"Import Library name (-Wl,--out-implib=)\" superClass=\"gnu.c.link.option.implname\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.defname.350130278\" name=\"DEF file name (-Wl,--output-def=)\" superClass=\"gnu.c.link.option.defname\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.debugging.prof.1424628191\" name=\"Generate prof information (-p)\" superClass=\"gnu.c.link.option.debugging.prof\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.debugging.gprof.895049199\" name=\"Generate gprof information (-pg)\" superClass=\"gnu.c.link.option.debugging.gprof\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.debugging.codecov.172887066\" name=\"Generate gcov information (-ftest-coverage -fprofile-arcs)\" superClass=\"gnu.c.link.option.debugging.codecov\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.gcc.lto.817182272\" name=\"Enable Link-time optimization (-flto)\" superClass=\"com.crt.advproject.link.gcc.lto\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.gcc.lto.optmization.level.1977865959\" name=\"Link-time optimization level\" superClass=\"com.crt.advproject.link.gcc.lto.optmization.level\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.manage.1766142691\" name=\"Manage linker script\" superClass=\"com.crt.advproject.link.manage\" value=\"true\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.script.1418058172\" name=\"Linker script\" superClass=\"com.crt.advproject.link.script\" value=\"frdm-rw612-xpresso-freertos-builtin_Debug.ld\" valueType=\"string\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.scriptdir.427141575\" name=\"Script path\" superClass=\"com.crt.advproject.link.scriptdir\" value=\"\" valueType=\"string\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.crpenable.737087216\" name=\"Enable automatic placement of Code Read Protection field in image\" superClass=\"com.crt.advproject.link.crpenable\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.flashconfigenable.249252447\" name=\"Enable automatic placement of Flash Configuration field in image\" superClass=\"com.crt.advproject.link.flashconfigenable\" value=\"true\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.ecrp.1764582056\" name=\"Enhanced CRP\" superClass=\"com.crt.advproject.link.ecrp\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.gcc.nanofloat.69994400\" name=\"Enable printf float \" superClass=\"com.crt.advproject.link.gcc.nanofloat\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.gcc.nanofloat.scanf.1710662524\" name=\"Enable scanf float \" superClass=\"com.crt.advproject.link.gcc.nanofloat.scanf\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.toram.1325404266\" name=\"Link application to RAM\" superClass=\"com.crt.advproject.link.toram\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.stackOffset.53782419\" name=\"Stack offset\" superClass=\"com.crt.advproject.link.stackOffset\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.gcc.multicore.empty.1634925133\" name=\"No Multicore options for this project\" superClass=\"com.crt.advproject.link.gcc.multicore.empty\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.config.781204747\" name=\"Obsolete (Config)\" superClass=\"com.crt.advproject.link.config\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.store.428087271\" name=\"Obsolete (Store)\" superClass=\"com.crt.advproject.link.store\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.securestate.549845677\" name=\"TrustZone Project Type\" superClass=\"com.crt.advproject.link.securestate\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.sgstubs.placement.1684651482\" name=\"Secure Gateway Placement\" superClass=\"com.crt.advproject.link.sgstubs.placement\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.sgstubenable.1080552755\" name=\"Enable generation of Secure Gateway Import Library\" superClass=\"com.crt.advproject.link.sgstubenable\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.nonsecureobject.564792286\" name=\"Secure Gateway Import Library\" superClass=\"com.crt.advproject.link.nonsecureobject\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.inimplib.1381387973\" name=\"Input Secure Gateway Import Library\" superClass=\"com.crt.advproject.link.inimplib\"/>\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.c.linker.input.1197763117\" superClass=\"cdt.managedbuild.tool.gnu.c.linker.input\">\n\t\t\t\t\t\t\t\t\t<additionalInput kind=\"additionalinputdependency\" paths=\"$(USER_OBJS)\"/>\n\t\t\t\t\t\t\t\t\t<additionalInput kind=\"additionalinput\" paths=\"$(LIBS)\"/>\n\t\t\t\t\t\t\t\t</inputType>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"com.crt.advproject.tool.debug.debug.1355242400\" name=\"MCU Debugger\" superClass=\"com.crt.advproject.tool.debug.debug\">\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.linkserver.debug.prevent.debug.1370173586\" name=\"Prevent Debugging\" superClass=\"com.crt.advproject.linkserver.debug.prevent.debug\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.miscellaneous.end_of_heap.116609490\" name=\"Last used address of the heap\" superClass=\"com.crt.advproject.miscellaneous.end_of_heap\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.miscellaneous.pvHeapStart.147953889\" name=\"First address of the heap\" superClass=\"com.crt.advproject.miscellaneous.pvHeapStart\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.miscellaneous.pvHeapLimit.943015446\" name=\"Maximum extent of heap\" superClass=\"com.crt.advproject.miscellaneous.pvHeapLimit\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.debugger.security.nonsecureimageenable.2073387055\" name=\"Enable pre-programming of Non-Secure Image\" superClass=\"com.crt.advproject.debugger.security.nonsecureimageenable\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.debugger.security.nonsecureimage.475310832\" name=\"Non-Secure Project\" superClass=\"com.crt.advproject.debugger.security.nonsecureimage\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t</toolChain>\n\t\t\t\t\t</folderInfo>\n\t\t\t\t\t<fileInfo id=\"com.crt.advproject.config.exe.debug.252552941.49670529\" name=\"wm_net.h\" rcbsApplicability=\"disable\" resourcePath=\"wifi/incl/port/net/wm_net.h\" toolsToInvoke=\"\"/>\n\t\t\t\t\t<fileInfo id=\"com.crt.advproject.config.exe.debug.252552941.1155936406\" name=\"frdm-rw612-xpresso-freertos-builtin JLink Debug.launch\" rcbsApplicability=\"disable\" resourcePath=\"frdm-rw612-xpresso-freertos-builtin JLink Debug.launch\" toolsToInvoke=\"\"/>\n\t\t\t\t\t<sourceEntries>\n\t\t\t\t\t\t<entry flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"CMSIS\"/>\n\t\t\t\t\t\t<entry flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"board\"/>\n\t\t\t\t\t\t<entry excluding=\"conn_fwloader/fw_bin|wifi_bt_module\" flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"component\"/>\n\t\t\t\t\t\t<entry flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"device\"/>\n\t\t\t\t\t\t<entry flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"drivers\"/>\n\t\t\t\t\t\t<entry flags=\"VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"flash\"/>\n\t\t\t\t\t\t<entry flags=\"VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"flash_config\"/>\n\t\t\t\t\t\t<entry excluding=\"freertos-kernel/portable/MemMang/heap_4.c\" flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"freertos\"/>\n\t\t\t\t\t\t<entry flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"linkscripts\"/>\n\t\t\t\t\t\t<entry flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"source\"/>\n\t\t\t\t\t\t<entry flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"startup\"/>\n\t\t\t\t\t\t<entry flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"utilities\"/>\n\t\t\t\t\t\t<entry excluding=\"sdio_nxp_abs\" flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"wifi\"/>\n\t\t\t\t\t</sourceEntries>\n\t\t\t\t</configuration>\n\t\t\t</storageModule>\n\t\t\t<storageModule moduleId=\"org.eclipse.cdt.core.externalSettings\"/>\n\t\t</cconfiguration>\n\t\t<cconfiguration id=\"com.crt.advproject.config.exe.release.438620977\">\n\t\t\t<storageModule buildSystemId=\"org.eclipse.cdt.managedbuilder.core.configurationDataProvider\" id=\"com.crt.advproject.config.exe.release.438620977\" moduleId=\"org.eclipse.cdt.core.settings\" name=\"Release\">\n\t\t\t\t<externalSettings/>\n\t\t\t\t<extensions>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.ELF\" point=\"org.eclipse.cdt.core.BinaryParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GNU_ELF\" point=\"org.eclipse.cdt.core.BinaryParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GmakeErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GASErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GLDErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.CWDLocator\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t\t<extension id=\"org.eclipse.cdt.core.GCCErrorParser\" point=\"org.eclipse.cdt.core.ErrorParser\"/>\n\t\t\t\t</extensions>\n\t\t\t</storageModule>\n\t\t\t<storageModule moduleId=\"cdtBuildSystem\" version=\"4.0.0\">\n\t\t\t\t<configuration artifactExtension=\"axf\" artifactName=\"${ProjName}\" buildArtefactType=\"org.eclipse.cdt.build.core.buildArtefactType.exe\" buildProperties=\"org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe\" cleanCommand=\"rm -rf\" description=\"Release build\" errorParsers=\"org.eclipse.cdt.core.CWDLocator;org.eclipse.cdt.core.GmakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.GASErrorParser\" id=\"com.crt.advproject.config.exe.release.438620977\" name=\"Release\" parent=\"com.crt.advproject.config.exe.release\" postannouncebuildStep=\"Performing post-build steps\" postbuildStep=\"arm-none-eabi-size &quot;${BuildArtifactFileName}&quot;; # arm-none-eabi-objcopy -v -O binary &quot;${BuildArtifactFileName}&quot; &quot;${BuildArtifactFileBaseName}.bin&quot; ; # checksum -p ${TargetChip} -d &quot;${BuildArtifactFileBaseName}.bin&quot;;  \">\n\t\t\t\t\t<folderInfo id=\"com.crt.advproject.config.exe.release.438620977.\" name=\"/\" resourcePath=\"\">\n\t\t\t\t\t\t<toolChain id=\"com.crt.advproject.toolchain.exe.release.2007539146\" name=\"NXP MCU Tools\" superClass=\"com.crt.advproject.toolchain.exe.release\">\n\t\t\t\t\t\t\t<targetPlatform binaryParser=\"org.eclipse.cdt.core.ELF;org.eclipse.cdt.core.GNU_ELF\" id=\"com.crt.advproject.platform.exe.release.641432788\" name=\"ARM-based MCU (Release)\" superClass=\"com.crt.advproject.platform.exe.release\"/>\n\t\t\t\t\t\t\t<builder buildPath=\"${workspace_loc:/frdmrw612_wifi_webconfig}/Release\" id=\"com.crt.advproject.builder.exe.release.241112212\" keepEnvironmentInBuildfile=\"false\" managedBuildOn=\"true\" name=\"Gnu Make Builder\" superClass=\"com.crt.advproject.builder.exe.release\"/>\n\t\t\t\t\t\t\t<tool id=\"com.crt.advproject.cpp.exe.release.1596685002\" name=\"MCU C++ Compiler\" superClass=\"com.crt.advproject.cpp.exe.release\">\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.arch.116589304\" name=\"Architecture\" superClass=\"com.crt.advproject.cpp.arch\" useByScannerDiscovery=\"true\" value=\"com.crt.advproject.cpp.target.cm33_nodsp\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.fpu.542354228\" name=\"Floating point\" superClass=\"com.crt.advproject.cpp.fpu\" useByScannerDiscovery=\"true\" value=\"com.crt.advproject.cpp.fpu.none\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.misc.dialect.245134384\" name=\"Language standard\" superClass=\"com.crt.advproject.cpp.misc.dialect\" useByScannerDiscovery=\"true\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.dialect.flags.1351349642\" name=\"Other dialect flags\" superClass=\"gnu.cpp.compiler.option.dialect.flags\" useByScannerDiscovery=\"true\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.preprocessor.nostdinc.1879486032\" name=\"Do not search system directories (-nostdinc)\" superClass=\"gnu.cpp.compiler.option.preprocessor.nostdinc\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.preprocessor.preprocess.896596026\" name=\"Preprocess only (-E)\" superClass=\"gnu.cpp.compiler.option.preprocessor.preprocess\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option IS_BUILTIN_EMPTY=\"false\" IS_VALUE_EMPTY=\"false\" id=\"gnu.cpp.compiler.option.preprocessor.def.923113260\" name=\"Defined symbols (-D)\" superClass=\"gnu.cpp.compiler.option.preprocessor.def\" useByScannerDiscovery=\"false\" valueType=\"definedSymbols\">\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"__NEWLIB__\"/>\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.preprocessor.undef.2056534191\" name=\"Undefined symbols (-U)\" superClass=\"gnu.cpp.compiler.option.preprocessor.undef\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.include.paths.1831667362\" name=\"Include paths (-I)\" superClass=\"gnu.cpp.compiler.option.include.paths\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.include.files.1069708188\" name=\"Include files (-include)\" superClass=\"gnu.cpp.compiler.option.include.files\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.optimization.flags.436207732\" name=\"Other optimization flags\" superClass=\"gnu.cpp.compiler.option.optimization.flags\" useByScannerDiscovery=\"false\" value=\"-fno-common\" valueType=\"string\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.debugging.prof.2074541825\" name=\"Generate prof information (-p)\" superClass=\"gnu.cpp.compiler.option.debugging.prof\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.debugging.gprof.298185060\" name=\"Generate gprof information (-pg)\" superClass=\"gnu.cpp.compiler.option.debugging.gprof\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.debugging.codecov.685895710\" name=\"Generate gcov information (-ftest-coverage -fprofile-arcs)\" superClass=\"gnu.cpp.compiler.option.debugging.codecov\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.debugging.sanitaddress.1471668431\" name=\"Sanitize address (-fsanitize=address)\" superClass=\"gnu.cpp.compiler.option.debugging.sanitaddress\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.debugging.sanitpointers.1219517196\" name=\"Sanitize pointer operations (-fsanitize=pointer-compare -fsanitize=pointer-subtract)\" superClass=\"gnu.cpp.compiler.option.debugging.sanitpointers\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.debugging.sanitthread.1997687118\" name=\"Sanitize data race in multi-thread (-fsanitize=thread)\" superClass=\"gnu.cpp.compiler.option.debugging.sanitthread\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.debugging.sanitleak.2140634450\" name=\"Sanitize memory leak (-fsanitize=leak)\" superClass=\"gnu.cpp.compiler.option.debugging.sanitleak\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.debugging.sanitundef.436182296\" name=\"Sanitize undefined behavior (-fsanitize=undefined)\" superClass=\"gnu.cpp.compiler.option.debugging.sanitundef\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.syntax.1659932703\" name=\"Check syntax only (-fsyntax-only)\" superClass=\"gnu.cpp.compiler.option.warnings.syntax\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.pedantic.835194107\" name=\"Pedantic (-pedantic)\" superClass=\"gnu.cpp.compiler.option.warnings.pedantic\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.pedantic.error.542580823\" name=\"Pedantic warnings as errors (-pedantic-errors)\" superClass=\"gnu.cpp.compiler.option.warnings.pedantic.error\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.nowarn.368038692\" name=\"Inhibit all warnings (-w)\" superClass=\"gnu.cpp.compiler.option.warnings.nowarn\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.allwarn.167751024\" name=\"All warnings (-Wall)\" superClass=\"gnu.cpp.compiler.option.warnings.allwarn\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.extrawarn.1331737451\" name=\"Extra warnings (-Wextra)\" superClass=\"gnu.cpp.compiler.option.warnings.extrawarn\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.toerrors.543218817\" name=\"Warnings as errors (-Werror)\" superClass=\"gnu.cpp.compiler.option.warnings.toerrors\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wconversion.2049502853\" name=\"Implicit conversion warnings (-Wconversion)\" superClass=\"gnu.cpp.compiler.option.warnings.wconversion\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wcastalign.363871621\" name=\"Pointer cast with different alignment (-Wcast-align)\" superClass=\"gnu.cpp.compiler.option.warnings.wcastalign\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wcastqual.831273188\" name=\"Removing type qualifier from cast target type (-Wcast-qual)\" superClass=\"gnu.cpp.compiler.option.warnings.wcastqual\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wctordtorprivacy.1267982676\" name=\"All ctor and dtor private (-Wctor-dtor-privacy)\" superClass=\"gnu.cpp.compiler.option.warnings.wctordtorprivacy\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wdisabledopt.1888880773\" name=\"Requested optimization pass is disabled (-Wdisabled-optimization)\" superClass=\"gnu.cpp.compiler.option.warnings.wdisabledopt\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wlogicalop.1121315817\" name=\"Suspicious uses of logical operators (-Wlogical-op)\" superClass=\"gnu.cpp.compiler.option.warnings.wlogicalop\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wmissingdecl.689520900\" name=\"Global function without previous declaration (-Wmissing-declarations)\" superClass=\"gnu.cpp.compiler.option.warnings.wmissingdecl\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wmissingincdir.843219438\" name=\"User-supplied include directory does not exist (-Wmissing-include-dirs)\" superClass=\"gnu.cpp.compiler.option.warnings.wmissingincdir\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wnoexccept.950212625\" name=\"Noexcept false but never throw exception (-Wnoexcept)\" superClass=\"gnu.cpp.compiler.option.warnings.wnoexccept\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.woldstylecast.1622281161\" name=\"C-style cast used (-Wold-style-cast)\" superClass=\"gnu.cpp.compiler.option.warnings.woldstylecast\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.woverloadedvirtual.1524480636\" name=\"Function hides virtual functions from base class (-Woverloaded-virtual)\" superClass=\"gnu.cpp.compiler.option.warnings.woverloadedvirtual\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wredundantdecl.326638133\" name=\"More than one declaration in the same scope (-Wredundant-decls)\" superClass=\"gnu.cpp.compiler.option.warnings.wredundantdecl\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wshadow.1007946877\" name=\"Local symbol shadows upper scope symbol (-Wshadow)\" superClass=\"gnu.cpp.compiler.option.warnings.wshadow\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wsignconv.1294094718\" name=\"Implicit conversions that may change the sign (-Wsign-conversion)\" superClass=\"gnu.cpp.compiler.option.warnings.wsignconv\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wsignpromo.119042307\" name=\"Overload resolution promotes unsigned to signed type (-Wsign-promo)\" superClass=\"gnu.cpp.compiler.option.warnings.wsignpromo\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wstrictnullsent.1658981738\" name=\"Use of an uncasted NULL as sentinel (-Wstrict-null-sentinel)\" superClass=\"gnu.cpp.compiler.option.warnings.wstrictnullsent\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wswitchdef.9149539\" name=\"A switch statement does not have a default case (-Wswitch-default)\" superClass=\"gnu.cpp.compiler.option.warnings.wswitchdef\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wundef.1747839900\" name=\"An undefined identifier is evaluated in an #if directive (-Wundef)\" superClass=\"gnu.cpp.compiler.option.warnings.wundef\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.weffcpp.596262917\" name=\"Effective C++ guidelines (-Weffc++)\" superClass=\"gnu.cpp.compiler.option.warnings.weffcpp\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.warnings.wfloatequal.744374283\" name=\"Direct float equal check (-Wfloat-equal)\" superClass=\"gnu.cpp.compiler.option.warnings.wfloatequal\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.other.other.1794202210\" name=\"Other flags\" superClass=\"gnu.cpp.compiler.option.other.other\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.other.otherExcludedFromScannerDiscovery.1029128619\" name=\"Other flags (excluded from discovery)\" superClass=\"gnu.cpp.compiler.option.other.otherExcludedFromScannerDiscovery\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.other.verbose.1182551543\" name=\"Verbose (-v)\" superClass=\"gnu.cpp.compiler.option.other.verbose\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.other.pic.1610580975\" name=\"Position Independent Code (-fPIC)\" superClass=\"gnu.cpp.compiler.option.other.pic\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.misc.hardening.1149468153\" name=\"Hardening options (-fstack-protector-all -Wformat=2 -Wformat-security -Wstrict-overflow)\" superClass=\"gnu.cpp.compiler.option.misc.hardening\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.compiler.option.misc.randomization.701093430\" name=\"Address randomization (-fPIE)\" superClass=\"gnu.cpp.compiler.option.misc.randomization\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.lto.845678630\" name=\"Enable Link-time optimization (-flto)\" superClass=\"com.crt.advproject.cpp.lto\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.lto.fat.355850805\" name=\"Fat lto objects (-ffat-lto-objects)\" superClass=\"com.crt.advproject.cpp.lto.fat\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.merge.constants.254247978\" name=\"Merge Identical Constants (-fmerge-constants)\" superClass=\"com.crt.advproject.cpp.merge.constants\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.prefixmap.886128852\" name=\"Remove path from __FILE__ (-fmacro-prefix-map)\" superClass=\"com.crt.advproject.cpp.prefixmap\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.thumb.1336357669\" name=\"Thumb mode\" superClass=\"com.crt.advproject.cpp.thumb\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.thumbinterwork.870412139\" name=\"Enable Thumb interworking\" superClass=\"com.crt.advproject.cpp.thumbinterwork\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.securestate.217473417\" name=\"TrustZone Project Type\" superClass=\"com.crt.advproject.cpp.securestate\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.hdrlib.644497181\" name=\"Library headers\" superClass=\"com.crt.advproject.cpp.hdrlib\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.specs.948443979\" name=\"Specs\" superClass=\"com.crt.advproject.cpp.specs\" useByScannerDiscovery=\"false\" value=\"com.crt.advproject.cpp.specs.newlibnano\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.stackusage.674440589\" name=\"Generate Stack Usage Info (-fstack-usage)\" superClass=\"com.crt.advproject.cpp.stackusage\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.config.433567866\" name=\"Obsolete (Config)\" superClass=\"com.crt.advproject.cpp.config\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.cpp.store.1116601121\" name=\"Obsolete (Store)\" superClass=\"com.crt.advproject.cpp.store\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"com.crt.advproject.gcc.exe.release.1059172906\" name=\"MCU C Compiler\" superClass=\"com.crt.advproject.gcc.exe.release\">\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.thumb.1700261609\" name=\"Thumb mode\" superClass=\"com.crt.advproject.gcc.thumb\" useByScannerDiscovery=\"false\" value=\"true\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.arch.1457953656\" name=\"Architecture\" superClass=\"com.crt.advproject.gcc.arch\" useByScannerDiscovery=\"true\" value=\"com.crt.advproject.gcc.target.cm33_nodsp\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.c.misc.dialect.23975419\" name=\"Language standard\" superClass=\"com.crt.advproject.c.misc.dialect\" useByScannerDiscovery=\"true\" value=\"com.crt.advproject.misc.dialect.gnu99\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.dialect.flags.1922620387\" name=\"Other dialect flags\" superClass=\"gnu.c.compiler.option.dialect.flags\" useByScannerDiscovery=\"true\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.preprocessor.nostdinc.642350499\" name=\"Do not search system directories (-nostdinc)\" superClass=\"gnu.c.compiler.option.preprocessor.nostdinc\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.preprocessor.preprocess.31080972\" name=\"Preprocess only (-E)\" superClass=\"gnu.c.compiler.option.preprocessor.preprocess\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option IS_BUILTIN_EMPTY=\"false\" IS_VALUE_EMPTY=\"false\" id=\"gnu.c.compiler.option.preprocessor.def.symbols.1557566913\" name=\"Defined symbols (-D)\" superClass=\"gnu.c.compiler.option.preprocessor.def.symbols\" useByScannerDiscovery=\"false\" valueType=\"definedSymbols\">\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"FSL_SDK_DRIVER_QUICK_ACCESS_ENABLE=1\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"USE_RTOS=1\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"PRINTF_ADVANCED_ENABLE=1\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"SDK_DEBUGCONSOLE_UART\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"CPU_RW612ETA2I\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"MCUXPRESSO_SDK\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"BOOT_HEADER_ENABLE=1\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"MFLASH_FILE_BASEADDR=7340032\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"FSL_OSA_TASK_ENABLE=1\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"OSA_USED\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"_XOPEN_SOURCE=500\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"SDK_OS_FREE_RTOS\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"SERIAL_PORT_TYPE_UART=1\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"CPU_RW612ETA2I_cm33_nodsp\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"SDK_DEBUGCONSOLE=1\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"CR_INTEGER_PRINTF\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"__MCUXPRESSO\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"__USE_CMSIS\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"NDEBUG\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"__NEWLIB__\"/>\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.preprocessor.undef.symbol.1344655517\" name=\"Undefined symbols (-U)\" superClass=\"gnu.c.compiler.option.preprocessor.undef.symbol\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option IS_BUILTIN_EMPTY=\"false\" IS_VALUE_EMPTY=\"false\" id=\"gnu.c.compiler.option.include.paths.1197061145\" name=\"Include paths (-I)\" superClass=\"gnu.c.compiler.option.include.paths\" useByScannerDiscovery=\"false\" valueType=\"includePath\">\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/source}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/wifidriver}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/incl}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/incl/wlcmgr}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/wifidriver/incl}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/wifidriver/wpa_supp_if}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/wifidriver/wpa_supp_if/incl}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/certs}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/firmware_dnld}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/sdio_nxp_abs}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/sdio_nxp_abs/incl}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/drivers/freertos}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/osa}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/conn_fwloader/include}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/conn_fwloader/fw_bin}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/conn_fwloader/fw_bin/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/conn_fwloader/fw_bin/rw61x}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/conn_fwloader/fw_bin/script}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/flash/mflash/frdmrw612}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/flash/mflash}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/imu_adapter}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/utilities}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/lwip/src/apps/httpsrv}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/drivers}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/incl/wifidriver}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/incl/port/net}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/port/net}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/incl/port/net/hooks}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/lwip/port}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/lwip/src}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/lwip/src/include}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/edgefast_wifi/include}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/freertos/freertos-kernel/portable/GCC/ARM_CM33_NTZ/non_secure}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/flash_config}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/device}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/platforms/rw61x}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/incl/port/osa}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/wifi_bt_firmware}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/port/osa}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/wifi_bt_module/AzureWave/tx_pwr_limits}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/wifi_bt_module/Murata/tx_pwr_limits}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/wifi_bt_module/u-blox/tx_pwr_limits}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/dhcpd}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/lwip/src/include/lwip/apps}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/freertos/freertos-kernel/include}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/lists}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/serial_manager}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/uart}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/lwip/port/sys_arch/dynamic}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/CMSIS}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxClEls/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxClEls/inc/internal}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxClMemory/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxClMemory/inc/internal}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxCsslMemory/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxCsslMemory/inc/internal}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/platforms/rw61x/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxClBuffer/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxClBuffer/inc/internal}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxClCore/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxCsslParamIntegrity/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxCsslFlowProtection/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxCsslSecureCounter/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxCsslCPreProcessor/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/compiler}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/component/els_pkc/src/comps/mcuxCsslDataIntegrity/inc}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/board}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/.}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/wifi/template}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/lwip/template}&quot;\"/>\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.include.files.131827527\" name=\"Include files (-include)\" superClass=\"gnu.c.compiler.option.include.files\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.optimization.flags.1867664504\" name=\"Other optimization flags\" superClass=\"gnu.c.compiler.option.optimization.flags\" useByScannerDiscovery=\"false\" value=\"-fno-common\" valueType=\"string\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.debugging.prof.1021771123\" name=\"Generate prof information (-p)\" superClass=\"gnu.c.compiler.option.debugging.prof\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.debugging.gprof.759601849\" name=\"Generate gprof information (-pg)\" superClass=\"gnu.c.compiler.option.debugging.gprof\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.debugging.codecov.1867894972\" name=\"Generate gcov information (-ftest-coverage -fprofile-arcs)\" superClass=\"gnu.c.compiler.option.debugging.codecov\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.debugging.sanitaddress.1558605785\" name=\"Sanitize address (-fsanitize=address)\" superClass=\"gnu.c.compiler.option.debugging.sanitaddress\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.debugging.sanitpointers.265802137\" name=\"Sanitize pointer operations (-fsanitize=pointer-compare -fsanitize=pointer-subtract)\" superClass=\"gnu.c.compiler.option.debugging.sanitpointers\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.debugging.sanitthread.1778863145\" name=\"Sanitize data race in multi-thread (-fsanitize=thread)\" superClass=\"gnu.c.compiler.option.debugging.sanitthread\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.debugging.sanitleak.2017000879\" name=\"Sanitize memory leak (-fsanitize=leak)\" superClass=\"gnu.c.compiler.option.debugging.sanitleak\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.debugging.sanitundef.1991064966\" name=\"Sanitize undefined behavior (-fsanitize=undefined)\" superClass=\"gnu.c.compiler.option.debugging.sanitundef\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.syntax.1707433346\" name=\"Check syntax only (-fsyntax-only)\" superClass=\"gnu.c.compiler.option.warnings.syntax\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.pedantic.913866005\" name=\"Pedantic (-pedantic)\" superClass=\"gnu.c.compiler.option.warnings.pedantic\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.pedantic.error.290529535\" name=\"Pedantic warnings as errors (-pedantic-errors)\" superClass=\"gnu.c.compiler.option.warnings.pedantic.error\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.nowarn.1791260335\" name=\"Inhibit all warnings (-w)\" superClass=\"gnu.c.compiler.option.warnings.nowarn\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.allwarn.1712991385\" name=\"All warnings (-Wall)\" superClass=\"gnu.c.compiler.option.warnings.allwarn\" useByScannerDiscovery=\"false\" value=\"false\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.extrawarn.1017739553\" name=\"Extra warnings (-Wextra)\" superClass=\"gnu.c.compiler.option.warnings.extrawarn\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.toerrors.1877864261\" name=\"Warnings as errors (-Werror)\" superClass=\"gnu.c.compiler.option.warnings.toerrors\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wconversion.1039511757\" name=\"Implicit conversion warnings (-Wconversion)\" superClass=\"gnu.c.compiler.option.warnings.wconversion\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wcastalign.26294245\" name=\"Pointer cast with different alignment (-Wcast-align)\" superClass=\"gnu.c.compiler.option.warnings.wcastalign\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wcastqual.1424135105\" name=\"Removing type qualifier from cast target type (-Wcast-qual)\" superClass=\"gnu.c.compiler.option.warnings.wcastqual\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wdisabledopt.232463805\" name=\"Requested optimization pass is disabled (-Wdisabled-optimization)\" superClass=\"gnu.c.compiler.option.warnings.wdisabledopt\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wlogicalop.831918603\" name=\"Suspicious uses of logical operators (-Wlogical-op)\" superClass=\"gnu.c.compiler.option.warnings.wlogicalop\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wmissingdecl.245365548\" name=\"Global function without previous declaration (-Wmissing-declarations)\" superClass=\"gnu.c.compiler.option.warnings.wmissingdecl\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wmissingincdir.1114992972\" name=\"User-supplied include directory does not exist (-Wmissing-include-dirs)\" superClass=\"gnu.c.compiler.option.warnings.wmissingincdir\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wredundantdecl.1247193675\" name=\"More than one declaration in the same scope (-Wredundant-decls)\" superClass=\"gnu.c.compiler.option.warnings.wredundantdecl\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wshadow.49874029\" name=\"Local symbol shadows upper scope symbol (-Wshadow)\" superClass=\"gnu.c.compiler.option.warnings.wshadow\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wsignconv.1714885763\" name=\"Implicit conversions that may change the sign (-Wsign-conversion)\" superClass=\"gnu.c.compiler.option.warnings.wsignconv\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wswitchdef.600608801\" name=\"A switch statement does not have a default case (-Wswitch-default)\" superClass=\"gnu.c.compiler.option.warnings.wswitchdef\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wundef.1770500247\" name=\"An undefined identifier is evaluated in an #if directive (-Wundef)\" superClass=\"gnu.c.compiler.option.warnings.wundef\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wwritestrings.1135856279\" name=\"Treat strings always as const (-Wwrite-strings)\" superClass=\"gnu.c.compiler.option.warnings.wwritestrings\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.warnings.wfloatequal.1679179730\" name=\"Direct float equal check (-Wfloat-equal)\" superClass=\"gnu.c.compiler.option.warnings.wfloatequal\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.misc.other.685451524\" name=\"Other flags\" superClass=\"gnu.c.compiler.option.misc.other\" useByScannerDiscovery=\"false\" value=\"-mcpu=cortex-m33+nodsp -c -ffunction-sections -fdata-sections -fno-builtin -imacros &quot;${workspace_loc:/${ProjName}/source/wifi_config.h}&quot;\" valueType=\"string\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.misc.otherExcludedFromScannerDiscovery.900170600\" name=\"Other flags (excluded from discovery)\" superClass=\"gnu.c.compiler.option.misc.otherExcludedFromScannerDiscovery\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.misc.verbose.2018545036\" name=\"Verbose (-v)\" superClass=\"gnu.c.compiler.option.misc.verbose\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.misc.ansi.437365787\" name=\"Support ANSI programs (-ansi)\" superClass=\"gnu.c.compiler.option.misc.ansi\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.misc.pic.371600978\" name=\"Position Independent Code (-fPIC)\" superClass=\"gnu.c.compiler.option.misc.pic\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.misc.hardening.315987394\" name=\"Hardening options (-fstack-protector-all -Wformat=2 -Wformat-security -Wstrict-overflow)\" superClass=\"gnu.c.compiler.option.misc.hardening\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.compiler.option.misc.randomization.1013375426\" name=\"Address randomization (-fPIE)\" superClass=\"gnu.c.compiler.option.misc.randomization\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.lto.1354276992\" name=\"Enable Link-time optimization (-flto)\" superClass=\"com.crt.advproject.gcc.lto\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.lto.fat.1755151093\" name=\"Fat lto objects (-ffat-lto-objects)\" superClass=\"com.crt.advproject.gcc.lto.fat\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.merge.constants.1009314775\" name=\"Merge Identical Constants (-fmerge-constants)\" superClass=\"com.crt.advproject.gcc.merge.constants\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.prefixmap.1021310164\" name=\"Remove path from __FILE__ (-fmacro-prefix-map)\" superClass=\"com.crt.advproject.gcc.prefixmap\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.fpu.1993816271\" name=\"Floating point\" superClass=\"com.crt.advproject.gcc.fpu\" useByScannerDiscovery=\"true\" value=\"com.crt.advproject.gcc.fpu.fpv5sp.hard\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.thumbinterwork.521330424\" name=\"Enable Thumb interworking\" superClass=\"com.crt.advproject.gcc.thumbinterwork\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.securestate.1706693411\" name=\"TrustZone Project Type\" superClass=\"com.crt.advproject.gcc.securestate\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.hdrlib.1249080015\" name=\"Library headers\" superClass=\"com.crt.advproject.gcc.hdrlib\" useByScannerDiscovery=\"false\" value=\"com.crt.advproject.gcc.hdrlib.newlibnano\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.specs.847957526\" name=\"Specs\" superClass=\"com.crt.advproject.gcc.specs\" useByScannerDiscovery=\"false\" value=\"com.crt.advproject.gcc.specs.newlibnano\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.stackusage.830211330\" name=\"Generate Stack Usage Info (-fstack-usage)\" superClass=\"com.crt.advproject.gcc.stackusage\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.config.1615666627\" name=\"Obsolete (Config)\" superClass=\"com.crt.advproject.gcc.config\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.store.1659723024\" name=\"Obsolete (Store)\" superClass=\"com.crt.advproject.gcc.store\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.exe.release.option.optimization.level.214857229\" name=\"Optimization Level\" superClass=\"com.crt.advproject.gcc.exe.release.option.optimization.level\" useByScannerDiscovery=\"true\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.exe.release.option.debugging.level.1717067386\" name=\"Debug Level\" superClass=\"com.crt.advproject.gcc.exe.release.option.debugging.level\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gcc.exe.release.option.debugging.other.1624058782\" name=\"Other debugging flags\" superClass=\"com.crt.advproject.gcc.exe.release.option.debugging.other\" useByScannerDiscovery=\"false\"/>\n\t\t\t\t\t\t\t\t<inputType id=\"com.crt.advproject.compiler.input.1119421287\" superClass=\"com.crt.advproject.compiler.input\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"com.crt.advproject.gas.exe.release.1383944148\" name=\"MCU Assembler\" superClass=\"com.crt.advproject.gas.exe.release\">\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gas.thumb.1118452349\" name=\"Thumb mode\" superClass=\"com.crt.advproject.gas.thumb\" value=\"true\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gas.arch.1678925751\" name=\"Architecture\" superClass=\"com.crt.advproject.gas.arch\" value=\"com.crt.advproject.gas.target.cm33_nodsp\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.both.asm.option.flags.crt.1902694289\" name=\"Assembler flags\" superClass=\"gnu.both.asm.option.flags.crt\" value=\"-c -x assembler-with-cpp -D__NEWLIB__\" valueType=\"string\"/>\n\t\t\t\t\t\t\t\t<option IS_BUILTIN_EMPTY=\"false\" IS_VALUE_EMPTY=\"false\" id=\"gnu.both.asm.option.include.paths.1480729505\" name=\"Include paths (-I)\" superClass=\"gnu.both.asm.option.include.paths\" valueType=\"includePath\">\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/source}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/freertos/freertos-kernel/include}&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"&quot;${workspace_loc:/${ProjName}/board}&quot;\"/>\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option id=\"gnu.both.asm.option.warnings.nowarn.296162795\" name=\"Suppress warnings (-W)\" superClass=\"gnu.both.asm.option.warnings.nowarn\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.both.asm.option.version.1096692273\" name=\"Announce version (-v)\" superClass=\"gnu.both.asm.option.version\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gas.fpu.1507342171\" name=\"Floating point\" superClass=\"com.crt.advproject.gas.fpu\" value=\"com.crt.advproject.gas.fpu.fpv5sp.hard\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gas.thumbinterwork.1674043546\" name=\"Enable Thumb interworking\" superClass=\"com.crt.advproject.gas.thumbinterwork\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gas.hdrlib.794149614\" name=\"Library headers\" superClass=\"com.crt.advproject.gas.hdrlib\" value=\"com.crt.advproject.gas.hdrlib.newlibnano\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gas.specs.393821879\" name=\"Specs\" superClass=\"com.crt.advproject.gas.specs\" value=\"com.crt.advproject.gas.specs.newlibnano\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gas.config.559633334\" name=\"Obsolete (Config)\" superClass=\"com.crt.advproject.gas.config\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gas.store.1279729079\" name=\"Obsolete (Store)\" superClass=\"com.crt.advproject.gas.store\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gas.debug.1021273495\" name=\"Debug level\" superClass=\"com.crt.advproject.gas.debug\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.gas.option.debugging.other.56005020\" name=\"Other debugging flags\" superClass=\"com.crt.advproject.gas.option.debugging.other\" value=\"-gdwarf-4\" valueType=\"string\"/>\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.assembler.input.1873911520\" superClass=\"cdt.managedbuild.tool.gnu.assembler.input\"/>\n\t\t\t\t\t\t\t\t<inputType id=\"com.crt.advproject.assembler.input.681352778\" name=\"Additional Assembly Source Files\" superClass=\"com.crt.advproject.assembler.input\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"com.crt.advproject.link.cpp.exe.release.35887060\" name=\"MCU C++ Linker\" superClass=\"com.crt.advproject.link.cpp.exe.release\">\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.arch.289844113\" name=\"Architecture\" superClass=\"com.crt.advproject.link.cpp.arch\" value=\"com.crt.advproject.link.cpp.target.cm33_nodsp\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.fpu.176431493\" name=\"Floating point\" superClass=\"com.crt.advproject.link.cpp.fpu\" value=\"com.crt.advproject.link.cpp.fpu.none\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.nostart.563677365\" name=\"Do not use standard start files (-nostartfiles)\" superClass=\"gnu.cpp.link.option.nostart\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.nodeflibs.1588750344\" name=\"Do not use default libraries (-nodefaultlibs)\" superClass=\"gnu.cpp.link.option.nodeflibs\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.nostdlibs.1339018896\" name=\"No startup or default libs (-nostdlib)\" superClass=\"gnu.cpp.link.option.nostdlibs\" value=\"true\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.strip.92961567\" name=\"Omit all symbol information (-s)\" superClass=\"gnu.cpp.link.option.strip\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.libs.1372726364\" name=\"Libraries (-l)\" superClass=\"gnu.cpp.link.option.libs\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.paths.2065104666\" name=\"Library search path (-L)\" superClass=\"gnu.cpp.link.option.paths\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.group.2107811315\" name=\"Group libraries (-Wl,--start-group  ...  -Wl,--end-group)\" superClass=\"gnu.cpp.link.option.group\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.flags.1232087363\" name=\"Linker flags\" superClass=\"gnu.cpp.link.option.flags\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.other.559769752\" name=\"Other options (-Xlinker [option])\" superClass=\"gnu.cpp.link.option.other\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.userobjs.1554189986\" name=\"Other objects\" superClass=\"gnu.cpp.link.option.userobjs\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.shared.1834767298\" name=\"Shared (-shared)\" superClass=\"gnu.cpp.link.option.shared\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.soname.1170580244\" name=\"Shared object name (-Wl,-soname=)\" superClass=\"gnu.cpp.link.option.soname\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.implname.533319850\" name=\"Import Library name (-Wl,--out-implib=)\" superClass=\"gnu.cpp.link.option.implname\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.defname.1564463653\" name=\"DEF file name (-Wl,--output-def=)\" superClass=\"gnu.cpp.link.option.defname\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.debugging.prof.1743439949\" name=\"Generate prof information (-p)\" superClass=\"gnu.cpp.link.option.debugging.prof\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.debugging.gprof.665435379\" name=\"Generate gprof information (-pg)\" superClass=\"gnu.cpp.link.option.debugging.gprof\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.cpp.link.option.debugging.codecov.1514526221\" name=\"Generate gcov information (-ftest-coverage -fprofile-arcs)\" superClass=\"gnu.cpp.link.option.debugging.codecov\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.lto.1147484310\" name=\"Enable Link-time optimization (-flto)\" superClass=\"com.crt.advproject.link.cpp.lto\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.lto.optmization.level.839027142\" name=\"Link-time optimization level\" superClass=\"com.crt.advproject.link.cpp.lto.optmization.level\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.thumb.1714509863\" name=\"Thumb mode\" superClass=\"com.crt.advproject.link.cpp.thumb\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.manage.1010357970\" name=\"Manage linker script\" superClass=\"com.crt.advproject.link.cpp.manage\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.script.1979180127\" name=\"Linker script\" superClass=\"com.crt.advproject.link.cpp.script\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.scriptdir.2111621902\" name=\"Script path\" superClass=\"com.crt.advproject.link.cpp.scriptdir\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.crpenable.502166984\" name=\"Enable automatic placement of Code Read Protection field in image\" superClass=\"com.crt.advproject.link.cpp.crpenable\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.flashconfigenable.1653194340\" name=\"Enable automatic placement of Flash Configuration field in image\" superClass=\"com.crt.advproject.link.cpp.flashconfigenable\" value=\"true\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.ecrp.912310448\" name=\"Enhanced CRP\" superClass=\"com.crt.advproject.link.cpp.ecrp\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.hdrlib.1453750339\" name=\"Library\" superClass=\"com.crt.advproject.link.cpp.hdrlib\" value=\"com.crt.advproject.cpp.link.hdrlib.newlibnano.nohost\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.nanofloat.1379965290\" name=\"Enable printf float \" superClass=\"com.crt.advproject.link.cpp.nanofloat\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.nanofloat.scanf.1502371623\" name=\"Enable scanf float \" superClass=\"com.crt.advproject.link.cpp.nanofloat.scanf\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.toram.225096446\" name=\"Link application to RAM\" superClass=\"com.crt.advproject.link.cpp.toram\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.memory.load.image.cpp.1927351041\" name=\"Plain load image\" superClass=\"com.crt.advproject.link.memory.load.image.cpp\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.memory.heapAndStack.style.cpp.668543506\" name=\"Heap and Stack placement\" superClass=\"com.crt.advproject.link.memory.heapAndStack.style.cpp\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.stackOffset.2066768182\" name=\"Stack offset\" superClass=\"com.crt.advproject.link.cpp.stackOffset\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.memory.heapAndStack.cpp.669494958\" name=\"Heap and Stack options\" superClass=\"com.crt.advproject.link.memory.heapAndStack.cpp\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.memory.data.cpp.1605147883\" name=\"Global data placement\" superClass=\"com.crt.advproject.link.memory.data.cpp\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.memory.sections.cpp.657598863\" name=\"Extra linker script input sections\" superClass=\"com.crt.advproject.link.memory.sections.cpp\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.multicore.slave.1316902609\" name=\"Multicore configuration\" superClass=\"com.crt.advproject.link.cpp.multicore.slave\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.multicore.master.1683739160\" name=\"Multicore master\" superClass=\"com.crt.advproject.link.cpp.multicore.master\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.multicore.empty.506782287\" name=\"No Multicore options for this project\" superClass=\"com.crt.advproject.link.cpp.multicore.empty\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.multicore.master.userobjs.136476664\" name=\"Slave Objects (not visible)\" superClass=\"com.crt.advproject.link.cpp.multicore.master.userobjs\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.config.1179816857\" name=\"Obsolete (Config)\" superClass=\"com.crt.advproject.link.cpp.config\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.store.826432201\" name=\"Obsolete (Store)\" superClass=\"com.crt.advproject.link.cpp.store\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.securestate.1798664166\" name=\"TrustZone Project Type\" superClass=\"com.crt.advproject.link.cpp.securestate\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.sgstubs.placement.257324916\" name=\"Secure Gateway Placement\" superClass=\"com.crt.advproject.link.cpp.sgstubs.placement\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.sgstubenable.19294980\" name=\"Enable generation of Secure Gateway Import Library\" superClass=\"com.crt.advproject.link.cpp.sgstubenable\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.nonsecureobject.682297953\" name=\"Secure Gateway Import Library\" superClass=\"com.crt.advproject.link.cpp.nonsecureobject\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.cpp.inimplib.911627039\" name=\"Input Secure Gateway Import Library\" superClass=\"com.crt.advproject.link.cpp.inimplib\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"com.crt.advproject.link.exe.release.1796248478\" name=\"MCU Linker\" superClass=\"com.crt.advproject.link.exe.release\">\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.thumb.1282025773\" name=\"Thumb mode\" superClass=\"com.crt.advproject.link.thumb\" value=\"true\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.memory.load.image.307522021\" name=\"Plain load image\" superClass=\"com.crt.advproject.link.memory.load.image\" value=\"\" valueType=\"string\"/>\n\t\t\t\t\t\t\t\t<option defaultValue=\"com.crt.advproject.heapAndStack.mcuXpressoStyle\" id=\"com.crt.advproject.link.memory.heapAndStack.style.1006432238\" name=\"Heap and Stack placement\" superClass=\"com.crt.advproject.link.memory.heapAndStack.style\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.memory.heapAndStack.329623045\" name=\"Heap and Stack options\" superClass=\"com.crt.advproject.link.memory.heapAndStack\" value=\"&amp;Heap:Default;Default;0x15f90&amp;Stack:Default;Default;0x800\" valueType=\"string\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.memory.data.384024264\" name=\"Global data placement\" superClass=\"com.crt.advproject.link.memory.data\" value=\"\" valueType=\"string\"/>\n\t\t\t\t\t\t\t\t<option IS_BUILTIN_EMPTY=\"false\" IS_VALUE_EMPTY=\"true\" id=\"com.crt.advproject.link.memory.sections.734863838\" name=\"Extra linker script input sections\" superClass=\"com.crt.advproject.link.memory.sections\" valueType=\"stringList\"/>\n\t\t\t\t\t\t\t\t<option IS_BUILTIN_EMPTY=\"false\" IS_VALUE_EMPTY=\"true\" id=\"com.crt.advproject.link.gcc.multicore.master.userobjs.1076254301\" name=\"Slave Objects (not visible)\" superClass=\"com.crt.advproject.link.gcc.multicore.master.userobjs\" valueType=\"userObjs\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.gcc.multicore.slave.525105318\" name=\"Multicore configuration\" superClass=\"com.crt.advproject.link.gcc.multicore.slave\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.arch.560581080\" name=\"Architecture\" superClass=\"com.crt.advproject.link.arch\" value=\"com.crt.advproject.link.target.cm33_nodsp\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.nostart.1694118519\" name=\"Do not use standard start files (-nostartfiles)\" superClass=\"gnu.c.link.option.nostart\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.nodeflibs.1880672085\" name=\"Do not use default libraries (-nodefaultlibs)\" superClass=\"gnu.c.link.option.nodeflibs\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.nostdlibs.1782346728\" name=\"No startup or default libs (-nostdlib)\" superClass=\"gnu.c.link.option.nostdlibs\" value=\"true\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.strip.1285794723\" name=\"Omit all symbol information (-s)\" superClass=\"gnu.c.link.option.strip\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.noshared.852216313\" name=\"No shared libraries (-static)\" superClass=\"gnu.c.link.option.noshared\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.libs.1412361055\" name=\"Libraries (-l)\" superClass=\"gnu.c.link.option.libs\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.paths.144293356\" name=\"Library search path (-L)\" superClass=\"gnu.c.link.option.paths\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.group.2108115602\" name=\"Group libraries (-Wl,--start-group  ...  -Wl,--end-group)\" superClass=\"gnu.c.link.option.group\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.ldflags.703389183\" name=\"Linker flags\" superClass=\"gnu.c.link.option.ldflags\"/>\n\t\t\t\t\t\t\t\t<option IS_BUILTIN_EMPTY=\"false\" IS_VALUE_EMPTY=\"false\" id=\"gnu.c.link.option.other.389584879\" name=\"Other options (-Xlinker [option])\" superClass=\"gnu.c.link.option.other\" valueType=\"stringList\">\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"-no-warn-rwx-segments\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"-Map=&quot;${BuildArtifactFileBaseName}.map&quot;\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"--gc-sections\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"-print-memory-usage\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"--sort-section=alignment\"/>\n\t\t\t\t\t\t\t\t\t<listOptionValue builtIn=\"false\" value=\"--cref\"/>\n\t\t\t\t\t\t\t\t</option>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.userobjs.221766604\" name=\"Other objects\" superClass=\"gnu.c.link.option.userobjs\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.shared.2107864212\" name=\"Shared (-shared)\" superClass=\"gnu.c.link.option.shared\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.soname.1743870400\" name=\"Shared object name (-Wl,-soname=)\" superClass=\"gnu.c.link.option.soname\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.implname.1504662000\" name=\"Import Library name (-Wl,--out-implib=)\" superClass=\"gnu.c.link.option.implname\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.defname.868023803\" name=\"DEF file name (-Wl,--output-def=)\" superClass=\"gnu.c.link.option.defname\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.debugging.prof.1045505147\" name=\"Generate prof information (-p)\" superClass=\"gnu.c.link.option.debugging.prof\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.debugging.gprof.450669885\" name=\"Generate gprof information (-pg)\" superClass=\"gnu.c.link.option.debugging.gprof\"/>\n\t\t\t\t\t\t\t\t<option id=\"gnu.c.link.option.debugging.codecov.1866932643\" name=\"Generate gcov information (-ftest-coverage -fprofile-arcs)\" superClass=\"gnu.c.link.option.debugging.codecov\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.gcc.lto.298108731\" name=\"Enable Link-time optimization (-flto)\" superClass=\"com.crt.advproject.link.gcc.lto\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.gcc.lto.optmization.level.39481577\" name=\"Link-time optimization level\" superClass=\"com.crt.advproject.link.gcc.lto.optmization.level\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.fpu.468384680\" name=\"Floating point\" superClass=\"com.crt.advproject.link.fpu\" value=\"com.crt.advproject.link.fpu.fpv5sp.hard\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.manage.2067414721\" name=\"Manage linker script\" superClass=\"com.crt.advproject.link.manage\" value=\"true\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.script.2063312850\" name=\"Linker script\" superClass=\"com.crt.advproject.link.script\" value=\"frdm-rw612-xpresso-freertos-builtin_Release.ld\" valueType=\"string\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.scriptdir.980911141\" name=\"Script path\" superClass=\"com.crt.advproject.link.scriptdir\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.crpenable.384672127\" name=\"Enable automatic placement of Code Read Protection field in image\" superClass=\"com.crt.advproject.link.crpenable\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.flashconfigenable.1099279461\" name=\"Enable automatic placement of Flash Configuration field in image\" superClass=\"com.crt.advproject.link.flashconfigenable\" value=\"true\" valueType=\"boolean\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.ecrp.1380541347\" name=\"Enhanced CRP\" superClass=\"com.crt.advproject.link.ecrp\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.gcc.hdrlib.488079335\" name=\"Library\" superClass=\"com.crt.advproject.link.gcc.hdrlib\" value=\"com.crt.advproject.gcc.link.hdrlib.newlibnano.nohost\" valueType=\"enumerated\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.gcc.nanofloat.1189016349\" name=\"Enable printf float \" superClass=\"com.crt.advproject.link.gcc.nanofloat\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.gcc.nanofloat.scanf.483196119\" name=\"Enable scanf float \" superClass=\"com.crt.advproject.link.gcc.nanofloat.scanf\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.toram.1856728509\" name=\"Link application to RAM\" superClass=\"com.crt.advproject.link.toram\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.stackOffset.1459930769\" name=\"Stack offset\" superClass=\"com.crt.advproject.link.stackOffset\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.gcc.multicore.master.1887637832\" name=\"Multicore master\" superClass=\"com.crt.advproject.link.gcc.multicore.master\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.gcc.multicore.empty.2001495194\" name=\"No Multicore options for this project\" superClass=\"com.crt.advproject.link.gcc.multicore.empty\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.config.1922487468\" name=\"Obsolete (Config)\" superClass=\"com.crt.advproject.link.config\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.store.908213121\" name=\"Obsolete (Store)\" superClass=\"com.crt.advproject.link.store\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.securestate.1237011711\" name=\"TrustZone Project Type\" superClass=\"com.crt.advproject.link.securestate\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.sgstubs.placement.1953785846\" name=\"Secure Gateway Placement\" superClass=\"com.crt.advproject.link.sgstubs.placement\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.sgstubenable.1364235338\" name=\"Enable generation of Secure Gateway Import Library\" superClass=\"com.crt.advproject.link.sgstubenable\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.nonsecureobject.38053095\" name=\"Secure Gateway Import Library\" superClass=\"com.crt.advproject.link.nonsecureobject\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.link.inimplib.1183785230\" name=\"Input Secure Gateway Import Library\" superClass=\"com.crt.advproject.link.inimplib\"/>\n\t\t\t\t\t\t\t\t<inputType id=\"cdt.managedbuild.tool.gnu.c.linker.input.2025198933\" superClass=\"cdt.managedbuild.tool.gnu.c.linker.input\">\n\t\t\t\t\t\t\t\t\t<additionalInput kind=\"additionalinputdependency\" paths=\"$(USER_OBJS)\"/>\n\t\t\t\t\t\t\t\t\t<additionalInput kind=\"additionalinput\" paths=\"$(LIBS)\"/>\n\t\t\t\t\t\t\t\t</inputType>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t\t<tool id=\"com.crt.advproject.tool.debug.release.1082520937\" name=\"MCU Debugger\" superClass=\"com.crt.advproject.tool.debug.release\">\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.miscellaneous.end_of_heap.1818360975\" name=\"Last used address of the heap\" superClass=\"com.crt.advproject.miscellaneous.end_of_heap\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.miscellaneous.pvHeapStart.2144777792\" name=\"First address of the heap\" superClass=\"com.crt.advproject.miscellaneous.pvHeapStart\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.miscellaneous.pvHeapLimit.1762095255\" name=\"Maximum extent of heap\" superClass=\"com.crt.advproject.miscellaneous.pvHeapLimit\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.debugger.security.nonsecureimageenable.1515614492\" name=\"Enable pre-programming of Non-Secure Image\" superClass=\"com.crt.advproject.debugger.security.nonsecureimageenable\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.debugger.security.nonsecureimage.1090477179\" name=\"Non-Secure Project\" superClass=\"com.crt.advproject.debugger.security.nonsecureimage\"/>\n\t\t\t\t\t\t\t\t<option id=\"com.crt.advproject.linkserver.debug.prevent.release.59864048\" name=\"Prevent Debugging\" superClass=\"com.crt.advproject.linkserver.debug.prevent.release\"/>\n\t\t\t\t\t\t\t</tool>\n\t\t\t\t\t\t</toolChain>\n\t\t\t\t\t</folderInfo>\n\t\t\t\t\t<sourceEntries>\n\t\t\t\t\t\t<entry flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"CMSIS\"/>\n\t\t\t\t\t\t<entry flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"board\"/>\n\t\t\t\t\t\t<entry flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"component\"/>\n\t\t\t\t\t\t<entry flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"device\"/>\n\t\t\t\t\t\t<entry flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"drivers\"/>\n\t\t\t\t\t\t<entry flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"flash\"/>\n\t\t\t\t\t\t<entry flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"freertos\"/>\n\t\t\t\t\t\t<entry flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"linkscripts\"/>\n\t\t\t\t\t\t<entry flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"source\"/>\n\t\t\t\t\t\t<entry flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"startup\"/>\n\t\t\t\t\t\t<entry flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"utilities\"/>\n\t\t\t\t\t\t<entry flags=\"LOCAL|VALUE_WORKSPACE_PATH|RESOLVED\" kind=\"sourcePath\" name=\"wifi\"/>\n\t\t\t\t\t</sourceEntries>\n\t\t\t\t</configuration>\n\t\t\t</storageModule>\n\t\t\t<storageModule moduleId=\"org.eclipse.cdt.core.externalSettings\"/>\n\t\t</cconfiguration>\n\t</storageModule>\n\t<storageModule moduleId=\"cdtBuildSystem\" version=\"4.0.0\">\n\t\t<project id=\"frdmrw612_wifi_webconfig.null.470491832\" name=\"frdmrw612_wifi_webconfig\" projectType=\"com.crt.advproject.projecttype.exe\"/>\n\t</storageModule>\n\t<storageModule moduleId=\"scannerConfiguration\">\n\t\t<autodiscovery enabled=\"true\" problemReportingEnabled=\"true\" selectedProfileId=\"\"/>\n\t\t<scannerConfigBuildInfo instanceId=\"com.crt.advproject.config.exe.release.438620977;com.crt.advproject.config.exe.release.438620977.;com.crt.advproject.gas.exe.release.1383944148;com.crt.advproject.assembler.input.681352778\">\n\t\t\t<autodiscovery enabled=\"true\" problemReportingEnabled=\"true\" selectedProfileId=\"\"/>\n\t\t</scannerConfigBuildInfo>\n\t\t<scannerConfigBuildInfo instanceId=\"com.crt.advproject.config.exe.debug.252552941;com.crt.advproject.config.exe.debug.252552941.;com.crt.advproject.gcc.exe.debug.587026796;com.crt.advproject.compiler.input.1621627363\">\n\t\t\t<autodiscovery enabled=\"true\" problemReportingEnabled=\"true\" selectedProfileId=\"\"/>\n\t\t</scannerConfigBuildInfo>\n\t\t<scannerConfigBuildInfo instanceId=\"com.crt.advproject.config.exe.debug.252552941;com.crt.advproject.config.exe.debug.252552941.;com.crt.advproject.gas.exe.debug.64345950;com.crt.advproject.assembler.input.67269995\">\n\t\t\t<autodiscovery enabled=\"true\" problemReportingEnabled=\"true\" selectedProfileId=\"\"/>\n\t\t</scannerConfigBuildInfo>\n\t\t<scannerConfigBuildInfo instanceId=\"com.crt.advproject.config.exe.release.438620977;com.crt.advproject.config.exe.release.438620977.;com.crt.advproject.gcc.exe.release.1059172906;com.crt.advproject.compiler.input.1119421287\">\n\t\t\t<autodiscovery enabled=\"true\" problemReportingEnabled=\"true\" selectedProfileId=\"\"/>\n\t\t</scannerConfigBuildInfo>\n\t</storageModule>\n\t<storageModule moduleId=\"org.eclipse.cdt.core.LanguageSettingsProviders\"/>\n\t<storageModule moduleId=\"com.nxp.mcuxpresso.core.datamodels\">\n\t\t<sdkName>SDK_2.x_FRDM-RW612</sdkName>\n\t\t<sdkExample>frdmrw612_wifi_webconfig</sdkExample>\n\t\t<sdkVersion>2.16.100</sdkVersion>\n\t\t<sdkComponents>middleware.wifi.imu.RW612;middleware.wifi.wifidriver.RW612;platform.drivers.flexcomm_usart_freertos.RW612;component.osa_free_rtos.RW612;driver.conn_fwloader.RW612;component.mflash.frdmrw612.RW612;component.mflash_file.RW612;component.wireless_imu_adapter.RW612;utility.debug_console.RW612;platform.utilities.assert.RW612;middleware.lwip.apps.httpsrv.RW612;platform.drivers.clock.RW612;middleware.freertos-kernel.heap_3.RW612;middleware.wifi.RW612;middleware.lwip.RW612;middleware.edgefast_wifi_nxp.RW612;middleware.freertos-kernel.cm33_non_trustzone.RW612;platform.drivers.flash_config.frdmrw612.RW612;device.RW612_CMSIS.RW612;device.RW612_startup.RW612;platform.drivers.reset.RW612;platform.drivers.flexspi.RW612;platform.drivers.cache_cache64.RW612;platform.drivers.cns_io_mux.RW612;platform.drivers.lpc_gpio.RW612;platform.drivers.power.RW612;platform.drivers.ocotp.RW612;component.els_pkc.platform.rw61x_standalone_clib_gdet_sensor.RW612;platform.utilities.misc_utilities.RW612;middleware.wifi.common_files.RW612;platform.drivers.imu.RW612;middleware.wifi.osa.RW612;middleware.wifi.osa_free_rtos.RW612;platform.drivers.common.RW612;middleware.wifi.template.RW612;middleware.wifi.net.RW612;component.wifi_bt_module.tx_pwr_limits.RW612;middleware.wifi.net_free_rtos.RW612;middleware.lwip.apps.lwiperf.RW612;middleware.freertos-kernel.RW612;middleware.freertos-kernel.template.RW612;middleware.freertos-kernel.extension.RW612;platform.drivers.flexcomm.RW612;platform.drivers.flexcomm_usart.RW612;component.lists.RW612;component.osa_interface.RW612;component.mflash.common.RW612;platform.drivers.gdma.RW612;component.serial_manager.RW612;utility.str.RW612;component.serial_manager_uart.RW612;component.usart_adapter.RW612;middleware.lwip.template.RW612;middleware.lwip.sys_arch_dynamic.RW612;CMSIS_Include_core_cm.RW612;device.RW612_system.RW612;component.els_pkc.els_header_only.RW612;component.els_pkc.els_common.RW612;component.els_pkc.memory.RW612;component.els_pkc.standalone_gdet.RW612;component.els_pkc.platform.rw61x_inf_header_only.RW612;component.els_pkc.buffer.RW612;component.els_pkc.core.RW612;component.els_pkc.param_integrity.RW612;component.els_pkc.flow_protection.RW612;component.els_pkc.secure_counter.RW612;component.els_pkc.pre_processor.RW612;component.els_pkc.toolchain.RW612;component.els_pkc.data_integrity.RW612;frdmrw612_wifi_webconfig;</sdkComponents>\n\t\t<boardId>frdmrw612</boardId>\n\t\t<package>RW612ETA2I</package>\n\t\t<core>cm33_nodsp</core>\n\t\t<coreId>cm33_RW612</coreId>\n\t</storageModule>\n\t<storageModule moduleId=\"com.crt.config\">\n\t\t<projectStorage>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n&lt;TargetConfig&gt;\n&lt;Properties property_3=\"NXP\" property_4=\"RW612\" property_count=\"5\" version=\"100300\"/&gt;\n&lt;infoList vendor=\"NXP\"&gt;\n&lt;info chip=\"RW612\" name=\"RW612\"&gt;\n&lt;chip&gt;\n&lt;name&gt;RW612&lt;/name&gt;\n&lt;family&gt;RW61X&lt;/family&gt;\n&lt;vendor&gt;NXP&lt;/vendor&gt;\n&lt;memory can_program=\"true\" id=\"Flash\" is_ro=\"true\" size=\"0\" type=\"Flash\"/&gt;\n&lt;memory id=\"RAM\" size=\"1216\" type=\"RAM\"/&gt;\n&lt;memoryInstance derived_from=\"Flash\" driver=\"RW61X_FlexSPI_A_SFDP_QSPI.cfx\" edited=\"true\" id=\"QSPI_FLASH\" location=\"0x8000000\" size=\"0x800000\"/&gt;\n&lt;memoryInstance derived_from=\"RAM\" edited=\"true\" id=\"SRAM\" location=\"0x20000000\" size=\"0x130000\"/&gt;\n&lt;memoryInstance derived_from=\"RAM\" edited=\"true\" id=\"MBOX1\" location=\"0x41380000\" size=\"0x488\"/&gt;\n&lt;memoryInstance derived_from=\"RAM\" edited=\"true\" id=\"TXQ1\" location=\"0x41380488\" size=\"0x1000\"/&gt;\n&lt;memoryInstance derived_from=\"RAM\" edited=\"true\" id=\"MBOX2\" location=\"0x443c0000\" size=\"0x488\"/&gt;\n&lt;memoryInstance derived_from=\"RAM\" edited=\"true\" id=\"TXQ23\" location=\"0x443c0488\" size=\"0x1080\"/&gt;\n&lt;memoryInstance derived_from=\"RAM\" edited=\"true\" id=\"TXQ32\" location=\"0x443c1508\" size=\"0x1080\"/&gt;\n&lt;/chip&gt;\n&lt;processor&gt;\n&lt;name gcc_name=\"cortex-m33-nodsp\"&gt;Cortex-M33 (No DSP)&lt;/name&gt;\n&lt;family&gt;Cortex-M&lt;/family&gt;\n&lt;/processor&gt;\n&lt;/info&gt;\n&lt;/infoList&gt;\n&lt;/TargetConfig&gt;</projectStorage>\n\t</storageModule>\n\t<storageModule moduleId=\"openCmsis\"/>\n\t<storageModule moduleId=\"refreshScope\" versionNumber=\"2\">\n\t\t<configuration configurationName=\"Debug\"/>\n\t\t<configuration configurationName=\"Release\">\n\t\t\t<resource resourceType=\"PROJECT\" workspacePath=\"/frdm-rw612-xpresso-freertos-lwip\"/>\n\t\t</configuration>\n\t</storageModule>\n\t<storageModule moduleId=\"org.eclipse.cdt.make.core.buildtargets\"/>\n</cproject>"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/.default_mex",
    "content": "frdm-rw612-xpresso-freertos-builtin.mex"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/.project",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<projectDescription>\n\t<name>frdm-rw612-xpresso-freertos-builtin</name>\n\t<comment></comment>\n\t<projects>\n\t</projects>\n\t<buildSpec>\n\t\t<buildCommand>\n\t\t\t<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>\n\t\t\t<triggers>clean,full,incremental,</triggers>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t\t<buildCommand>\n\t\t\t<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>\n\t\t\t<triggers>full,incremental,</triggers>\n\t\t\t<arguments>\n\t\t\t</arguments>\n\t\t</buildCommand>\n\t</buildSpec>\n\t<natures>\n\t\t<nature>org.eclipse.cdt.core.cnature</nature>\n\t\t<nature>com.nxp.mcuxpresso.core.datamodels.sdkNature</nature>\n\t\t<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>\n\t\t<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>\n\t\t<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>\n\t</natures>\n</projectDescription>\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/.settings/language.settings.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<project>\n\t<configuration id=\"com.crt.advproject.config.exe.debug.252552941\" name=\"Debug\">\n\t\t<extension point=\"org.eclipse.cdt.core.LanguageSettingsProvider\">\n\t\t\t<provider copy-of=\"extension\" id=\"org.eclipse.cdt.ui.UserLanguageSettingsProvider\"/>\n\t\t\t<provider class=\"org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuildCommandParser\" id=\"com.crt.advproject.GCCBuildCommandParser\" keep-relative-paths=\"false\" name=\"MCU GCC Build Output Parser\" parameter=\"(arm-none-eabi-gcc)|(arm-none-eabi-[gc]\\+\\+)|(gcc)|([gc]\\+\\+)|(clang)\" prefer-non-shared=\"true\"/>\n\t\t\t<provider class=\"com.crt.advproject.specs.MCUGCCBuiltinSpecsDetector\" console=\"false\" env-hash=\"452102550212881743\" id=\"com.crt.advproject.GCCBuildSpecCompilerParser\" keep-relative-paths=\"false\" name=\"MCU GCC Built-in Compiler Parser\" parameter=\"${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;\" prefer-non-shared=\"true\">\n\t\t\t\t<language-scope id=\"org.eclipse.cdt.core.gcc\"/>\n\t\t\t\t<language-scope id=\"org.eclipse.cdt.core.g++\"/>\n\t\t\t</provider>\n\t\t\t<provider-reference id=\"org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider\" ref=\"shared-provider\"/>\n\t\t</extension>\n\t</configuration>\n\t<configuration id=\"com.crt.advproject.config.exe.release.438620977\" name=\"Release\">\n\t\t<extension point=\"org.eclipse.cdt.core.LanguageSettingsProvider\">\n\t\t\t<provider copy-of=\"extension\" id=\"org.eclipse.cdt.ui.UserLanguageSettingsProvider\"/>\n\t\t\t<provider copy-of=\"extension\" id=\"com.crt.advproject.GCCBuildCommandParser\"/>\n\t\t\t<provider class=\"com.crt.advproject.specs.MCUGCCBuiltinSpecsDetector\" console=\"false\" env-hash=\"470729173164118281\" id=\"com.crt.advproject.GCCBuildSpecCompilerParser\" keep-relative-paths=\"false\" name=\"MCU GCC Built-in Compiler Parser\" parameter=\"${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;\" prefer-non-shared=\"true\">\n\t\t\t\t<language-scope id=\"org.eclipse.cdt.core.gcc\"/>\n\t\t\t\t<language-scope id=\"org.eclipse.cdt.core.g++\"/>\n\t\t\t</provider>\n\t\t\t<provider-reference id=\"org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider\" ref=\"shared-provider\"/>\n\t\t</extension>\n\t</configuration>\n</project>"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/.settings/org.eclipse.core.resources.prefs",
    "content": "eclipse.preferences.version=1\nencoding/<project>=UTF-8\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/CMSIS/cmsis_compiler.h",
    "content": "/**************************************************************************//**\r\n * @file     cmsis_compiler.h\r\n * @brief    CMSIS compiler generic header file\r\n * @version  V5.1.0\r\n * @date     09. October 2018\r\n ******************************************************************************/\r\n/*\r\n * Copyright (c) 2009-2018 Arm Limited. All rights reserved.\r\n *\r\n * SPDX-License-Identifier: Apache-2.0\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the License); you may\r\n * not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\r\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n#ifndef __CMSIS_COMPILER_H\r\n#define __CMSIS_COMPILER_H\r\n\r\n#include <stdint.h>\r\n\r\n/*\r\n * Arm Compiler 4/5\r\n */\r\n#if   defined ( __CC_ARM )\r\n  #include \"cmsis_armcc.h\"\r\n\r\n\r\n/*\r\n * Arm Compiler 6.6 LTM (armclang)\r\n */\r\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100)\r\n  #include \"cmsis_armclang_ltm.h\"\r\n\r\n  /*\r\n * Arm Compiler above 6.10.1 (armclang)\r\n */\r\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100)\r\n  #include \"cmsis_armclang.h\"\r\n\r\n\r\n/*\r\n * GNU Compiler\r\n */\r\n#elif defined ( __GNUC__ )\r\n  #include \"cmsis_gcc.h\"\r\n\r\n\r\n/*\r\n * IAR Compiler\r\n */\r\n#elif defined ( __ICCARM__ )\r\n  #include <cmsis_iccarm.h>\r\n\r\n\r\n/*\r\n * TI Arm Compiler\r\n */\r\n#elif defined ( __TI_ARM__ )\r\n  #include <cmsis_ccs.h>\r\n\r\n  #ifndef   __ASM\r\n    #define __ASM                                  __asm\r\n  #endif\r\n  #ifndef   __INLINE\r\n    #define __INLINE                               inline\r\n  #endif\r\n  #ifndef   __STATIC_INLINE\r\n    #define __STATIC_INLINE                        static inline\r\n  #endif\r\n  #ifndef   __STATIC_FORCEINLINE\r\n    #define __STATIC_FORCEINLINE                   __STATIC_INLINE\r\n  #endif\r\n  #ifndef   __NO_RETURN\r\n    #define __NO_RETURN                            __attribute__((noreturn))\r\n  #endif\r\n  #ifndef   __USED\r\n    #define __USED                                 __attribute__((used))\r\n  #endif\r\n  #ifndef   __WEAK\r\n    #define __WEAK                                 __attribute__((weak))\r\n  #endif\r\n  #ifndef   __PACKED\r\n    #define __PACKED                               __attribute__((packed))\r\n  #endif\r\n  #ifndef   __PACKED_STRUCT\r\n    #define __PACKED_STRUCT                        struct __attribute__((packed))\r\n  #endif\r\n  #ifndef   __PACKED_UNION\r\n    #define __PACKED_UNION                         union __attribute__((packed))\r\n  #endif\r\n  #ifndef   __UNALIGNED_UINT32        /* deprecated */\r\n    struct __attribute__((packed)) T_UINT32 { uint32_t v; };\r\n    #define __UNALIGNED_UINT32(x)                  (((struct T_UINT32 *)(x))->v)\r\n  #endif\r\n  #ifndef   __UNALIGNED_UINT16_WRITE\r\n    __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };\r\n    #define __UNALIGNED_UINT16_WRITE(addr, val)    (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val))\r\n  #endif\r\n  #ifndef   __UNALIGNED_UINT16_READ\r\n    __PACKED_STRUCT T_UINT16_READ { uint16_t v; };\r\n    #define __UNALIGNED_UINT16_READ(addr)          (((const struct T_UINT16_READ *)(const void *)(addr))->v)\r\n  #endif\r\n  #ifndef   __UNALIGNED_UINT32_WRITE\r\n    __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };\r\n    #define __UNALIGNED_UINT32_WRITE(addr, val)    (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))\r\n  #endif\r\n  #ifndef   __UNALIGNED_UINT32_READ\r\n    __PACKED_STRUCT T_UINT32_READ { uint32_t v; };\r\n    #define __UNALIGNED_UINT32_READ(addr)          (((const struct T_UINT32_READ *)(const void *)(addr))->v)\r\n  #endif\r\n  #ifndef   __ALIGNED\r\n    #define __ALIGNED(x)                           __attribute__((aligned(x)))\r\n  #endif\r\n  #ifndef   __RESTRICT\r\n    #define __RESTRICT                             __restrict\r\n  #endif\r\n  #ifndef   __COMPILER_BARRIER\r\n    #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored.\r\n    #define __COMPILER_BARRIER()                   (void)0\r\n  #endif\r\n\r\n\r\n/*\r\n * TASKING Compiler\r\n */\r\n#elif defined ( __TASKING__ )\r\n  /*\r\n   * The CMSIS functions have been implemented as intrinsics in the compiler.\r\n   * Please use \"carm -?i\" to get an up to date list of all intrinsics,\r\n   * Including the CMSIS ones.\r\n   */\r\n\r\n  #ifndef   __ASM\r\n    #define __ASM                                  __asm\r\n  #endif\r\n  #ifndef   __INLINE\r\n    #define __INLINE                               inline\r\n  #endif\r\n  #ifndef   __STATIC_INLINE\r\n    #define __STATIC_INLINE                        static inline\r\n  #endif\r\n  #ifndef   __STATIC_FORCEINLINE\r\n    #define __STATIC_FORCEINLINE                   __STATIC_INLINE\r\n  #endif\r\n  #ifndef   __NO_RETURN\r\n    #define __NO_RETURN                            __attribute__((noreturn))\r\n  #endif\r\n  #ifndef   __USED\r\n    #define __USED                                 __attribute__((used))\r\n  #endif\r\n  #ifndef   __WEAK\r\n    #define __WEAK                                 __attribute__((weak))\r\n  #endif\r\n  #ifndef   __PACKED\r\n    #define __PACKED                               __packed__\r\n  #endif\r\n  #ifndef   __PACKED_STRUCT\r\n    #define __PACKED_STRUCT                        struct __packed__\r\n  #endif\r\n  #ifndef   __PACKED_UNION\r\n    #define __PACKED_UNION                         union __packed__\r\n  #endif\r\n  #ifndef   __UNALIGNED_UINT32        /* deprecated */\r\n    struct __packed__ T_UINT32 { uint32_t v; };\r\n    #define __UNALIGNED_UINT32(x)                  (((struct T_UINT32 *)(x))->v)\r\n  #endif\r\n  #ifndef   __UNALIGNED_UINT16_WRITE\r\n    __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };\r\n    #define __UNALIGNED_UINT16_WRITE(addr, val)    (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val))\r\n  #endif\r\n  #ifndef   __UNALIGNED_UINT16_READ\r\n    __PACKED_STRUCT T_UINT16_READ { uint16_t v; };\r\n    #define __UNALIGNED_UINT16_READ(addr)          (((const struct T_UINT16_READ *)(const void *)(addr))->v)\r\n  #endif\r\n  #ifndef   __UNALIGNED_UINT32_WRITE\r\n    __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };\r\n    #define __UNALIGNED_UINT32_WRITE(addr, val)    (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))\r\n  #endif\r\n  #ifndef   __UNALIGNED_UINT32_READ\r\n    __PACKED_STRUCT T_UINT32_READ { uint32_t v; };\r\n    #define __UNALIGNED_UINT32_READ(addr)          (((const struct T_UINT32_READ *)(const void *)(addr))->v)\r\n  #endif\r\n  #ifndef   __ALIGNED\r\n    #define __ALIGNED(x)              __align(x)\r\n  #endif\r\n  #ifndef   __RESTRICT\r\n    #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored.\r\n    #define __RESTRICT\r\n  #endif\r\n  #ifndef   __COMPILER_BARRIER\r\n    #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored.\r\n    #define __COMPILER_BARRIER()                   (void)0\r\n  #endif\r\n\r\n\r\n/*\r\n * COSMIC Compiler\r\n */\r\n#elif defined ( __CSMC__ )\r\n   #include <cmsis_csm.h>\r\n\r\n #ifndef   __ASM\r\n    #define __ASM                                  _asm\r\n  #endif\r\n  #ifndef   __INLINE\r\n    #define __INLINE                               inline\r\n  #endif\r\n  #ifndef   __STATIC_INLINE\r\n    #define __STATIC_INLINE                        static inline\r\n  #endif\r\n  #ifndef   __STATIC_FORCEINLINE\r\n    #define __STATIC_FORCEINLINE                   __STATIC_INLINE\r\n  #endif\r\n  #ifndef   __NO_RETURN\r\n    // NO RETURN is automatically detected hence no warning here\r\n    #define __NO_RETURN\r\n  #endif\r\n  #ifndef   __USED\r\n    #warning No compiler specific solution for __USED. __USED is ignored.\r\n    #define __USED\r\n  #endif\r\n  #ifndef   __WEAK\r\n    #define __WEAK                                 __weak\r\n  #endif\r\n  #ifndef   __PACKED\r\n    #define __PACKED                               @packed\r\n  #endif\r\n  #ifndef   __PACKED_STRUCT\r\n    #define __PACKED_STRUCT                        @packed struct\r\n  #endif\r\n  #ifndef   __PACKED_UNION\r\n    #define __PACKED_UNION                         @packed union\r\n  #endif\r\n  #ifndef   __UNALIGNED_UINT32        /* deprecated */\r\n    @packed struct T_UINT32 { uint32_t v; };\r\n    #define __UNALIGNED_UINT32(x)                  (((struct T_UINT32 *)(x))->v)\r\n  #endif\r\n  #ifndef   __UNALIGNED_UINT16_WRITE\r\n    __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };\r\n    #define __UNALIGNED_UINT16_WRITE(addr, val)    (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val))\r\n  #endif\r\n  #ifndef   __UNALIGNED_UINT16_READ\r\n    __PACKED_STRUCT T_UINT16_READ { uint16_t v; };\r\n    #define __UNALIGNED_UINT16_READ(addr)          (((const struct T_UINT16_READ *)(const void *)(addr))->v)\r\n  #endif\r\n  #ifndef   __UNALIGNED_UINT32_WRITE\r\n    __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };\r\n    #define __UNALIGNED_UINT32_WRITE(addr, val)    (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))\r\n  #endif\r\n  #ifndef   __UNALIGNED_UINT32_READ\r\n    __PACKED_STRUCT T_UINT32_READ { uint32_t v; };\r\n    #define __UNALIGNED_UINT32_READ(addr)          (((const struct T_UINT32_READ *)(const void *)(addr))->v)\r\n  #endif\r\n  #ifndef   __ALIGNED\r\n    #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored.\r\n    #define __ALIGNED(x)\r\n  #endif\r\n  #ifndef   __RESTRICT\r\n    #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored.\r\n    #define __RESTRICT\r\n  #endif\r\n  #ifndef   __COMPILER_BARRIER\r\n    #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored.\r\n    #define __COMPILER_BARRIER()                   (void)0\r\n  #endif\r\n\r\n\r\n#else\r\n  #error Unknown compiler.\r\n#endif\r\n\r\n\r\n#endif /* __CMSIS_COMPILER_H */\r\n\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/CMSIS/cmsis_gcc.h",
    "content": "/**************************************************************************//**\r\n * @file     cmsis_gcc.h\r\n * @brief    CMSIS compiler GCC header file\r\n * @version  V5.4.1\r\n * @date     27. May 2021\r\n ******************************************************************************/\r\n/*\r\n * Copyright (c) 2009-2021 Arm Limited. All rights reserved.\r\n *\r\n * SPDX-License-Identifier: Apache-2.0\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the License); you may\r\n * not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\r\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n#ifndef __CMSIS_GCC_H\r\n#define __CMSIS_GCC_H\r\n\r\n/* ignore some GCC warnings */\r\n#pragma GCC diagnostic push\r\n#pragma GCC diagnostic ignored \"-Wsign-conversion\"\r\n#pragma GCC diagnostic ignored \"-Wconversion\"\r\n#pragma GCC diagnostic ignored \"-Wunused-parameter\"\r\n\r\n/* Fallback for __has_builtin */\r\n#ifndef __has_builtin\r\n  #define __has_builtin(x) (0)\r\n#endif\r\n\r\n/* CMSIS compiler specific defines */\r\n#ifndef   __ASM\r\n  #define __ASM                                  __asm\r\n#endif\r\n#ifndef   __INLINE\r\n  #define __INLINE                               inline\r\n#endif\r\n#ifndef   __STATIC_INLINE\r\n  #define __STATIC_INLINE                        static inline\r\n#endif\r\n#ifndef   __STATIC_FORCEINLINE\r\n  #define __STATIC_FORCEINLINE                   __attribute__((always_inline)) static inline\r\n#endif\r\n#ifndef   __NO_RETURN\r\n  #define __NO_RETURN                            __attribute__((__noreturn__))\r\n#endif\r\n#ifndef   __USED\r\n  #define __USED                                 __attribute__((used))\r\n#endif\r\n#ifndef   __WEAK\r\n  #define __WEAK                                 __attribute__((weak))\r\n#endif\r\n#ifndef   __PACKED\r\n  #define __PACKED                               __attribute__((packed, aligned(1)))\r\n#endif\r\n#ifndef   __PACKED_STRUCT\r\n  #define __PACKED_STRUCT                        struct __attribute__((packed, aligned(1)))\r\n#endif\r\n#ifndef   __PACKED_UNION\r\n  #define __PACKED_UNION                         union __attribute__((packed, aligned(1)))\r\n#endif\r\n#ifndef   __UNALIGNED_UINT32        /* deprecated */\r\n  #pragma GCC diagnostic push\r\n  #pragma GCC diagnostic ignored \"-Wpacked\"\r\n  #pragma GCC diagnostic ignored \"-Wattributes\"\r\n  struct __attribute__((packed)) T_UINT32 { uint32_t v; };\r\n  #pragma GCC diagnostic pop\r\n  #define __UNALIGNED_UINT32(x)                  (((struct T_UINT32 *)(x))->v)\r\n#endif\r\n#ifndef   __UNALIGNED_UINT16_WRITE\r\n  #pragma GCC diagnostic push\r\n  #pragma GCC diagnostic ignored \"-Wpacked\"\r\n  #pragma GCC diagnostic ignored \"-Wattributes\"\r\n  __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; };\r\n  #pragma GCC diagnostic pop\r\n  #define __UNALIGNED_UINT16_WRITE(addr, val)    (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val))\r\n#endif\r\n#ifndef   __UNALIGNED_UINT16_READ\r\n  #pragma GCC diagnostic push\r\n  #pragma GCC diagnostic ignored \"-Wpacked\"\r\n  #pragma GCC diagnostic ignored \"-Wattributes\"\r\n  __PACKED_STRUCT T_UINT16_READ { uint16_t v; };\r\n  #pragma GCC diagnostic pop\r\n  #define __UNALIGNED_UINT16_READ(addr)          (((const struct T_UINT16_READ *)(const void *)(addr))->v)\r\n#endif\r\n#ifndef   __UNALIGNED_UINT32_WRITE\r\n  #pragma GCC diagnostic push\r\n  #pragma GCC diagnostic ignored \"-Wpacked\"\r\n  #pragma GCC diagnostic ignored \"-Wattributes\"\r\n  __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; };\r\n  #pragma GCC diagnostic pop\r\n  #define __UNALIGNED_UINT32_WRITE(addr, val)    (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val))\r\n#endif\r\n#ifndef   __UNALIGNED_UINT32_READ\r\n  #pragma GCC diagnostic push\r\n  #pragma GCC diagnostic ignored \"-Wpacked\"\r\n  #pragma GCC diagnostic ignored \"-Wattributes\"\r\n  __PACKED_STRUCT T_UINT32_READ { uint32_t v; };\r\n  #pragma GCC diagnostic pop\r\n  #define __UNALIGNED_UINT32_READ(addr)          (((const struct T_UINT32_READ *)(const void *)(addr))->v)\r\n#endif\r\n#ifndef   __ALIGNED\r\n  #define __ALIGNED(x)                           __attribute__((aligned(x)))\r\n#endif\r\n#ifndef   __RESTRICT\r\n  #define __RESTRICT                             __restrict\r\n#endif\r\n#ifndef   __COMPILER_BARRIER\r\n  #define __COMPILER_BARRIER()                   __ASM volatile(\"\":::\"memory\")\r\n#endif\r\n\r\n/* #########################  Startup and Lowlevel Init  ######################## */\r\n\r\n#ifndef __PROGRAM_START\r\n\r\n/**\r\n  \\brief   Initializes data and bss sections\r\n  \\details This default implementations initialized all data and additional bss\r\n           sections relying on .copy.table and .zero.table specified properly\r\n           in the used linker script.\r\n\r\n */\r\n__STATIC_FORCEINLINE __NO_RETURN void __cmsis_start(void)\r\n{\r\n  extern void _start(void) __NO_RETURN;\r\n\r\n  typedef struct {\r\n    uint32_t const* src;\r\n    uint32_t* dest;\r\n    uint32_t  wlen;\r\n  } __copy_table_t;\r\n\r\n  typedef struct {\r\n    uint32_t* dest;\r\n    uint32_t  wlen;\r\n  } __zero_table_t;\r\n\r\n  extern const __copy_table_t __copy_table_start__;\r\n  extern const __copy_table_t __copy_table_end__;\r\n  extern const __zero_table_t __zero_table_start__;\r\n  extern const __zero_table_t __zero_table_end__;\r\n\r\n  for (__copy_table_t const* pTable = &__copy_table_start__; pTable < &__copy_table_end__; ++pTable) {\r\n    for(uint32_t i=0u; i<pTable->wlen; ++i) {\r\n      pTable->dest[i] = pTable->src[i];\r\n    }\r\n  }\r\n\r\n  for (__zero_table_t const* pTable = &__zero_table_start__; pTable < &__zero_table_end__; ++pTable) {\r\n    for(uint32_t i=0u; i<pTable->wlen; ++i) {\r\n      pTable->dest[i] = 0u;\r\n    }\r\n  }\r\n\r\n  _start();\r\n}\r\n\r\n#define __PROGRAM_START           __cmsis_start\r\n#endif\r\n\r\n#ifndef __INITIAL_SP\r\n#define __INITIAL_SP              __StackTop\r\n#endif\r\n\r\n#ifndef __STACK_LIMIT\r\n#define __STACK_LIMIT             __StackLimit\r\n#endif\r\n\r\n#ifndef __VECTOR_TABLE\r\n#define __VECTOR_TABLE            __Vectors\r\n#endif\r\n\r\n#ifndef __VECTOR_TABLE_ATTRIBUTE\r\n#define __VECTOR_TABLE_ATTRIBUTE  __attribute__((used, section(\".vectors\")))\r\n#endif\r\n\r\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\r\n#ifndef __STACK_SEAL\r\n#define __STACK_SEAL              __StackSeal\r\n#endif\r\n\r\n#ifndef __TZ_STACK_SEAL_SIZE\r\n#define __TZ_STACK_SEAL_SIZE      8U\r\n#endif\r\n\r\n#ifndef __TZ_STACK_SEAL_VALUE\r\n#define __TZ_STACK_SEAL_VALUE     0xFEF5EDA5FEF5EDA5ULL\r\n#endif\r\n\r\n\r\n__STATIC_FORCEINLINE void __TZ_set_STACKSEAL_S (uint32_t* stackTop) {\r\n  *((uint64_t *)stackTop) = __TZ_STACK_SEAL_VALUE;\r\n}\r\n#endif\r\n\r\n\r\n/* ##########################  Core Instruction Access  ######################### */\r\n/** \\defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface\r\n  Access to dedicated instructions\r\n  @{\r\n*/\r\n\r\n/* Define macros for porting to both thumb1 and thumb2.\r\n * For thumb1, use low register (r0-r7), specified by constraint \"l\"\r\n * Otherwise, use general registers, specified by constraint \"r\" */\r\n#if defined (__thumb__) && !defined (__thumb2__)\r\n#define __CMSIS_GCC_OUT_REG(r) \"=l\" (r)\r\n#define __CMSIS_GCC_RW_REG(r) \"+l\" (r)\r\n#define __CMSIS_GCC_USE_REG(r) \"l\" (r)\r\n#else\r\n#define __CMSIS_GCC_OUT_REG(r) \"=r\" (r)\r\n#define __CMSIS_GCC_RW_REG(r) \"+r\" (r)\r\n#define __CMSIS_GCC_USE_REG(r) \"r\" (r)\r\n#endif\r\n\r\n/**\r\n  \\brief   No Operation\r\n  \\details No Operation does nothing. This instruction can be used for code alignment purposes.\r\n */\r\n#define __NOP()                             __ASM volatile (\"nop\")\r\n\r\n/**\r\n  \\brief   Wait For Interrupt\r\n  \\details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs.\r\n */\r\n#define __WFI()                             __ASM volatile (\"wfi\":::\"memory\")\r\n\r\n\r\n/**\r\n  \\brief   Wait For Event\r\n  \\details Wait For Event is a hint instruction that permits the processor to enter\r\n           a low-power state until one of a number of events occurs.\r\n */\r\n#define __WFE()                             __ASM volatile (\"wfe\":::\"memory\")\r\n\r\n\r\n/**\r\n  \\brief   Send Event\r\n  \\details Send Event is a hint instruction. It causes an event to be signaled to the CPU.\r\n */\r\n#define __SEV()                             __ASM volatile (\"sev\")\r\n\r\n\r\n/**\r\n  \\brief   Instruction Synchronization Barrier\r\n  \\details Instruction Synchronization Barrier flushes the pipeline in the processor,\r\n           so that all instructions following the ISB are fetched from cache or memory,\r\n           after the instruction has been completed.\r\n */\r\n__STATIC_FORCEINLINE void __ISB(void)\r\n{\r\n  __ASM volatile (\"isb 0xF\":::\"memory\");\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Data Synchronization Barrier\r\n  \\details Acts as a special kind of Data Memory Barrier.\r\n           It completes when all explicit memory accesses before this instruction complete.\r\n */\r\n__STATIC_FORCEINLINE void __DSB(void)\r\n{\r\n  __ASM volatile (\"dsb 0xF\":::\"memory\");\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Data Memory Barrier\r\n  \\details Ensures the apparent order of the explicit memory operations before\r\n           and after the instruction, without ensuring their completion.\r\n */\r\n__STATIC_FORCEINLINE void __DMB(void)\r\n{\r\n  __ASM volatile (\"dmb 0xF\":::\"memory\");\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Reverse byte order (32 bit)\r\n  \\details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412.\r\n  \\param [in]    value  Value to reverse\r\n  \\return               Reversed value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __REV(uint32_t value)\r\n{\r\n#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)\r\n  return __builtin_bswap32(value);\r\n#else\r\n  uint32_t result;\r\n\r\n  __ASM (\"rev %0, %1\" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );\r\n  return result;\r\n#endif\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Reverse byte order (16 bit)\r\n  \\details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856.\r\n  \\param [in]    value  Value to reverse\r\n  \\return               Reversed value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __REV16(uint32_t value)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"rev16 %0, %1\" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );\r\n  return result;\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Reverse byte order (16 bit)\r\n  \\details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000.\r\n  \\param [in]    value  Value to reverse\r\n  \\return               Reversed value\r\n */\r\n__STATIC_FORCEINLINE int16_t __REVSH(int16_t value)\r\n{\r\n#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)\r\n  return (int16_t)__builtin_bswap16(value);\r\n#else\r\n  int16_t result;\r\n\r\n  __ASM (\"revsh %0, %1\" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );\r\n  return result;\r\n#endif\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Rotate Right in unsigned value (32 bit)\r\n  \\details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.\r\n  \\param [in]    op1  Value to rotate\r\n  \\param [in]    op2  Number of Bits to rotate\r\n  \\return               Rotated value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2)\r\n{\r\n  op2 %= 32U;\r\n  if (op2 == 0U)\r\n  {\r\n    return op1;\r\n  }\r\n  return (op1 >> op2) | (op1 << (32U - op2));\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Breakpoint\r\n  \\details Causes the processor to enter Debug state.\r\n           Debug tools can use this to investigate system state when the instruction at a particular address is reached.\r\n  \\param [in]    value  is ignored by the processor.\r\n                 If required, a debugger can use it to store additional information about the breakpoint.\r\n */\r\n#define __BKPT(value)                       __ASM volatile (\"bkpt \"#value)\r\n\r\n\r\n/**\r\n  \\brief   Reverse bit order of value\r\n  \\details Reverses the bit order of the given value.\r\n  \\param [in]    value  Value to reverse\r\n  \\return               Reversed value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value)\r\n{\r\n  uint32_t result;\r\n\r\n#if ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\r\n     (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\r\n     (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    )\r\n   __ASM (\"rbit %0, %1\" : \"=r\" (result) : \"r\" (value) );\r\n#else\r\n  uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */\r\n\r\n  result = value;                      /* r will be reversed bits of v; first get LSB of v */\r\n  for (value >>= 1U; value != 0U; value >>= 1U)\r\n  {\r\n    result <<= 1U;\r\n    result |= value & 1U;\r\n    s--;\r\n  }\r\n  result <<= s;                        /* shift when v's highest bits are zero */\r\n#endif\r\n  return result;\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Count leading zeros\r\n  \\details Counts the number of leading zeros of a data value.\r\n  \\param [in]  value  Value to count the leading zeros\r\n  \\return             number of leading zeros in value\r\n */\r\n__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value)\r\n{\r\n  /* Even though __builtin_clz produces a CLZ instruction on ARM, formally\r\n     __builtin_clz(0) is undefined behaviour, so handle this case specially.\r\n     This guarantees ARM-compatible results if happening to compile on a non-ARM\r\n     target, and ensures the compiler doesn't decide to activate any\r\n     optimisations using the logic \"value was passed to __builtin_clz, so it\r\n     is non-zero\".\r\n     ARM GCC 7.3 and possibly earlier will optimise this test away, leaving a\r\n     single CLZ instruction.\r\n   */\r\n  if (value == 0U)\r\n  {\r\n    return 32U;\r\n  }\r\n  return __builtin_clz(value);\r\n}\r\n\r\n\r\n#if ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\r\n     (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\r\n     (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\r\n     (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    )\r\n/**\r\n  \\brief   LDR Exclusive (8 bit)\r\n  \\details Executes a exclusive LDR instruction for 8 bit value.\r\n  \\param [in]    ptr  Pointer to data\r\n  \\return             value of type uint8_t at (*ptr)\r\n */\r\n__STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr)\r\n{\r\n    uint32_t result;\r\n\r\n#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)\r\n   __ASM volatile (\"ldrexb %0, %1\" : \"=r\" (result) : \"Q\" (*addr) );\r\n#else\r\n    /* Prior to GCC 4.8, \"Q\" will be expanded to [rx, #0] which is not\r\n       accepted by assembler. So has to use following less efficient pattern.\r\n    */\r\n   __ASM volatile (\"ldrexb %0, [%1]\" : \"=r\" (result) : \"r\" (addr) : \"memory\" );\r\n#endif\r\n   return ((uint8_t) result);    /* Add explicit type cast here */\r\n}\r\n\r\n\r\n/**\r\n  \\brief   LDR Exclusive (16 bit)\r\n  \\details Executes a exclusive LDR instruction for 16 bit values.\r\n  \\param [in]    ptr  Pointer to data\r\n  \\return        value of type uint16_t at (*ptr)\r\n */\r\n__STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr)\r\n{\r\n    uint32_t result;\r\n\r\n#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)\r\n   __ASM volatile (\"ldrexh %0, %1\" : \"=r\" (result) : \"Q\" (*addr) );\r\n#else\r\n    /* Prior to GCC 4.8, \"Q\" will be expanded to [rx, #0] which is not\r\n       accepted by assembler. So has to use following less efficient pattern.\r\n    */\r\n   __ASM volatile (\"ldrexh %0, [%1]\" : \"=r\" (result) : \"r\" (addr) : \"memory\" );\r\n#endif\r\n   return ((uint16_t) result);    /* Add explicit type cast here */\r\n}\r\n\r\n\r\n/**\r\n  \\brief   LDR Exclusive (32 bit)\r\n  \\details Executes a exclusive LDR instruction for 32 bit values.\r\n  \\param [in]    ptr  Pointer to data\r\n  \\return        value of type uint32_t at (*ptr)\r\n */\r\n__STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr)\r\n{\r\n    uint32_t result;\r\n\r\n   __ASM volatile (\"ldrex %0, %1\" : \"=r\" (result) : \"Q\" (*addr) );\r\n   return(result);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   STR Exclusive (8 bit)\r\n  \\details Executes a exclusive STR instruction for 8 bit values.\r\n  \\param [in]  value  Value to store\r\n  \\param [in]    ptr  Pointer to location\r\n  \\return          0  Function succeeded\r\n  \\return          1  Function failed\r\n */\r\n__STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)\r\n{\r\n   uint32_t result;\r\n\r\n   __ASM volatile (\"strexb %0, %2, %1\" : \"=&r\" (result), \"=Q\" (*addr) : \"r\" ((uint32_t)value) );\r\n   return(result);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   STR Exclusive (16 bit)\r\n  \\details Executes a exclusive STR instruction for 16 bit values.\r\n  \\param [in]  value  Value to store\r\n  \\param [in]    ptr  Pointer to location\r\n  \\return          0  Function succeeded\r\n  \\return          1  Function failed\r\n */\r\n__STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)\r\n{\r\n   uint32_t result;\r\n\r\n   __ASM volatile (\"strexh %0, %2, %1\" : \"=&r\" (result), \"=Q\" (*addr) : \"r\" ((uint32_t)value) );\r\n   return(result);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   STR Exclusive (32 bit)\r\n  \\details Executes a exclusive STR instruction for 32 bit values.\r\n  \\param [in]  value  Value to store\r\n  \\param [in]    ptr  Pointer to location\r\n  \\return          0  Function succeeded\r\n  \\return          1  Function failed\r\n */\r\n__STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)\r\n{\r\n   uint32_t result;\r\n\r\n   __ASM volatile (\"strex %0, %2, %1\" : \"=&r\" (result), \"=Q\" (*addr) : \"r\" (value) );\r\n   return(result);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Remove the exclusive lock\r\n  \\details Removes the exclusive lock which is created by LDREX.\r\n */\r\n__STATIC_FORCEINLINE void __CLREX(void)\r\n{\r\n  __ASM volatile (\"clrex\" ::: \"memory\");\r\n}\r\n\r\n#endif /* ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\r\n           (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\r\n           (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\r\n           (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    ) */\r\n\r\n\r\n#if ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\r\n     (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\r\n     (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    )\r\n/**\r\n  \\brief   Signed Saturate\r\n  \\details Saturates a signed value.\r\n  \\param [in]  ARG1  Value to be saturated\r\n  \\param [in]  ARG2  Bit position to saturate to (1..32)\r\n  \\return             Saturated value\r\n */\r\n#define __SSAT(ARG1, ARG2) \\\r\n__extension__ \\\r\n({                          \\\r\n  int32_t __RES, __ARG1 = (ARG1); \\\r\n  __ASM volatile (\"ssat %0, %1, %2\" : \"=r\" (__RES) :  \"I\" (ARG2), \"r\" (__ARG1) : \"cc\" ); \\\r\n  __RES; \\\r\n })\r\n\r\n\r\n/**\r\n  \\brief   Unsigned Saturate\r\n  \\details Saturates an unsigned value.\r\n  \\param [in]  ARG1  Value to be saturated\r\n  \\param [in]  ARG2  Bit position to saturate to (0..31)\r\n  \\return             Saturated value\r\n */\r\n#define __USAT(ARG1, ARG2) \\\r\n__extension__ \\\r\n({                          \\\r\n  uint32_t __RES, __ARG1 = (ARG1); \\\r\n  __ASM volatile (\"usat %0, %1, %2\" : \"=r\" (__RES) :  \"I\" (ARG2), \"r\" (__ARG1) : \"cc\" ); \\\r\n  __RES; \\\r\n })\r\n\r\n\r\n/**\r\n  \\brief   Rotate Right with Extend (32 bit)\r\n  \\details Moves each bit of a bitstring right by one bit.\r\n           The carry input is shifted in at the left end of the bitstring.\r\n  \\param [in]    value  Value to rotate\r\n  \\return               Rotated value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"rrx %0, %1\" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );\r\n  return(result);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   LDRT Unprivileged (8 bit)\r\n  \\details Executes a Unprivileged LDRT instruction for 8 bit value.\r\n  \\param [in]    ptr  Pointer to data\r\n  \\return             value of type uint8_t at (*ptr)\r\n */\r\n__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr)\r\n{\r\n    uint32_t result;\r\n\r\n#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)\r\n   __ASM volatile (\"ldrbt %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\r\n#else\r\n    /* Prior to GCC 4.8, \"Q\" will be expanded to [rx, #0] which is not\r\n       accepted by assembler. So has to use following less efficient pattern.\r\n    */\r\n   __ASM volatile (\"ldrbt %0, [%1]\" : \"=r\" (result) : \"r\" (ptr) : \"memory\" );\r\n#endif\r\n   return ((uint8_t) result);    /* Add explicit type cast here */\r\n}\r\n\r\n\r\n/**\r\n  \\brief   LDRT Unprivileged (16 bit)\r\n  \\details Executes a Unprivileged LDRT instruction for 16 bit values.\r\n  \\param [in]    ptr  Pointer to data\r\n  \\return        value of type uint16_t at (*ptr)\r\n */\r\n__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr)\r\n{\r\n    uint32_t result;\r\n\r\n#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)\r\n   __ASM volatile (\"ldrht %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\r\n#else\r\n    /* Prior to GCC 4.8, \"Q\" will be expanded to [rx, #0] which is not\r\n       accepted by assembler. So has to use following less efficient pattern.\r\n    */\r\n   __ASM volatile (\"ldrht %0, [%1]\" : \"=r\" (result) : \"r\" (ptr) : \"memory\" );\r\n#endif\r\n   return ((uint16_t) result);    /* Add explicit type cast here */\r\n}\r\n\r\n\r\n/**\r\n  \\brief   LDRT Unprivileged (32 bit)\r\n  \\details Executes a Unprivileged LDRT instruction for 32 bit values.\r\n  \\param [in]    ptr  Pointer to data\r\n  \\return        value of type uint32_t at (*ptr)\r\n */\r\n__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr)\r\n{\r\n    uint32_t result;\r\n\r\n   __ASM volatile (\"ldrt %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) );\r\n   return(result);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   STRT Unprivileged (8 bit)\r\n  \\details Executes a Unprivileged STRT instruction for 8 bit values.\r\n  \\param [in]  value  Value to store\r\n  \\param [in]    ptr  Pointer to location\r\n */\r\n__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr)\r\n{\r\n   __ASM volatile (\"strbt %1, %0\" : \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\r\n}\r\n\r\n\r\n/**\r\n  \\brief   STRT Unprivileged (16 bit)\r\n  \\details Executes a Unprivileged STRT instruction for 16 bit values.\r\n  \\param [in]  value  Value to store\r\n  \\param [in]    ptr  Pointer to location\r\n */\r\n__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr)\r\n{\r\n   __ASM volatile (\"strht %1, %0\" : \"=Q\" (*ptr) : \"r\" ((uint32_t)value) );\r\n}\r\n\r\n\r\n/**\r\n  \\brief   STRT Unprivileged (32 bit)\r\n  \\details Executes a Unprivileged STRT instruction for 32 bit values.\r\n  \\param [in]  value  Value to store\r\n  \\param [in]    ptr  Pointer to location\r\n */\r\n__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr)\r\n{\r\n   __ASM volatile (\"strt %1, %0\" : \"=Q\" (*ptr) : \"r\" (value) );\r\n}\r\n\r\n#else  /* ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\r\n           (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\r\n           (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    ) */\r\n\r\n/**\r\n  \\brief   Signed Saturate\r\n  \\details Saturates a signed value.\r\n  \\param [in]  value  Value to be saturated\r\n  \\param [in]    sat  Bit position to saturate to (1..32)\r\n  \\return             Saturated value\r\n */\r\n__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat)\r\n{\r\n  if ((sat >= 1U) && (sat <= 32U))\r\n  {\r\n    const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U);\r\n    const int32_t min = -1 - max ;\r\n    if (val > max)\r\n    {\r\n      return max;\r\n    }\r\n    else if (val < min)\r\n    {\r\n      return min;\r\n    }\r\n  }\r\n  return val;\r\n}\r\n\r\n/**\r\n  \\brief   Unsigned Saturate\r\n  \\details Saturates an unsigned value.\r\n  \\param [in]  value  Value to be saturated\r\n  \\param [in]    sat  Bit position to saturate to (0..31)\r\n  \\return             Saturated value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat)\r\n{\r\n  if (sat <= 31U)\r\n  {\r\n    const uint32_t max = ((1U << sat) - 1U);\r\n    if (val > (int32_t)max)\r\n    {\r\n      return max;\r\n    }\r\n    else if (val < 0)\r\n    {\r\n      return 0U;\r\n    }\r\n  }\r\n  return (uint32_t)val;\r\n}\r\n\r\n#endif /* ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\r\n           (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\r\n           (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    ) */\r\n\r\n\r\n#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\r\n     (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    )\r\n/**\r\n  \\brief   Load-Acquire (8 bit)\r\n  \\details Executes a LDAB instruction for 8 bit value.\r\n  \\param [in]    ptr  Pointer to data\r\n  \\return             value of type uint8_t at (*ptr)\r\n */\r\n__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr)\r\n{\r\n    uint32_t result;\r\n\r\n   __ASM volatile (\"ldab %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) : \"memory\" );\r\n   return ((uint8_t) result);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Load-Acquire (16 bit)\r\n  \\details Executes a LDAH instruction for 16 bit values.\r\n  \\param [in]    ptr  Pointer to data\r\n  \\return        value of type uint16_t at (*ptr)\r\n */\r\n__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr)\r\n{\r\n    uint32_t result;\r\n\r\n   __ASM volatile (\"ldah %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) : \"memory\" );\r\n   return ((uint16_t) result);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Load-Acquire (32 bit)\r\n  \\details Executes a LDA instruction for 32 bit values.\r\n  \\param [in]    ptr  Pointer to data\r\n  \\return        value of type uint32_t at (*ptr)\r\n */\r\n__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr)\r\n{\r\n    uint32_t result;\r\n\r\n   __ASM volatile (\"lda %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) : \"memory\" );\r\n   return(result);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Store-Release (8 bit)\r\n  \\details Executes a STLB instruction for 8 bit values.\r\n  \\param [in]  value  Value to store\r\n  \\param [in]    ptr  Pointer to location\r\n */\r\n__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr)\r\n{\r\n   __ASM volatile (\"stlb %1, %0\" : \"=Q\" (*ptr) : \"r\" ((uint32_t)value) : \"memory\" );\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Store-Release (16 bit)\r\n  \\details Executes a STLH instruction for 16 bit values.\r\n  \\param [in]  value  Value to store\r\n  \\param [in]    ptr  Pointer to location\r\n */\r\n__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr)\r\n{\r\n   __ASM volatile (\"stlh %1, %0\" : \"=Q\" (*ptr) : \"r\" ((uint32_t)value) : \"memory\" );\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Store-Release (32 bit)\r\n  \\details Executes a STL instruction for 32 bit values.\r\n  \\param [in]  value  Value to store\r\n  \\param [in]    ptr  Pointer to location\r\n */\r\n__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr)\r\n{\r\n   __ASM volatile (\"stl %1, %0\" : \"=Q\" (*ptr) : \"r\" ((uint32_t)value) : \"memory\" );\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Load-Acquire Exclusive (8 bit)\r\n  \\details Executes a LDAB exclusive instruction for 8 bit value.\r\n  \\param [in]    ptr  Pointer to data\r\n  \\return             value of type uint8_t at (*ptr)\r\n */\r\n__STATIC_FORCEINLINE uint8_t __LDAEXB(volatile uint8_t *ptr)\r\n{\r\n    uint32_t result;\r\n\r\n   __ASM volatile (\"ldaexb %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) : \"memory\" );\r\n   return ((uint8_t) result);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Load-Acquire Exclusive (16 bit)\r\n  \\details Executes a LDAH exclusive instruction for 16 bit values.\r\n  \\param [in]    ptr  Pointer to data\r\n  \\return        value of type uint16_t at (*ptr)\r\n */\r\n__STATIC_FORCEINLINE uint16_t __LDAEXH(volatile uint16_t *ptr)\r\n{\r\n    uint32_t result;\r\n\r\n   __ASM volatile (\"ldaexh %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) : \"memory\" );\r\n   return ((uint16_t) result);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Load-Acquire Exclusive (32 bit)\r\n  \\details Executes a LDA exclusive instruction for 32 bit values.\r\n  \\param [in]    ptr  Pointer to data\r\n  \\return        value of type uint32_t at (*ptr)\r\n */\r\n__STATIC_FORCEINLINE uint32_t __LDAEX(volatile uint32_t *ptr)\r\n{\r\n    uint32_t result;\r\n\r\n   __ASM volatile (\"ldaex %0, %1\" : \"=r\" (result) : \"Q\" (*ptr) : \"memory\" );\r\n   return(result);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Store-Release Exclusive (8 bit)\r\n  \\details Executes a STLB exclusive instruction for 8 bit values.\r\n  \\param [in]  value  Value to store\r\n  \\param [in]    ptr  Pointer to location\r\n  \\return          0  Function succeeded\r\n  \\return          1  Function failed\r\n */\r\n__STATIC_FORCEINLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr)\r\n{\r\n   uint32_t result;\r\n\r\n   __ASM volatile (\"stlexb %0, %2, %1\" : \"=&r\" (result), \"=Q\" (*ptr) : \"r\" ((uint32_t)value) : \"memory\" );\r\n   return(result);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Store-Release Exclusive (16 bit)\r\n  \\details Executes a STLH exclusive instruction for 16 bit values.\r\n  \\param [in]  value  Value to store\r\n  \\param [in]    ptr  Pointer to location\r\n  \\return          0  Function succeeded\r\n  \\return          1  Function failed\r\n */\r\n__STATIC_FORCEINLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr)\r\n{\r\n   uint32_t result;\r\n\r\n   __ASM volatile (\"stlexh %0, %2, %1\" : \"=&r\" (result), \"=Q\" (*ptr) : \"r\" ((uint32_t)value) : \"memory\" );\r\n   return(result);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Store-Release Exclusive (32 bit)\r\n  \\details Executes a STL exclusive instruction for 32 bit values.\r\n  \\param [in]  value  Value to store\r\n  \\param [in]    ptr  Pointer to location\r\n  \\return          0  Function succeeded\r\n  \\return          1  Function failed\r\n */\r\n__STATIC_FORCEINLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr)\r\n{\r\n   uint32_t result;\r\n\r\n   __ASM volatile (\"stlex %0, %2, %1\" : \"=&r\" (result), \"=Q\" (*ptr) : \"r\" ((uint32_t)value) : \"memory\" );\r\n   return(result);\r\n}\r\n\r\n#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\r\n           (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    ) */\r\n\r\n/*@}*/ /* end of group CMSIS_Core_InstructionInterface */\r\n\r\n\r\n/* ###########################  Core Function Access  ########################### */\r\n/** \\ingroup  CMSIS_Core_FunctionInterface\r\n    \\defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions\r\n  @{\r\n */\r\n\r\n/**\r\n  \\brief   Enable IRQ Interrupts\r\n  \\details Enables IRQ interrupts by clearing special-purpose register PRIMASK.\r\n           Can only be executed in Privileged modes.\r\n */\r\n__STATIC_FORCEINLINE void __enable_irq(void)\r\n{\r\n  __ASM volatile (\"cpsie i\" : : : \"memory\");\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Disable IRQ Interrupts\r\n  \\details Disables IRQ interrupts by setting special-purpose register PRIMASK.\r\n           Can only be executed in Privileged modes.\r\n */\r\n__STATIC_FORCEINLINE void __disable_irq(void)\r\n{\r\n  __ASM volatile (\"cpsid i\" : : : \"memory\");\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Get Control Register\r\n  \\details Returns the content of the Control Register.\r\n  \\return               Control Register value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __get_CONTROL(void)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"MRS %0, control\" : \"=r\" (result) );\r\n  return(result);\r\n}\r\n\r\n\r\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\r\n/**\r\n  \\brief   Get Control Register (non-secure)\r\n  \\details Returns the content of the non-secure Control Register when in secure mode.\r\n  \\return               non-secure Control Register value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"MRS %0, control_ns\" : \"=r\" (result) );\r\n  return(result);\r\n}\r\n#endif\r\n\r\n\r\n/**\r\n  \\brief   Set Control Register\r\n  \\details Writes the given value to the Control Register.\r\n  \\param [in]    control  Control Register value to set\r\n */\r\n__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control)\r\n{\r\n  __ASM volatile (\"MSR control, %0\" : : \"r\" (control) : \"memory\");\r\n  __ISB();\r\n}\r\n\r\n\r\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\r\n/**\r\n  \\brief   Set Control Register (non-secure)\r\n  \\details Writes the given value to the non-secure Control Register when in secure state.\r\n  \\param [in]    control  Control Register value to set\r\n */\r\n__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control)\r\n{\r\n  __ASM volatile (\"MSR control_ns, %0\" : : \"r\" (control) : \"memory\");\r\n  __ISB();\r\n}\r\n#endif\r\n\r\n\r\n/**\r\n  \\brief   Get IPSR Register\r\n  \\details Returns the content of the IPSR Register.\r\n  \\return               IPSR Register value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __get_IPSR(void)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"MRS %0, ipsr\" : \"=r\" (result) );\r\n  return(result);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Get APSR Register\r\n  \\details Returns the content of the APSR Register.\r\n  \\return               APSR Register value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __get_APSR(void)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"MRS %0, apsr\" : \"=r\" (result) );\r\n  return(result);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Get xPSR Register\r\n  \\details Returns the content of the xPSR Register.\r\n  \\return               xPSR Register value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __get_xPSR(void)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"MRS %0, xpsr\" : \"=r\" (result) );\r\n  return(result);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Get Process Stack Pointer\r\n  \\details Returns the current value of the Process Stack Pointer (PSP).\r\n  \\return               PSP Register value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __get_PSP(void)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"MRS %0, psp\"  : \"=r\" (result) );\r\n  return(result);\r\n}\r\n\r\n\r\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\r\n/**\r\n  \\brief   Get Process Stack Pointer (non-secure)\r\n  \\details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state.\r\n  \\return               PSP Register value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"MRS %0, psp_ns\"  : \"=r\" (result) );\r\n  return(result);\r\n}\r\n#endif\r\n\r\n\r\n/**\r\n  \\brief   Set Process Stack Pointer\r\n  \\details Assigns the given value to the Process Stack Pointer (PSP).\r\n  \\param [in]    topOfProcStack  Process Stack Pointer value to set\r\n */\r\n__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack)\r\n{\r\n  __ASM volatile (\"MSR psp, %0\" : : \"r\" (topOfProcStack) : );\r\n}\r\n\r\n\r\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\r\n/**\r\n  \\brief   Set Process Stack Pointer (non-secure)\r\n  \\details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state.\r\n  \\param [in]    topOfProcStack  Process Stack Pointer value to set\r\n */\r\n__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack)\r\n{\r\n  __ASM volatile (\"MSR psp_ns, %0\" : : \"r\" (topOfProcStack) : );\r\n}\r\n#endif\r\n\r\n\r\n/**\r\n  \\brief   Get Main Stack Pointer\r\n  \\details Returns the current value of the Main Stack Pointer (MSP).\r\n  \\return               MSP Register value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __get_MSP(void)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"MRS %0, msp\" : \"=r\" (result) );\r\n  return(result);\r\n}\r\n\r\n\r\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\r\n/**\r\n  \\brief   Get Main Stack Pointer (non-secure)\r\n  \\details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state.\r\n  \\return               MSP Register value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"MRS %0, msp_ns\" : \"=r\" (result) );\r\n  return(result);\r\n}\r\n#endif\r\n\r\n\r\n/**\r\n  \\brief   Set Main Stack Pointer\r\n  \\details Assigns the given value to the Main Stack Pointer (MSP).\r\n  \\param [in]    topOfMainStack  Main Stack Pointer value to set\r\n */\r\n__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack)\r\n{\r\n  __ASM volatile (\"MSR msp, %0\" : : \"r\" (topOfMainStack) : );\r\n}\r\n\r\n\r\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\r\n/**\r\n  \\brief   Set Main Stack Pointer (non-secure)\r\n  \\details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state.\r\n  \\param [in]    topOfMainStack  Main Stack Pointer value to set\r\n */\r\n__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack)\r\n{\r\n  __ASM volatile (\"MSR msp_ns, %0\" : : \"r\" (topOfMainStack) : );\r\n}\r\n#endif\r\n\r\n\r\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\r\n/**\r\n  \\brief   Get Stack Pointer (non-secure)\r\n  \\details Returns the current value of the non-secure Stack Pointer (SP) when in secure state.\r\n  \\return               SP Register value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"MRS %0, sp_ns\" : \"=r\" (result) );\r\n  return(result);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Set Stack Pointer (non-secure)\r\n  \\details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state.\r\n  \\param [in]    topOfStack  Stack Pointer value to set\r\n */\r\n__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack)\r\n{\r\n  __ASM volatile (\"MSR sp_ns, %0\" : : \"r\" (topOfStack) : );\r\n}\r\n#endif\r\n\r\n\r\n/**\r\n  \\brief   Get Priority Mask\r\n  \\details Returns the current state of the priority mask bit from the Priority Mask Register.\r\n  \\return               Priority Mask value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"MRS %0, primask\" : \"=r\" (result) );\r\n  return(result);\r\n}\r\n\r\n\r\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\r\n/**\r\n  \\brief   Get Priority Mask (non-secure)\r\n  \\details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state.\r\n  \\return               Priority Mask value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"MRS %0, primask_ns\" : \"=r\" (result) );\r\n  return(result);\r\n}\r\n#endif\r\n\r\n\r\n/**\r\n  \\brief   Set Priority Mask\r\n  \\details Assigns the given value to the Priority Mask Register.\r\n  \\param [in]    priMask  Priority Mask\r\n */\r\n__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask)\r\n{\r\n  __ASM volatile (\"MSR primask, %0\" : : \"r\" (priMask) : \"memory\");\r\n}\r\n\r\n\r\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\r\n/**\r\n  \\brief   Set Priority Mask (non-secure)\r\n  \\details Assigns the given value to the non-secure Priority Mask Register when in secure state.\r\n  \\param [in]    priMask  Priority Mask\r\n */\r\n__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask)\r\n{\r\n  __ASM volatile (\"MSR primask_ns, %0\" : : \"r\" (priMask) : \"memory\");\r\n}\r\n#endif\r\n\r\n\r\n#if ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\r\n     (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\r\n     (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    )\r\n/**\r\n  \\brief   Enable FIQ\r\n  \\details Enables FIQ interrupts by clearing special-purpose register FAULTMASK.\r\n           Can only be executed in Privileged modes.\r\n */\r\n__STATIC_FORCEINLINE void __enable_fault_irq(void)\r\n{\r\n  __ASM volatile (\"cpsie f\" : : : \"memory\");\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Disable FIQ\r\n  \\details Disables FIQ interrupts by setting special-purpose register FAULTMASK.\r\n           Can only be executed in Privileged modes.\r\n */\r\n__STATIC_FORCEINLINE void __disable_fault_irq(void)\r\n{\r\n  __ASM volatile (\"cpsid f\" : : : \"memory\");\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Get Base Priority\r\n  \\details Returns the current value of the Base Priority register.\r\n  \\return               Base Priority register value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"MRS %0, basepri\" : \"=r\" (result) );\r\n  return(result);\r\n}\r\n\r\n\r\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\r\n/**\r\n  \\brief   Get Base Priority (non-secure)\r\n  \\details Returns the current value of the non-secure Base Priority register when in secure state.\r\n  \\return               Base Priority register value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"MRS %0, basepri_ns\" : \"=r\" (result) );\r\n  return(result);\r\n}\r\n#endif\r\n\r\n\r\n/**\r\n  \\brief   Set Base Priority\r\n  \\details Assigns the given value to the Base Priority register.\r\n  \\param [in]    basePri  Base Priority value to set\r\n */\r\n__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri)\r\n{\r\n  __ASM volatile (\"MSR basepri, %0\" : : \"r\" (basePri) : \"memory\");\r\n}\r\n\r\n\r\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\r\n/**\r\n  \\brief   Set Base Priority (non-secure)\r\n  \\details Assigns the given value to the non-secure Base Priority register when in secure state.\r\n  \\param [in]    basePri  Base Priority value to set\r\n */\r\n__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri)\r\n{\r\n  __ASM volatile (\"MSR basepri_ns, %0\" : : \"r\" (basePri) : \"memory\");\r\n}\r\n#endif\r\n\r\n\r\n/**\r\n  \\brief   Set Base Priority with condition\r\n  \\details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled,\r\n           or the new value increases the BASEPRI priority level.\r\n  \\param [in]    basePri  Base Priority value to set\r\n */\r\n__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri)\r\n{\r\n  __ASM volatile (\"MSR basepri_max, %0\" : : \"r\" (basePri) : \"memory\");\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Get Fault Mask\r\n  \\details Returns the current value of the Fault Mask register.\r\n  \\return               Fault Mask register value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"MRS %0, faultmask\" : \"=r\" (result) );\r\n  return(result);\r\n}\r\n\r\n\r\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\r\n/**\r\n  \\brief   Get Fault Mask (non-secure)\r\n  \\details Returns the current value of the non-secure Fault Mask register when in secure state.\r\n  \\return               Fault Mask register value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"MRS %0, faultmask_ns\" : \"=r\" (result) );\r\n  return(result);\r\n}\r\n#endif\r\n\r\n\r\n/**\r\n  \\brief   Set Fault Mask\r\n  \\details Assigns the given value to the Fault Mask register.\r\n  \\param [in]    faultMask  Fault Mask value to set\r\n */\r\n__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask)\r\n{\r\n  __ASM volatile (\"MSR faultmask, %0\" : : \"r\" (faultMask) : \"memory\");\r\n}\r\n\r\n\r\n#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3))\r\n/**\r\n  \\brief   Set Fault Mask (non-secure)\r\n  \\details Assigns the given value to the non-secure Fault Mask register when in secure state.\r\n  \\param [in]    faultMask  Fault Mask value to set\r\n */\r\n__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask)\r\n{\r\n  __ASM volatile (\"MSR faultmask_ns, %0\" : : \"r\" (faultMask) : \"memory\");\r\n}\r\n#endif\r\n\r\n#endif /* ((defined (__ARM_ARCH_7M__      ) && (__ARM_ARCH_7M__      == 1)) || \\\r\n           (defined (__ARM_ARCH_7EM__     ) && (__ARM_ARCH_7EM__     == 1)) || \\\r\n           (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1))    ) */\r\n\r\n\r\n#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\r\n     (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    )\r\n\r\n/**\r\n  \\brief   Get Process Stack Pointer Limit\r\n  Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure\r\n  Stack Pointer Limit register hence zero is returned always in non-secure\r\n  mode.\r\n\r\n  \\details Returns the current value of the Process Stack Pointer Limit (PSPLIM).\r\n  \\return               PSPLIM Register value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void)\r\n{\r\n#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \\\r\n    (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))\r\n    // without main extensions, the non-secure PSPLIM is RAZ/WI\r\n  return 0U;\r\n#else\r\n  uint32_t result;\r\n  __ASM volatile (\"MRS %0, psplim\"  : \"=r\" (result) );\r\n  return result;\r\n#endif\r\n}\r\n\r\n#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3))\r\n/**\r\n  \\brief   Get Process Stack Pointer Limit (non-secure)\r\n  Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure\r\n  Stack Pointer Limit register hence zero is returned always.\r\n\r\n  \\details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state.\r\n  \\return               PSPLIM Register value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void)\r\n{\r\n#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)))\r\n  // without main extensions, the non-secure PSPLIM is RAZ/WI\r\n  return 0U;\r\n#else\r\n  uint32_t result;\r\n  __ASM volatile (\"MRS %0, psplim_ns\"  : \"=r\" (result) );\r\n  return result;\r\n#endif\r\n}\r\n#endif\r\n\r\n\r\n/**\r\n  \\brief   Set Process Stack Pointer Limit\r\n  Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure\r\n  Stack Pointer Limit register hence the write is silently ignored in non-secure\r\n  mode.\r\n\r\n  \\details Assigns the given value to the Process Stack Pointer Limit (PSPLIM).\r\n  \\param [in]    ProcStackPtrLimit  Process Stack Pointer Limit value to set\r\n */\r\n__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit)\r\n{\r\n#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \\\r\n    (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))\r\n  // without main extensions, the non-secure PSPLIM is RAZ/WI\r\n  (void)ProcStackPtrLimit;\r\n#else\r\n  __ASM volatile (\"MSR psplim, %0\" : : \"r\" (ProcStackPtrLimit));\r\n#endif\r\n}\r\n\r\n\r\n#if (defined (__ARM_FEATURE_CMSE  ) && (__ARM_FEATURE_CMSE   == 3))\r\n/**\r\n  \\brief   Set Process Stack Pointer (non-secure)\r\n  Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure\r\n  Stack Pointer Limit register hence the write is silently ignored.\r\n\r\n  \\details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state.\r\n  \\param [in]    ProcStackPtrLimit  Process Stack Pointer Limit value to set\r\n */\r\n__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit)\r\n{\r\n#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)))\r\n  // without main extensions, the non-secure PSPLIM is RAZ/WI\r\n  (void)ProcStackPtrLimit;\r\n#else\r\n  __ASM volatile (\"MSR psplim_ns, %0\\n\" : : \"r\" (ProcStackPtrLimit));\r\n#endif\r\n}\r\n#endif\r\n\r\n\r\n/**\r\n  \\brief   Get Main Stack Pointer Limit\r\n  Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure\r\n  Stack Pointer Limit register hence zero is returned always in non-secure\r\n  mode.\r\n\r\n  \\details Returns the current value of the Main Stack Pointer Limit (MSPLIM).\r\n  \\return               MSPLIM Register value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void)\r\n{\r\n#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \\\r\n    (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))\r\n  // without main extensions, the non-secure MSPLIM is RAZ/WI\r\n  return 0U;\r\n#else\r\n  uint32_t result;\r\n  __ASM volatile (\"MRS %0, msplim\" : \"=r\" (result) );\r\n  return result;\r\n#endif\r\n}\r\n\r\n\r\n#if (defined (__ARM_FEATURE_CMSE  ) && (__ARM_FEATURE_CMSE   == 3))\r\n/**\r\n  \\brief   Get Main Stack Pointer Limit (non-secure)\r\n  Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure\r\n  Stack Pointer Limit register hence zero is returned always.\r\n\r\n  \\details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state.\r\n  \\return               MSPLIM Register value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void)\r\n{\r\n#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)))\r\n  // without main extensions, the non-secure MSPLIM is RAZ/WI\r\n  return 0U;\r\n#else\r\n  uint32_t result;\r\n  __ASM volatile (\"MRS %0, msplim_ns\" : \"=r\" (result) );\r\n  return result;\r\n#endif\r\n}\r\n#endif\r\n\r\n\r\n/**\r\n  \\brief   Set Main Stack Pointer Limit\r\n  Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure\r\n  Stack Pointer Limit register hence the write is silently ignored in non-secure\r\n  mode.\r\n\r\n  \\details Assigns the given value to the Main Stack Pointer Limit (MSPLIM).\r\n  \\param [in]    MainStackPtrLimit  Main Stack Pointer Limit value to set\r\n */\r\n__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit)\r\n{\r\n#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \\\r\n    (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3)))\r\n  // without main extensions, the non-secure MSPLIM is RAZ/WI\r\n  (void)MainStackPtrLimit;\r\n#else\r\n  __ASM volatile (\"MSR msplim, %0\" : : \"r\" (MainStackPtrLimit));\r\n#endif\r\n}\r\n\r\n\r\n#if (defined (__ARM_FEATURE_CMSE  ) && (__ARM_FEATURE_CMSE   == 3))\r\n/**\r\n  \\brief   Set Main Stack Pointer Limit (non-secure)\r\n  Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure\r\n  Stack Pointer Limit register hence the write is silently ignored.\r\n\r\n  \\details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state.\r\n  \\param [in]    MainStackPtrLimit  Main Stack Pointer value to set\r\n */\r\n__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit)\r\n{\r\n#if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)))\r\n  // without main extensions, the non-secure MSPLIM is RAZ/WI\r\n  (void)MainStackPtrLimit;\r\n#else\r\n  __ASM volatile (\"MSR msplim_ns, %0\" : : \"r\" (MainStackPtrLimit));\r\n#endif\r\n}\r\n#endif\r\n\r\n#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\r\n           (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1))    ) */\r\n\r\n\r\n/**\r\n  \\brief   Get FPSCR\r\n  \\details Returns the current value of the Floating Point Status/Control register.\r\n  \\return               Floating Point Status/Control register value\r\n */\r\n__STATIC_FORCEINLINE uint32_t __get_FPSCR(void)\r\n{\r\n#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \\\r\n     (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     )\r\n#if __has_builtin(__builtin_arm_get_fpscr)\r\n// Re-enable using built-in when GCC has been fixed\r\n// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2)\r\n  /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */\r\n  return __builtin_arm_get_fpscr();\r\n#else\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"VMRS %0, fpscr\" : \"=r\" (result) );\r\n  return(result);\r\n#endif\r\n#else\r\n  return(0U);\r\n#endif\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Set FPSCR\r\n  \\details Assigns the given value to the Floating Point Status/Control register.\r\n  \\param [in]    fpscr  Floating Point Status/Control value to set\r\n */\r\n__STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr)\r\n{\r\n#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \\\r\n     (defined (__FPU_USED   ) && (__FPU_USED    == 1U))     )\r\n#if __has_builtin(__builtin_arm_set_fpscr)\r\n// Re-enable using built-in when GCC has been fixed\r\n// || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2)\r\n  /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */\r\n  __builtin_arm_set_fpscr(fpscr);\r\n#else\r\n  __ASM volatile (\"VMSR fpscr, %0\" : : \"r\" (fpscr) : \"vfpcc\", \"memory\");\r\n#endif\r\n#else\r\n  (void)fpscr;\r\n#endif\r\n}\r\n\r\n\r\n/*@} end of CMSIS_Core_RegAccFunctions */\r\n\r\n\r\n/* ###################  Compiler specific Intrinsics  ########################### */\r\n/** \\defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics\r\n  Access to dedicated SIMD instructions\r\n  @{\r\n*/\r\n\r\n#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1))\r\n\r\n__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"sadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"qadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"shadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"uadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"uqadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"uhadd8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n\r\n__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"ssub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"qsub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"shsub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"usub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"uqsub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"uhsub8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n\r\n__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"sadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"qadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"shadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"uadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"uqadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"uhadd16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"ssub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"qsub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"shsub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"usub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"uqsub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"uhsub16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"sasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"qasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"shasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"uasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"uqasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"uhasx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"ssax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"qsax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"shsax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"usax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"uqsax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"uhsax %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"usad8 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"usada8 %0, %1, %2, %3\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2), \"r\" (op3) );\r\n  return(result);\r\n}\r\n\r\n#define __SSAT16(ARG1, ARG2) \\\r\n__extension__ \\\r\n({                          \\\r\n  int32_t __RES, __ARG1 = (ARG1); \\\r\n  __ASM volatile (\"ssat16 %0, %1, %2\" : \"=r\" (__RES) :  \"I\" (ARG2), \"r\" (__ARG1) : \"cc\" ); \\\r\n  __RES; \\\r\n })\r\n\r\n#define __USAT16(ARG1, ARG2) \\\r\n__extension__ \\\r\n({                          \\\r\n  uint32_t __RES, __ARG1 = (ARG1); \\\r\n  __ASM volatile (\"usat16 %0, %1, %2\" : \"=r\" (__RES) :  \"I\" (ARG2), \"r\" (__ARG1) : \"cc\" ); \\\r\n  __RES; \\\r\n })\r\n\r\n__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"uxtb16 %0, %1\" : \"=r\" (result) : \"r\" (op1));\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"uxtab16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"sxtb16 %0, %1\" : \"=r\" (result) : \"r\" (op1));\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SXTB16_RORn(uint32_t op1, uint32_t rotate)\r\n{\r\n  uint32_t result;\r\n  if (__builtin_constant_p(rotate) && ((rotate == 8U) || (rotate == 16U) || (rotate == 24U))) {\r\n    __ASM volatile (\"sxtb16 %0, %1, ROR %2\" : \"=r\" (result) : \"r\" (op1), \"i\" (rotate) );\r\n  } else {\r\n    result = __SXTB16(__ROR(op1, rotate)) ;\r\n  }\r\n  return result;\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM (\"sxtab16 %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SXTAB16_RORn(uint32_t op1, uint32_t op2, uint32_t rotate)\r\n{\r\n  uint32_t result;\r\n  if (__builtin_constant_p(rotate) && ((rotate == 8U) || (rotate == 16U) || (rotate == 24U))) {\r\n    __ASM volatile (\"sxtab16 %0, %1, %2, ROR %3\" : \"=r\" (result) : \"r\" (op1) , \"r\" (op2) , \"i\" (rotate));\r\n  } else {\r\n    result = __SXTAB16(op1, __ROR(op2, rotate));\r\n  }\r\n  return result;\r\n}\r\n\r\n\r\n__STATIC_FORCEINLINE uint32_t __SMUAD  (uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"smuad %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"smuadx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"smlad %0, %1, %2, %3\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2), \"r\" (op3) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"smladx %0, %1, %2, %3\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2), \"r\" (op3) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc)\r\n{\r\n  union llreg_u{\r\n    uint32_t w32[2];\r\n    uint64_t w64;\r\n  } llr;\r\n  llr.w64 = acc;\r\n\r\n#ifndef __ARMEB__   /* Little endian */\r\n  __ASM volatile (\"smlald %0, %1, %2, %3\" : \"=r\" (llr.w32[0]), \"=r\" (llr.w32[1]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[0]), \"1\" (llr.w32[1]) );\r\n#else               /* Big endian */\r\n  __ASM volatile (\"smlald %0, %1, %2, %3\" : \"=r\" (llr.w32[1]), \"=r\" (llr.w32[0]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[1]), \"1\" (llr.w32[0]) );\r\n#endif\r\n\r\n  return(llr.w64);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc)\r\n{\r\n  union llreg_u{\r\n    uint32_t w32[2];\r\n    uint64_t w64;\r\n  } llr;\r\n  llr.w64 = acc;\r\n\r\n#ifndef __ARMEB__   /* Little endian */\r\n  __ASM volatile (\"smlaldx %0, %1, %2, %3\" : \"=r\" (llr.w32[0]), \"=r\" (llr.w32[1]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[0]), \"1\" (llr.w32[1]) );\r\n#else               /* Big endian */\r\n  __ASM volatile (\"smlaldx %0, %1, %2, %3\" : \"=r\" (llr.w32[1]), \"=r\" (llr.w32[0]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[1]), \"1\" (llr.w32[0]) );\r\n#endif\r\n\r\n  return(llr.w64);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SMUSD  (uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"smusd %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"smusdx %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"smlsd %0, %1, %2, %3\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2), \"r\" (op3) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"smlsdx %0, %1, %2, %3\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2), \"r\" (op3) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc)\r\n{\r\n  union llreg_u{\r\n    uint32_t w32[2];\r\n    uint64_t w64;\r\n  } llr;\r\n  llr.w64 = acc;\r\n\r\n#ifndef __ARMEB__   /* Little endian */\r\n  __ASM volatile (\"smlsld %0, %1, %2, %3\" : \"=r\" (llr.w32[0]), \"=r\" (llr.w32[1]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[0]), \"1\" (llr.w32[1]) );\r\n#else               /* Big endian */\r\n  __ASM volatile (\"smlsld %0, %1, %2, %3\" : \"=r\" (llr.w32[1]), \"=r\" (llr.w32[0]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[1]), \"1\" (llr.w32[0]) );\r\n#endif\r\n\r\n  return(llr.w64);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc)\r\n{\r\n  union llreg_u{\r\n    uint32_t w32[2];\r\n    uint64_t w64;\r\n  } llr;\r\n  llr.w64 = acc;\r\n\r\n#ifndef __ARMEB__   /* Little endian */\r\n  __ASM volatile (\"smlsldx %0, %1, %2, %3\" : \"=r\" (llr.w32[0]), \"=r\" (llr.w32[1]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[0]), \"1\" (llr.w32[1]) );\r\n#else               /* Big endian */\r\n  __ASM volatile (\"smlsldx %0, %1, %2, %3\" : \"=r\" (llr.w32[1]), \"=r\" (llr.w32[0]): \"r\" (op1), \"r\" (op2) , \"0\" (llr.w32[1]), \"1\" (llr.w32[0]) );\r\n#endif\r\n\r\n  return(llr.w64);\r\n}\r\n\r\n__STATIC_FORCEINLINE uint32_t __SEL  (uint32_t op1, uint32_t op2)\r\n{\r\n  uint32_t result;\r\n\r\n  __ASM volatile (\"sel %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE  int32_t __QADD( int32_t op1,  int32_t op2)\r\n{\r\n  int32_t result;\r\n\r\n  __ASM volatile (\"qadd %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n__STATIC_FORCEINLINE  int32_t __QSUB( int32_t op1,  int32_t op2)\r\n{\r\n  int32_t result;\r\n\r\n  __ASM volatile (\"qsub %0, %1, %2\" : \"=r\" (result) : \"r\" (op1), \"r\" (op2) );\r\n  return(result);\r\n}\r\n\r\n\r\n#define __PKHBT(ARG1,ARG2,ARG3) \\\r\n__extension__ \\\r\n({                          \\\r\n  uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \\\r\n  __ASM (\"pkhbt %0, %1, %2, lsl %3\" : \"=r\" (__RES) :  \"r\" (__ARG1), \"r\" (__ARG2), \"I\" (ARG3)  ); \\\r\n  __RES; \\\r\n })\r\n\r\n#define __PKHTB(ARG1,ARG2,ARG3) \\\r\n__extension__ \\\r\n({                          \\\r\n  uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \\\r\n  if (ARG3 == 0) \\\r\n    __ASM (\"pkhtb %0, %1, %2\" : \"=r\" (__RES) :  \"r\" (__ARG1), \"r\" (__ARG2)  ); \\\r\n  else \\\r\n    __ASM (\"pkhtb %0, %1, %2, asr %3\" : \"=r\" (__RES) :  \"r\" (__ARG1), \"r\" (__ARG2), \"I\" (ARG3)  ); \\\r\n  __RES; \\\r\n })\r\n\r\n\r\n__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3)\r\n{\r\n int32_t result;\r\n\r\n __ASM (\"smmla %0, %1, %2, %3\" : \"=r\" (result): \"r\"  (op1), \"r\" (op2), \"r\" (op3) );\r\n return(result);\r\n}\r\n\r\n#endif /* (__ARM_FEATURE_DSP == 1) */\r\n/*@} end of group CMSIS_SIMD_intrinsics */\r\n\r\n\r\n#pragma GCC diagnostic pop\r\n\r\n#endif /* __CMSIS_GCC_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/CMSIS/cmsis_version.h",
    "content": "/**************************************************************************//**\r\n * @file     cmsis_version.h\r\n * @brief    CMSIS Core(M) Version definitions\r\n * @version  V5.0.5\r\n * @date     02. February 2022\r\n ******************************************************************************/\r\n/*\r\n * Copyright (c) 2009-2022 ARM Limited. All rights reserved.\r\n *\r\n * SPDX-License-Identifier: Apache-2.0\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the License); you may\r\n * not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\r\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n#if   defined ( __ICCARM__ )\r\n  #pragma system_include         /* treat file as system include file for MISRA check */\r\n#elif defined (__clang__)\r\n  #pragma clang system_header   /* treat file as system include file */\r\n#endif\r\n\r\n#ifndef __CMSIS_VERSION_H\r\n#define __CMSIS_VERSION_H\r\n\r\n/*  CMSIS Version definitions */\r\n#define __CM_CMSIS_VERSION_MAIN  ( 5U)                                      /*!< [31:16] CMSIS Core(M) main version */\r\n#define __CM_CMSIS_VERSION_SUB   ( 6U)                                      /*!< [15:0]  CMSIS Core(M) sub version */\r\n#define __CM_CMSIS_VERSION       ((__CM_CMSIS_VERSION_MAIN << 16U) | \\\r\n                                   __CM_CMSIS_VERSION_SUB           )       /*!< CMSIS Core(M) version number */\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/CMSIS/core_cm33.h",
    "content": "/**************************************************************************//**\r\n * @file     core_cm33.h\r\n * @brief    CMSIS Cortex-M33 Core Peripheral Access Layer Header File\r\n * @version  V5.2.3\r\n * @date     13. October 2021\r\n ******************************************************************************/\r\n/*\r\n * Copyright (c) 2009-2021 Arm Limited. All rights reserved.\r\n *\r\n * SPDX-License-Identifier: Apache-2.0\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the License); you may\r\n * not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\r\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n#if   defined ( __ICCARM__ )\r\n  #pragma system_include                        /* treat file as system include file for MISRA check */\r\n#elif defined (__clang__)\r\n  #pragma clang system_header                   /* treat file as system include file */\r\n#elif defined ( __GNUC__ )\r\n  #pragma GCC diagnostic ignored \"-Wpedantic\"   /* disable pedantic warning due to unnamed structs/unions */\r\n#endif\r\n\r\n#ifndef __CORE_CM33_H_GENERIC\r\n#define __CORE_CM33_H_GENERIC\r\n\r\n#include <stdint.h>\r\n\r\n#ifdef __cplusplus\r\n extern \"C\" {\r\n#endif\r\n\r\n/**\r\n  \\page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions\r\n  CMSIS violates the following MISRA-C:2004 rules:\r\n\r\n   \\li Required Rule 8.5, object/function definition in header file.<br>\r\n     Function definitions in header files are used to allow 'inlining'.\r\n\r\n   \\li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>\r\n     Unions are used for effective representation of core registers.\r\n\r\n   \\li Advisory Rule 19.7, Function-like macro defined.<br>\r\n     Function-like macros are used to allow more efficient code.\r\n */\r\n\r\n\r\n/*******************************************************************************\r\n *                 CMSIS definitions\r\n ******************************************************************************/\r\n/**\r\n  \\ingroup Cortex_M33\r\n  @{\r\n */\r\n\r\n#include \"cmsis_version.h\"\r\n\r\n/*  CMSIS CM33 definitions */\r\n#define __CM33_CMSIS_VERSION_MAIN  (__CM_CMSIS_VERSION_MAIN)                   /*!< \\deprecated [31:16] CMSIS HAL main version */\r\n#define __CM33_CMSIS_VERSION_SUB   (__CM_CMSIS_VERSION_SUB)                    /*!< \\deprecated [15:0]  CMSIS HAL sub version */\r\n#define __CM33_CMSIS_VERSION       ((__CM33_CMSIS_VERSION_MAIN << 16U) | \\\r\n                                     __CM33_CMSIS_VERSION_SUB           )      /*!< \\deprecated CMSIS HAL version number */\r\n\r\n#define __CORTEX_M                 (33U)                                       /*!< Cortex-M Core */\r\n\r\n/** __FPU_USED indicates whether an FPU is used or not.\r\n    For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions.\r\n*/\r\n#if defined ( __CC_ARM )\r\n  #if defined (__TARGET_FPU_VFP)\r\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\r\n      #define __FPU_USED       1U\r\n    #else\r\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\r\n      #define __FPU_USED       0U\r\n    #endif\r\n  #else\r\n    #define __FPU_USED         0U\r\n  #endif\r\n\r\n  #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U)\r\n    #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U)\r\n      #define __DSP_USED       1U\r\n    #else\r\n      #error \"Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)\"\r\n      #define __DSP_USED         0U\r\n    #endif\r\n  #else\r\n    #define __DSP_USED         0U\r\n  #endif\r\n\r\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\r\n  #if defined (__ARM_FP)\r\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\r\n      #define __FPU_USED       1U\r\n    #else\r\n      #warning \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\r\n      #define __FPU_USED       0U\r\n    #endif\r\n  #else\r\n    #define __FPU_USED         0U\r\n  #endif\r\n\r\n  #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U)\r\n    #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U)\r\n      #define __DSP_USED       1U\r\n    #else\r\n      #error \"Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)\"\r\n      #define __DSP_USED         0U\r\n    #endif\r\n  #else\r\n    #define __DSP_USED         0U\r\n  #endif\r\n\r\n#elif defined ( __GNUC__ )\r\n  #if defined (__VFP_FP__) && !defined(__SOFTFP__)\r\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\r\n      #define __FPU_USED       1U\r\n    #else\r\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\r\n      #define __FPU_USED       0U\r\n    #endif\r\n  #else\r\n    #define __FPU_USED         0U\r\n  #endif\r\n\r\n  #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U)\r\n    #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U)\r\n      #define __DSP_USED       1U\r\n    #else\r\n      #error \"Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)\"\r\n      #define __DSP_USED         0U\r\n    #endif\r\n  #else\r\n    #define __DSP_USED         0U\r\n  #endif\r\n\r\n#elif defined ( __ICCARM__ )\r\n  #if defined (__ARMVFP__)\r\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\r\n      #define __FPU_USED       1U\r\n    #else\r\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\r\n      #define __FPU_USED       0U\r\n    #endif\r\n  #else\r\n    #define __FPU_USED         0U\r\n  #endif\r\n\r\n  #if defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1U)\r\n    #if defined (__DSP_PRESENT) && (__DSP_PRESENT == 1U)\r\n      #define __DSP_USED       1U\r\n    #else\r\n      #error \"Compiler generates DSP (SIMD) instructions for a devices without DSP extensions (check __DSP_PRESENT)\"\r\n      #define __DSP_USED         0U\r\n    #endif\r\n  #else\r\n    #define __DSP_USED         0U\r\n  #endif\r\n\r\n#elif defined ( __TI_ARM__ )\r\n  #if defined (__TI_VFP_SUPPORT__)\r\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\r\n      #define __FPU_USED       1U\r\n    #else\r\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\r\n      #define __FPU_USED       0U\r\n    #endif\r\n  #else\r\n    #define __FPU_USED         0U\r\n  #endif\r\n\r\n#elif defined ( __TASKING__ )\r\n  #if defined (__FPU_VFP__)\r\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\r\n      #define __FPU_USED       1U\r\n    #else\r\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\r\n      #define __FPU_USED       0U\r\n    #endif\r\n  #else\r\n    #define __FPU_USED         0U\r\n  #endif\r\n\r\n#elif defined ( __CSMC__ )\r\n  #if ( __CSMC__ & 0x400U)\r\n    #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)\r\n      #define __FPU_USED       1U\r\n    #else\r\n      #error \"Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)\"\r\n      #define __FPU_USED       0U\r\n    #endif\r\n  #else\r\n    #define __FPU_USED         0U\r\n  #endif\r\n\r\n#endif\r\n\r\n#include \"cmsis_compiler.h\"               /* CMSIS compiler specific defines */\r\n\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* __CORE_CM33_H_GENERIC */\r\n\r\n#ifndef __CMSIS_GENERIC\r\n\r\n#ifndef __CORE_CM33_H_DEPENDANT\r\n#define __CORE_CM33_H_DEPENDANT\r\n\r\n#ifdef __cplusplus\r\n extern \"C\" {\r\n#endif\r\n\r\n/* check device defines and use defaults */\r\n#if defined __CHECK_DEVICE_DEFINES\r\n  #ifndef __CM33_REV\r\n    #define __CM33_REV                0x0000U\r\n    #warning \"__CM33_REV not defined in device header file; using default!\"\r\n  #endif\r\n\r\n  #ifndef __FPU_PRESENT\r\n    #define __FPU_PRESENT             0U\r\n    #warning \"__FPU_PRESENT not defined in device header file; using default!\"\r\n  #endif\r\n\r\n  #ifndef __MPU_PRESENT\r\n    #define __MPU_PRESENT             0U\r\n    #warning \"__MPU_PRESENT not defined in device header file; using default!\"\r\n  #endif\r\n\r\n  #ifndef __SAUREGION_PRESENT\r\n    #define __SAUREGION_PRESENT       0U\r\n    #warning \"__SAUREGION_PRESENT not defined in device header file; using default!\"\r\n  #endif\r\n\r\n  #ifndef __DSP_PRESENT\r\n    #define __DSP_PRESENT             0U\r\n    #warning \"__DSP_PRESENT not defined in device header file; using default!\"\r\n  #endif\r\n\r\n  #ifndef __VTOR_PRESENT\r\n    #define __VTOR_PRESENT             1U\r\n    #warning \"__VTOR_PRESENT not defined in device header file; using default!\"\r\n  #endif\r\n\r\n  #ifndef __NVIC_PRIO_BITS\r\n    #define __NVIC_PRIO_BITS          3U\r\n    #warning \"__NVIC_PRIO_BITS not defined in device header file; using default!\"\r\n  #endif\r\n\r\n  #ifndef __Vendor_SysTickConfig\r\n    #define __Vendor_SysTickConfig    0U\r\n    #warning \"__Vendor_SysTickConfig not defined in device header file; using default!\"\r\n  #endif\r\n#endif\r\n\r\n/* IO definitions (access restrictions to peripheral registers) */\r\n/**\r\n    \\defgroup CMSIS_glob_defs CMSIS Global Defines\r\n\r\n    <strong>IO Type Qualifiers</strong> are used\r\n    \\li to specify the access to peripheral variables.\r\n    \\li for automatic generation of peripheral register debug information.\r\n*/\r\n#ifdef __cplusplus\r\n  #define   __I     volatile             /*!< Defines 'read only' permissions */\r\n#else\r\n  #define   __I     volatile const       /*!< Defines 'read only' permissions */\r\n#endif\r\n#define     __O     volatile             /*!< Defines 'write only' permissions */\r\n#define     __IO    volatile             /*!< Defines 'read / write' permissions */\r\n\r\n/* following defines should be used for structure members */\r\n#define     __IM     volatile const      /*! Defines 'read only' structure member permissions */\r\n#define     __OM     volatile            /*! Defines 'write only' structure member permissions */\r\n#define     __IOM    volatile            /*! Defines 'read / write' structure member permissions */\r\n\r\n/*@} end of group Cortex_M33 */\r\n\r\n\r\n\r\n/*******************************************************************************\r\n *                 Register Abstraction\r\n  Core Register contain:\r\n  - Core Register\r\n  - Core NVIC Register\r\n  - Core SCB Register\r\n  - Core SysTick Register\r\n  - Core Debug Register\r\n  - Core MPU Register\r\n  - Core SAU Register\r\n  - Core FPU Register\r\n ******************************************************************************/\r\n/**\r\n  \\defgroup CMSIS_core_register Defines and Type Definitions\r\n  \\brief Type definitions and defines for Cortex-M processor based devices.\r\n*/\r\n\r\n/**\r\n  \\ingroup    CMSIS_core_register\r\n  \\defgroup   CMSIS_CORE  Status and Control Registers\r\n  \\brief      Core Register type definitions.\r\n  @{\r\n */\r\n\r\n/**\r\n  \\brief  Union type to access the Application Program Status Register (APSR).\r\n */\r\ntypedef union\r\n{\r\n  struct\r\n  {\r\n    uint32_t _reserved0:16;              /*!< bit:  0..15  Reserved */\r\n    uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags */\r\n    uint32_t _reserved1:7;               /*!< bit: 20..26  Reserved */\r\n    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag */\r\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\r\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\r\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\r\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\r\n  } b;                                   /*!< Structure used for bit  access */\r\n  uint32_t w;                            /*!< Type      used for word access */\r\n} APSR_Type;\r\n\r\n/* APSR Register Definitions */\r\n#define APSR_N_Pos                         31U                                            /*!< APSR: N Position */\r\n#define APSR_N_Msk                         (1UL << APSR_N_Pos)                            /*!< APSR: N Mask */\r\n\r\n#define APSR_Z_Pos                         30U                                            /*!< APSR: Z Position */\r\n#define APSR_Z_Msk                         (1UL << APSR_Z_Pos)                            /*!< APSR: Z Mask */\r\n\r\n#define APSR_C_Pos                         29U                                            /*!< APSR: C Position */\r\n#define APSR_C_Msk                         (1UL << APSR_C_Pos)                            /*!< APSR: C Mask */\r\n\r\n#define APSR_V_Pos                         28U                                            /*!< APSR: V Position */\r\n#define APSR_V_Msk                         (1UL << APSR_V_Pos)                            /*!< APSR: V Mask */\r\n\r\n#define APSR_Q_Pos                         27U                                            /*!< APSR: Q Position */\r\n#define APSR_Q_Msk                         (1UL << APSR_Q_Pos)                            /*!< APSR: Q Mask */\r\n\r\n#define APSR_GE_Pos                        16U                                            /*!< APSR: GE Position */\r\n#define APSR_GE_Msk                        (0xFUL << APSR_GE_Pos)                         /*!< APSR: GE Mask */\r\n\r\n\r\n/**\r\n  \\brief  Union type to access the Interrupt Program Status Register (IPSR).\r\n */\r\ntypedef union\r\n{\r\n  struct\r\n  {\r\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\r\n    uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved */\r\n  } b;                                   /*!< Structure used for bit  access */\r\n  uint32_t w;                            /*!< Type      used for word access */\r\n} IPSR_Type;\r\n\r\n/* IPSR Register Definitions */\r\n#define IPSR_ISR_Pos                        0U                                            /*!< IPSR: ISR Position */\r\n#define IPSR_ISR_Msk                       (0x1FFUL /*<< IPSR_ISR_Pos*/)                  /*!< IPSR: ISR Mask */\r\n\r\n\r\n/**\r\n  \\brief  Union type to access the Special-Purpose Program Status Registers (xPSR).\r\n */\r\ntypedef union\r\n{\r\n  struct\r\n  {\r\n    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number */\r\n    uint32_t _reserved0:7;               /*!< bit:  9..15  Reserved */\r\n    uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags */\r\n    uint32_t _reserved1:4;               /*!< bit: 20..23  Reserved */\r\n    uint32_t T:1;                        /*!< bit:     24  Thumb bit        (read 0) */\r\n    uint32_t IT:2;                       /*!< bit: 25..26  saved IT state   (read 0) */\r\n    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag */\r\n    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag */\r\n    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag */\r\n    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag */\r\n    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag */\r\n  } b;                                   /*!< Structure used for bit  access */\r\n  uint32_t w;                            /*!< Type      used for word access */\r\n} xPSR_Type;\r\n\r\n/* xPSR Register Definitions */\r\n#define xPSR_N_Pos                         31U                                            /*!< xPSR: N Position */\r\n#define xPSR_N_Msk                         (1UL << xPSR_N_Pos)                            /*!< xPSR: N Mask */\r\n\r\n#define xPSR_Z_Pos                         30U                                            /*!< xPSR: Z Position */\r\n#define xPSR_Z_Msk                         (1UL << xPSR_Z_Pos)                            /*!< xPSR: Z Mask */\r\n\r\n#define xPSR_C_Pos                         29U                                            /*!< xPSR: C Position */\r\n#define xPSR_C_Msk                         (1UL << xPSR_C_Pos)                            /*!< xPSR: C Mask */\r\n\r\n#define xPSR_V_Pos                         28U                                            /*!< xPSR: V Position */\r\n#define xPSR_V_Msk                         (1UL << xPSR_V_Pos)                            /*!< xPSR: V Mask */\r\n\r\n#define xPSR_Q_Pos                         27U                                            /*!< xPSR: Q Position */\r\n#define xPSR_Q_Msk                         (1UL << xPSR_Q_Pos)                            /*!< xPSR: Q Mask */\r\n\r\n#define xPSR_IT_Pos                        25U                                            /*!< xPSR: IT Position */\r\n#define xPSR_IT_Msk                        (3UL << xPSR_IT_Pos)                           /*!< xPSR: IT Mask */\r\n\r\n#define xPSR_T_Pos                         24U                                            /*!< xPSR: T Position */\r\n#define xPSR_T_Msk                         (1UL << xPSR_T_Pos)                            /*!< xPSR: T Mask */\r\n\r\n#define xPSR_GE_Pos                        16U                                            /*!< xPSR: GE Position */\r\n#define xPSR_GE_Msk                        (0xFUL << xPSR_GE_Pos)                         /*!< xPSR: GE Mask */\r\n\r\n#define xPSR_ISR_Pos                        0U                                            /*!< xPSR: ISR Position */\r\n#define xPSR_ISR_Msk                       (0x1FFUL /*<< xPSR_ISR_Pos*/)                  /*!< xPSR: ISR Mask */\r\n\r\n\r\n/**\r\n  \\brief  Union type to access the Control Registers (CONTROL).\r\n */\r\ntypedef union\r\n{\r\n  struct\r\n  {\r\n    uint32_t nPRIV:1;                    /*!< bit:      0  Execution privilege in Thread mode */\r\n    uint32_t SPSEL:1;                    /*!< bit:      1  Stack-pointer select */\r\n    uint32_t FPCA:1;                     /*!< bit:      2  Floating-point context active */\r\n    uint32_t SFPA:1;                     /*!< bit:      3  Secure floating-point active */\r\n    uint32_t _reserved1:28;              /*!< bit:  4..31  Reserved */\r\n  } b;                                   /*!< Structure used for bit  access */\r\n  uint32_t w;                            /*!< Type      used for word access */\r\n} CONTROL_Type;\r\n\r\n/* CONTROL Register Definitions */\r\n#define CONTROL_SFPA_Pos                    3U                                            /*!< CONTROL: SFPA Position */\r\n#define CONTROL_SFPA_Msk                   (1UL << CONTROL_SFPA_Pos)                      /*!< CONTROL: SFPA Mask */\r\n\r\n#define CONTROL_FPCA_Pos                    2U                                            /*!< CONTROL: FPCA Position */\r\n#define CONTROL_FPCA_Msk                   (1UL << CONTROL_FPCA_Pos)                      /*!< CONTROL: FPCA Mask */\r\n\r\n#define CONTROL_SPSEL_Pos                   1U                                            /*!< CONTROL: SPSEL Position */\r\n#define CONTROL_SPSEL_Msk                  (1UL << CONTROL_SPSEL_Pos)                     /*!< CONTROL: SPSEL Mask */\r\n\r\n#define CONTROL_nPRIV_Pos                   0U                                            /*!< CONTROL: nPRIV Position */\r\n#define CONTROL_nPRIV_Msk                  (1UL /*<< CONTROL_nPRIV_Pos*/)                 /*!< CONTROL: nPRIV Mask */\r\n\r\n/*@} end of group CMSIS_CORE */\r\n\r\n\r\n/**\r\n  \\ingroup    CMSIS_core_register\r\n  \\defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC)\r\n  \\brief      Type definitions for the NVIC Registers\r\n  @{\r\n */\r\n\r\n/**\r\n  \\brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).\r\n */\r\ntypedef struct\r\n{\r\n  __IOM uint32_t ISER[16U];              /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register */\r\n        uint32_t RESERVED0[16U];\r\n  __IOM uint32_t ICER[16U];              /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register */\r\n        uint32_t RSERVED1[16U];\r\n  __IOM uint32_t ISPR[16U];              /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register */\r\n        uint32_t RESERVED2[16U];\r\n  __IOM uint32_t ICPR[16U];              /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register */\r\n        uint32_t RESERVED3[16U];\r\n  __IOM uint32_t IABR[16U];              /*!< Offset: 0x200 (R/W)  Interrupt Active bit Register */\r\n        uint32_t RESERVED4[16U];\r\n  __IOM uint32_t ITNS[16U];              /*!< Offset: 0x280 (R/W)  Interrupt Non-Secure State Register */\r\n        uint32_t RESERVED5[16U];\r\n  __IOM uint8_t  IPR[496U];              /*!< Offset: 0x300 (R/W)  Interrupt Priority Register (8Bit wide) */\r\n        uint32_t RESERVED6[580U];\r\n  __OM  uint32_t STIR;                   /*!< Offset: 0xE00 ( /W)  Software Trigger Interrupt Register */\r\n}  NVIC_Type;\r\n\r\n/* Software Triggered Interrupt Register Definitions */\r\n#define NVIC_STIR_INTID_Pos                 0U                                         /*!< STIR: INTLINESNUM Position */\r\n#define NVIC_STIR_INTID_Msk                (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/)        /*!< STIR: INTLINESNUM Mask */\r\n\r\n/*@} end of group CMSIS_NVIC */\r\n\r\n\r\n/**\r\n  \\ingroup  CMSIS_core_register\r\n  \\defgroup CMSIS_SCB     System Control Block (SCB)\r\n  \\brief    Type definitions for the System Control Block Registers\r\n  @{\r\n */\r\n\r\n/**\r\n  \\brief  Structure type to access the System Control Block (SCB).\r\n */\r\ntypedef struct\r\n{\r\n  __IM  uint32_t CPUID;                  /*!< Offset: 0x000 (R/ )  CPUID Base Register */\r\n  __IOM uint32_t ICSR;                   /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register */\r\n  __IOM uint32_t VTOR;                   /*!< Offset: 0x008 (R/W)  Vector Table Offset Register */\r\n  __IOM uint32_t AIRCR;                  /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register */\r\n  __IOM uint32_t SCR;                    /*!< Offset: 0x010 (R/W)  System Control Register */\r\n  __IOM uint32_t CCR;                    /*!< Offset: 0x014 (R/W)  Configuration Control Register */\r\n  __IOM uint8_t  SHPR[12U];              /*!< Offset: 0x018 (R/W)  System Handlers Priority Registers (4-7, 8-11, 12-15) */\r\n  __IOM uint32_t SHCSR;                  /*!< Offset: 0x024 (R/W)  System Handler Control and State Register */\r\n  __IOM uint32_t CFSR;                   /*!< Offset: 0x028 (R/W)  Configurable Fault Status Register */\r\n  __IOM uint32_t HFSR;                   /*!< Offset: 0x02C (R/W)  HardFault Status Register */\r\n  __IOM uint32_t DFSR;                   /*!< Offset: 0x030 (R/W)  Debug Fault Status Register */\r\n  __IOM uint32_t MMFAR;                  /*!< Offset: 0x034 (R/W)  MemManage Fault Address Register */\r\n  __IOM uint32_t BFAR;                   /*!< Offset: 0x038 (R/W)  BusFault Address Register */\r\n  __IOM uint32_t AFSR;                   /*!< Offset: 0x03C (R/W)  Auxiliary Fault Status Register */\r\n  __IM  uint32_t ID_PFR[2U];             /*!< Offset: 0x040 (R/ )  Processor Feature Register */\r\n  __IM  uint32_t ID_DFR;                 /*!< Offset: 0x048 (R/ )  Debug Feature Register */\r\n  __IM  uint32_t ID_AFR;                 /*!< Offset: 0x04C (R/ )  Auxiliary Feature Register */\r\n  __IM  uint32_t ID_MMFR[4U];            /*!< Offset: 0x050 (R/ )  Memory Model Feature Register */\r\n  __IM  uint32_t ID_ISAR[6U];            /*!< Offset: 0x060 (R/ )  Instruction Set Attributes Register */\r\n  __IM  uint32_t CLIDR;                  /*!< Offset: 0x078 (R/ )  Cache Level ID register */\r\n  __IM  uint32_t CTR;                    /*!< Offset: 0x07C (R/ )  Cache Type register */\r\n  __IM  uint32_t CCSIDR;                 /*!< Offset: 0x080 (R/ )  Cache Size ID Register */\r\n  __IOM uint32_t CSSELR;                 /*!< Offset: 0x084 (R/W)  Cache Size Selection Register */\r\n  __IOM uint32_t CPACR;                  /*!< Offset: 0x088 (R/W)  Coprocessor Access Control Register */\r\n  __IOM uint32_t NSACR;                  /*!< Offset: 0x08C (R/W)  Non-Secure Access Control Register */\r\n        uint32_t RESERVED7[21U];\r\n  __IOM uint32_t SFSR;                   /*!< Offset: 0x0E4 (R/W)  Secure Fault Status Register */\r\n  __IOM uint32_t SFAR;                   /*!< Offset: 0x0E8 (R/W)  Secure Fault Address Register */\r\n        uint32_t RESERVED3[69U];\r\n  __OM  uint32_t STIR;                   /*!< Offset: 0x200 ( /W)  Software Triggered Interrupt Register */\r\n        uint32_t RESERVED4[15U];\r\n  __IM  uint32_t MVFR0;                  /*!< Offset: 0x240 (R/ )  Media and VFP Feature Register 0 */\r\n  __IM  uint32_t MVFR1;                  /*!< Offset: 0x244 (R/ )  Media and VFP Feature Register 1 */\r\n  __IM  uint32_t MVFR2;                  /*!< Offset: 0x248 (R/ )  Media and VFP Feature Register 2 */\r\n        uint32_t RESERVED5[1U];\r\n  __OM  uint32_t ICIALLU;                /*!< Offset: 0x250 ( /W)  I-Cache Invalidate All to PoU */\r\n        uint32_t RESERVED6[1U];\r\n  __OM  uint32_t ICIMVAU;                /*!< Offset: 0x258 ( /W)  I-Cache Invalidate by MVA to PoU */\r\n  __OM  uint32_t DCIMVAC;                /*!< Offset: 0x25C ( /W)  D-Cache Invalidate by MVA to PoC */\r\n  __OM  uint32_t DCISW;                  /*!< Offset: 0x260 ( /W)  D-Cache Invalidate by Set-way */\r\n  __OM  uint32_t DCCMVAU;                /*!< Offset: 0x264 ( /W)  D-Cache Clean by MVA to PoU */\r\n  __OM  uint32_t DCCMVAC;                /*!< Offset: 0x268 ( /W)  D-Cache Clean by MVA to PoC */\r\n  __OM  uint32_t DCCSW;                  /*!< Offset: 0x26C ( /W)  D-Cache Clean by Set-way */\r\n  __OM  uint32_t DCCIMVAC;               /*!< Offset: 0x270 ( /W)  D-Cache Clean and Invalidate by MVA to PoC */\r\n  __OM  uint32_t DCCISW;                 /*!< Offset: 0x274 ( /W)  D-Cache Clean and Invalidate by Set-way */\r\n  __OM  uint32_t BPIALL;                 /*!< Offset: 0x278 ( /W)  Branch Predictor Invalidate All */\r\n} SCB_Type;\r\n\r\n/* SCB CPUID Register Definitions */\r\n#define SCB_CPUID_IMPLEMENTER_Pos          24U                                            /*!< SCB CPUID: IMPLEMENTER Position */\r\n#define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */\r\n\r\n#define SCB_CPUID_VARIANT_Pos              20U                                            /*!< SCB CPUID: VARIANT Position */\r\n#define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */\r\n\r\n#define SCB_CPUID_ARCHITECTURE_Pos         16U                                            /*!< SCB CPUID: ARCHITECTURE Position */\r\n#define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */\r\n\r\n#define SCB_CPUID_PARTNO_Pos                4U                                            /*!< SCB CPUID: PARTNO Position */\r\n#define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */\r\n\r\n#define SCB_CPUID_REVISION_Pos              0U                                            /*!< SCB CPUID: REVISION Position */\r\n#define SCB_CPUID_REVISION_Msk             (0xFUL /*<< SCB_CPUID_REVISION_Pos*/)          /*!< SCB CPUID: REVISION Mask */\r\n\r\n/* SCB Interrupt Control State Register Definitions */\r\n#define SCB_ICSR_PENDNMISET_Pos            31U                                            /*!< SCB ICSR: PENDNMISET Position */\r\n#define SCB_ICSR_PENDNMISET_Msk            (1UL << SCB_ICSR_PENDNMISET_Pos)               /*!< SCB ICSR: PENDNMISET Mask */\r\n\r\n#define SCB_ICSR_NMIPENDSET_Pos            SCB_ICSR_PENDNMISET_Pos                        /*!< SCB ICSR: NMIPENDSET Position, backward compatibility */\r\n#define SCB_ICSR_NMIPENDSET_Msk            SCB_ICSR_PENDNMISET_Msk                        /*!< SCB ICSR: NMIPENDSET Mask, backward compatibility */\r\n\r\n#define SCB_ICSR_PENDNMICLR_Pos            30U                                            /*!< SCB ICSR: PENDNMICLR Position */\r\n#define SCB_ICSR_PENDNMICLR_Msk            (1UL << SCB_ICSR_PENDNMICLR_Pos)               /*!< SCB ICSR: PENDNMICLR Mask */\r\n\r\n#define SCB_ICSR_PENDSVSET_Pos             28U                                            /*!< SCB ICSR: PENDSVSET Position */\r\n#define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */\r\n\r\n#define SCB_ICSR_PENDSVCLR_Pos             27U                                            /*!< SCB ICSR: PENDSVCLR Position */\r\n#define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */\r\n\r\n#define SCB_ICSR_PENDSTSET_Pos             26U                                            /*!< SCB ICSR: PENDSTSET Position */\r\n#define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */\r\n\r\n#define SCB_ICSR_PENDSTCLR_Pos             25U                                            /*!< SCB ICSR: PENDSTCLR Position */\r\n#define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */\r\n\r\n#define SCB_ICSR_STTNS_Pos                 24U                                            /*!< SCB ICSR: STTNS Position (Security Extension) */\r\n#define SCB_ICSR_STTNS_Msk                 (1UL << SCB_ICSR_STTNS_Pos)                    /*!< SCB ICSR: STTNS Mask (Security Extension) */\r\n\r\n#define SCB_ICSR_ISRPREEMPT_Pos            23U                                            /*!< SCB ICSR: ISRPREEMPT Position */\r\n#define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */\r\n\r\n#define SCB_ICSR_ISRPENDING_Pos            22U                                            /*!< SCB ICSR: ISRPENDING Position */\r\n#define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */\r\n\r\n#define SCB_ICSR_VECTPENDING_Pos           12U                                            /*!< SCB ICSR: VECTPENDING Position */\r\n#define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */\r\n\r\n#define SCB_ICSR_RETTOBASE_Pos             11U                                            /*!< SCB ICSR: RETTOBASE Position */\r\n#define SCB_ICSR_RETTOBASE_Msk             (1UL << SCB_ICSR_RETTOBASE_Pos)                /*!< SCB ICSR: RETTOBASE Mask */\r\n\r\n#define SCB_ICSR_VECTACTIVE_Pos             0U                                            /*!< SCB ICSR: VECTACTIVE Position */\r\n#define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/)       /*!< SCB ICSR: VECTACTIVE Mask */\r\n\r\n/* SCB Vector Table Offset Register Definitions */\r\n#define SCB_VTOR_TBLOFF_Pos                 7U                                            /*!< SCB VTOR: TBLOFF Position */\r\n#define SCB_VTOR_TBLOFF_Msk                (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos)           /*!< SCB VTOR: TBLOFF Mask */\r\n\r\n/* SCB Application Interrupt and Reset Control Register Definitions */\r\n#define SCB_AIRCR_VECTKEY_Pos              16U                                            /*!< SCB AIRCR: VECTKEY Position */\r\n#define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */\r\n\r\n#define SCB_AIRCR_VECTKEYSTAT_Pos          16U                                            /*!< SCB AIRCR: VECTKEYSTAT Position */\r\n#define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */\r\n\r\n#define SCB_AIRCR_ENDIANESS_Pos            15U                                            /*!< SCB AIRCR: ENDIANESS Position */\r\n#define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */\r\n\r\n#define SCB_AIRCR_PRIS_Pos                 14U                                            /*!< SCB AIRCR: PRIS Position */\r\n#define SCB_AIRCR_PRIS_Msk                 (1UL << SCB_AIRCR_PRIS_Pos)                    /*!< SCB AIRCR: PRIS Mask */\r\n\r\n#define SCB_AIRCR_BFHFNMINS_Pos            13U                                            /*!< SCB AIRCR: BFHFNMINS Position */\r\n#define SCB_AIRCR_BFHFNMINS_Msk            (1UL << SCB_AIRCR_BFHFNMINS_Pos)               /*!< SCB AIRCR: BFHFNMINS Mask */\r\n\r\n#define SCB_AIRCR_PRIGROUP_Pos              8U                                            /*!< SCB AIRCR: PRIGROUP Position */\r\n#define SCB_AIRCR_PRIGROUP_Msk             (7UL << SCB_AIRCR_PRIGROUP_Pos)                /*!< SCB AIRCR: PRIGROUP Mask */\r\n\r\n#define SCB_AIRCR_SYSRESETREQS_Pos          3U                                            /*!< SCB AIRCR: SYSRESETREQS Position */\r\n#define SCB_AIRCR_SYSRESETREQS_Msk         (1UL << SCB_AIRCR_SYSRESETREQS_Pos)            /*!< SCB AIRCR: SYSRESETREQS Mask */\r\n\r\n#define SCB_AIRCR_SYSRESETREQ_Pos           2U                                            /*!< SCB AIRCR: SYSRESETREQ Position */\r\n#define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */\r\n\r\n#define SCB_AIRCR_VECTCLRACTIVE_Pos         1U                                            /*!< SCB AIRCR: VECTCLRACTIVE Position */\r\n#define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */\r\n\r\n/* SCB System Control Register Definitions */\r\n#define SCB_SCR_SEVONPEND_Pos               4U                                            /*!< SCB SCR: SEVONPEND Position */\r\n#define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */\r\n\r\n#define SCB_SCR_SLEEPDEEPS_Pos              3U                                            /*!< SCB SCR: SLEEPDEEPS Position */\r\n#define SCB_SCR_SLEEPDEEPS_Msk             (1UL << SCB_SCR_SLEEPDEEPS_Pos)                /*!< SCB SCR: SLEEPDEEPS Mask */\r\n\r\n#define SCB_SCR_SLEEPDEEP_Pos               2U                                            /*!< SCB SCR: SLEEPDEEP Position */\r\n#define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */\r\n\r\n#define SCB_SCR_SLEEPONEXIT_Pos             1U                                            /*!< SCB SCR: SLEEPONEXIT Position */\r\n#define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */\r\n\r\n/* SCB Configuration Control Register Definitions */\r\n#define SCB_CCR_BP_Pos                     18U                                            /*!< SCB CCR: BP Position */\r\n#define SCB_CCR_BP_Msk                     (1UL << SCB_CCR_BP_Pos)                        /*!< SCB CCR: BP Mask */\r\n\r\n#define SCB_CCR_IC_Pos                     17U                                            /*!< SCB CCR: IC Position */\r\n#define SCB_CCR_IC_Msk                     (1UL << SCB_CCR_IC_Pos)                        /*!< SCB CCR: IC Mask */\r\n\r\n#define SCB_CCR_DC_Pos                     16U                                            /*!< SCB CCR: DC Position */\r\n#define SCB_CCR_DC_Msk                     (1UL << SCB_CCR_DC_Pos)                        /*!< SCB CCR: DC Mask */\r\n\r\n#define SCB_CCR_STKOFHFNMIGN_Pos           10U                                            /*!< SCB CCR: STKOFHFNMIGN Position */\r\n#define SCB_CCR_STKOFHFNMIGN_Msk           (1UL << SCB_CCR_STKOFHFNMIGN_Pos)              /*!< SCB CCR: STKOFHFNMIGN Mask */\r\n\r\n#define SCB_CCR_BFHFNMIGN_Pos               8U                                            /*!< SCB CCR: BFHFNMIGN Position */\r\n#define SCB_CCR_BFHFNMIGN_Msk              (1UL << SCB_CCR_BFHFNMIGN_Pos)                 /*!< SCB CCR: BFHFNMIGN Mask */\r\n\r\n#define SCB_CCR_DIV_0_TRP_Pos               4U                                            /*!< SCB CCR: DIV_0_TRP Position */\r\n#define SCB_CCR_DIV_0_TRP_Msk              (1UL << SCB_CCR_DIV_0_TRP_Pos)                 /*!< SCB CCR: DIV_0_TRP Mask */\r\n\r\n#define SCB_CCR_UNALIGN_TRP_Pos             3U                                            /*!< SCB CCR: UNALIGN_TRP Position */\r\n#define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */\r\n\r\n#define SCB_CCR_USERSETMPEND_Pos            1U                                            /*!< SCB CCR: USERSETMPEND Position */\r\n#define SCB_CCR_USERSETMPEND_Msk           (1UL << SCB_CCR_USERSETMPEND_Pos)              /*!< SCB CCR: USERSETMPEND Mask */\r\n\r\n/* SCB System Handler Control and State Register Definitions */\r\n#define SCB_SHCSR_HARDFAULTPENDED_Pos      21U                                            /*!< SCB SHCSR: HARDFAULTPENDED Position */\r\n#define SCB_SHCSR_HARDFAULTPENDED_Msk      (1UL << SCB_SHCSR_HARDFAULTPENDED_Pos)         /*!< SCB SHCSR: HARDFAULTPENDED Mask */\r\n\r\n#define SCB_SHCSR_SECUREFAULTPENDED_Pos    20U                                            /*!< SCB SHCSR: SECUREFAULTPENDED Position */\r\n#define SCB_SHCSR_SECUREFAULTPENDED_Msk    (1UL << SCB_SHCSR_SECUREFAULTPENDED_Pos)       /*!< SCB SHCSR: SECUREFAULTPENDED Mask */\r\n\r\n#define SCB_SHCSR_SECUREFAULTENA_Pos       19U                                            /*!< SCB SHCSR: SECUREFAULTENA Position */\r\n#define SCB_SHCSR_SECUREFAULTENA_Msk       (1UL << SCB_SHCSR_SECUREFAULTENA_Pos)          /*!< SCB SHCSR: SECUREFAULTENA Mask */\r\n\r\n#define SCB_SHCSR_USGFAULTENA_Pos          18U                                            /*!< SCB SHCSR: USGFAULTENA Position */\r\n#define SCB_SHCSR_USGFAULTENA_Msk          (1UL << SCB_SHCSR_USGFAULTENA_Pos)             /*!< SCB SHCSR: USGFAULTENA Mask */\r\n\r\n#define SCB_SHCSR_BUSFAULTENA_Pos          17U                                            /*!< SCB SHCSR: BUSFAULTENA Position */\r\n#define SCB_SHCSR_BUSFAULTENA_Msk          (1UL << SCB_SHCSR_BUSFAULTENA_Pos)             /*!< SCB SHCSR: BUSFAULTENA Mask */\r\n\r\n#define SCB_SHCSR_MEMFAULTENA_Pos          16U                                            /*!< SCB SHCSR: MEMFAULTENA Position */\r\n#define SCB_SHCSR_MEMFAULTENA_Msk          (1UL << SCB_SHCSR_MEMFAULTENA_Pos)             /*!< SCB SHCSR: MEMFAULTENA Mask */\r\n\r\n#define SCB_SHCSR_SVCALLPENDED_Pos         15U                                            /*!< SCB SHCSR: SVCALLPENDED Position */\r\n#define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */\r\n\r\n#define SCB_SHCSR_BUSFAULTPENDED_Pos       14U                                            /*!< SCB SHCSR: BUSFAULTPENDED Position */\r\n#define SCB_SHCSR_BUSFAULTPENDED_Msk       (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos)          /*!< SCB SHCSR: BUSFAULTPENDED Mask */\r\n\r\n#define SCB_SHCSR_MEMFAULTPENDED_Pos       13U                                            /*!< SCB SHCSR: MEMFAULTPENDED Position */\r\n#define SCB_SHCSR_MEMFAULTPENDED_Msk       (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos)          /*!< SCB SHCSR: MEMFAULTPENDED Mask */\r\n\r\n#define SCB_SHCSR_USGFAULTPENDED_Pos       12U                                            /*!< SCB SHCSR: USGFAULTPENDED Position */\r\n#define SCB_SHCSR_USGFAULTPENDED_Msk       (1UL << SCB_SHCSR_USGFAULTPENDED_Pos)          /*!< SCB SHCSR: USGFAULTPENDED Mask */\r\n\r\n#define SCB_SHCSR_SYSTICKACT_Pos           11U                                            /*!< SCB SHCSR: SYSTICKACT Position */\r\n#define SCB_SHCSR_SYSTICKACT_Msk           (1UL << SCB_SHCSR_SYSTICKACT_Pos)              /*!< SCB SHCSR: SYSTICKACT Mask */\r\n\r\n#define SCB_SHCSR_PENDSVACT_Pos            10U                                            /*!< SCB SHCSR: PENDSVACT Position */\r\n#define SCB_SHCSR_PENDSVACT_Msk            (1UL << SCB_SHCSR_PENDSVACT_Pos)               /*!< SCB SHCSR: PENDSVACT Mask */\r\n\r\n#define SCB_SHCSR_MONITORACT_Pos            8U                                            /*!< SCB SHCSR: MONITORACT Position */\r\n#define SCB_SHCSR_MONITORACT_Msk           (1UL << SCB_SHCSR_MONITORACT_Pos)              /*!< SCB SHCSR: MONITORACT Mask */\r\n\r\n#define SCB_SHCSR_SVCALLACT_Pos             7U                                            /*!< SCB SHCSR: SVCALLACT Position */\r\n#define SCB_SHCSR_SVCALLACT_Msk            (1UL << SCB_SHCSR_SVCALLACT_Pos)               /*!< SCB SHCSR: SVCALLACT Mask */\r\n\r\n#define SCB_SHCSR_NMIACT_Pos                5U                                            /*!< SCB SHCSR: NMIACT Position */\r\n#define SCB_SHCSR_NMIACT_Msk               (1UL << SCB_SHCSR_NMIACT_Pos)                  /*!< SCB SHCSR: NMIACT Mask */\r\n\r\n#define SCB_SHCSR_SECUREFAULTACT_Pos        4U                                            /*!< SCB SHCSR: SECUREFAULTACT Position */\r\n#define SCB_SHCSR_SECUREFAULTACT_Msk       (1UL << SCB_SHCSR_SECUREFAULTACT_Pos)          /*!< SCB SHCSR: SECUREFAULTACT Mask */\r\n\r\n#define SCB_SHCSR_USGFAULTACT_Pos           3U                                            /*!< SCB SHCSR: USGFAULTACT Position */\r\n#define SCB_SHCSR_USGFAULTACT_Msk          (1UL << SCB_SHCSR_USGFAULTACT_Pos)             /*!< SCB SHCSR: USGFAULTACT Mask */\r\n\r\n#define SCB_SHCSR_HARDFAULTACT_Pos          2U                                            /*!< SCB SHCSR: HARDFAULTACT Position */\r\n#define SCB_SHCSR_HARDFAULTACT_Msk         (1UL << SCB_SHCSR_HARDFAULTACT_Pos)            /*!< SCB SHCSR: HARDFAULTACT Mask */\r\n\r\n#define SCB_SHCSR_BUSFAULTACT_Pos           1U                                            /*!< SCB SHCSR: BUSFAULTACT Position */\r\n#define SCB_SHCSR_BUSFAULTACT_Msk          (1UL << SCB_SHCSR_BUSFAULTACT_Pos)             /*!< SCB SHCSR: BUSFAULTACT Mask */\r\n\r\n#define SCB_SHCSR_MEMFAULTACT_Pos           0U                                            /*!< SCB SHCSR: MEMFAULTACT Position */\r\n#define SCB_SHCSR_MEMFAULTACT_Msk          (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/)         /*!< SCB SHCSR: MEMFAULTACT Mask */\r\n\r\n/* SCB Configurable Fault Status Register Definitions */\r\n#define SCB_CFSR_USGFAULTSR_Pos            16U                                            /*!< SCB CFSR: Usage Fault Status Register Position */\r\n#define SCB_CFSR_USGFAULTSR_Msk            (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos)          /*!< SCB CFSR: Usage Fault Status Register Mask */\r\n\r\n#define SCB_CFSR_BUSFAULTSR_Pos             8U                                            /*!< SCB CFSR: Bus Fault Status Register Position */\r\n#define SCB_CFSR_BUSFAULTSR_Msk            (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos)            /*!< SCB CFSR: Bus Fault Status Register Mask */\r\n\r\n#define SCB_CFSR_MEMFAULTSR_Pos             0U                                            /*!< SCB CFSR: Memory Manage Fault Status Register Position */\r\n#define SCB_CFSR_MEMFAULTSR_Msk            (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/)        /*!< SCB CFSR: Memory Manage Fault Status Register Mask */\r\n\r\n/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */\r\n#define SCB_CFSR_MMARVALID_Pos             (SCB_CFSR_MEMFAULTSR_Pos + 7U)                 /*!< SCB CFSR (MMFSR): MMARVALID Position */\r\n#define SCB_CFSR_MMARVALID_Msk             (1UL << SCB_CFSR_MMARVALID_Pos)                /*!< SCB CFSR (MMFSR): MMARVALID Mask */\r\n\r\n#define SCB_CFSR_MLSPERR_Pos               (SCB_CFSR_MEMFAULTSR_Pos + 5U)                 /*!< SCB CFSR (MMFSR): MLSPERR Position */\r\n#define SCB_CFSR_MLSPERR_Msk               (1UL << SCB_CFSR_MLSPERR_Pos)                  /*!< SCB CFSR (MMFSR): MLSPERR Mask */\r\n\r\n#define SCB_CFSR_MSTKERR_Pos               (SCB_CFSR_MEMFAULTSR_Pos + 4U)                 /*!< SCB CFSR (MMFSR): MSTKERR Position */\r\n#define SCB_CFSR_MSTKERR_Msk               (1UL << SCB_CFSR_MSTKERR_Pos)                  /*!< SCB CFSR (MMFSR): MSTKERR Mask */\r\n\r\n#define SCB_CFSR_MUNSTKERR_Pos             (SCB_CFSR_MEMFAULTSR_Pos + 3U)                 /*!< SCB CFSR (MMFSR): MUNSTKERR Position */\r\n#define SCB_CFSR_MUNSTKERR_Msk             (1UL << SCB_CFSR_MUNSTKERR_Pos)                /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */\r\n\r\n#define SCB_CFSR_DACCVIOL_Pos              (SCB_CFSR_MEMFAULTSR_Pos + 1U)                 /*!< SCB CFSR (MMFSR): DACCVIOL Position */\r\n#define SCB_CFSR_DACCVIOL_Msk              (1UL << SCB_CFSR_DACCVIOL_Pos)                 /*!< SCB CFSR (MMFSR): DACCVIOL Mask */\r\n\r\n#define SCB_CFSR_IACCVIOL_Pos              (SCB_CFSR_MEMFAULTSR_Pos + 0U)                 /*!< SCB CFSR (MMFSR): IACCVIOL Position */\r\n#define SCB_CFSR_IACCVIOL_Msk              (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/)             /*!< SCB CFSR (MMFSR): IACCVIOL Mask */\r\n\r\n/* BusFault Status Register (part of SCB Configurable Fault Status Register) */\r\n#define SCB_CFSR_BFARVALID_Pos            (SCB_CFSR_BUSFAULTSR_Pos + 7U)                  /*!< SCB CFSR (BFSR): BFARVALID Position */\r\n#define SCB_CFSR_BFARVALID_Msk            (1UL << SCB_CFSR_BFARVALID_Pos)                 /*!< SCB CFSR (BFSR): BFARVALID Mask */\r\n\r\n#define SCB_CFSR_LSPERR_Pos               (SCB_CFSR_BUSFAULTSR_Pos + 5U)                  /*!< SCB CFSR (BFSR): LSPERR Position */\r\n#define SCB_CFSR_LSPERR_Msk               (1UL << SCB_CFSR_LSPERR_Pos)                    /*!< SCB CFSR (BFSR): LSPERR Mask */\r\n\r\n#define SCB_CFSR_STKERR_Pos               (SCB_CFSR_BUSFAULTSR_Pos + 4U)                  /*!< SCB CFSR (BFSR): STKERR Position */\r\n#define SCB_CFSR_STKERR_Msk               (1UL << SCB_CFSR_STKERR_Pos)                    /*!< SCB CFSR (BFSR): STKERR Mask */\r\n\r\n#define SCB_CFSR_UNSTKERR_Pos             (SCB_CFSR_BUSFAULTSR_Pos + 3U)                  /*!< SCB CFSR (BFSR): UNSTKERR Position */\r\n#define SCB_CFSR_UNSTKERR_Msk             (1UL << SCB_CFSR_UNSTKERR_Pos)                  /*!< SCB CFSR (BFSR): UNSTKERR Mask */\r\n\r\n#define SCB_CFSR_IMPRECISERR_Pos          (SCB_CFSR_BUSFAULTSR_Pos + 2U)                  /*!< SCB CFSR (BFSR): IMPRECISERR Position */\r\n#define SCB_CFSR_IMPRECISERR_Msk          (1UL << SCB_CFSR_IMPRECISERR_Pos)               /*!< SCB CFSR (BFSR): IMPRECISERR Mask */\r\n\r\n#define SCB_CFSR_PRECISERR_Pos            (SCB_CFSR_BUSFAULTSR_Pos + 1U)                  /*!< SCB CFSR (BFSR): PRECISERR Position */\r\n#define SCB_CFSR_PRECISERR_Msk            (1UL << SCB_CFSR_PRECISERR_Pos)                 /*!< SCB CFSR (BFSR): PRECISERR Mask */\r\n\r\n#define SCB_CFSR_IBUSERR_Pos              (SCB_CFSR_BUSFAULTSR_Pos + 0U)                  /*!< SCB CFSR (BFSR): IBUSERR Position */\r\n#define SCB_CFSR_IBUSERR_Msk              (1UL << SCB_CFSR_IBUSERR_Pos)                   /*!< SCB CFSR (BFSR): IBUSERR Mask */\r\n\r\n/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */\r\n#define SCB_CFSR_DIVBYZERO_Pos            (SCB_CFSR_USGFAULTSR_Pos + 9U)                  /*!< SCB CFSR (UFSR): DIVBYZERO Position */\r\n#define SCB_CFSR_DIVBYZERO_Msk            (1UL << SCB_CFSR_DIVBYZERO_Pos)                 /*!< SCB CFSR (UFSR): DIVBYZERO Mask */\r\n\r\n#define SCB_CFSR_UNALIGNED_Pos            (SCB_CFSR_USGFAULTSR_Pos + 8U)                  /*!< SCB CFSR (UFSR): UNALIGNED Position */\r\n#define SCB_CFSR_UNALIGNED_Msk            (1UL << SCB_CFSR_UNALIGNED_Pos)                 /*!< SCB CFSR (UFSR): UNALIGNED Mask */\r\n\r\n#define SCB_CFSR_STKOF_Pos                (SCB_CFSR_USGFAULTSR_Pos + 4U)                  /*!< SCB CFSR (UFSR): STKOF Position */\r\n#define SCB_CFSR_STKOF_Msk                (1UL << SCB_CFSR_STKOF_Pos)                     /*!< SCB CFSR (UFSR): STKOF Mask */\r\n\r\n#define SCB_CFSR_NOCP_Pos                 (SCB_CFSR_USGFAULTSR_Pos + 3U)                  /*!< SCB CFSR (UFSR): NOCP Position */\r\n#define SCB_CFSR_NOCP_Msk                 (1UL << SCB_CFSR_NOCP_Pos)                      /*!< SCB CFSR (UFSR): NOCP Mask */\r\n\r\n#define SCB_CFSR_INVPC_Pos                (SCB_CFSR_USGFAULTSR_Pos + 2U)                  /*!< SCB CFSR (UFSR): INVPC Position */\r\n#define SCB_CFSR_INVPC_Msk                (1UL << SCB_CFSR_INVPC_Pos)                     /*!< SCB CFSR (UFSR): INVPC Mask */\r\n\r\n#define SCB_CFSR_INVSTATE_Pos             (SCB_CFSR_USGFAULTSR_Pos + 1U)                  /*!< SCB CFSR (UFSR): INVSTATE Position */\r\n#define SCB_CFSR_INVSTATE_Msk             (1UL << SCB_CFSR_INVSTATE_Pos)                  /*!< SCB CFSR (UFSR): INVSTATE Mask */\r\n\r\n#define SCB_CFSR_UNDEFINSTR_Pos           (SCB_CFSR_USGFAULTSR_Pos + 0U)                  /*!< SCB CFSR (UFSR): UNDEFINSTR Position */\r\n#define SCB_CFSR_UNDEFINSTR_Msk           (1UL << SCB_CFSR_UNDEFINSTR_Pos)                /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */\r\n\r\n/* SCB Hard Fault Status Register Definitions */\r\n#define SCB_HFSR_DEBUGEVT_Pos              31U                                            /*!< SCB HFSR: DEBUGEVT Position */\r\n#define SCB_HFSR_DEBUGEVT_Msk              (1UL << SCB_HFSR_DEBUGEVT_Pos)                 /*!< SCB HFSR: DEBUGEVT Mask */\r\n\r\n#define SCB_HFSR_FORCED_Pos                30U                                            /*!< SCB HFSR: FORCED Position */\r\n#define SCB_HFSR_FORCED_Msk                (1UL << SCB_HFSR_FORCED_Pos)                   /*!< SCB HFSR: FORCED Mask */\r\n\r\n#define SCB_HFSR_VECTTBL_Pos                1U                                            /*!< SCB HFSR: VECTTBL Position */\r\n#define SCB_HFSR_VECTTBL_Msk               (1UL << SCB_HFSR_VECTTBL_Pos)                  /*!< SCB HFSR: VECTTBL Mask */\r\n\r\n/* SCB Debug Fault Status Register Definitions */\r\n#define SCB_DFSR_EXTERNAL_Pos               4U                                            /*!< SCB DFSR: EXTERNAL Position */\r\n#define SCB_DFSR_EXTERNAL_Msk              (1UL << SCB_DFSR_EXTERNAL_Pos)                 /*!< SCB DFSR: EXTERNAL Mask */\r\n\r\n#define SCB_DFSR_VCATCH_Pos                 3U                                            /*!< SCB DFSR: VCATCH Position */\r\n#define SCB_DFSR_VCATCH_Msk                (1UL << SCB_DFSR_VCATCH_Pos)                   /*!< SCB DFSR: VCATCH Mask */\r\n\r\n#define SCB_DFSR_DWTTRAP_Pos                2U                                            /*!< SCB DFSR: DWTTRAP Position */\r\n#define SCB_DFSR_DWTTRAP_Msk               (1UL << SCB_DFSR_DWTTRAP_Pos)                  /*!< SCB DFSR: DWTTRAP Mask */\r\n\r\n#define SCB_DFSR_BKPT_Pos                   1U                                            /*!< SCB DFSR: BKPT Position */\r\n#define SCB_DFSR_BKPT_Msk                  (1UL << SCB_DFSR_BKPT_Pos)                     /*!< SCB DFSR: BKPT Mask */\r\n\r\n#define SCB_DFSR_HALTED_Pos                 0U                                            /*!< SCB DFSR: HALTED Position */\r\n#define SCB_DFSR_HALTED_Msk                (1UL /*<< SCB_DFSR_HALTED_Pos*/)               /*!< SCB DFSR: HALTED Mask */\r\n\r\n/* SCB Non-Secure Access Control Register Definitions */\r\n#define SCB_NSACR_CP11_Pos                 11U                                            /*!< SCB NSACR: CP11 Position */\r\n#define SCB_NSACR_CP11_Msk                 (1UL << SCB_NSACR_CP11_Pos)                    /*!< SCB NSACR: CP11 Mask */\r\n\r\n#define SCB_NSACR_CP10_Pos                 10U                                            /*!< SCB NSACR: CP10 Position */\r\n#define SCB_NSACR_CP10_Msk                 (1UL << SCB_NSACR_CP10_Pos)                    /*!< SCB NSACR: CP10 Mask */\r\n\r\n#define SCB_NSACR_CPn_Pos                   0U                                            /*!< SCB NSACR: CPn Position */\r\n#define SCB_NSACR_CPn_Msk                  (1UL /*<< SCB_NSACR_CPn_Pos*/)                 /*!< SCB NSACR: CPn Mask */\r\n\r\n/* SCB Cache Level ID Register Definitions */\r\n#define SCB_CLIDR_LOUU_Pos                 27U                                            /*!< SCB CLIDR: LoUU Position */\r\n#define SCB_CLIDR_LOUU_Msk                 (7UL << SCB_CLIDR_LOUU_Pos)                    /*!< SCB CLIDR: LoUU Mask */\r\n\r\n#define SCB_CLIDR_LOC_Pos                  24U                                            /*!< SCB CLIDR: LoC Position */\r\n#define SCB_CLIDR_LOC_Msk                  (7UL << SCB_CLIDR_LOC_Pos)                     /*!< SCB CLIDR: LoC Mask */\r\n\r\n/* SCB Cache Type Register Definitions */\r\n#define SCB_CTR_FORMAT_Pos                 29U                                            /*!< SCB CTR: Format Position */\r\n#define SCB_CTR_FORMAT_Msk                 (7UL << SCB_CTR_FORMAT_Pos)                    /*!< SCB CTR: Format Mask */\r\n\r\n#define SCB_CTR_CWG_Pos                    24U                                            /*!< SCB CTR: CWG Position */\r\n#define SCB_CTR_CWG_Msk                    (0xFUL << SCB_CTR_CWG_Pos)                     /*!< SCB CTR: CWG Mask */\r\n\r\n#define SCB_CTR_ERG_Pos                    20U                                            /*!< SCB CTR: ERG Position */\r\n#define SCB_CTR_ERG_Msk                    (0xFUL << SCB_CTR_ERG_Pos)                     /*!< SCB CTR: ERG Mask */\r\n\r\n#define SCB_CTR_DMINLINE_Pos               16U                                            /*!< SCB CTR: DminLine Position */\r\n#define SCB_CTR_DMINLINE_Msk               (0xFUL << SCB_CTR_DMINLINE_Pos)                /*!< SCB CTR: DminLine Mask */\r\n\r\n#define SCB_CTR_IMINLINE_Pos                0U                                            /*!< SCB CTR: ImInLine Position */\r\n#define SCB_CTR_IMINLINE_Msk               (0xFUL /*<< SCB_CTR_IMINLINE_Pos*/)            /*!< SCB CTR: ImInLine Mask */\r\n\r\n/* SCB Cache Size ID Register Definitions */\r\n#define SCB_CCSIDR_WT_Pos                  31U                                            /*!< SCB CCSIDR: WT Position */\r\n#define SCB_CCSIDR_WT_Msk                  (1UL << SCB_CCSIDR_WT_Pos)                     /*!< SCB CCSIDR: WT Mask */\r\n\r\n#define SCB_CCSIDR_WB_Pos                  30U                                            /*!< SCB CCSIDR: WB Position */\r\n#define SCB_CCSIDR_WB_Msk                  (1UL << SCB_CCSIDR_WB_Pos)                     /*!< SCB CCSIDR: WB Mask */\r\n\r\n#define SCB_CCSIDR_RA_Pos                  29U                                            /*!< SCB CCSIDR: RA Position */\r\n#define SCB_CCSIDR_RA_Msk                  (1UL << SCB_CCSIDR_RA_Pos)                     /*!< SCB CCSIDR: RA Mask */\r\n\r\n#define SCB_CCSIDR_WA_Pos                  28U                                            /*!< SCB CCSIDR: WA Position */\r\n#define SCB_CCSIDR_WA_Msk                  (1UL << SCB_CCSIDR_WA_Pos)                     /*!< SCB CCSIDR: WA Mask */\r\n\r\n#define SCB_CCSIDR_NUMSETS_Pos             13U                                            /*!< SCB CCSIDR: NumSets Position */\r\n#define SCB_CCSIDR_NUMSETS_Msk             (0x7FFFUL << SCB_CCSIDR_NUMSETS_Pos)           /*!< SCB CCSIDR: NumSets Mask */\r\n\r\n#define SCB_CCSIDR_ASSOCIATIVITY_Pos        3U                                            /*!< SCB CCSIDR: Associativity Position */\r\n#define SCB_CCSIDR_ASSOCIATIVITY_Msk       (0x3FFUL << SCB_CCSIDR_ASSOCIATIVITY_Pos)      /*!< SCB CCSIDR: Associativity Mask */\r\n\r\n#define SCB_CCSIDR_LINESIZE_Pos             0U                                            /*!< SCB CCSIDR: LineSize Position */\r\n#define SCB_CCSIDR_LINESIZE_Msk            (7UL /*<< SCB_CCSIDR_LINESIZE_Pos*/)           /*!< SCB CCSIDR: LineSize Mask */\r\n\r\n/* SCB Cache Size Selection Register Definitions */\r\n#define SCB_CSSELR_LEVEL_Pos                1U                                            /*!< SCB CSSELR: Level Position */\r\n#define SCB_CSSELR_LEVEL_Msk               (7UL << SCB_CSSELR_LEVEL_Pos)                  /*!< SCB CSSELR: Level Mask */\r\n\r\n#define SCB_CSSELR_IND_Pos                  0U                                            /*!< SCB CSSELR: InD Position */\r\n#define SCB_CSSELR_IND_Msk                 (1UL /*<< SCB_CSSELR_IND_Pos*/)                /*!< SCB CSSELR: InD Mask */\r\n\r\n/* SCB Software Triggered Interrupt Register Definitions */\r\n#define SCB_STIR_INTID_Pos                  0U                                            /*!< SCB STIR: INTID Position */\r\n#define SCB_STIR_INTID_Msk                 (0x1FFUL /*<< SCB_STIR_INTID_Pos*/)            /*!< SCB STIR: INTID Mask */\r\n\r\n/* SCB D-Cache Invalidate by Set-way Register Definitions */\r\n#define SCB_DCISW_WAY_Pos                  30U                                            /*!< SCB DCISW: Way Position */\r\n#define SCB_DCISW_WAY_Msk                  (3UL << SCB_DCISW_WAY_Pos)                     /*!< SCB DCISW: Way Mask */\r\n\r\n#define SCB_DCISW_SET_Pos                   5U                                            /*!< SCB DCISW: Set Position */\r\n#define SCB_DCISW_SET_Msk                  (0x1FFUL << SCB_DCISW_SET_Pos)                 /*!< SCB DCISW: Set Mask */\r\n\r\n/* SCB D-Cache Clean by Set-way Register Definitions */\r\n#define SCB_DCCSW_WAY_Pos                  30U                                            /*!< SCB DCCSW: Way Position */\r\n#define SCB_DCCSW_WAY_Msk                  (3UL << SCB_DCCSW_WAY_Pos)                     /*!< SCB DCCSW: Way Mask */\r\n\r\n#define SCB_DCCSW_SET_Pos                   5U                                            /*!< SCB DCCSW: Set Position */\r\n#define SCB_DCCSW_SET_Msk                  (0x1FFUL << SCB_DCCSW_SET_Pos)                 /*!< SCB DCCSW: Set Mask */\r\n\r\n/* SCB D-Cache Clean and Invalidate by Set-way Register Definitions */\r\n#define SCB_DCCISW_WAY_Pos                 30U                                            /*!< SCB DCCISW: Way Position */\r\n#define SCB_DCCISW_WAY_Msk                 (3UL << SCB_DCCISW_WAY_Pos)                    /*!< SCB DCCISW: Way Mask */\r\n\r\n#define SCB_DCCISW_SET_Pos                  5U                                            /*!< SCB DCCISW: Set Position */\r\n#define SCB_DCCISW_SET_Msk                 (0x1FFUL << SCB_DCCISW_SET_Pos)                /*!< SCB DCCISW: Set Mask */\r\n\r\n/*@} end of group CMSIS_SCB */\r\n\r\n\r\n/**\r\n  \\ingroup  CMSIS_core_register\r\n  \\defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB)\r\n  \\brief    Type definitions for the System Control and ID Register not in the SCB\r\n  @{\r\n */\r\n\r\n/**\r\n  \\brief  Structure type to access the System Control and ID Register not in the SCB.\r\n */\r\ntypedef struct\r\n{\r\n        uint32_t RESERVED0[1U];\r\n  __IM  uint32_t ICTR;                   /*!< Offset: 0x004 (R/ )  Interrupt Controller Type Register */\r\n  __IOM uint32_t ACTLR;                  /*!< Offset: 0x008 (R/W)  Auxiliary Control Register */\r\n  __IOM uint32_t CPPWR;                  /*!< Offset: 0x00C (R/W)  Coprocessor Power Control  Register */\r\n} SCnSCB_Type;\r\n\r\n/* Interrupt Controller Type Register Definitions */\r\n#define SCnSCB_ICTR_INTLINESNUM_Pos         0U                                         /*!< ICTR: INTLINESNUM Position */\r\n#define SCnSCB_ICTR_INTLINESNUM_Msk        (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/)  /*!< ICTR: INTLINESNUM Mask */\r\n\r\n/*@} end of group CMSIS_SCnotSCB */\r\n\r\n\r\n/**\r\n  \\ingroup  CMSIS_core_register\r\n  \\defgroup CMSIS_SysTick     System Tick Timer (SysTick)\r\n  \\brief    Type definitions for the System Timer Registers.\r\n  @{\r\n */\r\n\r\n/**\r\n  \\brief  Structure type to access the System Timer (SysTick).\r\n */\r\ntypedef struct\r\n{\r\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */\r\n  __IOM uint32_t LOAD;                   /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */\r\n  __IOM uint32_t VAL;                    /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */\r\n  __IM  uint32_t CALIB;                  /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */\r\n} SysTick_Type;\r\n\r\n/* SysTick Control / Status Register Definitions */\r\n#define SysTick_CTRL_COUNTFLAG_Pos         16U                                            /*!< SysTick CTRL: COUNTFLAG Position */\r\n#define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */\r\n\r\n#define SysTick_CTRL_CLKSOURCE_Pos          2U                                            /*!< SysTick CTRL: CLKSOURCE Position */\r\n#define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */\r\n\r\n#define SysTick_CTRL_TICKINT_Pos            1U                                            /*!< SysTick CTRL: TICKINT Position */\r\n#define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */\r\n\r\n#define SysTick_CTRL_ENABLE_Pos             0U                                            /*!< SysTick CTRL: ENABLE Position */\r\n#define SysTick_CTRL_ENABLE_Msk            (1UL /*<< SysTick_CTRL_ENABLE_Pos*/)           /*!< SysTick CTRL: ENABLE Mask */\r\n\r\n/* SysTick Reload Register Definitions */\r\n#define SysTick_LOAD_RELOAD_Pos             0U                                            /*!< SysTick LOAD: RELOAD Position */\r\n#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/)    /*!< SysTick LOAD: RELOAD Mask */\r\n\r\n/* SysTick Current Register Definitions */\r\n#define SysTick_VAL_CURRENT_Pos             0U                                            /*!< SysTick VAL: CURRENT Position */\r\n#define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/)    /*!< SysTick VAL: CURRENT Mask */\r\n\r\n/* SysTick Calibration Register Definitions */\r\n#define SysTick_CALIB_NOREF_Pos            31U                                            /*!< SysTick CALIB: NOREF Position */\r\n#define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */\r\n\r\n#define SysTick_CALIB_SKEW_Pos             30U                                            /*!< SysTick CALIB: SKEW Position */\r\n#define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */\r\n\r\n#define SysTick_CALIB_TENMS_Pos             0U                                            /*!< SysTick CALIB: TENMS Position */\r\n#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/)    /*!< SysTick CALIB: TENMS Mask */\r\n\r\n/*@} end of group CMSIS_SysTick */\r\n\r\n\r\n/**\r\n  \\ingroup  CMSIS_core_register\r\n  \\defgroup CMSIS_ITM     Instrumentation Trace Macrocell (ITM)\r\n  \\brief    Type definitions for the Instrumentation Trace Macrocell (ITM)\r\n  @{\r\n */\r\n\r\n/**\r\n  \\brief  Structure type to access the Instrumentation Trace Macrocell Register (ITM).\r\n */\r\ntypedef struct\r\n{\r\n  __OM  union\r\n  {\r\n    __OM  uint8_t    u8;                 /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 8-bit */\r\n    __OM  uint16_t   u16;                /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 16-bit */\r\n    __OM  uint32_t   u32;                /*!< Offset: 0x000 ( /W)  ITM Stimulus Port 32-bit */\r\n  }  PORT [32U];                         /*!< Offset: 0x000 ( /W)  ITM Stimulus Port Registers */\r\n        uint32_t RESERVED0[864U];\r\n  __IOM uint32_t TER;                    /*!< Offset: 0xE00 (R/W)  ITM Trace Enable Register */\r\n        uint32_t RESERVED1[15U];\r\n  __IOM uint32_t TPR;                    /*!< Offset: 0xE40 (R/W)  ITM Trace Privilege Register */\r\n        uint32_t RESERVED2[15U];\r\n  __IOM uint32_t TCR;                    /*!< Offset: 0xE80 (R/W)  ITM Trace Control Register */\r\n        uint32_t RESERVED3[32U];\r\n        uint32_t RESERVED4[43U];\r\n  __OM  uint32_t LAR;                    /*!< Offset: 0xFB0 ( /W)  ITM Lock Access Register */\r\n  __IM  uint32_t LSR;                    /*!< Offset: 0xFB4 (R/ )  ITM Lock Status Register */\r\n        uint32_t RESERVED5[1U];\r\n  __IM  uint32_t DEVARCH;                /*!< Offset: 0xFBC (R/ )  ITM Device Architecture Register */\r\n        uint32_t RESERVED6[4U];\r\n  __IM  uint32_t PID4;                   /*!< Offset: 0xFD0 (R/ )  ITM Peripheral Identification Register #4 */\r\n  __IM  uint32_t PID5;                   /*!< Offset: 0xFD4 (R/ )  ITM Peripheral Identification Register #5 */\r\n  __IM  uint32_t PID6;                   /*!< Offset: 0xFD8 (R/ )  ITM Peripheral Identification Register #6 */\r\n  __IM  uint32_t PID7;                   /*!< Offset: 0xFDC (R/ )  ITM Peripheral Identification Register #7 */\r\n  __IM  uint32_t PID0;                   /*!< Offset: 0xFE0 (R/ )  ITM Peripheral Identification Register #0 */\r\n  __IM  uint32_t PID1;                   /*!< Offset: 0xFE4 (R/ )  ITM Peripheral Identification Register #1 */\r\n  __IM  uint32_t PID2;                   /*!< Offset: 0xFE8 (R/ )  ITM Peripheral Identification Register #2 */\r\n  __IM  uint32_t PID3;                   /*!< Offset: 0xFEC (R/ )  ITM Peripheral Identification Register #3 */\r\n  __IM  uint32_t CID0;                   /*!< Offset: 0xFF0 (R/ )  ITM Component  Identification Register #0 */\r\n  __IM  uint32_t CID1;                   /*!< Offset: 0xFF4 (R/ )  ITM Component  Identification Register #1 */\r\n  __IM  uint32_t CID2;                   /*!< Offset: 0xFF8 (R/ )  ITM Component  Identification Register #2 */\r\n  __IM  uint32_t CID3;                   /*!< Offset: 0xFFC (R/ )  ITM Component  Identification Register #3 */\r\n} ITM_Type;\r\n\r\n/* ITM Stimulus Port Register Definitions */\r\n#define ITM_STIM_DISABLED_Pos               1U                                            /*!< ITM STIM: DISABLED Position */\r\n#define ITM_STIM_DISABLED_Msk              (0x1UL << ITM_STIM_DISABLED_Pos)               /*!< ITM STIM: DISABLED Mask */\r\n\r\n#define ITM_STIM_FIFOREADY_Pos              0U                                            /*!< ITM STIM: FIFOREADY Position */\r\n#define ITM_STIM_FIFOREADY_Msk             (0x1UL /*<< ITM_STIM_FIFOREADY_Pos*/)          /*!< ITM STIM: FIFOREADY Mask */\r\n\r\n/* ITM Trace Privilege Register Definitions */\r\n#define ITM_TPR_PRIVMASK_Pos                0U                                            /*!< ITM TPR: PRIVMASK Position */\r\n#define ITM_TPR_PRIVMASK_Msk               (0xFFFFFFFFUL /*<< ITM_TPR_PRIVMASK_Pos*/)     /*!< ITM TPR: PRIVMASK Mask */\r\n\r\n/* ITM Trace Control Register Definitions */\r\n#define ITM_TCR_BUSY_Pos                   23U                                            /*!< ITM TCR: BUSY Position */\r\n#define ITM_TCR_BUSY_Msk                   (1UL << ITM_TCR_BUSY_Pos)                      /*!< ITM TCR: BUSY Mask */\r\n\r\n#define ITM_TCR_TRACEBUSID_Pos             16U                                            /*!< ITM TCR: ATBID Position */\r\n#define ITM_TCR_TRACEBUSID_Msk             (0x7FUL << ITM_TCR_TRACEBUSID_Pos)             /*!< ITM TCR: ATBID Mask */\r\n\r\n#define ITM_TCR_GTSFREQ_Pos                10U                                            /*!< ITM TCR: Global timestamp frequency Position */\r\n#define ITM_TCR_GTSFREQ_Msk                (3UL << ITM_TCR_GTSFREQ_Pos)                   /*!< ITM TCR: Global timestamp frequency Mask */\r\n\r\n#define ITM_TCR_TSPRESCALE_Pos              8U                                            /*!< ITM TCR: TSPRESCALE Position */\r\n#define ITM_TCR_TSPRESCALE_Msk             (3UL << ITM_TCR_TSPRESCALE_Pos)                /*!< ITM TCR: TSPRESCALE Mask */\r\n\r\n#define ITM_TCR_STALLENA_Pos                5U                                            /*!< ITM TCR: STALLENA Position */\r\n#define ITM_TCR_STALLENA_Msk               (1UL << ITM_TCR_STALLENA_Pos)                  /*!< ITM TCR: STALLENA Mask */\r\n\r\n#define ITM_TCR_SWOENA_Pos                  4U                                            /*!< ITM TCR: SWOENA Position */\r\n#define ITM_TCR_SWOENA_Msk                 (1UL << ITM_TCR_SWOENA_Pos)                    /*!< ITM TCR: SWOENA Mask */\r\n\r\n#define ITM_TCR_DWTENA_Pos                  3U                                            /*!< ITM TCR: DWTENA Position */\r\n#define ITM_TCR_DWTENA_Msk                 (1UL << ITM_TCR_DWTENA_Pos)                    /*!< ITM TCR: DWTENA Mask */\r\n\r\n#define ITM_TCR_SYNCENA_Pos                 2U                                            /*!< ITM TCR: SYNCENA Position */\r\n#define ITM_TCR_SYNCENA_Msk                (1UL << ITM_TCR_SYNCENA_Pos)                   /*!< ITM TCR: SYNCENA Mask */\r\n\r\n#define ITM_TCR_TSENA_Pos                   1U                                            /*!< ITM TCR: TSENA Position */\r\n#define ITM_TCR_TSENA_Msk                  (1UL << ITM_TCR_TSENA_Pos)                     /*!< ITM TCR: TSENA Mask */\r\n\r\n#define ITM_TCR_ITMENA_Pos                  0U                                            /*!< ITM TCR: ITM Enable bit Position */\r\n#define ITM_TCR_ITMENA_Msk                 (1UL /*<< ITM_TCR_ITMENA_Pos*/)                /*!< ITM TCR: ITM Enable bit Mask */\r\n\r\n/* ITM Lock Status Register Definitions */\r\n#define ITM_LSR_ByteAcc_Pos                 2U                                            /*!< ITM LSR: ByteAcc Position */\r\n#define ITM_LSR_ByteAcc_Msk                (1UL << ITM_LSR_ByteAcc_Pos)                   /*!< ITM LSR: ByteAcc Mask */\r\n\r\n#define ITM_LSR_Access_Pos                  1U                                            /*!< ITM LSR: Access Position */\r\n#define ITM_LSR_Access_Msk                 (1UL << ITM_LSR_Access_Pos)                    /*!< ITM LSR: Access Mask */\r\n\r\n#define ITM_LSR_Present_Pos                 0U                                            /*!< ITM LSR: Present Position */\r\n#define ITM_LSR_Present_Msk                (1UL /*<< ITM_LSR_Present_Pos*/)               /*!< ITM LSR: Present Mask */\r\n\r\n/*@}*/ /* end of group CMSIS_ITM */\r\n\r\n\r\n/**\r\n  \\ingroup  CMSIS_core_register\r\n  \\defgroup CMSIS_DWT     Data Watchpoint and Trace (DWT)\r\n  \\brief    Type definitions for the Data Watchpoint and Trace (DWT)\r\n  @{\r\n */\r\n\r\n/**\r\n  \\brief  Structure type to access the Data Watchpoint and Trace Register (DWT).\r\n */\r\ntypedef struct\r\n{\r\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  Control Register */\r\n  __IOM uint32_t CYCCNT;                 /*!< Offset: 0x004 (R/W)  Cycle Count Register */\r\n  __IOM uint32_t CPICNT;                 /*!< Offset: 0x008 (R/W)  CPI Count Register */\r\n  __IOM uint32_t EXCCNT;                 /*!< Offset: 0x00C (R/W)  Exception Overhead Count Register */\r\n  __IOM uint32_t SLEEPCNT;               /*!< Offset: 0x010 (R/W)  Sleep Count Register */\r\n  __IOM uint32_t LSUCNT;                 /*!< Offset: 0x014 (R/W)  LSU Count Register */\r\n  __IOM uint32_t FOLDCNT;                /*!< Offset: 0x018 (R/W)  Folded-instruction Count Register */\r\n  __IM  uint32_t PCSR;                   /*!< Offset: 0x01C (R/ )  Program Counter Sample Register */\r\n  __IOM uint32_t COMP0;                  /*!< Offset: 0x020 (R/W)  Comparator Register 0 */\r\n        uint32_t RESERVED1[1U];\r\n  __IOM uint32_t FUNCTION0;              /*!< Offset: 0x028 (R/W)  Function Register 0 */\r\n        uint32_t RESERVED2[1U];\r\n  __IOM uint32_t COMP1;                  /*!< Offset: 0x030 (R/W)  Comparator Register 1 */\r\n        uint32_t RESERVED3[1U];\r\n  __IOM uint32_t FUNCTION1;              /*!< Offset: 0x038 (R/W)  Function Register 1 */\r\n        uint32_t RESERVED4[1U];\r\n  __IOM uint32_t COMP2;                  /*!< Offset: 0x040 (R/W)  Comparator Register 2 */\r\n        uint32_t RESERVED5[1U];\r\n  __IOM uint32_t FUNCTION2;              /*!< Offset: 0x048 (R/W)  Function Register 2 */\r\n        uint32_t RESERVED6[1U];\r\n  __IOM uint32_t COMP3;                  /*!< Offset: 0x050 (R/W)  Comparator Register 3 */\r\n        uint32_t RESERVED7[1U];\r\n  __IOM uint32_t FUNCTION3;              /*!< Offset: 0x058 (R/W)  Function Register 3 */\r\n        uint32_t RESERVED8[1U];\r\n  __IOM uint32_t COMP4;                  /*!< Offset: 0x060 (R/W)  Comparator Register 4 */\r\n        uint32_t RESERVED9[1U];\r\n  __IOM uint32_t FUNCTION4;              /*!< Offset: 0x068 (R/W)  Function Register 4 */\r\n        uint32_t RESERVED10[1U];\r\n  __IOM uint32_t COMP5;                  /*!< Offset: 0x070 (R/W)  Comparator Register 5 */\r\n        uint32_t RESERVED11[1U];\r\n  __IOM uint32_t FUNCTION5;              /*!< Offset: 0x078 (R/W)  Function Register 5 */\r\n        uint32_t RESERVED12[1U];\r\n  __IOM uint32_t COMP6;                  /*!< Offset: 0x080 (R/W)  Comparator Register 6 */\r\n        uint32_t RESERVED13[1U];\r\n  __IOM uint32_t FUNCTION6;              /*!< Offset: 0x088 (R/W)  Function Register 6 */\r\n        uint32_t RESERVED14[1U];\r\n  __IOM uint32_t COMP7;                  /*!< Offset: 0x090 (R/W)  Comparator Register 7 */\r\n        uint32_t RESERVED15[1U];\r\n  __IOM uint32_t FUNCTION7;              /*!< Offset: 0x098 (R/W)  Function Register 7 */\r\n        uint32_t RESERVED16[1U];\r\n  __IOM uint32_t COMP8;                  /*!< Offset: 0x0A0 (R/W)  Comparator Register 8 */\r\n        uint32_t RESERVED17[1U];\r\n  __IOM uint32_t FUNCTION8;              /*!< Offset: 0x0A8 (R/W)  Function Register 8 */\r\n        uint32_t RESERVED18[1U];\r\n  __IOM uint32_t COMP9;                  /*!< Offset: 0x0B0 (R/W)  Comparator Register 9 */\r\n        uint32_t RESERVED19[1U];\r\n  __IOM uint32_t FUNCTION9;              /*!< Offset: 0x0B8 (R/W)  Function Register 9 */\r\n        uint32_t RESERVED20[1U];\r\n  __IOM uint32_t COMP10;                 /*!< Offset: 0x0C0 (R/W)  Comparator Register 10 */\r\n        uint32_t RESERVED21[1U];\r\n  __IOM uint32_t FUNCTION10;             /*!< Offset: 0x0C8 (R/W)  Function Register 10 */\r\n        uint32_t RESERVED22[1U];\r\n  __IOM uint32_t COMP11;                 /*!< Offset: 0x0D0 (R/W)  Comparator Register 11 */\r\n        uint32_t RESERVED23[1U];\r\n  __IOM uint32_t FUNCTION11;             /*!< Offset: 0x0D8 (R/W)  Function Register 11 */\r\n        uint32_t RESERVED24[1U];\r\n  __IOM uint32_t COMP12;                 /*!< Offset: 0x0E0 (R/W)  Comparator Register 12 */\r\n        uint32_t RESERVED25[1U];\r\n  __IOM uint32_t FUNCTION12;             /*!< Offset: 0x0E8 (R/W)  Function Register 12 */\r\n        uint32_t RESERVED26[1U];\r\n  __IOM uint32_t COMP13;                 /*!< Offset: 0x0F0 (R/W)  Comparator Register 13 */\r\n        uint32_t RESERVED27[1U];\r\n  __IOM uint32_t FUNCTION13;             /*!< Offset: 0x0F8 (R/W)  Function Register 13 */\r\n        uint32_t RESERVED28[1U];\r\n  __IOM uint32_t COMP14;                 /*!< Offset: 0x100 (R/W)  Comparator Register 14 */\r\n        uint32_t RESERVED29[1U];\r\n  __IOM uint32_t FUNCTION14;             /*!< Offset: 0x108 (R/W)  Function Register 14 */\r\n        uint32_t RESERVED30[1U];\r\n  __IOM uint32_t COMP15;                 /*!< Offset: 0x110 (R/W)  Comparator Register 15 */\r\n        uint32_t RESERVED31[1U];\r\n  __IOM uint32_t FUNCTION15;             /*!< Offset: 0x118 (R/W)  Function Register 15 */\r\n        uint32_t RESERVED32[934U];\r\n  __IM  uint32_t LSR;                    /*!< Offset: 0xFB4 (R  )  Lock Status Register */\r\n        uint32_t RESERVED33[1U];\r\n  __IM  uint32_t DEVARCH;                /*!< Offset: 0xFBC (R/ )  Device Architecture Register */\r\n} DWT_Type;\r\n\r\n/* DWT Control Register Definitions */\r\n#define DWT_CTRL_NUMCOMP_Pos               28U                                         /*!< DWT CTRL: NUMCOMP Position */\r\n#define DWT_CTRL_NUMCOMP_Msk               (0xFUL << DWT_CTRL_NUMCOMP_Pos)             /*!< DWT CTRL: NUMCOMP Mask */\r\n\r\n#define DWT_CTRL_NOTRCPKT_Pos              27U                                         /*!< DWT CTRL: NOTRCPKT Position */\r\n#define DWT_CTRL_NOTRCPKT_Msk              (0x1UL << DWT_CTRL_NOTRCPKT_Pos)            /*!< DWT CTRL: NOTRCPKT Mask */\r\n\r\n#define DWT_CTRL_NOEXTTRIG_Pos             26U                                         /*!< DWT CTRL: NOEXTTRIG Position */\r\n#define DWT_CTRL_NOEXTTRIG_Msk             (0x1UL << DWT_CTRL_NOEXTTRIG_Pos)           /*!< DWT CTRL: NOEXTTRIG Mask */\r\n\r\n#define DWT_CTRL_NOCYCCNT_Pos              25U                                         /*!< DWT CTRL: NOCYCCNT Position */\r\n#define DWT_CTRL_NOCYCCNT_Msk              (0x1UL << DWT_CTRL_NOCYCCNT_Pos)            /*!< DWT CTRL: NOCYCCNT Mask */\r\n\r\n#define DWT_CTRL_NOPRFCNT_Pos              24U                                         /*!< DWT CTRL: NOPRFCNT Position */\r\n#define DWT_CTRL_NOPRFCNT_Msk              (0x1UL << DWT_CTRL_NOPRFCNT_Pos)            /*!< DWT CTRL: NOPRFCNT Mask */\r\n\r\n#define DWT_CTRL_CYCDISS_Pos               23U                                         /*!< DWT CTRL: CYCDISS Position */\r\n#define DWT_CTRL_CYCDISS_Msk               (0x1UL << DWT_CTRL_CYCDISS_Pos)             /*!< DWT CTRL: CYCDISS Mask */\r\n\r\n#define DWT_CTRL_CYCEVTENA_Pos             22U                                         /*!< DWT CTRL: CYCEVTENA Position */\r\n#define DWT_CTRL_CYCEVTENA_Msk             (0x1UL << DWT_CTRL_CYCEVTENA_Pos)           /*!< DWT CTRL: CYCEVTENA Mask */\r\n\r\n#define DWT_CTRL_FOLDEVTENA_Pos            21U                                         /*!< DWT CTRL: FOLDEVTENA Position */\r\n#define DWT_CTRL_FOLDEVTENA_Msk            (0x1UL << DWT_CTRL_FOLDEVTENA_Pos)          /*!< DWT CTRL: FOLDEVTENA Mask */\r\n\r\n#define DWT_CTRL_LSUEVTENA_Pos             20U                                         /*!< DWT CTRL: LSUEVTENA Position */\r\n#define DWT_CTRL_LSUEVTENA_Msk             (0x1UL << DWT_CTRL_LSUEVTENA_Pos)           /*!< DWT CTRL: LSUEVTENA Mask */\r\n\r\n#define DWT_CTRL_SLEEPEVTENA_Pos           19U                                         /*!< DWT CTRL: SLEEPEVTENA Position */\r\n#define DWT_CTRL_SLEEPEVTENA_Msk           (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos)         /*!< DWT CTRL: SLEEPEVTENA Mask */\r\n\r\n#define DWT_CTRL_EXCEVTENA_Pos             18U                                         /*!< DWT CTRL: EXCEVTENA Position */\r\n#define DWT_CTRL_EXCEVTENA_Msk             (0x1UL << DWT_CTRL_EXCEVTENA_Pos)           /*!< DWT CTRL: EXCEVTENA Mask */\r\n\r\n#define DWT_CTRL_CPIEVTENA_Pos             17U                                         /*!< DWT CTRL: CPIEVTENA Position */\r\n#define DWT_CTRL_CPIEVTENA_Msk             (0x1UL << DWT_CTRL_CPIEVTENA_Pos)           /*!< DWT CTRL: CPIEVTENA Mask */\r\n\r\n#define DWT_CTRL_EXCTRCENA_Pos             16U                                         /*!< DWT CTRL: EXCTRCENA Position */\r\n#define DWT_CTRL_EXCTRCENA_Msk             (0x1UL << DWT_CTRL_EXCTRCENA_Pos)           /*!< DWT CTRL: EXCTRCENA Mask */\r\n\r\n#define DWT_CTRL_PCSAMPLENA_Pos            12U                                         /*!< DWT CTRL: PCSAMPLENA Position */\r\n#define DWT_CTRL_PCSAMPLENA_Msk            (0x1UL << DWT_CTRL_PCSAMPLENA_Pos)          /*!< DWT CTRL: PCSAMPLENA Mask */\r\n\r\n#define DWT_CTRL_SYNCTAP_Pos               10U                                         /*!< DWT CTRL: SYNCTAP Position */\r\n#define DWT_CTRL_SYNCTAP_Msk               (0x3UL << DWT_CTRL_SYNCTAP_Pos)             /*!< DWT CTRL: SYNCTAP Mask */\r\n\r\n#define DWT_CTRL_CYCTAP_Pos                 9U                                         /*!< DWT CTRL: CYCTAP Position */\r\n#define DWT_CTRL_CYCTAP_Msk                (0x1UL << DWT_CTRL_CYCTAP_Pos)              /*!< DWT CTRL: CYCTAP Mask */\r\n\r\n#define DWT_CTRL_POSTINIT_Pos               5U                                         /*!< DWT CTRL: POSTINIT Position */\r\n#define DWT_CTRL_POSTINIT_Msk              (0xFUL << DWT_CTRL_POSTINIT_Pos)            /*!< DWT CTRL: POSTINIT Mask */\r\n\r\n#define DWT_CTRL_POSTPRESET_Pos             1U                                         /*!< DWT CTRL: POSTPRESET Position */\r\n#define DWT_CTRL_POSTPRESET_Msk            (0xFUL << DWT_CTRL_POSTPRESET_Pos)          /*!< DWT CTRL: POSTPRESET Mask */\r\n\r\n#define DWT_CTRL_CYCCNTENA_Pos              0U                                         /*!< DWT CTRL: CYCCNTENA Position */\r\n#define DWT_CTRL_CYCCNTENA_Msk             (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/)       /*!< DWT CTRL: CYCCNTENA Mask */\r\n\r\n/* DWT CPI Count Register Definitions */\r\n#define DWT_CPICNT_CPICNT_Pos               0U                                         /*!< DWT CPICNT: CPICNT Position */\r\n#define DWT_CPICNT_CPICNT_Msk              (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/)       /*!< DWT CPICNT: CPICNT Mask */\r\n\r\n/* DWT Exception Overhead Count Register Definitions */\r\n#define DWT_EXCCNT_EXCCNT_Pos               0U                                         /*!< DWT EXCCNT: EXCCNT Position */\r\n#define DWT_EXCCNT_EXCCNT_Msk              (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/)       /*!< DWT EXCCNT: EXCCNT Mask */\r\n\r\n/* DWT Sleep Count Register Definitions */\r\n#define DWT_SLEEPCNT_SLEEPCNT_Pos           0U                                         /*!< DWT SLEEPCNT: SLEEPCNT Position */\r\n#define DWT_SLEEPCNT_SLEEPCNT_Msk          (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/)   /*!< DWT SLEEPCNT: SLEEPCNT Mask */\r\n\r\n/* DWT LSU Count Register Definitions */\r\n#define DWT_LSUCNT_LSUCNT_Pos               0U                                         /*!< DWT LSUCNT: LSUCNT Position */\r\n#define DWT_LSUCNT_LSUCNT_Msk              (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/)       /*!< DWT LSUCNT: LSUCNT Mask */\r\n\r\n/* DWT Folded-instruction Count Register Definitions */\r\n#define DWT_FOLDCNT_FOLDCNT_Pos             0U                                         /*!< DWT FOLDCNT: FOLDCNT Position */\r\n#define DWT_FOLDCNT_FOLDCNT_Msk            (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/)     /*!< DWT FOLDCNT: FOLDCNT Mask */\r\n\r\n/* DWT Comparator Function Register Definitions */\r\n#define DWT_FUNCTION_ID_Pos                27U                                         /*!< DWT FUNCTION: ID Position */\r\n#define DWT_FUNCTION_ID_Msk                (0x1FUL << DWT_FUNCTION_ID_Pos)             /*!< DWT FUNCTION: ID Mask */\r\n\r\n#define DWT_FUNCTION_MATCHED_Pos           24U                                         /*!< DWT FUNCTION: MATCHED Position */\r\n#define DWT_FUNCTION_MATCHED_Msk           (0x1UL << DWT_FUNCTION_MATCHED_Pos)         /*!< DWT FUNCTION: MATCHED Mask */\r\n\r\n#define DWT_FUNCTION_DATAVSIZE_Pos         10U                                         /*!< DWT FUNCTION: DATAVSIZE Position */\r\n#define DWT_FUNCTION_DATAVSIZE_Msk         (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos)       /*!< DWT FUNCTION: DATAVSIZE Mask */\r\n\r\n#define DWT_FUNCTION_ACTION_Pos             4U                                         /*!< DWT FUNCTION: ACTION Position */\r\n#define DWT_FUNCTION_ACTION_Msk            (0x1UL << DWT_FUNCTION_ACTION_Pos)          /*!< DWT FUNCTION: ACTION Mask */\r\n\r\n#define DWT_FUNCTION_MATCH_Pos              0U                                         /*!< DWT FUNCTION: MATCH Position */\r\n#define DWT_FUNCTION_MATCH_Msk             (0xFUL /*<< DWT_FUNCTION_MATCH_Pos*/)       /*!< DWT FUNCTION: MATCH Mask */\r\n\r\n/*@}*/ /* end of group CMSIS_DWT */\r\n\r\n\r\n/**\r\n  \\ingroup  CMSIS_core_register\r\n  \\defgroup CMSIS_TPI     Trace Port Interface (TPI)\r\n  \\brief    Type definitions for the Trace Port Interface (TPI)\r\n  @{\r\n */\r\n\r\n/**\r\n  \\brief  Structure type to access the Trace Port Interface Register (TPI).\r\n */\r\ntypedef struct\r\n{\r\n  __IM  uint32_t SSPSR;                  /*!< Offset: 0x000 (R/ )  Supported Parallel Port Size Register */\r\n  __IOM uint32_t CSPSR;                  /*!< Offset: 0x004 (R/W)  Current Parallel Port Size Register */\r\n        uint32_t RESERVED0[2U];\r\n  __IOM uint32_t ACPR;                   /*!< Offset: 0x010 (R/W)  Asynchronous Clock Prescaler Register */\r\n        uint32_t RESERVED1[55U];\r\n  __IOM uint32_t SPPR;                   /*!< Offset: 0x0F0 (R/W)  Selected Pin Protocol Register */\r\n        uint32_t RESERVED2[131U];\r\n  __IM  uint32_t FFSR;                   /*!< Offset: 0x300 (R/ )  Formatter and Flush Status Register */\r\n  __IOM uint32_t FFCR;                   /*!< Offset: 0x304 (R/W)  Formatter and Flush Control Register */\r\n  __IOM uint32_t PSCR;                   /*!< Offset: 0x308 (R/W)  Periodic Synchronization Control Register */\r\n        uint32_t RESERVED3[759U];\r\n  __IM  uint32_t TRIGGER;                /*!< Offset: 0xEE8 (R/ )  TRIGGER Register */\r\n  __IM  uint32_t ITFTTD0;                /*!< Offset: 0xEEC (R/ )  Integration Test FIFO Test Data 0 Register */\r\n  __IOM uint32_t ITATBCTR2;              /*!< Offset: 0xEF0 (R/W)  Integration Test ATB Control Register 2 */\r\n        uint32_t RESERVED4[1U];\r\n  __IM  uint32_t ITATBCTR0;              /*!< Offset: 0xEF8 (R/ )  Integration Test ATB Control Register 0 */\r\n  __IM  uint32_t ITFTTD1;                /*!< Offset: 0xEFC (R/ )  Integration Test FIFO Test Data 1 Register */\r\n  __IOM uint32_t ITCTRL;                 /*!< Offset: 0xF00 (R/W)  Integration Mode Control */\r\n        uint32_t RESERVED5[39U];\r\n  __IOM uint32_t CLAIMSET;               /*!< Offset: 0xFA0 (R/W)  Claim tag set */\r\n  __IOM uint32_t CLAIMCLR;               /*!< Offset: 0xFA4 (R/W)  Claim tag clear */\r\n        uint32_t RESERVED7[8U];\r\n  __IM  uint32_t DEVID;                  /*!< Offset: 0xFC8 (R/ )  Device Configuration Register */\r\n  __IM  uint32_t DEVTYPE;                /*!< Offset: 0xFCC (R/ )  Device Type Identifier Register */\r\n} TPI_Type;\r\n\r\n/* TPI Asynchronous Clock Prescaler Register Definitions */\r\n#define TPI_ACPR_PRESCALER_Pos              0U                                         /*!< TPI ACPR: PRESCALER Position */\r\n#define TPI_ACPR_PRESCALER_Msk             (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/)    /*!< TPI ACPR: PRESCALER Mask */\r\n\r\n/* TPI Selected Pin Protocol Register Definitions */\r\n#define TPI_SPPR_TXMODE_Pos                 0U                                         /*!< TPI SPPR: TXMODE Position */\r\n#define TPI_SPPR_TXMODE_Msk                (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/)          /*!< TPI SPPR: TXMODE Mask */\r\n\r\n/* TPI Formatter and Flush Status Register Definitions */\r\n#define TPI_FFSR_FtNonStop_Pos              3U                                         /*!< TPI FFSR: FtNonStop Position */\r\n#define TPI_FFSR_FtNonStop_Msk             (0x1UL << TPI_FFSR_FtNonStop_Pos)           /*!< TPI FFSR: FtNonStop Mask */\r\n\r\n#define TPI_FFSR_TCPresent_Pos              2U                                         /*!< TPI FFSR: TCPresent Position */\r\n#define TPI_FFSR_TCPresent_Msk             (0x1UL << TPI_FFSR_TCPresent_Pos)           /*!< TPI FFSR: TCPresent Mask */\r\n\r\n#define TPI_FFSR_FtStopped_Pos              1U                                         /*!< TPI FFSR: FtStopped Position */\r\n#define TPI_FFSR_FtStopped_Msk             (0x1UL << TPI_FFSR_FtStopped_Pos)           /*!< TPI FFSR: FtStopped Mask */\r\n\r\n#define TPI_FFSR_FlInProg_Pos               0U                                         /*!< TPI FFSR: FlInProg Position */\r\n#define TPI_FFSR_FlInProg_Msk              (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/)        /*!< TPI FFSR: FlInProg Mask */\r\n\r\n/* TPI Formatter and Flush Control Register Definitions */\r\n#define TPI_FFCR_TrigIn_Pos                 8U                                         /*!< TPI FFCR: TrigIn Position */\r\n#define TPI_FFCR_TrigIn_Msk                (0x1UL << TPI_FFCR_TrigIn_Pos)              /*!< TPI FFCR: TrigIn Mask */\r\n\r\n#define TPI_FFCR_FOnMan_Pos                 6U                                         /*!< TPI FFCR: FOnMan Position */\r\n#define TPI_FFCR_FOnMan_Msk                (0x1UL << TPI_FFCR_FOnMan_Pos)              /*!< TPI FFCR: FOnMan Mask */\r\n\r\n#define TPI_FFCR_EnFCont_Pos                1U                                         /*!< TPI FFCR: EnFCont Position */\r\n#define TPI_FFCR_EnFCont_Msk               (0x1UL << TPI_FFCR_EnFCont_Pos)             /*!< TPI FFCR: EnFCont Mask */\r\n\r\n/* TPI TRIGGER Register Definitions */\r\n#define TPI_TRIGGER_TRIGGER_Pos             0U                                         /*!< TPI TRIGGER: TRIGGER Position */\r\n#define TPI_TRIGGER_TRIGGER_Msk            (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/)      /*!< TPI TRIGGER: TRIGGER Mask */\r\n\r\n/* TPI Integration Test FIFO Test Data 0 Register Definitions */\r\n#define TPI_ITFTTD0_ATB_IF2_ATVALID_Pos    29U                                         /*!< TPI ITFTTD0: ATB Interface 2 ATVALIDPosition */\r\n#define TPI_ITFTTD0_ATB_IF2_ATVALID_Msk    (0x3UL << TPI_ITFTTD0_ATB_IF2_ATVALID_Pos)  /*!< TPI ITFTTD0: ATB Interface 2 ATVALID Mask */\r\n\r\n#define TPI_ITFTTD0_ATB_IF2_bytecount_Pos  27U                                         /*!< TPI ITFTTD0: ATB Interface 2 byte count Position */\r\n#define TPI_ITFTTD0_ATB_IF2_bytecount_Msk  (0x3UL << TPI_ITFTTD0_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 2 byte count Mask */\r\n\r\n#define TPI_ITFTTD0_ATB_IF1_ATVALID_Pos    26U                                         /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Position */\r\n#define TPI_ITFTTD0_ATB_IF1_ATVALID_Msk    (0x3UL << TPI_ITFTTD0_ATB_IF1_ATVALID_Pos)  /*!< TPI ITFTTD0: ATB Interface 1 ATVALID Mask */\r\n\r\n#define TPI_ITFTTD0_ATB_IF1_bytecount_Pos  24U                                         /*!< TPI ITFTTD0: ATB Interface 1 byte count Position */\r\n#define TPI_ITFTTD0_ATB_IF1_bytecount_Msk  (0x3UL << TPI_ITFTTD0_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD0: ATB Interface 1 byte countt Mask */\r\n\r\n#define TPI_ITFTTD0_ATB_IF1_data2_Pos      16U                                         /*!< TPI ITFTTD0: ATB Interface 1 data2 Position */\r\n#define TPI_ITFTTD0_ATB_IF1_data2_Msk      (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos)   /*!< TPI ITFTTD0: ATB Interface 1 data2 Mask */\r\n\r\n#define TPI_ITFTTD0_ATB_IF1_data1_Pos       8U                                         /*!< TPI ITFTTD0: ATB Interface 1 data1 Position */\r\n#define TPI_ITFTTD0_ATB_IF1_data1_Msk      (0xFFUL << TPI_ITFTTD0_ATB_IF1_data1_Pos)   /*!< TPI ITFTTD0: ATB Interface 1 data1 Mask */\r\n\r\n#define TPI_ITFTTD0_ATB_IF1_data0_Pos       0U                                          /*!< TPI ITFTTD0: ATB Interface 1 data0 Position */\r\n#define TPI_ITFTTD0_ATB_IF1_data0_Msk      (0xFFUL /*<< TPI_ITFTTD0_ATB_IF1_data0_Pos*/) /*!< TPI ITFTTD0: ATB Interface 1 data0 Mask */\r\n\r\n/* TPI Integration Test ATB Control Register 2 Register Definitions */\r\n#define TPI_ITATBCTR2_AFVALID2S_Pos         1U                                         /*!< TPI ITATBCTR2: AFVALID2S Position */\r\n#define TPI_ITATBCTR2_AFVALID2S_Msk        (0x1UL << TPI_ITATBCTR2_AFVALID2S_Pos)      /*!< TPI ITATBCTR2: AFVALID2SS Mask */\r\n\r\n#define TPI_ITATBCTR2_AFVALID1S_Pos         1U                                         /*!< TPI ITATBCTR2: AFVALID1S Position */\r\n#define TPI_ITATBCTR2_AFVALID1S_Msk        (0x1UL << TPI_ITATBCTR2_AFVALID1S_Pos)      /*!< TPI ITATBCTR2: AFVALID1SS Mask */\r\n\r\n#define TPI_ITATBCTR2_ATREADY2S_Pos         0U                                         /*!< TPI ITATBCTR2: ATREADY2S Position */\r\n#define TPI_ITATBCTR2_ATREADY2S_Msk        (0x1UL /*<< TPI_ITATBCTR2_ATREADY2S_Pos*/)  /*!< TPI ITATBCTR2: ATREADY2S Mask */\r\n\r\n#define TPI_ITATBCTR2_ATREADY1S_Pos         0U                                         /*!< TPI ITATBCTR2: ATREADY1S Position */\r\n#define TPI_ITATBCTR2_ATREADY1S_Msk        (0x1UL /*<< TPI_ITATBCTR2_ATREADY1S_Pos*/)  /*!< TPI ITATBCTR2: ATREADY1S Mask */\r\n\r\n/* TPI Integration Test FIFO Test Data 1 Register Definitions */\r\n#define TPI_ITFTTD1_ATB_IF2_ATVALID_Pos    29U                                         /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Position */\r\n#define TPI_ITFTTD1_ATB_IF2_ATVALID_Msk    (0x3UL << TPI_ITFTTD1_ATB_IF2_ATVALID_Pos)  /*!< TPI ITFTTD1: ATB Interface 2 ATVALID Mask */\r\n\r\n#define TPI_ITFTTD1_ATB_IF2_bytecount_Pos  27U                                         /*!< TPI ITFTTD1: ATB Interface 2 byte count Position */\r\n#define TPI_ITFTTD1_ATB_IF2_bytecount_Msk  (0x3UL << TPI_ITFTTD1_ATB_IF2_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 2 byte count Mask */\r\n\r\n#define TPI_ITFTTD1_ATB_IF1_ATVALID_Pos    26U                                         /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Position */\r\n#define TPI_ITFTTD1_ATB_IF1_ATVALID_Msk    (0x3UL << TPI_ITFTTD1_ATB_IF1_ATVALID_Pos)  /*!< TPI ITFTTD1: ATB Interface 1 ATVALID Mask */\r\n\r\n#define TPI_ITFTTD1_ATB_IF1_bytecount_Pos  24U                                         /*!< TPI ITFTTD1: ATB Interface 1 byte count Position */\r\n#define TPI_ITFTTD1_ATB_IF1_bytecount_Msk  (0x3UL << TPI_ITFTTD1_ATB_IF1_bytecount_Pos) /*!< TPI ITFTTD1: ATB Interface 1 byte countt Mask */\r\n\r\n#define TPI_ITFTTD1_ATB_IF2_data2_Pos      16U                                         /*!< TPI ITFTTD1: ATB Interface 2 data2 Position */\r\n#define TPI_ITFTTD1_ATB_IF2_data2_Msk      (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos)   /*!< TPI ITFTTD1: ATB Interface 2 data2 Mask */\r\n\r\n#define TPI_ITFTTD1_ATB_IF2_data1_Pos       8U                                         /*!< TPI ITFTTD1: ATB Interface 2 data1 Position */\r\n#define TPI_ITFTTD1_ATB_IF2_data1_Msk      (0xFFUL << TPI_ITFTTD1_ATB_IF2_data1_Pos)   /*!< TPI ITFTTD1: ATB Interface 2 data1 Mask */\r\n\r\n#define TPI_ITFTTD1_ATB_IF2_data0_Pos       0U                                          /*!< TPI ITFTTD1: ATB Interface 2 data0 Position */\r\n#define TPI_ITFTTD1_ATB_IF2_data0_Msk      (0xFFUL /*<< TPI_ITFTTD1_ATB_IF2_data0_Pos*/) /*!< TPI ITFTTD1: ATB Interface 2 data0 Mask */\r\n\r\n/* TPI Integration Test ATB Control Register 0 Definitions */\r\n#define TPI_ITATBCTR0_AFVALID2S_Pos         1U                                         /*!< TPI ITATBCTR0: AFVALID2S Position */\r\n#define TPI_ITATBCTR0_AFVALID2S_Msk        (0x1UL << TPI_ITATBCTR0_AFVALID2S_Pos)      /*!< TPI ITATBCTR0: AFVALID2SS Mask */\r\n\r\n#define TPI_ITATBCTR0_AFVALID1S_Pos         1U                                         /*!< TPI ITATBCTR0: AFVALID1S Position */\r\n#define TPI_ITATBCTR0_AFVALID1S_Msk        (0x1UL << TPI_ITATBCTR0_AFVALID1S_Pos)      /*!< TPI ITATBCTR0: AFVALID1SS Mask */\r\n\r\n#define TPI_ITATBCTR0_ATREADY2S_Pos         0U                                         /*!< TPI ITATBCTR0: ATREADY2S Position */\r\n#define TPI_ITATBCTR0_ATREADY2S_Msk        (0x1UL /*<< TPI_ITATBCTR0_ATREADY2S_Pos*/)  /*!< TPI ITATBCTR0: ATREADY2S Mask */\r\n\r\n#define TPI_ITATBCTR0_ATREADY1S_Pos         0U                                         /*!< TPI ITATBCTR0: ATREADY1S Position */\r\n#define TPI_ITATBCTR0_ATREADY1S_Msk        (0x1UL /*<< TPI_ITATBCTR0_ATREADY1S_Pos*/)  /*!< TPI ITATBCTR0: ATREADY1S Mask */\r\n\r\n/* TPI Integration Mode Control Register Definitions */\r\n#define TPI_ITCTRL_Mode_Pos                 0U                                         /*!< TPI ITCTRL: Mode Position */\r\n#define TPI_ITCTRL_Mode_Msk                (0x3UL /*<< TPI_ITCTRL_Mode_Pos*/)          /*!< TPI ITCTRL: Mode Mask */\r\n\r\n/* TPI DEVID Register Definitions */\r\n#define TPI_DEVID_NRZVALID_Pos             11U                                         /*!< TPI DEVID: NRZVALID Position */\r\n#define TPI_DEVID_NRZVALID_Msk             (0x1UL << TPI_DEVID_NRZVALID_Pos)           /*!< TPI DEVID: NRZVALID Mask */\r\n\r\n#define TPI_DEVID_MANCVALID_Pos            10U                                         /*!< TPI DEVID: MANCVALID Position */\r\n#define TPI_DEVID_MANCVALID_Msk            (0x1UL << TPI_DEVID_MANCVALID_Pos)          /*!< TPI DEVID: MANCVALID Mask */\r\n\r\n#define TPI_DEVID_PTINVALID_Pos             9U                                         /*!< TPI DEVID: PTINVALID Position */\r\n#define TPI_DEVID_PTINVALID_Msk            (0x1UL << TPI_DEVID_PTINVALID_Pos)          /*!< TPI DEVID: PTINVALID Mask */\r\n\r\n#define TPI_DEVID_FIFOSZ_Pos                6U                                         /*!< TPI DEVID: FIFOSZ Position */\r\n#define TPI_DEVID_FIFOSZ_Msk               (0x7UL << TPI_DEVID_FIFOSZ_Pos)             /*!< TPI DEVID: FIFOSZ Mask */\r\n\r\n#define TPI_DEVID_NrTraceInput_Pos          0U                                         /*!< TPI DEVID: NrTraceInput Position */\r\n#define TPI_DEVID_NrTraceInput_Msk         (0x3FUL /*<< TPI_DEVID_NrTraceInput_Pos*/)  /*!< TPI DEVID: NrTraceInput Mask */\r\n\r\n/* TPI DEVTYPE Register Definitions */\r\n#define TPI_DEVTYPE_SubType_Pos             4U                                         /*!< TPI DEVTYPE: SubType Position */\r\n#define TPI_DEVTYPE_SubType_Msk            (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/)      /*!< TPI DEVTYPE: SubType Mask */\r\n\r\n#define TPI_DEVTYPE_MajorType_Pos           0U                                         /*!< TPI DEVTYPE: MajorType Position */\r\n#define TPI_DEVTYPE_MajorType_Msk          (0xFUL << TPI_DEVTYPE_MajorType_Pos)        /*!< TPI DEVTYPE: MajorType Mask */\r\n\r\n/*@}*/ /* end of group CMSIS_TPI */\r\n\r\n\r\n#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\r\n/**\r\n  \\ingroup  CMSIS_core_register\r\n  \\defgroup CMSIS_MPU     Memory Protection Unit (MPU)\r\n  \\brief    Type definitions for the Memory Protection Unit (MPU)\r\n  @{\r\n */\r\n\r\n/**\r\n  \\brief  Structure type to access the Memory Protection Unit (MPU).\r\n */\r\ntypedef struct\r\n{\r\n  __IM  uint32_t TYPE;                   /*!< Offset: 0x000 (R/ )  MPU Type Register */\r\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x004 (R/W)  MPU Control Register */\r\n  __IOM uint32_t RNR;                    /*!< Offset: 0x008 (R/W)  MPU Region Number Register */\r\n  __IOM uint32_t RBAR;                   /*!< Offset: 0x00C (R/W)  MPU Region Base Address Register */\r\n  __IOM uint32_t RLAR;                   /*!< Offset: 0x010 (R/W)  MPU Region Limit Address Register */\r\n  __IOM uint32_t RBAR_A1;                /*!< Offset: 0x014 (R/W)  MPU Region Base Address Register Alias 1 */\r\n  __IOM uint32_t RLAR_A1;                /*!< Offset: 0x018 (R/W)  MPU Region Limit Address Register Alias 1 */\r\n  __IOM uint32_t RBAR_A2;                /*!< Offset: 0x01C (R/W)  MPU Region Base Address Register Alias 2 */\r\n  __IOM uint32_t RLAR_A2;                /*!< Offset: 0x020 (R/W)  MPU Region Limit Address Register Alias 2 */\r\n  __IOM uint32_t RBAR_A3;                /*!< Offset: 0x024 (R/W)  MPU Region Base Address Register Alias 3 */\r\n  __IOM uint32_t RLAR_A3;                /*!< Offset: 0x028 (R/W)  MPU Region Limit Address Register Alias 3 */\r\n        uint32_t RESERVED0[1];\r\n  union {\r\n  __IOM uint32_t MAIR[2];\r\n  struct {\r\n  __IOM uint32_t MAIR0;                  /*!< Offset: 0x030 (R/W)  MPU Memory Attribute Indirection Register 0 */\r\n  __IOM uint32_t MAIR1;                  /*!< Offset: 0x034 (R/W)  MPU Memory Attribute Indirection Register 1 */\r\n  };\r\n  };\r\n} MPU_Type;\r\n\r\n#define MPU_TYPE_RALIASES                  4U\r\n\r\n/* MPU Type Register Definitions */\r\n#define MPU_TYPE_IREGION_Pos               16U                                            /*!< MPU TYPE: IREGION Position */\r\n#define MPU_TYPE_IREGION_Msk               (0xFFUL << MPU_TYPE_IREGION_Pos)               /*!< MPU TYPE: IREGION Mask */\r\n\r\n#define MPU_TYPE_DREGION_Pos                8U                                            /*!< MPU TYPE: DREGION Position */\r\n#define MPU_TYPE_DREGION_Msk               (0xFFUL << MPU_TYPE_DREGION_Pos)               /*!< MPU TYPE: DREGION Mask */\r\n\r\n#define MPU_TYPE_SEPARATE_Pos               0U                                            /*!< MPU TYPE: SEPARATE Position */\r\n#define MPU_TYPE_SEPARATE_Msk              (1UL /*<< MPU_TYPE_SEPARATE_Pos*/)             /*!< MPU TYPE: SEPARATE Mask */\r\n\r\n/* MPU Control Register Definitions */\r\n#define MPU_CTRL_PRIVDEFENA_Pos             2U                                            /*!< MPU CTRL: PRIVDEFENA Position */\r\n#define MPU_CTRL_PRIVDEFENA_Msk            (1UL << MPU_CTRL_PRIVDEFENA_Pos)               /*!< MPU CTRL: PRIVDEFENA Mask */\r\n\r\n#define MPU_CTRL_HFNMIENA_Pos               1U                                            /*!< MPU CTRL: HFNMIENA Position */\r\n#define MPU_CTRL_HFNMIENA_Msk              (1UL << MPU_CTRL_HFNMIENA_Pos)                 /*!< MPU CTRL: HFNMIENA Mask */\r\n\r\n#define MPU_CTRL_ENABLE_Pos                 0U                                            /*!< MPU CTRL: ENABLE Position */\r\n#define MPU_CTRL_ENABLE_Msk                (1UL /*<< MPU_CTRL_ENABLE_Pos*/)               /*!< MPU CTRL: ENABLE Mask */\r\n\r\n/* MPU Region Number Register Definitions */\r\n#define MPU_RNR_REGION_Pos                  0U                                            /*!< MPU RNR: REGION Position */\r\n#define MPU_RNR_REGION_Msk                 (0xFFUL /*<< MPU_RNR_REGION_Pos*/)             /*!< MPU RNR: REGION Mask */\r\n\r\n/* MPU Region Base Address Register Definitions */\r\n#define MPU_RBAR_BASE_Pos                   5U                                            /*!< MPU RBAR: BASE Position */\r\n#define MPU_RBAR_BASE_Msk                  (0x7FFFFFFUL << MPU_RBAR_BASE_Pos)             /*!< MPU RBAR: BASE Mask */\r\n\r\n#define MPU_RBAR_SH_Pos                     3U                                            /*!< MPU RBAR: SH Position */\r\n#define MPU_RBAR_SH_Msk                    (0x3UL << MPU_RBAR_SH_Pos)                     /*!< MPU RBAR: SH Mask */\r\n\r\n#define MPU_RBAR_AP_Pos                     1U                                            /*!< MPU RBAR: AP Position */\r\n#define MPU_RBAR_AP_Msk                    (0x3UL << MPU_RBAR_AP_Pos)                     /*!< MPU RBAR: AP Mask */\r\n\r\n#define MPU_RBAR_XN_Pos                     0U                                            /*!< MPU RBAR: XN Position */\r\n#define MPU_RBAR_XN_Msk                    (01UL /*<< MPU_RBAR_XN_Pos*/)                  /*!< MPU RBAR: XN Mask */\r\n\r\n/* MPU Region Limit Address Register Definitions */\r\n#define MPU_RLAR_LIMIT_Pos                  5U                                            /*!< MPU RLAR: LIMIT Position */\r\n#define MPU_RLAR_LIMIT_Msk                 (0x7FFFFFFUL << MPU_RLAR_LIMIT_Pos)            /*!< MPU RLAR: LIMIT Mask */\r\n\r\n#define MPU_RLAR_AttrIndx_Pos               1U                                            /*!< MPU RLAR: AttrIndx Position */\r\n#define MPU_RLAR_AttrIndx_Msk              (0x7UL << MPU_RLAR_AttrIndx_Pos)               /*!< MPU RLAR: AttrIndx Mask */\r\n\r\n#define MPU_RLAR_EN_Pos                     0U                                            /*!< MPU RLAR: Region enable bit Position */\r\n#define MPU_RLAR_EN_Msk                    (1UL /*<< MPU_RLAR_EN_Pos*/)                   /*!< MPU RLAR: Region enable bit Disable Mask */\r\n\r\n/* MPU Memory Attribute Indirection Register 0 Definitions */\r\n#define MPU_MAIR0_Attr3_Pos                24U                                            /*!< MPU MAIR0: Attr3 Position */\r\n#define MPU_MAIR0_Attr3_Msk                (0xFFUL << MPU_MAIR0_Attr3_Pos)                /*!< MPU MAIR0: Attr3 Mask */\r\n\r\n#define MPU_MAIR0_Attr2_Pos                16U                                            /*!< MPU MAIR0: Attr2 Position */\r\n#define MPU_MAIR0_Attr2_Msk                (0xFFUL << MPU_MAIR0_Attr2_Pos)                /*!< MPU MAIR0: Attr2 Mask */\r\n\r\n#define MPU_MAIR0_Attr1_Pos                 8U                                            /*!< MPU MAIR0: Attr1 Position */\r\n#define MPU_MAIR0_Attr1_Msk                (0xFFUL << MPU_MAIR0_Attr1_Pos)                /*!< MPU MAIR0: Attr1 Mask */\r\n\r\n#define MPU_MAIR0_Attr0_Pos                 0U                                            /*!< MPU MAIR0: Attr0 Position */\r\n#define MPU_MAIR0_Attr0_Msk                (0xFFUL /*<< MPU_MAIR0_Attr0_Pos*/)            /*!< MPU MAIR0: Attr0 Mask */\r\n\r\n/* MPU Memory Attribute Indirection Register 1 Definitions */\r\n#define MPU_MAIR1_Attr7_Pos                24U                                            /*!< MPU MAIR1: Attr7 Position */\r\n#define MPU_MAIR1_Attr7_Msk                (0xFFUL << MPU_MAIR1_Attr7_Pos)                /*!< MPU MAIR1: Attr7 Mask */\r\n\r\n#define MPU_MAIR1_Attr6_Pos                16U                                            /*!< MPU MAIR1: Attr6 Position */\r\n#define MPU_MAIR1_Attr6_Msk                (0xFFUL << MPU_MAIR1_Attr6_Pos)                /*!< MPU MAIR1: Attr6 Mask */\r\n\r\n#define MPU_MAIR1_Attr5_Pos                 8U                                            /*!< MPU MAIR1: Attr5 Position */\r\n#define MPU_MAIR1_Attr5_Msk                (0xFFUL << MPU_MAIR1_Attr5_Pos)                /*!< MPU MAIR1: Attr5 Mask */\r\n\r\n#define MPU_MAIR1_Attr4_Pos                 0U                                            /*!< MPU MAIR1: Attr4 Position */\r\n#define MPU_MAIR1_Attr4_Msk                (0xFFUL /*<< MPU_MAIR1_Attr4_Pos*/)            /*!< MPU MAIR1: Attr4 Mask */\r\n\r\n/*@} end of group CMSIS_MPU */\r\n#endif\r\n\r\n\r\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\r\n/**\r\n  \\ingroup  CMSIS_core_register\r\n  \\defgroup CMSIS_SAU     Security Attribution Unit (SAU)\r\n  \\brief    Type definitions for the Security Attribution Unit (SAU)\r\n  @{\r\n */\r\n\r\n/**\r\n  \\brief  Structure type to access the Security Attribution Unit (SAU).\r\n */\r\ntypedef struct\r\n{\r\n  __IOM uint32_t CTRL;                   /*!< Offset: 0x000 (R/W)  SAU Control Register */\r\n  __IM  uint32_t TYPE;                   /*!< Offset: 0x004 (R/ )  SAU Type Register */\r\n#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U)\r\n  __IOM uint32_t RNR;                    /*!< Offset: 0x008 (R/W)  SAU Region Number Register */\r\n  __IOM uint32_t RBAR;                   /*!< Offset: 0x00C (R/W)  SAU Region Base Address Register */\r\n  __IOM uint32_t RLAR;                   /*!< Offset: 0x010 (R/W)  SAU Region Limit Address Register */\r\n#else\r\n        uint32_t RESERVED0[3];\r\n#endif\r\n  __IOM uint32_t SFSR;                   /*!< Offset: 0x014 (R/W)  Secure Fault Status Register */\r\n  __IOM uint32_t SFAR;                   /*!< Offset: 0x018 (R/W)  Secure Fault Address Register */\r\n} SAU_Type;\r\n\r\n/* SAU Control Register Definitions */\r\n#define SAU_CTRL_ALLNS_Pos                  1U                                            /*!< SAU CTRL: ALLNS Position */\r\n#define SAU_CTRL_ALLNS_Msk                 (1UL << SAU_CTRL_ALLNS_Pos)                    /*!< SAU CTRL: ALLNS Mask */\r\n\r\n#define SAU_CTRL_ENABLE_Pos                 0U                                            /*!< SAU CTRL: ENABLE Position */\r\n#define SAU_CTRL_ENABLE_Msk                (1UL /*<< SAU_CTRL_ENABLE_Pos*/)               /*!< SAU CTRL: ENABLE Mask */\r\n\r\n/* SAU Type Register Definitions */\r\n#define SAU_TYPE_SREGION_Pos                0U                                            /*!< SAU TYPE: SREGION Position */\r\n#define SAU_TYPE_SREGION_Msk               (0xFFUL /*<< SAU_TYPE_SREGION_Pos*/)           /*!< SAU TYPE: SREGION Mask */\r\n\r\n#if defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U)\r\n/* SAU Region Number Register Definitions */\r\n#define SAU_RNR_REGION_Pos                  0U                                            /*!< SAU RNR: REGION Position */\r\n#define SAU_RNR_REGION_Msk                 (0xFFUL /*<< SAU_RNR_REGION_Pos*/)             /*!< SAU RNR: REGION Mask */\r\n\r\n/* SAU Region Base Address Register Definitions */\r\n#define SAU_RBAR_BADDR_Pos                  5U                                            /*!< SAU RBAR: BADDR Position */\r\n#define SAU_RBAR_BADDR_Msk                 (0x7FFFFFFUL << SAU_RBAR_BADDR_Pos)            /*!< SAU RBAR: BADDR Mask */\r\n\r\n/* SAU Region Limit Address Register Definitions */\r\n#define SAU_RLAR_LADDR_Pos                  5U                                            /*!< SAU RLAR: LADDR Position */\r\n#define SAU_RLAR_LADDR_Msk                 (0x7FFFFFFUL << SAU_RLAR_LADDR_Pos)            /*!< SAU RLAR: LADDR Mask */\r\n\r\n#define SAU_RLAR_NSC_Pos                    1U                                            /*!< SAU RLAR: NSC Position */\r\n#define SAU_RLAR_NSC_Msk                   (1UL << SAU_RLAR_NSC_Pos)                      /*!< SAU RLAR: NSC Mask */\r\n\r\n#define SAU_RLAR_ENABLE_Pos                 0U                                            /*!< SAU RLAR: ENABLE Position */\r\n#define SAU_RLAR_ENABLE_Msk                (1UL /*<< SAU_RLAR_ENABLE_Pos*/)               /*!< SAU RLAR: ENABLE Mask */\r\n\r\n#endif /* defined (__SAUREGION_PRESENT) && (__SAUREGION_PRESENT == 1U) */\r\n\r\n/* Secure Fault Status Register Definitions */\r\n#define SAU_SFSR_LSERR_Pos                  7U                                            /*!< SAU SFSR: LSERR Position */\r\n#define SAU_SFSR_LSERR_Msk                 (1UL << SAU_SFSR_LSERR_Pos)                    /*!< SAU SFSR: LSERR Mask */\r\n\r\n#define SAU_SFSR_SFARVALID_Pos              6U                                            /*!< SAU SFSR: SFARVALID Position */\r\n#define SAU_SFSR_SFARVALID_Msk             (1UL << SAU_SFSR_SFARVALID_Pos)                /*!< SAU SFSR: SFARVALID Mask */\r\n\r\n#define SAU_SFSR_LSPERR_Pos                 5U                                            /*!< SAU SFSR: LSPERR Position */\r\n#define SAU_SFSR_LSPERR_Msk                (1UL << SAU_SFSR_LSPERR_Pos)                   /*!< SAU SFSR: LSPERR Mask */\r\n\r\n#define SAU_SFSR_INVTRAN_Pos                4U                                            /*!< SAU SFSR: INVTRAN Position */\r\n#define SAU_SFSR_INVTRAN_Msk               (1UL << SAU_SFSR_INVTRAN_Pos)                  /*!< SAU SFSR: INVTRAN Mask */\r\n\r\n#define SAU_SFSR_AUVIOL_Pos                 3U                                            /*!< SAU SFSR: AUVIOL Position */\r\n#define SAU_SFSR_AUVIOL_Msk                (1UL << SAU_SFSR_AUVIOL_Pos)                   /*!< SAU SFSR: AUVIOL Mask */\r\n\r\n#define SAU_SFSR_INVER_Pos                  2U                                            /*!< SAU SFSR: INVER Position */\r\n#define SAU_SFSR_INVER_Msk                 (1UL << SAU_SFSR_INVER_Pos)                    /*!< SAU SFSR: INVER Mask */\r\n\r\n#define SAU_SFSR_INVIS_Pos                  1U                                            /*!< SAU SFSR: INVIS Position */\r\n#define SAU_SFSR_INVIS_Msk                 (1UL << SAU_SFSR_INVIS_Pos)                    /*!< SAU SFSR: INVIS Mask */\r\n\r\n#define SAU_SFSR_INVEP_Pos                  0U                                            /*!< SAU SFSR: INVEP Position */\r\n#define SAU_SFSR_INVEP_Msk                 (1UL /*<< SAU_SFSR_INVEP_Pos*/)                /*!< SAU SFSR: INVEP Mask */\r\n\r\n/*@} end of group CMSIS_SAU */\r\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\r\n\r\n\r\n/**\r\n  \\ingroup  CMSIS_core_register\r\n  \\defgroup CMSIS_FPU     Floating Point Unit (FPU)\r\n  \\brief    Type definitions for the Floating Point Unit (FPU)\r\n  @{\r\n */\r\n\r\n/**\r\n  \\brief  Structure type to access the Floating Point Unit (FPU).\r\n */\r\ntypedef struct\r\n{\r\n        uint32_t RESERVED0[1U];\r\n  __IOM uint32_t FPCCR;                  /*!< Offset: 0x004 (R/W)  Floating-Point Context Control Register */\r\n  __IOM uint32_t FPCAR;                  /*!< Offset: 0x008 (R/W)  Floating-Point Context Address Register */\r\n  __IOM uint32_t FPDSCR;                 /*!< Offset: 0x00C (R/W)  Floating-Point Default Status Control Register */\r\n  __IM  uint32_t MVFR0;                  /*!< Offset: 0x010 (R/ )  Media and VFP Feature Register 0 */\r\n  __IM  uint32_t MVFR1;                  /*!< Offset: 0x014 (R/ )  Media and VFP Feature Register 1 */\r\n  __IM  uint32_t MVFR2;                  /*!< Offset: 0x018 (R/ )  Media and VFP Feature Register 2 */\r\n} FPU_Type;\r\n\r\n/* Floating-Point Context Control Register Definitions */\r\n#define FPU_FPCCR_ASPEN_Pos                31U                                            /*!< FPCCR: ASPEN bit Position */\r\n#define FPU_FPCCR_ASPEN_Msk                (1UL << FPU_FPCCR_ASPEN_Pos)                   /*!< FPCCR: ASPEN bit Mask */\r\n\r\n#define FPU_FPCCR_LSPEN_Pos                30U                                            /*!< FPCCR: LSPEN Position */\r\n#define FPU_FPCCR_LSPEN_Msk                (1UL << FPU_FPCCR_LSPEN_Pos)                   /*!< FPCCR: LSPEN bit Mask */\r\n\r\n#define FPU_FPCCR_LSPENS_Pos               29U                                            /*!< FPCCR: LSPENS Position */\r\n#define FPU_FPCCR_LSPENS_Msk               (1UL << FPU_FPCCR_LSPENS_Pos)                  /*!< FPCCR: LSPENS bit Mask */\r\n\r\n#define FPU_FPCCR_CLRONRET_Pos             28U                                            /*!< FPCCR: CLRONRET Position */\r\n#define FPU_FPCCR_CLRONRET_Msk             (1UL << FPU_FPCCR_CLRONRET_Pos)                /*!< FPCCR: CLRONRET bit Mask */\r\n\r\n#define FPU_FPCCR_CLRONRETS_Pos            27U                                            /*!< FPCCR: CLRONRETS Position */\r\n#define FPU_FPCCR_CLRONRETS_Msk            (1UL << FPU_FPCCR_CLRONRETS_Pos)               /*!< FPCCR: CLRONRETS bit Mask */\r\n\r\n#define FPU_FPCCR_TS_Pos                   26U                                            /*!< FPCCR: TS Position */\r\n#define FPU_FPCCR_TS_Msk                   (1UL << FPU_FPCCR_TS_Pos)                      /*!< FPCCR: TS bit Mask */\r\n\r\n#define FPU_FPCCR_UFRDY_Pos                10U                                            /*!< FPCCR: UFRDY Position */\r\n#define FPU_FPCCR_UFRDY_Msk                (1UL << FPU_FPCCR_UFRDY_Pos)                   /*!< FPCCR: UFRDY bit Mask */\r\n\r\n#define FPU_FPCCR_SPLIMVIOL_Pos             9U                                            /*!< FPCCR: SPLIMVIOL Position */\r\n#define FPU_FPCCR_SPLIMVIOL_Msk            (1UL << FPU_FPCCR_SPLIMVIOL_Pos)               /*!< FPCCR: SPLIMVIOL bit Mask */\r\n\r\n#define FPU_FPCCR_MONRDY_Pos                8U                                            /*!< FPCCR: MONRDY Position */\r\n#define FPU_FPCCR_MONRDY_Msk               (1UL << FPU_FPCCR_MONRDY_Pos)                  /*!< FPCCR: MONRDY bit Mask */\r\n\r\n#define FPU_FPCCR_SFRDY_Pos                 7U                                            /*!< FPCCR: SFRDY Position */\r\n#define FPU_FPCCR_SFRDY_Msk                (1UL << FPU_FPCCR_SFRDY_Pos)                   /*!< FPCCR: SFRDY bit Mask */\r\n\r\n#define FPU_FPCCR_BFRDY_Pos                 6U                                            /*!< FPCCR: BFRDY Position */\r\n#define FPU_FPCCR_BFRDY_Msk                (1UL << FPU_FPCCR_BFRDY_Pos)                   /*!< FPCCR: BFRDY bit Mask */\r\n\r\n#define FPU_FPCCR_MMRDY_Pos                 5U                                            /*!< FPCCR: MMRDY Position */\r\n#define FPU_FPCCR_MMRDY_Msk                (1UL << FPU_FPCCR_MMRDY_Pos)                   /*!< FPCCR: MMRDY bit Mask */\r\n\r\n#define FPU_FPCCR_HFRDY_Pos                 4U                                            /*!< FPCCR: HFRDY Position */\r\n#define FPU_FPCCR_HFRDY_Msk                (1UL << FPU_FPCCR_HFRDY_Pos)                   /*!< FPCCR: HFRDY bit Mask */\r\n\r\n#define FPU_FPCCR_THREAD_Pos                3U                                            /*!< FPCCR: processor mode bit Position */\r\n#define FPU_FPCCR_THREAD_Msk               (1UL << FPU_FPCCR_THREAD_Pos)                  /*!< FPCCR: processor mode active bit Mask */\r\n\r\n#define FPU_FPCCR_S_Pos                     2U                                            /*!< FPCCR: Security status of the FP context bit Position */\r\n#define FPU_FPCCR_S_Msk                    (1UL << FPU_FPCCR_S_Pos)                       /*!< FPCCR: Security status of the FP context bit Mask */\r\n\r\n#define FPU_FPCCR_USER_Pos                  1U                                            /*!< FPCCR: privilege level bit Position */\r\n#define FPU_FPCCR_USER_Msk                 (1UL << FPU_FPCCR_USER_Pos)                    /*!< FPCCR: privilege level bit Mask */\r\n\r\n#define FPU_FPCCR_LSPACT_Pos                0U                                            /*!< FPCCR: Lazy state preservation active bit Position */\r\n#define FPU_FPCCR_LSPACT_Msk               (1UL /*<< FPU_FPCCR_LSPACT_Pos*/)              /*!< FPCCR: Lazy state preservation active bit Mask */\r\n\r\n/* Floating-Point Context Address Register Definitions */\r\n#define FPU_FPCAR_ADDRESS_Pos               3U                                            /*!< FPCAR: ADDRESS bit Position */\r\n#define FPU_FPCAR_ADDRESS_Msk              (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos)        /*!< FPCAR: ADDRESS bit Mask */\r\n\r\n/* Floating-Point Default Status Control Register Definitions */\r\n#define FPU_FPDSCR_AHP_Pos                 26U                                            /*!< FPDSCR: AHP bit Position */\r\n#define FPU_FPDSCR_AHP_Msk                 (1UL << FPU_FPDSCR_AHP_Pos)                    /*!< FPDSCR: AHP bit Mask */\r\n\r\n#define FPU_FPDSCR_DN_Pos                  25U                                            /*!< FPDSCR: DN bit Position */\r\n#define FPU_FPDSCR_DN_Msk                  (1UL << FPU_FPDSCR_DN_Pos)                     /*!< FPDSCR: DN bit Mask */\r\n\r\n#define FPU_FPDSCR_FZ_Pos                  24U                                            /*!< FPDSCR: FZ bit Position */\r\n#define FPU_FPDSCR_FZ_Msk                  (1UL << FPU_FPDSCR_FZ_Pos)                     /*!< FPDSCR: FZ bit Mask */\r\n\r\n#define FPU_FPDSCR_RMode_Pos               22U                                            /*!< FPDSCR: RMode bit Position */\r\n#define FPU_FPDSCR_RMode_Msk               (3UL << FPU_FPDSCR_RMode_Pos)                  /*!< FPDSCR: RMode bit Mask */\r\n\r\n/* Media and VFP Feature Register 0 Definitions */\r\n#define FPU_MVFR0_FP_rounding_modes_Pos    28U                                            /*!< MVFR0: FP rounding modes bits Position */\r\n#define FPU_MVFR0_FP_rounding_modes_Msk    (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos)     /*!< MVFR0: FP rounding modes bits Mask */\r\n\r\n#define FPU_MVFR0_Short_vectors_Pos        24U                                            /*!< MVFR0: Short vectors bits Position */\r\n#define FPU_MVFR0_Short_vectors_Msk        (0xFUL << FPU_MVFR0_Short_vectors_Pos)         /*!< MVFR0: Short vectors bits Mask */\r\n\r\n#define FPU_MVFR0_Square_root_Pos          20U                                            /*!< MVFR0: Square root bits Position */\r\n#define FPU_MVFR0_Square_root_Msk          (0xFUL << FPU_MVFR0_Square_root_Pos)           /*!< MVFR0: Square root bits Mask */\r\n\r\n#define FPU_MVFR0_Divide_Pos               16U                                            /*!< MVFR0: Divide bits Position */\r\n#define FPU_MVFR0_Divide_Msk               (0xFUL << FPU_MVFR0_Divide_Pos)                /*!< MVFR0: Divide bits Mask */\r\n\r\n#define FPU_MVFR0_FP_excep_trapping_Pos    12U                                            /*!< MVFR0: FP exception trapping bits Position */\r\n#define FPU_MVFR0_FP_excep_trapping_Msk    (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos)     /*!< MVFR0: FP exception trapping bits Mask */\r\n\r\n#define FPU_MVFR0_Double_precision_Pos      8U                                            /*!< MVFR0: Double-precision bits Position */\r\n#define FPU_MVFR0_Double_precision_Msk     (0xFUL << FPU_MVFR0_Double_precision_Pos)      /*!< MVFR0: Double-precision bits Mask */\r\n\r\n#define FPU_MVFR0_Single_precision_Pos      4U                                            /*!< MVFR0: Single-precision bits Position */\r\n#define FPU_MVFR0_Single_precision_Msk     (0xFUL << FPU_MVFR0_Single_precision_Pos)      /*!< MVFR0: Single-precision bits Mask */\r\n\r\n#define FPU_MVFR0_A_SIMD_registers_Pos      0U                                            /*!< MVFR0: A_SIMD registers bits Position */\r\n#define FPU_MVFR0_A_SIMD_registers_Msk     (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/)  /*!< MVFR0: A_SIMD registers bits Mask */\r\n\r\n/* Media and VFP Feature Register 1 Definitions */\r\n#define FPU_MVFR1_FP_fused_MAC_Pos         28U                                            /*!< MVFR1: FP fused MAC bits Position */\r\n#define FPU_MVFR1_FP_fused_MAC_Msk         (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos)          /*!< MVFR1: FP fused MAC bits Mask */\r\n\r\n#define FPU_MVFR1_FP_HPFP_Pos              24U                                            /*!< MVFR1: FP HPFP bits Position */\r\n#define FPU_MVFR1_FP_HPFP_Msk              (0xFUL << FPU_MVFR1_FP_HPFP_Pos)               /*!< MVFR1: FP HPFP bits Mask */\r\n\r\n#define FPU_MVFR1_D_NaN_mode_Pos            4U                                            /*!< MVFR1: D_NaN mode bits Position */\r\n#define FPU_MVFR1_D_NaN_mode_Msk           (0xFUL << FPU_MVFR1_D_NaN_mode_Pos)            /*!< MVFR1: D_NaN mode bits Mask */\r\n\r\n#define FPU_MVFR1_FtZ_mode_Pos              0U                                            /*!< MVFR1: FtZ mode bits Position */\r\n#define FPU_MVFR1_FtZ_mode_Msk             (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/)          /*!< MVFR1: FtZ mode bits Mask */\r\n\r\n/* Media and VFP Feature Register 2 Definitions */\r\n#define FPU_MVFR2_FPMisc_Pos                4U                                            /*!< MVFR2: FPMisc bits Position */\r\n#define FPU_MVFR2_FPMisc_Msk               (0xFUL << FPU_MVFR2_FPMisc_Pos)                /*!< MVFR2: FPMisc bits Mask */\r\n\r\n/*@} end of group CMSIS_FPU */\r\n\r\n/* CoreDebug is deprecated. replaced by DCB (Debug Control Block) */\r\n/**\r\n  \\ingroup  CMSIS_core_register\r\n  \\defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug)\r\n  \\brief    Type definitions for the Core Debug Registers\r\n  @{\r\n */\r\n\r\n/**\r\n  \\brief  \\deprecated Structure type to access the Core Debug Register (CoreDebug).\r\n */\r\ntypedef struct\r\n{\r\n  __IOM uint32_t DHCSR;                  /*!< Offset: 0x000 (R/W)  Debug Halting Control and Status Register */\r\n  __OM  uint32_t DCRSR;                  /*!< Offset: 0x004 ( /W)  Debug Core Register Selector Register */\r\n  __IOM uint32_t DCRDR;                  /*!< Offset: 0x008 (R/W)  Debug Core Register Data Register */\r\n  __IOM uint32_t DEMCR;                  /*!< Offset: 0x00C (R/W)  Debug Exception and Monitor Control Register */\r\n        uint32_t RESERVED0[1U];\r\n  __IOM uint32_t DAUTHCTRL;              /*!< Offset: 0x014 (R/W)  Debug Authentication Control Register */\r\n  __IOM uint32_t DSCSR;                  /*!< Offset: 0x018 (R/W)  Debug Security Control and Status Register */\r\n} CoreDebug_Type;\r\n\r\n/* Debug Halting Control and Status Register Definitions */\r\n#define CoreDebug_DHCSR_DBGKEY_Pos         16U                                            /*!< \\deprecated CoreDebug DHCSR: DBGKEY Position */\r\n#define CoreDebug_DHCSR_DBGKEY_Msk         (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos)       /*!< \\deprecated CoreDebug DHCSR: DBGKEY Mask */\r\n\r\n#define CoreDebug_DHCSR_S_RESTART_ST_Pos   26U                                            /*!< \\deprecated CoreDebug DHCSR: S_RESTART_ST Position */\r\n#define CoreDebug_DHCSR_S_RESTART_ST_Msk   (1UL << CoreDebug_DHCSR_S_RESTART_ST_Pos)      /*!< \\deprecated CoreDebug DHCSR: S_RESTART_ST Mask */\r\n\r\n#define CoreDebug_DHCSR_S_RESET_ST_Pos     25U                                            /*!< \\deprecated CoreDebug DHCSR: S_RESET_ST Position */\r\n#define CoreDebug_DHCSR_S_RESET_ST_Msk     (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos)        /*!< \\deprecated CoreDebug DHCSR: S_RESET_ST Mask */\r\n\r\n#define CoreDebug_DHCSR_S_RETIRE_ST_Pos    24U                                            /*!< \\deprecated CoreDebug DHCSR: S_RETIRE_ST Position */\r\n#define CoreDebug_DHCSR_S_RETIRE_ST_Msk    (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos)       /*!< \\deprecated CoreDebug DHCSR: S_RETIRE_ST Mask */\r\n\r\n#define CoreDebug_DHCSR_S_LOCKUP_Pos       19U                                            /*!< \\deprecated CoreDebug DHCSR: S_LOCKUP Position */\r\n#define CoreDebug_DHCSR_S_LOCKUP_Msk       (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos)          /*!< \\deprecated CoreDebug DHCSR: S_LOCKUP Mask */\r\n\r\n#define CoreDebug_DHCSR_S_SLEEP_Pos        18U                                            /*!< \\deprecated CoreDebug DHCSR: S_SLEEP Position */\r\n#define CoreDebug_DHCSR_S_SLEEP_Msk        (1UL << CoreDebug_DHCSR_S_SLEEP_Pos)           /*!< \\deprecated CoreDebug DHCSR: S_SLEEP Mask */\r\n\r\n#define CoreDebug_DHCSR_S_HALT_Pos         17U                                            /*!< \\deprecated CoreDebug DHCSR: S_HALT Position */\r\n#define CoreDebug_DHCSR_S_HALT_Msk         (1UL << CoreDebug_DHCSR_S_HALT_Pos)            /*!< \\deprecated CoreDebug DHCSR: S_HALT Mask */\r\n\r\n#define CoreDebug_DHCSR_S_REGRDY_Pos       16U                                            /*!< \\deprecated CoreDebug DHCSR: S_REGRDY Position */\r\n#define CoreDebug_DHCSR_S_REGRDY_Msk       (1UL << CoreDebug_DHCSR_S_REGRDY_Pos)          /*!< \\deprecated CoreDebug DHCSR: S_REGRDY Mask */\r\n\r\n#define CoreDebug_DHCSR_C_SNAPSTALL_Pos     5U                                            /*!< \\deprecated CoreDebug DHCSR: C_SNAPSTALL Position */\r\n#define CoreDebug_DHCSR_C_SNAPSTALL_Msk    (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos)       /*!< \\deprecated CoreDebug DHCSR: C_SNAPSTALL Mask */\r\n\r\n#define CoreDebug_DHCSR_C_MASKINTS_Pos      3U                                            /*!< \\deprecated CoreDebug DHCSR: C_MASKINTS Position */\r\n#define CoreDebug_DHCSR_C_MASKINTS_Msk     (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos)        /*!< \\deprecated CoreDebug DHCSR: C_MASKINTS Mask */\r\n\r\n#define CoreDebug_DHCSR_C_STEP_Pos          2U                                            /*!< \\deprecated CoreDebug DHCSR: C_STEP Position */\r\n#define CoreDebug_DHCSR_C_STEP_Msk         (1UL << CoreDebug_DHCSR_C_STEP_Pos)            /*!< \\deprecated CoreDebug DHCSR: C_STEP Mask */\r\n\r\n#define CoreDebug_DHCSR_C_HALT_Pos          1U                                            /*!< \\deprecated CoreDebug DHCSR: C_HALT Position */\r\n#define CoreDebug_DHCSR_C_HALT_Msk         (1UL << CoreDebug_DHCSR_C_HALT_Pos)            /*!< \\deprecated CoreDebug DHCSR: C_HALT Mask */\r\n\r\n#define CoreDebug_DHCSR_C_DEBUGEN_Pos       0U                                            /*!< \\deprecated CoreDebug DHCSR: C_DEBUGEN Position */\r\n#define CoreDebug_DHCSR_C_DEBUGEN_Msk      (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/)     /*!< \\deprecated CoreDebug DHCSR: C_DEBUGEN Mask */\r\n\r\n/* Debug Core Register Selector Register Definitions */\r\n#define CoreDebug_DCRSR_REGWnR_Pos         16U                                            /*!< \\deprecated CoreDebug DCRSR: REGWnR Position */\r\n#define CoreDebug_DCRSR_REGWnR_Msk         (1UL << CoreDebug_DCRSR_REGWnR_Pos)            /*!< \\deprecated CoreDebug DCRSR: REGWnR Mask */\r\n\r\n#define CoreDebug_DCRSR_REGSEL_Pos          0U                                            /*!< \\deprecated CoreDebug DCRSR: REGSEL Position */\r\n#define CoreDebug_DCRSR_REGSEL_Msk         (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/)     /*!< \\deprecated CoreDebug DCRSR: REGSEL Mask */\r\n\r\n/* Debug Exception and Monitor Control Register Definitions */\r\n#define CoreDebug_DEMCR_TRCENA_Pos         24U                                            /*!< \\deprecated CoreDebug DEMCR: TRCENA Position */\r\n#define CoreDebug_DEMCR_TRCENA_Msk         (1UL << CoreDebug_DEMCR_TRCENA_Pos)            /*!< \\deprecated CoreDebug DEMCR: TRCENA Mask */\r\n\r\n#define CoreDebug_DEMCR_MON_REQ_Pos        19U                                            /*!< \\deprecated CoreDebug DEMCR: MON_REQ Position */\r\n#define CoreDebug_DEMCR_MON_REQ_Msk        (1UL << CoreDebug_DEMCR_MON_REQ_Pos)           /*!< \\deprecated CoreDebug DEMCR: MON_REQ Mask */\r\n\r\n#define CoreDebug_DEMCR_MON_STEP_Pos       18U                                            /*!< \\deprecated CoreDebug DEMCR: MON_STEP Position */\r\n#define CoreDebug_DEMCR_MON_STEP_Msk       (1UL << CoreDebug_DEMCR_MON_STEP_Pos)          /*!< \\deprecated CoreDebug DEMCR: MON_STEP Mask */\r\n\r\n#define CoreDebug_DEMCR_MON_PEND_Pos       17U                                            /*!< \\deprecated CoreDebug DEMCR: MON_PEND Position */\r\n#define CoreDebug_DEMCR_MON_PEND_Msk       (1UL << CoreDebug_DEMCR_MON_PEND_Pos)          /*!< \\deprecated CoreDebug DEMCR: MON_PEND Mask */\r\n\r\n#define CoreDebug_DEMCR_MON_EN_Pos         16U                                            /*!< \\deprecated CoreDebug DEMCR: MON_EN Position */\r\n#define CoreDebug_DEMCR_MON_EN_Msk         (1UL << CoreDebug_DEMCR_MON_EN_Pos)            /*!< \\deprecated CoreDebug DEMCR: MON_EN Mask */\r\n\r\n#define CoreDebug_DEMCR_VC_HARDERR_Pos     10U                                            /*!< \\deprecated CoreDebug DEMCR: VC_HARDERR Position */\r\n#define CoreDebug_DEMCR_VC_HARDERR_Msk     (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos)        /*!< \\deprecated CoreDebug DEMCR: VC_HARDERR Mask */\r\n\r\n#define CoreDebug_DEMCR_VC_INTERR_Pos       9U                                            /*!< \\deprecated CoreDebug DEMCR: VC_INTERR Position */\r\n#define CoreDebug_DEMCR_VC_INTERR_Msk      (1UL << CoreDebug_DEMCR_VC_INTERR_Pos)         /*!< \\deprecated CoreDebug DEMCR: VC_INTERR Mask */\r\n\r\n#define CoreDebug_DEMCR_VC_BUSERR_Pos       8U                                            /*!< \\deprecated CoreDebug DEMCR: VC_BUSERR Position */\r\n#define CoreDebug_DEMCR_VC_BUSERR_Msk      (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos)         /*!< \\deprecated CoreDebug DEMCR: VC_BUSERR Mask */\r\n\r\n#define CoreDebug_DEMCR_VC_STATERR_Pos      7U                                            /*!< \\deprecated CoreDebug DEMCR: VC_STATERR Position */\r\n#define CoreDebug_DEMCR_VC_STATERR_Msk     (1UL << CoreDebug_DEMCR_VC_STATERR_Pos)        /*!< \\deprecated CoreDebug DEMCR: VC_STATERR Mask */\r\n\r\n#define CoreDebug_DEMCR_VC_CHKERR_Pos       6U                                            /*!< \\deprecated CoreDebug DEMCR: VC_CHKERR Position */\r\n#define CoreDebug_DEMCR_VC_CHKERR_Msk      (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos)         /*!< \\deprecated CoreDebug DEMCR: VC_CHKERR Mask */\r\n\r\n#define CoreDebug_DEMCR_VC_NOCPERR_Pos      5U                                            /*!< \\deprecated CoreDebug DEMCR: VC_NOCPERR Position */\r\n#define CoreDebug_DEMCR_VC_NOCPERR_Msk     (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos)        /*!< \\deprecated CoreDebug DEMCR: VC_NOCPERR Mask */\r\n\r\n#define CoreDebug_DEMCR_VC_MMERR_Pos        4U                                            /*!< \\deprecated CoreDebug DEMCR: VC_MMERR Position */\r\n#define CoreDebug_DEMCR_VC_MMERR_Msk       (1UL << CoreDebug_DEMCR_VC_MMERR_Pos)          /*!< \\deprecated CoreDebug DEMCR: VC_MMERR Mask */\r\n\r\n#define CoreDebug_DEMCR_VC_CORERESET_Pos    0U                                            /*!< \\deprecated CoreDebug DEMCR: VC_CORERESET Position */\r\n#define CoreDebug_DEMCR_VC_CORERESET_Msk   (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/)  /*!< \\deprecated CoreDebug DEMCR: VC_CORERESET Mask */\r\n\r\n/* Debug Authentication Control Register Definitions */\r\n#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos  3U                                            /*!< \\deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Position */\r\n#define CoreDebug_DAUTHCTRL_INTSPNIDEN_Msk (1UL << CoreDebug_DAUTHCTRL_INTSPNIDEN_Pos)    /*!< \\deprecated CoreDebug DAUTHCTRL: INTSPNIDEN, Mask */\r\n\r\n#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos  2U                                            /*!< \\deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Position */\r\n#define CoreDebug_DAUTHCTRL_SPNIDENSEL_Msk (1UL << CoreDebug_DAUTHCTRL_SPNIDENSEL_Pos)    /*!< \\deprecated CoreDebug DAUTHCTRL: SPNIDENSEL Mask */\r\n\r\n#define CoreDebug_DAUTHCTRL_INTSPIDEN_Pos   1U                                            /*!< \\deprecated CoreDebug DAUTHCTRL: INTSPIDEN Position */\r\n#define CoreDebug_DAUTHCTRL_INTSPIDEN_Msk  (1UL << CoreDebug_DAUTHCTRL_INTSPIDEN_Pos)     /*!< \\deprecated CoreDebug DAUTHCTRL: INTSPIDEN Mask */\r\n\r\n#define CoreDebug_DAUTHCTRL_SPIDENSEL_Pos   0U                                            /*!< \\deprecated CoreDebug DAUTHCTRL: SPIDENSEL Position */\r\n#define CoreDebug_DAUTHCTRL_SPIDENSEL_Msk  (1UL /*<< CoreDebug_DAUTHCTRL_SPIDENSEL_Pos*/) /*!< \\deprecated CoreDebug DAUTHCTRL: SPIDENSEL Mask */\r\n\r\n/* Debug Security Control and Status Register Definitions */\r\n#define CoreDebug_DSCSR_CDS_Pos            16U                                            /*!< \\deprecated CoreDebug DSCSR: CDS Position */\r\n#define CoreDebug_DSCSR_CDS_Msk            (1UL << CoreDebug_DSCSR_CDS_Pos)               /*!< \\deprecated CoreDebug DSCSR: CDS Mask */\r\n\r\n#define CoreDebug_DSCSR_SBRSEL_Pos          1U                                            /*!< \\deprecated CoreDebug DSCSR: SBRSEL Position */\r\n#define CoreDebug_DSCSR_SBRSEL_Msk         (1UL << CoreDebug_DSCSR_SBRSEL_Pos)            /*!< \\deprecated CoreDebug DSCSR: SBRSEL Mask */\r\n\r\n#define CoreDebug_DSCSR_SBRSELEN_Pos        0U                                            /*!< \\deprecated CoreDebug DSCSR: SBRSELEN Position */\r\n#define CoreDebug_DSCSR_SBRSELEN_Msk       (1UL /*<< CoreDebug_DSCSR_SBRSELEN_Pos*/)      /*!< \\deprecated CoreDebug DSCSR: SBRSELEN Mask */\r\n\r\n/*@} end of group CMSIS_CoreDebug */\r\n\r\n\r\n/**\r\n  \\ingroup    CMSIS_core_register\r\n  \\defgroup CMSIS_DCB       Debug Control Block\r\n  \\brief    Type definitions for the Debug Control Block Registers\r\n  @{\r\n */\r\n\r\n/**\r\n  \\brief  Structure type to access the Debug Control Block Registers (DCB).\r\n */\r\ntypedef struct\r\n{\r\n  __IOM uint32_t DHCSR;                  /*!< Offset: 0x000 (R/W)  Debug Halting Control and Status Register */\r\n  __OM  uint32_t DCRSR;                  /*!< Offset: 0x004 ( /W)  Debug Core Register Selector Register */\r\n  __IOM uint32_t DCRDR;                  /*!< Offset: 0x008 (R/W)  Debug Core Register Data Register */\r\n  __IOM uint32_t DEMCR;                  /*!< Offset: 0x00C (R/W)  Debug Exception and Monitor Control Register */\r\n        uint32_t RESERVED0[1U];\r\n  __IOM uint32_t DAUTHCTRL;              /*!< Offset: 0x014 (R/W)  Debug Authentication Control Register */\r\n  __IOM uint32_t DSCSR;                  /*!< Offset: 0x018 (R/W)  Debug Security Control and Status Register */\r\n} DCB_Type;\r\n\r\n/* DHCSR, Debug Halting Control and Status Register Definitions */\r\n#define DCB_DHCSR_DBGKEY_Pos               16U                                            /*!< DCB DHCSR: Debug key Position */\r\n#define DCB_DHCSR_DBGKEY_Msk               (0xFFFFUL << DCB_DHCSR_DBGKEY_Pos)             /*!< DCB DHCSR: Debug key Mask */\r\n\r\n#define DCB_DHCSR_S_RESTART_ST_Pos         26U                                            /*!< DCB DHCSR: Restart sticky status Position */\r\n#define DCB_DHCSR_S_RESTART_ST_Msk         (0x1UL << DCB_DHCSR_S_RESTART_ST_Pos)          /*!< DCB DHCSR: Restart sticky status Mask */\r\n\r\n#define DCB_DHCSR_S_RESET_ST_Pos           25U                                            /*!< DCB DHCSR: Reset sticky status Position */\r\n#define DCB_DHCSR_S_RESET_ST_Msk           (0x1UL << DCB_DHCSR_S_RESET_ST_Pos)            /*!< DCB DHCSR: Reset sticky status Mask */\r\n\r\n#define DCB_DHCSR_S_RETIRE_ST_Pos          24U                                            /*!< DCB DHCSR: Retire sticky status Position */\r\n#define DCB_DHCSR_S_RETIRE_ST_Msk          (0x1UL << DCB_DHCSR_S_RETIRE_ST_Pos)           /*!< DCB DHCSR: Retire sticky status Mask */\r\n\r\n#define DCB_DHCSR_S_SDE_Pos                20U                                            /*!< DCB DHCSR: Secure debug enabled Position */\r\n#define DCB_DHCSR_S_SDE_Msk                (0x1UL << DCB_DHCSR_S_SDE_Pos)                 /*!< DCB DHCSR: Secure debug enabled Mask */\r\n\r\n#define DCB_DHCSR_S_LOCKUP_Pos             19U                                            /*!< DCB DHCSR: Lockup status Position */\r\n#define DCB_DHCSR_S_LOCKUP_Msk             (0x1UL << DCB_DHCSR_S_LOCKUP_Pos)              /*!< DCB DHCSR: Lockup status Mask */\r\n\r\n#define DCB_DHCSR_S_SLEEP_Pos              18U                                            /*!< DCB DHCSR: Sleeping status Position */\r\n#define DCB_DHCSR_S_SLEEP_Msk              (0x1UL << DCB_DHCSR_S_SLEEP_Pos)               /*!< DCB DHCSR: Sleeping status Mask */\r\n\r\n#define DCB_DHCSR_S_HALT_Pos               17U                                            /*!< DCB DHCSR: Halted status Position */\r\n#define DCB_DHCSR_S_HALT_Msk               (0x1UL << DCB_DHCSR_S_HALT_Pos)                /*!< DCB DHCSR: Halted status Mask */\r\n\r\n#define DCB_DHCSR_S_REGRDY_Pos             16U                                            /*!< DCB DHCSR: Register ready status Position */\r\n#define DCB_DHCSR_S_REGRDY_Msk             (0x1UL << DCB_DHCSR_S_REGRDY_Pos)              /*!< DCB DHCSR: Register ready status Mask */\r\n\r\n#define DCB_DHCSR_C_SNAPSTALL_Pos           5U                                            /*!< DCB DHCSR: Snap stall control Position */\r\n#define DCB_DHCSR_C_SNAPSTALL_Msk          (0x1UL << DCB_DHCSR_C_SNAPSTALL_Pos)           /*!< DCB DHCSR: Snap stall control Mask */\r\n\r\n#define DCB_DHCSR_C_MASKINTS_Pos            3U                                            /*!< DCB DHCSR: Mask interrupts control Position */\r\n#define DCB_DHCSR_C_MASKINTS_Msk           (0x1UL << DCB_DHCSR_C_MASKINTS_Pos)            /*!< DCB DHCSR: Mask interrupts control Mask */\r\n\r\n#define DCB_DHCSR_C_STEP_Pos                2U                                            /*!< DCB DHCSR: Step control Position */\r\n#define DCB_DHCSR_C_STEP_Msk               (0x1UL << DCB_DHCSR_C_STEP_Pos)                /*!< DCB DHCSR: Step control Mask */\r\n\r\n#define DCB_DHCSR_C_HALT_Pos                1U                                            /*!< DCB DHCSR: Halt control Position */\r\n#define DCB_DHCSR_C_HALT_Msk               (0x1UL << DCB_DHCSR_C_HALT_Pos)                /*!< DCB DHCSR: Halt control Mask */\r\n\r\n#define DCB_DHCSR_C_DEBUGEN_Pos             0U                                            /*!< DCB DHCSR: Debug enable control Position */\r\n#define DCB_DHCSR_C_DEBUGEN_Msk            (0x1UL /*<< DCB_DHCSR_C_DEBUGEN_Pos*/)         /*!< DCB DHCSR: Debug enable control Mask */\r\n\r\n/* DCRSR, Debug Core Register Select Register Definitions */\r\n#define DCB_DCRSR_REGWnR_Pos               16U                                            /*!< DCB DCRSR: Register write/not-read Position */\r\n#define DCB_DCRSR_REGWnR_Msk               (0x1UL << DCB_DCRSR_REGWnR_Pos)                /*!< DCB DCRSR: Register write/not-read Mask */\r\n\r\n#define DCB_DCRSR_REGSEL_Pos                0U                                            /*!< DCB DCRSR: Register selector Position */\r\n#define DCB_DCRSR_REGSEL_Msk               (0x7FUL /*<< DCB_DCRSR_REGSEL_Pos*/)           /*!< DCB DCRSR: Register selector Mask */\r\n\r\n/* DCRDR, Debug Core Register Data Register Definitions */\r\n#define DCB_DCRDR_DBGTMP_Pos                0U                                            /*!< DCB DCRDR: Data temporary buffer Position */\r\n#define DCB_DCRDR_DBGTMP_Msk               (0xFFFFFFFFUL /*<< DCB_DCRDR_DBGTMP_Pos*/)     /*!< DCB DCRDR: Data temporary buffer Mask */\r\n\r\n/* DEMCR, Debug Exception and Monitor Control Register Definitions */\r\n#define DCB_DEMCR_TRCENA_Pos               24U                                            /*!< DCB DEMCR: Trace enable Position */\r\n#define DCB_DEMCR_TRCENA_Msk               (0x1UL << DCB_DEMCR_TRCENA_Pos)                /*!< DCB DEMCR: Trace enable Mask */\r\n\r\n#define DCB_DEMCR_MONPRKEY_Pos             23U                                            /*!< DCB DEMCR: Monitor pend req key Position */\r\n#define DCB_DEMCR_MONPRKEY_Msk             (0x1UL << DCB_DEMCR_MONPRKEY_Pos)              /*!< DCB DEMCR: Monitor pend req key Mask */\r\n\r\n#define DCB_DEMCR_UMON_EN_Pos              21U                                            /*!< DCB DEMCR: Unprivileged monitor enable Position */\r\n#define DCB_DEMCR_UMON_EN_Msk              (0x1UL << DCB_DEMCR_UMON_EN_Pos)               /*!< DCB DEMCR: Unprivileged monitor enable Mask */\r\n\r\n#define DCB_DEMCR_SDME_Pos                 20U                                            /*!< DCB DEMCR: Secure DebugMonitor enable Position */\r\n#define DCB_DEMCR_SDME_Msk                 (0x1UL << DCB_DEMCR_SDME_Pos)                  /*!< DCB DEMCR: Secure DebugMonitor enable Mask */\r\n\r\n#define DCB_DEMCR_MON_REQ_Pos              19U                                            /*!< DCB DEMCR: Monitor request Position */\r\n#define DCB_DEMCR_MON_REQ_Msk              (0x1UL << DCB_DEMCR_MON_REQ_Pos)               /*!< DCB DEMCR: Monitor request Mask */\r\n\r\n#define DCB_DEMCR_MON_STEP_Pos             18U                                            /*!< DCB DEMCR: Monitor step Position */\r\n#define DCB_DEMCR_MON_STEP_Msk             (0x1UL << DCB_DEMCR_MON_STEP_Pos)              /*!< DCB DEMCR: Monitor step Mask */\r\n\r\n#define DCB_DEMCR_MON_PEND_Pos             17U                                            /*!< DCB DEMCR: Monitor pend Position */\r\n#define DCB_DEMCR_MON_PEND_Msk             (0x1UL << DCB_DEMCR_MON_PEND_Pos)              /*!< DCB DEMCR: Monitor pend Mask */\r\n\r\n#define DCB_DEMCR_MON_EN_Pos               16U                                            /*!< DCB DEMCR: Monitor enable Position */\r\n#define DCB_DEMCR_MON_EN_Msk               (0x1UL << DCB_DEMCR_MON_EN_Pos)                /*!< DCB DEMCR: Monitor enable Mask */\r\n\r\n#define DCB_DEMCR_VC_SFERR_Pos             11U                                            /*!< DCB DEMCR: Vector Catch SecureFault Position */\r\n#define DCB_DEMCR_VC_SFERR_Msk             (0x1UL << DCB_DEMCR_VC_SFERR_Pos)              /*!< DCB DEMCR: Vector Catch SecureFault Mask */\r\n\r\n#define DCB_DEMCR_VC_HARDERR_Pos           10U                                            /*!< DCB DEMCR: Vector Catch HardFault errors Position */\r\n#define DCB_DEMCR_VC_HARDERR_Msk           (0x1UL << DCB_DEMCR_VC_HARDERR_Pos)            /*!< DCB DEMCR: Vector Catch HardFault errors Mask */\r\n\r\n#define DCB_DEMCR_VC_INTERR_Pos             9U                                            /*!< DCB DEMCR: Vector Catch interrupt errors Position */\r\n#define DCB_DEMCR_VC_INTERR_Msk            (0x1UL << DCB_DEMCR_VC_INTERR_Pos)             /*!< DCB DEMCR: Vector Catch interrupt errors Mask */\r\n\r\n#define DCB_DEMCR_VC_BUSERR_Pos             8U                                            /*!< DCB DEMCR: Vector Catch BusFault errors Position */\r\n#define DCB_DEMCR_VC_BUSERR_Msk            (0x1UL << DCB_DEMCR_VC_BUSERR_Pos)             /*!< DCB DEMCR: Vector Catch BusFault errors Mask */\r\n\r\n#define DCB_DEMCR_VC_STATERR_Pos            7U                                            /*!< DCB DEMCR: Vector Catch state errors Position */\r\n#define DCB_DEMCR_VC_STATERR_Msk           (0x1UL << DCB_DEMCR_VC_STATERR_Pos)            /*!< DCB DEMCR: Vector Catch state errors Mask */\r\n\r\n#define DCB_DEMCR_VC_CHKERR_Pos             6U                                            /*!< DCB DEMCR: Vector Catch check errors Position */\r\n#define DCB_DEMCR_VC_CHKERR_Msk            (0x1UL << DCB_DEMCR_VC_CHKERR_Pos)             /*!< DCB DEMCR: Vector Catch check errors Mask */\r\n\r\n#define DCB_DEMCR_VC_NOCPERR_Pos            5U                                            /*!< DCB DEMCR: Vector Catch NOCP errors Position */\r\n#define DCB_DEMCR_VC_NOCPERR_Msk           (0x1UL << DCB_DEMCR_VC_NOCPERR_Pos)            /*!< DCB DEMCR: Vector Catch NOCP errors Mask */\r\n\r\n#define DCB_DEMCR_VC_MMERR_Pos              4U                                            /*!< DCB DEMCR: Vector Catch MemManage errors Position */\r\n#define DCB_DEMCR_VC_MMERR_Msk             (0x1UL << DCB_DEMCR_VC_MMERR_Pos)              /*!< DCB DEMCR: Vector Catch MemManage errors Mask */\r\n\r\n#define DCB_DEMCR_VC_CORERESET_Pos          0U                                            /*!< DCB DEMCR: Vector Catch Core reset Position */\r\n#define DCB_DEMCR_VC_CORERESET_Msk         (0x1UL /*<< DCB_DEMCR_VC_CORERESET_Pos*/)      /*!< DCB DEMCR: Vector Catch Core reset Mask */\r\n\r\n/* DAUTHCTRL, Debug Authentication Control Register Definitions */\r\n#define DCB_DAUTHCTRL_INTSPNIDEN_Pos        3U                                            /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Position */\r\n#define DCB_DAUTHCTRL_INTSPNIDEN_Msk       (0x1UL << DCB_DAUTHCTRL_INTSPNIDEN_Pos)        /*!< DCB DAUTHCTRL: Internal Secure non-invasive debug enable Mask */\r\n\r\n#define DCB_DAUTHCTRL_SPNIDENSEL_Pos        2U                                            /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Position */\r\n#define DCB_DAUTHCTRL_SPNIDENSEL_Msk       (0x1UL << DCB_DAUTHCTRL_SPNIDENSEL_Pos)        /*!< DCB DAUTHCTRL: Secure non-invasive debug enable select Mask */\r\n\r\n#define DCB_DAUTHCTRL_INTSPIDEN_Pos         1U                                            /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Position */\r\n#define DCB_DAUTHCTRL_INTSPIDEN_Msk        (0x1UL << DCB_DAUTHCTRL_INTSPIDEN_Pos)         /*!< DCB DAUTHCTRL: Internal Secure invasive debug enable Mask */\r\n\r\n#define DCB_DAUTHCTRL_SPIDENSEL_Pos         0U                                            /*!< DCB DAUTHCTRL: Secure invasive debug enable select Position */\r\n#define DCB_DAUTHCTRL_SPIDENSEL_Msk        (0x1UL /*<< DCB_DAUTHCTRL_SPIDENSEL_Pos*/)     /*!< DCB DAUTHCTRL: Secure invasive debug enable select Mask */\r\n\r\n/* DSCSR, Debug Security Control and Status Register Definitions */\r\n#define DCB_DSCSR_CDSKEY_Pos               17U                                            /*!< DCB DSCSR: CDS write-enable key Position */\r\n#define DCB_DSCSR_CDSKEY_Msk               (0x1UL << DCB_DSCSR_CDSKEY_Pos)                /*!< DCB DSCSR: CDS write-enable key Mask */\r\n\r\n#define DCB_DSCSR_CDS_Pos                  16U                                            /*!< DCB DSCSR: Current domain Secure Position */\r\n#define DCB_DSCSR_CDS_Msk                  (0x1UL << DCB_DSCSR_CDS_Pos)                   /*!< DCB DSCSR: Current domain Secure Mask */\r\n\r\n#define DCB_DSCSR_SBRSEL_Pos                1U                                            /*!< DCB DSCSR: Secure banked register select Position */\r\n#define DCB_DSCSR_SBRSEL_Msk               (0x1UL << DCB_DSCSR_SBRSEL_Pos)                /*!< DCB DSCSR: Secure banked register select Mask */\r\n\r\n#define DCB_DSCSR_SBRSELEN_Pos              0U                                            /*!< DCB DSCSR: Secure banked register select enable Position */\r\n#define DCB_DSCSR_SBRSELEN_Msk             (0x1UL /*<< DCB_DSCSR_SBRSELEN_Pos*/)          /*!< DCB DSCSR: Secure banked register select enable Mask */\r\n\r\n/*@} end of group CMSIS_DCB */\r\n\r\n\r\n\r\n/**\r\n  \\ingroup  CMSIS_core_register\r\n  \\defgroup CMSIS_DIB       Debug Identification Block\r\n  \\brief    Type definitions for the Debug Identification Block Registers\r\n  @{\r\n */\r\n\r\n/**\r\n  \\brief  Structure type to access the Debug Identification Block Registers (DIB).\r\n */\r\ntypedef struct\r\n{\r\n  __OM  uint32_t DLAR;                   /*!< Offset: 0x000 ( /W)  SCS Software Lock Access Register */\r\n  __IM  uint32_t DLSR;                   /*!< Offset: 0x004 (R/ )  SCS Software Lock Status Register */\r\n  __IM  uint32_t DAUTHSTATUS;            /*!< Offset: 0x008 (R/ )  Debug Authentication Status Register */\r\n  __IM  uint32_t DDEVARCH;               /*!< Offset: 0x00C (R/ )  SCS Device Architecture Register */\r\n  __IM  uint32_t DDEVTYPE;               /*!< Offset: 0x010 (R/ )  SCS Device Type Register */\r\n} DIB_Type;\r\n\r\n/* DLAR, SCS Software Lock Access Register Definitions */\r\n#define DIB_DLAR_KEY_Pos                    0U                                            /*!< DIB DLAR: KEY Position */\r\n#define DIB_DLAR_KEY_Msk                   (0xFFFFFFFFUL /*<< DIB_DLAR_KEY_Pos */)        /*!< DIB DLAR: KEY Mask */\r\n\r\n/* DLSR, SCS Software Lock Status Register Definitions */\r\n#define DIB_DLSR_nTT_Pos                    2U                                            /*!< DIB DLSR: Not thirty-two bit Position */\r\n#define DIB_DLSR_nTT_Msk                   (0x1UL << DIB_DLSR_nTT_Pos )                   /*!< DIB DLSR: Not thirty-two bit Mask */\r\n\r\n#define DIB_DLSR_SLK_Pos                    1U                                            /*!< DIB DLSR: Software Lock status Position */\r\n#define DIB_DLSR_SLK_Msk                   (0x1UL << DIB_DLSR_SLK_Pos )                   /*!< DIB DLSR: Software Lock status Mask */\r\n\r\n#define DIB_DLSR_SLI_Pos                    0U                                            /*!< DIB DLSR: Software Lock implemented Position */\r\n#define DIB_DLSR_SLI_Msk                   (0x1UL /*<< DIB_DLSR_SLI_Pos*/)                /*!< DIB DLSR: Software Lock implemented Mask */\r\n\r\n/* DAUTHSTATUS, Debug Authentication Status Register Definitions */\r\n#define DIB_DAUTHSTATUS_SNID_Pos            6U                                            /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Position */\r\n#define DIB_DAUTHSTATUS_SNID_Msk           (0x3UL << DIB_DAUTHSTATUS_SNID_Pos )           /*!< DIB DAUTHSTATUS: Secure Non-invasive Debug Mask */\r\n\r\n#define DIB_DAUTHSTATUS_SID_Pos             4U                                            /*!< DIB DAUTHSTATUS: Secure Invasive Debug Position */\r\n#define DIB_DAUTHSTATUS_SID_Msk            (0x3UL << DIB_DAUTHSTATUS_SID_Pos )            /*!< DIB DAUTHSTATUS: Secure Invasive Debug Mask */\r\n\r\n#define DIB_DAUTHSTATUS_NSNID_Pos           2U                                            /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Position */\r\n#define DIB_DAUTHSTATUS_NSNID_Msk          (0x3UL << DIB_DAUTHSTATUS_NSNID_Pos )          /*!< DIB DAUTHSTATUS: Non-secure Non-invasive Debug Mask */\r\n\r\n#define DIB_DAUTHSTATUS_NSID_Pos            0U                                            /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Position */\r\n#define DIB_DAUTHSTATUS_NSID_Msk           (0x3UL /*<< DIB_DAUTHSTATUS_NSID_Pos*/)        /*!< DIB DAUTHSTATUS: Non-secure Invasive Debug Mask */\r\n\r\n/* DDEVARCH, SCS Device Architecture Register Definitions */\r\n#define DIB_DDEVARCH_ARCHITECT_Pos         21U                                            /*!< DIB DDEVARCH: Architect Position */\r\n#define DIB_DDEVARCH_ARCHITECT_Msk         (0x7FFUL << DIB_DDEVARCH_ARCHITECT_Pos )       /*!< DIB DDEVARCH: Architect Mask */\r\n\r\n#define DIB_DDEVARCH_PRESENT_Pos           20U                                            /*!< DIB DDEVARCH: DEVARCH Present Position */\r\n#define DIB_DDEVARCH_PRESENT_Msk           (0x1FUL << DIB_DDEVARCH_PRESENT_Pos )          /*!< DIB DDEVARCH: DEVARCH Present Mask */\r\n\r\n#define DIB_DDEVARCH_REVISION_Pos          16U                                            /*!< DIB DDEVARCH: Revision Position */\r\n#define DIB_DDEVARCH_REVISION_Msk          (0xFUL << DIB_DDEVARCH_REVISION_Pos )          /*!< DIB DDEVARCH: Revision Mask */\r\n\r\n#define DIB_DDEVARCH_ARCHVER_Pos           12U                                            /*!< DIB DDEVARCH: Architecture Version Position */\r\n#define DIB_DDEVARCH_ARCHVER_Msk           (0xFUL << DIB_DDEVARCH_ARCHVER_Pos )           /*!< DIB DDEVARCH: Architecture Version Mask */\r\n\r\n#define DIB_DDEVARCH_ARCHPART_Pos           0U                                            /*!< DIB DDEVARCH: Architecture Part Position */\r\n#define DIB_DDEVARCH_ARCHPART_Msk          (0xFFFUL /*<< DIB_DDEVARCH_ARCHPART_Pos*/)     /*!< DIB DDEVARCH: Architecture Part Mask */\r\n\r\n/* DDEVTYPE, SCS Device Type Register Definitions */\r\n#define DIB_DDEVTYPE_SUB_Pos                4U                                            /*!< DIB DDEVTYPE: Sub-type Position */\r\n#define DIB_DDEVTYPE_SUB_Msk               (0xFUL << DIB_DDEVTYPE_SUB_Pos )               /*!< DIB DDEVTYPE: Sub-type Mask */\r\n\r\n#define DIB_DDEVTYPE_MAJOR_Pos              0U                                            /*!< DIB DDEVTYPE: Major type Position */\r\n#define DIB_DDEVTYPE_MAJOR_Msk             (0xFUL /*<< DIB_DDEVTYPE_MAJOR_Pos*/)          /*!< DIB DDEVTYPE: Major type Mask */\r\n\r\n\r\n/*@} end of group CMSIS_DIB */\r\n\r\n\r\n/**\r\n  \\ingroup    CMSIS_core_register\r\n  \\defgroup   CMSIS_core_bitfield     Core register bit field macros\r\n  \\brief      Macros for use with bit field definitions (xxx_Pos, xxx_Msk).\r\n  @{\r\n */\r\n\r\n/**\r\n  \\brief   Mask and shift a bit field value for use in a register bit range.\r\n  \\param[in] field  Name of the register bit field.\r\n  \\param[in] value  Value of the bit field. This parameter is interpreted as an uint32_t type.\r\n  \\return           Masked and shifted value.\r\n*/\r\n#define _VAL2FLD(field, value)    (((uint32_t)(value) << field ## _Pos) & field ## _Msk)\r\n\r\n/**\r\n  \\brief     Mask and shift a register value to extract a bit filed value.\r\n  \\param[in] field  Name of the register bit field.\r\n  \\param[in] value  Value of register. This parameter is interpreted as an uint32_t type.\r\n  \\return           Masked and shifted bit field value.\r\n*/\r\n#define _FLD2VAL(field, value)    (((uint32_t)(value) & field ## _Msk) >> field ## _Pos)\r\n\r\n/*@} end of group CMSIS_core_bitfield */\r\n\r\n\r\n/**\r\n  \\ingroup    CMSIS_core_register\r\n  \\defgroup   CMSIS_core_base     Core Definitions\r\n  \\brief      Definitions for base addresses, unions, and structures.\r\n  @{\r\n */\r\n\r\n/* Memory mapping of Core Hardware */\r\n  #define SCS_BASE            (0xE000E000UL)                             /*!< System Control Space Base Address */\r\n  #define ITM_BASE            (0xE0000000UL)                             /*!< ITM Base Address */\r\n  #define DWT_BASE            (0xE0001000UL)                             /*!< DWT Base Address */\r\n  #define TPI_BASE            (0xE0040000UL)                             /*!< TPI Base Address */\r\n  #define CoreDebug_BASE      (0xE000EDF0UL)                             /*!< \\deprecated Core Debug Base Address */\r\n  #define DCB_BASE            (0xE000EDF0UL)                             /*!< DCB Base Address */\r\n  #define DIB_BASE            (0xE000EFB0UL)                             /*!< DIB Base Address */\r\n  #define SysTick_BASE        (SCS_BASE +  0x0010UL)                     /*!< SysTick Base Address */\r\n  #define NVIC_BASE           (SCS_BASE +  0x0100UL)                     /*!< NVIC Base Address */\r\n  #define SCB_BASE            (SCS_BASE +  0x0D00UL)                     /*!< System Control Block Base Address */\r\n\r\n  #define SCnSCB              ((SCnSCB_Type    *)     SCS_BASE         ) /*!< System control Register not in SCB */\r\n  #define SCB                 ((SCB_Type       *)     SCB_BASE         ) /*!< SCB configuration struct */\r\n  #define SysTick             ((SysTick_Type   *)     SysTick_BASE     ) /*!< SysTick configuration struct */\r\n  #define NVIC                ((NVIC_Type      *)     NVIC_BASE        ) /*!< NVIC configuration struct */\r\n  #define ITM                 ((ITM_Type       *)     ITM_BASE         ) /*!< ITM configuration struct */\r\n  #define DWT                 ((DWT_Type       *)     DWT_BASE         ) /*!< DWT configuration struct */\r\n  #define TPI                 ((TPI_Type       *)     TPI_BASE         ) /*!< TPI configuration struct */\r\n  #define CoreDebug           ((CoreDebug_Type *)     CoreDebug_BASE   ) /*!< \\deprecated Core Debug configuration struct */\r\n  #define DCB                 ((DCB_Type       *)     DCB_BASE         ) /*!< DCB configuration struct */\r\n  #define DIB                 ((DIB_Type       *)     DIB_BASE         ) /*!< DIB configuration struct */\r\n\r\n  #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\r\n    #define MPU_BASE          (SCS_BASE +  0x0D90UL)                     /*!< Memory Protection Unit */\r\n    #define MPU               ((MPU_Type       *)     MPU_BASE         ) /*!< Memory Protection Unit */\r\n  #endif\r\n\r\n  #if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\r\n    #define SAU_BASE          (SCS_BASE +  0x0DD0UL)                     /*!< Security Attribution Unit */\r\n    #define SAU               ((SAU_Type       *)     SAU_BASE         ) /*!< Security Attribution Unit */\r\n  #endif\r\n\r\n  #define FPU_BASE            (SCS_BASE +  0x0F30UL)                     /*!< Floating Point Unit */\r\n  #define FPU                 ((FPU_Type       *)     FPU_BASE         ) /*!< Floating Point Unit */\r\n\r\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\r\n  #define SCS_BASE_NS         (0xE002E000UL)                             /*!< System Control Space Base Address (non-secure address space) */\r\n  #define CoreDebug_BASE_NS   (0xE002EDF0UL)                             /*!< \\deprecated Core Debug Base Address           (non-secure address space) */\r\n  #define DCB_BASE_NS         (0xE002EDF0UL)                             /*!< DCB Base Address                  (non-secure address space) */\r\n  #define DIB_BASE_NS         (0xE002EFB0UL)                             /*!< DIB Base Address                  (non-secure address space) */\r\n  #define SysTick_BASE_NS     (SCS_BASE_NS +  0x0010UL)                  /*!< SysTick Base Address              (non-secure address space) */\r\n  #define NVIC_BASE_NS        (SCS_BASE_NS +  0x0100UL)                  /*!< NVIC Base Address                 (non-secure address space) */\r\n  #define SCB_BASE_NS         (SCS_BASE_NS +  0x0D00UL)                  /*!< System Control Block Base Address (non-secure address space) */\r\n\r\n  #define SCnSCB_NS           ((SCnSCB_Type    *)     SCS_BASE_NS      ) /*!< System control Register not in SCB(non-secure address space) */\r\n  #define SCB_NS              ((SCB_Type       *)     SCB_BASE_NS      ) /*!< SCB configuration struct          (non-secure address space) */\r\n  #define SysTick_NS          ((SysTick_Type   *)     SysTick_BASE_NS  ) /*!< SysTick configuration struct      (non-secure address space) */\r\n  #define NVIC_NS             ((NVIC_Type      *)     NVIC_BASE_NS     ) /*!< NVIC configuration struct         (non-secure address space) */\r\n  #define CoreDebug_NS        ((CoreDebug_Type *)     CoreDebug_BASE_NS) /*!< \\deprecated Core Debug configuration struct   (non-secure address space) */\r\n  #define DCB_NS              ((DCB_Type       *)     DCB_BASE_NS      ) /*!< DCB configuration struct          (non-secure address space) */\r\n  #define DIB_NS              ((DIB_Type       *)     DIB_BASE_NS      ) /*!< DIB configuration struct          (non-secure address space) */\r\n\r\n  #if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\r\n    #define MPU_BASE_NS       (SCS_BASE_NS +  0x0D90UL)                  /*!< Memory Protection Unit            (non-secure address space) */\r\n    #define MPU_NS            ((MPU_Type       *)     MPU_BASE_NS      ) /*!< Memory Protection Unit            (non-secure address space) */\r\n  #endif\r\n\r\n  #define FPU_BASE_NS         (SCS_BASE_NS +  0x0F30UL)                  /*!< Floating Point Unit               (non-secure address space) */\r\n  #define FPU_NS              ((FPU_Type       *)     FPU_BASE_NS      ) /*!< Floating Point Unit               (non-secure address space) */\r\n\r\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\r\n/*@} */\r\n\r\n\r\n/**\r\n  \\ingroup    CMSIS_core_register\r\n  \\defgroup   CMSIS_register_aliases     Backwards Compatibility Aliases\r\n  \\brief      Register alias definitions for backwards compatibility.\r\n  @{\r\n */\r\n#define ID_ADR  (ID_AFR)    /*!< SCB Auxiliary Feature Register */\r\n/*@} */\r\n\r\n\r\n/*******************************************************************************\r\n *                Hardware Abstraction Layer\r\n  Core Function Interface contains:\r\n  - Core NVIC Functions\r\n  - Core SysTick Functions\r\n  - Core Debug Functions\r\n  - Core Register Access Functions\r\n ******************************************************************************/\r\n/**\r\n  \\defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference\r\n*/\r\n\r\n\r\n\r\n/* ##########################   NVIC functions  #################################### */\r\n/**\r\n  \\ingroup  CMSIS_Core_FunctionInterface\r\n  \\defgroup CMSIS_Core_NVICFunctions NVIC Functions\r\n  \\brief    Functions that manage interrupts and exceptions via the NVIC.\r\n  @{\r\n */\r\n\r\n#ifdef CMSIS_NVIC_VIRTUAL\r\n  #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE\r\n    #define CMSIS_NVIC_VIRTUAL_HEADER_FILE \"cmsis_nvic_virtual.h\"\r\n  #endif\r\n  #include CMSIS_NVIC_VIRTUAL_HEADER_FILE\r\n#else\r\n  #define NVIC_SetPriorityGrouping    __NVIC_SetPriorityGrouping\r\n  #define NVIC_GetPriorityGrouping    __NVIC_GetPriorityGrouping\r\n  #define NVIC_EnableIRQ              __NVIC_EnableIRQ\r\n  #define NVIC_GetEnableIRQ           __NVIC_GetEnableIRQ\r\n  #define NVIC_DisableIRQ             __NVIC_DisableIRQ\r\n  #define NVIC_GetPendingIRQ          __NVIC_GetPendingIRQ\r\n  #define NVIC_SetPendingIRQ          __NVIC_SetPendingIRQ\r\n  #define NVIC_ClearPendingIRQ        __NVIC_ClearPendingIRQ\r\n  #define NVIC_GetActive              __NVIC_GetActive\r\n  #define NVIC_SetPriority            __NVIC_SetPriority\r\n  #define NVIC_GetPriority            __NVIC_GetPriority\r\n  #define NVIC_SystemReset            __NVIC_SystemReset\r\n#endif /* CMSIS_NVIC_VIRTUAL */\r\n\r\n#ifdef CMSIS_VECTAB_VIRTUAL\r\n  #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE\r\n    #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE \"cmsis_vectab_virtual.h\"\r\n  #endif\r\n  #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE\r\n#else\r\n  #define NVIC_SetVector              __NVIC_SetVector\r\n  #define NVIC_GetVector              __NVIC_GetVector\r\n#endif  /* (CMSIS_VECTAB_VIRTUAL) */\r\n\r\n#define NVIC_USER_IRQ_OFFSET          16\r\n\r\n\r\n/* Special LR values for Secure/Non-Secure call handling and exception handling                                               */\r\n\r\n/* Function Return Payload (from ARMv8-M Architecture Reference Manual) LR value on entry from Secure BLXNS                   */\r\n#define FNC_RETURN                 (0xFEFFFFFFUL)     /* bit [0] ignored when processing a branch                             */\r\n\r\n/* The following EXC_RETURN mask values are used to evaluate the LR on exception entry */\r\n#define EXC_RETURN_PREFIX          (0xFF000000UL)     /* bits [31:24] set to indicate an EXC_RETURN value                     */\r\n#define EXC_RETURN_S               (0x00000040UL)     /* bit [6] stack used to push registers: 0=Non-secure 1=Secure          */\r\n#define EXC_RETURN_DCRS            (0x00000020UL)     /* bit [5] stacking rules for called registers: 0=skipped 1=saved       */\r\n#define EXC_RETURN_FTYPE           (0x00000010UL)     /* bit [4] allocate stack for floating-point context: 0=done 1=skipped  */\r\n#define EXC_RETURN_MODE            (0x00000008UL)     /* bit [3] processor mode for return: 0=Handler mode 1=Thread mode      */\r\n#define EXC_RETURN_SPSEL           (0x00000004UL)     /* bit [2] stack pointer used to restore context: 0=MSP 1=PSP           */\r\n#define EXC_RETURN_ES              (0x00000001UL)     /* bit [0] security state exception was taken to: 0=Non-secure 1=Secure */\r\n\r\n/* Integrity Signature (from ARMv8-M Architecture Reference Manual) for exception context stacking                            */\r\n#if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)  /* Value for processors with floating-point extension:                  */\r\n#define EXC_INTEGRITY_SIGNATURE     (0xFEFA125AUL)     /* bit [0] SFTC must match LR bit[4] EXC_RETURN_FTYPE                   */\r\n#else\r\n#define EXC_INTEGRITY_SIGNATURE     (0xFEFA125BUL)     /* Value for processors without floating-point extension                */\r\n#endif\r\n\r\n\r\n/**\r\n  \\brief   Set Priority Grouping\r\n  \\details Sets the priority grouping field using the required unlock sequence.\r\n           The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field.\r\n           Only values from 0..7 are used.\r\n           In case of a conflict between priority grouping and available\r\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\r\n  \\param [in]      PriorityGroup  Priority grouping field.\r\n */\r\n__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup)\r\n{\r\n  uint32_t reg_value;\r\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);             /* only values 0..7 are used          */\r\n\r\n  reg_value  =  SCB->AIRCR;                                                   /* read old register configuration    */\r\n  reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change               */\r\n  reg_value  =  (reg_value                                   |\r\n                ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |\r\n                (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos)  );              /* Insert write key and priority group */\r\n  SCB->AIRCR =  reg_value;\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Get Priority Grouping\r\n  \\details Reads the priority grouping field from the NVIC Interrupt Controller.\r\n  \\return                Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).\r\n */\r\n__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void)\r\n{\r\n  return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos));\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Enable Interrupt\r\n  \\details Enables a device specific interrupt in the NVIC interrupt controller.\r\n  \\param [in]      IRQn  Device specific interrupt number.\r\n  \\note    IRQn must not be negative.\r\n */\r\n__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)\r\n{\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    __COMPILER_BARRIER();\r\n    NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));\r\n    __COMPILER_BARRIER();\r\n  }\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Get Interrupt Enable status\r\n  \\details Returns a device specific interrupt enable status from the NVIC interrupt controller.\r\n  \\param [in]      IRQn  Device specific interrupt number.\r\n  \\return             0  Interrupt is not enabled.\r\n  \\return             1  Interrupt is enabled.\r\n  \\note    IRQn must not be negative.\r\n */\r\n__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn)\r\n{\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    return((uint32_t)(((NVIC->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\r\n  }\r\n  else\r\n  {\r\n    return(0U);\r\n  }\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Disable Interrupt\r\n  \\details Disables a device specific interrupt in the NVIC interrupt controller.\r\n  \\param [in]      IRQn  Device specific interrupt number.\r\n  \\note    IRQn must not be negative.\r\n */\r\n__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn)\r\n{\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    NVIC->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));\r\n    __DSB();\r\n    __ISB();\r\n  }\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Get Pending Interrupt\r\n  \\details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt.\r\n  \\param [in]      IRQn  Device specific interrupt number.\r\n  \\return             0  Interrupt status is not pending.\r\n  \\return             1  Interrupt status is pending.\r\n  \\note    IRQn must not be negative.\r\n */\r\n__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn)\r\n{\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    return((uint32_t)(((NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\r\n  }\r\n  else\r\n  {\r\n    return(0U);\r\n  }\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Set Pending Interrupt\r\n  \\details Sets the pending bit of a device specific interrupt in the NVIC pending register.\r\n  \\param [in]      IRQn  Device specific interrupt number.\r\n  \\note    IRQn must not be negative.\r\n */\r\n__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn)\r\n{\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    NVIC->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));\r\n  }\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Clear Pending Interrupt\r\n  \\details Clears the pending bit of a device specific interrupt in the NVIC pending register.\r\n  \\param [in]      IRQn  Device specific interrupt number.\r\n  \\note    IRQn must not be negative.\r\n */\r\n__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn)\r\n{\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    NVIC->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));\r\n  }\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Get Active Interrupt\r\n  \\details Reads the active register in the NVIC and returns the active bit for the device specific interrupt.\r\n  \\param [in]      IRQn  Device specific interrupt number.\r\n  \\return             0  Interrupt status is not active.\r\n  \\return             1  Interrupt status is active.\r\n  \\note    IRQn must not be negative.\r\n */\r\n__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn)\r\n{\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    return((uint32_t)(((NVIC->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\r\n  }\r\n  else\r\n  {\r\n    return(0U);\r\n  }\r\n}\r\n\r\n\r\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\r\n/**\r\n  \\brief   Get Interrupt Target State\r\n  \\details Reads the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt.\r\n  \\param [in]      IRQn  Device specific interrupt number.\r\n  \\return             0  if interrupt is assigned to Secure\r\n  \\return             1  if interrupt is assigned to Non Secure\r\n  \\note    IRQn must not be negative.\r\n */\r\n__STATIC_INLINE uint32_t NVIC_GetTargetState(IRQn_Type IRQn)\r\n{\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\r\n  }\r\n  else\r\n  {\r\n    return(0U);\r\n  }\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Set Interrupt Target State\r\n  \\details Sets the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt.\r\n  \\param [in]      IRQn  Device specific interrupt number.\r\n  \\return             0  if interrupt is assigned to Secure\r\n                      1  if interrupt is assigned to Non Secure\r\n  \\note    IRQn must not be negative.\r\n */\r\n__STATIC_INLINE uint32_t NVIC_SetTargetState(IRQn_Type IRQn)\r\n{\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] |=  ((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)));\r\n    return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\r\n  }\r\n  else\r\n  {\r\n    return(0U);\r\n  }\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Clear Interrupt Target State\r\n  \\details Clears the interrupt target field in the NVIC and returns the interrupt target bit for the device specific interrupt.\r\n  \\param [in]      IRQn  Device specific interrupt number.\r\n  \\return             0  if interrupt is assigned to Secure\r\n                      1  if interrupt is assigned to Non Secure\r\n  \\note    IRQn must not be negative.\r\n */\r\n__STATIC_INLINE uint32_t NVIC_ClearTargetState(IRQn_Type IRQn)\r\n{\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] &= ~((uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL)));\r\n    return((uint32_t)(((NVIC->ITNS[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\r\n  }\r\n  else\r\n  {\r\n    return(0U);\r\n  }\r\n}\r\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\r\n\r\n\r\n/**\r\n  \\brief   Set Interrupt Priority\r\n  \\details Sets the priority of a device specific interrupt or a processor exception.\r\n           The interrupt number can be positive to specify a device specific interrupt,\r\n           or negative to specify a processor exception.\r\n  \\param [in]      IRQn  Interrupt number.\r\n  \\param [in]  priority  Priority to set.\r\n  \\note    The priority cannot be set for every processor exception.\r\n */\r\n__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)\r\n{\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    NVIC->IPR[((uint32_t)IRQn)]               = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\r\n  }\r\n  else\r\n  {\r\n    SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\r\n  }\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Get Interrupt Priority\r\n  \\details Reads the priority of a device specific interrupt or a processor exception.\r\n           The interrupt number can be positive to specify a device specific interrupt,\r\n           or negative to specify a processor exception.\r\n  \\param [in]   IRQn  Interrupt number.\r\n  \\return             Interrupt Priority.\r\n                      Value is aligned automatically to the implemented priority bits of the microcontroller.\r\n */\r\n__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn)\r\n{\r\n\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    return(((uint32_t)NVIC->IPR[((uint32_t)IRQn)]               >> (8U - __NVIC_PRIO_BITS)));\r\n  }\r\n  else\r\n  {\r\n    return(((uint32_t)SCB->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS)));\r\n  }\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Encode Priority\r\n  \\details Encodes the priority for an interrupt with the given priority group,\r\n           preemptive priority value, and subpriority value.\r\n           In case of a conflict between priority grouping and available\r\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\r\n  \\param [in]     PriorityGroup  Used priority group.\r\n  \\param [in]   PreemptPriority  Preemptive priority value (starting from 0).\r\n  \\param [in]       SubPriority  Subpriority value (starting from 0).\r\n  \\return                        Encoded priority. Value can be used in the function \\ref NVIC_SetPriority().\r\n */\r\n__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority)\r\n{\r\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */\r\n  uint32_t PreemptPriorityBits;\r\n  uint32_t SubPriorityBits;\r\n\r\n  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);\r\n  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));\r\n\r\n  return (\r\n           ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) |\r\n           ((SubPriority     & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL)))\r\n         );\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Decode Priority\r\n  \\details Decodes an interrupt priority value with a given priority group to\r\n           preemptive priority value and subpriority value.\r\n           In case of a conflict between priority grouping and available\r\n           priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set.\r\n  \\param [in]         Priority   Priority value, which can be retrieved with the function \\ref NVIC_GetPriority().\r\n  \\param [in]     PriorityGroup  Used priority group.\r\n  \\param [out] pPreemptPriority  Preemptive priority value (starting from 0).\r\n  \\param [out]     pSubPriority  Subpriority value (starting from 0).\r\n */\r\n__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority)\r\n{\r\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);   /* only values 0..7 are used          */\r\n  uint32_t PreemptPriorityBits;\r\n  uint32_t SubPriorityBits;\r\n\r\n  PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);\r\n  SubPriorityBits     = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS));\r\n\r\n  *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL);\r\n  *pSubPriority     = (Priority                   ) & (uint32_t)((1UL << (SubPriorityBits    )) - 1UL);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Set Interrupt Vector\r\n  \\details Sets an interrupt vector in SRAM based interrupt vector table.\r\n           The interrupt number can be positive to specify a device specific interrupt,\r\n           or negative to specify a processor exception.\r\n           VTOR must been relocated to SRAM before.\r\n  \\param [in]   IRQn      Interrupt number\r\n  \\param [in]   vector    Address of interrupt handler function\r\n */\r\n__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector)\r\n{\r\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\r\n  vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector;\r\n  __DSB();\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Get Interrupt Vector\r\n  \\details Reads an interrupt vector from interrupt vector table.\r\n           The interrupt number can be positive to specify a device specific interrupt,\r\n           or negative to specify a processor exception.\r\n  \\param [in]   IRQn      Interrupt number.\r\n  \\return                 Address of interrupt handler function\r\n */\r\n__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn)\r\n{\r\n  uint32_t *vectors = (uint32_t *)SCB->VTOR;\r\n  return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET];\r\n}\r\n\r\n\r\n/**\r\n  \\brief   System Reset\r\n  \\details Initiates a system reset request to reset the MCU.\r\n */\r\n__NO_RETURN __STATIC_INLINE void __NVIC_SystemReset(void)\r\n{\r\n  __DSB();                                                          /* Ensure all outstanding memory accesses included\r\n                                                                       buffered write are completed before reset */\r\n  SCB->AIRCR  = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos)    |\r\n                           (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |\r\n                            SCB_AIRCR_SYSRESETREQ_Msk    );         /* Keep priority group unchanged */\r\n  __DSB();                                                          /* Ensure completion of memory access */\r\n\r\n  for(;;)                                                           /* wait until reset */\r\n  {\r\n    __NOP();\r\n  }\r\n}\r\n\r\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\r\n/**\r\n  \\brief   Set Priority Grouping (non-secure)\r\n  \\details Sets the non-secure priority grouping field when in secure state using the required unlock sequence.\r\n           The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field.\r\n           Only values from 0..7 are used.\r\n           In case of a conflict between priority grouping and available\r\n           priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set.\r\n  \\param [in]      PriorityGroup  Priority grouping field.\r\n */\r\n__STATIC_INLINE void TZ_NVIC_SetPriorityGrouping_NS(uint32_t PriorityGroup)\r\n{\r\n  uint32_t reg_value;\r\n  uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL);             /* only values 0..7 are used          */\r\n\r\n  reg_value  =  SCB_NS->AIRCR;                                                /* read old register configuration    */\r\n  reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change               */\r\n  reg_value  =  (reg_value                                   |\r\n                ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) |\r\n                (PriorityGroupTmp << SCB_AIRCR_PRIGROUP_Pos)  );              /* Insert write key and priority group */\r\n  SCB_NS->AIRCR =  reg_value;\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Get Priority Grouping (non-secure)\r\n  \\details Reads the priority grouping field from the non-secure NVIC when in secure state.\r\n  \\return                Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field).\r\n */\r\n__STATIC_INLINE uint32_t TZ_NVIC_GetPriorityGrouping_NS(void)\r\n{\r\n  return ((uint32_t)((SCB_NS->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos));\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Enable Interrupt (non-secure)\r\n  \\details Enables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state.\r\n  \\param [in]      IRQn  Device specific interrupt number.\r\n  \\note    IRQn must not be negative.\r\n */\r\n__STATIC_INLINE void TZ_NVIC_EnableIRQ_NS(IRQn_Type IRQn)\r\n{\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));\r\n  }\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Get Interrupt Enable status (non-secure)\r\n  \\details Returns a device specific interrupt enable status from the non-secure NVIC interrupt controller when in secure state.\r\n  \\param [in]      IRQn  Device specific interrupt number.\r\n  \\return             0  Interrupt is not enabled.\r\n  \\return             1  Interrupt is enabled.\r\n  \\note    IRQn must not be negative.\r\n */\r\n__STATIC_INLINE uint32_t TZ_NVIC_GetEnableIRQ_NS(IRQn_Type IRQn)\r\n{\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    return((uint32_t)(((NVIC_NS->ISER[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\r\n  }\r\n  else\r\n  {\r\n    return(0U);\r\n  }\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Disable Interrupt (non-secure)\r\n  \\details Disables a device specific interrupt in the non-secure NVIC interrupt controller when in secure state.\r\n  \\param [in]      IRQn  Device specific interrupt number.\r\n  \\note    IRQn must not be negative.\r\n */\r\n__STATIC_INLINE void TZ_NVIC_DisableIRQ_NS(IRQn_Type IRQn)\r\n{\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    NVIC_NS->ICER[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));\r\n  }\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Get Pending Interrupt (non-secure)\r\n  \\details Reads the NVIC pending register in the non-secure NVIC when in secure state and returns the pending bit for the specified device specific interrupt.\r\n  \\param [in]      IRQn  Device specific interrupt number.\r\n  \\return             0  Interrupt status is not pending.\r\n  \\return             1  Interrupt status is pending.\r\n  \\note    IRQn must not be negative.\r\n */\r\n__STATIC_INLINE uint32_t TZ_NVIC_GetPendingIRQ_NS(IRQn_Type IRQn)\r\n{\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    return((uint32_t)(((NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\r\n  }\r\n  else\r\n  {\r\n    return(0U);\r\n  }\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Set Pending Interrupt (non-secure)\r\n  \\details Sets the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state.\r\n  \\param [in]      IRQn  Device specific interrupt number.\r\n  \\note    IRQn must not be negative.\r\n */\r\n__STATIC_INLINE void TZ_NVIC_SetPendingIRQ_NS(IRQn_Type IRQn)\r\n{\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    NVIC_NS->ISPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));\r\n  }\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Clear Pending Interrupt (non-secure)\r\n  \\details Clears the pending bit of a device specific interrupt in the non-secure NVIC pending register when in secure state.\r\n  \\param [in]      IRQn  Device specific interrupt number.\r\n  \\note    IRQn must not be negative.\r\n */\r\n__STATIC_INLINE void TZ_NVIC_ClearPendingIRQ_NS(IRQn_Type IRQn)\r\n{\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    NVIC_NS->ICPR[(((uint32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)IRQn) & 0x1FUL));\r\n  }\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Get Active Interrupt (non-secure)\r\n  \\details Reads the active register in non-secure NVIC when in secure state and returns the active bit for the device specific interrupt.\r\n  \\param [in]      IRQn  Device specific interrupt number.\r\n  \\return             0  Interrupt status is not active.\r\n  \\return             1  Interrupt status is active.\r\n  \\note    IRQn must not be negative.\r\n */\r\n__STATIC_INLINE uint32_t TZ_NVIC_GetActive_NS(IRQn_Type IRQn)\r\n{\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    return((uint32_t)(((NVIC_NS->IABR[(((uint32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL));\r\n  }\r\n  else\r\n  {\r\n    return(0U);\r\n  }\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Set Interrupt Priority (non-secure)\r\n  \\details Sets the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state.\r\n           The interrupt number can be positive to specify a device specific interrupt,\r\n           or negative to specify a processor exception.\r\n  \\param [in]      IRQn  Interrupt number.\r\n  \\param [in]  priority  Priority to set.\r\n  \\note    The priority cannot be set for every non-secure processor exception.\r\n */\r\n__STATIC_INLINE void TZ_NVIC_SetPriority_NS(IRQn_Type IRQn, uint32_t priority)\r\n{\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    NVIC_NS->IPR[((uint32_t)IRQn)]               = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\r\n  }\r\n  else\r\n  {\r\n    SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL);\r\n  }\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Get Interrupt Priority (non-secure)\r\n  \\details Reads the priority of a non-secure device specific interrupt or a non-secure processor exception when in secure state.\r\n           The interrupt number can be positive to specify a device specific interrupt,\r\n           or negative to specify a processor exception.\r\n  \\param [in]   IRQn  Interrupt number.\r\n  \\return             Interrupt Priority. Value is aligned automatically to the implemented priority bits of the microcontroller.\r\n */\r\n__STATIC_INLINE uint32_t TZ_NVIC_GetPriority_NS(IRQn_Type IRQn)\r\n{\r\n\r\n  if ((int32_t)(IRQn) >= 0)\r\n  {\r\n    return(((uint32_t)NVIC_NS->IPR[((uint32_t)IRQn)]               >> (8U - __NVIC_PRIO_BITS)));\r\n  }\r\n  else\r\n  {\r\n    return(((uint32_t)SCB_NS->SHPR[(((uint32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS)));\r\n  }\r\n}\r\n#endif /*  defined (__ARM_FEATURE_CMSE) &&(__ARM_FEATURE_CMSE == 3U) */\r\n\r\n/*@} end of CMSIS_Core_NVICFunctions */\r\n\r\n/* ##########################  MPU functions  #################################### */\r\n\r\n#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U)\r\n\r\n#include \"mpu_armv8.h\"\r\n\r\n#endif\r\n\r\n/* ##########################  FPU functions  #################################### */\r\n/**\r\n  \\ingroup  CMSIS_Core_FunctionInterface\r\n  \\defgroup CMSIS_Core_FpuFunctions FPU Functions\r\n  \\brief    Function that provides FPU type.\r\n  @{\r\n */\r\n\r\n/**\r\n  \\brief   get FPU type\r\n  \\details returns the FPU type\r\n  \\returns\r\n   - \\b  0: No FPU\r\n   - \\b  1: Single precision FPU\r\n   - \\b  2: Double + Single precision FPU\r\n */\r\n__STATIC_INLINE uint32_t SCB_GetFPUType(void)\r\n{\r\n  uint32_t mvfr0;\r\n\r\n  mvfr0 = FPU->MVFR0;\r\n  if      ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x220U)\r\n  {\r\n    return 2U;           /* Double + Single precision FPU */\r\n  }\r\n  else if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U)\r\n  {\r\n    return 1U;           /* Single precision FPU */\r\n  }\r\n  else\r\n  {\r\n    return 0U;           /* No FPU */\r\n  }\r\n}\r\n\r\n\r\n/*@} end of CMSIS_Core_FpuFunctions */\r\n\r\n\r\n\r\n/* ##########################   SAU functions  #################################### */\r\n/**\r\n  \\ingroup  CMSIS_Core_FunctionInterface\r\n  \\defgroup CMSIS_Core_SAUFunctions SAU Functions\r\n  \\brief    Functions that configure the SAU.\r\n  @{\r\n */\r\n\r\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\r\n\r\n/**\r\n  \\brief   Enable SAU\r\n  \\details Enables the Security Attribution Unit (SAU).\r\n */\r\n__STATIC_INLINE void TZ_SAU_Enable(void)\r\n{\r\n    SAU->CTRL |=  (SAU_CTRL_ENABLE_Msk);\r\n}\r\n\r\n\r\n\r\n/**\r\n  \\brief   Disable SAU\r\n  \\details Disables the Security Attribution Unit (SAU).\r\n */\r\n__STATIC_INLINE void TZ_SAU_Disable(void)\r\n{\r\n    SAU->CTRL &= ~(SAU_CTRL_ENABLE_Msk);\r\n}\r\n\r\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\r\n\r\n/*@} end of CMSIS_Core_SAUFunctions */\r\n\r\n\r\n\r\n\r\n/* ##################################    Debug Control function  ############################################ */\r\n/**\r\n  \\ingroup  CMSIS_Core_FunctionInterface\r\n  \\defgroup CMSIS_Core_DCBFunctions Debug Control Functions\r\n  \\brief    Functions that access the Debug Control Block.\r\n  @{\r\n */\r\n\r\n\r\n/**\r\n  \\brief   Set Debug Authentication Control Register\r\n  \\details writes to Debug Authentication Control register.\r\n  \\param [in]  value  value to be writen.\r\n */\r\n__STATIC_INLINE void DCB_SetAuthCtrl(uint32_t value)\r\n{\r\n    __DSB();\r\n    __ISB();\r\n    DCB->DAUTHCTRL = value;\r\n    __DSB();\r\n    __ISB();\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Get Debug Authentication Control Register\r\n  \\details Reads Debug Authentication Control register.\r\n  \\return             Debug Authentication Control Register.\r\n */\r\n__STATIC_INLINE uint32_t DCB_GetAuthCtrl(void)\r\n{\r\n    return (DCB->DAUTHCTRL);\r\n}\r\n\r\n\r\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\r\n/**\r\n  \\brief   Set Debug Authentication Control Register (non-secure)\r\n  \\details writes to non-secure Debug Authentication Control register when in secure state.\r\n  \\param [in]  value  value to be writen\r\n */\r\n__STATIC_INLINE void TZ_DCB_SetAuthCtrl_NS(uint32_t value)\r\n{\r\n    __DSB();\r\n    __ISB();\r\n    DCB_NS->DAUTHCTRL = value;\r\n    __DSB();\r\n    __ISB();\r\n}\r\n\r\n\r\n/**\r\n  \\brief   Get Debug Authentication Control Register (non-secure)\r\n  \\details Reads non-secure Debug Authentication Control register when in secure state.\r\n  \\return             Debug Authentication Control Register.\r\n */\r\n__STATIC_INLINE uint32_t TZ_DCB_GetAuthCtrl_NS(void)\r\n{\r\n    return (DCB_NS->DAUTHCTRL);\r\n}\r\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\r\n\r\n/*@} end of CMSIS_Core_DCBFunctions */\r\n\r\n\r\n\r\n\r\n/* ##################################    Debug Identification function  ############################################ */\r\n/**\r\n  \\ingroup  CMSIS_Core_FunctionInterface\r\n  \\defgroup CMSIS_Core_DIBFunctions Debug Identification Functions\r\n  \\brief    Functions that access the Debug Identification Block.\r\n  @{\r\n */\r\n\r\n\r\n/**\r\n  \\brief   Get Debug Authentication Status Register\r\n  \\details Reads Debug Authentication Status register.\r\n  \\return             Debug Authentication Status Register.\r\n */\r\n__STATIC_INLINE uint32_t DIB_GetAuthStatus(void)\r\n{\r\n    return (DIB->DAUTHSTATUS);\r\n}\r\n\r\n\r\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\r\n/**\r\n  \\brief   Get Debug Authentication Status Register (non-secure)\r\n  \\details Reads non-secure Debug Authentication Status register when in secure state.\r\n  \\return             Debug Authentication Status Register.\r\n */\r\n__STATIC_INLINE uint32_t TZ_DIB_GetAuthStatus_NS(void)\r\n{\r\n    return (DIB_NS->DAUTHSTATUS);\r\n}\r\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\r\n\r\n/*@} end of CMSIS_Core_DCBFunctions */\r\n\r\n\r\n\r\n\r\n/* ##################################    SysTick function  ############################################ */\r\n/**\r\n  \\ingroup  CMSIS_Core_FunctionInterface\r\n  \\defgroup CMSIS_Core_SysTickFunctions SysTick Functions\r\n  \\brief    Functions that configure the System.\r\n  @{\r\n */\r\n\r\n#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U)\r\n\r\n/**\r\n  \\brief   System Tick Configuration\r\n  \\details Initializes the System Timer and its interrupt, and starts the System Tick Timer.\r\n           Counter is in free running mode to generate periodic interrupts.\r\n  \\param [in]  ticks  Number of ticks between two interrupts.\r\n  \\return          0  Function succeeded.\r\n  \\return          1  Function failed.\r\n  \\note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the\r\n           function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>\r\n           must contain a vendor-specific implementation of this function.\r\n */\r\n__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)\r\n{\r\n  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)\r\n  {\r\n    return (1UL);                                                   /* Reload value impossible */\r\n  }\r\n\r\n  SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */\r\n  NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */\r\n  SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */\r\n  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |\r\n                   SysTick_CTRL_TICKINT_Msk   |\r\n                   SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */\r\n  return (0UL);                                                     /* Function successful */\r\n}\r\n\r\n#if defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\r\n/**\r\n  \\brief   System Tick Configuration (non-secure)\r\n  \\details Initializes the non-secure System Timer and its interrupt when in secure state, and starts the System Tick Timer.\r\n           Counter is in free running mode to generate periodic interrupts.\r\n  \\param [in]  ticks  Number of ticks between two interrupts.\r\n  \\return          0  Function succeeded.\r\n  \\return          1  Function failed.\r\n  \\note    When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the\r\n           function <b>TZ_SysTick_Config_NS</b> is not included. In this case, the file <b><i>device</i>.h</b>\r\n           must contain a vendor-specific implementation of this function.\r\n\r\n */\r\n__STATIC_INLINE uint32_t TZ_SysTick_Config_NS(uint32_t ticks)\r\n{\r\n  if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)\r\n  {\r\n    return (1UL);                                                         /* Reload value impossible */\r\n  }\r\n\r\n  SysTick_NS->LOAD  = (uint32_t)(ticks - 1UL);                            /* set reload register */\r\n  TZ_NVIC_SetPriority_NS (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */\r\n  SysTick_NS->VAL   = 0UL;                                                /* Load the SysTick Counter Value */\r\n  SysTick_NS->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |\r\n                      SysTick_CTRL_TICKINT_Msk   |\r\n                      SysTick_CTRL_ENABLE_Msk;                            /* Enable SysTick IRQ and SysTick Timer */\r\n  return (0UL);                                                           /* Function successful */\r\n}\r\n#endif /* defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\r\n\r\n#endif\r\n\r\n/*@} end of CMSIS_Core_SysTickFunctions */\r\n\r\n\r\n\r\n/* ##################################### Debug In/Output function ########################################### */\r\n/**\r\n  \\ingroup  CMSIS_Core_FunctionInterface\r\n  \\defgroup CMSIS_core_DebugFunctions ITM Functions\r\n  \\brief    Functions that access the ITM debug interface.\r\n  @{\r\n */\r\n\r\nextern volatile int32_t ITM_RxBuffer;                              /*!< External variable to receive characters. */\r\n#define                 ITM_RXBUFFER_EMPTY  ((int32_t)0x5AA55AA5U) /*!< Value identifying \\ref ITM_RxBuffer is ready for next character. */\r\n\r\n\r\n/**\r\n  \\brief   ITM Send Character\r\n  \\details Transmits a character via the ITM channel 0, and\r\n           \\li Just returns when no debugger is connected that has booked the output.\r\n           \\li Is blocking when a debugger is connected, but the previous character sent has not been transmitted.\r\n  \\param [in]     ch  Character to transmit.\r\n  \\returns            Character to transmit.\r\n */\r\n__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch)\r\n{\r\n  if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) &&      /* ITM enabled */\r\n      ((ITM->TER & 1UL               ) != 0UL)   )     /* ITM Port #0 enabled */\r\n  {\r\n    while (ITM->PORT[0U].u32 == 0UL)\r\n    {\r\n      __NOP();\r\n    }\r\n    ITM->PORT[0U].u8 = (uint8_t)ch;\r\n  }\r\n  return (ch);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   ITM Receive Character\r\n  \\details Inputs a character via the external variable \\ref ITM_RxBuffer.\r\n  \\return             Received character.\r\n  \\return         -1  No character pending.\r\n */\r\n__STATIC_INLINE int32_t ITM_ReceiveChar (void)\r\n{\r\n  int32_t ch = -1;                           /* no character available */\r\n\r\n  if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY)\r\n  {\r\n    ch = ITM_RxBuffer;\r\n    ITM_RxBuffer = ITM_RXBUFFER_EMPTY;       /* ready for next character */\r\n  }\r\n\r\n  return (ch);\r\n}\r\n\r\n\r\n/**\r\n  \\brief   ITM Check Character\r\n  \\details Checks whether a character is pending for reading in the variable \\ref ITM_RxBuffer.\r\n  \\return          0  No character available.\r\n  \\return          1  Character available.\r\n */\r\n__STATIC_INLINE int32_t ITM_CheckChar (void)\r\n{\r\n\r\n  if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY)\r\n  {\r\n    return (0);                              /* no character available */\r\n  }\r\n  else\r\n  {\r\n    return (1);                              /*    character available */\r\n  }\r\n}\r\n\r\n/*@} end of CMSIS_core_DebugFunctions */\r\n\r\n\r\n\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* __CORE_CM33_H_DEPENDANT */\r\n\r\n#endif /* __CMSIS_GENERIC */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/CMSIS/mpu_armv8.h",
    "content": "/******************************************************************************\r\n * @file     mpu_armv8.h\r\n * @brief    CMSIS MPU API for Armv8-M and Armv8.1-M MPU\r\n * @version  V5.1.3\r\n * @date     03. February 2021\r\n ******************************************************************************/\r\n/*\r\n * Copyright (c) 2017-2021 Arm Limited. All rights reserved.\r\n *\r\n * SPDX-License-Identifier: Apache-2.0\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the License); you may\r\n * not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\r\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n#if   defined ( __ICCARM__ )\r\n  #pragma system_include         /* treat file as system include file for MISRA check */\r\n#elif defined (__clang__)\r\n  #pragma clang system_header    /* treat file as system include file */\r\n#endif\r\n\r\n#ifndef ARM_MPU_ARMV8_H\r\n#define ARM_MPU_ARMV8_H\r\n\r\n/** \\brief Attribute for device memory (outer only) */\r\n#define ARM_MPU_ATTR_DEVICE                           ( 0U )\r\n\r\n/** \\brief Attribute for non-cacheable, normal memory */\r\n#define ARM_MPU_ATTR_NON_CACHEABLE                    ( 4U )\r\n\r\n/** \\brief Attribute for normal memory (outer and inner)\r\n* \\param NT Non-Transient: Set to 1 for non-transient data.\r\n* \\param WB Write-Back: Set to 1 to use write-back update policy.\r\n* \\param RA Read Allocation: Set to 1 to use cache allocation on read miss.\r\n* \\param WA Write Allocation: Set to 1 to use cache allocation on write miss.\r\n*/\r\n#define ARM_MPU_ATTR_MEMORY_(NT, WB, RA, WA) \\\r\n  ((((NT) & 1U) << 3U) | (((WB) & 1U) << 2U) | (((RA) & 1U) << 1U) | ((WA) & 1U))\r\n\r\n/** \\brief Device memory type non Gathering, non Re-ordering, non Early Write Acknowledgement */\r\n#define ARM_MPU_ATTR_DEVICE_nGnRnE (0U)\r\n\r\n/** \\brief Device memory type non Gathering, non Re-ordering, Early Write Acknowledgement */\r\n#define ARM_MPU_ATTR_DEVICE_nGnRE  (1U)\r\n\r\n/** \\brief Device memory type non Gathering, Re-ordering, Early Write Acknowledgement */\r\n#define ARM_MPU_ATTR_DEVICE_nGRE   (2U)\r\n\r\n/** \\brief Device memory type Gathering, Re-ordering, Early Write Acknowledgement */\r\n#define ARM_MPU_ATTR_DEVICE_GRE    (3U)\r\n\r\n/** \\brief Memory Attribute\r\n* \\param O Outer memory attributes\r\n* \\param I O == ARM_MPU_ATTR_DEVICE: Device memory attributes, else: Inner memory attributes\r\n*/\r\n#define ARM_MPU_ATTR(O, I) ((((O) & 0xFU) << 4U) | ((((O) & 0xFU) != 0U) ? ((I) & 0xFU) : (((I) & 0x3U) << 2U)))\r\n\r\n/** \\brief Normal memory non-shareable  */\r\n#define ARM_MPU_SH_NON   (0U)\r\n\r\n/** \\brief Normal memory outer shareable  */\r\n#define ARM_MPU_SH_OUTER (2U)\r\n\r\n/** \\brief Normal memory inner shareable  */\r\n#define ARM_MPU_SH_INNER (3U)\r\n\r\n/** \\brief Memory access permissions\r\n* \\param RO Read-Only: Set to 1 for read-only memory.\r\n* \\param NP Non-Privileged: Set to 1 for non-privileged memory.\r\n*/\r\n#define ARM_MPU_AP_(RO, NP) ((((RO) & 1U) << 1U) | ((NP) & 1U))\r\n\r\n/** \\brief Region Base Address Register value\r\n* \\param BASE The base address bits [31:5] of a memory region. The value is zero extended. Effective address gets 32 byte aligned.\r\n* \\param SH Defines the Shareability domain for this memory region.\r\n* \\param RO Read-Only: Set to 1 for a read-only memory region.\r\n* \\param NP Non-Privileged: Set to 1 for a non-privileged memory region.\r\n* \\oaram XN eXecute Never: Set to 1 for a non-executable memory region.\r\n*/\r\n#define ARM_MPU_RBAR(BASE, SH, RO, NP, XN) \\\r\n  (((BASE) & MPU_RBAR_BASE_Msk) | \\\r\n  (((SH) << MPU_RBAR_SH_Pos) & MPU_RBAR_SH_Msk) | \\\r\n  ((ARM_MPU_AP_(RO, NP) << MPU_RBAR_AP_Pos) & MPU_RBAR_AP_Msk) | \\\r\n  (((XN) << MPU_RBAR_XN_Pos) & MPU_RBAR_XN_Msk))\r\n\r\n/** \\brief Region Limit Address Register value\r\n* \\param LIMIT The limit address bits [31:5] for this memory region. The value is one extended.\r\n* \\param IDX The attribute index to be associated with this memory region.\r\n*/\r\n#define ARM_MPU_RLAR(LIMIT, IDX) \\\r\n  (((LIMIT) & MPU_RLAR_LIMIT_Msk) | \\\r\n  (((IDX) << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \\\r\n  (MPU_RLAR_EN_Msk))\r\n\r\n#if defined(MPU_RLAR_PXN_Pos)\r\n  \r\n/** \\brief Region Limit Address Register with PXN value\r\n* \\param LIMIT The limit address bits [31:5] for this memory region. The value is one extended.\r\n* \\param PXN Privileged execute never. Defines whether code can be executed from this privileged region.\r\n* \\param IDX The attribute index to be associated with this memory region.\r\n*/\r\n#define ARM_MPU_RLAR_PXN(LIMIT, PXN, IDX) \\\r\n  (((LIMIT) & MPU_RLAR_LIMIT_Msk) | \\\r\n  (((PXN) << MPU_RLAR_PXN_Pos) & MPU_RLAR_PXN_Msk) | \\\r\n  (((IDX) << MPU_RLAR_AttrIndx_Pos) & MPU_RLAR_AttrIndx_Msk) | \\\r\n  (MPU_RLAR_EN_Msk))\r\n  \r\n#endif\r\n\r\n/**\r\n* Struct for a single MPU Region\r\n*/\r\ntypedef struct {\r\n  uint32_t RBAR;                   /*!< Region Base Address Register value */\r\n  uint32_t RLAR;                   /*!< Region Limit Address Register value */\r\n} ARM_MPU_Region_t;\r\n    \r\n/** Enable the MPU.\r\n* \\param MPU_Control Default access permissions for unconfigured regions.\r\n*/\r\n__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control)\r\n{\r\n  __DMB();\r\n  MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk;\r\n#ifdef SCB_SHCSR_MEMFAULTENA_Msk\r\n  SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;\r\n#endif\r\n  __DSB();\r\n  __ISB();\r\n}\r\n\r\n/** Disable the MPU.\r\n*/\r\n__STATIC_INLINE void ARM_MPU_Disable(void)\r\n{\r\n  __DMB();\r\n#ifdef SCB_SHCSR_MEMFAULTENA_Msk\r\n  SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;\r\n#endif\r\n  MPU->CTRL  &= ~MPU_CTRL_ENABLE_Msk;\r\n  __DSB();\r\n  __ISB();\r\n}\r\n\r\n#ifdef MPU_NS\r\n/** Enable the Non-secure MPU.\r\n* \\param MPU_Control Default access permissions for unconfigured regions.\r\n*/\r\n__STATIC_INLINE void ARM_MPU_Enable_NS(uint32_t MPU_Control)\r\n{\r\n  __DMB();\r\n  MPU_NS->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk;\r\n#ifdef SCB_SHCSR_MEMFAULTENA_Msk\r\n  SCB_NS->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;\r\n#endif\r\n  __DSB();\r\n  __ISB();\r\n}\r\n\r\n/** Disable the Non-secure MPU.\r\n*/\r\n__STATIC_INLINE void ARM_MPU_Disable_NS(void)\r\n{\r\n  __DMB();\r\n#ifdef SCB_SHCSR_MEMFAULTENA_Msk\r\n  SCB_NS->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk;\r\n#endif\r\n  MPU_NS->CTRL  &= ~MPU_CTRL_ENABLE_Msk;\r\n  __DSB();\r\n  __ISB();\r\n}\r\n#endif\r\n\r\n/** Set the memory attribute encoding to the given MPU.\r\n* \\param mpu Pointer to the MPU to be configured.\r\n* \\param idx The attribute index to be set [0-7]\r\n* \\param attr The attribute value to be set.\r\n*/\r\n__STATIC_INLINE void ARM_MPU_SetMemAttrEx(MPU_Type* mpu, uint8_t idx, uint8_t attr)\r\n{\r\n  const uint8_t reg = idx / 4U;\r\n  const uint32_t pos = ((idx % 4U) * 8U);\r\n  const uint32_t mask = 0xFFU << pos;\r\n  \r\n  if (reg >= (sizeof(mpu->MAIR) / sizeof(mpu->MAIR[0]))) {\r\n    return; // invalid index\r\n  }\r\n  \r\n  mpu->MAIR[reg] = ((mpu->MAIR[reg] & ~mask) | ((attr << pos) & mask));\r\n}\r\n\r\n/** Set the memory attribute encoding.\r\n* \\param idx The attribute index to be set [0-7]\r\n* \\param attr The attribute value to be set.\r\n*/\r\n__STATIC_INLINE void ARM_MPU_SetMemAttr(uint8_t idx, uint8_t attr)\r\n{\r\n  ARM_MPU_SetMemAttrEx(MPU, idx, attr);\r\n}\r\n\r\n#ifdef MPU_NS\r\n/** Set the memory attribute encoding to the Non-secure MPU.\r\n* \\param idx The attribute index to be set [0-7]\r\n* \\param attr The attribute value to be set.\r\n*/\r\n__STATIC_INLINE void ARM_MPU_SetMemAttr_NS(uint8_t idx, uint8_t attr)\r\n{\r\n  ARM_MPU_SetMemAttrEx(MPU_NS, idx, attr);\r\n}\r\n#endif\r\n\r\n/** Clear and disable the given MPU region of the given MPU.\r\n* \\param mpu Pointer to MPU to be used.\r\n* \\param rnr Region number to be cleared.\r\n*/\r\n__STATIC_INLINE void ARM_MPU_ClrRegionEx(MPU_Type* mpu, uint32_t rnr)\r\n{\r\n  mpu->RNR = rnr;\r\n  mpu->RLAR = 0U;\r\n}\r\n\r\n/** Clear and disable the given MPU region.\r\n* \\param rnr Region number to be cleared.\r\n*/\r\n__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr)\r\n{\r\n  ARM_MPU_ClrRegionEx(MPU, rnr);\r\n}\r\n\r\n#ifdef MPU_NS\r\n/** Clear and disable the given Non-secure MPU region.\r\n* \\param rnr Region number to be cleared.\r\n*/\r\n__STATIC_INLINE void ARM_MPU_ClrRegion_NS(uint32_t rnr)\r\n{  \r\n  ARM_MPU_ClrRegionEx(MPU_NS, rnr);\r\n}\r\n#endif\r\n\r\n/** Configure the given MPU region of the given MPU.\r\n* \\param mpu Pointer to MPU to be used.\r\n* \\param rnr Region number to be configured.\r\n* \\param rbar Value for RBAR register.\r\n* \\param rlar Value for RLAR register.\r\n*/   \r\n__STATIC_INLINE void ARM_MPU_SetRegionEx(MPU_Type* mpu, uint32_t rnr, uint32_t rbar, uint32_t rlar)\r\n{\r\n  mpu->RNR = rnr;\r\n  mpu->RBAR = rbar;\r\n  mpu->RLAR = rlar;\r\n}\r\n\r\n/** Configure the given MPU region.\r\n* \\param rnr Region number to be configured.\r\n* \\param rbar Value for RBAR register.\r\n* \\param rlar Value for RLAR register.\r\n*/   \r\n__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rnr, uint32_t rbar, uint32_t rlar)\r\n{\r\n  ARM_MPU_SetRegionEx(MPU, rnr, rbar, rlar);\r\n}\r\n\r\n#ifdef MPU_NS\r\n/** Configure the given Non-secure MPU region.\r\n* \\param rnr Region number to be configured.\r\n* \\param rbar Value for RBAR register.\r\n* \\param rlar Value for RLAR register.\r\n*/   \r\n__STATIC_INLINE void ARM_MPU_SetRegion_NS(uint32_t rnr, uint32_t rbar, uint32_t rlar)\r\n{\r\n  ARM_MPU_SetRegionEx(MPU_NS, rnr, rbar, rlar);  \r\n}\r\n#endif\r\n\r\n/** Memcpy with strictly ordered memory access, e.g. used by code in ARM_MPU_LoadEx()\r\n* \\param dst Destination data is copied to.\r\n* \\param src Source data is copied from.\r\n* \\param len Amount of data words to be copied.\r\n*/\r\n__STATIC_INLINE void ARM_MPU_OrderedMemcpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len)\r\n{\r\n  uint32_t i;\r\n  for (i = 0U; i < len; ++i) \r\n  {\r\n    dst[i] = src[i];\r\n  }\r\n}\r\n\r\n/** Load the given number of MPU regions from a table to the given MPU.\r\n* \\param mpu Pointer to the MPU registers to be used.\r\n* \\param rnr First region number to be configured.\r\n* \\param table Pointer to the MPU configuration table.\r\n* \\param cnt Amount of regions to be configured.\r\n*/\r\n__STATIC_INLINE void ARM_MPU_LoadEx(MPU_Type* mpu, uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) \r\n{\r\n  const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U;\r\n  if (cnt == 1U) {\r\n    mpu->RNR = rnr;\r\n    ARM_MPU_OrderedMemcpy(&(mpu->RBAR), &(table->RBAR), rowWordSize);\r\n  } else {\r\n    uint32_t rnrBase   = rnr & ~(MPU_TYPE_RALIASES-1U);\r\n    uint32_t rnrOffset = rnr % MPU_TYPE_RALIASES;\r\n    \r\n    mpu->RNR = rnrBase;\r\n    while ((rnrOffset + cnt) > MPU_TYPE_RALIASES) {\r\n      uint32_t c = MPU_TYPE_RALIASES - rnrOffset;\r\n      ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), c*rowWordSize);\r\n      table += c;\r\n      cnt -= c;\r\n      rnrOffset = 0U;\r\n      rnrBase += MPU_TYPE_RALIASES;\r\n      mpu->RNR = rnrBase;\r\n    }\r\n    \r\n    ARM_MPU_OrderedMemcpy(&(mpu->RBAR)+(rnrOffset*2U), &(table->RBAR), cnt*rowWordSize);\r\n  }\r\n}\r\n\r\n/** Load the given number of MPU regions from a table.\r\n* \\param rnr First region number to be configured.\r\n* \\param table Pointer to the MPU configuration table.\r\n* \\param cnt Amount of regions to be configured.\r\n*/\r\n__STATIC_INLINE void ARM_MPU_Load(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) \r\n{\r\n  ARM_MPU_LoadEx(MPU, rnr, table, cnt);\r\n}\r\n\r\n#ifdef MPU_NS\r\n/** Load the given number of MPU regions from a table to the Non-secure MPU.\r\n* \\param rnr First region number to be configured.\r\n* \\param table Pointer to the MPU configuration table.\r\n* \\param cnt Amount of regions to be configured.\r\n*/\r\n__STATIC_INLINE void ARM_MPU_Load_NS(uint32_t rnr, ARM_MPU_Region_t const* table, uint32_t cnt) \r\n{\r\n  ARM_MPU_LoadEx(MPU_NS, rnr, table, cnt);\r\n}\r\n#endif\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/CMSIS/tz_context.h",
    "content": "/******************************************************************************\r\n * @file     tz_context.h\r\n * @brief    Context Management for Armv8-M TrustZone\r\n * @version  V1.0.1\r\n * @date     10. January 2018\r\n ******************************************************************************/\r\n/*\r\n * Copyright (c) 2017-2018 Arm Limited. All rights reserved.\r\n *\r\n * SPDX-License-Identifier: Apache-2.0\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the License); you may\r\n * not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n * www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an AS IS BASIS, WITHOUT\r\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\r\n\r\n#if   defined ( __ICCARM__ )\r\n  #pragma system_include         /* treat file as system include file for MISRA check */\r\n#elif defined (__clang__)\r\n  #pragma clang system_header   /* treat file as system include file */\r\n#endif\r\n\r\n#ifndef TZ_CONTEXT_H\r\n#define TZ_CONTEXT_H\r\n \r\n#include <stdint.h>\r\n \r\n#ifndef TZ_MODULEID_T\r\n#define TZ_MODULEID_T\r\n/// \\details Data type that identifies secure software modules called by a process.\r\ntypedef uint32_t TZ_ModuleId_t;\r\n#endif\r\n \r\n/// \\details TZ Memory ID identifies an allocated memory slot.\r\ntypedef uint32_t TZ_MemoryId_t;\r\n  \r\n/// Initialize secure context memory system\r\n/// \\return execution status (1: success, 0: error)\r\nuint32_t TZ_InitContextSystem_S (void);\r\n \r\n/// Allocate context memory for calling secure software modules in TrustZone\r\n/// \\param[in]  module   identifies software modules called from non-secure mode\r\n/// \\return value != 0 id TrustZone memory slot identifier\r\n/// \\return value 0    no memory available or internal error\r\nTZ_MemoryId_t TZ_AllocModuleContext_S (TZ_ModuleId_t module);\r\n \r\n/// Free context memory that was previously allocated with \\ref TZ_AllocModuleContext_S\r\n/// \\param[in]  id  TrustZone memory slot identifier\r\n/// \\return execution status (1: success, 0: error)\r\nuint32_t TZ_FreeModuleContext_S (TZ_MemoryId_t id);\r\n \r\n/// Load secure context (called on RTOS thread context switch)\r\n/// \\param[in]  id  TrustZone memory slot identifier\r\n/// \\return execution status (1: success, 0: error)\r\nuint32_t TZ_LoadContext_S (TZ_MemoryId_t id);\r\n \r\n/// Store secure context (called on RTOS thread context switch)\r\n/// \\param[in]  id  TrustZone memory slot identifier\r\n/// \\return execution status (1: success, 0: error)\r\nuint32_t TZ_StoreContext_S (TZ_MemoryId_t id);\r\n \r\n#endif  // TZ_CONTEXT_H\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/Debug/frdm-rw612-xpresso-freertos-builtin_Debug.ld",
    "content": "/*\n * GENERATED FILE - DO NOT EDIT\n * Copyright 2008-2013 Code Red Technologies Ltd,\n * Copyright 2013-2025 NXP\n * SPDX-License-Identifier: BSD-3-Clause\n * Generated linker script file for RW612\n * Created from linkscript.ldt by FMCreateLinkLibraries\n * Using Freemarker v2.3.30\n * MCUXpresso IDE v24.12 [Build 148] [2025-01-10] on Sep 10, 2025, 4:53:33 PM\n */\n\nINCLUDE \"frdm-rw612-xpresso-freertos-builtin_Debug_library.ld\"\nINCLUDE \"frdm-rw612-xpresso-freertos-builtin_Debug_memory.ld\"\n\nENTRY(ResetISR)\n\nSECTIONS\n{\n     /* Offset .text by 0x1000 bytes, which whill be added by the image tool*/\n    .boot_hdr : ALIGN(4)\n    {\n        FILL(0xFF)\n        . = 0x400;\n        __FLASH_BASE = .;\n        KEEP(*(.flash_conf))\n        . = 0x1000;\n    } > QSPI_FLASH\n\n    /* MAIN TEXT SECTION */\n    .text : ALIGN(4)\n    {\n        FILL(0xff)\n        __vectors_start__ = ABSOLUTE(.) ;\n        KEEP(*(.isr_vector))\n        /* Global Section Table */\n        . = ALIGN(4) ;\n        __section_table_start = .;\n        __data_section_table = .;\n        LONG(LOADADDR(.data));\n        LONG(    ADDR(.data));\n        LONG(  SIZEOF(.data));\n        LONG(LOADADDR(.data_RAM2));\n        LONG(    ADDR(.data_RAM2));\n        LONG(  SIZEOF(.data_RAM2));\n        LONG(LOADADDR(.data_RAM3));\n        LONG(    ADDR(.data_RAM3));\n        LONG(  SIZEOF(.data_RAM3));\n        LONG(LOADADDR(.data_RAM4));\n        LONG(    ADDR(.data_RAM4));\n        LONG(  SIZEOF(.data_RAM4));\n        LONG(LOADADDR(.data_RAM5));\n        LONG(    ADDR(.data_RAM5));\n        LONG(  SIZEOF(.data_RAM5));\n        LONG(LOADADDR(.data_RAM6));\n        LONG(    ADDR(.data_RAM6));\n        LONG(  SIZEOF(.data_RAM6));\n        __data_section_table_end = .;\n        __bss_section_table = .;\n        LONG(    ADDR(.bss));\n        LONG(  SIZEOF(.bss));\n        LONG(    ADDR(.bss_RAM2));\n        LONG(  SIZEOF(.bss_RAM2));\n        LONG(    ADDR(.bss_RAM3));\n        LONG(  SIZEOF(.bss_RAM3));\n        LONG(    ADDR(.bss_RAM4));\n        LONG(  SIZEOF(.bss_RAM4));\n        LONG(    ADDR(.bss_RAM5));\n        LONG(  SIZEOF(.bss_RAM5));\n        LONG(    ADDR(.bss_RAM6));\n        LONG(  SIZEOF(.bss_RAM6));\n        __bss_section_table_end = .;\n        __section_table_end = . ;\n        /* End of Global Section Table */\n\n        *(.after_vectors*)\n\n        *(EXCLUDE_FILE(*mflash_drv.o *fsl_flexspi.o) .text*)       KEEP(*freertos*/tasks.o(.rodata*)) /* FreeRTOS Debug Config */\n       *(.rodata)\r\n       *(EXCLUDE_FILE(*mflash_drv.o *fsl_flexspi.o).rodata.*)\r\n       *(.constdata .constdata.*)\r\n       . = ALIGN(4);\r\n\n    } > QSPI_FLASH\n    /*\n     * for exception handling/unwind - some Newlib functions (in common\n     * with C++ and STDC++) use this.\n     */\n    .ARM.extab : ALIGN(4)\n    {\n        *(.ARM.extab* .gnu.linkonce.armextab.*)\n    } > QSPI_FLASH\n\n    .ARM.exidx : ALIGN(4)\n    {\n        __exidx_start = .;\n        *(.ARM.exidx* .gnu.linkonce.armexidx.*)\n        __exidx_end = .;\n    } > QSPI_FLASH\n \n    _etext = .;\n        \n    /* DATA section for MBOX1 */\n\n    .data_RAM2 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM2 = .) ;\n        PROVIDE(__start_data_MBOX1 = .) ;\n        *(.ramfunc.$RAM2)\n        *(.ramfunc.$MBOX1)\n        *(.data.$RAM2)\n        *(.data.$MBOX1)\n        *(.data.$RAM2.*)\n        *(.data.$MBOX1.*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM2 = .) ;\n        PROVIDE(__end_data_MBOX1 = .) ;\n     } > MBOX1 AT>QSPI_FLASH\n\n    /* DATA section for TXQ1 */\n\n    .data_RAM3 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM3 = .) ;\n        PROVIDE(__start_data_TXQ1 = .) ;\n        *(.ramfunc.$RAM3)\n        *(.ramfunc.$TXQ1)\n        *(.data.$RAM3)\n        *(.data.$TXQ1)\n        *(.data.$RAM3.*)\n        *(.data.$TXQ1.*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM3 = .) ;\n        PROVIDE(__end_data_TXQ1 = .) ;\n     } > TXQ1 AT>QSPI_FLASH\n\n    /* DATA section for MBOX2 */\n\n    .data_RAM4 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM4 = .) ;\n        PROVIDE(__start_data_MBOX2 = .) ;\n        *(.ramfunc.$RAM4)\n        *(.ramfunc.$MBOX2)\n        *(.data.$RAM4)\n        *(.data.$MBOX2)\n        *(.data.$RAM4.*)\n        *(.data.$MBOX2.*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM4 = .) ;\n        PROVIDE(__end_data_MBOX2 = .) ;\n     } > MBOX2 AT>QSPI_FLASH\n\n    /* DATA section for TXQ23 */\n\n    .data_RAM5 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM5 = .) ;\n        PROVIDE(__start_data_TXQ23 = .) ;\n        *(.ramfunc.$RAM5)\n        *(.ramfunc.$TXQ23)\n        *(.data.$RAM5)\n        *(.data.$TXQ23)\n        *(.data.$RAM5.*)\n        *(.data.$TXQ23.*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM5 = .) ;\n        PROVIDE(__end_data_TXQ23 = .) ;\n     } > TXQ23 AT>QSPI_FLASH\n\n    /* DATA section for TXQ32 */\n\n    .data_RAM6 : ALIGN(4)\n    {\n        FILL(0xff)\n        PROVIDE(__start_data_RAM6 = .) ;\n        PROVIDE(__start_data_TXQ32 = .) ;\n        *(.ramfunc.$RAM6)\n        *(.ramfunc.$TXQ32)\n        *(.data.$RAM6)\n        *(.data.$TXQ32)\n        *(.data.$RAM6.*)\n        *(.data.$TXQ32.*)\n        . = ALIGN(4) ;\n        PROVIDE(__end_data_RAM6 = .) ;\n        PROVIDE(__end_data_TXQ32 = .) ;\n     } > TXQ32 AT>QSPI_FLASH\n\n    /* MAIN DATA SECTION */\n    .uninit_RESERVED (NOLOAD) : ALIGN(4)\n    {\n        _start_uninit_RESERVED = .;\n        KEEP(*(.bss.$RESERVED*))\n       . = ALIGN(4) ;\n        _end_uninit_RESERVED = .;\n    } > SRAM AT> SRAM\n\n    /* Main DATA section (SRAM) */\n    .data : ALIGN(4)\n    {\n       FILL(0xff)\n       _data = . ;\n       PROVIDE(__start_data_RAM = .) ;\n       PROVIDE(__start_data_SRAM = .) ;\n       *(vtable)\n       *(.ramfunc*)\n       KEEP(*(CodeQuickAccess))\n       KEEP(*(DataQuickAccess))\n       *(RamFunction)\n       *mflash_drv.o(.text .text* .rodata .rodata*)\r\n       *fsl_flexspi.o(.text .text* .rodata .rodata*)\r\n       *(.data*)\r\n       . = ALIGN(4) ;\n       _edata = . ;\n       PROVIDE(__end_data_RAM = .) ;\n       PROVIDE(__end_data_SRAM = .) ;\n    } > SRAM AT>QSPI_FLASH\n\n    /* BSS section for MBOX1 */\n    .bss_RAM2 (NOLOAD) : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM2 = .) ;\n       PROVIDE(__start_bss_MBOX1 = .) ;\n       *(.bss.$RAM2)\n       *(.bss.$MBOX1)\n       *(.bss.$RAM2.*)\n       *(.bss.$MBOX1.*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM2 = .) ;\n       PROVIDE(__end_bss_MBOX1 = .) ;\n    } > MBOX1 AT> MBOX1\n\n    /* BSS section for TXQ1 */\n    .bss_RAM3 (NOLOAD) : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM3 = .) ;\n       PROVIDE(__start_bss_TXQ1 = .) ;\n       *(.bss.$RAM3)\n       *(.bss.$TXQ1)\n       *(.bss.$RAM3.*)\n       *(.bss.$TXQ1.*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM3 = .) ;\n       PROVIDE(__end_bss_TXQ1 = .) ;\n    } > TXQ1 AT> TXQ1\n\n    /* BSS section for MBOX2 */\n    .bss_RAM4 (NOLOAD) : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM4 = .) ;\n       PROVIDE(__start_bss_MBOX2 = .) ;\n       *(.bss.$RAM4)\n       *(.bss.$MBOX2)\n       *(.bss.$RAM4.*)\n       *(.bss.$MBOX2.*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM4 = .) ;\n       PROVIDE(__end_bss_MBOX2 = .) ;\n    } > MBOX2 AT> MBOX2\n\n    /* BSS section for TXQ23 */\n    .bss_RAM5 (NOLOAD) : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM5 = .) ;\n       PROVIDE(__start_bss_TXQ23 = .) ;\n       *(.bss.$RAM5)\n       *(.bss.$TXQ23)\n       *(.bss.$RAM5.*)\n       *(.bss.$TXQ23.*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM5 = .) ;\n       PROVIDE(__end_bss_TXQ23 = .) ;\n    } > TXQ23 AT> TXQ23\n\n    /* BSS section for TXQ32 */\n    .bss_RAM6 (NOLOAD) : ALIGN(4)\n    {\n       PROVIDE(__start_bss_RAM6 = .) ;\n       PROVIDE(__start_bss_TXQ32 = .) ;\n       *(.bss.$RAM6)\n       *(.bss.$TXQ32)\n       *(.bss.$RAM6.*)\n       *(.bss.$TXQ32.*)\n       . = ALIGN (. != 0 ? 4 : 1) ; /* avoid empty segment */\n       PROVIDE(__end_bss_RAM6 = .) ;\n       PROVIDE(__end_bss_TXQ32 = .) ;\n    } > TXQ32 AT> TXQ32\n\n    /* MAIN BSS SECTION */\n    .bss (NOLOAD) : ALIGN(4)\n    {\n        _bss = .;\n        PROVIDE(__start_bss_RAM = .) ;\n        PROVIDE(__start_bss_SRAM = .) ;\n        *(.bss*)\n        *(COMMON)\n        . = ALIGN(4) ;\n        _ebss = .;\n        PROVIDE(__end_bss_RAM = .) ;\n        PROVIDE(__end_bss_SRAM = .) ;\n        PROVIDE(end = .);\n    } > SRAM AT> SRAM\n\n    /* NOINIT section for MBOX1 */\n    .noinit_RAM2 (NOLOAD) : ALIGN(4)\n    {\n       PROVIDE(__start_noinit_RAM2 = .) ;\n       PROVIDE(__start_noinit_MBOX1 = .) ;\n       *(.noinit.$RAM2)\n       *(.noinit.$MBOX1)\n       *(.noinit.$RAM2.*)\n       *(.noinit.$MBOX1.*)\n       . = ALIGN(4) ;\n       PROVIDE(__end_noinit_RAM2 = .) ;\n       PROVIDE(__end_noinit_MBOX1 = .) ;\n    } > MBOX1 AT> MBOX1\n\n    /* NOINIT section for TXQ1 */\n    .noinit_RAM3 (NOLOAD) : ALIGN(4)\n    {\n       PROVIDE(__start_noinit_RAM3 = .) ;\n       PROVIDE(__start_noinit_TXQ1 = .) ;\n       *(.noinit.$RAM3)\n       *(.noinit.$TXQ1)\n       *(.noinit.$RAM3.*)\n       *(.noinit.$TXQ1.*)\n       . = ALIGN(4) ;\n       PROVIDE(__end_noinit_RAM3 = .) ;\n       PROVIDE(__end_noinit_TXQ1 = .) ;\n    } > TXQ1 AT> TXQ1\n\n    /* NOINIT section for MBOX2 */\n    .noinit_RAM4 (NOLOAD) : ALIGN(4)\n    {\n       PROVIDE(__start_noinit_RAM4 = .) ;\n       PROVIDE(__start_noinit_MBOX2 = .) ;\n       *(.noinit.$RAM4)\n       *(.noinit.$MBOX2)\n       *(.noinit.$RAM4.*)\n       *(.noinit.$MBOX2.*)\n       . = ALIGN(4) ;\n       PROVIDE(__end_noinit_RAM4 = .) ;\n       PROVIDE(__end_noinit_MBOX2 = .) ;\n    } > MBOX2 AT> MBOX2\n\n    /* NOINIT section for TXQ23 */\n    .noinit_RAM5 (NOLOAD) : ALIGN(4)\n    {\n       PROVIDE(__start_noinit_RAM5 = .) ;\n       PROVIDE(__start_noinit_TXQ23 = .) ;\n       *(.noinit.$RAM5)\n       *(.noinit.$TXQ23)\n       *(.noinit.$RAM5.*)\n       *(.noinit.$TXQ23.*)\n       . = ALIGN(4) ;\n       PROVIDE(__end_noinit_RAM5 = .) ;\n       PROVIDE(__end_noinit_TXQ23 = .) ;\n    } > TXQ23 AT> TXQ23\n\n    /* NOINIT section for TXQ32 */\n    .noinit_RAM6 (NOLOAD) : ALIGN(4)\n    {\n       PROVIDE(__start_noinit_RAM6 = .) ;\n       PROVIDE(__start_noinit_TXQ32 = .) ;\n       *(.noinit.$RAM6)\n       *(.noinit.$TXQ32)\n       *(.noinit.$RAM6.*)\n       *(.noinit.$TXQ32.*)\n       . = ALIGN(4) ;\n       PROVIDE(__end_noinit_RAM6 = .) ;\n       PROVIDE(__end_noinit_TXQ32 = .) ;\n    } > TXQ32 AT> TXQ32\n    /* DEFAULT NOINIT SECTION */\r\n    .noinit (NOLOAD): ALIGN(4)\r\n    {\r\n        _noinit = .;\r\n        PROVIDE(__start_noinit_RAM = .) ;\r\n        PROVIDE(__start_noinit_SRAM = .) ;\r\n        *(.noinit*)\r\n        . = ALIGN(4) ;\r\n        _end_noinit = .;\r\n        PROVIDE(__end_noinit_RAM = .) ;\r\n        PROVIDE(__end_noinit_SRAM = .) ;\r\n    } > SRAM AT> SRAM\r\n\r\n    .smu_cpu13_mbox (NOLOAD) :\r\n    {\r\n        . = ALIGN(4);\r\n        *(.smu_cpu13_mbox)\r\n        KEEP (*(.smu_cpu13_mbox))\r\n        . = ALIGN(4);\r\n    } > MBOX1 AT> MBOX1\r\n\r\n    .smu_cpu31_txq (NOLOAD) :\r\n    {\r\n        . = ALIGN(4);\r\n        *(.smu_cpu31_txq)\r\n        KEEP (*(.smu_cpu31_txq))\r\n        . = ALIGN(4);\r\n    } > TXQ1 AT> TXQ1\r\n\r\n    .smu_cpu23_mbox (NOLOAD) :\r\n    {\r\n        . = ALIGN(4);\r\n        *(.smu_cpu23_mbox)\r\n        KEEP (*(.smu_cpu23_mbox))\r\n        . = ALIGN(4);\r\n    } > MBOX2 AT> MBOX2\r\n\r\n    .smu_cpu32_txq (NOLOAD) :\r\n    {\r\n        . = ALIGN(4);\r\n        *(.smu_cpu32_txq)\r\n        KEEP (*(.smu_cpu32_txq))\r\n        . = ALIGN(4);\r\n    } > TXQ32 AT> TXQ32\r\n\n    /* Reserve and place Heap within memory map */\n    _HeapSize = 0x20000;\n    .heap (NOLOAD) :  ALIGN(4)\n    {\n        _pvHeapStart = .;\n        . += _HeapSize;\n        . = ALIGN(4);\n        _pvHeapLimit = .;\n    } > SRAM\n\n     _StackSize = 0x800;\n     /* Reserve space in memory for Stack */\n    .heap2stackfill (NOLOAD) :\n    {\n        . += _StackSize;\n    } > SRAM\n    /* Locate actual Stack in memory map */\n    .stack ORIGIN(SRAM) + LENGTH(SRAM) - _StackSize - 0 (NOLOAD) :  ALIGN(4)\n    {\n        _vStackBase = .;\n        . = ALIGN(4);\n        _vStackTop = . + _StackSize;\n    } > SRAM\n\n    /* Provide basic symbols giving location and size of main text\n     * block, including initial values of RW data sections. Note that\n     * these will need extending to give a complete picture with\n     * complex images (e.g multiple Flash banks).\n     */\n    _image_start = LOADADDR(.text);\n    _image_end = LOADADDR(.data) + SIZEOF(.data);\n    _image_size = _image_end - _image_start;\n}"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/Debug/frdm-rw612-xpresso-freertos-builtin_Debug_library.ld",
    "content": "/*\n * GENERATED FILE - DO NOT EDIT\n * Copyright 2008-2013 Code Red Technologies Ltd,\n * Copyright 2013-2025 NXP\n * SPDX-License-Identifier: BSD-3-Clause\n * Generated linker script file for RW612\n * Created from library.ldt by FMCreateLinkLibraries\n * Using Freemarker v2.3.30\n * MCUXpresso IDE v24.12 [Build 148] [2025-01-10] on Sep 10, 2025, 4:53:33 PM\n */\n\nGROUP (\n  \"libgcc.a\"\n  \"libc_nano.a\"\n  \"libm.a\"\n  \"libcr_newlib_nohost.a\"\n)\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/Debug/frdm-rw612-xpresso-freertos-builtin_Debug_memory.ld",
    "content": "/*\n * GENERATED FILE - DO NOT EDIT\n * Copyright 2008-2013 Code Red Technologies Ltd,\n * Copyright 2013-2025 NXP\n * SPDX-License-Identifier: BSD-3-Clause\n * Generated linker script file for RW612\n * Created from memory.ldt by FMCreateLinkMemory\n * Using Freemarker v2.3.30\n * MCUXpresso IDE v24.12 [Build 148] [2025-01-10] on Sep 10, 2025, 4:53:33 PM\n */\n\nMEMORY\n{\n  /* Define each memory region */\n  QSPI_FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 0x800000 /* 8M bytes (alias Flash) */  \n  SRAM (rwx) : ORIGIN = 0x20000000, LENGTH = 0x130000 /* 1216K bytes (alias RAM) */  \n  MBOX1 (rwx) : ORIGIN = 0x41380000, LENGTH = 0x488 /* 1160 bytes (alias RAM2) */  \n  TXQ1 (rwx) : ORIGIN = 0x41380488, LENGTH = 0x1000 /* 4K bytes (alias RAM3) */  \n  MBOX2 (rwx) : ORIGIN = 0x443c0000, LENGTH = 0x488 /* 1160 bytes (alias RAM4) */  \n  TXQ23 (rwx) : ORIGIN = 0x443c0488, LENGTH = 0x1080 /* 4224 bytes (alias RAM5) */  \n  TXQ32 (rwx) : ORIGIN = 0x443c1508, LENGTH = 0x1080 /* 4224 bytes (alias RAM6) */  \n}\n\n  /* Define a symbol for the top of each memory region */\n  __base_QSPI_FLASH = 0x8000000  ; /* QSPI_FLASH */  \n  __base_Flash = 0x8000000 ; /* Flash */  \n  __top_QSPI_FLASH = 0x8000000 + 0x800000 ; /* 8M bytes */  \n  __top_Flash = 0x8000000 + 0x800000 ; /* 8M bytes */  \n  __base_SRAM = 0x20000000  ; /* SRAM */  \n  __base_RAM = 0x20000000 ; /* RAM */  \n  __top_SRAM = 0x20000000 + 0x130000 ; /* 1216K bytes */  \n  __top_RAM = 0x20000000 + 0x130000 ; /* 1216K bytes */  \n  __base_MBOX1 = 0x41380000  ; /* MBOX1 */  \n  __base_RAM2 = 0x41380000 ; /* RAM2 */  \n  __top_MBOX1 = 0x41380000 + 0x488 ; /* 1160 bytes */  \n  __top_RAM2 = 0x41380000 + 0x488 ; /* 1160 bytes */  \n  __base_TXQ1 = 0x41380488  ; /* TXQ1 */  \n  __base_RAM3 = 0x41380488 ; /* RAM3 */  \n  __top_TXQ1 = 0x41380488 + 0x1000 ; /* 4K bytes */  \n  __top_RAM3 = 0x41380488 + 0x1000 ; /* 4K bytes */  \n  __base_MBOX2 = 0x443c0000  ; /* MBOX2 */  \n  __base_RAM4 = 0x443c0000 ; /* RAM4 */  \n  __top_MBOX2 = 0x443c0000 + 0x488 ; /* 1160 bytes */  \n  __top_RAM4 = 0x443c0000 + 0x488 ; /* 1160 bytes */  \n  __base_TXQ23 = 0x443c0488  ; /* TXQ23 */  \n  __base_RAM5 = 0x443c0488 ; /* RAM5 */  \n  __top_TXQ23 = 0x443c0488 + 0x1080 ; /* 4224 bytes */  \n  __top_RAM5 = 0x443c0488 + 0x1080 ; /* 4224 bytes */  \n  __base_TXQ32 = 0x443c1508  ; /* TXQ32 */  \n  __base_RAM6 = 0x443c1508 ; /* RAM6 */  \n  __top_TXQ32 = 0x443c1508 + 0x1080 ; /* 4224 bytes */  \n  __top_RAM6 = 0x443c1508 + 0x1080 ; /* 4224 bytes */  \n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/README.md",
    "content": "This example assumes your FRDM-RW612 board already has the Wi-Fi submodule firmware already burned to flash. This seems to be the case for new boards.\n\nIn case this is not so, please follow indications in NXP's \"frdmrw612_wifi_webconfig\" example, components/conn_fwloader/readme.txt\n\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/board/board.c",
    "content": "/*\r\n * Copyright 2021-2024 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include \"fsl_common.h\"\r\n#include \"fsl_debug_console.h\"\r\n#include \"fsl_clock.h\"\r\n#include \"board.h\"\r\n#include \"fsl_flexspi.h\"\r\n#include \"fsl_cache.h\"\r\n#include \"fsl_io_mux.h\"\r\n#include \"fsl_power.h\"\r\n#include \"fsl_ocotp.h\"\r\n#include \"mcuxClEls.h\"\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n#define BOARD_FLEXSPI_DLL_LOCK_RETRY (10)\r\n\r\n/*******************************************************************************\r\n * Variables\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n * Prototypes\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n * Code\r\n ******************************************************************************/\r\n/* Initialize debug console. */\r\nvoid BOARD_InitDebugConsole(void)\r\n{\r\n    uint32_t uartClkSrcFreq = 0;\r\n\r\n    /* attach FRG0 clock to FLEXCOMM3 (debug console) */\r\n    CLOCK_SetFRGClock(BOARD_DEBUG_UART_FRG_CLK);\r\n    CLOCK_AttachClk(BOARD_DEBUG_UART_CLK_ATTACH);\r\n\r\n    uartClkSrcFreq = BOARD_DEBUG_UART_CLK_FREQ;\r\n    DbgConsole_Init(BOARD_DEBUG_UART_INSTANCE, BOARD_DEBUG_UART_BAUDRATE, BOARD_DEBUG_UART_TYPE, uartClkSrcFreq);\r\n}\r\n\r\nstatic status_t flexspi_hyper_ram_run_seq(FLEXSPI_Type *base, uint32_t seqIndex)\r\n{\r\n    flexspi_transfer_t flashXfer;\r\n    status_t status;\r\n\r\n    /* Write data */\r\n    flashXfer.deviceAddress = 0U;\r\n    flashXfer.port          = kFLEXSPI_PortB1;\r\n    flashXfer.cmdType       = kFLEXSPI_Command;\r\n    flashXfer.SeqNumber     = 1;\r\n    flashXfer.seqIndex      = seqIndex;\r\n\r\n    status = FLEXSPI_TransferBlocking(base, &flashXfer);\r\n\r\n    return status;\r\n}\r\n\r\n/* Initialize psram. */\r\nstatus_t BOARD_InitPsRam(void)\r\n{\r\n    flexspi_device_config_t psramConfig = {\r\n        .flexspiRootClk       = 106666667, /* 106MHZ SPI serial clock */\r\n        .isSck2Enabled        = false,\r\n        .flashSize            = 0x2000,    /* 64Mb/KByte */\r\n        .addressShift         = false,\r\n        .CSIntervalUnit       = kFLEXSPI_CsIntervalUnit1SckCycle,\r\n        .CSInterval           = 0,\r\n        .CSHoldTime           = 3,\r\n        .CSSetupTime          = 3,\r\n        .dataValidTime        = 1,\r\n        .columnspace          = 0,\r\n        .enableWordAddress    = false,\r\n        .AWRSeqIndex          = 12,\r\n        .AWRSeqNumber         = 1,\r\n        .ARDSeqIndex          = 11,\r\n        .ARDSeqNumber         = 1,\r\n        .AHBWriteWaitUnit     = kFLEXSPI_AhbWriteWaitUnit2AhbCycle,\r\n        .AHBWriteWaitInterval = 0,\r\n        .enableWriteMask      = true,\r\n    };\r\n\r\n    uint32_t psramLUT[16] = {\r\n        /* Read Data */\r\n        [0] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xEB, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 24),\r\n        [1] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_4PAD, 6, kFLEXSPI_Command_READ_SDR, kFLEXSPI_4PAD,\r\n                              0x04),\r\n\r\n        /* Write Data */\r\n        [4] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x38, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 24),\r\n        [5] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_4PAD, 0x00, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00),\r\n\r\n        /* Reset Enable */\r\n        [8] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x66, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00),\r\n\r\n        /* Reset */\r\n        [12] = FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x99, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00),\r\n    };\r\n\r\n    flexspi_config_t config;\r\n#if BOARD_ENABLE_PSRAM_CACHE\r\n    cache64_config_t cacheCfg;\r\n#endif\r\n    status_t status         = kStatus_Success;\r\n\r\n    if (!BOARD_IS_XIP()) /* FlexSPI not initialized */\r\n    {\r\n        CLOCK_EnableClock(kCLOCK_Flexspi);\r\n        RESET_ClearPeripheralReset(kFLEXSPI_RST_SHIFT_RSTn);\r\n        BOARD_SetFlexspiClock(FLEXSPI, 5U, 3U); /* 320M / 3 */\r\n\r\n        /* Get FLEXSPI default settings and configure the flexspi. */\r\n        FLEXSPI_GetDefaultConfig(&config);\r\n\r\n        /* Init FLEXSPI. */\r\n        config.rxSampleClock      = kFLEXSPI_ReadSampleClkLoopbackFromDqsPad;\r\n        config.rxSampleClockPortB = kFLEXSPI_ReadSampleClkLoopbackFromDqsPad;\r\n        config.rxSampleClockDiff  = false;\r\n        /*Set AHB buffer size for reading data through AHB bus. */\r\n        config.ahbConfig.enableAHBPrefetch    = true;\r\n        config.ahbConfig.enableAHBBufferable  = true;\r\n        config.ahbConfig.enableAHBCachable    = true;\r\n        config.ahbConfig.enableReadAddressOpt = true;\r\n        for (uint8_t i = 1; i < FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT - 1; i++)\r\n        {\r\n            config.ahbConfig.buffer[i].bufferSize = 0;\r\n        }\r\n        /* FlexSPI has total 1KB RX buffer.\r\n         * Set DMA0 master to use AHB Rx Buffer0.\r\n         */\r\n        config.ahbConfig.buffer[0].masterIndex    = 10;  /* GDMA */\r\n        config.ahbConfig.buffer[0].bufferSize     = 512; /* Allocate 512B bytes for DMA0 */\r\n        config.ahbConfig.buffer[0].enablePrefetch = true;\r\n        config.ahbConfig.buffer[0].priority       = 0;\r\n        /* All other masters use last buffer with 512B bytes. */\r\n        config.ahbConfig.buffer[FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT - 1].bufferSize = 512;\r\n#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_COMBINATIONEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_COMBINATIONEN)\r\n        config.enableCombination = false;\r\n#endif\r\n        FLEXSPI_Init(BOARD_FLEXSPI_PSRAM, &config);\r\n    }\r\n\r\n    /* Configure flash settings according to serial flash feature. */\r\n    FLEXSPI_SetFlashConfig(BOARD_FLEXSPI_PSRAM, &psramConfig, kFLEXSPI_PortB1);\r\n\r\n    /* Update bottom LUT table (44-59). */\r\n    FLEXSPI_UpdateLUT(BOARD_FLEXSPI_PSRAM, 44U, psramLUT, ARRAY_SIZE(psramLUT));\r\n\r\n    /* Do software reset. */\r\n    FLEXSPI_SoftwareReset(BOARD_FLEXSPI_PSRAM);\r\n\r\n    do\r\n    {\r\n        /* Reset PSRAM */\r\n        status = flexspi_hyper_ram_run_seq(BOARD_FLEXSPI_PSRAM, 13U);\r\n        if (status == kStatus_Success)\r\n        {\r\n            status = flexspi_hyper_ram_run_seq(BOARD_FLEXSPI_PSRAM, 14U);\r\n        }\r\n        if (status != kStatus_Success)\r\n        {\r\n            status = kStatus_Fail;\r\n            break;\r\n        }\r\n\r\n#if BOARD_ENABLE_PSRAM_CACHE\r\n        CACHE64_GetDefaultConfig(&cacheCfg);\r\n        /* Suppose:\r\n           Flash on PC bus starting from 0x08000000, controlled by cache 0.\r\n           PSRAM on PS bus starting from 0x28000000, controlled by cache 1.\r\n         */\r\n        CACHE64_Init(CACHE64_POLSEL1, &cacheCfg);\r\n        CACHE64_EnableWriteBuffer(CACHE64_CTRL1, true);\r\n        CACHE64_EnableCache(CACHE64_CTRL1);\r\n#endif\r\n    } while (false);\r\n\r\n    return status;\r\n}\r\n\r\nvoid BOARD_InitSleepPinConfig(void)\r\n{\r\n    int32_t i;\r\n\r\n    /* Set all non-AON pins output low level in sleep mode. */\r\n    for (i = 0; i < 22; i++)\r\n    {\r\n        IO_MUX_SetPinOutLevelInSleep(i, IO_MUX_SleepPinLevelLow);\r\n    }\r\n    for (i = 28; i < 64; i++)\r\n    {\r\n        IO_MUX_SetPinOutLevelInSleep(i, IO_MUX_SleepPinLevelLow);\r\n    }\r\n\r\n    /* Set RF_CNTL 0-3 output low level in sleep mode. */\r\n    for (i = 0; i < 4; i++)\r\n    {\r\n        IO_MUX_SetRfPinOutLevelInSleep(i, IO_MUX_SleepPinLevelLow);\r\n    }\r\n}\r\n\r\nvoid BOARD_DeinitFlash(FLEXSPI_Type *base)\r\n{\r\n    /* Enable FLEXSPI clock again */\r\n    CLKCTL0->PSCCTL0_SET = CLKCTL0_PSCCTL0_SET_FLEXSPI0_MASK;\r\n\r\n    /* Enable FLEXSPI module */\r\n    base->MCR0 &= ~FLEXSPI_MCR0_MDIS_MASK;\r\n\r\n    /* Wait until FLEXSPI is not busy */\r\n    while (!((base->STS0 & FLEXSPI_STS0_ARBIDLE_MASK) && (base->STS0 & FLEXSPI_STS0_SEQIDLE_MASK)))\r\n    {\r\n    }\r\n    /* Disable module during the reset procedure */\r\n    base->MCR0 |= FLEXSPI_MCR0_MDIS_MASK;\r\n}\r\n\r\nvoid BOARD_InitFlash(FLEXSPI_Type *base)\r\n{\r\n    uint32_t status;\r\n    uint32_t lastStatus;\r\n    uint32_t retry;\r\n\r\n    /* Loopback from DQS pad can maximize RD board flash speed. */\r\n    if ((base->MCR0 & FLEXSPI_MCR0_RXCLKSRC_MASK) != FLEXSPI_MCR0_RXCLKSRC(1))\r\n    {\r\n        base->MCR0 = (base->MCR0 & ~FLEXSPI_MCR0_RXCLKSRC_MASK) | FLEXSPI_MCR0_RXCLKSRC(1);\r\n    }\r\n    /* If serial root clock is >= 100 MHz, DLLEN set to 1, OVRDEN set to 0, then SLVDLYTARGET setting of 0x0 is\r\n     * recommended. */\r\n    base->DLLCR[0] = 0x1U;\r\n\r\n    /* Enable FLEXSPI module */\r\n    base->MCR0 &= ~FLEXSPI_MCR0_MDIS_MASK;\r\n\r\n    base->MCR0 |= FLEXSPI_MCR0_SWRESET_MASK;\r\n    while (base->MCR0 & FLEXSPI_MCR0_SWRESET_MASK)\r\n    {\r\n    }\r\n\r\n    /* Need to wait DLL locked if DLL enabled */\r\n    if (0U != (base->DLLCR[0] & FLEXSPI_DLLCR_DLLEN_MASK))\r\n    {\r\n        lastStatus = base->STS2;\r\n        retry      = BOARD_FLEXSPI_DLL_LOCK_RETRY;\r\n        /* Wait slave delay line locked and slave reference delay line locked. */\r\n        do\r\n        {\r\n            status = base->STS2;\r\n            if ((status & (FLEXSPI_STS2_AREFLOCK_MASK | FLEXSPI_STS2_ASLVLOCK_MASK)) ==\r\n                (FLEXSPI_STS2_AREFLOCK_MASK | FLEXSPI_STS2_ASLVLOCK_MASK))\r\n            {\r\n                /* Locked */\r\n                retry = 100;\r\n                break;\r\n            }\r\n            else if (status == lastStatus)\r\n            {\r\n                /* Same delay cell number in calibration */\r\n                retry--;\r\n            }\r\n            else\r\n            {\r\n                retry      = BOARD_FLEXSPI_DLL_LOCK_RETRY;\r\n                lastStatus = status;\r\n            }\r\n        } while (retry > 0);\r\n        /* According to ERR011377, need to delay at least 100 NOPs to ensure the DLL is locked. */\r\n        for (; retry > 0U; retry--)\r\n        {\r\n            __NOP();\r\n        }\r\n    }\r\n}\r\n\r\n/* BOARD_SetFlexspiClock run in RAM used to configure FlexSPI clock source and divider when XIP. */\r\nvoid BOARD_SetFlexspiClock(FLEXSPI_Type *base, uint32_t src, uint32_t divider)\r\n{\r\n    if ((CLKCTL0->FLEXSPIFCLKSEL != CLKCTL0_FLEXSPIFCLKSEL_SEL(src)) ||\r\n        ((CLKCTL0->FLEXSPIFCLKDIV & CLKCTL0_FLEXSPIFCLKDIV_DIV_MASK) != (divider - 1)))\r\n    {\r\n        /* Always deinit FLEXSPI and init FLEXSPI for the flash to make sure the flash works correctly after the\r\n         FLEXSPI root clock changed as the default FLEXSPI configuration may does not work for the new root clock\r\n         frequency. */\r\n        BOARD_DeinitFlash(base);\r\n\r\n        /* Disable clock before changing clock source */\r\n        CLKCTL0->PSCCTL0_CLR = CLKCTL0_PSCCTL0_CLR_FLEXSPI0_MASK;\r\n        /* Update flexspi clock. */\r\n        CLKCTL0->FLEXSPIFCLKSEL = CLKCTL0_FLEXSPIFCLKSEL_SEL(src);\r\n        CLKCTL0->FLEXSPIFCLKDIV |= CLKCTL0_FLEXSPIFCLKDIV_RESET_MASK; /* Reset the divider counter */\r\n        CLKCTL0->FLEXSPIFCLKDIV = CLKCTL0_FLEXSPIFCLKDIV_DIV(divider - 1);\r\n        while ((CLKCTL0->FLEXSPIFCLKDIV) & CLKCTL0_FLEXSPIFCLKDIV_REQFLAG_MASK)\r\n        {\r\n        }\r\n        /* Enable FLEXSPI clock again */\r\n        CLKCTL0->PSCCTL0_SET = CLKCTL0_PSCCTL0_SET_FLEXSPI0_MASK;\r\n\r\n        BOARD_InitFlash(base);\r\n    }\r\n}\r\n\r\nstatic bool LoadGdetCfg(power_gdet_data_t *data)\r\n{\r\n    bool retval = true;\r\n\r\n    /* If T3 256M clock is disabled, GDET cannot work. */\r\n    if ((SYSCTL2->SOURCE_CLK_GATE & SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_256M_CG_MASK) != 0U)\r\n    {\r\n        retval = false;\r\n    }\r\n    else\r\n    {\r\n        /* GDET clock has been characterzed to 64MHz */\r\n        CLKCTL0->ELS_GDET_CLK_SEL = CLKCTL0_ELS_GDET_CLK_SEL_SEL(2);\r\n    }\r\n\r\n    if (retval)\r\n    {\r\n        /* LOAD command */\r\n        MCUX_CSSL_FP_FUNCTION_CALL_BEGIN(result, token, mcuxClEls_GlitchDetector_LoadConfig_Async((uint8_t *)data));\r\n        if ((MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClEls_GlitchDetector_LoadConfig_Async) != token) ||\r\n            (MCUXCLELS_STATUS_OK_WAIT != result))\r\n        {\r\n            retval = false;\r\n        }\r\n        MCUX_CSSL_FP_FUNCTION_CALL_END();\r\n    }\r\n\r\n    if (retval)\r\n    {\r\n        /* Wait for the mcuxClEls_GlitchDetector_LoadConfig_Async operation to complete. */\r\n        MCUX_CSSL_FP_FUNCTION_CALL_BEGIN(result, token, mcuxClEls_WaitForOperation(MCUXCLELS_ERROR_FLAGS_CLEAR));\r\n        if ((MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClEls_WaitForOperation) != token) || (MCUXCLELS_STATUS_OK != result))\r\n        {\r\n            retval = false;\r\n        }\r\n        MCUX_CSSL_FP_FUNCTION_CALL_END();\r\n    }\r\n\r\n    return retval;\r\n}\r\n\r\nstatic void ConfigSvcSensor(void)\r\n{\r\n    uint64_t svc;\r\n    uint32_t pack;\r\n    status_t status;\r\n    power_gdet_data_t gdetData = {0U};\r\n    uint32_t rev = SOCCTRL->CHIP_INFO & SOCCIU_CHIP_INFO_REV_NUM_MASK;\r\n\r\n    status = OCOTP_ReadSVC(&svc);\r\n    if (status == kStatus_Success)\r\n    { /* CES */\r\n        status = OCOTP_ReadPackage(&pack);\r\n        if (status == kStatus_Success)\r\n        {\r\n            /*\r\n               A2 CES: Use SVC voltage.\r\n               A1 CES: Keep boot voltage 1.11V.\r\n             */\r\n            POWER_InitVoltage((rev == 2U) ? ((uint32_t)svc >> 16) : 0U, pack);\r\n        }\r\n\r\n        /* SVC GDET config */\r\n        status = (status == kStatus_Success) ? OCOTP_OtpFuseRead(149, &gdetData.CFG[0]) : status;\r\n        status = (status == kStatus_Success) ? OCOTP_OtpFuseRead(150, &gdetData.CFG[1]) : status;\r\n        status = (status == kStatus_Success) ? OCOTP_OtpFuseRead(151, &gdetData.CFG[2]) : status;\r\n        /* A2 CES load fuse 155 for trim calculation. A1 CES directly use the default trim value in fuse 152. */\r\n        status = (status == kStatus_Success) ? OCOTP_OtpFuseRead((rev == 2U) ? 155 : 152, &gdetData.CFG[3]) : status;\r\n        status = (status == kStatus_Success) ? OCOTP_OtpFuseRead(153, &gdetData.CFG[4]) : status;\r\n        status = (status == kStatus_Success) ? OCOTP_OtpFuseRead(154, &gdetData.CFG[5]) : status;\r\n        assert(status == kStatus_Success);\r\n\r\n        /* Must configure GDET load function for POWER_EnableGDetVSensors(). */\r\n        Power_InitLoadGdetCfg(LoadGdetCfg, &gdetData, pack);\r\n    }\r\n    else\r\n    {\r\n        /* A1/A2 non-CES */\r\n        SystemCoreClockUpdate();\r\n\r\n        /* LPBG trim */\r\n        BUCK11->BUCK_CTRL_EIGHTEEN_REG = 0x6U;\r\n        /* Change buck level */\r\n        PMU->PMIP_BUCK_LVL = PMU_PMIP_BUCK_LVL_SLEEP_BUCK18_SEL(0x60U) |  /* 1.8V */\r\n                             PMU_PMIP_BUCK_LVL_SLEEP_BUCK11_SEL(0x22U) |  /* 0.8V */\r\n                             PMU_PMIP_BUCK_LVL_NORMAL_BUCK18_SEL(0x60U) | /* 1.8V */\r\n                             PMU_PMIP_BUCK_LVL_NORMAL_BUCK11_SEL(0x54U);  /* 1.05V */\r\n        /* Delay 600us */\r\n        SDK_DelayAtLeastUs(600, SystemCoreClock);\r\n    }\r\n}\r\n\r\n/* This function is used to configure static voltage compansation and sensors, and in XIP case, change FlexSPI clock\r\n   to a stable source before clock tree(Such as PLL and Main clock) update */\r\nvoid BOARD_ClockPreConfig(void)\r\n{\r\n    OCOTP_OtpInit();\r\n    ConfigSvcSensor();\r\n    OCOTP_OtpDeinit();\r\n\r\n    if (BOARD_IS_XIP())\r\n    {\r\n        /* Move FLEXSPI clock source to T3 256m / 4 to avoid instruction/data fetch issue in XIP when\r\n         * updating PLL and main clock.\r\n         */\r\n        BOARD_SetFlexspiClock(FLEXSPI, 6U, 4U);\r\n    }\r\n    else\r\n    {\r\n        RESET_ClearPeripheralReset(kFLEXSPI_RST_SHIFT_RSTn);\r\n        BOARD_DeinitFlash(FLEXSPI);\r\n        CLOCK_AttachClk(kNONE_to_FLEXSPI_CLK);\r\n        CLOCK_DisableClock(kCLOCK_Flexspi);\r\n        RESET_SetPeripheralReset(kFLEXSPI_RST_SHIFT_RSTn);\r\n    }\r\n}\r\n\r\n/* Update FlexSPI clock source and set flash to full speed */\r\nvoid BOARD_ClockPostConfig(void)\r\n{\r\n    if (BOARD_IS_XIP())\r\n    {\r\n        /* Call function BOARD_SetFlexspiClock() to set clock source to aux0_pll_clk. */\r\n        BOARD_SetFlexspiClock(FLEXSPI, 2U, 2U);\r\n    }\r\n    else\r\n    {\r\n    }\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/board/board.h",
    "content": "/*\r\n * Copyright 2021-2024 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef _BOARD_H_\r\n#define _BOARD_H_\r\n\r\n#include \"fsl_common.h\"\r\n#include \"fsl_gpio.h\"\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n/*! @brief The board name */\r\n#define BOARD_NAME \"FRDM-RW612\"\r\n\r\n/*! @brief Macro to judge XIP */\r\n#define BOARD_IS_XIP()                                                                                          \\\r\n    ((((uint32_t)BOARD_InitDebugConsole >= 0x08000000U) && ((uint32_t)BOARD_InitDebugConsole < 0x10000000U)) || \\\r\n     (((uint32_t)BOARD_InitDebugConsole >= 0x18000000U) && ((uint32_t)BOARD_InitDebugConsole < 0x20000000U)))\r\n\r\n/*! @brief The UART to use for debug messages. */\r\n#define BOARD_DEBUG_UART_TYPE     kSerialPort_Uart\r\n#define BOARD_DEBUG_UART_BASEADDR (uint32_t) FLEXCOMM3\r\n#define BOARD_DEBUG_UART_INSTANCE 3U\r\n#define BOARD_DEBUG_UART          USART3\r\n#define BOARD_DEBUG_UART_CLK_FREQ CLOCK_GetFlexCommClkFreq(3)\r\n#define BOARD_DEBUG_UART_FRG_CLK \\\r\n    (&(const clock_frg_clk_config_t){3, kCLOCK_FrgPllDiv, 255, 0}) /*!< Select FRG3 mux as frg_pll */\r\n#define BOARD_DEBUG_UART_CLK_ATTACH kFRG_to_FLEXCOMM3\r\n#define BOARD_DEBUG_UART_RST        kFC3_RST_SHIFT_RSTn\r\n#define BOARD_DEBUG_UART_CLKSRC     kCLOCK_Flexcomm3\r\n#define BOARD_UART_IRQ_HANDLER      FLEXCOMM3_IRQHandler\r\n#define BOARD_UART_IRQ              FLEXCOMM3_IRQn\r\n\r\n#ifndef BOARD_DEBUG_UART_BAUDRATE\r\n#define BOARD_DEBUG_UART_BAUDRATE 115200\r\n#endif /* BOARD_DEBUG_UART_BAUDRATE */\r\n\r\n#define BOARD_FLEXSPI_PSRAM FLEXSPI\r\n#ifndef BOARD_ENABLE_PSRAM_CACHE\r\n#define BOARD_ENABLE_PSRAM_CACHE 1\r\n#endif\r\n\r\n/* Board I2C for codec */\r\n#define BOARD_CODEC_I2C_BASEADDR   I2C2\r\n#define BOARD_CODEC_I2C_CLOCK_FREQ CLOCK_GetFlexCommClkFreq(2U)\r\n#define BOARD_CODEC_I2C_INSTANCE   2\r\n#define BOARD_CODEC_I2C_SDA_PORT   0\r\n#define BOARD_CODEC_I2C_SCL_PORT   0\r\n#define BOARD_CODEC_I2C_SDA_PIN    16\r\n#define BOARD_CODEC_I2C_SCL_PIN    17\r\n\r\n/* Board led color mapping */\r\n#define LOGIC_LED_ON  0U\r\n#define LOGIC_LED_OFF 1U\r\n\r\n/* A fake led on GPIO header */\r\n#ifndef BOARD_LED_BLUE_GPIO\r\n#define BOARD_LED_BLUE_GPIO GPIO\r\n#endif\r\n#define BOARD_LED_BLUE_GPIO_PORT 0U\r\n#ifndef BOARD_LED_BLUE_GPIO_PIN\r\n#define BOARD_LED_BLUE_GPIO_PIN 0U\r\n#endif\r\n\r\n#define LED_BLUE_INIT(output)                                                            \\\r\n    GPIO_PinInit(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, BOARD_LED_BLUE_GPIO_PIN, \\\r\n                 &(gpio_pin_config_t){kGPIO_DigitalOutput, (output)}) /*!< Enable target LED_BLUE */\r\n#define LED_BLUE_ON()                                           \\\r\n    GPIO_PortSet(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \\\r\n                 1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn on target LED_BLUE */\r\n#define LED_BLUE_OFF()                                            \\\r\n    GPIO_PortClear(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \\\r\n                   1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Turn off target LED_BLUE */\r\n#define LED_BLUE_TOGGLE()                                          \\\r\n    GPIO_PortToggle(BOARD_LED_BLUE_GPIO, BOARD_LED_BLUE_GPIO_PORT, \\\r\n                    1U << BOARD_LED_BLUE_GPIO_PIN) /*!< Toggle on target LED_BLUE */\r\n\r\n/* Board SW PIN */\r\n#ifndef BOARD_SW2_GPIO\r\n#define BOARD_SW2_GPIO GPIO\r\n#endif\r\n#define BOARD_SW2_GPIO_PORT 0U\r\n#ifndef BOARD_SW2_GPIO_PIN\r\n#define BOARD_SW2_GPIO_PIN 11U\r\n#endif\r\n\r\n#define BOARD_ENET0_PHY_ADDRESS (0x02U)\r\n\r\n/*! @brief The USIM SMARTCARD PHY configuration. */\r\n#define BOARD_SMARTCARD_MODULE                (USIM)      /*!< SMARTCARD communicational module instance */\r\n#define BOARD_SMARTCARD_MODULE_IRQ            (USIM_IRQn) /*!< SMARTCARD communicational module IRQ handler */\r\n#define BOARD_SMARTCARD_CLOCK_MODULE_CLK_FREQ (CLOCK_GetUsimClkFreq())\r\n#define BOARD_SMARTCARD_CLOCK_VALUE           (4000000U)  /*!< SMARTCARD clock frequency (4Mhz) */\r\n#define BOARD_SMARTCARD_IRQ_PORT              (0)\r\n#define BOARD_SMARTCARD_IRQ_PIN               (19)\r\n#define BOARD_SMARTCARD_TS_TIMER_IRQ          (CTIMER0_IRQn)\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif /* __cplusplus */\r\n\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n\r\nvoid BOARD_InitDebugConsole(void);\r\nstatus_t BOARD_InitPsRam(void);\r\nvoid BOARD_InitSleepPinConfig(void);\r\nvoid BOARD_ClockPreConfig(void);\r\nvoid BOARD_ClockPostConfig(void);\r\nAT_QUICKACCESS_SECTION_CODE(void BOARD_SetFlexspiClock(FLEXSPI_Type *base, uint32_t src, uint32_t divider));\r\nAT_QUICKACCESS_SECTION_CODE(void BOARD_DeinitFlash(FLEXSPI_Type *base));\r\nAT_QUICKACCESS_SECTION_CODE(void BOARD_InitFlash(FLEXSPI_Type *base));\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif /* __cplusplus */\r\n\r\n#endif /* _BOARD_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/board/clock_config.c",
    "content": "/*\r\n * Copyright 2024 NXP\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n/***********************************************************************************************************************\r\n * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file\r\n * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.\r\n **********************************************************************************************************************/\r\n/*\r\n * How to set up clock using clock driver functions:\r\n *\r\n * 1. Setup clock sources.\r\n *\r\n * 2. Set up all selectors to provide selected clocks.\r\n *\r\n * 3. Set up all dividers.\r\n */\r\n\r\n/* clang-format off */\r\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\r\n!!GlobalInfo\r\nproduct: Clocks v14.0\r\nprocessor: RW612\r\npackage_id: RW612ETA2I\r\nmcu_data: ksdk2_0\r\nprocessor_version: 0.16.9\r\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\r\n/* clang-format on */\r\n\r\n#include \"fsl_power.h\"\r\n#include \"fsl_clock.h\"\r\n#include \"clock_config.h\"\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n * Variables\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n ************************ BOARD_InitBootClocks function ************************\r\n ******************************************************************************/\r\nvoid BOARD_InitBootClocks(void)\r\n{\r\n    BOARD_BootClockRUN();\r\n}\r\n\r\n/*******************************************************************************\r\n ********************** Configuration BOARD_BootClockRUN ***********************\r\n ******************************************************************************/\r\n/* clang-format off */\r\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\r\n!!Configuration\r\nname: BOARD_BootClockRUN\r\ncalled_from_default_init: true\r\noutputs:\r\n- {id: audio_pll_clk.outFreq, value: 4246732800/345600007 MHz}\r\n- {id: aux0_pll_clk.outFreq, value: 260 MHz}\r\n- {id: avpll_ch1_clkout.outFreq, value: 4246732800/345600007 MHz}\r\n- {id: avpll_ch2_clkout.outFreq, value: 1415577600/22118401 MHz}\r\n- {id: cau_slp_clk.outFreq, value: 4 MHz}\r\n- {id: clk_32k.outFreq, value: 32 kHz}\r\n- {id: clk_pmu_sys.outFreq, value: 52 MHz}\r\n- {id: els_128m_clk.outFreq, value: 128 MHz}\r\n- {id: els_256m_clk.outFreq, value: 256 MHz}\r\n- {id: els_64m_clk.outFreq, value: 64 MHz}\r\n- {id: ffro_clk_div4.outFreq, value: 640/53 MHz}\r\n- {id: hclk.outFreq, value: 260 MHz}\r\n- {id: lposc_clk_i.outFreq, value: 1 MHz}\r\n- {id: main_clk.outFreq, value: 260 MHz}\r\n- {id: main_pll_clk.outFreq, value: 260 MHz}\r\n- {id: otp_fuse_32m_clk.outFreq, value: 32 MHz}\r\n- {id: refclk_phy.outFreq, value: 40 MHz}\r\n- {id: sfro_clk_i.outFreq, value: 16 MHz}\r\n- {id: systick_fclk.outFreq, value: 260 MHz}\r\n- {id: t3pll_mci_256m.outFreq, value: 256 MHz}\r\n- {id: t3pll_mci_48_60m_irc.outFreq, value: 2560/53 MHz}\r\n- {id: tcpu_mci_clk.outFreq, value: 260 MHz}\r\n- {id: tddr_mci_flexspi_clk.outFreq, value: 320 MHz}\r\nsettings:\r\n- {id: CLKCTL0.MAINCLKSELB.sel, value: CLKCTL0.MAINPLLCLKDIV}\r\n- {id: CLKCTL0.MAINPLLCLKDIV.scale, value: '1', locked: true}\r\n- {id: CLKCTL0.PMUFCLKDIV.scale, value: '5', locked: true}\r\n- {id: CLKCTL0.SYSCPUAHBCLKDIV.scale, value: '1', locked: true}\r\n- {id: CLKCTL0.SYSTICKFCLKSEL.sel, value: CLKCTL0.SYSTICKFCLKDIV}\r\n- {id: CLKCTL0.WDT0FCLKSEL.sel, value: NO_CLOCK}\r\n- {id: CLKCTL1.FRGPLLCLKDIV.scale, value: '13', locked: true}\r\n- {id: CLKCTL1.OSEVENTFCLKSEL.sel, value: NO_CLOCK}\r\n- {id: REFCLK_SYS_Config, value: Disabled}\r\n- {id: SYSCTL2.CH1_M.scale, value: '2621440', locked: true}\r\n- {id: SYSCTL2.CH1_OFFSET_DIV.scale, value: '345600007', locked: true}\r\n- {id: SYSCTL2.CH2_M.scale, value: '2621440', locked: true}\r\n- {id: SYSCTL2.CH2_OFFSET_DIV.scale, value: '66355203', locked: true}\r\n- {id: SYSCTL2.T3_FBDIV.scale, value: '64', locked: true}\r\n- {id: SYSCTL2.T3_REFDIV.scale, value: '1', locked: true}\r\n- {id: T3PLL_MCI_213P3M_Config, value: Disabled}\r\n- {id: T3PLL_MCI_FLEXSPI_Config, value: Disabled}\r\n- {id: TCPU_MCI_FLEXSPI_CLK_Config, value: Disabled}\r\n- {id: TDDR_MCI_ENET_CLK_Config, value: Disabled}\r\nsources:\r\n- {id: CAU.XTAL_OSC.outFreq, value: 40 MHz, enabled: true}\r\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\r\n/* clang-format on */\r\n\r\n/*******************************************************************************\r\n * Variables for BOARD_BootClockRUN configuration\r\n ******************************************************************************/\r\nconst clock_avpll_config_t avpllConfig_BOARD_BootClockRUN =\r\n    {\r\n        .ch1Freq = kCLOCK_AvPllChFreq12p288m,     /* AVPLL channel frequency 12.288 MHz */\r\n        .ch2Freq = kCLOCK_AvPllChFreq64m,         /* AVPLL channel frequency 64 MHz */\r\n        .enableCali = true,                       /* AVPLL calibration is enabled */\r\n    };\r\n/*******************************************************************************\r\n * Code for BOARD_BootClockRUN configuration\r\n ******************************************************************************/\r\nvoid BOARD_BootClockRUN(void)\r\n{\r\n    /* Disable GDET and VSensors */\r\n    POWER_DisableGDetVSensors();\r\n    /* Enable CAU sleep clock for PMU */\r\n    if ((PMU->CAU_SLP_CTRL & PMU_CAU_SLP_CTRL_SOC_SLP_RDY_MASK) == 0U)\r\n    {\r\n        /* Enable the CAU sleep clock. */\r\n        CLOCK_EnableClock(kCLOCK_RefClkCauSlp);\r\n    }\r\n    if ((SYSCTL2->SOURCE_CLK_GATE & SYSCTL2_SOURCE_CLK_GATE_REFCLK_SYS_CG_MASK) != 0U)\r\n    {\r\n        /* Enable the REFCLK_SYS clock. */\r\n        CLOCK_EnableClock(kCLOCK_RefClkSys);\r\n    }\r\n    /* Initialize T3 PLL and enable outputs that are not clock gated. */\r\n    CLOCK_InitT3RefClk(kCLOCK_T3MciIrc48m);\r\n    /* Enable FFRO - T3 PLL 48/60 MHz IRC clock output */\r\n    CLOCK_EnableClock(kCLOCK_T3PllMciIrcClk);\r\n    /* Enable T3 PLL 256 MHz clock output */\r\n    CLOCK_EnableClock(kCLOCK_T3PllMci256mClk);\r\n    BOARD_ClockPreConfig();\r\n    /* Set core clock to safe system oscillator clock for initialization of other sources. */\r\n    CLOCK_AttachClk(kSYSOSC_to_MAIN_CLK);\r\n    CLOCK_SetClkDiv(kCLOCK_DivSysCpuAhbClk, 1);\r\n    /* Initialize TCPU PLL and enable outputs that are not clock gated. */\r\n    CLOCK_InitTcpuRefClk(3120000000UL, kCLOCK_TcpuFlexspiDiv10);\r\n    /* Enable TCPU PLL MCI clock output */\r\n    CLOCK_EnableClock(kCLOCK_TcpuMciClk);\r\n    /* Initialize TDDR PLL and enable outputs that are not clock gated. */\r\n    CLOCK_InitTddrRefClk(kCLOCK_TddrFlexspiDiv10);\r\n    /* Enable TDDR PLL FlexSPI clock output */\r\n    CLOCK_EnableClock(kCLOCK_TddrMciFlexspiClk);\r\n    /* Initialize AVPLL and enable both channels. */\r\n    CLOCK_InitAvPll(&avpllConfig_BOARD_BootClockRUN);\r\n    /* Set up clock selectors - Attach clocks to the peripheries */\r\n    CLOCK_AttachClk(kRC32K_to_CLK32K);                 /* Switch CLK32K to RC32K */\r\n    /*!< Please note SYSTICK_CLK source is used only if the SysTick SYST_CSR register CLKSOURCE bit is set to 0. */\r\n    CLOCK_AttachClk(kSYSTICK_DIV_to_SYSTICK_CLK);                 /* Switch SYSTICK_CLK to SYSTICK_DIV */\r\n    /* Set up dividers */\r\n    CLOCK_SetClkDiv(kCLOCK_DivAudioPllClk, 1U);         /* Set .AUDIOPLLCLKDIV divider to value 1 */\r\n    CLOCK_SetClkDiv(kCLOCK_DivPllFrgClk, 13U);         /* Set .FRGPLLCLKDIV divider to value 13 */\r\n    CLOCK_SetClkDiv(kCLOCK_DivMainPllClk, 1U);         /* Set .MAINPLLCLKDIV divider to value 1 */\r\n    CLOCK_SetClkDiv(kCLOCK_DivAux0PllClk, 1U);         /* Set .AUX0PLLCLKDIV divider to value 1 */\r\n    CLOCK_SetClkDiv(kCLOCK_DivSystickClk, 1U);         /* Set .SYSTICKFCLKDIV divider to value 1 */\r\n    CLOCK_SetClkDiv(kCLOCK_DivPmuFclk, 5U);         /* Set .PMUFCLKDIV divider to value 5 */\r\n    /* Select the main clock source for the main system clock (MAINCLKSELA and MAINCLKSELB). */\r\n    CLOCK_AttachClk(kMAIN_PLL_to_MAIN_CLK);\r\n    BOARD_ClockPostConfig();\r\n    /*!< Set SystemCoreClock variable. */\r\n    SystemCoreClock = BOARD_BOOTCLOCKRUN_HCLK;\r\n}\r\n\r\n/*******************************************************************************\r\n ********************** Configuration BOARD_BootClockLPR ***********************\r\n ******************************************************************************/\r\n/* clang-format off */\r\n/* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************\r\n!!Configuration\r\nname: BOARD_BootClockLPR\r\noutputs:\r\n- {id: aux0_pll_clk.outFreq, value: 260 MHz}\r\n- {id: clk_32k.outFreq, value: 32 kHz}\r\n- {id: clk_pmu_sys.outFreq, value: 52 MHz}\r\n- {id: els_128m_clk.outFreq, value: 128 MHz}\r\n- {id: els_256m_clk.outFreq, value: 256 MHz}\r\n- {id: els_64m_clk.outFreq, value: 64 MHz}\r\n- {id: hclk.outFreq, value: 260 MHz}\r\n- {id: main_clk.outFreq, value: 260 MHz}\r\n- {id: main_pll_clk.outFreq, value: 260 MHz}\r\n- {id: otp_fuse_32m_clk.outFreq, value: 32 MHz}\r\n- {id: refclk_phy.outFreq, value: 40 MHz}\r\n- {id: refclk_sys.outFreq, value: 40 MHz}\r\n- {id: sfro_clk_i.outFreq, value: 16 MHz}\r\n- {id: systick_fclk.outFreq, value: 260 MHz}\r\n- {id: t3pll_mci_256m.outFreq, value: 256 MHz}\r\n- {id: tcpu_mci_clk.outFreq, value: 260 MHz}\r\nsettings:\r\n- {id: AVPLL_Init_Config, value: Disabled}\r\n- {id: CAU_SLP_CLK_Config, value: Disabled}\r\n- {id: CLKCTL0.MAINCLKSELB.sel, value: CLKCTL0.MAINPLLCLKDIV}\r\n- {id: CLKCTL0.MAINPLLCLKDIV.scale, value: '1', locked: true}\r\n- {id: CLKCTL0.SYSOSCBYPASS_SEL.sel, value: NO_CLOCK}\r\n- {id: CLKCTL0.SYSTICKFCLKSEL.sel, value: CLKCTL0.SYSTICKFCLKDIV}\r\n- {id: CLKCTL1.CLKOUTSEL1.sel, value: CLKCTL1.CLKOUTSEL0}\r\n- {id: CLKCTL1.CLKOUTSEL2.sel, value: CLKCTL1.CLKOUTSEL1}\r\n- {id: CLKCTL1.FRGPLLCLKDIV.scale, value: '13', locked: true}\r\n- {id: SYSCTL2.T3_FBDIV.scale, value: '64'}\r\n- {id: SYSCTL2.TCPU_FBDIV.scale, value: '78', locked: true}\r\n- {id: SYSCTL2.TCPU_MCI_FLEXSPI_CLK_DIV.scale, value: '10', locked: true}\r\n- {id: SYSCTL2.TCPU_REFDIV.scale, value: '1', locked: true}\r\n- {id: T3PLL_MCI_213P3M_Config, value: Disabled}\r\n- {id: T3PLL_MCI_48_60M_IRC_Config, value: Disabled}\r\n- {id: T3PLL_MCI_FLEXSPI_Config, value: Disabled}\r\n- {id: TCPU_MCI_FLEXSPI_CLK_Config, value: Disabled}\r\n- {id: TDDR_MCI_ENET_CLK_Config, value: Disabled}\r\n- {id: TDDR_MCI_FLEXSPI_CLK_Config, value: Disabled}\r\n- {id: TDDR_PLL_Init_Config, value: Disabled}\r\nsources:\r\n- {id: CAU.XTAL_OSC.outFreq, value: 40 MHz, enabled: true}\r\n * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/\r\n/* clang-format on */\r\n\r\n/*******************************************************************************\r\n * Variables for BOARD_BootClockLPR configuration\r\n ******************************************************************************/\r\n/*******************************************************************************\r\n * Code for BOARD_BootClockLPR configuration\r\n ******************************************************************************/\r\nvoid BOARD_BootClockLPR(void)\r\n{\r\n    /* Disable GDET and VSensors */\r\n    POWER_DisableGDetVSensors();\r\n    /* Enable CAU sleep clock for PMU */\r\n    if ((PMU->CAU_SLP_CTRL & PMU_CAU_SLP_CTRL_SOC_SLP_RDY_MASK) == 0U)\r\n    {\r\n        /* Enable the CAU sleep clock. */\r\n        CLOCK_EnableClock(kCLOCK_RefClkCauSlp);\r\n    }\r\n    if ((SYSCTL2->SOURCE_CLK_GATE & SYSCTL2_SOURCE_CLK_GATE_REFCLK_SYS_CG_MASK) != 0U)\r\n    {\r\n        /* Enable the REFCLK_SYS clock. */\r\n        CLOCK_EnableClock(kCLOCK_RefClkSys);\r\n    }\r\n    /* Initialize T3 PLL and enable outputs that are not clock gated. */\r\n    CLOCK_InitT3RefClk(kCLOCK_T3MciIrc48m);\r\n    /* Enable T3 PLL 256 MHz clock output */\r\n    CLOCK_EnableClock(kCLOCK_T3PllMci256mClk);\r\n    BOARD_ClockPreConfig();\r\n    /* Set core clock to safe system oscillator clock for initialization of other sources. */\r\n    CLOCK_AttachClk(kSYSOSC_to_MAIN_CLK);\r\n    CLOCK_SetClkDiv(kCLOCK_DivSysCpuAhbClk, 1);\r\n    /* Initialize TCPU PLL and enable outputs that are not clock gated. */\r\n    CLOCK_InitTcpuRefClk(3120000000UL, kCLOCK_TcpuFlexspiDiv10);\r\n    /* Enable TCPU PLL MCI clock output */\r\n    CLOCK_EnableClock(kCLOCK_TcpuMciClk);\r\n    /* Set up clock selectors - Attach clocks to the peripheries */\r\n    CLOCK_AttachClk(kRC32K_to_CLK32K);                 /* Switch CLK32K to RC32K */\r\n    /*!< Please note SYSTICK_CLK source is used only if the SysTick SYST_CSR register CLKSOURCE bit is set to 0. */\r\n    CLOCK_AttachClk(kSYSTICK_DIV_to_SYSTICK_CLK);                 /* Switch SYSTICK_CLK to SYSTICK_DIV */\r\n    /* Set up dividers */\r\n    CLOCK_SetClkDiv(kCLOCK_DivPllFrgClk, 13U);         /* Set .FRGPLLCLKDIV divider to value 13 */\r\n    CLOCK_SetClkDiv(kCLOCK_DivMainPllClk, 1U);         /* Set .MAINPLLCLKDIV divider to value 1 */\r\n    CLOCK_SetClkDiv(kCLOCK_DivAux0PllClk, 1U);         /* Set .AUX0PLLCLKDIV divider to value 1 */\r\n    CLOCK_SetClkDiv(kCLOCK_DivSystickClk, 1U);         /* Set .SYSTICKFCLKDIV divider to value 1 */\r\n    CLOCK_SetClkDiv(kCLOCK_DivPmuFclk, 5U);         /* Set .PMUFCLKDIV divider to value 5 */\r\n    /* Select the main clock source for the main system clock (MAINCLKSELA and MAINCLKSELB). */\r\n    CLOCK_AttachClk(kMAIN_PLL_to_MAIN_CLK);\r\n    /* Deinitialization of the AVPLL. */\r\n    CLOCK_DeinitAvPll();\r\n    /* Deinitialize TDDR PLL. */\r\n    CLOCK_DeinitTddrRefClk();\r\n    BOARD_ClockPostConfig();\r\n    /*!< Set SystemCoreClock variable. */\r\n    SystemCoreClock = BOARD_BOOTCLOCKLPR_HCLK;\r\n}\r\n\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/board/clock_config.h",
    "content": "/*\r\n * Copyright 2024 NXP\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef _CLOCK_CONFIG_H_\r\n#define _CLOCK_CONFIG_H_\r\n\r\n#include \"fsl_common.h\"\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n ************************ BOARD_InitBootClocks function ************************\r\n ******************************************************************************/\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif /* __cplusplus*/\r\n\r\n/*!\r\n * @brief This function executes default configuration of clocks.\r\n *\r\n */\r\nvoid BOARD_InitBootClocks(void);\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif /* __cplusplus*/\r\n\r\n/*******************************************************************************\r\n ********************** Configuration BOARD_BootClockRUN ***********************\r\n ******************************************************************************/\r\n/*******************************************************************************\r\n * Definitions for BOARD_BootClockRUN configuration\r\n ******************************************************************************/\r\n\r\n/* Clock outputs (values are in Hz): */\r\n#define BOARD_BOOTCLOCKRUN_AUDIO_PLL_CLK              12287999UL     /* Clock consumers of audio_pll_clk output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_AUX0_PLL_CLK               260000000UL    /* Clock consumers of aux0_pll_clk output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_AUX1_PLL_CLK               0UL            /* Clock consumers of aux1_pll_clk output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_AVPLL_CH1_CLKOUT           12287999UL     /* Clock consumers of avpll_ch1_clkout output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_AVPLL_CH2_CLKOUT           63999997UL     /* Clock consumers of avpll_ch2_clkout output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_CAU_SLP_CLK                4000000UL      /* Clock consumers of cau_slp_clk output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_CLK_32K                    32000UL        /* Clock consumers of clk_32k output : RTC */\r\n#define BOARD_BOOTCLOCKRUN_CLK_OUT                    0UL            /* Clock consumers of clk_out output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_CLK_PMU_SYS                52000000UL     /* Clock consumers of clk_pmu_sys output : PMU */\r\n#define BOARD_BOOTCLOCKRUN_CTIMER0_FCLK               0UL            /* Clock consumers of ctimer0_fclk output : CTIMER0 */\r\n#define BOARD_BOOTCLOCKRUN_CTIMER1_FCLK               0UL            /* Clock consumers of ctimer1_fclk output : CTIMER1 */\r\n#define BOARD_BOOTCLOCKRUN_CTIMER2_FCLK               0UL            /* Clock consumers of ctimer2_fclk output : CTIMER2 */\r\n#define BOARD_BOOTCLOCKRUN_CTIMER3_FCLK               0UL            /* Clock consumers of ctimer3_fclk output : CTIMER3 */\r\n#define BOARD_BOOTCLOCKRUN_DMIC_FCLK                  0UL            /* Clock consumers of dmic_fclk output : DMIC0 */\r\n#define BOARD_BOOTCLOCKRUN_ELS_128M_CLK               128000000UL    /* Clock consumers of els_128m_clk output : ELS */\r\n#define BOARD_BOOTCLOCKRUN_ELS_256M_CLK               256000000UL    /* Clock consumers of els_256m_clk output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_ELS_64M_CLK                64000000UL     /* Clock consumers of els_64m_clk output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_ELS_FCLK                   0UL            /* Clock consumers of els_fclk output : ELS */\r\n#define BOARD_BOOTCLOCKRUN_FFRO_CLK_DIV4              12075471UL     /* Clock consumers of ffro_clk_div4 output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_FLEXCOMM0_FCLK             0UL            /* Clock consumers of flexcomm0_fclk output : FLEXCOMM0 */\r\n#define BOARD_BOOTCLOCKRUN_FLEXCOMM14_FCLK            0UL            /* Clock consumers of flexcomm14_fclk output : FLEXCOMM14 */\r\n#define BOARD_BOOTCLOCKRUN_FLEXCOMM1_FCLK             0UL            /* Clock consumers of flexcomm1_fclk output : FLEXCOMM1 */\r\n#define BOARD_BOOTCLOCKRUN_FLEXCOMM2_FCLK             0UL            /* Clock consumers of flexcomm2_fclk output : FLEXCOMM2 */\r\n#define BOARD_BOOTCLOCKRUN_FLEXCOMM3_FCLK             0UL            /* Clock consumers of flexcomm3_fclk output : FLEXCOMM3 */\r\n#define BOARD_BOOTCLOCKRUN_FLEXSPI_FCLK               0UL            /* Clock consumers of flexspi_fclk output : FLEXSPI */\r\n#define BOARD_BOOTCLOCKRUN_GAU_FCLK                   0UL            /* Clock consumers of gau_fclk output : GAU_ACOMP, GAU_BG, GAU_DAC0, GAU_GPADC0, GAU_GPADC1 */\r\n#define BOARD_BOOTCLOCKRUN_HCLK                       260000000UL    /* Clock consumers of hclk output : AHB_SECURE_CTRL, APU0, APU1, BLEAPU, BLECTRL, BUCK11, BUCK18, CACHE64_CTRL0, CACHE64_CTRL1, CACHE64_POLSEL0, CACHE64_POLSEL1, CAU, CDOG, CLKCTL0, CLKCTL1, CRC, CTIMER0, CTIMER1, CTIMER2, CTIMER3, DMA0, DMA1, DMIC0, ELS, ENET, FLEXCOMM0, FLEXCOMM1, FLEXCOMM14, FLEXCOMM2, FLEXCOMM3, FLEXSPI, FREQME, GAU_ACOMP, GAU_BG, GAU_DAC0, GAU_GPADC0, GAU_GPADC1, GDMA, GPIO, INPUTMUX, ITRC, LCDIC, MCI_IO_MUX, MRT0, MRT1, OCOTP, OSTIMER, PINT, PKC, PMU, POWERQUAD, PUF, ROMCP, RSTCTL0, RSTCTL1, RTC, SCT0, SDU_FBR_CARD, SDU_FN0_CARD, SDU_FN_CARD, SECGPIO, SENSOR_CTRL, SOCCTRL, SOC_OTP_CTRL, SYSCTL0, SYSCTL1, SYSCTL2, SysTick, TRNG, USBOTG, USIM, UTICK, WLAPU, WLCTRL, WWDT0 */\r\n#define BOARD_BOOTCLOCKRUN_LCD_FCLK                   0UL            /* Clock consumers of lcd_fclk output : LCDIC */\r\n#define BOARD_BOOTCLOCKRUN_LPOSC_CLK_I                1000000UL      /* Clock consumers of lposc_clk_i output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_MAIN_CLK                   260000000UL    /* Clock consumers of main_clk output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_MAIN_PLL_CLK               260000000UL    /* Clock consumers of main_pll_clk output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_MCLK_OUT                   0UL            /* Clock consumers of mclk_out output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_OSEVENT_FCLK               0UL            /* Clock consumers of osevent_fclk output : OSTIMER */\r\n#define BOARD_BOOTCLOCKRUN_OTP_FUSE_32M_CLK           32000000UL     /* Clock consumers of otp_fuse_32m_clk output : OCOTP */\r\n#define BOARD_BOOTCLOCKRUN_REFCLK_PHY                 40000000UL     /* Clock consumers of refclk_phy output : USBOTG */\r\n#define BOARD_BOOTCLOCKRUN_REFCLK_SYS                 0UL            /* Clock consumers of refclk_sys output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_SCT_FCLK                   0UL            /* Clock consumers of sct_fclk output : SCT0 */\r\n#define BOARD_BOOTCLOCKRUN_SFRO_CLK_I                 16000000UL     /* Clock consumers of sfro_clk_i output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_SYSOSC_CLK_I               0UL            /* Clock consumers of sysosc_clk_i output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_SYSTICK_FCLK               260000000UL    /* Clock consumers of systick_fclk output : SysTick */\r\n#define BOARD_BOOTCLOCKRUN_T3PLL_MCI_213P3M           0UL            /* Clock consumers of t3pll_mci_213p3m output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_T3PLL_MCI_256M             256000000UL    /* Clock consumers of t3pll_mci_256m output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_T3PLL_MCI_48_60M_IRC       48301886UL     /* Clock consumers of t3pll_mci_48_60m_irc output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_T3PLL_MCI_FLEXSPI_CLK      0UL            /* Clock consumers of t3pll_mci_flexspi_clk output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_TCPU_MCI_CLK               260000000UL    /* Clock consumers of tcpu_mci_clk output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_TCPU_MCI_FLEXSPI_CLK       0UL            /* Clock consumers of tcpu_mci_flexspi_clk output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_TDDR_MCI_ENET_CLK          0UL            /* Clock consumers of tddr_mci_enet_clk output : ENET */\r\n#define BOARD_BOOTCLOCKRUN_TDDR_MCI_FLEXSPI_CLK       320000000UL    /* Clock consumers of tddr_mci_flexspi_clk output : N/A */\r\n#define BOARD_BOOTCLOCKRUN_USIM_FCLK                  0UL            /* Clock consumers of usim_fclk output : USIM */\r\n#define BOARD_BOOTCLOCKRUN_UTICK_FCLK                 0UL            /* Clock consumers of utick_fclk output : UTICK */\r\n#define BOARD_BOOTCLOCKRUN_WDT0_FCLK                  0UL            /* Clock consumers of wdt0_fclk output : WWDT0 */\r\n\r\n/*! @brief AVPLL set for BOARD_BootClockRUN configuration.\r\n */\r\nextern const clock_avpll_config_t avpllConfig_BOARD_BootClockRUN;\r\n/*! @brief Clock pre-initialization function.\r\n */\r\nextern void BOARD_ClockPreConfig(void);\r\n/*! @brief Clock post-initialization function.\r\n */\r\nextern void BOARD_ClockPostConfig(void);\r\n/*******************************************************************************\r\n * API for BOARD_BootClockRUN configuration\r\n ******************************************************************************/\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif /* __cplusplus*/\r\n\r\n/*!\r\n * @brief This function executes configuration of clocks.\r\n *\r\n */\r\nvoid BOARD_BootClockRUN(void);\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif /* __cplusplus*/\r\n\r\n/*******************************************************************************\r\n ********************** Configuration BOARD_BootClockLPR ***********************\r\n ******************************************************************************/\r\n/*******************************************************************************\r\n * Definitions for BOARD_BootClockLPR configuration\r\n ******************************************************************************/\r\n\r\n/* Clock outputs (values are in Hz): */\r\n#define BOARD_BOOTCLOCKLPR_AUDIO_PLL_CLK              0UL            /* Clock consumers of audio_pll_clk output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_AUX0_PLL_CLK               260000000UL    /* Clock consumers of aux0_pll_clk output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_AUX1_PLL_CLK               0UL            /* Clock consumers of aux1_pll_clk output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_AVPLL_CH1_CLKOUT           0UL            /* Clock consumers of avpll_ch1_clkout output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_AVPLL_CH2_CLKOUT           0UL            /* Clock consumers of avpll_ch2_clkout output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_CAU_SLP_CLK                0UL            /* Clock consumers of cau_slp_clk output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_CLK_32K                    32000UL        /* Clock consumers of clk_32k output : RTC */\r\n#define BOARD_BOOTCLOCKLPR_CLK_OUT                    0UL            /* Clock consumers of clk_out output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_CLK_PMU_SYS                52000000UL     /* Clock consumers of clk_pmu_sys output : PMU */\r\n#define BOARD_BOOTCLOCKLPR_CTIMER0_FCLK               0UL            /* Clock consumers of ctimer0_fclk output : CTIMER0 */\r\n#define BOARD_BOOTCLOCKLPR_CTIMER1_FCLK               0UL            /* Clock consumers of ctimer1_fclk output : CTIMER1 */\r\n#define BOARD_BOOTCLOCKLPR_CTIMER2_FCLK               0UL            /* Clock consumers of ctimer2_fclk output : CTIMER2 */\r\n#define BOARD_BOOTCLOCKLPR_CTIMER3_FCLK               0UL            /* Clock consumers of ctimer3_fclk output : CTIMER3 */\r\n#define BOARD_BOOTCLOCKLPR_DMIC_FCLK                  0UL            /* Clock consumers of dmic_fclk output : DMIC0 */\r\n#define BOARD_BOOTCLOCKLPR_ELS_128M_CLK               128000000UL    /* Clock consumers of els_128m_clk output : ELS */\r\n#define BOARD_BOOTCLOCKLPR_ELS_256M_CLK               256000000UL    /* Clock consumers of els_256m_clk output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_ELS_64M_CLK                64000000UL     /* Clock consumers of els_64m_clk output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_ELS_FCLK                   0UL            /* Clock consumers of els_fclk output : ELS */\r\n#define BOARD_BOOTCLOCKLPR_FFRO_CLK_DIV4              0UL            /* Clock consumers of ffro_clk_div4 output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_FLEXCOMM0_FCLK             0UL            /* Clock consumers of flexcomm0_fclk output : FLEXCOMM0 */\r\n#define BOARD_BOOTCLOCKLPR_FLEXCOMM14_FCLK            0UL            /* Clock consumers of flexcomm14_fclk output : FLEXCOMM14 */\r\n#define BOARD_BOOTCLOCKLPR_FLEXCOMM1_FCLK             0UL            /* Clock consumers of flexcomm1_fclk output : FLEXCOMM1 */\r\n#define BOARD_BOOTCLOCKLPR_FLEXCOMM2_FCLK             0UL            /* Clock consumers of flexcomm2_fclk output : FLEXCOMM2 */\r\n#define BOARD_BOOTCLOCKLPR_FLEXCOMM3_FCLK             0UL            /* Clock consumers of flexcomm3_fclk output : FLEXCOMM3 */\r\n#define BOARD_BOOTCLOCKLPR_FLEXSPI_FCLK               0UL            /* Clock consumers of flexspi_fclk output : FLEXSPI */\r\n#define BOARD_BOOTCLOCKLPR_GAU_FCLK                   0UL            /* Clock consumers of gau_fclk output : GAU_ACOMP, GAU_BG, GAU_DAC0, GAU_GPADC0, GAU_GPADC1 */\r\n#define BOARD_BOOTCLOCKLPR_HCLK                       260000000UL    /* Clock consumers of hclk output : AHB_SECURE_CTRL, APU0, APU1, BLEAPU, BLECTRL, BUCK11, BUCK18, CACHE64_CTRL0, CACHE64_CTRL1, CACHE64_POLSEL0, CACHE64_POLSEL1, CAU, CDOG, CLKCTL0, CLKCTL1, CRC, CTIMER0, CTIMER1, CTIMER2, CTIMER3, DMA0, DMA1, DMIC0, ELS, ENET, FLEXCOMM0, FLEXCOMM1, FLEXCOMM14, FLEXCOMM2, FLEXCOMM3, FLEXSPI, FREQME, GAU_ACOMP, GAU_BG, GAU_DAC0, GAU_GPADC0, GAU_GPADC1, GDMA, GPIO, INPUTMUX, ITRC, LCDIC, MCI_IO_MUX, MRT0, MRT1, OCOTP, OSTIMER, PINT, PKC, PMU, POWERQUAD, PUF, ROMCP, RSTCTL0, RSTCTL1, RTC, SCT0, SDU_FBR_CARD, SDU_FN0_CARD, SDU_FN_CARD, SECGPIO, SENSOR_CTRL, SOCCTRL, SOC_OTP_CTRL, SYSCTL0, SYSCTL1, SYSCTL2, SysTick, TRNG, USBOTG, USIM, UTICK, WLAPU, WLCTRL, WWDT0 */\r\n#define BOARD_BOOTCLOCKLPR_LCD_FCLK                   0UL            /* Clock consumers of lcd_fclk output : LCDIC */\r\n#define BOARD_BOOTCLOCKLPR_LPOSC_CLK_I                0UL            /* Clock consumers of lposc_clk_i output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_MAIN_CLK                   260000000UL    /* Clock consumers of main_clk output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_MAIN_PLL_CLK               260000000UL    /* Clock consumers of main_pll_clk output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_MCLK_OUT                   0UL            /* Clock consumers of mclk_out output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_OSEVENT_FCLK               0UL            /* Clock consumers of osevent_fclk output : OSTIMER */\r\n#define BOARD_BOOTCLOCKLPR_OTP_FUSE_32M_CLK           32000000UL     /* Clock consumers of otp_fuse_32m_clk output : OCOTP */\r\n#define BOARD_BOOTCLOCKLPR_REFCLK_PHY                 40000000UL     /* Clock consumers of refclk_phy output : USBOTG */\r\n#define BOARD_BOOTCLOCKLPR_REFCLK_SYS                 40000000UL     /* Clock consumers of refclk_sys output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_SCT_FCLK                   0UL            /* Clock consumers of sct_fclk output : SCT0 */\r\n#define BOARD_BOOTCLOCKLPR_SFRO_CLK_I                 16000000UL     /* Clock consumers of sfro_clk_i output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_SYSOSC_CLK_I               0UL            /* Clock consumers of sysosc_clk_i output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_SYSTICK_FCLK               260000000UL    /* Clock consumers of systick_fclk output : SysTick */\r\n#define BOARD_BOOTCLOCKLPR_T3PLL_MCI_213P3M           0UL            /* Clock consumers of t3pll_mci_213p3m output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_T3PLL_MCI_256M             256000000UL    /* Clock consumers of t3pll_mci_256m output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_T3PLL_MCI_48_60M_IRC       0UL            /* Clock consumers of t3pll_mci_48_60m_irc output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_T3PLL_MCI_FLEXSPI_CLK      0UL            /* Clock consumers of t3pll_mci_flexspi_clk output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_TCPU_MCI_CLK               260000000UL    /* Clock consumers of tcpu_mci_clk output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_TCPU_MCI_FLEXSPI_CLK       0UL            /* Clock consumers of tcpu_mci_flexspi_clk output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_TDDR_MCI_ENET_CLK          0UL            /* Clock consumers of tddr_mci_enet_clk output : ENET */\r\n#define BOARD_BOOTCLOCKLPR_TDDR_MCI_FLEXSPI_CLK       0UL            /* Clock consumers of tddr_mci_flexspi_clk output : N/A */\r\n#define BOARD_BOOTCLOCKLPR_USIM_FCLK                  0UL            /* Clock consumers of usim_fclk output : USIM */\r\n#define BOARD_BOOTCLOCKLPR_UTICK_FCLK                 0UL            /* Clock consumers of utick_fclk output : UTICK */\r\n#define BOARD_BOOTCLOCKLPR_WDT0_FCLK                  0UL            /* Clock consumers of wdt0_fclk output : WWDT0 */\r\n\r\n/*******************************************************************************\r\n * API for BOARD_BootClockLPR configuration\r\n ******************************************************************************/\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif /* __cplusplus*/\r\n\r\n/*!\r\n * @brief This function executes configuration of clocks.\r\n *\r\n */\r\nvoid BOARD_BootClockLPR(void);\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif /* __cplusplus*/\r\n\r\n#endif /* _CLOCK_CONFIG_H_ */\r\n\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/board/pin_mux.c",
    "content": "/*\r\n * Copyright 2021 NXP.\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include \"fsl_common.h\"\r\n#include \"pin_mux.h\"\r\n#include \"fsl_io_mux.h\"\r\n\r\n/* FUNCTION ************************************************************************************************************\r\n *\r\n * Function Name : BOARD_InitBootPins\r\n * Description   : Calls initialization functions.\r\n *\r\n * END ****************************************************************************************************************/\r\nvoid BOARD_InitBootPins(void)\r\n{\r\n    BOARD_InitPins();\r\n}\r\n\r\n/* FUNCTION ************************************************************************************************************\r\n *\r\n * Function Name : BOARD_InitPins\r\n * Description   : Configures pin routing and optionally pin electrical features.\r\n *\r\n * END ****************************************************************************************************************/\r\nvoid BOARD_InitPins(void) {                                /*!< Function assigned for the core: Cortex-M33[cm33] */\r\n    IO_MUX_SetPinMux(IO_MUX_FC3_USART_DATA);\r\n    IO_MUX_SetPinMux(IO_MUX_GPIO11);\r\n}\r\n\r\n/***********************************************************************************************************************\r\n * EOF\r\n **********************************************************************************************************************/\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/board/pin_mux.h",
    "content": "/*\r\n * Copyright 2021 NXP.\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef _PIN_MUX_H_\r\n#define _PIN_MUX_H_\r\n\r\n\r\n/***********************************************************************************************************************\r\n * Definitions\r\n **********************************************************************************************************************/\r\n\r\n/*!\r\n * @addtogroup pin_mux\r\n * @{\r\n */\r\n\r\n/***********************************************************************************************************************\r\n * API\r\n **********************************************************************************************************************/\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif\r\n\r\n\r\n/*!\r\n * @brief Calls initialization functions.\r\n *\r\n */\r\nvoid BOARD_InitBootPins(void);\r\n\r\n/*!\r\n * @brief Configures pin routing and optionally pin electrical features.\r\n *\r\n */\r\nvoid BOARD_InitPins(void);                                 /*!< Function assigned for the core: Cortex-M4[cm4] */\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */\r\n#endif /* _PIN_MUX_H_ */\r\n\r\n/***********************************************************************************************************************\r\n * EOF\r\n **********************************************************************************************************************/\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/conn_fwloader/fsl_loader.c",
    "content": "/*\r\n * Copyright 2020-2021,2024 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n *\r\n */\r\n#ifndef TFM_PARTITION_LOADER_SERVICE\r\n#include \"fsl_loader_utils.h\"\r\n\r\n//! @addtogroup sbloader\r\n//! @{\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n * Prototype\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n * Variables\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n * Codes\r\n ******************************************************************************/\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief fw download\r\n////////////////////////////////////////////////////////////////////////////\r\nstatus_t sb3_fw_download(LOAD_Target_Type loadTarget, uint32_t flag, uint32_t sourceAddr)\r\n{\r\n    return sb3_fw_download_impl(loadTarget,flag,sourceAddr);\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief fw reset\r\n////////////////////////////////////////////////////////////////////////////\r\nstatus_t sb3_fw_reset(LOAD_Target_Type loadTarget, uint32_t flag, uint32_t sourceAddr)\r\n{\r\n    return sb3_fw_reset_impl(loadTarget, flag, sourceAddr);\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief power on device\r\n////////////////////////////////////////////////////////////////////////////\r\nvoid power_on_device(LOAD_Target_Type loadTarget)\r\n{\r\n    power_on_device_impl(loadTarget);\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief power off device\r\n////////////////////////////////////////////////////////////////////////////\r\nvoid power_off_device(LOAD_Target_Type loadTarget)\r\n{\r\n    power_off_device_impl(loadTarget);\r\n}\r\n//! @}\r\n////////////////////////////////////////////////////////////////////////////\r\n// EOF\r\n////////////////////////////////////////////////////////////////////////////\r\n#endif /* TFM_PARTITION_LOADER_SERVICE */"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/conn_fwloader/fsl_loader_utils.c",
    "content": "/*\r\n * Copyright 2024 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n *\r\n */\r\n\r\n#include <stdint.h>\r\n#include <stdio.h>\r\n#include <string.h>\r\n#include \"fsl_loader_utils.h\"\r\n#include \"api_tree_root.h\"\r\n#include \"fsl_power.h\"\r\n#ifndef __ZEPHYR__\r\n#include \"board.h\"\r\n#include \"fsl_debug_console.h\"\r\n#else\r\n#include \"fsl_clock.h\"\r\n#endif\r\n\r\n#ifdef MCUBOOT_APPLICATION\r\n#include \"mcuboot_app_support.h\"\r\n#endif\r\n\r\n#include \"mflash_drv.h\"\r\n\r\n#if defined(MBEDTLS_THREADING_C) && defined(MBEDTLS_THREADING_ALT)\r\n#if defined(PSA_CRYPTO_DRIVER_THREAD_EN)\r\n#include \"mcux_psa_els_pkc_common_init.h\"\r\n#else\r\n#include \"els_pkc_mbedtls.h\"\r\n#endif /* defined(PSA_CRYPTO_DRIVER_THREAD_EN) */\r\n#endif /* defined(MBEDTLS_THREADING_C) && defined(MBEDTLS_THREADING_ALT) */\r\n\r\n//! @addtogroup sbloader\r\n//! @{\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n#if 0\r\n#define SBLOADER_PRINTF(...)     \\\r\n    do                           \\\r\n    {                            \\\r\n        PLOG_DEBUG(__VA_ARGS__); \\\r\n    } while (0)\r\n#else\r\n#define SBLOADER_PRINTF(...)\r\n#endif\r\n\r\n/*!\r\n * @brief load cpu1/cpu2 firmware.\r\n */\r\n#define CIU_RST_SW2                (0x41240184U)\r\n#define CIU_RST_SW2_CPU1_RST_MASK  (0x40000000U)\r\n#define CIU2_RST_SW3               (0x4424011cU)\r\n#define CIU2_RST_SW3_CPU2_RST_MASK (0x00000010U)\r\n\r\n#define IMU_SYNC_MAGIC_PATTERN  (0xABCDEF89U)\r\n#define CPU1_MAGIC_PATTERN_ADDR (0x41380000U)\r\n#define CPU2_MAGIC_PATTERN_ADDR (0x443c0000U)\r\n\r\n#define SOCCTRL_CHIP_INFO_REV_NUM_MASK (0xFU)\r\n\r\n\r\n#define CLKCTL0_PSCCTL1_OTP_MASK  (0x20000U)\r\n#define RSTCTL0_PRSTCTL1_OTP_MASK (0x20000U)\r\n\r\n#define STAGING_BUF_SZ 256u\r\ntypedef struct sb3_desc {\r\n    uint32_t fmt;\r\n    uint32_t sub_fmt;\r\n    uint32_t dst_addr;\r\n    uint32_t area_sz;\r\n} sb3_load_desc_t;\r\n\r\n/*******************************************************************************\r\n * Prototype\r\n ******************************************************************************/\r\nstatic status_t ldr_DoHeader_v3(fsl_api_core_context_t *ctx);\r\nstatic status_t ldr_DoDataRead(fsl_api_core_context_t *ctx);\r\nstatic status_t ldr_DoBlock(fsl_api_core_context_t *ctx);\r\nstatic status_t ldr_DoLoadCmd(fsl_api_core_context_t *ctx);\r\nstatic status_t ldr_DoExecuteCmd(fsl_api_core_context_t *ctx);\r\nstatic status_t ldr_ReadFromFlash(uint8_t * buf, uint32_t src_flash_offset, size_t read_sz);\r\n\r\nstatic status_t load_service_monolithic(LOAD_Target_Type loadTarget, uint32_t sourceAddr);\r\n\r\n/*******************************************************************************\r\n * Variables\r\n ******************************************************************************/\r\n/*! @brief nboot library context. */\r\nstatic fsl_api_core_context_t s_fsl_api_core_context = {0};\r\nstatic fsl_ldr_Context_v3_t s_sbloader_context;\r\nstatic uint8_t packetBuf[512]  = {0};\r\nstatic fsl_nboot_context_t g_nbootCtx = {0};\r\n#ifdef CONFIG_FW_VDLLV2\r\nstatic uint32_t vdll_image_base = 0;\r\n#endif\r\n\r\nstatic bootloader_tree_v0_t *g_bootloaderTree_v0;\r\nstatic bootloader_tree_v1_t *g_bootloaderTree_v1;\r\n\r\n/*******************************************************************************\r\n * Codes\r\n ******************************************************************************/\r\n__attribute__((__noinline__))\r\nstatic void sb3_Delay(uint32_t loop)\r\n{\r\n    if (loop > 0U)\r\n    {\r\n        __ASM volatile(\r\n            \"1:                             \\n\"\r\n            \"    SUBS   %0, %0, #1          \\n\"\r\n            \"    CMP    %0, #0              \\n\"\r\n            \"    BNE    1b                  \\n\"\r\n            :\r\n            : \"r\"(loop));\r\n    }\r\n}\r\n\r\nstatic void sb3_DelayUs(uint32_t us)\r\n{\r\n    uint32_t instNum;\r\n\r\n    instNum = ((SystemCoreClock + 999999UL) / 1000000UL) * us;\r\n    sb3_Delay((instNum + 2U) / 3U);\r\n}\r\n\r\nstatic uint32_t _ActiveApplicationRemapOffset(void)\r\n{\r\n    return (MFLASH_FLEXSPI->HADDROFFSET);\r\n}\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief power on device implementation\r\n////////////////////////////////////////////////////////////////////////////\r\nvoid power_on_device_impl(LOAD_Target_Type loadTarget)\r\n{\r\n    uint8_t target_type = ((uint8_t)loadTarget & ~0x80);\r\n\r\n    if (LOAD_WIFI_FIRMWARE == target_type)\r\n    {\r\n        POWER_PowerOnWlan();\r\n    }\r\n    else if ((LOAD_BLE_FIRMWARE == target_type) || (LOAD_15D4_FIRMWARE == target_type))\r\n    {\r\n        POWER_PowerOnBle();\r\n    }\r\n    else\r\n    {\r\n        ; /* none to do */\r\n    }\r\n    // There's 2.6us gap from device Power-On till device sub-system power up.\r\n    // Do a time delay which >2.6us for device sub-system here.\r\n    sb3_DelayUs(5U);\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief power off device implementation\r\n////////////////////////////////////////////////////////////////////////////\r\nvoid power_off_device_impl(LOAD_Target_Type loadTarget)\r\n{\r\n    uint8_t target_type = ((uint8_t)loadTarget & ~0x80);\r\n\r\n    if (LOAD_WIFI_FIRMWARE == target_type)\r\n    {\r\n        POWER_PowerOffWlan();\r\n    }\r\n    else if ((LOAD_BLE_FIRMWARE == target_type) || (LOAD_15D4_FIRMWARE == target_type))\r\n    {\r\n        POWER_PowerOffBle();\r\n    }\r\n    else\r\n    {\r\n        ; /* none to do */\r\n    }\r\n    sb3_DelayUs(5U);\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief reset device\r\n////////////////////////////////////////////////////////////////////////////\r\nvoid reset_device(LOAD_Target_Type loadTarget)\r\n{\r\n    uint8_t target_type = ((uint8_t)loadTarget & ~0x80);\r\n    if (LOAD_WIFI_FIRMWARE == target_type)\r\n    {\r\n        *((uint32_t *)CIU_RST_SW2) = *((uint32_t *)CIU_RST_SW2) | CIU_RST_SW2_CPU1_RST_MASK;\r\n    }\r\n    else if ((LOAD_BLE_FIRMWARE == target_type) || (LOAD_15D4_FIRMWARE == target_type))\r\n    {\r\n        *((uint32_t *)CIU2_RST_SW3) = *((uint32_t *)CIU2_RST_SW3) | CIU2_RST_SW3_CPU2_RST_MASK;\r\n    }\r\n    else\r\n    {\r\n        ; /* none to do */\r\n    }\r\n}\r\n\r\nstatic fsl_ldr_Context_v3_t *get_sbloader_v3_context(fsl_api_core_context_t *ctx)\r\n{\r\n    return ctx->sbloaderCtx;\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief get firmware version from otp\r\n////////////////////////////////////////////////////////////////////////////\r\nstatic fsl_nboot_status_t nboot_hal_get_secure_firmware_version(uint32_t *fwVer, LOAD_Target_Type loadTarget)\r\n{\r\n    if (fwVer == NULL)\r\n    {\r\n        return kStatus_NBOOT_InvalidArgument;\r\n    }\r\n\r\n    uint32_t tmpVersion               = 0u;\r\n    uint32_t trustedFwVersionFuses[4] = {0};\r\n    uint32_t fuseIdxStart;\r\n\r\n    uint8_t target_type = (uint8_t)loadTarget & ~0x80;\r\n     if (LOAD_WIFI_FIRMWARE == target_type)\r\n    {\r\n        fuseIdxStart = OTP_WIFI_FW_VER0_FUSE_IDX;\r\n    }\r\n    else if (LOAD_BLE_FIRMWARE == target_type)\r\n    {\r\n        fuseIdxStart = OTP_BLE_FW_VER0_FUSE_IDX;\r\n    }\r\n    else if (LOAD_15D4_FIRMWARE == target_type)\r\n    {\r\n        fuseIdxStart = OTP_15_4_FW_VER0_FUSE_IDX;\r\n    }\r\n    else\r\n    {\r\n        return kStatus_NBOOT_InvalidArgument;\r\n    }\r\n\r\n    for (uint32_t i = 0u; i < ARRAY_SIZE(trustedFwVersionFuses); i++)\r\n    {\r\n        status_t status = OCOTP_OtpFuseRead(fuseIdxStart, &trustedFwVersionFuses[i]);\r\n        if (status != kStatus_Success)\r\n        {\r\n            return kStatus_NBOOT_Fail;\r\n        }\r\n        ++fuseIdxStart;\r\n    }\r\n\r\n    for (uint32_t i = 0u; i < ARRAY_SIZE(trustedFwVersionFuses); i++)\r\n    {\r\n        // Only the low-half 16-bit is used for counter calculation\r\n        for (uint8_t j = 0U; j < 16U; j++)\r\n        {\r\n            if ((trustedFwVersionFuses[i] & (uint32_t)((uint32_t)(1U) << j)) != 0U)\r\n            {\r\n                ++tmpVersion;\r\n            }\r\n        }\r\n    }\r\n\r\n    *fwVer = tmpVersion;\r\n\r\n    return kStatus_NBOOT_Success;\r\n}\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief fw download implementation\r\n////////////////////////////////////////////////////////////////////////////\r\nstatus_t sb3_fw_download_impl(LOAD_Target_Type loadTarget, uint32_t flag, uint32_t sourceAddr)\r\n{\r\n    volatile uint32_t *magic_pattern_addr = NULL;\r\n    status_t status                       = kStatus_Fail;\r\n    int wait_count                        = 200;\r\n    uint8_t target_type                   = ((uint8_t)loadTarget & ~0x80);\r\n\r\n    if ((g_bootloaderTree_v1 == NULL) && ((get_chip_revision() == 1U) || (get_chip_revision() == 2U)))\r\n    {\r\n        g_bootloaderTree_v1 = ((bootloader_tree_v1_t *)0x13030000);\r\n    }\r\n    else if (g_bootloaderTree_v0 == NULL)\r\n    {\r\n        g_bootloaderTree_v0 = ((bootloader_tree_v0_t *)0x13024100);\r\n    }\r\n\telse\r\n    {\r\n        ; /* none to do */\r\n    }\r\n\r\n    if (LOAD_WIFI_FIRMWARE == target_type)\r\n    {\r\n        magic_pattern_addr = (volatile uint32_t *)CPU1_MAGIC_PATTERN_ADDR;\r\n    }\r\n    else if ((LOAD_BLE_FIRMWARE == target_type) || (LOAD_15D4_FIRMWARE == target_type))\r\n    {\r\n        magic_pattern_addr = (volatile uint32_t *)CPU2_MAGIC_PATTERN_ADDR;\r\n    }\r\n#ifdef CONFIG_FW_VDLLV2\r\n    else if (LOAD_WIFI_VDLL_FIRMWARE == loadTarget)\r\n    {\r\n        status = load_service(loadTarget, sourceAddr);\r\n        return status;\r\n    }\r\n#endif\r\n    else\r\n    {\r\n        return status;\r\n    }\r\n\r\n    // Check if fw already active, if active skip download fw\r\n    if (IMU_SYNC_MAGIC_PATTERN == *((volatile uint32_t *)magic_pattern_addr))\r\n    {\r\n        status = kStatus_Success;\r\n        return status;\r\n    }\r\n\r\n    if (loadTarget & 0x80)\r\n    {\r\n        status = load_service_monolithic(loadTarget, sourceAddr);\r\n    }\r\n    else\r\n    {\r\n        status = load_service(loadTarget, sourceAddr);\r\n    }\r\n\r\n    // Wait for fw activation for 1s. Return fail if wait_count is used up.\r\n    while (wait_count != 0)\r\n    {\r\n        if (IMU_SYNC_MAGIC_PATTERN != *((volatile uint32_t *)magic_pattern_addr))\r\n        {\r\n            /* 5 ms delay */\r\n            sb3_DelayUs(1000 * 5);\r\n            wait_count--;\r\n            if (wait_count == 0)\r\n            {\r\n                status = kStatus_Fail;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            status = kStatus_Success;\r\n            break;\r\n        }\r\n    }\r\n\r\n    return status;\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief fw reset implementation\r\n////////////////////////////////////////////////////////////////////////////\r\nstatus_t sb3_fw_reset_impl(LOAD_Target_Type loadTarget, uint32_t flag, uint32_t sourceAddr)\r\n{\r\n    status_t status = kStatus_Fail;\r\n\r\n    power_off_device_impl(loadTarget);\r\n\r\n    status = sb3_fw_download_impl(loadTarget, flag, sourceAddr);\r\n\r\n    return status;\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief load command processing\r\n////////////////////////////////////////////////////////////////////////////\r\nstatic status_t ldr_DoLoadCmd(fsl_api_core_context_t *ctx)\r\n{\r\n    status_t status = kStatus_Fail;\r\n\r\n    fsl_ldr_Context_v3_t *context = get_sbloader_v3_context(ctx);\r\n\r\n    // check current data_block_position\r\n    if (context->data_block_position == context->block_data_size)\r\n    {\r\n        // we reached end of data section, need to get the next block\r\n        status = kStatus_Success;\r\n    }\r\n    else if (context->data_block_position + context->data_range_header.length <= context->block_data_size)\r\n    {\r\n        // the load data enough in data section (buffer)\r\n        (void)memcpy((uint8_t *)context->data_range_header.startAddress,\r\n                     (uint8_t *)&context->data_block[context->data_block_position], context->data_range_header.length);\r\n        // this load command completed.\r\n        // this data range section process finiskStatus_FLASH_Successhed.\r\n        context->in_data_range      = false;\r\n        context->data_range_handled = 0;\r\n        context->data_block_position += context->data_range_header.length + context->data_range_gap;\r\n        context->data_section_handled += context->data_range_header.length + context->data_range_gap;\r\n        status = kStatus_Success;\r\n    }\r\n    else\r\n    {\r\n        // we have partial data to load\r\n        (void)memcpy((uint8_t *)context->data_range_header.startAddress,\r\n                     (uint8_t *)&context->data_block[context->data_block_position],\r\n                     context->block_data_size - context->data_block_position);\r\n        context->data_range_handled = context->block_data_size - context->data_block_position;\r\n        context->data_range_header.startAddress += context->data_range_handled;\r\n        context->data_range_header.length -= context->data_range_handled;\r\n        context->data_block_position += context->data_range_handled;\r\n        context->data_section_handled += context->data_range_handled;\r\n        status = kStatus_Success;\r\n    }\r\n\r\n    return status;\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief Execute command processing\r\n////////////////////////////////////////////////////////////////////////////\r\nstatic status_t ldr_DoExecuteCmd(fsl_api_core_context_t *ctx)\r\n{\r\n    fsl_ldr_Context_v3_t *context = get_sbloader_v3_context(ctx);\r\n    // this data range section process finished.\r\n    context->in_data_range      = false;\r\n    context->data_range_handled = 0;\r\n\r\n    // Actual jump is implemented in fsl_sbloader_finalize().\r\n    return (status_t)kStatusRomLdrPendingJumpCommand;\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief data block processing\r\n////////////////////////////////////////////////////////////////////////////\r\nstatic status_t ldr_DoBlock(fsl_api_core_context_t *ctx)\r\n{\r\n    fsl_ldr_Context_v3_t *context = get_sbloader_v3_context(ctx);\r\n\r\n    status_t status = kStatus_Fail;\r\n    // new data range with new data block\r\n    fsl_sb3_data_range_header_t *data_range_header;\r\n    fsl_sb3_section_header_t *data_section_header;\r\n\r\n    while (context->in_data_block)\r\n    {\r\n        // check if we are in a data section\r\n        if (context->in_data_section)\r\n        {\r\n            // in process of a data section\r\n            data_section_header = &context->data_section_header;\r\n        }\r\n        else\r\n        {\r\n            // new data section started\r\n            data_section_header = (fsl_sb3_section_header_t *)(void *)&context->data_block[context->data_block_position];\r\n\r\n            // save data range section header\r\n            (void)memcpy(&context->data_section_header, data_section_header, sizeof(fsl_sb3_section_header_t));\r\n\r\n            // branch to section types (only data range is currently supported)\r\n            switch (data_section_header->sectionType)\r\n            {\r\n                case ((uint32_t)kSectionNone):\r\n                    status = kStatus_Success;\r\n                    break;\r\n                case ((uint32_t)kSectionDataRange):\r\n                    context->in_data_section      = true;\r\n                    context->data_section_handled = 0;\r\n                    context->in_data_range        = false;\r\n                    context->data_range_handled   = 0;\r\n                    context->data_block_position += sizeof(fsl_sb3_section_header_t);\r\n                    break;\r\n                case ((uint32_t)kSectionDiffUpdate):\r\n                case ((uint32_t)kSectionDDRConfig):\r\n                case ((uint32_t)kSectionRegister):\r\n                default:\r\n                    // non-supported section type\r\n                    SBLOADER_PRINTF(\"Bootloader: %s, invalid section type = %x\", __func__,\r\n                                    data_section_header->sectionType);\r\n                    status = kStatus_Fail;\r\n                    break;\r\n            }\r\n            if (data_section_header->sectionType != (uint32_t)kSectionDataRange)\r\n            {\r\n                return status;\r\n            }\r\n        }\r\n\r\n        switch (data_section_header->sectionType)\r\n        {\r\n            case ((uint32_t)kSectionDataRange):\r\n            {\r\n                // check if we are in a data range\r\n                if (context->in_data_range)\r\n                {\r\n                    // continue current data range process\r\n                    data_range_header = &context->data_range_header;\r\n                }\r\n                else\r\n                {\r\n                    // started a new data range\r\n                    data_range_header =\r\n                        (fsl_sb3_data_range_header_t *)(void *)&context->data_block[context->data_block_position];\r\n\r\n                    // check command tag\r\n                    if (data_range_header->tag != SB3_DATA_RANGE_HEADER_TAG)\r\n                    {\r\n                        // bad data range section\r\n                        status = kStatus_Fail;\r\n                        SBLOADER_PRINTF(\"Bootloader: %s, invalid data range header tag = %x\", __func__,\r\n                                        data_range_header->tag);\r\n                        return status;\r\n                    }\r\n\r\n                    // save data range section header\r\n                    (void)memcpy(&context->data_range_header, data_range_header, sizeof(fsl_sb3_data_range_header_t));\r\n                    context->in_data_range            = true;\r\n                    context->has_data_range_expansion = false;\r\n                    context->data_range_handled       = sizeof(fsl_sb3_data_range_header_t); // used anywhere?\r\n                    context->data_block_position += sizeof(fsl_sb3_data_range_header_t);\r\n                    context->data_section_handled += sizeof(fsl_sb3_data_range_header_t);\r\n\r\n                    // 16 bytes alignmnent check and handling\r\n                    context->data_range_gap = 0;\r\n\r\n                    switch ((fsl_sb3_cmd_t)data_range_header->cmd)\r\n                    {\r\n                        case kSB3_CmdLoad:\r\n                            context->data_range_gap =\r\n                                (SB3_DATA_ALIGNMENT_SIZE_IN_BYTE - (data_range_header->length & 0xFU)) & 0xFU;\r\n                            break;\r\n                        default:\r\n                            // Do nothing for the commands.\r\n                            break;\r\n                    }\r\n                }\r\n\r\n                switch (data_range_header->cmd)\r\n                {\r\n                    case ((uint32_t)kSB3_CmdLoad):\r\n                        if (!context->has_data_range_expansion)\r\n                        {\r\n                            SBLOADER_PRINTF(\"Bootloader: %s, Copy data range expansion\", __func__);\r\n                            // check current data_block_position\r\n                            if (context->data_block_position == context->block_data_size)\r\n                            {\r\n                                // we reached end of data section, need to get the next block\r\n                                return kStatus_Success;\r\n                            }\r\n                            else if ((context->data_block_position + sizeof(fsl_sb3_data_range_expansion_t)) <=\r\n                                     context->block_data_size)\r\n                            {\r\n                                // save data range section header expansion.\r\n                                (void)memcpy(&context->data_range_expansion,\r\n                                             (fsl_sb3_data_range_expansion_t *)&context\r\n                                                 ->data_block[context->data_block_position],\r\n                                             sizeof(fsl_sb3_data_range_expansion_t));\r\n                                context->has_data_range_expansion = true;\r\n                                context->data_block_position += sizeof(fsl_sb3_data_range_expansion_t);\r\n                                context->data_section_handled += sizeof(fsl_sb3_data_range_expansion_t);\r\n                            }\r\n                            else\r\n                            {\r\n                                // Unaligned data range.\r\n                                return kStatus_Fail;\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            SBLOADER_PRINTF(\"Bootloader: %s, Has data range expansion\", __func__);\r\n                        }\r\n                        break;\r\n                    default:\r\n                        // Do nothing for the commands without header expansion.\r\n                        break;\r\n                }\r\n\r\n                // branch to range commands\r\n                switch (data_range_header->cmd)\r\n                {\r\n                    case ((uint32_t)kSB3_CmdLoad):\r\n                        status = ldr_DoLoadCmd(ctx);\r\n                        if (status != kStatus_Success)\r\n                        {\r\n                            return status;\r\n                        }\r\n                        break;\r\n                    case ((uint32_t)kSB3_CmdExecute):\r\n                        status = ldr_DoExecuteCmd(ctx);\r\n                        break;\r\n                    default:\r\n                        // this data range section process finished.\r\n                        context->in_data_range      = false;\r\n                        context->data_range_handled = 0;\r\n                        break;\r\n                }\r\n                if (data_range_header->cmd == (uint32_t)kSB3_CmdExecute)\r\n                {\r\n                    return status;\r\n                }\r\n\r\n                // check if we reach the end of this data section\r\n                if (context->data_section_handled == context->data_section_header.length)\r\n                {\r\n                    // this data section completed\r\n                    context->in_data_section = false;\r\n                }\r\n                else if (context->data_section_handled > context->data_section_header.length)\r\n                {\r\n                    // bad data section\r\n                    // return error\r\n                    SBLOADER_PRINTF(\"Bootloader: %s, bad data section.\", __func__);\r\n                    status = kStatus_Fail;\r\n                    return status;\r\n                }\r\n                else\r\n                {\r\n                    ; /* none to do */\r\n                }\r\n\r\n                // check if we reach the end of this data block\r\n                if (context->data_block_position == context->block_data_size)\r\n                {\r\n                    // This data block process finished.\r\n                    context->block_buffer_position = 0;\r\n                    context->in_data_block         = false;\r\n                    context->data_block_position   = 0;\r\n                    context->Action                = (fsl_pLdrFnc_v3_t)ldr_DoDataRead;\r\n                    SBLOADER_PRINTF(\"Bootloader: %s, data blobck process done.\", __func__);\r\n                    status = kStatus_Success;\r\n                }\r\n                else if (context->data_block_position > context->block_data_size)\r\n                {\r\n                    // bad block position\r\n                    // bad pointer\r\n                    SBLOADER_PRINTF(\"Bootloader: %s, bad block position.\", __func__);\r\n                    status = kStatus_Fail;\r\n                    return status;\r\n                }\r\n                else if (context->data_block_position + SB3_DATA_ALIGNMENT_SIZE_IN_BYTE > context->block_data_size)\r\n                {\r\n                    // data is not 16 bytes aligned.\r\n                    // return error\r\n                    status = kStatus_Fail;\r\n                    SBLOADER_PRINTF(\"Bootloader: %s, data not aligned.\", __func__);\r\n                    return status;\r\n                }\r\n                else\r\n                {\r\n                    ; /* none to do */\r\n                }\r\n            }\r\n            break;\r\n            case ((uint32_t)kSectionDiffUpdate):\r\n            case ((uint32_t)kSectionDDRConfig):\r\n            case ((uint32_t)kSectionRegister):\r\n            default:\r\n                // non-supported section type\r\n                SBLOADER_PRINTF(\"Bootloader: %s, non-supported section type = %x\", __func__,\r\n                                data_section_header->sectionType);\r\n                status                 = kStatus_Fail;\r\n                context->in_data_block = false;\r\n                break;\r\n        }\r\n    }\r\n\r\n    return status;\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief data block decryption and handling\r\n////////////////////////////////////////////////////////////////////////////\r\nstatic status_t ldr_DoDataRead(fsl_api_core_context_t *ctx)\r\n{\r\n    status_t status                = kStatus_Fail;\r\n    fsl_nboot_status_t nbootResult = kStatus_NBOOT_Fail;\r\n\r\n    fsl_ldr_Context_v3_t *context = get_sbloader_v3_context(ctx);\r\n\r\n    // check block integrity\r\n    if (context->processedBlocks < ctx->nbootCtx->totalBlocks)\r\n    {\r\n        // call nboot lib to decrypt the data block\r\n        if ((get_chip_revision() == 1U) || (get_chip_revision() == 2U))\r\n        {\r\n            nbootResult = (fsl_nboot_status_t)g_bootloaderTree_v1->nbootDriver->nboot_sb3_load_block(\r\n                ctx->nbootCtx, (uint32_t *)&context->block_buffer[0]);\r\n        }\r\n        else\r\n        {\r\n            nbootResult = (fsl_nboot_status_t)g_bootloaderTree_v0->nbootDriver->nboot_sb3_load_block(\r\n                ctx->nbootCtx, (uint32_t *)&context->block_buffer[0]);\r\n        }\r\n        if (nbootResult == kStatus_NBOOT_Success)\r\n        {\r\n            context->block_buffer_position = 0;\r\n#if defined(NBOOT_IGNORE_SB3_COMMANDS)\r\n            if (g_nboot_ctx.processData != NBOOT_IGNORE_SB3_COMMANDS)\r\n#endif\r\n            {\r\n                context->in_data_block       = true;\r\n                context->data_block          = &context->block_buffer[context->data_block_offset];\r\n                context->data_block_position = 0;\r\n                context->processedBlocks++;\r\n                status = ldr_DoBlock(ctx);\r\n            }\r\n#if defined(NBOOT_IGNORE_SB3_COMMANDS)\r\n            else\r\n            {\r\n                status = kStatus_Success;\r\n            }\r\n#endif\r\n        }\r\n        else\r\n        {\r\n            SBLOADER_PRINTF(\"ROM API: %s, nboot_sb3_load_block is failed, status = %x\", __func__, nbootResult);\r\n            status = kStatus_Fail;\r\n        }\r\n    }\r\n\r\n    return status;\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief header block handling\r\n////////////////////////////////////////////////////////////////////////////\r\nstatic status_t ldr_DoHeader_v3(fsl_api_core_context_t *ctx)\r\n{\r\n    status_t status = kStatus_Success;\r\n    fsl_nboot_sb3_load_manifest_parms_t manifestParms;\r\n\r\n    fsl_ldr_Context_v3_t *context = get_sbloader_v3_context(ctx);\r\n\r\n    do\r\n    {\r\n        fsl_nboot_sb3_header_t *header = (fsl_nboot_sb3_header_t *)(void *)&context->block_buffer[0];\r\n        if (context->block_buffer_size == sizeof(fsl_nboot_sb3_header_t))\r\n        {\r\n            // Update the buffer size to the size of Block 0.\r\n            context->block_buffer_size = header->imageTotalLength;\r\n            SBLOADER_PRINTF(\"ROM API: %s, manifest size = %x, but buffer size =%x\", __func__,\r\n                            context->block_buffer_size, sizeof(context->block_buffer));\r\n            if (context->block_buffer_size > sizeof(context->block_buffer))\r\n            {\r\n                status = kStatus_Fail;\r\n                break;\r\n            }\r\n            // Resume the cleared buffer position.\r\n            context->block_buffer_position = sizeof(fsl_nboot_sb3_header_t);\r\n\r\n            status = kStatus_Success;\r\n            break;\r\n        }\r\n\r\n        if (context->block_buffer_size != header->imageTotalLength)\r\n        {\r\n            status = kStatus_Fail;\r\n            break;\r\n        }\r\n\r\n        (void)memset(&manifestParms, 0, sizeof(fsl_nboot_sb3_load_manifest_parms_t));\r\n\r\n        fsl_nboot_status_t nbootResult = nboot_hal_get_sb3_manifest_params(ctx->nbootCtx, &manifestParms);\r\n        if (nbootResult != kStatus_NBOOT_Success)\r\n        {\r\n            SBLOADER_PRINTF(\"ROM API: %s, nboot_hal_get_sb3_manifest_params is failed, status = %x\", __func__,\r\n                            nbootResult);\r\n            status = kStatus_Fail;\r\n            break;\r\n        }\r\n\r\n        // call nboot lib to verify the block header\r\n        if ((get_chip_revision() == 1U) || (get_chip_revision() == 2U))\r\n        {\r\n            nbootResult = (fsl_nboot_status_t)g_bootloaderTree_v1->nbootDriver->nboot_sb3_load_manifest(\r\n                ctx->nbootCtx, (uint32_t *)(void *)header, &manifestParms);\r\n        }\r\n        else\r\n        {\r\n            nbootResult = (fsl_nboot_status_t)g_bootloaderTree_v0->nbootDriver->nboot_sb3_load_manifest(\r\n                ctx->nbootCtx, (uint32_t *)(void *)header, &manifestParms);\r\n        }\r\n        if (nbootResult == kStatus_NBOOT_Success)\r\n        {\r\n            context->data_block_offset = (uint8_t)(sizeof(uint32_t) /* blockNumber*/ + header->certificateBlockOffset -\r\n                                                   sizeof(fsl_nboot_sb3_header_t));\r\n            context->block_buffer_size = (uint32_t)context->data_block_offset + NBOOT_SB3_CHUNK_SIZE_IN_BYTES;\r\n            context->block_buffer_position = 0;\r\n            context->block_size            = header->blockSize;\r\n            context->block_data_size       = NBOOT_SB3_CHUNK_SIZE_IN_BYTES;\r\n            context->block_data_total      = context->block_size * ctx->nbootCtx->totalBlocks;\r\n            context->in_data_section       = false;\r\n            context->data_section_handled  = 0;\r\n            context->processedBlocks       = 0;\r\n            context->Action                = (fsl_pLdrFnc_v3_t)ldr_DoDataRead;\r\n            status                         = kStatus_Success;\r\n        }\r\n        else\r\n        {\r\n            SBLOADER_PRINTF(\"ROM API: %s, nboot_sb3_load_manifest is failed, status = %x\", __func__, nbootResult);\r\n            status = kStatus_Fail;\r\n        }\r\n    } while (false);\r\n\r\n    return status;\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief Initialize the loader state machine.\r\n////////////////////////////////////////////////////////////////////////////\r\nstatus_t fsl_sbloader_init(fsl_api_core_context_t *ctx)\r\n{\r\n    status_t status = kStatus_InvalidArgument;\r\n\r\n    do\r\n    {\r\n        if (ctx == NULL)\r\n        {\r\n            break;\r\n        }\r\n\r\n        fsl_ldr_Context_v3_t *context = ctx->sbloaderCtx;\r\n\r\n        // Initialize the context\r\n        (void)memset(context, 0, sizeof(fsl_ldr_Context_v3_t));\r\n        context->block_buffer_size = sizeof(fsl_nboot_sb3_header_t);\r\n\r\n        // Process the first chunk of the image header\r\n        context->Action = (fsl_pLdrFnc_v3_t)ldr_DoHeader_v3;\r\n\r\n        // Initialize the allowed command set\r\n        context->commandSet = SBLOADER_V3_CMD_SET_ALL;\r\n\r\n        status = kStatus_Success;\r\n\r\n    } while (false);\r\n\r\n    return status;\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief Finalize the loader operations\r\n////////////////////////////////////////////////////////////////////////////\r\nstatus_t fsl_sbloader_finalize(fsl_api_core_context_t *ctx)\r\n{\r\n    status_t status = kStatus_Fail;\r\n\r\n    fsl_ldr_Context_v3_t *context = get_sbloader_v3_context(ctx);\r\n\r\n    if (context->data_range_header.cmd == (uint32_t)kSB3_CmdExecute)\r\n    {\r\n        status = kStatus_Success;\r\n    }\r\n\r\n    return status;\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief Pump the loader state machine.///////////////////////////////////\r\nstatic status_t fsl_sbloader_pump(fsl_api_core_context_t *ctx, uint8_t *data, uint32_t length)\r\n{\r\n    status_t status = kStatus_InvalidArgument;\r\n    do\r\n    {\r\n        fsl_ldr_Context_v3_t *context = ctx->sbloaderCtx;\r\n        uint32_t required             = 0U;\r\n        uint32_t available            = 0U;\r\n        uint32_t readPosition         = 0U;\r\n\r\n        while (readPosition < length)\r\n        {\r\n            required  = context->block_buffer_size - context->block_buffer_position;\r\n            available = length - readPosition;\r\n\r\n            // copy what we need to complete a full chunk into the chunk buffer\r\n            if ((required > 0U) && (available > 0U))\r\n            {\r\n                uint32_t toCopy = required > available ? available : required;\r\n                if ((context->block_buffer_position < context->block_buffer_size) &&\r\n                    (context->block_buffer_position + toCopy <= context->block_buffer_size) &&\r\n                    (readPosition + toCopy <= length))\r\n                {\r\n                    if ((context->block_buffer_position + toCopy) >= sizeof(context->block_buffer))\r\n                    {\r\n                        // block buffer over-flow.\r\n                        SBLOADER_PRINTF(\"ROM API: %s, block buffer is overflown\", __func__);\r\n                        status = kStatus_Fail;\r\n                        break;\r\n                    }\r\n                    (void)memcpy(&context->block_buffer[context->block_buffer_position], &data[readPosition], toCopy);\r\n                    required -= toCopy;\r\n                    available -= toCopy;\r\n                    readPosition += toCopy;\r\n                    context->block_buffer_position += toCopy;\r\n                    status = kStatus_Success;\r\n                }\r\n                else\r\n                {\r\n                    status = kStatus_Fail;\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if (required == 0U)\r\n            {\r\n                // a full chunk was filled to process it\r\n                context->block_buffer_position = 0U;\r\n                status                         = (context->Action)(ctx);\r\n\r\n                if (status != kStatus_Success)\r\n                {\r\n                    if (status != (status_t)kStatusRomLdrPendingJumpCommand)\r\n                    {\r\n                        SBLOADER_PRINTF(\"sbloader Action failed: 0x%08x\", status);\r\n                    }\r\n                    break;\r\n                }\r\n            }\r\n            else if (available == 0U)\r\n            {\r\n                // otherwise we are just going to wait for more data\r\n                status = (status_t)kStatusRomLdrDataUnderrun;\r\n                break;\r\n            }\r\n            else\r\n            {\r\n                ; /* None to do */\r\n            }\r\n        }\r\n    } while (false);\r\n\r\n    return status;\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief Read flash area loading to RAM buffer.\r\n// Direct read from flash is not allowed when remapping is active.\r\n// buf             : pointer to RAM buffer, its size must be sufficient to receive\r\n//                   the required number of bytes.\r\n// src_flash_offset: 'virtual' address in flash relative to start of flash storage.\r\n//                   Actual 'physical' address results from the addition of the remap offset.\r\n// read_sz         : Number of bytes to be read.\r\n////////////////////////////////////////////////////////////////////////////\r\nstatic status_t ldr_ReadFromFlash(uint8_t * buf, uint32_t src_flash_offset, size_t read_sz)\r\n{\r\n    status_t st;\r\n    static const uint32_t mflash_base = (1u << 27);\r\n    uint32_t remap_offset = _ActiveApplicationRemapOffset();\r\n    if (remap_offset == 0U)\r\n    {\r\n        memcpy(buf, (void*)src_flash_offset, read_sz);\r\n        st = kStatus_Success;\r\n    }\r\n    else\r\n    {\r\n        // similar to mflash_drv_log2phys\r\n        uint32_t phys_offset = (src_flash_offset + remap_offset) & ~mflash_base;\r\n        st = mflash_drv_read(phys_offset, (uint32_t *)buf, read_sz);\r\n    }\r\n    return st;\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief Read SB3 area descriptor.\r\n// Direct read from flash is not allowed when remapping is active.\r\n// hdr       : pointer to RAM fsl_nboot_sb3_header_t structure.\r\n// sourceAddr: 'virtual' address where SB3 header is expected.\r\n////////////////////////////////////////////////////////////////////////////\r\nstatus_t read_nboot_sb3_header(fsl_nboot_sb3_header_t * hdr, uint32_t sourceAddr)\r\n{\r\n   return ldr_ReadFromFlash((uint8_t*)hdr, sourceAddr, sizeof(fsl_nboot_sb3_header_t));\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief load service with format of sb3\r\n// readOffset: image offset in flash\r\n////////////////////////////////////////////////////////////////////////////\r\nstatus_t loader_process_sb_file(uint32_t readOffset)\r\n{\r\n    status_t status                    = kStatus_Fail;\r\n    uint32_t packetLength              = sizeof(packetBuf);\r\n    s_fsl_api_core_context.sbloaderCtx = &s_sbloader_context;\r\n    s_fsl_api_core_context.nbootCtx    = &g_nbootCtx;\r\n    bool elsFlag                       = false;\r\n    uint32_t CSS_CTRL_context          = 0;\r\n#ifdef CONFIG_FW_VDLLV2\r\n    uint32_t counter;\r\n#endif\r\n\r\n    do\r\n    {\r\n        (void)POWER_EnableGDetVSensors();\r\n        if (((CLKCTL0->PSCCTL0 & CLKCTL0_PSCCTL0_ELS_MASK) == 0U) ||\r\n            ((CLKCTL0->PSCCTL1 & CLKCTL0_PSCCTL1_ELS_APB_MASK) == 0U) ||\r\n            ((RSTCTL0->PRSTCTL0 & RSTCTL0_PRSTCTL0_ELS_MASK) != 0U))\r\n        {\r\n            elsFlag = true;\r\n            CLOCK_EnableClock(kCLOCK_Els);\r\n            CLOCK_EnableClock(kCLOCK_ElsApb);\r\n            RESET_PeripheralReset(kELS_RST_SHIFT_RSTn);\r\n        }\r\n\r\n#if defined(MBEDTLS_THREADING_C) && defined(MBEDTLS_THREADING_ALT)\r\n        (void)mcux_els_mutex_lock();\r\n#endif\r\n\r\n        if ((get_chip_revision() == 1U) || (get_chip_revision() == 2U))\r\n        {\r\n            status = (int32_t)g_bootloaderTree_v1->nbootDriver->nboot_context_init(s_fsl_api_core_context.nbootCtx);\r\n        }\r\n        else\r\n        {\r\n            status = (int32_t)g_bootloaderTree_v0->nbootDriver->nboot_context_init(s_fsl_api_core_context.nbootCtx);\r\n        }\r\n        if (status != (status_t)kStatus_NBOOT_Success)\r\n        {\r\n            break;\r\n        }\r\n\r\n        status = fsl_sbloader_init(&s_fsl_api_core_context);\r\n        if (status != kStatus_Success)\r\n        {\r\n            break;\r\n        }\r\n\r\n        // Pump the sbloader content and do sbloader handling until ROM see the jump command and jump to the image\r\n        while (true)\r\n        {\r\n            memcpy(packetBuf, (void*)readOffset, packetLength);\r\n\r\n            if ((get_chip_revision() == 1U) || (get_chip_revision() == 2U))\r\n            {\r\n                status = fsl_sbloader_pump(&s_fsl_api_core_context, packetBuf, packetLength);\r\n            }\r\n            else\r\n            {\r\n                status = g_bootloaderTree_v0->iapApiDriver->fsl_sbloader_pump(&s_fsl_api_core_context, packetBuf,\r\n                                                                              packetLength);\r\n            }\r\n\r\n            // kStatusRomLdrDataUnderrun means need more data\r\n            // kStatusRomLdrSectionOverrun means we reached the end of the sb file processing\r\n            // either of these are OK\r\n            if ((status == (status_t)kStatusRomLdrDataUnderrun) || (status == (status_t)kStatusRomLdrSectionOverrun))\r\n            {\r\n                status = kStatus_Success;\r\n            }\r\n            else if (status == (status_t)kStatusRomLdrPendingJumpCommand)\r\n            {\r\n                status = fsl_sbloader_finalize(&s_fsl_api_core_context);\r\n#ifdef CONFIG_FW_VDLLV2\r\n                assert((readOffset & 0x3U) == 0U);\r\n                for (counter = 0; counter < (packetLength + 7U) >> 2U; counter++)\r\n                {\r\n                    if (*(uint32_t *)readOffset == TAG_SB_V3)\r\n                    {\r\n                        vdll_image_base = readOffset;\r\n                        break;\r\n                    }\r\n                    else\r\n                    {\r\n                        readOffset += 4U;\r\n                    }\r\n                }\r\n#endif\r\n                break;\r\n            }\r\n            else\r\n            {\r\n                ; /* No necessary actions. */\r\n            }\r\n\r\n            if (status != kStatus_Success)\r\n            {\r\n                break;\r\n            }\r\n\r\n            readOffset += packetLength;\r\n        }\r\n    } while (false);\r\n\r\n    if (get_chip_revision() == 0U)\r\n    {\r\n        CSS_CTRL_context = ELS->ELS_CTRL;\r\n    }\r\n\r\n    if ((get_chip_revision() == 1U) || (get_chip_revision() == 2U))\r\n    {\r\n        (void)g_bootloaderTree_v1->nbootDriver->nboot_context_deinit(s_fsl_api_core_context.nbootCtx);\r\n    }\r\n    else\r\n    {\r\n        (void)g_bootloaderTree_v0->nbootDriver->nboot_context_deinit(s_fsl_api_core_context.nbootCtx);\r\n    }\r\n\r\n    if (get_chip_revision() == 0U)\r\n    {\r\n        ELS->ELS_CTRL = (CSS_CTRL_context & 0xFFU);\r\n    }\r\n\r\n#if defined(MBEDTLS_THREADING_C) && defined(MBEDTLS_THREADING_ALT)\r\n    (void)mcux_els_mutex_unlock();\r\n#endif\r\n\r\n    if (elsFlag == true)\r\n    {\r\n        RESET_SetPeripheralReset(kELS_RST_SHIFT_RSTn);\r\n        CLOCK_DisableClock(kCLOCK_ElsApb);\r\n        CLOCK_DisableClock(kCLOCK_Els);\r\n    }\r\n    POWER_DisableGDetVSensors();\r\n\r\n    return status;\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief load service with format of raw binary image\r\n// readOffset: image offset in flash\r\n////////////////////////////////////////////////////////////////////////////\r\nstatic status_t loader_process_raw_file(uint32_t readOffset)\r\n{\r\n    status_t status = kStatus_Fail;\r\n    uint32_t *src_addr;\r\n    uint32_t *dst_addr;\r\n    uint32_t code_size;\r\n    uint32_t *data_ptr      = (uint32_t *)readOffset;\r\n    uint32_t total_raw_size = 0;\r\n\r\n#ifdef CONFIG_FW_VDLLV2\r\n    if ((*data_ptr == LOADER_RAW_BINARY_FORMAT) && (*(data_ptr + 1) == LOADER_VDLL_RAW_BINARY_FORMAT))\r\n    {\r\n        src_addr  = data_ptr + 4;\r\n        dst_addr  = (uint32_t *)*(data_ptr + 2);\r\n        code_size = *(data_ptr + 3);\r\n        (void)memcpy(dst_addr, src_addr, code_size);\r\n        status = kStatus_Success;\r\n    }\r\n    else\r\n#endif\r\n    {\r\n        do\r\n        {\r\n            if (*data_ptr != LOADER_RAW_BINARY_FORMAT)\r\n            {\r\n                break;\r\n            }\r\n\r\n            src_addr  = data_ptr + 4;\r\n            dst_addr  = (uint32_t *)*(data_ptr + 2);\r\n            code_size = *(data_ptr + 3);\r\n            // Check for raw ending segment\r\n            if (((uint32_t)src_addr == 0xffffffffU) || ((uint32_t)dst_addr == 0xffffffffU))\r\n            {\r\n                if (code_size == total_raw_size)\r\n                {\r\n                    status = kStatus_Success;\r\n#ifdef CONFIG_FW_VDLLV2\r\n                    vdll_image_base = (uint32_t)(data_ptr + 4);\r\n#endif\r\n                }\r\n                break;\r\n            }\r\n\r\n            (void)memcpy(dst_addr, src_addr, code_size);\r\n            data_ptr += 4U + (code_size >> 2U);\r\n            total_raw_size += code_size;\r\n        } while (true);\r\n    }\r\n\r\n    return status;\r\n}\r\n\r\nstatic status_t loader_process_raw_file_monolithic(uint32_t readOffset)\r\n{\r\n    status_t status = kStatus_Fail;\r\n    uint32_t *dst_addr;\r\n    uint32_t code_size;\r\n    uint32_t sz;\r\n\r\n\r\n    uint32_t total_raw_size = 0U;\r\n    uint8_t staging_buf[STAGING_BUF_SZ] = { 0u };\r\n\r\n    do {\r\n        sb3_load_desc_t *p_desc = (sb3_load_desc_t*)&staging_buf[0];\r\n        status_t flash_st;\r\n        /* Firs read the SB3 area descriptor */\r\n        flash_st = ldr_ReadFromFlash(&staging_buf[0], readOffset, sizeof(sb3_load_desc_t));\r\n        if (flash_st != kStatus_Success)\r\n        {\r\n            break;\r\n        }\r\n        readOffset += sizeof(sb3_load_desc_t);\r\n\r\n        if (p_desc->fmt != LOADER_RAW_BINARY_FORMAT)\r\n        {\r\n            break;\r\n        }\r\n\r\n        dst_addr  = (uint32_t*)p_desc->dst_addr;\r\n        code_size = p_desc->area_sz;\r\n\r\n        // Check for raw ending segment\r\n        if (p_desc->dst_addr == 0xffffffffU)\r\n        {\r\n            if (code_size == total_raw_size)\r\n            {\r\n                status = kStatus_Success;\r\n#ifdef CONFIG_FW_VDLLV2\r\n                vdll_image_base = readOffset;\r\n#endif\r\n            }\r\n            break;\r\n        }\r\n\r\n        /* start of indirect memcpy to destination */\r\n        sz = code_size;\r\n        while (sz >= STAGING_BUF_SZ)\r\n        {\r\n            flash_st = ldr_ReadFromFlash(&staging_buf[0], readOffset, STAGING_BUF_SZ);\r\n            if (flash_st != kStatus_Success)\r\n            {\r\n                break;\r\n            }\r\n            (void)memcpy(dst_addr, &staging_buf[0], STAGING_BUF_SZ);\r\n            readOffset += STAGING_BUF_SZ;\r\n            dst_addr += STAGING_BUF_SZ/4;\r\n            sz -= STAGING_BUF_SZ;\r\n        }\r\n        if (flash_st != kStatus_Success)\r\n        {\r\n            break;\r\n        }\r\n        /* last chunk smaller than staging buffer */\r\n        if (sz > 0U)\r\n        {\r\n            flash_st = ldr_ReadFromFlash(&staging_buf[0], readOffset, sz);\r\n            if (flash_st != kStatus_Success)\r\n            {\r\n                break;\r\n            }\r\n            (void)memcpy(dst_addr, &staging_buf[0], sz);\r\n            readOffset += sz;\r\n            dst_addr += (sz+3U)/4U;\r\n        }\r\n        /* at this point are is fully consumed and copied to destination : */\r\n#ifdef CONFIG_FW_VDLLV2\r\n        if ((p_desc->sub_fmt == LOADER_VDLL_RAW_BINARY_FORMAT))\r\n        {\r\n            status = kStatus_Success;\r\n            break;\r\n        }\r\n#endif\r\n        total_raw_size += code_size;\r\n\r\n    } while (true);\r\n\r\n    return status;\r\n}\r\n\r\n#ifndef __ZEPHYR__\r\nstatic bool __FlexSpiFlashInit(void)\r\n{\r\n    bool ret = false;\r\n    if (((CLKCTL0->PSCCTL0 & CLKCTL0_PSCCTL0_FLEXSPI0_MASK) == 0U) ||\r\n        ((RSTCTL0->PRSTCTL0 & RSTCTL0_PRSTCTL0_FLEXSPI0_MASK) != 0U))\r\n    {\r\n        CLOCK_EnableClock(kCLOCK_Flexspi);\r\n        RESET_PeripheralReset(kFLEXSPI_RST_SHIFT_RSTn);\r\n        BOARD_SetFlexspiClock(FLEXSPI, 2U, 2U);\r\n        BOARD_InitFlash(FLEXSPI);\r\n        ret = true;\r\n    }\r\n    return ret;\r\n}\r\n\r\nstatic void __FlexSpiFlashDeInit(void)\r\n{\r\n    RESET_ClearPeripheralReset(kFLEXSPI_RST_SHIFT_RSTn);\r\n    BOARD_DeinitFlash(FLEXSPI);\r\n    CLOCK_AttachClk(kNONE_to_FLEXSPI_CLK);\r\n    CLOCK_DisableClock(kCLOCK_Flexspi);\r\n    RESET_SetPeripheralReset(kFLEXSPI_RST_SHIFT_RSTn);\r\n}\r\n\r\n#endif\r\n\r\nstatic int __OtpInit(void)\r\n{\r\n    int ret = 0; /* will stay 0 if nothing to do */\r\n    if (((CLKCTL0->PSCCTL1 & CLKCTL0_PSCCTL1_OTP_MASK) == 0U) ||\r\n        ((RSTCTL0->PRSTCTL1 & RSTCTL0_PRSTCTL1_OTP_MASK) != 0U))\r\n    {\r\n        status_t st;\r\n#ifdef USE_OCOTP_DRIVER_IN_LOAD_SERVICE\r\n        st = OCOTP_OtpInit();\r\n#else\r\n        if ((get_chip_revision() == 1U) || (get_chip_revision() == 2U))\r\n        {\r\n            st = g_bootloaderTree_v1->otpDriver->init(0U);\r\n        }\r\n        else\r\n        {\r\n            RESET_PeripheralReset(kOTP_RST_SHIFT_RSTn);\r\n            st = g_bootloaderTree_v0->otpDriver->init(0U);\r\n        }\r\n#endif\r\n        if (st != kStatus_Success)\r\n        {\r\n            ret = -1;\r\n        }\r\n        else\r\n        {\r\n            ret = 1;\r\n        }\r\n    }\r\n    return ret;\r\n}\r\n\r\nstatic int __OtpDeInit(void)\r\n{\r\n    int ret = -1;\r\n#ifdef USE_OCOTP_DRIVER_IN_LOAD_SERVICE\r\n        if (OCOTP_OtpDeinit() == kStatus_Success)\r\n        {\r\n            ret = 0;\r\n        }\r\n#else\r\n        if ((get_chip_revision() == 1U) || (get_chip_revision() == 2U))\r\n        {\r\n            if (g_bootloaderTree_v1->otpDriver->deinit() == kStatus_Success)\r\n            {\r\n                ret = 0;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            if (g_bootloaderTree_v0->otpDriver->deinit() == kStatus_Success)\r\n            {\r\n                ret = 0;\r\n            }\r\n        }\r\n#endif\r\n    return ret;\r\n}\r\n\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief load service\r\n// loadTarget: LOAD_WIFI_FIRMWARE / LOAD_BLE_FIRMWARE / LOAD_15D4_FIRMWARE\r\n// sourceAddr: load firmware source address, if 0 load default address\r\n////////////////////////////////////////////////////////////////////////////\r\nstatus_t load_service(LOAD_Target_Type loadTarget, uint32_t sourceAddr)\r\n{\r\n    status_t status = kStatus_Fail;\r\n    fsl_nboot_sb3_header_t *pt_a_ptr;\r\n    fsl_nboot_sb3_header_t *pt_b_ptr;\r\n    fsl_nboot_sb3_header_t *active_pt_ptr;\r\n    uint32_t firmwareVersion = 0xFFFFFFFFU;\r\n    int otp_status           = 0;\r\n#ifndef __ZEPHYR__\r\n    bool flexspiFlag         = __FlexSpiFlashInit();\r\n#endif\r\n\r\n    if (LOAD_WIFI_FIRMWARE == loadTarget)\r\n    {\r\n        if (sourceAddr == 0U)\r\n        {\r\n            pt_a_ptr = (fsl_nboot_sb3_header_t *)WIFI_IMAGE_A_OFFSET;\r\n            pt_b_ptr = (fsl_nboot_sb3_header_t *)WIFI_IMAGE_B_OFFSET;\r\n        }\r\n        else\r\n        {\r\n            pt_a_ptr = (fsl_nboot_sb3_header_t *)sourceAddr;\r\n            pt_b_ptr = (fsl_nboot_sb3_header_t *)(sourceAddr + WIFI_IMAGE_SIZE_MAX);\r\n        }\r\n    }\r\n    else if (LOAD_BLE_FIRMWARE == loadTarget)\r\n    {\r\n        if (sourceAddr == 0U)\r\n        {\r\n            pt_a_ptr = (fsl_nboot_sb3_header_t *)BLE_IMAGE_A_OFFSET;\r\n            pt_b_ptr = (fsl_nboot_sb3_header_t *)BLE_IMAGE_B_OFFSET;\r\n        }\r\n        else\r\n        {\r\n            pt_a_ptr = (fsl_nboot_sb3_header_t *)sourceAddr;\r\n            pt_b_ptr = (fsl_nboot_sb3_header_t *)(sourceAddr + BLE_IMAGE_SIZE_MAX);\r\n        }\r\n    }\r\n    else if (LOAD_15D4_FIRMWARE == loadTarget)\r\n    {\r\n        if (sourceAddr == 0U)\r\n        {\r\n            pt_a_ptr = (fsl_nboot_sb3_header_t *)Z154_IMAGE_A_OFFSET;\r\n            pt_b_ptr = (fsl_nboot_sb3_header_t *)Z154_IMAGE_B_OFFSET;\r\n        }\r\n        else\r\n        {\r\n            pt_a_ptr = (fsl_nboot_sb3_header_t *)sourceAddr;\r\n            pt_b_ptr = (fsl_nboot_sb3_header_t *)(sourceAddr + Z154_IMAGE_SIZE_MAX);\r\n        }\r\n    }\r\n#ifdef CONFIG_FW_VDLLV2\r\n    else if (LOAD_WIFI_VDLL_FIRMWARE == loadTarget)\r\n    {\r\n        assert(vdll_image_base != 0U);\r\n        pt_a_ptr = (fsl_nboot_sb3_header_t *)(vdll_image_base + sourceAddr);\r\n        pt_b_ptr = NULL;\r\n    }\r\n#endif\r\n    else\r\n    {\r\n        return kStatus_Fail;\r\n    }\r\n\r\n#ifdef MCUBOOT_APPLICATION\r\n    {\r\n        /* Skip MCUBoot header if present */\r\n\r\n        struct image_header *header;\r\n\r\n        header = (void *)pt_a_ptr;\r\n        if (header->ih_magic == IMAGE_MAGIC)\r\n        {\r\n            pt_a_ptr = (void *)(((uint8_t *)pt_a_ptr) + header->ih_hdr_size);\r\n        }\r\n\r\n        header = (void *)pt_b_ptr;\r\n        if (header->ih_magic == IMAGE_MAGIC)\r\n        {\r\n            pt_b_ptr = (void *)(((uint8_t *)pt_b_ptr) + header->ih_hdr_size);\r\n        }\r\n    }\r\n#endif\r\n\r\n    otp_status = __OtpInit();\r\n    if (otp_status < 0)\r\n    {\r\n        return kStatus_Fail;\r\n    }\r\n\r\n#ifdef CONFIG_FW_VDLLV2\r\n    if (LOAD_WIFI_VDLL_FIRMWARE != loadTarget)\r\n#endif\r\n    {\r\n        if (nboot_hal_get_secure_firmware_version(&firmwareVersion, loadTarget) != kStatus_NBOOT_Success)\r\n        {\r\n            return kStatus_Fail;\r\n        }\r\n\r\n        // imu init may be called before or after load_service(), not sure user will do in which sequence.\r\n        // If imu init is before load_service(), it is not appropriate do Power-Off here, then comment out Power-Off.\r\n        // power_off_device_impl(); // temporarily comment out for PDM Non-UPF version\r\n\r\n        power_on_device_impl(loadTarget);\r\n    }\r\n\r\n    /* Check partition TAG and select active partition */\r\n    if ((pt_a_ptr->magic != TAG_SB_V3) && (pt_b_ptr->magic != TAG_SB_V3))\r\n    {\r\n        active_pt_ptr = pt_a_ptr;\r\n        status        = loader_process_raw_file((uint32_t)active_pt_ptr);\r\n    }\r\n    else if ((pt_a_ptr->magic == TAG_SB_V3) && (pt_b_ptr->magic != TAG_SB_V3))\r\n    {\r\n        active_pt_ptr = pt_a_ptr;\r\n#ifdef CONFIG_FW_VDLLV2\r\n        if (LOAD_WIFI_VDLL_FIRMWARE != loadTarget)\r\n        {\r\n#endif\r\n            if (active_pt_ptr->firmwareVersion < firmwareVersion)\r\n            {\r\n                return kStatus_Fail;\r\n            }\r\n#ifdef CONFIG_FW_VDLLV2\r\n        }\r\n#endif\r\n        status = loader_process_sb_file((uint32_t)active_pt_ptr);\r\n    }\r\n    else if ((pt_a_ptr->magic != TAG_SB_V3) && (pt_b_ptr->magic == TAG_SB_V3))\r\n    {\r\n        active_pt_ptr = pt_b_ptr;\r\n        if (active_pt_ptr->firmwareVersion < firmwareVersion)\r\n        {\r\n            return kStatus_Fail;\r\n        }\r\n        status = loader_process_sb_file((uint32_t)active_pt_ptr);\r\n    }\r\n    else\r\n    {\r\n        if (pt_a_ptr->firmwareVersion >= pt_b_ptr->firmwareVersion)\r\n        {\r\n            active_pt_ptr = pt_a_ptr;\r\n        }\r\n        else\r\n        {\r\n            active_pt_ptr = pt_b_ptr;\r\n        }\r\n\r\n        if (active_pt_ptr->firmwareVersion < firmwareVersion)\r\n        {\r\n            return kStatus_Fail;\r\n        }\r\n        status = loader_process_sb_file((uint32_t)active_pt_ptr);\r\n    }\r\n\r\n    if (otp_status != 0)\r\n    {\r\n        /* OTP init was done here */\r\n        (void)__OtpDeInit();\r\n    }\r\n\r\n    if (status == kStatus_Success)\r\n    {\r\n        reset_device(loadTarget);\r\n    }\r\n\r\n#ifndef __ZEPHYR__\r\n    if (flexspiFlag)\r\n    {\r\n        __FlexSpiFlashDeInit();\r\n    }\r\n#endif\r\n    return status;\r\n}\r\n\r\n\r\nstatic status_t load_service_monolithic(LOAD_Target_Type loadTarget, uint32_t sourceAddr)\r\n{\r\n    status_t status = kStatus_Fail;\r\n    uint32_t hdr_a = 0UL;\r\n    fsl_nboot_sb3_header_t boot_hdr;\r\n    fsl_nboot_sb3_header_t *pt_a_ptr = &boot_hdr;\r\n    uint32_t firmwareVersion = 0xFFFFFFFFU;\r\n    uint32_t sel_fw_ver;\r\n    int otp_status           = 0;\r\n\r\n    memset(&boot_hdr, 0xff, sizeof(fsl_nboot_sb3_header_t));\r\n\r\n#ifndef __ZEPHYR__\r\n    bool flexspiFlag         = __FlexSpiFlashInit();\r\n#endif\r\n    (void)mflash_drv_init();\r\n    do {\r\n        status_t ret = kStatus_Fail;\r\n        if ((LOAD_WIFI_FW_MONOLITHIC != loadTarget) && (LOAD_BLE_FW_MONOLITHIC != loadTarget) && (LOAD_15D4_FW_MONOLITHIC != loadTarget))\r\n        {\r\n            break;\r\n        }\r\n        if (sourceAddr == 0UL)\r\n        {\r\n            break;\r\n        }\r\n        hdr_a = sourceAddr;\r\n\r\n        otp_status = __OtpInit();\r\n        if (otp_status < 0)\r\n        {\r\n            break;\r\n        }\r\n\r\n        if (nboot_hal_get_secure_firmware_version(&firmwareVersion, loadTarget) != kStatus_NBOOT_Success)\r\n        {\r\n           break;\r\n        }\r\n\r\n        // imu init may be called before or after load_service(), not sure user will do in which sequence.\r\n        // If imu init is before load_service(), it is not appropriate do Power-Off here, then comment out Power-Off.\r\n        // power_off_device_impl(); // temporarily comment out for PDM Non-UPF version\r\n\r\n        power_on_device_impl(loadTarget);\r\n\r\n        ret = ldr_ReadFromFlash((uint8_t*)pt_a_ptr, hdr_a, sizeof(fsl_nboot_sb3_header_t ));\r\n        if (ret != kStatus_Success)\r\n        {\r\n            break;\r\n        }\r\n        /* Check partition TAG and select active partition */\r\n        if (pt_a_ptr->magic == TAG_SB_V3)\r\n        {\r\n            sel_fw_ver = pt_a_ptr->firmwareVersion;\r\n\r\n            if (sel_fw_ver < firmwareVersion)\r\n            {\r\n                break;\r\n            }\r\n            status = loader_process_sb_file(hdr_a);\r\n        }\r\n        else\r\n        {\r\n            status = loader_process_raw_file_monolithic(hdr_a);\r\n        }\r\n\r\n    } while (false);\r\n\r\n    if (otp_status != 0)\r\n    {\r\n        /* OTP init was done here so undo it here */\r\n        (void)__OtpDeInit();\r\n    }\r\n\r\n    if (status == kStatus_Success)\r\n    {\r\n        reset_device(loadTarget);\r\n    }\r\n#ifndef __ZEPHYR__\r\n    if (flexspiFlag)\r\n    {\r\n        __FlexSpiFlashDeInit();\r\n    }\r\n#endif\r\n    return status;\r\n}\r\n\r\n////////////////////////////////////////////////////////////////////////////\r\n//! @brief get chip revision\r\n////////////////////////////////////////////////////////////////////////////\r\nuint8_t get_chip_revision(void)\r\n{\r\n    return (uint8_t)(SOCCTRL->CHIP_INFO & SOCCTRL_CHIP_INFO_REV_NUM_MASK);\r\n}\r\n\r\n//! @}\r\n////////////////////////////////////////////////////////////////////////////\r\n// EOF\r\n////////////////////////////////////////////////////////////////////////////"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/conn_fwloader/include/api_tree_root.h",
    "content": "/*\r\n * Copyright 2016-2019, 2021,2024 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n *\r\n */\r\n#ifndef __API_TREE_ROOT_H__\r\n#define __API_TREE_ROOT_H__\r\n\r\n#include \"fsl_loader_utils.h\"\r\n#include \"nboot_rom_api_table.h\"\r\n\r\n////////////////////////////////////////////////////////////////////////////////\r\n// Definitions\r\n////////////////////////////////////////////////////////////////////////////////\r\n// Load and set user appplication boot options stored in specific register\r\n#define LOAD_USER_APP_BOOT_OPTIONS()        (SYSCON_USER_APP_BOOT_OPTIONS)\r\n#define CLEAR_USER_APP_BOOT_OPTIONS()       (SYSCON_USER_APP_BOOT_OPTIONS = 0u)\r\n#define SET_USER_APP_BOOT_OPTIONS(value)    (SYSCON_USER_APP_BOOT_OPTIONS = value)\r\n\r\n//! @brief Boot parameters of the user application\r\n//!  WORD    OFFSET      FIELD                              DESCRIPTION\r\n//!          [31:24]     TAG                                Must be '0xEB'\r\n//!          [23:20]     Boot mode                          0:Master boot mode; 1: ISP boot\r\n//!          [19:16]     Boot interface                     0:USART 1:I2C 2:SPI 3:USB HID 4:QSPI 5:USB DFU\r\n//!          [15:12]     Boot instance(Channel)             0 or 1; For SD or MMC,this is to select the instance\r\n//!                                                         For FLEXSPI boot, this select the Channel A or Channel B\r\n//!          [11:08]     Redundant boot image index         Redundant boot image index for FlexSPI NOR flash\r\n//!          [07:00]     Reserved\r\n//!\r\n//!  TAG[31:24]\t    BOOT MODE[23:20]    INTERFACE[19:16]    INSTANCE[15:12]     RBII    Reserved[07:00]     COMBINATION     BOOT ACTION\r\n//!  0xEB  \t        0                   0\t                X\t                X       X\t                0xEB00XXXX\t    MASTR BOOT: USART\r\n//!\t                0\t                1\t                X\t                X       X\t                0xEB01XXXX\t    MASTR BOOT: I2C\r\n//!\t                0\t                2\t                X\t                X       X\t                0xEB02XXXX\t    MASTR BOOT: SPI\r\n//!\t                0\t                3\t                X\t                X       X\t                0xEB03XXXX\t    MASTR BOOT: USB HID\r\n//!\t                0\t                4\t                X\t                0       X\t                0xEB0400XX\t    MASTR BOOT: FlexSPI Channel A:boot image index 0\r\n//!\t                0\t                4\t                X\t                1       X\t                0xEB0401XX\t    MASTR BOOT: FlexSPI Channel A:boot image index 1\r\n//!\t                0                   4\t                X\t                0       X\t                0xEB0410XX\t    MASTR BOOT: FlexSPI Channel B:boot image index 0\r\n//!\t                0\t                4\t                X\t                1       X\t                0xEB0411XX\t    MASTR BOOT: FlexSPI Channel B:boot image index 1\r\n//!\t                0\t                5\t                X\t                X       X\t                0xEB05XXXX\t    MASTR BOOT: USB DFU\r\n//!\t                1\t                0\t                X\t                X       X\t                0xEB10XXXX\t    ISP BOOT: USART\r\n//!\t                1\t                1\t                X\t                X       X\t                0xEB11XXXX\t    ISP BOOT: I2C\r\n//!\t                1\t                2\t                X\t                X       X\t                0xEB12XXXX\t    ISP BOOT: SPI\r\n//!\r\n\r\ntypedef struct _fsl_user_app_boot_invoke_option\r\n{\r\n    union\r\n    {\r\n        struct\r\n        {\r\n            uint32_t reserved           : 8;\r\n            uint32_t boot_image_index   : 4;\r\n            uint32_t instance           : 4;\r\n            uint32_t boot_interface     : 4;\r\n            uint32_t mode               : 4;\r\n            uint32_t tag                : 8;\r\n        } B;\r\n        uint32_t U;\r\n    } option;\r\n} fsl_user_app_boot_invoke_option_t;\r\n\r\n//! @brief Boot interface can be selected by user application\r\n//! @note  For USB-HID QSPI USB-DFU SD MMC, these interfaces are invalid for ISP boot\r\nenum\r\n{\r\n    kUserAppBootPeripheral_UART     = 0u,\r\n    kUserAppBootPeripheral_I2C      = 1u,\r\n    kUserAppBootPeripheral_SPI      = 2u,\r\n    kUserAppBootPeripheral_USB_HID  = 3u,\r\n    kUserAppBootPeripheral_FLEXSPI  = 4u,\r\n    kUserAppBootPeripheral_DFU      = 5u\r\n};\r\n\r\n//! @brief Boot mode can be selected by user application\r\n//! @note  For master boot, valid boot insterfaces for user application are USART I2C SPI USB-HID USB-DFU SD MMC\r\n//!        For ISP boot, valid boot interfaces for user application are USART I2C SPI\r\nenum\r\n{\r\n    kUserAppBootMode_MasterBoot = 0,\r\n    kUserAppBootMode_IspBoot    = 1,\r\n};\r\n\r\n\r\n//!@brief OTP driver API Interface for A0\r\ntypedef struct\r\n{\r\n    uint32_t version;\r\n    status_t (*init)(uint32_t src_clk_freq);\r\n    status_t (*deinit)(void);\r\n    status_t (*fuse_read)(uint32_t addr, uint32_t *data);\r\n    status_t (*fuse_program)(uint32_t addr, uint32_t data, bool lock);\r\n    status_t (*reload)(void);\r\n    status_t (*crc_check)(uint32_t start_addr, uint32_t end_addr, uint32_t crc_addr);\r\n    status_t (*crc_calc)(uint32_t *src, uint32_t numberOfWords, uint32_t *crcChecksum);\r\n    status_t (*crc_check_sw)(uint32_t *src, uint32_t numberOfWords, uint32_t crc_fuse_idx);\r\n} ocotp_driver_v0_t;\r\n\r\n//!@brief OTP driver API Interface for A1/A2\r\ntypedef struct\r\n{\r\n    uint32_t version;\r\n    status_t (*init)(uint32_t src_clk_freq);\r\n    status_t (*deinit)(void);\r\n    status_t (*fuse_read)(uint32_t addr, uint32_t *data, uint32_t argChk);\r\n    status_t (*fuse_program)(uint32_t addr, uint32_t data, bool lock);\r\n    status_t (*reload)(void);\r\n    status_t (*crc_check)(uint32_t start_addr, uint32_t end_addr, uint32_t crc_addr);\r\n    status_t (*crc_calc)(uint32_t *src, uint32_t numberOfWords, uint32_t *crcChecksum);\r\n    status_t (*crc_check_sw)(uint32_t *src, uint32_t numberOfWords, uint32_t crc_fuse_idx);\r\n} ocotp_driver_v1_t;\r\n\r\n//! @brief Root of the bootloader API tree for A0.\r\n//!\r\n//! An instance of this struct resides in read-only memory in the bootloader. It\r\n//! provides a user application access to APIs exported by the bootloader.\r\n//!\r\n//! @note The order of existing fields must not be changed.\r\n//!\r\n//! @ingroup context\r\ntypedef struct BootloaderTree_v0\r\n{\r\n    void (*runBootloader)(void *arg);                               //!< Function to start the bootloader executing.\r\n    fsl_standard_version_t                      version;                //!< Bootloader version number.\r\n    const char                              *copyright;             //!< Copyright string.\r\n    const uint32_t                          reservedBootloader2;\r\n    const nboot_interface_v0_t              *nbootDriver;           //!< Image authentication API.\r\n    const uint32_t                          reservedBootloader3;\r\n    const ocotp_driver_v0_t                 *otpDriver;             //!< OTP driver API.\r\n    const fsl_iap_api_interface_t               *iapApiDriver;\r\n} bootloader_tree_v0_t;\r\n\r\n//! @brief Root of the bootloader API tree for A1/A2.\r\n//!\r\n//! An instance of this struct resides in read-only memory in the bootloader. It\r\n//! provides a user application access to APIs exported by the bootloader.\r\n//!\r\n//! @note The order of existing fields must not be changed.\r\n//!\r\n//! @ingroup context\r\ntypedef struct BootloaderTree_v1\r\n{\r\n    void (*runBootloader)(void *arg);                               //!< Function to start the bootloader executing.\r\n    fsl_standard_version_t                      version;                //!< Bootloader version number.\r\n    const char                              *copyright;             //!< Copyright string.\r\n    const uint32_t                          reservedBootloader2;\r\n    const nboot_interface_v1_t              *nbootDriver;           //!< Image authentication API.\r\n    const uint32_t                          reservedBootloader3;\r\n    const ocotp_driver_v1_t                 *otpDriver;             //!< OTP driver API.\r\n    const fsl_iap_api_interface_t               *iapApiDriver;\r\n} bootloader_tree_v1_t;\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n#endif // __API_TREE_ROOT_H__\r\n\r\n////////////////////////////////////////////////////////////////////////////////\r\n// EOF\r\n////////////////////////////////////////////////////////////////////////////////\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/conn_fwloader/include/fsl_loader.h",
    "content": "/*\r\n * Copyright 2016, 2022,2024 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef __FSL_LOADER_H__\r\n#define __FSL_LOADER_H__\r\n\r\n#include <stdint.h>\r\n#include \"fsl_common.h\"\r\n\r\ntypedef enum\r\n{\r\n    LOAD_WIFI_FIRMWARE = 1,\r\n    LOAD_BLE_FIRMWARE,\r\n    LOAD_15D4_FIRMWARE,\r\n#ifdef CONFIG_FW_VDLLV2\r\n    LOAD_WIFI_VDLL_FIRMWARE,\r\n#endif\r\n    LOAD_WIFI_FW_MONOLITHIC = 0x81,\r\n    LOAD_BLE_FW_MONOLITHIC  = 0x82,\r\n    LOAD_15D4_FW_MONOLITHIC = 0x83,\r\n    LOAD_TYPE_MAX,\r\n} LOAD_Target_Type;\r\n\r\nvoid power_on_device(LOAD_Target_Type loadTarget);\r\nvoid power_off_device(LOAD_Target_Type loadTarget);\r\n\r\nstatus_t sb3_fw_download(LOAD_Target_Type loadTarget, uint32_t flag, uint32_t sourceAddr);\r\nstatus_t sb3_fw_reset(LOAD_Target_Type loadTarget, uint32_t flag, uint32_t sourceAddr);\r\n\r\n//! @}\r\n\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/conn_fwloader/include/fsl_loader_utils.h",
    "content": "/*\r\n * Copyright 2024 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef __FSL_LOADER_UTILS_H__\r\n#define __FSL_LOADER_UTILS_H__\r\n\r\n#include <stdint.h>\r\n#include \"fsl_common.h\"\r\n#include \"fsl_loader.h\"\r\n#include \"fusemap.h\"\r\n#include \"fsl_ocotp.h\"\r\n#include \"fsl_os_abstraction.h\"\r\n\r\n//! @addtogroup sbloader\r\n//! @{\r\n/*! @brief Status group numbers. */\r\n#define kStatusGroup_SBLoader                  (101U)\r\n#define NBOOT_SB3_BLOCK_HASH384_SIZE_IN_BYTES  (48u)\r\n#define NBOOT_ROOT_OF_TRUST_HASH_SIZE_IN_BYTES (48u)\r\n#define NBOOT_EC_COORDINATE_384_SIZE_IN_BYTES  (48u)\r\n#define NBOOT_EC_COORDINATE_MAX_SIZE           NBOOT_EC_COORDINATE_384_SIZE_IN_BYTES\r\n#define NBOOT_ROOT_CERT_COUNT                  (4u)\r\n#define NBOOT_SB3_CHUNK_SIZE_IN_BYTES          (256u)\r\n#define NBOOT_KEYINFO_WORDLEN                  (23u)\r\n#define NXPCLHASH_WA_SIZE_MAX                  (128u + 64u)\r\n#define NBOOT_CONTEXT_BYTELEN                  (192u + NXPCLHASH_WA_SIZE_MAX)\r\n#define NBOOT_CONTEXT_WORDLEN                  (NBOOT_CONTEXT_BYTELEN / sizeof(uint32_t))\r\n#define NXPCLCSS_HASH_RTF_OUTPUT_SIZE          ((size_t)32U)\r\n\r\n#define SECURE_TERM_PART_LOCK        (0x6ac3c36au)\r\n#define SECURE_TERM_PART_OPEN        (0xc36ac36au)\r\n#define SECURE_TERM_SECURE_PART_OPEN (0xc36a6ac3u)\r\n#define SECURE_TERM_FA_PART_OPEN     (0xc3c36a6au)\r\n#define SECURE_OEM_FA_PART_OPEN      (0xc3c3a6a6u)\r\n\r\n#define LOADER_RAW_BINARY_FORMAT      (0x72617762U)\r\n#ifdef CONFIG_FW_VDLLV2\r\n#define LOADER_VDLL_RAW_BINARY_FORMAT (0x76646c6cU)\r\n#endif\r\n\r\n/*! @brief partition table constants. */\r\n#define WIFI_IMAGE_SIZE_MAX (0xa0000U)\r\n#define BLE_IMAGE_SIZE_MAX  (0x50000U)\r\n#define Z154_IMAGE_SIZE_MAX (0x50000U)\r\n#ifndef WIFI_IMAGE_A_OFFSET\r\n#define WIFI_IMAGE_A_OFFSET (0x08400000U)\r\n#endif\r\n#define WIFI_IMAGE_B_OFFSET (WIFI_IMAGE_A_OFFSET + WIFI_IMAGE_SIZE_MAX) // 0x4a0000\r\n#define BLE_IMAGE_A_OFFSET  (WIFI_IMAGE_B_OFFSET + WIFI_IMAGE_SIZE_MAX) // 0x540000\r\n#define BLE_IMAGE_B_OFFSET  (BLE_IMAGE_A_OFFSET + BLE_IMAGE_SIZE_MAX)   // 0x590000\r\n#define Z154_IMAGE_A_OFFSET (BLE_IMAGE_B_OFFSET + BLE_IMAGE_SIZE_MAX)   // 0x5e0000\r\n#define Z154_IMAGE_B_OFFSET (Z154_IMAGE_A_OFFSET + Z154_IMAGE_SIZE_MAX) // 0x630000\r\n\r\n/** Type for nboot status codes */\r\ntypedef uint32_t fsl_nboot_status_t;\r\n\r\n/**\r\n * \\defgroup nbootStatusValues  This type defines status return values used by NBOOT functions that are not easily\r\n * disturbed by Fault Attacks\r\n * @{\r\n */\r\n#define kStatus_NBOOT_Success                ((fsl_nboot_status_t)0x5A5A5A5Au) /*!< Operation completed successfully. */\r\n#define kStatus_NBOOT_Fail                   ((fsl_nboot_status_t)0x5A5AA5A5u) /*!< Operation failed. */\r\n#define kStatus_NBOOT_InvalidArgument        ((fsl_nboot_status_t)0x5A5AA5F0u) /*!< Invalid argument passed to the function. */\r\n#define kStatus_NBOOT_RequestTimeout         ((fsl_nboot_status_t)0x5A5AA5E1u) /*!< Operation timed out. */\r\n#define kStatus_NBOOT_KeyNotLoaded           ((fsl_nboot_status_t)0x5A5AA5E2u) /*!< The requested key is not loaded. */\r\n#define kStatus_NBOOT_AuthFail               ((fsl_nboot_status_t)0x5A5AA5E4u) /*!< Authentication failed. */\r\n#define kStatus_NBOOT_OperationNotAvaialable ((fsl_nboot_status_t)0x5A5AA5E5u) /*!< Operation not available on this HW. */\r\n#define kStatus_NBOOT_KeyNotAvailable        ((fsl_nboot_status_t)0x5A5AA5E6u) /*!< Key is not avaialble. */\r\n#define kStatus_NBOOT_IvCounterOverflow      ((fsl_nboot_status_t)0x5A5AA5E7u) /*!< Overflow of IV counter (PRINCE/IPED). */\r\n#define kStatus_NBOOT_SelftestFail           ((fsl_nboot_status_t)0x5A5AA5E8u) /*!< FIPS self-test failure. */\r\n#define kStatus_NBOOT_InvalidDataFormat      ((fsl_nboot_status_t)0x5A5AA5E9u) /*!< Invalid data format for example antipole */\r\n#define kStatus_NBOOT_IskCertUserDataTooBig \\\r\n    ((fsl_nboot_status_t)0x5A5AA5EAu) /*!< Size of User data in ISK certificate is greater than 96 bytes */\r\n#define kStatus_NBOOT_IskCertSignatureOffsetTooSmall \\\r\n    ((fsl_nboot_status_t)0x5A5AA5EBu) /*!< Signature offset in ISK certificate is smaller than expected */\r\n#define kStatus_NBOOT_MemcpyFail ((fsl_nboot_status_t)0x5A5A845A) /*!< Unexpected error detected during nboot_memcpy() */\r\n\r\n/*! @brief sb3.1 maigc number. */\r\n#define TAG_SB_V3 (0x33766273U) // \"sbv3\"\r\n\r\n/*!\r\n * @brief NBOOT type for the root key revocation\r\n *\r\n * This type defines the NBOOT root key revocation\r\n *\r\n */\r\n#define kNBOOT_RootKey_Enabled (0xAAu)\r\n#define kNBOOT_RootKey_Revoked (0xBBu)\r\n\r\n/*! @brief The size of the root of trust key table hash. */\r\n#define NBOOT_ROOT_ROTKH_SIZE_IN_WORD (12U)\r\n#define NBOOT_ROOT_ROTKH_SIZE_IN_BYTE (NBOOT_ROOT_ROTKH_SIZE_IN_WORD * 4U)\r\n\r\n/*! @brief The size of PKC Blob. */\r\n#define NBOOT_PCK_BLOB_SIZE_IN_WORD (12U)\r\n#define NBOOT_PCK_BLOB_SIZE_IN_BYTE (NBOOT_PCK_BLOB_SIZE_IN_WORD * 4U)\r\n\r\n/*!\r\n * @brief NBOOT type specifying the elliptic curve to be used\r\n *\r\n * This type defines the elliptic curve type and length\r\n *\r\n */\r\n#define kNBOOT_RootKey_Ecdsa_P256 (0x0000FE01u)\r\n#define kNBOOT_RootKey_Ecdsa_P384 (0x0000FD02u)\r\n\r\n/*!\r\n * @brief NBOOT type for the root key usage\r\n *\r\n * This type defines the NBOOT root key usage\r\n *\r\n */\r\n#define kNBOOT_RootKeyUsage_DebugCA_ImageCA_FwCA_ImageKey_FwKey (0x0u)\r\n#define kNBOOT_RootKeyUsage_Unused                              (0x7u)\r\n\r\n//! @brief SB loader status codes.\r\nenum _sbloader_status\r\n{\r\n    kStatusRomLdrSectionOverrun  = MAKE_STATUS(kStatusGroup_SBLoader, 0),\r\n    kStatusRomLdrSignature       = MAKE_STATUS(kStatusGroup_SBLoader, 1),\r\n    kStatusRomLdrSectionLength   = MAKE_STATUS(kStatusGroup_SBLoader, 2),\r\n    kStatusRomLdrUnencryptedOnly = MAKE_STATUS(kStatusGroup_SBLoader, 3),\r\n    kStatusRomLdrEOFReached      = MAKE_STATUS(kStatusGroup_SBLoader, 4),\r\n    kStatusRomLdrChecksum        = MAKE_STATUS(kStatusGroup_SBLoader, 5),\r\n    kStatusRomLdrCrc32Error      = MAKE_STATUS(kStatusGroup_SBLoader, 6),\r\n    kStatusRomLdrUnknownCommand  = MAKE_STATUS(kStatusGroup_SBLoader, 7),\r\n    kStatusRomLdrIdNotFound      = MAKE_STATUS(kStatusGroup_SBLoader, 8),\r\n    kStatusRomLdrDataUnderrun    = MAKE_STATUS(kStatusGroup_SBLoader, 9),\r\n    kStatusRomLdrJumpReturned    = MAKE_STATUS(kStatusGroup_SBLoader, 10),\r\n    kStatusRomLdrCallFailed      = MAKE_STATUS(kStatusGroup_SBLoader, 11),\r\n    kStatusRomLdrKeyNotFound     = MAKE_STATUS(kStatusGroup_SBLoader, 12),\r\n    kStatusRomLdrSecureOnly      = MAKE_STATUS(kStatusGroup_SBLoader, 13),\r\n    kStatusRomLdrResetReturned   = MAKE_STATUS(kStatusGroup_SBLoader, 14),\r\n\r\n    kStatusRomLdrRollbackBlocked        = MAKE_STATUS(kStatusGroup_SBLoader, 15),\r\n    kStatusRomLdrInvalidSectionMacCount = MAKE_STATUS(kStatusGroup_SBLoader, 16),\r\n    kStatusRomLdrUnexpectedCommand      = MAKE_STATUS(kStatusGroup_SBLoader, 17),\r\n    kStatusRomLdrBadSBKEK               = MAKE_STATUS(kStatusGroup_SBLoader, 18),\r\n    kStatusRomLdrPendingJumpCommand     = MAKE_STATUS(kStatusGroup_SBLoader, 19),\r\n};\r\n\r\n/*!\r\n * @brief Boolean type for the NBOOT functions\r\n *\r\n * This type defines boolean values used by NBOOT functions that are not easily disturbed by Fault Attacks\r\n *\r\n */\r\ntypedef enum _fsl_nboot_bool\r\n{\r\n    kNBOOT_TRUE                = 0x3C5AC33Cu, /*!< Value for TRUE.  */\r\n    kNBOOT_TRUE256             = 0x3C5AC35Au, /*!< Value for TRUE when P256 was used to sign the image.  */\r\n    kNBOOT_TRUE384             = 0x3C5AC3A5u, /*!< Value for TRUE when P384 was used to sign the image.  */\r\n    kNBOOT_FALSE               = 0x5AA55AA5u, /*!< Value for FALSE. */\r\n    kNBOOT_OperationAllowed    = 0x3c5a33ccU,\r\n    kNBOOT_OperationDisallowed = 0x5aa5cc33U,\r\n} fsl_nboot_bool_t;\r\n\r\n/** Type for nboot protected status codes */\r\ntypedef uint64_t fsl_nboot_status_protected_t;\r\n\r\n/*!\r\n * @brief NBOOT type for a timestamp\r\n *\r\n * This type defines the NBOOT timestamp\r\n *\r\n */\r\ntypedef uint32_t fsl_nboot_timestamp_t[2];\r\ntypedef uint32_t fsl_nboot_root_key_revocation_t;\r\ntypedef uint32_t fsl_nboot_root_key_usage_t;\r\ntypedef uint32_t fsl_nboot_root_key_type_and_length_t;\r\ntypedef uint32_t fsl_nboot_soc_lifecycle_t;\r\n\r\n/*!\r\n * @brief NBOOT type for the root of trust parameters\r\n *\r\n * This type defines the NBOOT root of trust parameters\r\n *\r\n */\r\n#define kNBOOT_SocRkh_Size_Words_P384 (12u)\r\n#define kNBOOT_SocRkh_Size_Words_P256 (8u)\r\ntypedef struct _fsl_nboot_rot_auth_parms\r\n{\r\n    /* trusted information originated from CFPA */\r\n    fsl_nboot_root_key_revocation_t soc_rootKeyRevocation[NBOOT_ROOT_CERT_COUNT]; /*!< Provided by caller based on NVM\r\n                                                                                 information in CFPA: ROTKH_REVOKE */\r\n    uint32_t soc_imageKeyRevocation; /*!< Provided by caller based on NVM information in CFPA: IMAGE_KEY_REVOKE */\r\n\r\n    /* trusted information originated from CMPA */\r\n    uint32_t soc_rkh[kNBOOT_SocRkh_Size_Words_P384]; /*!< Provided by caller based on NVM information in CMPA: ROTKH\r\n                                                        (hash of hashes) */\r\n    /*!< In case of kNBOOT_RootKey_Ecdsa_P384, sock_rkh[0..11] are used */\r\n    /*!< In case of kNBOOT_RootKey_Ecdsa_P256, sock_rkh[0..7] are used */\r\n\r\n    uint32_t soc_numberOfRootKeys; /* unsigned int, between minimum = 1 and maximum = 4; */\r\n    fsl_nboot_root_key_usage_t soc_rootKeyUsage[NBOOT_ROOT_CERT_COUNT]; /* CMPA */\r\n    fsl_nboot_root_key_type_and_length_t\r\n        soc_rootKeyTypeAndLength; /* static selection between ECDSA P-256 or ECDSA P-384 based root keys */\r\n\r\n    /* trusted information originated from OTP fuses */\r\n    fsl_nboot_soc_lifecycle_t soc_lifecycle;\r\n} fsl_nboot_rot_auth_parms_t;\r\n\r\n/*!\r\n * @brief NBOOT SB3.1 header type\r\n *\r\n * This type defines the header used in the SB3.1 manifest\r\n *\r\n */\r\ntypedef struct _fsl_nboot_sb3_header\r\n{\r\n    uint32_t magic;         /*! offset 0x00: Fixed 4-byte string of 'sbv3' without the trailing NULL */\r\n    uint32_t formatVersion; /*! offset 0x04: (major = 3, minor = 1); The format version determines the manifest (block0)\r\n                               size. */\r\n    uint32_t flags;         /*! offset 0x08: not defined yet, keep zero for future compatibility */\r\n    uint32_t blockCount;    /*! offset 0x0C: Number of blocks not including the manifest (block0). */\r\n    uint32_t blockSize; /*! offset 0x10: Size in bytes of data block (repeated blockCount times for SB3 data stream). */\r\n    fsl_nboot_timestamp_t timeStamp;     /*! offset 0x14: 64-bit value used as key derivation data. */\r\n    uint32_t firmwareVersion;        /*! offset 0x1c: Version number of the included firmware */\r\n    uint32_t imageTotalLength;       /*! offset 0x20: Total manifest length in bytes, including signatures etc. */\r\n    uint32_t imageType;              /*! offset 0x24: image type and flags */\r\n    uint32_t certificateBlockOffset; /*! offset 0x28: Offset from start of header block to the certificate block. */\r\n    uint8_t description[16];         /*! offset 0x32: This field provides description of the file. It is an arbitrary\r\n                                                      string injected by the signing tool, which helps to identify the file. */\r\n} fsl_nboot_sb3_header_t;\r\n\r\n/*!\r\n * @brief  manifest loading parameters\r\n *\r\n * This type defines the NBOOT SB3.1 manifest loading parameters\r\n *\r\n */\r\ntypedef struct _fsl_nboot_sb3_load_manifest_parms\r\n{\r\n    fsl_nboot_rot_auth_parms_t soc_RoTNVM;   /*! trusted information originated from CFPA and NMPA */\r\n    uint32_t soc_trustedFirmwareVersion; /*!< Provided by caller based on NVM information in CFPA: Secure_FW_Version */\r\n    uint8_t pckBlob[48];                 /*! CSSv2 protected blob with Part Common Key (PCK) */\r\n} fsl_nboot_sb3_load_manifest_parms_t;\r\n\r\n/*! @brief Data structure holding input arguments to POR secure boot (authentication) algorithm. Shall be read from SoC\r\n * trusted NVM or SoC fuses. */\r\ntypedef struct _fsl_nboot_img_auth_ecdsa_parms\r\n{\r\n    /* trusted information originated from CFPA and NMPA */\r\n    fsl_nboot_rot_auth_parms_t soc_RoTNVM;\r\n\r\n    uint32_t soc_trustedFirmwareVersion; /*!< Provided by caller based on NVM information in CFPA: Secure_FW_Version */\r\n} fsl_nboot_img_auth_ecdsa_parms_t;\r\n\r\n/*! @brief The size of the blob with Key Blob. */\r\n#define NBOOT_KEY_BLOB_SIZE_IN_BYTE_256 (32)\r\n#define NBOOT_KEY_BLOB_SIZE_IN_BYTE_384 (48)\r\n#define NBOOT_KEY_BLOB_SIZE_IN_BYTE_MAX (NBOOT_KEY_BLOB_SIZE_IN_BYTE_384)\r\n\r\n#define NBOOT_SB3_MANIFEST_MAX_SIZE_IN_BYTES (808)\r\n#define NBOOT_SB3_BLOCK_MAX_SIZE_IN_BYTES    (308)\r\n\r\n// Provides forward reference to the loader context definition.\r\ntypedef struct _fsl_ldr_Context_v3 fsl_ldr_Context_v3_t;\r\n\r\n//! sb3 section definitions\r\n\r\n//! section type\r\ntypedef enum _fsl_sectionType\r\n{\r\n    kSectionNone       = 0, // end or invalid\r\n    kSectionDataRange  = 1,\r\n    kSectionDiffUpdate = 2,\r\n    kSectionDDRConfig  = 3,\r\n    kSectionRegister   = 4,\r\n} fsl_section_type_t;\r\n\r\n#define SB3_DATA_RANGE_HEADER_FLAGS_ERASE_MASK (0x1u) // bit 0\r\n#define SB3_DATA_RANGE_HEADER_FLAGS_LOAD_MASK  (0x2u) // bit 1\r\n\r\n#define SB3_DATA_RANGE_HEADER_TAG       (0x55aaaa55U)\r\n#define SB3_DATA_ALIGNMENT_SIZE_IN_BYTE (16u)\r\n\r\n//! section data range structure\r\ntypedef struct fsl_range_header\r\n{\r\n    uint32_t tag;\r\n    uint32_t startAddress;\r\n    uint32_t length;\r\n    uint32_t cmd;\r\n} fsl_sb3_data_range_header_t;\r\n\r\ntypedef struct fsl_range_header_expansion\r\n{\r\n    uint32_t memoryId;\r\n    uint32_t pad0;\r\n    uint32_t pad1;\r\n    uint32_t pad2;\r\n} fsl_sb3_data_range_expansion_t;\r\n\r\n//! sb3 DATA section header format\r\ntypedef struct fsl_section_header\r\n{\r\n    uint32_t sectionUid;\r\n    uint32_t sectionType;\r\n    uint32_t length;\r\n    uint32_t _pad;\r\n} fsl_sb3_section_header_t;\r\n\r\n// loader command enum\r\n\r\ntypedef enum _fsl_loader_command_sb3\r\n{\r\n    kSB3_CmdInvalid = 0,\r\n    kSB3_CmdLoad    = 2,\r\n    kSB3_CmdExecute = 3,\r\n} fsl_sb3_cmd_t;\r\n\r\n//! The all of the allowed command\r\n#define SBLOADER_V3_CMD_SET_ALL ((1u << kSB3_CmdLoad) | (1u << kSB3_CmdExecute))\r\n\r\n#define SB3_DATA_BUFFER_SIZE_IN_BYTE (MAX(128, NBOOT_KEY_BLOB_SIZE_IN_BYTE_MAX))\r\n\r\n/*! @brief Data structure holding secure counter value used by nboot library */\r\ntypedef struct _fsl_nboot_secure_counter\r\n{\r\n    uint32_t sc;\r\n    uint32_t scAp;\r\n} fsl_nboot_secure_counter_t;\r\n\r\n/*!\r\n * @brief NBOOT context type\r\n *\r\n * This type defines the NBOOT context\r\n *\r\n */\r\ntypedef struct _fsl_nboot_context\r\n{\r\n    uint32_t totalBlocks; /*!< holds number of SB3 blocks. Initialized by nboot_sb3_load_header(). */\r\n    uint32_t processData; /*!< flag, initialized by nboot_sb3_load_header().\r\n                             SB3 related flag set by NBOOT in case the nboot_sb3_load_block()\r\n                             provides plain data to output buffer (for processing by ROM SB3 loader */\r\n    uint32_t timeout;     /*!< timeout value for css operation. In case it is 0, infinite wait is performed */\r\n    uint32_t keyinfo[NBOOT_KEYINFO_WORDLEN]; /*!< data for NBOOT key management. */\r\n    uint32_t context[NBOOT_CONTEXT_WORDLEN]; /*!< work area for NBOOT lib. */\r\n    uint32_t uuid[4];                        /*!< holds UUID value from NMPA */\r\n    uint32_t prngReadyFlag;     /*!< flag, used by nboot_rng_generate_lq_random() to determine whether CSS is ready to\r\n                                   generate rnd number */\r\n    uint32_t multipartMacBuffer[1024 / sizeof(uint32_t)];\r\n    uint32_t oemShareValidFlag; /*!< flag, used during TP to determine whether valid oemShare was set by\r\n                                   nboot_tp_isp_gen_oem_master_share() */\r\n    uint32_t oemShare[4]; /*!< buffer to store OEM_SHARE computed by nxpCLTrustProv_nboot_isp_gen_oem_master_share() */\r\n    fsl_nboot_secure_counter_t secureCounter; /*!< Secure counter used by nboot */\r\n    uint32_t rtf[NXPCLCSS_HASH_RTF_OUTPUT_SIZE / sizeof(uint32_t)];\r\n    uint32_t imageHash[48 / sizeof(uint32_t)];\r\n    uint32_t authStatus;\r\n    fsl_nboot_bool_t disableProvisioningFirmwareNXP; /*!< Flag to disable execution of NXP signed provisioning Firmwares */\r\n} fsl_nboot_context_t;\r\n\r\n//! @brief Structure of version property.\r\n//!\r\n//! @ingroup bl_core\r\ntypedef union fsl_StandardVersion\r\n{\r\n    struct\r\n    {\r\n        uint8_t bugfix; //!< bugfix version [7:0]\r\n        uint8_t minor;  //!< minor version [15:8]\r\n        uint8_t major;  //!< major version [23:16]\r\n        char name;      //!< name [31:24]\r\n    };\r\n    uint32_t version;   //!< combined version numbers\r\n\r\n#if defined(__cplusplus)\r\n    StandardVersion() : version(0)\r\n    {\r\n    }\r\n    StandardVersion(uint32_t version) : version(version)\r\n    {\r\n    }\r\n#endif\r\n} fsl_standard_version_t;\r\n\r\n//!@brief Memory region information table\r\ntypedef struct fsl_mem_region\r\n{\r\n    uint32_t start;\r\n    uint32_t end;\r\n} fsl_mem_region_t;\r\n\r\n//! @brief Memory Attribute Structure\r\ntypedef struct _fsl_mem_attribute\r\n{\r\n    uint32_t memId;\r\n    uint32_t regionCount;\r\n    fsl_mem_region_t *memRegions;\r\n    void *context;\r\n} fsl_mem_attribute_t;\r\n\r\ntypedef struct _fsl_arena_context\r\n{\r\n    uint32_t start;\r\n    uint32_t end;\r\n    uint32_t nextAddr;\r\n} fsl_arena_context_t;\r\n\r\n//!@brief Memory region interface structure\r\ntypedef struct fsl_api_memory_region_interface\r\n{\r\n    status_t (*init)(fsl_mem_attribute_t *attr);\r\n#if defined(ROM_API_HAS_FEATURE_MEM_READ)\r\n#if ROM_API_HAS_FEATURE_MEM_READ\r\n    status_t (*read)(fsl_mem_attribute_t *attr, uint32_t addr, uint32_t leth, uint8_t *buf);\r\n#endif\r\n#endif\r\n\r\n    status_t (*write)(fsl_mem_attribute_t *attr, uint32_t addr, uint32_t len, const uint8_t *buf);\r\n    status_t (*fill)(fsl_mem_attribute_t *attr, uint32_t addr, uint32_t len, uint32_t pattern);\r\n    status_t (*flush)(fsl_mem_attribute_t *attr);\r\n    status_t (*erase)(fsl_mem_attribute_t *attr, uint32_t addr, uint32_t len);\r\n    status_t (*config)(fsl_mem_attribute_t *attr, uint32_t *buf);\r\n    status_t (*erase_all)(fsl_mem_attribute_t *attr);\r\n    status_t (*alloc_ctx)(fsl_arena_context_t *ctx, fsl_mem_attribute_t *attr, void *miscParams);\r\n} fsl_api_memory_region_interface_t;\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n//! @brief Contiguous RAM region count\r\n#define RAM_REGION_COUNT (2U)\r\n\r\n//! @brief Contiguous FLEXSPINOR meomry count\r\n#define FLEXSPINOR_REGION_COUNT (1U)\r\n\r\n//! @brief Memory Interface count\r\n#define MEM_INTERFACE_COUNT (2U)\r\n\r\n//!@brief FlexSPI LUT Sequence structure\r\ntypedef struct _fsl_lut_sequence\r\n{\r\n    uint8_t seqNum; //!< Sequence Number, valid number: 1-16\r\n    uint8_t seqId;  //!< Sequence Index, valid number: 0-15\r\n    uint16_t reserved;\r\n} fsl_flexspi_lut_seq_t;\r\n\r\n//!@brief FlexSPI Pad Configuration Override\r\ntypedef struct\r\n{\r\n    uint8_t pu_pd_override_en;\r\n    uint8_t pu_pd_value;\r\n    uint8_t sr_config_override_en;\r\n    uint8_t sr_config_value;\r\n} fsl_flexspi_pad_config_override_t;\r\n\r\ntypedef struct\r\n{\r\n    uint8_t time_100ps;  // Data valid time, in terms of 100ps\r\n    uint8_t delay_cells; // Data valid time, in terms of delay cells\r\n} fsl_flexspi_dll_time_t;\r\n\r\n//!@brief FlexSPI Memory Configuration Block\r\ntypedef struct _fsl_FlexSPIConfig\r\n{\r\n    uint32_t tag;               //!< [0x000-0x003] Tag, fixed value 0x42464346UL\r\n    uint32_t version;           //!< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix\r\n    uint32_t reserved0;         //!< [0x008-0x00b] Reserved for future use\r\n    uint8_t readSampleClkSrc;   //!< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3\r\n    uint8_t csHoldTime;         //!< [0x00d-0x00d] CS hold time, default value: 3\r\n    uint8_t csSetupTime;        //!< [0x00e-0x00e] CS setup time, default value: 3\r\n    uint8_t columnAddressWidth; //!< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For\r\n    //! Serial NAND, need to refer to datasheet\r\n    uint8_t deviceModeCfgEnable; //!< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable\r\n    uint8_t deviceModeType; //!< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,\r\n    //! Generic configuration, etc.\r\n    uint16_t waitTimeCfgCommands; //!< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for\r\n    //! DPI/QPI/OPI switch or reset command\r\n    fsl_flexspi_lut_seq_t deviceModeSeq; //!< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] - LUt\r\n    //! sequence number, [31:16] Reserved\r\n    uint32_t deviceModeArg;    //!< [0x018-0x01b] Argument/Parameter for device configuration\r\n    uint8_t configCmdEnable;   //!< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable\r\n    uint8_t configModeType[3]; //!< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe\r\n    fsl_flexspi_lut_seq_t\r\n        configCmdSeqs[3]; //!< [0x020-0x02b] Sequence info for Device Configuration command, similar as deviceModeSeq\r\n    uint32_t reserved1;   //!< [0x02c-0x02f] Reserved for future use\r\n    uint32_t configCmdArgs[3];     //!< [0x030-0x03b] Arguments/Parameters for device Configuration commands\r\n    uint32_t reserved2;            //!< [0x03c-0x03f] Reserved for future use\r\n    uint32_t controllerMiscOption; //!< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for more\r\n    //! details\r\n    uint8_t deviceType;    //!< [0x044-0x044] Device Type:  See Flash Type Definition for more details\r\n    uint8_t sflashPadType; //!< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal\r\n    uint8_t serialClkFreq; //!< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot\r\n    //! Chapter for more details\r\n    uint8_t lutCustomSeqEnable; //!< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot\r\n    //! be done using 1 LUT sequence, currently, only applicable to HyperFLASH\r\n    uint32_t reserved3[2]; //!< [0x048-0x04f] Reserved for future use\r\n    uint32_t sflashA1Size; //!< [0x050-0x053] Size of Flash connected to A1\r\n    uint32_t sflashA2Size; //!< [0x054-0x057] Size of Flash connected to A2 (unused/not applicable on RW610)\r\n    uint32_t sflashB1Size; //!< [0x058-0x05b] Size of Flash connected to B1\r\n    uint32_t sflashB2Size; //!< [0x05c-0x05f] Size of Flash connected to B2 (unused/not applicable on RW610)\r\n    fsl_flexspi_pad_config_override_t csPadSettingOverride;   //!< [0x060-0x063] CS pad setting override value\r\n    fsl_flexspi_pad_config_override_t sclkPadSettingOverride; //!< [0x064-0x067] SCK pad setting override value\r\n    fsl_flexspi_pad_config_override_t dataPadSettingOverride; //!< [0x068-0x06b] data pad setting override value\r\n    fsl_flexspi_pad_config_override_t dqsPadSettingOverride;  //!< [0x06c-0x06f] DQS pad setting override value\r\n    uint32_t timeoutInMs;                                 //!< [0x070-0x073] Timeout threshold for read status command\r\n    uint32_t commandInterval;                             //!< [0x074-0x077] CS deselect interval between two commands\r\n    fsl_flexspi_dll_time_t dataValidTime[2]; //!< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B\r\n    uint16_t busyOffset;                 //!< [0x07c-0x07d] Busy offset, valid value: 0-31\r\n    uint16_t busyBitPolarity; //!< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -\r\n    //! busy flag is 0 when flash device is busy\r\n    uint32_t lookupTable[64];           //!< [0x080-0x17f] Lookup table holds Flash command sequences\r\n    fsl_flexspi_lut_seq_t lutCustomSeq[12]; //!< [0x180-0x1af] Customizable LUT Sequences\r\n    uint32_t dll0CrVal;                 //!> [0x1b0-0x1b3] Customizable DLL0CR setting\r\n    uint32_t dll1CrVal;                 //!> [0x1b4-0x1b7] Customizable DLL1CR setting\r\n    uint32_t reserved4[2];              //!< [0x1b8-0x1bf] Reserved for future use\r\n} fsl_flexspi_mem_config_t;\r\n\r\ntypedef struct fsl_soc_memory_map_struct\r\n{\r\n    struct\r\n    {\r\n        uint32_t start;\r\n        uint32_t end;\r\n    } ramRegions[RAM_REGION_COUNT];\r\n    struct\r\n    {\r\n        uint32_t start;\r\n        uint32_t end;\r\n    } flexspiNorRegions[FLEXSPINOR_REGION_COUNT];\r\n} fsl_soc_mem_regions_t;\r\n\r\n//!@brief Memory entry data structure\r\ntypedef struct fsl_memory_map_entry\r\n{\r\n    fsl_mem_attribute_t *memoryAttribute;\r\n    const fsl_api_memory_region_interface_t *memoryInterface;\r\n} fsl_api_memory_map_entry_t;\r\n\r\n//!@brief API initialization data structure\r\ntypedef struct fsl_kb_api_parameter_struct\r\n{\r\n    uint32_t allocStart;\r\n    uint32_t allocSize;\r\n} fsl_kp_api_init_param_t;\r\n\r\n//!@brief Memory context structure\r\ntypedef struct fsl_memory_context_struct\r\n{\r\n    status_t (*flush)(fsl_mem_attribute_t *attr);\r\n    fsl_mem_attribute_t *attr;\r\n} fsl_mem_context_t;\r\n\r\n/*\r\n *  Serial NOR configuration block\r\n */\r\ntypedef struct _fsl_flexspi_nor_config\r\n{\r\n    fsl_flexspi_mem_config_t memConfig; //!< Common memory configuration info via FlexSPI\r\n    uint32_t pageSize;              //!< Page size of Serial NOR\r\n    uint32_t sectorSize;            //!< Sector size of Serial NOR\r\n    uint8_t ipcmdSerialClkFreq;     //!< Clock frequency for IP command\r\n    uint8_t isUniformBlockSize;     //!< Sector/Block size is the same\r\n    uint8_t isDataOrderSwapped;     //!< Data order (D0, D1, D2, D3) is swapped (D1,D0, D3, D2)\r\n    uint8_t reserved0[1];           //!< Reserved for future use\r\n    uint8_t serialNorType;          //!< Serial NOR Flash type: 0/1/2/3\r\n    uint8_t needExitNoCmdMode;      //!< Need to exit NoCmd mode before other IP command\r\n    uint8_t halfClkForNonReadCmd;   //!< Half the Serial Clock for non-read command: true/false\r\n    uint8_t needRestoreNoCmdMode;   //!< Need to Restore NoCmd mode after IP commmand execution\r\n    uint32_t blockSize;             //!< Block size\r\n    uint32_t flashStateCtx;         //!< Flash State Context\r\n    uint32_t reserve2[10];          //!< Reserved for future use\r\n} fsl_flexspi_nor_config_t;\r\n\r\n//!@brief The API context structure\r\ntypedef struct fsl_api_core_context\r\n{\r\n    fsl_soc_mem_regions_t memRegions;\r\n    fsl_arena_context_t arenaCtx;\r\n    fsl_flexspi_nor_config_t flexspinorCfg;\r\n    fsl_mem_context_t memCtx;\r\n    fsl_ldr_Context_v3_t *sbloaderCtx;\r\n    fsl_nboot_context_t *nbootCtx;\r\n    uint8_t *sharedBuf;\r\n    fsl_api_memory_map_entry_t memEntries[MEM_INTERFACE_COUNT];\r\n} fsl_api_core_context_t;\r\n\r\n//!@brief IAP API Interface structure\r\ntypedef struct fsl_iap_api_interface_struct\r\n{\r\n    fsl_standard_version_t version; //!< IAP API version number.\r\n    status_t (*api_init)(fsl_api_core_context_t *coreCtx, const fsl_kp_api_init_param_t *param);\r\n    status_t (*api_deinit)(fsl_api_core_context_t *coreCtx);\r\n    status_t (*mem_init)(fsl_api_core_context_t *ctx);\r\n    status_t (*mem_read)(fsl_api_core_context_t *ctx, uint32_t addr, uint32_t len, uint8_t *buf, uint32_t memoryId);\r\n    status_t (*mem_write)(fsl_api_core_context_t *ctx, uint32_t addr, uint32_t len, const uint8_t *buf, uint32_t memoryId);\r\n    status_t (*mem_fill)(fsl_api_core_context_t *ctx, uint32_t addr, uint32_t len, uint32_t pattern, uint32_t memoryId);\r\n    status_t (*mem_flush)(fsl_api_core_context_t *ctx);\r\n    status_t (*mem_erase)(fsl_api_core_context_t *ctx, uint32_t addr, uint32_t len, uint32_t memoryId);\r\n    status_t (*mem_config)(fsl_api_core_context_t *ctx, uint32_t *buf, uint32_t memoryId);\r\n    status_t (*mem_erase_all)(fsl_api_core_context_t *ctx, uint32_t memoryId);\r\n    status_t (*fsl_sbloader_init)(fsl_api_core_context_t *ctx);\r\n    status_t (*fsl_sbloader_pump)(fsl_api_core_context_t *ctx, uint8_t *data, uint32_t length);\r\n    status_t (*fsl_sbloader_finalize)(fsl_api_core_context_t *ctx);\r\n} fsl_iap_api_interface_t;\r\n\r\n//! Function pointer definition for all loader action functions.\r\n// typedef status_t (*fsl_pLdrFnc_v3_t)(ldr_Context_v3_t *);\r\ntypedef status_t (*fsl_pLdrFnc_v3_t)(fsl_api_core_context_t *n);\r\n\r\n//! Loader context definition.\r\nstruct _fsl_ldr_Context_v3\r\n{\r\n    fsl_pLdrFnc_v3_t Action;        //!< pointer to loader action function\r\n    uint32_t block_size;        //!< size of each block in bytes\r\n    uint32_t block_data_size;   //!< data size in bytes (NBOOT_SB3_CHUNK_SIZE_IN_BYTES)\r\n    uint32_t block_data_total;  //!< data max size in bytes (block_size * data_size\r\n    uint32_t block_buffer_size; //!< block0 and block size\r\n    uint32_t block_buffer_position;\r\n    uint8_t block_buffer[MAX(NBOOT_SB3_MANIFEST_MAX_SIZE_IN_BYTES,\r\n                             NBOOT_SB3_BLOCK_MAX_SIZE_IN_BYTES)]; //! will be used for both block0 and blockx\r\n    uint32_t processedBlocks;\r\n\r\n    uint8_t data_block_offset; //! data block offset in a block.\r\n    bool in_data_block;        //!< in progress of handling a data block within a block\r\n    uint8_t *data_block;\r\n    uint32_t data_block_position;\r\n\r\n    bool in_data_section; //!< in progress of handling a data section within a data block\r\n    uint32_t data_section_handled;\r\n    fsl_sb3_section_header_t data_section_header;\r\n\r\n    bool in_data_range; //!< in progress of handling a data range within a data section\r\n    uint32_t data_range_handled;\r\n    uint32_t data_range_gap;\r\n    fsl_sb3_data_range_header_t data_range_header;\r\n    bool has_data_range_expansion;\r\n    fsl_sb3_data_range_expansion_t data_range_expansion;\r\n\r\n    uint32_t commandSet; //!< support command set during sb file handling\r\n\r\n    uint32_t data_position;\r\n    uint8_t data_buffer[SB3_DATA_BUFFER_SIZE_IN_BYTE]; //!< temporary data buffer\r\n\r\n    uint32_t fuse_cmd_position;\r\n    uint8_t fuse_cmd_buffer[32 * 4]; //!< used for fuse command\r\n};\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif // __cplusplus\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif // __cplusplus\r\n\r\n#define BIT0 (1UL << 0U)\r\n\r\nvoid power_on_device_impl(LOAD_Target_Type loadTarget);\r\nvoid power_off_device_impl(LOAD_Target_Type loadTarget);\r\nvoid reset_device(LOAD_Target_Type loadTarget);\r\nstatus_t load_service(LOAD_Target_Type loadTarget, uint32_t sourceAddr);\r\nstatus_t sb3_fw_download_impl(LOAD_Target_Type loadTarget, uint32_t flag, uint32_t sourceAddr);\r\nstatus_t sb3_fw_reset_impl(LOAD_Target_Type loadTarget, uint32_t flag, uint32_t sourceAddr);\r\nfsl_nboot_status_t nboot_hal_get_sb3_manifest_params(fsl_nboot_context_t *context, fsl_nboot_sb3_load_manifest_parms_t *parms);\r\nstatus_t loader_process_sb_file(uint32_t readOffset);\r\nstatus_t fsl_sbloader_init(fsl_api_core_context_t *ctx);\r\nstatus_t fsl_sbloader_finalize(fsl_api_core_context_t *ctx);\r\nuint8_t get_chip_revision(void);\r\n\r\n//! @}\r\n\r\n#endif /* __FSL_LOADER_UTILS_H__ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/conn_fwloader/include/fusemap.h",
    "content": "\r\n/*\r\n * Copyright 2017-2018 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n *\r\n */\r\n#ifndef __FUSEMAP_H__\r\n#define __FUSEMAP_H__\r\n\r\n#include \"fsl_device_registers.h\"\r\n\r\n/* Fuse Word LOCK_CFG0 Index 0 */\r\n#define OTP_LOCK_CFG0_FUSE_IDX (0u)\r\n\r\n#define OTP_LOCK_CFG0_FUSE_VALUE()   (OCOTP->OTP_SHADOW[OTP_LOCK_CFG0_FUSE_IDX])\r\n#define OTP_BOOT_CFG_LOCK_FUSE_IDX   (0u)\r\n#define OTP_BOOT_CFG_LOCK_FUSE_SHIFT (0u)\r\n#define OTP_BOOT_CFG_LOCK_FUSE_MASK  (0x7u)\r\n#define OTP_BOOT_CFG_LOCK_FUSE_WIDTH (3u)\r\n#define OTP_BOOT_CFG_LOCK_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_BOOT_CFG_LOCK_FUSE_IDX] & OTP_BOOT_CFG_LOCK_FUSE_MASK) >> OTP_BOOT_CFG_LOCK_FUSE_SHIFT)\r\n\r\n#define OTP_SEC_BOOT_CFG_LOCK_FUSE_IDX   (0u)\r\n#define OTP_SEC_BOOT_CFG_LOCK_FUSE_SHIFT (3u)\r\n#define OTP_SEC_BOOT_CFG_LOCK_FUSE_MASK  (0x38u)\r\n#define OTP_SEC_BOOT_CFG_LOCK_FUSE_WIDTH (3u)\r\n#define OTP_SEC_BOOT_CFG_LOCK_FUSE_VALUE()                                                    \\\r\n    ((OCOTP->OTP_SHADOW[OTP_SEC_BOOT_CFG_LOCK_FUSE_IDX] & OTP_SEC_BOOT_CFG_LOCK_FUSE_MASK) >> \\\r\n     OTP_SEC_BOOT_CFG_LOCK_FUSE_SHIFT)\r\n\r\n#define OTP_DCFG_CC_SOCU_LOCK_FUSE_IDX   (0u)\r\n#define OTP_DCFG_CC_SOCU_LOCK_FUSE_SHIFT (6u)\r\n#define OTP_DCFG_CC_SOCU_LOCK_FUSE_MASK  (0x1C0u)\r\n#define OTP_DCFG_CC_SOCU_LOCK_FUSE_WIDTH (3u)\r\n#define OTP_DCFG_CC_SOCU_LOCK_FUSE_VALUE()                                                    \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DCFG_CC_SOCU_LOCK_FUSE_IDX] & OTP_DCFG_CC_SOCU_LOCK_FUSE_MASK) >> \\\r\n     OTP_DCFG_CC_SOCU_LOCK_FUSE_SHIFT)\r\n\r\n#define OTP_DCFG_CC_SOCU_NS_LOCK_FUSE_IDX   (0u)\r\n#define OTP_DCFG_CC_SOCU_NS_LOCK_FUSE_SHIFT (9u)\r\n#define OTP_DCFG_CC_SOCU_NS_LOCK_FUSE_MASK  (0xE00u)\r\n#define OTP_DCFG_CC_SOCU_NS_LOCK_FUSE_WIDTH (3u)\r\n#define OTP_DCFG_CC_SOCU_NS_LOCK_FUSE_VALUE()                                                       \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DCFG_CC_SOCU_NS_LOCK_FUSE_IDX] & OTP_DCFG_CC_SOCU_NS_LOCK_FUSE_MASK) >> \\\r\n     OTP_DCFG_CC_SOCU_NS_LOCK_FUSE_SHIFT)\r\n\r\n#define OTP_LOCK_CFG_LOCK_FUSE_IDX   (0u)\r\n#define OTP_LOCK_CFG_LOCK_FUSE_SHIFT (12u)\r\n#define OTP_LOCK_CFG_LOCK_FUSE_MASK  (0x7000u)\r\n#define OTP_LOCK_CFG_LOCK_FUSE_WIDTH (3u)\r\n#define OTP_LOCK_CFG_LOCK_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_LOCK_CFG_LOCK_FUSE_IDX] & OTP_LOCK_CFG_LOCK_FUSE_MASK) >> OTP_LOCK_CFG_LOCK_FUSE_SHIFT)\r\n\r\n/* Fuse Word LOCK_CFG1 Index 1 */\r\n#define OTP_LOCK_CFG1_FUSE_IDX (1u)\r\n\r\n#define OTP_LOCK_CFG1_FUSE_VALUE()   (OCOTP->OTP_SHADOW[OTP_LOCK_CFG1_FUSE_IDX])\r\n#define OTP_CUST_KEY_LOCK_FUSE_IDX   (1u)\r\n#define OTP_CUST_KEY_LOCK_FUSE_SHIFT (0u)\r\n#define OTP_CUST_KEY_LOCK_FUSE_MASK  (0x7u)\r\n#define OTP_CUST_KEY_LOCK_FUSE_WIDTH (3u)\r\n#define OTP_CUST_KEY_LOCK_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_CUST_KEY_LOCK_FUSE_IDX] & OTP_CUST_KEY_LOCK_FUSE_MASK) >> OTP_CUST_KEY_LOCK_FUSE_SHIFT)\r\n\r\n#define OTP_PRINCE_CFG_FUSE_IDX   (1u)\r\n#define OTP_PRINCE_CFG_FUSE_SHIFT (3u)\r\n#define OTP_PRINCE_CFG_FUSE_MASK  (0x38u)\r\n#define OTP_PRINCE_CFG_FUSE_WIDTH (3u)\r\n#define OTP_PRINCE_CFG_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PRINCE_CFG_FUSE_IDX] & OTP_PRINCE_CFG_FUSE_MASK) >> OTP_PRINCE_CFG_FUSE_SHIFT)\r\n\r\n#define OTP_KEYSTORE_CFG_LOCK_FUSE_IDX   (1u)\r\n#define OTP_KEYSTORE_CFG_LOCK_FUSE_SHIFT (6u)\r\n#define OTP_KEYSTORE_CFG_LOCK_FUSE_MASK  (0x1C0u)\r\n#define OTP_KEYSTORE_CFG_LOCK_FUSE_WIDTH (3u)\r\n#define OTP_KEYSTORE_CFG_LOCK_FUSE_VALUE()                                                    \\\r\n    ((OCOTP->OTP_SHADOW[OTP_KEYSTORE_CFG_LOCK_FUSE_IDX] & OTP_KEYSTORE_CFG_LOCK_FUSE_MASK) >> \\\r\n     OTP_KEYSTORE_CFG_LOCK_FUSE_SHIFT)\r\n\r\n#define OTP_LIFECYCLE_LOCK_FUSE_IDX   (1u)\r\n#define OTP_LIFECYCLE_LOCK_FUSE_SHIFT (9u)\r\n#define OTP_LIFECYCLE_LOCK_FUSE_MASK  (0xE00u)\r\n#define OTP_LIFECYCLE_LOCK_FUSE_WIDTH (3u)\r\n#define OTP_LIFECYCLE_LOCK_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_LIFECYCLE_LOCK_FUSE_IDX] & OTP_LIFECYCLE_LOCK_FUSE_MASK) >> OTP_LIFECYCLE_LOCK_FUSE_SHIFT)\r\n\r\n#define OTP_CRC_HI_LOCK_FUSE_IDX   (1u)\r\n#define OTP_CRC_HI_LOCK_FUSE_SHIFT (12u)\r\n#define OTP_CRC_HI_LOCK_FUSE_MASK  (0x7000u)\r\n#define OTP_CRC_HI_LOCK_FUSE_WIDTH (3u)\r\n#define OTP_CRC_HI_LOCK_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_CRC_HI_LOCK_FUSE_IDX] & OTP_CRC_HI_LOCK_FUSE_MASK) >> OTP_CRC_HI_LOCK_FUSE_SHIFT)\r\n\r\n/* Fuse Word LOCK_CFG2 Index 2 */\r\n#define OTP_LOCK_CFG2_FUSE_IDX (2u)\r\n\r\n#define OTP_LOCK_CFG2_FUSE_VALUE()    (OCOTP->OTP_SHADOW[OTP_LOCK_CFG2_FUSE_IDX])\r\n#define OTP_OTP_SHARE_LOCK_FUSE_IDX   (2u)\r\n#define OTP_OTP_SHARE_LOCK_FUSE_SHIFT (0u)\r\n#define OTP_OTP_SHARE_LOCK_FUSE_MASK  (0x7u)\r\n#define OTP_OTP_SHARE_LOCK_FUSE_WIDTH (3u)\r\n#define OTP_OTP_SHARE_LOCK_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_OTP_SHARE_LOCK_FUSE_IDX] & OTP_OTP_SHARE_LOCK_FUSE_MASK) >> OTP_OTP_SHARE_LOCK_FUSE_SHIFT)\r\n\r\n#define OTP_ROM_PATCH_LOCK_FUSE_IDX   (2u)\r\n#define OTP_ROM_PATCH_LOCK_FUSE_SHIFT (3u)\r\n#define OTP_ROM_PATCH_LOCK_FUSE_MASK  (0x38u)\r\n#define OTP_ROM_PATCH_LOCK_FUSE_WIDTH (3u)\r\n#define OTP_ROM_PATCH_LOCK_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_ROM_PATCH_LOCK_FUSE_IDX] & OTP_ROM_PATCH_LOCK_FUSE_MASK) >> OTP_ROM_PATCH_LOCK_FUSE_SHIFT)\r\n\r\n#define OTP_NXP_KEY_LOCK_FUSE_IDX   (2u)\r\n#define OTP_NXP_KEY_LOCK_FUSE_SHIFT (6u)\r\n#define OTP_NXP_KEY_LOCK_FUSE_MASK  (0x1C0u)\r\n#define OTP_NXP_KEY_LOCK_FUSE_WIDTH (3u)\r\n#define OTP_NXP_KEY_LOCK_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_NXP_KEY_LOCK_FUSE_IDX] & OTP_NXP_KEY_LOCK_FUSE_MASK) >> OTP_NXP_KEY_LOCK_FUSE_SHIFT)\r\n\r\n#define OTP_CRC_LO_LOCK_FUSE_IDX   (2u)\r\n#define OTP_CRC_LO_LOCK_FUSE_SHIFT (9u)\r\n#define OTP_CRC_LO_LOCK_FUSE_MASK  (0xE00u)\r\n#define OTP_CRC_LO_LOCK_FUSE_WIDTH (3u)\r\n#define OTP_CRC_LO_LOCK_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_CRC_LO_LOCK_FUSE_IDX] & OTP_CRC_LO_LOCK_FUSE_MASK) >> OTP_CRC_LO_LOCK_FUSE_SHIFT)\r\n\r\n#define OTP_COMMON_LOCK_FUSE_IDX   (2u)\r\n#define OTP_COMMON_LOCK_FUSE_SHIFT (12u)\r\n#define OTP_COMMON_LOCK_FUSE_MASK  (0x7000u)\r\n#define OTP_COMMON_LOCK_FUSE_WIDTH (3u)\r\n#define OTP_COMMON_LOCK_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_COMMON_LOCK_FUSE_IDX] & OTP_COMMON_LOCK_FUSE_MASK) >> OTP_COMMON_LOCK_FUSE_SHIFT)\r\n\r\n/* Fuse Word TRIM_CFG0 Index 3 */\r\n#define OTP_TRIM_CFG0_FUSE_IDX (3u)\r\n\r\n#define OTP_TSENS_CAU_MIN_FUSE_IDX   (3u)\r\n#define OTP_TSENS_CAU_MIN_FUSE_SHIFT (0u)\r\n#define OTP_TSENS_CAU_MIN_FUSE_MASK  (0x3FFu)\r\n#define OTP_TSENS_CAU_MIN_FUSE_WIDTH (10u)\r\n\r\n#define OTP_TSENS_CAU_MAX_FUSE_IDX   (3u)\r\n#define OTP_TSENS_CAU_MAX_FUSE_SHIFT (10u)\r\n#define OTP_TSENS_CAU_MAX_FUSE_MASK  (0xFFC00u)\r\n#define OTP_TSENS_CAU_MAX_FUSE_WIDTH (10u)\r\n\r\n#define OTP_V11_SENS_MIN_FUSE_IDX   (3u)\r\n#define OTP_V11_SENS_MIN_FUSE_SHIFT (20u)\r\n#define OTP_V11_SENS_MIN_FUSE_MASK  (0x3FF00000u)\r\n#define OTP_V11_SENS_MIN_FUSE_WIDTH (10u)\r\n\r\n/* Fuse Word TRIM_CFG1 Index 4 */\r\n#define OTP_TRIM_CFG1_FUSE_IDX (4u)\r\n\r\n#define OTP_V11_SENS_MAX_FUSE_IDX   (4u)\r\n#define OTP_V11_SENS_MAX_FUSE_SHIFT (0u)\r\n#define OTP_V11_SENS_MAX_FUSE_MASK  (0x3FFu)\r\n#define OTP_V11_SENS_MAX_FUSE_WIDTH (10u)\r\n\r\n#define OTP_V18_SENS_MIN_FUSE_IDX   (4u)\r\n#define OTP_V18_SENS_MIN_FUSE_SHIFT (10u)\r\n#define OTP_V18_SENS_MIN_FUSE_MASK  (0xFFC00u)\r\n#define OTP_V18_SENS_MIN_FUSE_WIDTH (10u)\r\n\r\n#define OTP_V18_SENS_MAX_FUSE_IDX   (4u)\r\n#define OTP_V18_SENS_MAX_FUSE_SHIFT (20u)\r\n#define OTP_V18_SENS_MAX_FUSE_MASK  (0x3FF00000u)\r\n#define OTP_V18_SENS_MAX_FUSE_WIDTH (10u)\r\n\r\n/* Fuse Word CFG_STATE Index 5 */\r\n#define OTP_CFG_STATE_FUSE_IDX (5u)\r\n\r\n#define OTP_GDET_VALID_FUSE_IDX   (5u)\r\n#define OTP_GDET_VALID_FUSE_SHIFT (0u)\r\n#define OTP_GDET_VALID_FUSE_MASK  (0x1u)\r\n#define OTP_GDET_VALID_FUSE_WIDTH (1u)\r\n\r\n#define OTP_GDET_RESET_DIS_FUSE_IDX   (5u)\r\n#define OTP_GDET_RESET_DIS_FUSE_SHIFT (1u)\r\n#define OTP_GDET_RESET_DIS_FUSE_MASK  (0xEu)\r\n#define OTP_GDET_RESET_DIS_FUSE_WIDTH (3u)\r\n\r\n#define OTP_DTRNG_VALID_FUSE_IDX   (5u)\r\n#define OTP_DTRNG_VALID_FUSE_SHIFT (4u)\r\n#define OTP_DTRNG_VALID_FUSE_MASK  (0x10u)\r\n#define OTP_DTRNG_VALID_FUSE_WIDTH (1u)\r\n\r\n#define OTP_DIS_ROM_HIDING_FUSE_IDX   (5u)\r\n#define OTP_DIS_ROM_HIDING_FUSE_SHIFT (5u)\r\n#define OTP_DIS_ROM_HIDING_FUSE_MASK  (0x1E0u)\r\n#define OTP_DIS_ROM_HIDING_FUSE_WIDTH (4u)\r\n\r\n#define OTP_TSENS_CAU_VALID_FUSE_IDX   (5u)\r\n#define OTP_TSENS_CAU_VALID_FUSE_SHIFT (9u)\r\n#define OTP_TSENS_CAU_VALID_FUSE_MASK  (0x200u)\r\n#define OTP_TSENS_CAU_VALID_FUSE_WIDTH (1u)\r\n\r\n#define OTP_V11_SENS_VALID_FUSE_IDX   (5u)\r\n#define OTP_V11_SENS_VALID_FUSE_SHIFT (10u)\r\n#define OTP_V11_SENS_VALID_FUSE_MASK  (0x400u)\r\n#define OTP_V11_SENS_VALID_FUSE_WIDTH (1u)\r\n\r\n#define OTP_V18_SENS_VALID_FUSE_IDX   (5u)\r\n#define OTP_V18_SENS_VALID_FUSE_SHIFT (11u)\r\n#define OTP_V18_SENS_VALID_FUSE_MASK  (0x800u)\r\n#define OTP_V18_SENS_VALID_FUSE_WIDTH (1u)\r\n\r\n#define OTP_RCAL_VALUE_FUSE_IDX   (5u)\r\n#define OTP_RCAL_VALUE_FUSE_SHIFT (12u)\r\n#define OTP_RCAL_VALUE_FUSE_MASK  (0x7F000u)\r\n#define OTP_RCAL_VALUE_FUSE_WIDTH (7u)\r\n\r\n#define OTP_RCAL_VALID_FUSE_IDX   (5u)\r\n#define OTP_RCAL_VALID_FUSE_SHIFT (19u)\r\n#define OTP_RCAL_VALID_FUSE_MASK  (0x80000u)\r\n#define OTP_RCAL_VALID_FUSE_WIDTH (1u)\r\n\r\n#define OTP_DISABLE_15_4_FUSE_IDX   (5u)\r\n#define OTP_DISABLE_15_4_FUSE_SHIFT (20u)\r\n#define OTP_DISABLE_15_4_FUSE_MASK  (0x100000u)\r\n#define OTP_DISABLE_15_4_FUSE_WIDTH (1u)\r\n\r\n/* Fuse Word ITRC_CHIP_RESET_SEL0 Index 6 */\r\n#define OTP_ITRC_CHIP_RESET_SEL0_FUSE_IDX (6u)\r\n\r\n/* Fuse Word ITRC_CHIP_RESET_SEL1 Index 7 */\r\n#define OTP_ITRC_CHIP_RESET_SEL1_FUSE_IDX (7u)\r\n\r\n/* Fuse Word SYSCTL0_PRODUCT_ID Index 9 */\r\n#define OTP_SYSCTL0_PRODUCT_ID_FUSE_IDX (9u)\r\n\r\n#define OTP_SYSCTL0_PRODUCT_ID_FUSE_IDX   (9u)\r\n#define OTP_SYSCTL0_PRODUCT_ID_FUSE_SHIFT (0u)\r\n#define OTP_SYSCTL0_PRODUCT_ID_FUSE_MASK  (0xFFFFu)\r\n#define OTP_SYSCTL0_PRODUCT_ID_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word SYSOSC_ST Index 10 */\r\n#define OTP_SYSOSC_ST_FUSE_IDX (10u)\r\n\r\n#define OTP_SYSOSC_ST_31_0_FUSE_IDX   (10u)\r\n#define OTP_SYSOSC_ST_31_0_FUSE_SHIFT (0u)\r\n#define OTP_SYSOSC_ST_31_0_FUSE_MASK  (0xFFFFFFFFu)\r\n#define OTP_SYSOSC_ST_31_0_FUSE_WIDTH (32u)\r\n\r\n/* Fuse Word SYSCTL0_AUTOCLKGATEOVERRIDE0 Index 11 */\r\n#define OTP_SYSCTL0_AUTOCLKGATEOVERRIDE0_FUSE_IDX (11u)\r\n\r\n/* Fuse Word SYSCTL0_AUTOCLKGATEOVERRIDE1 Index 12 */\r\n#define OTP_SYSCTL0_AUTOCLKGATEOVERRIDE1_FUSE_IDX (12u)\r\n\r\n#define OTP_SYSCTL0_AUTOCLKGATEOVERRIDE1_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_SYSCTL0_AUTOCLKGATEOVERRIDE1_FUSE_IDX])\r\n/* Fuse Word BOOT_CFG0 Index 15 */\r\n#define OTP_BOOT_CFG0_FUSE_IDX (15u)\r\n\r\n#define OTP_BOOT_CFG0_FUSE_VALUE()         (OCOTP->OTP_SHADOW[OTP_BOOT_CFG0_FUSE_IDX])\r\n#define OTP_PRIMARY_BOOT_SOURCE_FUSE_IDX   (15u)\r\n#define OTP_PRIMARY_BOOT_SOURCE_FUSE_SHIFT (0u)\r\n#define OTP_PRIMARY_BOOT_SOURCE_FUSE_MASK  (0xFu)\r\n#define OTP_PRIMARY_BOOT_SOURCE_FUSE_WIDTH (4u)\r\n#define OTP_PRIMARY_BOOT_SOURCE_FUSE_VALUE()                                                      \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PRIMARY_BOOT_SOURCE_FUSE_IDX] & OTP_PRIMARY_BOOT_SOURCE_FUSE_MASK) >> \\\r\n     OTP_PRIMARY_BOOT_SOURCE_FUSE_SHIFT)\r\n\r\n#define OTP_DEFAULT_ISP_MODE_FUSE_IDX   (15u)\r\n#define OTP_DEFAULT_ISP_MODE_FUSE_SHIFT (4u)\r\n#define OTP_DEFAULT_ISP_MODE_FUSE_MASK  (0x70u)\r\n#define OTP_DEFAULT_ISP_MODE_FUSE_WIDTH (3u)\r\n#define OTP_DEFAULT_ISP_MODE_FUSE_VALUE()                                                   \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DEFAULT_ISP_MODE_FUSE_IDX] & OTP_DEFAULT_ISP_MODE_FUSE_MASK) >> \\\r\n     OTP_DEFAULT_ISP_MODE_FUSE_SHIFT)\r\n\r\n#define OTP_BOOT_CLK_SPEED_FUSE_IDX   (15u)\r\n#define OTP_BOOT_CLK_SPEED_FUSE_SHIFT (7u)\r\n#define OTP_BOOT_CLK_SPEED_FUSE_MASK  (0x80u)\r\n#define OTP_BOOT_CLK_SPEED_FUSE_WIDTH (1u)\r\n#define OTP_BOOT_CLK_SPEED_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_BOOT_CLK_SPEED_FUSE_IDX] & OTP_BOOT_CLK_SPEED_FUSE_MASK) >> OTP_BOOT_CLK_SPEED_FUSE_SHIFT)\r\n\r\n#define OTP_STOP_ON_FAILURE_FUSE_IDX   (15u)\r\n#define OTP_STOP_ON_FAILURE_FUSE_SHIFT (10u)\r\n#define OTP_STOP_ON_FAILURE_FUSE_MASK  (0x400u)\r\n#define OTP_STOP_ON_FAILURE_FUSE_WIDTH (1u)\r\n#define OTP_STOP_ON_FAILURE_FUSE_VALUE()                                                  \\\r\n    ((OCOTP->OTP_SHADOW[OTP_STOP_ON_FAILURE_FUSE_IDX] & OTP_STOP_ON_FAILURE_FUSE_MASK) >> \\\r\n     OTP_STOP_ON_FAILURE_FUSE_SHIFT)\r\n\r\n#define OTP_22_PRINCE_GCM_ROUNDS_FUSE_IDX   (15u)\r\n#define OTP_22_PRINCE_GCM_ROUNDS_FUSE_SHIFT (11u)\r\n#define OTP_22_PRINCE_GCM_ROUNDS_FUSE_MASK  (0x800u)\r\n#define OTP_22_PRINCE_GCM_ROUNDS_FUSE_WIDTH (1u)\r\n#define OTP_22_PRINCE_GCM_ROUNDS_FUSE_VALUE()                                                       \\\r\n    ((OCOTP->OTP_SHADOW[OTP_22_PRINCE_GCM_ROUNDS_FUSE_IDX] & OTP_22_PRINCE_GCM_ROUNDS_FUSE_MASK) >> \\\r\n     OTP_22_PRINCE_GCM_ROUNDS_FUSE_SHIFT)\r\n\r\n#define OTP_TZM_IMAGE_TYPE_FUSE_IDX   (15u)\r\n#define OTP_TZM_IMAGE_TYPE_FUSE_SHIFT (12u)\r\n#define OTP_TZM_IMAGE_TYPE_FUSE_MASK  (0x3000u)\r\n#define OTP_TZM_IMAGE_TYPE_FUSE_WIDTH (2u)\r\n#define OTP_TZM_IMAGE_TYPE_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_TZM_IMAGE_TYPE_FUSE_IDX] & OTP_TZM_IMAGE_TYPE_FUSE_MASK) >> OTP_TZM_IMAGE_TYPE_FUSE_SHIFT)\r\n\r\n#define OTP_PSA_BSTATE_SKIP_FUSE_IDX   (15u)\r\n#define OTP_PSA_BSTATE_SKIP_FUSE_SHIFT (14u)\r\n#define OTP_PSA_BSTATE_SKIP_FUSE_MASK  (0x4000u)\r\n#define OTP_PSA_BSTATE_SKIP_FUSE_WIDTH (1u)\r\n#define OTP_PSA_BSTATE_SKIP_FUSE_VALUE()                                                  \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PSA_BSTATE_SKIP_FUSE_IDX] & OTP_PSA_BSTATE_SKIP_FUSE_MASK) >> \\\r\n     OTP_PSA_BSTATE_SKIP_FUSE_SHIFT)\r\n\r\n#define OTP_PSA_BSTATE_INC_KEYS_FUSE_IDX   (15u)\r\n#define OTP_PSA_BSTATE_INC_KEYS_FUSE_SHIFT (15u)\r\n#define OTP_PSA_BSTATE_INC_KEYS_FUSE_MASK  (0x8000u)\r\n#define OTP_PSA_BSTATE_INC_KEYS_FUSE_WIDTH (1u)\r\n#define OTP_PSA_BSTATE_INC_KEYS_FUSE_VALUE()                                                      \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PSA_BSTATE_INC_KEYS_FUSE_IDX] & OTP_PSA_BSTATE_INC_KEYS_FUSE_MASK) >> \\\r\n     OTP_PSA_BSTATE_INC_KEYS_FUSE_SHIFT)\r\n\r\n#define OTP_REDUNDANT_SPI_PORT_FUSE_IDX   (15u)\r\n#define OTP_REDUNDANT_SPI_PORT_FUSE_SHIFT (16u)\r\n#define OTP_REDUNDANT_SPI_PORT_FUSE_MASK  (0x70000u)\r\n#define OTP_REDUNDANT_SPI_PORT_FUSE_WIDTH (3u)\r\n#define OTP_REDUNDANT_SPI_PORT_FUSE_VALUE()                                                     \\\r\n    ((OCOTP->OTP_SHADOW[OTP_REDUNDANT_SPI_PORT_FUSE_IDX] & OTP_REDUNDANT_SPI_PORT_FUSE_MASK) >> \\\r\n     OTP_REDUNDANT_SPI_PORT_FUSE_SHIFT)\r\n\r\n#define OTP_SECURE_BOOT_EN_FUSE_IDX   (15u)\r\n#define OTP_SECURE_BOOT_EN_FUSE_SHIFT (19u)\r\n#define OTP_SECURE_BOOT_EN_FUSE_MASK  (0x180000u)\r\n#define OTP_SECURE_BOOT_EN_FUSE_WIDTH (2u)\r\n#define OTP_SECURE_BOOT_EN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_SECURE_BOOT_EN_FUSE_IDX] & OTP_SECURE_BOOT_EN_FUSE_MASK) >> OTP_SECURE_BOOT_EN_FUSE_SHIFT)\r\n\r\n#define OTP_DICE_INC_OTP_FUSE_IDX   (15u)\r\n#define OTP_DICE_INC_OTP_FUSE_SHIFT (22u)\r\n#define OTP_DICE_INC_OTP_FUSE_MASK  (0x400000u)\r\n#define OTP_DICE_INC_OTP_FUSE_WIDTH (1u)\r\n#define OTP_DICE_INC_OTP_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DICE_INC_OTP_FUSE_IDX] & OTP_DICE_INC_OTP_FUSE_MASK) >> OTP_DICE_INC_OTP_FUSE_SHIFT)\r\n\r\n#define OTP_DICE_SKIP_FUSE_IDX   (15u)\r\n#define OTP_DICE_SKIP_FUSE_SHIFT (23u)\r\n#define OTP_DICE_SKIP_FUSE_MASK  (0x800000u)\r\n#define OTP_DICE_SKIP_FUSE_WIDTH (1u)\r\n#define OTP_DICE_SKIP_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DICE_SKIP_FUSE_IDX] & OTP_DICE_SKIP_FUSE_MASK) >> OTP_DICE_SKIP_FUSE_SHIFT)\r\n\r\n#define OTP_BOOT_FAIL_PORT_FUSE_IDX   (15u)\r\n#define OTP_BOOT_FAIL_PORT_FUSE_SHIFT (24u)\r\n#define OTP_BOOT_FAIL_PORT_FUSE_MASK  (0x7000000u)\r\n#define OTP_BOOT_FAIL_PORT_FUSE_WIDTH (3u)\r\n#define OTP_BOOT_FAIL_PORT_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_BOOT_FAIL_PORT_FUSE_IDX] & OTP_BOOT_FAIL_PORT_FUSE_MASK) >> OTP_BOOT_FAIL_PORT_FUSE_SHIFT)\r\n\r\n#define OTP_BOOT_FAIL_PIN_FUSE_IDX   (15u)\r\n#define OTP_BOOT_FAIL_PIN_FUSE_SHIFT (27u)\r\n#define OTP_BOOT_FAIL_PIN_FUSE_MASK  (0xF8000000u)\r\n#define OTP_BOOT_FAIL_PIN_FUSE_WIDTH (5u)\r\n#define OTP_BOOT_FAIL_PIN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_BOOT_FAIL_PIN_FUSE_IDX] & OTP_BOOT_FAIL_PIN_FUSE_MASK) >> OTP_BOOT_FAIL_PIN_FUSE_SHIFT)\r\n\r\n/* Fuse Word BOOT_CFG1 Index 16 */\r\n#define OTP_BOOT_CFG1_FUSE_IDX (16u)\r\n\r\n#define OTP_BOOT_CFG1_FUSE_VALUE()        (OCOTP->OTP_SHADOW[OTP_BOOT_CFG1_FUSE_IDX])\r\n#define OTP_QSPI_AUTO_PROBE_EN_FUSE_IDX   (16u)\r\n#define OTP_QSPI_AUTO_PROBE_EN_FUSE_SHIFT (0u)\r\n#define OTP_QSPI_AUTO_PROBE_EN_FUSE_MASK  (0x1u)\r\n#define OTP_QSPI_AUTO_PROBE_EN_FUSE_WIDTH (1u)\r\n#define OTP_QSPI_AUTO_PROBE_EN_FUSE_VALUE()                                                     \\\r\n    ((OCOTP->OTP_SHADOW[OTP_QSPI_AUTO_PROBE_EN_FUSE_IDX] & OTP_QSPI_AUTO_PROBE_EN_FUSE_MASK) >> \\\r\n     OTP_QSPI_AUTO_PROBE_EN_FUSE_SHIFT)\r\n\r\n#define OTP_QSPI_PROBE_TYPE_FUSE_IDX   (16u)\r\n#define OTP_QSPI_PROBE_TYPE_FUSE_SHIFT (1u)\r\n#define OTP_QSPI_PROBE_TYPE_FUSE_MASK  (0xEu)\r\n#define OTP_QSPI_PROBE_TYPE_FUSE_WIDTH (3u)\r\n#define OTP_QSPI_PROBE_TYPE_FUSE_VALUE()                                                  \\\r\n    ((OCOTP->OTP_SHADOW[OTP_QSPI_PROBE_TYPE_FUSE_IDX] & OTP_QSPI_PROBE_TYPE_FUSE_MASK) >> \\\r\n     OTP_QSPI_PROBE_TYPE_FUSE_SHIFT)\r\n\r\n#define OTP_QSPI_FLASH_TYPE_FUSE_IDX   (16u)\r\n#define OTP_QSPI_FLASH_TYPE_FUSE_SHIFT (4u)\r\n#define OTP_QSPI_FLASH_TYPE_FUSE_MASK  (0x70u)\r\n#define OTP_QSPI_FLASH_TYPE_FUSE_WIDTH (3u)\r\n#define OTP_QSPI_FLASH_TYPE_FUSE_VALUE()                                                  \\\r\n    ((OCOTP->OTP_SHADOW[OTP_QSPI_FLASH_TYPE_FUSE_IDX] & OTP_QSPI_FLASH_TYPE_FUSE_MASK) >> \\\r\n     OTP_QSPI_FLASH_TYPE_FUSE_SHIFT)\r\n\r\n#define OTP_QSPI_DUMMY_CYCLES_FUSE_IDX   (16u)\r\n#define OTP_QSPI_DUMMY_CYCLES_FUSE_SHIFT (7u)\r\n#define OTP_QSPI_DUMMY_CYCLES_FUSE_MASK  (0x780u)\r\n#define OTP_QSPI_DUMMY_CYCLES_FUSE_WIDTH (4u)\r\n#define OTP_QSPI_DUMMY_CYCLES_FUSE_VALUE()                                                    \\\r\n    ((OCOTP->OTP_SHADOW[OTP_QSPI_DUMMY_CYCLES_FUSE_IDX] & OTP_QSPI_DUMMY_CYCLES_FUSE_MASK) >> \\\r\n     OTP_QSPI_DUMMY_CYCLES_FUSE_SHIFT)\r\n\r\n#define OTP_QSPI_FREQUENCY_FUSE_IDX   (16u)\r\n#define OTP_QSPI_FREQUENCY_FUSE_SHIFT (11u)\r\n#define OTP_QSPI_FREQUENCY_FUSE_MASK  (0x3800u)\r\n#define OTP_QSPI_FREQUENCY_FUSE_WIDTH (3u)\r\n#define OTP_QSPI_FREQUENCY_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_QSPI_FREQUENCY_FUSE_IDX] & OTP_QSPI_FREQUENCY_FUSE_MASK) >> OTP_QSPI_FREQUENCY_FUSE_SHIFT)\r\n\r\n#define OTP_QSPI_RESET_PIN_ENABLE_FUSE_IDX   (16u)\r\n#define OTP_QSPI_RESET_PIN_ENABLE_FUSE_SHIFT (14u)\r\n#define OTP_QSPI_RESET_PIN_ENABLE_FUSE_MASK  (0x4000u)\r\n#define OTP_QSPI_RESET_PIN_ENABLE_FUSE_WIDTH (1u)\r\n#define OTP_QSPI_RESET_PIN_ENABLE_FUSE_VALUE()                                                        \\\r\n    ((OCOTP->OTP_SHADOW[OTP_QSPI_RESET_PIN_ENABLE_FUSE_IDX] & OTP_QSPI_RESET_PIN_ENABLE_FUSE_MASK) >> \\\r\n     OTP_QSPI_RESET_PIN_ENABLE_FUSE_SHIFT)\r\n\r\n#define OTP_QSPI_RESET_PIN_FUSE_IDX   (16u)\r\n#define OTP_QSPI_RESET_PIN_FUSE_SHIFT (15u)\r\n#define OTP_QSPI_RESET_PIN_FUSE_MASK  (0x7F8000u)\r\n#define OTP_QSPI_RESET_PIN_FUSE_WIDTH (8u)\r\n#define OTP_QSPI_RESET_PIN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_QSPI_RESET_PIN_FUSE_IDX] & OTP_QSPI_RESET_PIN_FUSE_MASK) >> OTP_QSPI_RESET_PIN_FUSE_SHIFT)\r\n\r\n#define OTP_QSPI_HOLD_TIME_FUSE_IDX   (16u)\r\n#define OTP_QSPI_HOLD_TIME_FUSE_SHIFT (23u)\r\n#define OTP_QSPI_HOLD_TIME_FUSE_MASK  (0x1800000u)\r\n#define OTP_QSPI_HOLD_TIME_FUSE_WIDTH (2u)\r\n#define OTP_QSPI_HOLD_TIME_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_QSPI_HOLD_TIME_FUSE_IDX] & OTP_QSPI_HOLD_TIME_FUSE_MASK) >> OTP_QSPI_HOLD_TIME_FUSE_SHIFT)\r\n\r\n#define OTP_QSPI_PWR_HOLD_TIME_FUSE_IDX   (16u)\r\n#define OTP_QSPI_PWR_HOLD_TIME_FUSE_SHIFT (25u)\r\n#define OTP_QSPI_PWR_HOLD_TIME_FUSE_MASK  (0x1E000000u)\r\n#define OTP_QSPI_PWR_HOLD_TIME_FUSE_WIDTH (4u)\r\n#define OTP_QSPI_PWR_HOLD_TIME_FUSE_VALUE()                                                     \\\r\n    ((OCOTP->OTP_SHADOW[OTP_QSPI_PWR_HOLD_TIME_FUSE_IDX] & OTP_QSPI_PWR_HOLD_TIME_FUSE_MASK) >> \\\r\n     OTP_QSPI_PWR_HOLD_TIME_FUSE_SHIFT)\r\n\r\n/* Fuse Word BOOT_CFG2 Index 17 */\r\n#define OTP_BOOT_CFG2_FUSE_IDX (17u)\r\n\r\n#define OTP_BOOT_CFG2_FUSE_VALUE()     (OCOTP->OTP_SHADOW[OTP_BOOT_CFG2_FUSE_IDX])\r\n#define OTP_QSPI_IMAGE_SIZE_FUSE_IDX   (17u)\r\n#define OTP_QSPI_IMAGE_SIZE_FUSE_SHIFT (0u)\r\n#define OTP_QSPI_IMAGE_SIZE_FUSE_MASK  (0xFu)\r\n#define OTP_QSPI_IMAGE_SIZE_FUSE_WIDTH (4u)\r\n#define OTP_QSPI_IMAGE_SIZE_FUSE_VALUE()                                                  \\\r\n    ((OCOTP->OTP_SHADOW[OTP_QSPI_IMAGE_SIZE_FUSE_IDX] & OTP_QSPI_IMAGE_SIZE_FUSE_MASK) >> \\\r\n     OTP_QSPI_IMAGE_SIZE_FUSE_SHIFT)\r\n\r\n#define OTP_QSPI_DELAY_CELL_NUM_FUSE_IDX   (17u)\r\n#define OTP_QSPI_DELAY_CELL_NUM_FUSE_SHIFT (4u)\r\n#define OTP_QSPI_DELAY_CELL_NUM_FUSE_MASK  (0x7F0u)\r\n#define OTP_QSPI_DELAY_CELL_NUM_FUSE_WIDTH (7u)\r\n#define OTP_QSPI_DELAY_CELL_NUM_FUSE_VALUE()                                                      \\\r\n    ((OCOTP->OTP_SHADOW[OTP_QSPI_DELAY_CELL_NUM_FUSE_IDX] & OTP_QSPI_DELAY_CELL_NUM_FUSE_MASK) >> \\\r\n     OTP_QSPI_DELAY_CELL_NUM_FUSE_SHIFT)\r\n\r\n#define OTP_QSPI_IMAGE_OFFSET_FUSE_IDX   (17u)\r\n#define OTP_QSPI_IMAGE_OFFSET_FUSE_SHIFT (11u)\r\n#define OTP_QSPI_IMAGE_OFFSET_FUSE_MASK  (0x1FF800u)\r\n#define OTP_QSPI_IMAGE_OFFSET_FUSE_WIDTH (10u)\r\n#define OTP_QSPI_IMAGE_OFFSET_FUSE_VALUE()                                                    \\\r\n    ((OCOTP->OTP_SHADOW[OTP_QSPI_IMAGE_OFFSET_FUSE_IDX] & OTP_QSPI_IMAGE_OFFSET_FUSE_MASK) >> \\\r\n     OTP_QSPI_IMAGE_OFFSET_FUSE_SHIFT)\r\n\r\n/* Fuse Word BOOT_CFG3 Index 18 */\r\n#define OTP_BOOT_CFG3_FUSE_IDX (18u)\r\n\r\n#define OTP_BOOT_CFG3_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_BOOT_CFG3_FUSE_IDX])\r\n#define OTP_ROTK0_USAGE_FUSE_IDX   (18u)\r\n#define OTP_ROTK0_USAGE_FUSE_SHIFT (0u)\r\n#define OTP_ROTK0_USAGE_FUSE_MASK  (0x7u)\r\n#define OTP_ROTK0_USAGE_FUSE_WIDTH (3u)\r\n#define OTP_ROTK0_USAGE_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_ROTK0_USAGE_FUSE_IDX] & OTP_ROTK0_USAGE_FUSE_MASK) >> OTP_ROTK0_USAGE_FUSE_SHIFT)\r\n\r\n#define OTP_ROTK1_USAGE_FUSE_IDX   (18u)\r\n#define OTP_ROTK1_USAGE_FUSE_SHIFT (3u)\r\n#define OTP_ROTK1_USAGE_FUSE_MASK  (0x38u)\r\n#define OTP_ROTK1_USAGE_FUSE_WIDTH (3u)\r\n#define OTP_ROTK1_USAGE_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_ROTK1_USAGE_FUSE_IDX] & OTP_ROTK1_USAGE_FUSE_MASK) >> OTP_ROTK1_USAGE_FUSE_SHIFT)\r\n\r\n#define OTP_ROTK2_USAGE_FUSE_IDX   (18u)\r\n#define OTP_ROTK2_USAGE_FUSE_SHIFT (6u)\r\n#define OTP_ROTK2_USAGE_FUSE_MASK  (0x1C0u)\r\n#define OTP_ROTK2_USAGE_FUSE_WIDTH (3u)\r\n#define OTP_ROTK2_USAGE_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_ROTK2_USAGE_FUSE_IDX] & OTP_ROTK2_USAGE_FUSE_MASK) >> OTP_ROTK2_USAGE_FUSE_SHIFT)\r\n\r\n#define OTP_ROTK3_USAGE_FUSE_IDX   (18u)\r\n#define OTP_ROTK3_USAGE_FUSE_SHIFT (9u)\r\n#define OTP_ROTK3_USAGE_FUSE_MASK  (0xE00u)\r\n#define OTP_ROTK3_USAGE_FUSE_WIDTH (3u)\r\n#define OTP_ROTK3_USAGE_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_ROTK3_USAGE_FUSE_IDX] & OTP_ROTK3_USAGE_FUSE_MASK) >> OTP_ROTK3_USAGE_FUSE_SHIFT)\r\n\r\n#define OTP_ITRC_ZEROIZE_FUSE_IDX   (18u)\r\n#define OTP_ITRC_ZEROIZE_FUSE_SHIFT (12u)\r\n#define OTP_ITRC_ZEROIZE_FUSE_MASK  (0x3000u)\r\n#define OTP_ITRC_ZEROIZE_FUSE_WIDTH (2u)\r\n#define OTP_ITRC_ZEROIZE_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_ITRC_ZEROIZE_FUSE_IDX] & OTP_ITRC_ZEROIZE_FUSE_MASK) >> OTP_ITRC_ZEROIZE_FUSE_SHIFT)\r\n\r\n#define OTP_PRINCE_ENABLE_FUSE_IDX   (18u)\r\n#define OTP_PRINCE_ENABLE_FUSE_SHIFT (14u)\r\n#define OTP_PRINCE_ENABLE_FUSE_MASK  (0x4000u)\r\n#define OTP_PRINCE_ENABLE_FUSE_WIDTH (1u)\r\n#define OTP_PRINCE_ENABLE_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PRINCE_ENABLE_FUSE_IDX] & OTP_PRINCE_ENABLE_FUSE_MASK) >> OTP_PRINCE_ENABLE_FUSE_SHIFT)\r\n\r\n#define OTP_ENF_CNSA_FUSE_IDX   (18u)\r\n#define OTP_ENF_CNSA_FUSE_SHIFT (15u)\r\n#define OTP_ENF_CNSA_FUSE_MASK  (0x18000u)\r\n#define OTP_ENF_CNSA_FUSE_WIDTH (2u)\r\n#define OTP_ENF_CNSA_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_ENF_CNSA_FUSE_IDX] & OTP_ENF_CNSA_FUSE_MASK) >> OTP_ENF_CNSA_FUSE_SHIFT)\r\n\r\n#define OTP_ENABLE_CRC_CHECK_FUSE_IDX   (18u)\r\n#define OTP_ENABLE_CRC_CHECK_FUSE_SHIFT (17u)\r\n#define OTP_ENABLE_CRC_CHECK_FUSE_MASK  (0x60000u)\r\n#define OTP_ENABLE_CRC_CHECK_FUSE_WIDTH (2u)\r\n#define OTP_ENABLE_CRC_CHECK_FUSE_VALUE()                                                   \\\r\n    ((OCOTP->OTP_SHADOW[OTP_ENABLE_CRC_CHECK_FUSE_IDX] & OTP_ENABLE_CRC_CHECK_FUSE_MASK) >> \\\r\n     OTP_ENABLE_CRC_CHECK_FUSE_SHIFT)\r\n\r\n#define OTP_USE_PUF_FUSE_IDX   (18u)\r\n#define OTP_USE_PUF_FUSE_SHIFT (19u)\r\n#define OTP_USE_PUF_FUSE_MASK  (0x80000u)\r\n#define OTP_USE_PUF_FUSE_WIDTH (1u)\r\n#define OTP_USE_PUF_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_USE_PUF_FUSE_IDX] & OTP_USE_PUF_FUSE_MASK) >> OTP_USE_PUF_FUSE_SHIFT)\r\n\r\n#define OTP_PUF_BLOCK_ENROLL_FUSE_IDX   (18u)\r\n#define OTP_PUF_BLOCK_ENROLL_FUSE_SHIFT (20u)\r\n#define OTP_PUF_BLOCK_ENROLL_FUSE_MASK  (0x100000u)\r\n#define OTP_PUF_BLOCK_ENROLL_FUSE_WIDTH (1u)\r\n#define OTP_PUF_BLOCK_ENROLL_FUSE_VALUE()                                                   \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PUF_BLOCK_ENROLL_FUSE_IDX] & OTP_PUF_BLOCK_ENROLL_FUSE_MASK) >> \\\r\n     OTP_PUF_BLOCK_ENROLL_FUSE_SHIFT)\r\n\r\n#define OTP_PUF_BLOCK_SET_KEY_FUSE_IDX   (18u)\r\n#define OTP_PUF_BLOCK_SET_KEY_FUSE_SHIFT (21u)\r\n#define OTP_PUF_BLOCK_SET_KEY_FUSE_MASK  (0x200000u)\r\n#define OTP_PUF_BLOCK_SET_KEY_FUSE_WIDTH (1u)\r\n#define OTP_PUF_BLOCK_SET_KEY_FUSE_VALUE()                                                    \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PUF_BLOCK_SET_KEY_FUSE_IDX] & OTP_PUF_BLOCK_SET_KEY_FUSE_MASK) >> \\\r\n     OTP_PUF_BLOCK_SET_KEY_FUSE_SHIFT)\r\n\r\n#define OTP_FIPS_KDF_STEN_FUSE_IDX   (18u)\r\n#define OTP_FIPS_KDF_STEN_FUSE_SHIFT (22u)\r\n#define OTP_FIPS_KDF_STEN_FUSE_MASK  (0x400000u)\r\n#define OTP_FIPS_KDF_STEN_FUSE_WIDTH (1u)\r\n#define OTP_FIPS_KDF_STEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_FIPS_KDF_STEN_FUSE_IDX] & OTP_FIPS_KDF_STEN_FUSE_MASK) >> OTP_FIPS_KDF_STEN_FUSE_SHIFT)\r\n\r\n#define OTP_FIPS_CMAC_STEN_FUSE_IDX   (18u)\r\n#define OTP_FIPS_CMAC_STEN_FUSE_SHIFT (23u)\r\n#define OTP_FIPS_CMAC_STEN_FUSE_MASK  (0x800000u)\r\n#define OTP_FIPS_CMAC_STEN_FUSE_WIDTH (1u)\r\n#define OTP_FIPS_CMAC_STEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_FIPS_CMAC_STEN_FUSE_IDX] & OTP_FIPS_CMAC_STEN_FUSE_MASK) >> OTP_FIPS_CMAC_STEN_FUSE_SHIFT)\r\n\r\n#define OTP_FIPS_DRBG_STEN_FUSE_IDX   (18u)\r\n#define OTP_FIPS_DRBG_STEN_FUSE_SHIFT (24u)\r\n#define OTP_FIPS_DRBG_STEN_FUSE_MASK  (0x1000000u)\r\n#define OTP_FIPS_DRBG_STEN_FUSE_WIDTH (1u)\r\n#define OTP_FIPS_DRBG_STEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_FIPS_DRBG_STEN_FUSE_IDX] & OTP_FIPS_DRBG_STEN_FUSE_MASK) >> OTP_FIPS_DRBG_STEN_FUSE_SHIFT)\r\n\r\n#define OTP_FIPS_ECDSA_STEN_FUSE_IDX   (18u)\r\n#define OTP_FIPS_ECDSA_STEN_FUSE_SHIFT (25u)\r\n#define OTP_FIPS_ECDSA_STEN_FUSE_MASK  (0x2000000u)\r\n#define OTP_FIPS_ECDSA_STEN_FUSE_WIDTH (1u)\r\n#define OTP_FIPS_ECDSA_STEN_FUSE_VALUE()                                                  \\\r\n    ((OCOTP->OTP_SHADOW[OTP_FIPS_ECDSA_STEN_FUSE_IDX] & OTP_FIPS_ECDSA_STEN_FUSE_MASK) >> \\\r\n     OTP_FIPS_ECDSA_STEN_FUSE_SHIFT)\r\n\r\n#define OTP_FIPS_AES_STEN_FUSE_IDX   (18u)\r\n#define OTP_FIPS_AES_STEN_FUSE_SHIFT (26u)\r\n#define OTP_FIPS_AES_STEN_FUSE_MASK  (0x4000000u)\r\n#define OTP_FIPS_AES_STEN_FUSE_WIDTH (1u)\r\n#define OTP_FIPS_AES_STEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_FIPS_AES_STEN_FUSE_IDX] & OTP_FIPS_AES_STEN_FUSE_MASK) >> OTP_FIPS_AES_STEN_FUSE_SHIFT)\r\n\r\n#define OTP_FIPS_SHA_STEN_FUSE_IDX   (18u)\r\n#define OTP_FIPS_SHA_STEN_FUSE_SHIFT (27u)\r\n#define OTP_FIPS_SHA_STEN_FUSE_MASK  (0x8000000u)\r\n#define OTP_FIPS_SHA_STEN_FUSE_WIDTH (1u)\r\n#define OTP_FIPS_SHA_STEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_FIPS_SHA_STEN_FUSE_IDX] & OTP_FIPS_SHA_STEN_FUSE_MASK) >> OTP_FIPS_SHA_STEN_FUSE_SHIFT)\r\n\r\n#define OTP_SKIP_PM_SIGN_VERIFCATION_FUSE_IDX   (18u)\r\n#define OTP_SKIP_PM_SIGN_VERIFCATION_FUSE_SHIFT (28u)\r\n#define OTP_SKIP_PM_SIGN_VERIFCATION_FUSE_MASK  (0x30000000u)\r\n#define OTP_SKIP_PM_SIGN_VERIFCATION_FUSE_WIDTH (2u)\r\n#define OTP_SKIP_PM_SIGN_VERIFCATION_FUSE_VALUE()                                                           \\\r\n    ((OCOTP->OTP_SHADOW[OTP_SKIP_PM_SIGN_VERIFCATION_FUSE_IDX] & OTP_SKIP_PM_SIGN_VERIFCATION_FUSE_MASK) >> \\\r\n     OTP_SKIP_PM_SIGN_VERIFCATION_FUSE_SHIFT)\r\n\r\n/* Fuse Word BOOT_CFG4 Index 19 */\r\n#define OTP_BOOT_CFG4_FUSE_IDX (19u)\r\n\r\n#define OTP_BOOT_CFG4_FUSE_VALUE()     (OCOTP->OTP_SHADOW[OTP_BOOT_CFG4_FUSE_IDX])\r\n#define OTP_RECOVERY_OFFSET_FUSE_IDX   (19u)\r\n#define OTP_RECOVERY_OFFSET_FUSE_SHIFT (0u)\r\n#define OTP_RECOVERY_OFFSET_FUSE_MASK  (0xFFFFFFFFu)\r\n#define OTP_RECOVERY_OFFSET_FUSE_WIDTH (32u)\r\n#define OTP_RECOVERY_OFFSET_FUSE_VALUE()                                                  \\\r\n    ((OCOTP->OTP_SHADOW[OTP_RECOVERY_OFFSET_FUSE_IDX] & OTP_RECOVERY_OFFSET_FUSE_MASK) >> \\\r\n     OTP_RECOVERY_OFFSET_FUSE_SHIFT)\r\n\r\n/* Fuse Word BOOT_CFG5 Index 20 */\r\n#define OTP_BOOT_CFG5_FUSE_IDX (20u)\r\n\r\n#define OTP_BOOT_CFG5_FUSE_VALUE()          (OCOTP->OTP_SHADOW[OTP_BOOT_CFG5_FUSE_IDX])\r\n#define OTP_KEY_STORE_START_ADDR_FUSE_IDX   (20u)\r\n#define OTP_KEY_STORE_START_ADDR_FUSE_SHIFT (0u)\r\n#define OTP_KEY_STORE_START_ADDR_FUSE_MASK  (0xFFFFFFFFu)\r\n#define OTP_KEY_STORE_START_ADDR_FUSE_WIDTH (32u)\r\n#define OTP_KEY_STORE_START_ADDR_FUSE_VALUE()                                                       \\\r\n    ((OCOTP->OTP_SHADOW[OTP_KEY_STORE_START_ADDR_FUSE_IDX] & OTP_KEY_STORE_START_ADDR_FUSE_MASK) >> \\\r\n     OTP_KEY_STORE_START_ADDR_FUSE_SHIFT)\r\n\r\n/* Fuse Word BOOT_CFG6 Index 21 */\r\n#define OTP_BOOT_CFG6_FUSE_IDX (21u)\r\n\r\n#define OTP_BOOT_CFG6_FUSE_VALUE()        (OCOTP->OTP_SHADOW[OTP_BOOT_CFG6_FUSE_IDX])\r\n#define OTP_KEY_STORE_END_ADDR_FUSE_IDX   (21u)\r\n#define OTP_KEY_STORE_END_ADDR_FUSE_SHIFT (0u)\r\n#define OTP_KEY_STORE_END_ADDR_FUSE_MASK  (0xFFFFFFFFu)\r\n#define OTP_KEY_STORE_END_ADDR_FUSE_WIDTH (32u)\r\n#define OTP_KEY_STORE_END_ADDR_FUSE_VALUE()                                                     \\\r\n    ((OCOTP->OTP_SHADOW[OTP_KEY_STORE_END_ADDR_FUSE_IDX] & OTP_KEY_STORE_END_ADDR_FUSE_MASK) >> \\\r\n     OTP_KEY_STORE_END_ADDR_FUSE_SHIFT)\r\n\r\n/* Fuse Word SEC_BOOT_CFG0 Index 22 */\r\n#define OTP_SEC_BOOT_CFG0_FUSE_IDX (22u)\r\n\r\n#define OTP_SEC_BOOT_CFG0_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_SEC_BOOT_CFG0_FUSE_IDX])\r\n#define OTP_REVOKE_ROOTKEY_FUSE_IDX    (22u)\r\n#define OTP_REVOKE_ROOTKEY_FUSE_SHIFT  (0u)\r\n#define OTP_REVOKE_ROOTKEY_FUSE_MASK   (0xFu)\r\n#define OTP_REVOKE_ROOTKEY_FUSE_WIDTH  (4u)\r\n#define OTP_REVOKE_ROOTKEY_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_REVOKE_ROOTKEY_FUSE_IDX] & OTP_REVOKE_ROOTKEY_FUSE_MASK) >> OTP_REVOKE_ROOTKEY_FUSE_SHIFT)\r\n\r\n#define OTP_FA_MODE_EN_FUSE_IDX   (22u)\r\n#define OTP_FA_MODE_EN_FUSE_SHIFT (4u)\r\n#define OTP_FA_MODE_EN_FUSE_MASK  (0x10u)\r\n#define OTP_FA_MODE_EN_FUSE_WIDTH (1u)\r\n#define OTP_FA_MODE_EN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_FA_MODE_EN_FUSE_IDX] & OTP_FA_MODE_EN_FUSE_MASK) >> OTP_FA_MODE_EN_FUSE_SHIFT)\r\n\r\n#define OTP_DICE_SKIP_CSR_FUSE_IDX   (22u)\r\n#define OTP_DICE_SKIP_CSR_FUSE_SHIFT (4u)\r\n#define OTP_DICE_SKIP_CSR_FUSE_MASK  (0x10u)\r\n#define OTP_DICE_SKIP_CSR_FUSE_WIDTH (1u)\r\n#define OTP_DICE_SKIP_CSR_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DICE_SKIP_CSR_FUSE_IDX] & OTP_DICE_SKIP_CSR_FUSE_MASK) >> OTP_DICE_SKIP_CSR_FUSE_SHIFT)\r\n\r\n/* Fuse Word SEC_BOOT_CFG1 Index 23 */\r\n#define OTP_SEC_BOOT_CFG1_FUSE_IDX (23u)\r\n\r\n#define OTP_SEC_BOOT_CFG1_FUSE_VALUE()  (OCOTP->OTP_SHADOW[OTP_SEC_BOOT_CFG1_FUSE_IDX])\r\n#define OTP_DAP_VENDOR_USAGE_FUSE_IDX   (23u)\r\n#define OTP_DAP_VENDOR_USAGE_FUSE_SHIFT (0u)\r\n#define OTP_DAP_VENDOR_USAGE_FUSE_MASK  (0xFFFFu)\r\n#define OTP_DAP_VENDOR_USAGE_FUSE_WIDTH (16u)\r\n#define OTP_DAP_VENDOR_USAGE_FUSE_VALUE()                                                   \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DAP_VENDOR_USAGE_FUSE_IDX] & OTP_DAP_VENDOR_USAGE_FUSE_MASK) >> \\\r\n     OTP_DAP_VENDOR_USAGE_FUSE_SHIFT)\r\n\r\n/* Fuse Word SEC_BOOT_CFG2 Index 24 */\r\n#define OTP_SEC_BOOT_CFG2_FUSE_IDX (24u)\r\n\r\n#define OTP_SEC_BOOT_CFG2_FUSE_VALUE()     (OCOTP->OTP_SHADOW[OTP_SEC_BOOT_CFG2_FUSE_IDX])\r\n#define OTP_REVOKE_IMG_KEY_15_0_FUSE_IDX   (24u)\r\n#define OTP_REVOKE_IMG_KEY_15_0_FUSE_SHIFT (0u)\r\n#define OTP_REVOKE_IMG_KEY_15_0_FUSE_MASK  (0xFFFFu)\r\n#define OTP_REVOKE_IMG_KEY_15_0_FUSE_WIDTH (16u)\r\n#define OTP_REVOKE_IMG_KEY_15_0_FUSE_VALUE()                                                      \\\r\n    ((OCOTP->OTP_SHADOW[OTP_REVOKE_IMG_KEY_15_0_FUSE_IDX] & OTP_REVOKE_IMG_KEY_15_0_FUSE_MASK) >> \\\r\n     OTP_REVOKE_IMG_KEY_15_0_FUSE_SHIFT)\r\n\r\n/* Fuse Word SEC_BOOT_CFG3 Index 25 */\r\n#define OTP_SEC_BOOT_CFG3_FUSE_IDX (25u)\r\n\r\n#define OTP_SEC_BOOT_CFG3_FUSE_VALUE()      (OCOTP->OTP_SHADOW[OTP_SEC_BOOT_CFG3_FUSE_IDX])\r\n#define OTP_REVOKE_IMG_KEY_31_16_FUSE_IDX   (25u)\r\n#define OTP_REVOKE_IMG_KEY_31_16_FUSE_SHIFT (0u)\r\n#define OTP_REVOKE_IMG_KEY_31_16_FUSE_MASK  (0xFFFFu)\r\n#define OTP_REVOKE_IMG_KEY_31_16_FUSE_WIDTH (16u)\r\n#define OTP_REVOKE_IMG_KEY_31_16_FUSE_VALUE()                                                       \\\r\n    ((OCOTP->OTP_SHADOW[OTP_REVOKE_IMG_KEY_31_16_FUSE_IDX] & OTP_REVOKE_IMG_KEY_31_16_FUSE_MASK) >> \\\r\n     OTP_REVOKE_IMG_KEY_31_16_FUSE_SHIFT)\r\n\r\n/* Fuse Word SEC_BOOT_CFG4 Index 26 */\r\n#define OTP_SEC_BOOT_CFG4_FUSE_IDX (26u)\r\n\r\n#define OTP_SEC_BOOT_CFG4_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_SEC_BOOT_CFG4_FUSE_IDX])\r\n/* Fuse Word SEC_BOOT_CFG5 Index 27 */\r\n#define OTP_SEC_BOOT_CFG5_FUSE_IDX (27u)\r\n\r\n#define OTP_SEC_BOOT_CFG5_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_SEC_BOOT_CFG5_FUSE_IDX])\r\n/* Fuse Word SEC_BOOT_CFG6 Index 28 */\r\n#define OTP_SEC_BOOT_CFG6_FUSE_IDX (28u)\r\n\r\n#define OTP_SEC_BOOT_CFG6_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_SEC_BOOT_CFG6_FUSE_IDX])\r\n/* Fuse Word SEC_BOOT_CFG7 Index 29 */\r\n#define OTP_SEC_BOOT_CFG7_FUSE_IDX (29u)\r\n\r\n#define OTP_SEC_BOOT_CFG7_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_SEC_BOOT_CFG7_FUSE_IDX])\r\n/* Fuse Word SEC_BOOT_CFG8 Index 30 */\r\n#define OTP_SEC_BOOT_CFG8_FUSE_IDX (30u)\r\n\r\n#define OTP_SEC_BOOT_CFG8_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_SEC_BOOT_CFG8_FUSE_IDX])\r\n/* Fuse Word DCFG_CC_SOCU_NS Index 31 */\r\n#define OTP_DCFG_CC_SOCU_NS_FUSE_IDX (31u)\r\n\r\n#define OTP_DCFG_CC_SOCU_NS_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_DCFG_CC_SOCU_NS_FUSE_IDX])\r\n#define OTP_CRC8_NS_FUSE_IDX             (31u)\r\n#define OTP_CRC8_NS_FUSE_SHIFT           (0u)\r\n#define OTP_CRC8_NS_FUSE_MASK            (0xFFu)\r\n#define OTP_CRC8_NS_FUSE_WIDTH           (8u)\r\n#define OTP_CRC8_NS_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_CRC8_NS_FUSE_IDX] & OTP_CRC8_NS_FUSE_MASK) >> OTP_CRC8_NS_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_NIDEN_NS_FUSE_IDX   (31u)\r\n#define OTP_DFLT_NIDEN_NS_FUSE_SHIFT (8u)\r\n#define OTP_DFLT_NIDEN_NS_FUSE_MASK  (0x100u)\r\n#define OTP_DFLT_NIDEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_NIDEN_NS_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_NIDEN_NS_FUSE_IDX] & OTP_DFLT_NIDEN_NS_FUSE_MASK) >> OTP_DFLT_NIDEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_DBGEN_NS_FUSE_IDX   (31u)\r\n#define OTP_DFLT_DBGEN_NS_FUSE_SHIFT (9u)\r\n#define OTP_DFLT_DBGEN_NS_FUSE_MASK  (0x200u)\r\n#define OTP_DFLT_DBGEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_DBGEN_NS_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_DBGEN_NS_FUSE_IDX] & OTP_DFLT_DBGEN_NS_FUSE_MASK) >> OTP_DFLT_DBGEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_SPNIDEN_NS_FUSE_IDX   (31u)\r\n#define OTP_DFLT_SPNIDEN_NS_FUSE_SHIFT (10u)\r\n#define OTP_DFLT_SPNIDEN_NS_FUSE_MASK  (0x400u)\r\n#define OTP_DFLT_SPNIDEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_SPNIDEN_NS_FUSE_VALUE()                                                  \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_SPNIDEN_NS_FUSE_IDX] & OTP_DFLT_SPNIDEN_NS_FUSE_MASK) >> \\\r\n     OTP_DFLT_SPNIDEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_SPIDEN_NS_FUSE_IDX   (31u)\r\n#define OTP_DFLT_SPIDEN_NS_FUSE_SHIFT (11u)\r\n#define OTP_DFLT_SPIDEN_NS_FUSE_MASK  (0x800u)\r\n#define OTP_DFLT_SPIDEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_SPIDEN_NS_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_SPIDEN_NS_FUSE_IDX] & OTP_DFLT_SPIDEN_NS_FUSE_MASK) >> OTP_DFLT_SPIDEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_TAPEN_NS_FUSE_IDX   (31u)\r\n#define OTP_DFLT_TAPEN_NS_FUSE_SHIFT (12u)\r\n#define OTP_DFLT_TAPEN_NS_FUSE_MASK  (0x1000u)\r\n#define OTP_DFLT_TAPEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_TAPEN_NS_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_TAPEN_NS_FUSE_IDX] & OTP_DFLT_TAPEN_NS_FUSE_MASK) >> OTP_DFLT_TAPEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_CPU1NIDEN_NS_FUSE_IDX   (31u)\r\n#define OTP_DFLT_CPU1NIDEN_NS_FUSE_SHIFT (13u)\r\n#define OTP_DFLT_CPU1NIDEN_NS_FUSE_MASK  (0x2000u)\r\n#define OTP_DFLT_CPU1NIDEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_CPU1NIDEN_NS_FUSE_VALUE()                                                    \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_CPU1NIDEN_NS_FUSE_IDX] & OTP_DFLT_CPU1NIDEN_NS_FUSE_MASK) >> \\\r\n     OTP_DFLT_CPU1NIDEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_CPU1DBGEN_NS_FUSE_IDX   (31u)\r\n#define OTP_DFLT_CPU1DBGEN_NS_FUSE_SHIFT (14u)\r\n#define OTP_DFLT_CPU1DBGEN_NS_FUSE_MASK  (0x4000u)\r\n#define OTP_DFLT_CPU1DBGEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_CPU1DBGEN_NS_FUSE_VALUE()                                                    \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_CPU1DBGEN_NS_FUSE_IDX] & OTP_DFLT_CPU1DBGEN_NS_FUSE_MASK) >> \\\r\n     OTP_DFLT_CPU1DBGEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_CPU2NIDEN_NS_FUSE_IDX   (31u)\r\n#define OTP_DFLT_CPU2NIDEN_NS_FUSE_SHIFT (15u)\r\n#define OTP_DFLT_CPU2NIDEN_NS_FUSE_MASK  (0x8000u)\r\n#define OTP_DFLT_CPU2NIDEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_CPU2NIDEN_NS_FUSE_VALUE()                                                    \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_CPU2NIDEN_NS_FUSE_IDX] & OTP_DFLT_CPU2NIDEN_NS_FUSE_MASK) >> \\\r\n     OTP_DFLT_CPU2NIDEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_CPU2DBGEN_NS_FUSE_IDX   (31u)\r\n#define OTP_DFLT_CPU2DBGEN_NS_FUSE_SHIFT (16u)\r\n#define OTP_DFLT_CPU2DBGEN_NS_FUSE_MASK  (0x10000u)\r\n#define OTP_DFLT_CPU2DBGEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_CPU2DBGEN_NS_FUSE_VALUE()                                                    \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_CPU2DBGEN_NS_FUSE_IDX] & OTP_DFLT_CPU2DBGEN_NS_FUSE_MASK) >> \\\r\n     OTP_DFLT_CPU2DBGEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_ISPCMDEN_NS_FUSE_IDX   (31u)\r\n#define OTP_DFLT_ISPCMDEN_NS_FUSE_SHIFT (17u)\r\n#define OTP_DFLT_ISPCMDEN_NS_FUSE_MASK  (0x20000u)\r\n#define OTP_DFLT_ISPCMDEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_ISPCMDEN_NS_FUSE_VALUE()                                                   \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_ISPCMDEN_NS_FUSE_IDX] & OTP_DFLT_ISPCMDEN_NS_FUSE_MASK) >> \\\r\n     OTP_DFLT_ISPCMDEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_FACMDEN_NS_FUSE_IDX   (31u)\r\n#define OTP_DFLT_FACMDEN_NS_FUSE_SHIFT (18u)\r\n#define OTP_DFLT_FACMDEN_NS_FUSE_MASK  (0x40000u)\r\n#define OTP_DFLT_FACMDEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_FACMDEN_NS_FUSE_VALUE()                                                  \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_FACMDEN_NS_FUSE_IDX] & OTP_DFLT_FACMDEN_NS_FUSE_MASK) >> \\\r\n     OTP_DFLT_FACMDEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_NIDEN_NS_FUSE_IDX   (31u)\r\n#define OTP_PINNED_NIDEN_NS_FUSE_SHIFT (19u)\r\n#define OTP_PINNED_NIDEN_NS_FUSE_MASK  (0x80000u)\r\n#define OTP_PINNED_NIDEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_NIDEN_NS_FUSE_VALUE()                                                  \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_NIDEN_NS_FUSE_IDX] & OTP_PINNED_NIDEN_NS_FUSE_MASK) >> \\\r\n     OTP_PINNED_NIDEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_DBGEN_NS_FUSE_IDX   (31u)\r\n#define OTP_PINNED_DBGEN_NS_FUSE_SHIFT (20u)\r\n#define OTP_PINNED_DBGEN_NS_FUSE_MASK  (0x100000u)\r\n#define OTP_PINNED_DBGEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_DBGEN_NS_FUSE_VALUE()                                                  \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_DBGEN_NS_FUSE_IDX] & OTP_PINNED_DBGEN_NS_FUSE_MASK) >> \\\r\n     OTP_PINNED_DBGEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_SPNIDEN_NS_FUSE_IDX   (31u)\r\n#define OTP_PINNED_SPNIDEN_NS_FUSE_SHIFT (21u)\r\n#define OTP_PINNED_SPNIDEN_NS_FUSE_MASK  (0x200000u)\r\n#define OTP_PINNED_SPNIDEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_SPNIDEN_NS_FUSE_VALUE()                                                    \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_SPNIDEN_NS_FUSE_IDX] & OTP_PINNED_SPNIDEN_NS_FUSE_MASK) >> \\\r\n     OTP_PINNED_SPNIDEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_SPIDEN_NS_FUSE_IDX   (31u)\r\n#define OTP_PINNED_SPIDEN_NS_FUSE_SHIFT (22u)\r\n#define OTP_PINNED_SPIDEN_NS_FUSE_MASK  (0x400000u)\r\n#define OTP_PINNED_SPIDEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_SPIDEN_NS_FUSE_VALUE()                                                   \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_SPIDEN_NS_FUSE_IDX] & OTP_PINNED_SPIDEN_NS_FUSE_MASK) >> \\\r\n     OTP_PINNED_SPIDEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_TAPEN_NS_FUSE_IDX   (31u)\r\n#define OTP_PINNED_TAPEN_NS_FUSE_SHIFT (23u)\r\n#define OTP_PINNED_TAPEN_NS_FUSE_MASK  (0x800000u)\r\n#define OTP_PINNED_TAPEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_TAPEN_NS_FUSE_VALUE()                                                  \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_TAPEN_NS_FUSE_IDX] & OTP_PINNED_TAPEN_NS_FUSE_MASK) >> \\\r\n     OTP_PINNED_TAPEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_CPU1NIDEN_NS_FUSE_IDX   (31u)\r\n#define OTP_PINNED_CPU1NIDEN_NS_FUSE_SHIFT (24u)\r\n#define OTP_PINNED_CPU1NIDEN_NS_FUSE_MASK  (0x1000000u)\r\n#define OTP_PINNED_CPU1NIDEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_CPU1NIDEN_NS_FUSE_VALUE()                                                      \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_CPU1NIDEN_NS_FUSE_IDX] & OTP_PINNED_CPU1NIDEN_NS_FUSE_MASK) >> \\\r\n     OTP_PINNED_CPU1NIDEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_CPU1DBGEN_NS_FUSE_IDX   (31u)\r\n#define OTP_PINNED_CPU1DBGEN_NS_FUSE_SHIFT (25u)\r\n#define OTP_PINNED_CPU1DBGEN_NS_FUSE_MASK  (0x2000000u)\r\n#define OTP_PINNED_CPU1DBGEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_CPU1DBGEN_NS_FUSE_VALUE()                                                      \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_CPU1DBGEN_NS_FUSE_IDX] & OTP_PINNED_CPU1DBGEN_NS_FUSE_MASK) >> \\\r\n     OTP_PINNED_CPU1DBGEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_CPU2NIDEN_NS_FUSE_IDX   (31u)\r\n#define OTP_PINNED_CPU2NIDEN_NS_FUSE_SHIFT (26u)\r\n#define OTP_PINNED_CPU2NIDEN_NS_FUSE_MASK  (0x4000000u)\r\n#define OTP_PINNED_CPU2NIDEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_CPU2NIDEN_NS_FUSE_VALUE()                                                      \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_CPU2NIDEN_NS_FUSE_IDX] & OTP_PINNED_CPU2NIDEN_NS_FUSE_MASK) >> \\\r\n     OTP_PINNED_CPU2NIDEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_CPU2DBGEN_NS_FUSE_IDX   (31u)\r\n#define OTP_PINNED_CPU2DBGEN_NS_FUSE_SHIFT (27u)\r\n#define OTP_PINNED_CPU2DBGEN_NS_FUSE_MASK  (0x8000000u)\r\n#define OTP_PINNED_CPU2DBGEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_CPU2DBGEN_NS_FUSE_VALUE()                                                      \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_CPU2DBGEN_NS_FUSE_IDX] & OTP_PINNED_CPU2DBGEN_NS_FUSE_MASK) >> \\\r\n     OTP_PINNED_CPU2DBGEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_ISPCMDEN_NS_FUSE_IDX   (31u)\r\n#define OTP_PINNED_ISPCMDEN_NS_FUSE_SHIFT (28u)\r\n#define OTP_PINNED_ISPCMDEN_NS_FUSE_MASK  (0x10000000u)\r\n#define OTP_PINNED_ISPCMDEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_ISPCMDEN_NS_FUSE_VALUE()                                                     \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_ISPCMDEN_NS_FUSE_IDX] & OTP_PINNED_ISPCMDEN_NS_FUSE_MASK) >> \\\r\n     OTP_PINNED_ISPCMDEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_FACMDEN_NS_FUSE_IDX   (31u)\r\n#define OTP_PINNED_FACMDEN_NS_FUSE_SHIFT (29u)\r\n#define OTP_PINNED_FACMDEN_NS_FUSE_MASK  (0x20000000u)\r\n#define OTP_PINNED_FACMDEN_NS_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_FACMDEN_NS_FUSE_VALUE()                                                    \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_FACMDEN_NS_FUSE_IDX] & OTP_PINNED_FACMDEN_NS_FUSE_MASK) >> \\\r\n     OTP_PINNED_FACMDEN_NS_FUSE_SHIFT)\r\n\r\n#define OTP_FORCE_UUID_MATCH_NS_FUSE_IDX   (31u)\r\n#define OTP_FORCE_UUID_MATCH_NS_FUSE_SHIFT (30u)\r\n#define OTP_FORCE_UUID_MATCH_NS_FUSE_MASK  (0x40000000u)\r\n#define OTP_FORCE_UUID_MATCH_NS_FUSE_WIDTH (1u)\r\n#define OTP_FORCE_UUID_MATCH_NS_FUSE_VALUE()                                                      \\\r\n    ((OCOTP->OTP_SHADOW[OTP_FORCE_UUID_MATCH_NS_FUSE_IDX] & OTP_FORCE_UUID_MATCH_NS_FUSE_MASK) >> \\\r\n     OTP_FORCE_UUID_MATCH_NS_FUSE_SHIFT)\r\n\r\n/* Fuse Word USB_ID Index 32 */\r\n#define OTP_USB_ID_FUSE_IDX (32u)\r\n\r\n#define OTP_USB_VID_FUSE_IDX   (32u)\r\n#define OTP_USB_VID_FUSE_SHIFT (0u)\r\n#define OTP_USB_VID_FUSE_MASK  (0xFFFFu)\r\n#define OTP_USB_VID_FUSE_WIDTH (16u)\r\n\r\n#define OTP_USB_PID_FUSE_IDX   (32u)\r\n#define OTP_USB_PID_FUSE_SHIFT (16u)\r\n#define OTP_USB_PID_FUSE_MASK  (0xFFFF0000u)\r\n#define OTP_USB_PID_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word DCFG_CC_SOCU Index 33 */\r\n#define OTP_DCFG_CC_SOCU_FUSE_IDX (33u)\r\n\r\n#define OTP_DCFG_CC_SOCU_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_DCFG_CC_SOCU_FUSE_IDX])\r\n#define OTP_CRC8_FUSE_IDX             (33u)\r\n#define OTP_CRC8_FUSE_SHIFT           (0u)\r\n#define OTP_CRC8_FUSE_MASK            (0xFFu)\r\n#define OTP_CRC8_FUSE_WIDTH           (8u)\r\n#define OTP_CRC8_FUSE_VALUE()         ((OCOTP->OTP_SHADOW[OTP_CRC8_FUSE_IDX] & OTP_CRC8_FUSE_MASK) >> OTP_CRC8_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_NIDEN_FUSE_IDX   (33u)\r\n#define OTP_DFLT_NIDEN_FUSE_SHIFT (8u)\r\n#define OTP_DFLT_NIDEN_FUSE_MASK  (0x100u)\r\n#define OTP_DFLT_NIDEN_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_NIDEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_NIDEN_FUSE_IDX] & OTP_DFLT_NIDEN_FUSE_MASK) >> OTP_DFLT_NIDEN_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_DBGEN_FUSE_IDX   (33u)\r\n#define OTP_DFLT_DBGEN_FUSE_SHIFT (9u)\r\n#define OTP_DFLT_DBGEN_FUSE_MASK  (0x200u)\r\n#define OTP_DFLT_DBGEN_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_DBGEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_DBGEN_FUSE_IDX] & OTP_DFLT_DBGEN_FUSE_MASK) >> OTP_DFLT_DBGEN_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_SPNIDEN_FUSE_IDX   (33u)\r\n#define OTP_DFLT_SPNIDEN_FUSE_SHIFT (10u)\r\n#define OTP_DFLT_SPNIDEN_FUSE_MASK  (0x400u)\r\n#define OTP_DFLT_SPNIDEN_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_SPNIDEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_SPNIDEN_FUSE_IDX] & OTP_DFLT_SPNIDEN_FUSE_MASK) >> OTP_DFLT_SPNIDEN_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_SPIDEN_FUSE_IDX   (33u)\r\n#define OTP_DFLT_SPIDEN_FUSE_SHIFT (11u)\r\n#define OTP_DFLT_SPIDEN_FUSE_MASK  (0x800u)\r\n#define OTP_DFLT_SPIDEN_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_SPIDEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_SPIDEN_FUSE_IDX] & OTP_DFLT_SPIDEN_FUSE_MASK) >> OTP_DFLT_SPIDEN_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_TAPEN_FUSE_IDX   (33u)\r\n#define OTP_DFLT_TAPEN_FUSE_SHIFT (12u)\r\n#define OTP_DFLT_TAPEN_FUSE_MASK  (0x1000u)\r\n#define OTP_DFLT_TAPEN_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_TAPEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_TAPEN_FUSE_IDX] & OTP_DFLT_TAPEN_FUSE_MASK) >> OTP_DFLT_TAPEN_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_CPU1NIDEN_FUSE_IDX   (33u)\r\n#define OTP_DFLT_CPU1NIDEN_FUSE_SHIFT (13u)\r\n#define OTP_DFLT_CPU1NIDEN_FUSE_MASK  (0x2000u)\r\n#define OTP_DFLT_CPU1NIDEN_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_CPU1NIDEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_CPU1NIDEN_FUSE_IDX] & OTP_DFLT_CPU1NIDEN_FUSE_MASK) >> OTP_DFLT_CPU1NIDEN_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_CPU1DBGEN_FUSE_IDX   (33u)\r\n#define OTP_DFLT_CPU1DBGEN_FUSE_SHIFT (14u)\r\n#define OTP_DFLT_CPU1DBGEN_FUSE_MASK  (0x4000u)\r\n#define OTP_DFLT_CPU1DBGEN_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_CPU1DBGEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_CPU1DBGEN_FUSE_IDX] & OTP_DFLT_CPU1DBGEN_FUSE_MASK) >> OTP_DFLT_CPU1DBGEN_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_CPU2NIDEN_FUSE_IDX   (33u)\r\n#define OTP_DFLT_CPU2NIDEN_FUSE_SHIFT (15u)\r\n#define OTP_DFLT_CPU2NIDEN_FUSE_MASK  (0x8000u)\r\n#define OTP_DFLT_CPU2NIDEN_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_CPU2NIDEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_CPU2NIDEN_FUSE_IDX] & OTP_DFLT_CPU2NIDEN_FUSE_MASK) >> OTP_DFLT_CPU2NIDEN_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_CPU2DBGEN_FUSE_IDX   (33u)\r\n#define OTP_DFLT_CPU2DBGEN_FUSE_SHIFT (16u)\r\n#define OTP_DFLT_CPU2DBGEN_FUSE_MASK  (0x10000u)\r\n#define OTP_DFLT_CPU2DBGEN_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_CPU2DBGEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_CPU2DBGEN_FUSE_IDX] & OTP_DFLT_CPU2DBGEN_FUSE_MASK) >> OTP_DFLT_CPU2DBGEN_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_ISPCMDEN_FUSE_IDX   (33u)\r\n#define OTP_DFLT_ISPCMDEN_FUSE_SHIFT (17u)\r\n#define OTP_DFLT_ISPCMDEN_FUSE_MASK  (0x20000u)\r\n#define OTP_DFLT_ISPCMDEN_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_ISPCMDEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_ISPCMDEN_FUSE_IDX] & OTP_DFLT_ISPCMDEN_FUSE_MASK) >> OTP_DFLT_ISPCMDEN_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_FACMDEN_FUSE_IDX   (33u)\r\n#define OTP_DFLT_FACMDEN_FUSE_SHIFT (18u)\r\n#define OTP_DFLT_FACMDEN_FUSE_MASK  (0x40000u)\r\n#define OTP_DFLT_FACMDEN_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_FACMDEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_FACMDEN_FUSE_IDX] & OTP_DFLT_FACMDEN_FUSE_MASK) >> OTP_DFLT_FACMDEN_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_NIDEN_FUSE_IDX   (33u)\r\n#define OTP_PINNED_NIDEN_FUSE_SHIFT (19u)\r\n#define OTP_PINNED_NIDEN_FUSE_MASK  (0x80000u)\r\n#define OTP_PINNED_NIDEN_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_NIDEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_NIDEN_FUSE_IDX] & OTP_PINNED_NIDEN_FUSE_MASK) >> OTP_PINNED_NIDEN_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_DBGEN_FUSE_IDX   (33u)\r\n#define OTP_PINNED_DBGEN_FUSE_SHIFT (20u)\r\n#define OTP_PINNED_DBGEN_FUSE_MASK  (0x100000u)\r\n#define OTP_PINNED_DBGEN_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_DBGEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_DBGEN_FUSE_IDX] & OTP_PINNED_DBGEN_FUSE_MASK) >> OTP_PINNED_DBGEN_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_SPNIDEN_FUSE_IDX   (33u)\r\n#define OTP_PINNED_SPNIDEN_FUSE_SHIFT (21u)\r\n#define OTP_PINNED_SPNIDEN_FUSE_MASK  (0x200000u)\r\n#define OTP_PINNED_SPNIDEN_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_SPNIDEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_SPNIDEN_FUSE_IDX] & OTP_PINNED_SPNIDEN_FUSE_MASK) >> OTP_PINNED_SPNIDEN_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_SPIDEN_FUSE_IDX   (33u)\r\n#define OTP_PINNED_SPIDEN_FUSE_SHIFT (22u)\r\n#define OTP_PINNED_SPIDEN_FUSE_MASK  (0x400000u)\r\n#define OTP_PINNED_SPIDEN_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_SPIDEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_SPIDEN_FUSE_IDX] & OTP_PINNED_SPIDEN_FUSE_MASK) >> OTP_PINNED_SPIDEN_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_TAPEN_FUSE_IDX   (33u)\r\n#define OTP_PINNED_TAPEN_FUSE_SHIFT (23u)\r\n#define OTP_PINNED_TAPEN_FUSE_MASK  (0x800000u)\r\n#define OTP_PINNED_TAPEN_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_TAPEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_TAPEN_FUSE_IDX] & OTP_PINNED_TAPEN_FUSE_MASK) >> OTP_PINNED_TAPEN_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_CPU1NIDEN_FUSE_IDX   (33u)\r\n#define OTP_PINNED_CPU1NIDEN_FUSE_SHIFT (24u)\r\n#define OTP_PINNED_CPU1NIDEN_FUSE_MASK  (0x1000000u)\r\n#define OTP_PINNED_CPU1NIDEN_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_CPU1NIDEN_FUSE_VALUE()                                                   \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_CPU1NIDEN_FUSE_IDX] & OTP_PINNED_CPU1NIDEN_FUSE_MASK) >> \\\r\n     OTP_PINNED_CPU1NIDEN_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_CPU1DBGEN_FUSE_IDX   (33u)\r\n#define OTP_PINNED_CPU1DBGEN_FUSE_SHIFT (25u)\r\n#define OTP_PINNED_CPU1DBGEN_FUSE_MASK  (0x2000000u)\r\n#define OTP_PINNED_CPU1DBGEN_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_CPU1DBGEN_FUSE_VALUE()                                                   \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_CPU1DBGEN_FUSE_IDX] & OTP_PINNED_CPU1DBGEN_FUSE_MASK) >> \\\r\n     OTP_PINNED_CPU1DBGEN_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_CPU2NIDEN_FUSE_IDX   (33u)\r\n#define OTP_PINNED_CPU2NIDEN_FUSE_SHIFT (26u)\r\n#define OTP_PINNED_CPU2NIDEN_FUSE_MASK  (0x4000000u)\r\n#define OTP_PINNED_CPU2NIDEN_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_CPU2NIDEN_FUSE_VALUE()                                                   \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_CPU2NIDEN_FUSE_IDX] & OTP_PINNED_CPU2NIDEN_FUSE_MASK) >> \\\r\n     OTP_PINNED_CPU2NIDEN_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_CPU2DBGEN_FUSE_IDX   (33u)\r\n#define OTP_PINNED_CPU2DBGEN_FUSE_SHIFT (27u)\r\n#define OTP_PINNED_CPU2DBGEN_FUSE_MASK  (0x8000000u)\r\n#define OTP_PINNED_CPU2DBGEN_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_CPU2DBGEN_FUSE_VALUE()                                                   \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_CPU2DBGEN_FUSE_IDX] & OTP_PINNED_CPU2DBGEN_FUSE_MASK) >> \\\r\n     OTP_PINNED_CPU2DBGEN_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_ISPCMDEN_FUSE_IDX   (33u)\r\n#define OTP_PINNED_ISPCMDEN_FUSE_SHIFT (28u)\r\n#define OTP_PINNED_ISPCMDEN_FUSE_MASK  (0x10000000u)\r\n#define OTP_PINNED_ISPCMDEN_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_ISPCMDEN_FUSE_VALUE()                                                  \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_ISPCMDEN_FUSE_IDX] & OTP_PINNED_ISPCMDEN_FUSE_MASK) >> \\\r\n     OTP_PINNED_ISPCMDEN_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_FACMDEN_FUSE_IDX   (33u)\r\n#define OTP_PINNED_FACMDEN_FUSE_SHIFT (29u)\r\n#define OTP_PINNED_FACMDEN_FUSE_MASK  (0x20000000u)\r\n#define OTP_PINNED_FACMDEN_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_FACMDEN_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_FACMDEN_FUSE_IDX] & OTP_PINNED_FACMDEN_FUSE_MASK) >> OTP_PINNED_FACMDEN_FUSE_SHIFT)\r\n\r\n#define OTP_FORCE_UUID_MATCH_FUSE_IDX   (33u)\r\n#define OTP_FORCE_UUID_MATCH_FUSE_SHIFT (30u)\r\n#define OTP_FORCE_UUID_MATCH_FUSE_MASK  (0x40000000u)\r\n#define OTP_FORCE_UUID_MATCH_FUSE_WIDTH (1u)\r\n#define OTP_FORCE_UUID_MATCH_FUSE_VALUE()                                                   \\\r\n    ((OCOTP->OTP_SHADOW[OTP_FORCE_UUID_MATCH_FUSE_IDX] & OTP_FORCE_UUID_MATCH_FUSE_MASK) >> \\\r\n     OTP_FORCE_UUID_MATCH_FUSE_SHIFT)\r\n\r\n/* Fuse Word DCFG_CC_SOCU_AP Index 34 */\r\n#define OTP_DCFG_CC_SOCU_AP_FUSE_IDX (34u)\r\n\r\n#define OTP_DCFG_CC_SOCU_AP_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_DCFG_CC_SOCU_AP_FUSE_IDX])\r\n#define OTP_CRC8_AP_FUSE_IDX             (34u)\r\n#define OTP_CRC8_AP_FUSE_SHIFT           (0u)\r\n#define OTP_CRC8_AP_FUSE_MASK            (0xFFu)\r\n#define OTP_CRC8_AP_FUSE_WIDTH           (8u)\r\n#define OTP_CRC8_AP_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_CRC8_AP_FUSE_IDX] & OTP_CRC8_AP_FUSE_MASK) >> OTP_CRC8_AP_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_NIDEN_AP_FUSE_IDX   (34u)\r\n#define OTP_DFLT_NIDEN_AP_FUSE_SHIFT (8u)\r\n#define OTP_DFLT_NIDEN_AP_FUSE_MASK  (0x100u)\r\n#define OTP_DFLT_NIDEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_NIDEN_AP_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_NIDEN_AP_FUSE_IDX] & OTP_DFLT_NIDEN_AP_FUSE_MASK) >> OTP_DFLT_NIDEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_DBGEN_AP_FUSE_IDX   (34u)\r\n#define OTP_DFLT_DBGEN_AP_FUSE_SHIFT (9u)\r\n#define OTP_DFLT_DBGEN_AP_FUSE_MASK  (0x200u)\r\n#define OTP_DFLT_DBGEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_DBGEN_AP_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_DBGEN_AP_FUSE_IDX] & OTP_DFLT_DBGEN_AP_FUSE_MASK) >> OTP_DFLT_DBGEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_SPNIDEN_AP_FUSE_IDX   (34u)\r\n#define OTP_DFLT_SPNIDEN_AP_FUSE_SHIFT (10u)\r\n#define OTP_DFLT_SPNIDEN_AP_FUSE_MASK  (0x400u)\r\n#define OTP_DFLT_SPNIDEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_SPNIDEN_AP_FUSE_VALUE()                                                  \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_SPNIDEN_AP_FUSE_IDX] & OTP_DFLT_SPNIDEN_AP_FUSE_MASK) >> \\\r\n     OTP_DFLT_SPNIDEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_SPIDEN_AP_FUSE_IDX   (34u)\r\n#define OTP_DFLT_SPIDEN_AP_FUSE_SHIFT (11u)\r\n#define OTP_DFLT_SPIDEN_AP_FUSE_MASK  (0x800u)\r\n#define OTP_DFLT_SPIDEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_SPIDEN_AP_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_SPIDEN_AP_FUSE_IDX] & OTP_DFLT_SPIDEN_AP_FUSE_MASK) >> OTP_DFLT_SPIDEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_TAPEN_AP_FUSE_IDX   (34u)\r\n#define OTP_DFLT_TAPEN_AP_FUSE_SHIFT (12u)\r\n#define OTP_DFLT_TAPEN_AP_FUSE_MASK  (0x1000u)\r\n#define OTP_DFLT_TAPEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_TAPEN_AP_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_TAPEN_AP_FUSE_IDX] & OTP_DFLT_TAPEN_AP_FUSE_MASK) >> OTP_DFLT_TAPEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_CPU1NIDEN_AP_FUSE_IDX   (34u)\r\n#define OTP_DFLT_CPU1NIDEN_AP_FUSE_SHIFT (13u)\r\n#define OTP_DFLT_CPU1NIDEN_AP_FUSE_MASK  (0x2000u)\r\n#define OTP_DFLT_CPU1NIDEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_CPU1NIDEN_AP_FUSE_VALUE()                                                    \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_CPU1NIDEN_AP_FUSE_IDX] & OTP_DFLT_CPU1NIDEN_AP_FUSE_MASK) >> \\\r\n     OTP_DFLT_CPU1NIDEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_CPU1DBGEN_AP_FUSE_IDX   (34u)\r\n#define OTP_DFLT_CPU1DBGEN_AP_FUSE_SHIFT (14u)\r\n#define OTP_DFLT_CPU1DBGEN_AP_FUSE_MASK  (0x4000u)\r\n#define OTP_DFLT_CPU1DBGEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_CPU1DBGEN_AP_FUSE_VALUE()                                                    \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_CPU1DBGEN_AP_FUSE_IDX] & OTP_DFLT_CPU1DBGEN_AP_FUSE_MASK) >> \\\r\n     OTP_DFLT_CPU1DBGEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_CPU2NIDEN_AP_FUSE_IDX   (34u)\r\n#define OTP_DFLT_CPU2NIDEN_AP_FUSE_SHIFT (15u)\r\n#define OTP_DFLT_CPU2NIDEN_AP_FUSE_MASK  (0x8000u)\r\n#define OTP_DFLT_CPU2NIDEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_CPU2NIDEN_AP_FUSE_VALUE()                                                    \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_CPU2NIDEN_AP_FUSE_IDX] & OTP_DFLT_CPU2NIDEN_AP_FUSE_MASK) >> \\\r\n     OTP_DFLT_CPU2NIDEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_CPU2DBGEN_AP_FUSE_IDX   (34u)\r\n#define OTP_DFLT_CPU2DBGEN_AP_FUSE_SHIFT (16u)\r\n#define OTP_DFLT_CPU2DBGEN_AP_FUSE_MASK  (0x10000u)\r\n#define OTP_DFLT_CPU2DBGEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_CPU2DBGEN_AP_FUSE_VALUE()                                                    \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_CPU2DBGEN_AP_FUSE_IDX] & OTP_DFLT_CPU2DBGEN_AP_FUSE_MASK) >> \\\r\n     OTP_DFLT_CPU2DBGEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_ISPCMDEN_AP_FUSE_IDX   (34u)\r\n#define OTP_DFLT_ISPCMDEN_AP_FUSE_SHIFT (17u)\r\n#define OTP_DFLT_ISPCMDEN_AP_FUSE_MASK  (0x20000u)\r\n#define OTP_DFLT_ISPCMDEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_ISPCMDEN_AP_FUSE_VALUE()                                                   \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_ISPCMDEN_AP_FUSE_IDX] & OTP_DFLT_ISPCMDEN_AP_FUSE_MASK) >> \\\r\n     OTP_DFLT_ISPCMDEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_DFLT_FACMDEN_AP_FUSE_IDX   (34u)\r\n#define OTP_DFLT_FACMDEN_AP_FUSE_SHIFT (18u)\r\n#define OTP_DFLT_FACMDEN_AP_FUSE_MASK  (0x40000u)\r\n#define OTP_DFLT_FACMDEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_DFLT_FACMDEN_AP_FUSE_VALUE()                                                  \\\r\n    ((OCOTP->OTP_SHADOW[OTP_DFLT_FACMDEN_AP_FUSE_IDX] & OTP_DFLT_FACMDEN_AP_FUSE_MASK) >> \\\r\n     OTP_DFLT_FACMDEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_NIDEN_AP_FUSE_IDX   (34u)\r\n#define OTP_PINNED_NIDEN_AP_FUSE_SHIFT (19u)\r\n#define OTP_PINNED_NIDEN_AP_FUSE_MASK  (0x80000u)\r\n#define OTP_PINNED_NIDEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_NIDEN_AP_FUSE_VALUE()                                                  \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_NIDEN_AP_FUSE_IDX] & OTP_PINNED_NIDEN_AP_FUSE_MASK) >> \\\r\n     OTP_PINNED_NIDEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_DBGEN_AP_FUSE_IDX   (34u)\r\n#define OTP_PINNED_DBGEN_AP_FUSE_SHIFT (20u)\r\n#define OTP_PINNED_DBGEN_AP_FUSE_MASK  (0x100000u)\r\n#define OTP_PINNED_DBGEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_DBGEN_AP_FUSE_VALUE()                                                  \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_DBGEN_AP_FUSE_IDX] & OTP_PINNED_DBGEN_AP_FUSE_MASK) >> \\\r\n     OTP_PINNED_DBGEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_SPNIDEN_AP_FUSE_IDX   (34u)\r\n#define OTP_PINNED_SPNIDEN_AP_FUSE_SHIFT (21u)\r\n#define OTP_PINNED_SPNIDEN_AP_FUSE_MASK  (0x200000u)\r\n#define OTP_PINNED_SPNIDEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_SPNIDEN_AP_FUSE_VALUE()                                                    \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_SPNIDEN_AP_FUSE_IDX] & OTP_PINNED_SPNIDEN_AP_FUSE_MASK) >> \\\r\n     OTP_PINNED_SPNIDEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_SPIDEN_AP_FUSE_IDX   (34u)\r\n#define OTP_PINNED_SPIDEN_AP_FUSE_SHIFT (22u)\r\n#define OTP_PINNED_SPIDEN_AP_FUSE_MASK  (0x400000u)\r\n#define OTP_PINNED_SPIDEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_SPIDEN_AP_FUSE_VALUE()                                                   \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_SPIDEN_AP_FUSE_IDX] & OTP_PINNED_SPIDEN_AP_FUSE_MASK) >> \\\r\n     OTP_PINNED_SPIDEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_TAPEN_AP_FUSE_IDX   (34u)\r\n#define OTP_PINNED_TAPEN_AP_FUSE_SHIFT (23u)\r\n#define OTP_PINNED_TAPEN_AP_FUSE_MASK  (0x800000u)\r\n#define OTP_PINNED_TAPEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_TAPEN_AP_FUSE_VALUE()                                                  \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_TAPEN_AP_FUSE_IDX] & OTP_PINNED_TAPEN_AP_FUSE_MASK) >> \\\r\n     OTP_PINNED_TAPEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_CPU1NIDEN_AP_FUSE_IDX   (34u)\r\n#define OTP_PINNED_CPU1NIDEN_AP_FUSE_SHIFT (24u)\r\n#define OTP_PINNED_CPU1NIDEN_AP_FUSE_MASK  (0x1000000u)\r\n#define OTP_PINNED_CPU1NIDEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_CPU1NIDEN_AP_FUSE_VALUE()                                                      \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_CPU1NIDEN_AP_FUSE_IDX] & OTP_PINNED_CPU1NIDEN_AP_FUSE_MASK) >> \\\r\n     OTP_PINNED_CPU1NIDEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_CPU1DBGEN_AP_FUSE_IDX   (34u)\r\n#define OTP_PINNED_CPU1DBGEN_AP_FUSE_SHIFT (25u)\r\n#define OTP_PINNED_CPU1DBGEN_AP_FUSE_MASK  (0x2000000u)\r\n#define OTP_PINNED_CPU1DBGEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_CPU1DBGEN_AP_FUSE_VALUE()                                                      \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_CPU1DBGEN_AP_FUSE_IDX] & OTP_PINNED_CPU1DBGEN_AP_FUSE_MASK) >> \\\r\n     OTP_PINNED_CPU1DBGEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_CPU2NIDEN_AP_FUSE_IDX   (34u)\r\n#define OTP_PINNED_CPU2NIDEN_AP_FUSE_SHIFT (26u)\r\n#define OTP_PINNED_CPU2NIDEN_AP_FUSE_MASK  (0x4000000u)\r\n#define OTP_PINNED_CPU2NIDEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_CPU2NIDEN_AP_FUSE_VALUE()                                                      \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_CPU2NIDEN_AP_FUSE_IDX] & OTP_PINNED_CPU2NIDEN_AP_FUSE_MASK) >> \\\r\n     OTP_PINNED_CPU2NIDEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_CPU2DBGEN_AP_FUSE_IDX   (34u)\r\n#define OTP_PINNED_CPU2DBGEN_AP_FUSE_SHIFT (27u)\r\n#define OTP_PINNED_CPU2DBGEN_AP_FUSE_MASK  (0x8000000u)\r\n#define OTP_PINNED_CPU2DBGEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_CPU2DBGEN_AP_FUSE_VALUE()                                                      \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_CPU2DBGEN_AP_FUSE_IDX] & OTP_PINNED_CPU2DBGEN_AP_FUSE_MASK) >> \\\r\n     OTP_PINNED_CPU2DBGEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_ISPCMDEN_AP_FUSE_IDX   (34u)\r\n#define OTP_PINNED_ISPCMDEN_AP_FUSE_SHIFT (28u)\r\n#define OTP_PINNED_ISPCMDEN_AP_FUSE_MASK  (0x10000000u)\r\n#define OTP_PINNED_ISPCMDEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_ISPCMDEN_AP_FUSE_VALUE()                                                     \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_ISPCMDEN_AP_FUSE_IDX] & OTP_PINNED_ISPCMDEN_AP_FUSE_MASK) >> \\\r\n     OTP_PINNED_ISPCMDEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_PINNED_FACMDEN_AP_FUSE_IDX   (34u)\r\n#define OTP_PINNED_FACMDEN_AP_FUSE_SHIFT (29u)\r\n#define OTP_PINNED_FACMDEN_AP_FUSE_MASK  (0x20000000u)\r\n#define OTP_PINNED_FACMDEN_AP_FUSE_WIDTH (1u)\r\n#define OTP_PINNED_FACMDEN_AP_FUSE_VALUE()                                                    \\\r\n    ((OCOTP->OTP_SHADOW[OTP_PINNED_FACMDEN_AP_FUSE_IDX] & OTP_PINNED_FACMDEN_AP_FUSE_MASK) >> \\\r\n     OTP_PINNED_FACMDEN_AP_FUSE_SHIFT)\r\n\r\n#define OTP_FORCE_UUID_MATCH_AP_FUSE_IDX   (34u)\r\n#define OTP_FORCE_UUID_MATCH_AP_FUSE_SHIFT (30u)\r\n#define OTP_FORCE_UUID_MATCH_AP_FUSE_MASK  (0x40000000u)\r\n#define OTP_FORCE_UUID_MATCH_AP_FUSE_WIDTH (1u)\r\n#define OTP_FORCE_UUID_MATCH_AP_FUSE_VALUE()                                                      \\\r\n    ((OCOTP->OTP_SHADOW[OTP_FORCE_UUID_MATCH_AP_FUSE_IDX] & OTP_FORCE_UUID_MATCH_AP_FUSE_MASK) >> \\\r\n     OTP_FORCE_UUID_MATCH_AP_FUSE_SHIFT)\r\n\r\n/* Fuse Word PRINCE_GCM_IV_STORE_START_ADDR Index 35 */\r\n#define OTP_PRINCE_GCM_IV_STORE_START_ADDR_FUSE_IDX (35u)\r\n\r\n#define OTP_PRINCE_GCM_IV_STORE_START_ADDR_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_PRINCE_GCM_IV_STORE_START_ADDR_FUSE_IDX])\r\n/* Fuse Word PRINCE_GCM_IV_STORE_END_ADDR Index 36 */\r\n#define OTP_PRINCE_GCM_IV_STORE_END_ADDR_FUSE_IDX (36u)\r\n\r\n#define OTP_PRINCE_GCM_IV_STORE_END_ADDR_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_PRINCE_GCM_IV_STORE_END_ADDR_FUSE_IDX])\r\n/* Fuse Word PRINCE_GCM_REG0_START_ADDR Index 37 */\r\n#define OTP_PRINCE_GCM_REG0_START_ADDR_FUSE_IDX (37u)\r\n\r\n#define OTP_PRINCE_GCM_REG0_START_ADDR_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_PRINCE_GCM_REG0_START_ADDR_FUSE_IDX])\r\n#define OTP_IPED_REG0_START_ADDR_FUSE_IDX           (37u)\r\n#define OTP_IPED_REG0_START_ADDR_FUSE_SHIFT         (0u)\r\n#define OTP_IPED_REG0_START_ADDR_FUSE_MASK          (0xFFFFFFu)\r\n#define OTP_IPED_REG0_START_ADDR_FUSE_WIDTH         (24u)\r\n#define OTP_IPED_REG0_START_ADDR_FUSE_VALUE()                                                       \\\r\n    ((OCOTP->OTP_SHADOW[OTP_IPED_REG0_START_ADDR_FUSE_IDX] & OTP_IPED_REG0_START_ADDR_FUSE_MASK) >> \\\r\n     OTP_IPED_REG0_START_ADDR_FUSE_SHIFT)\r\n\r\n#define OTP_ENABLE_REG0_FUSE_IDX   (37u)\r\n#define OTP_ENABLE_REG0_FUSE_SHIFT (30u)\r\n#define OTP_ENABLE_REG0_FUSE_MASK  (0xC0000000u)\r\n#define OTP_ENABLE_REG0_FUSE_WIDTH (2u)\r\n#define OTP_ENABLE_REG0_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_ENABLE_REG0_FUSE_IDX] & OTP_ENABLE_REG0_FUSE_MASK) >> OTP_ENABLE_REG0_FUSE_SHIFT)\r\n\r\n/* Fuse Word PRINCE_GCM_REG0_END_ADDR Index 38 */\r\n#define OTP_PRINCE_GCM_REG0_END_ADDR_FUSE_IDX (38u)\r\n\r\n#define OTP_PRINCE_GCM_REG0_END_ADDR_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_PRINCE_GCM_REG0_END_ADDR_FUSE_IDX])\r\n\r\n/* Fuse Word PRINCE_GCM_REG1_START_ADDR Index 39 */\r\n#define OTP_PRINCE_GCM_REG1_START_ADDR_FUSE_IDX (39u)\r\n\r\n#define OTP_PRINCE_GCM_REG1_START_ADDR_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_PRINCE_GCM_REG1_START_ADDR_FUSE_IDX])\r\n#define OTP_IPED_REG1_START_ADDR_FUSE_IDX           (39u)\r\n#define OTP_IPED_REG1_START_ADDR_FUSE_SHIFT         (0u)\r\n#define OTP_IPED_REG1_START_ADDR_FUSE_MASK          (0xFFFFFFu)\r\n#define OTP_IPED_REG1_START_ADDR_FUSE_WIDTH         (24u)\r\n#define OTP_IPED_REG1_START_ADDR_FUSE_VALUE()                                                       \\\r\n    ((OCOTP->OTP_SHADOW[OTP_IPED_REG1_START_ADDR_FUSE_IDX] & OTP_IPED_REG1_START_ADDR_FUSE_MASK) >> \\\r\n     OTP_IPED_REG1_START_ADDR_FUSE_SHIFT)\r\n\r\n#define OTP_ENABLE_REG1_FUSE_IDX   (39u)\r\n#define OTP_ENABLE_REG1_FUSE_SHIFT (30u)\r\n#define OTP_ENABLE_REG1_FUSE_MASK  (0xC0000000u)\r\n#define OTP_ENABLE_REG1_FUSE_WIDTH (2u)\r\n#define OTP_ENABLE_REG1_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_ENABLE_REG1_FUSE_IDX] & OTP_ENABLE_REG1_FUSE_MASK) >> OTP_ENABLE_REG1_FUSE_SHIFT)\r\n\r\n/* Fuse Word PRINCE_GCM_REG1_END_ADDR Index 40 */\r\n#define OTP_PRINCE_GCM_REG1_END_ADDR_FUSE_IDX (40u)\r\n\r\n#define OTP_PRINCE_GCM_REG1_END_ADDR_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_PRINCE_GCM_REG1_END_ADDR_FUSE_IDX])\r\n\r\n/* Fuse Word PRINCE_GCM_REG2_START_ADDR Index 41 */\r\n#define OTP_PRINCE_GCM_REG2_START_ADDR_FUSE_IDX (41u)\r\n\r\n#define OTP_PRINCE_GCM_REG2_START_ADDR_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_PRINCE_GCM_REG2_START_ADDR_FUSE_IDX])\r\n#define OTP_IPED_REG2_START_ADDR_FUSE_IDX           (41u)\r\n#define OTP_IPED_REG2_START_ADDR_FUSE_SHIFT         (0u)\r\n#define OTP_IPED_REG2_START_ADDR_FUSE_MASK          (0xFFFFFFu)\r\n#define OTP_IPED_REG2_START_ADDR_FUSE_WIDTH         (24u)\r\n#define OTP_IPED_REG2_START_ADDR_FUSE_VALUE()                                                       \\\r\n    ((OCOTP->OTP_SHADOW[OTP_IPED_REG2_START_ADDR_FUSE_IDX] & OTP_IPED_REG2_START_ADDR_FUSE_MASK) >> \\\r\n     OTP_IPED_REG2_START_ADDR_FUSE_SHIFT)\r\n\r\n#define OTP_ENABLE_REG2_FUSE_IDX   (41u)\r\n#define OTP_ENABLE_REG2_FUSE_SHIFT (30u)\r\n#define OTP_ENABLE_REG2_FUSE_MASK  (0xC0000000u)\r\n#define OTP_ENABLE_REG2_FUSE_WIDTH (2u)\r\n#define OTP_ENABLE_REG2_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_ENABLE_REG2_FUSE_IDX] & OTP_ENABLE_REG2_FUSE_MASK) >> OTP_ENABLE_REG2_FUSE_SHIFT)\r\n\r\n/* Fuse Word PRINCE_GCM_REG2_END_ADDR Index 42 */\r\n#define OTP_PRINCE_GCM_REG2_END_ADDR_FUSE_IDX (42u)\r\n\r\n#define OTP_PRINCE_GCM_REG2_END_ADDR_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_PRINCE_GCM_REG2_END_ADDR_FUSE_IDX])\r\n\r\n/* Fuse Word PRINCE_GCM_REG3_START_ADDR Index 43 */\r\n#define OTP_PRINCE_GCM_REG3_START_ADDR_FUSE_IDX (43u)\r\n\r\n#define OTP_PRINCE_GCM_REG3_START_ADDR_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_PRINCE_GCM_REG3_START_ADDR_FUSE_IDX])\r\n#define OTP_IPED_REG3_START_ADDR_FUSE_IDX           (43u)\r\n#define OTP_IPED_REG3_START_ADDR_FUSE_SHIFT         (0u)\r\n#define OTP_IPED_REG3_START_ADDR_FUSE_MASK          (0xFFFFFFu)\r\n#define OTP_IPED_REG3_START_ADDR_FUSE_WIDTH         (24u)\r\n#define OTP_IPED_REG3_START_ADDR_FUSE_VALUE()                                                       \\\r\n    ((OCOTP->OTP_SHADOW[OTP_IPED_REG3_START_ADDR_FUSE_IDX] & OTP_IPED_REG3_START_ADDR_FUSE_MASK) >> \\\r\n     OTP_IPED_REG3_START_ADDR_FUSE_SHIFT)\r\n\r\n#define OTP_ENABLE_REG3_FUSE_IDX   (43u)\r\n#define OTP_ENABLE_REG3_FUSE_SHIFT (30u)\r\n#define OTP_ENABLE_REG3_FUSE_MASK  (0xC0000000u)\r\n#define OTP_ENABLE_REG3_FUSE_WIDTH (2u)\r\n#define OTP_ENABLE_REG3_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_ENABLE_REG3_FUSE_IDX] & OTP_ENABLE_REG3_FUSE_MASK) >> OTP_ENABLE_REG3_FUSE_SHIFT)\r\n\r\n/* Fuse Word PRINCE_GCM_REG3_END_ADDR Index 44 */\r\n#define OTP_PRINCE_GCM_REG3_END_ADDR_FUSE_IDX (44u)\r\n\r\n#define OTP_PRINCE_GCM_REG3_END_ADDR_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_PRINCE_GCM_REG3_END_ADDR_FUSE_IDX])\r\n\r\n/* Fuse Word LIFE_CYCLE_STATE Index 45 */\r\n#define OTP_LIFE_CYCLE_STATE_FUSE_IDX (45u)\r\n\r\n#define OTP_LIFE_CYCLE_STATE_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_LIFE_CYCLE_STATE_FUSE_IDX])\r\n#define OTP_LCS_FUSE_IDX                  (45u)\r\n#define OTP_LCS_FUSE_SHIFT                (0u)\r\n#define OTP_LCS_FUSE_MASK                 (0xFFu)\r\n#define OTP_LCS_FUSE_WIDTH                (8u)\r\n#define OTP_LCS_FUSE_VALUE()              ((OCOTP->OTP_SHADOW[OTP_LCS_FUSE_IDX] & OTP_LCS_FUSE_MASK) >> OTP_LCS_FUSE_SHIFT)\r\n\r\n#define OTP_LCS_REDUNDANT_FUSE_IDX   (45u)\r\n#define OTP_LCS_REDUNDANT_FUSE_SHIFT (8u)\r\n#define OTP_LCS_REDUNDANT_FUSE_MASK  (0xFF00u)\r\n#define OTP_LCS_REDUNDANT_FUSE_WIDTH (8u)\r\n#define OTP_LCS_REDUNDANT_FUSE_VALUE() \\\r\n    ((OCOTP->OTP_SHADOW[OTP_LCS_REDUNDANT_FUSE_IDX] & OTP_LCS_REDUNDANT_FUSE_MASK) >> OTP_LCS_REDUNDANT_FUSE_SHIFT)\r\n\r\n/* Fuse Word UUID[31:0] Index 46 */\r\n#define OTP_UUID_31_0_FUSE_IDX (46u)\r\n\r\n/* Fuse Word UUID[63:32] Index 47 */\r\n#define OTP_UUID_63_32_FUSE_IDX (47u)\r\n\r\n/* Fuse Word UUID[95:64] Index 48 */\r\n#define OTP_UUID_95_64_FUSE_IDX (48u)\r\n\r\n/* Fuse Word UUID[127:96] Index 49 */\r\n#define OTP_UUID_127_96_FUSE_IDX (49u)\r\n\r\n/* Fuse Word RO_PUF[31:0] Index 50 */\r\n#define OTP_RO_PUF_31_0_FUSE_IDX (50u)\r\n\r\n/* Fuse Word RO_PUF[63:32] Index 51 */\r\n#define OTP_RO_PUF_63_32_FUSE_IDX (51u)\r\n\r\n/* Fuse Word RO_PUF[95:64] Index 52 */\r\n#define OTP_RO_PUF_95_64_FUSE_IDX (52u)\r\n\r\n/* Fuse Word RO_PUF[127:96] Index 53 */\r\n#define OTP_RO_PUF_127_96_FUSE_IDX (53u)\r\n\r\n/* Fuse Word RO_PUF[159:128] Index 54 */\r\n#define OTP_RO_PUF_159_128_FUSE_IDX (54u)\r\n\r\n/* Fuse Word RO_PUF[191:160] Index 55 */\r\n#define OTP_RO_PUF_191_160_FUSE_IDX (55u)\r\n\r\n/* Fuse Word RO_PUF[223:192] Index 56 */\r\n#define OTP_RO_PUF_223_192_FUSE_IDX (56u)\r\n\r\n/* Fuse Word RO_PUF[255:224] Index 57 */\r\n#define OTP_RO_PUF_255_224_FUSE_IDX (57u)\r\n\r\n/* Fuse Word RO_PUF[287:256] Index 58 */\r\n#define OTP_RO_PUF_287_256_FUSE_IDX (58u)\r\n\r\n/* Fuse Word RO_PUF[319:288] Index 59 */\r\n#define OTP_RO_PUF_319_288_FUSE_IDX (59u)\r\n\r\n/* Fuse Word RO_PUF[351:320] Index 60 */\r\n#define OTP_RO_PUF_351_320_FUSE_IDX (60u)\r\n\r\n/* Fuse Word RO_PUF[383:352] Index 61 */\r\n#define OTP_RO_PUF_383_352_FUSE_IDX (61u)\r\n\r\n/* Fuse Word RO_PUF[415:384] Index 62 */\r\n#define OTP_RO_PUF_415_384_FUSE_IDX (62u)\r\n\r\n/* Fuse Word RO_PUF[447:416] Index 63 */\r\n#define OTP_RO_PUF_447_416_FUSE_IDX (63u)\r\n\r\n/* Fuse Word RO_PUF[479:448] Index 64 */\r\n#define OTP_RO_PUF_479_448_FUSE_IDX (64u)\r\n\r\n/* Fuse Word RO_PUF[511:480] Index 65 */\r\n#define OTP_RO_PUF_511_480_FUSE_IDX (65u)\r\n\r\n/* Fuse Word RO_PUF[543:512] Index 66 */\r\n#define OTP_RO_PUF_543_512_FUSE_IDX (66u)\r\n\r\n/* Fuse Word RO_PUF[575:544] Index 67 */\r\n#define OTP_RO_PUF_575_544_FUSE_IDX (67u)\r\n\r\n/* Fuse Word RO_PUF[607:576] Index 68 */\r\n#define OTP_RO_PUF_607_576_FUSE_IDX (68u)\r\n\r\n/* Fuse Word RO_PUF[639:608] Index 69 */\r\n#define OTP_RO_PUF_639_608_FUSE_IDX (69u)\r\n\r\n/* Fuse Word RO_PUF[671:640] Index 70 */\r\n#define OTP_RO_PUF_671_640_FUSE_IDX (70u)\r\n\r\n/* Fuse Word RO_PUF[703:672] Index 71 */\r\n#define OTP_RO_PUF_703_672_FUSE_IDX (71u)\r\n\r\n/* Fuse Word RO_PUF[735:704] Index 72 */\r\n#define OTP_RO_PUF_735_704_FUSE_IDX (72u)\r\n\r\n/* Fuse Word RO_PUF[767:736] Index 73 */\r\n#define OTP_RO_PUF_767_736_FUSE_IDX (73u)\r\n\r\n/* Fuse Word RO_PUF[799:768] Index 74 */\r\n#define OTP_RO_PUF_799_768_FUSE_IDX (74u)\r\n\r\n/* Fuse Word RO_PUF[831:800] Index 75 */\r\n#define OTP_RO_PUF_831_800_FUSE_IDX (75u)\r\n\r\n/* Fuse Word OTP_SHARE1[31:0] Index 76 */\r\n#define OTP_OTP_SHARE1_31_0_FUSE_IDX (76u)\r\n\r\n#define OTP_OTP_SHARE1_31_0_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_OTP_SHARE1_31_0_FUSE_IDX])\r\n/* Fuse Word OTP_SHARE1[63:32] Index 77 */\r\n#define OTP_OTP_SHARE1_63_32_FUSE_IDX (77u)\r\n\r\n#define OTP_OTP_SHARE1_63_32_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_OTP_SHARE1_63_32_FUSE_IDX])\r\n/* Fuse Word OTP_SHARE1[95:64] Index 78 */\r\n#define OTP_OTP_SHARE1_95_64_FUSE_IDX (78u)\r\n\r\n#define OTP_OTP_SHARE1_95_64_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_OTP_SHARE1_95_64_FUSE_IDX])\r\n/* Fuse Word OTP_SHARE1[127:96] Index 79 */\r\n#define OTP_OTP_SHARE1_127_96_FUSE_IDX (79u)\r\n\r\n#define OTP_OTP_SHARE1_127_96_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_OTP_SHARE1_127_96_FUSE_IDX])\r\n/* Fuse Word OTP_SHARE1[159:128] Index 80 */\r\n#define OTP_OTP_SHARE1_159_128_FUSE_IDX (80u)\r\n\r\n#define OTP_OTP_SHARE1_159_128_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_OTP_SHARE1_159_128_FUSE_IDX])\r\n/* Fuse Word OTP_SHARE1[191:160] Index 81 */\r\n#define OTP_OTP_SHARE1_191_160_FUSE_IDX (81u)\r\n\r\n#define OTP_OTP_SHARE1_191_160_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_OTP_SHARE1_191_160_FUSE_IDX])\r\n/* Fuse Word OTP_SHARE1[223:192] Index 82 */\r\n#define OTP_OTP_SHARE1_223_192_FUSE_IDX (82u)\r\n\r\n#define OTP_OTP_SHARE1_223_192_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_OTP_SHARE1_223_192_FUSE_IDX])\r\n/* Fuse Word OTP_SHARE1[255:224] Index 83 */\r\n#define OTP_OTP_SHARE1_255_224_FUSE_IDX (83u)\r\n\r\n#define OTP_OTP_SHARE1_255_224_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_OTP_SHARE1_255_224_FUSE_IDX])\r\n/* Fuse Word OTP_SHARE2[31:0] Index 84 */\r\n#define OTP_OTP_SHARE2_31_0_FUSE_IDX (84u)\r\n\r\n#define OTP_OTP_SHARE2_31_0_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_OTP_SHARE2_31_0_FUSE_IDX])\r\n/* Fuse Word OTP_SHARE2[63:32] Index 85 */\r\n#define OTP_OTP_SHARE2_63_32_FUSE_IDX (85u)\r\n\r\n#define OTP_OTP_SHARE2_63_32_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_OTP_SHARE2_63_32_FUSE_IDX])\r\n/* Fuse Word OTP_SHARE2[95:64] Index 86 */\r\n#define OTP_OTP_SHARE2_95_64_FUSE_IDX (86u)\r\n\r\n#define OTP_OTP_SHARE2_95_64_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_OTP_SHARE2_95_64_FUSE_IDX])\r\n/* Fuse Word OTP_SHARE2[127:96] Index 87 */\r\n#define OTP_OTP_SHARE2_127_96_FUSE_IDX (87u)\r\n\r\n#define OTP_OTP_SHARE2_127_96_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_OTP_SHARE2_127_96_FUSE_IDX])\r\n/* Fuse Word OTP_SHARE2[159:128] Index 88 */\r\n#define OTP_OTP_SHARE2_159_128_FUSE_IDX (88u)\r\n\r\n#define OTP_OTP_SHARE2_159_128_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_OTP_SHARE2_159_128_FUSE_IDX])\r\n/* Fuse Word OTP_SHARE2[191:160] Index 89 */\r\n#define OTP_OTP_SHARE2_191_160_FUSE_IDX (89u)\r\n\r\n#define OTP_OTP_SHARE2_191_160_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_OTP_SHARE2_191_160_FUSE_IDX])\r\n/* Fuse Word OTP_SHARE2[223:192] Index 90 */\r\n#define OTP_OTP_SHARE2_223_192_FUSE_IDX (90u)\r\n\r\n#define OTP_OTP_SHARE2_223_192_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_OTP_SHARE2_223_192_FUSE_IDX])\r\n/* Fuse Word OTP_SHARE2[255:224] Index 91 */\r\n#define OTP_OTP_SHARE2_255_224_FUSE_IDX (91u)\r\n\r\n#define OTP_OTP_SHARE2_255_224_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_OTP_SHARE2_255_224_FUSE_IDX])\r\n/* Fuse Word CUST_SK_MK[31:0] Index 92 */\r\n#define OTP_CUST_SK_MK_31_0_FUSE_IDX (92u)\r\n\r\n#define OTP_CUST_SK_MK_31_0_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_CUST_SK_MK_31_0_FUSE_IDX])\r\n/* Fuse Word CUST_SK_MK[63:32] Index 93 */\r\n#define OTP_CUST_SK_MK_63_32_FUSE_IDX (93u)\r\n\r\n#define OTP_CUST_SK_MK_63_32_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_CUST_SK_MK_63_32_FUSE_IDX])\r\n/* Fuse Word CUST_SK_MK[95:64] Index 94 */\r\n#define OTP_CUST_SK_MK_95_64_FUSE_IDX (94u)\r\n\r\n#define OTP_CUST_SK_MK_95_64_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_CUST_SK_MK_95_64_FUSE_IDX])\r\n/* Fuse Word CUST_SK_MK[127:96] Index 95 */\r\n#define OTP_CUST_SK_MK_127_96_FUSE_IDX (95u)\r\n\r\n#define OTP_CUST_SK_MK_127_96_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_CUST_SK_MK_127_96_FUSE_IDX])\r\n/* Fuse Word CUST_SK_MK[159:128] Index 96 */\r\n#define OTP_CUST_SK_MK_159_128_FUSE_IDX (96u)\r\n\r\n#define OTP_CUST_SK_MK_159_128_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_CUST_SK_MK_159_128_FUSE_IDX])\r\n/* Fuse Word CUST_SK_MK[191:160] Index 97 */\r\n#define OTP_CUST_SK_MK_191_160_FUSE_IDX (97u)\r\n\r\n#define OTP_CUST_SK_MK_191_160_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_CUST_SK_MK_191_160_FUSE_IDX])\r\n/* Fuse Word CUST_SK_MK[223:192] Index 98 */\r\n#define OTP_CUST_SK_MK_223_192_FUSE_IDX (98u)\r\n\r\n#define OTP_CUST_SK_MK_223_192_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_CUST_SK_MK_223_192_FUSE_IDX])\r\n/* Fuse Word CUST_SK_MK[255:224] Index 99 */\r\n#define OTP_CUST_SK_MK_255_224_FUSE_IDX (99u)\r\n\r\n#define OTP_CUST_SK_MK_255_224_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_CUST_SK_MK_255_224_FUSE_IDX])\r\n/* Fuse Word CUST_SK_MK[287:256] Index 100 */\r\n#define OTP_CUST_SK_MK_287_256_FUSE_IDX (100u)\r\n\r\n#define OTP_CUST_SK_MK_287_256_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_CUST_SK_MK_287_256_FUSE_IDX])\r\n/* Fuse Word CUST_SK_MK[319:288] Index 101 */\r\n#define OTP_CUST_SK_MK_319_288_FUSE_IDX (101u)\r\n\r\n#define OTP_CUST_SK_MK_319_288_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_CUST_SK_MK_319_288_FUSE_IDX])\r\n/* Fuse Word CUST_SK_MK[351:320] Index 102 */\r\n#define OTP_CUST_SK_MK_351_320_FUSE_IDX (102u)\r\n\r\n#define OTP_CUST_SK_MK_351_320_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_CUST_SK_MK_351_320_FUSE_IDX])\r\n/* Fuse Word CUST_SK_MK[383:352] Index 103 */\r\n#define OTP_CUST_SK_MK_383_352_FUSE_IDX (103u)\r\n\r\n#define OTP_CUST_SK_MK_383_352_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_CUST_SK_MK_383_352_FUSE_IDX])\r\n/* Fuse Word RKTH[383:352] Index 104 */\r\n#define OTP_RKTH_383_352_FUSE_IDX (104u)\r\n\r\n#define OTP_RKTH_383_352_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_RKTH_383_352_FUSE_IDX])\r\n/* Fuse Word RKTH[351:320] Index 105 */\r\n#define OTP_RKTH_351_320_FUSE_IDX (105u)\r\n\r\n#define OTP_RKTH_351_320_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_RKTH_351_320_FUSE_IDX])\r\n/* Fuse Word RKTH[319:288] Index 106 */\r\n#define OTP_RKTH_319_288_FUSE_IDX (106u)\r\n\r\n#define OTP_RKTH_319_288_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_RKTH_319_288_FUSE_IDX])\r\n/* Fuse Word RKTH[287:256] Index 107 */\r\n#define OTP_RKTH_287_256_FUSE_IDX (107u)\r\n\r\n#define OTP_RKTH_287_256_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_RKTH_287_256_FUSE_IDX])\r\n/* Fuse Word RKTH[255:224] Index 108 */\r\n#define OTP_RKTH_255_224_FUSE_IDX (108u)\r\n\r\n#define OTP_RKTH_255_224_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_RKTH_255_224_FUSE_IDX])\r\n/* Fuse Word RKTH[223:192] Index 109 */\r\n#define OTP_RKTH_223_192_FUSE_IDX (109u)\r\n\r\n#define OTP_RKTH_223_192_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_RKTH_223_192_FUSE_IDX])\r\n/* Fuse Word RKTH[191:160] Index 110 */\r\n#define OTP_RKTH_191_160_FUSE_IDX (110u)\r\n\r\n#define OTP_RKTH_191_160_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_RKTH_191_160_FUSE_IDX])\r\n/* Fuse Word RKTH[159:128] Index 111 */\r\n#define OTP_RKTH_159_128_FUSE_IDX (111u)\r\n\r\n#define OTP_RKTH_159_128_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_RKTH_159_128_FUSE_IDX])\r\n/* Fuse Word RKTH[127:96] Index 112 */\r\n#define OTP_RKTH_127_96_FUSE_IDX (112u)\r\n\r\n#define OTP_RKTH_127_96_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_RKTH_127_96_FUSE_IDX])\r\n/* Fuse Word RKTH[95:64] Index 113 */\r\n#define OTP_RKTH_95_64_FUSE_IDX (113u)\r\n\r\n#define OTP_RKTH_95_64_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_RKTH_95_64_FUSE_IDX])\r\n/* Fuse Word RKTH[63:32] Index 114 */\r\n#define OTP_RKTH_63_32_FUSE_IDX (114u)\r\n\r\n#define OTP_RKTH_63_32_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_RKTH_63_32_FUSE_IDX])\r\n/* Fuse Word RKTH[31:0] Index 115 */\r\n#define OTP_RKTH_31_0_FUSE_IDX (115u)\r\n\r\n#define OTP_RKTH_31_0_FUSE_VALUE() (OCOTP->OTP_SHADOW[OTP_RKTH_31_0_FUSE_IDX])\r\n/* Fuse Word NXP_WIFI_SK_MK[31:0] Index 116 */\r\n#define OTP_NXP_WIFI_SK_MK_31_0_FUSE_IDX (116u)\r\n\r\n/* Fuse Word NXP_WIFI_SK_MK[63:32] Index 117 */\r\n#define OTP_NXP_WIFI_SK_MK_63_32_FUSE_IDX (117u)\r\n\r\n/* Fuse Word NXP_WIFI_SK_MK[95:64] Index 118 */\r\n#define OTP_NXP_WIFI_SK_MK_95_64_FUSE_IDX (118u)\r\n\r\n/* Fuse Word NXP_WIFI_SK_MK[127:96] Index 119 */\r\n#define OTP_NXP_WIFI_SK_MK_127_96_FUSE_IDX (119u)\r\n\r\n/* Fuse Word NXP_WIFI_SK_MK[159:128] Index 120 */\r\n#define OTP_NXP_WIFI_SK_MK_159_128_FUSE_IDX (120u)\r\n\r\n/* Fuse Word NXP_WIFI_SK_MK[191:160] Index 121 */\r\n#define OTP_NXP_WIFI_SK_MK_191_160_FUSE_IDX (121u)\r\n\r\n/* Fuse Word NXP_WIFI_SK_MK[223:192] Index 122 */\r\n#define OTP_NXP_WIFI_SK_MK_223_192_FUSE_IDX (122u)\r\n\r\n/* Fuse Word NXP_WIFI_SK_MK[255:224] Index 123 */\r\n#define OTP_NXP_WIFI_SK_MK_255_224_FUSE_IDX (123u)\r\n\r\n/* Fuse Word NXP_WIFI_SK_MK[287:256] Index 124 */\r\n#define OTP_NXP_WIFI_SK_MK_287_256_FUSE_IDX (124u)\r\n\r\n/* Fuse Word NXP_WIFI_SK_MK[319:288] Index 125 */\r\n#define OTP_NXP_WIFI_SK_MK_319_288_FUSE_IDX (125u)\r\n\r\n/* Fuse Word NXP_WIFI_SK_MK[351:320] Index 126 */\r\n#define OTP_NXP_WIFI_SK_MK_351_320_FUSE_IDX (126u)\r\n\r\n/* Fuse Word NXP_WIFI_SK_MK[383:352] Index 127 */\r\n#define OTP_NXP_WIFI_SK_MK_383_352_FUSE_IDX (127u)\r\n\r\n/* Fuse Word DTRNG_CFG[31:0] Index 128 */\r\n#define OTP_DTRNG_CFG_31_0_FUSE_IDX (128u)\r\n\r\n/* Fuse Word DTRNG_CFG[63:32] Index 129 */\r\n#define OTP_DTRNG_CFG_63_32_FUSE_IDX (129u)\r\n\r\n/* Fuse Word DTRNG_CFG[95:64] Index 130 */\r\n#define OTP_DTRNG_CFG_95_64_FUSE_IDX (130u)\r\n\r\n/* Fuse Word DTRNG_CFG[127:96] Index 131 */\r\n#define OTP_DTRNG_CFG_127_96_FUSE_IDX (131u)\r\n\r\n/* Fuse Word DTRNG_CFG[159:128] Index 132 */\r\n#define OTP_DTRNG_CFG_159_128_FUSE_IDX (132u)\r\n\r\n/* Fuse Word DTRNG_CFG[191:160] Index 133 */\r\n#define OTP_DTRNG_CFG_191_160_FUSE_IDX (133u)\r\n\r\n/* Fuse Word DTRNG_CFG[223:192] Index 134 */\r\n#define OTP_DTRNG_CFG_223_192_FUSE_IDX (134u)\r\n\r\n/* Fuse Word DTRNG_CFG[255:224] Index 135 */\r\n#define OTP_DTRNG_CFG_255_224_FUSE_IDX (135u)\r\n\r\n/* Fuse Word DTRNG_CFG[287:256] Index 136 */\r\n#define OTP_DTRNG_CFG_287_256_FUSE_IDX (136u)\r\n\r\n/* Fuse Word DTRNG_CFG[319:288] Index 137 */\r\n#define OTP_DTRNG_CFG_319_288_FUSE_IDX (137u)\r\n\r\n/* Fuse Word DTRNG_CFG[351:320] Index 138 */\r\n#define OTP_DTRNG_CFG_351_320_FUSE_IDX (138u)\r\n\r\n/* Fuse Word DTRNG_CFG[383:352] Index 139 */\r\n#define OTP_DTRNG_CFG_383_352_FUSE_IDX (139u)\r\n\r\n/* Fuse Word DTRNG_CFG[415:384] Index 140 */\r\n#define OTP_DTRNG_CFG_415_384_FUSE_IDX (140u)\r\n\r\n/* Fuse Word DTRNG_CFG[447:416] Index 141 */\r\n#define OTP_DTRNG_CFG_447_416_FUSE_IDX (141u)\r\n\r\n/* Fuse Word DTRNG_CFG[479:448] Index 142 */\r\n#define OTP_DTRNG_CFG_479_448_FUSE_IDX (142u)\r\n\r\n/* Fuse Word DTRNG_CFG[511:480] Index 143 */\r\n#define OTP_DTRNG_CFG_511_480_FUSE_IDX (143u)\r\n\r\n/* Fuse Word DTRNG_CFG[543:512] Index 144 */\r\n#define OTP_DTRNG_CFG_543_512_FUSE_IDX (144u)\r\n\r\n/* Fuse Word DTRNG_CFG[575:544] Index 145 */\r\n#define OTP_DTRNG_CFG_575_544_FUSE_IDX (145u)\r\n\r\n/* Fuse Word DTRNG_CFG[607:576] Index 146 */\r\n#define OTP_DTRNG_CFG_607_576_FUSE_IDX (146u)\r\n\r\n/* Fuse Word DTRNG_CFG[639:608] Index 147 */\r\n#define OTP_DTRNG_CFG_639_608_FUSE_IDX (147u)\r\n\r\n/* Fuse Word DTRNG_CFG[671:640] Index 148 */\r\n#define OTP_DTRNG_CFG_671_640_FUSE_IDX (148u)\r\n\r\n/* Fuse Word GDET_CFG[31:0] Index 149 */\r\n#define OTP_GDET_CFG_31_0_FUSE_IDX (149u)\r\n\r\n/* Fuse Word GDET_CFG[63:32] Index 150 */\r\n#define OTP_GDET_CFG_63_32_FUSE_IDX (150u)\r\n\r\n/* Fuse Word GDET_CFG[95:64] Index 151 */\r\n#define OTP_GDET_CFG_95_64_FUSE_IDX (151u)\r\n\r\n/* Fuse Word GDET_CFG[127:96] Index 152 */\r\n#define OTP_GDET_CFG_127_96_FUSE_IDX (152u)\r\n\r\n/* Fuse Word GDET_CFG[159:128] Index 153 */\r\n#define OTP_GDET_CFG_159_128_FUSE_IDX (153u)\r\n\r\n/* Fuse Word GDET_CFG[191:160] Index 154 */\r\n#define OTP_GDET_CFG_191_160_FUSE_IDX (154u)\r\n\r\n/* Fuse Word GDET_TRIM0 Index 155 */\r\n#define OTP_GDET_TRIM0_FUSE_IDX (155u)\r\n\r\n#define OTP_GDET_TRIM0_31_0_FUSE_IDX   (155u)\r\n#define OTP_GDET_TRIM0_31_0_FUSE_SHIFT (0u)\r\n#define OTP_GDET_TRIM0_31_0_FUSE_MASK  (0xFFFFFFFFu)\r\n#define OTP_GDET_TRIM0_31_0_FUSE_WIDTH (32u)\r\n\r\n/* Fuse Word USER_ECC_0 Index 156 */\r\n#define OTP_USER_ECC_0_FUSE_IDX (156u)\r\n\r\n/* Fuse Word USER_ECC_1 Index 157 */\r\n#define OTP_USER_ECC_1_FUSE_IDX (157u)\r\n\r\n/* Fuse Word USER_ECC_2 Index 158 */\r\n#define OTP_USER_ECC_2_FUSE_IDX (158u)\r\n\r\n/* Fuse Word USER_ECC_3 Index 159 */\r\n#define OTP_USER_ECC_3_FUSE_IDX (159u)\r\n\r\n/* Fuse Word USER_ECC_4 Index 160 */\r\n#define OTP_USER_ECC_4_FUSE_IDX (160u)\r\n\r\n/* Fuse Word USER_ECC_5 Index 161 */\r\n#define OTP_USER_ECC_5_FUSE_IDX (161u)\r\n\r\n/* Fuse Word USER_ECC_6 Index 162 */\r\n#define OTP_USER_ECC_6_FUSE_IDX (162u)\r\n\r\n/* Fuse Word USER_ECC_7 Index 163 */\r\n#define OTP_USER_ECC_7_FUSE_IDX (163u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA0 Index 164 */\r\n#define OTP_ROM_PATCH_DATA0_FUSE_IDX (164u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA1 Index 165 */\r\n#define OTP_ROM_PATCH_DATA1_FUSE_IDX (165u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA2 Index 166 */\r\n#define OTP_ROM_PATCH_DATA2_FUSE_IDX (166u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA3 Index 167 */\r\n#define OTP_ROM_PATCH_DATA3_FUSE_IDX (167u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA4 Index 168 */\r\n#define OTP_ROM_PATCH_DATA4_FUSE_IDX (168u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA5 Index 169 */\r\n#define OTP_ROM_PATCH_DATA5_FUSE_IDX (169u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA6 Index 170 */\r\n#define OTP_ROM_PATCH_DATA6_FUSE_IDX (170u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA7 Index 171 */\r\n#define OTP_ROM_PATCH_DATA7_FUSE_IDX (171u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA8 Index 172 */\r\n#define OTP_ROM_PATCH_DATA8_FUSE_IDX (172u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA9 Index 173 */\r\n#define OTP_ROM_PATCH_DATA9_FUSE_IDX (173u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA10 Index 174 */\r\n#define OTP_ROM_PATCH_DATA10_FUSE_IDX (174u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA11 Index 175 */\r\n#define OTP_ROM_PATCH_DATA11_FUSE_IDX (175u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA12 Index 176 */\r\n#define OTP_ROM_PATCH_DATA12_FUSE_IDX (176u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA13 Index 177 */\r\n#define OTP_ROM_PATCH_DATA13_FUSE_IDX (177u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA14 Index 178 */\r\n#define OTP_ROM_PATCH_DATA14_FUSE_IDX (178u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA15 Index 179 */\r\n#define OTP_ROM_PATCH_DATA15_FUSE_IDX (179u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA16 Index 180 */\r\n#define OTP_ROM_PATCH_DATA16_FUSE_IDX (180u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA17 Index 181 */\r\n#define OTP_ROM_PATCH_DATA17_FUSE_IDX (181u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA18 Index 182 */\r\n#define OTP_ROM_PATCH_DATA18_FUSE_IDX (182u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA19 Index 183 */\r\n#define OTP_ROM_PATCH_DATA19_FUSE_IDX (183u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA20 Index 184 */\r\n#define OTP_ROM_PATCH_DATA20_FUSE_IDX (184u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA21 Index 185 */\r\n#define OTP_ROM_PATCH_DATA21_FUSE_IDX (185u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA22 Index 186 */\r\n#define OTP_ROM_PATCH_DATA22_FUSE_IDX (186u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA23 Index 187 */\r\n#define OTP_ROM_PATCH_DATA23_FUSE_IDX (187u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA24 Index 188 */\r\n#define OTP_ROM_PATCH_DATA24_FUSE_IDX (188u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA25 Index 189 */\r\n#define OTP_ROM_PATCH_DATA25_FUSE_IDX (189u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA26 Index 190 */\r\n#define OTP_ROM_PATCH_DATA26_FUSE_IDX (190u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA27 Index 191 */\r\n#define OTP_ROM_PATCH_DATA27_FUSE_IDX (191u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA28 Index 192 */\r\n#define OTP_ROM_PATCH_DATA28_FUSE_IDX (192u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA29 Index 193 */\r\n#define OTP_ROM_PATCH_DATA29_FUSE_IDX (193u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA30 Index 194 */\r\n#define OTP_ROM_PATCH_DATA30_FUSE_IDX (194u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA31 Index 195 */\r\n#define OTP_ROM_PATCH_DATA31_FUSE_IDX (195u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA32 Index 196 */\r\n#define OTP_ROM_PATCH_DATA32_FUSE_IDX (196u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA33 Index 197 */\r\n#define OTP_ROM_PATCH_DATA33_FUSE_IDX (197u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA34 Index 198 */\r\n#define OTP_ROM_PATCH_DATA34_FUSE_IDX (198u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA35 Index 199 */\r\n#define OTP_ROM_PATCH_DATA35_FUSE_IDX (199u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA36 Index 200 */\r\n#define OTP_ROM_PATCH_DATA36_FUSE_IDX (200u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA37 Index 201 */\r\n#define OTP_ROM_PATCH_DATA37_FUSE_IDX (201u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA38 Index 202 */\r\n#define OTP_ROM_PATCH_DATA38_FUSE_IDX (202u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA39 Index 203 */\r\n#define OTP_ROM_PATCH_DATA39_FUSE_IDX (203u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA40 Index 204 */\r\n#define OTP_ROM_PATCH_DATA40_FUSE_IDX (204u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA41 Index 205 */\r\n#define OTP_ROM_PATCH_DATA41_FUSE_IDX (205u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA42 Index 206 */\r\n#define OTP_ROM_PATCH_DATA42_FUSE_IDX (206u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA43 Index 207 */\r\n#define OTP_ROM_PATCH_DATA43_FUSE_IDX (207u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA44 Index 208 */\r\n#define OTP_ROM_PATCH_DATA44_FUSE_IDX (208u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA45 Index 209 */\r\n#define OTP_ROM_PATCH_DATA45_FUSE_IDX (209u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA46 Index 210 */\r\n#define OTP_ROM_PATCH_DATA46_FUSE_IDX (210u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA47 Index 211 */\r\n#define OTP_ROM_PATCH_DATA47_FUSE_IDX (211u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA48 Index 212 */\r\n#define OTP_ROM_PATCH_DATA48_FUSE_IDX (212u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA49 Index 213 */\r\n#define OTP_ROM_PATCH_DATA49_FUSE_IDX (213u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA50 Index 214 */\r\n#define OTP_ROM_PATCH_DATA50_FUSE_IDX (214u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA51 Index 215 */\r\n#define OTP_ROM_PATCH_DATA51_FUSE_IDX (215u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA52 Index 216 */\r\n#define OTP_ROM_PATCH_DATA52_FUSE_IDX (216u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA53 Index 217 */\r\n#define OTP_ROM_PATCH_DATA53_FUSE_IDX (217u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA54 Index 218 */\r\n#define OTP_ROM_PATCH_DATA54_FUSE_IDX (218u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA55 Index 219 */\r\n#define OTP_ROM_PATCH_DATA55_FUSE_IDX (219u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA56 Index 220 */\r\n#define OTP_ROM_PATCH_DATA56_FUSE_IDX (220u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA57 Index 221 */\r\n#define OTP_ROM_PATCH_DATA57_FUSE_IDX (221u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA58 Index 222 */\r\n#define OTP_ROM_PATCH_DATA58_FUSE_IDX (222u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA59 Index 223 */\r\n#define OTP_ROM_PATCH_DATA59_FUSE_IDX (223u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA60 Index 224 */\r\n#define OTP_ROM_PATCH_DATA60_FUSE_IDX (224u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA61 Index 225 */\r\n#define OTP_ROM_PATCH_DATA61_FUSE_IDX (225u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA62 Index 226 */\r\n#define OTP_ROM_PATCH_DATA62_FUSE_IDX (226u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA63 Index 227 */\r\n#define OTP_ROM_PATCH_DATA63_FUSE_IDX (227u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA64 Index 228 */\r\n#define OTP_ROM_PATCH_DATA64_FUSE_IDX (228u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA65 Index 229 */\r\n#define OTP_ROM_PATCH_DATA65_FUSE_IDX (229u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA66 Index 230 */\r\n#define OTP_ROM_PATCH_DATA66_FUSE_IDX (230u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA67 Index 231 */\r\n#define OTP_ROM_PATCH_DATA67_FUSE_IDX (231u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA68 Index 232 */\r\n#define OTP_ROM_PATCH_DATA68_FUSE_IDX (232u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA69 Index 233 */\r\n#define OTP_ROM_PATCH_DATA69_FUSE_IDX (233u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA70 Index 234 */\r\n#define OTP_ROM_PATCH_DATA70_FUSE_IDX (234u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA71 Index 235 */\r\n#define OTP_ROM_PATCH_DATA71_FUSE_IDX (235u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA72 Index 236 */\r\n#define OTP_ROM_PATCH_DATA72_FUSE_IDX (236u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA73 Index 237 */\r\n#define OTP_ROM_PATCH_DATA73_FUSE_IDX (237u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA74 Index 238 */\r\n#define OTP_ROM_PATCH_DATA74_FUSE_IDX (238u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA75 Index 239 */\r\n#define OTP_ROM_PATCH_DATA75_FUSE_IDX (239u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA76 Index 240 */\r\n#define OTP_ROM_PATCH_DATA76_FUSE_IDX (240u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA77 Index 241 */\r\n#define OTP_ROM_PATCH_DATA77_FUSE_IDX (241u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA78 Index 242 */\r\n#define OTP_ROM_PATCH_DATA78_FUSE_IDX (242u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA79 Index 243 */\r\n#define OTP_ROM_PATCH_DATA79_FUSE_IDX (243u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA80 Index 244 */\r\n#define OTP_ROM_PATCH_DATA80_FUSE_IDX (244u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA81 Index 245 */\r\n#define OTP_ROM_PATCH_DATA81_FUSE_IDX (245u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA82 Index 246 */\r\n#define OTP_ROM_PATCH_DATA82_FUSE_IDX (246u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA83 Index 247 */\r\n#define OTP_ROM_PATCH_DATA83_FUSE_IDX (247u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA84 Index 248 */\r\n#define OTP_ROM_PATCH_DATA84_FUSE_IDX (248u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA85 Index 249 */\r\n#define OTP_ROM_PATCH_DATA85_FUSE_IDX (249u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA86 Index 250 */\r\n#define OTP_ROM_PATCH_DATA86_FUSE_IDX (250u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA87 Index 251 */\r\n#define OTP_ROM_PATCH_DATA87_FUSE_IDX (251u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA88 Index 252 */\r\n#define OTP_ROM_PATCH_DATA88_FUSE_IDX (252u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA89 Index 253 */\r\n#define OTP_ROM_PATCH_DATA89_FUSE_IDX (253u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA90 Index 254 */\r\n#define OTP_ROM_PATCH_DATA90_FUSE_IDX (254u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA91 Index 255 */\r\n#define OTP_ROM_PATCH_DATA91_FUSE_IDX (255u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA92 Index 256 */\r\n#define OTP_ROM_PATCH_DATA92_FUSE_IDX (256u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA93 Index 257 */\r\n#define OTP_ROM_PATCH_DATA93_FUSE_IDX (257u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA94 Index 258 */\r\n#define OTP_ROM_PATCH_DATA94_FUSE_IDX (258u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA95 Index 259 */\r\n#define OTP_ROM_PATCH_DATA95_FUSE_IDX (259u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA96 Index 260 */\r\n#define OTP_ROM_PATCH_DATA96_FUSE_IDX (260u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA97 Index 261 */\r\n#define OTP_ROM_PATCH_DATA97_FUSE_IDX (261u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA98 Index 262 */\r\n#define OTP_ROM_PATCH_DATA98_FUSE_IDX (262u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA99 Index 263 */\r\n#define OTP_ROM_PATCH_DATA99_FUSE_IDX (263u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA100 Index 264 */\r\n#define OTP_ROM_PATCH_DATA100_FUSE_IDX (264u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA101 Index 265 */\r\n#define OTP_ROM_PATCH_DATA101_FUSE_IDX (265u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA102 Index 266 */\r\n#define OTP_ROM_PATCH_DATA102_FUSE_IDX (266u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA103 Index 267 */\r\n#define OTP_ROM_PATCH_DATA103_FUSE_IDX (267u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA104 Index 268 */\r\n#define OTP_ROM_PATCH_DATA104_FUSE_IDX (268u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA105 Index 269 */\r\n#define OTP_ROM_PATCH_DATA105_FUSE_IDX (269u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA106 Index 270 */\r\n#define OTP_ROM_PATCH_DATA106_FUSE_IDX (270u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA107 Index 271 */\r\n#define OTP_ROM_PATCH_DATA107_FUSE_IDX (271u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA108 Index 272 */\r\n#define OTP_ROM_PATCH_DATA108_FUSE_IDX (272u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA109 Index 273 */\r\n#define OTP_ROM_PATCH_DATA109_FUSE_IDX (273u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA110 Index 274 */\r\n#define OTP_ROM_PATCH_DATA110_FUSE_IDX (274u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA111 Index 275 */\r\n#define OTP_ROM_PATCH_DATA111_FUSE_IDX (275u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA112 Index 276 */\r\n#define OTP_ROM_PATCH_DATA112_FUSE_IDX (276u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA113 Index 277 */\r\n#define OTP_ROM_PATCH_DATA113_FUSE_IDX (277u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA114 Index 278 */\r\n#define OTP_ROM_PATCH_DATA114_FUSE_IDX (278u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA115 Index 279 */\r\n#define OTP_ROM_PATCH_DATA115_FUSE_IDX (279u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA116 Index 280 */\r\n#define OTP_ROM_PATCH_DATA116_FUSE_IDX (280u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA117 Index 281 */\r\n#define OTP_ROM_PATCH_DATA117_FUSE_IDX (281u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA118 Index 282 */\r\n#define OTP_ROM_PATCH_DATA118_FUSE_IDX (282u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA119 Index 283 */\r\n#define OTP_ROM_PATCH_DATA119_FUSE_IDX (283u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA120 Index 284 */\r\n#define OTP_ROM_PATCH_DATA120_FUSE_IDX (284u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA121 Index 285 */\r\n#define OTP_ROM_PATCH_DATA121_FUSE_IDX (285u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA122 Index 286 */\r\n#define OTP_ROM_PATCH_DATA122_FUSE_IDX (286u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA123 Index 287 */\r\n#define OTP_ROM_PATCH_DATA123_FUSE_IDX (287u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA124 Index 288 */\r\n#define OTP_ROM_PATCH_DATA124_FUSE_IDX (288u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA125 Index 289 */\r\n#define OTP_ROM_PATCH_DATA125_FUSE_IDX (289u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA126 Index 290 */\r\n#define OTP_ROM_PATCH_DATA126_FUSE_IDX (290u)\r\n\r\n/* Fuse Word ROM_PATCH_DATA127 Index 291 */\r\n#define OTP_ROM_PATCH_DATA127_FUSE_IDX (291u)\r\n\r\n/* Fuse Word CERTIFICATE0[31:0] Index 292 */\r\n#define OTP_CERTIFICATE0_31_0_FUSE_IDX (292u)\r\n\r\n/* Fuse Word CERTIFICATE0[63:32] Index 293 */\r\n#define OTP_CERTIFICATE0_63_32_FUSE_IDX (293u)\r\n\r\n/* Fuse Word CERTIFICATE0[95:64] Index 294 */\r\n#define OTP_CERTIFICATE0_95_64_FUSE_IDX (294u)\r\n\r\n/* Fuse Word CERTIFICATE0[127:96] Index 295 */\r\n#define OTP_CERTIFICATE0_127_96_FUSE_IDX (295u)\r\n\r\n/* Fuse Word CERTIFICATE0[159:128] Index 296 */\r\n#define OTP_CERTIFICATE0_159_128_FUSE_IDX (296u)\r\n\r\n/* Fuse Word CERTIFICATE0[191:160] Index 297 */\r\n#define OTP_CERTIFICATE0_191_160_FUSE_IDX (297u)\r\n\r\n/* Fuse Word CERTIFICATE0[223:192] Index 298 */\r\n#define OTP_CERTIFICATE0_223_192_FUSE_IDX (298u)\r\n\r\n/* Fuse Word CERTIFICATE0[255:224] Index 299 */\r\n#define OTP_CERTIFICATE0_255_224_FUSE_IDX (299u)\r\n\r\n/* Fuse Word CERTIFICATE0[287:256] Index 300 */\r\n#define OTP_CERTIFICATE0_287_256_FUSE_IDX (300u)\r\n\r\n/* Fuse Word CERTIFICATE0[319:288] Index 301 */\r\n#define OTP_CERTIFICATE0_319_288_FUSE_IDX (301u)\r\n\r\n/* Fuse Word CERTIFICATE0[351:320] Index 302 */\r\n#define OTP_CERTIFICATE0_351_320_FUSE_IDX (302u)\r\n\r\n/* Fuse Word CERTIFICATE0[383:352] Index 303 */\r\n#define OTP_CERTIFICATE0_383_352_FUSE_IDX (303u)\r\n\r\n/* Fuse Word CERTIFICATE0[415:384] Index 304 */\r\n#define OTP_CERTIFICATE0_415_384_FUSE_IDX (304u)\r\n\r\n/* Fuse Word CERTIFICATE0[447:416] Index 305 */\r\n#define OTP_CERTIFICATE0_447_416_FUSE_IDX (305u)\r\n\r\n/* Fuse Word CERTIFICATE0[479:448] Index 306 */\r\n#define OTP_CERTIFICATE0_479_448_FUSE_IDX (306u)\r\n\r\n/* Fuse Word CERTIFICATE0[511:480] Index 307 */\r\n#define OTP_CERTIFICATE0_511_480_FUSE_IDX (307u)\r\n\r\n/* Fuse Word CERTIFICATE0[543:512] Index 308 */\r\n#define OTP_CERTIFICATE0_543_512_FUSE_IDX (308u)\r\n\r\n/* Fuse Word CERTIFICATE0[575:544] Index 309 */\r\n#define OTP_CERTIFICATE0_575_544_FUSE_IDX (309u)\r\n\r\n/* Fuse Word CERTIFICATE0[607:576] Index 310 */\r\n#define OTP_CERTIFICATE0_607_576_FUSE_IDX (310u)\r\n\r\n/* Fuse Word CERTIFICATE0[639:608] Index 311 */\r\n#define OTP_CERTIFICATE0_639_608_FUSE_IDX (311u)\r\n\r\n/* Fuse Word CERTIFICATE0[671:640] Index 312 */\r\n#define OTP_CERTIFICATE0_671_640_FUSE_IDX (312u)\r\n\r\n/* Fuse Word CERTIFICATE0[703:672] Index 313 */\r\n#define OTP_CERTIFICATE0_703_672_FUSE_IDX (313u)\r\n\r\n/* Fuse Word CERTIFICATE0[735:704] Index 314 */\r\n#define OTP_CERTIFICATE0_735_704_FUSE_IDX (314u)\r\n\r\n/* Fuse Word CRC0 Index 360 */\r\n#define OTP_CRC0_FUSE_IDX (360u)\r\n\r\n/* Fuse Word CRC1 Index 361 */\r\n#define OTP_CRC1_FUSE_IDX (361u)\r\n\r\n/* Fuse Word CRC2 Index 362 */\r\n#define OTP_CRC2_FUSE_IDX (362u)\r\n\r\n/* Fuse Word CRC3 Index 363 */\r\n#define OTP_CRC3_FUSE_IDX (363u)\r\n\r\n/* Fuse Word CRC4 Index 364 */\r\n#define OTP_CRC4_FUSE_IDX (364u)\r\n\r\n/* Fuse Word CRC5 Index 365 */\r\n#define OTP_CRC5_FUSE_IDX (365u)\r\n\r\n/* Fuse Word CRC6 Index 366 */\r\n#define OTP_CRC6_FUSE_IDX (366u)\r\n\r\n/* Fuse Word CRC7 Index 367 */\r\n#define OTP_CRC7_FUSE_IDX (367u)\r\n\r\n/* Fuse Word NT_FW_VER0 Index 368 */\r\n#define OTP_NT_FW_VER0_FUSE_IDX (368u)\r\n\r\n#define OTP_NT_FW_VER_15_0_FUSE_IDX   (368u)\r\n#define OTP_NT_FW_VER_15_0_FUSE_SHIFT (0u)\r\n#define OTP_NT_FW_VER_15_0_FUSE_MASK  (0xFFFFu)\r\n#define OTP_NT_FW_VER_15_0_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word NT_FW_VER1 Index 369 */\r\n#define OTP_NT_FW_VER1_FUSE_IDX (369u)\r\n\r\n#define OTP_NT_FW_VER_31_16_FUSE_IDX   (369u)\r\n#define OTP_NT_FW_VER_31_16_FUSE_SHIFT (0u)\r\n#define OTP_NT_FW_VER_31_16_FUSE_MASK  (0xFFFFu)\r\n#define OTP_NT_FW_VER_31_16_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word NT_FW_VER2 Index 370 */\r\n#define OTP_NT_FW_VER2_FUSE_IDX (370u)\r\n\r\n#define OTP_NT_FW_VER_47_32_FUSE_IDX   (370u)\r\n#define OTP_NT_FW_VER_47_32_FUSE_SHIFT (0u)\r\n#define OTP_NT_FW_VER_47_32_FUSE_MASK  (0xFFFFu)\r\n#define OTP_NT_FW_VER_47_32_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word NT_FW_VER3 Index 371 */\r\n#define OTP_NT_FW_VER3_FUSE_IDX (371u)\r\n\r\n#define OTP_NT_FW_VER_63_48_FUSE_IDX   (371u)\r\n#define OTP_NT_FW_VER_63_48_FUSE_SHIFT (0u)\r\n#define OTP_NT_FW_VER_63_48_FUSE_MASK  (0xFFFFu)\r\n#define OTP_NT_FW_VER_63_48_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word NT_FW_VER4 Index 372 */\r\n#define OTP_NT_FW_VER4_FUSE_IDX (372u)\r\n\r\n#define OTP_NT_FW_VER_79_64_FUSE_IDX   (372u)\r\n#define OTP_NT_FW_VER_79_64_FUSE_SHIFT (0u)\r\n#define OTP_NT_FW_VER_79_64_FUSE_MASK  (0xFFFFu)\r\n#define OTP_NT_FW_VER_79_64_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word NT_FW_VER5 Index 373 */\r\n#define OTP_NT_FW_VER5_FUSE_IDX (373u)\r\n\r\n#define OTP_NT_FW_VER_95_80_FUSE_IDX   (373u)\r\n#define OTP_NT_FW_VER_95_80_FUSE_SHIFT (0u)\r\n#define OTP_NT_FW_VER_95_80_FUSE_MASK  (0xFFFFu)\r\n#define OTP_NT_FW_VER_95_80_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word NT_FW_VER6 Index 374 */\r\n#define OTP_NT_FW_VER6_FUSE_IDX (374u)\r\n\r\n#define OTP_NT_FW_VER_111_96_FUSE_IDX   (374u)\r\n#define OTP_NT_FW_VER_111_96_FUSE_SHIFT (0u)\r\n#define OTP_NT_FW_VER_111_96_FUSE_MASK  (0xFFFFu)\r\n#define OTP_NT_FW_VER_111_96_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word NT_FW_VER7 Index 375 */\r\n#define OTP_NT_FW_VER7_FUSE_IDX (375u)\r\n\r\n#define OTP_NT_FW_VER_127_112_FUSE_IDX   (375u)\r\n#define OTP_NT_FW_VER_127_112_FUSE_SHIFT (0u)\r\n#define OTP_NT_FW_VER_127_112_FUSE_MASK  (0xFFFFu)\r\n#define OTP_NT_FW_VER_127_112_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word NT_FW_VER8 Index 376 */\r\n#define OTP_NT_FW_VER8_FUSE_IDX (376u)\r\n\r\n#define OTP_NT_FW_VER_143_128_FUSE_IDX   (376u)\r\n#define OTP_NT_FW_VER_143_128_FUSE_SHIFT (0u)\r\n#define OTP_NT_FW_VER_143_128_FUSE_MASK  (0xFFFFu)\r\n#define OTP_NT_FW_VER_143_128_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word NT_FW_VER9 Index 377 */\r\n#define OTP_NT_FW_VER9_FUSE_IDX (377u)\r\n\r\n#define OTP_NT_FW_VER_159_144_FUSE_IDX   (377u)\r\n#define OTP_NT_FW_VER_159_144_FUSE_SHIFT (0u)\r\n#define OTP_NT_FW_VER_159_144_FUSE_MASK  (0xFFFFu)\r\n#define OTP_NT_FW_VER_159_144_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word NT_FW_VER10 Index 378 */\r\n#define OTP_NT_FW_VER10_FUSE_IDX (378u)\r\n\r\n#define OTP_NT_FW_VER_175_160_FUSE_IDX   (378u)\r\n#define OTP_NT_FW_VER_175_160_FUSE_SHIFT (0u)\r\n#define OTP_NT_FW_VER_175_160_FUSE_MASK  (0xFFFFu)\r\n#define OTP_NT_FW_VER_175_160_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word NT_FW_VER11 Index 379 */\r\n#define OTP_NT_FW_VER11_FUSE_IDX (379u)\r\n\r\n#define OTP_NT_FW_VER_191_176_FUSE_IDX   (379u)\r\n#define OTP_NT_FW_VER_191_176_FUSE_SHIFT (0u)\r\n#define OTP_NT_FW_VER_191_176_FUSE_MASK  (0xFFFFu)\r\n#define OTP_NT_FW_VER_191_176_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word NT_FW_VER12 Index 380 */\r\n#define OTP_NT_FW_VER12_FUSE_IDX (380u)\r\n\r\n#define OTP_NT_FW_VER_207_192_FUSE_IDX   (380u)\r\n#define OTP_NT_FW_VER_207_192_FUSE_SHIFT (0u)\r\n#define OTP_NT_FW_VER_207_192_FUSE_MASK  (0xFFFFu)\r\n#define OTP_NT_FW_VER_207_192_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word NT_FW_VER13 Index 381 */\r\n#define OTP_NT_FW_VER13_FUSE_IDX (381u)\r\n\r\n#define OTP_NT_FW_VER_223_208_FUSE_IDX   (381u)\r\n#define OTP_NT_FW_VER_223_208_FUSE_SHIFT (0u)\r\n#define OTP_NT_FW_VER_223_208_FUSE_MASK  (0xFFFFu)\r\n#define OTP_NT_FW_VER_223_208_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word NT_FW_VER14 Index 382 */\r\n#define OTP_NT_FW_VER14_FUSE_IDX (382u)\r\n\r\n#define OTP_NT_FW_VER_239_224_FUSE_IDX   (382u)\r\n#define OTP_NT_FW_VER_239_224_FUSE_SHIFT (0u)\r\n#define OTP_NT_FW_VER_239_224_FUSE_MASK  (0xFFFFu)\r\n#define OTP_NT_FW_VER_239_224_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word NT_FW_VER15 Index 383 */\r\n#define OTP_NT_FW_VER15_FUSE_IDX (383u)\r\n\r\n#define OTP_NT_FW_VER_255_240_FUSE_IDX   (383u)\r\n#define OTP_NT_FW_VER_255_240_FUSE_SHIFT (0u)\r\n#define OTP_NT_FW_VER_255_240_FUSE_MASK  (0xFFFFu)\r\n#define OTP_NT_FW_VER_255_240_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word TZ_FW_VER0 Index 384 */\r\n#define OTP_TZ_FW_VER0_FUSE_IDX (384u)\r\n\r\n#define OTP_TZ_FW_VER_15_0_FUSE_IDX   (384u)\r\n#define OTP_TZ_FW_VER_15_0_FUSE_SHIFT (0u)\r\n#define OTP_TZ_FW_VER_15_0_FUSE_MASK  (0xFFFFu)\r\n#define OTP_TZ_FW_VER_15_0_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word TZ_FW_VER1 Index 385 */\r\n#define OTP_TZ_FW_VER1_FUSE_IDX (385u)\r\n\r\n#define OTP_TZ_FW_VER_31_16_FUSE_IDX   (385u)\r\n#define OTP_TZ_FW_VER_31_16_FUSE_SHIFT (0u)\r\n#define OTP_TZ_FW_VER_31_16_FUSE_MASK  (0xFFFFu)\r\n#define OTP_TZ_FW_VER_31_16_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word TZ_FW_VER2 Index 386 */\r\n#define OTP_TZ_FW_VER2_FUSE_IDX (386u)\r\n\r\n#define OTP_TZ_FW_VER_47_32_FUSE_IDX   (386u)\r\n#define OTP_TZ_FW_VER_47_32_FUSE_SHIFT (0u)\r\n#define OTP_TZ_FW_VER_47_32_FUSE_MASK  (0xFFFFu)\r\n#define OTP_TZ_FW_VER_47_32_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word TZ_FW_VER3 Index 387 */\r\n#define OTP_TZ_FW_VER3_FUSE_IDX (387u)\r\n\r\n#define OTP_TZ_FW_VER_63_48_FUSE_IDX   (387u)\r\n#define OTP_TZ_FW_VER_63_48_FUSE_SHIFT (0u)\r\n#define OTP_TZ_FW_VER_63_48_FUSE_MASK  (0xFFFFu)\r\n#define OTP_TZ_FW_VER_63_48_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word WIFI_FW_VER0 Index 388 */\r\n#define OTP_WIFI_FW_VER0_FUSE_IDX (388u)\r\n\r\n#define OTP_WIFI_FW_VER_15_0_FUSE_IDX   (388u)\r\n#define OTP_WIFI_FW_VER_15_0_FUSE_SHIFT (0u)\r\n#define OTP_WIFI_FW_VER_15_0_FUSE_MASK  (0xFFFFu)\r\n#define OTP_WIFI_FW_VER_15_0_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word WIFI_FW_VER1 Index 389 */\r\n#define OTP_WIFI_FW_VER1_FUSE_IDX (389u)\r\n\r\n#define OTP_WIFI_FW_VER_31_16_FUSE_IDX   (389u)\r\n#define OTP_WIFI_FW_VER_31_16_FUSE_SHIFT (0u)\r\n#define OTP_WIFI_FW_VER_31_16_FUSE_MASK  (0xFFFFu)\r\n#define OTP_WIFI_FW_VER_31_16_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word WIFI_FW_VER2 Index 390 */\r\n#define OTP_WIFI_FW_VER2_FUSE_IDX (390u)\r\n\r\n#define OTP_WIFI_FW_VER_47_32_FUSE_IDX   (390u)\r\n#define OTP_WIFI_FW_VER_47_32_FUSE_SHIFT (0u)\r\n#define OTP_WIFI_FW_VER_47_32_FUSE_MASK  (0xFFFFu)\r\n#define OTP_WIFI_FW_VER_47_32_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word WIFI_FW_VER3 Index 391 */\r\n#define OTP_WIFI_FW_VER3_FUSE_IDX (391u)\r\n\r\n#define OTP_WIFI_FW_VER_63_48_FUSE_IDX   (391u)\r\n#define OTP_WIFI_FW_VER_63_48_FUSE_SHIFT (0u)\r\n#define OTP_WIFI_FW_VER_63_48_FUSE_MASK  (0xFFFFu)\r\n#define OTP_WIFI_FW_VER_63_48_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word BLE_FW_VER0 Index 392 */\r\n#define OTP_BLE_FW_VER0_FUSE_IDX (392u)\r\n\r\n#define OTP_BLE_FW_VER_15_0_FUSE_IDX   (392u)\r\n#define OTP_BLE_FW_VER_15_0_FUSE_SHIFT (0u)\r\n#define OTP_BLE_FW_VER_15_0_FUSE_MASK  (0xFFFFu)\r\n#define OTP_BLE_FW_VER_15_0_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word BLE_FW_VER1 Index 393 */\r\n#define OTP_BLE_FW_VER1_FUSE_IDX (393u)\r\n\r\n#define OTP_BLE_FW_VER_31_16_FUSE_IDX   (393u)\r\n#define OTP_BLE_FW_VER_31_16_FUSE_SHIFT (0u)\r\n#define OTP_BLE_FW_VER_31_16_FUSE_MASK  (0xFFFFu)\r\n#define OTP_BLE_FW_VER_31_16_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word BLE_FW_VER2 Index 394 */\r\n#define OTP_BLE_FW_VER2_FUSE_IDX (394u)\r\n\r\n#define OTP_BLE_FW_VER_47_32_FUSE_IDX   (394u)\r\n#define OTP_BLE_FW_VER_47_32_FUSE_SHIFT (0u)\r\n#define OTP_BLE_FW_VER_47_32_FUSE_MASK  (0xFFFFu)\r\n#define OTP_BLE_FW_VER_47_32_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word BLE_FW_VER3 Index 395 */\r\n#define OTP_BLE_FW_VER3_FUSE_IDX (395u)\r\n\r\n#define OTP_BLE_FW_VER_63_48_FUSE_IDX   (395u)\r\n#define OTP_BLE_FW_VER_63_48_FUSE_SHIFT (0u)\r\n#define OTP_BLE_FW_VER_63_48_FUSE_MASK  (0xFFFFu)\r\n#define OTP_BLE_FW_VER_63_48_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word 15_4_FW_VER0 Index 396 */\r\n#define OTP_15_4_FW_VER0_FUSE_IDX (396u)\r\n\r\n#define OTP_15_4_FW_VER_15_0_FUSE_IDX   (396u)\r\n#define OTP_15_4_FW_VER_15_0_FUSE_SHIFT (0u)\r\n#define OTP_15_4_FW_VER_15_0_FUSE_MASK  (0xFFFFu)\r\n#define OTP_15_4_FW_VER_15_0_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word 15_4_FW_VER1 Index 397 */\r\n#define OTP_15_4_FW_VER1_FUSE_IDX (397u)\r\n\r\n#define OTP_15_4_FW_VER_31_16_FUSE_IDX   (397u)\r\n#define OTP_15_4_FW_VER_31_16_FUSE_SHIFT (0u)\r\n#define OTP_15_4_FW_VER_31_16_FUSE_MASK  (0xFFFFu)\r\n#define OTP_15_4_FW_VER_31_16_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word 15_4_FW_VER2 Index 398 */\r\n#define OTP_15_4_FW_VER2_FUSE_IDX (398u)\r\n\r\n#define OTP_15_4_FW_VER_47_32_FUSE_IDX   (398u)\r\n#define OTP_15_4_FW_VER_47_32_FUSE_SHIFT (0u)\r\n#define OTP_15_4_FW_VER_47_32_FUSE_MASK  (0xFFFFu)\r\n#define OTP_15_4_FW_VER_47_32_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word 15_4_FW_VER3 Index 399 */\r\n#define OTP_15_4_FW_VER3_FUSE_IDX (399u)\r\n\r\n#define OTP_15_4_FW_VER_63_48_FUSE_IDX   (399u)\r\n#define OTP_15_4_FW_VER_63_48_FUSE_SHIFT (0u)\r\n#define OTP_15_4_FW_VER_63_48_FUSE_MASK  (0xFFFFu)\r\n#define OTP_15_4_FW_VER_63_48_FUSE_WIDTH (16u)\r\n\r\n/* Fuse Word USER_RED_0 Index 400 */\r\n#define OTP_USER_RED_0_FUSE_IDX (400u)\r\n\r\n/* Fuse Word USER_RED_1 Index 401 */\r\n#define OTP_USER_RED_1_FUSE_IDX (401u)\r\n\r\n/* Fuse Word USER_RED_2 Index 402 */\r\n#define OTP_USER_RED_2_FUSE_IDX (402u)\r\n\r\n/* Fuse Word USER_RED_3 Index 403 */\r\n#define OTP_USER_RED_3_FUSE_IDX (403u)\r\n\r\n/* Fuse Word ROLLBACK_COUNTER_0 Index 404 */\r\n#define OTP_ROLLBACK_COUNTER_0_FUSE_IDX (404u)\r\n\r\n#define OTP_ROLLBACK_COUNTER_FUSE_IDX   (404u)\r\n#define OTP_ROLLBACK_COUNTER_FUSE_SHIFT (0u)\r\n#define OTP_ROLLBACK_COUNTER_FUSE_MASK  (0xFFFFFFFFu)\r\n#define OTP_ROLLBACK_COUNTER_FUSE_WIDTH (32u)\r\n\r\n/* Fuse Word ROLLBACK_COUNTER_1 Index 405 */\r\n#define OTP_ROLLBACK_COUNTER_1_FUSE_IDX (405u)\r\n\r\n#define OTP_ROLLBACK_COUNTER_FUSE_IDX_1 (405u)\r\n#define OTP_ROLLBACK_COUNTER_FUSE_SHIFT (0u)\r\n#define OTP_ROLLBACK_COUNTER_FUSE_MASK  (0xFFFFFFFFu)\r\n#define OTP_ROLLBACK_COUNTER_FUSE_WIDTH (32u)\r\n\r\n/* Fuse Word ROLLBACK_COUNTER_2 Index 406 */\r\n#define OTP_ROLLBACK_COUNTER_2_FUSE_IDX (406u)\r\n\r\n#define OTP_ROLLBACK_COUNTER_FUSE_IDX_2 (406u)\r\n#define OTP_ROLLBACK_COUNTER_FUSE_SHIFT (0u)\r\n#define OTP_ROLLBACK_COUNTER_FUSE_MASK  (0xFFFFFFFFu)\r\n#define OTP_ROLLBACK_COUNTER_FUSE_WIDTH (32u)\r\n\r\n/* Fuse Word ROLLBACK_COUNTER_3 Index 407 */\r\n#define OTP_ROLLBACK_COUNTER_3_FUSE_IDX (407u)\r\n\r\n#define OTP_ROLLBACK_COUNTER_FUSE_IDX_3 (407u)\r\n#define OTP_ROLLBACK_COUNTER_FUSE_SHIFT (0u)\r\n#define OTP_ROLLBACK_COUNTER_FUSE_MASK  (0xFFFFFFFFu)\r\n#define OTP_ROLLBACK_COUNTER_FUSE_WIDTH (32u)\r\n\r\n#define OTP_FUSEMAP_SIZE (420u)\r\n\r\n#endif // __FUSEMAP_H__\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/conn_fwloader/include/life_cycle.h",
    "content": "/*\r\n * Copyright 2020-2021 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n *\r\n */\r\n\r\n#ifndef __LIFE_CYCLE_H__\r\n#define __LIFE_CYCLE_H__\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n/*! @brief Life cycle definitions. */\r\n#define LIFECYCLE_NXP_BLANK (0x0u)\r\n\r\n#define LIFECYCLE_NXP_DEV_NON_SEC (0xFDu)\r\n#define LIFECYCLE_NXP_DEV_SEC     (0xFEu)\r\n\r\n#define LIFECYCLE_NXP_PROVISIONED  (0x1u)\r\n#define LIFECYCLE_OEM_OPEN         (0x3u)\r\n#define LIFECYCLE_OEM_SECURE       (0x7u)\r\n#define LIFECYCLE_OEM_CLOSED       (0xFu)\r\n#define LIFECYCLE_OEM_FIELD_RETURN (0x1Fu)\r\n#define LIFECYCLE_NXP_FIELD_RETURN (0x3Fu)\r\n\r\n#define LIFECYCLE_OEM_LOCKED (0xCFu)\r\n#define LIFECYCLE_SHREDDED   (0xFFu)\r\n\r\n#define DIS_ROM_HIDIND_MASK  (0xF00000u)\r\n#define DIS_ROM_HIDIND_SHIFT (20u)\r\n\r\n/*******************************************************************************\r\n * Variables\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n\r\nuint32_t get_lifecycle_state(void);\r\n\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/conn_fwloader/include/nboot_rom_api_table.h",
    "content": "/*\r\n *     Copyright 2020-2021 NXP\r\n *     All rights reserved.\r\n *\r\n *     SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n#ifndef __NBOOT_ROM_API_TABLE_H__\r\n#define __NBOOT_ROM_API_TABLE_H__\r\n\r\ntypedef int romapi_status_t;\r\n\r\ntypedef struct\r\n{\r\n    romapi_status_t (*nboot_rsvd0)(void);\r\n    fsl_nboot_status_t (*nboot_context_init)(fsl_nboot_context_t *context);\r\n    fsl_nboot_status_t (*nboot_context_deinit)(fsl_nboot_context_t *context);\r\n    fsl_nboot_status_protected_t (*nboot_sb3_load_manifest)(fsl_nboot_context_t *context,\r\n                                                        uint32_t *manifest,\r\n                                                        fsl_nboot_sb3_load_manifest_parms_t *parms);\r\n    fsl_nboot_status_protected_t (*nboot_sb3_load_block)(fsl_nboot_context_t *context, uint32_t *block);\r\n    fsl_nboot_status_protected_t (*nboot_rsvd1)(void);\r\n    fsl_nboot_status_protected_t (*nboot_rsvd2)(void);\r\n} nboot_interface_v0_t;\r\n\r\ntypedef struct\r\n{\r\n    romapi_status_t (*romapi_rng_generate_random)(uint8_t *output, size_t outputByteLen);\r\n    fsl_nboot_status_t (*nboot_context_init)(fsl_nboot_context_t *context);\r\n    fsl_nboot_status_t (*nboot_context_deinit)(fsl_nboot_context_t *context);\r\n    fsl_nboot_status_protected_t (*nboot_sb3_load_manifest)(fsl_nboot_context_t *context,\r\n                                                        uint32_t *manifest,\r\n                                                        fsl_nboot_sb3_load_manifest_parms_t *parms);\r\n    fsl_nboot_status_protected_t (*nboot_sb3_load_block)(fsl_nboot_context_t *context, uint32_t *block);\r\n    fsl_nboot_status_protected_t (*nboot_img_authenticate_ecdsa)(fsl_nboot_context_t *context,\r\n                                                             uint8_t imageStartAddress[],\r\n                                                             fsl_nboot_bool_t *isSignatureVerified,\r\n                                                             fsl_nboot_img_auth_ecdsa_parms_t *parms);\r\n} nboot_interface_v1_t;\r\n\r\n#endif /* _NBOOT_ROM_API_TABLE_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/conn_fwloader/life_cycle.c",
    "content": "/*\r\n * Copyright 2020 - 2021 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n *\r\n */\r\n\r\n#include <stdint.h>\r\n#include <stdbool.h>\r\n#include \"life_cycle.h\"\r\n#include \"fusemap.h\"\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n * Prototype\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n * Variables\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n * Codes\r\n ******************************************************************************/\r\nuint32_t get_lifecycle_state(void)\r\n{\r\n    uint32_t lifeCycleStateOtpShadow          = OTP_LCS_FUSE_VALUE();\r\n    uint32_t lifeCycleStateRedundantOtpShadow = OTP_LCS_REDUNDANT_FUSE_VALUE();\r\n    if (lifeCycleStateOtpShadow != lifeCycleStateRedundantOtpShadow)\r\n    {\r\n        while (true)\r\n        {\r\n            ; /* No necessary actions. */\r\n        }\r\n    }\r\n\r\n    return ((lifeCycleStateOtpShadow & OTP_LCS_FUSE_MASK) >> OTP_LCS_FUSE_SHIFT);\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/conn_fwloader/nboot_hal.c",
    "content": "/*\r\n * Copyright 2020 - 2021,2024 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n *\r\n */\r\n\r\n#include <limits.h>\r\n#include \"fusemap.h\"\r\n#include \"fsl_loader_utils.h\"\r\n#include \"life_cycle.h\"\r\n#include \"fsl_ocotp.h\"\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n#define NBOOT_HAL_PRINTF(...)\r\n\r\n/*******************************************************************************\r\n * Prototype\r\n ******************************************************************************/\r\n/*!\r\n * @brief Get the root security parameters.\r\n *\r\n * Read the root security configurations from OTP.\r\n *\r\n * @param context   NBOOT context.\r\n * @param parms     Root security parameters.\r\n * @retval kStatus_NBOOT_Fail Operate successfully.\r\n * @retval kStatus_NBOOT_InvalidArgument Invalid values of the parms\r\n * @retval kStatus_NBOOT_Fail Failed to operate.\r\n */\r\nstatic fsl_nboot_status_t nboot_hal_get_root_auth_parms(fsl_nboot_context_t *context, fsl_nboot_rot_auth_parms_t *parms);\r\n\r\n/*!\r\n * @brief Get the ROTK revoke settings.\r\n *\r\n * Read the OTP_ROTK_REVOKE.\r\n *\r\n * @param rotkRevoke ROTK revoke state.\r\n * @param rotkCnt ROTK count.\r\n * @retval kStatus_NBOOT_Fail Operate successfully.\r\n * @retval kStatus_NBOOT_Fail Failed to operate.\r\n */\r\nstatic inline fsl_nboot_status_t nboot_hal_get_rotk_revoke(fsl_nboot_root_key_revocation_t *rotkRevoke, uint32_t rotkCnt);\r\n\r\n/*!\r\n * @brief Get the ROTKH.\r\n *\r\n * Read the IFR_ROTKH.\r\n *\r\n * @param rotkh ROTKH value.\r\n * @param rotkhSize ROTKH size in bytes.\r\n * @retval kStatus_NBOOT_Fail Operate successfully.\r\n * @retval kStatus_NBOOT_Fail Failed to operate.\r\n */\r\nstatic fsl_nboot_status_t nboot_hal_get_rotkh(uint32_t *rotkh, uint32_t rotkhSize);\r\n\r\n/*!\r\n * @brief Get the type of the root keys.\r\n *\r\n * Get the root key type\r\n *\r\n * @param rootKeyType Type of the root keys.\r\n * @retval kStatus_NBOOT_Fail Operate successfully.\r\n * @retval kStatus_NBOOT_Fail Failed to operate.\r\n */\r\nstatic inline fsl_nboot_status_t nboot_hal_get_root_key_type(fsl_nboot_root_key_type_and_length_t *rootKeyType);\r\n\r\n/*!\r\n * @brief Get the Part Common Key(PCK).\r\n *\r\n * Read the IFR_PCK_BLOB.\r\n *\r\n * @param pckBlob PCK blob.\r\n * @param pckBlobSize PCK blob size in byte.\r\n * @retval kStatus_NBOOT_Fail Operate successfully.\r\n * @retval kStatus_NBOOT_Fail Failed to operate.\r\n */\r\nstatic inline fsl_nboot_status_t nboot_hal_get_pck_blob(uint8_t *pckBlob, uint32_t pckBlobSize);\r\n\r\n/*******************************************************************************\r\n * Codes\r\n ******************************************************************************/\r\nstatic inline uint32_t set_antipole(uint32_t value)\r\n{\r\n    return (value & 0xFFFFu) | (~(value & 0xFFFFu) << 16);\r\n}\r\n\r\nstatic fsl_nboot_status_t nboot_hal_get_root_auth_parms(fsl_nboot_context_t *context, fsl_nboot_rot_auth_parms_t *parms)\r\n{\r\n    if ((NULL == context) || (NULL == parms))\r\n    {\r\n        return kStatus_NBOOT_InvalidArgument;\r\n    }\r\n\r\n    fsl_nboot_status_t status = kStatus_NBOOT_Fail;\r\n    do\r\n    {\r\n        status =\r\n            nboot_hal_get_rotk_revoke(&parms->soc_rootKeyRevocation[0],\r\n                                      sizeof(parms->soc_rootKeyRevocation) / sizeof(parms->soc_rootKeyRevocation[0]));\r\n        if (status != kStatus_NBOOT_Success)\r\n        {\r\n            break;\r\n        }\r\n\r\n        status = nboot_hal_get_rotkh(&parms->soc_rkh[0], sizeof(parms->soc_rkh));\r\n        if (status != kStatus_NBOOT_Success)\r\n        {\r\n            break;\r\n        }\r\n\r\n        parms->soc_numberOfRootKeys = 0u;\r\n        parms->soc_rootKeyUsage[1]  = kNBOOT_RootKeyUsage_Unused;\r\n        parms->soc_rootKeyUsage[2]  = kNBOOT_RootKeyUsage_Unused;\r\n        parms->soc_rootKeyUsage[3]  = kNBOOT_RootKeyUsage_Unused;\r\n        for (size_t i = 0; i < (sizeof(parms->soc_rootKeyUsage) / sizeof(parms->soc_rootKeyUsage[0])); i++)\r\n        {\r\n            if ((parms->soc_rootKeyUsage[i] & OTP_ROTK0_USAGE_FUSE_MASK) != kNBOOT_RootKeyUsage_Unused)\r\n            {\r\n                parms->soc_numberOfRootKeys++;\r\n            }\r\n        }\r\n\r\n        status = nboot_hal_get_root_key_type(&parms->soc_rootKeyTypeAndLength);\r\n        if (status != kStatus_NBOOT_Success)\r\n        {\r\n            break;\r\n        }\r\n\r\n        parms->soc_lifecycle = (fsl_nboot_soc_lifecycle_t)set_antipole(get_lifecycle_state());\r\n        status               = kStatus_NBOOT_Success;\r\n    } while (false);\r\n\t\r\n\tif (status != kStatus_NBOOT_Success)\r\n\t{\r\n\t    (void)memset(parms, 0, sizeof(*parms));\r\n\t}\r\n\r\n    return status;\r\n}\r\n\r\nstatic inline fsl_nboot_status_t nboot_hal_get_rotk_revoke(fsl_nboot_root_key_revocation_t *rotkRevoke, uint32_t rotkCnt)\r\n{\r\n    /* No need to check the input arguments for this inline functions. */\r\n    assert(rotkRevoke);\r\n    assert(rotkCnt == NBOOT_ROOT_CERT_COUNT);\r\n\r\n    /* Set all root key to 'revoked' state */\r\n    for (uint32_t i = 0u; i < rotkCnt; i++)\r\n    {\r\n        rotkRevoke[i] = kNBOOT_RootKey_Enabled;\r\n    }\r\n\r\n    return kStatus_NBOOT_Success;\r\n}\r\n\r\nstatic fsl_nboot_status_t nboot_hal_get_rotkh(uint32_t *rotkh, uint32_t rotkhSize)\r\n{\r\n    /* No need to check the input arguments for this inline functions. */\r\n    assert(rotkh);\r\n    assert(rotkhSize == (uint32_t)NBOOT_ROOT_ROTKH_SIZE_IN_BYTE);\r\n\r\n    fsl_nboot_status_t status = kStatus_NBOOT_Success;\r\n\r\n    /* root key hash fixed in Flash memory */\r\n#ifdef USE_ENG_CERTIFICATE\r\n    rotkh[0]  = 0xd0cfb419U;\r\n    rotkh[1]  = 0x4037ee3cU;\r\n    rotkh[2]  = 0xde74393eU;\r\n    rotkh[3]  = 0x0156d0a3U;\r\n    rotkh[4]  = 0x373b8677U;\r\n    rotkh[5]  = 0x6b6aee3dU;\r\n    rotkh[6]  = 0x619b459eU;\r\n    rotkh[7]  = 0xfa33f31dU;\r\n    rotkh[8]  = 0x00000000U;\r\n    rotkh[9]  = 0x00000000U;\r\n    rotkh[10] = 0x00000000U;\r\n    rotkh[11] = 0x00000000U;\r\n#else\r\n    if ((get_chip_revision() == 0U))\r\n    {\r\n        rotkh[0]  = 0x60DFBEE6U;\r\n        rotkh[1]  = 0x8799305FU;\r\n        rotkh[2]  = 0xBA9E4AE6U;\r\n        rotkh[3]  = 0x1908394FU;\r\n        rotkh[4]  = 0x7AC4F934U;\r\n        rotkh[5]  = 0xEF76BF41U;\r\n        rotkh[6]  = 0x2E27796EU;\r\n        rotkh[7]  = 0x94DB19A0U;\r\n        rotkh[8]  = 0x00000000U;\r\n        rotkh[9]  = 0x00000000U;\r\n        rotkh[10] = 0x00000000U;\r\n        rotkh[11] = 0x00000000U;\r\n    }\r\n    else if ((get_chip_revision() == 1U))\r\n    {\r\n        rotkh[0]  = 0x9C758C58U;\r\n        rotkh[1]  = 0x0A5CCEAAU;\r\n        rotkh[2]  = 0x850DAD41U;\r\n        rotkh[3]  = 0x1371EEBAU;\r\n        rotkh[4]  = 0xB7874851U;\r\n        rotkh[5]  = 0x53C5BA44U;\r\n        rotkh[6]  = 0xF236F964U;\r\n        rotkh[7]  = 0x3320ECDFU;\r\n        rotkh[8]  = 0x00000000U;\r\n        rotkh[9]  = 0x00000000U;\r\n        rotkh[10] = 0x00000000U;\r\n        rotkh[11] = 0x00000000U;\r\n    }\r\n    else if ((get_chip_revision() == 2U))\r\n    {\r\n        rotkh[0]  = 0xE7C7E9BBU;\r\n        rotkh[1]  = 0x12C8C535U;\r\n        rotkh[2]  = 0x37E61148U;\r\n        rotkh[3]  = 0x2BE7F18CU;\r\n        rotkh[4]  = 0x8F0E3094U;\r\n        rotkh[5]  = 0xB2BA7F32U;\r\n        rotkh[6]  = 0xEC9B4ECBU;\r\n        rotkh[7]  = 0xAD9FC941U;\r\n        rotkh[8]  = 0x00000000U;\r\n        rotkh[9]  = 0x00000000U;\r\n        rotkh[10] = 0x00000000U;\r\n        rotkh[11] = 0x00000000U;\r\n    }\r\n\telse\r\n\t{\r\n\t    ; /* none to do */\r\n\t}\r\n#endif\r\n    return status;\r\n}\r\n\r\nstatic inline fsl_nboot_status_t nboot_hal_get_root_key_type(fsl_nboot_root_key_type_and_length_t *rootKeyType)\r\n{\r\n    /* No need to check the input arguments for this inline functions. */\r\n    assert(rootKeyType);\r\n\r\n    *rootKeyType = kNBOOT_RootKey_Ecdsa_P256;\r\n\r\n    return kStatus_NBOOT_Success;\r\n}\r\n\r\nstatic inline fsl_nboot_status_t nboot_hal_get_pck_blob(uint8_t *pckBlob, uint32_t pckBlobSize)\r\n{\r\n    /* No need to check the input arguments for this inline functions. */\r\n    assert(pckBlob);\r\n    assert(pckBlobSize == (uint32_t)NBOOT_PCK_BLOB_SIZE_IN_BYTE);\r\n\r\n    fsl_nboot_status_t status = kStatus_NBOOT_Fail;\r\n    status_t otpStatus    = kStatus_Fail;\r\n\r\n    do\r\n    {\r\n        uint32_t fuseIdxStart = OTP_NXP_WIFI_SK_MK_31_0_FUSE_IDX;\r\n        for (int i = 0; i < (NBOOT_PCK_BLOB_SIZE_IN_BYTE / 4); i++)\r\n        {\r\n            otpStatus = OCOTP_OtpFuseRead(fuseIdxStart, (uint32_t *)(&pckBlob[4 * i]));\r\n            if (otpStatus != kStatus_Success)\r\n            {\r\n                return kStatus_NBOOT_Fail;\r\n            }\r\n            ++fuseIdxStart;\r\n        }\r\n        status = kStatus_NBOOT_Success;\r\n    } while (false);\r\n\r\n    return status;\r\n}\r\n\r\nfsl_nboot_status_t nboot_hal_get_sb3_manifest_params(fsl_nboot_context_t *context, fsl_nboot_sb3_load_manifest_parms_t *parms)\r\n{\r\n    if ((NULL == context) || (NULL == parms))\r\n    {\r\n        return kStatus_NBOOT_InvalidArgument;\r\n    }\r\n\r\n    fsl_nboot_status_t status = kStatus_NBOOT_Fail;\r\n    do\r\n    {\r\n        status = nboot_hal_get_root_auth_parms(context, &parms->soc_RoTNVM);\r\n        if (status != kStatus_NBOOT_Success)\r\n        {\r\n            break;\r\n        }\r\n\r\n        status = nboot_hal_get_pck_blob(&parms->pckBlob[0], sizeof(parms->pckBlob));\r\n        if (status != kStatus_NBOOT_Success)\r\n        {\r\n            break;\r\n        }\r\n\r\n        status = kStatus_NBOOT_Success;\r\n    } while (false);\r\n\r\n    if (status != kStatus_NBOOT_Success)\r\n    {\r\n        (void)memset(parms, 0, sizeof(*parms));\r\n    }\r\n\r\n    return status;\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/conn_fwloader/readme.txt",
    "content": "1.Examples that support monolithic image download do not need the steps 2-6 to load fw:\r\n    Wi-Fi examples: wifi_cli, wifi_wpa_supplicant, wifi_cli_static, wifi_cert, wifi_cli_fw_dump, wifi_cli_prov, wifi_test_mode\r\n\tncp examples: ncp_device\r\n\tcoex examples: coex_cli, coex_supplicant_cli\r\n\r\n\tThese examples can load cpu1/2 fw automatically, don't need to load them seperatly.\r\n\r\n2. FW image names:\r\n\tProduction FW, for users:\r\n\t\trw61x_sb_wifi_a2.bin, for CPU1_wifi of redfinch a2 board\r\n\t\trw61x_sb_ble_a2.bin, for CPU2_ble of redfinch a2 board\r\n\t\trw61x_sb_ble_15d4_combo_a2.bin, for CPU2_ble_15.4_combo of redfinch a2 board\r\n\r\n3. where to get FW image(Production and mfg_FW):\r\n\tIn the directory:  /components/conn_fwloader/fw_bin\r\n\r\n4. How to load FW(Production and mfg_FW):\r\n\tNeed to write the FW image to flash first, then the loadservice will download FW when power on.\r\n\tFor example, the CMD to write CPU1 image to flash in J-link window:\r\n\t\tloadbin C:\\xxx\\rw61x_sb_wifi_xx.bin,0x08400000\r\n\r\n\tThe CMD to write CPU2_ble image to flash in J-link window:\r\n\t\tloadbin C:\\xxx\\rw61x_sb_ble_xx.bin,0x08540000\r\n\r\n\tThe CMD to write CPU2_15.4 image to flash in J-link window:\r\n\t\tloadbin C:\\xxx\\rw61x_sb_ble_15d4_combo_xx.bin,0x085e0000\r\n\r\n5. How to generate the C files to be compiled in the monolithic binary:\r\n\tIn a shell go to directory /components/conn_fwloader. Enter the following command:\r\n\t 'python script/fw_bin2c_conv.py -t sb fw_bin'\r\n\tor 'python script/fw_bin2c_conv.py -t raw fw_bin':\r\n\tThis results in generating the C files under fw_bin/A1 and fw_bin/A2 subdirectories.\r\n\r\n6. Remap mechanism support\r\n\tWhenever the remap feature is active, the flash should not be accessed in direct mode.\r\n\tAs a consequence, no structure cast should be done on flash direct addresses. Likewise memcpy operations\r\n\tshould be avoided. Instead all flash accesses must be done via staging buffers in RAM, that \r\n\tget loaded using the mflash driver."
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/compiler/mcuxClToolchain.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2022-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n#ifndef COMPILER_TOOLCHAIN_H_\r\n#define COMPILER_TOOLCHAIN_H_\r\n\r\n/* for armclang */\r\n#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\r\n    #define CSS_IDATA_SEGMENT __attribute__((section(\"CSS_IDATA_SEGMENT\")))\r\n    #define CSS_CONST_SEGMENT __attribute__((section(\"CSS_CONST_SEGMENT_SECTION\")))\r\n    #define MCUX_FUP_ATTRIBUTE __attribute__((aligned(4))) __attribute__((section(\"MCUX_OBFUSCATED_FUP_SEGMENT\")))\r\n    #define UNUSED_PARAM __attribute__((unused))\r\n    /*  \r\n        Use of UNALIGNED on ARMCLANG\r\n\r\n        The __unaligned keyword is a type qualifier that tells the compiler to treat the pointer or variable as an unaligned pointer or variable.\r\n        www.keil.com/support/man/docs/armclang_ref/armclang_ref_pfl1493130433688.htm\r\n\r\n        The use of __attribute__((packed)) is incorrect on ARMCLANG\r\n\r\n        The packed type attribute specifies that a type must have the smallest possible alignment. This attribute only applies to struct and union types.\r\n        www.keil.com/support/man/docs/armclang_ref/armclang_ref_chr1393328521340.htm\r\n\r\n        -munaligned-access is the default for architectures that support unaligned accesses to data. This default applies to all architectures supported by Arm Compiler for Embedded 6, except Armv6-M, and Armv8-M without the Main Extension.\r\n    */\r\n    #define UNALIGNED __unaligned\r\n    #define MCUX_CSSL_UNUSED(p) ((void) (p))\r\n    /* Macro for alligning buffers to cpu word */\r\n    #define ALIGNED __attribute__((aligned(4))) \r\n\r\n/* using the gcc toolchain file for both gcc and armgcc */\r\n#elif defined ( __GNUC__ )\r\n    #define CSS_IDATA_SEGMENT\r\n    #define CSS_CONST_SEGMENT\r\n    #define MCUX_FUP_ATTRIBUTE __attribute__((aligned(4)))\r\n    #define UNUSED_PARAM __attribute__((unused))\r\n    #define UNALIGNED\r\n    /* Macro for alligning buffers to cpu word */\r\n    #define ALIGNED __attribute__((aligned(4))) \r\n\r\n/* for armcc compiler */\r\n#elif defined ( __CC_ARM )\r\n    #define CSS_IDATA_SEGMENT __attribute__((section(\"CSS_IDATA_SEGMENT\")))\r\n    #define CSS_CONST_SEGMENT __attribute__((section(\"CSS_CONST_SEGMENT\")))\r\n    #define MCUX_FUP_ATTRIBUTE __attribute__((aligned(4))) __attribute__((section(\"MCUX_OBFUSCATED_FUP_SEGMENT\")))\r\n    #define UNUSED_PARAM __attribute__((unused))\r\n    #define UNALIGNED __packed\r\n    /* Macro for alligning buffers to cpu word */\r\n    #define ALIGNED __attribute__((aligned(4))) \r\n\r\n/* for ghs compiler */\r\n#elif defined ( __ghs__ )\r\n    #define CSS_IDATA_SEGMENT\r\n    #define CSS_CONST_SEGMENT\r\n    #define MCUX_FUP_ATTRIBUTE __attribute__((aligned(4)))\r\n    #define UNUSED_PARAM __attribute__((unused))\r\n    #define UNALIGNED\r\n    /* Macro for alligning buffers to cpu word */\r\n    #define ALIGNED __attribute__((aligned(4))) \r\n\r\n/* for iar compiler */\r\n#elif defined ( __ICCARM__ )\r\n    #define CSS_IDATA_SEGMENT __attribute__((section(\"CSS_IDATA_SEGMENT\")))\r\n    #define CSS_CONST_SEGMENT __attribute__((section(\"CSS_CONST_SEGMENT\")))\r\n    #define MCUX_FUP_ATTRIBUTE __attribute__((aligned(4))) __attribute__((section(\".mcux_obfuscated_fup_segment\")))\r\n    #define UNUSED_PARAM __attribute__((unused))\r\n    #define UNALIGNED __packed\r\n    /* Macro for alligning buffers to cpu word */\r\n    #define ALIGNED __attribute__((aligned(4))) \r\n\r\n/* for llvm */\r\n#elif defined ( __clang__ )\r\n    #define CSS_IDATA_SEGMENT\r\n    #define CSS_CONST_SEGMENT\r\n    #define MCUX_FUP_ATTRIBUTE __attribute__((aligned(4)))\r\n    #define UNUSED_PARAM __attribute__((unused))\r\n    #define UNALIGNED\r\n    /* Macro for alligning buffers to cpu word */\r\n    #define ALIGNED __attribute__((aligned(4))) \r\n    \r\n\r\n#endif\r\n\r\n\r\n#if defined(__ghs__) || defined( __ICCARM__ ) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) || defined(__GNUC__)\r\n    #define GHS_ICCARM_ARMCC_GT_10_5_GNUC\r\n#endif\r\n\r\n#if defined(__ghs__) || defined(__gcc__) || defined(__ICCARM__) || defined(__GNUC__)\r\n    #define GHS_GCC_ICCARM_GNUC\r\n#endif\r\n\r\n#if defined(__ghs__) || defined(__gcc__) || defined(__ICCARM__)\r\n    #define GHS_GCC_ICCARM\r\n#endif\r\n\r\n#if defined(__ICCARM__) || defined(__ARMCC_VERSION) || defined(__CC_ARM) || defined(__GNUC__)\r\n    #define ICCARM_ARMCC_GNUC\r\n#endif\r\n\r\n#if defined(__ICCARM__) || defined(__ARMCC_VERSION) || defined(__GNUC__)\r\n    #define ICCARM_ARMCLANG_GNUC\r\n#endif\r\n\r\n#if defined (__ARMCC_VERSION) && (__ARMCC_VERSION < 6010050)\r\n    #define ARMCC_LT_10_5 //6.01 build 0050\r\n#endif\r\n\r\n\r\n#if defined ( __CC_ARM )\r\n/* Arm Compiler 4/5 */\r\n#define MCUX_CL_COMPILER_ARMCC\r\n#define MCUX_CL_COMPILER_ARM_COMPILER\r\n\r\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100)\r\n/* Arm Compiler 6.6 LTM (armclang) */\r\n#define MCUX_CL_COMPILER_ARMCLANG_LTM\r\n#define MCUX_CL_COMPILER_ARM_COMPILER\r\n\r\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100)\r\n/* Arm Compiler above 6.10.1 (armclang) */\r\n#define MCUX_CL_COMPILER_ARMCLANG\r\n#define MCUX_CL_COMPILER_ARM_COMPILER\r\n\r\n#elif defined (_clang_)\r\n#define MCUX_CL_COMPILER_ARM_COMPILER /* i.e. Version 6.01 build 0019  */\r\n#endif\r\n\r\n\r\n#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && !defined(inline) && !defined(__cplusplus)\r\n    #define ARMCC_MSC_VER_NOT_INLINE_NOT_CPP\r\n#endif\r\n\r\n#endif /* COMPILER_TOOLCHAIN_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClBuffer/inc/internal/mcuxClBuffer_Internal.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** \r\n * \\file  mcuxClBuffer_Internal.h\r\n * \\brief Internal functions of the mcuxClBuffer component\r\n */\r\n\r\n#ifndef MCUXCLBUFFER_INTERNAL_H_\r\n#define MCUXCLBUFFER_INTERNAL_H_\r\n\r\n#include <mcuxClCore_Platform.h>\r\n\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/* Include the configuration for the buffer types. */\r\n#include <mcuxClBuffer_Cfg.h>\r\n\r\n/* Include the selected implementation of the buffer types. */\r\n#if defined(MCUXCLBUFFER_USE_OBJECT) && (1 == MCUXCLBUFFER_USE_OBJECT)\r\n#  include <internal/mcuxClBuffer_Internal_Object.h>\r\n#elif defined(MCUXCLBUFFER_USE_POINTER) && (1 == MCUXCLBUFFER_USE_POINTER)\r\n#  include <internal/mcuxClBuffer_Internal_Pointer.h>\r\n#else\r\n#  error \"No buffer type implementation found/configured.\"\r\n#endif\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLBUFFER_INTERNAL_H_ */\r\n\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClBuffer/inc/internal/mcuxClBuffer_Internal_Pointer.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2022-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * \\file  mcuxClBuffer_Internal_Pointer.h\r\n * \\brief Provides the internal API & implementation for the plain C pointer buffer types.\r\n */\r\n\r\n#ifndef MCUXCLBUFFER_INTERNAL_POINTER_H_\r\n#define MCUXCLBUFFER_INTERNAL_POINTER_H_\r\n\r\n#include <mcuxClToolchain.h>\r\n#include <mcuxClCore_Platform.h>\r\n\r\n#include <mcuxClBuffer.h>\r\n#include <mcuxClBuffer_Pointer.h>\r\n\r\n#include <mcuxCsslDataIntegrity.h>\r\n\r\n\r\n#include <mcuxClMemory_Copy.h>\r\n#include <internal/mcuxClMemory_Copy_Internal.h>\r\n#include <internal/mcuxClMemory_CopyWords_Internal.h>\r\n#include <mcuxClMemory_Copy_Reversed.h>\r\n#include <internal/mcuxClMemory_CopySecure_Internal.h>\r\n\r\n\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n\r\n/**\r\n * \\defgroup clBufferUsage Buffer read/write functionality\r\n * \\brief Buffer read/write functionality.\r\n * \\ingroup mcuxClBuffer\r\n */\r\n\r\n/* TODO CLNS-10260: finalize the implementation and especially update all the memory functions that are called from here, once CLNS-9401 is finished.\r\n * Appropriate memory functions should be called, to properly handle the security and the different cases of length/alignment (e.g. length being a multiple of 4 or power of 2).\r\n */\r\n\r\n/**\r\n * \\brief Writes the pointer of \\p bufSrc plus the \\p offset in \\p ppDest.\r\n * \r\n * \\param bufSrc      Input buffer\r\n * \\param offset      Offset of the input buffer\r\n * \\param bufCpuWa    Not used\r\n * \\param ppDest      Pointer to the address where the result is written to\r\n * \\param byteLength  Not used\r\n * \r\n * \\return Status of the operation.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClBuffer_inputBufferToCPU)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClBuffer_Status_t) mcuxClBuffer_inputBufferToCPU(mcuxCl_InputBuffer_t bufSrc, uint32_t offset, uint8_t *bufCpuWa UNUSED_PARAM, const uint8_t **ppDest, uint32_t byteLength UNUSED_PARAM)\r\n{\r\n  MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClBuffer_inputBufferToCPU);\r\n  *ppDest = (const uint8_t *)bufSrc + offset;\r\n  MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClBuffer_inputBufferToCPU, MCUXCLBUFFER_STATUS_OK);\r\n\r\n}\r\n\r\n\r\n/**\r\n * \\brief Perform a read from the buffer\r\n *\r\n * \\param bufSrc     Input buffer from which the data shall be read.\r\n * \\param offset     Offset into the buffer at which the read operation shall start.\r\n * \\param pDst       Pointer to the memory location where the data will be stored.\r\n * \\param byteLength Amount of bytes that will be read.\r\n * \\return Status of the operation.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClBuffer_read)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClBuffer_Status_t) mcuxClBuffer_read(mcuxCl_InputBuffer_t bufSrc, uint32_t offset, uint8_t *pDst, uint32_t byteLength)\r\n{\r\n  MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClBuffer_read);\r\n\r\n  MCUX_CSSL_DI_EXPUNGE(memCpyParams, ((uint32_t) pDst) + ((uint32_t) bufSrc) + byteLength + offset);\r\n  MCUX_CSSL_FP_FUNCTION_CALL(copy_status ,mcuxClMemory_copy_int(pDst, &bufSrc[offset], byteLength));\r\n  if(MCUXCLMEMORY_STATUS_OK != copy_status)\r\n  {\r\n      MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClBuffer_read, MCUXCLBUFFER_STATUS_FAULT);\r\n  }\r\n\r\n  MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClBuffer_read, MCUXCLBUFFER_STATUS_OK,\r\n      MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_copy_int)\r\n      );\r\n}\r\n\r\n/**\r\n * \\brief Perform a word-wise read from the buffer\r\n *\r\n * \\param bufSrc     Input buffer from which the data shall be read.\r\n * \\param offset     Offset into the buffer at which the read operation shall start.\r\n * \\param pDst       Pointer to the memory location where the data will be stored.\r\n * \\param byteLength Amount of bytes that will be read.\r\n * \\return Status of the operation.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClBuffer_read_word)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClBuffer_Status_t) mcuxClBuffer_read_word(mcuxCl_InputBuffer_t bufSrc, uint32_t offset, uint8_t *pDst, uint32_t byteLength)\r\n{\r\n  MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClBuffer_read_word);\r\n\r\n  MCUX_CSSL_DI_EXPUNGE(memCpyParams, ((uint32_t) pDst) + ((uint32_t) bufSrc) + byteLength + offset);\r\n  MCUX_CSSL_FP_FUNCTION_CALL(copy_status, mcuxClMemory_copy_words_int(pDst, &bufSrc[offset], byteLength));\r\n  if(MCUXCLMEMORY_STATUS_OK != copy_status)\r\n  {\r\n      MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClBuffer_read_word, MCUXCLBUFFER_STATUS_FAULT);\r\n  }\r\n\r\n  MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClBuffer_read_word, MCUXCLBUFFER_STATUS_OK,\r\n      MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_copy_words_int)\r\n      );\r\n}\r\n\r\n/**\r\n * \\brief Perform an read with endianess reversal from the buffer\r\n *\r\n * \\param bufSrc     Input buffer from which the data shall be read.\r\n * \\param offset     Offset into the buffer at which the read operation shall start.\r\n * \\param pDst       Pointer to the memory location where the data will be stored.\r\n * \\param byteLength Amount of bytes that will be read.\r\n * \\return Status of the operation.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClBuffer_read_reverse)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClBuffer_Status_t) mcuxClBuffer_read_reverse(mcuxCl_InputBuffer_t bufSrc, uint32_t offset, uint8_t *pDst, uint32_t byteLength)\r\n{\r\n  MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClBuffer_read_reverse);\r\n\r\n  MCUXCLMEMORY_FP_MEMORY_COPY_REVERSED(pDst, &bufSrc[offset], byteLength);\r\n\r\n  MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClBuffer_read_reverse, MCUXCLBUFFER_STATUS_OK,\r\n      MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_copy_reversed));\r\n}\r\n\r\n/**\r\n * \\brief Perform a secure read from the buffer\r\n *\r\n * \\param bufSrc     Input buffer from which the data shall be read.\r\n * \\param offset     Offset into the buffer at which the read operation shall start.\r\n * \\param pDst       Pointer to the memory location where the data will be stored.\r\n * \\param byteLength Amount of bytes that will be read.\r\n * \\return Status of the operation.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClBuffer_read_secure)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClBuffer_Status_t) mcuxClBuffer_read_secure(mcuxCl_InputBuffer_t bufSrc, uint32_t offset, uint8_t *pDst, uint32_t byteLength)\r\n{\r\n  MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClBuffer_read_secure);\r\n\r\n  MCUXCLMEMORY_FP_MEMORY_COPY(pDst, &bufSrc[offset], byteLength);\r\n\r\n  MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClBuffer_read_secure, MCUXCLBUFFER_STATUS_OK,\r\n      MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_copy));\r\n}\r\n\r\n/**\r\n * \\brief Perform a secure read with endianess reversal from the buffer\r\n *\r\n * \\param bufSrc     Input buffer from which the data shall be read.\r\n * \\param offset     Offset into the buffer at which the read operation shall start.\r\n * \\param pDst       Pointer to the memory location where the data will be stored.\r\n * \\param byteLength Amount of bytes that will be read.\r\n * \\return Status of the operation.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClBuffer_read_secure_reverse)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClBuffer_Status_t) mcuxClBuffer_read_secure_reverse(mcuxCl_InputBuffer_t bufSrc, uint32_t offset, uint8_t *pDst, uint32_t byteLength)\r\n{\r\n  MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClBuffer_read_secure_reverse);\r\n\r\n  MCUXCLMEMORY_FP_MEMORY_COPY_REVERSED(pDst, &bufSrc[offset], byteLength);\r\n\r\n  MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClBuffer_read_secure_reverse, MCUXCLBUFFER_STATUS_OK,\r\n      MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_copy_reversed));\r\n}\r\n\r\n\r\n/**\r\n * \\brief Perform a write to the buffer\r\n *\r\n * \\param bufDst     Output buffer to which the data shall be written.\r\n * \\param offset     Offset into the buffer at which the write operation shall start.\r\n * \\param pSrc       Pointer to the memory location from where the data will be read.\r\n * \\param byteLength Amount of bytes that will be written.\r\n * \\return Status of the operation.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClBuffer_write)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClBuffer_Status_t) mcuxClBuffer_write(mcuxCl_Buffer_t bufDst, uint32_t offset, const uint8_t *pSrc, uint32_t byteLength)\r\n{\r\n  MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClBuffer_write);\r\n\r\n  MCUX_CSSL_DI_EXPUNGE(memCpyParams, ((uint32_t) pSrc) + ((uint32_t) bufDst) + byteLength + offset);\r\n  MCUX_CSSL_FP_FUNCTION_CALL(copy_status ,mcuxClMemory_copy_int(&bufDst[offset], pSrc, byteLength));\r\n  if(MCUXCLMEMORY_STATUS_OK != copy_status)\r\n  {\r\n      MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClBuffer_write, MCUXCLBUFFER_STATUS_FAULT);\r\n  }\r\n\r\n  MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClBuffer_write, MCUXCLBUFFER_STATUS_OK,\r\n      MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_copy_int)\r\n      );\r\n}\r\n\r\n/**\r\n * \\brief Perform a word-wise write to the buffer\r\n *\r\n * \\param bufDst     Output buffer to which the data shall be written.\r\n * \\param offset     Offset into the buffer at which the write operation shall start.\r\n * \\param pSrc       Pointer to the memory location from where the data will be read.\r\n * \\param byteLength Amount of bytes that will be written.\r\n * \\return Status of the operation.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClBuffer_write_word)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClBuffer_Status_t) mcuxClBuffer_write_word(mcuxCl_Buffer_t bufDst, uint32_t offset, const uint8_t *pSrc, uint32_t byteLength)\r\n{\r\n  MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClBuffer_write_word);\r\n\r\n  MCUX_CSSL_DI_EXPUNGE(memCpyParams, ((uint32_t) pSrc) + ((uint32_t) bufDst) + byteLength + offset);\r\n  MCUX_CSSL_FP_FUNCTION_CALL(copy_status, mcuxClMemory_copy_words_int(&bufDst[offset], pSrc, byteLength));\r\n  if(MCUXCLMEMORY_STATUS_OK != copy_status)\r\n  {\r\n      MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClBuffer_write_word, MCUXCLBUFFER_STATUS_FAULT);\r\n  }\r\n\r\n  MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClBuffer_write_word, MCUXCLBUFFER_STATUS_OK,\r\n      MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_copy_words_int)\r\n      );\r\n}\r\n\r\n\r\n/**\r\n * \\brief Perform a write with endianess reversal to the buffer\r\n *\r\n * \\param bufDst     Output buffer to which the data shall be written.\r\n * \\param offset     Offset into the buffer at which the write operation shall start.\r\n * \\param pSrc       Pointer to the memory location from where the data will be read.\r\n * \\param byteLength Amount of bytes that will be written.\r\n * \\return Status of the operation.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClBuffer_write_reverse)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClBuffer_Status_t) mcuxClBuffer_write_reverse(mcuxCl_Buffer_t bufDst, uint32_t offset, const uint8_t *pSrc, uint32_t byteLength)\r\n{\r\n  MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClBuffer_write_reverse);\r\n\r\n  MCUXCLMEMORY_FP_MEMORY_COPY_REVERSED(&bufDst[offset], pSrc, byteLength);\r\n\r\n  MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClBuffer_write_reverse, MCUXCLBUFFER_STATUS_OK,\r\n      MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_copy_reversed));\r\n}\r\n\r\n/**\r\n * \\brief Perform a secure write to the buffer\r\n *\r\n * \\param bufDst     Output buffer to which the data shall be written.\r\n * \\param offset     Offset into the buffer at which the write operation shall start.\r\n * \\param pSrc       Pointer to the memory location from where the data will be read.\r\n * \\param byteLength Amount of bytes that will be written.\r\n * \\return Status of the operation.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClBuffer_write_secure)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClBuffer_Status_t) mcuxClBuffer_write_secure(mcuxCl_Buffer_t bufDst, uint32_t offset, const uint8_t *pSrc, uint32_t byteLength)\r\n{\r\n  MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClBuffer_write_secure);\r\n\r\n  MCUX_CSSL_DI_EXPUNGE(memCpyParams, ((uint32_t) pSrc) + ((uint32_t) bufDst) + byteLength + offset);\r\n  MCUX_CSSL_FP_FUNCTION_CALL(copy_status, mcuxClMemory_copy_secure_int(&bufDst[offset], pSrc, byteLength));\r\n\r\n  if(MCUXCLMEMORY_STATUS_OK != copy_status)\r\n  {\r\n      MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClBuffer_write_secure, MCUXCLBUFFER_STATUS_FAULT);\r\n  }\r\n\r\n  MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClBuffer_write_secure, MCUXCLBUFFER_STATUS_OK,\r\n      MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_copy_secure_int));\r\n}\r\n\r\n/**\r\n * \\brief Perform a secure write with endianess reversal to the buffer\r\n *\r\n * \\param bufDst     Output buffer to which the data shall be written.\r\n * \\param offset     Offset into the buffer at which the write operation shall start.\r\n * \\param pSrc       Pointer to the memory location from where the data will be read.\r\n * \\param byteLength Amount of bytes that will be written.\r\n * \\return Status of the operation.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClBuffer_write_secure_reverse)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClBuffer_Status_t) mcuxClBuffer_write_secure_reverse(mcuxCl_Buffer_t bufDst, uint32_t offset, const uint8_t *pSrc, uint32_t byteLength)\r\n{\r\n  MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClBuffer_write_secure_reverse);\r\n\r\n  MCUXCLMEMORY_FP_MEMORY_COPY_REVERSED(&bufDst[offset], pSrc, byteLength);\r\n\r\n  MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClBuffer_write_secure_reverse, MCUXCLBUFFER_STATUS_OK, MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_copy_reversed));\r\n}\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLBUFFER_INTERNAL_POINTER_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClBuffer/inc/mcuxClBuffer.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2022-2024 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * \\file  mcuxClBuffer.h\r\n * \\brief Provides the API for the CL buffer types.\r\n */\r\n\r\n#ifndef MCUXCLBUFFER_H_\r\n#define MCUXCLBUFFER_H_\r\n\r\n#include <mcuxClCore_Platform.h>\r\n\r\n#include <mcuxClBuffer_Constants.h>\r\n\r\n/* Include the actual implementation of the flow protection mechanism. */\r\n#include <mcuxClBuffer_Impl.h>\r\n\r\n\r\n/**\r\n * \\addtogroup mcuxClAPI MCUX CL -- API\r\n *\r\n * \\defgroup mcuxClBuffer Buffer API\r\n * \\brief CL Buffer types.\r\n * \\ingroup mcuxClAPI\r\n */\r\n\r\n/**\r\n * \\defgroup clBufInit Buffer initialization functionality\r\n * \\brief Buffer initialization functionality.\r\n * \\ingroup mcuxClBuffer\r\n *\r\n * Two sets of default buffer initializations are provided, each with\r\n * read-only (RO, for mcuxCl_InputBuffer_t) and read-write (RW, for mcuxCl_Buffer_t)\r\n * variants:\r\n *  - Plain: basic CPU copy operations (aligned when possible)\r\n *  - DMA: utilizing DMA peripherals\r\n *\r\n * \\note The DMA variants will be mapped to plain for buffer implementations\r\n * that do not support DMA operations.\r\n *\r\n * Additionally a custom initializer is provided as well as some aliases\r\n * that can be used as shorthand notation.\r\n */\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_INIT\r\n * \\brief Initialize an input/output buffer (mcuxCl_Buffer_t).\r\n * \\api\r\n * \\ingroup clBufInit\r\n *\r\n * This macro is an alias for \\p MCUXCLBUFFER_INIT_RW.\r\n *\r\n * \\see MCUXCLBUFFER_INIT_RW\r\n *\r\n * \\param name the name to be used for the buffer variable\r\n * \\param info pointer to a data structure that holds relevant information for the handler\r\n * \\param ptr  pointer to the memory location of the buffer\r\n * \\param size size of the buffer - RFU\r\n */\r\n#define MCUXCLBUFFER_INIT(name, info, ptr, size) \\\r\n  MCUXCLBUFFER_INIT_RW(name, info, ptr, size)\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_INIT_RO\r\n * \\brief Initialize an input buffer (mcuxCl_InputBuffer_t) with plain CPU handling.\r\n * \\api\r\n * \\ingroup clBufInit\r\n *\r\n * This macro can be used to initialize an input buffer that will be handled\r\n * using plain CPU operations.\r\n *\r\n * \\param name the name to be used for the buffer variable\r\n * \\param info pointer to a data structure that holds relevant information for the handler\r\n * \\param ptr  pointer to the memory location of the buffer\r\n * \\param size size of the buffer - RFU\r\n */\r\n#define MCUXCLBUFFER_INIT_RO(name, info, ptr, size) \\\r\n  MCUXCLBUFFER_INIT_PLAIN_RO_IMPL(name, info, ptr, size)\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_INIT_RW\r\n * \\brief Initialize an input/output buffer (mcuxCl_Buffer_t) with plain CPU handling.\r\n * \\api\r\n * \\ingroup clBufInit\r\n *\r\n * This macro can be used to initialize an input/output buffer that will be\r\n * handled using plain CPU operations.\r\n *\r\n * \\param name the name to be used for the buffer variable\r\n * \\param info pointer to a data structure that holds relevant information for the handler\r\n * \\param ptr  pointer to the memory location of the buffer\r\n * \\param size size of the buffer - RFU\r\n */\r\n#define MCUXCLBUFFER_INIT_RW(name, info, ptr, size) \\\r\n  MCUXCLBUFFER_INIT_PLAIN_RW_IMPL(name, info, ptr, size)\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_INIT_DMA_RO\r\n * \\brief Initialize an input buffer (mcuxCl_InputBuffer_t) with DMA handling.\r\n * \\api\r\n * \\ingroup clBufInit\r\n *\r\n * This macro can be used to initialize an input buffer that will be handled\r\n * using DMA operations.\r\n *\r\n * \\note DMA operations are only supported for object-oriented buffer implementations.\r\n *\r\n * \\param name the name to be used for the buffer variable\r\n * \\param info pointer to a data structure that holds relevant information for the handler\r\n * \\param ptr  pointer to the memory location of the buffer\r\n * \\param size size of the buffer - RFU\r\n */\r\n#define MCUXCLBUFFER_INIT_DMA_RO(name, info, ptr, size) \\\r\n  MCUXCLBUFFER_INIT_DMA_RO_IMPL(name, info, ptr, size)\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_INIT_DMA_RW\r\n * \\brief Initialize an input/output buffer (mcuxCl_Buffer_t) with DMA handling.\r\n * \\api\r\n * \\ingroup clBufInit\r\n *\r\n * This macro can be used to initialize an input/output buffer that will be\r\n * handled using DMA operations.\r\n *\r\n * \\note DMA operations are only supported for object-oriented buffer implementations.\r\n *\r\n * \\param name the name to be used for the buffer variable\r\n * \\param info pointer to a data structure that holds relevant information for the handler\r\n * \\param ptr  pointer to the memory location of the buffer\r\n * \\param size size of the buffer - RFU\r\n */\r\n#define MCUXCLBUFFER_INIT_DMA_RW(name, info, ptr, size) \\\r\n  MCUXCLBUFFER_INIT_DMA_RW_IMPL(name, info, ptr, size)\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_INIT_DMA\r\n * \\brief Initialize an input/output buffer (mcuxCl_Buffer_t) with DMA handling.\r\n * \\api\r\n * \\ingroup clBufInit\r\n * \r\n * This macro is an alias for \\p MCUXCLBUFFER_INIT_RW.\r\n * \r\n * \\see MCUXCLBUFFER_INIT_RW\r\n *\r\n * \\param name the name to be used for the buffer variable\r\n * \\param info pointer to a data structure that holds relevant information for the handler\r\n * \\param ptr  pointer to the memory location of the buffer\r\n * \\param size size of the buffer - RFU\r\n */\r\n#define MCUXCLBUFFER_INIT_DMA(name, info, ptr, size) \\\r\n  MCUXCLBUFFER_INIT_DMA_RW(name, info, ptr, size)\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_INIT_CUSTOM\r\n * \\brief Initialize an input/output buffer with custom handler\r\n * \\api\r\n * \\ingroup clBufInit\r\n *\r\n * This macro can be used to initialize an input/output buffer with a custom\r\n * handler.\r\n *\r\n * \\note Custom handlers are only supported for object-oriented buffer\r\n * implementations.\r\n *\r\n * \\param name    the name to be used for the buffer variable\r\n * \\param handler the callback function that will handle the buffer operations\r\n * \\param info    pointer to a data structure that holds relevant information for the handler\r\n * \\param spec    specification of the buffer properties\r\n * \\param ptr     pointer to the memory location of the buffer\r\n * \\param size    size of the buffer - RFU\r\n */\r\n#define MCUXCLBUFFER_INIT_CUSTOM(name, handler, info, spec, ptr, size) \\\r\n  MCUXCLBUFFER_INIT_CUSTOM_IMPL(name, handler, info, spec, ptr, size)\r\n\r\n/**\r\n * \\defgroup clBufUpdate Buffer manipulation functionality\r\n * \\brief Input/output buffer manipulation functionality.\r\n * \\ingroup mcuxClBuffer\r\n */\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_UPDATE\r\n * \\brief Update the buffer pointer with the given offset.\r\n * \\api\r\n * \\ingroup clBufUpdate\r\n *\r\n * \\param name   the name of the buffer variable to update.\r\n * \\param offset the amount of bytes that the buffer pointer should be moved.\r\n */\r\n#define MCUXCLBUFFER_UPDATE(name, offset) \\\r\n  MCUXCLBUFFER_UPDATE_IMPL(name, offset)\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_DERIVE_RO\r\n * \\brief Derive a new input buffer object from an existing one (updated with the given offset).\r\n * \\api\r\n * \\ingroup clBufUpdate\r\n *\r\n * \\param name     the name of the buffer variable to create.\r\n * \\param original the name of the buffer variable that will be cloned.\r\n * \\param offset   the amount of bytes that the buffer pointer should be moved.\r\n */\r\n#define MCUXCLBUFFER_DERIVE_RO(name, original, offset) \\\r\n  MCUXCLBUFFER_DERIVE_RO_IMPL(name, original, offset)\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_DERIVE_RW\r\n * \\brief Derive a new input/output buffer object from an existing one (updated with the given offset).\r\n * \\api\r\n * \\ingroup clBufUpdate\r\n *\r\n * \\param name     the name of the buffer variable to create.\r\n * \\param original the name of the buffer variable that will be cloned.\r\n * \\param offset   the amount of bytes that the buffer pointer should be moved.\r\n */\r\n#define MCUXCLBUFFER_DERIVE_RW(name, original, offset) \\\r\n  MCUXCLBUFFER_DERIVE_RW_IMPL(name, original, offset)\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_SET\r\n * \\brief Update the buffer pointer the a new memory location.\r\n * \\api\r\n * \\ingroup clBufUpdate\r\n *\r\n * \\param name the name of the buffer variable to update\r\n * \\param ptr  pointer to the memory location of the buffer\r\n * \\param size size of the buffer - RFU\r\n */\r\n#define MCUXCLBUFFER_SET(name, ptr, size) \\\r\n  MCUXCLBUFFER_SET_IMPL(name, ptr, size)\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_GET\r\n * \\brief Get the pointer of the buffer\r\n * \\api\r\n * \\ingroup clBufUpdate\r\n *\r\n * \\param name the name of the buffer variable\r\n */\r\n#define MCUXCLBUFFER_GET(name) \\\r\n  MCUXCLBUFFER_GET_IMPL(name)\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_IS_NULL\r\n * \\brief Check the buffer and its pointer against NULL\r\n * \\api\r\n * \\ingroup clBufUpdate\r\n *\r\n * \\param name the name of the buffer variable\r\n */\r\n#define MCUXCLBUFFER_IS_NULL(name) \\\r\n  MCUXCLBUFFER_IS_NULL_IMPL(name)\r\n\r\n\r\n#endif /* MCUXCLBUFFER_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClBuffer/inc/mcuxClBuffer_Cfg.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2022-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * \\file  mcuxClBuffer_Cfg.h\r\n * \\brief Configuration of the implementation for the buffer types.\r\n */\r\n\r\n#ifndef MCUXCLBUFFER_CFG_H_\r\n#define MCUXCLBUFFER_CFG_H_\r\n\r\n#include <mcuxClCore_Platform.h>\r\n\r\n/**\r\n * \\addtogroup mcuxClCFG MCUX CL -- Configurations\r\n *\r\n * \\defgroup mcuxClBuffer_CFG Buffer Configuration\r\n * \\brief Configuration options for the buffer types.\r\n * \\ingroup mcuxClCFG\r\n */\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_USE_OBJECT\r\n * \\brief If set to 1, use the object oriented buffer implementation.\r\n * \\ingroup mcuxClBuffer_CFG\r\n */\r\n    #define MCUXCLBUFFER_USE_OBJECT 0\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_USE_POINTER\r\n * \\brief If set to 1, use the plain C pointer buffer implementation.\r\n * \\ingroup mcuxClBuffer_CFG\r\n */\r\n    #define MCUXCLBUFFER_USE_POINTER 1\r\n\r\n/* Basic configuration sanity check */\r\n\r\n#endif /* MCUXCLBUFFER_CFG_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClBuffer/inc/mcuxClBuffer_Constants.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** \\file  mcuxClBuffer_Constants.h\r\n *  \\brief Constants for use with the mcuxClBuffer component */\r\n\r\n#ifndef MCUXCLBUFFER_CONSTANTS_H_\r\n#define MCUXCLBUFFER_CONSTANTS_H_\r\n\r\n#include <mcuxClCore_Platform.h>\r\n\r\n/**\r\n * \\defgroup clBufferConstants Buffer constants\r\n * \\brief Buffer constants\r\n * \\ingroup mcuxClBuffer\r\n */\r\n\r\n/**\r\n * \\brief Buffer status code\r\n *\r\n * This type provides information about the status of the Buffer operation that\r\n * has been performed.\r\n */\r\ntypedef uint32_t mcuxClBuffer_Status_t;\r\n\r\n/* Error codes */\r\n#define MCUXCLBUFFER_STATUS_ERROR                        ((mcuxClBuffer_Status_t) 0x01235330u)\r\n#define MCUXCLBUFFER_STATUS_OK                           ((mcuxClBuffer_Status_t) 0x01232E03u)\r\n#define MCUXCLBUFFER_STATUS_FAULT                        ((mcuxClBuffer_Status_t) 0x0123F0F0u)\r\n\r\n#endif /* MCUXCLBUFFER_CONSTANTS_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClBuffer/inc/mcuxClBuffer_Impl.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2022-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * \\file  mcuxClBuffer_Impl.h\r\n * \\brief Selection of the implementation for the buffer types.\r\n */\r\n\r\n#ifndef MCUXCLBUFFER_IMPL_H_\r\n#define MCUXCLBUFFER_IMPL_H_\r\n\r\n#include <mcuxClCore_Platform.h>\r\n\r\n/* Include the configuration for the buffer types. */\r\n#include <mcuxClBuffer_Cfg.h>\r\n\r\n/* Include the selected implementation of the buffer types. */\r\n#if defined(MCUXCLBUFFER_USE_OBJECT) && (1 == MCUXCLBUFFER_USE_OBJECT)\r\n#  include <mcuxClBuffer_Object.h>\r\n#elif defined(MCUXCLBUFFER_USE_POINTER) && (1 == MCUXCLBUFFER_USE_POINTER)\r\n#  include <mcuxClBuffer_Pointer.h>\r\n#else\r\n#  error \"No buffer type implementation found/configured.\"\r\n#endif\r\n\r\n#endif /* MCUXCLBUFFER_IMPL_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClBuffer/inc/mcuxClBuffer_Pointer.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2022-2024 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * \\file  mcuxClBuffer_Pointer.h\r\n * \\brief Provides the implementation for the basic C pointer buffer types.\r\n */\r\n\r\n#ifndef MCUXCLBUFFER_POINTER_H_\r\n#define MCUXCLBUFFER_POINTER_H_\r\n\r\n#include <mcuxClCore_Platform.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n\r\n/**\r\n * \\addtogroup mcuxClAPI MCUX CL -- API\r\n *\r\n * \\addtogroup mcuxClBuffer Buffer API\r\n * \\brief Essential types and functionality.\r\n * \\ingroup mcuxClAPI\r\n */\r\n\r\n/**\r\n * \\defgroup clBufferTypes Buffer type definitions\r\n * \\brief Types used by the buffer operations.\r\n * \\ingroup mcuxClBuffer\r\n */\r\n\r\n/**\r\n * \\brief Input buffer type\r\n * \\ingroup clBufferTypes\r\n *\r\n * This type provides a pointer to the memory location that should be used to\r\n * read input data from.\r\n */\r\ntypedef const uint8_t * mcuxCl_InputBuffer_t;\r\n\r\n/**\r\n * \\brief Input/output buffer type\r\n * \\ingroup clBufferTypes\r\n *\r\n * This type provides a pointer to the memory location that can be used for\r\n * both reading input data and writing output data.\r\n */\r\ntypedef uint8_t * mcuxCl_Buffer_t;\r\n\r\n/**\r\n * \\brief Perform a read from the buffer\r\n *\r\n * \\param bufSrc     Input buffer from which the data shall be read.\r\n * \\param offset     Offset into the buffer at which the read operation shall start.\r\n * \\param pDst       Pointer to the memory location where the data will be stored.\r\n * \\param byteLength Amount of bytes that will be read.\r\n * \\return Status of the operation.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClBuffer_import)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(mcuxClBuffer_Status_t) mcuxClBuffer_import(mcuxCl_InputBuffer_t bufSrc, uint32_t offset, uint8_t *pDst, uint32_t byteLength);\r\n\r\n/**\r\n * \\brief Perform a write to the buffer\r\n *\r\n * \\param bufDst     Output buffer to which the data shall be written.\r\n * \\param offset     Offset into the buffer at which the write operation shall start.\r\n * \\param pSrc       Pointer to the memory location from where the data will be read.\r\n * \\param byteLength Amount of bytes that will be written.\r\n * \\return Status of the operation.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClBuffer_export)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(mcuxClBuffer_Status_t) mcuxClBuffer_export(mcuxCl_Buffer_t bufDst, uint32_t offset, const uint8_t *pSrc, uint32_t byteLength);\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_INIT_PLAIN_RO_IMPL\r\n * \\brief Initialize an input buffer with plain CPU handling.\r\n * \\ingroup clBufInit\r\n *\r\n * This macro can be used to initialize an input buffer that will be handled\r\n * using plain CPU operations.\r\n *\r\n * \\param _name the name to be used for the buffer variable\r\n * \\param _info unused for the current implementation\r\n * \\param _ptr  pointer to the memory location of the buffer\r\n * \\param _size unused for the current implementation\r\n */\r\n#define MCUXCLBUFFER_INIT_PLAIN_RO_IMPL(_name, _info, _ptr, _size) \\\r\n  mcuxCl_InputBuffer_t (_name) = (mcuxCl_InputBuffer_t)(_ptr)\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_INIT_PLAIN_RW_IMPL\r\n * \\brief Initialize an input/output buffer with plain CPU handling.\r\n * \\ingroup clBufInit\r\n *\r\n * This macro can be used to initialize an input/output buffer that will be\r\n * handled using plain CPU operations.\r\n *\r\n * \\param _name the name to be used for the buffer variable\r\n * \\param _info unused for the current implementation\r\n * \\param _ptr  pointer to the memory location of the buffer\r\n * \\param _size unused for the current implementation\r\n */\r\n#define MCUXCLBUFFER_INIT_PLAIN_RW_IMPL(_name, _info, _ptr, _size) \\\r\n  mcuxCl_Buffer_t (_name) = (mcuxCl_Buffer_t)(_ptr)\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_INIT_DMA_RO_IMPL\r\n * \\brief DMA handling is not supported. Initialize an input buffer with plain CPU handling.\r\n * \\ingroup clBufInit\r\n *\r\n * This buffer implementation does not support DMA handling, so CPU handling is used as a fallback.\r\n * This macro is an alias for \\p MCUXCLBUFFER_INIT_PLAIN_RO_IMPL.\r\n *\r\n * \\param _name the name to be used for the buffer variable\r\n * \\param _info unused for the current implementation\r\n * \\param _ptr  pointer to the memory location of the buffer\r\n * \\param _size unused for the current implementation\r\n */\r\n#define MCUXCLBUFFER_INIT_DMA_RO_IMPL(_name, _info, _ptr, _size) \\\r\n  MCUXCLBUFFER_INIT_PLAIN_RO_IMPL(_name, _info, _ptr, _size)\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_INIT_DMA_RW_IMPL\r\n * \\brief DMA handling is not supported. Initialize an input/output buffer with plain CPU handling.\r\n * \\ingroup clBufInit\r\n *\r\n * This buffer implementation does not support DMA handling, so CPU handling is used as a fallback.\r\n * This macro is an alias for \\p MCUXCLBUFFER_INIT_PLAIN_RW_IMPL.\r\n *\r\n * \\param _name the name to be used for the buffer variable\r\n * \\param _info unused for the current implementation\r\n * \\param _ptr  pointer to the memory location of the buffer\r\n * \\param _size unused for the current implementation\r\n */\r\n#define MCUXCLBUFFER_INIT_DMA_RW_IMPL(_name, _info, _ptr, _size) \\\r\n  MCUXCLBUFFER_INIT_PLAIN_RW_IMPL(_name, _info, _ptr, _size)\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_INIT_CUSTOM_IMPL\r\n * \\brief Usage of custom handler is not supported. Initialize an input/output buffer with plain CPU handling.\r\n * \\ingroup clBufInit\r\n *\r\n * This macro is an alias for \\p MCUXCLBUFFER_INIT_PLAIN_RW_IMPL.\r\n *\r\n * \\param _name    the name to be used for the buffer variable\r\n * \\param _handler unused for the current implementation\r\n * \\param _info    unused for the current implementation\r\n * \\param _spec    unused for the current implementation\r\n * \\param _ptr     pointer to the memory location of the buffer\r\n * \\param _size    unused for the current implementation\r\n */\r\n#define MCUXCLBUFFER_INIT_CUSTOM_IMPL(_name, _handler, _info, _spec, _ptr, _size) \\\r\n    MCUXCLBUFFER_INIT_PLAIN_RW_IMPL(_name, _info, _ptr, _size)\r\n\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_UPDATE_IMPL\r\n * \\brief Update the buffer pointer with the given offset.\r\n * \\ingroup clBufUpdate\r\n *\r\n * \\param _name   the name of the buffer variable to update\r\n * \\param _offset the amount of bytes that the buffer pointer should be moved.\r\n */\r\n#define MCUXCLBUFFER_UPDATE_IMPL(_name, _offset) \\\r\n  do { (_name) += (_offset); } while(false)\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_DERIVE_RO_IMPL\r\n * \\brief Derive a new input buffer object from an existing one (updated with the given offset).\r\n * \\ingroup clBufUpdate\r\n *\r\n * \\param _name     the name of the buffer variable to create.\r\n * \\param _original the name of the buffer variable that will be cloned.\r\n * \\param _offset   the amount of bytes that the buffer pointer should be moved.\r\n */\r\n#define MCUXCLBUFFER_DERIVE_RO_IMPL(_name, _original, _offset) \\\r\n  mcuxCl_InputBuffer_t (_name) = (mcuxCl_InputBuffer_t) &(_original)[_offset]\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_DERIVE_RW_IMPL\r\n * \\brief Derive a new input/output buffer object from an existing one (updated with the given offset).\r\n * \\ingroup clBufUpdate\r\n *\r\n * \\param _name     the name of the buffer variable to create.\r\n * \\param _original the name of the buffer variable that will be cloned.\r\n * \\param _offset   the amount of bytes that the buffer pointer should be moved.\r\n */\r\n#define MCUXCLBUFFER_DERIVE_RW_IMPL(_name, _original, _offset) \\\r\n  mcuxCl_Buffer_t (_name) = (mcuxCl_Buffer_t) &(_original)[_offset]\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_SET_IMPL\r\n * \\brief Update the buffer pointer the a new memory location.\r\n * \\ingroup clBufUpdate\r\n *\r\n * \\param _name the name of the buffer variable to update\r\n * \\param _ptr  pointer to the memory location of the buffer\r\n * \\param _size unused for the current implementation\r\n */\r\n#define MCUXCLBUFFER_SET_IMPL(_name, _ptr, _size) \\\r\n  do { (_name) = (_ptr); } while(false)\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_GET_IMPL\r\n * \\brief Get the pointer of the buffer\r\n * \\ingroup clBufUpdate\r\n *\r\n * \\param _name the name of the buffer variable\r\n */\r\n#define MCUXCLBUFFER_GET_IMPL(_name) \\\r\n  (_name)\r\n\r\n/**\r\n * \\def MCUXCLBUFFER_IS_NULL_IMPL\r\n * \\brief Check the buffer pointer against NULL\r\n * \\ingroup clBufUpdate\r\n *\r\n * \\param _name the name of the buffer variable\r\n */\r\n#define MCUXCLBUFFER_IS_NULL_IMPL(_name) \\\r\n  (NULL == MCUXCLBUFFER_GET_IMPL(_name))\r\n\r\n\r\n#endif /* MCUXCLBUFFER_POINTER_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClBuffer/src/mcuxClBuffer.c",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * \\file  mcuxClBuffer.c\r\n * \\brief Provides the internal implementation for the plain C pointer buffer types.\r\n */\r\n\r\n\r\n#include <mcuxClToolchain.h>\r\n#include <mcuxClCore_Platform.h>\r\n\r\n#include <mcuxClBuffer.h>\r\n#include <mcuxCsslDataIntegrity.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxClCore_FunctionIdentifiers.h>\r\n#include <internal/mcuxClBuffer_Internal.h>\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClBuffer_export)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(mcuxClBuffer_Status_t) mcuxClBuffer_export(mcuxCl_Buffer_t bufDst, uint32_t offset, const uint8_t *pSrc, uint32_t byteLength)\r\n{\r\n  MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClBuffer_export);\r\n\r\n  MCUX_CSSL_FP_FUNCTION_CALL(status, mcuxClBuffer_write(bufDst, offset, pSrc, byteLength));\r\n\r\n  MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClBuffer_export, status, MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClBuffer_write));\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClBuffer_import)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(mcuxClBuffer_Status_t) mcuxClBuffer_import(mcuxCl_InputBuffer_t bufSrc, uint32_t offset, uint8_t *pDst, uint32_t byteLength)\r\n{\r\n  MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClBuffer_import);\r\n\r\n  MCUX_CSSL_FP_FUNCTION_CALL(status, mcuxClBuffer_read(bufSrc, offset, pDst, byteLength));\r\n\r\n  MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClBuffer_import, status, MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClBuffer_read));\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClCore/inc/mcuxClCore_Examples.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n#ifndef MCUXCLCORE_EXAMPLES_H_\r\n#define MCUXCLCORE_EXAMPLES_H_\r\n\r\n#include <mcuxClCore_Platform.h>\r\n#include <mcuxClCore_Macros.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n\r\n\r\n/**\r\n * \\def MCUXCLEXAMPLE_FUNCTION\r\n * \\brief Macro to indicate that the symbol is an example function.\r\n */\r\n// TODO CLNS-3599: #define MCUXCLEXAMPLE_FUNCTION(_name) uint32_t _name(void)\r\n#define MCUXCLEXAMPLE_FUNCTION(_name) \\\r\nMCUX_CSSL_ANALYSIS_START_PATTERN_EXAMPLE_FUNCTION() \\\r\nbool _name(void) \\\r\nMCUX_CSSL_ANALYSIS_STOP_PATTERN_EXAMPLE_FUNCTION()\r\n\r\n/**\r\n * \\def MCUXCLEXAMPLE_STATUS_OK\r\n * \\brief Example execution completed successfully.\r\n */\r\n#define MCUXCLEXAMPLE_STATUS_OK      true // TODO CLNS-3599: 0xC001C0DEu\r\n\r\n/**\r\n * \\def MCUXCLEXAMPLE_OK\r\n * \\brief Example execution completed successfully.\r\n * \\deprecated{Replaced by MCUXCLEXAMPLE_STATUS_OK}\r\n */\r\n#define MCUXCLEXAMPLE_OK      MCUXCLEXAMPLE_STATUS_OK\r\n\r\n/**\r\n * \\def MCUXCLEXAMPLE_STATUS_ERROR\r\n * \\brief Example execution resulted in an unexpected error.\r\n */\r\n#define MCUXCLEXAMPLE_STATUS_ERROR   false // TODO CLNS-3599: 0xEEEEEEEEu\r\n\r\n/**\r\n * \\def MCUXCLEXAMPLE_ERROR\r\n * \\brief Example execution resulted in an unexpected error.\r\n * \\deprecated{Replaced by MCUXCLEXAMPLE_STATUS_ERROR}\r\n */\r\n#define MCUXCLEXAMPLE_ERROR   MCUXCLEXAMPLE_STATUS_ERROR\r\n\r\n\r\n/**\r\n * \\def MCUXCLEXAMPLE_STATUS_FAILURE\r\n * \\brief Example execution resulted in an expected failure.\r\n */\r\n#define MCUXCLEXAMPLE_STATUS_FAILURE  false // TODO CLNS-3599: 0xFFFFFFFFu\r\n\r\n/**\r\n * \\def MCUXCLEXAMPLE_FAILURE\r\n * \\brief Example execution resulted in an expected failure.\r\n * \\deprecated{Replaced by MCUXCLEXAMPLE_STATUS_FAILURE}\r\n */\r\n#define MCUXCLEXAMPLE_FAILURE  MCUXCLEXAMPLE_STATUS_FAILURE\r\n\r\n/**\r\n * \\brief Assert whether two buffers are equal.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClCore_assertEqual)\r\nstatic inline bool mcuxClCore_assertEqual(const uint8_t * const x, const uint8_t * const y, uint32_t length)\r\n{\r\n  for (uint32_t i = 0; i < length; ++i)\r\n  {\r\n    if (x[i] != y[i])\r\n    {\r\n      return false;\r\n    }\r\n  }\r\n\r\n  return true;\r\n}\r\n\r\n#endif /* MCUXCLCORE_EXAMPLES_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClCore/inc/mcuxClCore_FunctionIdentifiers.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2024 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxClCore_FunctionIdentifiers.h\r\n * @brief Definition of function identifiers for the flow protection mechanism.\r\n *\r\n * @note This file might be post-processed to update the identifier values to\r\n * proper/secure values.\r\n */\r\n\r\n#ifndef MCUX_CL_FLOW_PROTECTION_FUNCTION_IDENTIFIERS_H_\r\n#define MCUX_CL_FLOW_PROTECTION_FUNCTION_IDENTIFIERS_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n\r\n#include <mcuxCsslAnalysis.h>\r\n\r\nMCUX_CSSL_ANALYSIS_START_PATTERN_DESCRIPTIVE_IDENTIFIER()\r\n\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_GetHwVersion                                        (0x6366u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_GetHwConfig                                         (0x4C37u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_GetHwState                                          (0x7907u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Enable_Async                                        (0x44DDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Reset_Async                                         (0x5457u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Disable                                             (0x466Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_SetIntEnableFlags                                   (0x0DB6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_GetIntEnableFlags                                   (0x4E2Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_ResetIntFlags                                       (0x0FB2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_SetIntFlags                                         (0x55CCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_WaitForOperation                                    (0x34B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_LimitedWaitForOperation                             (0x6CE4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_ResetErrorFlags                                     (0x710Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_GetErrorCode                                        (0x7456u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_GetErrorLevel                                       (0x59D2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Hash_Async                                          (0x59D8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_ShaDirect_Enable                                    (0x496Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_ShaDirect_Disable                                   (0x23CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Hash_ShaDirect                                      (0x7C29u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Cipher_Async                                        (0x13D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_EccKeyGen_Async                                     (0x2E95u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_EccKeyExchange_Async                                (0x5762u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_EccKeyExchangeInt_Async                             (0x555Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_EccSign_Async                                       (0x3C36u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_EccVerify_Async                                     (0x5B0Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_EccVerifyInt_Async                                  (0x62ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMath_SecModExp                                          (0x5578u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMath_SecModExp_SqrMultAws                               (0x067Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Aead_Init_Async                                     (0x607Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Aead_PartialInit_Async                              (0x035Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Aead_UpdateAad_Async                                (0x0F59u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Aead_UpdateData_Async                               (0x2E9Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Aead_Finalize_Async                                 (0x2DA9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Cmac_Async                                          (0x1793u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_GlitchDetector_LoadConfig_Async                     (0x693Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_GlitchDetector_Trim_Async                           (0x09BEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Hmac_Async                                          (0x4BE1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Hkdf_Rfc5869_Async                                  (0x5B92u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Ckdf_Sp800108_Async                                 (0x27A5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_TlsGenerateMasterKeyFromPreMasterKey_Async          (0x3F84u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_TlsGenerateSessionKeysFromMasterKey_Async           (0x7545u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_KeyDelete_Async                                     (0x58F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_KeyProvision_Async                                  (0x5ED0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_KeyProvisionRom_Async                               (0x64B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_KeyImport_Async                                     (0x1397u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_KeyImportPuk_Async                                  (0x2CAEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_KeyExport_Async                                     (0x258Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_handleKeyExportError                                (0x46B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Rng_DrbgRequest_Async                               (0x4D9Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Rng_DrbgRequestRaw_Async                            (0x62D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Rng_Dtrng_ConfigLoad_Async                          (0x2756u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Rng_Dtrng_ConfigLoadPrv_Async                       (0x42F5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Rng_Dtrng_ConfigEvaluate_Async                      (0x62E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Dtrng_IterativeReseeding_CheckAndReseed             (0x37D0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Dtrng_IterativeReseeding_Reseed                     (0x5939u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Prng_Init_Async                                     (0x3BC4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Prng_GetRandomWord                                  (0x3AC6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Prng_GetRandom                                      (0x49D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_GetKeyProperties                                    (0x7E14u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHash_compute                                            (0x2DAAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHash_compare                                            (0x42DDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHash_verify                                             (0x3D45u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHash_init                                               (0x416Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHash_process                                            (0x5873u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHash_finish                                             (0x17D8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHash_selftest                                           (0x68F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHash_export_state                                       (0x7871u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHash_import_state                                       (0x79C4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_oneShot_Md5                                 (0x25CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_process_Md5                                 (0x29F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_finish_Md5                                  (0x396Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_oneShot_Sha1                                (0x61B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_process_Sha1                                (0x7196u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_finish_Sha1                                 (0x52D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_oneShot_Sha224                              (0x7958u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_process_Sha224                              (0x6B19u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_finish_Sha224                               (0x1A76u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_oneShot_Sha256                              (0x5AC3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_process_Sha256                              (0x4F1Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_finish_Sha256                               (0x39C5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_oneShot_Sha384                              (0x4E5Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_process_Sha384                              (0x115Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_finish_Sha384                               (0x512Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_oneShot_Sha512                              (0x28E7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_process_Sha512                              (0x15E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_finish_Sha512                               (0x54CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_oneShot_sha3_shake                          (0x4D1Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_process_sha3_shake                          (0x1B8Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_finish_sha3_shake                           (0x1EC9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_oneShot_sha3                                (0x7326u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_process_sha3                                (0x3B94u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_finish_sha3                                 (0x2F49u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_shake_finishAbsorb                          (0x25F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_C_shake_squeeze                               (0x2D4Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_createShakeAlgorithm                          (0x5B23u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Sgi_oneShot_Sha2                              (0x784Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Sgi_finish_Sha2                               (0x076Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Sgi_process_Sha2                              (0x23B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Sgi_oneShot_MiyaguchiPreneel                  (0x45F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Sgi_process_MiyaguchiPreneel                  (0x5C1Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Sgi_finish_MiyaguchiPreneel                   (0x166Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Sgi_finish_Sha2_DmaBlocking                   (0x40DFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Sgi_process_Sha2_DmaBlocking                  (0x5336u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Els_process_Sha2                              (0x36C5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Els_finish_Sha2                               (0x73B0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Els_oneShot_Sha2                              (0x4E33u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Els_oneShot_Sha2_Truncated                    (0x28F9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Els_oneShot_Sha2_FullBlocks                   (0x6C8Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Els_oneShot_Sha2_Padding                      (0x71CAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Els_Sha2_Prepare_Truncated                    (0x12BEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Els_process_Sha2_FullBlocks                   (0x5966u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Els_finish_Sha2_Padding                       (0x15ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_els_dmaProtectionAddressReadback              (0x5C71u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Ranger5_oneShot_Sha256                        (0x718Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Ranger5_oneShot_Sha384                        (0x3B0Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_els_core_sha2                                 (0x195Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_els_core_sha2_direct                          (0x4EACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_core_c_md5                                    (0x2CE5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_core_c_sha1                                   (0x70B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_core_c_sha256                                 (0x72C3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_core_c_sha512                                 (0x7B82u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_core_c_keccak                                 (0x54DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_core_secSha3_Keccak                           (0x3627u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_core_secSha1                                  (0x33C5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_core_secSha256                                (0x3A0Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_core_secSha512                                (0x3E16u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_oneShot_SecSha                                (0x6F12u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_process_SecSha                                (0x459Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_finish_SecSha                                 (0x33ACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_oneShot_SecSha3                               (0x0FE4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_process_SecSha3                               (0x2AF1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_finish_SecSha3                                (0x4771u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Ltc_oneShot_Sha3_core                         (0x2973u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_oneshot_SecSha_init                           (0x435Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClXof_compute                                             (0x41AFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClXof_init                                                (0x6A72u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClXof_process                                             (0x5396u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClXof_generate                                            (0x1A6Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClXof_finish                                              (0x6B0Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClXofModes_C_generate_shake                               (0x271Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClXofModes_init_sha3_shake                                (0x22EBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClXofModes_process_sha3_shake                             (0x2A37u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClXofModes_oneshot_sha3_shake                             (0x0E7Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClXofModes_finish_shake                                   (0x3572u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_loadCopro                                           (0x2579u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_loadMemory                                          (0x7962u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_flush                                               (0x26ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_setKeyproperties                                    (0x3879u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_LoadFuncPtr_t                                       (0x55C9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_FlushFuncPtr_t                                      (0x476Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_init                                                (0x3635u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_setProtection                                       (0x6C3Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_agreement                                           (0x7A19u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_protect                                             (0x33A9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMac_compute                                             (0x22F9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMac_compare                                             (0x7686u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMac_init                                                (0x16EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMac_process                                             (0x5CB1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMac_finish                                              (0x4D59u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMac_verify                                              (0x29F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMacModes_compute                                        (0x36ACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMacModes_compare                                        (0x316Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMacModes_init                                           (0x6B1Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMacModes_process                                        (0x29CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMacModes_finish                                         (0x70DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMacModes_verify                                         (0x3077u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMacModes_createGmacMode                                 (0x7CB0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMacModes_Engine_CMAC_Oneshot                            (0x6783u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMacModes_Engine_CMAC_Init                               (0x528Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMacModes_Engine_CMAC_Update                             (0x475Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMacModes_Engine_CMAC_Finalize                           (0x7295u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMacModes_Engine_CBCMAC_Oneshot                          (0x2C9Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMacModes_Engine_CBCMAC_Init                             (0x5F41u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMacModes_Engine_CBCMAC_Update                           (0x5786u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMacModes_Engine_CBCMAC_Finalize                         (0x6734u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHmac_Engine_Oneshot_Sw                                  (0x17D4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHmac_Engine_Init_Sw                                     (0x1D4Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHmac_Engine_Update_Sw                                   (0x47C9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHmac_Engine_Finalize_Sw                                 (0x323Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHmac_Engine_Oneshot_Els                                 (0x2B6Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHmac_Engine_Init_Els                                    (0x34D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHmac_Engine_Update_Els                                  (0x66A6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHmac_Engine_Finalize_Els                                (0x4D2Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHmac_compute                                            (0x453Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHmac_init                                               (0x43BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHmac_process                                            (0x4BA5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHmac_finish                                             (0x7623u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHmac_prepareHMACKey                                     (0x46E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHmac_createHmacMode                                     (0x634Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMath_InitLocalUptrt                                     (0x6762u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMath_LeadingZeros                                       (0x0DE5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMath_ShiftModulus                                       (0x63E2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMath_NDash                                              (0x236Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMath_QDash                                              (0x60BBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMath_QSquared                                           (0x197Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMath_ModInv                                             (0x48DDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMath_ModExp_SqrMultL2R                                  (0x791Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Rng_DrbgTestInstantiate_Async                       (0x5C27u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Rng_DrbgTestExtract_Async                           (0x2E9Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Rng_DrbgTestAesEcb_Async                            (0x0B97u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Rng_DrbgTestAesCtr_Async                            (0x743Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMemory_clear                                            (0x6BC8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMemory_copy                                             (0x126Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMemory_set                                              (0x6AA6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPkc_Initialize                                          (0x7319u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPkc_Deinitialize                                        (0x7315u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPkc_GenerateUPTRT                                       (0x1C5Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPkc_Calc                                                (0x152Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPkc_CalcConst                                           (0x6693u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPkc_CalcFup                                             (0x2B71u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPkc_WaitForFinish                                       (0x255Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPkc_WaitForReady                                        (0x05AFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSession_init                                            (0x58B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSession_setRtf                                          (0x057Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSession_cleanup                                         (0x2CD3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSession_destroy                                         (0x6A4Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSession_setSecurityOptions                              (0x0F63u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSession_setRandom                                       (0x78B4u)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_selftest_sha512                                        (0x6E2Cu)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_selftest_aead                                          (0x4D4Du)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_selftest_ecdsa_p256                                    (0x1769u)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_selftest_ecdsa_p384                                    (0x7526u)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_selftest_hmac                                          (0x7067u)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_selftest_eckxh                                         (0x2D36u)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_selftest_drbg_extract                                  (0x61ABu)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_selftest_drbg_ctr                                      (0x3E64u)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_selftest_drbg_ecb                                      (0x415Fu)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_selftest_ckdf                                          (0x3E83u)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_selftest_hkdf                                          (0x4E2Du)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_selftest                                               (0x4F58u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Ckdf_Sp80056c_Extract_Async                         (0x1F23u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Ckdf_Sp80056c_Expand_Async                          (0x7427u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_Hkdf_Sp80056c_Async                                 (0x307Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClTrustProv_keyProv                                       (0x59AAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCLTrustProv_nboot_isp_get_oem_cust_cert_dice_puk          (0x436Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCLTrustProv_nboot_isp_hsm_eck_sign                        (0x1F89u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCLTrustProv_nboot_isp_hsm_enc_blk                         (0x7C43u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCLTrustProv_nboot_isp_hsm_key_gen                         (0x653Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCLTrustProv_nboot_sb_store_key                            (0x75E0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCLTrustProv_nboot_isp_mcux_rts_get_id_clns                 (0x5935u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCLTrustProv_nboot_isp_gen_oem_master_share                (0x5D83u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCLTrustProv_nboot_isp_set_oem_master_share                (0x7D50u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCLTrustProv_nboot_isp_hsm_store_key                       (0x1AADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClTrustProv_rfc3394_wrap_manual                           (0x6B70u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCLTrustProv_nboot_isp_mcux_ssf_insert_cert                 (0x15E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_Verify_P384                                         (0x155Du)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_img_authenticate_cmac                                  (0x3E34u)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_key_delete                                             (0x29DAu)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_key_store_export_key                                   (0x6A4Eu)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_key_store_is_loaded                                    (0x7744u)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_key_store_init                                         (0x32BCu)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_key_store_generate_rom_key                             (0x259Du)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_cmac_authenticate_romapi                               (0x4CB5u)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_sb3_load_manifest                                      (0x76C4u)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_sb3_load_block                                         (0x36E4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSb3_BlockVerify                                         (0x1BA9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSb3_BlockDecrypt_Start                                  (0x238Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSb3_BlockEncrypt_Start                                  (0x785Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSb3_BlockCrypt_Finish                                   (0x478Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSb3_BlockDeriveKey                                      (0x54EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSb3_ManifestImportPck                                   (0x437Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSb3_ManifestDeriveKdk                                   (0x732Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSb3_DeletePck                                           (0x5A5Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSb3_Cleanup                                             (0x4ED8u)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_img_authenticate_ecdsa                                 (0x6E62u)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_img_authenticate_ecdsa_romapi                          (0x2D99u)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_sb3_img_authenticate_ecdsa                             (0x5AC6u)\r\n#define MCUX_CSSL_FP_FUNCID_nboot_img_authenticate_ecdsa_internal                        (0x4E65u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_protect_fct_none                                    (0x5A4Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_protect_fct_ckdf                                    (0x588Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_InterleaveTwoScalars                                (0x28DEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_RepeatPointDouble_NIST                              (0x4EB4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_Int_PointMult_NIST                                  (0x3672u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_PointCheckAffineNR_NIST                             (0x05E7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_PointFullAdd_NIST                                   (0x629Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_SwitchEndianness_P384                               (0x7C8Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCLTrustProv_nboot_rts_insert_cert                         (0x0EBAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_SetRandomStartDelay                                 (0x134Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_GetRandomStartDelay                                 (0x51C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_GetLock                                             (0x4AE6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_ReleaseLock                                         (0x61D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_IsLocked                                            (0x646Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_SetMasterUnlock                                     (0x30B7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_ConfigureCommandCRC                                 (0x4CF1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_GetCommandCRC                                       (0x0B9Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_VerifyVsRefCRC                                      (0x5C17u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_RespGen_Async                                       (0x7256u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPkc_ImportBigEndianToPkc                                (0x5F30u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPkc_ExportBigEndianFromPkc                              (0x3D1Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_Verify                                              (0x5CA5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPkc_SwitchEndianness                                    (0x36A9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_PointCheckAffineNR                                  (0x65ACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_RepeatPointDouble                                   (0x7986u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_PointFullAdd                                        (0x10FEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_Int_PointMult                                       (0x59B4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPkc_RandomizeUPTRT                                      (0x1D87u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPkc_ReRandomizeUPTRT                                    (0x5E54u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_SecurePointMult                                     (0x03BDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRoPuf_GetHwVersion                                      (0x0CCFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRoPuf_GetHwState                                        (0x0B57u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRoPuf_SetIntEnableFlags                                 (0x176Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRoPuf_GetIntEnableFlags                                 (0x346Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRoPuf_ResetIntFlags                                     (0x3E29u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRoPuf_SetIntFlags                                       (0x5D2Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRoPuf_Configuration                                     (0x4EE2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRoPuf_Lock                                              (0x1177u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRoPuf_ConfigEval                                        (0x28EEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRoPuf_Enroll                                            (0x31B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRoPuf_Reconstruct                                       (0x3C9Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRoPuf_KeyGeneration                                     (0x3EC8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRoPuf_GetIntFlags                                       (0x6AD4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSb3_img_authenticate_ecdsa                              (0x788Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCLTrustProv_nboot_isp_dev_set_wrap_data                   (0x5369u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCLTrustProv_nboot_isp_hsm_dev_auth_challenge              (0x4A6Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCLTrustProv_nboot_isp_hsm_dev_auth_challenge_mcux          (0x48D7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCLTrustProv_nboot_isp_hsm_dev_auth_challenge_oem          (0x12FCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMath_TrailingZeros                                      (0x037Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMath_ReduceModEven                                      (0x235Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_KeyGen                                              (0x6726u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPkc_SecureExportBigEndianFromPkc                        (0x19E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_WeierECC_BlindedSecretKeyGen_RandomWithExtraBits    (0x5C87u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_GlitchDetector_ResetEventCounter                    (0x14EBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_GlitchDetector_GetEventCounter                      (0x2D72u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPkc_SecureImportBigEndianToPkc                          (0x271Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_Sign                                                (0x59A3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_PointMult                                           (0x5AD2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_public                                              (0x7469u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_privatePlain                                        (0x0E7Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_verify                                              (0x2D78u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_Verify_NoEMSA                                       (0x689Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_pkcs1v15Encode_sign                                 (0x50DBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_pkcs1v15Verify                                      (0x270Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMath_ExactDivideOdd                                     (0x509Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_pssVerify                                           (0x69B2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_mgf1                                                (0x7878u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_privateCRT                                          (0x69D2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_sign                                                (0x1C7Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_Sign_NoEMSA                                         (0x758Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_pssEncode                                           (0x3C66u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_SetupEnvironment                                    (0x318Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_MontDH_SetupEnvironment                             (0x6A39u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_Mont_SecureScalarMult_XZMontLadder                  (0x4D55u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_MontDH_X                                            (0x147Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_MontDH_DecodeScalar                                 (0x5197u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_MontDH_DecodeCoordinate                             (0x44F5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_GenerateMultiplicativeBlinding                      (0x03BEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_GetLastDmaAddress                                   (0x3E51u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_CompareDmaFinalOutputAddress                        (0x6A3Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_MontDH_KeyAgreement                                 (0x6933u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_MontDH_KeyAgreement_Core                            (0x5E86u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_MontDH_GenerateKeyPair                              (0x097Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_MontDH_GenerateKeyPair_Core                         (0x1EE4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMath_ExactDivide                                        (0x3CE4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandom_init                                             (0x456Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandom_reseed                                           (0x4CE9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandom_generate                                         (0x7D28u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandom_uninit                                           (0x41FCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandom_selftest                                         (0x51E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandom_checkSecurityStrength                            (0x3B13u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandom_ncPatch                                          (0x17D2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandom_ncInit                                           (0x4E8Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandom_ncGenerate                                       (0x20DFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandom_generate_internal                                (0x32E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_TestPQDistance                                      (0x345Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_ModInv                                              (0x178Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_MillerRabinTest                                     (0x5F42u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_ComputeD                                            (0x6A36u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_VerifyE                                             (0x53F0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_GenerateProbablePrime                               (0x1ACEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_KeyGeneration_Crt                                   (0x5F12u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEls_UpdateRefCRC                                        (0x05BEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_TestPrimeCandidate                                  (0x10EFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_KeyGeneration_Plain                                 (0x58B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPkc_ImportLittleEndianToPkc                             (0x275Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPkc_ExportLittleEndianFromPkc                           (0x0BDAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPkc_SecureImportLittleEndianToPkc                       (0x64F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPkc_SecureExportLittleEndianFromPkc                     (0x16E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_Weier_SetupEnvironment                              (0x54B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_SkeletonAes                                 (0x05B7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipher_crypt                                            (0x1BB2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipher_init                                             (0x7683u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipher_process                                          (0x61E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipher_finish                                           (0x60EEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPadding_addPadding_None                                 (0x529Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPadding_addPadding_Random                               (0x1B9Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPadding_addPadding_Decrypt                              (0x368Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPadding_addPadding_ISO9797_1_Method1                    (0x33C9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPadding_addPadding_ISO9797_1_Method2                    (0x15BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPadding_addPadding_PKCS7                                (0x3974u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPadding_removePadding_None                              (0x5AA9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPadding_removePadding_Default                           (0x075Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPadding_removePadding_ISO9797_1_Method1                 (0x61B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPadding_removePadding_ISO9797_1_Method2                 (0x6D1Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPadding_removePadding_PKCS7                             (0x7923u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPadding_removePadding_Stream                            (0x3C6Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAeadModes_SkeletonAesGcm                                (0x6731u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAead_crypt                                              (0x68BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAead_init                                               (0x6EA1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAead_process                                            (0x3E89u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAead_process_adata                                      (0x19D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAead_finish                                             (0x21BEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAead_verify                                             (0x6D0Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAeadModes_SkeletonAesCcm                                (0x5633u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAeadModes_EngineAesCcmEls                               (0x25A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAeadModes_EngineAesGcmEls                               (0x3BA8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAead_encrypt                                            (0x5C65u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAead_decrypt                                            (0x137Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAead_init_encrypt                                       (0x3B89u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAead_init_decrypt                                       (0x2F0Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClTrng_Init                                               (0x73D0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClTrng_getEntropyInput                                    (0x34E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClTrng_checkConfig                                        (0x471Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_ElsMode_generate                            (0x246Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_ElsMode_init                                (0x5A1Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_ElsMode_reseed                              (0x41E7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_ElsMode_selftest                            (0x14DBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_CtrDrbg_reseedAlgorithm                     (0x517Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_CtrDrbg_generateAlgorithm                   (0x42FAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_PrDisabled_generatePrHandler                (0x447Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_PrDisabled_selftestAlgorithm                (0x54BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_PTG3_selftestAlgorithm                      (0x435Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_CtrDrbg_generateOutput                      (0x6D8Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_CtrDrbg_UpdateState                         (0x35A9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_CtrDrbg_bcc                                 (0x5B54u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_CtrDrbg_df                                  (0x13E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_updateEntropyInput                          (0x525Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_TestMode_initFunction                       (0x70DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_TestMode_reseedFunction                     (0x5CCAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_createTestFromNormalMode                    (0x72C6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_NormalMode_initFunction                     (0x327Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_NormalMode_reseedFunction                   (0x3C33u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_DRBG_AES_Internal_blockcipher               (0x5E98u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_NormalMode_generateFunction_PrDisabled      (0x541Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_NormalMode_selftestFunction                 (0x4755u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_CtrDrbg_instantiateAlgorithm                (0x22F5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_NormalMode_generateFunction_PTG3            (0x72A6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_PatchMode_initFunction                      (0x6E2Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_PatchMode_reseedFunction                    (0x20FEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_PatchMode_generateFunction                  (0x72A9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_PatchMode_selftestFunction                  (0x6939u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_createPatchMode                             (0x642Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_CtrDrbg_incV                                (0x09AFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_TestMode_selftestFunction                   (0x4BB2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_HmacDrbg_instantiateAlgorithm               (0x370Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_HmacDrbg_UpdateState                        (0x5AB8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_HmacDrbg_generateAlgorithm                  (0x11FCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_HmacDrbg_generateOutput                     (0x185Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_createCustomHmacDrbgMode                    (0x52B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRandomModes_selftest_VerifyArrays                       (0x5D13u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRoPuf_Reset                                             (0x334Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_EngineEls                                   (0x3B46u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_EdDSA_GenerateKeyPair                               (0x2D6Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_EdDSA_GenerateSignature                             (0x43F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_EdDSA_VerifySignature                               (0x15DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_pkcs1v15Encode_encrypt                              (0x3B70u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_pkcs1v15Decode_decrypt                              (0x56CCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_EdDSA_SetupEnvironment                              (0x31CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_WeierECC_GenerateCustomKeyType                      (0x4D6Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_WeierECC_GenerateDomainParams                       (0x321Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPadding_addPadding_MAC_ISO9797_1_Method2                (0x5857u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_oaepEncode                                          (0x6A27u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_oaepDecode                                          (0x2DC5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPrng_init                                               (0x7346u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClPrng_generate                                           (0x44F3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_RecodeAndReorderScalar                              (0x39E4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_TwEd_FixScalarMult                                  (0x08EFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_TwEd_PlainFixScalarMult25519                        (0x612Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_TwEd_PlainFixScalarMult448                          (0x28BDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_TwEd_PlainPtrSelectComb                             (0x0EAEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_TwEd_PointDoubleEd25519                             (0x3E43u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_TwEd_PointDoubleEd448                               (0x632Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_TwEd_MixedPointAddEd25519                           (0x13EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_TwEd_MixedPointAddEd448                             (0x70ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_TwEd_PlainPtrSelectML                               (0x4D99u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_TwEd_VarScalarMult                                  (0x05BDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_TwEd_PlainVarScalarMult                             (0x7C54u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_TwEd_PrecPointImportAndValidate                     (0x7323u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSb3_Ckdf                                                (0x19E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAeadModes_verify                                        (0x72B8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAeadModes_crypt                                         (0x0F78u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAeadModes_finish                                        (0x0E8Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAeadModes_process                                       (0x1375u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAeadModes_init                                          (0x2A5Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAeadModes_process_adata                                 (0x18D7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_WeierECC_GenerateKeyPair                            (0x19D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_generate_keypair                                    (0x5BC8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_KeyGeneration_GenerateKeyPair                       (0x47A3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_NoHwAcc_Public                                      (0x195Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_NoHwAcc_UtilsAsym_ModularExponentiation             (0x47F0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_Empty_PkcInitialize                                 (0x294Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_Empty_PkcDeinitialize                               (0x69C5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_BlindedScalarMult                                   (0x2AD9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_EdDSA_BlindedScalarMult                             (0x76A8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_WeierECC_PointDecFct_SEC                            (0x3674u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_EdDSA_VerifySignature_S5xyStub                      (0x0F96u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_EdDSA_GenerateSignature_S5xyStub                    (0x05F5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSignature_selftest                                      (0x05F9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSignature_sign                                          (0x08FEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSignature_verify                                        (0x46DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSignature_init                                          (0x169Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSignature_finish                                        (0x61DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipher_selftest                                         (0x3571u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_WeierECC_SetupEnvironment                           (0x132Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClGlikey_GetVersionAndConfig                              (0x694Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClGlikey_GetStatus                                        (0x346Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClGlikey_SyncReset                                        (0x3DC8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClGlikey_SetIntEnable                                     (0x0F2Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClGlikey_GetIntEnable                                     (0x683Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClGlikey_ClearIntStatus                                   (0x6D94u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClGlikey_SetIntStatus                                     (0x15E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClGlikey_Lock                                             (0x68B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClGlikey_IsLocked                                         (0x5653u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClGlikey_IsIndexLocked                                    (0x3B19u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClGlikey_StartEnable                                      (0x725Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClGlikey_ContinueEnable                                   (0x0B5Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClGlikey_LockIndex                                        (0x30BBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClGlikey_ResetIndex                                       (0x1F19u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClGlikey_EndOperation                                     (0x17C9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_EdDSA_CalcHashModN                                  (0x1A79u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_EdDSA_DecodePoint_Ed25519                           (0x6CA6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_EdDSA_DecodePoint_Ed448                             (0x4D56u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_EdDSA_InitPrivKeyInputMode                          (0x536Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSession_setResource                                     (0x3785u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSession_configure_job                                   (0x761Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSession_request                                         (0x559Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSession_release                                         (0x48EEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSession_triggerUserCallback                             (0x1D36u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClResource_init                                           (0x7968u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClResource_handle_interrupt                               (0x7634u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClResource_request                                        (0x23D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClResource_release                                        (0x78CCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_linkKeyPair                                         (0x50F5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_ArithmeticOperation                                 (0x61A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_ArithOp_PointAdd                                    (0x0797u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_RemoveBlinding                                      (0x6CE8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_ArithOp_ScalarMult                                  (0x599Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_agreement_selftest                                  (0x5939u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_ECDH_KeyAgreement                                   (0x10F7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipher_encrypt                                          (0x6279u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipher_decrypt                                          (0x1F1Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipher_init_encrypt                                     (0x5659u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipher_init_decrypt                                     (0x119Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_encrypt_Sgi                                 (0x6C3Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_decrypt_Sgi                                 (0x1DB8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_init_encrypt_Sgi                            (0x4DD2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_init_decrypt_Sgi                            (0x5EE0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_process_Sgi                                 (0x3374u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_finish_Sgi                                  (0x51ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_InterleaveScalar                                    (0x1FA2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_WeierECC_PrivateKeyValidation                       (0x0DEAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_WeierECC_PublicKeyValidation                        (0x2F32u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_EdDSA_GenerateHashPrefix                            (0x4957u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_EdDSA_GenerateProtocolDescriptor                    (0x19CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_EdDSA_GenerateSignatureModeDescriptor               (0x5BC4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_EdDSA_PreHashMessage                                (0x396Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_EdDSA_GenerateKeyPair_Core                          (0x436Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_EdDSA_GenerateSignature_Core                        (0x47E8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_EdDSA_VerifySignature_Core                          (0x57A1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_ECDSA_GenerateSignature                             (0x3CCAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_ECDSA_VerifySignature                               (0x5574u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_ArithOp_PointSub                                    (0x395Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_derivation                                          (0x3B2Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_Derivation_ModeConstructor_NIST_SP800_108           (0x784Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_derivationEngine_NIST_SP800_108                     (0x3D38u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_Derivation_ModeConstructor_ISOIEC_18033_2           (0x1A3Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_derivationEngine_ISOIEC_18033_2                     (0x15CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_Derivation_ModeConstructor_NIST_SP800_56C           (0x45E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_derivationEngine_NIST_SP800_56C_OneStep             (0x7E84u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_derivationEngine_NIST_SP800_56C_TwoStep             (0x4CDAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_Derivation_ModeConstructor_ANSI_X9_63               (0x6AAAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_derivationEngine_ANSI_X9_63                         (0x19ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_Derivation_ModeConstructor_HKDF                     (0x7B84u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_derivationEngine_HKDF                               (0x53ACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_Derivation_ModeConstructor_PBKDF2                   (0x3B25u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_derivationEngine_PBKDF2                             (0x2D33u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_derivation_pbkdf2_computeHmac                       (0x74C3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_Derivation_ModeConstructor_IKEv2                    (0x3A66u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKey_derivationEngine_IKEv2                              (0x5D86u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClUtilsPqc_Randombytes                                    (0x2D1Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClUtilsPqc_XOF_Hash                                       (0x78D1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClUtilsPqc_ShakeXXX_Init_And_Absorb                       (0x2CCBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClUtilsPqc_ShakeXXX_Absorb                                (0x64F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClUtilsPqc_ShakeXXX_Squeeze                               (0x6C1Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Keypair                                       (0x307Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Keypair_Core                                  (0x529Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Sign                                          (0x6DE0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Verify                                        (0x24EDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_checkInputs                                   (0x65D2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_computeMu                                     (0x1573u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_performPolynomialArithmetic                   (0x58DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Internal_Verify_checkInputs                   (0x2F1Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Internal_computeMu                            (0x136Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Internal_performPolynomialArithmetic          (0x2C6Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMemory_copy_reversed                                    (0x7B41u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_PkcInitialize                                       (0x3DA2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_PkcDeinitialize                                     (0x1CB5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClResource_backup                                         (0x23E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClResource_restore                                        (0x652Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClResource_Sc_Backup                                      (0x2CC7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClResource_Sc_Restore                                     (0x507Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSession_resume                                          (0x3AB4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMac_selftest                                            (0x42AFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAead_selftest                                           (0x24AFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Aes_encryptBlock                         (0x425Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Aes_decryptBlock                         (0x4B39u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Aes_scheduleKey                          (0x2C7Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Aes_handleIv                             (0x325Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Des_encryptBlock                         (0x4EE1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Des_decryptBlock                         (0x706Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Des_scheduleKey                          (0x15D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Des_handleIv                             (0x05DEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Cbc_encrypt                              (0x2CE3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Cbc_decrypt                              (0x1B99u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Cbc_initEncrypt                          (0x2CB6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Cbc_initDecrypt                          (0x4753u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Cbc_process                              (0x0E6Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Cbc_finish                               (0x52DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Cfb_encrypt                              (0x2F70u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Cfb_decrypt                              (0x1877u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Cfb_initEncrypt                          (0x5CAAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Cfb_initDecrypt                          (0x325Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Cfb_process                              (0x11AFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Cfb_finish                               (0x63B2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Ctr_encrypt                              (0x256Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Ctr_decrypt                              (0x4EE8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Ctr_initEncrypt                          (0x5599u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Ctr_initDecrypt                          (0x4C6Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Ctr_process                              (0x78C6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Ctr_finish                               (0x1D53u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Df4_encrypt                              (0x474Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Df4_decrypt                              (0x4BC9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Df4_initEncrypt                          (0x2CD5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Df4_initDecrypt                          (0x18F5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Df4_process                              (0x7790u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Df4_finish                               (0x1A6Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Ecb_encrypt                              (0x75C1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Ecb_decrypt                              (0x1697u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Ecb_initEncrypt                          (0x135Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Ecb_initDecrypt                          (0x4FA4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Ecb_process                              (0x243Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Ecb_finish                               (0x1F16u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Ofb_encrypt                              (0x683Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Ofb_decrypt                              (0x6E31u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Ofb_initEncrypt                          (0x623Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Ofb_initDecrypt                          (0x47E1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Ofb_process                              (0x53C9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Ofb_finish                               (0x6535u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Xts_encrypt                              (0x2697u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Xts_decrypt                              (0x07E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Xts_initEncrypt                          (0x599Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Xts_initDecrypt                          (0x2B93u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Xts_process                              (0x4AF1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_Sw_Xts_finish                               (0x2C5Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCrc_computeCRC16                                        (0x518Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCrc_computeCRC32                                        (0x738Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipher_verifyContextCrc                                 (0x49E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipher_computeContextCrc                                (0x43BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCrc_Internal_updateCRC32                                (0x296Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCrc_Internal_updateCRC16                                (0x54F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKem_encapsulate                                         (0x2B36u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKem_decapsulate                                         (0x58C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_encrypt_Sgi_nonBlocking                     (0x5726u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_decrypt_Sgi_nonBlocking                     (0x03B7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_process_Sgi_nonBlocking                     (0x4AE3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_completeAutoMode_Multipart                  (0x4BD8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_completeAutoMode_Oneshot                    (0x7945u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClBuffer_write_secure                                     (0x5917u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClBuffer_write_secure_reverse                             (0x4F0Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClBuffer_read                                             (0x27ACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClBuffer_read_word                                        (0x1CBCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClBuffer_read_reverse                                     (0x2FA8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClBuffer_read_secure                                      (0x4BC5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClBuffer_read_secure_reverse                              (0x4D27u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClBuffer_write                                            (0x5BA4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClBuffer_write_word                                       (0x6B92u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClBuffer_write_reverse                                    (0x2B47u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClBuffer_import                                           (0x59B2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClBuffer_export                                           (0x7784u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Montgomery_Reduce                             (0x356Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_NTT                                      (0x46ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_InvNTT_To_Mont                           (0x319Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_Pointwise_Montgomery                     (0x5B2Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_Eta_Pack                                 (0x1BCCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_Eta_Unpack                               (0x33A6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_T1_Pack                                  (0x2B59u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_t1_Unpack                                (0x6E07u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_T0_Pack                                  (0x529Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_T0_Unpack                                (0x1B95u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_Z_Pack                                   (0x78CAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_Z_Unpack_17                              (0x21F9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_Z_Unpack_19                              (0x549Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_Z_Unpack                                 (0x0BF8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_W1_Pack                                  (0x6CA3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_W1_Unpack                                (0x4575u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_W_Pack                                   (0x06FCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_W_Unpack                                 (0x1B33u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_C_Pack                                   (0x4CB9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_C_Unpack                                 (0x3D70u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_H_Unpack                                 (0x2B78u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Unpack_SK                                     (0x2C4Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Reduce32                                      (0x51B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_Reduce                                   (0x2E36u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Caddq                                         (0x704Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_Uniform_Gamma1                           (0x35A3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Make_Hint                                     (0x4C67u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_Challenge                                (0x72C5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Indcpa_Generate_Keys                              (0x7711u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Verify                                            (0x4AD6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Encrypt                                           (0x5B34u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Decrypt                                           (0x749Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_KeyGen                                            (0x38DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Encaps                                            (0x0E9Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Decaps                                            (0x7632u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Montgomery_Reduce                                 (0x6633u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Barrett_Reduce                                    (0x5E0Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_NTT                                               (0x253Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Basemul                                           (0x1D39u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Poly_InvNTT_To_Mont                               (0x06CFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Rej_Uniform                                       (0x3A4Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Poly_Mul_Streamed_Matrix                          (0x7C0Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Poly_Mul_Streamed_Skpk                            (0x7172u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Poly_Csubq                                        (0x2B56u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Poly_Compress                                     (0x24DEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Poly_Decompress                                   (0x46F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_To_Bytes                                          (0x3C9Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_From_Msg                                          (0x731Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_To_Msg                                            (0x5A2Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Cbd2                                              (0x117Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Cbd3                                              (0x6785u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Poly_Get_Noise_Eta1                               (0x53E8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Poly_Get_Noise_Eta2                               (0x3596u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Poly_NTT                                          (0x03BBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Poly_To_Mont                                      (0x3CE1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Poly_Reduce                                       (0x54D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Poly_Add                                          (0x362Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Poly_Sub                                          (0x530Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Poly_Compress_Gen                                 (0x7A32u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Poly_Decompress_Gen                               (0x3475u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Poly_Compress_Eta1                                (0x61CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Poly_Decompress_Eta1                              (0x668Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Shake128_Absorb                                   (0x5876u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Shake128_Squeeze                                  (0x549Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Stream128_Absorb                                  (0x721Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Stream128_Squeeze                                 (0x3578u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Shake256_PRF                                      (0x2A3Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_PRF                                               (0x63C5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_KDF                                               (0x4ED4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClKyber_Cmov                                              (0x2ABCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_Caddq                                    (0x231Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_Add                                      (0x1EE2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_Sub                                      (0x0E73u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_Shiftl                                   (0x29DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Power2Round                                   (0x5A2Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_Power2Round                              (0x48FCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Decompose                                     (0x35AAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_Decompose                                (0x2D74u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Use_Hint                                      (0x3B8Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_Use_Hint                                 (0x0577u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_CHK_Norm                                 (0x6D58u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Rej_Uniform                                   (0x7929u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_Mul_Streamed_Matrix_Accumulate           (0x6E0Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_Mul_Streamed_Matrix                      (0x47D1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Rej_Eta                                       (0x4E4Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_Poly_Uniform_Eta                              (0x6F0Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSgi_Backup                                              (0x4F15u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSgi_Restore                                             (0x7D60u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_SignAllocateCpuWa                             (0x32C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_SignPrepare                                   (0x685Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_SignComputeHintsForW1                         (0x1ED4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_SignCheckCS2                                  (0x4EA6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDilithium_SignComputeZ                                  (0x27B4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMemory_copy_int                                         (0x1C9Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMemory_copy_words_int                                   (0x45CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMemory_copy_reversed_int                                (0x38CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMemory_copy_secure_int                                  (0x3A55u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMemory_copy_secure_pow2_int                             (0x5536u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMemory_copy_secure_reversed_int                         (0x5E29u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMemory_compare_int                                      (0x427Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMemory_compare_secure_int                               (0x5D52u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMemory_compare_dpasecure_int                            (0x272Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMemory_clear_int                                        (0x05EDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMemory_clear_secure_int                                 (0x2D8Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMemory_set_int                                          (0x3F28u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMemory_set_secure_int                                   (0x32F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDma_requestInputAndOutput                               (0x0D37u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDma_releaseInputAndOutput                               (0x362Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDma_release                                             (0x3663u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDma_request                                             (0x266Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClBuffer_cpu_direct                                       (0x1EB2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClBuffer_cpu_read                                         (0x395Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClBuffer_cpu_write                                        (0x6A96u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClBuffer_cpu_reverse                                      (0x08FBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClBuffer_commonHandlerToken                               (0x0CDEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_publicExp                                           (0x6A56u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAes_keyExpansion                                        (0x4A6Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAes_encryptBlock                                        (0x7856u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAes_decryptBlock                                        (0x7DA0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClBuffer_inputBufferToCPU                                 (0x2D95u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_Weier_DomainParamsCheck                             (0x1EC5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_Verify_P384_CheckRS1                                (0x25DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_Verify_P384_CheckRS2                                (0x371Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_getMillerRabinTestIterations                        (0x037Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_DeterministicECDSA_GenerateProtocolDescriptor       (0x6C2Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClSession_entry                                           (0x07ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAes_addRoundKey                                         (0x36AAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAes_invSubBytesShiftRows                                (0x0ADBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAes_memCpy                                              (0x173Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAes_invMixColumns                                       (0x3999u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAes_mixColumns                                          (0x5A95u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAes_rotWord                                             (0x4B2Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAes_subBytesShiftRows                                   (0x46D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAes_subWord                                             (0x519Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAes_calcNrOfRounds                                      (0x646Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAes_xorWithRcon                                         (0x0F1Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAes_xor                                                 (0x0ABBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDes_keyExpansion                                        (0x571Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDes_encryptBlock                                        (0x59C5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDes_decryptBlock                                        (0x334Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDes_rot28Left                                           (0x7827u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDes_permutateData                                       (0x29B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDes_selectEbit                                          (0x2CCDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDes_splitData                                           (0x37C2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDes_sFunction                                           (0x0DBCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDes_fFunction                                           (0x7435u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDes_genRoundKeys                                        (0x66E1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDes_pack64                                              (0x49F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDes_unpack64                                            (0x7926u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDes_encrypt                                             (0x5C96u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClDes_decrypt                                             (0x45AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_Verify_Compare_NoEMSA                               (0x38CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_Encrypt_NoEME                                       (0x619Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_Decrypt_NoEME                                       (0x3927u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_Util_encrypt                                        (0x6F09u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_Util_decrypt                                        (0x58AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMemory_xor                                              (0x38D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_Public_KeyType_ModeConstructor                      (0x67C8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_PrivatePlain_KeyType_ModeConstructor                (0x5E1Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_PrivateCRT_KeyType_ModeConstructor                  (0x73A4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClRsa_PrivateCRT_DFA_KeyType_ModeConstructor              (0x71F0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMath_ModSquareRoot                                      (0x651Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMath_ModSquareRoot_TonelliShanks                        (0x7B24u)\r\n#define MCUX_CSSL_FP_FUNCID_LegendreSymbol                                               (0x625Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Ltc_oneShot_Sha3                              (0x53AAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHashModes_Ltc_oneShot_Sha3_Shake                        (0x11D7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHash_Ltc_process_Sha3                                   (0x5789u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHash_Ltc_finish_Sha3_core                               (0x3E62u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHash_Ltc_finish_Sha3                                    (0x623Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClHash_Ltc_finish_Sha3_Shake                              (0x7895u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClXofModes_Ltc_generate_shake                             (0x7370u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_SkeletonAes_Init                            (0x2D71u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_SkeletonAes_Process                         (0x1C2Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClCipherModes_SkeletonAes_Finish                          (0x5D1Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAead_computeContextCrc                                  (0x5F22u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClAead_verifyContextCrc                                   (0x46F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClMacModes_Engine_CMAC_ProcessBlocks                      (0x1CD5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxClEcc_DeterministicECDSA_BlindedSecretKeyGen              (0x4CADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_456                                             (0x558Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_457                                             (0x153Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_458                                             (0x26E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_459                                             (0x1DC3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_460                                             (0x307Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_461                                             (0x2537u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_462                                             (0x3AA3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_463                                             (0x6D86u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_464                                             (0x67A2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_465                                             (0x52F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_466                                             (0x09F3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_467                                             (0x6DC8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_468                                             (0x5E1Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_469                                             (0x7A86u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_470                                             (0x2D47u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_471                                             (0x09EBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_472                                             (0x1D27u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_473                                             (0x68EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_474                                             (0x29D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_475                                             (0x66B1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_476                                             (0x1537u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_477                                             (0x6F05u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_478                                             (0x4CF4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_479                                             (0x1D3Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_480                                             (0x15D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_481                                             (0x6173u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_482                                             (0x04BFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_483                                             (0x4B47u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_484                                             (0x07B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_485                                             (0x3AD2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_486                                             (0x638Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_487                                             (0x3953u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_488                                             (0x7135u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_489                                             (0x585Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_490                                             (0x43CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_491                                             (0x2B74u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_492                                             (0x6569u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_493                                             (0x4C6Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_494                                             (0x0737u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_495                                             (0x7916u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_496                                             (0x28BEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_497                                             (0x2557u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_498                                             (0x609Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_499                                             (0x691Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_500                                             (0x31E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_501                                             (0x3A53u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_502                                             (0x7658u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_503                                             (0x5C59u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_504                                             (0x6725u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_505                                             (0x7A38u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_506                                             (0x3356u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_507                                             (0x6696u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_508                                             (0x52ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_509                                             (0x4F49u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_510                                             (0x2799u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_511                                             (0x2E17u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_512                                             (0x2AD6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_513                                             (0x524Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_514                                             (0x7561u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_515                                             (0x4D8Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_516                                             (0x0CF6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_517                                             (0x39B1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_518                                             (0x45BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_519                                             (0x5665u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_520                                             (0x70E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_521                                             (0x2EB2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_522                                             (0x06D7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_523                                             (0x5E45u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_524                                             (0x72D1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_525                                             (0x129Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_526                                             (0x21BBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_527                                             (0x0D5Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_528                                             (0x0F3Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_529                                             (0x131Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_530                                             (0x539Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_531                                             (0x7D06u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_532                                             (0x47D4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_533                                             (0x25D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_534                                             (0x13F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_535                                             (0x14F3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_536                                             (0x2759u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_537                                             (0x7994u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_538                                             (0x45B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_539                                             (0x38C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_540                                             (0x52DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_541                                             (0x29ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_542                                             (0x6B29u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_543                                             (0x5476u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_544                                             (0x467Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_545                                             (0x49BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_546                                             (0x40EFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_547                                             (0x6B8Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_548                                             (0x28EDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_549                                             (0x11F9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_550                                             (0x5C1Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_551                                             (0x7998u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_552                                             (0x7887u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_553                                             (0x30BDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_554                                             (0x0DF8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_555                                             (0x3257u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_556                                             (0x6D2Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_557                                             (0x670Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_558                                             (0x04FEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_559                                             (0x6E25u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_560                                             (0x52B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_561                                             (0x1F34u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_562                                             (0x1AB5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_563                                             (0x4E56u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_564                                             (0x53D4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_565                                             (0x70ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_566                                             (0x3B4Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_567                                             (0x5176u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_568                                             (0x4DF0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_569                                             (0x29AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_570                                             (0x3955u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_571                                             (0x7A1Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_572                                             (0x1C6Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_573                                             (0x053Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_574                                             (0x499Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_575                                             (0x23B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_576                                             (0x6A35u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_577                                             (0x4F16u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_578                                             (0x0BC7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_579                                             (0x13ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_580                                             (0x5437u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_581                                             (0x51DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_582                                             (0x27E1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_583                                             (0x3D29u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_584                                             (0x6137u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_585                                             (0x64CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_586                                             (0x4C8Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_587                                             (0x45F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_588                                             (0x07D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_589                                             (0x551Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_590                                             (0x3AD1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_591                                             (0x5EC2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_592                                             (0x63B8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_593                                             (0x4B2Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_594                                             (0x1E1Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_595                                             (0x53A6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_596                                             (0x34DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_597                                             (0x11FAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_598                                             (0x3A95u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_599                                             (0x6D51u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_600                                             (0x56C3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_601                                             (0x64D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_602                                             (0x633Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_603                                             (0x2B1Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_604                                             (0x255Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_605                                             (0x764Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_606                                             (0x0B6Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_607                                             (0x63ACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_608                                             (0x7F02u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_609                                             (0x0F35u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_610                                             (0x1B2Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_611                                             (0x0ABEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_612                                             (0x4CCBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_613                                             (0x7554u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_614                                             (0x5639u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_615                                             (0x6758u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_616                                             (0x30F9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_617                                             (0x0FB1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_618                                             (0x30EBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_619                                             (0x4C5Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_620                                             (0x61D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_621                                             (0x5C9Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_622                                             (0x7D11u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_623                                             (0x6F81u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_624                                             (0x3A59u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_625                                             (0x383Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_626                                             (0x3B4Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_627                                             (0x3AB1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_628                                             (0x1CE9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_629                                             (0x372Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_630                                             (0x3745u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_631                                             (0x7938u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_632                                             (0x55D4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_633                                             (0x21F3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_634                                             (0x1B65u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_635                                             (0x4D6Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_636                                             (0x54B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_637                                             (0x7136u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_638                                             (0x5DA2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_639                                             (0x52BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_640                                             (0x3D92u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_641                                             (0x20FDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_642                                             (0x43CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_643                                             (0x4C75u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_644                                             (0x2B33u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_645                                             (0x0EADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_646                                             (0x1ED1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_647                                             (0x34BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_648                                             (0x4DE2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_649                                             (0x13F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_650                                             (0x6D43u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_651                                             (0x60F9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_652                                             (0x519Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_653                                             (0x0DBAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_654                                             (0x43DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_655                                             (0x03AFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_656                                             (0x6E61u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_657                                             (0x64B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_658                                             (0x2A9Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_659                                             (0x3659u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_660                                             (0x6CD4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_661                                             (0x17B8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_662                                             (0x0E2Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_663                                             (0x6179u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_664                                             (0x14FCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_665                                             (0x1D5Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_666                                             (0x5CC5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_667                                             (0x4EA3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_668                                             (0x097Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_669                                             (0x33E2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_670                                             (0x68F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_671                                             (0x5B25u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_672                                             (0x6473u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_673                                             (0x5479u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_674                                             (0x2771u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_675                                             (0x0A7Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_676                                             (0x61AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_677                                             (0x3D4Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_678                                             (0x13CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_679                                             (0x0C5Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_680                                             (0x35E8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_681                                             (0x19F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_682                                             (0x7A54u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_683                                             (0x760Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_684                                             (0x1FA8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_685                                             (0x1F64u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_686                                             (0x36B2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_687                                             (0x0A9Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_688                                             (0x54E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_689                                             (0x6CC3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_690                                             (0x3792u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_691                                             (0x4766u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_692                                             (0x69B4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_693                                             (0x48B7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_694                                             (0x3719u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_695                                             (0x3F06u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_696                                             (0x715Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_697                                             (0x12DEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_698                                             (0x721Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_699                                             (0x1D65u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_700                                             (0x2736u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_701                                             (0x29D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_702                                             (0x1CDCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_703                                             (0x1D1Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_704                                             (0x29D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_705                                             (0x5D64u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_706                                             (0x30FCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_707                                             (0x63B1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_708                                             (0x2FC1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_709                                             (0x1F29u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_710                                             (0x4D65u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_711                                             (0x7AC4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_712                                             (0x0DDAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_713                                             (0x38ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_714                                             (0x56A6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_715                                             (0x1CE3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_716                                             (0x0DE9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_717                                             (0x5553u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_718                                             (0x7E24u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_719                                             (0x3B32u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_720                                             (0x7C62u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_721                                             (0x61C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_722                                             (0x3D8Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_723                                             (0x4FC4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_724                                             (0x61EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_725                                             (0x3B86u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_726                                             (0x19BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_727                                             (0x43B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_728                                             (0x1D8Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_729                                             (0x4E35u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_730                                             (0x7C23u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_731                                             (0x734Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_732                                             (0x3327u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_733                                             (0x6716u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_734                                             (0x707Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_735                                             (0x3897u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_736                                             (0x4F43u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_737                                             (0x3723u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_738                                             (0x5A36u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_739                                             (0x333Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_740                                             (0x6C99u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_741                                             (0x15ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_742                                             (0x1DCCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_743                                             (0x538Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_744                                             (0x6C5Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_745                                             (0x53D1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_746                                             (0x5E46u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_747                                             (0x5E0Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_748                                             (0x233Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_749                                             (0x686Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_750                                             (0x1B3Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_751                                             (0x691Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_752                                             (0x50BDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_753                                             (0x46D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_754                                             (0x2DB8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_755                                             (0x154Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_756                                             (0x6BC2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_757                                             (0x0FB8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_758                                             (0x3DC4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_759                                             (0x44D7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_760                                             (0x3DE0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_761                                             (0x7463u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_762                                             (0x39CCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_763                                             (0x643Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_764                                             (0x4AB6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_765                                             (0x495Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_766                                             (0x5CD2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_767                                             (0x6C65u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_768                                             (0x34B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_769                                             (0x781Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_770                                             (0x67C2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_771                                             (0x7259u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_772                                             (0x5C93u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_773                                             (0x1AB6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_774                                             (0x2DD4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_775                                             (0x076Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_776                                             (0x19E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_777                                             (0x47D2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_778                                             (0x5672u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_779                                             (0x476Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_780                                             (0x15B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_781                                             (0x1B69u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_782                                             (0x53B2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_783                                             (0x29E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_784                                             (0x5B62u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_785                                             (0x316Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_786                                             (0x5897u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_787                                             (0x6ACAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_788                                             (0x235Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_789                                             (0x1F0Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_790                                             (0x618Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_791                                             (0x0DADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_792                                             (0x7A94u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_793                                             (0x78D2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_794                                             (0x7949u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_795                                             (0x5B51u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_796                                             (0x1B2Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_797                                             (0x116Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_798                                             (0x386Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_799                                             (0x5BE0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_800                                             (0x4EC9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_801                                             (0x505Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_802                                             (0x4675u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_803                                             (0x305Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_804                                             (0x7E90u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_805                                             (0x5969u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_806                                             (0x7AA2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_807                                             (0x4BC6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_808                                             (0x2379u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_809                                             (0x23B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_810                                             (0x7CC2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_811                                             (0x715Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_812                                             (0x2B53u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_813                                             (0x1579u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_814                                             (0x4657u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_815                                             (0x6AC6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_816                                             (0x4E1Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_817                                             (0x7724u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_818                                             (0x52CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_819                                             (0x495Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_820                                             (0x1B5Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_821                                             (0x682Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_822                                             (0x32DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_823                                             (0x133Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_824                                             (0x0EF1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_825                                             (0x5B89u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_826                                             (0x0FA3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_827                                             (0x4CD9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_828                                             (0x479Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_829                                             (0x6363u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_830                                             (0x4D74u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_831                                             (0x18EDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_832                                             (0x748Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_833                                             (0x3A3Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_834                                             (0x5D49u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_835                                             (0x198Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_836                                             (0x762Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_837                                             (0x0BD6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_838                                             (0x2F34u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_839                                             (0x75D0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_840                                             (0x1D78u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_841                                             (0x62A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_842                                             (0x4F68u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_843                                             (0x5791u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_844                                             (0x39D8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_845                                             (0x285Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_846                                             (0x6E86u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_847                                             (0x05EBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_848                                             (0x59C3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_849                                             (0x5BC2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_850                                             (0x740Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_851                                             (0x0E76u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_852                                             (0x157Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_853                                             (0x6B0Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_854                                             (0x6A47u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_855                                             (0x0E3Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_856                                             (0x7638u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_857                                             (0x24E7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_858                                             (0x0D6Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_859                                             (0x5517u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_860                                             (0x30D7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_861                                             (0x1D59u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_862                                             (0x57E0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_863                                             (0x745Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_864                                             (0x43D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_865                                             (0x3B58u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_866                                             (0x730Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_867                                             (0x75C8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_868                                             (0x278Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_869                                             (0x54ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_870                                             (0x0AEDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_871                                             (0x46CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_872                                             (0x56D4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_873                                             (0x5CB8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_874                                             (0x317Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_875                                             (0x73C8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_876                                             (0x2BB4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_877                                             (0x079Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_878                                             (0x31CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_879                                             (0x47CAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_880                                             (0x2AB3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_881                                             (0x52E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_882                                             (0x5CA6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_883                                             (0x16F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_884                                             (0x5713u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_885                                             (0x6B86u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_886                                             (0x5A93u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_887                                             (0x66E4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_888                                             (0x5257u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_889                                             (0x3B34u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_890                                             (0x0CB7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_891                                             (0x6335u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_892                                             (0x1D93u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_893                                             (0x38B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_894                                             (0x4F8Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_895                                             (0x2E2Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_896                                             (0x7A51u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_897                                             (0x56AAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_898                                             (0x1BD2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_899                                             (0x1AF8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_900                                             (0x1975u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_901                                             (0x2CB5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_902                                             (0x11BEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_903                                             (0x681Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_904                                             (0x5E23u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_905                                             (0x7AB0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_906                                             (0x7534u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_907                                             (0x3DC1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_908                                             (0x655Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_909                                             (0x4B1Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_910                                             (0x70CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_911                                             (0x1E66u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_912                                             (0x556Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_913                                             (0x5B07u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_914                                             (0x390Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_915                                             (0x4DCCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_916                                             (0x596Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_917                                             (0x1AECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_918                                             (0x41DBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_919                                             (0x5617u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_920                                             (0x5C4Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_921                                             (0x4F23u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_922                                             (0x662Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_923                                             (0x24FAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_924                                             (0x0E4Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_925                                             (0x62F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_926                                             (0x35CCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_927                                             (0x68E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_928                                             (0x7D81u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_929                                             (0x58E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_930                                             (0x1C97u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_931                                             (0x25B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_932                                             (0x0AD7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_933                                             (0x39C9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_934                                             (0x3C27u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_935                                             (0x28F3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_936                                             (0x175Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_937                                             (0x39A6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_938                                             (0x2375u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_939                                             (0x3699u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_940                                             (0x3D43u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_941                                             (0x70B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_942                                             (0x34E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_943                                             (0x4FC8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_944                                             (0x03FAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_945                                             (0x5AACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_946                                             (0x46EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_947                                             (0x065Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_948                                             (0x49CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_949                                             (0x64C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_950                                             (0x6393u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_951                                             (0x392Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_952                                             (0x16DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_953                                             (0x0BB3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_954                                             (0x591Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_955                                             (0x4C6Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_956                                             (0x4C7Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_957                                             (0x1E99u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_958                                             (0x14E7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_959                                             (0x3479u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_960                                             (0x5CB2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_961                                             (0x0ECBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_962                                             (0x748Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_963                                             (0x23F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_964                                             (0x5B68u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_965                                             (0x6CD2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_966                                             (0x4B93u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_967                                             (0x712Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_968                                             (0x19DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_969                                             (0x4C76u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_970                                             (0x6356u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_971                                             (0x41F9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_972                                             (0x30FAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_973                                             (0x6B4Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_974                                             (0x55D8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_975                                             (0x2C2Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_976                                             (0x5A9Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_977                                             (0x5CD4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_978                                             (0x23E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_979                                             (0x6C17u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_980                                             (0x5C8Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_981                                             (0x7934u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_982                                             (0x526Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_983                                             (0x1B59u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_984                                             (0x694Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_985                                             (0x1E55u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_986                                             (0x163Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_987                                             (0x6F41u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_988                                             (0x06DBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_989                                             (0x5D94u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_990                                             (0x2A9Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_991                                             (0x6636u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_992                                             (0x5C6Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_993                                             (0x4AB9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_994                                             (0x0DCBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_995                                             (0x7A25u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_996                                             (0x3E52u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_997                                             (0x7361u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_998                                             (0x4576u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_999                                             (0x25E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1000                                            (0x60CFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1001                                            (0x5B31u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1002                                            (0x16AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1003                                            (0x1AC7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1004                                            (0x3AA6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1005                                            (0x6C95u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1006                                            (0x7159u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1007                                            (0x7C4Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1008                                            (0x4733u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1009                                            (0x4567u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1010                                            (0x38B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1011                                            (0x24F6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1012                                            (0x724Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1013                                            (0x6AB4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1014                                            (0x5A69u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1015                                            (0x72AAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1016                                            (0x7643u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1017                                            (0x2C6Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1018                                            (0x25C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1019                                            (0x3A87u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1020                                            (0x225Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1021                                            (0x6D16u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1022                                            (0x35ACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1023                                            (0x3E91u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1024                                            (0x789Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1025                                            (0x7B0Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1026                                            (0x12F3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1027                                            (0x34F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1028                                            (0x7C86u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1029                                            (0x56E4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1030                                            (0x569Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1031                                            (0x3AC3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1032                                            (0x3339u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1033                                            (0x1957u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1034                                            (0x5563u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1035                                            (0x6A71u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1036                                            (0x55B8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1037                                            (0x1DD2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1038                                            (0x499Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1039                                            (0x3359u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1040                                            (0x2AD3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1041                                            (0x592Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1042                                            (0x5E4Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1043                                            (0x0F8Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1044                                            (0x6D49u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1045                                            (0x6B58u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1046                                            (0x34D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1047                                            (0x16F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1048                                            (0x2D6Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1049                                            (0x239Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1050                                            (0x16D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1051                                            (0x58BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1052                                            (0x44FAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1053                                            (0x359Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1054                                            (0x6D91u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1055                                            (0x4D2Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1056                                            (0x1E4Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1057                                            (0x33B2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1058                                            (0x1CBAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1059                                            (0x7278u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1060                                            (0x3B29u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1061                                            (0x7447u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1062                                            (0x4E99u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1063                                            (0x78E1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1064                                            (0x58F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1065                                            (0x750Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1066                                            (0x7E09u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1067                                            (0x14CFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1068                                            (0x1DB2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1069                                            (0x615Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1070                                            (0x3B8Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1071                                            (0x58F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1072                                            (0x2AB6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1073                                            (0x6B25u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1074                                            (0x0C77u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1075                                            (0x5972u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1076                                            (0x13AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1077                                            (0x12F6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1078                                            (0x38ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1079                                            (0x5CD1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1080                                            (0x26CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1081                                            (0x2ECAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1082                                            (0x37C8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1083                                            (0x5A3Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1084                                            (0x38E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1085                                            (0x4F19u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1086                                            (0x2795u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1087                                            (0x768Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1088                                            (0x393Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1089                                            (0x417Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1090                                            (0x5A66u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1091                                            (0x35B1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1092                                            (0x65D1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1093                                            (0x6956u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1094                                            (0x2F45u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1095                                            (0x4ED2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1096                                            (0x586Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1097                                            (0x6371u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1098                                            (0x52A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1099                                            (0x27D8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1100                                            (0x5D16u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1101                                            (0x36B4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1102                                            (0x5A17u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1103                                            (0x295Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1104                                            (0x13ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1105                                            (0x0ED3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1106                                            (0x5B26u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1107                                            (0x61DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1108                                            (0x3C56u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1109                                            (0x660Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1110                                            (0x6365u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1111                                            (0x5A0Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1112                                            (0x3743u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1113                                            (0x06F9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1114                                            (0x4CAEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1115                                            (0x5974u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1116                                            (0x17E8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1117                                            (0x1A67u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1118                                            (0x7C49u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1119                                            (0x14D7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1120                                            (0x2B17u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1121                                            (0x741Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1122                                            (0x5745u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1123                                            (0x7C1Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1124                                            (0x2B2Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1125                                            (0x6C1Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1126                                            (0x35CAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1127                                            (0x05F6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1128                                            (0x2C9Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1129                                            (0x71A6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1130                                            (0x123Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1131                                            (0x069Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1132                                            (0x136Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1133                                            (0x6857u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1134                                            (0x4E0Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1135                                            (0x193Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1136                                            (0x15F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1137                                            (0x127Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1138                                            (0x668Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1139                                            (0x34ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1140                                            (0x7AA8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1141                                            (0x3E25u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1142                                            (0x3365u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1143                                            (0x4C5Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1144                                            (0x2E1Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1145                                            (0x2B55u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1146                                            (0x64EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1147                                            (0x36D1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1148                                            (0x70E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1149                                            (0x3794u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1150                                            (0x5167u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1151                                            (0x1A6Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1152                                            (0x6A66u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1153                                            (0x311Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1154                                            (0x62F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1155                                            (0x6A6Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1156                                            (0x13BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1157                                            (0x274Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1158                                            (0x6AA5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1159                                            (0x22F3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1160                                            (0x2755u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1161                                            (0x5E26u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1162                                            (0x726Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1163                                            (0x5AC5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1164                                            (0x51D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1165                                            (0x04DFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1166                                            (0x4DA5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1167                                            (0x49DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1168                                            (0x7439u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1169                                            (0x645Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1170                                            (0x6C96u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1171                                            (0x236Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1172                                            (0x2AADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1173                                            (0x5BA8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1174                                            (0x2673u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1175                                            (0x41EDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1176                                            (0x18E7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1177                                            (0x705Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1178                                            (0x1C3Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1179                                            (0x7607u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1180                                            (0x0E97u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1181                                            (0x4A9Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1182                                            (0x1759u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1183                                            (0x3A47u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1184                                            (0x5A27u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1185                                            (0x4A6Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1186                                            (0x6267u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1187                                            (0x4B59u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1188                                            (0x2ACBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1189                                            (0x16CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1190                                            (0x6CF0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1191                                            (0x7D42u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1192                                            (0x432Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1193                                            (0x25F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1194                                            (0x546Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1195                                            (0x69E2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1196                                            (0x7C91u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1197                                            (0x232Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1198                                            (0x2337u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1199                                            (0x6E1Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1200                                            (0x5E85u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1201                                            (0x1A73u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1202                                            (0x29F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1203                                            (0x5738u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1204                                            (0x1DCAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1205                                            (0x21EDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1206                                            (0x3B0Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1207                                            (0x25EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1208                                            (0x0DB5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1209                                            (0x7543u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1210                                            (0x4735u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1211                                            (0x11EDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1212                                            (0x458Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1213                                            (0x6C2Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1214                                            (0x15B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1215                                            (0x3C3Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1216                                            (0x5C5Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1217                                            (0x53A5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1218                                            (0x635Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1219                                            (0x638Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1220                                            (0x70AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1221                                            (0x1DD8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1222                                            (0x34BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1223                                            (0x491Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1224                                            (0x0DD5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1225                                            (0x2BC5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1226                                            (0x6536u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1227                                            (0x63D1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1228                                            (0x75A1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1229                                            (0x1357u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1230                                            (0x4F98u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1231                                            (0x2FC8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1232                                            (0x139Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1233                                            (0x64ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1234                                            (0x13CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1235                                            (0x332Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1236                                            (0x6663u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1237                                            (0x4FC2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1238                                            (0x65A5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1239                                            (0x67C4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1240                                            (0x487Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1241                                            (0x6B0Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1242                                            (0x516Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1243                                            (0x0FC9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1244                                            (0x3E46u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1245                                            (0x627Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1246                                            (0x4A5Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1247                                            (0x2DD8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1248                                            (0x6A65u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1249                                            (0x7760u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1250                                            (0x7750u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1251                                            (0x5879u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1252                                            (0x3D64u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1253                                            (0x06F6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1254                                            (0x4787u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1255                                            (0x1CF8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1256                                            (0x70E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1257                                            (0x41B7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1258                                            (0x12BDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1259                                            (0x146Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1260                                            (0x5497u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1261                                            (0x633Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1262                                            (0x48F5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1263                                            (0x1BC9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1264                                            (0x545Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1265                                            (0x616Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1266                                            (0x51BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1267                                            (0x728Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1268                                            (0x3965u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1269                                            (0x47A5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1270                                            (0x74CAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1271                                            (0x0CBEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1272                                            (0x3C6Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1273                                            (0x50EEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1274                                            (0x45F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1275                                            (0x30DDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1276                                            (0x6DA4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1277                                            (0x68ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1278                                            (0x0CFCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1279                                            (0x273Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1280                                            (0x51B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1281                                            (0x1B4Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1282                                            (0x35F0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1283                                            (0x0D57u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1284                                            (0x02EFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1285                                            (0x4A67u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1286                                            (0x457Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1287                                            (0x54E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1288                                            (0x2AF8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1289                                            (0x746Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1290                                            (0x6A74u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1291                                            (0x099Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1292                                            (0x654Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1293                                            (0x3C5Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1294                                            (0x18BBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1295                                            (0x617Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1296                                            (0x2E5Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1297                                            (0x6E68u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1298                                            (0x713Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1299                                            (0x26F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1300                                            (0x6257u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1301                                            (0x786Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1302                                            (0x16D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1303                                            (0x1C67u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1304                                            (0x64CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1305                                            (0x62B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1306                                            (0x47C3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1307                                            (0x78A9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1308                                            (0x2ED8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1309                                            (0x3B07u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1310                                            (0x5B1Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1311                                            (0x1E47u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1312                                            (0x39B4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1313                                            (0x30E7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1314                                            (0x41EEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1315                                            (0x5547u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1316                                            (0x4B4Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1317                                            (0x2E1Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1318                                            (0x5A3Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1319                                            (0x7558u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1320                                            (0x32F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1321                                            (0x4727u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1322                                            (0x3ACCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1323                                            (0x3655u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1324                                            (0x1F49u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1325                                            (0x3B1Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1326                                            (0x6077u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1327                                            (0x4EB8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1328                                            (0x056Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1329                                            (0x7C58u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1330                                            (0x45D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1331                                            (0x3FA0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1332                                            (0x63D4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1333                                            (0x76C8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1334                                            (0x4D95u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1335                                            (0x370Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1336                                            (0x1F8Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1337                                            (0x4CDCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1338                                            (0x3539u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1339                                            (0x24CFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1340                                            (0x1D99u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1341                                            (0x451Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1342                                            (0x15B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1343                                            (0x5CC3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1344                                            (0x3CC3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1345                                            (0x6C56u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1346                                            (0x04F7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1347                                            (0x7D84u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1348                                            (0x25BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1349                                            (0x2CD6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1350                                            (0x391Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1351                                            (0x075Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1352                                            (0x67A4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1353                                            (0x195Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1354                                            (0x478Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1355                                            (0x47E2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1356                                            (0x52C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1357                                            (0x18BEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1358                                            (0x3473u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1359                                            (0x798Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1360                                            (0x3378u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1361                                            (0x72D2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1362                                            (0x7163u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1363                                            (0x18DEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1364                                            (0x22FCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1365                                            (0x2BCCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1366                                            (0x0E6Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1367                                            (0x2CF4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1368                                            (0x5D4Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1369                                            (0x3527u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1370                                            (0x3353u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1371                                            (0x1CCEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1372                                            (0x4BD1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1373                                            (0x1E8Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1374                                            (0x7D24u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1375                                            (0x4E47u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1376                                            (0x5955u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1377                                            (0x72A3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1378                                            (0x1E33u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1379                                            (0x5AD4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1380                                            (0x247Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1381                                            (0x67E0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1382                                            (0x4BA6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1383                                            (0x594Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1384                                            (0x454Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1385                                            (0x58EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1386                                            (0x4DD8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1387                                            (0x7364u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1388                                            (0x0B3Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1389                                            (0x1E53u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1390                                            (0x5EC1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1391                                            (0x31F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1392                                            (0x7495u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1393                                            (0x439Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1394                                            (0x344Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1395                                            (0x5A1Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1396                                            (0x3963u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1397                                            (0x46ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1398                                            (0x1DAAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1399                                            (0x326Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1400                                            (0x522Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1401                                            (0x73C2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1402                                            (0x1DB1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1403                                            (0x14F6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1404                                            (0x26F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1405                                            (0x32D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1406                                            (0x6B15u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1407                                            (0x19AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1408                                            (0x0D5Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1409                                            (0x7899u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1410                                            (0x5587u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1411                                            (0x674Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1412                                            (0x2C73u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1413                                            (0x2B1Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1414                                            (0x12AFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1415                                            (0x78B2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1416                                            (0x3731u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1417                                            (0x4D35u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1418                                            (0x23D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1419                                            (0x4B65u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1420                                            (0x29F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1421                                            (0x7394u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1422                                            (0x65D8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1423                                            (0x386Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1424                                            (0x6C0Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1425                                            (0x6C4Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1426                                            (0x2BA9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1427                                            (0x2F46u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1428                                            (0x3D26u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1429                                            (0x7A15u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1430                                            (0x7398u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1431                                            (0x73C4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1432                                            (0x32DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1433                                            (0x21F6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1434                                            (0x162Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1435                                            (0x1E2Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1436                                            (0x22DEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1437                                            (0x593Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1438                                            (0x173Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1439                                            (0x66D2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1440                                            (0x217Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1441                                            (0x44EDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1442                                            (0x3617u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1443                                            (0x09DBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1444                                            (0x51CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1445                                            (0x591Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1446                                            (0x45ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1447                                            (0x19ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1448                                            (0x7649u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1449                                            (0x3653u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1450                                            (0x6574u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1451                                            (0x7C16u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1452                                            (0x7932u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1453                                            (0x364Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1454                                            (0x790Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1455                                            (0x323Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1456                                            (0x586Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1457                                            (0x1B35u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1458                                            (0x78E2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1459                                            (0x6F06u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1460                                            (0x0BF2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1461                                            (0x14DDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1462                                            (0x5959u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1463                                            (0x3CAAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1464                                            (0x5734u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1465                                            (0x46E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1466                                            (0x2ABAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1467                                            (0x0AEBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1468                                            (0x46CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1469                                            (0x6273u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1470                                            (0x32AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1471                                            (0x4E93u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1472                                            (0x369Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1473                                            (0x4DB1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1474                                            (0x23F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1475                                            (0x3AB2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1476                                            (0x744Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1477                                            (0x26D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1478                                            (0x5953u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1479                                            (0x558Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1480                                            (0x5D45u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1481                                            (0x2B35u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1482                                            (0x32D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1483                                            (0x7943u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1484                                            (0x0AAFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1485                                            (0x2F91u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1486                                            (0x68F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1487                                            (0x3D54u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1488                                            (0x1BF0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1489                                            (0x2AABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1490                                            (0x1C4Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1491                                            (0x0D67u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1492                                            (0x159Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1493                                            (0x1E59u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1494                                            (0x6A2Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1495                                            (0x18FCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1496                                            (0x39C6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1497                                            (0x6F28u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1498                                            (0x219Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1499                                            (0x1976u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1500                                            (0x24DDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1501                                            (0x51ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1502                                            (0x7217u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1503                                            (0x5137u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1504                                            (0x2F43u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1505                                            (0x14BEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1506                                            (0x5297u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1507                                            (0x40FEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1508                                            (0x2A79u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1509                                            (0x117Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1510                                            (0x269Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1511                                            (0x66C9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1512                                            (0x42EBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1513                                            (0x153Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1514                                            (0x55A5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1515                                            (0x7615u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1516                                            (0x43F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1517                                            (0x1BE4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1518                                            (0x3C1Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1519                                            (0x33D1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1520                                            (0x607Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1521                                            (0x6475u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1522                                            (0x3C8Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1523                                            (0x1799u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1524                                            (0x5EA4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1525                                            (0x7459u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1526                                            (0x2735u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1527                                            (0x6476u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1528                                            (0x6C27u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1529                                            (0x2B1Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1530                                            (0x61BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1531                                            (0x3B16u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1532                                            (0x2AB9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1533                                            (0x644Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1534                                            (0x2ED1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1535                                            (0x1F68u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1536                                            (0x1557u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1537                                            (0x3D07u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1538                                            (0x1A5Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1539                                            (0x55E4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1540                                            (0x3995u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1541                                            (0x5E70u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1542                                            (0x71D2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1543                                            (0x3E0Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1544                                            (0x2F07u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1545                                            (0x163Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1546                                            (0x4B33u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1547                                            (0x3D85u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1548                                            (0x297Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1549                                            (0x0EDCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1550                                            (0x4A2Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1551                                            (0x5E43u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1552                                            (0x4F32u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1553                                            (0x1AB3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1554                                            (0x64B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1555                                            (0x4EC5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1556                                            (0x6E19u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1557                                            (0x42BDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1558                                            (0x3B92u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1559                                            (0x5A56u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1560                                            (0x6587u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1561                                            (0x66A3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1562                                            (0x19B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1563                                            (0x21D7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1564                                            (0x4376u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1565                                            (0x32A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1566                                            (0x7951u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1567                                            (0x1B2Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1568                                            (0x5754u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1569                                            (0x0D8Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1570                                            (0x1D3Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1571                                            (0x3E86u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1572                                            (0x43CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1573                                            (0x1739u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1574                                            (0x7985u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1575                                            (0x7472u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1576                                            (0x196Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1577                                            (0x2DE8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1578                                            (0x6A78u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1579                                            (0x38BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1580                                            (0x1F51u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1581                                            (0x0F6Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1582                                            (0x70B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1583                                            (0x34D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1584                                            (0x64E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1585                                            (0x352Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1586                                            (0x6764u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1587                                            (0x3555u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1588                                            (0x378Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1589                                            (0x1D35u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1590                                            (0x515Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1591                                            (0x292Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1592                                            (0x4C3Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1593                                            (0x1733u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1594                                            (0x5BA1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1595                                            (0x59E4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1596                                            (0x7313u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1597                                            (0x48BBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1598                                            (0x7075u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1599                                            (0x11BBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1600                                            (0x5D43u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1601                                            (0x3876u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1602                                            (0x1B6Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1603                                            (0x1BCAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1604                                            (0x18F9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1605                                            (0x559Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1606                                            (0x19BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1607                                            (0x382Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1608                                            (0x3751u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1609                                            (0x5768u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1610                                            (0x1BC6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1611                                            (0x7E60u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1612                                            (0x27C6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1613                                            (0x33C6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1614                                            (0x2B87u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1615                                            (0x2E74u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1616                                            (0x7B05u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1617                                            (0x59B8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1618                                            (0x465Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1619                                            (0x3D15u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1620                                            (0x0F8Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1621                                            (0x38D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1622                                            (0x659Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1623                                            (0x295Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1624                                            (0x265Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1625                                            (0x7626u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1626                                            (0x27B2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1627                                            (0x55B4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1628                                            (0x64E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1629                                            (0x315Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1630                                            (0x299Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1631                                            (0x6C59u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1632                                            (0x169Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1633                                            (0x3639u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1634                                            (0x0F6Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1635                                            (0x4ACDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1636                                            (0x3D1Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1637                                            (0x2397u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1638                                            (0x664Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1639                                            (0x5731u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1640                                            (0x2E66u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1641                                            (0x1BE8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1642                                            (0x5B2Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1643                                            (0x27B8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1644                                            (0x4BC3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1645                                            (0x433Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1646                                            (0x2F83u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1647                                            (0x1657u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1648                                            (0x2B65u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1649                                            (0x2BD8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1650                                            (0x561Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1651                                            (0x4375u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1652                                            (0x1AAEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1653                                            (0x39F0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1654                                            (0x668Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1655                                            (0x4C9Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1656                                            (0x6EA8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1657                                            (0x1667u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1658                                            (0x0AEEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1659                                            (0x075Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1660                                            (0x2A2Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1661                                            (0x643Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1662                                            (0x564Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1663                                            (0x33CCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1664                                            (0x63A5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1665                                            (0x56B8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1666                                            (0x53CCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1667                                            (0x7299u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1668                                            (0x0DE3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1669                                            (0x47A9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1670                                            (0x632Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1671                                            (0x7307u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1672                                            (0x3917u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1673                                            (0x719Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1674                                            (0x3B31u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1675                                            (0x658Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1676                                            (0x3C59u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1677                                            (0x744Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1678                                            (0x63CAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1679                                            (0x0677u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1680                                            (0x74CCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1681                                            (0x1B39u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1682                                            (0x4BCCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1683                                            (0x45D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1684                                            (0x2CABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1685                                            (0x456Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1686                                            (0x0F9Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1687                                            (0x1CB6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1688                                            (0x327Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1689                                            (0x0E6Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1690                                            (0x23DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1691                                            (0x55E1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1692                                            (0x69D8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1693                                            (0x5B16u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1694                                            (0x78B8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1695                                            (0x69CAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1696                                            (0x385Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1697                                            (0x4937u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1698                                            (0x6CA9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1699                                            (0x263Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1700                                            (0x709Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1701                                            (0x513Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1702                                            (0x496Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1703                                            (0x6E0Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1704                                            (0x57C4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1705                                            (0x3F41u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1706                                            (0x2B3Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1707                                            (0x7A0Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1708                                            (0x7931u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1709                                            (0x63C6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1710                                            (0x783Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1711                                            (0x5B70u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1712                                            (0x65B4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1713                                            (0x49B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1714                                            (0x65A9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1715                                            (0x6996u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1716                                            (0x2F86u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1717                                            (0x574Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1718                                            (0x423Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1719                                            (0x564Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1720                                            (0x3636u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1721                                            (0x0D1Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1722                                            (0x782Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1723                                            (0x2AA7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1724                                            (0x5D91u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1725                                            (0x1277u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1726                                            (0x265Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1727                                            (0x0F1Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1728                                            (0x606Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1729                                            (0x5C9Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1730                                            (0x5353u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1731                                            (0x191Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1732                                            (0x330Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1733                                            (0x5E25u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1734                                            (0x08FDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1735                                            (0x5175u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1736                                            (0x6CAAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1737                                            (0x5333u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1738                                            (0x1ACBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1739                                            (0x6672u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1740                                            (0x39D1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1741                                            (0x3BB0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1742                                            (0x7A52u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1743                                            (0x5794u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1744                                            (0x5D23u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1745                                            (0x6D1Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1746                                            (0x72E8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1747                                            (0x5F82u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1748                                            (0x650Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1749                                            (0x0D9Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1750                                            (0x1B3Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1751                                            (0x36D8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1752                                            (0x0B75u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1753                                            (0x583Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1754                                            (0x2EE8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1755                                            (0x41DDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1756                                            (0x159Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1757                                            (0x6F44u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1758                                            (0x7B30u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1759                                            (0x46BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1760                                            (0x0B6Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1761                                            (0x3CD8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1762                                            (0x06DEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1763                                            (0x69B1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1764                                            (0x216Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1765                                            (0x3F90u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1766                                            (0x166Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1767                                            (0x1D96u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1768                                            (0x32E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1769                                            (0x32D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1770                                            (0x17A6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1771                                            (0x5A8Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1772                                            (0x2373u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1773                                            (0x2DC3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1774                                            (0x51F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1775                                            (0x6E91u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1776                                            (0x4F92u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1777                                            (0x7325u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1778                                            (0x31B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1779                                            (0x495Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1780                                            (0x1ABAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1781                                            (0x75B0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1782                                            (0x56C6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1783                                            (0x26DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1784                                            (0x5387u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1785                                            (0x64E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1786                                            (0x11DEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1787                                            (0x591Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1788                                            (0x23CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1789                                            (0x7358u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1790                                            (0x6317u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1791                                            (0x4F34u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1792                                            (0x49B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1793                                            (0x27E8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1794                                            (0x6593u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1795                                            (0x44EEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1796                                            (0x6C1Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1797                                            (0x26BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1798                                            (0x30EDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1799                                            (0x276Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1800                                            (0x47C6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1801                                            (0x5173u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1802                                            (0x07D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1803                                            (0x714Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1804                                            (0x3D8Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1805                                            (0x0D4Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1806                                            (0x6533u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1807                                            (0x2778u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1808                                            (0x1ECCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1809                                            (0x7A23u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1810                                            (0x49F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1811                                            (0x3F0Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1812                                            (0x1B1Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1813                                            (0x0D76u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1814                                            (0x24BEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1815                                            (0x07CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1816                                            (0x2DCCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1817                                            (0x7952u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1818                                            (0x5D0Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1819                                            (0x55E2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1820                                            (0x672Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1821                                            (0x549Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1822                                            (0x1B53u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1823                                            (0x0DC7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1824                                            (0x1E5Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1825                                            (0x6B64u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1826                                            (0x0DA7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1827                                            (0x289Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1828                                            (0x7B42u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1829                                            (0x59E8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1830                                            (0x07F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1831                                            (0x3CA9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1832                                            (0x1F4Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1833                                            (0x2DACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1834                                            (0x39D4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1835                                            (0x0B3Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1836                                            (0x751Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1837                                            (0x1C9Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1838                                            (0x55A3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1839                                            (0x7568u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1840                                            (0x46AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1841                                            (0x70D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1842                                            (0x5AA5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1843                                            (0x3D68u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1844                                            (0x570Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1845                                            (0x0BB6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1846                                            (0x641Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1847                                            (0x3E58u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1848                                            (0x62C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1849                                            (0x6B46u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1850                                            (0x57D0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1851                                            (0x7E30u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1852                                            (0x6789u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1853                                            (0x12F5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1854                                            (0x12BBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1855                                            (0x7654u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1856                                            (0x15A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1857                                            (0x2AECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1858                                            (0x6CACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1859                                            (0x236Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1860                                            (0x5F48u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1861                                            (0x269Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1862                                            (0x6B26u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1863                                            (0x578Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1864                                            (0x532Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1865                                            (0x18CFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1866                                            (0x5B38u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1867                                            (0x2AE9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1868                                            (0x0977u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1869                                            (0x6A8Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1870                                            (0x3A56u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1871                                            (0x6947u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1872                                            (0x1A2Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1873                                            (0x655Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1874                                            (0x3D52u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1875                                            (0x2B4Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1876                                            (0x26F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1877                                            (0x2E71u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1878                                            (0x35D1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1879                                            (0x1EB8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1880                                            (0x1CB9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1881                                            (0x171Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1882                                            (0x5DC1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1883                                            (0x4D1Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1884                                            (0x3A5Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1885                                            (0x6D89u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1886                                            (0x36D2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1887                                            (0x3D89u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1888                                            (0x0EBCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1889                                            (0x4759u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1890                                            (0x7AC8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1891                                            (0x4F29u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1892                                            (0x2D2Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1893                                            (0x2F31u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1894                                            (0x3E13u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1895                                            (0x62CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1896                                            (0x3E26u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1897                                            (0x06BDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1898                                            (0x662Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1899                                            (0x0EDAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1900                                            (0x54CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1901                                            (0x0BDCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1902                                            (0x11EEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1903                                            (0x54D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1904                                            (0x51D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1905                                            (0x1F2Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1906                                            (0x0BD3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1907                                            (0x324Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1908                                            (0x4D53u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1909                                            (0x4DE1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1910                                            (0x3EC4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1911                                            (0x34B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1912                                            (0x7564u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1913                                            (0x03F5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1914                                            (0x155Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1915                                            (0x0D7Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1916                                            (0x6547u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1917                                            (0x3D31u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1918                                            (0x3C65u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1919                                            (0x3395u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1920                                            (0x16ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1921                                            (0x66A5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1922                                            (0x33B8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1923                                            (0x7C92u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1924                                            (0x4E17u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1925                                            (0x745Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1926                                            (0x2BC3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1927                                            (0x26B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1928                                            (0x5EA2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1929                                            (0x3396u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1930                                            (0x0F27u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1931                                            (0x4B53u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1932                                            (0x3C2Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1933                                            (0x349Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1934                                            (0x5378u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1935                                            (0x722Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1936                                            (0x2B6Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1937                                            (0x6EB0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1938                                            (0x6D64u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1939                                            (0x2E72u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1940                                            (0x4DE8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1941                                            (0x3738u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1942                                            (0x4BAAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1943                                            (0x7271u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1944                                            (0x3497u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1945                                            (0x4DC6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1946                                            (0x2EB4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1947                                            (0x7A2Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1948                                            (0x0FCAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1949                                            (0x3734u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1950                                            (0x748Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1951                                            (0x690Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1952                                            (0x6E83u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1953                                            (0x7F08u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1954                                            (0x5276u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1955                                            (0x41BDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1956                                            (0x43ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1957                                            (0x34D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1958                                            (0x7097u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1959                                            (0x237Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1960                                            (0x6745u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1961                                            (0x3B54u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1962                                            (0x4E1Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1963                                            (0x3D34u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1964                                            (0x0E5Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1965                                            (0x3AF0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1966                                            (0x723Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1967                                            (0x671Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1968                                            (0x30F3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1969                                            (0x5723u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1970                                            (0x6F18u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1971                                            (0x3E4Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1972                                            (0x55A9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1973                                            (0x08DFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1974                                            (0x26CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1975                                            (0x1D5Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1976                                            (0x2C97u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1977                                            (0x3BA4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1978                                            (0x7A46u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1979                                            (0x44EBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1980                                            (0x1DC5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1981                                            (0x41FAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1982                                            (0x5E94u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1983                                            (0x76A1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1984                                            (0x295Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1985                                            (0x629Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1986                                            (0x3E0Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1987                                            (0x464Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1988                                            (0x2F51u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1989                                            (0x6761u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1990                                            (0x0ACFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1991                                            (0x3D58u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1992                                            (0x257Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1993                                            (0x44F6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1994                                            (0x62EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1995                                            (0x4CB6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1996                                            (0x659Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1997                                            (0x7A07u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1998                                            (0x5C33u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_1999                                            (0x2BA5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2000                                            (0x703Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2001                                            (0x5D58u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2002                                            (0x7139u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2003                                            (0x3656u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2004                                            (0x4EB2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2005                                            (0x7E81u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2006                                            (0x33E8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2007                                            (0x2CADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2008                                            (0x59CAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2009                                            (0x1EB1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2010                                            (0x3764u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2011                                            (0x23D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2012                                            (0x4537u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2013                                            (0x7651u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2014                                            (0x7591u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2015                                            (0x4E6Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2016                                            (0x1679u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2017                                            (0x259Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2018                                            (0x389Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2019                                            (0x1FB0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2020                                            (0x3F09u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2021                                            (0x227Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2022                                            (0x74C6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2023                                            (0x70F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2024                                            (0x14DEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2025                                            (0x61B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2026                                            (0x336Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2027                                            (0x619Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2028                                            (0x266Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2029                                            (0x4C2Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2030                                            (0x6F22u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2031                                            (0x58E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2032                                            (0x26EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2033                                            (0x3E8Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2034                                            (0x28DBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2035                                            (0x72D8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2036                                            (0x1F54u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2037                                            (0x07ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2038                                            (0x0BCBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2039                                            (0x7709u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2040                                            (0x4A5Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2041                                            (0x3CD2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2042                                            (0x0F17u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2043                                            (0x24EEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2044                                            (0x3C4Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2045                                            (0x0ED9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2046                                            (0x7865u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2047                                            (0x4477u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2048                                            (0x6738u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2049                                            (0x2E96u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2050                                            (0x6A63u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2051                                            (0x7D48u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2052                                            (0x419Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2053                                            (0x58D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2054                                            (0x6EC8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2055                                            (0x427Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2056                                            (0x52D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2057                                            (0x13D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2058                                            (0x5C78u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2059                                            (0x63A9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2060                                            (0x3E1Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2061                                            (0x6B8Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2062                                            (0x31DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2063                                            (0x6B32u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2064                                            (0x74D4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2065                                            (0x374Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2066                                            (0x6666u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2067                                            (0x4C97u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2068                                            (0x269Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2069                                            (0x41CFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2070                                            (0x1A9Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2071                                            (0x4DB8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2072                                            (0x31EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2073                                            (0x1E74u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2074                                            (0x762Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2075                                            (0x70D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2076                                            (0x0B4Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2077                                            (0x653Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2078                                            (0x7C31u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2079                                            (0x4ED1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2080                                            (0x30F6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2081                                            (0x11B7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2082                                            (0x48DEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2083                                            (0x0767u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2084                                            (0x125Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2085                                            (0x3CB1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2086                                            (0x7586u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2087                                            (0x0FE8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2088                                            (0x62AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2089                                            (0x3536u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2090                                            (0x7117u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2091                                            (0x6D15u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2092                                            (0x0FD4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2093                                            (0x3A1Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2094                                            (0x5D1Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2095                                            (0x0A7Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2096                                            (0x0A5Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2097                                            (0x4CCDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2098                                            (0x314Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2099                                            (0x3A9Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2100                                            (0x670Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2101                                            (0x523Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2102                                            (0x58BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2103                                            (0x3157u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2104                                            (0x3770u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2105                                            (0x3972u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2106                                            (0x2ACDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2107                                            (0x71C6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2108                                            (0x4F51u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2109                                            (0x1A97u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2110                                            (0x34CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2111                                            (0x622Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2112                                            (0x514Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2113                                            (0x1736u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2114                                            (0x23CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2115                                            (0x72B2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2116                                            (0x7552u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2117                                            (0x1B1Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2118                                            (0x6175u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2119                                            (0x3AE1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2120                                            (0x32EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2121                                            (0x2727u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2122                                            (0x66C5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2123                                            (0x4EC6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2124                                            (0x16BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2125                                            (0x4717u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2126                                            (0x558Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2127                                            (0x7C98u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2128                                            (0x734Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2129                                            (0x2EA3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2130                                            (0x358Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2131                                            (0x54D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2132                                            (0x12EEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2133                                            (0x7E50u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2134                                            (0x523Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2135                                            (0x6BA4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2136                                            (0x0CF3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2137                                            (0x78A6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2138                                            (0x5716u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2139                                            (0x351Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2140                                            (0x157Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2141                                            (0x2997u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2142                                            (0x718Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2143                                            (0x7992u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2144                                            (0x5A9Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2145                                            (0x2BB2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2146                                            (0x455Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2147                                            (0x569Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2148                                            (0x3CA3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2149                                            (0x2B2Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2150                                            (0x6837u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2151                                            (0x58D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2152                                            (0x2E87u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2153                                            (0x1FD0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2154                                            (0x58ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2155                                            (0x786Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2156                                            (0x5F18u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2157                                            (0x5A8Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2158                                            (0x4D9Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2159                                            (0x453Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2160                                            (0x2F2Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2161                                            (0x11CFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2162                                            (0x0F4Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2163                                            (0x48EBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2164                                            (0x2EC6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2165                                            (0x2B27u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2166                                            (0x31DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2167                                            (0x66D4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2168                                            (0x1E6Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2169                                            (0x7CC4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2170                                            (0x0AF6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2171                                            (0x52AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2172                                            (0x48FAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2173                                            (0x2AC7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2174                                            (0x69E8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2175                                            (0x1C37u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2176                                            (0x3ACAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2177                                            (0x174Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2178                                            (0x68B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2179                                            (0x17F0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2180                                            (0x1C3Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2181                                            (0x59A9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2182                                            (0x2C57u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2183                                            (0x5F14u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2184                                            (0x3EA2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2185                                            (0x43E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2186                                            (0x4D39u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2187                                            (0x32CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2188                                            (0x2597u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2189                                            (0x4F8Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2190                                            (0x11F6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2191                                            (0x15D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2192                                            (0x351Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2193                                            (0x4AB3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2194                                            (0x7073u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2195                                            (0x331Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2196                                            (0x3A8Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2197                                            (0x39B8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2198                                            (0x341Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2199                                            (0x62F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2200                                            (0x43B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2201                                            (0x4DA6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2202                                            (0x4ADAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2203                                            (0x546Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2204                                            (0x4FA1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2205                                            (0x6647u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2206                                            (0x654Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2207                                            (0x17D1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2208                                            (0x05FAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2209                                            (0x4AAEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2210                                            (0x7239u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2211                                            (0x0F74u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2212                                            (0x02BFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2213                                            (0x4E63u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2214                                            (0x7076u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2215                                            (0x0EABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2216                                            (0x6C71u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2217                                            (0x21B7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2218                                            (0x49C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2219                                            (0x754Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2220                                            (0x58E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2221                                            (0x6867u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2222                                            (0x5E61u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2223                                            (0x398Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2224                                            (0x7685u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2225                                            (0x366Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2226                                            (0x6A5Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2227                                            (0x03EDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2228                                            (0x5C4Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2229                                            (0x171Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2230                                            (0x45D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2231                                            (0x649Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2232                                            (0x261Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2233                                            (0x137Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2234                                            (0x596Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2235                                            (0x3C72u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2236                                            (0x4AD3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2237                                            (0x2B9Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2238                                            (0x56F0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2239                                            (0x2DCAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2240                                            (0x578Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2241                                            (0x3467u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2242                                            (0x36B8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2243                                            (0x22DBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2244                                            (0x339Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2245                                            (0x07DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2246                                            (0x07B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2247                                            (0x1597u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2248                                            (0x47B4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2249                                            (0x6D19u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2250                                            (0x2667u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2251                                            (0x6D25u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2252                                            (0x09DEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2253                                            (0x33A5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2254                                            (0x1D9Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2255                                            (0x6CD8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2256                                            (0x1CA7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2257                                            (0x43F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2258                                            (0x2F68u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2259                                            (0x227Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2260                                            (0x4F46u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2261                                            (0x3E92u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2262                                            (0x698Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2263                                            (0x359Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2264                                            (0x6A9Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2265                                            (0x7714u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2266                                            (0x6347u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2267                                            (0x16B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2268                                            (0x3DD0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2269                                            (0x66F0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2270                                            (0x6873u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2271                                            (0x589Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2272                                            (0x621Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2273                                            (0x61BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2274                                            (0x23ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2275                                            (0x1F32u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2276                                            (0x6E0Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2277                                            (0x78A5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2278                                            (0x6E32u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2279                                            (0x6AD1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2280                                            (0x0DECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2281                                            (0x51B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2282                                            (0x2ED4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2283                                            (0x3837u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2284                                            (0x0FB4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2285                                            (0x22BBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2286                                            (0x2FD0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2287                                            (0x695Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2288                                            (0x4E36u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2289                                            (0x2E8Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2290                                            (0x553Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2291                                            (0x4975u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2292                                            (0x25CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2293                                            (0x43D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2294                                            (0x6359u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2295                                            (0x6751u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2296                                            (0x0B6Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2297                                            (0x729Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2298                                            (0x217Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2299                                            (0x598Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2300                                            (0x4E4Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2301                                            (0x49ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2302                                            (0x746Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2303                                            (0x3D0Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2304                                            (0x25B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2305                                            (0x1A9Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2306                                            (0x21EEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2307                                            (0x5E68u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2308                                            (0x7A43u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2309                                            (0x1A3Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2310                                            (0x5D0Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2311                                            (0x4795u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2312                                            (0x0F8Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2313                                            (0x5C5Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2314                                            (0x7523u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2315                                            (0x251Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2316                                            (0x7915u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2317                                            (0x493Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2318                                            (0x2ADAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2319                                            (0x3C4Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2320                                            (0x7E11u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2321                                            (0x1D2Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2322                                            (0x3A63u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2323                                            (0x0F5Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2324                                            (0x5C99u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2325                                            (0x5AE8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2326                                            (0x17A5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2327                                            (0x0BB9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2328                                            (0x07B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2329                                            (0x1F0Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2330                                            (0x6E70u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2331                                            (0x389Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2332                                            (0x631Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2333                                            (0x45CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2334                                            (0x4B9Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2335                                            (0x2877u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2336                                            (0x32ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2337                                            (0x5C56u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2338                                            (0x3E8Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2339                                            (0x6DD0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2340                                            (0x6927u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2341                                            (0x5C3Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2342                                            (0x6BC4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2343                                            (0x5D46u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2344                                            (0x6E51u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2345                                            (0x742Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2346                                            (0x536Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2347                                            (0x543Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2348                                            (0x3987u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2349                                            (0x2AF4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2350                                            (0x3A17u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2351                                            (0x62D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2352                                            (0x2B4Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2353                                            (0x60AFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2354                                            (0x19CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2355                                            (0x4CE6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2356                                            (0x5467u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2357                                            (0x52CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2358                                            (0x5C6Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2359                                            (0x561Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2360                                            (0x06FAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2361                                            (0x616Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2362                                            (0x68D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2363                                            (0x3E45u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2364                                            (0x274Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2365                                            (0x1E39u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2366                                            (0x60FAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2367                                            (0x728Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2368                                            (0x76C1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2369                                            (0x3EA8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2370                                            (0x178Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2371                                            (0x7964u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2372                                            (0x6DA1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2373                                            (0x61D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2374                                            (0x14BDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2375                                            (0x613Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2376                                            (0x58E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2377                                            (0x3AA5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2378                                            (0x712Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2379                                            (0x44CFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2380                                            (0x7171u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2381                                            (0x783Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2382                                            (0x6E85u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2383                                            (0x44BDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2384                                            (0x5DC4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2385                                            (0x76A4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2386                                            (0x6969u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2387                                            (0x328Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2388                                            (0x3372u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2389                                            (0x1E5Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2390                                            (0x68E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2391                                            (0x615Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2392                                            (0x6CB1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2393                                            (0x1BB1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2394                                            (0x13C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2395                                            (0x2F52u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2396                                            (0x24DBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2397                                            (0x7A83u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2398                                            (0x7CA4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2399                                            (0x2A8Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2400                                            (0x79A4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2401                                            (0x0F53u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2402                                            (0x58B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2403                                            (0x3C69u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2404                                            (0x03DDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2405                                            (0x648Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2406                                            (0x49B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2407                                            (0x4A3Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2408                                            (0x7B60u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2409                                            (0x67A8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2410                                            (0x25BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2411                                            (0x34CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2412                                            (0x192Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2413                                            (0x7C2Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2414                                            (0x07CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2415                                            (0x4AEAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2416                                            (0x78C3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2417                                            (0x7853u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2418                                            (0x19B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2419                                            (0x686Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2420                                            (0x34E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2421                                            (0x1CADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2422                                            (0x7913u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2423                                            (0x2DB1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2424                                            (0x32D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2425                                            (0x6AA3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2426                                            (0x554Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2427                                            (0x74A6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2428                                            (0x355Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2429                                            (0x5BC1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2430                                            (0x199Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2431                                            (0x7147u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2432                                            (0x672Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2433                                            (0x4F52u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2434                                            (0x5356u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2435                                            (0x7E44u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2436                                            (0x2567u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2437                                            (0x447Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2438                                            (0x13A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2439                                            (0x744Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2440                                            (0x057Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2441                                            (0x2357u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2442                                            (0x5393u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2443                                            (0x614Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2444                                            (0x055Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2445                                            (0x7227u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2446                                            (0x57C2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2447                                            (0x7961u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2448                                            (0x3A33u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2449                                            (0x18AFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2450                                            (0x658Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2451                                            (0x1F91u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2452                                            (0x3BD0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2453                                            (0x3F44u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2454                                            (0x4D72u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2455                                            (0x54D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2456                                            (0x2DE1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2457                                            (0x4772u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2458                                            (0x26B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2459                                            (0x36C3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2460                                            (0x1FC4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2461                                            (0x05DDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2462                                            (0x0BE3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2463                                            (0x4AF8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2464                                            (0x2B2Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2465                                            (0x07E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2466                                            (0x245Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2467                                            (0x3D25u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2468                                            (0x5EC4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2469                                            (0x69D1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2470                                            (0x174Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2471                                            (0x3563u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2472                                            (0x07EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2473                                            (0x32ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2474                                            (0x25D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2475                                            (0x35D8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2476                                            (0x3275u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2477                                            (0x3647u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2478                                            (0x6E4Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2479                                            (0x27D4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2480                                            (0x6D70u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2481                                            (0x6752u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2482                                            (0x7C52u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2483                                            (0x343Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2484                                            (0x272Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2485                                            (0x7AE0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2486                                            (0x1BA6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2487                                            (0x51D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2488                                            (0x2EAAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2489                                            (0x20FBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2490                                            (0x2E65u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2491                                            (0x4CC7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2492                                            (0x2CF8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2493                                            (0x66E2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2494                                            (0x353Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2495                                            (0x2F15u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2496                                            (0x3A96u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2497                                            (0x24F5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2498                                            (0x2A7Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2499                                            (0x4277u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2500                                            (0x58D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2501                                            (0x1DC6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2502                                            (0x4ACEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2503                                            (0x0377u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2504                                            (0x358Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2505                                            (0x4B8Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2506                                            (0x6E15u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2507                                            (0x0ECDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2508                                            (0x7C8Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2509                                            (0x4CD5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2510                                            (0x6699u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2511                                            (0x64F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2512                                            (0x75C4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2513                                            (0x665Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2514                                            (0x5A47u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2515                                            (0x51DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2516                                            (0x7A45u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2517                                            (0x6B07u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2518                                            (0x312Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2519                                            (0x338Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2520                                            (0x17C3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2521                                            (0x7A68u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2522                                            (0x44FCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2523                                            (0x532Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2524                                            (0x30DEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2525                                            (0x5798u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2526                                            (0x31CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2527                                            (0x3A72u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2528                                            (0x5DC8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2529                                            (0x5CC9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2530                                            (0x5770u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2531                                            (0x2765u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2532                                            (0x5D8Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2533                                            (0x1AE3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2534                                            (0x1B56u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2535                                            (0x5339u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2536                                            (0x7925u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2537                                            (0x5947u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2538                                            (0x6AC9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2539                                            (0x4679u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2540                                            (0x570Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2541                                            (0x66D8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2542                                            (0x18F3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2543                                            (0x652Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2544                                            (0x5758u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2545                                            (0x568Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2546                                            (0x692Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2547                                            (0x479Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2548                                            (0x1CE6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2549                                            (0x2ADCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2550                                            (0x7748u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2551                                            (0x346Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2552                                            (0x754Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2553                                            (0x720Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2554                                            (0x1AE9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2555                                            (0x14F5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2556                                            (0x5A2Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2557                                            (0x56A5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2558                                            (0x2F0Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2559                                            (0x2D1Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2560                                            (0x0EE9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2561                                            (0x11F5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2562                                            (0x28F6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2563                                            (0x22FAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2564                                            (0x3F48u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2565                                            (0x0E79u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2566                                            (0x6DC2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2567                                            (0x64D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2568                                            (0x7236u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2569                                            (0x4B3Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2570                                            (0x7316u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2571                                            (0x36CAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2572                                            (0x61F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2573                                            (0x439Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2574                                            (0x7991u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2575                                            (0x14EEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2576                                            (0x65D4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2577                                            (0x2A5Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2578                                            (0x19DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2579                                            (0x55C6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2580                                            (0x1BD8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2581                                            (0x69C9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2582                                            (0x6974u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2583                                            (0x6E89u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2584                                            (0x561Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2585                                            (0x69F0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2586                                            (0x43ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2587                                            (0x3D83u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2588                                            (0x366Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2589                                            (0x47B1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2590                                            (0x68CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2591                                            (0x7538u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2592                                            (0x6AB2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2593                                            (0x3335u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2594                                            (0x56A9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2595                                            (0x58D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2596                                            (0x74D8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2597                                            (0x0FCCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2598                                            (0x3C1Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2599                                            (0x0B9Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2600                                            (0x6E34u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2601                                            (0x4CA7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2602                                            (0x1B87u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2603                                            (0x34F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2604                                            (0x1C3Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2605                                            (0x60BDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2606                                            (0x38D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2607                                            (0x4B66u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2608                                            (0x345Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2609                                            (0x1771u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2610                                            (0x688Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2611                                            (0x3CCCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2612                                            (0x6E54u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2613                                            (0x6A99u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2614                                            (0x58A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2615                                            (0x0F47u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2616                                            (0x2CEAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2617                                            (0x24BBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2618                                            (0x2F58u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2619                                            (0x1B36u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2620                                            (0x66B4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2621                                            (0x50E7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2622                                            (0x0D97u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2623                                            (0x5655u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2624                                            (0x1F4Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2625                                            (0x1373u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2626                                            (0x590Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2627                                            (0x71A5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2628                                            (0x2B63u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2629                                            (0x784Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2630                                            (0x46D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2631                                            (0x39E1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2632                                            (0x2D65u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2633                                            (0x6A17u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2634                                            (0x33E1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2635                                            (0x342Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2636                                            (0x0A6Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2637                                            (0x2A76u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2638                                            (0x4673u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2639                                            (0x5E34u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2640                                            (0x5372u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2641                                            (0x2C3Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2642                                            (0x0EEAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2643                                            (0x5D70u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2644                                            (0x4F4Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2645                                            (0x361Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2646                                            (0x33AAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2647                                            (0x3EB0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2648                                            (0x0DCDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2649                                            (0x4E8Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2650                                            (0x2F2Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2651                                            (0x365Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2652                                            (0x5A4Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2653                                            (0x5A74u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2654                                            (0x61ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2655                                            (0x1D72u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2656                                            (0x7A26u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2657                                            (0x53B8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2658                                            (0x78F0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2659                                            (0x23E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2660                                            (0x56D2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2661                                            (0x2CDAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2662                                            (0x3A1Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2663                                            (0x159Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2664                                            (0x18FAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2665                                            (0x7C94u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2666                                            (0x25E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2667                                            (0x1BB8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2668                                            (0x25F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2669                                            (0x3C17u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2670                                            (0x2FB0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2671                                            (0x65A3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2672                                            (0x634Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2673                                            (0x0CEDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2674                                            (0x05D7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2675                                            (0x6D62u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2676                                            (0x65C3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2677                                            (0x55E8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2678                                            (0x199Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2679                                            (0x65C6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2680                                            (0x6E8Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2681                                            (0x42FCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2682                                            (0x1DE1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2683                                            (0x4C4Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2684                                            (0x40F7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2685                                            (0x7EC0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2686                                            (0x0B7Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2687                                            (0x7A91u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2688                                            (0x6D52u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2689                                            (0x4E8Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2690                                            (0x492Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2691                                            (0x3A93u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2692                                            (0x35C5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2693                                            (0x6CE1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2694                                            (0x33D8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2695                                            (0x0CF5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2696                                            (0x66CCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2697                                            (0x716Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2698                                            (0x16E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2699                                            (0x42F6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2700                                            (0x593Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2701                                            (0x3F18u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2702                                            (0x264Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2703                                            (0x1755u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2704                                            (0x6E64u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2705                                            (0x55F0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2706                                            (0x5B43u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2707                                            (0x4AE5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2708                                            (0x74E2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2709                                            (0x4763u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2710                                            (0x59A5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2711                                            (0x252Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2712                                            (0x6AACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2713                                            (0x4D96u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2714                                            (0x2C7Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2715                                            (0x4B2Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2716                                            (0x21AFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2717                                            (0x4E9Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2718                                            (0x1D95u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2719                                            (0x391Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2720                                            (0x7782u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2721                                            (0x2BC6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2722                                            (0x23EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2723                                            (0x69A6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2724                                            (0x354Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2725                                            (0x2EB8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2726                                            (0x1D55u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2727                                            (0x2DC9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2728                                            (0x652Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2729                                            (0x5C4Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2730                                            (0x6C55u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2731                                            (0x167Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2732                                            (0x2BE8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2733                                            (0x15AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2734                                            (0x6E52u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2735                                            (0x7193u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2736                                            (0x25ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2737                                            (0x4D33u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2738                                            (0x215Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2739                                            (0x613Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2740                                            (0x22DDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2741                                            (0x6665u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2742                                            (0x7195u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2743                                            (0x7A0Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2744                                            (0x7362u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2745                                            (0x6EA4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2746                                            (0x0DCEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2747                                            (0x7661u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2748                                            (0x63D8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2749                                            (0x4979u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2750                                            (0x25CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2751                                            (0x5F28u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2752                                            (0x5327u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2753                                            (0x0F72u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2754                                            (0x0A3Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2755                                            (0x0CD7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2756                                            (0x48E7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2757                                            (0x63CCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2758                                            (0x2E99u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2759                                            (0x117Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2760                                            (0x2A6Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2761                                            (0x4CEAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2762                                            (0x4BB8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2763                                            (0x1ED2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2764                                            (0x2EC9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2765                                            (0x385Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2766                                            (0x16B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2767                                            (0x32F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2768                                            (0x69CCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2769                                            (0x433Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2770                                            (0x35B2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2771                                            (0x1E87u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2772                                            (0x6E45u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2773                                            (0x61F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2774                                            (0x7525u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2775                                            (0x547Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2776                                            (0x63AAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2777                                            (0x1717u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2778                                            (0x1C76u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2779                                            (0x7F40u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2780                                            (0x3A69u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2781                                            (0x4C3Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2782                                            (0x497Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2783                                            (0x6F30u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2784                                            (0x29D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2785                                            (0x55D2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2786                                            (0x5473u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2787                                            (0x70F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2788                                            (0x2C76u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2789                                            (0x02F7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2790                                            (0x3A71u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2791                                            (0x0E3Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2792                                            (0x03F6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2793                                            (0x33B4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2794                                            (0x542Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2795                                            (0x6E29u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2796                                            (0x515Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2797                                            (0x11EBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2798                                            (0x7255u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2799                                            (0x663Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2800                                            (0x0EE5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2801                                            (0x7718u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2802                                            (0x50F3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2803                                            (0x1B93u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2804                                            (0x729Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2805                                            (0x5AB4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2806                                            (0x319Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2807                                            (0x6C36u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2808                                            (0x48BDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2809                                            (0x3693u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2810                                            (0x2A57u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2811                                            (0x5D0Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2812                                            (0x1B55u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2813                                            (0x790Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2814                                            (0x42BEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2815                                            (0x13B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2816                                            (0x2CCEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2817                                            (0x23F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2818                                            (0x7B90u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2819                                            (0x1937u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2820                                            (0x543Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2821                                            (0x5D92u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2822                                            (0x256Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2823                                            (0x6F88u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2824                                            (0x139Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2825                                            (0x5F0Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2826                                            (0x7343u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2827                                            (0x096Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2828                                            (0x4F64u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2829                                            (0x7235u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2830                                            (0x68D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2831                                            (0x7DC0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2832                                            (0x38E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2833                                            (0x3C93u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2834                                            (0x385Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2835                                            (0x38E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2836                                            (0x19EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2837                                            (0x2C75u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2838                                            (0x6CA5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2839                                            (0x7338u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2840                                            (0x2CBCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2841                                            (0x3935u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2842                                            (0x506Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2843                                            (0x5D85u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2844                                            (0x15ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2845                                            (0x53B4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2846                                            (0x731Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2847                                            (0x3559u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2848                                            (0x24F9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2849                                            (0x68E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2850                                            (0x3B38u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2851                                            (0x4BE4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2852                                            (0x299Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2853                                            (0x59E1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2854                                            (0x3B83u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2855                                            (0x2AE5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2856                                            (0x07D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2857                                            (0x52B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2858                                            (0x6635u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2859                                            (0x1F25u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2860                                            (0x7391u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2861                                            (0x37C1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2862                                            (0x06F3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2863                                            (0x19F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2864                                            (0x4EB1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2865                                            (0x1E72u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2866                                            (0x4B4Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2867                                            (0x31F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2868                                            (0x3978u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2869                                            (0x6A55u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2870                                            (0x0EECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2871                                            (0x5E92u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2872                                            (0x685Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2873                                            (0x2DA5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2874                                            (0x3DA1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2875                                            (0x439Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2876                                            (0x7570u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2877                                            (0x48CFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2878                                            (0x595Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2879                                            (0x513Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2880                                            (0x0BABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2881                                            (0x61CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2882                                            (0x60F3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2883                                            (0x50B7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2884                                            (0x1B47u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2885                                            (0x1B74u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2886                                            (0x5BB0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2887                                            (0x31F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2888                                            (0x13B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2889                                            (0x6F0Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2890                                            (0x3167u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2891                                            (0x60FCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2892                                            (0x7989u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2893                                            (0x3695u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2894                                            (0x4B3Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2895                                            (0x7A4Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2896                                            (0x5B52u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2897                                            (0x4AD5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2898                                            (0x68DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2899                                            (0x15E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2900                                            (0x572Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2901                                            (0x730Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2902                                            (0x369Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2903                                            (0x5A39u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2904                                            (0x4ECAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2905                                            (0x5DE0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2906                                            (0x7728u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2907                                            (0x6F48u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2908                                            (0x077Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2909                                            (0x69E4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2910                                            (0x2739u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2911                                            (0x19B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2912                                            (0x6497u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2913                                            (0x2C8Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2914                                            (0x1637u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2915                                            (0x316Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2916                                            (0x3F24u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2917                                            (0x0B67u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2918                                            (0x3AACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2919                                            (0x227Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2920                                            (0x15CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2921                                            (0x658Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2922                                            (0x3D16u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2923                                            (0x6E92u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2924                                            (0x2E0Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2925                                            (0x494Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2926                                            (0x2B66u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2927                                            (0x2C67u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2928                                            (0x7896u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2929                                            (0x31E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2930                                            (0x4579u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2931                                            (0x1B8Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2932                                            (0x2576u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2933                                            (0x3437u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2934                                            (0x3AE4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2935                                            (0x73A8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2936                                            (0x74AAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2937                                            (0x5C35u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2938                                            (0x0CE7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2939                                            (0x7619u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2940                                            (0x79B0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2941                                            (0x1EA5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2942                                            (0x623Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2943                                            (0x547Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2944                                            (0x12CFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2945                                            (0x4CBCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2946                                            (0x2AD5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2947                                            (0x2CD9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2948                                            (0x1DA3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2949                                            (0x691Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2950                                            (0x7A85u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2951                                            (0x4796u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2952                                            (0x66C6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2953                                            (0x4D8Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2954                                            (0x535Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2955                                            (0x3D4Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2956                                            (0x23BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2957                                            (0x6E8Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2958                                            (0x48BEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2959                                            (0x5867u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2960                                            (0x41F3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2961                                            (0x5CE8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2962                                            (0x1CE5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2963                                            (0x5CD8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2964                                            (0x3A39u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2965                                            (0x3678u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2966                                            (0x35D2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2967                                            (0x5956u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2968                                            (0x7E82u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2969                                            (0x0FAAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2970                                            (0x2ECCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2971                                            (0x63D2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2972                                            (0x5B85u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2973                                            (0x617Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2974                                            (0x7562u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2975                                            (0x2A67u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2976                                            (0x368Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2977                                            (0x79E0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2978                                            (0x4F45u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2979                                            (0x3197u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2980                                            (0x5C53u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2981                                            (0x0CBDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2982                                            (0x2E59u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2983                                            (0x527Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2984                                            (0x770Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2985                                            (0x2A5Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2986                                            (0x2BD4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2987                                            (0x2E5Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2988                                            (0x42BBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2989                                            (0x76C2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2990                                            (0x6BD0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2991                                            (0x3E54u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2992                                            (0x6F14u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2993                                            (0x6966u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2994                                            (0x2CE6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2995                                            (0x664Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2996                                            (0x62DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2997                                            (0x31A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2998                                            (0x2F19u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_2999                                            (0x6A33u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3000                                            (0x2BCAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3001                                            (0x4EC3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3002                                            (0x6AE1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3003                                            (0x2F0Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3004                                            (0x2F38u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3005                                            (0x493Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3006                                            (0x15D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3007                                            (0x1A7Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3008                                            (0x3DA8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3009                                            (0x5EC8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3010                                            (0x12E7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3011                                            (0x7629u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3012                                            (0x62B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3013                                            (0x6669u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3014                                            (0x7D0Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3015                                            (0x187Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3016                                            (0x4BE8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3017                                            (0x3399u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3018                                            (0x332Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3019                                            (0x0B9Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3020                                            (0x68F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3021                                            (0x70CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3022                                            (0x69A5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3023                                            (0x4AD9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3024                                            (0x2CE9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3025                                            (0x4367u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3026                                            (0x28F5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3027                                            (0x3AE8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3028                                            (0x19C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3029                                            (0x0DD3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3030                                            (0x1787u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3031                                            (0x3BC2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3032                                            (0x1DE2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3033                                            (0x6599u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3034                                            (0x7079u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3035                                            (0x4DAAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3036                                            (0x5317u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3037                                            (0x4F2Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3038                                            (0x7D09u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3039                                            (0x18F6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3040                                            (0x17A9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3041                                            (0x706Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3042                                            (0x02DFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3043                                            (0x3666u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3044                                            (0x64DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3045                                            (0x5635u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3046                                            (0x03DEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3047                                            (0x1DE4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3048                                            (0x7CC1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3049                                            (0x48DBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3050                                            (0x6CB2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3051                                            (0x68CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3052                                            (0x2979u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3053                                            (0x52F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3054                                            (0x26C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3055                                            (0x2BD2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3056                                            (0x5347u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3057                                            (0x372Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3058                                            (0x41EBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3059                                            (0x0E9Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3060                                            (0x0B5Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3061                                            (0x07E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3062                                            (0x1B96u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3063                                            (0x5A78u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3064                                            (0x09EEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3065                                            (0x45ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3066                                            (0x37A2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3067                                            (0x0FD2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3068                                            (0x45BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3069                                            (0x15F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3070                                            (0x515Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3071                                            (0x7272u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3072                                            (0x388Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3073                                            (0x1F2Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3074                                            (0x287Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3075                                            (0x7A0Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3076                                            (0x72CAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3077                                            (0x1E2Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3078                                            (0x25D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3079                                            (0x2D56u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3080                                            (0x478Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3081                                            (0x1BAAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3082                                            (0x79C8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3083                                            (0x6A0Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3084                                            (0x6A8Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3085                                            (0x0BCEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3086                                            (0x67B0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3087                                            (0x2D17u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3088                                            (0x394Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3089                                            (0x70ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3090                                            (0x26ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3091                                            (0x1BACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3092                                            (0x49D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3093                                            (0x4CCEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3094                                            (0x5875u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3095                                            (0x7037u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3096                                            (0x543Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3097                                            (0x714Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3098                                            (0x7293u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3099                                            (0x6B34u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3100                                            (0x7781u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3101                                            (0x4BB1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3102                                            (0x4D47u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3103                                            (0x71C5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3104                                            (0x1C79u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3105                                            (0x1477u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3106                                            (0x661Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3107                                            (0x26AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3108                                            (0x0ED6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3109                                            (0x68B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3110                                            (0x374Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3111                                            (0x5267u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3112                                            (0x636Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3113                                            (0x69C6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3114                                            (0x7668u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3115                                            (0x417Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3116                                            (0x4E96u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3117                                            (0x147Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3118                                            (0x378Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3119                                            (0x14BBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3120                                            (0x17E4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3121                                            (0x483Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3122                                            (0x63E4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3123                                            (0x78D4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3124                                            (0x7133u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3125                                            (0x0B8Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3126                                            (0x7D41u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3127                                            (0x1D69u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3128                                            (0x6AE2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3129                                            (0x4676u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3130                                            (0x698Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3131                                            (0x790Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3132                                            (0x7169u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3133                                            (0x4573u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3134                                            (0x6457u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3135                                            (0x27B1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3136                                            (0x09BBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3137                                            (0x3A78u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3138                                            (0x1D17u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3139                                            (0x15C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3140                                            (0x1CECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3141                                            (0x6CCAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3142                                            (0x656Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3143                                            (0x5E51u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3144                                            (0x2D4Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3145                                            (0x3457u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3146                                            (0x2975u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3147                                            (0x05FCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3148                                            (0x5D26u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3149                                            (0x7385u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3150                                            (0x51E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3151                                            (0x2679u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3152                                            (0x2E3Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3153                                            (0x35B8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3154                                            (0x3F0Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3155                                            (0x095Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3156                                            (0x587Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3157                                            (0x7C70u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3158                                            (0x463Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3159                                            (0x696Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3160                                            (0x3A74u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3161                                            (0x03EEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3162                                            (0x47A6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3163                                            (0x61D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3164                                            (0x267Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3165                                            (0x791Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3166                                            (0x79A8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3167                                            (0x7664u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3168                                            (0x6369u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3169                                            (0x36D4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3170                                            (0x6955u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3171                                            (0x7705u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3172                                            (0x36CCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3173                                            (0x07B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3174                                            (0x711Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3175                                            (0x5F09u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3176                                            (0x565Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3177                                            (0x71E2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3178                                            (0x07BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3179                                            (0x6F03u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3180                                            (0x741Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3181                                            (0x5A55u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3182                                            (0x16D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3183                                            (0x326Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3184                                            (0x7AA4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3185                                            (0x1CD6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3186                                            (0x453Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3187                                            (0x05CFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3188                                            (0x097Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3189                                            (0x6639u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3190                                            (0x4A8Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3191                                            (0x2D55u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3192                                            (0x511Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3193                                            (0x175Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3194                                            (0x5EA1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3195                                            (0x1F45u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3196                                            (0x436Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3197                                            (0x66D1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3198                                            (0x563Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3199                                            (0x0DD9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3200                                            (0x4D93u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3201                                            (0x5719u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3202                                            (0x3AE2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3203                                            (0x1E3Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3204                                            (0x335Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3205                                            (0x2BC9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3206                                            (0x3E70u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3207                                            (0x0F66u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3208                                            (0x55CAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3209                                            (0x70BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3210                                            (0x45DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3211                                            (0x2DB2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3212                                            (0x338Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3213                                            (0x34A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3214                                            (0x06EDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3215                                            (0x6D32u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3216                                            (0x7C13u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3217                                            (0x634Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3218                                            (0x0BE6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3219                                            (0x4D5Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3220                                            (0x4F94u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3221                                            (0x716Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3222                                            (0x3971u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3223                                            (0x705Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3224                                            (0x5D61u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3225                                            (0x7872u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3226                                            (0x723Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3227                                            (0x394Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3228                                            (0x3363u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3229                                            (0x6396u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3230                                            (0x34EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3231                                            (0x0D75u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3232                                            (0x6723u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3233                                            (0x325Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3234                                            (0x58ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3235                                            (0x5D89u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3236                                            (0x296Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3237                                            (0x0DDCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3238                                            (0x1F58u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3239                                            (0x7B06u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3240                                            (0x74C5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3241                                            (0x0A77u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3242                                            (0x7B22u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3243                                            (0x352Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3244                                            (0x3A4Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3245                                            (0x1EB4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3246                                            (0x6C66u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3247                                            (0x545Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3248                                            (0x54F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3249                                            (0x585Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3250                                            (0x5C2Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3251                                            (0x2CECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3252                                            (0x7847u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3253                                            (0x036Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3254                                            (0x7698u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3255                                            (0x72C9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3256                                            (0x1FC2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3257                                            (0x4A73u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3258                                            (0x7499u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3259                                            (0x78C5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3260                                            (0x03EBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3261                                            (0x4C1Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3262                                            (0x31C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3263                                            (0x5A63u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3264                                            (0x5C3Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3265                                            (0x63E1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3266                                            (0x7389u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3267                                            (0x5695u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3268                                            (0x6AF0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3269                                            (0x23C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3270                                            (0x607Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3271                                            (0x66CAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3272                                            (0x631Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3273                                            (0x057Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3274                                            (0x568Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3275                                            (0x2E33u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3276                                            (0x3179u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3277                                            (0x5A99u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3278                                            (0x7592u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3279                                            (0x6372u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3280                                            (0x794Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3281                                            (0x0F69u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3282                                            (0x5C72u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3283                                            (0x4A3Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3284                                            (0x49F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3285                                            (0x7253u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3286                                            (0x507Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3287                                            (0x615Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3288                                            (0x4CABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3289                                            (0x5D98u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3290                                            (0x1756u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3291                                            (0x53CAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3292                                            (0x4EAAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3293                                            (0x7383u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3294                                            (0x0D9Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3295                                            (0x139Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3296                                            (0x5E07u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3297                                            (0x0F56u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3298                                            (0x34F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3299                                            (0x7B11u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3300                                            (0x3875u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3301                                            (0x0DE6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3302                                            (0x04FDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3303                                            (0x43B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3304                                            (0x3857u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3305                                            (0x1ECAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3306                                            (0x18DDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3307                                            (0x1A1Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3308                                            (0x13DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3309                                            (0x4FB0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3310                                            (0x6B43u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3311                                            (0x54B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3312                                            (0x5AB2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3313                                            (0x3783u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3314                                            (0x4E3Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3315                                            (0x3959u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3316                                            (0x0AF9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3317                                            (0x463Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3318                                            (0x7546u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3319                                            (0x4E27u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3320                                            (0x730Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3321                                            (0x4B1Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3322                                            (0x1753u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3323                                            (0x1F26u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3324                                            (0x343Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3325                                            (0x7B21u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3326                                            (0x43ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3327                                            (0x4EA5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3328                                            (0x38F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3329                                            (0x1F70u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3330                                            (0x0757u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3331                                            (0x4D3Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3332                                            (0x279Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3333                                            (0x74B1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3334                                            (0x1F98u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3335                                            (0x1673u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3336                                            (0x313Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3337                                            (0x2D53u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3338                                            (0x0BBAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3339                                            (0x0B7Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3340                                            (0x59D1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3341                                            (0x69D4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3342                                            (0x02FDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3343                                            (0x5663u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3344                                            (0x0B76u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3345                                            (0x165Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3346                                            (0x7F20u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3347                                            (0x647Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3348                                            (0x4756u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3349                                            (0x71B2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3350                                            (0x7A8Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3351                                            (0x2763u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3352                                            (0x2FA2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3353                                            (0x353Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3354                                            (0x4BCAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3355                                            (0x17E2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3356                                            (0x3669u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3357                                            (0x067Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3358                                            (0x27CAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3359                                            (0x651Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3360                                            (0x0EF4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3361                                            (0x0BADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3362                                            (0x38A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3363                                            (0x7A2Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3364                                            (0x6D4Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3365                                            (0x49BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3366                                            (0x7334u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3367                                            (0x64ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3368                                            (0x709Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3369                                            (0x59C6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3370                                            (0x768Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3371                                            (0x645Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3372                                            (0x31BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3373                                            (0x4778u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3374                                            (0x1AF2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3375                                            (0x14AFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3376                                            (0x4BF0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3377                                            (0x3671u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3378                                            (0x0D3Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3379                                            (0x3B2Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3380                                            (0x7EA0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3381                                            (0x5978u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3382                                            (0x7E88u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3383                                            (0x3C2Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3384                                            (0x2DD1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3385                                            (0x361Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3386                                            (0x18BDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3387                                            (0x429Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3388                                            (0x3C35u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3389                                            (0x239Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3390                                            (0x6D8Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3391                                            (0x1EA6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3392                                            (0x23F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3393                                            (0x1F38u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3394                                            (0x5C69u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3395                                            (0x28FCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3396                                            (0x4F07u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3397                                            (0x7A16u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3398                                            (0x535Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3399                                            (0x0FA9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3400                                            (0x45DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3401                                            (0x5B29u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3402                                            (0x0C7Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3403                                            (0x4F31u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3404                                            (0x4736u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3405                                            (0x1EC6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3406                                            (0x6B4Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3407                                            (0x68A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3408                                            (0x798Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3409                                            (0x319Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3410                                            (0x25E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3411                                            (0x62B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3412                                            (0x237Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3413                                            (0x19A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3414                                            (0x13E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3415                                            (0x2EA6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3416                                            (0x2F54u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3417                                            (0x329Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3418                                            (0x69A9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3419                                            (0x26F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3420                                            (0x443Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3421                                            (0x5569u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3422                                            (0x4C79u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3423                                            (0x2E3Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3424                                            (0x46BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3425                                            (0x263Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3426                                            (0x6527u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3427                                            (0x6B61u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3428                                            (0x3297u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3429                                            (0x62D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3430                                            (0x3996u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3431                                            (0x138Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3432                                            (0x0D73u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3433                                            (0x794Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3434                                            (0x69A3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3435                                            (0x39AAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3436                                            (0x2D96u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3437                                            (0x4337u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3438                                            (0x78C9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3439                                            (0x5D54u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3440                                            (0x459Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3441                                            (0x2D27u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3442                                            (0x5E0Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3443                                            (0x1C57u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3444                                            (0x6C4Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3445                                            (0x32B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3446                                            (0x2676u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3447                                            (0x6999u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3448                                            (0x348Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3449                                            (0x5A71u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3450                                            (0x516Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3451                                            (0x6395u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3452                                            (0x293Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3453                                            (0x26ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3454                                            (0x7A92u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3455                                            (0x259Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3456                                            (0x1675u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3457                                            (0x7516u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3458                                            (0x229Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3459                                            (0x4EE4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3460                                            (0x332Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3461                                            (0x3371u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3462                                            (0x5F03u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3463                                            (0x4A7Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3464                                            (0x0CEBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3465                                            (0x4CF8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3466                                            (0x788Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3467                                            (0x44AFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3468                                            (0x03DBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3469                                            (0x5D19u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3470                                            (0x3939u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3471                                            (0x551Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3472                                            (0x41DEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3473                                            (0x493Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3474                                            (0x7839u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3475                                            (0x5F88u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3476                                            (0x56ACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3477                                            (0x2F4Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3478                                            (0x3A5Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3479                                            (0x649Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3480                                            (0x6B49u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3481                                            (0x5A96u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3482                                            (0x1D1Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3483                                            (0x3CB4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3484                                            (0x4AC7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3485                                            (0x46F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3486                                            (0x4F70u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3487                                            (0x30F5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3488                                            (0x11DDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3489                                            (0x692Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3490                                            (0x147Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3491                                            (0x2E6Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3492                                            (0x3CC6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3493                                            (0x56B1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3494                                            (0x34AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3495                                            (0x4DD1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3496                                            (0x33F0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3497                                            (0x3E23u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3498                                            (0x3F42u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3499                                            (0x6791u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3500                                            (0x2DE4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3501                                            (0x663Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3502                                            (0x54ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3503                                            (0x3CACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3504                                            (0x3716u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3505                                            (0x2E1Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3506                                            (0x7C45u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3507                                            (0x707Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3508                                            (0x71A9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3509                                            (0x57A8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3510                                            (0x073Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3511                                            (0x705Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3512                                            (0x6D0Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3513                                            (0x65E1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3514                                            (0x74D1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3515                                            (0x6D07u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3516                                            (0x661Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3517                                            (0x74B4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3518                                            (0x0EB6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3519                                            (0x16F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3520                                            (0x5E58u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3521                                            (0x3732u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3522                                            (0x5A35u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3523                                            (0x2477u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3524                                            (0x30CFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3525                                            (0x3EC1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3526                                            (0x0DF4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3527                                            (0x71D8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3528                                            (0x178Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3529                                            (0x22B7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3530                                            (0x35D4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3531                                            (0x37A1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3532                                            (0x5707u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3533                                            (0x702Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3534                                            (0x6B45u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3535                                            (0x4B6Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3536                                            (0x17C6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3537                                            (0x2B96u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3538                                            (0x6743u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3539                                            (0x6D98u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3540                                            (0x7C83u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3541                                            (0x71D4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3542                                            (0x15DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3543                                            (0x3633u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3544                                            (0x64BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3545                                            (0x55A6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3546                                            (0x1B0Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3547                                            (0x4E95u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3548                                            (0x368Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3549                                            (0x5355u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3550                                            (0x5C95u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3551                                            (0x0ED5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3552                                            (0x472Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3553                                            (0x6D4Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3554                                            (0x6653u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3555                                            (0x32B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3556                                            (0x467Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3557                                            (0x2F26u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3558                                            (0x3A9Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3559                                            (0x470Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3560                                            (0x554Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3561                                            (0x6D0Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3562                                            (0x0BEAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3563                                            (0x64AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3564                                            (0x4ACBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3565                                            (0x1676u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3566                                            (0x6993u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3567                                            (0x2CF1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3568                                            (0x170Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3569                                            (0x72CCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3570                                            (0x595Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3571                                            (0x4B17u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3572                                            (0x2BAAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3573                                            (0x2D5Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3574                                            (0x785Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3575                                            (0x13DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3576                                            (0x3D0Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3577                                            (0x6CC6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3578                                            (0x66AAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3579                                            (0x4CECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3580                                            (0x16D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3581                                            (0x6467u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3582                                            (0x15CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3583                                            (0x5A65u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3584                                            (0x43AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3585                                            (0x3798u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3586                                            (0x60F5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3587                                            (0x455Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3588                                            (0x4F38u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3589                                            (0x64A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3590                                            (0x7616u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3591                                            (0x2F89u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3592                                            (0x4E4Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3593                                            (0x15F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3594                                            (0x36C6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3595                                            (0x6355u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3596                                            (0x544Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3597                                            (0x7D22u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3598                                            (0x39A5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3599                                            (0x5A8Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3600                                            (0x2D87u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3601                                            (0x465Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3602                                            (0x761Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3603                                            (0x65F0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3604                                            (0x093Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3605                                            (0x50DEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3606                                            (0x2F29u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3607                                            (0x05BBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3608                                            (0x7722u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3609                                            (0x709Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3610                                            (0x4E59u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3611                                            (0x2B8Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3612                                            (0x1F15u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3613                                            (0x5DB0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3614                                            (0x6770u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3615                                            (0x2F92u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3616                                            (0x44BBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3617                                            (0x6B31u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3618                                            (0x1967u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3619                                            (0x626Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3620                                            (0x3E49u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3621                                            (0x62DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3622                                            (0x76B0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3623                                            (0x40BFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3624                                            (0x625Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3625                                            (0x63E8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3626                                            (0x6FA0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3627                                            (0x1973u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3628                                            (0x6875u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3629                                            (0x56C9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3630                                            (0x3DA4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3631                                            (0x51E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3632                                            (0x5AC9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3633                                            (0x4373u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3634                                            (0x12DBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3635                                            (0x721Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3636                                            (0x067Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3637                                            (0x166Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3638                                            (0x41F5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3639                                            (0x247Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3640                                            (0x0AB7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3641                                            (0x4E6Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3642                                            (0x2573u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3643                                            (0x3393u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3644                                            (0x07AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3645                                            (0x6595u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3646                                            (0x5565u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3647                                            (0x1EE8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3648                                            (0x3DC2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3649                                            (0x74A3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3650                                            (0x3CB2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3651                                            (0x6978u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3652                                            (0x07CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3653                                            (0x47B8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3654                                            (0x3D61u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3655                                            (0x1F0Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3656                                            (0x626Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3657                                            (0x54A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3658                                            (0x685Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3659                                            (0x572Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3660                                            (0x358Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3661                                            (0x4BD2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3662                                            (0x31D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3663                                            (0x56E8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3664                                            (0x6EC2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3665                                            (0x38F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3666                                            (0x7C34u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3667                                            (0x664Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3668                                            (0x1CABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3669                                            (0x6565u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3670                                            (0x0A7Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3671                                            (0x7199u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3672                                            (0x19B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3673                                            (0x48EDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3674                                            (0x07DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3675                                            (0x08F7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3676                                            (0x6B98u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3677                                            (0x329Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3678                                            (0x74D2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3679                                            (0x71E8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3680                                            (0x0F65u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3681                                            (0x5E83u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3682                                            (0x2D35u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3683                                            (0x3336u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3684                                            (0x38DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3685                                            (0x58DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3686                                            (0x7B0Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3687                                            (0x4CB3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3688                                            (0x61B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3689                                            (0x4E2Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3690                                            (0x26BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3691                                            (0x55B2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3692                                            (0x3867u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3693                                            (0x47CCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3694                                            (0x7C0Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3695                                            (0x61ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3696                                            (0x163Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3697                                            (0x0D5Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3698                                            (0x16E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3699                                            (0x10DFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3700                                            (0x5F90u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3701                                            (0x58CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3702                                            (0x35C6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3703                                            (0x072Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3704                                            (0x687Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3705                                            (0x1CB3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3706                                            (0x4E66u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3707                                            (0x19F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3708                                            (0x4AB5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3709                                            (0x55C5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3710                                            (0x589Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3711                                            (0x5363u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3712                                            (0x4D3Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3713                                            (0x169Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3714                                            (0x197Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3715                                            (0x6C39u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3716                                            (0x6F11u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3717                                            (0x1BD1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3718                                            (0x2B0Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3719                                            (0x1F92u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3720                                            (0x44DEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3721                                            (0x7692u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3722                                            (0x7E48u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3723                                            (0x4B63u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3724                                            (0x52F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3725                                            (0x6D68u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3726                                            (0x2FE0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3727                                            (0x2657u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3728                                            (0x5A6Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3729                                            (0x71C9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3730                                            (0x4B1Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3731                                            (0x27A3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3732                                            (0x6AE8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3733                                            (0x51ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3734                                            (0x21DBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3735                                            (0x1E9Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3736                                            (0x7417u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3737                                            (0x35A6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3738                                            (0x2ACEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3739                                            (0x3F05u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3740                                            (0x6C47u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3741                                            (0x2E2Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3742                                            (0x12DDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3743                                            (0x1765u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3744                                            (0x2B99u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3745                                            (0x24F3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3746                                            (0x1AF4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3747                                            (0x4A9Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3748                                            (0x0F4Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3749                                            (0x562Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3750                                            (0x7E05u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3751                                            (0x6713u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3752                                            (0x1B17u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3753                                            (0x32B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3754                                            (0x6695u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3755                                            (0x59CCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3756                                            (0x7127u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3757                                            (0x0CFAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3758                                            (0x7513u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3759                                            (0x71E1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3760                                            (0x78ACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3761                                            (0x5475u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3762                                            (0x59C9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3763                                            (0x585Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3764                                            (0x32BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3765                                            (0x75C2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3766                                            (0x167Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3767                                            (0x5E32u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3768                                            (0x5993u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3769                                            (0x233Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3770                                            (0x4BACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3771                                            (0x3C63u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3772                                            (0x4877u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3773                                            (0x3B23u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3774                                            (0x1A8Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3775                                            (0x213Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3776                                            (0x7589u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3777                                            (0x5B32u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3778                                            (0x1BC3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3779                                            (0x6AC3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3780                                            (0x438Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3781                                            (0x61E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3782                                            (0x70EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3783                                            (0x30EEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3784                                            (0x5AD1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3785                                            (0x0ECEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3786                                            (0x5FC0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3787                                            (0x273Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3788                                            (0x1E27u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3789                                            (0x5CACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3790                                            (0x3ED0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3791                                            (0x6C72u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3792                                            (0x7F04u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3793                                            (0x70BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3794                                            (0x19F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3795                                            (0x6D31u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3796                                            (0x7156u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3797                                            (0x7712u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3798                                            (0x12B7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3799                                            (0x598Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3800                                            (0x689Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3801                                            (0x5DA8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3802                                            (0x5556u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3803                                            (0x172Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3804                                            (0x7352u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3805                                            (0x71B4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3806                                            (0x26E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3807                                            (0x17A3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3808                                            (0x0CBBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3809                                            (0x669Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3810                                            (0x5F50u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3811                                            (0x687Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3812                                            (0x2A73u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3813                                            (0x3C53u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3814                                            (0x360Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3815                                            (0x594Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3816                                            (0x7392u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3817                                            (0x4B8Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3818                                            (0x38CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3819                                            (0x7835u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3820                                            (0x33C3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3821                                            (0x598Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3822                                            (0x2D69u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3823                                            (0x2DD2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3824                                            (0x7E21u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3825                                            (0x71B1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3826                                            (0x4739u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3827                                            (0x3C39u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3828                                            (0x5593u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3829                                            (0x42F3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3830                                            (0x4E3Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3831                                            (0x0F39u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3832                                            (0x7742u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3833                                            (0x3E98u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3834                                            (0x0F3Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3835                                            (0x384Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3836                                            (0x5D29u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3837                                            (0x4CE3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3838                                            (0x6C8Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3839                                            (0x6387u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3840                                            (0x674Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3841                                            (0x586Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3842                                            (0x693Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3843                                            (0x63C3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3844                                            (0x54ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3845                                            (0x1AABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3846                                            (0x333Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3847                                            (0x7BA0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3848                                            (0x41BBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3849                                            (0x4B35u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3850                                            (0x09F9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3851                                            (0x50AFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3852                                            (0x329Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3853                                            (0x2A7Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3854                                            (0x7E0Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3855                                            (0x05DBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3856                                            (0x59F0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3857                                            (0x72ACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3858                                            (0x3B85u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3859                                            (0x2B5Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3860                                            (0x4FD0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3861                                            (0x249Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3862                                            (0x13E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3863                                            (0x68E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3864                                            (0x62E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3865                                            (0x2774u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3866                                            (0x28FAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3867                                            (0x5D51u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3868                                            (0x60DBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3869                                            (0x1DA5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3870                                            (0x6553u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3871                                            (0x5A59u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3872                                            (0x71D1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3873                                            (0x6ACCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3874                                            (0x40FDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3875                                            (0x59E2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3876                                            (0x50CFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3877                                            (0x770Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3878                                            (0x4F61u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3879                                            (0x4B69u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3880                                            (0x534Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3881                                            (0x0EF2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3882                                            (0x45CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3883                                            (0x2733u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3884                                            (0x5157u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3885                                            (0x29C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3886                                            (0x09B7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3887                                            (0x6B68u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3888                                            (0x45E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3889                                            (0x2DC6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3890                                            (0x6A6Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3891                                            (0x23D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3892                                            (0x4177u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3893                                            (0x54AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3894                                            (0x56D8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3895                                            (0x73A2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3896                                            (0x27CCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3897                                            (0x5B91u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3898                                            (0x2F1Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3899                                            (0x3F12u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3900                                            (0x0E5Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3901                                            (0x271Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3902                                            (0x671Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3903                                            (0x4BE2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3904                                            (0x4976u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3905                                            (0x5A1Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3906                                            (0x3F30u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3907                                            (0x725Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3908                                            (0x12D7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3909                                            (0x29E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3910                                            (0x3749u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3911                                            (0x49D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3912                                            (0x466Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3913                                            (0x254Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3914                                            (0x2A1Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3915                                            (0x3786u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3916                                            (0x7A62u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3917                                            (0x79A1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3918                                            (0x7A1Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3919                                            (0x7D12u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3920                                            (0x3E61u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3921                                            (0x4F2Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3922                                            (0x2E63u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3923                                            (0x3C87u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3924                                            (0x09CFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3925                                            (0x68C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3926                                            (0x5715u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3927                                            (0x67A1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3928                                            (0x2EACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3929                                            (0x79C1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3930                                            (0x3267u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3931                                            (0x4B36u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3932                                            (0x5571u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3933                                            (0x16B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3934                                            (0x077Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3935                                            (0x14FAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3936                                            (0x1D1Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3937                                            (0x5179u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3938                                            (0x5AAAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3939                                            (0x4B99u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3940                                            (0x1ABCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3941                                            (0x0E5Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3942                                            (0x64D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3943                                            (0x28B7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3944                                            (0x5C8Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3945                                            (0x4F0Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3946                                            (0x7266u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3947                                            (0x5527u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3948                                            (0x1E65u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3949                                            (0x626Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3950                                            (0x1CCDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3951                                            (0x51BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3952                                            (0x11DBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3953                                            (0x6176u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3954                                            (0x35A5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3955                                            (0x5DD0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3956                                            (0x2747u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3957                                            (0x7583u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3958                                            (0x3746u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3959                                            (0x2575u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3960                                            (0x33E4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3961                                            (0x1E36u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3962                                            (0x2F8Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3963                                            (0x3CE8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3964                                            (0x22EEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3965                                            (0x2E35u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3966                                            (0x4AABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3967                                            (0x4D2Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3968                                            (0x07BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3969                                            (0x758Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3970                                            (0x631Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3971                                            (0x3599u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3972                                            (0x7551u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3973                                            (0x6768u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3974                                            (0x4BB4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3975                                            (0x7B09u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3976                                            (0x74ACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3977                                            (0x26B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3978                                            (0x72B1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3979                                            (0x7B81u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3980                                            (0x56B4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3981                                            (0x2E56u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3982                                            (0x474Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3983                                            (0x445Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3984                                            (0x43DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3985                                            (0x7519u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3986                                            (0x1D63u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3987                                            (0x2BE4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3988                                            (0x265Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3989                                            (0x4CF2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3990                                            (0x5D07u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3991                                            (0x0FC6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3992                                            (0x5999u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3993                                            (0x27F0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3994                                            (0x6C69u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3995                                            (0x1A37u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3996                                            (0x627Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3997                                            (0x6687u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3998                                            (0x24BDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_3999                                            (0x5D38u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4000                                            (0x0FACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4001                                            (0x3754u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4002                                            (0x7351u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4003                                            (0x0BD9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4004                                            (0x7919u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4005                                            (0x28BBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4006                                            (0x3B15u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4007                                            (0x34B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4008                                            (0x3B62u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4009                                            (0x2EA9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4010                                            (0x7694u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4011                                            (0x54E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4012                                            (0x6D61u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4013                                            (0x5399u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4014                                            (0x718Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4015                                            (0x3B64u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4016                                            (0x6333u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4017                                            (0x1D47u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4018                                            (0x31D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4019                                            (0x5539u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4020                                            (0x68ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4021                                            (0x4E5Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4022                                            (0x3BC1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4023                                            (0x0EC7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4024                                            (0x74E1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4025                                            (0x193Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4026                                            (0x7332u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4027                                            (0x287Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4028                                            (0x13D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4029                                            (0x43D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4030                                            (0x38EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4031                                            (0x3F22u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4032                                            (0x6EC1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4033                                            (0x45A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4034                                            (0x7B18u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4035                                            (0x5E31u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4036                                            (0x73C1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4037                                            (0x74E8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4038                                            (0x6C9Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4039                                            (0x6ED0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4040                                            (0x1CAEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4041                                            (0x389Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4042                                            (0x5751u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4043                                            (0x36C9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4044                                            (0x45C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4045                                            (0x36A3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4046                                            (0x1575u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4047                                            (0x7836u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4048                                            (0x42F9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4049                                            (0x3A6Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4050                                            (0x3347u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4051                                            (0x2B4Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4052                                            (0x27C9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4053                                            (0x15EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4054                                            (0x48F6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4055                                            (0x6A95u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4056                                            (0x3B1Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4057                                            (0x4B6Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4058                                            (0x29A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4059                                            (0x0EE3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4060                                            (0x4B56u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4061                                            (0x5E15u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4062                                            (0x22EDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4063                                            (0x43C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4064                                            (0x1F1Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4065                                            (0x71E4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4066                                            (0x28EBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4067                                            (0x36E1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4068                                            (0x247Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4069                                            (0x4F26u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4070                                            (0x7D82u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4071                                            (0x6674u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4072                                            (0x04FBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4073                                            (0x531Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4074                                            (0x5761u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4075                                            (0x49D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4076                                            (0x7B50u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4077                                            (0x5732u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4078                                            (0x2675u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4079                                            (0x7478u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4080                                            (0x3CA5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4081                                            (0x4B5Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4082                                            (0x4C57u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4083                                            (0x6BE0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4084                                            (0x2C79u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4085                                            (0x1B66u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4086                                            (0x74B2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4087                                            (0x6E23u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4088                                            (0x6C2Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4089                                            (0x03D7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4090                                            (0x5A33u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4091                                            (0x3EC2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4092                                            (0x55D1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4093                                            (0x719Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4094                                            (0x639Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4095                                            (0x7349u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4096                                            (0x4B27u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4097                                            (0x1CD9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4098                                            (0x584Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4099                                            (0x33D2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4100                                            (0x2FC2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4101                                            (0x545Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4102                                            (0x7CA1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4103                                            (0x3D2Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4104                                            (0x1CEAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4105                                            (0x4DA9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4106                                            (0x65CCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4107                                            (0x4ECCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4108                                            (0x4B95u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4109                                            (0x7817u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4110                                            (0x6D83u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4111                                            (0x6A1Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4112                                            (0x29B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4113                                            (0x6DB0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4114                                            (0x135Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4115                                            (0x3791u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4116                                            (0x16ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4117                                            (0x1DD1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4118                                            (0x5792u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4119                                            (0x4F91u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4120                                            (0x4FC1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4121                                            (0x471Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4122                                            (0x1763u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4123                                            (0x6C78u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4124                                            (0x6B94u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4125                                            (0x133Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4126                                            (0x581Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4127                                            (0x5F60u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4128                                            (0x7E42u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4129                                            (0x6F84u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4130                                            (0x1BA5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4131                                            (0x62BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4132                                            (0x26D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4133                                            (0x751Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4134                                            (0x34ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4135                                            (0x0776u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4136                                            (0x2B95u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4137                                            (0x7855u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4138                                            (0x60D7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4139                                            (0x13E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4140                                            (0x5971u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4141                                            (0x45E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4142                                            (0x447Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4143                                            (0x4A57u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4144                                            (0x23ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4145                                            (0x3B68u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4146                                            (0x3595u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4147                                            (0x06AFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4148                                            (0x65C5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4149                                            (0x31ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4150                                            (0x1F46u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4151                                            (0x750Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4152                                            (0x323Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4153                                            (0x62ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4154                                            (0x6378u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4155                                            (0x5F21u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4156                                            (0x24EBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4157                                            (0x26B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4158                                            (0x2CDCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4159                                            (0x7A34u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4160                                            (0x355Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4161                                            (0x1ADAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4162                                            (0x5666u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4163                                            (0x5CE1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4164                                            (0x21DDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4165                                            (0x3D98u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4166                                            (0x19D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4167                                            (0x64E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4168                                            (0x6A53u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4169                                            (0x145Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4170                                            (0x23A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4171                                            (0x3725u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4172                                            (0x782Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4173                                            (0x6539u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4174                                            (0x2B72u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4175                                            (0x54F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4176                                            (0x462Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4177                                            (0x63A6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4178                                            (0x6617u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4179                                            (0x16E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4180                                            (0x6B23u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4181                                            (0x3933u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4182                                            (0x52B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4183                                            (0x3A3Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4184                                            (0x5B4Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4185                                            (0x636Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4186                                            (0x706Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4187                                            (0x0F1Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4188                                            (0x0EB5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4189                                            (0x46B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4190                                            (0x5837u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4191                                            (0x0AE7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4192                                            (0x7689u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4193                                            (0x3993u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4194                                            (0x68B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4195                                            (0x4A4Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4196                                            (0x3789u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4197                                            (0x2E55u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4198                                            (0x5678u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4199                                            (0x7532u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4200                                            (0x4F85u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4201                                            (0x6BA8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4202                                            (0x61F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4203                                            (0x0ADEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4204                                            (0x678Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4205                                            (0x2F25u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4206                                            (0x13F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4207                                            (0x4D78u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4208                                            (0x67C1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4209                                            (0x1AD3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4210                                            (0x647Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4211                                            (0x3B52u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4212                                            (0x43B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4213                                            (0x4D36u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4214                                            (0x611Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4215                                            (0x6D34u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4216                                            (0x7296u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4217                                            (0x1A5Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4218                                            (0x7C51u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4219                                            (0x3F82u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4220                                            (0x0DF1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4221                                            (0x760Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4222                                            (0x07D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4223                                            (0x1F85u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4224                                            (0x568Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4225                                            (0x6197u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4226                                            (0x499Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4227                                            (0x6B51u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4228                                            (0x2637u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4229                                            (0x12FAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4230                                            (0x49AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4231                                            (0x1D0Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4232                                            (0x3AA9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4233                                            (0x0FC5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4234                                            (0x2D93u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4235                                            (0x5E13u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4236                                            (0x331Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4237                                            (0x73A1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4238                                            (0x3E2Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4239                                            (0x5A53u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4240                                            (0x6746u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4241                                            (0x371Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4242                                            (0x70D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4243                                            (0x51F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4244                                            (0x4774u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4245                                            (0x4C9Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4246                                            (0x3665u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4247                                            (0x531Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4248                                            (0x473Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4249                                            (0x1C6Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4250                                            (0x16A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4251                                            (0x44DBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4252                                            (0x1E6Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4253                                            (0x3175u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4254                                            (0x5743u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4255                                            (0x6B1Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4256                                            (0x55C3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4257                                            (0x2A3Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4258                                            (0x5729u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4259                                            (0x336Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4260                                            (0x4E87u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4261                                            (0x4CBAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4262                                            (0x1D66u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4263                                            (0x33A3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4264                                            (0x17B2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4265                                            (0x6B91u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4266                                            (0x43EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4267                                            (0x61F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4268                                            (0x0ABDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4269                                            (0x5647u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4270                                            (0x4B78u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4271                                            (0x02FBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4272                                            (0x53C5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4273                                            (0x68D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4274                                            (0x742Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4275                                            (0x7AC2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4276                                            (0x3768u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4277                                            (0x1E8Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4278                                            (0x7263u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4279                                            (0x0B1Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4280                                            (0x2D9Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4281                                            (0x7CA2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4282                                            (0x46B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4283                                            (0x526Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4284                                            (0x7869u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4285                                            (0x7E0Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4286                                            (0x268Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4287                                            (0x57A2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4288                                            (0x6276u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4289                                            (0x0DD6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4290                                            (0x16C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4291                                            (0x35C9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4292                                            (0x7433u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4293                                            (0x2B3Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4294                                            (0x5963u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4295                                            (0x30AFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4296                                            (0x0F93u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4297                                            (0x1E35u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4298                                            (0x5237u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4299                                            (0x6297u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4300                                            (0x34F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4301                                            (0x399Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4302                                            (0x6374u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4303                                            (0x2EC3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4304                                            (0x3E31u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4305                                            (0x27C3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4306                                            (0x565Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4307                                            (0x27A6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4308                                            (0x475Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4309                                            (0x738Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4310                                            (0x53B1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4311                                            (0x7057u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4312                                            (0x66ACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4313                                            (0x7D18u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4314                                            (0x38F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4315                                            (0x3CC9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4316                                            (0x6754u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4317                                            (0x26CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4318                                            (0x7C1Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4319                                            (0x42CFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4320                                            (0x562Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4321                                            (0x6A93u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4322                                            (0x54E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4323                                            (0x2B8Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4324                                            (0x6D92u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4325                                            (0x5B94u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4326                                            (0x7703u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4327                                            (0x552Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4328                                            (0x6A9Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4329                                            (0x5B46u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4330                                            (0x1A3Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4331                                            (0x53E2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4332                                            (0x136Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4333                                            (0x7645u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4334                                            (0x0BAEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4335                                            (0x72B4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4336                                            (0x3355u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4337                                            (0x7155u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4338                                            (0x64BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4339                                            (0x683Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4340                                            (0x7B12u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4341                                            (0x526Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4342                                            (0x3E1Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4343                                            (0x2717u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4344                                            (0x2F13u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4345                                            (0x05F3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4346                                            (0x656Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4347                                            (0x624Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4348                                            (0x1FA1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4349                                            (0x507Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4350                                            (0x3C1Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4351                                            (0x742Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4352                                            (0x1DC9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4353                                            (0x6E94u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4354                                            (0x53E1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4355                                            (0x1F52u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4356                                            (0x073Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4357                                            (0x4F4Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4358                                            (0x7C25u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4359                                            (0x38AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4360                                            (0x13B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4361                                            (0x0EB3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4362                                            (0x3C5Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4363                                            (0x127Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4364                                            (0x6555u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4365                                            (0x158Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4366                                            (0x3D19u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4367                                            (0x1997u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4368                                            (0x2D8Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4369                                            (0x0C7Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4370                                            (0x3BC8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4371                                            (0x7386u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4372                                            (0x7A4Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4373                                            (0x5AD8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4374                                            (0x0BCDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4375                                            (0x2F98u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4376                                            (0x06B7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4377                                            (0x7368u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4378                                            (0x1D33u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4379                                            (0x33D4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4380                                            (0x363Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4381                                            (0x3AB8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4382                                            (0x7507u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4383                                            (0x7721u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4384                                            (0x2E27u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4385                                            (0x4C3Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4386                                            (0x5DC2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4387                                            (0x5B13u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4388                                            (0x69B8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4389                                            (0x3A1Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4390                                            (0x452Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4391                                            (0x2A6Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4392                                            (0x5371u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4393                                            (0x4D87u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4394                                            (0x7C15u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4395                                            (0x6E4Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4396                                            (0x58CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4397                                            (0x276Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4398                                            (0x70D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4399                                            (0x68BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4400                                            (0x4769u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4401                                            (0x2AEAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4402                                            (0x527Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4403                                            (0x2E6Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4404                                            (0x781Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4405                                            (0x5AA3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4406                                            (0x2D3Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4407                                            (0x764Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4408                                            (0x592Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4409                                            (0x7C61u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4410                                            (0x2B9Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4411                                            (0x463Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4412                                            (0x3726u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4413                                            (0x62CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4414                                            (0x665Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4415                                            (0x4F13u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4416                                            (0x20EFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4417                                            (0x1979u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4418                                            (0x0FD1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4419                                            (0x29CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4420                                            (0x1B27u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4421                                            (0x666Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4422                                            (0x70F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4423                                            (0x6C6Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4424                                            (0x193Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4425                                            (0x3A36u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4426                                            (0x43F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4427                                            (0x37E0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4428                                            (0x06EEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4429                                            (0x1C8Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4430                                            (0x74F0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4431                                            (0x4765u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4432                                            (0x6E43u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4433                                            (0x29E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4434                                            (0x5D32u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4435                                            (0x1ACDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4436                                            (0x0CAFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4437                                            (0x2772u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4438                                            (0x5E89u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4439                                            (0x6C53u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4440                                            (0x1E78u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4441                                            (0x5B49u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4442                                            (0x552Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4443                                            (0x0CDBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4444                                            (0x2AE6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4445                                            (0x654Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4446                                            (0x0F2Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4447                                            (0x6B13u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4448                                            (0x299Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4449                                            (0x65E2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4450                                            (0x4FE0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4451                                            (0x0D3Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4452                                            (0x44BEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4453                                            (0x287Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4454                                            (0x75A8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4455                                            (0x639Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4456                                            (0x1E1Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4457                                            (0x1B1Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4458                                            (0x3533u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4459                                            (0x1E17u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4460                                            (0x465Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4461                                            (0x2EE1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4462                                            (0x335Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4463                                            (0x54DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4464                                            (0x497Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4465                                            (0x4597u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4466                                            (0x6CC5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4467                                            (0x34C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4468                                            (0x538Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4469                                            (0x3476u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4470                                            (0x5D8Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4471                                            (0x15B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4472                                            (0x2DF0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4473                                            (0x3AC5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4474                                            (0x274Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4475                                            (0x5B0Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4476                                            (0x43E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4477                                            (0x3AD4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4478                                            (0x6897u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4479                                            (0x37A4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4480                                            (0x69AAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4481                                            (0x6DA8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4482                                            (0x5AE2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4483                                            (0x1E9Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4484                                            (0x1E93u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4485                                            (0x6D2Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4486                                            (0x5CB4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4487                                            (0x4DACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4488                                            (0x0DB9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4489                                            (0x17CAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4490                                            (0x7C46u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4491                                            (0x194Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4492                                            (0x0F71u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4493                                            (0x4799u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4494                                            (0x6559u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4495                                            (0x4E1Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4496                                            (0x23E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4497                                            (0x28DDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4498                                            (0x7C19u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4499                                            (0x6AE4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4500                                            (0x6959u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4501                                            (0x6556u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4502                                            (0x52E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4503                                            (0x43D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4504                                            (0x7866u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4505                                            (0x2769u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4506                                            (0x30DBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4507                                            (0x1FC8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4508                                            (0x45E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4509                                            (0x6792u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4510                                            (0x5F11u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4511                                            (0x073Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4512                                            (0x309Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4513                                            (0x24FCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4514                                            (0x4637u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4515                                            (0x29EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4516                                            (0x22BEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4517                                            (0x2B39u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4518                                            (0x469Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4519                                            (0x3B51u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4520                                            (0x1AD5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4521                                            (0x58ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4522                                            (0x649Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4523                                            (0x31BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4524                                            (0x25B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4525                                            (0x2D1Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4526                                            (0x7174u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4527                                            (0x4E78u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4528                                            (0x0F33u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4529                                            (0x5693u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4530                                            (0x27D2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4531                                            (0x6BC1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4532                                            (0x5936u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4533                                            (0x09F5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4534                                            (0x64B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4535                                            (0x29E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4536                                            (0x3EE0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4537                                            (0x5CCCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4538                                            (0x0BECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4539                                            (0x7153u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4540                                            (0x4B4Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4541                                            (0x6C4Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4542                                            (0x165Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4543                                            (0x3758u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4544                                            (0x2BA6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4545                                            (0x3CA6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4546                                            (0x1E2Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4547                                            (0x49F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4548                                            (0x262Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4549                                            (0x44B7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4550                                            (0x33CAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4551                                            (0x13BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4552                                            (0x172Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4553                                            (0x4ADCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4554                                            (0x7646u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4555                                            (0x09EDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4556                                            (0x326Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4557                                            (0x0DABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4558                                            (0x7CA8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4559                                            (0x4EF0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4560                                            (0x51E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4561                                            (0x5CE4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4562                                            (0x6571u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4563                                            (0x2EF0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4564                                            (0x74A5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4565                                            (0x1F61u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4566                                            (0x25AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4567                                            (0x5E52u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4568                                            (0x461Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4569                                            (0x61E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4570                                            (0x605Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4571                                            (0x3E15u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4572                                            (0x571Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4573                                            (0x27A9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4574                                            (0x2EA5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4575                                            (0x283Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4576                                            (0x392Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4577                                            (0x49E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4578                                            (0x5B8Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4579                                            (0x3C8Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4580                                            (0x383Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4581                                            (0x6E98u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4582                                            (0x47C5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4583                                            (0x45ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4584                                            (0x678Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4585                                            (0x18B7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4586                                            (0x1376u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4587                                            (0x1337u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4588                                            (0x62B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4589                                            (0x39D2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4590                                            (0x037Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4591                                            (0x296Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4592                                            (0x31D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4593                                            (0x3936u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4594                                            (0x076Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4595                                            (0x3D86u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4596                                            (0x29CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4597                                            (0x78E8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4598                                            (0x5366u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4599                                            (0x49EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4600                                            (0x760Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4601                                            (0x2B8Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4602                                            (0x4CD3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4603                                            (0x7B88u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4604                                            (0x4DC9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4605                                            (0x3956u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4606                                            (0x51A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4607                                            (0x293Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4608                                            (0x267Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4609                                            (0x0E37u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4610                                            (0x2E39u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4611                                            (0x7B48u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4612                                            (0x7178u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4613                                            (0x6C5Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4614                                            (0x51EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4615                                            (0x7970u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4616                                            (0x2A3Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4617                                            (0x2C5Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4618                                            (0x6729u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4619                                            (0x3707u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4620                                            (0x4DCAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4621                                            (0x2957u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4622                                            (0x266Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4623                                            (0x4ABCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4624                                            (0x4967u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4625                                            (0x199Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4626                                            (0x5725u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4627                                            (0x0F99u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4628                                            (0x42E7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4629                                            (0x5365u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4630                                            (0x2376u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4631                                            (0x275Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4632                                            (0x3C47u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4633                                            (0x22E7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4634                                            (0x4F86u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4635                                            (0x0FE2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4636                                            (0x5D25u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4637                                            (0x6D46u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4638                                            (0x555Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4639                                            (0x18EBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4640                                            (0x5D4Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4641                                            (0x487Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4642                                            (0x71ACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4643                                            (0x354Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4644                                            (0x4F0Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4645                                            (0x0DF2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4646                                            (0x3C74u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4647                                            (0x0AF5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4648                                            (0x32CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4649                                            (0x298Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4650                                            (0x42DEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4651                                            (0x186Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4652                                            (0x3C2Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4653                                            (0x72A5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4654                                            (0x1B4Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4655                                            (0x1E4Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4656                                            (0x7863u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4657                                            (0x7C2Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4658                                            (0x646Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4659                                            (0x4B5Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4660                                            (0x583Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4661                                            (0x3387u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4662                                            (0x1BA3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4663                                            (0x53C6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4664                                            (0x2FA4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4665                                            (0x16BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4666                                            (0x7893u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4667                                            (0x31E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4668                                            (0x3276u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4669                                            (0x45D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4670                                            (0x25B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4671                                            (0x468Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4672                                            (0x1E96u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4673                                            (0x079Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4674                                            (0x45EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4675                                            (0x361Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4676                                            (0x54BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4677                                            (0x3566u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4678                                            (0x0AF3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4679                                            (0x7CC8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4680                                            (0x5B61u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4681                                            (0x6A8Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4682                                            (0x398Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4683                                            (0x789Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4684                                            (0x50BEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4685                                            (0x1EA3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4686                                            (0x3715u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4687                                            (0x5783u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4688                                            (0x750Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4689                                            (0x75A2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4690                                            (0x059Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4691                                            (0x1EAAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4692                                            (0x0CEEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4693                                            (0x6719u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4694                                            (0x3E32u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4695                                            (0x2B69u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4696                                            (0x156Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4697                                            (0x57C8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4698                                            (0x60BEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4699                                            (0x5C1Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4700                                            (0x5C39u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4701                                            (0x19CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4702                                            (0x7D90u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4703                                            (0x315Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4704                                            (0x272Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4705                                            (0x66B8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4706                                            (0x6E1Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4707                                            (0x6C6Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4708                                            (0x4A3Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4709                                            (0x23B6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4710                                            (0x560Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4711                                            (0x6FC0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4712                                            (0x3C4Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4713                                            (0x1AD9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4714                                            (0x5DA1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4715                                            (0x5E38u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4716                                            (0x26E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4717                                            (0x517Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4718                                            (0x2C3Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4719                                            (0x3273u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4720                                            (0x6953u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4721                                            (0x50EDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4722                                            (0x5275u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4723                                            (0x3AD8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4724                                            (0x592Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4725                                            (0x51AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4726                                            (0x6A59u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4727                                            (0x5699u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4728                                            (0x31F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4729                                            (0x3C8Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4730                                            (0x7487u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4731                                            (0x427Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4732                                            (0x1F86u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4733                                            (0x5E49u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4734                                            (0x5F05u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4735                                            (0x1D56u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4736                                            (0x1CF4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4737                                            (0x3752u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4738                                            (0x35B4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4739                                            (0x670Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4740                                            (0x64D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4741                                            (0x2F4Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4742                                            (0x5D34u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4743                                            (0x0DB3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4744                                            (0x6F90u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4745                                            (0x306Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4746                                            (0x466Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4747                                            (0x6C9Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4748                                            (0x1367u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4749                                            (0x69ACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4750                                            (0x513Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4751                                            (0x3D62u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4752                                            (0x313Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4753                                            (0x2D8Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4754                                            (0x3B98u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4755                                            (0x53E4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4756                                            (0x3569u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4757                                            (0x6353u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4758                                            (0x1F31u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4759                                            (0x1D6Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4760                                            (0x5687u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4761                                            (0x7515u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4762                                            (0x5BD0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4763                                            (0x1772u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4764                                            (0x43E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4765                                            (0x36E8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4766                                            (0x5B0Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4767                                            (0x72E2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4768                                            (0x349Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4769                                            (0x06BEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4770                                            (0x5669u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4771                                            (0x5B8Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4772                                            (0x498Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4773                                            (0x3535u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4774                                            (0x1D2Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4775                                            (0x6B85u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4776                                            (0x703Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4777                                            (0x7269u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4778                                            (0x50D7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4779                                            (0x68CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4780                                            (0x69E1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4781                                            (0x72E4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4782                                            (0x752Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4783                                            (0x5749u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4784                                            (0x364Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4785                                            (0x1B9Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4786                                            (0x5B86u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4787                                            (0x7C0Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4788                                            (0x3F21u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4789                                            (0x694Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4790                                            (0x5C2Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4791                                            (0x6A3Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4792                                            (0x2E2Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4793                                            (0x38B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4794                                            (0x4ABAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4795                                            (0x52ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4796                                            (0x53D2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4797                                            (0x47ACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4798                                            (0x187Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4799                                            (0x449Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4800                                            (0x25E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4801                                            (0x7354u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4802                                            (0x60B7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4803                                            (0x1CDAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4804                                            (0x5395u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4805                                            (0x257Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4806                                            (0x471Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4807                                            (0x62E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4808                                            (0x331Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4809                                            (0x46C7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4810                                            (0x7D88u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4811                                            (0x3AC9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4812                                            (0x2367u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4813                                            (0x7598u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4814                                            (0x47B2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4815                                            (0x7613u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4816                                            (0x58F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4817                                            (0x6C63u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4818                                            (0x6A4Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4819                                            (0x6F24u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4820                                            (0x5987u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4821                                            (0x234Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4822                                            (0x42DBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4823                                            (0x638Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4824                                            (0x4A37u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4825                                            (0x2FC4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4826                                            (0x7A49u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4827                                            (0x417Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4828                                            (0x7C89u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4829                                            (0x68ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4830                                            (0x51D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4831                                            (0x253Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4832                                            (0x6B83u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4833                                            (0x1BB4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4834                                            (0x1778u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4835                                            (0x3237u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4836                                            (0x74E4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4837                                            (0x63C9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4838                                            (0x1C6Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4839                                            (0x31AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4840                                            (0x1ADCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4841                                            (0x5636u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4842                                            (0x2AF2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4843                                            (0x64CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4844                                            (0x55ACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4845                                            (0x1B72u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4846                                            (0x6AD8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4847                                            (0x40FBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4848                                            (0x52CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4849                                            (0x343Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4850                                            (0x6935u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4851                                            (0x6578u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4852                                            (0x7466u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4853                                            (0x6BA2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4854                                            (0x5AE1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4855                                            (0x5596u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4856                                            (0x7529u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4857                                            (0x566Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4858                                            (0x4B9Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4859                                            (0x6A1Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4860                                            (0x174Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4861                                            (0x0AFCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4862                                            (0x1A7Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4863                                            (0x394Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4864                                            (0x7A29u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4865                                            (0x2E69u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4866                                            (0x7C38u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4867                                            (0x3BA1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4868                                            (0x32ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4869                                            (0x5E64u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4870                                            (0x179Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4871                                            (0x26DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4872                                            (0x32E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4873                                            (0x315Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4874                                            (0x7730u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4875                                            (0x2793u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4876                                            (0x24D7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4877                                            (0x5F06u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4878                                            (0x3D2Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4879                                            (0x5B45u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4880                                            (0x4FA8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4881                                            (0x3173u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4882                                            (0x628Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4883                                            (0x4BA9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4884                                            (0x6AA9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4885                                            (0x4D4Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4886                                            (0x5752u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4887                                            (0x62F8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4888                                            (0x50EBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4889                                            (0x63A3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4890                                            (0x6566u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4891                                            (0x55B1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4892                                            (0x62E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4893                                            (0x666Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4894                                            (0x5359u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4895                                            (0x5B15u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4896                                            (0x5B98u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4897                                            (0x35C3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4898                                            (0x1A75u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4899                                            (0x28D7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4900                                            (0x4397u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4901                                            (0x3D32u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4902                                            (0x426Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4903                                            (0x5374u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4904                                            (0x13D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4905                                            (0x749Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4906                                            (0x196Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4907                                            (0x2753u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4908                                            (0x64ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4909                                            (0x6A2Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4910                                            (0x6336u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4911                                            (0x39E8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4912                                            (0x1EA9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4913                                            (0x7A70u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4914                                            (0x2177u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4915                                            (0x5559u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4916                                            (0x223Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4917                                            (0x5FA0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4918                                            (0x4697u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4919                                            (0x1DE8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4920                                            (0x50F9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4921                                            (0x2ED2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4922                                            (0x3C71u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4923                                            (0x3317u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4924                                            (0x0E75u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4925                                            (0x2DA6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4926                                            (0x534Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4927                                            (0x09D7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4928                                            (0x703Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4929                                            (0x6BA1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4930                                            (0x31D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4931                                            (0x6EE0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4932                                            (0x46CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4933                                            (0x1B78u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4934                                            (0x6879u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4935                                            (0x5C8Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4936                                            (0x5C66u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4937                                            (0x50F6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4938                                            (0x25ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4939                                            (0x6563u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4940                                            (0x726Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4941                                            (0x135Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4942                                            (0x7D03u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4943                                            (0x25ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4944                                            (0x3D91u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4945                                            (0x26D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4946                                            (0x2D66u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4947                                            (0x587Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4948                                            (0x4357u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4949                                            (0x09DDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4950                                            (0x51F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4951                                            (0x5A72u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4952                                            (0x7453u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4953                                            (0x171Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4954                                            (0x351Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4955                                            (0x1AE5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4956                                            (0x699Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4957                                            (0x0FA6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4958                                            (0x3729u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4959                                            (0x21EBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4960                                            (0x6B16u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4961                                            (0x3F60u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4962                                            (0x539Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4963                                            (0x3E68u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4964                                            (0x1D74u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4965                                            (0x732Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4966                                            (0x10FBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4967                                            (0x1AE6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4968                                            (0x538Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4969                                            (0x0B79u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4970                                            (0x1CD3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4971                                            (0x42EDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4972                                            (0x5555u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4973                                            (0x2D59u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4974                                            (0x594Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4975                                            (0x34E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4976                                            (0x60DEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4977                                            (0x533Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4978                                            (0x71A3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4979                                            (0x516Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4980                                            (0x07F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4981                                            (0x6971u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4982                                            (0x546Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4983                                            (0x551Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4984                                            (0x2796u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4985                                            (0x0F55u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4986                                            (0x72F0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4987                                            (0x1DD4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4988                                            (0x15F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4989                                            (0x5E19u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4990                                            (0x39A9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4991                                            (0x3574u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4992                                            (0x73E0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4993                                            (0x6D23u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4994                                            (0x4DD4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4995                                            (0x564Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4996                                            (0x46ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4997                                            (0x36F0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4998                                            (0x2E53u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_4999                                            (0x523Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5000                                            (0x566Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5001                                            (0x0B37u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5002                                            (0x49ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5003                                            (0x52E6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5004                                            (0x7AC1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5005                                            (0x5DA4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5006                                            (0x1B63u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5007                                            (0x5E2Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5008                                            (0x23ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5009                                            (0x350Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5010                                            (0x6DA2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5011                                            (0x07ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5012                                            (0x76E0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5013                                            (0x27E4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5014                                            (0x6AB8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5015                                            (0x53A9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5016                                            (0x62CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5017                                            (0x11F3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5018                                            (0x41BEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5019                                            (0x7187u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5020                                            (0x4379u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5021                                            (0x7631u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5022                                            (0x32F1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5023                                            (0x356Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5024                                            (0x1C7Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5025                                            (0x2F85u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5026                                            (0x49CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5027                                            (0x27C5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5028                                            (0x52D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5029                                            (0x13CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5030                                            (0x1DACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5031                                            (0x78E4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5032                                            (0x3C96u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5033                                            (0x3C3Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5034                                            (0x5ACCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5035                                            (0x1E69u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5036                                            (0x7331u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5037                                            (0x3CB8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5038                                            (0x56A3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5039                                            (0x345Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5040                                            (0x6D38u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5041                                            (0x149Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5042                                            (0x23AEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5043                                            (0x32B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5044                                            (0x66E8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5045                                            (0x3D46u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5046                                            (0x630Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5047                                            (0x38E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5048                                            (0x07A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5049                                            (0x6339u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5050                                            (0x6CD1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5051                                            (0x3C95u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5052                                            (0x6F50u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5053                                            (0x1D4Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5054                                            (0x56B2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5055                                            (0x7A8Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5056                                            (0x45B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5057                                            (0x1B5Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5058                                            (0x2976u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5059                                            (0x6678u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5060                                            (0x6972u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5061                                            (0x2BE1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5062                                            (0x066Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5063                                            (0x7455u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5064                                            (0x2D39u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5065                                            (0x32E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5066                                            (0x7D14u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5067                                            (0x21E7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5068                                            (0x29B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5069                                            (0x46B5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5070                                            (0x3547u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5071                                            (0x534Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5072                                            (0x7A13u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5073                                            (0x19E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5074                                            (0x32CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5075                                            (0x1CCBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5076                                            (0x349Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5077                                            (0x2D9Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5078                                            (0x7C4Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5079                                            (0x5EA8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5080                                            (0x5C2Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5081                                            (0x1795u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5082                                            (0x434Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5083                                            (0x3556u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5084                                            (0x473Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5085                                            (0x6A69u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5086                                            (0x5B4Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5087                                            (0x7662u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5088                                            (0x1727u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5089                                            (0x2F61u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5090                                            (0x2DB4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5091                                            (0x49A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5092                                            (0x46E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5093                                            (0x6479u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5094                                            (0x792Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5095                                            (0x34ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5096                                            (0x0EA7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5097                                            (0x6627u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5098                                            (0x3696u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5099                                            (0x3593u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5100                                            (0x02FEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5101                                            (0x47AAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5102                                            (0x57A4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5103                                            (0x686Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5104                                            (0x256Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5105                                            (0x6917u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5106                                            (0x5C47u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5107                                            (0x5CC6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5108                                            (0x5E4Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5109                                            (0x17ACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5110                                            (0x2F23u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5111                                            (0x6936u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5112                                            (0x2AB5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5113                                            (0x2CB3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5114                                            (0x5C74u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5115                                            (0x286Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5116                                            (0x06DDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5117                                            (0x6C74u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5118                                            (0x3587u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5119                                            (0x3EA4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5120                                            (0x2D4Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5121                                            (0x2EE2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5122                                            (0x6572u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5123                                            (0x4D1Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5124                                            (0x44E7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5125                                            (0x74A9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5126                                            (0x4AADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5127                                            (0x0BE5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5128                                            (0x4F62u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5129                                            (0x35E1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5130                                            (0x4E69u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5131                                            (0x4F54u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5132                                            (0x4667u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5133                                            (0x49E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5134                                            (0x7287u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5135                                            (0x1F62u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5136                                            (0x7233u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5137                                            (0x71CCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5138                                            (0x3369u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5139                                            (0x46E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5140                                            (0x2E4Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5141                                            (0x3D23u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5142                                            (0x334Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5143                                            (0x56E2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5144                                            (0x71AAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5145                                            (0x38B9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5146                                            (0x3B45u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5147                                            (0x0BF4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5148                                            (0x365Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5149                                            (0x1567u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5150                                            (0x635Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5151                                            (0x23DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5152                                            (0x2766u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5153                                            (0x6CE2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5154                                            (0x1CF2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5155                                            (0x1379u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5156                                            (0x4D69u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5157                                            (0x0D79u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5158                                            (0x22F6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5159                                            (0x7F10u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5160                                            (0x50FCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5161                                            (0x4E9Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5162                                            (0x347Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5163                                            (0x399Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5164                                            (0x39B2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5165                                            (0x6C33u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5166                                            (0x6E26u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5167                                            (0x5CE2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5168                                            (0x4AE9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5169                                            (0x548Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5170                                            (0x33B1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5171                                            (0x226Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5172                                            (0x3969u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5173                                            (0x56D1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5174                                            (0x692Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5175                                            (0x7531u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5176                                            (0x2F94u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5177                                            (0x1DA6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5178                                            (0x1EE1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5179                                            (0x165Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5180                                            (0x46D5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5181                                            (0x55AAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5182                                            (0x38BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5183                                            (0x6CC9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5184                                            (0x36E2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5185                                            (0x156Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5186                                            (0x68D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5187                                            (0x26D6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5188                                            (0x1C9Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5189                                            (0x7329u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5190                                            (0x752Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5191                                            (0x28AFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5192                                            (0x1F13u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5193                                            (0x7954u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5194                                            (0x79D0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5195                                            (0x21FCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5196                                            (0x54F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5197                                            (0x7C32u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5198                                            (0x6C87u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5199                                            (0x5279u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5200                                            (0x4D5Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5201                                            (0x5AA6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5202                                            (0x4A75u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5203                                            (0x669Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5204                                            (0x3A35u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5205                                            (0x552Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5206                                            (0x4DE4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5207                                            (0x41D7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5208                                            (0x455Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5209                                            (0x0BB5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5210                                            (0x1CF1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5211                                            (0x6157u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5212                                            (0x1B6Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5213                                            (0x2C6Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5214                                            (0x4DB2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5215                                            (0x22CFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5216                                            (0x2F8Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5217                                            (0x6656u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5218                                            (0x7A58u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5219                                            (0x3A8Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5220                                            (0x5533u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5221                                            (0x1DA9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5222                                            (0x7A98u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5223                                            (0x27D1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5224                                            (0x1DB4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5225                                            (0x0F5Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5226                                            (0x6E13u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5227                                            (0x65B2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5228                                            (0x3D49u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5229                                            (0x36B1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5230                                            (0x3B0Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5231                                            (0x0C9Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5232                                            (0x143Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5233                                            (0x17AAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5234                                            (0x5995u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5235                                            (0x5785u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5236                                            (0x176Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5237                                            (0x51B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5238                                            (0x386Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5239                                            (0x7652u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5240                                            (0x7E41u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5241                                            (0x37A8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5242                                            (0x619Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5243                                            (0x6AD2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5244                                            (0x3E4Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5245                                            (0x7471u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5246                                            (0x503Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5247                                            (0x66B2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5248                                            (0x4DC3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5249                                            (0x2CF2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5250                                            (0x6B54u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5251                                            (0x65B1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5252                                            (0x7874u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5253                                            (0x42B7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5254                                            (0x1F94u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5255                                            (0x1D4Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5256                                            (0x5F84u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5257                                            (0x6987u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5258                                            (0x31B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5259                                            (0x347Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5260                                            (0x16CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5261                                            (0x4A9Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5262                                            (0x0D6Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5263                                            (0x3F50u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5264                                            (0x2F64u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5265                                            (0x3687u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5266                                            (0x0ADDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5267                                            (0x0BF1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5268                                            (0x3C99u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5269                                            (0x1C5Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5270                                            (0x20F7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5271                                            (0x09FAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5272                                            (0x3CF0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5273                                            (0x456Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5274                                            (0x18EEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5275                                            (0x782Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5276                                            (0x0FD8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5277                                            (0x69C3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5278                                            (0x2E4Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5279                                            (0x7A64u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5280                                            (0x1AF1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5281                                            (0x1AB9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5282                                            (0x48F3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5283                                            (0x1FA4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5284                                            (0x12F9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5285                                            (0x485Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5286                                            (0x7B44u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5287                                            (0x645Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5288                                            (0x5746u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5289                                            (0x7C85u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5290                                            (0x0773u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5291                                            (0x4997u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5292                                            (0x5F0Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5293                                            (0x2A4Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5294                                            (0x317Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5295                                            (0x722Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5296                                            (0x7C64u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5297                                            (0x459Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5298                                            (0x525Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5299                                            (0x7493u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5300                                            (0x708Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5301                                            (0x15BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5302                                            (0x7AD0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5303                                            (0x3B49u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5304                                            (0x6EC4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5305                                            (0x3E2Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5306                                            (0x278Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5307                                            (0x3D13u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5308                                            (0x70CDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5309                                            (0x4A1Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5310                                            (0x3CE2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5311                                            (0x17B4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5312                                            (0x17E1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5313                                            (0x49ADu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5314                                            (0x6AC5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5315                                            (0x6D29u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5316                                            (0x0EB9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5317                                            (0x6D13u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5318                                            (0x172Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5319                                            (0x77A0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5320                                            (0x10FDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5321                                            (0x0BA7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5322                                            (0x3966u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5323                                            (0x38F4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5324                                            (0x20BFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5325                                            (0x31ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5326                                            (0x1E3Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5327                                            (0x5ACAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5328                                            (0x5D68u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5329                                            (0x322Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5330                                            (0x2FA1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5331                                            (0x079Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5332                                            (0x6965u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5333                                            (0x4A76u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5334                                            (0x712Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5335                                            (0x7D30u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5336                                            (0x5B19u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5337                                            (0x0EE6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5338                                            (0x0F95u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5339                                            (0x68DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5340                                            (0x2BF0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5341                                            (0x2EE4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5342                                            (0x632Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5343                                            (0x3C78u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5344                                            (0x7CD0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5345                                            (0x74B8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5346                                            (0x189Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5347                                            (0x08BFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5348                                            (0x0BE9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5349                                            (0x0CDDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5350                                            (0x60EBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5351                                            (0x550Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5352                                            (0x17B1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5353                                            (0x4DB4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5354                                            (0x76A2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5355                                            (0x1D71u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5356                                            (0x2DA3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5357                                            (0x17CCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5358                                            (0x3F88u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5359                                            (0x65E8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5360                                            (0x788Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5361                                            (0x7706u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5362                                            (0x7983u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5363                                            (0x3A6Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5364                                            (0x5996u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5365                                            (0x1735u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5366                                            (0x25D9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5367                                            (0x37B0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5368                                            (0x2BB8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5369                                            (0x5E91u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5370                                            (0x5D31u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5371                                            (0x4D63u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5372                                            (0x7E12u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5373                                            (0x5A4Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5374                                            (0x7465u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5375                                            (0x39C3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5376                                            (0x6237u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5377                                            (0x7A61u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5378                                            (0x2A75u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5379                                            (0x2967u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5380                                            (0x6749u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5381                                            (0x1ED8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5382                                            (0x3CC5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5383                                            (0x34CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5384                                            (0x4B0Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5385                                            (0x6CB8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5386                                            (0x54CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5387                                            (0x253Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5388                                            (0x313Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5389                                            (0x4AF4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5390                                            (0x2B5Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5391                                            (0x5B64u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5392                                            (0x570Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5393                                            (0x5F81u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5394                                            (0x6327u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5395                                            (0x556Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5396                                            (0x3A4Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5397                                            (0x6659u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5398                                            (0x3A99u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5399                                            (0x62ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5400                                            (0x0C7Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5401                                            (0x625Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5402                                            (0x487Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5403                                            (0x2E8Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5404                                            (0x66A9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5405                                            (0x486Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5406                                            (0x05EEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5407                                            (0x1E1Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5408                                            (0x6596u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5409                                            (0x59D4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5410                                            (0x2CB9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5411                                            (0x74C9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5412                                            (0x291Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5413                                            (0x472Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5414                                            (0x279Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5415                                            (0x113Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5416                                            (0x474Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5417                                            (0x5965u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5418                                            (0x0EF8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5419                                            (0x35E2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5420                                            (0x0F9Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5421                                            (0x5535u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5422                                            (0x352Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5423                                            (0x6DC1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5424                                            (0x6C8Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5425                                            (0x29ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5426                                            (0x22BDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5427                                            (0x6963u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5428                                            (0x363Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5429                                            (0x3CD1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5430                                            (0x196Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5431                                            (0x64DAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5432                                            (0x5696u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5433                                            (0x1E71u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5434                                            (0x6B89u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5435                                            (0x3176u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5436                                            (0x6275u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5437                                            (0x39CAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5438                                            (0x4B96u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5439                                            (0x76D0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5440                                            (0x13ECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5441                                            (0x698Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5442                                            (0x3E19u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5443                                            (0x65B8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5444                                            (0x741Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5445                                            (0x4FA2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5446                                            (0x7A31u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5447                                            (0x695Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5448                                            (0x2D2Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5449                                            (0x4D8Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5450                                            (0x4747u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5451                                            (0x26E5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5452                                            (0x4CD6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5453                                            (0x71C3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5454                                            (0x4E53u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5455                                            (0x2AAEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5456                                            (0x3517u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5457                                            (0x1D6Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5458                                            (0x10BFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5459                                            (0x531Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5460                                            (0x0E67u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5461                                            (0x62D3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5462                                            (0x3553u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5463                                            (0x4BA3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5464                                            (0x613Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5465                                            (0x7166u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5466                                            (0x3137u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5467                                            (0x2D5Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5468                                            (0x0AFAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5469                                            (0x446Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5470                                            (0x0BBCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5471                                            (0x6CB4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5472                                            (0x699Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5473                                            (0x1C73u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5474                                            (0x28CFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5475                                            (0x3A27u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5476                                            (0x7D05u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5477                                            (0x6995u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5478                                            (0x1AD6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5479                                            (0x1A5Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5480                                            (0x1F8Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5481                                            (0x79A2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5482                                            (0x70E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5483                                            (0x5F44u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5484                                            (0x6B62u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5485                                            (0x3AAAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5486                                            (0x5AB1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5487                                            (0x6CCCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5488                                            (0x47E4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5489                                            (0x0E3Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5490                                            (0x6D26u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5491                                            (0x2BE2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5492                                            (0x47D8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5493                                            (0x66C3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5494                                            (0x437Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5495                                            (0x06BBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5496                                            (0x4B8Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5497                                            (0x4B72u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5498                                            (0x1E95u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5499                                            (0x1A4Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5500                                            (0x16CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5501                                            (0x7788u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5502                                            (0x6BB0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5503                                            (0x71B8u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5504                                            (0x4E55u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5505                                            (0x7C68u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5506                                            (0x42EEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5507                                            (0x6C93u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5508                                            (0x2DE2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5509                                            (0x338Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5510                                            (0x1EC3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5511                                            (0x64F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5512                                            (0x56C5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5513                                            (0x1EF0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5514                                            (0x52BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5515                                            (0x72D4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5516                                            (0x4C9Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5517                                            (0x6B38u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5518                                            (0x3E0Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5519                                            (0x391Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5520                                            (0x56E1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5521                                            (0x7625u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5522                                            (0x4AECu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5523                                            (0x074Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5524                                            (0x0CF9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5525                                            (0x263Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5526                                            (0x3E38u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5527                                            (0x7946u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5528                                            (0x1BC5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5529                                            (0x2D2Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5530                                            (0x38ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5531                                            (0x370Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5532                                            (0x3A2Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5533                                            (0x3279u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5534                                            (0x711Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5535                                            (0x72E1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5536                                            (0x57B0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5537                                            (0x65E4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5538                                            (0x643Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5539                                            (0x49E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5540                                            (0x387Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5541                                            (0x7B03u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5542                                            (0x4CE5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5543                                            (0x582Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5544                                            (0x6A1Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5545                                            (0x0779u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5546                                            (0x1E56u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5547                                            (0x58CBu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5548                                            (0x713Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5549                                            (0x4F89u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5550                                            (0x7436u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5551                                            (0x7594u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5552                                            (0x1A9Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5553                                            (0x6E16u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5554                                            (0x48AFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5555                                            (0x49B3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5556                                            (0x2D3Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5557                                            (0x7165u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5558                                            (0x0775u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5559                                            (0x4E72u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5560                                            (0x65A6u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5561                                            (0x04EFu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCl_unused_5562                                            (0x616Bu)\r\n\r\nMCUX_CSSL_ANALYSIS_STOP_PATTERN_DESCRIPTIVE_IDENTIFIER()\r\n\r\n#endif /* MCUX_CL_FLOW_PROTECTION_FUNCTION_IDENTIFIERS_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClCore/inc/mcuxClCore_Macros.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxClCore_Macros.h\r\n * @brief Definition of macros.\r\n *\r\n */\r\n\r\n#ifndef MCUXCLCORE_MACROS_H_\r\n#define MCUXCLCORE_MACROS_H_\r\n\r\n/* Macro to calculate the rounded down number of words that fit into the specified size */\r\n#define MCUXCLCORE_NUM_OF_WORDS_FLOOR(wordsize, size)  \\\r\n  ((size) / (wordsize))\r\n\r\n/* Macro to calculate the rounded up number of words needed to fit an object of the specified size */\r\n#define MCUXCLCORE_NUM_OF_WORDS_CEIL(wordsize, size)  \\\r\n  (((size) + (wordsize) - 1u) / (wordsize))\r\n\r\n/* Macro to calculate the rounded down number of CPU words that fit into the specified size */\r\n#define MCUXCLCORE_NUM_OF_CPUWORDS_FLOOR(size)  \\\r\n  MCUXCLCORE_NUM_OF_WORDS_FLOOR(sizeof(uint32_t), size)\r\n\r\n/* Macro to calculate the rounded up number of CPU words needed to fit an object of the specified size */\r\n#define MCUXCLCORE_NUM_OF_CPUWORDS_CEIL(size)  \\\r\n  MCUXCLCORE_NUM_OF_WORDS_CEIL(sizeof(uint32_t), size)\r\n\r\n/* Macro to round up a given size to the nearest multiple of a specified word size */\r\n#define MCUXCLCORE_ALIGN_TO_WORDSIZE(wordsize, size)  \\\r\n  (MCUXCLCORE_NUM_OF_WORDS_CEIL(wordsize, size) * (wordsize))\r\n\r\n/* Macro to round up a given size to the nearest multiple of the CPU word size */\r\n#define MCUXCLCORE_ALIGN_TO_CPU_WORDSIZE(size)  \\\r\n  MCUXCLCORE_ALIGN_TO_WORDSIZE(sizeof(uint32_t), size)\r\n\r\n/* Macro to calculate the maximum of two values */\r\n#define MCUXCLCORE_MAX(a, b)  \\\r\nMCUX_CSSL_ANALYSIS_START_SUPPRESS_CONTROLLING_EXPRESSION_IS_INVARIANT(\"Fixed values are allowed as macro inputs\") \\\r\n  (((a) > (b)) ? (a) : (b)) \\\r\nMCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CONTROLLING_EXPRESSION_IS_INVARIANT()\r\n\r\n/* Macro to calculate the minimum of two values */\r\n#define MCUXCLCORE_MIN(a, b)  \\\r\n  (((a) < (b)) ? (a) : (b))\r\n\r\n#endif /* MCUXCLCORE_MACROS_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClCore/inc/mcuxClCore_Platform.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2021 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n#ifndef MCUXCLCORE_PLATFORM_H_\r\n#define MCUXCLCORE_PLATFORM_H_\r\n\r\n#include <stddef.h>\r\n#include <stdint.h>\r\n#include <stdbool.h>\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n\r\n#endif /* MCUXCLCORE_PLATFORM_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClCore/inc/mcuxClCore_Toolchain.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2022-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n#ifndef MCUXCLCORE_TOOLCHAIN_H_\r\n#define MCUXCLCORE_TOOLCHAIN_H_\r\n\r\n#include <mcuxClCore_Platform.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxCl_Core_Swap64)\r\nstatic inline uint64_t mcuxCl_Core_Swap64(uint64_t value)\r\n{\r\n    return __builtin_bswap64(value);\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxCl_Core_Swap32)\r\nstatic inline uint32_t mcuxCl_Core_Swap32(uint32_t value)\r\n{\r\n    return __builtin_bswap32(value);\r\n}\r\n\r\n\r\n#endif /* MCUXCLCORE_TOOLCHAIN_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/inc/internal/mcuxClEls_Internal.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClEls_Internal.h\r\n *  @brief Provide macros for mcuxClEls internal use.\r\n * This header declares internal macros to deduplicate code and support for internal use only. */\r\n\r\n#ifndef MCUXCLELS_INTERNAL_H_\r\n#define MCUXCLELS_INTERNAL_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n#include <platform_specific_headers.h>\r\n#include <stdint.h>\r\n#include <stdbool.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n\r\n#include <internal/mcuxClEls_Internal_mapping.h>\r\n#include <internal/mcuxClEls_SfrAccess.h>\r\n#include <mcuxCsslAnalysis.h>\r\n#include <mcuxClEls_Common.h>\r\n#include <mcuxClEls_Types.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/****                                ****/\r\n/**** ELS Hardware Abstraction Layer ****/\r\n/****                                ****/\r\n\r\n\r\n/** Asserts the correctness of the supplied parameters*/\r\n#define MCUXCLELS_INPUT_PARAM_CHECK(x_) if((x_)) { return MCUXCLELS_STATUS_SW_INVALID_PARAM; }\r\n#define MCUXCLELS_INPUT_PARAM_CHECK_PROTECTED(funcid, x_)                         \\\r\ndo                                                                              \\\r\n{                                                                               \\\r\n    if ((x_))                                                                    \\\r\n    {                                                                           \\\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(funcid, MCUXCLELS_STATUS_SW_INVALID_PARAM);    \\\r\n    }                                                                           \\\r\nMCUX_CSSL_ANALYSIS_START_SUPPRESS_BOOLEAN_TYPE_FOR_CONDITIONAL_EXPRESSION()      \\\r\n} while (false)                                                                 \\\r\nMCUX_CSSL_ANALYSIS_STOP_SUPPRESS_BOOLEAN_TYPE_FOR_CONDITIONAL_EXPRESSION()\r\n\r\n#define ELS_CMD_BIG_ENDIAN ((uint8_t) 0x01U)    ///< ELS command option specifying big-endian byte order\r\n#define ELS_CMD_LITTLE_ENDIAN ((uint8_t) 0x00U) ///< ELS command option specifying little-endian byte order\r\n\r\n// Utility code of mcuxClEls implementation\r\n\r\n/** Sets the variable-size input buffer from which the input 0 of the ELS operation will be transferred via DMA. */\r\nstatic inline void mcuxClEls_setInput0(const uint8_t *pInput, uint32_t inputSize)\r\n{\r\n    MCUXCLELS_SFR_WRITE(ELS_DMA_SRC0,     (uint32_t) pInput);\r\n    MCUXCLELS_SFR_WRITE(ELS_DMA_SRC0_LEN, inputSize);\r\n}\r\n\r\n/** Sets the fixed-size input buffer from which the input 0 of the ELS operation will be transferred via DMA. */\r\nstatic inline void mcuxClEls_setInput0_fixedSize(const uint8_t *pInput)\r\n{\r\n    MCUXCLELS_SFR_WRITE(ELS_DMA_SRC0, (uint32_t) pInput);\r\n}\r\n\r\n/** Sets the fixed-size input buffer from which the input 1 of the ELS operation will be transferred via DMA. */\r\nstatic inline void mcuxClEls_setInput1_fixedSize(const uint8_t *pInput)\r\n{\r\n    MCUXCLELS_SFR_WRITE(ELS_DMA_SRC1, (uint32_t) pInput);\r\n}\r\n\r\n/** Sets the variable-size input buffer from which the input 2 of the ELS operation will be transferred via DMA. */\r\nstatic inline void mcuxClEls_setInput2(const uint8_t *pInput, uint32_t inputSize)\r\n{\r\n    MCUXCLELS_SFR_WRITE(ELS_DMA_SRC2,     (uint32_t) pInput);\r\n    MCUXCLELS_SFR_WRITE(ELS_DMA_SRC2_LEN, inputSize);\r\n}\r\n\r\n/** Sets the fixed-size input buffer from which the input 2 of the ELS operation will be transferred via DMA. */\r\nstatic inline void mcuxClEls_setInput2_fixedSize(const uint8_t * pInput)\r\n{\r\n    MCUXCLELS_SFR_WRITE(ELS_DMA_SRC2, (uint32_t) pInput);\r\n}\r\n\r\n/** Sets the variable-size output buffer to which the result of the ELS operation will be transferred via DMA. */\r\nstatic inline void mcuxClEls_setOutput(uint8_t *pOutput, uint32_t outputSize)\r\n{\r\n    MCUXCLELS_SFR_WRITE(ELS_DMA_RES0,     (uint32_t) pOutput);\r\n    MCUXCLELS_SFR_WRITE(ELS_DMA_RES0_LEN, outputSize);\r\n}\r\n\r\n/** Sets the output buffer to which the result of the ELS operation will be transferred via DMA. */\r\nstatic inline void mcuxClEls_setOutput_fixedSize(uint8_t *pOutput)\r\n{\r\n    MCUXCLELS_SFR_WRITE(ELS_DMA_RES0, (uint32_t) pOutput);\r\n}\r\n\r\n/** Sets the ELS keystore index 0, for commands that access a single key. */\r\nstatic inline void mcuxClEls_setKeystoreIndex0(uint32_t index)\r\n{\r\n    MCUXCLELS_SFR_WRITE(ELS_KIDX0, index);\r\n}\r\n\r\n\r\n/** Sets the ELS keystore index 1, for commands that access 2 keys. */\r\nstatic inline void mcuxClEls_setKeystoreIndex1(uint32_t index)\r\n{\r\n    MCUXCLELS_SFR_WRITE(ELS_KIDX1, index);\r\n}\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n/** Sets the ELS keystore index 2, for commands that access 3 keys. */\r\nstatic inline void mcuxClEls_setKeystoreIndex2(uint32_t index)\r\n{\r\n    MCUXCLELS_SFR_WRITE(ELS_KIDX2, index);\r\n}\r\n#endif /* MCUXCL_FEATURE_ELS_PUK_INTERNAL */\r\n\r\n/** Sets the ELS requested key properties, for commands that create a key. */\r\nstatic inline void mcuxClEls_setRequestedKeyProperties(uint32_t properties)\r\n{\r\n    MCUXCLELS_SFR_WRITE(ELS_KPROPIN, properties);\r\n}\r\n\r\n/** Starts an ELS command. */\r\nstatic inline void mcuxClEls_startCommand(uint32_t command, uint32_t cmdcfg0, uint32_t byteOrder)\r\n{\r\n    uint32_t ctrl = MCUXCLELS_SFR_FIELD_FORMAT(ELS_CTRL, ELS_CMD, command)\r\n                    | MCUXCLELS_SFR_FIELD_FORMAT(ELS_CTRL, ELS_START, 1u)\r\n                    | MCUXCLELS_SFR_FIELD_FORMAT(ELS_CTRL, ELS_EN, 1u)\r\n                    | MCUXCLELS_SFR_FIELD_FORMAT(ELS_CTRL, BYTE_ORDER, byteOrder);\r\n\r\n    MCUXCLELS_SFR_WRITE(ELS_CMDCFG0, cmdcfg0);\r\n    MCUXCLELS_SFR_WRITE(ELS_CTRL,    ctrl);\r\n}\r\n\r\n\r\n/** Gets a specific field in the given SFR value, according to the given mask and shift value.\r\n *  @retval @c value of the requested field in the given ELS SFR value */\r\nstatic inline uint32_t mcuxClEls_getSfrField(uint32_t sfrValue, uint32_t mask, uint32_t shift)\r\n{\r\n    return ((uint32_t)(sfrValue & mask) >> shift);\r\n}\r\n\r\n/** Set a specific field in the given SFR value, according to the given mask and shift value.\r\n  * The unrelated fields/bits will not be changed */\r\nstatic inline void mcuxClEls_setSfrField(volatile uint32_t *pSfr, uint32_t value, uint32_t mask, uint32_t shift)\r\n{\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_HARDWARE_ACCESS(\"Sfr offset from address\")\r\n\t/* get the current value of the SFR and clear the bits that will be set */\r\n  uint32_t sfrValue = *pSfr & (~mask);\r\n\t/* set the bits and re-write the full value to the SFR */\r\n  *pSfr = sfrValue | (((uint32_t)(value << shift)) & mask);\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_HARDWARE_ACCESS()\r\n}\r\n\r\n/** Tests if the ELS is in BUSY state.\r\n *  @retval @c true if the ELS is in BUSY state */\r\nstatic inline bool mcuxClEls_isBusy(void)\r\n{\r\n    return (0u != MCUXCLELS_SFR_BITREAD(ELS_STATUS, ELS_BUSY) );\r\n}\r\n\r\n\r\n/** Macros to access the bit fields for the ELS_STATUS SFR */\r\n#define MCUXCLELS_SFR_STATUS_ELS_BUSY            ELS_BUSY\r\n#define MCUXCLELS_SFR_STATUS_ELS_IRQ             ELS_IRQ\r\n#define MCUXCLELS_SFR_STATUS_ELS_ERR             ELS_ERR\r\n#define MCUXCLELS_SFR_STATUS_PRNG_RDY            PRNG_RDY\r\n#define MCUXCLELS_SFR_STATUS_ECDSA_VFY_STATUS    ECDSA_VFY_STATUS\r\n#define MCUXCLELS_SFR_STATUS_PPROT               PPROT\r\n#define MCUXCLELS_SFR_STATUS_DRBG_ENT_LVL        DRBG_ENT_LVL\r\n#define MCUXCLELS_SFR_STATUS_DTRNG_BUSY          DTRNG_BUSY\r\n#define MCUXCLELS_SFR_STATUS_ELS_LOCKED          ELS_LOCKED\r\n\r\n/** Gets a specific field in the ELS_STATUS SFR.\r\n *  @param field: Any field name in MCUXCLELS_SFR_STATUS_* */\r\n#define MCUXCLELS_GET_STATUS_FIELD(field) \\\r\n  mcuxClEls_getSfrField(MCUXCLELS_SFR_READ(ELS_STATUS), MCUXCLELS_SFR_FIELD_MASK(ELS_STATUS, field), MCUXCLELS_SFR_FIELD_SHIFT(ELS_STATUS, field))\r\n\r\n\r\n/** Macros to access the bit fields for the ELS_CTRL SFR */\r\n#define MCUXCLELS_SFR_CTRL_ELS_EN                ELS_EN\r\n#define MCUXCLELS_SFR_CTRL_START                 ELS_START\r\n#define MCUXCLELS_SFR_CTRL_RESET                 ELS_RESET\r\n#define MCUXCLELS_SFR_CTRL_CMD                   ELS_CMD\r\n#define MCUXCLELS_SFR_CTRL_BYTE_ORDER            BYTE_ORDER\r\n\r\n/** Gets a specific field in the ELS_CTRL SFR.\r\n *  @param field: Any field name in MCUXCLELS_SFR_CTRL_* */\r\n#define MCUXCLELS_GET_CTRL_FIELD(field) \\\r\n  mcuxClEls_getSfrField(MCUXCLELS_SFR_READ(ELS_CTRL), MCUXCLELS_SFR_FIELD_MASK(ELS_CTRL, field), MCUXCLELS_SFR_FIELD_SHIFT(ELS_CTRL, field))\r\n\r\n/** Sets a specific field in the ELS_CTRL SFR. The unrelated fields/bits will not be changed\r\n *  @param field: Any field name in MCUXCLELS_SFR_CTRL_*\r\n *  @param value: The value to set the requested SFR field to */\r\n#define MCUXCLELS_SET_CTRL_FIELD(field, value) \\\r\n  mcuxClEls_setSfrField(&MCUXCLELS_SFR_READ(ELS_CTRL), (value), MCUXCLELS_SFR_FIELD_MASK(ELS_CTRL, field), MCUXCLELS_SFR_FIELD_SHIFT(ELS_CTRL, field))\r\n\r\n\r\n/** Macros to access the bit fields for the ELS_CFG SFR */\r\n#define MCUXCLELS_SFR_CFG_ADCTRL                 ADCTRL\r\n#define MCUXCLELS_SFR_CFG_SHA2_DIRECT            SHA2_DIRECT\r\n\r\n/** Gets a specific field in the ELS_CFG SFR.\r\n *  @param field: Any field name in MCUXCLELS_SFR_CFG_* */\r\n#define MCUXCLELS_GET_CFG_FIELD(field) \\\r\n  mcuxClEls_getSfrField(MCUXCLELS_SFR_READ(ELS_CFG), MCUXCLELS_SFR_FIELD_MASK(ELS_CFG, field), MCUXCLELS_SFR_FIELD_SHIFT(ELS_CFG, field))\r\n\r\n/** Sets a specific field in the ELS_CFG SFR. The unrelated fields/bits will not be changed\r\n *  @param field: Any field name in MCUXCLELS_SFR_CFG_*\r\n *  @param value: The value to set the requested SFR field to */\r\n#define MCUXCLELS_SET_CFG_FIELD(field, value) \\\r\n  mcuxClEls_setSfrField(&MCUXCLELS_SFR_READ(ELS_CFG), (value), MCUXCLELS_SFR_FIELD_MASK(ELS_CFG, field), MCUXCLELS_SFR_FIELD_SHIFT(ELS_CFG, field))\r\n\r\n\r\n/** Macros to access the bit fields for the ELS_ERR_STATUS SFR */\r\n#define MCUXCLELS_SFR_ERR_STATUS_BUS_ERR         BUS_ERR\r\n#define MCUXCLELS_SFR_ERR_STATUS_OPN_ERR         OPN_ERR\r\n#define MCUXCLELS_SFR_ERR_STATUS_ALG_ERR         ALG_ERR\r\n#define MCUXCLELS_SFR_ERR_STATUS_ITG_ERR         ITG_ERR\r\n#define MCUXCLELS_SFR_ERR_STATUS_FLT_ERR         FLT_ERR\r\n#define MCUXCLELS_SFR_ERR_STATUS_PRNG_ERR        PRNG_ERR\r\n#define MCUXCLELS_SFR_ERR_STATUS_ERR_LVL         ERR_LVL\r\n#define MCUXCLELS_SFR_ERR_STATUS_DTRNG_ERR       DTRNG_ERR\r\n\r\n/** Gets a specific field in the ELS_ERR_STATUS SFR.\r\n *  @param field: Any field name in MCUXCLELS_SFR_ERR_STATUS_* */\r\n#define MCUXCLELS_GET_ERROR_STATUS_FIELD(field) \\\r\n  mcuxClEls_getSfrField(MCUXCLELS_SFR_READ(ELS_ERR_STATUS), MCUXCLELS_SFR_FIELD_MASK(ELS_ERR_STATUS, field), MCUXCLELS_SFR_FIELD_SHIFT(ELS_ERR_STATUS, field))\r\n\r\n/** Checks if a specific error bit in the ELS_ERR_STATUS SFR is set.\r\n *  @retval @c true if the requested ELS error status bit is set */\r\n#define MCUXCLELS_IS_ERROR_BIT_SET(field) \\\r\n    (1u == MCUXCLELS_GET_ERROR_STATUS_FIELD(field))\r\n\r\n\r\n/** Macros to access the bit fields for the ELS_CMDCRC_CTRL SFR */\r\n#define MCUXCLELS_SFR_CMDCRC_CTRL_CMDCRC_RST     CMDCRC_RST\r\n#define MCUXCLELS_SFR_CMDCRC_CTRL_CMDCRC_EN      CMDCRC_EN\r\n\r\n/** Sets a specific field in the ELS_CMDCRC_CTRL SFR. The unrelated fields/bits will not be changed\r\n *  @param field: Any field name in MCUXCLELS_SFR_CMDCRC_CTRL_*\r\n *  @param value: The value to set the requested SFR field to */\r\n#define MCUXCLELS_SET_CMDCRC_CTRL_FIELD(field, value) \\\r\n  mcuxClEls_setSfrField(&MCUXCLELS_SFR_READ(ELS_CMDCRC_CTRL), (value), MCUXCLELS_SFR_FIELD_MASK(ELS_CMDCRC_CTRL, field), MCUXCLELS_SFR_FIELD_SHIFT(ELS_CMDCRC_CTRL, field))\r\n\r\n/** Macros to access the bit fields for the ELS_SHA2_CTRL SFR */\r\n#define MCUXCLELS_SFR_SHA2_CTRL_SHA2_START       SHA2_START\r\n#define MCUXCLELS_SFR_SHA2_CTRL_SHA2_RST         SHA2_RST\r\n#define MCUXCLELS_SFR_SHA2_CTRL_SHA2_INIT        SHA2_INIT\r\n#define MCUXCLELS_SFR_SHA2_CTRL_SHA2_LOAD        SHA2_LOAD\r\n#define MCUXCLELS_SFR_SHA2_CTRL_SHA2_MODE        SHA2_MODE\r\n#define MCUXCLELS_SFR_SHA2_CTRL_SHA2_BYTE_ORDER  SHA2_BYTE_ORDER\r\n\r\n/** Gets a specific field in the ELS_SHA2_CTRL SFR.\r\n *  @param field: Any field name in MCUXCLELS_SFR_SHA2_CTRL_* */\r\n#define MCUXCLELS_GET_SHA2_CTRL_FIELD(field) \\\r\n  mcuxClEls_getSfrField(MCUXCLELS_SFR_READ(ELS_SHA2_CTRL), MCUXCLELS_SFR_FIELD_MASK(ELS_SHA2_CTRL, field), MCUXCLELS_SFR_FIELD_SHIFT(ELS_SHA2_CTRL, field))\r\n\r\n/** Sets a specific field in the ELS_SHA2_CTRL SFR. The unrelated fields/bits will not be changed\r\n *  @param field: Any field name in MCUXCLELS_SFR_SHA2_CTRL_*\r\n *  @param value: The value to set the requested SFR field to */\r\n#define MCUXCLELS_SET_SHA2_CTRL_FIELD(field, value) \\\r\n  mcuxClEls_setSfrField(&MCUXCLELS_SFR_READ(ELS_SHA2_CTRL), (value), MCUXCLELS_SFR_FIELD_MASK(ELS_SHA2_CTRL, field), MCUXCLELS_SFR_FIELD_SHIFT(ELS_SHA2_CTRL, field))\r\n\r\n\r\n/** Macro to access the bit fields for the ELS_SHA2_STATUS SFR */\r\n#define MCUXCLELS_SFR_SHA2_STATUS_SHA2_BUSY      SHA2_BUSY\r\n\r\n/** Gets a specific field in the ELS_SHA2_STATUS SFR.\r\n *  @param field: Any field name in MCUXCLELS_SFR_SHA2_STATUS_* */\r\n#define MCUXCLELS_GET_SHA2_STATUS_FIELD(field) \\\r\n  mcuxClEls_getSfrField(MCUXCLELS_SFR_READ(ELS_SHA2_STATUS), MCUXCLELS_SFR_FIELD_MASK(ELS_SHA2_STATUS, field), MCUXCLELS_SFR_FIELD_SHIFT(ELS_SHA2_STATUS, field))\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_GLITCHDETECTOR\r\n/**\r\n * Macros to access the bit fields for the ELS_GDET_EVTCNT SFR\r\n * */\r\n#define MCUXCLELS_SFR_GDET_EVTCNT_GDET_EVTCNT            GDET_EVTCNT\r\n#define MCUXCLELS_SFR_GDET_EVTCNT_GDET_EVTCNT_CLR_DONE   GDET_EVTCNT_CLR_DONE\r\n\r\n/** Gets a specific field in ELS_GDET_EVTCNT SFR.\r\n *  @param field: Any field name in MCUXCLELS_SFR_GDET_EVTCNT_* */\r\n#define MCUXCLELS_GET_GDET_EVTCNT_FIELD(field) \\\r\n  mcuxClEls_getSfrField(MCUXCLELS_SFR_READ(ELS_GDET_EVTCNT), MCUXCLELS_SFR_FIELD_MASK(ELS_GDET_EVTCNT, field), MCUXCLELS_SFR_FIELD_SHIFT(ELS_GDET_EVTCNT, field))\r\n\r\n#endif /* MCUXCL_FEATURE_ELS_GLITCHDETECTOR */\r\n\r\n/** Macros to access the bit fields for the ELS_INT_ENABLE SFR */\r\n#define MCUXCLELS_SFR_INT_ENABLE_INT_EN           INT_EN\r\n#ifdef MCUXCL_FEATURE_ELS_GLITCHDETECTOR\r\n#define MCUXCLELS_SFR_INT_ENABLE_GDET_INT_EN      GDET_INT_EN\r\n#endif /* MCUXCL_FEATURE_ELS_GLITCHDETECTOR */\r\n\r\n/** Gets a specific field in the ELS_INT_ENABLE SFR.\r\n *  @param field: Any field name in MCUXCLELS_SFR_INT_ENABLE_* */\r\n#define MCUXCLELS_GET_INT_ENABLE_FIELD(field) \\\r\n  mcuxClEls_getSfrField(MCUXCLELS_SFR_READ(ELS_INT_ENABLE), MCUXCLELS_SFR_FIELD_MASK(ELS_INT_ENABLE, field), MCUXCLELS_SFR_FIELD_SHIFT(ELS_INT_ENABLE, field))\r\n\r\n\r\n/* Total buffer size in output, which is used for cache maintenance */\r\n#define MCUXCLELS_HASH_BUFFER_SIZE(options)  MCUXCLELS_HASH_BUFFER_SIZE_DIGEST(options) +  MCUXCLELS_HASH_BUFFER_SIZE_RTF(options)\r\n#define MCUXCLELS_HASH_BUFFER_SIZE_RTF(options) ( (MCUXCLELS_HASH_RTF_OUTPUT_ENABLE == options.bits.rtfoe) ? MCUXCLELS_HASH_RTF_OUTPUT_SIZE : 0u )\r\n#define MCUXCLELS_HASH_BUFFER_SIZE_DIGEST(options) ( (1u < options.bits.hashmd) ? MCUXCLELS_HASH_OUTPUT_SIZE_SHA_512 : MCUXCLELS_HASH_OUTPUT_SIZE_SHA_256 )\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_ITERATIVE_SEEDING\r\nextern uint32_t mcuxClEls_rng_drbg_block_counter;\r\n\r\n#define MCUXCLELS_RNG_DRBG_ITERATIVE_SEEDING_ITERATIONS  8u\r\n#define MCUXCLELS_RNG_DRBG_BLOCK_COUNTER_THRESHOLD       4096u\r\n#define MCUXCLELS_RNG_DRBG_ECCKEYGEN_INCREASE            10u\r\n#define MCUXCLELS_RNG_DRBG_ECCSIGN_INCREASE              14u\r\n#define MCUXCLELS_RNG_DRBG_ECCVERIFY_INCREASE            5u\r\n#define MCUXCLELS_RNG_DRBG_KEYDELETE128_INCREASE         4u\r\n#define MCUXCLELS_RNG_DRBG_KEYDELETE256_INCREASE         6u\r\n#define MCUXCLELS_RNG_DRBG_DRBGREQUEST_INCREASE(outputLength) ((outputLength + 15u) / 16u)\r\n\r\n/**\r\n * @brief This function resets the internal ELS DRBG block counter and reseeds the ELS DRBG\r\n *        using the iterative reseeding procedure\r\n *\r\n * @retval #MCUXCLELS_STATUS_SW_FAULT            if a failure occurred\r\n * @retval #MCUXCLELS_STATUS_OK                  on successful operation\r\n */\r\nMCUX_CSSL_ANALYSIS_START_PATTERN_DESCRIPTIVE_IDENTIFIER()\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Dtrng_IterativeReseeding_Reseed)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Dtrng_IterativeReseeding_Reseed(const uint8_t *pDtrngConfig);\r\nMCUX_CSSL_ANALYSIS_STOP_PATTERN_DESCRIPTIVE_IDENTIFIER()\r\n#endif /* MCUXCL_FEATURE_ELS_ITERATIVE_SEEDING */\r\n\r\n\r\n/**\r\n * @brief This function provides error handling for mcuxClEls_KeyExport_Async function\r\n *\r\n * @param[in]   pOutput              The memory address of the exported key which will be cleared\r\n * @param[in]   keyLength            The key length which will be cleared\r\n * @param[in]   interrupt_state_old  The interrupts state which will be restored\r\n *\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_handleKeyExportError)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_handleKeyExportError(uint8_t *pOutput, size_t keyLength, mcuxClEls_InterruptOptionEn_t interrupt_state_old);\r\n\r\n/* Functional macro to check for ELS Level 1 errors */\r\n#define MCUXCLELS_LEVEL1_ERROR(returnCode) (MCUXCLELS_STATUS_HW_OPERATIONAL == (returnCode)) || (MCUXCLELS_STATUS_HW_ALGORITHM == (returnCode)) || (MCUXCLELS_STATUS_HW_BUS == (returnCode))\r\n\r\n/** read from ELS PRNG SFR. */\r\nstatic inline uint32_t mcuxClEls_readPrngOut(void)\r\n{\r\n    return MCUXCLELS_SFR_READ(ELS_PRNG_DATOUT); \r\n}\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLELS_INTERNAL_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/inc/internal/mcuxClEls_Internal_Common.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxClEls_Internal_Common.h\r\n * @brief ELS header for common internal functionality.\r\n */\r\n\r\n#ifndef MCUXCLELS_INTERNAL_COMMON_H_\r\n#define MCUXCLELS_INTERNAL_COMMON_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n#include <mcuxClEls_Common.h> // Common types\r\n#include <platform_specific_headers.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n\r\n/**********************************************\r\n * CONSTANTS\r\n **********************************************/\r\n\r\n/**\r\n * @def MCUXCLELS_HW_VERSION\r\n * @ingroup mcuxClEls_Common\r\n * @brief Compatible ELS hardware IP version for the CLNS release that this header is part of.\r\n */\r\n#ifndef MCUXCL_FEATURE_ELS_GET_FW_VERSION\r\n#define MCUXCLELS_HW_VERSION ((mcuxClEls_HwVersion_t) { \\\r\n        .bits = { \\\r\n            .revision = (uint32_t) ELS_HW_VERSION_REVISION, \\\r\n            .minor = (uint32_t) ELS_HW_VERSION_MINOR, \\\r\n            .major = (uint32_t) ELS_HW_VERSION_MAJOR, \\\r\n            .level = (uint32_t) ELS_HW_VERSION_LEVEL \\\r\n        } \\\r\n    })\r\n#else /* MCUXCL_FEATURE_ELS_GET_FW_VERSION */\r\n#define MCUXCLELS_HW_VERSION ((mcuxClEls_HwVersion_t) { \\\r\n        .bits = { \\\r\n            .revision = (uint32_t) ELS_HW_VERSION_REVISION, \\\r\n            .minor = (uint32_t) ELS_HW_VERSION_MINOR, \\\r\n            .major = (uint32_t) ELS_HW_VERSION_MAJOR, \\\r\n            .fw_revision = (uint32_t) ELS_HW_VERSION_FW_REVISION, \\\r\n            .fw_minor = (uint32_t) ELS_HW_VERSION_FW_MINOR, \\\r\n            .fw_major = (uint32_t) ELS_HW_VERSION_FW_MAJOR \\\r\n        } \\\r\n    })\r\n#endif /* MCUXCL_FEATURE_ELS_GET_FW_VERSION */\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLELS_INTERNAL_COMMON_H_ */\r\n\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/inc/internal/mcuxClEls_Internal_mapping.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2022 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxClEls_Internal_mapping.h\r\n * @brief Header providing mapping for legacy definitions (with CSS)\r\n */\r\n\r\n#ifndef MCUXCLELS_INTERNAL_MAPPING_H_\r\n#define MCUXCLELS_INTERNAL_MAPPING_H_\r\n\r\n#if !defined(ELS_KS_CNT)\r\n#define ELS_KS_CNT  CSS_KS_CNT\r\n#endif\r\n\r\n#if !defined(ID_CFG_ELS_CMD_AUTH_CIPHER)\r\n#define ID_CFG_ELS_CMD_AUTH_CIPHER  ID_CFG_CSS_CMD_AUTH_CIPHER\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_CHAL_RESP_GEN)\r\n#define ID_CFG_ELS_CMD_CHAL_RESP_GEN  ID_CFG_CSS_CMD_CHAL_RESP_GEN\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_CIPHER)\r\n#define ID_CFG_ELS_CMD_CIPHER  ID_CFG_CSS_CMD_CIPHER\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_CKDF)\r\n#define ID_CFG_ELS_CMD_CKDF  ID_CFG_CSS_CMD_CKDF\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_CMAC)\r\n#define ID_CFG_ELS_CMD_CMAC  ID_CFG_CSS_CMD_CMAC\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_DRBG_TEST)\r\n#define ID_CFG_ELS_CMD_DRBG_TEST  ID_CFG_CSS_CMD_DRBG_TEST\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_DTRNG_CFG_LOAD)\r\n#define ID_CFG_ELS_CMD_DTRNG_CFG_LOAD  ID_CFG_CSS_CMD_DTRNG_CFG_LOAD\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_DTRNG_EVAL)\r\n#define ID_CFG_ELS_CMD_DTRNG_EVAL  ID_CFG_CSS_CMD_DTRNG_EVAL\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_DTRNG_PRVL_CFG_LOAD)\r\n#define ID_CFG_ELS_CMD_DTRNG_PRVL_CFG_LOAD  ID_CFG_CSS_CMD_DTRNG_PRVL_CFG_LOAD\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_ECKXH)\r\n#define ID_CFG_ELS_CMD_ECKXH  ID_CFG_CSS_CMD_ECKXH\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_ECSIGN)\r\n#define ID_CFG_ELS_CMD_ECSIGN  ID_CFG_CSS_CMD_ECSIGN\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_ECVFY)\r\n#define ID_CFG_ELS_CMD_ECVFY  ID_CFG_CSS_CMD_ECVFY\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_GDET_CFG_LOAD)\r\n#define ID_CFG_ELS_CMD_GDET_CFG_LOAD  ID_CFG_CSS_CMD_GDET_CFG_LOAD\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_GDET_TRIM)\r\n#define ID_CFG_ELS_CMD_GDET_TRIM  ID_CFG_CSS_CMD_GDET_TRIM\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_HASH)\r\n#define ID_CFG_ELS_CMD_HASH  ID_CFG_CSS_CMD_HASH\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_HKDF)\r\n#define ID_CFG_ELS_CMD_HKDF  ID_CFG_CSS_CMD_HKDF\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_HMAC)\r\n#define ID_CFG_ELS_CMD_HMAC  ID_CFG_CSS_CMD_HMAC\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_KDELETE)\r\n#define ID_CFG_ELS_CMD_KDELETE  ID_CFG_CSS_CMD_KDELETE\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_KEYGEN)\r\n#define ID_CFG_ELS_CMD_KEYGEN  ID_CFG_CSS_CMD_KEYGEN\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_KEYIN)\r\n#define ID_CFG_ELS_CMD_KEYIN  ID_CFG_CSS_CMD_KEYIN\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_KEYOUT)\r\n#define ID_CFG_ELS_CMD_KEYOUT  ID_CFG_CSS_CMD_KEYOUT\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_KEYPROV)\r\n#define ID_CFG_ELS_CMD_KEYPROV  ID_CFG_CSS_CMD_KEYPROV\r\n#endif\r\n#if !defined(ID_CFG_ELS_CMD_TLS)\r\n#define ID_CFG_ELS_CMD_TLS  ID_CFG_CSS_CMD_TLS\r\n#endif\r\n\r\n#if (!defined(ID_CFG_ELS_CMD_RND_REQ)) && defined(ID_CFG_CSS_CMD_RND_REQ)\r\n#define ID_CFG_ELS_CMD_RND_REQ  ID_CFG_CSS_CMD_RND_REQ\r\n#endif\r\n\r\n#if (!defined(ID_CFG_ELS_CMD_DRBG_REQ)) && defined(ID_CFG_CSS_CMD_DRBG_REQ)\r\n#define ID_CFG_ELS_CMD_DRBG_REQ  ID_CFG_CSS_CMD_DRBG_REQ\r\n#endif\r\n\r\n\r\n#endif /* MCUXCLELS_INTERNAL_MAPPING_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/inc/internal/mcuxClEls_SfrAccess.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2022-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClEls_SfrAccess.h\r\n *  @brief Provide macros for mcuxClEls internal use.\r\n * This header declares internal macros to deduplicate code and support for internal use only. */\r\n\r\n#ifndef MCUXCLELS_SFRACCESS_H_\r\n#define MCUXCLELS_SFRACCESS_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n#include <platform_specific_headers.h>\r\n#include <stdint.h>\r\n#include <stdbool.h>\r\n\r\n#include <internal/mcuxClEls_Internal_mapping.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/****                                ****/\r\n/**** ELS Hardware Abstraction Layer ****/\r\n/****                                ****/\r\n\r\n/**\r\n * Definitions for accessing ELS SFRs via, e.g., IP_ELS->STATUS.\r\n */\r\n\r\n/** Helper macros for constructing SFR field name constants */\r\n#define MCUXCLELS_PASTE(a,b)  a ## b\r\n#define MCUXCLELS_CONCAT(a,b) MCUXCLELS_PASTE(a,b)\r\n#define MCUXCLELS_SFR_FIELD(prefix,sfr,field)        MCUXCLELS_CONCAT(prefix, sfr ## _ ## field)\r\n\r\n/** Helper macros to get the mask and shift values for a specific ELS SFR field */\r\n#define MCUXCLELS_SFR_FIELD_MASK(sfr, field)         MCUXCLELS_CONCAT(MCUXCLELS_SFR_FIELD(ELS_SFR_PREFIX,sfr,field), _MASK)\r\n#define MCUXCLELS_SFR_FIELD_SHIFT(sfr, field)        MCUXCLELS_CONCAT(MCUXCLELS_SFR_FIELD(ELS_SFR_PREFIX,sfr,field), _SHIFT)\r\n#define MCUXCLELS_SFR_FIELD_FORMAT(sfr, field, val)  (MCUXCLELS_SFR_FIELD(ELS_SFR_PREFIX,sfr,field) (val))\r\n\r\n/**********************************************************/\r\n/* Helper macros for ELS SFR access                       */\r\n/**********************************************************/\r\n\r\n/** Read from ELS SFR */\r\n#define MCUXCLELS_SFR_READ(sfr)  (ELS_SFR_BASE->ELS_SFR_NAME(sfr))\r\n\r\n/** Write to ELS SFR */\r\n#define MCUXCLELS_SFR_WRITE(sfr, value)                                                  \\\r\n    do{                                                                                 \\\r\n        MCUX_CSSL_ANALYSIS_START_SUPPRESS_HARDWARE_ACCESS(\"Sfr offset from address\")    \\\r\n        ELS_SFR_BASE->ELS_SFR_NAME(sfr) = (value);                                      \\\r\n        MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_HARDWARE_ACCESS()                              \\\r\n    } while(false)\r\n\r\n/** Read from ELS SFR bit field */\r\n#define MCUXCLELS_SFR_BITREAD(sfr, bit)  \\\r\n    ((ELS_SFR_BASE->ELS_SFR_NAME(sfr) & MCUXCLELS_SFR_FIELD_MASK(sfr, bit)) >> MCUXCLELS_SFR_FIELD_SHIFT(sfr, bit))\r\n\r\n/** Set bit field of ELS SFR (read-modify-write) */\r\n#define MCUXCLELS_SFR_BITSET(sfr, bit)  \\\r\n    do{ ELS_SFR_BASE->ELS_SFR_NAME(sfr) |= MCUXCLELS_SFR_FIELD_MASK(sfr, bit); } while(false)\r\n\r\n/** Clear bit field of ELS SFR (read-modify-write) */\r\n#define MCUXCLELS_SFR_BITCLEAR(sfr, bit)  \\\r\n    do{ ELS_SFR_BASE->ELS_SFR_NAME(sfr) &= (~ (uint32_t) MCUXCLELS_SFR_FIELD_MASK(sfr, bit)); } while(false)\r\n\r\n/** Set value of multi-bit field of ELS SFR (read-modify-write) */\r\n#define MCUXCLELS_SFR_BITVALSET(sfr, bit, val)  \\\r\n    do{                                                                                                                             \\\r\n        uint32_t temp = ELS_SFR_BASE->ELS_SFR_NAME(sfr) & (~ (uint32_t) MCUXCLELS_SFR_FIELD_MASK(sfr, bit));                         \\\r\n        MCUX_CSSL_ANALYSIS_START_SUPPRESS_HARDWARE_ACCESS(\"Sfr offset from address\")                                                \\\r\n        ELS_SFR_BASE->ELS_SFR_NAME(sfr) = temp | ((val) << MCUXCLELS_SFR_FIELD_SHIFT(sfr, bit)) & MCUXCLELS_SFR_FIELD_MASK(sfr, bit); \\\r\n        MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_HARDWARE_ACCESS()                                                                          \\\r\n    } while(false)\r\n\r\n/**** ------------------------------ ****/\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLELS_SFRACCESS_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/inc/mcuxClEls.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020, 2022 NXP                                                 */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxClEls.h\r\n * @brief Top-level include file for the ELS driver\r\n *\r\n * This includes headers for all of the functionality provided by the ELS IP.\r\n *\r\n * @defgroup mcuxClEls mcuxClEls\r\n * @brief ELS driver\r\n *\r\n * This component abstracts the hardware access to the ELS IP.\r\n * The library exposes the following hardware functionality:\r\n * <ol>\r\n *      <li> COMMON\r\n *          <ul>\r\n *              <li> Determine information of the underlying ELS hardware IP\r\n *                  <ul> <li> #mcuxClEls_GetHwVersion </ul>\r\n *                  @if MCUXCL_FEATURE_ELS_HWCONFIG\r\n *                  <ul> <li> #mcuxClEls_GetHwConfig </ul>\r\n *                  @endif\r\n *                  <ul> <li> #mcuxClEls_GetHwState </ul>\r\n *              <li> ELS enabling, disabling, and software reset\r\n *                  <ul> <li> #mcuxClEls_Enable_Async </ul>\r\n *                  <ul> <li> #mcuxClEls_Reset_Async </ul>\r\n *                  <ul> <li> #mcuxClEls_Disable </ul>\r\n *              <li> Interrupt management\r\n *                  <ul> <li> #mcuxClEls_SetIntEnableFlags </ul>\r\n *                  <ul> <li> #mcuxClEls_GetIntEnableFlags </ul>\r\n *                  <ul> <li> #mcuxClEls_ResetIntFlags </ul>\r\n *                  <ul> <li> #mcuxClEls_SetIntFlags </ul>\r\n *              <li> Wait for completion of an ELS operation\r\n *                  <ul> <li> #mcuxClEls_WaitForOperation </ul>\r\n *                  <ul> <li> #mcuxClEls_LimitedWaitForOperation </ul>\r\n *              <li> Error handling\r\n *                  <ul> <li> #mcuxClEls_ResetErrorFlags </ul>\r\n *                  <ul> <li> #mcuxClEls_GetErrorCode </ul>\r\n *                  <ul> <li> #mcuxClEls_GetErrorLevel </ul>\r\n *              <li> Random delay feature for AES based operations\r\n *                  <ul> <li> #mcuxClEls_SetRandomStartDelay </ul>\r\n *                  <ul> <li> #mcuxClEls_GetRandomStartDelay </ul>\r\n *              @if MCUXCL_FEATURE_ELS_LOCKING\r\n *              <li> ELS Locking\r\n *                  <ul> <li> #mcuxClEls_GetLock </ul>\r\n *                  <ul> <li> #mcuxClEls_ReleaseLock </ul>\r\n *                  <ul> <li> #mcuxClEls_IsLocked </ul>\r\n *                  <ul> <li> #mcuxClEls_SetMasterUnlock </ul>\r\n *              @endif\r\n *              @if MCUXCL_FEATURE_ELS_RESP_GEN\r\n *              <li> Calculate response to a hardware generated challenge\r\n *                  <ul> <li> #mcuxClEls_RespGen_Async </ul>\r\n *              @endif\r\n *              @if MCUXCL_FEATURE_ELS_DMA_ADDRESS_READBACK\r\n *              <li> Final Address Readback (security feature)\r\n *                  <ul> <li> #mcuxClEls_GetLastDmaAddress </ul>\r\n *              @endif\r\n *              @if MCUXCL_FEATURE_ELS_DMA_FINAL_ADDRESS_READBACK\r\n *              <li> Final Address Compare (security feature)\r\n *                  <ul> <li> #mcuxClEls_CompareDmaFinalOutputAddress </ul>\r\n *              @endif\r\n *          </ul>\r\n *      <li> CRC\r\n *          <ul>\r\n *              <li> Command CRC checks\r\n *                  <ul> <li> #mcuxClEls_ConfigureCommandCRC </ul>\r\n *                  <ul> <li> #mcuxClEls_GetCommandCRC </ul>\r\n *                  <ul> <li> #mcuxClEls_VerifyVsRefCRC </ul>\r\n *                  <ul> <li> #mcuxClEls_UpdateRefCRC </ul>\r\n *          </ul>\r\n *      <li> HASH\r\n *          <ul>\r\n *              <li> SHA-2 hashing\r\n *                  <ul> <li> #mcuxClEls_Hash_Async </ul>\r\n *          @if MCUXCL_FEATURE_ELS_SHA_DIRECT\r\n *              <li> SHA-2 hashing in direct mode\r\n *                  <ul> <li> #mcuxClEls_ShaDirect_Enable </ul>\r\n *                  <ul> <li> #mcuxClEls_ShaDirect_Disable </ul>\r\n *                  <ul> <li> #mcuxClEls_Hash_ShaDirect </ul>\r\n *          @endif\r\n *          </ul>\r\n *      @if MCUXCL_FEATURE_ELS_HMAC\r\n *      <li> HMAC (Keyed-Hash Message Authentication Code)\r\n *          <ul>\r\n *              <li> HMAC\r\n *                  <ul> <li> #mcuxClEls_Hmac_Async </ul>\r\n *          </ul>\r\n *      @endif\r\n *      @if MCUXCL_FEATURE_ELS_CMAC\r\n *      <li> CMAC (Cipher-Based Message Authentication Code)\r\n *          <ul>\r\n *              <li> CMAC\r\n *                  <ul> <li> #mcuxClEls_Cmac_Async </ul>\r\n *          </ul>\r\n *      @endif\r\n *      <li> CIPHER (Symmetric Encryption)\r\n *          <ul>\r\n *              <li> AES\r\n *                  <ul> <li> #mcuxClEls_Cipher_Async </ul>\r\n *          </ul>\r\n *      @if MCUXCL_FEATURE_ELS_AEAD\r\n *      <li> AEAD (Authenticated Encryption with Associated Data)\r\n *          <ul>\r\n *              <li> Authenticated Encryption with Associated Data\r\n *                  <ul>\r\n *                      <li> #mcuxClEls_Aead_Init_Async\r\n *                      <li> #mcuxClEls_Aead_UpdateAad_Async\r\n *                      <li> #mcuxClEls_Aead_UpdateData_Async\r\n *                      <li> #mcuxClEls_Aead_Finalize_Async\r\n *                  </ul>\r\n *          </ul>\r\n *      @endif\r\n *      <li> KEY MANAGEMENT\r\n *          <ul>\r\n *          @if MCUXCL_FEATURE_ELS_KEY_MGMT_DELETE\r\n *              <li> Key deletion\r\n *                  <ul> <li> #mcuxClEls_KeyDelete_Async </ul>\r\n *          @endif\r\n *          @if MCUXCL_FEATURE_ELS_KEY_MGMT_KEYPROV\r\n *              <li> Key provisioning\r\n *                  <ul> <li> #mcuxClEls_KeyProvision_Async </ul>\r\n *          @endif\r\n *          @if MCUXCL_FEATURE_ELS_KEY_MGMT_KEYPROV_ROM\r\n *              <li> Key provisioning (ROM)\r\n *                  <ul> <li> #mcuxClEls_KeyProvisionRom_Async </ul>\r\n *          @endif\r\n *              <li> Key import\r\n *                  <ul> <li> #mcuxClEls_KeyImport_Async </ul>\r\n *          @if MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n *              <li> Public key import\r\n *                  <ul> <li> #mcuxClEls_KeyImportPuk_Async </ul>\r\n *          @endif\r\n *          @if MCUXCL_FEATURE_ELS_KEY_MGMT_EXPORT\r\n *              <li> Key export\r\n *                  <ul> <li> #mcuxClEls_KeyExport_Async </ul>\r\n *          @endif\r\n *              <li> Key properties\r\n *                  <ul> <li> #mcuxClEls_GetKeyProperties </ul>\r\n *          </ul>\r\n *      @if MCUXCL_FEATURE_ELS_RNG\r\n *      <li> RNG\r\n *          <ul>\r\n *              <li> Random data generation using DRBG\r\n *                  <ul> <li> #mcuxClEls_Rng_DrbgRequest_Async </ul>\r\n *              @if MCUXCL_FEATURE_ELS_RND_RAW\r\n *              <li> Get raw (unprocessed) random data from the DTRNG\r\n *                  <ul> <li> #mcuxClEls_Rng_DrbgRequestRaw_Async </ul>\r\n *              @endif\r\n *              <li> FIPS CAVP test mode\r\n *                  <ul> <li> #mcuxClEls_Rng_DrbgTestInstantiate_Async </ul>\r\n *                  <ul> <li> #mcuxClEls_Rng_DrbgTestExtract_Async </ul>\r\n *                  <ul> <li> #mcuxClEls_Rng_DrbgTestAesEcb_Async </ul>\r\n *                  <ul> <li> #mcuxClEls_Rng_DrbgTestAesCtr_Async </ul>\r\n *              <li> Configuration of the DTRNG\r\n *                  <ul> <li> #mcuxClEls_Rng_Dtrng_ConfigLoad_Async </ul>\r\n *                  <ul> <li> #mcuxClEls_Rng_Dtrng_ConfigEvaluate_Async </ul>\r\n *              <li> PRNG\r\n *              @if MCUXCL_FEATURE_ELS_PRND_INIT\r\n *                  <ul> <li> #mcuxClEls_Prng_Init_Async </ul>\r\n *              @endif\r\n *                  <ul> <li> #mcuxClEls_Prng_GetRandomWord </ul>\r\n *                  <ul> <li> #mcuxClEls_Prng_GetRandom </ul>\r\n *          </ul>\r\n *      @endif\r\n *      <li> ECC (Elliptic Curve Cryptography)\r\n *          <ul>\r\n *              <li> ECC Key generation\r\n *                  <ul> <li> #mcuxClEls_EccKeyGen_Async </ul>\r\n *              @if MCUXCL_FEATURE_ELS_ECC_KEY_EXCHANGE\r\n *              <li> ECC key exchange\r\n *                  <ul> <li> #mcuxClEls_EccKeyExchange_Async </ul>\r\n *                  @if MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n *                  <ul> <li> #mcuxClEls_EccKeyExchangeInt_Async </ul>\r\n *                  @endif\r\n *              @endif\r\n *              <li> ECC signature generation\r\n *                  <ul> <li> #mcuxClEls_EccSign_Async </ul>\r\n *              <li> ECC signature verification\r\n *                  <ul> <li> #mcuxClEls_EccVerify_Async </ul>\r\n *              @if MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n *                  <ul> <li> #mcuxClEls_EccVerifyInt_Async </ul>\r\n *              @endif\r\n *          </ul>\r\n *      <li> KEY DERIVATION\r\n *          <ul>\r\n *              <li> Key derivation\r\n *                  <ul>\r\n *                      @if MCUXCL_FEATURE_ELS_CKDF\r\n *                      <li> #mcuxClEls_Ckdf_Sp800108_Async\r\n *                      @if  MCUXCL_FEATURE_ELS_CKDF_SP80056C\r\n *                      <li> #mcuxClEls_Ckdf_Sp80056c_Extract_Async\r\n *                      <li> #mcuxClEls_Ckdf_Sp80056c_Expand_Async\r\n *                      @endif\r\n *                      @endif\r\n *                      @if MCUXCL_FEATURE_ELS_HKDF\r\n *                      <li> #mcuxClEls_Hkdf_Rfc5869_Async\r\n *                      <li> #mcuxClEls_Hkdf_Sp80056c_Async\r\n *                      @endif\r\n *                  </ul>\r\n *              @if MCUXCL_FEATURE_ELS_TLS\r\n *              <li> Master Key and Session Key derivation\r\n *                  <ul>\r\n *                      <li> #mcuxClEls_TlsGenerateMasterKeyFromPreMasterKey_Async\r\n *                      <li> #mcuxClEls_TlsGenerateSessionKeysFromMasterKey_Async\r\n *                  </ul>\r\n *              @endif\r\n *          </ul>\r\n *      @if MCUXCL_FEATURE_ELS_GLITCHDETECTOR\r\n *      <li> ELS Glitch Detector control\r\n *          <ul>\r\n *              <li> #mcuxClEls_GlitchDetector_LoadConfig_Async\r\n *              <li> #mcuxClEls_GlitchDetector_Trim_Async\r\n *              <li> #mcuxClEls_GlitchDetector_GetEventCounter\r\n *              <li> #mcuxClEls_GlitchDetector_ResetEventCounter\r\n *          </ul>\r\n *      @endif\r\n *  </ol>\r\n *\r\n *  After each call to a function ending in <tt>_Async</tt>, one of the waiting functions #mcuxClEls_WaitForOperation or #mcuxClEls_LimitedWaitForOperation must be called to ensure completion.\r\n *  The waiting functions may fail, e.g., when the ELS enters an error state.\r\n */\r\n\r\n#ifndef MCUXCLELS_H_\r\n#define MCUXCLELS_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n\r\n#include <mcuxClEls_Types.h>\r\n#include <mcuxClEls_Common.h>\r\n#ifdef MCUXCL_FEATURE_ELS_CMD_CRC\r\n#include <mcuxClEls_Crc.h>\r\n#endif /* MCUXCL_FEATURE_ELS_CMD_CRC */\r\n#include <mcuxClEls_Hash.h>\r\n#include <mcuxClEls_Hmac.h>\r\n#include <mcuxClEls_Cmac.h>\r\n#include <mcuxClEls_Cipher.h>\r\n#include <mcuxClEls_Aead.h>\r\n#include <mcuxClEls_KeyManagement.h>\r\n#include <mcuxClEls_Rng.h>\r\n#include <mcuxClEls_Ecc.h>\r\n#include <mcuxClEls_Kdf.h>\r\n#ifdef MCUXCL_FEATURE_ELS_GLITCHDETECTOR\r\n#include <mcuxClEls_GlitchDetector.h>\r\n#endif /* MCUXCL_FEATURE_ELS_GLITCHDETECTOR */\r\n\r\n#endif /* MCUXCLELS_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/inc/mcuxClEls_Aead.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxClEls_Aead.h\r\n * @brief ELS header for Authenticated Encryption with Associated Data (AEAD).\r\n * \r\n * This header exposes functions that enable using the ELS for Authenticated Encryption with Associated Data (AEAD).\r\n * The AEAD algorithm supported by ELS is AES in Galois/Counter Mode (GCM), as described in NIST Special Publication\r\n * 800-38D.\r\n */\r\n\r\n /**\r\n * @defgroup mcuxClEls_Aead mcuxClEls_Aead\r\n * @brief This part of the @ref mcuxClEls driver supports Authenticated Encryption with Associated Data (AEAD).\r\n * @ingroup mcuxClEls\r\n * @{\r\n */\r\n#ifndef MCUXCLELS_AEAD_H_\r\n#define MCUXCLELS_AEAD_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n#include <mcuxClEls_Common.h> // Common functionality\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * CONSTANTS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Aead_Macros mcuxClEls_Aead_Macros\r\n * @brief Defines all macros of @ref mcuxClEls_Aead\r\n * @ingroup mcuxClEls_Aead\r\n * @{\r\n */\r\n/**\r\n * @defgroup MCUXCLELS_AEAD_ MCUXCLELS_AEAD_\r\n * @brief Defines macros used to initialize #mcuxClEls_AeadOption_t\r\n * @ingroup mcuxClEls_Aead_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_AEAD_ENCRYPT ((uint8_t)0x00U) ///< Set #mcuxClEls_AeadOption_t.dcrpt to this value to encrypt data\r\n#define MCUXCLELS_AEAD_DECRYPT ((uint8_t)0x01U) ///< Set #mcuxClEls_AeadOption_t.dcrpt to this value to decrypt data\r\n\r\n#define MCUXCLELS_AEAD_STATE_IN_DISABLE ((uint8_t)0x00U) ///< Set #mcuxClEls_AeadOption_t.acpsie to this value to load the GCM state from ELS\r\n#define MCUXCLELS_AEAD_STATE_IN_ENABLE  ((uint8_t)0x01U) ///< Set #mcuxClEls_AeadOption_t.acpsie to this value to load the GCM state from the context\r\n\r\n#define MCUXCLELS_AEAD_LASTINIT_TRUE  ((uint8_t)0x01U)  ///< Set #mcuxClEls_AeadOption_t.lastinit to this value if this is the last call to init\r\n#define MCUXCLELS_AEAD_LASTINIT_FALSE ((uint8_t)0x00U)  ///< Set #mcuxClEls_AeadOption_t.lastinit to this value if this is not the last call to init\r\n\r\n#define MCUXCLELS_AEAD_EXTERN_KEY ((uint8_t)0x01U)  ///< Set #mcuxClEls_AeadOption_t.extkey to this value to use an external key\r\n#define MCUXCLELS_AEAD_INTERN_KEY ((uint8_t)0x00U)  ///< Set #mcuxClEls_AeadOption_t.extkey to this value to use a key from the ELS keystore\r\n\r\n#define MCUXCLELS_AEAD_ACPMOD_INIT    ((uint8_t)0x00U) ///< Set #mcuxClEls_AeadOption_t.acpmod to this value for Init mode. For internal use\r\n#define MCUXCLELS_AEAD_ACPMOD_AADPROC ((uint8_t)0x01U) ///< Set #mcuxClEls_AeadOption_t.acpmod to this value for Process Additional Authenticated Data mode. For internal use\r\n#define MCUXCLELS_AEAD_ACPMOD_MSGPROC ((uint8_t)0x02U) ///< Set #mcuxClEls_AeadOption_t.acpmod to this value for Process Message mode. For internal use\r\n#define MCUXCLELS_AEAD_ACPMOD_FINAL   ((uint8_t)0x03U) ///< Set #mcuxClEls_AeadOption_t.acpmod to this value for Finalize mode. For internal use\r\n\r\n#ifndef MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS\r\n#define MCUXCLELS_AEAD_STATE_OUT_ENABLE  ((uint8_t)0x01U) ///< Set #mcuxClEls_AeadOption_t.acpsoe to this value to save the state to the context. For internal use\r\n#endif /* MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS */\r\n/**\r\n * @}\r\n */\r\n\r\n#define MCUXCLELS_AEAD_IV_BLOCK_SIZE  16U  ///< AES-GCM IV Granularity:  128 bit (16 bytes)\r\n#define MCUXCLELS_AEAD_AAD_BLOCK_SIZE 16U  ///< AES-GCM AAD Granularity: 128 bit (16 bytes)\r\n#define MCUXCLELS_AEAD_TAG_SIZE       16U  ///< tag size: Tag generation supports only a 128 bit wide tag (16 bytes)\r\n#define MCUXCLELS_AEAD_CONTEXT_SIZE   80U  ///< context size: 512 bit (64 bytes) + 16 bytes for finalize\r\n/**\r\n * @}\r\n */\r\n\r\n/**********************************************\r\n * TYPEDEFS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Aead_Types mcuxClEls_Aead_Types\r\n * @brief Defines all types of @ref mcuxClEls_Aead\r\n * @ingroup mcuxClEls_Aead\r\n * @{\r\n */\r\n/**\r\n * @brief Command option bit field for #mcuxClEls_Aead_Init_Async, #mcuxClEls_Aead_UpdateAad_Async, #mcuxClEls_Aead_UpdateData_Async and #mcuxClEls_Aead_Finalize_Async.\r\n */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value; ///< Accesses the bit field as a full word\r\n    } word;             ///< Access #mcuxClEls_AeadOption_t word-wise\r\n    struct\r\n    {\r\n        uint32_t :1;          ///< RFU\r\n        uint32_t dcrpt :1;    ///< Defines if encryption or decryption shall be performed\r\n        uint32_t acpmod :2;   ///< This field is managed internally\r\n#ifndef MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS\r\n        uint32_t acpsoe :1;   ///< This field is managed internally\r\n#else\r\n        uint32_t :1;          ///< RFU\r\n#endif /* MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS */\r\n        uint32_t acpsie :1;   ///< This field is managed internally\r\n        uint32_t msgendw :4;  ///< The size of the last data block (plain/cipher text) in bytes, without padding\r\n        uint32_t lastinit :1; ///< Defines whether this is the last call to init\r\n        uint32_t :2;          ///< RFU\r\n        uint32_t extkey :1;   ///< Defines whether an external key shall be used\r\n        uint32_t :18;         ///< RFU\r\n    } bits;                   ///< Access #mcuxClEls_AeadOption_t bit-wise\r\n} mcuxClEls_AeadOption_t;\r\n/**\r\n * @}\r\n */\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Aead_Functions mcuxClEls_Aead_Functions\r\n * @brief Defines all functions of @ref mcuxClEls_Aead\r\n * @ingroup mcuxClEls_Aead\r\n * @{\r\n */\r\n\r\n/**\r\n * @brief AES-GCM initialization\r\n *\r\n * This is the first stage of AEAD encryption/decryption. This generates the initial context out of the IV @p pIV and the key (@p pKey or @p keyIdx).\r\n *\r\n * @if ELS_AES_WITH_SIDE_CHANNEL_PROTECTION\r\n * Before execution, ELS will wait until #mcuxClEls_HwState_t.drbgentlvl == #MCUXCLELS_STATUS_DRBGENTLVL_LOW. This can lead to a delay if the DRBG is in a state with less security strength at the time of the call.\r\n * @endif\r\n *\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in]      options   The AEAD command options. For more information, see #mcuxClEls_AeadOption_t.\r\n * @param[in]      keyIdx    Index of the key inside the ELS keystore\r\n * @param[in]      pKey      Pointer to the key\r\n * @param[in]      keyLength Size of @p pKey in bytes\r\n * @param[in]      pIV       Pointer to memory area that contains the IV\r\n * @param[in]      ivLength  Size of @p pIV in bytes, with padding\r\n * @param    [out] pAeadCtx  Pointer to the memory area that receives the AEAD context structure. Must be at least #MCUXCLELS_AEAD_CONTEXT_SIZE bytes long.\r\n *\r\n * The properties of some parameters change with respect to selected options.\r\n *\r\n * <dl>\r\n *  <dt>Parameter properties</dt>\r\n *\r\n *  <dd><dl>\r\n *      <dt>@p options.extkey == #MCUXCLELS_AEAD_EXTERN_KEY</dt>\r\n *          <dd>@p keyIdx is ignored.\r\n *\r\n *          @p pKey must be a valid AES key and @p keyLength a valid AES key size (see @ref MCUXCLELS_CIPHER_KEY_SIZE_AES_).</dd>\r\n *\r\n *      <dt>@p options.extkey == #MCUXCLELS_AEAD_INTERN_KEY</dt>\r\n *          <dd>@p keyIdx must be a valid key index with the correct usage rights.\r\n *\r\n *          @p pKey and @p keyLength are ignored.</dd>\r\n *  </dl></dd>\r\n * </dl>\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Aead_Init_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Aead_Init_Async(\r\n    mcuxClEls_AeadOption_t options,\r\n    mcuxClEls_KeyIndex_t keyIdx,\r\n    uint8_t const * pKey,\r\n    size_t keyLength,\r\n    uint8_t const * pIV,\r\n    size_t ivLength,\r\n    uint8_t * pAeadCtx\r\n    );\r\n\r\n/**\r\n * @brief AES-GCM partial initialization\r\n * \r\n * This is the first stage of AEAD encryption/decryption. This generates the initial context out of the IV @p pIV and the key (@p pKey or @p keyIdx).\r\n * \r\n * @if ELS_AES_WITH_SIDE_CHANNEL_PROTECTION\r\n * Before execution, ELS will wait until #mcuxClEls_HwState_t.drbgentlvl == #MCUXCLELS_STATUS_DRBGENTLVL_LOW. This can lead to a delay if the DRBG is in a state with less security strength at the time of the call.\r\n * @endif\r\n * \r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in]      options   The AEAD command options. For more information, see #mcuxClEls_AeadOption_t.\r\n * @param[in]      keyIdx    Index of the key inside the ELS keystore\r\n * @param[in]      pKey      Pointer to the key\r\n * @param[in]      keyLength Size of @p pKey in bytes\r\n * @param[in]      pIV       Pointer to memory area that contains the IV\r\n * @param[in]      ivLength  Size of @p pIV in bytes, with padding\r\n * @param    [out] pAeadCtx  Pointer to the memory area that receives the AEAD context structure. Must be at least #MCUXCLELS_AEAD_CONTEXT_SIZE bytes long.\r\n * \r\n * The properties of some parameters change with respect to selected options.\r\n * \r\n * <dl>\r\n *  <dt>Parameter properties</dt>\r\n *\r\n *  <dd><dl>\r\n *      <dt>@p options.extkey == #MCUXCLELS_AEAD_EXTERN_KEY</dt>\r\n *          <dd>@p keyIdx is ignored.\r\n *\r\n *          @p pKey must be a valid AES key and @p keyLength a valid AES key size (see @ref MCUXCLELS_CIPHER_KEY_SIZE_AES_).</dd>\r\n *\r\n *      <dt>@p options.extkey == #MCUXCLELS_AEAD_INTERN_KEY</dt>\r\n *          <dd>@p keyIdx must be a valid key index with the correct usage rights.\r\n *\r\n *          @p pKey and @p keyLength are ignored.</dd>\r\n *\r\n *      <dt>@p options.msgendw</dt>\r\n *          <dd>This field is ignored</dd>\r\n *  </dl></dd>\r\n * </dl>\r\n * \r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Aead_PartialInit_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Aead_PartialInit_Async(\r\n    mcuxClEls_AeadOption_t options,\r\n    mcuxClEls_KeyIndex_t keyIdx,\r\n    uint8_t const * pKey,\r\n    size_t keyLength,\r\n    uint8_t const * pIV,\r\n    size_t ivLength,\r\n    uint8_t * pAeadCtx\r\n    );\r\n\r\n/**\r\n * @brief AES-GCM update of the Additional Authenticated Data (AAD)\r\n * \r\n * This is the second stage of AEAD encryption/decryption. This updates the internal authentication tag with the AAD.\r\n * \r\n * #mcuxClEls_Aead_Init_Async must have been called before calling this function.\r\n * \r\n * @if ELS_AES_WITH_SIDE_CHANNEL_PROTECTION\r\n * Before execution, ELS will wait until #mcuxClEls_HwState_t.drbgentlvl == #MCUXCLELS_STATUS_DRBGENTLVL_LOW. This can lead to a delay if the DRBG is in a state with less security strength at the time of the call.\r\n * @endif\r\n * \r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in]      options   The AEAD command options. For more information, see #mcuxClEls_AeadOption_t.\r\n * @param[in]      keyIdx    Index of the key inside the ELS keystore\r\n * @param[in]      pKey      Pointer to the key\r\n * @param[in]      keyLength Size of @p pKey in bytes\r\n * @param[in]      pAad      Memory area that contains the AAD\r\n * @param[in]      aadLength Length of the @p pAad in bytes with padding\r\n * @param[in, out] pAeadCtx  Pointer to the AEAD context structure. Must be at least #MCUXCLELS_AEAD_CONTEXT_SIZE bytes long.\r\n * \r\n * The properties of some parameters change with respect to selected options.\r\n * \r\n * <dl>\r\n *  <dt>Parameter properties</dt>\r\n *\r\n *  <dd><dl>\r\n *      <dt>@p options.extkey == #MCUXCLELS_AEAD_EXTERN_KEY</dt>\r\n *          <dd>@p keyIdx is ignored.\r\n *\r\n *          @p pKey must be a valid AES key and @p keyLength a valid AES key size (see @ref MCUXCLELS_CIPHER_KEY_SIZE_AES_).</dd>\r\n *\r\n *      <dt>@p options.extkey == #MCUXCLELS_AEAD_INTERN_KEY</dt>\r\n *          <dd>@p keyIdx must be a valid key index with the correct usage rights.\r\n *\r\n *          @p pKey and @p keyLength are ignored.</dd>\r\n *\r\n *      <dt>@p options.msgendw</dt>\r\n *          <dd>This field is ignored</dd>\r\n *  </dl></dd>\r\n * </dl>\r\n * \r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Aead_UpdateAad_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Aead_UpdateAad_Async(\r\n    mcuxClEls_AeadOption_t options,\r\n    mcuxClEls_KeyIndex_t keyIdx,\r\n    uint8_t const * pKey,\r\n    size_t keyLength,\r\n    uint8_t const * pAad,\r\n    size_t aadLength,\r\n    uint8_t * pAeadCtx\r\n    );\r\n\r\n/**\r\n * @brief AES-GCM update of the encrypted data\r\n * \r\n * This is the third stage of AEAD encryption/decryption. This processes the given plaintext (in case of encryption)\r\n * or ciphertext (in case of decryption) and outputs the ciphertext (in case of encryption) or plaintext (in case of decryption).\r\n * \r\n * #mcuxClEls_Aead_Init_Async, #mcuxClEls_Aead_UpdateAad_Async must have been called before calling this function.\r\n *\r\n * @if ELS_AES_WITH_SIDE_CHANNEL_PROTECTION\r\n * Before execution, ELS will wait until #mcuxClEls_HwState_t.drbgentlvl == #MCUXCLELS_STATUS_DRBGENTLVL_LOW. This can lead to a delay if the DRBG is in a state with less security strength at the time of the call.\r\n * @endif\r\n * \r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in]      options     The AEAD command options. For more information, see #mcuxClEls_AeadOption_t.\r\n * @param[in]      keyIdx      Index of the key inside the ELS keystore\r\n * @param[in]      pKey        Pointer to the key\r\n * @param[in]      keyLength   Size of @p pKey in bytes\r\n * @param[in]      pInput      Pointer to the memory location of the data to be processed\r\n * @param[in]      inputLength Size of @p pInput in bytes with padding\r\n * @param    [out] pOutput     Pointer to the processed data memory location\r\n * @param[in, out] pAeadCtx    Pointer to the AEAD context structure. Must be at least #MCUXCLELS_AEAD_CONTEXT_SIZE bytes long.\r\n * \r\n * The properties of some parameters change with respect to selected options.\r\n * \r\n * <dl>\r\n *  <dt>Parameter properties</dt>\r\n *\r\n *  <dd><dl>\r\n *      <dt>@p options.extkey == #MCUXCLELS_AEAD_EXTERN_KEY</dt>\r\n *          <dd>@p keyIdx is ignored.\r\n *\r\n *          @p pKey must be a valid AES key and @p keyLength a valid AES key size (see @ref MCUXCLELS_CIPHER_KEY_SIZE_AES_).</dd>\r\n *\r\n *      <dt>@p options.extkey == #MCUXCLELS_AEAD_INTERN_KEY</dt>\r\n *          <dd>@p keyIdx must be a valid key index with the correct usage rights.\r\n *\r\n *          @p pKey and @p keyLength are ignored.</dd>\r\n *\r\n *      <dt>@p options.msgendw</dt>\r\n *          <dd>This field has to be set to the size of the last data block (plain/cipher text) in bytes, without padding.\r\n *              In case the last block is a full block, this field has to be set to 0.</dd>\r\n *  </dl></dd>\r\n * </dl>\r\n * \r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Aead_UpdateData_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Aead_UpdateData_Async(\r\n    mcuxClEls_AeadOption_t options,\r\n    mcuxClEls_KeyIndex_t keyIdx,\r\n    uint8_t const * pKey,\r\n    size_t keyLength,\r\n    uint8_t const * pInput,\r\n    size_t inputLength,\r\n    uint8_t * pOutput,\r\n    uint8_t * pAeadCtx\r\n    );\r\n\r\n/**\r\n * @brief AES-GCM final encryption/decryption\r\n * \r\n * This is the fourth stage of AEAD encryption/decryption. This updates the authentication tag with the final data\r\n * length block and outputs the tag at the desired location.\r\n * \r\n * #mcuxClEls_Aead_Init_Async, #mcuxClEls_Aead_UpdateAad_Async and #mcuxClEls_Aead_UpdateData_Async must have been called\r\n * before calling this function.\r\n *\r\n * @if ELS_AES_WITH_SIDE_CHANNEL_PROTECTION\r\n * Before execution, ELS will wait until #mcuxClEls_HwState_t.drbgentlvl == #MCUXCLELS_STATUS_DRBGENTLVL_LOW. This can lead to a delay if the DRBG is in a state with less security strength at the time of the call.\r\n * @endif\r\n * \r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in]      options    The AEAD command options. For more information, see #mcuxClEls_AeadOption_t.\r\n * @param[in]      keyIdx     Index of the key inside the ELS keystore\r\n * @param[in]      pKey       Pointer to the key\r\n * @param[in]      keyLength  Size of @p pKey in bytes\r\n * @param[in]      aadLength  Length of the complete Additional Authenticated Data (AAD) in bytes, without padding.\r\n * @param[in]      dataLength Length of the complete plaintext/ciphertext in bytes, without padding.\r\n * @param    [out] pTag       Pointer where the resulting tag will be stored\r\n * @param[in]      pAeadCtx   Pointer to the AEAD context structure. Must be at least #MCUXCLELS_AEAD_CONTEXT_SIZE bytes long.\r\n * \r\n * The properties of some parameters change with respect to selected options.\r\n * \r\n * <dl>\r\n *  <dt>Parameter properties</dt>\r\n *\r\n *  <dd><dl>\r\n *      <dt>@p options.extkey == #MCUXCLELS_AEAD_EXTERN_KEY</dt>\r\n *          <dd>@p keyIdx is ignored.\r\n *\r\n *          @p pKey must be a valid AES key and @p keyLength a valid AES key size (see @ref MCUXCLELS_CIPHER_KEY_SIZE_AES_).</dd>\r\n *\r\n *      <dt>@p options.extkey == #MCUXCLELS_AEAD_INTERN_KEY</dt>\r\n *          <dd>@p keyIdx must be a valid key index with the correct usage rights.\r\n *\r\n *          @p pKey and @p keyLength are ignored.</dd>\r\n *\r\n *      <dt>@p options.msgendw</dt>\r\n *          <dd>This field is ignored</dd>\r\n *  </dl></dd>\r\n * </dl>\r\n * \r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Aead_Finalize_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Aead_Finalize_Async(\r\n    mcuxClEls_AeadOption_t options,\r\n    mcuxClEls_KeyIndex_t keyIdx,\r\n    uint8_t const * pKey,\r\n    size_t keyLength,\r\n    size_t aadLength,\r\n    size_t dataLength,\r\n    uint8_t * pTag,\r\n    uint8_t * pAeadCtx\r\n    );\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLELS_AEAD_H_ */\r\n\r\n/**\r\n * @}\r\n * \r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/inc/mcuxClEls_Cipher.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxClEls_Cipher.h\r\n * @brief ELS header for symmetric ciphers.\r\n *\r\n * This header exposes functions that enable using the ELS for symmetric encryption/decryption.\r\n * The cipher algorithm supported by ELS is AES in the following modes:\r\n * - Electronic Code Book (ECB) mode, \r\n * - Cipher Block Chaining (CBC) mode, and \r\n * - Counter (CTR) mode.\r\n * Supported key sizes are 128, 192, and 256 bits.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClEls_Cipher mcuxClEls_Cipher\r\n * @brief This part of the @ref mcuxClEls driver supports functionality for symmetric ciphers\r\n * @ingroup mcuxClEls\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLELS_CIPHER_H_\r\n#define MCUXCLELS_CIPHER_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n#include <mcuxClEls_Common.h> // Common functionality\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * CONSTANTS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Cipher_Macros mcuxClEls_Cipher_Macros\r\n * @brief Defines all macros of @ref mcuxClEls_Cipher\r\n * @ingroup mcuxClEls_Cipher\r\n * @{\r\n */\r\n\r\n/**\r\n * @defgroup MCUXCLELS_CIPHER_ MCUXCLELS_CIPHER_\r\n * @brief Defines valid options to be used by #mcuxClEls_CipherOption_t\r\n * @ingroup mcuxClEls_Cipher_Macros\r\n *\r\n * Valid AES key sizes in bytes\r\n * @{\r\n */\r\n\r\n#define MCUXCLELS_CIPHER_ENCRYPT 0U                      ///< Set this option at #mcuxClEls_CipherOption_t.dcrpt to perform an encryption\r\n#define MCUXCLELS_CIPHER_DECRYPT 1U                      ///< Set this option at #mcuxClEls_CipherOption_t.dcrpt to perform a decryption\r\n\r\n#define MCUXCLELS_CIPHER_STATE_OUT_ENABLE  1U            ///< Set this option at #mcuxClEls_CipherOption_t.cphsoe to export the internal ELS state to @p pIV\r\n#define MCUXCLELS_CIPHER_STATE_OUT_DISABLE 0U            ///< Set this option at #mcuxClEls_CipherOption_t.cphsoe to not export the internal ELS state\r\n\r\n#ifndef MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS\r\n#define MCUXCLELS_CIPHER_STATE_IN_ENABLE  1U             ///< Set this option at #mcuxClEls_CipherOption_t.cphsie to import an external ELS state from @p pIV\r\n#define MCUXCLELS_CIPHER_STATE_IN_DISABLE 0U             ///< Set this option at #mcuxClEls_CipherOption_t.cphsie to not import an external ELS state\r\n#endif /* MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS */\r\n\r\n#define MCUXCLELS_CIPHER_EXTERNAL_KEY 1U                 ///< Set this option at #mcuxClEls_CipherOption_t.extkey to use a key located in CPU memory provided by @p pKey\r\n#define MCUXCLELS_CIPHER_INTERNAL_KEY 0U                 ///< Set this option at #mcuxClEls_CipherOption_t.extkey to use a key located in ELS keystore privded by @p keyIdx\r\n\r\n#define MCUXCLELS_CIPHERPARAM_ALGORITHM_AES_ECB 0x00U    ///< Set this option at #mcuxClEls_CipherOption_t.cphmde to use AES engine in Electornic Code Book (ECB) mode\r\n#define MCUXCLELS_CIPHERPARAM_ALGORITHM_AES_CBC 0x01U    ///< Set this option at #mcuxClEls_CipherOption_t.cphmde to use AES engine in Cipher Block Chaining (CBC) mode\r\n#define MCUXCLELS_CIPHERPARAM_ALGORITHM_AES_CTR 0x02U    ///< Set this option at #mcuxClEls_CipherOption_t.cphmde to use AES engine in Counter (CTR) mode\r\n/**\r\n * @}\r\n */\r\n\r\n\r\n/**\r\n * @ingroup mcuxClEls_Cipher_Macros\r\n */\r\n#define MCUXCLELS_CIPHER_BLOCK_SIZE_AES   ((size_t) 16U) ///< Size of an AES input block: 128 bit (16 bytes)\r\n\r\n/**\r\n * @defgroup MCUXCLELS_CIPHER_KEY_SIZE_AES_ MCUXCLELS_CIPHER_KEY_SIZE_AES_\r\n * @brief Defines valid AES key sizes in bytes\r\n * @ingroup mcuxClEls_Cipher_Macros\r\n * @{\r\n */\r\n\r\n#define MCUXCLELS_CIPHER_KEY_SIZE_AES_128 ((size_t) 16U) ///< Size of an AES128 key: 128 bit (16 bytes)\r\n#define MCUXCLELS_CIPHER_KEY_SIZE_AES_192 ((size_t) 24U) ///< Size of an AES192 key: 192 bit (24 bytes)\r\n#define MCUXCLELS_CIPHER_KEY_SIZE_AES_256 ((size_t) 32U) ///< Size of an AES192 key: 256 bit (32 bytes)\r\n/**\r\n * @}\r\n *\r\n * @}\r\n */\r\n\r\n/**********************************************\r\n * TYPEDEFS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Cipher_Types mcuxClEls_Cipher_Types\r\n * @brief Defines all types of @ref mcuxClEls_Cipher\r\n * @ingroup mcuxClEls_Cipher\r\n * @{\r\n */\r\n\r\n/**\r\n * @brief Command option bit field for #mcuxClEls_Cipher_Async\r\n *\r\n * Bit field to configure #mcuxClEls_Cipher_Async. See @ref MCUXCLELS_CIPHER_ for possible options.\r\n */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value;     ///< Accesses the bit field as a full word\r\n    } word;                 ///< Access #mcuxClEls_CipherOption_t word-wise\r\n    struct\r\n    {\r\n        uint32_t :1;        ///< RFU\r\n        uint32_t dcrpt :1;  ///< Define operation mode\r\n        uint32_t cphmde :2; ///< Define cipher mode\r\n        uint32_t cphsoe :1; ///< Define whether the ELS internal cipher state should be extracted to external memory or kept internally\r\n#ifndef MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS\r\n        uint32_t cphsie :1; ///< Define whether an external provided cipher state should be imported from external memory\r\n        uint32_t :7;        ///< RFU\r\n#else\r\n        uint32_t :8;        ///< RFU\r\n#endif /* MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS */\r\n        uint32_t extkey :1; ///< Define whether an external key from memory or ELS internal key should be used\r\n        uint32_t :18;       ///< RFU\r\n    } bits;                 ///< Access #mcuxClEls_CipherOption_t bit-wise\r\n} mcuxClEls_CipherOption_t;\r\n/**\r\n * @}\r\n */\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Cipher_Functions mcuxClEls_Cipher_Functions\r\n * @brief Defines all functions of @ref mcuxClEls_Cipher\r\n * @ingroup mcuxClEls_Cipher\r\n * @{\r\n */\r\n\r\n /**\r\n * @brief Performs AES encryption/decryption.\r\n * \r\n * @if ELS_AES_WITH_SIDE_CHANNEL_PROTECTION\r\n * Before execution, ELS will wait until #mcuxClEls_HwState_t.drbgentlvl == #MCUXCLELS_STATUS_DRBGENTLVL_LOW. This can lead to a delay if the DRBG is in a state with less security strength at the time of the call.\r\n * @endif\r\n *\r\n * Performs an AES encryption/decryption. Call #mcuxClEls_WaitForOperation to complete the operation.\r\n * @param[in]       options     Encryption/decryption command options. For detailed information, see #mcuxClEls_CipherOption_t.\r\n * @param[in]       keyIdx      Index of the key inside the ELS keystore. See parameter properties section in function description.\r\n * @param[in]       pKey        Memory area that contains the key. See parameter properties section in function description.\r\n * @param[in]       keyLength   Size of @p pKey in bytes. Must be a valid key size of @ref MCUXCLELS_CIPHER_KEY_SIZE_AES_. See parameter properties section in function description.\r\n * @param[in]       pInput      Pointer to the input data to be encrypted/decrypted. Padding must be already applied.\r\n * @param[in]       inputLength Size of @p pInput in bytes, must be a multiple of the block size.\r\n * @param[in, out]  pIV         A pointer to the memory location which contains/receives the IV/state of cipher. See parameter properties section in function description.\r\n * @param[out]      pOutput     Pointer to the output buffer to store encrypted/decrypted data.\r\n *\r\n * The properties of some parameters change with respect to selected options.\r\n *\r\n * <dl>\r\n *  <dt>Parameter properties</dt>\r\n *\r\n *  <dd><dl>\r\n *      <dt>@p options.cphmde == #MCUXCLELS_CIPHERPARAM_ALGORITHM_AES_ECB</dt>\r\n *          <dd>@p pIV is ignored.\r\n *\r\n *      <dt>@p options.cphmde == #MCUXCLELS_CIPHERPARAM_ALGORITHM_AES_CBC</dt>\r\n *          <dd>@p pIV must be set to the IV (when encrypting the first block) or to the last block of the ciphertext of the previous operation.\r\n *          ELS will always read and write to this location.\r\n *\r\n * @ifnot ELS_NO_INTERNAL_STATE_FLAGS\r\n *          @p options.cphsie is ignored.\r\n * @endif\r\n *\r\n *          @p options.cphsoe is ignored.</dd>\r\n *\r\n *      <dt>@p options.cphmde == #MCUXCLELS_CIPHERPARAM_ALGORITHM_AES_CTR</dt>\r\n *          <dd>@p pIV must be set to the IV (when encrypting the first block) or to the state output of the previous\r\n *          encryption/decryption operation. ELS will write to this location if @p options.cphsoe == #MCUXCLELS_CIPHER_STATE_OUT_ENABLE.</dd>\r\n *\r\n *      <dt>@p options.extkey == #MCUXCLELS_CIPHER_EXTERNAL_KEY</dt>\r\n *          <dd>@p keyIdx is ignored.</dd>\r\n *\r\n *      <dt>@p options.extkey == #MCUXCLELS_CIPHER_INTERNAL_KEY</dt>\r\n *          <dd>@p pKey is ignored.\r\n *\r\n *          @p keyLength is ignored.</dd>\r\n *\r\n *  </dl></dd>\r\n * </dl>\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Cipher_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Cipher_Async(\r\n    mcuxClEls_CipherOption_t options,\r\n    mcuxClEls_KeyIndex_t keyIdx,\r\n    uint8_t const * pKey,\r\n    size_t keyLength,\r\n    uint8_t const * pInput,\r\n    size_t inputLength,\r\n    uint8_t * pIV,\r\n    uint8_t * pOutput\r\n    );\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLELS_CIPHER_H_ */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/inc/mcuxClEls_Cmac.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxClEls_Cmac.h\r\n * @brief ELS header for CMAC support.\r\n * This header exposes functions that enable using the ELS for the generation of cipher-based message authentication\r\n * codes (CMAC).\r\n * The supported cipher algorithm is AES-128 and AES-256.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClEls_Cmac mcuxClEls_Cmac\r\n * @brief This part of the @ref mcuxClEls driver supports functionality for cipher-based message authentication codes (CMAC).\r\n * @ingroup mcuxClEls\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLELS_CMAC_H_\r\n#define MCUXCLELS_CMAC_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n#include <mcuxClEls_Common.h> // Common functionality\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * MACROS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Cmac_Macros mcuxClEls_Cmac_Macros\r\n * @brief Defines all macros of @ref mcuxClEls_Cmac\r\n * @ingroup mcuxClEls_Cmac\r\n * @{\r\n */\r\n\r\n/**\r\n * @defgroup MCUXCLELS_CMAC_KEY_SIZE_ MCUXCLELS_CMAC_KEY_SIZE_\r\n * @brief Valid CMAC key sizes in bytes\r\n * @ingroup mcuxClEls_Cmac_Macros\r\n * @{ */\r\n#define MCUXCLELS_CMAC_KEY_SIZE_128 ((size_t) 16U) ///< Size of 128 bit CMAC key (16 bytes)\r\n#define MCUXCLELS_CMAC_KEY_SIZE_256 ((size_t) 32U) ///< Size of 256 bit CMAC key (32 bytes)\r\n/** @} */\r\n\r\n/**\r\n * @defgroup MCUXCLELS_CMAC_ MCUXCLELS_CMAC_\r\n * @brief Option values for #mcuxClEls_CmacOption_t\r\n * @ingroup mcuxClEls_Cmac_Macros\r\n * @{ */\r\n#define MCUXCLELS_CMAC_EXTERNAL_KEY_ENABLE  1U ///< Set #mcuxClEls_CmacOption_t.extkey to this value to use an external key\r\n#define MCUXCLELS_CMAC_EXTERNAL_KEY_DISABLE 0U ///< Set #mcuxClEls_CmacOption_t.extkey to this value to use a key from the ELS keystore\r\n#define MCUXCLELS_CMAC_INITIALIZE_DISABLE   0U ///< Set #mcuxClEls_CmacOption_t.initialize to this value if the message chunk does not include the first block of the message\r\n#define MCUXCLELS_CMAC_INITIALIZE_ENABLE    1U ///< Set #mcuxClEls_CmacOption_t.initialize to this value if the message chunk includes the first block of the message\r\n#define MCUXCLELS_CMAC_FINALIZE_DISABLE     0U ///< Set #mcuxClEls_CmacOption_t.finalize to this value if the message chunk does not include the last block of the message\r\n#define MCUXCLELS_CMAC_FINALIZE_ENABLE      1U ///< Set #mcuxClEls_CmacOption_t.finalize to this value if the message chunk includes the last block of the message\r\n/**\r\n * @}\r\n */\r\n\r\n#define MCUXCLELS_CMAC_OUT_SIZE ((size_t) 16U) ///< Size of CMAC output: 128 bit (16 bytes)\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n/**********************************************\r\n * TYPEDEFS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Cmac_Types mcuxClEls_Cmac_Types\r\n * @brief Defines all types of @ref mcuxClEls_Cmac\r\n * @ingroup mcuxClEls_Cmac\r\n * @{\r\n */\r\n/**\r\n * @brief Command option bit field for #mcuxClEls_Cmac_Async.\r\n */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value; ///< Accesses the bit field as a full word\r\n    } word;             ///< Access #mcuxClEls_CmacOption_t word-wise\r\n    struct\r\n    {\r\n        uint32_t initialize : 1; ///< Request initial processing for the first block of the message\r\n        uint32_t finalize : 1;   ///< Request final processing for the last block of the message\r\n        uint32_t soe : 1;        ///< This field is managed internally\r\n        uint32_t sie : 1;        ///< This field is managed internally\r\n        uint32_t :9;             ///< RFU\r\n        uint32_t extkey :1;      ///< An external key should be used\r\n        uint32_t :18;            ///< RFU\r\n    } bits;                      ///< Access #mcuxClEls_CmacOption_t bit-wise\r\n} mcuxClEls_CmacOption_t;\r\n/**\r\n * @}\r\n */\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Cmac_Functions mcuxClEls_Cmac_Functions\r\n * @brief Defines all functions of @ref mcuxClEls_Cmac\r\n * @ingroup mcuxClEls_Cmac\r\n * @{\r\n */\r\n/**\r\n * @brief Performs CMAC with AES-128 or AES-256\r\n * \r\n * @if ELS_AES_WITH_SIDE_CHANNEL_PROTECTION\r\n * Before execution, ELS will wait until #mcuxClEls_HwState_t.drbgentlvl == #MCUXCLELS_STATUS_DRBGENTLVL_LOW. This can lead to a delay if the DRBG is in a state with less security strength at the time of the call.\r\n * @endif\r\n * \r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in]      options     The command options. For more information, see #mcuxClEls_CmacOption_t.\r\n * @param[in]      keyIdx      The CMAC key index\r\n * @param[in]      pKey        Pointer to the padded CMAC key\r\n * @param[in]      keyLength   Size of @p pKey in bytes. Must be a @ref MCUXCLELS_CMAC_KEY_SIZE_ \"valid CMAC key size\". See the parameter properties section in the function description.\r\n * @param[in]      pInput      Pointer to a memory location which contains the data, padded via SP 800-38b standard, to be authenticated\r\n * @param[in]      inputLength Size of @p pInput in bytes before padding\r\n * @param[in, out] pMac        Pointer to the CMAC command state input/output. See the parameter properties section in the function description.\r\n * \r\n * The properties of some parameters change with respect to selected options.\r\n *\r\n * <dl>\r\n *  <dt>Parameter properties</dt>\r\n *\r\n *  <dd><dl>\r\n *      <dt>@p options.extkey == #MCUXCLELS_CMAC_EXTERNAL_KEY_ENABLE</dt>\r\n *          <dd>@p keyIdx is ignored.</dd>\r\n *\r\n *      <dt>@p options.extkey == #MCUXCLELS_CMAC_EXTERNAL_KEY_DISABLE</dt>\r\n *          <dd>@p pKey is ignored.\r\n *\r\n *          @p keyLength is ignored.</dd>\r\n * \r\n *      <dt>(@p options.finalize == #MCUXCLELS_CMAC_FINALIZE_DISABLE)</dt>\r\n *          <dd>The intermediate state is written to @p pMac. </dd>\r\n * \r\n *      <dt>@p options.finalize == #MCUXCLELS_CMAC_FINALIZE_ENABLE</dt>\r\n *          <dd>The resulting MAC is written to @p pMac.\r\n * \r\n *          @p options.soe is ignored.</dd>\r\n *  </dl></dd>\r\n * </dl>\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if an invalid parameter was specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Cmac_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Cmac_Async(\r\n    mcuxClEls_CmacOption_t options,\r\n    mcuxClEls_KeyIndex_t keyIdx,\r\n    uint8_t const * pKey,\r\n    size_t keyLength,\r\n    uint8_t const * pInput,\r\n    size_t inputLength, \r\n    uint8_t * pMac\r\n    );\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLELS_CMAC_H_ */\r\n\r\n/**\r\n * @}\r\n * \r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/inc/mcuxClEls_Common.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxClEls_Common.h\r\n * @brief ELS header for common functionality.\r\n *\r\n * This header exposes functions that support hardware state management for other ELS commands.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClEls_Common mcuxClEls_Common\r\n * @brief This part of the @ref mcuxClEls driver supports common functionality\r\n * @ingroup mcuxClEls\r\n * @{\r\n */\r\n#ifndef MCUXCLELS_COMMON_H_\r\n#define MCUXCLELS_COMMON_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n#include <mcuxClEls_Types.h> // Common types\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxClCore_FunctionIdentifiers.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**\r\n * @defgroup mcuxClEls_Common_Macros mcuxClEls_Common_Macros\r\n * @brief Defines all macros of @ref mcuxClEls_Common\r\n * @ingroup mcuxClEls_Common\r\n * @{\r\n */\r\n\r\n#define MCUXCLELS_API    ///< Marks a function as a public API function of the mcuxClEls component\r\n\r\n/**********************************************\r\n * CONSTANTS\r\n **********************************************/\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_DMA_FINAL_ADDRESS_READBACK\r\n  #define MCUXCLELS_DMA_READBACK_PROTECTION_TOKEN MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClEls_CompareDmaFinalOutputAddress)\r\n#else\r\n  #define MCUXCLELS_DMA_READBACK_PROTECTION_TOKEN (0u)\r\n#endif\r\n\r\n\r\n/**\r\n * @defgroup mcuxClEls_InterruptOptionEn_t_Macros mcuxClEls_InterruptOptionEn_t\r\n * @brief Defines interrupt enable option values\r\n * @ingroup mcuxClEls_Common_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_ELS_INTERRUPT_ENABLE              (0x01U) ///< Set this option at #mcuxClEls_InterruptOptionEn_t.elsint to allow ELS to trigger an interrupt\r\n#define MCUXCLELS_ELS_INTERRUPT_DISABLE             (0x00U) ///< Set this option at #mcuxClEls_InterruptOptionEn_t.elsint to prevent ELS from triggering an interrupt\r\n#ifdef MCUXCL_FEATURE_ELS_GLITCHDETECTOR\r\n#define MCUXCLELS_GLITCH_DETECTOR_INTERRUPT_ENABLE  ((uint32_t) 1U) ///< Set this option at #mcuxClEls_InterruptOptionEn_t.gdetint to allow the Glitch Detector to trigger an interrupt\r\n#define MCUXCLELS_GLITCH_DETECTOR_INTERRUPT_DISABLE ((uint32_t) 0U) ///< Set this option at #mcuxClEls_InterruptOptionEn_t.gdetint to prevent the Glitch Detector from triggering an interrupt\r\n#endif /* MCUXCL_FEATURE_ELS_GLITCHDETECTOR */\r\n/**@}*/\r\n\r\n/**\r\n * @defgroup mcuxClEls_InterruptOptionRst_t_Macros mcuxClEls_InterruptOptionRst_t\r\n * @brief Defines interrupt reset option values\r\n * @ingroup mcuxClEls_Common_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_ELS_RESET_CLEAR             (0x01U) ///< Set this option at #mcuxClEls_InterruptOptionRst_t.elsint to reset the ELS interrupt flag\r\n#define MCUXCLELS_ELS_RESET_KEEP              (0x00U) ///< Set this option at #mcuxClEls_InterruptOptionRst_t.elsint to keep the ELS interrupt flag\r\n#ifdef MCUXCL_FEATURE_ELS_GLITCHDETECTOR\r\n#define MCUXCLELS_GLITCH_DETECTOR_RESET_CLEAR ((uint32_t) 1U) ///< Set this option at #mcuxClEls_InterruptOptionRst_t.gdetint to reset the Glitch Detector interrupt flag\r\n#define MCUXCLELS_GLITCH_DETECTOR_RESET_KEEP  ((uint32_t) 0U) ///< Set this option at #mcuxClEls_InterruptOptionRst_t.gdetint to keep the Glitch Detector interrupt flag\r\n#endif /* MCUXCL_FEATURE_ELS_GLITCHDETECTOR */\r\n/**@}*/\r\n\r\n/**\r\n * @defgroup mcuxClEls_InterruptOptionSet_t_Macros mcuxClEls_InterruptOptionSet_t\r\n * @brief Defines interrupt set option values\r\n * @ingroup mcuxClEls_Common_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_ELS_INTERRUPT_SET          (0x01U) ///< Set this option at #mcuxClEls_InterruptOptionSet_t.elsint to set the ELS interrupt flag\r\n#define MCUXCLELS_ELS_INTERRUPT_KEEP         (0x00U) ///< Set this option at #mcuxClEls_InterruptOptionSet_t.elsint to leave the ELS interrupt flag unchanged\r\n#ifdef MCUXCL_FEATURE_ELS_GLITCHDETECTOR\r\n#define MCUXCLELS_GLITCH_DETECTOR_NEG_SET    (0x01U) ///< Set this option at #mcuxClEls_InterruptOptionSet_t.gdetint_neg to set the negative Glitch Detector interrupt flag\r\n#define MCUXCLELS_GLITCH_DETECTOR_NEG_KEEP   (0x00U) ///< Set this option at #mcuxClEls_InterruptOptionSet_t.gdetint_neg to leave the negative Glitch Detector interrupt flag unchanged\r\n#define MCUXCLELS_GLITCH_DETECTOR_POS_SET    (0x01U) ///< Set this option at #mcuxClEls_InterruptOptionSet_t.gdetint_pos to set the positive Glitch Detector interrupt flag\r\n#define MCUXCLELS_GLITCH_DETECTOR_POS_KEEP   (0x00U) ///< Set this option at #mcuxClEls_InterruptOptionSet_t.gdetint_pos to leave the positive Glitch Detector interrupt flag unchanged\r\n#endif /* MCUXCL_FEATURE_ELS_GLITCHDETECTOR */\r\n/**@}*/\r\n\r\n/**\r\n * @defgroup MCUXCLELS_ERROR_FLAGS_ MCUXCLELS_ERROR_FLAGS_\r\n * @brief Options for error flag clearing\r\n * @ingroup mcuxClEls_Common_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_ERROR_FLAGS_KEEP  ((mcuxClEls_ErrorHandling_t) 0x0u) ///< Set this option at #mcuxClEls_ErrorHandling_t to not clear any error flags\r\n#define MCUXCLELS_ERROR_FLAGS_CLEAR ((mcuxClEls_ErrorHandling_t) 0x1u) ///< Set this option at #mcuxClEls_ErrorHandling_t to clear all ELS error flags\r\n/**@}*/\r\n\r\n/**\r\n * @defgroup MCUXCLELS_RESET_ MCUXCLELS_RESET_\r\n * @brief Options for reset handling\r\n * @ingroup mcuxClEls_Common_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_RESET_DO_NOT_CANCEL ((mcuxClEls_ResetOption_t) 0x0u) ///< Set this option at #mcuxClEls_ResetOption_t to abort the requested command if another ELS operation is still running\r\n#define MCUXCLELS_RESET_CANCEL        ((mcuxClEls_ResetOption_t) 0x1u) ///< Set this option at #mcuxClEls_ResetOption_t to execute the requested command even if another ELS operation is still running\r\n/**@}*/\r\n\r\n/**\r\n * @defgroup MCUXCLELS_STATUS_PPROT_ MCUXCLELS_STATUS_PPROT_\r\n * @brief Values for the privilege/security level of ELS commands\r\n *\r\n * Note that some keys and memory areas may only be accessible when ELS is on a certain privilege/security level.\r\n *\r\n * The default value, before any command has been executed, is #MCUXCLELS_STATUS_PPROT_UNPRIVILEGED_NONSECURE.\r\n *\r\n * @ingroup mcuxClEls_Common_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_STATUS_PPROT_UNPRIVILEGED_SECURE    ((uint32_t) 0x0u) ///< This value of #mcuxClEls_HwState_t.pprot means that the most recently started ELS operation was or is running in unprivileged secure mode\r\n#define MCUXCLELS_STATUS_PPROT_PRIVILEGED_SECURE      ((uint32_t) 0x1u) ///< This value of #mcuxClEls_HwState_t.pprot means that the most recently started ELS operation was or is running in privileged secure mode\r\n#define MCUXCLELS_STATUS_PPROT_UNPRIVILEGED_NONSECURE ((uint32_t) 0x2u) ///< This value of #mcuxClEls_HwState_t.pprot means that the most recently started ELS operation was or is running in unprivileged non-secure mode\r\n#define MCUXCLELS_STATUS_PPROT_PRIVILEGED_NONSECURE   ((uint32_t) 0x3u) ///< This value of #mcuxClEls_HwState_t.pprot means that the most recently started ELS operation was or is running in privileged non-secure mode\r\n/**@}*/\r\n\r\n/**\r\n * @defgroup MCUXCLELS_STATUS_ECDSAVFY_ MCUXCLELS_STATUS_ECDSAVFY_\r\n * @brief ECDSA verify check values\r\n * @ingroup mcuxClEls_Common_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_STATUS_ECDSAVFY_NORUN  ((uint32_t) 0x0u) ///< This value of #mcuxClEls_HwState_t.ecdsavfy means that no ECDSA verify operation has been executed\r\n#define MCUXCLELS_STATUS_ECDSAVFY_FAIL   ((uint32_t) 0x1u) ///< This value of #mcuxClEls_HwState_t.ecdsavfy means that the most recently finished ECDSA signature verification failed\r\n#define MCUXCLELS_STATUS_ECDSAVFY_OK     ((uint32_t) 0x2u) ///< This value of #mcuxClEls_HwState_t.ecdsavfy means that the most recently finished ECDSA signature verification passed\r\n#define MCUXCLELS_STATUS_ECDSAVFY_ERROR  ((uint32_t) 0x3u) ///< This value of #mcuxClEls_HwState_t.ecdsavfy means that an error has occurred\r\n/**@}*/\r\n\r\n/**\r\n * @defgroup MCUXCLELS_STATUS_DRBGENTLVL_ MCUXCLELS_STATUS_DRBGENTLVL_\r\n * @brief Constants for Entropy quality of the current DRBG instance\r\n * @ingroup mcuxClEls_Common_Macros\r\n * @{ */\r\n#define MCUXCLELS_STATUS_DRBGENTLVL_NONE ((uint32_t) 0x0u) ///< This value of #mcuxClEls_HwState_t.drbgentlvl means that the DRBG is not running\r\n#define MCUXCLELS_STATUS_DRBGENTLVL_LOW  ((uint32_t) 0x1u) ///< This value of #mcuxClEls_HwState_t.drbgentlvl means that the DRBG can generate random numbers with a low security strength (sufficient for commands with a low DRBG security strength requirement, see the function description to check which level is required)\r\n#define MCUXCLELS_STATUS_DRBGENTLVL_HIGH ((uint32_t) 0x2u) ///< This value of #mcuxClEls_HwState_t.drbgentlvl means that the DRBG can generate random numbers with 128 bits of security strength (sufficient for commands with a high DRBG security strength requirement, see the function description to check which level is required)\r\n/** @} */\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_LOCKING\r\n/**\r\n * @defgroup MCUXCLELS_LOCKING_ MCUXCLELS_LOCKING_\r\n * @brief Constants for ELS locking feature\r\n * @ingroup mcuxClEls_Common_Macros\r\n * @{ */\r\n#define MCUXCLELS_MASTER_UNLOCK_ANY         ((uint32_t) 0x1Fu) ///< Any bus master ID can override ELS lock\r\n/** @} */\r\n#endif /* MCUXCL_FEATURE_ELS_LOCKING */\r\n\r\n\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n/**********************************************\r\n * TYPEDEFS\r\n **********************************************/\r\n\r\n/**\r\n * @defgroup mcuxClEls_Common_Types mcuxClEls_Common_Types\r\n * @brief Defines all types of @ref mcuxClEls_Common\r\n * @ingroup mcuxClEls_Common\r\n * @{\r\n */\r\n\r\n/**\r\n * @brief Result type of #mcuxClEls_GetHwVersion\r\n *\r\n * Contains the ELS version value.\r\n */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value; ///< Accesses the bit field as a full word\r\n    } word;             ///< Access #mcuxClEls_HwVersion_t word-wise\r\n    struct\r\n    {\r\n        uint32_t revision :4; ///< Revision number\r\n        uint32_t minor :8;    ///< Minor version\r\n        uint32_t major :4;    ///< Major version\r\n#ifndef MCUXCL_FEATURE_ELS_GET_FW_VERSION\r\n        uint32_t level :4;    ///< Release level version\r\n        uint32_t :12;         ///< RFU\r\n#else /* MCUXCL_FEATURE_ELS_GET_FW_VERSION */\r\n        uint32_t fw_revision :4; ///< Firmware Revision number\r\n        uint32_t fw_minor :8;    ///< Firmware Minor version\r\n        uint32_t fw_major :4;    ///< Firmware Major version\r\n#endif /* MCUXCL_FEATURE_ELS_GET_FW_VERSION */\r\n    } bits;                   ///< Access #mcuxClEls_HwVersion_t bit-wise\r\n} mcuxClEls_HwVersion_t;\r\n\r\n/**\r\n * @brief Result type of #mcuxClEls_GetHwState\r\n *\r\n * Contains ELS status information.\r\n */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value; ///< Accesses the bit field as a full word\r\n    } word;             ///< Access #mcuxClEls_HwState_t word-wise\r\n    struct\r\n    {\r\n        uint32_t busy :1;       ///< ELS is busy\r\n        uint32_t irq :1;        ///< ELS interrupt activated\r\n        uint32_t err :1;        ///< ELS is in error state\r\n        uint32_t prngready :1;  ///< ELS PRNG is seeded and ready to use\r\n        uint32_t ecdsavfy :2;   ///< ECDSA verify operation state (For possible values of this field, see @ref MCUXCLELS_STATUS_ECDSAVFY_)\r\n        uint32_t pprot :2;      ///< The privilege/security level of the most recently started ELS command (For possible values of this field, see @ref MCUXCLELS_STATUS_PPROT_)\r\n        uint32_t drbgentlvl :2; ///< Entropy quality of the current DRBG instance (For possible values of this field, see @ref MCUXCLELS_STATUS_DRBGENTLVL_)\r\n        uint32_t dtrng_busy: 1; ///< Indicates the DTRNG is gathering entropy\r\n#ifdef MCUXCL_FEATURE_ELS_GLITCHDETECTOR\r\n        uint32_t gdet_pos :1;   ///< Glitch detector interrupt activated (positive)\r\n        uint32_t gdet_neg :1;   ///< Glitch detector interrupt activated (negative)\r\n#else\r\n        uint32_t :2;            ///< RFU\r\n#endif /* MCUXCL_FEATURE_ELS_GLITCHDETECTOR */\r\n        uint32_t :3;            ///< RFU\r\n#ifdef MCUXCL_FEATURE_ELS_LOCKING\r\n        uint32_t els_locked :1; ///< ELS is locked\r\n#else\r\n        uint32_t :1;            ///< RFU\r\n#endif /* MCUXCL_FEATURE_ELS_LOCKING */\r\n        uint32_t :15;           ///< RFU\r\n    } bits;                     ///< Access #mcuxClEls_HwState_t bit-wise\r\n} mcuxClEls_HwState_t;\r\n\r\n/**\r\n * @brief Type to handle ELS error clearing options\r\n *\r\n * For possible values, see @ref MCUXCLELS_ERROR_FLAGS_.\r\n */\r\ntypedef uint32_t mcuxClEls_ErrorHandling_t;\r\n\r\n/**\r\n * @brief Type to handle ELS reset options\r\n *\r\n * For possible values, see @ref MCUXCLELS_RESET_.\r\n */\r\ntypedef uint32_t mcuxClEls_ResetOption_t;\r\n\r\n/**\r\n * @brief Command option type for #mcuxClEls_SetIntEnableFlags and #mcuxClEls_GetIntEnableFlags\r\n *\r\n * Used to get/set ELS interrupt enable options.\r\n */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value; ///< Accesses the bit field as a full word\r\n    } word;             ///< Access #mcuxClEls_InterruptOptionEn_t word-wise\r\n    struct\r\n    {\r\n        uint32_t elsint :1;  ///< Whether ELS interrupt should be used. (For possible values of this field, see @ref mcuxClEls_InterruptOptionEn_t_Macros)\r\n#ifdef MCUXCL_FEATURE_ELS_GLITCHDETECTOR\r\n        uint32_t gdetint :1; ///< Whether Glitch detector interrupt should be used. (For possible values of this field, see @ref mcuxClEls_InterruptOptionEn_t_Macros)\r\n#else\r\n        uint32_t :1;         ///< RFU\r\n#endif /* MCUXCL_FEATURE_ELS_GLITCHDETECTOR */\r\n        uint32_t :30;        ///< RFU\r\n    } bits;                  ///< Access #mcuxClEls_InterruptOptionEn_t bit-wise\r\n} mcuxClEls_InterruptOptionEn_t;\r\n\r\n/**\r\n * @brief Type to control which ELS interrupts should be reset when calling #mcuxClEls_ResetIntFlags\r\n */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value; ///< Accesses the bit field as a full word\r\n    } word;             ///< Access #mcuxClEls_InterruptOptionRst_t word-wise\r\n    struct\r\n    {\r\n        uint32_t elsint :1;  ///< Whether ELS interrupt should be reset. (For possible values of this field, see @ref mcuxClEls_InterruptOptionRst_t_Macros)\r\n#ifdef MCUXCL_FEATURE_ELS_GLITCHDETECTOR\r\n        uint32_t gdetint :1; ///< Whether Glitch detector interrupt should be reset. (For possible values of this field, see @ref mcuxClEls_InterruptOptionRst_t_Macros)\r\n#else\r\n        uint32_t :1;         ///< RFU\r\n#endif /* MCUXCL_FEATURE_ELS_GLITCHDETECTOR */\r\n        uint32_t :30;        ///< RFU\r\n    } bits;                  ///< Access #mcuxClEls_InterruptOptionRst_t bit-wise\r\n} mcuxClEls_InterruptOptionRst_t;\r\n\r\n/**\r\n * @brief Type to control which ELS interrupts should be set when calling #mcuxClEls_SetIntFlags\r\n */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value; ///< Accesses the bit field as a full word\r\n    } word;             ///< Access #mcuxClEls_InterruptOptionSet_t word-wise\r\n    struct\r\n    {\r\n        uint32_t elsint :1;     ///< Whether ELS interrupt should be set. (For possible values of this field, see @ref mcuxClEls_InterruptOptionSet_t_Macros)\r\n#ifdef MCUXCL_FEATURE_ELS_GLITCHDETECTOR\r\n        uint32_t gdetint_neg :1;///< Whether Glitch detector neg interrupt should be set. (For possible values of this field, see @ref mcuxClEls_InterruptOptionSet_t_Macros)\r\n        uint32_t gdetint_pos :1;///< Whether Glitch detector pos interrupt should be set. (For possible values of this field, see @ref mcuxClEls_InterruptOptionSet_t_Macros)\r\n#else\r\n        uint32_t :2;            ///< RFU\r\n#endif /* MCUXCL_FEATURE_ELS_GLITCHDETECTOR */\r\n        uint32_t :29;           ///< RFU\r\n    } bits;                     ///< Access #mcuxClEls_InterruptOptionSet_t bit-wise\r\n} mcuxClEls_InterruptOptionSet_t;\r\n\r\n/**\r\n * @brief Result type of #mcuxClEls_GetHwConfig\r\n *\r\n * Contains ELS configuration values.\r\n */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value; ///< Accesses the bit field as a full word\r\n    } word;             ///< Access #mcuxClEls_InterruptOptionSet_t word-wise\r\n    struct\r\n    {\r\n        uint32_t ciphersup :1;       ///< Indicates whether the cipher command is supported\r\n        uint32_t authciphersup :1;   ///< Indicates whether the auth_cipher command is supported\r\n        uint32_t ecsignsup :1;       ///< Indicates whether the ecsign command is supported\r\n        uint32_t ecvfysup :1;        ///< Indicates whether the ecvfy command is supported\r\n        uint32_t eckxchsup :1;       ///< Indicates whether the dhkey_xch command is supported\r\n        uint32_t keygensup :1;       ///< Indicates whether the keygen command is supported\r\n        uint32_t keyinsup :1;        ///< Indicates whether the keyin command is supported\r\n        uint32_t keyoutsup :1;       ///< Indicates whether the keyout command  is supported\r\n        uint32_t kdeletesup :1;      ///< Indicates whether the kdelete command is supported\r\n        uint32_t keyprovsup :1;      ///< Indicates whether the keyprov command is supported\r\n        uint32_t ckdfsup :1;         ///< Indicates whether the ckdf command is supported\r\n        uint32_t hkdfsup :1;         ///< Indicates whether the hkdf command is supported\r\n        uint32_t tlsinitsup :1;      ///< Indicates whether the tls_init command is supported\r\n        uint32_t hashsup :1;         ///< Indicates whether the hash command is supported\r\n        uint32_t hmacsup :1;         ///< Indicates whether the hmac command is supported\r\n        uint32_t cmacsup :1;         ///< Indicates whether the cmac command is supported\r\n        uint32_t drbgreqsup :1;      ///< Indicates whether the drbg_req command is supported\r\n        uint32_t drbgtestsup :1;     ///< Indicates whether the drbg_test command is supported\r\n        uint32_t dtrgncfgloadsup :1; ///< Indicates whether the dtrng_cfg_load command is is supported\r\n        uint32_t dtrngevalsup :1;    ///< Indicates whether the dtrng_eval command is supported\r\n        uint32_t gdetcfgloadsup :1;  ///< Indicates whether the gdet_cfg_load command is supported\r\n        uint32_t gdettrimsup :1;     ///< Indicates whether the gdet_trim command is supported\r\n        uint32_t :10;                ///< RFU\r\n    } bits;                          ///< Access #mcuxClEls_InterruptOptionSet_t bit-wise\r\n} mcuxClEls_HwConfig_t;\r\n\r\n#define drbgreqsub drbgreqsup ///< Deprecated name for #mcuxClEls_HwConfig_t.drbgreqsup\r\n\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Common_Functions mcuxClEls_Common_Functions\r\n * @brief Defines all functions of @ref mcuxClEls_Common\r\n * @ingroup mcuxClEls_Common\r\n * @{\r\n */\r\n/**\r\n * @brief Determines the version of the underlying ELS hardware IP.\r\n *\r\n * @attention This header was delivered as part of a CLNS release which is compatible with a specific ELS hardware IP version.\r\n *\r\n * @param[out] result Pointer which will be filled with the ELS hardware version\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code is always #MCUXCLELS_STATUS_OK\r\n * @else\r\n *  @return An error code that is always #MCUXCLELS_STATUS_OK\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_GetHwVersion)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GetHwVersion(\r\n    mcuxClEls_HwVersion_t * result\r\n    );\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_HWCONFIG\r\n/**\r\n * @brief Determines the hardware configuration of the underlying ELS hardware IP.\r\n *\r\n * @param[out] result Pointer which will be filled with the ELS hardware configuration\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code is always #MCUXCLELS_STATUS_OK\r\n * @else\r\n *  @return An error code that is always #MCUXCLELS_STATUS_OK\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_GetHwConfig)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GetHwConfig(\r\n    mcuxClEls_HwConfig_t * result\r\n    );\r\n#endif /* MCUXCL_FEATURE_ELS_HWCONFIG */\r\n\r\n/**\r\n * @brief Determines the current state of the ELS.\r\n *\r\n * @param[out] result Pointer which will be filled with the ELS status information\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code is always #MCUXCLELS_STATUS_OK\r\n * @else\r\n *  @return An error code that is always #MCUXCLELS_STATUS_OK\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_GetHwState)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GetHwState(\r\n    mcuxClEls_HwState_t * result\r\n    );\r\n\r\n/**\r\n * @brief Enables the ELS.\r\n *\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code is always #MCUXCLELS_STATUS_OK_WAIT\r\n * @else\r\n *  @return An error code that is always #MCUXCLELS_STATUS_OK_WAIT\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Enable_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Enable_Async(\r\n    void\r\n    );\r\n\r\n/**\r\n * @brief Perform a synchronous reset of the ELS.\r\n *\r\n * This means that:\r\n * - any running ELS command will be stopped,\r\n * - all errors will be cleared,\r\n * - all keys will be deleted,\r\n * - any RNG entropy will be discarded,\r\n * - the glitch detector will be reset and\r\n * - the run-time fingerprint will be restored to its default value.\r\n *\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in] options A value indicating whether any running ELS operations shall be canceled\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n *\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the reset\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Reset_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Reset_Async(\r\n    mcuxClEls_ResetOption_t options\r\n    );\r\n\r\n/**\r\n * @brief Disable the ELS.\r\n *\r\n * This is useful as a power saving mechanism.\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code is always #MCUXCLELS_STATUS_OK\r\n * @else\r\n *  @return An error code that is always #MCUXCLELS_STATUS_OK\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Disable)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Disable(\r\n    void\r\n);\r\n\r\n/**\r\n * @brief Set interrupt enable flags.\r\n *\r\n * @param[in] options The command options, determining which interrupts should be enabled or disabled. For more information, see #mcuxClEls_InterruptOptionEn_t.\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code is always #MCUXCLELS_STATUS_OK\r\n * @else\r\n *  @return An error code that is always #MCUXCLELS_STATUS_OK\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_SetIntEnableFlags)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_SetIntEnableFlags(\r\n    mcuxClEls_InterruptOptionEn_t options\r\n    );\r\n\r\n/**\r\n * @brief Get interrupt enable flags.\r\n *\r\n * @param[out] result Pointer which is filled with the configuration of the interrupts enable register.\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code is always #MCUXCLELS_STATUS_OK\r\n * @else\r\n *  @return An error code that is always #MCUXCLELS_STATUS_OK\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_GetIntEnableFlags)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GetIntEnableFlags(\r\n    mcuxClEls_InterruptOptionEn_t * result\r\n    );\r\n\r\n/**\r\n * @brief Clear the interrupt status register.\r\n *\r\n * @param[in] options The command options, determining which interrupt status bits should be cleared. For more information, see #mcuxClEls_InterruptOptionRst_t.\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code is always #MCUXCLELS_STATUS_OK\r\n * @else\r\n *  @return An error code that is always #MCUXCLELS_STATUS_OK\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_ResetIntFlags)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_ResetIntFlags(\r\n    mcuxClEls_InterruptOptionRst_t options\r\n    );\r\n\r\n/**\r\n * @brief Set the interrupt status register, for debug and testing purposes.\r\n *\r\n * @param[in] options The command options, determining which interrupt status bits should be set. For more information, see #mcuxClEls_InterruptOptionSet_t.\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code is always #MCUXCLELS_STATUS_OK\r\n * @else\r\n *  @return An error code that is always #MCUXCLELS_STATUS_OK\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_SetIntFlags)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_SetIntFlags(\r\n    mcuxClEls_InterruptOptionSet_t options\r\n    );\r\n\r\n/**\r\n * @brief Wait for an ELS operation and optionally clear the error status.\r\n *\r\n * If an ELS operation is active, this function waits for completion of that operation. For this, the\r\n * busy flag of ELS is polled. Additionally, this function checks and returns any applicable error indication.\r\n * If no operation is active, the function returns immediately.\r\n *\r\n * @param[in] errorHandling Define if error flags shall be cleared.\r\n *\r\n * @retval #MCUXCLELS_STATUS_OK if the last operation was successful, or no operation was active\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_WaitForOperation)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_WaitForOperation(\r\n    mcuxClEls_ErrorHandling_t errorHandling\r\n    );\r\n\r\n/**\r\n * @brief Await the completion of an ELS operation for a limited amount of time and optionally clear the error status.\r\n *\r\n * If an ELS operation is active, this function waits for completion of that operation until a counter expires.\r\n * For this, the busy flag of ELS is polled. The counting mechanism behaves like a simple for-loop from\r\n * @p counterLimit to one. This counter does not have a well-defined relationship to real-world time.\r\n * Additionally, this function checks and returns any applicable error indication.\r\n * If no operation is active, the function returns immediately.\r\n *\r\n * @param[in] counterLimit The limit of the wait counter.\r\n * @param[in] errorHandling Define if error flags shall be cleared.\r\n *\r\n * @retval #MCUXCLELS_STATUS_OK if the last operation was successful, or no operation was active\r\n * @retval #MCUXCLELS_STATUS_SW_COUNTER_EXPIRED if the counter expired while waiting for the operation to complete\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_LimitedWaitForOperation)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_LimitedWaitForOperation(\r\n    uint32_t counterLimit,\r\n    mcuxClEls_ErrorHandling_t errorHandling\r\n    );\r\n\r\n/**\r\n * @brief Resets all error flags that have been set by a previous operation.\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code is always #MCUXCLELS_STATUS_OK\r\n * @else\r\n *  @return An error code that is always #MCUXCLELS_STATUS_OK\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_ResetErrorFlags)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_ResetErrorFlags(\r\n    void);\r\n\r\n/**\r\n * @brief Get the last ELS error code and optionally clear the error status.\r\n *\r\n * @param[in] errorHandling Define if error flags shall be cleared.\r\n *\r\n * @retval #MCUXCLELS_STATUS_OK \tif the last operation was successful or no operation was active\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_GetErrorCode)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GetErrorCode(\r\n    mcuxClEls_ErrorHandling_t errorHandling\r\n    );\r\n\r\n/**\r\n * @brief Get the last ELS error code and level and optionally clear the error status.\r\n *\r\n * @param[in]  errorHandling    Define if error flags shall be cleared.\r\n * @param[out] errorLevel       Pointer to the location that will receive the value of the error level.\r\n *\r\n * @retval #MCUXCLELS_STATUS_OK  if the last operation was successful or no operation was active\r\n * @retval #MCUXCLELS_STATUS_    if the last operation resulted in an error\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_GetErrorLevel)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GetErrorLevel(\r\n    mcuxClEls_ErrorHandling_t errorHandling,\r\n    uint32_t *errorLevel\r\n    );\r\n\r\n/**\r\n * @brief Set the random start delay for AES based operations. This impacts mcuxClEls_Aead_*, mcuxClEls_Cipher_*, mcuxClEls_Cmac_*, ncpClEls_Ckdf_*, mcuxClEls_KeyImport_Async, mcuxClEls_KeyExport_Async\r\n *\r\n * @param[in] startDelay Define the max random start delay. Acceptable values are a power of 2 minus one, starting from 0 to 1023 (0, 1, 3, 7, ..., 1023).\r\n *\r\n * @retval #MCUXCLELS_STATUS_OK if the operation was successful\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_SetRandomStartDelay)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_SetRandomStartDelay(\r\n    uint32_t startDelay\r\n    );\r\n\r\n/**\r\n * @brief Get the random start delay for AES based operations.\r\n *\r\n * @param[out] startDelay Pointer to store random start delay configuration.\r\n *\r\n * @retval #MCUXCLELS_STATUS_OK if the operation was successful\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_GetRandomStartDelay)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GetRandomStartDelay(\r\n    uint32_t * startDelay\r\n    );\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_LOCKING\r\n/**\r\n * @brief Lock ELS to a session\r\n *\r\n * This operation locks the ELS, when the lock is obtained a nonzero value will be stored in @p sessionId, and the PPROT and bus Master ID\r\n * of the locking command will be recorded. Subsequent unlocking can only be done by one of the following:\r\n *      1.  ELS reset\r\n *      2.  Normal unlock: calling #mcuxClEls_ReleaseLock with the correct @p sessionId, from the same bus Master ID and using the same PPROT settings.\r\n *      3.  Privileged unlock: calling #mcuxClEls_ReleaseLock with any value of @p sessionId, from the bus Master ID set with the #mcuxClEls_SetMasterUnlock\r\n *          command and PPROT settings 'secure privileged'.\r\n * While ELS is locked read access is only permitted to ELS_STATUS and ELS_SESSION_ID and writes are only permitted to ELS_RESET, except for accesses that\r\n * have the same bus Master ID and PPROT settings.\r\n *\r\n * @param[out] pSessionId  The session identifier assigned to the lock, it is required to unlock the session, it will be zero when a lock could not be obtained.\r\n *\r\n * @retval #MCUXCLELS_STATUS_OK                  if the operation was successful\r\n * @retval #MCUXCLELS_STATUS_SW_LOCKING_FAILED   if the operation was not successful\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_GetLock)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GetLock(\r\n    uint32_t * pSessionId\r\n    );\r\n\r\n/**\r\n * @brief Release ELS lock for the session\r\n *\r\n * This operation unlocks the ELS when following conditions are met:\r\n *      1.  Normal unlock: providing the correct @p sessionId, from the same bus Master ID and using the same PPROT settings.\r\n *      2.  Privileged unlock: providing any value of @p sessionId, from the bus Master ID set with the #mcuxClEls_SetMasterUnlock command\r\n *          and PPROT settings 'secure privileged'.\r\n * Invalid attempts to unlock ELS will result in a bus error.\r\n *\r\n * @param[in] sessionId  The session identifier obtained while locking ELS\r\n *\r\n * @retval #MCUXCLELS_STATUS_OK   if the operation was successful\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_ReleaseLock)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_ReleaseLock(\r\n    uint32_t sessionId\r\n    );\r\n\r\n/**\r\n * @brief Check if ELS is locked\r\n *\r\n * This operation returns the locking status of ELS.\r\n *\r\n * @retval #MCUXCLELS_STATUS_OK                  if the operation was successful and ELS is not locked\r\n * @retval #MCUXCLELS_STATUS_SW_STATUS_LOCKED    if the operation was successful and ELS is locked\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_IsLocked)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_IsLocked(void);\r\n\r\n/**\r\n * @brief Set the bus master ID that can unlock ELS\r\n *\r\n * This operation sets the bus master ID of the master that can override ELS lock. This command can only be executed once after reset.\r\n * Invalid attempts to set the bus master ID will result in a bus error.\r\n *\r\n * @param[in] masterId  The bus master identifier that can override the ELS lock. Special value #MCUXCLELS_MASTER_UNLOCK_ANY allows any bus master identifier to override the ELS lock.\r\n *\r\n * @retval #MCUXCLELS_STATUS_OK                   if the operation was successful\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_SetMasterUnlock)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_SetMasterUnlock(\r\n    uint32_t masterId\r\n    );\r\n\r\n#endif /* MCUXCL_FEATURE_ELS_LOCKING */\r\n\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_DMA_ADDRESS_READBACK\r\n/**\r\n * @brief Reads back the last address processed by the ELS DMA (security feature)\r\n *\r\n * @param[out] pLastAddress\tPointer to the last address read/written by the ELS DMA\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code is always #MCUXCLELS_STATUS_OK\r\n * @else\r\n *  @return An error code that is always #MCUXCLELS_STATUS_OK\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_GetLastDmaAddress)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GetLastDmaAddress(\r\n    uint32_t* pLastAddress\r\n    );\r\n#endif /* MCUXCL_FEATURE_ELS_DMA_ADDRESS_READBACK */\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_DMA_FINAL_ADDRESS_READBACK\r\n/**\r\n * @brief Compares the last address processed by the ELS DMA with the expected final address of the output buffer given to the last ELS command (security feature).\r\n *        The given address @p outputStartAddress and expected length @p expectedLength determine the expected final address.\r\n *        This function can be used to verify that the final DMA transfer of an ELS command has completed as expected.\r\n *\r\n * @param[in] outputStartAddress Pointer to the output buffer of the last ELS operation\r\n * @param[in] expectedLength     Expected length of the output buffer of the last ELS operation\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n *\r\n * @retval #MCUXCLELS_STATUS_SW_COMPARISON_FAILED if the comparison between the expected final address and the actual final address processed by ELS fails\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT              if the comparison was successful\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_CompareDmaFinalOutputAddress)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_CompareDmaFinalOutputAddress(\r\n        uint8_t *outputStartAddress,\r\n        size_t expectedLength\r\n        );\r\n#endif /* MCUXCL_FEATURE_ELS_DMA_FINAL_ADDRESS_READBACK  */\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLELS_COMMON_H_ */\r\n\r\n/**\r\n * @}\r\n *\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/inc/mcuxClEls_Crc.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2021-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxClEls_Crc.h\r\n * @brief ELS header for Command CRC functionality.\r\n *\r\n * This header exposes functions that support the usage of the Command CRC feature for ELS.\r\n */\r\n/**\r\n * @defgroup mcuxClEls_Crc mcuxClEls_Crc\r\n * @brief This part of the @ref mcuxClEls driver defines the Command CRC functionality\r\n * @ingroup mcuxClEls\r\n * @{\r\n */\r\n#ifndef MCUXCLELS_CRC_H_\r\n#define MCUXCLELS_CRC_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n#include <mcuxClEls_Types.h> // Common types\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxClCore_FunctionIdentifiers.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * CONSTANTS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Crc_Macros mcuxClEls_Crc_Macros\r\n * @brief Defines all macros of @ref mcuxClEls_Crc\r\n * @ingroup mcuxClEls_Crc\r\n * @{\r\n */\r\n\r\n/**\r\n * @defgroup MCUXCLELS_CMD_CRC_ MCUXCLELS_CMD_CRC_\r\n * @brief Constants for ELS Command CRC\r\n * @ingroup mcuxClEls_Crc_Macros\r\n * @{ */\r\n#define MCUXCLELS_CMD_CRC_VALUE_RESET    ((uint32_t) 0x1u) ///< Reset the Command CRC to initial value\r\n#define MCUXCLELS_CMD_CRC_VALUE_ENABLE   ((uint32_t) 0x2u) ///< Enable update of Command CRC value by executing commands\r\n#define MCUXCLELS_CMD_CRC_VALUE_DISABLE  ((uint32_t) 0x0u) ///< Disable update of Command CRC value by executing commands\r\n\r\n#define MCUXCLELS_CMD_CRC_RESET          ((uint32_t) 0x1u) ///< Reset the Command CRC to initial value\r\n#define MCUXCLELS_CMD_CRC_ENABLE         ((uint32_t) 0x1u) ///< Enable update of Command CRC value by executing commands\r\n#define MCUXCLELS_CMD_CRC_DISABLE        ((uint32_t) 0x0u) ///< Disable update of Command CRC value by executing commands\r\n\r\n#define MCUXCLELS_CMD_CRC_POLYNOMIAL     ((uint32_t) 0x04C11DB7u) ///< CRC polynomial for the Command CRC\r\n#define MCUXCLELS_CMD_CRC_INITIAL_VALUE  ((uint32_t) 0xA5A5A5A5u) ///< Initial value for the Command CRC\r\n/** @} */\r\n\r\n/**\r\n * @defgroup MCUXCLELS_CMD_CRC_REFERENCE_ MCUXCLELS_CMD_CRC_REFERENCE_\r\n * @brief Macros for reference ELS Command CRC\r\n * @ingroup mcuxClEls_Crc_Macros\r\n * @{\r\n */\r\n\r\n/**\r\n * @brief Initializes a reference CRC variable with the command CRC initial value.\r\n *        The new variable has the given name.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_INIT(crc)  \\\r\n    uint32_t (crc) = MCUXCLELS_CMD_CRC_INITIAL_VALUE\r\n\r\n/**\r\n * @brief Resets the given reference CRC variable to the command CRC initial value.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_RESET(crc)  \\\r\n    (crc) = MCUXCLELS_CMD_CRC_INITIAL_VALUE\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Aead_Init_Async.\r\n */\r\n#ifndef MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_AEAD_INIT(crc, options)                \\\r\n  ({                                                                             \\\r\n    (options).bits.acpmod = MCUXCLELS_AEAD_ACPMOD_INIT;                           \\\r\n    (options).bits.lastinit = MCUXCLELS_AEAD_LASTINIT_TRUE;                       \\\r\n    (options).bits.acpsie = MCUXCLELS_AEAD_STATE_IN_DISABLE;                      \\\r\n    (options).bits.acpsoe = MCUXCLELS_AEAD_STATE_OUT_ENABLE;                      \\\r\n    mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_AUTH_CIPHER, (options).word.value, &(crc)); \\\r\n\t(retVal);                                                                    \\\r\n  })\r\n#else\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_AEAD_INIT(crc, options)                \\\r\n  ({                                                                             \\\r\n    (options).bits.acpmod = MCUXCLELS_AEAD_ACPMOD_INIT;                           \\\r\n    (options).bits.lastinit = MCUXCLELS_AEAD_LASTINIT_TRUE;                       \\\r\n    (options).bits.acpsie = MCUXCLELS_AEAD_STATE_IN_DISABLE;                      \\\r\n    mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_AUTH_CIPHER, (options).word.value, &(crc)); \\\r\n    (retVal);                                                                    \\\r\n  })\r\n#endif /* MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS */\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Aead_PartialInit_Async.\r\n */\r\n#ifndef MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_AEAD_PARTIALINIT(crc, options)         \\\r\n  ({                                                                             \\\r\n    (options).bits.acpmod = MCUXCLELS_AEAD_ACPMOD_INIT;                           \\\r\n    (options).bits.acpsoe = MCUXCLELS_AEAD_STATE_OUT_ENABLE;                      \\\r\n    mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_AUTH_CIPHER, (options).word.value, &(crc)); \\\r\n    (retVal);                                                                    \\\r\n  })\r\n#else\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_AEAD_PARTIALINIT(crc, options)         \\\r\n  ({                                                                             \\\r\n    (options).bits.acpmod = MCUXCLELS_AEAD_ACPMOD_INIT;                           \\\r\n    mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_AUTH_CIPHER, (options).word.value, &(crc)); \\\r\n    (retVal);                                                                    \\\r\n  })\r\n#endif /* MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS */\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Aead_UpdateAad_Async.\r\n */\r\n#ifndef MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_AEAD_UPDATEAAD(crc, options)           \\\r\n  ({                                                                             \\\r\n    (options).bits.acpmod = MCUXCLELS_AEAD_ACPMOD_AADPROC                         \\\r\n    (options).bits.acpsie = MCUXCLELS_AEAD_STATE_IN_ENABLE;                       \\\r\n    (options).bits.acpsoe = MCUXCLELS_AEAD_STATE_OUT_ENABLE;                      \\\r\n    mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_AUTH_CIPHER, (options).word.value, &(crc)); \\\r\n    (retVal);                                                                    \\\r\n  })\r\n#else\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_AEAD_UPDATEAAD(crc, options)           \\\r\n  ({                                                                             \\\r\n    (options).bits.acpmod = MCUXCLELS_AEAD_ACPMOD_AADPROC;                        \\\r\n    mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_AUTH_CIPHER, (options).word.value, &(crc)); \\\r\n    (retVal);                                                                    \\\r\n  })\r\n#endif /* MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS */\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Aead_UpdateData_Async.\r\n */\r\n#ifndef MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_AEAD_UPDATEDATA(crc, options)          \\\r\n  ({                                                                             \\\r\n    (options).bits.acpmod = MCUXCLELS_AEAD_ACPMOD_MSGPROC                         \\\r\n    (options).bits.acpsie = MCUXCLELS_AEAD_STATE_IN_ENABLE;                       \\\r\n    (options).bits.acpsoe = MCUXCLELS_AEAD_STATE_OUT_ENABLE;                      \\\r\n    mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_AUTH_CIPHER, (options).word.value, &(crc)); \\\r\n    (retVal);                                                                    \\\r\n  })\r\n#else\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_AEAD_UPDATEDATA(crc, options)          \\\r\n  ({                                                                             \\\r\n    (options).bits.acpmod = MCUXCLELS_AEAD_ACPMOD_MSGPROC;                        \\\r\n    mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_AUTH_CIPHER, (options).word.value, &(crc)); \\\r\n    (retVal);                                                                    \\\r\n  })\r\n#endif /* MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS */\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Aead_Finalize_Async.\r\n */\r\n#ifndef MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_AEAD_FINALIZE(crc, options)            \\\r\n  ({                                                                             \\\r\n    (options).bits.acpmod = MCUXCLELS_AEAD_ACPMOD_FINAL                           \\\r\n    (options).bits.acpsie = MCUXCLELS_AEAD_STATE_IN_ENABLE;                       \\\r\n    mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_AUTH_CIPHER, (options).word.value, &(crc)); \\\r\n    (retVal);                                                                    \\\r\n  })\r\n#else\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_AEAD_FINALIZE(crc, options)            \\\r\n  ({                                                                             \\\r\n    (options).bits.acpmod = MCUXCLELS_AEAD_ACPMOD_FINAL;                          \\\r\n    mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_AUTH_CIPHER, (options).word.value, &(crc)); \\\r\n    (retVal);                                                                    \\\r\n  })\r\n#endif /* MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS */\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Cipher_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_CIPHER(crc, options)                   \\\r\n    mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_CIPHER, (options).word.value, &(crc))\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Cmac_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_CMAC(crc, options)                     \\\r\n    mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_CMAC, (options).word.value, &(crc))\r\n\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_EccKeyGen_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_ECCKEYGEN(crc, options)                \\\r\n  ({                                                                             \\\r\n    (options).bits.revf = MCUXCLELS_ECC_REVERSEFETCH_ENABLE;                      \\\r\n    mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_KEYGEN, (options).word.value, &(crc)); \\\r\n    (retVal);                                                                    \\\r\n  })\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_EccKeyExchange_Async.\r\n */\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL_BIT\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_ECCKEYEXCHANGE(crc)                                 \\\r\n    ({                                                                                        \\\r\n        mcuxClEls_EccKeyExchOption_t options = {0u};                                           \\\r\n        options.bits.revf = MCUXCLELS_ECC_REVERSEFETCH_ENABLE;                                 \\\r\n        options.bits.extkey = MCUXCLELS_ECC_EXTKEY_EXTERNAL;                                   \\\r\n        mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_ECKXH, options.word.value, &(crc));     \\\r\n        (retVal);                                                                             \\\r\n    })\r\n#else\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_ECCKEYEXCHANGE(crc)                                 \\\r\n    ({                                                                                        \\\r\n        mcuxClEls_EccKeyExchOption_t options = {0u};                                           \\\r\n        options.bits.revf = MCUXCLELS_ECC_REVERSEFETCH_ENABLE;                                 \\\r\n        mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_ECKXH, options.word.value, &(crc));     \\\r\n        (retVal);                                                                             \\\r\n    })\r\n#endif /* MCUXCL_FEATURE_ELS_PUK_INTERNAL_BIT */\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_EccKeyExchangeInt_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_ECCKEYEXCHANGEINT(crc)                              \\\r\n    ({                                                                                        \\\r\n        mcuxClEls_EccKeyExchOption_t options = {0u};                                           \\\r\n        options.bits.revf = MCUXCLELS_ECC_REVERSEFETCH_ENABLE;                                 \\\r\n        options.bits.extkey = MCUXCLELS_ECC_EXTKEY_INTERNAL;                                   \\\r\n        mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_ECKXH, options.word.value, &(crc));     \\\r\n        (retVal);                                                                             \\\r\n    })\r\n#endif /* MCUXCL_FEATURE_ELS_PUK_INTERNAL */\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_EccSign_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_ECCSIGN(crc, options)                             \\\r\n  ({                                                                                        \\\r\n    (options).bits.revf = MCUXCLELS_ECC_REVERSEFETCH_ENABLE;                                 \\\r\n    mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_ECSIGN, (options).word.value, &(crc)); \\\r\n    (retVal);                                                                               \\\r\n  })\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_EccVerify_Async.\r\n */\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL_BIT\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_ECCVERFIFY(crc, options)                          \\\r\n  ({                                                                                        \\\r\n    (options).bits.revf = MCUXCLELS_ECC_REVERSEFETCH_ENABLE;                                 \\\r\n    (options).bits.extkey = MCUXCLELS_ECC_EXTKEY_EXTERNAL;                                   \\\r\n    mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_ECVFY, (options).word.value, &(crc)); \\\r\n    (retVal);                                                                               \\\r\n  })\r\n#else\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_ECCVERFIFY(crc, options)                          \\\r\n  ({                                                                                        \\\r\n    (options).bits.revf = MCUXCLELS_ECC_REVERSEFETCH_ENABLE;                                 \\\r\n    mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_ECVFY, (options).word.value, &(crc)); \\\r\n    (retVal);                                                                               \\\r\n  })\r\n#endif /* MCUXCL_FEATURE_ELS_PUK_INTERNAL_BIT */\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_EccVerifyInt_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_ECCVERFIFYINT(crc, options)            \\\r\n  ({                                                                             \\\r\n    (options).bits.revf = MCUXCLELS_ECC_REVERSEFETCH_ENABLE;                      \\\r\n    (options).bits.extkey = MCUXCLELS_ECC_EXTKEY_INTERNAL;                        \\\r\n    mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_ECVFY, (options).word.value, &(crc)); \\\r\n    (retVal);                                                                    \\\r\n  })\r\n#endif /* MCUXCL_FEATURE_ELS_PUK_INTERNAL */\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_GlitchDetector_LoadConfig_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_GLITCHDETECTOR_LOADCONFIG(crc)         \\\r\n    mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_GDET_CFG_LOAD, 0u, &(crc))\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_GlitchDetector_Trim_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_GLITCHDETECTOR_TRIM(crc)               \\\r\n    mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_GDET_TRIM, 0u, &(crc))\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Hash_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_HASH(crc, options)                     \\\r\n    mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_HASH, (options).word.value, &(crc))\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Hmac_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_HMAC(crc, options)                     \\\r\n    mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_HMAC, (options).word.value, &(crc))\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Ckdf_Sp800108_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_CKDF_SP800108(crc)                                 \\\r\n    ({                                                                                       \\\r\n        mcuxClEls_CkdfOption_t options = {0u};                                                \\\r\n        options.bits.ckdf_algo = MCUXCLELS_CKDF_ALGO_SP800108;                                \\\r\n        mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_CKDF, options.word.value, &(crc));     \\\r\n        (retVal);                                                                            \\\r\n    })\r\n\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Hkdf_Rfc5869_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_HKDF_RFC5869(crc, options)                                               \\\r\n  ({                                                                                                               \\\r\n    (options).bits.hkdf_algo = MCUXCLELS_HKDF_ALGO_RFC5869;                                                         \\\r\n    mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_HKDF, (options).word.value, &(crc));    \\\r\n    (retVal);                                                                                                      \\\r\n  })\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Hkdf_Sp80056c_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_HKDF_SP80056C(crc)                                     \\\r\n    ({                                                                                           \\\r\n        mcuxClEls_HkdfOption_t options = {0u};                                                    \\\r\n        options.bits.hkdf_algo = MCUXCLELS_HKDF_ALGO_SP80056C;                                    \\\r\n        mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_HKDF, options.word.value, &(crc));     \\\r\n        (retVal);                                                                                \\\r\n    })\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_TlsGenerateMasterKeyFromPreMasterKey_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_TLSGENERATEMASTERKEYFROMPREMASTERKEY(crc)              \\\r\n    ({                                                                                           \\\r\n        mcuxClEls_TlsOption_t options = {0u};                                                     \\\r\n        options.bits.mode = MCUXCLELS_TLS_INIT;                                                   \\\r\n        mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_TLS, options.word.value, &(crc));          \\\r\n        (retVal);                                                                                \\\r\n    })\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_TlsGenerateSessionKeysFromMasterKey_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_TLSGENERATESESSIONKEYSFROMMASTERKEY(crc)               \\\r\n    ({                                                                                           \\\r\n        mcuxClEls_TlsOption_t options = {0u};                                                     \\\r\n        options.bits.mode = MCUXCLELS_TLS_FINALIZE;                                               \\\r\n        mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_TLS, options.word.value, &(crc));          \\\r\n        (retVal);                                                                                \\\r\n    })\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_KeyDelete_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_KEYDELETE(crc)                         \\\r\n    mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_KDELETE, 0u, &(crc))\r\n\r\n\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_KeyImport_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_KEYIMPORT(crc, options)                \\\r\n    mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_KEYIN, (options).word.value, &(crc))\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_KeyImportPuk_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_KEYIMPORTPUK(crc)                                  \\\r\n    ({                                                                                       \\\r\n        mcuxClEls_KeyImportOption_t options = {0u};                                           \\\r\n        options.bits.revf = MCUXCLELS_KEYIMPORT_REVERSEFETCH_ENABLE;                          \\\r\n        options.bits.kfmt = MCUXCLELS_KEYIMPORT_KFMT_PBK;                                     \\\r\n        mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_KEYIN, options.word.value, &(crc));    \\\r\n        (retVal);                                                                            \\\r\n    })\r\n#endif /* MCUXCL_FEATURE_ELS_PUK_INTERNAL */\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_KeyExport_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_KEYEXPORT(crc)                                                              \\\r\n    ({                                                                                                                \\\r\n        mcuxClEls_Status_t retVal = mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_KEYOUT, 0u, &(crc));                 \\\r\n        mcuxClEls_KeyImportOption_t import_options = {0u};                                                             \\\r\n        import_options.bits.kfmt = MCUXCLELS_KEYIMPORT_KFMT_RFC3394;                                                   \\\r\n        retVal = MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_KEYDELETE(crc);                                                    \\\r\n        retVal = MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_KEYIMPORT(crc, import_options);                         \\\r\n        (retVal);                                                                                                     \\\r\n    })\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Rng_DrbgRequest_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_RNG_DRBGREQUEST(crc)                  \\\r\n    mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_RND_REQ, 0u, &(crc))\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_RND_RAW\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Rng_DrbgRequestRaw_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_RNG_DRBGREQUESTRAW(crc)               \\\r\n    mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_RND_REQ, MCUXCLELS_RNG_RND_REQ_RND_RAW, &(crc))\r\n#endif /* MCUXCL_FEATURE_ELS_RND_RAW */\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Rng_DrbgTestInstantiate_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_RNG_DRBGTESTINSTANTIATE(crc)                        \\\r\n    mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_DRBG_TEST, MCUXCLELS_RNG_DRBG_TEST_MODE_INSTANTIATE, &(crc))\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Rng_DrbgTestExtract_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_RNG_DRBGTESTEXTRACT(crc)                             \\\r\n    mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_DRBG_TEST, MCUXCLELS_RNG_DRBG_TEST_MODE_EXTRACT, &(crc))\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Rng_DrbgTestAesEcb_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_RNG_DRBGTESTAESECB(crc)                             \\\r\n    mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_DRBG_TEST, MCUXCLELS_RNG_DRBG_TEST_MODE_AES_ECB, &(crc))\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Rng_DrbgTestAesCtr_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_RNG_DRBGTESTAESCTR(crc)                             \\\r\n    mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_DRBG_TEST, MCUXCLELS_RNG_DRBG_TEST_MODE_AES_CTR, &(crc))\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Rng_Dtrng_ConfigLoad_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_RNG_DTRNG_CONFIGLOAD(crc)             \\\r\n    mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_DTRNG_CFG_LOAD, 0u, &(crc))\r\n\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Rng_Dtrng_ConfigEvaluate_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_RNG_DTRNG_CONFIGEVALUATE(crc)         \\\r\n    mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_DTRNG_EVAL, 0u, &(crc))\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_PRND_INIT\r\n/**\r\n * @brief Updates given reference command CRC with command @ref mcuxClEls_Prng_Init_Async.\r\n */\r\n#define MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_PRNG_INIT(crc)                               \\\r\n    mcuxClEls_UpdateRefCRC(MCUXCLELS_CMD_CRC_CMD_ID_RND_REQ, MCUXCLELS_RNG_RND_REQ_PRND_INIT, &(crc))\r\n#endif /* MCUXCL_FEATURE_ELS_PRND_INIT */\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @defgroup MCUXCLELS_CMD_CRC_CMD_ID_ MCUXCLELS_CMD_CRC_CMD_ID_\r\n * @brief Constants for ELS Command IDs\r\n * @ingroup mcuxClEls_Crc_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_CIPHER          0 ///< ELS Command ID for CIPHER command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_AUTH_CIPHER     1 ///< ELS Command ID for AUTH_CIPHER command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_CHAL_RESP_GEN   3 ///< ELS Command ID for CHAL_RESP_GEN command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_ECSIGN          4 ///< ELS Command ID for ECSIGN command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_ECVFY           5 ///< ELS Command ID for ECVFY command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_ECKXH           6 ///< ELS Command ID for ECKXH command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_KEYGEN          8 ///< ELS Command ID for KEYGEN command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_KEYIN           9 ///< ELS Command ID for KEYIN command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_KEYOUT         10 ///< ELS Command ID for KEYOUT command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_KDELETE        11 ///< ELS Command ID for KDELETE command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_KEYPROV        12 ///< ELS Command ID for KEYPROV command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_CKDF           16 ///< ELS Command ID for CKDF command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_HKDF           17 ///< ELS Command ID for HKDF command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_TLS            18 ///< ELS Command ID for TLS command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_HASH           20 ///< ELS Command ID for HASH command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_HMAC           21 ///< ELS Command ID for HMAC command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_CMAC           22 ///< ELS Command ID for CMAC command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_RND_REQ        24 ///< ELS Command ID for RND_REQ command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_DRBG_TEST      25 ///< ELS Command ID for DRBG_TEST command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_DTRNG_CFG_LOAD 28 ///< ELS Command ID for DTRNG_CFG_LOAD command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_DTRNG_EVAL     29 ///< ELS Command ID for DTRNG_EVAL command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_GDET_CFG_LOAD  30 ///< ELS Command ID for GDET_CFG_LOAD command\r\n#define MCUXCLELS_CMD_CRC_CMD_ID_GDET_TRIM      31 ///< ELS Command ID for GDET_TRIM command\r\n/**\r\n * @}\r\n *\r\n * @}\r\n */\r\n\r\n/**********************************************\r\n * TYPEDEFS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Crc_Types mcuxClEls_Crc_Types\r\n * @brief Defines all types of @ref mcuxClEls_Crc\r\n * @ingroup mcuxClEls_Crc\r\n * @{\r\n */\r\n\r\n/**\r\n * @brief Type to control ELS Command CRC\r\n */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value;         ///< Accesses the bit field as a full word\r\n    } word;\r\n    struct\r\n    {\r\n        uint32_t reset :1;      ///< Reset the Command CRC to initial value, set by #MCUXCLELS_CMD_CRC_RESET\r\n        uint32_t enable :1;     ///< Enable/Disable update of Command CRC value by executing commands, set with #MCUXCLELS_CMD_CRC_ENABLE / #MCUXCLELS_CMD_CRC_DISABLE\r\n        uint32_t : 30;          ///< RFU\r\n    } bits;                     ///< Access #mcuxClEls_CommandCrcConfig_t bit-wise\r\n} mcuxClEls_CommandCrcConfig_t;\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Crc_Functions mcuxClEls_Crc_Functions\r\n * @brief Defines all functions of @ref mcuxClEls_Crc\r\n * @ingroup mcuxClEls_Crc\r\n * @{\r\n */\r\n\r\n/**\r\n * @brief Set command CRC flags.\r\n *\r\n * @param[in] options    The command CRC options. For more information, see #mcuxClEls_CommandCrcConfig_t.\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code is always #MCUXCLELS_STATUS_OK\r\n * @else\r\n *  @return An error code that is always #MCUXCLELS_STATUS_OK\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_ConfigureCommandCRC)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_ConfigureCommandCRC(\r\n    mcuxClEls_CommandCrcConfig_t options\r\n    );\r\n\r\n/**\r\n * @brief Get the current command CRC value.\r\n *\r\n * @param[out] commandCrc    The command CRC value.\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection).\r\n *  @retval MCUXCLELS_STATUS_OK                Operation successful\r\n *  @retval MCUXCLELS_STATUS_SW_INVALID_PARAM  Parameter commandCRC points to NULL\r\n * @else\r\n *  @return An error code\r\n *  @retval MCUXCLELS_STATUS_OK                Operation successful\r\n *  @retval MCUXCLELS_STATUS_SW_INVALID_PARAM  Parameter commandCRC points to NULL\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_GetCommandCRC)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GetCommandCRC(\r\n    uint32_t* commandCrc\r\n    );\r\n\r\n/**\r\n * @brief Verifies a reference CRC against the computed ELS command CRC.\r\n *\r\n * @param[in] refCrc The reference CRC value.\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_VerifyVsRefCRC)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_VerifyVsRefCRC(\r\n    uint32_t refCrc\r\n    );\r\n\r\n/**\r\n * @brief Updates a reference CRC with the parameters of an ELS command.\r\n *        This can be used to verify against the ELS command CRC.\r\n *\r\n * @param[in]     command  The ELS command ID.\r\n * @param[in]     options  The command options for the given ELS command.\r\n * @param[in,out] refCrc   The current reference CRC value to update.\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection).\r\n *  @retval MCUXCLELS_STATUS_OK                Operation successful\r\n *  @retval MCUXCLELS_STATUS_SW_INVALID_PARAM  Parameter crc points to NULL\r\n * @else\r\n *  @return An error code\r\n *  @retval MCUXCLELS_STATUS_OK                Operation successful\r\n *  @retval MCUXCLELS_STATUS_SW_INVALID_PARAM  Parameter crc points to NULL\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_UpdateRefCRC)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_UpdateRefCRC(\r\n    uint8_t   command,\r\n    uint32_t  options,\r\n    uint32_t* refCrc\r\n    );\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLELS_CRC_H_ */\r\n\r\n/**\r\n * @}\r\n *\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/inc/mcuxClEls_Ecc.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file mcuxClEls_Ecc.h\r\n * @brief ELS header for elliptic curve cryptography\r\n * This header exposes functions that enable using the ELS for elliptic curve cryptography.\r\n * All functions operate on the NIST P-256 curve.\r\n * The ECC operations supported are:\r\n * - ECC key generation\r\n * - ECC Diffie-Hellman key exchange\r\n * - ECDSA signature generation/verification\r\n */\r\n\r\n\r\n#ifndef MCUXCLELS_ECC_H_\r\n#define MCUXCLELS_ECC_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n#include <mcuxClEls_Common.h> // Common types & functionality\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**\r\n * @defgroup mcuxClEls_Ecc mcuxClEls_Ecc\r\n * @brief This part of the @ref mcuxClEls driver supports functionality for elliptic curve cryptography\r\n * @ingroup mcuxClEls\r\n * @{\r\n */\r\n\r\n\r\n/**********************************************\r\n * CONSTANTS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Ecc_Macros mcuxClEls_Ecc_Macros\r\n * @brief Defines all macros of @ref mcuxClEls_Ecc\r\n * @ingroup mcuxClEls_Ecc\r\n * @{\r\n */\r\n\r\n/**\r\n * @defgroup MCUXCLELS_ECC_VALUE_ MCUXCLELS_ECC (Sign and Verify) option word values\r\n * @brief Constants for #mcuxClEls_EccSignOption_t and #mcuxClEls_EccVerifyOption_t\r\n * @ingroup mcuxClEls_Ecc_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_ECC_VALUE_HASHED              ((uint32_t) 0u<< 0u) ///< Set this option at #mcuxClEls_EccSignOption_t.value or #mcuxClEls_EccVerifyOption_t.value to specify input is the hash of the message\r\n#define MCUXCLELS_ECC_VALUE_NOT_HASHED          ((uint32_t) 1u<< 0u) ///< Set this option at #mcuxClEls_EccSignOption_t.value or #mcuxClEls_EccVerifyOption_t.value to specify input is the plain message\r\n#define MCUXCLELS_ECC_VALUE_RTF                 ((uint32_t) 1u<< 1u) ///< Set this option at #mcuxClEls_EccSignOption_t.value to include the RTF in the signature, only for #mcuxClEls_EccSignOption_t\r\n#define MCUXCLELS_ECC_VALUE_NO_RTF              ((uint32_t) 0u<< 1u) ///< Set this option at #mcuxClEls_EccSignOption_t.value to not include the RTF in the signature, only for #mcuxClEls_EccSignOption_t\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @defgroup MCUXCLELS_KEYGEN_VALUE_ MCUXCLELS_KEYGEN option word values\r\n * @brief Constants for #mcuxClEls_EccKeyGenOption_t\r\n * @ingroup mcuxClEls_Ecc_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_KEYGEN_VALUE_SIGN_PUBLICKEY   ((uint32_t) 1u<< 0u) ///< Set this option at #mcuxClEls_EccKeyGenOption_t.value to sign the public key\r\n#define MCUXCLELS_KEYGEN_VALUE_TYPE_SIGN        ((uint32_t) 0u<< 1u) ///< Set this option at #mcuxClEls_EccKeyGenOption_t.value to specify output key will be a signing key usable by #mcuxClEls_EccSign_Async\r\n#define MCUXCLELS_KEYGEN_VALUE_TYPE_KEYEXCHANGE ((uint32_t) 1u<< 1u) ///< Set this option at #mcuxClEls_EccKeyGenOption_t.value to specify output key will be a Diffie Helman key usable by #mcuxClEls_EccKeyExchange_Async\r\n#define MCUXCLELS_KEYGEN_VALUE_DETERMINISTIC    ((uint32_t) 0u<< 2u) ///< Set this option at #mcuxClEls_EccKeyGenOption_t.value to specify output key is deterministic\r\n#define MCUXCLELS_KEYGEN_VALUE_RANDOM           ((uint32_t) 1u<< 2u) ///< Set this option at #mcuxClEls_EccKeyGenOption_t.value to specify output key is random\r\n#define MCUXCLELS_KEYGEN_VALUE_GEN_PUB_KEY      ((uint32_t) 0u<< 3u) ///< Set this option at #mcuxClEls_EccKeyGenOption_t.value to generate a public key\r\n#define MCUXCLELS_KEYGEN_VALUE_NO_PUB_KEY       ((uint32_t) 1u<< 3u) ///< Set this option at #mcuxClEls_EccKeyGenOption_t.value to not generate a public key\r\n#define MCUXCLELS_KEYGEN_VALUE_NO_RANDOM_DATA   ((uint32_t) 0u<< 5u) ///< Set this option at #mcuxClEls_EccKeyGenOption_t.value to not use random data for signing the public key\r\n#define MCUXCLELS_KEYGEN_VALUE_USE_RANDOM_DATA  ((uint32_t) 1u<< 5u) ///< Set this option at #mcuxClEls_EccKeyGenOption_t.value to use random data for signing the public key\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @defgroup MCUXCLELS_ECC_VALUE_BITS MCUXCLELS_ECC (Sign and Verify) option bit field values\r\n * @brief Bit field constants for #mcuxClEls_EccSignOption_t and #mcuxClEls_EccVerifyOption_t\r\n * @ingroup mcuxClEls_Ecc_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_ECC_HASHED                     ((uint32_t) 0U) ///< Set this option at #mcuxClEls_EccSignOption_t.echashchl or #mcuxClEls_EccVerifyOption_t.echashchl to specify input is the hash of the message\r\n#define MCUXCLELS_ECC_NOT_HASHED                 ((uint32_t) 1U) ///< Set this option at #mcuxClEls_EccSignOption_t.echashchl or #mcuxClEls_EccVerifyOption_t.echashchl to specify input is the plain message\r\n\r\n#define MCUXCLELS_ECC_RTF                        ((uint32_t) 1U) ///< Set this option at #mcuxClEls_EccSignOption_t.signrtf to include the RTF in the signature\r\n#define MCUXCLELS_ECC_NO_RTF                     ((uint32_t) 0U) ///< Set this option at #mcuxClEls_EccSignOption_t.signrtf to not include the RTF in the signature\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @defgroup MCUXCLELS_KEYGEN_VALUE_BITS MCUXCLELS_KEYGEN option bit field values\r\n * @brief Bit field constants for #mcuxClEls_EccKeyGenOption_t\r\n * @ingroup mcuxClEls_Ecc_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_ECC_PUBLICKEY_SIGN_ENABLE      (1U) ///< Set this option at #mcuxClEls_EccKeyGenOption_t.kgsign to sign the public key (signature will be concatenated to the output public key)\r\n#define MCUXCLELS_ECC_PUBLICKEY_SIGN_DISABLE     (0U) ///< Set this option at #mcuxClEls_EccKeyGenOption_t.kgsign to not sign the public key\r\n\r\n#define MCUXCLELS_ECC_OUTPUTKEY_SIGN             (0U) ///< Set this option at #mcuxClEls_EccKeyGenOption_t.kgtypedh to specify output key will be a signing key usable by #mcuxClEls_EccSign_Async\r\n#define MCUXCLELS_ECC_OUTPUTKEY_KEYEXCHANGE      (1U) ///< Set this option at #mcuxClEls_EccKeyGenOption_t.kgtypedh to specify output key will be a Diffie Helman key usable by #mcuxClEls_EccKeyExchange_Async\r\n\r\n#define MCUXCLELS_ECC_OUTPUTKEY_DETERMINISTIC    (0U) ///< Set this option at #mcuxClEls_EccKeyGenOption_t.kgsrc to specify output key is deterministic\r\n#define MCUXCLELS_ECC_OUTPUTKEY_RANDOM           (1U) ///< Set this option at #mcuxClEls_EccKeyGenOption_t.kgsrc to specify output key is random\r\n\r\n#define MCUXCLELS_ECC_GEN_PUBLIC_KEY             (0U) ///< Set this option at #mcuxClEls_EccKeyGenOption_t.skip_pbk to generate a public key\r\n#define MCUXCLELS_ECC_SKIP_PUBLIC_KEY            (1U) ///< Set this option at #mcuxClEls_EccKeyGenOption_t.skip_pbk to not generate a public key.\r\n                                                   ///< If #MCUXCLELS_ECC_OUTPUTKEY_KEYEXCHANGE set, this option will be ignored and a public key will be generated.\r\n\r\n#define MCUXCLELS_ECC_NO_RANDOM_DATA             (0U) ///< Set this option at #mcuxClEls_EccKeyGenOption_t.kgsign_rnd to not include user provided random data for the signature\r\n#define MCUXCLELS_ECC_INCLUDE_RANDOM_DATA        (1U) ///< Set this option at #mcuxClEls_EccKeyGenOption_t.kgsign_rnd to include user provided random data for the signature.\r\n                                                   ///< #MCUXCLELS_ECC_PUBLICKEY_SIGN_ENABLE must be set in this case.\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @defgroup MCUXCLELS_INTERNAL_VALUE_BITS Option bit field values that are needed for internal use only\r\n * @brief Internal bit field constants for several option types.\r\n * @ingroup mcuxClEls_Ecc_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_ECC_REVERSEFETCH_ENABLE        (0x01U) ///< Reverse Fetch enabled. For internal use\r\n#define MCUXCLELS_ECC_REVERSEFETCH_DISABLE       (0x00U) ///< Reverse Fetch disabled. For internal use\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL_BIT\r\n#define MCUXCLELS_ECC_EXTKEY_EXTERNAL        (0x01U) ///< Public key is taken from system memory. For internal use\r\n#define MCUXCLELS_ECC_EXTKEY_INTERNAL        (0x00U) ///< Public key is taken from internal keystore. For internal use\r\n#endif /* MCUXCL_FEATURE_ELS_PUK_INTERNAL_BIT */\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @defgroup MCUXCLELS_ECC_SIZE MCUXCLELS_ECC_SIZE\r\n * @brief Defines size of public key and signature in bytes\r\n * @ingroup mcuxClEls_Ecc_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_ECC_PUBLICKEY_SIZE     ((size_t) 64U) ///< Size of the public key\r\n#define MCUXCLELS_ECC_SIGNATURE_SIZE     ((size_t) 64U) ///< Size of the signature\r\n#define MCUXCLELS_ECC_SIGNATURE_R_SIZE   ((size_t) 32U) ///< Size of the signature part r\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @}\r\n */ /* mcuxClEls_Ecc_Macros */\r\n\r\n\r\n/**********************************************\r\n * TYPEDEFS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Ecc_Types mcuxClEls_Ecc_Types\r\n * @brief Defines all types of @ref mcuxClEls_Ecc\r\n * @ingroup mcuxClEls_Ecc\r\n * @{\r\n */\r\n\r\n/**\r\n * @brief Data type for ECC parameters in ELS format\r\n * @deprecated All ELS ECC functions now operate on uint8_t. This type will be removed soon.\r\n */\r\ntypedef uint8_t mcuxClEls_EccByte_t;\r\n\r\n/**\r\n * @brief Command option bit field for #mcuxClEls_EccSign_Async\r\n * Bit field to configure #mcuxClEls_EccSign_Async. See @ref MCUXCLELS_ECC_VALUE_BITS for possible options.\r\n */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value;         ///< Access the bit field as a full word; initialize with a combination of constants from @ref MCUXCLELS_ECC_VALUE_\r\n    } word;                     ///< Access #mcuxClEls_EccSignOption_t word-wise\r\n    struct\r\n    {\r\n        uint32_t echashchl :1;  ///< Define type of input, plain message or hash of message\r\n        uint32_t signrtf :1;    ///< Define if signing the Run-Time Fingerprint\r\n        uint32_t :2;            ///< RFU\r\n        uint32_t revf :1;       ///< This field is managed internally\r\n        uint32_t :27;           ///< RFU\r\n    } bits;                     ///< Access #mcuxClEls_EccSignOption_t bit-wise\r\n} mcuxClEls_EccSignOption_t;\r\n\r\n/**\r\n * @brief Command option bit field for #mcuxClEls_EccVerify_Async\r\n * Bit field to configure #mcuxClEls_EccVerifyOption_t. See @ref MCUXCLELS_ECC_VALUE_BITS for possible options.\r\n */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value;         ///< Access the bit field as a full word; initialize with a combination of constants from @ref MCUXCLELS_ECC_VALUE_\r\n    } word;                     ///< Access #mcuxClEls_EccVerifyOption_t word-wise\r\n    struct\r\n    {\r\n        uint32_t echashchl :1;  ///< Define type of input, plain message or hash of message\r\n        uint32_t :3;            ///< RFU\r\n        uint32_t revf :1;       ///< This field is managed internally\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL_BIT\r\n        uint32_t :8;            ///< RFU\r\n        uint32_t extkey :1;     ///< This field is managed internally\r\n        uint32_t :18;           ///< RFU\r\n#else\r\n        uint32_t :27;           ///< RFU\r\n#endif /* MCUXCL_FEATURE_ELS_PUK_INTERNAL_BIT */\r\n    } bits;                     ///< Access #mcuxClEls_EccVerifyOption_t bit-wise\r\n} mcuxClEls_EccVerifyOption_t;\r\n\r\n/**\r\n * @brief Command option bit field for #mcuxClEls_EccKeyGen_Async\r\n * Bit field to configure #mcuxClEls_EccKeyGenOption_t. See @ref MCUXCLELS_KEYGEN_VALUE_BITS for possible options.\r\n */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value;         ///< Accesses the bit field as a full word; initialize with a combination of constants from @ref MCUXCLELS_KEYGEN_VALUE_\r\n    } word;                     ///< Access #mcuxClEls_EccKeyGenOption_t word-wise\r\n    struct\r\n    {\r\n        uint32_t kgsign :1;     ///< Define if signing the output public key\r\n        uint32_t kgtypedh :1;   ///< Define the usage of the output key\r\n        uint32_t kgsrc :1;      ///< Define if the output key is deterministic or random\r\n        uint32_t skip_pbk :1;   ///< Define if generating a public key\r\n        uint32_t revf :1;       ///< This field is managed internally\r\n        uint32_t kgsign_rnd :1; ///< Define if using user provided random data for the signature.\r\n        uint32_t :26;           ///< RFU\r\n    } bits;                     ///< Access #mcuxClEls_EccKeyGenOption_t bit-wise\r\n} mcuxClEls_EccKeyGenOption_t;\r\n\r\n/**\r\n * @brief Command option bit field for #mcuxClEls_EccKeyExchange_Async, for internal use only.\r\n * Bit field to configure #mcuxClEls_EccKeyExchOption_t.\r\n */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value;         ///< Accesses the bit field as a full word\r\n    } word;                     ///< Access #mcuxClEls_EccKeyExchOption_t word-wise\r\n    struct\r\n    {\r\n        uint32_t :4;            ///< RFU\r\n        uint32_t revf :1;       ///< This field is managed internally\r\n        uint32_t :8;            ///< RFU\r\n        uint32_t extkey :1;     ///< This field is managed internally\r\n        uint32_t :18;           ///< RFU\r\n    } bits;                     ///< Access #mcuxClEls_EccKeyExchOption_t bit-wise\r\n} mcuxClEls_EccKeyExchOption_t;\r\n\r\n/**\r\n * @}\r\n */ /* mcuxClEls_Ecc_Types */\r\n\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Ecc_Functions mcuxClEls_Ecc_Functions\r\n * @brief Defines all functions of @ref mcuxClEls_Ecc\r\n * @ingroup mcuxClEls_Ecc\r\n * @{\r\n */\r\n\r\n/**\r\n * @brief Generates an ECC key pair on the NIST P-256 curve.\r\n * \r\n * Before execution, ELS will wait until #mcuxClEls_HwState_t.drbgentlvl == #MCUXCLELS_STATUS_DRBGENTLVL_HIGH. This can lead to a delay if the DRBG is in a state with less security strength at the time of the call.\r\n *\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n * The public key will be stored in the standard ANSI X9.62 byte order (big-endian).\r\n *\r\n * @param[in]  options                The command options. For more information, see #mcuxClEls_EccKeyGenOption_t.\r\n * @param[in]  signingKeyIdx          The index of the key to sign the generated public key.\r\n * @param[in]  privateKeyIdx          Output key index.\r\n * @param[in]  generatedKeyProperties The desired key properties of the generated key.\r\n * @param[in]  pRandomData            Random data provided by the user.\r\n * @param[out] pPublicKey             Pointer to the memory area which receives the public key and optionally the key signature.\r\n *\r\n * <dl>\r\n *   <dt>Parameter properties</dt>\r\n *   <dd><dl>\r\n *     <dt>@p options.kgsign == #MCUXCLELS_ECC_PUBLICKEY_SIGN_DISABLE</dt>\r\n *       <dd>@p signingKeyIdx is ignored.</dd>\r\n *     <dt>@p options.kgsrc == #MCUXCLELS_ECC_OUTPUTKEY_DETERMINISTIC</dt>\r\n *       <dd>@p privateKeyIdx also defines the key index of the source key material.\r\n *           The source key material will be overwritten by the output public key.</dd>\r\n *     <dt>@p options.kgsign_rnd == #MCUXCLELS_ECC_NO_RANDOM_DATA</dt>\r\n *       <dd>@p pRandomData is ignored.</dd>\r\n *     <dt>@p pPublicKey must be aligned on a 4-byte boundary.</dt>\r\n *   </dl></dd>\r\n * </dl>\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_EccKeyGen_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_EccKeyGen_Async(\r\n    mcuxClEls_EccKeyGenOption_t options,\r\n    mcuxClEls_KeyIndex_t signingKeyIdx,\r\n    mcuxClEls_KeyIndex_t privateKeyIdx,\r\n    mcuxClEls_KeyProp_t generatedKeyProperties,\r\n    uint8_t const * pRandomData,\r\n    uint8_t * pPublicKey\r\n    );\r\n\r\n/**\r\n * @brief Performs a Diffie-Hellman key exchange with an internal ECC private key and an external ECC public key.\r\n * \r\n * Before execution, ELS will wait until #mcuxClEls_HwState_t.drbgentlvl == #MCUXCLELS_STATUS_DRBGENTLVL_LOW. This can lead to a delay if the DRBG is in a state with less security strength at the time of the call.\r\n *\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n * The public key must be stored in the standard ANSI X9.62 byte order (big-endian).\r\n *\r\n * @param[in] privateKeyIdx          The private key index.\r\n * @param[in] pPublicKey             Pointer to the public key of a third party.\r\n * @param[in] sharedSecretIdx        The index in the ELS keystore that receives the shared secret that is generated by the ECDH operation.\r\n * @param[in] sharedSecretProperties The desired key properties of the shared secret.\r\n *\r\n * <dl>\r\n *   <dt>Parameter properties</dt>\r\n *   <dd><dl>\r\n *     <dt>@p pPublicKey </dt>\r\n *       <dd>The public key consists of the 256-bit X coordinate and the 256-bit Y coordinate.\r\n *           The point must lie on the NIST P-256 curve, be encoded in X9.62 format and aligned on a 4-byte boundary.</dd>\r\n *   </dl></dd>\r\n * </dl>\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_EccKeyExchange_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_EccKeyExchange_Async(\r\n    mcuxClEls_KeyIndex_t privateKeyIdx,\r\n    uint8_t const * pPublicKey,\r\n    mcuxClEls_KeyIndex_t sharedSecretIdx,\r\n    mcuxClEls_KeyProp_t sharedSecretProperties\r\n    );\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n/**\r\n * @brief Performs a Diffie-Hellman key exchange with an internal ECC private key and an internal ECC public key.\r\n * \r\n * Before execution, ELS will wait until #mcuxClEls_HwState_t.drbgentlvl == #MCUXCLELS_STATUS_DRBGENTLVL_LOW. This can lead to a delay if the DRBG is in a state with less security strength at the time of the call.\r\n *\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in] privateKeyIdx          The private key index.\r\n * @param[in] publicKeyIdx           The public key index.\r\n * @param[in] sharedSecretIdx        The index in the ELS keystore that receives the shared secret that is generated by the ECDH operation.\r\n * @param[in] sharedSecretProperties The desired key properties of the shared secret.\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_EccKeyExchangeInt_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_EccKeyExchangeInt_Async(\r\n    mcuxClEls_KeyIndex_t privateKeyIdx,\r\n    mcuxClEls_KeyIndex_t publicKeyIdx,\r\n    mcuxClEls_KeyIndex_t sharedSecretIdx,\r\n    mcuxClEls_KeyProp_t sharedSecretProperties\r\n    );\r\n#endif /* MCUXCL_FEATURE_ELS_PUK_INTERNAL */\r\n\r\n/**\r\n * @brief Generates an ECDSA signature of a given message.\r\n *\r\n * The curve is NIST P-256.\r\n * The message hash, must be stored in the standard ANSI X9.62 format.\r\n * If the message is provided in plain, no prior conversion is necessary.\r\n * The signature will be stored in the standard ANSI X9.62 byte order (big-endian).\r\n * @if MCUXCL_FEATURE_ELS_SHA_DIRECT\r\n * No matter the value of @p options.echashchl, it must be ensured that SHA-Direct mode is disabled when calling this function (see #mcuxClEls_ShaDirect_Disable).\r\n * @endif\r\n * \r\n * Before execution, ELS will wait until #mcuxClEls_HwState_t.drbgentlvl == #MCUXCLELS_STATUS_DRBGENTLVL_HIGH. This can lead to a delay if the DRBG is in a state with less security strength at the time of the call.\r\n * \r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in]  options            The command options. For more information, see #mcuxClEls_EccSignOption_t.\r\n * @param[in]  keyIdx             The private key index.\r\n * @param[in]  pInputHash         The hash of the message to sign in X9.62 format.\r\n * @param[in]  pInputMessage      The message to sign.\r\n * @param[in]  inputMessageLength Size of @p pInputMessage in bytes.\r\n * @param[out] pOutput            Pointer to the memory area which receives the generated signature in X9.62 format. (64 bytes)\r\n *\r\n * <dl>\r\n *   <dt>Parameter properties</dt>\r\n *   <dd><dl>\r\n *     <dt>@p options.echashchl == #MCUXCLELS_ECC_HASHED</dt>\r\n *       <dd>@p pInputHash is used, and it must be aligned on a 4-byte boundary.\r\n *           @p pInputMessage is ignored.</dd>\r\n *     <dt>@p options.echashchl == #MCUXCLELS_ECC_NOT_HASHED</dt>\r\n *       <dd>@p pInputHash is ignored.\r\n *           @p pInputMessage and @p inputMessageLength are used.</dd>\r\n *     <dt>@p pOptput must be aligned on a 4-byte boundary.</dt>\r\n *   </dl></dd>\r\n * </dl>\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_EccSign_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_EccSign_Async(\r\n    mcuxClEls_EccSignOption_t options,\r\n    mcuxClEls_KeyIndex_t keyIdx,\r\n    uint8_t const * pInputHash,\r\n    uint8_t const * pInputMessage,\r\n    size_t inputMessageLength,\r\n    uint8_t * pOutput\r\n    );\r\n\r\n/**\r\n * @brief Verifies an ECDSA signature of a given message.\r\n *\r\n * The curve is NIST P-256.\r\n * The message hash, must be stored in the standard ANSI X9.62 format.\r\n * If the message is provided in plain, no prior conversion is necessary.\r\n * The signature and public key must be stored in the standard ANSI X9.62 byte order (big-endian).\r\n * @if MCUXCL_FEATURE_ELS_SHA_DIRECT\r\n * No matter the value of @p options.echashchl, it must be ensured that SHA-Direct mode is disabled when calling this function (see #mcuxClEls_ShaDirect_Disable).\r\n * @endif\r\n * \r\n * Before execution, ELS will wait until #mcuxClEls_HwState_t.drbgentlvl == #MCUXCLELS_STATUS_DRBGENTLVL_LOW. This can lead to a delay if the DRBG is in a state with less security strength at the time of the call.\r\n * \r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in]  options             The command options. For more information, see #mcuxClEls_EccVerifyOption_t.\r\n * @param[in]  pInputHash          The hash of the signed message in X9.62 format.\r\n * @param[in]  pInputMessage       The message to sign.\r\n * @param[in]  inputMessageLength  Size of @p pInputMessage in bytes.\r\n * @param[in]  pSignatureAndPubKey Pointer to the memory area which contains the concatenation of the signature and the public key.\r\n * @param[out] pOutput             Pointer to the memory area which will receive the recalculated value of the R component in case of a successful\r\n *                                 signature verification.\r\n *\r\n * <dl>\r\n *   <dt>Parameter properties</dt>\r\n *   <dd><dl>\r\n *     <dt>@p options.echashchl == #MCUXCLELS_ECC_HASHED</dt>\r\n *       <dd>@p pInputHash is used, and it must be aligned on a 4-byte boundary.\r\n *           @p pInputMessage is ignored.</dd>\r\n *     <dt>@p options.echashchl == #MCUXCLELS_ECC_NOT_HASHED</dt>\r\n *       <dd>@p pInputHash is ignored.\r\n *           @p pInputMessage and @p inputMessageLength are used.</dd>\r\n *     <dt>@p pSignatureAndPubKey </dt>\r\n *       <dd>It must be aligned on a 4-byte boundary.\r\n *           The signature to be verified consists of the 256-bit R component and the 256-bit S component.\r\n *           The public key is the one for verification. (Uncompressed, X and Y components)\r\n *           The signature and the public key are in X9.62 format.</dd>\r\n *     <dt>@p pOutput </dt>\r\n *       <dd>It must be aligned on a 4-byte boundary.\r\n *           The output shall be compared to the first 32 bytes stored at @p pSignatureAndPublicKey.</dd>\r\n *   </dl></dd>\r\n * </dl>\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_EccVerify_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_EccVerify_Async(\r\n    mcuxClEls_EccVerifyOption_t options,\r\n    uint8_t const * pInputHash,\r\n    uint8_t const * pInputMessage,\r\n    size_t inputMessageLength,\r\n    uint8_t const * pSignatureAndPubKey,\r\n    uint8_t * pOutput\r\n    );\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n/**\r\n * @brief Verifies an ECDSA signature of a given message.\r\n *\r\n * The curve is NIST P-256.\r\n * The message hash, must be stored in the standard ANSI X9.62 format.\r\n * If the message is provided in plain, no prior conversion is necessary.\r\n * The signature must be stored in the standard ANSI X9.62 byte order (big-endian).\r\n * @if MCUXCL_FEATURE_ELS_SHA_DIRECT\r\n * No matter the value of @p options.echashchl, it must be ensured that SHA-Direct mode is disabled when calling this function (see #mcuxClEls_ShaDirect_Disable).\r\n * @endif\r\n * \r\n * Before execution, ELS will wait until #mcuxClEls_HwState_t.drbgentlvl == #MCUXCLELS_STATUS_DRBGENTLVL_LOW. This can lead to a delay if the DRBG is in a state with less security strength at the time of the call.\r\n * \r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in]  options             The command options. For more information, see #mcuxClEls_EccVerifyOption_t.\r\n * @param[in]  publicKeyIdx        The public key index.\r\n * @param[in]  pInputHash          The hash of the signed message in X9.62 format.\r\n * @param[in]  pInputMessage       The message to sign.\r\n * @param[in]  inputMessageLength  Size of @p pInputMessage in bytes.\r\n * @param[in]  pSignature          Pointer to the memory area which contains the concatenation of the signature and the public key.\r\n * @param[out] pOutput             Pointer to the memory area which will receive the recalculated value of the R component in case of a successful\r\n *                                 signature verification.\r\n *\r\n * <dl>\r\n *   <dt>Parameter properties</dt>\r\n *   <dd><dl>\r\n *     <dt>@p options.echashchl == #MCUXCLELS_ECC_HASHED</dt>\r\n *       <dd>@p pInputHash is used, and it must be aligned on a 4-byte boundary.\r\n *           @p pInputMessage is ignored.</dd>\r\n *     <dt>@p options.echashchl == #MCUXCLELS_ECC_NOT_HASHED</dt>\r\n *       <dd>@p pInputHash is ignored.\r\n *           @p pInputMessage and @p inputMessageLength are used.</dd>\r\n *     <dt>@p pSignature</dt>\r\n *       <dd>It must be aligned on a 4-byte boundary.\r\n *           The signature to be verified consists of the 256-bit R component and the 256-bit S component.\r\n *           The signature is in X9.62 format.</dd>\r\n *     <dt>@p pOutput </dt>\r\n *       <dd>It must be aligned on a 4-byte boundary.\r\n *           The output shall be compared to the first 32 bytes stored at @p pSignatureAndPublicKey.</dd>\r\n *   </dl></dd>\r\n * </dl>\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_EccVerifyInt_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_EccVerifyInt_Async(\r\n    mcuxClEls_EccVerifyOption_t options,\r\n    mcuxClEls_KeyIndex_t publicKeyIdx,\r\n    uint8_t const * pInputHash,\r\n    uint8_t const * pInputMessage,\r\n    size_t inputMessageLength,\r\n    uint8_t const * pSignature,\r\n    uint8_t * pOutput\r\n    );\r\n\r\n#endif /* MCUXCL_FEATURE_ELS_PUK_INTERNAL */\r\n\r\n/**\r\n * @}\r\n */ /* mcuxClEls_Ecc_Functions */\r\n\r\n/**\r\n * @}\r\n */ /* mcuxClEls_Ecc */\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLELS_ECC_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/inc/mcuxClEls_GlitchDetector.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2022 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClEls_GlitchDetector.h\r\n *  @brief ELS header for controlling the glitch detector.\r\n *\r\n * This header exposes functions that configure the ELS glitch detector. \r\n */\r\n \r\n#ifndef MCUXCLELS_GLITCHDETECTOR_H_\r\n#define MCUXCLELS_GLITCHDETECTOR_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n#include <mcuxClEls_Common.h> // Common types & functionality\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**\r\n * @defgroup mcuxClEls_GlitchDetector mcuxClEls_GlitchDetector\r\n * @brief This part of the @ref mcuxClEls driver supports glitch detector functionality\r\n * @ingroup mcuxClEls\r\n * @{\r\n */\r\n \r\n/**********************************************\r\n * CONSTANTS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_GlitchDetector_Macros mcuxClEls_GlitchDetector_Macros\r\n * @brief Defines all macros of @ref mcuxClEls_GlitchDetector\r\n * @ingroup mcuxClEls_GlitchDetector\r\n * @{\r\n */\r\n\r\n#define MCUXCLELS_GLITCHDETECTOR_CFG_SIZE  ((size_t) 0x18u) ///< Glitch detector configuration size\r\n\r\n#define MCUXCLELS_GLITCHDETECTOR_TRIM_SIZE  ((size_t) 0x04u) ///< Glitch detector trim value size\r\n\r\n/**\r\n * @}\r\n */ /* mcuxClEls_GlitchDetector_Macros */\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_GlitchDetector_Functions mcuxClEls_GlitchDetector_Functions\r\n * @brief Defines all functions of @ref mcuxClEls_GlitchDetector\r\n * @ingroup mcuxClEls_GlitchDetector\r\n * @{\r\n */\r\n\r\n/**\r\n * @brief Loads a glitch detector configuration.\r\n *\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in]   Pointer to the memory area which contains the glitch detector configuration. The size is fixed at #MCUXCLELS_GLITCHDETECTOR_CFG_SIZE bytes.\r\n *\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request \r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_GlitchDetector_LoadConfig_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GlitchDetector_LoadConfig_Async(\r\n    uint8_t const * pInput\r\n    );\r\n\r\n/** \r\n * @brief Calculates optimal ELS glitch detector configuration and writes it to system memory.\r\n *\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[out]  Pointer to the memory area which receives the glitch detector trim value. The size is fixed at #MCUXCLELS_GLITCHDETECTOR_TRIM_SIZE bytes.\r\n *\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request \r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n *\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_GlitchDetector_Trim_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GlitchDetector_Trim_Async(\r\n    uint8_t * pOutput \r\n    );\r\n\r\n/** \r\n * @brief Reads the glitch detector's event counter\r\n * \r\n * This function converts the event counter from Gray code to an unsigned number.\r\n *\r\n * @param[in]   Pointer to the word where the counter value will be stored.\r\n *\r\n * @retval #MCUXCLELS_STATUS_OK                  on successful request \r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_GlitchDetector_GetEventCounter)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GlitchDetector_GetEventCounter(\r\n    uint8_t * pCount \r\n    );\r\n\r\n/** \r\n * @brief Resets the glitch detector's event counter\r\n *\r\n * @retval #MCUXCLELS_STATUS_OK                  on successful request\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_GlitchDetector_ResetEventCounter)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GlitchDetector_ResetEventCounter( void\r\n    );\r\n \r\n/**\r\n * @}\r\n */ /* mcuxClEls_GlitchDetector_Functions */\r\n \r\n/**\r\n * @}\r\n */ /* mcuxClEls_GlitchDetector */\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLELS_GLITCHDETECTOR_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/inc/mcuxClEls_Hash.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxClEls_Hash.h\r\n * @brief ELS header for hashing.\r\n *\r\n * This header exposes functions that enable using the ELS for hashing.\r\n * There are two modes to hash a message: The asynchronous way as an ELS command, and the SHA-Direct mode which feeds\r\n * data to the internal registers of the ELS and is synchronous (blocking).\r\n * The SHA-Direct mode is meant to be used when another command should be executed in parallel on the ELS while the\r\n * hash operation is still ongoing. For this, use the DMA callback option in #mcuxClEls_Hash_ShaDirect.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClEls_Hash mcuxClEls_Hash\r\n * @brief This part of the @ref mcuxClEls driver supports hashing\r\n * @ingroup mcuxClEls\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLELS_HASH_H_\r\n#define MCUXCLELS_HASH_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n#include <mcuxClEls_Common.h> // Common functionality\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * CONSTANTS\r\n **********************************************/\r\n\r\n/**\r\n * @defgroup mcuxClEls_Hash_Macros mcuxClEls_Hash_Macros\r\n * @brief Defines all macros of @ref mcuxClEls_Hash\r\n * @ingroup mcuxClEls_Hash\r\n * @{\r\n */\r\n\r\n/**\r\n * @defgroup MCUXCLELS_HASH_ MCUXCLELS_HASH_\r\n * @brief Defines valid options to be used by #mcuxClEls_HashOption_t\r\n * @ingroup mcuxClEls_Hash_Macros\r\n * @{\r\n */\r\n\r\n#define MCUXCLELS_HASH_INIT_ENABLE  1U ///< Set this option at #mcuxClEls_HashOption_t.hashini to initialize the hash\r\n#define MCUXCLELS_HASH_INIT_DISABLE 0U ///< Set this option at #mcuxClEls_HashOption_t.hashini to continue the hash\r\n\r\n#define MCUXCLELS_HASH_LOAD_ENABLE  1U ///< Set this option at #mcuxClEls_HashOption_t.hashld to load the hash state from @p pDigest\r\n#define MCUXCLELS_HASH_LOAD_DISABLE 0U ///< Set this option at #mcuxClEls_HashOption_t.hashld to not load the hash state\r\n\r\n#define MCUXCLELS_HASH_OUTPUT_ENABLE  1U ///< Set this option at #mcuxClEls_HashOption_t.hashoe to output the hash to @p pDigest\r\n#define MCUXCLELS_HASH_OUTPUT_DISABLE 0U ///< Set this option at #mcuxClEls_HashOption_t.hashoe to not output the hash\r\n\r\n#define MCUXCLELS_HASH_RTF_UPDATE_ENABLE  1U ///< Set this option at #mcuxClEls_HashOption_t.rtfupd to update the run-time fingerprint (only supported by #mcuxClEls_Hash_Async)\r\n#define MCUXCLELS_HASH_RTF_UPDATE_DISABLE 0U ///< Set this option at #mcuxClEls_HashOption_t.rtfupd to not update the run-time fingerprint\r\n\r\n#define MCUXCLELS_HASH_RTF_OUTPUT_ENABLE  1U ///< Set this option at #mcuxClEls_HashOption_t.rtfoe to output the run-time fingerprint (only supported by #mcuxClEls_Hash_Async)\r\n#define MCUXCLELS_HASH_RTF_OUTPUT_DISABLE 0U ///< Set this option at #mcuxClEls_HashOption_t.rtfoe to not output the run-time fingerprint\r\n\r\n#define MCUXCLELS_HASH_MODE_SHA_224        1U  ///< Set this option at #mcuxClEls_HashOption_t.hashmd to use the hash algorithm SHA-224\r\n#define MCUXCLELS_HASH_MODE_SHA_256        0U  ///< Set this option at #mcuxClEls_HashOption_t.hashmd to use the hash algorithm SHA-256\r\n#define MCUXCLELS_HASH_MODE_SHA_384        2U   ///< Set this option at #mcuxClEls_HashOption_t.hashmd to use the hash algorithm SHA-384\r\n#define MCUXCLELS_HASH_MODE_SHA_512        3U   ///< Set this option at #mcuxClEls_HashOption_t.hashmd to use the hash algorithm SHA-512\r\n\r\n\r\n#define MCUXCLELS_HASH_VALUE_MODE_SHA_224  ((uint32_t) MCUXCLELS_HASH_MODE_SHA_224 << 4)  ///< Set this option at #mcuxClEls_HashOption_t.word.value to use the hash algorithm SHA-224\r\n#define MCUXCLELS_HASH_VALUE_MODE_SHA_256  ((uint32_t) MCUXCLELS_HASH_MODE_SHA_256 << 4)  ///< Set this option at #mcuxClEls_HashOption_t.word.value to use the hash algorithm SHA-256\r\n#define MCUXCLELS_HASH_VALUE_MODE_SHA_384  ((uint32_t) MCUXCLELS_HASH_MODE_SHA_384 << 4)  ///< Set this option at #mcuxClEls_HashOption_t.word.value to use the hash algorithm SHA-384\r\n#define MCUXCLELS_HASH_VALUE_MODE_SHA_512  ((uint32_t) MCUXCLELS_HASH_MODE_SHA_512 << 4)  ///< Set this option at #mcuxClEls_HashOption_t.word.value to use the hash algorithm SHA-512\r\n\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @defgroup MCUXCLELS_HASH_BLOCK_SIZE_ MCUXCLELS_HASH_BLOCK_SIZE_\r\n * @brief Defines block sizes used by the supported hash algorithms\r\n * @ingroup mcuxClEls_Hash_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_HASH_BLOCK_SIZE_SHA_224  64U ///< SHA-224 output size: 512 bit (64 bytes)\r\n#define MCUXCLELS_HASH_BLOCK_SIZE_SHA_256  64U ///< SHA-256 output size: 512 bit (64 bytes)\r\n#define MCUXCLELS_HASH_BLOCK_SIZE_SHA_384  128U ///< SHA-384 output size: 1024 bit (128 bytes)\r\n#define MCUXCLELS_HASH_BLOCK_SIZE_SHA_512  128U ///< SHA-512 output size: 1024 bit (128 bytes)\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @defgroup MCUXCLELS_HASH_STATE_SIZE_ MCUXCLELS_HASH_STATE_SIZE_\r\n * @brief Defines the intermediate state sizes of the supported hash algorithms\r\n * @ingroup mcuxClEls_Hash_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_HASH_STATE_SIZE_SHA_224  32U ///< SHA-224 state size: 256 bit (32 bytes)\r\n#define MCUXCLELS_HASH_STATE_SIZE_SHA_256  32U ///< SHA-256 state size: 256 bit (32 bytes)\r\n#define MCUXCLELS_HASH_STATE_SIZE_SHA_384  64U  ///< SHA-384 state size: 512 bit (64 bytes)\r\n#define MCUXCLELS_HASH_STATE_SIZE_SHA_512  64U  ///< SHA-512 state size: 512 bit (64 bytes)\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @defgroup MCUXCLELS_HASH_OUTPUT_SIZE_ MCUXCLELS_HASH_OUTPUT_SIZE_\r\n * @brief Defines the output sizes of the supported hash algorithms (do not use for allocation)\r\n * @ingroup mcuxClEls_Hash_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_HASH_OUTPUT_SIZE_SHA_224 28U ///< SHA-224 output size: 224 bit (28 bytes)\r\n#define MCUXCLELS_HASH_OUTPUT_SIZE_SHA_256 32U ///< SHA-256 output size: 256 bit (32 bytes)\r\n#define MCUXCLELS_HASH_OUTPUT_SIZE_SHA_384 48U ///< SHA-384 output size: 384 bit (48 bytes)\r\n#define MCUXCLELS_HASH_OUTPUT_SIZE_SHA_512 64U ///< SHA-512 output size: 512 bit (64 bytes)\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @ingroup mcuxClEls_Hash_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_HASH_RTF_OUTPUT_SIZE ((size_t)32U) ///< Size of run-time fingerprint appended to the hash in @p pDigest in bytes, if #MCUXCLELS_HASH_RTF_OUTPUT_ENABLE was specified\r\n/**\r\n * @}\r\n *\r\n * @}\r\n */\r\n\r\n/**********************************************\r\n * TYPEDEFS\r\n **********************************************/\r\n\r\n/**\r\n * @defgroup mcuxClEls_Hash_Types mcuxClEls_Hash_Types\r\n * @brief Defines all types of @ref mcuxClEls_Hash\r\n * @ingroup mcuxClEls_Hash\r\n * @{\r\n */\r\n\r\n/**\r\n * @brief Command option bit field for #mcuxClEls_Hash_Async and #mcuxClEls_Hash_ShaDirect.\r\n *\r\n * Bit field to configure #mcuxClEls_Hash_Async and #mcuxClEls_Hash_ShaDirect. See @ref MCUXCLELS_HASH_ for possible options.\r\n */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value; ///< Accesses the bit field as a full word\r\n    } word;             ///< Access #mcuxClEls_HashOption_t word-wise\r\n    struct\r\n    {\r\n        uint32_t :2;         ///< RFU\r\n        uint32_t hashini :1; ///< Defines if the hash engine shall be initialized\r\n        uint32_t hashld :1;  ///< Defines if the hash engine shall be initialized with an externally provided digest\r\n        uint32_t hashmd :2;  ///< Defines which hash algorithm shall be used\r\n        uint32_t hashoe :1;  ///< Defines if the hash digest shall be moved to the output buffer\r\n        uint32_t rtfupd :1;  ///< RTF (Runtime Fingerprint) Update\r\n        uint32_t rtfoe :1;   ///< RTF (Runtime Fingerprint) Output Enabled\r\n        uint32_t :23;        ///< RFU\r\n    } bits;                  ///< Access #mcuxClEls_HashOption_t bit-wise\r\n} mcuxClEls_HashOption_t;\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n\r\n/**\r\n * @defgroup mcuxClEls_Hash_Functions mcuxClEls_Hash_Functions\r\n * @brief Defines all functions of @ref mcuxClEls_Hash\r\n * @ingroup mcuxClEls_Hash\r\n * @{\r\n */\r\n\r\n/**\r\n * @brief Computes the hash of a message.\r\n *\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n * @if MCUXCL_FEATURE_ELS_SHA_DIRECT\r\n * It must be ensured that SHA-Direct mode is disabled when calling this function (see #mcuxClEls_ShaDirect_Disable).\r\n * @endif\r\n *\r\n * @param[in]       options     The command options. For more information, see #mcuxClEls_HashOption_t.\r\n * @param[in]       pInput      Padded input data to be hashed\r\n * @param[in]       inputLength Size of @p pInput in bytes. Since the input is padded, the length must be a multiple of the block size, see @ref MCUXCLELS_HASH_BLOCK_SIZE_.\r\n * @param[in, out]  pDigest     Pointer to the memory area that contains/receives the (intermediate) hash digest, allocated by the caller, see @ref MCUXCLELS_HASH_STATE_SIZE_.\r\n *\r\n * The properties of some parameters change with respect to selected options.\r\n *\r\n * <dl>\r\n *  <dt>Parameter properties</dt>\r\n *\r\n *  <dd><dl>\r\n *      <dt>@p options.hashini == #MCUXCLELS_HASH_INIT_ENABLE</dt>\r\n *          <dd>@p options.hashld has no effect and shall be #MCUXCLELS_HASH_LOAD_DISABLE. No data is read from @p pDigest.</dd>\r\n *\r\n *      <dt>@p options.hashld == #MCUXCLELS_HASH_LOAD_DISABLE</dt>\r\n *          <dd>@p pDigest is not expected to contain an initial state. No data is read from @p pDigest.</dd>\r\n *\r\n *      <dt>@p options.rtfoe == #MCUXCLELS_HASH_RTF_UPDATE_ENABLE</dt>\r\n *          <dd>When this option is used the current runtime fingerprint (RTF) value will be appended to the output @p pDigest; an additional #MCUXCLELS_HASH_RTF_OUTPUT_SIZE bytes has to be allocated for @p pDigest.</dd>\r\n *\r\n *      <dt>@p options.hashoe == #MCUXCLELS_HASH_OUTPUT_ENABLE</dt>\r\n *          <dd>The hash state is written to @p pDigest. The size varies depending on the choice of @p options.hashmd, for more information see @ref MCUXCLELS_HASH_STATE_SIZE_ . In cases where the state size and output size differ - see @ref MCUXCLELS_HASH_OUTPUT_SIZE_ -, the state must be truncated by the caller to obtain the final hash value.</dd>\r\n *\r\n *  </dl></dd>\r\n * </dl>\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Hash_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Hash_Async(\r\n    mcuxClEls_HashOption_t options,\r\n    uint8_t const * pInput,\r\n    size_t inputLength,\r\n    uint8_t * pDigest\r\n    );\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_SHA_DIRECT\r\n/**\r\n * @brief Enables SHA-direct mode.\r\n *\r\n * If this mode is enabled, it allows the application processor to access the ELS hash\r\n * engine, but at the same time it stops ELS operations from using the hash engine.\r\n *\r\n * Therefore, in SHA-direct mode, hashing can only be done with #mcuxClEls_Hash_ShaDirect.\r\n * When SHA-direct mode is active, ELS operations which internally use the ELS hash engine\r\n * will result in an operational error (see #MCUXCLELS_STATUS_HW_OPERATIONAL). To use those\r\n * operations, disable SHA-direct mode. Please consult function descriptions to check\r\n * whether and under which circumstances they internally use the ELS hash engine.\r\n *\r\n * ELS operations which do not internally use the ELS hash engine can be performed in\r\n * parallel with a SHA-direct hash operation.\r\n *\r\n * @return A code-flow protected error code (see @ref mcuxCsslFlowProtection)\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK                  on success\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_ShaDirect_Enable)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_ShaDirect_Enable(\r\n    void);\r\n\r\n/**\r\n * @brief Disables SHA-direct mode.\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK                  on success\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_ShaDirect_Disable)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_ShaDirect_Disable(\r\n    void);\r\n\r\n/**\r\n * @brief Calculates the hash of a message using SHA-Direct mode.\r\n *\r\n * SHA-Direct mode must be enabled before calling this function. For more information, see #mcuxClEls_ShaDirect_Enable.\r\n *\r\n * In order to perform a hash calculation in SHA-Direct mode, the CPU must feed the input data to a register in ELS's SHA core, or configure a DMA to copy the input data to that register. A DMA can be used because feeding input data to the SHA core while the SHA core is busy results in an AHB bus stall, and there is no need to check any further flags before copying further data.\r\n * If a DMA shall be used to perform this copy, a callback function must be provided by the caller that will configure and start the DMA.\r\n * If no callback function is specified, this function will resort to using the CPU.\r\n *\r\n * @param[in]       options     The command options. For more information, see #mcuxClEls_HashOption_t.\r\n * @param[in]       pInput      Padded input data to be hashed.\r\n * @param[in]       inputLength Size of @p pInput in bytes. Since the input is padded, the length must be a multiple of the block size, see @ref MCUXCLELS_HASH_BLOCK_SIZE_.\r\n * @param[in, out]  pDigest     Pointer to the memory area that contains/receives the (intermediate) hash digest, allocated by the caller, see @ref MCUXCLELS_HASH_STATE_SIZE_.\r\n * @param[in]       pCallback   Callback function to load data into Sha core.\r\n * @param[in, out]  pCallerData Pointer forwarded by the operation to the callback function.\r\n *\r\n * The properties of some parameters change with respect to selected options.\r\n *\r\n * <dl>\r\n *  <dt>Parameter properties</dt>\r\n *\r\n *  <dd><dl>\r\n *      <dt>@p options.hashini == #MCUXCLELS_HASH_INIT_ENABLE</dt>\r\n *          <dd>@p options.hashld has no effect and shall be #MCUXCLELS_HASH_LOAD_DISABLE. No data is read from @p pDigest. </dd>\r\n *\r\n *      <dt>@p options.hashld == #MCUXCLELS_HASH_LOAD_DISABLE</dt>\r\n *          <dd>@p pDigest is not expected to contain an initial state. No data is read from @p pDigest. </dd>\r\n *\r\n *      <dt>@p options.hashoe == #MCUXCLELS_HASH_OUTPUT_ENABLE</dt>\r\n *          <dd>The hash state is written to @p pDigest. The size varies depending on the choice of @p options.hashmd, for more information see @ref MCUXCLELS_HASH_STATE_SIZE_ . In cases where the state size and output size differ - see @ref MCUXCLELS_HASH_OUTPUT_SIZE_ -, the state must be truncated by the caller to obtain the final hash value.</dd>\r\n *\r\n *      <dt>@p pCallback != @c NULL </dt>\r\n *          <dd>The callback function referenced by @p pCallback is called. Otherwise, the function uses a default implementation for the copy.</dd>\r\n *  </dl></dd>\r\n * </dl>\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_SW_FAULT            if the callback returned an error\r\n * @retval #MCUXCLELS_STATUS_OK                  on success\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Hash_ShaDirect)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Hash_ShaDirect(\r\n    mcuxClEls_HashOption_t options,\r\n    uint8_t const * pInput,\r\n    size_t inputLength,\r\n    uint8_t * pDigest,\r\n    mcuxClEls_TransferToRegisterFunction_t pCallback,\r\n    void * pCallerData\r\n    );\r\n#endif /* MCUXCL_FEATURE_ELS_SHA_DIRECT */\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLELS_HASH_H_ */\r\n\r\n/**\r\n * @}\r\n *\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/inc/mcuxClEls_Hmac.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxClEls_Hmac.h\r\n * @brief ELS header for HMAC support.\r\n * \r\n * This header exposes functions that enable using the ELS for the generation of hashed-key message authentication\r\n * codes (HMAC).\r\n * The supported hash algorithm is SHA2-256.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClEls_Hmac mcuxClEls_Hmac\r\n * @brief This part of the @ref mcuxClEls driver supports functionality for hashed-key message authentication codes.\r\n * @ingroup mcuxClEls\r\n * @{\r\n */\r\n#ifndef MCUXCLELS_HMAC_H_\r\n#define MCUXCLELS_HMAC_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n#include <mcuxClEls_Common.h> // Common functionality\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * MACROS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Hmac_Macros mcuxClEls_Hmac_Macros\r\n * @brief Defines all macros of @ref mcuxClEls_Hmac\r\n * @ingroup mcuxClEls_Hmac\r\n * @{\r\n */\r\n/**\r\n * @defgroup MCUXCLELS_HMAC_EXTERNAL_KEY_ MCUXCLELS_HMAC_EXTERNAL_KEY_\r\n * @brief Defines valid options to be used by #mcuxClEls_HmacOption_t\r\n * @ingroup mcuxClEls_Hmac_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_HMAC_EXTERNAL_KEY_ENABLE  1U ///< Set #mcuxClEls_HmacOption_t.extkey to this value to use an external key\r\n#define MCUXCLELS_HMAC_EXTERNAL_KEY_DISABLE 0U ///< Set #mcuxClEls_HmacOption_t.extkey to this value to use a key from the ELS keystore\r\n/**\r\n * @}\r\n */\r\n\r\n#define MCUXCLELS_HMAC_PADDED_KEY_SIZE ((size_t) 64U) ///< HMAC Key size: 64 bytes\r\n#define MCUXCLELS_HMAC_OUTPUT_SIZE ((size_t) 32U)     ///< HMAC Output size: 32 bytes\r\n/**\r\n * @}\r\n */\r\n\r\n/**********************************************\r\n * TYPEDEFS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Hmac_Types mcuxClEls_Hmac_Types\r\n * @brief Defines all types of @ref mcuxClEls_Hmac\r\n * @ingroup mcuxClEls_Hmac\r\n * @{\r\n */\r\n/**\r\n * @brief Command option bit field for #mcuxClEls_Hmac_Async.\r\n * \r\n * Valid option values can be found under @ref MCUXCLELS_HMAC_EXTERNAL_KEY_.\r\n */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value; ///< Accesses the bit field as a full word\r\n    } word;             ///< Access #mcuxClEls_CipherOption_t word-wise\r\n    struct\r\n    {\r\n        uint32_t :13;       ///< RFU\r\n        uint32_t extkey :1; ///< Whether an external key should be used\r\n        uint32_t :18;       ///< RFU\r\n    } bits;                 ///< Access #mcuxClEls_CipherOption_t word-wise\r\n} mcuxClEls_HmacOption_t;\r\n/**\r\n * @}\r\n */\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Hmac_Functions mcuxClEls_Hmac_Functions\r\n * @brief Defines all functions of @ref mcuxClEls_Hmac\r\n * @ingroup mcuxClEls_Hmac\r\n * @{\r\n */\r\n/**\r\n * @brief Performs HMAC with SHA-256.\r\n * \r\n * @if MCUXCL_FEATURE_ELS_SHA_DIRECT\r\n * It must be ensured that SHA-Direct mode is disabled when calling this function (see #mcuxClEls_ShaDirect_Disable).\r\n * @endif\r\n * \r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in]      options     The command options. For more information, see #mcuxClEls_HmacOption_t.\r\n * @param[in]      keyIdx      The HMAC key index, if an internal key shall be used\r\n * @param[in]      pPaddedKey  Pointer to a memory location containing the padded HMAC key\r\n * @param[in]      pInput      Pointer to a memory location which contains the data to be authenticated\r\n * @param[in]      inputLength Size of @p pInput in bytes\r\n * @param    [out] pOutput     The output message authentication code\r\n * \r\n * The properties of some parameters change with respect to selected options.\r\n *\r\n * <dl>\r\n *  <dt>Parameter properties</dt>\r\n *\r\n *  <dd><dl>\r\n *      <dt>@p options.extkey == #MCUXCLELS_HMAC_EXTERNAL_KEY_ENABLE</dt>\r\n *          <dd>@p keyIdx is ignored.\r\n * \r\n *          @p pPaddedKey must contain the padded HMAC key, which can mean one of two things depending on the length of the original HMAC key, L<sub>kHMAC</sub>:\r\n *          <ul><li>If L<sub>kHMAC</sub> &le; #MCUXCLELS_HMAC_PADDED_KEY_SIZE, @p pPaddedKey must be the HMAC key padded with zero-bytes to fill the required length of #MCUXCLELS_HMAC_PADDED_KEY_SIZE bytes.</li>\r\n * \r\n *          <li>If L<sub>kHMAC</sub> &gt; #MCUXCLELS_HMAC_PADDED_KEY_SIZE, @p pPaddedKey must contain the SHA-256 hash of the HMAC key, padded with zero-bytes to fill the required length of #MCUXCLELS_HMAC_PADDED_KEY_SIZE bytes.</li></ul></dd>\r\n * \r\n *      <dt>@p options.extkey == #MCUXCLELS_HMAC_EXTERNAL_KEY_DISABLE</dt>\r\n *          <dd>@p keyIdx must be a valid key index with the correct usage rights for HMAC.\r\n * \r\n *          @p pPaddedKey is ignored.</dd>\r\n *\r\n *  </dl></dd>\r\n * </dl>\r\n * \r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Hmac_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Hmac_Async(\r\n    mcuxClEls_HmacOption_t options,\r\n    mcuxClEls_KeyIndex_t keyIdx,\r\n    uint8_t const * pPaddedKey,\r\n    uint8_t const * pInput,\r\n    size_t inputLength,\r\n    uint8_t * pOutput\r\n    );\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLELS_HMAC_H_ */\r\n/**\r\n * @}\r\n * \r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/inc/mcuxClEls_Kdf.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxClEls_Kdf.h\r\n * @brief ELS header for key derivation.\r\n *\r\n * This header exposes functions that enable using the ELS for various key derivation commands.\r\n * The supported key derivation algorithms are CKDF, HKDF, TLS\r\n */\r\n\r\n\r\n/**\r\n * @defgroup mcuxClEls_Kdf mcuxClEls_Kdf\r\n * @brief This part of the @ref mcuxClEls driver supports functionality for key derivation\r\n * @ingroup mcuxClEls\r\n * @{\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClEls_Kdf_Macros mcuxClEls_Kdf_Macros\r\n * @brief Defines all macros of @ref mcuxClEls_Kdf\r\n * @ingroup mcuxClEls_Kdf\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLELS_KDF_H_\r\n#define MCUXCLELS_KDF_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n\r\n\r\n\r\n\r\n\r\n#include <mcuxClEls_Common.h> // Common functionality\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * CONSTANTS\r\n **********************************************/\r\n\r\n/**\r\n * @defgroup mcuxClEls_Kdf_Define mcuxClEls_Kdf_Define\r\n * @brief  constants\r\n * @ingroup mcuxClEls_Kdf_Macros\r\n * @{\r\n */\r\n\r\n\r\n#define MCUXCLELS_CKDF_DERIVATIONDATA_SIZE               12u ///< Size of CKDF SP800-108 derivation data\r\n#define MCUXCLELS_CKDF_ALGO_SP800108                     0x0u ///< Use SP800-108 algorithm\r\n\r\n\r\n\r\n\r\n#define MCUXCLELS_HKDF_RFC5869_DERIVATIONDATA_SIZE 32u ///< Size of HKDF derivation data\r\n#define MCUXCLELS_HKDF_SP80056C_TARGETKEY_SIZE     32u ///< Size of HKDF SP800-56C derived key\r\n\r\n#define MCUXCLELS_HKDF_VALUE_RTF_DERIV             ((uint32_t) 1u<< 0u) ///< Use RTF as derivation input\r\n#define MCUXCLELS_HKDF_VALUE_MEMORY_DERIV          ((uint32_t) 0u<< 0u) ///< Use derivation input from system memory\r\n\r\n#define MCUXCLELS_HKDF_ALGO_RFC5869                0x0u ///< Use RFC5869 algorithm\r\n#define MCUXCLELS_HKDF_ALGO_SP80056C               0x1u ///< Use SP800-56C algorithm\r\n\r\n#define MCUXCLELS_HKDF_RTF_DERIV                   1U ///< Use RTF as derivation input\r\n#define MCUXCLELS_HKDF_SYSTEM_MEMORY_DERIV         0U ///< Use derivation input from system memory\r\n\r\n#define MCUXCLELS_TLS_DERIVATIONDATA_SIZE          ((size_t) 80u) ///< Size of TLS derivation data\r\n#define MCUXCLELS_TLS_RANDOM_SIZE                  ((size_t) 32u) ///< Size of random bytes for TLS\r\n\r\n#define MCUXCLELS_TLS_INIT                         0u ///< Perform master key generation\r\n#define MCUXCLELS_TLS_FINALIZE                     1u ///< Perform session key generation\r\n\r\n/**\r\n * @}\r\n */ /* mcuxClEls_Kdf_Define */\r\n\r\n/**********************************************\r\n * TYPEDEFS\r\n **********************************************/\r\n\r\n/**\r\n * @defgroup mcuxClEls_Kdf_Types mcuxClEls_Kdf_Types\r\n * @brief Defines all types of @ref mcuxClEls_Kdf\r\n * @ingroup mcuxClEls_Kdf\r\n * @{\r\n */\r\n\r\n/** Internal command option bit field for CKDF functions. */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value;         ///< Accesses the bit field as a full word; initialize with a combination of constants from @ref MCUXCLELS_HKDF_VALUE_\r\n    } word;\r\n    struct\r\n    {\r\n        uint32_t :12;\r\n        uint32_t ckdf_algo :2;  ///< Defines which algorithm and mode shall be used. This option is set internally and will be ignored:\r\n                                ///< #MCUXCLELS_CKDF_ALGO_SP800108  = Use SP800-108 algorithm\r\n        uint32_t :18;\r\n    } bits;\r\n} mcuxClEls_CkdfOption_t;\r\n\r\n/** Command option bit field for #mcuxClEls_Hkdf_Rfc5869_Async. */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value;         ///< Accesses the bit field as a full word; initialize with a combination of constants from @ref MCUXCLELS_HKDF_VALUE_\r\n    } word;\r\n    struct\r\n    {\r\n        uint32_t rtfdrvdat :1;  ///< #MCUXCLELS_HKDF_SYSTEM_MEMORY_DERIV=use derivation input from system memory, #MCUXCLELS_HKDF_RTF_DERIV=use RTF (runtime fingerprint) as derivation input\r\n        uint32_t hkdf_algo :1;  ///< Defines which algorithm shall be used. This option is set internally and will be ignored:\r\n                                ///< #MCUXCLELS_HKDF_ALGO_RFC5869 = Use RFC5869 algorithm\r\n                                ///< #MCUXCLELS_HKDF_ALGO_SP80056C = Use SP800-56C algorithm\r\n        uint32_t :30;\r\n    } bits;\r\n} mcuxClEls_HkdfOption_t;\r\n\r\n/** Internal command option bit field for #mcuxClEls_TlsGenerateMasterKeyFromPreMasterKey_Async, and #mcuxClEls_TlsGenerateMasterKeyFromPreMasterKey_Async. */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value;         ///< Accesses the bit field as a full word; initialize with a combination of constants from @ref MCUXCLELS_HKDF_VALUE_\r\n    } word;\r\n    struct\r\n    {\r\n        uint32_t :10;\r\n        uint32_t mode :1;       ///< Defines which phase of the key generation is performed. This option is set internally and will be ignored:\r\n                                ///< #MCUXCLELS_TLS_INIT  = Calculate master key from premaster key\r\n                                ///< #MCUXCLELS_TLS_FINALIZE = Calculate session keys from master key\r\n        uint32_t :21;\r\n    } bits;\r\n} mcuxClEls_TlsOption_t;\r\n\r\n/**\r\n * @}\r\n */ /* mcuxClEls_Kdf_Types */\r\n\r\n/**\r\n * @}\r\n */ /* mcuxClEls_Kdf_Macros */\r\n\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Kdf_Functions mcuxClEls_Kdf_Functions\r\n * @brief Defines all functions of @ref mcuxClEls_Kdf\r\n * @ingroup mcuxClEls_Kdf\r\n * @{\r\n */\r\n\r\n\r\n/**\r\n * @brief Derives a key using the HKDF (HMAC-based key derivation function) according to RFC5869.\r\n * @if MCUXCL_FEATURE_ELS_SHA_DIRECT\r\n * It must be ensured that SHA-Direct mode is disabled when calling this function (see #mcuxClEls_ShaDirect_Disable).\r\n * @endif\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n * @param[in] options The command options. For more information, see #mcuxClEls_HkdfOption_t.\r\n * @param[in] derivationKeyIdx Key index used for derivation. Must be a 256-bit key with HKDF property bit set to 1.\r\n * @param[in] targetKeyIdx Key bank number of the derived key. Will be a 256-bit key, the user must ensure there is enough space in the keystore to hold the derived key.\r\n * @param[in] targetKeyProperties Requested properties for the derived key. The ksize field will be ignored.\r\n * @param[in] pDerivationData The algorithm-specific derivation data, the length is #MCUXCLELS_HKDF_RFC5869_DERIVATIONDATA_SIZE bytes\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n *\r\n *\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Hkdf_Rfc5869_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Hkdf_Rfc5869_Async(\r\n    mcuxClEls_HkdfOption_t options,\r\n    mcuxClEls_KeyIndex_t derivationKeyIdx,\r\n    mcuxClEls_KeyIndex_t targetKeyIdx,\r\n    mcuxClEls_KeyProp_t targetKeyProperties,\r\n    uint8_t const * pDerivationData\r\n    );\r\n\r\n/** Derives a key using the HKDF (HMAC-based key derivation function) according to SP800-56C one-step approach with Sha2-256.\r\n * @if MCUXCL_FEATURE_ELS_SHA_DIRECT\r\n * It must be ensured that SHA-Direct mode is disabled when calling this function (see #mcuxClEls_ShaDirect_Disable).\r\n * @endif\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in] derivationKeyIdx  Key index used for derivation. Must be a 256-bit key with HKDF property bit set to 1.\r\n * @param[out] pTagetKey Memory area to store the derived key. Will be a 256-bit key, the user must ensure there is enough space in the keystore to hold the derived key.\r\n * @param[in] pDerivationData The algorithm-specific derivation data\r\n * @param[in] derivationDataLength Length of the derivation data\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Hkdf_Sp80056c_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Hkdf_Sp80056c_Async(\r\n    mcuxClEls_KeyIndex_t derivationKeyIdx,\r\n    uint8_t * pTagetKey,\r\n    uint8_t const * pDerivationData,\r\n    size_t derivationDataLength\r\n    );\r\n\r\n\r\n/** Derives a key using the NIST SP 800-108 CMAC-based Extract-and-Expand Key Derivation Function.\r\n * \r\n * @if ELS_AES_WITH_SIDE_CHANNEL_PROTECTION\r\n * Before execution, ELS will wait until #mcuxClEls_HwState_t.drbgentlvl == #MCUXCLELS_STATUS_DRBGENTLVL_LOW. This can lead to a delay if the DRBG is in a state with less security strength at the time of the call.\r\n * @endif\r\n * \r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n *   @param[in] derivationKeyIdx Key index used for derivation\r\n *   @param[in] targetKeyIdx Key bank number of the derived key\r\n *   @param[in] targetKeyProperties Requested properties for the derived key. Only set usage bits.\r\n *   @param[in] pDerivationData The algorithm-specific derivation data, the length is #MCUXCLELS_CKDF_DERIVATIONDATA_SIZE bytes\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Ckdf_Sp800108_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Ckdf_Sp800108_Async(\r\n    mcuxClEls_KeyIndex_t derivationKeyIdx,\r\n    mcuxClEls_KeyIndex_t targetKeyIdx,\r\n    mcuxClEls_KeyProp_t targetKeyProperties,\r\n    uint8_t const * pDerivationData\r\n    );\r\n\r\n\r\n\r\n/** Generates a TLS master key based on a pre-master key and derivation data, according to the TLS 1.2 specification.\r\n * The pre-master key is overwritten in this operation.\r\n * @if MCUXCL_FEATURE_ELS_SHA_DIRECT\r\n * It must be ensured that SHA-Direct mode is disabled when calling this function (see #mcuxClEls_ShaDirect_Disable).\r\n * @endif\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in] pDerivationData The TLS derivation data, consisting of Label, Client Random and Server Random from the TLS 1.2 specification.\r\n *                            Note: The order is different from #mcuxClEls_TlsGenerateSessionKeysFromMasterKey_Async.\r\n * @param[in] keyProperties Desired key properties. Only #mcuxClEls_KeyProp_t::upprot_priv and #mcuxClEls_KeyProp_t::upprot_sec are used, the rest are ignored.\r\n * @param[in] keyIdx The index of the TLS pre-master key, which is overwritten with the master key\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_TlsGenerateMasterKeyFromPreMasterKey_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_TlsGenerateMasterKeyFromPreMasterKey_Async(\r\n    uint8_t const * pDerivationData,\r\n    mcuxClEls_KeyProp_t keyProperties,\r\n    mcuxClEls_KeyIndex_t keyIdx\r\n    );\r\n\r\n/** Generates TLS session keys based on a master key and derivation data, according to the TLS 1.2 specification.\r\n * The master key and the following five key indices are overwritten in this operation.\r\n * The keys are written in the following order:\r\n * <ol>\r\n *     <li> Client Encryption Key\r\n *     <li> Client Message Authentication Key\r\n *     <li> Server Encryption Key\r\n *     <li> Server Message Authentication Key\r\n * </ol>\r\n * @if MCUXCL_FEATURE_ELS_SHA_DIRECT\r\n * It must be ensured that SHA-Direct mode is disabled when calling this function (see #mcuxClEls_ShaDirect_Disable).\r\n * @endif\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in] pDerivationData The TLS derivation data, consisting of Label, Server Random and Client Random from the TLS 1.2 specification.\r\n *                            Note: The order is different from #mcuxClEls_TlsGenerateMasterKeyFromPreMasterKey_Async.\r\n * @param[in] keyProperties Desired key properties. Only #mcuxClEls_KeyProp_t::upprot_priv and #mcuxClEls_KeyProp_t::upprot_sec are used, the rest are ignored.\r\n * @param[in]  keyIdx  The index of the TLS master key, which is overwritten with one of the session keys.\r\n *                     There must be three further consecutive unoccupied key indices following this index.\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_TlsGenerateSessionKeysFromMasterKey_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_TlsGenerateSessionKeysFromMasterKey_Async(\r\n    uint8_t const * pDerivationData,\r\n    mcuxClEls_KeyProp_t keyProperties,\r\n    mcuxClEls_KeyIndex_t keyIdx\r\n    );\r\n\r\n/**\r\n * @}\r\n */ /* mcuxClEls_Kdf_Functions */\r\n\r\n/**\r\n * @}\r\n */ /* mcuxClEls_Kdf */\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLELS_KDF_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/inc/mcuxClEls_KeyManagement.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxClEls_KeyManagement.h\r\n * @brief ELS header for key management.\r\n *\r\n * This header exposes functions that can be used to manage the keystore of ELS.\r\n * This includes:\r\n * - Importing keys\r\n * @if MCUXCL_FEATURE_ELS_KEY_MGMT_EXPORT\r\n * - Exporting keys\r\n * @endif\r\n * @if MCUXCL_FEATURE_ELS_KEY_MGMT_DELETE\r\n * - Deleting keys\r\n * @endif\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClEls_KeyManagement mcuxClEls_KeyManagement\r\n * @brief This part of the @ref mcuxClEls driver supports functionality for keys management\r\n * @ingroup mcuxClEls\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLELS_KEYMANAGEMENT_H_\r\n#define MCUXCLELS_KEYMANAGEMENT_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n#include <mcuxClEls_Common.h> // Common functionality\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * CONSTANTS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_KeyManagement_Macros mcuxClEls_KeyManagement_Macros\r\n * @brief Defines all macros of @ref mcuxClEls_KeyManagement\r\n * @ingroup mcuxClEls_KeyManagement\r\n * @{\r\n */\r\n\r\n/**\r\n * @defgroup MCUXCLELS_KEYIMPORT_VALUE_KFMT_ MCUXCLELS_KEYIMPORT_VALUE_KFMT_\r\n * @brief Defines valid options (word value) to be used by #mcuxClEls_KeyImport_Async\r\n * @ingroup mcuxClEls_KeyManagement_Macros\r\n *\r\n * @{\r\n */\r\n\r\n#define MCUXCLELS_KEYIMPORT_VALUE_KFMT_UDF      ((uint32_t) 0u<< 6u) ///< Key format UDF with shares in RTL or memory\r\n#define MCUXCLELS_KEYIMPORT_VALUE_KFMT_RFC3394  ((uint32_t) 1u<< 6u) ///< Key format RFC3394 with shares in memory\r\n#define MCUXCLELS_KEYIMPORT_VALUE_KFMT_PUF      ((uint32_t) 2u<< 6u) ///< Key from PUF\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n#define MCUXCLELS_KEYIMPORT_VALUE_KFMT_PBK      ((uint32_t) 3u<< 6u) ///< Key from Public Key Certificate\r\n#endif /* MCUXCL_FEATURE_ELS_PUK_INTERNAL */\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @defgroup MCUXCLELS_KEYIMPORT_KFMT_ MCUXCLELS_KEYIMPORT_KFMT_\r\n * @brief Defines valid options (bit values) to be used by #mcuxClEls_KeyImport_Async\r\n * @ingroup mcuxClEls_KeyManagement_Macros\r\n *\r\n * @{\r\n */\r\n#define MCUXCLELS_KEYIMPORT_KFMT_UDF             (0x00u) ///< Key format UDF with shares in RTL or memory\r\n#define MCUXCLELS_KEYIMPORT_KFMT_RFC3394         (0x01u) ///< Key format RFC3394 with shares in memory\r\n#define MCUXCLELS_KEYIMPORT_KFMT_PUF             (0x02u) ///< Key from PUF\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n#define MCUXCLELS_KEYIMPORT_KFMT_PBK             (0x03u) ///< Key from Public Key Certificate\r\n#endif /* MCUXCL_FEATURE_ELS_PUK_INTERNAL */\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n#define MCUXCLELS_KEYIMPORT_REVERSEFETCH_ENABLE  (0x01U) ///< Reverse fetch enabled. For internal use\r\n#define MCUXCLELS_KEYIMPORT_REVERSEFETCH_DISABLE (0x00U) ///< Reverse fetch disabled. For internal use\r\n#endif /* MCUXCL_FEATURE_ELS_PUK_INTERNAL */\r\n\r\n#define MCUXCLELS_RFC3394_OVERHEAD               ((size_t) 16u)     ///< Overhead between RFC3394 blob and key size\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @defgroup MCUXCLELS_RFC3394_ MCUXCLELS_RFC3394_\r\n * @brief Defines specifying the length of RFC3394 containers\r\n * @ingroup mcuxClEls_KeyManagement_Macros\r\n *\r\n * @{\r\n */\r\n#define MCUXCLELS_RFC3394_CONTAINER_SIZE_128     ((size_t) 256u/8u) ///< Size of RFC3394 container for 128 bit key\r\n#define MCUXCLELS_RFC3394_CONTAINER_SIZE_256     ((size_t) 384u/8u) ///< Size of RFC3394 container for 256 bit key\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n#define MCUXCLELS_RFC3394_CONTAINER_SIZE_P256    ((size_t) 640u/8u) ///< Size of RFC3394 container for P256 bit public key\r\n#endif /* MCUXCL_FEATURE_ELS_PUK_INTERNAL */\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n/**********************************************\r\n * TYPEDEFS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_KeyManagement_Types mcuxClEls_KeyManagement_Types\r\n * @brief Defines all types of @ref mcuxClEls_KeyManagement\r\n * @ingroup mcuxClEls_KeyManagement\r\n * @{\r\n */\r\n\r\n/**\r\n * @brief Command option bit field for #mcuxClEls_KeyImport_Async\r\n *\r\n * Bit field to configure #mcuxClEls_KeyImport_Async. \r\n * See @ref MCUXCLELS_KEYIMPORT_KFMT_ for possible options in case the struct is accessed bit-wise.\r\n * See @ref MCUXCLELS_KEYIMPORT_VALUE_KFMT_ for possible options in case the struct is accessed word-wise.\r\n */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value;     ///< Accesses the bit field as a full word; initialize with a combination of constants from @ref MCUXCLELS_KEYIMPORT_VALUE_KFMT_\r\n    } word;                 ///< Access #mcuxClEls_KeyImportOption_t word-wise\r\n    struct\r\n    {\r\n        uint32_t :4;        ///< RFU\r\n        uint32_t revf :1;   ///< This field is managed internally\r\n        uint32_t :1;        ///< RFU\r\n        uint32_t kfmt :2;   ///< Defines the key import format, one of @ref MCUXCLELS_KEYIMPORT_KFMT_\r\n        uint32_t :24;       ///< RFU\r\n    } bits;                 ///< Access #mcuxClEls_KeyImportOption_t bit-wise\r\n} mcuxClEls_KeyImportOption_t;\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_KeyManagement_Functions mcuxClEls_KeyManagement_Functions\r\n * @brief Defines all functions of @ref mcuxClEls_KeyManagement\r\n * @ingroup mcuxClEls_KeyManagement\r\n * @{\r\n */\r\n\r\n/** \r\n * @brief Deletes a key from keystore at the given index.\r\n * \r\n * Before execution, ELS will wait until #mcuxClEls_HwState_t.drbgentlvl == #MCUXCLELS_STATUS_DRBGENTLVL_LOW. This can lead to a delay if the DRBG is in a state with less security strength at the time of the call.\r\n *\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in]    keyIdx  The index of the key to be deleted\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_SW_FAULT            if a failure occurred\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_KeyDelete_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_KeyDelete_Async(\r\n        mcuxClEls_KeyIndex_t keyIdx\r\n);\r\n\r\n\r\n\r\n/** @brief Imports a key from external storage to an internal key register.\r\n * \r\n * @if ELS_AES_WITH_SIDE_CHANNEL_PROTECTION\r\n * Before execution, ELS will wait until #mcuxClEls_HwState_t.drbgentlvl == #MCUXCLELS_STATUS_DRBGENTLVL_LOW. This can lead to a delay if the DRBG is in a state with less security strength at the time of the call.\r\n * @endif\r\n *\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in]    options          One of @ref MCUXCLELS_KEYIMPORT_KFMT_\r\n * @param[in]    pImportKey       Pointer to the RFC3394 container of the key to be imported\r\n * @param[in]    importKeyLength  Length of the RFC3394 container of the key to be imported\r\n * @param[in]    wrappingKeyIdx   Index of the key wrapping key, if importing RFC3394 format\r\n * @param[in]    targetKeyIdx     The desired key index of the imported key\r\n *\r\n *  <dl>\r\n *   <dt>Parameter properties</dt>\r\n *   <dd><dl>\r\n *     <dt>@p options.kfmt != #MCUXCLELS_KEYIMPORT_KFMT_RFC3394</dt><dd>\r\n *       <ul style=\"list-style: none;\">\r\n *         <li>@p pImportKey is ignored.</li>\r\n *         <li>@p importKeyLength is ignored.</li>\r\n *         <li>@p wrappingKeyIdx is ignored.</li>\r\n *         <li>@p targetKeyIdx is ignored. The unpacked key is automatically stored in key slots 0, 1.</li>\r\n *       </ul></dd>\r\n *     </dt>\r\n *   </dl></dd>\r\n *  </dl>\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_KeyImport_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_KeyImport_Async(\r\n    mcuxClEls_KeyImportOption_t options,\r\n    uint8_t const * pImportKey,\r\n    size_t importKeyLength,\r\n    mcuxClEls_KeyIndex_t wrappingKeyIdx,\r\n    mcuxClEls_KeyIndex_t targetKeyIdx\r\n    );\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n/** @brief Imports a public key to an internal key register if the signature verification of the provided public key against\r\n *         the provided signature is correct.\r\n * \r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in]    pCertificate       Pointer to the Certificate structure\r\n * @param[in]    certificateLength  Length of the Certificate structure\r\n * @param[in]    publicKeyOffset    Offset of the Public key to be imported within @p pCertificate\r\n * @param[in]    pSignature         Signed challenge used to authenticate the imported key. Must be word aligned\r\n * @param[in]    verifyingKeyIdx    The key index of the verifying public key\r\n * @param[in]    keyProperties      The desired key properties of the imported key\r\n * @param[in]    targetKeyIdx       The desired key index of the imported key\r\n * @param[out]   pOutput            Pointer to the memory area which will receive the recalculated value of the R component in case of a successful\r\n *                                  certificate verification. Must be word aligned\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_KeyImportPuk_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_KeyImportPuk_Async(\r\n    uint8_t const * pCertificate,\r\n    size_t certificateLength,\r\n    size_t publicKeyOffset,\r\n    uint8_t const * pSignature,\r\n    mcuxClEls_KeyIndex_t verifyingKeyIdx,\r\n    mcuxClEls_KeyProp_t keyProperties,\r\n    mcuxClEls_KeyIndex_t targetKeyIdx,\r\n    uint8_t * pOutput\t\r\n    );\r\n#endif /* MCUXCL_FEATURE_ELS_PUK_INTERNAL */\r\n\r\n/** @brief Exports a key from an internal key register to external storage, using a wrapping key.\r\n * \r\n * @if ELS_AES_WITH_SIDE_CHANNEL_PROTECTION\r\n * Before execution, ELS will wait until #mcuxClEls_HwState_t.drbgentlvl == #MCUXCLELS_STATUS_DRBGENTLVL_LOW. This can lead to a delay if the DRBG is in a state with less security strength at the time of the call.\r\n * @endif\r\n *\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in]    wrappingKeyIdx     The key used for key wrapping\r\n * @param[in]    exportKeyIdx       The key to export\r\n * @param[out]   pOutput            The memory address of the exported key\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_INVALID_PARAM    if invalid parameters were specified\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_KeyExport_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_KeyExport_Async(\r\n    mcuxClEls_KeyIndex_t wrappingKeyIdx, ///< [in]  The key used for key wrapping\r\n    mcuxClEls_KeyIndex_t exportKeyIdx,   ///< [in]  The key to export\r\n    uint8_t * pOutput                   ///< [out] The memory address of the exported key\r\n    );\r\n\r\n/** @brief Exports the properties of the keys stored in the ELS internal keystore\r\n *\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[in]    keyIdx     Request key properties of the index defined here\r\n * @param[out]   pKeyProp   Key properties of the index provided\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK                  on successful request */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_GetKeyProperties)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GetKeyProperties(\r\n    mcuxClEls_KeyIndex_t keyIdx,\r\n    mcuxClEls_KeyProp_t * pKeyProp\r\n    );\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLELS_KEYMANAGEMENT_H_ */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/inc/mcuxClEls_Rng.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file mcuxClEls_Rng.h\r\n * @brief ELS header for random number generation.\r\n * This header exposes functions to configure the ELS RNGs (DRBG and DTRNG) and to generate random data.\r\n */\r\n\r\n#ifndef MCUXCLELS_RNG_H_\r\n#define MCUXCLELS_RNG_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n#include <mcuxClEls_Common.h> // Common functionality\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**\r\n * @defgroup mcuxClEls_Rng mcuxClEls_Rng\r\n * @brief This part of the @ref mcuxClEls driver supports functionality for random number generation\r\n * @ingroup mcuxClEls\r\n * @{\r\n */\r\n\r\n\r\n/**********************************************\r\n * CONSTANTS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Rng_Macros mcuxClEls_Rng_Macros\r\n * @brief Defines all macros of @ref mcuxClEls_Rng\r\n * @ingroup mcuxClEls_Rng\r\n * @{\r\n */\r\n#define MCUXCLELS_RNG_DTRNG_CONFIG_SIZE       ((uint8_t) 84)   ///< Size of DTRNG configuration\r\n#define MCUXCLELS_RNG_DTRNG_EVAL_CONFIG_SIZE  ((uint8_t) 52)   ///< Size of DTRNG characterization data\r\n#define MCUXCLELS_RNG_DTRNG_EVAL_RESULT_SIZE  ((uint8_t) 188)  ///< Size of DTRNG characterization result\r\n\r\n#define MCUXCLELS_RNG_DRBG_TEST_EXTRACT_OUTPUT_MIN_SIZE  4U                      ///< Minimum output size of #mcuxClEls_Rng_DrbgTestExtract_Async\r\n#define MCUXCLELS_RNG_DRBG_TEST_EXTRACT_OUTPUT_MAX_SIZE  ((uint32_t) 1U << 16U)  ///< Maximum output size of #mcuxClEls_Rng_DrbgTestExtract_Async\r\n\r\n#define MCUXCLELS_RNG_DRBG_TEST_MODE_INSTANTIATE ((uint32_t) 0U) ///< Command options value for DRBG Test Instantiate command. For internal use\r\n#define MCUXCLELS_RNG_DRBG_TEST_MODE_EXTRACT     ((uint32_t) 1U) ///< Command options value for DRBG Test Extract command. For internal use\r\n#define MCUXCLELS_RNG_DRBG_TEST_MODE_AES_ECB     ((uint32_t) 3U) ///< Command options value for DRBG Test AES-ECB command. For internal use\r\n#define MCUXCLELS_RNG_DRBG_TEST_MODE_AES_CTR     ((uint32_t) 2U) ///< Command options value for DRBG Test AES-CTR command. For internal use\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_RND_RAW\r\n#define MCUXCLELS_RNG_RND_REQ_RND_RAW            ((uint32_t) 1U << 1) ///< Command options value for RND_REQ command. For internal use\r\n#define MCUXCLELS_RNG_RAW_ENTROPY_SIZE           ((uint32_t) 32U)     ///< Fixed size of raw entropy when using the DTRNG\r\n#endif /* MCUXCL_FEATURE_ELS_RND_RAW */\r\n#ifdef MCUXCL_FEATURE_ELS_PRND_INIT\r\n#define MCUXCLELS_RNG_RND_REQ_PRND_INIT          ((uint32_t) 1U << 0) ///< Command options value for PRND_INIT command. For internal use\r\n#endif /* MCUXCL_FEATURE_ELS_PRND_INIT */\r\n/**\r\n * @}\r\n */\r\n\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Rng_Functions mcuxClEls_Rng_Functions\r\n * @brief Defines all functions of @ref mcuxClEls_Rng\r\n * @ingroup mcuxClEls_Rng\r\n * @{\r\n */\r\n\r\n/**\r\n * @brief Writes random data from the ELS DRBG to the given buffer.\r\n *\r\n * This function fills a buffer with random values from the DRBG. The DRBG provides 128 bits of security strength.\r\n *\r\n * Before execution, ELS will wait until #mcuxClEls_HwState_t.drbgentlvl == #MCUXCLELS_STATUS_DRBGENTLVL_HIGH. This can lead to a delay if the DRBG is in a state with less security strength at the time of the call.\r\n *\r\n * If the random values from the DRBG are later used as a cryptographic key, the security strength of the cryptographic operation using the generated key should not exceed that of the DRBG.\r\n *\r\n * To name a few examples, this means (as per NIST SP 800-57 Part 1 Rev. 5):\r\n * - AES-192 or AES-256 keys generated with this function will provide only 128 bits of security strength\r\n * - RSA keys longer than 3072 bits will provide only 128 bits of security strength\r\n * - ECC keys longer than 383 bits will provide only 128 bits of security strength\r\n *\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[out] pOutput       Pointer to the beginning of the memory area to fill with random data\r\n * @param[in]  outputLength  Number of requested random bytes\r\n *\r\n * <dl>\r\n *   <dt>Parameter properties</dt>\r\n *   <dd><dl>\r\n *     <dt>@p outputLength </dt>\r\n *       <dd>supported values are #MCUXCLELS_RNG_DRBG_TEST_EXTRACT_OUTPUT_MIN_SIZE bytes up to\r\n *           #MCUXCLELS_RNG_DRBG_TEST_EXTRACT_OUTPUT_MAX_SIZE bytes. The size must be a multiple of 4.</dd>\r\n *   </dl></dd>\r\n * </dl>\r\n * \r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_SW_FAULT            in case of an internal error\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Rng_DrbgRequest_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Rng_DrbgRequest_Async(\r\n    uint8_t * pOutput,\r\n    size_t outputLength\r\n    );\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_RND_RAW\r\n/**\r\n * @brief Writes 32 bytes of raw random data from the ELS TRNG to the given buffer.\r\n *\r\n * This function fills a buffer with raw (unprocessed) random values from the TRNG. \r\n *\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @param[out] pOutput       Pointer to the beginning of the memory area to fill with random data\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Rng_DrbgRequestRaw_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Rng_DrbgRequestRaw_Async(\r\n    uint8_t * pOutput\r\n    );\r\n#endif /* MCUXCL_FEATURE_ELS_RND_RAW */\r\n\r\n/**\r\n * @brief Instantiates the DRBG in test mode.\r\n *\r\n * This function is a support function for FIPS CAVP testing. This function turns the ELS internal DRBG in test mode by loading known entropy from system memory.\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n * Note that this function will alter the ELS internal entropy state which needs to be updated by the TRNG to use the DRBG in normal mode.\r\n * The update process is majorly impacted by the time the TRNG needs to provide fresh entropy.\r\n *\r\n * @param[in] pEntropy  Pointer to the input entropy data\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Rng_DrbgTestInstantiate_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Rng_DrbgTestInstantiate_Async(\r\n    uint8_t const * pEntropy\r\n    );\r\n\r\n/**\r\n * @brief Performs a DRBG extraction.\r\n *\r\n * This function is a support function for FIPS CAVP testing. This function mimics the behavior of #mcuxClEls_Rng_DrbgRequest_Async and fills a buffer with random data when DRBG is in test mode.\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n * Note that this function will alter the ELS internal entropy state which needs to be updated by the TRNG to use the DRBG in normal mode.\r\n * The update process is majorly impacted by the time the TRNG needs to provide fresh entropy.\r\n *\r\n * @attention #mcuxClEls_Rng_DrbgTestInstantiate_Async must be called prior to this function.\r\n *\r\n * @param[out] pOutput       Pointer to the output random number\r\n * @param[in]  outputLength  Length of the random number\r\n *\r\n * <dl>\r\n *   <dt>Parameter properties</dt>\r\n *   <dd><dl>\r\n *     <dt>@p outputLength </dt>\r\n *       <dd>supported values are #MCUXCLELS_RNG_DRBG_TEST_EXTRACT_OUTPUT_MIN_SIZE bytes up to\r\n *           #MCUXCLELS_RNG_DRBG_TEST_EXTRACT_OUTPUT_MAX_SIZE bytes. The size must be a multiple of 4.</dd>\r\n *   </dl></dd>\r\n * </dl>\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref MCUXCLELS_STATUS_ and @ref mcuxCsslFlowProtection)\r\n * @else\r\n *  @return An error code (see @ref MCUXCLELS_STATUS_)\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Rng_DrbgTestExtract_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Rng_DrbgTestExtract_Async(\r\n    uint8_t * pOutput,\r\n    size_t outputLength\r\n    );\r\n\r\n/**\r\n * @brief Encrypts data using the AES-ECB engine of the DRBG.\r\n *\r\n * This function is a support function for FIPS CAVP testing. This function performs an AES-ECB encryption on system data to evaluate the encryption engine of the DRBG.\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n * Note that this function will alter the ELS internal entropy state which needs to be updated by the TRNG to use the DRBG in normal mode.\r\n * The update process is majorly impacted by the time the TRNG needs to provide fresh entropy.\r\n *\r\n * @param[in]  pDataKey  Pointer to the data and key\r\n * @param[out] pOutput   Pointer to the encrypted output\r\n *\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Rng_DrbgTestAesEcb_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Rng_DrbgTestAesEcb_Async(\r\n    uint8_t const * pDataKey,\r\n    uint8_t * pOutput\r\n    );\r\n\r\n/**\r\n * @brief Encrypts data using the AES-CTR engine of the DRBG.\r\n *\r\n\r\n * This function is a support function for FIPS CAVP testing. This function performs an AES-CTR encryption on system data to evaluate the encryption engine of the DRBG in test mode.\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n * Note that this function will alter the ELS internal entropy state which needs to be updated by the TRNG to use the DRBG in normal mode.\r\n * The update process is majorly impacted by the time the TRNG needs to provide fresh entropy.\r\n *\r\n * @param[in]  pData       Pointer to the data to be encrypted\r\n * @param[in]  dataLength  Length of the data to be encrypted\r\n * @param[in]  pIvKey      Pointer to the IV and key\r\n * @param[out] pOutput     Pointer to the encrypted output\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Rng_DrbgTestAesCtr_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Rng_DrbgTestAesCtr_Async(\r\n    uint8_t const * pData,\r\n    size_t dataLength,\r\n    uint8_t const * pIvKey,\r\n    uint8_t * pOutput\r\n    );\r\n\r\n/**\r\n * @brief Loads a configuration of the ELS DTRNG.\r\n *\r\n * This function overwrites the default DTRNG configuration in order to optimize or fine tune the DTRNG entropy gathering process.\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n * Note that the TRNG configuration set by this function is non-persistent and any reset of the ELS (e.g. a power-cycle or calling #mcuxClEls_Reset_Async) will resets the DTRNG configuration to its default value.\r\n *\r\n * @if MCUXCL_FEATURE_ELS_SHA_DIRECT\r\n * It must be ensured that SHA-Direct mode is disabled when calling this function (see #mcuxClEls_ShaDirect_Disable).\r\n * @endif\r\n *\r\n * @param[in] pInput  The pointer to DTRNG initialization data\r\n *\r\n * <dl>\r\n *   <dt>Parameter properties</dt>\r\n *   <dd><dl>\r\n *     <dt>@p pInput </dt>\r\n *       <dd>The size is #MCUXCLELS_RNG_DTRNG_CONFIG_SIZE bytes.</dd>\r\n *   </dl></dd>\r\n * </dl>\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Rng_Dtrng_ConfigLoad_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Rng_Dtrng_ConfigLoad_Async(\r\n    uint8_t const * pInput\r\n    );\r\n\r\n\r\n/**\r\n * @brief Performs characterization of the ELS DTRNG.\r\n *\r\n * This function evaluates a DTRNG configuration for device specific characterization. The configuration used for characterization has to be placed in system memory.\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @attention If this function is called once, all other ELS commands except #mcuxClEls_Rng_Dtrng_ConfigEvaluate_Async are blocked until any reset of the ELS (e.g. a power-cycle or calling #mcuxClEls_Reset_Async) is triggered.\r\n *\r\n * @param[in]  pInput  The pointer to DTRNG initialization data\r\n * @param[out] pOutput The pointer to the evaluation result\r\n *\r\n * <dl>\r\n *   <dt>Parameter properties</dt>\r\n *   <dd><dl>\r\n *     <dt>@p pInput </dt>\r\n *       <dd>The size is #MCUXCLELS_RNG_DTRNG_EVAL_CONFIG_SIZE bytes.</dd>\r\n *     <dt>@p pOutput </dt>\r\n *       <dd>The size is #MCUXCLELS_RNG_DTRNG_EVAL_RESULT_SIZE bytes.</dd>\r\n *   </dl></dd>\r\n * </dl>\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Rng_Dtrng_ConfigEvaluate_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Rng_Dtrng_ConfigEvaluate_Async(\r\n    uint8_t const * pInput,\r\n    uint8_t * pOutput\r\n    );\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_PRND_INIT\r\n/**\r\n * @brief Initializes the ELS PRNG.\r\n *\r\n * This function initializes the PRNG. After this operation #mcuxClEls_HwState_t.drbgentlvl == #MCUXCLELS_STATUS_DRBGENTLVL_LOW. This can lead to a delay if the DRBG is in a state with lower security strength at the time of the call.\r\n *\r\n * Call #mcuxClEls_WaitForOperation to complete the operation.\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT if a running operation prevented the request\r\n * @retval #MCUXCLELS_STATUS_OK_WAIT             on successful request\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Prng_Init_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Prng_Init_Async(void);\r\n#endif /* MCUXCL_FEATURE_ELS_PRND_INIT */\r\n\r\n/**\r\n * @brief Returns one random word from the ELS PRNG.\r\n *\r\n * This function returns one low-quality random CPU word gathered from the PRNG.\r\n *\r\n * @attention PRNG has to be initialized prior to the first time calling this function.\r\n *\r\n * @param[out] pWord  The pointer to the random word\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_OK  on successful request\r\n * @retval #MCUXCLELS_STATUS_HW_PRNG in case of insufficient entropy\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Prng_GetRandomWord)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Prng_GetRandomWord(\r\n    uint32_t * pWord\r\n    );\r\n\r\n/**\r\n * @brief Writes random data from the ELS PRNG to the given buffer.\r\n *\r\n * This function fills a buffer with low-quality random values gathered from the PRNG.\r\n *\r\n * @attention PRNG has to be initialized prior to the first time calling this function.\r\n *\r\n * @param[out] pOutput       Pointer to the beginning of the memory area to fill with random data from PRNG\r\n * @param[in]  outputLength  Size of @p pOutput in bytes\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_OK  on successful request\r\n * @retval #MCUXCLELS_STATUS_HW_PRNG in case of insufficient entropy\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Prng_GetRandom)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Prng_GetRandom(\r\n    uint8_t * pOutput,\r\n    size_t outputLength\r\n    );\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_ITERATIVE_SEEDING\r\n/**\r\n * @brief This function checks if a DRBG reseeding is needed and if so reseeds the ELS DRBG.\r\n *\r\n * This function checks if the ELS DRBG needs to be reseeded by the DTRNG, and if so, executes the iterative seeding process.\r\n * The function internally disables ELS interrupts before (potentially) running the iterative seeding process and restores\r\n * the original ELS interrupt enable flags afterwards, before returning to the caller. This allows to properly use the function\r\n * in an ELS interrupt handler to reseed the ELS DRBG when needed.\r\n * \r\n * @param[in]  pDtrngConfig  Pointer to the beginning of the memory area which contains the ELS DTRNG config\r\n *\r\n * @if (MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER && MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL)\r\n *  @return A code-flow protected error code (see @ref mcuxCsslFlowProtection). The error code can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @else\r\n *  @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n * @endif\r\n * @retval #MCUXCLELS_STATUS_OK  on successful request\r\n * @retval #MCUXCLELS_STATUS_SW_FAULT in case the iterative seeding failed\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClEls_Dtrng_IterativeReseeding_CheckAndReseed)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Dtrng_IterativeReseeding_CheckAndReseed(const uint8_t *pDtrngConfig);\r\n#endif /* MCUXCL_FEATURE_ELS_ITERATIVE_SEEDING */\r\n\r\n/**\r\n * @}\r\n */ /* mcuxClEls_Rng_Functions */\r\n\r\n\r\n/**\r\n * @}\r\n */ /* mcuxClEls_Rng */\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLELS_RNG_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/inc/mcuxClEls_Types.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxClEls_Types.h\r\n * @brief ELS type header.\r\n *\r\n * This header defines types that are used by other mcuxClEls headers.\r\n */\r\n/**\r\n * @defgroup mcuxClEls_Types mcuxClEls_Types\r\n * @brief This part of the @ref mcuxClEls driver defines common types\r\n * @ingroup mcuxClEls\r\n * @{\r\n */\r\n#ifndef MCUXCLELS_TYPES_H_\r\n#define MCUXCLELS_TYPES_H_\r\n\r\n#include <stdint.h>\r\n#include <stddef.h>\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n#include <mcuxCsslFlowProtection.h>\r\n\r\n#include <mcuxClEls_mapping.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * MACROS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Types_Macros mcuxClEls_Types_Macros\r\n * @brief Defines all macros of @ref mcuxClEls_Types\r\n * @ingroup mcuxClEls_Types\r\n * @{\r\n */\r\n\r\n#define MCUXCLELS_KEY_SLOTS (20U) ///< Number of key slots in the ELS key store.\r\n\r\n/** @defgroup MCUXCLELS_KEYPROPERTY_VALUE_ MCUXCLELS_KEYPROPERTY_VALUE_\r\n * @brief Constants for initalizing #mcuxClEls_KeyProp_t.word\r\n * @ingroup mcuxClEls_Types_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_KEY_SIZE_128         ((uint32_t) 0u<< 0u) ///< 128-bit key\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_KEY_SIZE_256         ((uint32_t) 1u<< 0u) ///< 256-bit key\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_KEY_SIZE_512         ((uint32_t) 3u<< 0u) ///< 512-bit key\r\n#endif /* MCUXCL_FEATURE_ELS_PUK_INTERNAL */\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_ACTIVE               ((uint32_t) 1u<< 5u) ///< Key is active (loaded)\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_BASE_SLOT            ((uint32_t) 1u<< 6u) ///< First part of multi-slot key\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_GENERAL_PURPOSE_SLOT ((uint32_t) 1u<< 7u) ///< General purpose key slot\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_RETENTION_SLOT       ((uint32_t) 1u<< 8u) ///< Retention key slot\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_HW_OUT_SLOT          ((uint32_t) 1u<< 9u) ///< Hardware output key slot\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_PUK                  ((uint32_t) 1u<<11u) ///< Trusted Public Key\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_TECDH                ((uint32_t) 1u<<12u) ///< Private key that can only be used in ECDH with Trusted Public Key\r\n#endif /* MCUXCL_FEATURE_ELS_PUK_INTERNAL */\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_CMAC                 ((uint32_t) 1u<<13u) ///< CMAC key\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_KSK                  ((uint32_t) 1u<<14u) ///< Key signing key\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_RTF                  ((uint32_t) 1u<<15u) ///< RTF signing key\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_CKDF                 ((uint32_t) 1u<<16u) ///< CKDF signing key\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_HKDF                 ((uint32_t) 1u<<17u) ///< HKDF signing key\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_ECSGN                ((uint32_t) 1u<<18u) ///< ECC signing key\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_ECDH                 ((uint32_t) 1u<<19u) ///< ECC Diffie Hellman private key\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_AES                  ((uint32_t) 1u<<20u) ///< AES key\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_HMAC                 ((uint32_t) 1u<<21u) ///< HMAC key\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_KWK                  ((uint32_t) 1u<<22u) ///< Key Wrapping Key\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_KUOK                 ((uint32_t) 1u<<23u) ///< Key Unwrapping Only Key\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_TLS_PREMASTER_SECRET ((uint32_t) 1u<<24u) ///< TLS Premaster Secret\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_TLS_MASTER_SECRET    ((uint32_t) 1u<<25u) ///< TLS Master Secret\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_KGSRC                ((uint32_t) 1u<<26u) ///< Can provide key material input for ECC key generation\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_HW_OUT               ((uint32_t) 1u<<27u) ///< A key to be used in a hardware out key slot\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_WRPOK                ((uint32_t) 1u<<28u) ///< The key can be wrapped\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_DUK                  ((uint32_t) 1u<<29u) ///< Device Unique Key\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_PRIVILEGED           ((uint32_t) 1u<<30u) ///< Caller must be in privileged mode to use the key\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_NOTPRIVILEGED        ((uint32_t) 0u<<30u) ///< Caller does not have to be in privileged mode to use the key\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_SECURE               ((uint32_t) 0u<<31u) ///< Caller must be in secure mode to use the key\r\n#define MCUXCLELS_KEYPROPERTY_VALUE_NOTSECURE            ((uint32_t) 1u<<31u) ///< Caller does not have to be in secure mode to use the key\r\n/**\r\n * @}\r\n */\r\n\r\n/** @defgroup MCUXCLELS_KEYPROPERTY_ MCUXCLELS_KEYPROPERTY_\r\n * @brief Constants for initalizing #mcuxClEls_KeyProp_t.bits\r\n * @ingroup mcuxClEls_Types_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_KEYPROPERTY_KEY_SIZE_128               (0U) ///< This value of #mcuxClEls_KeyProp_t.ksize indicates a 128 bit key\r\n#define MCUXCLELS_KEYPROPERTY_KEY_SIZE_256               (1U) ///< This value of #mcuxClEls_KeyProp_t.ksize indicates a 256 bit key\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n#define MCUXCLELS_KEYPROPERTY_KEY_SIZE_512               (3U) ///< This value of #mcuxClEls_KeyProp_t.ksize indicates a 512 bit key\r\n#endif /* MCUXCL_FEATURE_ELS_PUK_INTERNAL */\r\n#define MCUXCLELS_KEYPROPERTY_ACTIVE_TRUE                (1U) ///< This value of #mcuxClEls_KeyProp_t.kactv indicates that the slot contains an active key\r\n#define MCUXCLELS_KEYPROPERTY_ACTIVE_FALSE               (0U) ///< This value of #mcuxClEls_KeyProp_t.kactv indicates that the slot does not contain active key\r\n#define MCUXCLELS_KEYPROPERTY_BASE_SLOT                  (1U) ///< This value of #mcuxClEls_KeyProp_t.kbase indicates that the slot is the base slot of a 2-slot key\r\n#define MCUXCLELS_KEYPROPERTY_SECOND_SLOT                (0U) ///< This value of #mcuxClEls_KeyProp_t.kbase indicates that the slot is the second slot of a 2-slot key\r\n#define MCUXCLELS_KEYPROPERTY_GENERAL_PURPOSE_SLOT_TRUE  (1U) ///< This value of #mcuxClEls_KeyProp_t.fgp indicates that the slot is a retention key slot or a hardware out key slot\r\n#define MCUXCLELS_KEYPROPERTY_GENERAL_PURPOSE_SLOT_FALSE (0U) ///< This value of #mcuxClEls_KeyProp_t.fgp indicates that the slot is a neither retention key slot nor hardware out key slot\r\n#define MCUXCLELS_KEYPROPERTY_RETENTION_SLOT_TRUE        (1U) ///< This value of #mcuxClEls_KeyProp_t.frtn indicates that the slot is a retention key slot\r\n#define MCUXCLELS_KEYPROPERTY_RETENTION_SLOT_FALSE       (0U) ///< This value of #mcuxClEls_KeyProp_t.frtn indicates that the slot is not a retention key slot\r\n#define MCUXCLELS_KEYPROPERTY_HW_OUT_SLOT_TRUE           (1U) ///< This value of #mcuxClEls_KeyProp_t.fhwo indicates that the slot is a hardware out key slot\r\n#define MCUXCLELS_KEYPROPERTY_HW_OUT_SLOT_FALSE          (0U) ///< This value of #mcuxClEls_KeyProp_t.fhwo indicates that the slot is not a hardware out key slot\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n#define MCUXCLELS_KEYPROPERTY_PUK_TRUE                   (1U) ///< This value of #mcuxClEls_KeyProp_t.upuk indicates that the slot is a Trusted Public Key\r\n#define MCUXCLELS_KEYPROPERTY_PUK_FALSE                  (0U) ///< This value of #mcuxClEls_KeyProp_t.upuk indicates that the slot is not a Trusted Public Key\r\n#define MCUXCLELS_KEYPROPERTY_TECDH_TRUE                 (1U) ///< This value of #mcuxClEls_KeyProp_t.utecdh indicates that the slot is a Private key that can only be used in ECDH with Trusted Public Key\r\n#define MCUXCLELS_KEYPROPERTY_TECDH_FALSE                (0U) ///< This value of #mcuxClEls_KeyProp_t.utecdh indicates that the slot is not a Private key that can only be used in ECDH with Trusted Public Key\r\n#endif /* MCUXCL_FEATURE_ELS_PUK_INTERNAL */\r\n#define MCUXCLELS_KEYPROPERTY_CMAC_TRUE                  (1U) ///< This value of #mcuxClEls_KeyProp_t.ucmac indicates that the key can be used for CMAC\r\n#define MCUXCLELS_KEYPROPERTY_CMAC_FALSE                 (0U) ///< This value of #mcuxClEls_KeyProp_t.ucmac indicates that the key cannot be used for CMAC\r\n#define MCUXCLELS_KEYPROPERTY_KSK_TRUE                   (1U) ///< This value of #mcuxClEls_KeyProp_t.uksk indicates that the key can be used for key signing\r\n#define MCUXCLELS_KEYPROPERTY_KSK_FALSE                  (0U) ///< This value of #mcuxClEls_KeyProp_t.uksk indicates that the key cannot be used for key signing\r\n#define MCUXCLELS_KEYPROPERTY_RTF_TRUE                   (1U) ///< This value of #mcuxClEls_KeyProp_t.urtf indicates that the key can be used for RTF signing\r\n#define MCUXCLELS_KEYPROPERTY_RTF_FALSE                  (0U) ///< This value of #mcuxClEls_KeyProp_t.urtf indicates that the key cannot be used for RTF signing\r\n#define MCUXCLELS_KEYPROPERTY_CKDF_TRUE                  (1U) ///< This value of #mcuxClEls_KeyProp_t.uckdf indicates that the key can be used for CKDF\r\n#define MCUXCLELS_KEYPROPERTY_CKDF_FALSE                 (0U) ///< This value of #mcuxClEls_KeyProp_t.uckdf indicates that the key cannot be used for CKDF\r\n#define MCUXCLELS_KEYPROPERTY_HKDF_TRUE                  (1U) ///< This value of #mcuxClEls_KeyProp_t.uhkdf indicates that the key can be used for HKDF\r\n#define MCUXCLELS_KEYPROPERTY_HKDF_FALSE                 (0U) ///< This value of #mcuxClEls_KeyProp_t.uhkdf indicates that the key cannot be used for HKDF\r\n#define MCUXCLELS_KEYPROPERTY_ECC_TRUE                   (1U) ///< This value of #mcuxClEls_KeyProp_t.uecsg indicates that the key can be used for ECC signing\r\n#define MCUXCLELS_KEYPROPERTY_ECC_FALSE                  (0U) ///< This value of #mcuxClEls_KeyProp_t.uecsg indicates that the key cannot be used for ECC signing\r\n#define MCUXCLELS_KEYPROPERTY_ECC_DH_PRIVATE_TRUE        (1U) ///< This value of #mcuxClEls_KeyProp_t.uecdh indicates that the key is a ECC Diffie Hellman private key\r\n#define MCUXCLELS_KEYPROPERTY_ECC_DH_PRIVATE_FALSE       (0U) ///< This value of #mcuxClEls_KeyProp_t.uecdh indicates that the key is not an ECC Diffie Hellman private key\r\n#define MCUXCLELS_KEYPROPERTY_AES_TRUE                   (1U) ///< This value of #mcuxClEls_KeyProp_t.uaes indicates that the key is an AES key\r\n#define MCUXCLELS_KEYPROPERTY_AES_FALSE                  (0U) ///< This value of #mcuxClEls_KeyProp_t.uaes indicates that the key is not an AES key\r\n#define MCUXCLELS_KEYPROPERTY_HMAC_TRUE                  (1U) ///< This value of #mcuxClEls_KeyProp_t.uhmac indicates that the key is an HMAC key\r\n#define MCUXCLELS_KEYPROPERTY_HMAC_FALSE                 (0U) ///< This value of #mcuxClEls_KeyProp_t.uhmac indicates that the key is not an HMAC key\r\n#define MCUXCLELS_KEYPROPERTY_KWK_TRUE                   (1U) ///< This value of #mcuxClEls_KeyProp_t.ukwk indicates that the key is a Key Wrapping Key\r\n#define MCUXCLELS_KEYPROPERTY_KWK_FALSE                  (0U) ///< This value of #mcuxClEls_KeyProp_t.ukwk indicates that the key is not a Key Wrapping Key\r\n#define MCUXCLELS_KEYPROPERTY_KUOK_TRUE                  (1U) ///< This value of #mcuxClEls_KeyProp_t.ukuok indicates that the key is a Key Unwrapping Only Key\r\n#define MCUXCLELS_KEYPROPERTY_KUOK_FALSE                 (0U) ///< This value of #mcuxClEls_KeyProp_t.ukuok indicates that the key is not a Key Unwrapping Only Key\r\n#define MCUXCLELS_KEYPROPERTY_TLS_PREMASTER_SECRET_TRUE  (1U) ///< This value of #mcuxClEls_KeyProp_t.utlspms indicates that the key is a TLS Premaster Secret\r\n#define MCUXCLELS_KEYPROPERTY_TLS_PREMASTER_SECRET_FALSE (0U) ///< This value of #mcuxClEls_KeyProp_t.utlspms indicates that the key is not a TLS Premaster Secret\r\n#define MCUXCLELS_KEYPROPERTY_TLS_MASTER_SECRET_TRUE     (1U) ///< This value of #mcuxClEls_KeyProp_t.utlsms indicates that the key is a TLS Master Secret\r\n#define MCUXCLELS_KEYPROPERTY_TLS_MASTER_SECRET_FALSE    (0U) ///< This value of #mcuxClEls_KeyProp_t.utlsms indicates that the key is not a TLS Master Secret\r\n#define MCUXCLELS_KEYPROPERTY_INPUT_FOR_ECC_TRUE         (1U) ///< This value of #mcuxClEls_KeyProp_t.ukgsrc indicates that the key can be used as key material input for ECC key generation\r\n#define MCUXCLELS_KEYPROPERTY_INPUT_FOR_ECC_FALSE        (0U) ///< This value of #mcuxClEls_KeyProp_t.ukgsrc indicates that the key cannot be used as key material input for ECC key generation\r\n#define MCUXCLELS_KEYPROPERTY_HW_OUT_TRUE                (1U) ///< This value of #mcuxClEls_KeyProp_t.uhwo indicates that the key can be used in a hardware out key slot\r\n#define MCUXCLELS_KEYPROPERTY_HW_OUT_FALSE               (0U) ///< This value of #mcuxClEls_KeyProp_t.uhwo indicates that the key cannot be used in a hardware out key slot\r\n#define MCUXCLELS_KEYPROPERTY_WRAP_TRUE                  (1U) ///< This value of #mcuxClEls_KeyProp_t.wrpok indicates that the key can be wrapped\r\n#define MCUXCLELS_KEYPROPERTY_WRAP_FALSE                 (0U) ///< This value of #mcuxClEls_KeyProp_t.wrpok indicates that the key cannot be wrapped\r\n#define MCUXCLELS_KEYPROPERTY_DEVICE_UNIQUE_TRUE         (1U) ///< This value of #mcuxClEls_KeyProp_t.duk indicates that the key is a Device Unique Key\r\n#define MCUXCLELS_KEYPROPERTY_DEVICE_UNIQUE_FALSE        (0U) ///< This value of #mcuxClEls_KeyProp_t.duk indicates that the key is not a Device Unique Key\r\n#define MCUXCLELS_KEYPROPERTY_PRIVILEGED_TRUE            (1U) ///< This value of #mcuxClEls_KeyProp_t.upprot_priv indicates that the caller must be in privileged mode to use the key\r\n#define MCUXCLELS_KEYPROPERTY_PRIVILEGED_FALSE           (0U) ///< This value of #mcuxClEls_KeyProp_t.upprot_priv indicates that the caller does not need to be in privileged mode to use the key\r\n#define MCUXCLELS_KEYPROPERTY_SECURE_TRUE                (0U) ///< This value of #mcuxClEls_KeyProp_t.upprot_sec indicates that the caller must be in secure mode to use the key\r\n#define MCUXCLELS_KEYPROPERTY_SECURE_FALSE               (1U) ///< This value of #mcuxClEls_KeyProp_t.upprot_sec indicates that the caller does not need to be in secure mode to use the key\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @defgroup MCUXCLELS_STATUS_ MCUXCLELS_STATUS_\r\n * @brief Return code definitions\r\n * @ingroup mcuxClEls_Types_Macros\r\n * @{\r\n */\r\n#define MCUXCLELS_STATUS_OK                   ((mcuxClEls_Status_t) 0x05552E03u) ///< No error occurred\r\n#define MCUXCLELS_STATUS_OK_WAIT              ((mcuxClEls_Status_t) 0x05552E07u) ///< An <tt>_Async</tt> function successfully started an ELS command. Call #mcuxClEls_WaitForOperation to complete it\r\n#define MCUXCLELS_STATUS_HW_FAULT             ((mcuxClEls_Status_t) 0x05555330u) ///< ELS hardware detected a fault\r\n#define MCUXCLELS_STATUS_HW_ALGORITHM         ((mcuxClEls_Status_t) 0x05555334u) ///< An algorithm failed in hardware\r\n#define MCUXCLELS_STATUS_HW_OPERATIONAL       ((mcuxClEls_Status_t) 0x05555338u) ///< ELS was operated incorrectly\r\n#define MCUXCLELS_STATUS_HW_BUS               ((mcuxClEls_Status_t) 0x0555533Cu) ///< A bus access failed\r\n#define MCUXCLELS_STATUS_HW_INTEGRITY         ((mcuxClEls_Status_t) 0x05555370u) ///< An integrity check failed in hardware\r\n#define MCUXCLELS_STATUS_HW_PRNG              ((mcuxClEls_Status_t) 0x05555374u) ///< Read access to PRNG output while PRNG is not in ready state\r\n#define MCUXCLELS_STATUS_HW_DTRNG             ((mcuxClEls_Status_t) 0x05555378u) ///< Unable to get entropy from dTRNG with current configuration\r\n#define MCUXCLELS_STATUS_SW_FAULT             ((mcuxClEls_Status_t) 0x0555F0F0u) ///< Software detected a fault\r\n#define MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT  ((mcuxClEls_Status_t) 0x055553B0u) ///< an ELS command was started while the ELS was still busy, or a SHA-Direct command was started while the SHA kernel was still busy\r\n#define MCUXCLELS_STATUS_SW_INVALID_PARAM     ((mcuxClEls_Status_t) 0x055553F8u) ///< Incorrect parameters were supplied\r\n#define MCUXCLELS_STATUS_SW_INVALID_STATE     ((mcuxClEls_Status_t) 0x055553B8u) ///< This can happen when ELS is in a wrong state for the requested ELS command\r\n#define MCUXCLELS_STATUS_SW_COUNTER_EXPIRED   ((mcuxClEls_Status_t) 0x055553BCu) ///< A software counter expired while waiting for an ELS operation to finish\r\n#define MCUXCLELS_STATUS_SW_COMPARISON_FAILED ((mcuxClEls_Status_t) 0x05558930u) ///< A comparison between an ELS flag and its expected value failed\r\n#ifdef MCUXCL_FEATURE_ELS_LOCKING\r\n#define MCUXCLELS_STATUS_SW_LOCKING_FAILED    ((mcuxClEls_Status_t) 0x055553F4u) ///< Unable to obtain ELS lock\r\n#define MCUXCLELS_STATUS_SW_STATUS_LOCKED     ((mcuxClEls_Status_t) 0x05552E0Bu) ///< ELS status is locked\r\n#endif /* MCUXCL_FEATURE_ELS_LOCKING */\r\n/** @} */\r\n\r\n#define MCUXCLELS_STATUS_IS_HW_ERROR(x_) ((((mcuxClEls_Status_t) (x_)) & 0x0000FF00U) == 0x0000E100U) ///< Checks whether an error code is a hardware error. Indicates that an error was reported by ELS hardware.\r\n\r\n#define MCUXCLELS_STATUS_IS_SW_ERROR(x_) ((((mcuxClEls_Status_t) (x_)) & 0x0000FF00U) == 0x0000F000U) ///< Checks whether an error code is a software error. Indicates that the error was detected by the driver software and not by ELS hardware.\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n/**********************************************\r\n * TYPEDEFS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClEls_Types_Types mcuxClEls_Types_Types\r\n * @brief Defines all types of @ref mcuxClEls_Types\r\n * @ingroup mcuxClEls_Types\r\n * @{\r\n */\r\n/**\r\n * @brief Type for ELS driver status codes\r\n */\r\ntypedef uint32_t mcuxClEls_Status_t;\r\n\r\n/**\r\n * @brief Deprecated type for ELS driver protected status codes\r\n */\r\ntypedef MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Status_Protected_t;\r\n\r\n/**\r\n * @brief Type for ELS keystore indices\r\n */\r\ntypedef uint32_t mcuxClEls_KeyIndex_t;\r\n\r\n/** Type for ELS key store key properties */\r\ntypedef union\r\n{\r\n    struct\r\n    {\r\n        uint32_t value;          ///< Accesses the bit field as a full word; initialize with a combination of constants from @ref MCUXCLELS_KEYPROPERTY_VALUE_\r\n    } word;                      ///< Access #mcuxClEls_KeyProp_t word-wise\r\n    struct\r\n    {\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n        uint32_t ksize :2;       ///< Key size\r\n        uint32_t :3;             ///< RFU\r\n#else\r\n        uint32_t ksize :1;       ///< Key size\r\n        uint32_t :4;             ///< RFU\r\n#endif\r\n        uint32_t kactv :1;       ///< Status flag to indicate whether the key slot contains an active key or not\r\n        uint32_t kbase :1;       ///< Status flag to indicate whether the key slot is a base slot or the second slot of a 256-bit key\r\n        uint32_t fgp :1;         ///< Hardware feature flag: General purpose key slot\r\n        uint32_t frtn :1;        ///< Hardware feature flag: Retention key slot\r\n        uint32_t fhwo :1;        ///< Hardware feature flag: Hardware-out key slot\r\n#ifdef MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n        uint32_t :1;             ///< RFU\r\n        uint32_t upuk :1;        ///< Usage permission for Trusted Public Key\r\n        uint32_t utecdh :1;      ///< Usage permission for Private key that can only be used in ECDH with Trusted Public Key\r\n#else\r\n        uint32_t :3;             ///< RFU\r\n#endif /* MCUXCL_FEATURE_ELS_PUK_INTERNAL */\r\n        uint32_t ucmac :1;       ///< Usage permission for CMAC\r\n        uint32_t uksk :1;        ///< Usage permission for key signing\r\n        uint32_t urtf :1;        ///< Usage permission for RTF signing\r\n        uint32_t uckdf :1;       ///< Usage permission for CKDF\r\n        uint32_t uhkdf :1;       ///< Usage permission for HKDF\r\n        uint32_t uecsg :1;       ///< Usage permission for ECDSA signing\r\n        uint32_t uecdh :1;       ///< Usage permission for Elliptic Curve Diffie-Hellman\r\n        uint32_t uaes :1;        ///< Usage permission for AES\r\n        uint32_t uhmac :1;       ///< Usage permission for HMAC\r\n        uint32_t ukwk :1;        ///< Usage permission for key wrapping\r\n        uint32_t ukuok :1;       ///< Usage permission for key unwrapping, but not for key wrapping\r\n        uint32_t utlspms :1;     ///< Usage permission as a TLS premaster secret\r\n        uint32_t utlsms :1;      ///< Usage permission as a TLS master secret\r\n        uint32_t ukgsrc :1;      ///< Usage permission as input for ECC key generation\r\n        uint32_t uhwo :1;        ///< Usage permission in a hardware-out key slot\r\n        uint32_t wrpok :1;       ///< Usage permission to wrap\r\n        uint32_t duk :1;         ///< Device-unique key flag\r\n        uint32_t upprot_priv :1; ///< Access restriction to privileged mode\r\n        uint32_t upprot_sec :1;  ///< Access restriction to TrustZone secure mode\r\n    } bits;                      ///< Access #mcuxClEls_KeyProp_t bit-wise\r\n} mcuxClEls_KeyProp_t;\r\n\r\n\r\n#define utlpsms utlspms ///< Deprecated name for #mcuxClEls_KeyProp_t.utlspms\r\n\r\n/**\r\n * @brief Function type for transfer of data to a memory-mapped register\r\n *\r\n * This function type is used as a callback for handling data transfer from memory to a memory-mapped register.\r\n * Such a function shall read data from the @c uint8_t array source, and write data via a sequence of writes to @p destRegister.\r\n * Further specification of this function's behavior can be found in the documentation of the function that accepts this function as a callback parameter.\r\n * \r\n * @param [out] pDestRegister  Memory-mapped register that the output data shall be written to\r\n * @param [in]  pSource        Array containing the input data\r\n * @param [in]  sourceLength   Size of @p source in bytes\r\n * @param [in, out] pCallerData   Custom pointer that is provided by the caller and forwarded to the callback function by the operation\r\n * @return An error code that can be any error code in @ref MCUXCLELS_STATUS_, see individual documentation for more information\r\n */\r\ntypedef mcuxClEls_Status_t (*mcuxClEls_TransferToRegisterFunction_t)(\r\n    uint32_t volatile * pDestRegister,\r\n    uint8_t const * pSource,\r\n    size_t sourceLength,\r\n    void * pCallerData);\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLELS_TYPES_H_ */\r\n\r\n/**\r\n * @}\r\n *\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/inc/mcuxClEls_mapping.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2022 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxClEls_mapping.h\r\n * @brief Header providing mapping for legacy function/definition names (with CSS)\r\n */\r\n\r\n\r\n#ifndef MCUXCLELS_MAPPING_H_\r\n#define MCUXCLELS_MAPPING_H_\r\n\r\n/* Public definitions */\r\n/**\r\n * MCUXCLCSS_CSS_((?:INTERRUPT_DISABLE|INTERRUPT_ENABLE|INTERRUPT_KEEP|INTERRUPT_SET|RESET_CLEAR|RESET_KEEP))(?!\\w)\r\n * -->\r\n * MCUXCLELS_ELS_\\1\r\n *\r\n * MCUXCLCSS_((?:API|AEAD_AAD_BLOCK_SIZE|AEAD_ACPMOD_AADPROC|AEAD_ACPMOD_FINAL|AEAD_ACPMOD_INIT|AEAD_ACPMOD_MSGPROC|AEAD_CONTEXT_SIZE|AEAD_DECRYPT|AEAD_ENCRYPT|AEAD_EXTERN_KEY|AEAD_INTERN_KEY|AEAD_IV_BLOCK_SIZE|AEAD_LASTINIT_FALSE|AEAD_LASTINIT_TRUE|AEAD_STATE_IN_DISABLE|AEAD_STATE_IN_ENABLE|AEAD_STATE_OUT_ENABLE|AEAD_TAG_SIZE|CIPHERPARAM_ALGORITHM_AES_CBC|CIPHERPARAM_ALGORITHM_AES_CTR|CIPHERPARAM_ALGORITHM_AES_ECB|CIPHER_BLOCK_SIZE_AES|CIPHER_DECRYPT|CIPHER_ENCRYPT|CIPHER_EXTERNAL_KEY|CIPHER_INTERNAL_KEY|CIPHER_KEY_SIZE_AES_128|CIPHER_KEY_SIZE_AES_192|CIPHER_KEY_SIZE_AES_256|CIPHER_STATE_IN_DISABLE|CIPHER_STATE_IN_ENABLE|CIPHER_STATE_OUT_DISABLE|CIPHER_STATE_OUT_ENABLE|CKDF_ALGO_SP800108|CKDF_ALGO_SP80056C_EXPAND|CKDF_ALGO_SP80056C_EXTRACT|CKDF_DERIVATIONDATA_SIZE|CKDF_RTF_DERIV|CKDF_SP80056C_DERIVATIONDATA_SIZE_16|CKDF_SP80056C_DERIVATIONDATA_SIZE_32|CKDF_SYSTEM_MEMORY_DERIV|CMAC_EXTERNAL_KEY_DISABLE|CMAC_EXTERNAL_KEY_ENABLE|CMAC_FINALIZE_DISABLE|CMAC_FINALIZE_ENABLE|CMAC_INITIALIZE_DISABLE|CMAC_INITIALIZE_ENABLE|CMAC_KEY_SIZE_128|CMAC_KEY_SIZE_256|CMAC_OUT_SIZE))(?!\\w)\r\n * MCUXCLCSS_((?:CMD_CRC_CMD_ID_AUTH_CIPHER|CMD_CRC_CMD_ID_CHAL_RESP_GEN|CMD_CRC_CMD_ID_CIPHER|CMD_CRC_CMD_ID_CKDF|CMD_CRC_CMD_ID_CMAC|CMD_CRC_CMD_ID_DRBG_TEST|CMD_CRC_CMD_ID_DTRNG_CFG_LOAD|CMD_CRC_CMD_ID_DTRNG_EVAL|CMD_CRC_CMD_ID_ECKXH|CMD_CRC_CMD_ID_ECSIGN|CMD_CRC_CMD_ID_ECVFY|CMD_CRC_CMD_ID_GDET_CFG_LOAD|CMD_CRC_CMD_ID_GDET_TRIM|CMD_CRC_CMD_ID_HASH|CMD_CRC_CMD_ID_HKDF|CMD_CRC_CMD_ID_HMAC|CMD_CRC_CMD_ID_KDELETE|CMD_CRC_CMD_ID_KEYGEN|CMD_CRC_CMD_ID_KEYIN|CMD_CRC_CMD_ID_KEYOUT|CMD_CRC_CMD_ID_KEYPROV|CMD_CRC_CMD_ID_RND_REQ|CMD_CRC_CMD_ID_TLS|CMD_CRC_DISABLE|CMD_CRC_ENABLE|CMD_CRC_INITIAL_VALUE|CMD_CRC_POLYNOMIAL|CMD_CRC_REFERENCE_INIT|CMD_CRC_REFERENCE_RESET|CMD_CRC_REFERENCE_UPDATE_AEAD_FINALIZE|CMD_CRC_REFERENCE_UPDATE_AEAD_INIT|CMD_CRC_REFERENCE_UPDATE_AEAD_PARTIALINIT|CMD_CRC_REFERENCE_UPDATE_AEAD_UPDATEAAD|CMD_CRC_REFERENCE_UPDATE_AEAD_UPDATEDATA|CMD_CRC_REFERENCE_UPDATE_CIPHER|CMD_CRC_REFERENCE_UPDATE_CKDF_SP800108|CMD_CRC_REFERENCE_UPDATE_CKDF_SP80056C_EXPAND|CMD_CRC_REFERENCE_UPDATE_CKDF_SP80056C_EXTRACT|CMD_CRC_REFERENCE_UPDATE_CMAC))(?!\\w)\r\n * MCUXCLCSS_((?:CMD_CRC_REFERENCE_UPDATE_ECCKEYEXCHANGE|CMD_CRC_REFERENCE_UPDATE_ECCKEYEXCHANGEINT|CMD_CRC_REFERENCE_UPDATE_ECCKEYGEN|CMD_CRC_REFERENCE_UPDATE_ECCSIGN|CMD_CRC_REFERENCE_UPDATE_ECCVERFIFY|CMD_CRC_REFERENCE_UPDATE_ECCVERFIFYINT|CMD_CRC_REFERENCE_UPDATE_GLITCHDETECTOR_LOADCONFIG|CMD_CRC_REFERENCE_UPDATE_GLITCHDETECTOR_TRIM|CMD_CRC_REFERENCE_UPDATE_HASH|CMD_CRC_REFERENCE_UPDATE_HKDF_RFC5869|CMD_CRC_REFERENCE_UPDATE_HKDF_SP80056C|CMD_CRC_REFERENCE_UPDATE_HMAC|CMD_CRC_REFERENCE_UPDATE_KEYDELETE|CMD_CRC_REFERENCE_UPDATE_KEYEXPORT|CMD_CRC_REFERENCE_UPDATE_KEYIMPORT|CMD_CRC_REFERENCE_UPDATE_KEYIMPORTPUK|CMD_CRC_REFERENCE_UPDATE_KEYPROVISION|CMD_CRC_REFERENCE_UPDATE_KEYPROVISIONROM|CMD_CRC_REFERENCE_UPDATE_PRNG_INIT|CMD_CRC_REFERENCE_UPDATE_RESPGEN|CMD_CRC_REFERENCE_UPDATE_RNG_DRBGREQUEST|CMD_CRC_REFERENCE_UPDATE_RNG_DRBGREQUESTRAW|CMD_CRC_REFERENCE_UPDATE_RNG_DRBGTESTAESCTR|CMD_CRC_REFERENCE_UPDATE_RNG_DRBGTESTAESECB|CMD_CRC_REFERENCE_UPDATE_RNG_DRBGTESTEXTRACT|CMD_CRC_REFERENCE_UPDATE_RNG_DRBGTESTINSTANTIATE|CMD_CRC_REFERENCE_UPDATE_RNG_DTRNG_CONFIGEVALUATE))(?!\\w)\r\n * MCUXCLCSS_((?:CMD_CRC_REFERENCE_UPDATE_RNG_DTRNG_CONFIGLOAD|CMD_CRC_REFERENCE_UPDATE_TLSGENERATEMASTERKEYFROMPREMASTERKEY|CMD_CRC_REFERENCE_UPDATE_TLSGENERATESESSIONKEYSFROMMASTERKEY|CMD_CRC_RESET|CMD_CRC_VALUE_DISABLE|CMD_CRC_VALUE_ENABLE|CMD_CRC_VALUE_RESET|DMA_READBACK_PROTECTION_TOKEN|ECC_EXTKEY_EXTERNAL|ECC_EXTKEY_INTERNAL|ECC_GEN_PUBLIC_KEY|ECC_HASHED|ECC_INCLUDE_RANDOM_DATA|ECC_NOT_HASHED|ECC_NO_RANDOM_DATA|ECC_NO_RTF|ECC_OUTPUTKEY_DETERMINISTIC|ECC_OUTPUTKEY_KEYEXCHANGE|ECC_OUTPUTKEY_RANDOM|ECC_OUTPUTKEY_SIGN|ECC_PUBLICKEY_SIGN_DISABLE|ECC_PUBLICKEY_SIGN_ENABLE|ECC_PUBLICKEY_SIZE|ECC_REVERSEFETCH_DISABLE|ECC_REVERSEFETCH_ENABLE|ECC_RTF|ECC_SIGNATURE_R_SIZE|ECC_SIGNATURE_SIZE|ECC_SKIP_PUBLIC_KEY|ECC_VALUE_HASHED|ECC_VALUE_NOT_HASHED|ECC_VALUE_NO_RTF|ECC_VALUE_RTF|ERROR_FLAGS_CLEAR|ERROR_FLAGS_KEEP|GLITCHDETECTOR_CFG_SIZE|GLITCHDETECTOR_TRIM_SIZE|GLITCH_DETECTOR_INTERRUPT_DISABLE|GLITCH_DETECTOR_INTERRUPT_ENABLE|GLITCH_DETECTOR_NEG_KEEP))(?!\\w)\r\n * MCUXCLCSS_((?:GLITCH_DETECTOR_NEG_SET|GLITCH_DETECTOR_POS_KEEP|GLITCH_DETECTOR_POS_SET|GLITCH_DETECTOR_RESET_CLEAR|GLITCH_DETECTOR_RESET_KEEP|HASH_BLOCK_SIZE_SHA_224|HASH_BLOCK_SIZE_SHA_256|HASH_BLOCK_SIZE_SHA_384|HASH_BLOCK_SIZE_SHA_512|HASH_INIT_DISABLE|HASH_INIT_ENABLE|HASH_LOAD_DISABLE|HASH_LOAD_ENABLE|HASH_MODE_SHA_224|HASH_MODE_SHA_256|HASH_MODE_SHA_384|HASH_MODE_SHA_512|HASH_OUTPUT_DISABLE|HASH_OUTPUT_ENABLE|HASH_OUTPUT_SIZE_SHA_224|HASH_OUTPUT_SIZE_SHA_256|HASH_OUTPUT_SIZE_SHA_384|HASH_OUTPUT_SIZE_SHA_512|HASH_RTF_OUTPUT_DISABLE|HASH_RTF_OUTPUT_ENABLE|HASH_RTF_OUTPUT_SIZE|HASH_RTF_UPDATE_DISABLE|HASH_RTF_UPDATE_ENABLE|HASH_STATE_SIZE_SHA_224|HASH_STATE_SIZE_SHA_256|HASH_STATE_SIZE_SHA_384|HASH_STATE_SIZE_SHA_512|HASH_VALUE_MODE_SHA_224|HASH_VALUE_MODE_SHA_256|HASH_VALUE_MODE_SHA_384|HASH_VALUE_MODE_SHA_512|HKDF_ALGO_RFC5869|HKDF_ALGO_SP80056C|HKDF_RFC5869_DERIVATIONDATA_SIZE|HKDF_SP80056C_TARGETKEY_SIZE|HKDF_VALUE_MEMORY_DERIV|HKDF_VALUE_RTF_DERIV|HMAC_EXTERNAL_KEY_DISABLE|HMAC_EXTERNAL_KEY_ENABLE|HMAC_OUTPUT_SIZE|HMAC_PADDED_KEY_SIZE|HW_VERSION))(?!\\w)\r\n * MCUXCLCSS_((?:KEYGEN_VALUE_DETERMINISTIC|KEYGEN_VALUE_GEN_PUB_KEY|KEYGEN_VALUE_NO_PUB_KEY|KEYGEN_VALUE_NO_RANDOM_DATA|KEYGEN_VALUE_RANDOM|KEYGEN_VALUE_SIGN_PUBLICKEY|KEYGEN_VALUE_TYPE_KEYEXCHANGE|KEYGEN_VALUE_TYPE_SIGN|KEYGEN_VALUE_USE_RANDOM_DATA|KEYIMPORT_KFMT_PBK|KEYIMPORT_KFMT_PUF|KEYIMPORT_KFMT_RFC3394|KEYIMPORT_KFMT_UDF|KEYIMPORT_REVERSEFETCH_DISABLE|KEYIMPORT_REVERSEFETCH_ENABLE|KEYIMPORT_VALUE_KFMT_PBK|KEYIMPORT_VALUE_KFMT_PUF|KEYIMPORT_VALUE_KFMT_RFC3394|KEYIMPORT_VALUE_KFMT_UDF|KEYPROPERTY_ACTIVE_FALSE|KEYPROPERTY_ACTIVE_TRUE|KEYPROPERTY_AES_FALSE|KEYPROPERTY_AES_TRUE|KEYPROPERTY_BASE_SLOT|KEYPROPERTY_CKDF_FALSE|KEYPROPERTY_CKDF_TRUE|KEYPROPERTY_CMAC_FALSE|KEYPROPERTY_CMAC_TRUE|KEYPROPERTY_DEVICE_UNIQUE_FALSE|KEYPROPERTY_DEVICE_UNIQUE_TRUE|KEYPROPERTY_ECC_DH_PRIVATE_FALSE|KEYPROPERTY_ECC_DH_PRIVATE_TRUE|KEYPROPERTY_ECC_FALSE|KEYPROPERTY_ECC_TRUE|KEYPROPERTY_GENERAL_PURPOSE_SLOT_FALSE|KEYPROPERTY_GENERAL_PURPOSE_SLOT_TRUE|KEYPROPERTY_HKDF_FALSE|KEYPROPERTY_HKDF_TRUE|KEYPROPERTY_HMAC_FALSE|KEYPROPERTY_HMAC_TRUE|KEYPROPERTY_HW_OUT_FALSE|KEYPROPERTY_HW_OUT_SLOT_FALSE))(?!\\w)\r\n * MCUXCLCSS_((?:KEYPROPERTY_HW_OUT_SLOT_TRUE|KEYPROPERTY_HW_OUT_TRUE|KEYPROPERTY_INPUT_FOR_ECC_FALSE|KEYPROPERTY_INPUT_FOR_ECC_TRUE|KEYPROPERTY_KEY_SIZE_128|KEYPROPERTY_KEY_SIZE_256|KEYPROPERTY_KEY_SIZE_512|KEYPROPERTY_KSK_FALSE|KEYPROPERTY_KSK_TRUE|KEYPROPERTY_KUOK_FALSE|KEYPROPERTY_KUOK_TRUE|KEYPROPERTY_KWK_FALSE|KEYPROPERTY_KWK_TRUE|KEYPROPERTY_PRIVILEGED_FALSE|KEYPROPERTY_PRIVILEGED_TRUE|KEYPROPERTY_PUK_FALSE|KEYPROPERTY_PUK_TRUE|KEYPROPERTY_RETENTION_SLOT_FALSE|KEYPROPERTY_RETENTION_SLOT_TRUE|KEYPROPERTY_RTF_FALSE|KEYPROPERTY_RTF_TRUE|KEYPROPERTY_SECOND_SLOT|KEYPROPERTY_SECURE_FALSE|KEYPROPERTY_SECURE_TRUE|KEYPROPERTY_TECDH_FALSE|KEYPROPERTY_TECDH_TRUE|KEYPROPERTY_TLS_MASTER_SECRET_FALSE|KEYPROPERTY_TLS_MASTER_SECRET_TRUE|KEYPROPERTY_TLS_PREMASTER_SECRET_FALSE|KEYPROPERTY_TLS_PREMASTER_SECRET_TRUE|KEYPROPERTY_VALUE_ACTIVE|KEYPROPERTY_VALUE_AES|KEYPROPERTY_VALUE_BASE_SLOT|KEYPROPERTY_VALUE_CKDF|KEYPROPERTY_VALUE_CMAC|KEYPROPERTY_VALUE_DUK|KEYPROPERTY_VALUE_ECDH|KEYPROPERTY_VALUE_ECSGN|KEYPROPERTY_VALUE_GENERAL_PURPOSE_SLOT|KEYPROPERTY_VALUE_HKDF|KEYPROPERTY_VALUE_HMAC))(?!\\w)\r\n * MCUXCLCSS_((?:KEYPROPERTY_VALUE_HW_OUT|KEYPROPERTY_VALUE_HW_OUT_SLOT|KEYPROPERTY_VALUE_KEY_SIZE_128|KEYPROPERTY_VALUE_KEY_SIZE_256|KEYPROPERTY_VALUE_KEY_SIZE_512|KEYPROPERTY_VALUE_KGSRC|KEYPROPERTY_VALUE_KSK|KEYPROPERTY_VALUE_KUOK|KEYPROPERTY_VALUE_KWK|KEYPROPERTY_VALUE_NOTPRIVILEGED|KEYPROPERTY_VALUE_NOTSECURE|KEYPROPERTY_VALUE_PRIVILEGED|KEYPROPERTY_VALUE_PUK|KEYPROPERTY_VALUE_RETENTION_SLOT|KEYPROPERTY_VALUE_RTF|KEYPROPERTY_VALUE_SECURE|KEYPROPERTY_VALUE_TECDH|KEYPROPERTY_VALUE_TLS_MASTER_SECRET|KEYPROPERTY_VALUE_TLS_PREMASTER_SECRET|KEYPROPERTY_VALUE_WRPOK|KEYPROPERTY_WRAP_FALSE|KEYPROPERTY_WRAP_TRUE|KEYPROV_DUK_UPDATE_DISABLE|KEYPROV_DUK_UPDATE_ENABLE|KEYPROV_KEYSHARE_TABLE_SIZE|KEYPROV_KEY_PART_1_SIZE|KEYPROV_NOIC_DISABLE|KEYPROV_NOIC_ENABLE|KEYPROV_TESTERSHARE_SIZE|KEYPROV_VALUE_NOIC|KEY_SLOTS|MASTER_UNLOCK_ANY|RESET_CANCEL|RESET_DO_NOT_CANCEL|RESP_GEN_AVAILABLE_SLOT_0|RESP_GEN_AVAILABLE_SLOT_1|RESP_GEN_AVAILABLE_SLOT_2|RESP_GEN_SLOTS|RFC3394_CONTAINER_SIZE_128|RFC3394_CONTAINER_SIZE_256|RFC3394_CONTAINER_SIZE_P256|RFC3394_OVERHEAD|RNG_DRBG_TEST_EXTRACT_OUTPUT_MAX_SIZE))(?!\\w)\r\n * MCUXCLCSS_((?:RNG_DRBG_TEST_EXTRACT_OUTPUT_MIN_SIZE|RNG_DRBG_TEST_MODE_AES_CTR|RNG_DRBG_TEST_MODE_AES_ECB|RNG_DRBG_TEST_MODE_EXTRACT|RNG_DRBG_TEST_MODE_INSTANTIATE|RNG_DTRNG_CONFIG_SIZE|RNG_DTRNG_EVAL_CONFIG_SIZE|RNG_DTRNG_EVAL_RESULT_SIZE|RNG_RAW_ENTROPY_SIZE|RNG_RND_REQ_PRND_INIT|RNG_RND_REQ_RND_RAW|STATUS_DRBGENTLVL_HIGH|STATUS_DRBGENTLVL_LOW|STATUS_DRBGENTLVL_NONE|STATUS_ECDSAVFY_ERROR|STATUS_ECDSAVFY_FAIL|STATUS_ECDSAVFY_NORUN|STATUS_ECDSAVFY_OK|STATUS_HW_ALGORITHM|STATUS_HW_BUS|STATUS_HW_DTRNG|STATUS_HW_FAULT|STATUS_HW_INTEGRITY|STATUS_HW_OPERATIONAL|STATUS_HW_PRNG|STATUS_IS_HW_ERROR|STATUS_IS_SW_ERROR|STATUS_OK|STATUS_OK_WAIT|STATUS_PPROT_PRIVILEGED_NONSECURE|STATUS_PPROT_PRIVILEGED_SECURE|STATUS_PPROT_UNPRIVILEGED_NONSECURE|STATUS_PPROT_UNPRIVILEGED_SECURE|STATUS_SW_CANNOT_INTERRUPT|STATUS_SW_COMPARISON_FAILED|STATUS_SW_COUNTER_EXPIRED|STATUS_SW_FAULT|STATUS_SW_INVALID_PARAM|STATUS_SW_INVALID_STATE|STATUS_SW_LOCKING_FAILED|STATUS_SW_STATUS_LOCKED|TLS_DERIVATIONDATA_SIZE|TLS_FINALIZE|TLS_INIT|TLS_RANDOM_SIZE))(?!\\w)\r\n * -->\r\n * MCUXCLELS_\\1\r\n */\r\n#define MCUXCLCSS_API  MCUXCLELS_API\r\n#define MCUXCLCSS_AEAD_AAD_BLOCK_SIZE  MCUXCLELS_AEAD_AAD_BLOCK_SIZE\r\n#define MCUXCLCSS_AEAD_ACPMOD_AADPROC  MCUXCLELS_AEAD_ACPMOD_AADPROC\r\n#define MCUXCLCSS_AEAD_ACPMOD_FINAL  MCUXCLELS_AEAD_ACPMOD_FINAL\r\n#define MCUXCLCSS_AEAD_ACPMOD_INIT  MCUXCLELS_AEAD_ACPMOD_INIT\r\n#define MCUXCLCSS_AEAD_ACPMOD_MSGPROC  MCUXCLELS_AEAD_ACPMOD_MSGPROC\r\n#define MCUXCLCSS_AEAD_CONTEXT_SIZE  MCUXCLELS_AEAD_CONTEXT_SIZE\r\n#define MCUXCLCSS_AEAD_DECRYPT  MCUXCLELS_AEAD_DECRYPT\r\n#define MCUXCLCSS_AEAD_ENCRYPT  MCUXCLELS_AEAD_ENCRYPT\r\n#define MCUXCLCSS_AEAD_EXTERN_KEY  MCUXCLELS_AEAD_EXTERN_KEY\r\n#define MCUXCLCSS_AEAD_INTERN_KEY  MCUXCLELS_AEAD_INTERN_KEY\r\n#define MCUXCLCSS_AEAD_IV_BLOCK_SIZE  MCUXCLELS_AEAD_IV_BLOCK_SIZE\r\n#define MCUXCLCSS_AEAD_LASTINIT_FALSE  MCUXCLELS_AEAD_LASTINIT_FALSE\r\n#define MCUXCLCSS_AEAD_LASTINIT_TRUE  MCUXCLELS_AEAD_LASTINIT_TRUE\r\n#define MCUXCLCSS_AEAD_STATE_IN_DISABLE  MCUXCLELS_AEAD_STATE_IN_DISABLE\r\n#define MCUXCLCSS_AEAD_STATE_IN_ENABLE  MCUXCLELS_AEAD_STATE_IN_ENABLE\r\n#define MCUXCLCSS_AEAD_STATE_OUT_ENABLE  MCUXCLELS_AEAD_STATE_OUT_ENABLE\r\n#define MCUXCLCSS_AEAD_TAG_SIZE  MCUXCLELS_AEAD_TAG_SIZE\r\n#define MCUXCLCSS_CIPHERPARAM_ALGORITHM_AES_CBC  MCUXCLELS_CIPHERPARAM_ALGORITHM_AES_CBC\r\n#define MCUXCLCSS_CIPHERPARAM_ALGORITHM_AES_CTR  MCUXCLELS_CIPHERPARAM_ALGORITHM_AES_CTR\r\n#define MCUXCLCSS_CIPHERPARAM_ALGORITHM_AES_ECB  MCUXCLELS_CIPHERPARAM_ALGORITHM_AES_ECB\r\n#define MCUXCLCSS_CIPHER_BLOCK_SIZE_AES  MCUXCLELS_CIPHER_BLOCK_SIZE_AES\r\n#define MCUXCLCSS_CIPHER_DECRYPT  MCUXCLELS_CIPHER_DECRYPT\r\n#define MCUXCLCSS_CIPHER_ENCRYPT  MCUXCLELS_CIPHER_ENCRYPT\r\n#define MCUXCLCSS_CIPHER_EXTERNAL_KEY  MCUXCLELS_CIPHER_EXTERNAL_KEY\r\n#define MCUXCLCSS_CIPHER_INTERNAL_KEY  MCUXCLELS_CIPHER_INTERNAL_KEY\r\n#define MCUXCLCSS_CIPHER_KEY_SIZE_AES_128  MCUXCLELS_CIPHER_KEY_SIZE_AES_128\r\n#define MCUXCLCSS_CIPHER_KEY_SIZE_AES_192  MCUXCLELS_CIPHER_KEY_SIZE_AES_192\r\n#define MCUXCLCSS_CIPHER_KEY_SIZE_AES_256  MCUXCLELS_CIPHER_KEY_SIZE_AES_256\r\n#define MCUXCLCSS_CIPHER_STATE_IN_DISABLE  MCUXCLELS_CIPHER_STATE_IN_DISABLE\r\n#define MCUXCLCSS_CIPHER_STATE_IN_ENABLE  MCUXCLELS_CIPHER_STATE_IN_ENABLE\r\n#define MCUXCLCSS_CIPHER_STATE_OUT_DISABLE  MCUXCLELS_CIPHER_STATE_OUT_DISABLE\r\n#define MCUXCLCSS_CIPHER_STATE_OUT_ENABLE  MCUXCLELS_CIPHER_STATE_OUT_ENABLE\r\n#define MCUXCLCSS_CKDF_ALGO_SP800108  MCUXCLELS_CKDF_ALGO_SP800108\r\n#define MCUXCLCSS_CKDF_ALGO_SP80056C_EXPAND  MCUXCLELS_CKDF_ALGO_SP80056C_EXPAND\r\n#define MCUXCLCSS_CKDF_ALGO_SP80056C_EXTRACT  MCUXCLELS_CKDF_ALGO_SP80056C_EXTRACT\r\n#define MCUXCLCSS_CKDF_DERIVATIONDATA_SIZE  MCUXCLELS_CKDF_DERIVATIONDATA_SIZE\r\n#define MCUXCLCSS_HKDF_RTF_DERIV  MCUXCLELS_HKDF_RTF_DERIV\r\n#define MCUXCLCSS_CKDF_SP80056C_DERIVATIONDATA_SIZE_16  MCUXCLELS_CKDF_SP80056C_DERIVATIONDATA_SIZE_16\r\n#define MCUXCLCSS_CKDF_SP80056C_DERIVATIONDATA_SIZE_32  MCUXCLELS_CKDF_SP80056C_DERIVATIONDATA_SIZE_32\r\n#define MCUXCLCSS_HKDF_SYSTEM_MEMORY_DERIV  MCUXCLELS_HKDF_SYSTEM_MEMORY_DERIV\r\n#define MCUXCLCSS_CMAC_EXTERNAL_KEY_DISABLE  MCUXCLELS_CMAC_EXTERNAL_KEY_DISABLE\r\n#define MCUXCLCSS_CMAC_EXTERNAL_KEY_ENABLE  MCUXCLELS_CMAC_EXTERNAL_KEY_ENABLE\r\n#define MCUXCLCSS_CMAC_FINALIZE_DISABLE  MCUXCLELS_CMAC_FINALIZE_DISABLE\r\n#define MCUXCLCSS_CMAC_FINALIZE_ENABLE  MCUXCLELS_CMAC_FINALIZE_ENABLE\r\n#define MCUXCLCSS_CMAC_INITIALIZE_DISABLE  MCUXCLELS_CMAC_INITIALIZE_DISABLE\r\n#define MCUXCLCSS_CMAC_INITIALIZE_ENABLE  MCUXCLELS_CMAC_INITIALIZE_ENABLE\r\n#define MCUXCLCSS_CMAC_KEY_SIZE_128  MCUXCLELS_CMAC_KEY_SIZE_128\r\n#define MCUXCLCSS_CMAC_KEY_SIZE_256  MCUXCLELS_CMAC_KEY_SIZE_256\r\n#define MCUXCLCSS_CMAC_OUT_SIZE  MCUXCLELS_CMAC_OUT_SIZE\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_AUTH_CIPHER  MCUXCLELS_CMD_CRC_CMD_ID_AUTH_CIPHER\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_CHAL_RESP_GEN  MCUXCLELS_CMD_CRC_CMD_ID_CHAL_RESP_GEN\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_CIPHER  MCUXCLELS_CMD_CRC_CMD_ID_CIPHER\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_CKDF  MCUXCLELS_CMD_CRC_CMD_ID_CKDF\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_CMAC  MCUXCLELS_CMD_CRC_CMD_ID_CMAC\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_DRBG_TEST  MCUXCLELS_CMD_CRC_CMD_ID_DRBG_TEST\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_DTRNG_CFG_LOAD  MCUXCLELS_CMD_CRC_CMD_ID_DTRNG_CFG_LOAD\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_DTRNG_EVAL  MCUXCLELS_CMD_CRC_CMD_ID_DTRNG_EVAL\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_ECKXH  MCUXCLELS_CMD_CRC_CMD_ID_ECKXH\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_ECSIGN  MCUXCLELS_CMD_CRC_CMD_ID_ECSIGN\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_ECVFY  MCUXCLELS_CMD_CRC_CMD_ID_ECVFY\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_GDET_CFG_LOAD  MCUXCLELS_CMD_CRC_CMD_ID_GDET_CFG_LOAD\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_GDET_TRIM  MCUXCLELS_CMD_CRC_CMD_ID_GDET_TRIM\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_HASH  MCUXCLELS_CMD_CRC_CMD_ID_HASH\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_HKDF  MCUXCLELS_CMD_CRC_CMD_ID_HKDF\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_HMAC  MCUXCLELS_CMD_CRC_CMD_ID_HMAC\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_KDELETE  MCUXCLELS_CMD_CRC_CMD_ID_KDELETE\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_KEYGEN  MCUXCLELS_CMD_CRC_CMD_ID_KEYGEN\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_KEYIN  MCUXCLELS_CMD_CRC_CMD_ID_KEYIN\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_KEYOUT  MCUXCLELS_CMD_CRC_CMD_ID_KEYOUT\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_KEYPROV  MCUXCLELS_CMD_CRC_CMD_ID_KEYPROV\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_RND_REQ  MCUXCLELS_CMD_CRC_CMD_ID_RND_REQ\r\n#define MCUXCLCSS_CMD_CRC_CMD_ID_TLS  MCUXCLELS_CMD_CRC_CMD_ID_TLS\r\n#define MCUXCLCSS_CMD_CRC_DISABLE  MCUXCLELS_CMD_CRC_DISABLE\r\n#define MCUXCLCSS_CMD_CRC_ENABLE  MCUXCLELS_CMD_CRC_ENABLE\r\n#define MCUXCLCSS_CMD_CRC_INITIAL_VALUE  MCUXCLELS_CMD_CRC_INITIAL_VALUE\r\n#define MCUXCLCSS_CMD_CRC_POLYNOMIAL  MCUXCLELS_CMD_CRC_POLYNOMIAL\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_INIT  MCUXCLELS_CMD_CRC_REFERENCE_INIT\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_RESET  MCUXCLELS_CMD_CRC_REFERENCE_RESET\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_AEAD_FINALIZE  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_AEAD_FINALIZE\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_AEAD_INIT  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_AEAD_INIT\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_AEAD_PARTIALINIT  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_AEAD_PARTIALINIT\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_AEAD_UPDATEAAD  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_AEAD_UPDATEAAD\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_AEAD_UPDATEDATA  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_AEAD_UPDATEDATA\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_CIPHER  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_CIPHER\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_CKDF_SP800108  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_CKDF_SP800108\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_CKDF_SP80056C_EXPAND  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_CKDF_SP80056C_EXPAND\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_CKDF_SP80056C_EXTRACT  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_CKDF_SP80056C_EXTRACT\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_CMAC  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_CMAC\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_ECCKEYEXCHANGE  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_ECCKEYEXCHANGE\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_ECCKEYEXCHANGEINT  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_ECCKEYEXCHANGEINT\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_ECCKEYGEN  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_ECCKEYGEN\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_ECCSIGN  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_ECCSIGN\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_ECCVERFIFY  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_ECCVERFIFY\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_ECCVERFIFYINT  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_ECCVERFIFYINT\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_GLITCHDETECTOR_LOADCONFIG  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_GLITCHDETECTOR_LOADCONFIG\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_GLITCHDETECTOR_TRIM  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_GLITCHDETECTOR_TRIM\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_HASH  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_HASH\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_HKDF_RFC5869  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_HKDF_RFC5869\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_HKDF_SP80056C  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_HKDF_SP80056C\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_HMAC  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_HMAC\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_KEYDELETE  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_KEYDELETE\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_KEYEXPORT  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_KEYEXPORT\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_KEYIMPORT  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_KEYIMPORT\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_KEYIMPORTPUK  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_KEYIMPORTPUK\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_KEYPROVISION  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_KEYPROVISION\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_KEYPROVISIONROM  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_KEYPROVISIONROM\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_PRNG_INIT  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_PRNG_INIT\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_RESPGEN  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_RESPGEN\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_RNG_DRBGREQUEST  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_RNG_DRBGREQUEST\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_RNG_DRBGREQUESTRAW  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_RNG_DRBGREQUESTRAW\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_RNG_DRBGTESTAESCTR  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_RNG_DRBGTESTAESCTR\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_RNG_DRBGTESTAESECB  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_RNG_DRBGTESTAESECB\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_RNG_DRBGTESTEXTRACT  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_RNG_DRBGTESTEXTRACT\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_RNG_DRBGTESTINSTANTIATE  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_RNG_DRBGTESTINSTANTIATE\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_RNG_DTRNG_CONFIGEVALUATE  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_RNG_DTRNG_CONFIGEVALUATE\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_RNG_DTRNG_CONFIGLOAD  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_RNG_DTRNG_CONFIGLOAD\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_TLSGENERATEMASTERKEYFROMPREMASTERKEY  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_TLSGENERATEMASTERKEYFROMPREMASTERKEY\r\n#define MCUXCLCSS_CMD_CRC_REFERENCE_UPDATE_TLSGENERATESESSIONKEYSFROMMASTERKEY  MCUXCLELS_CMD_CRC_REFERENCE_UPDATE_TLSGENERATESESSIONKEYSFROMMASTERKEY\r\n#define MCUXCLCSS_CMD_CRC_RESET  MCUXCLELS_CMD_CRC_RESET\r\n#define MCUXCLCSS_CMD_CRC_VALUE_DISABLE  MCUXCLELS_CMD_CRC_VALUE_DISABLE\r\n#define MCUXCLCSS_CMD_CRC_VALUE_ENABLE  MCUXCLELS_CMD_CRC_VALUE_ENABLE\r\n#define MCUXCLCSS_CMD_CRC_VALUE_RESET  MCUXCLELS_CMD_CRC_VALUE_RESET\r\n#define MCUXCLCSS_CSS_INTERRUPT_DISABLE  MCUXCLELS_ELS_INTERRUPT_DISABLE\r\n#define MCUXCLCSS_CSS_INTERRUPT_ENABLE  MCUXCLELS_ELS_INTERRUPT_ENABLE\r\n#define MCUXCLCSS_CSS_INTERRUPT_KEEP  MCUXCLELS_ELS_INTERRUPT_KEEP\r\n#define MCUXCLCSS_CSS_INTERRUPT_SET  MCUXCLELS_ELS_INTERRUPT_SET\r\n#define MCUXCLCSS_CSS_RESET_CLEAR  MCUXCLELS_ELS_RESET_CLEAR\r\n#define MCUXCLCSS_CSS_RESET_KEEP  MCUXCLELS_ELS_RESET_KEEP\r\n#define MCUXCLCSS_DMA_READBACK_PROTECTION_TOKEN  MCUXCLELS_DMA_READBACK_PROTECTION_TOKEN\r\n#define MCUXCLCSS_ECC_EXTKEY_EXTERNAL  MCUXCLELS_ECC_EXTKEY_EXTERNAL\r\n#define MCUXCLCSS_ECC_EXTKEY_INTERNAL  MCUXCLELS_ECC_EXTKEY_INTERNAL\r\n#define MCUXCLCSS_ECC_GEN_PUBLIC_KEY  MCUXCLELS_ECC_GEN_PUBLIC_KEY\r\n#define MCUXCLCSS_ECC_HASHED  MCUXCLELS_ECC_HASHED\r\n#define MCUXCLCSS_ECC_INCLUDE_RANDOM_DATA  MCUXCLELS_ECC_INCLUDE_RANDOM_DATA\r\n#define MCUXCLCSS_ECC_NOT_HASHED  MCUXCLELS_ECC_NOT_HASHED\r\n#define MCUXCLCSS_ECC_NO_RANDOM_DATA  MCUXCLELS_ECC_NO_RANDOM_DATA\r\n#define MCUXCLCSS_ECC_NO_RTF  MCUXCLELS_ECC_NO_RTF\r\n#define MCUXCLCSS_ECC_OUTPUTKEY_DETERMINISTIC  MCUXCLELS_ECC_OUTPUTKEY_DETERMINISTIC\r\n#define MCUXCLCSS_ECC_OUTPUTKEY_KEYEXCHANGE  MCUXCLELS_ECC_OUTPUTKEY_KEYEXCHANGE\r\n#define MCUXCLCSS_ECC_OUTPUTKEY_RANDOM  MCUXCLELS_ECC_OUTPUTKEY_RANDOM\r\n#define MCUXCLCSS_ECC_OUTPUTKEY_SIGN  MCUXCLELS_ECC_OUTPUTKEY_SIGN\r\n#define MCUXCLCSS_ECC_PUBLICKEY_SIGN_DISABLE  MCUXCLELS_ECC_PUBLICKEY_SIGN_DISABLE\r\n#define MCUXCLCSS_ECC_PUBLICKEY_SIGN_ENABLE  MCUXCLELS_ECC_PUBLICKEY_SIGN_ENABLE\r\n#define MCUXCLCSS_ECC_PUBLICKEY_SIZE  MCUXCLELS_ECC_PUBLICKEY_SIZE\r\n#define MCUXCLCSS_ECC_REVERSEFETCH_DISABLE  MCUXCLELS_ECC_REVERSEFETCH_DISABLE\r\n#define MCUXCLCSS_ECC_REVERSEFETCH_ENABLE  MCUXCLELS_ECC_REVERSEFETCH_ENABLE\r\n#define MCUXCLCSS_ECC_RTF  MCUXCLELS_ECC_RTF\r\n#define MCUXCLCSS_ECC_SIGNATURE_R_SIZE  MCUXCLELS_ECC_SIGNATURE_R_SIZE\r\n#define MCUXCLCSS_ECC_SIGNATURE_SIZE  MCUXCLELS_ECC_SIGNATURE_SIZE\r\n#define MCUXCLCSS_ECC_SKIP_PUBLIC_KEY  MCUXCLELS_ECC_SKIP_PUBLIC_KEY\r\n#define MCUXCLCSS_ECC_VALUE_HASHED  MCUXCLELS_ECC_VALUE_HASHED\r\n#define MCUXCLCSS_ECC_VALUE_NOT_HASHED  MCUXCLELS_ECC_VALUE_NOT_HASHED\r\n#define MCUXCLCSS_ECC_VALUE_NO_RTF  MCUXCLELS_ECC_VALUE_NO_RTF\r\n#define MCUXCLCSS_ECC_VALUE_RTF  MCUXCLELS_ECC_VALUE_RTF\r\n#define MCUXCLCSS_ERROR_FLAGS_CLEAR  MCUXCLELS_ERROR_FLAGS_CLEAR\r\n#define MCUXCLCSS_ERROR_FLAGS_KEEP  MCUXCLELS_ERROR_FLAGS_KEEP\r\n#define MCUXCLCSS_GLITCHDETECTOR_CFG_SIZE  MCUXCLELS_GLITCHDETECTOR_CFG_SIZE\r\n#define MCUXCLCSS_GLITCHDETECTOR_TRIM_SIZE  MCUXCLELS_GLITCHDETECTOR_TRIM_SIZE\r\n#define MCUXCLCSS_GLITCH_DETECTOR_INTERRUPT_DISABLE  MCUXCLELS_GLITCH_DETECTOR_INTERRUPT_DISABLE\r\n#define MCUXCLCSS_GLITCH_DETECTOR_INTERRUPT_ENABLE  MCUXCLELS_GLITCH_DETECTOR_INTERRUPT_ENABLE\r\n#define MCUXCLCSS_GLITCH_DETECTOR_NEG_KEEP  MCUXCLELS_GLITCH_DETECTOR_NEG_KEEP\r\n#define MCUXCLCSS_GLITCH_DETECTOR_NEG_SET  MCUXCLELS_GLITCH_DETECTOR_NEG_SET\r\n#define MCUXCLCSS_GLITCH_DETECTOR_POS_KEEP  MCUXCLELS_GLITCH_DETECTOR_POS_KEEP\r\n#define MCUXCLCSS_GLITCH_DETECTOR_POS_SET  MCUXCLELS_GLITCH_DETECTOR_POS_SET\r\n#define MCUXCLCSS_GLITCH_DETECTOR_RESET_CLEAR  MCUXCLELS_GLITCH_DETECTOR_RESET_CLEAR\r\n#define MCUXCLCSS_GLITCH_DETECTOR_RESET_KEEP  MCUXCLELS_GLITCH_DETECTOR_RESET_KEEP\r\n#define MCUXCLCSS_HASH_BLOCK_SIZE_SHA_224  MCUXCLELS_HASH_BLOCK_SIZE_SHA_224\r\n#define MCUXCLCSS_HASH_BLOCK_SIZE_SHA_256  MCUXCLELS_HASH_BLOCK_SIZE_SHA_256\r\n#define MCUXCLCSS_HASH_BLOCK_SIZE_SHA_384  MCUXCLELS_HASH_BLOCK_SIZE_SHA_384\r\n#define MCUXCLCSS_HASH_BLOCK_SIZE_SHA_512  MCUXCLELS_HASH_BLOCK_SIZE_SHA_512\r\n#define MCUXCLCSS_HASH_INIT_DISABLE  MCUXCLELS_HASH_INIT_DISABLE\r\n#define MCUXCLCSS_HASH_INIT_ENABLE  MCUXCLELS_HASH_INIT_ENABLE\r\n#define MCUXCLCSS_HASH_LOAD_DISABLE  MCUXCLELS_HASH_LOAD_DISABLE\r\n#define MCUXCLCSS_HASH_LOAD_ENABLE  MCUXCLELS_HASH_LOAD_ENABLE\r\n#define MCUXCLCSS_HASH_MODE_SHA_224  MCUXCLELS_HASH_MODE_SHA_224\r\n#define MCUXCLCSS_HASH_MODE_SHA_256  MCUXCLELS_HASH_MODE_SHA_256\r\n#define MCUXCLCSS_HASH_MODE_SHA_384  MCUXCLELS_HASH_MODE_SHA_384\r\n#define MCUXCLCSS_HASH_MODE_SHA_512  MCUXCLELS_HASH_MODE_SHA_512\r\n#define MCUXCLCSS_HASH_OUTPUT_DISABLE  MCUXCLELS_HASH_OUTPUT_DISABLE\r\n#define MCUXCLCSS_HASH_OUTPUT_ENABLE  MCUXCLELS_HASH_OUTPUT_ENABLE\r\n#define MCUXCLCSS_HASH_OUTPUT_SIZE_SHA_224  MCUXCLELS_HASH_OUTPUT_SIZE_SHA_224\r\n#define MCUXCLCSS_HASH_OUTPUT_SIZE_SHA_256  MCUXCLELS_HASH_OUTPUT_SIZE_SHA_256\r\n#define MCUXCLCSS_HASH_OUTPUT_SIZE_SHA_384  MCUXCLELS_HASH_OUTPUT_SIZE_SHA_384\r\n#define MCUXCLCSS_HASH_OUTPUT_SIZE_SHA_512  MCUXCLELS_HASH_OUTPUT_SIZE_SHA_512\r\n#define MCUXCLCSS_HASH_RTF_OUTPUT_DISABLE  MCUXCLELS_HASH_RTF_OUTPUT_DISABLE\r\n#define MCUXCLCSS_HASH_RTF_OUTPUT_ENABLE  MCUXCLELS_HASH_RTF_OUTPUT_ENABLE\r\n#define MCUXCLCSS_HASH_RTF_OUTPUT_SIZE  MCUXCLELS_HASH_RTF_OUTPUT_SIZE\r\n#define MCUXCLCSS_HASH_RTF_UPDATE_DISABLE  MCUXCLELS_HASH_RTF_UPDATE_DISABLE\r\n#define MCUXCLCSS_HASH_RTF_UPDATE_ENABLE  MCUXCLELS_HASH_RTF_UPDATE_ENABLE\r\n#define MCUXCLCSS_HASH_STATE_SIZE_SHA_224  MCUXCLELS_HASH_STATE_SIZE_SHA_224\r\n#define MCUXCLCSS_HASH_STATE_SIZE_SHA_256  MCUXCLELS_HASH_STATE_SIZE_SHA_256\r\n#define MCUXCLCSS_HASH_STATE_SIZE_SHA_384  MCUXCLELS_HASH_STATE_SIZE_SHA_384\r\n#define MCUXCLCSS_HASH_STATE_SIZE_SHA_512  MCUXCLELS_HASH_STATE_SIZE_SHA_512\r\n#define MCUXCLCSS_HASH_VALUE_MODE_SHA_224  MCUXCLELS_HASH_VALUE_MODE_SHA_224\r\n#define MCUXCLCSS_HASH_VALUE_MODE_SHA_256  MCUXCLELS_HASH_VALUE_MODE_SHA_256\r\n#define MCUXCLCSS_HASH_VALUE_MODE_SHA_384  MCUXCLELS_HASH_VALUE_MODE_SHA_384\r\n#define MCUXCLCSS_HASH_VALUE_MODE_SHA_512  MCUXCLELS_HASH_VALUE_MODE_SHA_512\r\n#define MCUXCLCSS_HKDF_ALGO_RFC5869  MCUXCLELS_HKDF_ALGO_RFC5869\r\n#define MCUXCLCSS_HKDF_ALGO_SP80056C  MCUXCLELS_HKDF_ALGO_SP80056C\r\n#define MCUXCLCSS_HKDF_RFC5869_DERIVATIONDATA_SIZE  MCUXCLELS_HKDF_RFC5869_DERIVATIONDATA_SIZE\r\n#define MCUXCLCSS_HKDF_SP80056C_TARGETKEY_SIZE  MCUXCLELS_HKDF_SP80056C_TARGETKEY_SIZE\r\n#define MCUXCLCSS_HKDF_VALUE_MEMORY_DERIV  MCUXCLELS_HKDF_VALUE_MEMORY_DERIV\r\n#define MCUXCLCSS_HKDF_VALUE_RTF_DERIV  MCUXCLELS_HKDF_VALUE_RTF_DERIV\r\n#define MCUXCLCSS_HMAC_EXTERNAL_KEY_DISABLE  MCUXCLELS_HMAC_EXTERNAL_KEY_DISABLE\r\n#define MCUXCLCSS_HMAC_EXTERNAL_KEY_ENABLE  MCUXCLELS_HMAC_EXTERNAL_KEY_ENABLE\r\n#define MCUXCLCSS_HMAC_OUTPUT_SIZE  MCUXCLELS_HMAC_OUTPUT_SIZE\r\n#define MCUXCLCSS_HMAC_PADDED_KEY_SIZE  MCUXCLELS_HMAC_PADDED_KEY_SIZE\r\n#define MCUXCLCSS_HW_VERSION  MCUXCLELS_HW_VERSION\r\n#define MCUXCLCSS_KEYGEN_VALUE_DETERMINISTIC  MCUXCLELS_KEYGEN_VALUE_DETERMINISTIC\r\n#define MCUXCLCSS_KEYGEN_VALUE_GEN_PUB_KEY  MCUXCLELS_KEYGEN_VALUE_GEN_PUB_KEY\r\n#define MCUXCLCSS_KEYGEN_VALUE_NO_PUB_KEY  MCUXCLELS_KEYGEN_VALUE_NO_PUB_KEY\r\n#define MCUXCLCSS_KEYGEN_VALUE_NO_RANDOM_DATA  MCUXCLELS_KEYGEN_VALUE_NO_RANDOM_DATA\r\n#define MCUXCLCSS_KEYGEN_VALUE_RANDOM  MCUXCLELS_KEYGEN_VALUE_RANDOM\r\n#define MCUXCLCSS_KEYGEN_VALUE_SIGN_PUBLICKEY  MCUXCLELS_KEYGEN_VALUE_SIGN_PUBLICKEY\r\n#define MCUXCLCSS_KEYGEN_VALUE_TYPE_KEYEXCHANGE  MCUXCLELS_KEYGEN_VALUE_TYPE_KEYEXCHANGE\r\n#define MCUXCLCSS_KEYGEN_VALUE_TYPE_SIGN  MCUXCLELS_KEYGEN_VALUE_TYPE_SIGN\r\n#define MCUXCLCSS_KEYGEN_VALUE_USE_RANDOM_DATA  MCUXCLELS_KEYGEN_VALUE_USE_RANDOM_DATA\r\n#define MCUXCLCSS_KEYIMPORT_KFMT_PBK  MCUXCLELS_KEYIMPORT_KFMT_PBK\r\n#define MCUXCLCSS_KEYIMPORT_KFMT_PUF  MCUXCLELS_KEYIMPORT_KFMT_PUF\r\n#define MCUXCLCSS_KEYIMPORT_KFMT_RFC3394  MCUXCLELS_KEYIMPORT_KFMT_RFC3394\r\n#define MCUXCLCSS_KEYIMPORT_KFMT_UDF  MCUXCLELS_KEYIMPORT_KFMT_UDF\r\n#define MCUXCLCSS_KEYIMPORT_REVERSEFETCH_DISABLE  MCUXCLELS_KEYIMPORT_REVERSEFETCH_DISABLE\r\n#define MCUXCLCSS_KEYIMPORT_REVERSEFETCH_ENABLE  MCUXCLELS_KEYIMPORT_REVERSEFETCH_ENABLE\r\n#define MCUXCLCSS_KEYIMPORT_VALUE_KFMT_PBK  MCUXCLELS_KEYIMPORT_VALUE_KFMT_PBK\r\n#define MCUXCLCSS_KEYIMPORT_VALUE_KFMT_PUF  MCUXCLELS_KEYIMPORT_VALUE_KFMT_PUF\r\n#define MCUXCLCSS_KEYIMPORT_VALUE_KFMT_RFC3394  MCUXCLELS_KEYIMPORT_VALUE_KFMT_RFC3394\r\n#define MCUXCLCSS_KEYIMPORT_VALUE_KFMT_UDF  MCUXCLELS_KEYIMPORT_VALUE_KFMT_UDF\r\n#define MCUXCLCSS_KEYPROPERTY_ACTIVE_FALSE  MCUXCLELS_KEYPROPERTY_ACTIVE_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_ACTIVE_TRUE  MCUXCLELS_KEYPROPERTY_ACTIVE_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_AES_FALSE  MCUXCLELS_KEYPROPERTY_AES_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_AES_TRUE  MCUXCLELS_KEYPROPERTY_AES_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_BASE_SLOT  MCUXCLELS_KEYPROPERTY_BASE_SLOT\r\n#define MCUXCLCSS_KEYPROPERTY_CKDF_FALSE  MCUXCLELS_KEYPROPERTY_CKDF_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_CKDF_TRUE  MCUXCLELS_KEYPROPERTY_CKDF_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_CMAC_FALSE  MCUXCLELS_KEYPROPERTY_CMAC_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_CMAC_TRUE  MCUXCLELS_KEYPROPERTY_CMAC_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_DEVICE_UNIQUE_FALSE  MCUXCLELS_KEYPROPERTY_DEVICE_UNIQUE_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_DEVICE_UNIQUE_TRUE  MCUXCLELS_KEYPROPERTY_DEVICE_UNIQUE_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_ECC_DH_PRIVATE_FALSE  MCUXCLELS_KEYPROPERTY_ECC_DH_PRIVATE_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_ECC_DH_PRIVATE_TRUE  MCUXCLELS_KEYPROPERTY_ECC_DH_PRIVATE_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_ECC_FALSE  MCUXCLELS_KEYPROPERTY_ECC_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_ECC_TRUE  MCUXCLELS_KEYPROPERTY_ECC_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_GENERAL_PURPOSE_SLOT_FALSE  MCUXCLELS_KEYPROPERTY_GENERAL_PURPOSE_SLOT_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_GENERAL_PURPOSE_SLOT_TRUE  MCUXCLELS_KEYPROPERTY_GENERAL_PURPOSE_SLOT_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_HKDF_FALSE  MCUXCLELS_KEYPROPERTY_HKDF_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_HKDF_TRUE  MCUXCLELS_KEYPROPERTY_HKDF_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_HMAC_FALSE  MCUXCLELS_KEYPROPERTY_HMAC_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_HMAC_TRUE  MCUXCLELS_KEYPROPERTY_HMAC_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_HW_OUT_FALSE  MCUXCLELS_KEYPROPERTY_HW_OUT_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_HW_OUT_SLOT_FALSE  MCUXCLELS_KEYPROPERTY_HW_OUT_SLOT_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_HW_OUT_SLOT_TRUE  MCUXCLELS_KEYPROPERTY_HW_OUT_SLOT_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_HW_OUT_TRUE  MCUXCLELS_KEYPROPERTY_HW_OUT_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_INPUT_FOR_ECC_FALSE  MCUXCLELS_KEYPROPERTY_INPUT_FOR_ECC_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_INPUT_FOR_ECC_TRUE  MCUXCLELS_KEYPROPERTY_INPUT_FOR_ECC_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_KEY_SIZE_128  MCUXCLELS_KEYPROPERTY_KEY_SIZE_128\r\n#define MCUXCLCSS_KEYPROPERTY_KEY_SIZE_256  MCUXCLELS_KEYPROPERTY_KEY_SIZE_256\r\n#define MCUXCLCSS_KEYPROPERTY_KEY_SIZE_512  MCUXCLELS_KEYPROPERTY_KEY_SIZE_512\r\n#define MCUXCLCSS_KEYPROPERTY_KSK_FALSE  MCUXCLELS_KEYPROPERTY_KSK_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_KSK_TRUE  MCUXCLELS_KEYPROPERTY_KSK_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_KUOK_FALSE  MCUXCLELS_KEYPROPERTY_KUOK_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_KUOK_TRUE  MCUXCLELS_KEYPROPERTY_KUOK_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_KWK_FALSE  MCUXCLELS_KEYPROPERTY_KWK_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_KWK_TRUE  MCUXCLELS_KEYPROPERTY_KWK_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_PRIVILEGED_FALSE  MCUXCLELS_KEYPROPERTY_PRIVILEGED_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_PRIVILEGED_TRUE  MCUXCLELS_KEYPROPERTY_PRIVILEGED_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_PUK_FALSE  MCUXCLELS_KEYPROPERTY_PUK_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_PUK_TRUE  MCUXCLELS_KEYPROPERTY_PUK_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_RETENTION_SLOT_FALSE  MCUXCLELS_KEYPROPERTY_RETENTION_SLOT_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_RETENTION_SLOT_TRUE  MCUXCLELS_KEYPROPERTY_RETENTION_SLOT_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_RTF_FALSE  MCUXCLELS_KEYPROPERTY_RTF_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_RTF_TRUE  MCUXCLELS_KEYPROPERTY_RTF_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_SECOND_SLOT  MCUXCLELS_KEYPROPERTY_SECOND_SLOT\r\n#define MCUXCLCSS_KEYPROPERTY_SECURE_FALSE  MCUXCLELS_KEYPROPERTY_SECURE_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_SECURE_TRUE  MCUXCLELS_KEYPROPERTY_SECURE_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_TECDH_FALSE  MCUXCLELS_KEYPROPERTY_TECDH_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_TECDH_TRUE  MCUXCLELS_KEYPROPERTY_TECDH_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_TLS_MASTER_SECRET_FALSE  MCUXCLELS_KEYPROPERTY_TLS_MASTER_SECRET_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_TLS_MASTER_SECRET_TRUE  MCUXCLELS_KEYPROPERTY_TLS_MASTER_SECRET_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_TLS_PREMASTER_SECRET_FALSE  MCUXCLELS_KEYPROPERTY_TLS_PREMASTER_SECRET_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_TLS_PREMASTER_SECRET_TRUE  MCUXCLELS_KEYPROPERTY_TLS_PREMASTER_SECRET_TRUE\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_ACTIVE  MCUXCLELS_KEYPROPERTY_VALUE_ACTIVE\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_AES  MCUXCLELS_KEYPROPERTY_VALUE_AES\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_BASE_SLOT  MCUXCLELS_KEYPROPERTY_VALUE_BASE_SLOT\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_CKDF  MCUXCLELS_KEYPROPERTY_VALUE_CKDF\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_CMAC  MCUXCLELS_KEYPROPERTY_VALUE_CMAC\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_DUK  MCUXCLELS_KEYPROPERTY_VALUE_DUK\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_ECDH  MCUXCLELS_KEYPROPERTY_VALUE_ECDH\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_ECSGN  MCUXCLELS_KEYPROPERTY_VALUE_ECSGN\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_GENERAL_PURPOSE_SLOT  MCUXCLELS_KEYPROPERTY_VALUE_GENERAL_PURPOSE_SLOT\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_HKDF  MCUXCLELS_KEYPROPERTY_VALUE_HKDF\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_HMAC  MCUXCLELS_KEYPROPERTY_VALUE_HMAC\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_HW_OUT  MCUXCLELS_KEYPROPERTY_VALUE_HW_OUT\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_HW_OUT_SLOT  MCUXCLELS_KEYPROPERTY_VALUE_HW_OUT_SLOT\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_KEY_SIZE_128  MCUXCLELS_KEYPROPERTY_VALUE_KEY_SIZE_128\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_KEY_SIZE_256  MCUXCLELS_KEYPROPERTY_VALUE_KEY_SIZE_256\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_KEY_SIZE_512  MCUXCLELS_KEYPROPERTY_VALUE_KEY_SIZE_512\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_KGSRC  MCUXCLELS_KEYPROPERTY_VALUE_KGSRC\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_KSK  MCUXCLELS_KEYPROPERTY_VALUE_KSK\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_KUOK  MCUXCLELS_KEYPROPERTY_VALUE_KUOK\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_KWK  MCUXCLELS_KEYPROPERTY_VALUE_KWK\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_NOTPRIVILEGED  MCUXCLELS_KEYPROPERTY_VALUE_NOTPRIVILEGED\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_NOTSECURE  MCUXCLELS_KEYPROPERTY_VALUE_NOTSECURE\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_PRIVILEGED  MCUXCLELS_KEYPROPERTY_VALUE_PRIVILEGED\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_PUK  MCUXCLELS_KEYPROPERTY_VALUE_PUK\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_RETENTION_SLOT  MCUXCLELS_KEYPROPERTY_VALUE_RETENTION_SLOT\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_RTF  MCUXCLELS_KEYPROPERTY_VALUE_RTF\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_SECURE  MCUXCLELS_KEYPROPERTY_VALUE_SECURE\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_TECDH  MCUXCLELS_KEYPROPERTY_VALUE_TECDH\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_TLS_MASTER_SECRET  MCUXCLELS_KEYPROPERTY_VALUE_TLS_MASTER_SECRET\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_TLS_PREMASTER_SECRET  MCUXCLELS_KEYPROPERTY_VALUE_TLS_PREMASTER_SECRET\r\n#define MCUXCLCSS_KEYPROPERTY_VALUE_WRPOK  MCUXCLELS_KEYPROPERTY_VALUE_WRPOK\r\n#define MCUXCLCSS_KEYPROPERTY_WRAP_FALSE  MCUXCLELS_KEYPROPERTY_WRAP_FALSE\r\n#define MCUXCLCSS_KEYPROPERTY_WRAP_TRUE  MCUXCLELS_KEYPROPERTY_WRAP_TRUE\r\n#define MCUXCLCSS_KEYPROV_DUK_UPDATE_DISABLE  MCUXCLELS_KEYPROV_DUK_UPDATE_DISABLE\r\n#define MCUXCLCSS_KEYPROV_DUK_UPDATE_ENABLE  MCUXCLELS_KEYPROV_DUK_UPDATE_ENABLE\r\n#define MCUXCLCSS_KEYPROV_KEYSHARE_TABLE_SIZE  MCUXCLELS_KEYPROV_KEYSHARE_TABLE_SIZE\r\n#define MCUXCLCSS_KEYPROV_KEY_PART_1_SIZE  MCUXCLELS_KEYPROV_KEY_PART_1_SIZE\r\n#define MCUXCLCSS_KEYPROV_NOIC_DISABLE  MCUXCLELS_KEYPROV_NOIC_DISABLE\r\n#define MCUXCLCSS_KEYPROV_NOIC_ENABLE  MCUXCLELS_KEYPROV_NOIC_ENABLE\r\n#define MCUXCLCSS_KEYPROV_TESTERSHARE_SIZE  MCUXCLELS_KEYPROV_TESTERSHARE_SIZE\r\n#define MCUXCLCSS_KEYPROV_VALUE_NOIC  MCUXCLELS_KEYPROV_VALUE_NOIC\r\n#define MCUXCLCSS_KEY_SLOTS  MCUXCLELS_KEY_SLOTS\r\n#define MCUXCLCSS_MASTER_UNLOCK_ANY  MCUXCLELS_MASTER_UNLOCK_ANY\r\n#define MCUXCLCSS_RESET_CANCEL  MCUXCLELS_RESET_CANCEL\r\n#define MCUXCLCSS_RESET_DO_NOT_CANCEL  MCUXCLELS_RESET_DO_NOT_CANCEL\r\n#define MCUXCLCSS_RESP_GEN_AVAILABLE_SLOT_0  MCUXCLELS_RESP_GEN_AVAILABLE_SLOT_0\r\n#define MCUXCLCSS_RESP_GEN_AVAILABLE_SLOT_1  MCUXCLELS_RESP_GEN_AVAILABLE_SLOT_1\r\n#define MCUXCLCSS_RESP_GEN_AVAILABLE_SLOT_2  MCUXCLELS_RESP_GEN_AVAILABLE_SLOT_2\r\n#define MCUXCLCSS_RESP_GEN_SLOTS  MCUXCLELS_RESP_GEN_SLOTS\r\n#define MCUXCLCSS_RFC3394_CONTAINER_SIZE_128  MCUXCLELS_RFC3394_CONTAINER_SIZE_128\r\n#define MCUXCLCSS_RFC3394_CONTAINER_SIZE_256  MCUXCLELS_RFC3394_CONTAINER_SIZE_256\r\n#define MCUXCLCSS_RFC3394_CONTAINER_SIZE_P256  MCUXCLELS_RFC3394_CONTAINER_SIZE_P256\r\n#define MCUXCLCSS_RFC3394_OVERHEAD  MCUXCLELS_RFC3394_OVERHEAD\r\n#define MCUXCLCSS_RNG_DRBG_TEST_EXTRACT_OUTPUT_MAX_SIZE  MCUXCLELS_RNG_DRBG_TEST_EXTRACT_OUTPUT_MAX_SIZE\r\n#define MCUXCLCSS_RNG_DRBG_TEST_EXTRACT_OUTPUT_MIN_SIZE  MCUXCLELS_RNG_DRBG_TEST_EXTRACT_OUTPUT_MIN_SIZE\r\n#define MCUXCLCSS_RNG_DRBG_TEST_MODE_AES_CTR  MCUXCLELS_RNG_DRBG_TEST_MODE_AES_CTR\r\n#define MCUXCLCSS_RNG_DRBG_TEST_MODE_AES_ECB  MCUXCLELS_RNG_DRBG_TEST_MODE_AES_ECB\r\n#define MCUXCLCSS_RNG_DRBG_TEST_MODE_EXTRACT  MCUXCLELS_RNG_DRBG_TEST_MODE_EXTRACT\r\n#define MCUXCLCSS_RNG_DRBG_TEST_MODE_INSTANTIATE  MCUXCLELS_RNG_DRBG_TEST_MODE_INSTANTIATE\r\n#define MCUXCLCSS_RNG_DTRNG_CONFIG_SIZE  MCUXCLELS_RNG_DTRNG_CONFIG_SIZE\r\n#define MCUXCLCSS_RNG_DTRNG_EVAL_CONFIG_SIZE  MCUXCLELS_RNG_DTRNG_EVAL_CONFIG_SIZE\r\n#define MCUXCLCSS_RNG_DTRNG_EVAL_RESULT_SIZE  MCUXCLELS_RNG_DTRNG_EVAL_RESULT_SIZE\r\n#define MCUXCLCSS_RNG_RAW_ENTROPY_SIZE  MCUXCLELS_RNG_RAW_ENTROPY_SIZE\r\n#define MCUXCLCSS_RNG_RND_REQ_PRND_INIT  MCUXCLELS_RNG_RND_REQ_PRND_INIT\r\n#define MCUXCLCSS_RNG_RND_REQ_RND_RAW  MCUXCLELS_RNG_RND_REQ_RND_RAW\r\n#define MCUXCLCSS_STATUS_DRBGENTLVL_HIGH  MCUXCLELS_STATUS_DRBGENTLVL_HIGH\r\n#define MCUXCLCSS_STATUS_DRBGENTLVL_LOW  MCUXCLELS_STATUS_DRBGENTLVL_LOW\r\n#define MCUXCLCSS_STATUS_DRBGENTLVL_NONE  MCUXCLELS_STATUS_DRBGENTLVL_NONE\r\n#define MCUXCLCSS_STATUS_ECDSAVFY_ERROR  MCUXCLELS_STATUS_ECDSAVFY_ERROR\r\n#define MCUXCLCSS_STATUS_ECDSAVFY_FAIL  MCUXCLELS_STATUS_ECDSAVFY_FAIL\r\n#define MCUXCLCSS_STATUS_ECDSAVFY_NORUN  MCUXCLELS_STATUS_ECDSAVFY_NORUN\r\n#define MCUXCLCSS_STATUS_ECDSAVFY_OK  MCUXCLELS_STATUS_ECDSAVFY_OK\r\n#define MCUXCLCSS_STATUS_HW_ALGORITHM  MCUXCLELS_STATUS_HW_ALGORITHM\r\n#define MCUXCLCSS_STATUS_HW_BUS  MCUXCLELS_STATUS_HW_BUS\r\n#define MCUXCLCSS_STATUS_HW_DTRNG  MCUXCLELS_STATUS_HW_DTRNG\r\n#define MCUXCLCSS_STATUS_HW_FAULT  MCUXCLELS_STATUS_HW_FAULT\r\n#define MCUXCLCSS_STATUS_HW_INTEGRITY  MCUXCLELS_STATUS_HW_INTEGRITY\r\n#define MCUXCLCSS_STATUS_HW_OPERATIONAL  MCUXCLELS_STATUS_HW_OPERATIONAL\r\n#define MCUXCLCSS_STATUS_HW_PRNG  MCUXCLELS_STATUS_HW_PRNG\r\n#define MCUXCLCSS_STATUS_IS_HW_ERROR  MCUXCLELS_STATUS_IS_HW_ERROR\r\n#define MCUXCLCSS_STATUS_IS_SW_ERROR  MCUXCLELS_STATUS_IS_SW_ERROR\r\n#define MCUXCLCSS_STATUS_OK  MCUXCLELS_STATUS_OK\r\n#define MCUXCLCSS_STATUS_OK_WAIT  MCUXCLELS_STATUS_OK_WAIT\r\n#define MCUXCLCSS_STATUS_PPROT_PRIVILEGED_NONSECURE  MCUXCLELS_STATUS_PPROT_PRIVILEGED_NONSECURE\r\n#define MCUXCLCSS_STATUS_PPROT_PRIVILEGED_SECURE  MCUXCLELS_STATUS_PPROT_PRIVILEGED_SECURE\r\n#define MCUXCLCSS_STATUS_PPROT_UNPRIVILEGED_NONSECURE  MCUXCLELS_STATUS_PPROT_UNPRIVILEGED_NONSECURE\r\n#define MCUXCLCSS_STATUS_PPROT_UNPRIVILEGED_SECURE  MCUXCLELS_STATUS_PPROT_UNPRIVILEGED_SECURE\r\n#define MCUXCLCSS_STATUS_SW_CANNOT_INTERRUPT  MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT\r\n#define MCUXCLCSS_STATUS_SW_COMPARISON_FAILED  MCUXCLELS_STATUS_SW_COMPARISON_FAILED\r\n#define MCUXCLCSS_STATUS_SW_COUNTER_EXPIRED  MCUXCLELS_STATUS_SW_COUNTER_EXPIRED\r\n#define MCUXCLCSS_STATUS_SW_FAULT  MCUXCLELS_STATUS_SW_FAULT\r\n#define MCUXCLCSS_STATUS_SW_INVALID_PARAM  MCUXCLELS_STATUS_SW_INVALID_PARAM\r\n#define MCUXCLCSS_STATUS_SW_INVALID_STATE  MCUXCLELS_STATUS_SW_INVALID_STATE\r\n#define MCUXCLCSS_STATUS_SW_LOCKING_FAILED  MCUXCLELS_STATUS_SW_LOCKING_FAILED\r\n#define MCUXCLCSS_STATUS_SW_STATUS_LOCKED  MCUXCLELS_STATUS_SW_STATUS_LOCKED\r\n#define MCUXCLCSS_TLS_DERIVATIONDATA_SIZE  MCUXCLELS_TLS_DERIVATIONDATA_SIZE\r\n#define MCUXCLCSS_TLS_FINALIZE  MCUXCLELS_TLS_FINALIZE\r\n#define MCUXCLCSS_TLS_INIT  MCUXCLELS_TLS_INIT\r\n#define MCUXCLCSS_TLS_RANDOM_SIZE  MCUXCLELS_TLS_RANDOM_SIZE\r\n\r\n\r\n/* Public types */\r\n/**\r\n * mcuxClCss_((?:AeadOption_t|CipherOption_t|CkdfOption_t|CmacOption_t|CommandCrcConfig_t|EccByte_t|EccKeyExchOption_t|EccKeyGenOption_t|EccSignOption_t|EccVerifyOption_t|ErrorHandling_t|HashOption_t|HkdfOption_t|HmacOption_t|HwConfig_t|HwState_t|HwVersion_t|InterruptOptionEn_t|InterruptOptionRst_t|InterruptOptionSet_t|KeyImportOption_t|KeyIndex_t|KeyProp_t|KeyProvisionOption_t|ResetOption_t|Status_Protected_t|Status_t|TlsOption_t|TransferToRegisterFunction_t))(?!\\w)\r\n * -->\r\n * mcuxClEls_\\1\r\n */\r\n#define mcuxClCss_AeadOption_t  mcuxClEls_AeadOption_t\r\n#define mcuxClCss_CipherOption_t  mcuxClEls_CipherOption_t\r\n#define mcuxClCss_CkdfOption_t  mcuxClEls_CkdfOption_t\r\n#define mcuxClCss_CmacOption_t  mcuxClEls_CmacOption_t\r\n#define mcuxClCss_CommandCrcConfig_t  mcuxClEls_CommandCrcConfig_t\r\n#define mcuxClCss_EccByte_t  mcuxClEls_EccByte_t\r\n#define mcuxClCss_EccKeyExchOption_t  mcuxClEls_EccKeyExchOption_t\r\n#define mcuxClCss_EccKeyGenOption_t  mcuxClEls_EccKeyGenOption_t\r\n#define mcuxClCss_EccSignOption_t  mcuxClEls_EccSignOption_t\r\n#define mcuxClCss_EccVerifyOption_t  mcuxClEls_EccVerifyOption_t\r\n#define mcuxClCss_ErrorHandling_t  mcuxClEls_ErrorHandling_t\r\n#define mcuxClCss_HashOption_t  mcuxClEls_HashOption_t\r\n#define mcuxClCss_HkdfOption_t  mcuxClEls_HkdfOption_t\r\n#define mcuxClCss_HmacOption_t  mcuxClEls_HmacOption_t\r\n#define mcuxClCss_HwConfig_t  mcuxClEls_HwConfig_t\r\n#define mcuxClCss_HwState_t  mcuxClEls_HwState_t\r\n#define mcuxClCss_HwVersion_t  mcuxClEls_HwVersion_t\r\n#define mcuxClCss_InterruptOptionEn_t  mcuxClEls_InterruptOptionEn_t\r\n#define mcuxClCss_InterruptOptionRst_t  mcuxClEls_InterruptOptionRst_t\r\n#define mcuxClCss_InterruptOptionSet_t  mcuxClEls_InterruptOptionSet_t\r\n#define mcuxClCss_KeyImportOption_t  mcuxClEls_KeyImportOption_t\r\n#define mcuxClCss_KeyIndex_t  mcuxClEls_KeyIndex_t\r\n#define mcuxClCss_KeyProp_t  mcuxClEls_KeyProp_t\r\n#define mcuxClCss_KeyProvisionOption_t  mcuxClEls_KeyProvisionOption_t\r\n#define mcuxClCss_ResetOption_t  mcuxClEls_ResetOption_t\r\n#define mcuxClCss_Status_Protected_t  mcuxClEls_Status_Protected_t\r\n#define mcuxClCss_Status_t  mcuxClEls_Status_t\r\n#define mcuxClCss_TlsOption_t  mcuxClEls_TlsOption_t\r\n#define mcuxClCss_TransferToRegisterFunction_t  mcuxClEls_TransferToRegisterFunction_t\r\n\r\n\r\n/* Public functions */\r\n/**\r\n * mcuxClCss_((?:Aead_Finalize_Async|Aead_Init_Async|Aead_PartialInit_Async|Aead_UpdateAad_Async|Aead_UpdateData_Async|Cipher_Async|Ckdf_Sp800108_Async|Ckdf_Sp80056c_Expand_Async|Ckdf_Sp80056c_Extract_Async|Cmac_Async|CompareDmaFinalOutputAddress|ConfigureCommandCRC|Disable|EccKeyExchangeInt_Async|EccKeyExchange_Async|EccKeyGen_Async|EccSign_Async|EccVerifyInt_Async|EccVerify_Async|Enable_Async|GetCommandCRC|GetErrorCode|GetErrorLevel|GetHwConfig|GetHwState|GetHwVersion|GetIntEnableFlags|GetKeyProperties|GetLastDmaAddress|GetLock|GetRandomStartDelay|GlitchDetector_GetEventCounter|GlitchDetector_LoadConfig_Async|GlitchDetector_ResetEventCounter|GlitchDetector_Trim_Async|Hash_Async|Hash_ShaDirect|Hkdf_Rfc5869_Async|Hkdf_Sp80056c_Async|Hmac_Async|IsLocked|KeyDelete_Async|KeyExport_Async|KeyImportPuk_Async|KeyImport_Async|KeyProvisionRom_Async|KeyProvision_Async|LimitedWaitForOperation|Prng_GetRandom|Prng_GetRandomWord|Prng_Init_Async|ReleaseLock|ResetErrorFlags|ResetIntFlags|Reset_Async|RespGen_Async|Rng_DrbgRequestRaw_Async|Rng_DrbgRequest_Async|Rng_DrbgTestAesCtr_Async|Rng_DrbgTestAesEcb_Async|Rng_DrbgTestExtract_Async|Rng_DrbgTestInstantiate_Async|Rng_Dtrng_ConfigEvaluate_Async|Rng_Dtrng_ConfigLoadPrv_Async|Rng_Dtrng_ConfigLoad_Async|SetIntEnableFlags|SetIntFlags|SetMasterUnlock|SetRandomStartDelay|ShaDirect_Disable|ShaDirect_Enable|TlsGenerateMasterKeyFromPreMasterKey_Async|TlsGenerateSessionKeysFromMasterKey_Async|UpdateRefCRC|VerifyVsRefCRC|WaitForOperation))(?!\\w)\r\n * -->\r\n * mcuxClEls_\\1\r\n */\r\n#define mcuxClCss_Aead_Finalize_Async  mcuxClEls_Aead_Finalize_Async\r\n#define mcuxClCss_Aead_Init_Async  mcuxClEls_Aead_Init_Async\r\n#define mcuxClCss_Aead_PartialInit_Async  mcuxClEls_Aead_PartialInit_Async\r\n#define mcuxClCss_Aead_UpdateAad_Async  mcuxClEls_Aead_UpdateAad_Async\r\n#define mcuxClCss_Aead_UpdateData_Async  mcuxClEls_Aead_UpdateData_Async\r\n#define mcuxClCss_Cipher_Async  mcuxClEls_Cipher_Async\r\n#define mcuxClCss_Ckdf_Sp800108_Async  mcuxClEls_Ckdf_Sp800108_Async\r\n#define mcuxClCss_Ckdf_Sp80056c_Expand_Async  mcuxClEls_Ckdf_Sp80056c_Expand_Async\r\n#define mcuxClCss_Ckdf_Sp80056c_Extract_Async  mcuxClEls_Ckdf_Sp80056c_Extract_Async\r\n#define mcuxClCss_Cmac_Async  mcuxClEls_Cmac_Async\r\n#define mcuxClCss_CompareDmaFinalOutputAddress  mcuxClEls_CompareDmaFinalOutputAddress\r\n#define mcuxClCss_ConfigureCommandCRC  mcuxClEls_ConfigureCommandCRC\r\n#define mcuxClCss_Disable  mcuxClEls_Disable\r\n#define mcuxClCss_EccKeyExchangeInt_Async  mcuxClEls_EccKeyExchangeInt_Async\r\n#define mcuxClCss_EccKeyExchange_Async  mcuxClEls_EccKeyExchange_Async\r\n#define mcuxClCss_EccKeyGen_Async  mcuxClEls_EccKeyGen_Async\r\n#define mcuxClCss_EccSign_Async  mcuxClEls_EccSign_Async\r\n#define mcuxClCss_EccVerifyInt_Async  mcuxClEls_EccVerifyInt_Async\r\n#define mcuxClCss_EccVerify_Async  mcuxClEls_EccVerify_Async\r\n#define mcuxClCss_Enable_Async  mcuxClEls_Enable_Async\r\n#define mcuxClCss_GetCommandCRC  mcuxClEls_GetCommandCRC\r\n#define mcuxClCss_GetErrorCode  mcuxClEls_GetErrorCode\r\n#define mcuxClCss_GetErrorLevel  mcuxClEls_GetErrorLevel\r\n#define mcuxClCss_GetHwConfig  mcuxClEls_GetHwConfig\r\n#define mcuxClCss_GetHwState  mcuxClEls_GetHwState\r\n#define mcuxClCss_GetHwVersion  mcuxClEls_GetHwVersion\r\n#define mcuxClCss_GetIntEnableFlags  mcuxClEls_GetIntEnableFlags\r\n#define mcuxClCss_GetKeyProperties  mcuxClEls_GetKeyProperties\r\n#define mcuxClCss_GetLastDmaAddress  mcuxClEls_GetLastDmaAddress\r\n#define mcuxClCss_GetLock  mcuxClEls_GetLock\r\n#define mcuxClCss_GetRandomStartDelay  mcuxClEls_GetRandomStartDelay\r\n#define mcuxClCss_GlitchDetector_GetEventCounter  mcuxClEls_GlitchDetector_GetEventCounter\r\n#define mcuxClCss_GlitchDetector_LoadConfig_Async  mcuxClEls_GlitchDetector_LoadConfig_Async\r\n#define mcuxClCss_GlitchDetector_ResetEventCounter  mcuxClEls_GlitchDetector_ResetEventCounter\r\n#define mcuxClCss_GlitchDetector_Trim_Async  mcuxClEls_GlitchDetector_Trim_Async\r\n#define mcuxClCss_Hash_Async  mcuxClEls_Hash_Async\r\n#define mcuxClCss_Hash_ShaDirect  mcuxClEls_Hash_ShaDirect\r\n#define mcuxClCss_Hkdf_Rfc5869_Async  mcuxClEls_Hkdf_Rfc5869_Async\r\n#define mcuxClCss_Hkdf_Sp80056c_Async  mcuxClEls_Hkdf_Sp80056c_Async\r\n#define mcuxClCss_Hmac_Async  mcuxClEls_Hmac_Async\r\n#define mcuxClCss_IsLocked  mcuxClEls_IsLocked\r\n#define mcuxClCss_KeyDelete_Async  mcuxClEls_KeyDelete_Async\r\n#define mcuxClCss_KeyExport_Async  mcuxClEls_KeyExport_Async\r\n#define mcuxClCss_KeyImportPuk_Async  mcuxClEls_KeyImportPuk_Async\r\n#define mcuxClCss_KeyImport_Async  mcuxClEls_KeyImport_Async\r\n#define mcuxClCss_KeyProvisionRom_Async  mcuxClEls_KeyProvisionRom_Async\r\n#define mcuxClCss_KeyProvision_Async  mcuxClEls_KeyProvision_Async\r\n#define mcuxClCss_LimitedWaitForOperation  mcuxClEls_LimitedWaitForOperation\r\n#define mcuxClCss_Prng_GetRandom  mcuxClEls_Prng_GetRandom\r\n#define mcuxClCss_Prng_GetRandomWord  mcuxClEls_Prng_GetRandomWord\r\n#define mcuxClCss_Prng_Init_Async  mcuxClEls_Prng_Init_Async\r\n#define mcuxClCss_ReleaseLock  mcuxClEls_ReleaseLock\r\n#define mcuxClCss_ResetErrorFlags  mcuxClEls_ResetErrorFlags\r\n#define mcuxClCss_ResetIntFlags  mcuxClEls_ResetIntFlags\r\n#define mcuxClCss_Reset_Async  mcuxClEls_Reset_Async\r\n#define mcuxClCss_RespGen_Async  mcuxClEls_RespGen_Async\r\n#define mcuxClCss_Rng_DrbgRequestRaw_Async  mcuxClEls_Rng_DrbgRequestRaw_Async\r\n#define mcuxClCss_Rng_DrbgRequest_Async  mcuxClEls_Rng_DrbgRequest_Async\r\n#define mcuxClCss_Rng_DrbgTestAesCtr_Async  mcuxClEls_Rng_DrbgTestAesCtr_Async\r\n#define mcuxClCss_Rng_DrbgTestAesEcb_Async  mcuxClEls_Rng_DrbgTestAesEcb_Async\r\n#define mcuxClCss_Rng_DrbgTestExtract_Async  mcuxClEls_Rng_DrbgTestExtract_Async\r\n#define mcuxClCss_Rng_DrbgTestInstantiate_Async  mcuxClEls_Rng_DrbgTestInstantiate_Async\r\n#define mcuxClCss_Rng_Dtrng_ConfigEvaluate_Async  mcuxClEls_Rng_Dtrng_ConfigEvaluate_Async\r\n#define mcuxClCss_Rng_Dtrng_ConfigLoadPrv_Async  mcuxClEls_Rng_Dtrng_ConfigLoadPrv_Async\r\n#define mcuxClCss_Rng_Dtrng_ConfigLoad_Async  mcuxClEls_Rng_Dtrng_ConfigLoad_Async\r\n#define mcuxClCss_SetIntEnableFlags  mcuxClEls_SetIntEnableFlags\r\n#define mcuxClCss_SetIntFlags  mcuxClEls_SetIntFlags\r\n#define mcuxClCss_SetMasterUnlock  mcuxClEls_SetMasterUnlock\r\n#define mcuxClCss_SetRandomStartDelay  mcuxClEls_SetRandomStartDelay\r\n#define mcuxClCss_ShaDirect_Disable  mcuxClEls_ShaDirect_Disable\r\n#define mcuxClCss_ShaDirect_Enable  mcuxClEls_ShaDirect_Enable\r\n#define mcuxClCss_TlsGenerateMasterKeyFromPreMasterKey_Async  mcuxClEls_TlsGenerateMasterKeyFromPreMasterKey_Async\r\n#define mcuxClCss_TlsGenerateSessionKeysFromMasterKey_Async  mcuxClEls_TlsGenerateSessionKeysFromMasterKey_Async\r\n#define mcuxClCss_UpdateRefCRC  mcuxClEls_UpdateRefCRC\r\n#define mcuxClCss_VerifyVsRefCRC  mcuxClEls_VerifyVsRefCRC\r\n#define mcuxClCss_WaitForOperation  mcuxClEls_WaitForOperation\r\n\r\n/**\r\n * There are also corresponding changes in other components:\r\n * mcuxClMac_Mode_HMAC_SHA2_256_CSS  ->  mcuxClMac_Mode_HMAC_SHA2_256_ELS\r\n * mcuxClRandomModes_Mode_CSS_Drbg   ->  mcuxClRandomModes_Mode_ELS_Drbg\r\n */\r\n\r\n#endif /* MCUXCLELS_MAPPING_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/src/mcuxClEls_Common.c",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClEls_Common.c\r\n *  @brief ELS implementation for common functionality.\r\n *  This file implements the functions declared in mcuxClEls_Common.h and adds helper functions used by other implementation headers. */\r\n\r\n#include <stdbool.h>\r\n#include <platform_specific_headers.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxClCore_FunctionIdentifiers.h>\r\n#include <mcuxClEls.h>\r\n#include <internal/mcuxClEls_Internal.h>\r\n#include <internal/mcuxClEls_Internal_Common.h>\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_GetHwVersion)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GetHwVersion(\r\n    mcuxClEls_HwVersion_t * result)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_GetHwVersion);\r\n    result->word.value = MCUXCLELS_SFR_READ(ELS_VERSION);\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_GetHwVersion, MCUXCLELS_STATUS_OK);\r\n}\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_HWCONFIG\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_GetHwConfig)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GetHwConfig(\r\n    mcuxClEls_HwConfig_t * result)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_GetHwConfig);\r\n    result->word.value = MCUXCLELS_SFR_READ(ELS_CONFIG);\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_GetHwConfig, MCUXCLELS_STATUS_OK);\r\n}\r\n#endif /* MCUXCL_FEATURE_ELS_HWCONFIG */\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_GetHwState)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GetHwState(\r\n    mcuxClEls_HwState_t * result)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_GetHwState);\r\n    result->word.value = MCUXCLELS_SFR_READ(ELS_STATUS);\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_GetHwState, MCUXCLELS_STATUS_OK);\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_Enable_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Enable_Async(\r\n    void)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_Enable_Async);\r\n    const uint32_t sfrVal =  MCUXCLELS_SFR_FIELD_FORMAT(ELS_CTRL, ELS_EN, 1u);\r\n    MCUXCLELS_SFR_WRITE(ELS_CTRL, sfrVal);\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_Enable_Async, MCUXCLELS_STATUS_OK_WAIT);\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_Disable)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Disable(\r\n    void)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_Disable);\r\n    MCUXCLELS_SET_CTRL_FIELD(MCUXCLELS_SFR_CTRL_ELS_EN, 0u);\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_Disable, MCUXCLELS_STATUS_OK);\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_GetErrorCode)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GetErrorCode(\r\n    mcuxClEls_ErrorHandling_t errorHandling)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_GetErrorCode);\r\n\r\n    mcuxClEls_Status_t result = MCUXCLELS_STATUS_SW_FAULT;\r\n    if (1U == MCUXCLELS_GET_STATUS_FIELD(MCUXCLELS_SFR_STATUS_ELS_ERR))\r\n    {\r\n        if (MCUXCLELS_IS_ERROR_BIT_SET(MCUXCLELS_SFR_ERR_STATUS_FLT_ERR))\r\n        {\r\n            result = MCUXCLELS_STATUS_HW_FAULT;\r\n        }\r\n        else if (MCUXCLELS_IS_ERROR_BIT_SET(MCUXCLELS_SFR_ERR_STATUS_ITG_ERR))\r\n        {\r\n            result = MCUXCLELS_STATUS_HW_INTEGRITY;\r\n        }\r\n        else if (MCUXCLELS_IS_ERROR_BIT_SET(MCUXCLELS_SFR_ERR_STATUS_OPN_ERR))\r\n        {\r\n            result = MCUXCLELS_STATUS_HW_OPERATIONAL;\r\n        }\r\n        else if (MCUXCLELS_IS_ERROR_BIT_SET(MCUXCLELS_SFR_ERR_STATUS_ALG_ERR))\r\n        {\r\n            result = MCUXCLELS_STATUS_HW_ALGORITHM;\r\n        }\r\n        else if (MCUXCLELS_IS_ERROR_BIT_SET(MCUXCLELS_SFR_ERR_STATUS_BUS_ERR))\r\n        {\r\n            result = MCUXCLELS_STATUS_HW_BUS;\r\n        }\r\n        else if (MCUXCLELS_IS_ERROR_BIT_SET(MCUXCLELS_SFR_ERR_STATUS_PRNG_ERR))\r\n        {\r\n            result = MCUXCLELS_STATUS_HW_PRNG;\r\n        }\r\n        else if (MCUXCLELS_IS_ERROR_BIT_SET(MCUXCLELS_SFR_ERR_STATUS_DTRNG_ERR))\r\n        {\r\n            result = MCUXCLELS_STATUS_HW_DTRNG;\r\n        }\r\n        else\r\n        {\r\n            result = MCUXCLELS_STATUS_SW_FAULT;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        result = MCUXCLELS_STATUS_OK;\r\n    }\r\n\r\n    if (MCUXCLELS_ERROR_FLAGS_CLEAR == errorHandling){\r\n        MCUX_CSSL_FP_FUNCTION_CALL_VOID(mcuxClEls_ResetErrorFlags()); /* always returns MCUXCLELS_STATUS_OK. */\r\n\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_GetErrorCode, result,\r\n            MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClEls_ResetErrorFlags));\r\n    }\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_GetErrorCode, result);\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_GetErrorLevel)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GetErrorLevel(\r\n    mcuxClEls_ErrorHandling_t errorHandling,\r\n    uint32_t *errorLevel)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_GetErrorLevel);\r\n\r\n    *errorLevel = MCUXCLELS_GET_ERROR_STATUS_FIELD(MCUXCLELS_SFR_ERR_STATUS_ERR_LVL);\r\n\r\n    MCUX_CSSL_FP_FUNCTION_CALL(result, mcuxClEls_GetErrorCode(errorHandling));\r\n\r\n    /* Exit function with expectation: mcuxClEls_GetErrorCode was called unconditionally */\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_GetErrorLevel, result,\r\n        MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClEls_GetErrorCode));\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_WaitForOperation)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_WaitForOperation(\r\n    mcuxClEls_ErrorHandling_t errorHandling)\r\n{\r\n    /* Enter flow-protected function with expectation: mcuxClEls_GetErrorCode will be called (unconditionally) */\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_WaitForOperation,\r\n        MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClEls_GetErrorCode));\r\n\r\n    while (mcuxClEls_isBusy())\r\n    {\r\n        // Do nothing\r\n    }\r\n\r\n    MCUX_CSSL_FP_FUNCTION_CALL(result, mcuxClEls_GetErrorCode(errorHandling));\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_WaitForOperation, result);\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_LimitedWaitForOperation)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_LimitedWaitForOperation(\r\n    uint32_t counterLimit,\r\n    mcuxClEls_ErrorHandling_t errorHandling)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_LimitedWaitForOperation);\r\n\r\n    bool counterExpired = true;\r\n    while (0U != counterLimit)\r\n    {\r\n        if (!mcuxClEls_isBusy())\r\n        {\r\n            counterExpired = false;\r\n            break;\r\n        }\r\n        counterLimit--;\r\n    }\r\n\r\n    if (true == counterExpired)\r\n    {\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_LimitedWaitForOperation, MCUXCLELS_STATUS_SW_COUNTER_EXPIRED);\r\n    }\r\n\r\n    MCUX_CSSL_FP_FUNCTION_CALL(result, mcuxClEls_GetErrorCode(errorHandling));\r\n\r\n    /* Exit function with expectation: mcuxClEls_GetErrorCode was called */\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_LimitedWaitForOperation, result,\r\n        MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClEls_GetErrorCode));\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_ResetErrorFlags)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_ResetErrorFlags(\r\n    void)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_ResetErrorFlags);\r\n    const uint32_t sfrVal = MCUXCLELS_SFR_FIELD_FORMAT(ELS_ERR_STATUS, CLR_ERR_CLR, MCUXCLELS_ERROR_FLAGS_CLEAR);\r\n    MCUXCLELS_SFR_WRITE(ELS_ERR_STATUS_CLR, sfrVal);\r\n    // Poll error bit to be sure that error bits has been cleared. Required by HW spec.\r\n    while(0u != MCUXCLELS_GET_STATUS_FIELD(MCUXCLELS_SFR_STATUS_ELS_ERR))\r\n    {\r\n        // Do nothing\r\n    }\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_ResetErrorFlags, MCUXCLELS_STATUS_OK);\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_Reset_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_Reset_Async(\r\n    mcuxClEls_ResetOption_t options)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_Reset_Async);\r\n\r\n    if (mcuxClEls_isBusy() && (MCUXCLELS_RESET_DO_NOT_CANCEL == options))\r\n    {\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_Reset_Async, MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT);\r\n    }\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_ITERATIVE_SEEDING\r\n    /* Set the drbg_block_counter to a value triggering a reseed after the upcoming RESET operation via interrupt */\r\n    mcuxClEls_rng_drbg_block_counter = MCUXCLELS_RNG_DRBG_BLOCK_COUNTER_THRESHOLD;\r\n#endif /* MCUXCL_FEATURE_ELS_ITERATIVE_SEEDING */\r\n\r\n    MCUXCLELS_SET_CTRL_FIELD(MCUXCLELS_SFR_CTRL_RESET, 1u);\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_Reset_Async, MCUXCLELS_STATUS_OK_WAIT);\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_SetIntEnableFlags)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_SetIntEnableFlags(\r\n    mcuxClEls_InterruptOptionEn_t options)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_SetIntEnableFlags);\r\n    MCUXCLELS_SFR_WRITE(ELS_INT_ENABLE, options.word.value);\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_SetIntEnableFlags, MCUXCLELS_STATUS_OK);\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_GetIntEnableFlags)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GetIntEnableFlags(\r\n    mcuxClEls_InterruptOptionEn_t * result)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_GetIntEnableFlags);\r\n    result->word.value = MCUXCLELS_SFR_READ(ELS_INT_ENABLE);\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_GetIntEnableFlags, MCUXCLELS_STATUS_OK);\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_ResetIntFlags)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_ResetIntFlags(\r\n    mcuxClEls_InterruptOptionRst_t options)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_ResetIntFlags);\r\n    MCUXCLELS_SFR_WRITE(ELS_INT_STATUS_CLR, options.word.value);\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_ResetIntFlags, MCUXCLELS_STATUS_OK);\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_SetIntFlags)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_SetIntFlags(\r\n    mcuxClEls_InterruptOptionSet_t options)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_SetIntFlags);\r\n    MCUXCLELS_SFR_WRITE(ELS_INT_STATUS_SET, options.word.value);\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_SetIntFlags, MCUXCLELS_STATUS_OK);\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_SetRandomStartDelay)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_SetRandomStartDelay(\r\n    uint32_t startDelay)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_SetRandomStartDelay);\r\n    MCUXCLELS_INPUT_PARAM_CHECK_PROTECTED(mcuxClEls_SetRandomStartDelay, 1024u < startDelay);\r\n\r\n    if (mcuxClEls_isBusy())\r\n    {\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_SetRandomStartDelay, MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT);\r\n    }\r\n\r\n    MCUXCLELS_SET_CFG_FIELD(MCUXCLELS_SFR_CFG_ADCTRL, startDelay);\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_SetRandomStartDelay, MCUXCLELS_STATUS_OK);\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_GetRandomStartDelay)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GetRandomStartDelay(\r\n    uint32_t *startDelay)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_GetRandomStartDelay);\r\n\r\n    *startDelay = MCUXCLELS_GET_CFG_FIELD(MCUXCLELS_SFR_CFG_ADCTRL);\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_GetRandomStartDelay, MCUXCLELS_STATUS_OK);\r\n}\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_LOCKING\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_GetLock)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GetLock(\r\n    uint32_t * pSessionId)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_GetLock);\r\n\r\n    *pSessionId = MCUXCLELS_SFR_READ(ELS_SESSION_ID);\r\n    if(0u == *pSessionId)\r\n    {\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_GetLock, MCUXCLELS_STATUS_SW_LOCKING_FAILED);\r\n    }\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_GetLock, MCUXCLELS_STATUS_OK);\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_ReleaseLock)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_ReleaseLock(\r\n    uint32_t sessionId)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_ReleaseLock);\r\n    MCUXCLELS_SFR_WRITE(ELS_SESSION_ID, sessionId);\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_ReleaseLock, MCUXCLELS_STATUS_OK);\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_IsLocked)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_IsLocked(\r\n    void)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_IsLocked);\r\n\r\n    if(1u == MCUXCLELS_GET_STATUS_FIELD(MCUXCLELS_SFR_STATUS_ELS_LOCKED))\r\n    {\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_IsLocked, MCUXCLELS_STATUS_SW_STATUS_LOCKED);\r\n    }\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_IsLocked, MCUXCLELS_STATUS_OK);\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_SetMasterUnlock)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_SetMasterUnlock(\r\n    uint32_t masterId)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_SetMasterUnlock);\r\n    MCUXCLELS_SFR_WRITE(ELS_MASTER_ID, masterId);\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_SetMasterUnlock, MCUXCLELS_STATUS_OK);\r\n}\r\n#endif /* MCUXCL_FEATURE_ELS_LOCKING */\r\n\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_DMA_ADDRESS_READBACK\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_GetLastDmaAddress)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GetLastDmaAddress(uint32_t* pLastAddress)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_GetLastDmaAddress);\r\n\r\n    *pLastAddress = MCUXCLELS_SFR_READ(ELS_DMA_FIN_ADDR);\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_GetLastDmaAddress, MCUXCLELS_STATUS_OK);\r\n\r\n}\r\n#endif /* MCUXCL_FEATURE_ELS_DMA_ADDRESS_READBACK */\r\n\r\n#ifdef MCUXCL_FEATURE_ELS_DMA_FINAL_ADDRESS_READBACK\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_CompareDmaFinalOutputAddress)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_CompareDmaFinalOutputAddress(\r\n        uint8_t *outputStartAddress,\r\n        size_t expectedLength)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_CompareDmaFinalOutputAddress,\r\n                               MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClEls_GetLastDmaAddress));\r\n\r\n    /* Calculate the expected final address from the input */\r\n    uint32_t expectedFinalAddress = (uint32_t)outputStartAddress + expectedLength;\r\n\r\n    /* Get the actual final address from ELS - no result check as function always returns OK */\r\n    uint32_t finalAddress;\r\n    MCUX_CSSL_FP_FUNCTION_CALL_VOID(mcuxClEls_GetLastDmaAddress(&finalAddress));\r\n\r\n    /* Compare the expected address to the actual one */\r\n    if(finalAddress != expectedFinalAddress)\r\n    {\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_CompareDmaFinalOutputAddress, MCUXCLELS_STATUS_SW_COMPARISON_FAILED);\r\n    }\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_CompareDmaFinalOutputAddress, MCUXCLELS_STATUS_OK);\r\n\r\n}\r\n#endif /* MCUXCL_FEATURE_ELS_DMA_FINAL_ADDRESS_READBACK */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClEls/src/mcuxClEls_GlitchDetector.c",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2022 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClEls_GlitchDetector.c\r\n *  @brief ELS implementation for key management.\r\n * This file implements the functions declared in mcuxClEls_GlitchDetector.h. */\r\n\r\n#include <mcuxClEls_GlitchDetector.h>\r\n#include <stdbool.h>\r\n#include <mcuxClEls.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxClCore_FunctionIdentifiers.h>\r\n#include <internal/mcuxClEls_Internal.h>\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_GlitchDetector_LoadConfig_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GlitchDetector_LoadConfig_Async(\r\n    uint8_t const * pInput)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_GlitchDetector_LoadConfig_Async);\r\n    \r\n    /* ELS SFRs are not cached => Tell SW to wait for ELS to come back from BUSY state before modifying the SFRs */\r\n    if (mcuxClEls_isBusy())\r\n    {\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_GlitchDetector_LoadConfig_Async, MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT);\r\n    }\r\n    \r\n    mcuxClEls_setInput0_fixedSize(pInput);\r\n    mcuxClEls_startCommand(ID_CFG_ELS_CMD_GDET_CFG_LOAD, 0U, ELS_CMD_BIG_ENDIAN);\r\n    \r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_GlitchDetector_LoadConfig_Async, MCUXCLELS_STATUS_OK_WAIT);\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_GlitchDetector_Trim_Async)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GlitchDetector_Trim_Async(\r\n    uint8_t * pOutput)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_GlitchDetector_Trim_Async);\r\n    \r\n    /* ELS SFRs are not cached => Tell SW to wait for ELS to come back from BUSY state before modifying the SFRs */\r\n    if (mcuxClEls_isBusy())\r\n    {\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_GlitchDetector_Trim_Async, MCUXCLELS_STATUS_SW_CANNOT_INTERRUPT);\r\n    }\r\n    \r\n    mcuxClEls_setOutput_fixedSize(pOutput);\r\n    mcuxClEls_startCommand(ID_CFG_ELS_CMD_GDET_TRIM, 0U, ELS_CMD_BIG_ENDIAN);\r\n\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_GlitchDetector_Trim_Async, MCUXCLELS_STATUS_OK_WAIT);\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_GlitchDetector_GetEventCounter)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GlitchDetector_GetEventCounter(\r\n    uint8_t * pCount)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_GlitchDetector_GetEventCounter);\r\n\r\n    // Decode from Gray coding\r\n    uint8_t count8 = (uint8_t) MCUXCLELS_GET_GDET_EVTCNT_FIELD(MCUXCLELS_SFR_GDET_EVTCNT_GDET_EVTCNT);\r\n    count8 ^= count8 >> 4u;\r\n    count8 ^= count8 >> 2u;\r\n    count8 ^= count8 >> 1u;\r\n    \r\n    // Assign to the result variable\r\n    *pCount = count8;\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_GlitchDetector_GetEventCounter, MCUXCLELS_STATUS_OK);\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClEls_GlitchDetector_ResetEventCounter)\r\nMCUXCLELS_API MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClEls_Status_t) mcuxClEls_GlitchDetector_ResetEventCounter(\r\n    void)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClEls_GlitchDetector_ResetEventCounter);\r\n\r\n    // Start GDET Event Counter reset\r\n    MCUXCLELS_SFR_WRITE(ELS_GDET_EVTCNT_CLR, 1u);\r\n\r\n    // The actual reset occurs in a different clock domain from the ELS core clock, so we have to wait for synchroni-\r\n    // zation. The spec states that this takes on the order of 2 cycles of the ELS core clock plus 2 cycles of the\r\n    // Glitch Detector reference clock.\r\n    while(1u != MCUXCLELS_GET_GDET_EVTCNT_FIELD(MCUXCLELS_SFR_GDET_EVTCNT_GDET_EVTCNT_CLR_DONE))\r\n    {\r\n        // Do nothing\r\n    }\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClEls_GlitchDetector_ResetEventCounter, MCUXCLELS_STATUS_OK);\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/internal/mcuxClMemory_ClearSecure_Internal.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_ClearSecure_Internal.h\r\n *  @brief Memory header for secure clear function.\r\n * This header exposes functions that enable secure memory clear function.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClMemory_Clear_Secure_Internal mcuxClMemory_Clear_Secure_Internal\r\n * @brief This function clears all bytes in a memory region to null in a secure way \r\n * when a secure clear is available.\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_CLEARSECURE_INTERNAL_H_\r\n#define MCUXCLMEMORY_CLEARSECURE_INTERNAL_H_\r\n\r\n#include <mcuxClConfig.h>  // Exported features flags header\r\n\r\n#include <mcuxClCore_Platform.h>\r\n#include <mcuxClMemory_Constants.h>\r\n#include <mcuxClMemory_Types.h>\r\n#include <mcuxClToolchain.h>\r\n#include <mcuxCsslAnalysis.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <internal/mcuxClMemory_SetSecure_Internal.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n\r\n/**\r\n * Sets all bytes of a memory buffer to a specified value.\r\n *\r\n * The two buffers must not overlap.\r\n * \r\n * * Data Integrity: Record(pSrc + pDst + length)\r\n *  \r\n * @param[out]  pDst       pointer to the buffer to be set.\r\n * @param[in]   length     size (in bytes) to be set.\r\n *\r\n * @return A status code encapsulated in a flow-protection type.\r\n * @retval #MCUXCLMEMORY_STATUS_OK                 If @p length bytes cleared at @p pDst.\r\n * @retval #MCUXCLMEMORY_STATUS_FAULT\r\n */\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClMemory_clear_secure_int)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClMemory_Status_t) mcuxClMemory_clear_secure_int\r\n(\r\n    uint8_t * pDst,\r\n    uint32_t length\r\n)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClMemory_clear_secure_int);\r\n\r\n        MCUX_CSSL_FP_FUNCTION_CALL(retval, mcuxClMemory_set_secure_int(pDst, 0u, length));\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClMemory_clear_secure_int, retval, MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_set_secure_int));\r\n}\r\n\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLMEMORY_CLEARSECURE_INTERNAL_H_ */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/internal/mcuxClMemory_Clear_Internal.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2021, 2023 NXP                                            */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_Clear_Internal.h\r\n *  @brief Memory header for clear function.\r\n * This header exposes functions that enable using memory clear function.\r\n */\r\n\r\n\r\n/**\r\n * @defgroup mcuxClMemory_Clear_Internal mcuxClMemory_Clear_Internal\r\n * @brief This function clears a memory region.\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n\r\n#ifndef MCUXCLMEMORY_CLEAR_INTERNAL_H_\r\n#define MCUXCLMEMORY_CLEAR_INTERNAL_H_\r\n\r\n#include <mcuxClConfig.h>  // Exported features flags header\r\n\r\n#include <mcuxClCore_Platform.h>\r\n#include <mcuxClMemory_Constants.h>\r\n#include <mcuxClMemory_Types.h>\r\n#include <mcuxClToolchain.h>\r\n#include <mcuxCsslAnalysis.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxCsslDataIntegrity.h>\r\n#include <mcuxCsslMemory.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n\r\n/**\r\n * Sets all bytes of a memory buffer to a specified value.\r\n *\r\n * The two buffers must not overlap.\r\n * \r\n * * Data Integrity: Record(pDst + length)\r\n *  \r\n * @param[out]  pDst       pointer to the buffer to be set.\r\n * @param[in]   length     size (in bytes) to be set.\r\n *\r\n * @return A status code encapsulated in a flow-protection type.\r\n * @retval #MCUXCLMEMORY_STATUS_OK                 If @p length bytes cleared at @p pDst.\r\n * @retval #MCUXCLMEMORY_STATUS_FAULT\r\n */\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClMemory_clear_int)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClMemory_Status_t) mcuxClMemory_clear_int\r\n(\r\n    uint8_t * pDst,\r\n    uint32_t length\r\n)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClMemory_clear_int);\r\n\r\n        mcuxClMemory_Status_t retval = MCUXCLMEMORY_STATUS_FAULT;\r\n        MCUX_CSSL_FP_FUNCTION_CALL(csslRetval, mcuxCsslMemory_Clear(\r\n            mcuxCsslParamIntegrity_Protect(3u, pDst, length, length),\r\n            pDst,\r\n            length,\r\n            length));\r\n        retval = (mcuxClMemory_Status_t) csslRetval ^ (MCUXCSSLMEMORY_COMPONENT_MASK ^ MCUXCLMEMORY_COMPONENT_MASK);\r\n        MCUX_CSSL_DI_RECORD(identifier /* Not used */, (uint32_t) pDst + length);  // Unbalance the SC\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClMemory_clear_int, retval, MCUX_CSSL_FP_FUNCTION_CALLED(mcuxCsslMemory_Clear));\r\n}\r\n\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLMEMORY_CLEAR_INTERNAL_H_ */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/internal/mcuxClMemory_CompareDPASecure_Internal.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_CompareDPASecure_Internal.h\r\n *  @brief Memory header for dpa secure compare function.\r\n * This header exposes functions that enable dpa secure memory compare function.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClMemory_Compare_DPASecure_Internal mcuxClMemory_Compare_DPASecure_Internal\r\n * @brief This function compares two memory region @p lhs and @p rhs.\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_COMPARE_DPA_SECURE_INTERNAL_H_\r\n#define MCUXCLMEMORY_COMPARE_DPA_SECURE_INTERNAL_H_\r\n\r\n#include <mcuxClConfig.h>  // Exported features flags header\r\n\r\n#include <mcuxClCore_Platform.h>\r\n#include <mcuxClMemory_Constants.h>\r\n#include <mcuxClMemory_Types.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxClSession_Types.h>\r\n#include <internal/mcuxClMemory_CompareSecure_Internal.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n\r\n/**\r\n * Compares two memory buffers with security against fault and DPA.\r\n *\r\n * The two buffers must not overlap.\r\n * \r\n * * Data Integrity: Record(pLhs + pRhs + length)\r\n *  \r\n * @param[in]  session     Handle for the current CL session.\r\n * @param[in]  pLhs        pointer to the left buffer to be compared.\r\n * @param[in]  pRhs        pointer to the right buffer to be compared.\r\n * @param[in]  length      size (in bytes) to be compared.\r\n * \r\n * @return A status code encapsulated in a flow-protection type.\r\n * @retval #MCUXCLMEMORY_STATUS_EQUAL                 If length bytes of Lhs and Rhs are equal.\r\n * @retval #MCUXCLMEMORY_STATUS_NOT_EQUAL             If at least one bytes differ between the two.\r\n * @retval #MCUXCLMEMORY_STATUS_FAULT\r\n */\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClMemory_compare_dpasecure_int)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClMemory_Status_t) mcuxClMemory_compare_dpasecure_int\r\n(\r\n    mcuxClSession_Handle_t session,\r\n    const uint8_t * pLhs,\r\n    const uint8_t * pRhs,\r\n    uint32_t length\r\n)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClMemory_compare_dpasecure_int);\r\n\r\n        (void)session;\r\n        MCUX_CSSL_FP_FUNCTION_CALL(retClCompare, mcuxClMemory_compare_secure_int(pLhs, pRhs, length));\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClMemory_compare_dpasecure_int, retClCompare, MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_compare_secure_int));\r\n}\r\n\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLMEMORY_COMPARE_DPA_SECURE_INTERNAL_H_ */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/internal/mcuxClMemory_CompareSecure_Internal.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_CompareSecure_Internal.h\r\n *  @brief Memory header for compare function.\r\n * This header exposes functions that enable secure memory compare function.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClMemory_Compare_Internal mcuxClMemory_Compare_Secure_Internal\r\n * @brief This function compares two memory region @p lhs and @p rhs.\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_COMPARE_SECURE_INTERNAL_H_\r\n#define MCUXCLMEMORY_COMPARE_SECURE_INTERNAL_H_\r\n\r\n#include <mcuxClConfig.h>  // Exported features flags header\r\n\r\n#include <mcuxClCore_Platform.h>\r\n#include <mcuxClMemory_Constants.h>\r\n#include <mcuxClMemory_Types.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <internal/mcuxClMemory_Compare_Internal.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n\r\n/**\r\n * Compares two memory buffers with security against fault and SPA.\r\n *\r\n * The two buffers must not overlap.\r\n * \r\n * * Data Integrity: Record(pLhs + pRhs + length)\r\n *  \r\n * @param[in]  pLhs        pointer to the left buffer to be compared.\r\n * @param[in]  pRhs        pointer to the right buffer to be compared.\r\n * @param[in]  length      size (in bytes) to be compared.\r\n * \r\n * @return A status code encapsulated in a flow-protection type.\r\n * @retval #MCUXCLMEMORY_STATUS_EQUAL                 If length bytes of Lhs and Rhs are equal.\r\n * @retval #MCUXCLMEMORY_STATUS_NOT_EQUAL             If at least one bytes differ between the two.\r\n * @retval #MCUXCLMEMORY_STATUS_FAULT\r\n */\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClMemory_compare_secure_int)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClMemory_Status_t) mcuxClMemory_compare_secure_int\r\n(\r\n    const uint8_t * pLhs,\r\n    const uint8_t * pRhs,\r\n    uint32_t length\r\n)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClMemory_compare_secure_int);\r\n\r\n        MCUX_CSSL_FP_FUNCTION_CALL(retClCompare, mcuxClMemory_compare_int(pLhs, pRhs, length));\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClMemory_compare_secure_int, retClCompare, MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_compare_int));\r\n}\r\n\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLMEMORY_COMPARE_SECURE_INTERNAL_H_ */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/internal/mcuxClMemory_Compare_Internal.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_Compare_Internal.h\r\n *  @brief Memory header for internal compare function.\r\n * This header exposes functions that enable memory compare function.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClMemory_Compare_Internal mcuxClMemory_Compare_Internal\r\n * @brief This function compares two memory region @p lhs and @p rhs.\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_COMPARE_INTERNAL_H_\r\n#define MCUXCLMEMORY_COMPARE_INTERNAL_H_\r\n\r\n#include <mcuxClConfig.h>  // Exported features flags header\r\n\r\n#include <mcuxClCore_Platform.h>\r\n#include <mcuxClMemory_Constants.h>\r\n#include <mcuxClMemory_Types.h>\r\n#include <mcuxCsslMemory.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxCsslDataIntegrity.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n\r\n/**\r\n * Compares two memory buffer with security agains faults.\r\n *\r\n * The two buffers must not overlap.\r\n * \r\n * * Data Integrity: Record(pLhs + pRhs + length)\r\n *  \r\n * @param[in]  pLhs        pointer to the left buffer to be compared.\r\n * @param[in]  pRhs        pointer to the right buffer to be compared.\r\n * @param[in]  length      size (in bytes) to be compared.\r\n * \r\n * @return A status code encapsulated in a flow-protection type.\r\n * @retval #MCUXCLMEMORY_STATUS_EQUAL                 If length bytes of Lhs and Rhs are equal.\r\n * @retval #MCUXCLMEMORY_STATUS_NOT_EQUAL             If at least one bytes differ between the two.\r\n * @retval #MCUXCLMEMORY_STATUS_FAULT\r\n */\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClMemory_compare_int)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClMemory_Status_t) mcuxClMemory_compare_int\r\n(\r\n    const uint8_t * pLhs,\r\n    const uint8_t * pRhs,\r\n    uint32_t length\r\n)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClMemory_compare_int);\r\n\r\n    mcuxClMemory_Status_t retval = MCUXCLMEMORY_STATUS_FAULT;\r\n\r\n        MCUX_CSSL_FP_FUNCTION_CALL(csslRetval, \r\n            mcuxCsslMemory_Compare(mcuxCsslParamIntegrity_Protect(3u,  pLhs, pRhs, length),\r\n            pLhs, pRhs, length));\r\n        retval = (mcuxClMemory_Status_t) csslRetval ^ (MCUXCSSLMEMORY_COMPONENT_MASK ^ MCUXCLMEMORY_COMPONENT_MASK);  // May return invalid parameters too.\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClMemory_compare_int, retval, MCUX_CSSL_FP_FUNCTION_CALLED(mcuxCsslMemory_Compare));\r\n}\r\n\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLMEMORY_COMPARE_INTERNAL_H_ */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/internal/mcuxClMemory_CopySecurePow2_Internal.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_CopySecurePow2_Internal.h\r\n *  @brief Memory header for copy functions.\r\n * This header exposes functions that enable secure memory copy function.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClMemory_CopySecurePow2_Internal mcuxClMemory_CopySecurePow2_Internal\r\n * @brief This function securely copies a memory region from @p src to @p dst when a secure copy is available.\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_COPYSECURE_ALIGNED_INTERNAL_H_\r\n#define MCUXCLMEMORY_COPYSECURE_ALIGNED_INTERNAL_H_\r\n\r\n#include <mcuxClConfig.h>  // Exported features flags header\r\n\r\n#include <mcuxClCore_Platform.h>\r\n#include <mcuxClMemory_Constants.h>\r\n#include <mcuxClMemory_Types.h>\r\n#include <mcuxClToolchain.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <internal/mcuxClMemory_CopySecure_Internal.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n\r\n/**\r\n * Copies a memory buffer to another location with security against fault and SPA.\r\n *\r\n * The two buffers must not overlap.\r\n * \r\n * * Data Integrity: Record(pSrc + pDst + length)\r\n *  \r\n * @param[out] pDst        pointer to the buffer to be copied to.\r\n * @param[in]  pSrc        pointer to the buffer to copy.\r\n * @param[in]  length      size (in bytes) to be copied.\r\n *\r\n * @return A status code encapsulated in a flow-protection type.\r\n * @retval #MCUXCLMEMORY_STATUS_OK                 If @p length bytes copied at @p pDst.\r\n * @retval #MCUXCLMEMORY_STATUS_FAULT\r\n */\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClMemory_copy_secure_pow2_int)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClMemory_Status_t) mcuxClMemory_copy_secure_pow2_int\r\n(\r\n    uint8_t * pDst,\r\n    uint8_t const * pSrc,\r\n    uint32_t length\r\n)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClMemory_copy_secure_pow2_int);\r\n\r\n        MCUX_CSSL_FP_FUNCTION_CALL(retval, mcuxClMemory_copy_secure_int(pDst, pSrc, length));\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClMemory_copy_secure_pow2_int, retval, MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_copy_secure_int));\r\n}\r\n\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLMEMORY_COPYSECURE_ALIGNED_INTERNAL_H_ */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/internal/mcuxClMemory_CopySecure_Internal.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_CopySecure_Internal.h\r\n *  @brief Memory header for copy functions.\r\n * This header exposes functions that enable secure memory copy function.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClMemory_Copy_Secure_Internal mcuxClMemory_Copy_Secure_Internal\r\n * @brief This function securely copies a memory region from @p src to @p dst when a secure copy is available.\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_COPYSECURE_INTERNAL_H_\r\n#define MCUXCLMEMORY_COPYSECURE_INTERNAL_H_\r\n\r\n#include <mcuxClConfig.h>  // Exported features flags header\r\n\r\n#include <mcuxClCore_Platform.h>\r\n#include <mcuxClMemory_Constants.h>\r\n#include <mcuxClMemory_Types.h>\r\n#include <mcuxClToolchain.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <internal/mcuxClMemory_Copy_Internal.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n\r\n/**\r\n * Copies a memory buffer to another location with security against fault and SPA.\r\n *\r\n * The two buffers must not overlap.\r\n * \r\n * * Data Integrity: Record(pSrc + pDst + length)\r\n *  \r\n * @param[out] pDst        pointer to the buffer to be copied to.\r\n * @param[in]  pSrc        pointer to the buffer to copy.\r\n * @param[in]  length      size (in bytes) to be copied.\r\n *\r\n * @return A status code encapsulated in a flow-protection type.\r\n * @retval #MCUXCLMEMORY_STATUS_OK                 If @p length bytes copied at @p pDst.\r\n * @retval #MCUXCLMEMORY_STATUS_FAULT\r\n */\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClMemory_copy_secure_int)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClMemory_Status_t) mcuxClMemory_copy_secure_int\r\n(\r\n    uint8_t * pDst,\r\n    uint8_t const * pSrc,\r\n    uint32_t length\r\n)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClMemory_copy_secure_int);\r\n\r\n        MCUX_CSSL_FP_FUNCTION_CALL(retval, mcuxClMemory_copy_int(pDst, pSrc, length));\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClMemory_copy_secure_int, retval, MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_copy_int));\r\n}\r\n\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLMEMORY_COPYSECURE_INTERNAL_H_ */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/internal/mcuxClMemory_CopySecure_Reversed_Internal.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_CopySecure_Reversed_Internal.h\r\n *  @brief Memory header for copy functions.\r\n * This header exposes functions that enable secure memory copy function.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClMemory_Copy_Secure_Reversed_Internal mcuxClMemory_Copy_Secure_Reversed_Internal\r\n * @brief This function securely copies a memory region from @p src to @p dst when a secure copy is available.\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_COPYSECURE_REVERSED_INTERNAL_H_\r\n#define MCUXCLMEMORY_COPYSECURE_REVERSED_INTERNAL_H_\r\n\r\n#include <mcuxClConfig.h>  // Exported features flags header\r\n\r\n#include <mcuxClCore_Platform.h>\r\n#include <mcuxClMemory_Constants.h>\r\n#include <mcuxClMemory_Types.h>\r\n#include <mcuxClToolchain.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <internal/mcuxClMemory_Copy_Reversed_Internal.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n\r\n/**\r\n * Copies a memory buffer to another location with security against fault and SPA.\r\n *\r\n * The two buffers must not overlap.\r\n * \r\n * * Data Integrity: Record(pSrc + pDst + length)\r\n *  \r\n * @param[out] pDst        pointer to the buffer to be copied to.\r\n * @param[in]  pSrc        pointer to the buffer to copy.\r\n * @param[in]  length      size (in bytes) to be copied.\r\n *\r\n * @return A status code encapsulated in a flow-protection type.\r\n * @retval #MCUXCLMEMORY_STATUS_OK                 If @p length bytes copied at @p pDst.\r\n * @retval #MCUXCLMEMORY_STATUS_FAULT\r\n */\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClMemory_copy_secure_reversed_int)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClMemory_Status_t) mcuxClMemory_copy_secure_reversed_int\r\n(\r\n    uint8_t * pDst,\r\n    uint8_t const * pSrc,\r\n    uint32_t length\r\n)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClMemory_copy_secure_reversed_int);\r\n    \r\n        MCUX_CSSL_FP_FUNCTION_CALL(retval, mcuxClMemory_copy_reversed_int(pDst, pSrc, length));\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClMemory_copy_secure_reversed_int, retval, MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_copy_reversed_int));\r\n}\r\n\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLMEMORY_COPYSECURE_REVERSED_INTERNAL_H_ */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/internal/mcuxClMemory_CopyWords_Internal.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_CopyWords_Internal.h\r\n *  @brief Memory header for copy functions.\r\n * This header exposes functions that enable memory copy word function.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClMemory_Copy_Words_Internal mcuxClMemory_Copy_Words_Internal\r\n * @brief This function copies a memory region from @p src to @p dst in a robust way\r\n * when a  copy is available.\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_COPYWORDS_INTERNAL_H_\r\n#define MCUXCLMEMORY_COPYWORDS_INTERNAL_H_\r\n\r\n#include <mcuxClConfig.h>  // Exported features flags header\r\n\r\n#include <mcuxClCore_Platform.h>\r\n#include <mcuxClMemory_Constants.h>\r\n#include <mcuxClMemory_Types.h>\r\n#include <mcuxClToolchain.h>\r\n#include <mcuxCsslAnalysis.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxClMemory_Copy.h>\r\n#include <internal/mcuxClMemory_Copy_Internal.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n\r\n/**\r\n * Copies a memory buffer to another location with security against fault only.\r\n *\r\n * The two buffers must not overlap and with length being a multiple of 4.\r\n * \r\n * * Data Integrity: Record(pSrc + pDst + length)\r\n *  \r\n * @param[out] pDst        pointer to the buffer to be copied to.\r\n * @param[in]  pSrc        pointer to the buffer to copy.\r\n * @param[in]  length      size (in bytes) to be copied.\r\n *\r\n * @return A status code encapsulated in a flow-protection type.\r\n * @retval #MCUXCLMEMORY_STATUS_OK                 If @p length bytes copied at @p pDst.\r\n * @retval #MCUXCLMEMORY_STATUS_FAULT\r\n */\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClMemory_copy_words_int)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClMemory_Status_t) mcuxClMemory_copy_words_int\r\n(\r\n    uint8_t * pDst,\r\n    uint8_t const * pSrc,\r\n    uint32_t length\r\n)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClMemory_copy_words_int);\r\n\r\n        MCUX_CSSL_FP_FUNCTION_CALL(retval, mcuxClMemory_copy_int(pDst, pSrc, length));\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClMemory_copy_words_int, retval, MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_copy_int));\r\n}\r\n\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLMEMORY_COPYWORDS_INTERNAL_H_ */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/internal/mcuxClMemory_Copy_Internal.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2021, 2023 NXP                                            */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_Copy_Internal.h\r\n *  @brief Internal memory header for copy functions.\r\n * This header exposes functions that enable using memory copy function.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClMemory_Copy_Internal mcuxClMemory_Copy_Internal\r\n * @brief This function copies a memory region from @p src to @p dst.\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_COPY_INTERNAL_H_\r\n#define MCUXCLMEMORY_COPY_INTERNAL_H_\r\n\r\n#include <mcuxClConfig.h>  // Exported features flags header\r\n\r\n#include <mcuxClCore_Platform.h>\r\n#include <mcuxClMemory_Constants.h>\r\n#include <mcuxClMemory_Types.h>\r\n#include <mcuxClToolchain.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxCsslDataIntegrity.h>\r\n#include <mcuxClMemory_Copy.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n\r\n/**\r\n * Copies a memory buffer to another location with security against fault.\r\n *\r\n * The two buffers must not overlap.\r\n * \r\n * * Data Integrity: Record(pSrc + pDst + length)\r\n *  \r\n * @param[out] pDst        pointer to the buffer to be copied to.\r\n * @param[in]  pSrc        pointer to the buffer to copy.\r\n * @param[in]  length      size (in bytes) to be copied.\r\n *\r\n * @return A status code encapsulated in a flow-protection type.\r\n * @retval #MCUXCLMEMORY_STATUS_OK                 If @p length bytes copied at @p pDst.\r\n * @retval #MCUXCLMEMORY_STATUS_FAULT\r\n */\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClMemory_copy_int)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClMemory_Status_t) mcuxClMemory_copy_int\r\n(\r\n    uint8_t * pDst,\r\n    uint8_t const * pSrc,\r\n    uint32_t length\r\n)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClMemory_copy_int);\r\n    mcuxClMemory_Status_t retval = MCUXCLMEMORY_STATUS_FAULT;\r\n\r\n        MCUX_CSSL_FP_FUNCTION_CALL_VOID(mcuxClMemory_copy(pDst, pSrc, length, length));\r\n        MCUX_CSSL_DI_RECORD(identifier /* Not used */, (uint32_t) pSrc + (uint32_t) pDst + length);  // Balance the SC\r\n        retval = MCUXCLMEMORY_STATUS_OK;\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClMemory_copy_int, retval, MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_copy));   \r\n}\r\n\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLMEMORY_COPY_INTERNAL_H_ */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/internal/mcuxClMemory_Copy_Reversed_Internal.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_Copy_Reversed_Internal.h\r\n *  @brief Memory header for copy functions.\r\n * This header exposes functions that enable secure memory copy function.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClMemory_Copy_Reversed_Internal mcuxClMemory_Copy_Reversed_Internal\r\n * @brief This function securely copies a memory region from @p src to @p dst when a secure copy is available.\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_COPY_REVERSED_INTERNAL_H_\r\n#define MCUXCLMEMORY_COPY_REVERSED_INTERNAL_H_\r\n\r\n#include <mcuxClConfig.h>  // Exported features flags header\r\n\r\n#include <mcuxClCore_Platform.h>\r\n#include <mcuxClMemory_Constants.h>\r\n#include <mcuxClMemory_Types.h>\r\n#include <mcuxClToolchain.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxCsslDataIntegrity.h>\r\n#include <mcuxClMemory_Copy_Reversed.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n\r\n/**\r\n * Copies a memory buffer to another location with security against fault.\r\n *\r\n * The two buffers must not overlap.\r\n * \r\n * * Data Integrity: Record(pSrc + pDst + length)\r\n *  \r\n * @param[out] pDst        pointer to the buffer to be copied to.\r\n * @param[in]  pSrc        pointer to the buffer to copy.\r\n * @param[in]  length      size (in bytes) to be copied.\r\n *\r\n * @return A status code encapsulated in a flow-protection type.\r\n * @retval #MCUXCLMEMORY_STATUS_OK                 If @p length bytes copied at @p pDst.\r\n * @retval #MCUXCLMEMORY_STATUS_FAULT\r\n */\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClMemory_copy_reversed_int)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClMemory_Status_t) mcuxClMemory_copy_reversed_int\r\n(\r\n    uint8_t * pDst,\r\n    uint8_t const * pSrc,\r\n    uint32_t length\r\n)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClMemory_copy_int);\r\n    mcuxClMemory_Status_t retval = MCUXCLMEMORY_STATUS_FAULT;\r\n\r\n        MCUX_CSSL_FP_FUNCTION_CALL_VOID(mcuxClMemory_copy_reversed(pDst, pSrc, length, length));\r\n        MCUX_CSSL_DI_RECORD(identifier /* Not used */, (uint32_t) pSrc + (uint32_t) pDst + length);  // Balance the SC\r\n        retval = MCUXCLMEMORY_STATUS_OK;\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClMemory_copy_int, retval, MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_copy_reversed));\r\n}\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif  /* MCUXCLMEMORY_COPY_REVERSED_INTERNAL_H_ */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/internal/mcuxClMemory_Internal.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2021, 2023 NXP                                            */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxClMemory_Internal.h\r\n * @brief Top-level include file for the internal memory operations.\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_INTERNAL_H\r\n#define MCUXCLMEMORY_INTERNAL_H\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxClCore_FunctionIdentifiers.h>\r\n#include <mcuxClMemory_Constants.h>\r\n#include <mcuxClMemory_Types.h>\r\n\r\n#include <internal/mcuxClMemory_Clear_Internal.h>\r\n#include <internal/mcuxClMemory_Compare_Internal.h>\r\n#include <internal/mcuxClMemory_Copy_Internal.h>\r\n#include <internal/mcuxClMemory_Set_Internal.h>\r\n#include <internal/mcuxClMemory_Copy_Reversed_Internal.h>\r\n#include <internal/mcuxClMemory_CopyWords_Internal.h>\r\n\r\n#include <internal/mcuxClMemory_ClearSecure_Internal.h>\r\n#include <internal/mcuxClMemory_CompareDPASecure_Internal.h>\r\n#include <internal/mcuxClMemory_CompareSecure_Internal.h>\r\n#include <internal/mcuxClMemory_CopySecure_Internal.h>\r\n#include <internal/mcuxClMemory_SetSecure_Internal.h>\r\n#include <internal/mcuxClMemory_CopySecure_Reversed_Internal.h>\r\n#include <internal/mcuxClMemory_CopySecurePow2_Internal.h>\r\n\r\n#endif /* MCUXCLMEMORY_INTERNAL_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/internal/mcuxClMemory_SetSecure_Internal.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_SetSecure_Internal.h\r\n *  @brief Memory header for set functions.\r\n * This header exposes functions that enable secure memory set function.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClMemory_Set_Secure_Internal mcuxClMemory_Set_Secure_Internal\r\n * @brief This function sets all bytes in a memory region to a specified value in a secure way \r\n * when a secure set is available.\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_SETSECURE_INTERNAL_H_\r\n#define MCUXCLMEMORY_SETSECURE_INTERNAL_H_\r\n\r\n#include <mcuxClConfig.h>  // Exported features flags header\r\n\r\n#include <mcuxClCore_Platform.h>\r\n#include <mcuxClMemory_Constants.h>\r\n#include <mcuxClMemory_Types.h>\r\n#include <mcuxClToolchain.h>\r\n#include <mcuxCsslAnalysis.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <internal/mcuxClMemory_Set_Internal.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n\r\n/**\r\n * Sets all bytes of a memory buffer to a specified value.\r\n *\r\n * The two buffers must not overlap.\r\n * \r\n * * Data Integrity: Record(pDst + length)\r\n *  \r\n * @param[out]  pDst       pointer to the buffer to be set.\r\n * @param[in]   val        byte value to be set.\r\n * @param[in]   length     size (in bytes) to be set.\r\n *\r\n * @return A status code encapsulated in a flow-protection type.\r\n * @retval #MCUXCLMEMORY_STATUS_OK                 If @p length bytes copied at @p pDst.\r\n * @retval #MCUXCLMEMORY_STATUS_FAULT\r\n */\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClMemory_set_secure_int)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClMemory_Status_t) mcuxClMemory_set_secure_int\r\n(\r\n    uint8_t * pDst,\r\n    uint8_t val,\r\n    uint32_t length\r\n)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClMemory_set_secure_int);\r\n\r\n        MCUX_CSSL_FP_FUNCTION_CALL(retval, mcuxClMemory_set_int(pDst, val, length));\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClMemory_set_secure_int, retval, MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_set_int));\r\n}\r\n\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLMEMORY_SETSECURE_INTERNAL_H_ */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/internal/mcuxClMemory_Set_Internal.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2021, 2023 NXP                                            */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_Set_Internal.h\r\n *  @brief Memory header for set function.\r\n * This header exposes functions that enable using memory set functions.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClMemory_Set_Internal mcuxClMemory_Set_Internal\r\n * @brief This function sets all bytes in a memory region to a specified value.\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_SET_INTERNAL_H_\r\n#define MCUXCLMEMORY_SET_INTERNAL_H_\r\n\r\n#include <mcuxClConfig.h>  // Exported features flags header\r\n\r\n#include <mcuxClCore_Platform.h>\r\n#include <mcuxClMemory_Constants.h>\r\n#include <mcuxClMemory_Types.h>\r\n#include <mcuxClToolchain.h>\r\n#include <mcuxCsslAnalysis.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxCsslDataIntegrity.h>\r\n#include <mcuxCsslMemory.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n\r\n/**\r\n * Sets all bytes of a memory buffer to a specified value.\r\n *\r\n * The two buffers must not overlap.\r\n * \r\n * * Data Integrity: Record(pDst + length)\r\n *  \r\n * @param[out]  pDst       pointer to the buffer to be set.\r\n * @param[in]   val        byte value to be set.\r\n * @param[in]   length     size (in bytes) to be set.\r\n *\r\n * @return A status code encapsulated in a flow-protection type.\r\n * @retval #MCUXCLMEMORY_STATUS_OK                 If @p length bytes copied at @p pDst.\r\n * @retval #MCUXCLMEMORY_STATUS_FAULT\r\n */\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClMemory_set_int)\r\nstatic inline MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClMemory_Status_t) mcuxClMemory_set_int\r\n(\r\n    uint8_t * pDst,\r\n    uint8_t val,\r\n    uint32_t length\r\n)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClMemory_set_int);\r\n    mcuxClMemory_Status_t retval = MCUXCLMEMORY_STATUS_FAULT;\r\n\r\n        MCUX_CSSL_FP_FUNCTION_CALL(csslRetval, mcuxCsslMemory_Set(\r\n            mcuxCsslParamIntegrity_Protect(4u, pDst, val, length, length),\r\n            pDst, val, length, length\r\n            ));\r\n        retval = (mcuxClMemory_Status_t) csslRetval ^ (MCUXCSSLMEMORY_COMPONENT_MASK ^ MCUXCLMEMORY_COMPONENT_MASK);\r\n        MCUX_CSSL_DI_RECORD(identifier /* Not used */, (uint32_t) pDst + length);  // Unbalance the SC\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxClMemory_set_int, retval, MCUX_CSSL_FP_FUNCTION_CALLED(mcuxCsslMemory_Set));\r\n    \r\n}\r\n\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLMEMORY_SET_INTERNAL_H_ */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/mcuxClMemory.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2021, 2023 NXP                                            */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxClMemory.h\r\n * @brief Top-level include file for the memory operations.\r\n *\r\n * @defgroup mcuxClMemory mcuxClMemory\r\n * @brief Basic memory operations\r\n *\r\n * This component provides memory functions similar to the ones found in the C standard library.\r\n *\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_H\r\n#define MCUXCLMEMORY_H\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxClCore_FunctionIdentifiers.h>\r\n#include <mcuxClMemory_Constants.h>\r\n#include <mcuxClMemory_Types.h>\r\n#include <mcuxClMemory_Endianness.h>\r\n#include <mcuxClMemory_Clear.h>\r\n#include <mcuxClMemory_Copy.h>\r\n#include <mcuxClMemory_Copy_Reversed.h>\r\n#include <mcuxClMemory_Set.h>\r\n#include <mcuxClMemory_Xor.h>\r\n\r\n/**\r\n * @}\r\n */\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/mcuxClMemory_Clear.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2021, 2023 NXP                                            */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_Clear.h\r\n *  @brief Memory header for clear functions.\r\n * This header exposes functions that enable using memory clear function.\r\n */\r\n\r\n\r\n/**\r\n * @defgroup mcuxClMemory_Clear mcuxClMemory_Clear\r\n * @brief This function clears a memory region.\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n\r\n#ifndef MCUXCLMEMORY_CLEAR_H_\r\n#define MCUXCLMEMORY_CLEAR_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n\r\n#include <mcuxClMemory_Types.h>\r\n#include <mcuxCsslAnalysis.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n\r\n/**\r\n * Overwrites a memory buffer with null bytes. \r\n * \r\n * If the destination buffer is too small, i.e. if bufLength < length, \r\n * (length-bufLength) is added to the Flow Protection token (see @ref mcuxCsslFlowProtection).\r\n * \r\n * @param[out]  pDst        Pointer to the buffer to be cleared.\r\n * @param[in]   length      size (in bytes) to be cleared.\r\n * @param[in]   bufLength   buffer size (if bufLength < length, only bufLength bytes are cleared).\r\n *\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClMemory_clear)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(void) mcuxClMemory_clear (uint8_t *pDst, size_t length, size_t bufLength);\r\n\r\n\r\n/**********************************************\r\n * MACROS\r\n **********************************************/\r\n\r\n/** Helper macro to call #mcuxClMemory_clear with flow protection. */\r\n#define MCUXCLMEMORY_FP_MEMORY_CLEAR(pTarget, byteLen)  \\\r\n    MCUX_CSSL_FP_FUNCTION_CALL_VOID(mcuxClMemory_clear((uint8_t *) (pTarget), byteLen, byteLen))\r\n\r\n/** Helper macro to call #mcuxClMemory_clear with flow protection with buffer. */\r\n#define MCUXCLMEMORY_FP_MEMORY_CLEAR_WITH_BUFF(pTarget, byteLen, buffLen)  \\\r\n    MCUX_CSSL_FP_FUNCTION_CALL_VOID(mcuxClMemory_clear((uint8_t *) (pTarget), byteLen, buffLen))\r\n\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLMEMORY_CLEAR_H_ */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/mcuxClMemory_Constants.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_Constants.h\r\n *  @brief Memory constant header.\r\n * This header exposes constants used by the @ref mcuxClMemory functions. */\r\n\r\n/**\r\n * @defgroup mcuxClMemory_Constants mcuxClMemory_Constants\r\n * @brief Defines all constants used by the @ref mcuxClMemory functions.\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_CONSTANTS_H\r\n#define MCUXCLMEMORY_CONSTANTS_H\r\n\r\n/**********************************************\r\n * CONSTANTS\r\n **********************************************/\r\n\r\n#define MCUXCLMEMORY_COMPONENT_MASK              0x09990000u ///< Component mask value\r\n\r\n/**\r\n * @defgroup MCUXCLMEMORY_STATUS_ MCUXCLMEMORY_STATUS_\r\n * @brief Defines valid mcuxClMemory function return codes\r\n * @ingroup mcuxClMemory_Types_Macros\r\n * @{\r\n */\r\n#define MCUXCLMEMORY_STATUS_OK                   ((mcuxClMemory_Status_t) 0x09992E03u) ///< Memory operation successful\r\n#define MCUXCLMEMORY_STATUS_EQUAL                ((mcuxClMemory_Status_t) 0x09992E47u) ///< The two contents of the Memory Compare are equal\r\n#define MCUXCLMEMORY_STATUS_NOT_EQUAL            ((mcuxClMemory_Status_t) 0x099989B8u) ///< The two contents of the Memory Compare are not equal\r\n#define MCUXCLMEMORY_STATUS_INVALID_PARAMETER    ((mcuxClMemory_Status_t) 0x0999533Cu) ///< A parameter was invalid\r\n#define MCUXCLMEMORY_STATUS_FAULT                ((mcuxClMemory_Status_t) 0x0999F0F0u) ///< A fault occurred in the execution\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n#define MCUXCLMEMORY_ERRORCODE_OK MCUXCLMEMORY_STATUS_OK ///< Memory operation successful\r\n                                                       ///< @deprecated Please use #MCUXCLMEMORY_STATUS_OK instead\r\n\r\n#endif  /* MCUXCLMEMORY_CONSTANTS_H */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/mcuxClMemory_Copy.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2021, 2023 NXP                                            */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_Copy.h\r\n *  @brief Memory header for copy functions.\r\n * This header exposes functions that enable using memory copy function.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClMemory_Copy mcuxClMemory_Copy\r\n * @brief This function copies a memory region from @p src to @p dst.\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_COPY_H_\r\n#define MCUXCLMEMORY_COPY_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n\r\n#include <mcuxClMemory_Types.h>\r\n#include <mcuxCsslAnalysis.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n\r\n/**\r\n * Copies a memory buffer to another location.\r\n *\r\n * The two buffers must not overlap.\r\n * \r\n * If the destination buffer is too small, i.e. if bufLength < length, \r\n * (length-bufLength) is added to the Flow Protection token (see @ref mcuxCsslFlowProtection).\r\n *  \r\n * @param[out] pDst        pointer to the buffer to be copied to.\r\n * @param[in]  pSrc        pointer to the buffer to copy.\r\n * @param[in]  length      size (in bytes) to be copied.\r\n * @param[in]  bufLength   buffer size (if bufLength < length, only bufLength bytes are copied).\r\n *\r\n */\r\n\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClMemory_copy)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(void) mcuxClMemory_copy (uint8_t *pDst, uint8_t const *pSrc, size_t length, size_t bufLength);\r\n\r\n\r\n/**********************************************\r\n * MACROS\r\n **********************************************/\r\n\r\n/** Helper macro to call #mcuxClMemory_copy with flow protection. */\r\n#define MCUXCLMEMORY_FP_MEMORY_COPY(pTarget, pSource, byteLen)  \\\r\n    MCUX_CSSL_FP_FUNCTION_CALL_VOID(mcuxClMemory_copy((uint8_t *) (pTarget), (const uint8_t *) (pSource), byteLen, byteLen))\r\n\r\n/** Helper macro to call #mcuxClMemory_copy with flow protection with buffer. */\r\n#define MCUXCLMEMORY_FP_MEMORY_COPY_WITH_BUFF(pTarget, pSource, byteLen, buffLen)  \\\r\n    MCUX_CSSL_FP_FUNCTION_CALL_VOID(mcuxClMemory_copy((uint8_t *) (pTarget), (const uint8_t *) (pSource), byteLen, buffLen))\r\n\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLMEMORY_COPY_H_ */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/mcuxClMemory_Copy_Reversed.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_Copy_Reversed.h\r\n *  @brief Memory header for reversed copy functions.\r\n * This header exposes functions that enable using memory reversed copy function.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClMemory_Copy_Reversed mcuxClMemory_Copy_Reversed\r\n * @brief This function copies a memory region from @p src to @p dst reversely.\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_COPY_REVERSED_H_\r\n#define MCUXCLMEMORY_COPY_REVERSED_H_\r\n\r\n#include <mcuxClCore_Platform.h>\r\n#include <mcuxClMemory_Types.h>\r\n#include <mcuxCsslAnalysis.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n\r\n/**\r\n * Copies a memory buffer to another location reversely.\r\n *\r\n * If the destination buffer is too small, i.e. if bufLength < length,\r\n * then only bufLength bytes are copied reversely.\r\n *\r\n * @param[out] pDst        pointer to the buffer to be copied to.\r\n * @param[in]  pSrc        pointer to the buffer to copy.\r\n * @param[in]  length      size (in bytes) to be copied.\r\n * @param[in]  bufLength   buffer size (if bufLength < length, only bufLength bytes are copied reversely).\r\n *\r\n */\r\n\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClMemory_copy_reversed)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(void) mcuxClMemory_copy_reversed (uint8_t *pDst, uint8_t const *pSrc, size_t length, size_t bufLength);\r\n\r\n\r\n/**********************************************\r\n * MACROS\r\n **********************************************/\r\n\r\n/** Helper macro to call #mcuxClMemory_copy_reversed with flow protection. */\r\n#define MCUXCLMEMORY_FP_MEMORY_COPY_REVERSED(pTarget, pSource, byteLen)  \\\r\n    MCUX_CSSL_FP_FUNCTION_CALL_VOID(mcuxClMemory_copy_reversed((uint8_t *) (pTarget), (const uint8_t *) (pSource), byteLen, byteLen))\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLMEMORY_COPY_REVERSED_H_ */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/mcuxClMemory_Endianness.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2021 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_Endianness.h\r\n *  @brief Memory header for endianness support functions.\r\n * This header exposes macros that enable using endianness support functions.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClMemory_Endianness mcuxClMemory_Endianness\r\n * @brief These macros implement endianess management on integers\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_ENDIANNESS_H_\r\n#define MCUXCLMEMORY_ENDIANNESS_H_\r\n\r\n#include <mcuxClMemory_Types.h>\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n\r\n\r\n/**********************************************\r\n * MACROS\r\n **********************************************/\r\n\r\n/**\r\n * @brief Converts a 32-bit unsigned integer to a little-endian order @c uint8_t array .\r\n *\r\n * @note Implementation is platform independent.\r\n *\r\n * @param[out]      destination     pointer to a 4 byte buffer were 32-bit integer in little-endian will be encoded.\r\n * @param[in]       value           pointer to the 32-bit integer to be encoded.\r\n *\r\n */\r\n#define mcuxClMemory_StoreLittleEndian32( destination, value )                       \\\r\ndo                                                                                  \\\r\n{                                                                                   \\\r\n    uint32_t local_value = (uint32_t)(value);                                       \\\r\n    ((uint8_t*)(destination))[0] = (uint8_t) (((local_value) & 0x000000FFU) >>  0u);\\\r\n    ((uint8_t*)(destination))[1] = (uint8_t) (((local_value) & 0x0000FF00U) >>  8u);\\\r\n    ((uint8_t*)(destination))[2] = (uint8_t) (((local_value) & 0x00FF0000U) >> 16u);\\\r\n    ((uint8_t*)(destination))[3] = (uint8_t) (((local_value) & 0xFF000000U) >> 24u);\\\r\n} while (false)\r\n\r\n/**\r\n * @brief Converts a 32-bit unsigned integer to a big-endian order @c uint8_t array.\r\n *\r\n * @note Implementation is platform independent.\r\n *\r\n * @param[in]       source          pointer to a 4 byte big-endian order @c uint8_t buffer that will be converted to an unsigned integer\r\n *\r\n */\r\n#define mcuxClMemory_StoreBigEndian32( destination, value )                          \\\r\ndo                                                                                  \\\r\n{                                                                                   \\\r\n    uint32_t local_value = (uint32_t)(value);                                       \\\r\n    ((uint8_t*)(destination))[0] = (uint8_t) (((local_value) & 0xFF000000U) >> 24u);\\\r\n    ((uint8_t*)(destination))[1] = (uint8_t) (((local_value) & 0x00FF0000U) >> 16u);\\\r\n    ((uint8_t*)(destination))[2] = (uint8_t) (((local_value) & 0x0000FF00U) >>  8u);\\\r\n    ((uint8_t*)(destination))[3] = (uint8_t) (((local_value) & 0x000000FFU) >>  0u);\\\r\n} while (false)\r\n\r\n/**\r\n * @brief Converts a little-endian order @c uint8_t array to a 32-bit unsigned integer.\r\n *\r\n * @note Implementation is platform independent.\r\n *\r\n * @param[in]       source          pointer to a 4 byte little-endian order @c uint8_t buffer that will be converted to an unsigned integer\r\n *\r\n */\r\n#define mcuxClMemory_LoadLittleEndian32( source )        \\\r\n    ( (((uint32_t) ((const uint8_t*)(source))[0]) <<  0u) |   \\\r\n      (((uint32_t) ((const uint8_t*)(source))[1]) <<  8u) |   \\\r\n      (((uint32_t) ((const uint8_t*)(source))[2]) << 16u) |   \\\r\n      (((uint32_t) ((const uint8_t*)(source))[3]) << 24u) )\r\n\r\n\r\n/**\r\n * @brief Converts a big-endian order @c uint8_t array to a 32-bit unsigned integer.\r\n *\r\n * @param[in]       destination     pointer to a 4 byte buffer were 32-bit integer in big-endian will be decoded.\r\n *\r\n * @return a 32-bit unsigned integer\r\n */\r\n#define mcuxClMemory_LoadBigEndian32( source )           \\\r\n    ( (((uint32_t) ((const uint8_t*)(source))[0]) << 24u) |   \\\r\n      (((uint32_t) ((const uint8_t*)(source))[1]) << 16u) |   \\\r\n      (((uint32_t) ((const uint8_t*)(source))[2]) <<  8u) |   \\\r\n      (((uint32_t) ((const uint8_t*)(source))[3]) <<  0u) )\r\n\r\n/**\r\n * @brief MACRO that switches byte endianness of given CPU word.\r\n *\r\n * @param[in]       input           a 32-bit unsigned integer whose endianness will be reversed.\r\n *\r\n */\r\n\r\n#ifdef __REV\r\n#define MCUXCLMEMORY_SWITCH_4BYTE_ENDIANNESS(input)  __REV(input)\r\n#else\r\n#define MCUXCLMEMORY_SWITCH_4BYTE_ENDIANNESS(input)  ((((input) & 0xffu) << 24u) | (((input) & 0xff00u) << 8u) | (((input) & 0xff0000u) >> 8u) | (((input) & 0xff000000u) >> 24u))\r\n#endif\r\n\r\n#endif /* MCUXCLMEMORY_ENDIANNESS_H_ */\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/mcuxClMemory_Set.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2021, 2023 NXP                                            */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_Set.h\r\n *  @brief Memory header for set function.\r\n * This header exposes functions that enable using memory set functions.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClMemory_Set mcuxClMemory_Set\r\n * @brief This function sets all bytes in a memory region to a specified value.\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_SET_H_\r\n#define MCUXCLMEMORY_SET_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n\r\n#include <mcuxClMemory_Types.h>\r\n#include <mcuxCsslAnalysis.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n/**\r\n * Sets all bytes of a memory buffer to a specified value.\r\n * \r\n * If the destination buffer is too small, i.e. if bufLength < length, \r\n * (length-bufLength) is added to the Flow Protection token (see @ref mcuxCsslFlowProtection).\r\n *  \r\n * @param[out]  pDst       pointer to the buffer to be set.\r\n * @param[in]   val        byte value to be set.\r\n * @param[in]   length     size (in bytes) to be set.\r\n * @param[in]   bufLength  buffer size (if bufLength < length, only bufLength bytes are set).\r\n *\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClMemory_set)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(void) mcuxClMemory_set (uint8_t *pDst, uint8_t val, size_t length, size_t bufLength);\r\n\r\n/**********************************************\r\n * MACROS\r\n **********************************************/\r\n\r\n/** Helper macro to call #mcuxClMemory_set with flow protection. */\r\n#define MCUXCLMEMORY_FP_MEMORY_SET(pTarget, val, byteLen)  \\\r\n    MCUX_CSSL_FP_FUNCTION_CALL_VOID(mcuxClMemory_set((uint8_t *) (pTarget), val, byteLen, byteLen))\r\n\r\n/** Helper macro to call #mcuxClMemory_set with flow protection with buffer. */\r\n#define MCUXCLMEMORY_FP_MEMORY_SET_WITH_BUFF(pTarget, val, byteLen, buffLen)  \\\r\n        MCUX_CSSL_FP_FUNCTION_CALL_VOID(mcuxClMemory_set((uint8_t *) (pTarget), val, byteLen, buffLen))\r\n\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLMEMORY_SET_H_ */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/mcuxClMemory_Types.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2021, 2023 NXP                                            */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_Types.h\r\n *  @brief Memory type header.\r\n * This header exposes types used by the @ref mcuxClMemory functions. */\r\n\r\n/**\r\n * @defgroup mcuxClMemory_Types mcuxClMemory_Types\r\n * @brief Defines all types used by the @ref mcuxClMemory functions.\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_TYPES_H\r\n#define MCUXCLMEMORY_TYPES_H\r\n\r\n#include <stdint.h>\r\n#include <stddef.h>\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxClCore_FunctionIdentifiers.h>\r\n\r\n/**********************************************\r\n * MACROS\r\n **********************************************/\r\n/**\r\n * @defgroup mcuxClMemory_Types_Macros mcuxClMemory_Types_Macros\r\n * @brief Defines all macros of @ref mcuxClMemory_Types\r\n * @ingroup mcuxClMemory_Types\r\n * @{\r\n */\r\n#define MCUXCLMEMORY_API extern  ///< Marks a function as a public API function of the mcuxClMemory component\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n/**********************************************\r\n * TYPEDEFS\r\n **********************************************/\r\n/**\r\n * @brief Type for error codes of mcuxClMemory component functions.\r\n * \r\n * Type returned by mcuxClMemory functions. See @ref MCUXCLMEMORY_STATUS_ for possible options.\r\n */\r\ntypedef uint32_t mcuxClMemory_Status_t;\r\n\r\n/**\r\n * @brief Deprecated type for error codes used by code-flow protected mcuxClMemory component functions.\r\n */\r\ntypedef MCUX_CSSL_FP_PROTECTED_TYPE(mcuxClMemory_Status_t) mcuxClMemory_Status_Protected_t;\r\n\r\n#endif /* #MCUXCLMEMORY_TYPES_H */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/inc/mcuxClMemory_Xor.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023-2024 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  mcuxClMemory_Xor.h\r\n *  @brief Memory header for xor functions.\r\n * This header exposes functions that enable using memory xor function.\r\n */\r\n\r\n/**\r\n * @defgroup mcuxClMemory_xor mcuxClMemory_xor\r\n * @brief This function performs xor between @p src1 and @p src2, and saves result to @p dst.\r\n * @ingroup mcuxClMemory\r\n * @{\r\n */\r\n\r\n#ifndef MCUXCLMEMORY_XOR_H_\r\n#define MCUXCLMEMORY_XOR_H_\r\n\r\n#include <mcuxClConfig.h> // Exported features flags header\r\n\r\n#include <mcuxClMemory_Types.h>\r\n#include <mcuxCsslAnalysis.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/**********************************************\r\n * FUNCTIONS\r\n **********************************************/\r\n\r\n/**\r\n * Perform xor for 2 memory buffers.\r\n *\r\n * Operation in place is allowed - one of the input buffer can also be the output buffer.\r\n *\r\n *\r\n * @param[out] pDst        pointer to the destination buffer.\r\n * @param[in]  pSrc1       pointer to the first source buffer.\r\n * @param[in]  pSrc2       pointer to the second source buffer.\r\n * @param[in]  length      size (in bytes) to be operated\r\n * @param[in]  bufLength   buffer size (if bufLength < length, only bufLength bytes are operated).\r\n *\r\n */\r\n\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxClMemory_xor)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(void) mcuxClMemory_xor(uint8_t *pDst, const uint8_t *pSrc1, const uint8_t *pSrc2, uint32_t length, size_t bufLength);\r\n\r\n\r\n/**********************************************\r\n * MACROS\r\n **********************************************/\r\n\r\n/** Helper macro to call #mcuxClMemory_xor with flow protection. */\r\n#define MCUXCLMEMORY_FP_MEMORY_XOR(pDst, pSrc1, pSrc2, length)  \\\r\n    MCUX_CSSL_FP_FUNCTION_CALL_VOID(mcuxClMemory_xor(pDst, pSrc1, pSrc2, length, length))\r\n\r\n/** Helper macro to call #mcuxClMemory_xor with flow protection with buffer. */\r\n#define MCUXCLMEMORY_FP_MEMORY_XOR_WITH_BUFF(pDst, pSrc1, pSrc2, length, bufLen)  \\\r\n    MCUX_CSSL_FP_FUNCTION_CALL_VOID(mcuxClMemory_xor(pDst, pSrc1, pSrc2, length, bufLen))\r\n\r\n\r\n#ifdef __cplusplus\r\n} /* extern \"C\" */\r\n#endif\r\n\r\n#endif /* MCUXCLMEMORY_XOR_H_ */\r\n\r\n/**\r\n * @}\r\n */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxClMemory/src/mcuxClMemory.c",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2021, 2023-2024 NXP                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n#include <mcuxClMemory.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxClCore_FunctionIdentifiers.h>\r\n#include <mcuxClToolchain.h>\r\n#include <mcuxCsslAnalysis.h>\r\n\r\n\r\n#define WORDSIZE  (sizeof(uint32_t))\r\n\r\n\r\n/**\r\n * [DESIGN]\r\n *\r\n * This function considers the following cases of alignment of source and\r\n * destination addresses and length:\r\n *\r\n *  Src Addr. | Des Addr. | Length    |\r\n *  ----------+-----------+-----------+-------------------------------\r\n *  aligned   | aligned   | aligned   | Case A: read word, write word\r\n *  ----------+-----------+-----------+-------------------------------\r\n *  aligned   | unaligned | aligned   | Case B: read word, write byte\r\n *  ----------+-----------+-----------+-------------------------------\r\n *  unaligned | aligned   | aligned   | Case C: read byte, write word\r\n *  ----------+-----------+-----------+-------------------------------\r\n *  unaligned | unaligned | aligned   | Case D: read byte,\r\n *  any       | any       | unaligned |         write byte-word-byte\r\n *\r\n * Since SFR address and length shall be aligned,\r\n * Cases A and B cover the usecases of SFR reading; and\r\n * Cases A and C cover the useceses of SFR writing.\r\n *\r\n * If length > bufLength, and bufLength is not aligned, in cases A and B,\r\n * the word containing last byte(s) is read in word, and last byte(s) is written byte-wisely.\r\n * Ps, since length is aligned, last word in source shall be in valid address range.\r\n *\r\n * Case C is a special case of Case D, because the byte-wisely writing will be ignored.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClMemory_copy)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(void) mcuxClMemory_copy (uint8_t *pDst, uint8_t const *pSrc, size_t length, size_t bufLength)\r\n{\r\n    /* This function assumes caller providing valid addresses and length. */\r\n\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClMemory_copy);\r\n    MCUX_CSSL_FP_LOOP_DECL(mcuxClMemory_copy_loop);\r\n\r\n    uint8_t *pDstX = pDst;\r\n    const uint8_t *pSrcX = pSrc;\r\n    uint32_t copiedLength = 0u;\r\n\r\n    MCUX_CSSL_ANALYSIS_START_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER(\"casting pointer to integer to check alignment.\");\r\n    const uint32_t srcAddress = (uint32_t) pSrc;\r\n    const uint32_t dstAddress = (uint32_t) pDst;\r\n    MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER();\r\n\r\n    const uint32_t srcAddrOrLength = srcAddress | length;\r\n    if (0u == (srcAddrOrLength % WORDSIZE))  /* source address and length are both aligned. */\r\n    {\r\n        uint32_t temp = 0u;\r\n\r\n        if (0u == (dstAddress % WORDSIZE))   /* destination address is aligned. */\r\n        {\r\n            /* Case A: copy word-wisely. */\r\n            while (((copiedLength + WORDSIZE) <= length) && ((copiedLength + WORDSIZE) <= bufLength))\r\n            {\r\n                MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_copy_loop);\r\n                MCUX_CSSL_ANALYSIS_START_SUPPRESS_INTEGER_OVERFLOW(\"Caller shall provide valid buffer pSrc[] of length.\")\r\n                MCUX_CSSL_ANALYSIS_START_SUPPRESS_POINTER_CASTING(\"source pointer is aligned in Case A.\")\r\n                temp = *(const uint32_t *) pSrcX;\r\n                MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_POINTER_CASTING()\r\n                pSrcX += WORDSIZE;\r\n                MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INTEGER_OVERFLOW()\r\n\r\n                MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_copy_loop);\r\n                copiedLength += WORDSIZE;\r\n\r\n                MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_copy_loop);\r\n                MCUX_CSSL_ANALYSIS_START_SUPPRESS_INTEGER_OVERFLOW(\"Caller shall provide valid buffer pDst[] of bufLength.\")\r\n                MCUX_CSSL_ANALYSIS_START_SUPPRESS_POINTER_CASTING(\"destination pointer is aligned in Case A.\")\r\n                *(uint32_t *) pDstX = temp;\r\n                MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_POINTER_CASTING()\r\n                pDstX += WORDSIZE;\r\n                MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INTEGER_OVERFLOW()\r\n\r\n                MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_copy_loop);\r\n            }\r\n        }\r\n\r\n        /* Case A: remaining byte(s) when (length < bufLength). */\r\n        /* Case B: read word-wisely, write byte-wisely. */\r\n        while ((copiedLength < length) && (copiedLength < bufLength))\r\n        {\r\n            if (0u == (copiedLength % WORDSIZE))\r\n            {\r\n                MCUX_CSSL_ANALYSIS_START_SUPPRESS_INTEGER_OVERFLOW(\"Caller shall provide valid buffer pSrc[] of length.\")\r\n                MCUX_CSSL_ANALYSIS_START_SUPPRESS_POINTER_CASTING(\"source pointer is aligned in Cases A and B.\")\r\n                temp = *(const uint32_t *) pSrcX;\r\n                MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_POINTER_CASTING()\r\n                pSrcX += WORDSIZE;\r\n                MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INTEGER_OVERFLOW()\r\n            }\r\n            else\r\n            {\r\n                temp >>= 8u;\r\n            }\r\n\r\n            MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_copy_loop);\r\n            MCUX_CSSL_ANALYSIS_START_SUPPRESS_INTEGER_OVERFLOW(\"Caller shall provide valid buffer pDst[] of bufLength.\")\r\n            *pDstX = (uint8_t) (temp & 0xFFu);\r\n            pDstX++;\r\n            MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INTEGER_OVERFLOW()\r\n\r\n            copiedLength++;\r\n        }\r\n\r\n    }\r\n    else\r\n    {\r\n        /* Cases C & D: read byte-wisely, write (byte-word-byte)-wisely. */\r\n        MCUX_CSSL_ANALYSIS_START_SUPPRESS_INTEGER_OVERFLOW(\"modular arithmetic, mod 4\")\r\n        const uint32_t unalignedBytes = (0u - dstAddress) % WORDSIZE;\r\n        MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INTEGER_OVERFLOW()\r\n\r\n        // Loop on unaligned bytes if any.\r\n        // Loop on words\r\n        // Start at first aligned address, increment by 4 bytes. To understand the loop condition, consider without loss of generality a\r\n        // byte array b_i of length=4 and bufLength=4.\r\n        //\r\n        // |0                             3|4     4|\r\n        // +-------+-------+-------+-------+-------+\r\n        // |  b_0  |  b_1  |  b_2  |  b_3  |       |\r\n        // +-------+-------+-------+-------+-------+\r\n        //\r\n        // In order to determine whether a full word can be copied, check with regard to the copying position i:\r\n        // * Starting from i=0, a full word can be copied. i+4 is the first position that is outside of the valid range,\r\n        //   and it is equal to length.\r\n        // Therefore, checking that i+4 <= length and i+4 <= bufLength is a valid condition to check whether a full word can be\r\n        // copied.\r\n        // Loop on remaining bytes.\r\n\r\n        //copy unaligned bytes first, if any\r\n        for (; (copiedLength < length) && (copiedLength < bufLength) && (copiedLength < unalignedBytes); copiedLength++)\r\n        {\r\n            MCUX_CSSL_ANALYSIS_START_SUPPRESS_INTEGER_OVERFLOW(\"Caller shall provide valid buffers pSrc[] of length and pDst[] of bufLength.\")\r\n            *pDstX = *pSrcX;\r\n            pDstX++;\r\n            pSrcX++;\r\n            MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INTEGER_OVERFLOW()\r\n            MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_copy_loop);\r\n        }\r\n\r\n        MCUX_CSSL_ANALYSIS_START_SUPPRESS_POINTER_CASTING(\"The pointer is CPU word aligned after the byte-loop above.\");\r\n        uint32_t* p32Dst = (uint32_t *) pDstX;\r\n        MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_POINTER_CASTING();\r\n\r\n        //loop on words\r\n        for (; ((copiedLength + WORDSIZE) <= length) && ((copiedLength + WORDSIZE) <= bufLength); copiedLength += WORDSIZE)\r\n        {\r\n            /* Volatile keyword is added to avoid any chance of optimization (i.e. full word read) */\r\n            /* The idea is to read byte-wise from SRC to avoid unaligned word reads, but write aligned and word-wise to DST */\r\n            MCUX_CSSL_ANALYSIS_START_SUPPRESS_INTEGER_OVERFLOW(\"Caller shall provide valid buffers pSrc[] of length and pDst[] of bufLength.\")\r\n            uint32_t crtWordVal = (uint32_t)*(volatile const uint8_t *)pSrcX;\r\n            pSrcX++;\r\n            MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_copy_loop);\r\n            crtWordVal |= (uint32_t)*(volatile const uint8_t *)pSrcX << 8u;\r\n            pSrcX++;\r\n            MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_copy_loop);\r\n            crtWordVal |= (uint32_t)*(volatile const uint8_t *)pSrcX << 16u;\r\n            pSrcX++;\r\n            MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_copy_loop);\r\n            crtWordVal |= (uint32_t)*(volatile const uint8_t *)pSrcX << 24u;\r\n            pSrcX++;\r\n            MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_copy_loop);\r\n            MCUX_CSSL_ANALYSIS_START_SUPPRESS_POINTER_INCOMPATIBLE(\"The pointer is CPU word aligned after the byte-loop above.\");\r\n            *p32Dst = crtWordVal;\r\n            p32Dst++;\r\n            MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_POINTER_INCOMPATIBLE();\r\n            MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INTEGER_OVERFLOW()\r\n        }\r\n\r\n        pDstX = (uint8_t *) p32Dst;\r\n        //loop on remaining bytes\r\n        for (; (copiedLength < length) && (copiedLength < bufLength); copiedLength++)\r\n        {\r\n            MCUX_CSSL_ANALYSIS_START_SUPPRESS_INTEGER_OVERFLOW(\"Caller shall provide valid buffers pSrc[] of length and pDst[] of bufLength.\")\r\n            *pDstX = *pSrcX;\r\n            pDstX++;\r\n            pSrcX++;\r\n            MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INTEGER_OVERFLOW()\r\n            MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_copy_loop);\r\n        }\r\n    }\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT_VOID(mcuxClMemory_copy,\r\n        ((length <= bufLength) ? length : bufLength) - copiedLength,\r\n        MCUX_CSSL_FP_LOOP_ITERATIONS(mcuxClMemory_copy_loop,\r\n                                    ((length <= bufLength) ? length : bufLength)) );\r\n}\r\n\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClMemory_copy_reversed)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(void) mcuxClMemory_copy_reversed (uint8_t *pDst, uint8_t const *pSrc, size_t length, size_t bufLength)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClMemory_copy_reversed);\r\n    uint32_t len = length;\r\n    uint32_t diff;\r\n\r\n    MCUX_CSSL_ANALYSIS_START_SUPPRESS_INTEGER_OVERFLOW(\"diff is non-negative distance between pSrc and pDst, caculated according to platform architecture.\")\r\n    if (pDst > pSrc)\r\n    {\r\n        MCUX_CSSL_ANALYSIS_START_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER(\"Casting pSrc and pDst to unsigned integer to calculate difference\");\r\n        MCUX_CSSL_ANALYSIS_START_SUPPRESS_MODIFY_STRING_LITERALS(\"False positive: The constant string literal pSrc is not being modified\");\r\n        diff = (uint32_t)pDst - (uint32_t)pSrc;\r\n        MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_MODIFY_STRING_LITERALS();\r\n    MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER();\r\n    }\r\n    else\r\n    {\r\n        MCUX_CSSL_ANALYSIS_START_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER(\"Casting pSrc and pDst to unsigned integer to calculate difference\");\r\n        MCUX_CSSL_ANALYSIS_START_SUPPRESS_MODIFY_STRING_LITERALS(\"False positive: The constant string literal pSrc is not being modified\");\r\n        diff = (uint32_t)pSrc - (uint32_t)pDst;\r\n        MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_MODIFY_STRING_LITERALS();\r\n        MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER();\r\n    }\r\n    MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INTEGER_OVERFLOW()\r\n\r\n    if (bufLength < length)\r\n    {\r\n        length = bufLength;\r\n        len = bufLength;\r\n    }\r\n\r\n    MCUX_CSSL_FP_LOOP_DECL(mcuxClMemory_copy_reversed_loop);\r\n\r\n    //non-overlap case\r\n    if (diff >= length)\r\n    {\r\n        diff = length;\r\n    }\r\n\r\n    uint8_t *pDstBt;\r\n    const uint8_t *pSrcBt;\r\n    if (pSrc > pDst)\r\n    {\r\n        // first copy the non-overlop part\r\n        MCUX_CSSL_ANALYSIS_START_SUPPRESS_INTEGER_OVERFLOW(\"pDstBt will be in the valid range pDst[0 ~ bufLength] and pSrc will be in the valid range pSrc[0 ~ length].\")\r\n        pSrcBt = pSrc + len - 1U;\r\n        pDstBt = (uint8_t *)pDst;\r\n\r\n        while (len > length - diff)\r\n        {\r\n            *pDstBt = *pSrcBt;\r\n            pDstBt++;\r\n            pSrcBt--;\r\n            len--;\r\n            MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_copy_reversed_loop);\r\n        }\r\n        MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INTEGER_OVERFLOW()\r\n        //then swap the overlap part\r\n        MCUX_CSSL_ANALYSIS_START_SUPPRESS_INTEGER_OVERFLOW(\"pDstBt2 will be in the valid range pDst[0 ~ bufLength].\")\r\n        uint8_t *pDstBt2 = pDstBt + len - 1u;\r\n        while (len > 1U)\r\n        {\r\n            uint8_t tempByte = *pDstBt2;\r\n            *pDstBt2 = *pDstBt;\r\n            pDstBt2--;\r\n            MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_copy_reversed_loop);\r\n            *pDstBt = tempByte;\r\n            pDstBt++;\r\n            len -= 2U;\r\n            MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_copy_reversed_loop);\r\n        }\r\n        MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INTEGER_OVERFLOW()\r\n    }\r\n    else\r\n    {\r\n        // first copy the non-overlop part\r\n        MCUX_CSSL_ANALYSIS_START_SUPPRESS_INTEGER_OVERFLOW(\"pDstBt will be in the valid range pDst[0 ~ bufLength].\")\r\n        pDstBt = (uint8_t *)pDst + len - 1U;\r\n        pSrcBt = pSrc;\r\n\r\n        while (len > length - diff)\r\n        {\r\n            *pDstBt = *pSrcBt;\r\n            pDstBt--;\r\n            pSrcBt++;\r\n            len--;\r\n            MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_copy_reversed_loop);\r\n        }\r\n        MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INTEGER_OVERFLOW()\r\n        //then swap the overlap part\r\n        MCUX_CSSL_ANALYSIS_START_SUPPRESS_INTEGER_OVERFLOW(\"pDstBt2 will be in the valid range pDst[0 ~ bufLength], pDstBt will be in the valid range pDst[0 ~ bufLength].\")\r\n        uint8_t *pDstBt2 = pDstBt - len + 1u;\r\n        while (len > 1U)\r\n        {\r\n            uint8_t tempByte = *pDstBt2;\r\n            *pDstBt2 = *pDstBt;\r\n            pDstBt2++;\r\n            MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_copy_reversed_loop);\r\n            *pDstBt = tempByte;\r\n            pDstBt--;\r\n            len -= 2U;\r\n            MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_copy_reversed_loop);\r\n        }\r\n        MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INTEGER_OVERFLOW()\r\n    }\r\n\r\n    /* update SC and return */\r\n    MCUX_CSSL_FP_FUNCTION_EXIT_VOID(mcuxClMemory_copy_reversed,\r\n                              MCUX_CSSL_FP_LOOP_ITERATIONS(mcuxClMemory_copy_reversed_loop, (length - len)));\r\n}\r\n\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClMemory_set)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(void) mcuxClMemory_set (uint8_t *pDst, uint8_t val, size_t length, size_t bufLength)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClMemory_set);\r\n\r\n    MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(INTEGER_OVERFLOW, \"modular arithmetic, mod 4\")\r\n    MCUX_CSSL_ANALYSIS_START_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER(\"casting to unsigned integer to calculate unaligned bytes\");\r\n    uint32_t unalignedBytes = (0u - (uint32_t)pDst) % (sizeof(uint32_t));\r\n    MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER();\r\n    MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(INTEGER_OVERFLOW)\r\n    MCUX_CSSL_FP_LOOP_DECL(mcuxClMemory_set_loop);\r\n    uint32_t wordVal = ((uint32_t)val << 24) | ((uint32_t)val << 16) | ((uint32_t)val << 8) | (uint32_t)val;\r\n\r\n    //clear unaligned bytes first, if any\r\n    size_t i = 0u;\r\n    for(i = 0u; (i < length) && (i < bufLength) && (i < unalignedBytes); i++)\r\n    {\r\n        MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(INTEGER_OVERFLOW, \"pDst will be in the valid range pDst[0 ~ bufLength].\")\r\n        *pDst = val;\r\n        pDst++;\r\n        MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_set_loop);\r\n        MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(INTEGER_OVERFLOW)\r\n    }\r\n\r\n    MCUX_CSSL_ANALYSIS_START_SUPPRESS_POINTER_CASTING(\"The pointer is CPU word aligned. So, it's safe to cast it to uint32_t*\");\r\n    uint32_t* p32Dst = (uint32_t *) pDst;\r\n    MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_POINTER_CASTING();\r\n\r\n    //loop on words. See mcuxClMemory_copy for an explanation of the condition\r\n    while(((i + sizeof(uint32_t)) <= length) && ((i + sizeof(uint32_t)) <= bufLength))\r\n    {\r\n        MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(INTEGER_OVERFLOW, \"p32Dst will be in the valid range pDst[0 ~ bufLength] and pSrc will be in the valid range pSrc[0 ~ length].\")\r\n        MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_set_loop);\r\n        MCUX_CSSL_ANALYSIS_START_SUPPRESS_POINTER_INCOMPATIBLE(\"This assignment never overflows because the pointer p32Dst points to pDst[i] where i <= length - 4\");\r\n        *p32Dst = wordVal;\r\n        MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_POINTER_INCOMPATIBLE();\r\n        MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_set_loop);\r\n        p32Dst++;\r\n        MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_set_loop);\r\n        i += sizeof(uint32_t);\r\n        MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_set_loop);\r\n        MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(INTEGER_OVERFLOW)\r\n    }\r\n\r\n    pDst = (uint8_t *) p32Dst;\r\n    //loop on remaining bytes\r\n    for(; (i < length) && (i < bufLength); i++)\r\n    {\r\n        MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(INTEGER_OVERFLOW, \"pDst will be in the valid range pDst[0 ~ bufLength].\")\r\n        *pDst = val;\r\n        pDst++;\r\n        MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_set_loop);\r\n        MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(INTEGER_OVERFLOW)\r\n    }\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT_VOID(mcuxClMemory_set,\r\n                              ((length <= bufLength) ? length : bufLength) - i,\r\n                              MCUX_CSSL_FP_LOOP_ITERATIONS(mcuxClMemory_set_loop,\r\n                                                          ((length <= bufLength) ? length : bufLength)));\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClMemory_clear)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(void) mcuxClMemory_clear (uint8_t *pDst, size_t length, size_t bufLength)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClMemory_clear, MCUX_CSSL_FP_FUNCTION_CALLED(mcuxClMemory_set));\r\n\r\n    MCUX_CSSL_FP_FUNCTION_CALL_VOID(mcuxClMemory_set(pDst, 0U, length, bufLength));\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT_VOID(mcuxClMemory_clear);\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxClMemory_xor)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(void) mcuxClMemory_xor(uint8_t *pDst, const uint8_t *pSrc1, const uint8_t *pSrc2, uint32_t length, size_t bufLength)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxClMemory_xor);\r\n    uint32_t remainingLen = length;\r\n\r\n    if (bufLength < remainingLen)\r\n    {\r\n        remainingLen = bufLength;\r\n    }\r\n\r\n    MCUX_CSSL_FP_LOOP_DECL(mcuxClMemory_xor_loop);\r\n\r\n    /* xor by word if aligned */\r\n    MCUX_CSSL_ANALYSIS_START_SUPPRESS_CAST_TO_VOIDPTR(\"Typecasting  pointer to integer is intentional\")\r\n    if ((remainingLen >= WORDSIZE) && (0u == ((uint32_t)pDst & (WORDSIZE - 1u)))\r\n                && (0u == ((uint32_t)pSrc1 & (WORDSIZE - 1u)))\r\n                && (0u == ((uint32_t)pSrc2 & (WORDSIZE - 1u))))\r\n    MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CAST_TO_VOIDPTR()\r\n    {\r\n        do\r\n        {\r\n            MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_xor_loop);\r\n            MCUX_CSSL_ANALYSIS_START_SUPPRESS_REINTERPRET_MEMORY(\"pSrc1, pSrc2 and pDst are word aligned.\")\r\n            const uint32_t temp1 = *(const uint32_t *)pSrc1;\r\n            const uint32_t temp2 = *(const uint32_t *)pSrc2;\r\n            *(uint32_t *)pDst = temp1 ^ temp2;\r\n            MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_REINTERPRET_MEMORY()\r\n\r\n            MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_xor_loop);\r\n            pSrc1 += WORDSIZE;\r\n            pSrc2 += WORDSIZE;\r\n            pDst += WORDSIZE;\r\n            MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_xor_loop);\r\n            remainingLen -= WORDSIZE;\r\n            MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_xor_loop);\r\n        } while (remainingLen >= WORDSIZE);\r\n    }\r\n\r\n    /* xor the remaining bytes */\r\n    while (remainingLen > 0u)\r\n    {\r\n        MCUX_CSSL_ANALYSIS_START_SUPPRESS_INTEGER_OVERFLOW(\"Caller should set length and bufLength properly to make sure not to overflow.\")\r\n        const uint8_t temp1 = *pSrc1++;\r\n        const uint8_t temp2 = *pSrc2++;\r\n        *pDst++ = temp1 ^ temp2;\r\n        MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INTEGER_OVERFLOW()\r\n        remainingLen--;\r\n        MCUX_CSSL_FP_LOOP_ITERATION(mcuxClMemory_xor_loop);\r\n    }\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT_VOID(mcuxClMemory_xor,\r\n                              MCUX_CSSL_FP_LOOP_ITERATIONS(mcuxClMemory_xor_loop,\r\n                                                          ((length <= bufLength) ? length : bufLength)));\r\n}\r\n\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslCPreProcessor/inc/mcuxCsslAnalysis.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2022-2024 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n#ifndef MCUX_CSSL_ANALYSIS_H_\r\n#define MCUX_CSSL_ANALYSIS_H_\r\n\r\n#define MCUX_CSSL_ANALYSIS_STR(a) #a\r\n#define MCUX_CSSL_ANALYSIS_EMPTY()\r\n#define MCUX_CSSL_ANALYSIS_DEFER(id) id MCUX_CSSL_ANALYSIS_EMPTY()\r\n#define MCUX_CSSL_ANALYSIS_EXPAND(...) __VA_ARGS__\r\n\r\n#define MCUX_CSSL_ANALYSIS_PRAGMA(x) _Pragma(#x)\r\n\r\n/* Compiler defines TODO: decide proper placement for those */\r\n#if defined ( __CC_ARM )\r\n/* Arm Compiler 4/5 */\r\n#define MCUX_CSSL_COMPILER_ARMCC\r\n#define MCUX_CSSL_COMPILER_ARM_COMPILER\r\n\r\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100)\r\n/* Arm Compiler 6.6 LTM (armclang) */\r\n#define MCUX_CSSL_COMPILER_ARMCLANG_LTM\r\n#define MCUX_CSSL_COMPILER_ARM_COMPILER\r\n\r\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100)\r\n/* Arm Compiler above 6.10.1 (armclang) */\r\n#define MCUX_CSSL_COMPILER_ARMCLANG\r\n#define MCUX_CSSL_COMPILER_ARM_COMPILER\r\n\r\n#elif defined (_clang_)\r\n#define MCUX_CSSL_COMPILER_ARM_COMPILER /* i.e. Version 6.01 build 0019  */\r\n#endif // defined ( __CC_ARM )\r\n\r\n/* Example of common patterns, with either just predefined rationale, or a combination of discards. */\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_HW_READ() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_DISCARD_VOLATILE(\"Read from a HW peripheral\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_HW_READ() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_DISCARD_VOLATILE()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_HW_WRITE() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_DISCARD_VOLATILE(\"Write to a HW peripheral\")\r\n  /*MCUX_CSSL_ANALYSIS_START_SUPPRESS_CAST_TO_OBJECT(\"Write to a HW peripheral\")*/\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_HW_WRITE() \\\r\n  /*MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CAST_TO_OBJECT()*/ \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_DISCARD_VOLATILE()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_CONVERSION_BETWEEN_ENUM_AND_INTEGER_TYPES(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_10_5, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CONVERSION_BETWEEN_ENUM_AND_INTEGER_TYPES() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_10_5)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_EXTERNAL_API_DECLARATIONS() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_DECLARED_BUT_NEVER_REFERENCED(\"Consumed by user, it is declared but never referenced. \")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_EXTERNAL_API_DECLARATIONS() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_DECLARED_BUT_NEVER_REFERENCED()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_DESCRIPTIVE_IDENTIFIER() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_AMBIGUOUS_IDENTIFIER(\"Identifiers longer than 31 characters are allowed for more descriptive naming\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_DESCRIPTIVE_IDENTIFIER() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_AMBIGUOUS_IDENTIFIER()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_REINTERPRET_MEMORY_OF_OPAQUE_TYPES() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_REINTERPRET_MEMORY(\"explicit pointer casts reinterpreting opaque types of workarea-like buffer objects are allowed.\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_REINTERPRET_MEMORY() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_REINTERPRET_MEMORY()\r\n/* Rule 11.3: applies to casts between ctx structs\r\n* e.g. cast from Aead_Context_t to more specific type AeadModes_Context_t\r\n*/\r\n#define MCUX_CSSL_ANALYSIS_START_CAST_TO_MORE_SPECIFIC_TYPE() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_REINTERPRET_MEMORY(\"Cast to a more specific type is allowed\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_CAST_TO_MORE_SPECIFIC_TYPE() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_REINTERPRET_MEMORY()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_EXTERNAL_HEADER() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_C11_EXTENSION(\"External header outside our control\") \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_UNDEFINED_VALUE(\"External header outside our control\") \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_RESERVED_MACRO_IDENTIFIER(\"External header outside our control\") \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_PADDED_TO_ALIGNMENT_BOUNDARY(\"External header outside our control\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_EXTERNAL_HEADER() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_PADDED_TO_ALIGNMENT_BOUNDARY() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_RESERVED_MACRO_IDENTIFIER() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_UNDEFINED_VALUE() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_C11_EXTENSION()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_EXTERNAL_MACRO() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_CONTROLLING_EXPRESSION_IS_INVARIANT(\"External macro outside our control, operation is safe on target platform given correct arguments according to an API are provided\") \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_OPERATIONS_ON_INAPPROPRIATE_TYPE(\"External macro outside our control, operation is safe on target platform given correct arguments according to an API are provided\") \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_CONVERSIONS_WITH_INAPPROPRIATE_TYPE(\"External macro outside our control, operation is safe on target platform given correct arguments according to an API are provided\") \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_MISSING_EXPLICIT_PARANTHESIS(\"External macro outside our control, operation is safe on target platform given correct arguments according to an API are provided\") \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_INVALID_WIDTH_IN_SHIFT_OPERATIONS(\"External macro outside our control, operation is safe on target platform given correct arguments according to an API are provided\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_EXTERNAL_MACRO() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CONTROLLING_EXPRESSION_IS_INVARIANT() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_OPERATIONS_ON_INAPPROPRIATE_TYPE() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CONVERSIONS_WITH_INAPPROPRIATE_TYPE() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_MISSING_EXPLICIT_PARANTHESIS() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INVALID_WIDTH_IN_SHIFT_OPERATIONS()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_OBJ_SIZES() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_UNUSED_VARIABLE(\"Variables used to determine object sizes\") \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_MISSING_VARIABLE_DECLARATION(\"Variables used to determine object sizes\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_OBJ_SIZES() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_MISSING_VARIABLE_DECLARATION() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_UNUSED_VARIABLE()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_FUP() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_MISSING_VARIABLE_DECLARATION(\"External declarations are generated by the FUP processing tool\") \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_5_8, \"The FUP processing tool generates a second declaration\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_FUP() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_5_8) \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_MISSING_VARIABLE_DECLARATION()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_FUP_PROGRAM() \\\r\n  MCUX_CSSL_ANALYSIS_START_PATTERN_EXTERNAL_LINKAGE_FUP() \\\r\n  MCUX_CSSL_ANALYSIS_START_PATTERN_DEFINITION_IN_TEMP_FILE_FUP()\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_FUP_PROGRAM() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_PATTERN_DEFINITION_IN_TEMP_FILE_FUP() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_PATTERN_EXTERNAL_LINKAGE_FUP()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_EXTERNAL_LINKAGE_FUP() \\\r\n  MCUX_CSSL_ANALYSIS_START_PATTERN_DESCRIPTIVE_IDENTIFIER() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_5_8, \"The FUP processing tool generates a second external declaration\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_EXTERNAL_LINKAGE_FUP() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_5_8) \\\r\n  MCUX_CSSL_ANALYSIS_STOP_PATTERN_DESCRIPTIVE_IDENTIFIER() \r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_DEFINITION_IN_TEMP_FILE_FUP() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_8_6, \"The FUP processing tool generates definitions in temporary build files\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_DEFINITION_IN_TEMP_FILE_FUP() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_8_6)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_INTEGER_OVERFLOW(\"Integer overflows are allowed/expected for security counter variables per design\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INTEGER_OVERFLOW()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_SWITCH_STATEMENT_RETURN_TERMINATION() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_SWITCH_STATEMENT_NOT_WELL_FORMED(\"Return instead of break statement as terminator is allowed\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_SWITCH_STATEMENT_RETURN_TERMINATION() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_SWITCH_STATEMENT_NOT_WELL_FORMED()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_INVARIANT_EXPRESSION_WORKAREA_CALCULATIONS() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_CONTROLLING_EXPRESSION_IS_INVARIANT(\"Invariant expression is allowed in workarea calculation macros\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_INVARIANT_EXPRESSION_WORKAREA_CALCULATIONS() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CONTROLLING_EXPRESSION_IS_INVARIANT()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_ADDRESS_IN_SFR_IS_NOT_REUSED_OUTSIDE() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_ESCAPING_LOCAL_ADDRESS(\"Address in SFR is for internal use only and does not escape\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_ADDRESS_IN_SFR_IS_NOT_REUSED_OUTSIDE() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_ESCAPING_LOCAL_ADDRESS()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_DI_INTEGER_OVERFLOW() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_INTEGER_OVERFLOW(\"Integer overflows are allowed/expected for DI variables per design\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_DI_INTEGER_OVERFLOW() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INTEGER_OVERFLOW()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_DI_CAST_POINTERS() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER(\"Typecast pointer to integer for DI record/expunge\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_DI_CAST_POINTERS() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_SC_CAST_POINTERS() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER(\"Typecast pointer (void *) to integer for SC add/sub\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_CAST_POINTERS() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_EXAMPLE_FUNCTION() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_MISSING_FUNCTION_DECLARATION(\"Declaration is not needed for release package. Cant be static as it is declared and used by testing framweork.\") \\\r\n  MCUX_CSSL_ANALYSIS_START_PATTERN_DESCRIPTIVE_IDENTIFIER()\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_EXAMPLE_FUNCTION() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_MISSING_FUNCTION_DECLARATION() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_PATTERN_DESCRIPTIVE_IDENTIFIER()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_CAST_VOID() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_11_5, \"Typecast pointer (void *) for correct representation to use pointer\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CAST_VOID() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_11_5)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_MISSING_EXPLICIT_PARANTHESIS(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_12_1, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_MISSING_EXPLICIT_PARANTHESIS() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_12_1)\r\n\r\n#ifdef MCUX_CSSL_COMPILER_ARM_COMPILER\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_SIGNED_TRUNCATION() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_CAST_MAY_RESULT_IN_MISINTERPRETED_DATA(\"Truncated upper bits are not needed. Operation is implementation defined and documented in arm compiler user guide. If a value of integral type is truncated to a shorter signed integral type, the result is obtained by discarding an appropriate number of most significant bits. If the original number is too large, positive or negative, for the new type, there is no guarantee that the sign of the result is going to be the same as the original. On target ARM architecture two's complement representation is used and a sign will be derived from most significant bit of data remaining after truncation. This operation allows efficient implementation of signed numbers modular arithmetic.\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_SIGNED_TRUNCATION() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CAST_MAY_RESULT_IN_MISINTERPRETED_DATA()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_SIGNED_SHIFT() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_OPERATIONS_ON_INAPPROPRIATE_TYPE(\"Shift operation on signed numbers is implementation defined and documented in arm compiler user guide. Right shifts on signed quantities are arithmetic (sign extension is performed). Left shifs are logical. This operation allows sign extensions and efficient implementation of signed numbers arithmetic.\") \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_SIGNED_SHIFT_AMOUNT(\"Shift operation on signed numbers is implementation defined and documented in arm compiler user guide. Right shifts on signed quantities are arithmetic (sign extension is performed). Left shifs are logical. This operation allows sign extensions and efficient implementation of signed numbers arithmetic.\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_SIGNED_SHIFT() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_OPERATIONS_ON_INAPPROPRIATE_TYPE() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_SIGNED_SHIFT_AMOUNT()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_TWOS_COMPLEMENT_REPRESENTATION() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_CAST_MAY_RESULT_IN_MISINTERPRETED_DATA(\"Algoritihm works correctly assuming two's complement representation of signed numbers. This is true for target ARM platform.\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_TWOS_COMPLEMENT_REPRESENTATION() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CAST_MAY_RESULT_IN_MISINTERPRETED_DATA()\r\n\r\n#else //defined(MCUX_CSSL_COMPILER_ARM_COMPILER)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_SIGNED_TRUNCATION() \\\r\n  /* Intentionally empty */\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_SIGNED_TRUNCATION() \\\r\n  /* Intentionally empty */\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_SIGNED_SHIFT() \\\r\n  /* Intentionally empty */\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_SIGNED_SHIFT() \\\r\n  /* Intentionally empty */\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_TWOS_COMPLEMENT_REPRESENTATION() \\\r\n  /* Intentionally empty */\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_TWOS_COMPLEMENT_REPRESENTATION() \\\r\n  /* Intentionally empty */\r\n#endif\r\n\r\n#define MCUX_CSSL_ANALYSIS_ASSERT_PARAMETER(value, min_value, max_value, return_code) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_ASSERT(value, min_value, max_value, return_code)\r\n\r\n#define MCUX_CSSL_ANALYSIS_ASSERT_PARAMETER_WITH_DATA_TYPE(value,data_type, min_value, max_value, return_code) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_ASSERT_WITH_DATA_TYPE(value, data_type, min_value, max_value, return_code)\r\n\r\n/* Example of basic violation suppression */\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_DEAD_CODE(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_2_1, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_DEAD_CODE() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_2_1)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_UNUSED_MACRO(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_2_5, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_UNUSED_MACRO() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_2_5)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_TEXT_IN_COMMENTS(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_3_1, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_TEXT_IN_COMMENTS() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_3_1)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_POINTER_CASTING(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_11_3, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_EXP36_C, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_EXP39_C, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_POINTER_CASTING() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_EXP39_C) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_EXP36_C) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_11_3)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_CAST_MAY_RESULT_IN_MISINTERPRETED_DATA(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_INT02_C, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_INT31_C, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_INT00_C, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CAST_MAY_RESULT_IN_MISINTERPRETED_DATA() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_INT02_C) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_INT31_C) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_INT00_C)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_DISCARD_VOLATILE(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_CLANG_START_SUPPRESS_WARNING(-Wcast-qual, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_GHS_START_SUPPRESS_WARNING(1836, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_11_8, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_DISCARD_VOLATILE() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_11_8) \\\r\n  MCUX_CSSL_ANALYSIS_GHS_STOP_SUPPRESS_WARNING(1836) \\\r\n  MCUX_CSSL_ANALYSIS_CLANG_STOP_SUPPRESS_WARNING(-Wcast-qual)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_HW_REGISTER_INDEXING() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_OUT_OF_BOUNDS_ACCESS(\"Apply an index to the base address of a HW peripheral to access the correct SFR-word. The caller is responsible for ensuring that the index is valid.\") \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(ARRAY_VS_SINGLETON, \"Apply an index to the base address of a HW peripheral to access the correct SFR-word. The caller is responsible for ensuring that the index is valid.\")\r\n#define MCUX_CSSL_ANALYSIS_START_PATTERN_HW_REGISTER_INDEXING_WITH_OFFSETOF() \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_OUT_OF_BOUNDS_ACCESS(\"Apply an index to the base address of a HW peripheral, where index was computed with 'offsetof' macro to ensure a correct offset.\") \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(ARRAY_VS_SINGLETON, \"Apply an index to the base address of a HW peripheral, where index was computed with 'offsetof' macro to ensure a correct offset.\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_PATTERN_HW_REGISTER_INDEXING() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(ARRAY_VS_SINGLETON) \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_OUT_OF_BOUNDS_ACCESS()\r\n\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_OUT_OF_BOUNDS_ACCESS(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_18_1, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_OUT_OF_BOUNDS_ACCESS() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_18_1) \\\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_DISCARD_CONST(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_DISCARD_CONST_QUALIFIER(rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_DISCARD_CONST() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_DISCARD_CONST_QUALIFIER()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_DISCARD_CONST_QUALIFIER(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_CLANG_START_SUPPRESS_WARNING(-Wcast-qual, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_GHS_START_SUPPRESS_WARNING(1836, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_11_8, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_EXP05_C, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_DISCARD_CONST_QUALIFIER() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_EXP05_C) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_11_8) \\\r\n  MCUX_CSSL_ANALYSIS_GHS_STOP_SUPPRESS_WARNING(1836) \\\r\n  MCUX_CSSL_ANALYSIS_CLANG_STOP_SUPPRESS_WARNING(-Wcast-qual)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_NULL_POINTER_CONSTANT(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_11_9, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_NULL_POINTER_CONSTANT() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_11_9)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_REINTERPRET_MEMORY_BETWEEN_INAPT_ESSENTIAL_TYPES(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_11_3, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_REINTERPRET_MEMORY_BETWEEN_INAPT_ESSENTIAL_TYPES() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_11_3)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_REINTERPRET_MEMORY(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_11_3, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_EXP39_C, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_REINTERPRET_MEMORY() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_EXP39_C) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_11_3)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_ARRAY_OUT_OF_BOUNDS(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_ARR30_C, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_ARRAY_OUT_OF_BOUNDS() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_ARR30_C)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_11_4, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_11_6, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_INT36_C, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_MSC15_C, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_MSC15_C) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_INT36_C) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_11_6) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_11_4)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_TYPECAST_INTEGER_TO_POINTER(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER(rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_TYPECAST_INTEGER_TO_POINTER() \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER()\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_AMBIGUOUS_IDENTIFIER(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_5_1, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_5_4, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_5_5, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_AMBIGUOUS_IDENTIFIER() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_5_5) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_5_4) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_5_1)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_REINTERPRET_STRUCT(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_11_1, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_REINTERPRET_STRUCT() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_11_1)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_DECLARED_BUT_NEVER_DEFINED(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_8_6, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_DECLARED_BUT_NEVER_DEFINED() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_8_6)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_DEFINED_MORE_THAN_ONCE(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_8_5, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_DEFINED_MORE_THAN_ONCE() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_8_5)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_DECLARED_BUT_NEVER_REFERENCED(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_2_2, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_DECLARED_BUT_NEVER_REFERENCED() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_2_2)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_INTEGER_OVERFLOW(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(INTEGER_OVERFLOW, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_INT30_C, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_INT32_C, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_INT08_C, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_12_4, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INTEGER_OVERFLOW() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_12_4) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_INT08_C) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_INT32_C) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_INT30_C) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(INTEGER_OVERFLOW)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_INTEGER_WRAP(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_INT30_C, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_INT08_C, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INTEGER_WRAP() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_INT08_C) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_INT30_C)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_POINTER_INCOMPATIBLE(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_EXP39_C, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_POINTER_INCOMPATIBLE() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_EXP39_C)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_DEREFERENCE_NULL_POINTER(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_EXP34_C, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(FORWARD_NULL, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_DEREFERENCE_NULL_POINTER() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(FORWARD_NULL) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_EXP34_C)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_SWITCH_STATEMENT_NOT_WELL_FORMED(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_16_1, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_16_3, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_16_6, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_SWITCH_STATEMENT_NOT_WELL_FORMED() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_16_1) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_16_3) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_16_6)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_CONTROLLING_EXPRESSION_IS_INVARIANT(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_14_3, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CONTROLLING_EXPRESSION_IS_INVARIANT() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_ESCAPING_LOCAL_ADDRESS(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_18_6, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_ESCAPING_LOCAL_ADDRESS() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_18_6)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_BOOLEAN_TYPE_FOR_CONDITIONAL_EXPRESSION() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_14_4, \"Conditional expression does have a boolean type.\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_BOOLEAN_TYPE_FOR_CONDITIONAL_EXPRESSION() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_14_4)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_C11_EXTENSION(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_CLANG_START_SUPPRESS_WARNING(-Wc11-extensions, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_C11_EXTENSION() \\\r\n  MCUX_CSSL_ANALYSIS_CLANG_STOP_SUPPRESS_WARNING(-Wc11-extensions)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_UNDEFINED_VALUE(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_CLANG_START_SUPPRESS_WARNING(-Wundef, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_UNDEFINED_VALUE() \\\r\n  MCUX_CSSL_ANALYSIS_CLANG_STOP_SUPPRESS_WARNING(-Wundef)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_RESERVED_IDENTIFIER(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_CLANG_START_SUPPRESS_WARNING(-Wreserved-identifier, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_RESERVED_IDENTIFIER() \\\r\n  MCUX_CSSL_ANALYSIS_CLANG_STOP_SUPPRESS_WARNING(-Wreserved-identifier)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_RESERVED_MACRO_IDENTIFIER(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_CLANG_START_SUPPRESS_WARNING(-Wreserved-macro-identifier, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_RESERVED_MACRO_IDENTIFIER() \\\r\n  MCUX_CSSL_ANALYSIS_CLANG_STOP_SUPPRESS_WARNING(-Wreserved-macro-identifier)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_MISSING_FUNCTION_DECLARATION(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_8_4, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_MISSING_FUNCTION_DECLARATION() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_8_4)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_MISSING_VARIABLE_DECLARATION(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_CLANG_START_SUPPRESS_WARNING(-Wmissing-variable-declarations, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_8_4, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_MISSING_VARIABLE_DECLARATION() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_8_4) \\\r\n  MCUX_CSSL_ANALYSIS_CLANG_STOP_SUPPRESS_WARNING(-Wmissing-variable-declarations)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_CAST_OF_COMPOSITE_EXPRESSION(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_10_8, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CAST_OF_COMPOSITE_EXPRESSION() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_10_8)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_UNUSED_VARIABLE(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_CLANG_START_SUPPRESS_WARNING(-Wunused-variable, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_UNUSED_VARIABLE() \\\r\n  MCUX_CSSL_ANALYSIS_CLANG_STOP_SUPPRESS_WARNING(-Wunused-variable)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_PADDED_TO_ALIGNMENT_BOUNDARY(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_CLANG_START_SUPPRESS_WARNING(-Wpadded, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_PADDED_TO_ALIGNMENT_BOUNDARY() \\\r\n  MCUX_CSSL_ANALYSIS_CLANG_STOP_SUPPRESS_WARNING(-Wpadded)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_HARDWARE_ACCESS(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_GCC_START_SUPPRESS_WARNING(-Warray-bounds, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_HARDWARE_ACCESS() \\\r\n  MCUX_CSSL_ANALYSIS_GCC_STOP_SUPPRESS_WARNING(-Warray-bounds)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_TAINTED_EXPRESSION(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Directive_4_14, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(TAINTED_SCALAR, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_TAINTED_EXPRESSION() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Directive_4_14) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(TAINTED_SCALAR)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_INVALID_WIDTH_IN_SHIFT_OPERATIONS(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Directive_12_2, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INVALID_WIDTH_IN_SHIFT_OPERATIONS() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Directive_12_2)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_CONVERSIONS_WITH_INAPPROPRIATE_TYPE(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_10_4, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CONVERSIONS_WITH_INAPPROPRIATE_TYPE() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_10_4)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_OPERATIONS_ON_INAPPROPRIATE_TYPE(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_10_1, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_OPERATIONS_ON_INAPPROPRIATE_TYPE() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_10_1)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_FLEXIBLE_ARRAY(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_18_7, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_FLEXIBLE_ARRAY() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_18_7)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_ASSIGNING_COMPOSITE_EXPRESSION(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_10_6, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_ASSIGNING_COMPOSITE_EXPRESSION() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_10_6)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_STDARG_USAGE(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_17_1, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_STDARG_USAGE() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_17_1)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_VA_ARGS_USAGE(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_10_1, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_10_4, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_20_7, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_VA_ARGS_USAGE() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_20_7) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_10_4) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_10_1)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_TYPECAST_VOIDPTR_TO_FUNCTION(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_11_5, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_TYPECAST_VOIDPTR_TO_FUNCTION() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_11_5)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_CONCATENATION_PREPROCESSOR(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_20_10, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CONCATENATION_PREPROCESSOR() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_20_10)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_SIGNED_SHIFT_AMOUNT(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_INT13_C, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_INT14_C, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_SIGNED_SHIFT_AMOUNT() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_INT14_C) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_INT13_C)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_MODIFY_STRING_LITERALS(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_STR30_C, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_MODIFY_STRING_LITERALS() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_STR30_C)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_RETURN_CODE_NOT_CHECKED(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Directive_4_7, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_RETURN_CODE_NOT_CHECKED() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Directive_4_7)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_CAST_TO_VOIDPTR(rationale) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_11_6, rationale)\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CAST_TO_VOIDPTR() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_11_6)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_FUNCTIONS_CONSUMED_BY_CUSTOMER() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_DCL15_C, \"can not make function static as it is consumed by customers.\") \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_DCL19_C, \"can not make function static as it is consumed by customers.\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_FUNCTIONS_CONSUMED_BY_CUSTOMER() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_DCL19_C) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_DCL15_C)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_TYPE_NAME_DOESNT_NEED_TO_BE_WRAPPED_BY_PARANTHESIS() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_20_7, \" Not wrapping a macro parameter in parentheses is allowed, if the parameter represents a type name\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_TYPE_NAME_DOESNT_NEED_TO_BE_WRAPPED_BY_PARANTHESIS() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_20_7)\r\n\r\n#define MCUX_CSSL_ANALYSIS_START_SUPPRESS_IMPLICIT_CAST_FROM_CHAR() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_10_3, \"Implicit cast between char and uint8_t in examples is allowed for readability purposes\")\r\n#define MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_IMPLICIT_CAST_FROM_CHAR() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_10_3)\r\n\r\n/* Tool specific handling: Coverity checkers */\r\n#if defined(__COVERITY__)\r\n\r\n#define MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(checker_identifier, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_EXPAND(MCUX_CSSL_ANALYSIS_DEFER(MCUX_CSSL_ANALYSIS_PRAGMA)(coverity compliance block deviate checker_identifier rationale))\r\n#define MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(checker_identifier) \\\r\n  MCUX_CSSL_ANALYSIS_EXPAND(MCUX_CSSL_ANALYSIS_DEFER(MCUX_CSSL_ANALYSIS_PRAGMA)(coverity compliance end_block checker_identifier))\r\n\r\n#define MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(checker_identifier, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_EXPAND(MCUX_CSSL_ANALYSIS_DEFER(MCUX_CSSL_ANALYSIS_PRAGMA)(coverity compliance block fp checker_identifier rationale))\r\n#define MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(checker_identifier) \\\r\n  MCUX_CSSL_ANALYSIS_EXPAND(MCUX_CSSL_ANALYSIS_DEFER(MCUX_CSSL_ANALYSIS_PRAGMA)(coverity compliance end_block checker_identifier))\r\n\r\n#define MCUX_CSSL_ANALYSIS_COVERITY_ASSERT(value, min_value, max_value, return_code) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(NO_EFFECT, \"The minimum or the maximum value may have no effect for the condition.\") \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_CONTROLLING_EXPRESSION_IS_INVARIANT(\"The minimum or the maximum value may have no effect for the condition.\") \\\r\n  if(((min_value) <= (value)) && ((value) <= (max_value))) \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CONTROLLING_EXPRESSION_IS_INVARIANT() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(NO_EFFECT) \\\r\n  {\\\r\n    /* Do Nothing*/ \\\r\n  }\\\r\n  else \\\r\n  {\\\r\n    MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_17_4, \"For void return, don't need to return a value at the end of function\")\\\r\n    return return_code;\\\r\n    MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_17_4)\\\r\n  }\r\n\r\n#define MCUX_CSSL_ANALYSIS_COVERITY_ASSERT_WITH_DATA_TYPE(value, data_type, min_value, max_value, return_code) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(CERT_INT36_C, \"The minimum or the maximum value may have no effect for the condition.\") \\\r\n  MCUX_CSSL_ANALYSIS_START_SUPPRESS_CONTROLLING_EXPRESSION_IS_INVARIANT(\"This is for the case where value is unsigned and min_value is unsigned zero.\") \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_11_4, \"The minimum or the maximum value may have no effect for the condition.\") \\\r\n  if((((data_type)(min_value)) <= ((data_type)(value))) && (((data_type)(value)) <= ((data_type)(max_value)))) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_11_4) \\\r\n  MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CONTROLLING_EXPRESSION_IS_INVARIANT() \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(CERT_INT36_C) \\\r\n  {\\\r\n    /* Do Nothing*/ \\\r\n  }\\\r\n  else \\\r\n  {\\\r\n    return return_code;\\\r\n  }\r\n\r\n\r\n#else\r\n#define MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(checker_identifier, rationale)\r\n#define MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(checker_identifier)\r\n\r\n#define MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(checker_identifier, rationale)\r\n#define MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(checker_identifier)\r\n\r\n#define MCUX_CSSL_ANALYSIS_COVERITY_ASSERT(value, min_value, max_value, return_code)\r\n#define MCUX_CSSL_ANALYSIS_COVERITY_ASSERT_WITH_DATA_TYPE(value, data_type, min_value, max_value, return_code)\r\n#endif\r\n\r\n/* Tool specific handling: Clang warnings */\r\n#if defined(__clang__)\r\n#define MCUX_CSSL_ANALYSIS_CLANG_START_SUPPRESS_WARNING(warning_identifier, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_EXPAND(MCUX_CSSL_ANALYSIS_DEFER(MCUX_CSSL_ANALYSIS_PRAGMA)(clang diagnostic push)) \\\r\n  MCUX_CSSL_ANALYSIS_EXPAND(MCUX_CSSL_ANALYSIS_DEFER(MCUX_CSSL_ANALYSIS_PRAGMA)(clang diagnostic ignored MCUX_CSSL_ANALYSIS_STR(warning_identifier)))\r\n#define MCUX_CSSL_ANALYSIS_CLANG_STOP_SUPPRESS_WARNING(warning_identifier) \\\r\n  MCUX_CSSL_ANALYSIS_EXPAND(MCUX_CSSL_ANALYSIS_DEFER(MCUX_CSSL_ANALYSIS_PRAGMA)(clang diagnostic pop))\r\n#else\r\n#define MCUX_CSSL_ANALYSIS_CLANG_START_SUPPRESS_WARNING(warning_identifier, rationale)\r\n#define MCUX_CSSL_ANALYSIS_CLANG_STOP_SUPPRESS_WARNING(warning_identifier)\r\n#endif\r\n\r\n/* Tool specific handling: GHS warnings */\r\n#if defined(__ghs__)\r\n#define MCUX_CSSL_ANALYSIS_GHS_START_SUPPRESS_WARNING(warning_identifier, rationale) \\\r\n  MCUX_CSSL_ANALYSIS_PRAGMA(ghs nowarning warning_identifier)\r\n#define MCUX_CSSL_ANALYSIS_GHS_STOP_SUPPRESS_WARNING(warning_identifier) \\\r\n  MCUX_CSSL_ANALYSIS_PRAGMA(ghs endnowarning warning_identifier)\r\n#else\r\n#define MCUX_CSSL_ANALYSIS_GHS_START_SUPPRESS_WARNING(warning_identifier, rationale)\r\n#define MCUX_CSSL_ANALYSIS_GHS_STOP_SUPPRESS_WARNING(warning_identifier)\r\n#endif\r\n\r\n/* Tool specific handling: GCC warnings */\r\n#if defined(__GNUC__)\r\n#define MCUX_CSSL_ANALYSIS_GCC_START_SUPPRESS_WARNING(warning_identifier, rationale)  \\\r\n  MCUX_CSSL_ANALYSIS_EXPAND(MCUX_CSSL_ANALYSIS_DEFER(MCUX_CSSL_ANALYSIS_PRAGMA)(GCC diagnostic push)) \\\r\n  MCUX_CSSL_ANALYSIS_EXPAND(MCUX_CSSL_ANALYSIS_DEFER(MCUX_CSSL_ANALYSIS_PRAGMA)(GCC diagnostic ignored MCUX_CSSL_ANALYSIS_STR(warning_identifier)))\r\n#define MCUX_CSSL_ANALYSIS_GCC_STOP_SUPPRESS_WARNING(warning_identifier)  \\\r\n  MCUX_CSSL_ANALYSIS_EXPAND(MCUX_CSSL_ANALYSIS_DEFER(MCUX_CSSL_ANALYSIS_PRAGMA)(GCC diagnostic pop))\r\n#else\r\n#define MCUX_CSSL_ANALYSIS_GCC_START_SUPPRESS_WARNING(warning_identifier, rationale)\r\n#define MCUX_CSSL_ANALYSIS_GCC_STOP_SUPPRESS_WARNING(warning_identifier)\r\n#endif\r\n\r\n/* Arm Compiler 4/5 */\r\n#if defined(MCUX_CSSL_COMPILER_ARMCC)\r\n#define MCUX_CSSL_ANALYSIS_ARMCC_START_SUPPRESS_WARNING(warning_identifier, rationale)  \\\r\n  MCUX_CSSL_ANALYSIS_EXPAND(MCUX_CSSL_ANALYSIS_DEFER(MCUX_CSSL_ANALYSIS_PRAGMA)(push)) \\\r\n  MCUX_CSSL_ANALYSIS_EXPAND(MCUX_CSSL_ANALYSIS_DEFER(MCUX_CSSL_ANALYSIS_PRAGMA)(diag_suppress MCUX_CSSL_ANALYSIS_STR(warning_identifier)))\r\n#define MCUX_CSSL_ANALYSIS_ARMCC_STOP_SUPPRESS_WARNING(warning_identifier)  \\\r\n  MCUX_CSSL_ANALYSIS_EXPAND(MCUX_CSSL_ANALYSIS_DEFER(MCUX_CSSL_ANALYSIS_PRAGMA)(pop))\r\n#else\r\n#define MCUX_CSSL_ANALYSIS_ARMCC_START_SUPPRESS_WARNING(warning_identifier, rationale)\r\n#define MCUX_CSSL_ANALYSIS_ARMCC_STOP_SUPPRESS_WARNING(warning_identifier)\r\n#endif\r\n\r\n/* Arm Compiler 6 / Arm Compiler for Embedded 6 */\r\n#if defined(MCUX_CSSL_COMPILER_ARMCLANG) || defined(MCUX_CSSL_COMPILER_ARMCLANG_LTM)\r\n#define MCUX_CSSL_ANALYSIS_ARMCLANG_START_SUPPRESS_WARNING(warning_identifier, rationale)  \\\r\n  MCUX_CSSL_ANALYSIS_EXPAND(MCUX_CSSL_ANALYSIS_DEFER(MCUX_CSSL_ANALYSIS_PRAGMA)(clang diagnostic push)) \\\r\n  MCUX_CSSL_ANALYSIS_EXPAND(MCUX_CSSL_ANALYSIS_DEFER(MCUX_CSSL_ANALYSIS_PRAGMA)(clang diagnostic ignored MCUX_CSSL_ANALYSIS_STR(warning_identifier)))\r\n#define MCUX_CSSL_ANALYSIS_ARMCLANG_STOP_SUPPRESS_WARNING(warning_identifier)  \\\r\n  MCUX_CSSL_ANALYSIS_EXPAND(MCUX_CSSL_ANALYSIS_DEFER(MCUX_CSSL_ANALYSIS_PRAGMA)(clang diagnostic pop))\r\n#else\r\n#define MCUX_CSSL_ANALYSIS_ARMCLANG_START_SUPPRESS_WARNING(warning_identifier, rationale)\r\n#define MCUX_CSSL_ANALYSIS_ARMCLANG_STOP_SUPPRESS_WARNING(warning_identifier)\r\n#endif\r\n\r\n#endif /* MCUX_CSSL_ANALYSIS_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslCPreProcessor/inc/mcuxCsslCPreProcessor.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2019-2020, 2023 NXP                                            */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n#ifndef MCUX_CSSL_C_PRE_PROCESSOR_H_\r\n#define MCUX_CSSL_C_PRE_PROCESSOR_H_\r\n\r\n/**\r\n * @file  mcuxCsslCPreProcessor.h\r\n * @brief The default implementation is based on standard C preprocessor\r\n * functionality\r\n */\r\n\r\n#define MCUX_CSSL_CPP_STR(a) #a\r\n\r\n#define MCUX_CSSL_CPP_ADD(a) + (a)\r\n\r\n#define MCUX_CSSL_CPP_CAT_IMPL(a, b) a##b\r\n\r\n#define MCUX_CSSL_CPP_CAT(a, b) \\\r\n  MCUX_CSSL_CPP_CAT_IMPL(a, b)\r\n\r\n#define MCUX_CSSL_CPP_CAT3(a, b, c) \\\r\n  MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_CAT(a, b), c)\r\n\r\n#define MCUX_CSSL_CPP_CAT4(a, b, c, d) \\\r\n  MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_CAT(a, b), MCUX_CSSL_CPP_CAT(c, d))\r\n\r\n#define MCUX_CSSL_CPP_CAT6(a, b, c, d, e, f) \\\r\n  MCUX_CSSL_CPP_CAT3( \\\r\n    MCUX_CSSL_CPP_CAT(a, b), \\\r\n    MCUX_CSSL_CPP_CAT(c, d), \\\r\n    MCUX_CSSL_CPP_CAT(e, f))\r\n\r\n#define MCUX_CSSL_CPP_SEQUENCE_32TO0() \\\r\n  32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, \\\r\n  16, 15, 14, 13, 12, 11, 10,  9,  8,  7,  6,  5,  4,  3,  2,  1, 0\r\n\r\n#define MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_5TO0() \\\r\n  n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \\\r\n  n, n, n, n, n, n, n, n, n, n, n, 5, 4, 3, 2, 1, 0\r\n\r\n#define MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_4TO0() \\\r\n  n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \\\r\n  n, n, n, n, n, n, n, n, n, n, n, n, 4, 3, 2, 1, 0\r\n\r\n#define MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_3TO0() \\\r\n  n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \\\r\n  n, n, n, n, n, n, n, n, n, n, n, n, n, 3, 2, 1, 0\r\n\r\n#define MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_2TO0() \\\r\n  n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, \\\r\n  n, n, n, n, n, n, n, n, n, n, n, n, n, n, 2, 1, 0\r\n\r\n#define MCUX_CSSL_CPP_ARG_N( \\\r\n  _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, \\\r\n  _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, \\\r\n  N, ...) \\\r\n    N\r\n\r\n#define MCUX_CSSL_CPP_ARGCOUNT_IMPL(...) \\\r\n  MCUX_CSSL_CPP_ARG_N(__VA_ARGS__)\r\n\r\n#define MCUX_CSSL_CPP_ARGCOUNT(...) \\\r\n  MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_32TO0())\r\n\r\n#define MCUX_CSSL_CPP_ARGCOUNT_2N(...) \\\r\n  MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_2TO0())\r\n\r\n#define MCUX_CSSL_CPP_ARGCOUNT_3N(...) \\\r\n  MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_3TO0())\r\n\r\n#define MCUX_CSSL_CPP_ARGCOUNT_4N(...) \\\r\n  MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_4TO0())\r\n\r\n#define MCUX_CSSL_CPP_ARGCOUNT_5N(...) \\\r\n  MCUX_CSSL_CPP_ARGCOUNT_IMPL(__VA_ARGS__,MCUX_CSSL_CPP_SEQUENCE_N_UNTIL_5TO0())\r\n\r\n#define MCUX_CSSL_CPP_OVERLOADED_IMPL(name, n) MCUX_CSSL_CPP_CAT_IMPL(name, n)\r\n\r\n#define MCUX_CSSL_CPP_OVERLOADED(name, ...) \\\r\n  MCUX_CSSL_CPP_DEFER2(MCUX_CSSL_CPP_OVERLOADED_IMPL)()(name, MCUX_CSSL_CPP_ARGCOUNT(__VA_ARGS__))\r\n\r\n#define MCUX_CSSL_CPP_OVERLOADED1(name, ...) \\\r\n  MCUX_CSSL_CPP_IF_ELSE(MCUX_CSSL_CPP_HAS_ONE_ARG(__VA_ARGS__))( \\\r\n    /* If only one arg, use the 1 version */ \\\r\n    MCUX_CSSL_CPP_CAT(name,1)(MCUX_CSSL_CPP_FIRST(__VA_ARGS__, /* ensure extra argument: */ 0)) \\\r\n  )( \\\r\n    /* Otherwise the n version */ \\\r\n    MCUX_CSSL_CPP_CAT(name,n)(__VA_ARGS__) \\\r\n  )\r\n\r\n#define MCUX_CSSL_CPP_OVERLOADED2(name, ...) \\\r\n  MCUX_CSSL_CPP_OVERLOADED_IMPL(name, MCUX_CSSL_CPP_ARGCOUNT_2N(__VA_ARGS__))(__VA_ARGS__)\r\n\r\n#define MCUX_CSSL_CPP_OVERLOADED3(name, ...) \\\r\n  MCUX_CSSL_CPP_OVERLOADED_IMPL(name, MCUX_CSSL_CPP_ARGCOUNT_3N(__VA_ARGS__))(__VA_ARGS__)\r\n\r\n#define MCUX_CSSL_CPP_OVERLOADED4(name, ...) \\\r\n  MCUX_CSSL_CPP_OVERLOADED_IMPL(name, MCUX_CSSL_CPP_ARGCOUNT_4N(__VA_ARGS__))(__VA_ARGS__)\r\n\r\n#define MCUX_CSSL_CPP_OVERLOADED5(name, ...) \\\r\n  MCUX_CSSL_CPP_OVERLOADED_IMPL(name, MCUX_CSSL_CPP_ARGCOUNT_5N(__VA_ARGS__))(__VA_ARGS__)\r\n\r\n/*****************************************************************************\r\n * Helper macros                                                             *\r\n *****************************************************************************/\r\n\r\n/* Apply a macro to all arguments */\r\n#define MCUX_CSSL_CPP_MAP(__macro, ...) \\\r\n  MCUX_CSSL_CPP_EVAL(MCUX_CSSL_CPP_MAP_IMPL(__macro, __VA_ARGS__))\r\n\r\n/* Evaluate a complex macro (which needs multiple expansions to be processed) */\r\n#define MCUX_CSSL_CPP_EVAL(...)     MCUX_CSSL_CPP_EVAL1024(__VA_ARGS__)\r\n#define MCUX_CSSL_CPP_EVAL1024(...) MCUX_CSSL_CPP_EVAL512(MCUX_CSSL_CPP_EVAL512(__VA_ARGS__))\r\n#define MCUX_CSSL_CPP_EVAL512(...)  MCUX_CSSL_CPP_EVAL256(MCUX_CSSL_CPP_EVAL256(__VA_ARGS__))\r\n#define MCUX_CSSL_CPP_EVAL256(...)  MCUX_CSSL_CPP_EVAL128(MCUX_CSSL_CPP_EVAL128(__VA_ARGS__))\r\n#define MCUX_CSSL_CPP_EVAL128(...)  MCUX_CSSL_CPP_EVAL64( MCUX_CSSL_CPP_EVAL64( __VA_ARGS__))\r\n#define MCUX_CSSL_CPP_EVAL64(...)   MCUX_CSSL_CPP_EVAL32( MCUX_CSSL_CPP_EVAL32( __VA_ARGS__))\r\n#define MCUX_CSSL_CPP_EVAL32(...)   MCUX_CSSL_CPP_EVAL16( MCUX_CSSL_CPP_EVAL16( __VA_ARGS__))\r\n#define MCUX_CSSL_CPP_EVAL16(...)   MCUX_CSSL_CPP_EVAL8(  MCUX_CSSL_CPP_EVAL8(  __VA_ARGS__))\r\n#define MCUX_CSSL_CPP_EVAL8(...)    MCUX_CSSL_CPP_EVAL4(  MCUX_CSSL_CPP_EVAL4(  __VA_ARGS__))\r\n#define MCUX_CSSL_CPP_EVAL4(...)    MCUX_CSSL_CPP_EVAL2(  MCUX_CSSL_CPP_EVAL2(  __VA_ARGS__))\r\n#define MCUX_CSSL_CPP_EVAL2(...)    MCUX_CSSL_CPP_EVAL1(  MCUX_CSSL_CPP_EVAL1(  __VA_ARGS__))\r\n#define MCUX_CSSL_CPP_EVAL1(...)    __VA_ARGS__\r\n\r\n/* Recursive definition of map macro, assumes at least one argument */\r\n#define MCUX_CSSL_CPP_MAP_IMPL(__macro, ...) \\\r\n  /* Apply the macro to the first argument from the list */\\\r\n  __macro(MCUX_CSSL_CPP_FIRST(__VA_ARGS__, /* ensure second argument: */ 0)) \\\r\n  /* Only proceed if there are additional arguments */\\\r\n  MCUX_CSSL_CPP_IF(MCUX_CSSL_CPP_HAS_MORE_ARGS(__VA_ARGS__))( \\\r\n    /* Recursive call for remaining arguments */\\\r\n    MCUX_CSSL_CPP_DEFER2(MCUX_CSSL_CPP_MAP_IMPL_)()(__macro, \\\r\n      MCUX_CSSL_CPP_NEXT(__VA_ARGS__)) \\\r\n  )\r\n#define MCUX_CSSL_CPP_MAP_IMPL_() MCUX_CSSL_CPP_MAP_IMPL\r\n\r\n/* Extract first argument (requires at least two arguments to be present) */\r\n#define MCUX_CSSL_CPP_FIRST(a, ...) a\r\n/* Extract second argument (requires at least three arguments to be present) */\r\n#define MCUX_CSSL_CPP_SECOND(a, b, ...) b\r\n/* Extract third argument (requires at least four arguments to be present) */\r\n#define MCUX_CSSL_CPP_THIRD(a, b, c, ...) c\r\n/* Extract fourth argument (requires at least five arguments to be present) */\r\n#define MCUX_CSSL_CPP_FOURTH(a, b, c, d, ...) d\r\n/* Remove the first argument from the list (requires at least two arguments to be present) */\r\n#define MCUX_CSSL_CPP_NEXT(...) MCUX_CSSL_CPP_NEXT_()(__VA_ARGS__)\r\n#define MCUX_CSSL_CPP_NEXT_() MCUX_CSSL_CPP_NEXT__\r\n#define MCUX_CSSL_CPP_NEXT__(x, ...) __VA_ARGS__\r\n\r\n/* Check whether there is more then one argument */\r\n#define MCUX_CSSL_CPP_HAS_MORE_ARGS(...) \\\r\n  MCUX_CSSL_CPP_NOT(MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_SECOND(__VA_ARGS__, MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER())))\r\n\r\n#define MCUX_CSSL_CPP_HAS_ONE_ARG(...) \\\r\n  MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_SECOND(__VA_ARGS__, MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER()))\r\n\r\n#define MCUX_CSSL_CPP_HAS_TWO_ARGS(...) \\\r\n  MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_THIRD(__VA_ARGS__, MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER()))\r\n\r\n#define MCUX_CSSL_CPP_HAS_THREE_ARGS(...) \\\r\n  MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_FOURTH(__VA_ARGS__, MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER(), MCUX_CSSL_CPP_MARKER()))\r\n\r\n\r\n/* Check whether the argument is MCUX_CSSL_CPP_MARKER(), return 1 if it is */\r\n#define MCUX_CSSL_CPP_IS_MARKER(...) \\\r\n  MCUX_CSSL_CPP_SECOND(__VA_ARGS__, 0, 0)\r\n#define MCUX_CSSL_CPP_MARKER() \\\r\n  ~, 1\r\n\r\n/* Convert any argument into a bool (either 0 or 1), by double negation */\r\n#define MCUX_CSSL_CPP_BOOL(x) MCUX_CSSL_CPP_NOT(MCUX_CSSL_CPP_NOT(x))\r\n\r\n/* Boolean negation (map value 0 to the marker, and check if we have the marker) */\r\n#define MCUX_CSSL_CPP_NOT(x) MCUX_CSSL_CPP_IS_MARKER(MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_NOT_BOOL_, x))\r\n#define MCUX_CSSL_CPP_NOT_BOOL_0 MCUX_CSSL_CPP_MARKER()\r\n\r\n/* Convert condition to bool */\r\n#define MCUX_CSSL_CPP_IF(condition) MCUX_CSSL_CPP_IF_(MCUX_CSSL_CPP_BOOL(condition))\r\n/* Convert bool to decision defines */\r\n#define MCUX_CSSL_CPP_IF_(condition) MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_IF_BOOL_, condition)\r\n/* If 0, do nothing*/\r\n#define MCUX_CSSL_CPP_IF_BOOL_0(...)\r\n/* If 1, perform action */\r\n#define MCUX_CSSL_CPP_IF_BOOL_1(...) __VA_ARGS__\r\n\r\n/* Convert condition to bool */\r\n#define MCUX_CSSL_CPP_IF_ELSE(condition) MCUX_CSSL_CPP_IF_ELSE_IMPL(MCUX_CSSL_CPP_BOOL(condition))\r\n/* Convert bool to decision defines */\r\n#define MCUX_CSSL_CPP_IF_ELSE_IMPL(condition) MCUX_CSSL_CPP_CAT(MCUX_CSSL_CPP_IFE_BOOL_, condition)\r\n/* If 0, ignore action */\r\n#define MCUX_CSSL_CPP_IFE_BOOL_0(...)             MCUX_CSSL_CPP_IFE_BOOL_0_ELSE\r\n/* Else 0, perform action */\r\n#define MCUX_CSSL_CPP_IFE_BOOL_0_ELSE(...) __VA_ARGS__\r\n/* If 1, perform action */\r\n#define MCUX_CSSL_CPP_IFE_BOOL_1(...) __VA_ARGS__ MCUX_CSSL_CPP_IFE_BOOL_1_ELSE\r\n/* Else 1, ignore action */\r\n\r\n#define MCUX_CSSL_CPP_IFE_BOOL_1_ELSE(...)\r\n\r\n/* Defer macro expansion */\r\n#define MCUX_CSSL_CPP_EMPTY()\r\n#define MCUX_CSSL_CPP_DEFER1(macro) macro MCUX_CSSL_CPP_EMPTY()\r\n#define MCUX_CSSL_CPP_DEFER2(macro) macro MCUX_CSSL_CPP_EMPTY MCUX_CSSL_CPP_EMPTY()()\r\n\r\n#endif /* MCUX_CSSL_C_PRE_PROCESSOR_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslDataIntegrity/inc/mcuxCsslDataIntegrity.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxCsslDataIntegrity.h\r\n * @brief Provides the API for the CSSL data integrity mechanism.\r\n */\r\n\r\n#ifndef MCUXCSSLDATAINTEGRITY_H_\r\n#define MCUXCSSLDATAINTEGRITY_H_\r\n\r\n/* Include the Secure Counter definitions */\r\n#include <mcuxCsslSecureCounter.h>\r\n\r\n/* Include the actual implementation of the data integrity mechanism. */\r\n#include <mcuxCsslDataIntegrity_Impl.h>\r\n\r\n/**\r\n * @addtogroup mcuxCsslAPI MCUX CSSL -- API\r\n *\r\n * @defgroup mcuxCsslDataIntegrity Data Integrity API\r\n * @brief Data integrity mechanism.\r\n * @ingroup mcuxCsslAPI\r\n */\r\n\r\n\r\n/**\r\n * @defgroup diCore Data integrity core functionality\r\n * @brief Data integrity handling core functionality.\r\n * @ingroup mcuxCsslDataIntegrity\r\n */\r\n\r\n/****************************************************************************/\r\n/* Constants                                                                */\r\n/****************************************************************************/\r\n\r\n/**\r\n * @def MCUX_CSSL_DI_CHECK_PASSED\r\n * @brief Positive comparison result value.\r\n * @api\r\n * @ingroup diCore\r\n */\r\n#define MCUX_CSSL_DI_CHECK_PASSED \\\r\n  MCUX_CSSL_DI_CHECK_PASSED_IMPL\r\n\r\n/**\r\n * @def MCUX_CSSL_DI_CHECK_FAILED\r\n * @brief Negative comparison result value.\r\n * @api\r\n * @ingroup diCore\r\n */\r\n#define MCUX_CSSL_DI_CHECK_FAILED \\\r\n  MCUX_CSSL_DI_CHECK_FAILED_IMPL\r\n\r\n/****************************************************************************/\r\n/* Initialization                                                           */\r\n/****************************************************************************/\r\n\r\n/**\r\n * @def MCUX_CSSL_DI_INIT\r\n * @brief Backup of the current data integrity value, that will be checked later\r\n *        on with MCUX_CSSL_SC_CHECK.\r\n *        Note that in case the Security Counter back-end requires allocation, it\r\n *        is expected that this will be handled by the Flow Protection mechanism\r\n *        before the initialization of the Data Integrity.\r\n * @api\r\n * @ingroup diCore\r\n *\r\n * @param backupValue Fresh variable name to store the current DI value.\r\n */\r\n#define MCUX_CSSL_DI_INIT(backupValue) \\\r\n  MCUX_CSSL_DI_INIT_IMPL(backupValue)\r\n\r\n/****************************************************************************/\r\n/* Check                                                                    */\r\n/****************************************************************************/\r\n\r\n/**\r\n * @def MCUX_CSSL_DI_CHECK\r\n * @brief Comparison operation for the data integrity.\r\n * @api\r\n * @ingroup diCore\r\n *\r\n * @param reference Reference value to compare the data integrity value against.\r\n * @return          Either #MCUX_CSSL_DI_CHECK_PASSED, if the value matches, or\r\n *                  #MCUX_CSSL_DI_CHECK_FAILED if the value is different.\r\n */\r\n#define MCUX_CSSL_DI_CHECK(reference) \\\r\n  MCUX_CSSL_DI_CHECK_IMPL(reference)\r\n\r\n/**\r\n * @def MCUX_CSSL_DI_CHECK_EXIT\r\n * @brief Comparison operation for the data integrity.\r\n *        It compares the data integrity value to reference value, and exits\r\n *        with the given fault status code if the comparison fails.\r\n *        If the comparison succeeds, the normal execution will continue.\r\n * @api\r\n * @ingroup diCore\r\n *\r\n * @param id        Identifier of the function from which we will exit.\r\n * @param reference Reference value to compare the data integrity value against.\r\n * @param fail      Result that should be returned if the data integrity check failed.\r\n */\r\n#define MCUX_CSSL_DI_CHECK_EXIT(id, reference, fail) \\\r\n  MCUX_CSSL_DI_CHECK_EXIT_IMPL(id, reference, fail)\r\n\r\n/****************************************************************************/\r\n/* Updates                                                                  */\r\n/****************************************************************************/\r\n\r\n/**\r\n * @defgroup diUpdate Data integrity record\r\n * @brief Support for recording a value in the data integrity register\r\n * @ingroup mcuxCsslDataIntegrity\r\n */\r\n\r\n/**\r\n * @def MCUX_CSSL_DI_RECORD\r\n * @brief Record the @p value for data integrity checking.\r\n * @api\r\n * @ingroup diUpdate\r\n *\r\n * @param identifier Identifier for the @p value that will be recorded.\r\n * @param value Value which needs to be recorded for the given @p identifier.\r\n */\r\n#define MCUX_CSSL_DI_RECORD(identifier, value) \\\r\n  MCUX_CSSL_DI_RECORD_IMPL(identifier, value)\r\n\r\n/**\r\n * @def MCUX_CSSL_DI_EXPUNGE\r\n * @brief Expunge the record for @p value.\r\n * @api\r\n * @ingroup diUpdate\r\n *\r\n * @param identifier Identifier for the @p value that will be expunged.\r\n * @param value Expected value that was recorded for the given @p identifier.\r\n */\r\n#define MCUX_CSSL_DI_EXPUNGE(identifier, value) \\\r\n  MCUX_CSSL_DI_EXPUNGE_IMPL(identifier, value)\r\n\r\n#endif /* MCUXCSSLDATAINTEGRITY_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslDataIntegrity/inc/mcuxCsslDataIntegrity_Cfg.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * \\file  mcuxCsslDataIntegrity_Cfg.h\r\n * \\brief Configuration of the implementation for the data integrity mechanism.\r\n */\r\n\r\n#ifndef MCUXCSSLDATAINTEGRITY_CFG_H_\r\n#define MCUXCSSLDATAINTEGRITY_CFG_H_\r\n\r\n/**\r\n * \\addtogroup mcuxCsslCFG MCUX CSSL -- Configurations\r\n *\r\n * \\defgroup mcuxCsslDataIntegrity_CFG Data Integrity Configuration\r\n * \\brief Configuration options for the data integrity mechanism.\r\n * \\ingroup mcuxCsslCFG\r\n */\r\n\r\n/**\r\n * \\def MCUX_CSSL_DI_USE_SECURE_COUNTER\r\n * \\brief If set to 1, use the data integrity mechanism implementation based on\r\n *        the CSSL secure counter mechanism.\r\n * \\ingroup mcuxCsslDataIntegrity_CFG\r\n */\r\n    #define MCUX_CSSL_DI_USE_SECURE_COUNTER      0\r\n\r\n/**\r\n * \\def MCUX_CSSL_DI_USE_NONE\r\n * \\brief If set to 1, do not use the data integrity mechanism.\r\n * \\ingroup mcuxCsslDataIntegrity_CFG\r\n */\r\n    #define MCUX_CSSL_DI_USE_NONE    1\r\n\r\n/* Basic configuration sanity check */\r\n\r\n#endif /* MCUXCSSLDATAINTEGRITY_CFG_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslDataIntegrity/inc/mcuxCsslDataIntegrity_Impl.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * \\file  mcuxCsslDataIntegrity_Impl.h\r\n * \\brief Selection of the implementation for the data integrity mechanism.\r\n */\r\n\r\n#ifndef MCUXCSSLDATAINTEGRITY_IMPL_H_\r\n#define MCUXCSSLDATAINTEGRITY_IMPL_H_\r\n\r\n/* Include the configuration for the data integrity mechanism. */\r\n#include <mcuxCsslDataIntegrity_Cfg.h>\r\n\r\n/* Include the selected implementation of the data integrity mechanism. */\r\n#if defined(MCUX_CSSL_DI_USE_SECURE_COUNTER) && (1 == MCUX_CSSL_DI_USE_SECURE_COUNTER)\r\n#  include <mcuxCsslDataIntegrity_SecureCounter.h>\r\n#elif defined(MCUX_CSSL_DI_USE_NONE) && (1 == MCUX_CSSL_DI_USE_NONE)\r\n#  include <mcuxCsslDataIntegrity_None.h>\r\n#else\r\n  #error \"No data integrity implementation found/configured.\"\r\n#endif\r\n\r\n#endif /* MCUXCSSLDATAINTEGRITY_IMPL_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslDataIntegrity/inc/mcuxCsslDataIntegrity_None.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * \\file  mcuxCsslDataIntegrity_None.h\r\n * \\brief Implementation that disables the CSSL data integrity mechanism.\r\n */\r\n\r\n#ifndef MCUXCSSLDATAINTEGRITY_NONE_H_\r\n#define MCUXCSSLDATAINTEGRITY_NONE_H_\r\n\r\n/**\r\n * \\addtogroup mcuxCsslIMPL MCUX CSSL -- Implementations\r\n *\r\n * \\defgroup mcuxCsslDataIntegrity_None Data Integrity: Disabled\r\n * \\brief Disable the data integrity mechanism.\r\n * \\ingroup mcuxCsslIMPL\r\n */\r\n\r\n\r\n/**\r\n * \\defgroup diNoneCore Data integrity core functionality\r\n * \\brief Data integrity handling core functionality, when data integrity is disabled.\r\n * \\ingroup mcuxCsslDataIntegrity_None\r\n */\r\n\r\n/****************************************************************************/\r\n/* Constants                                                                */\r\n/****************************************************************************/\r\n\r\n/**\r\n * \\def MCUX_CSSL_DI_CHECK_PASSED_IMPL\r\n * \\brief Positive comparison result value.\r\n * \\ingroup diNoneCore\r\n */\r\n#define MCUX_CSSL_DI_CHECK_PASSED_IMPL (MCUX_CSSL_SC_CHECK_PASSED)\r\n\r\n/**\r\n * \\def MCUX_CSSL_DI_CHECK_FAILED_IMPL\r\n * \\brief Negative comparison result value.\r\n * \\ingroup diNoneCore\r\n */\r\n#define MCUX_CSSL_DI_CHECK_FAILED_IMPL (MCUX_CSSL_SC_CHECK_FAILED)\r\n\r\n/****************************************************************************/\r\n/* Initialization                                                           */\r\n/****************************************************************************/\r\n\r\n/**\r\n * \\def MCUX_CSSL_DI_INIT_IMPL\r\n * \\brief Initialize the backup of the data integrity value to zero.\r\n * \\ingroup diNoneCore\r\n *\r\n * @param backupValue Fresh variable name to store the current DI value.\r\n */\r\n#define MCUX_CSSL_DI_INIT_IMPL(backupValue) \\\r\n  uint32_t backupValue = 0u\r\n\r\n/****************************************************************************/\r\n/* Check                                                                    */\r\n/****************************************************************************/\r\n\r\n/**\r\n * \\def MCUX_CSSL_DI_CHECK_IMPL\r\n * \\brief Comparison operation implementation for the data integrity.\r\n * \\ingroup diNoneCore\r\n *\r\n * \\param reference Reference value to compare the data integrity value against.\r\n * \\return          Always #MCUX_CSSL_DI_CHECK_PASSED.\r\n */\r\n#define MCUX_CSSL_DI_CHECK_IMPL(reference) \\\r\n  (MCUX_CSSL_DI_CHECK_PASSED_IMPL)\r\n\r\n/**\r\n * \\def MCUX_CSSL_DI_CHECK_EXIT_IMPL\r\n * \\brief Comparison operation implementation for the data integrity.\r\n *        It has no impact on the normal execution of the calling function.\r\n * \\ingroup diNoneCore\r\n *\r\n * \\param id        Identifier of the function from which we will exit (ignored).\r\n * \\param reference Reference value to compare the data integrity value against.\r\n * \\param fail      Result that should be returned if the data integrity check failed (ignored).\r\n */\r\n#define MCUX_CSSL_DI_CHECK_EXIT_IMPL(id, reference, fail) \\\r\n  (void)(reference)\r\n\r\n/****************************************************************************/\r\n/* Updates                                                                  */\r\n/****************************************************************************/\r\n\r\n/**\r\n * \\defgroup diNoneUpdate Data integrity record\r\n * \\brief Support for recording a value in the data integrity register, when data integrity is disabled.\r\n * \\ingroup mcuxCsslDataIntegrity_None\r\n */\r\n\r\n/**\r\n * \\def MCUX_CSSL_DI_RECORD_IMPL\r\n * \\brief Implementation: Record the value for data integrity checking.\r\n * \\ingroup diNoneUpdate\r\n *\r\n * \\param identifier Identifier for the value that will be recorded.\r\n * \\param value      Value which needs to be recorded for the given identifier.\r\n */\r\n#define MCUX_CSSL_DI_RECORD_IMPL(identifier, value) \\\r\n  /* intentionally empty */\r\n\r\n/**\r\n * \\def MCUX_CSSL_DI_EXPUNGE_IMPL\r\n * \\brief Implementation: Expunge the record for value.\r\n * \\ingroup diNoneUpdate\r\n *\r\n * \\param identifier Identifier for the value that will be expunged.\r\n * \\param value      Expected value that was recorded for the given identifier.\r\n */\r\n#define MCUX_CSSL_DI_EXPUNGE_IMPL(identifier, value) \\\r\n  /* intentionally empty */\r\n\r\n\r\n#endif /* MCUXCSSLDATAINTEGRITY_NONE_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslFlowProtection/inc/mcuxCsslFlowProtection.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxCsslFlowProtection.h\r\n * @brief Provides the API for the CSSL flow protection mechanism.\r\n */\r\n\r\n#ifndef MCUX_CSSL_FLOW_PROTECTION_H_\r\n#define MCUX_CSSL_FLOW_PROTECTION_H_\r\n\r\n#include <mcuxCsslAnalysis.h>\r\n\r\n/* Include the actual implementation of the flow protection mechanism. */\r\n#include <mcuxCsslFlowProtection_Impl.h>\r\n\r\n/**\r\n * @addtogroup mcuxCsslAPI MCUX CSSL -- API\r\n *\r\n * @defgroup mcuxCsslFlowProtection Flow Protection API\r\n * @brief Flow protection mechanism.\r\n * @ingroup mcuxCsslAPI\r\n */\r\n\r\n\r\n/**\r\n * @defgroup csslFpCore Flow protection core functionality\r\n * @brief Flow protection handling core functionality.\r\n * @ingroup mcuxCsslFlowProtection\r\n *\r\n * @todo Extend this description of the core functionality which relies\r\n *       basically on the function calling flow protection.\r\n *\r\n * @declaration{MCUX_CSSL_FP_FUNCTION_DECL}\r\n * @event{MCUX_CSSL_FP_FUNCTION_CALL}\r\n * @expectation{MCUX_CSSL_FP_FUNCTION_CALLED}\r\n */\r\n\r\n/**\r\n * @defgroup csslFpFunction Function calling flow protection\r\n * @brief Support for flow protected functions.\r\n * @ingroup mcuxCsslFlowProtection\r\n *\r\n * @declaration{MCUX_CSSL_FP_FUNCTION_DECL}\r\n * @event{MCUX_CSSL_FP_FUNCTION_CALL}\r\n * @expectation{MCUX_CSSL_FP_FUNCTION_CALLED}\r\n */\r\n\r\n\r\nMCUX_CSSL_ANALYSIS_START_SUPPRESS_TEXT_IN_COMMENTS(\"Comments outline example sequences. For more readability, additional inner comments might be added.\")\r\n/**\r\n * @def MCUX_CSSL_FP_PROTECTED_TYPE\r\n * @brief Based on a given base type, builds a return type with flow\r\n *        protection.\r\n * @ingroup csslFpFunction\r\n *\r\n * This macro must be used to wrap the function return type. For example:\r\n * @code\r\n * MCUX_CSSL_FP_FUNCTION_DECL(someFunction)\r\n * MCUX_CSSL_FP_PROTECTED_TYPE(uint32_t) someFunction(void);\r\n * @endcode\r\n *\r\n * Note that depending on the selected flow protection mechanism, the width of\r\n * the result type may be limited to 32 bits or less to allow encoding a\r\n * protection token in the other half of a 64-bit return value.\r\n *\r\n * @see MCUX_CSSL_FP_FUNCTION_DEF\r\n *\r\n * @param resultType The type to be converted into a protected type.\r\n */\r\n#define MCUX_CSSL_FP_PROTECTED_TYPE(resultType) \\\r\n  MCUX_CSSL_FP_PROTECTED_TYPE_IMPL(resultType)\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_COUNTER_STMT\r\n * @brief A statement which is only evaluated if a secure counter is used.\r\n * @api\r\n * @ingroup csslFpFunction\r\n *\r\n * This macro can be used to create counting variables that are only present if\r\n * the active configuration uses a secure counter, to avoid warnings about\r\n * unused variables.\r\n *\r\n * @param statement The statement to be conditionally included.\r\n */\r\n#define MCUX_CSSL_FP_COUNTER_STMT(statement) \\\r\n  MCUX_CSSL_FP_COUNTER_STMT_IMPL(statement)\r\n\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_FUNCTION_DECL\r\n * @brief Declaration of a flow protected function.\r\n * @api\r\n * @ingroup csslFpFunction\r\n *\r\n * This declaration must be placed just in front of the actual function\r\n * declaration. For example:\r\n * @code\r\n * MCUX_CSSL_FP_FUNCTION_DECL(someFunction) // Note: no semicolon here\r\n * uint32_t someFunction(void);\r\n * @endcode\r\n *\r\n * @event{MCUX_CSSL_FP_FUNCTION_CALL}\r\n * @expectation{MCUX_CSSL_FP_FUNCTION_CALLED}\r\n *\r\n * @see MCUX_CSSL_FP_FUNCTION_DEF\r\n * @see MCUX_CSSL_FP_FUNCTION_POINTER\r\n * @see MCUX_CSSL_FP_FUNCTION_ENTRY\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK\r\n *\r\n * @param id Identifier for the function that is flow protected.\r\n * @param ptrType Optional, pointer type matching this function.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_DECL(...) \\\r\n  MCUX_CSSL_FP_FUNCTION_DECL_IMPL(__VA_ARGS__)\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_FUNCTION_DEF\r\n * @brief Definition of a flow protected function.\r\n * @api\r\n * @ingroup csslFpFunction\r\n *\r\n * This definition macro must be placed just in front of the actual function\r\n * definition, that has been previously declared as flow protected using\r\n * #MCUX_CSSL_FP_FUNCTION_DECL. For example:\r\n * @code\r\n * // someHeader.h\r\n * MCUX_CSSL_FP_FUNCTION_DECL(someFunction) // Note: no semicolon here\r\n * uint32_t someFunction(void);\r\n *\r\n * // someFile.c\r\n * MCUX_CSSL_FP_FUNCTION_DEF(someFunction) // Note: no semicolon here\r\n * uint32_t someFunction(void)\r\n * {\r\n *   // some function body\r\n * }\r\n * @endcode\r\n *\r\n * @see MCUX_CSSL_FP_FUNCTION_DECL\r\n * @see MCUX_CSSL_FP_FUNCTION_POINTER\r\n * @see MCUX_CSSL_FP_FUNCTION_ENTRY\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK\r\n *\r\n * @param id Identifier for the function that is flow protected.\r\n * @param ptrType Optional, pointer type matching this function.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_DEF(...) \\\r\n  MCUX_CSSL_FP_FUNCTION_DEF_IMPL(__VA_ARGS__)\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_FUNCTION_POINTER\r\n * @brief Definition of a flow protected function pointer.\r\n * @api\r\n * @ingroup csslFpFunction\r\n *\r\n * This definition macro must be placed around a function pointer\r\n * definition. For example:\r\n * @code\r\n * // someHeader.h\r\n * MCUX_CSSL_FP_FUNCTION_POINTER(ptrType,\r\n * typedef void (*ptrType)(void));\r\n *\r\n * MCUX_CSSL_FP_FUNCTION_DECL(someFunction, ptrType) // Note: no semicolon here\r\n * uint32_t someFunction(void);\r\n *\r\n * // someFile.c\r\n * MCUX_CSSL_FP_FUNCTION_DEF(someFunction, ptrType) // Note: no semicolon here\r\n * uint32_t someFunction(void)\r\n * {\r\n *   // some function body\r\n * }\r\n * @endcode\r\n *\r\n * @see MCUX_CSSL_FP_FUNCTION_DECL\r\n * @see MCUX_CSSL_FP_FUNCTION_DEF\r\n * @see MCUX_CSSL_FP_FUNCTION_ENTRY\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK\r\n *\r\n * @param type Identifier for the function pointer type that is flow protected.\r\n * @param definition Actual type definition of the function pointer type.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_POINTER(type, definition) \\\r\n  MCUX_CSSL_FP_FUNCTION_POINTER_IMPL(type, definition)\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_FUNCTION_ENTRY\r\n * @brief Flow protection handler for the function entry point.\r\n * @api\r\n * @ingroup csslFpFunction\r\n *\r\n * This entry macro should be placed at the start of the function body that\r\n * needs to be protected. The function must have been declared before as flow\r\n * protected using #MCUX_CSSL_FP_FUNCTION_DECL. For example:\r\n * @code\r\n * MCUX_CSSL_FP_FUNCTION_DEF(someFunction) // Note: no semicolon here\r\n * uint32_t someFunction(void)\r\n * {\r\n *   MCUX_CSSL_FP_FUNCTION_ENTRY(someFunction);\r\n *   // remainder of the function body\r\n * }\r\n * @endcode\r\n *\r\n * The only statements that should be placed before this one, are declarations\r\n * for flow protected operations that are already used as expectations in this\r\n * macro. For example:\r\n * @code\r\n * MCUX_CSSL_FP_FUNCTION_DEF(someFunction) // Note: no semicolon here\r\n * uint32_t someFunction(uint32_t count)\r\n * {\r\n *   MCUX_CSSL_FP_LOOP_DECL(someLoop);\r\n *   MCUX_CSSL_FP_LOOP_DECL(otherLoop);\r\n *   MCUX_CSSL_FP_FUNCTION_ENTRY(someFunction,\r\n *     MCUX_CSSL_FP_LOOP_ITERATIONS(someLoop, count),\r\n *     MCUX_CSSL_FP_LOOP_ITERATIONS(otherLoop, 2u * count)\r\n *   );\r\n *   // Remainder of the function body, where someLoop makes count iterations,\r\n *   // and otherLoop 2*count iterations.\r\n * }\r\n * @endcode\r\n *\r\n * @see MCUX_CSSL_FP_FUNCTION_DECL\r\n * @see MCUX_CSSL_FP_FUNCTION_DEF\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - id:     Identifier of the function that has just been entered. <br>\r\n *        - expect: Zero or more (comma separated) declarations of expected code\r\n *               flow behavior.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_ENTRY(...) \\\r\n  MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL(__VA_ARGS__, MCUX_CSSL_FP_VOID_EXPECTATION_IMPL())\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_FUNCTION_EXIT\r\n * @brief Flow protection handler for the function exit point.\r\n * @api\r\n * @ingroup csslFpFunction\r\n *\r\n * This exit macro must replace the regular \\c return statements of a protected\r\n * function. Given the following unprotected example:\r\n * @code\r\n * uint32_t someFunction(void)\r\n * {\r\n *   // some function body\r\n *   return 0;\r\n * }\r\n * @endcode\r\n * The protected version would become:\r\n * @code\r\n * MCUX_CSSL_FP_FUNCTION_DEF(someFunction) // Note: no semicolon here\r\n * uint32_t someFunction(void)\r\n * {\r\n *   MCUX_CSSL_FP_FUNCTION_ENTRY(someFunction);\r\n *   // remainder of the function body\r\n *   MCUX_CSSL_FP_FUNCTION_EXIT(someFunction, 0);\r\n * }\r\n * @endcode\r\n *\r\n * @see MCUX_CSSL_FP_FUNCTION_DECL\r\n * @see MCUX_CSSL_FP_FUNCTION_DEF\r\n * @see MCUX_CSSL_FP_FUNCTION_ENTRY\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - id:     Identifier of the function from which we will exit.\r\n *        - result: Result that should be encoded in the return value.\r\n *        - expect: Zero or more (comma separated) declarations of expected code\r\n *               flow behavior.\r\n * @return       A value in which both \\p result and a flow protection token\r\n *               are encoded.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_EXIT(...) \\\r\n  MCUX_CSSL_FP_FUNCTION_EXIT_IMPL(__VA_ARGS__, MCUX_CSSL_FP_VOID_EXPECTATION_IMPL())\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK\r\n * @brief Flow protection handler for the function exit point which includes\r\n *        an actual check of the code flow.\r\n * @api\r\n * @ingroup csslFpFunction\r\n *\r\n * This exit macro must replace the regular \\c return statements of a protected\r\n * function. In addition to #MCUX_CSSL_FP_FUNCTION_EXIT it also checks the flow\r\n * protection, and selects the return value accordingly. For example:\r\n * @code\r\n * MCUX_CSSL_FP_FUNCTION_DEF(someFunction) // Note: no semicolon here\r\n * uint32_t someFunction(void)\r\n * {\r\n *   MCUX_CSSL_FP_FUNCTION_ENTRY(someFunction);\r\n *   // remainder of the function body\r\n *   MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK(someFunction, 0, 0xFAu);\r\n * }\r\n * @endcode\r\n *\r\n * @see MCUX_CSSL_FP_FUNCTION_DECL\r\n * @see MCUX_CSSL_FP_FUNCTION_DEF\r\n * @see MCUX_CSSL_FP_FUNCTION_ENTRY\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - id:      Identifier of the function from which we will exit.\r\n *        - pass:    Result that should be encoded in the return value if the flow\r\n *                   protection check passed.\r\n *        - fail:    Result that should be encoded in the return value if the flow\r\n *                   protection check failed.\r\n *        - expect:  Zero or more (comma separated) declarations of expected code\r\n *                  flow behavior.\r\n * @return       A value in which both the result (either \\p pass or \\p fail)\r\n *               and a flow protection token are encoded.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK(...) \\\r\n  MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPL(__VA_ARGS__, MCUX_CSSL_FP_VOID_EXPECTATION_IMPL())\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_FUNCTION_EXIT_VOID\r\n * @brief Flow protection handler for the exit point of functions with the\r\n *        return type \\c void.\r\n * @api\r\n * @ingroup csslFpFunction\r\n *\r\n * This exit macro must replace the regular \\c return statements of a protected\r\n * void function. Given the following unprotected example:\r\n * @code\r\n * void someFunction(void)\r\n * {\r\n *   // some function body\r\n *   return 0;\r\n * }\r\n * @endcode\r\n * The protected version would become:\r\n * @code\r\n * MCUX_CSSL_FP_FUNCTION_DEF(someFunction) // Note: no semicolon here\r\n * void someFunction(void)\r\n * {\r\n *   MCUX_CSSL_FP_FUNCTION_ENTRY(someFunction);\r\n *   // remainder of the function body\r\n *   MCUX_CSSL_FP_FUNCTION_EXIT_VOID(someFunction);\r\n * }\r\n * @endcode\r\n *\r\n * @see MCUX_CSSL_FP_FUNCTION_DECL\r\n * @see MCUX_CSSL_FP_FUNCTION_DEF\r\n * @see MCUX_CSSL_FP_FUNCTION_ENTRY\r\n *\r\n * @param ...       The following parameters need to be passed (comma separated):\r\n *        - id:     Identifier of the function from which we will exit.\r\n *        - expect: Zero or more (comma separated) declarations of expected code\r\n *                  flow behavior.\r\n * @return       A protected return value of type void.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_EXIT_VOID(...) \\\r\n  MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPL(__VA_ARGS__, MCUX_CSSL_FP_VOID_EXPECTATION_IMPL())\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_RESULT\r\n * @brief Extract the result value from a protected \\p return value.\r\n * @ingroup csslFpFunction\r\n *\r\n * This macro should mainly be used internally to extract the original return value\r\n * from a protected value, e.g., in MCUX_CSSL_FP_FUNCTION_CALL_IMPL.\r\n *\r\n * @param ...       The following parameters need to be passed (comma seperated):\r\n *        - type:   Optional, type of the result (default: uint32_t).\r\n *        - return: The protected return value which contains the result.\r\n */\r\n#define MCUX_CSSL_FP_RESULT(...) \\\r\n  MCUX_CSSL_FP_RESULT_IMPL(__VA_ARGS__)\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_PROTECTION_TOKEN\r\n * @brief Extract the protection token value from a protected \\p return value.\r\n * @ingroup csslFpFunction\r\n *\r\n * Note that this macro is only used with a local security counter,\r\n * e.g. for configuration CSSL_SC_USE_SW_LOCAL\r\n *\r\n * @param return The protected return value which contains the protection token.\r\n */\r\n#define MCUX_CSSL_FP_PROTECTION_TOKEN(return) \\\r\n  MCUX_CSSL_FP_PROTECTION_TOKEN_IMPL(return)\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_FUNCTION_CALL\r\n * @brief Call a flow protected function.\r\n * @api\r\n * @ingroup csslFpFunction\r\n *\r\n * This function call macro encapsulates the flow protection handling needed\r\n * for calling a function. In particular it takes care of extracting the flow\r\n * protection token from the return value (which has been inserted by\r\n * #MCUX_CSSL_FP_FUNCTION_EXIT or #MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK) and\r\n * incorporating that in the flow protection of the current function. For\r\n * example:\r\n * @code\r\n * MCUX_CSSL_FP_FUNCTION_DEF(someFunction) // Note: no semicolon here\r\n * uint32_t someFunction(void)\r\n * {\r\n *   MCUX_CSSL_FP_FUNCTION_ENTRY(someFunction);\r\n *   // ...\r\n *   MCUX_CSSL_FP_FUNCTION_CALL(result, otherFunction());\r\n *   // ...\r\n *   MCUX_CSSL_FP_FUNCTION_EXIT(someFunction, 0,\r\n *     MCUX_CSSL_FP_FUNCTION_CALLED(otherFunction)\r\n *   );\r\n * }\r\n * @endcode\r\n *\r\n * For functions returning void, the macro #MCUX_CSSL_FP_FUNCTION_CALL_VOID\r\n * exists.\r\n *\r\n * @declaration{MCUX_CSSL_FP_FUNCTION_DECL}\r\n * @expectation{MCUX_CSSL_FP_FUNCTION_CALLED}\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - result: Fresh variable name to store the result of \\p call.\r\n *        - call:   The (protected) function call that must be performed.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_CALL(...) \\\r\n  MCUX_CSSL_FP_FUNCTION_CALL_IMPL(__VA_ARGS__)\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_FUNCTION_CALL_VOID\r\n * @brief Call a flow protected void function.\r\n * @api\r\n * @ingroup csslFpFunction\r\n *\r\n * This function call macro encapsulates the flow protection handling needed\r\n * for calling a void function. In particular it takes care of extracting the\r\n * flow protection token from the return value (which has been inserted by\r\n * #MCUX_CSSL_FP_FUNCTION_EXIT or #MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK) and\r\n * incorporating that in the flow protection of the current function. For\r\n * example:\r\n * @code\r\n * MCUX_CSSL_FP_FUNCTION_DEF(someFunction) // Note: no semicolon here\r\n * uint32_t someFunction(void)\r\n * {\r\n *   MCUX_CSSL_FP_FUNCTION_ENTRY(someFunction);\r\n *   // ...\r\n *   MCUX_CSSL_FP_FUNCTION_CALL_VOID(otherFunction());\r\n *   // ...\r\n *   MCUX_CSSL_FP_FUNCTION_EXIT(someFunction, 0,\r\n *     MCUX_CSSL_FP_FUNCTION_CALLED(otherFunction)\r\n *   );\r\n * }\r\n * @endcode\r\n *\r\n * @declaration{MCUX_CSSL_FP_FUNCTION_DECL}\r\n * @expectation{MCUX_CSSL_FP_FUNCTION_CALLED}\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - call:   The (protected) void function call that must be performed.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_CALL_VOID(...) \\\r\n  MCUX_CSSL_FP_FUNCTION_CALL_VOID_IMPL(__VA_ARGS__)\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_FUNCTION_CALL_PROTECTED\r\n * @brief Call a flow protected function from unprotected code.\r\n * @api\r\n * @ingroup csslFpFunction\r\n *\r\n * This function call macro encapsulates the flow protection handling needed\r\n * for calling a function from within a function which does not have local\r\n * flow protection, or which uses a different flow protection mechanism than\r\n * the one provided by CSSL. In particular it takes care of extracting the\r\n * protection token and result from the return value (which has been inserted\r\n * by #MCUX_CSSL_FP_FUNCTION_EXIT or #MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK).\r\n * For example:\r\n * @code\r\n * uint32_t someUnprotectedFunction(void)\r\n * {\r\n *   // ...\r\n *   MCUX_CSSL_FP_FUNCTION_CALL_PROTECTED(\r\n *     result,\r\n *     token,\r\n *     otherFunction());\r\n *   // Check the protection token\r\n *   if(MCUX_CSSL_FP_FUNCTION_CALLED(otherFunction) != token)\r\n *   {\r\n *     return FAULT;\r\n *   }\r\n *   // ... The following code may use result as a variable ...\r\n * }\r\n * @endcode\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - result: Fresh variable name to store the result of \\p call.\r\n *        - token:  Fresh variable name to store the protection token of \\p call.\r\n *        - call:   The (protected) function call that must be performed.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_CALL_PROTECTED(...) \\\r\n  MCUX_CSSL_FP_FUNCTION_CALL_PROTECTED_IMPL(__VA_ARGS__)\r\n\r\n  /**\r\n * @def MCUX_CSSL_FP_FUNCTION_CALL_VOID_PROTECTED\r\n * @brief Call a flow protected void function from unprotected code.\r\n * @api\r\n * @ingroup csslFpFunction\r\n *\r\n * This function call macro encapsulates the flow protection handling needed\r\n * for calling a void function from within a function which does not have flow\r\n * protection, or which uses a different flow protection mechanism than the one\r\n * provided by CSSL. In particular it takes care of extracting the protection\r\n * token and result from the return value (which has been inserted by\r\n * #MCUX_CSSL_FP_FUNCTION_EXIT or #MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK).\r\n * For example:\r\n * @code\r\n * uint32_t someUnprotectedFunction(void)\r\n * {\r\n *   // ...\r\n *   MCUX_CSSL_FP_FUNCTION_CALL_PROTECTED(\r\n *     token,\r\n *     protectedVoidFunction());\r\n *   // Check the protection token\r\n *   if(MCUX_CSSL_FP_FUNCTION_CALLED(otherFunction) != token)\r\n *   {\r\n *     return FAULT;\r\n *   }\r\n *   // ...\r\n * }\r\n * @endcode\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - token:  Fresh variable name to store the protection token of \\p call.\r\n *        - call:   The (protected) function call that must be performed.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_CALL_VOID_PROTECTED(...) \\\r\n  MCUX_CSSL_FP_FUNCTION_CALL_VOID_PROTECTED_IMPL(__VA_ARGS__)\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_FUNCTION_CALL_BEGIN\r\n * @brief Call a flow protected function and check the protection token.\r\n * @api\r\n * @ingroup csslFpFunction\r\n *\r\n * This function call macro encapsulates the flow protection handling needed\r\n * for calling a function from within a function which does not have local\r\n * flow protection, or which uses a different flow protection mechanism than\r\n * the one provided by CSSL. In particular it takes care of extracting the\r\n * protection token and result from the return value (which has been inserted\r\n * by #MCUX_CSSL_FP_FUNCTION_EXIT or #MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK).\r\n * For example:\r\n * @code\r\n * uint32_t someUnprotectedFunction(void)\r\n * {\r\n *   // ...\r\n *   MCUX_CSSL_FP_FUNCTION_CALL_BEGIN(\r\n *     result,\r\n *     token,\r\n *     otherFunction());\r\n *   // Check the protection token\r\n *   if(MCUX_CSSL_FP_FUNCTION_CALLED(otherFunction) != token)\r\n *   {\r\n *     return FAULT;\r\n *   }\r\n *   // ... The following code may use result as a variable ...\r\n *   MCUX_CSSL_FP_FUNCTION_CALL_END();\r\n *   // ... result is invalid here ...\r\n * }\r\n * @endcode\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - result: Fresh variable name to store the result of \\p call.\r\n *        - token:  Fresh variable name to store the protection token of \\p call.\r\n *        - call:   The (protected) function call that must be performed.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_CALL_BEGIN(...) \\\r\n  MCUX_CSSL_FP_FUNCTION_CALL_BEGIN_IMPL(__VA_ARGS__)\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_FUNCTION_CALL_END\r\n * @brief End a function call section started by\r\n * #MCUX_CSSL_FP_FUNCTION_CALL_BEGIN.\r\n * @api\r\n * @ingroup csslFpFunction\r\n *\r\n * Example:\r\n * @code\r\n * uint32_t someUnprotectedFunction(void)\r\n * {\r\n *   // ...\r\n *   MCUX_CSSL_FP_FUNCTION_CALL_BEGIN(\r\n *     result,\r\n *     token,\r\n *     otherFunction());\r\n *   // Check the protection token\r\n *   if(MCUX_CSSL_FP_FUNCTION_CALLED(otherFunction) != token)\r\n *   {\r\n *     return FAULT;\r\n *   }\r\n *   // ... The following code may use result as a variable ...\r\n *   MCUX_CSSL_FP_FUNCTION_CALL_END();\r\n *   // ... result is invalid here ...\r\n * }\r\n * @endcode\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - result: Fresh variable name to store the result of \\p call.\r\n *        - token:  Fresh variable name to store the protection token of \\p call.\r\n *        - call:   The (protected) function call that must be performed.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_CALL_END(...) \\\r\n  MCUX_CSSL_FP_FUNCTION_CALL_END_IMPL(__VA_ARGS__)\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_FUNCTION_CALL_VOID_BEGIN\r\n * @brief Call a flow protected void function and check the protection token.\r\n * @api\r\n * @ingroup csslFpFunction\r\n *\r\n * This function call macro encapsulates the flow protection handling needed\r\n * for calling a void function from within a function which does not have local\r\n * flow protection, or which uses a different flow protection mechanism than\r\n * the one provided by CSSL. In particular it takes care of extracting the\r\n * protection token from the return value (which has been inserted\r\n * by #MCUX_CSSL_FP_FUNCTION_EXIT or #MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK).\r\n * For example:\r\n * @code\r\n * uint32_t someUnprotectedFunction(void)\r\n * {\r\n *   // ...\r\n *   MCUX_CSSL_FP_FUNCTION_CALL_VOID_BEGIN(\r\n *     token,\r\n *     otherFunction());\r\n *   // Check the protection token\r\n *   if(MCUX_CSSL_FP_FUNCTION_CALLED(otherFunction) != token)\r\n *   {\r\n *     return FAULT;\r\n *   }\r\n *   MCUX_CSSL_FP_FUNCTION_CALL_VOID_END();\r\n * }\r\n * @endcode\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - token:  Fresh variable name to store the protection token of \\p call.\r\n *        - call:   The (protected) function call that must be performed.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_CALL_VOID_BEGIN(...) \\\r\n  MCUX_CSSL_FP_FUNCTION_CALL_VOID_BEGIN_IMPL(__VA_ARGS__)\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_FUNCTION_CALL_VOID_END\r\n * @brief End a void function call section started by\r\n * #MCUX_CSSL_FP_FUNCTION_CALL_VOID_BEGIN.\r\n * @api\r\n * @ingroup csslFpFunction\r\n *\r\n * Example:\r\n * @code\r\n * uint32_t someUnprotectedFunction(void)\r\n * {\r\n *   // ...\r\n *   MCUX_CSSL_FP_FUNCTION_CALL_VOID_BEGIN(\r\n *     token,\r\n *     otherFunction());\r\n *   // Check the protection token\r\n *   if(MCUX_CSSL_FP_FUNCTION_CALLED(otherFunction) != token)\r\n *   {\r\n *     return FAULT;\r\n *   }\r\n *   MCUX_CSSL_FP_FUNCTION_CALL_VOID_END();\r\n * }\r\n * @endcode\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - token:  Fresh variable name to store the protection token of \\p call.\r\n *        - call:   The (protected) function call that must be performed.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_CALL_VOID_END(...) \\\r\n  MCUX_CSSL_FP_FUNCTION_CALL_VOID_END_IMPL(__VA_ARGS__)\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_FUNCTION_CALLED\r\n * @brief Expectation of a called function.\r\n * @api\r\n * @ingroup csslFpFunction\r\n *\r\n * This expectation macro indicates to the flow protection mechanism that a\r\n * function call is expected to happen (if placed before the actual call), for\r\n * example:\r\n * @code\r\n * MCUX_CSSL_FP_FUNCTION_DEF(someFunction) // Note: no semicolon here\r\n * uint32_t someFunction(void)\r\n * {\r\n *   MCUX_CSSL_FP_FUNCTION_ENTRY(someFunction,\r\n *     MCUX_CSSL_FP_FUNCTION_CALLED(otherFunction)\r\n *   );\r\n *   // ...\r\n *   MCUX_CSSL_FP_FUNCTION_CALL(result, otherFunction());\r\n *   // ...\r\n *   MCUX_CSSL_FP_FUNCTION_EXIT(someFunction, 0);\r\n * }\r\n * @endcode\r\n * Or that a function call has happened (if placed after the actual call), for\r\n * example:\r\n * @code\r\n * MCUX_CSSL_FP_FUNCTION_DEF(someFunction) // Note: no semicolon here\r\n * uint32_t someFunction(void)\r\n * {\r\n *   MCUX_CSSL_FP_FUNCTION_ENTRY(someFunction);\r\n *   // ...\r\n *   MCUX_CSSL_FP_FUNCTION_CALL(result, otherFunction());\r\n *   // ...\r\n *   MCUX_CSSL_FP_FUNCTION_EXIT(someFunction, 0,\r\n *     MCUX_CSSL_FP_FUNCTION_CALLED(otherFunction)\r\n *   );\r\n * }\r\n * @endcode\r\n *\r\n * @declaration{MCUX_CSSL_FP_FUNCTION_DECL}\r\n * @event{MCUX_CSSL_FP_FUNCTION_CALL}\r\n *\r\n * @see MCUX_CSSL_FP_FUNCTION_ENTRY\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK\r\n * @see MCUX_CSSL_FP_EXPECT\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        -id: Identifier of the function that is expected to be called.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_CALLED(...) \\\r\n  MCUX_CSSL_FP_FUNCTION_CALLED_IMPL(__VA_ARGS__)\r\n\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_FUNCTION_ENTERED\r\n * @brief Expectation implementation of an entered (but not exited) function.\r\n * @ingroup csslFpFunction\r\n *\r\n * This expectation macro indicates to the flow protection mechanism that a\r\n * function entry has happened, for example:\r\n * @code\r\n * MCUX_CSSL_FP_FUNCTION_DEF(someFunction) // Note: no semicolon here\r\n * uint32_t someFunction(void)\r\n * {\r\n *   MCUX_CSSL_FP_FUNCTION_ENTRY(someFunction);\r\n *   // ...\r\n *   MCUX_CSSL_FP_ASSERT(MCUX_CSSL_FP_FUNCTION_ENTERED(someFunction);\r\n *   // ...\r\n * }\r\n * @endcode\r\n *\r\n * @declaration{MCUX_CSSL_FP_FUNCTION_DECL}\r\n * @event{MCUX_CSSL_FP_FUNCTION_CALL}\r\n *\r\n * @see MCUX_CSSL_FP_FUNCTION_ENTRY\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK\r\n * @see MCUX_CSSL_FP_EXPECT\r\n * @see MCUX_CSSL_FP_FUNCTION_CALLED\r\n * @see MCUX_CSSL_FP_ASSERT\r\n *\r\n * @param id Identifier of the function that is expected to be entered.\r\n * @return   Counter value for the given function.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_ENTERED(id) \\\r\n  MCUX_CSSL_FP_FUNCTION_ENTERED_IMPL(id)\r\n\r\n\r\n/**\r\n * @defgroup csslFpLoop Looping flow protection\r\n * @brief Support for flow protected loops.\r\n * @ingroup mcuxCsslFlowProtection\r\n *\r\n * @declaration{MCUX_CSSL_FP_LOOP_DECL}\r\n * @event{MCUX_CSSL_FP_LOOP_ITERATION}\r\n * @expectation{MCUX_CSSL_FP_LOOP_ITERATIONS}\r\n */\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_LOOP_DECL\r\n * @brief Declaration of a flow protected loop.\r\n * @api\r\n * @ingroup csslFpLoop\r\n *\r\n * To inform the flow protection mechanism about a loop that needs to be\r\n * protected, a loop identifier needs to be declared. This identifier can then\r\n * be used in the event and expectation macros. For example:\r\n * @code\r\n * MCUX_CSSL_FP_LOOP_DECL(someLoopIdentifier);\r\n * for (uint32_t i = 0; i < 8; ++i)\r\n * {\r\n *   MCUX_CSSL_FP_LOOP_ITERATION(someLoopIdentifier);\r\n * }\r\n * // ...\r\n * MCUX_CSSL_FP_FUNCTION_EXIT(someFunction, 0,\r\n *   MCUX_CSSL_FP_LOOP_ITERATIONS(someLoopIdentifier, 8)\r\n * );\r\n * @endcode\r\n *\r\n * @event{MCUX_CSSL_FP_LOOP_ITERATION}\r\n * @expectation{MCUX_CSSL_FP_LOOP_ITERATIONS}\r\n *\r\n * @param id Identifier for the loop that is flow protected.\r\n */\r\n#define MCUX_CSSL_FP_LOOP_DECL(id) \\\r\n  MCUX_CSSL_FP_LOOP_DECL_IMPL(id)\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_LOOP_ITERATION\r\n * @brief Perform a loop iteration.\r\n * @api\r\n * @ingroup csslFpLoop\r\n *\r\n * This loop iteration macro informs the flow mechanism that an iteration event\r\n * is performed for the loop declared by #MCUX_CSSL_FP_LOOP_DECL with the given\r\n * \\p id. For example:\r\n * @code\r\n * MCUX_CSSL_FP_LOOP_DECL(someLoopIdentifier);\r\n * for (uint32_t i = 0; i < 8; ++i)\r\n * {\r\n *   MCUX_CSSL_FP_LOOP_ITERATION(someLoopIdentifier);\r\n * }\r\n * @endcode\r\n *\r\n * @declaration{MCUX_CSSL_FP_LOOP_DECL}\r\n * @expectation{MCUX_CSSL_FP_LOOP_ITERATIONS}\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - id:      Identifier for the loop that is flow protected.\r\n *        - expect:  Zero or more (comma separated) declarations of expected code\r\n *                   flow behavior related to this event.\r\n */\r\n#define MCUX_CSSL_FP_LOOP_ITERATION(...) \\\r\n  MCUX_CSSL_FP_LOOP_ITERATION_IMPL(__VA_ARGS__, MCUX_CSSL_FP_VOID_EXPECTATION_IMPL())\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_LOOP_ITERATIONS\r\n * @brief Expected number of loop iterations.\r\n * @api\r\n * @ingroup csslFpLoop\r\n *\r\n * This expectation macro indicates to the flow protection mechanism that the\r\n * loop declared by #MCUX_CSSL_FP_LOOP_DECL with the given \\p id has made\r\n * \\p count iterations. For example:\r\n * @code\r\n * MCUX_CSSL_FP_LOOP_DECL(someLoopIdentifier);\r\n * for (uint32_t i = 0; i < 8; ++i)\r\n * {\r\n *   MCUX_CSSL_FP_LOOP_ITERATION(someLoopIdentifier);\r\n * }\r\n * // ...\r\n * MCUX_CSSL_FP_FUNCTION_EXIT(someFunction, 0,\r\n *   MCUX_CSSL_FP_LOOP_ITERATIONS(someLoopIdentifier, 8)\r\n * );\r\n * @endcode\r\n *\r\n * @declaration{MCUX_CSSL_FP_LOOP_DECL}\r\n * @event{MCUX_CSSL_FP_LOOP_ITERATION}\r\n *\r\n * @see MCUX_CSSL_FP_FUNCTION_ENTRY\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK\r\n * @see MCUX_CSSL_FP_EXPECT\r\n *\r\n * @param id    Identifier of the flow protected loop.\r\n * @param count Number of expected iterations.\r\n */\r\n#define MCUX_CSSL_FP_LOOP_ITERATIONS(id, count) \\\r\n  MCUX_CSSL_FP_LOOP_ITERATIONS_IMPL(id, count)\r\n\r\n\r\n\r\n/**\r\n * @defgroup csslFpBranch Branching flow protection\r\n * @brief Support for flow protected branches.\r\n * @ingroup mcuxCsslFlowProtection\r\n *\r\n * @declaration{MCUX_CSSL_FP_BRANCH_DECL}\r\n * @event{MCUX_CSSL_FP_BRANCH_POSITIVE,MCUX_CSSL_FP_BRANCH_NEGATIVE}\r\n * @expectation{MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE,MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE}\r\n */\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_BRANCH_DECL\r\n * @brief Declaration of a flow protected branch.\r\n * @api\r\n * @ingroup csslFpBranch\r\n *\r\n * To inform the flow protection mechanism about a branch that needs to be\r\n * protected, a branch identifier needs to be declared. This identifier can\r\n * then be used in the events and expectation macros. For example:\r\n * @code\r\n * MCUX_CSSL_FP_BRANCH_DECL(someBranchIdentifier);\r\n * if (condition)\r\n * {\r\n *   MCUX_CSSL_FP_BRANCH_POSITIVE(someBranchIdentifier);\r\n * }\r\n * else\r\n * {\r\n *   MCUX_CSSL_FP_BRANCH_NEGATIVE(someBranchIdentifier);\r\n * }\r\n * // ...\r\n * MCUX_CSSL_FP_FUNCTION_EXIT(someFunction, 0,\r\n *   MCUX_CSSL_FP_BRANCH_TAKEN(someBranchIdentifier,\r\n *     MCUX_CSSL_FP_BRANCH_POSITIVE_SCENARIO, condition)\r\n * );\r\n * @endcode\r\n *\r\n * @event{MCUX_CSSL_FP_BRANCH_POSITIVE,MCUX_CSSL_FP_BRANCH_NEGATIVE}\r\n * @expectation{MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE,MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE}\r\n *\r\n * @param id Identifier for the branch that is flow protected.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_DECL(id) \\\r\n  MCUX_CSSL_FP_BRANCH_DECL_IMPL(id)\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_BRANCH_POSITIVE\r\n * @brief Positive scenario for a branch is executed.\r\n * @api\r\n * @ingroup csslFpBranch\r\n *\r\n * This branch event macro informs the flow mechanism that the positive scenario\r\n * of the branch is executed for the branch declared by\r\n * #MCUX_CSSL_FP_BRANCH_DECL with the given \\p id. For example:\r\n * @code\r\n * MCUX_CSSL_FP_BRANCH_DECL(someBranchIdentifier);\r\n * if (condition)\r\n * {\r\n *   MCUX_CSSL_FP_BRANCH_POSITIVE(someBranchIdentifier);\r\n * }\r\n * else\r\n * {\r\n *   MCUX_CSSL_FP_BRANCH_NEGATIVE(someBranchIdentifier);\r\n * }\r\n * // ...\r\n * MCUX_CSSL_FP_FUNCTION_EXIT(someFunction, 0,\r\n *   MCUX_CSSL_FP_CONDITIONAL_IMPL(!condition,\r\n *     MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE(someBranchIdentifier)\r\n *   )\r\n * );\r\n * @endcode\r\n *\r\n * @declaration{MCUX_CSSL_FP_BRANCH_DECL}\r\n * @expectation{MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE}\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - id:     Identifier for the branch for which the positive scenario is\r\n *                  executed.\r\n *        - expect: Zero or more (comma separated) declarations of expected code\r\n *                  flow behavior related to this event.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_POSITIVE(...) \\\r\n  MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL(__VA_ARGS__, MCUX_CSSL_FP_VOID_EXPECTATION_IMPL())\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_BRANCH_NEGATIVE\r\n * @brief Negative scenario of a branch is executed.\r\n * @api\r\n * @ingroup csslFpBranch\r\n *\r\n * This branch event macro informs the flow mechanism that the positive scenario\r\n * of the branch is executed for the branch declared by\r\n * #MCUX_CSSL_FP_BRANCH_DECL with the given \\p id. For example:\r\n * @code\r\n * MCUX_CSSL_FP_BRANCH_DECL(someBranchIdentifier);\r\n * if (condition)\r\n * {\r\n *   MCUX_CSSL_FP_BRANCH_POSITIVE(someBranchIdentifier);\r\n * }\r\n * else\r\n * {\r\n *   MCUX_CSSL_FP_BRANCH_NEGATIVE(someBranchIdentifier);\r\n * }\r\n * // ...\r\n * MCUX_CSSL_FP_FUNCTION_EXIT(someFunction, 0,\r\n *   MCUX_CSSL_FP_CONDITIONAL_IMPL(!condition,\r\n *     MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE(someBranchIdentifier)\r\n *   )\r\n * );\r\n * @endcode\r\n *\r\n * @declaration{MCUX_CSSL_FP_BRANCH_DECL}\r\n * @expectation{MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE}\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - id:     Identifier for the branch for which the negative scenario is\r\n *                  executed.\r\n *        - expect: Zero or more (comma separated) declarations of expected code\r\n *                  flow behavior related to this event.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_NEGATIVE(...) \\\r\n  MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL(__VA_ARGS__, MCUX_CSSL_FP_VOID_EXPECTATION_IMPL())\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE\r\n * @brief Expectation that positive branch has been taken.\r\n * @api\r\n * @ingroup csslFpBranch\r\n *\r\n * This expectation macro indicates to the flow protection mechanism that the\r\n * branch declared by #MCUX_CSSL_FP_BRANCH_DECL with the given \\p id has\r\n * executed the positive scenario (under the given \\p condition). For example:\r\n * @code\r\n * MCUX_CSSL_FP_BRANCH_DECL(someBranchIdentifier);\r\n * if (condition)\r\n * {\r\n *   MCUX_CSSL_FP_BRANCH_POSITIVE(someBranchIdentifier);\r\n * }\r\n * else\r\n * {\r\n *   MCUX_CSSL_FP_BRANCH_NEGATIVE(someBranchIdentifier);\r\n * }\r\n * // ...\r\n * MCUX_CSSL_FP_FUNCTION_EXIT(someFunction, 0,\r\n *   // Providing the condition as part of the branch expectation.\r\n *   // Alternatively, the expectation can be placed in a conditional block.\r\n *   MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE(someBranchIdentifier, condition)\r\n * );\r\n * @endcode\r\n *\r\n * @declaration{MCUX_CSSL_FP_BRANCH_DECL}\r\n * @event{MCUX_CSSL_FP_BRANCH_POSITIVE}\r\n *\r\n * @see MCUX_CSSL_FP_FUNCTION_ENTRY\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK\r\n * @see MCUX_CSSL_FP_EXPECT\r\n * @see MCUX_CSSL_FP_CONDITIONAL\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - id:        Identifier of the flow protected branch.\r\n *        - condition: Optional, condition under which this branch is taken.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE(...) \\\r\n  MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL(__VA_ARGS__)\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE\r\n * @brief Expectation that negative branch has been taken.\r\n * @api\r\n * @ingroup csslFpBranch\r\n *\r\n * This expectation macro indicates to the flow protection mechanism that the\r\n * branch declared by #MCUX_CSSL_FP_BRANCH_DECL with the given \\p id has\r\n * executed the negative scenario (under the given \\p condition). For example:\r\n * @code\r\n * MCUX_CSSL_FP_BRANCH_DECL(someBranchIdentifier);\r\n * if (condition)\r\n * {\r\n *   MCUX_CSSL_FP_BRANCH_POSITIVE(someBranchIdentifier);\r\n * }\r\n * else\r\n * {\r\n *   MCUX_CSSL_FP_BRANCH_NEGATIVE(someBranchIdentifier);\r\n * }\r\n * // ...\r\n * MCUX_CSSL_FP_FUNCTION_EXIT(someFunction, 0,\r\n *   // Providing the branch expectation as part of a conditional block.\r\n *   // Alternatively, the condition can be provided in the branch expectation.\r\n *   MCUX_CSSL_FP_CONDITIONAL(!condition,\r\n *     MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE(someBranchIdentifier)\r\n *   )\r\n * );\r\n * @endcode\r\n *\r\n * @declaration{MCUX_CSSL_FP_BRANCH_DECL}\r\n * @event{MCUX_CSSL_FP_BRANCH_NEGATIVE}\r\n *\r\n * @see MCUX_CSSL_FP_FUNCTION_ENTRY\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK\r\n * @see MCUX_CSSL_FP_EXPECT\r\n * @see MCUX_CSSL_FP_CONDITIONAL\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - id:        Identifier of the flow protected branch.\r\n *        - condition: Optional, condition under which this branch is taken.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE(...) \\\r\n  MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL(__VA_ARGS__)\r\n\r\n\r\n\r\n/**\r\n * @defgroup csslFpSwitch Switching flow protection\r\n * @brief Support for flow protected switches.\r\n * @ingroup mcuxCsslFlowProtection\r\n *\r\n * @declaration{MCUX_CSSL_FP_SWITCH_DECL}\r\n * @event{MCUX_CSSL_FP_SWITCH_CASE,MCUX_CSSL_FP_SWITCH_DEFAULT}\r\n * @expectation{MCUX_CSSL_FP_SWITCH_TAKEN,MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT}\r\n */\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_SWITCH_DECL\r\n * @brief Declaration of a flow protected switch.\r\n * @api\r\n * @ingroup csslFpSwitch\r\n *\r\n * To inform the flow protection mechanism about a switch that needs to be\r\n * protected, a switch identifier needs to be declared. This identifier can\r\n * then be used in the events and expectation macros. For example:\r\n * @code\r\n * MCUX_CSSL_FP_SWITCH_DECL(someSwitchIdentifier);\r\n * switch (arg)\r\n * {\r\n *   case 0xC0DEu:\r\n *   {\r\n *     result = 0xC0DEu;\r\n *     MCUX_CSSL_FP_SWITCH_CASE(someSwitchIdentifier, 0xC0DEu);\r\n *     break;\r\n *   }\r\n *   default:\r\n *   {\r\n *     result = 0;\r\n *     MCUX_CSSL_FP_SWITCH_DEFAULT(someSwitchIdentifier);\r\n *     break;\r\n *   }\r\n * }\r\n * // ...\r\n * MCUX_CSSL_FP_FUNCTION_EXIT(someFunction, result,\r\n *   // Option 1: provide the condition as part of the switch expectation.\r\n *   MCUX_CSSL_FP_SWITCH_TAKEN(someSwitchIdentifier, 0xC0DEu, 0xC0DEu == arg),\r\n *   // Option 2: place the switch expectation in a conditional block.\r\n *   MCUX_CSSL_FP_CONDITIONAL(0xC0DEu != arg),\r\n *     MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT(someSwitchIdentifier)\r\n *   )\r\n * );\r\n * @endcode\r\n *\r\n * @event{MCUX_CSSL_FP_SWITCH_CASE,MCUX_CSSL_FP_SWITCH_DEFAULT}\r\n * @expectation{MCUX_CSSL_FP_SWITCH_TAKEN,MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT}\r\n *\r\n * @param id Identifier for the switch that is flow protected.\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_DECL(id) \\\r\n  MCUX_CSSL_FP_SWITCH_DECL_IMPL(id)\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_SWITCH_CASE\r\n * @brief Case that is being handled from a switch.\r\n * @api\r\n * @ingroup csslFpSwitch\r\n *\r\n * This switch event macro informs the flow mechanism that the given \\p case of\r\n * the switch is executed for the switch declared by #MCUX_CSSL_FP_SWITCH_DECL\r\n * with the given \\p id. For example:\r\n * @code\r\n * MCUX_CSSL_FP_SWITCH_DECL(someSwitchIdentifier);\r\n * switch (arg)\r\n * {\r\n *   case 0xC0DEu:\r\n *   {\r\n *     result = 0xC0DEu;\r\n *     MCUX_CSSL_FP_SWITCH_CASE(someSwitchIdentifier, 0xC0DEu);\r\n *     break;\r\n *   }\r\n *   default:\r\n *   {\r\n *     result = 0;\r\n *     MCUX_CSSL_FP_SWITCH_DEFAULT(someSwitchIdentifier);\r\n *     break;\r\n *   }\r\n * }\r\n * // ...\r\n * MCUX_CSSL_FP_FUNCTION_EXIT(someFunction, result,\r\n *   // Option 1: provide the condition as part of the switch expectation.\r\n *   MCUX_CSSL_FP_SWITCH_TAKEN(someSwitchIdentifier, 0xC0DEu, 0xC0DEu == arg),\r\n *   // Option 2: place the switch expectation in a conditional block.\r\n *   MCUX_CSSL_FP_CONDITIONAL(0xC0DEu != arg),\r\n *     MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT(someSwitchIdentifier)\r\n *   )\r\n * );\r\n * @endcode\r\n *\r\n * @declaration{MCUX_CSSL_FP_SWITCH_DECL}\r\n * @expectation{MCUX_CSSL_FP_SWITCH_TAKEN}\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - id:     Identifier of the flow protected switch.\r\n *        - case:   Case value that is chosen in the switch.\r\n *        - expect: Zero or more (comma separated) declarations of expected code\r\n *                  flow behavior related to this event.\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_CASE(...) \\\r\n  MCUX_CSSL_FP_SWITCH_CASE_IMPL(__VA_ARGS__, MCUX_CSSL_FP_VOID_EXPECTATION_IMPL())\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_SWITCH_DEFAULT\r\n * @brief Case that is being handled from a switch.\r\n * @api\r\n * @ingroup csslFpSwitch\r\n *\r\n * This switch event macro informs the flow mechanism that the default case of\r\n * the switch is executed for the switch declared by #MCUX_CSSL_FP_SWITCH_DECL\r\n * with the given \\p id. For example:\r\n * @code\r\n * MCUX_CSSL_FP_SWITCH_DECL(someSwitchIdentifier);\r\n * switch (arg)\r\n * {\r\n *   case 0xC0DEu:\r\n *   {\r\n *     result = 0xC0DEu;\r\n *     MCUX_CSSL_FP_SWITCH_CASE(someSwitchIdentifier, 0xC0DEu);\r\n *     break;\r\n *   }\r\n *   default:\r\n *   {\r\n *     result = 0;\r\n *     MCUX_CSSL_FP_SWITCH_DEFAULT(someSwitchIdentifier);\r\n *     break;\r\n *   }\r\n * }\r\n *\r\n * MCUX_CSSL_FP_FUNCTION_EXIT(someFunction, result,\r\n *   // Option 1: provide the condition as part of the switch expectation.\r\n *   MCUX_CSSL_FP_SWITCH_TAKEN(argCheck, 0xC0DEu, 0xC0DEu == arg),\r\n *   // Option 2: place the switch expectation in a conditional block.\r\n *   MCUX_CSSL_FP_CONDITIONAL(0xC0DEu != arg),\r\n *     MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT(someSwitchIdentifier)\r\n *   )\r\n * );\r\n * @endcode\r\n *\r\n * @declaration{MCUX_CSSL_FP_SWITCH_DECL}\r\n * @expectation{MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT}\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - id:     Identifier of the flow protected switch.\r\n *        - expect: Zero or more (comma separated) declarations of expected code\r\n *                  flow behavior related to this event.\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_DEFAULT(...) \\\r\n  MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL(__VA_ARGS__, MCUX_CSSL_FP_VOID_EXPECTATION_IMPL())\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_SWITCH_TAKEN\r\n * @brief Expected that a specific case is handled from a switch.\r\n * @api\r\n * @ingroup csslFpSwitch\r\n *\r\n * This expectation macro indicates to the flow protection mechanism that the\r\n * switch declared by #MCUX_CSSL_FP_SWITCH_DECL with the given \\p id has\r\n * executed the \\p case (under the given \\p condition). For example:\r\n * @code\r\n * MCUX_CSSL_FP_SWITCH_DECL(someSwitchIdentifier);\r\n * switch (arg)\r\n * {\r\n *   case 0xC0DEu:\r\n *   {\r\n *     result = 0xC0DEu;\r\n *     MCUX_CSSL_FP_SWITCH_CASE(someSwitchIdentifier, 0xC0DEu);\r\n *     break;\r\n *   }\r\n *   default:\r\n *   {\r\n *     result = 0;\r\n *     MCUX_CSSL_FP_SWITCH_DEFAULT(someSwitchIdentifier);\r\n *     break;\r\n *   }\r\n * }\r\n *\r\n * MCUX_CSSL_FP_FUNCTION_EXIT(someFunction, result,\r\n *   // Option 1: provide the condition as part of the switch expectation.\r\n *   MCUX_CSSL_FP_SWITCH_TAKEN(argCheck, 0xC0DEu, 0xC0DEu == arg),\r\n *   // Option 2: place the switch expectation in a conditional block.\r\n *   MCUX_CSSL_FP_CONDITIONAL(0xC0DEu != arg),\r\n *     MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT(someSwitchIdentifier)\r\n *   )\r\n * );\r\n * @endcode\r\n *\r\n * @declaration{MCUX_CSSL_FP_SWITCH_DECL}\r\n * @event{MCUX_CSSL_FP_SWITCH_CASE}\r\n *\r\n * @see MCUX_CSSL_FP_FUNCTION_ENTRY\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK\r\n * @see MCUX_CSSL_FP_EXPECT\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - id:        Identifier of the flow protected switch.\r\n *        - case:      Value of the case that is expected to be chosen in the\r\n *                     switch.\r\n *        - condition: Optional, condition under which the \\p case is taken.\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_TAKEN(...) \\\r\n  MCUX_CSSL_FP_SWITCH_TAKEN_IMPL(__VA_ARGS__)\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT\r\n * @brief Expected that default case is handled from a switch.\r\n * @api\r\n * @ingroup csslFpSwitch\r\n *\r\n * This expectation macro indicates to the flow protection mechanism that the\r\n * switch declared by #MCUX_CSSL_FP_SWITCH_DECL with the given \\p id has\r\n * executed the default case (under the given \\p condition). For example:\r\n * @code\r\n * MCUX_CSSL_FP_SWITCH_DECL(someSwitchIdentifier);\r\n * switch (arg)\r\n * {\r\n *   case 0xC0DEu:\r\n *   {\r\n *     result = 0xC0DEu;\r\n *     MCUX_CSSL_FP_SWITCH_CASE(someSwitchIdentifier, 0xC0DEu);\r\n *     break;\r\n *   }\r\n *   default:\r\n *   {\r\n *     result = 0;\r\n *     MCUX_CSSL_FP_SWITCH_DEFAULT(someSwitchIdentifier);\r\n *     break;\r\n *   }\r\n * }\r\n *\r\n * MCUX_CSSL_FP_FUNCTION_EXIT(someFunction, result,\r\n *   // Option 1: provide the condition as part of the switch expectation.\r\n *   MCUX_CSSL_FP_SWITCH_TAKEN(argCheck, 0xC0DEu, 0xC0DEu == arg),\r\n *   // Option 2: place the switch expectation in a conditional block.\r\n *   MCUX_CSSL_FP_CONDITIONAL(0xC0DEu != arg),\r\n *     MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT(someSwitchIdentifier)\r\n *   )\r\n * );\r\n * @endcode\r\n *\r\n * @declaration{MCUX_CSSL_FP_SWITCH_DECL}\r\n * @event{MCUX_CSSL_FP_SWITCH_DEFAULT}\r\n *\r\n * @see MCUX_CSSL_FP_FUNCTION_ENTRY\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK\r\n * @see MCUX_CSSL_FP_EXPECT\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - id:        Identifier of the flow protected switch.\r\n *        - condition: Optional, condition under which the default case is taken.\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT(...) \\\r\n  MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL(__VA_ARGS__)\r\n\r\n\r\n\r\n/**\r\n * @defgroup csslFpExpect Expectation handling\r\n * @brief Expectation handling support functionality.\r\n *\r\n * @ingroup mcuxCsslFlowProtection\r\n */\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_EXPECT\r\n * @brief Declaration(s) of expected code flow behavior.\r\n * @api\r\n * @ingroup csslFpExpect\r\n *\r\n * This macro can be used to indicate expectations in the function body at\r\n * another location than the function entry or exit.\r\n *\r\n * @note In general the use of this macro is discouraged, to avoid a potential\r\n * security and/or code-size impact. However, it may be usefull for complex\r\n * code, where an intermediate update can actually save code, since conditions\r\n * for expectations can than be locallized.\r\n *\r\n * @expectation{MCUX_CSSL_FP_FUNCTION_CALLED,MCUX_CSSL_FP_LOOP_ITERATIONS,MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE,MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE,MCUX_CSSL_FP_SWITCH_TAKEN}\r\n *\r\n * @see MCUX_CSSL_FP_FUNCTION_ENTRY\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK\r\n * @see MCUX_CSSL_FP_CONDITIONAL\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - expect: One or more (comma separated) declarations of expected code\r\n *                  flow behavior.\r\n */\r\n#define MCUX_CSSL_FP_EXPECT(...) \\\r\n  MCUX_CSSL_FP_EXPECT_IMPL(__VA_ARGS__, MCUX_CSSL_FP_VOID_EXPECTATION_IMPL())\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_CONDITIONAL\r\n * @brief Handling of conditionally expected code flow behavior.\r\n * @api\r\n * @ingroup csslFpExpect\r\n *\r\n * This macro can be used to indicate expectations that are only true under a\r\n * given \\p condition.\r\n *\r\n * @expectation{MCUX_CSSL_FP_FUNCTION_CALLED,MCUX_CSSL_FP_LOOP_ITERATIONS,MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE,MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE,MCUX_CSSL_FP_SWITCH_TAKEN}\r\n *\r\n * @see MCUX_CSSL_FP_FUNCTION_ENTRY\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT\r\n * @see MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK\r\n * @see MCUX_CSSL_FP_EXPECT\r\n *\r\n * @param condition Condition under which the given expectations apply.\r\n * @param ...    One or more (comma separated) declarations of expected code\r\n *               flow behavior.\r\n */\r\n#define MCUX_CSSL_FP_CONDITIONAL(condition, ...) \\\r\n  MCUX_CSSL_FP_CONDITIONAL_IMPL((condition), __VA_ARGS__, MCUX_CSSL_FP_VOID_EXPECTATION_IMPL())\r\n\r\nMCUX_CSSL_ANALYSIS_STOP_SUPPRESS_TEXT_IN_COMMENTS()\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_ASSERT\r\n * @brief Assert an expected state of the code flow.\r\n * @api\r\n * @ingroup csslFpExpect\r\n *\r\n * This macro can be used to check whether the code flow up to this point\r\n * matches the expected state. Unlike the #MCUX_CSSL_FP_EXPECT macro, it will\r\n * not update the expectations, but merely perform a check on the recorded\r\n * events against the already recorded expectations plus the ones provided as\r\n * parameters.\r\n *\r\n * If the check fails, the code defined in #MCUX_CSSL_FP_ASSERT_CALLBACK() will\r\n * be executed.\r\n *\r\n * @note #MCUX_CSSL_FP_ASSERT_CALLBACK() must be defined before including the\r\n * CSSL flow protection headers, otherwise a default implementation could be\r\n * used.\r\n *\r\n * @see MCUX_CSSL_FP_EXPECT\r\n *\r\n * @param ...    The following parameters need to be passed (comma separated):\r\n *        - expect: One or more (comma separated) declarations of expected code\r\n *                  flow behavior.\r\n */\r\n#define MCUX_CSSL_FP_ASSERT(...) \\\r\n  MCUX_CSSL_FP_ASSERT_IMPL(__VA_ARGS__)\r\n\r\n#endif /* MCUX_CSSL_FLOW_PROTECTION_H_ */\r\n\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslFlowProtection/inc/mcuxCsslFlowProtection_Cfg.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * \\file  mcuxCsslFlowProtection_Cfg.h\r\n * \\brief Configuration of the implementation for the flow protection mechanism.\r\n */\r\n\r\n#ifndef MCUX_CSSL_FLOW_PROTECTION_CFG_H_\r\n#define MCUX_CSSL_FLOW_PROTECTION_CFG_H_\r\n\r\n/**\r\n * \\addtogroup mcuxCsslCFG MCUX CSSL -- Configurations\r\n *\r\n * \\defgroup mcuxCsslFlowProtection_CFG Flow Protection Configuration\r\n * \\brief Configuration options for the flow protection mechanism.\r\n * \\ingroup mcuxCsslCFG\r\n */\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_USE_CODE_SIGNATURE\r\n * \\brief If set to 1, use the flow protection mechanism implementation based on\r\n *        the Zen-V code signature HW mechanism.\r\n * \\ingroup mcuxCsslFlowProtection_CFG\r\n */\r\n    #define MCUX_CSSL_FP_USE_CODE_SIGNATURE      0\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_USE_SECURE_COUNTER\r\n * \\brief If set to 1, use the flow protection mechanism implementation based on\r\n *        the CSSL secure counter mechanism.\r\n * \\ingroup mcuxCsslFlowProtection_CFG\r\n */\r\n    #define MCUX_CSSL_FP_USE_SECURE_COUNTER      1\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_USE_NONE\r\n * \\brief If set to 1, do not use the flow protection mechanism.\r\n * \\ingroup mcuxCsslFlowProtection_CFG\r\n */\r\n    #define MCUX_CSSL_FP_USE_NONE      0\r\n\r\n/* Basic configuration sanity check */\r\n\r\n#endif /* MCUX_CSSL_FLOW_PROTECTION_CFG_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslFlowProtection/inc/mcuxCsslFlowProtection_FunctionIdentifiers.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxCsslFlowProtection_FunctionIdentifiers.h\r\n * @brief Definition of function identifiers for the flow protection mechanism.\r\n *\r\n * @note This file might be post-processed to update the identifier values to\r\n * proper/secure values.\r\n */\r\n\r\n#ifndef MCUX_CSSL_FLOW_PROTECTION_FUNCTION_IDENTIFIERS_H_\r\n#define MCUX_CSSL_FLOW_PROTECTION_FUNCTION_IDENTIFIERS_H_\r\n\r\n/* Flow Protection example values: */\r\n#define MCUX_CSSL_FP_FUNCID_functionOnly0                     (0x50DDu)\r\n#define MCUX_CSSL_FP_FUNCID_functionOnly1                     (0x5595u)\r\n#define MCUX_CSSL_FP_FUNCID_functionOnly2                     (0x6B52u)\r\n#define MCUX_CSSL_FP_FUNCID_functionCall                      (0x50BBu)\r\n#define MCUX_CSSL_FP_FUNCID_functionCalls                     (0x4E71u)\r\n#define MCUX_CSSL_FP_FUNCID_functionLoop                      (0x4AF2u)\r\n#define MCUX_CSSL_FP_FUNCID_functionBranch                    (0x0D3Bu)\r\n#define MCUX_CSSL_FP_FUNCID_functionSwitch                    (0x22AFu)\r\n#define MCUX_CSSL_FP_FUNCID_functionComplex                   (0x781Bu)\r\n#define MCUX_CSSL_FP_FUNCID_data_invariant_memory_compare     (0x562Bu)\r\n#define MCUX_CSSL_FP_FUNCID_data_invariant_memory_copy        (0x4AA7u)\r\n#define MCUX_CSSL_FP_FUNCID_functionAssert                    (0x21DEu)\r\n/* Values for production use: */\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCsslParamIntegrity_Validate    (0x1AA7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCsslMemory_Compare             (0x696Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCsslMemory_Copy                (0x7D21u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCsslMemory_Clear               (0x42D7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCsslMemory_Set                 (0x44F9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCsslMemory_SecureClear         (0x29BCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCsslMemory_SecureCopy          (0x27AAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCsslMemory_SecureSet           (0x5B58u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCsslMemory_SecureCompare       (0x79C2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCsslMemory_DPASecureCompare    (0x5AF0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCsslMemory_Int_DPASecComp      (0x629Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCsslMemory_Int_CopyPow2        (0x53C3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCsslMemory_Int_CopyWords       (0x3761u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCsslMemory_Int_SecCopyPow2     (0x4A5Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCsslMemory_Int_SecComp         (0x187Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCsslMemory_Int_SecClear        (0x2C3Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCsslMemory_Int_SecSet          (0x6655u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCsslMemory_SecureXOR           (0x3366u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCsslMemory_SecureXORWithConst  (0x4A97u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_14                 (0x17C5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_15                 (0x1E8Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_16                 (0x26A7u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_17                 (0x14F9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_18                 (0x43E9u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_19                 (0x533Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_20                 (0x2EC5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_21                 (0x7D44u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_22                 (0x2AE3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_23                 (0x7274u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_24                 (0x7CE0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_25                 (0x4DC5u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_26                 (0x3E94u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_27                 (0x75A4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_28                 (0x35E4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_29                 (0x63F0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_30                 (0x62BAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_31                 (0x7549u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_32                 (0x77C0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_33                 (0x662Eu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_34                 (0x521Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_35                 (0x6671u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_36                 (0x711Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_37                 (0x684Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_38                 (0x52EAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_39                 (0x1EACu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_40                 (0x4D66u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_41                 (0x4557u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_42                 (0x25F2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_43                 (0x278Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_44                 (0x3C55u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_45                 (0x1796u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_46                 (0x6732u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_47                 (0x67D0u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_48                 (0x5627u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_49                 (0x6AB1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_50                 (0x5927u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_51                 (0x51CEu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_52                 (0x7585u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_53                 (0x78B1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_54                 (0x0B5Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_55                 (0x6A87u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_56                 (0x19ABu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_57                 (0x57C1u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_58                 (0x589Du)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_59                 (0x61E3u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_60                 (0x0D2Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_61                 (0x5B1Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_62                 (0x3CD4u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_63                 (0x0C6Fu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_64                 (0x21BDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_65                 (0x1D9Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_66                 (0x5674u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_67                 (0x60DDu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_68                 (0x78AAu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_69                 (0x0F36u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_70                 (0x6B2Au)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_71                 (0x2D63u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_72                 (0x2F16u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_73                 (0x4F1Cu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_74                 (0x5B83u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_75                 (0x7833u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_76                 (0x3B26u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_77                 (0x34DCu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_78                 (0x6E46u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_79                 (0x6F21u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_80                 (0x2937u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_81                 (0x1BE2u)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_82                 (0x2A9Bu)\r\n#define MCUX_CSSL_FP_FUNCID_mcuxCssl_unused_83                 (0x78A3u)\r\n\r\n#endif /* MCUX_CSSL_FLOW_PROTECTION_FUNCTION_IDENTIFIERS_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslFlowProtection/inc/mcuxCsslFlowProtection_Impl.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2022 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * \\file  mcuxCsslFlowProtection_Impl.h\r\n * \\brief Selection of the implementation for the flow protection mechanism.\r\n */\r\n\r\n#ifndef MCUX_CSSL_FLOW_PROTECTION_IMPL_H_\r\n#define MCUX_CSSL_FLOW_PROTECTION_IMPL_H_\r\n\r\n/* Include the configuration for the flow protection mechanism. */\r\n#include <mcuxCsslFlowProtection_Cfg.h>\r\n\r\n/* Include the selected implementation of the flow protection mechanism. */\r\n#if defined(MCUX_CSSL_FP_USE_CODE_SIGNATURE) && (1 == MCUX_CSSL_FP_USE_CODE_SIGNATURE)\r\n#  include <mcuxCsslFlowProtection_CodeSignature.h>\r\n#elif defined(MCUX_CSSL_FP_USE_SECURE_COUNTER) \\\r\n      && (1 == MCUX_CSSL_FP_USE_SECURE_COUNTER)\r\n#  include <mcuxCsslSecureCounter_Cfg.h>\r\n#  include <mcuxCsslFlowProtection_SecureCounter_Common.h>\r\n#  if defined(MCUX_CSSL_SC_USE_SW_LOCAL) && (1 == MCUX_CSSL_SC_USE_SW_LOCAL)\r\n#    include <mcuxCsslFlowProtection_SecureCounter_Local.h>\r\n#  else\r\n#    include <mcuxCsslFlowProtection_SecureCounter_Global.h>\r\n#  endif\r\n#elif defined(MCUX_CSSL_FP_USE_NONE) && (1 == MCUX_CSSL_FP_USE_NONE)\r\n#  include <mcuxCsslFlowProtection_None.h>\r\n#else\r\n  #error \"No flow protection implementation found/configured.\"\r\n#endif\r\n\r\n#endif /* MCUX_CSSL_FLOW_PROTECTION_IMPL_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslFlowProtection/inc/mcuxCsslFlowProtection_SecureCounter_Common.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * \\file  mcuxCsslFlowProtection_SecureCounter_Common.h\r\n * \\brief Counter based implementation for the flow protection mechanism, for a local security counter.\r\n */\r\n\r\n#ifndef MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_COMMON_H_\r\n#define MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_COMMON_H_\r\n\r\n/* Include the CSSL C pre-processor support functionality. */\r\n#include <mcuxCsslCPreProcessor.h>\r\n#include <mcuxCsslAnalysis.h>\r\n\r\n/* Include the CSSL secure counter mechanism as basic building block. */\r\n#include <mcuxCsslSecureCounter.h>\r\n\r\n/* Include the C99 standard integer types. */\r\n#include <stdint.h>\r\n\r\n/**\r\n * \\addtogroup mcuxCsslIMPL MCUX CSSL -- Implementations\r\n *\r\n * \\defgroup mcuxCsslFlowProtection_SecureCounter Flow Protection: Secure Counter\r\n * \\brief Secure counter based implementation for the flow protection mechanism.\r\n * \\ingroup mcuxCsslIMPL\r\n */\r\n\r\n\r\n/**\r\n * \\defgroup csslFpCntCore Flow protection core functionality\r\n * \\brief Flow protection handling core functionality.\r\n * \\ingroup mcuxCsslFlowProtection_SecureCounter\r\n *\r\n * \\todo Extend this description of the core functionality which relies\r\n *       basically on the function calling flow protection.\r\n *\r\n * \\declaration{MCUX_CSSL_FP_FUNCTION_DECL_IMPL}\r\n * \\event{MCUX_CSSL_FP_FUNCTION_CALL_IMPL}\r\n * \\expectation{MCUX_CSSL_FP_FUNCTION_CALLED_IMPL}\r\n */\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_DECL_NAME\r\n * \\brief Construct a name based on type and id.\r\n * \\ingroup csslFpCntCore\r\n *\r\n * \\param type Indicator for the type of declaration.\r\n * \\param id   Identifier for the flow protected entity.\r\n * \\return     CSSL flow protection entity name for given \\p type and \\p id.\r\n */\r\n#define MCUX_CSSL_FP_DECL_NAME(type, id) \\\r\n  MCUX_CSSL_CPP_CAT4(mcuxCsslFlowProtection_, type, _, id)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_DECL_IMPL\r\n * \\brief Generic flow protected entity declaration implementation.\r\n * \\ingroup csslFpCntCore\r\n *\r\n * \\param type Indicator for the type of declaration.\r\n * \\param id   Identifier for the flow protected entity.\r\n * \\return     CSSL flow protection entity declaration.\r\n */\r\n#define MCUX_CSSL_FP_DECL_IMPL(type, id) \\\r\n  MCUX_CSSL_SC_VALUE_TYPE MCUX_CSSL_FP_DECL_NAME(type, id) = \\\r\n    MCUX_CSSL_CPP_CAT3(MCUX_CSSL_FP_, type, _ID)(id)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_ID_IMPL\r\n * \\brief Generic identifier generator based on current line number.\r\n * \\ingroup csslFpCntCore\r\n *\r\n * \\return Counter value based on the current line number.\r\n */\r\n#define MCUX_CSSL_FP_ID_IMPL() \\\r\n  MCUX_CSSL_CPP_CAT(__LINE__, u)\r\n\r\n\r\n\r\n/**\r\n * \\defgroup csslFpCntExpect Expectation handling\r\n * \\brief Expectation handling support functionality.\r\n * \\ingroup mcuxCsslFlowProtection_SecureCounter\r\n */\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_EXPECTATIONS\r\n * \\brief Expectation aggregation.\r\n * \\ingroup csslFpCntExpect\r\n *\r\n * \\param expect One or more (comma separated) declarations of expected code\r\n *               flow behavior.\r\n * \\return       Aggregated counter value for the given expectations.\r\n */\r\n#define MCUX_CSSL_FP_EXPECTATIONS(...) \\\r\n  ((uint32_t) 0u + (MCUX_CSSL_CPP_MAP(MCUX_CSSL_CPP_ADD, __VA_ARGS__)))\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_COUNTER_STMT\r\n * @brief A statement which is only evaluated if a secure counter is used.\r\n * @api\r\n * @ingroup csslFpCntCore\r\n *\r\n * This macro can be used to create counting variables that are only present if\r\n * the active configuration uses a secure counter, to avoid warnings about\r\n * unused variables.\r\n *\r\n * @param statement The statement to be conditionally included.\r\n */\r\n#define MCUX_CSSL_FP_COUNTER_STMT_IMPL(statement) \\\r\n  statement\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_CONDITIONAL_IMPL\r\n * \\brief Conditional expectation aggregation.\r\n * \\ingroup csslFpCntCore\r\n *\r\n * \\param condition Condition under which the given expectations apply\r\n * \\param expect    One or more (comma separated) declarations of expected code\r\n *                  code flow behavior.\r\n * \\return          Aggregated counter value for the given expectations, if\r\n *                  condition is satisfied. Otherwise 0.\r\n */\r\n#define MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, ...) \\\r\n  (MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) & ((condition) ? ((uint32_t) UINT32_MAX) : ((uint32_t) 0)))\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_VOID_EXPECTATION_IMPL\r\n * @brief Implementation of expectation of nothing\r\n * @api\r\n * @ingroup csslFpCntExpect\r\n *\r\n * This expectation macro indicates to the flow protection mechanism that nothing\r\n * is expected to happen. This is mainly intended for internal use (to ensure at\r\n * least one expectation is passed).\r\n */\r\n#define MCUX_CSSL_FP_VOID_EXPECTATION_IMPL() \\\r\n  (0u)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_EXPECT_IMPL\r\n * \\brief Declaration(s) of expected code flow behavior.\r\n * \\ingroup csslFpCntExpect\r\n *\r\n * This macro can be used to indicate expectations in the function body at\r\n * another location than the function entry or exit.\r\n *\r\n * \\see MCUX_CSSL_FP_EXPECTATIONS\r\n *\r\n * \\param expect One or more (comma separated) declarations of expected code\r\n *               flow behavior.\r\n */\r\n#define MCUX_CSSL_FP_EXPECT_IMPL(...) \\\r\n  MCUX_CSSL_SC_SUB( \\\r\n    MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \\\r\n  )\r\n\r\n\r\n\r\n/**\r\n * \\defgroup csslFpCntFunction Function calling flow protection\r\n * \\brief Support for flow protected functions.\r\n * \\ingroup mcuxCsslFlowProtection_SecureCounter\r\n *\r\n * \\declaration{MCUX_CSSL_FP_FUNCTION_DECL_IMPL}\r\n * \\event{MCUX_CSSL_FP_FUNCTION_CALL_IMPL}\r\n * \\expectation{MCUX_CSSL_FP_FUNCTION_CALLED_IMPL}\r\n */\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_ID\r\n * \\brief Generator for function identifiers.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * \\param id Identifier for the flow protected function.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_ID(id) \\\r\n  MCUX_CSSL_CPP_CAT(MCUX_CSSL_FP_FUNCID_, id)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_ID_ENTRY_MASK\r\n * \\brief Mask to be used to derive entry part from a function identifier\r\n * \\ingroup csslFpCntFunction\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_ID_ENTRY_MASK \\\r\n  (0x5A5A5A5Au)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART\r\n * \\brief Part of the function identifier to be used at function entry.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * \\param id Identifier for the flow protected function.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id) \\\r\n  (MCUX_CSSL_FP_FUNCTION_VALUE(id) & MCUX_CSSL_FP_FUNCTION_ID_ENTRY_MASK)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_ID_EXIT_PART\r\n * \\brief Part of the function identifier to be used at function exit.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * \\param id Identifier for the flow protected function.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_ID_EXIT_PART(id) \\\r\n  (MCUX_CSSL_FP_FUNCTION_VALUE(id) - MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id))\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_DECL_IMPL\r\n * \\brief Declaration implementation of a flow protected function.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * \\event{MCUX_CSSL_FP_FUNCTION_CALL_IMPL}\r\n * \\expectation{MCUX_CSSL_FP_FUNCTION_CALLED_IMPL}\r\n *\r\n * @param id Identifier for the function that is flow protected.\r\n * @param ptrType Optional, pointer type matching this function.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_DECL_IMPL(...) \\\r\n  /* Intentionally empty */\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_VALUE\r\n * \\brief Macro to get the value for a given function.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * \\param id Identifier for the function that is flow protected.\r\n * \\return   The counter value for the given function \\p id.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_VALUE(id) \\\r\n  ((uint32_t) MCUX_CSSL_FP_FUNCTION_ID(id))\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_DEF_IMPL\r\n * \\brief Definition implementation of a flow protected function.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * Not used in the current implementation.\r\n *\r\n * @param id Identifier for the function that is flow protected.\r\n * @param ptrType Optional, pointer type matching this function.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_DEF_IMPL(...) \\\r\n  /* Intentionally empty. */\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_POINTER_IMPL\r\n * \\brief Definition implementation of a flow protected function pointer.\r\n * \\ingroup csslFpNoneFunction\r\n *\r\n * @param type Identifier for the function pointer type that is flow protected.\r\n * @param definition Actual type definition of the function pointer type.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_POINTER_IMPL(type, definition) \\\r\n  definition\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_RESULT_OFFSET\r\n * \\brief Offset of the result in the return value.\r\n * \\ingroup csslFpCntFunction\r\n */\r\n#define MCUX_CSSL_FP_RESULT_OFFSET \\\r\n  (0u)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_RESULT_MASK\r\n * \\brief Bitmask of the result in the return value.\r\n * \\ingroup csslFpCntFunction\r\n */\r\n#define MCUX_CSSL_FP_RESULT_MASK \\\r\n  (0xFFFFFFFFuLL)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_RESULT_VALUE\r\n * \\brief Encode a result value for a protected return value.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * \\param result The result that needs to be encoded.\r\n */\r\n#define MCUX_CSSL_FP_RESULT_VALUE(result) \\\r\n  (((uint64_t)(result) & MCUX_CSSL_FP_RESULT_MASK) << MCUX_CSSL_FP_RESULT_OFFSET)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_RESULT_IMPL2\r\n * \\brief Extract the result value from a protected \\p return value.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * \\param type   Type of the result.\r\n * \\param return The protected return value which contains the result.\r\n */\r\n#define MCUX_CSSL_FP_RESULT_IMPL2(type, return) \\\r\n  ((type)(((return) >> MCUX_CSSL_FP_RESULT_OFFSET) & MCUX_CSSL_FP_RESULT_MASK))\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_RESULT_IMPL1\r\n * \\brief Extract the result value from a protected \\p return value.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * \\param return The protected return value which contains the result.\r\n */\r\n#define MCUX_CSSL_FP_RESULT_IMPL1(return) \\\r\n  MCUX_CSSL_FP_RESULT_IMPL2(uint32_t,return)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_RESULT_IMPL\r\n * \\brief Extract the result value from a protected \\p return value.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * \\param type   Optional, type of the result.\r\n * \\param return The protected return value which contains the result.\r\n */\r\n#define MCUX_CSSL_FP_RESULT_IMPL(...) \\\r\n  MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_RESULT_IMPL, __VA_ARGS__)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_PROTECTION_OFFSET\r\n * \\brief Offset of the protection token in the return value.\r\n * \\ingroup csslFpCntFunction\r\n */\r\n#define MCUX_CSSL_FP_PROTECTION_OFFSET \\\r\n  (32u)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_PROTECTION_MASK\r\n * \\brief Bitmask of the protection token in the return value.\r\n * \\ingroup csslFpCntFunction\r\n */\r\n#define MCUX_CSSL_FP_PROTECTION_MASK \\\r\n  ((uint64_t) 0xFFFFFFFFuLL)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_PROTECTION_TOKEN_VALUE\r\n * \\brief Encode a protection token for a protected return value.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * Note that this macro is only used with a local security counter,\r\n * e.g. for configuration CSSL_SC_USE_SW_LOCAL\r\n *\r\n * \\param token The protection token that needs to be encoded.\r\n */\r\n#define MCUX_CSSL_FP_PROTECTION_TOKEN_VALUE(token) \\\r\n  ((((uint64_t)(token) & MCUX_CSSL_FP_PROTECTION_MASK)) << MCUX_CSSL_FP_PROTECTION_OFFSET)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_PROTECTION_TOKEN_IMPL\r\n * \\brief Extract the protection token value from a protected \\p return value.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * Note that this macro is only used with a local security counter,\r\n * e.g. for configuration CSSL_SC_USE_SW_LOCAL\r\n *\r\n * \\param return The protected return value which contains the protection token.\r\n */\r\n#define MCUX_CSSL_FP_PROTECTION_TOKEN_IMPL(return) \\\r\n  (uint32_t)(((return) >> MCUX_CSSL_FP_PROTECTION_OFFSET) & MCUX_CSSL_FP_PROTECTION_MASK)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_COUNTER_COMPRESSED\r\n * \\brief Compressed version of the secure counter that can be used as a\r\n *        protection token.\r\n * \\ingroup csslFpCntFunction\r\n */\r\n#define MCUX_CSSL_FP_COUNTER_COMPRESSED() \\\r\n  MCUX_CSSL_SC_VALUE()\r\n\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_CALLED_IMPL\r\n * \\brief Expectation implementation of a called function.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * \\declaration{MCUX_CSSL_FP_FUNCTION_DECL_IMPL}\r\n * \\event{MCUX_CSSL_FP_FUNCTION_CALL_IMPL}\r\n *\r\n * \\see MCUX_CSSL_FP_FUNCTION_VALUE\r\n *\r\n * \\param id Identifier of the function that is expected to be called.\r\n * \\return   Counter value for the given function.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_CALLED_IMPL(id) \\\r\n  MCUX_CSSL_FP_FUNCTION_VALUE(id)\r\n\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_ENTERED_IMPL\r\n * \\brief Expectation implementation of an entered (but not exited) function.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * \\declaration{MCUX_CSSL_FP_FUNCTION_DECL_IMPL}\r\n * \\event{MCUX_CSSL_FP_FUNCTION_CALL_IMPL}\r\n *\r\n * \\see MCUX_CSSL_FP_FUNCTION_VALUE\r\n *\r\n * \\param id Identifier of the function that is expected to be entered.\r\n * \\return   Counter value for the given function.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_ENTERED_IMPL(id) \\\r\n  MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(id)\r\n\r\n\r\n/**\r\n * \\defgroup csslFpCntLoop Looping flow protection\r\n * \\brief Support for flow protected loops.\r\n * \\ingroup mcuxCsslFlowProtection_SecureCounter\r\n *\r\n * \\declaration{MCUX_CSSL_FP_LOOP_DECL_IMPL}\r\n * \\event{MCUX_CSSL_FP_LOOP_ITERATION_IMPL}\r\n * \\expectation{MCUX_CSSL_FP_LOOP_ITERATIONS_IMPL}\r\n */\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_LOOP_ID\r\n * \\brief Generator for loop identifiers.\r\n * \\ingroup csslFpCntLoop\r\n *\r\n * \\param id Identifier for the flow protected loop.\r\n * \\return   Counter value for the given loop.\r\n */\r\n#define MCUX_CSSL_FP_LOOP_ID(id) \\\r\n  MCUX_CSSL_FP_ID_IMPL()\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_LOOP_DECL_IMPL\r\n * \\brief Declaration implementation of a flow protected loop.\r\n * \\ingroup csslFpCntLoop\r\n *\r\n * \\param id Identifier for the loop that is flow protected.\r\n */\r\n#define MCUX_CSSL_FP_LOOP_DECL_IMPL(id) \\\r\n  MCUX_CSSL_FP_DECL_IMPL(LOOP, id)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_LOOP_VALUE\r\n * \\brief Macro to get the value for a given loop.\r\n * \\ingroup csslFpCntLoop\r\n *\r\n * \\param id Identifier for the loop that is flow protected.\r\n * \\return   The counter value for the given loop \\p id.\r\n */\r\n#define MCUX_CSSL_FP_LOOP_VALUE(id) \\\r\n  MCUX_CSSL_FP_DECL_NAME(LOOP, id)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_LOOP_ITERATION_IMPLn\r\n * \\brief Event implementation of a loop iteration (with expectations).\r\n * \\ingroup csslFpCntLoop\r\n *\r\n * \\see MCUX_CSSL_FP_LOOP_ITERATION_IMPL\r\n *\r\n * \\param id     Identifier for the loop that is flow protected.\r\n * \\param expect One or more (comma separated) declarations of expected code\r\n *               flow behavior related to this event.\r\n */\r\n#define MCUX_CSSL_FP_LOOP_ITERATION_IMPLn(id, ...) \\\r\n  MCUX_CSSL_SC_ADD( \\\r\n    MCUX_CSSL_FP_LOOP_VALUE(id) \\\r\n    - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \\\r\n  )\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_LOOP_ITERATION_IMPL1\r\n * \\brief Event implementation of a loop iteration (without expectations).\r\n * \\ingroup csslFpCntLoop\r\n *\r\n * \\see MCUX_CSSL_FP_LOOP_ITERATION_IMPL\r\n * \\see MCUX_CSSL_FP_LOOP_ITERATION_IMPLn\r\n *\r\n * \\param id Identifier for the loop that is flow protected.\r\n */\r\n#define MCUX_CSSL_FP_LOOP_ITERATION_IMPL1(id) \\\r\n  MCUX_CSSL_FP_LOOP_ITERATION_IMPLn(id, 0u)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_LOOP_ITERATION_IMPL\r\n * \\brief Event implementation of a loop iteration.\r\n * \\ingroup csslFpCntLoop\r\n *\r\n * Implemented as an overloaded macro to simplify the use of the API.\r\n *\r\n * \\see MCUX_CSSL_FP_LOOP_ITERATION_IMPL1\r\n * \\see MCUX_CSSL_FP_LOOP_ITERATION_IMPLn\r\n *\r\n * \\param id     Identifier for the loop that is flow protected.\r\n * \\param expect Zero or more (comma separated) declarations of expected code\r\n *               flow behavior related to this event.\r\n */\r\n#define MCUX_CSSL_FP_LOOP_ITERATION_IMPL(...) \\\r\n  MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_LOOP_ITERATION_IMPL, __VA_ARGS__)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_LOOP_ITERATIONS_IMPL\r\n * \\brief Expectation implementation of a number of loop iterations.\r\n * \\ingroup csslFpCntLoop\r\n *\r\n * \\param id    Identifier of the flow protected loop.\r\n * \\param count Number of expected iterations.\r\n */\r\n#define MCUX_CSSL_FP_LOOP_ITERATIONS_IMPL(id, count) \\\r\n  MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \\\r\n  ((count) * MCUX_CSSL_FP_LOOP_VALUE(id)) \\\r\n  MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()\r\n\r\n\r\n\r\n/**\r\n * \\defgroup csslFpCntBranch Branching flow protection\r\n * \\brief Support for flow protected branches.\r\n * \\ingroup mcuxCsslFlowProtection_SecureCounter\r\n *\r\n * \\declaration{MCUX_CSSL_FP_BRANCH_DECL_IMPL}\r\n * \\event{MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL,MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL}\r\n * \\expectation{MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL,MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL}\r\n */\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_BRANCH_ID\r\n * \\brief Generator for branch identifiers.\r\n * \\ingroup csslFpCntBranch\r\n *\r\n * \\param id Identifier for the flow protected branch.\r\n * \\return   Counter value for the given branch.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_ID(id) \\\r\n  MCUX_CSSL_FP_ID_IMPL()\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_BRANCH_DECL_IMPL\r\n * \\brief Declaration implementation of a flow protected branch.\r\n * \\ingroup csslFpCntBranch\r\n *\r\n * \\param id Identifier for the branch that is flow protected.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_DECL_IMPL(id) \\\r\n  MCUX_CSSL_FP_DECL_IMPL(BRANCH, id)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_BRANCH_VALUE\r\n * \\brief Macro to get the value for a given branch.\r\n * \\ingroup csslFpCntBranch\r\n *\r\n * \\param id Identifier for the branch that is flow protected.\r\n * \\return   The counter value for the given branch \\p id.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_VALUE(id) \\\r\n  MCUX_CSSL_FP_DECL_NAME(BRANCH, id)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE\r\n * \\brief Value to use for the positive scenario.\r\n * \\ingroup csslFpCntBranch\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE 0x5u\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE\r\n * \\brief Value to use for the negative scenario.\r\n * \\ingroup csslFpCntBranch\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE 0xAu\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL\r\n * \\brief Event implementation for the execution of a specified branch scenario.\r\n * \\ingroup csslFpCntBranch\r\n *\r\n * \\see MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL\r\n * \\see MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL\r\n *\r\n * \\param id       Identifier for the branch for which the given \\p scenario is\r\n *                 executed.\r\n * \\param scenario The scenario for a branch is either positive or negative.\r\n * \\param expect   One or more (comma separated) declarations of expected code\r\n *                 flow behavior related to this event.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, scenario, ...) \\\r\n  MCUX_CSSL_SC_ADD( \\\r\n    (MCUX_CSSL_FP_BRANCH_VALUE(id) * (scenario)) \\\r\n    - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \\\r\n  )\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_BRANCH_POSITIVE_IMPLn\r\n * \\brief Event implementation for the execution of a positive branch scenario\r\n *        (with expectations).\r\n * \\ingroup csslFpCntBranch\r\n *\r\n * \\see MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL\r\n * \\see MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL1\r\n *\r\n * \\param id     Identifier for the branch for which the positive scenario is\r\n *               executed.\r\n * \\param expect One or more (comma separated) declarations of expected code\r\n *               flow behavior related to this event.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPLn(id, ...) \\\r\n  MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, \\\r\n    __VA_ARGS__)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL1\r\n * \\brief Event implementation for the execution of a positive branch scenario\r\n *        (without expectations).\r\n * \\ingroup csslFpCntBranch\r\n *\r\n * \\see MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL\r\n * \\see MCUX_CSSL_FP_BRANCH_POSITIVE_IMPLn\r\n *\r\n * \\param id Identifier for the branch for which the positive scenario is\r\n *           executed.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL1(id) \\\r\n  MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, 0u)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL\r\n * \\brief Event implementation for the execution of a positive branch scenario.\r\n * \\ingroup csslFpCntBranch\r\n *\r\n * Implemented as an overloaded macro to simplify the use of the API.\r\n *\r\n * \\see MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL1\r\n * \\see MCUX_CSSL_FP_BRANCH_POSITIVE_IMPLn\r\n *\r\n * \\param id     Identifier for the branch for which the positive scenario is\r\n *               executed.\r\n * \\param expect Zero or more (comma separated) declarations of expected code\r\n *               flow behavior related to this event.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL(...) \\\r\n  MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_BRANCH_POSITIVE_IMPL, __VA_ARGS__)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPLn\r\n * \\brief Event implementation for the execution of a negative branch scenario\r\n *        (with expectations).\r\n * \\ingroup csslFpCntBranch\r\n *\r\n * \\see MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL\r\n * \\see MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL1\r\n *\r\n * \\param id     Identifier for the branch for which the negative scenario is\r\n *               executed.\r\n * \\param expect One or more (comma separated) declarations of expected code\r\n *               flow behavior related to this event.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPLn(id, ...) \\\r\n  MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, \\\r\n    __VA_ARGS__)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL1\r\n * \\brief Event implementation for the execution of a negative branch scenario\r\n *        (without expectations).\r\n * \\ingroup csslFpCntBranch\r\n *\r\n * \\see MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL\r\n * \\see MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPLn\r\n *\r\n * \\param id Identifier for the branch for which the negative scenario is\r\n *           executed.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL1(id) \\\r\n  MCUX_CSSL_FP_BRANCH_SCENARIO_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, 0u)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL\r\n * \\brief Event implementation for the execution of a negative branch scenario.\r\n * \\ingroup csslFpCntBranch\r\n *\r\n * Implemented as an overloaded macro to simplify the use of the API.\r\n *\r\n * \\see MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL1\r\n * \\see MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPLn\r\n *\r\n * \\param id     Identifier for the branch for which the negative scenario is\r\n *               executed.\r\n * \\param expect Zero or more (comma separated) declarations of expected code\r\n *               flow behavior related to this event.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL(...) \\\r\n  MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_BRANCH_NEGATIVE_IMPL, __VA_ARGS__)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_BRANCH_TAKEN_IMPL\r\n * \\brief Expectation implementation of an executed specified branch scenario.\r\n * \\ingroup csslFpCntBranch\r\n *\r\n * \\see MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL\r\n * \\see MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL\r\n *\r\n * \\param id        Identifier of the flow protected branch.\r\n * \\param scenario The scenario for a branch is either positive or negative.\r\n * \\param condition Condition under which this branch is taken.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, scenario, condition) \\\r\n  MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \\\r\n  MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, \\\r\n    MCUX_CSSL_FP_BRANCH_VALUE(id) * (scenario)) \\\r\n  MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL2\r\n * \\brief Expectation implementation of an executed positive branch (with\r\n *        condition).\r\n * \\ingroup csslFpCntBranch\r\n *\r\n * \\see MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL\r\n * \\see MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL1\r\n *\r\n * \\param id        Identifier of the flow protected branch.\r\n * \\param condition Condition under which this branch is taken.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL2(id, condition) \\\r\n  MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, condition)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL1\r\n * \\brief Expectation implementation of an executed positive branch (without\r\n *        condition).\r\n * \\ingroup csslFpCntBranch\r\n *\r\n * \\see MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL\r\n * \\see MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL2\r\n *\r\n * \\param id Identifier of the flow protected branch.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL1(id) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, \"The macro does not contain a composite expression.\") \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_14_3, \"The usage of an invariant condition here is intended to keep the macro structures more clear.\") \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, \"True is of boolean type.\") \\\r\n    MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_POSITIVE_VALUE, true) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL\r\n * \\brief Expectation implementation of an executed positive branch.\r\n * \\ingroup csslFpCntBranch\r\n *\r\n * Implemented as an overloaded macro to simplify the use of the API.\r\n *\r\n * \\see MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL1\r\n * \\see MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL2\r\n *\r\n * \\param id        Identifier of the flow protected branch.\r\n * \\param condition Optional, condition under which this branch is taken.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL(...) \\\r\n  MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_BRANCH_TAKEN_POSITIVE_IMPL, __VA_ARGS__)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL2\r\n * \\brief Expectation implementation of an executed negative branch (with\r\n *        condition).\r\n * \\ingroup csslFpCntBranch\r\n *\r\n * \\see MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL\r\n * \\see MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL1\r\n *\r\n * \\param id        Identifier of the flow protected branch.\r\n * \\param condition Condition under which this branch is taken.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL2(id, condition) \\\r\n  MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, condition)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL1\r\n * \\brief Expectation implementation of an executed negative branch (without\r\n *        condition).\r\n * \\ingroup csslFpCntBranch\r\n *\r\n * \\see MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL\r\n * \\see MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL2\r\n *\r\n * \\param id Identifier of the flow protected branch.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL1(id) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, \"The macro does not contain a composite expression.\") \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_14_3, \"The usage of an invariant condition here is intended to keep the macro structures more clear.\") \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, \"True is of boolean type.\") \\\r\n    MCUX_CSSL_FP_BRANCH_TAKEN_IMPL(id, MCUX_CSSL_FP_BRANCH_NEGATIVE_VALUE, true) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL\r\n * \\brief Expectation implementation of an executed negative branch.\r\n * \\ingroup csslFpCntBranch\r\n *\r\n * Implemented as an overloaded macro to simplify the use of the API.\r\n *\r\n * \\see MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL1\r\n * \\see MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL2\r\n *\r\n * \\param id        Identifier of the flow protected branch.\r\n * \\param condition Optional, condition under which this branch is taken.\r\n */\r\n#define MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL(...) \\\r\n  MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_BRANCH_TAKEN_NEGATIVE_IMPL, __VA_ARGS__)\r\n\r\n\r\n\r\n/**\r\n * \\defgroup csslFpCntSwitch Switching flow protection\r\n * \\brief Support for flow protected switches.\r\n * \\ingroup mcuxCsslFlowProtection_SecureCounter\r\n *\r\n * \\declaration{MCUX_CSSL_FP_SWITCH_DECL_IMPL}\r\n * \\event{MCUX_CSSL_FP_SWITCH_CASE_IMPL,MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL}\r\n * \\expectation{MCUX_CSSL_FP_SWITCH_TAKEN_IMPL,MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL}\r\n */\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_SWITCH_ID\r\n * \\brief Generator for switch identifiers.\r\n * \\ingroup csslFpCntSwitch\r\n *\r\n * \\param id Identifier for the flow protected switch.\r\n * \\return   Counter value for the given loop.\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_ID(id) \\\r\n  MCUX_CSSL_FP_ID_IMPL()\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_SWITCH_DECL_IMPL\r\n * \\brief Declaration implementation of a flow protected switch.\r\n * \\ingroup csslFpCntSwitch\r\n *\r\n * \\param id Identifier for the switch that is flow protected.\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_DECL_IMPL(id) \\\r\n    MCUX_CSSL_FP_DECL_IMPL(SWITCH, id)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_SWITCH_VALUE\r\n * \\brief Macro to get the value for a given switch.\r\n * \\ingroup csslFpCntSwitch\r\n *\r\n * \\param id Identifier for the switch that is flow protected.\r\n * \\return   The counter value for the given switch \\p id.\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_VALUE(id) \\\r\n  MCUX_CSSL_FP_DECL_NAME(SWITCH, id)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_SWITCH_CASE_IMPLn\r\n * \\brief Case that is being handled from a switch.\r\n * \\ingroup csslFpCntSwitch\r\n *\r\n * \\see MCUX_CSSL_FP_SWITCH_CASE_IMPL\r\n * \\see MCUX_CSSL_FP_SWITCH_CASE_IMPL2\r\n *\r\n * \\param id     Identifier of the flow protected switch.\r\n * \\param case   Case value that is chosen in the switch.\r\n * \\param expect One or more (comma separated) declarations of expected code\r\n *               flow behavior related to this event.\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_CASE_IMPLn(id, case, ...) \\\r\n  MCUX_CSSL_SC_ADD( \\\r\n    (MCUX_CSSL_FP_SWITCH_VALUE(id) * (case)) \\\r\n    - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \\\r\n  )\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_SWITCH_CASE_IMPL2\r\n * \\brief Case that is being handled from a switch.\r\n * \\ingroup csslFpCntSwitch\r\n *\r\n * \\see MCUX_CSSL_FP_SWITCH_CASE_IMPL\r\n * \\see MCUX_CSSL_FP_SWITCH_CASE_IMPLn\r\n *\r\n * \\param id   Identifier of the flow protected switch.\r\n * \\param case Case value that is chosen in the switch.\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_CASE_IMPL2(id, case) \\\r\n  MCUX_CSSL_FP_SWITCH_CASE_IMPLn(id, case, 0u)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_SWITCH_CASE_IMPL\r\n * \\brief Case that is being handled from a switch.\r\n * \\ingroup csslFpCntSwitch\r\n *\r\n * Implemented as an overloaded macro to simplify the use of the API.\r\n *\r\n * \\see MCUX_CSSL_FP_SWITCH_CASE_IMPL2\r\n * \\see MCUX_CSSL_FP_SWITCH_CASE_IMPLn\r\n *\r\n * \\param id     Identifier of the flow protected switch.\r\n * \\param case   Case value that is chosen in the switch.\r\n * \\param expect Zero or more (comma separated) declarations of expected code\r\n *               flow behavior related to this event.\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_CASE_IMPL(...) \\\r\n  MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_SWITCH_CASE_IMPL, __VA_ARGS__)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE\r\n * \\brief Value to use for default case.\r\n * \\ingroup csslFpCntSwitch\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE \\\r\n  (0xDEFAu)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_SWITCH_DEFAULT_IMPLn\r\n * \\brief Case that is being handled from a switch.\r\n * \\ingroup csslFpCntSwitch\r\n *\r\n * \\see MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL\r\n * \\see MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL1\r\n *\r\n * \\param id     Identifier of the flow protected switch.\r\n * \\param expect Zero or more (comma separated) declarations of expected code\r\n *               flow behavior related to this event.\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPLn(id, ...) \\\r\n  MCUX_CSSL_FP_SWITCH_CASE_IMPLn( \\\r\n    id, MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE, __VA_ARGS__)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL1\r\n * \\brief Case that is being handled from a switch.\r\n * \\ingroup csslFpCntSwitch\r\n *\r\n * \\see MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL\r\n * \\see MCUX_CSSL_FP_SWITCH_DEFAULT_IMPLn\r\n *\r\n * \\param id Identifier of the flow protected switch.\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL1(id) \\\r\n  MCUX_CSSL_FP_SWITCH_DEFAULT_IMPLn(id, 0u) \\\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL\r\n * \\brief Case that is being handled from a switch.\r\n * \\ingroup csslFpCntSwitch\r\n *\r\n * Implemented as an overloaded macro to simplify the use of the API.\r\n *\r\n * \\see MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL1\r\n * \\see MCUX_CSSL_FP_SWITCH_DEFAULT_IMPLn\r\n *\r\n * \\param id     Identifier of the flow protected switch.\r\n * \\param expect Zero or more (comma separated) declarations of expected code\r\n *               flow behavior related to this event.\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL(...) \\\r\n  MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_SWITCH_DEFAULT_IMPL, __VA_ARGS__)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3\r\n * \\brief Expected that a specific case is handled from a switch.\r\n * \\ingroup csslFpCntSwitch\r\n *\r\n * \\see MCUX_CSSL_FP_SWITCH_TAKEN_IMPL\r\n * \\see MCUX_CSSL_FP_SWITCH_TAKEN_IMPL2\r\n *\r\n * \\param id        Identifier of the flow protected switch.\r\n * \\param case      Value of the case that is expected to be chosen in the\r\n *                  switch.\r\n * \\param condition Optional, condition under which the \\p case is taken.\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, case, condition) \\\r\n  MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \\\r\n  MCUX_CSSL_FP_CONDITIONAL_IMPL(condition, \\\r\n    MCUX_CSSL_FP_SWITCH_VALUE(id) * (case)) \\\r\n  MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_SWITCH_TAKEN_IMPL2\r\n * \\brief Expected that a specific case is handled from a switch.\r\n * \\ingroup csslFpCntSwitch\r\n *\r\n * \\see MCUX_CSSL_FP_SWITCH_TAKEN_IMPL\r\n * \\see MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3\r\n *\r\n * \\param id   Identifier of the flow protected switch.\r\n * \\param case Value of the case that is expected to be chosen in the switch.\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL2(id, case) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, \"The macro does not contain a composite expression.\") \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_14_3, \"The usage of an invariant condition here is intended to keep the macro structures more clear.\") \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, \"True is of boolean type.\") \\\r\n    MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, case, true) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_SWITCH_TAKEN_IMPL\r\n * \\brief Expected that a specific case is handled from a switch.\r\n * \\ingroup csslFpCntSwitch\r\n *\r\n * Implemented as an overloaded macro to simplify the use of the API.\r\n *\r\n * \\see MCUX_CSSL_FP_SWITCH_TAKEN_IMPL2\r\n * \\see MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3\r\n *\r\n * \\param id        Identifier of the flow protected switch.\r\n * \\param case      Value of the case that is expected to be chosen in the\r\n *                  switch.\r\n * \\param condition Optional, condition under which the \\p case is taken.\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_TAKEN_IMPL(...) \\\r\n  MCUX_CSSL_CPP_OVERLOADED3(MCUX_CSSL_FP_SWITCH_TAKEN_IMPL, __VA_ARGS__)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL2\r\n * \\brief Expected that default case is handled from a switch.\r\n * \\ingroup csslFpCntSwitch\r\n *\r\n * \\see MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL\r\n * \\see MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL1\r\n *\r\n * \\param id        Identifier of the flow protected switch.\r\n * \\param condition Condition under which the default case is taken.\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL2(id, condition) \\\r\n  MCUX_CSSL_FP_SWITCH_TAKEN_IMPL3(id, MCUX_CSSL_FP_SWITCH_DEFAULT_VALUE, condition)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL1\r\n * \\brief Expected that default case is handled from a switch.\r\n * \\ingroup csslFpCntSwitch\r\n *\r\n * \\see MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL\r\n * \\see MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL2\r\n *\r\n * \\param id        Identifier of the flow protected switch.\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL1(id) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8, \"The macro does not contain a composite expression.\") \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_DEVIATE(MISRA_C_2012_Rule_14_3, \"The usage of an invariant condition here is intended to keep the macro structures more clear.\") \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1, \"True is of boolean type.\") \\\r\n    MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL2(id, true) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_1) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_DEVIATE(MISRA_C_2012_Rule_14_3) \\\r\n  MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(MISRA_C_2012_Rule_10_8)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL\r\n * \\brief Expected that default case is handled from a switch.\r\n * \\ingroup csslFpCntSwitch\r\n *\r\n * Implemented as an overloaded macro to simplify the use of the API.\r\n *\r\n * \\see MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL1\r\n * \\see MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL2\r\n *\r\n * \\param id        Identifier of the flow protected switch.\r\n * \\param condition Optional, condition under which the default case is taken.\r\n */\r\n#define MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL(...) \\\r\n  MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_SWITCH_TAKEN_DEFAULT_IMPL, __VA_ARGS__)\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_ASSERT_CALLBACK\r\n * @brief Fallback assert callback implementation.\r\n * @api\r\n * @ingroup csslFpCntExpect\r\n *\r\n * This macro will be executed if an #MCUX_CSSL_FP_ASSERT fails. In general this\r\n * behavior should be defined by the user. This implementation is only in place\r\n * to ensure that an implementation is always available.\r\n *\r\n * This is implemented a division by 0, which should trigger a compiler warning\r\n * when used, to inform the user that the default implementation is used.\r\n * Additionally, when still used at run-time it should trigger some system\r\n * exception.\r\n *\r\n * \\see MCUX_CSSL_FP_ASSERT\r\n */\r\n#ifndef MCUX_CSSL_FP_ASSERT_CALLBACK\r\n  #define MCUX_CSSL_FP_ASSERT_CALLBACK() \\\r\n    return 1/0 /* Fallback ASSERT callback is used, please provide your own. */\r\n#endif\r\n\r\n#endif /* MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_COMMON_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslFlowProtection/inc/mcuxCsslFlowProtection_SecureCounter_Local.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * \\file  mcuxCsslFlowProtection_SecureCounter_Local.h\r\n * \\brief Counter based implementation for the flow protection mechanism, for a local security counter.\r\n */\r\n\r\n#ifndef MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_LOCAL_H_\r\n#define MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_LOCAL_H_\r\n\r\n/* Include the CSSL C pre-processor support functionality. */\r\n#include <mcuxCsslCPreProcessor.h>\r\n\r\n/* Include the CSSL secure counter mechanism as basic building block. */\r\n#include <mcuxCsslSecureCounter.h>\r\n\r\n/* Include the C99 standard integer types. */\r\n#include <stdint.h>\r\n\r\n/* Include standard boolean types */\r\n#include <stdbool.h>\r\n\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_PROTECTED_TYPE_IMPL\r\n * \\brief Based on a given base type, builds a return type with flow\r\n *        protection.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * \\see MCUX_CSSL_FP_FUNCTION_DEF_IMPL\r\n *\r\n * \\param resultType The type to be converted into a protected type.\r\n */\r\n#define MCUX_CSSL_FP_PROTECTED_TYPE_IMPL(resultType) \\\r\n  uint64_t\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_ENTRY_IMPLn\r\n * \\brief Flow protection handler implementation for the function entry point.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * Initialize the counter with the entry part of the function identifier, and\r\n * include expectations in the initialization value.\r\n *\r\n * \\see MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL\r\n *\r\n * \\param id     Identifier of the function that has just been entered.\r\n * \\param expect One or more (comma separated) declarations of expected code\r\n *               flow behavior.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_ENTRY_IMPLn(function, ...) \\\r\n  MCUX_CSSL_SC_INIT( \\\r\n    MCUX_CSSL_FP_FUNCTION_ID_ENTRY_PART(function) \\\r\n    - (MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__)) \\\r\n  )\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL1\r\n * \\brief Flow protection handler implementation for the function entry point.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * Initialize the counter with the entry part of the function identifier,\r\n * without any potential expectations.\r\n *\r\n * \\see MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL\r\n *\r\n * \\param id Identifier of the function that has just been entered.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL1(function) \\\r\n  MCUX_CSSL_FP_FUNCTION_ENTRY_IMPLn(function, 0u)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL\r\n * \\brief Flow protection handler implementation for the function entry point.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * Initialize the counter with entry part of the function identifier, and\r\n * include potential expectations in the initialization value.\r\n *\r\n * Implemented as an overloaded macro to simplify the use of the API.\r\n *\r\n * \\see MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL1\r\n * \\see MCUX_CSSL_FP_FUNCTION_ENTRY_IMPLn\r\n *\r\n * \\param id     Identifier of the function that has just been entered.\r\n * \\param expect Zero or more (comma separated) declarations of expected code\r\n *               flow behavior.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL(...) \\\r\n  MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_FUNCTION_ENTRY_IMPL, __VA_ARGS__)\r\n\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_EXIT_IMPLn\r\n * \\brief Flow protection handler implementation for the function exit point.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * Adjust the counter with the exit part of the function identifier, and\r\n * include potential expectations in the adjustment value. Return the counter\r\n * value together with the \\p result via the function return value.\r\n *\r\n * \\see MCUX_CSSL_FP_FUNCTION_EXIT_IMPL\r\n *\r\n * \\param id     Identifier of the function from which we will exit.\r\n * \\param result Result that should be encoded in the return value.\r\n * \\param expect One or more (comma separated) declarations of expected code\r\n *               flow behavior.\r\n * \\return       A value in which both \\p result and a flow protection token\r\n *               are encoded.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_EXIT_IMPLn(id, result, ...) \\\r\n  MCUX_CSSL_SC_ADD( \\\r\n    MCUX_CSSL_FP_FUNCTION_ID_EXIT_PART(id) \\\r\n    - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \\\r\n  ); \\\r\n  return (MCUX_CSSL_FP_RESULT_VALUE(result) \\\r\n    | MCUX_CSSL_FP_PROTECTION_TOKEN_VALUE(MCUX_CSSL_FP_COUNTER_COMPRESSED()))\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_EXIT_IMPL1\r\n * \\brief Flow protection handler implementation for the function exit point.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * Adjust the counter with the exit part of the function identifier, without\r\n * any potential expectations in the adjustment value. Return the counter value\r\n * via the function return value.\r\n *\r\n * \\see MCUX_CSSL_FP_FUNCTION_EXIT_IMPL\r\n *\r\n * \\param id Identifier of the function from which we will exit.\r\n * \\return   A value in which a flow protection token is encoded.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_EXIT_IMPL1(id) \\\r\n  MCUX_CSSL_FP_FUNCTION_EXIT_IMPLn(id, 0u, 0u)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_EXIT_IMPL2\r\n * \\brief Flow protection handler implementation for the function exit point.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * Adjust the counter with the exit part of the function identifier, without\r\n * any potential expectations in the adjustment value. Return the counter value\r\n * together with the \\p result via the function return value.\r\n *\r\n * \\see MCUX_CSSL_FP_FUNCTION_EXIT_IMPL\r\n *\r\n * \\param id     Identifier of the function from which we will exit.\r\n * \\param result Result that should be encoded in the return value.\r\n * \\return       A value in which both \\p result and a flow protection token\r\n *               are encoded.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_EXIT_IMPL2(id, result) \\\r\n  MCUX_CSSL_FP_FUNCTION_EXIT_IMPLn(id, result, 0u)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_EXIT_IMPL\r\n * \\brief Flow protection handler implementation for the function exit point.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * Adjust the counter with the exit part of the function identifier, and\r\n * include potential expectations in the adjustment value. Return the counter\r\n * value together with the \\p result via the function return value.\r\n *\r\n * Implemented as an overloaded macro to simplify the use of the API.\r\n *\r\n * \\see MCUX_CSSL_FP_FUNCTION_EXIT_IMPL1\r\n * \\see MCUX_CSSL_FP_FUNCTION_EXIT_IMPL2\r\n * \\see MCUX_CSSL_FP_FUNCTION_EXIT_IMPLn\r\n *\r\n * \\param id     Identifier of the function from which we will exit.\r\n * \\param result Result that should be encoded in the return value.\r\n * \\param expect Zero or more (comma separated) declarations of expected code\r\n *               flow behavior.\r\n * \\return       A value in which both \\p result and a flow protection token\r\n *               are encoded.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_EXIT_IMPL(...) \\\r\n  MCUX_CSSL_CPP_OVERLOADED2(MCUX_CSSL_FP_FUNCTION_EXIT_IMPL, __VA_ARGS__)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPLn\r\n * \\brief Flow protection handler implementation for the function exit point\r\n *        which includes an actual check of the code flow.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * Adjust the counter with the exit part of the function identifier, and\r\n * include potential expectations in the adjustment value. Check whether the\r\n * counter matches the expected value, and choose the result from \\p pass and\r\n * \\p fail and return it together with the counter value via the function\r\n * return value.\r\n *\r\n * \\see MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPL3\r\n * \\see MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPLn\r\n *\r\n * \\param id     Identifier of the function from which we will exit.\r\n * \\param pass   Result that should be encoded in the return value if the flow\r\n *               protection check passed.\r\n * \\param fail   Result that should be encoded in the return value if the flow\r\n *               protection check failed.\r\n * \\param expect One or more (comma separated) declarations of expected code\r\n *               flow behavior.\r\n * \\return       A value in which both the result (either \\p pass or \\p fail)\r\n *               and a flow protection token are encoded.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPLn(id, pass, fail, ...) \\\r\n  MCUX_CSSL_SC_ADD( \\\r\n    MCUX_CSSL_FP_FUNCTION_ID_EXIT_PART(id) \\\r\n    - MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__) \\\r\n  ); \\\r\n  return (MCUX_CSSL_FP_RESULT_VALUE( \\\r\n    (MCUX_CSSL_SC_CHECK_PASSED == \\\r\n        MCUX_CSSL_SC_CHECK(MCUX_CSSL_FP_FUNCTION_VALUE(id))) \\\r\n    ? pass : fail) \\\r\n    | MCUX_CSSL_FP_PROTECTION_TOKEN_VALUE(MCUX_CSSL_FP_COUNTER_COMPRESSED()))\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPL3\r\n * \\brief Flow protection handler implementation for the function exit point\r\n *        which includes an actual check of the code flow.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * Adjust the counter with the exit part of the function identifier. Check\r\n * whether the counter matches the expected value, and choose the result from\r\n * \\p pass and \\p fail and return it together with the counter value via the\r\n * function return value.\r\n *\r\n * \\see MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPL\r\n *\r\n * \\param id     Identifier of the function from which we will exit.\r\n * \\param pass   Result that should be encoded in the return value if the flow\r\n *               protection check passed.\r\n * \\param fail   Result that should be encoded in the return value if the flow\r\n *               protection check failed.\r\n * \\return       A value in which both the result (either \\p pass or \\p fail)\r\n *               and a flow protection token are encoded.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPL3(id, pass, fail) \\\r\n  MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPLn(id, pass, fail, 0u)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPL\r\n * \\brief Flow protection handler implementation for the function exit point\r\n *        which includes an actual check of the code flow.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * Adjust the counter with the exit part of the function identifier, and\r\n * include potential expectations in the adjustment value. Check whether the\r\n * counter matches the expected value, and choose the result from \\p pass and\r\n * \\p fail and return it together with the counter value via the function\r\n * return value.\r\n *\r\n * Implemented as an overloaded macro to simplify the use of the API.\r\n *\r\n * \\see MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPL3\r\n * \\see MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPLn\r\n *\r\n * \\param id     Identifier of the function from which we will exit.\r\n * \\param pass   Result that should be encoded in the return value if the flow\r\n *               protection check passed.\r\n * \\param fail   Result that should be encoded in the return value if the flow\r\n *               protection check failed.\r\n * \\param expect Zero or more (comma separated) declarations of expected code\r\n *               flow behavior.\r\n * \\return       A value in which both the result (either \\p pass or \\p fail)\r\n *               and a flow protection token are encoded.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPL(...) \\\r\n  MCUX_CSSL_CPP_OVERLOADED3(MCUX_CSSL_FP_FUNCTION_EXIT_WITH_CHECK_IMPL, __VA_ARGS__)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPL1\r\n * \\brief Flow protection handler for the exit point of functions with the\r\n *        return type \\c void.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * \\param id     Identifier of the function from which we will exit.\r\n * \\return       A protected return value of type void.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPL1(id) \\\r\n  MCUX_CSSL_FP_FUNCTION_EXIT_IMPL(id, 0U)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPL2\r\n * \\brief Flow protection handler for the exit point of functions with the\r\n *        return type \\c void.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * \\param id     Identifier of the function from which we will exit.\r\n * \\param expect One or more (comma separated) declarations of expected code\r\n *               flow behavior.\r\n * \\return       A protected return value of type void.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPLn(id, ...) \\\r\n  MCUX_CSSL_FP_FUNCTION_EXIT_IMPL(id, 0U, __VA_ARGS__)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPL\r\n * \\brief Flow protection handler for the exit point of functions with the\r\n *        return type \\c void.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * \\param id     Identifier of the function from which we will exit.\r\n * \\param expect Zero or more (comma separated) declarations of expected code\r\n *               flow behavior.\r\n * \\return       A protected return value of type void.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPL(...) \\\r\n  MCUX_CSSL_CPP_OVERLOADED1(MCUX_CSSL_FP_FUNCTION_EXIT_VOID_IMPL, __VA_ARGS__)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_CALL_IMPL3\r\n * \\brief Event implementation of a flow protected function call.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * \\param type   Type of the \\p result variable.\r\n * \\param result Fresh variable name to store the result of \\p call.\r\n * \\param call   The (protected) function call that must be performed.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_CALL_IMPL3(type, result, call) \\\r\n  const uint64_t MCUX_CSSL_CPP_CAT(result, _protected) = (call); \\\r\n  MCUX_CSSL_SC_ADD_ON_CALL( \\\r\n    MCUX_CSSL_FP_PROTECTION_TOKEN(MCUX_CSSL_CPP_CAT(result, _protected))); \\\r\n  type const result = MCUX_CSSL_FP_RESULT(type, \\\r\n    MCUX_CSSL_CPP_CAT(result, _protected))\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_CALL_IMPL2\r\n * \\brief Event implementation of a flow protected function call.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * \\param result Fresh variable name to store the result of \\p call.\r\n * \\param call   The (protected) function call that must be performed.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_CALL_IMPL2(result, call) \\\r\n  MCUX_CSSL_FP_FUNCTION_CALL_IMPL3(uint32_t, result, call)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_CALL_IMPL\r\n * \\brief Event implementation of a flow protected function call.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * \\declaration{MCUX_CSSL_FP_FUNCTION_DECL_IMPL}\r\n * \\expectation{MCUX_CSSL_FP_FUNCTION_CALLED_IMPL}\r\n *\r\n * \\param type   Optional, type of the \\p result variable.\r\n * \\param result Fresh variable name to store the result of \\p call.\r\n * \\param call   The (protected) function call that must be performed.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_CALL_IMPL(...) \\\r\n  MCUX_CSSL_CPP_OVERLOADED3(MCUX_CSSL_FP_FUNCTION_CALL_IMPL, __VA_ARGS__)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_CALL_VOID_IMPL\r\n * \\brief Event implementation of a flow protected void function call.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n * \\declaration{MCUX_CSSL_FP_FUNCTION_DECL_IMPL}\r\n * \\expectation{MCUX_CSSL_FP_FUNCTION_CALLED_IMPL}\r\n *\r\n * \\param call   The (protected) function call that must be performed.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_CALL_VOID_IMPL(call) \\\r\n  { \\\r\n  const uint64_t MCUX_CSSL_CPP_CAT(result, _protected) = (call); \\\r\n  MCUX_CSSL_SC_ADD_ON_CALL( \\\r\n    MCUX_CSSL_FP_PROTECTION_TOKEN(MCUX_CSSL_CPP_CAT(result, _protected))); \\\r\n  }\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_CALL_PROTECTED_IMPL\r\n * \\brief Implementation of a flow protected function call meant to be used\r\n *        from within an unprotected function\r\n * \\ingroup csslFpCntFunction\r\n *\r\n *\r\n * \\param result Fresh variable name to store the result of \\p call.\r\n * \\param token  Fresh variable name to store the protection token of \\p call.\r\n * \\param call   The (protected) function call that must be performed.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_CALL_PROTECTED_IMPL(result, token, call) \\\r\n  const uint64_t MCUX_CSSL_CPP_CAT(result, _protected) = (call); \\\r\n  const uint32_t token = MCUX_CSSL_FP_PROTECTION_TOKEN( \\\r\n    MCUX_CSSL_CPP_CAT(result, _protected)); \\\r\n  const uint32_t result = MCUX_CSSL_FP_RESULT( \\\r\n    MCUX_CSSL_CPP_CAT(result, _protected))\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_CALL_VOID_PROTECTED_IMPL\r\n * \\brief Implementation of a flow protected void function call meant to be\r\n *        used from within an unprotected function\r\n * \\ingroup csslFpCntFunction\r\n *\r\n *\r\n * \\param token  Fresh variable name to store the protection token of \\p call.\r\n * \\param call   The (protected) function call that must be performed.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_CALL_VOID_PROTECTED_IMPL(token, call) \\\r\n  const uint64_t MCUX_CSSL_CPP_CAT(token, _protected) = (call); \\\r\n  const uint32_t token = MCUX_CSSL_FP_PROTECTION_TOKEN( \\\r\n    MCUX_CSSL_CPP_CAT(token, _protected));\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_CALL_BEGIN_IMPL\r\n * \\brief Implementation of a flow protected function call meant to be used\r\n *        from within an unprotected function, that must be terminated by\r\n *        #MCUX_CSSL_FP_FUNCTION_CALL_END_IMPL.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n *\r\n * \\param result Fresh variable name to store the result of \\p call.\r\n * \\param token  Fresh variable name to store the protection token of \\p call.\r\n * \\param call   The (protected) function call that must be performed.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_CALL_BEGIN_IMPL(result, token, call)   \\\r\ndo                                                                  \\\r\n{                                                                   \\\r\n    MCUX_CSSL_FP_FUNCTION_CALL_PROTECTED_IMPL(result, token, call)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_CALL_END_IMPL\r\n * \\brief Implementation of the end of a section started by\r\n * #MCUX_CSSL_FP_FUNCTION_CALL_BEGIN_IMPL.\r\n * \\ingroup csslFpCntFunction\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_CALL_END_IMPL() \\\r\n} while (false)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_CALL_VOID_BEGIN_IMPL\r\n * \\brief Implementation of a flow protected void function call meant to be used\r\n *        from within an unprotected function, that must be terminated by\r\n *        #MCUX_CSSL_FP_FUNCTION_CALL_VOID_END_IMPL.\r\n * \\ingroup csslFpCntFunction\r\n *\r\n *\r\n * \\param token  Fresh variable name to store the protection token of \\p call.\r\n * \\param call   The (protected) function call that must be performed.\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_CALL_VOID_BEGIN_IMPL(token, call)   \\\r\ndo                                                                  \\\r\n{                                                                   \\\r\n    MCUX_CSSL_FP_FUNCTION_CALL_VOID_PROTECTED_IMPL(token, call)\r\n\r\n/**\r\n * \\def MCUX_CSSL_FP_FUNCTION_CALL_VOID_END_IMPL\r\n * \\brief Implementation of the end of a section started by\r\n * #MCUX_CSSL_FP_FUNCTION_CALL_VOID_BEGIN_IMPL.\r\n * \\ingroup csslFpCntFunction\r\n */\r\n#define MCUX_CSSL_FP_FUNCTION_CALL_VOID_END_IMPL() \\\r\n} while (false)\r\n\r\n/**\r\n * @def MCUX_CSSL_FP_ASSERT_IMPL\r\n * @brief Assert an expected state of the code flow.\r\n * @api\r\n * @ingroup csslFpCntExpect\r\n *\r\n * This macro can be used to check whether the code flow up to this point\r\n * matches the expected state. Unlike the #MCUX_CSSL_FP_EXPECT macro, it will\r\n * not update the expectations, but merely perform a check on the recorded\r\n * events against the already recorded expectations plus the ones provided as\r\n * parameters.\r\n *\r\n * If the check fails, the code defined in MCUX_CSSL_FP_ASSERT_CALLBACK will be\r\n * executed.\r\n *\r\n * \\see MCUX_CSSL_FP_EXPECTATIONS\r\n *\r\n * \\param expect One or more (comma separated) declarations of expected code\r\n *               flow behavior.\r\n */\r\n#define MCUX_CSSL_FP_ASSERT_IMPL(...) \\\r\n  if (MCUX_CSSL_SC_CHECK_PASSED != \\\r\n        MCUX_CSSL_SC_CHECK(MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__))) \\\r\n  { \\\r\n    MCUX_CSSL_FP_ASSERT_CALLBACK(); \\\r\n  } \\\r\n  else if (MCUX_CSSL_SC_CHECK_PASSED != \\\r\n        MCUX_CSSL_SC_CHECK(MCUX_CSSL_FP_EXPECTATIONS(__VA_ARGS__))) \\\r\n  { \\\r\n    MCUX_CSSL_FP_ASSERT_CALLBACK(); \\\r\n  } \\\r\n  else {/*empty*/}\r\n\r\n#endif /* MCUX_CSSL_FLOW_PROTECTION_SECURE_COUNTER_LOCAL_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslMemory/inc/internal/mcuxCsslMemory_Internal_Compare_asm.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2021-2022 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxCsslMemory_Internal_Compare_asm.h\r\n * @brief Internal header of mcuxCsslMemory_Compare inline-asm macro\r\n */\r\n\r\n\r\n#ifndef MCUXCSSLMEMORY_INTERNAL_COMPARE_ASM_H_\r\n#define MCUXCSSLMEMORY_INTERNAL_COMPARE_ASM_H_\r\n\r\n#include <stdint.h>\r\n#include <stdbool.h>\r\n\r\n\r\n#if defined(__ghs__) || defined( __ICCARM__ ) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) || defined(__GNUC__)\r\n\r\n\r\n#define MCUXCSSLMEMORY_COMPARE_ASM_COMPARISON(retval_, cur_lhs_, cur_rhs_, nwords_, cnt_, notValid_, result_) \\\r\ndo{  \\\r\n    uint32_t dat_lhs, dat_rhs;  \\\r\n    __asm volatile (  \\\r\n        \"EOR    %[_retval], %[_result], %[_notValid]\\n\" /* retval should now be 0xFFFFFFFF */\\\r\n        \"LSRS   %[_nwords], %[_cnt], #2\\n\"                \\\r\n        \"CMP    %[_nwords], #0\\n\"                         \\\r\n        \"BGT    mcuxCsslMemory_Compare_word_loop\\n\"        \\\r\n        \"BEQ    mcuxCsslMemory_Compare_word_loop_end\\n\"    \\\r\n        \"B      mcuxCsslMemory_Compare_fault\\n\"            \\\r\n        \"mcuxCsslMemory_Compare_word_loop:\\n\"              \\\r\n        \"LDR    %[_dat_lhs], [%[_cur_lhs]], #+4\\n\"        \\\r\n        \"LDR    %[_dat_rhs], [%[_cur_rhs]], #+4\\n\"        \\\r\n        \"SUBS   %[_cnt], %[_cnt], #+4\\n\"                  \\\r\n        \"EORS   %[_dat_lhs], %[_dat_lhs], %[_dat_rhs]\\n\"  \\\r\n        \"BICS   %[_retval], %[_retval], %[_dat_lhs]\\n\"    \\\r\n        \"SUBS   %[_nwords], %[_nwords], #+1\\n\"            \\\r\n        \"MVN    %[_dat_rhs], %[_dat_lhs]\\n\"               \\\r\n        \"AND    %[_retval], %[_retval], %[_dat_rhs]\\n\"    \\\r\n        \"BNE     mcuxCsslMemory_Compare_word_loop\\n\"       \\\r\n        \"mcuxCsslMemory_Compare_word_loop_end:\\n\"          \\\r\n        \"MOVS   %[_dat_lhs], #0\\n\"                        \\\r\n        \"MOVS   %[_dat_rhs], #0\\n\"                        \\\r\n        \"CMP    %[_cnt], #0\\n\"                            \\\r\n        \"BGT    mcuxCsslMemory_Compare_byte_loop\\n\"        \\\r\n        \"BEQ    mcuxCsslMemory_Compare_fault\\n\"            \\\r\n        \"mcuxCsslMemory_Compare_byte_loop:\\n\"              \\\r\n        \"LDRB   %[_dat_lhs], [%[_cur_lhs]], #+1\\n\"        \\\r\n        \"LDRB   %[_dat_rhs], [%[_cur_rhs]], #+1\\n\"        \\\r\n        \"EORS   %[_dat_lhs], %[_dat_lhs], %[_dat_rhs]\\n\"  \\\r\n        \"BICS   %[_retval], %[_retval], %[_dat_lhs]\\n\"    \\\r\n        \"SUBS   %[_cnt], %[_cnt], #+1\\n\"                  \\\r\n        \"MVN    %[_dat_rhs], %[_dat_lhs]\\n\"               \\\r\n        \"AND    %[_retval], %[_retval], %[_dat_rhs]\\n\"    \\\r\n        \"BNE    mcuxCsslMemory_Compare_byte_loop\\n\"        \\\r\n        \"mcuxCsslMemory_Compare_fault:\\n\"                  \\\r\n        : [_retval] \"=r\" (retval_),    \\\r\n          [_cur_lhs] \"+r\" (cur_lhs_),  \\\r\n          [_cur_rhs] \"+r\" (cur_rhs_),  \\\r\n          [_cnt] \"+r\" (cnt_),          \\\r\n          [_nwords] \"+r\" (nwords_),    \\\r\n          [_dat_lhs] \"=r\" (dat_lhs),   \\\r\n          [_dat_rhs] \"=r\" (dat_rhs)    \\\r\n        : [_notValid] \"r\" (notValid_), \\\r\n          [_result] \"r\" (result_)      \\\r\n    );  \\\r\n    (void)dat_lhs;  \\\r\n    (void)dat_rhs;  \\\r\n    (void)cnt_;     \\\r\n    (void)notValid_;  \\\r\n}while(false)\r\n\r\n\r\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION < 6010050)\r\n#define MCUXCSSLMEMORY_COMPARE_ASM_COMPARISON(retval_, cur_lhs_, cur_rhs_, nwords_, cnt_, notValid_, result_) \\\r\ndo{  \\\r\n    uint32_t dat_lhs, dat_rhs;  \\\r\n    __asm {  \\\r\n        EOR    retval_, result_, notValid_;  \\\r\n        LSRS   nwords_, cnt_, 2;  \\\r\n        CMP    nwords_, 0;  \\\r\n        BGT    mcuxCsslMemory_Compare_word_loop;  \\\r\n        BEQ    mcuxCsslMemory_Compare_word_loop_end;  \\\r\n        B      mcuxCsslMemory_Compare_fault;  \\\r\nmcuxCsslMemory_Compare_word_loop:  \\\r\n        LDR    dat_lhs, [cur_lhs_], +4;  \\\r\n        LDR    dat_rhs, [cur_rhs_], +4;  \\\r\n        SUBS   cnt_, cnt_, 4;  \\\r\n        EORS   dat_lhs, dat_lhs, dat_rhs;  \\\r\n        BICS   retval_, retval_, dat_lhs;  \\\r\n        SUBS   nwords_, nwords_, 1;  \\\r\n        MVN    dat_rhs, dat_lhs;  \\\r\n        AND    retval_, retval_, dat_rhs;  \\\r\n        BNE    mcuxCsslMemory_Compare_word_loop;  \\\r\nmcuxCsslMemory_Compare_word_loop_end:  \\\r\n        MOVS   dat_lhs, 0;  \\\r\n        MOVS   dat_rhs, 0;  \\\r\n        CMP    cnt_, 0;  \\\r\n        BGT    mcuxCsslMemory_Compare_byte_loop;  \\\r\n        BEQ    mcuxCsslMemory_Compare_fault;  \\\r\nmcuxCsslMemory_Compare_byte_loop:  \\\r\n        LDRB   dat_lhs, [cur_lhs_], +1;  \\\r\n        LDRB   dat_rhs, [cur_rhs_], +1;  \\\r\n        EORS   dat_lhs, dat_lhs, dat_rhs;  \\\r\n        BICS   retval_, retval_, dat_lhs;  \\\r\n        SUBS   cnt_, cnt_, 1;  \\\r\n        MVN    dat_rhs, dat_lhs;  \\\r\n        AND    retval_, retval_, dat_rhs;  \\\r\n        BNE    mcuxCsslMemory_Compare_byte_loop;  \\\r\nmcuxCsslMemory_Compare_fault:  \\\r\n    }  \\\r\n    (void)dat_lhs;  \\\r\n    (void)dat_rhs;  \\\r\n    (void)cnt_;  \\\r\n    (void)notValid_;  \\\r\n}while(false)\r\n\r\n#else\r\n    #error Unsupported compiler. The above section must be manually adapted to support your compiler inline assembly syntax.\r\n#endif\r\n\r\n\r\n/* If the binary representation of retval contains a zero,\r\n * this sequence of instructions will turn retval to zero completely.\r\n * If retval is 0xFFFFFFFF, it will remain untouched.\r\n */\r\n#if defined(__ghs__) || defined( __ICCARM__ ) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)) || defined(__GNUC__)\r\n#define MCUXCSSLMEMORY_COMPARE_ASM_CALC_RETVAL(retval_, errCode_)  \\\r\ndo{  \\\r\n    __asm volatile (  \\\r\n        \"and %[_retval], %[_retval], %[_retval], ror  #1\\n\"  \\\r\n        \"and %[_retval], %[_retval], %[_retval], ror  #2\\n\"  \\\r\n        \"and %[_retval], %[_retval], %[_retval], ror  #4\\n\"  \\\r\n        \"and %[_retval], %[_retval], %[_retval], ror  #8\\n\"  \\\r\n        \"and %[_retval], %[_retval], %[_retval], ror #16\\n\"  \\\r\n        \"eor %[_retval], %[_retval], %[_errCode]\\n\"  \\\r\n        : [_retval] \"+r\" (retval_)  \\\r\n        : [_errCode] \"r\" (errCode_)  \\\r\n    );  \\\r\n    (void)errCode_;  \\\r\n}while(false)\r\n\r\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION < 6010050)\r\n#define MCUXCSSLMEMORY_COMPARE_ASM_CALC_RETVAL(retval_, errCode_)  \\\r\ndo{  \\\r\n    __asm {  \\\r\n        AND retval_, retval_, retval_, ror 1;  \\\r\n        AND retval_, retval_, retval_, ror 2;  \\\r\n        AND retval_, retval_, retval_, ror 4;  \\\r\n        AND retval_, retval_, retval_, ror 8;  \\\r\n        AND retval_, retval_, retval_, ror 16;  \\\r\n        EOR retval_, retval_, errCode_;  \\\r\n    }  \\\r\n    (void)errCode_;  \\\r\n}while(false)\r\n\r\n#else\r\n    #error Unsupported compiler. The above section must be manually adapted to support your compiler inline assembly syntax.\r\n#endif\r\n\r\n\r\n#endif /* MCUXCSSLMEMORY_INTERNAL_COMPARE_ASM_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslMemory/inc/internal/mcuxCsslMemory_Internal_Copy_asm.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2021-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxCsslMemory_Internal_Copy_asm.h\r\n * @brief Internal header of mcuxCsslMemory_Copy inline-asm macro\r\n */\r\n\r\n\r\n#ifndef MCUXCSSLMEMORY_INTERNAL_COPY_ASM_H_ \r\n#define MCUXCSSLMEMORY_INTERNAL_COPY_ASM_H_ \r\n\r\n\r\n#if defined( __ICCARM__ ) || (defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050))\r\n#define MCUXCSSLMEMORY_COPY_ASM(word, byte, cha, chb, xorword, retval, datareg, src, dst, nwords, cnt, success)  \\\r\ndo{  \\\r\n    __asm (  \\\r\n        \"MOV    %[_word], #0\\n\"  \\\r\n        \"MOV    %[_datareg], #0\\n\"  \\\r\n        \"MOV    %[_xorword], #0\\n\"  \\\r\n        \"CMP    %[_word], %[_nwords]\\n\"  \\\r\n        \"BLT    mcuxCsslMemory_Copy_word_loop\\n\"  \\\r\n        \"BGE    mcuxCsslMemory_Copy_word_loop_end\\n\"  \\\r\n        \"B      mcuxCsslMemory_Copy_fault\\n\"  \\\r\n        \"mcuxCsslMemory_Copy_word_loop:\\n\"  \\\r\n        \"LDR    %[_datareg], [%[_src], %[_word], LSL #2]\\n\"  \\\r\n        \"EORS   %[_cha], %[_cha], %[_datareg]\\n\"  \\\r\n        \"STR    %[_datareg], [%[_dst], %[_word], LSL #2]\\n\"  \\\r\n        \"EORS   %[_chb], %[_chb], %[_datareg]\\n\"  \\\r\n        \"ADDS   %[_word], %[_word], #+1\\n\"  \\\r\n        \"EORS   %[_xorword], %[_xorword], %[_word]\\n\"  \\\r\n        \"CMP    %[_word], %[_nwords]\\n\"  \\\r\n        \"BLT    mcuxCsslMemory_Copy_word_loop\\n\"  \\\r\n        \"mcuxCsslMemory_Copy_word_loop_end:\\n\"  \\\r\n        \"LSLS   %[_byte], %[_word], #2\\n\"  \\\r\n        \"MOV    %[_datareg], #0\\n\"  \\\r\n        \"CMP    %[_byte], %[_nbytes]\\n\"  \\\r\n        \"BLT    mcuxCsslMemory_Copy_byte_loop\\n\"  \\\r\n        \"BGE    mcuxCsslMemory_Copy_byte_loop_end\\n\"  \\\r\n        \"B      mcuxCsslMemory_Copy_fault\\n\"  \\\r\n        \"mcuxCsslMemory_Copy_byte_loop:\\n\"  \\\r\n        \"LDRB   %[_datareg], [%[_src], %[_byte]]\\n\"  \\\r\n        \"EORS   %[_cha], %[_cha], %[_datareg]\\n\"  \\\r\n        \"STRB   %[_datareg], [%[_dst], %[_byte]]\\n\"  \\\r\n        \"EORS   %[_chb], %[_chb], %[_datareg]\\n\"  \\\r\n        \"ADDS   %[_byte], %[_byte], #+1\\n\"  \\\r\n        \"CMP    %[_byte], %[_nbytes]\\n\"  \\\r\n        \"BLT    mcuxCsslMemory_Copy_byte_loop\\n\"  \\\r\n        \"mcuxCsslMemory_Copy_byte_loop_end:\\n\"  \\\r\n        \"MOV    %[_datareg], #0\\n\"  \\\r\n        \"EORS   %[_retval], %[_retval], %[_success]\\n\"  \\\r\n        \"mcuxCsslMemory_Copy_fault:\\n\"  \\\r\n        : [_word] \"+&r\" (word)  \\\r\n        , [_byte] \"+&r\" (byte)  \\\r\n        , [_cha] \"+&r\" (cha)  \\\r\n        , [_chb] \"+&r\" (chb)  \\\r\n        , [_xorword] \"+&r\" (xorword)  \\\r\n        , [_retval] \"+r\" (retval)  \\\r\n        , [_datareg] \"+&r\" (datareg)  \\\r\n        : [_src] \"r\" (src)  \\\r\n        , [_dst] \"r\" (dst)  \\\r\n        , [_nwords] \"r\" (nwords)  \\\r\n        , [_nbytes] \"r\" (cnt)  \\\r\n        , [_success] \"r\" (success)  \\\r\n        : \"cc\", \"memory\"  \\\r\n    );  \\\r\n    (void)datareg;  \\\r\n    (void)success;  \\\r\n}while(false)\r\n\r\n#elif defined (__ghs__)\r\n#define MCUXCSSLMEMORY_COPY_ASM(word, byte, cha, chb, xorword, retval, datareg, src, dst, nwords, cnt, success)  \\\r\ndo{  \\\r\n    /* GHS compiler can only handle 10 registers for the usecase of this inline asm block. */  \\\r\n    /* Store retval and success in registers of word and datareg. */  \\\r\n    (word) = (retval);  \\\r\n    (datareg) = (success);    \\\r\n    __asm (  \\\r\n        /* store retval and success on stack. */  \\\r\n        \"SUB    sp, #8\\n\"  \\\r\n        \"STR    %[_word], [sp, #0]\\n\"  \\\r\n        \"STR    %[_datareg], [sp, #4]\\n\"  \\\r\n        /* original asm macro. */  \\\r\n        \"MOV    %[_word], #0\\n\"  \\\r\n        \"MOV    %[_datareg], #0\\n\"  \\\r\n        \"MOV    %[_xorword], #0\\n\"  \\\r\n        \"CMP    %[_word], %[_nwords]\\n\"  \\\r\n        \"BLT    mcuxCsslMemory_Copy_word_loop\\n\"  \\\r\n        \"BGE    mcuxCsslMemory_Copy_word_loop_end\\n\"  \\\r\n        \"B      mcuxCsslMemory_Copy_fault\\n\"  \\\r\n        \"mcuxCsslMemory_Copy_word_loop:\\n\"  \\\r\n        \"LDR    %[_datareg], [%[_src], %[_word], LSL #2]\\n\"  \\\r\n        \"EORS   %[_cha], %[_cha], %[_datareg]\\n\"  \\\r\n        \"STR    %[_datareg], [%[_dst], %[_word], LSL #2]\\n\"  \\\r\n        \"EORS   %[_chb], %[_chb], %[_datareg]\\n\"  \\\r\n        \"ADDS   %[_word], %[_word], #+1\\n\"  \\\r\n        \"EORS   %[_xorword], %[_xorword], %[_word]\\n\"  \\\r\n        \"CMP    %[_word], %[_nwords]\\n\"  \\\r\n        \"BLT    mcuxCsslMemory_Copy_word_loop\\n\"  \\\r\n        \"mcuxCsslMemory_Copy_word_loop_end:\\n\"  \\\r\n        \"LSLS   %[_byte], %[_word], #2\\n\"  \\\r\n        \"MOV    %[_datareg], #0\\n\"  \\\r\n        \"CMP    %[_byte], %[_nbytes]\\n\"  \\\r\n        \"BLT    mcuxCsslMemory_Copy_byte_loop\\n\"  \\\r\n        \"BGE    mcuxCsslMemory_Copy_byte_loop_end\\n\"  \\\r\n        \"B      mcuxCsslMemory_Copy_fault\\n\"  \\\r\n        \"mcuxCsslMemory_Copy_byte_loop:\\n\"  \\\r\n        \"LDRB   %[_datareg], [%[_src], %[_byte]]\\n\"  \\\r\n        \"EORS   %[_cha], %[_cha], %[_datareg]\\n\"  \\\r\n        \"STRB   %[_datareg], [%[_dst], %[_byte]]\\n\"  \\\r\n        \"EORS   %[_chb], %[_chb], %[_datareg]\\n\"  \\\r\n        \"ADDS   %[_byte], %[_byte], #+1\\n\"  \\\r\n        \"CMP    %[_byte], %[_nbytes]\\n\"  \\\r\n        \"BLT    mcuxCsslMemory_Copy_byte_loop\\n\"  \\\r\n        \"mcuxCsslMemory_Copy_byte_loop_end:\\n\"  \\\r\n        /* load retval and success from stack. */  \\\r\n        \"LDR    %[_datareg], [sp, #0]\\n\"  \\\r\n        /* use byte as temp. */  \\\r\n        \"STR    %[_byte], [sp, #0]\\n\"  \\\r\n        \"LDR    %[_byte], [sp, #4]\\n\"  \\\r\n        /* set datareg = retval ^ success, instead of datareg = 0 in the original design. */  \\\r\n        \"EORS   %[_datareg], %[_datareg], %[_byte]\\n\"  \\\r\n        \"LDR    %[_byte], [sp, #0]\\n\"  \\\r\n        \"mcuxCsslMemory_Copy_fault:\\n\"  \\\r\n        \"ADD    sp, #8\\n\"  \\\r\n        : [_word] \"+&r\" (word)  \\\r\n        , [_byte] \"+&r\" (byte)  \\\r\n        , [_cha] \"+&r\" (cha)  \\\r\n        , [_chb] \"+&r\" (chb)  \\\r\n        , [_xorword] \"+&r\" (xorword)  \\\r\n        , [_datareg] \"+&r\" (datareg)  \\\r\n        : [_src] \"r\" (src)  \\\r\n        , [_dst] \"r\" (dst)  \\\r\n        , [_nwords] \"r\" (nwords)  \\\r\n        , [_nbytes] \"r\" (cnt)  \\\r\n        : \"cc\", \"memory\"  \\\r\n    );  \\\r\n    (retval) = (datareg);  \\\r\n}while(false)\r\n\r\n#elif defined (__GNUC__)\r\n#define MCUXCSSLMEMORY_COPY_SUCCESS_IMPL ((uint32_t)MCUXCSSLMEMORY_STATUS_OK ^ (uint32_t)MCUXCSSLMEMORY_STATUS_FAULT)\r\n#define MCUXCSSLMEMORY_COPY_DST_STACK_OFFSET (0)\r\n#define MCUXCSSLMEMORY_COPY_SRC_STACK_OFFSET (4)\r\n#define MCUXCSSLMEMORY_COPY_RETVAL_STACK_OFFSET (8)\r\n#define MCUXCSSLMEMORY_COPY_CNT_STACK_OFFSET (12)\r\n#define MCUXCSSLMEMORY_COPY_ASM(word, byte, cha, chb, xorword, retval, datareg, src, dst, nwords, cnt, success)  \\\r\ndo{  \\\r\n    /* [DESIGN]\r\n     * GNU compiler can only handle 7 registers for the usecase of this inline asm block, when building with optimization level 0.\r\n     * Thus, 5 registers need to be saved compared to the original asm macro.\r\n     * success is a constant, so it is defined as an immediatte instead of an input register.\r\n     * 4 registers can be used as temporary registers to push data to the stack: store retval, cnt, src, dst in registers of word, datareg, xorword, byte. */  \\\r\n    uint32_t nwords_cnt = (nwords);  \\\r\n    (word) = (retval);  \\\r\n    (datareg) = (cnt);    \\\r\nMCUX_CSSL_ANALYSIS_START_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER(\"Typecast needed for specialized assembly routine\") \\\r\n    (xorword) = (uint32_t)(src);  \\\r\n    (byte) = (uint32_t)(dst);    \\\r\nMCUX_CSSL_ANALYSIS_STOP_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER() \\\r\n    __asm (  \\\r\n        /* [DESIGN] store retval, success, src, dst on stack. */  \\\r\n        \"SUB    sp, #16\\n\"  \\\r\n        \"STR    %[_word], [sp, %[_RETVAL_OFFSET]]\\n\"  \\\r\n        \"STR    %[_datareg], [sp, %[_CNT_OFFSET]]\\n\"  \\\r\n        \"STR    %[_byte], [sp, %[_DST_OFFSET]]\\n\"  \\\r\n        \"STR    %[_xorword], [sp, %[_SRC_OFFSET]]\\n\" \\\r\n        /* [DESIGN] original asm macro. */  \\\r\n        \"MOV    %[_word], #0\\n\"  \\\r\n        \"MOV    %[_datareg], #0\\n\"  \\\r\n        \"MOV    %[_xorword], #0\\n\"  \\\r\n        \"CMP    %[_word], %[_nwords_cnt]\\n\"  \\\r\n        \"BLT    mcuxCsslMemory_Copy_word_loop\\n\"  \\\r\n        \"BGE    mcuxCsslMemory_Copy_word_loop_end\\n\"  \\\r\n        \"B      mcuxCsslMemory_Copy_fault\\n\"  \\\r\n        \"mcuxCsslMemory_Copy_word_loop:\\n\"  \\\r\n        /* [DESIGN] get src from the stack, _datareg is used as a temporary register */ \\\r\n        \"LDR    %[_datareg], [sp, %[_SRC_OFFSET]]\\n\"  \\\r\n        \"LDR    %[_datareg], [%[_datareg], %[_word], LSL #2]\\n\"  \\\r\n        \"EORS   %[_cha], %[_cha], %[_datareg]\\n\"  \\\r\n        /* [DESIGN] _byte already contains the value of dst */ \\\r\n        \"STR    %[_datareg], [%[_byte], %[_word], LSL #2]\\n\"  \\\r\n        \"EORS   %[_chb], %[_chb], %[_datareg]\\n\"  \\\r\n        \"ADDS   %[_word], %[_word], #+1\\n\"  \\\r\n        \"EORS   %[_xorword], %[_xorword], %[_word]\\n\"  \\\r\n        \"CMP    %[_word], %[_nwords_cnt]\\n\"  \\\r\n        \"BLT    mcuxCsslMemory_Copy_word_loop\\n\"  \\\r\n        \"mcuxCsslMemory_Copy_word_loop_end:\\n\"  \\\r\n        \"LSLS   %[_byte], %[_word], #2\\n\"  \\\r\n        \"MOV    %[_datareg], #0\\n\"  \\\r\n        \"LDR    %[_nwords_cnt], [sp, %[_CNT_OFFSET]]\\n\"  \\\r\n        /* [DESIGN] store word to the stack, at the offset of cnt which is not needed on stack anymore */  \\\r\n        \"STR    %[_word], [sp, %[_CNT_OFFSET]]\\n\"  \\\r\n        /* [DESIGN] get dst from the stack, _word is used as a temporary register */ \\\r\n        \"LDR    %[_word], [sp, %[_DST_OFFSET]]\\n\"  \\\r\n        \"CMP    %[_byte], %[_nwords_cnt]\\n\"  \\\r\n        \"BLT    mcuxCsslMemory_Copy_byte_loop\\n\"  \\\r\n        \"BGE    mcuxCsslMemory_Copy_byte_loop_end\\n\"  \\\r\n        \"B      mcuxCsslMemory_Copy_fault\\n\"  \\\r\n        \"mcuxCsslMemory_Copy_byte_loop:\\n\"  \\\r\n        /* [DESIGN] get src from the stack, _datareg is used as a temporary register */ \\\r\n        \"LDR    %[_datareg], [sp, %[_SRC_OFFSET]]\\n\"  \\\r\n        \"LDRB   %[_datareg], [%[_datareg], %[_byte]]\\n\"  \\\r\n        \"EORS   %[_cha], %[_cha], %[_datareg]\\n\"  \\\r\n        /* [DESIGN] _word already contains the value of dst */ \\\r\n        \"STRB   %[_datareg], [%[_word], %[_byte]]\\n\"  \\\r\n        \"EORS   %[_chb], %[_chb], %[_datareg]\\n\"  \\\r\n        \"ADDS   %[_byte], %[_byte], #+1\\n\"  \\\r\n        \"CMP    %[_byte], %[_nwords_cnt]\\n\"  \\\r\n        \"BLT    mcuxCsslMemory_Copy_byte_loop\\n\"  \\\r\n        \"mcuxCsslMemory_Copy_byte_loop_end:\\n\"  \\\r\n        /* [DESIGN] load retval from stack. */  \\\r\n        \"LDR    %[_datareg], [sp, %[_RETVAL_OFFSET]]\\n\"  \\\r\n        /* [DESIGN] use _byte as temp. */  \\\r\n        \"STR    %[_byte], [sp, %[_RETVAL_OFFSET]]\\n\"  \\\r\n        \"LDR    %[_byte], =%[_SUCCESS]\\n\"  \\\r\n        /* [DESIGN] set datareg = retval ^ success, instead of datareg = 0 in the original design. */  \\\r\n        \"EORS   %[_datareg], %[_datareg], %[_byte]\\n\"  \\\r\n        \"LDR    %[_byte], [sp, %[_RETVAL_OFFSET]]\\n\"  \\\r\n        \"LDR    %[_word], [sp, %[_CNT_OFFSET]]\\n\"  \\\r\n        \"mcuxCsslMemory_Copy_fault:\\n\"  \\\r\n        \"ADD    sp, #16\\n\"  \\\r\n        : [_word] \"+&r\" (word)  \\\r\n        , [_byte] \"+&r\" (byte)  \\\r\n        , [_cha] \"+&r\" (cha)  \\\r\n        , [_chb] \"+&r\" (chb)  \\\r\n        , [_xorword] \"+&r\" (xorword)  \\\r\n        , [_datareg] \"+&r\" (datareg)  \\\r\n        , [_nwords_cnt] \"+&r\" (nwords_cnt)  \\\r\n        : [_SUCCESS] \"i\" MCUXCSSLMEMORY_COPY_SUCCESS_IMPL \\\r\n        , [_DST_OFFSET] \"i\" MCUXCSSLMEMORY_COPY_DST_STACK_OFFSET \\\r\n        , [_SRC_OFFSET] \"i\" MCUXCSSLMEMORY_COPY_SRC_STACK_OFFSET \\\r\n        , [_RETVAL_OFFSET] \"i\" MCUXCSSLMEMORY_COPY_RETVAL_STACK_OFFSET \\\r\n        , [_CNT_OFFSET] \"i\" MCUXCSSLMEMORY_COPY_CNT_STACK_OFFSET \\\r\n        : \"cc\", \"memory\"  \\\r\n    );  \\\r\n    (retval) = (datareg);  \\\r\n    (void) success; \\\r\n}while(false)\r\n\r\n#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION < 6010050)\r\n#define MCUXCSSLMEMORY_COPY_ASM(word, byte, cha, chb, xorword, retval, datareg, src, dst, nwords, cnt, success)  \\\r\ndo{  \\\r\n    __asm {  \\\r\n        MOV    word, 0;  \\\r\n        MOV    datareg, 0;  \\\r\n        MOV    xorword, 0;  \\\r\n        CMP    word, nwords;  \\\r\n        BLT    mcuxCsslMemory_Copy_word_loop;  \\\r\n        BGE    mcuxCsslMemory_Copy_word_loop_end;  \\\r\n        B      mcuxCsslMemory_Copy_fault;  \\\r\nmcuxCsslMemory_Copy_word_loop:  \\\r\n        LDR    datareg, [src, word, LSL 2];  \\\r\n        EORS   cha, cha, datareg;  \\\r\n        STR    datareg, [dst, word, LSL 2];  \\\r\n        EORS   chb, chb, datareg;  \\\r\n        ADDS   word, word, +1;  \\\r\n        EORS   xorword, xorword, word;  \\\r\n        CMP    word, nwords;  \\\r\n        BLT    mcuxCsslMemory_Copy_word_loop;  \\\r\nmcuxCsslMemory_Copy_word_loop_end:  \\\r\n        LSLS   byte, word, 2;  \\\r\n        MOV    datareg, 0;  \\\r\n        CMP    byte, cnt;  \\\r\n        BLT    mcuxCsslMemory_Copy_byte_loop;  \\\r\n        BGE    mcuxCsslMemory_Copy_byte_loop_end;  \\\r\n        B      mcuxCsslMemory_Copy_fault;  \\\r\nmcuxCsslMemory_Copy_byte_loop:  \\\r\n        LDRB   datareg, [src, byte];  \\\r\n        EORS   cha, cha, datareg;  \\\r\n        STRB   datareg, [dst, byte];  \\\r\n        EORS   chb, chb, datareg;  \\\r\n        ADDS   byte, byte, +1;  \\\r\n        CMP    byte, cnt;  \\\r\n        BLT    mcuxCsslMemory_Copy_byte_loop;  \\\r\nmcuxCsslMemory_Copy_byte_loop_end:  \\\r\n        MOV    datareg, 0;  \\\r\n        EORS   retval, retval, success;  \\\r\nmcuxCsslMemory_Copy_fault:  \\\r\n    }  \\\r\n    (void)datareg;  \\\r\n    (void)success;  \\\r\n}while(false)\r\n\r\n#else\r\n    #error Unsupported compiler. The above section must be manually adapted to support your compiler inline assembly syntax.\r\n#endif /* Compiler selection */\r\n\r\n\r\n#endif /* MCUXCSSLMEMORY_INTERNAL_COPY_ASM_H_  */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslMemory/inc/internal/mcuxCsslMemory_Internal_SecureCompare.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023-2024 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxCsslMemory_Internal_SecureCompare.h\r\n * @brief Internal header of mcuxCsslMemory_SecureCompare\r\n */\r\n\r\n\r\n#ifndef MCUXCSSLMEMORY_INTERNAL_SECURECOMPARE_H_\r\n#define MCUXCSSLMEMORY_INTERNAL_SECURECOMPARE_H_\r\n\r\n#include <stdint.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxCsslFlowProtection_FunctionIdentifiers.h>\r\n\r\n/**\r\n * @brief Securely compares the two memory regions @p lhs and @p rhs - internal use only\r\n *\r\n * The implementation is secure in the following aspects:\r\n *\r\n * * Constant execution time: The execution sequence of the code is always identical for equal @p length parameters,\r\n *     i.e. no branches are performed based on the data in @p pLhs or @p pRhs.\r\n * * Code flow protection: The function call is protected. Additionally, the result depends on all steps of the calculation.\r\n * * Random order memory access: an attacker shall not be able to distinguish the position of the difference between the two compared buffers.\r\n * * Blinded word compare: SPA protection.\r\n * * Integrity of the result is ensured. The accumulator of differences is checked twice when generating the return status (EQUAL or NOT_EQUAL).\r\n * * Data Integrity: Expunge(pLhs + pRhs + length)\r\n *\r\n * @param pLhs   The left-hand side data to compare. Must not be NULL.\r\n * @param pRhs   The right-hand side data to compare. Must not be NULL.\r\n * @param length The number of bytes to compare.\r\n * @return A status code encapsulated in a flow-protection type.\r\n * @retval #MCUXCSSLMEMORY_STATUS_EQUAL If the contents of @p lhs and @p rhs are equal.\r\n * @retval #MCUXCSSLMEMORY_STATUS_NOT_EQUAL If the contents of @p lhs and @p rhs are not equal.\r\n * @retval #MCUXCSSLMEMORY_STATUS_FAULT If a fault was detected.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxCsslMemory_Int_SecComp)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(mcuxCsslMemory_Status_t) mcuxCsslMemory_Int_SecComp(\r\n    const uint8_t * pLhs,\r\n    const uint8_t * pRhs,\r\n    uint32_t length\r\n);\r\n\r\n#endif  /* MCUXCSSLMEMORY_INTERNAL_SECURECOMPARE_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslMemory/inc/mcuxCsslMemory.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxCsslMemory.h\r\n * @brief Top-level include file for the CSSL memory functions\r\n */\r\n\r\n#ifndef MCUXCSSLMEMORY_H\r\n#define MCUXCSSLMEMORY_H\r\n\r\n/**\r\n * @defgroup mcuxCsslMemory mcuxCssl Memory API\r\n * @brief Control Flow Protected Memory Functions\r\n *\r\n * @ingroup mcuxCsslAPI\r\n */\r\n#include <mcuxCsslMemory_Constants.h>\r\n#include <mcuxCsslMemory_Types.h>\r\n\r\n\r\n#include <mcuxCsslMemory_Compare.h>\r\n\r\n#include <mcuxCsslMemory_Clear.h>\r\n\r\n#include <mcuxCsslMemory_Copy.h>\r\n\r\n#include <mcuxCsslMemory_Set.h>\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslMemory/inc/mcuxCsslMemory_Clear.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2021-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxCsslMemory_Clear.h\r\n * @brief header file of memory clear function\r\n */\r\n\r\n\r\n#ifndef MCUXCSSLMEMORY_CLEAR_H_\r\n#define MCUXCSSLMEMORY_CLEAR_H_\r\n\r\n#include <stdint.h>\r\n#include <stddef.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxCsslFlowProtection_FunctionIdentifiers.h>\r\n#include <mcuxCsslParamIntegrity.h>\r\n\r\n/**\r\n * @defgroup mcuxCsslMemory_Clear mcuxCssl Memory Clear\r\n * @brief Control Flow Protected Memory Clear Function\r\n *\r\n * @ingroup mcuxCsslMemory\r\n * @{\r\n */\r\n\r\n/**\r\n * @defgroup mcuxCsslMemory_Clear_Functions mcuxCsslMemory_Clear Function Definitions\r\n * @brief mcuxCsslMemory_Clear Function Definitions\r\n *\r\n * @ingroup mcuxCsslMemory_Clear\r\n * @{\r\n */\r\n\r\n/**\r\n * @brief Clear @p length bytes of data at @p pDst\r\n *\r\n * The implementation is secure in the following aspects:\r\n * Parameter integrity protection: the function returns immediately in case of an incorrect parameter checksum.\r\n * Code flow protection: the function call is protected.\r\n * Buffer overflow protection: no data is written to @p pDst beyond @p dstLength bytes.\r\n *\r\n * @param[in]  chk       The parameter checksum, generated with #mcuxCsslParamIntegrity_Protect.\r\n * @param[in]  pDst      The destination pointer to buffer to be cleared. Must not be NULL.\r\n * @param[in]  dstLength The size of the destination data buffer in bytes.\r\n * @param[in]  length    The number of bytes to clear.\r\n *\r\n * @return A status code encapsulated in a flow-protection type.\r\n * @retval #MCUXCSSLMEMORY_STATUS_OK                If the contents in buffer at @p pDst is cleared.\r\n * @retval #MCUXCSSLMEMORY_STATUS_INVALID_PARAMETER If one of the parameters is invalid.\r\n * @retval #MCUXCSSLMEMORY_STATUS_FAULT             If a fault was detected, included invalid checksum @p chk.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxCsslMemory_Clear)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(mcuxCsslMemory_Status_t) mcuxCsslMemory_Clear\r\n(\r\n    mcuxCsslParamIntegrity_Checksum_t chk,\r\n    void * pDst,\r\n    size_t dstLength,\r\n    size_t length\r\n);\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n#endif /* MCUXCSSLMEMORY_CLEAR_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslMemory/inc/mcuxCsslMemory_Compare.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxCsslMemory_Compare.h\r\n * @brief Include file for constant time memory compare function\r\n */\r\n\r\n#ifndef MCUXCSSLMEMORY_COMPARE_H\r\n#define MCUXCSSLMEMORY_COMPARE_H\r\n\r\n#include <stdint.h>\r\n#include <mcuxCsslParamIntegrity.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxCsslFlowProtection_FunctionIdentifiers.h>\r\n\r\n/**\r\n * @defgroup mcuxCsslMemory_Compare mcuxCssl Memory Compare\r\n * @brief Control Flow Protected Memory Compare Function\r\n *\r\n * @ingroup mcuxCsslMemory\r\n * @{\r\n */\r\n\r\n/**\r\n * @defgroup mcuxCsslMemory_Compare_Functions mcuxCsslMemory_Compare Function Definitions\r\n * @brief mcuxCsslMemory_Compare Function Definitions\r\n *\r\n * @ingroup mcuxCsslMemory_Compare\r\n * @{\r\n */\r\n\r\n/**\r\n * @brief Compares the two memory regions @p lhs and @p rhs\r\n *\r\n * The implementation is secure in the following aspects:\r\n * \r\n * * Constant execution time: The execution sequence of the code is always identical for equal @p length parameters,\r\n *     i.e. no branches are performed based on the data in @p pLhs or @p pRhs.\r\n * * Parameter integrity protection: An incorrect parameter checksum makes the function return immediately.\r\n * * Code flow protection: The function call is protected. Additionally, the result depends on all steps of the calculation.\r\n * \r\n * @param chk    The parameter checksum, generated with #mcuxCsslParamIntegrity_Protect.\r\n * @param pLhs   The left-hand side data to compare. Must not be NULL.\r\n * @param pRhs   The right-hand side data to compare. Must not be NULL.\r\n * @param length The number of bytes to compare.\r\n * @return A status code encapsulated in a flow-protection type.\r\n * @retval #MCUXCSSLMEMORY_STATUS_EQUAL If the contents of @p lhs and @p rhs are equal.\r\n * @retval #MCUXCSSLMEMORY_STATUS_NOT_EQUAL If the contents of @p lhs and @p rhs are not equal.\r\n * @retval #MCUXCSSLMEMORY_STATUS_INVALID_PARAMETER If one of the parameters was invalid (i.e. @p lhs or @p rhs was NULL or @p length was zero).\r\n * @retval #MCUXCSSLMEMORY_STATUS_FAULT If a fault was detected.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxCsslMemory_Compare)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(mcuxCsslMemory_Status_t) mcuxCsslMemory_Compare\r\n(\r\n    mcuxCsslParamIntegrity_Checksum_t chk,\r\n    void const * pLhs,\r\n    void const * pRhs,\r\n    size_t length\r\n);\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslMemory/inc/mcuxCsslMemory_Constants.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxCsslMemory_Constants.h\r\n * @brief Constants definitions for the mcuxCsslMemory component\r\n */\r\n\r\n#ifndef MCUXCSSLMEMORY_CONSTANTS_H\r\n#define MCUXCSSLMEMORY_CONSTANTS_H\r\n\r\n#include <stdint.h>\r\n#include <mcuxCsslMemory_Types.h>\r\n\r\n/**********************************************\r\n * CONSTANTS\r\n **********************************************/\r\n\r\n/**\r\n * @brief CSSL Memory Component mask value.\r\n */\r\n#define MCUXCSSLMEMORY_COMPONENT_MASK              0x04240000u ///< Component mask value\r\n\r\n/**\r\n * @defgroup MCUXCSSLMEMORY_STATUS_ MCUXCSSLMEMORY_STATUS_\r\n * @brief Defines valid mcuxCsslMemory function return codes\r\n * @ingroup mcuxCsslMemory_Constants\r\n * @{\r\n */\r\n#define MCUXCSSLMEMORY_STATUS_OK                 ((mcuxCsslMemory_Status_t) 0x04242E03u) ///< The operation was successful\r\n#define MCUXCSSLMEMORY_STATUS_EQUAL              ((mcuxCsslMemory_Status_t) 0x04242E47u) ///< The two contents of the Memory Compare are equal\r\n#define MCUXCSSLMEMORY_STATUS_NOT_EQUAL          ((mcuxCsslMemory_Status_t) 0x042489B8u) ///< The two contents of the Memory Compare are not equal\r\n#define MCUXCSSLMEMORY_STATUS_INVALID_PARAMETER  ((mcuxCsslMemory_Status_t) 0x0424533Cu) ///< A parameter was invalid\r\n#define MCUXCSSLMEMORY_STATUS_FAULT              ((mcuxCsslMemory_Status_t) 0x0424F0F0u) ///< A fault occurred in the execution\r\n\r\n#define MCUXCSSLMEMORY_KEEP_ORDER     ((uint32_t) 0x042439A5u)  ///< Data storing in destination buffer in original order.\r\n#define MCUXCSSLMEMORY_REVERSE_ORDER  ((uint32_t) 0x0424395Au)  ///< Data storing in destination buffer with reversed order.\r\n/**\r\n * @}\r\n */\r\n\r\n#endif /* MCUXCSSLMEMORY_CONSTANTS_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslMemory/inc/mcuxCsslMemory_Copy.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2021, 2023 NXP                                                 */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxCsslMemory_Copy.h\r\n * @brief Include file for memory copy function\r\n */\r\n\r\n#ifndef MCUXCSSLMEMORY_COPY_H_\r\n#define MCUXCSSLMEMORY_COPY_H_\r\n\r\n/**\r\n * @defgroup mcuxCsslMemory_Copy mcuxCssl Memory Copy\r\n * @brief Control Flow Protected Memory Copy Function\r\n *\r\n * @ingroup mcuxCsslMemory\r\n * @{\r\n */\r\n\r\n/**\r\n * @defgroup mcuxCsslMemory_Copy_Functions mcuxCsslMemory_Copy Function Definitions\r\n * @brief mcuxCsslMemory_Copy Function Definitions\r\n *\r\n * @ingroup mcuxCsslMemory_Copy\r\n * @{\r\n */\r\n\r\n/**\r\n * @brief Copies @p length bytes of data from @p pSrc to @p pDst\r\n *\r\n * The implementation is secure in the following aspects:\r\n *\r\n * * Constant execution time: If @p pSrc and @p pDst have the same offset to the nearest 16-byte boundary, and if @p length\r\n *     is the same, the execution sequence of the code is always identical.\r\n * * Parameter integrity protection: An incorrect parameter checksum makes the function return immediately.\r\n * * Code flow protection: The function call is protected. Additionally, the result depends on all steps of the calculation.\r\n * * Buffer overflow protection: No data is written to @p pDst beyond @p dstLength bytes.\r\n *\r\n * @param[in]     chk        The parameter checksum, generated with #mcuxCsslParamIntegrity_Protect.\r\n * @param[in]     pSrc       The data to be copied. Must not be NULL. Must not overlap with @p pDst.\r\n * @param[out]    pDst       The destination pointer. Must not be NULL. Must not overlap with @p pSrc.\r\n * @param[in]     dstLength  The size of the destination data buffer in bytes.\r\n * @param[in]     length     The number of bytes to copy.\r\n * @return A status code encapsulated in a flow-protection type.\r\n * @retval #MCUXCSSLMEMORY_STATUS_OK If the operation was successful.\r\n * @retval #MCUXCSSLMEMORY_STATUS_INVALID_PARAMETER If one of the parameters was invalid (i.e. @p pSrc or @p pDst was NULL or @p length was zero).\r\n * @retval #MCUXCSSLMEMORY_STATUS_FAULT If a fault was detected.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxCsslMemory_Copy)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(mcuxCsslMemory_Status_t) mcuxCsslMemory_Copy\r\n(\r\n    mcuxCsslParamIntegrity_Checksum_t chk,\r\n    void const * pSrc,\r\n    void * pDst,\r\n    size_t dstLength,\r\n    size_t length\r\n);\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n#endif /* MCUXCSSLMEMORY_COPY_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslMemory/inc/mcuxCsslMemory_Set.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2021, 2023 NXP                                                 */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxCsslMemory_Set.h\r\n * @brief header file of memory set function\r\n */\r\n\r\n\r\n#ifndef MCUXCSSLMEMORY_SET_H_\r\n#define MCUXCSSLMEMORY_SET_H_\r\n\r\n#include <stdint.h>\r\n#include <stddef.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxCsslFlowProtection_FunctionIdentifiers.h>\r\n#include <mcuxCsslParamIntegrity.h>\r\n\r\n/**\r\n * @defgroup mcuxCsslMemory_Set mcuxCssl Memory Set\r\n * @brief Control Flow Protected Memory Set Function\r\n *\r\n * @ingroup mcuxCsslMemory\r\n * @{\r\n */\r\n\r\n/**\r\n * @defgroup mcuxCsslMemory_Set_Functions mcuxCsslMemory_Set Function Definitions\r\n * @brief mcuxCsslMemory_Set Function Definitions\r\n *\r\n * @ingroup mcuxCsslMemory_Set\r\n * @{\r\n */\r\n\r\n/**\r\n * @brief Set @p length bytes of data at @p pDst\r\n *\r\n * The implementation is secure in the following aspects:\r\n * Parameter integrity protection: the function returns immediately in case of an incorrect parameter checksum.\r\n * Code flow protection: the function call is protected.\r\n * Buffer overflow protection: no data is written to @p pDst beyond @p bufLength bytes.\r\n *\r\n * @param[in]  chk          The parameter checksum, generated with #mcuxCsslParamIntegrity_Protect.\r\n * @param[in]  pDst         The destination pointer to buffer to be set. Must not be NULL.\r\n * @param[in]  val          The byte value to be set. \r\n * @param[in]  length       The size in bytes to set.\r\n * @param[in]  bufLength    The buffer size (if bufLength < length, only bufLength bytes are set).\r\n *\r\n * @return A status code encapsulated in a flow-protection type.\r\n * @retval #MCUXCSSLMEMORY_STATUS_OK                 If @p val set @p length times at @p pDst.\r\n * @retval #MCUXCSSLMEMORY_STATUS_INVALID_PARAMETER  If one of the parameters is invalid.\r\n * @retval #MCUXCSSLMEMORY_STATUS_FAULT              If a fault was detected, included invalid checksum @p chk.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxCsslMemory_Set)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(mcuxCsslMemory_Status_t) mcuxCsslMemory_Set\r\n(\r\n    mcuxCsslParamIntegrity_Checksum_t chk,\r\n    void * pDst,\r\n    uint8_t val,\r\n    size_t length,\r\n    size_t bufLength\r\n);\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n#endif /* MCUXCSSLMEMORY_SET_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslMemory/inc/mcuxCsslMemory_Types.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2021-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxCsslMemory_Types.h\r\n * @brief Type definitions for the mcuxCsslMemory component\r\n */\r\n\r\n#ifndef MCUXCSSLMEMORY_TYPES_H\r\n#define MCUXCSSLMEMORY_TYPES_H\r\n\r\n#include <stdint.h>\r\n\r\n/**\r\n * @defgroup mcuxCsslMemory_Types mcuxCsslMemory_Types\r\n * @brief Defines common macros and types of @ref mcuxCsslMemory\r\n * @ingroup mcuxCsslMemory\r\n * @{\r\n */\r\n\r\n/**********************************************\r\n * TYPEDEFS\r\n **********************************************/\r\n\r\n/**\r\n * @defgroup mcuxCsslMemory_Types_Types mcuxCsslMemory_Types_Types\r\n * @brief Defines all types of @ref mcuxCsslMemory_Types\r\n * @ingroup mcuxCsslMemory_Types\r\n * @{\r\n */\r\n\r\n/**\r\n * @brief Type for CSSL Memory status codes.\r\n */\r\ntypedef uint32_t mcuxCsslMemory_Status_t;\r\n/**\r\n * @}\r\n *\r\n * @}\r\n */\r\n\r\n#endif /* MCUXCSSLMEMORY_TYPES_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslMemory/src/mcuxCsslMemory_Clear.c",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2021-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxCsslMemory_Clear.c\r\n * @brief mcuxCsslMemory: implementation of secure memory clear function\r\n */\r\n\r\n\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxCsslFlowProtection_FunctionIdentifiers.h>\r\n#include <mcuxCsslSecureCounter.h>\r\n#include <mcuxCsslParamIntegrity.h>\r\n#include <mcuxCsslMemory.h>\r\n#include <mcuxCsslMemory_Clear.h>\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxCsslMemory_Clear)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(mcuxCsslMemory_Status_t) mcuxCsslMemory_Clear\r\n(\r\n    mcuxCsslParamIntegrity_Checksum_t chk,\r\n    void * pDst,\r\n    size_t dstLength,\r\n    size_t length\r\n)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxCsslMemory_Clear,\r\n        MCUX_CSSL_FP_FUNCTION_CALLED(mcuxCsslParamIntegrity_Validate) );\r\n\r\n    MCUX_CSSL_FP_FUNCTION_CALL(retCode_paramIntegrityValidate, mcuxCsslParamIntegrity_Validate(chk, 3u, pDst, dstLength, length));\r\n    if ((retCode_paramIntegrityValidate != MCUXCSSLPARAMINTEGRITY_CHECK_VALID))\r\n    {\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxCsslMemory_Clear, MCUXCSSLMEMORY_STATUS_FAULT);\r\n    }\r\n\r\n    if (length > dstLength)\r\n    {\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxCsslMemory_Clear, MCUXCSSLMEMORY_STATUS_INVALID_PARAMETER);\r\n    }\r\n\r\n    MCUX_CSSL_FP_FUNCTION_CALL(retCode_memSet, mcuxCsslMemory_Set(mcuxCsslParamIntegrity_Protect(4u, pDst, 0u, length, dstLength), pDst, 0u, length, dstLength) );\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxCsslMemory_Clear, retCode_memSet,\r\n      MCUX_CSSL_FP_FUNCTION_CALLED(mcuxCsslMemory_Set ));\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslMemory/src/mcuxCsslMemory_Compare.c",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n#include <mcuxCsslMemory.h>\r\n#include <mcuxCsslSecureCounter.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxCsslFlowProtection_FunctionIdentifiers.h>\r\n#include <mcuxCsslAnalysis.h>\r\n#include <internal/mcuxCsslMemory_Internal_Compare_asm.h>\r\n\r\n#define CLS_NORMAL      0x2E00u\r\n#define CLS_MISMATCH    0x8900u\r\n#define LSB_NOT_EQUAL   0xB8u\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxCsslMemory_Compare)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(mcuxCsslMemory_Status_t) mcuxCsslMemory_Compare\r\n(\r\n    mcuxCsslParamIntegrity_Checksum_t chk,\r\n    void const * pLhs,\r\n    void const * pRhs,\r\n    size_t length\r\n)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxCsslMemory_Compare,\r\n        MCUX_CSSL_FP_FUNCTION_CALLED(mcuxCsslParamIntegrity_Validate)\r\n    );\r\n\r\n    MCUX_CSSL_FP_FUNCTION_CALL(result, mcuxCsslParamIntegrity_Validate(chk, 3u, pLhs, pRhs, length));\r\n\r\n    if( (result != MCUXCSSLPARAMINTEGRITY_CHECK_VALID)) {\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxCsslMemory_Compare, MCUXCSSLMEMORY_STATUS_FAULT);\r\n    }\r\n\r\n   if((NULL == pLhs) || (NULL == pRhs)) {\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxCsslMemory_Compare, MCUXCSSLMEMORY_STATUS_INVALID_PARAMETER);\r\n    }\r\n\r\n    uint32_t nwords = 0u;\r\n    uint32_t retval = 0u;\r\n    MCUX_CSSL_ANALYSIS_START_SUPPRESS_CAST_VOID()\r\n    uint8_t const * cur_lhs = (uint8_t const *)pLhs;\r\n    uint8_t const * cur_rhs = (uint8_t const *)pRhs;\r\n    MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CAST_VOID()\r\n    uint32_t const notValid = ~(MCUXCSSLPARAMINTEGRITY_CHECK_VALID);\r\n    uint32_t const errCode = (uint32_t)MCUXCSSLMEMORY_STATUS_NOT_EQUAL;\r\n\r\n    /* Pre-calculate end pointers */\r\n    uint8_t const * end_lhs = &cur_lhs[length];\r\n    uint8_t const * end_rhs = &cur_rhs[length];\r\n\r\n    MCUX_CSSL_ANALYSIS_START_SUPPRESS_REINTERPRET_MEMORY_BETWEEN_INAPT_ESSENTIAL_TYPES(\"Exception 9: re-interpreting the memory for word access\")\r\n    MCUXCSSLMEMORY_COMPARE_ASM_COMPARISON(retval, cur_lhs, cur_rhs, nwords, length, notValid, result);\r\n    MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_REINTERPRET_MEMORY_BETWEEN_INAPT_ESSENTIAL_TYPES()\r\n\r\n    MCUXCSSLMEMORY_COMPARE_ASM_CALC_RETVAL(retval, errCode);\r\n    retval &= 0x000000FFu;  /* Isolate the byte value that we are interested in */\r\n    retval |= MCUXCSSLMEMORY_COMPONENT_MASK | CLS_MISMATCH;  /* Defines the value to what is expected */\r\n    retval ^= (CLS_MISMATCH ^ CLS_NORMAL) & ((retval ^ LSB_NOT_EQUAL) << 8);  /* If equal, then change the class to match the equal case */\r\n\r\n    /* Check that the pointers reached the end */\r\n    if((end_lhs != cur_lhs) || (end_rhs != cur_rhs)) {\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxCsslMemory_Compare, MCUXCSSLMEMORY_STATUS_FAULT);\r\n    }\r\n\r\n    MCUX_CSSL_SC_ADD(nwords); // -> should be 0\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxCsslMemory_Compare, retval);\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslMemory/src/mcuxCsslMemory_Copy.c",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2021-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n#include <mcuxCsslMemory.h>\r\n#include <mcuxCsslSecureCounter.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxCsslFlowProtection_FunctionIdentifiers.h>\r\n#include <mcuxCsslAnalysis.h>\r\n#include <internal/mcuxCsslMemory_Internal_Copy_asm.h>\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxCsslMemory_Copy)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(mcuxCsslMemory_Status_t) mcuxCsslMemory_Copy\r\n(\r\n    mcuxCsslParamIntegrity_Checksum_t chk,\r\n    void const * pSrc,\r\n    void * pDst,\r\n    size_t dstLength,\r\n    size_t length\r\n)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxCsslMemory_Copy,\r\n        MCUX_CSSL_FP_FUNCTION_CALLED(mcuxCsslParamIntegrity_Validate)\r\n    );\r\n\r\n    MCUX_CSSL_FP_FUNCTION_CALL(result, mcuxCsslParamIntegrity_Validate(chk, 4u, pSrc, pDst, dstLength, length));\r\n\r\n    if(result != MCUXCSSLPARAMINTEGRITY_CHECK_VALID) {\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxCsslMemory_Copy, MCUXCSSLMEMORY_STATUS_FAULT);\r\n    }\r\n\r\n    if((NULL == pSrc) || (NULL == pDst) || (length > dstLength)) {\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxCsslMemory_Copy, MCUXCSSLMEMORY_STATUS_INVALID_PARAMETER);\r\n    }\r\n\r\n    uint32_t retval = (uint32_t) MCUXCSSLMEMORY_STATUS_FAULT;\r\n\r\n    const uint32_t nwords = length / 4U;\r\n    const uint32_t success = (uint32_t)MCUXCSSLMEMORY_STATUS_OK ^ (uint32_t)MCUXCSSLMEMORY_STATUS_FAULT;\r\n    uint32_t word = 0U;\r\n    uint32_t xorword = 0U;\r\n    uint32_t byte = 0U;\r\n    uint32_t cha = nwords;\r\n    uint32_t chb = 0xFFFFFFFFU;\r\n    uint32_t datareg = 0U;\r\n\r\n    MCUX_CSSL_SC_ADD(word); // -> should be 0\r\n    MCUX_CSSL_SC_ADD(xorword); // -> should be 0\r\n    MCUX_CSSL_SC_SUB(2U * nwords); // -> corresponds to `~(cha ^ chb) + word` after the below assembly has executed\r\n    // The following value is essentially a precalculation of the function xorchain(n) = 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ ... ^ n (a chain of XOR operations), where n is substituted by nwords.\r\n    // If n % 4 == 0, then xorchain(n) == n.\r\n    // If n % 4 == 1, then xorchain(n) == 1.\r\n    // If n % 4 == 2, then xorchain(n) == n + 1.\r\n    // If n % 4 == 3, then xorchain(n) == 0.\r\n    // The following is just a branchless way to do the case distinction.\r\n    // In the loop afterwards, this value is calculated by actually cumulatively XORing the value of the variable \"word\" in each loop iteration, which starts at 0 and increments up to nwords.\r\n    MCUX_CSSL_SC_SUB(nwords - (nwords % 2U) * nwords + ((nwords % 2U) ^ ((nwords % 4U) >> 1U))); // -> precalculation of xorword\r\n    MCUX_CSSL_SC_SUB(length); // -> corresponds to `byte` after the below assembly has executed\r\n\r\n    MCUXCSSLMEMORY_COPY_ASM(word, byte, cha, chb, xorword, retval, datareg, pSrc, pDst, nwords, length, success);\r\n\r\n    MCUX_CSSL_SC_ADD(~(cha ^ chb));\r\n    MCUX_CSSL_SC_ADD(xorword);\r\n    MCUX_CSSL_SC_ADD(word);\r\n    MCUX_CSSL_SC_ADD(byte);\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxCsslMemory_Copy, retval);\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslMemory/src/mcuxCsslMemory_Internal_SecureCompare_Stub.c",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxCsslMemory_Internal_SecureCompare_Stub.c\r\n * @brief C file that contains the stub implementation of the secure compare in C\r\n */\r\n\r\n#include <stdint.h>\r\n#include <stddef.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxCsslFlowProtection_FunctionIdentifiers.h>\r\n#include <mcuxCsslMemory_Constants.h>\r\n#include <mcuxCsslMemory_Types.h>\r\n#ifdef CSSL_MEMORY_ENABLE_COMPARE\r\n#include <mcuxCsslMemory_Compare.h>\r\n#include <mcuxCsslParamIntegrity.h>\r\n#endif /* CSSL_MEMORY_ENABLE_COMPARE */\r\n#include <internal/mcuxCsslMemory_Internal_SecureCompare.h>\r\n\r\n\r\n/**\r\n * @brief Stub comparison of the two memory regions @p lhs and @p rhs - internal use only\r\n *\r\n * The implementation calls mcuxCsslMemory_Compare when possible (function defined and pointers aligned)\r\n * else a code that contains no security countermeasure inside is called.\r\n *\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxCsslMemory_Int_SecComp)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(mcuxCsslMemory_Status_t) mcuxCsslMemory_Int_SecComp\r\n(\r\n    const uint8_t * pLhs,\r\n    const uint8_t * pRhs,\r\n    uint32_t length\r\n)\r\n{\r\n#ifdef CSSL_MEMORY_ENABLE_COMPARE\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxCsslMemory_Int_SecComp,\r\n        MCUX_CSSL_FP_FUNCTION_CALLED(mcuxCsslMemory_Compare)\r\n    );\r\n\r\n    const uint32_t cpuWordSize = sizeof(uint32_t);\r\n    if ((0u == ((uint32_t) pLhs & (cpuWordSize - 1u))) && (0u == ((uint32_t) pRhs & (cpuWordSize - 1u)))) {\r\n        MCUX_CSSL_FP_FUNCTION_CALL(retval, mcuxCsslMemory_Compare(mcuxCsslParamIntegrity_Protect(3u, pLhs, pRhs, length), pLhs, pRhs, length));\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxCsslMemory_Int_SecComp, retval);\r\n    }\r\n#endif  /* CSSL_MEMORY_ENABLE_COMPARE */\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxCsslMemory_Int_SecComp);\r\n\r\n    mcuxCsslMemory_Status_t retval = MCUXCSSLMEMORY_STATUS_EQUAL;\r\n    for (uint32_t i = 0u; i < length; ++i) {\r\n        if (pLhs[i] != pRhs[i]) {\r\n            retval = MCUXCSSLMEMORY_STATUS_NOT_EQUAL;\r\n        }\r\n    }\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxCsslMemory_Int_SecComp, retval);\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslMemory/src/mcuxCsslMemory_Set.c",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2021-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxCsslMemory_Set.c\r\n * @brief mcuxCsslMemory: implementation of memory set function\r\n */\r\n\r\n\r\n#include <stddef.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxCsslFlowProtection_FunctionIdentifiers.h>\r\n#include <mcuxCsslSecureCounter.h>\r\n#include <mcuxCsslParamIntegrity.h>\r\n#include <mcuxCsslMemory.h>\r\n#include <mcuxCsslAnalysis.h>\r\n\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxCsslMemory_Set)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(mcuxCsslMemory_Status_t) mcuxCsslMemory_Set\r\n(\r\n    mcuxCsslParamIntegrity_Checksum_t chk,\r\n    void * pDst,\r\n    uint8_t val,\r\n    size_t length,\r\n    size_t bufLength\r\n)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxCsslMemory_Set,\r\n        MCUX_CSSL_FP_FUNCTION_CALLED(mcuxCsslParamIntegrity_Validate));\r\n\r\n    MCUX_CSSL_FP_FUNCTION_CALL(retCode_paramIntegrityValidate, mcuxCsslParamIntegrity_Validate(chk, 4u, pDst, val, length, bufLength));\r\n\r\n    if (MCUXCSSLPARAMINTEGRITY_CHECK_VALID != retCode_paramIntegrityValidate)\r\n    {\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxCsslMemory_Set, MCUXCSSLMEMORY_STATUS_FAULT);\r\n    }\r\n\r\n    if (NULL == pDst)\r\n    {\r\n        MCUX_CSSL_FP_FUNCTION_EXIT(mcuxCsslMemory_Set, MCUXCSSLMEMORY_STATUS_INVALID_PARAMETER);\r\n    }\r\n\r\n    size_t copyLen = bufLength < length ? bufLength : length;\r\n    uint32_t remainLength = (uint32_t) copyLen;\r\n    uint32_t wordVal = ((uint32_t)val << 24) | ((uint32_t)val << 16) | ((uint32_t)val << 8) | (uint32_t)val;\r\n    const uint32_t cpuWordSize = sizeof(uint32_t);\r\n\r\n    MCUX_CSSL_ANALYSIS_START_SUPPRESS_CAST_VOID()\r\n    volatile uint8_t *p8Dst = (volatile uint8_t *) pDst; // needs to be aligned\r\n    MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_CAST_VOID()\r\n\r\n\r\n    MCUX_CSSL_ANALYSIS_START_PATTERN_SC_CAST_POINTERS()\r\n    MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(INTEGER_OVERFLOW, \"pDst will be in the valid range pDst[0 ~ copyLen].\")\r\n    MCUX_CSSL_SC_ADD((uint32_t) pDst + copyLen);\r\n    MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(INTEGER_OVERFLOW)\r\n    MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_CAST_POINTERS()\r\n\r\n    MCUX_CSSL_FP_LOOP_DECL(FirstByteLoop);\r\n    MCUX_CSSL_FP_LOOP_DECL(SecondByteLoop);\r\n    MCUX_CSSL_FP_LOOP_DECL(WordLoop);\r\n\r\n    MCUX_CSSL_ANALYSIS_START_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER(\"Typecast pointer to integer to check address for alignment\")\r\n    while ((0u != ((uint32_t) p8Dst & (cpuWordSize - 1u))) && (0u != remainLength))\r\n    MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_TYPECAST_BETWEEN_INTEGER_AND_POINTER()\r\n    {\r\n        MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(INTEGER_OVERFLOW, \"p8Dst will be in the valid range pDst[0 ~ copyLen].\")\r\n        MCUX_CSSL_FP_LOOP_ITERATION(FirstByteLoop);\r\n        *p8Dst = val;\r\n        p8Dst++;\r\n        remainLength--;\r\n        MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(INTEGER_OVERFLOW)\r\n    }\r\n\r\n\r\n    MCUX_CSSL_ANALYSIS_START_SUPPRESS_POINTER_CASTING(\"p8Dst is CPU word-aligned after the previous loop\")\r\n    volatile uint32_t *p32Dst = (volatile uint32_t *) p8Dst;  /* p8Dst is CPU word-aligned after the previous loop. */\r\n    MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_POINTER_CASTING()\r\n    while (cpuWordSize <= remainLength)\r\n    {\r\n        MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(INTEGER_OVERFLOW, \"p32Dst will be in the valid range pDst[0 ~ copyLen].\")\r\n        MCUX_CSSL_FP_LOOP_ITERATION(WordLoop);\r\n        MCUX_CSSL_ANALYSIS_START_SUPPRESS_POINTER_CASTING(\"p8Dst is CPU word-aligned after the previous loop\")\r\n        *p32Dst = wordVal;\r\n        MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_POINTER_CASTING()\r\n        p32Dst++;\r\n        remainLength -= cpuWordSize;\r\n        MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(INTEGER_OVERFLOW)\r\n    }\r\n\r\n    p8Dst = (volatile uint8_t *) p32Dst;\r\n    while (0u != remainLength)\r\n    {\r\n        MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(INTEGER_OVERFLOW, \"p8Dst will be in the valid range pDst[0 ~ copyLen].\")\r\n        MCUX_CSSL_FP_LOOP_ITERATION(SecondByteLoop);\r\n        *p8Dst = val;\r\n        p8Dst++;\r\n        remainLength--;\r\n        MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(INTEGER_OVERFLOW)\r\n    }\r\n\r\n    MCUX_CSSL_SC_SUB((uint32_t) p8Dst);\r\n    MCUX_CSSL_ANALYSIS_START_PATTERN_SC_CAST_POINTERS()\r\n    MCUX_CSSL_ANALYSIS_COVERITY_START_FALSE_POSITIVE(INTEGER_OVERFLOW, \"modular arithmetic, mod 4\")\r\n    MCUX_CSSL_FP_COUNTER_STMT(uint32_t noOfBytesToAlignment = ((0u - ((uint32_t) pDst)) % cpuWordSize));\r\n    MCUX_CSSL_ANALYSIS_COVERITY_STOP_FALSE_POSITIVE(INTEGER_OVERFLOW)\r\n    MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_CAST_POINTERS()\r\n\r\n    MCUX_CSSL_FP_COUNTER_STMT(uint32_t firstByteIteration = (copyLen > noOfBytesToAlignment)\r\n                             ? noOfBytesToAlignment\r\n                             : copyLen);\r\n    MCUX_CSSL_FP_COUNTER_STMT(uint32_t wordIteration = (copyLen > firstByteIteration)\r\n                             ? ((copyLen - firstByteIteration) / cpuWordSize)\r\n                             : 0u);\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxCsslMemory_Set, MCUXCSSLMEMORY_STATUS_OK,\r\n        MCUX_CSSL_FP_LOOP_ITERATIONS(FirstByteLoop, firstByteIteration),\r\n        MCUX_CSSL_FP_LOOP_ITERATIONS(WordLoop, wordIteration),\r\n        MCUX_CSSL_FP_LOOP_ITERATIONS(SecondByteLoop, copyLen - (wordIteration * cpuWordSize) - firstByteIteration));\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslParamIntegrity/inc/mcuxCsslParamIntegrity.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2021 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/// @file  mcuxCsslParamIntegrity.h\r\n/// @brief Top-level include file for the parameter integrity protection mechanism\r\n///\r\n/// The library exposes the following functions:\r\n/// <ol>\r\n///     <li> Generation of parameter checksums: #mcuxCsslParamIntegrity_Protect\r\n///     <li> Validation of parameter checksums: #mcuxCsslParamIntegrity_Validate\r\n/// </ol>\r\n\r\n#ifndef MCUXCSSLPARAMINTEGRITY_H\r\n#define MCUXCSSLPARAMINTEGRITY_H\r\n\r\n#include <stdint.h>\r\n#include <stddef.h>\r\n#include <stdbool.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxCsslFlowProtection_FunctionIdentifiers.h>\r\n\r\n/**\r\n * @defgroup mcuxCsslParamIntegrity Parameter Integrity API\r\n * @brief Functionality to ensure parameter integrity during function calls\r\n *\r\n * @ingroup mcuxCsslAPI\r\n * @{\r\n */\r\n\r\n/**\r\n * @defgroup mcuxCsslParamIntegrity_Macros mcuxCsslParamIntegrity Macro Definitions\r\n * @brief Macros of mcuxCsslParamIntegrity component\r\n * @ingroup mcuxCsslParamIntegrity\r\n * @{\r\n */\r\n\r\n#define MCUXCSSLPARAMINTEGRITY_BASE_CHECKSUM ((mcuxCsslParamIntegrity_Checksum_t)0xb7151628u) ///< First eight hex digits of Eulers number\r\n\r\n#define MCUXCSSLPARAMINTEGRITY_CHECK_VALID ((mcuxCsslParamIntegrity_Checksum_t)0x6969u) ///< Return value of #mcuxCsslParamIntegrity_Validate if the parameter checksum was correct\r\n\r\n#define MCUXCSSLPARAMINTEGRITY_CHECK_INVALID ((mcuxCsslParamIntegrity_Checksum_t)0x9696u) ///< Return value of #mcuxCsslParamIntegrity_Validate if the parameter checksum was incorrect\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @defgroup mcuxCsslParamIntegrity_Types mcuxCsslParamIntegrity Type Definitions\r\n * @brief Types of mcuxCsslParamIntegrity component\r\n * @ingroup mcuxCsslParamIntegrity\r\n * @{\r\n */\r\n\r\n/**\r\n* @brief Build time assertion to ensure CPU word size of 32 bit\r\n*/\r\ntypedef void * mcuxCsslParamIntegrity_AssertionCpuWordSize_t[(4u == sizeof(size_t)) ? (+1) : (-1)];\r\n\r\n/**\r\n* @brief  Type of a parameter checksum.\r\n*/\r\ntypedef uint32_t mcuxCsslParamIntegrity_Checksum_t;\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @defgroup mcuxCsslParamIntegrity_Functions mcuxCsslParamIntegrity Function Definitions\r\n * @brief Functions of mcuxCsslParamIntegrity component\r\n * @ingroup mcuxCsslParamIntegrity\r\n * @{\r\n */\r\n\r\n/**\r\n * @brief Calculates a parameter checksum.\r\n * \r\n * @param nargs The number of parameters to be protected.\r\n * @param ... The parameters that should be protected. Note that parameters bigger than a single machine word are not supported.\r\n * @return checksum over the input parameters to be protected\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxCsslParamIntegrity_Protect)\r\nmcuxCsslParamIntegrity_Checksum_t mcuxCsslParamIntegrity_Protect(size_t nargs, ...);\r\n\r\n/**\r\n * @brief Verifies the correctness of a parameter checksum.\r\n * \r\n * @param chk The parameter checksum.\r\n * @param nargs The number of parameters to be protected.\r\n * @param ... The parameters that were used to calculate the parameter checksum. Note that parameters bigger than a single machine word are not supported.\r\n * @return A status code encapsulated in a flow-protection type.\r\n * @retval #MCUXCSSLPARAMINTEGRITY_CHECK_VALID The parameter checksum was correct.\r\n * @retval #MCUXCSSLPARAMINTEGRITY_CHECK_INVALID The parameter checksum was incorrect.\r\n */\r\nMCUX_CSSL_FP_FUNCTION_DECL(mcuxCsslParamIntegrity_Validate)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(mcuxCsslParamIntegrity_Checksum_t) mcuxCsslParamIntegrity_Validate(mcuxCsslParamIntegrity_Checksum_t chk, size_t nargs, ...);\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n/**\r\n * @}\r\n */\r\n\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslParamIntegrity/src/mcuxCsslParamIntegrity.c",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n#include <mcuxCsslParamIntegrity.h>\r\n#include <mcuxCsslFlowProtection.h>\r\n#include <mcuxCsslFlowProtection_FunctionIdentifiers.h>\r\n#include <mcuxCsslAnalysis.h>\r\n#include <stdarg.h>\r\n#include <stddef.h>\r\n\r\nMCUX_CSSL_ANALYSIS_START_SUPPRESS_STDARG_USAGE(\"Usage of stdarg.h feature has been analyzed and approved, compiler error has been added for exceptions (when CPU word size > 32 bit)\")\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(rotate_right)\r\nstatic uint32_t rotate_right(uint32_t val, uint32_t shift_amt) {\r\n    MCUX_CSSL_ANALYSIS_START_SUPPRESS_INTEGER_OVERFLOW(\"shift_amt will be always less than 32.\")\r\n    return ((val) >> (shift_amt) % 32u) | ((val) << (32u - (shift_amt)) % 32u);\r\n    MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_INTEGER_OVERFLOW()\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxCsslParamIntegrity_InternalProtect)\r\nstatic mcuxCsslParamIntegrity_Checksum_t mcuxCsslParamIntegrity_InternalProtect(size_t nargs, va_list args) {\r\n    mcuxCsslParamIntegrity_Checksum_t result = MCUXCSSLPARAMINTEGRITY_BASE_CHECKSUM;\r\n    for(size_t i = 0; i < nargs; i++) {\r\n        MCUX_CSSL_ANALYSIS_START_SUPPRESS_VA_ARGS_USAGE(\"This is third party code. va_arg macro from stdarg.h contains two violations to MISRA rule 10.1, two violations to MISRA rule 10.4 and a violation to MISRA rule 20.7\")\r\n        MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW()\r\n        result += rotate_right(va_arg(args, uint32_t), i);\r\n        MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()\r\n        MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_VA_ARGS_USAGE()\r\n    }\r\n    return result;\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxCsslParamIntegrity_Protect)\r\nmcuxCsslParamIntegrity_Checksum_t mcuxCsslParamIntegrity_Protect\r\n(\r\n    size_t nargs,\r\n    ...\r\n)\r\n{\r\n    va_list args;\r\n    MCUX_CSSL_ANALYSIS_START_SUPPRESS_VA_ARGS_USAGE(\"This is third party code. va_start macro from stdarg.h contains a violation to MISRA rule 20.7\")\r\n    va_start(args, nargs);\r\n    MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_VA_ARGS_USAGE()\r\n\r\n    mcuxCsslParamIntegrity_Checksum_t result = mcuxCsslParamIntegrity_InternalProtect(nargs, args);\r\n    va_end(args);\r\n    return result;\r\n}\r\n\r\nMCUX_CSSL_FP_FUNCTION_DEF(mcuxCsslParamIntegrity_Validate)\r\nMCUX_CSSL_FP_PROTECTED_TYPE(mcuxCsslParamIntegrity_Checksum_t) mcuxCsslParamIntegrity_Validate\r\n(\r\n    mcuxCsslParamIntegrity_Checksum_t chk,\r\n    size_t nargs,\r\n    ...\r\n)\r\n{\r\n    MCUX_CSSL_FP_FUNCTION_ENTRY(mcuxCsslParamIntegrity_Validate);\r\n\r\n    va_list args;\r\n    MCUX_CSSL_ANALYSIS_START_SUPPRESS_VA_ARGS_USAGE(\"This is third party code. va_start macro from stdarg.h contains a violation to MISRA rule 20.7\")\r\n    va_start(args, nargs);\r\n    MCUX_CSSL_ANALYSIS_STOP_SUPPRESS_VA_ARGS_USAGE()\r\n\r\n    mcuxCsslParamIntegrity_Checksum_t recalculatedChecksum = mcuxCsslParamIntegrity_InternalProtect(nargs, args);\r\n    va_end(args);\r\n\r\n    MCUX_CSSL_FP_FUNCTION_EXIT(mcuxCsslParamIntegrity_Validate,\r\n        (recalculatedChecksum == chk) ? MCUXCSSLPARAMINTEGRITY_CHECK_VALID : MCUXCSSLPARAMINTEGRITY_CHECK_INVALID\r\n    );\r\n}\r\n\r\nMCUX_CSSL_ANALYSIS_STOP_SUPPRESS_STDARG_USAGE()\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslSecureCounter/inc/mcuxCsslSecureCounter.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * @file  mcuxCsslSecureCounter.h\r\n * @brief Provides the API for the CSSL secure counter mechanism.\r\n */\r\n\r\n#ifndef MCUXCSSLSECURECOUNTER_H_\r\n#define MCUXCSSLSECURECOUNTER_H_\r\n\r\n/* Include the actual implementation of the secure counter mechanism. */\r\n#include <mcuxCsslSecureCounter_Impl.h>\r\n\r\n/**\r\n * @addtogroup mcuxCsslAPI MCUX CSSL -- API\r\n *\r\n * @defgroup mcuxCsslSecureCounter Secure Counter API\r\n * @brief Secure counter mechanism.\r\n * @ingroup mcuxCsslAPI\r\n */\r\n\r\n\r\n/**\r\n * @defgroup scCore Secure counter core functionality\r\n * @brief Secure counter handling core functionality.\r\n * @ingroup mcuxCsslSecureCounter\r\n *\r\n * @todo Extend this description of the core functionality.\r\n */\r\n\r\n/****************************************************************************/\r\n/* Constants                                                                */\r\n/****************************************************************************/\r\n\r\n/**\r\n * @def MCUX_CSSL_SC_CHECK_PASSED\r\n * @brief Positive comparison result value.\r\n * @api\r\n * @ingroup scCore\r\n */\r\n#define MCUX_CSSL_SC_CHECK_PASSED \\\r\n  MCUX_CSSL_SC_CHECK_PASSED_IMPL\r\n\r\n/**\r\n * @def MCUX_CSSL_SC_CHECK_FAILED\r\n * @brief Negative comparison result value.\r\n * @api\r\n * @ingroup scCore\r\n */\r\n#define MCUX_CSSL_SC_CHECK_FAILED \\\r\n  MCUX_CSSL_SC_CHECK_FAILED_IMPL\r\n\r\n/**\r\n * @def MCUX_CSSL_SC_VALUE_TYPE\r\n * @brief Data type used for the secure counter values.\r\n * @api\r\n * @ingroup scCore\r\n */\r\n#define MCUX_CSSL_SC_VALUE_TYPE \\\r\n  MCUX_CSSL_SC_VALUE_TYPE_IMPL\r\n\r\n/****************************************************************************/\r\n/* Initialization                                                           */\r\n/****************************************************************************/\r\n\r\n/**\r\n * @def MCUX_CSSL_SC_ALLOC\r\n * @brief Allocation operation for the secure counter.\r\n * @api\r\n * @ingroup scCore\r\n */\r\n#define MCUX_CSSL_SC_ALLOC() \\\r\n  MCUX_CSSL_SC_ALLOC_IMPL()\r\n\r\n/**\r\n * @def MCUX_CSSL_SC_INIT\r\n * @brief Initialization operation for the secure counter.\r\n * @api\r\n * @ingroup scCore\r\n *\r\n * @param value Value with which the secure counter must be initialized.\r\n */\r\n#define MCUX_CSSL_SC_INIT(value) \\\r\n  MCUX_CSSL_SC_INIT_IMPL(value)\r\n\r\n/****************************************************************************/\r\n/* Check                                                                    */\r\n/****************************************************************************/\r\n\r\n/**\r\n * @def MCUX_CSSL_SC_CHECK\r\n * @brief Comparison operation for the secure counter.\r\n * @api\r\n * @ingroup scCore\r\n *\r\n * @param reference Reference value to compare the secure counter value against.\r\n * @return          Either #MCUX_CSSL_SC_CHECK_PASSED, if the value matches, or\r\n *                  #MCUX_CSSL_SC_CHECK_FAILED if the value is different.\r\n */\r\n#define MCUX_CSSL_SC_CHECK(reference) \\\r\n  MCUX_CSSL_SC_CHECK_IMPL(reference)\r\n\r\n/****************************************************************************/\r\n/* Counter increment                                                        */\r\n/****************************************************************************/\r\n/**\r\n * @defgroup scInc Secure counter increment\r\n * @brief Support for incrementing the secure counter.\r\n * @ingroup mcuxCsslSecureCounter\r\n */\r\n\r\n/**\r\n * @def MCUX_CSSL_SC_ADD\r\n * @brief Increment the secure counter with @p value.\r\n * @api\r\n * @ingroup scInc\r\n *\r\n * @see MCUX_CSSL_SC_ADD_0x1\r\n * @see MCUX_CSSL_SC_ADD_0x10\r\n * @see MCUX_CSSL_SC_ADD_0x100\r\n * @see MCUX_CSSL_SC_SUB\r\n *\r\n * @param value Value with which the secure counter must be incremented.\r\n */\r\n#define MCUX_CSSL_SC_ADD(value) \\\r\n  MCUX_CSSL_SC_ADD_IMPL(value)\r\n\r\n/**\r\n * @def MCUX_CSSL_SC_ADD_ON_CALL\r\n * @brief Increment the secure counter with @p value in case of function call.\r\n * @api\r\n * @ingroup scInc\r\n *\r\n * @see MCUX_CSSL_SC_ADD\r\n *\r\n * @param value Value with which the secure counter must be incremented.\r\n */\r\n#define MCUX_CSSL_SC_ADD_ON_CALL(value) \\\r\n  MCUX_CSSL_SC_ADD_ON_CALL_IMPL(value)\r\n\r\n/**\r\n * @def MCUX_CSSL_SC_ADD_0x1\r\n * @brief Increment the secure counter with 0x1.\r\n * @api\r\n * @ingroup scInc\r\n *\r\n * @see MCUX_CSSL_SC_ADD\r\n * @see MCUX_CSSL_SC_ADD_0x10\r\n * @see MCUX_CSSL_SC_ADD_0x100\r\n * @see MCUX_CSSL_SC_SUB_0x1\r\n */\r\n#define MCUX_CSSL_SC_ADD_0x1() \\\r\n  MCUX_CSSL_SC_ADD_0x1_IMPL()\r\n\r\n/**\r\n * @def MCUX_CSSL_SC_ADD_0x10\r\n * @brief Increment the secure counter with 0x10.\r\n * @api\r\n * @ingroup scInc\r\n *\r\n * @see MCUX_CSSL_SC_ADD\r\n * @see MCUX_CSSL_SC_ADD_0x1\r\n * @see MCUX_CSSL_SC_ADD_0x100\r\n * @see MCUX_CSSL_SC_SUB_0x10\r\n */\r\n#define MCUX_CSSL_SC_ADD_0x10() \\\r\n  MCUX_CSSL_SC_ADD_0x10_IMPL()\r\n\r\n/**\r\n * @def MCUX_CSSL_SC_ADD_0x100\r\n * @brief Increment the secure counter with 0x100.\r\n * @api\r\n * @ingroup scInc\r\n *\r\n * @see MCUX_CSSL_SC_ADD\r\n * @see MCUX_CSSL_SC_ADD_0x1\r\n * @see MCUX_CSSL_SC_ADD_0x10\r\n * @see MCUX_CSSL_SC_SUB_0x100\r\n */\r\n#define MCUX_CSSL_SC_ADD_0x100() \\\r\n  MCUX_CSSL_SC_ADD_0x100_IMPL()\r\n\r\n/****************************************************************************/\r\n/* Counter decrement                                                        */\r\n/****************************************************************************/\r\n/**\r\n * @defgroup scDec Secure counter decrement\r\n * @brief Support for decrementing the secure counter.\r\n * @ingroup mcuxCsslSecureCounter\r\n */\r\n\r\n/**\r\n * @def MCUX_CSSL_SC_SUB\r\n * @brief Decrement the secure counter with @p value.\r\n * @api\r\n * @ingroup scDec\r\n *\r\n * @see MCUX_CSSL_SC_SUB_0x1\r\n * @see MCUX_CSSL_SC_SUB_0x10\r\n * @see MCUX_CSSL_SC_SUB_0x100\r\n * @see MCUX_CSSL_SC_ADD\r\n *\r\n * @param value Value with which the secure counter must be decremented.\r\n */\r\n#define MCUX_CSSL_SC_SUB(value) \\\r\n  MCUX_CSSL_SC_SUB_IMPL(value)\r\n\r\n/**\r\n * @def MCUX_CSSL_SC_SUB_0x1\r\n * @brief Decrement the secure counter with 0x1.\r\n * @api\r\n * @ingroup scDec\r\n *\r\n * @see MCUX_CSSL_SC_SUB\r\n * @see MCUX_CSSL_SC_SUB_0x10\r\n * @see MCUX_CSSL_SC_SUB_0x100\r\n * @see MCUX_CSSL_SC_ADD_0x1\r\n */\r\n#define MCUX_CSSL_SC_SUB_0x1() \\\r\n  MCUX_CSSL_SC_SUB_0x1_IMPL()\r\n\r\n/**\r\n * @def MCUX_CSSL_SC_SUB_0x10\r\n * @brief Decrement the secure counter with 0x10.\r\n * @api\r\n * @ingroup scDec\r\n *\r\n * @see MCUX_CSSL_SC_SUB\r\n * @see MCUX_CSSL_SC_SUB_0x1\r\n * @see MCUX_CSSL_SC_SUB_0x100\r\n * @see MCUX_CSSL_SC_ADD_0x10\r\n */\r\n#define MCUX_CSSL_SC_SUB_0x10() \\\r\n  MCUX_CSSL_SC_SUB_0x10_IMPL()\r\n\r\n/**\r\n * @def MCUX_CSSL_SC_SUB_0x100\r\n * @brief Decrement the secure counter with 0x100.\r\n * @api\r\n * @ingroup scDec\r\n *\r\n * @see MCUX_CSSL_SC_SUB\r\n * @see MCUX_CSSL_SC_SUB_0x1\r\n * @see MCUX_CSSL_SC_SUB_0x10\r\n * @see MCUX_CSSL_SC_ADD_0x100\r\n */\r\n#define MCUX_CSSL_SC_SUB_0x100() \\\r\n  MCUX_CSSL_SC_SUB_0x100_IMPL()\r\n\r\n/****************************************************************************/\r\n/* Direct access (optional)                                                 */\r\n/****************************************************************************/\r\n/**\r\n * @defgroup scDirect Secure counter direct access\r\n * @brief Support for directly accessing the secure counter.\r\n * @ingroup mcuxCsslSecureCounter\r\n *\r\n * @warning Access to the secure counter is generally restricted, and generic\r\n * access might not be allowed.\r\n */\r\n\r\n/**\r\n * @def MCUX_CSSL_SC_VALUE\r\n * @brief Access operation for the current secure counter value.\r\n * @api\r\n * @ingroup scDirect\r\n *\r\n * @warning Access to the secure counter is generally restricted, and generic\r\n * access might not be allowed. For portable code it is best to only rely on\r\n * the check operation to verify the secure counter value.\r\n *\r\n * @return The current value of the secure counter.\r\n */\r\n#define MCUX_CSSL_SC_VALUE() \\\r\n  MCUX_CSSL_SC_VALUE_IMPL()\r\n\r\n/**\r\n * @def MCUX_CSSL_SC_ASSIGN\r\n * @brief Assignment operation for the secure counter.\r\n * @api\r\n * @ingroup scDirect\r\n *\r\n * @warning Access to the secure counter is generally restricted, and generic\r\n * assignment might not be allowed. For portable code it is best to only rely\r\n * on the initialization, increment and decrement operations to change the\r\n * secure counter value.\r\n *\r\n * @param value Value that needs to be assigned to the secure counter.\r\n */\r\n#define MCUX_CSSL_SC_ASSIGN(value) \\\r\n  MCUX_CSSL_SC_ASSIGN_IMPL(value)\r\n\r\n#endif /* MCUXCSSLSECURECOUNTER_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslSecureCounter/inc/mcuxCsslSecureCounter_Cfg.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * \\file  mcuxCsslSecureCounter_Cfg.h\r\n * \\brief Configuration of the implementation for the secure counter mechanism.\r\n */\r\n\r\n#ifndef MCUXCSSLSECURECOUNTER_CFG_H_\r\n#define MCUXCSSLSECURECOUNTER_CFG_H_\r\n\r\n/**\r\n * \\addtogroup mcuxCsslCFG MCUX CSSL -- Configurations\r\n *\r\n * \\defgroup mcuxCsslSecureCounter_CFG Secure Counter Configuration\r\n * \\brief Configuration options for the secure counter mechanism.\r\n * \\ingroup mcuxCsslCFG\r\n */\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_USE_HYBRID_LOCAL_CDOG\r\n * \\brief If set to 1, use the hybrid secure counter mechanism implementation based on\r\n *        a SW counter stored in a local variable and the code watchdog (CDOG) HW IP block.\r\n * \\ingroup mcuxCsslSecureCounter_CFG\r\n */\r\n    #define MCUX_CSSL_SC_USE_HYBRID_LOCAL_CDOG      0\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_USE_HW_CDOG\r\n * \\brief If set to 1, use the secure counter mechanism implementation based on\r\n *        the code watchdog (CDOG) HW IP block.\r\n * \\ingroup mcuxCsslSecureCounter_CFG\r\n */\r\n    #define MCUX_CSSL_SC_USE_HW_CDOG      0\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_USE_HW_SCM\r\n * \\brief If set to 1, use the secure counter mechanism implementation based on\r\n *        the subsystem control module (SCM) HW IP block.\r\n * \\ingroup mcuxCsslSecureCounter_CFG\r\n */\r\n    #define MCUX_CSSL_SC_USE_HW_SCM      0\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_USE_HW_S3SCM\r\n * \\brief If set to 1, use the secure counter mechanism implementation based on\r\n *        the subsystem control module (S3SCM) HW IP block.\r\n * \\ingroup mcuxCsslSecureCounter_CFG\r\n */\r\n    #define MCUX_CSSL_SC_USE_HW_S3SCM      0\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_USE_SW_LOCAL\r\n * \\brief If set to 1, use the secure counter mechanism implementation based on\r\n *        a SW counter stored in a local variable.\r\n * \\ingroup mcuxCsslSecureCounter_CFG\r\n */\r\n    #define MCUX_CSSL_SC_USE_SW_LOCAL    1\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_USE_SW_CONTEXT\r\n * \\brief If set to 1, use the secure counter mechanism implementation based on\r\n *        a SW counter stored in a context structure.\r\n * \\ingroup mcuxCsslSecureCounter_CFG\r\n */\r\n    #define MCUX_CSSL_SC_USE_SW_CONTEXT    0\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_USE_SW_CALLBACK\r\n * \\brief If set to 1, use the secure counter mechanism implementation based on\r\n *        a SW counter pointed to through a callback function.\r\n * \\ingroup mcuxCsslSecureCounter_CFG\r\n */\r\n    #define MCUX_CSSL_SC_USE_SW_CALLBACK    0\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_USE_SW_GLOBAL\r\n * \\brief If set to 1, use the secure counter mechanism implementation based on\r\n *        a SW counter stored in a global variable.\r\n * \\ingroup mcuxCsslSecureCounter_CFG\r\n */\r\n    #define MCUX_CSSL_SC_USE_SW_GLOBAL    0\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_USE_NONE\r\n * \\brief If set to 1, do not use the secure counter mechanism.\r\n * \\ingroup mcuxCsslSecureCounter_CFG\r\n */\r\n    #define MCUX_CSSL_SC_USE_NONE    0\r\n\r\n/* Basic configuration sanity check */\r\n\r\n#endif /* MCUXCSSLSECURECOUNTER_CFG_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslSecureCounter/inc/mcuxCsslSecureCounter_Impl.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * \\file  mcuxCsslSecureCounter_Impl.h\r\n * \\brief Selection of the implementation for the secure counter mechanism.\r\n */\r\n\r\n#ifndef MCUXCSSLSECURECOUNTER_IMPL_H_\r\n#define MCUXCSSLSECURECOUNTER_IMPL_H_\r\n\r\n/* Include the configuration for the secure counter mechanism. */\r\n#include <mcuxCsslSecureCounter_Cfg.h>\r\n\r\n/* Include the selected implementation of the secure counter mechanism. */\r\n#if defined(MCUX_CSSL_SC_USE_HW_CDOG) && (1 == MCUX_CSSL_SC_USE_HW_CDOG)\r\n  #include <mcuxCsslSecureCounter_HardwareAddresses.h>\r\n  #include <mcuxCsslSecureCounter_HW_CDOG.h>\r\n#elif defined(MCUX_CSSL_SC_USE_HYBRID_LOCAL_CDOG) && (1 == MCUX_CSSL_SC_USE_HYBRID_LOCAL_CDOG)\r\n  #include <mcuxCsslSecureCounter_HardwareAddresses.h>\r\n  #include <mcuxCsslSecureCounter_Hybrid_LocalCDOG.h>\r\n#elif defined(MCUX_CSSL_SC_USE_HW_S3SCM) && (1 == MCUX_CSSL_SC_USE_HW_S3SCM)\r\n  #include <mcuxCsslSecureCounter_HardwareAddresses.h>\r\n  #include <mcuxCsslSecureCounter_HW_S3SCM.h>\r\n#elif defined(MCUX_CSSL_SC_USE_HW_SCM) && (1 == MCUX_CSSL_SC_USE_HW_SCM)\r\n  #include <mcuxCsslSecureCounter_HardwareAddresses.h>\r\n  #include <mcuxCsslSecureCounter_HW_SCM.h>\r\n#elif defined(MCUX_CSSL_SC_USE_SW_LOCAL) && (1 == MCUX_CSSL_SC_USE_SW_LOCAL)\r\n  #include <mcuxCsslSecureCounter_SW_Local.h>\r\n#elif defined(MCUX_CSSL_SC_USE_SW_CONTEXT) && (1 == MCUX_CSSL_SC_USE_SW_CONTEXT)\r\n  #include <mcuxCsslSecureCounter_SW_Context.h>\r\n#elif defined(MCUX_CSSL_SC_USE_SW_CALLBACK) && (1 == MCUX_CSSL_SC_USE_SW_CALLBACK)\r\n  #include <mcuxCsslSecureCounter_SW_Callback.h>\r\n#elif defined(MCUX_CSSL_SC_USE_SW_GLOBAL) && (1 == MCUX_CSSL_SC_USE_SW_GLOBAL)\r\n  #include <mcuxCsslSecureCounter_SW_Global.h>\r\n#elif defined(MCUX_CSSL_SC_USE_NONE) && (1 == MCUX_CSSL_SC_USE_NONE)\r\n  #include <mcuxCsslSecureCounter_None.h>\r\n#else\r\n  #error \"No secure counter implementation found/configured.\"\r\n#endif\r\n\r\n#endif /* MCUXCSSLSECURECOUNTER_IMPL_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslSecureCounter/inc/mcuxCsslSecureCounter_None.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * \\file  mcuxCsslSecureCounter_None.h\r\n * \\brief Implementation that disables the CSSL secure counter mechanism.\r\n */\r\n\r\n#ifndef MCUXCSSLSECURECOUNTER_NONE_H_\r\n#define MCUXCSSLSECURECOUNTER_NONE_H_\r\n\r\n/**\r\n * \\addtogroup mcuxCsslIMPL MCUX CSSL -- Implementations\r\n *\r\n * \\defgroup mcuxCsslSecureCounter_None Secure Counter: Disabled\r\n * \\brief Disable the secure counter mechanism.\r\n * \\ingroup mcuxCsslIMPL\r\n */\r\n\r\n\r\n/**\r\n * \\defgroup scNoneCore Secure counter core functionality\r\n * \\brief Secure counter handling core functionality.\r\n * \\ingroup mcuxCsslSecureCounter_None\r\n *\r\n * \\todo Extend this description of the core functionality.\r\n */\r\n\r\n/****************************************************************************/\r\n/* Constants                                                                */\r\n/****************************************************************************/\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_CHECK_PASSED_IMPL\r\n * \\brief Positive comparison result value.\r\n * \\ingroup scNoneCore\r\n */\r\n#define MCUX_CSSL_SC_CHECK_PASSED_IMPL (0xA5A5A5A5u)\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_CHECK_FAILED_IMPL\r\n * \\brief Negative comparison result value.\r\n * \\ingroup scNoneCore\r\n */\r\n#define MCUX_CSSL_SC_CHECK_FAILED_IMPL (~ MCUX_CSSL_SC_CHECK_PASSED_IMPL)\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_COUNTER_TYPE_IMPL\r\n * \\brief Data type used for the secure counter.\r\n * \\ingroup scNoneCore\r\n */\r\n#define MCUX_CSSL_SC_COUNTER_TYPE_IMPL \\\r\n  uint32_t\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_VALUE_TYPE_IMPL\r\n * \\brief Data type used for the secure counter values.\r\n * \\ingroup scNoneCore\r\n */\r\n#define MCUX_CSSL_SC_VALUE_TYPE_IMPL \\\r\n  static const uint32_t\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_BALANCING_VALUE_TYPE_IMPL\r\n * \\brief Data type used for properly casting the secure counter balancing values.\r\n * \\ingroup scNoneCore\r\n */\r\n#define MCUX_CSSL_SC_BALANCING_VALUE_TYPE_IMPL \\\r\n  uint32_t\r\n\r\n/****************************************************************************/\r\n/* Initialization                                                           */\r\n/****************************************************************************/\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_ALLOC_IMPL\r\n * \\brief Allocation operation implementation for the secure counter.\r\n * \\ingroup scNoneCore\r\n */\r\n#define MCUX_CSSL_SC_ALLOC_IMPL() \\\r\n  /* intentionally empty */\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_INIT_IMPL\r\n * \\brief Initialization operation implementation for the secure counter.\r\n * \\ingroup scNoneCore\r\n *\r\n * \\param value Value with which the secure counter must be initialized.\r\n */\r\n#define MCUX_CSSL_SC_INIT_IMPL(value) \\\r\n  /* intentionally empty */\r\n\r\n/****************************************************************************/\r\n/* Check                                                                    */\r\n/****************************************************************************/\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_CHECK_IMPL\r\n * \\brief Comparison operation implementation for the secure counter.\r\n * \\ingroup scNoneCore\r\n *\r\n * \\param reference Reference value to compare the secure counter value against.\r\n * \\return          Always #MCUX_CSSL_SC_CHECK_PASSED.\r\n */\r\n#define MCUX_CSSL_SC_CHECK_IMPL(value) \\\r\n  (MCUX_CSSL_SC_CHECK_PASSED_IMPL)\r\n\r\n/****************************************************************************/\r\n/* Counter increment                                                        */\r\n/****************************************************************************/\r\n/**\r\n * \\defgroup scNoneInc Secure counter increment\r\n * \\brief Support for incrementing the secure counter.\r\n * \\ingroup mcuxCsslSecureCounter_None\r\n */\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_ADD_IMPL\r\n * \\brief Increment the secure counter with \\p value.\r\n * \\ingroup scNoneInc\r\n *\r\n * \\see MCUX_CSSL_SC_SUB_IMPL\r\n *\r\n * \\param value Value with which the secure counter must be incremented.\r\n */\r\n#define MCUX_CSSL_SC_ADD_IMPL(value) \\\r\n  /* intentionally empty */\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_ADD_ON_CALL_IMPL\r\n * \\brief Increment the secure counter with \\p value in case of function call.\r\n * \\ingroup scNoneInc\r\n *\r\n * \\see MCUX_CSSL_SC_ADD_IMPL\r\n *\r\n * \\param value Value with which the secure counter must be incremented.\r\n */\r\n#define MCUX_CSSL_SC_ADD_ON_CALL_IMPL(value) \\\r\n  /* intentionally empty */\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_ADD_0X1_IMPL\r\n * \\brief Increment the secure counter with 0x1.\r\n * \\ingroup scNoneInc\r\n *\r\n * \\see MCUX_CSSL_SC_ADD_IMPL\r\n */\r\n#define MCUX_CSSL_SC_ADD_0X1_IMPL() \\\r\n  /* intentionally empty */\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_ADD_0X10_IMPL\r\n * \\brief Increment the secure counter with 0x10.\r\n * \\ingroup scNoneInc\r\n *\r\n * \\see MCUX_CSSL_SC_ADD_IMPL\r\n */\r\n#define MCUX_CSSL_SC_ADD_0X10_IMPL() \\\r\n  /* intentionally empty */\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_ADD_0X100_IMPL\r\n * \\brief Increment the secure counter with 0x100.\r\n * \\ingroup scNoneInc\r\n *\r\n * \\see MCUX_CSSL_SC_ADD_IMPL\r\n */\r\n#define MCUX_CSSL_SC_ADD_0X100_IMPL() \\\r\n  /* intentionally empty */\r\n\r\n/****************************************************************************/\r\n/* Counter decrement                                                        */\r\n/****************************************************************************/\r\n/**\r\n * \\defgroup scNoneDec Secure counter decrement\r\n * \\brief Support for decrementing the secure counter.\r\n * \\ingroup mcuxCsslSecureCounter_None\r\n */\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_SUB_IMPL\r\n * \\brief Decrement the secure counter with \\p value.\r\n * \\ingroup scNoneDec\r\n *\r\n * \\see MCUX_CSSL_SC_ADD_IMPL\r\n *\r\n * \\param value Value with which the secure counter must be decremented.\r\n */\r\n#define MCUX_CSSL_SC_SUB_IMPL(value) \\\r\n  /* intentionally empty */\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_SUB_0X1_IMPL\r\n * \\brief Decrement the secure counter with 0x1.\r\n * \\ingroup scNoneDec\r\n *\r\n * \\see MCUX_CSSL_SC_SUB_IMPL\r\n */\r\n#define MCUX_CSSL_SC_SUB_0X1_IMPL() \\\r\n  /* intentionally empty */\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_SUB_0X10_IMPL\r\n * \\brief Decrement the secure counter with 0x10.\r\n * \\ingroup scNoneDec\r\n *\r\n * \\see MCUX_CSSL_SC_SUB_IMPL\r\n */\r\n#define MCUX_CSSL_SC_SUB_0X10_IMPL() \\\r\n  /* intentionally empty */\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_SUB_0X100_IMPL\r\n * \\brief Decrement the secure counter with 0x100.\r\n * \\ingroup scNoneDec\r\n *\r\n * \\see MCUX_CSSL_SC_SUB_IMPL\r\n */\r\n#define MCUX_CSSL_SC_SUB_0X100_IMPL() \\\r\n  /* intentionally empty */\r\n\r\n/****************************************************************************/\r\n/* Direct access (optional)                                                 */\r\n/****************************************************************************/\r\n/**\r\n * \\defgroup scNoneDirect Secure counter direct access\r\n * \\brief Support for directly accessing the secure counter.\r\n * \\ingroup mcuxCsslSecureCounter_None\r\n *\r\n * \\warning Access to the secure counter is generally restricted, and generic\r\n * access might not be allowed.\r\n */\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_VALUE_IMPL\r\n * \\brief Access operation for the current secure counter value.\r\n * \\ingroup scNoneDirect\r\n *\r\n * \\warning Access to the secure counter is generally restricted, and generic\r\n * access might not be allowed. For portable code it is best to only rely on\r\n * the check operation to verify the secure counter value.\r\n *\r\n * \\return The current value of the secure counter.\r\n */\r\n#define MCUX_CSSL_SC_VALUE_IMPL() \\\r\n  1/0 /* not supported */\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_ASSIGN_IMPL\r\n * \\brief Assignment operation for the secure counter.\r\n * \\ingroup scNoneDirect\r\n *\r\n * \\warning Access to the secure counter is generally restricted, and generic\r\n * assignment might not be allowed. For portable code it is best to only rely\r\n * on the initialization, increment and decrement operations to change the\r\n * secure counter value.\r\n *\r\n * \\param value Value that needs to be assigned to the secure counter.\r\n */\r\n#define MCUX_CSSL_SC_ASSIGN_IMPL(value) \\\r\n  /* intentionally empty */\r\n\r\n\r\n#endif /* MCUXCSSLSECURECOUNTER_NONE_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/comps/mcuxCsslSecureCounter/inc/mcuxCsslSecureCounter_SW_Local.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2020-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/**\r\n * \\file  mcuxCsslSecureCounter_SW_Local.h\r\n * \\brief SW implementation of the CSSL secure counter mechanism (using a local\r\n *        variable).\r\n */\r\n\r\n#ifndef MCUXCSSLSECURECOUNTER_SW_LOCAL_H_\r\n#define MCUXCSSLSECURECOUNTER_SW_LOCAL_H_\r\n\r\n/**\r\n * \\addtogroup mcuxCsslIMPL MCUX CSSL -- Implementations\r\n *\r\n * \\defgroup mcuxCsslSecureCounter_SwLocal Secure Counter: SW Local\r\n * \\brief Secure counter mechanism implementation using a local variable.\r\n * \\ingroup mcuxCsslIMPL\r\n */\r\n\r\n\r\n/**\r\n * \\defgroup scSwlCore Secure counter core functionality\r\n * \\brief Secure counter handling core functionality.\r\n * \\ingroup mcuxCsslSecureCounter_SwLocal\r\n *\r\n * \\todo Extend this description of the core functionality.\r\n */\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_COUNTER_NAME\r\n * \\brief Variable name to use for storing the secure counter value.\r\n * \\ingroup scSwlCore\r\n */\r\n#define MCUX_CSSL_SC_COUNTER_NAME \\\r\n  mcuxCsslSecureCounter\r\n\r\n/****************************************************************************/\r\n/* Constants                                                                */\r\n/****************************************************************************/\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_CHECK_PASSED_IMPL\r\n * \\brief Positive comparison result value.\r\n * \\ingroup scSwlCore\r\n */\r\n#define MCUX_CSSL_SC_CHECK_PASSED_IMPL (0xA5A5A5A5u)\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_CHECK_FAILED_IMPL\r\n * \\brief Negative comparison result value.\r\n * \\ingroup scSwlCore\r\n */\r\n#define MCUX_CSSL_SC_CHECK_FAILED_IMPL (~ MCUX_CSSL_SC_CHECK_PASSED_IMPL)\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_COUNTER_TYPE_IMPL\r\n * \\brief Data type used for the secure counter.\r\n * \\ingroup scSwlCore\r\n */\r\n#define MCUX_CSSL_SC_COUNTER_TYPE_IMPL \\\r\n  uint32_t\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_VALUE_TYPE_IMPL\r\n * \\brief Data type used for the secure counter values.\r\n * \\ingroup scSwlCore\r\n */\r\n#define MCUX_CSSL_SC_VALUE_TYPE_IMPL \\\r\n  static const uint32_t\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_BALANCING_VALUE_TYPE_IMPL\r\n * \\brief Data type used for properly casting the secure counter balancing values.\r\n * \\ingroup scSwlCore\r\n */\r\n#define MCUX_CSSL_SC_BALANCING_VALUE_TYPE_IMPL \\\r\n  uint32_t\r\n\r\n/****************************************************************************/\r\n/* Initialization                                                           */\r\n/****************************************************************************/\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_ALLOC_IMPL\r\n * \\brief Allocation operation implementation for the secure counter.\r\n * \\ingroup scSwlCore\r\n */\r\n#define MCUX_CSSL_SC_ALLOC_IMPL() \\\r\n  MCUX_CSSL_SC_COUNTER_TYPE_IMPL MCUX_CSSL_SC_COUNTER_NAME\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_INIT_IMPL\r\n * \\brief Initialization operation implementation for the secure counter.\r\n * \\ingroup scSwlCore\r\n *\r\n * \\param value Value with which the secure counter must be initialized.\r\n */\r\n#define MCUX_CSSL_SC_INIT_IMPL(value) \\\r\n  MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \\\r\n  MCUX_CSSL_SC_ALLOC_IMPL() = ((MCUX_CSSL_SC_BALANCING_VALUE_TYPE_IMPL) (value)) \\\r\n  MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()\r\n\r\n/****************************************************************************/\r\n/* Check                                                                    */\r\n/****************************************************************************/\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_CHECK_IMPL\r\n * \\brief Comparison operation implementation for the secure counter.\r\n * \\ingroup scSwlCore\r\n *\r\n * \\param value     Reference value to compare the secure counter value against.\r\n * \\return          Either #MCUX_CSSL_SC_CHECK_PASSED, if the value matches, or\r\n *                  #MCUX_CSSL_SC_CHECK_FAILED if the value is different.\r\n */\r\n#define MCUX_CSSL_SC_CHECK_IMPL(value) \\\r\n  MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \\\r\n  (MCUX_CSSL_SC_CHECK_FAILED_IMPL ^ (MCUX_CSSL_SC_COUNTER_NAME - (((MCUX_CSSL_SC_BALANCING_VALUE_TYPE_IMPL) (value)) + 1u))) \\\r\n  MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()\r\n\r\n/****************************************************************************/\r\n/* Counter increment                                                        */\r\n/****************************************************************************/\r\n/**\r\n * \\defgroup scSwlInc Secure counter increment\r\n * \\brief Support for incrementing the secure counter.\r\n * \\ingroup mcuxCsslSecureCounter_SwLocal\r\n */\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_ADD_IMPL\r\n * \\brief Increment the secure counter with \\p value.\r\n * \\ingroup scSwlInc\r\n *\r\n * \\see MCUX_CSSL_SC_SUB_IMPL\r\n *\r\n * \\param value Value with which the secure counter must be incremented.\r\n */\r\n#define MCUX_CSSL_SC_ADD_IMPL(value) \\\r\n  MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \\\r\n  MCUX_CSSL_SC_COUNTER_NAME += (MCUX_CSSL_SC_BALANCING_VALUE_TYPE_IMPL) (value) \\\r\n  MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_ADD_ON_CALL_IMPL\r\n * \\brief Increment the secure counter with \\p value in case of function call.\r\n * \\ingroup scSwlInc\r\n *\r\n * \\see MCUX_CSSL_SC_ADD_IMPL\r\n *\r\n * \\param value Value with which the secure counter must be incremented.\r\n */\r\n#define MCUX_CSSL_SC_ADD_ON_CALL_IMPL(value) \\\r\n  MCUX_CSSL_SC_ADD_IMPL(value)\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_ADD_0X1_IMPL\r\n * \\brief Increment the secure counter with 0x1.\r\n * \\ingroup scSwlInc\r\n *\r\n * \\see MCUX_CSSL_SC_ADD_IMPL\r\n */\r\n#define MCUX_CSSL_SC_ADD_0X1_IMPL() \\\r\n  MCUX_CSSL_SC_ADD_IMPL(0x1u)\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_ADD_0X10_IMPL\r\n * \\brief Increment the secure counter with 0x10.\r\n * \\ingroup scSwlInc\r\n *\r\n * \\see MCUX_CSSL_SC_ADD_IMPL\r\n */\r\n#define MCUX_CSSL_SC_ADD_0X10_IMPL() \\\r\n  MCUX_CSSL_SC_ADD_IMPL(0x10u)\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_ADD_0X100_IMPL\r\n * \\brief Increment the secure counter with 0x100.\r\n * \\ingroup scSwlInc\r\n *\r\n * \\see MCUX_CSSL_SC_ADD_IMPL\r\n */\r\n#define MCUX_CSSL_SC_ADD_0X100_IMPL() \\\r\n  MCUX_CSSL_SC_ADD_IMPL(0x100u)\r\n\r\n/****************************************************************************/\r\n/* Counter decrement                                                        */\r\n/****************************************************************************/\r\n/**\r\n * \\defgroup scSwlDec Secure counter decrement\r\n * \\brief Support for decrementing the secure counter.\r\n * \\ingroup mcuxCsslSecureCounter_SwLocal\r\n */\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_SUB_IMPL\r\n * \\brief Decrement the secure counter with \\p value.\r\n * \\ingroup scSwlDec\r\n *\r\n * \\see MCUX_CSSL_SC_ADD_IMPL\r\n *\r\n * \\param value Value with which the secure counter must be decremented.\r\n */\r\n#define MCUX_CSSL_SC_SUB_IMPL(value) \\\r\n  MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \\\r\n  MCUX_CSSL_SC_COUNTER_NAME -= (MCUX_CSSL_SC_BALANCING_VALUE_TYPE_IMPL) (value) \\\r\n  MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_SUB_0X1_IMPL\r\n * \\brief Decrement the secure counter with 0x1.\r\n * \\ingroup scSwlDec\r\n *\r\n * \\see MCUX_CSSL_SC_SUB_IMPL\r\n */\r\n#define MCUX_CSSL_SC_SUB_0X1_IMPL() \\\r\n  MCUX_CSSL_SC_SUB_IMPL(0x1u)\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_SUB_0X10_IMPL\r\n * \\brief Decrement the secure counter with 0x10.\r\n * \\ingroup scSwlDec\r\n *\r\n * \\see MCUX_CSSL_SC_SUB_IMPL\r\n */\r\n#define MCUX_CSSL_SC_SUB_0X10_IMPL() \\\r\n  MCUX_CSSL_SC_SUB_IMPL(0x10u)\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_SUB_0X100_IMPL\r\n * \\brief Decrement the secure counter with 0x100.\r\n * \\ingroup scSwlDec\r\n *\r\n * \\see MCUX_CSSL_SC_SUB_IMPL\r\n */\r\n#define MCUX_CSSL_SC_SUB_0X100_IMPL() \\\r\n  MCUX_CSSL_SC_SUB_IMPL(0x100u)\r\n\r\n/****************************************************************************/\r\n/* Direct access (optional)                                                 */\r\n/****************************************************************************/\r\n/**\r\n * \\defgroup scSwlDirect Secure counter direct access\r\n * \\brief Support for directly accessing the secure counter.\r\n * \\ingroup mcuxCsslSecureCounter_SwLocal\r\n *\r\n * \\warning Access to the secure counter is generally restricted, and generic\r\n * access might not be allowed.\r\n */\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_VALUE_IMPL\r\n * \\brief Access operation for the current secure counter value.\r\n * \\ingroup scSwlDirect\r\n *\r\n * \\warning Access to the secure counter is generally restricted, and generic\r\n * access might not be allowed. For portable code it is best to only rely on\r\n * the check operation to verify the secure counter value.\r\n *\r\n * \\return The current value of the secure counter.\r\n */\r\n#define MCUX_CSSL_SC_VALUE_IMPL() \\\r\n  MCUX_CSSL_SC_COUNTER_NAME\r\n\r\n/**\r\n * \\def MCUX_CSSL_SC_ASSIGN_IMPL\r\n * \\brief Assignment operation for the secure counter.\r\n * \\ingroup scSwlDirect\r\n *\r\n * \\warning Access to the secure counter is generally restricted, and generic\r\n * assignment might not be allowed. For portable code it is best to only rely\r\n * on the initialization, increment and decrement operations to change the\r\n * secure counter value.\r\n *\r\n * \\param value Value that needs to be assigned to the secure counter.\r\n */\r\n#define MCUX_CSSL_SC_ASSIGN_IMPL(value) \\\r\n  MCUX_CSSL_ANALYSIS_START_PATTERN_SC_INTEGER_OVERFLOW() \\\r\n  MCUX_CSSL_SC_COUNTER_NAME = (MCUX_CSSL_SC_BALANCING_VALUE_TYPE_IMPL) (value) \\\r\n  MCUX_CSSL_ANALYSIS_STOP_PATTERN_SC_INTEGER_OVERFLOW()\r\n\r\n#endif /* MCUXCSSLSECURECOUNTER_SW_LOCAL_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/platforms/rw61x/inc/ip_css_constants.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2018 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/********************************************************************************************************\r\n * @file     ip_css_constants.h\r\n *\r\n * @brief    Additional register count constants for ip_css.\r\n *\r\n * @version  $Revision: $\r\n * @date     8. October 2020\r\n *\r\n * @note     Generated with csv2a_create_cmsis_cheader V1.41\r\n *\r\n * @note     This File is NOT CMSIS compliant.\r\n *******************************************************************************************************/\r\n\r\n\r\n\r\n#ifndef ip_css_CONSTANTS_H\r\n#define ip_css_CONSTANTS_H\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n\r\n/* ================================================================================ */\r\n/* ================        'ip_css' register names counting        ================ */\r\n/* ================================================================================ */\r\n\r\n#define CSS_DMA_SRC_CNT               3UL\r\n#define CSS_KIDX_CNT                  2UL\r\n#define CSS_KS_CNT                    20UL\r\n#define CSS_SHA2_DOUT_CNT             16UL\r\n\r\n\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n\r\n#endif  /* ip_css_CONSTANTS_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/platforms/rw61x/inc/ip_css_design_configuration.h",
    "content": "// CSS COMMAND LIST\r\n// **** --> processing include file 'config_css_commands.txt'\r\n// \r\n// \r\n// List of commands available in CSS\r\n// \r\n#define ID_CFG_CSS_CMD_CIPHER 0\r\n#define ID_CFG_CSS_CMD_AUTH_CIPHER 1\r\n#define ID_CFG_CSS_CMD_RFU_0 2\r\n#define ID_CFG_CSS_CMD_RFU_1 3\r\n#define ID_CFG_CSS_CMD_ECSIGN 4\r\n#define ID_CFG_CSS_CMD_ECVFY 5\r\n#define ID_CFG_CSS_CMD_ECKXH 6\r\n#define ID_CFG_CSS_CMD_RFU_2 7\r\n#define ID_CFG_CSS_CMD_KEYGEN 8\r\n#define ID_CFG_CSS_CMD_KEYIN 9\r\n#define ID_CFG_CSS_CMD_KEYOUT 10\r\n#define ID_CFG_CSS_CMD_KDELETE 11\r\n#define ID_CFG_CSS_CMD_KEYPROV 12\r\n#define ID_CFG_CSS_CMD_RFU_4 13\r\n#define ID_CFG_CSS_CMD_RFU_5 14\r\n#define ID_CFG_CSS_CMD_RFU_6 15\r\n#define ID_CFG_CSS_CMD_CKDF 16\r\n#define ID_CFG_CSS_CMD_HKDF 17\r\n#define ID_CFG_CSS_CMD_TLS 18\r\n#define ID_CFG_CSS_CMD_RFU_7 19\r\n#define ID_CFG_CSS_CMD_HASH 20\r\n#define ID_CFG_CSS_CMD_HMAC 21\r\n#define ID_CFG_CSS_CMD_CMAC 22\r\n#define ID_CFG_CSS_CMD_RFU_9 23\r\n#define ID_CFG_CSS_CMD_DRBG_REQ 24\r\n#define ID_CFG_CSS_CMD_DRBG_TEST 25\r\n#define ID_CFG_CSS_CMD_RFU_11 26\r\n#define ID_CFG_CSS_CMD_RFU_12 27\r\n#define ID_CFG_CSS_CMD_DTRNG_CFG_LOAD 28\r\n#define ID_CFG_CSS_CMD_DTRNG_EVAL 29\r\n#define ID_CFG_CSS_CMD_GDET_CFG_LOAD 30\r\n#define ID_CFG_CSS_CMD_GDET_TRIM 31\r\n// Command Configurations\r\n// ID_CFG_CSS_CMD_CIPHER\r\n#define ID_CFG_CSS_CMD_CIPHER_DCRYPT 1\r\n#define ID_CFG_CSS_CMD_CIPHER_CPHMDE0 2\r\n#define ID_CFG_CSS_CMD_CIPHER_CPHMDE1 3\r\n#define ID_CFG_CSS_CMD_CIPHER_CPHSOE 4\r\n#define ID_CFG_CSS_CMD_CIPHER_CPHSIE 5\r\n#define ID_CFG_CSS_CMD_CIPHER_EXTKEY 13\r\n// ID_CFG_CSS_CMD_AUTH_CIPHER\r\n#define ID_CFG_CSS_CMD_AUTH_CIPHER_DCRYPT 1\r\n#define ID_CFG_CSS_CMD_AUTH_CIPHER_ACPMOD0 2\r\n#define ID_CFG_CSS_CMD_AUTH_CIPHER_ACPMOD1 3\r\n#define ID_CFG_CSS_CMD_AUTH_CIPHER_CPHSOE 4\r\n#define ID_CFG_CSS_CMD_AUTH_CIPHER_CPHSIE 5\r\n#define ID_CFG_CSS_CMD_AUTH_CIPHER_MSGENDW0 6\r\n#define ID_CFG_CSS_CMD_AUTH_CIPHER_MSGENDW1 7\r\n#define ID_CFG_CSS_CMD_AUTH_CIPHER_MSGENDW2 8\r\n#define ID_CFG_CSS_CMD_AUTH_CIPHER_MSGENDW3 9\r\n#define ID_CFG_CSS_CMD_AUTH_CIPHER_LASTINIT 10\r\n#define ID_CFG_CSS_CMD_AUTH_CIPHER_EXTKEY 13\r\n// ID_CFG_CSS_CMD_ECSIGN\r\n#define ID_CFG_CSS_CMD_ECSIGN_CFG_ECHASHCHL 0\r\n#define ID_CFG_CSS_CMD_ECSIGN_CFG_SIGNRTF 1\r\n#define ID_CFG_CSS_CMD_ECSIGN_CFG_REVF 4\r\n// ID_CFG_CSS_CMD_ECVFY\r\n#define ID_CFG_CSS_CMD_ECVFY_CFG_ECHASHCHL 0\r\n#define ID_CFG_CSS_CMD_ECVFY_CFG_REVF 4\r\n// ID_CFG_CSS_CMD_ECKXH\r\n#define ID_CFG_CSS_CMD_ECKXH_REVF 4\r\n// ID_CFG_CSS_CMD_KEYGEN\r\n#define ID_CFG_CSS_CMD_KEYGEN_KGSIGN 0\r\n#define ID_CFG_CSS_CMD_KEYGEN_KGTYPEDH 1\r\n#define ID_CFG_CSS_CMD_KEYGEN_KGSRC 2\r\n#define ID_CFG_CSS_CMD_KEYGEN_SKIP_PBK 3\r\n#define ID_CFG_CSS_CMD_KEYGEN_REVF 4\r\n#define ID_CFG_CSS_CMD_KEYGEN_KGSIGN_RND 5\r\n// ID_CFG_CSS_CMD_KEYIN\r\n#define ID_CFG_CSS_CMD_KEYIN_KFMT0 6\r\n#define ID_CFG_CSS_CMD_KEYIN_KFMT1 7\r\n// ID_CFG_CSS_CMD_KEYPROV\r\n#define ID_CFG_CSS_CMD_KEYPROV_ICEN 0\r\n// ID_CFG_CSS_CMD_CKDF\r\n#define ID_CFG_CSS_CMD_CKDF_CKDF_ALGO0 12\r\n#define ID_CFG_CSS_CMD_CKDF_CKDF_ALGO1 13\r\n// ID_CFG_CSS_CMD_HKDF\r\n#define ID_CFG_CSS_CMD_HKDF_RTFDRVDAT 0\r\n#define ID_CFG_CSS_CMD_HKDF_HKDF_ALGO 1\r\n#define ID_CFG_CSS_CMD_HKDF_SINGLE_STEP 2\r\n// ID_CFG_CSS_CMD_TLS\r\n#define ID_CFG_CSS_CMD_TLS_FINALIZE 10\r\n// ID_CFG_CSS_CMD_HASH\r\n#define ID_CFG_CSS_CMD_HASH_HASHINI 2\r\n#define ID_CFG_CSS_CMD_HASH_HASHLD 3\r\n// ID_CFG_CSS_CMD_HASH_HASHMD0\r\n#define ID_CFG_CSS_CMD_HASH_HASHMD0 4\r\n// ID_CFG_CSS_CMD_HASH_HASHMD1\r\n#define ID_CFG_CSS_CMD_HASH_HASHMD1 5\r\n#define ID_CFG_CSS_CMD_HASH_HASHOE 6\r\n#define ID_CFG_CSS_CMD_HASH_RTFUPD 7\r\n#define ID_CFG_CSS_CMD_HASH_RTFOE 8\r\n// ID_CFG_CSS_CMD_HMAC\r\n#define ID_CFG_CSS_CMD_HMAC_EXTKEY 13\r\n// ID_CFG_CSS_CMD_CMAC\r\n#define ID_CFG_CSS_CMD_CMAC_INIT 0\r\n#define ID_CFG_CSS_CMD_CMAC_FINALIZE 1\r\n#define ID_CFG_CSS_CMD_CMAC_SOE 2\r\n#define ID_CFG_CSS_CMD_CMAC_SIE 3\r\n#define ID_CFG_CSS_CMD_CMAC_EXTKEY 13\r\n// ID_CFG_CSS_CMD_DRBG_TEST\r\n#define ID_CFG_CSS_CMD_DRBG_TEST_MODE0 0\r\n#define ID_CFG_CSS_CMD_DRBG_TEST_MODE1 1\r\n\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/platforms/rw61x/inc/ip_platform.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2022-2023 NXP                                                  */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n/** @file  ip_platform.h\r\n *  @brief Include file for the IP.\r\n *\r\n * This file defines base addresses and types for all IP blocks used by CLNS. */\r\n\r\n#ifndef IP_PLATFORM_H\r\n#define IP_PLATFORM_H\r\n\r\n#include \"fsl_device_registers.h\"\r\n\r\n/* ================================================================================ */\r\n/* ================             Peripheral declaration             ================ */\r\n/* ================================================================================ */\r\n\r\n// Define base address of PUF\r\n#define PUF_SFR_BASE            PUF      ///< base of PUF SFRs\r\n#define PUF_SFR_NAME(sfr)       sfr      ///< full name of SFR\r\n#define PUF_SFR_PREFIX          PUF_     ///< sfr field name prefix\r\n#define PUF_SFR_SUFFIX_MSK     _MASK       ///< sfr field name suffix for mask\r\n#define PUF_SFR_SUFFIX_POS     _SHIFT      ///< sfr field name suffix for bit position\r\n\r\n\r\n// Define base address of CSS\r\n#define ELS_SFR_BASE            ELS         ///< base of CSS SFRs\r\n#define ELS_SFR_NAME(sfr)       sfr         ///< full name of SFR\r\n#define ELS_SFR_PREFIX          ELS_        ///< sfr field name prefix\r\n\r\n// Define base address of PKC\r\n#define PKC_SFR_BASE            PKC         ///< base of PKC SFRs\r\n#define PKC_SFR_NAME(sfr)       PKC_ ## sfr ///< full name of SFR\r\n#define PKC_SFR_PREFIX          PKC_PKC_    ///< sfr field name prefix\r\n#define PKC_SFR_SUFFIX_MSK      _MASK       ///< sfr field name suffix for mask\r\n#define PKC_SFR_SUFFIX_POS      _SHIFT      ///< sfr field name suffix for bit position\r\n\r\n// PKC_RAM base address is not defined in any header file\r\n#define PKC_RAM_ADDR ((uint32_t) 0x5015A000)\r\n#define PKC_RAM_SIZE  ((uint32_t)0x2000u)\r\n#define PKC_WORD_SIZE  8u\r\n\r\n// Define base address of TRNG\r\n#define TRNG_SFR_BASE           TRNG         ///< base of TRNG SFRs\r\n#define TRNG_SFR_NAME(sfr)      sfr          ///< full name of SFR\r\n#define TRNG_SFR_PREFIX         TRNG_        ///< sfr field name prefix\r\n#define TRNG_SFR_SUFFIX_MSK     _MASK        ///< sfr field name suffix for mask\r\n#define TRNG_SFR_SUFFIX_POS     _SHIFT       ///< sfr field name suffix for bit position\r\n\r\n// ELS version\r\n#define ELS_HW_VERSION_REVISION            1\r\n#define ELS_HW_VERSION_MINOR               22\r\n#define ELS_HW_VERSION_MAJOR               2\r\n#define ELS_HW_VERSION_FW_REVISION         1\r\n#define ELS_HW_VERSION_FW_MINOR            2\r\n#define ELS_HW_VERSION_FW_MAJOR            1\r\n\r\n// Interrupt definitions\r\n#define CSS_INTERRUPT_BUSY_NUMBER          ELS_IRQn\r\n#define CSS_INTERRUPT_ERR_NUMBER           ELS_IRQn\r\n#define CSS_INTERRUPT_IRQ_NUMBER           ELS_IRQn\r\n#define GDET_INTERRUPT_IRQ_NUMBER          ELS_GDET_IRQ_IRQn\r\n#define GDET_INTERRUPT_ERR_NUMBER          ELS_GDET_ERR_IRQn\r\n\r\n\r\n/* If we are supposed to determine the CSSv2 base address at link time, do not use the definitions from ip_css.h\r\n * Redefine CSS as an extern pointer.\r\n */\r\n#undef CSS_BASE\r\nextern void * ip_css_base;\r\n#define CSS_BASE                     ip_css_base\r\n\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/platforms/rw61x/mcuxClConfig.h",
    "content": "/*--------------------------------------------------------------------------*/\r\n/* Copyright 2023 NXP                                                       */\r\n/*                                                                          */\r\n/* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n/* only be used strictly in accordance with the applicable license terms.   */\r\n/* By expressly accepting such terms or by downloading, installing,         */\r\n/* activating and/or otherwise using the software, you are agreeing that    */\r\n/* you have read, and that you agree to comply with and are bound by, such  */\r\n/* license terms. If you do not agree to be bound by the applicable license */\r\n/* terms, then you may not retain, install, activate or otherwise use the   */\r\n/* software.                                                                */\r\n/*--------------------------------------------------------------------------*/\r\n\r\n#ifndef MCUXCL_CONFIG_H_\r\n#define MCUXCL_CONFIG_H_\r\n\r\n//commented defines for all available features \r\n//#define    MCUXCL_FEATURE_EXPORTED_FEATURE_HEADER\r\n//#define    MCUXCL_FEATURE_EXPORTED_PLATFORM_HEADERS\r\n//#define    MCUXCL_FEATURE_PLATFORM_RW61X\r\n//#define    MCUXCL_FEATURE_PLATFORM_MCXN\r\n//#define    MCUXCL_FEATURE_PLATFORM_LPC\r\n//#define    MCUXCL_FEATURE_PROJECT_VOLTA_ON_NIRVANA\r\n//#define    MCUXCL_FEATURE_PLATFORM_MIMXRT\r\n//#define    MCUXCL_FEATURE_PROJECT_BLACKBIRD\r\n//#define    MCUXCL_FEATURE_PROJECT_CSSL\r\n//#define    MCUXCL_FEATURE_PROJECT_NCCL\r\n//#define    MCUXCL_FEATURE_PROJECT_QUANTUM\r\n//#define    MCUXCL_FEATURE_PROJECT_SHARK\r\n//#define    MCUXCL_FEATURE_HW_ELS\r\n//#define    MCUXCL_FEATURE_HW_GDET\r\n//#define    MCUXCL_FEATURE_HW_GLIKEY\r\n//#define    MCUXCL_FEATURE_HW_PKC\r\n//#define    MCUXCL_FEATURE_HW_ROPUF\r\n//#define    MCUXCL_FEATURE_HW_SAFO_SM3\r\n//#define    MCUXCL_FEATURE_HW_SAFO_SM4\r\n//#define    MCUXCL_FEATURE_HW_SGI\r\n//#define    MCUXCL_FEATURE_HW_TRNG\r\n//#define    MCUXCL_FEATURE_HW_RISCV_ZBB\r\n//#define    MCUXCL_FEATURE_HW_RISCV_CSW\r\n//#define    MCUXCL_FEATURE_HW_CACHE_ENABLED\r\n//#define    MCUXCL_FEATURE_ELS\r\n//#define    MCUXCL_FEATURE_ELS_AEAD\r\n//#define    MCUXCL_FEATURE_ELS_API_INPUT_PARAM_CHECKS\r\n//#define    MCUXCL_FEATURE_ELS_CKDF\r\n//#define    MCUXCL_FEATURE_ELS_CKDF_SP80056C\r\n//#define    MCUXCL_FEATURE_ELS_CMAC\r\n//#define    MCUXCL_FEATURE_ELS_ECC_KEY_EXCHANGE\r\n//#define    MCUXCL_FEATURE_ELS_ECC_ECKXCH_ODD_EVEN\r\n//#define    MCUXCL_FEATURE_ELS_ECC_ECKXCH_ODD\r\n//#define    MCUXCL_FEATURE_ELS_GLITCHDETECTOR\r\n//#define    MCUXCL_FEATURE_ELS_HKDF\r\n//#define    MCUXCL_FEATURE_ELS_HMAC\r\n//#define    MCUXCL_FEATURE_ELS_HWCONFIG\r\n//#define    MCUXCL_FEATURE_ELS_KEY_MGMT_DELETE\r\n//#define    MCUXCL_FEATURE_ELS_KEY_MGMT_EXPORT\r\n//#define    MCUXCL_FEATURE_ELS_KEY_EXPORT_SW_DFA_PROTECTION\r\n//#define    MCUXCL_FEATURE_ELS_KEY_MGMT_KEYPROV\r\n//#define    MCUXCL_FEATURE_ELS_KEY_MGMT_KEYPROV_ROM\r\n//#define    MCUXCL_FEATURE_ELS_KEY_MGMT_KEYPROV_TEST\r\n//#define    MCUXCL_FEATURE_ELS_KEY_MGMT_KEYPROV_ROM_TEST\r\n//#define    MCUXCL_FEATURE_ELS_KEY_MGMT_KEYPROV_DUK_UPDATE\r\n//#define    MCUXCL_FEATURE_ELS_KEY_MGMT_KEYPROV_DUK_UPDATE_TEST\r\n//#define    MCUXCL_FEATURE_ELS_RNG\r\n//#define    MCUXCL_FEATURE_ELS_SHA_224\r\n//#define    MCUXCL_FEATURE_ELS_SHA_256\r\n//#define    MCUXCL_FEATURE_ELS_SHA_384\r\n//#define    MCUXCL_FEATURE_ELS_SHA_512\r\n//#define    MCUXCL_FEATURE_ELS_SHA_512_224\r\n//#define    MCUXCL_FEATURE_ELS_SHA_512_256\r\n//#define    MCUXCL_FEATURE_ELS_SHA_DIRECT\r\n//#define    MCUXCL_FEATURE_ELS_SHA_DIRECT_MODE_FLAG\r\n//#define    MCUXCL_FEATURE_ELS_AES_WITH_SIDE_CHANNEL_PROTECTION\r\n//#define    MCUXCL_FEATURE_ELS_TLS\r\n//#define    MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS\r\n//#define    MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS_CMAC\r\n//#define    MCUXCL_FEATURE_ELS_PUK_INTERNAL_BIT\r\n//#define    MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n//#define    MCUXCL_FEATURE_ELS_RND_RAW\r\n//#define    MCUXCL_FEATURE_ELS_PRND_INIT\r\n//#define    MCUXCL_FEATURE_ELS_DTRNG_PRV_CONFIG_LOAD\r\n//#define    MCUXCL_FEATURE_ELS_LOCKING\r\n//#define    MCUXCL_FEATURE_ELS_CMD_CRC\r\n//#define    MCUXCL_FEATURE_ELS_DMA_ADDRESS_READBACK\r\n//#define    MCUXCL_FEATURE_ELS_DMA_FINAL_ADDRESS_READBACK\r\n//#define    MCUXCL_FEATURE_ELS_RANDOMIZE_RFC3394_OUT\r\n//#define    MCUXCL_FEATURE_ELS_RESP_GEN\r\n//#define    MCUXCL_FEATURE_ELS_GET_FW_VERSION\r\n//#define    MCUXCL_FEATURE_ELS_CACHE_MAINTENANCE\r\n//#define    MCUXCL_FEATURE_ELS_ACCESS_PKCRAM_WORKAROUND\r\n//#define    MCUXCL_FEATURE_ELS_ACCESS_PKCRAM_WORKAROUND_M2\r\n//#define    MCUXCL_FEATURE_ELS_ITERATIVE_SEEDING\r\n//#define    MCUXCL_FEATURE_ELS_HW_OUT_SLOTS\r\n//#define    MCUXCL_FEATURE_ELS_LINK_BASE_ADDRESS\r\n//#define    MCUXCL_FEATURE_ELS_ENTROPY_TEST\r\n//#define    MCUXCL_FEATURE_GLIKEY\r\n//#define    MCUXCL_FEATURE_GLIKEY_STEPS_4\r\n//#define    MCUXCL_FEATURE_GLIKEY_STEPS_8\r\n//#define    MCUXCL_FEATURE_GLIKEY_GETVERSION\r\n//#define    MCUXCL_FEATURE_DMA\r\n//#define    MCUXCL_FEATURE_DMA_SGI_HANDSHAKE\r\n//#define    MCUXCL_FEATURE_SGI\r\n//#define    MCUXCL_FEATURE_SGI_AUTOMODE\r\n//#define    MCUXCL_FEATURE_SGI_AUTOMODE_WORKAROUND_READ_FULL_DATOUT\r\n//#define    MCUXCL_FEATURE_SGI_HAS_EXTERNAL_KEYBANKS\r\n//#define    MCUXCL_FEATURE_SAFO\r\n//#define    MCUXCL_FEATURE_AEAD_CONTEXT_INTEGRITY_PROTECTION\r\n//#define    MCUXCL_FEATURE_AEAD_CRYPT\r\n//#define    MCUXCL_FEATURE_AEAD_ENCRYPT_DECRYPT\r\n//#define    MCUXCL_FEATURE_AEAD_ONESHOT\r\n//#define    MCUXCL_FEATURE_AEAD_MULTIPART\r\n//#define    MCUXCL_FEATURE_AEAD_SELFTEST\r\n//#define    MCUXCL_FEATURE_AEADMODES_SW\r\n//#define    MCUXCL_FEATURE_AEADMODES_GCM\r\n//#define    MCUXCL_FEATURE_AEADMODES_CCM\r\n//#define    MCUXCL_FEATURE_AEADMODES_CCMSTAR\r\n//#define    MCUXCL_FEATURE_AEADMODES_EAX\r\n//#define    MCUXCL_FEATURE_AES128\r\n//#define    MCUXCL_FEATURE_AES192\r\n//#define    MCUXCL_FEATURE_AES256\r\n//#define    MCUXCL_FEATURE_AES_SW\r\n//#define    MCUXCL_FEATURE_1KDES\r\n//#define    MCUXCL_FEATURE_2K3DES\r\n//#define    MCUXCL_FEATURE_3K3DES\r\n//#define    MCUXCL_FEATURE_DES_SW\r\n//#define    MCUXCL_FEATURE_BUFFER_USE_OBJECT\r\n//#define    MCUXCL_FEATURE_BUFFER_USE_POINTER\r\n//#define    MCUXCL_FEATURE_BUFFER_SCATTER_GATHER\r\n//#define    MCUXCL_FEATURE_CIPHER_CONTEXT_INTEGRITY_PROTECTION\r\n//#define    MCUXCL_FEATURE_CIPHER_CRYPT\r\n//#define    MCUXCL_FEATURE_CIPHER_ENCRYPT_DECRYPT\r\n//#define    MCUXCL_FEATURE_CIPHER_ONESHOT\r\n//#define    MCUXCL_FEATURE_CIPHER_MULTIPART\r\n//#define    MCUXCL_FEATURE_CIPHER_RSA_ENCRYPT\r\n//#define    MCUXCL_FEATURE_CIPHER_RSA_DECRYPT\r\n//#define    MCUXCL_FEATURE_CIPHER_SELFTEST\r\n//#define    MCUXCL_FEATURE_CIPHERMODES_ECB\r\n//#define    MCUXCL_FEATURE_CIPHERMODES_CBC\r\n//#define    MCUXCL_FEATURE_CIPHERMODES_CTR\r\n//#define    MCUXCL_FEATURE_CIPHERMODES_CFB\r\n//#define    MCUXCL_FEATURE_CIPHERMODES_OFB\r\n//#define    MCUXCL_FEATURE_CIPHERMODES_XTS\r\n//#define    MCUXCL_FEATURE_CIPHERMODES_DMA_BLOCKING\r\n//#define    MCUXCL_FEATURE_CIPHERMODES_DMA_NONBLOCKING\r\n//#define    MCUXCL_FEATURE_CIPHERMODES_SW\r\n//#define    MCUXCL_FEATURE_CRC_HW\r\n//#define    MCUXCL_FEATURE_CRC_SW\r\n//#define    MCUXCL_FEATURE_CRC_CRC32\r\n//#define    MCUXCL_FEATURE_ECC\r\n//#define    MCUXCL_FEATURE_ECC_STRENGTH_CHECK\r\n//#define    MCUXCL_FEATURE_ECC_INTERNAL\r\n//#define    MCUXCL_FEATURE_ECC_EXTERNAL\r\n//#define    MCUXCL_FEATURE_ECC_WEIERSTRASS\r\n//#define    MCUXCL_FEATURE_ECC_TWISTEDEDWARDS\r\n//#define    MCUXCL_FEATURE_ECC_MONTGOMERY\r\n//#define    MCUXCL_FEATURE_ECC_VERIFY_P384\r\n//#define    MCUXCL_FEATURE_ECC_MONTDH\r\n//#define    MCUXCL_FEATURE_ECC_CURVE25519\r\n//#define    MCUXCL_FEATURE_ECC_CURVE448\r\n//#define    MCUXCL_FEATURE_ECC_EDDSA\r\n//#define    MCUXCL_FEATURE_ECC_ECDSA_DETERMINISTIC\r\n//#define    MCUXCL_FEATURE_ECC_ED25519\r\n//#define    MCUXCL_FEATURE_ECC_ED448\r\n//#define    MCUXCL_FEATURE_ECC_WEIERECC_GENERATECUSTOMDOMAINPARAMS\r\n//#define    MCUXCL_FEATURE_ECC_WEIERECC_DECODEPOINT\r\n//#define    MCUXCL_FEATURE_ECC_WEIERECC_KEYGENERATION\r\n//#define    MCUXCL_FEATURE_ECC_WEIERECC_KEYVALIDATION\r\n//#define    MCUXCL_FEATURE_ECC_ECDSA\r\n//#define    MCUXCL_FEATURE_ECC_ECDH\r\n//#define    MCUXCL_FEATURE_ECC_ARITHMETICOPERATION\r\n//#define    MCUXCL_FEATURE_ECC_ARITHMETICOPERATION_POINTADD\r\n//#define    MCUXCL_FEATURE_ECC_ARITHMETICOPERATION_POINTSUB\r\n//#define    MCUXCL_FEATURE_ECC_ARITHMETICOPERATION_SCALARMULT\r\n//#define    MCUXCL_FEATURE_ECC_ARITHMETICOPERATION_SECURESCALARMULT\r\n//#define    MCUXCL_FEATURE_ECC_SECPK1_CURVES\r\n//#define    MCUXCL_FEATURE_ECC_SECPR1_CURVES\r\n//#define    MCUXCL_FEATURE_ECC_NISTPR1_CURVES\r\n//#define    MCUXCL_FEATURE_ECC_ANSIX9P_CURVES\r\n//#define    MCUXCL_FEATURE_ECC_BRAINPOOLR1_CURVES\r\n//#define    MCUXCL_FEATURE_ECC_BRAINPOOLT1_CURVES\r\n//#define    MCUXCL_FEATURE_EXAMPLE_PKC_ENABLED\r\n//#define    MCUXCL_FEATURE_HASH\r\n//#define    MCUXCL_FEATURE_HASH_MULTIPART\r\n//#define    MCUXCL_FEATURE_HASH_ONESHOT\r\n//#define    MCUXCL_FEATURE_HASH_COMPARE\r\n//#define    MCUXCL_FEATURE_HASH_COMPUTE\r\n//#define    MCUXCL_FEATURE_HASH_IMPORT_EXPORT_STATE\r\n//#define    MCUXCL_FEATURE_HASH_SELFTEST\r\n//#define    MCUXCL_FEATURE_HASHMODES\r\n//#define    MCUXCL_FEATURE_HASH_C_MD5\r\n//#define    MCUXCL_FEATURE_HASH_C_SHA_1\r\n//#define    MCUXCL_FEATURE_HASH_C_SHA_224\r\n//#define    MCUXCL_FEATURE_HASH_C_SHA_256\r\n//#define    MCUXCL_FEATURE_HASH_C_SHA_384\r\n//#define    MCUXCL_FEATURE_HASH_C_SHA_512\r\n//#define    MCUXCL_FEATURE_HASH_C_SHA_512_224\r\n//#define    MCUXCL_FEATURE_HASH_C_SHA_512_256\r\n//#define    MCUXCL_FEATURE_HASH_C_SHA3_SHAKE\r\n//#define    MCUXCL_FEATURE_HASH_C_SHA3\r\n//#define    MCUXCL_FEATURE_HASH_ELS\r\n//#define    MCUXCL_FEATURE_HASH_SGI\r\n//#define    MCUXCL_FEATURE_HASH_SGI_SHA_224\r\n//#define    MCUXCL_FEATURE_HASH_SGI_SHA_256\r\n//#define    MCUXCL_FEATURE_HASH_SGI_SHA_384\r\n//#define    MCUXCL_FEATURE_HASH_SGI_SHA_512\r\n//#define    MCUXCL_FEATURE_HASH_SGI_SHA_512_224\r\n//#define    MCUXCL_FEATURE_HASH_SGI_SHA_512_256\r\n//#define    MCUXCL_FEATURE_HASH_SGI_MIYAGUCHI_PRENEEL\r\n//#define    MCUXCL_FEATURE_HASH_LTC\r\n//#define    MCUXCL_FEATURE_HASH_LTC_SHA3_224\r\n//#define    MCUXCL_FEATURE_HASH_LTC_SHA3_256\r\n//#define    MCUXCL_FEATURE_HASH_LTC_SHA3_384\r\n//#define    MCUXCL_FEATURE_HASH_LTC_SHA3_512\r\n//#define    MCUXCL_FEATURE_HASH_LTC_SHA3_SHAKE_128\r\n//#define    MCUXCL_FEATURE_HASH_LTC_SHA3_SHAKE_256\r\n//#define    MCUXCL_FEATURE_HASH_LTC_SHA3_CSHAKE_128\r\n//#define    MCUXCL_FEATURE_HASH_LTC_SHA3_CSHAKE_256\r\n//#define    MCUXCL_FEATURE_HASH_RANGER5_LIB\r\n//#define    MCUXCL_FEATURE_HASH_DMA_BLOCKING\r\n//#define    MCUXCL_FEATURE_HASH_DMA_NONBLOCKING\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA_1\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA_224\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA_256\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA_384\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA_512\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA_512_224\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA_512_256\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA3\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA3_224\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA3_256\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA3_384\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA3_512\r\n//#define    MCUXCL_FEATURE_HASH_SGI_COUNT_WORKAROUND\r\n//#define    MCUXCL_FEATURE_KEY_DERIVATION\r\n//#define    MCUXCL_FEATURE_KEY_DERIVATION_NIST_SP800_108\r\n//#define    MCUXCL_FEATURE_KEY_DERIVATION_NIST_SP800_56C\r\n//#define    MCUXCL_FEATURE_KEY_DERIVATION_ISOIEC_18033_2\r\n//#define    MCUXCL_FEATURE_KEY_DERIVATION_ANSI_X9_63\r\n//#define    MCUXCL_FEATURE_KEY_DERIVATION_RFC5246_PRF\r\n//#define    MCUXCL_FEATURE_KEY_DERIVATION_HKDF\r\n//#define    MCUXCL_FEATURE_KEY_DERIVATION_PBKDF2\r\n//#define    MCUXCL_FEATURE_KEY_DERIVATION_IKEV2\r\n//#define    MCUXCL_FEATURE_KEY_GENERATION\r\n//#define    MCUXCL_FEATURE_KEY_GENERATION_RSA\r\n//#define    MCUXCL_FEATURE_KEY_AGREEMENT\r\n//#define    MCUXCL_FEATURE_KEY_PROTECT\r\n//#define    MCUXCL_FEATURE_KEY_SELFTEST\r\n//#define    MCUXCL_FEATURE_KEY_VALIDATION\r\n//#define    MCUXCL_FEATURE_KEM_KYBER_ENCAPS\r\n//#define    MCUXCL_FEATURE_KEM_KYBER_DECAPS\r\n//#define    MCUXCL_FEATURE_KYBER\r\n//#define    MCUXCL_FEATURE_LTC\r\n//#define    MCUXCL_FEATURE_MAC\r\n//#define    MCUXCL_FEATURE_MAC_COMPARE\r\n//#define    MCUXCL_FEATURE_MAC_COMPUTE\r\n//#define    MCUXCL_FEATURE_MAC_CONTEXT_INTEGRITY_PROTECTION\r\n//#define    MCUXCL_FEATURE_MAC_MULTIPART\r\n//#define    MCUXCL_FEATURE_MAC_ONESHOT\r\n//#define    MCUXCL_FEATURE_MAC_SELFTEST\r\n//#define    MCUXCL_FEATURE_MACMODES_CBCMAC\r\n//#define    MCUXCL_FEATURE_MACMODES_CMAC\r\n//#define    MCUXCL_FEATURE_MACMODES_SGI_CMAC_SUB_KEYS\r\n//#define    MCUXCL_FEATURE_MACMODES_GMAC\r\n//#define    MCUXCL_FEATURE_MACMODES_KMAC\r\n//#define    MCUXCL_FEATURE_MACMODES_XCBCMAC\r\n//#define    MCUXCL_FEATURE_MACMODES_DMA_BLOCKING\r\n//#define    MCUXCL_FEATURE_MACMODES_DMA_NONBLOCKING\r\n//#define    MCUXCL_FEATURE_MAC_SIPHASH\r\n//#define    MCUXCL_FEATURE_HMAC_ELS\r\n//#define    MCUXCL_FEATURE_HMAC_SW\r\n//#define    MCUXCL_FEATURE_MATH_SECMODEXP_RISCV_SFRMASKING\r\n//#define    MCUXCL_FEATURE_MATH_MOD_SQUAREROOT\r\n//#define    MCUXCL_FEATURE_PADDING_ISO9797_1_M1\r\n//#define    MCUXCL_FEATURE_PADDING_ISO9797_1_M2\r\n//#define    MCUXCL_FEATURE_PADDING_PKCS7\r\n//#define    MCUXCL_FEATURE_PADDING_REMOVAL\r\n//#define    MCUXCL_FEATURE_PKC_CRR_HEADER\r\n//#define    MCUXCL_FEATURE_PKC_RAM_4KB\r\n//#define    MCUXCL_FEATURE_PKC_RAM_8KB\r\n//#define    MCUXCL_FEATURE_PKC_PKCRAM_NO_UNALIGNED_ACCESS\r\n//#define    MCUXCL_FEATURE_PKC_PKCRAM_EXPLICIT_INIT_WORKAROUND\r\n//#define    MCUXCL_FEATURE_PKC_BLOCK_CPU_WORKAROUND\r\n//#define    MCUXCL_FEATURE_PKC_CPUPKC_ARBITRATION_WORKAROUND\r\n//#define    MCUXCL_FEATURE_PKC_FLEX_MC\r\n//#define    MCUXCL_FEATURE_PKC_PW_READY\r\n//#define    MCUXCL_FEATURE_PKC_SFR_MASK\r\n//#define    MCUXCL_FEATURE_PRNG\r\n//#define    MCUXCL_FEATURE_PRNG_ELS\r\n//#define    MCUXCL_FEATURE_PRNG_SCM\r\n//#define    MCUXCL_FEATURE_PRNG_NONE\r\n//#define    MCUXCL_FEATURE_RANDOM\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_ELSMODE\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_NORMALMODE\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_PATCHMODE\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_TESTMODE\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_CTRDRBG\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_HMACDRBG\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_PR_DISABLED\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_PTG3\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_SECSTRENGTH_128\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_SECSTRENGTH_192\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_SECSTRENGTH_256\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_DERIVATION_FUNCTION\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_NO_DERIVATION_FUNCTION\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_CTRDRBG_ELS\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_CTRDRBG_SGI\r\n//#define    MCUXCL_FEATURE_RSA_SIGN\r\n//#define    MCUXCL_FEATURE_RSA_VERIFY\r\n//#define    MCUXCL_FEATURE_RSA_KEYGENERATION\r\n//#define    MCUXCL_FEATURE_RSA_NOHWACC_2K\r\n//#define    MCUXCL_FEATURE_RSA_NOHWACC_3K\r\n//#define    MCUXCL_FEATURE_RSA_VERIFY_SWONLY\r\n//#define    MCUXCL_FEATURE_RSA_STRENGTH_CHECK\r\n//#define    MCUXCL_FEATURE_RSA_RSASSA_PSS\r\n//#define    MCUXCL_FEATURE_RSA_RSASSA_PKCS1v15\r\n//#define    MCUXCL_FEATURE_RSA_RSAES_OAEP\r\n//#define    MCUXCL_FEATURE_RSA_RSAES_PKCS1v15\r\n//#define    MCUXCL_FEATURE_RSA_NOEMSA\r\n//#define    MCUXCL_FEATURE_RSA_8K_KEYS\r\n//#define    MCUXCL_FEATURE_RSA_NOEME\r\n//#define    MCUXCL_FEATURE_RSA_COMPARE_NOEMSA\r\n//#define    MCUXCL_FEATURE_SESSION_HAS_RANDOM\r\n//#define    MCUXCL_FEATURE_SESSION_HAS_RTF\r\n//#define    MCUXCL_FEATURE_SESSION_PKCWA_CHECK\r\n//#define    MCUXCL_FEATURE_SESSION_JOBS\r\n//#define    MCUXCL_FEATURE_SESSION_ENTRYEXIT_REGULARRETURN\r\n//#define    MCUXCL_FEATURE_SESSION_ENTRYEXIT_EARLYEXIT\r\n//#define    MCUXCL_FEATURE_SESSION_SECURITYOPTIONS\r\n//#define    MCUXCL_FEATURE_SESSION_SECURITYOPTIONS_DUMMYCYCLES\r\n//#define    MCUXCL_FEATURE_SESSION_SECURITYOPTIONS_ADDITIONAL_SWCOMP\r\n//#define    MCUXCL_FEATURE_SESSION_SECURITYOPTIONS_DOUBLE_VERIFICATION_SIGNATURE\r\n//#define    MCUXCL_FEATURE_SIGNATURE_MULTIPART\r\n//#define    MCUXCL_FEATURE_SIGNATURE_ONESHOT\r\n//#define    MCUXCL_FEATURE_SIGNATURE_RSA_SIGN\r\n//#define    MCUXCL_FEATURE_SIGNATURE_RSA_VERIFY\r\n//#define    MCUXCL_FEATURE_SIGNATURE_SIGN\r\n//#define    MCUXCL_FEATURE_SIGNATURE_VERIFY\r\n//#define    MCUXCL_FEATURE_SIGNATURE_SELFTEST\r\n//#define    MCUXCL_FEATURE_SIGNATURE_CONTEXT_INTEGRITY_PROTECTION\r\n//#define    MCUXCL_FEATURE_SIGNATURE_FAST_VERIFICATION\r\n//#define    MCUXCL_FEATURE_SIGNATURE_DILITHIUM_SIGN\r\n//#define    MCUXCL_FEATURE_SIGNATURE_DILITHIUM_VERIFY\r\n//#define    MCUXCL_FEATURE_TRNG_CRR_HEADER\r\n//#define    MCUXCL_FEATURE_TRNG_ELS\r\n//#define    MCUXCL_FEATURE_TRNG_SA_TRNG\r\n//#define    MCUXCL_FEATURE_TRNG_SA_TRNG_256\r\n//#define    MCUXCL_FEATURE_TRNG_SA_TRNG_512\r\n//#define    MCUXCL_FEATURE_TRNG_SA_TRNG_DUAL_OSCILLATOR_MODE\r\n//#define    MCUXCL_FEATURE_XOF_ONESHOT\r\n//#define    MCUXCL_FEATURE_XOF_MULTIPART\r\n//#define    MCUXCL_FEATURE_XOF_C_SHAKE_128\r\n//#define    MCUXCL_FEATURE_XOF_C_SHAKE_256\r\n//#define    MCUXCL_FEATURE_XOF_LTC_SHAKE_128\r\n//#define    MCUXCL_FEATURE_XOF_LTC_SHAKE_256\r\n//#define    MCUXCL_FEATURE_XOF_LTC_CSHAKE_128\r\n//#define    MCUXCL_FEATURE_XOF_LTC_CSHAKE_256\r\n//#define    MCUXCL_FEATURE_CSSL_FP_INCLUDE_SECURE_COUNTER\r\n//#define    MCUXCL_FEATURE_CSSL_FP_INCLUDE_CODE_SIGNATURE\r\n//#define    MCUXCL_FEATURE_CSSL_FP_INCLUDE_NONE\r\n//#define    MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER\r\n//#define    MCUXCL_FEATURE_CSSL_FP_USE_CODE_SIGNATURE\r\n//#define    MCUXCL_FEATURE_CSSL_FP_USE_NONE\r\n//#define    MCUXCL_FEATURE_CSSL_FP_EXCLUDE_COVERITY_PRAGMAS\r\n//#define    MCUXCL_FEATURE_CSSL_ARM_M0\r\n//#define    MCUXCL_FEATURE_CSSL_MEMORY_ENABLE_COPY\r\n//#define    MCUXCL_FEATURE_CSSL_MEMORY_ENABLE_XOR\r\n//#define    MCUXCL_FEATURE_CSSL_MEMORY_ENABLE_SET\r\n//#define    MCUXCL_FEATURE_CSSL_MEMORY_ENABLE_COMPARE\r\n//#define    MCUXCL_FEATURE_CSSL_MEMORY_ENABLE_CLEAR\r\n//#define    MCUXCL_FEATURE_CSSL_MEMORY_C_FALLBACK\r\n//#define    MCUXCL_FEATURE_CSSL_MEMORY_ENABLE_NORMAL_OPERATION_RISCV\r\n//#define    MCUXCL_FEATURE_CSSL_MEMORY_ENABLE_SECURE_OPERATION_RISCV\r\n//#define    MCUXCL_FEATURE_CSSL_SC_INCLUDE_HYBRID_LOCAL_CDOG\r\n//#define    MCUXCL_FEATURE_CSSL_SC_INCLUDE_HW_CDOG\r\n//#define    MCUXCL_FEATURE_CSSL_SC_INCLUDE_HW_SCM\r\n//#define    MCUXCL_FEATURE_CSSL_SC_INCLUDE_HW_S3SCM\r\n//#define    MCUXCL_FEATURE_CSSL_SC_INCLUDE_SW_LOCAL\r\n//#define    MCUXCL_FEATURE_CSSL_SC_INCLUDE_SW_CALLBACK\r\n//#define    MCUXCL_FEATURE_CSSL_SC_INCLUDE_SW_CONTEXT\r\n//#define    MCUXCL_FEATURE_CSSL_SC_INCLUDE_SW_GLOBAL\r\n//#define    MCUXCL_FEATURE_CSSL_SC_INCLUDE_NONE\r\n//#define    MCUXCL_FEATURE_CSSL_SC_USE_HYBRID_LOCAL_CDOG\r\n//#define    MCUXCL_FEATURE_CSSL_SC_USE_HW_CDOG\r\n//#define    MCUXCL_FEATURE_CSSL_SC_USE_HW_SCM\r\n//#define    MCUXCL_FEATURE_CSSL_SC_USE_HW_S3SCM\r\n//#define    MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL\r\n//#define    MCUXCL_FEATURE_CSSL_SC_USE_SW_CALLBACK\r\n//#define    MCUXCL_FEATURE_CSSL_SC_USE_SW_CONTEXT\r\n//#define    MCUXCL_FEATURE_CSSL_SC_USE_SW_GLOBAL\r\n//#define    MCUXCL_FEATURE_CSSL_SC_USE_NONE\r\n//#define    MCUXCL_FEATURE_CSSL_SC_RISCV_ASM\r\n//#define    MCUXCL_FEATURE_CSSL_DI_USE_SECURE_COUNTER\r\n//#define    MCUXCL_FEATURE_CSSL_DI_USE_NONE\r\n//#define    MCUXCL_FEATURE_CSSL_MEMORY_PRNG_STUB\r\n//#define    MCUXCL_FEATURE_SM4_CCM\r\n//#define    MCUXCL_FEATURE_CIPHERMODES_SM4\r\n//#define    MCUXCL_FEATURE_HASH_HW_SM3\r\n//#define    MCUXCL_FEATURE_HASH_SW_SM3\r\n//#define    MCUXCL_FEATURE_HASH_SM3_RISCV\r\n//#define    MCUXCL_FEATURE_MACMODES_HMAC_SM3\r\n//#define    MCUXCL_FEATURE_MACMODES_CBCMAC_SM4\r\n//#define    MCUXCL_FEATURE_MACMODES_CMAC_SM4\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_OSCCA_TRNG\r\n//#define    MCUXCL_FEATURE_OSCCA_RNG_256\r\n//#define    MCUXCL_FEATURE_OSCCA_RNG_512\r\n//#define    MCUXCL_FEATURE_OSCCA_RNG_2_SOURCES\r\n//#define    MCUXCL_FEATURE_SM2_INTERNAL\r\n//#define    MCUXCL_FEATURE_SM2_KEYGEN\r\n//#define    MCUXCL_FEATURE_SM2_CIPHER\r\n//#define    MCUXCL_FEATURE_SM2_SIGNATURE\r\n//#define    MCUXCL_FEATURE_SM2_KEYAGREEMENT\r\n//#define    MCUXCL_FEATURE_NO_LINKER_SCRIPT\r\n//#define    MCUXCL_FEATURE_CAAM_POINTER_SIZE_BITS_32\r\n//#define    MCUXCL_FEATURE_CAAM_POINTER_SIZE_BITS_64\r\n//#define    MCUXCL_FEATURE_PROJECT_CLNS\r\n//#define    MCUXCL_FEATURE_SB3\r\n//#define    MCUXCL_FEATURE_SB3_384\r\n//#define    MCUXCL_FEATURE_RSA_ADAPTERCHECKS\r\n//#define    MCUXCL_FEATURE_BINARY_DELIVERY\r\n//#define    MCUXCL_FEATURE_SOURCE_DELIVERY\r\n//#define    MCUXCL_FEATURE_KEEP_ECLIPSE_FORMATTER_CONTROL\r\n//#define    MCUXCL_FEATURE_KEEP_INTERNAL_COMMENTS\r\n//#define    MCUXCL_FEATURE_INTERNAL_INCLUDES_FLAG\r\n\r\n//commented defines for all enabled features \r\n//#define    MCUXCL_FEATURE_EXPORTED_FEATURE_HEADER\r\n//#define    MCUXCL_FEATURE_EXPORTED_PLATFORM_HEADERS\r\n//#define    MCUXCL_FEATURE_PLATFORM_RW61X\r\n//#define    MCUXCL_FEATURE_PLATFORM_MCXN\r\n//#define    MCUXCL_FEATURE_PLATFORM_LPC\r\n//#define    MCUXCL_FEATURE_PROJECT_VOLTA_ON_NIRVANA\r\n//#define    MCUXCL_FEATURE_PLATFORM_MIMXRT\r\n//#define    MCUXCL_FEATURE_PROJECT_BLACKBIRD\r\n//#define    MCUXCL_FEATURE_PROJECT_CSSL\r\n//#define    MCUXCL_FEATURE_PROJECT_NCCL\r\n//#define    MCUXCL_FEATURE_PROJECT_QUANTUM\r\n//#define    MCUXCL_FEATURE_PROJECT_SHARK\r\n//#define    MCUXCL_FEATURE_HW_ELS\r\n//#define    MCUXCL_FEATURE_HW_GDET\r\n//#define    MCUXCL_FEATURE_HW_GLIKEY\r\n//#define    MCUXCL_FEATURE_HW_PKC\r\n//#define    MCUXCL_FEATURE_HW_ROPUF\r\n//#define    MCUXCL_FEATURE_HW_SAFO_SM3\r\n//#define    MCUXCL_FEATURE_HW_SAFO_SM4\r\n//#define    MCUXCL_FEATURE_HW_SGI\r\n//#define    MCUXCL_FEATURE_HW_TRNG\r\n//#define    MCUXCL_FEATURE_HW_RISCV_ZBB\r\n//#define    MCUXCL_FEATURE_HW_RISCV_CSW\r\n//#define    MCUXCL_FEATURE_HW_CACHE_ENABLED\r\n//#define    MCUXCL_FEATURE_ELS\r\n//#define    MCUXCL_FEATURE_ELS_AEAD\r\n//#define    MCUXCL_FEATURE_ELS_API_INPUT_PARAM_CHECKS\r\n//#define    MCUXCL_FEATURE_ELS_CKDF\r\n//#define    MCUXCL_FEATURE_ELS_CKDF_SP80056C\r\n//#define    MCUXCL_FEATURE_ELS_CMAC\r\n//#define    MCUXCL_FEATURE_ELS_ECC_KEY_EXCHANGE\r\n//#define    MCUXCL_FEATURE_ELS_ECC_ECKXCH_ODD_EVEN\r\n//#define    MCUXCL_FEATURE_ELS_ECC_ECKXCH_ODD\r\n//#define    MCUXCL_FEATURE_ELS_GLITCHDETECTOR\r\n//#define    MCUXCL_FEATURE_ELS_HKDF\r\n//#define    MCUXCL_FEATURE_ELS_HMAC\r\n//#define    MCUXCL_FEATURE_ELS_HWCONFIG\r\n//#define    MCUXCL_FEATURE_ELS_KEY_MGMT_DELETE\r\n//#define    MCUXCL_FEATURE_ELS_KEY_MGMT_EXPORT\r\n//#define    MCUXCL_FEATURE_ELS_KEY_EXPORT_SW_DFA_PROTECTION\r\n//#define    MCUXCL_FEATURE_ELS_KEY_MGMT_KEYPROV\r\n//#define    MCUXCL_FEATURE_ELS_KEY_MGMT_KEYPROV_ROM\r\n//#define    MCUXCL_FEATURE_ELS_KEY_MGMT_KEYPROV_TEST\r\n//#define    MCUXCL_FEATURE_ELS_KEY_MGMT_KEYPROV_ROM_TEST\r\n//#define    MCUXCL_FEATURE_ELS_KEY_MGMT_KEYPROV_DUK_UPDATE\r\n//#define    MCUXCL_FEATURE_ELS_KEY_MGMT_KEYPROV_DUK_UPDATE_TEST\r\n//#define    MCUXCL_FEATURE_ELS_RNG\r\n//#define    MCUXCL_FEATURE_ELS_SHA_224\r\n//#define    MCUXCL_FEATURE_ELS_SHA_256\r\n//#define    MCUXCL_FEATURE_ELS_SHA_384\r\n//#define    MCUXCL_FEATURE_ELS_SHA_512\r\n//#define    MCUXCL_FEATURE_ELS_SHA_512_224\r\n//#define    MCUXCL_FEATURE_ELS_SHA_512_256\r\n//#define    MCUXCL_FEATURE_ELS_SHA_DIRECT\r\n//#define    MCUXCL_FEATURE_ELS_SHA_DIRECT_MODE_FLAG\r\n//#define    MCUXCL_FEATURE_ELS_AES_WITH_SIDE_CHANNEL_PROTECTION\r\n//#define    MCUXCL_FEATURE_ELS_TLS\r\n//#define    MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS\r\n//#define    MCUXCL_FEATURE_ELS_NO_INTERNAL_STATE_FLAGS_CMAC\r\n//#define    MCUXCL_FEATURE_ELS_PUK_INTERNAL_BIT\r\n//#define    MCUXCL_FEATURE_ELS_PUK_INTERNAL\r\n//#define    MCUXCL_FEATURE_ELS_RND_RAW\r\n//#define    MCUXCL_FEATURE_ELS_PRND_INIT\r\n//#define    MCUXCL_FEATURE_ELS_DTRNG_PRV_CONFIG_LOAD\r\n//#define    MCUXCL_FEATURE_ELS_LOCKING\r\n//#define    MCUXCL_FEATURE_ELS_CMD_CRC\r\n//#define    MCUXCL_FEATURE_ELS_DMA_ADDRESS_READBACK\r\n//#define    MCUXCL_FEATURE_ELS_DMA_FINAL_ADDRESS_READBACK\r\n//#define    MCUXCL_FEATURE_ELS_RANDOMIZE_RFC3394_OUT\r\n//#define    MCUXCL_FEATURE_ELS_RESP_GEN\r\n//#define    MCUXCL_FEATURE_ELS_GET_FW_VERSION\r\n//#define    MCUXCL_FEATURE_ELS_CACHE_MAINTENANCE\r\n//#define    MCUXCL_FEATURE_ELS_ACCESS_PKCRAM_WORKAROUND\r\n//#define    MCUXCL_FEATURE_ELS_ACCESS_PKCRAM_WORKAROUND_M2\r\n//#define    MCUXCL_FEATURE_ELS_ITERATIVE_SEEDING\r\n//#define    MCUXCL_FEATURE_ELS_HW_OUT_SLOTS\r\n//#define    MCUXCL_FEATURE_ELS_LINK_BASE_ADDRESS\r\n//#define    MCUXCL_FEATURE_ELS_ENTROPY_TEST\r\n//#define    MCUXCL_FEATURE_GLIKEY\r\n//#define    MCUXCL_FEATURE_GLIKEY_STEPS_4\r\n//#define    MCUXCL_FEATURE_GLIKEY_STEPS_8\r\n//#define    MCUXCL_FEATURE_GLIKEY_GETVERSION\r\n//#define    MCUXCL_FEATURE_DMA\r\n//#define    MCUXCL_FEATURE_DMA_SGI_HANDSHAKE\r\n//#define    MCUXCL_FEATURE_SGI\r\n//#define    MCUXCL_FEATURE_SGI_AUTOMODE\r\n//#define    MCUXCL_FEATURE_SGI_AUTOMODE_WORKAROUND_READ_FULL_DATOUT\r\n//#define    MCUXCL_FEATURE_SGI_HAS_EXTERNAL_KEYBANKS\r\n//#define    MCUXCL_FEATURE_SAFO\r\n//#define    MCUXCL_FEATURE_AEAD_CONTEXT_INTEGRITY_PROTECTION\r\n//#define    MCUXCL_FEATURE_AEAD_CRYPT\r\n//#define    MCUXCL_FEATURE_AEAD_ENCRYPT_DECRYPT\r\n//#define    MCUXCL_FEATURE_AEAD_ONESHOT\r\n//#define    MCUXCL_FEATURE_AEAD_MULTIPART\r\n//#define    MCUXCL_FEATURE_AEAD_SELFTEST\r\n//#define    MCUXCL_FEATURE_AEADMODES_SW\r\n//#define    MCUXCL_FEATURE_AEADMODES_GCM\r\n//#define    MCUXCL_FEATURE_AEADMODES_CCM\r\n//#define    MCUXCL_FEATURE_AEADMODES_CCMSTAR\r\n//#define    MCUXCL_FEATURE_AEADMODES_EAX\r\n//#define    MCUXCL_FEATURE_AES128\r\n//#define    MCUXCL_FEATURE_AES192\r\n//#define    MCUXCL_FEATURE_AES256\r\n//#define    MCUXCL_FEATURE_AES_SW\r\n//#define    MCUXCL_FEATURE_1KDES\r\n//#define    MCUXCL_FEATURE_2K3DES\r\n//#define    MCUXCL_FEATURE_3K3DES\r\n//#define    MCUXCL_FEATURE_DES_SW\r\n//#define    MCUXCL_FEATURE_BUFFER_USE_OBJECT\r\n//#define    MCUXCL_FEATURE_BUFFER_USE_POINTER\r\n//#define    MCUXCL_FEATURE_BUFFER_SCATTER_GATHER\r\n//#define    MCUXCL_FEATURE_CIPHER_CONTEXT_INTEGRITY_PROTECTION\r\n//#define    MCUXCL_FEATURE_CIPHER_CRYPT\r\n//#define    MCUXCL_FEATURE_CIPHER_ENCRYPT_DECRYPT\r\n//#define    MCUXCL_FEATURE_CIPHER_ONESHOT\r\n//#define    MCUXCL_FEATURE_CIPHER_MULTIPART\r\n//#define    MCUXCL_FEATURE_CIPHER_RSA_ENCRYPT\r\n//#define    MCUXCL_FEATURE_CIPHER_RSA_DECRYPT\r\n//#define    MCUXCL_FEATURE_CIPHER_SELFTEST\r\n//#define    MCUXCL_FEATURE_CIPHERMODES_ECB\r\n//#define    MCUXCL_FEATURE_CIPHERMODES_CBC\r\n//#define    MCUXCL_FEATURE_CIPHERMODES_CTR\r\n//#define    MCUXCL_FEATURE_CIPHERMODES_CFB\r\n//#define    MCUXCL_FEATURE_CIPHERMODES_OFB\r\n//#define    MCUXCL_FEATURE_CIPHERMODES_XTS\r\n//#define    MCUXCL_FEATURE_CIPHERMODES_DMA_BLOCKING\r\n//#define    MCUXCL_FEATURE_CIPHERMODES_DMA_NONBLOCKING\r\n//#define    MCUXCL_FEATURE_CIPHERMODES_SW\r\n//#define    MCUXCL_FEATURE_CRC_HW\r\n//#define    MCUXCL_FEATURE_CRC_SW\r\n//#define    MCUXCL_FEATURE_CRC_CRC32\r\n//#define    MCUXCL_FEATURE_ECC\r\n//#define    MCUXCL_FEATURE_ECC_STRENGTH_CHECK\r\n//#define    MCUXCL_FEATURE_ECC_INTERNAL\r\n//#define    MCUXCL_FEATURE_ECC_EXTERNAL\r\n//#define    MCUXCL_FEATURE_ECC_WEIERSTRASS\r\n//#define    MCUXCL_FEATURE_ECC_TWISTEDEDWARDS\r\n//#define    MCUXCL_FEATURE_ECC_MONTGOMERY\r\n//#define    MCUXCL_FEATURE_ECC_VERIFY_P384\r\n//#define    MCUXCL_FEATURE_ECC_MONTDH\r\n//#define    MCUXCL_FEATURE_ECC_CURVE25519\r\n//#define    MCUXCL_FEATURE_ECC_CURVE448\r\n//#define    MCUXCL_FEATURE_ECC_EDDSA\r\n//#define    MCUXCL_FEATURE_ECC_ECDSA_DETERMINISTIC\r\n//#define    MCUXCL_FEATURE_ECC_ED25519\r\n//#define    MCUXCL_FEATURE_ECC_ED448\r\n//#define    MCUXCL_FEATURE_ECC_WEIERECC_GENERATECUSTOMDOMAINPARAMS\r\n//#define    MCUXCL_FEATURE_ECC_WEIERECC_DECODEPOINT\r\n//#define    MCUXCL_FEATURE_ECC_WEIERECC_KEYGENERATION\r\n//#define    MCUXCL_FEATURE_ECC_WEIERECC_KEYVALIDATION\r\n//#define    MCUXCL_FEATURE_ECC_ECDSA\r\n//#define    MCUXCL_FEATURE_ECC_ECDH\r\n//#define    MCUXCL_FEATURE_ECC_ARITHMETICOPERATION\r\n//#define    MCUXCL_FEATURE_ECC_ARITHMETICOPERATION_POINTADD\r\n//#define    MCUXCL_FEATURE_ECC_ARITHMETICOPERATION_POINTSUB\r\n//#define    MCUXCL_FEATURE_ECC_ARITHMETICOPERATION_SCALARMULT\r\n//#define    MCUXCL_FEATURE_ECC_ARITHMETICOPERATION_SECURESCALARMULT\r\n//#define    MCUXCL_FEATURE_ECC_SECPK1_CURVES\r\n//#define    MCUXCL_FEATURE_ECC_SECPR1_CURVES\r\n//#define    MCUXCL_FEATURE_ECC_NISTPR1_CURVES\r\n//#define    MCUXCL_FEATURE_ECC_ANSIX9P_CURVES\r\n//#define    MCUXCL_FEATURE_ECC_BRAINPOOLR1_CURVES\r\n//#define    MCUXCL_FEATURE_ECC_BRAINPOOLT1_CURVES\r\n//#define    MCUXCL_FEATURE_EXAMPLE_PKC_ENABLED\r\n//#define    MCUXCL_FEATURE_HASH\r\n//#define    MCUXCL_FEATURE_HASH_MULTIPART\r\n//#define    MCUXCL_FEATURE_HASH_ONESHOT\r\n//#define    MCUXCL_FEATURE_HASH_COMPARE\r\n//#define    MCUXCL_FEATURE_HASH_COMPUTE\r\n//#define    MCUXCL_FEATURE_HASH_IMPORT_EXPORT_STATE\r\n//#define    MCUXCL_FEATURE_HASH_SELFTEST\r\n//#define    MCUXCL_FEATURE_HASHMODES\r\n//#define    MCUXCL_FEATURE_HASH_C_MD5\r\n//#define    MCUXCL_FEATURE_HASH_C_SHA_1\r\n//#define    MCUXCL_FEATURE_HASH_C_SHA_224\r\n//#define    MCUXCL_FEATURE_HASH_C_SHA_256\r\n//#define    MCUXCL_FEATURE_HASH_C_SHA_384\r\n//#define    MCUXCL_FEATURE_HASH_C_SHA_512\r\n//#define    MCUXCL_FEATURE_HASH_C_SHA_512_224\r\n//#define    MCUXCL_FEATURE_HASH_C_SHA_512_256\r\n//#define    MCUXCL_FEATURE_HASH_C_SHA3_SHAKE\r\n//#define    MCUXCL_FEATURE_HASH_C_SHA3\r\n//#define    MCUXCL_FEATURE_HASH_ELS\r\n//#define    MCUXCL_FEATURE_HASH_SGI\r\n//#define    MCUXCL_FEATURE_HASH_SGI_SHA_224\r\n//#define    MCUXCL_FEATURE_HASH_SGI_SHA_256\r\n//#define    MCUXCL_FEATURE_HASH_SGI_SHA_384\r\n//#define    MCUXCL_FEATURE_HASH_SGI_SHA_512\r\n//#define    MCUXCL_FEATURE_HASH_SGI_SHA_512_224\r\n//#define    MCUXCL_FEATURE_HASH_SGI_SHA_512_256\r\n//#define    MCUXCL_FEATURE_HASH_SGI_MIYAGUCHI_PRENEEL\r\n//#define    MCUXCL_FEATURE_HASH_LTC\r\n//#define    MCUXCL_FEATURE_HASH_LTC_SHA3_224\r\n//#define    MCUXCL_FEATURE_HASH_LTC_SHA3_256\r\n//#define    MCUXCL_FEATURE_HASH_LTC_SHA3_384\r\n//#define    MCUXCL_FEATURE_HASH_LTC_SHA3_512\r\n//#define    MCUXCL_FEATURE_HASH_LTC_SHA3_SHAKE_128\r\n//#define    MCUXCL_FEATURE_HASH_LTC_SHA3_SHAKE_256\r\n//#define    MCUXCL_FEATURE_HASH_LTC_SHA3_CSHAKE_128\r\n//#define    MCUXCL_FEATURE_HASH_LTC_SHA3_CSHAKE_256\r\n//#define    MCUXCL_FEATURE_HASH_RANGER5_LIB\r\n//#define    MCUXCL_FEATURE_HASH_DMA_BLOCKING\r\n//#define    MCUXCL_FEATURE_HASH_DMA_NONBLOCKING\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA_1\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA_224\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA_256\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA_384\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA_512\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA_512_224\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA_512_256\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA3\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA3_224\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA3_256\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA3_384\r\n//#define    MCUXCL_FEATURE_HASH_SECSHA3_512\r\n//#define    MCUXCL_FEATURE_HASH_SGI_COUNT_WORKAROUND\r\n//#define    MCUXCL_FEATURE_KEY_DERIVATION\r\n//#define    MCUXCL_FEATURE_KEY_DERIVATION_NIST_SP800_108\r\n//#define    MCUXCL_FEATURE_KEY_DERIVATION_NIST_SP800_56C\r\n//#define    MCUXCL_FEATURE_KEY_DERIVATION_ISOIEC_18033_2\r\n//#define    MCUXCL_FEATURE_KEY_DERIVATION_ANSI_X9_63\r\n//#define    MCUXCL_FEATURE_KEY_DERIVATION_RFC5246_PRF\r\n//#define    MCUXCL_FEATURE_KEY_DERIVATION_HKDF\r\n//#define    MCUXCL_FEATURE_KEY_DERIVATION_PBKDF2\r\n//#define    MCUXCL_FEATURE_KEY_DERIVATION_IKEV2\r\n//#define    MCUXCL_FEATURE_KEY_GENERATION\r\n//#define    MCUXCL_FEATURE_KEY_GENERATION_RSA\r\n//#define    MCUXCL_FEATURE_KEY_AGREEMENT\r\n//#define    MCUXCL_FEATURE_KEY_PROTECT\r\n//#define    MCUXCL_FEATURE_KEY_SELFTEST\r\n//#define    MCUXCL_FEATURE_KEY_VALIDATION\r\n//#define    MCUXCL_FEATURE_KEM_KYBER_ENCAPS\r\n//#define    MCUXCL_FEATURE_KEM_KYBER_DECAPS\r\n//#define    MCUXCL_FEATURE_KYBER\r\n//#define    MCUXCL_FEATURE_LTC\r\n//#define    MCUXCL_FEATURE_MAC\r\n//#define    MCUXCL_FEATURE_MAC_COMPARE\r\n//#define    MCUXCL_FEATURE_MAC_COMPUTE\r\n//#define    MCUXCL_FEATURE_MAC_CONTEXT_INTEGRITY_PROTECTION\r\n//#define    MCUXCL_FEATURE_MAC_MULTIPART\r\n//#define    MCUXCL_FEATURE_MAC_ONESHOT\r\n//#define    MCUXCL_FEATURE_MAC_SELFTEST\r\n//#define    MCUXCL_FEATURE_MACMODES_CBCMAC\r\n//#define    MCUXCL_FEATURE_MACMODES_CMAC\r\n//#define    MCUXCL_FEATURE_MACMODES_SGI_CMAC_SUB_KEYS\r\n//#define    MCUXCL_FEATURE_MACMODES_GMAC\r\n//#define    MCUXCL_FEATURE_MACMODES_KMAC\r\n//#define    MCUXCL_FEATURE_MACMODES_XCBCMAC\r\n//#define    MCUXCL_FEATURE_MACMODES_DMA_BLOCKING\r\n//#define    MCUXCL_FEATURE_MACMODES_DMA_NONBLOCKING\r\n//#define    MCUXCL_FEATURE_MAC_SIPHASH\r\n//#define    MCUXCL_FEATURE_HMAC_ELS\r\n//#define    MCUXCL_FEATURE_HMAC_SW\r\n//#define    MCUXCL_FEATURE_MATH_SECMODEXP_RISCV_SFRMASKING\r\n//#define    MCUXCL_FEATURE_MATH_MOD_SQUAREROOT\r\n//#define    MCUXCL_FEATURE_PADDING_ISO9797_1_M1\r\n//#define    MCUXCL_FEATURE_PADDING_ISO9797_1_M2\r\n//#define    MCUXCL_FEATURE_PADDING_PKCS7\r\n//#define    MCUXCL_FEATURE_PADDING_REMOVAL\r\n//#define    MCUXCL_FEATURE_PKC_CRR_HEADER\r\n//#define    MCUXCL_FEATURE_PKC_RAM_4KB\r\n//#define    MCUXCL_FEATURE_PKC_RAM_8KB\r\n//#define    MCUXCL_FEATURE_PKC_PKCRAM_NO_UNALIGNED_ACCESS\r\n//#define    MCUXCL_FEATURE_PKC_PKCRAM_EXPLICIT_INIT_WORKAROUND\r\n//#define    MCUXCL_FEATURE_PKC_BLOCK_CPU_WORKAROUND\r\n//#define    MCUXCL_FEATURE_PKC_CPUPKC_ARBITRATION_WORKAROUND\r\n//#define    MCUXCL_FEATURE_PKC_FLEX_MC\r\n//#define    MCUXCL_FEATURE_PKC_PW_READY\r\n//#define    MCUXCL_FEATURE_PKC_SFR_MASK\r\n//#define    MCUXCL_FEATURE_PRNG\r\n//#define    MCUXCL_FEATURE_PRNG_ELS\r\n//#define    MCUXCL_FEATURE_PRNG_SCM\r\n//#define    MCUXCL_FEATURE_PRNG_NONE\r\n//#define    MCUXCL_FEATURE_RANDOM\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_ELSMODE\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_NORMALMODE\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_PATCHMODE\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_TESTMODE\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_CTRDRBG\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_HMACDRBG\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_PR_DISABLED\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_PTG3\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_SECSTRENGTH_128\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_SECSTRENGTH_192\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_SECSTRENGTH_256\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_DERIVATION_FUNCTION\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_NO_DERIVATION_FUNCTION\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_CTRDRBG_ELS\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_CTRDRBG_SGI\r\n//#define    MCUXCL_FEATURE_RSA_SIGN\r\n//#define    MCUXCL_FEATURE_RSA_VERIFY\r\n//#define    MCUXCL_FEATURE_RSA_KEYGENERATION\r\n//#define    MCUXCL_FEATURE_RSA_NOHWACC_2K\r\n//#define    MCUXCL_FEATURE_RSA_NOHWACC_3K\r\n//#define    MCUXCL_FEATURE_RSA_VERIFY_SWONLY\r\n//#define    MCUXCL_FEATURE_RSA_STRENGTH_CHECK\r\n//#define    MCUXCL_FEATURE_RSA_RSASSA_PSS\r\n//#define    MCUXCL_FEATURE_RSA_RSASSA_PKCS1v15\r\n//#define    MCUXCL_FEATURE_RSA_RSAES_OAEP\r\n//#define    MCUXCL_FEATURE_RSA_RSAES_PKCS1v15\r\n//#define    MCUXCL_FEATURE_RSA_NOEMSA\r\n//#define    MCUXCL_FEATURE_RSA_8K_KEYS\r\n//#define    MCUXCL_FEATURE_RSA_NOEME\r\n//#define    MCUXCL_FEATURE_RSA_COMPARE_NOEMSA\r\n//#define    MCUXCL_FEATURE_SESSION_HAS_RANDOM\r\n//#define    MCUXCL_FEATURE_SESSION_HAS_RTF\r\n//#define    MCUXCL_FEATURE_SESSION_PKCWA_CHECK\r\n//#define    MCUXCL_FEATURE_SESSION_JOBS\r\n//#define    MCUXCL_FEATURE_SESSION_ENTRYEXIT_REGULARRETURN\r\n//#define    MCUXCL_FEATURE_SESSION_ENTRYEXIT_EARLYEXIT\r\n//#define    MCUXCL_FEATURE_SESSION_SECURITYOPTIONS\r\n//#define    MCUXCL_FEATURE_SESSION_SECURITYOPTIONS_DUMMYCYCLES\r\n//#define    MCUXCL_FEATURE_SESSION_SECURITYOPTIONS_ADDITIONAL_SWCOMP\r\n//#define    MCUXCL_FEATURE_SESSION_SECURITYOPTIONS_DOUBLE_VERIFICATION_SIGNATURE\r\n//#define    MCUXCL_FEATURE_SIGNATURE_MULTIPART\r\n//#define    MCUXCL_FEATURE_SIGNATURE_ONESHOT\r\n//#define    MCUXCL_FEATURE_SIGNATURE_RSA_SIGN\r\n//#define    MCUXCL_FEATURE_SIGNATURE_RSA_VERIFY\r\n//#define    MCUXCL_FEATURE_SIGNATURE_SIGN\r\n//#define    MCUXCL_FEATURE_SIGNATURE_VERIFY\r\n//#define    MCUXCL_FEATURE_SIGNATURE_SELFTEST\r\n//#define    MCUXCL_FEATURE_SIGNATURE_CONTEXT_INTEGRITY_PROTECTION\r\n//#define    MCUXCL_FEATURE_SIGNATURE_FAST_VERIFICATION\r\n//#define    MCUXCL_FEATURE_SIGNATURE_DILITHIUM_SIGN\r\n//#define    MCUXCL_FEATURE_SIGNATURE_DILITHIUM_VERIFY\r\n//#define    MCUXCL_FEATURE_TRNG_CRR_HEADER\r\n//#define    MCUXCL_FEATURE_TRNG_ELS\r\n//#define    MCUXCL_FEATURE_TRNG_SA_TRNG\r\n//#define    MCUXCL_FEATURE_TRNG_SA_TRNG_256\r\n//#define    MCUXCL_FEATURE_TRNG_SA_TRNG_512\r\n//#define    MCUXCL_FEATURE_TRNG_SA_TRNG_DUAL_OSCILLATOR_MODE\r\n//#define    MCUXCL_FEATURE_XOF_ONESHOT\r\n//#define    MCUXCL_FEATURE_XOF_MULTIPART\r\n//#define    MCUXCL_FEATURE_XOF_C_SHAKE_128\r\n//#define    MCUXCL_FEATURE_XOF_C_SHAKE_256\r\n//#define    MCUXCL_FEATURE_XOF_LTC_SHAKE_128\r\n//#define    MCUXCL_FEATURE_XOF_LTC_SHAKE_256\r\n//#define    MCUXCL_FEATURE_XOF_LTC_CSHAKE_128\r\n//#define    MCUXCL_FEATURE_XOF_LTC_CSHAKE_256\r\n//#define    MCUXCL_FEATURE_CSSL_FP_INCLUDE_SECURE_COUNTER\r\n//#define    MCUXCL_FEATURE_CSSL_FP_INCLUDE_CODE_SIGNATURE\r\n//#define    MCUXCL_FEATURE_CSSL_FP_INCLUDE_NONE\r\n//#define    MCUXCL_FEATURE_CSSL_FP_USE_SECURE_COUNTER\r\n//#define    MCUXCL_FEATURE_CSSL_FP_USE_CODE_SIGNATURE\r\n//#define    MCUXCL_FEATURE_CSSL_FP_USE_NONE\r\n//#define    MCUXCL_FEATURE_CSSL_FP_EXCLUDE_COVERITY_PRAGMAS\r\n//#define    MCUXCL_FEATURE_CSSL_ARM_M0\r\n//#define    MCUXCL_FEATURE_CSSL_MEMORY_ENABLE_COPY\r\n//#define    MCUXCL_FEATURE_CSSL_MEMORY_ENABLE_XOR\r\n//#define    MCUXCL_FEATURE_CSSL_MEMORY_ENABLE_SET\r\n//#define    MCUXCL_FEATURE_CSSL_MEMORY_ENABLE_COMPARE\r\n//#define    MCUXCL_FEATURE_CSSL_MEMORY_ENABLE_CLEAR\r\n//#define    MCUXCL_FEATURE_CSSL_MEMORY_C_FALLBACK\r\n//#define    MCUXCL_FEATURE_CSSL_MEMORY_ENABLE_NORMAL_OPERATION_RISCV\r\n//#define    MCUXCL_FEATURE_CSSL_MEMORY_ENABLE_SECURE_OPERATION_RISCV\r\n//#define    MCUXCL_FEATURE_CSSL_SC_INCLUDE_HYBRID_LOCAL_CDOG\r\n//#define    MCUXCL_FEATURE_CSSL_SC_INCLUDE_HW_CDOG\r\n//#define    MCUXCL_FEATURE_CSSL_SC_INCLUDE_HW_SCM\r\n//#define    MCUXCL_FEATURE_CSSL_SC_INCLUDE_HW_S3SCM\r\n//#define    MCUXCL_FEATURE_CSSL_SC_INCLUDE_SW_LOCAL\r\n//#define    MCUXCL_FEATURE_CSSL_SC_INCLUDE_SW_CALLBACK\r\n//#define    MCUXCL_FEATURE_CSSL_SC_INCLUDE_SW_CONTEXT\r\n//#define    MCUXCL_FEATURE_CSSL_SC_INCLUDE_SW_GLOBAL\r\n//#define    MCUXCL_FEATURE_CSSL_SC_INCLUDE_NONE\r\n//#define    MCUXCL_FEATURE_CSSL_SC_USE_HYBRID_LOCAL_CDOG\r\n//#define    MCUXCL_FEATURE_CSSL_SC_USE_HW_CDOG\r\n//#define    MCUXCL_FEATURE_CSSL_SC_USE_HW_SCM\r\n//#define    MCUXCL_FEATURE_CSSL_SC_USE_HW_S3SCM\r\n//#define    MCUXCL_FEATURE_CSSL_SC_USE_SW_LOCAL\r\n//#define    MCUXCL_FEATURE_CSSL_SC_USE_SW_CALLBACK\r\n//#define    MCUXCL_FEATURE_CSSL_SC_USE_SW_CONTEXT\r\n//#define    MCUXCL_FEATURE_CSSL_SC_USE_SW_GLOBAL\r\n//#define    MCUXCL_FEATURE_CSSL_SC_USE_NONE\r\n//#define    MCUXCL_FEATURE_CSSL_SC_RISCV_ASM\r\n//#define    MCUXCL_FEATURE_CSSL_DI_USE_SECURE_COUNTER\r\n//#define    MCUXCL_FEATURE_CSSL_DI_USE_NONE\r\n//#define    MCUXCL_FEATURE_CSSL_MEMORY_PRNG_STUB\r\n//#define    MCUXCL_FEATURE_SM4_CCM\r\n//#define    MCUXCL_FEATURE_CIPHERMODES_SM4\r\n//#define    MCUXCL_FEATURE_HASH_HW_SM3\r\n//#define    MCUXCL_FEATURE_HASH_SW_SM3\r\n//#define    MCUXCL_FEATURE_HASH_SM3_RISCV\r\n//#define    MCUXCL_FEATURE_MACMODES_HMAC_SM3\r\n//#define    MCUXCL_FEATURE_MACMODES_CBCMAC_SM4\r\n//#define    MCUXCL_FEATURE_MACMODES_CMAC_SM4\r\n//#define    MCUXCL_FEATURE_RANDOMMODES_OSCCA_TRNG\r\n//#define    MCUXCL_FEATURE_OSCCA_RNG_256\r\n//#define    MCUXCL_FEATURE_OSCCA_RNG_512\r\n//#define    MCUXCL_FEATURE_OSCCA_RNG_2_SOURCES\r\n//#define    MCUXCL_FEATURE_SM2_INTERNAL\r\n//#define    MCUXCL_FEATURE_SM2_KEYGEN\r\n//#define    MCUXCL_FEATURE_SM2_CIPHER\r\n//#define    MCUXCL_FEATURE_SM2_SIGNATURE\r\n//#define    MCUXCL_FEATURE_SM2_KEYAGREEMENT\r\n//#define    MCUXCL_FEATURE_NO_LINKER_SCRIPT\r\n//#define    MCUXCL_FEATURE_CAAM_POINTER_SIZE_BITS_32\r\n//#define    MCUXCL_FEATURE_CAAM_POINTER_SIZE_BITS_64\r\n//#define    MCUXCL_FEATURE_PROJECT_CLNS\r\n//#define    MCUXCL_FEATURE_SB3\r\n//#define    MCUXCL_FEATURE_SB3_384\r\n//#define    MCUXCL_FEATURE_RSA_ADAPTERCHECKS\r\n//#define    MCUXCL_FEATURE_BINARY_DELIVERY\r\n//#define    MCUXCL_FEATURE_SOURCE_DELIVERY\r\n//#define    MCUXCL_FEATURE_KEEP_ECLIPSE_FORMATTER_CONTROL\r\n//#define    MCUXCL_FEATURE_KEEP_INTERNAL_COMMENTS\r\n//#define    MCUXCL_FEATURE_INTERNAL_INCLUDES_FLAG\r\n\r\n//defines for exported features \r\n#define    MCUXCL_FEATURE_PLATFORM_RW61X          1\r\n#define    MCUXCL_FEATURE_HW_ROPUF          1\r\n#define    MCUXCL_FEATURE_HW_TRNG          1\r\n#define    MCUXCL_FEATURE_ELS_ECC_ECKXCH_ODD          1\r\n#define    MCUXCL_FEATURE_ELS_GLITCHDETECTOR          1\r\n#define    MCUXCL_FEATURE_ELS_HWCONFIG          1\r\n#define    MCUXCL_FEATURE_ELS_KEY_MGMT_KEYPROV_TEST          1\r\n#define    MCUXCL_FEATURE_ELS_GET_FW_VERSION          1\r\n#define    MCUXCL_FEATURE_ELS_ACCESS_PKCRAM_WORKAROUND          1\r\n#define    MCUXCL_FEATURE_ECC_STRENGTH_CHECK          1\r\n#define    MCUXCL_FEATURE_PKC_PKCRAM_NO_UNALIGNED_ACCESS          1\r\n#define    MCUXCL_FEATURE_RANDOMMODES_NORMALMODE          1\r\n#define    MCUXCL_FEATURE_RANDOMMODES_TESTMODE          1\r\n#define    MCUXCL_FEATURE_RANDOMMODES_CTRDRBG          1\r\n#define    MCUXCL_FEATURE_RANDOMMODES_PR_DISABLED          1\r\n#define    MCUXCL_FEATURE_RANDOMMODES_SECSTRENGTH_256          1\r\n#define    MCUXCL_FEATURE_RANDOMMODES_DERIVATION_FUNCTION          1\r\n#define    MCUXCL_FEATURE_RANDOMMODES_CTRDRBG_ELS          1\r\n#define    MCUXCL_FEATURE_RSA_STRENGTH_CHECK          1\r\n#define    MCUXCL_FEATURE_TRNG_SA_TRNG          1\r\n#define    MCUXCL_FEATURE_TRNG_SA_TRNG_256          1\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/platforms/rw61x/platform_specific_headers.h",
    "content": " /*--------------------------------------------------------------------------*/\r\n /* Copyright 2021 NXP                                                       */\r\n /*                                                                          */\r\n /* NXP Confidential. This software is owned or controlled by NXP and may    */\r\n /* only be used strictly in accordance with the applicable license terms.   */\r\n /* By expressly accepting such terms or by downloading, installing,         */\r\n /* activating and/or otherwise using the software, you are agreeing that    */\r\n /* you have read, and that you agree to comply with and are bound by, such  */\r\n /* license terms. If you do not agree to be bound by the applicable license */\r\n /* terms, then you may not retain, install, activate or otherwise use the   */\r\n /* software.                                                                */\r\n /*--------------------------------------------------------------------------*/\r\n \r\n #ifndef PLATFORM_SPECIFIC_HEADERS_H_ \r\n #define PLATFORM_SPECIFIC_HEADERS_H_ \r\n #pragma once\r\n \r\n #include \"mcuxClConfig.h\"\r\n #include \"mcuxCsslAnalysis.h\"\r\n \r\n MCUX_CSSL_ANALYSIS_START_PATTERN_EXTERNAL_HEADER()\r\n #include \"fsl_device_registers.h\" \r\n #include \"ip_platform.h\" \r\n #include \"ip_css_constants.h\" \r\n #include \"ip_css_design_configuration.h\" \r\n MCUX_CSSL_ANALYSIS_STOP_PATTERN_EXTERNAL_HEADER()\r\n \r\n #endif /*PLATFORM_SPECIFIC_HEADERS_H_*/ \r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/els_pkc/src/platforms/rw61x/readme.txt",
    "content": "Purpose of this file is to explain two different components for RW61x platform:\r\n\t- component.els_pkc.platform.rw61x_standalone_clib_gdet_sensor:\r\n\t\t- This component only provides gdet sensor related interface of clib. \r\n\t\t  It shall only be used within default examples of RW61x where entire clib-interface is not required.\r\n\t- component.els_pkc.platform.rw61x:\r\n\t\t- This component includes all features supported by Clib for RW61x platform."
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/imu_adapter/fsl_adapter_imu.c",
    "content": "/*\r\n * Copyright 2021 NXP\r\n * All rights reserved.\r\n *\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include \"fsl_adapter_imu_common.h\"\r\n#include \"fsl_adapter_imu.h\"\r\n#if defined(IMU_GDMA_ENABLE) && (IMU_GDMA_ENABLE == 1)\r\n#include \"fsl_gdma.h\"\r\n#endif\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n#if defined(configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY)\r\n#ifndef IMU_ISR_PRIORITY\r\n#define IMU_ISR_PRIORITY (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY)\r\n#endif\r\n#else\r\n#ifndef IMU_ISR_PRIORITY\r\n#define IMU_ISR_PRIORITY (2U)\r\n#endif\r\n#endif\r\n\r\n#ifndef IMU_LINK_WAIT_DELAY_MS\r\n#define IMU_LINK_WAIT_DELAY_MS 1U\r\n#endif\r\n\r\n#ifndef IMUMC_ALLOC_FAILED_DELAY_MS\r\n#define IMUMC_ALLOC_FAILED_DELAY_MS 1U\r\n#endif\r\n\r\n#ifndef IMUMC_ALLOC_RETRY_COUNT\r\n#define IMUMC_ALLOC_RETRY_COUNT 10U\r\n#endif\r\n\r\n#if defined(CPU2)\r\n#define os_InterruptMaskClear(irq_num) DisableIRQ((IRQn_Type)irq_num)\r\n#define os_InterruptMaskSet(irq_num)   EnableIRQ((IRQn_Type)irq_num)\r\n#define os_ClearPendingISR(irq_num)    NVIC_ClearPendingIRQ((IRQn_Type)irq_num)\r\n#else\r\n#define os_InterruptMaskClear(irq_num) DisableIRQ(irq_num)\r\n#define os_InterruptMaskSet(irq_num)   EnableIRQ(irq_num)\r\n#define os_ClearPendingISR(irq_num)    NVIC_ClearPendingIRQ(irq_num)\r\n#endif\r\n\r\n#if defined(IMU_GDMA_ENABLE) && (IMU_GDMA_ENABLE == 1)\r\n#define HAL_GDMA            GDMA\r\n#define HAL_GDMA_CH         0\r\n#define HAL_GDMA_IRQn       GDMA_IRQn\r\n#define HAL_GDMA_DONE_EVENT (1U << 0U)\r\n#define GDMA_ISR_PRIORITY   IMU_ISR_PRIORITY\r\n#define HAL_IMU_MEMCPY      HAL_ImuGdmaCopyData\r\n#else\r\n#define HAL_IMU_MEMCPY memcpy\r\n#endif\r\n\r\n/*******************************************************************************\r\n * Declaration\r\n ******************************************************************************/\r\n\r\n/*! IMU handle instance for each IMU link */\r\nstatic hal_imu_handle_t imuHandleCh[kIMU_LinkMax];\r\n\r\n/*! IMU interrput callback for each IMU link */\r\nstatic imu_irq_callback_t imuIrqCallback[kIMU_LinkMax];\r\n\r\n/*! IMU message sequence number */\r\nstatic uint8_t seq_num = 0;\r\n\r\n/*! IMU initializtion flag\r\n    bit 0: flag for IMU link #0\r\n    bit 1: flag for IMU link #1\r\n*/\r\nstatic uint8_t imu_init_flag = 0;\r\n\r\n/*! IMUMC initializtion flag\r\n */\r\nstatic uint8_t imumc_init_flag = 0;\r\n\r\n/*! imu task created flag\r\n */\r\nstatic uint8_t imu_task_flag = 0;\r\n\r\n#ifndef CPU2\r\n/*! Sleep flag address between CPU1 and CPU3 or CPU2 and CPU3 */\r\n#define IMU_SLEEP_FLAG13 0x4138248C\r\n#define IMU_SLEEP_FLAG23 0x443CFE88\r\n#define IMU_SLEEP_FLAG_ADDR(imuLinkId) \\\r\n    (((imuLinkId) == kIMU_LinkCpu1Cpu3) ? ((uint32_t *)IMU_SLEEP_FLAG13) : ((uint32_t *)IMU_SLEEP_FLAG23))\r\n#endif\r\n\r\n/*! wait imu task lock\r\n */\r\n#if (defined(USE_RTOS) && (USE_RTOS > 0U))\r\nstatic OSA_MUTEX_HANDLE_DEFINE(imu_task_lock);\r\n#endif\r\n/*******************************************************************************\r\n * Code\r\n ******************************************************************************/\r\n#if defined(CPU2)\r\nextern IMU_Msg_Wrapper_short_t __attribute__((aligned(4))) SQRAM_CPU12_MBOX;\r\nextern IMU_Msg_Wrapper_long_t __attribute__((aligned(4))) SQRAM_CPU23_MBOX;\r\nvolatile static IMU_Msg_Wrapper_short_t *imuMsgQ12 = &SQRAM_CPU12_MBOX;\r\nvolatile static IMU_Msg_Wrapper_long_t *imuMsgQ23  = &SQRAM_CPU23_MBOX;\r\n__attribute__((section(\".smu_cpu23_txq\"))) volatile static uint8_t __attribute__((aligned(4)))\r\nimumcTxBuf23[IMUMC_TXQ23_BUFSIZE][IMUMC_TXQ23_BUFLENGTH];\r\n\r\nstatic void HAL_ImuMain(void *argv);\r\nstatic OSA_TASK_HANDLE_DEFINE(ImuTaskHandle);\r\nstatic OSA_TASK_DEFINE(HAL_ImuMain, IMU_TASK_PRIORITY, 1, IMU_TASK_STACK_SIZE, 0);\r\nOSA_EVENT_HANDLE_DEFINE(ImuQFlagsRef);\r\n#else\r\n__attribute__((section(\".smu_cpu13_mbox\"))) static volatile IMU_Msg_Wrapper_long_t __attribute__((aligned(4)))\r\nSQRAM_CPU13_MBOX;\r\n__attribute__((section(\".smu_cpu23_mbox\"))) static volatile IMU_Msg_Wrapper_long_t __attribute__((aligned(4)))\r\nSQRAM_CPU23_MBOX;\r\nstatic volatile IMU_Msg_Wrapper_long_t *imuMsgQ13 = &SQRAM_CPU13_MBOX;\r\nstatic volatile IMU_Msg_Wrapper_long_t *imuMsgQ23 = &SQRAM_CPU23_MBOX;\r\n__attribute__((section(\".smu_cpu31_txq\"))) static volatile uint8_t __attribute__((aligned(4)))\r\nimumcTxBuf13[IMUMC_TXQ13_BUFSIZE][IMUMC_TXQ13_BUFLENGTH];\r\n__attribute__((section(\".smu_cpu32_txq\"))) static volatile uint8_t __attribute__((aligned(4)))\r\nimumcTxBuf23[IMUMC_TXQ23_BUFSIZE][IMUMC_TXQ23_BUFLENGTH];\r\n\r\nstatic void HAL_ImuMainCpu13(void *argv);\r\nstatic void HAL_ImuMainCpu23(void *argv);\r\n\r\nstatic OSA_TASK_HANDLE_DEFINE(ImuTaskHandleCpu13);\r\nstatic OSA_TASK_HANDLE_DEFINE(ImuTaskHandleCpu23);\r\nstatic OSA_TASK_DEFINE(HAL_ImuMainCpu13, IMU_TASK_PRIORITY, 1, IMU_TASK_STACK_SIZE, 0);\r\nstatic OSA_TASK_DEFINE(HAL_ImuMainCpu23, IMU_TASK_PRIORITY, 1, IMU_TASK_STACK_SIZE, 0);\r\nOSA_EVENT_HANDLE_DEFINE(ImuQ13FlagsRef);\r\nOSA_EVENT_HANDLE_DEFINE(ImuQ23FlagsRef);\r\n#endif\r\n\r\nOSA_EVENT_HANDLE_DEFINE(imumcQFlagsRef);\r\n\r\n#if defined(IMU_GDMA_ENABLE) && (IMU_GDMA_ENABLE == 1)\r\nstatic gdma_handle_t gdmaHandle;\r\nOSA_SEMAPHORE_HANDLE_DEFINE(gdmaSemHandle);\r\nOSA_EVENT_HANDLE_DEFINE(gdmaFlagsRef);\r\n#endif\r\n\r\n/**************Internal helper functions***********************/\r\n/// \\cond\r\n#if defined(IMU_GDMA_ENABLE) && (IMU_GDMA_ENABLE == 1)\r\nstatic void HAL_GdmaCallback(gdma_handle_t *handle, void *userData, uint32_t interrupts)\r\n{\r\n    if (0UL != (interrupts & kGDMA_TransferDoneFlag))\r\n    {\r\n        (void)OSA_EventSet((osa_event_handle_t)gdmaFlagsRef, HAL_GDMA_DONE_EVENT);\r\n    }\r\n}\r\n\r\nstatic void HAL_InitGdma(void)\r\n{\r\n    if (gdmaHandle.callback)\r\n        return;\r\n\r\n    GDMA_Init(HAL_GDMA);\r\n    GDMA_CreateHandle(&gdmaHandle, HAL_GDMA, HAL_GDMA_CH);\r\n    GDMA_SetCallback(&gdmaHandle, HAL_GdmaCallback, NULL);\r\n    OSA_SemaphoreCreate(gdmaSemHandle, 1U);\r\n    (void)OSA_EventCreate(gdmaFlagsRef, 1U);\r\n    NVIC_SetPriority(GDMA_IRQn, GDMA_ISR_PRIORITY);\r\n}\r\n\r\nvoid HAL_ImuGdmaCopyData(void *destAddr, void *srcAddr, uint32_t len)\r\n{\r\n    uint32_t Events;\r\n    gdma_channel_xfer_config_t xferConfig = {0};\r\n\r\n    xferConfig.srcAddr        = (uint32_t)srcAddr;\r\n    xferConfig.destAddr       = (uint32_t)destAddr;\r\n    xferConfig.linkListAddr   = 0; /* Don't use LLI */\r\n    xferConfig.ahbProt        = kGDMA_ProtPrevilegedMode;\r\n    xferConfig.srcBurstSize   = kGDMA_BurstSize16;\r\n    xferConfig.destBurstSize  = kGDMA_BurstSize16;\r\n    xferConfig.srcWidth       = kGDMA_TransferWidth1Byte;\r\n    xferConfig.destWidth      = kGDMA_TransferWidth1Byte;\r\n    xferConfig.srcAddrInc     = true;\r\n    xferConfig.destAddrInc    = true;\r\n    xferConfig.transferLen    = len;\r\n    xferConfig.enableLinkList = false;\r\n\r\n    if (KOSA_StatusSuccess == OSA_SemaphoreWait(gdmaSemHandle, osaWaitForever_c))\r\n    {\r\n        GDMA_SubmitTransfer(&gdmaHandle, &xferConfig);\r\n        GDMA_StartTransfer(&gdmaHandle);\r\n        /* Wait for GMDA transfer done. */\r\n        (void)OSA_EventWait((osa_event_handle_t)gdmaFlagsRef, HAL_GDMA_DONE_EVENT, 0, osaWaitForever_c, &Events);\r\n        OSA_SemaphorePost(gdmaSemHandle);\r\n    }\r\n}\r\n#endif\r\n\r\nstatic void HAL_ImuSetCpuReadyFlag(uint8_t cpuId)\r\n{\r\n}\r\n\r\nbool HAL_ImuGetCpuReadyFlag(uint8_t cpuId)\r\n{\r\n    return TRUE;\r\n}\r\n\r\n/*!\r\n * @brief\r\n * Create a new imumc endpoint, which can be used\r\n * for communication.\r\n *\r\n * @param handle            Imumc instance\r\n * @param addr              source endpoint address\r\n *\r\n * @return       RL_NULL if not found, node pointer containing the ept on success\r\n *\r\n */\r\nstatic hal_imumc_handle_t HAL_ImumcGetEndpointFromAddr(hal_imu_handle_t *imuHandle, uint32_t addr)\r\n{\r\n    LIST_ELEM_st *cur;\r\n    hal_imumc_state_t *pEnd;\r\n\r\n    assert(NULL != imuHandle);\r\n\r\n    list_for_each(cur, &imuHandle->eptList)\r\n    {\r\n        pEnd = (hal_imumc_state_t *)cur;\r\n        if (pEnd->local_addr == addr)\r\n        {\r\n            return pEnd;\r\n        }\r\n    }\r\n\r\n    return NULL;\r\n}\r\n\r\nstatic hal_imumc_handle_t HAL_ImumcCreateEndpoint(hal_imumc_handle_t handle)\r\n{\r\n    hal_imu_handle_t *imuHandle;\r\n    hal_imumc_state_t *imumcHandle;\r\n    assert(NULL != handle);\r\n\r\n    imumcHandle = (hal_imumc_state_t *)handle;\r\n    imuHandle   = &imuHandleCh[imumcHandle->imuLink];\r\n    // env_lock_mutex(imumcHandle->lock);\r\n    {\r\n        if (NULL == HAL_ImumcGetEndpointFromAddr(imuHandle, imumcHandle->local_addr))\r\n        {\r\n            LIST_addTail(&imuHandle->eptList, &imumcHandle->eptLink);\r\n            // env_unlock_mutex(imumcHandle->lock);\r\n            return imumcHandle;\r\n        }\r\n    }\r\n    // env_unlock_mutex(imumcHandle->lock);\r\n    return NULL;\r\n}\r\n\r\nstatic hal_imumc_status_t HAL_ImumcDestroyEndpoint(hal_imumc_handle_t handle)\r\n{\r\n    hal_imu_handle_t *imuHandle;\r\n    hal_imumc_state_t *imumcHandle;\r\n    assert(NULL != handle);\r\n\r\n    imumcHandle = (hal_imumc_state_t *)handle;\r\n    imuHandle   = &imuHandleCh[imumcHandle->imuLink];\r\n\r\n    // env_lock_mutex(imumcHandle->lock);\r\n    {\r\n        imumcHandle = HAL_ImumcGetEndpointFromAddr(imuHandle, imumcHandle->local_addr);\r\n\r\n        if (NULL == imumcHandle)\r\n        {\r\n            // env_unlock_mutex(imumcHandle->lock);\r\n            return kStatus_HAL_ImumcError;\r\n        }\r\n        LIST_remove(&imuHandle->eptList, &imumcHandle->eptLink);\r\n    }\r\n    // env_unlock_mutex(imumcHandle->lock);\r\n    return kStatus_HAL_ImumcSuccess;\r\n}\r\n\r\nstatic uint8_t *HAL_ImuGetWlanTxBuf(hal_imu_handle_t *imuHandle)\r\n{\r\n    uint32_t wlanTxBuf;\r\n    IMU_WLAN_TXQ_CTRL_st *wlanTxqCtl;\r\n\r\n    assert(NULL != imuHandle);\r\n    wlanTxqCtl = &imuHandle->wlanTxqCtl;\r\n\r\n    if (IS_WLAN_TXBQ_EMPTY(wlanTxqCtl))\r\n    {\r\n        return NULL;\r\n    }\r\n    else\r\n    {\r\n        wlanTxBuf = wlanTxqCtl->txBufQue[wlanTxqCtl->readIndex & IMU_TXQ_ENTRY_MASK];\r\n        INCR_WLAN_TXBQ_RD_INDEX(wlanTxqCtl, 1U);\r\n        return (uint8_t *)wlanTxBuf;\r\n    }\r\n}\r\n\r\nstatic hal_imumc_status_t HAL_ImuPutWlanTxBuf(hal_imu_handle_t *imuHandle, uint8_t *txBuf)\r\n{\r\n    hal_imumc_status_t state = kStatus_HAL_ImumcSuccess;\r\n    IMU_WLAN_TXQ_CTRL_st *wlanTxqCtl;\r\n\r\n    assert(NULL != imuHandle);\r\n    wlanTxqCtl = &imuHandle->wlanTxqCtl;\r\n\r\n    if (IS_WLAN_TXBQ_FULL(wlanTxqCtl))\r\n    {\r\n        state = kStatus_HAL_ImumcError;\r\n    }\r\n    else\r\n    {\r\n        wlanTxqCtl->txBufQue[wlanTxqCtl->writeIndex & IMU_TXQ_ENTRY_MASK] = (uint32_t)txBuf;\r\n        INCR_WLAN_TXBQ_WR_INDEX(wlanTxqCtl, 1U);\r\n    }\r\n\r\n    return state;\r\n}\r\n\r\nstatic uint8_t *HAL_ImumcGetTxBuf(hal_imu_handle_t *imuHandle)\r\n{\r\n    uint8_t *imumcTxBuf = NULL;\r\n    IMUMC_TXQ_CTRL_st *imumcTxqCtl;\r\n    OSA_SR_ALLOC();\r\n\r\n    assert(NULL != imuHandle);\r\n    imumcTxqCtl = &imuHandle->imumcTxqCtl;\r\n\r\n    OSA_ENTER_CRITICAL();\r\n\r\n    do\r\n    {\r\n        if (imuHandle->imuLink == (uint8_t)kIMU_LinkCpu2Cpu3)\r\n        {\r\n            if (IS_IMUMC_TXBQ23_EMPTY(imumcTxqCtl))\r\n            {\r\n                break;\r\n            }\r\n            else\r\n            {\r\n                imumcTxBuf = (uint8_t *)(imumcTxqCtl->txBufQue[imumcTxqCtl->readIndex & IMUMC_TXQ23_ENTRY_MASK]);\r\n                INCR_IMUMC_TXBQ23_RD_INDEX(imumcTxqCtl, 1U);\r\n            }\r\n        }\r\n        else\r\n        {\r\n            if (IS_IMUMC_TXBQ13_EMPTY(imumcTxqCtl))\r\n            {\r\n                break;\r\n            }\r\n            else\r\n            {\r\n                imumcTxBuf = (uint8_t *)(imumcTxqCtl->txBufQue[imumcTxqCtl->readIndex & IMUMC_TXQ13_ENTRY_MASK]);\r\n                INCR_IMUMC_TXBQ13_RD_INDEX(imumcTxqCtl, 1U);\r\n            }\r\n        }\r\n    } while (false);\r\n\r\n    OSA_EXIT_CRITICAL();\r\n\r\n    return imumcTxBuf;\r\n}\r\n\r\nstatic hal_imumc_status_t HAL_ImumcPutTxBuf(hal_imu_handle_t *imuHandle, uint8_t *txBuf)\r\n{\r\n    hal_imumc_status_t state = kStatus_HAL_ImumcSuccess;\r\n    IMUMC_TXQ_CTRL_st *imumcTxqCtl;\r\n    OSA_SR_ALLOC();\r\n\r\n    assert(NULL != imuHandle);\r\n    imumcTxqCtl = &imuHandle->imumcTxqCtl;\r\n\r\n    OSA_ENTER_CRITICAL();\r\n\r\n    if (imuHandle->imuLink == (uint8_t)kIMU_LinkCpu2Cpu3)\r\n    {\r\n        if (IS_IMUMC_TXBQ23_FULL(imumcTxqCtl))\r\n        {\r\n            state = kStatus_HAL_ImumcError;\r\n        }\r\n        else\r\n        {\r\n            imumcTxqCtl->txBufQue[imumcTxqCtl->writeIndex & IMUMC_TXQ23_ENTRY_MASK] = (uint32_t)txBuf;\r\n            INCR_IMUMC_TXBQ23_WR_INDEX(imumcTxqCtl, 1U);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        if (IS_IMUMC_TXBQ13_FULL(imumcTxqCtl))\r\n        {\r\n            state = kStatus_HAL_ImumcError;\r\n        }\r\n        else\r\n        {\r\n            imumcTxqCtl->txBufQue[imumcTxqCtl->writeIndex & IMUMC_TXQ13_ENTRY_MASK] = (uint32_t)txBuf;\r\n            INCR_IMUMC_TXBQ13_WR_INDEX(imumcTxqCtl, 1U);\r\n        }\r\n    }\r\n\r\n    OSA_EXIT_CRITICAL();\r\n\r\n    return state;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImuLinkIsUp(uint8_t imuLink)\r\n{\r\n    hal_imu_handle_t *imuHandle;\r\n\r\n    assert((uint8_t)kIMU_LinkMax > imuLink);\r\n    imuHandle = &imuHandleCh[imuLink];\r\n\r\n    if ((uint8_t)IMU_INITIALIZED == imuHandle->imuSyncState)\r\n    {\r\n        return kStatus_HAL_ImumcSuccess;\r\n    }\r\n    else\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n}\r\n\r\nvoid HAL_ImuResetWlanTxq(uint8_t imuLink)\r\n{\r\n    hal_imu_handle_t *imuHandle = NULL;\r\n\r\n    imuHandle                        = &imuHandleCh[imuLink];\r\n    imuHandle->wlanTxqCtl.writeIndex = 0;\r\n    imuHandle->wlanTxqCtl.readIndex  = 0;\r\n}\r\n\r\nstatic hal_imumc_status_t HAL_ImuSendMsgBlockingCommon(\r\n    hal_imu_handle_t *imuHandle, uint8_t type, uint8_t subtype, uint8_t *data, uint32_t length, bool lockTxFifo)\r\n{\r\n    IMU_Msg_t *imuMsg;\r\n    IMU_Msg_t localImuMsg;\r\n    OSA_SR_ALLOC();\r\n    int32_t ret = 0;\r\n\r\n    assert(NULL != imuHandle);\r\n    assert(IMU_PAYLOAD_SIZE >= length);\r\n\r\n    (void)memset((void *)&localImuMsg, 0, sizeof(IMU_Msg_t));\r\n\r\n    localImuMsg.Hdr.type     = type;\r\n    localImuMsg.Hdr.sub_type = subtype;\r\n    localImuMsg.Hdr.seq_num  = seq_num & (uint8_t)0xff;\r\n\r\n    switch ((imu_msg_type_t)type)\r\n    {\r\n        case IMU_MSG_CONTROL:\r\n            if (((uint8_t)IMU_MSG_CONTROL_TX_BUF_ADDR == subtype) ||\r\n                ((uint8_t)IMU_MSG_CONTROL_FREE_RX_BUF == subtype) ||\r\n                ((uint8_t)IMU_MSG_CONTROL_CMD_BUF_ADDR == subtype) || ((uint8_t)IMU_MSG_CONTROL_EVT_ACK == subtype) ||\r\n                ((uint8_t)IMU_MSG_CONTROL_COMMAND_RSP_ACK == subtype) ||\r\n                ((uint8_t)IMU_MSG_CONTROL_IMUMC_EPT_QUIRY == subtype) ||\r\n                ((uint8_t)IMU_MSG_CONTROL_IMUMC_EPT_QUIRY_RSP == subtype) ||\r\n                ((uint8_t)IMU_MSG_CONTROL_IMUMC_BUF_FREE == subtype) ||\r\n                ((uint8_t)IMU_MSG_CONTROL_EVT_DUMP == subtype) || ((uint8_t)IMU_MSG_CONTROL_ERROR == subtype))\r\n            {\r\n                (void)memcpy((void *)&localImuMsg.PayloadPtr[0], data, length << 2U);\r\n                localImuMsg.Hdr.length = (uint8_t)length;\r\n            }\r\n            break;\r\n        case IMU_MSG_COMMAND:\r\n            if (imuHandle->cmd_buffer_available)\r\n            {\r\n                localImuMsg.Hdr.length    = 1;\r\n                localImuMsg.PayloadPtr[0] = (uint32_t)imuHandle->cmd_buffer;\r\n            }\r\n            else\r\n            {\r\n                return kStatus_HAL_ImumcError;\r\n            }\r\n            break;\r\n        case IMU_MSG_TX_DATA:\r\n            localImuMsg.Hdr.length    = 1;\r\n            localImuMsg.PayloadPtr[0] = (uint32_t)data;\r\n            break;\r\n        case IMU_MSG_MULTI_TX_DATA:\r\n            (void)memcpy((void *)&localImuMsg.PayloadPtr[0], imuHandle->imuMsgBuf, (imuHandle->imuMsgBufIdx) << 2U);\r\n            localImuMsg.Hdr.length  = imuHandle->imuMsgBufIdx;\r\n            imuHandle->imuMsgBufIdx = 0;\r\n            break;\r\n        case IMU_MSG_IMUMC:\r\n            (void)memcpy((void *)&localImuMsg.PayloadPtr[0], data, length << 2U);\r\n            localImuMsg.Hdr.length = length;\r\n            break;\r\n        default:\r\n            // Do nothing for the commands without expansion.\r\n            break;\r\n    }\r\n\r\n    /* Added at 02/18/2022, in case second task overwriting imuMsg*/\r\n    while (IMU_TX_FIFO_ALMOST_FULL((imu_link_t)imuHandle->imuLink))\r\n    {\r\n    }\r\n\r\n    OSA_ENTER_CRITICAL();\r\n    imuMsg = (IMU_Msg_t *)&((IMU_MSG_SND_Q(imuHandle->imuLink))[IMU_WR_PTR(imuHandle->imuLink)]);\r\n    (void)memcpy(imuMsg, &localImuMsg, sizeof(IMU_Hdr_t) + ((uint32_t)localImuMsg.Hdr.length << 2U));\r\n    ret = IMU_SendMsgPtrBlocking((imu_link_t)imuHandle->imuLink, (uint32_t)imuMsg, lockTxFifo);\r\n    OSA_EXIT_CRITICAL();\r\n\r\n    if (0 == ret)\r\n    {\r\n        return kStatus_HAL_ImumcSuccess;\r\n    }\r\n    else\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n}\r\n\r\nstatic hal_imumc_status_t HAL_ImuSendMsgBlocking(\r\n    hal_imu_handle_t *imuHandle, uint8_t type, uint8_t subtype, uint8_t *data, uint32_t length)\r\n{\r\n    return HAL_ImuSendMsgBlockingCommon(imuHandle, type, subtype, data, length, FALSE);\r\n}\r\n\r\nstatic hal_imumc_status_t HAL_ImuSendSync(hal_imu_handle_t *imuHandle)\r\n{\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n    OSA_SR_ALLOC();\r\n    assert(NULL != imuHandle);\r\n\r\n    *IMU_MSG_CUR_MAGIC_P(imuHandle->imuLink) = IMU_SYNC_MAGIC_PATTERN;\r\n    while (IMU_SYNC_MAGIC_PATTERN != (*IMU_MSG_CUR_MAGIC_P((imu_link_t)imuHandle->imuLink)))\r\n    {\r\n    }\r\n\r\n    OSA_ENTER_CRITICAL();\r\n    if (((uint8_t)IMU_UNINITIALIZED == imuHandle->imuSyncState) &&\r\n        (IMU_SYNC_MAGIC_PATTERN == (*IMU_MSG_PEER_MAGIC_P(imuHandle->imuLink))))\r\n    {\r\n        if (kStatus_HAL_ImumcSuccess ==\r\n            HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL, (uint8_t)IMU_MSG_CONTROL_SYNC, NULL, 0))\r\n        {\r\n            imuHandle->imuSyncState = (uint8_t)IMU_INITIALIZING;\r\n            seq_num++;\r\n        }\r\n        else\r\n        {\r\n            imumcStatus = kStatus_HAL_ImumcError;\r\n        }\r\n    }\r\n    OSA_EXIT_CRITICAL();\r\n\r\n    return imumcStatus;\r\n}\r\n\r\nstatic hal_imumc_status_t HAL_ImuSendImumcEptQuiry(hal_imu_handle_t *imuHandle, uint32_t addr)\r\n{\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n    OSA_SR_ALLOC();\r\n    assert(NULL != imuHandle);\r\n\r\n    if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    OSA_ENTER_CRITICAL();\r\n    if (kStatus_HAL_ImumcSuccess == HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL,\r\n                                                           (uint8_t)IMU_MSG_CONTROL_IMUMC_EPT_QUIRY, (uint8_t *)&addr,\r\n                                                           1))\r\n    {\r\n        seq_num++;\r\n    }\r\n    else\r\n    {\r\n        imumcStatus = kStatus_HAL_ImumcError;\r\n    }\r\n    OSA_EXIT_CRITICAL();\r\n\r\n    return imumcStatus;\r\n}\r\n\r\nstatic hal_imumc_status_t HAL_ImuSendImumcEptQuiryRsp(hal_imu_handle_t *imuHandle, uint32_t addr, bool found)\r\n{\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n    uint32_t quiryRsp[2];\r\n    OSA_SR_ALLOC();\r\n\r\n    assert(NULL != imuHandle);\r\n\r\n    if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    OSA_ENTER_CRITICAL();\r\n    quiryRsp[0] = addr;\r\n    if (TRUE == found)\r\n    {\r\n        quiryRsp[1] = 1;\r\n    }\r\n    else\r\n    {\r\n        quiryRsp[1] = 0;\r\n    }\r\n\r\n    if (kStatus_HAL_ImumcSuccess == HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL,\r\n                                                           (uint8_t)IMU_MSG_CONTROL_IMUMC_EPT_QUIRY_RSP,\r\n                                                           (uint8_t *)&quiryRsp[0], 2))\r\n    {\r\n        seq_num++;\r\n    }\r\n    else\r\n    {\r\n        imumcStatus = kStatus_HAL_ImumcError;\r\n    }\r\n    OSA_EXIT_CRITICAL();\r\n\r\n    return imumcStatus;\r\n}\r\n\r\nstatic hal_imumc_status_t HAL_ImuSendImumcFreeBuf(hal_imu_handle_t *imuHandle, uint8_t *buf)\r\n{\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n    OSA_SR_ALLOC();\r\n    assert(NULL != imuHandle);\r\n\r\n    if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    OSA_ENTER_CRITICAL();\r\n    if (kStatus_HAL_ImumcSuccess ==\r\n        HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL, (uint8_t)IMU_MSG_CONTROL_IMUMC_BUF_FREE, buf, 1U))\r\n    {\r\n        seq_num++;\r\n    }\r\n    else\r\n    {\r\n        imumcStatus = kStatus_HAL_ImumcError;\r\n    }\r\n    OSA_EXIT_CRITICAL();\r\n\r\n    return imumcStatus;\r\n}\r\n\r\nstatic hal_imumc_status_t HAL_ImuSendEventAck(hal_imu_handle_t *imuHandle, uint8_t *rxBuf, uint8_t length)\r\n{\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n    OSA_SR_ALLOC();\r\n    assert(NULL != imuHandle);\r\n\r\n    if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    OSA_ENTER_CRITICAL();\r\n    if (kStatus_HAL_ImumcSuccess ==\r\n        HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL, (uint8_t)IMU_MSG_CONTROL_EVT_ACK, rxBuf, length))\r\n    {\r\n        seq_num++;\r\n    }\r\n    else\r\n    {\r\n        imumcStatus = kStatus_HAL_ImumcError;\r\n    }\r\n    OSA_EXIT_CRITICAL();\r\n\r\n    return imumcStatus;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImuSendEventDumpAck(imu_link_t link, uint8_t *rxBuf, uint8_t length)\r\n{\r\n    hal_imu_handle_t *imuHandle;\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n    OSA_SR_ALLOC();\r\n\r\n    assert(kIMU_LinkMax > link);\r\n    imuHandle = &imuHandleCh[link];\r\n\r\n    if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    OSA_ENTER_CRITICAL();\r\n    if (kStatus_HAL_ImumcSuccess ==\r\n        HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL, (uint8_t)IMU_MSG_CONTROL_EVT_DUMP, rxBuf, length))\r\n    {\r\n        seq_num++;\r\n    }\r\n    else\r\n    {\r\n        imumcStatus = kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    OSA_EXIT_CRITICAL();\r\n\r\n    return imumcStatus;\r\n}\r\n\r\nstatic hal_imumc_status_t HAL_ImuSendCommandRspAck(hal_imu_handle_t *imuHandle, uint8_t *rxBuf, uint8_t length)\r\n{\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n    OSA_SR_ALLOC();\r\n    assert(NULL != imuHandle);\r\n\r\n    if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    OSA_ENTER_CRITICAL();\r\n    if (kStatus_HAL_ImumcSuccess == HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL,\r\n                                                           (uint8_t)IMU_MSG_CONTROL_COMMAND_RSP_ACK, rxBuf, length))\r\n    {\r\n        seq_num++;\r\n    }\r\n    else\r\n    {\r\n        imumcStatus = kStatus_HAL_ImumcError;\r\n    }\r\n    OSA_EXIT_CRITICAL();\r\n\r\n    return imumcStatus;\r\n}\r\n\r\nstatic hal_imumc_status_t HAL_ImuFreeRxBuf(hal_imu_handle_t *imuHandle, uint8_t *rxBuf, uint8_t length)\r\n{\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n    OSA_SR_ALLOC();\r\n    assert(NULL != imuHandle);\r\n\r\n    if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    OSA_ENTER_CRITICAL();\r\n    if (kStatus_HAL_ImumcSuccess == HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL,\r\n                                                           (uint8_t)IMU_MSG_CONTROL_FREE_RX_BUF, rxBuf, length))\r\n    {\r\n        seq_num++;\r\n    }\r\n    else\r\n    {\r\n        imumcStatus = kStatus_HAL_ImumcError;\r\n    }\r\n    OSA_EXIT_CRITICAL();\r\n\r\n    return imumcStatus;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImuSendCommand(uint8_t imuLink, uint8_t *cmdBuf, uint32_t length)\r\n{\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n    hal_imu_handle_t *imuHandle;\r\n    OSA_SR_ALLOC();\r\n\r\n    assert((uint8_t)kIMU_LinkMax > imuLink);\r\n    imuHandle = &imuHandleCh[imuLink];\r\n\r\n    if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink) || FALSE == imuHandle->cmd_buffer_available)\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    if (length != 0U)\r\n    {\r\n        // To be DMAed\r\n        (void)HAL_IMU_MEMCPY((void *)imuHandle->cmd_buffer, cmdBuf, length);\r\n    }\r\n    else\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    OSA_ENTER_CRITICAL();\r\n    if (kStatus_HAL_ImumcSuccess == HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_COMMAND, 0U, NULL, 0))\r\n    {\r\n        seq_num++;\r\n        imuHandle->cmd_buffer_available = FALSE;\r\n    }\r\n    else\r\n    {\r\n        imumcStatus = kStatus_HAL_ImumcError;\r\n    }\r\n    OSA_EXIT_CRITICAL();\r\n\r\n    return imumcStatus;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImuSendTxData(uint8_t imuLink, uint8_t *txBuf, uint32_t length)\r\n{\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n    hal_imu_handle_t *imuHandle;\r\n    uint8_t *wlan_tx_buf;\r\n    OSA_SR_ALLOC();\r\n\r\n    assert((uint8_t)kIMU_LinkMax > imuLink);\r\n    imuHandle = &imuHandleCh[imuLink];\r\n\r\n    if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    wlan_tx_buf = HAL_ImuGetWlanTxBuf(imuHandle);\r\n    if ((wlan_tx_buf != NULL) && (length != 0U))\r\n    {\r\n        // To be DMAed\r\n        (void)HAL_IMU_MEMCPY(wlan_tx_buf, txBuf, length);\r\n    }\r\n    else\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    OSA_ENTER_CRITICAL();\r\n    if (kStatus_HAL_ImumcSuccess == HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_TX_DATA, 0U, wlan_tx_buf, 1U))\r\n    {\r\n        seq_num++;\r\n    }\r\n    else\r\n    {\r\n        (void)HAL_ImuPutWlanTxBuf(imuHandle, wlan_tx_buf);\r\n        imumcStatus = kStatus_HAL_ImumcError;\r\n    }\r\n    OSA_EXIT_CRITICAL();\r\n\r\n    return imumcStatus;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImuAddWlanTxPacket(uint8_t imuLink, uint8_t *txBuf, uint32_t length)\r\n{\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n    hal_imu_handle_t *imuHandle;\r\n    uint8_t *wlan_tx_buf;\r\n\r\n    assert((uint8_t)kIMU_LinkMax > imuLink);\r\n    assert(NULL != txBuf);\r\n    assert(0U != length);\r\n    imuHandle = &imuHandleCh[imuLink];\r\n\r\n    if (imuHandle->imuMsgBufIdx > IMU_PAYLOAD_SIZE - 1U)\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    wlan_tx_buf = HAL_ImuGetWlanTxBuf(imuHandle);\r\n\r\n    if (NULL == wlan_tx_buf)\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    // To be DMAed\r\n    (void)HAL_IMU_MEMCPY(wlan_tx_buf, txBuf, length);\r\n\r\n    imuHandle->imuMsgBuf[imuHandle->imuMsgBufIdx] = (uint32_t)wlan_tx_buf;\r\n    imuHandle->imuMsgBufIdx++;\r\n\r\n    return imumcStatus;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImuAddWlanTxPacketExt(uint8_t imuLink,\r\n                                             uint8_t *txBuf,\r\n                                             uint32_t length,\r\n                                             void (*cb)(void *destAddr, void *srcAddr, uint32_t len))\r\n{\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n    hal_imu_handle_t *imuHandle;\r\n    uint8_t *wlan_tx_buf;\r\n\r\n    assert((uint8_t)kIMU_LinkMax > imuLink);\r\n    assert(NULL != txBuf);\r\n    assert(0U != length);\r\n    imuHandle = &imuHandleCh[imuLink];\r\n\r\n    if (imuHandle->imuMsgBufIdx > IMU_PAYLOAD_SIZE - 1U)\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    wlan_tx_buf = HAL_ImuGetWlanTxBuf(imuHandle);\r\n\r\n    if (NULL == wlan_tx_buf)\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    // To be DMAed\r\n    cb(wlan_tx_buf, txBuf, length);\r\n\r\n    imuHandle->imuMsgBuf[imuHandle->imuMsgBufIdx] = (uint32_t)wlan_tx_buf;\r\n    imuHandle->imuMsgBufIdx++;\r\n\r\n    return imumcStatus;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImuSendMultiTxData(uint8_t imuLink)\r\n{\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n    hal_imu_handle_t *imuHandle;\r\n    OSA_SR_ALLOC();\r\n\r\n    assert((uint8_t)kIMU_LinkMax > imuLink);\r\n    imuHandle = &imuHandleCh[imuLink];\r\n\r\n    if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    OSA_ENTER_CRITICAL();\r\n    if (kStatus_HAL_ImumcSuccess == HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_MULTI_TX_DATA, 0U, NULL, 0U))\r\n    {\r\n        seq_num++;\r\n        imuHandle->imuMsgBufIdx = 0;\r\n    }\r\n    else\r\n    {\r\n        imumcStatus = kStatus_HAL_ImumcError;\r\n    }\r\n    OSA_EXIT_CRITICAL();\r\n\r\n    return imumcStatus;\r\n}\r\n\r\nstatic hal_imumc_status_t HAL_ImuSendSyncAck(hal_imu_handle_t *imuHandle)\r\n{\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n    OSA_SR_ALLOC();\r\n    assert(NULL != imuHandle);\r\n\r\n    OSA_ENTER_CRITICAL();\r\n    if (kStatus_HAL_ImumcSuccess ==\r\n        HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL, (uint8_t)IMU_MSG_CONTROL_SYNC_ACK, NULL, 0U))\r\n    {\r\n        seq_num++;\r\n    }\r\n    else\r\n    {\r\n        imumcStatus = kStatus_HAL_ImumcError;\r\n    }\r\n    OSA_EXIT_CRITICAL();\r\n\r\n    return imumcStatus;\r\n}\r\n\r\nstatic hal_imumc_status_t HAL_ImuSendUnlock(hal_imu_handle_t *imuHandle)\r\n{\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n    OSA_SR_ALLOC();\r\n    assert(NULL != imuHandle);\r\n\r\n    if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    OSA_ENTER_CRITICAL();\r\n    if (kStatus_HAL_ImumcSuccess ==\r\n        HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL, (uint8_t)IMU_MSG_CONTROL_ACK_FOR_UNLOCK, NULL, 0U))\r\n    {\r\n        seq_num++;\r\n    }\r\n    else\r\n    {\r\n        imumcStatus = kStatus_HAL_ImumcError;\r\n    }\r\n    OSA_EXIT_CRITICAL();\r\n\r\n    return imumcStatus;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImuReturnAllTxBuf(imu_link_t link)\r\n{\r\n    hal_imu_handle_t *imuHandle;\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n    uint8_t txBufCnt;\r\n    uint8_t *wlan_tx_buf;\r\n    OSA_SR_ALLOC();\r\n\r\n    assert(kIMU_LinkMax > link);\r\n    imuHandle = &imuHandleCh[link];\r\n\r\n    txBufCnt = 0;\r\n    while (TRUE)\r\n    {\r\n        wlan_tx_buf = HAL_ImuGetWlanTxBuf(imuHandle);\r\n        if (NULL == wlan_tx_buf) /*! all Tx buffers are consumed */\r\n        {\r\n            break;\r\n        }\r\n\r\n        imuHandle->imuMsgBuf[txBufCnt] = (uint32_t)wlan_tx_buf;\r\n        txBufCnt++;\r\n\r\n        if (IMU_PAYLOAD_SIZE == txBufCnt)\r\n        {\r\n            OSA_ENTER_CRITICAL();\r\n            if (kStatus_HAL_ImumcSuccess !=\r\n                HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL, (uint8_t)IMU_MSG_CONTROL_TX_BUF_ADDR,\r\n                                       (uint8_t *)&imuHandle->imuMsgBuf[0], (uint32_t)IMU_PAYLOAD_SIZE))\r\n            {\r\n                OSA_EXIT_CRITICAL();\r\n                return kStatus_HAL_ImumcError;\r\n            }\r\n            else\r\n            {\r\n                seq_num++;\r\n            }\r\n            txBufCnt = 0;\r\n            OSA_EXIT_CRITICAL();\r\n        }\r\n    }\r\n\r\n    if (txBufCnt != 0U)\r\n    {\r\n        OSA_ENTER_CRITICAL();\r\n        if (kStatus_HAL_ImumcSuccess != HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL,\r\n                                                               (uint8_t)IMU_MSG_CONTROL_TX_BUF_ADDR,\r\n                                                               (uint8_t *)&imuHandle->imuMsgBuf[0], txBufCnt))\r\n        {\r\n            OSA_EXIT_CRITICAL();\r\n            return kStatus_HAL_ImumcError;\r\n        }\r\n        else\r\n        {\r\n            seq_num++;\r\n        }\r\n        OSA_EXIT_CRITICAL();\r\n    }\r\n\r\n    return imumcStatus;\r\n}\r\n\r\nstatic hal_imumc_status_t HAL_ImuSendShutdown(hal_imu_handle_t *imuHandle)\r\n{\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n    OSA_SR_ALLOC();\r\n    assert(NULL != imuHandle);\r\n\r\n    if (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    OSA_ENTER_CRITICAL();\r\n    if (kStatus_HAL_ImumcSuccess ==\r\n        HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_CONTROL, (uint8_t)IMU_MSG_CONTROL_SHUTDOWN, NULL, 0U))\r\n    {\r\n        seq_num++;\r\n    }\r\n    else\r\n    {\r\n        imumcStatus = kStatus_HAL_ImumcError;\r\n    }\r\n    OSA_EXIT_CRITICAL();\r\n\r\n    return imumcStatus;\r\n}\r\n\r\nstatic hal_imumc_status_t HAL_ImuCtrlHandler(hal_imu_handle_t *imuHandle, IMU_Msg_t *data, uint32_t len)\r\n{\r\n    imu_ctrl_msg_subtype_t imuControlType;\r\n    IMU_Msg_t *pImuMsg             = data;\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n    hal_imumc_state_t *imumcHandle;\r\n    OSA_SR_ALLOC();\r\n    LIST_ELEM_st *cur;\r\n    uint8_t eptQuiryRspAck;\r\n\r\n    assert(NULL != imuHandle);\r\n    imuControlType = (imu_ctrl_msg_subtype_t)pImuMsg->Hdr.sub_type;\r\n    OSA_ENTER_CRITICAL();\r\n\r\n    switch (imuControlType)\r\n    {\r\n        case IMU_MSG_CONTROL_ACK_FOR_UNLOCK:\r\n            IMU_UNLOCK_TX_FIFO(imuHandle->imuLink);\r\n            break;\r\n        case IMU_MSG_CONTROL_SYNC:\r\n            (void)HAL_ImuSendSyncAck(imuHandle);\r\n            if ((uint8_t)kIMU_LinkCpu2Cpu3 == imuHandle->imuLink)\r\n            {\r\n                imuHandle->imuSyncState = (uint8_t)IMU_INITIALIZED;\r\n            }\r\n            (void)HAL_ImuSendSyncAck(imuHandle);\r\n            imuHandle->imuSyncState = (uint8_t)IMU_INITIALIZED;\r\n            break;\r\n        case IMU_MSG_CONTROL_SYNC_ACK:\r\n            imuHandle->imuSyncState = (uint8_t)IMU_INITIALIZED;\r\n            break;\r\n        case IMU_MSG_CONTROL_CMD_BUF_ADDR:\r\n            imuHandle->cmd_buffer           = (uint32_t *)pImuMsg->PayloadPtr[0];\r\n            imuHandle->cmd_buffer_available = TRUE;\r\n            if ((uint8_t)IMU_INITIALIZED != imuHandle->imuSyncState)\r\n            {\r\n                imuHandle->imuSyncState = (uint8_t)IMU_INITIALIZED;\r\n            }\r\n            break;\r\n        case IMU_MSG_CONTROL_TX_BUF_ADDR:\r\n            for (uint8_t i = 0; i < pImuMsg->Hdr.length; i++)\r\n            {\r\n                (void)HAL_ImuPutWlanTxBuf(imuHandle, (uint8_t *)pImuMsg->PayloadPtr[i]);\r\n            }\r\n            break;\r\n        case IMU_MSG_CONTROL_ERROR:\r\n            break;\r\n        case IMU_MSG_CONTROL_SHUTDOWN:\r\n            imuHandle->imuSyncState = (uint8_t)IMU_UNINITIALIZED;\r\n            IMU_ClearPendingInterrupts((imu_link_t)imuHandle->imuLink, IMU_MSG_FIFO_CNTL_MSG_RDY_INT_CLR_MASK);\r\n            IMU_ClearPendingInterrupts((imu_link_t)imuHandle->imuLink, IMU_MSG_FIFO_CNTL_SP_AV_INT_CLR_MASK);\r\n            (void)os_InterruptMaskClear(IMULINKID_TO_IRQID((imu_link_t)imuHandle->imuLink));\r\n            IMU_Deinit((imu_link_t)imuHandle->imuLink);\r\n            *IMU_MSG_CUR_MAGIC_P(imuHandle->imuLink) = 0;\r\n            imuHandle->wlanTxqCtl.writeIndex         = 0;\r\n            imuHandle->wlanTxqCtl.readIndex          = 0;\r\n            break;\r\n        case IMU_MSG_CONTROL_IMUMC_EPT_QUIRY:\r\n        {\r\n            hal_imumc_state_t *imumcHandle = HAL_ImumcGetEndpointFromAddr(imuHandle, pImuMsg->PayloadPtr[0]);\r\n            if (imumcHandle != NULL)\r\n            {\r\n                /* The remote CPU is sending an endpoint query so it implies the imumc link is ready */\r\n                imumcHandle->eptLinkIsReady = TRUE;\r\n                /* Confirm the local endpoint is ready too */\r\n                imumcStatus = HAL_ImuSendImumcEptQuiryRsp(imuHandle, pImuMsg->PayloadPtr[0], TRUE);\r\n                /* Make sure to unblock the task calling HAL_ImumcInit */\r\n                (void)OSA_EventSet((osa_event_handle_t)imumcQFlagsRef,\r\n                                   IMUMC_EVENT_ENDPOINT_QUERY_RSP << imuHandle->imuLink);\r\n            }\r\n            else\r\n            {\r\n                /* Local endpoint doesn't exist yet, the remote CPU needs to wait until the local CPU initializes\r\n                 * the targeted endpoint, a new query will be sent then to update the link status on both sides */\r\n                imumcStatus = HAL_ImuSendImumcEptQuiryRsp(imuHandle, pImuMsg->PayloadPtr[0], FALSE);\r\n            }\r\n        }\r\n        break;\r\n        case IMU_MSG_CONTROL_IMUMC_EPT_QUIRY_RSP:\r\n            eptQuiryRspAck = 0;\r\n            list_for_each(cur, &imuHandle->eptList)\r\n            {\r\n                imumcHandle = (hal_imumc_state_t *)cur;\r\n                if (imumcHandle->remote_addr == pImuMsg->PayloadPtr[0])\r\n                {\r\n                    if (pImuMsg->PayloadPtr[1] != 0U)\r\n                    {\r\n                        eptQuiryRspAck              = 1;\r\n                        imumcHandle->eptLinkIsReady = TRUE;\r\n                    }\r\n                    else\r\n                    {\r\n                        imumcHandle->eptLinkIsReady = FALSE;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (eptQuiryRspAck != 0U)\r\n            {\r\n                /* Make sure to unblock the task calling HAL_ImumcInit */\r\n                (void)OSA_EventSet((osa_event_handle_t)imumcQFlagsRef,\r\n                                   IMUMC_EVENT_ENDPOINT_QUERY_RSP << imuHandle->imuLink);\r\n            }\r\n            break;\r\n        case IMU_MSG_CONTROL_IMUMC_BUF_FREE:\r\n            (void)HAL_ImumcPutTxBuf(imuHandle, (uint8_t *)pImuMsg->PayloadPtr[0]);\r\n            break;\r\n        default:\r\n            // Do nothing for the commands without header expansion.\r\n            break;\r\n    }\r\n\r\n    OSA_EXIT_CRITICAL();\r\n    return imumcStatus;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImuReceive(uint8_t imuLink)\r\n{\r\n    IMU_Msg_t *pMsg = NULL, localImuMsg;\r\n    IMU_Msg_t localImuMsgRx;\r\n\r\n    hal_imu_handle_t *imuHandle = NULL;\r\n    imu_msg_type_t msg_type     = IMU_MSG_MAX;\r\n    bool isUnlockMsgReqd        = FALSE;\r\n    hal_imumc_state_t *ept;\r\n    struct imumc_std_msg *imumc_msg;\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n\r\n    assert((uint8_t)kIMU_LinkMax > imuLink);\r\n    imuHandle = &imuHandleCh[imuLink];\r\n\r\n    while (TRUE)\r\n    {\r\n        if (IMU_RX_FIFO_EMPTY((imu_link_t)imuHandle->imuLink))\r\n        {\r\n            IMU_ClearPendingInterrupts((imu_link_t)imuHandle->imuLink, IMU_MSG_FIFO_CNTL_MSG_RDY_INT_CLR_MASK);\r\n            os_ClearPendingISR(IMULINKID_TO_IRQID((imu_link_t)imuHandle->imuLink));\r\n#ifndef CPU2\r\n            *IMU_SLEEP_FLAG_ADDR(imuHandle->imuLink) |= (uint32_t)(1 << 0U);\r\n#endif\r\n            break;\r\n        }\r\n        else\r\n        {\r\n#ifndef CPU2\r\n            *IMU_SLEEP_FLAG_ADDR(imuHandle->imuLink) &= (uint32_t)(~(1 << 0U));\r\n#endif\r\n\r\n            /* Message buffer pMsg should be consumed (or copied for later\r\n             * processing) in handler before call for next READ_ICC_MESSAGE\r\n             * comes here again.\r\n             * Otherwise other CPU may use same pMsg for next write,\r\n             * when FIFO is almost full\r\n             */\r\n            pMsg = (IMU_Msg_t *)IMU_RD_MSG(imuHandle->imuLink);\r\n            if ((pMsg != NULL) && (IMU_RX_FIFO_LOCKED(imuHandle->imuLink)))\r\n            {\r\n                isUnlockMsgReqd = TRUE;\r\n            }\r\n        }\r\n\r\n        /* release CPU access here because message processing may take time */\r\n        if (pMsg != NULL)\r\n        {\r\n            (void)memcpy((uint8_t *)&localImuMsg, (uint8_t *)pMsg, sizeof(IMU_Msg_t));\r\n            pMsg     = &localImuMsg;\r\n            msg_type = (imu_msg_type_t)pMsg->Hdr.type;\r\n\r\n            switch (msg_type)\r\n            {\r\n                case IMU_MSG_CONTROL:\r\n                    imumcStatus = HAL_ImuCtrlHandler(imuHandle, pMsg, pMsg->Hdr.length);\r\n                    if (imuHandle->imuHandler[IMU_MSG_CONTROL] != NULL)\r\n                    {\r\n                        imumcStatus = imuHandle->imuHandler[IMU_MSG_CONTROL]((IMU_Msg_t *)pMsg, pMsg->Hdr.length);\r\n                    }\r\n                    break;\r\n                case IMU_MSG_COMMAND_RESPONSE:\r\n                    if (imuHandle->imuHandler[IMU_MSG_COMMAND_RESPONSE] != NULL)\r\n                    {\r\n                        imumcStatus =\r\n                            imuHandle->imuHandler[IMU_MSG_COMMAND_RESPONSE]((IMU_Msg_t *)pMsg, pMsg->Hdr.length);\r\n                    }\r\n                    assert(kStatus_HAL_ImumcSuccess == imumcStatus);\r\n                    imumcStatus = HAL_ImuSendCommandRspAck(imuHandle, (uint8_t *)&pMsg->PayloadPtr[0], 1);\r\n                    imuHandle->cmd_buffer_available = TRUE;\r\n                    break;\r\n\r\n                case IMU_MSG_EVENT:\r\n                    if (imuHandle->imuHandler[IMU_MSG_EVENT] != NULL)\r\n                    {\r\n                        imumcStatus = imuHandle->imuHandler[IMU_MSG_EVENT]((IMU_Msg_t *)pMsg, pMsg->Hdr.length);\r\n                    }\r\n                    assert(kStatus_HAL_ImumcSuccess == imumcStatus);\r\n                    imumcStatus = HAL_ImuSendEventAck(imuHandle, (uint8_t *)&pMsg->PayloadPtr[0], 1);\r\n                    break;\r\n\r\n                case IMU_MSG_RX_DATA:\r\n                case IMU_MSG_MULTI_RX_DATA:\r\n                    (void)memcpy((uint8_t *)&localImuMsgRx, (uint8_t *)pMsg, sizeof(IMU_Msg_t));\r\n                    if (imuHandle->imuHandler[IMU_MSG_RX_DATA] != NULL)\r\n                    {\r\n                        imumcStatus = imuHandle->imuHandler[IMU_MSG_RX_DATA]((IMU_Msg_t *)pMsg, pMsg->Hdr.length);\r\n                    }\r\n                    pMsg        = &localImuMsgRx;\r\n                    imumcStatus = HAL_ImuFreeRxBuf(imuHandle, (uint8_t *)&pMsg->PayloadPtr[0], pMsg->Hdr.length);\r\n                    break;\r\n                case IMU_MSG_IMUMC:\r\n                    imumc_msg = (struct imumc_std_msg *)&pMsg->PayloadPtr[0];\r\n                    ept       = (hal_imumc_state_t *)HAL_ImumcGetEndpointFromAddr(imuHandle, imumc_msg->hdr.dst);\r\n                    if (NULL != ept)\r\n                    {\r\n                        if (ept->rx.callback != NULL)\r\n                        {\r\n                            imumcStatus = (hal_imumc_status_t)ept->rx.callback(\r\n                                ept->rx.param, (uint8_t *)imumc_msg->data, imumc_msg->hdr.len);\r\n                        }\r\n                    }\r\n                    if ((hal_imumc_return_status_t)imumcStatus == kStatus_HAL_RL_RELEASE)\r\n                    {\r\n                        imumcStatus = HAL_ImuSendImumcFreeBuf(imuHandle, (uint8_t *)&imumc_msg->data);\r\n                    }\r\n                    break;\r\n\r\n                default:\r\n                    // Do nothing for the commands without expansion.\r\n                    break;\r\n            }\r\n\r\n            assert(kStatus_HAL_ImumcSuccess == imumcStatus);\r\n        }\r\n    }\r\n\r\n    if (isUnlockMsgReqd)\r\n    {\r\n        (void)HAL_ImuSendUnlock(imuHandle);\r\n    }\r\n\r\n    (void)os_InterruptMaskSet(IMULINKID_TO_IRQID((imu_link_t)imuHandle->imuLink));\r\n    return (hal_imumc_status_t)imumcStatus;\r\n}\r\n\r\n#if defined(CPU2)\r\nstatic void HAL_ImuMain(void *argv)\r\n{\r\n    uint32_t Events = 0;\r\n    uint32_t imuLinkId;\r\n\r\n    while (TRUE)\r\n    {\r\n#if (defined(USE_RTOS) && (USE_RTOS > 0U))\r\n        (void)HAL_ImuPutTaskLock();\r\n#endif\r\n        (void)OSA_EventWait((osa_event_handle_t)ImuQFlagsRef, IMU_EVENT_TRIGGERS, 0, osaWaitForever_c, &Events);\r\n        if (Events == 0U)\r\n        {\r\n            if (gUseRtos_c == 0U)\r\n            {\r\n                break;\r\n            }\r\n            else\r\n            {\r\n                continue;\r\n            }\r\n        }\r\n#if (defined(USE_RTOS) && (USE_RTOS > 0U))\r\n        (void)HAL_ImuGetTaskLock();\r\n#endif\r\n        /*! Check for all IMU links event/ISR has occured\r\n         *  Only MSG ready events considered\r\n         */\r\n        for (imuLinkId = 0; imuLinkId < (uint32_t)kIMU_LinkMax; imuLinkId++)\r\n        {\r\n            if ((Events & (1U << imuLinkId)) != 0U)\r\n            {\r\n                (void)HAL_ImuReceive((uint8_t)imuLinkId);\r\n            }\r\n        }\r\n        if (gUseRtos_c == 0U)\r\n        {\r\n            break;\r\n        }\r\n    }\r\n}\r\n#else\r\n\r\nstatic void HAL_ImuMainCpu13(void *argv)\r\n{\r\n    uint32_t Events = 0;\r\n\r\n    while (TRUE)\r\n    {\r\n#if (defined(USE_RTOS) && (USE_RTOS > 0U))\r\n        (void)HAL_ImuPutTaskLock();\r\n#endif\r\n\r\n        (void)OSA_EventWait((osa_event_handle_t)ImuQ13FlagsRef, IMU_EVENT_TRIGGERS, 0, osaWaitForever_c, &Events);\r\n        if (Events == 0U)\r\n        {\r\n            if (gUseRtos_c == 0U)\r\n            {\r\n                break;\r\n            }\r\n            else\r\n            {\r\n                continue;\r\n            }\r\n        }\r\n#if (defined(USE_RTOS) && (USE_RTOS > 0U))\r\n        (void)HAL_ImuGetTaskLock();\r\n#endif\r\n        /*! Check for CPU1 to CPU3 IMU links event/ISR has occured\r\n         *  Only MSG ready events considered\r\n         */\r\n        (void)HAL_ImuReceive(kIMU_LinkCpu1Cpu3);\r\n\r\n        if (gUseRtos_c == 0U)\r\n        {\r\n            break;\r\n        }\r\n    }\r\n}\r\n\r\nstatic void HAL_ImuMainCpu23(void *argv)\r\n{\r\n    uint32_t Events = 0;\r\n\r\n    while (TRUE)\r\n    {\r\n#if 0\r\n        HAL_ImuPutTaskLock();\r\n#endif\r\n\r\n        (void)OSA_EventWait((osa_event_handle_t)ImuQ23FlagsRef, IMU_EVENT_TRIGGERS, 0, osaWaitForever_c, &Events);\r\n\r\n        if (Events == 0U)\r\n        {\r\n            if (gUseRtos_c == 0U)\r\n            {\r\n                break;\r\n            }\r\n            else\r\n            {\r\n                continue;\r\n            }\r\n        }\r\n#if 0\r\n        HAL_ImuGetTaskLock();\r\n#endif\r\n        /*! Check for CPU2 to CPU3 IMU links event/ISR has occured\r\n         *  Only MSG ready events considered\r\n         */\r\n\r\n        (void)HAL_ImuReceive(kIMU_LinkCpu2Cpu3);\r\n\r\n        if (gUseRtos_c == 0U)\r\n        {\r\n            break;\r\n        }\r\n    }\r\n}\r\n#endif\r\n\r\nstatic void HAL_ImuTaskInit(uint8_t link)\r\n{\r\n#if defined(CPU2)\r\n    (void)link;\r\n\r\n    if (((imu_init_flag & ((1U << (uint8_t)kIMU_LinkMax) - 1U)) == 0U) && imu_task_flag == 0U)\r\n    {\r\n        (void)OSA_TaskCreate((osa_task_handle_t)ImuTaskHandle, OSA_TASK(HAL_ImuMain), NULL);\r\n        (void)OSA_EventCreate((osa_event_handle_t)ImuQFlagsRef, 1U);\r\n        imu_task_flag = 1;\r\n    }\r\n#else\r\n    if (link == kIMU_LinkCpu1Cpu3 && (imu_task_flag & (1U << link)) == 0)\r\n    {\r\n        (void)OSA_TaskCreate((osa_task_handle_t)ImuTaskHandleCpu13, OSA_TASK(HAL_ImuMainCpu13), NULL);\r\n        (void)OSA_EventCreate((osa_event_handle_t)ImuQ13FlagsRef, 1U);\r\n        imu_task_flag |= (1U << link);\r\n    }\r\n    else if (link == kIMU_LinkCpu2Cpu3 && (imu_task_flag & (1U << link)) == 0)\r\n    {\r\n        (void)OSA_TaskCreate((osa_task_handle_t)ImuTaskHandleCpu23, OSA_TASK(HAL_ImuMainCpu23), NULL);\r\n        (void)OSA_EventCreate((osa_event_handle_t)ImuQ23FlagsRef, 1U);\r\n        imu_task_flag |= (1U << link);\r\n    }\r\n    else\r\n    {\r\n        ; /* No necessary actions. */\r\n    }\r\n#endif\r\n}\r\n\r\nstatic void HAL_ImuTaskDeinit(uint8_t link)\r\n{\r\n#if defined(CPU2)\r\n    (void)link;\r\n\r\n    if (imu_init_flag == 0U && imu_task_flag != 0U)\r\n    {\r\n        (void)OSA_EventDestroy((osa_event_handle_t)ImuQFlagsRef);\r\n        (void)OSA_TaskDestroy(ImuTaskHandle);\r\n        imu_task_flag = 0;\r\n    }\r\n#else\r\n    if (link == kIMU_LinkCpu1Cpu3 && (imu_task_flag & (1U << link)) != 0)\r\n    {\r\n        (void)OSA_EventDestroy((osa_event_handle_t)ImuQ13FlagsRef);\r\n        (void)OSA_TaskDestroy(ImuTaskHandleCpu13);\r\n        imu_task_flag &= ~(1U << link);\r\n    }\r\n    else if (link == kIMU_LinkCpu2Cpu3 && (imu_task_flag & (1U << link)) != 0)\r\n    {\r\n        (void)OSA_EventDestroy((osa_event_handle_t)ImuQ23FlagsRef);\r\n        (void)OSA_TaskDestroy(ImuTaskHandleCpu23);\r\n        imu_task_flag &= ~(1U << link);\r\n    }\r\n    else\r\n    {\r\n        ; /* No necessary actions. */\r\n    }\r\n#endif\r\n}\r\n\r\nhal_imumc_status_t HAL_ImuInit(imu_link_t link)\r\n{\r\n    hal_imu_handle_t *imuHandle;\r\n    hal_imumc_status_t state = kStatus_HAL_ImumcSuccess;\r\n    uint8_t i;\r\n    OSA_SR_ALLOC();\r\n\r\n    assert(kIMU_LinkMax > link);\r\n    imuHandle          = &imuHandleCh[link];\r\n    imuHandle->imuLink = (uint8_t)link;\r\n    OSA_ENTER_CRITICAL();\r\n\r\n#if defined(IMU_GDMA_ENABLE) && (IMU_GDMA_ENABLE == 1)\r\n    if (0U == imu_init_flag)\r\n    {\r\n        HAL_InitGdma();\r\n    }\r\n#endif\r\n\r\n    /*! IMU and its interrupt are initialized once for each IMU link */\r\n    if ((imu_init_flag & (1U << imuHandle->imuLink)) == 0U)\r\n    {\r\n        HAL_ImuTaskInit(imuHandle->imuLink);\r\n\r\n        if (IMU_Init(link) != (int)kStatus_HAL_ImumcSuccess)\r\n        {\r\n            return kStatus_HAL_ImumcError;\r\n        }\r\n        IMU_ClearPendingInterrupts(link, IMU_MSG_FIFO_CNTL_MSG_RDY_INT_CLR_MASK);\r\n        os_ClearPendingISR(IMULINKID_TO_IRQID(link));\r\n        /* Interrupt must be maskable by FreeRTOS critical section */\r\n        NVIC_SetPriority(IMULINKID_TO_IRQID(link), IMU_ISR_PRIORITY);\r\n        (void)os_InterruptMaskSet(IMULINKID_TO_IRQID(link));\r\n#if defined(CPU2)\r\n        if (kIMU_LinkCpu2Cpu3 == link)\r\n        {\r\n            for (i = 0; i < IMUMC_TXQ23_BUFSIZE; i++)\r\n            {\r\n                (void)HAL_ImumcPutTxBuf(imuHandle, (uint8_t *)imumcTxBuf23[i]);\r\n            }\r\n        }\r\n#else\r\n        imuHandle->wlanTxqCtl.writeIndex  = 0;\r\n        imuHandle->wlanTxqCtl.readIndex   = 0;\r\n        imuHandle->imuMsgBufIdx           = 0;\r\n        imuHandle->imumcTxqCtl.writeIndex = 0;\r\n        imuHandle->imumcTxqCtl.readIndex  = 0;\r\n        if (kIMU_LinkCpu1Cpu3 == link)\r\n        {\r\n            for (i = 0; i < IMUMC_TXQ13_BUFSIZE; i++)\r\n            {\r\n                (void)HAL_ImumcPutTxBuf(imuHandle, (uint8_t *)imumcTxBuf13[i]);\r\n            }\r\n        }\r\n        else if (kIMU_LinkCpu2Cpu3 == link)\r\n        {\r\n            for (i = 0; i < IMUMC_TXQ23_BUFSIZE; i++)\r\n            {\r\n                (void)HAL_ImumcPutTxBuf(imuHandle, (uint8_t *)imumcTxBuf23[i]);\r\n            }\r\n        }\r\n        else\r\n        {\r\n            ; /* No necessary actions. */\r\n        }\r\n#endif\r\n        LIST_init(&imuHandle->eptList);\r\n        imu_init_flag |= (1U << imuHandle->imuLink);\r\n    }\r\n\r\n    /*! Could be moved out from imumc_init() */\r\n    if (imu_init_flag == ((1U << kIMU_LinkMax) - 1U)) /*! All IMU links are initalized */\r\n    {\r\n        HAL_ImuSetCpuReadyFlag(1U /*! Set CPU1 state */);\r\n    }\r\n\r\n    if ((uint8_t)IMU_UNINITIALIZED == imuHandle->imuSyncState)\r\n    {\r\n        state = HAL_ImuSendSync(imuHandle);\r\n    }\r\n\r\n    OSA_EXIT_CRITICAL();\r\n    (void)state;\r\n    return kStatus_HAL_ImumcSuccess;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImuDeinit(imu_link_t link, uint32_t flag)\r\n{\r\n    hal_imu_handle_t *imuHandle;\r\n    hal_imumc_status_t state = kStatus_HAL_ImumcSuccess;\r\n    OSA_SR_ALLOC();\r\n\r\n    assert(kIMU_LinkMax > link);\r\n    imuHandle = &imuHandleCh[link];\r\n    OSA_ENTER_CRITICAL();\r\n\r\n    if ((flag & (1U << 0U)) == 0U)\r\n    {\r\n        (void)HAL_ImuReturnAllTxBuf(link);\r\n        state = HAL_ImuSendShutdown(imuHandle);\r\n        if (kStatus_HAL_ImumcError == state)\r\n        {\r\n            OSA_EXIT_CRITICAL();\r\n            return kStatus_HAL_ImumcError;\r\n        }\r\n    }\r\n\r\n    IMU_ClearPendingInterrupts((imu_link_t)imuHandle->imuLink, IMU_MSG_FIFO_CNTL_MSG_RDY_INT_CLR_MASK);\r\n    IMU_ClearPendingInterrupts((imu_link_t)imuHandle->imuLink, IMU_MSG_FIFO_CNTL_SP_AV_INT_CLR_MASK);\r\n    (void)os_InterruptMaskClear(IMULINKID_TO_IRQID((imu_link_t)imuHandle->imuLink));\r\n    IMU_Deinit((imu_link_t)imuHandle->imuLink);\r\n    imuHandle->imuSyncState                  = (uint8_t)IMU_UNINITIALIZED;\r\n    *IMU_MSG_CUR_MAGIC_P(imuHandle->imuLink) = 0;\r\n    imu_init_flag &= ~(1U << imuHandle->imuLink);\r\n    imuHandle->wlanTxqCtl.writeIndex         = 0;\r\n    imuHandle->wlanTxqCtl.readIndex          = 0;\r\n    imuHandle->imuMsgBufIdx                  = 0;\r\n    imuHandle->cmd_buffer                    = NULL;\r\n    imuHandle->cmd_buffer_available          = 0;\r\n    imuHandle->cmd_response_buffer_available = 0;\r\n\r\n    if ((flag & (1U << 0U)) == 0U)\r\n    {\r\n        while (*IMU_MSG_PEER_MAGIC_P((imu_link_t)imuHandle->imuLink) != 0)\r\n        {\r\n        }\r\n    }\r\n\r\n    if ((flag & (1U << 1U)) == 0U)\r\n    {\r\n        HAL_ImuTaskDeinit(imuHandle->imuLink);\r\n    }\r\n\r\n    OSA_EXIT_CRITICAL();\r\n    return kStatus_HAL_ImumcSuccess;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImumcInit(hal_imumc_handle_t handle, hal_imumc_config_t *config)\r\n{\r\n    hal_imumc_status_t state = kStatus_HAL_ImumcSuccess;\r\n    hal_imumc_state_t *imumcHandle;\r\n    hal_imu_handle_t *imuHandle;\r\n    uint32_t Events;\r\n    OSA_SR_ALLOC();\r\n\r\n    assert(HAL_IMUMC_HANDLE_SIZE >= sizeof(hal_imumc_state_t));\r\n    assert(NULL != handle);\r\n    assert(NULL != config);\r\n    assert((uint8_t)kIMU_LinkMax > config->imuLink);\r\n    imumcHandle = (hal_imumc_state_t *)handle;\r\n\r\n    OSA_ENTER_CRITICAL();\r\n\r\n    if (imumc_init_flag == 0U)\r\n    {\r\n        (void)OSA_EventCreate((osa_event_handle_t)imumcQFlagsRef, 1U);\r\n        imumc_init_flag = 1U;\r\n    }\r\n\r\n    state = HAL_ImuInit((imu_link_t)config->imuLink);\r\n    if (kStatus_HAL_ImumcError == state)\r\n    {\r\n        OSA_EXIT_CRITICAL();\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    imumcHandle->imuLink        = config->imuLink;\r\n    imumcHandle->local_addr     = config->local_addr;\r\n    imumcHandle->remote_addr    = config->remote_addr;\r\n    imumcHandle->rx.callback    = config->callback;\r\n    imumcHandle->rx.param       = config->param;\r\n    imumcHandle->eptLinkIsReady = FALSE;\r\n    LIST_elemInit(&imumcHandle->eptLink);\r\n\r\n    if (NULL == HAL_ImumcCreateEndpoint(imumcHandle))\r\n    {\r\n        OSA_EXIT_CRITICAL();\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    imuHandle = &imuHandleCh[imumcHandle->imuLink];\r\n\r\n    OSA_EXIT_CRITICAL();\r\n\r\n    while (kStatus_HAL_ImumcError == HAL_ImuLinkIsUp(imuHandle->imuLink))\r\n    {\r\n#if defined(USE_RTOS) && (USE_RTOS == 1)\r\n        OSA_TimeDelay(IMU_LINK_WAIT_DELAY_MS);\r\n#else\r\n        (void)HAL_ImuReceive(imumcHandle->imuLink);\r\n#endif\r\n    }\r\n\r\n    while (FALSE == imumcHandle->eptLinkIsReady)\r\n    {\r\n        OSA_ENTER_CRITICAL();\r\n\r\n        state = HAL_ImuSendImumcEptQuiry(imuHandle, imumcHandle->remote_addr);\r\n\r\n        OSA_EXIT_CRITICAL();\r\n\r\n#if defined(USE_RTOS) && (USE_RTOS == 1U)\r\n        (void)OSA_EventWait((osa_event_handle_t)imumcQFlagsRef, IMUMC_EVENT_ENDPOINT_QUERY_RSP << imuHandle->imuLink, 0,\r\n                            osaWaitForever_c, &Events);\r\n#else\r\n        while (TRUE) /* Wait for IMUMC_EVENT_ENDPOINT_QUERY_RSP */\r\n        {\r\n            (void)HAL_ImuReceive(imumcHandle->imuLink);\r\n            (void)OSA_EventWait((osa_event_handle_t)imumcQFlagsRef,\r\n                                IMUMC_EVENT_ENDPOINT_QUERY_RSP << imuHandle->imuLink, 0, osaWaitForever_c, &Events);\r\n            if (Events != 0U)\r\n            {\r\n                break;\r\n            }\r\n        }\r\n#endif\r\n    }\r\n\r\n    return state;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImumcDeinit(hal_imumc_handle_t handle)\r\n{\r\n    hal_imumc_state_t *imumcHandle;\r\n    hal_imumc_status_t state = kStatus_HAL_ImumcSuccess;\r\n    OSA_SR_ALLOC();\r\n\r\n    assert(NULL != handle);\r\n    imumcHandle = (hal_imumc_state_t *)handle;\r\n    OSA_ENTER_CRITICAL();\r\n    state = HAL_ImumcDestroyEndpoint(imumcHandle);\r\n\r\n    OSA_EXIT_CRITICAL();\r\n\r\n    return state;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImumcSend(hal_imumc_handle_t handle, uint8_t *data, uint32_t length)\r\n{\r\n    hal_imumc_status_t state = kStatus_HAL_ImumcSuccess;\r\n    hal_imumc_state_t *imumcHandle;\r\n    hal_imu_handle_t *imuHandle;\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n    OSA_SR_ALLOC();\r\n    uint8_t *imumc_tx_buf;\r\n    struct imumc_std_msg localImumc;\r\n\r\n    assert(HAL_IMUMC_HANDLE_SIZE >= sizeof(hal_imumc_state_t));\r\n    assert(NULL != handle);\r\n    assert(NULL != data);\r\n\r\n    imumcHandle = (hal_imumc_state_t *)handle;\r\n    imuHandle   = &imuHandleCh[imumcHandle->imuLink];\r\n\r\n    assert(kStatus_HAL_ImumcSuccess == HAL_ImuLinkIsUp(imuHandle->imuLink));\r\n    assert(imumcHandle->eptLinkIsReady == TRUE);\r\n\r\n    if (imumcHandle->imuLink == (uint8_t)kIMU_LinkCpu2Cpu3)\r\n    {\r\n        assert(IMUMC_TXQ23_BUFLENGTH >= length);\r\n    }\r\n    else\r\n    {\r\n        assert(IMUMC_TXQ13_BUFLENGTH >= length);\r\n    }\r\n\r\n    imumc_tx_buf = HAL_ImumcAllocTxBuffer(handle, length);\r\n\r\n    if (NULL == imumc_tx_buf)\r\n    {\r\n        return kStatus_HAL_ImumcError;\r\n    }\r\n    else\r\n    {\r\n        OSA_ENTER_CRITICAL();\r\n\r\n        // To be DMAed\r\n        (void)HAL_IMU_MEMCPY(imumc_tx_buf, data, length);\r\n        localImumc.hdr.src   = imumcHandle->local_addr;\r\n        localImumc.hdr.dst   = imumcHandle->remote_addr;\r\n        localImumc.hdr.len   = (uint16_t)length;\r\n        localImumc.hdr.flags = 0;\r\n        localImumc.data      = (uint32_t)imumc_tx_buf;\r\n\r\n        if (kStatus_HAL_ImumcSuccess == HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_IMUMC, 0U,\r\n                                                               (uint8_t *)&localImumc,\r\n                                                               (3U + sizeof(struct imumc_std_msg)) >> 2U))\r\n        {\r\n            seq_num++;\r\n        }\r\n        else\r\n        {\r\n            (void)HAL_ImumcPutTxBuf(imuHandle, imumc_tx_buf);\r\n            imumcStatus = kStatus_HAL_ImumcError;\r\n        }\r\n\r\n        OSA_EXIT_CRITICAL();\r\n    }\r\n\r\n    (void)state;\r\n    return imumcStatus;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImumcNoCopySend(hal_imumc_handle_t handle, uint8_t *data, uint32_t length)\r\n{\r\n    hal_imumc_status_t state = kStatus_HAL_ImumcSuccess;\r\n    hal_imumc_state_t *imumcHandle;\r\n    hal_imu_handle_t *imuHandle;\r\n    hal_imumc_status_t imumcStatus = kStatus_HAL_ImumcSuccess;\r\n    OSA_SR_ALLOC();\r\n\r\n    struct imumc_std_msg localImumc;\r\n\r\n    assert(HAL_IMUMC_HANDLE_SIZE >= sizeof(hal_imumc_state_t));\r\n    assert(NULL != handle);\r\n    assert(NULL != data);\r\n\r\n    imumcHandle = (hal_imumc_state_t *)handle;\r\n    imuHandle   = &imuHandleCh[imumcHandle->imuLink];\r\n\r\n    assert(kStatus_HAL_ImumcSuccess == HAL_ImuLinkIsUp(imuHandle->imuLink));\r\n    assert(imumcHandle->eptLinkIsReady == TRUE);\r\n\r\n    OSA_ENTER_CRITICAL();\r\n\r\n    localImumc.hdr.src   = imumcHandle->local_addr;\r\n    localImumc.hdr.dst   = imumcHandle->remote_addr;\r\n    localImumc.hdr.len   = (uint16_t)length;\r\n    localImumc.hdr.flags = 0;\r\n    localImumc.data      = (uint32_t)data;\r\n\r\n    if (kStatus_HAL_ImumcSuccess == HAL_ImuSendMsgBlocking(imuHandle, (uint8_t)IMU_MSG_IMUMC, 0U,\r\n                                                           (uint8_t *)&localImumc,\r\n                                                           (3U + sizeof(struct imumc_std_msg)) >> 2U))\r\n    {\r\n        seq_num++;\r\n    }\r\n    else\r\n    {\r\n        imumcStatus = kStatus_HAL_ImumcError;\r\n    }\r\n\r\n    OSA_EXIT_CRITICAL();\r\n    (void)state;\r\n    return imumcStatus;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImuInstallCallback(uint8_t imuLink, imu_callback_t callback, uint8_t type)\r\n{\r\n    hal_imu_handle_t *imuHandle;\r\n\r\n    assert((uint8_t)kIMU_LinkMax > imuLink);\r\n    assert((uint8_t)IMU_MSG_MAX > type);\r\n    imuHandle                   = &imuHandleCh[imuLink];\r\n    imuHandle->imuHandler[type] = callback;\r\n\r\n    return kStatus_HAL_ImumcSuccess;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImuInstallIrqCallback(uint8_t imuLink, imu_irq_callback_t callback)\r\n{\r\n    assert((uint8_t)kIMU_LinkMax > imuLink);\r\n\r\n    imuIrqCallback[imuLink] = callback;\r\n\r\n    return kStatus_HAL_ImumcSuccess;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImumcInstallRxCallback(hal_imumc_handle_t handle, imumc_rx_callback_t callback, void *param)\r\n{\r\n    hal_imumc_state_t *imumcHandle;\r\n\r\n    imumcHandle = (hal_imumc_state_t *)handle;\r\n\r\n    imumcHandle->rx.callback = callback;\r\n    imumcHandle->rx.param    = param;\r\n\r\n    return kStatus_HAL_ImumcSuccess;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImumcEnterLowpower(hal_imumc_handle_t handle)\r\n{\r\n    return kStatus_HAL_ImumcError;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImumcExitLowpower(hal_imumc_handle_t handle)\r\n{\r\n    return kStatus_HAL_ImumcError;\r\n}\r\n\r\nvoid HAL_ImumcSetEvent(uint32_t Event)\r\n{\r\n#if defined(CPU2)\r\n    (void)OSA_EventSet((osa_event_handle_t)ImuQFlagsRef, Event);\r\n#else\r\n    if ((Event & (1U << kIMU_LinkCpu1Cpu3)) != 0U)\r\n    {\r\n        (void)OSA_EventSet((osa_event_handle_t)ImuQ13FlagsRef, Event);\r\n    }\r\n    else\r\n    {\r\n        (void)OSA_EventSet((osa_event_handle_t)ImuQ23FlagsRef, Event);\r\n    }\r\n#endif\r\n}\r\n\r\n#if defined(CPU2)\r\nvoid CPU1_TO_CPU2_MSG_RDY_IMU_INT_IRQHandler(void)\r\n{\r\n    uint32_t irq_num = IMULINKID_TO_IRQID(kIMU_LinkCpu1Cpu2);\r\n\r\n    /* Mask IMU ICU interrupt */\r\n    (void)os_InterruptMaskClear(irq_num);\r\n\r\n    if (!IMU_RX_FIFO_EMPTY(kIMU_LinkCpu1Cpu2))\r\n    {\r\n        HAL_ImumcSetEvent(1U << (uint8_t)kIMU_LinkCpu1Cpu2);\r\n    }\r\n    else\r\n    {\r\n        IMU_ClearPendingInterrupts(kIMU_LinkCpu1Cpu2, IMU_MSG_FIFO_CNTL_MSG_RDY_INT_CLR_MASK);\r\n        (void)os_InterruptMaskSet(irq_num);\r\n    }\r\n}\r\n\r\nvoid CPU3_TO_CPU2_MSG_RDY_IMU_INT_IRQHandler(void)\r\n{\r\n    uint32_t irq_num = IMULINKID_TO_IRQID(kIMU_LinkCpu2Cpu3);\r\n\r\n    /* Mask IMU ICU interrupt */\r\n    (void)os_InterruptMaskClear(irq_num);\r\n\r\n    if (!IMU_RX_FIFO_EMPTY(kIMU_LinkCpu2Cpu3))\r\n    {\r\n        HAL_ImumcSetEvent(1U << (uint8_t)kIMU_LinkCpu2Cpu3);\r\n    }\r\n    else\r\n    {\r\n        IMU_ClearPendingInterrupts(kIMU_LinkCpu2Cpu3, IMU_MSG_FIFO_CNTL_MSG_RDY_INT_CLR_MASK);\r\n        (void)os_InterruptMaskSet(irq_num);\r\n    }\r\n}\r\n#else\r\n\r\nvoid WL_MCI_WAKEUP0_DriverIRQHandler(void)\r\n{\r\n    IRQn_Type irq_num;\r\n#if defined(CPU2)\r\n    irq_num = IRQ_IMU_CPU32;\r\n#else\r\n    irq_num = IRQ_IMU_CPU13;\r\n#endif\r\n\r\n    /* Mask IMU ICU interrupt */\r\n    (void)os_InterruptMaskClear(irq_num);\r\n\r\n    if (!IMU_RX_FIFO_EMPTY(kIMU_LinkCpu1Cpu3))\r\n    {\r\n        HAL_ImumcSetEvent(1U << (uint8_t)kIMU_LinkCpu1Cpu3);\r\n    }\r\n    else\r\n    {\r\n        IMU_ClearPendingInterrupts(kIMU_LinkCpu1Cpu3, IMU_MSG_FIFO_CNTL_MSG_RDY_INT_CLR_MASK);\r\n        (void)os_InterruptMaskSet(irq_num);\r\n    }\r\n}\r\n\r\nvoid BLE_MCI_WAKEUP0_DriverIRQHandler(void)\r\n{\r\n    IRQn_Type irq_num;\r\n#if defined(CPU2)\r\n    irq_num = IRQ_IMU_CPU12;\r\n#else\r\n    irq_num = IRQ_IMU_CPU23;\r\n#endif\r\n\r\n    /* Mask IMU ICU interrupt */\r\n    (void)os_InterruptMaskClear(irq_num);\r\n\r\n    if (!IMU_RX_FIFO_EMPTY(kIMU_LinkCpu2Cpu3))\r\n    {\r\n        HAL_ImumcSetEvent(1U << (uint8_t)kIMU_LinkCpu2Cpu3);\r\n    }\r\n    else\r\n    {\r\n        if (imuIrqCallback[kIMU_LinkCpu2Cpu3] != NULL)\r\n        {\r\n            imuIrqCallback[kIMU_LinkCpu2Cpu3]();\r\n        }\r\n\r\n        IMU_ClearPendingInterrupts(kIMU_LinkCpu2Cpu3, IMU_MSG_FIFO_CNTL_MSG_RDY_INT_CLR_MASK);\r\n        (void)os_InterruptMaskSet(irq_num);\r\n    }\r\n}\r\n#endif\r\n\r\nvoid *HAL_ImumcAllocTxBuffer(hal_imumc_handle_t handle, uint32_t size)\r\n{\r\n    hal_imumc_state_t *imumcHandle;\r\n    hal_imu_handle_t *imuHandle;\r\n    uint32_t retry = IMUMC_ALLOC_RETRY_COUNT;\r\n    void *buf      = NULL;\r\n\r\n    imumcHandle = (hal_imumc_state_t *)handle;\r\n\r\n    if (imumcHandle->imuLink == (uint8_t)kIMU_LinkCpu2Cpu3)\r\n    {\r\n        assert(IMUMC_TXQ23_BUFLENGTH >= size);\r\n    }\r\n    else\r\n    {\r\n        assert(IMUMC_TXQ13_BUFLENGTH >= size);\r\n    }\r\n\r\n    assert(NULL != handle);\r\n\r\n    imuHandle = &imuHandleCh[imumcHandle->imuLink];\r\n\r\n    buf = HAL_ImumcGetTxBuf(imuHandle);\r\n\r\n    while ((buf == NULL) && (retry != 0U))\r\n    {\r\n        /* Sleep current thread, then try to allocate again */\r\n        OSA_TimeDelay(IMUMC_ALLOC_FAILED_DELAY_MS);\r\n        buf = HAL_ImumcGetTxBuf(imuHandle);\r\n        retry--;\r\n    }\r\n\r\n    return buf;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImumcFreeRxBuffer(hal_imumc_handle_t handle, uint8_t *data)\r\n{\r\n    hal_imumc_state_t *imumcHandle;\r\n    hal_imu_handle_t *imuHandle;\r\n\r\n    assert(NULL != handle);\r\n\r\n    imumcHandle = (hal_imumc_state_t *)handle;\r\n    imuHandle   = &imuHandleCh[imumcHandle->imuLink];\r\n\r\n    return HAL_ImuSendImumcFreeBuf(imuHandle, data);\r\n}\r\n\r\nbool HAL_ImuIsTxBufQueueEmpty(uint8_t imuLink)\r\n{\r\n    hal_imu_handle_t *imuHandle;\r\n    IMU_WLAN_TXQ_CTRL_st *wlanTxqCtl;\r\n\r\n    assert((uint8_t)kIMU_LinkMax > imuLink);\r\n\r\n    imuHandle  = &imuHandleCh[imuLink];\r\n    wlanTxqCtl = &imuHandle->wlanTxqCtl;\r\n\r\n    return (IS_WLAN_TXBQ_EMPTY(wlanTxqCtl));\r\n}\r\n\r\n#if (defined(USE_RTOS) && (USE_RTOS > 0U))\r\nhal_imumc_status_t HAL_ImuCreateTaskLock(void)\r\n{\r\n    osa_status_t status;\r\n\r\n    if ((*(uint32_t *)(osa_mutex_handle_t)imu_task_lock) == 0)\r\n    {\r\n        status = OSA_MutexCreate((osa_mutex_handle_t)imu_task_lock);\r\n        if (status == KOSA_StatusError)\r\n        {\r\n            return kStatus_HAL_ImumcError;\r\n        }\r\n    }\r\n\r\n    return kStatus_HAL_ImumcSuccess;\r\n}\r\n\r\nvoid HAL_ImuDeleteTaskLock(void)\r\n{\r\n    if ((*(uint32_t *)(osa_mutex_handle_t)imu_task_lock) != 0)\r\n    {\r\n        (void)OSA_MutexDestroy((osa_mutex_handle_t)imu_task_lock);\r\n        (*(uint32_t *)(osa_mutex_handle_t)imu_task_lock) = 0;\r\n    }\r\n}\r\n\r\nhal_imumc_status_t HAL_ImuGetTaskLock(void)\r\n{\r\n    osa_status_t status;\r\n\r\n    if ((*(uint32_t *)(osa_mutex_handle_t)imu_task_lock) == 0)\r\n    {\r\n        return kStatus_HAL_ImumcSuccess;\r\n    }\r\n\r\n    status = OSA_MutexLock((osa_mutex_handle_t)imu_task_lock, osaWaitForever_c);\r\n    return status == KOSA_StatusSuccess ? kStatus_HAL_ImumcSuccess : kStatus_HAL_ImumcError;\r\n}\r\n\r\nhal_imumc_status_t HAL_ImuPutTaskLock(void)\r\n{\r\n    osa_status_t status;\r\n\r\n    if ((*(uint32_t *)(osa_mutex_handle_t)imu_task_lock) == 0)\r\n    {\r\n        return kStatus_HAL_ImumcSuccess;\r\n    }\r\n\r\n    status = OSA_MutexUnlock((osa_mutex_handle_t)imu_task_lock);\r\n    return status == KOSA_StatusSuccess ? kStatus_HAL_ImumcSuccess : kStatus_HAL_ImumcError;\r\n\r\n}\r\n#endif"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/imu_adapter/fsl_adapter_imu.h",
    "content": "/*\r\n * Copyright 2021 NXP\r\n * All rights reserved.\r\n *\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef __FSL_ADAPTER_RFIMU_H__\r\n#define __FSL_ADAPTER_RFIMU_H__\r\n\r\n#include \"fsl_adapter_imu_common.h\"\r\n\r\n#if defined(SDK_OS_FREE_RTOS)\r\n#include \"FreeRTOS.h\"\r\n#endif\r\n/*!\r\n * @addtogroup IMU_Adapter\r\n * @{\r\n */\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*! @brief IMUMC Msaster/Remote role definition (0 - Master, 1 - Remote) */\r\n#ifndef HAL_IMUMC_SELECT_ROLE\r\n#define HAL_IMUMC_SELECT_ROLE (1U)\r\n#endif\r\n\r\n/*! @brief IMUMC handle size definition */\r\n#define HAL_IMUMC_HANDLE_SIZE (52U)\r\n\r\n#ifndef REMOTE_CORE_BOOT_ADDRESS\r\n#define REMOTE_CORE_BOOT_ADDRESS (0x01000000U)\r\n#endif\r\n\r\n#ifndef MAX_EP_COUNT\r\n#define MAX_EP_COUNT (5U)\r\n#endif\r\n\r\n#define IMUMC_WAITFOREVER (0xFFFFFFFFU)\r\n\r\n/*!\r\n * @brief Defines the imumc handle\r\n *\r\n * This macro is used to define a 4 byte aligned imumc handle.\r\n * Then use \"(hal_imumc_handle_t)name\" to get the imumc handle.\r\n *\r\n * The macro should be global and could be optional. You could also define imumc handle by yourself.\r\n *\r\n * This is an example,\r\n * @code\r\n * IMUMC_HANDLE_DEFINE(imumcHandle);\r\n * @endcode\r\n *\r\n * @param name The name string of the imumc handle.\r\n */\r\n#define IMUMC_HANDLE_DEFINE(name) uint32_t name[((HAL_IMUMC_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]\r\n\r\n/*! @brief The handle of IMUMC adapter */\r\ntypedef void *hal_imumc_handle_t;\r\n\r\n/*! @brief IMUMC status */\r\ntypedef enum _hal_imumc_status\r\n{\r\n    kStatus_HAL_ImumcSuccess = 0U,\r\n    kStatus_HAL_ImumcError,\r\n    kStatus_HAL_ImumcRxBusy,\r\n    kStatus_HAL_ImumcTxBusy,\r\n    kStatus_HAL_ImumcTxIdle,\r\n    kStatus_HAL_ImumcRxIdle,\r\n    kStatus_HAL_ImumcTimeout,\r\n} hal_imumc_status_t;\r\n\r\n/*! @brief IMUMC return status */\r\ntypedef enum _hal_imumc_return_status\r\n{\r\n    kStatus_HAL_RL_RELEASE = 0U,\r\n    kStatus_HAL_RL_HOLD,\r\n} hal_imumc_return_status_t;\r\n\r\n/*! @brief The callback function of IMUMC adapter.\r\n *\r\n * @note If Imumc RX callback function return kStatus_HAL_RL_RELEASE mode, no need to call HAL_ImumcFreeRxBuffer.\r\n * @note If Imumc RX callback function return kStatus_HAL_RL_HOLD mode,then need to call HAL_ImumcFreeRxBuffer.\r\n *\r\n */\r\ntypedef hal_imumc_return_status_t (*imumc_rx_callback_t)(void *param, uint8_t *data, uint32_t len);\r\n\r\n/*! @brief The configure structure of IMUMC adapter. */\r\ntypedef struct _hal_imumc_config\r\n{\r\n    uint8_t local_addr;           /* Local address for rx */\r\n    uint8_t remote_addr;          /* Remote address for tx */\r\n    imumc_rx_callback_t callback; /* RPMGS Rx callback  */\r\n    void *param;                  /* RPMGS Rx callback parameter */\r\n    uint8_t imuLink;\r\n} hal_imumc_config_t;\r\n\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif /* _cplusplus */\r\n\r\n/*!\r\n * @brief Initializes the IMUMC adapter module for dual core communication.\r\n *\r\n * @note This API should be called at the beginning of the application using the IMUMC adapter driver.\r\n *\r\n * @retval kStatus_HAL_ImumcSuccess IMUMC module initialize succeed.\r\n */\r\nhal_imumc_status_t HAL_ImumcMcmgrInit(void);\r\n\r\n/*!\r\n * @brief Initializes the IMUMC adapter for IMUMC channel configure.\r\n *\r\n * @note This API should be called to software IMUMC communication configure, and it be\r\n * called whenever application need it.\r\n *\r\n * @param handle Pointer to point to a memory space of size #HAL_IMUMC_HANDLE_SIZE allocated by the caller.\r\n * The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.\r\n * You can define the handle in the following two ways:\r\n * #IMUMC_HANDLE_DEFINE(handle);\r\n * or\r\n * uint32_t handle[((HAL_IMUMC_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))];\r\n * @param config           Used for config local/remote endpoint addr.\r\n * @retval kStatus_HAL_ImumcSuccess IMUMC module initialize succeed.\r\n */\r\nhal_imumc_status_t HAL_ImumcInit(hal_imumc_handle_t handle, hal_imumc_config_t *config);\r\n\r\n/*!\r\n * @brief DeInitilizate the IMUMC adapter module.\r\n *\r\n * @note This API should be called when not using the IMUMC adapter driver anymore.\r\n *\r\n * @param handle           IMUMC handle pointer.\r\n * @retval kStatus_HAL_ImumcSuccess IMUMC module deinitialize succeed.\r\n */\r\nhal_imumc_status_t HAL_ImumcDeinit(hal_imumc_handle_t handle);\r\n\r\n/*!\r\n * @brief Send data to another IMUMC module with timeout.\r\n *\r\n * This function will send a specified length of data to another core by IMUMC.\r\n *\r\n * @note This API should be called to send data.\r\n *\r\n * @param handle           IMUMC handle pointer.\r\n * @param data             Pointer to where the send data from.\r\n * @param length           The send data length.\r\n * @param timeout          Timeout in ms, 0 if nonblocking, IMUMC_WAITFOREVER for wait for forever.\r\n * @retval kStatus_HAL_ImumcSuccess IMUMC send data succeed.\r\n */\r\nhal_imumc_status_t HAL_ImumcSendTimeout(hal_imumc_handle_t handle, uint8_t *data, uint32_t length, uint32_t timeout);\r\n\r\n/*!\r\n * @brief Send data to another IMUMC module.\r\n *\r\n * This function will send a specified length of data to another core by IMUMC.\r\n *\r\n * @note This API should be called to send data.\r\n *\r\n * @param handle           IMUMC handle pointer.\r\n * @param data             Pointer to where the send data from.\r\n * @param length           The send data length.\r\n * @retval kStatus_HAL_ImumcSuccess IMUMC send data succeed.\r\n */\r\nhal_imumc_status_t HAL_ImumcSend(hal_imumc_handle_t handle, uint8_t *data, uint32_t length);\r\n\r\n/*!\r\n * @brief Allocates the tx buffer for message payload with timeout.\r\n *\r\n * This API can only be called at process context to get the tx buffer in vring. By this way, the\r\n * application can directly put its message into the vring tx buffer without copy from an application buffer.\r\n * It is the application responsibility to correctly fill the allocated tx buffer by data and passing correct\r\n * parameters to the imumc_lite_send_nocopy() function to perform data no-copy-send mechanism.\r\n *\r\n *\r\n * @param handle           IMUMC handle pointer.\r\n * @param size             The send data length.\r\n * @param timeout          Timeout in ms, 0 if nonblocking, IMUMC_WAITFOREVER for wait for forever.\r\n * @retval The tx buffer address on success and RL_NULL on failure.\r\n */\r\nvoid *HAL_ImumcAllocTxBufferTimeout(hal_imumc_handle_t handle, uint32_t size, uint32_t timeout);\r\n\r\n/*!\r\n * @brief Allocates the tx buffer for message payload.\r\n *\r\n * This API can only be called at process context to get the tx buffer in vring. By this way, the\r\n * application can directly put its message into the vring tx buffer without copy from an application buffer.\r\n * It is the application responsibility to correctly fill the allocated tx buffer by data and passing correct\r\n * parameters to the imumc_lite_send_nocopy() function to perform data no-copy-send mechanism.\r\n *\r\n *\r\n * @param handle           IMUMC handle pointer.\r\n * @param size           The send data length.\r\n * @retval The tx buffer address on success and RL_NULL on failure.\r\n */\r\nvoid *HAL_ImumcAllocTxBuffer(hal_imumc_handle_t handle, uint32_t size);\r\n\r\n/*!\r\n * @brief Send data with NoCopy to another IMUMC module.\r\n *\r\n * This function will send a specified length of data to another core by IMUMC.\r\n * This function sends txbuf of length len to the remote dst address,\r\n * and uses ept->addr as the source address.\r\n * The application has to take the responsibility for:\r\n *  1. tx buffer allocation (HAL_ImumcAllocTxBuffer())\r\n *  2. filling the data to be sent into the pre-allocated tx buffer\r\n *  3. not exceeding the buffer size when filling the data\r\n *  4. data cache coherency\r\n *\r\n * After the HAL_ImumcNoCopySend() function is issued the tx buffer is no more owned\r\n * by the sending task and must not be touched anymore unless the HAL_ImumcNoCopySend()\r\n * function fails and returns an error.\r\n *\r\n * @note This API should be called to send data.\r\n *\r\n * @param handle           IMUMC handle pointer.\r\n * @param data             Pointer to where the send data from.\r\n * @param length           The send data length.\r\n * @retval kStatus_HAL_ImumcSuccess IMUMC send data succeed.\r\n */\r\nhal_imumc_status_t HAL_ImumcNoCopySend(hal_imumc_handle_t handle, uint8_t *data, uint32_t length);\r\n\r\n/*!\r\n * @brief Releases the rx buffer for future reuse in vring.\r\n * This API can be called at process context when the\r\n * message in rx buffer is processed.\r\n *\r\n * @note The HAL_ImumcFreeRxBuffer need be called only if Imumc RX callback function return kStatus_HAL_RL_HOLD mode.\r\n *\r\n * @param handle           IMUMC handle pointer.\r\n * @param data             Pointer to where the received data from perr.\r\n\r\n *\r\n * @return Status of function execution, RL_SUCCESS on success.\r\n */\r\nhal_imumc_status_t HAL_ImumcFreeRxBuffer(hal_imumc_handle_t handle, uint8_t *data);\r\n\r\n/*!\r\n * @brief Install IMUMC rx callback.\r\n *\r\n * @note The function must be called because imumc adapter just support asynchronous receive mode\r\n *        should make sure the callback function is installed before the data received from peer soc,\r\n *        and the rx callback function will be called when the rx process complete.\r\n *\r\n *\r\n * @param handle    IMUMC handle pointer.\r\n * @retval kStatus_HAL_ImumcSuccess IMUMC install rx callback succeed.\r\n */\r\nhal_imumc_status_t HAL_ImumcInstallRxCallback(hal_imumc_handle_t handle, imumc_rx_callback_t callback, void *param);\r\n\r\n/*!\r\n * @brief Prepares to enter low power consumption.\r\n *\r\n * This function is used to prepare to enter low power consumption.\r\n *\r\n * @param handle           IMUMC handle pointer.\r\n * @retval kStatus_HAL_ImumcSuccess Successful operation.\r\n * @retval kStatus_HAL_ImumcError An error occurred.\r\n */\r\nhal_imumc_status_t HAL_ImumcEnterLowpower(hal_imumc_handle_t handle);\r\n\r\n/*!\r\n * @brief Prepares to exit low power consumption.\r\n *\r\n * This function is used to restore from low power consumption.\r\n *\r\n * @param handle           IMUMC handle pointer.\r\n * @retval kStatus_HAL_ImumcSuccess Successful operation.\r\n * @retval kStatus_HAL_ImumcError An error occurred.\r\n */\r\nhal_imumc_status_t HAL_ImumcExitLowpower(hal_imumc_handle_t handle);\r\n\r\n#ifndef IMU_TASK_PRIORITY\r\n#if defined(__ZEPHYR__)\r\n#define IMU_TASK_PRIORITY (3U)\r\n#elif defined(CPU2)\r\n#define IMU_TASK_PRIORITY (2U)\r\n#else\r\n#define IMU_TASK_PRIORITY                                                                                       \\\r\n    (6U) /* makesure the calculated priority of HAL_ImuMainCpu13 task is the same with tcp/ip task(priority 2), \\\r\n            otherwise the throughput of udp rx will be very low */\r\n#endif\r\n#endif\r\n\r\n#ifndef IMU_TASK_STACK_SIZE\r\n#define IMU_TASK_STACK_SIZE (2048U)\r\n#endif\r\n\r\n#define IMU_MAX_MSG_CNT_LONG      (16U)\r\n#define IMU_MAX_MSG_CNT_SHORT     (2U)\r\n#define IMU_SYNC_MAGIC_PATTERN    (0xABCDEF89U)\r\n#define IMU_TXQ_BUFSIZE           (32U) /*! must be power of 2 */\r\n#define IMU_TXQ_BUFSIZE_THRESHOLD (8U)\r\n#define IMU_TXQ_ENTRY_MASK        (IMU_TXQ_BUFSIZE - 1U)\r\n#define IMU_EVENT_TRIGGERS        ((1U << kIMU_LinkMax) - 1U)\r\n/*! @brief IMU message payload size. */\r\n#define IMU_PAYLOAD_SIZE (8U)\r\n\r\n#define IMUMC_EVENT_ENDPOINT_QUERY_RSP (1U << 0U)\r\n\r\n#ifndef IMUMC_TXQ13_BUFSIZE\r\n#define IMUMC_TXQ13_BUFSIZE (8U)\r\n#endif\r\n\r\n#ifndef IMUMC_TXQ23_BUFSIZE\r\n#define IMUMC_TXQ23_BUFSIZE (16U)\r\n#endif\r\n\r\n#ifndef IMUMC_TXQ13_BUFLENGTH\r\n#define IMUMC_TXQ13_BUFLENGTH (512U)\r\n#endif\r\n\r\n#ifndef IMUMC_TXQ23_BUFLENGTH\r\n#define IMUMC_TXQ23_BUFLENGTH (264U)\r\n#endif\r\n\r\n#define IMUMC_TXQ13_ENTRY_MASK (IMUMC_TXQ13_BUFSIZE - 1U)\r\n#define IMUMC_TXQ23_ENTRY_MASK (IMUMC_TXQ23_BUFSIZE - 1U)\r\n\r\n#if defined(CONFIG_IMU_GDMA) && (CONFIG_IMU_GDMA == 1)\r\n#define IMU_GDMA_ENABLE (1U)\r\n\r\n#else\r\n\r\n#define IMU_GDMA_ENABLE (0U)\r\n#endif\r\n\r\n/*! @brief IMU initialization state. */\r\nenum imu_init_state_t\r\n{\r\n    IMU_UNINITIALIZED,\r\n    IMU_INITIALIZING,\r\n    IMU_INITIALIZED\r\n};\r\n\r\n/*! @brief IMUMC type. */\r\ntypedef enum _imu_msg_type_t\r\n{\r\n    IMU_MSG_CONTROL,\r\n    IMU_MSG_COMMAND,\r\n    IMU_MSG_COMMAND_RESPONSE,\r\n    IMU_MSG_EVENT,\r\n    IMU_MSG_TX_DATA,\r\n    IMU_MSG_RX_DATA,\r\n    IMU_MSG_MULTI_TX_DATA,\r\n    IMU_MSG_MULTI_RX_DATA,\r\n    IMU_MSG_IMUMC,\r\n    IMU_MSG_MAX,\r\n    /* The header is 8 bits hence max types =255 */\r\n} imu_msg_type_t;\r\n\r\n/*! @brief IMUMC control message subtype. */\r\ntypedef enum _imu_ctrl_msg_subtype_t\r\n{\r\n    IMU_MSG_CONTROL_DEFAULT,\r\n    IMU_MSG_CONTROL_SYNC,\r\n    IMU_MSG_CONTROL_SYNC_ACK,\r\n    IMU_MSG_CONTROL_ACK_FOR_UNLOCK,\r\n    IMU_MSG_CONTROL_ERROR,\r\n    IMU_MSG_CONTROL_SHUTDOWN,\r\n    IMU_MSG_CONTROL_CMD_BUF_ADDR,\r\n    IMU_MSG_CONTROL_EVT_ACK,\r\n    IMU_MSG_CONTROL_COMMAND_RSP_ACK,\r\n    IMU_MSG_CONTROL_TX_BUF_ADDR,\r\n    IMU_MSG_CONTROL_FREE_RX_BUF,\r\n    IMU_MSG_CONTROL_IMUMC_EPT_QUIRY,\r\n    IMU_MSG_CONTROL_IMUMC_EPT_QUIRY_RSP,\r\n    IMU_MSG_CONTROL_IMUMC_BUF_FREE,\r\n    IMU_MSG_CONTROL_EVT_DUMP,\r\n    IMU_MSG_CONTROL_MAX,\r\n    /* The header is 8 bits hence max types =255 */\r\n} imu_ctrl_msg_subtype_t;\r\n\r\n/*! @brief IMU message header structure. */\r\ntypedef struct IMU_Hdr_t_\r\n{\r\n    volatile uint8_t type;\r\n    volatile uint8_t sub_type; // user of icc module needs to define own msg sub_types\r\n    volatile uint8_t seq_num;  // may be used by user of icc module for own purpose\r\n    volatile uint8_t length;   // length of Payload in bytes\r\n} IMU_Hdr_t;\r\n\r\n/*! @brief IMU message structure. */\r\ntypedef struct IMU_Msg_t_\r\n{\r\n    IMU_Hdr_t Hdr;\r\n    volatile uint32_t PayloadPtr[IMU_PAYLOAD_SIZE];\r\n} IMU_Msg_t;\r\n\r\n/*! @brief IMU message wrapper 1. */\r\ntypedef struct IMU_Msg_Wrapper_long_t_\r\n{\r\n    volatile uint32_t magic[2];\r\n    IMU_Msg_t msgQ[2][IMU_MAX_MSG_CNT_LONG];\r\n} IMU_Msg_Wrapper_long_t;\r\n\r\n/*! @brief IMU message wrapper 2. */\r\ntypedef struct IMU_Msg_Wrapper_short_t_\r\n{\r\n    volatile uint32_t magic[2];\r\n    IMU_Msg_t msgQ[2][IMU_MAX_MSG_CNT_SHORT];\r\n} IMU_Msg_Wrapper_short_t;\r\n\r\n/* imumc_std_hdr contains a reserved field,\r\n * this implementation of IMUMC uses this reserved\r\n * field to hold the idx and totlen of the buffer\r\n * not being returned to the vring in the receive\r\n * callback function. This way, the no-copy API\r\n * can use this field to return the buffer later.\r\n */\r\nstruct imumc_hdr_reserved\r\n{\r\n    uint16_t rfu; /* reserved for future usage */\r\n    uint16_t idx;\r\n};\r\n\r\n/*!\r\n * Common header for all imumc messages.\r\n * Every message sent/received on the imumc bus begins with this header.\r\n */\r\nstruct imumc_std_hdr\r\n{\r\n    uint32_t src;                       /*!< source endpoint address */\r\n    uint32_t dst;                       /*!< destination endpoint address */\r\n    struct imumc_hdr_reserved reserved; /*!< reserved for future use */\r\n    uint16_t len;                       /*!< length of payload (in bytes) */\r\n    uint16_t flags;                     /*!< message flags */\r\n};\r\n\r\n/*!\r\n * Common message structure.\r\n * Contains the header and the payload.\r\n */\r\nstruct imumc_std_msg\r\n{\r\n    struct imumc_std_hdr hdr; /*!< Imumc message header */\r\n    uint32_t data;            /*!< bytes of message payload data */\r\n};\r\n\r\ntypedef hal_imumc_status_t (*imu_callback_t)(IMU_Msg_t *pImuMsg, uint32_t length);\r\n\r\n/*! @brief IMU interrupt callback */\r\ntypedef void (*imu_irq_callback_t)(void);\r\n\r\n/*! @brief Checks whether a tx buffer queue is empty */\r\n#define IS_WLAN_TXBQ_EMPTY(q) ((q)->writeIndex == (q)->readIndex)\r\n\r\n/*! @brief Checks whether a tx buffer queue is full */\r\n#define IS_WLAN_TXBQ_FULL(q)                                                  \\\r\n    ((((q)->writeIndex & (1UL << 31U)) != ((q)->readIndex & (1UL << 31U))) && \\\r\n     (((q)->writeIndex & IMU_TXQ_ENTRY_MASK) == ((q)->readIndex & IMU_TXQ_ENTRY_MASK)))\r\n\r\n/*! @brief Increments write pointer*/\r\n#define INCR_WLAN_TXBQ_WR_INDEX(q, n)                                \\\r\n    {                                                                \\\r\n        unsigned int wrapBit = (q)->writeIndex & (1UL << 31U);       \\\r\n        unsigned int val     = (q)->writeIndex & IMU_TXQ_ENTRY_MASK; \\\r\n        unsigned int newVal  = (val + (n)) & IMU_TXQ_ENTRY_MASK;     \\\r\n        if ((n) > 0U)                                                \\\r\n        {                                                            \\\r\n            if (newVal <= val)                                       \\\r\n            {                                                        \\\r\n                (q)->writeIndex = newVal | (wrapBit ^ (1UL << 31U)); \\\r\n            }                                                        \\\r\n            else                                                     \\\r\n            {                                                        \\\r\n                (q)->writeIndex = newVal | wrapBit;                  \\\r\n            }                                                        \\\r\n        }                                                            \\\r\n    }\r\n\r\n/*! @brief Increments read pointer */\r\n#define INCR_WLAN_TXBQ_RD_INDEX(q, n)                               \\\r\n    {                                                               \\\r\n        unsigned int wrapBit = (q)->readIndex & (1UL << 31U);       \\\r\n        unsigned int val     = (q)->readIndex & IMU_TXQ_ENTRY_MASK; \\\r\n        unsigned int newVal  = (val + (n)) & IMU_TXQ_ENTRY_MASK;    \\\r\n        if ((n) > 0U)                                               \\\r\n        {                                                           \\\r\n            if (newVal <= val)                                      \\\r\n            {                                                       \\\r\n                (q)->readIndex = newVal | (wrapBit ^ (1UL << 31U)); \\\r\n            }                                                       \\\r\n            else                                                    \\\r\n            {                                                       \\\r\n                (q)->readIndex = newVal | wrapBit;                  \\\r\n            }                                                       \\\r\n        }                                                           \\\r\n    }\r\n\r\n/*! @brief Checks whether a tx buffer queue is empty */\r\n#define IS_IMUMC_TXBQ13_EMPTY(q) ((q)->writeIndex == (q)->readIndex)\r\n#define IS_IMUMC_TXBQ23_EMPTY(q) ((q)->writeIndex == (q)->readIndex)\r\n\r\n/*! @brief Checks whether a tx buffer queue is full */\r\n#define IS_IMUMC_TXBQ13_FULL(q)                                               \\\r\n    ((((q)->writeIndex & (1UL << 31U)) != ((q)->readIndex & (1UL << 31U))) && \\\r\n     (((q)->writeIndex & IMUMC_TXQ13_ENTRY_MASK) == ((q)->readIndex & IMUMC_TXQ13_ENTRY_MASK)))\r\n#define IS_IMUMC_TXBQ23_FULL(q)                                               \\\r\n    ((((q)->writeIndex & (1UL << 31U)) != ((q)->readIndex & (1UL << 31U))) && \\\r\n     (((q)->writeIndex & IMUMC_TXQ23_ENTRY_MASK) == ((q)->readIndex & IMUMC_TXQ23_ENTRY_MASK)))\r\n\r\n/*! @brief Increments write pointer*/\r\n#define INCR_IMUMC_TXBQ13_WR_INDEX(q, n)                                 \\\r\n    {                                                                    \\\r\n        unsigned int wrapBit = (q)->writeIndex & (1UL << 31U);           \\\r\n        unsigned int val     = (q)->writeIndex & IMUMC_TXQ13_ENTRY_MASK; \\\r\n        unsigned int newVal  = (val + (n)) & IMUMC_TXQ13_ENTRY_MASK;     \\\r\n        if ((n) > 0U)                                                    \\\r\n        {                                                                \\\r\n            if (newVal <= val)                                           \\\r\n            {                                                            \\\r\n                (q)->writeIndex = newVal | (wrapBit ^ (1UL << 31U));     \\\r\n            }                                                            \\\r\n            else                                                         \\\r\n            {                                                            \\\r\n                (q)->writeIndex = newVal | wrapBit;                      \\\r\n            }                                                            \\\r\n        }                                                                \\\r\n    }\r\n\r\n#define INCR_IMUMC_TXBQ23_WR_INDEX(q, n)                                 \\\r\n    {                                                                    \\\r\n        unsigned int wrapBit = (q)->writeIndex & (1UL << 31U);           \\\r\n        unsigned int val     = (q)->writeIndex & IMUMC_TXQ23_ENTRY_MASK; \\\r\n        unsigned int newVal  = (val + (n)) & IMUMC_TXQ23_ENTRY_MASK;     \\\r\n        if ((n) > 0U)                                                    \\\r\n        {                                                                \\\r\n            if (newVal <= val)                                           \\\r\n            {                                                            \\\r\n                (q)->writeIndex = newVal | (wrapBit ^ (1UL << 31U));     \\\r\n            }                                                            \\\r\n            else                                                         \\\r\n            {                                                            \\\r\n                (q)->writeIndex = newVal | wrapBit;                      \\\r\n            }                                                            \\\r\n        }                                                                \\\r\n    }\r\n\r\n/*! @brief Increments read pointer */\r\n#define INCR_IMUMC_TXBQ13_RD_INDEX(q, n)                                \\\r\n    {                                                                   \\\r\n        unsigned int wrapBit = (q)->readIndex & (1UL << 31U);           \\\r\n        unsigned int val     = (q)->readIndex & IMUMC_TXQ13_ENTRY_MASK; \\\r\n        unsigned int newVal  = (val + (n)) & IMUMC_TXQ13_ENTRY_MASK;    \\\r\n        if ((n) > 0U)                                                   \\\r\n        {                                                               \\\r\n            if (newVal <= val)                                          \\\r\n            {                                                           \\\r\n                (q)->readIndex = newVal | (wrapBit ^ (1UL << 31U));     \\\r\n            }                                                           \\\r\n            else                                                        \\\r\n            {                                                           \\\r\n                (q)->readIndex = newVal | wrapBit;                      \\\r\n            }                                                           \\\r\n        }                                                               \\\r\n    }\r\n\r\n#define INCR_IMUMC_TXBQ23_RD_INDEX(q, n)                                \\\r\n    {                                                                   \\\r\n        unsigned int wrapBit = (q)->readIndex & (1UL << 31U);           \\\r\n        unsigned int val     = (q)->readIndex & IMUMC_TXQ23_ENTRY_MASK; \\\r\n        unsigned int newVal  = (val + (n)) & IMUMC_TXQ23_ENTRY_MASK;    \\\r\n        if ((n) > 0U)                                                   \\\r\n        {                                                               \\\r\n            if (newVal <= val)                                          \\\r\n            {                                                           \\\r\n                (q)->readIndex = newVal | (wrapBit ^ (1UL << 31U));     \\\r\n            }                                                           \\\r\n            else                                                        \\\r\n            {                                                           \\\r\n                (q)->readIndex = newVal | wrapBit;                      \\\r\n            }                                                           \\\r\n        }                                                               \\\r\n    }\r\n\r\ntypedef struct _hal_imumc_rx_state\r\n{\r\n    imumc_rx_callback_t callback;\r\n    void *param;\r\n} hal_imumc_rx_state_t;\r\n\r\n/*! @brief imumc state structure. */\r\ntypedef struct _hal_imumc_state\r\n{\r\n    LIST_ELEM_st eptLink;\r\n    uint32_t local_addr;\r\n    uint32_t remote_addr;\r\n    uint8_t imuLink;\r\n    bool eptLinkIsReady;\r\n    hal_imumc_rx_state_t rx;\r\n} hal_imumc_state_t;\r\n\r\n/*! @brief imumc ept buf structure. */\r\ntypedef struct _hal_imumc_ept_uf\r\n{\r\n    LIST_ELEM_st eptLink;\r\n    uint32_t addr;\r\n} hal_imumc_ept_buf_t;\r\n\r\n/*! @brief IMU WLAN Tx buffer control structure */\r\ntypedef struct IMU_WLAN_TXQ_CTRL_st\r\n{\r\n    uint32_t writeIndex;\r\n    uint32_t readIndex;\r\n    uint32_t txBufQue[IMU_TXQ_BUFSIZE];\r\n} IMU_WLAN_TXQ_CTRL_st;\r\n\r\n/*! @brief IMUMC Tx buffer control structure */\r\ntypedef struct IMUMC_TXQ_CTRL_st\r\n{\r\n    uint32_t writeIndex;\r\n    uint32_t readIndex;\r\n    uint32_t txBufQue[IMUMC_TXQ23_BUFSIZE];\r\n} IMUMC_TXQ_CTRL_st;\r\n\r\n/*! @brief imu handle structure. */\r\ntypedef struct _hal_imu_handle_t\r\n{\r\n    /*! Word 0 */\r\n    uint8_t imuLink;\r\n    uint8_t imuSyncState; /*！ 0：Link Off, 1:Link Ongoing, 2: Link Up */\r\n    uint8_t freeTxMportBufCnt;\r\n    uint8_t imuMsgBufIdx;\r\n    /*! Word 1 */\r\n    bool cmd_buffer_available;\r\n    bool cmd_response_buffer_available;\r\n    bool rsvdbool1;\r\n    bool rsvdbool2;\r\n    /*! Word 2 */\r\n    uint32_t *cmd_buffer;\r\n    /*! Word 3 */\r\n    IMU_WLAN_TXQ_CTRL_st wlanTxqCtl;\r\n    /*! Word 37 */\r\n    uint32_t imuMsgBuf[IMU_PAYLOAD_SIZE];\r\n    /*! Word 45 */\r\n    LIST_ELEM_st eptList;\r\n    /*! Word 47 */\r\n    IMUMC_TXQ_CTRL_st imumcTxqCtl;\r\n    /*! Word 57 */\r\n    imu_callback_t imuHandler[IMU_MSG_MAX];\r\n} hal_imu_handle_t;\r\n\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif /* _cplusplus */\r\n\r\n/*!\r\n * @brief Add wlan Tx packet for sending multiple Tx packets within one message.\r\n *\r\n * This function is used to add a wlan Tx packet for IMU_MSG_MULTI_TX_DATA.\r\n *\r\n * @param imuLink           IMU link ID.\r\n * @param txBuf             Tx buffer to be sent.\r\n * @param length            Length of Tx data.\r\n * @retval kStatus_HAL_ImumcSuccess or kStatus_HAL_ImumcError.\r\n */\r\nhal_imumc_status_t HAL_ImuAddWlanTxPacket(uint8_t imuLink, uint8_t *txBuf, uint32_t length);\r\n\r\n/*!\r\n * @brief Add wlan Tx packet for sending multiple Tx packets within one message.\r\n *\r\n * This function is used to add a wlan Tx packet with callback function for IMU_MSG_MULTI_TX_DATA.\r\n *\r\n * @param imuLink           IMU link ID.\r\n * @param txBuf             Tx buffer to be sent.\r\n * @param length            Length of Tx data.\r\n * @param cb                Callback function to add packet.\r\n * @retval kStatus_HAL_ImumcSuccess or kStatus_HAL_ImumcError.\r\n */\r\nhal_imumc_status_t HAL_ImuAddWlanTxPacketExt(uint8_t imuLink,\r\n                                             uint8_t *txBuf,\r\n                                             uint32_t length,\r\n                                             void (*cb)(void *destAddr, void *srcAddr, uint32_t len));\r\n\r\n/*!\r\n * @brief Install wlan callback.\r\n *\r\n * This function is used to imstall wlan callback\r\n *\r\n * @param imuLink        IMU link ID.\r\n * @param callback       Callback to be installed.\r\n * @param type           Callback type.\r\n * @retval kStatus_HAL_ImumcSuccess or kStatus_HAL_ImumcError.\r\n */\r\nhal_imumc_status_t HAL_ImuInstallCallback(uint8_t imuLink, imu_callback_t callback, uint8_t type);\r\n\r\n/*!\r\n * @brief Install imu interrupt callback.\r\n *\r\n * This function is used to install imu interrupt callback\r\n *\r\n * @param imuLink        IMU link ID.\r\n * @param callback       Callback to be installed.\r\n * @retval kStatus_HAL_ImumcSuccess or kStatus_HAL_ImumcError.\r\n */\r\nhal_imumc_status_t HAL_ImuInstallIrqCallback(uint8_t imuLink, imu_irq_callback_t callback);\r\n\r\n/*!\r\n * @brief Send wlan command packet.\r\n *\r\n * This function is used to send wlan command packet\r\n *\r\n * @param imuLink        IMU link ID.\r\n * @param cmdBuf         Command buffer to be sent.\r\n * @param length         Length of command data.\r\n * @retval kStatus_HAL_ImumcSuccess or kStatus_HAL_ImumcError.\r\n */\r\nhal_imumc_status_t HAL_ImuSendCommand(uint8_t imuLink, uint8_t *cmdBuf, uint32_t length);\r\n\r\n/*!\r\n * @brief Add wlan Tx packet for sending one Tx packet within one message.\r\n *\r\n * This function is used to send a wlan Tx packet.\r\n *\r\n * @param imuLink           IMU link ID.\r\n * @param txBuf             Tx buffer to be sent.\r\n * @param length            Length of Tx data.\r\n * @retval kStatus_HAL_ImumcSuccess or kStatus_HAL_ImumcError.\r\n */\r\nhal_imumc_status_t HAL_ImuSendTxData(uint8_t imuLink, uint8_t *txBuf, uint32_t length);\r\n\r\n/*!\r\n * @brief Send multiple Tx packets within one message.\r\n *\r\n * This function is used to send multiple wlan Tx packets within one IMU message,\r\n * which have been added by HAL_ImuAddWlanTxPacket already.\r\n *\r\n * @param imuLink           IMU link ID.\r\n * @retval kStatus_HAL_ImumcSuccess or kStatus_HAL_ImumcError.\r\n */\r\nhal_imumc_status_t HAL_ImuSendMultiTxData(uint8_t imuLink);\r\n\r\n/*!\r\n * @brief Check if IMU link is up.\r\n *\r\n * This function is used to check if IMU link is up.\r\n *\r\n * @param imuLink        IMU link ID.\r\n * @retval kStatus_HAL_ImumcSuccess for IMU link up or kStatus_HAL_ImumcError for IMU link not up.\r\n */\r\nhal_imumc_status_t HAL_ImuLinkIsUp(uint8_t imuLink);\r\n\r\n/*!\r\n * @brief Start IMU link\r\n *\r\n * This function is used to start specified IMU link.\r\n *\r\n * @param imuLink        IMU link ID.\r\n * @retval kStatus_HAL_ImumcSuccess or kStatus_HAL_ImumcError.\r\n */\r\nhal_imumc_status_t HAL_ImuInit(imu_link_t link);\r\n\r\n/*!\r\n * @brief Stop IMU link\r\n *\r\n * This function is used to stop specified IMU link.\r\n *\r\n * @param imuLink        IMU link ID.\r\n * @param flag           flag with bits to control.\r\n *        flag bit0: control if need send imu msg to fw (imu tx return /imu shutdown)\r\n *        flag bit1: control if need destroy ImuTask and ImuQFlagsRef\r\n * @retval kStatus_HAL_ImumcSuccess or kStatus_HAL_ImumcError.\r\n */\r\nhal_imumc_status_t HAL_ImuDeinit(imu_link_t link, uint32_t flag);\r\n\r\n/*!\r\n * @brief Return all tx buffer.\r\n *\r\n * This function is used to return all tx buffer to CPU1.\r\n *\r\n * @param imuLink              IMU link ID.\r\n * @retval kStatus_HAL_ImumcSuccess or kStatus_HAL_ImumcError.\r\n */\r\nhal_imumc_status_t HAL_ImuReturnAllTxBuf(imu_link_t link);\r\n\r\n/*!\r\n * @brief Receive IMU message.\r\n *\r\n * This function is used to receive and process IMU message\r\n *\r\n * @param imuLink              IMU link ID.\r\n * @retval kStatus_HAL_ImumcSuccess or kStatus_HAL_ImumcError.\r\n */\r\nhal_imumc_status_t HAL_ImuReceive(uint8_t imuLink);\r\n\r\n/*!\r\n * @brief Check if tx buffer queue empty.\r\n *\r\n * This function is used to check if tx buffer queue empty\r\n *\r\n * @param imuLink              IMU link ID.\r\n * @retval TRUE or FALSE.\r\n */\r\nbool HAL_ImuIsTxBufQueueEmpty(uint8_t imuLink);\r\n\r\n#if defined(IMU_GDMA_ENABLE) && (IMU_GDMA_ENABLE == 1)\r\n/*!\r\n * @brief Copy data by GDMA.\r\n *\r\n * This function is used to copy data by GDMA between shared memory and local memory.\r\n *\r\n * @param destAddr          Source address of data.\r\n * @param srcAddr           Destination address of data.\r\n * @param len               Data Length.\r\n */\r\nvoid HAL_ImuGdmaCopyData(void *destAddr, void *srcAddr, uint32_t len);\r\n\r\n/*! @}*/\r\n#endif\r\n\r\n#ifdef CONFIG_FW_DUMP_EVENT\r\n/*!\r\n * @brief Send fw dump event ack.\r\n *\r\n * This function is used to Send fw dump event ack to fw, When the event data process is completed.\r\n *\r\n * @param imuLink              IMU link ID.\r\n * @param rxBuf                Rx buffer to be sent.\r\n * @param length               Length of Rx buffer\r\n * @retval kStatus_HAL_ImumcSuccess or kStatus_HAL_ImumcError.\r\n */\r\nhal_imumc_status_t HAL_ImuSendEventDumpAck(imu_link_t link, uint8_t *rxBuf, uint8_t length);\r\n#endif\r\n\r\n/*!\r\n * @brief Create imu task mutex.\r\n *\r\n * This function creates a imu task mutex.\r\n *\r\n * @retval kStatus_HAL_ImumcSuccess or kStatus_HAL_ImumcError.\r\n */\r\nhal_imumc_status_t HAL_ImuCreateTaskLock(void);\r\n\r\n/*!\r\n * @brief Delete imu task mutex.\r\n *\r\n * This function deletes the imu task mutex.\r\n */\r\nvoid HAL_ImuDeleteTaskLock(void);\r\n\r\n/*!\r\n * @brief Acquire imu task mutex.\r\n *\r\n * This function acquires the imu task mutex. Only one thread can acquire the mutex at any\r\n * given time.\r\n *\r\n * @retval kStatus_HAL_ImumcSuccess or kStatus_HAL_ImumcError.\r\n */\r\nhal_imumc_status_t HAL_ImuGetTaskLock(void);\r\n\r\n/*!\r\n * @brief Release imu task mutex.\r\n *\r\n * This function releases the imu task mutex.\r\n *\r\n * @retval kStatus_HAL_ImumcSuccess or kStatus_HAL_ImumcError.\r\n */\r\nhal_imumc_status_t HAL_ImuPutTaskLock(void);\r\n\r\n/*!\r\n * @brief Reset imu readIndex and writeIndex to 0.\r\n *\r\n * This function reset the imu txq.\r\n */\r\nvoid HAL_ImuResetWlanTxq(uint8_t imuLink);\r\n\r\n\r\n\r\n/*!\r\n * @addtogroup IMUMC_Adapter\r\n * @{\r\n */\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*! @brief IMUMC Msaster/Remote role definition (0 - Master, 1 - Remote) */\r\n#ifndef HAL_IMUMC_SELECT_ROLE\r\n#define HAL_IMUMC_SELECT_ROLE (1U)\r\n#endif\r\n\r\n/*! @brief IMUMC handle size definition */\r\n#define HAL_IMUMC_HANDLE_SIZE (52U)\r\n\r\n#ifndef REMOTE_CORE_BOOT_ADDRESS\r\n#define REMOTE_CORE_BOOT_ADDRESS (0x01000000U)\r\n#endif\r\n\r\n#ifndef MAX_EP_COUNT\r\n#define MAX_EP_COUNT (5U)\r\n#endif\r\n\r\n#define IMUMC_WAITFOREVER (0xFFFFFFFFU)\r\n\r\n/*!\r\n * @brief Defines the imumc handle\r\n *\r\n * This macro is used to define a 4 byte aligned imumc handle.\r\n * Then use \"(hal_imumc_handle_t)name\" to get the imumc handle.\r\n *\r\n * The macro should be global and could be optional. You could also define imumc handle by yourself.\r\n *\r\n * This is an example,\r\n * @code\r\n * IMUMC_HANDLE_DEFINE(imumcHandle);\r\n * @endcode\r\n *\r\n * @param name The name string of the imumc handle.\r\n */\r\n#define IMUMC_HANDLE_DEFINE(name) uint32_t name[((HAL_IMUMC_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]\r\n\r\n/*!\r\n * @brief Initializes the IMUMC adapter module for dual core communication.\r\n *\r\n * @note This API should be called at the beginning of the application using the IMUMC adapter driver.\r\n *\r\n * @retval kStatus_HAL_ImumcSuccess IMUMC module initialize succeed.\r\n */\r\nhal_imumc_status_t HAL_ImumcMcmgrInit(void);\r\n\r\n/*!\r\n * @brief Initializes the IMUMC adapter for IMUMC channel configure.\r\n *\r\n * @note This API should be called to software IMUMC communication configure, and it be\r\n * called whenever application need it.\r\n *\r\n * @param handle Pointer to point to a memory space of size #HAL_IMUMC_HANDLE_SIZE allocated by the caller.\r\n * The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.\r\n * You can define the handle in the following two ways:\r\n * #IMUMC_HANDLE_DEFINE(handle);\r\n * or\r\n * uint32_t handle[((HAL_IMUMC_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))];\r\n * @param config           Used for config local/remote endpoint addr.\r\n * @retval kStatus_HAL_ImumcSuccess IMUMC module initialize succeed.\r\n */\r\nhal_imumc_status_t HAL_ImumcInit(hal_imumc_handle_t handle, hal_imumc_config_t *config);\r\n\r\n/*!\r\n * @brief DeInitilizate the IMUMC adapter module.\r\n *\r\n * @note This API should be called when not using the IMUMC adapter driver anymore.\r\n *\r\n * @param handle           IMUMC handle pointer.\r\n * @retval kStatus_HAL_ImumcSuccess IMUMC module deinitialize succeed.\r\n */\r\nhal_imumc_status_t HAL_ImumcDeinit(hal_imumc_handle_t handle);\r\n\r\n/*!\r\n * @brief Send data to another IMUMC module with timeout.\r\n *\r\n * This function will send a specified length of data to another core by IMUMC.\r\n *\r\n * @note This API should be called to send data.\r\n *\r\n * @param handle           IMUMC handle pointer.\r\n * @param data             Pointer to where the send data from.\r\n * @param length           The send data length.\r\n * @param timeout          Timeout in ms, 0 if nonblocking, IMUMC_WAITFOREVER for wait for forever.\r\n * @retval kStatus_HAL_ImumcSuccess IMUMC send data succeed.\r\n */\r\nhal_imumc_status_t HAL_ImumcSendTimeout(hal_imumc_handle_t handle, uint8_t *data, uint32_t length, uint32_t timeout);\r\n\r\n/*!\r\n * @brief Send data to another IMUMC module.\r\n *\r\n * This function will send a specified length of data to another core by IMUMC.\r\n *\r\n * @note This API should be called to send data.\r\n *\r\n * @param handle           IMUMC handle pointer.\r\n * @param data             Pointer to where the send data from.\r\n * @param length           The send data length.\r\n * @retval kStatus_HAL_ImumcSuccess IMUMC send data succeed.\r\n */\r\nhal_imumc_status_t HAL_ImumcSend(hal_imumc_handle_t handle, uint8_t *data, uint32_t length);\r\n\r\n/*!\r\n * @brief Allocates the tx buffer for message payload with timeout.\r\n *\r\n * This API can only be called at process context to get the tx buffer in vring. By this way, the\r\n * application can directly put its message into the vring tx buffer without copy from an application buffer.\r\n * It is the application responsibility to correctly fill the allocated tx buffer by data and passing correct\r\n * parameters to the imumc_lite_send_nocopy() function to perform data no-copy-send mechanism.\r\n *\r\n *\r\n * @param handle           IMUMC handle pointer.\r\n * @param size             The send data length.\r\n * @param timeout          Timeout in ms, 0 if nonblocking, IMUMC_WAITFOREVER for wait for forever.\r\n * @retval The tx buffer address on success and RL_NULL on failure.\r\n */\r\nvoid *HAL_ImumcAllocTxBufferTimeout(hal_imumc_handle_t handle, uint32_t size, uint32_t timeout);\r\n\r\n/*!\r\n * @brief Allocates the tx buffer for message payload.\r\n *\r\n * This API can only be called at process context to get the tx buffer in vring. By this way, the\r\n * application can directly put its message into the vring tx buffer without copy from an application buffer.\r\n * It is the application responsibility to correctly fill the allocated tx buffer by data and passing correct\r\n * parameters to the imumc_lite_send_nocopy() function to perform data no-copy-send mechanism.\r\n *\r\n *\r\n * @param handle           IMUMC handle pointer.\r\n * @param size           The send data length.\r\n * @retval The tx buffer address on success and RL_NULL on failure.\r\n */\r\nvoid *HAL_ImumcAllocTxBuffer(hal_imumc_handle_t handle, uint32_t size);\r\n\r\n/*!\r\n * @brief Send data with NoCopy to another IMUMC module.\r\n *\r\n * This function will send a specified length of data to another core by IMUMC.\r\n * This function sends txbuf of length len to the remote dst address,\r\n * and uses ept->addr as the source address.\r\n * The application has to take the responsibility for:\r\n *  1. tx buffer allocation (HAL_ImumcAllocTxBuffer())\r\n *  2. filling the data to be sent into the pre-allocated tx buffer\r\n *  3. not exceeding the buffer size when filling the data\r\n *  4. data cache coherency\r\n *\r\n * After the HAL_ImumcNoCopySend() function is issued the tx buffer is no more owned\r\n * by the sending task and must not be touched anymore unless the HAL_ImumcNoCopySend()\r\n * function fails and returns an error.\r\n *\r\n * @note This API should be called to send data.\r\n *\r\n * @param handle           IMUMC handle pointer.\r\n * @param data             Pointer to where the send data from.\r\n * @param length           The send data length.\r\n * @retval kStatus_HAL_ImumcSuccess IMUMC send data succeed.\r\n */\r\nhal_imumc_status_t HAL_ImumcNoCopySend(hal_imumc_handle_t handle, uint8_t *data, uint32_t length);\r\n\r\n/*!\r\n * @brief Releases the rx buffer for future reuse in vring.\r\n * This API can be called at process context when the\r\n * message in rx buffer is processed.\r\n *\r\n * @note The HAL_ImumcFreeRxBuffer need be called only if Imumc RX callback function return kStatus_HAL_RL_HOLD mode.\r\n *\r\n * @param handle           IMUMC handle pointer.\r\n * @param data             Pointer to where the received data from perr.\r\n\r\n *\r\n * @return Status of function execution, RL_SUCCESS on success.\r\n */\r\nhal_imumc_status_t HAL_ImumcFreeRxBuffer(hal_imumc_handle_t handle, uint8_t *data);\r\n\r\n/*!\r\n * @brief Install IMUMC rx callback.\r\n *\r\n * @note The function must be called because imumc adapter just support asynchronous receive mode\r\n *        should make sure the callback function is installed before the data received from peer soc,\r\n *        and the rx callback function will be called when the rx process complete.\r\n *\r\n *\r\n * @param handle    IMUMC handle pointer.\r\n * @retval kStatus_HAL_ImumcSuccess IMUMC install rx callback succeed.\r\n */\r\nhal_imumc_status_t HAL_ImumcInstallRxCallback(hal_imumc_handle_t handle, imumc_rx_callback_t callback, void *param);\r\n\r\n/*!\r\n * @brief Prepares to enter low power consumption.\r\n *\r\n * This function is used to prepare to enter low power consumption.\r\n *\r\n * @param handle           IMUMC handle pointer.\r\n * @retval kStatus_HAL_ImumcSuccess Successful operation.\r\n * @retval kStatus_HAL_ImumcError An error occurred.\r\n */\r\nhal_imumc_status_t HAL_ImumcEnterLowpower(hal_imumc_handle_t handle);\r\n\r\n/*!\r\n * @brief Prepares to exit low power consumption.\r\n *\r\n * This function is used to restore from low power consumption.\r\n *\r\n * @param handle           IMUMC handle pointer.\r\n * @retval kStatus_HAL_ImumcSuccess Successful operation.\r\n * @retval kStatus_HAL_ImumcError An error occurred.\r\n */\r\nhal_imumc_status_t HAL_ImumcExitLowpower(hal_imumc_handle_t handle);\r\n\r\n/*! @}*/\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n/*! @}*/\r\n#endif /* __FSL_ADAPTER_RFIMU_H__ */"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/imu_adapter/fsl_adapter_imu_common.h",
    "content": "/*\r\n * Copyright 2021 NXP\r\n * All rights reserved.\r\n *\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef __FSL_ADAPTER_RFCOMMON_H__\r\n#define __FSL_ADAPTER_RFCOMMON_H__\r\n\r\n#include \"fsl_os_abstraction.h\"\r\n#include \"fsl_imu.h\"\r\n#include \"assert.h\"\r\n#if defined(CPU2)\r\n#include \"core_cm3.h\"\r\n#endif\r\n\r\n/*! @brief TRUE/FALSE definition. */\r\n#ifndef FALSE\r\n#define FALSE 0\r\n#endif\r\n\r\n#ifndef TRUE\r\n#define TRUE 1\r\n#endif\r\n\r\n/*******************************************************************************\r\n * List Definitions and APIs\r\n ******************************************************************************/\r\n/**\r\n * @brief Macro to iterate over a list using a user specified loop cursor.\r\n *\r\n * @param cur   the variable used for cursor, representing the current list node.\r\n * @param list  the head for your list.\r\n */\r\n#define list_for_each(cur, list) for ((cur) = (list)->next; (cur) != (list); (cur) = (cur)->next)\r\n\r\n/**\r\n * @brief An element in a doubly-linked circular list.\r\n *  A list is a doubly-linked circular list.\r\n */\r\ntypedef struct LIST_ELEM_st\r\n{\r\n    struct LIST_ELEM_st *next;\r\n    struct LIST_ELEM_st *prev;\r\n} LIST_ELEM_st;\r\n\r\n/**\r\n *  @brief Initializes a list, as an empty list.\r\n *  @param list The list descriptor, i.e. the fake list element that identifies a given list.\r\n */\r\nstatic inline void LIST_init(LIST_ELEM_st *list)\r\n{\r\n    list->next = list;\r\n    list->prev = list;\r\n}\r\n\r\n/**\r\n *  @brief Initializes an element, as an element not yet bound within a list.\r\n *  @param elem The element to Initialize.\r\n */\r\nstatic inline void LIST_elemInit(LIST_ELEM_st *elem)\r\n{\r\n    elem->next = NULL;\r\n    elem->prev = NULL;\r\n}\r\n\r\n/**\r\n *  @brief  Inserts a new element in a list before a given existing element.\r\n *  @param  list    The list descriptor, i.e. the fake list element that identifies a given list.\r\n *  @param  elem    The new element is placed before this element.\r\n *  @param  newElem New element to insert in the list.\r\n */\r\nstatic inline void LIST_insertBefore(LIST_ELEM_st *list, LIST_ELEM_st *elem, LIST_ELEM_st *newElem)\r\n{\r\n    assert(newElem != list);\r\n\r\n    (void)list;\r\n\r\n    (elem->prev)->next = newElem;\r\n    newElem->next      = elem;\r\n    newElem->prev      = elem->prev;\r\n    elem->prev         = newElem;\r\n}\r\n\r\n/**\r\n *  @brief  Adds an element in a list at the tail of that list.\r\n *  @param  list The list descriptor, i.e. the fake list element that identifies a given list.\r\n *  @param  elem New element to insert in the list.\r\n */\r\nstatic inline void LIST_addTail(LIST_ELEM_st *list, LIST_ELEM_st *elem)\r\n{\r\n    LIST_insertBefore(list, list, elem);\r\n}\r\n\r\n/**\r\n *  @brief  Removes an element from a list.\r\n *  @param  list The list descriptor, i.e. the fake list element that identifies a given list.\r\n *  @param  elem The element to remove.\r\n */\r\nstatic inline void LIST_remove(LIST_ELEM_st *list, LIST_ELEM_st *elem)\r\n{\r\n    assert(elem != list);\r\n\r\n    (void)list;\r\n\r\n    if ((elem->next == NULL) || (elem->prev == NULL))\r\n    {\r\n        return;\r\n    }\r\n    (elem->prev)->next = elem->next;\r\n    (elem->next)->prev = elem->prev;\r\n\r\n    elem->next = NULL; // to indicate this is not linked yet\r\n    elem->prev = NULL;\r\n}\r\n\r\n/*!\r\n * @addtogroup IMU_Adapter\r\n * @{\r\n */\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*!\r\n   IRQ index should come from board level definition.\r\n   Remove following definition after IMUMC code integration.\r\n*/\r\n#if defined(CPU2)\r\n#define IRQ_IMU_CPU12 CPU1_TO_CPU2_MSG_RDY_IMU_INT_IRQn\r\n#define IRQ_IMU_CPU32 CPU3_TO_CPU2_MSG_RDY_IMU_INT_IRQn\r\n#else\r\n#define IRQ_IMU_CPU13 WL_MCI_WAKEUP0_IRQn\r\n#define IRQ_IMU_CPU23 BLE_MCI_WAKEUP0_IRQn\r\n#endif\r\n\r\n#if defined(CPU2)\r\n#define IMU_MSG_SND_Q(imuLinkId) (((imuLinkId) == kIMU_LinkCpu1Cpu2) ? imuMsgQ12->msgQ[1] : imuMsgQ23->msgQ[0])\r\n#define IMU_MSG_CUR_MAGIC_P(imuLinkId) \\\r\n    (((imuLinkId) == kIMU_LinkCpu1Cpu2) ? (&imuMsgQ12->magic[1]) : (&imuMsgQ23->magic[0]))\r\n#define IMU_MSG_PEER_MAGIC_P(imuLinkId) \\\r\n    (((imuLinkId) == kIMU_LinkCpu1Cpu2) ? (&imuMsgQ12->magic[0]) : (&imuMsgQ23->magic[1]))\r\n#define IRQID_TO_IMULINKID(irqId)     (((irqId) == IRQ_IMU_CPU12) ? kIMU_LinkCpu1Cpu2 : kIMU_LinkCpu2Cpu3)\r\n#define IMULINKID_TO_IRQID(imuLinkId) (((imuLinkId) == kIMU_LinkCpu1Cpu2) ? IRQ_IMU_CPU12 : IRQ_IMU_CPU32)\r\n#else\r\n#define IMU_MSG_SND_Q(imuLinkId) (((imuLinkId) == kIMU_LinkCpu1Cpu3) ? imuMsgQ13->msgQ[1] : imuMsgQ23->msgQ[1])\r\n#define IMU_MSG_CUR_MAGIC_P(imuLinkId) \\\r\n    (((imuLinkId) == kIMU_LinkCpu1Cpu3) ? (&imuMsgQ13->magic[1]) : (&imuMsgQ23->magic[1]))\r\n#define IMU_MSG_PEER_MAGIC_P(imuLinkId) \\\r\n    (((imuLinkId) == kIMU_LinkCpu1Cpu3) ? (&imuMsgQ13->magic[0]) : (&imuMsgQ23->magic[0]))\r\n#define IRQID_TO_IMULINKID(irqId)     (((irqId) == IRQ_IMU_CPU13) ? kIMU_LinkCpu1Cpu3 : kIMU_LinkCpu2Cpu3)\r\n#define IMULINKID_TO_IRQID(imuLinkId) (((imuLinkId) == kIMU_LinkCpu1Cpu3) ? IRQ_IMU_CPU13 : IRQ_IMU_CPU23)\r\n#endif\r\n#endif /* __FSL_ADAPTER_RFCOMMON_H__ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/lists/fsl_component_generic_list.c",
    "content": "/*\r\n * Copyright 2018-2019, 2022 NXP\r\n * All rights reserved.\r\n *\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n/*! *********************************************************************************\r\n*************************************************************************************\r\n* Include\r\n*************************************************************************************\r\n********************************************************************************** */\r\n#include \"fsl_component_generic_list.h\"\r\n\r\n#if defined(OSA_USED)\r\n#include \"fsl_os_abstraction.h\"\r\n#if (defined(USE_RTOS) && (USE_RTOS > 0U))\r\n#define LIST_ENTER_CRITICAL() \\\r\n    OSA_SR_ALLOC();           \\\r\n    OSA_ENTER_CRITICAL()\r\n#define LIST_EXIT_CRITICAL() OSA_EXIT_CRITICAL()\r\n#else\r\n#define LIST_ENTER_CRITICAL() uint32_t regPrimask = DisableGlobalIRQ();\r\n#define LIST_EXIT_CRITICAL()  EnableGlobalIRQ(regPrimask);\r\n#endif\r\n#else\r\n#define LIST_ENTER_CRITICAL() uint32_t regPrimask = DisableGlobalIRQ();\r\n#define LIST_EXIT_CRITICAL()  EnableGlobalIRQ(regPrimask);\r\n#endif\r\n\r\nstatic list_status_t LIST_Error_Check(list_handle_t list, list_element_handle_t newElement)\r\n{\r\n    list_status_t listStatus = kLIST_Ok;\r\n#if (defined(GENERIC_LIST_DUPLICATED_CHECKING) && (GENERIC_LIST_DUPLICATED_CHECKING > 0U))\r\n    list_element_handle_t element = list->head;\r\n#endif\r\n    if ((list->max != 0U) && (list->max == list->size))\r\n    {\r\n        listStatus = kLIST_Full; /*List is full*/\r\n    }\r\n#if (defined(GENERIC_LIST_DUPLICATED_CHECKING) && (GENERIC_LIST_DUPLICATED_CHECKING > 0U))\r\n    else\r\n    {\r\n        while (element != NULL) /*Scan list*/\r\n        {\r\n            /* Determine if element is duplicated */\r\n            if (element == newElement)\r\n            {\r\n                listStatus = kLIST_DuplicateError;\r\n                break;\r\n            }\r\n            element = element->next;\r\n        }\r\n    }\r\n#endif\r\n    return listStatus;\r\n}\r\n\r\n/*! *********************************************************************************\r\n*************************************************************************************\r\n* Public functions\r\n*************************************************************************************\r\n********************************************************************************** */\r\n/*! *********************************************************************************\r\n * \\brief     Initializes the list descriptor.\r\n *\r\n * \\param[in] list - LIST_ handle to init.\r\n *            max - Maximum number of elements in list. 0 for unlimited.\r\n *\r\n * \\return void.\r\n *\r\n * \\pre\r\n *\r\n * \\post\r\n *\r\n * \\remarks\r\n *\r\n ********************************************************************************** */\r\nvoid LIST_Init(list_handle_t list, uint32_t max)\r\n{\r\n    list->head = NULL;\r\n    list->tail = NULL;\r\n    list->max  = max;\r\n    list->size = 0;\r\n}\r\n\r\n/*! *********************************************************************************\r\n * \\brief     Gets the list that contains the given element.\r\n *\r\n * \\param[in] element - Handle of the element.\r\n *\r\n * \\return NULL if element is orphan.\r\n *         Handle of the list the element is inserted into.\r\n *\r\n * \\pre\r\n *\r\n * \\post\r\n *\r\n * \\remarks\r\n *\r\n ********************************************************************************** */\r\nlist_handle_t LIST_GetList(list_element_handle_t listElement)\r\n{\r\n    return listElement->list;\r\n}\r\n\r\n/*! *********************************************************************************\r\n * \\brief     Links element to the tail of the list.\r\n *\r\n * \\param[in] list - ID of list to insert into.\r\n *            element - element to add\r\n *\r\n * \\return kLIST_Full if list is full.\r\n *         kLIST_Ok if insertion was successful.\r\n *\r\n * \\pre\r\n *\r\n * \\post\r\n *\r\n * \\remarks\r\n *\r\n ********************************************************************************** */\r\nlist_status_t LIST_AddTail(list_handle_t list, list_element_handle_t listElement)\r\n{\r\n    LIST_ENTER_CRITICAL();\r\n    list_status_t listStatus = kLIST_Ok;\r\n\r\n    listStatus = LIST_Error_Check(list, listElement);\r\n    if (listStatus == kLIST_Ok) /* Avoiding list status error */\r\n    {\r\n        if (list->size == 0U)\r\n        {\r\n            list->head = listElement;\r\n        }\r\n        else\r\n        {\r\n            list->tail->next = listElement;\r\n        }\r\n#if (defined(GENERIC_LIST_LIGHT) && (GENERIC_LIST_LIGHT > 0U))\r\n#else\r\n        listElement->prev = list->tail;\r\n#endif\r\n        listElement->list = list;\r\n        listElement->next = NULL;\r\n        list->tail        = listElement;\r\n        list->size++;\r\n    }\r\n\r\n    LIST_EXIT_CRITICAL();\r\n    return listStatus;\r\n}\r\n\r\n/*! *********************************************************************************\r\n * \\brief     Links element to the head of the list.\r\n *\r\n * \\param[in] list - ID of list to insert into.\r\n *            element - element to add\r\n *\r\n * \\return kLIST_Full if list is full.\r\n *         kLIST_Ok if insertion was successful.\r\n *\r\n * \\pre\r\n *\r\n * \\post\r\n *\r\n * \\remarks\r\n *\r\n ********************************************************************************** */\r\nlist_status_t LIST_AddHead(list_handle_t list, list_element_handle_t listElement)\r\n{\r\n    LIST_ENTER_CRITICAL();\r\n    list_status_t listStatus = kLIST_Ok;\r\n\r\n    listStatus = LIST_Error_Check(list, listElement);\r\n    if (listStatus == kLIST_Ok) /* Avoiding list status error */\r\n    {\r\n        /* Links element to the head of the list */\r\n        if (list->size == 0U)\r\n        {\r\n            list->tail = listElement;\r\n        }\r\n#if (defined(GENERIC_LIST_LIGHT) && (GENERIC_LIST_LIGHT > 0U))\r\n#else\r\n        else\r\n        {\r\n            list->head->prev = listElement;\r\n        }\r\n        listElement->prev = NULL;\r\n#endif\r\n        listElement->list = list;\r\n        listElement->next = list->head;\r\n        list->head        = listElement;\r\n        list->size++;\r\n    }\r\n\r\n    LIST_EXIT_CRITICAL();\r\n    return listStatus;\r\n}\r\n\r\n/*! *********************************************************************************\r\n * \\brief     Unlinks element from the head of the list.\r\n *\r\n * \\param[in] list - ID of list to remove from.\r\n *\r\n * \\return NULL if list is empty.\r\n *         ID of removed element(pointer) if removal was successful.\r\n *\r\n * \\pre\r\n *\r\n * \\post\r\n *\r\n * \\remarks\r\n *\r\n ********************************************************************************** */\r\nlist_element_handle_t LIST_RemoveHead(list_handle_t list)\r\n{\r\n    list_element_handle_t listElement;\r\n\r\n    LIST_ENTER_CRITICAL();\r\n\r\n    if ((NULL == list) || (list->size == 0U))\r\n    {\r\n        listElement = NULL; /*LIST_ is empty*/\r\n    }\r\n    else\r\n    {\r\n        listElement = list->head;\r\n        list->size--;\r\n        if (list->size == 0U)\r\n        {\r\n            list->tail = NULL;\r\n        }\r\n#if (defined(GENERIC_LIST_LIGHT) && (GENERIC_LIST_LIGHT > 0U))\r\n#else\r\n        else\r\n        {\r\n            listElement->next->prev = NULL;\r\n        }\r\n#endif\r\n        listElement->list = NULL;\r\n        list->head        = listElement->next; /*Is NULL if element is head*/\r\n    }\r\n\r\n    LIST_EXIT_CRITICAL();\r\n    return listElement;\r\n}\r\n\r\n/*! *********************************************************************************\r\n * \\brief     Gets head element ID.\r\n *\r\n * \\param[in] list - ID of list.\r\n *\r\n * \\return NULL if list is empty.\r\n *         ID of head element if list is not empty.\r\n *\r\n * \\pre\r\n *\r\n * \\post\r\n *\r\n * \\remarks\r\n *\r\n ********************************************************************************** */\r\nlist_element_handle_t LIST_GetHead(list_handle_t list)\r\n{\r\n    return list->head;\r\n}\r\n\r\n/*! *********************************************************************************\r\n * \\brief     Gets next element ID.\r\n *\r\n * \\param[in] element - ID of the element.\r\n *\r\n * \\return NULL if element is tail.\r\n *         ID of next element if exists.\r\n *\r\n * \\pre\r\n *\r\n * \\post\r\n *\r\n * \\remarks\r\n *\r\n ********************************************************************************** */\r\nlist_element_handle_t LIST_GetNext(list_element_handle_t listElement)\r\n{\r\n    return listElement->next;\r\n}\r\n\r\n/*! *********************************************************************************\r\n * \\brief     Gets previous element ID.\r\n *\r\n * \\param[in] element - ID of the element.\r\n *\r\n * \\return NULL if element is head.\r\n *         ID of previous element if exists.\r\n *\r\n * \\pre\r\n *\r\n * \\post\r\n *\r\n * \\remarks\r\n *\r\n ********************************************************************************** */\r\nlist_element_handle_t LIST_GetPrev(list_element_handle_t listElement)\r\n{\r\n#if (defined(GENERIC_LIST_LIGHT) && (GENERIC_LIST_LIGHT > 0U))\r\n    return NULL;\r\n#else\r\n    return listElement->prev;\r\n#endif\r\n}\r\n\r\n/*! *********************************************************************************\r\n * \\brief     Unlinks an element from its list.\r\n *\r\n * \\param[in] element - ID of the element to remove.\r\n *\r\n * \\return kLIST_OrphanElement if element is not part of any list.\r\n *         kLIST_Ok if removal was successful.\r\n *\r\n * \\pre\r\n *\r\n * \\post\r\n *\r\n * \\remarks\r\n *\r\n ********************************************************************************** */\r\nlist_status_t LIST_RemoveElement(list_element_handle_t listElement)\r\n{\r\n    list_status_t listStatus = kLIST_Ok;\r\n    LIST_ENTER_CRITICAL();\r\n\r\n    if (listElement->list == NULL)\r\n    {\r\n        listStatus = kLIST_OrphanElement; /*Element was previusly removed or never added*/\r\n    }\r\n    else\r\n    {\r\n#if (defined(GENERIC_LIST_LIGHT) && (GENERIC_LIST_LIGHT > 0U))\r\n        list_element_handle_t element_list = listElement->list->head;\r\n        list_element_handle_t element_Prev = NULL;\r\n        while (NULL != element_list)\r\n        {\r\n            if (listElement->list->head == listElement)\r\n            {\r\n                listElement->list->head = element_list->next;\r\n                break;\r\n            }\r\n            if (element_list->next == listElement)\r\n            {\r\n                element_Prev       = element_list;\r\n                element_list->next = listElement->next;\r\n                break;\r\n            }\r\n            element_list = element_list->next;\r\n        }\r\n        if (listElement->next == NULL)\r\n        {\r\n            listElement->list->tail = element_Prev;\r\n        }\r\n#else\r\n        if (listElement->prev == NULL)                   /*Element is head or solo*/\r\n        {\r\n            listElement->list->head = listElement->next; /*is null if solo*/\r\n        }\r\n        if (listElement->next == NULL)                   /*Element is tail or solo*/\r\n        {\r\n            listElement->list->tail = listElement->prev; /*is null if solo*/\r\n        }\r\n        if (listElement->prev != NULL)                   /*Element is not head*/\r\n        {\r\n            listElement->prev->next = listElement->next;\r\n        }\r\n        if (listElement->next != NULL) /*Element is not tail*/\r\n        {\r\n            listElement->next->prev = listElement->prev;\r\n        }\r\n#endif\r\n        listElement->list->size--;\r\n        listElement->list = NULL;\r\n    }\r\n\r\n    LIST_EXIT_CRITICAL();\r\n    return listStatus;\r\n}\r\n\r\n/*! *********************************************************************************\r\n * \\brief     Links an element in the previous position relative to a given member\r\n *            of a list.\r\n *\r\n * \\param[in] element - ID of a member of a list.\r\n *            newElement - new element to insert before the given member.\r\n *\r\n * \\return kLIST_OrphanElement if element is not part of any list.\r\n *         kLIST_Full if list is full.\r\n *         kLIST_Ok if insertion was successful.\r\n *\r\n * \\pre\r\n *\r\n * \\post\r\n *\r\n * \\remarks\r\n *\r\n ********************************************************************************** */\r\nlist_status_t LIST_AddPrevElement(list_element_handle_t listElement, list_element_handle_t newElement)\r\n{\r\n    list_status_t listStatus = kLIST_Ok;\r\n    LIST_ENTER_CRITICAL();\r\n\r\n    if (listElement->list == NULL)\r\n    {\r\n        listStatus = kLIST_OrphanElement; /*Element was previusly removed or never added*/\r\n    }\r\n    else\r\n    {\r\n        listStatus = LIST_Error_Check(listElement->list, newElement);\r\n        if (listStatus == kLIST_Ok)\r\n        {\r\n#if (defined(GENERIC_LIST_LIGHT) && (GENERIC_LIST_LIGHT > 0U))\r\n            list_element_handle_t element_list = listElement->list->head;\r\n            while (NULL != element_list)\r\n            {\r\n                if ((element_list->next == listElement) || (element_list == listElement))\r\n                {\r\n                    if (element_list == listElement)\r\n                    {\r\n                        listElement->list->head = newElement;\r\n                    }\r\n                    else\r\n                    {\r\n                        element_list->next = newElement;\r\n                    }\r\n                    newElement->list = listElement->list;\r\n                    newElement->next = listElement;\r\n                    listElement->list->size++;\r\n                    break;\r\n                }\r\n                element_list = element_list->next;\r\n            }\r\n\r\n#else\r\n            if (listElement->prev == NULL) /*Element is list head*/\r\n            {\r\n                listElement->list->head = newElement;\r\n            }\r\n            else\r\n            {\r\n                listElement->prev->next = newElement;\r\n            }\r\n            newElement->list = listElement->list;\r\n            listElement->list->size++;\r\n            newElement->next  = listElement;\r\n            newElement->prev  = listElement->prev;\r\n            listElement->prev = newElement;\r\n#endif\r\n        }\r\n    }\r\n\r\n    LIST_EXIT_CRITICAL();\r\n    return listStatus;\r\n}\r\n\r\n/*! *********************************************************************************\r\n * \\brief     Gets the current size of a list.\r\n *\r\n * \\param[in] list - ID of the list.\r\n *\r\n * \\return Current size of the list.\r\n *\r\n * \\pre\r\n *\r\n * \\post\r\n *\r\n * \\remarks\r\n *\r\n ********************************************************************************** */\r\nuint32_t LIST_GetSize(list_handle_t list)\r\n{\r\n    return list->size;\r\n}\r\n\r\n/*! *********************************************************************************\r\n * \\brief     Gets the number of free places in the list.\r\n *\r\n * \\param[in] list - ID of the list.\r\n *\r\n * \\return Available size of the list.\r\n *\r\n * \\pre\r\n *\r\n * \\post\r\n *\r\n * \\remarks\r\n *\r\n ********************************************************************************** */\r\nuint32_t LIST_GetAvailableSize(list_handle_t list)\r\n{\r\n    return (list->max - list->size); /*Gets the number of free places in the list*/\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/lists/fsl_component_generic_list.h",
    "content": "/*\r\n * Copyright 2018-2020, 2022 NXP\r\n * All rights reserved.\r\n *\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef _GENERIC_LIST_H_\r\n#define _GENERIC_LIST_H_\r\n\r\n#ifndef SDK_COMPONENT_DEPENDENCY_FSL_COMMON\r\n#define SDK_COMPONENT_DEPENDENCY_FSL_COMMON (1U)\r\n#endif\r\n#if (defined(SDK_COMPONENT_DEPENDENCY_FSL_COMMON) && (SDK_COMPONENT_DEPENDENCY_FSL_COMMON > 0U))\r\n#include \"fsl_common.h\"\r\n#else\r\n#endif\r\n/*!\r\n * @addtogroup GenericList\r\n * @{\r\n */\r\n\r\n/**********************************************************************************\r\n * Include\r\n ***********************************************************************************/\r\n\r\n/**********************************************************************************\r\n * Public macro definitions\r\n ***********************************************************************************/\r\n/*! @brief Definition to determine whether use list light. */\r\n#ifndef GENERIC_LIST_LIGHT\r\n#define GENERIC_LIST_LIGHT (1)\r\n#endif\r\n\r\n/*! @brief Definition to determine whether enable list duplicated checking. */\r\n#ifndef GENERIC_LIST_DUPLICATED_CHECKING\r\n#define GENERIC_LIST_DUPLICATED_CHECKING (0)\r\n#endif\r\n\r\n/**********************************************************************************\r\n * Public type definitions\r\n ***********************************************************************************/\r\n/*! @brief The list status */\r\n#if (defined(SDK_COMPONENT_DEPENDENCY_FSL_COMMON) && (SDK_COMPONENT_DEPENDENCY_FSL_COMMON > 0U))\r\ntypedef enum _list_status\r\n{\r\n    kLIST_Ok             = kStatus_Success,                   /*!< Success */\r\n    kLIST_DuplicateError = MAKE_STATUS(kStatusGroup_LIST, 1), /*!< Duplicate Error */\r\n    kLIST_Full           = MAKE_STATUS(kStatusGroup_LIST, 2), /*!< FULL */\r\n    kLIST_Empty          = MAKE_STATUS(kStatusGroup_LIST, 3), /*!< Empty */\r\n    kLIST_OrphanElement  = MAKE_STATUS(kStatusGroup_LIST, 4), /*!< Orphan Element */\r\n    kLIST_NotSupport     = MAKE_STATUS(kStatusGroup_LIST, 5), /*!< Not Support  */\r\n} list_status_t;\r\n#else\r\ntypedef enum _list_status\r\n{\r\n    kLIST_Ok             = 0, /*!< Success */\r\n    kLIST_DuplicateError = 1, /*!< Duplicate Error */\r\n    kLIST_Full           = 2, /*!< FULL */\r\n    kLIST_Empty          = 3, /*!< Empty */\r\n    kLIST_OrphanElement  = 4, /*!< Orphan Element */\r\n    kLIST_NotSupport     = 5, /*!< Not Support  */\r\n} list_status_t;\r\n#endif\r\n\r\n/*! @brief The list structure*/\r\ntypedef struct list_label\r\n{\r\n    struct list_element_tag *head; /*!< list head */\r\n    struct list_element_tag *tail; /*!< list tail */\r\n    uint32_t size;                 /*!< list size */\r\n    uint32_t max;                  /*!< list max number of elements */\r\n} list_label_t, *list_handle_t;\r\n#if (defined(GENERIC_LIST_LIGHT) && (GENERIC_LIST_LIGHT > 0U))\r\n/*! @brief The list element*/\r\ntypedef struct list_element_tag\r\n{\r\n    struct list_element_tag *next; /*!< next list element   */\r\n    struct list_label *list;       /*!< pointer to the list */\r\n} list_element_t, *list_element_handle_t;\r\n#else\r\n/*! @brief The list element*/\r\ntypedef struct list_element_tag\r\n{\r\n    struct list_element_tag *next; /*!< next list element   */\r\n    struct list_element_tag *prev; /*!< previous list element */\r\n    struct list_label *list;       /*!< pointer to the list */\r\n} list_element_t, *list_element_handle_t;\r\n#endif\r\n/**********************************************************************************\r\n * Public prototypes\r\n ***********************************************************************************/\r\n/**********************************************************************************\r\n * API\r\n **********************************************************************************/\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif /* _cplusplus */\r\n/*!\r\n * @brief Initialize the list.\r\n *\r\n * This function initialize the list.\r\n *\r\n * @param list - List handle to initialize.\r\n * @param max - Maximum number of elements in list. 0 for unlimited.\r\n */\r\nvoid LIST_Init(list_handle_t list, uint32_t max);\r\n\r\n/*!\r\n * @brief Gets the list that contains the given element.\r\n *\r\n *\r\n * @param listElement - Handle of the element.\r\n * @retval NULL if element is orphan, Handle of the list the element is inserted into.\r\n */\r\nlist_handle_t LIST_GetList(list_element_handle_t listElement);\r\n\r\n/*!\r\n * @brief Links element to the head of the list.\r\n *\r\n * @param list - Handle of the list.\r\n * @param listElement - Handle of the element.\r\n * @retval kLIST_Full if list is full, kLIST_Ok if insertion was successful.\r\n */\r\nlist_status_t LIST_AddHead(list_handle_t list, list_element_handle_t listElement);\r\n\r\n/*!\r\n * @brief Links element to the tail of the list.\r\n *\r\n * @param list - Handle of the list.\r\n * @param listElement - Handle of the element.\r\n * @retval kLIST_Full if list is full, kLIST_Ok if insertion was successful.\r\n */\r\nlist_status_t LIST_AddTail(list_handle_t list, list_element_handle_t listElement);\r\n\r\n/*!\r\n * @brief Unlinks element from the head of the list.\r\n *\r\n * @param list - Handle of the list.\r\n *\r\n * @retval NULL if list is empty, handle of removed element(pointer) if removal was successful.\r\n */\r\nlist_element_handle_t LIST_RemoveHead(list_handle_t list);\r\n\r\n/*!\r\n * @brief Gets head element handle.\r\n *\r\n * @param list - Handle of the list.\r\n *\r\n * @retval NULL if list is empty, handle of removed element(pointer) if removal was successful.\r\n */\r\nlist_element_handle_t LIST_GetHead(list_handle_t list);\r\n\r\n/*!\r\n * @brief Gets next element handle for given element handle.\r\n *\r\n * @param listElement - Handle of the element.\r\n *\r\n * @retval NULL if list is empty, handle of removed element(pointer) if removal was successful.\r\n */\r\nlist_element_handle_t LIST_GetNext(list_element_handle_t listElement);\r\n\r\n/*!\r\n * @brief Gets previous element handle for given element handle.\r\n *\r\n * @param listElement - Handle of the element.\r\n *\r\n * @retval NULL if list is empty, handle of removed element(pointer) if removal was successful.\r\n */\r\nlist_element_handle_t LIST_GetPrev(list_element_handle_t listElement);\r\n\r\n/*!\r\n * @brief Unlinks an element from its list.\r\n *\r\n * @param listElement - Handle of the element.\r\n *\r\n * @retval kLIST_OrphanElement if element is not part of any list.\r\n * @retval kLIST_Ok if removal was successful.\r\n */\r\nlist_status_t LIST_RemoveElement(list_element_handle_t listElement);\r\n\r\n/*!\r\n * @brief Links an element in the previous position relative to a given member of a list.\r\n *\r\n * @param listElement - Handle of the element.\r\n * @param newElement - New element to insert before the given member.\r\n *\r\n * @retval kLIST_OrphanElement if element is not part of any list.\r\n * @retval kLIST_Ok if removal was successful.\r\n */\r\nlist_status_t LIST_AddPrevElement(list_element_handle_t listElement, list_element_handle_t newElement);\r\n\r\n/*!\r\n * @brief Gets the current size of a list.\r\n *\r\n * @param list - Handle of the list.\r\n *\r\n * @retval Current size of the list.\r\n */\r\nuint32_t LIST_GetSize(list_handle_t list);\r\n\r\n/*!\r\n * @brief Gets the number of free places in the list.\r\n *\r\n * @param list - Handle of the list.\r\n *\r\n * @retval Available size of the list.\r\n */\r\nuint32_t LIST_GetAvailableSize(list_handle_t list);\r\n\r\n/*! @} */\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n/*! @}*/\r\n#endif /*_GENERIC_LIST_H_*/\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/osa/fsl_os_abstraction.h",
    "content": "/*\r\n * Copyright (c) 2015, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2020 NXP\r\n *\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef _FSL_OS_ABSTRACTION_H_\r\n#define _FSL_OS_ABSTRACTION_H_\r\n\r\n#ifndef __ZEPHYR__\r\n#ifndef SDK_COMPONENT_DEPENDENCY_FSL_COMMON\r\n#define SDK_COMPONENT_DEPENDENCY_FSL_COMMON (1U)\r\n#endif\r\n#if (defined(SDK_COMPONENT_DEPENDENCY_FSL_COMMON) && (SDK_COMPONENT_DEPENDENCY_FSL_COMMON > 0U))\r\n#include \"fsl_common.h\"\r\n#else\r\n#endif\r\n\r\n#include \"fsl_os_abstraction_config.h\"\r\n#include \"fsl_component_generic_list.h\"\r\n\r\n/*!\r\n * @addtogroup osa_adapter\r\n * @{\r\n */\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*! @brief Type for the Task Priority*/\r\ntypedef uint16_t osa_task_priority_t;\r\n/*! @brief Type for a task handler */\r\ntypedef void *osa_task_handle_t;\r\n/*! @brief Type for the parameter to be passed to the task at its creation */\r\ntypedef void *osa_task_param_t;\r\n/*! @brief Type for task pointer. Task prototype declaration */\r\ntypedef void (*osa_task_ptr_t)(osa_task_param_t task_param);\r\n/*! @brief Type for the semaphore handler */\r\ntypedef void *osa_semaphore_handle_t;\r\n/*! @brief Type for the mutex handler */\r\ntypedef void *osa_mutex_handle_t;\r\n/*! @brief Type for the event handler */\r\ntypedef void *osa_event_handle_t;\r\n/*! @brief Type for an event flags group, bit 32 is reserved. */\r\ntypedef uint32_t osa_event_flags_t;\r\n/*! @brief Message definition. */\r\ntypedef void *osa_msg_handle_t;\r\n/*! @brief Type for the message queue handler */\r\ntypedef void *osa_msgq_handle_t;\r\n/*! @brief Type for the Timer handler */\r\ntypedef void *osa_timer_handle_t;\r\n/*! @brief Type for the Timer callback function pointer. */\r\ntypedef void (*osa_timer_fct_ptr_t)(void const *argument);\r\n/*! @brief Thread Definition structure contains startup information of a thread.*/\r\ntypedef struct osa_task_def_tag\r\n{\r\n    osa_task_ptr_t pthread; /*!< start address of thread function*/\r\n    uint32_t tpriority;     /*!< initial thread priority*/\r\n    uint32_t instances;     /*!< maximum number of instances of that thread function*/\r\n    uint32_t stacksize;     /*!< stack size requirements in bytes; 0 is default stack size*/\r\n    uint32_t *tstack;       /*!< stack pointer, which can be used on freertos static allocation*/\r\n    void *tlink;            /*!< link pointer*/\r\n    uint8_t *tname;         /*!< name pointer*/\r\n    uint8_t useFloat;       /*!< is use float*/\r\n} osa_task_def_t;\r\n/*! @brief Thread Link Definition structure .*/\r\ntypedef struct osa_thread_link_tag\r\n{\r\n    uint8_t link[12];                  /*!< link*/\r\n    osa_task_handle_t osThreadId;      /*!< thread id*/\r\n    osa_task_def_t *osThreadDefHandle; /*!< pointer of thread define handle*/\r\n    uint32_t *osThreadStackHandle;     /*!< pointer of thread stack handle*/\r\n} osa_thread_link_t, *osa_thread_link_handle_t;\r\n\r\n/*! @brief Definition structure contains timer parameters.*/\r\ntypedef struct osa_time_def_tag\r\n{\r\n    osa_timer_fct_ptr_t pfCallback; /* < start address of a timer function */\r\n    void *argument;                 /* < argument of a timer function */\r\n} osa_time_def_t;\r\n\r\n/*! @brief Type for the timer definition*/\r\ntypedef enum _osa_timer\r\n{\r\n    KOSA_TimerOnce     = 0, /*!< one-shot timer*/\r\n    KOSA_TimerPeriodic = 1  /*!< repeating timer*/\r\n} osa_timer_t;\r\n\r\n/*! @brief Defines the return status of OSA's functions */\r\n#if (defined(SDK_COMPONENT_DEPENDENCY_FSL_COMMON) && (SDK_COMPONENT_DEPENDENCY_FSL_COMMON > 0U))\r\ntypedef enum _osa_status\r\n{\r\n    KOSA_StatusSuccess = kStatus_Success,                  /*!< Success */\r\n    KOSA_StatusError   = MAKE_STATUS(kStatusGroup_OSA, 1), /*!< Failed */\r\n    KOSA_StatusTimeout = MAKE_STATUS(kStatusGroup_OSA, 2), /*!< Timeout occurs while waiting */\r\n    KOSA_StatusIdle    = MAKE_STATUS(kStatusGroup_OSA, 3), /*!< Used for bare metal only, the wait object is not ready\r\n                                                                 and timeout still not occur */\r\n} osa_status_t;\r\n#else\r\ntypedef enum _osa_status\r\n{\r\n    KOSA_StatusSuccess = 0, /*!< Success */\r\n    KOSA_StatusError   = 1, /*!< Failed */\r\n    KOSA_StatusTimeout = 2, /*!< Timeout occurs while waiting */\r\n    KOSA_StatusIdle    = 3, /*!< Used for bare metal only, the wait object is not ready\r\n                                                and timeout still not occur */\r\n} osa_status_t;\r\n\r\n#endif\r\n\r\n#ifdef USE_RTOS\r\n#undef USE_RTOS\r\n#endif\r\n\r\n#if defined(SDK_OS_FREE_RTOS)\r\n#include \"fsl_os_abstraction_free_rtos.h\"\r\n#elif defined(FSL_RTOS_THREADX)\r\n#include \"fsl_os_abstraction_threadx.h\"\r\n#elif defined(__ZEPHYR__)\r\n#include \"fsl_os_abstraction_zephyr.h\"\r\n#else\r\n#include \"fsl_os_abstraction_bm.h\"\r\n#endif\r\n\r\nextern const uint8_t gUseRtos_c;\r\n\r\n#if defined(SDK_OS_MQX)\r\n#define USE_RTOS (1)\r\n#elif defined(SDK_OS_FREE_RTOS)\r\n#define USE_RTOS (1)\r\n#if (defined(GENERIC_LIST_LIGHT) && (GENERIC_LIST_LIGHT > 0U))\r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0U)))\r\n#define OSA_TASK_HANDLE_SIZE (150U)\r\n#else\r\n#define OSA_TASK_HANDLE_SIZE (12U)\r\n#endif\r\n#else\r\n#define OSA_TASK_HANDLE_SIZE (16U)\r\n#endif\r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0U)))\r\n#define OSA_EVENT_HANDLE_SIZE (40U)\r\n#else\r\n#define OSA_EVENT_HANDLE_SIZE (8U)\r\n#endif\r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0U)))\r\n#define OSA_SEM_HANDLE_SIZE (84U)\r\n#else\r\n#define OSA_SEM_HANDLE_SIZE (4U)\r\n#endif\r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0U)))\r\n#define OSA_MUTEX_HANDLE_SIZE (84U)\r\n#else\r\n#define OSA_MUTEX_HANDLE_SIZE (4U)\r\n#endif\r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0U)))\r\n#define OSA_MSGQ_HANDLE_SIZE (84U)\r\n#else\r\n#define OSA_MSGQ_HANDLE_SIZE (4U)\r\n#endif\r\n#define OSA_MSG_HANDLE_SIZE   (0U)\r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0U)))\r\n#define OSA_TIMER_HANDLE_SIZE (48U)\r\n#else\r\n#define OSA_TIMER_HANDLE_SIZE (4U)\r\n#endif\r\n#elif defined(SDK_OS_UCOSII)\r\n#define USE_RTOS (1)\r\n#elif defined(SDK_OS_UCOSIII)\r\n#define USE_RTOS (1)\r\n#elif defined(FSL_RTOS_THREADX)\r\n#define USE_RTOS (1)\r\n#elif defined(__ZEPHYR__)\r\n#define USE_RTOS (1)\r\n#else\r\n#define USE_RTOS (0)\r\n#if (defined(GENERIC_LIST_LIGHT) && (GENERIC_LIST_LIGHT > 0U))\r\n#define OSA_TASK_HANDLE_SIZE (24U)\r\n#else\r\n#define OSA_TASK_HANDLE_SIZE (28U)\r\n#endif\r\n#if (defined(FSL_OSA_TASK_ENABLE) && (FSL_OSA_TASK_ENABLE > 0U))\r\n#define OSA_EVENT_HANDLE_SIZE (20U)\r\n#else\r\n#define OSA_EVENT_HANDLE_SIZE (16U)\r\n#endif /* FSL_OSA_TASK_ENABLE */\r\n#if (defined(FSL_OSA_BM_TIMEOUT_ENABLE) && (FSL_OSA_BM_TIMEOUT_ENABLE > 0U))\r\n#define OSA_SEM_HANDLE_SIZE   (16U)\r\n#define OSA_MUTEX_HANDLE_SIZE (12U)\r\n#else\r\n#define OSA_SEM_HANDLE_SIZE   (8U)\r\n#define OSA_MUTEX_HANDLE_SIZE (4U)\r\n#endif\r\n#if (defined(FSL_OSA_TASK_ENABLE) && (FSL_OSA_TASK_ENABLE > 0U))\r\n#define OSA_MSGQ_HANDLE_SIZE (32U)\r\n#else\r\n#define OSA_MSGQ_HANDLE_SIZE (28U)\r\n#endif /* FSL_OSA_TASK_ENABLE */\r\n#define OSA_MSG_HANDLE_SIZE (4U)\r\n#endif\r\n\r\n/*! @brief Priority setting for OSA. */\r\n#ifndef OSA_PRIORITY_IDLE\r\n#define OSA_PRIORITY_IDLE (6U)\r\n#endif\r\n\r\n#ifndef OSA_PRIORITY_LOW\r\n#define OSA_PRIORITY_LOW (5U)\r\n#endif\r\n\r\n#ifndef OSA_PRIORITY_BELOW_NORMAL\r\n#define OSA_PRIORITY_BELOW_NORMAL (4U)\r\n#endif\r\n\r\n#ifndef OSA_PRIORITY_NORMAL\r\n#define OSA_PRIORITY_NORMAL (3U)\r\n#endif\r\n\r\n#ifndef OSA_PRIORITY_ABOVE_NORMAL\r\n#define OSA_PRIORITY_ABOVE_NORMAL (2U)\r\n#endif\r\n\r\n#ifndef OSA_PRIORITY_HIGH\r\n#define OSA_PRIORITY_HIGH (1U)\r\n#endif\r\n\r\n#ifndef OSA_PRIORITY_REAL_TIME\r\n#define OSA_PRIORITY_REAL_TIME (0U)\r\n#endif\r\n\r\n#ifndef OSA_TASK_PRIORITY_MAX\r\n#define OSA_TASK_PRIORITY_MAX (0U)\r\n#endif\r\n\r\n#ifndef OSA_TASK_PRIORITY_MIN\r\n#define OSA_TASK_PRIORITY_MIN (15U)\r\n#endif\r\n\r\n/*\r\n * Converse the percent of the priority to the priority of the OSA.\r\n * The the range of the parameter x is 0-100.\r\n */\r\n#define OSA_TASK_PRIORITY_PERCENT(x) \\\r\n    ((((OSA_TASK_PRIORITY_MIN - OSA_TASK_PRIORITY_MAX) * (100 - (x))) / 100) + OSA_TASK_PRIORITY_MAX)\r\n\r\n#define SIZE_IN_UINT32_UNITS(size) (((size) + sizeof(uint32_t) - 1) / sizeof(uint32_t))\r\n\r\n/*! @brief Constant to pass as timeout value in order to wait indefinitely. */\r\n#define osaWaitNone_c            ((uint32_t)(0))\r\n#define osaWaitForever_c         ((uint32_t)(-1))\r\n#define osaEventFlagsAll_c       ((osa_event_flags_t)(0x00FFFFFF))\r\n#define osThreadStackArray(name) osThread_##name##_stack\r\n#define osThreadStackDef(name, stacksize, instances) \\\r\n    const uint32_t osThreadStackArray(name)[SIZE_IN_UINT32_UNITS(stacksize) * (instances)];\r\n\r\n/* ==== Thread Management ==== */\r\n\r\n/* Create a Thread Definition with function, priority, and stack requirements.\r\n * \\param         name         name of the thread function.\r\n * \\param         priority     initial priority of the thread function.\r\n * \\param         instances    number of possible thread instances.\r\n * \\param         stackSz      stack size (in bytes) requirements for the thread function.\r\n * \\param         useFloat\r\n */\r\n#if defined(SDK_OS_MQX)\r\n#define OSA_TASK_DEFINE(name, priority, instances, stackSz, useFloat)                                        \\\r\n    osa_thread_link_t osThreadLink_##name[instances]                               = {0};                    \\\r\n    osThreadStackDef(name, stackSz, instances) osa_task_def_t os_thread_def_##name = {                       \\\r\n        (name),           (priority), (instances), (stackSz), osThreadStackArray(name), osThreadLink_##name, \\\r\n        (uint8_t *)#name, (useFloat)}\r\n#elif defined(SDK_OS_UCOSII)\r\n#if gTaskMultipleInstancesManagement_c\r\n#define OSA_TASK_DEFINE(name, priority, instances, stackSz, useFloat)                                        \\\r\n    osa_thread_link_t osThreadLink_##name[instances]                               = {0};                    \\\r\n    osThreadStackDef(name, stackSz, instances) osa_task_def_t os_thread_def_##name = {                       \\\r\n        (name),           (priority), (instances), (stackSz), osThreadStackArray(name), osThreadLink_##name, \\\r\n        (uint8_t *)#name, (useFloat)}\r\n#else\r\n#define OSA_TASK_DEFINE(name, priority, instances, stackSz, useFloat)                  \\\r\n    osThreadStackDef(name, stackSz, instances) osa_task_def_t os_thread_def_##name = { \\\r\n        (name), (priority), (instances), (stackSz), osThreadStackArray(name), NULL, (uint8_t *)#name, (useFloat)}\r\n#endif\r\n#elif defined(FSL_RTOS_THREADX)\r\n#define OSA_TASK_DEFINE(name, priority, instances, stackSz, useFloat)                   \\\r\n    uint32_t s_stackBuffer##name[(stackSz + sizeof(uint32_t) - 1U) / sizeof(uint32_t)]; \\\r\n    static const osa_task_def_t os_thread_def_##name = {                                \\\r\n        (name), (priority), (instances), (stackSz), s_stackBuffer##name, NULL, (uint8_t *)#name, (useFloat)}\r\n#else\r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0U)))\r\n#define OSA_TASK_DEFINE(name, priority, instances, stackSz, useFloat)                   \\\r\n    uint32_t s_stackBuffer##name[(stackSz + sizeof(uint32_t) - 1U) / sizeof(uint32_t)]; \\\r\n    static const osa_task_def_t os_thread_def_##name = {                                \\\r\n        (name), (priority), (instances), (stackSz), s_stackBuffer##name, NULL, (uint8_t *)#name, (useFloat)}\r\n#else\r\n#define OSA_TASK_DEFINE(name, priority, instances, stackSz, useFloat)                             \\\r\n    const osa_task_def_t os_thread_def_##name = {(name), (priority), (instances),      (stackSz), \\\r\n                                                 NULL,   NULL,       (uint8_t *)#name, (useFloat)}\r\n#endif\r\n#endif\r\n/* Access a Thread defintion.\r\n * \\param         name          name of the thread definition object.\r\n */\r\n#define OSA_TASK(name) (const osa_task_def_t *)&os_thread_def_##name\r\n\r\n#define OSA_TASK_PROTO(name) extern osa_task_def_t os_thread_def_##name\r\n/*  ==== Timer Management  ====\r\n * Define a Timer object.\r\n * \\param         name          name of the timer object.\r\n * \\param         function      name of the timer call back function.\r\n */\r\n\r\n#define OSA_TIMER_DEF(name, function) osa_time_def_t os_timer_def_##name = {(function), NULL}\r\n\r\n/* Access a Timer definition.\r\n * \\param         name          name of the timer object.\r\n */\r\n#define OSA_TIMER(name) &os_timer_def_##name\r\n\r\n/* ==== Buffer Definition ==== */\r\n\r\n/*!\r\n * @brief Defines the semaphore handle\r\n *\r\n * This macro is used to define a 4 byte aligned semaphore handle.\r\n * Then use \"(osa_semaphore_handle_t)name\" to get the semaphore handle.\r\n *\r\n * The macro should be global and could be optional. You could also define semaphore handle by yourself.\r\n *\r\n * This is an example,\r\n * @code\r\n *   OSA_SEMAPHORE_HANDLE_DEFINE(semaphoreHandle);\r\n * @endcode\r\n *\r\n * @param name The name string of the semaphore handle.\r\n */\r\n#define OSA_SEMAPHORE_HANDLE_DEFINE(name) \\\r\n    uint32_t name[(OSA_SEM_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t)]\r\n\r\n/*!\r\n * @brief Defines the mutex handle\r\n *\r\n * This macro is used to define a 4 byte aligned mutex handle.\r\n * Then use \"(osa_mutex_handle_t)name\" to get the mutex handle.\r\n *\r\n * The macro should be global and could be optional. You could also define mutex handle by yourself.\r\n *\r\n * This is an example,\r\n * @code\r\n *   OSA_MUTEX_HANDLE_DEFINE(mutexHandle);\r\n * @endcode\r\n *\r\n * @param name The name string of the mutex handle.\r\n */\r\n#define OSA_MUTEX_HANDLE_DEFINE(name) uint32_t name[(OSA_MUTEX_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t)]\r\n\r\n/*!\r\n * @brief Defines the event handle\r\n *\r\n * This macro is used to define a 4 byte aligned event handle.\r\n * Then use \"(osa_event_handle_t)name\" to get the event handle.\r\n *\r\n * The macro should be global and could be optional. You could also define event handle by yourself.\r\n *\r\n * This is an example,\r\n * @code\r\n *   OSA_EVENT_HANDLE_DEFINE(eventHandle);\r\n * @endcode\r\n *\r\n * @param name The name string of the event handle.\r\n */\r\n#define OSA_EVENT_HANDLE_DEFINE(name) uint32_t name[(OSA_EVENT_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t)]\r\n\r\n/*!\r\n * @brief Defines the message queue handle\r\n *\r\n * This macro is used to define a 4 byte aligned message queue handle.\r\n * Then use \"(osa_msgq_handle_t)name\" to get the message queue handle.\r\n *\r\n * The macro should be global and could be optional. You could also define message queue handle by yourself.\r\n *\r\n * This is an example,\r\n * @code\r\n *   OSA_MSGQ_HANDLE_DEFINE(msgqHandle, 3, sizeof(msgStruct));\r\n * @endcode\r\n *\r\n * @param name The name string of the message queue handle.\r\n * @param numberOfMsgs Number of messages.\r\n * @param msgSize Message size.\r\n *\r\n */\r\n#if defined(SDK_OS_FREE_RTOS) && (defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0))\r\n/*< Macro For FREE_RTOS dynamic allocation*/\r\n#define OSA_MSGQ_HANDLE_DEFINE(name, numberOfMsgs, msgSize) \\\r\n    uint32_t name[(OSA_MSGQ_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t)]\r\n#else\r\n/*< Macro For BARE_MATEL and FREE_RTOS static allocation*/\r\n#define OSA_MSGQ_HANDLE_DEFINE(name, numberOfMsgs, msgSize) \\\r\n    uint32_t name[((OSA_MSGQ_HANDLE_SIZE + numberOfMsgs * msgSize) + sizeof(uint32_t) - 1U) / sizeof(uint32_t)]\r\n#endif\r\n\r\n/*!\r\n * @brief Defines the timer handle\r\n *\r\n * This macro is used to define a 4 byte aligned timer handle.\r\n * Then use \"(osa_timer_handle_t)name\" to get the timer handle.\r\n *\r\n * The macro should be global and could be optional. You could also define timer handle by yourself.\r\n *\r\n * This is an example,\r\n * @code\r\n *   OSA_TIMER_HANDLE_DEFINE(timerHandle);\r\n * @endcode\r\n *\r\n * @param name The name string of the timer handle.\r\n */\r\n#define OSA_TIMER_HANDLE_DEFINE(name) uint32_t name[(OSA_TIMER_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t)]\r\n\r\n/*!\r\n * @brief Defines the TASK handle\r\n *\r\n * This macro is used to define a 4 byte aligned TASK handle.\r\n * Then use \"(osa_task_handle_t)name\" to get the TASK handle.\r\n *\r\n * The macro should be global and could be optional. You could also define TASK handle by yourself.\r\n *\r\n * This is an example,\r\n * @code\r\n *   OSA_TASK_HANDLE_DEFINE(taskHandle);\r\n * @endcode\r\n *\r\n * @param name The name string of the TASK handle.\r\n */\r\n#define OSA_TASK_HANDLE_DEFINE(name) uint32_t name[(OSA_TASK_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t)]\r\n\r\n#ifndef __DSB\r\n#define __DSB()\r\n#endif\r\n/*\r\n * alloc the temporary memory to store the status\r\n */\r\n#define OSA_SR_ALLOC() uint32_t osaCurrentSr = 0U;\r\n/*\r\n * Enter critical mode\r\n */\r\n#define OSA_ENTER_CRITICAL() OSA_EnterCritical(&osaCurrentSr)\r\n/*\r\n * Exit critical mode and retore the previous mode\r\n */\r\n#define OSA_EXIT_CRITICAL() \\\r\n    __DSB();                \\\r\n    OSA_ExitCritical(osaCurrentSr);\r\n\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n\r\n/*!\r\n * @brief Reserves the requested amount of memory in bytes.\r\n *\r\n * The function is used to reserve the requested amount of memory in bytes and initializes it to 0.\r\n *\r\n * @param memLength Amount of bytes to reserve.\r\n *\r\n * @return Pointer to the reserved memory. NULL if memory can't be allocated.\r\n */\r\nvoid *OSA_MemoryAllocate(uint32_t memLength);\r\n\r\n/*!\r\n * @brief Frees the memory previously reserved.\r\n *\r\n * The function is used to free the memory block previously reserved.\r\n *\r\n * @param p Pointer to the start of the memory block previously reserved.\r\n *\r\n */\r\nvoid OSA_MemoryFree(void *p);\r\n\r\n/*!\r\n * @brief Reserves the requested amount of memory in bytes.\r\n *\r\n * The function is used to reserve the requested amount of memory in bytes and initializes it to 0.\r\n * The function allocates some extra memory to ensure that the return address is aligned on a alignbytes boundary\r\n * and that the memory size is a multiple of alignbytes.\r\n *\r\n * @param memLength Amount of bytes to reserve.\r\n * @param alignbytes Bytes boundary.\r\n *\r\n * @return Pointer to the reserved memory. NULL if memory can't be allocated.\r\n */\r\nvoid *OSA_MemoryAllocateAlign(uint32_t memLength, uint32_t alignbytes);\r\n\r\n/*!\r\n * @brief Frees the memory previously reserved.\r\n *\r\n * The function is used to free the memory block previously reserved.\r\n *\r\n * @param p Pointer to the start of the memory block previously reserved.\r\n *\r\n */\r\nvoid OSA_MemoryFreeAlign(void *p);\r\n\r\n/*!\r\n * @brief Enter critical with nesting mode.\r\n *\r\n * @param sr Store current status and return to caller.\r\n */\r\nvoid OSA_EnterCritical(uint32_t *sr);\r\n\r\n/*!\r\n * @brief Exit critical with nesting mode.\r\n *\r\n * @param sr Previous status to restore.\r\n */\r\nvoid OSA_ExitCritical(uint32_t sr);\r\n\r\n/*!\r\n * @name Task management\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief Initialize OSA.\r\n *\r\n * This function is used to setup the basic services.\r\n *\r\n * Example below shows how to use this API to create the task handle.\r\n * @code\r\n *   OSA_Init();\r\n * @endcode\r\n */\r\n#if (defined(FSL_OSA_TASK_ENABLE) && (FSL_OSA_TASK_ENABLE > 0U))\r\nvoid OSA_Init(void);\r\n#endif\r\n\r\n/*!\r\n * @brief Start OSA schedule.\r\n *\r\n * This function is used to start OSA scheduler.\r\n *\r\n * Example below shows how to use this API to start osa schedule.\r\n * @code\r\n *   OSA_Start();\r\n * @endcode\r\n */\r\n#if (defined(FSL_OSA_TASK_ENABLE) && (FSL_OSA_TASK_ENABLE > 0U))\r\nvoid OSA_Start(void);\r\n#endif\r\n\r\n#if ((defined(FSL_OSA_TASK_ENABLE)) && (FSL_OSA_TASK_ENABLE > 0U))\r\n/*!\r\n * @brief Creates a task.\r\n *\r\n * This function is used to create task based on the resources defined\r\n * by the macro OSA_TASK_DEFINE.\r\n *\r\n * Example below shows how to use this API to create the task handle.\r\n * @code\r\n *   OSA_TASK_HANDLE_DEFINE(taskHandle);\r\n *   OSA_TASK_DEFINE( Job1, OSA_PRIORITY_HIGH, 1, 800, 0);\r\n *   OSA_TaskCreate((osa_task_handle_t)taskHandle, OSA_TASK(Job1), (osa_task_param_t)NULL);\r\n * @endcode\r\n *\r\n * @param taskHandle Pointer to a memory space of size OSA_TASK_HANDLE_SIZE allocated by the caller, task handle.\r\n * The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.\r\n * You can define the handle in the following two ways:\r\n * #OSA_TASK_HANDLE_DEFINE(taskHandle);\r\n * or\r\n * uint32_t taskHandle[((OSA_TASK_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))];\r\n * @param thread_def pointer to theosa_task_def_t structure which defines the task.\r\n * @param task_param Pointer to be passed to the task when it is created.\r\n * @retval KOSA_StatusSuccess The task is successfully created.\r\n * @retval KOSA_StatusError   The task can not be created.\r\n */\r\nosa_status_t OSA_TaskCreate(osa_task_handle_t taskHandle,\r\n                            const osa_task_def_t *thread_def,\r\n                            osa_task_param_t task_param);\r\n#endif /* FSL_OSA_TASK_ENABLE */\r\n\r\n#if ((defined(FSL_OSA_TASK_ENABLE)) && (FSL_OSA_TASK_ENABLE > 0U))\r\n/*!\r\n * @brief Gets the handler of active task.\r\n *\r\n * @return Handler to current active task.\r\n */\r\nosa_task_handle_t OSA_TaskGetCurrentHandle(void);\r\n#endif /* FSL_OSA_TASK_ENABLE */\r\n\r\n#if ((defined(FSL_OSA_TASK_ENABLE)) && (FSL_OSA_TASK_ENABLE > 0U))\r\n/*!\r\n * @brief Puts the active task to the end of scheduler's queue.\r\n *\r\n * When a task calls this function, it gives up the CPU and puts itself to the\r\n * end of a task ready list.\r\n *\r\n * @retval NULL\r\n */\r\nvoid OSA_TaskYield(void);\r\n#endif /* FSL_OSA_TASK_ENABLE */\r\n\r\n#if ((defined(FSL_OSA_TASK_ENABLE)) && (FSL_OSA_TASK_ENABLE > 0U))\r\n/*!\r\n * @brief Gets the priority of a task.\r\n *\r\n * @param taskHandle The handler of the task whose priority is received.\r\n *\r\n * @return Task's priority.\r\n */\r\nosa_task_priority_t OSA_TaskGetPriority(osa_task_handle_t taskHandle);\r\n#endif /* FSL_OSA_TASK_ENABLE */\r\n\r\n#if ((defined(FSL_OSA_TASK_ENABLE)) && (FSL_OSA_TASK_ENABLE > 0U))\r\n/*!\r\n * @brief Sets the priority of a task.\r\n *\r\n * @param taskHandle  The handler of the task whose priority is set.\r\n * @param taskPriority The priority to set.\r\n *\r\n * @retval KOSA_StatusSuccess Task's priority is set successfully.\r\n * @retval KOSA_StatusError   Task's priority can not be set.\r\n */\r\nosa_status_t OSA_TaskSetPriority(osa_task_handle_t taskHandle, osa_task_priority_t taskPriority);\r\n#endif /* FSL_OSA_TASK_ENABLE */\r\n\r\n#if ((defined(FSL_OSA_TASK_ENABLE)) && (FSL_OSA_TASK_ENABLE > 0U))\r\n/*!\r\n * @brief Destroys a previously created task.\r\n *\r\n * @param taskHandle The handler of the task to destroy.\r\n *\r\n * @retval KOSA_StatusSuccess The task was successfully destroyed.\r\n * @retval KOSA_StatusError   Task destruction failed or invalid parameter.\r\n */\r\nosa_status_t OSA_TaskDestroy(osa_task_handle_t taskHandle);\r\n#endif /* FSL_OSA_TASK_ENABLE */\r\n\r\n/*!\r\n * @brief Pre-creates a semaphore.\r\n *\r\n * This function pre-creates a semaphore with the task handler.\r\n *\r\n * Example below shows how to use this API to create the semaphore handle.\r\n * @code\r\n *   OSA_SEMAPHORE_HANDLE_DEFINE(semaphoreHandle);\r\n *   OSA_SemaphoreCreate((osa_semaphore_handle_t)semaphoreHandle, (osa_task_ptr_t)taskHandler);\r\n * @endcode\r\n *\r\n * @param semaphoreHandle Pointer to a memory space of size OSA_SEM_HANDLE_SIZE allocated by the caller.\r\n * The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.\r\n * You can define the handle in the following two ways:\r\n * #OSA_SEMAPHORE_HANDLE_DEFINE(semaphoreHandle);\r\n * or\r\n * uint32_t semaphoreHandle[((OSA_SEM_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))];\r\n * @param taskHandler  The task handler this semaphore is used by.\r\n *\r\n * @retval KOSA_StatusSuccess  the new semaphore if the semaphore is created successfully.\r\n */\r\nosa_status_t OSA_SemaphorePrecreate(osa_semaphore_handle_t semaphoreHandle, osa_task_ptr_t taskHandler);\r\n\r\n/*!\r\n * @brief Creates a semaphore with a given value.\r\n *\r\n * This function creates a semaphore and sets the value to the parameter\r\n * initValue.\r\n *\r\n * Example below shows how to use this API to create the semaphore handle.\r\n * @code\r\n *   OSA_SEMAPHORE_HANDLE_DEFINE(semaphoreHandle);\r\n *   OSA_SemaphoreCreate((osa_semaphore_handle_t)semaphoreHandle, 0xff);\r\n * @endcode\r\n *\r\n * @param semaphoreHandle Pointer to a memory space of size OSA_SEM_HANDLE_SIZE allocated by the caller.\r\n * The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.\r\n * You can define the handle in the following two ways:\r\n * #OSA_SEMAPHORE_HANDLE_DEFINE(semaphoreHandle);\r\n * or\r\n * uint32_t semaphoreHandle[((OSA_SEM_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))];\r\n * @param initValue Initial value the semaphore will be set to.\r\n *\r\n * @retval KOSA_StatusSuccess  the new semaphore if the semaphore is created successfully.\r\n * @retval KOSA_StatusError   if the semaphore can not be created.\r\n */\r\nosa_status_t OSA_SemaphoreCreate(osa_semaphore_handle_t semaphoreHandle, uint32_t initValue);\r\n\r\n/*!\r\n * @brief Creates a binary semaphore.\r\n *\r\n * This function creates a binary semaphore\r\n *\r\n * Example below shows how to use this API to create the semaphore handle.\r\n * @code\r\n *   OSA_SEMAPHORE_HANDLE_DEFINE(semaphoreHandle);\r\n *   OSA_SemaphoreCreateBinary((osa_semaphore_handle_t)semaphoreHandle);\r\n * @endcode\r\n *\r\n * @param semaphoreHandle Pointer to a memory space of size OSA_SEM_HANDLE_SIZE allocated by the caller.\r\n * The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.\r\n * You can define the handle in the following two ways:\r\n * #OSA_SEMAPHORE_HANDLE_DEFINE(semaphoreHandle);\r\n * or\r\n * uint32_t semaphoreHandle[((OSA_SEM_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))];\r\n *\r\n * @retval KOSA_StatusSuccess  the new binary semaphore if the binary semaphore is created successfully.\r\n * @retval KOSA_StatusError   if the binary semaphore can not be created.\r\n */\r\nosa_status_t OSA_SemaphoreCreateBinary(osa_semaphore_handle_t semaphoreHandle);\r\n\r\n/*!\r\n * @brief Destroys a previously created semaphore.\r\n *\r\n * @param semaphoreHandle The semaphore handle.\r\n * The macro SEMAPHORE_HANDLE_BUFFER_GET is used to get the semaphore buffer pointer,\r\n * and should not be used before the macro SEMAPHORE_HANDLE_BUFFER_DEFINE is used.\r\n *\r\n * @retval KOSA_StatusSuccess The semaphore is successfully destroyed.\r\n * @retval KOSA_StatusError   The semaphore can not be destroyed.\r\n */\r\nosa_status_t OSA_SemaphoreDestroy(osa_semaphore_handle_t semaphoreHandle);\r\n\r\n/*!\r\n * @brief Pending a semaphore with timeout.\r\n *\r\n * This function checks the semaphore's counting value. If it is positive,\r\n * decreases it and returns KOSA_StatusSuccess. Otherwise, a timeout is used\r\n * to wait.\r\n *\r\n * @param semaphoreHandle    The semaphore handle.\r\n * @param millisec The maximum number of milliseconds to wait if semaphore is not\r\n *                 positive. Pass osaWaitForever_c to wait indefinitely, pass 0\r\n *                 will return KOSA_StatusTimeout immediately.\r\n *\r\n * @retval KOSA_StatusSuccess  The semaphore is received.\r\n * @retval KOSA_StatusTimeout  The semaphore is not received within the specified 'timeout'.\r\n * @retval KOSA_StatusError    An incorrect parameter was passed.\r\n */\r\nosa_status_t OSA_SemaphoreWait(osa_semaphore_handle_t semaphoreHandle, uint32_t millisec);\r\n\r\n/*!\r\n * @brief Signals for someone waiting on the semaphore to wake up.\r\n *\r\n * Wakes up one task that is waiting on the semaphore. If no task is waiting, increases\r\n * the semaphore's counting value.\r\n *\r\n * @param semaphoreHandle The semaphore handle to signal.\r\n *\r\n * @retval KOSA_StatusSuccess The semaphore is successfully signaled.\r\n * @retval KOSA_StatusError   The object can not be signaled or invalid parameter.\r\n *\r\n */\r\nosa_status_t OSA_SemaphorePost(osa_semaphore_handle_t semaphoreHandle);\r\n\r\n/*!\r\n * @brief Create an unlocked mutex.\r\n *\r\n * This function creates a non-recursive mutex and sets it to unlocked status.\r\n *\r\n * Example below shows how to use this API to create the mutex handle.\r\n * @code\r\n *   OSA_MUTEX_HANDLE_DEFINE(mutexHandle);\r\n *   OSA_MutexCreate((osa_mutex_handle_t)mutexHandle);\r\n * @endcode\r\n *\r\n * @param mutexHandle       Pointer to a memory space of size OSA_MUTEX_HANDLE_SIZE allocated by the caller.\r\n * The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.\r\n * You can define the handle in the following two ways:\r\n * #OSA_MUTEX_HANDLE_DEFINE(mutexHandle);\r\n * or\r\n * uint32_t mutexHandle[((OSA_MUTEX_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))];\r\n * @retval KOSA_StatusSuccess  the new mutex if the mutex is created successfully.\r\n * @retval KOSA_StatusError   if the mutex can not be created.\r\n */\r\nosa_status_t OSA_MutexCreate(osa_mutex_handle_t mutexHandle);\r\n\r\n/*!\r\n * @brief Waits for a mutex and locks it.\r\n *\r\n * This function checks the mutex's status. If it is unlocked, locks it and returns the\r\n * KOSA_StatusSuccess. Otherwise, waits for a timeout in milliseconds to lock.\r\n *\r\n * @param mutexHandle The mutex handle.\r\n * @param millisec The maximum number of milliseconds to wait for the mutex.\r\n *                 If the mutex is locked, Pass the value osaWaitForever_c will\r\n *                 wait indefinitely, pass 0 will return KOSA_StatusTimeout\r\n *                 immediately.\r\n *\r\n * @retval KOSA_StatusSuccess The mutex is locked successfully.\r\n * @retval KOSA_StatusTimeout Timeout occurred.\r\n * @retval KOSA_StatusError   Incorrect parameter was passed.\r\n *\r\n * @note This is non-recursive mutex, a task can not try to lock the mutex it has locked.\r\n */\r\nosa_status_t OSA_MutexLock(osa_mutex_handle_t mutexHandle, uint32_t millisec);\r\n\r\n/*!\r\n * @brief Unlocks a previously locked mutex.\r\n *\r\n * @param mutexHandle The mutex handle.\r\n *\r\n * @retval KOSA_StatusSuccess The mutex is successfully unlocked.\r\n * @retval KOSA_StatusError   The mutex can not be unlocked or invalid parameter.\r\n */\r\nosa_status_t OSA_MutexUnlock(osa_mutex_handle_t mutexHandle);\r\n\r\n/*!\r\n * @brief Destroys a previously created mutex.\r\n *\r\n * @param mutexHandle The mutex handle.\r\n *\r\n * @retval KOSA_StatusSuccess The mutex is successfully destroyed.\r\n * @retval KOSA_StatusError   The mutex can not be destroyed.\r\n *\r\n */\r\nosa_status_t OSA_MutexDestroy(osa_mutex_handle_t mutexHandle);\r\n\r\n/*!\r\n * @brief Pre-initializes an event object.\r\n *\r\n * This function pre-creates an event object and indicates which task this event is used by.\r\n *\r\n * Example below shows how to use this API to create the event handle.\r\n * @code\r\n *   OSA_EVENT_HANDLE_DEFINE(eventHandle);\r\n *   OSA_EventPrecreate((osa_event_handle_t)eventHandle, (osa_task_ptr_t)taskHandler);\r\n * @endcode\r\n *\r\n * @param eventHandle Pointer to a memory space of size OSA_EVENT_HANDLE_SIZE allocated by the caller.\r\n * The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.\r\n * You can define the handle in the following two ways:\r\n * #OSA_EVENT_HANDLE_DEFINE(eventHandle);\r\n * or\r\n * uint32 eventHandle[((OSA_EVENT_HANDLE_SIZE + sizeof(uint32) - 1U) / sizeof(uint32))];\r\n * @param taskHandler The task handler this event is used by.\r\n * @retval KOSA_StatusSuccess  the new event if the event is pre-created successfully.\r\n */\r\nosa_status_t OSA_EventPrecreate(osa_event_handle_t eventHandle, osa_task_ptr_t taskHandler);\r\n\r\n/*!\r\n * @brief Initializes an event object with all flags cleared.\r\n *\r\n * This function creates an event object and set its clear mode. If autoClear\r\n * is 1, when a task gets the event flags, these flags will be\r\n * cleared automatically. Otherwise these flags must\r\n * be cleared manually.\r\n *\r\n * Example below shows how to use this API to create the event handle.\r\n * @code\r\n *   OSA_EVENT_HANDLE_DEFINE(eventHandle);\r\n *   OSA_EventCreate((osa_event_handle_t)eventHandle, 0);\r\n * @endcode\r\n *\r\n * @param eventHandle Pointer to a memory space of size OSA_EVENT_HANDLE_SIZE allocated by the caller.\r\n * The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.\r\n * You can define the handle in the following two ways:\r\n * #OSA_EVENT_HANDLE_DEFINE(eventHandle);\r\n * or\r\n * uint32_t eventHandle[((OSA_EVENT_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))];\r\n * @param autoClear 1 The event is auto-clear.\r\n *                  0 The event manual-clear\r\n * @retval KOSA_StatusSuccess  the new event if the event is created successfully.\r\n * @retval KOSA_StatusError   if the event can not be created.\r\n */\r\nosa_status_t OSA_EventCreate(osa_event_handle_t eventHandle, uint8_t autoClear);\r\n\r\n/*!\r\n * @brief Sets one or more event flags.\r\n *\r\n * Sets specified flags of an event object.\r\n *\r\n * @param eventHandle     The event handle.\r\n * @param flagsToSet  Flags to be set.\r\n *\r\n * @retval KOSA_StatusSuccess The flags were successfully set.\r\n * @retval KOSA_StatusError   An incorrect parameter was passed.\r\n */\r\nosa_status_t OSA_EventSet(osa_event_handle_t eventHandle, osa_event_flags_t flagsToSet);\r\n\r\n/*!\r\n * @brief Clears one or more flags.\r\n *\r\n * Clears specified flags of an event object.\r\n *\r\n * @param eventHandle       The event handle.\r\n * @param flagsToClear  Flags to be clear.\r\n *\r\n * @retval KOSA_StatusSuccess The flags were successfully cleared.\r\n * @retval KOSA_StatusError   An incorrect parameter was passed.\r\n */\r\nosa_status_t OSA_EventClear(osa_event_handle_t eventHandle, osa_event_flags_t flagsToClear);\r\n\r\n/*!\r\n * @brief Get event's flags.\r\n *\r\n * Get specified flags of an event object.\r\n *\r\n * @param eventHandle       The event handle.\r\n * The macro EVENT_HANDLE_BUFFER_GET is used to get the event buffer pointer,\r\n * and should not be used before the macro EVENT_HANDLE_BUFFER_DEFINE is used.\r\n * @param flagsMask         The flags user want to get are specified by this parameter.\r\n * @param pFlagsOfEvent     The event flags are obtained by this parameter.\r\n *\r\n * @retval KOSA_StatusSuccess The event flags were successfully got.\r\n * @retval KOSA_StatusError   An incorrect parameter was passed.\r\n */\r\nosa_status_t OSA_EventGet(osa_event_handle_t eventHandle,\r\n                          osa_event_flags_t flagsMask,\r\n                          osa_event_flags_t *pFlagsOfEvent);\r\n\r\n/*!\r\n * @brief Waits for specified event flags to be set.\r\n *\r\n * This function waits for a combination of flags to be set in an event object.\r\n * Applications can wait for any/all bits to be set. Also this function could\r\n * obtain the flags who wakeup the waiting task.\r\n *\r\n * @param eventHandle     The event handle.\r\n * @param flagsToWait Flags that to wait.\r\n * @param waitAll     Wait all flags or any flag to be set.\r\n * @param millisec    The maximum number of milliseconds to wait for the event.\r\n *                    If the wait condition is not met, pass osaWaitForever_c will\r\n *                    wait indefinitely, pass 0 will return KOSA_StatusTimeout\r\n *                    immediately.\r\n * @param pSetFlags    Flags that wakeup the waiting task are obtained by this parameter.\r\n *\r\n * @retval KOSA_StatusSuccess The wait condition met and function returns successfully.\r\n * @retval KOSA_StatusTimeout Has not met wait condition within timeout.\r\n * @retval KOSA_StatusError   An incorrect parameter was passed.\r\n\r\n *\r\n * @note    Please pay attention to the flags bit width, FreeRTOS uses the most\r\n *          significant 8 bis as control bits, so do not wait these bits while using\r\n *          FreeRTOS.\r\n *\r\n */\r\nosa_status_t OSA_EventWait(osa_event_handle_t eventHandle,\r\n                           osa_event_flags_t flagsToWait,\r\n                           uint8_t waitAll,\r\n                           uint32_t millisec,\r\n                           osa_event_flags_t *pSetFlags);\r\n\r\n/*!\r\n * @brief Destroys a previously created event object.\r\n *\r\n * @param eventHandle The event handle.\r\n *\r\n * @retval KOSA_StatusSuccess The event is successfully destroyed.\r\n * @retval KOSA_StatusError   Event destruction failed.\r\n */\r\nosa_status_t OSA_EventDestroy(osa_event_handle_t eventHandle);\r\n\r\n/*!\r\n * @brief Initializes a message queue.\r\n *\r\n * This function  allocates memory for and initializes a message queue. Message queue elements are hardcoded as void*.\r\n *\r\n * Example below shows how to use this API to create the massage queue handle.\r\n * @code\r\n *   OSA_MSGQ_HANDLE_DEFINE(msgqHandle);\r\n *   OSA_MsgQCreate((osa_msgq_handle_t)msgqHandle, 5U, sizeof(msg));\r\n * @endcode\r\n *\r\n * @param msgqHandle    Pointer to a memory space of size #(OSA_MSGQ_HANDLE_SIZE + msgNo*msgSize) on bare-matel,\r\n * FreeRTOS static allocation allocated by the caller and #(OSA_MSGQ_HANDLE_SIZE) on FreeRTOS dynamic allocation,\r\n * message queue handle. The handle should be 4 byte aligned, because unaligned access doesn't be supported on some\r\n * devices. You can define the handle in the following two ways: #OSA_MSGQ_HANDLE_DEFINE(msgqHandle); or For bm and\r\n * freertos static: uint32_t msgqHandle[((OSA_MSGQ_HANDLE_SIZE + msgNo*msgSize + sizeof(uint32_t) - 1U) /\r\n * sizeof(uint32_t))]; For freertos dynamic: uint32_t msgqHandle[((OSA_MSGQ_HANDLE_SIZE + sizeof(uint32_t) - 1U) /\r\n * sizeof(uint32_t))];\r\n * @param msgNo :number of messages the message queue should accommodate.\r\n * @param msgSize :size of a single message structure.\r\n *\r\n * @retval KOSA_StatusSuccess Message queue successfully Create.\r\n * @retval KOSA_StatusError     Message queue create failure.\r\n */\r\nosa_status_t OSA_MsgQCreate(osa_msgq_handle_t msgqHandle, uint32_t msgNo, uint32_t msgSize);\r\n\r\n/*!\r\n * @brief Puts a message at the end of the queue.\r\n *\r\n * This function puts a message to the end of the message queue. If the queue\r\n * is full, this function returns the KOSA_StatusError;\r\n *\r\n * @param msgqHandle  Message Queue handler.\r\n * @param pMessage Pointer to the message to be put into the queue.\r\n *\r\n * @retval KOSA_StatusSuccess Message successfully put into the queue.\r\n * @retval KOSA_StatusError   The queue was full or an invalid parameter was passed.\r\n */\r\nosa_status_t OSA_MsgQPut(osa_msgq_handle_t msgqHandle, osa_msg_handle_t pMessage);\r\n\r\n/*!\r\n * @brief Reads and remove a message at the head of the queue.\r\n *\r\n * This function gets a message from the head of the message queue. If the\r\n * queue is empty, timeout is used to wait.\r\n *\r\n * @param msgqHandle   Message Queue handler.\r\n * @param pMessage Pointer to a memory to save the message.\r\n * @param millisec The number of milliseconds to wait for a message. If the\r\n *                 queue is empty, pass osaWaitForever_c will wait indefinitely,\r\n *                 pass 0 will return KOSA_StatusTimeout immediately.\r\n *\r\n * @retval KOSA_StatusSuccess   Message successfully obtained from the queue.\r\n * @retval KOSA_StatusTimeout   The queue remains empty after timeout.\r\n * @retval KOSA_StatusError     Invalid parameter.\r\n */\r\nosa_status_t OSA_MsgQGet(osa_msgq_handle_t msgqHandle, osa_msg_handle_t pMessage, uint32_t millisec);\r\n\r\n/*!\r\n * @brief Get the available message\r\n *\r\n * This function is used to get the available message.\r\n *\r\n * @param msgqHandle Message Queue handler.\r\n *\r\n * @return Available message count\r\n */\r\nint OSA_MsgQAvailableMsgs(osa_msgq_handle_t msgqHandle);\r\n\r\n/*!\r\n * @brief Destroys a previously created queue.\r\n *\r\n * @param msgqHandle Message Queue handler.\r\n *\r\n * @retval KOSA_StatusSuccess The queue was successfully destroyed.\r\n * @retval KOSA_StatusError   Message queue destruction failed.\r\n */\r\nosa_status_t OSA_MsgQDestroy(osa_msgq_handle_t msgqHandle);\r\n\r\n/*!\r\n * @brief Enable all interrupts.\r\n */\r\nvoid OSA_InterruptEnable(void);\r\n\r\n/*!\r\n * @brief Disable all interrupts.\r\n */\r\nvoid OSA_InterruptDisable(void);\r\n\r\n/*!\r\n * @brief Enable all interrupts using PRIMASK.\r\n */\r\nvoid OSA_EnableIRQGlobal(void);\r\n\r\n/*!\r\n * @brief Disable all interrupts using PRIMASK.\r\n */\r\nvoid OSA_DisableIRQGlobal(void);\r\n\r\n/*!\r\n * @brief Disable the scheduling of any task.\r\n */\r\nvoid OSA_DisableScheduler(void);\r\n\r\n/*!\r\n * @brief Enable the scheduling of any task.\r\n */\r\nvoid OSA_EnableScheduler(void);\r\n\r\n/*!\r\n * @brief Delays execution for a number of milliseconds.\r\n *\r\n * @param millisec The time in milliseconds to wait.\r\n */\r\nvoid OSA_TimeDelay(uint32_t millisec);\r\n\r\n/*!\r\n * @brief This function gets current time in milliseconds.\r\n *\r\n * @retval current time in milliseconds\r\n */\r\nuint32_t OSA_TimeGetMsec(void);\r\n\r\n/*!\r\n * @brief Installs the interrupt handler.\r\n *\r\n * @param IRQNumber IRQ number of the interrupt.\r\n * @param handler The interrupt handler to install.\r\n */\r\nvoid OSA_InstallIntHandler(uint32_t IRQNumber, void (*handler)(void));\r\n\r\n/*! @}*/\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n/*! @}*/\r\n#else\r\n#include \"fsl_os_abstraction_zephyr.h\"\r\n#endif /* ! __ZEPHYR__ */\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/osa/fsl_os_abstraction_config.h",
    "content": "/*!\r\n * Copyright (c) 2015, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2018 NXP\r\n *\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef _FSL_OS_ABSTRACTION_CONFIG_H_\r\n#define _FSL_OS_ABSTRACTION_CONFIG_H_\r\n\r\n#ifndef gMainThreadStackSize_c\r\n#define gMainThreadStackSize_c 1024\r\n#endif\r\n\r\n#ifndef gMainThreadPriority_c\r\n#define gMainThreadPriority_c 7\r\n#endif\r\n\r\n#ifndef gTaskMultipleInstancesManagement_c\r\n#define gTaskMultipleInstancesManagement_c 0\r\n#endif\r\n\r\n/*! @brief Definition to determine whether enable OSA's TASK module. */\r\n#ifndef OSA_USED\r\n#ifndef FSL_OSA_TASK_ENABLE\r\n#define FSL_OSA_TASK_ENABLE 0U\r\n#endif\r\n#else\r\n#if defined(FSL_OSA_TASK_ENABLE)\r\n#undef FSL_OSA_TASK_ENABLE\r\n#endif\r\n#define FSL_OSA_TASK_ENABLE 1U\r\n#endif /* OSA_USED */\r\n\r\n#ifndef FSL_OSA_MAIN_FUNC_ENABLE\r\n#define FSL_OSA_MAIN_FUNC_ENABLE 0U\r\n#endif\r\n\r\n#ifndef FSL_OSA_BM_TIMEOUT_ENABLE\r\n#define FSL_OSA_BM_TIMEOUT_ENABLE 0U\r\n#endif\r\n\r\n#ifndef FSL_OSA_ALLOCATED_HEAP\r\n#define FSL_OSA_ALLOCATED_HEAP (1U)\r\n#endif\r\n\r\n#endif /* _FSL_OS_ABSTRACTION_CONFIG_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/osa/fsl_os_abstraction_free_rtos.c",
    "content": "/*! *********************************************************************************\r\n * Copyright (c) 2015, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2017, 2019 NXP\r\n * All rights reserved.\r\n *\r\n *\r\n * This is the source file for the OS Abstraction layer for freertos.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n ********************************************************************************** */\r\n\r\n/*! *********************************************************************************\r\n*************************************************************************************\r\n* Include\r\n*************************************************************************************\r\n********************************************************************************** */\r\n#include \"fsl_common.h\"\r\n#include \"fsl_os_abstraction.h\"\r\n#include \"fsl_os_abstraction_free_rtos.h\"\r\n#include <string.h>\r\n#include \"fsl_component_generic_list.h\"\r\n\r\n/*! *********************************************************************************\r\n*************************************************************************************\r\n* Private macros\r\n*************************************************************************************\r\n********************************************************************************** */\r\n\r\n/* Weak function. */\r\n#if defined(__GNUC__)\r\n#define __WEAK_FUNC __attribute__((weak))\r\n#elif defined(__ICCARM__)\r\n#define __WEAK_FUNC __weak\r\n#elif defined(__CC_ARM) || defined(__ARMCC_VERSION)\r\n#define __WEAK_FUNC __attribute__((weak))\r\n#endif\r\n\r\n#define millisecToTicks(millisec) (((millisec)*configTICK_RATE_HZ + 999U) / 1000U)\r\n\r\n#ifdef DEBUG_ASSERT\r\n#define OS_ASSERT(condition) \\\r\n    if (!(condition))        \\\r\n        while (1)            \\\r\n            ;\r\n#else\r\n#define OS_ASSERT(condition) (void)(condition);\r\n#endif\r\n\r\n/*! @brief Converts milliseconds to ticks*/\r\n#define MSEC_TO_TICK(msec) \\\r\n    (((uint32_t)(msec) + 500uL / (uint32_t)configTICK_RATE_HZ) * (uint32_t)configTICK_RATE_HZ / 1000uL)\r\n#define TICKS_TO_MSEC(tick) ((uint32_t)((uint64_t)(tick)*1000uL / (uint64_t)configTICK_RATE_HZ))\r\n\r\n#define OSA_MEM_MAGIC_NUMBER (12345U)\r\n#define OSA_MEM_SIZE_ALIGN(var, alignbytes) \\\r\n    ((unsigned int)((var) + ((alignbytes)-1U)) & (unsigned int)(~(unsigned int)((alignbytes)-1U)))\r\n\r\n/************************************************************************************\r\n*************************************************************************************\r\n* Private type definitions\r\n*************************************************************************************\r\n************************************************************************************/\r\ntypedef struct osa_freertos_task\r\n{\r\n    list_element_t link;\r\n    TaskHandle_t taskHandle;\r\n} osa_freertos_task_t;\r\n\r\ntypedef struct _osa_event_struct\r\n{\r\n    EventGroupHandle_t eventHandle; /* The event handle */\r\n    uint8_t autoClear;         /*!< Auto clear or manual clear   */\r\n} osa_event_struct_t;\r\n\r\n/*! @brief State structure for bm osa manager. */\r\ntypedef struct _osa_state\r\n{\r\n#if (defined(FSL_OSA_TASK_ENABLE) && (FSL_OSA_TASK_ENABLE > 0U))\r\n    list_label_t taskList;\r\n#if (defined(FSL_OSA_MAIN_FUNC_ENABLE) && (FSL_OSA_MAIN_FUNC_ENABLE > 0U))\r\n    OSA_TASK_HANDLE_DEFINE(mainTaskHandle);\r\n#endif\r\n#endif\r\n    uint32_t basePriority;\r\n    int32_t basePriorityNesting;\r\n    uint32_t interruptDisableCount;\r\n} osa_state_t;\r\n\r\n/*! @brief Definition structure contains allocated memory information.*/\r\ntypedef struct _osa_mem_align_control_block\r\n{\r\n    uint16_t identifier; /*!< Identifier for the memory control block. */\r\n    uint16_t offset;     /*!< offset from aligned address to real address */\r\n} osa_mem_align_cb_t;\r\n\r\n/*! *********************************************************************************\r\n*************************************************************************************\r\n* Private prototypes\r\n*************************************************************************************\r\n********************************************************************************** */\r\n__WEAK_FUNC void main_task(void const *argument);\r\n__WEAK_FUNC void main_task(void const *argument)\r\n{\r\n}\r\n\r\nvoid startup_task(void *argument);\r\n\r\n/*! *********************************************************************************\r\n*************************************************************************************\r\n* Public memory declarations\r\n*************************************************************************************\r\n********************************************************************************** */\r\nconst uint8_t gUseRtos_c = USE_RTOS; /* USE_RTOS = 0 for BareMetal and 1 for OS */\r\n\r\nstatic osa_state_t s_osaState = {0};\r\n\r\n/* Allocate the memory for the heap. */\r\n#if (defined(FSL_OSA_ALLOCATED_HEAP) && (FSL_OSA_ALLOCATED_HEAP > 0U))\r\n#if defined(configAPPLICATION_ALLOCATED_HEAP) && (configAPPLICATION_ALLOCATED_HEAP)\r\n#if defined(DATA_SECTION_IS_CACHEABLE) && (DATA_SECTION_IS_CACHEABLE)\r\nextern uint8_t ucHeap[configTOTAL_HEAP_SIZE];\r\nAT_NONCACHEABLE_SECTION_ALIGN(uint8_t ucHeap[configTOTAL_HEAP_SIZE], 4);\r\n#else\r\nextern uint8_t ucHeap[configTOTAL_HEAP_SIZE];\r\nSDK_ALIGN(uint8_t ucHeap[configTOTAL_HEAP_SIZE], 4);\r\n#endif /* DATA_SECTION_IS_CACHEABLE */\r\n#endif /* configAPPLICATION_ALLOCATED_HEAP */\r\n#endif /* FSL_OSA_ALLOCATED_HEAP */\r\n\r\n/*! *********************************************************************************\r\n*************************************************************************************\r\n* Private memory declarations\r\n*************************************************************************************\r\n********************************************************************************** */\r\n\r\n/*! *********************************************************************************\r\n*************************************************************************************\r\n* Public functions\r\n*************************************************************************************\r\n********************************************************************************** */\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_MemoryAllocate\r\n * Description   : Reserves the requested amount of memory in bytes.\r\n *\r\n *END**************************************************************************/\r\nvoid *OSA_MemoryAllocate(uint32_t memLength)\r\n{\r\n#if defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0)\r\n\r\n    void *p = (void *)pvPortMalloc(memLength);\r\n\r\n    if (NULL != p)\r\n    {\r\n        (void)memset(p, 0, memLength);\r\n    }\r\n\r\n    return p;\r\n#else\r\n    return NULL;\r\n#endif\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_MemoryFree\r\n * Description   : Frees the memory previously reserved.\r\n *\r\n *END**************************************************************************/\r\nvoid OSA_MemoryFree(void *p)\r\n{\r\n#if defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0)\r\n    vPortFree(p);\r\n#endif\r\n}\r\n\r\nvoid *OSA_MemoryAllocateAlign(uint32_t memLength, uint32_t alignbytes)\r\n{\r\n    osa_mem_align_cb_t *p_cb = NULL;\r\n    uint32_t alignedsize;\r\n\r\n    /* Check overflow. */\r\n    alignedsize = (uint32_t)(unsigned int)OSA_MEM_SIZE_ALIGN(memLength, alignbytes);\r\n    if (alignedsize < memLength)\r\n    {\r\n        return NULL;\r\n    }\r\n\r\n    if (alignedsize > 0xFFFFFFFFU - alignbytes - sizeof(osa_mem_align_cb_t))\r\n    {\r\n        return NULL;\r\n    }\r\n\r\n    alignedsize += alignbytes + (uint32_t)sizeof(osa_mem_align_cb_t);\r\n\r\n    union\r\n    {\r\n        void *pointer_value;\r\n        uintptr_t unsigned_value;\r\n    } p_align_addr, p_addr;\r\n\r\n    p_addr.pointer_value = OSA_MemoryAllocate(alignedsize);\r\n\r\n    if (p_addr.pointer_value == NULL)\r\n    {\r\n        return NULL;\r\n    }\r\n\r\n    p_align_addr.unsigned_value = OSA_MEM_SIZE_ALIGN(p_addr.unsigned_value + sizeof(osa_mem_align_cb_t), alignbytes);\r\n\r\n    p_cb             = (osa_mem_align_cb_t *)(p_align_addr.unsigned_value - 4U);\r\n    p_cb->identifier = OSA_MEM_MAGIC_NUMBER;\r\n    p_cb->offset     = (uint16_t)(p_align_addr.unsigned_value - p_addr.unsigned_value);\r\n\r\n    return p_align_addr.pointer_value;\r\n}\r\n\r\nvoid OSA_MemoryFreeAlign(void *p)\r\n{\r\n    union\r\n    {\r\n        void *pointer_value;\r\n        uintptr_t unsigned_value;\r\n    } p_free;\r\n    p_free.pointer_value = p;\r\n    osa_mem_align_cb_t *p_cb = (osa_mem_align_cb_t *)(p_free.unsigned_value - 4U);\r\n\r\n    if (p_cb->identifier != OSA_MEM_MAGIC_NUMBER)\r\n    {\r\n        return;\r\n    }\r\n\r\n    p_free.unsigned_value = p_free.unsigned_value - p_cb->offset;\r\n\r\n    OSA_MemoryFree(p_free.pointer_value);\r\n}\r\n\r\nvoid OSA_EnterCritical(uint32_t *sr)\r\n{\r\n#if defined(__GIC_PRIO_BITS)\r\n    if ((__get_CPSR() & CPSR_M_Msk) == 0x13)\r\n#else\r\n    if (0U != __get_IPSR())\r\n#endif\r\n    {\r\n        *sr = portSET_INTERRUPT_MASK_FROM_ISR();\r\n    }\r\n    else\r\n    {\r\n        portENTER_CRITICAL();\r\n    }\r\n}\r\n\r\nvoid OSA_ExitCritical(uint32_t sr)\r\n{\r\n#if defined(__GIC_PRIO_BITS)\r\n    if ((__get_CPSR() & CPSR_M_Msk) == 0x13)\r\n#else\r\n    if (0U != __get_IPSR())\r\n#endif\r\n    {\r\n        portCLEAR_INTERRUPT_MASK_FROM_ISR(sr);\r\n    }\r\n    else\r\n    {\r\n        portEXIT_CRITICAL();\r\n    }\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : startup_task\r\n * Description   : Wrapper over main_task..\r\n *\r\n *END**************************************************************************/\r\nvoid startup_task(void *argument)\r\n{\r\n    main_task(argument);\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_TaskGetCurrentHandle\r\n * Description   : This function is used to get current active task's handler.\r\n *\r\n *END**************************************************************************/\r\n#if (defined(FSL_OSA_TASK_ENABLE) && (FSL_OSA_TASK_ENABLE > 0U))\r\nosa_task_handle_t OSA_TaskGetCurrentHandle(void)\r\n{\r\n    list_element_handle_t list_element;\r\n    osa_freertos_task_t *ptask;\r\n\r\n    list_element = LIST_GetHead(&s_osaState.taskList);\r\n    while (NULL != list_element)\r\n    {\r\n        ptask = (osa_freertos_task_t *)(void *)list_element;\r\n        if (ptask->taskHandle == xTaskGetCurrentTaskHandle())\r\n        {\r\n            return (osa_task_handle_t)ptask;\r\n        }\r\n        list_element = LIST_GetNext(list_element);\r\n    }\r\n    return NULL;\r\n}\r\n#endif\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_TaskYield\r\n * Description   : When a task calls this function, it will give up CPU and put\r\n * itself to the tail of ready list.\r\n *\r\n *END**************************************************************************/\r\n#if (defined(FSL_OSA_TASK_ENABLE) && (FSL_OSA_TASK_ENABLE > 0U))\r\nvoid OSA_TaskYield(void)\r\n{\r\n    taskYIELD();\r\n}\r\n#endif\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_TaskGetPriority\r\n * Description   : This function returns task's priority by task handler.\r\n *\r\n *END**************************************************************************/\r\n#if (defined(FSL_OSA_TASK_ENABLE) && (FSL_OSA_TASK_ENABLE > 0U))\r\nosa_task_priority_t OSA_TaskGetPriority(osa_task_handle_t taskHandle)\r\n{\r\n    assert(NULL != taskHandle);\r\n    osa_freertos_task_t *ptask = (osa_freertos_task_t *)taskHandle;\r\n    return (osa_task_priority_t)(PRIORITY_RTOS_TO_OSA((uxTaskPriorityGet(ptask->taskHandle))));\r\n}\r\n#endif\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_TaskSetPriority\r\n * Description   : This function sets task's priority by task handler.\r\n *\r\n *END**************************************************************************/\r\n#if (defined(FSL_OSA_TASK_ENABLE) && (FSL_OSA_TASK_ENABLE > 0U))\r\nosa_status_t OSA_TaskSetPriority(osa_task_handle_t taskHandle, osa_task_priority_t taskPriority)\r\n{\r\n    assert(NULL != taskHandle);\r\n    osa_freertos_task_t *ptask = (osa_freertos_task_t *)taskHandle;\r\n    vTaskPrioritySet((task_handler_t)ptask->taskHandle, PRIORITY_OSA_TO_RTOS(((uint32_t)taskPriority)));\r\n    return KOSA_StatusSuccess;\r\n}\r\n#endif\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_TaskCreate\r\n * Description   : This function is used to create a task and make it ready.\r\n * Param[in]     :  threadDef  - Definition of the thread.\r\n *                  task_param - Parameter to pass to the new thread.\r\n * Return Thread handle of the new thread, or NULL if failed.\r\n *\r\n *END**************************************************************************/\r\n#if (defined(FSL_OSA_TASK_ENABLE) && (FSL_OSA_TASK_ENABLE > 0U))\r\nosa_status_t OSA_TaskCreate(osa_task_handle_t taskHandle, const osa_task_def_t *thread_def, osa_task_param_t task_param)\r\n{\r\n    osa_status_t status = KOSA_StatusError;\r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0U)))\r\n    assert((sizeof(osa_freertos_task_t) + sizeof(StaticTask_t)) <= OSA_TASK_HANDLE_SIZE);  \r\n#else\r\n    assert(sizeof(osa_freertos_task_t) == OSA_TASK_HANDLE_SIZE);        \r\n#endif\r\n    assert(NULL != taskHandle);\r\n#if defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0)\r\n    TaskHandle_t pxCreatedTask;\r\n#endif\r\n    osa_freertos_task_t *ptask = (osa_freertos_task_t *)taskHandle;\r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0U)))\r\n    TaskHandle_t xHandle = NULL;\r\n#endif\r\n    OSA_InterruptDisable();\r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0U)))\r\n    xHandle = xTaskCreateStatic(\r\n            (TaskFunction_t)thread_def->pthread, /* pointer to the task */\r\n                        (const char *)thread_def->tname,     /* task name for kernel awareness debugging */\r\n                        (uint32_t)((uint16_t)thread_def->stacksize / sizeof(portSTACK_TYPE)), /* task stack size */\r\n                        (task_param_t)task_param,                      /* optional task startup argument */\r\n                        PRIORITY_OSA_TO_RTOS((thread_def->tpriority)), /* initial priority */\r\n                        thread_def->tstack,    /*Array to use as the task's stack*/\r\n                        (StaticTask_t *)((uint8_t *)(taskHandle) + sizeof(osa_freertos_task_t))/*Variable to hold the task's data structure*/\r\n                        );\r\n      if(xHandle != NULL)\r\n      {\r\n          ptask->taskHandle = xHandle;\r\n          (void)LIST_AddTail(&s_osaState.taskList, (list_element_handle_t) & (ptask->link));\r\n          status = KOSA_StatusSuccess;\r\n      }\r\n#else\r\n    if (xTaskCreate(\r\n            (TaskFunction_t)thread_def->pthread, /* pointer to the task */\r\n            (char const *)thread_def->tname,     /* task name for kernel awareness debugging */\r\n            (configSTACK_DEPTH_TYPE)((uint16_t)thread_def->stacksize / sizeof(portSTACK_TYPE)), /* task stack size */\r\n            (task_param_t)task_param,                      /* optional task startup argument */\r\n            PRIORITY_OSA_TO_RTOS((thread_def->tpriority)), /* initial priority */\r\n            &pxCreatedTask                                 /* optional task handle to create */\r\n            ) == pdPASS)\r\n    {\r\n        ptask->taskHandle = pxCreatedTask;\r\n\r\n        (void)LIST_AddTail(&s_osaState.taskList, (list_element_handle_t) & (ptask->link));\r\n\r\n        status = KOSA_StatusSuccess;\r\n    }\r\n#endif\r\n    OSA_InterruptEnable();\r\n    return status;\r\n}\r\n#endif\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_TaskDestroy\r\n * Description   : This function destroy a task.\r\n * Param[in]     :taskHandle - Thread handle.\r\n * Return KOSA_StatusSuccess if the task is destroied, otherwise return KOSA_StatusError.\r\n *\r\n *END**************************************************************************/\r\n#if (defined(FSL_OSA_TASK_ENABLE) && (FSL_OSA_TASK_ENABLE > 0U))\r\nosa_status_t OSA_TaskDestroy(osa_task_handle_t taskHandle)\r\n{\r\n    assert(NULL != taskHandle);\r\n    osa_freertos_task_t *ptask = (osa_freertos_task_t *)taskHandle;\r\n    osa_status_t status;\r\n    UBaseType_t oldPriority;\r\n\r\n    /*Change priority to avoid context switches*/\r\n    oldPriority = uxTaskPriorityGet(xTaskGetCurrentTaskHandle());\r\n    vTaskPrioritySet(xTaskGetCurrentTaskHandle(), (configMAX_PRIORITIES - 1));\r\n#if INCLUDE_vTaskDelete /* vTaskDelete() enabled */\r\n    vTaskDelete((task_handler_t)ptask->taskHandle);\r\n    status = KOSA_StatusSuccess;\r\n#else\r\n    status = KOSA_StatusError; /* vTaskDelete() not available */\r\n#endif\r\n    vTaskPrioritySet(xTaskGetCurrentTaskHandle(), oldPriority);\r\n    OSA_InterruptDisable();\r\n    (void)LIST_RemoveElement(taskHandle);\r\n    OSA_InterruptEnable();\r\n    return status;\r\n}\r\n#endif\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_TimeDelay\r\n * Description   : This function is used to suspend the active thread for the given number of milliseconds.\r\n *\r\n *END**************************************************************************/\r\nvoid OSA_TimeDelay(uint32_t millisec)\r\n{\r\n    vTaskDelay(millisecToTicks(millisec));\r\n}\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_TimeGetMsec\r\n * Description   : This function gets current time in milliseconds.\r\n *\r\n *END**************************************************************************/\r\nuint32_t OSA_TimeGetMsec(void)\r\n{\r\n    TickType_t ticks;\r\n\r\n    if (0U != __get_IPSR())\r\n    {\r\n        ticks = xTaskGetTickCountFromISR();\r\n    }\r\n    else\r\n    {\r\n        ticks = xTaskGetTickCount();\r\n    }\r\n\r\n    return TICKS_TO_MSEC(ticks);\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_SemaphorePrecreate\r\n * Description   : This function is used to pre-create a semaphore.\r\n * Return         : KOSA_StatusSuccess\r\n *\r\n *END**************************************************************************/\r\n\r\nosa_status_t OSA_SemaphorePrecreate(osa_semaphore_handle_t semaphoreHandle, osa_task_ptr_t taskHandler)\r\n{\r\n    semaphoreHandle = semaphoreHandle;\r\n    taskHandler     = taskHandler;\r\n    return KOSA_StatusSuccess;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_SemaphoreCreate\r\n * Description   : This function is used to create a semaphore.\r\n * Return         : Semaphore handle of the new semaphore, or NULL if failed.\r\n *\r\n *END**************************************************************************/\r\nosa_status_t OSA_SemaphoreCreate(osa_semaphore_handle_t semaphoreHandle, uint32_t initValue)\r\n{\r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0U)))\r\n    assert((sizeof(osa_semaphore_handle_t) + sizeof(StaticQueue_t)) == OSA_SEM_HANDLE_SIZE);\r\n#else\r\n    assert(sizeof(osa_semaphore_handle_t) == OSA_SEM_HANDLE_SIZE);\r\n#endif\r\n    assert(NULL != semaphoreHandle);\r\n\r\n    union\r\n    {\r\n        QueueHandle_t sem;\r\n        uint32_t semhandle;\r\n    } xSemaHandle;\r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0U)))\r\n    xSemaHandle.sem = xSemaphoreCreateCountingStatic(0xFF, initValue, (StaticQueue_t *)(void *)((uint8_t *)semaphoreHandle + sizeof(osa_semaphore_handle_t)));\r\n#else\r\n    xSemaHandle.sem = xSemaphoreCreateCounting(0xFF, initValue);\r\n#endif\r\n    if (NULL != xSemaHandle.sem)\r\n    {\r\n        *(uint32_t *)semaphoreHandle = xSemaHandle.semhandle;\r\n        return KOSA_StatusSuccess;\r\n    }\r\n    return KOSA_StatusError;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_SemaphoreCreateBinary\r\n * Description   : This function is used to create a binary semaphore.\r\n * Return        : Semaphore handle of the new binary semaphore, or NULL if failed.\r\n *\r\n *END**************************************************************************/\r\nosa_status_t OSA_SemaphoreCreateBinary(osa_semaphore_handle_t semaphoreHandle)\r\n{\r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0U)))\r\n    assert((sizeof(osa_semaphore_handle_t) + sizeof(StaticQueue_t)) == OSA_SEM_HANDLE_SIZE);\r\n#else\r\n    assert(sizeof(osa_semaphore_handle_t) == OSA_SEM_HANDLE_SIZE);\r\n#endif\r\n    assert(NULL != semaphoreHandle);\r\n\r\n    union\r\n    {\r\n        QueueHandle_t sem;\r\n        uint32_t semhandle;\r\n    } xSemaHandle;\r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0U)))\r\n    xSemaHandle.sem = xSemaphoreCreateBinaryStatic((StaticQueue_t *)(void *)((uint8_t *)semaphoreHandle + sizeof(osa_semaphore_handle_t)));    \r\n#else\r\n    xSemaHandle.sem = xSemaphoreCreateBinary();\r\n#endif\r\n    if (NULL != xSemaHandle.sem)\r\n    {\r\n        *(uint32_t *)semaphoreHandle = xSemaHandle.semhandle;\r\n        return KOSA_StatusSuccess;\r\n    }\r\n    return KOSA_StatusError;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_SemaphoreDestroy\r\n * Description   : This function is used to destroy a semaphore.\r\n * Return        : KOSA_StatusSuccess if the semaphore is destroyed successfully, otherwise return KOSA_StatusError.\r\n *\r\n *END**************************************************************************/\r\nosa_status_t OSA_SemaphoreDestroy(osa_semaphore_handle_t semaphoreHandle)\r\n{\r\n    assert(NULL != semaphoreHandle);\r\n    QueueHandle_t sem = (QueueHandle_t)(void *)(uint32_t *)(*(uint32_t *)semaphoreHandle);\r\n\r\n    vSemaphoreDelete(sem);\r\n    return KOSA_StatusSuccess;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_SemaphoreWait\r\n * Description   : This function checks the semaphore's counting value, if it is\r\n * positive, decreases it and returns KOSA_StatusSuccess, otherwise, timeout\r\n * will be used for wait. The parameter timeout indicates how long should wait\r\n * in milliseconds. Pass osaWaitForever_c to wait indefinitely, pass 0 will\r\n * return KOSA_StatusTimeout immediately if semaphore is not positive.\r\n * This function returns KOSA_StatusSuccess if the semaphore is received, returns\r\n * KOSA_StatusTimeout if the semaphore is not received within the specified\r\n * 'timeout', returns KOSA_StatusError if any errors occur during waiting.\r\n *\r\n *END**************************************************************************/\r\nosa_status_t OSA_SemaphoreWait(osa_semaphore_handle_t semaphoreHandle, uint32_t millisec)\r\n{\r\n    uint32_t timeoutTicks;\r\n    assert(NULL != semaphoreHandle);\r\n    QueueHandle_t sem = (QueueHandle_t)(void *)(uint32_t *)(*(uint32_t *)semaphoreHandle);\r\n\r\n    /* Convert timeout from millisecond to tick. */\r\n    if (millisec == osaWaitForever_c)\r\n    {\r\n        timeoutTicks = portMAX_DELAY;\r\n    }\r\n    else\r\n    {\r\n        timeoutTicks = MSEC_TO_TICK(millisec);\r\n    }\r\n\r\n    if (((BaseType_t)0) == (BaseType_t)xSemaphoreTake(sem, timeoutTicks))\r\n    {\r\n        return KOSA_StatusTimeout; /* timeout */\r\n    }\r\n    else\r\n    {\r\n        return KOSA_StatusSuccess; /* semaphore taken */\r\n    }\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_SemaphorePost\r\n * Description   : This function is used to wake up one task that wating on the\r\n * semaphore. If no task is waiting, increase the semaphore. The function returns\r\n * KOSA_StatusSuccess if the semaphre is post successfully, otherwise returns\r\n * KOSA_StatusError.\r\n *\r\n *END**************************************************************************/\r\nosa_status_t OSA_SemaphorePost(osa_semaphore_handle_t semaphoreHandle)\r\n{\r\n    assert(NULL != semaphoreHandle);\r\n    osa_status_t status = KOSA_StatusError;\r\n    QueueHandle_t sem   = (QueueHandle_t)(void *)(uint32_t *)(*(uint32_t *)semaphoreHandle);\r\n\r\n    if (0U != __get_IPSR())\r\n    {\r\n        portBASE_TYPE taskToWake = (portBASE_TYPE)pdFALSE;\r\n\r\n        if (((BaseType_t)1) == (BaseType_t)xSemaphoreGiveFromISR(sem, &taskToWake))\r\n        {\r\n            portYIELD_FROM_ISR(((bool)(taskToWake)));\r\n            status = KOSA_StatusSuccess;\r\n        }\r\n        else\r\n        {\r\n            status = KOSA_StatusError;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        if (((BaseType_t)1) == (BaseType_t)xSemaphoreGive(sem))\r\n        {\r\n            status = KOSA_StatusSuccess; /* sync object given */\r\n        }\r\n        else\r\n        {\r\n            status = KOSA_StatusError;\r\n        }\r\n    }\r\n    return status;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_MutexCreate\r\n * Description   : This function is used to create a mutex.\r\n * Return        : Mutex handle of the new mutex, or NULL if failed.\r\n *\r\n *END**************************************************************************/\r\nosa_status_t OSA_MutexCreate(osa_mutex_handle_t mutexHandle)\r\n{\r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0U)))\r\n    assert((sizeof(osa_mutex_handle_t) + sizeof(StaticQueue_t)) == OSA_MUTEX_HANDLE_SIZE);  \r\n#else\r\n    assert(sizeof(osa_mutex_handle_t) == OSA_MUTEX_HANDLE_SIZE);\r\n#endif\r\n    assert(NULL != mutexHandle);\r\n\r\n    union\r\n    {\r\n        QueueHandle_t mutex;\r\n        uint32_t pmutexHandle;\r\n    } xMutexHandle;\r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0U)))\r\n    xMutexHandle.mutex = xSemaphoreCreateRecursiveMutexStatic((StaticQueue_t *)(void *)((uint8_t *)mutexHandle + sizeof(osa_mutex_handle_t)));\r\n#else\r\n    xMutexHandle.mutex = xSemaphoreCreateRecursiveMutex();\r\n#endif\r\n    if (NULL != xMutexHandle.mutex)\r\n    {\r\n        *(uint32_t *)mutexHandle = xMutexHandle.pmutexHandle;\r\n        return KOSA_StatusSuccess;\r\n    }\r\n    return KOSA_StatusError;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_MutexLock\r\n * Description   : This function checks the mutex's status, if it is unlocked,\r\n * lock it and returns KOSA_StatusSuccess, otherwise, wait for the mutex.\r\n * This function returns KOSA_StatusSuccess if the mutex is obtained, returns\r\n * KOSA_StatusError if any errors occur during waiting. If the mutex has been\r\n * locked, pass 0 as timeout will return KOSA_StatusTimeout immediately.\r\n *\r\n *END**************************************************************************/\r\nosa_status_t OSA_MutexLock(osa_mutex_handle_t mutexHandle, uint32_t millisec)\r\n{\r\n    assert(NULL != mutexHandle);\r\n    uint32_t timeoutTicks;\r\n    QueueHandle_t mutex = (QueueHandle_t)(void *)(uint32_t *)(*(uint32_t *)mutexHandle);\r\n\r\n    /* Convert timeout from millisecond to tick. */\r\n    if (millisec == osaWaitForever_c)\r\n    {\r\n        timeoutTicks = portMAX_DELAY;\r\n    }\r\n    else\r\n    {\r\n        timeoutTicks = MSEC_TO_TICK(millisec);\r\n    }\r\n\r\n    if (((BaseType_t)0) == (BaseType_t)xSemaphoreTakeRecursive(mutex, timeoutTicks))\r\n    {\r\n        return KOSA_StatusTimeout; /* timeout */\r\n    }\r\n    else\r\n    {\r\n        return KOSA_StatusSuccess; /* semaphore taken */\r\n    }\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_MutexUnlock\r\n * Description   : This function is used to unlock a mutex.\r\n *\r\n *END**************************************************************************/\r\nosa_status_t OSA_MutexUnlock(osa_mutex_handle_t mutexHandle)\r\n{\r\n    assert(NULL != mutexHandle);\r\n    QueueHandle_t mutex = (QueueHandle_t)(void *)(uint32_t *)(*(uint32_t *)mutexHandle);\r\n\r\n    if (((BaseType_t)0) == (BaseType_t)xSemaphoreGiveRecursive(mutex))\r\n    {\r\n        return KOSA_StatusError;\r\n    }\r\n    else\r\n    {\r\n        return KOSA_StatusSuccess;\r\n    }\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_MutexDestroy\r\n * Description   : This function is used to destroy a mutex.\r\n * Return        : KOSA_StatusSuccess if the lock object is destroyed successfully, otherwise return KOSA_StatusError.\r\n *\r\n *END**************************************************************************/\r\nosa_status_t OSA_MutexDestroy(osa_mutex_handle_t mutexHandle)\r\n{\r\n    assert(NULL != mutexHandle);\r\n    QueueHandle_t mutex = (QueueHandle_t)(void *)(uint32_t *)(*(uint32_t *)mutexHandle);\r\n\r\n    vSemaphoreDelete(mutex);\r\n    return KOSA_StatusSuccess;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_EventPrecreate\r\n * Description   : This function is used to pre-create a event.\r\n * Return         : KOSA_StatusSuccess\r\n *\r\n *END**************************************************************************/\r\n\r\nosa_status_t OSA_EventPrecreate(osa_event_handle_t eventHandle, osa_task_ptr_t taskHandler)\r\n{\r\n    eventHandle = eventHandle;\r\n    taskHandler = taskHandler;\r\n    return KOSA_StatusSuccess;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_EventCreate\r\n * Description   : This function is used to create a event object.\r\n * Return        : Event handle of the new event, or NULL if failed.\r\n *\r\n *END**************************************************************************/\r\nosa_status_t OSA_EventCreate(osa_event_handle_t eventHandle, uint8_t autoClear)\r\n{\r\n    assert(NULL != eventHandle);\r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0U)))\r\n    assert((sizeof(osa_event_struct_t) + sizeof(StaticEventGroup_t)) <= OSA_EVENT_HANDLE_SIZE);  \r\n#else\r\n    assert(sizeof(osa_event_struct_t) == OSA_EVENT_HANDLE_SIZE);\r\n#endif\r\n    osa_event_struct_t *pEventStruct = (osa_event_struct_t *)eventHandle; \r\n    \r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0U)))\r\n    pEventStruct->eventHandle = xEventGroupCreateStatic((StaticEventGroup_t *)(void *)((uint8_t *)(eventHandle) + sizeof(osa_event_struct_t)));\r\n#else    \r\n    pEventStruct->eventHandle = xEventGroupCreate();\r\n#endif\r\n    if (NULL != pEventStruct->eventHandle)\r\n    {\r\n        pEventStruct->autoClear = autoClear;\r\n    }\r\n    else\r\n    {\r\n        return KOSA_StatusError;\r\n    }\r\n    return KOSA_StatusSuccess;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_EventSet\r\n * Description   : Set one or more event flags of an event object.\r\n * Return        : KOSA_StatusSuccess if set successfully, KOSA_StatusError if failed.\r\n *\r\n *END**************************************************************************/\r\nosa_status_t OSA_EventSet(osa_event_handle_t eventHandle, osa_event_flags_t flagsToSet)\r\n{\r\n    portBASE_TYPE taskToWake = (portBASE_TYPE)pdFALSE;\r\n    BaseType_t result;\r\n    assert(NULL != eventHandle);\r\n    osa_event_struct_t *pEventStruct = (osa_event_struct_t *)eventHandle;\r\n\r\n    if (NULL == pEventStruct->eventHandle)\r\n    {\r\n        return KOSA_StatusError;\r\n    }\r\n    if (0U != __get_IPSR())\r\n    {\r\n#if (configUSE_TRACE_FACILITY == 1)\r\n        result = xEventGroupSetBitsFromISR(pEventStruct->eventHandle, (event_flags_t)flagsToSet, &taskToWake);\r\n#else\r\n        result = xEventGroupSetBitsFromISR((void *)pEventStruct->eventHandle, (event_flags_t)flagsToSet, &taskToWake);\r\n#endif\r\n        assert(pdPASS == result);\r\n        (void)result;\r\n        portYIELD_FROM_ISR(((bool)(taskToWake)));\r\n    }\r\n    else\r\n    {\r\n        (void)xEventGroupSetBits(pEventStruct->eventHandle, (event_flags_t)flagsToSet);\r\n    }\r\n\r\n    (void)result;\r\n    return KOSA_StatusSuccess;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_EventClear\r\n * Description   : Clear one or more event flags of an event object.\r\n * Return        :KOSA_StatusSuccess if clear successfully, KOSA_StatusError if failed.\r\n *\r\n *END**************************************************************************/\r\nosa_status_t OSA_EventClear(osa_event_handle_t eventHandle, osa_event_flags_t flagsToClear)\r\n{\r\n    assert(NULL != eventHandle);\r\n    osa_event_struct_t *pEventStruct = (osa_event_struct_t *)eventHandle;\r\n\r\n    if (NULL == pEventStruct->eventHandle)\r\n    {\r\n        return KOSA_StatusError;\r\n    }\r\n\r\n    if (0U != __get_IPSR())\r\n    {\r\n#if (configUSE_TRACE_FACILITY == 1)\r\n        (void)xEventGroupClearBitsFromISR(pEventStruct->eventHandle, (event_flags_t)flagsToClear);\r\n#else\r\n        (void)xEventGroupClearBitsFromISR((void *)pEventStruct->eventHandle, (event_flags_t)flagsToClear);\r\n#endif\r\n    }\r\n    else\r\n    {\r\n        (void)xEventGroupClearBits(pEventStruct->eventHandle, (event_flags_t)flagsToClear);\r\n    }\r\n    return KOSA_StatusSuccess;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_EventGet\r\n * Description   : This function is used to get event's flags that specified by prameter\r\n * flagsMask, and the flags (user specified) are obatianed by parameter pFlagsOfEvent. So\r\n * you should pass the parameter 0xffffffff to specify you want to check all.\r\n * Return        :KOSA_StatusSuccess if event flags were successfully got, KOSA_StatusError if failed.\r\n *\r\n *END**************************************************************************/\r\nosa_status_t OSA_EventGet(osa_event_handle_t eventHandle, osa_event_flags_t flagsMask, osa_event_flags_t *pFlagsOfEvent)\r\n{\r\n    assert(NULL != eventHandle);\r\n    osa_event_struct_t *pEventStruct = (osa_event_struct_t *)eventHandle;\r\n    EventBits_t eventFlags;\r\n\r\n    if (NULL == pEventStruct->eventHandle)\r\n    {\r\n        return KOSA_StatusError;\r\n    }\r\n\r\n    if (NULL == pFlagsOfEvent)\r\n    {\r\n        return KOSA_StatusError;\r\n    }\r\n\r\n    if (0U != __get_IPSR())\r\n    {\r\n        eventFlags = xEventGroupGetBitsFromISR(pEventStruct->eventHandle);\r\n    }\r\n    else\r\n    {\r\n        eventFlags = xEventGroupGetBits(pEventStruct->eventHandle);\r\n    }\r\n\r\n    *pFlagsOfEvent = (osa_event_flags_t)eventFlags & flagsMask;\r\n\r\n    return KOSA_StatusSuccess;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_EventWait\r\n * Description   : This function checks the event's status, if it meets the wait\r\n * condition, return KOSA_StatusSuccess, otherwise, timeout will be used for\r\n * wait. The parameter timeout indicates how long should wait in milliseconds.\r\n * Pass osaWaitForever_c to wait indefinitely, pass 0 will return the value\r\n * KOSA_StatusTimeout immediately if wait condition is not met. The event flags\r\n * will be cleared if the event is auto clear mode. Flags that wakeup waiting\r\n * task could be obtained from the parameter setFlags.\r\n * This function returns KOSA_StatusSuccess if wait condition is met, returns\r\n * KOSA_StatusTimeout if wait condition is not met within the specified\r\n * 'timeout', returns KOSA_StatusError if any errors occur during waiting.\r\n *\r\n *END**************************************************************************/\r\nosa_status_t OSA_EventWait(osa_event_handle_t eventHandle,\r\n                           osa_event_flags_t flagsToWait,\r\n                           uint8_t waitAll,\r\n                           uint32_t millisec,\r\n                           osa_event_flags_t *pSetFlags)\r\n{\r\n    assert(NULL != eventHandle);\r\n    BaseType_t clearMode;\r\n    uint32_t timeoutTicks;\r\n    event_flags_t flagsSave;\r\n    osa_event_struct_t *pEventStruct = (osa_event_struct_t *)eventHandle;\r\n\r\n    /* Clean FreeRTOS cotrol flags */\r\n    flagsToWait = flagsToWait & 0x00FFFFFFU;\r\n    if (NULL == pEventStruct->eventHandle)\r\n    {\r\n        return KOSA_StatusError;\r\n    }\r\n\r\n    /* Convert timeout from millisecond to tick. */\r\n    if (millisec == osaWaitForever_c)\r\n    {\r\n        timeoutTicks = portMAX_DELAY;\r\n    }\r\n    else\r\n    {\r\n        timeoutTicks = millisec / portTICK_PERIOD_MS;\r\n    }\r\n\r\n    clearMode = (pEventStruct->autoClear != 0U) ? pdTRUE : pdFALSE;\r\n\r\n    flagsSave = xEventGroupWaitBits(pEventStruct->eventHandle, (event_flags_t)flagsToWait, clearMode, (BaseType_t)waitAll,\r\n                                    timeoutTicks);\r\n\r\n    flagsSave &= (event_flags_t)flagsToWait;\r\n    if (NULL != pSetFlags)\r\n    {\r\n        *pSetFlags = (osa_event_flags_t)flagsSave;\r\n    }\r\n\r\n    if (0U != flagsSave)\r\n    {\r\n        return KOSA_StatusSuccess;\r\n    }\r\n    else\r\n    {\r\n        return KOSA_StatusTimeout;\r\n    }\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_EventDestroy\r\n * Description   : This function is used to destroy a event object. Return\r\n * KOSA_StatusSuccess if the event object is destroyed successfully, otherwise\r\n * return KOSA_StatusError.\r\n *\r\n *END**************************************************************************/\r\nosa_status_t OSA_EventDestroy(osa_event_handle_t eventHandle)\r\n{\r\n    assert(NULL != eventHandle);\r\n    osa_event_struct_t *pEventStruct = (osa_event_struct_t *)eventHandle;\r\n\r\n    if (NULL == pEventStruct->eventHandle)\r\n    {\r\n        return KOSA_StatusError;\r\n    }\r\n    vEventGroupDelete(pEventStruct->eventHandle);\r\n    return KOSA_StatusSuccess;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_MsgQCreate\r\n * Description   : This function is used to create a message queue.\r\n * Return        : the handle to the message queue if create successfully, otherwise\r\n * return NULL.\r\n *\r\n *END**************************************************************************/\r\nosa_status_t OSA_MsgQCreate(osa_msgq_handle_t msgqHandle, uint32_t msgNo, uint32_t msgSize)\r\n{\r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0U)))\r\n    assert((sizeof(osa_msgq_handle_t) + sizeof(StaticQueue_t)) == OSA_MSGQ_HANDLE_SIZE);  \r\n#else\r\n    assert(sizeof(osa_msgq_handle_t) == OSA_MSGQ_HANDLE_SIZE);\r\n#endif\r\n    assert(NULL != msgqHandle);\r\n\r\n    union\r\n    {\r\n        QueueHandle_t msgq;\r\n        uint32_t pmsgqHandle;\r\n    } xMsgqHandle;\r\n\r\n    /* Create the message queue where the number and size is specified by msgNo and msgSize */\r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION > 0U)))\r\n    xMsgqHandle.msgq = xQueueCreateStatic(msgNo, msgSize, \r\n                                          (uint8_t *)((uint8_t *)msgqHandle + sizeof(osa_msgq_handle_t) + sizeof(StaticQueue_t)),\r\n                                          (StaticQueue_t *)(void *)((uint8_t *)msgqHandle + sizeof(osa_msgq_handle_t)));\r\n#else\r\n    xMsgqHandle.msgq = xQueueCreate(msgNo, msgSize);\r\n#endif\r\n    if (NULL != xMsgqHandle.msgq)\r\n    {\r\n        *(uint32_t *)msgqHandle = xMsgqHandle.pmsgqHandle;\r\n        return KOSA_StatusSuccess;\r\n    }\r\n    return KOSA_StatusError;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_MsgQPut\r\n * Description   : This function is used to put a message to a message queue.\r\n * Return         : KOSA_StatusSuccess if the message is put successfully, otherwise return KOSA_StatusError.\r\n *\r\n *END**************************************************************************/\r\nosa_status_t OSA_MsgQPut(osa_msgq_handle_t msgqHandle, osa_msg_handle_t pMessage)\r\n{\r\n    osa_status_t osaStatus;\r\n    assert(NULL != msgqHandle);\r\n    portBASE_TYPE taskToWake = (portBASE_TYPE)pdFALSE;\r\n    QueueHandle_t handler    = (QueueHandle_t)(void *)(uint32_t *)(*(uint32_t *)msgqHandle);\r\n\r\n    if (0U != __get_IPSR())\r\n    {\r\n        if (((BaseType_t)1) == (BaseType_t)xQueueSendToBackFromISR(handler, pMessage, &taskToWake))\r\n        {\r\n            portYIELD_FROM_ISR(((bool)(taskToWake)));\r\n            osaStatus = KOSA_StatusSuccess;\r\n        }\r\n        else\r\n        {\r\n            osaStatus = KOSA_StatusError;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        osaStatus = (xQueueSendToBack(handler, pMessage, 0) == pdPASS) ? (KOSA_StatusSuccess) : (KOSA_StatusError);\r\n    }\r\n\r\n    return osaStatus;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_MsgQGet\r\n * Description   : This function checks the queue's status, if it is not empty,\r\n * get message from it and return KOSA_StatusSuccess, otherwise, timeout will\r\n * be used for wait. The parameter timeout indicates how long should wait in\r\n * milliseconds. Pass osaWaitForever_c to wait indefinitely, pass 0 will return\r\n * KOSA_StatusTimeout immediately if queue is empty.\r\n * This function returns KOSA_StatusSuccess if message is got successfully,\r\n * returns KOSA_StatusTimeout if message queue is empty within the specified\r\n * 'timeout', returns KOSA_StatusError if any errors occur during waiting.\r\n *\r\n *END**************************************************************************/\r\nosa_status_t OSA_MsgQGet(osa_msgq_handle_t msgqHandle, osa_msg_handle_t pMessage, uint32_t millisec)\r\n{\r\n    osa_status_t osaStatus;\r\n    assert(NULL != msgqHandle);\r\n    QueueHandle_t handler = (QueueHandle_t)(void *)(uint32_t *)(*(uint32_t *)msgqHandle);\r\n\r\n    uint32_t timeoutTicks;\r\n\r\n    if (millisec == osaWaitForever_c)\r\n    {\r\n        timeoutTicks = portMAX_DELAY;\r\n    }\r\n    else\r\n    {\r\n        timeoutTicks = MSEC_TO_TICK(millisec);\r\n    }\r\n    if (pdPASS != xQueueReceive(handler, pMessage, timeoutTicks))\r\n    {\r\n        osaStatus = KOSA_StatusTimeout; /* not able to send it to the queue? */\r\n    }\r\n    else\r\n    {\r\n        osaStatus = KOSA_StatusSuccess;\r\n    }\r\n    return osaStatus;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_MsgQAvailableMsgs\r\n * Description   : This function is used to get the available message.\r\n * Return        : Available message count\r\n *\r\n *END**************************************************************************/\r\nint OSA_MsgQAvailableMsgs(osa_msgq_handle_t msgqHandle)\r\n{\r\n    QueueHandle_t handler;\r\n    assert(NULL != msgqHandle);\r\n    handler = (QueueHandle_t)(void *)(uint32_t *)(*(uint32_t *)msgqHandle);\r\n    return (int)uxQueueMessagesWaiting((QueueHandle_t)handler);\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_MsgQDestroy\r\n * Description   : This function is used to destroy the message queue.\r\n * Return        : KOSA_StatusSuccess if the message queue is destroyed successfully, otherwise return KOSA_StatusError.\r\n *\r\n *END**************************************************************************/\r\nosa_status_t OSA_MsgQDestroy(osa_msgq_handle_t msgqHandle)\r\n{\r\n    assert(NULL != msgqHandle);\r\n    QueueHandle_t handler = (QueueHandle_t)(void *)(uint32_t *)(*(uint32_t *)msgqHandle);\r\n\r\n    vQueueDelete(handler);\r\n    return KOSA_StatusSuccess;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_InterruptEnable\r\n * Description   : self explanatory.\r\n *\r\n *END**************************************************************************/\r\nvoid OSA_InterruptEnable(void)\r\n{\r\n    if (0U != __get_IPSR())\r\n    {\r\n        if (1 == s_osaState.basePriorityNesting)\r\n        {\r\n            portCLEAR_INTERRUPT_MASK_FROM_ISR(s_osaState.basePriority);\r\n        }\r\n\r\n        if (s_osaState.basePriorityNesting > 0)\r\n        {\r\n            s_osaState.basePriorityNesting--;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        portEXIT_CRITICAL();\r\n    }\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_InterruptDisable\r\n * Description   : self explanatory.\r\n *\r\n *END**************************************************************************/\r\nvoid OSA_InterruptDisable(void)\r\n{\r\n    if (0U != __get_IPSR())\r\n    {\r\n        if (0 == s_osaState.basePriorityNesting)\r\n        {\r\n            s_osaState.basePriority = portSET_INTERRUPT_MASK_FROM_ISR();\r\n        }\r\n        s_osaState.basePriorityNesting++;\r\n    }\r\n    else\r\n    {\r\n        portENTER_CRITICAL();\r\n    }\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_EnableIRQGlobal\r\n * Description   : enable interrupts using PRIMASK register.\r\n *\r\n *END**************************************************************************/\r\nvoid OSA_EnableIRQGlobal(void)\r\n{\r\n    if (s_osaState.interruptDisableCount > 0U)\r\n    {\r\n        s_osaState.interruptDisableCount--;\r\n\r\n        if (0U == s_osaState.interruptDisableCount)\r\n        {\r\n            __enable_irq();\r\n        }\r\n        /* call core API to enable the global interrupt*/\r\n    }\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_DisableIRQGlobal\r\n * Description   : disable interrupts using PRIMASK register.\r\n *\r\n *END**************************************************************************/\r\nvoid OSA_DisableIRQGlobal(void)\r\n{\r\n    /* call core API to disable the global interrupt*/\r\n    __disable_irq();\r\n\r\n    /* update counter*/\r\n    s_osaState.interruptDisableCount++;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_DisableScheduler\r\n * Description   : Disable the scheduling of any task\r\n * This function will disable the scheduling of any task\r\n *\r\n *END**************************************************************************/\r\nvoid OSA_DisableScheduler(void)\r\n{\r\n    vTaskSuspendAll();\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_EnableScheduler\r\n * Description   : Enable the scheduling of any task\r\n * This function will enable the scheduling of any task\r\n *\r\n *END**************************************************************************/\r\nvoid OSA_EnableScheduler(void)\r\n{\r\n    (void)xTaskResumeAll();\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_InstallIntHandler\r\n * Description   : This function is used to install interrupt handler.\r\n *\r\n *END**************************************************************************/\r\nvoid OSA_InstallIntHandler(uint32_t IRQNumber, void (*handler)(void))\r\n{\r\n#if defined(__IAR_SYSTEMS_ICC__)\r\n    _Pragma(\"diag_suppress = Pm138\")\r\n#endif\r\n#if defined(ENABLE_RAM_VECTOR_TABLE)\r\n        (void) InstallIRQHandler((IRQn_Type)IRQNumber, (uint32_t)handler);\r\n#endif /* ENABLE_RAM_VECTOR_TABLE. */\r\n#if defined(__IAR_SYSTEMS_ICC__)\r\n    _Pragma(\"diag_remark = PM138\")\r\n#endif\r\n}\r\n\r\n/*!*********************************************************************************\r\n*************************************************************************************\r\n* Private functions\r\n*************************************************************************************\r\n********************************************************************************** */\r\n#if (defined(FSL_OSA_TASK_ENABLE) && (FSL_OSA_TASK_ENABLE > 0U))\r\n#if (defined(FSL_OSA_MAIN_FUNC_ENABLE) && (FSL_OSA_MAIN_FUNC_ENABLE > 0U))\r\nstatic OSA_TASK_DEFINE(startup_task, gMainThreadPriority_c, 1, gMainThreadStackSize_c, 0);\r\n\r\nint main(void)\r\n{\r\n    extern void BOARD_InitHardware(void);\r\n    OSA_Init();\r\n    /* Initialize MCU clock */\r\n    BOARD_InitHardware();\r\n\r\n    (void)OSA_TaskCreate((osa_task_handle_t)s_osaState.mainTaskHandle, OSA_TASK(startup_task), NULL);\r\n\r\n    OSA_Start();\r\n    return 0;\r\n}\r\n#endif /*(defined(FSL_OSA_MAIN_FUNC_ENABLE) && (FSL_OSA_MAIN_FUNC_ENABLE > 0U))*/\r\n#endif /* FSL_OSA_TASK_ENABLE */\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_Init\r\n * Description   : This function is used to setup the basic services, it should\r\n * be called first in function main.\r\n *\r\n *END**************************************************************************/\r\n#if (defined(FSL_OSA_TASK_ENABLE) && (FSL_OSA_TASK_ENABLE > 0U))\r\nvoid OSA_Init(void)\r\n{\r\n    LIST_Init((&s_osaState.taskList), 0);\r\n    s_osaState.basePriorityNesting   = 0;\r\n    s_osaState.interruptDisableCount = 0;\r\n}\r\n#endif\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : OSA_Start\r\n * Description   : This function is used to start RTOS scheduler.\r\n *\r\n *END**************************************************************************/\r\n#if (defined(FSL_OSA_TASK_ENABLE) && (FSL_OSA_TASK_ENABLE > 0U))\r\nvoid OSA_Start(void)\r\n{\r\n    vTaskStartScheduler();\r\n}\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/osa/fsl_os_abstraction_free_rtos.h",
    "content": "/*! *********************************************************************************\r\n * Copyright (c) 2013-2014, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2017 NXP\r\n * All rights reserved.\r\n *\r\n * \file\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n ********************************************************************************** */\r\n#if !defined(__FSL_OS_ABSTRACTION_FREERTOS_H__)\r\n#define __FSL_OS_ABSTRACTION_FREERTOS_H__\r\n\r\n#if defined(__IAR_SYSTEMS_ICC__)\r\n/**\r\n * Workaround to disable MISRA C message suppress warnings for IAR compiler.\r\n */\r\n/* http://supp.iar.com/Support/?note=24725 */\r\n\r\n#define MISRAC_DISABLE \\\r\n    _Pragma(           \\\r\n        \"diag_suppress=                       \\\r\n    Pm001,Pm002,Pm003,Pm004,Pm005,Pm006,Pm007,Pm008,Pm009,Pm010,Pm011,\\\r\n    Pm012,Pm013,Pm014,Pm015,Pm016,Pm017,Pm018,Pm019,Pm020,Pm021,Pm022,\\\r\n    Pm023,Pm024,Pm025,Pm026,Pm027,Pm028,Pm029,Pm030,Pm031,Pm032,Pm033,\\\r\n    Pm034,Pm035,Pm036,Pm037,Pm038,Pm039,Pm040,Pm041,Pm042,Pm043,Pm044,\\\r\n    Pm045,Pm046,Pm047,Pm048,Pm049,Pm050,Pm051,Pm052,Pm053,Pm054,Pm055,\\\r\n    Pm056,Pm057,Pm058,Pm059,Pm060,Pm061,Pm062,Pm063,Pm064,Pm065,Pm066,\\\r\n    Pm067,Pm068,Pm069,Pm070,Pm071,Pm072,Pm073,Pm074,Pm075,Pm076,Pm077,\\\r\n    Pm078,Pm079,Pm080,Pm081,Pm082,Pm083,Pm084,Pm085,Pm086,Pm087,Pm088,\\\r\n    Pm089,Pm090,Pm091,Pm092,Pm093,Pm094,Pm095,Pm096,Pm097,Pm098,Pm099,\\\r\n    Pm100,Pm101,Pm102,Pm103,Pm104,Pm105,Pm106,Pm107,Pm108,Pm109,Pm110,\\\r\n    Pm111,Pm112,Pm113,Pm114,Pm115,Pm116,Pm117,Pm118,Pm119,Pm120,Pm121,\\\r\n    Pm122,Pm123,Pm124,Pm125,Pm126,Pm127,Pm128,Pm129,Pm130,Pm131,Pm132,\\\r\n    Pm133,Pm134,Pm135,Pm136,Pm137,Pm138,Pm139,Pm140,Pm141,Pm142,Pm143,\\\r\n    Pm144,Pm145,Pm146,Pm147,Pm148,Pm149,Pm150,Pm151,Pm152,Pm153,Pm154,\\\r\n    Pm155\")\r\n\r\n#define MISRAC_ENABLE \\\r\n    _Pragma(          \\\r\n        \"diag_default=                         \\\r\n    Pm001,Pm002,Pm003,Pm004,Pm005,Pm006,Pm007,Pm008,Pm009,Pm010,Pm011,\\\r\n    Pm012,Pm013,Pm014,Pm015,Pm016,Pm017,Pm018,Pm019,Pm020,Pm021,Pm022,\\\r\n    Pm023,Pm024,Pm025,Pm026,Pm027,Pm028,Pm029,Pm030,Pm031,Pm032,Pm033,\\\r\n    Pm034,Pm035,Pm036,Pm037,Pm038,Pm039,Pm040,Pm041,Pm042,Pm043,Pm044,\\\r\n    Pm045,Pm046,Pm047,Pm048,Pm049,Pm050,Pm051,Pm052,Pm053,Pm054,Pm055,\\\r\n    Pm056,Pm057,Pm058,Pm059,Pm060,Pm061,Pm062,Pm063,Pm064,Pm065,Pm066,\\\r\n    Pm067,Pm068,Pm069,Pm070,Pm071,Pm072,Pm073,Pm074,Pm075,Pm076,Pm077,\\\r\n    Pm078,Pm079,Pm080,Pm081,Pm082,Pm083,Pm084,Pm085,Pm086,Pm087,Pm088,\\\r\n    Pm089,Pm090,Pm091,Pm092,Pm093,Pm094,Pm095,Pm096,Pm097,Pm098,Pm099,\\\r\n    Pm100,Pm101,Pm102,Pm103,Pm104,Pm105,Pm106,Pm107,Pm108,Pm109,Pm110,\\\r\n    Pm111,Pm112,Pm113,Pm114,Pm115,Pm116,Pm117,Pm118,Pm119,Pm120,Pm121,\\\r\n    Pm122,Pm123,Pm124,Pm125,Pm126,Pm127,Pm128,Pm129,Pm130,Pm131,Pm132,\\\r\n    Pm133,Pm134,Pm135,Pm136,Pm137,Pm138,Pm139,Pm140,Pm141,Pm142,Pm143,\\\r\n    Pm144,Pm145,Pm146,Pm147,Pm148,Pm149,Pm150,Pm151,Pm152,Pm153,Pm154,\\\r\n    Pm155\")\r\n#else\r\n/* Empty MISRA C macros for other toolchains. */\r\n#define MISRAC_DISABLE\r\n#define MISRAC_ENABLE\r\n#endif\r\n\r\nMISRAC_DISABLE\r\n#include \"FreeRTOS.h\"\r\n#include \"semphr.h\"\r\n#include \"event_groups.h\"\r\nMISRAC_ENABLE\r\n\r\n/*!\r\n * @addtogroup os_abstraction_free_rtos\r\n * @{\r\n */\r\n\r\n/*******************************************************************************\r\n * Declarations\r\n ******************************************************************************/\r\n/*! @brief Type for a task handler, returned by the OSA_TaskCreate function. */\r\ntypedef TaskHandle_t task_handler_t;\r\n\r\n/*! @brief Type for a task stack.*/\r\ntypedef portSTACK_TYPE task_stack_t;\r\n\r\n/*! @brief Type for task parameter */\r\ntypedef void *task_param_t;\r\n\r\n/*! @brief Type for an event flags object.*/\r\ntypedef EventBits_t event_flags_t;\r\n\r\n/*! @brief Constant to pass as timeout value in order to wait indefinitely. */\r\n#define OSA_WAIT_FOREVER 0xFFFFFFFFU\r\n\r\n/*! @brief OSA's time range in millisecond, OSA time wraps if exceeds this value. */\r\n#define FSL_OSA_TIME_RANGE 0xFFFFFFFFU\r\n\r\n/*! @brief The default interrupt handler installed in vector table. */\r\n#define OSA_DEFAULT_INT_HANDLER ((osa_int_handler_t)(&DefaultISR))\r\n\r\nextern void DefaultISR(void);\r\n\r\n/*!\r\n * @name Thread management\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief To provide unified task piority for upper layer, OSA layer makes conversion.\r\n */\r\n#define PRIORITY_OSA_TO_RTOS(osa_prio) \\\r\n    (((UBaseType_t)configMAX_PRIORITIES - 1U) * (OSA_TASK_PRIORITY_MIN - osa_prio) / OSA_TASK_PRIORITY_MIN)\r\n#define PRIORITY_RTOS_TO_OSA(rtos_prio)                                               \\\r\n    (OSA_TASK_PRIORITY_MIN * (((UBaseType_t)configMAX_PRIORITIES - 1U) - rtos_prio) / \\\r\n     ((UBaseType_t)configMAX_PRIORITIES - 1U))\r\n\r\n/*! @} */\r\n\r\n/*!\r\n * @name Message queues\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief This macro statically reserves the memory required for the queue.\r\n *\r\n * @param name Identifier for the memory region.\r\n * @param number Number of elements in the queue.\r\n * @param size Size of every elements in words.\r\n */\r\n#define MSG_QUEUE_DECLARE(name, number, size) msg_queue_t *name = NULL\r\n\r\n/*! @} */\r\n\r\n/*! @}*/\r\n/*! @}*/\r\n/*! @}*/\r\n\r\n#endif /* __FSL_OS_ABSTRACTION_FREERTOS_H__ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/serial_manager/fsl_component_serial_manager.c",
    "content": "/*\r\n * Copyright 2018-2024 NXP\r\n * All rights reserved.\r\n *\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include <string.h>\r\n#include \"fsl_component_serial_manager.h\"\r\n#include \"fsl_component_serial_port_internal.h\"\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n\r\n#include \"fsl_component_generic_list.h\"\r\n\r\n/*\r\n * The OSA_USED macro can only be defined when the OSA component is used.\r\n * If the source code of the OSA component does not exist, the OSA_USED cannot be defined.\r\n * OR, If OSA component is not added into project event the OSA source code exists, the OSA_USED\r\n * also cannot be defined.\r\n * The source code path of the OSA component is <MCUXpresso_SDK>/components/osa.\r\n *\r\n */\r\n#if defined(OSA_USED)\r\n#include \"fsl_os_abstraction.h\"\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n#include \"fsl_component_common_task.h\"\r\n#else\r\n\r\n#endif\r\n\r\n#endif\r\n\r\n#endif\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n#ifndef NDEBUG\r\n#if (defined(DEBUG_CONSOLE_ASSERT_DISABLE) && (DEBUG_CONSOLE_ASSERT_DISABLE > 0U))\r\n#undef assert\r\n#define assert(n)\r\n#else\r\n/* MISRA C-2012 Rule 17.2 */\r\n#undef assert\r\n#define assert(n) \\\r\n    while (!(n))  \\\r\n    {             \\\r\n        ;         \\\r\n    }\r\n#endif\r\n#endif\r\n\r\n/* Weak function. */\r\n#if defined(__GNUC__)\r\n#define __WEAK_FUNC __attribute__((weak))\r\n#elif defined(__ICCARM__)\r\n#define __WEAK_FUNC __weak\r\n#elif defined(__CC_ARM) || defined(__ARMCC_VERSION)\r\n#define __WEAK_FUNC __attribute__((weak))\r\n#elif defined(__DSC__) || defined(__CW__)\r\n#define __WEAK_FUNC __attribute__((weak))\r\n#endif\r\n\r\n#define SERIAL_EVENT_DATA_RECEIVED   (0U)\r\n#define SERIAL_EVENT_DATA_SENT       (1U)\r\n#define SERIAL_EVENT_DATA_START_SEND (2U)\r\n#define SERIAL_EVENT_DATA_RX_NOTIFY  (3U)\r\n#define SERIAL_EVENT_DATA_NUMBER     (4U)\r\n\r\n#define SERIAL_MANAGER_WRITE_TAG 0xAABB5754U\r\n#define SERIAL_MANAGER_READ_TAG  0xBBAA5244U\r\n\r\n#ifndef RINGBUFFER_WATERMARK_THRESHOLD\r\n#define RINGBUFFER_WATERMARK_THRESHOLD 95U / 100U\r\n#endif\r\n\r\n#ifndef gSerialManagerLpConstraint_c\r\n#define gSerialManagerLpConstraint_c 0\r\n#endif\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\ntypedef enum _serial_manager_transmission_mode\r\n{\r\n    kSerialManager_TransmissionBlocking    = 0x0U, /*!< Blocking transmission*/\r\n    kSerialManager_TransmissionNonBlocking = 0x1U, /*!< None blocking transmission*/\r\n} serial_manager_transmission_mode_t;\r\n\r\n/* TX transfer structure */\r\ntypedef struct _serial_manager_transfer\r\n{\r\n    uint8_t *buffer;\r\n    volatile uint32_t length;\r\n    volatile uint32_t soFar;\r\n    serial_manager_transmission_mode_t mode;\r\n    serial_manager_status_t status;\r\n} serial_manager_transfer_t;\r\n#endif\r\n\r\n/* write handle structure */\r\ntypedef struct _serial_manager_send_handle\r\n{\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    list_element_t link; /*!< list element of the link */\r\n    serial_manager_transfer_t transfer;\r\n#endif\r\n    struct _serial_manager_handle *serialManagerHandle;\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    serial_manager_callback_t callback;\r\n    void *callbackParam;\r\n    uint32_t tag;\r\n#endif\r\n} serial_manager_write_handle_t;\r\ntypedef struct _serial_manager_send_block_handle\r\n{\r\n    struct _serial_manager_handle *serialManagerHandle;\r\n\r\n} serial_manager_write_block_handle_t;\r\n\r\ntypedef serial_manager_write_handle_t serial_manager_read_handle_t;\r\ntypedef serial_manager_write_block_handle_t serial_manager_read_block_handle_t;\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n/* receive state structure */\r\ntypedef struct _serial_manager_read_ring_buffer\r\n{\r\n    uint8_t *ringBuffer;\r\n    uint32_t ringBufferSize;\r\n    volatile uint32_t ringHead;\r\n    volatile uint32_t ringTail;\r\n} serial_manager_read_ring_buffer_t;\r\n\r\n#if defined(__CC_ARM)\r\n#pragma anon_unions\r\n#endif\r\ntypedef struct _serial_manager_block_handle\r\n{\r\n    serial_manager_type_t handleType;\r\n    serial_port_type_t type;\r\n    serial_manager_read_handle_t *volatile openedReadHandleHead;\r\n    volatile uint32_t openedWriteHandleCount;\r\n    union\r\n    {\r\n        uint32_t lowLevelhandleBuffer[1];\r\n#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))\r\n        uint8_t uartHandleBuffer[SERIAL_PORT_UART_BLOCK_HANDLE_SIZE];\r\n#endif\r\n    };\r\n\r\n} serial_manager_block_handle_t;\r\n#endif\r\n\r\n/* The serial manager handle structure */\r\ntypedef struct _serial_manager_handle\r\n{\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    serial_manager_type_t handleType;\r\n#endif\r\n    serial_port_type_t serialPortType;\r\n    serial_manager_read_handle_t *volatile openedReadHandleHead;\r\n    volatile uint32_t openedWriteHandleCount;\r\n    union\r\n    {\r\n        uint32_t lowLevelhandleBuffer[1];\r\n#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))\r\n        uint8_t uartHandleBuffer[SERIAL_PORT_UART_HANDLE_SIZE];\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))\r\n        uint8_t uartDmaHandleBuffer[SERIAL_PORT_UART_DMA_HANDLE_SIZE];\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))\r\n        uint8_t usbcdcHandleBuffer[SERIAL_PORT_USB_CDC_HANDLE_SIZE];\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))\r\n        uint8_t swoHandleBuffer[SERIAL_PORT_SWO_HANDLE_SIZE];\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))\r\n        uint8_t usbcdcVirtualHandleBuffer[SERIAL_PORT_VIRTUAL_HANDLE_SIZE];\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))\r\n        uint8_t rpmsgHandleBuffer[SERIAL_PORT_RPMSG_HANDLE_SIZE];\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))\r\n        uint8_t spiMasterHandleBuffer[SERIAL_PORT_SPI_MASTER_HANDLE_SIZE];\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))\r\n        uint8_t spiSlaveHandleBuffer[SERIAL_PORT_SPI_SLAVE_HANDLE_SIZE];\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))\r\n        uint8_t bleWuHandleBuffer[SERIAL_PORT_BLE_WU_HANDLE_SIZE];\r\n#endif\r\n    };\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    serial_manager_read_ring_buffer_t ringBuffer;\r\n#endif\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n\r\n#if defined(OSA_USED)\r\n\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n    common_task_message_t commontaskMsg;\r\n#else\r\n    OSA_SEMAPHORE_HANDLE_DEFINE(serSemaphore); /*!< Semaphore instance */\r\n    OSA_TASK_HANDLE_DEFINE(taskId);            /*!< Task handle */\r\n#endif\r\n    uint8_t serialManagerState[SERIAL_EVENT_DATA_NUMBER]; /*!< Used to indicate the serial mnager state */\r\n\r\n#endif\r\n\r\n#endif\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    list_label_t runningWriteHandleHead;   /*!< The queue of running write handle */\r\n    list_label_t completedWriteHandleHead; /*!< The queue of completed write handle */\r\n#endif\r\n\r\n} serial_manager_handle_t;\r\n\r\n/*******************************************************************************\r\n * Prototypes\r\n ******************************************************************************/\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\nstatic void SerialManager_Task(void *param);\r\n#endif\r\n\r\n/*******************************************************************************\r\n * Variables\r\n ******************************************************************************/\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n\r\n#if defined(OSA_USED)\r\n\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n\r\n#else\r\n                                               /*\r\n                                                * \\brief Defines the serial manager task's stack\r\n                                                */\r\nstatic OSA_TASK_DEFINE(SerialManager_Task, SERIAL_MANAGER_TASK_PRIORITY, 1, SERIAL_MANAGER_TASK_STACK_SIZE, false);\r\n#endif\r\n\r\n#endif\r\n\r\n#endif\r\nstatic const serial_manager_lowpower_critical_CBs_t *s_pfserialLowpowerCriticalCallbacks = NULL;\r\n/*******************************************************************************\r\n * Code\r\n ******************************************************************************/\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\nstatic void SerialManager_AddTail(list_label_t *queue, serial_manager_write_handle_t *node)\r\n{\r\n    (void)LIST_AddTail(queue, &node->link);\r\n}\r\n\r\nstatic void SerialManager_RemoveHead(list_label_t *queue)\r\n{\r\n    (void)LIST_RemoveHead(queue);\r\n}\r\n\r\nstatic int32_t SerialManager_SetLpConstraint(int32_t power_mode)\r\n{\r\n    int32_t status = -1;\r\n    if ((s_pfserialLowpowerCriticalCallbacks != NULL) &&\r\n        (s_pfserialLowpowerCriticalCallbacks->serialEnterLowpowerCriticalFunc != NULL))\r\n    {\r\n        status = s_pfserialLowpowerCriticalCallbacks->serialEnterLowpowerCriticalFunc(power_mode);\r\n    }\r\n    return status;\r\n}\r\nstatic int32_t SerialManager_ReleaseLpConstraint(int32_t power_mode)\r\n{\r\n    int32_t status = -1;\r\n    if ((s_pfserialLowpowerCriticalCallbacks != NULL) &&\r\n        (s_pfserialLowpowerCriticalCallbacks->serialExitLowpowerCriticalFunc != NULL))\r\n    {\r\n        status = s_pfserialLowpowerCriticalCallbacks->serialExitLowpowerCriticalFunc(power_mode);\r\n    }\r\n    return status;\r\n}\r\n#endif\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n\r\nstatic serial_manager_status_t SerialManager_StartWriting(serial_manager_handle_t *serHandle)\r\n{\r\n    serial_manager_status_t status = kStatus_SerialManager_Error;\r\n    serial_manager_write_handle_t *writeHandle =\r\n        (serial_manager_write_handle_t *)(void *)LIST_GetHead(&serHandle->runningWriteHandleHead);\r\n\r\n    if (writeHandle != NULL)\r\n    {\r\n        (void)SerialManager_SetLpConstraint(gSerialManagerLpConstraint_c);\r\n        switch (serHandle->serialPortType)\r\n        {\r\n#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))\r\n            case kSerialPort_Uart:\r\n                status = Serial_UartWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                          writeHandle->transfer.buffer, writeHandle->transfer.length);\r\n                break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))\r\n            case kSerialPort_UartDma:\r\n                status = Serial_UartDmaWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                             writeHandle->transfer.buffer, writeHandle->transfer.length);\r\n                break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))\r\n            case kSerialPort_UsbCdc:\r\n                status = Serial_UsbCdcWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                            writeHandle->transfer.buffer, writeHandle->transfer.length);\r\n                break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))\r\n            case kSerialPort_Swo:\r\n                status = Serial_SwoWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                         writeHandle->transfer.buffer, writeHandle->transfer.length);\r\n                break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))\r\n            case kSerialPort_Virtual:\r\n                status = Serial_PortVirtualWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                                 writeHandle->transfer.buffer, writeHandle->transfer.length);\r\n                break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))\r\n            case kSerialPort_Rpmsg:\r\n                status = Serial_RpmsgWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                           writeHandle->transfer.buffer, writeHandle->transfer.length);\r\n                break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))\r\n            case kSerialPort_SpiMaster:\r\n                status = Serial_SpiMasterWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                               writeHandle->transfer.buffer, writeHandle->transfer.length);\r\n                break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))\r\n            case kSerialPort_SpiSlave:\r\n                status = Serial_SpiSlaveWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                              writeHandle->transfer.buffer, writeHandle->transfer.length);\r\n                break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))\r\n            case kSerialPort_BleWu:\r\n                status = Serial_PortBleWuWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                               writeHandle->transfer.buffer, writeHandle->transfer.length);\r\n                break;\r\n#endif\r\n\r\n            default:\r\n                status = kStatus_SerialManager_Error;\r\n                break;\r\n        }\r\n        if (kStatus_SerialManager_Success != status)\r\n        {\r\n            (void)SerialManager_ReleaseLpConstraint(gSerialManagerLpConstraint_c);\r\n        }\r\n    }\r\n    return status;\r\n}\r\n\r\nstatic serial_manager_status_t SerialManager_StartReading(serial_manager_handle_t *serHandle,\r\n                                                          serial_manager_read_handle_t *readHandle,\r\n                                                          uint8_t *buffer,\r\n                                                          uint32_t length)\r\n{\r\n    serial_manager_status_t status = kStatus_SerialManager_Error;\r\n\r\n    if (NULL != readHandle)\r\n    {\r\n#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))\r\n        if (kSerialPort_Uart == serHandle->serialPortType) /* Serial port UART */\r\n        {\r\n            status = Serial_UartRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n        }\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))\r\n        if (serHandle->serialPortType == kSerialPort_UsbCdc)\r\n        {\r\n            status = Serial_UsbCdcRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n        }\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))\r\n        if (serHandle->serialPortType == kSerialPort_Virtual)\r\n        {\r\n            status = Serial_PortVirtualRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n        }\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))\r\n        if (serHandle->serialPortType == kSerialPort_SpiMaster)\r\n        {\r\n            status = Serial_SpiMasterRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n        }\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))\r\n        if (serHandle->serialPortType == kSerialPort_SpiSlave)\r\n        {\r\n            status = Serial_SpiSlaveRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n        }\r\n#endif\r\n\r\n#if 0\r\n#if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))\r\n        if (serHandle->serialPortType == kSerialPort_Rpmsg)\r\n        {\r\n            status = Serial_RpmsgRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n        }\r\n#endif\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))\r\n        if (serHandle->serialPortType == kSerialPort_BleWu)\r\n        {\r\n            status = Serial_PortBleWuRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n        }\r\n#endif\r\n    }\r\n    return status;\r\n}\r\n\r\n#else /*SERIAL_MANAGER_NON_BLOCKING_MODE > 0U*/\r\n\r\nstatic serial_manager_status_t SerialManager_StartWriting(serial_manager_handle_t *serHandle,\r\n                                                          serial_manager_write_handle_t *writeHandle,\r\n                                                          uint8_t *buffer,\r\n                                                          uint32_t length)\r\n{\r\n    serial_manager_status_t status = kStatus_SerialManager_Error;\r\n\r\n#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))\r\n    if (kSerialPort_Uart == serHandle->serialPortType) /* Serial port UART */\r\n    {\r\n        status = Serial_UartWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n    }\r\n    else\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))\r\n        if (kSerialPort_UsbCdc == serHandle->serialPortType) /* Serial port UsbCdc */\r\n    {\r\n        status = Serial_UsbCdcWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n    }\r\n    else\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))\r\n        if (kSerialPort_Swo == serHandle->serialPortType) /* Serial port SWO */\r\n    {\r\n        status = Serial_SwoWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n    }\r\n    else\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))\r\n        if (kSerialPort_Virtual == serHandle->serialPortType) /* Serial port UsbCdcVirtual */\r\n    {\r\n        status = Serial_PortVirtualWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n    }\r\n    else\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))\r\n        if (kSerialPort_Rpmsg == serHandle->serialPortType) /* Serial port Rpmsg */\r\n    {\r\n        status = Serial_RpmsgWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n    }\r\n    else\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))\r\n        if (kSerialPort_SpiMaster == serHandle->serialPortType) /* Serial port Spi Master */\r\n    {\r\n        status = Serial_SpiMasterWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n    }\r\n    else\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))\r\n        if (kSerialPort_BleWu == serHandle->serialPortType) /* Serial port BLE WU */\r\n    {\r\n        status = Serial_PortBleWuWrite(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n    }\r\n    else\r\n#endif\r\n    {\r\n        /*MISRA rule*/\r\n    }\r\n    return status;\r\n}\r\n\r\nstatic serial_manager_status_t SerialManager_StartReading(serial_manager_handle_t *serHandle,\r\n                                                          serial_manager_read_handle_t *readHandle,\r\n                                                          uint8_t *buffer,\r\n                                                          uint32_t length)\r\n{\r\n    serial_manager_status_t status = kStatus_SerialManager_Error;\r\n\r\n#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))\r\n    if (kSerialPort_Uart == serHandle->serialPortType) /* Serial port UART */\r\n    {\r\n        status = Serial_UartRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n    }\r\n    else\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))\r\n        if (kSerialPort_UsbCdc == serHandle->serialPortType) /* Serial port UsbCdc */\r\n    {\r\n        status = Serial_UsbCdcRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n    }\r\n    else\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))\r\n        if (kSerialPort_Swo == serHandle->serialPortType) /* Serial port SWO */\r\n    {\r\n        status = Serial_SwoRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n    }\r\n    else\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))\r\n        if (kSerialPort_Virtual == serHandle->serialPortType) /* Serial port UsbCdcVirtual */\r\n    {\r\n        status = Serial_PortVirtualRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n    }\r\n    else\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))\r\n        if (kSerialPort_Rpmsg == serHandle->serialPortType) /* Serial port UsbCdcVirtual */\r\n    {\r\n        status = Serial_RpmsgRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n    }\r\n    else\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))\r\n        if (kSerialPort_SpiMaster == serHandle->serialPortType) /* Serial port Spi Master */\r\n    {\r\n        status = Serial_SpiMasterRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n    }\r\n    else\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))\r\n        if (kSerialPort_BleWu == serHandle->serialPortType) /* Serial port BLE WU */\r\n    {\r\n        status = Serial_PortBleWuRead(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), buffer, length);\r\n    }\r\n    else\r\n#endif\r\n    {\r\n        /*MISRA rule*/\r\n    }\r\n    return status;\r\n}\r\n#endif /*SERIAL_MANAGER_NON_BLOCKING_MODE > 0U*/\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\nstatic void SerialManager_IsrFunction(serial_manager_handle_t *serHandle)\r\n{\r\n    uint32_t regPrimask = DisableGlobalIRQ();\r\n    switch (serHandle->serialPortType)\r\n    {\r\n#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))\r\n        case kSerialPort_Uart:\r\n            Serial_UartIsrFunction(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))\r\n        case kSerialPort_UartDma:\r\n            Serial_UartIsrFunction(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))\r\n        case kSerialPort_UsbCdc:\r\n            Serial_UsbCdcIsrFunction(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))\r\n        case kSerialPort_Swo:\r\n            Serial_SwoIsrFunction(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))\r\n        case kSerialPort_Virtual:\r\n            Serial_PortVirtualIsrFunction(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))\r\n        case kSerialPort_BleWu:\r\n            Serial_PortBleWuIsrFunction(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));\r\n            break;\r\n#endif\r\n        default:\r\n            /*MISRA rule 16.4*/\r\n            break;\r\n    }\r\n    EnableGlobalIRQ(regPrimask);\r\n}\r\n\r\nstatic void SerialManager_Task(void *param)\r\n{\r\n    serial_manager_handle_t *serHandle = (serial_manager_handle_t *)param;\r\n    serial_manager_write_handle_t *serialWriteHandle;\r\n    serial_manager_read_handle_t *serialReadHandle;\r\n    uint32_t primask;\r\n    serial_manager_callback_message_t serialMsg;\r\n#if (defined(SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY) && (SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY > 0U))\r\n    uint32_t ringBufferLength;\r\n#endif /* SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY */\r\n\r\n    if (NULL != serHandle)\r\n    {\r\n#if defined(OSA_USED)\r\n\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n#else\r\n\r\n        do\r\n        {\r\n            if (KOSA_StatusSuccess ==\r\n                OSA_SemaphoreWait((osa_semaphore_handle_t)serHandle->serSemaphore, osaWaitForever_c))\r\n            {\r\n#endif\r\n#endif\r\n#if defined(OSA_USED)\r\n\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n#else\r\n                primask     = DisableGlobalIRQ();\r\n                uint8_t *ev = serHandle->serialManagerState;\r\n                EnableGlobalIRQ(primask);\r\n                if (0U != (ev[SERIAL_EVENT_DATA_START_SEND]))\r\n#endif\r\n#endif\r\n        {\r\n#if defined(OSA_USED)\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n#else\r\n                    (void)SerialManager_StartWriting(serHandle);\r\n                    primask = DisableGlobalIRQ();\r\n                    serHandle->serialManagerState[SERIAL_EVENT_DATA_START_SEND]--;\r\n                    EnableGlobalIRQ(primask);\r\n#endif\r\n#endif\r\n        }\r\n#if defined(OSA_USED)\r\n\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n#else\r\n                if (0U != (ev[SERIAL_EVENT_DATA_SENT]))\r\n#endif\r\n\r\n#endif\r\n        {\r\n            serialWriteHandle =\r\n                (serial_manager_write_handle_t *)(void *)LIST_GetHead(&serHandle->completedWriteHandleHead);\r\n            while (NULL != serialWriteHandle)\r\n            {\r\n                SerialManager_RemoveHead(&serHandle->completedWriteHandleHead);\r\n                serialMsg.buffer                   = serialWriteHandle->transfer.buffer;\r\n                serialMsg.length                   = serialWriteHandle->transfer.soFar;\r\n                serialWriteHandle->transfer.buffer = NULL;\r\n                if (NULL != serialWriteHandle->callback)\r\n                {\r\n                    serialWriteHandle->callback(serialWriteHandle->callbackParam, &serialMsg,\r\n                                                serialWriteHandle->transfer.status);\r\n                }\r\n                serialWriteHandle =\r\n                    (serial_manager_write_handle_t *)(void *)LIST_GetHead(&serHandle->completedWriteHandleHead);\r\n                (void)SerialManager_ReleaseLpConstraint(gSerialManagerLpConstraint_c);\r\n            }\r\n#if defined(OSA_USED)\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n#else\r\n                    primask = DisableGlobalIRQ();\r\n                    serHandle->serialManagerState[SERIAL_EVENT_DATA_SENT]--;\r\n                    EnableGlobalIRQ(primask);\r\n#endif\r\n#endif\r\n        }\r\n#if defined(OSA_USED)\r\n\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n#else\r\n                if (0U != (ev[SERIAL_EVENT_DATA_RECEIVED]))\r\n#endif\r\n\r\n#endif\r\n        {\r\n            primask          = DisableGlobalIRQ();\r\n            serialReadHandle = serHandle->openedReadHandleHead;\r\n            EnableGlobalIRQ(primask);\r\n\r\n            if (NULL != serialReadHandle)\r\n            {\r\n                if (NULL != serialReadHandle->transfer.buffer)\r\n                {\r\n                    if (serialReadHandle->transfer.soFar >= serialReadHandle->transfer.length)\r\n                    {\r\n                        serialMsg.buffer                  = serialReadHandle->transfer.buffer;\r\n                        serialMsg.length                  = serialReadHandle->transfer.soFar;\r\n                        serialReadHandle->transfer.buffer = NULL;\r\n                        if (NULL != serialReadHandle->callback)\r\n                        {\r\n                            serialReadHandle->callback(serialReadHandle->callbackParam, &serialMsg,\r\n                                                       serialReadHandle->transfer.status);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n#if defined(OSA_USED)\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n#else\r\n                    primask = DisableGlobalIRQ();\r\n                    serHandle->serialManagerState[SERIAL_EVENT_DATA_RECEIVED]--;\r\n                    EnableGlobalIRQ(primask);\r\n#endif\r\n#endif\r\n        }\r\n\r\n#if (defined(SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY) && (SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY > 0U))\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n#else\r\n                if (0U != (ev[SERIAL_EVENT_DATA_RX_NOTIFY]))\r\n#endif\r\n        {\r\n            primask                                                 = DisableGlobalIRQ();\r\n            serHandle->serialManagerState[SERIAL_EVENT_DATA_RX_NOTIFY] = 0;\r\n            ringBufferLength =\r\n                serHandle->ringBuffer.ringHead + serHandle->ringBuffer.ringBufferSize - serHandle->ringBuffer.ringTail;\r\n            ringBufferLength = ringBufferLength % serHandle->ringBuffer.ringBufferSize;\r\n            EnableGlobalIRQ(primask);\r\n            /* Notify there are data in ringbuffer */\r\n            if (0U != ringBufferLength)\r\n            {\r\n                serialMsg.buffer = NULL;\r\n                serialMsg.length = ringBufferLength;\r\n                if ((NULL != serHandle->openedReadHandleHead) && (NULL != serHandle->openedReadHandleHead->callback))\r\n                {\r\n                    serHandle->openedReadHandleHead->callback(serHandle->openedReadHandleHead->callbackParam, &serialMsg,\r\n                                                           kStatus_SerialManager_Notify);\r\n                }\r\n            }\r\n        }\r\n#endif /* SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY */\r\n\r\n#if defined(OSA_USED)\r\n\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n#else\r\n            }\r\n        } while (0U != gUseRtos_c);\r\n#endif\r\n\r\n#endif\r\n    }\r\n}\r\n#endif\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\nstatic void SerialManager_TxCallback(void *callbackParam,\r\n                                     serial_manager_callback_message_t *message,\r\n                                     serial_manager_status_t status)\r\n{\r\n    serial_manager_handle_t *serHandle;\r\n    serial_manager_write_handle_t *writeHandle;\r\n#if (defined(OSA_USED))\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n    /* Need to support common_task. */\r\n#else /* SERIAL_MANAGER_USE_COMMON_TASK */\r\n    uint32_t primask;\r\n#endif\r\n#endif\r\n    assert(NULL != callbackParam);\r\n    assert(NULL != message);\r\n\r\n    serHandle = (serial_manager_handle_t *)callbackParam;\r\n\r\n    writeHandle = (serial_manager_write_handle_t *)(void *)LIST_GetHead(&serHandle->runningWriteHandleHead);\r\n\r\n    if (NULL != writeHandle)\r\n    {\r\n        SerialManager_RemoveHead(&serHandle->runningWriteHandleHead);\r\n\r\n#if (defined(OSA_USED) && defined(SERIAL_MANAGER_TASK_HANDLE_TX) && (SERIAL_MANAGER_TASK_HANDLE_TX == 1))\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n        /* Need to support common_task. */\r\n#else  /* SERIAL_MANAGER_USE_COMMON_TASK */\r\n        primask = DisableGlobalIRQ();\r\n        serHandle->serialManagerState[SERIAL_EVENT_DATA_START_SEND]++;\r\n        EnableGlobalIRQ(primask);\r\n        (void)OSA_SemaphorePost((osa_semaphore_handle_t)serHandle->serSemaphore);\r\n\r\n#endif /* SERIAL_MANAGER_USE_COMMON_TASK */\r\n#else  /* OSA_USED && SERIAL_MANAGER_TASK_HANDLE_TX */\r\n       (void)SerialManager_StartWriting(serHandle);\r\n#endif /* OSA_USED && SERIAL_MANAGER_TASK_HANDLE_TX */\r\n\r\n        writeHandle->transfer.soFar  = message->length;\r\n        writeHandle->transfer.status = status;\r\n        if (kSerialManager_TransmissionNonBlocking == writeHandle->transfer.mode)\r\n        {\r\n            SerialManager_AddTail(&serHandle->completedWriteHandleHead, writeHandle);\r\n#if defined(OSA_USED)\r\n\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n            serHandle->commontaskMsg.callback      = SerialManager_Task;\r\n            serHandle->commontaskMsg.callbackParam = serHandle;\r\n            COMMON_TASK_post_message(&serHandle->commontaskMsg);\r\n#else\r\n            primask = DisableGlobalIRQ();\r\n            serHandle->serialManagerState[SERIAL_EVENT_DATA_SENT]++;\r\n            EnableGlobalIRQ(primask);\r\n            (void)OSA_SemaphorePost((osa_semaphore_handle_t)serHandle->serSemaphore);\r\n#endif\r\n\r\n#else\r\n            SerialManager_Task(serHandle);\r\n#endif\r\n        }\r\n        else\r\n        {\r\n            writeHandle->transfer.buffer = NULL;\r\n            (void)SerialManager_ReleaseLpConstraint(gSerialManagerLpConstraint_c);\r\n        }\r\n    }\r\n}\r\n\r\nvoid SerialManager_RxCallback(void *callbackParam,\r\n                              serial_manager_callback_message_t *message,\r\n                              serial_manager_status_t status);\r\nvoid SerialManager_RxCallback(void *callbackParam,\r\n                              serial_manager_callback_message_t *message,\r\n                              serial_manager_status_t status)\r\n{\r\n    serial_manager_handle_t *serHandle;\r\n#if (!((defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))) && \\\r\n     !((defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))))\r\n    uint32_t ringBufferLength = 0;\r\n    uint32_t primask;\r\n#endif\r\n    assert(NULL != callbackParam);\r\n    assert(NULL != message);\r\n\r\n    serHandle = (serial_manager_handle_t *)callbackParam;\r\n#if ((defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U)) || \\\r\n     (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U)))\r\n    serHandle->openedReadHandleHead->transfer.status = kStatus_SerialManager_Success;\r\n    serHandle->openedReadHandleHead->transfer.soFar  = message->length;\r\n    serHandle->openedReadHandleHead->transfer.length = message->length;\r\n    serHandle->openedReadHandleHead->transfer.buffer = message->buffer;\r\n#if defined(OSA_USED)\r\n\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n    serHandle->commontaskMsg.callback      = SerialManager_Task;\r\n    serHandle->commontaskMsg.callbackParam = serHandle;\r\n    COMMON_TASK_post_message(&serHandle->commontaskMsg);\r\n#else\r\n    primask = DisableGlobalIRQ();\r\n    serHandle->serialManagerState[SERIAL_EVENT_DATA_RECEIVED]++;\r\n    EnableGlobalIRQ(primask);\r\n    (void)OSA_SemaphorePost((osa_semaphore_handle_t)serHandle->serSemaphore);\r\n#endif\r\n\r\n#else\r\n    SerialManager_Task(serHandle);\r\n#endif\r\n#else\r\n    status = kStatus_SerialManager_Notify;\r\n\r\n    primask = DisableGlobalIRQ();\r\n\r\n    /* If wrap around is expected copy byte one after the other. Note that this could also be done with 2 memcopy for\r\n     * better efficiency. */\r\n    if (serHandle->ringBuffer.ringHead + message->length >= serHandle->ringBuffer.ringBufferSize)\r\n    {\r\n        for (uint32_t i = 0; i < message->length; i++)\r\n        {\r\n            serHandle->ringBuffer.ringBuffer[serHandle->ringBuffer.ringHead++] = message->buffer[i];\r\n\r\n            if (serHandle->ringBuffer.ringHead >= serHandle->ringBuffer.ringBufferSize)\r\n            {\r\n                serHandle->ringBuffer.ringHead = 0U;\r\n            }\r\n            if (serHandle->ringBuffer.ringHead == serHandle->ringBuffer.ringTail)\r\n            {\r\n                status = kStatus_SerialManager_RingBufferOverflow;\r\n                serHandle->ringBuffer.ringTail++;\r\n                if (serHandle->ringBuffer.ringTail >= serHandle->ringBuffer.ringBufferSize)\r\n                {\r\n                    serHandle->ringBuffer.ringTail = 0U;\r\n                }\r\n            }\r\n        }\r\n    }\r\n    else /*No wrap is expected so do a memcpy*/\r\n    {\r\n        (void)memcpy(&serHandle->ringBuffer.ringBuffer[serHandle->ringBuffer.ringHead], message->buffer,\r\n                     message->length);\r\n        serHandle->ringBuffer.ringHead += message->length;\r\n    }\r\n\r\n    ringBufferLength =\r\n        serHandle->ringBuffer.ringHead + serHandle->ringBuffer.ringBufferSize - serHandle->ringBuffer.ringTail;\r\n    ringBufferLength = ringBufferLength % serHandle->ringBuffer.ringBufferSize;\r\n\r\n    if ((NULL != serHandle->openedReadHandleHead) && (NULL != serHandle->openedReadHandleHead->transfer.buffer))\r\n    {\r\n        if (serHandle->openedReadHandleHead->transfer.length > serHandle->openedReadHandleHead->transfer.soFar)\r\n        {\r\n            uint32_t remainLength =\r\n                serHandle->openedReadHandleHead->transfer.length - serHandle->openedReadHandleHead->transfer.soFar;\r\n            for (uint32_t i = 0; i < MIN(ringBufferLength, remainLength); i++)\r\n            {\r\n                serHandle->openedReadHandleHead->transfer.buffer[serHandle->openedReadHandleHead->transfer.soFar] =\r\n                    serHandle->ringBuffer.ringBuffer[serHandle->ringBuffer.ringTail];\r\n                serHandle->ringBuffer.ringTail++;\r\n                serHandle->openedReadHandleHead->transfer.soFar++;\r\n                if (serHandle->ringBuffer.ringTail >= serHandle->ringBuffer.ringBufferSize)\r\n                {\r\n                    serHandle->ringBuffer.ringTail = 0U;\r\n                }\r\n            }\r\n            ringBufferLength = ringBufferLength - MIN(ringBufferLength, remainLength);\r\n        }\r\n\r\n        if (serHandle->openedReadHandleHead->transfer.length > serHandle->openedReadHandleHead->transfer.soFar)\r\n        {\r\n        }\r\n        else\r\n        {\r\n            if (kSerialManager_TransmissionBlocking == serHandle->openedReadHandleHead->transfer.mode)\r\n            {\r\n                serHandle->openedReadHandleHead->transfer.buffer = NULL;\r\n            }\r\n            else\r\n            {\r\n                serHandle->openedReadHandleHead->transfer.status = kStatus_SerialManager_Success;\r\n\r\n#if defined(OSA_USED)\r\n\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n                serHandle->commontaskMsg.callback                = SerialManager_Task;\r\n                serHandle->commontaskMsg.callbackParam           = serHandle;\r\n                COMMON_TASK_post_message(&serHandle->commontaskMsg);\r\n#else\r\n                serHandle->serialManagerState[SERIAL_EVENT_DATA_RECEIVED]++;\r\n                (void)OSA_SemaphorePost((osa_semaphore_handle_t)serHandle->serSemaphore);\r\n#endif\r\n\r\n#else\r\n                SerialManager_Task(serHandle);\r\n#endif\r\n            }\r\n        }\r\n    }\r\n#if (defined(SERIAL_MANAGER_RING_BUFFER_FLOWCONTROL) && (SERIAL_MANAGER_RING_BUFFER_FLOWCONTROL > 0U))\r\n    uint32_t ringBufferWaterMark =\r\n        serHandle->ringBuffer.ringHead + serHandle->ringBuffer.ringBufferSize - serHandle->ringBuffer.ringTail;\r\n    ringBufferWaterMark = ringBufferWaterMark % serHandle->ringBuffer.ringBufferSize;\r\n    if (ringBufferWaterMark < (uint32_t)(serHandle->ringBuffer.ringBufferSize * RINGBUFFER_WATERMARK_THRESHOLD))\r\n    {\r\n        (void)SerialManager_StartReading(serHandle, serHandle->openedReadHandleHead, NULL, ringBufferLength);\r\n    }\r\n#else\r\n    (void)SerialManager_StartReading(serHandle, serHandle->openedReadHandleHead, NULL, ringBufferLength);\r\n#endif\r\n    if (0U != ringBufferLength)\r\n    {\r\n#if (defined(SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY) && (SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY > 0U))\r\n        if (serHandle->serialManagerState[SERIAL_EVENT_DATA_RX_NOTIFY] == 0)\r\n        {\r\n            serHandle->serialManagerState[SERIAL_EVENT_DATA_RX_NOTIFY]++;\r\n            (void)OSA_SemaphorePost((osa_semaphore_handle_t)serHandle->serSemaphore);\r\n        }\r\n\r\n        (void)status; /* Fix \"set but never used\" warning. */\r\n#else  /* !SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY */\r\n        message->buffer = NULL;\r\n        message->length = ringBufferLength;\r\n        if ((NULL != serHandle->openedReadHandleHead) && (NULL != serHandle->openedReadHandleHead->callback))\r\n        {\r\n            serHandle->openedReadHandleHead->callback(serHandle->openedReadHandleHead->callbackParam, message, status);\r\n        }\r\n#endif /* SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY */\r\n    }\r\n\r\n#if (!((defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))) && \\\r\n     !((defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))))\r\n    if (kSerialManager_Blocking ==\r\n        serHandle->handleType) /* No need to check for (NULL != serHandle->openedReadHandleHead) condition as it is\r\n                               already done in SerialManager_StartReading() */\r\n#else\r\n    if (NULL != serHandle->openedReadHandleHead)\r\n#endif\r\n    {\r\n        ringBufferLength = serHandle->ringBuffer.ringBufferSize - 1U - ringBufferLength;\r\n        (void)SerialManager_StartReading(serHandle, serHandle->openedReadHandleHead, NULL, ringBufferLength);\r\n    }\r\n    EnableGlobalIRQ(primask);\r\n#endif\r\n}\r\n\r\n/*\r\n * This function is used for perdiodic check if the transfer is complete, and will be called in blocking transfer at\r\n * non-blocking mode. The perdiodic unit is ms and default value is define by\r\n * SERIAL_MANAGER_WRITE_TIME_DELAY_DEFAULT_VALUE/SERIAL_MANAGER_READ_TIME_DELAY_DEFAULT_VALUE. The function\r\n * SerialManager_WriteTimeDelay()/SerialManager_ReadTimeDelay() is a weak function, so it could be re-implemented by\r\n * upper layer.\r\n */\r\n__WEAK_FUNC void SerialManager_WriteTimeDelay(uint32_t ms);\r\n__WEAK_FUNC void SerialManager_WriteTimeDelay(uint32_t ms)\r\n{\r\n#if defined(OSA_USED)\r\n    OSA_TimeDelay(ms);\r\n#endif\r\n}\r\n\r\n__WEAK_FUNC void SerialManager_ReadTimeDelay(uint32_t ms);\r\n__WEAK_FUNC void SerialManager_ReadTimeDelay(uint32_t ms)\r\n{\r\n#if defined(OSA_USED)\r\n    OSA_TimeDelay(ms);\r\n#endif\r\n}\r\n\r\nstatic serial_manager_status_t SerialManager_Write(serial_write_handle_t writeHandle,\r\n                                                   uint8_t *buffer,\r\n                                                   uint32_t length,\r\n                                                   serial_manager_transmission_mode_t mode)\r\n{\r\n    serial_manager_write_handle_t *serialWriteHandle;\r\n    serial_manager_handle_t *serHandle;\r\n#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))\r\n    serial_manager_status_t status = kStatus_SerialManager_Success;\r\n#endif /* SERIAL_PORT_TYPE_USBCDC */ \r\n    uint32_t primask;\r\n    uint8_t isEmpty = 0U;\r\n\r\n    assert(NULL != writeHandle);\r\n    assert(NULL != buffer);\r\n    assert(length > 0U);\r\n\r\n    serialWriteHandle = (serial_manager_write_handle_t *)writeHandle;\r\n    serHandle         = serialWriteHandle->serialManagerHandle;\r\n    assert(NULL != serHandle);\r\n\r\n    assert(SERIAL_MANAGER_WRITE_TAG == serialWriteHandle->tag);\r\n    assert(!((kSerialManager_TransmissionNonBlocking == mode) && (NULL == serialWriteHandle->callback)));\r\n\r\n    primask = DisableGlobalIRQ();\r\n    if (NULL != serialWriteHandle->transfer.buffer)\r\n    {\r\n        EnableGlobalIRQ(primask);\r\n        return kStatus_SerialManager_Busy;\r\n    }\r\n    serialWriteHandle->transfer.buffer = buffer;\r\n    serialWriteHandle->transfer.length = length;\r\n    serialWriteHandle->transfer.soFar  = 0U;\r\n    serialWriteHandle->transfer.mode   = mode;\r\n\r\n    if (NULL == LIST_GetHead(&serHandle->runningWriteHandleHead))\r\n    {\r\n        isEmpty = 1U;\r\n    }\r\n    SerialManager_AddTail(&serHandle->runningWriteHandleHead, serialWriteHandle);\r\n    EnableGlobalIRQ(primask);\r\n\r\n    if (0U != isEmpty)\r\n    {\r\n#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))\r\n    if (serHandle->serialPortType == kSerialPort_UsbCdc)\r\n    {\r\n        status = Serial_UsbCdcGetConnectedStatus((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]);\r\n        if (status == kStatus_SerialManager_NotConnected)\r\n        {\r\n            SerialManager_RemoveHead(&serHandle->runningWriteHandleHead);\r\n            serialWriteHandle->transfer.buffer = NULL;\r\n            serialWriteHandle->transfer.length = 0U;\r\n            return status;\r\n        }\r\n    }\r\n#endif /* SERIAL_PORT_TYPE_USBCDC */    \r\n#if (defined(OSA_USED) && defined(SERIAL_MANAGER_TASK_HANDLE_TX) && (SERIAL_MANAGER_TASK_HANDLE_TX == 1))\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n        /* Need to support common_task. */\r\n#else  /* SERIAL_MANAGER_USE_COMMON_TASK */\r\n        if ((kSerialManager_TransmissionBlocking == mode) && (0U == gUseRtos_c))\r\n        {\r\n            (void)SerialManager_StartWriting(serHandle);\r\n        }\r\n        else\r\n        {\r\n            primask = DisableGlobalIRQ();\r\n            serHandle->serialManagerState[SERIAL_EVENT_DATA_START_SEND]++;\r\n            EnableGlobalIRQ(primask);\r\n            (void)OSA_SemaphorePost((osa_semaphore_handle_t)serHandle->serSemaphore);\r\n        }\r\n#endif /* SERIAL_MANAGER_USE_COMMON_TASK */\r\n#else  /* OSA_USED && SERIAL_MANAGER_TASK_HANDLE_TX */\r\n        (void)SerialManager_StartWriting(serHandle);\r\n#endif /* OSA_USED && SERIAL_MANAGER_TASK_HANDLE_TX */\r\n    }\r\n\r\n    if (kSerialManager_TransmissionBlocking == mode)\r\n    {\r\n        while (serialWriteHandle->transfer.length > serialWriteHandle->transfer.soFar)\r\n        {\r\n            if (SerialManager_needPollingIsr())\r\n            {\r\n                SerialManager_IsrFunction(serHandle);\r\n            }\r\n            else\r\n            {\r\n                SerialManager_WriteTimeDelay(SERIAL_MANAGER_WRITE_TIME_DELAY_DEFAULT_VALUE);\r\n            }\r\n        }\r\n    }\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\nstatic serial_manager_status_t SerialManager_Read(serial_read_handle_t readHandle,\r\n                                                  uint8_t *buffer,\r\n                                                  uint32_t length,\r\n                                                  serial_manager_transmission_mode_t mode,\r\n                                                  uint32_t *receivedLength)\r\n{\r\n    serial_manager_read_handle_t *serialReadHandle;\r\n    serial_manager_handle_t *serHandle;\r\n    uint32_t dataLength;\r\n    uint32_t primask;\r\n\r\n    assert(NULL != readHandle);\r\n    assert(NULL != buffer);\r\n    assert(length > 0U);\r\n\r\n    serialReadHandle = (serial_manager_read_handle_t *)readHandle;\r\n\r\n    serHandle = serialReadHandle->serialManagerHandle;\r\n    assert(NULL != serHandle);\r\n\r\n    assert(SERIAL_MANAGER_READ_TAG == serialReadHandle->tag);\r\n    assert(!((kSerialManager_TransmissionNonBlocking == mode) && (NULL == serialReadHandle->callback)));\r\n\r\n    primask = DisableGlobalIRQ();\r\n    if (NULL != serialReadHandle->transfer.buffer)\r\n    {\r\n        EnableGlobalIRQ(primask);\r\n        return kStatus_SerialManager_Busy;\r\n    }\r\n    serialReadHandle->transfer.buffer = buffer;\r\n    serialReadHandle->transfer.length = length;\r\n    serialReadHandle->transfer.soFar  = 0U;\r\n    serialReadHandle->transfer.mode   = mode;\r\n\r\n    /* This code is reached if (serHandle->handleType != kSerialManager_Blocking)*/\r\n#if (!((defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))) && \\\r\n     !((defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))))\r\n    if (length == 1U)\r\n    {\r\n        if (serHandle->ringBuffer.ringHead != serHandle->ringBuffer.ringTail)\r\n        {\r\n            buffer[serialReadHandle->transfer.soFar++] =\r\n                serHandle->ringBuffer.ringBuffer[serHandle->ringBuffer.ringTail];\r\n            serHandle->ringBuffer.ringTail++;\r\n            if (serHandle->ringBuffer.ringTail >= serHandle->ringBuffer.ringBufferSize)\r\n            {\r\n                serHandle->ringBuffer.ringTail = 0U;\r\n            }\r\n        }\r\n    }\r\n    else\r\n#endif /*(!defined(SERIAL_PORT_TYPE_USBCDC) && !defined(SERIAL_PORT_TYPE_VIRTUAL))*/\r\n    {\r\n        dataLength =\r\n            serHandle->ringBuffer.ringHead + serHandle->ringBuffer.ringBufferSize - serHandle->ringBuffer.ringTail;\r\n        dataLength = dataLength % serHandle->ringBuffer.ringBufferSize;\r\n\r\n        for (serialReadHandle->transfer.soFar = 0U; serialReadHandle->transfer.soFar < MIN(dataLength, length);\r\n             serialReadHandle->transfer.soFar++)\r\n        {\r\n            buffer[serialReadHandle->transfer.soFar] = serHandle->ringBuffer.ringBuffer[serHandle->ringBuffer.ringTail];\r\n            serHandle->ringBuffer.ringTail++;\r\n            if (serHandle->ringBuffer.ringTail >= serHandle->ringBuffer.ringBufferSize)\r\n            {\r\n                serHandle->ringBuffer.ringTail = 0U;\r\n            }\r\n        }\r\n\r\n        dataLength =\r\n            serHandle->ringBuffer.ringHead + serHandle->ringBuffer.ringBufferSize - serHandle->ringBuffer.ringTail;\r\n        dataLength = dataLength % serHandle->ringBuffer.ringBufferSize;\r\n        dataLength = serHandle->ringBuffer.ringBufferSize - 1U - dataLength;\r\n\r\n        (void)SerialManager_StartReading(serHandle, readHandle, NULL, dataLength);\r\n    }\r\n\r\n    if (NULL != receivedLength)\r\n    {\r\n        *receivedLength                   = serialReadHandle->transfer.soFar;\r\n        serialReadHandle->transfer.buffer = NULL;\r\n        EnableGlobalIRQ(primask);\r\n    }\r\n    else\r\n    {\r\n        if (serialReadHandle->transfer.soFar >= serialReadHandle->transfer.length)\r\n        {\r\n            serialReadHandle->transfer.buffer = NULL;\r\n            EnableGlobalIRQ(primask);\r\n            if (kSerialManager_TransmissionNonBlocking == mode)\r\n            {\r\n                if (NULL != serialReadHandle->callback)\r\n                {\r\n                    serial_manager_callback_message_t serialMsg;\r\n                    serialMsg.buffer = buffer;\r\n                    serialMsg.length = serialReadHandle->transfer.soFar;\r\n                    serialReadHandle->callback(serialReadHandle->callbackParam, &serialMsg,\r\n                                               kStatus_SerialManager_Success);\r\n                }\r\n            }\r\n        }\r\n        else\r\n        {\r\n            EnableGlobalIRQ(primask);\r\n        }\r\n\r\n        if (kSerialManager_TransmissionBlocking == mode)\r\n        {\r\n            while (serialReadHandle->transfer.length > serialReadHandle->transfer.soFar)\r\n            {\r\n                SerialManager_ReadTimeDelay(SERIAL_MANAGER_READ_TIME_DELAY_DEFAULT_VALUE);\r\n            }\r\n        }\r\n    }\r\n#if (defined(SERIAL_MANAGER_RING_BUFFER_FLOWCONTROL) && (SERIAL_MANAGER_RING_BUFFER_FLOWCONTROL > 0U))\r\n    uint32_t ringBufferWaterMark =\r\n        serHandle->ringBuffer.ringHead + serHandle->ringBuffer.ringBufferSize - serHandle->ringBuffer.ringTail;\r\n    ringBufferWaterMark = ringBufferWaterMark % serHandle->ringBuffer.ringBufferSize;\r\n    if (ringBufferWaterMark < (uint32_t)(serHandle->ringBuffer.ringBufferSize * RINGBUFFER_WATERMARK_THRESHOLD))\r\n    {\r\n        (void)SerialManager_StartReading(serHandle, serHandle->openedReadHandleHead, NULL,\r\n                                         serialReadHandle->transfer.length);\r\n    }\r\n#endif\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\n#else\r\n\r\nstatic serial_manager_status_t SerialManager_Write(serial_write_handle_t writeHandle, uint8_t *buffer, uint32_t length)\r\n{\r\n    serial_manager_write_handle_t *serialWriteHandle;\r\n    serial_manager_handle_t *serHandle;\r\n\r\n    assert(writeHandle);\r\n    assert(buffer);\r\n    assert(length);\r\n\r\n    serialWriteHandle = (serial_manager_write_handle_t *)writeHandle;\r\n    serHandle         = serialWriteHandle->serialManagerHandle;\r\n\r\n    assert(serHandle);\r\n\r\n    return SerialManager_StartWriting(serHandle, serialWriteHandle, buffer, length);\r\n}\r\n\r\nstatic serial_manager_status_t SerialManager_Read(serial_read_handle_t readHandle, uint8_t *buffer, uint32_t length)\r\n{\r\n    serial_manager_read_handle_t *serialReadHandle;\r\n    serial_manager_handle_t *serHandle;\r\n\r\n    assert(readHandle);\r\n    assert(buffer);\r\n    assert(length);\r\n\r\n    serialReadHandle = (serial_manager_read_handle_t *)readHandle;\r\n    serHandle        = serialReadHandle->serialManagerHandle;\r\n\r\n    assert(serHandle);\r\n\r\n    return SerialManager_StartReading(serHandle, serialReadHandle, buffer, length);\r\n}\r\n#endif\r\n\r\nserial_manager_status_t SerialManager_Init(serial_handle_t serialHandle, const serial_manager_config_t *serialConfig)\r\n{\r\n    serial_manager_handle_t *serHandle;\r\n    serial_manager_status_t status = kStatus_SerialManager_Error;\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n#if (defined(OSA_USED) && !(defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U)))\r\n    osa_task_def_t serTaskConfig;\r\n#endif\r\n#endif\r\n    assert(NULL != serialConfig);\r\n\r\n    assert(NULL != serialHandle);\r\n    assert(SERIAL_MANAGER_HANDLE_SIZE >= sizeof(serial_manager_handle_t));\r\n\r\n    serHandle = (serial_manager_handle_t *)serialHandle;\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n\r\n    assert(NULL != serialConfig->ringBuffer);\r\n    assert(serialConfig->ringBufferSize > 0U);\r\n    (void)memset(serHandle, 0, SERIAL_MANAGER_HANDLE_SIZE);\r\n    serHandle->handleType = serialConfig->blockType;\r\n#else\r\n    (void)memset(serHandle, 0, SERIAL_MANAGER_HANDLE_SIZE);\r\n#endif\r\n    serHandle->serialPortType = serialConfig->type;\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    serHandle->ringBuffer.ringBuffer     = serialConfig->ringBuffer;\r\n    serHandle->ringBuffer.ringBufferSize = serialConfig->ringBufferSize;\r\n#endif\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n#if defined(OSA_USED)\r\n\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n\r\n    COMMON_TASK_init();\r\n\r\n#else\r\n    if (KOSA_StatusSuccess != OSA_SemaphoreCreate((osa_semaphore_handle_t)serHandle->serSemaphore, 1U))\r\n    {\r\n        return kStatus_SerialManager_Error;\r\n    }\r\n    (void)memcpy(&serTaskConfig, OSA_TASK(SerialManager_Task), sizeof(osa_task_def_t));\r\n    if (serialConfig->serialTaskConfig != NULL)\r\n    {\r\n        (void)memcpy(&serTaskConfig, serialConfig->serialTaskConfig, sizeof(osa_task_def_t));\r\n        serTaskConfig.pthread = (OSA_TASK(SerialManager_Task))->pthread;\r\n        serTaskConfig.tname = (OSA_TASK(SerialManager_Task))->tname;\r\n    }\r\n    if (KOSA_StatusSuccess != OSA_TaskCreate((osa_task_handle_t)serHandle->taskId,(const osa_task_def_t *)&serTaskConfig, serHandle))\r\n    {\r\n        return kStatus_SerialManager_Error;\r\n    }\r\n#endif\r\n#endif\r\n\r\n#endif\r\n\r\n    switch (serialConfig->type)\r\n    {\r\n#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))\r\n        case kSerialPort_Uart:\r\n            status = Serial_UartInit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), serialConfig->portConfig);\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n            if ((serial_manager_status_t)kStatus_SerialManager_Success == status)\r\n            {\r\n                (void)Serial_UartInstallTxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                                   SerialManager_TxCallback, serHandle);\r\n\r\n                (void)Serial_UartInstallRxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                                   SerialManager_RxCallback, serHandle);\r\n            }\r\n#endif\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))\r\n        case kSerialPort_UartDma:\r\n            status = Serial_UartDmaInit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), serialConfig->portConfig);\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n            if ((serial_manager_status_t)kStatus_SerialManager_Success == status)\r\n            {\r\n                (void)Serial_UartDmaInstallTxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                                      SerialManager_TxCallback, serHandle);\r\n\r\n                (void)Serial_UartDmaInstallRxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                                      SerialManager_RxCallback, serHandle);\r\n            }\r\n#endif\r\n            break;\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))\r\n        case kSerialPort_UsbCdc:\r\n            status = Serial_UsbCdcInit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), serialConfig->portConfig);\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n\r\n            if (kStatus_SerialManager_Success == status)\r\n            {\r\n                status = Serial_UsbCdcInstallTxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                                        SerialManager_TxCallback, serHandle);\r\n                if (kStatus_SerialManager_Success == status)\r\n                {\r\n                    status = Serial_UsbCdcInstallRxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                                            SerialManager_RxCallback, serHandle);\r\n                }\r\n            }\r\n#endif\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))\r\n        case kSerialPort_Swo:\r\n            status = Serial_SwoInit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), serialConfig->portConfig);\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n            if (kStatus_SerialManager_Success == status)\r\n            {\r\n                status = Serial_SwoInstallTxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                                     SerialManager_TxCallback, serHandle);\r\n            }\r\n#endif\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))\r\n        case kSerialPort_Virtual:\r\n            status =\r\n                Serial_PortVirtualInit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), serialConfig->portConfig);\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n            if (kStatus_SerialManager_Success == status)\r\n            {\r\n                status = Serial_PortVirtualInstallTxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                                             SerialManager_TxCallback, serHandle);\r\n                if (kStatus_SerialManager_Success == status)\r\n                {\r\n                    status = Serial_PortVirtualInstallRxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                                                 SerialManager_RxCallback, serHandle);\r\n                }\r\n            }\r\n#endif\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))\r\n        case kSerialPort_Rpmsg:\r\n            status = Serial_RpmsgInit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), (void *)serialConfig);\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n            if (kStatus_SerialManager_Success == status)\r\n            {\r\n                status = Serial_RpmsgInstallTxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                                       SerialManager_TxCallback, serHandle);\r\n                if (kStatus_SerialManager_Success == status)\r\n                {\r\n                    status = Serial_RpmsgInstallRxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                                           SerialManager_RxCallback, serHandle);\r\n                }\r\n            }\r\n#endif\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))\r\n        case kSerialPort_SpiMaster:\r\n            status =\r\n                Serial_SpiMasterInit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), serialConfig->portConfig);\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n            if (kStatus_SerialManager_Success == status)\r\n            {\r\n                status = Serial_SpiMasterInstallTxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                                           SerialManager_TxCallback, serHandle);\r\n                if (kStatus_SerialManager_Success == status)\r\n                {\r\n                    status = Serial_SpiMasterInstallRxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                                               SerialManager_RxCallback, serHandle);\r\n                }\r\n            }\r\n#endif\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))\r\n        case kSerialPort_SpiSlave:\r\n            status = Serial_SpiSlaveInit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), serialConfig->portConfig);\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n            if (kStatus_SerialManager_Success == status)\r\n            {\r\n                status = Serial_SpiSlaveInstallTxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                                          SerialManager_TxCallback, serHandle);\r\n                if (kStatus_SerialManager_Success == status)\r\n                {\r\n                    status = Serial_SpiSlaveInstallRxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                                              SerialManager_RxCallback, serHandle);\r\n                }\r\n            }\r\n#endif\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))\r\n        case kSerialPort_BleWu:\r\n            status =\r\n                Serial_PortBleWuInit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]), serialConfig->portConfig);\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n            if (kStatus_SerialManager_Success == status)\r\n            {\r\n                status = Serial_PortBleWuInstallTxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                                           SerialManager_TxCallback, serHandle);\r\n                if (kStatus_SerialManager_Success == status)\r\n                {\r\n                    status = Serial_PortBleWuInstallRxCallback(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]),\r\n                                                               SerialManager_RxCallback, serHandle);\r\n                }\r\n            }\r\n#endif\r\n            break;\r\n#endif\r\n        default:\r\n            /*MISRA rule 16.4*/\r\n            break;\r\n    }\r\n\r\n    return status;\r\n}\r\n\r\nserial_manager_status_t SerialManager_Deinit(serial_handle_t serialHandle)\r\n{\r\n    serial_manager_handle_t *serHandle;\r\n\r\n    serial_manager_status_t serialManagerStatus = kStatus_SerialManager_Success;\r\n\r\n    assert(NULL != serialHandle);\r\n\r\n    serHandle = (serial_manager_handle_t *)serialHandle;\r\n\r\n    if ((NULL != serHandle->openedReadHandleHead) || (0U != serHandle->openedWriteHandleCount))\r\n    {\r\n        serialManagerStatus = kStatus_SerialManager_Busy; /*Serial Manager Busy*/\r\n    }\r\n    else\r\n    {\r\n        switch (serHandle->serialPortType) /*serial port type*/\r\n        {\r\n#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))\r\n            case kSerialPort_Uart:\r\n                (void)Serial_UartDeinit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));\r\n                break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))\r\n            case kSerialPort_UsbCdc:\r\n                (void)Serial_UsbCdcDeinit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));\r\n                break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))\r\n            case kSerialPort_Swo:\r\n                (void)Serial_SwoDeinit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));\r\n                break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))\r\n            case kSerialPort_Virtual:\r\n                (void)Serial_PortVirtualDeinit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));\r\n                break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))\r\n            case kSerialPort_Rpmsg:\r\n                (void)Serial_RpmsgDeinit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));\r\n                break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))\r\n            case kSerialPort_SpiSlave:\r\n                (void)Serial_SpiSlaveDeinit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));\r\n                break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))\r\n            case kSerialPort_SpiMaster:\r\n                (void)Serial_SpiMasterDeinit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));\r\n                break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))\r\n            case kSerialPort_BleWu:\r\n                (void)Serial_PortBleWuDeinit(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));\r\n                break;\r\n#endif\r\n            default:\r\n                /*MISRA rule 16.4*/\r\n                break;\r\n        }\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n\r\n#if defined(OSA_USED)\r\n\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n#else\r\n        (void)OSA_SemaphoreDestroy((osa_event_handle_t)serHandle->serSemaphore);\r\n        (void)OSA_TaskDestroy((osa_task_handle_t)serHandle->taskId);\r\n#endif\r\n\r\n#endif\r\n\r\n#endif\r\n    }\r\n    return serialManagerStatus;\r\n}\r\n\r\nserial_manager_status_t SerialManager_OpenWriteHandle(serial_handle_t serialHandle, serial_write_handle_t writeHandle)\r\n{\r\n    serial_manager_handle_t *serHandle;\r\n    serial_manager_write_handle_t *serialWriteHandle;\r\n    uint32_t primask;\r\n\r\n    assert(NULL != serialHandle);\r\n    assert(NULL != writeHandle);\r\n    assert(SERIAL_MANAGER_WRITE_HANDLE_SIZE >= sizeof(serial_manager_write_handle_t));\r\n\r\n    serHandle         = (serial_manager_handle_t *)serialHandle;\r\n    serialWriteHandle = (serial_manager_write_handle_t *)writeHandle;\r\n\r\n    primask = DisableGlobalIRQ();\r\n    serHandle->openedWriteHandleCount++;\r\n    EnableGlobalIRQ(primask);\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    if (serHandle->handleType == kSerialManager_Blocking)\r\n    {\r\n        serialWriteHandle->serialManagerHandle = serHandle;\r\n        return kStatus_SerialManager_Success;\r\n    }\r\n    else\r\n#endif\r\n    {\r\n        (void)memset(writeHandle, 0, SERIAL_MANAGER_WRITE_HANDLE_SIZE);\r\n    }\r\n\r\n    serialWriteHandle->serialManagerHandle = serHandle;\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    serialWriteHandle->tag = SERIAL_MANAGER_WRITE_TAG;\r\n#endif\r\n\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\nserial_manager_status_t SerialManager_CloseWriteHandle(serial_write_handle_t writeHandle)\r\n{\r\n    serial_manager_handle_t *serialHandle;\r\n    serial_manager_write_handle_t *serialWriteHandle;\r\n    uint32_t primask;\r\n\r\n    assert(NULL != writeHandle);\r\n\r\n    serialWriteHandle = (serial_manager_write_handle_t *)writeHandle;\r\n    serialHandle      = (serial_manager_handle_t *)(void *)serialWriteHandle->serialManagerHandle;\r\n\r\n    assert(NULL != serialHandle);\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    assert(SERIAL_MANAGER_WRITE_TAG == serialWriteHandle->tag);\r\n#endif\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    (void)SerialManager_CancelWriting(writeHandle);\r\n#endif\r\n    primask = DisableGlobalIRQ();\r\n    if (serialHandle->openedWriteHandleCount > 0U)\r\n    {\r\n        serialHandle->openedWriteHandleCount--;\r\n    }\r\n    EnableGlobalIRQ(primask);\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    (void)memset(writeHandle, 0, SERIAL_MANAGER_WRITE_HANDLE_SIZE);\r\n#else\r\n    (void)memset(writeHandle, 0, SERIAL_MANAGER_WRITE_BLOCK_HANDLE_SIZE);\r\n#endif\r\n\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\nserial_manager_status_t SerialManager_OpenReadHandle(serial_handle_t serialHandle, serial_read_handle_t readHandle)\r\n{\r\n    serial_manager_handle_t *serHandle;\r\n    serial_manager_read_handle_t *serialReadHandle; /* read handle structure */\r\n    serial_manager_status_t serialManagerStatus = kStatus_SerialManager_Success;\r\n    uint32_t primask;\r\n\r\n    assert(NULL != serialHandle);\r\n    assert(NULL != readHandle);\r\n    assert(SERIAL_MANAGER_READ_HANDLE_SIZE >= sizeof(serial_manager_read_handle_t));\r\n\r\n    serHandle        = (serial_manager_handle_t *)serialHandle;\r\n    serialReadHandle = (serial_manager_read_handle_t *)readHandle;\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    if (serHandle->handleType == kSerialManager_Blocking)\r\n    {\r\n        serialReadHandle->serialManagerHandle = serHandle;\r\n        return kStatus_SerialManager_Success;\r\n    }\r\n#endif\r\n    primask = DisableGlobalIRQ();\r\n    if (serHandle->openedReadHandleHead != NULL)\r\n    {\r\n        serialManagerStatus = kStatus_SerialManager_Busy;\r\n    }\r\n    else\r\n    {\r\n        serHandle->openedReadHandleHead = serialReadHandle;\r\n\r\n        (void)memset(readHandle, 0, SERIAL_MANAGER_READ_HANDLE_SIZE);\r\n\r\n        serialReadHandle->serialManagerHandle = serHandle;\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n        serialReadHandle->tag = SERIAL_MANAGER_READ_TAG;\r\n#endif\r\n    }\r\n    EnableGlobalIRQ(primask);\r\n    return serialManagerStatus;\r\n}\r\n\r\nserial_manager_status_t SerialManager_CloseReadHandle(serial_read_handle_t readHandle)\r\n{\r\n    serial_manager_handle_t *serialHandle;\r\n    serial_manager_read_handle_t *serialReadHandle;\r\n    uint32_t primask;\r\n\r\n    assert(NULL != readHandle);\r\n\r\n    serialReadHandle = (serial_manager_read_handle_t *)readHandle;\r\n    serialHandle     = (serial_manager_handle_t *)(void *)serialReadHandle->serialManagerHandle;\r\n\r\n    assert((NULL != serialHandle) && (serialHandle->openedReadHandleHead == serialReadHandle));\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    assert(SERIAL_MANAGER_READ_TAG == serialReadHandle->tag);\r\n#endif\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    (void)SerialManager_CancelReading(readHandle);\r\n#endif\r\n\r\n    primask                            = DisableGlobalIRQ();\r\n    serialHandle->openedReadHandleHead = NULL;\r\n    EnableGlobalIRQ(primask);\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    (void)memset(readHandle, 0, SERIAL_MANAGER_READ_HANDLE_SIZE);\r\n#else\r\n    (void)memset(readHandle, 0, SERIAL_MANAGER_READ_BLOCK_HANDLE_SIZE);\r\n#endif\r\n\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\nserial_manager_status_t SerialManager_WriteBlocking(serial_write_handle_t writeHandle, uint8_t *buffer, uint32_t length)\r\n{\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    return SerialManager_Write(writeHandle, buffer, length, kSerialManager_TransmissionBlocking);\r\n#else\r\n    return SerialManager_Write(writeHandle, buffer, length);\r\n#endif\r\n}\r\n\r\nserial_manager_status_t SerialManager_ReadBlocking(serial_read_handle_t readHandle, uint8_t *buffer, uint32_t length)\r\n{\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    return SerialManager_Read(readHandle, buffer, length, kSerialManager_TransmissionBlocking, NULL);\r\n#else\r\n    return SerialManager_Read(readHandle, buffer, length);\r\n#endif\r\n}\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\nserial_manager_status_t SerialManager_WriteNonBlocking(serial_write_handle_t writeHandle,\r\n                                                       uint8_t *buffer,\r\n                                                       uint32_t length)\r\n{\r\n    return SerialManager_Write(writeHandle, buffer, length, kSerialManager_TransmissionNonBlocking);\r\n}\r\n\r\nserial_manager_status_t SerialManager_ReadNonBlocking(serial_read_handle_t readHandle, uint8_t *buffer, uint32_t length)\r\n{\r\n#if ((defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U)) || \\\r\n     (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U)))\r\n\r\n    serial_manager_read_handle_t *serialReadHandle;\r\n    serialReadHandle = (serial_manager_read_handle_t *)readHandle;\r\n\r\n    return (serial_manager_status_t)SerialManager_StartReading(serialReadHandle->serialManagerHandle, readHandle,\r\n                                                               buffer, length);\r\n#else\r\n    return SerialManager_Read(readHandle, buffer, length, kSerialManager_TransmissionNonBlocking, NULL);\r\n#endif\r\n}\r\n\r\nserial_manager_status_t SerialManager_CancelWriting(serial_write_handle_t writeHandle)\r\n{\r\n    serial_manager_write_handle_t *serialWriteHandle;\r\n    uint32_t primask;\r\n    uint8_t isNotUsed        = 0U;\r\n    uint8_t isNotNeed2Cancel = 0U;\r\n\r\n    assert(NULL != writeHandle);\r\n\r\n    serialWriteHandle = (serial_manager_write_handle_t *)writeHandle;\r\n\r\n    assert(NULL != serialWriteHandle->serialManagerHandle);\r\n    assert(SERIAL_MANAGER_WRITE_TAG == serialWriteHandle->tag);\r\n\r\n    if ((NULL != serialWriteHandle->transfer.buffer) &&\r\n        (kSerialManager_TransmissionBlocking == serialWriteHandle->transfer.mode))\r\n    {\r\n        return kStatus_SerialManager_Error;\r\n    }\r\n\r\n    primask = DisableGlobalIRQ();\r\n    if (serialWriteHandle != (serial_manager_write_handle_t *)(void *)LIST_GetHead(\r\n                                 &serialWriteHandle->serialManagerHandle->runningWriteHandleHead))\r\n    {\r\n        if (kLIST_Ok == LIST_RemoveElement(&serialWriteHandle->link))\r\n        {\r\n            isNotUsed = 1U;\r\n        }\r\n        else\r\n        {\r\n            isNotNeed2Cancel = 1U;\r\n        }\r\n    }\r\n    EnableGlobalIRQ(primask);\r\n\r\n    if (0U == isNotNeed2Cancel)\r\n    {\r\n        if (0U != isNotUsed)\r\n        {\r\n            serialWriteHandle->transfer.soFar  = 0;\r\n            serialWriteHandle->transfer.status = kStatus_SerialManager_Canceled;\r\n\r\n            SerialManager_AddTail(&serialWriteHandle->serialManagerHandle->completedWriteHandleHead, serialWriteHandle);\r\n#if defined(OSA_USED)\r\n\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n            serialWriteHandle->serialManagerHandle->commontaskMsg.callback = SerialManager_Task;\r\n            serialWriteHandle->serialManagerHandle->commontaskMsg.callbackParam =\r\n                serialWriteHandle->serialManagerHandle;\r\n            COMMON_TASK_post_message(&serialWriteHandle->serialManagerHandle->commontaskMsg);\r\n#else\r\n            primask = DisableGlobalIRQ();\r\n            serialWriteHandle->serialManagerHandle->serialManagerState[SERIAL_EVENT_DATA_SENT]++;\r\n            EnableGlobalIRQ(primask);\r\n            (void)OSA_SemaphorePost((osa_semaphore_handle_t)serialWriteHandle->serialManagerHandle->serSemaphore);\r\n#endif\r\n\r\n#else\r\n            SerialManager_Task(serialWriteHandle->serialManagerHandle);\r\n#endif\r\n        }\r\n        else\r\n        {\r\n            switch (serialWriteHandle->serialManagerHandle->serialPortType)\r\n            {\r\n#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))\r\n                case kSerialPort_Uart:\r\n                    (void)Serial_UartCancelWrite(\r\n                        ((serial_handle_t)&serialWriteHandle->serialManagerHandle->lowLevelhandleBuffer[0]));\r\n                    break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))\r\n                case kSerialPort_UsbCdc:\r\n                    (void)Serial_UsbCdcCancelWrite(\r\n                        ((serial_handle_t)&serialWriteHandle->serialManagerHandle->lowLevelhandleBuffer[0]));\r\n                    break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))\r\n                case kSerialPort_Swo:\r\n                    (void)Serial_SwoCancelWrite(\r\n                        ((serial_handle_t)&serialWriteHandle->serialManagerHandle->lowLevelhandleBuffer[0]));\r\n                    break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))\r\n                case kSerialPort_Virtual:\r\n                    (void)Serial_PortVirtualCancelWrite(\r\n                        ((serial_handle_t)&serialWriteHandle->serialManagerHandle->lowLevelhandleBuffer[0]));\r\n                    break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))\r\n                case kSerialPort_SpiMaster:\r\n                    (void)Serial_SpiMasterCancelWrite(\r\n                        ((serial_handle_t)&serialWriteHandle->serialManagerHandle->lowLevelhandleBuffer[0]));\r\n                    break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))\r\n                case kSerialPort_SpiSlave:\r\n                    (void)Serial_SpiSlaveCancelWrite(\r\n                        ((serial_handle_t)&serialWriteHandle->serialManagerHandle->lowLevelhandleBuffer[0]));\r\n                    break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))\r\n                case kSerialPort_BleWu:\r\n                    (void)Serial_PortBleWuCancelWrite(\r\n                        ((serial_handle_t)&serialWriteHandle->serialManagerHandle->lowLevelhandleBuffer[0]));\r\n                    break;\r\n#endif\r\n                default:\r\n                    /*MISRA rule 16.4*/\r\n                    break;\r\n            }\r\n        }\r\n\r\n#if (defined(OSA_USED) && defined(SERIAL_MANAGER_TASK_HANDLE_TX) && (SERIAL_MANAGER_TASK_HANDLE_TX == 1))\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n        /* Need to support common_task. */\r\n#else  /* SERIAL_MANAGER_USE_COMMON_TASK */\r\n        primask = DisableGlobalIRQ();\r\n        serialWriteHandle->serialManagerHandle->serialManagerState[SERIAL_EVENT_DATA_START_SEND]++;\r\n        EnableGlobalIRQ(primask);\r\n        (void)OSA_SemaphorePost((osa_semaphore_handle_t)serialWriteHandle->serialManagerHandle->serSemaphore);\r\n\r\n#endif /* SERIAL_MANAGER_USE_COMMON_TASK */\r\n#else  /* OSA_USED && SERIAL_MANAGER_TASK_HANDLE_TX */\r\n        (void)SerialManager_StartWriting(serialWriteHandle->serialManagerHandle);\r\n#endif /* OSA_USED && SERIAL_MANAGER_TASK_HANDLE_TX */\r\n    }\r\n\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\nserial_manager_status_t SerialManager_CancelReading(serial_read_handle_t readHandle)\r\n{\r\n    serial_manager_read_handle_t *serialReadHandle;\r\n    serial_manager_callback_message_t serialMsg;\r\n    uint8_t *buffer;\r\n    uint32_t primask;\r\n\r\n    assert(NULL != readHandle);\r\n\r\n    serialReadHandle = (serial_manager_read_handle_t *)readHandle;\r\n\r\n    assert(SERIAL_MANAGER_READ_TAG == serialReadHandle->tag);\r\n\r\n    if ((NULL != serialReadHandle->transfer.buffer) &&\r\n        (kSerialManager_TransmissionBlocking == serialReadHandle->transfer.mode))\r\n    {\r\n        return kStatus_SerialManager_Error;\r\n    }\r\n\r\n    primask                           = DisableGlobalIRQ();\r\n    buffer                            = serialReadHandle->transfer.buffer;\r\n    serialReadHandle->transfer.buffer = NULL;\r\n    serialReadHandle->transfer.length = 0;\r\n    serialMsg.buffer                  = buffer;\r\n    serialMsg.length                  = serialReadHandle->transfer.soFar;\r\n    EnableGlobalIRQ(primask);\r\n\r\n    if (NULL != buffer)\r\n    {\r\n        if (NULL != serialReadHandle->callback)\r\n        {\r\n            serialReadHandle->callback(serialReadHandle->callbackParam, &serialMsg, kStatus_SerialManager_Canceled);\r\n        }\r\n    }\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\nserial_manager_status_t SerialManager_TryRead(serial_read_handle_t readHandle,\r\n                                              uint8_t *buffer,\r\n                                              uint32_t length,\r\n                                              uint32_t *receivedLength)\r\n{\r\n    assert(NULL != receivedLength);\r\n\r\n    return SerialManager_Read(readHandle, buffer, length, kSerialManager_TransmissionBlocking, receivedLength);\r\n}\r\n\r\nserial_manager_status_t SerialManager_InstallTxCallback(serial_write_handle_t writeHandle,\r\n                                                        serial_manager_callback_t callback,\r\n                                                        void *callbackParam)\r\n{\r\n    serial_manager_write_handle_t *serialWriteHandle;\r\n\r\n    assert(NULL != writeHandle);\r\n\r\n    serialWriteHandle = (serial_manager_write_handle_t *)writeHandle;\r\n\r\n    assert(SERIAL_MANAGER_WRITE_TAG == serialWriteHandle->tag);\r\n\r\n    serialWriteHandle->callbackParam = callbackParam;\r\n    serialWriteHandle->callback      = callback;\r\n\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\nserial_manager_status_t SerialManager_InstallRxCallback(serial_read_handle_t readHandle,\r\n                                                        serial_manager_callback_t callback,\r\n                                                        void *callbackParam)\r\n{\r\n    serial_manager_read_handle_t *serialReadHandle;\r\n\r\n    assert(NULL != readHandle);\r\n\r\n    serialReadHandle = (serial_manager_read_handle_t *)readHandle;\r\n\r\n    assert(SERIAL_MANAGER_READ_TAG == serialReadHandle->tag);\r\n\r\n    serialReadHandle->callbackParam = callbackParam;\r\n    serialReadHandle->callback      = callback;\r\n\r\n    return kStatus_SerialManager_Success;\r\n}\r\n#endif\r\n\r\nserial_manager_status_t SerialManager_EnterLowpower(serial_handle_t serialHandle)\r\n{\r\n    serial_manager_handle_t *serHandle;\r\n    serial_manager_status_t status = kStatus_SerialManager_Error;\r\n\r\n    assert(NULL != serialHandle);\r\n\r\n    serHandle = (serial_manager_handle_t *)serialHandle;\r\n\r\n    switch (serHandle->serialPortType)\r\n    {\r\n#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))\r\n        case kSerialPort_Uart:\r\n            status = Serial_UartEnterLowpower(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))\r\n        case kSerialPort_UartDma:\r\n            status = Serial_UartDmaEnterLowpower(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))\r\n        case kSerialPort_UsbCdc:\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))\r\n        case kSerialPort_Swo:\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))\r\n        case kSerialPort_Virtual:\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))\r\n        case kSerialPort_Rpmsg:\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))\r\n        case kSerialPort_SpiMaster:\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))\r\n        case kSerialPort_SpiSlave:\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))\r\n        case kSerialPort_BleWu:\r\n            break;\r\n#endif\r\n        default:\r\n            /*MISRA rule 16.4*/\r\n            break;\r\n    }\r\n    return status;\r\n}\r\n\r\nserial_manager_status_t SerialManager_ExitLowpower(serial_handle_t serialHandle)\r\n{\r\n    serial_manager_handle_t *serHandle;\r\n    serial_manager_status_t status = kStatus_SerialManager_Error;\r\n\r\n    assert(NULL != serialHandle);\r\n\r\n    serHandle = (serial_manager_handle_t *)serialHandle;\r\n\r\n    switch (serHandle->serialPortType)\r\n    {\r\n#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))\r\n        case kSerialPort_Uart:\r\n            status = Serial_UartExitLowpower(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));\r\n            break;\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))\r\n        case kSerialPort_UartDma:\r\n            status = Serial_UartDmaExitLowpower(((serial_handle_t)&serHandle->lowLevelhandleBuffer[0]));\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))\r\n        case kSerialPort_UsbCdc:\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))\r\n        case kSerialPort_Swo:\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))\r\n        case kSerialPort_Virtual:\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))\r\n        case kSerialPort_Rpmsg:\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))\r\n        case kSerialPort_SpiMaster:\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))\r\n        case kSerialPort_SpiSlave:\r\n            break;\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))\r\n        case kSerialPort_BleWu:\r\n            break;\r\n#endif\r\n        default:\r\n            /*MISRA rule 16.4*/\r\n            break;\r\n    }\r\n    return status;\r\n}\r\n/*!\r\n * @brief This function performs initialization of the callbacks structure used to disable lowpower\r\n *          when serial manager is active.\r\n *\r\n *\r\n * @param  pfCallback Pointer to the function structure used to allow/disable lowpower.\r\n *\r\n */\r\nvoid SerialManager_SetLowpowerCriticalCb(const serial_manager_lowpower_critical_CBs_t *pfCallback)\r\n{\r\n    s_pfserialLowpowerCriticalCallbacks = pfCallback;\r\n    (void)s_pfserialLowpowerCriticalCallbacks;\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/serial_manager/fsl_component_serial_manager.h",
    "content": "/*\r\n * Copyright 2018-2024 NXP\r\n * All rights reserved.\r\n *\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef __SERIAL_MANAGER_H__\r\n#define __SERIAL_MANAGER_H__\r\n\r\n#include \"fsl_common.h\"\r\n\r\n/*!\r\n * @addtogroup serialmanager\r\n * @{\r\n */\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n/*! @brief Enable or disable serial manager non-blocking mode (1 - enable, 0 - disable) */\r\n#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE == 0U))\r\n#error When SERIAL_MANAGER_NON_BLOCKING_MODE=0, DEBUG_CONSOLE_TRANSFER_NON_BLOCKING can not be set.\r\n#else\r\n#define SERIAL_MANAGER_NON_BLOCKING_MODE (1U)\r\n#endif\r\n#else\r\n#ifndef SERIAL_MANAGER_NON_BLOCKING_MODE\r\n#define SERIAL_MANAGER_NON_BLOCKING_MODE (0U)\r\n#endif\r\n#endif\r\n\r\n/*! @brief Enable or ring buffer flow control (1 - enable, 0 - disable) */\r\n#ifndef SERIAL_MANAGER_RING_BUFFER_FLOWCONTROL\r\n#define SERIAL_MANAGER_RING_BUFFER_FLOWCONTROL (0U)\r\n#endif\r\n\r\n/*! @brief Enable or disable uart port (1 - enable, 0 - disable) */\r\n#ifndef SERIAL_PORT_TYPE_UART\r\n#define SERIAL_PORT_TYPE_UART (0U)\r\n#endif\r\n\r\n/*! @brief Enable or disable uart dma port (1 - enable, 0 - disable) */\r\n#ifndef SERIAL_PORT_TYPE_UART_DMA\r\n#define SERIAL_PORT_TYPE_UART_DMA (0U)\r\n#endif\r\n/*! @brief Enable or disable USB CDC port (1 - enable, 0 - disable) */\r\n#ifndef SERIAL_PORT_TYPE_USBCDC\r\n#define SERIAL_PORT_TYPE_USBCDC (0U)\r\n#endif\r\n\r\n/*! @brief Enable or disable SWO port (1 - enable, 0 - disable) */\r\n#ifndef SERIAL_PORT_TYPE_SWO\r\n#define SERIAL_PORT_TYPE_SWO (0U)\r\n#endif\r\n\r\n/*! @brief Enable or disable USB CDC virtual port (1 - enable, 0 - disable) */\r\n#ifndef SERIAL_PORT_TYPE_VIRTUAL\r\n#define SERIAL_PORT_TYPE_VIRTUAL (0U)\r\n#endif\r\n\r\n/*! @brief Enable or disable rPMSG port (1 - enable, 0 - disable) */\r\n#ifndef SERIAL_PORT_TYPE_RPMSG\r\n#define SERIAL_PORT_TYPE_RPMSG (0U)\r\n#endif\r\n\r\n/*! @brief Enable or disable SPI Master port (1 - enable, 0 - disable) */\r\n#ifndef SERIAL_PORT_TYPE_SPI_MASTER\r\n#define SERIAL_PORT_TYPE_SPI_MASTER (0U)\r\n#endif\r\n\r\n/*! @brief Enable or disable SPI Slave port (1 - enable, 0 - disable) */\r\n#ifndef SERIAL_PORT_TYPE_SPI_SLAVE\r\n#define SERIAL_PORT_TYPE_SPI_SLAVE (0U)\r\n#endif\r\n\r\n/*! @brief Enable or disable BLE WU port (1 - enable, 0 - disable) */\r\n#ifndef SERIAL_PORT_TYPE_BLE_WU\r\n#define SERIAL_PORT_TYPE_BLE_WU (0U)\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE == 1U))\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE == 0U))\r\n#warning When SERIAL_PORT_TYPE_SPI_SLAVE=1, SERIAL_MANAGER_NON_BLOCKING_MODE should be set.\r\n#undef SERIAL_MANAGER_NON_BLOCKING_MODE\r\n#define SERIAL_MANAGER_NON_BLOCKING_MODE (1U)\r\n#endif\r\n#endif\r\n\r\n/*! @brief Set the default delay time in ms used by SerialManager_WriteTimeDelay(). */\r\n#ifndef SERIAL_MANAGER_WRITE_TIME_DELAY_DEFAULT_VALUE\r\n#define SERIAL_MANAGER_WRITE_TIME_DELAY_DEFAULT_VALUE (1U)\r\n#endif\r\n\r\n/*! @brief Set the default delay time in ms used by SerialManager_ReadTimeDelay(). */\r\n#ifndef SERIAL_MANAGER_READ_TIME_DELAY_DEFAULT_VALUE\r\n#define SERIAL_MANAGER_READ_TIME_DELAY_DEFAULT_VALUE (1U)\r\n#endif\r\n\r\n/*! @brief Enable or disable SerialManager_Task() handle RX data available notify */\r\n#ifndef SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY\r\n#define SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY (0U)\r\n#endif\r\n#if (defined(SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY) && (SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY > 0U))\r\n#ifndef OSA_USED\r\n#error When SERIAL_MANAGER_TASK_HANDLE_RX_AVAILABLE_NOTIFY=1, OSA_USED must be set.\r\n#endif\r\n#endif\r\n\r\n/*! @brief Set serial manager write handle size */\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n#define SERIAL_MANAGER_WRITE_HANDLE_SIZE       (44U)\r\n#define SERIAL_MANAGER_READ_HANDLE_SIZE        (44U)\r\n#define SERIAL_MANAGER_WRITE_BLOCK_HANDLE_SIZE (4U)\r\n#define SERIAL_MANAGER_READ_BLOCK_HANDLE_SIZE  (4U)\r\n#else\r\n#define SERIAL_MANAGER_WRITE_HANDLE_SIZE       (4U)\r\n#define SERIAL_MANAGER_READ_HANDLE_SIZE        (4U)\r\n#define SERIAL_MANAGER_WRITE_BLOCK_HANDLE_SIZE (4U)\r\n#define SERIAL_MANAGER_READ_BLOCK_HANDLE_SIZE  (4U)\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))\r\n#include \"fsl_component_serial_port_uart.h\"\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))\r\n#include \"fsl_component_serial_port_uart.h\"\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))\r\n#include \"fsl_component_serial_port_rpmsg.h\"\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))\r\n\r\n#if !(defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n#error The serial manager blocking mode cannot be supported for USB CDC.\r\n#endif\r\n\r\n#include \"fsl_component_serial_port_usb.h\"\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))\r\n#include \"fsl_component_serial_port_swo.h\"\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))\r\n#include \"fsl_component_serial_port_spi.h\"\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))\r\n#include \"fsl_component_serial_port_spi.h\"\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))\r\n\r\n#if !(defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n#error The serial manager blocking mode cannot be supported for USB CDC.\r\n#endif\r\n\r\n#include \"fsl_component_serial_port_virtual.h\"\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))\r\n\r\n#if !(defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n#error The serial manager blocking mode cannot be supported for BLE WU.\r\n#endif /* SERIAL_MANAGER_NON_BLOCKING_MODE */\r\n\r\n#include \"fsl_component_serial_port_ble_wu.h\"\r\n#endif /* SERIAL_PORT_TYPE_BLE_WU */\r\n\r\n#define SERIAL_MANAGER_HANDLE_SIZE_TEMP 0U\r\n#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))\r\n\r\n#if (SERIAL_PORT_UART_HANDLE_SIZE > SERIAL_MANAGER_HANDLE_SIZE_TEMP)\r\n#undef SERIAL_MANAGER_HANDLE_SIZE_TEMP\r\n#define SERIAL_MANAGER_HANDLE_SIZE_TEMP SERIAL_PORT_UART_HANDLE_SIZE\r\n#endif\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))\r\n#if (SERIAL_PORT_UART_DMA_HANDLE_SIZE > SERIAL_MANAGER_HANDLE_SIZE_TEMP)\r\n#undef SERIAL_MANAGER_HANDLE_SIZE_TEMP\r\n#define SERIAL_MANAGER_HANDLE_SIZE_TEMP SERIAL_PORT_UART_DMA_HANDLE_SIZE\r\n#endif\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))\r\n\r\n#if (SERIAL_PORT_USB_CDC_HANDLE_SIZE > SERIAL_MANAGER_HANDLE_SIZE_TEMP)\r\n#undef SERIAL_MANAGER_HANDLE_SIZE_TEMP\r\n#define SERIAL_MANAGER_HANDLE_SIZE_TEMP SERIAL_PORT_USB_CDC_HANDLE_SIZE\r\n#endif\r\n\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))\r\n\r\n#if (SERIAL_PORT_SWO_HANDLE_SIZE > SERIAL_MANAGER_HANDLE_SIZE_TEMP)\r\n#undef SERIAL_MANAGER_HANDLE_SIZE_TEMP\r\n#define SERIAL_MANAGER_HANDLE_SIZE_TEMP SERIAL_PORT_SWO_HANDLE_SIZE\r\n#endif\r\n\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && (SERIAL_PORT_TYPE_SPI_MASTER > 0U))\r\n#if (SERIAL_PORT_SPI_MASTER_HANDLE_SIZE > SERIAL_MANAGER_HANDLE_SIZE_TEMP)\r\n#undef SERIAL_MANAGER_HANDLE_SIZE_TEMP\r\n#define SERIAL_MANAGER_HANDLE_SIZE_TEMP SERIAL_PORT_SPI_MASTER_HANDLE_SIZE\r\n#endif\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))\r\n#if (SERIAL_PORT_SPI_SLAVE_HANDLE_SIZE > SERIAL_MANAGER_HANDLE_SIZE_TEMP)\r\n#undef SERIAL_MANAGER_HANDLE_SIZE_TEMP\r\n#define SERIAL_MANAGER_HANDLE_SIZE_TEMP SERIAL_PORT_SPI_SLAVE_HANDLE_SIZE\r\n#endif\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))\r\n\r\n#if (SERIAL_PORT_VIRTUAL_HANDLE_SIZE > SERIAL_MANAGER_HANDLE_SIZE_TEMP)\r\n#undef SERIAL_MANAGER_HANDLE_SIZE_TEMP\r\n#define SERIAL_MANAGER_HANDLE_SIZE_TEMP SERIAL_PORT_VIRTUAL_HANDLE_SIZE\r\n#endif\r\n\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))\r\n\r\n#if (SERIAL_PORT_RPMSG_HANDLE_SIZE > SERIAL_MANAGER_HANDLE_SIZE_TEMP)\r\n#undef SERIAL_MANAGER_HANDLE_SIZE_TEMP\r\n#define SERIAL_MANAGER_HANDLE_SIZE_TEMP SERIAL_PORT_RPMSG_HANDLE_SIZE\r\n\r\n#endif\r\n\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))\r\n\r\n#if (SERIAL_PORT_BLE_WU_HANDLE_SIZE > SERIAL_MANAGER_HANDLE_SIZE_TEMP)\r\n#undef SERIAL_MANAGER_HANDLE_SIZE_TEMP\r\n#define SERIAL_MANAGER_HANDLE_SIZE_TEMP SERIAL_PORT_BLE_WU_HANDLE_SIZE\r\n#endif\r\n\r\n#endif\r\n\r\n/*! @brief SERIAL_PORT_UART_HANDLE_SIZE/SERIAL_PORT_USB_CDC_HANDLE_SIZE + serial manager dedicated size */\r\n#if ((defined(SERIAL_MANAGER_HANDLE_SIZE_TEMP) && (SERIAL_MANAGER_HANDLE_SIZE_TEMP > 0U)))\r\n#else\r\n#error SERIAL_PORT_TYPE_UART, SERIAL_PORT_TYPE_USBCDC, SERIAL_PORT_TYPE_SWO, SERIAL_PORT_TYPE_VIRTUAL, and SERIAL_PORT_TYPE_BLE_WU should not be cleared at same time.\r\n#endif\r\n\r\n/*! @brief Macro to determine whether use common task. */\r\n#ifndef SERIAL_MANAGER_USE_COMMON_TASK\r\n#define SERIAL_MANAGER_USE_COMMON_TASK (0U)\r\n#endif\r\n\r\n#if defined(OSA_USED)\r\n#if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U))\r\n#include \"fsl_component_common_task.h\"\r\n#endif\r\n/*! @brief Enable or disable SerialManager_Task() handle TX to prevent recursive calling */\r\n#ifndef SERIAL_MANAGER_TASK_HANDLE_TX\r\n#define SERIAL_MANAGER_TASK_HANDLE_TX (1U)\r\n#endif\r\n#endif\r\n\r\n#if (defined(SERIAL_MANAGER_TASK_HANDLE_TX) && (SERIAL_MANAGER_TASK_HANDLE_TX > 0U))\r\n#ifndef OSA_USED\r\n#error When SERIAL_MANAGER_TASK_HANDLE_TX=1, OSA_USED must be set.\r\n#endif\r\n#endif\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n#if (defined(OSA_USED) && !(defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U)))\r\n#include \"fsl_os_abstraction.h\"\r\n#endif\r\n#endif\r\n\r\n/*! @brief Definition of serial manager handle size. */\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n#if (defined(OSA_USED) && !(defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U)))\r\n#define SERIAL_MANAGER_HANDLE_SIZE \\\r\n    (SERIAL_MANAGER_HANDLE_SIZE_TEMP + 124U + OSA_TASK_HANDLE_SIZE + OSA_EVENT_HANDLE_SIZE)\r\n#else  /*defined(OSA_USED)*/\r\n#define SERIAL_MANAGER_HANDLE_SIZE (SERIAL_MANAGER_HANDLE_SIZE_TEMP + 124U)\r\n#endif /*defined(OSA_USED)*/\r\n#define SERIAL_MANAGER_BLOCK_HANDLE_SIZE (SERIAL_MANAGER_HANDLE_SIZE_TEMP + 16U)\r\n#else\r\n#define SERIAL_MANAGER_HANDLE_SIZE       (SERIAL_MANAGER_HANDLE_SIZE_TEMP + 12U)\r\n#define SERIAL_MANAGER_BLOCK_HANDLE_SIZE (SERIAL_MANAGER_HANDLE_SIZE_TEMP + 12U)\r\n#endif\r\n\r\n/*!\r\n * @brief Defines the serial manager handle\r\n *\r\n * This macro is used to define a 4 byte aligned serial manager handle.\r\n * Then use \"(serial_handle_t)name\" to get the serial manager handle.\r\n *\r\n * The macro should be global and could be optional. You could also define serial manager handle by yourself.\r\n *\r\n * This is an example,\r\n * @code\r\n * SERIAL_MANAGER_HANDLE_DEFINE(serialManagerHandle);\r\n * @endcode\r\n *\r\n * @param name The name string of the serial manager handle.\r\n */\r\n#define SERIAL_MANAGER_HANDLE_DEFINE(name) \\\r\n    uint32_t name[((SERIAL_MANAGER_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]\r\n#define SERIAL_MANAGER_BLOCK_HANDLE_DEFINE(name) \\\r\n    uint32_t name[((SERIAL_MANAGER_BLOCK_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]\r\n/*!\r\n * @brief Defines the serial manager write handle\r\n *\r\n * This macro is used to define a 4 byte aligned serial manager write handle.\r\n * Then use \"(serial_write_handle_t)name\" to get the serial manager write handle.\r\n *\r\n * The macro should be global and could be optional. You could also define serial manager write handle by yourself.\r\n *\r\n * This is an example,\r\n * @code\r\n * SERIAL_MANAGER_WRITE_HANDLE_DEFINE(serialManagerwriteHandle);\r\n * @endcode\r\n *\r\n * @param name The name string of the serial manager write handle.\r\n */\r\n#define SERIAL_MANAGER_WRITE_HANDLE_DEFINE(name) \\\r\n    uint32_t name[((SERIAL_MANAGER_WRITE_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]\r\n#define SERIAL_MANAGER_WRITE_BLOCK_HANDLE_DEFINE(name) \\\r\n    uint32_t name[((SERIAL_MANAGER_WRITE_BLOCK_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]\r\n/*!\r\n * @brief Defines the serial manager read handle\r\n *\r\n * This macro is used to define a 4 byte aligned serial manager read handle.\r\n * Then use \"(serial_read_handle_t)name\" to get the serial manager read handle.\r\n *\r\n * The macro should be global and could be optional. You could also define serial manager read handle by yourself.\r\n *\r\n * This is an example,\r\n * @code\r\n * SERIAL_MANAGER_READ_HANDLE_DEFINE(serialManagerReadHandle);\r\n * @endcode\r\n *\r\n * @param name The name string of the serial manager read handle.\r\n */\r\n#define SERIAL_MANAGER_READ_HANDLE_DEFINE(name) \\\r\n    uint32_t name[((SERIAL_MANAGER_READ_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]\r\n#define SERIAL_MANAGER_READ_BLOCK_HANDLE_DEFINE(name) \\\r\n    uint32_t name[((SERIAL_MANAGER_READ_BLOCK_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]\r\n\r\n/*! @brief Macro to set serial manager task priority. */\r\n#ifndef SERIAL_MANAGER_TASK_PRIORITY\r\n#define SERIAL_MANAGER_TASK_PRIORITY (2U)\r\n#endif\r\n\r\n/*! @brief Macro to set serial manager task stack size. */\r\n#ifndef SERIAL_MANAGER_TASK_STACK_SIZE\r\n#define SERIAL_MANAGER_TASK_STACK_SIZE (1000U)\r\n#endif\r\n\r\n/*! @brief The handle of the serial manager module */\r\ntypedef void *serial_handle_t;\r\n\r\n/*! @brief The write handle of the serial manager module */\r\ntypedef void *serial_write_handle_t;\r\n\r\n/*! @brief The read handle of the serial manager module */\r\ntypedef void *serial_read_handle_t;\r\n\r\n#ifndef _SERIAL_PORT_T_\r\n#define _SERIAL_PORT_T_\r\n/*! @brief serial port type*/\r\ntypedef enum _serial_port_type\r\n{\r\n    kSerialPort_None = 0U, /*!< Serial port is none */\r\n    kSerialPort_Uart = 1U, /*!< Serial port UART */\r\n    kSerialPort_UsbCdc,    /*!< Serial port USB CDC */\r\n    kSerialPort_Swo,       /*!< Serial port SWO */\r\n    kSerialPort_Virtual,   /*!< Serial port Virtual */\r\n    kSerialPort_Rpmsg,     /*!< Serial port RPMSG */\r\n    kSerialPort_UartDma,   /*!< Serial port UART DMA*/\r\n    kSerialPort_SpiMaster, /*!< Serial port SPIMASTER*/\r\n    kSerialPort_SpiSlave,  /*!< Serial port SPISLAVE*/\r\n    kSerialPort_BleWu,     /*!< Serial port BLE WU */\r\n} serial_port_type_t;\r\n#endif\r\n\r\n/*! @brief serial manager type*/\r\ntypedef enum _serial_manager_type\r\n{\r\n    kSerialManager_NonBlocking = 0x0U,    /*!< None blocking handle*/\r\n    kSerialManager_Blocking    = 0x8F41U, /*!< Blocking handle*/\r\n} serial_manager_type_t;\r\n/*! @brief serial manager config structure*/\r\ntypedef struct _serial_manager_config\r\n{\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    uint8_t *ringBuffer;             /*!< Ring buffer address, it is used to buffer data received by the hardware.\r\n                                          Besides, the memory space cannot be free during the lifetime of the serial\r\n                                          manager module. */\r\n    uint32_t ringBufferSize;         /*!< The size of the ring buffer */\r\n#if (defined(OSA_USED) && !(defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U)))\r\n    osa_task_def_t *serialTaskConfig;  /*!< Serial manager task configuration, can be defined the serial manager \r\n                                            task configuration for this instance, if serialTaskConfig is NULL, will use the \r\n                                            default serial manager configure provided by serial manger module.*/\r\n#endif\r\n#endif\r\n    serial_port_type_t type;         /*!< Serial port type */\r\n    serial_manager_type_t blockType; /*!< Serial manager port type */\r\n    void *portConfig;                /*!< Serial port configuration */\r\n} serial_manager_config_t;\r\n\r\n/*! @brief serial manager error code*/\r\ntypedef enum _serial_manager_status\r\n{\r\n    kStatus_SerialManager_Success = kStatus_Success,                            /*!< Success */\r\n    kStatus_SerialManager_Error   = MAKE_STATUS(kStatusGroup_SERIALMANAGER, 1), /*!< Failed */\r\n    kStatus_SerialManager_Busy    = MAKE_STATUS(kStatusGroup_SERIALMANAGER, 2), /*!< Busy */\r\n    kStatus_SerialManager_Notify  = MAKE_STATUS(kStatusGroup_SERIALMANAGER, 3), /*!< Ring buffer is not empty */\r\n    kStatus_SerialManager_Canceled =\r\n        MAKE_STATUS(kStatusGroup_SERIALMANAGER, 4), /*!< the non-blocking request is canceled */\r\n    kStatus_SerialManager_HandleConflict = MAKE_STATUS(kStatusGroup_SERIALMANAGER, 5), /*!< The handle is opened */\r\n    kStatus_SerialManager_RingBufferOverflow =\r\n        MAKE_STATUS(kStatusGroup_SERIALMANAGER, 6), /*!< The ring buffer is overflowed */\r\n    kStatus_SerialManager_NotConnected = MAKE_STATUS(kStatusGroup_SERIALMANAGER, 7), /*!< The host is not connected */\r\n} serial_manager_status_t;\r\n\r\n/*! @brief Callback message structure */\r\ntypedef struct _serial_manager_callback_message\r\n{\r\n    uint8_t *buffer; /*!< Transferred buffer */\r\n    uint32_t length; /*!< Transferred data length */\r\n} serial_manager_callback_message_t;\r\n\r\n/*! @brief serial manager callback function */\r\ntypedef void (*serial_manager_callback_t)(void *callbackParam,\r\n                                          serial_manager_callback_message_t *message,\r\n                                          serial_manager_status_t status);\r\n\r\n/*! @brief serial manager Lowpower Critical callback function */\r\ntypedef int32_t (*serial_manager_lowpower_critical_callback_t)(int32_t power_mode);\r\ntypedef struct _serial_manager_lowpower_critical_CBs_t\r\n{\r\n    serial_manager_lowpower_critical_callback_t serialEnterLowpowerCriticalFunc;\r\n    serial_manager_lowpower_critical_callback_t serialExitLowpowerCriticalFunc;\r\n} serial_manager_lowpower_critical_CBs_t;\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif /* _cplusplus */\r\n\r\n/*!\r\n * @brief Initializes a serial manager module with the serial manager handle and the user configuration structure.\r\n *\r\n * This function configures the Serial Manager module with user-defined settings.\r\n * The user can configure the configuration structure.\r\n * The parameter serialHandle is a pointer to point to a memory space of size #SERIAL_MANAGER_HANDLE_SIZE\r\n * allocated by the caller.\r\n * The Serial Manager module supports three types of serial port, UART (includes UART, USART, LPSCI, LPUART, etc), USB\r\n * CDC and swo.\r\n * Please refer to #serial_port_type_t for serial port setting.\r\n * These three types can be set by using #serial_manager_config_t.\r\n *\r\n * Example below shows how to use this API to configure the Serial Manager.\r\n * For UART,\r\n *  @code\r\n *   #define SERIAL_MANAGER_RING_BUFFER_SIZE (256U)\r\n *   static SERIAL_MANAGER_HANDLE_DEFINE(s_serialHandle);\r\n *   static uint8_t s_ringBuffer[SERIAL_MANAGER_RING_BUFFER_SIZE];\r\n *\r\n *   serial_manager_config_t config;\r\n *   serial_port_uart_config_t uartConfig;\r\n *   config.type = kSerialPort_Uart;\r\n *   config.ringBuffer = &s_ringBuffer[0];\r\n *   config.ringBufferSize = SERIAL_MANAGER_RING_BUFFER_SIZE;\r\n *   uartConfig.instance = 0;\r\n *   uartConfig.clockRate = 24000000;\r\n *   uartConfig.baudRate = 115200;\r\n *   uartConfig.parityMode = kSerialManager_UartParityDisabled;\r\n *   uartConfig.stopBitCount = kSerialManager_UartOneStopBit;\r\n *   uartConfig.enableRx = 1;\r\n *   uartConfig.enableTx = 1;\r\n *   uartConfig.enableRxRTS = 0;\r\n *   uartConfig.enableTxCTS = 0;\r\n *   config.portConfig = &uartConfig;\r\n *   SerialManager_Init((serial_handle_t)s_serialHandle, &config);\r\n *  @endcode\r\n * For USB CDC,\r\n *  @code\r\n *   #define SERIAL_MANAGER_RING_BUFFER_SIZE (256U)\r\n *   static SERIAL_MANAGER_HANDLE_DEFINE(s_serialHandle);\r\n *   static uint8_t s_ringBuffer[SERIAL_MANAGER_RING_BUFFER_SIZE];\r\n *\r\n *   serial_manager_config_t config;\r\n *   serial_port_usb_cdc_config_t usbCdcConfig;\r\n *   config.type = kSerialPort_UsbCdc;\r\n *   config.ringBuffer = &s_ringBuffer[0];\r\n *   config.ringBufferSize = SERIAL_MANAGER_RING_BUFFER_SIZE;\r\n *   usbCdcConfig.controllerIndex = kSerialManager_UsbControllerKhci0;\r\n *   config.portConfig = &usbCdcConfig;\r\n *   SerialManager_Init((serial_handle_t)s_serialHandle, &config);\r\n *  @endcode\r\n *\r\n * Example below shows how to use this API to configure the Serial Manager task configuration.\r\n * For example if user need do specfical configuration(s_os_thread_def_serialmanager)for the\r\n * serial mananger task,\r\n *  @code\r\n *   #define SERIAL_MANAGER_RING_BUFFER_SIZE (256U)\r\n *   static SERIAL_MANAGER_HANDLE_DEFINE(s_serialHandle);\r\n *   static uint8_t s_ringBuffer[SERIAL_MANAGER_RING_BUFFER_SIZE];\r\n *   const osa_task_def_t s_os_thread_def_serialmanager = {\r\n *       .tpriority = 4,\r\n *       .instances = 1,\r\n *       .stacksize = 2048,\r\n *   };\r\n *   serial_manager_config_t config;\r\n *   serial_port_uart_config_t uartConfig;\r\n *   config.type = kSerialPort_Uart;\r\n *   config.ringBuffer = &s_ringBuffer[0];\r\n *   config.ringBufferSize = SERIAL_MANAGER_RING_BUFFER_SIZE;\r\n *   config.serialTaskConfig = (osa_task_def_t *)&s_os_thread_def_serialmanager,\r\n *   uartConfig.instance = 0;\r\n *   uartConfig.clockRate = 24000000;\r\n *   uartConfig.baudRate = 115200;\r\n *   uartConfig.parityMode = kSerialManager_UartParityDisabled;\r\n *   uartConfig.stopBitCount = kSerialManager_UartOneStopBit;\r\n *   uartConfig.enableRx = 1;\r\n *   uartConfig.enableTx = 1;\r\n *   uartConfig.enableRxRTS = 0;\r\n *   uartConfig.enableTxCTS = 0;\r\n *   config.portConfig = &uartConfig;\r\n *   SerialManager_Init((serial_handle_t)s_serialHandle, &config);\r\n *  @endcode\r\n * @param serialHandle Pointer to point to a memory space of size #SERIAL_MANAGER_HANDLE_SIZE allocated by the caller.\r\n * The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.\r\n * You can define the handle in the following two ways:\r\n * #SERIAL_MANAGER_HANDLE_DEFINE(serialHandle);\r\n * or\r\n * uint32_t serialHandle[((SERIAL_MANAGER_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))];\r\n * @param serialConfig Pointer to user-defined configuration structure.\r\n * @retval kStatus_SerialManager_Error An error occurred.\r\n * @retval kStatus_SerialManager_Success The Serial Manager module initialization succeed.\r\n */\r\nserial_manager_status_t SerialManager_Init(serial_handle_t serialHandle, const serial_manager_config_t *serialConfig);\r\n\r\n/*!\r\n * @brief De-initializes the serial manager module instance.\r\n *\r\n * This function de-initializes the serial manager module instance. If the opened writing or\r\n * reading handle is not closed, the function will return kStatus_SerialManager_Busy.\r\n *\r\n * @param serialHandle The serial manager module handle pointer.\r\n * @retval kStatus_SerialManager_Success The serial manager de-initialization succeed.\r\n * @retval kStatus_SerialManager_Busy Opened reading or writing handle is not closed.\r\n */\r\nserial_manager_status_t SerialManager_Deinit(serial_handle_t serialHandle);\r\n\r\n/*!\r\n * @brief Opens a writing handle for the serial manager module.\r\n *\r\n * This function Opens a writing handle for the serial manager module. If the serial manager needs to\r\n * be used in different tasks, the task should open a dedicated write handle for itself by calling\r\n * #SerialManager_OpenWriteHandle. Since there can only one buffer for transmission for the writing\r\n * handle at the same time, multiple writing handles need to be opened when the multiple transmission\r\n * is needed for a task.\r\n *\r\n * @param serialHandle The serial manager module handle pointer.\r\n * The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.\r\n * @param writeHandle The serial manager module writing handle pointer.\r\n * The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.\r\n * You can define the handle in the following two ways:\r\n * #SERIAL_MANAGER_WRITE_HANDLE_DEFINE(writeHandle);\r\n * or\r\n * uint32_t writeHandle[((SERIAL_MANAGER_WRITE_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))];\r\n * @retval kStatus_SerialManager_Error An error occurred.\r\n * @retval kStatus_SerialManager_HandleConflict The writing handle was opened.\r\n * @retval kStatus_SerialManager_Success The writing handle is opened.\r\n *\r\n * Example below shows how to use this API to write data.\r\n * For task 1,\r\n *  @code\r\n *   static SERIAL_MANAGER_WRITE_HANDLE_DEFINE(s_serialWriteHandle1);\r\n *   static uint8_t s_nonBlockingWelcome1[] = \"This is non-blocking writing log for task1!\\r\\n\";\r\n *   SerialManager_OpenWriteHandle((serial_handle_t)serialHandle, (serial_write_handle_t)s_serialWriteHandle1);\r\n *   SerialManager_InstallTxCallback((serial_write_handle_t)s_serialWriteHandle1,\r\n *                                    Task1_SerialManagerTxCallback,\r\n *                                    s_serialWriteHandle1);\r\n *   SerialManager_WriteNonBlocking((serial_write_handle_t)s_serialWriteHandle1,\r\n *                                   s_nonBlockingWelcome1,\r\n *                                   sizeof(s_nonBlockingWelcome1) - 1U);\r\n *  @endcode\r\n * For task 2,\r\n *  @code\r\n *   static SERIAL_MANAGER_WRITE_HANDLE_DEFINE(s_serialWriteHandle2);\r\n *   static uint8_t s_nonBlockingWelcome2[] = \"This is non-blocking writing log for task2!\\r\\n\";\r\n *   SerialManager_OpenWriteHandle((serial_handle_t)serialHandle, (serial_write_handle_t)s_serialWriteHandle2);\r\n *   SerialManager_InstallTxCallback((serial_write_handle_t)s_serialWriteHandle2,\r\n *                                    Task2_SerialManagerTxCallback,\r\n *                                    s_serialWriteHandle2);\r\n *   SerialManager_WriteNonBlocking((serial_write_handle_t)s_serialWriteHandle2,\r\n *                                   s_nonBlockingWelcome2,\r\n *                                   sizeof(s_nonBlockingWelcome2) - 1U);\r\n *  @endcode\r\n */\r\nserial_manager_status_t SerialManager_OpenWriteHandle(serial_handle_t serialHandle, serial_write_handle_t writeHandle);\r\n\r\n/*!\r\n * @brief Closes a writing handle for the serial manager module.\r\n *\r\n * This function Closes a writing handle for the serial manager module.\r\n *\r\n * @param writeHandle The serial manager module writing handle pointer.\r\n * @retval kStatus_SerialManager_Success The writing handle is closed.\r\n */\r\nserial_manager_status_t SerialManager_CloseWriteHandle(serial_write_handle_t writeHandle);\r\n\r\n/*!\r\n * @brief Opens a reading handle for the serial manager module.\r\n *\r\n * This function Opens a reading handle for the serial manager module. The reading handle can not be\r\n * opened multiple at the same time. The error code kStatus_SerialManager_Busy would be returned when\r\n * the previous reading handle is not closed. And there can only be one buffer for receiving for the\r\n * reading handle at the same time.\r\n *\r\n * @param serialHandle The serial manager module handle pointer.\r\n * The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.\r\n * @param readHandle The serial manager module reading handle pointer.\r\n * The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.\r\n * You can define the handle in the following two ways:\r\n * #SERIAL_MANAGER_READ_HANDLE_DEFINE(readHandle);\r\n * or\r\n * uint32_t readHandle[((SERIAL_MANAGER_READ_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))];\r\n * @retval kStatus_SerialManager_Error An error occurred.\r\n * @retval kStatus_SerialManager_Success The reading handle is opened.\r\n * @retval kStatus_SerialManager_Busy Previous reading handle is not closed.\r\n *\r\n * Example below shows how to use this API to read data.\r\n *  @code\r\n *   static SERIAL_MANAGER_READ_HANDLE_DEFINE(s_serialReadHandle);\r\n *   SerialManager_OpenReadHandle((serial_handle_t)serialHandle, (serial_read_handle_t)s_serialReadHandle);\r\n *   static uint8_t s_nonBlockingBuffer[64];\r\n *   SerialManager_InstallRxCallback((serial_read_handle_t)s_serialReadHandle,\r\n *                                    APP_SerialManagerRxCallback,\r\n *                                    s_serialReadHandle);\r\n *   SerialManager_ReadNonBlocking((serial_read_handle_t)s_serialReadHandle,\r\n *                                  s_nonBlockingBuffer,\r\n *                                  sizeof(s_nonBlockingBuffer));\r\n *  @endcode\r\n */\r\nserial_manager_status_t SerialManager_OpenReadHandle(serial_handle_t serialHandle, serial_read_handle_t readHandle);\r\n\r\n/*!\r\n * @brief Closes a reading for the serial manager module.\r\n *\r\n * This function Closes a reading for the serial manager module.\r\n *\r\n * @param readHandle The serial manager module reading handle pointer.\r\n * @retval kStatus_SerialManager_Success The reading handle is closed.\r\n */\r\nserial_manager_status_t SerialManager_CloseReadHandle(serial_read_handle_t readHandle);\r\n\r\n/*!\r\n * @brief Transmits data with the blocking mode.\r\n *\r\n * This is a blocking function, which polls the sending queue, waits for the sending queue to be empty.\r\n * This function sends data using an interrupt method. The interrupt of the hardware could not be disabled.\r\n * And There can only one buffer for transmission for the writing handle at the same time.\r\n *\r\n * @note The function #SerialManager_WriteBlocking and the function SerialManager_WriteNonBlocking\r\n * cannot be used at the same time.\r\n * And, the function SerialManager_CancelWriting cannot be used to abort the transmission of this function.\r\n *\r\n * @param writeHandle The serial manager module handle pointer.\r\n * @param buffer Start address of the data to write.\r\n * @param length Length of the data to write.\r\n * @retval kStatus_SerialManager_Success Successfully sent all data.\r\n * @retval kStatus_SerialManager_Busy Previous transmission still not finished; data not all sent yet.\r\n * @retval kStatus_SerialManager_Error An error occurred.\r\n */\r\nserial_manager_status_t SerialManager_WriteBlocking(serial_write_handle_t writeHandle,\r\n                                                    uint8_t *buffer,\r\n                                                    uint32_t length);\r\n\r\n/*!\r\n * @brief Reads data with the blocking mode.\r\n *\r\n * This is a blocking function, which polls the receiving buffer, waits for the receiving buffer to be full.\r\n * This function receives data using an interrupt method. The interrupt of the hardware could not be disabled.\r\n * And There can only one buffer for receiving for the reading handle at the same time.\r\n *\r\n * @note The function #SerialManager_ReadBlocking and the function SerialManager_ReadNonBlocking\r\n * cannot be used at the same time.\r\n * And, the function SerialManager_CancelReading cannot be used to abort the transmission of this function.\r\n *\r\n * @param readHandle The serial manager module handle pointer.\r\n * @param buffer Start address of the data to store the received data.\r\n * @param length The length of the data to be received.\r\n * @retval kStatus_SerialManager_Success Successfully received all data.\r\n * @retval kStatus_SerialManager_Busy Previous transmission still not finished; data not all received yet.\r\n * @retval kStatus_SerialManager_Error An error occurred.\r\n */\r\nserial_manager_status_t SerialManager_ReadBlocking(serial_read_handle_t readHandle, uint8_t *buffer, uint32_t length);\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n/*!\r\n * @brief Transmits data with the non-blocking mode.\r\n *\r\n * This is a non-blocking function, which returns directly without waiting for all data to be sent.\r\n * When all data is sent, the module notifies the upper layer through a TX callback function and passes\r\n * the status parameter @ref kStatus_SerialManager_Success.\r\n * This function sends data using an interrupt method. The interrupt of the hardware could not be disabled.\r\n * And There can only one buffer for transmission for the writing handle at the same time.\r\n *\r\n * @note The function #SerialManager_WriteBlocking and the function #SerialManager_WriteNonBlocking\r\n * cannot be used at the same time. And, the TX callback is mandatory before the function could be used.\r\n *\r\n * @param writeHandle The serial manager module handle pointer.\r\n * @param buffer Start address of the data to write.\r\n * @param length Length of the data to write.\r\n * @retval kStatus_SerialManager_Success Successfully sent all data.\r\n * @retval kStatus_SerialManager_Busy Previous transmission still not finished; data not all sent yet.\r\n * @retval kStatus_SerialManager_Error An error occurred.\r\n */\r\nserial_manager_status_t SerialManager_WriteNonBlocking(serial_write_handle_t writeHandle,\r\n                                                       uint8_t *buffer,\r\n                                                       uint32_t length);\r\n\r\n/*!\r\n * @brief Reads data with the non-blocking mode.\r\n *\r\n * This is a non-blocking function, which returns directly without waiting for all data to be received.\r\n * When all data is received, the module driver notifies the upper layer\r\n * through a RX callback function and passes the status parameter @ref kStatus_SerialManager_Success.\r\n * This function receives data using an interrupt method. The interrupt of the hardware could not be disabled.\r\n * And There can only one buffer for receiving for the reading handle at the same time.\r\n *\r\n * @note The function #SerialManager_ReadBlocking and the function #SerialManager_ReadNonBlocking\r\n * cannot be used at the same time. And, the RX callback is mandatory before the function could be used.\r\n *\r\n * @param readHandle The serial manager module handle pointer.\r\n * @param buffer Start address of the data to store the received data.\r\n * @param length The length of the data to be received.\r\n * @retval kStatus_SerialManager_Success Successfully received all data.\r\n * @retval kStatus_SerialManager_Busy Previous transmission still not finished; data not all received yet.\r\n * @retval kStatus_SerialManager_Error An error occurred.\r\n */\r\nserial_manager_status_t SerialManager_ReadNonBlocking(serial_read_handle_t readHandle,\r\n                                                      uint8_t *buffer,\r\n                                                      uint32_t length);\r\n\r\n/*!\r\n * @brief Tries to read data.\r\n *\r\n * The function tries to read data from internal ring buffer. If the ring buffer is not empty, the data will be\r\n * copied from ring buffer to up layer buffer. The copied length is the minimum of the ring buffer and up layer length.\r\n * After the data is copied, the actual data length is passed by the parameter length.\r\n * And There can only one buffer for receiving for the reading handle at the same time.\r\n *\r\n * @param readHandle The serial manager module handle pointer.\r\n * @param buffer Start address of the data to store the received data.\r\n * @param length The length of the data to be received.\r\n * @param receivedLength Length received from the ring buffer directly.\r\n * @retval kStatus_SerialManager_Success Successfully received all data.\r\n * @retval kStatus_SerialManager_Busy Previous transmission still not finished; data not all received yet.\r\n * @retval kStatus_SerialManager_Error An error occurred.\r\n */\r\nserial_manager_status_t SerialManager_TryRead(serial_read_handle_t readHandle,\r\n                                              uint8_t *buffer,\r\n                                              uint32_t length,\r\n                                              uint32_t *receivedLength);\r\n\r\n/*!\r\n * @brief Cancels unfinished send transmission.\r\n *\r\n * The function cancels unfinished send transmission. When the transfer is canceled, the module notifies the upper layer\r\n * through a TX callback function and passes the status parameter @ref kStatus_SerialManager_Canceled.\r\n *\r\n * @note The function #SerialManager_CancelWriting cannot be used to abort the transmission of\r\n * the function #SerialManager_WriteBlocking.\r\n *\r\n * @param writeHandle The serial manager module handle pointer.\r\n * @retval kStatus_SerialManager_Success Get successfully abort the sending.\r\n * @retval kStatus_SerialManager_Error An error occurred.\r\n */\r\nserial_manager_status_t SerialManager_CancelWriting(serial_write_handle_t writeHandle);\r\n\r\n/*!\r\n * @brief Cancels unfinished receive transmission.\r\n *\r\n * The function cancels unfinished receive transmission. When the transfer is canceled, the module notifies the upper\r\n * layer\r\n * through a RX callback function and passes the status parameter @ref kStatus_SerialManager_Canceled.\r\n *\r\n * @note The function #SerialManager_CancelReading cannot be used to abort the transmission of\r\n * the function #SerialManager_ReadBlocking.\r\n *\r\n * @param readHandle The serial manager module handle pointer.\r\n * @retval kStatus_SerialManager_Success Get successfully abort the receiving.\r\n * @retval kStatus_SerialManager_Error An error occurred.\r\n */\r\nserial_manager_status_t SerialManager_CancelReading(serial_read_handle_t readHandle);\r\n\r\n/*!\r\n * @brief Installs a TX callback and callback parameter.\r\n *\r\n * This function is used to install the TX callback and callback parameter for the serial manager module.\r\n * When any status of TX transmission changed, the driver will notify the upper layer by the installed callback\r\n * function. And the status is also passed as status parameter when the callback is called.\r\n *\r\n * @param writeHandle The serial manager module handle pointer.\r\n * @param callback The callback function.\r\n * @param callbackParam The parameter of the callback function.\r\n * @retval kStatus_SerialManager_Success Successfully install the callback.\r\n */\r\nserial_manager_status_t SerialManager_InstallTxCallback(serial_write_handle_t writeHandle,\r\n                                                        serial_manager_callback_t callback,\r\n                                                        void *callbackParam);\r\n\r\n/*!\r\n * @brief Installs a RX callback and callback parameter.\r\n *\r\n * This function is used to install the RX callback and callback parameter for the serial manager module.\r\n * When any status of RX transmission changed, the driver will notify the upper layer by the installed callback\r\n * function. And the status is also passed as status parameter when the callback is called.\r\n *\r\n * @param readHandle The serial manager module handle pointer.\r\n * @param callback The callback function.\r\n * @param callbackParam The parameter of the callback function.\r\n * @retval kStatus_SerialManager_Success Successfully install the callback.\r\n */\r\nserial_manager_status_t SerialManager_InstallRxCallback(serial_read_handle_t readHandle,\r\n                                                        serial_manager_callback_t callback,\r\n                                                        void *callbackParam);\r\n\r\n/*!\r\n * @brief Check if need polling ISR.\r\n *\r\n * This function is used to check if need polling ISR.\r\n *\r\n * @retval TRUE if need polling.\r\n */\r\nstatic inline bool SerialManager_needPollingIsr(void)\r\n{\r\n#if (defined(__DSC__) && defined(__CW__))\r\n    return !(isIRQAllowed());\r\n#elif defined(CPSR_M_Msk)\r\n    return (0x13 == (__get_CPSR() & CPSR_M_Msk));\r\n#elif defined(DAIF_I_BIT)\r\n    return (__get_DAIF() & DAIF_I_BIT);\r\n#elif defined(__XCC__)\r\n    return (xthal_get_interrupt() & xthal_get_intenable());\r\n#else\r\n    return (0U != __get_IPSR());\r\n#endif\r\n}\r\n#endif\r\n\r\n/*!\r\n * @brief Prepares to enter low power consumption.\r\n *\r\n * This function is used to prepare to enter low power consumption.\r\n *\r\n * @param serialHandle The serial manager module handle pointer.\r\n * @retval kStatus_SerialManager_Success Successful operation.\r\n */\r\nserial_manager_status_t SerialManager_EnterLowpower(serial_handle_t serialHandle);\r\n\r\n/*!\r\n * @brief Restores from low power consumption.\r\n *\r\n * This function is used to restore from low power consumption.\r\n *\r\n * @param serialHandle The serial manager module handle pointer.\r\n * @retval kStatus_SerialManager_Success Successful operation.\r\n */\r\nserial_manager_status_t SerialManager_ExitLowpower(serial_handle_t serialHandle);\r\n\r\n/*!\r\n * @brief This function performs initialization of the callbacks structure used to disable lowpower\r\n *          when serial manager is active.\r\n *\r\n *\r\n * @param  pfCallback Pointer to the function structure used to allow/disable lowpower.\r\n *\r\n */\r\nvoid SerialManager_SetLowpowerCriticalCb(const serial_manager_lowpower_critical_CBs_t *pfCallback);\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n/*! @} */\r\n#endif /* __SERIAL_MANAGER_H__ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/serial_manager/fsl_component_serial_port_internal.h",
    "content": "/*\r\n * Copyright 2019-2020, 2023-2024 NXP\r\n * All rights reserved.\r\n *\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef __SERIAL_PORT_INTERNAL_H__\r\n#define __SERIAL_PORT_INTERNAL_H__\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif /* _cplusplus */\r\n\r\n#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))\r\nserial_manager_status_t Serial_UartInit(serial_handle_t serialHandle, void *serialConfig);\r\nserial_manager_status_t Serial_UartDeinit(serial_handle_t serialHandle);\r\nserial_manager_status_t Serial_UartWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);\r\nserial_manager_status_t Serial_UartRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\nserial_manager_status_t Serial_UartCancelWrite(serial_handle_t serialHandle);\r\nserial_manager_status_t Serial_UartInstallTxCallback(serial_handle_t serialHandle,\r\n                                                     serial_manager_callback_t callback,\r\n                                                     void *callbackParam);\r\nserial_manager_status_t Serial_UartInstallRxCallback(serial_handle_t serialHandle,\r\n                                                     serial_manager_callback_t callback,\r\n                                                     void *callbackParam);\r\nvoid Serial_UartIsrFunction(serial_handle_t serialHandle);\r\n#endif\r\nserial_manager_status_t Serial_UartEnterLowpower(serial_handle_t serialHandle);\r\nserial_manager_status_t Serial_UartExitLowpower(serial_handle_t serialHandle);\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))\r\nserial_manager_status_t Serial_UartDmaInit(serial_handle_t serialHandle, void *serialConfig);\r\nserial_manager_status_t Serial_UartDmaDeinit(serial_handle_t serialHandle);\r\nserial_manager_status_t Serial_UartDmaWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\nserial_manager_status_t Serial_UartDmaCancelWrite(serial_handle_t serialHandle);\r\nserial_manager_status_t Serial_UartDmaInstallTxCallback(serial_handle_t serialHandle,\r\n                                                        serial_manager_callback_t callback,\r\n                                                        void *callbackParam);\r\nserial_manager_status_t Serial_UartDmaInstallRxCallback(serial_handle_t serialHandle,\r\n                                                        serial_manager_callback_t callback,\r\n                                                        void *callbackParam);\r\nvoid Serial_UartDmaIsrFunction(serial_handle_t serialHandle);\r\n#endif\r\nserial_manager_status_t Serial_UartDmaEnterLowpower(serial_handle_t serialHandle);\r\nserial_manager_status_t Serial_UartDmaExitLowpower(serial_handle_t serialHandle);\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_RPMSG) && (SERIAL_PORT_TYPE_RPMSG > 0U))\r\nserial_manager_status_t Serial_RpmsgInit(serial_handle_t serialHandle, void *serialConfig);\r\nserial_manager_status_t Serial_RpmsgDeinit(serial_handle_t serialHandle);\r\nserial_manager_status_t Serial_RpmsgWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);\r\nserial_manager_status_t Serial_RpmsgWriteBlocking(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);\r\n#if !(defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\nserial_manager_status_t Serial_RpmsgRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);\r\n#endif\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\nserial_manager_status_t Serial_RpmsgCancelWrite(serial_handle_t serialHandle);\r\nserial_manager_status_t Serial_RpmsgInstallTxCallback(serial_handle_t serialHandle,\r\n                                                      serial_manager_callback_t callback,\r\n                                                      void *callbackParam);\r\nserial_manager_status_t Serial_RpmsgInstallRxCallback(serial_handle_t serialHandle,\r\n                                                      serial_manager_callback_t callback,\r\n                                                      void *callbackParam);\r\n#endif\r\nserial_manager_status_t Serial_RpmsgEnterLowpower(serial_handle_t serialHandle);\r\nserial_manager_status_t Serial_RpmsgExitLowpower(serial_handle_t serialHandle);\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))\r\nserial_manager_status_t Serial_UsbCdcInit(serial_handle_t serialHandle, void *config);\r\nserial_manager_status_t Serial_UsbCdcDeinit(serial_handle_t serialHandle);\r\nserial_manager_status_t Serial_UsbCdcWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);\r\nserial_manager_status_t Serial_UsbCdcRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);\r\nserial_manager_status_t Serial_UsbCdcCancelWrite(serial_handle_t serialHandle);\r\nserial_manager_status_t Serial_UsbCdcInstallTxCallback(serial_handle_t serialHandle,\r\n                                                       serial_manager_callback_t callback,\r\n                                                       void *callbackParam);\r\nserial_manager_status_t Serial_UsbCdcInstallRxCallback(serial_handle_t serialHandle,\r\n                                                       serial_manager_callback_t callback,\r\n                                                       void *callbackParam);\r\nvoid Serial_UsbCdcIsrFunction(serial_handle_t serialHandle);\r\nserial_manager_status_t Serial_UsbCdcGetConnectedStatus(serial_handle_t serialHandle);\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))\r\nserial_manager_status_t Serial_SwoInit(serial_handle_t serialHandle, void *config);\r\nserial_manager_status_t Serial_SwoDeinit(serial_handle_t serialHandle);\r\nserial_manager_status_t Serial_SwoWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);\r\n#if !(defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\nserial_manager_status_t Serial_SwoRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);\r\n#endif\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\nserial_manager_status_t Serial_SwoCancelWrite(serial_handle_t serialHandle);\r\nserial_manager_status_t Serial_SwoInstallTxCallback(serial_handle_t serialHandle,\r\n                                                    serial_manager_callback_t callback,\r\n                                                    void *callbackParam);\r\nserial_manager_status_t Serial_SwoInstallRxCallback(serial_handle_t serialHandle,\r\n                                                    serial_manager_callback_t callback,\r\n                                                    void *callbackParam);\r\nvoid Serial_SwoIsrFunction(serial_handle_t serialHandle);\r\n#endif\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))\r\nserial_manager_status_t Serial_PortVirtualInit(serial_handle_t serialHandle, void *config);\r\nserial_manager_status_t Serial_PortVirtualDeinit(serial_handle_t serialHandle);\r\nserial_manager_status_t Serial_PortVirtualWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);\r\nserial_manager_status_t Serial_PortVirtualRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);\r\nserial_manager_status_t Serial_PortVirtualCancelWrite(serial_handle_t serialHandle);\r\nserial_manager_status_t Serial_PortVirtualInstallTxCallback(serial_handle_t serialHandle,\r\n                                                            serial_manager_callback_t callback,\r\n                                                            void *callbackParam);\r\nserial_manager_status_t Serial_PortVirtualInstallRxCallback(serial_handle_t serialHandle,\r\n                                                            serial_manager_callback_t callback,\r\n                                                            void *callbackParam);\r\nvoid Serial_PortVirtualIsrFunction(serial_handle_t serialHandle);\r\n#endif\r\n#if (defined(SERIAL_PORT_TYPE_SPI_MASTER) && SERIAL_PORT_TYPE_SPI_MASTER > 0U)\r\nserial_manager_status_t Serial_SpiMasterInit(serial_handle_t serialHandle, void *serialConfig);\r\nserial_manager_status_t Serial_SpiMasterDeinit(serial_handle_t serialHandle);\r\nvoid Serial_SpiMasterTxCallback(hal_spi_master_handle_t handle, hal_spi_status_t status, void *callbackParam);\r\nvoid Serial_SpiMasterRxCallback(hal_spi_master_handle_t handle, hal_spi_status_t status, void *callbackParam);\r\nserial_manager_status_t Serial_SpiMasterWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);\r\nserial_manager_status_t Serial_SpiMasterRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\nserial_manager_status_t Serial_SpiMasterInstallTxCallback(serial_handle_t serialHandle,\r\n                                                          serial_manager_callback_t callback,\r\n                                                          void *callbackParam);\r\nserial_manager_status_t Serial_SpiMasterInstallRxCallback(serial_handle_t serialHandle,\r\n                                                          serial_manager_callback_t callback,\r\n                                                          void *callbackParam);\r\nserial_manager_status_t Serial_SpiMasterCancelWrite(serial_handle_t serialHandle);\r\n\r\n#endif\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_SPI_SLAVE) && (SERIAL_PORT_TYPE_SPI_SLAVE > 0U))\r\nserial_manager_status_t Serial_SpiSlaveInit(serial_handle_t serialHandle, void *serialConfig);\r\nserial_manager_status_t Serial_SpiSlaveDeinit(serial_handle_t serialHandle);\r\nvoid Serial_SpiSlaveTxCallback(hal_spi_slave_handle_t handle, hal_spi_status_t status, void *callbackParam);\r\nvoid Serial_SpiSlaveRxCallback(hal_spi_slave_handle_t handle, hal_spi_status_t status, void *callbackParam);\r\nserial_manager_status_t Serial_SpiSlaveWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);\r\nserial_manager_status_t Serial_SpiSlaveRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\nserial_manager_status_t Serial_SpiSlaveInstallTxCallback(serial_handle_t serialHandle,\r\n                                                         serial_manager_callback_t callback,\r\n                                                         void *callbackParam);\r\nserial_manager_status_t Serial_SpiSlaveInstallRxCallback(serial_handle_t serialHandle,\r\n                                                         serial_manager_callback_t callback,\r\n                                                         void *callbackParam);\r\nserial_manager_status_t Serial_SpiSlaveCancelWrite(serial_handle_t serialHandle);\r\n\r\n#endif\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))\r\nserial_manager_status_t Serial_PortBleWuInit(serial_handle_t serialHandle, void *config);\r\nserial_manager_status_t Serial_PortBleWuDeinit(serial_handle_t serialHandle);\r\nserial_manager_status_t Serial_PortBleWuWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);\r\nserial_manager_status_t Serial_PortBleWuRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length);\r\nserial_manager_status_t Serial_PortBleWuCancelWrite(serial_handle_t serialHandle);\r\nserial_manager_status_t Serial_PortBleWuInstallTxCallback(serial_handle_t serialHandle,\r\n                                                          serial_manager_callback_t callback,\r\n                                                          void *callbackParam);\r\nserial_manager_status_t Serial_PortBleWuInstallRxCallback(serial_handle_t serialHandle,\r\n                                                          serial_manager_callback_t callback,\r\n                                                          void *callbackParam);\r\nvoid Serial_PortBleWuIsrFunction(serial_handle_t serialHandle);\r\n#endif\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n#endif /* __SERIAL_PORT_INTERNAL_H__ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/serial_manager/fsl_component_serial_port_uart.c",
    "content": "/*\r\n * Copyright 2018 -2021 NXP\r\n * All rights reserved.\r\n *\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include \"fsl_component_serial_manager.h\"\r\n#include \"fsl_component_serial_port_internal.h\"\r\n\r\n#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U)) || \\\r\n    (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))\r\n#include \"fsl_adapter_uart.h\"\r\n\r\n#include \"fsl_component_serial_port_uart.h\"\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n#ifndef NDEBUG\r\n#if (defined(DEBUG_CONSOLE_ASSERT_DISABLE) && (DEBUG_CONSOLE_ASSERT_DISABLE > 0U))\r\n#undef assert\r\n#define assert(n)\r\n#else\r\n/* MISRA C-2012 Rule 17.2 */\r\n#undef assert\r\n#define assert(n) \\\r\n    while (!(n))  \\\r\n    {             \\\r\n        ;         \\\r\n    }\r\n#endif\r\n#endif\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n#define SERIAL_PORT_UART_RECEIVE_DATA_LENGTH 1U\r\ntypedef struct _serial_uart_send_state\r\n{\r\n    uint8_t *buffer;\r\n    uint32_t length;\r\n    serial_manager_callback_t callback;\r\n    void *callbackParam;\r\n    volatile uint8_t busy;\r\n} serial_uart_send_state_t;\r\n\r\ntypedef struct _serial_uart_recv_state\r\n{\r\n    serial_manager_callback_t callback;\r\n    void *callbackParam;\r\n    volatile uint8_t busy;\r\n    volatile uint8_t rxEnable;\r\n    uint8_t readBuffer[SERIAL_PORT_UART_RECEIVE_DATA_LENGTH];\r\n} serial_uart_recv_state_t;\r\n\r\ntypedef struct _serial_uart_dma_recv_state\r\n{\r\n    serial_manager_callback_t callback;\r\n    void *callbackParam;\r\n    volatile uint8_t busy;\r\n    volatile uint8_t rxEnable;\r\n    uint8_t readBuffer[SERIAL_PORT_UART_DMA_RECEIVE_DATA_LENGTH];\r\n} serial_uart_dma_recv_state_t;\r\n\r\ntypedef struct _serial_uart_block_state\r\n{\r\n    UART_HANDLE_DEFINE(usartHandleBuffer);\r\n} serial_uart_block_state_t;\r\n#endif\r\n\r\ntypedef struct _serial_uart_state\r\n{\r\n    UART_HANDLE_DEFINE(usartHandleBuffer);\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    serial_uart_send_state_t tx;\r\n    serial_uart_recv_state_t rx;\r\n#endif\r\n} serial_uart_state_t;\r\n#endif\r\n#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))\r\n#if (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))\r\ntypedef struct _serial_uart_dma_state\r\n{\r\n    UART_HANDLE_DEFINE(usartHandleBuffer);\r\n    UART_DMA_HANDLE_DEFINE(uartDmaHandle);\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    serial_uart_send_state_t tx;\r\n    serial_uart_dma_recv_state_t rx;\r\n#endif\r\n} serial_uart_dma_state_t;\r\n#endif\r\n#endif\r\n\r\n/*******************************************************************************\r\n * Prototypes\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n * Code\r\n ******************************************************************************/\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\nstatic serial_manager_status_t Serial_UartEnableReceiving(serial_uart_state_t *serialUartHandle)\r\n{\r\n#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r\n    hal_uart_transfer_t transfer;\r\n#endif\r\n    if (1U == serialUartHandle->rx.rxEnable)\r\n    {\r\n        serialUartHandle->rx.busy = 1U;\r\n#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r\n        transfer.data     = &serialUartHandle->rx.readBuffer[0];\r\n        transfer.dataSize = sizeof(serialUartHandle->rx.readBuffer);\r\n        if (kStatus_HAL_UartSuccess !=\r\n            HAL_UartTransferReceiveNonBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), &transfer))\r\n#else\r\n        if (kStatus_HAL_UartSuccess !=\r\n            HAL_UartReceiveNonBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),\r\n                                       &serialUartHandle->rx.readBuffer[0], sizeof(serialUartHandle->rx.readBuffer)))\r\n#endif\r\n        {\r\n            serialUartHandle->rx.busy = 0U;\r\n            return kStatus_SerialManager_Error;\r\n        }\r\n    }\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\n/* UART user callback */\r\nstatic void Serial_UartCallback(hal_uart_handle_t handle, hal_uart_status_t status, void *userData)\r\n{\r\n    serial_uart_state_t *serialUartHandle;\r\n    serial_manager_callback_message_t serialMsg;\r\n\r\n    assert(userData);\r\n    serialUartHandle = (serial_uart_state_t *)userData;\r\n\r\n    if ((hal_uart_status_t)kStatus_HAL_UartRxIdle == status)\r\n    {\r\n#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r\n        (void)HAL_UartTransferAbortReceive(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r\n#else\r\n        (void)HAL_UartAbortReceive(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r\n#endif\r\n        if ((NULL != serialUartHandle->rx.callback))\r\n        {\r\n            serialMsg.buffer = &serialUartHandle->rx.readBuffer[0];\r\n            serialMsg.length = sizeof(serialUartHandle->rx.readBuffer);\r\n            serialUartHandle->rx.callback(serialUartHandle->rx.callbackParam, &serialMsg,\r\n                                          kStatus_SerialManager_Success);\r\n        }\r\n    }\r\n    else if ((hal_uart_status_t)kStatus_HAL_UartTxIdle == status)\r\n    {\r\n        if (0U != serialUartHandle->tx.busy)\r\n        {\r\n            serialUartHandle->tx.busy = 0U;\r\n            if ((NULL != serialUartHandle->tx.callback))\r\n            {\r\n                serialMsg.buffer = serialUartHandle->tx.buffer;\r\n                serialMsg.length = serialUartHandle->tx.length;\r\n                serialUartHandle->tx.callback(serialUartHandle->tx.callbackParam, &serialMsg,\r\n                                              kStatus_SerialManager_Success);\r\n            }\r\n        }\r\n    }\r\n    else\r\n    {\r\n    }\r\n}\r\n#endif\r\n\r\nserial_manager_status_t Serial_UartInit(serial_handle_t serialHandle, void *serialConfig)\r\n{\r\n    serial_uart_state_t *serialUartHandle;\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    serial_port_uart_config_t *uartConfig = (serial_port_uart_config_t *)serialConfig;\r\n#endif\r\n    serial_manager_status_t serialManagerStatus = kStatus_SerialManager_Success;\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r\n#if 0 /* Not used below! */\r\n    hal_uart_transfer_t transfer;\r\n#endif\r\n#endif\r\n#endif\r\n\r\n    assert(serialConfig);\r\n    assert(serialHandle);\r\n    assert(SERIAL_PORT_UART_HANDLE_SIZE >= sizeof(serial_uart_state_t));\r\n\r\n    serialUartHandle    = (serial_uart_state_t *)serialHandle;\r\n    serialManagerStatus = (serial_manager_status_t)HAL_UartInit(\r\n        ((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), (const hal_uart_config_t *)serialConfig);\r\n    assert(kStatus_SerialManager_Success == serialManagerStatus);\r\n    (void)serialManagerStatus;\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    serialUartHandle->rx.rxEnable = uartConfig->enableRx;\r\n#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r\n\r\n    (void)HAL_UartTransferInstallCallback(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),\r\n                                          Serial_UartCallback, serialUartHandle);\r\n#else\r\n    (void)HAL_UartInstallCallback(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), Serial_UartCallback,\r\n                                  serialUartHandle);\r\n#endif\r\n#endif\r\n\r\n    return serialManagerStatus;\r\n}\r\n\r\nserial_manager_status_t Serial_UartDeinit(serial_handle_t serialHandle)\r\n{\r\n    serial_uart_state_t *serialUartHandle;\r\n\r\n    assert(serialHandle);\r\n\r\n    serialUartHandle = (serial_uart_state_t *)serialHandle;\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r\n    (void)HAL_UartTransferAbortReceive(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r\n#else\r\n    (void)HAL_UartAbortReceive(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r\n#endif\r\n#endif\r\n    (void)HAL_UartDeinit(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    serialUartHandle->tx.busy = 0U;\r\n    serialUartHandle->rx.busy = 0U;\r\n#endif\r\n\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n\r\nserial_manager_status_t Serial_UartWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)\r\n{\r\n    serial_uart_state_t *serialUartHandle;\r\n    hal_uart_status_t uartstatus;\r\n#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r\n    hal_uart_transfer_t transfer;\r\n#endif\r\n\r\n    assert(serialHandle);\r\n    assert(buffer);\r\n    assert(length);\r\n\r\n    serialUartHandle = (serial_uart_state_t *)serialHandle;\r\n    if (0U != serialUartHandle->tx.busy)\r\n    {\r\n        return kStatus_SerialManager_Busy;\r\n    }\r\n    serialUartHandle->tx.busy = 1U;\r\n\r\n    serialUartHandle->tx.buffer = buffer;\r\n    serialUartHandle->tx.length = length;\r\n\r\n#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r\n    transfer.data     = buffer;\r\n    transfer.dataSize = length;\r\n    uartstatus =\r\n        HAL_UartTransferSendNonBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), &transfer);\r\n#else\r\n\r\n    uartstatus = HAL_UartSendNonBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), buffer, length);\r\n#endif\r\n    assert(kStatus_HAL_UartSuccess == uartstatus);\r\n    (void)uartstatus;\r\n\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\nserial_manager_status_t Serial_UartRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)\r\n{\r\n    assert(serialHandle);\r\n    (void)buffer;\r\n    (void)length;\r\n    return (serial_manager_status_t)Serial_UartEnableReceiving(serialHandle);\r\n}\r\n\r\n#else\r\n\r\nserial_manager_status_t Serial_UartWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)\r\n{\r\n    serial_uart_state_t *serialUartHandle;\r\n\r\n    assert(serialHandle);\r\n    assert(buffer);\r\n    assert(length);\r\n\r\n    serialUartHandle = (serial_uart_state_t *)serialHandle;\r\n\r\n    return (serial_manager_status_t)HAL_UartSendBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),\r\n                                                         buffer, length);\r\n}\r\n\r\nserial_manager_status_t Serial_UartRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)\r\n{\r\n    serial_uart_state_t *serialUartHandle;\r\n\r\n    assert(serialHandle);\r\n    assert(buffer);\r\n    assert(length);\r\n\r\n    serialUartHandle = (serial_uart_state_t *)serialHandle;\r\n\r\n    return (serial_manager_status_t)HAL_UartReceiveBlocking(\r\n        ((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), buffer, length);\r\n}\r\n\r\n#endif\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\nserial_manager_status_t Serial_UartCancelWrite(serial_handle_t serialHandle)\r\n{\r\n    serial_uart_state_t *serialUartHandle;\r\n    serial_manager_callback_message_t serialMsg;\r\n    uint32_t primask;\r\n    uint8_t isBusy = 0U;\r\n\r\n    assert(serialHandle);\r\n\r\n    serialUartHandle = (serial_uart_state_t *)serialHandle;\r\n\r\n    primask                   = DisableGlobalIRQ();\r\n    isBusy                    = serialUartHandle->tx.busy;\r\n    serialUartHandle->tx.busy = 0U;\r\n    EnableGlobalIRQ(primask);\r\n\r\n#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r\n    (void)HAL_UartTransferAbortSend(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r\n#else\r\n    (void)HAL_UartAbortSend(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r\n#endif\r\n    if (0U != isBusy)\r\n    {\r\n        if ((NULL != serialUartHandle->tx.callback))\r\n        {\r\n            serialMsg.buffer = serialUartHandle->tx.buffer;\r\n            serialMsg.length = serialUartHandle->tx.length;\r\n            serialUartHandle->tx.callback(serialUartHandle->tx.callbackParam, &serialMsg,\r\n                                          kStatus_SerialManager_Canceled);\r\n        }\r\n    }\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\nserial_manager_status_t Serial_UartInstallTxCallback(serial_handle_t serialHandle,\r\n                                                     serial_manager_callback_t callback,\r\n                                                     void *callbackParam)\r\n{\r\n    serial_uart_state_t *serialUartHandle;\r\n\r\n    assert(serialHandle);\r\n\r\n    serialUartHandle = (serial_uart_state_t *)serialHandle;\r\n\r\n    serialUartHandle->tx.callback      = callback;\r\n    serialUartHandle->tx.callbackParam = callbackParam;\r\n\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\nserial_manager_status_t Serial_UartInstallRxCallback(serial_handle_t serialHandle,\r\n                                                     serial_manager_callback_t callback,\r\n                                                     void *callbackParam)\r\n{\r\n    serial_uart_state_t *serialUartHandle;\r\n\r\n    assert(serialHandle);\r\n\r\n    serialUartHandle = (serial_uart_state_t *)serialHandle;\r\n\r\n    serialUartHandle->rx.callback      = callback;\r\n    serialUartHandle->rx.callbackParam = callbackParam;\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    (void)Serial_UartEnableReceiving(serialUartHandle);\r\n#endif\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\nvoid Serial_UartIsrFunction(serial_handle_t serialHandle)\r\n{\r\n    serial_uart_state_t *serialUartHandle;\r\n\r\n    assert(serialHandle);\r\n\r\n    serialUartHandle = (serial_uart_state_t *)serialHandle;\r\n\r\n    HAL_UartIsrFunction(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r\n}\r\n#endif\r\n\r\nserial_manager_status_t Serial_UartEnterLowpower(serial_handle_t serialHandle)\r\n{\r\n    serial_uart_state_t *serialUartHandle;\r\n    hal_uart_status_t uartstatus;\r\n\r\n    assert(serialHandle);\r\n\r\n    serialUartHandle = (serial_uart_state_t *)serialHandle;\r\n\r\n    uartstatus = HAL_UartEnterLowpower(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r\n    assert(kStatus_HAL_UartSuccess == uartstatus);\r\n    (void)uartstatus;\r\n\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\nserial_manager_status_t Serial_UartExitLowpower(serial_handle_t serialHandle)\r\n{\r\n    serial_uart_state_t *serialUartHandle;\r\n    serial_manager_status_t status = kStatus_SerialManager_Success;\r\n    hal_uart_status_t uartstatus;\r\n\r\n    assert(serialHandle);\r\n\r\n    serialUartHandle = (serial_uart_state_t *)serialHandle;\r\n\r\n    uartstatus = HAL_UartExitLowpower(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r\n    assert(kStatus_HAL_UartSuccess == uartstatus);\r\n    (void)uartstatus;\r\n\r\n    return status;\r\n}\r\n\r\n#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))\r\n#if (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\nstatic serial_manager_status_t Serial_UartDmaEnableReceiving(serial_uart_dma_state_t *serialUartHandle)\r\n{\r\n    if (1U == serialUartHandle->rx.rxEnable)\r\n    {\r\n        serialUartHandle->rx.busy = 1U;\r\n        if (kStatus_HAL_UartDmaSuccess !=\r\n            HAL_UartDMATransferReceive(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),\r\n                                       &serialUartHandle->rx.readBuffer[0], sizeof(serialUartHandle->rx.readBuffer),\r\n                                       false))\r\n\r\n        {\r\n            serialUartHandle->rx.busy = 0U;\r\n            return kStatus_SerialManager_Error;\r\n        }\r\n    }\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\n/* UART user callback */\r\nstatic void Serial_UartDmaCallback(hal_uart_dma_handle_t handle, hal_dma_callback_msg_t *dmaMsg, void *callbackParam)\r\n{\r\n    serial_uart_dma_state_t *serialUartHandle;\r\n    serial_manager_callback_message_t cb_msg;\r\n\r\n    assert(callbackParam);\r\n    serialUartHandle = (serial_uart_dma_state_t *)callbackParam;\r\n\r\n    if (((hal_uart_dma_status_t)kStatus_HAL_UartDmaRxIdle == dmaMsg->status) ||\r\n        (kStatus_HAL_UartDmaIdleline == dmaMsg->status))\r\n    {\r\n        if ((NULL != serialUartHandle->rx.callback))\r\n        {\r\n            cb_msg.buffer = dmaMsg->data;\r\n            cb_msg.length = dmaMsg->dataSize;\r\n            serialUartHandle->rx.callback(serialUartHandle->rx.callbackParam, &cb_msg, kStatus_SerialManager_Success);\r\n        }\r\n\r\n        if (kStatus_HAL_UartDmaSuccess ==\r\n            HAL_UartDMATransferReceive(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),\r\n                                       &serialUartHandle->rx.readBuffer[0], sizeof(serialUartHandle->rx.readBuffer),\r\n                                       false))\r\n        {\r\n            serialUartHandle->rx.busy = 1U;\r\n        }\r\n    }\r\n    else if (kStatus_HAL_UartDmaTxIdle == dmaMsg->status)\r\n    {\r\n        if (0U != serialUartHandle->tx.busy)\r\n        {\r\n            serialUartHandle->tx.busy = 0U;\r\n            if ((NULL != serialUartHandle->tx.callback))\r\n            {\r\n                cb_msg.buffer = dmaMsg->data;\r\n                cb_msg.length = dmaMsg->dataSize;\r\n                serialUartHandle->tx.callback(serialUartHandle->tx.callbackParam, &cb_msg,\r\n                                              kStatus_SerialManager_Success);\r\n            }\r\n        }\r\n    }\r\n    else\r\n    {\r\n    }\r\n}\r\n\r\n#endif\r\n\r\nserial_manager_status_t Serial_UartDmaInit(serial_handle_t serialHandle, void *serialConfig)\r\n{\r\n    serial_uart_dma_state_t *serialUartHandle;\r\n#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))\r\n    serial_port_uart_dma_config_t *uartConfig = (serial_port_uart_dma_config_t *)serialConfig;\r\n#endif\r\n    serial_manager_status_t serialManagerStatus = kStatus_SerialManager_Success;\r\n\r\n    assert(serialConfig);\r\n    assert(serialHandle);\r\n\r\n    assert(SERIAL_PORT_UART_DMA_HANDLE_SIZE >= sizeof(serial_uart_dma_state_t));\r\n\r\n    serialUartHandle    = (serial_uart_dma_state_t *)serialHandle;\r\n    serialManagerStatus = (serial_manager_status_t)HAL_UartInit(\r\n        ((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), (const hal_uart_config_t *)serialConfig);\r\n    assert(kStatus_SerialManager_Success == serialManagerStatus);\r\n    (void)serialManagerStatus;\r\n\r\n#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))\r\n\r\n    hal_uart_dma_config_t dmaConfig;\r\n\r\n    dmaConfig.uart_instance             = uartConfig->instance;\r\n    dmaConfig.dma_instance              = uartConfig->dma_instance;\r\n    dmaConfig.rx_channel                = uartConfig->rx_channel;\r\n    dmaConfig.tx_channel                = uartConfig->tx_channel;\r\n    dmaConfig.dma_mux_configure         = uartConfig->dma_mux_configure;\r\n    dmaConfig.dma_channel_mux_configure = uartConfig->dma_channel_mux_configure;\r\n\r\n    // Init uart dma\r\n    (void)HAL_UartDMAInit(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),\r\n                          (hal_uart_dma_handle_t *)serialUartHandle->uartDmaHandle, &dmaConfig);\r\n\r\n#endif\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n\r\n    serialUartHandle->rx.rxEnable = uartConfig->enableRx;\r\n    (void)HAL_UartDMATransferInstallCallback(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),\r\n                                             Serial_UartDmaCallback, serialUartHandle);\r\n\r\n#endif\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    serialManagerStatus = Serial_UartDmaEnableReceiving(serialUartHandle);\r\n#endif\r\n\r\n    return serialManagerStatus;\r\n}\r\n\r\nserial_manager_status_t Serial_UartDmaDeinit(serial_handle_t serialHandle)\r\n{\r\n    serial_uart_dma_state_t *serialUartHandle;\r\n\r\n    assert(serialHandle);\r\n\r\n    serialUartHandle = (serial_uart_dma_state_t *)serialHandle;\r\n\r\n    (void)HAL_UartDMAAbortReceive(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r\n\r\n    (void)HAL_UartDeinit(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r\n    (void)HAL_UartDMADeinit(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n    serialUartHandle->tx.busy = 0U;\r\n    serialUartHandle->rx.busy = 0U;\r\n#endif\r\n\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n\r\nserial_manager_status_t Serial_UartDmaWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)\r\n{\r\n    serial_uart_dma_state_t *serialUartHandle;\r\n    hal_uart_status_t uartstatus;\r\n\r\n    assert(serialHandle);\r\n    assert(buffer);\r\n    assert(length);\r\n\r\n    serialUartHandle = (serial_uart_dma_state_t *)serialHandle;\r\n\r\n    if (0U != serialUartHandle->tx.busy)\r\n    {\r\n        return kStatus_SerialManager_Busy;\r\n    }\r\n    serialUartHandle->tx.busy = 1U;\r\n\r\n    serialUartHandle->tx.buffer = buffer;\r\n    serialUartHandle->tx.length = length;\r\n\r\n    uartstatus = (hal_uart_status_t)HAL_UartDMATransferSend(\r\n        ((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), buffer, length);\r\n\r\n    assert(kStatus_HAL_UartSuccess == uartstatus);\r\n    (void)uartstatus;\r\n\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\n#endif\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\nserial_manager_status_t Serial_UartDmaCancelWrite(serial_handle_t serialHandle)\r\n{\r\n    serial_uart_dma_state_t *serialUartHandle;\r\n    serial_manager_callback_message_t serialMsg;\r\n    uint32_t primask;\r\n    uint8_t isBusy = 0U;\r\n\r\n    assert(serialHandle);\r\n\r\n    serialUartHandle = (serial_uart_dma_state_t *)serialHandle;\r\n\r\n    primask                   = DisableGlobalIRQ();\r\n    isBusy                    = serialUartHandle->tx.busy;\r\n    serialUartHandle->tx.busy = 0U;\r\n    EnableGlobalIRQ(primask);\r\n\r\n    (void)HAL_UartDMAAbortSend(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r\n\r\n    if (0U != isBusy)\r\n    {\r\n        if ((NULL != serialUartHandle->tx.callback))\r\n        {\r\n            serialMsg.buffer = serialUartHandle->tx.buffer;\r\n            serialMsg.length = serialUartHandle->tx.length;\r\n            serialUartHandle->tx.callback(serialUartHandle->tx.callbackParam, &serialMsg,\r\n                                          kStatus_SerialManager_Canceled);\r\n        }\r\n    }\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\nserial_manager_status_t Serial_UartDmaInstallTxCallback(serial_handle_t serialHandle,\r\n                                                        serial_manager_callback_t callback,\r\n                                                        void *callbackParam)\r\n{\r\n    serial_uart_dma_state_t *serialUartHandle;\r\n\r\n    assert(serialHandle);\r\n\r\n    serialUartHandle = (serial_uart_dma_state_t *)serialHandle;\r\n\r\n    serialUartHandle->tx.callback      = callback;\r\n    serialUartHandle->tx.callbackParam = callbackParam;\r\n\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\nserial_manager_status_t Serial_UartDmaInstallRxCallback(serial_handle_t serialHandle,\r\n                                                        serial_manager_callback_t callback,\r\n                                                        void *callbackParam)\r\n{\r\n    serial_uart_dma_state_t *serialUartHandle;\r\n\r\n    assert(serialHandle);\r\n\r\n    serialUartHandle = (serial_uart_dma_state_t *)serialHandle;\r\n\r\n    serialUartHandle->rx.callback      = callback;\r\n    serialUartHandle->rx.callbackParam = callbackParam;\r\n\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\nvoid Serial_UartDmaIsrFunction(serial_handle_t serialHandle)\r\n{\r\n    serial_uart_dma_state_t *serialUartHandle;\r\n\r\n    assert(serialHandle);\r\n\r\n    serialUartHandle = (serial_uart_dma_state_t *)serialHandle;\r\n\r\n    HAL_UartIsrFunction(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r\n}\r\n#endif\r\n\r\nserial_manager_status_t Serial_UartDmaEnterLowpower(serial_handle_t serialHandle)\r\n{\r\n    serial_uart_dma_state_t *serialUartHandle;\r\n    hal_uart_status_t uartstatus;\r\n\r\n    assert(serialHandle);\r\n\r\n    serialUartHandle = (serial_uart_dma_state_t *)serialHandle;\r\n\r\n    uartstatus = HAL_UartEnterLowpower(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r\n    assert(kStatus_HAL_UartSuccess == uartstatus);\r\n    (void)uartstatus;\r\n\r\n    return kStatus_SerialManager_Success;\r\n}\r\n\r\nserial_manager_status_t Serial_UartDmaExitLowpower(serial_handle_t serialHandle)\r\n{\r\n    serial_uart_dma_state_t *serialUartHandle;\r\n    serial_manager_status_t status = kStatus_SerialManager_Success;\r\n    hal_uart_status_t uartstatus;\r\n\r\n    assert(serialHandle);\r\n\r\n    serialUartHandle = (serial_uart_dma_state_t *)serialHandle;\r\n\r\n    uartstatus = HAL_UartExitLowpower(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r\n    assert(kStatus_HAL_UartSuccess == uartstatus);\r\n    (void)uartstatus;\r\n\r\n    return status;\r\n}\r\n#endif\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/serial_manager/fsl_component_serial_port_uart.h",
    "content": "/*\r\n * Copyright 2018 NXP\r\n * All rights reserved.\r\n *\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef __SERIAL_PORT_UART_H__\r\n#define __SERIAL_PORT_UART_H__\r\n\r\n#include \"fsl_adapter_uart.h\"\r\n\r\n/*!\r\n * @addtogroup serial_port_uart\r\n * @ingroup serialmanager\r\n * @{\r\n */\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n/*! @brief serial port uart handle size*/\r\n\r\n#ifndef SERIAL_PORT_UART_DMA_RECEIVE_DATA_LENGTH\r\n#define SERIAL_PORT_UART_DMA_RECEIVE_DATA_LENGTH (64U)\r\n#endif\r\n\r\n#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r\n\r\n#define SERIAL_PORT_UART_HANDLE_SIZE       (76U + HAL_UART_HANDLE_SIZE)\r\n#define SERIAL_PORT_UART_BLOCK_HANDLE_SIZE (HAL_UART_BLOCK_HANDLE_SIZE)\r\n#else\r\n#define SERIAL_PORT_UART_HANDLE_SIZE (HAL_UART_HANDLE_SIZE)\r\n#endif\r\n\r\n#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))\r\n#define SERIAL_PORT_UART_DMA_HANDLE_SIZE (76U + HAL_UART_DMA_HANDLE_SIZE + 132U)\r\n#endif\r\n\r\n#ifndef SERIAL_USE_CONFIGURE_STRUCTURE\r\n#define SERIAL_USE_CONFIGURE_STRUCTURE (0U) /*!< Enable or disable the confgure structure pointer */\r\n#endif\r\n\r\n/*! @brief serial port uart parity mode*/\r\ntypedef enum _serial_port_uart_parity_mode\r\n{\r\n    kSerialManager_UartParityDisabled = 0x0U, /*!< Parity disabled */\r\n    kSerialManager_UartParityEven     = 0x2U, /*!< Parity even enabled */\r\n    kSerialManager_UartParityOdd      = 0x3U, /*!< Parity odd enabled */\r\n} serial_port_uart_parity_mode_t;\r\n\r\n/*! @brief serial port uart stop bit count*/\r\ntypedef enum _serial_port_uart_stop_bit_count\r\n{\r\n    kSerialManager_UartOneStopBit = 0U, /*!< One stop bit */\r\n    kSerialManager_UartTwoStopBit = 1U, /*!< Two stop bits */\r\n} serial_port_uart_stop_bit_count_t;\r\n\r\ntypedef struct _serial_port_uart_config\r\n{\r\n    uint32_t clockRate;                             /*!< clock rate  */\r\n    uint32_t baudRate;                              /*!< baud rate  */\r\n    serial_port_uart_parity_mode_t parityMode;      /*!< Parity mode, disabled (default), even, odd */\r\n    serial_port_uart_stop_bit_count_t stopBitCount; /*!< Number of stop bits, 1 stop bit (default) or 2 stop bits  */\r\n\r\n    uint8_t enableRx;                               /*!< Enable RX */\r\n    uint8_t enableTx;                               /*!< Enable TX */\r\n    uint8_t enableRxRTS;                            /*!< Enable RX RTS */\r\n    uint8_t enableTxCTS;                            /*!< Enable TX CTS */\r\n    uint8_t instance;                               /*!< Instance (0 - UART0, 1 - UART1, ...), detail information\r\n                                                         please refer to the SOC corresponding RM. */\r\n\r\n#if (defined(HAL_UART_ADAPTER_FIFO) && (HAL_UART_ADAPTER_FIFO > 0u))\r\n    uint8_t txFifoWatermark;\r\n    uint8_t rxFifoWatermark;\r\n#endif\r\n} serial_port_uart_config_t;\r\n#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))\r\ntypedef struct _serial_port_uart_dma_config\r\n{\r\n    uint32_t clockRate;                             /*!< clock rate  */\r\n    uint32_t baudRate;                              /*!< baud rate  */\r\n    serial_port_uart_parity_mode_t parityMode;      /*!< Parity mode, disabled (default), even, odd */\r\n    serial_port_uart_stop_bit_count_t stopBitCount; /*!< Number of stop bits, 1 stop bit (default) or 2 stop bits  */\r\n\r\n    uint8_t enableRx;                               /*!< Enable RX */\r\n    uint8_t enableTx;                               /*!< Enable TX */\r\n    uint8_t enableRxRTS;                            /*!< Enable RX RTS */\r\n    uint8_t enableTxCTS;                            /*!< Enable TX CTS */\r\n    uint8_t instance;                               /*!< Instance (0 - UART0, 1 - UART1, ...), detail information\r\n                                                         please refer to the SOC corresponding RM. */\r\n#if (defined(HAL_UART_ADAPTER_FIFO) && (HAL_UART_ADAPTER_FIFO > 0u))\r\n    uint8_t txFifoWatermark;\r\n    uint8_t rxFifoWatermark;\r\n#endif\r\n    uint8_t dma_instance;\r\n    uint8_t rx_channel;\r\n    uint8_t tx_channel;\r\n    void *dma_mux_configure;\r\n    void *dma_channel_mux_configure;\r\n\r\n} serial_port_uart_dma_config_t;\r\n#endif\r\n/*! @} */\r\n#endif /* __SERIAL_PORT_UART_H__ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/uart/fsl_adapter_uart.h",
    "content": "/*\r\n * Copyright 2018-2020 NXP\r\n * All rights reserved.\r\n *\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef __HAL_UART_ADAPTER_H__\r\n#define __HAL_UART_ADAPTER_H__\r\n\r\n#include \"fsl_common.h\"\r\n#if defined(SDK_OS_FREE_RTOS)\r\n#include \"FreeRTOS.h\"\r\n#endif\r\n\r\n/*!\r\n * @addtogroup UART_Adapter\r\n * @{\r\n */\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*! @brief Enable or disable UART adapter non-blocking mode (1 - enable, 0 - disable) */\r\n#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING\r\n#define UART_ADAPTER_NON_BLOCKING_MODE (1U)\r\n#else\r\n#ifndef SERIAL_MANAGER_NON_BLOCKING_MODE\r\n#define UART_ADAPTER_NON_BLOCKING_MODE (0U)\r\n#else\r\n#define UART_ADAPTER_NON_BLOCKING_MODE SERIAL_MANAGER_NON_BLOCKING_MODE\r\n#endif\r\n#endif\r\n\r\n#if defined(__GIC_PRIO_BITS)\r\n#ifndef HAL_UART_ISR_PRIORITY\r\n#define HAL_UART_ISR_PRIORITY (25U)\r\n#endif\r\n#else\r\n#if defined(configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY)\r\n#ifndef HAL_UART_ISR_PRIORITY\r\n#define HAL_UART_ISR_PRIORITY (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY)\r\n#endif\r\n#else\r\n/* The default value 3 is used to support different ARM Core, such as CM0P, CM4, CM7, and CM33, etc.\r\n * The minimum number of priority bits implemented in the NVIC is 2 on these SOCs. The value of mininum\r\n * priority is 3 (2^2 - 1). So, the default value is 3.\r\n */\r\n#ifndef HAL_UART_ISR_PRIORITY\r\n#define HAL_UART_ISR_PRIORITY (3U)\r\n#endif\r\n#endif\r\n#endif\r\n\r\n#ifndef HAL_UART_ADAPTER_LOWPOWER\r\n#define HAL_UART_ADAPTER_LOWPOWER (0U)\r\n#endif /* HAL_UART_ADAPTER_LOWPOWER */\r\n\r\n/*! @brief Enable or disable uart hardware FIFO mode (1 - enable, 0 - disable) */\r\n#ifndef HAL_UART_ADAPTER_FIFO\r\n#define HAL_UART_ADAPTER_FIFO (1U)\r\n#endif /* HAL_UART_ADAPTER_FIFO */\r\n\r\n#if (defined(SERIAL_PORT_TYPE_UART_DMA) && (SERIAL_PORT_TYPE_UART_DMA > 0U))\r\n#ifndef HAL_UART_DMA_ENABLE\r\n#define HAL_UART_DMA_ENABLE (1U)\r\n#endif\r\n#endif\r\n\r\n#ifndef HAL_UART_DMA_ENABLE\r\n#define HAL_UART_DMA_ENABLE (0U)\r\n#endif /* HAL_UART_DMA_ENABLE */\r\n\r\n/*! @brief Enable or disable uart DMA adapter int mode (1 - enable, 0 - disable) */\r\n#ifndef HAL_UART_DMA_INIT_ENABLE\r\n#define HAL_UART_DMA_INIT_ENABLE (1U)\r\n#endif /* HAL_SPI_MASTER_DMA_INIT_ENABLE */\r\n\r\n/*! @brief Definition of uart dma adapter software idleline detection timeout value in ms. */\r\n#ifndef HAL_UART_DMA_IDLELINE_TIMEOUT\r\n#define HAL_UART_DMA_IDLELINE_TIMEOUT (1U)\r\n#endif /* HAL_UART_DMA_IDLELINE_TIMEOUT */\r\n\r\n/*! @brief Definition of uart adapter handle size. */\r\n#if (defined(UART_ADAPTER_NON_BLOCKING_MODE) && (UART_ADAPTER_NON_BLOCKING_MODE > 0U))\r\n#define HAL_UART_HANDLE_SIZE       (92U + HAL_UART_ADAPTER_LOWPOWER * 16U + HAL_UART_DMA_ENABLE * 4U)\r\n#define HAL_UART_BLOCK_HANDLE_SIZE (8U + HAL_UART_ADAPTER_LOWPOWER * 16U + HAL_UART_DMA_ENABLE * 4U)\r\n#else\r\n#define HAL_UART_HANDLE_SIZE (8U + HAL_UART_ADAPTER_LOWPOWER * 16U + HAL_UART_DMA_ENABLE * 4U)\r\n#endif\r\n\r\n/*! @brief Definition of uart dma adapter handle size. */\r\n#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))\r\n#if (defined(FSL_FEATURE_SOC_DMA_COUNT) && (FSL_FEATURE_SOC_DMA_COUNT > 0U))\r\n#define HAL_UART_DMA_HANDLE_SIZE (124U + HAL_UART_ADAPTER_LOWPOWER * 36U)\r\n#elif (defined(FSL_FEATURE_SOC_EDMA_COUNT) && (FSL_FEATURE_SOC_EDMA_COUNT > 0U))\r\n#define HAL_UART_DMA_HANDLE_SIZE (140U + HAL_UART_ADAPTER_LOWPOWER * 36U)\r\n#else\r\n#error This SOC does not have DMA or EDMA available!\r\n#endif\r\n#endif /* HAL_UART_DMA_ENABLE */\r\n\r\n/*!\r\n * @brief Defines the uart handle\r\n *\r\n * This macro is used to define a 4 byte aligned uart handle.\r\n * Then use \"(hal_uart_handle_t)name\" to get the uart handle.\r\n *\r\n * The macro should be global and could be optional. You could also define uart handle by yourself.\r\n *\r\n * This is an example,\r\n * @code\r\n * UART_HANDLE_DEFINE(uartHandle);\r\n * @endcode\r\n *\r\n * @param name The name string of the uart handle.\r\n */\r\n#define UART_HANDLE_DEFINE(name) uint32_t name[((HAL_UART_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]\r\n\r\n#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))\r\n#define UART_DMA_HANDLE_DEFINE(name) \\\r\n    uint32_t name[((HAL_UART_DMA_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))]\r\n#endif\r\n\r\n/*! @brief Whether enable transactional function of the UART. (0 - disable, 1 - enable) */\r\n#ifndef HAL_UART_TRANSFER_MODE\r\n#define HAL_UART_TRANSFER_MODE (0U)\r\n#endif\r\n\r\n/*! @brief The handle of uart adapter. */\r\ntypedef void *hal_uart_handle_t;\r\n\r\n/*! @brief The handle of uart dma adapter. */\r\ntypedef void *hal_uart_dma_handle_t;\r\n\r\n/*! @brief UART status */\r\ntypedef enum _hal_uart_status\r\n{\r\n    kStatus_HAL_UartSuccess = kStatus_Success,                       /*!< Successfully */\r\n    kStatus_HAL_UartTxBusy  = MAKE_STATUS(kStatusGroup_HAL_UART, 1), /*!< TX busy */\r\n    kStatus_HAL_UartRxBusy  = MAKE_STATUS(kStatusGroup_HAL_UART, 2), /*!< RX busy */\r\n    kStatus_HAL_UartTxIdle  = MAKE_STATUS(kStatusGroup_HAL_UART, 3), /*!< HAL UART transmitter is idle. */\r\n    kStatus_HAL_UartRxIdle  = MAKE_STATUS(kStatusGroup_HAL_UART, 4), /*!< HAL UART receiver is idle */\r\n    kStatus_HAL_UartBaudrateNotSupport =\r\n        MAKE_STATUS(kStatusGroup_HAL_UART, 5), /*!< Baudrate is not support in current clock source */\r\n    kStatus_HAL_UartProtocolError = MAKE_STATUS(\r\n        kStatusGroup_HAL_UART,\r\n        6),                                                        /*!< Error occurs for Noise, Framing, Parity, etc.\r\n                                                                        For transactional transfer, The up layer needs to abort the transfer and then starts again */\r\n    kStatus_HAL_UartError = MAKE_STATUS(kStatusGroup_HAL_UART, 7), /*!< Error occurs on HAL UART */\r\n} hal_uart_status_t;\r\n\r\n/*! @brief UART parity mode. */\r\ntypedef enum _hal_uart_parity_mode\r\n{\r\n    kHAL_UartParityDisabled = 0x0U, /*!< Parity disabled */\r\n    kHAL_UartParityEven     = 0x2U, /*!< Parity even enabled */\r\n    kHAL_UartParityOdd      = 0x3U, /*!< Parity odd enabled */\r\n} hal_uart_parity_mode_t;\r\n\r\n/*! @brief UART stop bit count. */\r\ntypedef enum _hal_uart_stop_bit_count\r\n{\r\n    kHAL_UartOneStopBit = 0U, /*!< One stop bit */\r\n    kHAL_UartTwoStopBit = 1U, /*!< Two stop bits */\r\n} hal_uart_stop_bit_count_t;\r\n\r\n/*! @brief UART configuration structure. */\r\ntypedef struct _hal_uart_config\r\n{\r\n    uint32_t srcClock_Hz;                   /*!< Source clock */\r\n    uint32_t baudRate_Bps;                  /*!< Baud rate  */\r\n    hal_uart_parity_mode_t parityMode;      /*!< Parity mode, disabled (default), even, odd */\r\n    hal_uart_stop_bit_count_t stopBitCount; /*!< Number of stop bits, 1 stop bit (default) or 2 stop bits  */\r\n    uint8_t enableRx;                       /*!< Enable RX */\r\n    uint8_t enableTx;                       /*!< Enable TX */\r\n    uint8_t enableRxRTS;                    /*!< Enable RX RTS */\r\n    uint8_t enableTxCTS;                    /*!< Enable TX CTS */\r\n    uint8_t instance; /*!< Instance (0 - UART0, 1 - UART1, ...), detail information please refer to the\r\n                           SOC corresponding RM.\r\n                           Invalid instance value will cause initialization failure. */\r\n#if (defined(HAL_UART_ADAPTER_FIFO) && (HAL_UART_ADAPTER_FIFO > 0u))\r\n    uint8_t txFifoWatermark;\r\n    uint8_t rxFifoWatermark;\r\n#endif\r\n} hal_uart_config_t;\r\n\r\n#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))\r\n/*! @brief UART DMA status */\r\ntypedef enum _hal_uart_dma_status\r\n{\r\n    kStatus_HAL_UartDmaSuccess  = 0U,\r\n    kStatus_HAL_UartDmaRxIdle   = (1U << 1U),\r\n    kStatus_HAL_UartDmaRxBusy   = (1U << 2U),\r\n    kStatus_HAL_UartDmaTxIdle   = (1U << 3U),\r\n    kStatus_HAL_UartDmaTxBusy   = (1U << 4U),\r\n    kStatus_HAL_UartDmaIdleline = (1U << 5U),\r\n    kStatus_HAL_UartDmaError    = (1U << 6U),\r\n} hal_uart_dma_status_t;\r\n\r\ntypedef struct _dma_mux_configure_t\r\n{\r\n    union\r\n    {\r\n        struct\r\n        {\r\n            uint8_t dma_mux_instance;\r\n            uint32_t rx_request;\r\n            uint32_t tx_request;\r\n        } dma_dmamux_configure;\r\n    };\r\n} dma_mux_configure_t;\r\ntypedef struct _dma_channel_mux_configure_t\r\n{\r\n    union\r\n    {\r\n        struct\r\n        {\r\n            uint32_t dma_rx_channel_mux;\r\n            uint32_t dma_tx_channel_mux;\r\n        } dma_dmamux_configure;\r\n    };\r\n} dma_channel_mux_configure_t;\r\n\r\ntypedef struct _hal_uart_dma_config_t\r\n{\r\n    uint8_t uart_instance;\r\n    uint8_t dma_instance;\r\n    uint8_t rx_channel;\r\n    uint8_t tx_channel;\r\n    void *dma_mux_configure;\r\n    void *dma_channel_mux_configure;\r\n} hal_uart_dma_config_t;\r\n#endif /* HAL_UART_DMA_ENABLE */\r\n\r\n/*! @brief UART transfer callback function. */\r\ntypedef void (*hal_uart_transfer_callback_t)(hal_uart_handle_t handle, hal_uart_status_t status, void *callbackParam);\r\n\r\n#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))\r\ntypedef struct _dma_callback_msg\r\n{\r\n    hal_uart_dma_status_t status;\r\n    uint8_t *data;\r\n    uint32_t dataSize;\r\n} hal_dma_callback_msg_t;\r\n\r\n/*! @brief UART transfer callback function. */\r\ntypedef void (*hal_uart_dma_transfer_callback_t)(hal_uart_dma_handle_t handle,\r\n                                                 hal_dma_callback_msg_t *msg,\r\n                                                 void *callbackParam);\r\n#endif /* HAL_UART_DMA_ENABLE */\r\n\r\n/*! @brief UART transfer structure. */\r\ntypedef struct _hal_uart_transfer\r\n{\r\n    uint8_t *data;   /*!< The buffer of data to be transfer.*/\r\n    size_t dataSize; /*!< The byte count to be transfer. */\r\n} hal_uart_transfer_t;\r\n\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif /* _cplusplus */\r\n\r\n/*!\r\n * @name Initialization and deinitialization\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief Initializes a UART instance with the UART handle and the user configuration structure.\r\n *\r\n * This function configures the UART module with user-defined settings. The user can configure the configuration\r\n * structure. The parameter handle is a pointer to point to a memory space of size #HAL_UART_HANDLE_SIZE allocated by\r\n * the caller. Example below shows how to use this API to configure the UART.\r\n *  @code\r\n *   UART_HANDLE_DEFINE(g_UartHandle);\r\n *   hal_uart_config_t config;\r\n *   config.srcClock_Hz = 48000000;\r\n *   config.baudRate_Bps = 115200U;\r\n *   config.parityMode = kHAL_UartParityDisabled;\r\n *   config.stopBitCount = kHAL_UartOneStopBit;\r\n *   config.enableRx = 1;\r\n *   config.enableTx = 1;\r\n *   config.enableRxRTS = 0;\r\n *   config.enableTxCTS = 0;\r\n *   config.instance = 0;\r\n *   HAL_UartInit((hal_uart_handle_t)g_UartHandle, &config);\r\n *  @endcode\r\n *\r\n * @param handle Pointer to point to a memory space of size #HAL_UART_HANDLE_SIZE allocated by the caller.\r\n * The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.\r\n * You can define the handle in the following two ways:\r\n * #UART_HANDLE_DEFINE(handle);\r\n * or\r\n * uint32_t handle[((HAL_UART_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))];\r\n * @param uart_config Pointer to user-defined configuration structure.\r\n * @retval kStatus_HAL_UartBaudrateNotSupport Baudrate is not support in current clock source.\r\n * @retval kStatus_HAL_UartSuccess UART initialization succeed\r\n */\r\nhal_uart_status_t HAL_UartInit(hal_uart_handle_t handle, const hal_uart_config_t *uart_config);\r\n\r\n/*!\r\n * @brief Deinitializes a UART instance.\r\n *\r\n * This function waits for TX complete, disables TX and RX, and disables the UART clock.\r\n *\r\n * @param handle UART handle pointer.\r\n * @retval kStatus_HAL_UartSuccess UART de-initialization succeed\r\n */\r\nhal_uart_status_t HAL_UartDeinit(hal_uart_handle_t handle);\r\n\r\n/*! @}*/\r\n\r\n/*!\r\n * @name Blocking bus Operations\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief Reads RX data register using a blocking method.\r\n *\r\n * This function polls the RX register, waits for the RX register to be full or for RX FIFO to\r\n * have data, and reads data from the RX register.\r\n *\r\n * @note The function #HAL_UartReceiveBlocking and the function HAL_UartTransferReceiveNonBlocking\r\n * cannot be used at the same time.\r\n * And, the function HAL_UartTransferAbortReceive cannot be used to abort the transmission of this function.\r\n *\r\n * @param handle UART handle pointer.\r\n * @param data Start address of the buffer to store the received data.\r\n * @param length Size of the buffer.\r\n * @retval kStatus_HAL_UartError An error occurred while receiving data.\r\n * @retval kStatus_HAL_UartParityError A parity error occurred while receiving data.\r\n * @retval kStatus_HAL_UartSuccess Successfully received all data.\r\n */\r\nhal_uart_status_t HAL_UartReceiveBlocking(hal_uart_handle_t handle, uint8_t *data, size_t length);\r\n\r\n/*!\r\n * @brief Writes to the TX register using a blocking method.\r\n *\r\n * This function polls the TX register, waits for the TX register to be empty or for the TX FIFO\r\n * to have room and writes data to the TX buffer.\r\n *\r\n * @note The function #HAL_UartSendBlocking and the function HAL_UartTransferSendNonBlocking\r\n * cannot be used at the same time.\r\n * And, the function HAL_UartTransferAbortSend cannot be used to abort the transmission of this function.\r\n *\r\n * @param handle UART handle pointer.\r\n * @param data Start address of the data to write.\r\n * @param length Size of the data to write.\r\n * @retval kStatus_HAL_UartSuccess Successfully sent all data.\r\n */\r\nhal_uart_status_t HAL_UartSendBlocking(hal_uart_handle_t handle, const uint8_t *data, size_t length);\r\n\r\n/*! @}*/\r\n\r\n#if (defined(UART_ADAPTER_NON_BLOCKING_MODE) && (UART_ADAPTER_NON_BLOCKING_MODE > 0U))\r\n#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r\n\r\n/*!\r\n * @name Transactional\r\n * @note The transactional API and the functional API cannot be used at the same time. The macro\r\n * #HAL_UART_TRANSFER_MODE is used to set which one will be used. If #HAL_UART_TRANSFER_MODE is zero, the\r\n * functional API with non-blocking mode will be used. Otherwise, transactional API will be used.\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief Installs a callback and callback parameter.\r\n *\r\n * This function is used to install the callback and callback parameter for UART module.\r\n * When any status of the UART changed, the driver will notify the upper layer by the installed callback\r\n * function. And the status is also passed as status parameter when the callback is called.\r\n *\r\n * @param handle UART handle pointer.\r\n * @param callback The callback function.\r\n * @param callbackParam The parameter of the callback function.\r\n * @retval kStatus_HAL_UartSuccess Successfully install the callback.\r\n */\r\nhal_uart_status_t HAL_UartTransferInstallCallback(hal_uart_handle_t handle,\r\n                                                  hal_uart_transfer_callback_t callback,\r\n                                                  void *callbackParam);\r\n\r\n/*!\r\n * @brief Receives a buffer of data using an interrupt method.\r\n *\r\n * This function receives data using an interrupt method. This is a non-blocking function, which\r\n * returns directly without waiting for all data to be received.\r\n * The receive request is saved by the UART driver.\r\n * When the new data arrives, the receive request is serviced first.\r\n * When all data is received, the UART driver notifies the upper layer\r\n * through a callback function and passes the status parameter @ref kStatus_HAL_UartRxIdle.\r\n *\r\n * @note The function #HAL_UartReceiveBlocking and the function #HAL_UartTransferReceiveNonBlocking\r\n * cannot be used at the same time.\r\n *\r\n * @param handle UART handle pointer.\r\n * @param transfer UART transfer structure, see #hal_uart_transfer_t.\r\n * @retval kStatus_HAL_UartSuccess Successfully queue the transfer into transmit queue.\r\n * @retval kStatus_HAL_UartRxBusy Previous receive request is not finished.\r\n * @retval kStatus_HAL_UartError An error occurred.\r\n */\r\nhal_uart_status_t HAL_UartTransferReceiveNonBlocking(hal_uart_handle_t handle, hal_uart_transfer_t *transfer);\r\n\r\n/*!\r\n * @brief Transmits a buffer of data using the interrupt method.\r\n *\r\n * This function sends data using an interrupt method. This is a non-blocking function, which\r\n * returns directly without waiting for all data to be written to the TX register. When\r\n * all data is written to the TX register in the ISR, the UART driver calls the callback\r\n * function and passes the @ref kStatus_HAL_UartTxIdle as status parameter.\r\n *\r\n * @note The function #HAL_UartSendBlocking and the function #HAL_UartTransferSendNonBlocking\r\n * cannot be used at the same time.\r\n *\r\n * @param handle UART handle pointer.\r\n * @param transfer UART transfer structure. See #hal_uart_transfer_t.\r\n * @retval kStatus_HAL_UartSuccess Successfully start the data transmission.\r\n * @retval kStatus_HAL_UartTxBusy Previous transmission still not finished; data not all written to TX register yet.\r\n * @retval kStatus_HAL_UartError An error occurred.\r\n */\r\nhal_uart_status_t HAL_UartTransferSendNonBlocking(hal_uart_handle_t handle, hal_uart_transfer_t *transfer);\r\n\r\n/*!\r\n * @brief Gets the number of bytes that have been received.\r\n *\r\n * This function gets the number of bytes that have been received.\r\n *\r\n * @param handle UART handle pointer.\r\n * @param count Receive bytes count.\r\n * @retval kStatus_HAL_UartError An error occurred.\r\n * @retval kStatus_Success Get successfully through the parameter \\p count.\r\n */\r\nhal_uart_status_t HAL_UartTransferGetReceiveCount(hal_uart_handle_t handle, uint32_t *count);\r\n\r\n/*!\r\n * @brief Gets the number of bytes written to the UART TX register.\r\n *\r\n * This function gets the number of bytes written to the UART TX\r\n * register by using the interrupt method.\r\n *\r\n * @param handle UART handle pointer.\r\n * @param count Send bytes count.\r\n * @retval kStatus_HAL_UartError An error occurred.\r\n * @retval kStatus_Success Get successfully through the parameter \\p count.\r\n */\r\nhal_uart_status_t HAL_UartTransferGetSendCount(hal_uart_handle_t handle, uint32_t *count);\r\n\r\n/*!\r\n * @brief Aborts the interrupt-driven data receiving.\r\n *\r\n * This function aborts the interrupt-driven data receiving. The user can get the remainBytes to know\r\n * how many bytes are not received yet.\r\n *\r\n * @note The function #HAL_UartTransferAbortReceive cannot be used to abort the transmission of\r\n * the function #HAL_UartReceiveBlocking.\r\n *\r\n * @param handle UART handle pointer.\r\n * @retval kStatus_Success Get successfully abort the receiving.\r\n */\r\nhal_uart_status_t HAL_UartTransferAbortReceive(hal_uart_handle_t handle);\r\n\r\n/*!\r\n * @brief Aborts the interrupt-driven data sending.\r\n *\r\n * This function aborts the interrupt-driven data sending. The user can get the remainBytes to find out\r\n * how many bytes are not sent out.\r\n *\r\n * @note The function #HAL_UartTransferAbortSend cannot be used to abort the transmission of\r\n * the function #HAL_UartSendBlocking.\r\n *\r\n * @param handle UART handle pointer.\r\n * @retval kStatus_Success Get successfully abort the sending.\r\n */\r\nhal_uart_status_t HAL_UartTransferAbortSend(hal_uart_handle_t handle);\r\n\r\n/*! @}*/\r\n\r\n#else\r\n\r\n/*!\r\n * @name Functional API with non-blocking mode.\r\n * @note The functional API and the transactional API cannot be used at the same time. The macro\r\n * #HAL_UART_TRANSFER_MODE is used to set which one will be used. If #HAL_UART_TRANSFER_MODE is zero, the\r\n * functional API with non-blocking mode will be used. Otherwise, transactional API will be used.\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief Installs a callback and callback parameter.\r\n *\r\n * This function is used to install the callback and callback parameter for UART module.\r\n * When non-blocking sending or receiving finished, the adapter will notify the upper layer by the installed callback\r\n * function. And the status is also passed as status parameter when the callback is called.\r\n *\r\n * @param handle UART handle pointer.\r\n * @param callback The callback function.\r\n * @param callbackParam The parameter of the callback function.\r\n * @retval kStatus_HAL_UartSuccess Successfully install the callback.\r\n */\r\nhal_uart_status_t HAL_UartInstallCallback(hal_uart_handle_t handle,\r\n                                          hal_uart_transfer_callback_t callback,\r\n                                          void *callbackParam);\r\n\r\n/*!\r\n * @brief Receives a buffer of data using an interrupt method.\r\n *\r\n * This function receives data using an interrupt method. This is a non-blocking function, which\r\n * returns directly without waiting for all data to be received.\r\n * The receive request is saved by the UART adapter.\r\n * When the new data arrives, the receive request is serviced first.\r\n * When all data is received, the UART adapter notifies the upper layer\r\n * through a callback function and passes the status parameter @ref kStatus_HAL_UartRxIdle.\r\n *\r\n * @note The function #HAL_UartReceiveBlocking and the function #HAL_UartReceiveNonBlocking\r\n * cannot be used at the same time.\r\n *\r\n * @param handle UART handle pointer.\r\n * @param data Start address of the data to write.\r\n * @param length Size of the data to write.\r\n * @retval kStatus_HAL_UartSuccess Successfully queue the transfer into transmit queue.\r\n * @retval kStatus_HAL_UartRxBusy Previous receive request is not finished.\r\n * @retval kStatus_HAL_UartError An error occurred.\r\n */\r\nhal_uart_status_t HAL_UartReceiveNonBlocking(hal_uart_handle_t handle, uint8_t *data, size_t length);\r\n\r\n/*!\r\n * @brief Transmits a buffer of data using the interrupt method.\r\n *\r\n * This function sends data using an interrupt method. This is a non-blocking function, which\r\n * returns directly without waiting for all data to be written to the TX register. When\r\n * all data is written to the TX register in the ISR, the UART driver calls the callback\r\n * function and passes the @ref kStatus_HAL_UartTxIdle as status parameter.\r\n *\r\n * @note The function #HAL_UartSendBlocking and the function #HAL_UartSendNonBlocking\r\n * cannot be used at the same time.\r\n *\r\n * @param handle UART handle pointer.\r\n * @param data Start address of the data to write.\r\n * @param length Size of the data to write.\r\n * @retval kStatus_HAL_UartSuccess Successfully start the data transmission.\r\n * @retval kStatus_HAL_UartTxBusy Previous transmission still not finished; data not all written to TX register yet.\r\n * @retval kStatus_HAL_UartError An error occurred.\r\n */\r\nhal_uart_status_t HAL_UartSendNonBlocking(hal_uart_handle_t handle, uint8_t *data, size_t length);\r\n\r\n/*!\r\n * @brief Gets the number of bytes that have been received.\r\n *\r\n * This function gets the number of bytes that have been received.\r\n *\r\n * @param handle UART handle pointer.\r\n * @param reCount Receive bytes count.\r\n * @retval kStatus_HAL_UartError An error occurred.\r\n * @retval kStatus_Success Get successfully through the parameter \\p count.\r\n */\r\nhal_uart_status_t HAL_UartGetReceiveCount(hal_uart_handle_t handle, uint32_t *reCount);\r\n\r\n/*!\r\n * @brief Gets the number of bytes written to the UART TX register.\r\n *\r\n * This function gets the number of bytes written to the UART TX\r\n * register by using the interrupt method.\r\n *\r\n * @param handle UART handle pointer.\r\n * @param seCount Send bytes count.\r\n * @retval kStatus_HAL_UartError An error occurred.\r\n * @retval kStatus_Success Get successfully through the parameter \\p count.\r\n */\r\nhal_uart_status_t HAL_UartGetSendCount(hal_uart_handle_t handle, uint32_t *seCount);\r\n\r\n/*!\r\n * @brief Aborts the interrupt-driven data receiving.\r\n *\r\n * This function aborts the interrupt-driven data receiving. The user can get the remainBytes to know\r\n * how many bytes are not received yet.\r\n *\r\n * @note The function #HAL_UartAbortReceive cannot be used to abort the transmission of\r\n * the function #HAL_UartReceiveBlocking.\r\n *\r\n * @param handle UART handle pointer.\r\n * @retval kStatus_Success Get successfully abort the receiving.\r\n */\r\nhal_uart_status_t HAL_UartAbortReceive(hal_uart_handle_t handle);\r\n\r\n/*!\r\n * @brief Aborts the interrupt-driven data sending.\r\n *\r\n * This function aborts the interrupt-driven data sending. The user can get the remainBytes to find out\r\n * how many bytes are not sent out.\r\n *\r\n * @note The function #HAL_UartAbortSend cannot be used to abort the transmission of\r\n * the function #HAL_UartSendBlocking.\r\n *\r\n * @param handle UART handle pointer.\r\n * @retval kStatus_Success Get successfully abort the sending.\r\n */\r\nhal_uart_status_t HAL_UartAbortSend(hal_uart_handle_t handle);\r\n\r\n/*! @}*/\r\n\r\n#endif\r\n#endif\r\n\r\n#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))\r\n\r\n/*!\r\n * @brief Initializes a UART dma instance with the UART dma handle and the user configuration structure.\r\n *\r\n * This function configures the UART dma module with user-defined settings. The user can configure the configuration\r\n * structure. The parameter handle is a pointer to point to a memory space of size #HAL_UART_DMA_HANDLE_SIZE allocated\r\n * by the caller. Example below shows how to use this API to configure the UART.\r\n *  @code\r\n *\r\n *  Init TimerManager, only used in UART without Idleline interrupt\r\n *  timer_config_t timerConfig;\r\n *  timerConfig.srcClock_Hz    = 16000000;\r\n *  timerConfig.instance       = 0;\r\n *  TM_Init(&timerConfig);\r\n *\r\n *  Init the DMA module\r\n *  DMA_Init(DMA0);\r\n *\r\n *  Define a uart dma handle\r\n *  UART_HANDLE_DEFINE(g_uartHandle);\r\n *  UART_DMA_HANDLE_DEFINE(g_UartDmaHandle);\r\n *\r\n *  Configure uart settings\r\n *  hal_uart_config_t uartConfig;\r\n *  uartConfig.srcClock_Hz  = 48000000;\r\n *  uartConfig.baudRate_Bps = 115200;\r\n *  uartConfig.parityMode   = kHAL_UartParityDisabled;\r\n *  uartConfig.stopBitCount = kHAL_UartOneStopBit;\r\n *  uartConfig.enableRx     = 1;\r\n *  uartConfig.enableTx     = 1;\r\n *  uartConfig.enableRxRTS  = 0;\r\n *  uartConfig.enableTxCTS  = 0;\r\n *  uartConfig.instance     = 0;\r\n *\r\n *  Init uart\r\n *  HAL_UartInit((hal_uart_handle_t *)g_uartHandle, &uartConfig);\r\n *\r\n *  Configure uart dma settings\r\n *  hal_uart_dma_config_t dmaConfig;\r\n *  dmaConfig.uart_instance = 0;\r\n *  dmaConfig.dma_instance  = 0;\r\n *  dmaConfig.rx_channel    = 0;\r\n *  dmaConfig.tx_channel    = 1;\r\n *\r\n *  Init uart dma\r\n *  HAL_UartDMAInit((hal_uart_handle_t *)g_uartHandle, (hal_uart_dma_handle_t *)g_uartDmaHandle, &dmaConfig);\r\n *  @endcode\r\n *\r\n * @param handle UART handle pointer.\r\n * @param dmaHandle Pointer to point to a memory space of size #HAL_UART_DMA_HANDLE_SIZE allocated by the caller.\r\n * The handle should be 4 byte aligned, because unaligned access doesn't be supported on some devices.\r\n * You can define the handle in the following two ways:\r\n * #UART_DMA_HANDLE_DEFINE(handle);\r\n * or\r\n * uint32_t handle[((HAL_UART_DMA_HANDLE_SIZE + sizeof(uint32_t) - 1U) / sizeof(uint32_t))];\r\n * @param dmaConfig Pointer to user-defined configuration structure.\r\n * @retval kStatus_HAL_UartDmaError UART dma initialization failed.\r\n * @retval kStatus_HAL_UartDmaSuccess UART dma initialization succeed.\r\n */\r\nhal_uart_dma_status_t HAL_UartDMAInit(hal_uart_handle_t handle,\r\n                                      hal_uart_dma_handle_t dmaHandle,\r\n                                      hal_uart_dma_config_t *dmaConfig);\r\n\r\n/*!\r\n * @brief Deinitializes a UART DMA instance.\r\n *\r\n * This function will abort uart dma receive/send transfer and deinitialize UART.\r\n *\r\n * @param handle UART handle pointer.\r\n * @retval kStatus_HAL_UartDmaSuccess UART DMA de-initialization succeed\r\n */\r\nhal_uart_dma_status_t HAL_UartDMADeinit(hal_uart_handle_t handle);\r\n\r\n/*!\r\n * @brief Installs a callback and callback parameter.\r\n *\r\n * This function is used to install the callback and callback parameter for UART DMA module.\r\n * When any status of the UART DMA changed, the driver will notify the upper layer by the installed callback\r\n * function. And the status is also passed as status parameter when the callback is called.\r\n *\r\n * @param handle UART handle pointer.\r\n * @param callback The callback function.\r\n * @param callbackParam The parameter of the callback function.\r\n * @retval kStatus_HAL_UartDmaSuccess Successfully install the callback.\r\n */\r\nhal_uart_dma_status_t HAL_UartDMATransferInstallCallback(hal_uart_handle_t handle,\r\n                                                         hal_uart_dma_transfer_callback_t callback,\r\n                                                         void *callbackParam);\r\n\r\n/*!\r\n * @brief Receives a buffer of data using an dma method.\r\n *\r\n * This function receives data using an dma method. This is a non-blocking function, which\r\n * returns directly without waiting for all data to be received.\r\n * The receive request is saved by the UART DMA driver.\r\n * When all data is received, the UART DMA adapter notifies the upper layer\r\n * through a callback function and passes the status parameter @ref kStatus_HAL_UartDmaRxIdle.\r\n *\r\n * When an idleline is detected, the UART DMA adapter notifies the upper layer through a callback function,\r\n * and passes the status parameter @ref kStatus_HAL_UartDmaIdleline. For the UARTs without hardware idleline\r\n * interrupt(like usart), it will use a software idleline detection method with the help of TimerManager.\r\n *\r\n * When the soc support cache, uplayer should do cache maintain operations for transfer buffer before call this API.\r\n *\r\n * @param handle UART handle pointer.\r\n * @param data data Start address of the buffer to store the received data.\r\n * @param length Size of the buffer.\r\n * @param receiveAll Idleline interrupt will not end transfer process if set true.\r\n * @retval kStatus_HAL_UartDmaSuccess Successfully start the data receive.\r\n * @retval kStatus_HAL_UartDmaRxBusy Previous receive request is not finished.\r\n */\r\nhal_uart_dma_status_t HAL_UartDMATransferReceive(hal_uart_handle_t handle,\r\n                                                 uint8_t *data,\r\n                                                 size_t length,\r\n                                                 bool receiveAll);\r\n\r\n/*!\r\n * @brief Transmits a buffer of data using an dma method.\r\n *\r\n * This function sends data using an dma method. This is a non-blocking function, which\r\n * returns directly without waiting for all data to be written to the TX register. When\r\n * all data is written to the TX register by DMA, the UART DMA driver calls the callback\r\n * function and passes the @ref kStatus_HAL_UartDmaTxIdle as status parameter.\r\n *\r\n * When the soc support cache, uplayer should do cache maintain operations for transfer buffer before call this API.\r\n *\r\n * @param handle UART handle pointer.\r\n * @param data data Start address of the data to write.\r\n * @param length Size of the data to write.\r\n * @retval kStatus_HAL_UartDmaSuccess Successfully start the data transmission.\r\n * @retval kStatus_HAL_UartDmaTxBusy Previous send request is not finished.\r\n */\r\nhal_uart_dma_status_t HAL_UartDMATransferSend(hal_uart_handle_t handle, uint8_t *data, size_t length);\r\n\r\n/*!\r\n * @brief Gets the number of bytes that have been received.\r\n *\r\n * This function gets the number of bytes that have been received.\r\n *\r\n * @param handle UART handle pointer.\r\n * @param reCount Receive bytes count.\r\n * @retval kStatus_HAL_UartDmaError An error occurred.\r\n * @retval kStatus_HAL_UartDmaSuccess Get successfully through the parameter \\p reCount.\r\n */\r\nhal_uart_dma_status_t HAL_UartDMAGetReceiveCount(hal_uart_handle_t handle, uint32_t *reCount);\r\n\r\n/*!\r\n * @brief Gets the number of bytes written to the UART TX register.\r\n *\r\n * This function gets the number of bytes written to the UART TX\r\n * register by using the DMA method.\r\n *\r\n * @param handle UART handle pointer.\r\n * @param seCount Send bytes count.\r\n * @retval kStatus_HAL_UartDmaError An error occurred.\r\n * @retval kStatus_HAL_UartDmaSuccess Get successfully through the parameter \\p seCount.\r\n */\r\nhal_uart_dma_status_t HAL_UartDMAGetSendCount(hal_uart_handle_t handle, uint32_t *seCount);\r\n\r\n/*!\r\n * @brief Aborts the DMA-driven data receiving.\r\n *\r\n * This function aborts the DMA-driven data receiving.\r\n *\r\n * @param handle UART handle pointer.\r\n * @retval kStatus_HAL_UartDmaSuccess Get successfully abort the receiving.\r\n */\r\nhal_uart_dma_status_t HAL_UartDMAAbortReceive(hal_uart_handle_t handle);\r\n\r\n/*!\r\n * @brief Aborts the DMA-driven data sending.\r\n *\r\n * This function aborts the DMA-driven data sending.\r\n *\r\n * @param handle UART handle pointer.\r\n * @retval kStatus_Success Get successfully abort the sending.\r\n */\r\nhal_uart_dma_status_t HAL_UartDMAAbortSend(hal_uart_handle_t handle);\r\n#endif /* HAL_UART_DMA_ENABLE */\r\n\r\n/*!\r\n * @brief Prepares to enter low power consumption.\r\n *\r\n * This function is used to prepare to enter low power consumption.\r\n *\r\n * @param handle UART handle pointer.\r\n * @retval kStatus_HAL_UartSuccess Successful operation.\r\n * @retval kStatus_HAL_UartError An error occurred.\r\n */\r\nhal_uart_status_t HAL_UartEnterLowpower(hal_uart_handle_t handle);\r\n\r\n/*!\r\n * @brief Restores from low power consumption.\r\n *\r\n * This function is used to restore from low power consumption.\r\n *\r\n * @param handle UART handle pointer.\r\n * @retval kStatus_HAL_UartSuccess Successful operation.\r\n * @retval kStatus_HAL_UartError An error occurred.\r\n */\r\nhal_uart_status_t HAL_UartExitLowpower(hal_uart_handle_t handle);\r\n\r\n#if (defined(UART_ADAPTER_NON_BLOCKING_MODE) && (UART_ADAPTER_NON_BLOCKING_MODE > 0U))\r\n/*!\r\n * @brief UART IRQ handle function.\r\n *\r\n * This function handles the UART transmit and receive IRQ request.\r\n *\r\n * @param handle UART handle pointer.\r\n */\r\nvoid HAL_UartIsrFunction(hal_uart_handle_t handle);\r\n#endif\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n/*! @}*/\r\n#endif /* __HAL_UART_ADAPTER_H__ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/uart/fsl_adapter_usart.c",
    "content": "/*\r\n * Copyright 2018 NXP\r\n * All rights reserved.\r\n *\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include \"fsl_common.h\"\r\n#include \"fsl_usart.h\"\r\n#include \"fsl_flexcomm.h\"\r\n\r\n#include \"fsl_adapter_uart.h\"\r\n\r\n#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))\r\n#include \"fsl_component_timer_manager.h\"\r\n#include \"fsl_usart_dma.h\"\r\n#endif /* HAL_UART_DMA_ENABLE */\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n#ifndef NDEBUG\r\n#if (defined(DEBUG_CONSOLE_ASSERT_DISABLE) && (DEBUG_CONSOLE_ASSERT_DISABLE > 0U))\r\n#undef assert\r\n#define assert(n)\r\n#endif\r\n#endif\r\n\r\n#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))\r\n/*! @brief uart RX state structure. */\r\ntypedef struct _hal_uart_dma_receive_state\r\n{\r\n    uint8_t *volatile buffer;\r\n    volatile uint32_t bufferLength;\r\n    volatile uint32_t bufferSofar;\r\n    volatile uint32_t timeout;\r\n    volatile bool receiveAll;\r\n} hal_uart_dma_receive_state_t;\r\n\r\n/*! @brief uart TX state structure. */\r\ntypedef struct _hal_uart_dma_send_state\r\n{\r\n    uint8_t *volatile buffer;\r\n    volatile uint32_t bufferLength;\r\n    volatile uint32_t bufferSofar;\r\n    volatile uint32_t timeout;\r\n} hal_uart_dma_send_state_t;\r\n\r\ntypedef struct _hal_uart_dma_state\r\n{\r\n    struct _hal_uart_dma_state *next;\r\n    uint8_t instance; /* USART instance */\r\n    hal_uart_dma_transfer_callback_t dma_callback;\r\n    void *dma_callback_param;\r\n    usart_dma_handle_t dmaHandle;\r\n    dma_handle_t txDmaHandle;\r\n    dma_handle_t rxDmaHandle;\r\n    hal_uart_dma_receive_state_t dma_rx;\r\n    hal_uart_dma_send_state_t dma_tx;\r\n} hal_uart_dma_state_t;\r\n\r\ntypedef struct _uart_dma_list\r\n{\r\n    TIMER_MANAGER_HANDLE_DEFINE(timerManagerHandle);\r\n    hal_uart_dma_state_t *dma_list;\r\n    volatile int8_t activeCount;\r\n} hal_uart_dma_list_t;\r\n\r\nstatic hal_uart_dma_list_t s_dmaHandleList;\r\n#endif /* HAL_UART_DMA_ENABLE */\r\n\r\n#if (defined(UART_ADAPTER_NON_BLOCKING_MODE) && (UART_ADAPTER_NON_BLOCKING_MODE > 0U))\r\n/*! @brief uart RX state structure. */\r\ntypedef struct _hal_uart_receive_state\r\n{\r\n    volatile uint8_t *buffer;\r\n    volatile uint32_t bufferLength;\r\n    volatile uint32_t bufferSofar;\r\n} hal_uart_receive_state_t;\r\n\r\n/*! @brief uart TX state structure. */\r\ntypedef struct _hal_uart_send_state\r\n{\r\n    volatile uint8_t *buffer;\r\n    volatile uint32_t bufferLength;\r\n    volatile uint32_t bufferSofar;\r\n} hal_uart_send_state_t;\r\n#endif\r\n/*! @brief uart state structure. */\r\ntypedef struct _hal_uart_state\r\n{\r\n#if (defined(UART_ADAPTER_NON_BLOCKING_MODE) && (UART_ADAPTER_NON_BLOCKING_MODE > 0U))\r\n    hal_uart_transfer_callback_t callback;\r\n    void *callbackParam;\r\n#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r\n    usart_handle_t hardwareHandle;\r\n#endif\r\n    hal_uart_receive_state_t rx;\r\n    hal_uart_send_state_t tx;\r\n#endif\r\n    uint8_t instance;\r\n#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))\r\n    hal_uart_dma_state_t *dmaHandle;\r\n#endif /* HAL_UART_DMA_ENABLE */\r\n#if (defined(HAL_UART_ADAPTER_LOWPOWER) && (HAL_UART_ADAPTER_LOWPOWER > 0U))\r\n    hal_uart_config_t config;\r\n#endif\r\n} hal_uart_state_t;\r\n\r\n/*******************************************************************************\r\n * Prototypes\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n * Variables\r\n ******************************************************************************/\r\nstatic USART_Type *const s_UsartAdapterBase[] = USART_BASE_PTRS;\r\n\r\n#if (defined(UART_ADAPTER_NON_BLOCKING_MODE) && (UART_ADAPTER_NON_BLOCKING_MODE > 0U))\r\n\r\n#if !(defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r\n/* Array of USART IRQ number. */\r\nstatic const IRQn_Type s_UsartIRQ[] = USART_IRQS;\r\n#endif\r\n\r\n#endif\r\n\r\n/*******************************************************************************\r\n * Code\r\n ******************************************************************************/\r\n\r\n#if ((defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U)) || \\\r\n     (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U)))\r\nstatic hal_uart_status_t HAL_UartGetStatus(status_t status)\r\n{\r\n    hal_uart_status_t uartStatus = kStatus_HAL_UartError;\r\n    switch (status)\r\n    {\r\n        case kStatus_Success:\r\n            uartStatus = kStatus_HAL_UartSuccess;\r\n            break;\r\n        case kStatus_USART_TxBusy:\r\n            uartStatus = kStatus_HAL_UartTxBusy;\r\n            break;\r\n        case kStatus_USART_RxBusy:\r\n            uartStatus = kStatus_HAL_UartRxBusy;\r\n            break;\r\n        case kStatus_USART_TxIdle:\r\n            uartStatus = kStatus_HAL_UartTxIdle;\r\n            break;\r\n        case kStatus_USART_RxIdle:\r\n            uartStatus = kStatus_HAL_UartRxIdle;\r\n            break;\r\n        case kStatus_USART_BaudrateNotSupport:\r\n            uartStatus = kStatus_HAL_UartBaudrateNotSupport;\r\n            break;\r\n        case kStatus_USART_NoiseError:\r\n        case kStatus_USART_FramingError:\r\n        case kStatus_USART_ParityError:\r\n            uartStatus = kStatus_HAL_UartProtocolError;\r\n            break;\r\n        default:\r\n            /* This comments for MISRA C-2012 Rule 16.4 */\r\n            break;\r\n    }\r\n    return uartStatus;\r\n}\r\n#else\r\nstatic hal_uart_status_t HAL_UartGetStatus(status_t status)\r\n{\r\n    if (kStatus_Success == status)\r\n    {\r\n        return kStatus_HAL_UartSuccess;\r\n    }\r\n    else\r\n    {\r\n        return kStatus_HAL_UartError;\r\n    }\r\n}\r\n#endif\r\n\r\n#if (defined(UART_ADAPTER_NON_BLOCKING_MODE) && (UART_ADAPTER_NON_BLOCKING_MODE > 0U))\r\n\r\n#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r\nstatic void HAL_UartCallback(USART_Type *base, usart_handle_t *handle, status_t status, void *callbackParam)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    hal_uart_status_t uartStatus = HAL_UartGetStatus(status);\r\n    assert(callbackParam);\r\n\r\n    uartHandle = (hal_uart_state_t *)callbackParam;\r\n\r\n    if (kStatus_HAL_UartProtocolError == uartStatus)\r\n    {\r\n        if (0U != uartHandle->hardwareHandle.rxDataSize)\r\n        {\r\n            uartStatus = kStatus_HAL_UartError;\r\n        }\r\n    }\r\n\r\n    if (NULL != uartHandle->callback)\r\n    {\r\n        uartHandle->callback(uartHandle, uartStatus, uartHandle->callbackParam);\r\n    }\r\n}\r\n\r\n#else\r\nstatic void HAL_UartInterruptHandle(USART_Type *base, void *handle)\r\n{\r\n    hal_uart_state_t *uartHandle = (hal_uart_state_t *)handle;\r\n    uint32_t status;\r\n    uint8_t instance;\r\n\r\n    if (NULL == uartHandle)\r\n    {\r\n        return;\r\n    }\r\n    instance = uartHandle->instance;\r\n\r\n    status = USART_GetStatusFlags(s_UsartAdapterBase[instance]);\r\n\r\n    /* Receive data register full */\r\n    if ((0U != (USART_FIFOSTAT_RXNOTEMPTY_MASK & status)) &&\r\n        (0U != (USART_GetEnabledInterrupts(s_UsartAdapterBase[instance]) & USART_FIFOINTENSET_RXLVL_MASK)))\r\n    {\r\n        if (NULL != uartHandle->rx.buffer)\r\n        {\r\n            uartHandle->rx.buffer[uartHandle->rx.bufferSofar++] = USART_ReadByte(s_UsartAdapterBase[instance]);\r\n            if (uartHandle->rx.bufferSofar >= uartHandle->rx.bufferLength)\r\n            {\r\n                USART_DisableInterrupts(s_UsartAdapterBase[instance],\r\n                                        USART_FIFOINTENCLR_RXLVL_MASK | USART_FIFOINTENCLR_RXERR_MASK);\r\n                uartHandle->rx.buffer = NULL;\r\n                if (NULL != uartHandle->callback)\r\n                {\r\n                    uartHandle->callback(uartHandle, kStatus_HAL_UartRxIdle, uartHandle->callbackParam);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    /* Send data register empty and the interrupt is enabled. */\r\n    if ((0U != (USART_FIFOSTAT_TXNOTFULL_MASK & status)) &&\r\n        (0U != (USART_GetEnabledInterrupts(s_UsartAdapterBase[instance]) & USART_FIFOINTENSET_TXLVL_MASK)))\r\n    {\r\n        if (NULL != uartHandle->tx.buffer)\r\n        {\r\n            USART_WriteByte(s_UsartAdapterBase[instance], uartHandle->tx.buffer[uartHandle->tx.bufferSofar++]);\r\n            if (uartHandle->tx.bufferSofar >= uartHandle->tx.bufferLength)\r\n            {\r\n                USART_DisableInterrupts(s_UsartAdapterBase[instance], USART_FIFOINTENCLR_TXLVL_MASK);\r\n                uartHandle->tx.buffer = NULL;\r\n                if (NULL != uartHandle->callback)\r\n                {\r\n                    uartHandle->callback(uartHandle, kStatus_HAL_UartTxIdle, uartHandle->callbackParam);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n#if 1\r\n    USART_ClearStatusFlags(s_UsartAdapterBase[instance], status);\r\n#endif\r\n}\r\n\r\nstatic void HAL_UartInterruptHandle_Wapper(void *base, void *handle)\r\n{\r\n    HAL_UartInterruptHandle((USART_Type *)base, handle);\r\n}\r\n#endif\r\n\r\n#endif\r\n\r\nstatic hal_uart_status_t HAL_UartInitCommon(hal_uart_handle_t handle, const hal_uart_config_t *config)\r\n{\r\n    usart_config_t usartConfig;\r\n    status_t status;\r\n\r\n    assert(handle);\r\n    assert(config);\r\n    assert(config->instance < (sizeof(s_UsartAdapterBase) / sizeof(USART_Type *)));\r\n    assert(s_UsartAdapterBase[config->instance]);\r\n    assert(HAL_UART_HANDLE_SIZE >= sizeof(hal_uart_state_t));\r\n\r\n    USART_GetDefaultConfig(&usartConfig);\r\n    usartConfig.baudRate_Bps = config->baudRate_Bps;\r\n\r\n    if ((0U != config->enableRxRTS) || (0U != config->enableTxCTS))\r\n    {\r\n        usartConfig.enableHardwareFlowControl = true;\r\n    }\r\n\r\n    if (kHAL_UartParityEven == config->parityMode)\r\n    {\r\n        usartConfig.parityMode = kUSART_ParityEven;\r\n    }\r\n    else if (kHAL_UartParityOdd == config->parityMode)\r\n    {\r\n        usartConfig.parityMode = kUSART_ParityOdd;\r\n    }\r\n    else\r\n    {\r\n        usartConfig.parityMode = kUSART_ParityDisabled;\r\n    }\r\n\r\n    if (kHAL_UartTwoStopBit == config->stopBitCount)\r\n    {\r\n        usartConfig.stopBitCount = kUSART_TwoStopBit;\r\n    }\r\n    else\r\n    {\r\n        usartConfig.stopBitCount = kUSART_OneStopBit;\r\n    }\r\n    usartConfig.enableRx    = (bool)config->enableRx;\r\n    usartConfig.enableTx    = (bool)config->enableTx;\r\n    usartConfig.txWatermark = kUSART_TxFifo0;\r\n    usartConfig.rxWatermark = kUSART_RxFifo1;\r\n\r\n    status = USART_Init(s_UsartAdapterBase[config->instance], &usartConfig, config->srcClock_Hz);\r\n\r\n    if (kStatus_Success != status)\r\n    {\r\n        return HAL_UartGetStatus(status);\r\n    }\r\n\r\n    return kStatus_HAL_UartSuccess;\r\n}\r\n\r\nhal_uart_status_t HAL_UartInit(hal_uart_handle_t handle, const hal_uart_config_t *uart_config)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    hal_uart_status_t status;\r\n\r\n    /* Init serial port */\r\n    status = HAL_UartInitCommon(handle, uart_config);\r\n    if (kStatus_HAL_UartSuccess != status)\r\n    {\r\n        return status;\r\n    }\r\n\r\n    uartHandle           = (hal_uart_state_t *)handle;\r\n    uartHandle->instance = uart_config->instance;\r\n#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))\r\n    uartHandle->dmaHandle = NULL;\r\n#endif /* HAL_UART_DMA_ENABLE */\r\n#if (defined(HAL_UART_ADAPTER_LOWPOWER) && (HAL_UART_ADAPTER_LOWPOWER > 0U))\r\n    (void)memcpy(&uartHandle->config, uart_config, sizeof(hal_uart_config_t));\r\n#endif\r\n\r\n#if (defined(UART_ADAPTER_NON_BLOCKING_MODE) && (UART_ADAPTER_NON_BLOCKING_MODE > 0U))\r\n\r\n#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r\n    USART_TransferCreateHandle(s_UsartAdapterBase[uart_config->instance], &uartHandle->hardwareHandle,\r\n                               (usart_transfer_callback_t)HAL_UartCallback, handle);\r\n#else\r\n    /* Enable interrupt in NVIC. */\r\n    FLEXCOMM_SetIRQHandler(s_UsartAdapterBase[uart_config->instance], HAL_UartInterruptHandle_Wapper, handle);\r\n    NVIC_SetPriority((IRQn_Type)s_UsartIRQ[uart_config->instance], HAL_UART_ISR_PRIORITY);\r\n    (void)EnableIRQ(s_UsartIRQ[uart_config->instance]);\r\n#endif\r\n\r\n#endif\r\n\r\n    return kStatus_HAL_UartSuccess;\r\n}\r\n\r\nhal_uart_status_t HAL_UartDeinit(hal_uart_handle_t handle)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n\r\n    assert(handle);\r\n\r\n    uartHandle = (hal_uart_state_t *)handle;\r\n\r\n    USART_Deinit(s_UsartAdapterBase[uartHandle->instance]);\r\n\r\n    return kStatus_HAL_UartSuccess;\r\n}\r\n\r\nhal_uart_status_t HAL_UartReceiveBlocking(hal_uart_handle_t handle, uint8_t *data, size_t length)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    status_t status;\r\n    assert(handle);\r\n    assert(data);\r\n    assert(length);\r\n\r\n    uartHandle = (hal_uart_state_t *)handle;\r\n\r\n#if (defined(UART_ADAPTER_NON_BLOCKING_MODE) && (UART_ADAPTER_NON_BLOCKING_MODE > 0U))\r\n    if (NULL != uartHandle->rx.buffer)\r\n    {\r\n        return kStatus_HAL_UartRxBusy;\r\n    }\r\n#endif\r\n\r\n    status = USART_ReadBlocking(s_UsartAdapterBase[uartHandle->instance], data, length);\r\n\r\n    return HAL_UartGetStatus(status);\r\n}\r\n\r\nhal_uart_status_t HAL_UartSendBlocking(hal_uart_handle_t handle, const uint8_t *data, size_t length)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    assert(handle);\r\n    assert(data);\r\n    assert(length);\r\n\r\n    uartHandle = (hal_uart_state_t *)handle;\r\n\r\n#if (defined(UART_ADAPTER_NON_BLOCKING_MODE) && (UART_ADAPTER_NON_BLOCKING_MODE > 0U))\r\n    if (NULL != uartHandle->tx.buffer)\r\n    {\r\n        return kStatus_HAL_UartTxBusy;\r\n    }\r\n#endif\r\n\r\n    (void)USART_WriteBlocking(s_UsartAdapterBase[uartHandle->instance], data, length);\r\n\r\n    return kStatus_HAL_UartSuccess;\r\n}\r\n\r\nhal_uart_status_t HAL_UartEnterLowpower(hal_uart_handle_t handle)\r\n{\r\n    assert(handle);\r\n\r\n    return kStatus_HAL_UartSuccess;\r\n}\r\n\r\nhal_uart_status_t HAL_UartExitLowpower(hal_uart_handle_t handle)\r\n{\r\n#if (defined(HAL_UART_ADAPTER_LOWPOWER) && (HAL_UART_ADAPTER_LOWPOWER > 0U))\r\n    hal_uart_state_t *uartHandle;\r\n    assert(handle);\r\n\r\n    uartHandle = (hal_uart_state_t *)handle;\r\n\r\n    (void)HAL_UartInit(handle, &uartHandle->config);\r\n#if (defined(UART_ADAPTER_NON_BLOCKING_MODE) && (UART_ADAPTER_NON_BLOCKING_MODE > 0U))\r\n    USART_EnableInterrupts(s_UsartAdapterBase[uartHandle->instance], USART_FIFOINTENSET_RXLVL_MASK);\r\n#endif\r\n#endif\r\n    return kStatus_HAL_UartSuccess;\r\n}\r\n\r\n#if (defined(UART_ADAPTER_NON_BLOCKING_MODE) && (UART_ADAPTER_NON_BLOCKING_MODE > 0U))\r\n\r\n#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r\n\r\nhal_uart_status_t HAL_UartTransferInstallCallback(hal_uart_handle_t handle,\r\n                                                  hal_uart_transfer_callback_t callback,\r\n                                                  void *callbackParam)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n\r\n    assert(handle);\r\n    assert(0U != HAL_UART_TRANSFER_MODE);\r\n\r\n    uartHandle = (hal_uart_state_t *)handle;\r\n\r\n    uartHandle->callbackParam = callbackParam;\r\n    uartHandle->callback      = callback;\r\n\r\n    return kStatus_HAL_UartSuccess;\r\n}\r\n\r\nhal_uart_status_t HAL_UartTransferReceiveNonBlocking(hal_uart_handle_t handle, hal_uart_transfer_t *transfer)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    status_t status;\r\n    assert(handle);\r\n    assert(transfer);\r\n    assert(0U != HAL_UART_TRANSFER_MODE);\r\n\r\n    uartHandle = (hal_uart_state_t *)handle;\r\n\r\n    status = USART_TransferReceiveNonBlocking(s_UsartAdapterBase[uartHandle->instance], &uartHandle->hardwareHandle,\r\n                                              (usart_transfer_t *)transfer, NULL);\r\n\r\n    return HAL_UartGetStatus(status);\r\n}\r\n\r\nhal_uart_status_t HAL_UartTransferSendNonBlocking(hal_uart_handle_t handle, hal_uart_transfer_t *transfer)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    status_t status;\r\n    assert(handle);\r\n    assert(transfer);\r\n    assert(0U != HAL_UART_TRANSFER_MODE);\r\n\r\n    uartHandle = (hal_uart_state_t *)handle;\r\n\r\n    status = USART_TransferSendNonBlocking(s_UsartAdapterBase[uartHandle->instance], &uartHandle->hardwareHandle,\r\n                                           (usart_transfer_t *)transfer);\r\n\r\n    return HAL_UartGetStatus(status);\r\n}\r\n\r\nhal_uart_status_t HAL_UartTransferGetReceiveCount(hal_uart_handle_t handle, uint32_t *count)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    status_t status;\r\n    assert(handle);\r\n    assert(count);\r\n    assert(0U != HAL_UART_TRANSFER_MODE);\r\n\r\n    uartHandle = (hal_uart_state_t *)handle;\r\n\r\n    status =\r\n        USART_TransferGetReceiveCount(s_UsartAdapterBase[uartHandle->instance], &uartHandle->hardwareHandle, count);\r\n\r\n    return HAL_UartGetStatus(status);\r\n}\r\n\r\nhal_uart_status_t HAL_UartTransferGetSendCount(hal_uart_handle_t handle, uint32_t *count)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    status_t status;\r\n    assert(handle);\r\n    assert(count);\r\n    assert(0U != HAL_UART_TRANSFER_MODE);\r\n\r\n    uartHandle = (hal_uart_state_t *)handle;\r\n\r\n    status = USART_TransferGetSendCount(s_UsartAdapterBase[uartHandle->instance], &uartHandle->hardwareHandle, count);\r\n\r\n    return HAL_UartGetStatus(status);\r\n}\r\n\r\nhal_uart_status_t HAL_UartTransferAbortReceive(hal_uart_handle_t handle)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    assert(handle);\r\n    assert(0U != HAL_UART_TRANSFER_MODE);\r\n\r\n    uartHandle = (hal_uart_state_t *)handle;\r\n\r\n    USART_TransferAbortReceive(s_UsartAdapterBase[uartHandle->instance], &uartHandle->hardwareHandle);\r\n\r\n    return kStatus_HAL_UartSuccess;\r\n}\r\n\r\nhal_uart_status_t HAL_UartTransferAbortSend(hal_uart_handle_t handle)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    assert(handle);\r\n    assert(0U != HAL_UART_TRANSFER_MODE);\r\n\r\n    uartHandle = (hal_uart_state_t *)handle;\r\n\r\n    USART_TransferAbortSend(s_UsartAdapterBase[uartHandle->instance], &uartHandle->hardwareHandle);\r\n\r\n    return kStatus_HAL_UartSuccess;\r\n}\r\n\r\n#else\r\n\r\n/* None transactional API with non-blocking mode. */\r\nhal_uart_status_t HAL_UartInstallCallback(hal_uart_handle_t handle,\r\n                                          hal_uart_transfer_callback_t callback,\r\n                                          void *callbackParam)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n\r\n    assert(handle);\r\n    assert(0U == HAL_UART_TRANSFER_MODE);\r\n\r\n    uartHandle = (hal_uart_state_t *)handle;\r\n\r\n    uartHandle->callbackParam = callbackParam;\r\n    uartHandle->callback      = callback;\r\n\r\n    return kStatus_HAL_UartSuccess;\r\n}\r\n\r\nhal_uart_status_t HAL_UartReceiveNonBlocking(hal_uart_handle_t handle, uint8_t *data, size_t length)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    assert(handle);\r\n    assert(data);\r\n    assert(length);\r\n    assert(0U == HAL_UART_TRANSFER_MODE);\r\n\r\n    uartHandle = (hal_uart_state_t *)handle;\r\n\r\n    if (NULL != uartHandle->rx.buffer)\r\n    {\r\n        return kStatus_HAL_UartRxBusy;\r\n    }\r\n\r\n    uartHandle->rx.bufferLength = length;\r\n    uartHandle->rx.bufferSofar  = 0;\r\n    uartHandle->rx.buffer       = data;\r\n    USART_EnableInterrupts(s_UsartAdapterBase[uartHandle->instance], USART_FIFOINTENSET_RXLVL_MASK);\r\n    return kStatus_HAL_UartSuccess;\r\n}\r\n\r\nhal_uart_status_t HAL_UartSendNonBlocking(hal_uart_handle_t handle, uint8_t *data, size_t length)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    assert(handle);\r\n    assert(data);\r\n    assert(length);\r\n    assert(0U == HAL_UART_TRANSFER_MODE);\r\n\r\n    uartHandle = (hal_uart_state_t *)handle;\r\n\r\n    if (NULL != uartHandle->tx.buffer)\r\n    {\r\n        return kStatus_HAL_UartTxBusy;\r\n    }\r\n    uartHandle->tx.bufferLength = length;\r\n    uartHandle->tx.bufferSofar  = 0;\r\n    uartHandle->tx.buffer       = (volatile uint8_t *)data;\r\n    USART_EnableInterrupts(s_UsartAdapterBase[uartHandle->instance], USART_FIFOINTENSET_TXLVL_MASK);\r\n    return kStatus_HAL_UartSuccess;\r\n}\r\n\r\nhal_uart_status_t HAL_UartGetReceiveCount(hal_uart_handle_t handle, uint32_t *reCount)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    assert(handle);\r\n    assert(reCount);\r\n    assert(0U == HAL_UART_TRANSFER_MODE);\r\n\r\n    uartHandle = (hal_uart_state_t *)handle;\r\n\r\n    if (NULL != uartHandle->rx.buffer)\r\n    {\r\n        *reCount = uartHandle->rx.bufferSofar;\r\n        return kStatus_HAL_UartSuccess;\r\n    }\r\n    return kStatus_HAL_UartError;\r\n}\r\n\r\nhal_uart_status_t HAL_UartGetSendCount(hal_uart_handle_t handle, uint32_t *seCount)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    assert(handle);\r\n    assert(seCount);\r\n    assert(0U == HAL_UART_TRANSFER_MODE);\r\n\r\n    uartHandle = (hal_uart_state_t *)handle;\r\n\r\n    if (NULL != uartHandle->tx.buffer)\r\n    {\r\n        *seCount = uartHandle->tx.bufferSofar;\r\n        return kStatus_HAL_UartSuccess;\r\n    }\r\n    return kStatus_HAL_UartError;\r\n}\r\n\r\nhal_uart_status_t HAL_UartAbortReceive(hal_uart_handle_t handle)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    assert(handle);\r\n    assert(0U == HAL_UART_TRANSFER_MODE);\r\n\r\n    uartHandle = (hal_uart_state_t *)handle;\r\n\r\n    if (NULL != uartHandle->rx.buffer)\r\n    {\r\n        USART_DisableInterrupts(s_UsartAdapterBase[uartHandle->instance],\r\n                                USART_FIFOINTENCLR_RXLVL_MASK | USART_FIFOINTENCLR_RXERR_MASK);\r\n        uartHandle->rx.buffer = NULL;\r\n    }\r\n\r\n    return kStatus_HAL_UartSuccess;\r\n}\r\n\r\nhal_uart_status_t HAL_UartAbortSend(hal_uart_handle_t handle)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    assert(handle);\r\n    assert(0U == HAL_UART_TRANSFER_MODE);\r\n\r\n    uartHandle = (hal_uart_state_t *)handle;\r\n\r\n    if (NULL != uartHandle->tx.buffer)\r\n    {\r\n        USART_DisableInterrupts(s_UsartAdapterBase[uartHandle->instance], USART_FIFOINTENCLR_TXLVL_MASK);\r\n        uartHandle->tx.buffer = NULL;\r\n    }\r\n\r\n    return kStatus_HAL_UartSuccess;\r\n}\r\n\r\n#endif\r\n\r\n#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r\n\r\nvoid HAL_UartIsrFunction(hal_uart_handle_t handle)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    assert(handle);\r\n    assert(0U != HAL_UART_TRANSFER_MODE);\r\n\r\n    uartHandle = (hal_uart_state_t *)handle;\r\n\r\n#if 0\r\n    DisableIRQ(s_UsartIRQ[uartHandle->instance]);\r\n#endif\r\n    USART_TransferHandleIRQ(s_UsartAdapterBase[uartHandle->instance], &uartHandle->hardwareHandle);\r\n#if 0\r\n    NVIC_SetPriority((IRQn_Type)s_UsartIRQ[uartHandle->instance], HAL_UART_ISR_PRIORITY);\r\n    EnableIRQ(s_UsartIRQ[uartHandle->instance]);\r\n#endif\r\n}\r\n\r\n#else\r\n\r\nvoid HAL_UartIsrFunction(hal_uart_handle_t handle)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    assert(handle);\r\n    assert(0U == HAL_UART_TRANSFER_MODE);\r\n\r\n    uartHandle = (hal_uart_state_t *)handle;\r\n\r\n#if 0\r\n    DisableIRQ(s_UsartIRQ[uartHandle->instance]);\r\n#endif\r\n    HAL_UartInterruptHandle(s_UsartAdapterBase[uartHandle->instance], (void *)uartHandle);\r\n#if 0\r\n    NVIC_SetPriority((IRQn_Type)s_UsartIRQ[uartHandle->instance], HAL_UART_ISR_PRIORITY);\r\n    EnableIRQ(s_UsartIRQ[uartHandle->instance]);\r\n#endif\r\n}\r\n\r\n#endif\r\n\r\n#endif\r\n\r\n#if (defined(HAL_UART_DMA_ENABLE) && (HAL_UART_DMA_ENABLE > 0U))\r\nstatic void USART_DMACallbacks(USART_Type *base, usart_dma_handle_t *handle, status_t status, void *userData)\r\n{\r\n    hal_uart_dma_state_t *uartDmaHandle;\r\n    hal_uart_status_t uartStatus = HAL_UartGetStatus(status);\r\n    hal_dma_callback_msg_t msg;\r\n    assert(handle);\r\n\r\n    uartDmaHandle = (hal_uart_dma_state_t *)userData;\r\n\r\n    if (NULL != uartDmaHandle->dma_callback)\r\n    {\r\n        if (kStatus_HAL_UartTxIdle == uartStatus)\r\n        {\r\n            msg.status                   = kStatus_HAL_UartDmaTxIdle;\r\n            msg.data                     = uartDmaHandle->dma_tx.buffer;\r\n            msg.dataSize                 = uartDmaHandle->dma_tx.bufferLength;\r\n            uartDmaHandle->dma_tx.buffer = NULL;\r\n        }\r\n        else if (kStatus_HAL_UartRxIdle == uartStatus)\r\n        {\r\n            msg.status                   = kStatus_HAL_UartDmaRxIdle;\r\n            msg.data                     = uartDmaHandle->dma_rx.buffer;\r\n            msg.dataSize                 = uartDmaHandle->dma_rx.bufferLength;\r\n            uartDmaHandle->dma_rx.buffer = NULL;\r\n        }\r\n\r\n        uartDmaHandle->dma_callback(uartDmaHandle, &msg, uartDmaHandle->dma_callback_param);\r\n    }\r\n}\r\n\r\nstatic void TimeoutTimer_Callbcak(void *param)\r\n{\r\n    hal_uart_dma_list_t *uartDmaHandleList;\r\n    hal_uart_dma_state_t *uartDmaHandle;\r\n    hal_dma_callback_msg_t msg;\r\n    uint32_t newReceived = 0U;\r\n\r\n    uartDmaHandleList = &s_dmaHandleList;\r\n    uartDmaHandle     = uartDmaHandleList->dma_list;\r\n\r\n    while (NULL != uartDmaHandle)\r\n    {\r\n        if ((NULL != uartDmaHandle->dma_rx.buffer) && (false == uartDmaHandle->dma_rx.receiveAll))\r\n        {\r\n            /* HAL_UartDMAGetReceiveCount(uartDmaHandle, &msg.dataSize); */\r\n            USART_TransferGetReceiveCountDMA(s_UsartAdapterBase[uartDmaHandle->instance], &uartDmaHandle->dmaHandle,\r\n                                             &msg.dataSize);\r\n            newReceived                       = msg.dataSize - uartDmaHandle->dma_rx.bufferSofar;\r\n            uartDmaHandle->dma_rx.bufferSofar = msg.dataSize;\r\n\r\n            /* 1, If it is in idle state. */\r\n            if ((0U == newReceived) && (0U < uartDmaHandle->dma_rx.bufferSofar))\r\n            {\r\n                uartDmaHandle->dma_rx.timeout++;\r\n                if (uartDmaHandle->dma_rx.timeout >= HAL_UART_DMA_IDLELINE_TIMEOUT)\r\n                {\r\n                    /* HAL_UartDMAAbortReceive(uartDmaHandle); */\r\n                    USART_TransferAbortReceiveDMA(s_UsartAdapterBase[uartDmaHandle->instance],\r\n                                                  &uartDmaHandle->dmaHandle);\r\n                    msg.data                     = uartDmaHandle->dma_rx.buffer;\r\n                    msg.status                   = kStatus_HAL_UartDmaIdleline;\r\n                    uartDmaHandle->dma_rx.buffer = NULL;\r\n                    uartDmaHandle->dma_callback(uartDmaHandle, &msg, uartDmaHandle->dma_callback_param);\r\n                }\r\n            }\r\n            /* 2, If got new data again. */\r\n            if ((0U < newReceived) && (0U < uartDmaHandle->dma_rx.bufferSofar))\r\n            {\r\n                uartDmaHandle->dma_rx.timeout = 0U;\r\n            }\r\n        }\r\n\r\n        uartDmaHandle = uartDmaHandle->next;\r\n    }\r\n}\r\n\r\nhal_uart_dma_status_t HAL_UartDMAInit(hal_uart_handle_t handle,\r\n                                      hal_uart_dma_handle_t dmaHandle,\r\n                                      hal_uart_dma_config_t *dmaConfig)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    hal_uart_dma_state_t *uartDmaHandle;\r\n\r\n    assert(handle);\r\n    assert(dmaHandle);\r\n\r\n    /* DMA init process. */\r\n    uartHandle    = (hal_uart_state_t *)handle;\r\n    uartDmaHandle = (hal_uart_dma_state_t *)dmaHandle;\r\n\r\n    uartHandle->dmaHandle = uartDmaHandle;\r\n\r\n    uartDmaHandle->instance = dmaConfig->uart_instance;\r\n\r\n    DMA_Type *dmaBases[] = DMA_BASE_PTRS;\r\n    DMA_EnableChannel(dmaBases[dmaConfig->dma_instance], dmaConfig->tx_channel);\r\n    DMA_EnableChannel(dmaBases[dmaConfig->dma_instance], dmaConfig->rx_channel);\r\n\r\n    DMA_CreateHandle(&uartDmaHandle->txDmaHandle, dmaBases[dmaConfig->dma_instance], dmaConfig->tx_channel);\r\n    DMA_CreateHandle(&uartDmaHandle->rxDmaHandle, dmaBases[dmaConfig->dma_instance], dmaConfig->rx_channel);\r\n\r\n    /* Timeout timer init. */\r\n    if (0U == s_dmaHandleList.activeCount)\r\n    {\r\n        s_dmaHandleList.dma_list = uartDmaHandle;\r\n        uartDmaHandle->next      = NULL;\r\n        s_dmaHandleList.activeCount++;\r\n\r\n        timer_status_t timerStatus;\r\n        timerStatus = TM_Open((timer_handle_t)s_dmaHandleList.timerManagerHandle);\r\n        assert(kStatus_TimerSuccess == timerStatus);\r\n\r\n        timerStatus =\r\n            TM_InstallCallback((timer_handle_t)s_dmaHandleList.timerManagerHandle, TimeoutTimer_Callbcak, NULL);\r\n        assert(kStatus_TimerSuccess == timerStatus);\r\n\r\n        (void)TM_Start((timer_handle_t)s_dmaHandleList.timerManagerHandle, (uint8_t)kTimerModeIntervalTimer, 1);\r\n\r\n        (void)timerStatus;\r\n    }\r\n    else\r\n    {\r\n        uartDmaHandle->next      = s_dmaHandleList.dma_list;\r\n        s_dmaHandleList.dma_list = uartDmaHandle;\r\n    }\r\n\r\n    return kStatus_HAL_UartDmaSuccess;\r\n}\r\n\r\nhal_uart_dma_status_t HAL_UartDMADeinit(hal_uart_handle_t handle)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    hal_uart_dma_state_t *uartDmaHandle;\r\n    hal_uart_dma_state_t *prev;\r\n    hal_uart_dma_state_t *curr;\r\n\r\n    assert(handle);\r\n\r\n    uartHandle    = (hal_uart_state_t *)handle;\r\n    uartDmaHandle = uartHandle->dmaHandle;\r\n\r\n    uartHandle->dmaHandle = NULL;\r\n\r\n    assert(uartDmaHandle);\r\n\r\n    /* Abort rx/tx */\r\n    /* Here we should not abort before create transfer handle. */\r\n    if (NULL != uartDmaHandle->dmaHandle.txDmaHandle)\r\n    {\r\n        USART_TransferAbortSendDMA(s_UsartAdapterBase[uartDmaHandle->instance], &uartDmaHandle->dmaHandle);\r\n    }\r\n    if (NULL != uartDmaHandle->dmaHandle.rxDmaHandle)\r\n    {\r\n        USART_TransferAbortReceiveDMA(s_UsartAdapterBase[uartDmaHandle->instance], &uartDmaHandle->dmaHandle);\r\n    }\r\n\r\n    /* Disable rx/tx channels */\r\n    /* Here we should not disable before create transfer handle. */\r\n    if (NULL != uartDmaHandle->dmaHandle.txDmaHandle)\r\n    {\r\n        DMA_DisableChannel(uartDmaHandle->txDmaHandle.base, uartDmaHandle->txDmaHandle.channel);\r\n    }\r\n    if (NULL != uartDmaHandle->dmaHandle.rxDmaHandle)\r\n    {\r\n        DMA_DisableChannel(uartDmaHandle->rxDmaHandle.base, uartDmaHandle->rxDmaHandle.channel);\r\n    }\r\n\r\n    /* Remove handle from list */\r\n    prev = NULL;\r\n    curr = s_dmaHandleList.dma_list;\r\n    while (curr != NULL)\r\n    {\r\n        if (curr == uartDmaHandle)\r\n        {\r\n            /* 1, if it is the first one */\r\n            if (prev == NULL)\r\n            {\r\n                s_dmaHandleList.dma_list = curr->next;\r\n            }\r\n            /* 2, if it is the last one */\r\n            else if (curr->next == NULL)\r\n            {\r\n                prev->next = NULL;\r\n            }\r\n            /* 3, if it is in the middle */\r\n            else\r\n            {\r\n                prev->next = curr->next;\r\n            }\r\n            break;\r\n        }\r\n\r\n        prev = curr;\r\n        curr = curr->next;\r\n    }\r\n\r\n    /* Reset all handle data. */\r\n    (void)memset(uartDmaHandle, 0, sizeof(hal_uart_dma_state_t));\r\n\r\n    s_dmaHandleList.activeCount = (s_dmaHandleList.activeCount > 0) ? (s_dmaHandleList.activeCount - 1) : 0;\r\n    if (0 == s_dmaHandleList.activeCount)\r\n    {\r\n        (void)TM_Close((timer_handle_t)s_dmaHandleList.timerManagerHandle);\r\n    }\r\n\r\n    return kStatus_HAL_UartDmaSuccess;\r\n}\r\n\r\nhal_uart_dma_status_t HAL_UartDMATransferInstallCallback(hal_uart_handle_t handle,\r\n                                                         hal_uart_dma_transfer_callback_t callback,\r\n                                                         void *callbackParam)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    hal_uart_dma_state_t *uartDmaHandle;\r\n\r\n    assert(handle);\r\n\r\n    uartHandle    = (hal_uart_state_t *)handle;\r\n    uartDmaHandle = uartHandle->dmaHandle;\r\n\r\n    assert(uartDmaHandle);\r\n\r\n    uartDmaHandle->dma_callback       = callback;\r\n    uartDmaHandle->dma_callback_param = callbackParam;\r\n\r\n    USART_TransferCreateHandleDMA(s_UsartAdapterBase[uartDmaHandle->instance], &uartDmaHandle->dmaHandle,\r\n                                  USART_DMACallbacks, uartDmaHandle, &uartDmaHandle->txDmaHandle,\r\n                                  &uartDmaHandle->rxDmaHandle);\r\n\r\n    return kStatus_HAL_UartDmaSuccess;\r\n}\r\n\r\nhal_uart_dma_status_t HAL_UartDMATransferReceive(hal_uart_handle_t handle,\r\n                                                 uint8_t *data,\r\n                                                 size_t length,\r\n                                                 bool receiveAll)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    hal_uart_dma_state_t *uartDmaHandle;\r\n    usart_transfer_t xfer;\r\n\r\n    assert(handle);\r\n    assert(data);\r\n\r\n    uartHandle    = (hal_uart_state_t *)handle;\r\n    uartDmaHandle = uartHandle->dmaHandle;\r\n\r\n    assert(uartDmaHandle);\r\n\r\n    if (NULL == uartDmaHandle->dma_rx.buffer)\r\n    {\r\n        uartDmaHandle->dma_rx.buffer       = data;\r\n        uartDmaHandle->dma_rx.bufferLength = length;\r\n        uartDmaHandle->dma_rx.timeout      = 0U;\r\n        uartDmaHandle->dma_rx.receiveAll   = receiveAll;\r\n    }\r\n    else\r\n    {\r\n        /* Already in reading process. */\r\n        return kStatus_HAL_UartDmaRxBusy;\r\n    }\r\n\r\n    xfer.data     = data;\r\n    xfer.dataSize = length;\r\n\r\n    USART_TransferReceiveDMA(s_UsartAdapterBase[uartDmaHandle->instance], &uartDmaHandle->dmaHandle, &xfer);\r\n\r\n    return kStatus_HAL_UartDmaSuccess;\r\n}\r\n\r\nhal_uart_dma_status_t HAL_UartDMATransferSend(hal_uart_handle_t handle, uint8_t *data, size_t length)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    hal_uart_dma_state_t *uartDmaHandle;\r\n    usart_transfer_t xfer;\r\n\r\n    assert(handle);\r\n    assert(data);\r\n\r\n    uartHandle    = (hal_uart_state_t *)handle;\r\n    uartDmaHandle = uartHandle->dmaHandle;\r\n\r\n    assert(uartDmaHandle);\r\n\r\n    if (NULL == uartDmaHandle->dma_tx.buffer)\r\n    {\r\n        uartDmaHandle->dma_tx.buffer       = data;\r\n        uartDmaHandle->dma_tx.bufferLength = length;\r\n        uartDmaHandle->dma_tx.bufferSofar  = 0U;\r\n        uartDmaHandle->dma_tx.timeout      = 0U;\r\n    }\r\n    else\r\n    {\r\n        /* Already in writing process. */\r\n        return kStatus_HAL_UartDmaTxBusy;\r\n    }\r\n\r\n    xfer.data     = data;\r\n    xfer.dataSize = length;\r\n\r\n    USART_TransferSendDMA(s_UsartAdapterBase[uartDmaHandle->instance], &uartDmaHandle->dmaHandle, &xfer);\r\n\r\n    return kStatus_HAL_UartDmaSuccess;\r\n}\r\n\r\nhal_uart_dma_status_t HAL_UartDMAGetReceiveCount(hal_uart_handle_t handle, uint32_t *reCount)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    hal_uart_dma_state_t *uartDmaHandle;\r\n\r\n    assert(handle);\r\n\r\n    uartHandle    = (hal_uart_state_t *)handle;\r\n    uartDmaHandle = uartHandle->dmaHandle;\r\n\r\n    assert(uartDmaHandle);\r\n\r\n    if (kStatus_Success != USART_TransferGetReceiveCountDMA(s_UsartAdapterBase[uartDmaHandle->instance],\r\n                                                            &uartDmaHandle->dmaHandle, reCount))\r\n    {\r\n        return kStatus_HAL_UartDmaError;\r\n    }\r\n\r\n    return kStatus_HAL_UartDmaSuccess;\r\n}\r\n\r\nhal_uart_dma_status_t HAL_UartDMAGetSendCount(hal_uart_handle_t handle, uint32_t *seCount)\r\n{\r\n    /* No get send count API */\r\n    return kStatus_HAL_UartDmaError;\r\n}\r\n\r\nhal_uart_dma_status_t HAL_UartDMAAbortReceive(hal_uart_handle_t handle)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    hal_uart_dma_state_t *uartDmaHandle;\r\n\r\n    assert(handle);\r\n\r\n    uartHandle    = (hal_uart_state_t *)handle;\r\n    uartDmaHandle = uartHandle->dmaHandle;\r\n\r\n    assert(uartDmaHandle);\r\n\r\n    USART_TransferAbortReceiveDMA(s_UsartAdapterBase[uartDmaHandle->instance], &uartDmaHandle->dmaHandle);\r\n\r\n    return kStatus_HAL_UartDmaSuccess;\r\n}\r\n\r\nhal_uart_dma_status_t HAL_UartDMAAbortSend(hal_uart_handle_t handle)\r\n{\r\n    hal_uart_state_t *uartHandle;\r\n    hal_uart_dma_state_t *uartDmaHandle;\r\n\r\n    assert(handle);\r\n\r\n    uartHandle    = (hal_uart_state_t *)handle;\r\n    uartDmaHandle = uartHandle->dmaHandle;\r\n\r\n    assert(uartDmaHandle);\r\n\r\n    USART_TransferAbortSendDMA(s_UsartAdapterBase[uartDmaHandle->instance], &uartDmaHandle->dmaHandle);\r\n\r\n    return kStatus_HAL_UartDmaSuccess;\r\n}\r\n#endif /* HAL_UART_DMA_ENABLE */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/component/wifi_bt_module/AzureWave/tx_pwr_limits/wlan_txpwrlimit_cfg_WW_rw610.h",
    "content": "/** @file wlan_txpwrlimit_cfg_WW_rw610.h\r\n *\r\n *  @brief  This file provides WLAN World Wide Safe Mode Tx Power Limits.\r\n *\r\n *  Copyright 2008-2021 NXP\r\n *\r\n *  Permission is hereby granted, free of charge, to any person obtaining\r\n *  a copy of this software and associated documentation files (the\r\n *  'Software'), to deal in the Software without restriction, including\r\n *  without limitation the rights to use, copy, modify, merge, publish,\r\n *  distribute, sub license, and/or sell copies of the Software, and to\r\n *  permit persons to whom the Software is furnished to do so, subject\r\n *  to the following conditions:\r\n *\r\n *  The above copyright notice and this permission notice (including the\r\n *  next paragraph) shall be included in all copies or substantial\r\n *  portions of the Software.\r\n *\r\n *  THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,\r\n *  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\n *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.\r\n *  IN NO EVENT SHALL NXP AND/OR ITS SUPPLIERS BE LIABLE FOR ANY\r\n *  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\n *  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\n *  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n */\r\n#ifndef _WLAN_TXPWRLIMIT_CFG_WW_RW610_H_\r\n#define _WLAN_TXPWRLIMIT_CFG_WW_RW610_H_\r\n\r\n#include <wlan.h>\r\n#include <wifi.h>\r\n// coverity[MISRA C-2012 Initializers:SUPPRESS]\r\nstatic wlan_chanlist_t chanlist_2g_cfg = {\r\n    .num_chans = 11,\r\n    .chan_info[0] =\r\n        {\r\n            .chan_num                     = 1,\r\n            .chan_freq                    = 2412,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[1] =\r\n        {\r\n            .chan_num                     = 2,\r\n            .chan_freq                    = 2417,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[2] =\r\n        {\r\n            .chan_num                     = 3,\r\n            .chan_freq                    = 2422,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[3] =\r\n        {\r\n            .chan_num                     = 4,\r\n            .chan_freq                    = 2427,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[4] =\r\n        {\r\n            .chan_num                     = 5,\r\n            .chan_freq                    = 2432,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[5] =\r\n        {\r\n            .chan_num                     = 6,\r\n            .chan_freq                    = 2437,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[6] =\r\n        {\r\n            .chan_num                     = 7,\r\n            .chan_freq                    = 2442,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[7] =\r\n        {\r\n            .chan_num                     = 8,\r\n            .chan_freq                    = 2447,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[8] =\r\n        {\r\n            .chan_num                     = 9,\r\n            .chan_freq                    = 2452,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[9] =\r\n        {\r\n            .chan_num                     = 10,\r\n            .chan_freq                    = 2457,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[10] =\r\n        {\r\n            .chan_num                     = 11,\r\n            .chan_freq                    = 2462,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[11] = {0},\r\n\t.chan_info[12] = {0},\r\n\t.chan_info[13] = {0},\r\n    .chan_info[14] = {0},\r\n    .chan_info[15] = {0},\r\n    .chan_info[16] = {0},\r\n    .chan_info[17] = {0},\r\n    .chan_info[18] = {0},\r\n    .chan_info[19] = {0},\r\n    .chan_info[20] = {0},\r\n    .chan_info[21] = {0},\r\n    .chan_info[22] = {0},\r\n    .chan_info[23] = {0},\r\n    .chan_info[24] = {0},\r\n    .chan_info[25] = {0},\r\n    .chan_info[26] = {0},\r\n    .chan_info[27] = {0},\r\n    .chan_info[28] = {0},\r\n    .chan_info[29] = {0},\r\n    .chan_info[30] = {0},\r\n    .chan_info[31] = {0},\r\n    .chan_info[32] = {0},\r\n    .chan_info[33] = {0},\r\n    .chan_info[34] = {0},\r\n    .chan_info[35] = {0},\r\n    .chan_info[36] = {0},\r\n    .chan_info[37] = {0},\r\n    .chan_info[38] = {0},\r\n    .chan_info[39] = {0},\r\n    .chan_info[40] = {0},\r\n    .chan_info[41] = {0},\r\n    .chan_info[42] = {0},\r\n    .chan_info[43] = {0},\r\n    .chan_info[44] = {0},\r\n    .chan_info[45] = {0},\r\n    .chan_info[46] = {0},\r\n    .chan_info[47] = {0},\r\n    .chan_info[48] = {0},\r\n    .chan_info[49] = {0},\r\n    .chan_info[50] = {0},\r\n    .chan_info[51] = {0},\r\n    .chan_info[52] = {0},\r\n    .chan_info[53] = {0},\r\n};\r\n\r\n#if CONFIG_5GHz_SUPPORT\r\n// coverity[MISRA C-2012 Initializers:SUPPRESS]\r\nstatic wlan_chanlist_t chanlist_5g_cfg = {\r\n    .num_chans = 28,\r\n    .chan_info[0] =\r\n        {\r\n            .chan_num                     = 36,\r\n            .chan_freq                    = 5180,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[1] =\r\n        {\r\n            .chan_num                     = 40,\r\n            .chan_freq                    = 5200,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[2] =\r\n        {\r\n            .chan_num                     = 44,\r\n            .chan_freq                    = 5220,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[3] =\r\n        {\r\n            .chan_num                     = 48,\r\n            .chan_freq                    = 5240,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[4] =\r\n        {\r\n            .chan_num                     = 52,\r\n            .chan_freq                    = 5260,\r\n            .passive_scan_or_radar_detect = true,\r\n        },\r\n    .chan_info[5] =\r\n        {\r\n            .chan_num                     = 56,\r\n            .chan_freq                    = 5280,\r\n            .passive_scan_or_radar_detect = true,\r\n        },\r\n    .chan_info[6] =\r\n        {\r\n            .chan_num                     = 60,\r\n            .chan_freq                    = 5300,\r\n            .passive_scan_or_radar_detect = true,\r\n        },\r\n    .chan_info[7] =\r\n        {\r\n            .chan_num                     = 64,\r\n            .chan_freq                    = 5320,\r\n            .passive_scan_or_radar_detect = true,\r\n        },\r\n    .chan_info[8] =\r\n        {\r\n            .chan_num                     = 100,\r\n            .chan_freq                    = 5500,\r\n            .passive_scan_or_radar_detect = true,\r\n        },\r\n    .chan_info[9] =\r\n        {\r\n            .chan_num                     = 104,\r\n            .chan_freq                    = 5520,\r\n            .passive_scan_or_radar_detect = true,\r\n        },\r\n    .chan_info[10] =\r\n        {\r\n            .chan_num                     = 108,\r\n            .chan_freq                    = 5540,\r\n            .passive_scan_or_radar_detect = true,\r\n        },\r\n    .chan_info[11] =\r\n        {\r\n            .chan_num                     = 112,\r\n            .chan_freq                    = 5560,\r\n            .passive_scan_or_radar_detect = true,\r\n        },\r\n    .chan_info[12] =\r\n        {\r\n            .chan_num                     = 116,\r\n            .chan_freq                    = 5580,\r\n            .passive_scan_or_radar_detect = true,\r\n        },\r\n    .chan_info[13] =\r\n        {\r\n            .chan_num                     = 120,\r\n            .chan_freq                    = 5600,\r\n            .passive_scan_or_radar_detect = true,\r\n        },\r\n    .chan_info[14] =\r\n        {\r\n            .chan_num                     = 124,\r\n            .chan_freq                    = 5620,\r\n            .passive_scan_or_radar_detect = true,\r\n        },\r\n    .chan_info[15] =\r\n        {\r\n            .chan_num                     = 128,\r\n            .chan_freq                    = 5640,\r\n            .passive_scan_or_radar_detect = true,\r\n        },\r\n    .chan_info[16] =\r\n        {\r\n            .chan_num                     = 132,\r\n            .chan_freq                    = 5660,\r\n            .passive_scan_or_radar_detect = true,\r\n        },\r\n    .chan_info[17] =\r\n        {\r\n            .chan_num                     = 136,\r\n            .chan_freq                    = 5680,\r\n            .passive_scan_or_radar_detect = true,\r\n        },\r\n    .chan_info[18] =\r\n        {\r\n            .chan_num                     = 140,\r\n            .chan_freq                    = 5700,\r\n            .passive_scan_or_radar_detect = true,\r\n        },\r\n    .chan_info[19] =\r\n        {\r\n            .chan_num                     = 144,\r\n            .chan_freq                    = 5720,\r\n            .passive_scan_or_radar_detect = true,\r\n        },\r\n    .chan_info[20] =\r\n        {\r\n            .chan_num                     = 149,\r\n            .chan_freq                    = 5745,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[21] =\r\n        {\r\n            .chan_num                     = 153,\r\n            .chan_freq                    = 5765,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[22] =\r\n        {\r\n            .chan_num                     = 157,\r\n            .chan_freq                    = 5785,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[23] =\r\n        {\r\n            .chan_num                     = 161,\r\n            .chan_freq                    = 5805,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[24] =\r\n        {\r\n            .chan_num                     = 165,\r\n            .chan_freq                    = 5825,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[25] =\r\n        {\r\n            .chan_num                     = 169,\r\n            .chan_freq                    = 5845,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[26] =\r\n        {\r\n            .chan_num                     = 173,\r\n            .chan_freq                    = 5865,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[27] =\r\n        {\r\n            .chan_num                     = 177,\r\n            .chan_freq                    = 5885,\r\n            .passive_scan_or_radar_detect = false,\r\n        },\r\n    .chan_info[28] = {0},\r\n    .chan_info[29] = {0},\r\n    .chan_info[30] = {0},\r\n    .chan_info[31] = {0},\r\n    .chan_info[32] = {0},\r\n    .chan_info[33] = {0},\r\n    .chan_info[34] = {0},\r\n    .chan_info[35] = {0},\r\n    .chan_info[36] = {0},\r\n    .chan_info[37] = {0},\r\n    .chan_info[38] = {0},\r\n    .chan_info[39] = {0},\r\n    .chan_info[40] = {0},\r\n    .chan_info[41] = {0},\r\n    .chan_info[42] = {0},\r\n    .chan_info[43] = {0},\r\n    .chan_info[44] = {0},\r\n    .chan_info[45] = {0},\r\n    .chan_info[46] = {0},\r\n    .chan_info[47] = {0},\r\n    .chan_info[48] = {0},\r\n    .chan_info[49] = {0},\r\n    .chan_info[50] = {0},\r\n    .chan_info[51] = {0},\r\n    .chan_info[52] = {0},\r\n    .chan_info[53] = {0},\r\n};\r\n#endif\r\n\r\n#if CONFIG_COMPRESS_TX_PWTBL\r\nstatic const t_u8 rg_rw610_bga[] = {\r\n\t0x01, 0x00, 0xee, 0x01, 0x06, 0x00, 0x55, 0x53,\r\n\t0x20, 0x10, 0x00, 0x01, 0x06, 0x02, 0x82, 0x00, 0x88, 0x88, 0x03, 0x01, 0x0b, 0x00, 0x00, 0x00,\r\n\t0x00, 0x00, 0x55, 0x53, 0x20, 0x10, 0x03, 0x07, 0x00, 0x02, 0x0c, 0x05, 0xab, 0x00, 0x61, 0x40,\r\n\t0x58, 0x02, 0x06, 0x05, 0x0a, 0x80, 0x42, 0x80, 0x40, 0x90, 0x06, 0x0c, 0x14, 0x05, 0x43, 0x60,\r\n\t0xc1, 0x28, 0x28, 0x0c, 0x27, 0x0a, 0x04, 0xc5, 0xe0, 0xc1, 0x38, 0xa8, 0x46, 0x0a, 0x2d, 0x8f,\r\n\t0x00, 0x09, 0x21, 0x08, 0xf8, 0x30, 0x08, 0x0f, 0x07, 0x83, 0x01, 0x08, 0xc0, 0x70, 0x3e, 0x1c,\r\n\t0x2a, 0x0a, 0x02, 0x22, 0xf0, 0x48, 0x48, 0x50, 0x0c, 0x00, 0x07, 0x05, 0x23, 0x30, 0xa0, 0x94,\r\n\t0xe0, 0x28, 0x01, 0x09, 0x82, 0x02, 0x41, 0x39, 0xc4, 0x36, 0x63, 0x33, 0x9e, 0xce, 0x67, 0x61,\r\n\t0x4a, 0x4c, 0xfc, 0x24, 0x1b, 0xa2, 0xc3, 0x8f, 0xc1, 0x1a, 0x80, 0x38, 0x23, 0x0e, 0x34, 0x80,\r\n\t0x0d, 0x21, 0x10, 0x40, 0x42, 0x88, 0x0e, 0x08, 0x54, 0x80};\r\n\r\n// coverity[MISRA C-2012 Rule 2.2:SUPPRESS]\r\nstatic const t_u8 rg_rw610_qfn[] = {\r\n    0x01, 0x00, 0xee, 0x01, 0x06, 0x00, 0x55, 0x53, 0x20, 0x10, 0x00, 0x01, 0x06, 0x02, 0x7b, 0x00, 0x88, 0x88,\r\n    0x03, 0x01, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x53, 0x20, 0x10, 0x93, 0x06, 0x00, 0x02, 0x08, 0x07,\r\n    0x05, 0x01, 0xa1, 0x50, 0x08, 0x50, 0x0b, 0x04, 0x0a, 0x00, 0x82, 0x70, 0x50, 0x20, 0x02, 0x0a, 0x08, 0x85,\r\n    0x85, 0x21, 0xa0, 0x10, 0x90, 0x36, 0x1d, 0x11, 0x88, 0x00, 0xa1, 0x31, 0x78, 0xb0, 0x04, 0x23, 0x16, 0x15,\r\n    0xc7, 0xc0, 0x04, 0x70, 0x84, 0x80, 0x00, 0x04, 0x01, 0x83, 0xc0, 0x00, 0x84, 0x00, 0x38, 0x06, 0x01, 0x00,\r\n    0x0a, 0x82, 0x81, 0x48, 0x40, 0x18, 0x01, 0x01, 0x0e, 0x4d, 0xc2, 0x80, 0x10, 0x98, 0x20, 0x24, 0x13, 0x9b,\r\n    0x84, 0xa0, 0xa1, 0xb9, 0xd4, 0xe6, 0x03, 0x14, 0xa2, 0x03, 0xa8, 0x40, 0x03, 0xf0, 0x46, 0x92, 0x11, 0x98,\r\n    0x1a, 0x40, 0x06, 0x90, 0x88, 0x20, 0x21, 0x40, 0x07, 0x04, 0x26, 0x07, 0xe0};\r\n\r\n// coverity[MISRA C-2012 Rule 2.2:SUPPRESS]\r\nstatic const t_u8 rg_rw610_csp[] = {\r\n    0x01, 0x00, 0xee, 0x01, 0x06, 0x00, 0x55, 0x53, 0x20, 0x10, 0x00, 0x01, 0x06, 0x02, 0x7f, 0x00, 0x88, 0x88,\r\n    0x03, 0x01, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x53, 0x20, 0x10, 0xd3, 0x06, 0x00, 0x02, 0x08, 0x07,\r\n    0x05, 0x01, 0xa1, 0x50, 0x08, 0x50, 0x0b, 0x04, 0x0a, 0x00, 0x82, 0x70, 0x50, 0x20, 0x00, 0x02, 0x13, 0x06,\r\n    0xc3, 0x82, 0x31, 0x18, 0x7c, 0x14, 0x10, 0x13, 0x01, 0x42, 0x61, 0xd1, 0x08, 0x94, 0x44, 0x57, 0x13, 0x00,\r\n    0x11, 0xc2, 0x11, 0xe0, 0x00, 0x10, 0x06, 0x0f, 0x00, 0x02, 0x10, 0x00, 0xe0, 0x18, 0x04, 0x00, 0x2a, 0x0a,\r\n    0x02, 0x02, 0xa0, 0xb0, 0xa0, 0x06, 0x10, 0x06, 0x00, 0x03, 0xa1, 0x13, 0x29, 0xa0, 0x22, 0x73, 0x04, 0x09,\r\n    0x06, 0xe7, 0x21, 0x29, 0xb0, 0x4e, 0x63, 0x3f, 0x0a, 0x51, 0xe7, 0x40, 0x10, 0x88, 0x20, 0x24, 0x0b, 0xa6,\r\n    0xd0, 0xe5, 0xc7, 0xe0, 0x8d, 0x08, 0x1c, 0x11, 0x97, 0x1a, 0x40, 0x06, 0x90, 0x85, 0x58, 0x21, 0x53};\r\n\r\n// coverity[MISRA C-2012 Rule 2.2:SUPPRESS]\r\nstatic const t_u8 rg_rw610_EU[] = {\r\n\t0x01, 0x00, 0xee, 0x01, 0x06, 0x00, 0x45, 0x55,\r\n\t0x20, 0x30, 0x00, 0x02, 0x06, 0x02, 0x96, 0x00, 0x88, 0x88, 0x03, 0x01, 0x0b, 0x00, 0x00, 0x00,\r\n\t0x00, 0x00, 0x45, 0x55, 0x20, 0x30, 0x43, 0x08, 0x00, 0x02, 0x0c, 0x06, 0xab, 0x00, 0x21, 0x30,\r\n\t0x68, 0x02, 0x06, 0x03, 0x0a, 0x01, 0xc2, 0x60, 0x38, 0x34, 0x2e, 0x13, 0x0b, 0x83, 0x04, 0xa0,\r\n\t0xb0, 0x30, 0x10, 0x50, 0x12, 0x13, 0x00, 0x84, 0x80, 0x30, 0xd0, 0x64, 0x6a, 0x0c, 0x11, 0x82,\r\n\t0x8a, 0xe4, 0x00, 0x02, 0x38, 0x42, 0x42, 0x0c, 0x02, 0x03, 0xc1, 0xe0, 0xc0, 0x42, 0x30, 0x1c,\r\n\t0x0f, 0x8d, 0x8a, 0xa3, 0x01, 0x40, 0x34, 0xcc, 0x15, 0x18, 0x07, 0x02, 0x00, 0x00, 0xe0, 0x9c,\r\n\t0x56, 0x6a, 0x01, 0x0a, 0x02, 0xa3, 0x53, 0x99, 0xdc, 0x68, 0x26, 0x08, 0x09, 0x02, 0xe8, 0x80,\r\n\t0xea, 0x35, 0x02, 0x7f, 0x41, 0x08, 0x80, 0x69, 0x75, 0x19, 0x9d, 0x3c, 0x15, 0x51, 0xa9, 0xc6,\r\n\t0x42, 0x55, 0x89, 0xd0, 0x3a, 0xa2, 0x00, 0x3f, 0x04, 0x42, 0x75, 0x90, 0x01, 0xa6, 0xca, 0x11,\r\n\t0x04, 0x04, 0x29, 0x55, 0xd0, 0x80, 0x06, 0xd1, 0x6a, 0xa5, 0xdb, 0x40, 0x05, 0x40};\r\n\r\n// coverity[MISRA C-2012 Rule 2.2:SUPPRESS]\r\nstatic const t_u8 rg_rw610_JP[] = {\r\n\t0x01, 0x00, 0xee, 0x01, 0x06, 0x00, 0x4a, 0x50,\r\n\t0x20, 0x40, 0x00, 0x03, 0x06, 0x02, 0x64, 0x00, 0x88, 0x88, 0x03, 0x01, 0x0b, 0x00, 0x00, 0x00,\r\n\t0x00, 0x00, 0x4a, 0x50, 0x20, 0x40, 0x23, 0x05, 0x00, 0x02, 0x0c, 0x14, 0x80, 0x00, 0x20, 0xc0,\r\n\t0x6c, 0x0a, 0x09, 0x06, 0x82, 0xc0, 0xe1, 0x30, 0x71, 0x5c, 0x1c, 0x8f, 0x0c, 0x06, 0x01, 0x01,\r\n\t0xe0, 0xf0, 0x60, 0x21, 0x18, 0x0e, 0x07, 0x80, 0x40, 0x02, 0xa0, 0x50, 0x10, 0x0e, 0x04, 0x07,\r\n\t0x04, 0xc0, 0x00, 0xe0, 0x70, 0x06, 0x3b, 0x1f, 0x90, 0xc8, 0xe4, 0xb2, 0x79, 0x04, 0x8a, 0x49,\r\n\t0x26, 0x8f, 0x4b, 0x65, 0x53, 0x09, 0x44, 0xba, 0x57, 0x31, 0x94, 0xcb, 0xc0, 0x07, 0xe9, 0x64,\r\n\t0xe6, 0x4a, 0x00, 0x34, 0xd0, 0x27, 0xb3, 0x69, 0xa4, 0xca, 0x74, 0x54};\r\n\r\n// coverity[MISRA C-2012 Rule 2.2:SUPPRESS]\r\nstatic const t_u8 rg_rw610_CN[] = {\r\n\t0x01, 0x00, 0xee, 0x01, 0x06, 0x00, 0x43, 0x4e,\r\n\t0x20, 0x50, 0x00, 0x02, 0x06, 0x02, 0xaa, 0x00, 0x88, 0x88, 0x03, 0x01, 0x0b, 0x00, 0x00, 0x00,\r\n\t0x00, 0x00, 0x43, 0x4e, 0x20, 0x50, 0x83, 0x09, 0x00, 0x02, 0x0c, 0x06, 0xab, 0x00, 0x21, 0x30,\r\n\t0x58, 0x38, 0x02, 0x0d, 0x00, 0x80, 0x00, 0x21, 0x20, 0x40, 0x44, 0x02, 0x10, 0x00, 0x83, 0x00,\r\n\t0x20, 0x58, 0x48, 0x0a, 0x19, 0x0e, 0x88, 0x44, 0xa2, 0x80, 0x08, 0xb4, 0x36, 0x1f, 0x11, 0x89,\r\n\t0xc5, 0x41, 0xf1, 0xf0, 0x88, 0x1a, 0x21, 0x23, 0x8d, 0x48, 0xa4, 0x92, 0x60, 0x0c, 0xa2, 0x43,\r\n\t0x1c, 0x91, 0xc4, 0x24, 0xb2, 0x79, 0x04, 0x6c, 0x58, 0x11, 0x04, 0x4d, 0x25, 0x20, 0x02, 0x40,\r\n\t0x40, 0x13, 0x2e, 0x9b, 0x03, 0x00, 0x80, 0xf0, 0x78, 0x30, 0x10, 0x8c, 0x07, 0x48, 0xc0, 0x02,\r\n\t0xa0, 0xa0, 0x4c, 0x24, 0x01, 0x0a, 0x00, 0xe2, 0x15, 0x10, 0x00, 0x38, 0x28, 0x14, 0xa7, 0xd4,\r\n\t0x6a, 0x60, 0x3a, 0xa8, 0x52, 0x06, 0x08, 0x09, 0x03, 0xe2, 0x01, 0x2a, 0xe0, 0x3a, 0xb2, 0x13,\r\n\t0x09, 0xd4, 0x2a, 0x56, 0xaa, 0xed, 0x36, 0xd5, 0x5b, 0xae, 0xc2, 0xc2, 0xf6, 0x3b, 0x2d, 0x3c,\r\n\t0x00, 0x7e, 0x08, 0x86, 0xea, 0xb0, 0xe0, 0x01, 0xa6, 0xfb, 0x38, 0x08, 0x51, 0x21, 0xf6, 0x58,\r\n\t0x85, 0xdc};\r\n\r\n// coverity[MISRA C-2012 Rule 2.2:SUPPRESS]\r\nstatic const t_u8 rg_rw610_WW[] = {\r\n\t0x01, 0x00, 0xee, 0x01, 0x06, 0x00, 0x57, 0x57,\r\n\t0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x6b, 0x00, 0x88, 0x88, 0x03, 0x01, 0x0b, 0x00, 0x00, 0x00,\r\n\t0x00, 0x00, 0x57, 0x57, 0x00, 0x00, 0x93, 0x05, 0x00, 0x02, 0x0c, 0x13, 0x81, 0x40, 0x20, 0x00,\r\n\t0x10, 0x30, 0x17, 0x02, 0x82, 0x41, 0xa1, 0x10, 0x58, 0x3c, 0x0e, 0x19, 0x0b, 0x85, 0x40, 0xc5,\r\n\t0x91, 0x10, 0x01, 0x22, 0x29, 0x13, 0x02, 0x03, 0xc1, 0xe0, 0xc0, 0x42, 0x30, 0x1c, 0x0f, 0x81,\r\n\t0x8a, 0x81, 0x40, 0x40, 0x38, 0x10, 0x1c, 0x13, 0x00, 0x03, 0x81, 0xc0, 0x19, 0x1c, 0x96, 0x4f,\r\n\t0x29, 0x95, 0xcb, 0x64, 0xd2, 0x89, 0x54, 0xb2, 0x49, 0x33, 0x98, 0x4d, 0xa5, 0xd3, 0x49, 0x8c,\r\n\t0xde, 0x5f, 0x35, 0x00, 0x1f, 0xa6, 0x53, 0xf9, 0x58, 0x00, 0xd3, 0x46, 0xa1, 0xcf, 0x27, 0x53,\r\n\t0x8a, 0x01, 0x50};\r\n#endif\r\n\r\n#ifndef CONFIG_11AX\r\n#ifndef CONFIG_11AC\r\nstatic wifi_txpwrlimit_t\r\n    tx_pwrlimit_2g_cfg =\r\n        {\r\n            .subband   = (wifi_SubBand_t)0x00,\r\n            .num_chans = 14,\r\n            .txpwrlimit_config[0] =\r\n                {\r\n                    .num_mod_grps = 7,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 1,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19}, {1, 15}, {2, 15}, {3, 15}, {4, 13}, {5, 13}, {6, 13}},\r\n                },\r\n            .txpwrlimit_config[1] =\r\n                {\r\n                    .num_mod_grps = 7,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 2,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19}, {1, 16}, {2, 16}, {3, 16}, {4, 16}, {5, 16}, {6, 16}},\r\n                },\r\n            .txpwrlimit_config[2] =\r\n                {\r\n                    .num_mod_grps = 7,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 3,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19}, {1, 16}, {2, 16}, {3, 16}, {4, 16}, {5, 16}, {6, 16}},\r\n                },\r\n            .txpwrlimit_config[3] =\r\n                {\r\n                    .num_mod_grps = 7,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 4,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19}, {1, 18}, {2, 18}, {3, 17}, {4, 16}, {5, 17}, {6, 16}},\r\n                },\r\n            .txpwrlimit_config[4] =\r\n                {\r\n                    .num_mod_grps = 7,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 5,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19}, {1, 18}, {2, 18}, {3, 17}, {4, 16}, {5, 17}, {6, 16}},\r\n                },\r\n            .txpwrlimit_config[5] =\r\n                {\r\n                    .num_mod_grps = 7,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 6,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19}, {1, 18}, {2, 18}, {3, 17}, {4, 16}, {5, 17}, {6, 16}},\r\n                },\r\n            .txpwrlimit_config[6] =\r\n                {\r\n                    .num_mod_grps = 7,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 7,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19}, {1, 18}, {2, 18}, {3, 17}, {4, 16}, {5, 17}, {6, 16}},\r\n                },\r\n            .txpwrlimit_config[7] =\r\n                {\r\n                    .num_mod_grps = 7,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 8,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19}, {1, 18}, {2, 18}, {3, 17}, {4, 16}, {5, 17}, {6, 16}},\r\n                },\r\n            .txpwrlimit_config[8] =\r\n                {\r\n                    .num_mod_grps = 7,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 9,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19}, {1, 17}, {2, 17}, {3, 16}, {4, 16}, {5, 16}, {6, 16}},\r\n                },\r\n            .txpwrlimit_config[9] =\r\n                {\r\n                    .num_mod_grps = 7,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 10,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19}, {1, 16}, {2, 16}, {3, 16}, {4, 15}, {5, 15}, {6, 15}},\r\n                },\r\n            .txpwrlimit_config[10] =\r\n                {\r\n                    .num_mod_grps = 7,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 11,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19}, {1, 13}, {2, 13}, {3, 13}, {4, 12}, {5, 12}, {6, 12}},\r\n                },\r\n            .txpwrlimit_config[11] =\r\n                {\r\n                    .num_mod_grps = 7,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 12,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19}, {1, 18}, {2, 18}, {3, 17}, {4, 16}, {5, 17}, {6, 16}},\r\n                },\r\n            .txpwrlimit_config[12] =\r\n                {\r\n                    .num_mod_grps = 7,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 13,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19}, {1, 18}, {2, 18}, {3, 17}, {4, 16}, {5, 17}, {6, 16}},\r\n                },\r\n            .txpwrlimit_config[13] =\r\n                {\r\n                    .num_mod_grps = 7,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2414,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 14,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19}, {1, 0}, {2, 0}, {3, 0}, {4, 0}, {5, 0}, {6, 0}},\r\n                },\r\n            .txpwrlimit_config[14] = {0},\r\n            .txpwrlimit_config[15] = {0},\r\n            .txpwrlimit_config[16] = {0},\r\n            .txpwrlimit_config[17] = {0},\r\n            .txpwrlimit_config[18] = {0},\r\n            .txpwrlimit_config[19] = {0},\r\n            .txpwrlimit_config[20] = {0},\r\n            .txpwrlimit_config[21] = {0},\r\n            .txpwrlimit_config[22] = {0},\r\n            .txpwrlimit_config[23] = {0},\r\n            .txpwrlimit_config[24] = {0},\r\n            .txpwrlimit_config[25] = {0},\r\n            .txpwrlimit_config[26] = {0},\r\n            .txpwrlimit_config[27] = {0},\r\n            .txpwrlimit_config[28] = {0},\r\n            .txpwrlimit_config[29] = {0},\r\n            .txpwrlimit_config[30] = {0},\r\n            .txpwrlimit_config[31] = {0},\r\n            .txpwrlimit_config[32] = {0},\r\n            .txpwrlimit_config[33] = {0},\r\n            .txpwrlimit_config[34] = {0},\r\n            .txpwrlimit_config[35] = {0},\r\n            .txpwrlimit_config[36] = {0},\r\n            .txpwrlimit_config[37] = {0},\r\n            .txpwrlimit_config[38] = {0},\r\n            .txpwrlimit_config[39] = {0},\r\n};\r\n\r\n#if CONFIG_5GHz_SUPPORT\r\nstatic wifi_txpwrlimit_t\r\n    tx_pwrlimit_5g_cfg =\r\n        {\r\n            .subband   = (wifi_SubBand_t)0x00,\r\n            .num_chans = 25,\r\n            .txpwrlimit_config[0] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 36,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 20}, {4, 20}, {5, 20}, {6, 19}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[1] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 40,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 19}, {4, 20}, {5, 20}, {6, 18}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[2] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 44,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 18}, {4, 20}, {5, 20}, {6, 17}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[3] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 48,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 16}, {4, 20}, {5, 20}, {6, 16}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[4] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 52,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 17}, {4, 20}, {5, 20}, {6, 16}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[5] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 56,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 19}, {4, 20}, {5, 20}, {6, 18}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[6] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 60,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 18}, {4, 20}, {5, 20}, {6, 17}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[7] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 64,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 19}, {2, 19}, {3, 16}, {4, 18}, {5, 18}, {6, 15}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[8] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 100,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 19}, {4, 20}, {5, 20}, {6, 18}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[9] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 104,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 18}, {4, 20}, {5, 21}, {6, 18}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[10] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 108,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 19}, {4, 20}, {5, 21}, {6, 18}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[11] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 112,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 19}, {4, 20}, {5, 21}, {6, 18}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[12] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 116,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 21}, {2, 21}, {3, 19}, {4, 21}, {5, 20}, {6, 19}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[13] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 120,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 21}, {2, 21}, {3, 19}, {4, 21}, {5, 20}, {6, 18}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[14] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 124,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 21}, {2, 21}, {3, 18}, {4, 21}, {5, 20}, {6, 16}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[15] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 128,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 21}, {2, 21}, {3, 18}, {4, 21}, {5, 20}, {6, 16}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[16] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 132,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 21}, {2, 21}, {3, 18}, {4, 21}, {5, 20}, {6, 18}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[17] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 136,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 21}, {2, 21}, {3, 18}, {4, 21}, {5, 20}, {6, 18}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[18] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 140,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 21}, {2, 21}, {3, 16}, {4, 21}, {5, 20}, {6, 15}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[19] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 144,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 21}, {2, 21}, {3, 16}, {4, 21}, {5, 20}, {6, 15}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[20] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 149,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 18}, {4, 21}, {5, 21}, {6, 17}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[21] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 153,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 18}, {4, 21}, {5, 21}, {6, 16}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[22] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 157,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 15}, {4, 21}, {5, 21}, {6, 14}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[23] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 161,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 13}, {4, 21}, {5, 21}, {6, 12}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[24] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 165,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 13}, {4, 20}, {5, 20}, {6, 12}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[25] = {0},\r\n            .txpwrlimit_config[26] = {0},\r\n            .txpwrlimit_config[27] = {0},\r\n            .txpwrlimit_config[28] = {0},\r\n            .txpwrlimit_config[29] = {0},\r\n            .txpwrlimit_config[30] = {0},\r\n            .txpwrlimit_config[31] = {0},\r\n            .txpwrlimit_config[32] = {0},\r\n            .txpwrlimit_config[33] = {0},\r\n            .txpwrlimit_config[34] = {0},\r\n            .txpwrlimit_config[35] = {0},\r\n            .txpwrlimit_config[36] = {0},\r\n            .txpwrlimit_config[37] = {0},\r\n            .txpwrlimit_config[38] = {0},\r\n            .txpwrlimit_config[39] = {0},\r\n/* Rest of the channels listed below are not used and contains dummy power entries,\r\n * they belong to 4.9GHz Band for Public Safety.\r\n */\r\n#if 0\r\n            .txpwrlimit_config[25] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 183,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 20}, {4, 20}, {5, 20}, {6, 19}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[26] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 184,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 20}, {4, 20}, {5, 20}, {6, 19}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[27] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 185,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 20}, {4, 20}, {5, 20}, {6, 19}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[28] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 187,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 20}, {4, 20}, {5, 20}, {6, 19}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[29] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 188,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 20}, {4, 20}, {5, 20}, {6, 19}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[30] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 189,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 20}, {4, 20}, {5, 20}, {6, 19}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[31] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 192,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 20}, {4, 20}, {5, 20}, {6, 19}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[32] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 196,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 20}, {4, 20}, {5, 20}, {6, 19}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[33] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 7,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 20}, {4, 20}, {5, 20}, {6, 19}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[34] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 8,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 20}, {4, 20}, {5, 20}, {6, 19}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[35] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 11,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 20}, {4, 20}, {5, 20}, {6, 19}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[36] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 12,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 20}, {4, 20}, {5, 20}, {6, 19}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[37] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 16,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 20}, {4, 20}, {5, 20}, {6, 19}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n            .txpwrlimit_config[38] =\r\n                {\r\n                    .num_mod_grps = 9,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 34,\r\n                        },\r\n                    .txpwrlimit_entry = {{1, 20}, {2, 20}, {3, 20}, {4, 20}, {5, 20}, {6, 19}, {7, 0}, {8, 0}, {9, 0}},\r\n                },\r\n#endif\r\n};\r\n#endif\r\n#else\r\nstatic wifi_txpwrlimit_t\r\n    tx_pwrlimit_2g_cfg =\r\n        {\r\n            .subband   = (wifi_SubBand_t)0x00,\r\n            .num_chans = 14,\r\n            .txpwrlimit_config[0] =\r\n                {\r\n                    .num_mod_grps = 12,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 1,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19},\r\n                                         {1, 15},\r\n                                         {2, 15},\r\n                                         {3, 15},\r\n                                         {4, 13},\r\n                                         {5, 13},\r\n                                         {6, 13},\r\n                                         {7, 0},\r\n                                         {8, 0},\r\n                                         {9, 0},\r\n                                         {10, 13},\r\n                                         {11, 0}},\r\n                },\r\n            .txpwrlimit_config[1] =\r\n                {\r\n                    .num_mod_grps = 12,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 2,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19},\r\n                                         {1, 16},\r\n                                         {2, 16},\r\n                                         {3, 16},\r\n                                         {4, 16},\r\n                                         {5, 16},\r\n                                         {6, 16},\r\n                                         {7, 0},\r\n                                         {8, 0},\r\n                                         {9, 0},\r\n                                         {10, 16},\r\n                                         {11, 0}},\r\n                },\r\n            .txpwrlimit_config[2] =\r\n                {\r\n                    .num_mod_grps = 12,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 3,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19},\r\n                                         {1, 16},\r\n                                         {2, 16},\r\n                                         {3, 16},\r\n                                         {4, 16},\r\n                                         {5, 16},\r\n                                         {6, 16},\r\n                                         {7, 0},\r\n                                         {8, 0},\r\n                                         {9, 0},\r\n                                         {10, 16},\r\n                                         {11, 0}},\r\n                },\r\n            .txpwrlimit_config[3] =\r\n                {\r\n                    .num_mod_grps = 12,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 4,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19},\r\n                                         {1, 18},\r\n                                         {2, 18},\r\n                                         {3, 17},\r\n                                         {4, 16},\r\n                                         {5, 17},\r\n                                         {6, 16},\r\n                                         {7, 0},\r\n                                         {8, 0},\r\n                                         {9, 0},\r\n                                         {10, 15},\r\n                                         {11, 0}},\r\n                },\r\n            .txpwrlimit_config[4] =\r\n                {\r\n                    .num_mod_grps = 12,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 5,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19},\r\n                                         {1, 18},\r\n                                         {2, 18},\r\n                                         {3, 17},\r\n                                         {4, 16},\r\n                                         {5, 17},\r\n                                         {6, 16},\r\n                                         {7, 0},\r\n                                         {8, 0},\r\n                                         {9, 0},\r\n                                         {10, 15},\r\n                                         {11, 0}},\r\n                },\r\n            .txpwrlimit_config[5] =\r\n                {\r\n                    .num_mod_grps = 12,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 6,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19},\r\n                                         {1, 18},\r\n                                         {2, 18},\r\n                                         {3, 17},\r\n                                         {4, 16},\r\n                                         {5, 17},\r\n                                         {6, 16},\r\n                                         {7, 0},\r\n                                         {8, 0},\r\n                                         {9, 0},\r\n                                         {10, 14},\r\n                                         {11, 0}},\r\n                },\r\n            .txpwrlimit_config[6] =\r\n                {\r\n                    .num_mod_grps = 12,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 7,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19},\r\n                                         {1, 18},\r\n                                         {2, 18},\r\n                                         {3, 17},\r\n                                         {4, 16},\r\n                                         {5, 17},\r\n                                         {6, 16},\r\n                                         {7, 0},\r\n                                         {8, 0},\r\n                                         {9, 0},\r\n                                         {10, 16},\r\n                                         {11, 0}},\r\n                },\r\n            .txpwrlimit_config[7] =\r\n                {\r\n                    .num_mod_grps = 12,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 8,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19},\r\n                                         {1, 18},\r\n                                         {2, 18},\r\n                                         {3, 17},\r\n                                         {4, 16},\r\n                                         {5, 17},\r\n                                         {6, 16},\r\n                                         {7, 0},\r\n                                         {8, 0},\r\n                                         {9, 0},\r\n                                         {10, 16},\r\n                                         {11, 0}},\r\n                },\r\n            .txpwrlimit_config[8] =\r\n                {\r\n                    .num_mod_grps = 12,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 9,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19},\r\n                                         {1, 17},\r\n                                         {2, 17},\r\n                                         {3, 16},\r\n                                         {4, 16},\r\n                                         {5, 16},\r\n                                         {6, 16},\r\n                                         {7, 0},\r\n                                         {8, 0},\r\n                                         {9, 0},\r\n                                         {10, 15},\r\n                                         {11, 0}},\r\n                },\r\n            .txpwrlimit_config[9] =\r\n                {\r\n                    .num_mod_grps = 12,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 10,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19},\r\n                                         {1, 16},\r\n                                         {2, 16},\r\n                                         {3, 16},\r\n                                         {4, 15},\r\n                                         {5, 15},\r\n                                         {6, 15},\r\n                                         {7, 0},\r\n                                         {8, 0},\r\n                                         {9, 0},\r\n                                         {10, 15},\r\n                                         {11, 0}},\r\n                },\r\n            .txpwrlimit_config[10] =\r\n                {\r\n                    .num_mod_grps = 12,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 11,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19},\r\n                                         {1, 13},\r\n                                         {2, 13},\r\n                                         {3, 13},\r\n                                         {4, 12},\r\n                                         {5, 12},\r\n                                         {6, 12},\r\n                                         {7, 0},\r\n                                         {8, 0},\r\n                                         {9, 0},\r\n                                         {10, 12},\r\n                                         {11, 0}},\r\n                },\r\n            .txpwrlimit_config[11] =\r\n                {\r\n                    .num_mod_grps = 12,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 12,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19},\r\n                                         {1, 18},\r\n                                         {2, 18},\r\n                                         {3, 17},\r\n                                         {4, 16},\r\n                                         {5, 17},\r\n                                         {6, 16},\r\n                                         {7, 0},\r\n                                         {8, 0},\r\n                                         {9, 0},\r\n                                         {10, 16},\r\n                                         {11, 0}},\r\n                },\r\n            .txpwrlimit_config[12] =\r\n                {\r\n                    .num_mod_grps = 12,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2407,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 13,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 19},\r\n                                         {1, 18},\r\n                                         {2, 18},\r\n                                         {3, 17},\r\n                                         {4, 16},\r\n                                         {5, 17},\r\n                                         {6, 16},\r\n                                         {7, 0},\r\n                                         {8, 0},\r\n                                         {9, 0},\r\n                                         {10, 16},\r\n                                         {11, 0}},\r\n                },\r\n            .txpwrlimit_config[13] =\r\n                {\r\n                    .num_mod_grps = 12,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 2414,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 14,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 19},\r\n                         {1, 0},\r\n                         {2, 0},\r\n                         {3, 0},\r\n                         {4, 0},\r\n                         {5, 0},\r\n                         {6, 0},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 0},\r\n                         {11, 0}},\r\n                },\r\n            .txpwrlimit_config[14] = {0},\r\n            .txpwrlimit_config[15] = {0},\r\n            .txpwrlimit_config[16] = {0},\r\n            .txpwrlimit_config[17] = {0},\r\n            .txpwrlimit_config[18] = {0},\r\n            .txpwrlimit_config[19] = {0},\r\n            .txpwrlimit_config[20] = {0},\r\n            .txpwrlimit_config[21] = {0},\r\n            .txpwrlimit_config[22] = {0},\r\n            .txpwrlimit_config[23] = {0},\r\n            .txpwrlimit_config[24] = {0},\r\n            .txpwrlimit_config[25] = {0},\r\n            .txpwrlimit_config[26] = {0},\r\n            .txpwrlimit_config[27] = {0},\r\n            .txpwrlimit_config[28] = {0},\r\n            .txpwrlimit_config[29] = {0},\r\n            .txpwrlimit_config[30] = {0},\r\n            .txpwrlimit_config[31] = {0},\r\n            .txpwrlimit_config[32] = {0},\r\n            .txpwrlimit_config[33] = {0},\r\n            .txpwrlimit_config[34] = {0},\r\n            .txpwrlimit_config[35] = {0},\r\n            .txpwrlimit_config[36] = {0},\r\n            .txpwrlimit_config[37] = {0},\r\n            .txpwrlimit_config[38] = {0},\r\n            .txpwrlimit_config[39] = {0},\r\n};\r\n\r\n#if CONFIG_5GHz_SUPPORT\r\nstatic wifi_txpwrlimit_t\r\n    tx_pwrlimit_5g_cfg =\r\n        {\r\n            .subband   = (wifi_SubBand_t)0x00,\r\n            .num_chans = 25,\r\n            .txpwrlimit_config[0] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 36,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 0},\r\n                                         {1, 20},\r\n                                         {2, 20},\r\n                                         {3, 20},\r\n                                         {4, 20},\r\n                                         {5, 20},\r\n                                         {6, 19},\r\n                                         {7, 0},\r\n                                         {8, 0},\r\n                                         {9, 0},\r\n                                         {10, 16},\r\n                                         {11, 0},\r\n                                         {12, 0},\r\n                                         {13, 0},\r\n                                         {14, 0},\r\n                                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[1] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 40,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 0},\r\n                                         {1, 20},\r\n                                         {2, 20},\r\n                                         {3, 19},\r\n                                         {4, 20},\r\n                                         {5, 20},\r\n                                         {6, 18},\r\n                                         {7, 0},\r\n                                         {8, 0},\r\n                                         {9, 0},\r\n                                         {10, 16},\r\n                                         {11, 0},\r\n                                         {12, 0},\r\n                                         {13, 0},\r\n                                         {14, 0},\r\n                                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[2] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 44,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 0},\r\n                                         {1, 20},\r\n                                         {2, 20},\r\n                                         {3, 18},\r\n                                         {4, 20},\r\n                                         {5, 20},\r\n                                         {6, 17},\r\n                                         {7, 0},\r\n                                         {8, 0},\r\n                                         {9, 0},\r\n                                         {10, 16},\r\n                                         {11, 0},\r\n                                         {12, 0},\r\n                                         {13, 0},\r\n                                         {14, 0},\r\n                                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[3] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 48,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 0},\r\n                                         {1, 20},\r\n                                         {2, 20},\r\n                                         {3, 16},\r\n                                         {4, 20},\r\n                                         {5, 20},\r\n                                         {6, 16},\r\n                                         {7, 0},\r\n                                         {8, 0},\r\n                                         {9, 0},\r\n                                         {10, 16},\r\n                                         {11, 0},\r\n                                         {12, 0},\r\n                                         {13, 0},\r\n                                         {14, 0},\r\n                                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[4] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 52,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 0},\r\n                                         {1, 20},\r\n                                         {2, 20},\r\n                                         {3, 17},\r\n                                         {4, 20},\r\n                                         {5, 20},\r\n                                         {6, 16},\r\n                                         {7, 0},\r\n                                         {8, 0},\r\n                                         {9, 0},\r\n                                         {10, 15},\r\n                                         {11, 0},\r\n                                         {12, 0},\r\n                                         {13, 0},\r\n                                         {14, 0},\r\n                                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[5] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 56,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 0},\r\n                                         {1, 20},\r\n                                         {2, 20},\r\n                                         {3, 19},\r\n                                         {4, 20},\r\n                                         {5, 20},\r\n                                         {6, 18},\r\n                                         {7, 0},\r\n                                         {8, 0},\r\n                                         {9, 0},\r\n                                         {10, 15},\r\n                                         {11, 0},\r\n                                         {12, 0},\r\n                                         {13, 0},\r\n                                         {14, 0},\r\n                                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[6] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 60,\r\n                        },\r\n                    .txpwrlimit_entry = {{0, 0},\r\n                                         {1, 20},\r\n                                         {2, 20},\r\n                                         {3, 18},\r\n                                         {4, 20},\r\n                                         {5, 20},\r\n                                         {6, 17},\r\n                                         {7, 0},\r\n                                         {8, 0},\r\n                                         {9, 0},\r\n                                         {10, 15},\r\n                                         {11, 0},\r\n                                         {12, 0},\r\n                                         {13, 0},\r\n                                         {14, 0},\r\n                                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[7] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 64,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 19},\r\n                         {2, 19},\r\n                         {3, 16},\r\n                         {4, 18},\r\n                         {5, 18},\r\n                         {6, 15},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 15},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[8] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 100,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 19},\r\n                         {4, 20},\r\n                         {5, 20},\r\n                         {6, 18},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 15},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[9] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 104,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 18},\r\n                         {4, 20},\r\n                         {5, 21},\r\n                         {6, 18},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 15},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[10] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 108,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 19},\r\n                         {4, 20},\r\n                         {5, 21},\r\n                         {6, 18},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 15},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[11] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 112,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 19},\r\n                         {4, 20},\r\n                         {5, 21},\r\n                         {6, 18},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 15},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[12] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 116,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 21},\r\n                         {2, 21},\r\n                         {3, 19},\r\n                         {4, 21},\r\n                         {5, 20},\r\n                         {6, 19},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 15},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[13] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 120,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 21},\r\n                         {2, 21},\r\n                         {3, 19},\r\n                         {4, 21},\r\n                         {5, 20},\r\n                         {6, 18},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 15},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[14] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 124,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 21},\r\n                         {2, 21},\r\n                         {3, 18},\r\n                         {4, 21},\r\n                         {5, 20},\r\n                         {6, 16},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 15},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[15] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 128,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 21},\r\n                         {2, 21},\r\n                         {3, 18},\r\n                         {4, 21},\r\n                         {5, 20},\r\n                         {6, 16},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 15},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[16] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 132,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 21},\r\n                         {2, 21},\r\n                         {3, 18},\r\n                         {4, 21},\r\n                         {5, 20},\r\n                         {6, 18},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 15},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[17] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 136,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 21},\r\n                         {2, 21},\r\n                         {3, 18},\r\n                         {4, 21},\r\n                         {5, 20},\r\n                         {6, 18},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 15},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[18] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 140,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 21},\r\n                         {2, 21},\r\n                         {3, 16},\r\n                         {4, 21},\r\n                         {5, 20},\r\n                         {6, 15},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 15},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[19] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 144,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 21},\r\n                         {2, 21},\r\n                         {3, 16},\r\n                         {4, 21},\r\n                         {5, 20},\r\n                         {6, 15},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 15},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[20] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 149,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 18},\r\n                         {4, 21},\r\n                         {5, 21},\r\n                         {6, 17},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 12},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[21] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 153,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 18},\r\n                         {4, 21},\r\n                         {5, 21},\r\n                         {6, 16},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 12},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[22] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 157,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 15},\r\n                         {4, 21},\r\n                         {5, 21},\r\n                         {6, 14},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 12},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[23] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 161,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 13},\r\n                         {4, 21},\r\n                         {5, 21},\r\n                         {6, 12},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 12},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[24] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 165,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 13},\r\n                         {4, 20},\r\n                         {5, 20},\r\n                         {6, 12},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 12},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[25] = {0},\r\n            .txpwrlimit_config[26] = {0},\r\n            .txpwrlimit_config[27] = {0},\r\n            .txpwrlimit_config[28] = {0},\r\n            .txpwrlimit_config[29] = {0},\r\n            .txpwrlimit_config[30] = {0},\r\n            .txpwrlimit_config[31] = {0},\r\n            .txpwrlimit_config[32] = {0},\r\n            .txpwrlimit_config[33] = {0},\r\n            .txpwrlimit_config[34] = {0},\r\n            .txpwrlimit_config[35] = {0},\r\n            .txpwrlimit_config[36] = {0},\r\n            .txpwrlimit_config[37] = {0},\r\n            .txpwrlimit_config[38] = {0},\r\n            .txpwrlimit_config[39] = {0},\r\n/* Rest of the channels listed below are not used and contains dummy power entries,\r\n * they belong to 4.9GHz Band for Public Safety.\r\n */\r\n#if 0\r\n            .txpwrlimit_config[25] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 183,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 20},\r\n                         {4, 20},\r\n                         {5, 20},\r\n                         {6, 19},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 16},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[26] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 184,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 20},\r\n                         {4, 20},\r\n                         {5, 20},\r\n                         {6, 19},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 18},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[27] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 185,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 20},\r\n                         {4, 20},\r\n                         {5, 20},\r\n                         {6, 19},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 16},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[28] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 187,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 20},\r\n                         {4, 20},\r\n                         {5, 20},\r\n                         {6, 19},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 16},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[29] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 188,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 20},\r\n                         {4, 20},\r\n                         {5, 20},\r\n                         {6, 19},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 16},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[30] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 189,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 20},\r\n                         {4, 20},\r\n                         {5, 20},\r\n                         {6, 19},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 16},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[31] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 192,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 20},\r\n                         {4, 20},\r\n                         {5, 20},\r\n                         {6, 19},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 16},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[32] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 196,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 20},\r\n                         {4, 20},\r\n                         {5, 20},\r\n                         {6, 19},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 16},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[33] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 7,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 20},\r\n                         {4, 20},\r\n                         {5, 20},\r\n                         {6, 19},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 16},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[34] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 8,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 20},\r\n                         {4, 20},\r\n                         {5, 20},\r\n                         {6, 19},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 16},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[35] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 11,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 20},\r\n                         {4, 20},\r\n                         {5, 20},\r\n                         {6, 19},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 16},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[36] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 12,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 20},\r\n                         {4, 20},\r\n                         {5, 20},\r\n                         {6, 19},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 16},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[37] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 16,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 20},\r\n                         {4, 20},\r\n                         {5, 20},\r\n                         {6, 19},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 16},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n            .txpwrlimit_config[38] =\r\n                {\r\n                    .num_mod_grps = 16,\r\n                    .chan_desc =\r\n                        {\r\n                            .start_freq = 5000,\r\n                            .chan_width = 20,\r\n                            .chan_num   = 34,\r\n                        },\r\n                    .txpwrlimit_entry =\r\n                        {{0, 0},\r\n                         {1, 20},\r\n                         {2, 20},\r\n                         {3, 20},\r\n                         {4, 20},\r\n                         {5, 20},\r\n                         {6, 19},\r\n                         {7, 0},\r\n                         {8, 0},\r\n                         {9, 0},\r\n                         {10, 16},\r\n                         {11, 0},\r\n                         {12, 0},\r\n                         {13, 0},\r\n                         {14, 0},\r\n                         {15, 0}},\r\n                },\r\n#endif\r\n};\r\n#endif /* CONFIG_5GHz_SUPPORT */\r\n#endif /* CONFIG_11AC */\r\n#else\r\n// coverity[MISRA C-2012 Initializers :SUPPRESS]\r\nstatic wifi_txpwrlimit_t tx_pwrlimit_2g_cfg = {\r\n    .subband   = (wifi_SubBand_t)0x00,\r\n    .num_chans = 14,\r\n    .txpwrlimit_config[0] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 2407,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 1,\r\n                },\r\n            .txpwrlimit_entry = {{0, 19}, {1, 15}, {2, 15},  {3, 15},  {4, 13}, {5, 13}, {6, 13},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 13}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 13}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[1] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 2407,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 2,\r\n                },\r\n            .txpwrlimit_entry = {{0, 19}, {1, 16}, {2, 16},  {3, 16},  {4, 16}, {5, 16}, {6, 16},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 15}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[2] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 2407,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 3,\r\n                },\r\n            .txpwrlimit_entry = {{0, 19}, {1, 16}, {2, 16},  {3, 16},  {4, 16}, {5, 16}, {6, 16},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 15}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[3] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 2407,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 4,\r\n                },\r\n            .txpwrlimit_entry = {{0, 19}, {1, 18}, {2, 18},  {3, 17},  {4, 16}, {5, 17}, {6, 16},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 15}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 12}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[4] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 2407,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 5,\r\n                },\r\n            .txpwrlimit_entry = {{0, 19}, {1, 18}, {2, 18},  {3, 17},  {4, 16}, {5, 17}, {6, 16},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 15}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 13}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[5] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 2407,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 6,\r\n                },\r\n            .txpwrlimit_entry = {{0, 19}, {1, 18}, {2, 18},  {3, 17},  {4, 16}, {5, 17}, {6, 16},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 14}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 14}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[6] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 2407,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 7,\r\n                },\r\n            .txpwrlimit_entry = {{0, 19}, {1, 18}, {2, 18},  {3, 17},  {4, 16}, {5, 17}, {6, 16},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 15}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[7] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 2407,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 8,\r\n                },\r\n            .txpwrlimit_entry = {{0, 19}, {1, 18}, {2, 18},  {3, 17},  {4, 16}, {5, 17}, {6, 16},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 14}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[8] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 2407,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 9,\r\n                },\r\n            .txpwrlimit_entry = {{0, 19}, {1, 17}, {2, 17},  {3, 16},  {4, 16}, {5, 16}, {6, 16},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 15}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 14}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[9] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 2407,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 10,\r\n                },\r\n            .txpwrlimit_entry = {{0, 19}, {1, 16}, {2, 16},  {3, 16},  {4, 15}, {5, 15}, {6, 15},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 15}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 14}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[10] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 2407,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 11,\r\n                },\r\n            .txpwrlimit_entry = {{0, 19}, {1, 13}, {2, 13},  {3, 13},  {4, 12}, {5, 12}, {6, 12},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 12}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 12}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[11] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 2407,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 12,\r\n                },\r\n            .txpwrlimit_entry = {{0, 19}, {1, 18}, {2, 18},  {3, 17},  {4, 16}, {5, 17}, {6, 16},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 14}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[12] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 2407,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 13,\r\n                },\r\n            .txpwrlimit_entry = {{0, 19}, {1, 18}, {2, 18},  {3, 17},  {4, 16}, {5, 17}, {6, 16},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 14}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[13] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 2414,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 14,\r\n                },\r\n            .txpwrlimit_entry = {{0, 19}, {1, 0},  {2, 0},  {3, 0},  {4, 0},  {5, 0},  {6, 0},\r\n                                 {7, 0},  {8, 0},  {9, 0},  {10, 0}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 0}, {17, 0}, {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[14] = {0},\r\n    .txpwrlimit_config[15] = {0},\r\n    .txpwrlimit_config[16] = {0},\r\n    .txpwrlimit_config[17] = {0},\r\n    .txpwrlimit_config[18] = {0},\r\n    .txpwrlimit_config[19] = {0},\r\n    .txpwrlimit_config[20] = {0},\r\n    .txpwrlimit_config[21] = {0},\r\n    .txpwrlimit_config[22] = {0},\r\n    .txpwrlimit_config[23] = {0},\r\n    .txpwrlimit_config[24] = {0},\r\n    .txpwrlimit_config[25] = {0},\r\n    .txpwrlimit_config[26] = {0},\r\n    .txpwrlimit_config[27] = {0},\r\n    .txpwrlimit_config[28] = {0},\r\n    .txpwrlimit_config[29] = {0},\r\n    .txpwrlimit_config[30] = {0},\r\n    .txpwrlimit_config[31] = {0},\r\n    .txpwrlimit_config[32] = {0},\r\n    .txpwrlimit_config[33] = {0},\r\n    .txpwrlimit_config[34] = {0},\r\n    .txpwrlimit_config[35] = {0},\r\n    .txpwrlimit_config[36] = {0},\r\n    .txpwrlimit_config[37] = {0},\r\n    .txpwrlimit_config[38] = {0},\r\n    .txpwrlimit_config[39] = {0},\r\n};\r\n\r\n#if CONFIG_5GHz_SUPPORT\r\nstatic wifi_txpwrlimit_t tx_pwrlimit_5g_cfg = {\r\n    .subband   = (wifi_SubBand_t)0x00,\r\n    .num_chans = 25,\r\n    .txpwrlimit_config[0] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 36,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 20},  {4, 20}, {5, 20}, {6, 19},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 16}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[1] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 40,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 19},  {4, 20}, {5, 20}, {6, 18},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 16}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[2] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 44,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 18},  {4, 20}, {5, 20}, {6, 17},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 16}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[3] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 48,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 16},  {4, 20}, {5, 20}, {6, 16},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 16}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[4] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 52,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 17},  {4, 20}, {5, 20}, {6, 16},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 15}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 15}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[5] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 56,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 19},  {4, 20}, {5, 20}, {6, 18},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 15}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 15}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[6] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 60,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 18},  {4, 20}, {5, 20}, {6, 17},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 15}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 15}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[7] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 64,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 19}, {2, 19},  {3, 16},  {4, 18}, {5, 18}, {6, 15},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 15}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 15}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[8] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 100,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 19},  {4, 20}, {5, 20}, {6, 18},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 15}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 14}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[9] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 104,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 18},  {4, 20}, {5, 21}, {6, 18},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 15}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 14}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[10] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 108,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 19},  {4, 20}, {5, 21}, {6, 18},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 15}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 14}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[11] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 112,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 19},  {4, 20}, {5, 21}, {6, 18},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 15}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 14}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[12] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 116,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 21}, {2, 21},  {3, 19},  {4, 21}, {5, 20}, {6, 19},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 15}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 14}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[13] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 120,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 21}, {2, 21},  {3, 19},  {4, 21}, {5, 20}, {6, 18},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 15}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 14}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[14] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 124,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 21}, {2, 21},  {3, 18},  {4, 21}, {5, 20}, {6, 16},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 15}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 14}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[15] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 128,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 21}, {2, 21},  {3, 18},  {4, 21}, {5, 20}, {6, 16},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 15}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 14}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[16] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 132,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 21}, {2, 21},  {3, 18},  {4, 21}, {5, 20}, {6, 18},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 15}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 14}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[17] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 136,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 21}, {2, 21},  {3, 18},  {4, 21}, {5, 20}, {6, 18},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 15}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 14}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[18] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 140,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 21}, {2, 21},  {3, 16},  {4, 21}, {5, 20}, {6, 15},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 15}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 14}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[19] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 144,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 21}, {2, 21},  {3, 16},  {4, 21}, {5, 20}, {6, 15},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 15}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 14}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[20] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 149,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 18},  {4, 21}, {5, 21}, {6, 17},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 12}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 10}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[21] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 153,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 18},  {4, 21}, {5, 21}, {6, 16},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 12}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 10}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[22] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 157,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 15},  {4, 21}, {5, 21}, {6, 14},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 12}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 10}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[23] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 161,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 13},  {4, 21}, {5, 21}, {6, 12},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 12}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 10}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[24] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 165,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 13},  {4, 20}, {5, 20}, {6, 12},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 12}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 10}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[25] = {0},\r\n    .txpwrlimit_config[26] = {0},\r\n    .txpwrlimit_config[27] = {0},\r\n    .txpwrlimit_config[28] = {0},\r\n    .txpwrlimit_config[29] = {0},\r\n    .txpwrlimit_config[30] = {0},\r\n    .txpwrlimit_config[31] = {0},\r\n    .txpwrlimit_config[32] = {0},\r\n    .txpwrlimit_config[33] = {0},\r\n    .txpwrlimit_config[34] = {0},\r\n    .txpwrlimit_config[35] = {0},\r\n    .txpwrlimit_config[36] = {0},\r\n    .txpwrlimit_config[37] = {0},\r\n    .txpwrlimit_config[38] = {0},\r\n    .txpwrlimit_config[39] = {0},\r\n/* Rest of the channels listed below are not used and contains dummy power entries,\r\n * they belong to 4.9GHz Band for Public Safety.\r\n */\r\n#if 0\r\n    .txpwrlimit_config[25] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 183,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 20},  {4, 20}, {5, 20}, {6, 19},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 16}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[26] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 184,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 20},  {4, 20}, {5, 20}, {6, 19},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 18}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 18}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[27] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 185,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 20},  {4, 20}, {5, 20}, {6, 19},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 16}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[28] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 187,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 20},  {4, 20}, {5, 20}, {6, 19},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 16}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[29] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 188,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 20},  {4, 20}, {5, 20}, {6, 19},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 16}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[30] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 189,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 20},  {4, 20}, {5, 20}, {6, 19},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 16}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[31] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 192,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 20},  {4, 20}, {5, 20}, {6, 19},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 16}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[32] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 196,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 20},  {4, 20}, {5, 20}, {6, 19},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 16}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[33] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 7,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 20},  {4, 20}, {5, 20}, {6, 19},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 16}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[34] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 8,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 20},  {4, 20}, {5, 20}, {6, 19},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 16}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[35] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 11,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 20},  {4, 20}, {5, 20}, {6, 19},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 16}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[36] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 12,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 20},  {4, 20}, {5, 20}, {6, 19},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 16}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[37] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 16,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 20},  {4, 20}, {5, 20}, {6, 19},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 16}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n    .txpwrlimit_config[38] =\r\n        {\r\n            .num_mod_grps = 20,\r\n            .chan_desc =\r\n                {\r\n                    .start_freq = 5000,\r\n                    .chan_width = 20,\r\n                    .chan_num   = 34,\r\n                },\r\n            .txpwrlimit_entry = {{0, 0},  {1, 20}, {2, 20},  {3, 20},  {4, 20}, {5, 20}, {6, 19},\r\n                                 {7, 0},  {8, 0},  {9, 0},   {10, 16}, {11, 0}, {12, 0}, {13, 0},\r\n                                 {14, 0}, {15, 0}, {16, 16}, {17, 0},  {18, 0}, {19, 0}},\r\n        },\r\n#endif\r\n};\r\n#endif /* CONFIG_5GHz_SUPPORT */\r\n#endif /* CONFIG_11AX */\r\n\r\n#if CONFIG_11AX\r\n#if CONFIG_COMPRESS_RU_TX_PWTBL\r\nconst static uint8_t rutxpowerlimit_cfg_set_WW[] = {\r\n\t0x6d, 0x02, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x01, 0x04, 0x06, 0x0a, 0x0c,\r\n\t0x00, 0x00, 0x00, 0x04, 0x06, 0x0a, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x06, 0x0a, 0x0c, 0x00, 0x00,\r\n\t0x00, 0x06, 0x08, 0x0a, 0x0a, 0x00, 0x00, 0x00, 0x02, 0x05, 0x07, 0x07, 0x00, 0x00, 0x00, 0x02,\r\n\t0x05, 0x07, 0x07, 0x00, 0x00, 0x00, 0x06, 0x0b, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x06, 0x0b, 0x0e,\r\n\t0x0e, 0x00, 0x00, 0x00, 0x06, 0x09, 0x09, 0x09, 0x00, 0x00, 0x00, 0x09, 0x0c, 0x0e, 0x0e, 0x00,\r\n\t0x00, 0x00, 0x09, 0x0c, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x08, 0x0b, 0x0e, 0x0e, 0x00, 0x00, 0x00,\r\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x02, 0x03, 0x00, 0x88, 0x88, 0x00};\r\n\r\nconst static uint8_t rutxpowerlimit_cfg_set_FCC[] = {\r\n\t0x6d, 0x02, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x01, 0x11, 0x12, 0x12, 0x12,\r\n\t0x00, 0x00, 0x00, 0x11, 0x12, 0x12, 0x11, 0x00, 0x00, 0x00, 0x0f, 0x12, 0x11, 0x10, 0x00, 0x00,\r\n\t0x00, 0x0d, 0x0f, 0x11, 0x11, 0x00, 0x00, 0x00, 0x0d, 0x0f, 0x11, 0x11, 0x00, 0x00, 0x00, 0x0d,\r\n\t0x0f, 0x11, 0x11, 0x00, 0x00, 0x00, 0x0d, 0x0f, 0x11, 0x11, 0x00, 0x00, 0x00, 0x0d, 0x0f, 0x11,\r\n\t0x11, 0x00, 0x00, 0x00, 0x09, 0x09, 0x09, 0x09, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x00,\r\n\t0x00, 0x00, 0x11, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x08, 0x0b, 0x0e, 0x11, 0x00, 0x00, 0x00,\r\n\t0x13, 0x13, 0x12, 0x10, 0x00, 0x64, 0x02, 0x03, 0x00, 0x88, 0x88, 0x00};\r\n\r\nconst static uint8_t rutxpowerlimit_cfg_set_EU[] = {\r\n\t0x6d, 0x02, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x01, 0x06, 0x0b, 0x0f, 0x12,\r\n\t0x00, 0x00, 0x00, 0x0a, 0x0d, 0x10, 0x12, 0x00, 0x00, 0x00, 0x06, 0x09, 0x10, 0x11, 0x00, 0x00,\r\n\t0x00, 0x0d, 0x0f, 0x11, 0x11, 0x00, 0x00, 0x00, 0x09, 0x0c, 0x0f, 0x11, 0x00, 0x00, 0x00, 0x09,\r\n\t0x0c, 0x0f, 0x11, 0x00, 0x00, 0x00, 0x09, 0x0c, 0x0f, 0x11, 0x00, 0x00, 0x00, 0x09, 0x0c, 0x0f,\r\n\t0x11, 0x00, 0x00, 0x00, 0x09, 0x0c, 0x0f, 0x11, 0x00, 0x00, 0x00, 0x09, 0x0c, 0x0e, 0x0e, 0x00,\r\n\t0x00, 0x00, 0x09, 0x0c, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x09, 0x0c, 0x0e, 0x0e, 0x00, 0x00, 0x00,\r\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x02, 0x03, 0x00, 0x88, 0x88, 0x00};\r\n\r\nconst static uint8_t rutxpowerlimit_cfg_set_JP[] = {\r\n\t0x6d, 0x02, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x01, 0x04, 0x06, 0x0a, 0x0c,\r\n\t0x00, 0x00, 0x00, 0x04, 0x06, 0x0a, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x06, 0x0a, 0x0c, 0x00, 0x00,\r\n\t0x00, 0x06, 0x08, 0x0a, 0x0a, 0x00, 0x00, 0x00, 0x02, 0x05, 0x07, 0x07, 0x00, 0x00, 0x00, 0x02,\r\n\t0x05, 0x07, 0x07, 0x00, 0x00, 0x00, 0x09, 0x0c, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x09, 0x0c, 0x0e,\r\n\t0x0e, 0x00, 0x00, 0x00, 0x09, 0x0c, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x09, 0x0c, 0x0e, 0x0e, 0x00,\r\n\t0x00, 0x00, 0x09, 0x0c, 0x0e, 0x0e, 0x00, 0x00, 0x00, 0x09, 0x0c, 0x0e, 0x0e, 0x00, 0x00, 0x00,\r\n\t0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x02, 0x03, 0x00, 0x88, 0x88, 0x00};\r\n\r\nconst static uint8_t rutxpowerlimit_cfg_set_CN[] = {\r\n\t0x6d, 0x02, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x01, 0x05, 0x09, 0x0c, 0x10,\r\n\t0x00, 0x00, 0x00, 0x05, 0x09, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x05, 0x09, 0x0c, 0x10, 0x00, 0x00,\r\n\t0x00, 0x06, 0x0b, 0x0e, 0x11, 0x00, 0x00, 0x00, 0x06, 0x0b, 0x0e, 0x11, 0x00, 0x00, 0x00, 0x06,\r\n\t0x0b, 0x0e, 0x11, 0x00, 0x00, 0x00, 0x06, 0x0b, 0x0e, 0x11, 0x00, 0x00, 0x00, 0x06, 0x0b, 0x0e,\r\n\t0x11, 0x00, 0x00, 0x00, 0x06, 0x0b, 0x0e, 0x11, 0x00, 0x00, 0x00, 0x0e, 0x11, 0x11, 0x11, 0x00,\r\n\t0x00, 0x00, 0x0e, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00, 0x0e, 0x11, 0x11, 0x11, 0x00, 0x00, 0x00,\r\n\t0x10, 0x10, 0x10, 0x0f, 0x00, 0x64, 0x02, 0x03, 0x00, 0x88, 0x88, 0x00};\r\n#else\r\n#define MAX_2G_RU_PWR_CHANNELS 26\r\n#define MAX_5G_RU_PWR_CHANNELS 69\r\n// coverity[MISRA C-2012 Rule 2.2:SUPPRESS]\r\nconst static wlan_rutxpwrlimit_t rutxpowerlimit_2g_cfg_set = {\r\n    .num_chans            = MAX_2G_RU_PWR_CHANNELS,\r\n    .rupwrlimit_config[0] = {.start_freq = 2407, .width = 20, .chan_num = 1, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[1] = {.start_freq = 2407, .width = 20, .chan_num = 2, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[2] = {.start_freq = 2407, .width = 20, .chan_num = 3, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[3] = {.start_freq = 2407, .width = 20, .chan_num = 4, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[4] = {.start_freq = 2407, .width = 20, .chan_num = 5, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[5] = {.start_freq = 2407, .width = 20, .chan_num = 6, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[6] = {.start_freq = 2407, .width = 20, .chan_num = 7, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[7] = {.start_freq = 2407, .width = 20, .chan_num = 8, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[8] = {.start_freq = 2407, .width = 20, .chan_num = 9, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[9] = {.start_freq = 2407, .width = 20, .chan_num = 10, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[10] = {.start_freq = 2407, .width = 20, .chan_num = 11, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[11] = {.start_freq = 2407, .width = 20, .chan_num = 12, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[12] = {.start_freq = 2407, .width = 20, .chan_num = 13, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[13] = {.start_freq = 2407, .width = 40, .chan_num = 1, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[14] = {.start_freq = 2407, .width = 40, .chan_num = 2, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[15] = {.start_freq = 2407, .width = 40, .chan_num = 3, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[16] = {.start_freq = 2407, .width = 40, .chan_num = 4, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[17] = {.start_freq = 2407, .width = 40, .chan_num = 5, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[18] = {.start_freq = 2407, .width = 40, .chan_num = 6, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[19] = {.start_freq = 2407, .width = 40, .chan_num = 7, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[20] = {.start_freq = 2407, .width = 40, .chan_num = 8, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[21] = {.start_freq = 2407, .width = 40, .chan_num = 9, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[22] = {.start_freq = 2407, .width = 40, .chan_num = 10, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[23] = {.start_freq = 2407, .width = 40, .chan_num = 11, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[24] = {.start_freq = 2407, .width = 40, .chan_num = 12, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[25] = {.start_freq = 2407, .width = 40, .chan_num = 13, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n};\r\n\r\n#if CONFIG_5GHz_SUPPORT\r\n// coverity[MISRA C-2012 Rule 2.2:SUPPRESS]\r\nconst static wlan_rutxpwrlimit_t rutxpowerlimit_5g_cfg_set = {\r\n    .num_chans            = MAX_5G_RU_PWR_CHANNELS,\r\n    .rupwrlimit_config[0] = {.start_freq = 5000, .width = 20, .chan_num = 36, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[1] = {.start_freq = 5000, .width = 20, .chan_num = 40, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[2] = {.start_freq = 5000, .width = 20, .chan_num = 44, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[3] = {.start_freq = 5000, .width = 20, .chan_num = 48, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[4] = {.start_freq = 5000, .width = 20, .chan_num = 52, .ruPower = {-2, 1, 4, 7, 0, 0}},\r\n\r\n    .rupwrlimit_config[5] = {.start_freq = 5000, .width = 20, .chan_num = 56, .ruPower = {-2, 1, 4, 7, 0, 0}},\r\n\r\n    .rupwrlimit_config[6] = {.start_freq = 5000, .width = 20, .chan_num = 60, .ruPower = {-2, 1, 4, 7, 0, 0}},\r\n\r\n    .rupwrlimit_config[7] = {.start_freq = 5000, .width = 20, .chan_num = 64, .ruPower = {-2, 1, 4, 7, 0, 0}},\r\n\r\n    .rupwrlimit_config[8] = {.start_freq = 5000, .width = 20, .chan_num = 100, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[9] = {.start_freq = 5000, .width = 20, .chan_num = 104, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[10] = {.start_freq = 5000, .width = 20, .chan_num = 108, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[11] = {.start_freq = 5000, .width = 20, .chan_num = 112, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[12] = {.start_freq = 5000, .width = 20, .chan_num = 116, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[13] = {.start_freq = 5000, .width = 20, .chan_num = 120, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[14] = {.start_freq = 5000, .width = 20, .chan_num = 124, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[15] = {.start_freq = 5000, .width = 20, .chan_num = 128, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[16] = {.start_freq = 5000, .width = 20, .chan_num = 132, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[17] = {.start_freq = 5000, .width = 20, .chan_num = 136, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[18] = {.start_freq = 5000, .width = 20, .chan_num = 140, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[19] = {.start_freq = 5000, .width = 20, .chan_num = 144, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[20] = {.start_freq = 5000, .width = 20, .chan_num = 149, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[21] = {.start_freq = 5000, .width = 20, .chan_num = 153, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[22] = {.start_freq = 5000, .width = 20, .chan_num = 157, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[23] = {.start_freq = 5000, .width = 20, .chan_num = 161, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[24] = {.start_freq = 5000, .width = 20, .chan_num = 165, .ruPower = {-1, 2, 5, 8, 0, 0}},\r\n\r\n    .rupwrlimit_config[25] = {.start_freq = 5000, .width = 40, .chan_num = 36, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[26] = {.start_freq = 5000, .width = 40, .chan_num = 40, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[27] = {.start_freq = 5000, .width = 40, .chan_num = 44, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[28] = {.start_freq = 5000, .width = 40, .chan_num = 48, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[29] = {.start_freq = 5000, .width = 40, .chan_num = 52, .ruPower = {-5, -2, 1, 4, 7, 0}},\r\n\r\n    .rupwrlimit_config[30] = {.start_freq = 5000, .width = 40, .chan_num = 56, .ruPower = {-5, -2, 1, 4, 7, 0}},\r\n\r\n    .rupwrlimit_config[31] = {.start_freq = 5000, .width = 40, .chan_num = 60, .ruPower = {-5, -2, 1, 4, 7, 0}},\r\n\r\n    .rupwrlimit_config[32] = {.start_freq = 5000, .width = 40, .chan_num = 64, .ruPower = {-5, -2, 1, 4, 7, 0}},\r\n\r\n    .rupwrlimit_config[33] = {.start_freq = 5000, .width = 40, .chan_num = 100, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[34] = {.start_freq = 5000, .width = 40, .chan_num = 104, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[35] = {.start_freq = 5000, .width = 40, .chan_num = 108, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[36] = {.start_freq = 5000, .width = 40, .chan_num = 112, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[37] = {.start_freq = 5000, .width = 40, .chan_num = 116, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[38] = {.start_freq = 5000, .width = 40, .chan_num = 120, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[39] = {.start_freq = 5000, .width = 40, .chan_num = 124, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[40] = {.start_freq = 5000, .width = 40, .chan_num = 128, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[41] = {.start_freq = 5000, .width = 40, .chan_num = 132, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[42] = {.start_freq = 5000, .width = 40, .chan_num = 136, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[43] = {.start_freq = 5000, .width = 40, .chan_num = 140, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[44] = {.start_freq = 5000, .width = 40, .chan_num = 144, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[45] = {.start_freq = 5000, .width = 40, .chan_num = 149, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[46] = {.start_freq = 5000, .width = 40, .chan_num = 153, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[47] = {.start_freq = 5000, .width = 40, .chan_num = 157, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[48] = {.start_freq = 5000, .width = 40, .chan_num = 161, .ruPower = {-4, -1, 2, 5, 8, 0}},\r\n\r\n    .rupwrlimit_config[49] = {.start_freq = 5000, .width = 80, .chan_num = 36, .ruPower = {-7, -4, -1, 2, 5, 8}},\r\n\r\n    .rupwrlimit_config[50] = {.start_freq = 5000, .width = 80, .chan_num = 40, .ruPower = {-7, -4, -1, 2, 5, 8}},\r\n\r\n    .rupwrlimit_config[51] = {.start_freq = 5000, .width = 80, .chan_num = 44, .ruPower = {-7, -4, -1, 2, 5, 8}},\r\n\r\n    .rupwrlimit_config[52] = {.start_freq = 5000, .width = 80, .chan_num = 48, .ruPower = {-7, -4, -1, 2, 5, 8}},\r\n\r\n    .rupwrlimit_config[53] = {.start_freq = 5000, .width = 80, .chan_num = 52, .ruPower = {-8, -5, -2, 1, 4, 7}},\r\n\r\n    .rupwrlimit_config[54] = {.start_freq = 5000, .width = 80, .chan_num = 56, .ruPower = {-8, -5, -2, 1, 4, 7}},\r\n\r\n    .rupwrlimit_config[55] = {.start_freq = 5000, .width = 80, .chan_num = 60, .ruPower = {-8, -5, -2, 1, 4, 7}},\r\n\r\n    .rupwrlimit_config[56] = {.start_freq = 5000, .width = 80, .chan_num = 64, .ruPower = {-8, -5, -2, 1, 4, 7}},\r\n\r\n    .rupwrlimit_config[57] = {.start_freq = 5000, .width = 80, .chan_num = 100, .ruPower = {-7, -4, -1, 2, 5, 8}},\r\n\r\n    .rupwrlimit_config[58] = {.start_freq = 5000, .width = 80, .chan_num = 104, .ruPower = {-7, -4, -1, 2, 5, 8}},\r\n\r\n    .rupwrlimit_config[59] = {.start_freq = 5000, .width = 80, .chan_num = 108, .ruPower = {-7, -4, -1, 2, 5, 8}},\r\n\r\n    .rupwrlimit_config[60] = {.start_freq = 5000, .width = 80, .chan_num = 112, .ruPower = {-7, -4, -1, 2, 5, 8}},\r\n\r\n    .rupwrlimit_config[61] = {.start_freq = 5000, .width = 80, .chan_num = 116, .ruPower = {-7, -4, -1, 2, 5, 8}},\r\n\r\n    .rupwrlimit_config[62] = {.start_freq = 5000, .width = 80, .chan_num = 120, .ruPower = {-7, -4, -1, 2, 5, 8}},\r\n\r\n    .rupwrlimit_config[63] = {.start_freq = 5000, .width = 80, .chan_num = 124, .ruPower = {-7, -4, -1, 2, 5, 8}},\r\n\r\n    .rupwrlimit_config[64] = {.start_freq = 5000, .width = 80, .chan_num = 128, .ruPower = {-7, -4, -1, 2, 5, 8}},\r\n\r\n    .rupwrlimit_config[65] = {.start_freq = 5000, .width = 80, .chan_num = 149, .ruPower = {-7, -4, -1, 2, 5, 8}},\r\n\r\n    .rupwrlimit_config[66] = {.start_freq = 5000, .width = 80, .chan_num = 153, .ruPower = {-7, -4, -1, 2, 5, 8}},\r\n\r\n    .rupwrlimit_config[67] = {.start_freq = 5000, .width = 80, .chan_num = 157, .ruPower = {-7, -4, -1, 2, 5, 8}},\r\n\r\n    .rupwrlimit_config[68] = {.start_freq = 5000, .width = 80, .chan_num = 161, .ruPower = {-7, -4, -1, 2, 5, 8}},\r\n};\r\n#endif /* CONFIG_5GHz_SUPPORT */\r\n#endif /* CONFIG_COMPRESS_RU_TX_PWTBL */\r\n#endif /* CONFIG_11AX */\r\n\r\n#endif /* _WLAN_TXPWRLIMIT_CFG_WW_RW610_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/device/RW612.h",
    "content": "/*\r\n** ###################################################################\r\n**     Processors:          RW612ETA2I\r\n**                          RW612HNA2I\r\n**                          RW612UKA2I\r\n**\r\n**     Compilers:           GNU C Compiler\r\n**                          IAR ANSI C/C++ Compiler for ARM\r\n**                          Keil ARM C/C++ Compiler\r\n**                          MCUXpresso Compiler\r\n**\r\n**     Reference manual:    RW61X User manual Rev. 0.95, June 2022\r\n**     Version:             rev. 1.0, 2021-03-16\r\n**     Build:               b240411\r\n**\r\n**     Abstract:\r\n**         CMSIS Peripheral Access Layer for RW612\r\n**\r\n**     Copyright 1997-2016 Freescale Semiconductor, Inc.\r\n**     Copyright 2016-2024 NXP\r\n**     SPDX-License-Identifier: BSD-3-Clause\r\n**\r\n**     http:                 www.nxp.com\r\n**     mail:                 support@nxp.com\r\n**\r\n**     Revisions:\r\n**     - rev. 1.0 (2021-03-16)\r\n**         Initial version.\r\n**\r\n** ###################################################################\r\n*/\r\n\r\n/*!\r\n * @file RW612.h\r\n * @version 1.0\r\n * @date 2021-03-16\r\n * @brief CMSIS Peripheral Access Layer for RW612\r\n *\r\n * CMSIS Peripheral Access Layer for RW612\r\n */\r\n\r\n#if !defined(RW612_H_)\r\n#define RW612_H_                                 /**< Symbol preventing repeated inclusion */\r\n\r\n/** Memory map major version (memory maps with equal major version number are\r\n * compatible) */\r\n#define MCU_MEM_MAP_VERSION 0x0100U\r\n/** Memory map minor version */\r\n#define MCU_MEM_MAP_VERSION_MINOR 0x0000U\r\n\r\n/* ----------------------------------------------------------------------------\r\n   --\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/* global Backward compatibility */\r\n#define MRT0_IRQn                                MRT_IRQn\r\n#define MRT0_IRQHandler                          MRT_IRQHandler\r\n#define MRT0_DriverIRQHandler                    MRT_DriverIRQHandler\r\n#define MRT1_IRQn                                GFMRT_IRQn\r\n#define MRT1_IRQHandler                          GFMRT_IRQHandler\r\n#define MRT1_DriverIRQHandler                    GFMRT_DriverIRQHandler\r\n#define DMIC0_IRQn                               DMIC_IRQn\r\n#define DMIC0_IRQHandler                         DMIC_IRQHandler\r\n#define DMIC0_DriverIRQHandler                   DMIC_DriverIRQHandler\r\n#define WFD_IRQn                                 WKDEEPSLEEP_IRQn\r\n#define WFD_IRQHandler                           WKDEEPSLEEP_IRQHandler\r\n#define WFD_DriverIRQHandler                     WKDEEPSLEEP_DriverIRQHandler\r\n#define HWVAD0_IRQn                              HWVAD_IRQn\r\n#define HWVAD0_IRQHandler                        HWVAD_IRQHandler\r\n#define HWVAD0_DriverIRQHandler                  HWVAD_DriverIRQHandler\r\n#define OS_EVENT_IRQn                            OS_EVENT_TIMER_IRQn\r\n#define OS_EVENT_IRQHandler                      OS_EVENT_TIMER_IRQHandler\r\n#define OS_EVENT_DriverIRQHandler                OS_EVENT_TIMER_DriverIRQHandler\r\n#define SDU_IRQn                                 SDIO_IRQn\r\n#define SDU_IRQHandler                           SDIO_IRQHandler\r\n#define SDU_DriverIRQHandler                     SDIO_DriverIRQHandler\r\n#define LCDIC_IRQn                               LCD_IRQn\r\n#define LCDIC_IRQHandler                         LCD_IRQHandler\r\n#define LCDIC_DriverIRQHandler                   LCD_DriverIRQHandler\r\n#define CAPT_PULSE_IRQn                          CAPTIMER_IRQn\r\n#define CAPT_PULSE_IRQHandler                    CAPTIMER_IRQHandler\r\n#define CAPT_PULSE_DriverIRQHandler              CAPTIMER_DriverIRQHandler\r\n#define WL_MCI_WAKEUP_DONE0_IRQn                 W2MWKUP_DONE0_IRQn\r\n#define WL_MCI_WAKEUP_DONE0_IRQHandler           W2MWKUP_DONE0_IRQHandler\r\n#define WL_MCI_WAKEUP_DONE0_DriverIRQHandler     W2MWKUP_DONE0_DriverIRQHandler\r\n#define WL_MCI_WAKEUP_DONE1_IRQn                 W2MWKUP_DONE1_IRQn\r\n#define WL_MCI_WAKEUP_DONE1_IRQHandler           W2MWKUP_DONE1_IRQHandler\r\n#define WL_MCI_WAKEUP_DONE1_DriverIRQHandler     W2MWKUP_DONE1_DriverIRQHandler\r\n#define WL_MCI_WAKEUP_DONE2_IRQn                 W2MWKUP_DONE2_IRQn\r\n#define WL_MCI_WAKEUP_DONE2_IRQHandler           W2MWKUP_DONE2_IRQHandler\r\n#define WL_MCI_WAKEUP_DONE2_DriverIRQHandler     W2MWKUP_DONE2_DriverIRQHandler\r\n#define WL_MCI_WAKEUP_DONE3_IRQn                 W2MWKUP_DONE3_IRQn\r\n#define WL_MCI_WAKEUP_DONE3_IRQHandler           W2MWKUP_DONE3_IRQHandler\r\n#define WL_MCI_WAKEUP_DONE3_DriverIRQHandler     W2MWKUP_DONE3_DriverIRQHandler\r\n#define WL_MCI_WAKEUP_DONE4_IRQn                 W2MWKUP_DONE4_IRQn\r\n#define WL_MCI_WAKEUP_DONE4_IRQHandler           W2MWKUP_DONE4_IRQHandler\r\n#define WL_MCI_WAKEUP_DONE4_DriverIRQHandler     W2MWKUP_DONE4_DriverIRQHandler\r\n#define WL_MCI_WAKEUP_DONE5_IRQn                 W2MWKUP_DONE5_IRQn\r\n#define WL_MCI_WAKEUP_DONE5_IRQHandler           W2MWKUP_DONE5_IRQHandler\r\n#define WL_MCI_WAKEUP_DONE5_DriverIRQHandler     W2MWKUP_DONE5_DriverIRQHandler\r\n#define WL_MCI_WAKEUP_DONE6_IRQn                 W2MWKUP_DONE6_IRQn\r\n#define WL_MCI_WAKEUP_DONE6_IRQHandler           W2MWKUP_DONE6_IRQHandler\r\n#define WL_MCI_WAKEUP_DONE6_DriverIRQHandler     W2MWKUP_DONE6_DriverIRQHandler\r\n#define WL_MCI_WAKEUP_DONE7_IRQn                 W2MWKUP_DONE7_IRQn\r\n#define WL_MCI_WAKEUP_DONE7_IRQHandler           W2MWKUP_DONE7_IRQHandler\r\n#define WL_MCI_WAKEUP_DONE7_DriverIRQHandler     W2MWKUP_DONE7_DriverIRQHandler\r\n#define WL_MCI_WAKEUP0_IRQn                      W2MWKUP0_IRQn\r\n#define WL_MCI_WAKEUP0_IRQHandler                W2MWKUP0_IRQHandler\r\n#define WL_MCI_WAKEUP0_DriverIRQHandler          W2MWKUP0_DriverIRQHandler\r\n#define WL_MCI_WAKEUP1_IRQn                      W2MWKUP1_IRQn\r\n#define WL_MCI_WAKEUP1_IRQHandler                W2MWKUP1_IRQHandler\r\n#define WL_MCI_WAKEUP1_DriverIRQHandler          W2MWKUP1_DriverIRQHandler\r\n#define BLE_MCI_WAKEUP_DONE0_IRQn                B2MWKUP_DONE0_IRQn\r\n#define BLE_MCI_WAKEUP_DONE0_IRQHandler          B2MWKUP_DONE0_IRQHandler\r\n#define BLE_MCI_WAKEUP_DONE0_DriverIRQHandler    B2MWKUP_DONE0_DriverIRQHandler\r\n#define BLE_MCI_WAKEUP_DONE1_IRQn                B2MWKUP_DONE1_IRQn\r\n#define BLE_MCI_WAKEUP_DONE1_IRQHandler          B2MWKUP_DONE1_IRQHandler\r\n#define BLE_MCI_WAKEUP_DONE1_DriverIRQHandler    B2MWKUP_DONE1_DriverIRQHandler\r\n#define BLE_MCI_WAKEUP_DONE2_IRQn                B2MWKUP_DONE2_IRQn\r\n#define BLE_MCI_WAKEUP_DONE2_IRQHandler          B2MWKUP_DONE2_IRQHandler\r\n#define BLE_MCI_WAKEUP_DONE2_DriverIRQHandler    B2MWKUP_DONE2_DriverIRQHandler\r\n#define BLE_MCI_WAKEUP_DONE3_IRQn                B2MWKUP_DONE3_IRQn\r\n#define BLE_MCI_WAKEUP_DONE3_IRQHandler          B2MWKUP_DONE3_IRQHandler\r\n#define BLE_MCI_WAKEUP_DONE3_DriverIRQHandler    B2MWKUP_DONE3_DriverIRQHandler\r\n#define BLE_MCI_WAKEUP_DONE4_IRQn                B2MWKUP_DONE4_IRQn\r\n#define BLE_MCI_WAKEUP_DONE4_IRQHandler          B2MWKUP_DONE4_IRQHandler\r\n#define BLE_MCI_WAKEUP_DONE4_DriverIRQHandler    B2MWKUP_DONE4_DriverIRQHandler\r\n#define BLE_MCI_WAKEUP_DONE5_IRQn                B2MWKUP_DONE5_IRQn\r\n#define BLE_MCI_WAKEUP_DONE5_IRQHandler          B2MWKUP_DONE5_IRQHandler\r\n#define BLE_MCI_WAKEUP_DONE5_DriverIRQHandler    B2MWKUP_DONE5_DriverIRQHandler\r\n#define BLE_MCI_WAKEUP_DONE6_IRQn                B2MWKUP_DONE6_IRQn\r\n#define BLE_MCI_WAKEUP_DONE6_IRQHandler          B2MWKUP_DONE6_IRQHandler\r\n#define BLE_MCI_WAKEUP_DONE6_DriverIRQHandler    B2MWKUP_DONE6_DriverIRQHandler\r\n#define BLE_MCI_WAKEUP_DONE7_IRQn                B2MWKUP_DONE7_IRQn\r\n#define BLE_MCI_WAKEUP_DONE7_IRQHandler          B2MWKUP_DONE7_IRQHandler\r\n#define BLE_MCI_WAKEUP_DONE7_DriverIRQHandler    B2MWKUP_DONE7_DriverIRQHandler\r\n#define BLE_MCI_WAKEUP0_IRQn                     B2MWKUP0_IRQn\r\n#define BLE_MCI_WAKEUP0_IRQHandler               B2MWKUP0_IRQHandler\r\n#define BLE_MCI_WAKEUP0_DriverIRQHandler         B2MWKUP0_DriverIRQHandler\r\n#define BLE_MCI_WAKEUP1_IRQn                     B2MWKUP1_IRQn\r\n#define BLE_MCI_WAKEUP1_IRQHandler               B2MWKUP1_IRQHandler\r\n#define BLE_MCI_WAKEUP1_DriverIRQHandler         B2MWKUP1_DriverIRQHandler\r\n#define ELS_GDET_IRQ_IRQn                        ELS_GDET_IRQn\r\n#define ELS_GDET_IRQ_IRQHandler                  ELS_GDET_IRQHandler\r\n#define ELS_GDET_IRQ_DriverIRQHandler            ELS_GDET_DriverIRQHandler\r\n#define ELS_GDET_ERR_IRQn                        ELS_GDET_UM_IRQn\r\n#define ELS_GDET_ERR_IRQHandler                  ELS_GDET_UM_IRQHandler\r\n#define ELS_GDET_ERR_DriverIRQHandler            ELS_GDET_UM_DriverIRQHandler\r\n#define PKC_IRQn                                 PKC_INT_IRQn\r\n#define PKC_IRQHandler                           PKC_INT_IRQHandler\r\n#define PKC_DriverIRQHandler                     PKC_INT_DriverIRQHandler\r\n#define CDOG_IRQn                                CDOG_INT_IRQn\r\n#define CDOG_IRQHandler                          CDOG_INT_IRQHandler\r\n#define CDOG_DriverIRQHandler                    CDOG_INT_DriverIRQHandler\r\n#define GAU_GPDAC_INT_FUNC11_IRQn                GAU_DAC_IRQn\r\n#define GAU_GPDAC_INT_FUNC11_IRQHandler          GAU_DAC_IRQHandler\r\n#define GAU_GPDAC_INT_FUNC11_DriverIRQHandler    GAU_DAC_DriverIRQHandler\r\n#define GAU_ACOMP_INT_WKUP11_IRQn                GAU_ACOMP_WKUP_IRQn\r\n#define GAU_ACOMP_INT_WKUP11_IRQHandler          GAU_ACOMP_WKUP_IRQHandler\r\n#define GAU_ACOMP_INT_WKUP11_DriverIRQHandler    GAU_ACOMP_WKUP_DriverIRQHandler\r\n#define GAU_ACOMP_INT_FUNC11_IRQn                GAU_ACOMP_IRQn\r\n#define GAU_ACOMP_INT_FUNC11_IRQHandler          GAU_ACOMP_IRQHandler\r\n#define GAU_ACOMP_INT_FUNC11_DriverIRQHandler    GAU_ACOMP_DriverIRQHandler\r\n#define GAU_GPADC1_INT_FUNC11_IRQn               GAU_ADC1_IRQn\r\n#define GAU_GPADC1_INT_FUNC11_IRQHandler         GAU_ADC1_IRQHandler\r\n#define GAU_GPADC1_INT_FUNC11_DriverIRQHandler   GAU_ADC1_DriverIRQHandler\r\n#define GAU_GPADC0_INT_FUNC11_IRQn               GAU_ADC0_IRQn\r\n#define GAU_GPADC0_INT_FUNC11_IRQHandler         GAU_ADC0_IRQHandler\r\n#define GAU_GPADC0_INT_FUNC11_DriverIRQHandler   GAU_ADC0_DriverIRQHandler\r\n#define OCOTP_IRQn                               OTP_IRQn\r\n#define OCOTP_IRQHandler                         OTP_IRQHandler\r\n#define OCOTP_DriverIRQHandler                   OTP_DriverIRQHandler\r\n#define BOD_1_85_INT_IRQn                        PMIP_IRQn\r\n#define BOD_1_85_INT_IRQHandler                  PMIP_IRQHandler\r\n#define BOD_1_85_INT_DriverIRQHandler            PMIP_DriverIRQHandler\r\n#define BOD_1_85_NEG_IRQn                        PMIP_CHANGE_IRQn\r\n#define BOD_1_85_NEG_IRQHandler                  PMIP_CHANGE_IRQHandler\r\n#define BOD_1_85_NEG_DriverIRQHandler            PMIP_CHANGE_DriverIRQHandler\r\n#define AHB_MEM_ACC_CHECKER_VIO_INT_C_OR_IRQn               ACC_C_INT_IRQn\r\n#define AHB_MEM_ACC_CHECKER_VIO_INT_C_OR_IRQHandler         ACC_C_INT_IRQHandler\r\n#define AHB_MEM_ACC_CHECKER_VIO_INT_C_OR_DriverIRQHandler   ACC_C_INT_DriverIRQHandler\r\n#define AHB_MEM_ACC_CHECKER_VIO_INT_S_OR_IRQn               ACC_S_INT_IRQn\r\n#define AHB_MEM_ACC_CHECKER_VIO_INT_S_OR_IRQHandler         ACC_S_INT_IRQHandler\r\n#define AHB_MEM_ACC_CHECKER_VIO_INT_S_OR_DriverIRQHandler   ACC_S_INT_DriverIRQHandler\r\n#define WL_ACC_INT_IRQn                          WACC_IRQn\r\n#define WL_ACC_INT_IRQHandler                    WACC_IRQHandler\r\n#define WL_ACC_INT_DriverIRQHandler              WACC_DriverIRQHandler\r\n#define BLE_ACC_INT_IRQn                         BACC_IRQn\r\n#define BLE_ACC_INT_IRQHandler                   BACC_IRQHandler\r\n#define BLE_ACC_INT_DriverIRQHandler             BACC_DriverIRQHandler\r\n\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- Interrupt vector numbers\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup Interrupt_vector_numbers Interrupt vector numbers\r\n * @{\r\n */\r\n\r\n/** Interrupt Number Definitions */\r\n#define NUMBER_OF_INT_VECTORS 145                /**< Number of interrupts in the Vector table */\r\n\r\ntypedef enum IRQn {\r\n  /* Auxiliary constants */\r\n  NotAvail_IRQn                = -128,             /**< Not available device specific interrupt */\r\n\r\n  /* Core interrupts */\r\n  NonMaskableInt_IRQn          = -14,              /**< Non Maskable Interrupt */\r\n  HardFault_IRQn               = -13,              /**< Cortex-M33 SV Hard Fault Interrupt */\r\n  MemoryManagement_IRQn        = -12,              /**< Cortex-M33 Memory Management Interrupt */\r\n  BusFault_IRQn                = -11,              /**< Cortex-M33 Bus Fault Interrupt */\r\n  UsageFault_IRQn              = -10,              /**< Cortex-M33 Usage Fault Interrupt */\r\n  SecureFault_IRQn             = -9,               /**< Cortex-M33 Secure Fault Interrupt */\r\n  SVCall_IRQn                  = -5,               /**< Cortex-M33 SV Call Interrupt */\r\n  DebugMonitor_IRQn            = -4,               /**< Cortex-M33 Debug Monitor Interrupt */\r\n  PendSV_IRQn                  = -2,               /**< Cortex-M33 Pend SV Interrupt */\r\n  SysTick_IRQn                 = -1,               /**< Cortex-M33 System Tick Interrupt */\r\n\r\n  /* Device specific interrupts */\r\n  WDT0_IRQn                    = 0,                /**< Windowed watchdog timer 0 (WDT0)(Cortex-M33 watchdog) */\r\n  DMA0_IRQn                    = 1,                /**< Direct memory access (DMA) controller 0 (secure or Cortex-M33 DMA) */\r\n  GPIO_INTA_IRQn               = 2,                /**< GPIO interrupt A */\r\n  GPIO_INTB_IRQn               = 3,                /**< GPIO interrupt B */\r\n  PIN_INT0_IRQn                = 4,                /**< Pin interrupt 0 or pattern match engine slice 0 */\r\n  PIN_INT1_IRQn                = 5,                /**< Pin interrupt 1 or pattern match engine slice 1 */\r\n  PIN_INT2_IRQn                = 6,                /**< Pin interrupt 2 or pattern match engine slice 2 */\r\n  PIN_INT3_IRQn                = 7,                /**< Pin interrupt 3 or pattern match engine slice 3 */\r\n  UTICK_IRQn                   = 8,                /**< Micro-tick Timer (UTICK) */\r\n  MRT_IRQn                     = 9,                /**< Multi-Rate Timer (MRT). Global MRT interrupts */\r\n  CTIMER0_IRQn                 = 10,               /**< Standard counter/timer CTIMER0 */\r\n  CTIMER1_IRQn                 = 11,               /**< Standard counter/timer CTIMER1 */\r\n  SCT0_IRQn                    = 12,               /**< SCTimer/PWM */\r\n  CTIMER3_IRQn                 = 13,               /**< Standard counter/timer CTIMER3 */\r\n  FLEXCOMM0_IRQn               = 14,               /**< Flexcomm Interface 0 (USART, SPI, I2C, I2S) */\r\n  FLEXCOMM1_IRQn               = 15,               /**< Flexcomm Interface 1 (USART, SPI, I2C, I2S) */\r\n  FLEXCOMM2_IRQn               = 16,               /**< Flexcomm Interface 2 (USART, SPI, I2C, I2S) */\r\n  FLEXCOMM3_IRQn               = 17,               /**< Flexcomm Interface 3 (USART, SPI, I2C, I2S) */\r\n  Reserved34_IRQn              = 18,               /**< Reserved interrupt */\r\n  Reserved35_IRQn              = 19,               /**< Reserved interrupt */\r\n  FLEXCOMM14_IRQn              = 20,               /**< Flexcomm Interface 14 (USART, SPI, I2C, I2S) */\r\n  Reserved37_IRQn              = 21,               /**< Reserved interrupt */\r\n  Reserved38_IRQn              = 22,               /**< Reserved interrupt */\r\n  GFMRT_IRQn                   = 23,               /**< Free Multi-rate timer (GFMRT). Global MRT interrupts */\r\n  Reserved40_IRQn              = 24,               /**< Reserved interrupt */\r\n  DMIC_IRQn                    = 25,               /**< Digital microphone (DMIC) and DMIC subsystem */\r\n  WKDEEPSLEEP_IRQn             = 26,               /**< Wake-up from deep sleep */\r\n  HYPERVISOR_IRQn              = 27,               /**< Hypervisor service software interrupt */\r\n  SECUREVIOLATION_IRQn         = 28,               /**< Secure violation */\r\n  HWVAD_IRQn                   = 29,               /**< Hardware Voice Activity Detector */\r\n  Reserved46_IRQn              = 30,               /**< Reserved interrupt */\r\n  Reserved47_IRQn              = 31,               /**< Reserved interrupt */\r\n  RTC_IRQn                     = 32,               /**< RTC alarm and wake-up */\r\n  Reserved49_IRQn              = 33,               /**< Reserved interrupt */\r\n  Reserved50_IRQn              = 34,               /**< Reserved interrupt */\r\n  PIN_INT4_IRQn                = 35,               /**< Pin interrupt 4 or pattern match engine slice 4 */\r\n  PIN_INT5_IRQn                = 36,               /**< Pin interrupt 5 or pattern match engine slice 5 */\r\n  PIN_INT6_IRQn                = 37,               /**< Pin interrupt 6 or pattern match engine slice 6 */\r\n  PIN_INT7_IRQn                = 38,               /**< Pin interrupt 7 or pattern match engine slice 7 */\r\n  CTIMER2_IRQn                 = 39,               /**< Standard counter/timer CTIMER2 */\r\n  CTIMER4_IRQn                 = 40,               /**< Standard counter/timer CTIMER4 */\r\n  OS_EVENT_TIMER_IRQn          = 41,               /**< OS event timer 0 */\r\n  FLEXSPI_IRQn                 = 42,               /**< FLEXSPI interface */\r\n  Reserved59_IRQn              = 43,               /**< Reserved interrupt */\r\n  Reserved60_IRQn              = 44,               /**< Reserved interrupt */\r\n  Reserved61_IRQn              = 45,               /**< Reserved interrupt */\r\n  SDIO_IRQn                    = 46,               /**< The secure digital interface */\r\n  SGPIO_INTA_IRQn              = 47,               /**< Secure GPIO interrupt A */\r\n  SGPIO_INTB_IRQn              = 48,               /**< Secure GPIO interrupt B */\r\n  Reserved65_IRQn              = 49,               /**< Reserved interrupt */\r\n  USB_IRQn                     = 50,               /**< High-speed USB device/host */\r\n  Reserved67_IRQn              = 51,               /**< Reserved interrupt */\r\n  Reserved68_IRQn              = 52,               /**< Reserved interrupt */\r\n  Reserved69_IRQn              = 53,               /**< Reserved interrupt */\r\n  DMA1_IRQn                    = 54,               /**< DMA controller 1 (non-secure or HiFi 4 DMA) */\r\n  PUF_IRQn                     = 55,               /**< Physical Unclonable Function */\r\n  POWERQUAD_IRQn               = 56,               /**< PowerQuad math coprocessor */\r\n  Reserved73_IRQn              = 57,               /**< Reserved interrupt */\r\n  Reserved74_IRQn              = 58,               /**< Reserved interrupt */\r\n  Reserved75_IRQn              = 59,               /**< Reserved interrupt */\r\n  Reserved76_IRQn              = 60,               /**< Reserved interrupt */\r\n  LCD_IRQn                     = 61,               /**< LCDIC */\r\n  CAPTIMER_IRQn                = 62,               /**< Capture timer */\r\n  Reserved79_IRQn              = 63,               /**< Reserved interrupt */\r\n  W2MWKUP_DONE0_IRQn           = 64,               /**< Wi-Fi to MCU, wakeup done 0 */\r\n  W2MWKUP_DONE1_IRQn           = 65,               /**< Wi-Fi to MCU, wakeup done 1 */\r\n  W2MWKUP_DONE2_IRQn           = 66,               /**< Wi-Fi to MCU, wakeup done 2 */\r\n  W2MWKUP_DONE3_IRQn           = 67,               /**< Wi-Fi to MCU, wakeup done 3 */\r\n  W2MWKUP_DONE4_IRQn           = 68,               /**< Wi-Fi to MCU, wakeup done 4 */\r\n  W2MWKUP_DONE5_IRQn           = 69,               /**< Wi-Fi to MCU, wakeup done 5 */\r\n  W2MWKUP_DONE6_IRQn           = 70,               /**< Wi-Fi to MCU, wakeup done 6 */\r\n  W2MWKUP_DONE7_IRQn           = 71,               /**< Wi-Fi to MCU, wakeup done 7 */\r\n  W2MWKUP0_IRQn                = 72,               /**< Wi-Fi to MCU, wakeup signal 0 */\r\n  W2MWKUP1_IRQn                = 73,               /**< Wi-Fi to MCU, wakueup signal 1 */\r\n  WL_MCI_INT0_IRQn             = 74,               /**< Wi-Fi to MCU interrupt 0 */\r\n  WL_MCI_INT1_IRQn             = 75,               /**< Reserved for Wi-Fi to MCU */\r\n  WL_MCI_INT2_IRQn             = 76,               /**< Reserved for Wi-Fi to MCU */\r\n  WL_MCI_INT3_IRQn             = 77,               /**< Reserved for Wi-Fi to MCU */\r\n  WL_MCI_INT4_IRQn             = 78,               /**< Reserved for Wi-Fi to MCU */\r\n  WL_MCI_INT5_IRQn             = 79,               /**< Reserved for Wi-Fi to MCU */\r\n  WL_MCI_INT6_IRQn             = 80,               /**< Reserved for Wi-Fi to MCU */\r\n  WL_MCI_INT7_IRQn             = 81,               /**< Reserved for Wi-Fi to MCU */\r\n  B2MWKUP_DONE0_IRQn           = 82,               /**< Bluetooth LE/802.15.4 radio to MCU, wakeup done 0 */\r\n  B2MWKUP_DONE1_IRQn           = 83,               /**< Bluetooth LE/802.15.4 radio to MCU, wakeup done 1 */\r\n  B2MWKUP_DONE2_IRQn           = 84,               /**< Bluetooth LE/802.15.4 radio to MCU, wakeup done 2 */\r\n  B2MWKUP_DONE3_IRQn           = 85,               /**< Bluetooth LE/802.15.4 radio to MCU, wakeup done 3 */\r\n  B2MWKUP_DONE4_IRQn           = 86,               /**< Bluetooth LE/802.15.4 radio to MCU, wakeup done 4 */\r\n  B2MWKUP_DONE5_IRQn           = 87,               /**< Bluetooth LE/802.15.4 radio to MCU, wakeup done 5 */\r\n  B2MWKUP_DONE6_IRQn           = 88,               /**< Bluetooth LE/802.15.4 radio to MCU, wakeup done 6 */\r\n  B2MWKUP_DONE7_IRQn           = 89,               /**< Bluetooth LE/802.15.4 radio to MCU, wakeup done 7 */\r\n  B2MWKUP0_IRQn                = 90,               /**< Bluetooth LE/802.15.4 radio to MCU, wakeup signal 0 */\r\n  B2MWKUP1_IRQn                = 91,               /**< Bluetooth LE/802.15.4 radio to MCU, wakeup signal 1 */\r\n  BLE_MCI_INT0_IRQn            = 92,               /**< Bluetooth LE/802.15.4 radio to MCU interrupt 0 */\r\n  BLE_MCI_INT1_IRQn            = 93,               /**< Reserved for Bluetooth LE/802.15.4 radio to MCU */\r\n  BLE_MCI_INT2_IRQn            = 94,               /**< Reserved for Bluetooth LE/802.15.4 radio to MCU */\r\n  BLE_MCI_INT3_IRQn            = 95,               /**< Reserved for Bluetooth LE/802.15.4 radio to MCU */\r\n  BLE_MCI_INT4_IRQn            = 96,               /**< Reserved for Bluetooth LE/802.15.4 radio to MCU */\r\n  BLE_MCI_INT5_IRQn            = 97,               /**< Reserved for Bluetooth LE/802.15.4 radio to MCU */\r\n  BLE_MCI_INT6_IRQn            = 98,               /**< Reserved for Bluetooth LE/802.15.4 radio to MCU */\r\n  BLE_MCI_INT7_IRQn            = 99,               /**< Reserved for Bluetooth LE/802.15.4 radio to MCU */\r\n  PIN0_INT_IRQn                = 100,              /**< From AON GPIO */\r\n  PIN1_INT_IRQn                = 101,              /**< From AON GPIO */\r\n  ELS_IRQn                     = 102,              /**< EdgeLock subsystem (ELS) */\r\n  ELS_GDET_IRQn                = 103,              /**< ELS IRQ line for GDET error */\r\n  ELS_GDET_UM_IRQn             = 104,              /**< ELS un-gated latched error */\r\n  PKC_INT_IRQn                 = 105,              /**< Public key crypto-processor (PKC) interrupt */\r\n  PKC_ERR_IRQn                 = 106,              /**< PKC error */\r\n  CDOG_INT_IRQn                = 107,              /**< Code watch dog timmer interrupt */\r\n  GAU_DAC_IRQn                 = 108,              /**< General analog unit (GAU) digital to analog converter (DAC) */\r\n  GAU_ACOMP_WKUP_IRQn          = 109,              /**< GAU analog comparator (ACOMP) wake-up */\r\n  GAU_ACOMP_IRQn               = 110,              /**< GAU analog comparator */\r\n  GAU_ADC1_IRQn                = 111,              /**< GAU analog to digital converter 1 (ADC1) */\r\n  GAU_ADC0_IRQn                = 112,              /**< GAU analog to digital converter 0 (ADC0) */\r\n  USIM_IRQn                    = 113,              /**< Universal subscriber identity module (USIM) interface */\r\n  OTP_IRQn                     = 114,              /**< One time programmable (OTP) memory interrupt */\r\n  ENET_IRQn                    = 115,              /**< Etheret interrupt */\r\n  ENET_TIMER_IRQn              = 116,              /**< Ethernet timer interrupt */\r\n  PMIP_IRQn                    = 117,              /**< Power management IP (PMIP) */\r\n  PMIP_CHANGE_IRQn             = 118,              /**< PMIP change from 1 to 0 */\r\n  ITRC_IRQn                    = 119,              /**< Intrusion and tamper response controller (ITRC) interrupt request */\r\n  Reserved136_IRQn             = 120,              /**< Reserved interrupt */\r\n  Reserved137_IRQn             = 121,              /**< Reserved interrupt */\r\n  Reserved138_IRQn             = 122,              /**< Reserved interrupt */\r\n  TRNG_IRQn                    = 123,              /**< TRNG interrupt request */\r\n  ACC_C_INT_IRQn               = 124,              /**< AHB memory access checker - Cortex-M33 code bus */\r\n  ACC_S_INT_IRQn               = 125,              /**< AHB memory access checker - Cortex-M33 sys bus */\r\n  WACC_IRQn                    = 126,              /**< Wi-Fi accessed during power off */\r\n  BACC_IRQn                    = 127,              /**< Bluetooth LE/802.15.4 radio accessed during power off */\r\n  GDMA_IRQn                    = 128               /**< General purpose direct memory access (GDMA) interrupt */\r\n} IRQn_Type;\r\n\r\n/*!\r\n * @}\r\n */ /* end of group Interrupt_vector_numbers */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- Cortex M33 Core Configuration\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup Cortex_Core_Configuration Cortex M33 Core Configuration\r\n * @{\r\n */\r\n\r\n#define __MPU_PRESENT                  1         /**< Defines if an MPU is present or not */\r\n#define __NVIC_PRIO_BITS               3         /**< Number of priority bits implemented in the NVIC */\r\n#define __Vendor_SysTickConfig         0         /**< Vendor specific implementation of SysTickConfig is defined */\r\n#define __FPU_PRESENT                  1         /**< Defines if an FPU is present or not */\r\n#define __DSP_PRESENT                  0         /**< Defines if Armv8-M Mainline core supports DSP instructions */\r\n#define __SAUREGION_PRESENT            1         /**< Defines if an SAU is present or not */\r\n\r\n#include \"core_cm33.h\"                 /* Core Peripheral Access Layer */\r\n#include \"system_RW612.h\"              /* Device specific configuration file */\r\n\r\n/*!\r\n * @}\r\n */ /* end of group Cortex_Core_Configuration */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- Mapping Information\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup Mapping_Information Mapping Information\r\n * @{\r\n */\r\n\r\n/** Mapping Information */\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*!\r\n * @brief The enumeration of dac channel trigger sources.\r\n */\r\n\r\ntypedef enum _dac_channel_trigger_source\r\n{\r\n    kDAC_TriggerSourceCtimer1Match2 = 0U,          /**< Use CTimer1 match 2 as trigger source. */\r\n    kDAC_TriggerSourceCtimer1Match1 = 1U,          /**< Use CTimer1 match 1 as trigger source. */\r\n    kDAC_TriggerSourceGpio50        = 2U,          /**< Use GPIO50 as trigger source. */\r\n    kDAC_TriggerSourceGpio55        = 3U,          /**< Use GPIO55 as trigger source. */\r\n} dac_channel_trigger_source_t;\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*!\r\n * @brief ADC trigger source, including software trigger and multiple hardware trigger sources.\r\n */\r\n\r\ntypedef enum _adc_trigger_source\r\n{\r\n    kADC_TriggerSourceCtimer        = 0U,          /**< Hardware trigger, trigger source 0:CTimer3_match1 for ADC0, CTimer3_match2 for ADC1. */\r\n    kADC_TriggerSourceAcomp         = 1U,          /**< Hardware trigger, trigger source 1: ACOMP0 for ADC0, ACMP1 for ADC1. */\r\n    kADC_TriggerSourceGpio50        = 2U,          /**< Hardware trigger, trigger source 2: GPIO50. */\r\n    kADC_TriggerSourceGpio55        = 3U,          /**< Hardware trigger, trigger source 3: GPIO55. */\r\n    kADC_TriggerSourceSoftware      = 4U,          /**< Software trigger. */\r\n} adc_trigger_source_t;\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group Mapping_Information */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- Device Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup Peripheral_access_layer Device Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n\r\n/*\r\n** Start of section using anonymous unions\r\n*/\r\n\r\n#if defined(__ARMCC_VERSION)\r\n  #if (__ARMCC_VERSION >= 6010050)\r\n    #pragma clang diagnostic push\r\n  #else\r\n    #pragma push\r\n    #pragma anon_unions\r\n  #endif\r\n#elif defined(__GNUC__)\r\n  /* anonymous unions are enabled by default */\r\n#elif defined(__IAR_SYSTEMS_ICC__)\r\n  #pragma language=extended\r\n#else\r\n  #error Not supported compiler type\r\n#endif\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- ACOMP Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup ACOMP_Peripheral_Access_Layer ACOMP Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** ACOMP - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t CTRL0;                             /**< ACOMP0 Control Register, offset: 0x0 */\r\n  __IO uint32_t CTRL1;                             /**< ACOMP1 Control Register, offset: 0x4 */\r\n  __I  uint32_t STATUS0;                           /**< ACOMP0 Status Register, offset: 0x8 */\r\n  __I  uint32_t STATUS1;                           /**< ACOMP1 Status Register, offset: 0xC */\r\n  __IO uint32_t ROUTE0;                            /**< ACOMP0 Route Register, offset: 0x10 */\r\n  __IO uint32_t ROUTE1;                            /**< ACOMP1 Route Register, offset: 0x14 */\r\n  __I  uint32_t ISR0;                              /**< ACOMP0 Interrupt Status Register, offset: 0x18 */\r\n  __I  uint32_t ISR1;                              /**< ACOMP1 Interrupt Status Register, offset: 0x1C */\r\n  __IO uint32_t IMR0;                              /**< ACOMP0 Interrupt Mask Register, offset: 0x20 */\r\n  __IO uint32_t IMR1;                              /**< ACOMP1 Interrupt Mask Register, offset: 0x24 */\r\n  __I  uint32_t IRSR0;                             /**< ACOMP0 Interrupt Raw Status Register, offset: 0x28 */\r\n  __I  uint32_t IRSR1;                             /**< ACOMP1 Interrupt Raw Status Register, offset: 0x2C */\r\n  __IO uint32_t ICR0;                              /**< ACOMP0 Interrupt Clear Register, offset: 0x30 */\r\n  __IO uint32_t ICR1;                              /**< ACOMP1 Interrupt Clear Register, offset: 0x34 */\r\n  __IO uint32_t RST0;                              /**< ACOMP0 Soft Reset Register, offset: 0x38 */\r\n  __IO uint32_t RST1;                              /**< ACOMP1 Soft Reset Register, offset: 0x3C */\r\n       uint8_t RESERVED_0[8];\r\n  __IO uint32_t CLK;                               /**< Clock Register, offset: 0x48 */\r\n} ACOMP_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- ACOMP Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup ACOMP_Register_Masks ACOMP Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name CTRL0 - ACOMP0 Control Register */\r\n/*! @{ */\r\n\r\n#define ACOMP_CTRL0_EN_MASK                      (0x1U)\r\n#define ACOMP_CTRL0_EN_SHIFT                     (0U)\r\n/*! EN - ACOMP0 enable\r\n *  0b0..\r\n *  0b1..\r\n */\r\n#define ACOMP_CTRL0_EN(x)                        (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL0_EN_SHIFT)) & ACOMP_CTRL0_EN_MASK)\r\n\r\n#define ACOMP_CTRL0_GPIOINV_MASK                 (0x2U)\r\n#define ACOMP_CTRL0_GPIOINV_SHIFT                (1U)\r\n/*! GPIOINV - Enable/Disable inversion of ACOMP0 output to GPIO.\r\n *  0b0..do not invert ACOMP0 output\r\n *  0b1..invert ACOMP0 output\r\n */\r\n#define ACOMP_CTRL0_GPIOINV(x)                   (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL0_GPIOINV_SHIFT)) & ACOMP_CTRL0_GPIOINV_MASK)\r\n\r\n#define ACOMP_CTRL0_WARMTIME_MASK                (0xCU)\r\n#define ACOMP_CTRL0_WARMTIME_SHIFT               (2U)\r\n/*! WARMTIME - Set ACOMP0 Warm-Up time\r\n *  0b00..1 us\r\n *  0b01..2 us\r\n *  0b10..4 us\r\n *  0b11..8 us\r\n */\r\n#define ACOMP_CTRL0_WARMTIME(x)                  (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL0_WARMTIME_SHIFT)) & ACOMP_CTRL0_WARMTIME_MASK)\r\n\r\n#define ACOMP_CTRL0_HYST_SELN_MASK               (0x70U)\r\n#define ACOMP_CTRL0_HYST_SELN_SHIFT              (4U)\r\n/*! HYST_SELN - Select ACOMP0 negative hysteresis voltage level.\r\n *  0b000..no hysteresis\r\n *  0b001..-10 mV hysteresis\r\n *  0b010..-20 mV hysteresis\r\n *  0b011..-30 mV hysteresis\r\n *  0b100..-40 mV hysteresis\r\n *  0b101..-50 mV hysteresis\r\n *  0b110..-60 mV hysteresis\r\n *  0b111..-70 mV hysteresis\r\n */\r\n#define ACOMP_CTRL0_HYST_SELN(x)                 (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL0_HYST_SELN_SHIFT)) & ACOMP_CTRL0_HYST_SELN_MASK)\r\n\r\n#define ACOMP_CTRL0_HYST_SELP_MASK               (0x380U)\r\n#define ACOMP_CTRL0_HYST_SELP_SHIFT              (7U)\r\n/*! HYST_SELP - Select ACOMP0 positive hysteresis voltage level.\r\n *  0b000..No hysteresis\r\n *  0b001..+10 mV hysteresis\r\n *  0b010..+20 mV hysteresis\r\n *  0b011..+30 mV hysteresis\r\n *  0b100..+40 mV hysteresis\r\n *  0b101..+50 mV hysteresis\r\n *  0b110..+60 mV hysteresis\r\n *  0b111..+70 mV hysteresis\r\n */\r\n#define ACOMP_CTRL0_HYST_SELP(x)                 (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL0_HYST_SELP_SHIFT)) & ACOMP_CTRL0_HYST_SELP_MASK)\r\n\r\n#define ACOMP_CTRL0_BIAS_PROG_MASK               (0xC00U)\r\n#define ACOMP_CTRL0_BIAS_PROG_SHIFT              (10U)\r\n/*! BIAS_PROG - ACOMP0 bias current control bits or response time control bits.\r\n *  0b00..power mode1 (fast response mode)\r\n *  0b01..power mode2 (medium response mode)\r\n *  0b10..power mode3 (slow response mode)\r\n *  0b11..Reserved\r\n */\r\n#define ACOMP_CTRL0_BIAS_PROG(x)                 (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL0_BIAS_PROG_SHIFT)) & ACOMP_CTRL0_BIAS_PROG_MASK)\r\n\r\n#define ACOMP_CTRL0_LEVEL_SEL_MASK               (0x3F000U)\r\n#define ACOMP_CTRL0_LEVEL_SEL_SHIFT              (12U)\r\n/*! LEVEL_SEL - Scaling factor select bits for VIO reference level.\r\n *  0b000000..Scaling factor=0.25\r\n *  0b010000..Scaling factor= 0.5\r\n *  0b100000..Scaling factor= 0.75\r\n *  0b110000..Scaling factor= 1\r\n */\r\n#define ACOMP_CTRL0_LEVEL_SEL(x)                 (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL0_LEVEL_SEL_SHIFT)) & ACOMP_CTRL0_LEVEL_SEL_MASK)\r\n\r\n#define ACOMP_CTRL0_NEG_SEL_MASK                 (0x3C0000U)\r\n#define ACOMP_CTRL0_NEG_SEL_SHIFT                (18U)\r\n/*! NEG_SEL - ACOMP0 negative input select bits.\r\n *  0b0000..acomp_ch<0>\r\n *  0b0001..acomp_ch<1>\r\n *  0b0010..acomp_ch<2>\r\n *  0b0011..acomp_ch<3>\r\n *  0b0100..acomp_ch<4>\r\n *  0b0101..acomp_ch<5>\r\n *  0b0110..acomp_ch<6>\r\n *  0b0111..acomp_ch<7>\r\n *  0b1000..\r\n *  0b1001..\r\n *  0b1010..\r\n *  0b1011..\r\n *  0b1100..vio*scaling factor\r\n *  0b1101..vio*scaling factor\r\n *  0b1110..vio*scaling factor\r\n *  0b1111..vio*scaling factor\r\n */\r\n#define ACOMP_CTRL0_NEG_SEL(x)                   (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL0_NEG_SEL_SHIFT)) & ACOMP_CTRL0_NEG_SEL_MASK)\r\n\r\n#define ACOMP_CTRL0_POS_SEL_MASK                 (0x3C00000U)\r\n#define ACOMP_CTRL0_POS_SEL_SHIFT                (22U)\r\n/*! POS_SEL - ACOMP0 positive input select bits.\r\n *  0b0000..acomp_ch<0>\r\n *  0b0001..acomp_ch<1>\r\n *  0b0010..acomp_ch<2>\r\n *  0b0011..acomp_ch<3>\r\n *  0b0100..acomp_ch<4>\r\n *  0b0101..acomp_ch<5>\r\n *  0b0110..acomp_ch<6>\r\n *  0b0111..acomp_ch<7>\r\n *  0b1000..\r\n *  0b1001..\r\n */\r\n#define ACOMP_CTRL0_POS_SEL(x)                   (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL0_POS_SEL_SHIFT)) & ACOMP_CTRL0_POS_SEL_MASK)\r\n\r\n#define ACOMP_CTRL0_MUXEN_MASK                   (0x4000000U)\r\n#define ACOMP_CTRL0_MUXEN_SHIFT                  (26U)\r\n/*! MUXEN - ACOMP0 input MUX enable bit.\r\n *  0b0..disable input mux\r\n *  0b1..enable input mux\r\n */\r\n#define ACOMP_CTRL0_MUXEN(x)                     (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL0_MUXEN_SHIFT)) & ACOMP_CTRL0_MUXEN_MASK)\r\n\r\n#define ACOMP_CTRL0_INACT_VAL_MASK               (0x8000000U)\r\n#define ACOMP_CTRL0_INACT_VAL_SHIFT              (27U)\r\n/*! INACT_VAL - Set output value when ACOMP0 is inactive.\r\n *  0b0..output 0 when ACOMP0 is inactive\r\n *  0b1..output 1 when ACOMP0 is inactive\r\n */\r\n#define ACOMP_CTRL0_INACT_VAL(x)                 (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL0_INACT_VAL_SHIFT)) & ACOMP_CTRL0_INACT_VAL_MASK)\r\n\r\n#define ACOMP_CTRL0_RIE_MASK                     (0x10000000U)\r\n#define ACOMP_CTRL0_RIE_SHIFT                    (28U)\r\n/*! RIE - ACOMP0 enable/disable rising edge triggered edge pulse.\r\n *  0b0..\r\n *  0b1..\r\n */\r\n#define ACOMP_CTRL0_RIE(x)                       (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL0_RIE_SHIFT)) & ACOMP_CTRL0_RIE_MASK)\r\n\r\n#define ACOMP_CTRL0_FIE_MASK                     (0x20000000U)\r\n#define ACOMP_CTRL0_FIE_SHIFT                    (29U)\r\n/*! FIE - ACOMP0 enable/disable falling edge triggered edge pulse.\r\n *  0b0..\r\n *  0b1..\r\n */\r\n#define ACOMP_CTRL0_FIE(x)                       (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL0_FIE_SHIFT)) & ACOMP_CTRL0_FIE_MASK)\r\n\r\n#define ACOMP_CTRL0_INT_ACT_HI_MASK              (0x40000000U)\r\n#define ACOMP_CTRL0_INT_ACT_HI_SHIFT             (30U)\r\n/*! INT_ACT_HI - ACOMP0 interrupt active mode select.\r\n *  0b0..Low level or falling edge triggered interrupt\r\n *  0b1..High level or rising edge triggered interrupt\r\n */\r\n#define ACOMP_CTRL0_INT_ACT_HI(x)                (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL0_INT_ACT_HI_SHIFT)) & ACOMP_CTRL0_INT_ACT_HI_MASK)\r\n\r\n#define ACOMP_CTRL0_EDGE_LEVL_SEL_MASK           (0x80000000U)\r\n#define ACOMP_CTRL0_EDGE_LEVL_SEL_SHIFT          (31U)\r\n/*! EDGE_LEVL_SEL - ACOMP0 interrupt type select.\r\n *  0b0..level triggered interrupt\r\n *  0b1..edge triggered interrupt\r\n */\r\n#define ACOMP_CTRL0_EDGE_LEVL_SEL(x)             (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL0_EDGE_LEVL_SEL_SHIFT)) & ACOMP_CTRL0_EDGE_LEVL_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CTRL1 - ACOMP1 Control Register */\r\n/*! @{ */\r\n\r\n#define ACOMP_CTRL1_EN_MASK                      (0x1U)\r\n#define ACOMP_CTRL1_EN_SHIFT                     (0U)\r\n/*! EN - ACOMP1 enable bit.\r\n *  0b0..\r\n *  0b1..\r\n */\r\n#define ACOMP_CTRL1_EN(x)                        (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL1_EN_SHIFT)) & ACOMP_CTRL1_EN_MASK)\r\n\r\n#define ACOMP_CTRL1_GPIOINV_MASK                 (0x2U)\r\n#define ACOMP_CTRL1_GPIOINV_SHIFT                (1U)\r\n/*! GPIOINV - Enable/disable inversion of ACOMP1 output to GPIO.\r\n *  0b0..do not invert ACOMP1 output\r\n *  0b1..invert ACOMP1 output\r\n */\r\n#define ACOMP_CTRL1_GPIOINV(x)                   (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL1_GPIOINV_SHIFT)) & ACOMP_CTRL1_GPIOINV_MASK)\r\n\r\n#define ACOMP_CTRL1_WARMTIME_MASK                (0xCU)\r\n#define ACOMP_CTRL1_WARMTIME_SHIFT               (2U)\r\n/*! WARMTIME - Set ACOMP1 warm-up time.\r\n *  0b00..1 us\r\n *  0b01..2 us\r\n *  0b10..4 us\r\n *  0b11..8 us\r\n */\r\n#define ACOMP_CTRL1_WARMTIME(x)                  (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL1_WARMTIME_SHIFT)) & ACOMP_CTRL1_WARMTIME_MASK)\r\n\r\n#define ACOMP_CTRL1_HYST_SELN_MASK               (0x70U)\r\n#define ACOMP_CTRL1_HYST_SELN_SHIFT              (4U)\r\n/*! HYST_SELN - Select ACOMP1 negative hysteresis voltage level.\r\n *  0b000..No hysteresis\r\n *  0b001..-10 mV hysteresis\r\n *  0b010..-20 mV hysteresis\r\n *  0b011..-30 mV hysteresis\r\n *  0b100..-40 mV hysteresis\r\n *  0b101..-50 mV hysteresis\r\n *  0b110..-60 mV hysteresis\r\n *  0b111..-70 mV hysteresis\r\n */\r\n#define ACOMP_CTRL1_HYST_SELN(x)                 (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL1_HYST_SELN_SHIFT)) & ACOMP_CTRL1_HYST_SELN_MASK)\r\n\r\n#define ACOMP_CTRL1_HYST_SELP_MASK               (0x380U)\r\n#define ACOMP_CTRL1_HYST_SELP_SHIFT              (7U)\r\n/*! HYST_SELP - Select ACOMP1 positive hysteresis voltage level.\r\n *  0b000..No hysteresis\r\n *  0b001..+10 mV hysteresis\r\n *  0b010..+20 mV hysteresis\r\n *  0b011..+30 mV hysteresis\r\n *  0b100..+40 mV hysteresis\r\n *  0b101..+50 mV hysteresis\r\n *  0b110..+60 mV hysteresis\r\n *  0b111..+70 mV hysteresis\r\n */\r\n#define ACOMP_CTRL1_HYST_SELP(x)                 (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL1_HYST_SELP_SHIFT)) & ACOMP_CTRL1_HYST_SELP_MASK)\r\n\r\n#define ACOMP_CTRL1_BIAS_PROG_MASK               (0xC00U)\r\n#define ACOMP_CTRL1_BIAS_PROG_SHIFT              (10U)\r\n/*! BIAS_PROG - ACOMP1 bias current control bits Or response time control bits.\r\n *  0b00..power mode1 (fast response mode)\r\n *  0b01..power mode2 (Medium response mode)\r\n *  0b10..power mode3 (slow response mode)\r\n *  0b11..Reserved\r\n */\r\n#define ACOMP_CTRL1_BIAS_PROG(x)                 (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL1_BIAS_PROG_SHIFT)) & ACOMP_CTRL1_BIAS_PROG_MASK)\r\n\r\n#define ACOMP_CTRL1_LEVEL_SEL_MASK               (0x3F000U)\r\n#define ACOMP_CTRL1_LEVEL_SEL_SHIFT              (12U)\r\n/*! LEVEL_SEL - Scaling factor select bits for vio reference level.\r\n *  0b000000..Scaling factor=0.25\r\n *  0b010000..Scaling factor= 0.5\r\n *  0b100000..Scaling factor= 0.75\r\n *  0b110000..Scaling factor= 1\r\n */\r\n#define ACOMP_CTRL1_LEVEL_SEL(x)                 (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL1_LEVEL_SEL_SHIFT)) & ACOMP_CTRL1_LEVEL_SEL_MASK)\r\n\r\n#define ACOMP_CTRL1_NEG_SEL_MASK                 (0x3C0000U)\r\n#define ACOMP_CTRL1_NEG_SEL_SHIFT                (18U)\r\n/*! NEG_SEL - ACOMP1 negative input select\r\n *  0b0000..acomp_ch<0>\r\n *  0b0001..acomp_ch<1>\r\n *  0b0010..acomp_ch<2>\r\n *  0b0011..acomp_ch<3>\r\n *  0b0100..acomp_ch<4>\r\n *  0b0101..acomp_ch<5>\r\n *  0b0110..acomp_ch<6>\r\n *  0b0111..acomp_ch<7>\r\n *  0b1000..\r\n *  0b1001..\r\n *  0b1010..\r\n *  0b1011..\r\n *  0b1100..vio*scaling factor\r\n *  0b1101..vio*scaling factor\r\n *  0b1110..vio*scaling factor\r\n *  0b1111..vio*scaling factor\r\n */\r\n#define ACOMP_CTRL1_NEG_SEL(x)                   (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL1_NEG_SEL_SHIFT)) & ACOMP_CTRL1_NEG_SEL_MASK)\r\n\r\n#define ACOMP_CTRL1_POS_SEL_MASK                 (0x3C00000U)\r\n#define ACOMP_CTRL1_POS_SEL_SHIFT                (22U)\r\n/*! POS_SEL - ACOMP1 positive input select\r\n *  0b0000..acomp_ch<0>\r\n *  0b0001..acomp_ch<1>\r\n *  0b0010..acomp_ch<2>\r\n *  0b0011..acomp_ch<3>\r\n *  0b0100..acomp_ch<4>\r\n *  0b0101..acomp_ch<5>\r\n *  0b0110..acomp_ch<6>\r\n *  0b0111..acomp_ch<7>\r\n *  0b1000..\r\n *  0b1001..\r\n */\r\n#define ACOMP_CTRL1_POS_SEL(x)                   (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL1_POS_SEL_SHIFT)) & ACOMP_CTRL1_POS_SEL_MASK)\r\n\r\n#define ACOMP_CTRL1_MUXEN_MASK                   (0x4000000U)\r\n#define ACOMP_CTRL1_MUXEN_SHIFT                  (26U)\r\n/*! MUXEN - ACOMP1 input MUX enable\r\n *  0b0..disable input mux\r\n *  0b1..enable input mux\r\n */\r\n#define ACOMP_CTRL1_MUXEN(x)                     (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL1_MUXEN_SHIFT)) & ACOMP_CTRL1_MUXEN_MASK)\r\n\r\n#define ACOMP_CTRL1_INACT_VAL_MASK               (0x8000000U)\r\n#define ACOMP_CTRL1_INACT_VAL_SHIFT              (27U)\r\n/*! INACT_VAL - Set output value when ACOMP1 is inactive.\r\n *  0b0..output 0 when ACOMP1 is inactive\r\n *  0b1..output 1 when ACOMP1 is inactive\r\n */\r\n#define ACOMP_CTRL1_INACT_VAL(x)                 (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL1_INACT_VAL_SHIFT)) & ACOMP_CTRL1_INACT_VAL_MASK)\r\n\r\n#define ACOMP_CTRL1_RIE_MASK                     (0x10000000U)\r\n#define ACOMP_CTRL1_RIE_SHIFT                    (28U)\r\n/*! RIE - ACOMP1 enable/disable rising edge triggered edge pulse.\r\n *  0b0..\r\n *  0b1..\r\n */\r\n#define ACOMP_CTRL1_RIE(x)                       (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL1_RIE_SHIFT)) & ACOMP_CTRL1_RIE_MASK)\r\n\r\n#define ACOMP_CTRL1_FIE_MASK                     (0x20000000U)\r\n#define ACOMP_CTRL1_FIE_SHIFT                    (29U)\r\n/*! FIE - ACOMP1 enable/disable falling edge triggered edge pulse.\r\n *  0b0..\r\n *  0b1..\r\n */\r\n#define ACOMP_CTRL1_FIE(x)                       (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL1_FIE_SHIFT)) & ACOMP_CTRL1_FIE_MASK)\r\n\r\n#define ACOMP_CTRL1_INT_ACT_HI_MASK              (0x40000000U)\r\n#define ACOMP_CTRL1_INT_ACT_HI_SHIFT             (30U)\r\n/*! INT_ACT_HI - ACOMP1 interrupt active mode select.\r\n *  0b0..Low level or falling edge triggered interrupt\r\n *  0b1..High level or rising edge triggered interrupt\r\n */\r\n#define ACOMP_CTRL1_INT_ACT_HI(x)                (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL1_INT_ACT_HI_SHIFT)) & ACOMP_CTRL1_INT_ACT_HI_MASK)\r\n\r\n#define ACOMP_CTRL1_EDGE_LEVL_SEL_MASK           (0x80000000U)\r\n#define ACOMP_CTRL1_EDGE_LEVL_SEL_SHIFT          (31U)\r\n/*! EDGE_LEVL_SEL - ACOMP1 interrupt type select.\r\n *  0b0..level triggered interrupt\r\n *  0b1..edge triggered interrupt\r\n */\r\n#define ACOMP_CTRL1_EDGE_LEVL_SEL(x)             (((uint32_t)(((uint32_t)(x)) << ACOMP_CTRL1_EDGE_LEVL_SEL_SHIFT)) & ACOMP_CTRL1_EDGE_LEVL_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name STATUS0 - ACOMP0 Status Register */\r\n/*! @{ */\r\n\r\n#define ACOMP_STATUS0_ACT_MASK                   (0x1U)\r\n#define ACOMP_STATUS0_ACT_SHIFT                  (0U)\r\n/*! ACT - ACOMP0 active status.\r\n *  0b0..ACOMP0 is inactive\r\n *  0b1..ACOMP0 is active\r\n */\r\n#define ACOMP_STATUS0_ACT(x)                     (((uint32_t)(((uint32_t)(x)) << ACOMP_STATUS0_ACT_SHIFT)) & ACOMP_STATUS0_ACT_MASK)\r\n\r\n#define ACOMP_STATUS0_OUT_MASK                   (0x2U)\r\n#define ACOMP_STATUS0_OUT_SHIFT                  (1U)\r\n/*! OUT - ACOMP0 comparison output value. */\r\n#define ACOMP_STATUS0_OUT(x)                     (((uint32_t)(((uint32_t)(x)) << ACOMP_STATUS0_OUT_SHIFT)) & ACOMP_STATUS0_OUT_MASK)\r\n/*! @} */\r\n\r\n/*! @name STATUS1 - ACOMP1 Status Register */\r\n/*! @{ */\r\n\r\n#define ACOMP_STATUS1_ACT_MASK                   (0x1U)\r\n#define ACOMP_STATUS1_ACT_SHIFT                  (0U)\r\n/*! ACT - ACOMP1 active status.\r\n *  0b0..ACOMP1 is inactive\r\n *  0b1..ACOMP1 is active\r\n */\r\n#define ACOMP_STATUS1_ACT(x)                     (((uint32_t)(((uint32_t)(x)) << ACOMP_STATUS1_ACT_SHIFT)) & ACOMP_STATUS1_ACT_MASK)\r\n\r\n#define ACOMP_STATUS1_OUT_MASK                   (0x2U)\r\n#define ACOMP_STATUS1_OUT_SHIFT                  (1U)\r\n/*! OUT - ACOMP1 comparison output value. */\r\n#define ACOMP_STATUS1_OUT(x)                     (((uint32_t)(((uint32_t)(x)) << ACOMP_STATUS1_OUT_SHIFT)) & ACOMP_STATUS1_OUT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ROUTE0 - ACOMP0 Route Register */\r\n/*! @{ */\r\n\r\n#define ACOMP_ROUTE0_OUTSEL_MASK                 (0x1U)\r\n#define ACOMP_ROUTE0_OUTSEL_SHIFT                (0U)\r\n/*! OUTSEL - Select ACOMP0 synchronous or asynchronous output to pin.\r\n *  0b0..Synchronous output\r\n *  0b1..Asynchronous output\r\n */\r\n#define ACOMP_ROUTE0_OUTSEL(x)                   (((uint32_t)(((uint32_t)(x)) << ACOMP_ROUTE0_OUTSEL_SHIFT)) & ACOMP_ROUTE0_OUTSEL_MASK)\r\n\r\n#define ACOMP_ROUTE0_PE_MASK                     (0x2U)\r\n#define ACOMP_ROUTE0_PE_SHIFT                    (1U)\r\n/*! PE - Enable/disable ACOMP0 output to pin.\r\n *  0b0..\r\n *  0b1..\r\n */\r\n#define ACOMP_ROUTE0_PE(x)                       (((uint32_t)(((uint32_t)(x)) << ACOMP_ROUTE0_PE_SHIFT)) & ACOMP_ROUTE0_PE_MASK)\r\n/*! @} */\r\n\r\n/*! @name ROUTE1 - ACOMP1 Route Register */\r\n/*! @{ */\r\n\r\n#define ACOMP_ROUTE1_OUTSEL_MASK                 (0x1U)\r\n#define ACOMP_ROUTE1_OUTSEL_SHIFT                (0U)\r\n/*! OUTSEL - Select ACOMP1 synchronous or asynchronous output to pin\r\n *  0b0..Synchronous output\r\n *  0b1..Asynchronous output\r\n */\r\n#define ACOMP_ROUTE1_OUTSEL(x)                   (((uint32_t)(((uint32_t)(x)) << ACOMP_ROUTE1_OUTSEL_SHIFT)) & ACOMP_ROUTE1_OUTSEL_MASK)\r\n\r\n#define ACOMP_ROUTE1_PE_MASK                     (0x2U)\r\n#define ACOMP_ROUTE1_PE_SHIFT                    (1U)\r\n/*! PE - Enable/disable ACOMP1 output to pin\r\n *  0b0..\r\n *  0b1..\r\n */\r\n#define ACOMP_ROUTE1_PE(x)                       (((uint32_t)(((uint32_t)(x)) << ACOMP_ROUTE1_PE_SHIFT)) & ACOMP_ROUTE1_PE_MASK)\r\n/*! @} */\r\n\r\n/*! @name ISR0 - ACOMP0 Interrupt Status Register */\r\n/*! @{ */\r\n\r\n#define ACOMP_ISR0_OUT_INT_MASK                  (0x1U)\r\n#define ACOMP_ISR0_OUT_INT_SHIFT                 (0U)\r\n/*! OUT_INT - ACOMP0 Synchronized Output Interrupt */\r\n#define ACOMP_ISR0_OUT_INT(x)                    (((uint32_t)(((uint32_t)(x)) << ACOMP_ISR0_OUT_INT_SHIFT)) & ACOMP_ISR0_OUT_INT_MASK)\r\n\r\n#define ACOMP_ISR0_OUTA_INT_MASK                 (0x2U)\r\n#define ACOMP_ISR0_OUTA_INT_SHIFT                (1U)\r\n/*! OUTA_INT - ACOMP0 Asynchronized Output Interrupt */\r\n#define ACOMP_ISR0_OUTA_INT(x)                   (((uint32_t)(((uint32_t)(x)) << ACOMP_ISR0_OUTA_INT_SHIFT)) & ACOMP_ISR0_OUTA_INT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ISR1 - ACOMP1 Interrupt Status Register */\r\n/*! @{ */\r\n\r\n#define ACOMP_ISR1_OUT_INT_MASK                  (0x1U)\r\n#define ACOMP_ISR1_OUT_INT_SHIFT                 (0U)\r\n/*! OUT_INT - ACOMP1 Synchronized Output Interrupt */\r\n#define ACOMP_ISR1_OUT_INT(x)                    (((uint32_t)(((uint32_t)(x)) << ACOMP_ISR1_OUT_INT_SHIFT)) & ACOMP_ISR1_OUT_INT_MASK)\r\n\r\n#define ACOMP_ISR1_OUTA_INT_MASK                 (0x2U)\r\n#define ACOMP_ISR1_OUTA_INT_SHIFT                (1U)\r\n/*! OUTA_INT - ACOMP1 Asynchronized Output Interrupt */\r\n#define ACOMP_ISR1_OUTA_INT(x)                   (((uint32_t)(((uint32_t)(x)) << ACOMP_ISR1_OUTA_INT_SHIFT)) & ACOMP_ISR1_OUTA_INT_MASK)\r\n/*! @} */\r\n\r\n/*! @name IMR0 - ACOMP0 Interrupt Mask Register */\r\n/*! @{ */\r\n\r\n#define ACOMP_IMR0_OUT_INT_MASK_MASK             (0x1U)\r\n#define ACOMP_IMR0_OUT_INT_MASK_SHIFT            (0U)\r\n/*! OUT_INT_MASK - Mask Synchronized Interrupt */\r\n#define ACOMP_IMR0_OUT_INT_MASK(x)               (((uint32_t)(((uint32_t)(x)) << ACOMP_IMR0_OUT_INT_MASK_SHIFT)) & ACOMP_IMR0_OUT_INT_MASK_MASK)\r\n\r\n#define ACOMP_IMR0_OUTA_INT_MASK_MASK            (0x2U)\r\n#define ACOMP_IMR0_OUTA_INT_MASK_SHIFT           (1U)\r\n/*! OUTA_INT_MASK - Mask Asynchronized Interrupt */\r\n#define ACOMP_IMR0_OUTA_INT_MASK(x)              (((uint32_t)(((uint32_t)(x)) << ACOMP_IMR0_OUTA_INT_MASK_SHIFT)) & ACOMP_IMR0_OUTA_INT_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name IMR1 - ACOMP1 Interrupt Mask Register */\r\n/*! @{ */\r\n\r\n#define ACOMP_IMR1_OUT_INT_MASK_MASK             (0x1U)\r\n#define ACOMP_IMR1_OUT_INT_MASK_SHIFT            (0U)\r\n/*! OUT_INT_MASK - Mask Synchronized Interrupt */\r\n#define ACOMP_IMR1_OUT_INT_MASK(x)               (((uint32_t)(((uint32_t)(x)) << ACOMP_IMR1_OUT_INT_MASK_SHIFT)) & ACOMP_IMR1_OUT_INT_MASK_MASK)\r\n\r\n#define ACOMP_IMR1_OUTA_INT_MASK_MASK            (0x2U)\r\n#define ACOMP_IMR1_OUTA_INT_MASK_SHIFT           (1U)\r\n/*! OUTA_INT_MASK - Mask Asynchronized Interrupt */\r\n#define ACOMP_IMR1_OUTA_INT_MASK(x)              (((uint32_t)(((uint32_t)(x)) << ACOMP_IMR1_OUTA_INT_MASK_SHIFT)) & ACOMP_IMR1_OUTA_INT_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name IRSR0 - ACOMP0 Interrupt Raw Status Register */\r\n/*! @{ */\r\n\r\n#define ACOMP_IRSR0_OUT_INT_RAW_MASK             (0x1U)\r\n#define ACOMP_IRSR0_OUT_INT_RAW_SHIFT            (0U)\r\n/*! OUT_INT_RAW - Raw Mask Synchronized Interrupt */\r\n#define ACOMP_IRSR0_OUT_INT_RAW(x)               (((uint32_t)(((uint32_t)(x)) << ACOMP_IRSR0_OUT_INT_RAW_SHIFT)) & ACOMP_IRSR0_OUT_INT_RAW_MASK)\r\n\r\n#define ACOMP_IRSR0_OUTA_INT_RAW_MASK            (0x2U)\r\n#define ACOMP_IRSR0_OUTA_INT_RAW_SHIFT           (1U)\r\n/*! OUTA_INT_RAW - Raw Mask Asynchronized Interrupt */\r\n#define ACOMP_IRSR0_OUTA_INT_RAW(x)              (((uint32_t)(((uint32_t)(x)) << ACOMP_IRSR0_OUTA_INT_RAW_SHIFT)) & ACOMP_IRSR0_OUTA_INT_RAW_MASK)\r\n/*! @} */\r\n\r\n/*! @name IRSR1 - ACOMP1 Interrupt Raw Status Register */\r\n/*! @{ */\r\n\r\n#define ACOMP_IRSR1_OUT_INT_RAW_MASK             (0x1U)\r\n#define ACOMP_IRSR1_OUT_INT_RAW_SHIFT            (0U)\r\n/*! OUT_INT_RAW - Raw Mask Synchronized Interrupt */\r\n#define ACOMP_IRSR1_OUT_INT_RAW(x)               (((uint32_t)(((uint32_t)(x)) << ACOMP_IRSR1_OUT_INT_RAW_SHIFT)) & ACOMP_IRSR1_OUT_INT_RAW_MASK)\r\n\r\n#define ACOMP_IRSR1_OUTA_INT_RAW_MASK            (0x2U)\r\n#define ACOMP_IRSR1_OUTA_INT_RAW_SHIFT           (1U)\r\n/*! OUTA_INT_RAW - Raw Mask Asynchronized Interrupt */\r\n#define ACOMP_IRSR1_OUTA_INT_RAW(x)              (((uint32_t)(((uint32_t)(x)) << ACOMP_IRSR1_OUTA_INT_RAW_SHIFT)) & ACOMP_IRSR1_OUTA_INT_RAW_MASK)\r\n/*! @} */\r\n\r\n/*! @name ICR0 - ACOMP0 Interrupt Clear Register */\r\n/*! @{ */\r\n\r\n#define ACOMP_ICR0_OUT_INT_CLR_MASK              (0x1U)\r\n#define ACOMP_ICR0_OUT_INT_CLR_SHIFT             (0U)\r\n/*! OUT_INT_CLR - ACOMP0 syncrhonized output interrupt flag clear signal. */\r\n#define ACOMP_ICR0_OUT_INT_CLR(x)                (((uint32_t)(((uint32_t)(x)) << ACOMP_ICR0_OUT_INT_CLR_SHIFT)) & ACOMP_ICR0_OUT_INT_CLR_MASK)\r\n\r\n#define ACOMP_ICR0_OUTA_INT_CLR_MASK             (0x2U)\r\n#define ACOMP_ICR0_OUTA_INT_CLR_SHIFT            (1U)\r\n/*! OUTA_INT_CLR - ACOMP0 asyncrhonized output interrupt flag clear signal. */\r\n#define ACOMP_ICR0_OUTA_INT_CLR(x)               (((uint32_t)(((uint32_t)(x)) << ACOMP_ICR0_OUTA_INT_CLR_SHIFT)) & ACOMP_ICR0_OUTA_INT_CLR_MASK)\r\n/*! @} */\r\n\r\n/*! @name ICR1 - ACOMP1 Interrupt Clear Register */\r\n/*! @{ */\r\n\r\n#define ACOMP_ICR1_OUT_INT_CLR_MASK              (0x1U)\r\n#define ACOMP_ICR1_OUT_INT_CLR_SHIFT             (0U)\r\n/*! OUT_INT_CLR - ACOMP1 syncrhonized output interrupt flag clear signal. */\r\n#define ACOMP_ICR1_OUT_INT_CLR(x)                (((uint32_t)(((uint32_t)(x)) << ACOMP_ICR1_OUT_INT_CLR_SHIFT)) & ACOMP_ICR1_OUT_INT_CLR_MASK)\r\n\r\n#define ACOMP_ICR1_OUTA_INT_CLR_MASK             (0x2U)\r\n#define ACOMP_ICR1_OUTA_INT_CLR_SHIFT            (1U)\r\n/*! OUTA_INT_CLR - ACOMP1 asyncrhonized output interrupt flag clear signal. */\r\n#define ACOMP_ICR1_OUTA_INT_CLR(x)               (((uint32_t)(((uint32_t)(x)) << ACOMP_ICR1_OUTA_INT_CLR_SHIFT)) & ACOMP_ICR1_OUTA_INT_CLR_MASK)\r\n/*! @} */\r\n\r\n/*! @name RST0 - ACOMP0 Soft Reset Register */\r\n/*! @{ */\r\n\r\n#define ACOMP_RST0_SOFT_RST_MASK                 (0x1U)\r\n#define ACOMP_RST0_SOFT_RST_SHIFT                (0U)\r\n/*! SOFT_RST - Soft Reset for ACOMP0 (active high)\r\n *  0b0..no action\r\n *  0b1..\r\n */\r\n#define ACOMP_RST0_SOFT_RST(x)                   (((uint32_t)(((uint32_t)(x)) << ACOMP_RST0_SOFT_RST_SHIFT)) & ACOMP_RST0_SOFT_RST_MASK)\r\n/*! @} */\r\n\r\n/*! @name RST1 - ACOMP1 Soft Reset Register */\r\n/*! @{ */\r\n\r\n#define ACOMP_RST1_SOFT_RST_MASK                 (0x1U)\r\n#define ACOMP_RST1_SOFT_RST_SHIFT                (0U)\r\n/*! SOFT_RST - Soft Reset for ACOMP1 (active high)\r\n *  0b0..no action\r\n *  0b1..\r\n */\r\n#define ACOMP_RST1_SOFT_RST(x)                   (((uint32_t)(((uint32_t)(x)) << ACOMP_RST1_SOFT_RST_SHIFT)) & ACOMP_RST1_SOFT_RST_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLK - Clock Register */\r\n/*! @{ */\r\n\r\n#define ACOMP_CLK_SOFT_CLK_RST_MASK              (0x2U)\r\n#define ACOMP_CLK_SOFT_CLK_RST_SHIFT             (1U)\r\n/*! SOFT_CLK_RST - soft reset for clock divider\r\n *  0b0..no action\r\n *  0b1..\r\n */\r\n#define ACOMP_CLK_SOFT_CLK_RST(x)                (((uint32_t)(((uint32_t)(x)) << ACOMP_CLK_SOFT_CLK_RST_SHIFT)) & ACOMP_CLK_SOFT_CLK_RST_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group ACOMP_Register_Masks */\r\n\r\n\r\n/* ACOMP - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral GAU_ACOMP base address */\r\n  #define GAU_ACOMP_BASE                           (0x50038400u)\r\n  /** Peripheral GAU_ACOMP base address */\r\n  #define GAU_ACOMP_BASE_NS                        (0x40038400u)\r\n  /** Peripheral GAU_ACOMP base pointer */\r\n  #define GAU_ACOMP                                ((ACOMP_Type *)GAU_ACOMP_BASE)\r\n  /** Peripheral GAU_ACOMP base pointer */\r\n  #define GAU_ACOMP_NS                             ((ACOMP_Type *)GAU_ACOMP_BASE_NS)\r\n  /** Array initializer of ACOMP peripheral base addresses */\r\n  #define ACOMP_BASE_ADDRS                         { GAU_ACOMP_BASE }\r\n  /** Array initializer of ACOMP peripheral base pointers */\r\n  #define ACOMP_BASE_PTRS                          { GAU_ACOMP }\r\n  /** Array initializer of ACOMP peripheral base addresses */\r\n  #define ACOMP_BASE_ADDRS_NS                      { GAU_ACOMP_BASE_NS }\r\n  /** Array initializer of ACOMP peripheral base pointers */\r\n  #define ACOMP_BASE_PTRS_NS                       { GAU_ACOMP_NS }\r\n#else\r\n  /** Peripheral GAU_ACOMP base address */\r\n  #define GAU_ACOMP_BASE                           (0x40038400u)\r\n  /** Peripheral GAU_ACOMP base pointer */\r\n  #define GAU_ACOMP                                ((ACOMP_Type *)GAU_ACOMP_BASE)\r\n  /** Array initializer of ACOMP peripheral base addresses */\r\n  #define ACOMP_BASE_ADDRS                         { GAU_ACOMP_BASE }\r\n  /** Array initializer of ACOMP peripheral base pointers */\r\n  #define ACOMP_BASE_PTRS                          { GAU_ACOMP }\r\n#endif\r\n/** Interrupt vectors for the ACOMP peripheral type */\r\n#define ACOMP_FUNC_IRQS                          { GAU_ACOMP_IRQn }\r\n#define ACOMP_WAKE_IRQS                          { GAU_ACOMP_WKUP_IRQn }\r\n\r\n/*!\r\n * @}\r\n */ /* end of group ACOMP_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- ADC Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup ADC_Peripheral_Access_Layer ADC Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** ADC - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t ADC_REG_CMD;                       /**< ADC Command Register, offset: 0x0 */\r\n  __IO uint32_t ADC_REG_GENERAL;                   /**< ADC General Register, offset: 0x4 */\r\n  __IO uint32_t ADC_REG_CONFIG;                    /**< ADC Configuration Register, offset: 0x8 */\r\n  __IO uint32_t ADC_REG_INTERVAL;                  /**< ADC Interval Register, offset: 0xC */\r\n  __IO uint32_t ADC_REG_ANA;                       /**< ADC ANA Register, offset: 0x10 */\r\n       uint8_t RESERVED_0[4];\r\n  __IO uint32_t ADC_REG_SCN1;                      /**< ADC Conversion Sequence 1 Register, offset: 0x18 */\r\n  __IO uint32_t ADC_REG_SCN2;                      /**< ADC Conversion Sequence 2 Register, offset: 0x1C */\r\n  __IO uint32_t ADC_REG_RESULT_BUF;                /**< ADC Result Buffer Register, offset: 0x20 */\r\n       uint8_t RESERVED_1[4];\r\n  __IO uint32_t ADC_REG_DMAR;                      /**< ADC DMAR Register, offset: 0x28 */\r\n  __I  uint32_t ADC_REG_STATUS;                    /**< ADC Status Register, offset: 0x2C */\r\n  __I  uint32_t ADC_REG_ISR;                       /**< ADC ISR Register, offset: 0x30 */\r\n  __IO uint32_t ADC_REG_IMR;                       /**< ADC IMR Register, offset: 0x34 */\r\n  __I  uint32_t ADC_REG_IRSR;                      /**< ADC IRSR Register, offset: 0x38 */\r\n  __IO uint32_t ADC_REG_ICR;                       /**< ADC ICR Register, offset: 0x3C */\r\n       uint8_t RESERVED_2[4];\r\n  __I  uint32_t ADC_REG_RESULT;                    /**< ADC Result Register, offset: 0x44 */\r\n  __I  uint32_t ADC_REG_RAW_RESULT;                /**< ADC Raw Result Register, offset: 0x48 */\r\n  __IO uint32_t ADC_REG_OFFSET_CAL;                /**< ADC Offset Calibration Register, offset: 0x4C */\r\n  __IO uint32_t ADC_REG_GAIN_CAL;                  /**< ADC Gain Calibration Register, offset: 0x50 */\r\n  __IO uint32_t ADC_REG_TEST;                      /**< ADC Test Register, offset: 0x54 */\r\n  __IO uint32_t ADC_REG_AUDIO;                     /**< ADC Audio Register, offset: 0x58 */\r\n  __IO uint32_t ADC_REG_VOICE_DET;                 /**< ADC Voice Detect Register, offset: 0x5C */\r\n  __IO uint32_t ADC_REG_RSVD;                      /**< ADC Reserved Register, offset: 0x60 */\r\n} ADC_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- ADC Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup ADC_Register_Masks ADC Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name ADC_REG_CMD - ADC Command Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_CMD_CONV_START_MASK          (0x1U)\r\n#define ADC_ADC_REG_CMD_CONV_START_SHIFT         (0U)\r\n/*! CONV_START - converaion control bit. */\r\n#define ADC_ADC_REG_CMD_CONV_START(x)            (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_CMD_CONV_START_SHIFT)) & ADC_ADC_REG_CMD_CONV_START_MASK)\r\n\r\n#define ADC_ADC_REG_CMD_SOFT_RST_MASK            (0x2U)\r\n#define ADC_ADC_REG_CMD_SOFT_RST_SHIFT           (1U)\r\n/*! SOFT_RST - user reset the whole block */\r\n#define ADC_ADC_REG_CMD_SOFT_RST(x)              (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_CMD_SOFT_RST_SHIFT)) & ADC_ADC_REG_CMD_SOFT_RST_MASK)\r\n\r\n#define ADC_ADC_REG_CMD_SOFT_CLK_RST_MASK        (0x4U)\r\n#define ADC_ADC_REG_CMD_SOFT_CLK_RST_SHIFT       (2U)\r\n/*! SOFT_CLK_RST - user reset clock */\r\n#define ADC_ADC_REG_CMD_SOFT_CLK_RST(x)          (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_CMD_SOFT_CLK_RST_SHIFT)) & ADC_ADC_REG_CMD_SOFT_CLK_RST_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_GENERAL - ADC General Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_GENERAL_GPADC_MASTER_MASK    (0x1U)\r\n#define ADC_ADC_REG_GENERAL_GPADC_MASTER_SHIFT   (0U)\r\n/*! GPADC_MASTER - play as master or slave in dual mode, master is the only controller of when slave start */\r\n#define ADC_ADC_REG_GENERAL_GPADC_MASTER(x)      (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_GENERAL_GPADC_MASTER_SHIFT)) & ADC_ADC_REG_GENERAL_GPADC_MASTER_MASK)\r\n\r\n#define ADC_ADC_REG_GENERAL_GLOBAL_EN_MASK       (0x2U)\r\n#define ADC_ADC_REG_GENERAL_GLOBAL_EN_SHIFT      (1U)\r\n/*! GLOBAL_EN - ADC enable/disable */\r\n#define ADC_ADC_REG_GENERAL_GLOBAL_EN(x)         (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_GENERAL_GLOBAL_EN_SHIFT)) & ADC_ADC_REG_GENERAL_GLOBAL_EN_MASK)\r\n\r\n#define ADC_ADC_REG_GENERAL_FORCE_CLK_ON_MASK    (0x4U)\r\n#define ADC_ADC_REG_GENERAL_FORCE_CLK_ON_SHIFT   (2U)\r\n/*! FORCE_CLK_ON - override the gpadc_mclk_en from outside */\r\n#define ADC_ADC_REG_GENERAL_FORCE_CLK_ON(x)      (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_GENERAL_FORCE_CLK_ON_SHIFT)) & ADC_ADC_REG_GENERAL_FORCE_CLK_ON_MASK)\r\n\r\n#define ADC_ADC_REG_GENERAL_CLK_ANA64M_INV_MASK  (0x8U)\r\n#define ADC_ADC_REG_GENERAL_CLK_ANA64M_INV_SHIFT (3U)\r\n/*! CLK_ANA64M_INV - analog clock 64M inverted */\r\n#define ADC_ADC_REG_GENERAL_CLK_ANA64M_INV(x)    (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_GENERAL_CLK_ANA64M_INV_SHIFT)) & ADC_ADC_REG_GENERAL_CLK_ANA64M_INV_MASK)\r\n\r\n#define ADC_ADC_REG_GENERAL_CLK_ANA2M_INV_MASK   (0x10U)\r\n#define ADC_ADC_REG_GENERAL_CLK_ANA2M_INV_SHIFT  (4U)\r\n/*! CLK_ANA2M_INV - analog clock 2M inverted */\r\n#define ADC_ADC_REG_GENERAL_CLK_ANA2M_INV(x)     (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_GENERAL_CLK_ANA2M_INV_SHIFT)) & ADC_ADC_REG_GENERAL_CLK_ANA2M_INV_MASK)\r\n\r\n#define ADC_ADC_REG_GENERAL_ADC_CAL_EN_MASK      (0x20U)\r\n#define ADC_ADC_REG_GENERAL_ADC_CAL_EN_SHIFT     (5U)\r\n/*! ADC_CAL_EN - calibration enable, auto cleared after calibration done */\r\n#define ADC_ADC_REG_GENERAL_ADC_CAL_EN(x)        (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_GENERAL_ADC_CAL_EN_SHIFT)) & ADC_ADC_REG_GENERAL_ADC_CAL_EN_MASK)\r\n\r\n#define ADC_ADC_REG_GENERAL_CLK_DIV_RATIO_MASK   (0x3F00U)\r\n#define ADC_ADC_REG_GENERAL_CLK_DIV_RATIO_SHIFT  (8U)\r\n/*! CLK_DIV_RATIO - analog 64M clock division ratio */\r\n#define ADC_ADC_REG_GENERAL_CLK_DIV_RATIO(x)     (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_GENERAL_CLK_DIV_RATIO_SHIFT)) & ADC_ADC_REG_GENERAL_CLK_DIV_RATIO_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_CONFIG - ADC Configuration Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_CONFIG_TRIGGER_SEL_MASK      (0xFU)\r\n#define ADC_ADC_REG_CONFIG_TRIGGER_SEL_SHIFT     (0U)\r\n/*! TRIGGER_SEL - External trigger source select bits\r\n *  0b0000..ctimer3 match1 in ADC0 module, ctimer3 match2 in ADC1 module\r\n *  0b0001..acomparator 0 out in ADC0 module, acomparator 1 out in ADC1 module\r\n *  0b0010..GPIO50\r\n *  0b0011..GPIO55\r\n */\r\n#define ADC_ADC_REG_CONFIG_TRIGGER_SEL(x)        (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_CONFIG_TRIGGER_SEL_SHIFT)) & ADC_ADC_REG_CONFIG_TRIGGER_SEL_MASK)\r\n\r\n#define ADC_ADC_REG_CONFIG_TRIGGER_EN_MASK       (0x10U)\r\n#define ADC_ADC_REG_CONFIG_TRIGGER_EN_SHIFT      (4U)\r\n/*! TRIGGER_EN - External elevel trigger enable bit, support gpadc_trigger/gpadc_data_valid handshake */\r\n#define ADC_ADC_REG_CONFIG_TRIGGER_EN(x)         (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_CONFIG_TRIGGER_EN_SHIFT)) & ADC_ADC_REG_CONFIG_TRIGGER_EN_MASK)\r\n\r\n#define ADC_ADC_REG_CONFIG_DUAL_MODE_MASK        (0x20U)\r\n#define ADC_ADC_REG_CONFIG_DUAL_MODE_SHIFT       (5U)\r\n/*! DUAL_MODE - dual mode select */\r\n#define ADC_ADC_REG_CONFIG_DUAL_MODE(x)          (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_CONFIG_DUAL_MODE_SHIFT)) & ADC_ADC_REG_CONFIG_DUAL_MODE_MASK)\r\n\r\n#define ADC_ADC_REG_CONFIG_SINGLE_DUAL_MASK      (0x40U)\r\n#define ADC_ADC_REG_CONFIG_SINGLE_DUAL_SHIFT     (6U)\r\n/*! SINGLE_DUAL - work mode select */\r\n#define ADC_ADC_REG_CONFIG_SINGLE_DUAL(x)        (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_CONFIG_SINGLE_DUAL_SHIFT)) & ADC_ADC_REG_CONFIG_SINGLE_DUAL_MASK)\r\n\r\n#define ADC_ADC_REG_CONFIG_CONT_CONV_EN_MASK     (0x100U)\r\n#define ADC_ADC_REG_CONFIG_CONT_CONV_EN_SHIFT    (8U)\r\n/*! CONT_CONV_EN - To enable continuous conversion */\r\n#define ADC_ADC_REG_CONFIG_CONT_CONV_EN(x)       (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_CONFIG_CONT_CONV_EN_SHIFT)) & ADC_ADC_REG_CONFIG_CONT_CONV_EN_MASK)\r\n\r\n#define ADC_ADC_REG_CONFIG_DATA_FORMAT_SEL_MASK  (0x200U)\r\n#define ADC_ADC_REG_CONFIG_DATA_FORMAT_SEL_SHIFT (9U)\r\n/*! DATA_FORMAT_SEL - set data format for the final data */\r\n#define ADC_ADC_REG_CONFIG_DATA_FORMAT_SEL(x)    (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_CONFIG_DATA_FORMAT_SEL_SHIFT)) & ADC_ADC_REG_CONFIG_DATA_FORMAT_SEL_MASK)\r\n\r\n#define ADC_ADC_REG_CONFIG_CAL_VREF_SEL_MASK     (0x400U)\r\n#define ADC_ADC_REG_CONFIG_CAL_VREF_SEL_SHIFT    (10U)\r\n/*! CAL_VREF_SEL - select input reference channel for gain calibration */\r\n#define ADC_ADC_REG_CONFIG_CAL_VREF_SEL(x)       (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_CONFIG_CAL_VREF_SEL_SHIFT)) & ADC_ADC_REG_CONFIG_CAL_VREF_SEL_MASK)\r\n\r\n#define ADC_ADC_REG_CONFIG_CAL_DATA_RST_MASK     (0x800U)\r\n#define ADC_ADC_REG_CONFIG_CAL_DATA_RST_SHIFT    (11U)\r\n/*! CAL_DATA_RST - reset the self calibration data. */\r\n#define ADC_ADC_REG_CONFIG_CAL_DATA_RST(x)       (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_CONFIG_CAL_DATA_RST_SHIFT)) & ADC_ADC_REG_CONFIG_CAL_DATA_RST_MASK)\r\n\r\n#define ADC_ADC_REG_CONFIG_CAL_DATA_SEL_MASK     (0x1000U)\r\n#define ADC_ADC_REG_CONFIG_CAL_DATA_SEL_SHIFT    (12U)\r\n/*! CAL_DATA_SEL - select calibration data source. */\r\n#define ADC_ADC_REG_CONFIG_CAL_DATA_SEL(x)       (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_CONFIG_CAL_DATA_SEL_SHIFT)) & ADC_ADC_REG_CONFIG_CAL_DATA_SEL_MASK)\r\n\r\n#define ADC_ADC_REG_CONFIG_AVG_SEL_MASK          (0xE000U)\r\n#define ADC_ADC_REG_CONFIG_AVG_SEL_SHIFT         (13U)\r\n/*! AVG_SEL - moving average length */\r\n#define ADC_ADC_REG_CONFIG_AVG_SEL(x)            (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_CONFIG_AVG_SEL_SHIFT)) & ADC_ADC_REG_CONFIG_AVG_SEL_MASK)\r\n\r\n#define ADC_ADC_REG_CONFIG_SCAN_LENGTH_MASK      (0xF0000U)\r\n#define ADC_ADC_REG_CONFIG_SCAN_LENGTH_SHIFT     (16U)\r\n/*! SCAN_LENGTH - scan converation length, actual length is scan_length+1. */\r\n#define ADC_ADC_REG_CONFIG_SCAN_LENGTH(x)        (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_CONFIG_SCAN_LENGTH_SHIFT)) & ADC_ADC_REG_CONFIG_SCAN_LENGTH_MASK)\r\n\r\n#define ADC_ADC_REG_CONFIG_PWR_MODE_MASK         (0x100000U)\r\n#define ADC_ADC_REG_CONFIG_PWR_MODE_SHIFT        (20U)\r\n/*! PWR_MODE - ADC power mode select. */\r\n#define ADC_ADC_REG_CONFIG_PWR_MODE(x)           (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_CONFIG_PWR_MODE_SHIFT)) & ADC_ADC_REG_CONFIG_PWR_MODE_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_INTERVAL - ADC Interval Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_INTERVAL_WARMUP_TIME_MASK    (0x1FU)\r\n#define ADC_ADC_REG_INTERVAL_WARMUP_TIME_SHIFT   (0U)\r\n/*! WARMUP_TIME - warmup time, should be set equal to or higher than 1uS. */\r\n#define ADC_ADC_REG_INTERVAL_WARMUP_TIME(x)      (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_INTERVAL_WARMUP_TIME_SHIFT)) & ADC_ADC_REG_INTERVAL_WARMUP_TIME_MASK)\r\n\r\n#define ADC_ADC_REG_INTERVAL_BYPASS_WARMUP_MASK  (0x20U)\r\n#define ADC_ADC_REG_INTERVAL_BYPASS_WARMUP_SHIFT (5U)\r\n/*! BYPASS_WARMUP - Bypass warmup state inside adc. */\r\n#define ADC_ADC_REG_INTERVAL_BYPASS_WARMUP(x)    (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_INTERVAL_BYPASS_WARMUP_SHIFT)) & ADC_ADC_REG_INTERVAL_BYPASS_WARMUP_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_ANA - ADC ANA Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_ANA_TSEXT_SEL_MASK           (0x1U)\r\n#define ADC_ADC_REG_ANA_TSEXT_SEL_SHIFT          (0U)\r\n/*! TSEXT_SEL - temperature sensor diode select */\r\n#define ADC_ADC_REG_ANA_TSEXT_SEL(x)             (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ANA_TSEXT_SEL_SHIFT)) & ADC_ADC_REG_ANA_TSEXT_SEL_MASK)\r\n\r\n#define ADC_ADC_REG_ANA_TS_EN_MASK               (0x2U)\r\n#define ADC_ADC_REG_ANA_TS_EN_SHIFT              (1U)\r\n/*! TS_EN - temperature sensor enable, only enable when channel source is temperature sensor */\r\n#define ADC_ADC_REG_ANA_TS_EN(x)                 (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ANA_TS_EN_SHIFT)) & ADC_ADC_REG_ANA_TS_EN_MASK)\r\n\r\n#define ADC_ADC_REG_ANA_VREF_SCF_BYPASS_MASK     (0x4U)\r\n#define ADC_ADC_REG_ANA_VREF_SCF_BYPASS_SHIFT    (2U)\r\n/*! VREF_SCF_BYPASS - adc voltage reference buffer sc-filter bypass */\r\n#define ADC_ADC_REG_ANA_VREF_SCF_BYPASS(x)       (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ANA_VREF_SCF_BYPASS_SHIFT)) & ADC_ADC_REG_ANA_VREF_SCF_BYPASS_MASK)\r\n\r\n#define ADC_ADC_REG_ANA_VREF_CHOP_EN_MASK        (0x8U)\r\n#define ADC_ADC_REG_ANA_VREF_CHOP_EN_SHIFT       (3U)\r\n/*! VREF_CHOP_EN - adc voltage reference buffer chopper enable */\r\n#define ADC_ADC_REG_ANA_VREF_CHOP_EN(x)          (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ANA_VREF_CHOP_EN_SHIFT)) & ADC_ADC_REG_ANA_VREF_CHOP_EN_MASK)\r\n\r\n#define ADC_ADC_REG_ANA_VREF_SEL_MASK            (0x30U)\r\n#define ADC_ADC_REG_ANA_VREF_SEL_SHIFT           (4U)\r\n/*! VREF_SEL - adc reference voltage select. */\r\n#define ADC_ADC_REG_ANA_VREF_SEL(x)              (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ANA_VREF_SEL_SHIFT)) & ADC_ADC_REG_ANA_VREF_SEL_MASK)\r\n\r\n#define ADC_ADC_REG_ANA_SINGLEDIFF_MASK          (0x400U)\r\n#define ADC_ADC_REG_ANA_SINGLEDIFF_SHIFT         (10U)\r\n/*! SINGLEDIFF - Select single ended or differential input. */\r\n#define ADC_ADC_REG_ANA_SINGLEDIFF(x)            (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ANA_SINGLEDIFF_SHIFT)) & ADC_ADC_REG_ANA_SINGLEDIFF_MASK)\r\n\r\n#define ADC_ADC_REG_ANA_INBUF_GAIN_MASK          (0x1800U)\r\n#define ADC_ADC_REG_ANA_INBUF_GAIN_SHIFT         (11U)\r\n/*! INBUF_GAIN - adc gain control. Also select input voltage range. */\r\n#define ADC_ADC_REG_ANA_INBUF_GAIN(x)            (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ANA_INBUF_GAIN_SHIFT)) & ADC_ADC_REG_ANA_INBUF_GAIN_MASK)\r\n\r\n#define ADC_ADC_REG_ANA_INBUF_CHOP_EN_MASK       (0x2000U)\r\n#define ADC_ADC_REG_ANA_INBUF_CHOP_EN_SHIFT      (13U)\r\n/*! INBUF_CHOP_EN - Input buffer chopper enable */\r\n#define ADC_ADC_REG_ANA_INBUF_CHOP_EN(x)         (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ANA_INBUF_CHOP_EN_SHIFT)) & ADC_ADC_REG_ANA_INBUF_CHOP_EN_MASK)\r\n\r\n#define ADC_ADC_REG_ANA_INBUF_EN_MASK            (0x4000U)\r\n#define ADC_ADC_REG_ANA_INBUF_EN_SHIFT           (14U)\r\n/*! INBUF_EN - gpadc input gain buffer enable bit. */\r\n#define ADC_ADC_REG_ANA_INBUF_EN(x)              (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ANA_INBUF_EN_SHIFT)) & ADC_ADC_REG_ANA_INBUF_EN_MASK)\r\n\r\n#define ADC_ADC_REG_ANA_CHOP_EN_MASK             (0x8000U)\r\n#define ADC_ADC_REG_ANA_CHOP_EN_SHIFT            (15U)\r\n/*! CHOP_EN - adc chopper/auto-zero(only in 12bit mode) enable */\r\n#define ADC_ADC_REG_ANA_CHOP_EN(x)               (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ANA_CHOP_EN_SHIFT)) & ADC_ADC_REG_ANA_CHOP_EN_MASK)\r\n\r\n#define ADC_ADC_REG_ANA_BIAS_SEL_MASK            (0x10000U)\r\n#define ADC_ADC_REG_ANA_BIAS_SEL_SHIFT           (16U)\r\n/*! BIAS_SEL - adc analog portion low power mode select. Half the biasing current for modulator when enabled. */\r\n#define ADC_ADC_REG_ANA_BIAS_SEL(x)              (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ANA_BIAS_SEL_SHIFT)) & ADC_ADC_REG_ANA_BIAS_SEL_MASK)\r\n\r\n#define ADC_ADC_REG_ANA_RES_SEL_MASK             (0x60000U)\r\n#define ADC_ADC_REG_ANA_RES_SEL_SHIFT            (17U)\r\n/*! RES_SEL - adc resolution/data rate select */\r\n#define ADC_ADC_REG_ANA_RES_SEL(x)               (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ANA_RES_SEL_SHIFT)) & ADC_ADC_REG_ANA_RES_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_SCN1 - ADC Conversion Sequence 1 Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_0_MASK          (0xFU)\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_0_SHIFT         (0U)\r\n/*! SCAN_CH_0 - amux source 0 */\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_0(x)            (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_SCN1_SCAN_CH_0_SHIFT)) & ADC_ADC_REG_SCN1_SCAN_CH_0_MASK)\r\n\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_1_MASK          (0xF0U)\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_1_SHIFT         (4U)\r\n/*! SCAN_CH_1 - amux source 1 */\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_1(x)            (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_SCN1_SCAN_CH_1_SHIFT)) & ADC_ADC_REG_SCN1_SCAN_CH_1_MASK)\r\n\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_2_MASK          (0xF00U)\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_2_SHIFT         (8U)\r\n/*! SCAN_CH_2 - amux source 2 */\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_2(x)            (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_SCN1_SCAN_CH_2_SHIFT)) & ADC_ADC_REG_SCN1_SCAN_CH_2_MASK)\r\n\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_3_MASK          (0xF000U)\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_3_SHIFT         (12U)\r\n/*! SCAN_CH_3 - amux source 3 */\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_3(x)            (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_SCN1_SCAN_CH_3_SHIFT)) & ADC_ADC_REG_SCN1_SCAN_CH_3_MASK)\r\n\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_4_MASK          (0xF0000U)\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_4_SHIFT         (16U)\r\n/*! SCAN_CH_4 - amux source 4 */\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_4(x)            (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_SCN1_SCAN_CH_4_SHIFT)) & ADC_ADC_REG_SCN1_SCAN_CH_4_MASK)\r\n\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_5_MASK          (0xF00000U)\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_5_SHIFT         (20U)\r\n/*! SCAN_CH_5 - amux source 5 */\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_5(x)            (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_SCN1_SCAN_CH_5_SHIFT)) & ADC_ADC_REG_SCN1_SCAN_CH_5_MASK)\r\n\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_6_MASK          (0xF000000U)\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_6_SHIFT         (24U)\r\n/*! SCAN_CH_6 - amux source 6 */\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_6(x)            (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_SCN1_SCAN_CH_6_SHIFT)) & ADC_ADC_REG_SCN1_SCAN_CH_6_MASK)\r\n\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_7_MASK          (0xF0000000U)\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_7_SHIFT         (28U)\r\n/*! SCAN_CH_7 - amux source 7 */\r\n#define ADC_ADC_REG_SCN1_SCAN_CH_7(x)            (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_SCN1_SCAN_CH_7_SHIFT)) & ADC_ADC_REG_SCN1_SCAN_CH_7_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_SCN2 - ADC Conversion Sequence 2 Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_8_MASK          (0xFU)\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_8_SHIFT         (0U)\r\n/*! SCAN_CH_8 - amux source 8 */\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_8(x)            (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_SCN2_SCAN_CH_8_SHIFT)) & ADC_ADC_REG_SCN2_SCAN_CH_8_MASK)\r\n\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_9_MASK          (0xF0U)\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_9_SHIFT         (4U)\r\n/*! SCAN_CH_9 - amux source 9 */\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_9(x)            (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_SCN2_SCAN_CH_9_SHIFT)) & ADC_ADC_REG_SCN2_SCAN_CH_9_MASK)\r\n\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_10_MASK         (0xF00U)\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_10_SHIFT        (8U)\r\n/*! SCAN_CH_10 - amux source 10 */\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_10(x)           (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_SCN2_SCAN_CH_10_SHIFT)) & ADC_ADC_REG_SCN2_SCAN_CH_10_MASK)\r\n\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_11_MASK         (0xF000U)\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_11_SHIFT        (12U)\r\n/*! SCAN_CH_11 - amux source 11 */\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_11(x)           (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_SCN2_SCAN_CH_11_SHIFT)) & ADC_ADC_REG_SCN2_SCAN_CH_11_MASK)\r\n\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_12_MASK         (0xF0000U)\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_12_SHIFT        (16U)\r\n/*! SCAN_CH_12 - amux source 12 */\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_12(x)           (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_SCN2_SCAN_CH_12_SHIFT)) & ADC_ADC_REG_SCN2_SCAN_CH_12_MASK)\r\n\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_13_MASK         (0xF00000U)\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_13_SHIFT        (20U)\r\n/*! SCAN_CH_13 - amux source 13 */\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_13(x)           (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_SCN2_SCAN_CH_13_SHIFT)) & ADC_ADC_REG_SCN2_SCAN_CH_13_MASK)\r\n\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_14_MASK         (0xF000000U)\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_14_SHIFT        (24U)\r\n/*! SCAN_CH_14 - amux source 14 */\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_14(x)           (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_SCN2_SCAN_CH_14_SHIFT)) & ADC_ADC_REG_SCN2_SCAN_CH_14_MASK)\r\n\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_15_MASK         (0xF0000000U)\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_15_SHIFT        (28U)\r\n/*! SCAN_CH_15 - amux source 15 */\r\n#define ADC_ADC_REG_SCN2_SCAN_CH_15(x)           (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_SCN2_SCAN_CH_15_SHIFT)) & ADC_ADC_REG_SCN2_SCAN_CH_15_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_RESULT_BUF - ADC Result Buffer Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_RESULT_BUF_WIDTH_SEL_MASK    (0x1U)\r\n#define ADC_ADC_REG_RESULT_BUF_WIDTH_SEL_SHIFT   (0U)\r\n/*! WIDTH_SEL - adc finial result fifo data packed format select, must set scan_length as even when choose 32-bits */\r\n#define ADC_ADC_REG_RESULT_BUF_WIDTH_SEL(x)      (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_RESULT_BUF_WIDTH_SEL_SHIFT)) & ADC_ADC_REG_RESULT_BUF_WIDTH_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_DMAR - ADC DMAR Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_DMAR_DMA_EN_MASK             (0x1U)\r\n#define ADC_ADC_REG_DMAR_DMA_EN_SHIFT            (0U)\r\n/*! DMA_EN - dma enbale */\r\n#define ADC_ADC_REG_DMAR_DMA_EN(x)               (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_DMAR_DMA_EN_SHIFT)) & ADC_ADC_REG_DMAR_DMA_EN_MASK)\r\n\r\n#define ADC_ADC_REG_DMAR_FIFO_THL_MASK           (0x6U)\r\n#define ADC_ADC_REG_DMAR_FIFO_THL_SHIFT          (1U)\r\n/*! FIFO_THL - fifo threshold */\r\n#define ADC_ADC_REG_DMAR_FIFO_THL(x)             (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_DMAR_FIFO_THL_SHIFT)) & ADC_ADC_REG_DMAR_FIFO_THL_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_STATUS - ADC Status Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_STATUS_ACT_MASK              (0x1U)\r\n#define ADC_ADC_REG_STATUS_ACT_SHIFT             (0U)\r\n/*! ACT - adc status */\r\n#define ADC_ADC_REG_STATUS_ACT(x)                (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_STATUS_ACT_SHIFT)) & ADC_ADC_REG_STATUS_ACT_MASK)\r\n\r\n#define ADC_ADC_REG_STATUS_FIFO_NE_MASK          (0x2U)\r\n#define ADC_ADC_REG_STATUS_FIFO_NE_SHIFT         (1U)\r\n/*! FIFO_NE - fifo not empty status */\r\n#define ADC_ADC_REG_STATUS_FIFO_NE(x)            (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_STATUS_FIFO_NE_SHIFT)) & ADC_ADC_REG_STATUS_FIFO_NE_MASK)\r\n\r\n#define ADC_ADC_REG_STATUS_FIFO_FULL_MASK        (0x4U)\r\n#define ADC_ADC_REG_STATUS_FIFO_FULL_SHIFT       (2U)\r\n/*! FIFO_FULL - fifo full status */\r\n#define ADC_ADC_REG_STATUS_FIFO_FULL(x)          (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_STATUS_FIFO_FULL_SHIFT)) & ADC_ADC_REG_STATUS_FIFO_FULL_MASK)\r\n\r\n#define ADC_ADC_REG_STATUS_FIFO_DATA_COUNT_MASK  (0x1F8U)\r\n#define ADC_ADC_REG_STATUS_FIFO_DATA_COUNT_SHIFT (3U)\r\n/*! FIFO_DATA_COUNT - fifo data number */\r\n#define ADC_ADC_REG_STATUS_FIFO_DATA_COUNT(x)    (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_STATUS_FIFO_DATA_COUNT_SHIFT)) & ADC_ADC_REG_STATUS_FIFO_DATA_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_ISR - ADC ISR Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_ISR_RDY_MASK                 (0x1U)\r\n#define ADC_ADC_REG_ISR_RDY_SHIFT                (0U)\r\n/*! RDY - Conversion data ready interrupt flag */\r\n#define ADC_ADC_REG_ISR_RDY(x)                   (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ISR_RDY_SHIFT)) & ADC_ADC_REG_ISR_RDY_MASK)\r\n\r\n#define ADC_ADC_REG_ISR_GAINSAT_MASK             (0x2U)\r\n#define ADC_ADC_REG_ISR_GAINSAT_SHIFT            (1U)\r\n/*! GAINSAT - Gain correction saturation interrupt flag */\r\n#define ADC_ADC_REG_ISR_GAINSAT(x)               (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ISR_GAINSAT_SHIFT)) & ADC_ADC_REG_ISR_GAINSAT_MASK)\r\n\r\n#define ADC_ADC_REG_ISR_OFFSAT_MASK              (0x4U)\r\n#define ADC_ADC_REG_ISR_OFFSAT_SHIFT             (2U)\r\n/*! OFFSAT - Offset correction saturation interrupt flag */\r\n#define ADC_ADC_REG_ISR_OFFSAT(x)                (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ISR_OFFSAT_SHIFT)) & ADC_ADC_REG_ISR_OFFSAT_MASK)\r\n\r\n#define ADC_ADC_REG_ISR_DATASAT_NEG_MASK         (0x8U)\r\n#define ADC_ADC_REG_ISR_DATASAT_NEG_SHIFT        (3U)\r\n/*! DATASAT_NEG - ADC data negative side saturation interrupt flag */\r\n#define ADC_ADC_REG_ISR_DATASAT_NEG(x)           (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ISR_DATASAT_NEG_SHIFT)) & ADC_ADC_REG_ISR_DATASAT_NEG_MASK)\r\n\r\n#define ADC_ADC_REG_ISR_DATASAT_POS_MASK         (0x10U)\r\n#define ADC_ADC_REG_ISR_DATASAT_POS_SHIFT        (4U)\r\n/*! DATASAT_POS - ADC data positive side saturation interrupt flag */\r\n#define ADC_ADC_REG_ISR_DATASAT_POS(x)           (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ISR_DATASAT_POS_SHIFT)) & ADC_ADC_REG_ISR_DATASAT_POS_MASK)\r\n\r\n#define ADC_ADC_REG_ISR_FIFO_OVERRUN_MASK        (0x20U)\r\n#define ADC_ADC_REG_ISR_FIFO_OVERRUN_SHIFT       (5U)\r\n/*! FIFO_OVERRUN - FIFO overrun interrupt flag */\r\n#define ADC_ADC_REG_ISR_FIFO_OVERRUN(x)          (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ISR_FIFO_OVERRUN_SHIFT)) & ADC_ADC_REG_ISR_FIFO_OVERRUN_MASK)\r\n\r\n#define ADC_ADC_REG_ISR_FIFO_UNDERRUN_MASK       (0x40U)\r\n#define ADC_ADC_REG_ISR_FIFO_UNDERRUN_SHIFT      (6U)\r\n/*! FIFO_UNDERRUN - FIFO underrun interrupt flag */\r\n#define ADC_ADC_REG_ISR_FIFO_UNDERRUN(x)         (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ISR_FIFO_UNDERRUN_SHIFT)) & ADC_ADC_REG_ISR_FIFO_UNDERRUN_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_IMR - ADC IMR Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_IMR_RDY_MASK_MASK            (0x1U)\r\n#define ADC_ADC_REG_IMR_RDY_MASK_SHIFT           (0U)\r\n/*! RDY_MASK - write 1 mask */\r\n#define ADC_ADC_REG_IMR_RDY_MASK(x)              (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_IMR_RDY_MASK_SHIFT)) & ADC_ADC_REG_IMR_RDY_MASK_MASK)\r\n\r\n#define ADC_ADC_REG_IMR_GAINSAT_MASK_MASK        (0x2U)\r\n#define ADC_ADC_REG_IMR_GAINSAT_MASK_SHIFT       (1U)\r\n/*! GAINSAT_MASK - write 1 mask */\r\n#define ADC_ADC_REG_IMR_GAINSAT_MASK(x)          (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_IMR_GAINSAT_MASK_SHIFT)) & ADC_ADC_REG_IMR_GAINSAT_MASK_MASK)\r\n\r\n#define ADC_ADC_REG_IMR_OFFSAT_MASK_MASK         (0x4U)\r\n#define ADC_ADC_REG_IMR_OFFSAT_MASK_SHIFT        (2U)\r\n/*! OFFSAT_MASK - write 1 mask */\r\n#define ADC_ADC_REG_IMR_OFFSAT_MASK(x)           (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_IMR_OFFSAT_MASK_SHIFT)) & ADC_ADC_REG_IMR_OFFSAT_MASK_MASK)\r\n\r\n#define ADC_ADC_REG_IMR_DATASAT_NEG_MASK_MASK    (0x8U)\r\n#define ADC_ADC_REG_IMR_DATASAT_NEG_MASK_SHIFT   (3U)\r\n/*! DATASAT_NEG_MASK - write 1 mask */\r\n#define ADC_ADC_REG_IMR_DATASAT_NEG_MASK(x)      (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_IMR_DATASAT_NEG_MASK_SHIFT)) & ADC_ADC_REG_IMR_DATASAT_NEG_MASK_MASK)\r\n\r\n#define ADC_ADC_REG_IMR_DATASAT_POS_MASK_MASK    (0x10U)\r\n#define ADC_ADC_REG_IMR_DATASAT_POS_MASK_SHIFT   (4U)\r\n/*! DATASAT_POS_MASK - write 1 mask */\r\n#define ADC_ADC_REG_IMR_DATASAT_POS_MASK(x)      (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_IMR_DATASAT_POS_MASK_SHIFT)) & ADC_ADC_REG_IMR_DATASAT_POS_MASK_MASK)\r\n\r\n#define ADC_ADC_REG_IMR_FIFO_OVERRUN_MASK_MASK   (0x20U)\r\n#define ADC_ADC_REG_IMR_FIFO_OVERRUN_MASK_SHIFT  (5U)\r\n/*! FIFO_OVERRUN_MASK - write 1 mask */\r\n#define ADC_ADC_REG_IMR_FIFO_OVERRUN_MASK(x)     (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_IMR_FIFO_OVERRUN_MASK_SHIFT)) & ADC_ADC_REG_IMR_FIFO_OVERRUN_MASK_MASK)\r\n\r\n#define ADC_ADC_REG_IMR_FIFO_UNDERRUN_MASK_MASK  (0x40U)\r\n#define ADC_ADC_REG_IMR_FIFO_UNDERRUN_MASK_SHIFT (6U)\r\n/*! FIFO_UNDERRUN_MASK - write 1 mask */\r\n#define ADC_ADC_REG_IMR_FIFO_UNDERRUN_MASK(x)    (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_IMR_FIFO_UNDERRUN_MASK_SHIFT)) & ADC_ADC_REG_IMR_FIFO_UNDERRUN_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_IRSR - ADC IRSR Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_IRSR_RDY_RAW_MASK            (0x1U)\r\n#define ADC_ADC_REG_IRSR_RDY_RAW_SHIFT           (0U)\r\n/*! RDY_RAW - The corresponding flag will be captured into this register regardless the interrupt\r\n *    mask. Will be cleared only when int_clr is asserted.\r\n */\r\n#define ADC_ADC_REG_IRSR_RDY_RAW(x)              (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_IRSR_RDY_RAW_SHIFT)) & ADC_ADC_REG_IRSR_RDY_RAW_MASK)\r\n\r\n#define ADC_ADC_REG_IRSR_GAINSAT_RAW_MASK        (0x2U)\r\n#define ADC_ADC_REG_IRSR_GAINSAT_RAW_SHIFT       (1U)\r\n/*! GAINSAT_RAW - The corresponding flag will be captured into this register regardless the\r\n *    interrupt mask. Will be cleared only when int_clr is asserted.\r\n */\r\n#define ADC_ADC_REG_IRSR_GAINSAT_RAW(x)          (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_IRSR_GAINSAT_RAW_SHIFT)) & ADC_ADC_REG_IRSR_GAINSAT_RAW_MASK)\r\n\r\n#define ADC_ADC_REG_IRSR_OFFSAT_RAW_MASK         (0x4U)\r\n#define ADC_ADC_REG_IRSR_OFFSAT_RAW_SHIFT        (2U)\r\n/*! OFFSAT_RAW - The corresponding flag will be captured into this register regardless the interrupt\r\n *    mask. Will be cleared only when int_clr is asserted.\r\n */\r\n#define ADC_ADC_REG_IRSR_OFFSAT_RAW(x)           (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_IRSR_OFFSAT_RAW_SHIFT)) & ADC_ADC_REG_IRSR_OFFSAT_RAW_MASK)\r\n\r\n#define ADC_ADC_REG_IRSR_DATASAT_NEG_RAW_MASK    (0x8U)\r\n#define ADC_ADC_REG_IRSR_DATASAT_NEG_RAW_SHIFT   (3U)\r\n/*! DATASAT_NEG_RAW - The corresponding flag will be captured into this register regardless the\r\n *    interrupt mask. Will be cleared only when int_clr is asserted.\r\n */\r\n#define ADC_ADC_REG_IRSR_DATASAT_NEG_RAW(x)      (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_IRSR_DATASAT_NEG_RAW_SHIFT)) & ADC_ADC_REG_IRSR_DATASAT_NEG_RAW_MASK)\r\n\r\n#define ADC_ADC_REG_IRSR_DATASAT_POS_RAW_MASK    (0x10U)\r\n#define ADC_ADC_REG_IRSR_DATASAT_POS_RAW_SHIFT   (4U)\r\n/*! DATASAT_POS_RAW - The corresponding flag will be captured into this register regardless the\r\n *    interrupt mask. Will be cleared only when int_clr is asserted.\r\n */\r\n#define ADC_ADC_REG_IRSR_DATASAT_POS_RAW(x)      (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_IRSR_DATASAT_POS_RAW_SHIFT)) & ADC_ADC_REG_IRSR_DATASAT_POS_RAW_MASK)\r\n\r\n#define ADC_ADC_REG_IRSR_FIFO_OVERRUN_RAW_MASK   (0x20U)\r\n#define ADC_ADC_REG_IRSR_FIFO_OVERRUN_RAW_SHIFT  (5U)\r\n/*! FIFO_OVERRUN_RAW - The corresponding flag will be captured into this register regardless the\r\n *    interrupt mask. Will be cleared only when int_clr is asserted.\r\n */\r\n#define ADC_ADC_REG_IRSR_FIFO_OVERRUN_RAW(x)     (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_IRSR_FIFO_OVERRUN_RAW_SHIFT)) & ADC_ADC_REG_IRSR_FIFO_OVERRUN_RAW_MASK)\r\n\r\n#define ADC_ADC_REG_IRSR_FIFO_UNDERRUN_RAW_MASK  (0x40U)\r\n#define ADC_ADC_REG_IRSR_FIFO_UNDERRUN_RAW_SHIFT (6U)\r\n/*! FIFO_UNDERRUN_RAW - The corresponding flag will be captured into this register regardless the\r\n *    interrupt mask. Will be cleared only when int_clr is asserted.\r\n */\r\n#define ADC_ADC_REG_IRSR_FIFO_UNDERRUN_RAW(x)    (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_IRSR_FIFO_UNDERRUN_RAW_SHIFT)) & ADC_ADC_REG_IRSR_FIFO_UNDERRUN_RAW_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_ICR - ADC ICR Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_ICR_RDY_CLR_MASK             (0x1U)\r\n#define ADC_ADC_REG_ICR_RDY_CLR_SHIFT            (0U)\r\n/*! RDY_CLR - Write 1 to clear both adc_reg_irsr and adc_reg_isr */\r\n#define ADC_ADC_REG_ICR_RDY_CLR(x)               (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ICR_RDY_CLR_SHIFT)) & ADC_ADC_REG_ICR_RDY_CLR_MASK)\r\n\r\n#define ADC_ADC_REG_ICR_GAINSAT_CLR_MASK         (0x2U)\r\n#define ADC_ADC_REG_ICR_GAINSAT_CLR_SHIFT        (1U)\r\n/*! GAINSAT_CLR - Write 1 to clear both adc_reg_irsr and adc_reg_isr */\r\n#define ADC_ADC_REG_ICR_GAINSAT_CLR(x)           (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ICR_GAINSAT_CLR_SHIFT)) & ADC_ADC_REG_ICR_GAINSAT_CLR_MASK)\r\n\r\n#define ADC_ADC_REG_ICR_OFFSAT_CLR_MASK          (0x4U)\r\n#define ADC_ADC_REG_ICR_OFFSAT_CLR_SHIFT         (2U)\r\n/*! OFFSAT_CLR - Write 1 to clear both adc_reg_irsr and adc_reg_isr */\r\n#define ADC_ADC_REG_ICR_OFFSAT_CLR(x)            (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ICR_OFFSAT_CLR_SHIFT)) & ADC_ADC_REG_ICR_OFFSAT_CLR_MASK)\r\n\r\n#define ADC_ADC_REG_ICR_DATASAT_NEG_CLR_MASK     (0x8U)\r\n#define ADC_ADC_REG_ICR_DATASAT_NEG_CLR_SHIFT    (3U)\r\n/*! DATASAT_NEG_CLR - Write 1 to clear both adc_reg_irsr and adc_reg_isr */\r\n#define ADC_ADC_REG_ICR_DATASAT_NEG_CLR(x)       (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ICR_DATASAT_NEG_CLR_SHIFT)) & ADC_ADC_REG_ICR_DATASAT_NEG_CLR_MASK)\r\n\r\n#define ADC_ADC_REG_ICR_DATASAT_POS_CLR_MASK     (0x10U)\r\n#define ADC_ADC_REG_ICR_DATASAT_POS_CLR_SHIFT    (4U)\r\n/*! DATASAT_POS_CLR - Write 1 to clear both adc_reg_irsr and adc_reg_isr */\r\n#define ADC_ADC_REG_ICR_DATASAT_POS_CLR(x)       (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ICR_DATASAT_POS_CLR_SHIFT)) & ADC_ADC_REG_ICR_DATASAT_POS_CLR_MASK)\r\n\r\n#define ADC_ADC_REG_ICR_FIFO_OVERRUN_CLR_MASK    (0x20U)\r\n#define ADC_ADC_REG_ICR_FIFO_OVERRUN_CLR_SHIFT   (5U)\r\n/*! FIFO_OVERRUN_CLR - Write 1 to clear both adc_reg_irsr and adc_reg_isr */\r\n#define ADC_ADC_REG_ICR_FIFO_OVERRUN_CLR(x)      (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ICR_FIFO_OVERRUN_CLR_SHIFT)) & ADC_ADC_REG_ICR_FIFO_OVERRUN_CLR_MASK)\r\n\r\n#define ADC_ADC_REG_ICR_FIFO_UNDERRUN_CLR_MASK   (0x40U)\r\n#define ADC_ADC_REG_ICR_FIFO_UNDERRUN_CLR_SHIFT  (6U)\r\n/*! FIFO_UNDERRUN_CLR - Write 1 to clear both adc_reg_irsr and adc_reg_isr */\r\n#define ADC_ADC_REG_ICR_FIFO_UNDERRUN_CLR(x)     (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_ICR_FIFO_UNDERRUN_CLR_SHIFT)) & ADC_ADC_REG_ICR_FIFO_UNDERRUN_CLR_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_RESULT - ADC Result Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_RESULT_DATA_MASK             (0xFFFFFFFFU)\r\n#define ADC_ADC_REG_RESULT_DATA_SHIFT            (0U)\r\n/*! DATA - ADC finial conversion result data, after calibratiob and signed/unsigned process */\r\n#define ADC_ADC_REG_RESULT_DATA(x)               (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_RESULT_DATA_SHIFT)) & ADC_ADC_REG_RESULT_DATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_RAW_RESULT - ADC Raw Result Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_RAW_RESULT_RAW_DATA_MASK     (0x3FFFFFU)\r\n#define ADC_ADC_REG_RAW_RESULT_RAW_DATA_SHIFT    (0U)\r\n/*! RAW_DATA - ADC Raw data in signed 22bit format */\r\n#define ADC_ADC_REG_RAW_RESULT_RAW_DATA(x)       (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_RAW_RESULT_RAW_DATA_SHIFT)) & ADC_ADC_REG_RAW_RESULT_RAW_DATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_OFFSET_CAL - ADC Offset Calibration Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_OFFSET_CAL_OFFSET_CAL_MASK   (0xFFFFU)\r\n#define ADC_ADC_REG_OFFSET_CAL_OFFSET_CAL_SHIFT  (0U)\r\n/*! OFFSET_CAL - ADC self offset calibration value. 16-bit signed . */\r\n#define ADC_ADC_REG_OFFSET_CAL_OFFSET_CAL(x)     (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_OFFSET_CAL_OFFSET_CAL_SHIFT)) & ADC_ADC_REG_OFFSET_CAL_OFFSET_CAL_MASK)\r\n\r\n#define ADC_ADC_REG_OFFSET_CAL_OFFSET_CAL_USR_MASK (0xFFFF0000U)\r\n#define ADC_ADC_REG_OFFSET_CAL_OFFSET_CAL_USR_SHIFT (16U)\r\n/*! OFFSET_CAL_USR - User offset calibration data. 16-bit signed. */\r\n#define ADC_ADC_REG_OFFSET_CAL_OFFSET_CAL_USR(x) (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_OFFSET_CAL_OFFSET_CAL_USR_SHIFT)) & ADC_ADC_REG_OFFSET_CAL_OFFSET_CAL_USR_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_GAIN_CAL - ADC Gain Calibration Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_GAIN_CAL_GAIN_CAL_MASK       (0xFFFFU)\r\n#define ADC_ADC_REG_GAIN_CAL_GAIN_CAL_SHIFT      (0U)\r\n/*! GAIN_CAL - ADC self gain calibration value. 16-bit signed. */\r\n#define ADC_ADC_REG_GAIN_CAL_GAIN_CAL(x)         (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_GAIN_CAL_GAIN_CAL_SHIFT)) & ADC_ADC_REG_GAIN_CAL_GAIN_CAL_MASK)\r\n\r\n#define ADC_ADC_REG_GAIN_CAL_GAIN_CAL_USR_MASK   (0xFFFF0000U)\r\n#define ADC_ADC_REG_GAIN_CAL_GAIN_CAL_USR_SHIFT  (16U)\r\n/*! GAIN_CAL_USR - ADC user gain calibration value. 16-bit signed. */\r\n#define ADC_ADC_REG_GAIN_CAL_GAIN_CAL_USR(x)     (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_GAIN_CAL_GAIN_CAL_USR_SHIFT)) & ADC_ADC_REG_GAIN_CAL_GAIN_CAL_USR_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_TEST - ADC Test Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_TEST_TEST_EN_MASK            (0x1U)\r\n#define ADC_ADC_REG_TEST_TEST_EN_SHIFT           (0U)\r\n/*! TEST_EN - Analog test enable. */\r\n#define ADC_ADC_REG_TEST_TEST_EN(x)              (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_TEST_TEST_EN_SHIFT)) & ADC_ADC_REG_TEST_TEST_EN_MASK)\r\n\r\n#define ADC_ADC_REG_TEST_TEST_SEL_MASK           (0xEU)\r\n#define ADC_ADC_REG_TEST_TEST_SEL_SHIFT          (1U)\r\n/*! TEST_SEL - test_sel */\r\n#define ADC_ADC_REG_TEST_TEST_SEL(x)             (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_TEST_TEST_SEL_SHIFT)) & ADC_ADC_REG_TEST_TEST_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_AUDIO - ADC Audio Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_AUDIO_EN_MASK                (0x1U)\r\n#define ADC_ADC_REG_AUDIO_EN_SHIFT               (0U)\r\n/*! EN - Audio enable. */\r\n#define ADC_ADC_REG_AUDIO_EN(x)                  (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_AUDIO_EN_SHIFT)) & ADC_ADC_REG_AUDIO_EN_MASK)\r\n\r\n#define ADC_ADC_REG_AUDIO_PGA_GAIN_MASK          (0x38U)\r\n#define ADC_ADC_REG_AUDIO_PGA_GAIN_SHIFT         (3U)\r\n/*! PGA_GAIN - Audio PGA voltage gain select */\r\n#define ADC_ADC_REG_AUDIO_PGA_GAIN(x)            (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_AUDIO_PGA_GAIN_SHIFT)) & ADC_ADC_REG_AUDIO_PGA_GAIN_MASK)\r\n\r\n#define ADC_ADC_REG_AUDIO_PGA_CM_MASK            (0x1C0U)\r\n#define ADC_ADC_REG_AUDIO_PGA_CM_SHIFT           (6U)\r\n/*! PGA_CM - Audio PGA output common mode control */\r\n#define ADC_ADC_REG_AUDIO_PGA_CM(x)              (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_AUDIO_PGA_CM_SHIFT)) & ADC_ADC_REG_AUDIO_PGA_CM_MASK)\r\n\r\n#define ADC_ADC_REG_AUDIO_PGA_CHOP_EN_MASK       (0x200U)\r\n#define ADC_ADC_REG_AUDIO_PGA_CHOP_EN_SHIFT      (9U)\r\n/*! PGA_CHOP_EN - Audio PGA chopper enable. */\r\n#define ADC_ADC_REG_AUDIO_PGA_CHOP_EN(x)         (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_AUDIO_PGA_CHOP_EN_SHIFT)) & ADC_ADC_REG_AUDIO_PGA_CHOP_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_VOICE_DET - ADC Voice Detect Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_VOICE_DET_DET_EN_MASK        (0x1U)\r\n#define ADC_ADC_REG_VOICE_DET_DET_EN_SHIFT       (0U)\r\n/*! DET_EN - Voice level detection enable select */\r\n#define ADC_ADC_REG_VOICE_DET_DET_EN(x)          (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_VOICE_DET_DET_EN_SHIFT)) & ADC_ADC_REG_VOICE_DET_DET_EN_MASK)\r\n\r\n#define ADC_ADC_REG_VOICE_DET_LEVEL_SEL_MASK     (0xEU)\r\n#define ADC_ADC_REG_VOICE_DET_LEVEL_SEL_SHIFT    (1U)\r\n/*! LEVEL_SEL - Voice level selection. */\r\n#define ADC_ADC_REG_VOICE_DET_LEVEL_SEL(x)       (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_VOICE_DET_LEVEL_SEL_SHIFT)) & ADC_ADC_REG_VOICE_DET_LEVEL_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_REG_RSVD - ADC Reserved Register */\r\n/*! @{ */\r\n\r\n#define ADC_ADC_REG_RSVD_UNUSED_RESERVED_ADC_CONTROL_BITS_MASK (0xFFFFU)\r\n#define ADC_ADC_REG_RSVD_UNUSED_RESERVED_ADC_CONTROL_BITS_SHIFT (0U)\r\n/*! UNUSED_RESERVED_ADC_CONTROL_BITS - unused_Reserved_ADC_control_bits */\r\n#define ADC_ADC_REG_RSVD_UNUSED_RESERVED_ADC_CONTROL_BITS(x) (((uint32_t)(((uint32_t)(x)) << ADC_ADC_REG_RSVD_UNUSED_RESERVED_ADC_CONTROL_BITS_SHIFT)) & ADC_ADC_REG_RSVD_UNUSED_RESERVED_ADC_CONTROL_BITS_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group ADC_Register_Masks */\r\n\r\n\r\n/* ADC - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral GAU_GPADC0 base address */\r\n  #define GAU_GPADC0_BASE                          (0x50038000u)\r\n  /** Peripheral GAU_GPADC0 base address */\r\n  #define GAU_GPADC0_BASE_NS                       (0x40038000u)\r\n  /** Peripheral GAU_GPADC0 base pointer */\r\n  #define GAU_GPADC0                               ((ADC_Type *)GAU_GPADC0_BASE)\r\n  /** Peripheral GAU_GPADC0 base pointer */\r\n  #define GAU_GPADC0_NS                            ((ADC_Type *)GAU_GPADC0_BASE_NS)\r\n  /** Peripheral GAU_GPADC1 base address */\r\n  #define GAU_GPADC1_BASE                          (0x50038100u)\r\n  /** Peripheral GAU_GPADC1 base address */\r\n  #define GAU_GPADC1_BASE_NS                       (0x40038100u)\r\n  /** Peripheral GAU_GPADC1 base pointer */\r\n  #define GAU_GPADC1                               ((ADC_Type *)GAU_GPADC1_BASE)\r\n  /** Peripheral GAU_GPADC1 base pointer */\r\n  #define GAU_GPADC1_NS                            ((ADC_Type *)GAU_GPADC1_BASE_NS)\r\n  /** Array initializer of ADC peripheral base addresses */\r\n  #define ADC_BASE_ADDRS                           { GAU_GPADC0_BASE, GAU_GPADC1_BASE }\r\n  /** Array initializer of ADC peripheral base pointers */\r\n  #define ADC_BASE_PTRS                            { GAU_GPADC0, GAU_GPADC1 }\r\n  /** Array initializer of ADC peripheral base addresses */\r\n  #define ADC_BASE_ADDRS_NS                        { GAU_GPADC0_BASE_NS, GAU_GPADC1_BASE_NS }\r\n  /** Array initializer of ADC peripheral base pointers */\r\n  #define ADC_BASE_PTRS_NS                         { GAU_GPADC0_NS, GAU_GPADC1_NS }\r\n#else\r\n  /** Peripheral GAU_GPADC0 base address */\r\n  #define GAU_GPADC0_BASE                          (0x40038000u)\r\n  /** Peripheral GAU_GPADC0 base pointer */\r\n  #define GAU_GPADC0                               ((ADC_Type *)GAU_GPADC0_BASE)\r\n  /** Peripheral GAU_GPADC1 base address */\r\n  #define GAU_GPADC1_BASE                          (0x40038100u)\r\n  /** Peripheral GAU_GPADC1 base pointer */\r\n  #define GAU_GPADC1                               ((ADC_Type *)GAU_GPADC1_BASE)\r\n  /** Array initializer of ADC peripheral base addresses */\r\n  #define ADC_BASE_ADDRS                           { GAU_GPADC0_BASE, GAU_GPADC1_BASE }\r\n  /** Array initializer of ADC peripheral base pointers */\r\n  #define ADC_BASE_PTRS                            { GAU_GPADC0, GAU_GPADC1 }\r\n#endif\r\n/** Interrupt vectors for the ADC peripheral type */\r\n#define ADC_IRQS                                 { GAU_ADC0_IRQn, GAU_ADC1_IRQn }\r\n/* Backward compatibility */\r\n#define kADC_TriggerSourceGpt                    kADC_TriggerSourceCtimer\r\n#define kADC_TriggerSourceGpio40                 kADC_TriggerSourceGpio50\r\n#define kADC_TriggerSourceGpio41                 kADC_TriggerSourceGpio55\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group ADC_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- AHB_SECURE_CTRL Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup AHB_SECURE_CTRL_Peripheral_Access_Layer AHB_SECURE_CTRL Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** AHB_SECURE_CTRL - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[16];\r\n  __IO uint32_t BOOTROM0_MEM_RULE[4];              /**< 0x03000000-0x0303FFFF part0..0x03000000-0x0303FFFF part3, array offset: 0x10, array step: 0x4 */\r\n  struct {                                         /* offset: 0x20, array step: 0xB0 */\r\n         uint8_t RESERVED_0[16];\r\n    __IO uint32_t REGION0_MEM_RULE[4];               /**< 0x08000000--0x080FFFFF..0x48300000--0x483FFFFF, array offset: 0x30, array step: index*0xB0, index2*0x4 */\r\n    __IO uint32_t REGION1_MEM_RULE;                  /**< 0x08400000--0x087FFFFF..0x48400000--0x487FFFFF, array offset: 0x40, array step: 0xB0 */\r\n         uint8_t RESERVED_1[12];\r\n    __IO uint32_t REGION2_MEM_RULE;                  /**< 0x08800000--0x08FFFFFF..0x48800000--0x48FFFFFF, array offset: 0x50, array step: 0xB0 */\r\n         uint8_t RESERVED_2[12];\r\n    __IO uint32_t REGION3_MEM_RULE;                  /**< 0x09000000--0x09FFFFFF..0x49000000--0x49FFFFFF, array offset: 0x60, array step: 0xB0 */\r\n         uint8_t RESERVED_3[12];\r\n    __IO uint32_t REGION4_MEM_RULE;                  /**< 0x0A000000--0x0BFFFFFF..0x4A000000--0x4BFFFFFF, array offset: 0x70, array step: 0xB0 */\r\n         uint8_t RESERVED_4[12];\r\n    __IO uint32_t REGION5_MEM_RULE[4];               /**< 0x0C000000--0x0C0FFFFF..0x4C300000--0x4C3FFFFF, array offset: 0x80, array step: index*0xB0, index2*0x4 */\r\n    __IO uint32_t REGION6_MEM_RULE;                  /**< 0x0C400000--0x0C7FFFFF..0x4C400000--0x4C7FFFFF, array offset: 0x90, array step: 0xB0 */\r\n         uint8_t RESERVED_5[12];\r\n    __IO uint32_t REGION7_MEM_RULE;                  /**< 0x0C800000--0x0CFFFFFF..0x4C800000--0x4CFFFFFF, array offset: 0xA0, array step: 0xB0 */\r\n         uint8_t RESERVED_6[12];\r\n    __IO uint32_t REGION8_MEM_RULE;                  /**< 0x0D000000~0x0DFFFFFFF..0x4D000000~0x4DFFFFFFF, array offset: 0xB0, array step: 0xB0 */\r\n         uint8_t RESERVED_7[12];\r\n    __IO uint32_t REGION9_MEM_RULE;                  /**< 0x0E000000~0x0FFFFFFF..0x4E000000~0x4FFFFFFF, array offset: 0xC0, array step: 0xB0 */\r\n         uint8_t RESERVED_8[12];\r\n  } FLEXSPI_RULES[3];\r\n       uint8_t RESERVED_1[16];\r\n  __IO uint32_t RAM00_RULE[4];                     /**< 0x20000000--0x2000FFFF part0..0x20000000--0x2000FFFF part3, array offset: 0x240, array step: 0x4 */\r\n  __IO uint32_t RAM01_RULE[4];                     /**< 0x20010000--0x2001FFFF part0..0x20010000--0x2001FFFF part3, array offset: 0x250, array step: 0x4 */\r\n       uint8_t RESERVED_2[16];\r\n  __IO uint32_t RAM02_RULE[4];                     /**< 0x20020000--0x2002FFFF part0..0x20020000--0x2002FFFF part3, array offset: 0x270, array step: 0x4 */\r\n  __IO uint32_t RAM03_RULE[4];                     /**< 0x20030000--0x2003FFFF part0..0x20030000--0x2003FFFF part3, array offset: 0x280, array step: 0x4 */\r\n       uint8_t RESERVED_3[16];\r\n  __IO uint32_t RAM04_RULE[4];                     /**< 0x20040000--0x2004FFFF part0..0x20040000--0x2004FFFF part3, array offset: 0x2A0, array step: 0x4 */\r\n  __IO uint32_t RAM05_RULE[4];                     /**< 0x20050000--0x2005FFFF part0..0x20050000--0x2005FFFF part3, array offset: 0x2B0, array step: 0x4 */\r\n       uint8_t RESERVED_4[16];\r\n  __IO uint32_t RAM06_RULE[4];                     /**< 0x20060000--0x2006FFFF part0..0x20060000--0x2006FFFF part3, array offset: 0x2D0, array step: 0x4 */\r\n  __IO uint32_t RAM07_RULE[4];                     /**< 0x20070000--0x2007FFFF part0..0x20070000--0x2007FFFF part3, array offset: 0x2E0, array step: 0x4 */\r\n       uint8_t RESERVED_5[16];\r\n  __IO uint32_t RAM08_RULE[4];                     /**< 0x20080000--0x2008FFFF part0..0x20080000--0x2008FFFF part3, array offset: 0x300, array step: 0x4 */\r\n  __IO uint32_t RAM09_RULE[4];                     /**< 0x20090000--0x2009FFFF part0..0x20090000--0x2009FFFF part3, array offset: 0x310, array step: 0x4 */\r\n  __IO uint32_t RAM10_RULE[4];                     /**< 0x200A0000--0x200AFFFF part0..0x200A0000--0x200AFFFF part3, array offset: 0x320, array step: 0x4 */\r\n  __IO uint32_t RAM11_RULE[4];                     /**< 0x200B0000--0x200BFFFF part0..0x200B0000--0x200BFFFF part3, array offset: 0x330, array step: 0x4 */\r\n       uint8_t RESERVED_6[16];\r\n  __IO uint32_t RAM12_RULE[4];                     /**< 0x200C0000--0x200CFFFF part0..0x200C0000--0x200CFFFF part3, array offset: 0x350, array step: 0x4 */\r\n  __IO uint32_t RAM13_RULE[4];                     /**< 0x200D0000--0x200DFFFF part0..0x200D0000--0x200DFFFF part3, array offset: 0x360, array step: 0x4 */\r\n  __IO uint32_t RAM14_RULE[4];                     /**< 0x200E0000--0x200EFFFF part0..0x200E0000--0x200EFFFF part3, array offset: 0x370, array step: 0x4 */\r\n  __IO uint32_t RAM15_RULE[4];                     /**< 0x200F0000--0x200FFFFF part0..0x200F0000--0x200FFFFF part3, array offset: 0x380, array step: 0x4 */\r\n       uint8_t RESERVED_7[16];\r\n  __IO uint32_t RAM16_RULE[4];                     /**< 0x20100000--0x2010FFFF part0..0x20100000--0x2010FFFF part3, array offset: 0x3A0, array step: 0x4 */\r\n  __IO uint32_t RAM17_RULE[4];                     /**< 0x20011000--0x20011FFF part0..0x20011000--0x20011FFF part3, array offset: 0x3B0, array step: 0x4 */\r\n  __IO uint32_t RAM18_RULE[4];                     /**< 0x20012000--0x20012FFF part0..0x20012000--0x20012FFF part3, array offset: 0x3C0, array step: 0x4 */\r\n       uint8_t RESERVED_8[16];\r\n  __IO uint32_t APB_GRP0_MEM_RULE0;                /**< 0x4000000--0x40007FFF, offset: 0x3E0 */\r\n  __IO uint32_t APB_GRP0_MEM_RULE1;                /**< 0x40008000~0x4000FFFF, offset: 0x3E4 */\r\n  __IO uint32_t APB_GRP0_MEM_RULE2;                /**< 0x40010000--0x40017FFF, offset: 0x3E8 */\r\n  __IO uint32_t APB_GRP0_MEM_RULE3;                /**< 0x40018000--0x4001FFFF, offset: 0x3EC */\r\n  __IO uint32_t APB_GRP1_MEM_RULE0;                /**< 0x40020000--0x40027FFF, offset: 0x3F0 */\r\n  __IO uint32_t APB_GRP1_MEM_RULE1;                /**< 0x40028000--0x4002FFFF, offset: 0x3F4 */\r\n  __IO uint32_t APB_GRP1_MEM_RULE2;                /**< 0x40030000--0x40037FFF, offset: 0x3F8 */\r\n  __IO uint32_t APB_GRP1_MEM_RULE3;                /**< 0x40038000--0x4003FFFF, offset: 0x3FC */\r\n  __IO uint32_t AHB_PERIPH0_SLAVE_RULE;            /**< 0x40100000--0x4011FFFF, offset: 0x400 */\r\n       uint8_t RESERVED_9[12];\r\n  __IO uint32_t AHB_PERIPH1_SLAVE_RULE;            /**< 0x40120000--0x40127FFF, offset: 0x410 */\r\n       uint8_t RESERVED_10[28];\r\n  __IO uint32_t AIPS_BRIDGE_MEM_RULE0;             /**< 0x4013 0000 ~0x4013 7FFF, offset: 0x430 */\r\n  __IO uint32_t AIPS_BRIDGE_MEM_RULE1;             /**< 0x4013 8000 ~0x4013 FFFF, offset: 0x434 */\r\n       uint8_t RESERVED_11[8];\r\n  __IO uint32_t AHB_PERIPH2_SLAVE_RULE;            /**< 0x40140000--0x4014FFFF, offset: 0x440 */\r\n       uint8_t RESERVED_12[12];\r\n  __IO uint32_t SECURITY_CTRL_MEM_RULE;            /**< 0x40148000--0x4014BFFF, offset: 0x450 */\r\n       uint8_t RESERVED_13[12];\r\n  __IO uint32_t AHB_PERIPH3_SLAVE_RULE;            /**< the memory map is 0x40150000--0x40158FFF, offset: 0x460 */\r\n       uint8_t RESERVED_14[12];\r\n  __IO uint32_t AON_MEM_RULE;                      /**< 0x4015C000--0x4015FFFF, offset: 0x470 */\r\n       uint8_t RESERVED_15[12];\r\n  __IO uint32_t WLAN_S0_SLAVE_RULE;                /**< 0x41000000-0x4137FFFF, 3.5MB, offset: 0x480 */\r\n       uint8_t RESERVED_16[12];\r\n  __IO uint32_t WLAN_S1_MEM_RULE[4];               /**< 0x41380000-0x413FFFFF, part0..0x41380000-0x413FFFFF, part3, array offset: 0x490, array step: 0x4 */\r\n  __IO uint32_t BLE_S0_SLAVE_RULE;                 /**< 0x44000000-0x443BFFFF, offset: 0x4A0 */\r\n       uint8_t RESERVED_17[12];\r\n  __IO uint32_t BLE_S1_MEM_RULE[4];                /**< 0x443C0000-0x443FFFFF part0..0x443C0000-0x443FFFFF part3, array offset: 0x4B0, array step: 0x4 */\r\n       uint8_t RESERVED_18[16];\r\n  __IO uint32_t SOC_TOP_MEM_RULE[4];               /**< 0x45000000-0x4500FFFF part0..0x45000000-0x4500FFFF part3, array offset: 0x4D0, array step: 0x4 */\r\n       uint8_t RESERVED_19[2336];\r\n  __I  uint32_t SEC_VIO_ADDR[20];                  /**< most recent security violation address for AHB layer n, array offset: 0xE00, array step: 0x4 */\r\n       uint8_t RESERVED_20[48];\r\n  __I  uint32_t SEC_VIO_MISC_INFO[20];             /**< most recent security violation miscellaneous information for AHB layer n, array offset: 0xE80, array step: 0x4 */\r\n       uint8_t RESERVED_21[48];\r\n  __IO uint32_t SEC_VIO_INFO_VALID;                /**< security violation address/information registers valid flags, offset: 0xF00 */\r\n       uint8_t RESERVED_22[124];\r\n  __IO uint32_t SEC_GPIO_MASK0;                    /**< Secure GPIO mask for port 0 pins. This register is used to block leakage of Secure interface (GPIOs, I2C, UART configured as secure peripherals) pin states to non-secure world., offset: 0xF80 */\r\n  __IO uint32_t SEC_GPIO_MASK1;                    /**< Secure GPIO mask for port 1 pins., offset: 0xF84 */\r\n       uint8_t RESERVED_23[52];\r\n  __IO uint32_t SEC_MASK_LOCK;                     /**< sec_gp_reg write-lock bits, offset: 0xFBC */\r\n       uint8_t RESERVED_24[16];\r\n  __IO uint32_t MASTER_SEC_LEVEL;                  /**< master secure level register, offset: 0xFD0 */\r\n  __IO uint32_t MASTER_SEC_LEVEL_ANTI_POL;         /**< master secure level anti-pole register, offset: 0xFD4 */\r\n       uint8_t RESERVED_25[20];\r\n  __IO uint32_t CM33_LOCK_REG;                     /**< m33 lock control register, offset: 0xFEC */\r\n       uint8_t RESERVED_26[8];\r\n  __IO uint32_t MISC_CTRL_DP_REG;                  /**< secure control duplicate register, offset: 0xFF8 */\r\n  __IO uint32_t MISC_CTRL_REG;                     /**< secure control register, offset: 0xFFC */\r\n} AHB_SECURE_CTRL_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- AHB_SECURE_CTRL Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup AHB_SECURE_CTRL_Register_Masks AHB_SECURE_CTRL Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name BOOTROM0_MEM_RULE - 0x03000000-0x0303FFFF part0..0x03000000-0x0303FFFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE0_SHIFT (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE1_SHIFT (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE2_SHIFT (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE3_SHIFT (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE4_SHIFT (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE5_MASK (0x300000U)\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE5_SHIFT (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE5(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE6_MASK (0x3000000U)\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE6_SHIFT (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE6(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE7_MASK (0x30000000U)\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE7_SHIFT (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE7(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_BOOTROM0_MEM_RULE */\r\n#define AHB_SECURE_CTRL_BOOTROM0_MEM_RULE_COUNT  (4U)\r\n\r\n/*! @name FLEXSPI_RULES_REGION0_MEM_RULE - 0x08000000--0x080FFFFF..0x48300000--0x483FFFFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE0_SHIFT (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE1_SHIFT (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE2_SHIFT (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE3_SHIFT (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE4_SHIFT (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE5_MASK (0x300000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE5_SHIFT (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE5(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE6_MASK (0x3000000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE6_SHIFT (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE6(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE7_MASK (0x30000000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE7_SHIFT (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE7(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_COUNT (3U)\r\n\r\n/* The count of AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION0_MEM_RULE_COUNT2 (4U)\r\n\r\n/*! @name FLEXSPI_RULES_REGION1_MEM_RULE - 0x08400000--0x087FFFFF..0x48400000--0x487FFFFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE0_SHIFT (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE1_SHIFT (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE2_SHIFT (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE3_SHIFT (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE4_SHIFT (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE5_MASK (0x300000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE5_SHIFT (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE5(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE6_MASK (0x3000000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE6_SHIFT (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE6(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE7_MASK (0x30000000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE7_SHIFT (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE7(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION1_MEM_RULE_COUNT (3U)\r\n\r\n/*! @name FLEXSPI_RULES_REGION2_MEM_RULE - 0x08800000--0x08FFFFFF..0x48800000--0x48FFFFFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE0_SHIFT (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE1_SHIFT (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE2_SHIFT (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE3_SHIFT (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE4_SHIFT (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE5_MASK (0x300000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE5_SHIFT (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE5(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE6_MASK (0x3000000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE6_SHIFT (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE6(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE7_MASK (0x30000000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE7_SHIFT (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE7(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION2_MEM_RULE_COUNT (3U)\r\n\r\n/*! @name FLEXSPI_RULES_REGION3_MEM_RULE - 0x09000000--0x09FFFFFF..0x49000000--0x49FFFFFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE0_SHIFT (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE1_SHIFT (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE2_SHIFT (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE3_SHIFT (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE4_SHIFT (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE5_MASK (0x300000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE5_SHIFT (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE5(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE6_MASK (0x3000000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE6_SHIFT (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE6(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE7_MASK (0x30000000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE7_SHIFT (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE7(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION3_MEM_RULE_COUNT (3U)\r\n\r\n/*! @name FLEXSPI_RULES_REGION4_MEM_RULE - 0x0A000000--0x0BFFFFFF..0x4A000000--0x4BFFFFFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE0_SHIFT (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE1_SHIFT (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE2_SHIFT (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE3_SHIFT (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE4_SHIFT (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE5_MASK (0x300000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE5_SHIFT (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE5(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE6_MASK (0x3000000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE6_SHIFT (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE6(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE7_MASK (0x30000000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE7_SHIFT (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE7(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION4_MEM_RULE_COUNT (3U)\r\n\r\n/*! @name FLEXSPI_RULES_REGION5_MEM_RULE - 0x0C000000--0x0C0FFFFF..0x4C300000--0x4C3FFFFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE0_SHIFT (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE1_SHIFT (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE2_SHIFT (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE3_SHIFT (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE4_SHIFT (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE5_MASK (0x300000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE5_SHIFT (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE5(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE6_MASK (0x3000000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE6_SHIFT (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE6(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE7_MASK (0x30000000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE7_SHIFT (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE7(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_COUNT (3U)\r\n\r\n/* The count of AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION5_MEM_RULE_COUNT2 (4U)\r\n\r\n/*! @name FLEXSPI_RULES_REGION6_MEM_RULE - 0x0C400000--0x0C7FFFFF..0x4C400000--0x4C7FFFFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE0_SHIFT (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE1_SHIFT (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE2_SHIFT (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE3_SHIFT (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE4_SHIFT (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE5_MASK (0x300000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE5_SHIFT (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE5(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE6_MASK (0x3000000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE6_SHIFT (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE6(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE7_MASK (0x30000000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE7_SHIFT (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE7(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION6_MEM_RULE_COUNT (3U)\r\n\r\n/*! @name FLEXSPI_RULES_REGION7_MEM_RULE - 0x0C800000--0x0CFFFFFF..0x4C800000--0x4CFFFFFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE0_SHIFT (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE1_SHIFT (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE2_SHIFT (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE3_SHIFT (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE4_SHIFT (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE5_MASK (0x300000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE5_SHIFT (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE5(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE6_MASK (0x3000000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE6_SHIFT (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE6(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE7_MASK (0x30000000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE7_SHIFT (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE7(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION7_MEM_RULE_COUNT (3U)\r\n\r\n/*! @name FLEXSPI_RULES_REGION8_MEM_RULE - 0x0D000000~0x0DFFFFFFF..0x4D000000~0x4DFFFFFFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE0_SHIFT (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE1_SHIFT (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE2_SHIFT (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE3_SHIFT (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE4_SHIFT (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE5_MASK (0x300000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE5_SHIFT (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE5(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE6_MASK (0x3000000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE6_SHIFT (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE6(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE7_MASK (0x30000000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE7_SHIFT (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE7(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION8_MEM_RULE_COUNT (3U)\r\n\r\n/*! @name FLEXSPI_RULES_REGION9_MEM_RULE - 0x0E000000~0x0FFFFFFF..0x4E000000~0x4FFFFFFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE0_SHIFT (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE1_SHIFT (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE2_SHIFT (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE3_SHIFT (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE4_SHIFT (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE5_MASK (0x300000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE5_SHIFT (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE5(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE6_MASK (0x3000000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE6_SHIFT (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE6(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE7_MASK (0x30000000U)\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE7_SHIFT (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE7(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE */\r\n#define AHB_SECURE_CTRL_FLEXSPI_RULES_REGION9_MEM_RULE_COUNT (3U)\r\n\r\n/*! @name RAM00_RULE - 0x20000000--0x2000FFFF part0..0x20000000--0x2000FFFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE0_MASK    (0x3U)\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE0_SHIFT   (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE0(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM00_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_RAM00_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE1_MASK    (0x30U)\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE1_SHIFT   (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE1(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM00_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_RAM00_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE2_MASK    (0x300U)\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE2_SHIFT   (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE2(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM00_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_RAM00_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE3_MASK    (0x3000U)\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE3_SHIFT   (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE3(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM00_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_RAM00_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE4_MASK    (0x30000U)\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE4_SHIFT   (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE4(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM00_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_RAM00_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE5_MASK    (0x300000U)\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE5_SHIFT   (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE5(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM00_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_RAM00_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE6_MASK    (0x3000000U)\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE6_SHIFT   (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE6(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM00_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_RAM00_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE7_MASK    (0x30000000U)\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE7_SHIFT   (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM00_RULE_RULE7(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM00_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_RAM00_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_RAM00_RULE */\r\n#define AHB_SECURE_CTRL_RAM00_RULE_COUNT         (4U)\r\n\r\n/*! @name RAM01_RULE - 0x20010000--0x2001FFFF part0..0x20010000--0x2001FFFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE0_MASK    (0x3U)\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE0_SHIFT   (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE0(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM01_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_RAM01_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE1_MASK    (0x30U)\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE1_SHIFT   (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE1(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM01_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_RAM01_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE2_MASK    (0x300U)\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE2_SHIFT   (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE2(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM01_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_RAM01_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE3_MASK    (0x3000U)\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE3_SHIFT   (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE3(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM01_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_RAM01_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE4_MASK    (0x30000U)\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE4_SHIFT   (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE4(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM01_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_RAM01_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE5_MASK    (0x300000U)\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE5_SHIFT   (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE5(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM01_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_RAM01_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE6_MASK    (0x3000000U)\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE6_SHIFT   (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE6(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM01_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_RAM01_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE7_MASK    (0x30000000U)\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE7_SHIFT   (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM01_RULE_RULE7(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM01_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_RAM01_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_RAM01_RULE */\r\n#define AHB_SECURE_CTRL_RAM01_RULE_COUNT         (4U)\r\n\r\n/*! @name RAM02_RULE - 0x20020000--0x2002FFFF part0..0x20020000--0x2002FFFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE0_MASK    (0x3U)\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE0_SHIFT   (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE0(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM02_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_RAM02_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE1_MASK    (0x30U)\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE1_SHIFT   (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE1(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM02_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_RAM02_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE2_MASK    (0x300U)\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE2_SHIFT   (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE2(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM02_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_RAM02_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE3_MASK    (0x3000U)\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE3_SHIFT   (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE3(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM02_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_RAM02_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE4_MASK    (0x30000U)\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE4_SHIFT   (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE4(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM02_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_RAM02_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE5_MASK    (0x300000U)\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE5_SHIFT   (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE5(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM02_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_RAM02_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE6_MASK    (0x3000000U)\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE6_SHIFT   (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE6(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM02_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_RAM02_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE7_MASK    (0x30000000U)\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE7_SHIFT   (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM02_RULE_RULE7(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM02_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_RAM02_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_RAM02_RULE */\r\n#define AHB_SECURE_CTRL_RAM02_RULE_COUNT         (4U)\r\n\r\n/*! @name RAM03_RULE - 0x20030000--0x2003FFFF part0..0x20030000--0x2003FFFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE0_MASK    (0x3U)\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE0_SHIFT   (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE0(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM03_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_RAM03_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE1_MASK    (0x30U)\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE1_SHIFT   (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE1(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM03_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_RAM03_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE2_MASK    (0x300U)\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE2_SHIFT   (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE2(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM03_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_RAM03_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE3_MASK    (0x3000U)\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE3_SHIFT   (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE3(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM03_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_RAM03_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE4_MASK    (0x30000U)\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE4_SHIFT   (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE4(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM03_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_RAM03_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE5_MASK    (0x300000U)\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE5_SHIFT   (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE5(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM03_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_RAM03_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE6_MASK    (0x3000000U)\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE6_SHIFT   (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE6(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM03_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_RAM03_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE7_MASK    (0x30000000U)\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE7_SHIFT   (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM03_RULE_RULE7(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM03_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_RAM03_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_RAM03_RULE */\r\n#define AHB_SECURE_CTRL_RAM03_RULE_COUNT         (4U)\r\n\r\n/*! @name RAM04_RULE - 0x20040000--0x2004FFFF part0..0x20040000--0x2004FFFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE0_MASK    (0x3U)\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE0_SHIFT   (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE0(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM04_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_RAM04_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE1_MASK    (0x30U)\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE1_SHIFT   (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE1(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM04_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_RAM04_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE2_MASK    (0x300U)\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE2_SHIFT   (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE2(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM04_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_RAM04_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE3_MASK    (0x3000U)\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE3_SHIFT   (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE3(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM04_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_RAM04_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE4_MASK    (0x30000U)\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE4_SHIFT   (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE4(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM04_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_RAM04_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE5_MASK    (0x300000U)\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE5_SHIFT   (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE5(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM04_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_RAM04_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE6_MASK    (0x3000000U)\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE6_SHIFT   (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE6(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM04_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_RAM04_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE7_MASK    (0x30000000U)\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE7_SHIFT   (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM04_RULE_RULE7(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM04_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_RAM04_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_RAM04_RULE */\r\n#define AHB_SECURE_CTRL_RAM04_RULE_COUNT         (4U)\r\n\r\n/*! @name RAM05_RULE - 0x20050000--0x2005FFFF part0..0x20050000--0x2005FFFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE0_MASK    (0x3U)\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE0_SHIFT   (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE0(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM05_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_RAM05_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE1_MASK    (0x30U)\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE1_SHIFT   (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE1(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM05_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_RAM05_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE2_MASK    (0x300U)\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE2_SHIFT   (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE2(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM05_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_RAM05_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE3_MASK    (0x3000U)\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE3_SHIFT   (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE3(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM05_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_RAM05_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE4_MASK    (0x30000U)\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE4_SHIFT   (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE4(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM05_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_RAM05_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE5_MASK    (0x300000U)\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE5_SHIFT   (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE5(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM05_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_RAM05_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE6_MASK    (0x3000000U)\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE6_SHIFT   (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE6(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM05_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_RAM05_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE7_MASK    (0x30000000U)\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE7_SHIFT   (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM05_RULE_RULE7(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM05_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_RAM05_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_RAM05_RULE */\r\n#define AHB_SECURE_CTRL_RAM05_RULE_COUNT         (4U)\r\n\r\n/*! @name RAM06_RULE - 0x20060000--0x2006FFFF part0..0x20060000--0x2006FFFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE0_MASK    (0x3U)\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE0_SHIFT   (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE0(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM06_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_RAM06_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE1_MASK    (0x30U)\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE1_SHIFT   (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE1(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM06_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_RAM06_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE2_MASK    (0x300U)\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE2_SHIFT   (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE2(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM06_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_RAM06_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE3_MASK    (0x3000U)\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE3_SHIFT   (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE3(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM06_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_RAM06_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE4_MASK    (0x30000U)\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE4_SHIFT   (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE4(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM06_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_RAM06_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE5_MASK    (0x300000U)\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE5_SHIFT   (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE5(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM06_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_RAM06_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE6_MASK    (0x3000000U)\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE6_SHIFT   (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE6(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM06_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_RAM06_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE7_MASK    (0x30000000U)\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE7_SHIFT   (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM06_RULE_RULE7(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM06_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_RAM06_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_RAM06_RULE */\r\n#define AHB_SECURE_CTRL_RAM06_RULE_COUNT         (4U)\r\n\r\n/*! @name RAM07_RULE - 0x20070000--0x2007FFFF part0..0x20070000--0x2007FFFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE0_MASK    (0x3U)\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE0_SHIFT   (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE0(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM07_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_RAM07_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE1_MASK    (0x30U)\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE1_SHIFT   (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE1(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM07_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_RAM07_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE2_MASK    (0x300U)\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE2_SHIFT   (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE2(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM07_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_RAM07_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE3_MASK    (0x3000U)\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE3_SHIFT   (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE3(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM07_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_RAM07_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE4_MASK    (0x30000U)\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE4_SHIFT   (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE4(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM07_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_RAM07_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE5_MASK    (0x300000U)\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE5_SHIFT   (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE5(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM07_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_RAM07_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE6_MASK    (0x3000000U)\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE6_SHIFT   (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE6(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM07_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_RAM07_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE7_MASK    (0x30000000U)\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE7_SHIFT   (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM07_RULE_RULE7(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM07_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_RAM07_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_RAM07_RULE */\r\n#define AHB_SECURE_CTRL_RAM07_RULE_COUNT         (4U)\r\n\r\n/*! @name RAM08_RULE - 0x20080000--0x2008FFFF part0..0x20080000--0x2008FFFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE0_MASK    (0x3U)\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE0_SHIFT   (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE0(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM08_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_RAM08_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE1_MASK    (0x30U)\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE1_SHIFT   (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE1(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM08_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_RAM08_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE2_MASK    (0x300U)\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE2_SHIFT   (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE2(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM08_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_RAM08_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE3_MASK    (0x3000U)\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE3_SHIFT   (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE3(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM08_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_RAM08_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE4_MASK    (0x30000U)\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE4_SHIFT   (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE4(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM08_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_RAM08_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE5_MASK    (0x300000U)\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE5_SHIFT   (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE5(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM08_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_RAM08_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE6_MASK    (0x3000000U)\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE6_SHIFT   (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE6(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM08_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_RAM08_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE7_MASK    (0x30000000U)\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE7_SHIFT   (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM08_RULE_RULE7(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM08_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_RAM08_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_RAM08_RULE */\r\n#define AHB_SECURE_CTRL_RAM08_RULE_COUNT         (4U)\r\n\r\n/*! @name RAM09_RULE - 0x20090000--0x2009FFFF part0..0x20090000--0x2009FFFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE0_MASK    (0x3U)\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE0_SHIFT   (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE0(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM09_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_RAM09_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE1_MASK    (0x30U)\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE1_SHIFT   (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE1(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM09_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_RAM09_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE2_MASK    (0x300U)\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE2_SHIFT   (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE2(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM09_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_RAM09_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE3_MASK    (0x3000U)\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE3_SHIFT   (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE3(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM09_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_RAM09_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE4_MASK    (0x30000U)\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE4_SHIFT   (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE4(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM09_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_RAM09_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE5_MASK    (0x300000U)\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE5_SHIFT   (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE5(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM09_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_RAM09_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE6_MASK    (0x3000000U)\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE6_SHIFT   (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE6(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM09_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_RAM09_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE7_MASK    (0x30000000U)\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE7_SHIFT   (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM09_RULE_RULE7(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM09_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_RAM09_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_RAM09_RULE */\r\n#define AHB_SECURE_CTRL_RAM09_RULE_COUNT         (4U)\r\n\r\n/*! @name RAM10_RULE - 0x200A0000--0x200AFFFF part0..0x200A0000--0x200AFFFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE0_MASK    (0x3U)\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE0_SHIFT   (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE0(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM10_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_RAM10_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE1_MASK    (0x30U)\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE1_SHIFT   (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE1(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM10_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_RAM10_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE2_MASK    (0x300U)\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE2_SHIFT   (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE2(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM10_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_RAM10_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE3_MASK    (0x3000U)\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE3_SHIFT   (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE3(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM10_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_RAM10_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE4_MASK    (0x30000U)\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE4_SHIFT   (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE4(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM10_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_RAM10_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE5_MASK    (0x300000U)\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE5_SHIFT   (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE5(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM10_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_RAM10_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE6_MASK    (0x3000000U)\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE6_SHIFT   (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE6(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM10_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_RAM10_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE7_MASK    (0x30000000U)\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE7_SHIFT   (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM10_RULE_RULE7(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM10_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_RAM10_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_RAM10_RULE */\r\n#define AHB_SECURE_CTRL_RAM10_RULE_COUNT         (4U)\r\n\r\n/*! @name RAM11_RULE - 0x200B0000--0x200BFFFF part0..0x200B0000--0x200BFFFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE0_MASK    (0x3U)\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE0_SHIFT   (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE0(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM11_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_RAM11_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE1_MASK    (0x30U)\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE1_SHIFT   (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE1(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM11_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_RAM11_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE2_MASK    (0x300U)\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE2_SHIFT   (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE2(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM11_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_RAM11_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE3_MASK    (0x3000U)\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE3_SHIFT   (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE3(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM11_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_RAM11_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE4_MASK    (0x30000U)\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE4_SHIFT   (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE4(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM11_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_RAM11_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE5_MASK    (0x300000U)\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE5_SHIFT   (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE5(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM11_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_RAM11_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE6_MASK    (0x3000000U)\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE6_SHIFT   (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE6(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM11_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_RAM11_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE7_MASK    (0x30000000U)\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE7_SHIFT   (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM11_RULE_RULE7(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM11_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_RAM11_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_RAM11_RULE */\r\n#define AHB_SECURE_CTRL_RAM11_RULE_COUNT         (4U)\r\n\r\n/*! @name RAM12_RULE - 0x200C0000--0x200CFFFF part0..0x200C0000--0x200CFFFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE0_MASK    (0x3U)\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE0_SHIFT   (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE0(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM12_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_RAM12_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE1_MASK    (0x30U)\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE1_SHIFT   (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE1(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM12_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_RAM12_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE2_MASK    (0x300U)\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE2_SHIFT   (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE2(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM12_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_RAM12_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE3_MASK    (0x3000U)\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE3_SHIFT   (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE3(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM12_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_RAM12_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE4_MASK    (0x30000U)\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE4_SHIFT   (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE4(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM12_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_RAM12_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE5_MASK    (0x300000U)\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE5_SHIFT   (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE5(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM12_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_RAM12_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE6_MASK    (0x3000000U)\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE6_SHIFT   (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE6(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM12_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_RAM12_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE7_MASK    (0x30000000U)\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE7_SHIFT   (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM12_RULE_RULE7(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM12_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_RAM12_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_RAM12_RULE */\r\n#define AHB_SECURE_CTRL_RAM12_RULE_COUNT         (4U)\r\n\r\n/*! @name RAM13_RULE - 0x200D0000--0x200DFFFF part0..0x200D0000--0x200DFFFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE0_MASK    (0x3U)\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE0_SHIFT   (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE0(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM13_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_RAM13_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE1_MASK    (0x30U)\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE1_SHIFT   (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE1(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM13_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_RAM13_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE2_MASK    (0x300U)\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE2_SHIFT   (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE2(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM13_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_RAM13_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE3_MASK    (0x3000U)\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE3_SHIFT   (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE3(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM13_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_RAM13_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE4_MASK    (0x30000U)\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE4_SHIFT   (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE4(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM13_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_RAM13_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE5_MASK    (0x300000U)\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE5_SHIFT   (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE5(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM13_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_RAM13_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE6_MASK    (0x3000000U)\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE6_SHIFT   (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE6(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM13_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_RAM13_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE7_MASK    (0x30000000U)\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE7_SHIFT   (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM13_RULE_RULE7(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM13_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_RAM13_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_RAM13_RULE */\r\n#define AHB_SECURE_CTRL_RAM13_RULE_COUNT         (4U)\r\n\r\n/*! @name RAM14_RULE - 0x200E0000--0x200EFFFF part0..0x200E0000--0x200EFFFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE0_MASK    (0x3U)\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE0_SHIFT   (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE0(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM14_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_RAM14_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE1_MASK    (0x30U)\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE1_SHIFT   (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE1(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM14_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_RAM14_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE2_MASK    (0x300U)\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE2_SHIFT   (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE2(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM14_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_RAM14_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE3_MASK    (0x3000U)\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE3_SHIFT   (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE3(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM14_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_RAM14_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE4_MASK    (0x30000U)\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE4_SHIFT   (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE4(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM14_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_RAM14_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE5_MASK    (0x300000U)\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE5_SHIFT   (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE5(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM14_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_RAM14_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE6_MASK    (0x3000000U)\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE6_SHIFT   (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE6(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM14_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_RAM14_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE7_MASK    (0x30000000U)\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE7_SHIFT   (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM14_RULE_RULE7(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM14_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_RAM14_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_RAM14_RULE */\r\n#define AHB_SECURE_CTRL_RAM14_RULE_COUNT         (4U)\r\n\r\n/*! @name RAM15_RULE - 0x200F0000--0x200FFFFF part0..0x200F0000--0x200FFFFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE0_MASK    (0x3U)\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE0_SHIFT   (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE0(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM15_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_RAM15_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE1_MASK    (0x30U)\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE1_SHIFT   (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE1(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM15_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_RAM15_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE2_MASK    (0x300U)\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE2_SHIFT   (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE2(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM15_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_RAM15_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE3_MASK    (0x3000U)\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE3_SHIFT   (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE3(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM15_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_RAM15_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE4_MASK    (0x30000U)\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE4_SHIFT   (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE4(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM15_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_RAM15_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE5_MASK    (0x300000U)\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE5_SHIFT   (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE5(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM15_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_RAM15_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE6_MASK    (0x3000000U)\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE6_SHIFT   (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE6(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM15_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_RAM15_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE7_MASK    (0x30000000U)\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE7_SHIFT   (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM15_RULE_RULE7(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM15_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_RAM15_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_RAM15_RULE */\r\n#define AHB_SECURE_CTRL_RAM15_RULE_COUNT         (4U)\r\n\r\n/*! @name RAM16_RULE - 0x20100000--0x2010FFFF part0..0x20100000--0x2010FFFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE0_MASK    (0x3U)\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE0_SHIFT   (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE0(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM16_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_RAM16_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE1_MASK    (0x30U)\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE1_SHIFT   (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE1(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM16_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_RAM16_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE2_MASK    (0x300U)\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE2_SHIFT   (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE2(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM16_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_RAM16_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE3_MASK    (0x3000U)\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE3_SHIFT   (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE3(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM16_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_RAM16_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE4_MASK    (0x30000U)\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE4_SHIFT   (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE4(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM16_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_RAM16_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE5_MASK    (0x300000U)\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE5_SHIFT   (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE5(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM16_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_RAM16_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE6_MASK    (0x3000000U)\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE6_SHIFT   (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE6(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM16_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_RAM16_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE7_MASK    (0x30000000U)\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE7_SHIFT   (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM16_RULE_RULE7(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM16_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_RAM16_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_RAM16_RULE */\r\n#define AHB_SECURE_CTRL_RAM16_RULE_COUNT         (4U)\r\n\r\n/*! @name RAM17_RULE - 0x20011000--0x20011FFF part0..0x20011000--0x20011FFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE0_MASK    (0x3U)\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE0_SHIFT   (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE0(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM17_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_RAM17_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE1_MASK    (0x30U)\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE1_SHIFT   (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE1(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM17_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_RAM17_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE2_MASK    (0x300U)\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE2_SHIFT   (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE2(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM17_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_RAM17_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE3_MASK    (0x3000U)\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE3_SHIFT   (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE3(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM17_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_RAM17_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE4_MASK    (0x30000U)\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE4_SHIFT   (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE4(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM17_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_RAM17_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE5_MASK    (0x300000U)\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE5_SHIFT   (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE5(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM17_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_RAM17_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE6_MASK    (0x3000000U)\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE6_SHIFT   (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE6(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM17_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_RAM17_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE7_MASK    (0x30000000U)\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE7_SHIFT   (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM17_RULE_RULE7(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM17_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_RAM17_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_RAM17_RULE */\r\n#define AHB_SECURE_CTRL_RAM17_RULE_COUNT         (4U)\r\n\r\n/*! @name RAM18_RULE - 0x20012000--0x20012FFF part0..0x20012000--0x20012FFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE0_MASK    (0x3U)\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE0_SHIFT   (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE0(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM18_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_RAM18_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE1_MASK    (0x30U)\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE1_SHIFT   (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE1(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM18_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_RAM18_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE2_MASK    (0x300U)\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE2_SHIFT   (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE2(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM18_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_RAM18_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE3_MASK    (0x3000U)\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE3_SHIFT   (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE3(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM18_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_RAM18_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE4_MASK    (0x30000U)\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE4_SHIFT   (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE4(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM18_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_RAM18_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE5_MASK    (0x300000U)\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE5_SHIFT   (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE5(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM18_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_RAM18_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE6_MASK    (0x3000000U)\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE6_SHIFT   (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE6(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM18_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_RAM18_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE7_MASK    (0x30000000U)\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE7_SHIFT   (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_RAM18_RULE_RULE7(x)      (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_RAM18_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_RAM18_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_RAM18_RULE */\r\n#define AHB_SECURE_CTRL_RAM18_RULE_COUNT         (4U)\r\n\r\n/*! @name APB_GRP0_MEM_RULE0 - 0x4000000--0x40007FFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_RSTCTL0_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_RSTCTL0_RULE0_SHIFT (0U)\r\n/*! RSTCTL0_RULE0 - 0x4000 0000--0x4000 0FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_RSTCTL0_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_RSTCTL0_RULE0_SHIFT)) & AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_RSTCTL0_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_CLKCTL0_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_CLKCTL0_RULE1_SHIFT (4U)\r\n/*! CLKCTL0_RULE1 - 0x4000 1000--0x4000 1FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_CLKCTL0_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_CLKCTL0_RULE1_SHIFT)) & AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_CLKCTL0_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_SYSCTL0_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_SYSCTL0_RULE2_SHIFT (8U)\r\n/*! SYSCTL0_RULE2 - 0x4000 2000--0x4000 2FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_SYSCTL0_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_SYSCTL0_RULE2_SHIFT)) & AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_SYSCTL0_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_SYSCTL2_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_SYSCTL2_RULE3_SHIFT (12U)\r\n/*! SYSCTL2_RULE3 - 0x4000 3000--0x4000 3FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_SYSCTL2_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_SYSCTL2_RULE3_SHIFT)) & AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_SYSCTL2_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_IOCON_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_IOCON_RULE4_SHIFT (16U)\r\n/*! IOCON_RULE4 - 0x4000 4000--0x4000 4FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_IOCON_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_IOCON_RULE4_SHIFT)) & AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_IOCON_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_PUFCTRL_RULE6_MASK (0x3000000U)\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_PUFCTRL_RULE6_SHIFT (24U)\r\n/*! PUFCTRL_RULE6 - 0x4000 6000--0x4000 6FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_PUFCTRL_RULE6(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_PUFCTRL_RULE6_SHIFT)) & AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_PUFCTRL_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_ELS_RULE7_MASK (0x30000000U)\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_ELS_RULE7_SHIFT (28U)\r\n/*! ELS_RULE7 - 0x4000 7000--0x4000 7FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_ELS_RULE7(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_ELS_RULE7_SHIFT)) & AHB_SECURE_CTRL_APB_GRP0_MEM_RULE0_ELS_RULE7_MASK)\r\n/*! @} */\r\n\r\n/*! @name APB_GRP0_MEM_RULE1 - 0x40008000~0x4000FFFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_USIM_RULE8_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_USIM_RULE8_SHIFT (0U)\r\n/*! USIM_RULE8 - 0x4000 8000--0x4000 8FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_USIM_RULE8(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_USIM_RULE8_SHIFT)) & AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_USIM_RULE8_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_PKC_RULE9_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_PKC_RULE9_SHIFT (4U)\r\n/*! PKC_RULE9 - 0x4000 9000--0x4000 9FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_PKC_RULE9(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_PKC_RULE9_SHIFT)) & AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_PKC_RULE9_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_OCOTP_RULE10_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_OCOTP_RULE10_SHIFT (8U)\r\n/*! OCOTP_RULE10 - 0x4000 A000--0x4000 AFFF */\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_OCOTP_RULE10(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_OCOTP_RULE10_SHIFT)) & AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_OCOTP_RULE10_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_OCOTP_ADAP_RULE11_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_OCOTP_ADAP_RULE11_SHIFT (12U)\r\n/*! OCOTP_ADAP_RULE11 - 0x4000 A000--0x4000 AFFF */\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_OCOTP_ADAP_RULE11(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_OCOTP_ADAP_RULE11_SHIFT)) & AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_OCOTP_ADAP_RULE11_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_WWDT0_RULE14_MASK (0x3000000U)\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_WWDT0_RULE14_SHIFT (24U)\r\n/*! WWDT0_RULE14 - 0x4000 E000--0x4000 EFFF */\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_WWDT0_RULE14(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_WWDT0_RULE14_SHIFT)) & AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_WWDT0_RULE14_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_UTICK_RULE15_MASK (0x30000000U)\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_UTICK_RULE15_SHIFT (28U)\r\n/*! UTICK_RULE15 - 0x4000 F000--0x4000 FFFF */\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_UTICK_RULE15(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_UTICK_RULE15_SHIFT)) & AHB_SECURE_CTRL_APB_GRP0_MEM_RULE1_UTICK_RULE15_MASK)\r\n/*! @} */\r\n\r\n/*! @name APB_GRP0_MEM_RULE2 - 0x40010000--0x40017FFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE2_TRNG_RULE20_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE2_TRNG_RULE20_SHIFT (16U)\r\n/*! TRNG_RULE20 - 0x4001 4000--0x4001 4FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE2_TRNG_RULE20(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP0_MEM_RULE2_TRNG_RULE20_SHIFT)) & AHB_SECURE_CTRL_APB_GRP0_MEM_RULE2_TRNG_RULE20_MASK)\r\n/*! @} */\r\n\r\n/*! @name APB_GRP0_MEM_RULE3 - 0x40018000--0x4001FFFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE3_C0_DOMAIN_TESTCON_RULE27_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE3_C0_DOMAIN_TESTCON_RULE27_SHIFT (12U)\r\n/*! C0_DOMAIN_TESTCON_RULE27 - 0x4001 B000--0x4001 BFFF */\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE3_C0_DOMAIN_TESTCON_RULE27(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP0_MEM_RULE3_C0_DOMAIN_TESTCON_RULE27_SHIFT)) & AHB_SECURE_CTRL_APB_GRP0_MEM_RULE3_C0_DOMAIN_TESTCON_RULE27_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE3_C0AON_DOMAIN_TESTCON_RULE28_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE3_C0AON_DOMAIN_TESTCON_RULE28_SHIFT (16U)\r\n/*! C0AON_DOMAIN_TESTCON_RULE28 - 0x4001 C000--0x4001 CFFF */\r\n#define AHB_SECURE_CTRL_APB_GRP0_MEM_RULE3_C0AON_DOMAIN_TESTCON_RULE28(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP0_MEM_RULE3_C0AON_DOMAIN_TESTCON_RULE28_SHIFT)) & AHB_SECURE_CTRL_APB_GRP0_MEM_RULE3_C0AON_DOMAIN_TESTCON_RULE28_MASK)\r\n/*! @} */\r\n\r\n/*! @name APB_GRP1_MEM_RULE0 - 0x40020000--0x40027FFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_RSTCTL1_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_RSTCTL1_RULE0_SHIFT (0U)\r\n/*! RSTCTL1_RULE0 - 0x4002 0000--0x4002 0FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_RSTCTL1_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_RSTCTL1_RULE0_SHIFT)) & AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_RSTCTL1_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_CLKCTL1_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_CLKCTL1_RULE1_SHIFT (4U)\r\n/*! CLKCTL1_RULE1 - 0x4002 1000--0x4002 1FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_CLKCTL1_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_CLKCTL1_RULE1_SHIFT)) & AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_CLKCTL1_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_SYSCTL1_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_SYSCTL1_RULE2_SHIFT (8U)\r\n/*! SYSCTL1_RULE2 - 0x4002 2000--0x4002 2FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_SYSCTL1_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_SYSCTL1_RULE2_SHIFT)) & AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_SYSCTL1_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_ITRC_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_ITRC_RULE4_SHIFT (16U)\r\n/*! ITRC_RULE4 - 0x4002 4000--0x4002 4FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_ITRC_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_ITRC_RULE4_SHIFT)) & AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_ITRC_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_GPIO_INTR_CTRL_RULE5_MASK (0x300000U)\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_GPIO_INTR_CTRL_RULE5_SHIFT (20U)\r\n/*! GPIO_INTR_CTRL_RULE5 - 0x4002 5000--0x4002 5FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_GPIO_INTR_CTRL_RULE5(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_GPIO_INTR_CTRL_RULE5_SHIFT)) & AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_GPIO_INTR_CTRL_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_PERIPH_INPUT_MUX_RULE6_MASK (0x3000000U)\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_PERIPH_INPUT_MUX_RULE6_SHIFT (24U)\r\n/*! PERIPH_INPUT_MUX_RULE6 - 0x4002 6000--0x4002 6FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_PERIPH_INPUT_MUX_RULE6(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_PERIPH_INPUT_MUX_RULE6_SHIFT)) & AHB_SECURE_CTRL_APB_GRP1_MEM_RULE0_PERIPH_INPUT_MUX_RULE6_MASK)\r\n/*! @} */\r\n\r\n/*! @name APB_GRP1_MEM_RULE1 - 0x40028000--0x4002FFFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_CT32BIT0_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_CT32BIT0_RULE0_SHIFT (0U)\r\n/*! CT32BIT0_RULE0 - 0x4002 8000--0x4002 8FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_CT32BIT0_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_CT32BIT0_RULE0_SHIFT)) & AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_CT32BIT0_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_CT32BIT1_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_CT32BIT1_RULE1_SHIFT (4U)\r\n/*! CT32BIT1_RULE1 - 0x4002 9000--0x4002 9FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_CT32BIT1_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_CT32BIT1_RULE1_SHIFT)) & AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_CT32BIT1_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_CT32BIT2_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_CT32BIT2_RULE2_SHIFT (8U)\r\n/*! CT32BIT2_RULE2 - 0x4002 A000--0x4002 AFFF */\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_CT32BIT2_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_CT32BIT2_RULE2_SHIFT)) & AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_CT32BIT2_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_CT32BIT3_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_CT32BIT3_RULE3_SHIFT (12U)\r\n/*! CT32BIT3_RULE3 - 0x4002 B000--0x4002 BFFF */\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_CT32BIT3_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_CT32BIT3_RULE3_SHIFT)) & AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_CT32BIT3_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_MRT_RULE5_MASK (0x300000U)\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_MRT_RULE5_SHIFT (20U)\r\n/*! MRT_RULE5 - 0x4002 D000--0x4002 DFFF */\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_MRT_RULE5(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_MRT_RULE5_SHIFT)) & AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_MRT_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_FREQME_RULE7_MASK (0x30000000U)\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_FREQME_RULE7_SHIFT (28U)\r\n/*! FREQME_RULE7 - 0x4002 F000--0x4002 FFFF */\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_FREQME_RULE7(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_FREQME_RULE7_SHIFT)) & AHB_SECURE_CTRL_APB_GRP1_MEM_RULE1_FREQME_RULE7_MASK)\r\n/*! @} */\r\n\r\n/*! @name APB_GRP1_MEM_RULE2 - 0x40030000--0x40037FFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE2_RTC_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE2_RTC_RULE0_SHIFT (0U)\r\n/*! RTC_RULE0 - 0x4003 0000--0x4003 0FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE2_RTC_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP1_MEM_RULE2_RTC_RULE0_SHIFT)) & AHB_SECURE_CTRL_APB_GRP1_MEM_RULE2_RTC_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE2_PMU_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE2_PMU_RULE1_SHIFT (4U)\r\n/*! PMU_RULE1 - 0x4003 1000--0x4003 1FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE2_PMU_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP1_MEM_RULE2_PMU_RULE1_SHIFT)) & AHB_SECURE_CTRL_APB_GRP1_MEM_RULE2_PMU_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE2_FLASH_CACHE0_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE2_FLASH_CACHE0_RULE3_SHIFT (12U)\r\n/*! FLASH_CACHE0_RULE3 - 0x4003 3000--0x4003 3FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE2_FLASH_CACHE0_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP1_MEM_RULE2_FLASH_CACHE0_RULE3_SHIFT)) & AHB_SECURE_CTRL_APB_GRP1_MEM_RULE2_FLASH_CACHE0_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE2_FLASH_CACHE1_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE2_FLASH_CACHE1_RULE4_SHIFT (16U)\r\n/*! FLASH_CACHE1_RULE4 - 0x4003 4000--0x4003 4FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE2_FLASH_CACHE1_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP1_MEM_RULE2_FLASH_CACHE1_RULE4_SHIFT)) & AHB_SECURE_CTRL_APB_GRP1_MEM_RULE2_FLASH_CACHE1_RULE4_MASK)\r\n/*! @} */\r\n\r\n/*! @name APB_GRP1_MEM_RULE3 - 0x40038000--0x4003FFFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE3_GAU_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE3_GAU_RULE0_SHIFT (0U)\r\n/*! GAU_RULE0 - 0x4003 8000--0x4003 8FFF */\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE3_GAU_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP1_MEM_RULE3_GAU_RULE0_SHIFT)) & AHB_SECURE_CTRL_APB_GRP1_MEM_RULE3_GAU_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE3_RF_SYSCON_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE3_RF_SYSCON_RULE3_SHIFT (12U)\r\n/*! RF_SYSCON_RULE3 - 0x4003 B000--0x4003 BFFF */\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE3_RF_SYSCON_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP1_MEM_RULE3_RF_SYSCON_RULE3_SHIFT)) & AHB_SECURE_CTRL_APB_GRP1_MEM_RULE3_RF_SYSCON_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE3_FREEMRT_RULE7_MASK (0x30000000U)\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE3_FREEMRT_RULE7_SHIFT (28U)\r\n#define AHB_SECURE_CTRL_APB_GRP1_MEM_RULE3_FREEMRT_RULE7(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_APB_GRP1_MEM_RULE3_FREEMRT_RULE7_SHIFT)) & AHB_SECURE_CTRL_APB_GRP1_MEM_RULE3_FREEMRT_RULE7_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHB_PERIPH0_SLAVE_RULE - 0x40100000--0x4011FFFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_HSGPIO_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_HSGPIO_RULE0_SHIFT (0U)\r\n/*! HSGPIO_RULE0 - 0x40100000--0x40103FFF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_HSGPIO_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_HSGPIO_RULE0_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_HSGPIO_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_DMA0_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_DMA0_RULE1_SHIFT (4U)\r\n/*! DMA0_RULE1 - 0x40104000--0x40104FFF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_DMA0_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_DMA0_RULE1_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_DMA0_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_DMA1_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_DMA1_RULE2_SHIFT (8U)\r\n/*! DMA1_RULE2 - 0x40105000--0x40105FFF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_DMA1_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_DMA1_RULE2_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_DMA1_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_FLEXCOMM0_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_FLEXCOMM0_RULE3_SHIFT (12U)\r\n/*! FLEXCOMM0_RULE3 - 0x40106000--0x40106FFF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_FLEXCOMM0_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_FLEXCOMM0_RULE3_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_FLEXCOMM0_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_FLEXCOMM1_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_FLEXCOMM1_RULE4_SHIFT (16U)\r\n/*! FLEXCOMM1_RULE4 - 0x40107000--0x40107FFF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_FLEXCOMM1_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_FLEXCOMM1_RULE4_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_FLEXCOMM1_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_FLEXCOMM2_RULE5_MASK (0x300000U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_FLEXCOMM2_RULE5_SHIFT (20U)\r\n/*! FLEXCOMM2_RULE5 - 0x40108000--0x40108FFF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_FLEXCOMM2_RULE5(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_FLEXCOMM2_RULE5_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_FLEXCOMM2_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_FLEXCOMM3_RULE6_MASK (0x3000000U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_FLEXCOMM3_RULE6_SHIFT (24U)\r\n/*! FLEXCOMM3_RULE6 - 0x40109000--0x40109FFF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_FLEXCOMM3_RULE6(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_FLEXCOMM3_RULE6_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_FLEXCOMM3_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_DEBUG_MAILBOX_RULE7_MASK (0x30000000U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_DEBUG_MAILBOX_RULE7_SHIFT (28U)\r\n/*! DEBUG_MAILBOX_RULE7 - 0x4010F000--0x4010FFFF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_DEBUG_MAILBOX_RULE7(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_DEBUG_MAILBOX_RULE7_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH0_SLAVE_RULE_DEBUG_MAILBOX_RULE7_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHB_PERIPH1_SLAVE_RULE - 0x40120000--0x40127FFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH1_SLAVE_RULE_CRC_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH1_SLAVE_RULE_CRC_RULE0_SHIFT (0U)\r\n/*! CRC_RULE0 - 0x40120000--0x40120FFF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH1_SLAVE_RULE_CRC_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH1_SLAVE_RULE_CRC_RULE0_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH1_SLAVE_RULE_CRC_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH1_SLAVE_RULE_DMIC_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH1_SLAVE_RULE_DMIC_RULE1_SHIFT (4U)\r\n/*! DMIC_RULE1 - 0x40121000--0x40121FFF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH1_SLAVE_RULE_DMIC_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH1_SLAVE_RULE_DMIC_RULE1_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH1_SLAVE_RULE_DMIC_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH1_SLAVE_RULE_FLEXCOMM4_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH1_SLAVE_RULE_FLEXCOMM4_RULE2_SHIFT (8U)\r\n/*! FLEXCOMM4_RULE2 - 0x40122000--0x40122FFF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH1_SLAVE_RULE_FLEXCOMM4_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH1_SLAVE_RULE_FLEXCOMM4_RULE2_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH1_SLAVE_RULE_FLEXCOMM4_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH1_SLAVE_RULE_FLEXCOMM14_RULE6_MASK (0x3000000U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH1_SLAVE_RULE_FLEXCOMM14_RULE6_SHIFT (24U)\r\n/*! FLEXCOMM14_RULE6 - 0x40126000--0x40126FFF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH1_SLAVE_RULE_FLEXCOMM14_RULE6(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH1_SLAVE_RULE_FLEXCOMM14_RULE6_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH1_SLAVE_RULE_FLEXCOMM14_RULE6_MASK)\r\n/*! @} */\r\n\r\n/*! @name AIPS_BRIDGE_MEM_RULE0 - 0x4013 0000 ~0x4013 7FFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE0_OSPI_AND_OTFAD_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE0_OSPI_AND_OTFAD_RULE4_SHIFT (16U)\r\n/*! OSPI_AND_OTFAD_RULE4 - 0x4013 4000--0x4013 4FFF */\r\n#define AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE0_OSPI_AND_OTFAD_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE0_OSPI_AND_OTFAD_RULE4_SHIFT)) & AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE0_OSPI_AND_OTFAD_RULE4_MASK)\r\n/*! @} */\r\n\r\n/*! @name AIPS_BRIDGE_MEM_RULE1 - 0x4013 8000 ~0x4013 FFFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_ENET_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_ENET_SHIFT (0U)\r\n/*! ENET - 0x4013 8000--0x4013 8FFF */\r\n#define AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_ENET(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_ENET_SHIFT)) & AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_ENET_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_OSTIMER_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_OSTIMER_RULE3_SHIFT (12U)\r\n/*! OSTIMER_RULE3 - 0x4013 B000--0x4013 BFFF */\r\n#define AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_OSTIMER_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_OSTIMER_RULE3_SHIFT)) & AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_OSTIMER_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_ROM_CTRL_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_ROM_CTRL_RULE4_SHIFT (16U)\r\n/*! ROM_CTRL_RULE4 - 0x4013 C000--0x4013 CFFF */\r\n#define AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_ROM_CTRL_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_ROM_CTRL_RULE4_SHIFT)) & AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_ROM_CTRL_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_MTR_TEST_RULE6_MASK (0x3000000U)\r\n#define AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_MTR_TEST_RULE6_SHIFT (24U)\r\n/*! MTR_TEST_RULE6 - 0x4013 E000--0x4013 EFFF */\r\n#define AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_MTR_TEST_RULE6(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_MTR_TEST_RULE6_SHIFT)) & AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_MTR_TEST_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_ATX_TEST_RULE7_MASK (0x30000000U)\r\n#define AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_ATX_TEST_RULE7_SHIFT (28U)\r\n/*! ATX_TEST_RULE7 - 0x4013 F000--0x4013 FFFF */\r\n#define AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_ATX_TEST_RULE7(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_ATX_TEST_RULE7_SHIFT)) & AHB_SECURE_CTRL_AIPS_BRIDGE_MEM_RULE1_ATX_TEST_RULE7_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHB_PERIPH2_SLAVE_RULE - 0x40140000--0x4014FFFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH2_SLAVE_RULE_USBOTG_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH2_SLAVE_RULE_USBOTG_SHIFT (0U)\r\n/*! USBOTG - 0x40145000--0x40145FFF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH2_SLAVE_RULE_USBOTG(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH2_SLAVE_RULE_USBOTG_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH2_SLAVE_RULE_USBOTG_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH2_SLAVE_RULE_SCT_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH2_SLAVE_RULE_SCT_SHIFT (4U)\r\n/*! SCT - 0x40146000--0x40146FFF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH2_SLAVE_RULE_SCT(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH2_SLAVE_RULE_SCT_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH2_SLAVE_RULE_SCT_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH2_SLAVE_RULE_GDMA_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH2_SLAVE_RULE_GDMA_SHIFT (8U)\r\n/*! GDMA - 0x4014E000--0x4014EFFF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH2_SLAVE_RULE_GDMA(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH2_SLAVE_RULE_GDMA_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH2_SLAVE_RULE_GDMA_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH2_SLAVE_RULE_CDOG_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH2_SLAVE_RULE_CDOG_SHIFT (16U)\r\n/*! CDOG - 0x4014C000--0x4014C7FF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH2_SLAVE_RULE_CDOG(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH2_SLAVE_RULE_CDOG_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH2_SLAVE_RULE_CDOG_MASK)\r\n/*! @} */\r\n\r\n/*! @name SECURITY_CTRL_MEM_RULE - 0x40148000--0x4014BFFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_SECURITY_CTRL_MEM_RULE_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_SECURITY_CTRL_MEM_RULE_RULE0_SHIFT (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_SECURITY_CTRL_MEM_RULE_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SECURITY_CTRL_MEM_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_SECURITY_CTRL_MEM_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SECURITY_CTRL_MEM_RULE_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_SECURITY_CTRL_MEM_RULE_RULE1_SHIFT (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_SECURITY_CTRL_MEM_RULE_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SECURITY_CTRL_MEM_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_SECURITY_CTRL_MEM_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SECURITY_CTRL_MEM_RULE_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_SECURITY_CTRL_MEM_RULE_RULE2_SHIFT (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_SECURITY_CTRL_MEM_RULE_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SECURITY_CTRL_MEM_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_SECURITY_CTRL_MEM_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SECURITY_CTRL_MEM_RULE_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_SECURITY_CTRL_MEM_RULE_RULE3_SHIFT (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_SECURITY_CTRL_MEM_RULE_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SECURITY_CTRL_MEM_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_SECURITY_CTRL_MEM_RULE_RULE3_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHB_PERIPH3_SLAVE_RULE - the memory map is 0x40150000--0x40158FFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_PQ_COPRO_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_PQ_COPRO_RULE0_SHIFT (0U)\r\n/*! PQ_COPRO_RULE0 - 0x40150000--0x40150FFF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_PQ_COPRO_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_PQ_COPRO_RULE0_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_PQ_COPRO_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_SECURE_GPIO_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_SECURE_GPIO_RULE1_SHIFT (4U)\r\n/*! SECURE_GPIO_RULE1 - 0x40154000--0x40157FFF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_SECURE_GPIO_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_SECURE_GPIO_RULE1_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_SECURE_GPIO_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_SDIO_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_SDIO_RULE2_SHIFT (8U)\r\n/*! SDIO_RULE2 - 0x40158000--0x40158FFF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_SDIO_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_SDIO_RULE2_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_SDIO_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_HPU_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_HPU_RULE3_SHIFT (12U)\r\n/*! HPU_RULE3 - 0x40154000--0x40157FFF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_HPU_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_HPU_RULE3_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_HPU_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_PKC_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_PKC_RULE4_SHIFT (16U)\r\n/*! PKC_RULE4 - 0x40158000--0x40158FFF */\r\n#define AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_PKC_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_PKC_RULE4_SHIFT)) & AHB_SECURE_CTRL_AHB_PERIPH3_SLAVE_RULE_PKC_RULE4_MASK)\r\n/*! @} */\r\n\r\n/*! @name AON_MEM_RULE - 0x4015C000--0x4015FFFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_AON_MEM_RULE_RULE0_MASK  (0x3U)\r\n#define AHB_SECURE_CTRL_AON_MEM_RULE_RULE0_SHIFT (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_AON_MEM_RULE_RULE0(x)    (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AON_MEM_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_AON_MEM_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AON_MEM_RULE_RULE1_MASK  (0x30U)\r\n#define AHB_SECURE_CTRL_AON_MEM_RULE_RULE1_SHIFT (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_AON_MEM_RULE_RULE1(x)    (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AON_MEM_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_AON_MEM_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AON_MEM_RULE_RULE2_MASK  (0x300U)\r\n#define AHB_SECURE_CTRL_AON_MEM_RULE_RULE2_SHIFT (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_AON_MEM_RULE_RULE2(x)    (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AON_MEM_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_AON_MEM_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_AON_MEM_RULE_RULE3_MASK  (0x3000U)\r\n#define AHB_SECURE_CTRL_AON_MEM_RULE_RULE3_SHIFT (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_AON_MEM_RULE_RULE3(x)    (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_AON_MEM_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_AON_MEM_RULE_RULE3_MASK)\r\n/*! @} */\r\n\r\n/*! @name WLAN_S0_SLAVE_RULE - 0x41000000-0x4137FFFF, 3.5MB */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_WLAN_S0_SLAVE_RULE_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_WLAN_S0_SLAVE_RULE_RULE0_SHIFT (0U)\r\n/*! RULE0 - 0x41000000-0x4137FFFF, 3.5MB */\r\n#define AHB_SECURE_CTRL_WLAN_S0_SLAVE_RULE_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_WLAN_S0_SLAVE_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_WLAN_S0_SLAVE_RULE_RULE0_MASK)\r\n/*! @} */\r\n\r\n/*! @name WLAN_S1_MEM_RULE - 0x41380000-0x413FFFFF, part0..0x41380000-0x413FFFFF, part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE0_SHIFT (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE1_SHIFT (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE2_SHIFT (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE3_SHIFT (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE4_SHIFT (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE5_MASK (0x300000U)\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE5_SHIFT (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE5(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE6_MASK (0x3000000U)\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE6_SHIFT (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE6(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE7_MASK (0x30000000U)\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE7_SHIFT (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE7(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_WLAN_S1_MEM_RULE */\r\n#define AHB_SECURE_CTRL_WLAN_S1_MEM_RULE_COUNT   (4U)\r\n\r\n/*! @name BLE_S0_SLAVE_RULE - 0x44000000-0x443BFFFF */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_BLE_S0_SLAVE_RULE_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_BLE_S0_SLAVE_RULE_RULE0_SHIFT (0U)\r\n/*! RULE0 - 0x44000000-0x443BFFFF */\r\n#define AHB_SECURE_CTRL_BLE_S0_SLAVE_RULE_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_BLE_S0_SLAVE_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_BLE_S0_SLAVE_RULE_RULE0_MASK)\r\n/*! @} */\r\n\r\n/*! @name BLE_S1_MEM_RULE - 0x443C0000-0x443FFFFF part0..0x443C0000-0x443FFFFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE0_SHIFT (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE1_SHIFT (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE2_SHIFT (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE3_SHIFT (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE4_SHIFT (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE5_MASK (0x300000U)\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE5_SHIFT (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE5(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE6_MASK (0x3000000U)\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE6_SHIFT (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE6(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE7_MASK (0x30000000U)\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE7_SHIFT (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE7(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_BLE_S1_MEM_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_BLE_S1_MEM_RULE */\r\n#define AHB_SECURE_CTRL_BLE_S1_MEM_RULE_COUNT    (4U)\r\n\r\n/*! @name SOC_TOP_MEM_RULE - 0x45000000-0x4500FFFF part0..0x45000000-0x4500FFFF part3 */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE0_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE0_SHIFT (0U)\r\n/*! RULE0 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE0_SHIFT)) & AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE1_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE1_SHIFT (4U)\r\n/*! RULE1 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE1_SHIFT)) & AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE2_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE2_SHIFT (8U)\r\n/*! RULE2 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE2_SHIFT)) & AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE3_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE3_SHIFT (12U)\r\n/*! RULE3 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE3_SHIFT)) & AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE4_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE4_SHIFT (16U)\r\n/*! RULE4 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE4_SHIFT)) & AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE5_MASK (0x300000U)\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE5_SHIFT (20U)\r\n/*! RULE5 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE5(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE5_SHIFT)) & AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE6_MASK (0x3000000U)\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE6_SHIFT (24U)\r\n/*! RULE6 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE6(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE6_SHIFT)) & AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE7_MASK (0x30000000U)\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE7_SHIFT (28U)\r\n/*! RULE7 - secure control rule0. it can be set when check_reg's write_lock is '0' */\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE7(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE7_SHIFT)) & AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_RULE7_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_SOC_TOP_MEM_RULE */\r\n#define AHB_SECURE_CTRL_SOC_TOP_MEM_RULE_COUNT   (4U)\r\n\r\n/*! @name SEC_VIO_ADDR - most recent security violation address for AHB layer n */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_ADDR_SEC_VIO_ADDR_MASK (0xFFFFFFFFU)\r\n#define AHB_SECURE_CTRL_SEC_VIO_ADDR_SEC_VIO_ADDR_SHIFT (0U)\r\n/*! SEC_VIO_ADDR - security violation address for AHB layer */\r\n#define AHB_SECURE_CTRL_SEC_VIO_ADDR_SEC_VIO_ADDR(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_ADDR_SEC_VIO_ADDR_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_ADDR_SEC_VIO_ADDR_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_SEC_VIO_ADDR */\r\n#define AHB_SECURE_CTRL_SEC_VIO_ADDR_COUNT       (20U)\r\n\r\n/*! @name SEC_VIO_MISC_INFO - most recent security violation miscellaneous information for AHB layer n */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_SEC_VIO_INFO_WRITE_MASK (0x1U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_SEC_VIO_INFO_WRITE_SHIFT (0U)\r\n/*! SEC_VIO_INFO_WRITE - security violation access read/write indicator, 0: read, 1: write */\r\n#define AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_SEC_VIO_INFO_WRITE(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_SEC_VIO_INFO_WRITE_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_SEC_VIO_INFO_WRITE_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_SEC_VIO_INFO_DATA_ACCESS_MASK (0x2U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_SEC_VIO_INFO_DATA_ACCESS_SHIFT (1U)\r\n/*! SEC_VIO_INFO_DATA_ACCESS - security violation access data/code indicator, 0: code, 1 */\r\n#define AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_SEC_VIO_INFO_DATA_ACCESS(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_SEC_VIO_INFO_DATA_ACCESS_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_SEC_VIO_INFO_DATA_ACCESS_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_SEC_VIO_INFO_MASTER_SEC_LEVEL_MASK (0xF0U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_SEC_VIO_INFO_MASTER_SEC_LEVEL_SHIFT (4U)\r\n/*! SEC_VIO_INFO_MASTER_SEC_LEVEL - bit [5:4]: master sec level and privilege level bit [7:6]: anti-pol value for master sec level and privilege level */\r\n#define AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_SEC_VIO_INFO_MASTER_SEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_SEC_VIO_INFO_MASTER_SEC_LEVEL_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_SEC_VIO_INFO_MASTER_SEC_LEVEL_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_SEC_VIO_INFO_MASTER_MASK (0xF00U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_SEC_VIO_INFO_MASTER_SHIFT (8U)\r\n/*! SEC_VIO_INFO_MASTER - security violation master number */\r\n#define AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_SEC_VIO_INFO_MASTER(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_SEC_VIO_INFO_MASTER_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_SEC_VIO_INFO_MASTER_MASK)\r\n/*! @} */\r\n\r\n/* The count of AHB_SECURE_CTRL_SEC_VIO_MISC_INFO */\r\n#define AHB_SECURE_CTRL_SEC_VIO_MISC_INFO_COUNT  (20U)\r\n\r\n/*! @name SEC_VIO_INFO_VALID - security violation address/information registers valid flags */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID0_MASK (0x1U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID0_SHIFT (0U)\r\n/*! VIO_INFO_VALID0 - violation information valid flag for AHB layer 0. 0: not valid. 1: valid (violation occurred). Write 1 to clear. */\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID0_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID1_MASK (0x2U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID1_SHIFT (1U)\r\n/*! VIO_INFO_VALID1 - violation information valid flag for AHB layer 1. 0: not valid. 1: valid (violation occurred). Write 1 to clear. */\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID1_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID2_MASK (0x4U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID2_SHIFT (2U)\r\n/*! VIO_INFO_VALID2 - violation information valid flag for AHB layer 2. 0: not valid. 1: valid (violation occurred). Write 1 to clear. */\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID2(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID2_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID2_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID3_MASK (0x8U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID3_SHIFT (3U)\r\n/*! VIO_INFO_VALID3 - violation information valid flag for AHB layer 3. 0: not valid. 1: valid (violation occurred). Write 1 to clear. */\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID3(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID3_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID3_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID4_MASK (0x10U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID4_SHIFT (4U)\r\n/*! VIO_INFO_VALID4 - violation information valid flag for AHB layer 4. 0: not valid. 1: valid (violation occurred). Write 1 to clear. */\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID4(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID4_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID4_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID5_MASK (0x20U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID5_SHIFT (5U)\r\n/*! VIO_INFO_VALID5 - violation information valid flag for AHB layer 5. 0: not valid. 1: valid (violation occurred). Write 1 to clear. */\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID5(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID5_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID5_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID6_MASK (0x40U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID6_SHIFT (6U)\r\n/*! VIO_INFO_VALID6 - violation information valid flag for AHB layer 6. 0: not valid. 1: valid (violation occurred). Write 1 to clear. */\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID6(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID6_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID6_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID7_MASK (0x80U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID7_SHIFT (7U)\r\n/*! VIO_INFO_VALID7 - violation information valid flag for AHB layer 7. 0: not valid. 1: valid (violation occurred). Write 1 to clear. */\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID7(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID7_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID7_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID8_MASK (0x100U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID8_SHIFT (8U)\r\n/*! VIO_INFO_VALID8 - violation information valid flag for AHB layer 8. 0: not valid. 1: valid (violation occurred). Write 1 to clear. */\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID8(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID8_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID8_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID9_MASK (0x200U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID9_SHIFT (9U)\r\n/*! VIO_INFO_VALID9 - violation information valid flag for AHB layer 9. 0: not valid. 1: valid (violation occurred). Write 1 to clear. */\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID9(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID9_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID9_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID10_MASK (0x400U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID10_SHIFT (10U)\r\n/*! VIO_INFO_VALID10 - violation information valid flag for AHB layer 10. 0: not valid. 1: valid (violation occurred). Write 1 to clear. */\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID10(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID10_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID10_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID11_MASK (0x800U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID11_SHIFT (11U)\r\n/*! VIO_INFO_VALID11 - violation information valid flag for AHB layer 11. 0: not valid. 1: valid (violation occurred). Write 1 to clear. */\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID11(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID11_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID11_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID12_MASK (0x1000U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID12_SHIFT (12U)\r\n/*! VIO_INFO_VALID12 - violation information valid flag for AHB layer 12. 0: not valid. 1: valid (violation occurred). Write 1 to clear. */\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID12(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID12_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID12_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID13_MASK (0x2000U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID13_SHIFT (13U)\r\n/*! VIO_INFO_VALID13 - violation information valid flag for AHB layer 13. 0: not valid. 1: valid (violation occurred). Write 1 to clear. */\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID13(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID13_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID13_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID14_MASK (0x4000U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID14_SHIFT (14U)\r\n/*! VIO_INFO_VALID14 - violation information valid flag for AHB layer 14. 0: not valid. 1: valid (violation occurred). Write 1 to clear. */\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID14(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID14_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID14_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID15_MASK (0x8000U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID15_SHIFT (15U)\r\n/*! VIO_INFO_VALID15 - violation information valid flag for AHB layer 15. 0: not valid. 1: valid (violation occurred). Write 1 to clear. */\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID15(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID15_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID15_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID16_MASK (0x10000U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID16_SHIFT (16U)\r\n/*! VIO_INFO_VALID16 - violation information valid flag for AHB layer 16. 0: not valid. 1: valid (violation occurred). Write 1 to clear. */\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID16(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID16_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID16_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID17_MASK (0x20000U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID17_SHIFT (17U)\r\n/*! VIO_INFO_VALID17 - violation information valid flag for AHB layer 17. 0: not valid. 1: valid (violation occurred). Write 1 to clear. */\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID17(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID17_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID17_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID18_MASK (0x40000U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID18_SHIFT (18U)\r\n/*! VIO_INFO_VALID18 - violation information valid flag for AHB layer 18. 0: not valid. 1: valid (violation occurred). Write 1 to clear. */\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID18(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID18_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID18_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID19_MASK (0x80000U)\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID19_SHIFT (19U)\r\n/*! VIO_INFO_VALID19 - violation information valid flag for AHB layer 19. 0: not valid. 1: valid (violation occurred). Write 1 to clear. */\r\n#define AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID19(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID19_SHIFT)) & AHB_SECURE_CTRL_SEC_VIO_INFO_VALID_VIO_INFO_VALID19_MASK)\r\n/*! @} */\r\n\r\n/*! @name SEC_GPIO_MASK0 - Secure GPIO mask for port 0 pins. This register is used to block leakage of Secure interface (GPIOs, I2C, UART configured as secure peripherals) pin states to non-secure world. */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN0_SEC_MASK_MASK (0x1U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN0_SEC_MASK_SHIFT (0U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN0_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN0_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN0_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN1_SEC_MASK_MASK (0x2U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN1_SEC_MASK_SHIFT (1U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN1_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN1_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN1_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN2_SEC_MASK_MASK (0x4U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN2_SEC_MASK_SHIFT (2U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN2_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN2_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN2_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN3_SEC_MASK_MASK (0x8U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN3_SEC_MASK_SHIFT (3U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN3_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN3_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN3_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN4_SEC_MASK_MASK (0x10U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN4_SEC_MASK_SHIFT (4U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN4_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN4_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN4_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN5_SEC_MASK_MASK (0x20U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN5_SEC_MASK_SHIFT (5U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN5_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN5_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN5_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN6_SEC_MASK_MASK (0x40U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN6_SEC_MASK_SHIFT (6U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN6_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN6_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN6_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN7_SEC_MASK_MASK (0x80U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN7_SEC_MASK_SHIFT (7U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN7_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN7_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN7_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN8_SEC_MASK_MASK (0x100U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN8_SEC_MASK_SHIFT (8U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN8_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN8_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN8_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN9_SEC_MASK_MASK (0x200U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN9_SEC_MASK_SHIFT (9U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN9_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN9_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN9_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN10_SEC_MASK_MASK (0x400U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN10_SEC_MASK_SHIFT (10U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN10_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN10_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN10_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN11_SEC_MASK_MASK (0x800U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN11_SEC_MASK_SHIFT (11U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN11_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN11_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN11_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN12_SEC_MASK_MASK (0x1000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN12_SEC_MASK_SHIFT (12U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN12_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN12_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN12_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN13_SEC_MASK_MASK (0x2000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN13_SEC_MASK_SHIFT (13U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN13_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN13_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN13_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN14_SEC_MASK_MASK (0x4000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN14_SEC_MASK_SHIFT (14U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN14_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN14_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN14_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN15_SEC_MASK_MASK (0x8000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN15_SEC_MASK_SHIFT (15U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN15_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN15_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN15_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN16_SEC_MASK_MASK (0x10000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN16_SEC_MASK_SHIFT (16U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN16_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN16_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN16_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN17_SEC_MASK_MASK (0x20000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN17_SEC_MASK_SHIFT (17U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN17_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN17_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN17_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN18_SEC_MASK_MASK (0x40000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN18_SEC_MASK_SHIFT (18U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN18_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN18_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN18_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN19_SEC_MASK_MASK (0x80000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN19_SEC_MASK_SHIFT (19U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN19_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN19_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN19_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN20_SEC_MASK_MASK (0x100000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN20_SEC_MASK_SHIFT (20U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN20_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN20_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN20_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN21_SEC_MASK_MASK (0x200000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN21_SEC_MASK_SHIFT (21U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN21_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN21_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN21_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN22_SEC_MASK_MASK (0x400000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN22_SEC_MASK_SHIFT (22U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN22_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN22_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN22_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN23_SEC_MASK_MASK (0x800000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN23_SEC_MASK_SHIFT (23U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN23_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN23_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN23_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN24_SEC_MASK_MASK (0x1000000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN24_SEC_MASK_SHIFT (24U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN24_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN24_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN24_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN25_SEC_MASK_MASK (0x2000000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN25_SEC_MASK_SHIFT (25U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN25_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN25_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN25_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN26_SEC_MASK_MASK (0x4000000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN26_SEC_MASK_SHIFT (26U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN26_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN26_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN26_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN27_SEC_MASK_MASK (0x8000000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN27_SEC_MASK_SHIFT (27U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN27_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN27_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN27_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN28_SEC_MASK_MASK (0x10000000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN28_SEC_MASK_SHIFT (28U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN28_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN28_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN28_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN29_SEC_MASK_MASK (0x20000000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN29_SEC_MASK_SHIFT (29U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN29_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN29_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN29_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN30_SEC_MASK_MASK (0x40000000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN30_SEC_MASK_SHIFT (30U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN30_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN30_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN30_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN31_SEC_MASK_MASK (0x80000000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN31_SEC_MASK_SHIFT (31U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN31_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN31_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK0_PIO0_PIN31_SEC_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name SEC_GPIO_MASK1 - Secure GPIO mask for port 1 pins. */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN0_SEC_MASK_MASK (0x1U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN0_SEC_MASK_SHIFT (0U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN0_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN0_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN0_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN1_SEC_MASK_MASK (0x2U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN1_SEC_MASK_SHIFT (1U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN1_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN1_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN1_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN2_SEC_MASK_MASK (0x4U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN2_SEC_MASK_SHIFT (2U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN2_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN2_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN2_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN3_SEC_MASK_MASK (0x8U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN3_SEC_MASK_SHIFT (3U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN3_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN3_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN3_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN4_SEC_MASK_MASK (0x10U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN4_SEC_MASK_SHIFT (4U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN4_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN4_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN4_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN5_SEC_MASK_MASK (0x20U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN5_SEC_MASK_SHIFT (5U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN5_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN5_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN5_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN6_SEC_MASK_MASK (0x40U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN6_SEC_MASK_SHIFT (6U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN6_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN6_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN6_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN7_SEC_MASK_MASK (0x80U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN7_SEC_MASK_SHIFT (7U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN7_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN7_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN7_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN8_SEC_MASK_MASK (0x100U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN8_SEC_MASK_SHIFT (8U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN8_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN8_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN8_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN9_SEC_MASK_MASK (0x200U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN9_SEC_MASK_SHIFT (9U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN9_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN9_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN9_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN10_SEC_MASK_MASK (0x400U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN10_SEC_MASK_SHIFT (10U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN10_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN10_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN10_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN11_SEC_MASK_MASK (0x800U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN11_SEC_MASK_SHIFT (11U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN11_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN11_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN11_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN12_SEC_MASK_MASK (0x1000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN12_SEC_MASK_SHIFT (12U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN12_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN12_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN12_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN13_SEC_MASK_MASK (0x2000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN13_SEC_MASK_SHIFT (13U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN13_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN13_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN13_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN14_SEC_MASK_MASK (0x4000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN14_SEC_MASK_SHIFT (14U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN14_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN14_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN14_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN15_SEC_MASK_MASK (0x8000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN15_SEC_MASK_SHIFT (15U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN15_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN15_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN15_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN16_SEC_MASK_MASK (0x10000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN16_SEC_MASK_SHIFT (16U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN16_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN16_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN16_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN17_SEC_MASK_MASK (0x20000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN17_SEC_MASK_SHIFT (17U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN17_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN17_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN17_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN18_SEC_MASK_MASK (0x40000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN18_SEC_MASK_SHIFT (18U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN18_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN18_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN18_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN19_SEC_MASK_MASK (0x80000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN19_SEC_MASK_SHIFT (19U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN19_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN19_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN19_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN20_SEC_MASK_MASK (0x100000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN20_SEC_MASK_SHIFT (20U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN20_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN20_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN20_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN21_SEC_MASK_MASK (0x200000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN21_SEC_MASK_SHIFT (21U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN21_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN21_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN21_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN22_SEC_MASK_MASK (0x400000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN22_SEC_MASK_SHIFT (22U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN22_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN22_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN22_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN23_SEC_MASK_MASK (0x800000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN23_SEC_MASK_SHIFT (23U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN23_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN23_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN23_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN24_SEC_MASK_MASK (0x1000000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN24_SEC_MASK_SHIFT (24U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN24_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN24_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN24_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN25_SEC_MASK_MASK (0x2000000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN25_SEC_MASK_SHIFT (25U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN25_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN25_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN25_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN26_SEC_MASK_MASK (0x4000000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN26_SEC_MASK_SHIFT (26U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN26_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN26_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN26_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN27_SEC_MASK_MASK (0x8000000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN27_SEC_MASK_SHIFT (27U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN27_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN27_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN27_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN28_SEC_MASK_MASK (0x10000000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN28_SEC_MASK_SHIFT (28U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN28_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN28_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN28_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN29_SEC_MASK_MASK (0x20000000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN29_SEC_MASK_SHIFT (29U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN29_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN29_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN29_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN30_SEC_MASK_MASK (0x40000000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN30_SEC_MASK_SHIFT (30U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN30_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN30_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN30_SEC_MASK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN31_SEC_MASK_MASK (0x80000000U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN31_SEC_MASK_SHIFT (31U)\r\n#define AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN31_SEC_MASK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN31_SEC_MASK_SHIFT)) & AHB_SECURE_CTRL_SEC_GPIO_MASK1_PIO1_PIN31_SEC_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name SEC_MASK_LOCK - sec_gp_reg write-lock bits */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_SEC_MASK_LOCK_SEC_GP_REG0_LOCK_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_SEC_MASK_LOCK_SEC_GP_REG0_LOCK_SHIFT (0U)\r\n/*! SEC_GP_REG0_LOCK - 2'b10: sec_reg_reg0 can be written. All other values: sec_reg_reg0 can't be written. */\r\n#define AHB_SECURE_CTRL_SEC_MASK_LOCK_SEC_GP_REG0_LOCK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_MASK_LOCK_SEC_GP_REG0_LOCK_SHIFT)) & AHB_SECURE_CTRL_SEC_MASK_LOCK_SEC_GP_REG0_LOCK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_SEC_MASK_LOCK_SEC_GP_REG1_LOCK_MASK (0xCU)\r\n#define AHB_SECURE_CTRL_SEC_MASK_LOCK_SEC_GP_REG1_LOCK_SHIFT (2U)\r\n/*! SEC_GP_REG1_LOCK - 2'b10: sec_reg_reg1 can be written. All other values: sec_reg_reg1 can't be written. */\r\n#define AHB_SECURE_CTRL_SEC_MASK_LOCK_SEC_GP_REG1_LOCK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_SEC_MASK_LOCK_SEC_GP_REG1_LOCK_SHIFT)) & AHB_SECURE_CTRL_SEC_MASK_LOCK_SEC_GP_REG1_LOCK_MASK)\r\n/*! @} */\r\n\r\n/*! @name MASTER_SEC_LEVEL - master secure level register */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_POWERQUAD_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_POWERQUAD_SHIFT (4U)\r\n/*! POWERQUAD - master secure level control. */\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_POWERQUAD(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MASTER_SEC_LEVEL_POWERQUAD_SHIFT)) & AHB_SECURE_CTRL_MASTER_SEC_LEVEL_POWERQUAD_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_DMA0_MASK (0xC0U)\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_DMA0_SHIFT (6U)\r\n/*! DMA0 - master secure level control. */\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_DMA0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MASTER_SEC_LEVEL_DMA0_SHIFT)) & AHB_SECURE_CTRL_MASTER_SEC_LEVEL_DMA0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_DMA1_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_DMA1_SHIFT (8U)\r\n/*! DMA1 - master secure level control. */\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_DMA1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MASTER_SEC_LEVEL_DMA1_SHIFT)) & AHB_SECURE_CTRL_MASTER_SEC_LEVEL_DMA1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ELS_MASK (0xC00U)\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ELS_SHIFT (10U)\r\n/*! ELS - master secure level control. */\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ELS(x)  (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ELS_SHIFT)) & AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ELS_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_USB_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_USB_SHIFT (12U)\r\n/*! USB - master secure level control. */\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_USB(x)  (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MASTER_SEC_LEVEL_USB_SHIFT)) & AHB_SECURE_CTRL_MASTER_SEC_LEVEL_USB_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_PKC_MASK (0xC000U)\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_PKC_SHIFT (14U)\r\n/*! PKC - master secure level control. */\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_PKC(x)  (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MASTER_SEC_LEVEL_PKC_SHIFT)) & AHB_SECURE_CTRL_MASTER_SEC_LEVEL_PKC_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_SDIO_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_SDIO_SHIFT (16U)\r\n/*! SDIO - master secure level control. */\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_SDIO(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MASTER_SEC_LEVEL_SDIO_SHIFT)) & AHB_SECURE_CTRL_MASTER_SEC_LEVEL_SDIO_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ENET_MASK (0xC0000U)\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ENET_SHIFT (18U)\r\n/*! ENET - master secure level control. */\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ENET(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ENET_SHIFT)) & AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ENET_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_GDMA_MASK (0x300000U)\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_GDMA_SHIFT (20U)\r\n/*! GDMA - master secure level control. */\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_GDMA(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MASTER_SEC_LEVEL_GDMA_SHIFT)) & AHB_SECURE_CTRL_MASTER_SEC_LEVEL_GDMA_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_MASTER_SEC_LEVEL_LOCK_MASK (0xC0000000U)\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_MASTER_SEC_LEVEL_LOCK_SHIFT (30U)\r\n/*! MASTER_SEC_LEVEL_LOCK - master_sec_reg write-lock. When 2'b10, this register can be written.\r\n *    With any other value, this register can't be written.\r\n */\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_MASTER_SEC_LEVEL_LOCK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MASTER_SEC_LEVEL_MASTER_SEC_LEVEL_LOCK_SHIFT)) & AHB_SECURE_CTRL_MASTER_SEC_LEVEL_MASTER_SEC_LEVEL_LOCK_MASK)\r\n/*! @} */\r\n\r\n/*! @name MASTER_SEC_LEVEL_ANTI_POL - master secure level anti-pole register */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_POWERQUAD_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_POWERQUAD_SHIFT (4U)\r\n/*! POWERQUAD - master secure level control anti-pole value (i.e It must be written with the\r\n *    inverted value of the corresponding field in master_sec_reg).\r\n */\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_POWERQUAD(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_POWERQUAD_SHIFT)) & AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_POWERQUAD_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_DMA0_MASK (0xC0U)\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_DMA0_SHIFT (6U)\r\n/*! DMA0 - master secure level control anti-pole value (i.e It must be written with the inverted\r\n *    value of the corresponding field in master_sec_reg).\r\n */\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_DMA0(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_DMA0_SHIFT)) & AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_DMA0_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_DMA1_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_DMA1_SHIFT (8U)\r\n/*! DMA1 - master secure level control anti-pole value (i.e It must be written with the inverted\r\n *    value of the corresponding field in master_sec_reg).\r\n */\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_DMA1(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_DMA1_SHIFT)) & AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_DMA1_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_ELS_MASK (0xC00U)\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_ELS_SHIFT (10U)\r\n/*! ELS - master secure level control anti-pole value (i.e It must be written with the inverted\r\n *    value of the corresponding field in master_sec_reg).\r\n */\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_ELS(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_ELS_SHIFT)) & AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_ELS_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_USB_MASK (0x3000U)\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_USB_SHIFT (12U)\r\n/*! USB - master secure level control anti-pole value (i.e It must be written with the inverted\r\n *    value of the corresponding field in master_sec_reg).\r\n */\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_USB(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_USB_SHIFT)) & AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_USB_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_PKC_MASK (0xC000U)\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_PKC_SHIFT (14U)\r\n/*! PKC - master secure level control anti-pole value (i.e It must be written with the inverted\r\n *    value of the corresponding field in master_sec_reg).\r\n */\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_PKC(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_PKC_SHIFT)) & AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_PKC_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_SDIO_MASK (0x30000U)\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_SDIO_SHIFT (16U)\r\n/*! SDIO - master secure level control anti-pole value (i.e It must be written with the inverted\r\n *    value of the corresponding field in master_sec_reg).\r\n */\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_SDIO(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_SDIO_SHIFT)) & AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_SDIO_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_ENET_MASK (0xC0000U)\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_ENET_SHIFT (18U)\r\n/*! ENET - master secure level control anti-pole value (i.e It must be written with the inverted\r\n *    value of the corresponding field in master_sec_reg).\r\n */\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_ENET(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_ENET_SHIFT)) & AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_ENET_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_GDMA_MASK (0x300000U)\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_GDMA_SHIFT (20U)\r\n/*! GDMA - master secure level control anti-pole value (i.e It must be written with the inverted\r\n *    value of the corresponding field in master_sec_reg).\r\n */\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_GDMA(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_GDMA_SHIFT)) & AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_GDMA_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_MASTER_SEC_LEVEL_ANTIPOL_LOCK_MASK (0xC0000000U)\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_MASTER_SEC_LEVEL_ANTIPOL_LOCK_SHIFT (30U)\r\n/*! MASTER_SEC_LEVEL_ANTIPOL_LOCK - master_sec_antipol_reg register write-lock. When 2'b10, this\r\n *    register can be written. With any other value, this register can't be written.\r\n */\r\n#define AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_MASTER_SEC_LEVEL_ANTIPOL_LOCK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_MASTER_SEC_LEVEL_ANTIPOL_LOCK_SHIFT)) & AHB_SECURE_CTRL_MASTER_SEC_LEVEL_ANTI_POL_MASTER_SEC_LEVEL_ANTIPOL_LOCK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CM33_LOCK_REG - m33 lock control register */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_NS_VTOR_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_NS_VTOR_SHIFT (0U)\r\n/*! LOCK_NS_VTOR - 2'b10: m33 LOCKNSVTOR is 0. All other values: m33 LOCKNSVTOR is 1 */\r\n#define AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_NS_VTOR(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_NS_VTOR_SHIFT)) & AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_NS_VTOR_MASK)\r\n\r\n#define AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_NS_MPU_MASK (0xCU)\r\n#define AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_NS_MPU_SHIFT (2U)\r\n/*! LOCK_NS_MPU - 2'b10:m33 LOCKNSMPU is 0. All other values: m33 LOCKNSMPU is 1 */\r\n#define AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_NS_MPU(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_NS_MPU_SHIFT)) & AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_NS_MPU_MASK)\r\n\r\n#define AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_S_VTAIRCR_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_S_VTAIRCR_SHIFT (4U)\r\n/*! LOCK_S_VTAIRCR - 2'b10:m33 LOCKSVTAURCR is 0. All other values: m33 LOCKSVTAURCR is 1 */\r\n#define AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_S_VTAIRCR(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_S_VTAIRCR_SHIFT)) & AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_S_VTAIRCR_MASK)\r\n\r\n#define AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_S_MPU_MASK (0xC0U)\r\n#define AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_S_MPU_SHIFT (6U)\r\n/*! LOCK_S_MPU - 2'b10:m33 LOCKSMPU is 0. All other values: m33 LOCKSMPU is 1 */\r\n#define AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_S_MPU(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_S_MPU_SHIFT)) & AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_S_MPU_MASK)\r\n\r\n#define AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_SAU_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_SAU_SHIFT (8U)\r\n/*! LOCK_SAU - 2'b10:m33 LOCKSAU is 0. All other values: m33 LOCKSAU is 1 */\r\n#define AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_SAU(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_SAU_SHIFT)) & AHB_SECURE_CTRL_CM33_LOCK_REG_LOCK_SAU_MASK)\r\n\r\n#define AHB_SECURE_CTRL_CM33_LOCK_REG_M33_LOCK_REG_LOCK_MASK (0xC0000000U)\r\n#define AHB_SECURE_CTRL_CM33_LOCK_REG_M33_LOCK_REG_LOCK_SHIFT (30U)\r\n/*! M33_LOCK_REG_LOCK - 2'b10: this register can be written. All other values: this register can't be written */\r\n#define AHB_SECURE_CTRL_CM33_LOCK_REG_M33_LOCK_REG_LOCK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_CM33_LOCK_REG_M33_LOCK_REG_LOCK_SHIFT)) & AHB_SECURE_CTRL_CM33_LOCK_REG_M33_LOCK_REG_LOCK_MASK)\r\n/*! @} */\r\n\r\n/*! @name MISC_CTRL_DP_REG - secure control duplicate register */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_WRITE_LOCK_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_WRITE_LOCK_SHIFT (0U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_WRITE_LOCK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MISC_CTRL_DP_REG_WRITE_LOCK_SHIFT)) & AHB_SECURE_CTRL_MISC_CTRL_DP_REG_WRITE_LOCK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_ENABLE_SECURE_CHECKING_MASK (0xCU)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_ENABLE_SECURE_CHECKING_SHIFT (2U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_ENABLE_SECURE_CHECKING(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MISC_CTRL_DP_REG_ENABLE_SECURE_CHECKING_SHIFT)) & AHB_SECURE_CTRL_MISC_CTRL_DP_REG_ENABLE_SECURE_CHECKING_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_ENABLE_S_PRIV_CHECK_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_ENABLE_S_PRIV_CHECK_SHIFT (4U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_ENABLE_S_PRIV_CHECK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MISC_CTRL_DP_REG_ENABLE_S_PRIV_CHECK_SHIFT)) & AHB_SECURE_CTRL_MISC_CTRL_DP_REG_ENABLE_S_PRIV_CHECK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_ENABLE_NS_PRIV_CHECK_MASK (0xC0U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_ENABLE_NS_PRIV_CHECK_SHIFT (6U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_ENABLE_NS_PRIV_CHECK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MISC_CTRL_DP_REG_ENABLE_NS_PRIV_CHECK_SHIFT)) & AHB_SECURE_CTRL_MISC_CTRL_DP_REG_ENABLE_NS_PRIV_CHECK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_DISABLE_VIOLATION_ABORT_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_DISABLE_VIOLATION_ABORT_SHIFT (8U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_DISABLE_VIOLATION_ABORT(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MISC_CTRL_DP_REG_DISABLE_VIOLATION_ABORT_SHIFT)) & AHB_SECURE_CTRL_MISC_CTRL_DP_REG_DISABLE_VIOLATION_ABORT_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_DISABLE_STRICT_MODE_MASK (0xC00U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_DISABLE_STRICT_MODE_SHIFT (10U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_DISABLE_STRICT_MODE(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MISC_CTRL_DP_REG_DISABLE_STRICT_MODE_SHIFT)) & AHB_SECURE_CTRL_MISC_CTRL_DP_REG_DISABLE_STRICT_MODE_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_IDAU_ALL_NS_MASK (0xC000U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_IDAU_ALL_NS_SHIFT (14U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_DP_REG_IDAU_ALL_NS(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MISC_CTRL_DP_REG_IDAU_ALL_NS_SHIFT)) & AHB_SECURE_CTRL_MISC_CTRL_DP_REG_IDAU_ALL_NS_MASK)\r\n/*! @} */\r\n\r\n/*! @name MISC_CTRL_REG - secure control register */\r\n/*! @{ */\r\n\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_WRITE_LOCK_MASK (0x3U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_WRITE_LOCK_SHIFT (0U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_WRITE_LOCK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MISC_CTRL_REG_WRITE_LOCK_SHIFT)) & AHB_SECURE_CTRL_MISC_CTRL_REG_WRITE_LOCK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_ENABLE_SECURE_CHECKING_MASK (0xCU)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_ENABLE_SECURE_CHECKING_SHIFT (2U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_ENABLE_SECURE_CHECKING(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MISC_CTRL_REG_ENABLE_SECURE_CHECKING_SHIFT)) & AHB_SECURE_CTRL_MISC_CTRL_REG_ENABLE_SECURE_CHECKING_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_ENABLE_S_PRIV_CHECK_MASK (0x30U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_ENABLE_S_PRIV_CHECK_SHIFT (4U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_ENABLE_S_PRIV_CHECK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MISC_CTRL_REG_ENABLE_S_PRIV_CHECK_SHIFT)) & AHB_SECURE_CTRL_MISC_CTRL_REG_ENABLE_S_PRIV_CHECK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_ENABLE_NS_PRIV_CHECK_MASK (0xC0U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_ENABLE_NS_PRIV_CHECK_SHIFT (6U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_ENABLE_NS_PRIV_CHECK(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MISC_CTRL_REG_ENABLE_NS_PRIV_CHECK_SHIFT)) & AHB_SECURE_CTRL_MISC_CTRL_REG_ENABLE_NS_PRIV_CHECK_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_DISABLE_VIOLATION_ABORT_MASK (0x300U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_DISABLE_VIOLATION_ABORT_SHIFT (8U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_DISABLE_VIOLATION_ABORT(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MISC_CTRL_REG_DISABLE_VIOLATION_ABORT_SHIFT)) & AHB_SECURE_CTRL_MISC_CTRL_REG_DISABLE_VIOLATION_ABORT_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_DISABLE_STRICT_MODE_MASK (0xC00U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_DISABLE_STRICT_MODE_SHIFT (10U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_DISABLE_STRICT_MODE(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MISC_CTRL_REG_DISABLE_STRICT_MODE_SHIFT)) & AHB_SECURE_CTRL_MISC_CTRL_REG_DISABLE_STRICT_MODE_MASK)\r\n\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_IDAU_ALL_NS_MASK (0xC000U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_IDAU_ALL_NS_SHIFT (14U)\r\n#define AHB_SECURE_CTRL_MISC_CTRL_REG_IDAU_ALL_NS(x) (((uint32_t)(((uint32_t)(x)) << AHB_SECURE_CTRL_MISC_CTRL_REG_IDAU_ALL_NS_SHIFT)) & AHB_SECURE_CTRL_MISC_CTRL_REG_IDAU_ALL_NS_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group AHB_SECURE_CTRL_Register_Masks */\r\n\r\n\r\n/* AHB_SECURE_CTRL - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral AHB_SECURE_CTRL base address */\r\n  #define AHB_SECURE_CTRL_BASE                     (0x50148000u)\r\n  /** Peripheral AHB_SECURE_CTRL base address */\r\n  #define AHB_SECURE_CTRL_BASE_NS                  (0x40148000u)\r\n  /** Peripheral AHB_SECURE_CTRL base pointer */\r\n  #define AHB_SECURE_CTRL                          ((AHB_SECURE_CTRL_Type *)AHB_SECURE_CTRL_BASE)\r\n  /** Peripheral AHB_SECURE_CTRL base pointer */\r\n  #define AHB_SECURE_CTRL_NS                       ((AHB_SECURE_CTRL_Type *)AHB_SECURE_CTRL_BASE_NS)\r\n  /** Array initializer of AHB_SECURE_CTRL peripheral base addresses */\r\n  #define AHB_SECURE_CTRL_BASE_ADDRS               { AHB_SECURE_CTRL_BASE }\r\n  /** Array initializer of AHB_SECURE_CTRL peripheral base pointers */\r\n  #define AHB_SECURE_CTRL_BASE_PTRS                { AHB_SECURE_CTRL }\r\n  /** Array initializer of AHB_SECURE_CTRL peripheral base addresses */\r\n  #define AHB_SECURE_CTRL_BASE_ADDRS_NS            { AHB_SECURE_CTRL_BASE_NS }\r\n  /** Array initializer of AHB_SECURE_CTRL peripheral base pointers */\r\n  #define AHB_SECURE_CTRL_BASE_PTRS_NS             { AHB_SECURE_CTRL_NS }\r\n#else\r\n  /** Peripheral AHB_SECURE_CTRL base address */\r\n  #define AHB_SECURE_CTRL_BASE                     (0x40148000u)\r\n  /** Peripheral AHB_SECURE_CTRL base pointer */\r\n  #define AHB_SECURE_CTRL                          ((AHB_SECURE_CTRL_Type *)AHB_SECURE_CTRL_BASE)\r\n  /** Array initializer of AHB_SECURE_CTRL peripheral base addresses */\r\n  #define AHB_SECURE_CTRL_BASE_ADDRS               { AHB_SECURE_CTRL_BASE }\r\n  /** Array initializer of AHB_SECURE_CTRL peripheral base pointers */\r\n  #define AHB_SECURE_CTRL_BASE_PTRS                { AHB_SECURE_CTRL }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group AHB_SECURE_CTRL_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- AON_SOC_CIU Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup AON_SOC_CIU_Peripheral_Access_Layer AON_SOC_CIU Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** AON_SOC_CIU - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t PAD_CONFIG0;                       /**< \", offset: 0x0 */\r\n       uint8_t RESERVED_0[12];\r\n  __IO uint32_t PAD_PWRDOWN_CTRL2;                 /**< Pad Power-down Control 2, offset: 0x10 */\r\n       uint8_t RESERVED_1[60];\r\n  __IO uint32_t SR_CONFIG1;                        /**< GPIO Slew Rate control, offset: 0x50 */\r\n       uint8_t RESERVED_2[32];\r\n  __IO uint32_t PAD_PU_PD_EN1;                     /**< Pad Pull-up Pull-down Enable2, offset: 0x74 */\r\n       uint8_t RESERVED_3[20];\r\n  __IO uint32_t PAD_SLP_EN0;                       /**< Pad Sleep Mode Enable, offset: 0x8C */\r\n       uint8_t RESERVED_4[8];\r\n  __IO uint32_t PAD_SLP_VAL0;                      /**< Pad Sleep Mode Value, offset: 0x98 */\r\n       uint8_t RESERVED_5[112];\r\n  __IO uint32_t RST_SW;                            /**< Reset Controls for SOC_RESET_GEN, offset: 0x10C */\r\n       uint8_t RESERVED_6[32];\r\n  __I  uint32_t STRAP_FINISH_STATUS;               /**< SOC Strap Finish Status, offset: 0x130 */\r\n       uint8_t RESERVED_7[8];\r\n  __IO uint32_t SOC_OTP_CONTROL;                   /**< Power Switch (1.8v) Control for SOC OTP, offset: 0x13C */\r\n       uint8_t RESERVED_8[196];\r\n  __IO uint32_t PAD_AON_VREG_VSENSOR_CTRL;         /**< AON Vsensor and Vreg Pad Control, offset: 0x204 */\r\n       uint8_t RESERVED_9[632];\r\n  __I  uint32_t STRAP_RDBK;                        /**< Strap Readback, offset: 0x480 */\r\n  __IO uint32_t STRAP_SW;                          /**< Software Strap Override, offset: 0x484 */\r\n       uint8_t RESERVED_10[120];\r\n  __IO uint32_t PAD_SLP_PU_PD_DIS0;                /**< Pad Sleep Pullup and Pulldown Disable1, offset: 0x500 */\r\n       uint8_t RESERVED_11[52];\r\n  __IO uint32_t MCI_IOMUX_EN0;                     /**< mci_iomux_enable control for GPIO[27:22], offset: 0x538 */\r\n} AON_SOC_CIU_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- AON_SOC_CIU Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup AON_SOC_CIU_Register_Masks AON_SOC_CIU Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name PAD_CONFIG0 - \" */\r\n/*! @{ */\r\n\r\n#define AON_SOC_CIU_PAD_CONFIG0_PAD_PWRDOWN_LATCH_MASK (0x2U)\r\n#define AON_SOC_CIU_PAD_CONFIG0_PAD_PWRDOWN_LATCH_SHIFT (1U)\r\n/*! PAD_PWRDOWN_LATCH - Enables the pd_sel latching */\r\n#define AON_SOC_CIU_PAD_CONFIG0_PAD_PWRDOWN_LATCH(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_CONFIG0_PAD_PWRDOWN_LATCH_SHIFT)) & AON_SOC_CIU_PAD_CONFIG0_PAD_PWRDOWN_LATCH_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_CONFIG0_XOSC_OD_EN_MASK  (0x20000U)\r\n#define AON_SOC_CIU_PAD_CONFIG0_XOSC_OD_EN_SHIFT (17U)\r\n/*! XOSC_OD_EN - Crystal Oscillator Enable Output Open-Drain Enable for GPIO[0] */\r\n#define AON_SOC_CIU_PAD_CONFIG0_XOSC_OD_EN(x)    (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_CONFIG0_XOSC_OD_EN_SHIFT)) & AON_SOC_CIU_PAD_CONFIG0_XOSC_OD_EN_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_CONFIG0_XOSC_ENA_PAD_SEL_MASK (0x80000000U)\r\n#define AON_SOC_CIU_PAD_CONFIG0_XOSC_ENA_PAD_SEL_SHIFT (31U)\r\n/*! XOSC_ENA_PAD_SEL - xosc_ena_pads selection from CAU or mci_top */\r\n#define AON_SOC_CIU_PAD_CONFIG0_XOSC_ENA_PAD_SEL(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_CONFIG0_XOSC_ENA_PAD_SEL_SHIFT)) & AON_SOC_CIU_PAD_CONFIG0_XOSC_ENA_PAD_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_PWRDOWN_CTRL2 - Pad Power-down Control 2 */\r\n/*! @{ */\r\n\r\n#define AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO22_PD_SEL_MASK (0x7U)\r\n#define AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO22_PD_SEL_SHIFT (0U)\r\n/*! GPIO22_PD_SEL - Power Down Output Value for GPIO[22] Pad */\r\n#define AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO22_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO22_PD_SEL_SHIFT)) & AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO22_PD_SEL_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO23_PD_SEL_MASK (0x70U)\r\n#define AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO23_PD_SEL_SHIFT (4U)\r\n/*! GPIO23_PD_SEL - Power Down Output Value for GPIO[23] Pad */\r\n#define AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO23_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO23_PD_SEL_SHIFT)) & AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO23_PD_SEL_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO24_PD_SEL_MASK (0x700U)\r\n#define AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO24_PD_SEL_SHIFT (8U)\r\n/*! GPIO24_PD_SEL - Power Down Output Value for GPIO[24] Pad */\r\n#define AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO24_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO24_PD_SEL_SHIFT)) & AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO24_PD_SEL_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO25_PD_SEL_MASK (0x7000U)\r\n#define AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO25_PD_SEL_SHIFT (12U)\r\n/*! GPIO25_PD_SEL - Power Down Output Value for GPIO[25] Pad */\r\n#define AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO25_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO25_PD_SEL_SHIFT)) & AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO25_PD_SEL_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO26_PD_SEL_MASK (0x70000U)\r\n#define AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO26_PD_SEL_SHIFT (16U)\r\n/*! GPIO26_PD_SEL - Power Down Output Value for GPIO[26] Pad */\r\n#define AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO26_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO26_PD_SEL_SHIFT)) & AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO26_PD_SEL_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO27_PD_SEL_MASK (0x700000U)\r\n#define AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO27_PD_SEL_SHIFT (20U)\r\n/*! GPIO27_PD_SEL - Power Down Output Value for GPIO[27] Pad */\r\n#define AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO27_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO27_PD_SEL_SHIFT)) & AON_SOC_CIU_PAD_PWRDOWN_CTRL2_GPIO27_PD_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SR_CONFIG1 - GPIO Slew Rate control */\r\n/*! @{ */\r\n\r\n#define AON_SOC_CIU_SR_CONFIG1_GPIO22_SR_MASK    (0x3000U)\r\n#define AON_SOC_CIU_SR_CONFIG1_GPIO22_SR_SHIFT   (12U)\r\n/*! GPIO22_SR - Slew Rate Control for GPIO[22] */\r\n#define AON_SOC_CIU_SR_CONFIG1_GPIO22_SR(x)      (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_SR_CONFIG1_GPIO22_SR_SHIFT)) & AON_SOC_CIU_SR_CONFIG1_GPIO22_SR_MASK)\r\n\r\n#define AON_SOC_CIU_SR_CONFIG1_GPIO23_SR_MASK    (0xC000U)\r\n#define AON_SOC_CIU_SR_CONFIG1_GPIO23_SR_SHIFT   (14U)\r\n/*! GPIO23_SR - Slew Rate Control for GPIO[23] */\r\n#define AON_SOC_CIU_SR_CONFIG1_GPIO23_SR(x)      (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_SR_CONFIG1_GPIO23_SR_SHIFT)) & AON_SOC_CIU_SR_CONFIG1_GPIO23_SR_MASK)\r\n\r\n#define AON_SOC_CIU_SR_CONFIG1_GPIO24_SR_MASK    (0x30000U)\r\n#define AON_SOC_CIU_SR_CONFIG1_GPIO24_SR_SHIFT   (16U)\r\n/*! GPIO24_SR - Slew Rate Control for GPIO[24] */\r\n#define AON_SOC_CIU_SR_CONFIG1_GPIO24_SR(x)      (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_SR_CONFIG1_GPIO24_SR_SHIFT)) & AON_SOC_CIU_SR_CONFIG1_GPIO24_SR_MASK)\r\n\r\n#define AON_SOC_CIU_SR_CONFIG1_GPIO25_SR_MASK    (0xC0000U)\r\n#define AON_SOC_CIU_SR_CONFIG1_GPIO25_SR_SHIFT   (18U)\r\n/*! GPIO25_SR - Slew Rate Control for GPIO[25] */\r\n#define AON_SOC_CIU_SR_CONFIG1_GPIO25_SR(x)      (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_SR_CONFIG1_GPIO25_SR_SHIFT)) & AON_SOC_CIU_SR_CONFIG1_GPIO25_SR_MASK)\r\n\r\n#define AON_SOC_CIU_SR_CONFIG1_GPIO26_SR_MASK    (0x300000U)\r\n#define AON_SOC_CIU_SR_CONFIG1_GPIO26_SR_SHIFT   (20U)\r\n/*! GPIO26_SR - Slew Rate Control for GPIO[26] */\r\n#define AON_SOC_CIU_SR_CONFIG1_GPIO26_SR(x)      (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_SR_CONFIG1_GPIO26_SR_SHIFT)) & AON_SOC_CIU_SR_CONFIG1_GPIO26_SR_MASK)\r\n\r\n#define AON_SOC_CIU_SR_CONFIG1_GPIO27_SR_MASK    (0xC00000U)\r\n#define AON_SOC_CIU_SR_CONFIG1_GPIO27_SR_SHIFT   (22U)\r\n/*! GPIO27_SR - Slew Rate Control for GPIO[27] */\r\n#define AON_SOC_CIU_SR_CONFIG1_GPIO27_SR(x)      (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_SR_CONFIG1_GPIO27_SR_SHIFT)) & AON_SOC_CIU_SR_CONFIG1_GPIO27_SR_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_PU_PD_EN1 - Pad Pull-up Pull-down Enable2 */\r\n/*! @{ */\r\n\r\n#define AON_SOC_CIU_PAD_PU_PD_EN1_GPIO22_PU_PD_EN_MASK (0x3000U)\r\n#define AON_SOC_CIU_PAD_PU_PD_EN1_GPIO22_PU_PD_EN_SHIFT (12U)\r\n/*! GPIO22_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[22] */\r\n#define AON_SOC_CIU_PAD_PU_PD_EN1_GPIO22_PU_PD_EN(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_PU_PD_EN1_GPIO22_PU_PD_EN_SHIFT)) & AON_SOC_CIU_PAD_PU_PD_EN1_GPIO22_PU_PD_EN_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_PU_PD_EN1_GPIO23_PU_PD_EN_MASK (0xC000U)\r\n#define AON_SOC_CIU_PAD_PU_PD_EN1_GPIO23_PU_PD_EN_SHIFT (14U)\r\n/*! GPIO23_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[23] */\r\n#define AON_SOC_CIU_PAD_PU_PD_EN1_GPIO23_PU_PD_EN(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_PU_PD_EN1_GPIO23_PU_PD_EN_SHIFT)) & AON_SOC_CIU_PAD_PU_PD_EN1_GPIO23_PU_PD_EN_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_PU_PD_EN1_GPIO24_PU_PD_EN_MASK (0x30000U)\r\n#define AON_SOC_CIU_PAD_PU_PD_EN1_GPIO24_PU_PD_EN_SHIFT (16U)\r\n/*! GPIO24_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[24] */\r\n#define AON_SOC_CIU_PAD_PU_PD_EN1_GPIO24_PU_PD_EN(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_PU_PD_EN1_GPIO24_PU_PD_EN_SHIFT)) & AON_SOC_CIU_PAD_PU_PD_EN1_GPIO24_PU_PD_EN_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_PU_PD_EN1_GPIO25_PU_PD_EN_MASK (0xC0000U)\r\n#define AON_SOC_CIU_PAD_PU_PD_EN1_GPIO25_PU_PD_EN_SHIFT (18U)\r\n/*! GPIO25_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[25] */\r\n#define AON_SOC_CIU_PAD_PU_PD_EN1_GPIO25_PU_PD_EN(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_PU_PD_EN1_GPIO25_PU_PD_EN_SHIFT)) & AON_SOC_CIU_PAD_PU_PD_EN1_GPIO25_PU_PD_EN_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_PU_PD_EN1_GPIO26_PU_PD_EN_MASK (0x300000U)\r\n#define AON_SOC_CIU_PAD_PU_PD_EN1_GPIO26_PU_PD_EN_SHIFT (20U)\r\n/*! GPIO26_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[26] */\r\n#define AON_SOC_CIU_PAD_PU_PD_EN1_GPIO26_PU_PD_EN(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_PU_PD_EN1_GPIO26_PU_PD_EN_SHIFT)) & AON_SOC_CIU_PAD_PU_PD_EN1_GPIO26_PU_PD_EN_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_PU_PD_EN1_GPIO27_PU_PD_EN_MASK (0xC00000U)\r\n#define AON_SOC_CIU_PAD_PU_PD_EN1_GPIO27_PU_PD_EN_SHIFT (22U)\r\n/*! GPIO27_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[27] */\r\n#define AON_SOC_CIU_PAD_PU_PD_EN1_GPIO27_PU_PD_EN(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_PU_PD_EN1_GPIO27_PU_PD_EN_SHIFT)) & AON_SOC_CIU_PAD_PU_PD_EN1_GPIO27_PU_PD_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_SLP_EN0 - Pad Sleep Mode Enable */\r\n/*! @{ */\r\n\r\n#define AON_SOC_CIU_PAD_SLP_EN0_GPIO22_SLP_EN_MASK (0x400000U)\r\n#define AON_SOC_CIU_PAD_SLP_EN0_GPIO22_SLP_EN_SHIFT (22U)\r\n/*! GPIO22_SLP_EN - Enable Forcing GPIO[22] Output During Sleep */\r\n#define AON_SOC_CIU_PAD_SLP_EN0_GPIO22_SLP_EN(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_SLP_EN0_GPIO22_SLP_EN_SHIFT)) & AON_SOC_CIU_PAD_SLP_EN0_GPIO22_SLP_EN_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_SLP_EN0_GPIO23_SLP_EN_MASK (0x800000U)\r\n#define AON_SOC_CIU_PAD_SLP_EN0_GPIO23_SLP_EN_SHIFT (23U)\r\n/*! GPIO23_SLP_EN - Enable Forcing GPIO[23] Output During Sleep */\r\n#define AON_SOC_CIU_PAD_SLP_EN0_GPIO23_SLP_EN(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_SLP_EN0_GPIO23_SLP_EN_SHIFT)) & AON_SOC_CIU_PAD_SLP_EN0_GPIO23_SLP_EN_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_SLP_EN0_GPIO24_SLP_EN_MASK (0x1000000U)\r\n#define AON_SOC_CIU_PAD_SLP_EN0_GPIO24_SLP_EN_SHIFT (24U)\r\n/*! GPIO24_SLP_EN - Enable Forcing GPIO[24] Output During Sleep */\r\n#define AON_SOC_CIU_PAD_SLP_EN0_GPIO24_SLP_EN(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_SLP_EN0_GPIO24_SLP_EN_SHIFT)) & AON_SOC_CIU_PAD_SLP_EN0_GPIO24_SLP_EN_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_SLP_EN0_GPIO25_SLP_EN_MASK (0x2000000U)\r\n#define AON_SOC_CIU_PAD_SLP_EN0_GPIO25_SLP_EN_SHIFT (25U)\r\n/*! GPIO25_SLP_EN - Enable Forcing GPIO[25] Output During Sleep */\r\n#define AON_SOC_CIU_PAD_SLP_EN0_GPIO25_SLP_EN(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_SLP_EN0_GPIO25_SLP_EN_SHIFT)) & AON_SOC_CIU_PAD_SLP_EN0_GPIO25_SLP_EN_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_SLP_EN0_GPIO26_SLP_EN_MASK (0x4000000U)\r\n#define AON_SOC_CIU_PAD_SLP_EN0_GPIO26_SLP_EN_SHIFT (26U)\r\n/*! GPIO26_SLP_EN - Enable Forcing GPIO[26] Output During Sleep */\r\n#define AON_SOC_CIU_PAD_SLP_EN0_GPIO26_SLP_EN(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_SLP_EN0_GPIO26_SLP_EN_SHIFT)) & AON_SOC_CIU_PAD_SLP_EN0_GPIO26_SLP_EN_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_SLP_EN0_GPIO27_SLP_EN_MASK (0x8000000U)\r\n#define AON_SOC_CIU_PAD_SLP_EN0_GPIO27_SLP_EN_SHIFT (27U)\r\n/*! GPIO27_SLP_EN - Enable Forcing GPIO[27] Output During Sleep */\r\n#define AON_SOC_CIU_PAD_SLP_EN0_GPIO27_SLP_EN(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_SLP_EN0_GPIO27_SLP_EN_SHIFT)) & AON_SOC_CIU_PAD_SLP_EN0_GPIO27_SLP_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_SLP_VAL0 - Pad Sleep Mode Value */\r\n/*! @{ */\r\n\r\n#define AON_SOC_CIU_PAD_SLP_VAL0_GPIO22_SLP_VAL_MASK (0x400000U)\r\n#define AON_SOC_CIU_PAD_SLP_VAL0_GPIO22_SLP_VAL_SHIFT (22U)\r\n/*! GPIO22_SLP_VAL - Force GPIO[22] Output During Sleep */\r\n#define AON_SOC_CIU_PAD_SLP_VAL0_GPIO22_SLP_VAL(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_SLP_VAL0_GPIO22_SLP_VAL_SHIFT)) & AON_SOC_CIU_PAD_SLP_VAL0_GPIO22_SLP_VAL_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_SLP_VAL0_GPIO23_SLP_VAL_MASK (0x800000U)\r\n#define AON_SOC_CIU_PAD_SLP_VAL0_GPIO23_SLP_VAL_SHIFT (23U)\r\n/*! GPIO23_SLP_VAL - Force GPIO[23] Output During Sleep */\r\n#define AON_SOC_CIU_PAD_SLP_VAL0_GPIO23_SLP_VAL(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_SLP_VAL0_GPIO23_SLP_VAL_SHIFT)) & AON_SOC_CIU_PAD_SLP_VAL0_GPIO23_SLP_VAL_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_SLP_VAL0_GPIO24_SLP_VAL_MASK (0x1000000U)\r\n#define AON_SOC_CIU_PAD_SLP_VAL0_GPIO24_SLP_VAL_SHIFT (24U)\r\n/*! GPIO24_SLP_VAL - Force GPIO[24] Output During Sleep */\r\n#define AON_SOC_CIU_PAD_SLP_VAL0_GPIO24_SLP_VAL(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_SLP_VAL0_GPIO24_SLP_VAL_SHIFT)) & AON_SOC_CIU_PAD_SLP_VAL0_GPIO24_SLP_VAL_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_SLP_VAL0_GPIO25_SLP_VAL_MASK (0x2000000U)\r\n#define AON_SOC_CIU_PAD_SLP_VAL0_GPIO25_SLP_VAL_SHIFT (25U)\r\n/*! GPIO25_SLP_VAL - Force GPIO[25] Output During Sleep */\r\n#define AON_SOC_CIU_PAD_SLP_VAL0_GPIO25_SLP_VAL(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_SLP_VAL0_GPIO25_SLP_VAL_SHIFT)) & AON_SOC_CIU_PAD_SLP_VAL0_GPIO25_SLP_VAL_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_SLP_VAL0_GPIO26_SLP_VAL_MASK (0x4000000U)\r\n#define AON_SOC_CIU_PAD_SLP_VAL0_GPIO26_SLP_VAL_SHIFT (26U)\r\n/*! GPIO26_SLP_VAL - Force GPIO[26] Output During Sleep */\r\n#define AON_SOC_CIU_PAD_SLP_VAL0_GPIO26_SLP_VAL(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_SLP_VAL0_GPIO26_SLP_VAL_SHIFT)) & AON_SOC_CIU_PAD_SLP_VAL0_GPIO26_SLP_VAL_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_SLP_VAL0_GPIO27_SLP_VAL_MASK (0x8000000U)\r\n#define AON_SOC_CIU_PAD_SLP_VAL0_GPIO27_SLP_VAL_SHIFT (27U)\r\n/*! GPIO27_SLP_VAL - Force GPIO[27] Output During Sleep */\r\n#define AON_SOC_CIU_PAD_SLP_VAL0_GPIO27_SLP_VAL(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_SLP_VAL0_GPIO27_SLP_VAL_SHIFT)) & AON_SOC_CIU_PAD_SLP_VAL0_GPIO27_SLP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name RST_SW - Reset Controls for SOC_RESET_GEN */\r\n/*! @{ */\r\n\r\n#define AON_SOC_CIU_RST_SW_BUCK_REG_RST_MASK     (0x200U)\r\n#define AON_SOC_CIU_RST_SW_BUCK_REG_RST_SHIFT    (9U)\r\n/*! BUCK_REG_RST - config reg SW reset for BUCK18 and BUCK11, active high */\r\n#define AON_SOC_CIU_RST_SW_BUCK_REG_RST(x)       (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_RST_SW_BUCK_REG_RST_SHIFT)) & AON_SOC_CIU_RST_SW_BUCK_REG_RST_MASK)\r\n\r\n#define AON_SOC_CIU_RST_SW_SOCAON_ITRC_CHIP_RSTB_EN_MASK (0x1000000U)\r\n#define AON_SOC_CIU_RST_SW_SOCAON_ITRC_CHIP_RSTB_EN_SHIFT (24U)\r\n/*! SOCAON_ITRC_CHIP_RSTB_EN - Default the itrc chip reset can reset SOCAON (jtag), SW can disable this if not required */\r\n#define AON_SOC_CIU_RST_SW_SOCAON_ITRC_CHIP_RSTB_EN(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_RST_SW_SOCAON_ITRC_CHIP_RSTB_EN_SHIFT)) & AON_SOC_CIU_RST_SW_SOCAON_ITRC_CHIP_RSTB_EN_MASK)\r\n\r\n#define AON_SOC_CIU_RST_SW_AON_SOCCIU_RSTB_MASK  (0x2000000U)\r\n#define AON_SOC_CIU_RST_SW_AON_SOCCIU_RSTB_SHIFT (25U)\r\n/*! AON_SOCCIU_RSTB - reset for the aon socciu registers. It gets auto clear */\r\n#define AON_SOC_CIU_RST_SW_AON_SOCCIU_RSTB(x)    (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_RST_SW_AON_SOCCIU_RSTB_SHIFT)) & AON_SOC_CIU_RST_SW_AON_SOCCIU_RSTB_MASK)\r\n/*! @} */\r\n\r\n/*! @name STRAP_FINISH_STATUS - SOC Strap Finish Status */\r\n/*! @{ */\r\n\r\n#define AON_SOC_CIU_STRAP_FINISH_STATUS_STRAP_FINISH_MASK (0x1U)\r\n#define AON_SOC_CIU_STRAP_FINISH_STATUS_STRAP_FINISH_SHIFT (0U)\r\n/*! STRAP_FINISH - Strap Finish status from strap logic. */\r\n#define AON_SOC_CIU_STRAP_FINISH_STATUS_STRAP_FINISH(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_STRAP_FINISH_STATUS_STRAP_FINISH_SHIFT)) & AON_SOC_CIU_STRAP_FINISH_STATUS_STRAP_FINISH_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOC_OTP_CONTROL - Power Switch (1.8v) Control for SOC OTP */\r\n/*! @{ */\r\n\r\n#define AON_SOC_CIU_SOC_OTP_CONTROL_SOC_OTP_PSW18_PD_MASK (0x1U)\r\n#define AON_SOC_CIU_SOC_OTP_CONTROL_SOC_OTP_PSW18_PD_SHIFT (0U)\r\n/*! SOC_OTP_PSW18_PD - Power-Down control for the 1.8V Power-Switch for OTPs on SOC side */\r\n#define AON_SOC_CIU_SOC_OTP_CONTROL_SOC_OTP_PSW18_PD(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_SOC_OTP_CONTROL_SOC_OTP_PSW18_PD_SHIFT)) & AON_SOC_CIU_SOC_OTP_CONTROL_SOC_OTP_PSW18_PD_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_AON_VREG_VSENSOR_CTRL - AON Vsensor and Vreg Pad Control */\r\n/*! @{ */\r\n\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VIO_REG_ENB_MASK (0x1U)\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VIO_REG_ENB_SHIFT (0U)\r\n/*! VIO_REG_ENB - VIO_AON Pad Regulator */\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VIO_REG_ENB(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VIO_REG_ENB_SHIFT)) & AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VIO_REG_ENB_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VIO_REG_CTRL_EN_MASK (0x2U)\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VIO_REG_CTRL_EN_SHIFT (1U)\r\n/*! VIO_REG_CTRL_EN - VIO reg control enable function */\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VIO_REG_CTRL_EN(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VIO_REG_CTRL_EN_SHIFT)) & AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VIO_REG_CTRL_EN_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_BYPASS_MASK (0x10U)\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_BYPASS_SHIFT (4U)\r\n/*! VSENSOR_BYPASS - Active High Enable Signal for Bypass Mode */\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_BYPASS_SHIFT)) & AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_BYPASS_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_V18EN_12_IN_MASK (0x20U)\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_V18EN_12_IN_SHIFT (5U)\r\n/*! VSENSOR_V18EN_12_IN - Bypass Value when Vsensor_Bypass Bit Set */\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_V18EN_12_IN(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_V18EN_12_IN_SHIFT)) & AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_V18EN_12_IN_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_DISABLE_12_MASK (0x40U)\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_DISABLE_12_SHIFT (6U)\r\n/*! VSENSOR_DISABLE_12 - Vsensor AON disable */\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_DISABLE_12(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_DISABLE_12_SHIFT)) & AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_DISABLE_12_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_CLK_12_MASK (0x80U)\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_CLK_12_SHIFT (7U)\r\n/*! VSENSOR_CLK_12 - Vsensor AON Clock */\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_CLK_12(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_CLK_12_SHIFT)) & AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_CLK_12_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_TE_MASK (0x100U)\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_TE_SHIFT (8U)\r\n/*! VSENSOR_TE - Vsensor AON Test Enable */\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_TE(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_TE_SHIFT)) & AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_TE_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_TEST_MASK (0xE00U)\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_TEST_SHIFT (9U)\r\n/*! VSENSOR_TEST - Vsensor AON Test Point Mux Selection */\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_TEST(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_TEST_SHIFT)) & AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_TEST_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_VTHRESH_MASK (0x1000U)\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_VTHRESH_SHIFT (12U)\r\n/*! VSENSOR_VTHRESH - Vsensor AON Detection Threshold */\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_VTHRESH(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_VTHRESH_SHIFT)) & AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_VTHRESH_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_V25EN_CORE_MASK (0x2000U)\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_V25EN_CORE_SHIFT (13U)\r\n/*! V25EN_CORE - V25EN_CORE */\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_V25EN_CORE(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_V25EN_CORE_SHIFT)) & AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_V25EN_CORE_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_DETECT_MASK (0x4000U)\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_DETECT_SHIFT (14U)\r\n/*! VSENSOR_DETECT - VIO_AON_Vsensor_Detect_V18 Status */\r\n#define AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_DETECT(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_DETECT_SHIFT)) & AON_SOC_CIU_PAD_AON_VREG_VSENSOR_CTRL_VSENSOR_DETECT_MASK)\r\n/*! @} */\r\n\r\n/*! @name STRAP_RDBK - Strap Readback */\r\n/*! @{ */\r\n\r\n#define AON_SOC_CIU_STRAP_RDBK_MODE_MASK         (0xFU)\r\n#define AON_SOC_CIU_STRAP_RDBK_MODE_SHIFT        (0U)\r\n/*! MODE - Boot Options: */\r\n#define AON_SOC_CIU_STRAP_RDBK_MODE(x)           (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_STRAP_RDBK_MODE_SHIFT)) & AON_SOC_CIU_STRAP_RDBK_MODE_MASK)\r\n\r\n#define AON_SOC_CIU_STRAP_RDBK_REF_CLK_DETECT_MASK (0x10U)\r\n#define AON_SOC_CIU_STRAP_RDBK_REF_CLK_DETECT_SHIFT (4U)\r\n/*! REF_CLK_DETECT - ref_clk_detect (reserved) */\r\n#define AON_SOC_CIU_STRAP_RDBK_REF_CLK_DETECT(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_STRAP_RDBK_REF_CLK_DETECT_SHIFT)) & AON_SOC_CIU_STRAP_RDBK_REF_CLK_DETECT_MASK)\r\n\r\n#define AON_SOC_CIU_STRAP_RDBK_XOSC_SEL_MASK     (0x60U)\r\n#define AON_SOC_CIU_STRAP_RDBK_XOSC_SEL_SHIFT    (5U)\r\n/*! XOSC_SEL - Crystal Osc Enable */\r\n#define AON_SOC_CIU_STRAP_RDBK_XOSC_SEL(x)       (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_STRAP_RDBK_XOSC_SEL_SHIFT)) & AON_SOC_CIU_STRAP_RDBK_XOSC_SEL_MASK)\r\n\r\n#define AON_SOC_CIU_STRAP_RDBK_VTOR_SEL_MASK     (0x80U)\r\n#define AON_SOC_CIU_STRAP_RDBK_VTOR_SEL_SHIFT    (7U)\r\n/*! VTOR_SEL - Strap bit to select secure VTOR base addr of CM33 */\r\n#define AON_SOC_CIU_STRAP_RDBK_VTOR_SEL(x)       (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_STRAP_RDBK_VTOR_SEL_SHIFT)) & AON_SOC_CIU_STRAP_RDBK_VTOR_SEL_MASK)\r\n\r\n#define AON_SOC_CIU_STRAP_RDBK_DIS_KEY_ROT_DBG_MASK (0x100U)\r\n#define AON_SOC_CIU_STRAP_RDBK_DIS_KEY_ROT_DBG_SHIFT (8U)\r\n/*! DIS_KEY_ROT_DBG - dis_key_rot_dbg */\r\n#define AON_SOC_CIU_STRAP_RDBK_DIS_KEY_ROT_DBG(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_STRAP_RDBK_DIS_KEY_ROT_DBG_SHIFT)) & AON_SOC_CIU_STRAP_RDBK_DIS_KEY_ROT_DBG_MASK)\r\n\r\n#define AON_SOC_CIU_STRAP_RDBK_DAP_USE_JTAG_MASK (0x800U)\r\n#define AON_SOC_CIU_STRAP_RDBK_DAP_USE_JTAG_SHIFT (11U)\r\n/*! DAP_USE_JTAG - 1 (Default): DAP uses JTAG */\r\n#define AON_SOC_CIU_STRAP_RDBK_DAP_USE_JTAG(x)   (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_STRAP_RDBK_DAP_USE_JTAG_SHIFT)) & AON_SOC_CIU_STRAP_RDBK_DAP_USE_JTAG_MASK)\r\n\r\n#define AON_SOC_CIU_STRAP_RDBK_QFN_BOND_MASK     (0x4000U)\r\n#define AON_SOC_CIU_STRAP_RDBK_QFN_BOND_SHIFT    (14U)\r\n/*! QFN_BOND - Bond Strap Value */\r\n#define AON_SOC_CIU_STRAP_RDBK_QFN_BOND(x)       (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_STRAP_RDBK_QFN_BOND_SHIFT)) & AON_SOC_CIU_STRAP_RDBK_QFN_BOND_MASK)\r\n\r\n#define AON_SOC_CIU_STRAP_RDBK_REF_CLK_RATE_MASK (0xF00000U)\r\n#define AON_SOC_CIU_STRAP_RDBK_REF_CLK_RATE_SHIFT (20U)\r\n/*! REF_CLK_RATE - CAU Reference Clock Rate */\r\n#define AON_SOC_CIU_STRAP_RDBK_REF_CLK_RATE(x)   (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_STRAP_RDBK_REF_CLK_RATE_SHIFT)) & AON_SOC_CIU_STRAP_RDBK_REF_CLK_RATE_MASK)\r\n/*! @} */\r\n\r\n/*! @name STRAP_SW - Software Strap Override */\r\n/*! @{ */\r\n\r\n#define AON_SOC_CIU_STRAP_SW_MODE_MASK           (0xFU)\r\n#define AON_SOC_CIU_STRAP_SW_MODE_SHIFT          (0U)\r\n/*! MODE - Below are the modes selected based on the value of this field: */\r\n#define AON_SOC_CIU_STRAP_SW_MODE(x)             (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_STRAP_SW_MODE_SHIFT)) & AON_SOC_CIU_STRAP_SW_MODE_MASK)\r\n\r\n#define AON_SOC_CIU_STRAP_SW_XOSC_SEL_MASK       (0x60U)\r\n#define AON_SOC_CIU_STRAP_SW_XOSC_SEL_SHIFT      (5U)\r\n/*! XOSC_SEL - Crystal Osc Enable */\r\n#define AON_SOC_CIU_STRAP_SW_XOSC_SEL(x)         (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_STRAP_SW_XOSC_SEL_SHIFT)) & AON_SOC_CIU_STRAP_SW_XOSC_SEL_MASK)\r\n\r\n#define AON_SOC_CIU_STRAP_SW_QFN_BOND_MASK       (0x4000U)\r\n#define AON_SOC_CIU_STRAP_SW_QFN_BOND_SHIFT      (14U)\r\n/*! QFN_BOND - Bond Type */\r\n#define AON_SOC_CIU_STRAP_SW_QFN_BOND(x)         (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_STRAP_SW_QFN_BOND_SHIFT)) & AON_SOC_CIU_STRAP_SW_QFN_BOND_MASK)\r\n\r\n#define AON_SOC_CIU_STRAP_SW_REF_CLK_RATE_MASK   (0xF00000U)\r\n#define AON_SOC_CIU_STRAP_SW_REF_CLK_RATE_SHIFT  (20U)\r\n/*! REF_CLK_RATE - CAU Reference Clock Rate */\r\n#define AON_SOC_CIU_STRAP_SW_REF_CLK_RATE(x)     (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_STRAP_SW_REF_CLK_RATE_SHIFT)) & AON_SOC_CIU_STRAP_SW_REF_CLK_RATE_MASK)\r\n\r\n#define AON_SOC_CIU_STRAP_SW_ENABLE_MASK         (0x80000000U)\r\n#define AON_SOC_CIU_STRAP_SW_ENABLE_SHIFT        (31U)\r\n/*! ENABLE - Software Strap Mode Enable */\r\n#define AON_SOC_CIU_STRAP_SW_ENABLE(x)           (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_STRAP_SW_ENABLE_SHIFT)) & AON_SOC_CIU_STRAP_SW_ENABLE_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_SLP_PU_PD_DIS0 - Pad Sleep Pullup and Pulldown Disable1 */\r\n/*! @{ */\r\n\r\n#define AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO22_PU_PD_DIS_MASK (0x400000U)\r\n#define AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO22_PU_PD_DIS_SHIFT (22U)\r\n/*! GPIO22_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[22] During Sleep Mode */\r\n#define AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO22_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO22_PU_PD_DIS_SHIFT)) & AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO22_PU_PD_DIS_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO23_PU_PD_DIS_MASK (0x800000U)\r\n#define AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO23_PU_PD_DIS_SHIFT (23U)\r\n/*! GPIO23_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[23] During Sleep Mode */\r\n#define AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO23_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO23_PU_PD_DIS_SHIFT)) & AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO23_PU_PD_DIS_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO24_PU_PD_DIS_MASK (0x1000000U)\r\n#define AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO24_PU_PD_DIS_SHIFT (24U)\r\n/*! GPIO24_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[24] During Sleep Mode */\r\n#define AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO24_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO24_PU_PD_DIS_SHIFT)) & AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO24_PU_PD_DIS_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO25_PU_PD_DIS_MASK (0x2000000U)\r\n#define AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO25_PU_PD_DIS_SHIFT (25U)\r\n/*! GPIO25_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[25] During Sleep Mode */\r\n#define AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO25_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO25_PU_PD_DIS_SHIFT)) & AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO25_PU_PD_DIS_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO26_PU_PD_DIS_MASK (0x4000000U)\r\n#define AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO26_PU_PD_DIS_SHIFT (26U)\r\n/*! GPIO26_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[26] During Sleep Mode */\r\n#define AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO26_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO26_PU_PD_DIS_SHIFT)) & AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO26_PU_PD_DIS_MASK)\r\n\r\n#define AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO27_PU_PD_DIS_MASK (0x8000000U)\r\n#define AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO27_PU_PD_DIS_SHIFT (27U)\r\n/*! GPIO27_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[27] During Sleep Mode */\r\n#define AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO27_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO27_PU_PD_DIS_SHIFT)) & AON_SOC_CIU_PAD_SLP_PU_PD_DIS0_GPIO27_PU_PD_DIS_MASK)\r\n/*! @} */\r\n\r\n/*! @name MCI_IOMUX_EN0 - mci_iomux_enable control for GPIO[27:22] */\r\n/*! @{ */\r\n\r\n#define AON_SOC_CIU_MCI_IOMUX_EN0_EN_27_22_MASK  (0xFC00000U)\r\n#define AON_SOC_CIU_MCI_IOMUX_EN0_EN_27_22_SHIFT (22U)\r\n/*! EN_27_22 - Bitwise enable control for mci_io_mux GPIO[27:22] */\r\n#define AON_SOC_CIU_MCI_IOMUX_EN0_EN_27_22(x)    (((uint32_t)(((uint32_t)(x)) << AON_SOC_CIU_MCI_IOMUX_EN0_EN_27_22_SHIFT)) & AON_SOC_CIU_MCI_IOMUX_EN0_EN_27_22_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group AON_SOC_CIU_Register_Masks */\r\n\r\n\r\n/* AON_SOC_CIU - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral AON_SOC_CIU base address */\r\n  #define AON_SOC_CIU_BASE                         (0x55000800u)\r\n  /** Peripheral AON_SOC_CIU base address */\r\n  #define AON_SOC_CIU_BASE_NS                      (0x45000800u)\r\n  /** Peripheral AON_SOC_CIU base pointer */\r\n  #define AON_SOC_CIU                              ((AON_SOC_CIU_Type *)AON_SOC_CIU_BASE)\r\n  /** Peripheral AON_SOC_CIU base pointer */\r\n  #define AON_SOC_CIU_NS                           ((AON_SOC_CIU_Type *)AON_SOC_CIU_BASE_NS)\r\n  /** Array initializer of AON_SOC_CIU peripheral base addresses */\r\n  #define AON_SOC_CIU_BASE_ADDRS                   { AON_SOC_CIU_BASE }\r\n  /** Array initializer of AON_SOC_CIU peripheral base pointers */\r\n  #define AON_SOC_CIU_BASE_PTRS                    { AON_SOC_CIU }\r\n  /** Array initializer of AON_SOC_CIU peripheral base addresses */\r\n  #define AON_SOC_CIU_BASE_ADDRS_NS                { AON_SOC_CIU_BASE_NS }\r\n  /** Array initializer of AON_SOC_CIU peripheral base pointers */\r\n  #define AON_SOC_CIU_BASE_PTRS_NS                 { AON_SOC_CIU_NS }\r\n#else\r\n  /** Peripheral AON_SOC_CIU base address */\r\n  #define AON_SOC_CIU_BASE                         (0x45000800u)\r\n  /** Peripheral AON_SOC_CIU base pointer */\r\n  #define AON_SOC_CIU                              ((AON_SOC_CIU_Type *)AON_SOC_CIU_BASE)\r\n  /** Array initializer of AON_SOC_CIU peripheral base addresses */\r\n  #define AON_SOC_CIU_BASE_ADDRS                   { AON_SOC_CIU_BASE }\r\n  /** Array initializer of AON_SOC_CIU peripheral base pointers */\r\n  #define AON_SOC_CIU_BASE_PTRS                    { AON_SOC_CIU }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group AON_SOC_CIU_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- APU Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup APU_Peripheral_Access_Layer APU Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** APU - Register Layout Typedef */\r\ntypedef struct {\r\n  __I  uint32_t APU_IP_REVISION;                   /**< APU IP revision, offset: 0x0 */\r\n  __IO uint32_t CTRL;                              /**< Control, offset: 0x4 */\r\n  __IO uint32_t TIMER_PWR_MODE;                    /**< Timer Power Mode, offset: 0x8 */\r\n  __IO uint32_t PWR_CTRL;                          /**< Power Control, offset: 0xC */\r\n  __IO uint32_t PLL_CTRL;                          /**< PLL Control, offset: 0x10 */\r\n  __IO uint32_t PLL_DIS_CNT;                       /**< PLL Disable Count, offset: 0x14 */\r\n  __IO uint32_t STABLE_CNT;                        /**< Stable Count, offset: 0x18 */\r\n  __IO uint32_t CPU1_HOST_WKUP_MASK;               /**< CPU1 Host Wakeup Mask, offset: 0x1C */\r\n  __IO uint32_t CPU1_HOST_WKUP_POL;                /**< CPU1 Host Wakeup Polarity, offset: 0x20 */\r\n  __I  uint32_t CAL_WIN_CNT;                       /**< Calibration Window Count, offset: 0x24 */\r\n  __I  uint32_t AUTO_10US;                         /**< Auto 10us, offset: 0x28 */\r\n  __I  uint32_t ACC_CNT;                           /**< Accumulation Count, offset: 0x2C */\r\n  __IO uint32_t CAL_WIN_SIZE;                      /**< Calibration Window Size, offset: 0x30 */\r\n  __I  uint32_t SLP_CLK_TIMER;                     /**< Sleep Clock Timer, offset: 0x34 */\r\n  __I  uint32_t STATUS_RD;                         /**< Status Read, offset: 0x38 */\r\n  __IO uint32_t STABLE_CNT2;                       /**< Stable Count 2, offset: 0x3C */\r\n  __IO uint32_t DYN_PLL_MASK;                      /**< Dynamic PLL Mask, offset: 0x40 */\r\n  __I  uint32_t TESTBUS_RD1;                       /**< Testbus Read 1, offset: 0x44 */\r\n  __I  uint32_t TESTBUS_RD2;                       /**< Testbus Read 2, offset: 0x48 */\r\n  __IO uint32_t GENERIC_TIMER_CNT;                 /**< Generic Timer Count, offset: 0x4C */\r\n  __IO uint32_t CPU1_HOST_WKUP_CTRL;               /**< CPU1 Host Wakeup Control, offset: 0x50 */\r\n  __IO uint32_t DYN_PLL_CLK_EXT_CTRL;              /**< Dynamic PLL Clock Ext Control, offset: 0x54 */\r\n  __IO uint32_t GENERIC_SLP_START_VAL;             /**< Generic Sleep Start Value, offset: 0x58 */\r\n  __IO uint32_t DLY_HOST_CTRL;                     /**< Delay Host Control, offset: 0x5C */\r\n  __I  uint32_t HOST_WKUP_CNT;                     /**< Host Wakeup Count, offset: 0x60 */\r\n  __IO uint32_t CPU2_HOST_WKUP_MASK;               /**< CPU2 Host Wakeup Mask, offset: 0x64 */\r\n  __IO uint32_t CPU2_HOST_WKUP_POL;                /**< CPU2 Host Wakeup Polarity, offset: 0x68 */\r\n  __IO uint32_t CPU2_HOST_WKUP_CTRL;               /**< CPU2 Host Wakeup Control, offset: 0x6C */\r\n  __IO uint32_t CPU2_CTRL;                         /**< CPU2 Control, offset: 0x70 */\r\n  __IO uint32_t WLAN_PWR_CTRL_DLY;                 /**< Wlan domain FSM Power Control Delay, offset: 0x74 */\r\n  __I  uint32_t STATUS2;                           /**< Status 2, offset: 0x78 */\r\n  __IO uint32_t WLAN_PWR_CTRL_DLY2;                /**< Wlan domain FSM Power Control Delay 2, offset: 0x7C */\r\n  __IO uint32_t WL_CTRL;                           /**< WLAN Control, offset: 0x80 */\r\n  __IO uint32_t WL_WKUP_MASK;                      /**< WLAN Wakeup Mask, offset: 0x84 */\r\n  __I  uint32_t WL_STATUS;                         /**< WLAN Status, offset: 0x88 */\r\n  __I  uint32_t WL_ALARM_RD;                       /**< WLAN Alarm Readback, offset: 0x8C */\r\n  __IO uint32_t WL_BCN_XP_ALARM;                   /**< WLAN Beacon Alarm, offset: 0x90 */\r\n  __IO uint32_t WL_BCN_INTR_ALARM;                 /**< WLAN Beacon Interrupt Alarm, offset: 0x94 */\r\n  __IO uint32_t WL_HOST_INTR_ALARM;                /**< WLAN Host Interrupt Alarm, offset: 0x98 */\r\n  __IO uint32_t WL_BCN_PLL_ALARM;                  /**< WLAN Beacon PLL Alarm, offset: 0x9C */\r\n  __IO uint32_t TSF_REF_FACTOR;                    /**< TSF Reference Factor, offset: 0xA0 */\r\n  __IO uint32_t TSF_SLEEP_FACTOR;                  /**< TSF Sleep Factor, offset: 0xA4 */\r\n  __IO uint32_t BBUD_UDR_ISO_CNT;                  /**< BBUD UDR ISO Count, offset: 0xA8 */\r\n  __IO uint32_t WL_DVFS_CTRL;                      /**< WLAN DVFS Control, offset: 0xAC */\r\n  __IO uint32_t WL_CTRL2;                          /**< WLAN Control 2, offset: 0xB0 */\r\n  __IO uint32_t WL_WKUP_MASK2;                     /**< WLAN Wakeup Mask 2, offset: 0xB4 */\r\n  __I  uint32_t WL_STATUS2;                        /**< WLAN Status 2, offset: 0xB8 */\r\n  __I  uint32_t WL_ALARM_RD2;                      /**< WLAN Alarm Readback 2, offset: 0xBC */\r\n  __IO uint32_t WL_BCN_XP_ALARM2;                  /**< WLAN Beacon XP Alarm 2, offset: 0xC0 */\r\n  __IO uint32_t WL_BCN_INTR_ALARM2;                /**< WLAN Beacon Interrupt Alarm 2, offset: 0xC4 */\r\n  __IO uint32_t WL_HOST_INTR_ALARM2;               /**< WLAN Host Interrupt Alarm 2, offset: 0xC8 */\r\n  __IO uint32_t WL_BCN_PLL_ALARM2;                 /**< WLAN Beacon PLL Alarm 2, offset: 0xCC */\r\n  __IO uint32_t WLCOMN_PWR_CTRL;                   /**< WLAN Comm Powerup Control, offset: 0xD0 */\r\n  __I  uint32_t WLCOMN_STATUS;                     /**< WLAN Comm Status, offset: 0xD4 */\r\n       uint8_t RESERVED_0[8];\r\n  __IO uint32_t BT_CTRL;                           /**< Bluetooth Control, offset: 0xE0 */\r\n  __IO uint32_t BT_WKUP_MASK;                      /**< Bluetooth Wakeup Mask, offset: 0xE4 */\r\n  __I  uint32_t BT_STATUS;                         /**< Bluetooth Status, offset: 0xE8 */\r\n  __IO uint32_t BT_CKEN_CTRL;                      /**< Bluetooth Clock Enable Control, offset: 0xEC */\r\n  __IO uint32_t BT_RESRC_CTRL;                     /**< Bluetooth RESRC Control, offset: 0xF0 */\r\n  __IO uint32_t BT_DVFS_CTRL;                      /**< Bluetooth DVFS Control, offset: 0xF4 */\r\n       uint8_t RESERVED_1[8];\r\n  __IO uint32_t FM_CTRL;                           /**< FM Control, offset: 0x100 */\r\n  __IO uint32_t FM_WKUP_MASK;                      /**< FM Wakeup Mask, offset: 0x104 */\r\n  __I  uint32_t FM_STATUS;                         /**< FM Status, offset: 0x108 */\r\n  __IO uint32_t FM_CKEN_CTRL;                      /**< FM Clock Enable Control, offset: 0x10C */\r\n  __IO uint32_t FM_RESRC_CTRL;                     /**< FM RESRC Control, offset: 0x110 */\r\n  __IO uint32_t FM_DVFS_CTRL;                      /**< FM DVFS Control, offset: 0x114 */\r\n       uint8_t RESERVED_2[8];\r\n  __IO uint32_t USB_PWR_CTRL_DLY;                  /**< USB FSM Power Control Delay, offset: 0x120 */\r\n  __IO uint32_t USB_PWR_CTRL_DLY2;                 /**< USB FSM Power Control Delay 2, offset: 0x124 */\r\n  __IO uint32_t WLCOMN_PWR_CTRL_DLY;               /**< Wlan common domain FSM Power Control Delay, offset: 0x128 */\r\n  __IO uint32_t WLCOMN_PWR_CTRL_DLY2;              /**< Wlan common domain FSM Power Control Delay 2, offset: 0x12C */\r\n       uint8_t RESERVED_3[16];\r\n  __IO uint32_t BLE_CTRL;                          /**< BLE Control, offset: 0x140 */\r\n  __IO uint32_t BLE_WKUP_MASK;                     /**< BLE Wakeup Mask, offset: 0x144 */\r\n  __I  uint32_t BLE_STATUS;                        /**< BLE Status, offset: 0x148 */\r\n       uint8_t RESERVED_4[20];\r\n  __IO uint32_t NFC_CTRL;                          /**< NFC Control, offset: 0x160 */\r\n  __IO uint32_t NFC_WKUP_MASK;                     /**< NFC Wakeup Mask, offset: 0x164 */\r\n  __I  uint32_t NFC_STATUS;                        /**< NFC Status, offset: 0x168 */\r\n  __IO uint32_t NFC_CKEN_CTRL;                     /**< NFC Clock Enable Control, offset: 0x16C */\r\n  __IO uint32_t NFC_RESRC_CTRL;                    /**< NFC RESRC Control, offset: 0x170 */\r\n  __IO uint32_t NFC_DVFS_CTRL;                     /**< NFC DVFS Control, offset: 0x174 */\r\n       uint8_t RESERVED_5[8];\r\n  __IO uint32_t FP4_CTRL;                          /**< FP4(15.4) Control, offset: 0x180 */\r\n  __IO uint32_t FP4_WKUP_MASK;                     /**< FP4 Wakeup Mask, offset: 0x184 */\r\n  __I  uint32_t FP4_STATUS;                        /**< FP4 Status, offset: 0x188 */\r\n  __IO uint32_t FP4_CKEN_CTRL;                     /**< FP4 Clock Enable Control, offset: 0x18C */\r\n  __IO uint32_t FP4_RESRC_CTRL;                    /**< FP4 RESRC Control, offset: 0x190 */\r\n  __IO uint32_t FP4_DVFS_CTRL;                     /**< FP4 DVFS Control, offset: 0x194 */\r\n  __IO uint32_t CPU2_FP4_HOST_WKUP_MASK;           /**< CPU2 15.4 Host Wakeup Mask, offset: 0x198 */\r\n  __IO uint32_t CPU2_FP4_HOST_WKUP_POL;            /**< CPU2 15.4 Host Wakeup Polarity, offset: 0x19C */\r\n  __IO uint32_t CPU2_FP4_HOST_WKUP_CTRL;           /**< CPU2 15.4 Host Wakeup Control, offset: 0x1A0 */\r\n  __IO uint32_t HW_IP_ACTIVE_INDEX_CTRL;           /**< HW IP active index Control, offset: 0x1A4 */\r\n  __IO uint32_t HW_IP_INACTIVE_INDEX_CTRL;         /**< HW IP inactive Control, offset: 0x1A8 */\r\n  __IO uint32_t HW_IP_DYNAMIC_CLK_SWITCH_CTRL;     /**< HW IP dynamic clock switching contrl, offset: 0x1AC */\r\n  __IO uint32_t IHB_CTRL;                          /**< IHB Control, offset: 0x1B0 */\r\n  __IO uint32_t IHB_WKUP_MASK;                     /**< IHB Wakeup Mask, offset: 0x1B4 */\r\n  __IO uint32_t CPU2_IHB_WKUP_MASK;                /**< CPU2 IHB Wakeup Mask, offset: 0x1B8 */\r\n  __I  uint32_t IHB_STATUS;                        /**< IHB Status, offset: 0x1BC */\r\n  __IO uint32_t USB_CTRL;                          /**< USB Control, offset: 0x1C0 */\r\n  __IO uint32_t USB_WKUP_MASK;                     /**< USB Wakeup Mask, offset: 0x1C4 */\r\n  __I  uint32_t USB_STATUS;                        /**< USB Status, offset: 0x1C8 */\r\n       uint8_t RESERVED_6[52];\r\n  __IO uint32_t CPU1_DVFS_CTRL;                    /**< CPU1 DVFS Control, offset: 0x200 */\r\n  __IO uint32_t CPU1_FREQ_REG1;                    /**< CPU1 Frequency 1, offset: 0x204 */\r\n  __IO uint32_t CPU1_FREQ_REG2;                    /**< CPU1 Frequency 2, offset: 0x208 */\r\n  __IO uint32_t CPU1_PLL_EN_REG;                   /**< CPU1 PLL Enable, offset: 0x20C */\r\n  __IO uint32_t CPU1_VOL_REG1;                     /**< CPU1 Voltage 1, offset: 0x210 */\r\n  __IO uint32_t CPU1_VOL_REG2;                     /**< CPU1 Voltage 2, offset: 0x214 */\r\n  __IO uint32_t CPU1_VOL_REG3;                     /**< CPU1 Voltage 3, offset: 0x218 */\r\n  __IO uint32_t CPU1_VOL_REG4;                     /**< CPU1 Voltage 4, offset: 0x21C */\r\n  __IO uint32_t CPU2_DVFS_CTRL;                    /**< CPU2 DVFS Control, offset: 0x220 */\r\n  __IO uint32_t CPU2_FREQ_REG1;                    /**< CPU2 Frequency 1, offset: 0x224 */\r\n  __IO uint32_t CPU2_FREQ_REG2;                    /**< CPU2 Frequency 2, offset: 0x228 */\r\n  __IO uint32_t CPU2_PLL_EN_REG;                   /**< CPU2 PLL Enable, offset: 0x22C */\r\n  __IO uint32_t CPU2_VOL_REG1;                     /**< CPU2 Voltage 1, offset: 0x230 */\r\n  __IO uint32_t CPU2_VOL_REG2;                     /**< CPU2 Voltage 2, offset: 0x234 */\r\n  __IO uint32_t CPU2_VOL_REG3;                     /**< CPU2 Voltage 3, offset: 0x238 */\r\n  __IO uint32_t CPU2_VOL_REG4;                     /**< CPU2 Voltage 4, offset: 0x23C */\r\n  __IO uint32_t SYS_FREQ_REG1;                     /**< System Frequency 1, offset: 0x240 */\r\n  __IO uint32_t SYS_FREQ_REG2;                     /**< System Frequency 2, offset: 0x244 */\r\n  __IO uint32_t SYS_PLL_EN_REG;                    /**< System PLL Enable, offset: 0x248 */\r\n  __IO uint32_t SYS_VOL_REG1;                      /**< System Voltage 1, offset: 0x24C */\r\n  __IO uint32_t SYS_VOL_REG2;                      /**< System Voltage 2, offset: 0x250 */\r\n  __IO uint32_t SYS_VOL_REG3;                      /**< System Voltage 3, offset: 0x254 */\r\n  __IO uint32_t SYS_VOL_REG4;                      /**< System Voltage 4, offset: 0x258 */\r\n  __IO uint32_t DVFS_CTRL;                         /**< DVFS Control, offset: 0x25C */\r\n  __IO uint32_t PARTIAL_DVFS_CTRL;                 /**< Partial DVFS Control, offset: 0x260 */\r\n  __IO uint32_t DVFS_TIMER;                        /**< DVFS Timer, offset: 0x264 */\r\n       uint8_t RESERVED_7[8];\r\n  __IO uint32_t AHB1_FREQ_REG1;                    /**< AHB1 Frequency 1, offset: 0x270 */\r\n  __IO uint32_t AHB1_FREQ_REG2;                    /**< AHB1 Frequency 2, offset: 0x274 */\r\n  __IO uint32_t AHB1_PLL_EN_REG;                   /**< AHB1 PLL Enable, offset: 0x278 */\r\n  __IO uint32_t AHB1_VOL_REG1;                     /**< AHB1 Voltage 1, offset: 0x27C */\r\n  __IO uint32_t AHB1_VOL_REG2;                     /**< AHB1 Voltage 2, offset: 0x280 */\r\n  __IO uint32_t AHB1_VOL_REG3;                     /**< AHB1 Voltage 3, offset: 0x284 */\r\n  __IO uint32_t AHB1_VOL_REG4;                     /**< AHB1 Voltage 4, offset: 0x288 */\r\n       uint8_t RESERVED_8[12];\r\n  __I  uint32_t DVFS_STATUS;                       /**< DVFS Status, offset: 0x298 */\r\n  __IO uint32_t DVFS_DBG_CTRL;                     /**< DVFS Debug Control, offset: 0x29C */\r\n  __IO uint32_t DVFS_DBG_PATTERN_DATA;             /**< DVFS Debug Pattern Data, offset: 0x2A0 */\r\n  __I  uint32_t DVFS_DBG_REG0;                     /**< DVFS Debug 0, offset: 0x2A4 */\r\n  __I  uint32_t DVFS_DBG_REG1;                     /**< DVFS Debug 1, offset: 0x2A8 */\r\n  __I  uint32_t DVFS_DBG_REG2;                     /**< DVFS Debug 2, offset: 0x2AC */\r\n  __I  uint32_t DVFS_DBG_REG3;                     /**< DVFS Debug 3, offset: 0x2B0 */\r\n  __I  uint32_t DVFS_DBG_REG4;                     /**< DVFS Debug 4, offset: 0x2B4 */\r\n  __I  uint32_t DVFS_DBG_REG5;                     /**< DVFS Debug 5, offset: 0x2B8 */\r\n  __I  uint32_t DVFS_DBG_STATUS;                   /**< DVFS Debug Status, offset: 0x2BC */\r\n  __IO uint32_t DVFS_DBG_PATTERN_MASK;             /**< DVFS Debug Patter Mask, offset: 0x2C0 */\r\n       uint8_t RESERVED_9[52];\r\n  __IO uint32_t DVFS_PMIC_TIMER;                   /**< DVFS PMIC Timer, offset: 0x2F8 */\r\n  __IO uint32_t DVFS_PMIC_MAP;                     /**< DVFS PMIC Map, offset: 0x2FC */\r\n  __IO uint32_t LDO_CTRL;                          /**< LDO Control, offset: 0x300 */\r\n  __IO uint32_t LDO_BACKUP_LVL_MAP1;               /**< LDO Backup Level Map 1, offset: 0x304 */\r\n  __IO uint32_t LDO_BACKUP_LVL_MAP2;               /**< LDO Backup Level Map 2, offset: 0x308 */\r\n  __I  uint32_t LDO_STATUS;                        /**< LDO Status, offset: 0x30C */\r\n  __IO uint32_t RC32_CAL_CTRL;                     /**< RC32 Calibration Control, offset: 0x310 */\r\n  __IO uint32_t RC32_CAL_SLPCLK_TIMER;             /**< RC32 Calibration Sleep Clock Timer, offset: 0x314 */\r\n  __I  uint32_t RC32CAL_SLPCLK_CNT_RD;             /**< RC32 Calibration Sleep Clock Count Read, offset: 0x318 */\r\n       uint8_t RESERVED_10[28];\r\n  __IO uint32_t TSTBUS_DATA;                       /**< Testbus Data, offset: 0x338 */\r\n  __IO uint32_t TST_CTRL;                          /**< Test Control, offset: 0x33C */\r\n  __IO uint32_t BCA_LTE_CTRL;                      /**< BCA LTE Control, offset: 0x340 */\r\n  __IO uint32_t BCA_LTE_TIMER1;                    /**< BCA LTE Timer 1, offset: 0x344 */\r\n  __IO uint32_t BCA_LTE_TIMER2;                    /**< BCA LTE Timer 2, offset: 0x348 */\r\n  __IO uint32_t BCA_MWS_WKUP_TIMER;                /**< BCA MWS Wakeup Timer, offset: 0x34C */\r\n  __IO uint32_t BT2_CTRL;                          /**< Bluetooth 2 Control, offset: 0x350 */\r\n  __IO uint32_t BT2_WKUP_MASK;                     /**< Bluetooth 2 Wakeup Mask, offset: 0x354 */\r\n  __I  uint32_t BT2_STATUS;                        /**< Bluetooth 2 Status, offset: 0x358 */\r\n  __IO uint32_t BT2_CKEN_CTRL;                     /**< Bluetooth 2 Clock Enable Control, offset: 0x35C */\r\n  __IO uint32_t BT2_RESRC_CTRL;                    /**< Bluetooth 2 RESRC Control, offset: 0x360 */\r\n  __IO uint32_t BT2_DVFS_CTRL;                     /**< Bluetooth 2 DVFS Control, offset: 0x364 */\r\n  __IO uint32_t BLE2_CTRL;                         /**< BLE 2 Control, offset: 0x368 */\r\n  __IO uint32_t BLE2_WKUP_MASK;                    /**< BLE 2 Wakeup Mask, offset: 0x36C */\r\n  __I  uint32_t BLE2_STATUS;                       /**< BLE 2 Status, offset: 0x370 */\r\n       uint8_t RESERVED_11[12];\r\n  __I  uint32_t LMU_IP_REVISION;                   /**< LMU IP Revision, offset: 0x380 */\r\n  __IO uint32_t LMU_CPU1_STA_CFG;                  /**< LMU CPU1 STA Configuration, offset: 0x384 */\r\n  __I  uint32_t LMU_CPU1_STA_STATUS1;              /**< LMU CPU1 STA Status 1, offset: 0x388 */\r\n  __I  uint32_t LMU_CPU1_STA_STATUS2;              /**< LMU CPU1 STA Status 2, offset: 0x38C */\r\n       uint8_t RESERVED_12[8];\r\n  __IO uint32_t LMU_CPU1_DYN_CTRL;                 /**< LMU CPU1 Dynamic Control, offset: 0x398 */\r\n  __I  uint32_t LMU_CPU1_DYN_STATUS;               /**< LMU CPU1 Dynamic Status, offset: 0x39C */\r\n       uint8_t RESERVED_13[8];\r\n  __IO uint32_t LMU_CPU2_STA_CFG;                  /**< LMU CPU2 STA Configuration, offset: 0x3A8 */\r\n  __I  uint32_t LMU_CPU2_STA_STATUS1;              /**< LMU CPU2 STA Status 1, offset: 0x3AC */\r\n  __IO uint32_t LMU_CPU3_STA_CFG;                  /**< LMU CPU3 STA Configuration, offset: 0x3B0 */\r\n  __I  uint32_t LMU_CPU3_STA_STATUS1;              /**< LMU CPU3 STA Status 1, offset: 0x3B4 */\r\n  __IO uint32_t LMU_G2BIST_CTRL;                   /**< LMU G2BIST Control, offset: 0x3B8 */\r\n  __I  uint32_t LMU_STATUS;                        /**< LMU Status, offset: 0x3BC */\r\n  __IO uint32_t LMU_STA_CFG_MASK;                  /**< LMU STA Configuration Mask, offset: 0x3C0 */\r\n  __I  uint32_t LMU_CPU2_STA_STATUS2;              /**< LMU CPU2 STA Status 2, offset: 0x3C4 */\r\n  __I  uint32_t LMU_CPU3_STA_STATUS2;              /**< LMU CPU3 STA Status 2, offset: 0x3C8 */\r\n       uint8_t RESERVED_14[4];\r\n  __IO uint32_t CPU3_HOST_WKUP_MASK;               /**< CPU3 Host Wakeup Mask, offset: 0x3D0 */\r\n  __IO uint32_t CPU3_HOST_WKUP_POL;                /**< CPU3 Host Wakeup Polarity, offset: 0x3D4 */\r\n  __IO uint32_t CPU3_HOST_WKUP_CTRL;               /**< CPU3 Host Wakeup Control, offset: 0x3D8 */\r\n  __IO uint32_t CPU3_CTRL;                         /**< CPU3 Control, offset: 0x3DC */\r\n  __IO uint32_t CPU3_DVFS_CTRL;                    /**< CPU3 DVFS Control, offset: 0x3E0 */\r\n  __IO uint32_t CPU3_FREQ_REG1;                    /**< CPU3 Frequency 1, offset: 0x3E4 */\r\n  __IO uint32_t CPU3_FREQ_REG2;                    /**< CPU3 Frequency 2, offset: 0x3E8 */\r\n  __IO uint32_t CPU3_PLL_EN_REG;                   /**< CPU3 PLL Enable, offset: 0x3EC */\r\n  __IO uint32_t CPU3_VOL_REG1;                     /**< CPU3 Voltage 1, offset: 0x3F0 */\r\n  __IO uint32_t CPU3_VOL_REG2;                     /**< CPU3 Voltage 2, offset: 0x3F4 */\r\n  __IO uint32_t CPU3_VOL_REG3;                     /**< CPU3 Voltage 3, offset: 0x3F8 */\r\n  __IO uint32_t CPU3_VOL_REG4;                     /**< CPU3 Voltage 4, offset: 0x3FC */\r\n} APU_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- APU Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup APU_Register_Masks APU Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name APU_IP_REVISION - APU IP revision */\r\n/*! @{ */\r\n\r\n#define APU_APU_IP_REVISION_IP_REV_MASK          (0xFFFFU)\r\n#define APU_APU_IP_REVISION_IP_REV_SHIFT         (0U)\r\n/*! IP_REV - IP revision */\r\n#define APU_APU_IP_REVISION_IP_REV(x)            (((uint32_t)(((uint32_t)(x)) << APU_APU_IP_REVISION_IP_REV_SHIFT)) & APU_APU_IP_REVISION_IP_REV_MASK)\r\n/*! @} */\r\n\r\n/*! @name CTRL - Control */\r\n/*! @{ */\r\n\r\n#define APU_CTRL_CPU1_PD_MASK_MASK               (0x1U)\r\n#define APU_CTRL_CPU1_PD_MASK_SHIFT              (0U)\r\n/*! CPU1_PD_MASK - CPU1 Pd Mask */\r\n#define APU_CTRL_CPU1_PD_MASK(x)                 (((uint32_t)(((uint32_t)(x)) << APU_CTRL_CPU1_PD_MASK_SHIFT)) & APU_CTRL_CPU1_PD_MASK_MASK)\r\n\r\n#define APU_CTRL_FW_CPU1_PD_MASK                 (0x2U)\r\n#define APU_CTRL_FW_CPU1_PD_SHIFT                (1U)\r\n/*! FW_CPU1_PD - FW CPU1 Pd */\r\n#define APU_CTRL_FW_CPU1_PD(x)                   (((uint32_t)(((uint32_t)(x)) << APU_CTRL_FW_CPU1_PD_SHIFT)) & APU_CTRL_FW_CPU1_PD_MASK)\r\n\r\n#define APU_CTRL_WLCOMN_USE_NOM_PWR_BYP_MASK     (0x8U)\r\n#define APU_CTRL_WLCOMN_USE_NOM_PWR_BYP_SHIFT    (3U)\r\n/*! WLCOMN_USE_NOM_PWR_BYP - WLAN comman domain uses nominal voltage */\r\n#define APU_CTRL_WLCOMN_USE_NOM_PWR_BYP(x)       (((uint32_t)(((uint32_t)(x)) << APU_CTRL_WLCOMN_USE_NOM_PWR_BYP_SHIFT)) & APU_CTRL_WLCOMN_USE_NOM_PWR_BYP_MASK)\r\n\r\n#define APU_CTRL_APU_SUBSYS1_HOST_MASK           (0x70U)\r\n#define APU_CTRL_APU_SUBSYS1_HOST_SHIFT          (4U)\r\n/*! APU_SUBSYS1_HOST - APU Subsystem1 Host */\r\n#define APU_CTRL_APU_SUBSYS1_HOST(x)             (((uint32_t)(((uint32_t)(x)) << APU_CTRL_APU_SUBSYS1_HOST_SHIFT)) & APU_CTRL_APU_SUBSYS1_HOST_MASK)\r\n\r\n#define APU_CTRL_APU_CAL_DONE_CLEAR_METHOD_MASK  (0x80U)\r\n#define APU_CTRL_APU_CAL_DONE_CLEAR_METHOD_SHIFT (7U)\r\n/*! APU_CAL_DONE_CLEAR_METHOD - 1- use falling edge of apu_sw_acc_rst to clear the apu_cal_done after FW polls the apu_cal_done = 1 */\r\n#define APU_CTRL_APU_CAL_DONE_CLEAR_METHOD(x)    (((uint32_t)(((uint32_t)(x)) << APU_CTRL_APU_CAL_DONE_CLEAR_METHOD_SHIFT)) & APU_CTRL_APU_CAL_DONE_CLEAR_METHOD_MASK)\r\n\r\n#define APU_CTRL_ENTER_ALL_SLEEP_MODE_MASK       (0x100U)\r\n#define APU_CTRL_ENTER_ALL_SLEEP_MODE_SHIFT      (8U)\r\n/*! ENTER_ALL_SLEEP_MODE - Enter All Sleep Mode */\r\n#define APU_CTRL_ENTER_ALL_SLEEP_MODE(x)         (((uint32_t)(((uint32_t)(x)) << APU_CTRL_ENTER_ALL_SLEEP_MODE_SHIFT)) & APU_CTRL_ENTER_ALL_SLEEP_MODE_MASK)\r\n\r\n#define APU_CTRL_USE_HOST_INTR_SLP_MASK          (0x200U)\r\n#define APU_CTRL_USE_HOST_INTR_SLP_SHIFT         (9U)\r\n/*! USE_HOST_INTR_SLP - Use Host Interrupt Sleep */\r\n#define APU_CTRL_USE_HOST_INTR_SLP(x)            (((uint32_t)(((uint32_t)(x)) << APU_CTRL_USE_HOST_INTR_SLP_SHIFT)) & APU_CTRL_USE_HOST_INTR_SLP_MASK)\r\n\r\n#define APU_CTRL_APU_ALLOW_AUTO_LOAD_MASK        (0x400U)\r\n#define APU_CTRL_APU_ALLOW_AUTO_LOAD_SHIFT       (10U)\r\n/*! APU_ALLOW_AUTO_LOAD - APU Allow Auto load */\r\n#define APU_CTRL_APU_ALLOW_AUTO_LOAD(x)          (((uint32_t)(((uint32_t)(x)) << APU_CTRL_APU_ALLOW_AUTO_LOAD_SHIFT)) & APU_CTRL_APU_ALLOW_AUTO_LOAD_MASK)\r\n\r\n#define APU_CTRL_APU_AUTO_CALIBRATE_MASK         (0x800U)\r\n#define APU_CTRL_APU_AUTO_CALIBRATE_SHIFT        (11U)\r\n/*! APU_AUTO_CALIBRATE - APU Auto Calibrate */\r\n#define APU_CTRL_APU_AUTO_CALIBRATE(x)           (((uint32_t)(((uint32_t)(x)) << APU_CTRL_APU_AUTO_CALIBRATE_SHIFT)) & APU_CTRL_APU_AUTO_CALIBRATE_MASK)\r\n\r\n#define APU_CTRL_APU_NO_TBTT_RESET_MASK          (0x1000U)\r\n#define APU_CTRL_APU_NO_TBTT_RESET_SHIFT         (12U)\r\n/*! APU_NO_TBTT_RESET - APU No TBTT Reset */\r\n#define APU_CTRL_APU_NO_TBTT_RESET(x)            (((uint32_t)(((uint32_t)(x)) << APU_CTRL_APU_NO_TBTT_RESET_SHIFT)) & APU_CTRL_APU_NO_TBTT_RESET_MASK)\r\n\r\n#define APU_CTRL_SW_TIMER_LD_MASK                (0x2000U)\r\n#define APU_CTRL_SW_TIMER_LD_SHIFT               (13U)\r\n/*! SW_TIMER_LD - SW Timer */\r\n#define APU_CTRL_SW_TIMER_LD(x)                  (((uint32_t)(((uint32_t)(x)) << APU_CTRL_SW_TIMER_LD_SHIFT)) & APU_CTRL_SW_TIMER_LD_MASK)\r\n\r\n#define APU_CTRL_RST_APU_SLPCLK_TIMER_MASK       (0x4000U)\r\n#define APU_CTRL_RST_APU_SLPCLK_TIMER_SHIFT      (14U)\r\n/*! RST_APU_SLPCLK_TIMER - Reset APU Sleep Clock Timer */\r\n#define APU_CTRL_RST_APU_SLPCLK_TIMER(x)         (((uint32_t)(((uint32_t)(x)) << APU_CTRL_RST_APU_SLPCLK_TIMER_SHIFT)) & APU_CTRL_RST_APU_SLPCLK_TIMER_MASK)\r\n\r\n#define APU_CTRL_APU_SW_ACC_RST_MASK             (0x8000U)\r\n#define APU_CTRL_APU_SW_ACC_RST_SHIFT            (15U)\r\n/*! APU_SW_ACC_RST - APU SW ACC Reset */\r\n#define APU_CTRL_APU_SW_ACC_RST(x)               (((uint32_t)(((uint32_t)(x)) << APU_CTRL_APU_SW_ACC_RST_SHIFT)) & APU_CTRL_APU_SW_ACC_RST_MASK)\r\n\r\n#define APU_CTRL_SDU_SLP_RDY_MASK_MASK           (0x20000U)\r\n#define APU_CTRL_SDU_SLP_RDY_MASK_SHIFT          (17U)\r\n/*! SDU_SLP_RDY_MASK - SDU Sleep Ready Mask */\r\n#define APU_CTRL_SDU_SLP_RDY_MASK(x)             (((uint32_t)(((uint32_t)(x)) << APU_CTRL_SDU_SLP_RDY_MASK_SHIFT)) & APU_CTRL_SDU_SLP_RDY_MASK_MASK)\r\n\r\n#define APU_CTRL_IPS_CP15_SLEEP_MASK_MASK        (0x200000U)\r\n#define APU_CTRL_IPS_CP15_SLEEP_MASK_SHIFT       (21U)\r\n/*! IPS_CP15_SLEEP_MASK - IPS CP15 Sleep Mask */\r\n#define APU_CTRL_IPS_CP15_SLEEP_MASK(x)          (((uint32_t)(((uint32_t)(x)) << APU_CTRL_IPS_CP15_SLEEP_MASK_SHIFT)) & APU_CTRL_IPS_CP15_SLEEP_MASK_MASK)\r\n\r\n#define APU_CTRL_FW_IPS_CP15_SLEEP_MASK          (0x400000U)\r\n#define APU_CTRL_FW_IPS_CP15_SLEEP_SHIFT         (22U)\r\n/*! FW_IPS_CP15_SLEEP - FW IPS CP15 Sleep */\r\n#define APU_CTRL_FW_IPS_CP15_SLEEP(x)            (((uint32_t)(((uint32_t)(x)) << APU_CTRL_FW_IPS_CP15_SLEEP_SHIFT)) & APU_CTRL_FW_IPS_CP15_SLEEP_MASK)\r\n\r\n#define APU_CTRL_CP_15_SLEEP_MASK_MASK           (0x800000U)\r\n#define APU_CTRL_CP_15_SLEEP_MASK_SHIFT          (23U)\r\n/*! CP_15_SLEEP_MASK - CP15 Sleep Mask */\r\n#define APU_CTRL_CP_15_SLEEP_MASK(x)             (((uint32_t)(((uint32_t)(x)) << APU_CTRL_CP_15_SLEEP_MASK_SHIFT)) & APU_CTRL_CP_15_SLEEP_MASK_MASK)\r\n\r\n#define APU_CTRL_FW_CP15_SLEEP_MASK              (0x1000000U)\r\n#define APU_CTRL_FW_CP15_SLEEP_SHIFT             (24U)\r\n/*! FW_CP15_SLEEP - FW CP15 Sleep */\r\n#define APU_CTRL_FW_CP15_SLEEP(x)                (((uint32_t)(((uint32_t)(x)) << APU_CTRL_FW_CP15_SLEEP_SHIFT)) & APU_CTRL_FW_CP15_SLEEP_MASK)\r\n\r\n#define APU_CTRL_CPU1_MSG_RDY_MASK_MASK          (0x2000000U)\r\n#define APU_CTRL_CPU1_MSG_RDY_MASK_SHIFT         (25U)\r\n/*! CPU1_MSG_RDY_MASK - CPU1 Message Ready Mask */\r\n#define APU_CTRL_CPU1_MSG_RDY_MASK(x)            (((uint32_t)(((uint32_t)(x)) << APU_CTRL_CPU1_MSG_RDY_MASK_SHIFT)) & APU_CTRL_CPU1_MSG_RDY_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name TIMER_PWR_MODE - Timer Power Mode */\r\n/*! @{ */\r\n\r\n#define APU_TIMER_PWR_MODE_MCI_XP_REQ_MASK_MASK  (0x1U)\r\n#define APU_TIMER_PWR_MODE_MCI_XP_REQ_MASK_SHIFT (0U)\r\n/*! MCI_XP_REQ_MASK - MCI XP Request Mask */\r\n#define APU_TIMER_PWR_MODE_MCI_XP_REQ_MASK(x)    (((uint32_t)(((uint32_t)(x)) << APU_TIMER_PWR_MODE_MCI_XP_REQ_MASK_SHIFT)) & APU_TIMER_PWR_MODE_MCI_XP_REQ_MASK_MASK)\r\n\r\n#define APU_TIMER_PWR_MODE_SLP_CLK_TIMER_EN_MASK (0x10U)\r\n#define APU_TIMER_PWR_MODE_SLP_CLK_TIMER_EN_SHIFT (4U)\r\n/*! SLP_CLK_TIMER_EN - free running sleep clock timer enable */\r\n#define APU_TIMER_PWR_MODE_SLP_CLK_TIMER_EN(x)   (((uint32_t)(((uint32_t)(x)) << APU_TIMER_PWR_MODE_SLP_CLK_TIMER_EN_SHIFT)) & APU_TIMER_PWR_MODE_SLP_CLK_TIMER_EN_MASK)\r\n\r\n#define APU_TIMER_PWR_MODE_WL_BCN_ALARM_TIMER_EN_MASK (0x20U)\r\n#define APU_TIMER_PWR_MODE_WL_BCN_ALARM_TIMER_EN_SHIFT (5U)\r\n/*! WL_BCN_ALARM_TIMER_EN - WLAN beacon alarm timer enable */\r\n#define APU_TIMER_PWR_MODE_WL_BCN_ALARM_TIMER_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_TIMER_PWR_MODE_WL_BCN_ALARM_TIMER_EN_SHIFT)) & APU_TIMER_PWR_MODE_WL_BCN_ALARM_TIMER_EN_MASK)\r\n\r\n#define APU_TIMER_PWR_MODE_WL2_BCN_ALARM_TIMER_EN_MASK (0x40U)\r\n#define APU_TIMER_PWR_MODE_WL2_BCN_ALARM_TIMER_EN_SHIFT (6U)\r\n/*! WL2_BCN_ALARM_TIMER_EN - WLAN2 beacon alarm timer enable */\r\n#define APU_TIMER_PWR_MODE_WL2_BCN_ALARM_TIMER_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_TIMER_PWR_MODE_WL2_BCN_ALARM_TIMER_EN_SHIFT)) & APU_TIMER_PWR_MODE_WL2_BCN_ALARM_TIMER_EN_MASK)\r\n\r\n#define APU_TIMER_PWR_MODE_DIS_GATED_SLP_CLK_MASK (0x80U)\r\n#define APU_TIMER_PWR_MODE_DIS_GATED_SLP_CLK_SHIFT (7U)\r\n/*! DIS_GATED_SLP_CLK - Disable Gated Sleep Clock */\r\n#define APU_TIMER_PWR_MODE_DIS_GATED_SLP_CLK(x)  (((uint32_t)(((uint32_t)(x)) << APU_TIMER_PWR_MODE_DIS_GATED_SLP_CLK_SHIFT)) & APU_TIMER_PWR_MODE_DIS_GATED_SLP_CLK_MASK)\r\n\r\n#define APU_TIMER_PWR_MODE_XP_OPT_EN_MASK        (0x1000U)\r\n#define APU_TIMER_PWR_MODE_XP_OPT_EN_SHIFT       (12U)\r\n/*! XP_OPT_EN - Set to 1 to enable the sleep FSM to look for wakeup req after power shutdown and before reference clock shutdown. */\r\n#define APU_TIMER_PWR_MODE_XP_OPT_EN(x)          (((uint32_t)(((uint32_t)(x)) << APU_TIMER_PWR_MODE_XP_OPT_EN_SHIFT)) & APU_TIMER_PWR_MODE_XP_OPT_EN_MASK)\r\n\r\n#define APU_TIMER_PWR_MODE_DIS_APU_INTR_ON_WAKEUP_MASK (0x2000U)\r\n#define APU_TIMER_PWR_MODE_DIS_APU_INTR_ON_WAKEUP_SHIFT (13U)\r\n/*! DIS_APU_INTR_ON_WAKEUP - Disable APU Interrupt on Wakeup */\r\n#define APU_TIMER_PWR_MODE_DIS_APU_INTR_ON_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << APU_TIMER_PWR_MODE_DIS_APU_INTR_ON_WAKEUP_SHIFT)) & APU_TIMER_PWR_MODE_DIS_APU_INTR_ON_WAKEUP_MASK)\r\n\r\n#define APU_TIMER_PWR_MODE_SOC_XOSC_PWR_ON_MASK  (0x20000U)\r\n#define APU_TIMER_PWR_MODE_SOC_XOSC_PWR_ON_SHIFT (17U)\r\n/*! SOC_XOSC_PWR_ON - SoC XOSC Power on */\r\n#define APU_TIMER_PWR_MODE_SOC_XOSC_PWR_ON(x)    (((uint32_t)(((uint32_t)(x)) << APU_TIMER_PWR_MODE_SOC_XOSC_PWR_ON_SHIFT)) & APU_TIMER_PWR_MODE_SOC_XOSC_PWR_ON_MASK)\r\n\r\n#define APU_TIMER_PWR_MODE_ENA_FAST_WKUP_MASK    (0x40000U)\r\n#define APU_TIMER_PWR_MODE_ENA_FAST_WKUP_SHIFT   (18U)\r\n/*! ENA_FAST_WKUP - Enable Fast Wakeup */\r\n#define APU_TIMER_PWR_MODE_ENA_FAST_WKUP(x)      (((uint32_t)(((uint32_t)(x)) << APU_TIMER_PWR_MODE_ENA_FAST_WKUP_SHIFT)) & APU_TIMER_PWR_MODE_ENA_FAST_WKUP_MASK)\r\n\r\n#define APU_TIMER_PWR_MODE_GENERIC_TIMER_EN_MASK (0x200000U)\r\n#define APU_TIMER_PWR_MODE_GENERIC_TIMER_EN_SHIFT (21U)\r\n/*! GENERIC_TIMER_EN - Enable sleep timer to generate interrupt when value matches generic timer value. Debug only */\r\n#define APU_TIMER_PWR_MODE_GENERIC_TIMER_EN(x)   (((uint32_t)(((uint32_t)(x)) << APU_TIMER_PWR_MODE_GENERIC_TIMER_EN_SHIFT)) & APU_TIMER_PWR_MODE_GENERIC_TIMER_EN_MASK)\r\n\r\n#define APU_TIMER_PWR_MODE_GENERIC_TIMER_BYPASS_MASK (0x400000U)\r\n#define APU_TIMER_PWR_MODE_GENERIC_TIMER_BYPASS_SHIFT (22U)\r\n/*! GENERIC_TIMER_BYPASS - When set to 1, generic_alarm_en2 will be used for generic_alarm_en1 */\r\n#define APU_TIMER_PWR_MODE_GENERIC_TIMER_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << APU_TIMER_PWR_MODE_GENERIC_TIMER_BYPASS_SHIFT)) & APU_TIMER_PWR_MODE_GENERIC_TIMER_BYPASS_MASK)\r\n\r\n#define APU_TIMER_PWR_MODE_XOSC_ON_WHILE_SLEEP_MASK (0x800000U)\r\n#define APU_TIMER_PWR_MODE_XOSC_ON_WHILE_SLEEP_SHIFT (23U)\r\n/*! XOSC_ON_WHILE_SLEEP - XOSC On While Sleep */\r\n#define APU_TIMER_PWR_MODE_XOSC_ON_WHILE_SLEEP(x) (((uint32_t)(((uint32_t)(x)) << APU_TIMER_PWR_MODE_XOSC_ON_WHILE_SLEEP_SHIFT)) & APU_TIMER_PWR_MODE_XOSC_ON_WHILE_SLEEP_MASK)\r\n\r\n#define APU_TIMER_PWR_MODE_USE_HSIC_SLP_SYNC_MASK (0x1000000U)\r\n#define APU_TIMER_PWR_MODE_USE_HSIC_SLP_SYNC_SHIFT (24U)\r\n/*! USE_HSIC_SLP_SYNC - Use HSIC Sleep Sync */\r\n#define APU_TIMER_PWR_MODE_USE_HSIC_SLP_SYNC(x)  (((uint32_t)(((uint32_t)(x)) << APU_TIMER_PWR_MODE_USE_HSIC_SLP_SYNC_SHIFT)) & APU_TIMER_PWR_MODE_USE_HSIC_SLP_SYNC_MASK)\r\n/*! @} */\r\n\r\n/*! @name PWR_CTRL - Power Control */\r\n/*! @{ */\r\n\r\n#define APU_PWR_CTRL_APU_PD_CTRL_EN_MASK         (0x1U)\r\n#define APU_PWR_CTRL_APU_PD_CTRL_EN_SHIFT        (0U)\r\n/*! APU_PD_CTRL_EN - APU power domain control enable */\r\n#define APU_PWR_CTRL_APU_PD_CTRL_EN(x)           (((uint32_t)(((uint32_t)(x)) << APU_PWR_CTRL_APU_PD_CTRL_EN_SHIFT)) & APU_PWR_CTRL_APU_PD_CTRL_EN_MASK)\r\n\r\n#define APU_PWR_CTRL_APU_SW_PD_EN_MASK           (0x2U)\r\n#define APU_PWR_CTRL_APU_SW_PD_EN_SHIFT          (1U)\r\n/*! APU_SW_PD_EN - APU switch power down enable */\r\n#define APU_PWR_CTRL_APU_SW_PD_EN(x)             (((uint32_t)(((uint32_t)(x)) << APU_PWR_CTRL_APU_SW_PD_EN_SHIFT)) & APU_PWR_CTRL_APU_SW_PD_EN_MASK)\r\n\r\n#define APU_PWR_CTRL_APU_UDR_FIREWALL_BAR_EN_MASK (0x4U)\r\n#define APU_PWR_CTRL_APU_UDR_FIREWALL_BAR_EN_SHIFT (2U)\r\n/*! APU_UDR_FIREWALL_BAR_EN - APU UDR enable */\r\n#define APU_PWR_CTRL_APU_UDR_FIREWALL_BAR_EN(x)  (((uint32_t)(((uint32_t)(x)) << APU_PWR_CTRL_APU_UDR_FIREWALL_BAR_EN_SHIFT)) & APU_PWR_CTRL_APU_UDR_FIREWALL_BAR_EN_MASK)\r\n\r\n#define APU_PWR_CTRL_APU_ISO_CELL_EN_MASK        (0x8U)\r\n#define APU_PWR_CTRL_APU_ISO_CELL_EN_SHIFT       (3U)\r\n/*! APU_ISO_CELL_EN - APU isolation enable */\r\n#define APU_PWR_CTRL_APU_ISO_CELL_EN(x)          (((uint32_t)(((uint32_t)(x)) << APU_PWR_CTRL_APU_ISO_CELL_EN_SHIFT)) & APU_PWR_CTRL_APU_ISO_CELL_EN_MASK)\r\n\r\n#define APU_PWR_CTRL_DLY_UDR2ISO_MASK            (0x10U)\r\n#define APU_PWR_CTRL_DLY_UDR2ISO_SHIFT           (4U)\r\n/*! DLY_UDR2ISO - UDR firewall_bar to isolation delay enable */\r\n#define APU_PWR_CTRL_DLY_UDR2ISO(x)              (((uint32_t)(((uint32_t)(x)) << APU_PWR_CTRL_DLY_UDR2ISO_SHIFT)) & APU_PWR_CTRL_DLY_UDR2ISO_MASK)\r\n\r\n#define APU_PWR_CTRL_ISO_ENABLE_REFCK_MASK       (0x20U)\r\n#define APU_PWR_CTRL_ISO_ENABLE_REFCK_SHIFT      (5U)\r\n/*! ISO_ENABLE_REFCK - ISO Enable Reference Clock */\r\n#define APU_PWR_CTRL_ISO_ENABLE_REFCK(x)         (((uint32_t)(((uint32_t)(x)) << APU_PWR_CTRL_ISO_ENABLE_REFCK_SHIFT)) & APU_PWR_CTRL_ISO_ENABLE_REFCK_MASK)\r\n\r\n#define APU_PWR_CTRL_NON_UDR_RSTB_EN_MASK        (0x40U)\r\n#define APU_PWR_CTRL_NON_UDR_RSTB_EN_SHIFT       (6U)\r\n/*! NON_UDR_RSTB_EN - APU non-UDR reset enable */\r\n#define APU_PWR_CTRL_NON_UDR_RSTB_EN(x)          (((uint32_t)(((uint32_t)(x)) << APU_PWR_CTRL_NON_UDR_RSTB_EN_SHIFT)) & APU_PWR_CTRL_NON_UDR_RSTB_EN_MASK)\r\n\r\n#define APU_PWR_CTRL_XOSC_OFF_DURING_POWER_OFF_MASK (0x80U)\r\n#define APU_PWR_CTRL_XOSC_OFF_DURING_POWER_OFF_SHIFT (7U)\r\n/*! XOSC_OFF_DURING_POWER_OFF - XOSC Off During Power Off */\r\n#define APU_PWR_CTRL_XOSC_OFF_DURING_POWER_OFF(x) (((uint32_t)(((uint32_t)(x)) << APU_PWR_CTRL_XOSC_OFF_DURING_POWER_OFF_SHIFT)) & APU_PWR_CTRL_XOSC_OFF_DURING_POWER_OFF_MASK)\r\n\r\n#define APU_PWR_CTRL_SRAM_PD_EN_MASK             (0x100U)\r\n#define APU_PWR_CTRL_SRAM_PD_EN_SHIFT            (8U)\r\n/*! SRAM_PD_EN - APU SRAM power down enable */\r\n#define APU_PWR_CTRL_SRAM_PD_EN(x)               (((uint32_t)(((uint32_t)(x)) << APU_PWR_CTRL_SRAM_PD_EN_SHIFT)) & APU_PWR_CTRL_SRAM_PD_EN_MASK)\r\n\r\n#define APU_PWR_CTRL_CLK_DIV_RESETB_ENABLE_MASK  (0x200U)\r\n#define APU_PWR_CTRL_CLK_DIV_RESETB_ENABLE_SHIFT (9U)\r\n/*! CLK_DIV_RESETB_ENABLE - CLK_DIV_RESETB Enable */\r\n#define APU_PWR_CTRL_CLK_DIV_RESETB_ENABLE(x)    (((uint32_t)(((uint32_t)(x)) << APU_PWR_CTRL_CLK_DIV_RESETB_ENABLE_SHIFT)) & APU_PWR_CTRL_CLK_DIV_RESETB_ENABLE_MASK)\r\n\r\n#define APU_PWR_CTRL_CLK_DIV_RESETB_REFCLK_MASK  (0x400U)\r\n#define APU_PWR_CTRL_CLK_DIV_RESETB_REFCLK_SHIFT (10U)\r\n/*! CLK_DIV_RESETB_REFCLK - CLK_DIV_RESETB Reference Clock */\r\n#define APU_PWR_CTRL_CLK_DIV_RESETB_REFCLK(x)    (((uint32_t)(((uint32_t)(x)) << APU_PWR_CTRL_CLK_DIV_RESETB_REFCLK_SHIFT)) & APU_PWR_CTRL_CLK_DIV_RESETB_REFCLK_MASK)\r\n\r\n#define APU_PWR_CTRL_SOC_USE_NOM_VOL_BYP_MASK    (0x800U)\r\n#define APU_PWR_CTRL_SOC_USE_NOM_VOL_BYP_SHIFT   (11U)\r\n/*! SOC_USE_NOM_VOL_BYP - SoC Use Nominal Vol Bypass */\r\n#define APU_PWR_CTRL_SOC_USE_NOM_VOL_BYP(x)      (((uint32_t)(((uint32_t)(x)) << APU_PWR_CTRL_SOC_USE_NOM_VOL_BYP_SHIFT)) & APU_PWR_CTRL_SOC_USE_NOM_VOL_BYP_MASK)\r\n\r\n#define APU_PWR_CTRL_SOC_USE_UNSYNC_VOL_LVL_MASK (0x1000U)\r\n#define APU_PWR_CTRL_SOC_USE_UNSYNC_VOL_LVL_SHIFT (12U)\r\n/*! SOC_USE_UNSYNC_VOL_LVL - SoC Use unSync Vol Level */\r\n#define APU_PWR_CTRL_SOC_USE_UNSYNC_VOL_LVL(x)   (((uint32_t)(((uint32_t)(x)) << APU_PWR_CTRL_SOC_USE_UNSYNC_VOL_LVL_SHIFT)) & APU_PWR_CTRL_SOC_USE_UNSYNC_VOL_LVL_MASK)\r\n\r\n#define APU_PWR_CTRL_RFU_IN_WLAN_DOMAIN_MASK     (0x2000U)\r\n#define APU_PWR_CTRL_RFU_IN_WLAN_DOMAIN_SHIFT    (13U)\r\n/*! RFU_IN_WLAN_DOMAIN - RFU WLAN mode */\r\n#define APU_PWR_CTRL_RFU_IN_WLAN_DOMAIN(x)       (((uint32_t)(((uint32_t)(x)) << APU_PWR_CTRL_RFU_IN_WLAN_DOMAIN_SHIFT)) & APU_PWR_CTRL_RFU_IN_WLAN_DOMAIN_MASK)\r\n\r\n#define APU_PWR_CTRL_DLY_NON_UDR_RSTB_MASK       (0x4000U)\r\n#define APU_PWR_CTRL_DLY_NON_UDR_RSTB_SHIFT      (14U)\r\n/*! DLY_NON_UDR_RSTB - Delay non-UDR RSTb */\r\n#define APU_PWR_CTRL_DLY_NON_UDR_RSTB(x)         (((uint32_t)(((uint32_t)(x)) << APU_PWR_CTRL_DLY_NON_UDR_RSTB_SHIFT)) & APU_PWR_CTRL_DLY_NON_UDR_RSTB_MASK)\r\n\r\n#define APU_PWR_CTRL_PCIE_P_REQ_MASK_FOR_SLPFSM_MASK (0x8000U)\r\n#define APU_PWR_CTRL_PCIE_P_REQ_MASK_FOR_SLPFSM_SHIFT (15U)\r\n/*! PCIE_P_REQ_MASK_FOR_SLPFSM - Mask pcie_p_req and pcie_xp_req for slp_fsm */\r\n#define APU_PWR_CTRL_PCIE_P_REQ_MASK_FOR_SLPFSM(x) (((uint32_t)(((uint32_t)(x)) << APU_PWR_CTRL_PCIE_P_REQ_MASK_FOR_SLPFSM_SHIFT)) & APU_PWR_CTRL_PCIE_P_REQ_MASK_FOR_SLPFSM_MASK)\r\n/*! @} */\r\n\r\n/*! @name PLL_CTRL - PLL Control */\r\n/*! @{ */\r\n\r\n#define APU_PLL_CTRL_DIS_APU_PLL_EN0_MASK        (0x1U)\r\n#define APU_PLL_CTRL_DIS_APU_PLL_EN0_SHIFT       (0U)\r\n/*! DIS_APU_PLL_EN0 - When set to 1, apu_pll_en[0]=0 (pll0 is Tcpu in Skyhawk) */\r\n#define APU_PLL_CTRL_DIS_APU_PLL_EN0(x)          (((uint32_t)(((uint32_t)(x)) << APU_PLL_CTRL_DIS_APU_PLL_EN0_SHIFT)) & APU_PLL_CTRL_DIS_APU_PLL_EN0_MASK)\r\n\r\n#define APU_PLL_CTRL_DIS_APU_PLL_EN1_MASK        (0x2U)\r\n#define APU_PLL_CTRL_DIS_APU_PLL_EN1_SHIFT       (1U)\r\n/*! DIS_APU_PLL_EN1 - When set to 1, apu_pll_en[1]=0 (pll1 is Tsoc in Skyhawk) */\r\n#define APU_PLL_CTRL_DIS_APU_PLL_EN1(x)          (((uint32_t)(((uint32_t)(x)) << APU_PLL_CTRL_DIS_APU_PLL_EN1_SHIFT)) & APU_PLL_CTRL_DIS_APU_PLL_EN1_MASK)\r\n\r\n#define APU_PLL_CTRL_FW_USE_PLL0_MASK            (0x10U)\r\n#define APU_PLL_CTRL_FW_USE_PLL0_SHIFT           (4U)\r\n/*! FW_USE_PLL0 - When set to 1, FW controls pll_en[0] value (pll0 is Tcpu in Skyhawk) */\r\n#define APU_PLL_CTRL_FW_USE_PLL0(x)              (((uint32_t)(((uint32_t)(x)) << APU_PLL_CTRL_FW_USE_PLL0_SHIFT)) & APU_PLL_CTRL_FW_USE_PLL0_MASK)\r\n\r\n#define APU_PLL_CTRL_FW_PLL0_EN_SET_MASK         (0x20U)\r\n#define APU_PLL_CTRL_FW_PLL0_EN_SET_SHIFT        (5U)\r\n/*! FW_PLL0_EN_SET - Fw sets pll_en[0] value when apu_pll_ctrl[4] = 1, */\r\n#define APU_PLL_CTRL_FW_PLL0_EN_SET(x)           (((uint32_t)(((uint32_t)(x)) << APU_PLL_CTRL_FW_PLL0_EN_SET_SHIFT)) & APU_PLL_CTRL_FW_PLL0_EN_SET_MASK)\r\n\r\n#define APU_PLL_CTRL_FW_USE_PLL1_MASK            (0x100U)\r\n#define APU_PLL_CTRL_FW_USE_PLL1_SHIFT           (8U)\r\n/*! FW_USE_PLL1 - When set to 1, FW controls pll_en[1] value (pll0 is Tcpu in Skyhawk) */\r\n#define APU_PLL_CTRL_FW_USE_PLL1(x)              (((uint32_t)(((uint32_t)(x)) << APU_PLL_CTRL_FW_USE_PLL1_SHIFT)) & APU_PLL_CTRL_FW_USE_PLL1_MASK)\r\n\r\n#define APU_PLL_CTRL_FW_PLL1_EN_SET_MASK         (0x200U)\r\n#define APU_PLL_CTRL_FW_PLL1_EN_SET_SHIFT        (9U)\r\n/*! FW_PLL1_EN_SET - Fw sets pll_en[1] value when apu_pll_ctrl[4] = 1, */\r\n#define APU_PLL_CTRL_FW_PLL1_EN_SET(x)           (((uint32_t)(((uint32_t)(x)) << APU_PLL_CTRL_FW_PLL1_EN_SET_SHIFT)) & APU_PLL_CTRL_FW_PLL1_EN_SET_MASK)\r\n/*! @} */\r\n\r\n/*! @name PLL_DIS_CNT - PLL Disable Count */\r\n/*! @{ */\r\n\r\n#define APU_PLL_DIS_CNT_PLL_DIS_CNT_MASK         (0xFFFFU)\r\n#define APU_PLL_DIS_CNT_PLL_DIS_CNT_SHIFT        (0U)\r\n/*! PLL_DIS_CNT - PLL disable count in reference clocks */\r\n#define APU_PLL_DIS_CNT_PLL_DIS_CNT(x)           (((uint32_t)(((uint32_t)(x)) << APU_PLL_DIS_CNT_PLL_DIS_CNT_SHIFT)) & APU_PLL_DIS_CNT_PLL_DIS_CNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name STABLE_CNT - Stable Count */\r\n/*! @{ */\r\n\r\n#define APU_STABLE_CNT_XOSC_STABLE_CNT_MASK      (0xFFFFU)\r\n#define APU_STABLE_CNT_XOSC_STABLE_CNT_SHIFT     (0U)\r\n/*! XOSC_STABLE_CNT - XOSC stable count in sleep clocks after APU asserts xosc_en */\r\n#define APU_STABLE_CNT_XOSC_STABLE_CNT(x)        (((uint32_t)(((uint32_t)(x)) << APU_STABLE_CNT_XOSC_STABLE_CNT_SHIFT)) & APU_STABLE_CNT_XOSC_STABLE_CNT_MASK)\r\n\r\n#define APU_STABLE_CNT_PLL_STABLE_CNT_MASK       (0xFFFF0000U)\r\n#define APU_STABLE_CNT_PLL_STABLE_CNT_SHIFT      (16U)\r\n/*! PLL_STABLE_CNT - PLL stable count in sleep clocks after APU asserts pll_en */\r\n#define APU_STABLE_CNT_PLL_STABLE_CNT(x)         (((uint32_t)(((uint32_t)(x)) << APU_STABLE_CNT_PLL_STABLE_CNT_SHIFT)) & APU_STABLE_CNT_PLL_STABLE_CNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU1_HOST_WKUP_MASK - CPU1 Host Wakeup Mask */\r\n/*! @{ */\r\n\r\n#define APU_CPU1_HOST_WKUP_MASK_HOST_WKUP_MASK_MASK (0xFFFFU)\r\n#define APU_CPU1_HOST_WKUP_MASK_HOST_WKUP_MASK_SHIFT (0U)\r\n/*! HOST_WKUP_MASK - Host Wakeup Mask */\r\n#define APU_CPU1_HOST_WKUP_MASK_HOST_WKUP_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU1_HOST_WKUP_MASK_HOST_WKUP_MASK_SHIFT)) & APU_CPU1_HOST_WKUP_MASK_HOST_WKUP_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU1_HOST_WKUP_POL - CPU1 Host Wakeup Polarity */\r\n/*! @{ */\r\n\r\n#define APU_CPU1_HOST_WKUP_POL_HOST_WKUP_POL_MASK (0xFFFFU)\r\n#define APU_CPU1_HOST_WKUP_POL_HOST_WKUP_POL_SHIFT (0U)\r\n/*! HOST_WKUP_POL - Host Wakeup Polarity */\r\n#define APU_CPU1_HOST_WKUP_POL_HOST_WKUP_POL(x)  (((uint32_t)(((uint32_t)(x)) << APU_CPU1_HOST_WKUP_POL_HOST_WKUP_POL_SHIFT)) & APU_CPU1_HOST_WKUP_POL_HOST_WKUP_POL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CAL_WIN_CNT - Calibration Window Count */\r\n/*! @{ */\r\n\r\n#define APU_CAL_WIN_CNT_APU_CAL_WIN_CNT_MASK     (0xFFFFFFFFU)\r\n#define APU_CAL_WIN_CNT_APU_CAL_WIN_CNT_SHIFT    (0U)\r\n/*! APU_CAL_WIN_CNT - Number of calibration clocks elapsed during calibration window */\r\n#define APU_CAL_WIN_CNT_APU_CAL_WIN_CNT(x)       (((uint32_t)(((uint32_t)(x)) << APU_CAL_WIN_CNT_APU_CAL_WIN_CNT_SHIFT)) & APU_CAL_WIN_CNT_APU_CAL_WIN_CNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name AUTO_10US - Auto 10us */\r\n/*! @{ */\r\n\r\n#define APU_AUTO_10US_APU_AUTO_10US_MASK         (0xFFFFFFFFU)\r\n#define APU_AUTO_10US_APU_AUTO_10US_SHIFT        (0U)\r\n/*! APU_AUTO_10US - auto alarm value loaded during auto calibration */\r\n#define APU_AUTO_10US_APU_AUTO_10US(x)           (((uint32_t)(((uint32_t)(x)) << APU_AUTO_10US_APU_AUTO_10US_SHIFT)) & APU_AUTO_10US_APU_AUTO_10US_MASK)\r\n/*! @} */\r\n\r\n/*! @name ACC_CNT - Accumulation Count */\r\n/*! @{ */\r\n\r\n#define APU_ACC_CNT_APU_ACC_CNT_MASK             (0xFFFFFFFFU)\r\n#define APU_ACC_CNT_APU_ACC_CNT_SHIFT            (0U)\r\n/*! APU_ACC_CNT - number of sleep clocks elapsed during the calibration window */\r\n#define APU_ACC_CNT_APU_ACC_CNT(x)               (((uint32_t)(((uint32_t)(x)) << APU_ACC_CNT_APU_ACC_CNT_SHIFT)) & APU_ACC_CNT_APU_ACC_CNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name CAL_WIN_SIZE - Calibration Window Size */\r\n/*! @{ */\r\n\r\n#define APU_CAL_WIN_SIZE_APU_CAL_WIN_SIZE_MASK   (0xFFFFFFFFU)\r\n#define APU_CAL_WIN_SIZE_APU_CAL_WIN_SIZE_SHIFT  (0U)\r\n/*! APU_CAL_WIN_SIZE - calibration window size in number of calibration clocks. */\r\n#define APU_CAL_WIN_SIZE_APU_CAL_WIN_SIZE(x)     (((uint32_t)(((uint32_t)(x)) << APU_CAL_WIN_SIZE_APU_CAL_WIN_SIZE_SHIFT)) & APU_CAL_WIN_SIZE_APU_CAL_WIN_SIZE_MASK)\r\n/*! @} */\r\n\r\n/*! @name SLP_CLK_TIMER - Sleep Clock Timer */\r\n/*! @{ */\r\n\r\n#define APU_SLP_CLK_TIMER_APU_SLP_CLK_TIMER_MASK (0xFFFFFFFFU)\r\n#define APU_SLP_CLK_TIMER_APU_SLP_CLK_TIMER_SHIFT (0U)\r\n/*! APU_SLP_CLK_TIMER - reads back the current value of the free running sleep clock counter. */\r\n#define APU_SLP_CLK_TIMER_APU_SLP_CLK_TIMER(x)   (((uint32_t)(((uint32_t)(x)) << APU_SLP_CLK_TIMER_APU_SLP_CLK_TIMER_SHIFT)) & APU_SLP_CLK_TIMER_APU_SLP_CLK_TIMER_MASK)\r\n/*! @} */\r\n\r\n/*! @name STATUS_RD - Status Read */\r\n/*! @{ */\r\n\r\n#define APU_STATUS_RD_CALIBRATION_STATUS_MASK    (0x1U)\r\n#define APU_STATUS_RD_CALIBRATION_STATUS_SHIFT   (0U)\r\n/*! CALIBRATION_STATUS - Calibration Status */\r\n#define APU_STATUS_RD_CALIBRATION_STATUS(x)      (((uint32_t)(((uint32_t)(x)) << APU_STATUS_RD_CALIBRATION_STATUS_SHIFT)) & APU_STATUS_RD_CALIBRATION_STATUS_MASK)\r\n\r\n#define APU_STATUS_RD_APU_PLL_STABLE_0_MASK      (0x2U)\r\n#define APU_STATUS_RD_APU_PLL_STABLE_0_SHIFT     (1U)\r\n/*! APU_PLL_STABLE_0 - T1 PLL stable */\r\n#define APU_STATUS_RD_APU_PLL_STABLE_0(x)        (((uint32_t)(((uint32_t)(x)) << APU_STATUS_RD_APU_PLL_STABLE_0_SHIFT)) & APU_STATUS_RD_APU_PLL_STABLE_0_MASK)\r\n\r\n#define APU_STATUS_RD_APU_PLL_STABLE_1_MASK      (0x4U)\r\n#define APU_STATUS_RD_APU_PLL_STABLE_1_SHIFT     (2U)\r\n/*! APU_PLL_STABLE_1 - APU PLL Stable[1] */\r\n#define APU_STATUS_RD_APU_PLL_STABLE_1(x)        (((uint32_t)(((uint32_t)(x)) << APU_STATUS_RD_APU_PLL_STABLE_1_SHIFT)) & APU_STATUS_RD_APU_PLL_STABLE_1_MASK)\r\n\r\n#define APU_STATUS_RD_APU_XOSC_STABLE_MASK       (0x8U)\r\n#define APU_STATUS_RD_APU_XOSC_STABLE_SHIFT      (3U)\r\n/*! APU_XOSC_STABLE - APU XOSC Stable */\r\n#define APU_STATUS_RD_APU_XOSC_STABLE(x)         (((uint32_t)(((uint32_t)(x)) << APU_STATUS_RD_APU_XOSC_STABLE_SHIFT)) & APU_STATUS_RD_APU_XOSC_STABLE_MASK)\r\n\r\n#define APU_STATUS_RD_APU_BT2_CLK_EN_MASK        (0x10U)\r\n#define APU_STATUS_RD_APU_BT2_CLK_EN_SHIFT       (4U)\r\n/*! APU_BT2_CLK_EN - APU Bluetooth2 Clock Enable */\r\n#define APU_STATUS_RD_APU_BT2_CLK_EN(x)          (((uint32_t)(((uint32_t)(x)) << APU_STATUS_RD_APU_BT2_CLK_EN_SHIFT)) & APU_STATUS_RD_APU_BT2_CLK_EN_MASK)\r\n\r\n#define APU_STATUS_RD_APU_MAC_CLK_EN2_MASK       (0x20U)\r\n#define APU_STATUS_RD_APU_MAC_CLK_EN2_SHIFT      (5U)\r\n/*! APU_MAC_CLK_EN2 - APU MAC Clock Enable 2 */\r\n#define APU_STATUS_RD_APU_MAC_CLK_EN2(x)         (((uint32_t)(((uint32_t)(x)) << APU_STATUS_RD_APU_MAC_CLK_EN2_SHIFT)) & APU_STATUS_RD_APU_MAC_CLK_EN2_MASK)\r\n\r\n#define APU_STATUS_RD_APU_BT_CLK_EN_MASK         (0x40U)\r\n#define APU_STATUS_RD_APU_BT_CLK_EN_SHIFT        (6U)\r\n/*! APU_BT_CLK_EN - APU Bluetooth Clock Enable */\r\n#define APU_STATUS_RD_APU_BT_CLK_EN(x)           (((uint32_t)(((uint32_t)(x)) << APU_STATUS_RD_APU_BT_CLK_EN_SHIFT)) & APU_STATUS_RD_APU_BT_CLK_EN_MASK)\r\n\r\n#define APU_STATUS_RD_APU_MAC_CLK_EN1_MASK       (0x80U)\r\n#define APU_STATUS_RD_APU_MAC_CLK_EN1_SHIFT      (7U)\r\n/*! APU_MAC_CLK_EN1 - APU MAC Clock Enable 1 */\r\n#define APU_STATUS_RD_APU_MAC_CLK_EN1(x)         (((uint32_t)(((uint32_t)(x)) << APU_STATUS_RD_APU_MAC_CLK_EN1_SHIFT)) & APU_STATUS_RD_APU_MAC_CLK_EN1_MASK)\r\n\r\n#define APU_STATUS_RD_APU_SYS_CLK_EN_MASK        (0x100U)\r\n#define APU_STATUS_RD_APU_SYS_CLK_EN_SHIFT       (8U)\r\n/*! APU_SYS_CLK_EN - APU System Clock Enable */\r\n#define APU_STATUS_RD_APU_SYS_CLK_EN(x)          (((uint32_t)(((uint32_t)(x)) << APU_STATUS_RD_APU_SYS_CLK_EN_SHIFT)) & APU_STATUS_RD_APU_SYS_CLK_EN_MASK)\r\n\r\n#define APU_STATUS_RD_APU_SOC_CLK_EN3_MASK       (0x200U)\r\n#define APU_STATUS_RD_APU_SOC_CLK_EN3_SHIFT      (9U)\r\n/*! APU_SOC_CLK_EN3 - APU SoC Clock Enable 3 */\r\n#define APU_STATUS_RD_APU_SOC_CLK_EN3(x)         (((uint32_t)(((uint32_t)(x)) << APU_STATUS_RD_APU_SOC_CLK_EN3_SHIFT)) & APU_STATUS_RD_APU_SOC_CLK_EN3_MASK)\r\n\r\n#define APU_STATUS_RD_APU_SOC_CLK_EN2_MASK       (0x400U)\r\n#define APU_STATUS_RD_APU_SOC_CLK_EN2_SHIFT      (10U)\r\n/*! APU_SOC_CLK_EN2 - APU SoC Clock Enable 2 */\r\n#define APU_STATUS_RD_APU_SOC_CLK_EN2(x)         (((uint32_t)(((uint32_t)(x)) << APU_STATUS_RD_APU_SOC_CLK_EN2_SHIFT)) & APU_STATUS_RD_APU_SOC_CLK_EN2_MASK)\r\n\r\n#define APU_STATUS_RD_APU_SOC_CLK_EN1_MASK       (0x800U)\r\n#define APU_STATUS_RD_APU_SOC_CLK_EN1_SHIFT      (11U)\r\n/*! APU_SOC_CLK_EN1 - APU SoC Clock Enable 1 */\r\n#define APU_STATUS_RD_APU_SOC_CLK_EN1(x)         (((uint32_t)(((uint32_t)(x)) << APU_STATUS_RD_APU_SOC_CLK_EN1_SHIFT)) & APU_STATUS_RD_APU_SOC_CLK_EN1_MASK)\r\n\r\n#define APU_STATUS_RD_APU_SLEEP_FSM_STATE_MASK   (0xF000U)\r\n#define APU_STATUS_RD_APU_SLEEP_FSM_STATE_SHIFT  (12U)\r\n/*! APU_SLEEP_FSM_STATE - APU Sleep FSM State */\r\n#define APU_STATUS_RD_APU_SLEEP_FSM_STATE(x)     (((uint32_t)(((uint32_t)(x)) << APU_STATUS_RD_APU_SLEEP_FSM_STATE_SHIFT)) & APU_STATUS_RD_APU_SLEEP_FSM_STATE_MASK)\r\n\r\n#define APU_STATUS_RD_HOST_WKUP_AFTER_MASK_MASK  (0xFFFF0000U)\r\n#define APU_STATUS_RD_HOST_WKUP_AFTER_MASK_SHIFT (16U)\r\n/*! HOST_WKUP_AFTER_MASK - Host Wakeup After Mask */\r\n#define APU_STATUS_RD_HOST_WKUP_AFTER_MASK(x)    (((uint32_t)(((uint32_t)(x)) << APU_STATUS_RD_HOST_WKUP_AFTER_MASK_SHIFT)) & APU_STATUS_RD_HOST_WKUP_AFTER_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name STABLE_CNT2 - Stable Count 2 */\r\n/*! @{ */\r\n\r\n#define APU_STABLE_CNT2_PLL2_STBL_CNT_MASK       (0xFFFFU)\r\n#define APU_STABLE_CNT2_PLL2_STBL_CNT_SHIFT      (0U)\r\n/*! PLL2_STBL_CNT - T3 stable count in reference clocks */\r\n#define APU_STABLE_CNT2_PLL2_STBL_CNT(x)         (((uint32_t)(((uint32_t)(x)) << APU_STABLE_CNT2_PLL2_STBL_CNT_SHIFT)) & APU_STABLE_CNT2_PLL2_STBL_CNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name DYN_PLL_MASK - Dynamic PLL Mask */\r\n/*! @{ */\r\n\r\n#define APU_DYN_PLL_MASK_BT_PLL_REQ_MASK_MASK    (0x20U)\r\n#define APU_DYN_PLL_MASK_BT_PLL_REQ_MASK_SHIFT   (5U)\r\n/*! BT_PLL_REQ_MASK - When mask =0, bt_pll_req treated as pll_req */\r\n#define APU_DYN_PLL_MASK_BT_PLL_REQ_MASK(x)      (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_MASK_BT_PLL_REQ_MASK_SHIFT)) & APU_DYN_PLL_MASK_BT_PLL_REQ_MASK_MASK)\r\n\r\n#define APU_DYN_PLL_MASK_BRF_PLL_REQ_MASK_MASK   (0x40U)\r\n#define APU_DYN_PLL_MASK_BRF_PLL_REQ_MASK_SHIFT  (6U)\r\n/*! BRF_PLL_REQ_MASK - When mask =0, brf_pll_req treated as pll_req */\r\n#define APU_DYN_PLL_MASK_BRF_PLL_REQ_MASK(x)     (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_MASK_BRF_PLL_REQ_MASK_SHIFT)) & APU_DYN_PLL_MASK_BRF_PLL_REQ_MASK_MASK)\r\n\r\n#define APU_DYN_PLL_MASK_BT_AES_CLK_REQ_MASK_MASK (0x80U)\r\n#define APU_DYN_PLL_MASK_BT_AES_CLK_REQ_MASK_SHIFT (7U)\r\n/*! BT_AES_CLK_REQ_MASK - When mask is 0, bt_aes_clk_req is treated as pll_req of bt_aes_nco_mode =0 */\r\n#define APU_DYN_PLL_MASK_BT_AES_CLK_REQ_MASK(x)  (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_MASK_BT_AES_CLK_REQ_MASK_SHIFT)) & APU_DYN_PLL_MASK_BT_AES_CLK_REQ_MASK_MASK)\r\n\r\n#define APU_DYN_PLL_MASK_BT_CLK_REQ_PLL_REQ_MASK_MASK (0x100U)\r\n#define APU_DYN_PLL_MASK_BT_CLK_REQ_PLL_REQ_MASK_SHIFT (8U)\r\n/*! BT_CLK_REQ_PLL_REQ_MASK - When mask is 0, bt_clk_req is treated as pll_req if soc_use_ref_only = 0 */\r\n#define APU_DYN_PLL_MASK_BT_CLK_REQ_PLL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_MASK_BT_CLK_REQ_PLL_REQ_MASK_SHIFT)) & APU_DYN_PLL_MASK_BT_CLK_REQ_PLL_REQ_MASK_MASK)\r\n\r\n#define APU_DYN_PLL_MASK_BT_SLP_RDY_PLL_REQ_MASK_MASK (0x200U)\r\n#define APU_DYN_PLL_MASK_BT_SLP_RDY_PLL_REQ_MASK_SHIFT (9U)\r\n/*! BT_SLP_RDY_PLL_REQ_MASK - When mask is 0, !bt_slp_rdy is treated as pll_req if soc_use_ref_only = 0 */\r\n#define APU_DYN_PLL_MASK_BT_SLP_RDY_PLL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_MASK_BT_SLP_RDY_PLL_REQ_MASK_SHIFT)) & APU_DYN_PLL_MASK_BT_SLP_RDY_PLL_REQ_MASK_MASK)\r\n\r\n#define APU_DYN_PLL_MASK_BLE_SLP_RDY_PLL_REQ_MASK_MASK (0x400U)\r\n#define APU_DYN_PLL_MASK_BLE_SLP_RDY_PLL_REQ_MASK_SHIFT (10U)\r\n/*! BLE_SLP_RDY_PLL_REQ_MASK - When mask is 0, !ble_slp_rdy is treated as pll_req if soc_use_ref_only = 0 */\r\n#define APU_DYN_PLL_MASK_BLE_SLP_RDY_PLL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_MASK_BLE_SLP_RDY_PLL_REQ_MASK_SHIFT)) & APU_DYN_PLL_MASK_BLE_SLP_RDY_PLL_REQ_MASK_MASK)\r\n\r\n#define APU_DYN_PLL_MASK_CPU2_CP15_PLL_REQ_MASK_MASK (0x800U)\r\n#define APU_DYN_PLL_MASK_CPU2_CP15_PLL_REQ_MASK_SHIFT (11U)\r\n/*! CPU2_CP15_PLL_REQ_MASK - When mask is 0, !cpu2_cp15_sleep is treated as pll_req if soc_use_ref_only = 0 */\r\n#define APU_DYN_PLL_MASK_CPU2_CP15_PLL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_MASK_CPU2_CP15_PLL_REQ_MASK_SHIFT)) & APU_DYN_PLL_MASK_CPU2_CP15_PLL_REQ_MASK_MASK)\r\n\r\n#define APU_DYN_PLL_MASK_SD_CLK_SWITCH_OK_MASK_MASK (0x1000U)\r\n#define APU_DYN_PLL_MASK_SD_CLK_SWITCH_OK_MASK_SHIFT (12U)\r\n/*! SD_CLK_SWITCH_OK_MASK - SD Clock Switch Ok Mask */\r\n#define APU_DYN_PLL_MASK_SD_CLK_SWITCH_OK_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_MASK_SD_CLK_SWITCH_OK_MASK_SHIFT)) & APU_DYN_PLL_MASK_SD_CLK_SWITCH_OK_MASK_MASK)\r\n\r\n#define APU_DYN_PLL_MASK_GEN_TIMER_WKUP_PLL_REQ_MASK_MASK (0x2000U)\r\n#define APU_DYN_PLL_MASK_GEN_TIMER_WKUP_PLL_REQ_MASK_SHIFT (13U)\r\n/*! GEN_TIMER_WKUP_PLL_REQ_MASK - When mask is 0, gen_timer_wkup_wkup is treated as pll_req if soc_use_ref_only = 0 */\r\n#define APU_DYN_PLL_MASK_GEN_TIMER_WKUP_PLL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_MASK_GEN_TIMER_WKUP_PLL_REQ_MASK_SHIFT)) & APU_DYN_PLL_MASK_GEN_TIMER_WKUP_PLL_REQ_MASK_MASK)\r\n\r\n#define APU_DYN_PLL_MASK_FULL_SLP_MASK_MASK      (0x4000U)\r\n#define APU_DYN_PLL_MASK_FULL_SLP_MASK_SHIFT     (14U)\r\n/*! FULL_SLP_MASK - Full Sleep Mask */\r\n#define APU_DYN_PLL_MASK_FULL_SLP_MASK(x)        (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_MASK_FULL_SLP_MASK_SHIFT)) & APU_DYN_PLL_MASK_FULL_SLP_MASK_MASK)\r\n\r\n#define APU_DYN_PLL_MASK_HOST_WKUP_PLL_REQ_MASK_MASK (0xFFFF0000U)\r\n#define APU_DYN_PLL_MASK_HOST_WKUP_PLL_REQ_MASK_SHIFT (16U)\r\n/*! HOST_WKUP_PLL_REQ_MASK - When mask is 0, host_wkup is treated as pll_req if soc_use_ref_only = 0 */\r\n#define APU_DYN_PLL_MASK_HOST_WKUP_PLL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_MASK_HOST_WKUP_PLL_REQ_MASK_SHIFT)) & APU_DYN_PLL_MASK_HOST_WKUP_PLL_REQ_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name TESTBUS_RD1 - Testbus Read 1 */\r\n/*! @{ */\r\n\r\n#define APU_TESTBUS_RD1_TIMER_CNTR_MASK          (0xFFFFU)\r\n#define APU_TESTBUS_RD1_TIMER_CNTR_SHIFT         (0U)\r\n/*! TIMER_CNTR - DVFS internal counter */\r\n#define APU_TESTBUS_RD1_TIMER_CNTR(x)            (((uint32_t)(((uint32_t)(x)) << APU_TESTBUS_RD1_TIMER_CNTR_SHIFT)) & APU_TESTBUS_RD1_TIMER_CNTR_MASK)\r\n\r\n#define APU_TESTBUS_RD1_DVFS_TIMER_MASK          (0xFFFF0000U)\r\n#define APU_TESTBUS_RD1_DVFS_TIMER_SHIFT         (16U)\r\n/*! DVFS_TIMER - DVFS timer */\r\n#define APU_TESTBUS_RD1_DVFS_TIMER(x)            (((uint32_t)(((uint32_t)(x)) << APU_TESTBUS_RD1_DVFS_TIMER_SHIFT)) & APU_TESTBUS_RD1_DVFS_TIMER_MASK)\r\n/*! @} */\r\n\r\n/*! @name TESTBUS_RD2 - Testbus Read 2 */\r\n/*! @{ */\r\n\r\n#define APU_TESTBUS_RD2_APU_TESTBUS_RD2_MASK     (0xFFFFFFFFU)\r\n#define APU_TESTBUS_RD2_APU_TESTBUS_RD2_SHIFT    (0U)\r\n/*! APU_TESTBUS_RD2 - Last 8 FSM state changes are stored in the register */\r\n#define APU_TESTBUS_RD2_APU_TESTBUS_RD2(x)       (((uint32_t)(((uint32_t)(x)) << APU_TESTBUS_RD2_APU_TESTBUS_RD2_SHIFT)) & APU_TESTBUS_RD2_APU_TESTBUS_RD2_MASK)\r\n/*! @} */\r\n\r\n/*! @name GENERIC_TIMER_CNT - Generic Timer Count */\r\n/*! @{ */\r\n\r\n#define APU_GENERIC_TIMER_CNT_GENERIC_TIMER_CNT_MASK (0xFFFFFFFFU)\r\n#define APU_GENERIC_TIMER_CNT_GENERIC_TIMER_CNT_SHIFT (0U)\r\n/*! GENERIC_TIMER_CNT - Generic Timer Count */\r\n#define APU_GENERIC_TIMER_CNT_GENERIC_TIMER_CNT(x) (((uint32_t)(((uint32_t)(x)) << APU_GENERIC_TIMER_CNT_GENERIC_TIMER_CNT_SHIFT)) & APU_GENERIC_TIMER_CNT_GENERIC_TIMER_CNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU1_HOST_WKUP_CTRL - CPU1 Host Wakeup Control */\r\n/*! @{ */\r\n\r\n#define APU_CPU1_HOST_WKUP_CTRL_HOST_WKUP_CTRL_MASK (0xFFFFU)\r\n#define APU_CPU1_HOST_WKUP_CTRL_HOST_WKUP_CTRL_SHIFT (0U)\r\n/*! HOST_WKUP_CTRL - Host Wakeup Control */\r\n#define APU_CPU1_HOST_WKUP_CTRL_HOST_WKUP_CTRL(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU1_HOST_WKUP_CTRL_HOST_WKUP_CTRL_SHIFT)) & APU_CPU1_HOST_WKUP_CTRL_HOST_WKUP_CTRL_MASK)\r\n\r\n#define APU_CPU1_HOST_WKUP_CTRL_HOST_INTR_MASK_MASK (0xFFFF0000U)\r\n#define APU_CPU1_HOST_WKUP_CTRL_HOST_INTR_MASK_SHIFT (16U)\r\n/*! HOST_INTR_MASK - Host Interrupt Mask */\r\n#define APU_CPU1_HOST_WKUP_CTRL_HOST_INTR_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU1_HOST_WKUP_CTRL_HOST_INTR_MASK_SHIFT)) & APU_CPU1_HOST_WKUP_CTRL_HOST_INTR_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name DYN_PLL_CLK_EXT_CTRL - Dynamic PLL Clock Ext Control */\r\n/*! @{ */\r\n\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_SOC_CLK1_EXT_EN_MASK (0x1U)\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_SOC_CLK1_EXT_EN_SHIFT (0U)\r\n/*! SOC_CLK1_EXT_EN - SoC Clock 1 Ext Enable */\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_SOC_CLK1_EXT_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_CLK_EXT_CTRL_SOC_CLK1_EXT_EN_SHIFT)) & APU_DYN_PLL_CLK_EXT_CTRL_SOC_CLK1_EXT_EN_MASK)\r\n\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_SOC_CLK2_EXT_EN_MASK (0x2U)\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_SOC_CLK2_EXT_EN_SHIFT (1U)\r\n/*! SOC_CLK2_EXT_EN - SoC Clock 2 Ext Enable */\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_SOC_CLK2_EXT_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_CLK_EXT_CTRL_SOC_CLK2_EXT_EN_SHIFT)) & APU_DYN_PLL_CLK_EXT_CTRL_SOC_CLK2_EXT_EN_MASK)\r\n\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_SOC_CLK3_EXT_EN_MASK (0x4U)\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_SOC_CLK3_EXT_EN_SHIFT (2U)\r\n/*! SOC_CLK3_EXT_EN - SoC Clock 3 Ext Enable */\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_SOC_CLK3_EXT_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_CLK_EXT_CTRL_SOC_CLK3_EXT_EN_SHIFT)) & APU_DYN_PLL_CLK_EXT_CTRL_SOC_CLK3_EXT_EN_MASK)\r\n\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_CPU1_PLL_EXT_EN_MASK (0x10U)\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_CPU1_PLL_EXT_EN_SHIFT (4U)\r\n/*! CPU1_PLL_EXT_EN - CPU1 PLL Ext Enable */\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_CPU1_PLL_EXT_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_CLK_EXT_CTRL_CPU1_PLL_EXT_EN_SHIFT)) & APU_DYN_PLL_CLK_EXT_CTRL_CPU1_PLL_EXT_EN_MASK)\r\n\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_CPU1_INACTIVE_EXT_EN_MASK (0x20U)\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_CPU1_INACTIVE_EXT_EN_SHIFT (5U)\r\n/*! CPU1_INACTIVE_EXT_EN - CPU1 Inactive Ext Enable */\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_CPU1_INACTIVE_EXT_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_CLK_EXT_CTRL_CPU1_INACTIVE_EXT_EN_SHIFT)) & APU_DYN_PLL_CLK_EXT_CTRL_CPU1_INACTIVE_EXT_EN_MASK)\r\n\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_CPU2_PLL_EXT_EN_MASK (0x40U)\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_CPU2_PLL_EXT_EN_SHIFT (6U)\r\n/*! CPU2_PLL_EXT_EN - CPU2 PLL Ext Enable */\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_CPU2_PLL_EXT_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_CLK_EXT_CTRL_CPU2_PLL_EXT_EN_SHIFT)) & APU_DYN_PLL_CLK_EXT_CTRL_CPU2_PLL_EXT_EN_MASK)\r\n\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_CPU2_INACTIVE_EXT_EN_MASK (0x80U)\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_CPU2_INACTIVE_EXT_EN_SHIFT (7U)\r\n/*! CPU2_INACTIVE_EXT_EN - CPU2 Inactive Ext Enable */\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_CPU2_INACTIVE_EXT_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_CLK_EXT_CTRL_CPU2_INACTIVE_EXT_EN_SHIFT)) & APU_DYN_PLL_CLK_EXT_CTRL_CPU2_INACTIVE_EXT_EN_MASK)\r\n\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_T1_EXT_EN_MASK  (0x100U)\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_T1_EXT_EN_SHIFT (8U)\r\n/*! T1_EXT_EN - T1 Ext Enable */\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_T1_EXT_EN(x)    (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_CLK_EXT_CTRL_T1_EXT_EN_SHIFT)) & APU_DYN_PLL_CLK_EXT_CTRL_T1_EXT_EN_MASK)\r\n\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_T3_EXT_EN_MASK  (0x200U)\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_T3_EXT_EN_SHIFT (9U)\r\n/*! T3_EXT_EN - T3 Ext Enable */\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_T3_EXT_EN(x)    (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_CLK_EXT_CTRL_T3_EXT_EN_SHIFT)) & APU_DYN_PLL_CLK_EXT_CTRL_T3_EXT_EN_MASK)\r\n\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_DVFS_T1_EXT_EN_MASK (0x400U)\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_DVFS_T1_EXT_EN_SHIFT (10U)\r\n/*! DVFS_T1_EXT_EN - DVFS T1 Ext Enable */\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_DVFS_T1_EXT_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_CLK_EXT_CTRL_DVFS_T1_EXT_EN_SHIFT)) & APU_DYN_PLL_CLK_EXT_CTRL_DVFS_T1_EXT_EN_MASK)\r\n\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_CPU3_PLL_EXT_EN_MASK (0x800U)\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_CPU3_PLL_EXT_EN_SHIFT (11U)\r\n/*! CPU3_PLL_EXT_EN - CPU3 PLL Ext Enable */\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_CPU3_PLL_EXT_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_CLK_EXT_CTRL_CPU3_PLL_EXT_EN_SHIFT)) & APU_DYN_PLL_CLK_EXT_CTRL_CPU3_PLL_EXT_EN_MASK)\r\n\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_CPU3_INACTIVE_EXT_EN_MASK (0x1000U)\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_CPU3_INACTIVE_EXT_EN_SHIFT (12U)\r\n/*! CPU3_INACTIVE_EXT_EN - CPU3 Inactive Ext Enable */\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_CPU3_INACTIVE_EXT_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_CLK_EXT_CTRL_CPU3_INACTIVE_EXT_EN_SHIFT)) & APU_DYN_PLL_CLK_EXT_CTRL_CPU3_INACTIVE_EXT_EN_MASK)\r\n\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_BT2_AES_CLK_EXT_EN_MASK (0x10000000U)\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_BT2_AES_CLK_EXT_EN_SHIFT (28U)\r\n/*! BT2_AES_CLK_EXT_EN - BLuetooth2 AES Clock Ext Enable */\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_BT2_AES_CLK_EXT_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_CLK_EXT_CTRL_BT2_AES_CLK_EXT_EN_SHIFT)) & APU_DYN_PLL_CLK_EXT_CTRL_BT2_AES_CLK_EXT_EN_MASK)\r\n\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_BT2_AES_PLL_EXT_EN_MASK (0x20000000U)\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_BT2_AES_PLL_EXT_EN_SHIFT (29U)\r\n/*! BT2_AES_PLL_EXT_EN - Bluetooth2 AES PLL Ext Enable */\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_BT2_AES_PLL_EXT_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_CLK_EXT_CTRL_BT2_AES_PLL_EXT_EN_SHIFT)) & APU_DYN_PLL_CLK_EXT_CTRL_BT2_AES_PLL_EXT_EN_MASK)\r\n\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_BT_AES_CLK_EXT_EN_MASK (0x40000000U)\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_BT_AES_CLK_EXT_EN_SHIFT (30U)\r\n/*! BT_AES_CLK_EXT_EN - BLuetooth AES Clock Ext Enable */\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_BT_AES_CLK_EXT_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_CLK_EXT_CTRL_BT_AES_CLK_EXT_EN_SHIFT)) & APU_DYN_PLL_CLK_EXT_CTRL_BT_AES_CLK_EXT_EN_MASK)\r\n\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_BT_AES_PLL_EXT_EN_MASK (0x80000000U)\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_BT_AES_PLL_EXT_EN_SHIFT (31U)\r\n/*! BT_AES_PLL_EXT_EN - Bluetooth AES PLL Ext Enable */\r\n#define APU_DYN_PLL_CLK_EXT_CTRL_BT_AES_PLL_EXT_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_DYN_PLL_CLK_EXT_CTRL_BT_AES_PLL_EXT_EN_SHIFT)) & APU_DYN_PLL_CLK_EXT_CTRL_BT_AES_PLL_EXT_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name GENERIC_SLP_START_VAL - Generic Sleep Start Value */\r\n/*! @{ */\r\n\r\n#define APU_GENERIC_SLP_START_VAL_GENERIC_SLP_START_VAL_MASK (0xFFFFFFFFU)\r\n#define APU_GENERIC_SLP_START_VAL_GENERIC_SLP_START_VAL_SHIFT (0U)\r\n/*! GENERIC_SLP_START_VAL - Generic Sleep Start Value */\r\n#define APU_GENERIC_SLP_START_VAL_GENERIC_SLP_START_VAL(x) (((uint32_t)(((uint32_t)(x)) << APU_GENERIC_SLP_START_VAL_GENERIC_SLP_START_VAL_SHIFT)) & APU_GENERIC_SLP_START_VAL_GENERIC_SLP_START_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name DLY_HOST_CTRL - Delay Host Control */\r\n/*! @{ */\r\n\r\n#define APU_DLY_HOST_CTRL_DLY_HOST_WKUP_EN_MASK  (0x1U)\r\n#define APU_DLY_HOST_CTRL_DLY_HOST_WKUP_EN_SHIFT (0U)\r\n/*! DLY_HOST_WKUP_EN - Delay Host Wakeup Enable */\r\n#define APU_DLY_HOST_CTRL_DLY_HOST_WKUP_EN(x)    (((uint32_t)(((uint32_t)(x)) << APU_DLY_HOST_CTRL_DLY_HOST_WKUP_EN_SHIFT)) & APU_DLY_HOST_CTRL_DLY_HOST_WKUP_EN_MASK)\r\n\r\n#define APU_DLY_HOST_CTRL_HOST_WKUP_SEL_MASK     (0x78U)\r\n#define APU_DLY_HOST_CTRL_HOST_WKUP_SEL_SHIFT    (3U)\r\n/*! HOST_WKUP_SEL - selects which host wakeup to be delayed out of 16 hosts */\r\n#define APU_DLY_HOST_CTRL_HOST_WKUP_SEL(x)       (((uint32_t)(((uint32_t)(x)) << APU_DLY_HOST_CTRL_HOST_WKUP_SEL_SHIFT)) & APU_DLY_HOST_CTRL_HOST_WKUP_SEL_MASK)\r\n\r\n#define APU_DLY_HOST_CTRL_RST_HOST_WKUP_CNT_MASK (0x80U)\r\n#define APU_DLY_HOST_CTRL_RST_HOST_WKUP_CNT_SHIFT (7U)\r\n/*! RST_HOST_WKUP_CNT - Reset Host Wakeup Count */\r\n#define APU_DLY_HOST_CTRL_RST_HOST_WKUP_CNT(x)   (((uint32_t)(((uint32_t)(x)) << APU_DLY_HOST_CTRL_RST_HOST_WKUP_CNT_SHIFT)) & APU_DLY_HOST_CTRL_RST_HOST_WKUP_CNT_MASK)\r\n\r\n#define APU_DLY_HOST_CTRL_DLY_HOST_WKUP_CNT_MASK (0xFFFFFF00U)\r\n#define APU_DLY_HOST_CTRL_DLY_HOST_WKUP_CNT_SHIFT (8U)\r\n/*! DLY_HOST_WKUP_CNT - Number of sleep clocks to delay host wakeup interrupt */\r\n#define APU_DLY_HOST_CTRL_DLY_HOST_WKUP_CNT(x)   (((uint32_t)(((uint32_t)(x)) << APU_DLY_HOST_CTRL_DLY_HOST_WKUP_CNT_SHIFT)) & APU_DLY_HOST_CTRL_DLY_HOST_WKUP_CNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_WKUP_CNT - Host Wakeup Count */\r\n/*! @{ */\r\n\r\n#define APU_HOST_WKUP_CNT_HOST_WKUP_DLY_CNT_MASK (0xFFFFFFU)\r\n#define APU_HOST_WKUP_CNT_HOST_WKUP_DLY_CNT_SHIFT (0U)\r\n/*! HOST_WKUP_DLY_CNT - Host Wakeup Delay Count */\r\n#define APU_HOST_WKUP_CNT_HOST_WKUP_DLY_CNT(x)   (((uint32_t)(((uint32_t)(x)) << APU_HOST_WKUP_CNT_HOST_WKUP_DLY_CNT_SHIFT)) & APU_HOST_WKUP_CNT_HOST_WKUP_DLY_CNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_HOST_WKUP_MASK - CPU2 Host Wakeup Mask */\r\n/*! @{ */\r\n\r\n#define APU_CPU2_HOST_WKUP_MASK_HOST_WKUP_MASK_MASK (0xFFFFU)\r\n#define APU_CPU2_HOST_WKUP_MASK_HOST_WKUP_MASK_SHIFT (0U)\r\n/*! HOST_WKUP_MASK - Host Wakeup Mask */\r\n#define APU_CPU2_HOST_WKUP_MASK_HOST_WKUP_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU2_HOST_WKUP_MASK_HOST_WKUP_MASK_SHIFT)) & APU_CPU2_HOST_WKUP_MASK_HOST_WKUP_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_HOST_WKUP_POL - CPU2 Host Wakeup Polarity */\r\n/*! @{ */\r\n\r\n#define APU_CPU2_HOST_WKUP_POL_HOST_WKUP_POL_MASK (0xFFFFU)\r\n#define APU_CPU2_HOST_WKUP_POL_HOST_WKUP_POL_SHIFT (0U)\r\n/*! HOST_WKUP_POL - Host Wakeup Polarity */\r\n#define APU_CPU2_HOST_WKUP_POL_HOST_WKUP_POL(x)  (((uint32_t)(((uint32_t)(x)) << APU_CPU2_HOST_WKUP_POL_HOST_WKUP_POL_SHIFT)) & APU_CPU2_HOST_WKUP_POL_HOST_WKUP_POL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_HOST_WKUP_CTRL - CPU2 Host Wakeup Control */\r\n/*! @{ */\r\n\r\n#define APU_CPU2_HOST_WKUP_CTRL_HOST_WKUP_CTRL_MASK (0xFFFFU)\r\n#define APU_CPU2_HOST_WKUP_CTRL_HOST_WKUP_CTRL_SHIFT (0U)\r\n/*! HOST_WKUP_CTRL - Host Wakeup Control */\r\n#define APU_CPU2_HOST_WKUP_CTRL_HOST_WKUP_CTRL(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU2_HOST_WKUP_CTRL_HOST_WKUP_CTRL_SHIFT)) & APU_CPU2_HOST_WKUP_CTRL_HOST_WKUP_CTRL_MASK)\r\n\r\n#define APU_CPU2_HOST_WKUP_CTRL_HOST_INTR_MASK_MASK (0xFFFF0000U)\r\n#define APU_CPU2_HOST_WKUP_CTRL_HOST_INTR_MASK_SHIFT (16U)\r\n/*! HOST_INTR_MASK - Host Interrupt Mask */\r\n#define APU_CPU2_HOST_WKUP_CTRL_HOST_INTR_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU2_HOST_WKUP_CTRL_HOST_INTR_MASK_SHIFT)) & APU_CPU2_HOST_WKUP_CTRL_HOST_INTR_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_CTRL - CPU2 Control */\r\n/*! @{ */\r\n\r\n#define APU_CPU2_CTRL_CPU2_MSG_RDY_MASK_MASK     (0x1U)\r\n#define APU_CPU2_CTRL_CPU2_MSG_RDY_MASK_SHIFT    (0U)\r\n/*! CPU2_MSG_RDY_MASK - CPU2 Message Ready Mask */\r\n#define APU_CPU2_CTRL_CPU2_MSG_RDY_MASK(x)       (((uint32_t)(((uint32_t)(x)) << APU_CPU2_CTRL_CPU2_MSG_RDY_MASK_SHIFT)) & APU_CPU2_CTRL_CPU2_MSG_RDY_MASK_MASK)\r\n\r\n#define APU_CPU2_CTRL_CPU2_CP15_SLP_BYPASS_VAL_MASK (0x4U)\r\n#define APU_CPU2_CTRL_CPU2_CP15_SLP_BYPASS_VAL_SHIFT (2U)\r\n/*! CPU2_CP15_SLP_BYPASS_VAL - CPU2 CP15 Sleep Bypass Value */\r\n#define APU_CPU2_CTRL_CPU2_CP15_SLP_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU2_CTRL_CPU2_CP15_SLP_BYPASS_VAL_SHIFT)) & APU_CPU2_CTRL_CPU2_CP15_SLP_BYPASS_VAL_MASK)\r\n\r\n#define APU_CPU2_CTRL_CPU2_CP15_SLP_BYPASS_EN_MASK (0x8U)\r\n#define APU_CPU2_CTRL_CPU2_CP15_SLP_BYPASS_EN_SHIFT (3U)\r\n/*! CPU2_CP15_SLP_BYPASS_EN - CPU2 CP15 Sleep Bypass Enable */\r\n#define APU_CPU2_CTRL_CPU2_CP15_SLP_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU2_CTRL_CPU2_CP15_SLP_BYPASS_EN_SHIFT)) & APU_CPU2_CTRL_CPU2_CP15_SLP_BYPASS_EN_MASK)\r\n\r\n#define APU_CPU2_CTRL_SOC_USE_REF_ONLY_MASK      (0x10U)\r\n#define APU_CPU2_CTRL_SOC_USE_REF_ONLY_SHIFT     (4U)\r\n/*! SOC_USE_REF_ONLY - SoC Use Ref Only */\r\n#define APU_CPU2_CTRL_SOC_USE_REF_ONLY(x)        (((uint32_t)(((uint32_t)(x)) << APU_CPU2_CTRL_SOC_USE_REF_ONLY_SHIFT)) & APU_CPU2_CTRL_SOC_USE_REF_ONLY_MASK)\r\n\r\n#define APU_CPU2_CTRL_GENERIC_TIMER_EN2_MASK     (0x20U)\r\n#define APU_CPU2_CTRL_GENERIC_TIMER_EN2_SHIFT    (5U)\r\n/*! GENERIC_TIMER_EN2 - Generic Timer Enable 2 */\r\n#define APU_CPU2_CTRL_GENERIC_TIMER_EN2(x)       (((uint32_t)(((uint32_t)(x)) << APU_CPU2_CTRL_GENERIC_TIMER_EN2_SHIFT)) & APU_CPU2_CTRL_GENERIC_TIMER_EN2_MASK)\r\n\r\n#define APU_CPU2_CTRL_APU_SUBSYS2_HOST_MASK      (0x70000U)\r\n#define APU_CPU2_CTRL_APU_SUBSYS2_HOST_SHIFT     (16U)\r\n/*! APU_SUBSYS2_HOST - APU Subsystem 2 Host */\r\n#define APU_CPU2_CTRL_APU_SUBSYS2_HOST(x)        (((uint32_t)(((uint32_t)(x)) << APU_CPU2_CTRL_APU_SUBSYS2_HOST_SHIFT)) & APU_CPU2_CTRL_APU_SUBSYS2_HOST_MASK)\r\n/*! @} */\r\n\r\n/*! @name WLAN_PWR_CTRL_DLY - Wlan domain FSM Power Control Delay */\r\n/*! @{ */\r\n\r\n#define APU_WLAN_PWR_CTRL_DLY_PWR_CTRL_DLY_MASK  (0xFFFFFFFFU)\r\n#define APU_WLAN_PWR_CTRL_DLY_PWR_CTRL_DLY_SHIFT (0U)\r\n/*! PWR_CTRL_DLY - Wlan domain FSM Power Control Delay */\r\n#define APU_WLAN_PWR_CTRL_DLY_PWR_CTRL_DLY(x)    (((uint32_t)(((uint32_t)(x)) << APU_WLAN_PWR_CTRL_DLY_PWR_CTRL_DLY_SHIFT)) & APU_WLAN_PWR_CTRL_DLY_PWR_CTRL_DLY_MASK)\r\n/*! @} */\r\n\r\n/*! @name STATUS2 - Status 2 */\r\n/*! @{ */\r\n\r\n#define APU_STATUS2_CPU1_MSG_RDY_INT_MASK        (0x1U)\r\n#define APU_STATUS2_CPU1_MSG_RDY_INT_SHIFT       (0U)\r\n/*! CPU1_MSG_RDY_INT - CPU1 Message Ready */\r\n#define APU_STATUS2_CPU1_MSG_RDY_INT(x)          (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_CPU1_MSG_RDY_INT_SHIFT)) & APU_STATUS2_CPU1_MSG_RDY_INT_MASK)\r\n\r\n#define APU_STATUS2_CPU2_MSG_RDY_INT_MASK        (0x2U)\r\n#define APU_STATUS2_CPU2_MSG_RDY_INT_SHIFT       (1U)\r\n/*! CPU2_MSG_RDY_INT - CPU2 Message Ready */\r\n#define APU_STATUS2_CPU2_MSG_RDY_INT(x)          (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_CPU2_MSG_RDY_INT_SHIFT)) & APU_STATUS2_CPU2_MSG_RDY_INT_MASK)\r\n\r\n#define APU_STATUS2_CPU3_MSG_RDY_INT_MASK        (0x4U)\r\n#define APU_STATUS2_CPU3_MSG_RDY_INT_SHIFT       (2U)\r\n/*! CPU3_MSG_RDY_INT - CPU3 Message Ready */\r\n#define APU_STATUS2_CPU3_MSG_RDY_INT(x)          (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_CPU3_MSG_RDY_INT_SHIFT)) & APU_STATUS2_CPU3_MSG_RDY_INT_MASK)\r\n\r\n#define APU_STATUS2_LMU_G2BIST_FINISH_MASK       (0x8U)\r\n#define APU_STATUS2_LMU_G2BIST_FINISH_SHIFT      (3U)\r\n/*! LMU_G2BIST_FINISH - LMU G2BIST finish */\r\n#define APU_STATUS2_LMU_G2BIST_FINISH(x)         (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_LMU_G2BIST_FINISH_SHIFT)) & APU_STATUS2_LMU_G2BIST_FINISH_MASK)\r\n\r\n#define APU_STATUS2_APU_BT_AES_CLK_EN_MASK       (0x10U)\r\n#define APU_STATUS2_APU_BT_AES_CLK_EN_SHIFT      (4U)\r\n/*! APU_BT_AES_CLK_EN - BT AES Clk enable */\r\n#define APU_STATUS2_APU_BT_AES_CLK_EN(x)         (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_APU_BT_AES_CLK_EN_SHIFT)) & APU_STATUS2_APU_BT_AES_CLK_EN_MASK)\r\n\r\n#define APU_STATUS2_APU_BT2_AES_CLK_EN_MASK      (0x20U)\r\n#define APU_STATUS2_APU_BT2_AES_CLK_EN_SHIFT     (5U)\r\n/*! APU_BT2_AES_CLK_EN - BT2 AES Clk enable */\r\n#define APU_STATUS2_APU_BT2_AES_CLK_EN(x)        (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_APU_BT2_AES_CLK_EN_SHIFT)) & APU_STATUS2_APU_BT2_AES_CLK_EN_MASK)\r\n\r\n#define APU_STATUS2_APU_BT_AES_CLK_SEL_MASK      (0x40U)\r\n#define APU_STATUS2_APU_BT_AES_CLK_SEL_SHIFT     (6U)\r\n/*! APU_BT_AES_CLK_SEL - BT AES clk select */\r\n#define APU_STATUS2_APU_BT_AES_CLK_SEL(x)        (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_APU_BT_AES_CLK_SEL_SHIFT)) & APU_STATUS2_APU_BT_AES_CLK_SEL_MASK)\r\n\r\n#define APU_STATUS2_APU_BT2_AES_CLK_SEL_MASK     (0x80U)\r\n#define APU_STATUS2_APU_BT2_AES_CLK_SEL_SHIFT    (7U)\r\n/*! APU_BT2_AES_CLK_SEL - BT2 AES clk select */\r\n#define APU_STATUS2_APU_BT2_AES_CLK_SEL(x)       (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_APU_BT2_AES_CLK_SEL_SHIFT)) & APU_STATUS2_APU_BT2_AES_CLK_SEL_MASK)\r\n\r\n#define APU_STATUS2_APU_BRF_CLK_EN_MASK          (0x100U)\r\n#define APU_STATUS2_APU_BRF_CLK_EN_SHIFT         (8U)\r\n/*! APU_BRF_CLK_EN - BRF clk enable */\r\n#define APU_STATUS2_APU_BRF_CLK_EN(x)            (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_APU_BRF_CLK_EN_SHIFT)) & APU_STATUS2_APU_BRF_CLK_EN_MASK)\r\n\r\n#define APU_STATUS2_APU_BRF2_CLK_EN_MASK         (0x200U)\r\n#define APU_STATUS2_APU_BRF2_CLK_EN_SHIFT        (9U)\r\n/*! APU_BRF2_CLK_EN - BRF2 clk enable */\r\n#define APU_STATUS2_APU_BRF2_CLK_EN(x)           (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_APU_BRF2_CLK_EN_SHIFT)) & APU_STATUS2_APU_BRF2_CLK_EN_MASK)\r\n\r\n#define APU_STATUS2_APU_INTR_BT_WAKEUP_MASK      (0x400U)\r\n#define APU_STATUS2_APU_INTR_BT_WAKEUP_SHIFT     (10U)\r\n/*! APU_INTR_BT_WAKEUP - APU BT2 wakeup interrupt */\r\n#define APU_STATUS2_APU_INTR_BT_WAKEUP(x)        (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_APU_INTR_BT_WAKEUP_SHIFT)) & APU_STATUS2_APU_INTR_BT_WAKEUP_MASK)\r\n\r\n#define APU_STATUS2_APU_INTR_BT2_WAKEUP_MASK     (0x800U)\r\n#define APU_STATUS2_APU_INTR_BT2_WAKEUP_SHIFT    (11U)\r\n/*! APU_INTR_BT2_WAKEUP - APU BT2 wakeup interrupt */\r\n#define APU_STATUS2_APU_INTR_BT2_WAKEUP(x)       (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_APU_INTR_BT2_WAKEUP_SHIFT)) & APU_STATUS2_APU_INTR_BT2_WAKEUP_MASK)\r\n\r\n#define APU_STATUS2_APU_BBUD_CLK_EN1_MASK        (0x1000U)\r\n#define APU_STATUS2_APU_BBUD_CLK_EN1_SHIFT       (12U)\r\n/*! APU_BBUD_CLK_EN1 - bbud2 clk enable */\r\n#define APU_STATUS2_APU_BBUD_CLK_EN1(x)          (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_APU_BBUD_CLK_EN1_SHIFT)) & APU_STATUS2_APU_BBUD_CLK_EN1_MASK)\r\n\r\n#define APU_STATUS2_APU_BBUD_CLK_EN2_MASK        (0x2000U)\r\n#define APU_STATUS2_APU_BBUD_CLK_EN2_SHIFT       (13U)\r\n/*! APU_BBUD_CLK_EN2 - bbud1 clk enable */\r\n#define APU_STATUS2_APU_BBUD_CLK_EN2(x)          (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_APU_BBUD_CLK_EN2_SHIFT)) & APU_STATUS2_APU_BBUD_CLK_EN2_MASK)\r\n\r\n#define APU_STATUS2_APU_WL_RF_CLK_EN1_MASK       (0x4000U)\r\n#define APU_STATUS2_APU_WL_RF_CLK_EN1_SHIFT      (14U)\r\n/*! APU_WL_RF_CLK_EN1 - WLAN RFU1 clk enable */\r\n#define APU_STATUS2_APU_WL_RF_CLK_EN1(x)         (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_APU_WL_RF_CLK_EN1_SHIFT)) & APU_STATUS2_APU_WL_RF_CLK_EN1_MASK)\r\n\r\n#define APU_STATUS2_APU_WL_RF_CLK_EN2_MASK       (0x8000U)\r\n#define APU_STATUS2_APU_WL_RF_CLK_EN2_SHIFT      (15U)\r\n/*! APU_WL_RF_CLK_EN2 - WLAN RFU1 clk enable */\r\n#define APU_STATUS2_APU_WL_RF_CLK_EN2(x)         (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_APU_WL_RF_CLK_EN2_SHIFT)) & APU_STATUS2_APU_WL_RF_CLK_EN2_MASK)\r\n\r\n#define APU_STATUS2_APU_CAU_BT_ACTIVE_MASK       (0x10000U)\r\n#define APU_STATUS2_APU_CAU_BT_ACTIVE_SHIFT      (16U)\r\n/*! APU_CAU_BT_ACTIVE - APU CAU Bluetooth Active */\r\n#define APU_STATUS2_APU_CAU_BT_ACTIVE(x)         (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_APU_CAU_BT_ACTIVE_SHIFT)) & APU_STATUS2_APU_CAU_BT_ACTIVE_MASK)\r\n\r\n#define APU_STATUS2_APU_SOC_CAU_LDO_XOSC_EN_MASK (0x20000U)\r\n#define APU_STATUS2_APU_SOC_CAU_LDO_XOSC_EN_SHIFT (17U)\r\n/*! APU_SOC_CAU_LDO_XOSC_EN - APU SoC CAU LOD XOSC Enable */\r\n#define APU_STATUS2_APU_SOC_CAU_LDO_XOSC_EN(x)   (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_APU_SOC_CAU_LDO_XOSC_EN_SHIFT)) & APU_STATUS2_APU_SOC_CAU_LDO_XOSC_EN_MASK)\r\n\r\n#define APU_STATUS2_PCIE_P_REQ_MASK              (0x40000U)\r\n#define APU_STATUS2_PCIE_P_REQ_SHIFT             (18U)\r\n/*! PCIE_P_REQ - PCIe P req */\r\n#define APU_STATUS2_PCIE_P_REQ(x)                (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_PCIE_P_REQ_SHIFT)) & APU_STATUS2_PCIE_P_REQ_MASK)\r\n\r\n#define APU_STATUS2_PCIE_XP_REQ_MASK             (0x80000U)\r\n#define APU_STATUS2_PCIE_XP_REQ_SHIFT            (19U)\r\n/*! PCIE_XP_REQ - PCIe XP req */\r\n#define APU_STATUS2_PCIE_XP_REQ(x)               (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_PCIE_XP_REQ_SHIFT)) & APU_STATUS2_PCIE_XP_REQ_MASK)\r\n\r\n#define APU_STATUS2_BCA_CLK_REQ_MASK             (0x100000U)\r\n#define APU_STATUS2_BCA_CLK_REQ_SHIFT            (20U)\r\n/*! BCA_CLK_REQ - BCA Clock Request */\r\n#define APU_STATUS2_BCA_CLK_REQ(x)               (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_BCA_CLK_REQ_SHIFT)) & APU_STATUS2_BCA_CLK_REQ_MASK)\r\n\r\n#define APU_STATUS2_BCA_CLK_EN_MASK              (0x200000U)\r\n#define APU_STATUS2_BCA_CLK_EN_SHIFT             (21U)\r\n/*! BCA_CLK_EN - APU BCA Clock Enable */\r\n#define APU_STATUS2_BCA_CLK_EN(x)                (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_BCA_CLK_EN_SHIFT)) & APU_STATUS2_BCA_CLK_EN_MASK)\r\n\r\n#define APU_STATUS2_BCA_SLNA_ON_MASK             (0x400000U)\r\n#define APU_STATUS2_BCA_SLNA_ON_SHIFT            (22U)\r\n/*! BCA_SLNA_ON - BCA SLNA On */\r\n#define APU_STATUS2_BCA_SLNA_ON(x)               (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_BCA_SLNA_ON_SHIFT)) & APU_STATUS2_BCA_SLNA_ON_MASK)\r\n\r\n#define APU_STATUS2_BT_CLK_REQ_MASK              (0x800000U)\r\n#define APU_STATUS2_BT_CLK_REQ_SHIFT             (23U)\r\n/*! BT_CLK_REQ - BT clk req */\r\n#define APU_STATUS2_BT_CLK_REQ(x)                (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_BT_CLK_REQ_SHIFT)) & APU_STATUS2_BT_CLK_REQ_MASK)\r\n\r\n#define APU_STATUS2_BT2_CLK_REQ_MASK             (0x1000000U)\r\n#define APU_STATUS2_BT2_CLK_REQ_SHIFT            (24U)\r\n/*! BT2_CLK_REQ - BT2 clk req */\r\n#define APU_STATUS2_BT2_CLK_REQ(x)               (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_BT2_CLK_REQ_SHIFT)) & APU_STATUS2_BT2_CLK_REQ_MASK)\r\n\r\n#define APU_STATUS2_APU_DVFS_CLK_SEL_MASK        (0x2000000U)\r\n#define APU_STATUS2_APU_DVFS_CLK_SEL_SHIFT       (25U)\r\n/*! APU_DVFS_CLK_SEL - APU DVFS Clock Select */\r\n#define APU_STATUS2_APU_DVFS_CLK_SEL(x)          (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_APU_DVFS_CLK_SEL_SHIFT)) & APU_STATUS2_APU_DVFS_CLK_SEL_MASK)\r\n\r\n#define APU_STATUS2_APU_INTR_WLAN_WAKEUP2_MASK   (0x4000000U)\r\n#define APU_STATUS2_APU_INTR_WLAN_WAKEUP2_SHIFT  (26U)\r\n/*! APU_INTR_WLAN_WAKEUP2 - APU wlan2 wakeup interrupt */\r\n#define APU_STATUS2_APU_INTR_WLAN_WAKEUP2(x)     (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_APU_INTR_WLAN_WAKEUP2_SHIFT)) & APU_STATUS2_APU_INTR_WLAN_WAKEUP2_MASK)\r\n\r\n#define APU_STATUS2_APU_INTR_WLAN_WAKEUP1_MASK   (0x8000000U)\r\n#define APU_STATUS2_APU_INTR_WLAN_WAKEUP1_SHIFT  (27U)\r\n/*! APU_INTR_WLAN_WAKEUP1 - APU wlan1 wakeup interrupt */\r\n#define APU_STATUS2_APU_INTR_WLAN_WAKEUP1(x)     (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_APU_INTR_WLAN_WAKEUP1_SHIFT)) & APU_STATUS2_APU_INTR_WLAN_WAKEUP1_MASK)\r\n\r\n#define APU_STATUS2_AMU1_CP15_SLEEP_MASK         (0x10000000U)\r\n#define APU_STATUS2_AMU1_CP15_SLEEP_SHIFT        (28U)\r\n/*! AMU1_CP15_SLEEP - CPU1 CP15 Sleep */\r\n#define APU_STATUS2_AMU1_CP15_SLEEP(x)           (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_AMU1_CP15_SLEEP_SHIFT)) & APU_STATUS2_AMU1_CP15_SLEEP_MASK)\r\n\r\n#define APU_STATUS2_AMU2_CP15_SLEEP_MASK         (0x20000000U)\r\n#define APU_STATUS2_AMU2_CP15_SLEEP_SHIFT        (29U)\r\n/*! AMU2_CP15_SLEEP - CPU2 CP15 Sleep */\r\n#define APU_STATUS2_AMU2_CP15_SLEEP(x)           (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_AMU2_CP15_SLEEP_SHIFT)) & APU_STATUS2_AMU2_CP15_SLEEP_MASK)\r\n\r\n#define APU_STATUS2_AMU3_CP15_SLEEP_MASK         (0x40000000U)\r\n#define APU_STATUS2_AMU3_CP15_SLEEP_SHIFT        (30U)\r\n/*! AMU3_CP15_SLEEP - CPU3 CP15 Sleep */\r\n#define APU_STATUS2_AMU3_CP15_SLEEP(x)           (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_AMU3_CP15_SLEEP_SHIFT)) & APU_STATUS2_AMU3_CP15_SLEEP_MASK)\r\n\r\n#define APU_STATUS2_CPU1_APU_PD_MASK             (0x80000000U)\r\n#define APU_STATUS2_CPU1_APU_PD_SHIFT            (31U)\r\n/*! CPU1_APU_PD - CPU1 to APU powerdown */\r\n#define APU_STATUS2_CPU1_APU_PD(x)               (((uint32_t)(((uint32_t)(x)) << APU_STATUS2_CPU1_APU_PD_SHIFT)) & APU_STATUS2_CPU1_APU_PD_MASK)\r\n/*! @} */\r\n\r\n/*! @name WLAN_PWR_CTRL_DLY2 - Wlan domain FSM Power Control Delay 2 */\r\n/*! @{ */\r\n\r\n#define APU_WLAN_PWR_CTRL_DLY2_PWR_CTRL_DLY2_MASK (0xFFFFFFFFU)\r\n#define APU_WLAN_PWR_CTRL_DLY2_PWR_CTRL_DLY2_SHIFT (0U)\r\n/*! PWR_CTRL_DLY2 - WLAN domain FSM power control delay 2 */\r\n#define APU_WLAN_PWR_CTRL_DLY2_PWR_CTRL_DLY2(x)  (((uint32_t)(((uint32_t)(x)) << APU_WLAN_PWR_CTRL_DLY2_PWR_CTRL_DLY2_SHIFT)) & APU_WLAN_PWR_CTRL_DLY2_PWR_CTRL_DLY2_MASK)\r\n/*! @} */\r\n\r\n/*! @name WL_CTRL - WLAN Control */\r\n/*! @{ */\r\n\r\n#define APU_WL_CTRL_WL_SLP_RDY_MASK              (0x1U)\r\n#define APU_WL_CTRL_WL_SLP_RDY_SHIFT             (0U)\r\n/*! WL_SLP_RDY - WLAN Sleep Ready */\r\n#define APU_WL_CTRL_WL_SLP_RDY(x)                (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL_WL_SLP_RDY_SHIFT)) & APU_WL_CTRL_WL_SLP_RDY_MASK)\r\n\r\n#define APU_WL_CTRL_WL_SLP_RDYMASK_MASK          (0x2U)\r\n#define APU_WL_CTRL_WL_SLP_RDYMASK_SHIFT         (1U)\r\n/*! WL_SLP_RDYMASK - WLAN Sleep Ready Mask */\r\n#define APU_WL_CTRL_WL_SLP_RDYMASK(x)            (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL_WL_SLP_RDYMASK_SHIFT)) & APU_WL_CTRL_WL_SLP_RDYMASK_MASK)\r\n\r\n#define APU_WL_CTRL_WL_SLP_RDY_FW_MASK           (0x4U)\r\n#define APU_WL_CTRL_WL_SLP_RDY_FW_SHIFT          (2U)\r\n/*! WL_SLP_RDY_FW - WLAN Sleep Ready Firmware */\r\n#define APU_WL_CTRL_WL_SLP_RDY_FW(x)             (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL_WL_SLP_RDY_FW_SHIFT)) & APU_WL_CTRL_WL_SLP_RDY_FW_MASK)\r\n\r\n#define APU_WL_CTRL_IDLE2ISO_DLY_EN_MASK         (0x20U)\r\n#define APU_WL_CTRL_IDLE2ISO_DLY_EN_SHIFT        (5U)\r\n/*! IDLE2ISO_DLY_EN - Delay from idle to iso to ensure delay from bbud_non_udr_rst_b =0 to wlan_iso_en = 1 */\r\n#define APU_WL_CTRL_IDLE2ISO_DLY_EN(x)           (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL_IDLE2ISO_DLY_EN_SHIFT)) & APU_WL_CTRL_IDLE2ISO_DLY_EN_MASK)\r\n\r\n#define APU_WL_CTRL_APU_WKUP_WLRF_RX_MASK        (0x40U)\r\n#define APU_WL_CTRL_APU_WKUP_WLRF_RX_SHIFT       (6U)\r\n/*! APU_WKUP_WLRF_RX - APU Wakeup WL RF Rx */\r\n#define APU_WL_CTRL_APU_WKUP_WLRF_RX(x)          (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL_APU_WKUP_WLRF_RX_SHIFT)) & APU_WL_CTRL_APU_WKUP_WLRF_RX_MASK)\r\n\r\n#define APU_WL_CTRL_USE_WL_INTR_SLP_MASK         (0x80U)\r\n#define APU_WL_CTRL_USE_WL_INTR_SLP_SHIFT        (7U)\r\n/*! USE_WL_INTR_SLP - Use WLAN Interrupt Sleep */\r\n#define APU_WL_CTRL_USE_WL_INTR_SLP(x)           (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL_USE_WL_INTR_SLP_SHIFT)) & APU_WL_CTRL_USE_WL_INTR_SLP_MASK)\r\n\r\n#define APU_WL_CTRL_WL_USE_NOM_PWR_BYP_MASK      (0x200U)\r\n#define APU_WL_CTRL_WL_USE_NOM_PWR_BYP_SHIFT     (9U)\r\n/*! WL_USE_NOM_PWR_BYP - WLAN Use Nominal Power Bypass */\r\n#define APU_WL_CTRL_WL_USE_NOM_PWR_BYP(x)        (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL_WL_USE_NOM_PWR_BYP_SHIFT)) & APU_WL_CTRL_WL_USE_NOM_PWR_BYP_MASK)\r\n\r\n#define APU_WL_CTRL_USE_WL_PWR_RDY_FOR_WLRF_CLK_MASK (0x400U)\r\n#define APU_WL_CTRL_USE_WL_PWR_RDY_FOR_WLRF_CLK_SHIFT (10U)\r\n/*! USE_WL_PWR_RDY_FOR_WLRF_CLK - Use WLAN Power Ready for WL RF Clock */\r\n#define APU_WL_CTRL_USE_WL_PWR_RDY_FOR_WLRF_CLK(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL_USE_WL_PWR_RDY_FOR_WLRF_CLK_SHIFT)) & APU_WL_CTRL_USE_WL_PWR_RDY_FOR_WLRF_CLK_MASK)\r\n\r\n#define APU_WL_CTRL_APU_FW_RST_PE_MASK           (0x8000U)\r\n#define APU_WL_CTRL_APU_FW_RST_PE_SHIFT          (15U)\r\n/*! APU_FW_RST_PE - APU FW Reset PE */\r\n#define APU_WL_CTRL_APU_FW_RST_PE(x)             (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL_APU_FW_RST_PE_SHIFT)) & APU_WL_CTRL_APU_FW_RST_PE_MASK)\r\n\r\n#define APU_WL_CTRL_APU_TSF_UPD_CNT_MASK         (0x1F0000U)\r\n#define APU_WL_CTRL_APU_TSF_UPD_CNT_SHIFT        (16U)\r\n/*! APU_TSF_UPD_CNT - APU TSF Update Count */\r\n#define APU_WL_CTRL_APU_TSF_UPD_CNT(x)           (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL_APU_TSF_UPD_CNT_SHIFT)) & APU_WL_CTRL_APU_TSF_UPD_CNT_MASK)\r\n\r\n#define APU_WL_CTRL_APU_TSF_AUTO_UPDATE_MASK     (0x200000U)\r\n#define APU_WL_CTRL_APU_TSF_AUTO_UPDATE_SHIFT    (21U)\r\n/*! APU_TSF_AUTO_UPDATE - APU TSF Auto Update */\r\n#define APU_WL_CTRL_APU_TSF_AUTO_UPDATE(x)       (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL_APU_TSF_AUTO_UPDATE_SHIFT)) & APU_WL_CTRL_APU_TSF_AUTO_UPDATE_MASK)\r\n\r\n#define APU_WL_CTRL_APU_WLAN_RF_MUX_SEL_MASK     (0x400000U)\r\n#define APU_WL_CTRL_APU_WLAN_RF_MUX_SEL_SHIFT    (22U)\r\n/*! APU_WLAN_RF_MUX_SEL - APU WLAN RF Mux Select */\r\n#define APU_WL_CTRL_APU_WLAN_RF_MUX_SEL(x)       (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL_APU_WLAN_RF_MUX_SEL_SHIFT)) & APU_WL_CTRL_APU_WLAN_RF_MUX_SEL_MASK)\r\n\r\n#define APU_WL_CTRL_FW_FORCE_WL_PWRUP_MASK       (0x1000000U)\r\n#define APU_WL_CTRL_FW_FORCE_WL_PWRUP_SHIFT      (24U)\r\n/*! FW_FORCE_WL_PWRUP - FW Force WLAN Powerup */\r\n#define APU_WL_CTRL_FW_FORCE_WL_PWRUP(x)         (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL_FW_FORCE_WL_PWRUP_SHIFT)) & APU_WL_CTRL_FW_FORCE_WL_PWRUP_MASK)\r\n\r\n#define APU_WL_CTRL_WLAN_USE_UNSYNC_PWR_LVL_MASK (0x2000000U)\r\n#define APU_WL_CTRL_WLAN_USE_UNSYNC_PWR_LVL_SHIFT (25U)\r\n/*! WLAN_USE_UNSYNC_PWR_LVL - WLAN Use Unsync Power Level */\r\n#define APU_WL_CTRL_WLAN_USE_UNSYNC_PWR_LVL(x)   (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL_WLAN_USE_UNSYNC_PWR_LVL_SHIFT)) & APU_WL_CTRL_WLAN_USE_UNSYNC_PWR_LVL_MASK)\r\n\r\n#define APU_WL_CTRL_WL_HOST_SLP_RDY_MASK         (0x80000000U)\r\n#define APU_WL_CTRL_WL_HOST_SLP_RDY_SHIFT        (31U)\r\n/*! WL_HOST_SLP_RDY - WLAN Host Sleep Ready */\r\n#define APU_WL_CTRL_WL_HOST_SLP_RDY(x)           (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL_WL_HOST_SLP_RDY_SHIFT)) & APU_WL_CTRL_WL_HOST_SLP_RDY_MASK)\r\n/*! @} */\r\n\r\n/*! @name WL_WKUP_MASK - WLAN Wakeup Mask */\r\n/*! @{ */\r\n\r\n#define APU_WL_WKUP_MASK_WL_BCN_TIMER_WKUP_MASK_MASK (0x1U)\r\n#define APU_WL_WKUP_MASK_WL_BCN_TIMER_WKUP_MASK_SHIFT (0U)\r\n/*! WL_BCN_TIMER_WKUP_MASK - WLAN Beacon Timer Wakeup Mask */\r\n#define APU_WL_WKUP_MASK_WL_BCN_TIMER_WKUP_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_WKUP_MASK_WL_BCN_TIMER_WKUP_MASK_SHIFT)) & APU_WL_WKUP_MASK_WL_BCN_TIMER_WKUP_MASK_MASK)\r\n\r\n#define APU_WL_WKUP_MASK_BBUD_T2_PLL_REQ_MASK_MASK (0x2U)\r\n#define APU_WL_WKUP_MASK_BBUD_T2_PLL_REQ_MASK_SHIFT (1U)\r\n/*! BBUD_T2_PLL_REQ_MASK - BBUD T2 PLL Request Mask */\r\n#define APU_WL_WKUP_MASK_BBUD_T2_PLL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_WKUP_MASK_BBUD_T2_PLL_REQ_MASK_SHIFT)) & APU_WL_WKUP_MASK_BBUD_T2_PLL_REQ_MASK_MASK)\r\n\r\n#define APU_WL_WKUP_MASK_WL_RF_PLL_REQ_MASK_MASK (0x4U)\r\n#define APU_WL_WKUP_MASK_WL_RF_PLL_REQ_MASK_SHIFT (2U)\r\n/*! WL_RF_PLL_REQ_MASK - WLAN RF PLL Request Mask */\r\n#define APU_WL_WKUP_MASK_WL_RF_PLL_REQ_MASK(x)   (((uint32_t)(((uint32_t)(x)) << APU_WL_WKUP_MASK_WL_RF_PLL_REQ_MASK_SHIFT)) & APU_WL_WKUP_MASK_WL_RF_PLL_REQ_MASK_MASK)\r\n\r\n#define APU_WL_WKUP_MASK_BCA_MWS_WKUP_XP_MASK_MASK (0x8U)\r\n#define APU_WL_WKUP_MASK_BCA_MWS_WKUP_XP_MASK_SHIFT (3U)\r\n/*! BCA_MWS_WKUP_XP_MASK - BCA MWS Wakeup XP Mask */\r\n#define APU_WL_WKUP_MASK_BCA_MWS_WKUP_XP_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_WKUP_MASK_BCA_MWS_WKUP_XP_MASK_SHIFT)) & APU_WL_WKUP_MASK_BCA_MWS_WKUP_XP_MASK_MASK)\r\n\r\n#define APU_WL_WKUP_MASK_WL_RF_PLL_DYNPLL_REQ_MASK_MASK (0x100U)\r\n#define APU_WL_WKUP_MASK_WL_RF_PLL_DYNPLL_REQ_MASK_SHIFT (8U)\r\n/*! WL_RF_PLL_DYNPLL_REQ_MASK - When mask = 0, wl_rf_pll_req is treated as pll_req */\r\n#define APU_WL_WKUP_MASK_WL_RF_PLL_DYNPLL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_WKUP_MASK_WL_RF_PLL_DYNPLL_REQ_MASK_SHIFT)) & APU_WL_WKUP_MASK_WL_RF_PLL_DYNPLL_REQ_MASK_MASK)\r\n\r\n#define APU_WL_WKUP_MASK_WL_HOST_DYNPLL_REQ_MASK_MASK (0x200U)\r\n#define APU_WL_WKUP_MASK_WL_HOST_DYNPLL_REQ_MASK_SHIFT (9U)\r\n/*! WL_HOST_DYNPLL_REQ_MASK - When mask = 0, wlan_host_wkup is treated as pll_req */\r\n#define APU_WL_WKUP_MASK_WL_HOST_DYNPLL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_WKUP_MASK_WL_HOST_DYNPLL_REQ_MASK_SHIFT)) & APU_WL_WKUP_MASK_WL_HOST_DYNPLL_REQ_MASK_MASK)\r\n\r\n#define APU_WL_WKUP_MASK_WL_TIMER_DYNPLL_REQ_MASK_MASK (0x400U)\r\n#define APU_WL_WKUP_MASK_WL_TIMER_DYNPLL_REQ_MASK_SHIFT (10U)\r\n/*! WL_TIMER_DYNPLL_REQ_MASK - When mask = 0, wlan_timer_xpp req is treated as pll_req */\r\n#define APU_WL_WKUP_MASK_WL_TIMER_DYNPLL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_WKUP_MASK_WL_TIMER_DYNPLL_REQ_MASK_SHIFT)) & APU_WL_WKUP_MASK_WL_TIMER_DYNPLL_REQ_MASK_MASK)\r\n\r\n#define APU_WL_WKUP_MASK_WL_SLP_RDY_DYNPLL_REQ_MASK_MASK (0x800U)\r\n#define APU_WL_WKUP_MASK_WL_SLP_RDY_DYNPLL_REQ_MASK_SHIFT (11U)\r\n/*! WL_SLP_RDY_DYNPLL_REQ_MASK - When mask = 0, !wl_slp_rdy is treated as pll_req */\r\n#define APU_WL_WKUP_MASK_WL_SLP_RDY_DYNPLL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_WKUP_MASK_WL_SLP_RDY_DYNPLL_REQ_MASK_SHIFT)) & APU_WL_WKUP_MASK_WL_SLP_RDY_DYNPLL_REQ_MASK_MASK)\r\n\r\n#define APU_WL_WKUP_MASK_IHB_WL_XPP_DYNPLL_REQ_MASK_MASK (0x1000U)\r\n#define APU_WL_WKUP_MASK_IHB_WL_XPP_DYNPLL_REQ_MASK_SHIFT (12U)\r\n/*! IHB_WL_XPP_DYNPLL_REQ_MASK - When mask = 0, ihb_wl_xpp_req is treated as pll_req */\r\n#define APU_WL_WKUP_MASK_IHB_WL_XPP_DYNPLL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_WKUP_MASK_IHB_WL_XPP_DYNPLL_REQ_MASK_SHIFT)) & APU_WL_WKUP_MASK_IHB_WL_XPP_DYNPLL_REQ_MASK_MASK)\r\n\r\n#define APU_WL_WKUP_MASK_WL_HOST_MAP_MASK        (0xFFFF0000U)\r\n#define APU_WL_WKUP_MASK_WL_HOST_MAP_SHIFT       (16U)\r\n/*! WL_HOST_MAP - WLAN Host Map */\r\n#define APU_WL_WKUP_MASK_WL_HOST_MAP(x)          (((uint32_t)(((uint32_t)(x)) << APU_WL_WKUP_MASK_WL_HOST_MAP_SHIFT)) & APU_WL_WKUP_MASK_WL_HOST_MAP_MASK)\r\n/*! @} */\r\n\r\n/*! @name WL_STATUS - WLAN Status */\r\n/*! @{ */\r\n\r\n#define APU_WL_STATUS_APU_MAC_CLK_EN_MASK        (0x1U)\r\n#define APU_WL_STATUS_APU_MAC_CLK_EN_SHIFT       (0U)\r\n/*! APU_MAC_CLK_EN - APU MAC Clock Enable */\r\n#define APU_WL_STATUS_APU_MAC_CLK_EN(x)          (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_APU_MAC_CLK_EN_SHIFT)) & APU_WL_STATUS_APU_MAC_CLK_EN_MASK)\r\n\r\n#define APU_WL_STATUS_APU_BBUD_CLK_EN_MASK       (0x2U)\r\n#define APU_WL_STATUS_APU_BBUD_CLK_EN_SHIFT      (1U)\r\n/*! APU_BBUD_CLK_EN - APU BBUD Clock Enable */\r\n#define APU_WL_STATUS_APU_BBUD_CLK_EN(x)         (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_APU_BBUD_CLK_EN_SHIFT)) & APU_WL_STATUS_APU_BBUD_CLK_EN_MASK)\r\n\r\n#define APU_WL_STATUS_APU_WL_RF_CLK_EN_MASK      (0x4U)\r\n#define APU_WL_STATUS_APU_WL_RF_CLK_EN_SHIFT     (2U)\r\n/*! APU_WL_RF_CLK_EN - APU WLAN Ref Clock Enable */\r\n#define APU_WL_STATUS_APU_WL_RF_CLK_EN(x)        (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_APU_WL_RF_CLK_EN_SHIFT)) & APU_WL_STATUS_APU_WL_RF_CLK_EN_MASK)\r\n\r\n#define APU_WL_STATUS_APU_WL_SLP_RDY_AFTER_MASK_MASK (0x8U)\r\n#define APU_WL_STATUS_APU_WL_SLP_RDY_AFTER_MASK_SHIFT (3U)\r\n/*! APU_WL_SLP_RDY_AFTER_MASK - APU WLAN Sleep Ready After Mask */\r\n#define APU_WL_STATUS_APU_WL_SLP_RDY_AFTER_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_APU_WL_SLP_RDY_AFTER_MASK_SHIFT)) & APU_WL_STATUS_APU_WL_SLP_RDY_AFTER_MASK_MASK)\r\n\r\n#define APU_WL_STATUS_APU_WL_RF_CTRL_MASK        (0x30U)\r\n#define APU_WL_STATUS_APU_WL_RF_CTRL_SHIFT       (4U)\r\n/*! APU_WL_RF_CTRL - APU WLAN RF Control for PE1/PE2 */\r\n#define APU_WL_STATUS_APU_WL_RF_CTRL(x)          (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_APU_WL_RF_CTRL_SHIFT)) & APU_WL_STATUS_APU_WL_RF_CTRL_MASK)\r\n\r\n#define APU_WL_STATUS_APU_PLL1_EN_MASK           (0x40U)\r\n#define APU_WL_STATUS_APU_PLL1_EN_SHIFT          (6U)\r\n/*! APU_PLL1_EN - APU PLL1 Enable */\r\n#define APU_WL_STATUS_APU_PLL1_EN(x)             (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_APU_PLL1_EN_SHIFT)) & APU_WL_STATUS_APU_PLL1_EN_MASK)\r\n\r\n#define APU_WL_STATUS_APU_PLL3_EN_MASK           (0x80U)\r\n#define APU_WL_STATUS_APU_PLL3_EN_SHIFT          (7U)\r\n/*! APU_PLL3_EN - APU PLL3 Enable */\r\n#define APU_WL_STATUS_APU_PLL3_EN(x)             (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_APU_PLL3_EN_SHIFT)) & APU_WL_STATUS_APU_PLL3_EN_MASK)\r\n\r\n#define APU_WL_STATUS_BCA_MWS_WKUP_XP_MASK       (0x100U)\r\n#define APU_WL_STATUS_BCA_MWS_WKUP_XP_SHIFT      (8U)\r\n/*! BCA_MWS_WKUP_XP - BCA MWS Wakeup XP */\r\n#define APU_WL_STATUS_BCA_MWS_WKUP_XP(x)         (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_BCA_MWS_WKUP_XP_SHIFT)) & APU_WL_STATUS_BCA_MWS_WKUP_XP_MASK)\r\n\r\n#define APU_WL_STATUS_APU_RTDP_WU_RSTB_MASK      (0x200U)\r\n#define APU_WL_STATUS_APU_RTDP_WU_RSTB_SHIFT     (9U)\r\n/*! APU_RTDP_WU_RSTB - APU RTDP WU RSTb */\r\n#define APU_WL_STATUS_APU_RTDP_WU_RSTB(x)        (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_APU_RTDP_WU_RSTB_SHIFT)) & APU_WL_STATUS_APU_RTDP_WU_RSTB_MASK)\r\n\r\n#define APU_WL_STATUS_APU_BBUD_NON_UDR_RST_B_MASK (0x400U)\r\n#define APU_WL_STATUS_APU_BBUD_NON_UDR_RST_B_SHIFT (10U)\r\n/*! APU_BBUD_NON_UDR_RST_B - APU BBUD non-UDR RSTb */\r\n#define APU_WL_STATUS_APU_BBUD_NON_UDR_RST_B(x)  (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_APU_BBUD_NON_UDR_RST_B_SHIFT)) & APU_WL_STATUS_APU_BBUD_NON_UDR_RST_B_MASK)\r\n\r\n#define APU_WL_STATUS_APU_WL_ST_MASK             (0xF000U)\r\n#define APU_WL_STATUS_APU_WL_ST_SHIFT            (12U)\r\n/*! APU_WL_ST - APU WLAN St */\r\n#define APU_WL_STATUS_APU_WL_ST(x)               (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_APU_WL_ST_SHIFT)) & APU_WL_STATUS_APU_WL_ST_MASK)\r\n\r\n#define APU_WL_STATUS_APU_WLAN_SWITCH_PD_MASK    (0x10000U)\r\n#define APU_WL_STATUS_APU_WLAN_SWITCH_PD_SHIFT   (16U)\r\n/*! APU_WLAN_SWITCH_PD - APU WLAN Switch Pd */\r\n#define APU_WL_STATUS_APU_WLAN_SWITCH_PD(x)      (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_APU_WLAN_SWITCH_PD_SHIFT)) & APU_WL_STATUS_APU_WLAN_SWITCH_PD_MASK)\r\n\r\n#define APU_WL_STATUS_APU_WLAN_UDR_FIREWALL_B_MASK (0x20000U)\r\n#define APU_WL_STATUS_APU_WLAN_UDR_FIREWALL_B_SHIFT (17U)\r\n/*! APU_WLAN_UDR_FIREWALL_B - APU WLAN UDR Firewall b */\r\n#define APU_WL_STATUS_APU_WLAN_UDR_FIREWALL_B(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_APU_WLAN_UDR_FIREWALL_B_SHIFT)) & APU_WL_STATUS_APU_WLAN_UDR_FIREWALL_B_MASK)\r\n\r\n#define APU_WL_STATUS_APU_WLAN_CLK_DIV_RSTB_MASK (0x40000U)\r\n#define APU_WL_STATUS_APU_WLAN_CLK_DIV_RSTB_SHIFT (18U)\r\n/*! APU_WLAN_CLK_DIV_RSTB - APU WLAN Clock Div RSTb */\r\n#define APU_WL_STATUS_APU_WLAN_CLK_DIV_RSTB(x)   (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_APU_WLAN_CLK_DIV_RSTB_SHIFT)) & APU_WL_STATUS_APU_WLAN_CLK_DIV_RSTB_MASK)\r\n\r\n#define APU_WL_STATUS_APU_WLAN_ISO_EN_MASK       (0x80000U)\r\n#define APU_WL_STATUS_APU_WLAN_ISO_EN_SHIFT      (19U)\r\n/*! APU_WLAN_ISO_EN - APU WLAN ISO Enable */\r\n#define APU_WL_STATUS_APU_WLAN_ISO_EN(x)         (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_APU_WLAN_ISO_EN_SHIFT)) & APU_WL_STATUS_APU_WLAN_ISO_EN_MASK)\r\n\r\n#define APU_WL_STATUS_APU_WLAN_SRAM_PD_MASK      (0x100000U)\r\n#define APU_WL_STATUS_APU_WLAN_SRAM_PD_SHIFT     (20U)\r\n/*! APU_WLAN_SRAM_PD - APU WLAN SRAM Enable */\r\n#define APU_WL_STATUS_APU_WLAN_SRAM_PD(x)        (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_APU_WLAN_SRAM_PD_SHIFT)) & APU_WL_STATUS_APU_WLAN_SRAM_PD_MASK)\r\n\r\n#define APU_WL_STATUS_WLAN_VOL_REACHED_MASK      (0x200000U)\r\n#define APU_WL_STATUS_WLAN_VOL_REACHED_SHIFT     (21U)\r\n/*! WLAN_VOL_REACHED - WLAN Volume Reached */\r\n#define APU_WL_STATUS_WLAN_VOL_REACHED(x)        (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_WLAN_VOL_REACHED_SHIFT)) & APU_WL_STATUS_WLAN_VOL_REACHED_MASK)\r\n\r\n#define APU_WL_STATUS_SOC_VOL_REACHED_MASK       (0x400000U)\r\n#define APU_WL_STATUS_SOC_VOL_REACHED_SHIFT      (22U)\r\n/*! SOC_VOL_REACHED - SoC Volume Reached */\r\n#define APU_WL_STATUS_SOC_VOL_REACHED(x)         (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_SOC_VOL_REACHED_SHIFT)) & APU_WL_STATUS_SOC_VOL_REACHED_MASK)\r\n\r\n#define APU_WL_STATUS_WL_PWR_RDY_MASK            (0x800000U)\r\n#define APU_WL_STATUS_WL_PWR_RDY_SHIFT           (23U)\r\n/*! WL_PWR_RDY - WLAN Power Ready */\r\n#define APU_WL_STATUS_WL_PWR_RDY(x)              (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_WL_PWR_RDY_SHIFT)) & APU_WL_STATUS_WL_PWR_RDY_MASK)\r\n\r\n#define APU_WL_STATUS_WL_HOST_INTR_REF_MASK      (0x1000000U)\r\n#define APU_WL_STATUS_WL_HOST_INTR_REF_SHIFT     (24U)\r\n/*! WL_HOST_INTR_REF - WLAN Host Interrupt Reference */\r\n#define APU_WL_STATUS_WL_HOST_INTR_REF(x)        (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_WL_HOST_INTR_REF_SHIFT)) & APU_WL_STATUS_WL_HOST_INTR_REF_MASK)\r\n\r\n#define APU_WL_STATUS_WLAN_HOST_WKUP_MASK        (0x2000000U)\r\n#define APU_WL_STATUS_WLAN_HOST_WKUP_SHIFT       (25U)\r\n/*! WLAN_HOST_WKUP - WLAN Host Wakeup */\r\n#define APU_WL_STATUS_WLAN_HOST_WKUP(x)          (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_WLAN_HOST_WKUP_SHIFT)) & APU_WL_STATUS_WLAN_HOST_WKUP_MASK)\r\n\r\n#define APU_WL_STATUS_WL_TIMER_INTR_MASK         (0x4000000U)\r\n#define APU_WL_STATUS_WL_TIMER_INTR_SHIFT        (26U)\r\n/*! WL_TIMER_INTR - WLAN Timer Interrupt */\r\n#define APU_WL_STATUS_WL_TIMER_INTR(x)           (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_WL_TIMER_INTR_SHIFT)) & APU_WL_STATUS_WL_TIMER_INTR_MASK)\r\n\r\n#define APU_WL_STATUS_TIMER_XPP_WAKEUP_MASK      (0x8000000U)\r\n#define APU_WL_STATUS_TIMER_XPP_WAKEUP_SHIFT     (27U)\r\n/*! TIMER_XPP_WAKEUP - Timer XPP Wakeup */\r\n#define APU_WL_STATUS_TIMER_XPP_WAKEUP(x)        (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_TIMER_XPP_WAKEUP_SHIFT)) & APU_WL_STATUS_TIMER_XPP_WAKEUP_MASK)\r\n\r\n#define APU_WL_STATUS_TIMER_WAKEUP_MASK          (0x10000000U)\r\n#define APU_WL_STATUS_TIMER_WAKEUP_SHIFT         (28U)\r\n/*! TIMER_WAKEUP - Timer Wakeup */\r\n#define APU_WL_STATUS_TIMER_WAKEUP(x)            (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_TIMER_WAKEUP_SHIFT)) & APU_WL_STATUS_TIMER_WAKEUP_MASK)\r\n\r\n#define APU_WL_STATUS_WLRF_PLL_REQ_MASK          (0x20000000U)\r\n#define APU_WL_STATUS_WLRF_PLL_REQ_SHIFT         (29U)\r\n/*! WLRF_PLL_REQ - WL RF PLL Request */\r\n#define APU_WL_STATUS_WLRF_PLL_REQ(x)            (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_WLRF_PLL_REQ_SHIFT)) & APU_WL_STATUS_WLRF_PLL_REQ_MASK)\r\n\r\n#define APU_WL_STATUS_BBUD_T2_PLL_REQ_MASK       (0x40000000U)\r\n#define APU_WL_STATUS_BBUD_T2_PLL_REQ_SHIFT      (30U)\r\n/*! BBUD_T2_PLL_REQ - BBUD T2 PLL Request */\r\n#define APU_WL_STATUS_BBUD_T2_PLL_REQ(x)         (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_BBUD_T2_PLL_REQ_SHIFT)) & APU_WL_STATUS_BBUD_T2_PLL_REQ_MASK)\r\n\r\n#define APU_WL_STATUS_BCA_CLK_REQ_MASK           (0x80000000U)\r\n#define APU_WL_STATUS_BCA_CLK_REQ_SHIFT          (31U)\r\n/*! BCA_CLK_REQ - BCA Clock Request */\r\n#define APU_WL_STATUS_BCA_CLK_REQ(x)             (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS_BCA_CLK_REQ_SHIFT)) & APU_WL_STATUS_BCA_CLK_REQ_MASK)\r\n/*! @} */\r\n\r\n/*! @name WL_ALARM_RD - WLAN Alarm Readback */\r\n/*! @{ */\r\n\r\n#define APU_WL_ALARM_RD_APU_WL_ALARM_RD_MASK     (0xFFFFFFFFU)\r\n#define APU_WL_ALARM_RD_APU_WL_ALARM_RD_SHIFT    (0U)\r\n/*! APU_WL_ALARM_RD - reads back current beacon timer alarm value */\r\n#define APU_WL_ALARM_RD_APU_WL_ALARM_RD(x)       (((uint32_t)(((uint32_t)(x)) << APU_WL_ALARM_RD_APU_WL_ALARM_RD_SHIFT)) & APU_WL_ALARM_RD_APU_WL_ALARM_RD_MASK)\r\n/*! @} */\r\n\r\n/*! @name WL_BCN_XP_ALARM - WLAN Beacon Alarm */\r\n/*! @{ */\r\n\r\n#define APU_WL_BCN_XP_ALARM_WL_BCN_XP_ALARM_MASK (0xFFFFFFFFU)\r\n#define APU_WL_BCN_XP_ALARM_WL_BCN_XP_ALARM_SHIFT (0U)\r\n/*! WL_BCN_XP_ALARM - number of sleep clocks until WLAN beacon timer requests for reference clock and power */\r\n#define APU_WL_BCN_XP_ALARM_WL_BCN_XP_ALARM(x)   (((uint32_t)(((uint32_t)(x)) << APU_WL_BCN_XP_ALARM_WL_BCN_XP_ALARM_SHIFT)) & APU_WL_BCN_XP_ALARM_WL_BCN_XP_ALARM_MASK)\r\n/*! @} */\r\n\r\n/*! @name WL_BCN_INTR_ALARM - WLAN Beacon Interrupt Alarm */\r\n/*! @{ */\r\n\r\n#define APU_WL_BCN_INTR_ALARM_WL_BCN_INTR_ALARM_MASK (0xFFFFFFFFU)\r\n#define APU_WL_BCN_INTR_ALARM_WL_BCN_INTR_ALARM_SHIFT (0U)\r\n/*! WL_BCN_INTR_ALARM - number of ref clocks after WLAN beacon timer request to firmware wakeup */\r\n#define APU_WL_BCN_INTR_ALARM_WL_BCN_INTR_ALARM(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_BCN_INTR_ALARM_WL_BCN_INTR_ALARM_SHIFT)) & APU_WL_BCN_INTR_ALARM_WL_BCN_INTR_ALARM_MASK)\r\n/*! @} */\r\n\r\n/*! @name WL_HOST_INTR_ALARM - WLAN Host Interrupt Alarm */\r\n/*! @{ */\r\n\r\n#define APU_WL_HOST_INTR_ALARM_WL_HOST_INTR_ALARM_MASK (0xFFFFFFFFU)\r\n#define APU_WL_HOST_INTR_ALARM_WL_HOST_INTR_ALARM_SHIFT (0U)\r\n/*! WL_HOST_INTR_ALARM - number of ref clocks after WLAN host request to firmware wakeup */\r\n#define APU_WL_HOST_INTR_ALARM_WL_HOST_INTR_ALARM(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_HOST_INTR_ALARM_WL_HOST_INTR_ALARM_SHIFT)) & APU_WL_HOST_INTR_ALARM_WL_HOST_INTR_ALARM_MASK)\r\n/*! @} */\r\n\r\n/*! @name WL_BCN_PLL_ALARM - WLAN Beacon PLL Alarm */\r\n/*! @{ */\r\n\r\n#define APU_WL_BCN_PLL_ALARM_WL_BCN_PLL_ALARM_MASK (0xFFFFFFFFU)\r\n#define APU_WL_BCN_PLL_ALARM_WL_BCN_PLL_ALARM_SHIFT (0U)\r\n/*! WL_BCN_PLL_ALARM - number of sleep clocks until WLAN beacon timer requests for reference clock, power, and PLL */\r\n#define APU_WL_BCN_PLL_ALARM_WL_BCN_PLL_ALARM(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_BCN_PLL_ALARM_WL_BCN_PLL_ALARM_SHIFT)) & APU_WL_BCN_PLL_ALARM_WL_BCN_PLL_ALARM_MASK)\r\n/*! @} */\r\n\r\n/*! @name TSF_REF_FACTOR - TSF Reference Factor */\r\n/*! @{ */\r\n\r\n#define APU_TSF_REF_FACTOR_TSF_REF_FACTOR_MASK   (0x7FFFFU)\r\n#define APU_TSF_REF_FACTOR_TSF_REF_FACTOR_SHIFT  (0U)\r\n/*! TSF_REF_FACTOR - number of 1us in 1 reference clock */\r\n#define APU_TSF_REF_FACTOR_TSF_REF_FACTOR(x)     (((uint32_t)(((uint32_t)(x)) << APU_TSF_REF_FACTOR_TSF_REF_FACTOR_SHIFT)) & APU_TSF_REF_FACTOR_TSF_REF_FACTOR_MASK)\r\n/*! @} */\r\n\r\n/*! @name TSF_SLEEP_FACTOR - TSF Sleep Factor */\r\n/*! @{ */\r\n\r\n#define APU_TSF_SLEEP_FACTOR_TSF_SLEEP_FACTOR_MASK (0xFFFFFFFU)\r\n#define APU_TSF_SLEEP_FACTOR_TSF_SLEEP_FACTOR_SHIFT (0U)\r\n/*! TSF_SLEEP_FACTOR - number of 1us in 1 sleep clock */\r\n#define APU_TSF_SLEEP_FACTOR_TSF_SLEEP_FACTOR(x) (((uint32_t)(((uint32_t)(x)) << APU_TSF_SLEEP_FACTOR_TSF_SLEEP_FACTOR_SHIFT)) & APU_TSF_SLEEP_FACTOR_TSF_SLEEP_FACTOR_MASK)\r\n/*! @} */\r\n\r\n/*! @name BBUD_UDR_ISO_CNT - BBUD UDR ISO Count */\r\n/*! @{ */\r\n\r\n#define APU_BBUD_UDR_ISO_CNT_BBUD_UDR_ASSERT_CNT_MASK (0x1FFFU)\r\n#define APU_BBUD_UDR_ISO_CNT_BBUD_UDR_ASSERT_CNT_SHIFT (0U)\r\n/*! BBUD_UDR_ASSERT_CNT - number of reference clocks before bbud_non_udr_rst de-assertion after bbud_clk_en is asserted */\r\n#define APU_BBUD_UDR_ISO_CNT_BBUD_UDR_ASSERT_CNT(x) (((uint32_t)(((uint32_t)(x)) << APU_BBUD_UDR_ISO_CNT_BBUD_UDR_ASSERT_CNT_SHIFT)) & APU_BBUD_UDR_ISO_CNT_BBUD_UDR_ASSERT_CNT_MASK)\r\n\r\n#define APU_BBUD_UDR_ISO_CNT_BBUD_CLK_ASSERT_CNT_MASK (0x1FFF0000U)\r\n#define APU_BBUD_UDR_ISO_CNT_BBUD_CLK_ASSERT_CNT_SHIFT (16U)\r\n/*! BBUD_CLK_ASSERT_CNT - number of reference clocks before bbud_iso_en de-assertion after bbud_non_udr_rst de-asserts */\r\n#define APU_BBUD_UDR_ISO_CNT_BBUD_CLK_ASSERT_CNT(x) (((uint32_t)(((uint32_t)(x)) << APU_BBUD_UDR_ISO_CNT_BBUD_CLK_ASSERT_CNT_SHIFT)) & APU_BBUD_UDR_ISO_CNT_BBUD_CLK_ASSERT_CNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name WL_DVFS_CTRL - WLAN DVFS Control */\r\n/*! @{ */\r\n\r\n#define APU_WL_DVFS_CTRL_WLAN_VOL_VAL_MASK       (0x7FU)\r\n#define APU_WL_DVFS_CTRL_WLAN_VOL_VAL_SHIFT      (0U)\r\n/*! WLAN_VOL_VAL - WLAN Vol Value */\r\n#define APU_WL_DVFS_CTRL_WLAN_VOL_VAL(x)         (((uint32_t)(((uint32_t)(x)) << APU_WL_DVFS_CTRL_WLAN_VOL_VAL_SHIFT)) & APU_WL_DVFS_CTRL_WLAN_VOL_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name WL_CTRL2 - WLAN Control 2 */\r\n/*! @{ */\r\n\r\n#define APU_WL_CTRL2_WL_SLP_RDY_MASK             (0x1U)\r\n#define APU_WL_CTRL2_WL_SLP_RDY_SHIFT            (0U)\r\n/*! WL_SLP_RDY - WLAN Sleep Ready */\r\n#define APU_WL_CTRL2_WL_SLP_RDY(x)               (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL2_WL_SLP_RDY_SHIFT)) & APU_WL_CTRL2_WL_SLP_RDY_MASK)\r\n\r\n#define APU_WL_CTRL2_WL_SLP_RDYMASK_MASK         (0x2U)\r\n#define APU_WL_CTRL2_WL_SLP_RDYMASK_SHIFT        (1U)\r\n/*! WL_SLP_RDYMASK - WLAN Sleep Ready Mask */\r\n#define APU_WL_CTRL2_WL_SLP_RDYMASK(x)           (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL2_WL_SLP_RDYMASK_SHIFT)) & APU_WL_CTRL2_WL_SLP_RDYMASK_MASK)\r\n\r\n#define APU_WL_CTRL2_WL_SLP_RDY_FW_MASK          (0x4U)\r\n#define APU_WL_CTRL2_WL_SLP_RDY_FW_SHIFT         (2U)\r\n/*! WL_SLP_RDY_FW - WLAN Sleep Ready Firmware */\r\n#define APU_WL_CTRL2_WL_SLP_RDY_FW(x)            (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL2_WL_SLP_RDY_FW_SHIFT)) & APU_WL_CTRL2_WL_SLP_RDY_FW_MASK)\r\n\r\n#define APU_WL_CTRL2_IDLE2ISO_DLY_EN_MASK        (0x20U)\r\n#define APU_WL_CTRL2_IDLE2ISO_DLY_EN_SHIFT       (5U)\r\n/*! IDLE2ISO_DLY_EN - Delay from idle to iso to ensure delay from bbud_non_udr_rst_b =0 to wlan_iso_en = 1 */\r\n#define APU_WL_CTRL2_IDLE2ISO_DLY_EN(x)          (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL2_IDLE2ISO_DLY_EN_SHIFT)) & APU_WL_CTRL2_IDLE2ISO_DLY_EN_MASK)\r\n\r\n#define APU_WL_CTRL2_APU_WKUP_WLRF_RX_MASK       (0x40U)\r\n#define APU_WL_CTRL2_APU_WKUP_WLRF_RX_SHIFT      (6U)\r\n/*! APU_WKUP_WLRF_RX - APU Wakeup WL RF Rx */\r\n#define APU_WL_CTRL2_APU_WKUP_WLRF_RX(x)         (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL2_APU_WKUP_WLRF_RX_SHIFT)) & APU_WL_CTRL2_APU_WKUP_WLRF_RX_MASK)\r\n\r\n#define APU_WL_CTRL2_USE_WL_INTR_SLP_MASK        (0x80U)\r\n#define APU_WL_CTRL2_USE_WL_INTR_SLP_SHIFT       (7U)\r\n/*! USE_WL_INTR_SLP - Use WLAN Interrupt Sleep */\r\n#define APU_WL_CTRL2_USE_WL_INTR_SLP(x)          (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL2_USE_WL_INTR_SLP_SHIFT)) & APU_WL_CTRL2_USE_WL_INTR_SLP_MASK)\r\n\r\n#define APU_WL_CTRL2_WL_USE_NOM_PWR_BYP_MASK     (0x200U)\r\n#define APU_WL_CTRL2_WL_USE_NOM_PWR_BYP_SHIFT    (9U)\r\n/*! WL_USE_NOM_PWR_BYP - Use nom_pwr_lvl from dvfs for wl_pwr_lvl_reached */\r\n#define APU_WL_CTRL2_WL_USE_NOM_PWR_BYP(x)       (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL2_WL_USE_NOM_PWR_BYP_SHIFT)) & APU_WL_CTRL2_WL_USE_NOM_PWR_BYP_MASK)\r\n\r\n#define APU_WL_CTRL2_USE_WL_PWR_RDY_FOR_WLRF_CLK_MASK (0x400U)\r\n#define APU_WL_CTRL2_USE_WL_PWR_RDY_FOR_WLRF_CLK_SHIFT (10U)\r\n/*! USE_WL_PWR_RDY_FOR_WLRF_CLK - Use WLAN Power Ready for WL RF Clock */\r\n#define APU_WL_CTRL2_USE_WL_PWR_RDY_FOR_WLRF_CLK(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL2_USE_WL_PWR_RDY_FOR_WLRF_CLK_SHIFT)) & APU_WL_CTRL2_USE_WL_PWR_RDY_FOR_WLRF_CLK_MASK)\r\n\r\n#define APU_WL_CTRL2_APU_FW_RST_PE_MASK          (0x8000U)\r\n#define APU_WL_CTRL2_APU_FW_RST_PE_SHIFT         (15U)\r\n/*! APU_FW_RST_PE - APU FW Reset PE */\r\n#define APU_WL_CTRL2_APU_FW_RST_PE(x)            (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL2_APU_FW_RST_PE_SHIFT)) & APU_WL_CTRL2_APU_FW_RST_PE_MASK)\r\n\r\n#define APU_WL_CTRL2_APU_TSF_UPD_CNT_MASK        (0x1F0000U)\r\n#define APU_WL_CTRL2_APU_TSF_UPD_CNT_SHIFT       (16U)\r\n/*! APU_TSF_UPD_CNT - APU TSF Update Count */\r\n#define APU_WL_CTRL2_APU_TSF_UPD_CNT(x)          (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL2_APU_TSF_UPD_CNT_SHIFT)) & APU_WL_CTRL2_APU_TSF_UPD_CNT_MASK)\r\n\r\n#define APU_WL_CTRL2_APU_TSF_AUTO_UPDATE_MASK    (0x200000U)\r\n#define APU_WL_CTRL2_APU_TSF_AUTO_UPDATE_SHIFT   (21U)\r\n/*! APU_TSF_AUTO_UPDATE - APU TSF Auto Update */\r\n#define APU_WL_CTRL2_APU_TSF_AUTO_UPDATE(x)      (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL2_APU_TSF_AUTO_UPDATE_SHIFT)) & APU_WL_CTRL2_APU_TSF_AUTO_UPDATE_MASK)\r\n\r\n#define APU_WL_CTRL2_APU_WLAN_RF_MUX_SEL_MASK    (0x400000U)\r\n#define APU_WL_CTRL2_APU_WLAN_RF_MUX_SEL_SHIFT   (22U)\r\n/*! APU_WLAN_RF_MUX_SEL - APU WLAN RF Mux Select */\r\n#define APU_WL_CTRL2_APU_WLAN_RF_MUX_SEL(x)      (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL2_APU_WLAN_RF_MUX_SEL_SHIFT)) & APU_WL_CTRL2_APU_WLAN_RF_MUX_SEL_MASK)\r\n\r\n#define APU_WL_CTRL2_FW_FORCE_WL_PWRUP_MASK      (0x1000000U)\r\n#define APU_WL_CTRL2_FW_FORCE_WL_PWRUP_SHIFT     (24U)\r\n/*! FW_FORCE_WL_PWRUP - FW Force WLAN Powerup */\r\n#define APU_WL_CTRL2_FW_FORCE_WL_PWRUP(x)        (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL2_FW_FORCE_WL_PWRUP_SHIFT)) & APU_WL_CTRL2_FW_FORCE_WL_PWRUP_MASK)\r\n\r\n#define APU_WL_CTRL2_WLAN_USE_UNSYNC_PWR_LVL_MASK (0x2000000U)\r\n#define APU_WL_CTRL2_WLAN_USE_UNSYNC_PWR_LVL_SHIFT (25U)\r\n/*! WLAN_USE_UNSYNC_PWR_LVL - WLAN Use Unsync Power Level */\r\n#define APU_WL_CTRL2_WLAN_USE_UNSYNC_PWR_LVL(x)  (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL2_WLAN_USE_UNSYNC_PWR_LVL_SHIFT)) & APU_WL_CTRL2_WLAN_USE_UNSYNC_PWR_LVL_MASK)\r\n\r\n#define APU_WL_CTRL2_WL_HOST_SLP_RDY_MASK        (0x80000000U)\r\n#define APU_WL_CTRL2_WL_HOST_SLP_RDY_SHIFT       (31U)\r\n/*! WL_HOST_SLP_RDY - WLAN Host Sleep Ready */\r\n#define APU_WL_CTRL2_WL_HOST_SLP_RDY(x)          (((uint32_t)(((uint32_t)(x)) << APU_WL_CTRL2_WL_HOST_SLP_RDY_SHIFT)) & APU_WL_CTRL2_WL_HOST_SLP_RDY_MASK)\r\n/*! @} */\r\n\r\n/*! @name WL_WKUP_MASK2 - WLAN Wakeup Mask 2 */\r\n/*! @{ */\r\n\r\n#define APU_WL_WKUP_MASK2_WL_BCN_TIMER_WKUP_MASK_MASK (0x1U)\r\n#define APU_WL_WKUP_MASK2_WL_BCN_TIMER_WKUP_MASK_SHIFT (0U)\r\n/*! WL_BCN_TIMER_WKUP_MASK - WLAN Beacon Timer Wakeup Mask */\r\n#define APU_WL_WKUP_MASK2_WL_BCN_TIMER_WKUP_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_WKUP_MASK2_WL_BCN_TIMER_WKUP_MASK_SHIFT)) & APU_WL_WKUP_MASK2_WL_BCN_TIMER_WKUP_MASK_MASK)\r\n\r\n#define APU_WL_WKUP_MASK2_BBUD_T2_PLL_REQ_MASK_MASK (0x2U)\r\n#define APU_WL_WKUP_MASK2_BBUD_T2_PLL_REQ_MASK_SHIFT (1U)\r\n/*! BBUD_T2_PLL_REQ_MASK - BBUD T2 PLL Request Mask */\r\n#define APU_WL_WKUP_MASK2_BBUD_T2_PLL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_WKUP_MASK2_BBUD_T2_PLL_REQ_MASK_SHIFT)) & APU_WL_WKUP_MASK2_BBUD_T2_PLL_REQ_MASK_MASK)\r\n\r\n#define APU_WL_WKUP_MASK2_WL_RF_PLL_REQ_MASK_MASK (0x4U)\r\n#define APU_WL_WKUP_MASK2_WL_RF_PLL_REQ_MASK_SHIFT (2U)\r\n/*! WL_RF_PLL_REQ_MASK - WLAN RF PLL Request Mask */\r\n#define APU_WL_WKUP_MASK2_WL_RF_PLL_REQ_MASK(x)  (((uint32_t)(((uint32_t)(x)) << APU_WL_WKUP_MASK2_WL_RF_PLL_REQ_MASK_SHIFT)) & APU_WL_WKUP_MASK2_WL_RF_PLL_REQ_MASK_MASK)\r\n\r\n#define APU_WL_WKUP_MASK2_BCA_MWS_WKUP_XP_MASK_MASK (0x8U)\r\n#define APU_WL_WKUP_MASK2_BCA_MWS_WKUP_XP_MASK_SHIFT (3U)\r\n/*! BCA_MWS_WKUP_XP_MASK - BCA MWS Wakeup XP Mask */\r\n#define APU_WL_WKUP_MASK2_BCA_MWS_WKUP_XP_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_WKUP_MASK2_BCA_MWS_WKUP_XP_MASK_SHIFT)) & APU_WL_WKUP_MASK2_BCA_MWS_WKUP_XP_MASK_MASK)\r\n\r\n#define APU_WL_WKUP_MASK2_WL_RF_PLL_DYNPLL_REQ_MASK_MASK (0x100U)\r\n#define APU_WL_WKUP_MASK2_WL_RF_PLL_DYNPLL_REQ_MASK_SHIFT (8U)\r\n/*! WL_RF_PLL_DYNPLL_REQ_MASK - When mask = 0, wl_rf_pll_req is treated as pll_req */\r\n#define APU_WL_WKUP_MASK2_WL_RF_PLL_DYNPLL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_WKUP_MASK2_WL_RF_PLL_DYNPLL_REQ_MASK_SHIFT)) & APU_WL_WKUP_MASK2_WL_RF_PLL_DYNPLL_REQ_MASK_MASK)\r\n\r\n#define APU_WL_WKUP_MASK2_WL_HOST_DYNPLL_REQ_MASK_MASK (0x200U)\r\n#define APU_WL_WKUP_MASK2_WL_HOST_DYNPLL_REQ_MASK_SHIFT (9U)\r\n/*! WL_HOST_DYNPLL_REQ_MASK - When mask = 0, wlan_host_wkup is treated as pll_req */\r\n#define APU_WL_WKUP_MASK2_WL_HOST_DYNPLL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_WKUP_MASK2_WL_HOST_DYNPLL_REQ_MASK_SHIFT)) & APU_WL_WKUP_MASK2_WL_HOST_DYNPLL_REQ_MASK_MASK)\r\n\r\n#define APU_WL_WKUP_MASK2_WL_TIMER_DYNPLL_REQ_MASK_MASK (0x400U)\r\n#define APU_WL_WKUP_MASK2_WL_TIMER_DYNPLL_REQ_MASK_SHIFT (10U)\r\n/*! WL_TIMER_DYNPLL_REQ_MASK - When mask = 0, wlan_timer_xpp req is treated as pll_req */\r\n#define APU_WL_WKUP_MASK2_WL_TIMER_DYNPLL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_WKUP_MASK2_WL_TIMER_DYNPLL_REQ_MASK_SHIFT)) & APU_WL_WKUP_MASK2_WL_TIMER_DYNPLL_REQ_MASK_MASK)\r\n\r\n#define APU_WL_WKUP_MASK2_WL_SLP_RDY_DYNPLL_REQ_MASK_MASK (0x800U)\r\n#define APU_WL_WKUP_MASK2_WL_SLP_RDY_DYNPLL_REQ_MASK_SHIFT (11U)\r\n/*! WL_SLP_RDY_DYNPLL_REQ_MASK - When mask = 0, !wl_slp_rdy is treated as pll_req */\r\n#define APU_WL_WKUP_MASK2_WL_SLP_RDY_DYNPLL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_WKUP_MASK2_WL_SLP_RDY_DYNPLL_REQ_MASK_SHIFT)) & APU_WL_WKUP_MASK2_WL_SLP_RDY_DYNPLL_REQ_MASK_MASK)\r\n\r\n#define APU_WL_WKUP_MASK2_IHB_WL_XPP_DYNPLL_REQ_MASK_MASK (0x1000U)\r\n#define APU_WL_WKUP_MASK2_IHB_WL_XPP_DYNPLL_REQ_MASK_SHIFT (12U)\r\n/*! IHB_WL_XPP_DYNPLL_REQ_MASK - When mask = 0, ihb_wl_xpp_req is treated as pll_req */\r\n#define APU_WL_WKUP_MASK2_IHB_WL_XPP_DYNPLL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_WKUP_MASK2_IHB_WL_XPP_DYNPLL_REQ_MASK_SHIFT)) & APU_WL_WKUP_MASK2_IHB_WL_XPP_DYNPLL_REQ_MASK_MASK)\r\n\r\n#define APU_WL_WKUP_MASK2_WL_HOST_MAP_MASK       (0xFFFF0000U)\r\n#define APU_WL_WKUP_MASK2_WL_HOST_MAP_SHIFT      (16U)\r\n/*! WL_HOST_MAP - WLAN Host Map */\r\n#define APU_WL_WKUP_MASK2_WL_HOST_MAP(x)         (((uint32_t)(((uint32_t)(x)) << APU_WL_WKUP_MASK2_WL_HOST_MAP_SHIFT)) & APU_WL_WKUP_MASK2_WL_HOST_MAP_MASK)\r\n/*! @} */\r\n\r\n/*! @name WL_STATUS2 - WLAN Status 2 */\r\n/*! @{ */\r\n\r\n#define APU_WL_STATUS2_APU_MAC_CLK_EN_MASK       (0x1U)\r\n#define APU_WL_STATUS2_APU_MAC_CLK_EN_SHIFT      (0U)\r\n/*! APU_MAC_CLK_EN - APU MAC Clock Enable */\r\n#define APU_WL_STATUS2_APU_MAC_CLK_EN(x)         (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_APU_MAC_CLK_EN_SHIFT)) & APU_WL_STATUS2_APU_MAC_CLK_EN_MASK)\r\n\r\n#define APU_WL_STATUS2_APU_BBUD_CLK_EN_MASK      (0x2U)\r\n#define APU_WL_STATUS2_APU_BBUD_CLK_EN_SHIFT     (1U)\r\n/*! APU_BBUD_CLK_EN - APU BBUD Clock Enable */\r\n#define APU_WL_STATUS2_APU_BBUD_CLK_EN(x)        (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_APU_BBUD_CLK_EN_SHIFT)) & APU_WL_STATUS2_APU_BBUD_CLK_EN_MASK)\r\n\r\n#define APU_WL_STATUS2_APU_WL_RF_CLK_EN_MASK     (0x4U)\r\n#define APU_WL_STATUS2_APU_WL_RF_CLK_EN_SHIFT    (2U)\r\n/*! APU_WL_RF_CLK_EN - APU WLAN Ref Clock Enable */\r\n#define APU_WL_STATUS2_APU_WL_RF_CLK_EN(x)       (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_APU_WL_RF_CLK_EN_SHIFT)) & APU_WL_STATUS2_APU_WL_RF_CLK_EN_MASK)\r\n\r\n#define APU_WL_STATUS2_APU_WL_SLP_RDY_AFTER_MASK_MASK (0x8U)\r\n#define APU_WL_STATUS2_APU_WL_SLP_RDY_AFTER_MASK_SHIFT (3U)\r\n/*! APU_WL_SLP_RDY_AFTER_MASK - APU WLAN Sleep Ready After Mask */\r\n#define APU_WL_STATUS2_APU_WL_SLP_RDY_AFTER_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_APU_WL_SLP_RDY_AFTER_MASK_SHIFT)) & APU_WL_STATUS2_APU_WL_SLP_RDY_AFTER_MASK_MASK)\r\n\r\n#define APU_WL_STATUS2_APU_WL_RF_CTRL_MASK       (0x30U)\r\n#define APU_WL_STATUS2_APU_WL_RF_CTRL_SHIFT      (4U)\r\n/*! APU_WL_RF_CTRL - APU WLAN RF Control */\r\n#define APU_WL_STATUS2_APU_WL_RF_CTRL(x)         (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_APU_WL_RF_CTRL_SHIFT)) & APU_WL_STATUS2_APU_WL_RF_CTRL_MASK)\r\n\r\n#define APU_WL_STATUS2_APU_PLL1_EN_MASK          (0x40U)\r\n#define APU_WL_STATUS2_APU_PLL1_EN_SHIFT         (6U)\r\n/*! APU_PLL1_EN - APU PLL1 Enable */\r\n#define APU_WL_STATUS2_APU_PLL1_EN(x)            (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_APU_PLL1_EN_SHIFT)) & APU_WL_STATUS2_APU_PLL1_EN_MASK)\r\n\r\n#define APU_WL_STATUS2_APU_PLL3_EN_MASK          (0x80U)\r\n#define APU_WL_STATUS2_APU_PLL3_EN_SHIFT         (7U)\r\n/*! APU_PLL3_EN - APU PLL3 Enable */\r\n#define APU_WL_STATUS2_APU_PLL3_EN(x)            (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_APU_PLL3_EN_SHIFT)) & APU_WL_STATUS2_APU_PLL3_EN_MASK)\r\n\r\n#define APU_WL_STATUS2_BCA_MWS_WKUP_XP_MASK      (0x100U)\r\n#define APU_WL_STATUS2_BCA_MWS_WKUP_XP_SHIFT     (8U)\r\n/*! BCA_MWS_WKUP_XP - BCA MWS Wakeup XP */\r\n#define APU_WL_STATUS2_BCA_MWS_WKUP_XP(x)        (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_BCA_MWS_WKUP_XP_SHIFT)) & APU_WL_STATUS2_BCA_MWS_WKUP_XP_MASK)\r\n\r\n#define APU_WL_STATUS2_APU_RTDP_WU_RSTB_MASK     (0x200U)\r\n#define APU_WL_STATUS2_APU_RTDP_WU_RSTB_SHIFT    (9U)\r\n/*! APU_RTDP_WU_RSTB - APU RTDP WU RSTb */\r\n#define APU_WL_STATUS2_APU_RTDP_WU_RSTB(x)       (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_APU_RTDP_WU_RSTB_SHIFT)) & APU_WL_STATUS2_APU_RTDP_WU_RSTB_MASK)\r\n\r\n#define APU_WL_STATUS2_APU_BBUD_NON_UDR_RST_B_MASK (0x400U)\r\n#define APU_WL_STATUS2_APU_BBUD_NON_UDR_RST_B_SHIFT (10U)\r\n/*! APU_BBUD_NON_UDR_RST_B - APU BBUD non-UDR RSTb */\r\n#define APU_WL_STATUS2_APU_BBUD_NON_UDR_RST_B(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_APU_BBUD_NON_UDR_RST_B_SHIFT)) & APU_WL_STATUS2_APU_BBUD_NON_UDR_RST_B_MASK)\r\n\r\n#define APU_WL_STATUS2_APU_WL_ST_MASK            (0xF000U)\r\n#define APU_WL_STATUS2_APU_WL_ST_SHIFT           (12U)\r\n/*! APU_WL_ST - APU WLAN St */\r\n#define APU_WL_STATUS2_APU_WL_ST(x)              (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_APU_WL_ST_SHIFT)) & APU_WL_STATUS2_APU_WL_ST_MASK)\r\n\r\n#define APU_WL_STATUS2_APU_WLAN_SWITCH_PD_MASK   (0x10000U)\r\n#define APU_WL_STATUS2_APU_WLAN_SWITCH_PD_SHIFT  (16U)\r\n/*! APU_WLAN_SWITCH_PD - APU WLAN Switch Pd */\r\n#define APU_WL_STATUS2_APU_WLAN_SWITCH_PD(x)     (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_APU_WLAN_SWITCH_PD_SHIFT)) & APU_WL_STATUS2_APU_WLAN_SWITCH_PD_MASK)\r\n\r\n#define APU_WL_STATUS2_APU_WLAN_UDR_FIREWALL_B_MASK (0x20000U)\r\n#define APU_WL_STATUS2_APU_WLAN_UDR_FIREWALL_B_SHIFT (17U)\r\n/*! APU_WLAN_UDR_FIREWALL_B - APU WLAN UDR Firewall b */\r\n#define APU_WL_STATUS2_APU_WLAN_UDR_FIREWALL_B(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_APU_WLAN_UDR_FIREWALL_B_SHIFT)) & APU_WL_STATUS2_APU_WLAN_UDR_FIREWALL_B_MASK)\r\n\r\n#define APU_WL_STATUS2_APU_WLAN_CLK_DIV_RSTB_MASK (0x40000U)\r\n#define APU_WL_STATUS2_APU_WLAN_CLK_DIV_RSTB_SHIFT (18U)\r\n/*! APU_WLAN_CLK_DIV_RSTB - APU WLAN Clock Div RSTb */\r\n#define APU_WL_STATUS2_APU_WLAN_CLK_DIV_RSTB(x)  (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_APU_WLAN_CLK_DIV_RSTB_SHIFT)) & APU_WL_STATUS2_APU_WLAN_CLK_DIV_RSTB_MASK)\r\n\r\n#define APU_WL_STATUS2_APU_WLAN_ISO_EN_MASK      (0x80000U)\r\n#define APU_WL_STATUS2_APU_WLAN_ISO_EN_SHIFT     (19U)\r\n/*! APU_WLAN_ISO_EN - APU WLAN ISO Enable */\r\n#define APU_WL_STATUS2_APU_WLAN_ISO_EN(x)        (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_APU_WLAN_ISO_EN_SHIFT)) & APU_WL_STATUS2_APU_WLAN_ISO_EN_MASK)\r\n\r\n#define APU_WL_STATUS2_APU_WLAN_SRAM_PD_MASK     (0x100000U)\r\n#define APU_WL_STATUS2_APU_WLAN_SRAM_PD_SHIFT    (20U)\r\n/*! APU_WLAN_SRAM_PD - APU WLAN SRAM Pd */\r\n#define APU_WL_STATUS2_APU_WLAN_SRAM_PD(x)       (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_APU_WLAN_SRAM_PD_SHIFT)) & APU_WL_STATUS2_APU_WLAN_SRAM_PD_MASK)\r\n\r\n#define APU_WL_STATUS2_WLAN_VOL_REACHED_MASK     (0x200000U)\r\n#define APU_WL_STATUS2_WLAN_VOL_REACHED_SHIFT    (21U)\r\n/*! WLAN_VOL_REACHED - WLAN Volume Reached */\r\n#define APU_WL_STATUS2_WLAN_VOL_REACHED(x)       (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_WLAN_VOL_REACHED_SHIFT)) & APU_WL_STATUS2_WLAN_VOL_REACHED_MASK)\r\n\r\n#define APU_WL_STATUS2_SOC_VOL_REACHED_MASK      (0x400000U)\r\n#define APU_WL_STATUS2_SOC_VOL_REACHED_SHIFT     (22U)\r\n/*! SOC_VOL_REACHED - SoC Volume Reached */\r\n#define APU_WL_STATUS2_SOC_VOL_REACHED(x)        (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_SOC_VOL_REACHED_SHIFT)) & APU_WL_STATUS2_SOC_VOL_REACHED_MASK)\r\n\r\n#define APU_WL_STATUS2_WL_PWR_RDY_MASK           (0x800000U)\r\n#define APU_WL_STATUS2_WL_PWR_RDY_SHIFT          (23U)\r\n/*! WL_PWR_RDY - WLAN Power Ready */\r\n#define APU_WL_STATUS2_WL_PWR_RDY(x)             (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_WL_PWR_RDY_SHIFT)) & APU_WL_STATUS2_WL_PWR_RDY_MASK)\r\n\r\n#define APU_WL_STATUS2_WL_HOST_INTR_REF_MASK     (0x1000000U)\r\n#define APU_WL_STATUS2_WL_HOST_INTR_REF_SHIFT    (24U)\r\n/*! WL_HOST_INTR_REF - WLAN Host Interrupt Reference */\r\n#define APU_WL_STATUS2_WL_HOST_INTR_REF(x)       (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_WL_HOST_INTR_REF_SHIFT)) & APU_WL_STATUS2_WL_HOST_INTR_REF_MASK)\r\n\r\n#define APU_WL_STATUS2_WLAN_HOST_WKUP_MASK       (0x2000000U)\r\n#define APU_WL_STATUS2_WLAN_HOST_WKUP_SHIFT      (25U)\r\n/*! WLAN_HOST_WKUP - WLAN Host Wakeup */\r\n#define APU_WL_STATUS2_WLAN_HOST_WKUP(x)         (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_WLAN_HOST_WKUP_SHIFT)) & APU_WL_STATUS2_WLAN_HOST_WKUP_MASK)\r\n\r\n#define APU_WL_STATUS2_WL_TIMER_INTR_MASK        (0x4000000U)\r\n#define APU_WL_STATUS2_WL_TIMER_INTR_SHIFT       (26U)\r\n/*! WL_TIMER_INTR - WLAN Timer Interrupt */\r\n#define APU_WL_STATUS2_WL_TIMER_INTR(x)          (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_WL_TIMER_INTR_SHIFT)) & APU_WL_STATUS2_WL_TIMER_INTR_MASK)\r\n\r\n#define APU_WL_STATUS2_TIMER_XPP_WAKEUP_MASK     (0x8000000U)\r\n#define APU_WL_STATUS2_TIMER_XPP_WAKEUP_SHIFT    (27U)\r\n/*! TIMER_XPP_WAKEUP - Timer XPP Wakeup */\r\n#define APU_WL_STATUS2_TIMER_XPP_WAKEUP(x)       (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_TIMER_XPP_WAKEUP_SHIFT)) & APU_WL_STATUS2_TIMER_XPP_WAKEUP_MASK)\r\n\r\n#define APU_WL_STATUS2_TIMER_WAKEUP_MASK         (0x10000000U)\r\n#define APU_WL_STATUS2_TIMER_WAKEUP_SHIFT        (28U)\r\n/*! TIMER_WAKEUP - Timer Wakeup */\r\n#define APU_WL_STATUS2_TIMER_WAKEUP(x)           (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_TIMER_WAKEUP_SHIFT)) & APU_WL_STATUS2_TIMER_WAKEUP_MASK)\r\n\r\n#define APU_WL_STATUS2_WLRF_PLL_REQ_MASK         (0x20000000U)\r\n#define APU_WL_STATUS2_WLRF_PLL_REQ_SHIFT        (29U)\r\n/*! WLRF_PLL_REQ - WLAN RF PLL Request */\r\n#define APU_WL_STATUS2_WLRF_PLL_REQ(x)           (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_WLRF_PLL_REQ_SHIFT)) & APU_WL_STATUS2_WLRF_PLL_REQ_MASK)\r\n\r\n#define APU_WL_STATUS2_BBUD_T2_PLL_REQ_MASK      (0x40000000U)\r\n#define APU_WL_STATUS2_BBUD_T2_PLL_REQ_SHIFT     (30U)\r\n/*! BBUD_T2_PLL_REQ - BBUD T2 PLL Request */\r\n#define APU_WL_STATUS2_BBUD_T2_PLL_REQ(x)        (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_BBUD_T2_PLL_REQ_SHIFT)) & APU_WL_STATUS2_BBUD_T2_PLL_REQ_MASK)\r\n\r\n#define APU_WL_STATUS2_BCA_CLK_REQ_MASK          (0x80000000U)\r\n#define APU_WL_STATUS2_BCA_CLK_REQ_SHIFT         (31U)\r\n/*! BCA_CLK_REQ - BCA Clock Request */\r\n#define APU_WL_STATUS2_BCA_CLK_REQ(x)            (((uint32_t)(((uint32_t)(x)) << APU_WL_STATUS2_BCA_CLK_REQ_SHIFT)) & APU_WL_STATUS2_BCA_CLK_REQ_MASK)\r\n/*! @} */\r\n\r\n/*! @name WL_ALARM_RD2 - WLAN Alarm Readback 2 */\r\n/*! @{ */\r\n\r\n#define APU_WL_ALARM_RD2_APU_WL_ALARM_RD_MASK    (0xFFFFFFFFU)\r\n#define APU_WL_ALARM_RD2_APU_WL_ALARM_RD_SHIFT   (0U)\r\n/*! APU_WL_ALARM_RD - reads back current beacon timer alarm value */\r\n#define APU_WL_ALARM_RD2_APU_WL_ALARM_RD(x)      (((uint32_t)(((uint32_t)(x)) << APU_WL_ALARM_RD2_APU_WL_ALARM_RD_SHIFT)) & APU_WL_ALARM_RD2_APU_WL_ALARM_RD_MASK)\r\n/*! @} */\r\n\r\n/*! @name WL_BCN_XP_ALARM2 - WLAN Beacon XP Alarm 2 */\r\n/*! @{ */\r\n\r\n#define APU_WL_BCN_XP_ALARM2_WL_BCN_XP_ALARM_MASK (0xFFFFFFFFU)\r\n#define APU_WL_BCN_XP_ALARM2_WL_BCN_XP_ALARM_SHIFT (0U)\r\n/*! WL_BCN_XP_ALARM - number of sleep clocks until WLAN beacon timer requests for reference clock and power */\r\n#define APU_WL_BCN_XP_ALARM2_WL_BCN_XP_ALARM(x)  (((uint32_t)(((uint32_t)(x)) << APU_WL_BCN_XP_ALARM2_WL_BCN_XP_ALARM_SHIFT)) & APU_WL_BCN_XP_ALARM2_WL_BCN_XP_ALARM_MASK)\r\n/*! @} */\r\n\r\n/*! @name WL_BCN_INTR_ALARM2 - WLAN Beacon Interrupt Alarm 2 */\r\n/*! @{ */\r\n\r\n#define APU_WL_BCN_INTR_ALARM2_WL_BCN_INTR_ALARM_MASK (0xFFFFFFFFU)\r\n#define APU_WL_BCN_INTR_ALARM2_WL_BCN_INTR_ALARM_SHIFT (0U)\r\n/*! WL_BCN_INTR_ALARM - number of ref clocks after WLAN beacon timer request to firmware wakeup */\r\n#define APU_WL_BCN_INTR_ALARM2_WL_BCN_INTR_ALARM(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_BCN_INTR_ALARM2_WL_BCN_INTR_ALARM_SHIFT)) & APU_WL_BCN_INTR_ALARM2_WL_BCN_INTR_ALARM_MASK)\r\n/*! @} */\r\n\r\n/*! @name WL_HOST_INTR_ALARM2 - WLAN Host Interrupt Alarm 2 */\r\n/*! @{ */\r\n\r\n#define APU_WL_HOST_INTR_ALARM2_WL_HOST_INTR_ALARM_MASK (0xFFFFFFFFU)\r\n#define APU_WL_HOST_INTR_ALARM2_WL_HOST_INTR_ALARM_SHIFT (0U)\r\n/*! WL_HOST_INTR_ALARM - number of ref clocks after WLAN host request to firmware wakeup */\r\n#define APU_WL_HOST_INTR_ALARM2_WL_HOST_INTR_ALARM(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_HOST_INTR_ALARM2_WL_HOST_INTR_ALARM_SHIFT)) & APU_WL_HOST_INTR_ALARM2_WL_HOST_INTR_ALARM_MASK)\r\n/*! @} */\r\n\r\n/*! @name WL_BCN_PLL_ALARM2 - WLAN Beacon PLL Alarm 2 */\r\n/*! @{ */\r\n\r\n#define APU_WL_BCN_PLL_ALARM2_WL_BCN_PLL_ALARM_MASK (0xFFFFFFFFU)\r\n#define APU_WL_BCN_PLL_ALARM2_WL_BCN_PLL_ALARM_SHIFT (0U)\r\n/*! WL_BCN_PLL_ALARM - number of sleep clocks until WLAN beacon timer requests for reference clock, power, and PLL */\r\n#define APU_WL_BCN_PLL_ALARM2_WL_BCN_PLL_ALARM(x) (((uint32_t)(((uint32_t)(x)) << APU_WL_BCN_PLL_ALARM2_WL_BCN_PLL_ALARM_SHIFT)) & APU_WL_BCN_PLL_ALARM2_WL_BCN_PLL_ALARM_MASK)\r\n/*! @} */\r\n\r\n/*! @name WLCOMN_PWR_CTRL - WLAN Comm Powerup Control */\r\n/*! @{ */\r\n\r\n#define APU_WLCOMN_PWR_CTRL_WLCOMN_UDR_ASSERT_CNT_MASK (0xFFU)\r\n#define APU_WLCOMN_PWR_CTRL_WLCOMN_UDR_ASSERT_CNT_SHIFT (0U)\r\n/*! WLCOMN_UDR_ASSERT_CNT - WL COMM UDR Assert Count */\r\n#define APU_WLCOMN_PWR_CTRL_WLCOMN_UDR_ASSERT_CNT(x) (((uint32_t)(((uint32_t)(x)) << APU_WLCOMN_PWR_CTRL_WLCOMN_UDR_ASSERT_CNT_SHIFT)) & APU_WLCOMN_PWR_CTRL_WLCOMN_UDR_ASSERT_CNT_MASK)\r\n\r\n#define APU_WLCOMN_PWR_CTRL_USE_WLCOMN_PWR_RDY_FOR_WL_MASK (0x100U)\r\n#define APU_WLCOMN_PWR_CTRL_USE_WLCOMN_PWR_RDY_FOR_WL_SHIFT (8U)\r\n/*! USE_WLCOMN_PWR_RDY_FOR_WL - Use WL COMM Power Ready fro WLAN */\r\n#define APU_WLCOMN_PWR_CTRL_USE_WLCOMN_PWR_RDY_FOR_WL(x) (((uint32_t)(((uint32_t)(x)) << APU_WLCOMN_PWR_CTRL_USE_WLCOMN_PWR_RDY_FOR_WL_SHIFT)) & APU_WLCOMN_PWR_CTRL_USE_WLCOMN_PWR_RDY_FOR_WL_MASK)\r\n\r\n#define APU_WLCOMN_PWR_CTRL_USE_DEEPSLEEP_FOR_SYS_CLK_EN_MASK (0x200U)\r\n#define APU_WLCOMN_PWR_CTRL_USE_DEEPSLEEP_FOR_SYS_CLK_EN_SHIFT (9U)\r\n/*! USE_DEEPSLEEP_FOR_SYS_CLK_EN - Use Deep Sleep for SYS_CLK Enable */\r\n#define APU_WLCOMN_PWR_CTRL_USE_DEEPSLEEP_FOR_SYS_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_WLCOMN_PWR_CTRL_USE_DEEPSLEEP_FOR_SYS_CLK_EN_SHIFT)) & APU_WLCOMN_PWR_CTRL_USE_DEEPSLEEP_FOR_SYS_CLK_EN_MASK)\r\n\r\n#define APU_WLCOMN_PWR_CTRL_IDLE2ISO_DLY_EN_MASK (0x400U)\r\n#define APU_WLCOMN_PWR_CTRL_IDLE2ISO_DLY_EN_SHIFT (10U)\r\n/*! IDLE2ISO_DLY_EN - wlcomn FSM state delay enable. When 1, use wlcomn_pwr_ctrl_dly and wlcomn_pwr_ctrl_dly2. When 0, no delay. */\r\n#define APU_WLCOMN_PWR_CTRL_IDLE2ISO_DLY_EN(x)   (((uint32_t)(((uint32_t)(x)) << APU_WLCOMN_PWR_CTRL_IDLE2ISO_DLY_EN_SHIFT)) & APU_WLCOMN_PWR_CTRL_IDLE2ISO_DLY_EN_MASK)\r\n\r\n#define APU_WLCOMN_PWR_CTRL_CPU_VINITHI_MASK     (0x8000U)\r\n#define APU_WLCOMN_PWR_CTRL_CPU_VINITHI_SHIFT    (15U)\r\n/*! CPU_VINITHI - CPU to CPU Delay */\r\n#define APU_WLCOMN_PWR_CTRL_CPU_VINITHI(x)       (((uint32_t)(((uint32_t)(x)) << APU_WLCOMN_PWR_CTRL_CPU_VINITHI_SHIFT)) & APU_WLCOMN_PWR_CTRL_CPU_VINITHI_MASK)\r\n\r\n#define APU_WLCOMN_PWR_CTRL_WLCOMN_PWRUP_CNT_MASK (0xFFFF0000U)\r\n#define APU_WLCOMN_PWR_CTRL_WLCOMN_PWRUP_CNT_SHIFT (16U)\r\n/*! WLCOMN_PWRUP_CNT - number of reference clocks after soc_pwr_rdy to push wlcomn power up */\r\n#define APU_WLCOMN_PWR_CTRL_WLCOMN_PWRUP_CNT(x)  (((uint32_t)(((uint32_t)(x)) << APU_WLCOMN_PWR_CTRL_WLCOMN_PWRUP_CNT_SHIFT)) & APU_WLCOMN_PWR_CTRL_WLCOMN_PWRUP_CNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name WLCOMN_STATUS - WLAN Comm Status */\r\n/*! @{ */\r\n\r\n#define APU_WLCOMN_STATUS_START_WLCOMN_WKUP_REFCK_MASK (0x400U)\r\n#define APU_WLCOMN_STATUS_START_WLCOMN_WKUP_REFCK_SHIFT (10U)\r\n/*! START_WLCOMN_WKUP_REFCK - WLCOMN FSM start ip wake up */\r\n#define APU_WLCOMN_STATUS_START_WLCOMN_WKUP_REFCK(x) (((uint32_t)(((uint32_t)(x)) << APU_WLCOMN_STATUS_START_WLCOMN_WKUP_REFCK_SHIFT)) & APU_WLCOMN_STATUS_START_WLCOMN_WKUP_REFCK_MASK)\r\n\r\n#define APU_WLCOMN_STATUS_ENTER_CPU1_SUB_DSLP_REFCK_MASK (0x800U)\r\n#define APU_WLCOMN_STATUS_ENTER_CPU1_SUB_DSLP_REFCK_SHIFT (11U)\r\n/*! ENTER_CPU1_SUB_DSLP_REFCK - WLCOMN FSM enter ip power down */\r\n#define APU_WLCOMN_STATUS_ENTER_CPU1_SUB_DSLP_REFCK(x) (((uint32_t)(((uint32_t)(x)) << APU_WLCOMN_STATUS_ENTER_CPU1_SUB_DSLP_REFCK_SHIFT)) & APU_WLCOMN_STATUS_ENTER_CPU1_SUB_DSLP_REFCK_MASK)\r\n\r\n#define APU_WLCOMN_STATUS_APU_WLCOMN_ST_MASK     (0xF000U)\r\n#define APU_WLCOMN_STATUS_APU_WLCOMN_ST_SHIFT    (12U)\r\n/*! APU_WLCOMN_ST - APU WLAN COMN St */\r\n#define APU_WLCOMN_STATUS_APU_WLCOMN_ST(x)       (((uint32_t)(((uint32_t)(x)) << APU_WLCOMN_STATUS_APU_WLCOMN_ST_SHIFT)) & APU_WLCOMN_STATUS_APU_WLCOMN_ST_MASK)\r\n\r\n#define APU_WLCOMN_STATUS_APU_WLCOMN_SWITCH_PD_MASK (0x10000U)\r\n#define APU_WLCOMN_STATUS_APU_WLCOMN_SWITCH_PD_SHIFT (16U)\r\n/*! APU_WLCOMN_SWITCH_PD - APU WLAN COMN Switch Pd */\r\n#define APU_WLCOMN_STATUS_APU_WLCOMN_SWITCH_PD(x) (((uint32_t)(((uint32_t)(x)) << APU_WLCOMN_STATUS_APU_WLCOMN_SWITCH_PD_SHIFT)) & APU_WLCOMN_STATUS_APU_WLCOMN_SWITCH_PD_MASK)\r\n\r\n#define APU_WLCOMN_STATUS_APU_WLCOMN_UDR_FIREWALL_B_MASK (0x20000U)\r\n#define APU_WLCOMN_STATUS_APU_WLCOMN_UDR_FIREWALL_B_SHIFT (17U)\r\n/*! APU_WLCOMN_UDR_FIREWALL_B - APU WLAN COMN UDR Firewall b */\r\n#define APU_WLCOMN_STATUS_APU_WLCOMN_UDR_FIREWALL_B(x) (((uint32_t)(((uint32_t)(x)) << APU_WLCOMN_STATUS_APU_WLCOMN_UDR_FIREWALL_B_SHIFT)) & APU_WLCOMN_STATUS_APU_WLCOMN_UDR_FIREWALL_B_MASK)\r\n\r\n#define APU_WLCOMN_STATUS_APU_WLCOMN_CLK_DIV_RSTB_MASK (0x40000U)\r\n#define APU_WLCOMN_STATUS_APU_WLCOMN_CLK_DIV_RSTB_SHIFT (18U)\r\n/*! APU_WLCOMN_CLK_DIV_RSTB - APU WLAN COMN Clock Div RSTb */\r\n#define APU_WLCOMN_STATUS_APU_WLCOMN_CLK_DIV_RSTB(x) (((uint32_t)(((uint32_t)(x)) << APU_WLCOMN_STATUS_APU_WLCOMN_CLK_DIV_RSTB_SHIFT)) & APU_WLCOMN_STATUS_APU_WLCOMN_CLK_DIV_RSTB_MASK)\r\n\r\n#define APU_WLCOMN_STATUS_APU_WLCOMN_ISO_EN_MASK (0x80000U)\r\n#define APU_WLCOMN_STATUS_APU_WLCOMN_ISO_EN_SHIFT (19U)\r\n/*! APU_WLCOMN_ISO_EN - APU WLAN COMN ISO Enable */\r\n#define APU_WLCOMN_STATUS_APU_WLCOMN_ISO_EN(x)   (((uint32_t)(((uint32_t)(x)) << APU_WLCOMN_STATUS_APU_WLCOMN_ISO_EN_SHIFT)) & APU_WLCOMN_STATUS_APU_WLCOMN_ISO_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BT_CTRL - Bluetooth Control */\r\n/*! @{ */\r\n\r\n#define APU_BT_CTRL_BT_SLP_RDY_MASK              (0x1U)\r\n#define APU_BT_CTRL_BT_SLP_RDY_SHIFT             (0U)\r\n/*! BT_SLP_RDY - Bluetooth Sleep Ready */\r\n#define APU_BT_CTRL_BT_SLP_RDY(x)                (((uint32_t)(((uint32_t)(x)) << APU_BT_CTRL_BT_SLP_RDY_SHIFT)) & APU_BT_CTRL_BT_SLP_RDY_MASK)\r\n\r\n#define APU_BT_CTRL_BT_SLP_RDYMASK_MASK          (0x2U)\r\n#define APU_BT_CTRL_BT_SLP_RDYMASK_SHIFT         (1U)\r\n/*! BT_SLP_RDYMASK - Bluetoot Sleep Ready Mask */\r\n#define APU_BT_CTRL_BT_SLP_RDYMASK(x)            (((uint32_t)(((uint32_t)(x)) << APU_BT_CTRL_BT_SLP_RDYMASK_SHIFT)) & APU_BT_CTRL_BT_SLP_RDYMASK_MASK)\r\n\r\n#define APU_BT_CTRL_BT_SLP_RDY_FW_MASK           (0x4U)\r\n#define APU_BT_CTRL_BT_SLP_RDY_FW_SHIFT          (2U)\r\n/*! BT_SLP_RDY_FW - Bluetooth Sleep Ready FW */\r\n#define APU_BT_CTRL_BT_SLP_RDY_FW(x)             (((uint32_t)(((uint32_t)(x)) << APU_BT_CTRL_BT_SLP_RDY_FW_SHIFT)) & APU_BT_CTRL_BT_SLP_RDY_FW_MASK)\r\n\r\n#define APU_BT_CTRL_BTU_CLK_NCO_MODE_SEL_EN_MASK (0x8U)\r\n#define APU_BT_CTRL_BTU_CLK_NCO_MODE_SEL_EN_SHIFT (3U)\r\n/*! BTU_CLK_NCO_MODE_SEL_EN - 0- disable the btu_clk_nco_mode from CIU2, keep the bt_clk_req as XP wakeup source */\r\n#define APU_BT_CTRL_BTU_CLK_NCO_MODE_SEL_EN(x)   (((uint32_t)(((uint32_t)(x)) << APU_BT_CTRL_BTU_CLK_NCO_MODE_SEL_EN_SHIFT)) & APU_BT_CTRL_BTU_CLK_NCO_MODE_SEL_EN_MASK)\r\n\r\n#define APU_BT_CTRL_USE_BT_INTR_SLP_MASK         (0x80U)\r\n#define APU_BT_CTRL_USE_BT_INTR_SLP_SHIFT        (7U)\r\n/*! USE_BT_INTR_SLP - Use Bluetooth interrupt Sleep */\r\n#define APU_BT_CTRL_USE_BT_INTR_SLP(x)           (((uint32_t)(((uint32_t)(x)) << APU_BT_CTRL_USE_BT_INTR_SLP_SHIFT)) & APU_BT_CTRL_USE_BT_INTR_SLP_MASK)\r\n\r\n#define APU_BT_CTRL_BT_CLK_SYNC_MODE_SEL1_MASK   (0x4000000U)\r\n#define APU_BT_CTRL_BT_CLK_SYNC_MODE_SEL1_SHIFT  (26U)\r\n/*! BT_CLK_SYNC_MODE_SEL1 - Bluetooth Clock Sync Mode Select 1 */\r\n#define APU_BT_CTRL_BT_CLK_SYNC_MODE_SEL1(x)     (((uint32_t)(((uint32_t)(x)) << APU_BT_CTRL_BT_CLK_SYNC_MODE_SEL1_SHIFT)) & APU_BT_CTRL_BT_CLK_SYNC_MODE_SEL1_MASK)\r\n\r\n#define APU_BT_CTRL_USE_GLITCH_FREE_BT_CLK_REQ_MASK (0x8000000U)\r\n#define APU_BT_CTRL_USE_GLITCH_FREE_BT_CLK_REQ_SHIFT (27U)\r\n/*! USE_GLITCH_FREE_BT_CLK_REQ - Use Glitch-Free Bluetooth Clock Request */\r\n#define APU_BT_CTRL_USE_GLITCH_FREE_BT_CLK_REQ(x) (((uint32_t)(((uint32_t)(x)) << APU_BT_CTRL_USE_GLITCH_FREE_BT_CLK_REQ_SHIFT)) & APU_BT_CTRL_USE_GLITCH_FREE_BT_CLK_REQ_MASK)\r\n\r\n#define APU_BT_CTRL_BRF_CLK_SYNC_MODE_SEL_MASK   (0x10000000U)\r\n#define APU_BT_CTRL_BRF_CLK_SYNC_MODE_SEL_SHIFT  (28U)\r\n/*! BRF_CLK_SYNC_MODE_SEL - BRF Clock Sync Mode Select */\r\n#define APU_BT_CTRL_BRF_CLK_SYNC_MODE_SEL(x)     (((uint32_t)(((uint32_t)(x)) << APU_BT_CTRL_BRF_CLK_SYNC_MODE_SEL_SHIFT)) & APU_BT_CTRL_BRF_CLK_SYNC_MODE_SEL_MASK)\r\n\r\n#define APU_BT_CTRL_BT_CLK_SYNC_MODE_SEL0_MASK   (0x20000000U)\r\n#define APU_BT_CTRL_BT_CLK_SYNC_MODE_SEL0_SHIFT  (29U)\r\n/*! BT_CLK_SYNC_MODE_SEL0 - Bluetooth Clock Sync Mode Select 0 */\r\n#define APU_BT_CTRL_BT_CLK_SYNC_MODE_SEL0(x)     (((uint32_t)(((uint32_t)(x)) << APU_BT_CTRL_BT_CLK_SYNC_MODE_SEL0_SHIFT)) & APU_BT_CTRL_BT_CLK_SYNC_MODE_SEL0_MASK)\r\n\r\n#define APU_BT_CTRL_BT_PLL_SYNC_MODE_SEL_MASK    (0x40000000U)\r\n#define APU_BT_CTRL_BT_PLL_SYNC_MODE_SEL_SHIFT   (30U)\r\n/*! BT_PLL_SYNC_MODE_SEL - Bluetooth PLL Sync Mode Select */\r\n#define APU_BT_CTRL_BT_PLL_SYNC_MODE_SEL(x)      (((uint32_t)(((uint32_t)(x)) << APU_BT_CTRL_BT_PLL_SYNC_MODE_SEL_SHIFT)) & APU_BT_CTRL_BT_PLL_SYNC_MODE_SEL_MASK)\r\n\r\n#define APU_BT_CTRL_BT_HOST_SLP_RDY_MASK         (0x80000000U)\r\n#define APU_BT_CTRL_BT_HOST_SLP_RDY_SHIFT        (31U)\r\n/*! BT_HOST_SLP_RDY - Bluetooth Host Sleep Ready */\r\n#define APU_BT_CTRL_BT_HOST_SLP_RDY(x)           (((uint32_t)(((uint32_t)(x)) << APU_BT_CTRL_BT_HOST_SLP_RDY_SHIFT)) & APU_BT_CTRL_BT_HOST_SLP_RDY_MASK)\r\n/*! @} */\r\n\r\n/*! @name BT_WKUP_MASK - Bluetooth Wakeup Mask */\r\n/*! @{ */\r\n\r\n#define APU_BT_WKUP_MASK_BCA_CLK_REQ_MASK_MASK   (0x1U)\r\n#define APU_BT_WKUP_MASK_BCA_CLK_REQ_MASK_SHIFT  (0U)\r\n/*! BCA_CLK_REQ_MASK - BCA Clock Request Mask */\r\n#define APU_BT_WKUP_MASK_BCA_CLK_REQ_MASK(x)     (((uint32_t)(((uint32_t)(x)) << APU_BT_WKUP_MASK_BCA_CLK_REQ_MASK_SHIFT)) & APU_BT_WKUP_MASK_BCA_CLK_REQ_MASK_MASK)\r\n\r\n#define APU_BT_WKUP_MASK_BT_CLK_REQ_MASK_MASK    (0x2U)\r\n#define APU_BT_WKUP_MASK_BT_CLK_REQ_MASK_SHIFT   (1U)\r\n/*! BT_CLK_REQ_MASK - Bluetooth Clock Request Mask */\r\n#define APU_BT_WKUP_MASK_BT_CLK_REQ_MASK(x)      (((uint32_t)(((uint32_t)(x)) << APU_BT_WKUP_MASK_BT_CLK_REQ_MASK_SHIFT)) & APU_BT_WKUP_MASK_BT_CLK_REQ_MASK_MASK)\r\n\r\n#define APU_BT_WKUP_MASK_BT_WB_ACTIVE_REQ_MASK_MASK (0x4U)\r\n#define APU_BT_WKUP_MASK_BT_WB_ACTIVE_REQ_MASK_SHIFT (2U)\r\n/*! BT_WB_ACTIVE_REQ_MASK - Bluetooth WB Active Request Mask */\r\n#define APU_BT_WKUP_MASK_BT_WB_ACTIVE_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_BT_WKUP_MASK_BT_WB_ACTIVE_REQ_MASK_SHIFT)) & APU_BT_WKUP_MASK_BT_WB_ACTIVE_REQ_MASK_MASK)\r\n\r\n#define APU_BT_WKUP_MASK_BT_INTR_MASK_MASK       (0x8U)\r\n#define APU_BT_WKUP_MASK_BT_INTR_MASK_SHIFT      (3U)\r\n/*! BT_INTR_MASK - Bluetooth Interrupt Mask */\r\n#define APU_BT_WKUP_MASK_BT_INTR_MASK(x)         (((uint32_t)(((uint32_t)(x)) << APU_BT_WKUP_MASK_BT_INTR_MASK_SHIFT)) & APU_BT_WKUP_MASK_BT_INTR_MASK_MASK)\r\n\r\n#define APU_BT_WKUP_MASK_BT_PLL_REQ_MASK_MASK    (0x10U)\r\n#define APU_BT_WKUP_MASK_BT_PLL_REQ_MASK_SHIFT   (4U)\r\n/*! BT_PLL_REQ_MASK - Bluetooth PLL Request Mask */\r\n#define APU_BT_WKUP_MASK_BT_PLL_REQ_MASK(x)      (((uint32_t)(((uint32_t)(x)) << APU_BT_WKUP_MASK_BT_PLL_REQ_MASK_SHIFT)) & APU_BT_WKUP_MASK_BT_PLL_REQ_MASK_MASK)\r\n\r\n#define APU_BT_WKUP_MASK_BRF_PLL_REQ_MASK_MASK   (0x20U)\r\n#define APU_BT_WKUP_MASK_BRF_PLL_REQ_MASK_SHIFT  (5U)\r\n/*! BRF_PLL_REQ_MASK - BRF PLL Request Mask */\r\n#define APU_BT_WKUP_MASK_BRF_PLL_REQ_MASK(x)     (((uint32_t)(((uint32_t)(x)) << APU_BT_WKUP_MASK_BRF_PLL_REQ_MASK_SHIFT)) & APU_BT_WKUP_MASK_BRF_PLL_REQ_MASK_MASK)\r\n\r\n#define APU_BT_WKUP_MASK_BT_HOST_MAP_MASK        (0xFFFF0000U)\r\n#define APU_BT_WKUP_MASK_BT_HOST_MAP_SHIFT       (16U)\r\n/*! BT_HOST_MAP - Bluetooth Host Map */\r\n#define APU_BT_WKUP_MASK_BT_HOST_MAP(x)          (((uint32_t)(((uint32_t)(x)) << APU_BT_WKUP_MASK_BT_HOST_MAP_SHIFT)) & APU_BT_WKUP_MASK_BT_HOST_MAP_MASK)\r\n/*! @} */\r\n\r\n/*! @name BT_STATUS - Bluetooth Status */\r\n/*! @{ */\r\n\r\n#define APU_BT_STATUS_APU_BT_CLK_EN_MASK         (0x1U)\r\n#define APU_BT_STATUS_APU_BT_CLK_EN_SHIFT        (0U)\r\n/*! APU_BT_CLK_EN - APU Bluetooth Clock Enable */\r\n#define APU_BT_STATUS_APU_BT_CLK_EN(x)           (((uint32_t)(((uint32_t)(x)) << APU_BT_STATUS_APU_BT_CLK_EN_SHIFT)) & APU_BT_STATUS_APU_BT_CLK_EN_MASK)\r\n\r\n#define APU_BT_STATUS_APU_BRF_CLK_EN_MASK        (0x2U)\r\n#define APU_BT_STATUS_APU_BRF_CLK_EN_SHIFT       (1U)\r\n/*! APU_BRF_CLK_EN - APU BRF Clock Enable */\r\n#define APU_BT_STATUS_APU_BRF_CLK_EN(x)          (((uint32_t)(((uint32_t)(x)) << APU_BT_STATUS_APU_BRF_CLK_EN_SHIFT)) & APU_BT_STATUS_APU_BRF_CLK_EN_MASK)\r\n\r\n#define APU_BT_STATUS_BT_ACTIVE_SLPCK_MASK       (0x4U)\r\n#define APU_BT_STATUS_BT_ACTIVE_SLPCK_SHIFT      (2U)\r\n/*! BT_ACTIVE_SLPCK - Bluetooth Active Sleep Clock */\r\n#define APU_BT_STATUS_BT_ACTIVE_SLPCK(x)         (((uint32_t)(((uint32_t)(x)) << APU_BT_STATUS_BT_ACTIVE_SLPCK_SHIFT)) & APU_BT_STATUS_BT_ACTIVE_SLPCK_MASK)\r\n\r\n#define APU_BT_STATUS_BT_HOST_WKUP_MASK          (0x10U)\r\n#define APU_BT_STATUS_BT_HOST_WKUP_SHIFT         (4U)\r\n/*! BT_HOST_WKUP - Bluetooth Host Wakeup */\r\n#define APU_BT_STATUS_BT_HOST_WKUP(x)            (((uint32_t)(((uint32_t)(x)) << APU_BT_STATUS_BT_HOST_WKUP_SHIFT)) & APU_BT_STATUS_BT_HOST_WKUP_MASK)\r\n\r\n#define APU_BT_STATUS_BT_INTERRUPT_MASK          (0x20U)\r\n#define APU_BT_STATUS_BT_INTERRUPT_SHIFT         (5U)\r\n/*! BT_INTERRUPT - Bluetooth Interrupt */\r\n#define APU_BT_STATUS_BT_INTERRUPT(x)            (((uint32_t)(((uint32_t)(x)) << APU_BT_STATUS_BT_INTERRUPT_SHIFT)) & APU_BT_STATUS_BT_INTERRUPT_MASK)\r\n\r\n#define APU_BT_STATUS_BT_PLL_REQ_MASK            (0x40U)\r\n#define APU_BT_STATUS_BT_PLL_REQ_SHIFT           (6U)\r\n/*! BT_PLL_REQ - Bluetooth PLL Request */\r\n#define APU_BT_STATUS_BT_PLL_REQ(x)              (((uint32_t)(((uint32_t)(x)) << APU_BT_STATUS_BT_PLL_REQ_SHIFT)) & APU_BT_STATUS_BT_PLL_REQ_MASK)\r\n\r\n#define APU_BT_STATUS_BT_CLK_REQ_MASK            (0x80U)\r\n#define APU_BT_STATUS_BT_CLK_REQ_SHIFT           (7U)\r\n/*! BT_CLK_REQ - Bluetooth Clock Request */\r\n#define APU_BT_STATUS_BT_CLK_REQ(x)              (((uint32_t)(((uint32_t)(x)) << APU_BT_STATUS_BT_CLK_REQ_SHIFT)) & APU_BT_STATUS_BT_CLK_REQ_MASK)\r\n\r\n#define APU_BT_STATUS_BRF_PLL_REQ_MASK           (0x100U)\r\n#define APU_BT_STATUS_BRF_PLL_REQ_SHIFT          (8U)\r\n/*! BRF_PLL_REQ - BRF PLL Request */\r\n#define APU_BT_STATUS_BRF_PLL_REQ(x)             (((uint32_t)(((uint32_t)(x)) << APU_BT_STATUS_BRF_PLL_REQ_SHIFT)) & APU_BT_STATUS_BRF_PLL_REQ_MASK)\r\n\r\n#define APU_BT_STATUS_BT_WIDEBAND_ACTIVE_MASK    (0x200U)\r\n#define APU_BT_STATUS_BT_WIDEBAND_ACTIVE_SHIFT   (9U)\r\n/*! BT_WIDEBAND_ACTIVE - Bluetooth Wideband Active */\r\n#define APU_BT_STATUS_BT_WIDEBAND_ACTIVE(x)      (((uint32_t)(((uint32_t)(x)) << APU_BT_STATUS_BT_WIDEBAND_ACTIVE_SHIFT)) & APU_BT_STATUS_BT_WIDEBAND_ACTIVE_MASK)\r\n\r\n#define APU_BT_STATUS_HOST_WKUP_IN_MASK          (0xFFFF0000U)\r\n#define APU_BT_STATUS_HOST_WKUP_IN_SHIFT         (16U)\r\n/*! HOST_WKUP_IN - Host Wakeup In */\r\n#define APU_BT_STATUS_HOST_WKUP_IN(x)            (((uint32_t)(((uint32_t)(x)) << APU_BT_STATUS_HOST_WKUP_IN_SHIFT)) & APU_BT_STATUS_HOST_WKUP_IN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BT_CKEN_CTRL - Bluetooth Clock Enable Control */\r\n/*! @{ */\r\n\r\n#define APU_BT_CKEN_CTRL_BT_CLK_EN_VAL_PWR_MASK  (0x1U)\r\n#define APU_BT_CKEN_CTRL_BT_CLK_EN_VAL_PWR_SHIFT (0U)\r\n/*! BT_CLK_EN_VAL_PWR - control value for bt_clk_en when power ready */\r\n#define APU_BT_CKEN_CTRL_BT_CLK_EN_VAL_PWR(x)    (((uint32_t)(((uint32_t)(x)) << APU_BT_CKEN_CTRL_BT_CLK_EN_VAL_PWR_SHIFT)) & APU_BT_CKEN_CTRL_BT_CLK_EN_VAL_PWR_MASK)\r\n\r\n#define APU_BT_CKEN_CTRL_BL_CLK_EN_SEL_PWR_MASK  (0x2U)\r\n#define APU_BT_CKEN_CTRL_BL_CLK_EN_SEL_PWR_SHIFT (1U)\r\n/*! BL_CLK_EN_SEL_PWR - selection for bt_clk_en when power ready */\r\n#define APU_BT_CKEN_CTRL_BL_CLK_EN_SEL_PWR(x)    (((uint32_t)(((uint32_t)(x)) << APU_BT_CKEN_CTRL_BL_CLK_EN_SEL_PWR_SHIFT)) & APU_BT_CKEN_CTRL_BL_CLK_EN_SEL_PWR_MASK)\r\n\r\n#define APU_BT_CKEN_CTRL_BT_CLK_EN_VAL_XOSC_MASK (0x4U)\r\n#define APU_BT_CKEN_CTRL_BT_CLK_EN_VAL_XOSC_SHIFT (2U)\r\n/*! BT_CLK_EN_VAL_XOSC - control value for bt_clk_en when XOSC ready */\r\n#define APU_BT_CKEN_CTRL_BT_CLK_EN_VAL_XOSC(x)   (((uint32_t)(((uint32_t)(x)) << APU_BT_CKEN_CTRL_BT_CLK_EN_VAL_XOSC_SHIFT)) & APU_BT_CKEN_CTRL_BT_CLK_EN_VAL_XOSC_MASK)\r\n\r\n#define APU_BT_CKEN_CTRL_BT_CLK_EN_SEL_XOSC_MASK (0x8U)\r\n#define APU_BT_CKEN_CTRL_BT_CLK_EN_SEL_XOSC_SHIFT (3U)\r\n/*! BT_CLK_EN_SEL_XOSC - selection for bt_clk_en when XOSC ready */\r\n#define APU_BT_CKEN_CTRL_BT_CLK_EN_SEL_XOSC(x)   (((uint32_t)(((uint32_t)(x)) << APU_BT_CKEN_CTRL_BT_CLK_EN_SEL_XOSC_SHIFT)) & APU_BT_CKEN_CTRL_BT_CLK_EN_SEL_XOSC_MASK)\r\n\r\n#define APU_BT_CKEN_CTRL_BT_CLK_EN_VAL_MASK      (0x10U)\r\n#define APU_BT_CKEN_CTRL_BT_CLK_EN_VAL_SHIFT     (4U)\r\n/*! BT_CLK_EN_VAL - control value for bt_clk_en when PLL ready */\r\n#define APU_BT_CKEN_CTRL_BT_CLK_EN_VAL(x)        (((uint32_t)(((uint32_t)(x)) << APU_BT_CKEN_CTRL_BT_CLK_EN_VAL_SHIFT)) & APU_BT_CKEN_CTRL_BT_CLK_EN_VAL_MASK)\r\n\r\n#define APU_BT_CKEN_CTRL_BT_CLK_EN_SEL_MASK      (0x20U)\r\n#define APU_BT_CKEN_CTRL_BT_CLK_EN_SEL_SHIFT     (5U)\r\n/*! BT_CLK_EN_SEL - selection for bt_clk_en when PLL ready */\r\n#define APU_BT_CKEN_CTRL_BT_CLK_EN_SEL(x)        (((uint32_t)(((uint32_t)(x)) << APU_BT_CKEN_CTRL_BT_CLK_EN_SEL_SHIFT)) & APU_BT_CKEN_CTRL_BT_CLK_EN_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name BT_RESRC_CTRL - Bluetooth RESRC Control */\r\n/*! @{ */\r\n\r\n#define APU_BT_RESRC_CTRL_FW_PWR_REQ_MASK        (0x1U)\r\n#define APU_BT_RESRC_CTRL_FW_PWR_REQ_SHIFT       (0U)\r\n/*! FW_PWR_REQ - override hw power request */\r\n#define APU_BT_RESRC_CTRL_FW_PWR_REQ(x)          (((uint32_t)(((uint32_t)(x)) << APU_BT_RESRC_CTRL_FW_PWR_REQ_SHIFT)) & APU_BT_RESRC_CTRL_FW_PWR_REQ_MASK)\r\n\r\n#define APU_BT_RESRC_CTRL_FW_PWR_REQ_VAL_MASK    (0x2U)\r\n#define APU_BT_RESRC_CTRL_FW_PWR_REQ_VAL_SHIFT   (1U)\r\n/*! FW_PWR_REQ_VAL - override value when apu_bt_resrc_ctrl[0] is set */\r\n#define APU_BT_RESRC_CTRL_FW_PWR_REQ_VAL(x)      (((uint32_t)(((uint32_t)(x)) << APU_BT_RESRC_CTRL_FW_PWR_REQ_VAL_SHIFT)) & APU_BT_RESRC_CTRL_FW_PWR_REQ_VAL_MASK)\r\n\r\n#define APU_BT_RESRC_CTRL_FW_XOSC_REQ_MASK       (0x4U)\r\n#define APU_BT_RESRC_CTRL_FW_XOSC_REQ_SHIFT      (2U)\r\n/*! FW_XOSC_REQ - override hw xosc request */\r\n#define APU_BT_RESRC_CTRL_FW_XOSC_REQ(x)         (((uint32_t)(((uint32_t)(x)) << APU_BT_RESRC_CTRL_FW_XOSC_REQ_SHIFT)) & APU_BT_RESRC_CTRL_FW_XOSC_REQ_MASK)\r\n\r\n#define APU_BT_RESRC_CTRL_FW_XOSC_REQ_VAL_MASK   (0x8U)\r\n#define APU_BT_RESRC_CTRL_FW_XOSC_REQ_VAL_SHIFT  (3U)\r\n/*! FW_XOSC_REQ_VAL - override value when apu_bt_resrc_ctrl[2] is set */\r\n#define APU_BT_RESRC_CTRL_FW_XOSC_REQ_VAL(x)     (((uint32_t)(((uint32_t)(x)) << APU_BT_RESRC_CTRL_FW_XOSC_REQ_VAL_SHIFT)) & APU_BT_RESRC_CTRL_FW_XOSC_REQ_VAL_MASK)\r\n\r\n#define APU_BT_RESRC_CTRL_FW_XP_REQ_MASK         (0x10U)\r\n#define APU_BT_RESRC_CTRL_FW_XP_REQ_SHIFT        (4U)\r\n/*! FW_XP_REQ - override hw xosc + pwr request */\r\n#define APU_BT_RESRC_CTRL_FW_XP_REQ(x)           (((uint32_t)(((uint32_t)(x)) << APU_BT_RESRC_CTRL_FW_XP_REQ_SHIFT)) & APU_BT_RESRC_CTRL_FW_XP_REQ_MASK)\r\n\r\n#define APU_BT_RESRC_CTRL_FW_XP_REQ_VAL_MASK     (0x20U)\r\n#define APU_BT_RESRC_CTRL_FW_XP_REQ_VAL_SHIFT    (5U)\r\n/*! FW_XP_REQ_VAL - override value when apu_bt_resrc_ctrl[4] is set */\r\n#define APU_BT_RESRC_CTRL_FW_XP_REQ_VAL(x)       (((uint32_t)(((uint32_t)(x)) << APU_BT_RESRC_CTRL_FW_XP_REQ_VAL_SHIFT)) & APU_BT_RESRC_CTRL_FW_XP_REQ_VAL_MASK)\r\n\r\n#define APU_BT_RESRC_CTRL_FW_SB_REQ_MASK         (0x40U)\r\n#define APU_BT_RESRC_CTRL_FW_SB_REQ_SHIFT        (6U)\r\n/*! FW_SB_REQ - override hw xosc + pwr + pll sb request */\r\n#define APU_BT_RESRC_CTRL_FW_SB_REQ(x)           (((uint32_t)(((uint32_t)(x)) << APU_BT_RESRC_CTRL_FW_SB_REQ_SHIFT)) & APU_BT_RESRC_CTRL_FW_SB_REQ_MASK)\r\n\r\n#define APU_BT_RESRC_CTRL_FW_SB_REQ_VAL_MASK     (0x80U)\r\n#define APU_BT_RESRC_CTRL_FW_SB_REQ_VAL_SHIFT    (7U)\r\n/*! FW_SB_REQ_VAL - override value when apu_bt_resrc_ctrl[6] is set */\r\n#define APU_BT_RESRC_CTRL_FW_SB_REQ_VAL(x)       (((uint32_t)(((uint32_t)(x)) << APU_BT_RESRC_CTRL_FW_SB_REQ_VAL_SHIFT)) & APU_BT_RESRC_CTRL_FW_SB_REQ_VAL_MASK)\r\n\r\n#define APU_BT_RESRC_CTRL_FW_IPWAKE_REQ_MASK     (0x100U)\r\n#define APU_BT_RESRC_CTRL_FW_IPWAKE_REQ_SHIFT    (8U)\r\n/*! FW_IPWAKE_REQ - override hw xosc + pwr + pll ipwake request */\r\n#define APU_BT_RESRC_CTRL_FW_IPWAKE_REQ(x)       (((uint32_t)(((uint32_t)(x)) << APU_BT_RESRC_CTRL_FW_IPWAKE_REQ_SHIFT)) & APU_BT_RESRC_CTRL_FW_IPWAKE_REQ_MASK)\r\n\r\n#define APU_BT_RESRC_CTRL_FW_IPWAKE_REQ_VAL_MASK (0x200U)\r\n#define APU_BT_RESRC_CTRL_FW_IPWAKE_REQ_VAL_SHIFT (9U)\r\n/*! FW_IPWAKE_REQ_VAL - override value when apu_bt_resrc_ctrl[8] is set */\r\n#define APU_BT_RESRC_CTRL_FW_IPWAKE_REQ_VAL(x)   (((uint32_t)(((uint32_t)(x)) << APU_BT_RESRC_CTRL_FW_IPWAKE_REQ_VAL_SHIFT)) & APU_BT_RESRC_CTRL_FW_IPWAKE_REQ_VAL_MASK)\r\n\r\n#define APU_BT_RESRC_CTRL_FW_ALLWAKE_REQ_MASK    (0x400U)\r\n#define APU_BT_RESRC_CTRL_FW_ALLWAKE_REQ_SHIFT   (10U)\r\n/*! FW_ALLWAKE_REQ - firmware override hw xosc + pwr + pll allwake request */\r\n#define APU_BT_RESRC_CTRL_FW_ALLWAKE_REQ(x)      (((uint32_t)(((uint32_t)(x)) << APU_BT_RESRC_CTRL_FW_ALLWAKE_REQ_SHIFT)) & APU_BT_RESRC_CTRL_FW_ALLWAKE_REQ_MASK)\r\n\r\n#define APU_BT_RESRC_CTRL_FW_ALLWAKE_REQ_VAL_MASK (0x800U)\r\n#define APU_BT_RESRC_CTRL_FW_ALLWAKE_REQ_VAL_SHIFT (11U)\r\n/*! FW_ALLWAKE_REQ_VAL - firmware override value when apu_bt_resrc_ctrl[10] is set */\r\n#define APU_BT_RESRC_CTRL_FW_ALLWAKE_REQ_VAL(x)  (((uint32_t)(((uint32_t)(x)) << APU_BT_RESRC_CTRL_FW_ALLWAKE_REQ_VAL_SHIFT)) & APU_BT_RESRC_CTRL_FW_ALLWAKE_REQ_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name BT_DVFS_CTRL - Bluetooth DVFS Control */\r\n/*! @{ */\r\n\r\n#define APU_BT_DVFS_CTRL_BT_VOL_VAL_MASK         (0x7FU)\r\n#define APU_BT_DVFS_CTRL_BT_VOL_VAL_SHIFT        (0U)\r\n/*! BT_VOL_VAL - Blueooth Vol Value */\r\n#define APU_BT_DVFS_CTRL_BT_VOL_VAL(x)           (((uint32_t)(((uint32_t)(x)) << APU_BT_DVFS_CTRL_BT_VOL_VAL_SHIFT)) & APU_BT_DVFS_CTRL_BT_VOL_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name FM_CTRL - FM Control */\r\n/*! @{ */\r\n\r\n#define APU_FM_CTRL_FM_SLP_RDY_MASK              (0x1U)\r\n#define APU_FM_CTRL_FM_SLP_RDY_SHIFT             (0U)\r\n/*! FM_SLP_RDY - FM Sleep Delay */\r\n#define APU_FM_CTRL_FM_SLP_RDY(x)                (((uint32_t)(((uint32_t)(x)) << APU_FM_CTRL_FM_SLP_RDY_SHIFT)) & APU_FM_CTRL_FM_SLP_RDY_MASK)\r\n\r\n#define APU_FM_CTRL_FM_SLP_RDYMASK_MASK          (0x2U)\r\n#define APU_FM_CTRL_FM_SLP_RDYMASK_SHIFT         (1U)\r\n/*! FM_SLP_RDYMASK - FM Sleep Ready Mask */\r\n#define APU_FM_CTRL_FM_SLP_RDYMASK(x)            (((uint32_t)(((uint32_t)(x)) << APU_FM_CTRL_FM_SLP_RDYMASK_SHIFT)) & APU_FM_CTRL_FM_SLP_RDYMASK_MASK)\r\n\r\n#define APU_FM_CTRL_FM_SLP_RDY_FW_MASK           (0x4U)\r\n#define APU_FM_CTRL_FM_SLP_RDY_FW_SHIFT          (2U)\r\n/*! FM_SLP_RDY_FW - FM Sleep Ready FW */\r\n#define APU_FM_CTRL_FM_SLP_RDY_FW(x)             (((uint32_t)(((uint32_t)(x)) << APU_FM_CTRL_FM_SLP_RDY_FW_SHIFT)) & APU_FM_CTRL_FM_SLP_RDY_FW_MASK)\r\n\r\n#define APU_FM_CTRL_FM_PRESENT_MASK              (0x8U)\r\n#define APU_FM_CTRL_FM_PRESENT_SHIFT             (3U)\r\n/*! FM_PRESENT - FM Present */\r\n#define APU_FM_CTRL_FM_PRESENT(x)                (((uint32_t)(((uint32_t)(x)) << APU_FM_CTRL_FM_PRESENT_SHIFT)) & APU_FM_CTRL_FM_PRESENT_MASK)\r\n\r\n#define APU_FM_CTRL_FM_DYN_VOL_EN_MASK           (0x10U)\r\n#define APU_FM_CTRL_FM_DYN_VOL_EN_SHIFT          (4U)\r\n/*! FM_DYN_VOL_EN - FM Dynamic Vol Enable */\r\n#define APU_FM_CTRL_FM_DYN_VOL_EN(x)             (((uint32_t)(((uint32_t)(x)) << APU_FM_CTRL_FM_DYN_VOL_EN_SHIFT)) & APU_FM_CTRL_FM_DYN_VOL_EN_MASK)\r\n\r\n#define APU_FM_CTRL_FM_CLK_SYNC_MODE_SEL_MASK    (0x20U)\r\n#define APU_FM_CTRL_FM_CLK_SYNC_MODE_SEL_SHIFT   (5U)\r\n/*! FM_CLK_SYNC_MODE_SEL - FM Clock Sync Mode Select */\r\n#define APU_FM_CTRL_FM_CLK_SYNC_MODE_SEL(x)      (((uint32_t)(((uint32_t)(x)) << APU_FM_CTRL_FM_CLK_SYNC_MODE_SEL_SHIFT)) & APU_FM_CTRL_FM_CLK_SYNC_MODE_SEL_MASK)\r\n\r\n#define APU_FM_CTRL_USE_FM_INTR_SLP_MASK         (0x80U)\r\n#define APU_FM_CTRL_USE_FM_INTR_SLP_SHIFT        (7U)\r\n/*! USE_FM_INTR_SLP - Use FM Interrupt Sleep */\r\n#define APU_FM_CTRL_USE_FM_INTR_SLP(x)           (((uint32_t)(((uint32_t)(x)) << APU_FM_CTRL_USE_FM_INTR_SLP_SHIFT)) & APU_FM_CTRL_USE_FM_INTR_SLP_MASK)\r\n\r\n#define APU_FM_CTRL_FM_HOST_SLP_RDY_MASK         (0x80000000U)\r\n#define APU_FM_CTRL_FM_HOST_SLP_RDY_SHIFT        (31U)\r\n/*! FM_HOST_SLP_RDY - FM Host Sleep Ready */\r\n#define APU_FM_CTRL_FM_HOST_SLP_RDY(x)           (((uint32_t)(((uint32_t)(x)) << APU_FM_CTRL_FM_HOST_SLP_RDY_SHIFT)) & APU_FM_CTRL_FM_HOST_SLP_RDY_MASK)\r\n/*! @} */\r\n\r\n/*! @name FM_WKUP_MASK - FM Wakeup Mask */\r\n/*! @{ */\r\n\r\n#define APU_FM_WKUP_MASK_FM_CLK_REQ_MASK_MASK    (0x1U)\r\n#define APU_FM_WKUP_MASK_FM_CLK_REQ_MASK_SHIFT   (0U)\r\n/*! FM_CLK_REQ_MASK - FM Clock Request Mask */\r\n#define APU_FM_WKUP_MASK_FM_CLK_REQ_MASK(x)      (((uint32_t)(((uint32_t)(x)) << APU_FM_WKUP_MASK_FM_CLK_REQ_MASK_SHIFT)) & APU_FM_WKUP_MASK_FM_CLK_REQ_MASK_MASK)\r\n\r\n#define APU_FM_WKUP_MASK_FM_INTR_MASK_MASK       (0x2U)\r\n#define APU_FM_WKUP_MASK_FM_INTR_MASK_SHIFT      (1U)\r\n/*! FM_INTR_MASK - FM Interrupt Mask */\r\n#define APU_FM_WKUP_MASK_FM_INTR_MASK(x)         (((uint32_t)(((uint32_t)(x)) << APU_FM_WKUP_MASK_FM_INTR_MASK_SHIFT)) & APU_FM_WKUP_MASK_FM_INTR_MASK_MASK)\r\n\r\n#define APU_FM_WKUP_MASK_FM_PRESENT_MASK_MASK    (0x4U)\r\n#define APU_FM_WKUP_MASK_FM_PRESENT_MASK_SHIFT   (2U)\r\n/*! FM_PRESENT_MASK - FM Present Mask */\r\n#define APU_FM_WKUP_MASK_FM_PRESENT_MASK(x)      (((uint32_t)(((uint32_t)(x)) << APU_FM_WKUP_MASK_FM_PRESENT_MASK_SHIFT)) & APU_FM_WKUP_MASK_FM_PRESENT_MASK_MASK)\r\n\r\n#define APU_FM_WKUP_MASK_FM_HOST_MAP_MASK        (0xFFFF0000U)\r\n#define APU_FM_WKUP_MASK_FM_HOST_MAP_SHIFT       (16U)\r\n/*! FM_HOST_MAP - FM to host-HOST Delay */\r\n#define APU_FM_WKUP_MASK_FM_HOST_MAP(x)          (((uint32_t)(((uint32_t)(x)) << APU_FM_WKUP_MASK_FM_HOST_MAP_SHIFT)) & APU_FM_WKUP_MASK_FM_HOST_MAP_MASK)\r\n/*! @} */\r\n\r\n/*! @name FM_STATUS - FM Status */\r\n/*! @{ */\r\n\r\n#define APU_FM_STATUS_APU_FM_CLK_EN_MASK         (0x1U)\r\n#define APU_FM_STATUS_APU_FM_CLK_EN_SHIFT        (0U)\r\n/*! APU_FM_CLK_EN - APU FM Clock Enable */\r\n#define APU_FM_STATUS_APU_FM_CLK_EN(x)           (((uint32_t)(((uint32_t)(x)) << APU_FM_STATUS_APU_FM_CLK_EN_SHIFT)) & APU_FM_STATUS_APU_FM_CLK_EN_MASK)\r\n\r\n#define APU_FM_STATUS_SOC_CLK_EN2_MASK           (0x2U)\r\n#define APU_FM_STATUS_SOC_CLK_EN2_SHIFT          (1U)\r\n/*! SOC_CLK_EN2 - SoC Clock Enable 2 */\r\n#define APU_FM_STATUS_SOC_CLK_EN2(x)             (((uint32_t)(((uint32_t)(x)) << APU_FM_STATUS_SOC_CLK_EN2_SHIFT)) & APU_FM_STATUS_SOC_CLK_EN2_MASK)\r\n\r\n#define APU_FM_STATUS_XOSC_STABLE_REFCK_MASK     (0x4U)\r\n#define APU_FM_STATUS_XOSC_STABLE_REFCK_SHIFT    (2U)\r\n/*! XOSC_STABLE_REFCK - XOSC Stable Ref Clock */\r\n#define APU_FM_STATUS_XOSC_STABLE_REFCK(x)       (((uint32_t)(((uint32_t)(x)) << APU_FM_STATUS_XOSC_STABLE_REFCK_SHIFT)) & APU_FM_STATUS_XOSC_STABLE_REFCK_MASK)\r\n\r\n#define APU_FM_STATUS_FM_HOST_WKUP_MASK          (0x10U)\r\n#define APU_FM_STATUS_FM_HOST_WKUP_SHIFT         (4U)\r\n/*! FM_HOST_WKUP - FM Host Wakeup */\r\n#define APU_FM_STATUS_FM_HOST_WKUP(x)            (((uint32_t)(((uint32_t)(x)) << APU_FM_STATUS_FM_HOST_WKUP_SHIFT)) & APU_FM_STATUS_FM_HOST_WKUP_MASK)\r\n\r\n#define APU_FM_STATUS_FM_INTR_MASK               (0x20U)\r\n#define APU_FM_STATUS_FM_INTR_SHIFT              (5U)\r\n/*! FM_INTR - FM Interrupt */\r\n#define APU_FM_STATUS_FM_INTR(x)                 (((uint32_t)(((uint32_t)(x)) << APU_FM_STATUS_FM_INTR_SHIFT)) & APU_FM_STATUS_FM_INTR_MASK)\r\n\r\n#define APU_FM_STATUS_FM_CLK_REQ_MASK            (0x40U)\r\n#define APU_FM_STATUS_FM_CLK_REQ_SHIFT           (6U)\r\n/*! FM_CLK_REQ - FM Clock Request */\r\n#define APU_FM_STATUS_FM_CLK_REQ(x)              (((uint32_t)(((uint32_t)(x)) << APU_FM_STATUS_FM_CLK_REQ_SHIFT)) & APU_FM_STATUS_FM_CLK_REQ_MASK)\r\n\r\n#define APU_FM_STATUS_FM_PRESENT_MASK            (0x80U)\r\n#define APU_FM_STATUS_FM_PRESENT_SHIFT           (7U)\r\n/*! FM_PRESENT - FM Present */\r\n#define APU_FM_STATUS_FM_PRESENT(x)              (((uint32_t)(((uint32_t)(x)) << APU_FM_STATUS_FM_PRESENT_SHIFT)) & APU_FM_STATUS_FM_PRESENT_MASK)\r\n\r\n#define APU_FM_STATUS_HOST_WKUP_IN_MASK          (0xFFFF0000U)\r\n#define APU_FM_STATUS_HOST_WKUP_IN_SHIFT         (16U)\r\n/*! HOST_WKUP_IN - Host Wakeup Interrupt */\r\n#define APU_FM_STATUS_HOST_WKUP_IN(x)            (((uint32_t)(((uint32_t)(x)) << APU_FM_STATUS_HOST_WKUP_IN_SHIFT)) & APU_FM_STATUS_HOST_WKUP_IN_MASK)\r\n/*! @} */\r\n\r\n/*! @name FM_CKEN_CTRL - FM Clock Enable Control */\r\n/*! @{ */\r\n\r\n#define APU_FM_CKEN_CTRL_FM_CLK_EN_PWR_VAL_MASK  (0x1U)\r\n#define APU_FM_CKEN_CTRL_FM_CLK_EN_PWR_VAL_SHIFT (0U)\r\n/*! FM_CLK_EN_PWR_VAL - control value for fm_clk_en when power ready */\r\n#define APU_FM_CKEN_CTRL_FM_CLK_EN_PWR_VAL(x)    (((uint32_t)(((uint32_t)(x)) << APU_FM_CKEN_CTRL_FM_CLK_EN_PWR_VAL_SHIFT)) & APU_FM_CKEN_CTRL_FM_CLK_EN_PWR_VAL_MASK)\r\n\r\n#define APU_FM_CKEN_CTRL_FM_CLK_EN_PWR_SEL_MASK  (0x2U)\r\n#define APU_FM_CKEN_CTRL_FM_CLK_EN_PWR_SEL_SHIFT (1U)\r\n/*! FM_CLK_EN_PWR_SEL - selection for fm_clk_en when power ready */\r\n#define APU_FM_CKEN_CTRL_FM_CLK_EN_PWR_SEL(x)    (((uint32_t)(((uint32_t)(x)) << APU_FM_CKEN_CTRL_FM_CLK_EN_PWR_SEL_SHIFT)) & APU_FM_CKEN_CTRL_FM_CLK_EN_PWR_SEL_MASK)\r\n\r\n#define APU_FM_CKEN_CTRL_FM_CLK_EN_XOSC_VAL_MASK (0x4U)\r\n#define APU_FM_CKEN_CTRL_FM_CLK_EN_XOSC_VAL_SHIFT (2U)\r\n/*! FM_CLK_EN_XOSC_VAL - control value for fm_clk_en when xosc is ready */\r\n#define APU_FM_CKEN_CTRL_FM_CLK_EN_XOSC_VAL(x)   (((uint32_t)(((uint32_t)(x)) << APU_FM_CKEN_CTRL_FM_CLK_EN_XOSC_VAL_SHIFT)) & APU_FM_CKEN_CTRL_FM_CLK_EN_XOSC_VAL_MASK)\r\n\r\n#define APU_FM_CKEN_CTRL_FM_CLK_EN_XOSC_SEL_MASK (0x8U)\r\n#define APU_FM_CKEN_CTRL_FM_CLK_EN_XOSC_SEL_SHIFT (3U)\r\n/*! FM_CLK_EN_XOSC_SEL - selection for fm_clk_en when XOSC ready */\r\n#define APU_FM_CKEN_CTRL_FM_CLK_EN_XOSC_SEL(x)   (((uint32_t)(((uint32_t)(x)) << APU_FM_CKEN_CTRL_FM_CLK_EN_XOSC_SEL_SHIFT)) & APU_FM_CKEN_CTRL_FM_CLK_EN_XOSC_SEL_MASK)\r\n\r\n#define APU_FM_CKEN_CTRL_FM_CLK_EN_PLL_VAL_MASK  (0x10U)\r\n#define APU_FM_CKEN_CTRL_FM_CLK_EN_PLL_VAL_SHIFT (4U)\r\n/*! FM_CLK_EN_PLL_VAL - control value for fm_clk_en when PLL ready */\r\n#define APU_FM_CKEN_CTRL_FM_CLK_EN_PLL_VAL(x)    (((uint32_t)(((uint32_t)(x)) << APU_FM_CKEN_CTRL_FM_CLK_EN_PLL_VAL_SHIFT)) & APU_FM_CKEN_CTRL_FM_CLK_EN_PLL_VAL_MASK)\r\n\r\n#define APU_FM_CKEN_CTRL_FM_CLK_EN_PLL_SEL_MASK  (0x20U)\r\n#define APU_FM_CKEN_CTRL_FM_CLK_EN_PLL_SEL_SHIFT (5U)\r\n/*! FM_CLK_EN_PLL_SEL - selection for fm_clk_en when PLL ready */\r\n#define APU_FM_CKEN_CTRL_FM_CLK_EN_PLL_SEL(x)    (((uint32_t)(((uint32_t)(x)) << APU_FM_CKEN_CTRL_FM_CLK_EN_PLL_SEL_SHIFT)) & APU_FM_CKEN_CTRL_FM_CLK_EN_PLL_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name FM_RESRC_CTRL - FM RESRC Control */\r\n/*! @{ */\r\n\r\n#define APU_FM_RESRC_CTRL_FM_PWR_REQ_MASK        (0x1U)\r\n#define APU_FM_RESRC_CTRL_FM_PWR_REQ_SHIFT       (0U)\r\n/*! FM_PWR_REQ - override hw power request */\r\n#define APU_FM_RESRC_CTRL_FM_PWR_REQ(x)          (((uint32_t)(((uint32_t)(x)) << APU_FM_RESRC_CTRL_FM_PWR_REQ_SHIFT)) & APU_FM_RESRC_CTRL_FM_PWR_REQ_MASK)\r\n\r\n#define APU_FM_RESRC_CTRL_FM_PWR_REQ_VAL_MASK    (0x2U)\r\n#define APU_FM_RESRC_CTRL_FM_PWR_REQ_VAL_SHIFT   (1U)\r\n/*! FM_PWR_REQ_VAL - override value when apu_fm_resrc_ctrl[0] is set */\r\n#define APU_FM_RESRC_CTRL_FM_PWR_REQ_VAL(x)      (((uint32_t)(((uint32_t)(x)) << APU_FM_RESRC_CTRL_FM_PWR_REQ_VAL_SHIFT)) & APU_FM_RESRC_CTRL_FM_PWR_REQ_VAL_MASK)\r\n\r\n#define APU_FM_RESRC_CTRL_FM_XOSC_REQ_MASK       (0x4U)\r\n#define APU_FM_RESRC_CTRL_FM_XOSC_REQ_SHIFT      (2U)\r\n/*! FM_XOSC_REQ - override hw xosc request */\r\n#define APU_FM_RESRC_CTRL_FM_XOSC_REQ(x)         (((uint32_t)(((uint32_t)(x)) << APU_FM_RESRC_CTRL_FM_XOSC_REQ_SHIFT)) & APU_FM_RESRC_CTRL_FM_XOSC_REQ_MASK)\r\n\r\n#define APU_FM_RESRC_CTRL_FM_XOSC_REQ_VAL_MASK   (0x8U)\r\n#define APU_FM_RESRC_CTRL_FM_XOSC_REQ_VAL_SHIFT  (3U)\r\n/*! FM_XOSC_REQ_VAL - override value when apu_fm_resrc_ctrl[2] is set */\r\n#define APU_FM_RESRC_CTRL_FM_XOSC_REQ_VAL(x)     (((uint32_t)(((uint32_t)(x)) << APU_FM_RESRC_CTRL_FM_XOSC_REQ_VAL_SHIFT)) & APU_FM_RESRC_CTRL_FM_XOSC_REQ_VAL_MASK)\r\n\r\n#define APU_FM_RESRC_CTRL_FM_XP_REQ_MASK         (0x10U)\r\n#define APU_FM_RESRC_CTRL_FM_XP_REQ_SHIFT        (4U)\r\n/*! FM_XP_REQ - override hw xosc + pwr request */\r\n#define APU_FM_RESRC_CTRL_FM_XP_REQ(x)           (((uint32_t)(((uint32_t)(x)) << APU_FM_RESRC_CTRL_FM_XP_REQ_SHIFT)) & APU_FM_RESRC_CTRL_FM_XP_REQ_MASK)\r\n\r\n#define APU_FM_RESRC_CTRL_FM_XP_REQ_VAL_MASK     (0x20U)\r\n#define APU_FM_RESRC_CTRL_FM_XP_REQ_VAL_SHIFT    (5U)\r\n/*! FM_XP_REQ_VAL - override value when apu_fm_resrc_ctrl[4] is set */\r\n#define APU_FM_RESRC_CTRL_FM_XP_REQ_VAL(x)       (((uint32_t)(((uint32_t)(x)) << APU_FM_RESRC_CTRL_FM_XP_REQ_VAL_SHIFT)) & APU_FM_RESRC_CTRL_FM_XP_REQ_VAL_MASK)\r\n\r\n#define APU_FM_RESRC_CTRL_FM_SB_REQ_MASK         (0x40U)\r\n#define APU_FM_RESRC_CTRL_FM_SB_REQ_SHIFT        (6U)\r\n/*! FM_SB_REQ - override hw xosc + pwr + pll sb request */\r\n#define APU_FM_RESRC_CTRL_FM_SB_REQ(x)           (((uint32_t)(((uint32_t)(x)) << APU_FM_RESRC_CTRL_FM_SB_REQ_SHIFT)) & APU_FM_RESRC_CTRL_FM_SB_REQ_MASK)\r\n\r\n#define APU_FM_RESRC_CTRL_FM_SB_REQ_VAL_MASK     (0x80U)\r\n#define APU_FM_RESRC_CTRL_FM_SB_REQ_VAL_SHIFT    (7U)\r\n/*! FM_SB_REQ_VAL - override value when apu_fm_resrc_ctrl[6] is set */\r\n#define APU_FM_RESRC_CTRL_FM_SB_REQ_VAL(x)       (((uint32_t)(((uint32_t)(x)) << APU_FM_RESRC_CTRL_FM_SB_REQ_VAL_SHIFT)) & APU_FM_RESRC_CTRL_FM_SB_REQ_VAL_MASK)\r\n\r\n#define APU_FM_RESRC_CTRL_FM_IPWAKE_REQ_MASK     (0x100U)\r\n#define APU_FM_RESRC_CTRL_FM_IPWAKE_REQ_SHIFT    (8U)\r\n/*! FM_IPWAKE_REQ - override hw xosc + pwr + pll ipwake request */\r\n#define APU_FM_RESRC_CTRL_FM_IPWAKE_REQ(x)       (((uint32_t)(((uint32_t)(x)) << APU_FM_RESRC_CTRL_FM_IPWAKE_REQ_SHIFT)) & APU_FM_RESRC_CTRL_FM_IPWAKE_REQ_MASK)\r\n\r\n#define APU_FM_RESRC_CTRL_FM_IPWAKE_REQ_VAL_MASK (0x200U)\r\n#define APU_FM_RESRC_CTRL_FM_IPWAKE_REQ_VAL_SHIFT (9U)\r\n/*! FM_IPWAKE_REQ_VAL - override value when apu_fm_resrc_ctrl[8] is set */\r\n#define APU_FM_RESRC_CTRL_FM_IPWAKE_REQ_VAL(x)   (((uint32_t)(((uint32_t)(x)) << APU_FM_RESRC_CTRL_FM_IPWAKE_REQ_VAL_SHIFT)) & APU_FM_RESRC_CTRL_FM_IPWAKE_REQ_VAL_MASK)\r\n\r\n#define APU_FM_RESRC_CTRL_FM_ALLWAKE_REQ_MASK    (0x400U)\r\n#define APU_FM_RESRC_CTRL_FM_ALLWAKE_REQ_SHIFT   (10U)\r\n/*! FM_ALLWAKE_REQ - firmware override hw xosc + pwr + pll allwake request */\r\n#define APU_FM_RESRC_CTRL_FM_ALLWAKE_REQ(x)      (((uint32_t)(((uint32_t)(x)) << APU_FM_RESRC_CTRL_FM_ALLWAKE_REQ_SHIFT)) & APU_FM_RESRC_CTRL_FM_ALLWAKE_REQ_MASK)\r\n\r\n#define APU_FM_RESRC_CTRL_FM_ALLWAKE_REQ_VAL_MASK (0x800U)\r\n#define APU_FM_RESRC_CTRL_FM_ALLWAKE_REQ_VAL_SHIFT (11U)\r\n/*! FM_ALLWAKE_REQ_VAL - firmware override value when apu_fm_resrc_ctrl[10] is set */\r\n#define APU_FM_RESRC_CTRL_FM_ALLWAKE_REQ_VAL(x)  (((uint32_t)(((uint32_t)(x)) << APU_FM_RESRC_CTRL_FM_ALLWAKE_REQ_VAL_SHIFT)) & APU_FM_RESRC_CTRL_FM_ALLWAKE_REQ_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name FM_DVFS_CTRL - FM DVFS Control */\r\n/*! @{ */\r\n\r\n#define APU_FM_DVFS_CTRL_FM_VOL_VAL_MASK         (0x7FU)\r\n#define APU_FM_DVFS_CTRL_FM_VOL_VAL_SHIFT        (0U)\r\n/*! FM_VOL_VAL - FM Vol Value */\r\n#define APU_FM_DVFS_CTRL_FM_VOL_VAL(x)           (((uint32_t)(((uint32_t)(x)) << APU_FM_DVFS_CTRL_FM_VOL_VAL_SHIFT)) & APU_FM_DVFS_CTRL_FM_VOL_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name USB_PWR_CTRL_DLY - USB FSM Power Control Delay */\r\n/*! @{ */\r\n\r\n#define APU_USB_PWR_CTRL_DLY_PWR_CTRL_DLY_MASK   (0xFFFFFFFFU)\r\n#define APU_USB_PWR_CTRL_DLY_PWR_CTRL_DLY_SHIFT  (0U)\r\n/*! PWR_CTRL_DLY - USB FSM Power Control Delay */\r\n#define APU_USB_PWR_CTRL_DLY_PWR_CTRL_DLY(x)     (((uint32_t)(((uint32_t)(x)) << APU_USB_PWR_CTRL_DLY_PWR_CTRL_DLY_SHIFT)) & APU_USB_PWR_CTRL_DLY_PWR_CTRL_DLY_MASK)\r\n/*! @} */\r\n\r\n/*! @name USB_PWR_CTRL_DLY2 - USB FSM Power Control Delay 2 */\r\n/*! @{ */\r\n\r\n#define APU_USB_PWR_CTRL_DLY2_PWR_CTRL_DLY2_MASK (0xFFFFFFFFU)\r\n#define APU_USB_PWR_CTRL_DLY2_PWR_CTRL_DLY2_SHIFT (0U)\r\n/*! PWR_CTRL_DLY2 - USB FSM Power Control Delay 2 */\r\n#define APU_USB_PWR_CTRL_DLY2_PWR_CTRL_DLY2(x)   (((uint32_t)(((uint32_t)(x)) << APU_USB_PWR_CTRL_DLY2_PWR_CTRL_DLY2_SHIFT)) & APU_USB_PWR_CTRL_DLY2_PWR_CTRL_DLY2_MASK)\r\n/*! @} */\r\n\r\n/*! @name WLCOMN_PWR_CTRL_DLY - Wlan common domain FSM Power Control Delay */\r\n/*! @{ */\r\n\r\n#define APU_WLCOMN_PWR_CTRL_DLY_PWR_CTRL_DLY_MASK (0xFFFFFFFFU)\r\n#define APU_WLCOMN_PWR_CTRL_DLY_PWR_CTRL_DLY_SHIFT (0U)\r\n/*! PWR_CTRL_DLY - WLAN COMN FSM power control delay */\r\n#define APU_WLCOMN_PWR_CTRL_DLY_PWR_CTRL_DLY(x)  (((uint32_t)(((uint32_t)(x)) << APU_WLCOMN_PWR_CTRL_DLY_PWR_CTRL_DLY_SHIFT)) & APU_WLCOMN_PWR_CTRL_DLY_PWR_CTRL_DLY_MASK)\r\n/*! @} */\r\n\r\n/*! @name WLCOMN_PWR_CTRL_DLY2 - Wlan common domain FSM Power Control Delay 2 */\r\n/*! @{ */\r\n\r\n#define APU_WLCOMN_PWR_CTRL_DLY2_PWR_CTRL_DLY2_MASK (0xFFFFFFFFU)\r\n#define APU_WLCOMN_PWR_CTRL_DLY2_PWR_CTRL_DLY2_SHIFT (0U)\r\n/*! PWR_CTRL_DLY2 - WLAN COMN FSM power control delay */\r\n#define APU_WLCOMN_PWR_CTRL_DLY2_PWR_CTRL_DLY2(x) (((uint32_t)(((uint32_t)(x)) << APU_WLCOMN_PWR_CTRL_DLY2_PWR_CTRL_DLY2_SHIFT)) & APU_WLCOMN_PWR_CTRL_DLY2_PWR_CTRL_DLY2_MASK)\r\n/*! @} */\r\n\r\n/*! @name BLE_CTRL - BLE Control */\r\n/*! @{ */\r\n\r\n#define APU_BLE_CTRL_BLE_SLP_RDY_MASK            (0x1U)\r\n#define APU_BLE_CTRL_BLE_SLP_RDY_SHIFT           (0U)\r\n/*! BLE_SLP_RDY - BLE Sleep Ready */\r\n#define APU_BLE_CTRL_BLE_SLP_RDY(x)              (((uint32_t)(((uint32_t)(x)) << APU_BLE_CTRL_BLE_SLP_RDY_SHIFT)) & APU_BLE_CTRL_BLE_SLP_RDY_MASK)\r\n\r\n#define APU_BLE_CTRL_BLE_SLP_RDYMASK_MASK        (0x2U)\r\n#define APU_BLE_CTRL_BLE_SLP_RDYMASK_SHIFT       (1U)\r\n/*! BLE_SLP_RDYMASK - BLE Sleep Ready Mask */\r\n#define APU_BLE_CTRL_BLE_SLP_RDYMASK(x)          (((uint32_t)(((uint32_t)(x)) << APU_BLE_CTRL_BLE_SLP_RDYMASK_SHIFT)) & APU_BLE_CTRL_BLE_SLP_RDYMASK_MASK)\r\n\r\n#define APU_BLE_CTRL_BLE_SLP_RDY_FW_MASK         (0x4U)\r\n#define APU_BLE_CTRL_BLE_SLP_RDY_FW_SHIFT        (2U)\r\n/*! BLE_SLP_RDY_FW - BLE Sleep Ready FW */\r\n#define APU_BLE_CTRL_BLE_SLP_RDY_FW(x)           (((uint32_t)(((uint32_t)(x)) << APU_BLE_CTRL_BLE_SLP_RDY_FW_SHIFT)) & APU_BLE_CTRL_BLE_SLP_RDY_FW_MASK)\r\n\r\n#define APU_BLE_CTRL_BLE_MODE_EN_MASK            (0x8U)\r\n#define APU_BLE_CTRL_BLE_MODE_EN_SHIFT           (3U)\r\n/*! BLE_MODE_EN - BLE Mode Enable */\r\n#define APU_BLE_CTRL_BLE_MODE_EN(x)              (((uint32_t)(((uint32_t)(x)) << APU_BLE_CTRL_BLE_MODE_EN_SHIFT)) & APU_BLE_CTRL_BLE_MODE_EN_MASK)\r\n\r\n#define APU_BLE_CTRL_BT_AES_NCO_MODE_MASK        (0x8000U)\r\n#define APU_BLE_CTRL_BT_AES_NCO_MODE_SHIFT       (15U)\r\n/*! BT_AES_NCO_MODE - Bluetooth AES NCO Mode */\r\n#define APU_BLE_CTRL_BT_AES_NCO_MODE(x)          (((uint32_t)(((uint32_t)(x)) << APU_BLE_CTRL_BT_AES_NCO_MODE_SHIFT)) & APU_BLE_CTRL_BT_AES_NCO_MODE_MASK)\r\n\r\n#define APU_BLE_CTRL_BLE_XP_REQ_MASK             (0x80000000U)\r\n#define APU_BLE_CTRL_BLE_XP_REQ_SHIFT            (31U)\r\n/*! BLE_XP_REQ - BLE XP Request */\r\n#define APU_BLE_CTRL_BLE_XP_REQ(x)               (((uint32_t)(((uint32_t)(x)) << APU_BLE_CTRL_BLE_XP_REQ_SHIFT)) & APU_BLE_CTRL_BLE_XP_REQ_MASK)\r\n/*! @} */\r\n\r\n/*! @name BLE_WKUP_MASK - BLE Wakeup Mask */\r\n/*! @{ */\r\n\r\n#define APU_BLE_WKUP_MASK_BT_AES_CLK_REQ_MASK_MASK (0x8U)\r\n#define APU_BLE_WKUP_MASK_BT_AES_CLK_REQ_MASK_SHIFT (3U)\r\n/*! BT_AES_CLK_REQ_MASK - Bluetooth AES Clock Request Mask */\r\n#define APU_BLE_WKUP_MASK_BT_AES_CLK_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_BLE_WKUP_MASK_BT_AES_CLK_REQ_MASK_SHIFT)) & APU_BLE_WKUP_MASK_BT_AES_CLK_REQ_MASK_MASK)\r\n\r\n#define APU_BLE_WKUP_MASK_LBC_XP_REQ_MASK_MASK   (0x10U)\r\n#define APU_BLE_WKUP_MASK_LBC_XP_REQ_MASK_SHIFT  (4U)\r\n/*! LBC_XP_REQ_MASK - LBC XP Request Mask */\r\n#define APU_BLE_WKUP_MASK_LBC_XP_REQ_MASK(x)     (((uint32_t)(((uint32_t)(x)) << APU_BLE_WKUP_MASK_LBC_XP_REQ_MASK_SHIFT)) & APU_BLE_WKUP_MASK_LBC_XP_REQ_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name BLE_STATUS - BLE Status */\r\n/*! @{ */\r\n\r\n#define APU_BLE_STATUS_APU_BT_AES_CLK_EN_MASK    (0x1U)\r\n#define APU_BLE_STATUS_APU_BT_AES_CLK_EN_SHIFT   (0U)\r\n/*! APU_BT_AES_CLK_EN - APU Bluetooth AES Clock Enable */\r\n#define APU_BLE_STATUS_APU_BT_AES_CLK_EN(x)      (((uint32_t)(((uint32_t)(x)) << APU_BLE_STATUS_APU_BT_AES_CLK_EN_SHIFT)) & APU_BLE_STATUS_APU_BT_AES_CLK_EN_MASK)\r\n\r\n#define APU_BLE_STATUS_BT_AES_CLK_SEL_MASK       (0x2U)\r\n#define APU_BLE_STATUS_BT_AES_CLK_SEL_SHIFT      (1U)\r\n/*! BT_AES_CLK_SEL - Bluetooth AES Clock Select */\r\n#define APU_BLE_STATUS_BT_AES_CLK_SEL(x)         (((uint32_t)(((uint32_t)(x)) << APU_BLE_STATUS_BT_AES_CLK_SEL_SHIFT)) & APU_BLE_STATUS_BT_AES_CLK_SEL_MASK)\r\n\r\n#define APU_BLE_STATUS_XOSC_STABLE_REFCK_MASK    (0x4U)\r\n#define APU_BLE_STATUS_XOSC_STABLE_REFCK_SHIFT   (2U)\r\n/*! XOSC_STABLE_REFCK - XOSC Stable Ref Clock */\r\n#define APU_BLE_STATUS_XOSC_STABLE_REFCK(x)      (((uint32_t)(((uint32_t)(x)) << APU_BLE_STATUS_XOSC_STABLE_REFCK_SHIFT)) & APU_BLE_STATUS_XOSC_STABLE_REFCK_MASK)\r\n\r\n#define APU_BLE_STATUS_T1_STABLE_MASK            (0x8U)\r\n#define APU_BLE_STATUS_T1_STABLE_SHIFT           (3U)\r\n/*! T1_STABLE - T1 Delay */\r\n#define APU_BLE_STATUS_T1_STABLE(x)              (((uint32_t)(((uint32_t)(x)) << APU_BLE_STATUS_T1_STABLE_SHIFT)) & APU_BLE_STATUS_T1_STABLE_MASK)\r\n\r\n#define APU_BLE_STATUS_BT_INTERRUPT_MASK         (0x10U)\r\n#define APU_BLE_STATUS_BT_INTERRUPT_SHIFT        (4U)\r\n/*! BT_INTERRUPT - Bluetooth Interrupt */\r\n#define APU_BLE_STATUS_BT_INTERRUPT(x)           (((uint32_t)(((uint32_t)(x)) << APU_BLE_STATUS_BT_INTERRUPT_SHIFT)) & APU_BLE_STATUS_BT_INTERRUPT_MASK)\r\n\r\n#define APU_BLE_STATUS_BLE_XP_REQ_MASK           (0x20U)\r\n#define APU_BLE_STATUS_BLE_XP_REQ_SHIFT          (5U)\r\n/*! BLE_XP_REQ - BLE XP Request */\r\n#define APU_BLE_STATUS_BLE_XP_REQ(x)             (((uint32_t)(((uint32_t)(x)) << APU_BLE_STATUS_BLE_XP_REQ_SHIFT)) & APU_BLE_STATUS_BLE_XP_REQ_MASK)\r\n\r\n#define APU_BLE_STATUS_BT_AES_NCO_MODE_MASK      (0x40U)\r\n#define APU_BLE_STATUS_BT_AES_NCO_MODE_SHIFT     (6U)\r\n/*! BT_AES_NCO_MODE - Blueooth AES NCO Mode */\r\n#define APU_BLE_STATUS_BT_AES_NCO_MODE(x)        (((uint32_t)(((uint32_t)(x)) << APU_BLE_STATUS_BT_AES_NCO_MODE_SHIFT)) & APU_BLE_STATUS_BT_AES_NCO_MODE_MASK)\r\n\r\n#define APU_BLE_STATUS_LBC_XP_REQ_MASK           (0x100U)\r\n#define APU_BLE_STATUS_LBC_XP_REQ_SHIFT          (8U)\r\n/*! LBC_XP_REQ - LBC XP Request */\r\n#define APU_BLE_STATUS_LBC_XP_REQ(x)             (((uint32_t)(((uint32_t)(x)) << APU_BLE_STATUS_LBC_XP_REQ_SHIFT)) & APU_BLE_STATUS_LBC_XP_REQ_MASK)\r\n\r\n#define APU_BLE_STATUS_BT_AES_CLK_REQ_MASK       (0x200U)\r\n#define APU_BLE_STATUS_BT_AES_CLK_REQ_SHIFT      (9U)\r\n/*! BT_AES_CLK_REQ - Bluetooth AES Clock Request Mask */\r\n#define APU_BLE_STATUS_BT_AES_CLK_REQ(x)         (((uint32_t)(((uint32_t)(x)) << APU_BLE_STATUS_BT_AES_CLK_REQ_SHIFT)) & APU_BLE_STATUS_BT_AES_CLK_REQ_MASK)\r\n/*! @} */\r\n\r\n/*! @name NFC_CTRL - NFC Control */\r\n/*! @{ */\r\n\r\n#define APU_NFC_CTRL_NFC_SLP_RDY_MASK            (0x1U)\r\n#define APU_NFC_CTRL_NFC_SLP_RDY_SHIFT           (0U)\r\n/*! NFC_SLP_RDY - NFC Sleep Ready */\r\n#define APU_NFC_CTRL_NFC_SLP_RDY(x)              (((uint32_t)(((uint32_t)(x)) << APU_NFC_CTRL_NFC_SLP_RDY_SHIFT)) & APU_NFC_CTRL_NFC_SLP_RDY_MASK)\r\n\r\n#define APU_NFC_CTRL_NFC_SLP_RDYMASK_MASK        (0x2U)\r\n#define APU_NFC_CTRL_NFC_SLP_RDYMASK_SHIFT       (1U)\r\n/*! NFC_SLP_RDYMASK - NFC Sleep Ready Mask */\r\n#define APU_NFC_CTRL_NFC_SLP_RDYMASK(x)          (((uint32_t)(((uint32_t)(x)) << APU_NFC_CTRL_NFC_SLP_RDYMASK_SHIFT)) & APU_NFC_CTRL_NFC_SLP_RDYMASK_MASK)\r\n\r\n#define APU_NFC_CTRL_NFC_SLP_RDY_FW_MASK         (0x4U)\r\n#define APU_NFC_CTRL_NFC_SLP_RDY_FW_SHIFT        (2U)\r\n/*! NFC_SLP_RDY_FW - NFC Sleep Ready FW */\r\n#define APU_NFC_CTRL_NFC_SLP_RDY_FW(x)           (((uint32_t)(((uint32_t)(x)) << APU_NFC_CTRL_NFC_SLP_RDY_FW_SHIFT)) & APU_NFC_CTRL_NFC_SLP_RDY_FW_MASK)\r\n\r\n#define APU_NFC_CTRL_USE_NFC_REF_ONLY_MASK       (0x8U)\r\n#define APU_NFC_CTRL_USE_NFC_REF_ONLY_SHIFT      (3U)\r\n/*! USE_NFC_REF_ONLY - Use NFC Reference Only */\r\n#define APU_NFC_CTRL_USE_NFC_REF_ONLY(x)         (((uint32_t)(((uint32_t)(x)) << APU_NFC_CTRL_USE_NFC_REF_ONLY_SHIFT)) & APU_NFC_CTRL_USE_NFC_REF_ONLY_MASK)\r\n\r\n#define APU_NFC_CTRL_USE_NFC_INTR_SLP_MASK       (0x10U)\r\n#define APU_NFC_CTRL_USE_NFC_INTR_SLP_SHIFT      (4U)\r\n/*! USE_NFC_INTR_SLP - Use NFC Interrupt Sleep */\r\n#define APU_NFC_CTRL_USE_NFC_INTR_SLP(x)         (((uint32_t)(((uint32_t)(x)) << APU_NFC_CTRL_USE_NFC_INTR_SLP_SHIFT)) & APU_NFC_CTRL_USE_NFC_INTR_SLP_MASK)\r\n\r\n#define APU_NFC_CTRL_NFC_USE_SOC_PWR_SEQ_MASK    (0x20U)\r\n#define APU_NFC_CTRL_NFC_USE_SOC_PWR_SEQ_SHIFT   (5U)\r\n/*! NFC_USE_SOC_PWR_SEQ - Use SoC power sequence for NFC as well */\r\n#define APU_NFC_CTRL_NFC_USE_SOC_PWR_SEQ(x)      (((uint32_t)(((uint32_t)(x)) << APU_NFC_CTRL_NFC_USE_SOC_PWR_SEQ_SHIFT)) & APU_NFC_CTRL_NFC_USE_SOC_PWR_SEQ_MASK)\r\n\r\n#define APU_NFC_CTRL_FW_CLR_NFC_INTR_MASK        (0x80U)\r\n#define APU_NFC_CTRL_FW_CLR_NFC_INTR_SHIFT       (7U)\r\n/*! FW_CLR_NFC_INTR - FW Clear NFC Interrupt */\r\n#define APU_NFC_CTRL_FW_CLR_NFC_INTR(x)          (((uint32_t)(((uint32_t)(x)) << APU_NFC_CTRL_FW_CLR_NFC_INTR_SHIFT)) & APU_NFC_CTRL_FW_CLR_NFC_INTR_MASK)\r\n\r\n#define APU_NFC_CTRL_NFC_USE_CPU2_SUBSLP_MASK    (0x100U)\r\n#define APU_NFC_CTRL_NFC_USE_CPU2_SUBSLP_SHIFT   (8U)\r\n/*! NFC_USE_CPU2_SUBSLP - Use CPU2 subsystem sleep for NFC power down */\r\n#define APU_NFC_CTRL_NFC_USE_CPU2_SUBSLP(x)      (((uint32_t)(((uint32_t)(x)) << APU_NFC_CTRL_NFC_USE_CPU2_SUBSLP_SHIFT)) & APU_NFC_CTRL_NFC_USE_CPU2_SUBSLP_MASK)\r\n\r\n#define APU_NFC_CTRL_NFC_USE_NOM_PWR_BYP_MASK    (0x200U)\r\n#define APU_NFC_CTRL_NFC_USE_NOM_PWR_BYP_SHIFT   (9U)\r\n/*! NFC_USE_NOM_PWR_BYP - Use nom_pwr_lvl from dvfs for nfc_pwr_lvl_reached */\r\n#define APU_NFC_CTRL_NFC_USE_NOM_PWR_BYP(x)      (((uint32_t)(((uint32_t)(x)) << APU_NFC_CTRL_NFC_USE_NOM_PWR_BYP_SHIFT)) & APU_NFC_CTRL_NFC_USE_NOM_PWR_BYP_MASK)\r\n\r\n#define APU_NFC_CTRL_FW_FORCE_NFC_PWRUP_MASK     (0x1000000U)\r\n#define APU_NFC_CTRL_FW_FORCE_NFC_PWRUP_SHIFT    (24U)\r\n/*! FW_FORCE_NFC_PWRUP - FW Force NFC Powerup */\r\n#define APU_NFC_CTRL_FW_FORCE_NFC_PWRUP(x)       (((uint32_t)(((uint32_t)(x)) << APU_NFC_CTRL_FW_FORCE_NFC_PWRUP_SHIFT)) & APU_NFC_CTRL_FW_FORCE_NFC_PWRUP_MASK)\r\n\r\n#define APU_NFC_CTRL_NFC_USE_UNSYNC_PWR_LVL_MASK (0x2000000U)\r\n#define APU_NFC_CTRL_NFC_USE_UNSYNC_PWR_LVL_SHIFT (25U)\r\n/*! NFC_USE_UNSYNC_PWR_LVL - NFC Use Unsync Power Level */\r\n#define APU_NFC_CTRL_NFC_USE_UNSYNC_PWR_LVL(x)   (((uint32_t)(((uint32_t)(x)) << APU_NFC_CTRL_NFC_USE_UNSYNC_PWR_LVL_SHIFT)) & APU_NFC_CTRL_NFC_USE_UNSYNC_PWR_LVL_MASK)\r\n\r\n#define APU_NFC_CTRL_NFC_HOST_SLP_RDY_MASK       (0x80000000U)\r\n#define APU_NFC_CTRL_NFC_HOST_SLP_RDY_SHIFT      (31U)\r\n/*! NFC_HOST_SLP_RDY - NFC Host Sleep Ready */\r\n#define APU_NFC_CTRL_NFC_HOST_SLP_RDY(x)         (((uint32_t)(((uint32_t)(x)) << APU_NFC_CTRL_NFC_HOST_SLP_RDY_SHIFT)) & APU_NFC_CTRL_NFC_HOST_SLP_RDY_MASK)\r\n/*! @} */\r\n\r\n/*! @name NFC_WKUP_MASK - NFC Wakeup Mask */\r\n/*! @{ */\r\n\r\n#define APU_NFC_WKUP_MASK_NFC_P_WKUP_MASK_MASK   (0x1U)\r\n#define APU_NFC_WKUP_MASK_NFC_P_WKUP_MASK_SHIFT  (0U)\r\n/*! NFC_P_WKUP_MASK - NFC P Wakeup Mask */\r\n#define APU_NFC_WKUP_MASK_NFC_P_WKUP_MASK(x)     (((uint32_t)(((uint32_t)(x)) << APU_NFC_WKUP_MASK_NFC_P_WKUP_MASK_SHIFT)) & APU_NFC_WKUP_MASK_NFC_P_WKUP_MASK_MASK)\r\n\r\n#define APU_NFC_WKUP_MASK_NFC_XP_WKUP_MASK_MASK  (0x2U)\r\n#define APU_NFC_WKUP_MASK_NFC_XP_WKUP_MASK_SHIFT (1U)\r\n/*! NFC_XP_WKUP_MASK - NFC XP Wakeup Mask */\r\n#define APU_NFC_WKUP_MASK_NFC_XP_WKUP_MASK(x)    (((uint32_t)(((uint32_t)(x)) << APU_NFC_WKUP_MASK_NFC_XP_WKUP_MASK_SHIFT)) & APU_NFC_WKUP_MASK_NFC_XP_WKUP_MASK_MASK)\r\n\r\n#define APU_NFC_WKUP_MASK_NFC_INT_WKUP_MASK_MASK (0x4U)\r\n#define APU_NFC_WKUP_MASK_NFC_INT_WKUP_MASK_SHIFT (2U)\r\n/*! NFC_INT_WKUP_MASK - NFC Interrupt Wakeup Mask */\r\n#define APU_NFC_WKUP_MASK_NFC_INT_WKUP_MASK(x)   (((uint32_t)(((uint32_t)(x)) << APU_NFC_WKUP_MASK_NFC_INT_WKUP_MASK_SHIFT)) & APU_NFC_WKUP_MASK_NFC_INT_WKUP_MASK_MASK)\r\n\r\n#define APU_NFC_WKUP_MASK_NFC_HOST_MAP_MASK      (0xFFFF0000U)\r\n#define APU_NFC_WKUP_MASK_NFC_HOST_MAP_SHIFT     (16U)\r\n/*! NFC_HOST_MAP - NFC Host Map */\r\n#define APU_NFC_WKUP_MASK_NFC_HOST_MAP(x)        (((uint32_t)(((uint32_t)(x)) << APU_NFC_WKUP_MASK_NFC_HOST_MAP_SHIFT)) & APU_NFC_WKUP_MASK_NFC_HOST_MAP_MASK)\r\n/*! @} */\r\n\r\n/*! @name NFC_STATUS - NFC Status */\r\n/*! @{ */\r\n\r\n#define APU_NFC_STATUS_APU_NFC_AHBCLK_EN_MASK    (0x1U)\r\n#define APU_NFC_STATUS_APU_NFC_AHBCLK_EN_SHIFT   (0U)\r\n/*! APU_NFC_AHBCLK_EN - APU NFC AHB Clock Enable */\r\n#define APU_NFC_STATUS_APU_NFC_AHBCLK_EN(x)      (((uint32_t)(((uint32_t)(x)) << APU_NFC_STATUS_APU_NFC_AHBCLK_EN_SHIFT)) & APU_NFC_STATUS_APU_NFC_AHBCLK_EN_MASK)\r\n\r\n#define APU_NFC_STATUS_NFC_INT_MASK              (0x2U)\r\n#define APU_NFC_STATUS_NFC_INT_SHIFT             (1U)\r\n/*! NFC_INT - NFC Interrupt */\r\n#define APU_NFC_STATUS_NFC_INT(x)                (((uint32_t)(((uint32_t)(x)) << APU_NFC_STATUS_NFC_INT_SHIFT)) & APU_NFC_STATUS_NFC_INT_MASK)\r\n\r\n#define APU_NFC_STATUS_NFC_XP_REQ_MASK           (0x4U)\r\n#define APU_NFC_STATUS_NFC_XP_REQ_SHIFT          (2U)\r\n/*! NFC_XP_REQ - NFC XP Req */\r\n#define APU_NFC_STATUS_NFC_XP_REQ(x)             (((uint32_t)(((uint32_t)(x)) << APU_NFC_STATUS_NFC_XP_REQ_SHIFT)) & APU_NFC_STATUS_NFC_XP_REQ_MASK)\r\n\r\n#define APU_NFC_STATUS_NFC_P_REQ_MASK            (0x8U)\r\n#define APU_NFC_STATUS_NFC_P_REQ_SHIFT           (3U)\r\n/*! NFC_P_REQ - NFC P Req */\r\n#define APU_NFC_STATUS_NFC_P_REQ(x)              (((uint32_t)(((uint32_t)(x)) << APU_NFC_STATUS_NFC_P_REQ_SHIFT)) & APU_NFC_STATUS_NFC_P_REQ_MASK)\r\n\r\n#define APU_NFC_STATUS_APU_NFC_SWITCH_PD_AON_MASK (0x10U)\r\n#define APU_NFC_STATUS_APU_NFC_SWITCH_PD_AON_SHIFT (4U)\r\n/*! APU_NFC_SWITCH_PD_AON - APU NFC Switch PD AON */\r\n#define APU_NFC_STATUS_APU_NFC_SWITCH_PD_AON(x)  (((uint32_t)(((uint32_t)(x)) << APU_NFC_STATUS_APU_NFC_SWITCH_PD_AON_SHIFT)) & APU_NFC_STATUS_APU_NFC_SWITCH_PD_AON_MASK)\r\n\r\n#define APU_NFC_STATUS_APU_NFC_UDR_FIREWALL_B_AON_MASK (0x20U)\r\n#define APU_NFC_STATUS_APU_NFC_UDR_FIREWALL_B_AON_SHIFT (5U)\r\n/*! APU_NFC_UDR_FIREWALL_B_AON - APU NFC UDR Firewall B AON */\r\n#define APU_NFC_STATUS_APU_NFC_UDR_FIREWALL_B_AON(x) (((uint32_t)(((uint32_t)(x)) << APU_NFC_STATUS_APU_NFC_UDR_FIREWALL_B_AON_SHIFT)) & APU_NFC_STATUS_APU_NFC_UDR_FIREWALL_B_AON_MASK)\r\n\r\n#define APU_NFC_STATUS_APU_NFC_CLK_DIV_RSTB_AON_MASK (0x40U)\r\n#define APU_NFC_STATUS_APU_NFC_CLK_DIV_RSTB_AON_SHIFT (6U)\r\n/*! APU_NFC_CLK_DIV_RSTB_AON - APU NFC Clock Divider RSTb AON */\r\n#define APU_NFC_STATUS_APU_NFC_CLK_DIV_RSTB_AON(x) (((uint32_t)(((uint32_t)(x)) << APU_NFC_STATUS_APU_NFC_CLK_DIV_RSTB_AON_SHIFT)) & APU_NFC_STATUS_APU_NFC_CLK_DIV_RSTB_AON_MASK)\r\n\r\n#define APU_NFC_STATUS_APU_NFC_ISO_EN_AON_MASK   (0x80U)\r\n#define APU_NFC_STATUS_APU_NFC_ISO_EN_AON_SHIFT  (7U)\r\n/*! APU_NFC_ISO_EN_AON - APU NFC ISO Enable AON */\r\n#define APU_NFC_STATUS_APU_NFC_ISO_EN_AON(x)     (((uint32_t)(((uint32_t)(x)) << APU_NFC_STATUS_APU_NFC_ISO_EN_AON_SHIFT)) & APU_NFC_STATUS_APU_NFC_ISO_EN_AON_MASK)\r\n\r\n#define APU_NFC_STATUS_APU_NFC_SRAM_PD_AON_MASK  (0x100U)\r\n#define APU_NFC_STATUS_APU_NFC_SRAM_PD_AON_SHIFT (8U)\r\n/*! APU_NFC_SRAM_PD_AON - APU NFC SRAM PD AON */\r\n#define APU_NFC_STATUS_APU_NFC_SRAM_PD_AON(x)    (((uint32_t)(((uint32_t)(x)) << APU_NFC_STATUS_APU_NFC_SRAM_PD_AON_SHIFT)) & APU_NFC_STATUS_APU_NFC_SRAM_PD_AON_MASK)\r\n\r\n#define APU_NFC_STATUS_NFC_VOL_REACHED_MASK      (0x200U)\r\n#define APU_NFC_STATUS_NFC_VOL_REACHED_SHIFT     (9U)\r\n/*! NFC_VOL_REACHED - NFC Vol Reached */\r\n#define APU_NFC_STATUS_NFC_VOL_REACHED(x)        (((uint32_t)(((uint32_t)(x)) << APU_NFC_STATUS_NFC_VOL_REACHED_SHIFT)) & APU_NFC_STATUS_NFC_VOL_REACHED_MASK)\r\n\r\n#define APU_NFC_STATUS_SOC_VOL_REACHED_MASK      (0x400U)\r\n#define APU_NFC_STATUS_SOC_VOL_REACHED_SHIFT     (10U)\r\n/*! SOC_VOL_REACHED - SoC Vol Reached */\r\n#define APU_NFC_STATUS_SOC_VOL_REACHED(x)        (((uint32_t)(((uint32_t)(x)) << APU_NFC_STATUS_SOC_VOL_REACHED_SHIFT)) & APU_NFC_STATUS_SOC_VOL_REACHED_MASK)\r\n\r\n#define APU_NFC_STATUS_NFC_PWR_RDY_MASK          (0x800U)\r\n#define APU_NFC_STATUS_NFC_PWR_RDY_SHIFT         (11U)\r\n/*! NFC_PWR_RDY - NFC Power ready */\r\n#define APU_NFC_STATUS_NFC_PWR_RDY(x)            (((uint32_t)(((uint32_t)(x)) << APU_NFC_STATUS_NFC_PWR_RDY_SHIFT)) & APU_NFC_STATUS_NFC_PWR_RDY_MASK)\r\n\r\n#define APU_NFC_STATUS_APU_NFC_ST_MASK           (0x7000U)\r\n#define APU_NFC_STATUS_APU_NFC_ST_SHIFT          (12U)\r\n/*! APU_NFC_ST - APU NFC St */\r\n#define APU_NFC_STATUS_APU_NFC_ST(x)             (((uint32_t)(((uint32_t)(x)) << APU_NFC_STATUS_APU_NFC_ST_SHIFT)) & APU_NFC_STATUS_APU_NFC_ST_MASK)\r\n\r\n#define APU_NFC_STATUS_HOST_WKUP_IN_MASK         (0xFFFF0000U)\r\n#define APU_NFC_STATUS_HOST_WKUP_IN_SHIFT        (16U)\r\n/*! HOST_WKUP_IN - Host Wakeup Interrupt */\r\n#define APU_NFC_STATUS_HOST_WKUP_IN(x)           (((uint32_t)(((uint32_t)(x)) << APU_NFC_STATUS_HOST_WKUP_IN_SHIFT)) & APU_NFC_STATUS_HOST_WKUP_IN_MASK)\r\n/*! @} */\r\n\r\n/*! @name NFC_CKEN_CTRL - NFC Clock Enable Control */\r\n/*! @{ */\r\n\r\n#define APU_NFC_CKEN_CTRL_NFC_CLK_EN_PWR_VAL_MASK (0x1U)\r\n#define APU_NFC_CKEN_CTRL_NFC_CLK_EN_PWR_VAL_SHIFT (0U)\r\n/*! NFC_CLK_EN_PWR_VAL - control value for nfc_clk_en when power ready */\r\n#define APU_NFC_CKEN_CTRL_NFC_CLK_EN_PWR_VAL(x)  (((uint32_t)(((uint32_t)(x)) << APU_NFC_CKEN_CTRL_NFC_CLK_EN_PWR_VAL_SHIFT)) & APU_NFC_CKEN_CTRL_NFC_CLK_EN_PWR_VAL_MASK)\r\n\r\n#define APU_NFC_CKEN_CTRL_NFC_CLK_EN_PWR_SEL_MASK (0x2U)\r\n#define APU_NFC_CKEN_CTRL_NFC_CLK_EN_PWR_SEL_SHIFT (1U)\r\n/*! NFC_CLK_EN_PWR_SEL - selection for nfc_cm3_clk_en when power ready */\r\n#define APU_NFC_CKEN_CTRL_NFC_CLK_EN_PWR_SEL(x)  (((uint32_t)(((uint32_t)(x)) << APU_NFC_CKEN_CTRL_NFC_CLK_EN_PWR_SEL_SHIFT)) & APU_NFC_CKEN_CTRL_NFC_CLK_EN_PWR_SEL_MASK)\r\n\r\n#define APU_NFC_CKEN_CTRL_NFC_CLK_EN_XOSC_VAL_MASK (0x4U)\r\n#define APU_NFC_CKEN_CTRL_NFC_CLK_EN_XOSC_VAL_SHIFT (2U)\r\n/*! NFC_CLK_EN_XOSC_VAL - Control value for nfc_cm3_clk_en when XOSC ready */\r\n#define APU_NFC_CKEN_CTRL_NFC_CLK_EN_XOSC_VAL(x) (((uint32_t)(((uint32_t)(x)) << APU_NFC_CKEN_CTRL_NFC_CLK_EN_XOSC_VAL_SHIFT)) & APU_NFC_CKEN_CTRL_NFC_CLK_EN_XOSC_VAL_MASK)\r\n\r\n#define APU_NFC_CKEN_CTRL_NFC_CLK_EN_XOSC_SEL_MASK (0x8U)\r\n#define APU_NFC_CKEN_CTRL_NFC_CLK_EN_XOSC_SEL_SHIFT (3U)\r\n/*! NFC_CLK_EN_XOSC_SEL - selection for nfc_cm3_clk_en when XOSC ready */\r\n#define APU_NFC_CKEN_CTRL_NFC_CLK_EN_XOSC_SEL(x) (((uint32_t)(((uint32_t)(x)) << APU_NFC_CKEN_CTRL_NFC_CLK_EN_XOSC_SEL_SHIFT)) & APU_NFC_CKEN_CTRL_NFC_CLK_EN_XOSC_SEL_MASK)\r\n\r\n#define APU_NFC_CKEN_CTRL_NFC_CLK_EN_PLL_VAL_MASK (0x10U)\r\n#define APU_NFC_CKEN_CTRL_NFC_CLK_EN_PLL_VAL_SHIFT (4U)\r\n/*! NFC_CLK_EN_PLL_VAL - NFC Clock Enable PLL Value */\r\n#define APU_NFC_CKEN_CTRL_NFC_CLK_EN_PLL_VAL(x)  (((uint32_t)(((uint32_t)(x)) << APU_NFC_CKEN_CTRL_NFC_CLK_EN_PLL_VAL_SHIFT)) & APU_NFC_CKEN_CTRL_NFC_CLK_EN_PLL_VAL_MASK)\r\n\r\n#define APU_NFC_CKEN_CTRL_NFC_CLK_EN_PLL_SEL_MASK (0x20U)\r\n#define APU_NFC_CKEN_CTRL_NFC_CLK_EN_PLL_SEL_SHIFT (5U)\r\n/*! NFC_CLK_EN_PLL_SEL - selection for nfc_cm3_clk_en when PLL ready */\r\n#define APU_NFC_CKEN_CTRL_NFC_CLK_EN_PLL_SEL(x)  (((uint32_t)(((uint32_t)(x)) << APU_NFC_CKEN_CTRL_NFC_CLK_EN_PLL_SEL_SHIFT)) & APU_NFC_CKEN_CTRL_NFC_CLK_EN_PLL_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name NFC_RESRC_CTRL - NFC RESRC Control */\r\n/*! @{ */\r\n\r\n#define APU_NFC_RESRC_CTRL_NFC_PWR_REQ_MASK      (0x1U)\r\n#define APU_NFC_RESRC_CTRL_NFC_PWR_REQ_SHIFT     (0U)\r\n/*! NFC_PWR_REQ - override hw power request */\r\n#define APU_NFC_RESRC_CTRL_NFC_PWR_REQ(x)        (((uint32_t)(((uint32_t)(x)) << APU_NFC_RESRC_CTRL_NFC_PWR_REQ_SHIFT)) & APU_NFC_RESRC_CTRL_NFC_PWR_REQ_MASK)\r\n\r\n#define APU_NFC_RESRC_CTRL_NFC_PWR_REQ_VAL_MASK  (0x2U)\r\n#define APU_NFC_RESRC_CTRL_NFC_PWR_REQ_VAL_SHIFT (1U)\r\n/*! NFC_PWR_REQ_VAL - override value when apu_nfc_resrc_ctrl[0] is set */\r\n#define APU_NFC_RESRC_CTRL_NFC_PWR_REQ_VAL(x)    (((uint32_t)(((uint32_t)(x)) << APU_NFC_RESRC_CTRL_NFC_PWR_REQ_VAL_SHIFT)) & APU_NFC_RESRC_CTRL_NFC_PWR_REQ_VAL_MASK)\r\n\r\n#define APU_NFC_RESRC_CTRL_NFC_XOSC_REQ_MASK     (0x4U)\r\n#define APU_NFC_RESRC_CTRL_NFC_XOSC_REQ_SHIFT    (2U)\r\n/*! NFC_XOSC_REQ - override hw xosc request */\r\n#define APU_NFC_RESRC_CTRL_NFC_XOSC_REQ(x)       (((uint32_t)(((uint32_t)(x)) << APU_NFC_RESRC_CTRL_NFC_XOSC_REQ_SHIFT)) & APU_NFC_RESRC_CTRL_NFC_XOSC_REQ_MASK)\r\n\r\n#define APU_NFC_RESRC_CTRL_NFC_XOSC_REQ_VAL_MASK (0x8U)\r\n#define APU_NFC_RESRC_CTRL_NFC_XOSC_REQ_VAL_SHIFT (3U)\r\n/*! NFC_XOSC_REQ_VAL - override value when apu_nfc_resrc_ctrl[2] is set */\r\n#define APU_NFC_RESRC_CTRL_NFC_XOSC_REQ_VAL(x)   (((uint32_t)(((uint32_t)(x)) << APU_NFC_RESRC_CTRL_NFC_XOSC_REQ_VAL_SHIFT)) & APU_NFC_RESRC_CTRL_NFC_XOSC_REQ_VAL_MASK)\r\n\r\n#define APU_NFC_RESRC_CTRL_NFC_XP_REQ_MASK       (0x10U)\r\n#define APU_NFC_RESRC_CTRL_NFC_XP_REQ_SHIFT      (4U)\r\n/*! NFC_XP_REQ - override hw xosc + pwr request */\r\n#define APU_NFC_RESRC_CTRL_NFC_XP_REQ(x)         (((uint32_t)(((uint32_t)(x)) << APU_NFC_RESRC_CTRL_NFC_XP_REQ_SHIFT)) & APU_NFC_RESRC_CTRL_NFC_XP_REQ_MASK)\r\n\r\n#define APU_NFC_RESRC_CTRL_NFC_XP_REQ_VAL_MASK   (0x20U)\r\n#define APU_NFC_RESRC_CTRL_NFC_XP_REQ_VAL_SHIFT  (5U)\r\n/*! NFC_XP_REQ_VAL - override value when apu_nfc_resrc_ctrl[4] is set */\r\n#define APU_NFC_RESRC_CTRL_NFC_XP_REQ_VAL(x)     (((uint32_t)(((uint32_t)(x)) << APU_NFC_RESRC_CTRL_NFC_XP_REQ_VAL_SHIFT)) & APU_NFC_RESRC_CTRL_NFC_XP_REQ_VAL_MASK)\r\n\r\n#define APU_NFC_RESRC_CTRL_NFC_SB_REQ_MASK       (0x40U)\r\n#define APU_NFC_RESRC_CTRL_NFC_SB_REQ_SHIFT      (6U)\r\n/*! NFC_SB_REQ - override hw xosc + pwr + pll sb request */\r\n#define APU_NFC_RESRC_CTRL_NFC_SB_REQ(x)         (((uint32_t)(((uint32_t)(x)) << APU_NFC_RESRC_CTRL_NFC_SB_REQ_SHIFT)) & APU_NFC_RESRC_CTRL_NFC_SB_REQ_MASK)\r\n\r\n#define APU_NFC_RESRC_CTRL_NFC_SB_REQ_VAL_MASK   (0x80U)\r\n#define APU_NFC_RESRC_CTRL_NFC_SB_REQ_VAL_SHIFT  (7U)\r\n/*! NFC_SB_REQ_VAL - override value when apu_nfc_resrc_ctrl[6] is set */\r\n#define APU_NFC_RESRC_CTRL_NFC_SB_REQ_VAL(x)     (((uint32_t)(((uint32_t)(x)) << APU_NFC_RESRC_CTRL_NFC_SB_REQ_VAL_SHIFT)) & APU_NFC_RESRC_CTRL_NFC_SB_REQ_VAL_MASK)\r\n\r\n#define APU_NFC_RESRC_CTRL_NFC_IPWAKE_REQ_MASK   (0x100U)\r\n#define APU_NFC_RESRC_CTRL_NFC_IPWAKE_REQ_SHIFT  (8U)\r\n/*! NFC_IPWAKE_REQ - override hw xosc + pwr + pll ipwake request */\r\n#define APU_NFC_RESRC_CTRL_NFC_IPWAKE_REQ(x)     (((uint32_t)(((uint32_t)(x)) << APU_NFC_RESRC_CTRL_NFC_IPWAKE_REQ_SHIFT)) & APU_NFC_RESRC_CTRL_NFC_IPWAKE_REQ_MASK)\r\n\r\n#define APU_NFC_RESRC_CTRL_NFC_IPWAKE_REQ_VAL_MASK (0x200U)\r\n#define APU_NFC_RESRC_CTRL_NFC_IPWAKE_REQ_VAL_SHIFT (9U)\r\n/*! NFC_IPWAKE_REQ_VAL - override value when apu_nfc_resrc_ctrl[8] is set */\r\n#define APU_NFC_RESRC_CTRL_NFC_IPWAKE_REQ_VAL(x) (((uint32_t)(((uint32_t)(x)) << APU_NFC_RESRC_CTRL_NFC_IPWAKE_REQ_VAL_SHIFT)) & APU_NFC_RESRC_CTRL_NFC_IPWAKE_REQ_VAL_MASK)\r\n\r\n#define APU_NFC_RESRC_CTRL_NFC_ALLWAKE_REQ_MASK  (0x400U)\r\n#define APU_NFC_RESRC_CTRL_NFC_ALLWAKE_REQ_SHIFT (10U)\r\n/*! NFC_ALLWAKE_REQ - firmware override hw xosc + pwr + pll allwake request */\r\n#define APU_NFC_RESRC_CTRL_NFC_ALLWAKE_REQ(x)    (((uint32_t)(((uint32_t)(x)) << APU_NFC_RESRC_CTRL_NFC_ALLWAKE_REQ_SHIFT)) & APU_NFC_RESRC_CTRL_NFC_ALLWAKE_REQ_MASK)\r\n\r\n#define APU_NFC_RESRC_CTRL_NFC_ALLWAKE_REQ_VAL_MASK (0x800U)\r\n#define APU_NFC_RESRC_CTRL_NFC_ALLWAKE_REQ_VAL_SHIFT (11U)\r\n/*! NFC_ALLWAKE_REQ_VAL - firmware override value when apu_nfc_resrc_ctrl[10] is set */\r\n#define APU_NFC_RESRC_CTRL_NFC_ALLWAKE_REQ_VAL(x) (((uint32_t)(((uint32_t)(x)) << APU_NFC_RESRC_CTRL_NFC_ALLWAKE_REQ_VAL_SHIFT)) & APU_NFC_RESRC_CTRL_NFC_ALLWAKE_REQ_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name NFC_DVFS_CTRL - NFC DVFS Control */\r\n/*! @{ */\r\n\r\n#define APU_NFC_DVFS_CTRL_NFC_VOL_VAL_MASK       (0x7FU)\r\n#define APU_NFC_DVFS_CTRL_NFC_VOL_VAL_SHIFT      (0U)\r\n/*! NFC_VOL_VAL - NFC Vol Value */\r\n#define APU_NFC_DVFS_CTRL_NFC_VOL_VAL(x)         (((uint32_t)(((uint32_t)(x)) << APU_NFC_DVFS_CTRL_NFC_VOL_VAL_SHIFT)) & APU_NFC_DVFS_CTRL_NFC_VOL_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name FP4_CTRL - FP4(15.4) Control */\r\n/*! @{ */\r\n\r\n#define APU_FP4_CTRL_FP4_SLP_RDY_MASK            (0x1U)\r\n#define APU_FP4_CTRL_FP4_SLP_RDY_SHIFT           (0U)\r\n/*! FP4_SLP_RDY - FP4 Sleep Ready */\r\n#define APU_FP4_CTRL_FP4_SLP_RDY(x)              (((uint32_t)(((uint32_t)(x)) << APU_FP4_CTRL_FP4_SLP_RDY_SHIFT)) & APU_FP4_CTRL_FP4_SLP_RDY_MASK)\r\n\r\n#define APU_FP4_CTRL_FP4_SLP_RDYMASK_MASK        (0x2U)\r\n#define APU_FP4_CTRL_FP4_SLP_RDYMASK_SHIFT       (1U)\r\n/*! FP4_SLP_RDYMASK - FP4 Sleep Ready Mask */\r\n#define APU_FP4_CTRL_FP4_SLP_RDYMASK(x)          (((uint32_t)(((uint32_t)(x)) << APU_FP4_CTRL_FP4_SLP_RDYMASK_SHIFT)) & APU_FP4_CTRL_FP4_SLP_RDYMASK_MASK)\r\n\r\n#define APU_FP4_CTRL_FP4_SLP_RDY_FW_MASK         (0x4U)\r\n#define APU_FP4_CTRL_FP4_SLP_RDY_FW_SHIFT        (2U)\r\n/*! FP4_SLP_RDY_FW - Bluetooth Sleep Ready FW */\r\n#define APU_FP4_CTRL_FP4_SLP_RDY_FW(x)           (((uint32_t)(((uint32_t)(x)) << APU_FP4_CTRL_FP4_SLP_RDY_FW_SHIFT)) & APU_FP4_CTRL_FP4_SLP_RDY_FW_MASK)\r\n\r\n#define APU_FP4_CTRL_USE_FP4_INTR_SLP_MASK       (0x80U)\r\n#define APU_FP4_CTRL_USE_FP4_INTR_SLP_SHIFT      (7U)\r\n/*! USE_FP4_INTR_SLP - Use 15.4 interrupt Sleep */\r\n#define APU_FP4_CTRL_USE_FP4_INTR_SLP(x)         (((uint32_t)(((uint32_t)(x)) << APU_FP4_CTRL_USE_FP4_INTR_SLP_SHIFT)) & APU_FP4_CTRL_USE_FP4_INTR_SLP_MASK)\r\n\r\n#define APU_FP4_CTRL_FP4_CLK_SYNC_MODE_SEL1_MASK (0x4000000U)\r\n#define APU_FP4_CTRL_FP4_CLK_SYNC_MODE_SEL1_SHIFT (26U)\r\n/*! FP4_CLK_SYNC_MODE_SEL1 - FP4 Clock Sync Mode Select 1 */\r\n#define APU_FP4_CTRL_FP4_CLK_SYNC_MODE_SEL1(x)   (((uint32_t)(((uint32_t)(x)) << APU_FP4_CTRL_FP4_CLK_SYNC_MODE_SEL1_SHIFT)) & APU_FP4_CTRL_FP4_CLK_SYNC_MODE_SEL1_MASK)\r\n\r\n#define APU_FP4_CTRL_USE_GLITCH_FREE_FP4_CLK_REQ_MASK (0x8000000U)\r\n#define APU_FP4_CTRL_USE_GLITCH_FREE_FP4_CLK_REQ_SHIFT (27U)\r\n/*! USE_GLITCH_FREE_FP4_CLK_REQ - Use Glitch-Free FP4 Clock Request */\r\n#define APU_FP4_CTRL_USE_GLITCH_FREE_FP4_CLK_REQ(x) (((uint32_t)(((uint32_t)(x)) << APU_FP4_CTRL_USE_GLITCH_FREE_FP4_CLK_REQ_SHIFT)) & APU_FP4_CTRL_USE_GLITCH_FREE_FP4_CLK_REQ_MASK)\r\n\r\n#define APU_FP4_CTRL_FRF_CLK_SYNC_MODE_SEL_MASK  (0x10000000U)\r\n#define APU_FP4_CTRL_FRF_CLK_SYNC_MODE_SEL_SHIFT (28U)\r\n/*! FRF_CLK_SYNC_MODE_SEL - FRF Clock Sync Mode Select */\r\n#define APU_FP4_CTRL_FRF_CLK_SYNC_MODE_SEL(x)    (((uint32_t)(((uint32_t)(x)) << APU_FP4_CTRL_FRF_CLK_SYNC_MODE_SEL_SHIFT)) & APU_FP4_CTRL_FRF_CLK_SYNC_MODE_SEL_MASK)\r\n\r\n#define APU_FP4_CTRL_FP4_CLK_SYNC_MODE_SEL0_MASK (0x20000000U)\r\n#define APU_FP4_CTRL_FP4_CLK_SYNC_MODE_SEL0_SHIFT (29U)\r\n/*! FP4_CLK_SYNC_MODE_SEL0 - FP4 Clock Sync Mode Select 0 */\r\n#define APU_FP4_CTRL_FP4_CLK_SYNC_MODE_SEL0(x)   (((uint32_t)(((uint32_t)(x)) << APU_FP4_CTRL_FP4_CLK_SYNC_MODE_SEL0_SHIFT)) & APU_FP4_CTRL_FP4_CLK_SYNC_MODE_SEL0_MASK)\r\n\r\n#define APU_FP4_CTRL_FRF_PLL_SYNC_MODE_SEL_MASK  (0x40000000U)\r\n#define APU_FP4_CTRL_FRF_PLL_SYNC_MODE_SEL_SHIFT (30U)\r\n/*! FRF_PLL_SYNC_MODE_SEL - FRF PLL Sync Mode Select */\r\n#define APU_FP4_CTRL_FRF_PLL_SYNC_MODE_SEL(x)    (((uint32_t)(((uint32_t)(x)) << APU_FP4_CTRL_FRF_PLL_SYNC_MODE_SEL_SHIFT)) & APU_FP4_CTRL_FRF_PLL_SYNC_MODE_SEL_MASK)\r\n\r\n#define APU_FP4_CTRL_FP4_HOST_SLP_RDY_MASK       (0x80000000U)\r\n#define APU_FP4_CTRL_FP4_HOST_SLP_RDY_SHIFT      (31U)\r\n/*! FP4_HOST_SLP_RDY - FP4 Host Sleep Ready */\r\n#define APU_FP4_CTRL_FP4_HOST_SLP_RDY(x)         (((uint32_t)(((uint32_t)(x)) << APU_FP4_CTRL_FP4_HOST_SLP_RDY_SHIFT)) & APU_FP4_CTRL_FP4_HOST_SLP_RDY_MASK)\r\n/*! @} */\r\n\r\n/*! @name FP4_WKUP_MASK - FP4 Wakeup Mask */\r\n/*! @{ */\r\n\r\n#define APU_FP4_WKUP_MASK_FP4_CLK_REQ_MASK_MASK  (0x1U)\r\n#define APU_FP4_WKUP_MASK_FP4_CLK_REQ_MASK_SHIFT (0U)\r\n/*! FP4_CLK_REQ_MASK - FP4 Clock Request Mask */\r\n#define APU_FP4_WKUP_MASK_FP4_CLK_REQ_MASK(x)    (((uint32_t)(((uint32_t)(x)) << APU_FP4_WKUP_MASK_FP4_CLK_REQ_MASK_SHIFT)) & APU_FP4_WKUP_MASK_FP4_CLK_REQ_MASK_MASK)\r\n\r\n#define APU_FP4_WKUP_MASK_FP4_INTERRUPT_MASK_MASK (0x2U)\r\n#define APU_FP4_WKUP_MASK_FP4_INTERRUPT_MASK_SHIFT (1U)\r\n/*! FP4_INTERRUPT_MASK - FP4 Interrupt Mask */\r\n#define APU_FP4_WKUP_MASK_FP4_INTERRUPT_MASK(x)  (((uint32_t)(((uint32_t)(x)) << APU_FP4_WKUP_MASK_FP4_INTERRUPT_MASK_SHIFT)) & APU_FP4_WKUP_MASK_FP4_INTERRUPT_MASK_MASK)\r\n\r\n#define APU_FP4_WKUP_MASK_FRF_PLL_REQ_MASK_MASK  (0x4U)\r\n#define APU_FP4_WKUP_MASK_FRF_PLL_REQ_MASK_SHIFT (2U)\r\n/*! FRF_PLL_REQ_MASK - FRF PLL Request Mask */\r\n#define APU_FP4_WKUP_MASK_FRF_PLL_REQ_MASK(x)    (((uint32_t)(((uint32_t)(x)) << APU_FP4_WKUP_MASK_FRF_PLL_REQ_MASK_SHIFT)) & APU_FP4_WKUP_MASK_FRF_PLL_REQ_MASK_MASK)\r\n\r\n#define APU_FP4_WKUP_MASK_FP4_PLL_REQ_MASK_MASK  (0x8U)\r\n#define APU_FP4_WKUP_MASK_FP4_PLL_REQ_MASK_SHIFT (3U)\r\n/*! FP4_PLL_REQ_MASK - 15.4 PLL Request Mask */\r\n#define APU_FP4_WKUP_MASK_FP4_PLL_REQ_MASK(x)    (((uint32_t)(((uint32_t)(x)) << APU_FP4_WKUP_MASK_FP4_PLL_REQ_MASK_SHIFT)) & APU_FP4_WKUP_MASK_FP4_PLL_REQ_MASK_MASK)\r\n\r\n#define APU_FP4_WKUP_MASK_FP4_HOST_MAP_MASK      (0xFFFF0000U)\r\n#define APU_FP4_WKUP_MASK_FP4_HOST_MAP_SHIFT     (16U)\r\n/*! FP4_HOST_MAP - 15.4 Host Map */\r\n#define APU_FP4_WKUP_MASK_FP4_HOST_MAP(x)        (((uint32_t)(((uint32_t)(x)) << APU_FP4_WKUP_MASK_FP4_HOST_MAP_SHIFT)) & APU_FP4_WKUP_MASK_FP4_HOST_MAP_MASK)\r\n/*! @} */\r\n\r\n/*! @name FP4_STATUS - FP4 Status */\r\n/*! @{ */\r\n\r\n#define APU_FP4_STATUS_APU_FP4_CLK_EN_MASK       (0x1U)\r\n#define APU_FP4_STATUS_APU_FP4_CLK_EN_SHIFT      (0U)\r\n/*! APU_FP4_CLK_EN - APU FP4 Clock Enable */\r\n#define APU_FP4_STATUS_APU_FP4_CLK_EN(x)         (((uint32_t)(((uint32_t)(x)) << APU_FP4_STATUS_APU_FP4_CLK_EN_SHIFT)) & APU_FP4_STATUS_APU_FP4_CLK_EN_MASK)\r\n\r\n#define APU_FP4_STATUS_APU_FRF_CLK_EN_MASK       (0x2U)\r\n#define APU_FP4_STATUS_APU_FRF_CLK_EN_SHIFT      (1U)\r\n/*! APU_FRF_CLK_EN - APU FRF Clock Enable */\r\n#define APU_FP4_STATUS_APU_FRF_CLK_EN(x)         (((uint32_t)(((uint32_t)(x)) << APU_FP4_STATUS_APU_FRF_CLK_EN_SHIFT)) & APU_FP4_STATUS_APU_FRF_CLK_EN_MASK)\r\n\r\n#define APU_FP4_STATUS_FP4_ACTIVE_SLPCK_MASK     (0x4U)\r\n#define APU_FP4_STATUS_FP4_ACTIVE_SLPCK_SHIFT    (2U)\r\n/*! FP4_ACTIVE_SLPCK - FP4 Active Sleep Clock */\r\n#define APU_FP4_STATUS_FP4_ACTIVE_SLPCK(x)       (((uint32_t)(((uint32_t)(x)) << APU_FP4_STATUS_FP4_ACTIVE_SLPCK_SHIFT)) & APU_FP4_STATUS_FP4_ACTIVE_SLPCK_MASK)\r\n\r\n#define APU_FP4_STATUS_BT_HOST_WKUP_MASK         (0x8U)\r\n#define APU_FP4_STATUS_BT_HOST_WKUP_SHIFT        (3U)\r\n/*! BT_HOST_WKUP - Bluetooth Host Wakeup */\r\n#define APU_FP4_STATUS_BT_HOST_WKUP(x)           (((uint32_t)(((uint32_t)(x)) << APU_FP4_STATUS_BT_HOST_WKUP_SHIFT)) & APU_FP4_STATUS_BT_HOST_WKUP_MASK)\r\n\r\n#define APU_FP4_STATUS_FP4_INTERRUPT_MASK        (0x10U)\r\n#define APU_FP4_STATUS_FP4_INTERRUPT_SHIFT       (4U)\r\n/*! FP4_INTERRUPT - FP4 Interrupt */\r\n#define APU_FP4_STATUS_FP4_INTERRUPT(x)          (((uint32_t)(((uint32_t)(x)) << APU_FP4_STATUS_FP4_INTERRUPT_SHIFT)) & APU_FP4_STATUS_FP4_INTERRUPT_MASK)\r\n\r\n#define APU_FP4_STATUS_FP4_PLL_REQ_MASK          (0x20U)\r\n#define APU_FP4_STATUS_FP4_PLL_REQ_SHIFT         (5U)\r\n/*! FP4_PLL_REQ - FP4 PLL Request */\r\n#define APU_FP4_STATUS_FP4_PLL_REQ(x)            (((uint32_t)(((uint32_t)(x)) << APU_FP4_STATUS_FP4_PLL_REQ_SHIFT)) & APU_FP4_STATUS_FP4_PLL_REQ_MASK)\r\n\r\n#define APU_FP4_STATUS_FP4_CLK_REQ_MASK          (0x40U)\r\n#define APU_FP4_STATUS_FP4_CLK_REQ_SHIFT         (6U)\r\n/*! FP4_CLK_REQ - FP4 Clock Request */\r\n#define APU_FP4_STATUS_FP4_CLK_REQ(x)            (((uint32_t)(((uint32_t)(x)) << APU_FP4_STATUS_FP4_CLK_REQ_SHIFT)) & APU_FP4_STATUS_FP4_CLK_REQ_MASK)\r\n\r\n#define APU_FP4_STATUS_FRF_PLL_REQ_MASK          (0x80U)\r\n#define APU_FP4_STATUS_FRF_PLL_REQ_SHIFT         (7U)\r\n/*! FRF_PLL_REQ - FRF PLL Request */\r\n#define APU_FP4_STATUS_FRF_PLL_REQ(x)            (((uint32_t)(((uint32_t)(x)) << APU_FP4_STATUS_FRF_PLL_REQ_SHIFT)) & APU_FP4_STATUS_FRF_PLL_REQ_MASK)\r\n\r\n#define APU_FP4_STATUS_HOST_WKUP_IN_MASK         (0xFFFF0000U)\r\n#define APU_FP4_STATUS_HOST_WKUP_IN_SHIFT        (16U)\r\n/*! HOST_WKUP_IN - Host Wakeup In */\r\n#define APU_FP4_STATUS_HOST_WKUP_IN(x)           (((uint32_t)(((uint32_t)(x)) << APU_FP4_STATUS_HOST_WKUP_IN_SHIFT)) & APU_FP4_STATUS_HOST_WKUP_IN_MASK)\r\n/*! @} */\r\n\r\n/*! @name FP4_CKEN_CTRL - FP4 Clock Enable Control */\r\n/*! @{ */\r\n\r\n#define APU_FP4_CKEN_CTRL_FP4_CLK_EN_VAL_PWR_MASK (0x1U)\r\n#define APU_FP4_CKEN_CTRL_FP4_CLK_EN_VAL_PWR_SHIFT (0U)\r\n/*! FP4_CLK_EN_VAL_PWR - control value for fp4_clk_en when power ready */\r\n#define APU_FP4_CKEN_CTRL_FP4_CLK_EN_VAL_PWR(x)  (((uint32_t)(((uint32_t)(x)) << APU_FP4_CKEN_CTRL_FP4_CLK_EN_VAL_PWR_SHIFT)) & APU_FP4_CKEN_CTRL_FP4_CLK_EN_VAL_PWR_MASK)\r\n\r\n#define APU_FP4_CKEN_CTRL_FP4_CLK_EN_SEL_PWR_MASK (0x2U)\r\n#define APU_FP4_CKEN_CTRL_FP4_CLK_EN_SEL_PWR_SHIFT (1U)\r\n/*! FP4_CLK_EN_SEL_PWR - selection for fp4_clk_en when power ready */\r\n#define APU_FP4_CKEN_CTRL_FP4_CLK_EN_SEL_PWR(x)  (((uint32_t)(((uint32_t)(x)) << APU_FP4_CKEN_CTRL_FP4_CLK_EN_SEL_PWR_SHIFT)) & APU_FP4_CKEN_CTRL_FP4_CLK_EN_SEL_PWR_MASK)\r\n\r\n#define APU_FP4_CKEN_CTRL_FP4_CLK_EN_VAL_XOSC_MASK (0x4U)\r\n#define APU_FP4_CKEN_CTRL_FP4_CLK_EN_VAL_XOSC_SHIFT (2U)\r\n/*! FP4_CLK_EN_VAL_XOSC - control value for fp4_clk_en when XOSC ready */\r\n#define APU_FP4_CKEN_CTRL_FP4_CLK_EN_VAL_XOSC(x) (((uint32_t)(((uint32_t)(x)) << APU_FP4_CKEN_CTRL_FP4_CLK_EN_VAL_XOSC_SHIFT)) & APU_FP4_CKEN_CTRL_FP4_CLK_EN_VAL_XOSC_MASK)\r\n\r\n#define APU_FP4_CKEN_CTRL_FP4_CLK_EN_SEL_XOSC_MASK (0x8U)\r\n#define APU_FP4_CKEN_CTRL_FP4_CLK_EN_SEL_XOSC_SHIFT (3U)\r\n/*! FP4_CLK_EN_SEL_XOSC - selection for fp4_clk_en when XOSC ready */\r\n#define APU_FP4_CKEN_CTRL_FP4_CLK_EN_SEL_XOSC(x) (((uint32_t)(((uint32_t)(x)) << APU_FP4_CKEN_CTRL_FP4_CLK_EN_SEL_XOSC_SHIFT)) & APU_FP4_CKEN_CTRL_FP4_CLK_EN_SEL_XOSC_MASK)\r\n\r\n#define APU_FP4_CKEN_CTRL_FP4_CLK_EN_VAL_MASK    (0x10U)\r\n#define APU_FP4_CKEN_CTRL_FP4_CLK_EN_VAL_SHIFT   (4U)\r\n/*! FP4_CLK_EN_VAL - control value for fp4_clk_en when PLL ready */\r\n#define APU_FP4_CKEN_CTRL_FP4_CLK_EN_VAL(x)      (((uint32_t)(((uint32_t)(x)) << APU_FP4_CKEN_CTRL_FP4_CLK_EN_VAL_SHIFT)) & APU_FP4_CKEN_CTRL_FP4_CLK_EN_VAL_MASK)\r\n\r\n#define APU_FP4_CKEN_CTRL_FP4_CLK_EN_SEL_MASK    (0x20U)\r\n#define APU_FP4_CKEN_CTRL_FP4_CLK_EN_SEL_SHIFT   (5U)\r\n/*! FP4_CLK_EN_SEL - selection for fp4_clk_en when PLL ready */\r\n#define APU_FP4_CKEN_CTRL_FP4_CLK_EN_SEL(x)      (((uint32_t)(((uint32_t)(x)) << APU_FP4_CKEN_CTRL_FP4_CLK_EN_SEL_SHIFT)) & APU_FP4_CKEN_CTRL_FP4_CLK_EN_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name FP4_RESRC_CTRL - FP4 RESRC Control */\r\n/*! @{ */\r\n\r\n#define APU_FP4_RESRC_CTRL_FW_PWR_REQ_MASK       (0x1U)\r\n#define APU_FP4_RESRC_CTRL_FW_PWR_REQ_SHIFT      (0U)\r\n/*! FW_PWR_REQ - override hw power request */\r\n#define APU_FP4_RESRC_CTRL_FW_PWR_REQ(x)         (((uint32_t)(((uint32_t)(x)) << APU_FP4_RESRC_CTRL_FW_PWR_REQ_SHIFT)) & APU_FP4_RESRC_CTRL_FW_PWR_REQ_MASK)\r\n\r\n#define APU_FP4_RESRC_CTRL_FW_PWR_REQ_VAL_MASK   (0x2U)\r\n#define APU_FP4_RESRC_CTRL_FW_PWR_REQ_VAL_SHIFT  (1U)\r\n/*! FW_PWR_REQ_VAL - override value when apu_fp4_resrc_ctrl[0] is set */\r\n#define APU_FP4_RESRC_CTRL_FW_PWR_REQ_VAL(x)     (((uint32_t)(((uint32_t)(x)) << APU_FP4_RESRC_CTRL_FW_PWR_REQ_VAL_SHIFT)) & APU_FP4_RESRC_CTRL_FW_PWR_REQ_VAL_MASK)\r\n\r\n#define APU_FP4_RESRC_CTRL_FW_XOSC_REQ_MASK      (0x4U)\r\n#define APU_FP4_RESRC_CTRL_FW_XOSC_REQ_SHIFT     (2U)\r\n/*! FW_XOSC_REQ - override hw xosc request */\r\n#define APU_FP4_RESRC_CTRL_FW_XOSC_REQ(x)        (((uint32_t)(((uint32_t)(x)) << APU_FP4_RESRC_CTRL_FW_XOSC_REQ_SHIFT)) & APU_FP4_RESRC_CTRL_FW_XOSC_REQ_MASK)\r\n\r\n#define APU_FP4_RESRC_CTRL_FW_XOSC_REQ_VAL_MASK  (0x8U)\r\n#define APU_FP4_RESRC_CTRL_FW_XOSC_REQ_VAL_SHIFT (3U)\r\n/*! FW_XOSC_REQ_VAL - override value when apu_fp4_resrc_ctrl[2] is set */\r\n#define APU_FP4_RESRC_CTRL_FW_XOSC_REQ_VAL(x)    (((uint32_t)(((uint32_t)(x)) << APU_FP4_RESRC_CTRL_FW_XOSC_REQ_VAL_SHIFT)) & APU_FP4_RESRC_CTRL_FW_XOSC_REQ_VAL_MASK)\r\n\r\n#define APU_FP4_RESRC_CTRL_FW_XP_REQ_MASK        (0x10U)\r\n#define APU_FP4_RESRC_CTRL_FW_XP_REQ_SHIFT       (4U)\r\n/*! FW_XP_REQ - override hw xosc + pwr request */\r\n#define APU_FP4_RESRC_CTRL_FW_XP_REQ(x)          (((uint32_t)(((uint32_t)(x)) << APU_FP4_RESRC_CTRL_FW_XP_REQ_SHIFT)) & APU_FP4_RESRC_CTRL_FW_XP_REQ_MASK)\r\n\r\n#define APU_FP4_RESRC_CTRL_FW_XP_REQ_VAL_MASK    (0x20U)\r\n#define APU_FP4_RESRC_CTRL_FW_XP_REQ_VAL_SHIFT   (5U)\r\n/*! FW_XP_REQ_VAL - override value when apu_fp4_resrc_ctrl[4] is set */\r\n#define APU_FP4_RESRC_CTRL_FW_XP_REQ_VAL(x)      (((uint32_t)(((uint32_t)(x)) << APU_FP4_RESRC_CTRL_FW_XP_REQ_VAL_SHIFT)) & APU_FP4_RESRC_CTRL_FW_XP_REQ_VAL_MASK)\r\n\r\n#define APU_FP4_RESRC_CTRL_FW_SB_REQ_MASK        (0x40U)\r\n#define APU_FP4_RESRC_CTRL_FW_SB_REQ_SHIFT       (6U)\r\n/*! FW_SB_REQ - override hw xosc + pwr + pll sb request */\r\n#define APU_FP4_RESRC_CTRL_FW_SB_REQ(x)          (((uint32_t)(((uint32_t)(x)) << APU_FP4_RESRC_CTRL_FW_SB_REQ_SHIFT)) & APU_FP4_RESRC_CTRL_FW_SB_REQ_MASK)\r\n\r\n#define APU_FP4_RESRC_CTRL_FW_SB_REQ_VAL_MASK    (0x80U)\r\n#define APU_FP4_RESRC_CTRL_FW_SB_REQ_VAL_SHIFT   (7U)\r\n/*! FW_SB_REQ_VAL - override value when apu_fp4_resrc_ctrl[6] is set */\r\n#define APU_FP4_RESRC_CTRL_FW_SB_REQ_VAL(x)      (((uint32_t)(((uint32_t)(x)) << APU_FP4_RESRC_CTRL_FW_SB_REQ_VAL_SHIFT)) & APU_FP4_RESRC_CTRL_FW_SB_REQ_VAL_MASK)\r\n\r\n#define APU_FP4_RESRC_CTRL_FW_IPWAKE_REQ_MASK    (0x100U)\r\n#define APU_FP4_RESRC_CTRL_FW_IPWAKE_REQ_SHIFT   (8U)\r\n/*! FW_IPWAKE_REQ - override hw xosc + pwr + pll ipwake request */\r\n#define APU_FP4_RESRC_CTRL_FW_IPWAKE_REQ(x)      (((uint32_t)(((uint32_t)(x)) << APU_FP4_RESRC_CTRL_FW_IPWAKE_REQ_SHIFT)) & APU_FP4_RESRC_CTRL_FW_IPWAKE_REQ_MASK)\r\n\r\n#define APU_FP4_RESRC_CTRL_FW_IPWAKE_REQ_VAL_MASK (0x200U)\r\n#define APU_FP4_RESRC_CTRL_FW_IPWAKE_REQ_VAL_SHIFT (9U)\r\n/*! FW_IPWAKE_REQ_VAL - override value when apu_fp4_resrc_ctrl[8] is set */\r\n#define APU_FP4_RESRC_CTRL_FW_IPWAKE_REQ_VAL(x)  (((uint32_t)(((uint32_t)(x)) << APU_FP4_RESRC_CTRL_FW_IPWAKE_REQ_VAL_SHIFT)) & APU_FP4_RESRC_CTRL_FW_IPWAKE_REQ_VAL_MASK)\r\n\r\n#define APU_FP4_RESRC_CTRL_FW_ALLWAKE_REQ_MASK   (0x400U)\r\n#define APU_FP4_RESRC_CTRL_FW_ALLWAKE_REQ_SHIFT  (10U)\r\n/*! FW_ALLWAKE_REQ - firmware override hw xosc + pwr + pll allwake request */\r\n#define APU_FP4_RESRC_CTRL_FW_ALLWAKE_REQ(x)     (((uint32_t)(((uint32_t)(x)) << APU_FP4_RESRC_CTRL_FW_ALLWAKE_REQ_SHIFT)) & APU_FP4_RESRC_CTRL_FW_ALLWAKE_REQ_MASK)\r\n\r\n#define APU_FP4_RESRC_CTRL_FW_ALLWAKE_REQ_VAL_MASK (0x800U)\r\n#define APU_FP4_RESRC_CTRL_FW_ALLWAKE_REQ_VAL_SHIFT (11U)\r\n/*! FW_ALLWAKE_REQ_VAL - firmware override value when apu_fp4_resrc_ctrl[10] is set */\r\n#define APU_FP4_RESRC_CTRL_FW_ALLWAKE_REQ_VAL(x) (((uint32_t)(((uint32_t)(x)) << APU_FP4_RESRC_CTRL_FW_ALLWAKE_REQ_VAL_SHIFT)) & APU_FP4_RESRC_CTRL_FW_ALLWAKE_REQ_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name FP4_DVFS_CTRL - FP4 DVFS Control */\r\n/*! @{ */\r\n\r\n#define APU_FP4_DVFS_CTRL_FP4_VOL_VAL_MASK       (0x7FU)\r\n#define APU_FP4_DVFS_CTRL_FP4_VOL_VAL_SHIFT      (0U)\r\n/*! FP4_VOL_VAL - FP4 Vol Value */\r\n#define APU_FP4_DVFS_CTRL_FP4_VOL_VAL(x)         (((uint32_t)(((uint32_t)(x)) << APU_FP4_DVFS_CTRL_FP4_VOL_VAL_SHIFT)) & APU_FP4_DVFS_CTRL_FP4_VOL_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_FP4_HOST_WKUP_MASK - CPU2 15.4 Host Wakeup Mask */\r\n/*! @{ */\r\n\r\n#define APU_CPU2_FP4_HOST_WKUP_MASK_HOST_WKUP_MASK_MASK (0xFFFFU)\r\n#define APU_CPU2_FP4_HOST_WKUP_MASK_HOST_WKUP_MASK_SHIFT (0U)\r\n/*! HOST_WKUP_MASK - Host Wakeup Mask */\r\n#define APU_CPU2_FP4_HOST_WKUP_MASK_HOST_WKUP_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU2_FP4_HOST_WKUP_MASK_HOST_WKUP_MASK_SHIFT)) & APU_CPU2_FP4_HOST_WKUP_MASK_HOST_WKUP_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_FP4_HOST_WKUP_POL - CPU2 15.4 Host Wakeup Polarity */\r\n/*! @{ */\r\n\r\n#define APU_CPU2_FP4_HOST_WKUP_POL_HOST_WKUP_POL_MASK (0xFFFFU)\r\n#define APU_CPU2_FP4_HOST_WKUP_POL_HOST_WKUP_POL_SHIFT (0U)\r\n/*! HOST_WKUP_POL - Host Wakeup Polarity */\r\n#define APU_CPU2_FP4_HOST_WKUP_POL_HOST_WKUP_POL(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU2_FP4_HOST_WKUP_POL_HOST_WKUP_POL_SHIFT)) & APU_CPU2_FP4_HOST_WKUP_POL_HOST_WKUP_POL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_FP4_HOST_WKUP_CTRL - CPU2 15.4 Host Wakeup Control */\r\n/*! @{ */\r\n\r\n#define APU_CPU2_FP4_HOST_WKUP_CTRL_HOST_WKUP_CTRL_MASK (0xFFFFU)\r\n#define APU_CPU2_FP4_HOST_WKUP_CTRL_HOST_WKUP_CTRL_SHIFT (0U)\r\n/*! HOST_WKUP_CTRL - Host Wakeup Control */\r\n#define APU_CPU2_FP4_HOST_WKUP_CTRL_HOST_WKUP_CTRL(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU2_FP4_HOST_WKUP_CTRL_HOST_WKUP_CTRL_SHIFT)) & APU_CPU2_FP4_HOST_WKUP_CTRL_HOST_WKUP_CTRL_MASK)\r\n\r\n#define APU_CPU2_FP4_HOST_WKUP_CTRL_HOST_INTR_MASK_MASK (0xFFFF0000U)\r\n#define APU_CPU2_FP4_HOST_WKUP_CTRL_HOST_INTR_MASK_SHIFT (16U)\r\n/*! HOST_INTR_MASK - Host Interrupt Mask */\r\n#define APU_CPU2_FP4_HOST_WKUP_CTRL_HOST_INTR_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU2_FP4_HOST_WKUP_CTRL_HOST_INTR_MASK_SHIFT)) & APU_CPU2_FP4_HOST_WKUP_CTRL_HOST_INTR_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name HW_IP_ACTIVE_INDEX_CTRL - HW IP active index Control */\r\n/*! @{ */\r\n\r\n#define APU_HW_IP_ACTIVE_INDEX_CTRL_MASTERX_ACTIVE_INDEX_MASK (0xFFFFFFFFU)\r\n#define APU_HW_IP_ACTIVE_INDEX_CTRL_MASTERX_ACTIVE_INDEX_SHIFT (0U)\r\n/*! MASTERX_ACTIVE_INDEX - master0-7 Active Index[3:0] */\r\n#define APU_HW_IP_ACTIVE_INDEX_CTRL_MASTERX_ACTIVE_INDEX(x) (((uint32_t)(((uint32_t)(x)) << APU_HW_IP_ACTIVE_INDEX_CTRL_MASTERX_ACTIVE_INDEX_SHIFT)) & APU_HW_IP_ACTIVE_INDEX_CTRL_MASTERX_ACTIVE_INDEX_MASK)\r\n/*! @} */\r\n\r\n/*! @name HW_IP_INACTIVE_INDEX_CTRL - HW IP inactive Control */\r\n/*! @{ */\r\n\r\n#define APU_HW_IP_INACTIVE_INDEX_CTRL_MASTERX_INACTIVE_INDEX_MASK (0xFFFFFFFFU)\r\n#define APU_HW_IP_INACTIVE_INDEX_CTRL_MASTERX_INACTIVE_INDEX_SHIFT (0U)\r\n/*! MASTERX_INACTIVE_INDEX - master0-7 inactive Index[3:0] */\r\n#define APU_HW_IP_INACTIVE_INDEX_CTRL_MASTERX_INACTIVE_INDEX(x) (((uint32_t)(((uint32_t)(x)) << APU_HW_IP_INACTIVE_INDEX_CTRL_MASTERX_INACTIVE_INDEX_SHIFT)) & APU_HW_IP_INACTIVE_INDEX_CTRL_MASTERX_INACTIVE_INDEX_MASK)\r\n/*! @} */\r\n\r\n/*! @name HW_IP_DYNAMIC_CLK_SWITCH_CTRL - HW IP dynamic clock switching contrl */\r\n/*! @{ */\r\n\r\n#define APU_HW_IP_DYNAMIC_CLK_SWITCH_CTRL_MASTERX_APU_IDLE_BYPASS_EN_MASK (0xFFU)\r\n#define APU_HW_IP_DYNAMIC_CLK_SWITCH_CTRL_MASTERX_APU_IDLE_BYPASS_EN_SHIFT (0U)\r\n/*! MASTERX_APU_IDLE_BYPASS_EN - 1-FW bypasses hw_ip_idle; 0 - use hw_ip_idle */\r\n#define APU_HW_IP_DYNAMIC_CLK_SWITCH_CTRL_MASTERX_APU_IDLE_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_HW_IP_DYNAMIC_CLK_SWITCH_CTRL_MASTERX_APU_IDLE_BYPASS_EN_SHIFT)) & APU_HW_IP_DYNAMIC_CLK_SWITCH_CTRL_MASTERX_APU_IDLE_BYPASS_EN_MASK)\r\n\r\n#define APU_HW_IP_DYNAMIC_CLK_SWITCH_CTRL_MASTERX_APU_IDLE_BYPASS_VAL_MASK (0xFF00U)\r\n#define APU_HW_IP_DYNAMIC_CLK_SWITCH_CTRL_MASTERX_APU_IDLE_BYPASS_VAL_SHIFT (8U)\r\n/*! MASTERX_APU_IDLE_BYPASS_VAL - idle bypass val */\r\n#define APU_HW_IP_DYNAMIC_CLK_SWITCH_CTRL_MASTERX_APU_IDLE_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << APU_HW_IP_DYNAMIC_CLK_SWITCH_CTRL_MASTERX_APU_IDLE_BYPASS_VAL_SHIFT)) & APU_HW_IP_DYNAMIC_CLK_SWITCH_CTRL_MASTERX_APU_IDLE_BYPASS_VAL_MASK)\r\n\r\n#define APU_HW_IP_DYNAMIC_CLK_SWITCH_CTRL_MASTERX_ACTIVE_INDEX_BYPASS_EN_MASK (0xFF0000U)\r\n#define APU_HW_IP_DYNAMIC_CLK_SWITCH_CTRL_MASTERX_ACTIVE_INDEX_BYPASS_EN_SHIFT (16U)\r\n/*! MASTERX_ACTIVE_INDEX_BYPASS_EN - 1- use masterx_active-index from register hw_ip_active_index_ctrl; 0-use active index from HW latched version */\r\n#define APU_HW_IP_DYNAMIC_CLK_SWITCH_CTRL_MASTERX_ACTIVE_INDEX_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_HW_IP_DYNAMIC_CLK_SWITCH_CTRL_MASTERX_ACTIVE_INDEX_BYPASS_EN_SHIFT)) & APU_HW_IP_DYNAMIC_CLK_SWITCH_CTRL_MASTERX_ACTIVE_INDEX_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name IHB_CTRL - IHB Control */\r\n/*! @{ */\r\n\r\n#define APU_IHB_CTRL_IHB_VOL_REQ_AS_P_REQ_MASK   (0x1U)\r\n#define APU_IHB_CTRL_IHB_VOL_REQ_AS_P_REQ_SHIFT  (0U)\r\n/*! IHB_VOL_REQ_AS_P_REQ - IHB Vol Request as P Request */\r\n#define APU_IHB_CTRL_IHB_VOL_REQ_AS_P_REQ(x)     (((uint32_t)(((uint32_t)(x)) << APU_IHB_CTRL_IHB_VOL_REQ_AS_P_REQ_SHIFT)) & APU_IHB_CTRL_IHB_VOL_REQ_AS_P_REQ_MASK)\r\n\r\n#define APU_IHB_CTRL_IHB_VOL_REQ_AS_XP_REQ_MASK  (0x2U)\r\n#define APU_IHB_CTRL_IHB_VOL_REQ_AS_XP_REQ_SHIFT (1U)\r\n/*! IHB_VOL_REQ_AS_XP_REQ - IHB Vol Request as XP Request */\r\n#define APU_IHB_CTRL_IHB_VOL_REQ_AS_XP_REQ(x)    (((uint32_t)(((uint32_t)(x)) << APU_IHB_CTRL_IHB_VOL_REQ_AS_XP_REQ_SHIFT)) & APU_IHB_CTRL_IHB_VOL_REQ_AS_XP_REQ_MASK)\r\n\r\n#define APU_IHB_CTRL_IHB_CLK_REQ_AS_XP_REQ_MASK  (0x4U)\r\n#define APU_IHB_CTRL_IHB_CLK_REQ_AS_XP_REQ_SHIFT (2U)\r\n/*! IHB_CLK_REQ_AS_XP_REQ - IHB Clock Request as XP Request */\r\n#define APU_IHB_CTRL_IHB_CLK_REQ_AS_XP_REQ(x)    (((uint32_t)(((uint32_t)(x)) << APU_IHB_CTRL_IHB_CLK_REQ_AS_XP_REQ_SHIFT)) & APU_IHB_CTRL_IHB_CLK_REQ_AS_XP_REQ_MASK)\r\n\r\n#define APU_IHB_CTRL_IHB_CLK_REQ_AS_XPP_REQ_MASK (0x8U)\r\n#define APU_IHB_CTRL_IHB_CLK_REQ_AS_XPP_REQ_SHIFT (3U)\r\n/*! IHB_CLK_REQ_AS_XPP_REQ - IHB Clock Request as XPP Request */\r\n#define APU_IHB_CTRL_IHB_CLK_REQ_AS_XPP_REQ(x)   (((uint32_t)(((uint32_t)(x)) << APU_IHB_CTRL_IHB_CLK_REQ_AS_XPP_REQ_SHIFT)) & APU_IHB_CTRL_IHB_CLK_REQ_AS_XPP_REQ_MASK)\r\n\r\n#define APU_IHB_CTRL_IHB_VOL_VAL_MASK            (0x7F0000U)\r\n#define APU_IHB_CTRL_IHB_VOL_VAL_SHIFT           (16U)\r\n/*! IHB_VOL_VAL - Voltage value needed for Bluetooth function */\r\n#define APU_IHB_CTRL_IHB_VOL_VAL(x)              (((uint32_t)(((uint32_t)(x)) << APU_IHB_CTRL_IHB_VOL_VAL_SHIFT)) & APU_IHB_CTRL_IHB_VOL_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name IHB_WKUP_MASK - IHB Wakeup Mask */\r\n/*! @{ */\r\n\r\n#define APU_IHB_WKUP_MASK_IHB_HI_VOL_REQ_MASK_MASK (0x1U)\r\n#define APU_IHB_WKUP_MASK_IHB_HI_VOL_REQ_MASK_SHIFT (0U)\r\n/*! IHB_HI_VOL_REQ_MASK - IHB High Vol Request Mask */\r\n#define APU_IHB_WKUP_MASK_IHB_HI_VOL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_IHB_WKUP_MASK_IHB_HI_VOL_REQ_MASK_SHIFT)) & APU_IHB_WKUP_MASK_IHB_HI_VOL_REQ_MASK_MASK)\r\n\r\n#define APU_IHB_WKUP_MASK_IHB_LO_VOL_REQ_MASK_MASK (0x2U)\r\n#define APU_IHB_WKUP_MASK_IHB_LO_VOL_REQ_MASK_SHIFT (1U)\r\n/*! IHB_LO_VOL_REQ_MASK - IHB Low Vol Request Mask */\r\n#define APU_IHB_WKUP_MASK_IHB_LO_VOL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_IHB_WKUP_MASK_IHB_LO_VOL_REQ_MASK_SHIFT)) & APU_IHB_WKUP_MASK_IHB_LO_VOL_REQ_MASK_MASK)\r\n\r\n#define APU_IHB_WKUP_MASK_IHB_CLK_REQ_MASK_MASK  (0x4U)\r\n#define APU_IHB_WKUP_MASK_IHB_CLK_REQ_MASK_SHIFT (2U)\r\n/*! IHB_CLK_REQ_MASK - IHB Clock Request Mask */\r\n#define APU_IHB_WKUP_MASK_IHB_CLK_REQ_MASK(x)    (((uint32_t)(((uint32_t)(x)) << APU_IHB_WKUP_MASK_IHB_CLK_REQ_MASK_SHIFT)) & APU_IHB_WKUP_MASK_IHB_CLK_REQ_MASK_MASK)\r\n\r\n#define APU_IHB_WKUP_MASK_IHB_WL_WKUP_REQ_MASK_MASK (0x8U)\r\n#define APU_IHB_WKUP_MASK_IHB_WL_WKUP_REQ_MASK_SHIFT (3U)\r\n/*! IHB_WL_WKUP_REQ_MASK - IHB WLAN Wakeup Request Mask */\r\n#define APU_IHB_WKUP_MASK_IHB_WL_WKUP_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_IHB_WKUP_MASK_IHB_WL_WKUP_REQ_MASK_SHIFT)) & APU_IHB_WKUP_MASK_IHB_WL_WKUP_REQ_MASK_MASK)\r\n\r\n#define APU_IHB_WKUP_MASK_CPU1_IHB_PMU_WKUP_MASK_MASK (0x10U)\r\n#define APU_IHB_WKUP_MASK_CPU1_IHB_PMU_WKUP_MASK_SHIFT (4U)\r\n/*! CPU1_IHB_PMU_WKUP_MASK - CPU1 IHB PMU Wakeup Mask */\r\n#define APU_IHB_WKUP_MASK_CPU1_IHB_PMU_WKUP_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_IHB_WKUP_MASK_CPU1_IHB_PMU_WKUP_MASK_SHIFT)) & APU_IHB_WKUP_MASK_CPU1_IHB_PMU_WKUP_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_IHB_WKUP_MASK - CPU2 IHB Wakeup Mask */\r\n/*! @{ */\r\n\r\n#define APU_CPU2_IHB_WKUP_MASK_CPU2_IHB_PMU_WKUP_MASK_MASK (0x1U)\r\n#define APU_CPU2_IHB_WKUP_MASK_CPU2_IHB_PMU_WKUP_MASK_SHIFT (0U)\r\n/*! CPU2_IHB_PMU_WKUP_MASK - CPU2 IHB PMU Wakeup Mask */\r\n#define APU_CPU2_IHB_WKUP_MASK_CPU2_IHB_PMU_WKUP_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU2_IHB_WKUP_MASK_CPU2_IHB_PMU_WKUP_MASK_SHIFT)) & APU_CPU2_IHB_WKUP_MASK_CPU2_IHB_PMU_WKUP_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name IHB_STATUS - IHB Status */\r\n/*! @{ */\r\n\r\n#define APU_IHB_STATUS_IHB_STATUS_MASK           (0xFFFFFFFFU)\r\n#define APU_IHB_STATUS_IHB_STATUS_SHIFT          (0U)\r\n/*! IHB_STATUS - IHB Status */\r\n#define APU_IHB_STATUS_IHB_STATUS(x)             (((uint32_t)(((uint32_t)(x)) << APU_IHB_STATUS_IHB_STATUS_SHIFT)) & APU_IHB_STATUS_IHB_STATUS_MASK)\r\n/*! @} */\r\n\r\n/*! @name USB_CTRL - USB Control */\r\n/*! @{ */\r\n\r\n#define APU_USB_CTRL_USB_PWR_DWN_MASK_MASK       (0x1U)\r\n#define APU_USB_CTRL_USB_PWR_DWN_MASK_SHIFT      (0U)\r\n/*! USB_PWR_DWN_MASK - USB Power Down Mask */\r\n#define APU_USB_CTRL_USB_PWR_DWN_MASK(x)         (((uint32_t)(((uint32_t)(x)) << APU_USB_CTRL_USB_PWR_DWN_MASK_SHIFT)) & APU_USB_CTRL_USB_PWR_DWN_MASK_MASK)\r\n\r\n#define APU_USB_CTRL_USE_CLK_SEL_ACK_AS_USB_PWR_DWN_MASK (0x10U)\r\n#define APU_USB_CTRL_USE_CLK_SEL_ACK_AS_USB_PWR_DWN_SHIFT (4U)\r\n/*! USE_CLK_SEL_ACK_AS_USB_PWR_DWN - Use Clock Select Ack as USB Power Down */\r\n#define APU_USB_CTRL_USE_CLK_SEL_ACK_AS_USB_PWR_DWN(x) (((uint32_t)(((uint32_t)(x)) << APU_USB_CTRL_USE_CLK_SEL_ACK_AS_USB_PWR_DWN_SHIFT)) & APU_USB_CTRL_USE_CLK_SEL_ACK_AS_USB_PWR_DWN_MASK)\r\n\r\n#define APU_USB_CTRL_IDLE2ISO_DLY_EN_MASK        (0x20U)\r\n#define APU_USB_CTRL_IDLE2ISO_DLY_EN_SHIFT       (5U)\r\n/*! IDLE2ISO_DLY_EN - USB FSM state counter enable. When set to 1, use usb_pwr_ctrl_dly and usb_pwr_ctrl_dly2. When set to 0, no delay */\r\n#define APU_USB_CTRL_IDLE2ISO_DLY_EN(x)          (((uint32_t)(((uint32_t)(x)) << APU_USB_CTRL_IDLE2ISO_DLY_EN_SHIFT)) & APU_USB_CTRL_IDLE2ISO_DLY_EN_MASK)\r\n\r\n#define APU_USB_CTRL_USB_USE_NOM_PWR_BYP_MASK    (0x200U)\r\n#define APU_USB_CTRL_USB_USE_NOM_PWR_BYP_SHIFT   (9U)\r\n/*! USB_USE_NOM_PWR_BYP - USB Use Nominal Power Bypass */\r\n#define APU_USB_CTRL_USB_USE_NOM_PWR_BYP(x)      (((uint32_t)(((uint32_t)(x)) << APU_USB_CTRL_USB_USE_NOM_PWR_BYP_SHIFT)) & APU_USB_CTRL_USB_USE_NOM_PWR_BYP_MASK)\r\n\r\n#define APU_USB_CTRL_FW_FORCE_USB_PWRUP_MASK     (0x1000000U)\r\n#define APU_USB_CTRL_FW_FORCE_USB_PWRUP_SHIFT    (24U)\r\n/*! FW_FORCE_USB_PWRUP - FW Force USB Powerup */\r\n#define APU_USB_CTRL_FW_FORCE_USB_PWRUP(x)       (((uint32_t)(((uint32_t)(x)) << APU_USB_CTRL_FW_FORCE_USB_PWRUP_SHIFT)) & APU_USB_CTRL_FW_FORCE_USB_PWRUP_MASK)\r\n\r\n#define APU_USB_CTRL_USB_USE_UNSYNC_VOL_LVL_MASK (0x2000000U)\r\n#define APU_USB_CTRL_USB_USE_UNSYNC_VOL_LVL_SHIFT (25U)\r\n/*! USB_USE_UNSYNC_VOL_LVL - USB Use Unsync Vol Level */\r\n#define APU_USB_CTRL_USB_USE_UNSYNC_VOL_LVL(x)   (((uint32_t)(((uint32_t)(x)) << APU_USB_CTRL_USB_USE_UNSYNC_VOL_LVL_SHIFT)) & APU_USB_CTRL_USB_USE_UNSYNC_VOL_LVL_MASK)\r\n\r\n#define APU_USB_CTRL_USB_CLK_SEL_ACK_EXT_EN_MASK (0x80000000U)\r\n#define APU_USB_CTRL_USB_CLK_SEL_ACK_EXT_EN_SHIFT (31U)\r\n/*! USB_CLK_SEL_ACK_EXT_EN - USB Clock Select Ack Ext Enable */\r\n#define APU_USB_CTRL_USB_CLK_SEL_ACK_EXT_EN(x)   (((uint32_t)(((uint32_t)(x)) << APU_USB_CTRL_USB_CLK_SEL_ACK_EXT_EN_SHIFT)) & APU_USB_CTRL_USB_CLK_SEL_ACK_EXT_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name USB_WKUP_MASK - USB Wakeup Mask */\r\n/*! @{ */\r\n\r\n#define APU_USB_WKUP_MASK_USB_P_REQ_MASK_MASK    (0x1U)\r\n#define APU_USB_WKUP_MASK_USB_P_REQ_MASK_SHIFT   (0U)\r\n/*! USB_P_REQ_MASK - USB P Request Mask */\r\n#define APU_USB_WKUP_MASK_USB_P_REQ_MASK(x)      (((uint32_t)(((uint32_t)(x)) << APU_USB_WKUP_MASK_USB_P_REQ_MASK_SHIFT)) & APU_USB_WKUP_MASK_USB_P_REQ_MASK_MASK)\r\n\r\n#define APU_USB_WKUP_MASK_USB_AXI_CLK_REQ_MASK_MASK (0x2U)\r\n#define APU_USB_WKUP_MASK_USB_AXI_CLK_REQ_MASK_SHIFT (1U)\r\n/*! USB_AXI_CLK_REQ_MASK - USB AXI Clock Request Mask */\r\n#define APU_USB_WKUP_MASK_USB_AXI_CLK_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_USB_WKUP_MASK_USB_AXI_CLK_REQ_MASK_SHIFT)) & APU_USB_WKUP_MASK_USB_AXI_CLK_REQ_MASK_MASK)\r\n\r\n#define APU_USB_WKUP_MASK_USB_CLK_SEL_REQ_MASK_MASK (0x4U)\r\n#define APU_USB_WKUP_MASK_USB_CLK_SEL_REQ_MASK_SHIFT (2U)\r\n/*! USB_CLK_SEL_REQ_MASK - USB Clock Select Request Mask */\r\n#define APU_USB_WKUP_MASK_USB_CLK_SEL_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_USB_WKUP_MASK_USB_CLK_SEL_REQ_MASK_SHIFT)) & APU_USB_WKUP_MASK_USB_CLK_SEL_REQ_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name USB_STATUS - USB Status */\r\n/*! @{ */\r\n\r\n#define APU_USB_STATUS_USB_P_REQ_MASK            (0x1U)\r\n#define APU_USB_STATUS_USB_P_REQ_SHIFT           (0U)\r\n/*! USB_P_REQ - USB P Request */\r\n#define APU_USB_STATUS_USB_P_REQ(x)              (((uint32_t)(((uint32_t)(x)) << APU_USB_STATUS_USB_P_REQ_SHIFT)) & APU_USB_STATUS_USB_P_REQ_MASK)\r\n\r\n#define APU_USB_STATUS_APU_USB_P_ACK_MASK        (0x2U)\r\n#define APU_USB_STATUS_APU_USB_P_ACK_SHIFT       (1U)\r\n/*! APU_USB_P_ACK - APU USB P Ack */\r\n#define APU_USB_STATUS_APU_USB_P_ACK(x)          (((uint32_t)(((uint32_t)(x)) << APU_USB_STATUS_APU_USB_P_ACK_SHIFT)) & APU_USB_STATUS_APU_USB_P_ACK_MASK)\r\n\r\n#define APU_USB_STATUS_USB_CLK_SEL_REQ_MASK      (0x4U)\r\n#define APU_USB_STATUS_USB_CLK_SEL_REQ_SHIFT     (2U)\r\n/*! USB_CLK_SEL_REQ - USB Clock Select Request */\r\n#define APU_USB_STATUS_USB_CLK_SEL_REQ(x)        (((uint32_t)(((uint32_t)(x)) << APU_USB_STATUS_USB_CLK_SEL_REQ_SHIFT)) & APU_USB_STATUS_USB_CLK_SEL_REQ_MASK)\r\n\r\n#define APU_USB_STATUS_APU_USB_CLK_SEL_ACK_MASK  (0x8U)\r\n#define APU_USB_STATUS_APU_USB_CLK_SEL_ACK_SHIFT (3U)\r\n/*! APU_USB_CLK_SEL_ACK - APU USB Clock Select Ack */\r\n#define APU_USB_STATUS_APU_USB_CLK_SEL_ACK(x)    (((uint32_t)(((uint32_t)(x)) << APU_USB_STATUS_APU_USB_CLK_SEL_ACK_SHIFT)) & APU_USB_STATUS_APU_USB_CLK_SEL_ACK_MASK)\r\n\r\n#define APU_USB_STATUS_USB_AXI_CLK_REQ_MASK      (0x10U)\r\n#define APU_USB_STATUS_USB_AXI_CLK_REQ_SHIFT     (4U)\r\n/*! USB_AXI_CLK_REQ - USB AXI Clock Request */\r\n#define APU_USB_STATUS_USB_AXI_CLK_REQ(x)        (((uint32_t)(((uint32_t)(x)) << APU_USB_STATUS_USB_AXI_CLK_REQ_SHIFT)) & APU_USB_STATUS_USB_AXI_CLK_REQ_MASK)\r\n\r\n#define APU_USB_STATUS_APU_USB_AXI_CLK_ACK_MASK  (0x20U)\r\n#define APU_USB_STATUS_APU_USB_AXI_CLK_ACK_SHIFT (5U)\r\n/*! APU_USB_AXI_CLK_ACK - APU USB AXI Clock Ack */\r\n#define APU_USB_STATUS_APU_USB_AXI_CLK_ACK(x)    (((uint32_t)(((uint32_t)(x)) << APU_USB_STATUS_APU_USB_AXI_CLK_ACK_SHIFT)) & APU_USB_STATUS_APU_USB_AXI_CLK_ACK_MASK)\r\n\r\n#define APU_USB_STATUS_SOC_PWR_RDY_MASK          (0x40U)\r\n#define APU_USB_STATUS_SOC_PWR_RDY_SHIFT         (6U)\r\n/*! SOC_PWR_RDY - SOC Power Ready */\r\n#define APU_USB_STATUS_SOC_PWR_RDY(x)            (((uint32_t)(((uint32_t)(x)) << APU_USB_STATUS_SOC_PWR_RDY_SHIFT)) & APU_USB_STATUS_SOC_PWR_RDY_MASK)\r\n\r\n#define APU_USB_STATUS_APU_USB_SWITCH_PD_MASK    (0x80U)\r\n#define APU_USB_STATUS_APU_USB_SWITCH_PD_SHIFT   (7U)\r\n/*! APU_USB_SWITCH_PD - APU USB Switch Power Down */\r\n#define APU_USB_STATUS_APU_USB_SWITCH_PD(x)      (((uint32_t)(((uint32_t)(x)) << APU_USB_STATUS_APU_USB_SWITCH_PD_SHIFT)) & APU_USB_STATUS_APU_USB_SWITCH_PD_MASK)\r\n\r\n#define APU_USB_STATUS_USB_CLK_SEL_ACK_EXT_EN_MASK (0x100U)\r\n#define APU_USB_STATUS_USB_CLK_SEL_ACK_EXT_EN_SHIFT (8U)\r\n/*! USB_CLK_SEL_ACK_EXT_EN - extension enable for the usb_clk_sel_ack */\r\n#define APU_USB_STATUS_USB_CLK_SEL_ACK_EXT_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_USB_STATUS_USB_CLK_SEL_ACK_EXT_EN_SHIFT)) & APU_USB_STATUS_USB_CLK_SEL_ACK_EXT_EN_MASK)\r\n\r\n#define APU_USB_STATUS_APU_USB_AXI_CLK_EN_MASK   (0x200U)\r\n#define APU_USB_STATUS_APU_USB_AXI_CLK_EN_SHIFT  (9U)\r\n/*! APU_USB_AXI_CLK_EN - APU USB AXI Clock Enable */\r\n#define APU_USB_STATUS_APU_USB_AXI_CLK_EN(x)     (((uint32_t)(((uint32_t)(x)) << APU_USB_STATUS_APU_USB_AXI_CLK_EN_SHIFT)) & APU_USB_STATUS_APU_USB_AXI_CLK_EN_MASK)\r\n\r\n#define APU_USB_STATUS_XOSC_STABLE_REFCK_MASK    (0x400U)\r\n#define APU_USB_STATUS_XOSC_STABLE_REFCK_SHIFT   (10U)\r\n/*! XOSC_STABLE_REFCK - OSC clock stable on ref clock domain */\r\n#define APU_USB_STATUS_XOSC_STABLE_REFCK(x)      (((uint32_t)(((uint32_t)(x)) << APU_USB_STATUS_XOSC_STABLE_REFCK_SHIFT)) & APU_USB_STATUS_XOSC_STABLE_REFCK_MASK)\r\n\r\n#define APU_USB_STATUS_APU_USB_CLK_SEL_MASK      (0x800U)\r\n#define APU_USB_STATUS_APU_USB_CLK_SEL_SHIFT     (11U)\r\n/*! APU_USB_CLK_SEL - APU USB Clock Select */\r\n#define APU_USB_STATUS_APU_USB_CLK_SEL(x)        (((uint32_t)(((uint32_t)(x)) << APU_USB_STATUS_APU_USB_CLK_SEL_SHIFT)) & APU_USB_STATUS_APU_USB_CLK_SEL_MASK)\r\n\r\n#define APU_USB_STATUS_USB_VOL_LVL_REACHED_MASK  (0x1000U)\r\n#define APU_USB_STATUS_USB_VOL_LVL_REACHED_SHIFT (12U)\r\n/*! USB_VOL_LVL_REACHED - USB Vol Level Reached */\r\n#define APU_USB_STATUS_USB_VOL_LVL_REACHED(x)    (((uint32_t)(((uint32_t)(x)) << APU_USB_STATUS_USB_VOL_LVL_REACHED_SHIFT)) & APU_USB_STATUS_USB_VOL_LVL_REACHED_MASK)\r\n\r\n#define APU_USB_STATUS_DVFS_NOM_VOL_LVL_REACHED_MASK (0x2000U)\r\n#define APU_USB_STATUS_DVFS_NOM_VOL_LVL_REACHED_SHIFT (13U)\r\n/*! DVFS_NOM_VOL_LVL_REACHED - DVFS Nominal Vol Level Reached */\r\n#define APU_USB_STATUS_DVFS_NOM_VOL_LVL_REACHED(x) (((uint32_t)(((uint32_t)(x)) << APU_USB_STATUS_DVFS_NOM_VOL_LVL_REACHED_SHIFT)) & APU_USB_STATUS_DVFS_NOM_VOL_LVL_REACHED_MASK)\r\n\r\n#define APU_USB_STATUS_DVFS_USB_VOL_LVL_REACHED_MASK (0x4000U)\r\n#define APU_USB_STATUS_DVFS_USB_VOL_LVL_REACHED_SHIFT (14U)\r\n/*! DVFS_USB_VOL_LVL_REACHED - DVFS USB Vol Level Reached */\r\n#define APU_USB_STATUS_DVFS_USB_VOL_LVL_REACHED(x) (((uint32_t)(((uint32_t)(x)) << APU_USB_STATUS_DVFS_USB_VOL_LVL_REACHED_SHIFT)) & APU_USB_STATUS_DVFS_USB_VOL_LVL_REACHED_MASK)\r\n\r\n#define APU_USB_STATUS_USB_PWR_DWN_MASK          (0x8000U)\r\n#define APU_USB_STATUS_USB_PWR_DWN_SHIFT         (15U)\r\n/*! USB_PWR_DWN - USB Power Down */\r\n#define APU_USB_STATUS_USB_PWR_DWN(x)            (((uint32_t)(((uint32_t)(x)) << APU_USB_STATUS_USB_PWR_DWN_SHIFT)) & APU_USB_STATUS_USB_PWR_DWN_MASK)\r\n\r\n#define APU_USB_STATUS_APU_USB_ST_MASK           (0xF0000U)\r\n#define APU_USB_STATUS_APU_USB_ST_SHIFT          (16U)\r\n/*! APU_USB_ST - APU USB St */\r\n#define APU_USB_STATUS_APU_USB_ST(x)             (((uint32_t)(((uint32_t)(x)) << APU_USB_STATUS_APU_USB_ST_SHIFT)) & APU_USB_STATUS_APU_USB_ST_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU1_DVFS_CTRL - CPU1 DVFS Control */\r\n/*! @{ */\r\n\r\n#define APU_CPU1_DVFS_CTRL_CPU1_ACTIVE_INDEX_MASK (0xFU)\r\n#define APU_CPU1_DVFS_CTRL_CPU1_ACTIVE_INDEX_SHIFT (0U)\r\n/*! CPU1_ACTIVE_INDEX - CPU1 Active Index */\r\n#define APU_CPU1_DVFS_CTRL_CPU1_ACTIVE_INDEX(x)  (((uint32_t)(((uint32_t)(x)) << APU_CPU1_DVFS_CTRL_CPU1_ACTIVE_INDEX_SHIFT)) & APU_CPU1_DVFS_CTRL_CPU1_ACTIVE_INDEX_MASK)\r\n\r\n#define APU_CPU1_DVFS_CTRL_CPU1_INACTIVE_INDEX_MASK (0xF0U)\r\n#define APU_CPU1_DVFS_CTRL_CPU1_INACTIVE_INDEX_SHIFT (4U)\r\n/*! CPU1_INACTIVE_INDEX - CPU1 Inactive Index */\r\n#define APU_CPU1_DVFS_CTRL_CPU1_INACTIVE_INDEX(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU1_DVFS_CTRL_CPU1_INACTIVE_INDEX_SHIFT)) & APU_CPU1_DVFS_CTRL_CPU1_INACTIVE_INDEX_MASK)\r\n\r\n#define APU_CPU1_DVFS_CTRL_CPU1_ACTIVE_SYS_INDEX_MASK (0xF00U)\r\n#define APU_CPU1_DVFS_CTRL_CPU1_ACTIVE_SYS_INDEX_SHIFT (8U)\r\n/*! CPU1_ACTIVE_SYS_INDEX - CPU1 Active System Index */\r\n#define APU_CPU1_DVFS_CTRL_CPU1_ACTIVE_SYS_INDEX(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU1_DVFS_CTRL_CPU1_ACTIVE_SYS_INDEX_SHIFT)) & APU_CPU1_DVFS_CTRL_CPU1_ACTIVE_SYS_INDEX_MASK)\r\n\r\n#define APU_CPU1_DVFS_CTRL_CPU1_INACTIVE_SYS_INDEX_MASK (0xF000U)\r\n#define APU_CPU1_DVFS_CTRL_CPU1_INACTIVE_SYS_INDEX_SHIFT (12U)\r\n/*! CPU1_INACTIVE_SYS_INDEX - CPU1 Inactive System Index */\r\n#define APU_CPU1_DVFS_CTRL_CPU1_INACTIVE_SYS_INDEX(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU1_DVFS_CTRL_CPU1_INACTIVE_SYS_INDEX_SHIFT)) & APU_CPU1_DVFS_CTRL_CPU1_INACTIVE_SYS_INDEX_MASK)\r\n\r\n#define APU_CPU1_DVFS_CTRL_CPU1_ACTIVE_AHB1_INDEX_MASK (0xF0000U)\r\n#define APU_CPU1_DVFS_CTRL_CPU1_ACTIVE_AHB1_INDEX_SHIFT (16U)\r\n/*! CPU1_ACTIVE_AHB1_INDEX - CPU1 Active AHB1 Index */\r\n#define APU_CPU1_DVFS_CTRL_CPU1_ACTIVE_AHB1_INDEX(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU1_DVFS_CTRL_CPU1_ACTIVE_AHB1_INDEX_SHIFT)) & APU_CPU1_DVFS_CTRL_CPU1_ACTIVE_AHB1_INDEX_MASK)\r\n\r\n#define APU_CPU1_DVFS_CTRL_CPU1_INACTIVE_AHB1_INDEX_MASK (0xF00000U)\r\n#define APU_CPU1_DVFS_CTRL_CPU1_INACTIVE_AHB1_INDEX_SHIFT (20U)\r\n/*! CPU1_INACTIVE_AHB1_INDEX - CPU1 Inactive AHB1 Index */\r\n#define APU_CPU1_DVFS_CTRL_CPU1_INACTIVE_AHB1_INDEX(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU1_DVFS_CTRL_CPU1_INACTIVE_AHB1_INDEX_SHIFT)) & APU_CPU1_DVFS_CTRL_CPU1_INACTIVE_AHB1_INDEX_MASK)\r\n\r\n#define APU_CPU1_DVFS_CTRL_PCIE_VOL_HOST_WKUP_DEP_MASK (0x20000000U)\r\n#define APU_CPU1_DVFS_CTRL_PCIE_VOL_HOST_WKUP_DEP_SHIFT (29U)\r\n/*! PCIE_VOL_HOST_WKUP_DEP - PCIe Vol Host Wakeup Dep */\r\n#define APU_CPU1_DVFS_CTRL_PCIE_VOL_HOST_WKUP_DEP(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU1_DVFS_CTRL_PCIE_VOL_HOST_WKUP_DEP_SHIFT)) & APU_CPU1_DVFS_CTRL_PCIE_VOL_HOST_WKUP_DEP_MASK)\r\n\r\n#define APU_CPU1_DVFS_CTRL_PCIE_VOL_FLR_DEP_MASK (0x40000000U)\r\n#define APU_CPU1_DVFS_CTRL_PCIE_VOL_FLR_DEP_SHIFT (30U)\r\n/*! PCIE_VOL_FLR_DEP - PCIe Vol Flr Dep */\r\n#define APU_CPU1_DVFS_CTRL_PCIE_VOL_FLR_DEP(x)   (((uint32_t)(((uint32_t)(x)) << APU_CPU1_DVFS_CTRL_PCIE_VOL_FLR_DEP_SHIFT)) & APU_CPU1_DVFS_CTRL_PCIE_VOL_FLR_DEP_MASK)\r\n\r\n#define APU_CPU1_DVFS_CTRL_PCIE_VOL_HOST_SLP_DEP_MASK (0x80000000U)\r\n#define APU_CPU1_DVFS_CTRL_PCIE_VOL_HOST_SLP_DEP_SHIFT (31U)\r\n/*! PCIE_VOL_HOST_SLP_DEP - PCIe Vol Host Sleep Dep */\r\n#define APU_CPU1_DVFS_CTRL_PCIE_VOL_HOST_SLP_DEP(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU1_DVFS_CTRL_PCIE_VOL_HOST_SLP_DEP_SHIFT)) & APU_CPU1_DVFS_CTRL_PCIE_VOL_HOST_SLP_DEP_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU1_FREQ_REG1 - CPU1 Frequency 1 */\r\n/*! @{ */\r\n\r\n#define APU_CPU1_FREQ_REG1_CPU1_FREQ_REG1_MASK   (0xFFFFFFFFU)\r\n#define APU_CPU1_FREQ_REG1_CPU1_FREQ_REG1_SHIFT  (0U)\r\n/*! CPU1_FREQ_REG1 - CPU1 Frequency 1 */\r\n#define APU_CPU1_FREQ_REG1_CPU1_FREQ_REG1(x)     (((uint32_t)(((uint32_t)(x)) << APU_CPU1_FREQ_REG1_CPU1_FREQ_REG1_SHIFT)) & APU_CPU1_FREQ_REG1_CPU1_FREQ_REG1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU1_FREQ_REG2 - CPU1 Frequency 2 */\r\n/*! @{ */\r\n\r\n#define APU_CPU1_FREQ_REG2_CPU1_FREQ_REG2_MASK   (0xFFFFFFFFU)\r\n#define APU_CPU1_FREQ_REG2_CPU1_FREQ_REG2_SHIFT  (0U)\r\n/*! CPU1_FREQ_REG2 - CPU1 Frequency 2 */\r\n#define APU_CPU1_FREQ_REG2_CPU1_FREQ_REG2(x)     (((uint32_t)(((uint32_t)(x)) << APU_CPU1_FREQ_REG2_CPU1_FREQ_REG2_SHIFT)) & APU_CPU1_FREQ_REG2_CPU1_FREQ_REG2_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU1_PLL_EN_REG - CPU1 PLL Enable */\r\n/*! @{ */\r\n\r\n#define APU_CPU1_PLL_EN_REG_CPU1_PLL_EN_REG_MASK (0xFFFFFFFFU)\r\n#define APU_CPU1_PLL_EN_REG_CPU1_PLL_EN_REG_SHIFT (0U)\r\n/*! CPU1_PLL_EN_REG - CPU1 PLL Enable */\r\n#define APU_CPU1_PLL_EN_REG_CPU1_PLL_EN_REG(x)   (((uint32_t)(((uint32_t)(x)) << APU_CPU1_PLL_EN_REG_CPU1_PLL_EN_REG_SHIFT)) & APU_CPU1_PLL_EN_REG_CPU1_PLL_EN_REG_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU1_VOL_REG1 - CPU1 Voltage 1 */\r\n/*! @{ */\r\n\r\n#define APU_CPU1_VOL_REG1_CPU1_VOL_REG1_MASK     (0xFFFFFFFFU)\r\n#define APU_CPU1_VOL_REG1_CPU1_VOL_REG1_SHIFT    (0U)\r\n/*! CPU1_VOL_REG1 - CPU1 Voltage 1 */\r\n#define APU_CPU1_VOL_REG1_CPU1_VOL_REG1(x)       (((uint32_t)(((uint32_t)(x)) << APU_CPU1_VOL_REG1_CPU1_VOL_REG1_SHIFT)) & APU_CPU1_VOL_REG1_CPU1_VOL_REG1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU1_VOL_REG2 - CPU1 Voltage 2 */\r\n/*! @{ */\r\n\r\n#define APU_CPU1_VOL_REG2_CPU1_VOL_REG2_MASK     (0xFFFFFFFFU)\r\n#define APU_CPU1_VOL_REG2_CPU1_VOL_REG2_SHIFT    (0U)\r\n/*! CPU1_VOL_REG2 - CPU1 Voltage 2 */\r\n#define APU_CPU1_VOL_REG2_CPU1_VOL_REG2(x)       (((uint32_t)(((uint32_t)(x)) << APU_CPU1_VOL_REG2_CPU1_VOL_REG2_SHIFT)) & APU_CPU1_VOL_REG2_CPU1_VOL_REG2_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU1_VOL_REG3 - CPU1 Voltage 3 */\r\n/*! @{ */\r\n\r\n#define APU_CPU1_VOL_REG3_CPU1_VOL_REG3_MASK     (0xFFFFFFFFU)\r\n#define APU_CPU1_VOL_REG3_CPU1_VOL_REG3_SHIFT    (0U)\r\n/*! CPU1_VOL_REG3 - CPU1 Voltage 3 */\r\n#define APU_CPU1_VOL_REG3_CPU1_VOL_REG3(x)       (((uint32_t)(((uint32_t)(x)) << APU_CPU1_VOL_REG3_CPU1_VOL_REG3_SHIFT)) & APU_CPU1_VOL_REG3_CPU1_VOL_REG3_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU1_VOL_REG4 - CPU1 Voltage 4 */\r\n/*! @{ */\r\n\r\n#define APU_CPU1_VOL_REG4_CPU1_VOL_REG4_MASK     (0xFFFFFFFFU)\r\n#define APU_CPU1_VOL_REG4_CPU1_VOL_REG4_SHIFT    (0U)\r\n/*! CPU1_VOL_REG4 - CPU1 Voltage 4 */\r\n#define APU_CPU1_VOL_REG4_CPU1_VOL_REG4(x)       (((uint32_t)(((uint32_t)(x)) << APU_CPU1_VOL_REG4_CPU1_VOL_REG4_SHIFT)) & APU_CPU1_VOL_REG4_CPU1_VOL_REG4_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_DVFS_CTRL - CPU2 DVFS Control */\r\n/*! @{ */\r\n\r\n#define APU_CPU2_DVFS_CTRL_CPU2_ACTIVE_INDEX_MASK (0xFU)\r\n#define APU_CPU2_DVFS_CTRL_CPU2_ACTIVE_INDEX_SHIFT (0U)\r\n/*! CPU2_ACTIVE_INDEX - CPU2 Active Index */\r\n#define APU_CPU2_DVFS_CTRL_CPU2_ACTIVE_INDEX(x)  (((uint32_t)(((uint32_t)(x)) << APU_CPU2_DVFS_CTRL_CPU2_ACTIVE_INDEX_SHIFT)) & APU_CPU2_DVFS_CTRL_CPU2_ACTIVE_INDEX_MASK)\r\n\r\n#define APU_CPU2_DVFS_CTRL_CPU2_INACTIVE_INDEX_MASK (0xF0U)\r\n#define APU_CPU2_DVFS_CTRL_CPU2_INACTIVE_INDEX_SHIFT (4U)\r\n/*! CPU2_INACTIVE_INDEX - CPU2 Inactive Index */\r\n#define APU_CPU2_DVFS_CTRL_CPU2_INACTIVE_INDEX(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU2_DVFS_CTRL_CPU2_INACTIVE_INDEX_SHIFT)) & APU_CPU2_DVFS_CTRL_CPU2_INACTIVE_INDEX_MASK)\r\n\r\n#define APU_CPU2_DVFS_CTRL_CPU2_ACTIVE_SYS_INDEX_MASK (0xF00U)\r\n#define APU_CPU2_DVFS_CTRL_CPU2_ACTIVE_SYS_INDEX_SHIFT (8U)\r\n/*! CPU2_ACTIVE_SYS_INDEX - CPU2 Active System Index */\r\n#define APU_CPU2_DVFS_CTRL_CPU2_ACTIVE_SYS_INDEX(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU2_DVFS_CTRL_CPU2_ACTIVE_SYS_INDEX_SHIFT)) & APU_CPU2_DVFS_CTRL_CPU2_ACTIVE_SYS_INDEX_MASK)\r\n\r\n#define APU_CPU2_DVFS_CTRL_CPU2_INACTIVE_SYS_INDEX_MASK (0xF000U)\r\n#define APU_CPU2_DVFS_CTRL_CPU2_INACTIVE_SYS_INDEX_SHIFT (12U)\r\n/*! CPU2_INACTIVE_SYS_INDEX - CPU2 Inactive System Index */\r\n#define APU_CPU2_DVFS_CTRL_CPU2_INACTIVE_SYS_INDEX(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU2_DVFS_CTRL_CPU2_INACTIVE_SYS_INDEX_SHIFT)) & APU_CPU2_DVFS_CTRL_CPU2_INACTIVE_SYS_INDEX_MASK)\r\n\r\n#define APU_CPU2_DVFS_CTRL_CPU2_ACTIVE_AHB1_INDEX_MASK (0xF0000U)\r\n#define APU_CPU2_DVFS_CTRL_CPU2_ACTIVE_AHB1_INDEX_SHIFT (16U)\r\n/*! CPU2_ACTIVE_AHB1_INDEX - CPU2 Active AHB1 Index */\r\n#define APU_CPU2_DVFS_CTRL_CPU2_ACTIVE_AHB1_INDEX(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU2_DVFS_CTRL_CPU2_ACTIVE_AHB1_INDEX_SHIFT)) & APU_CPU2_DVFS_CTRL_CPU2_ACTIVE_AHB1_INDEX_MASK)\r\n\r\n#define APU_CPU2_DVFS_CTRL_CPU2_INACTIVE_AHB1_INDEX_MASK (0xF00000U)\r\n#define APU_CPU2_DVFS_CTRL_CPU2_INACTIVE_AHB1_INDEX_SHIFT (20U)\r\n/*! CPU2_INACTIVE_AHB1_INDEX - CPU2 Inactive AHB1 Index */\r\n#define APU_CPU2_DVFS_CTRL_CPU2_INACTIVE_AHB1_INDEX(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU2_DVFS_CTRL_CPU2_INACTIVE_AHB1_INDEX_SHIFT)) & APU_CPU2_DVFS_CTRL_CPU2_INACTIVE_AHB1_INDEX_MASK)\r\n\r\n#define APU_CPU2_DVFS_CTRL_CPU2_AHB1_INDEX_SEL_METHOD_MASK (0x1000000U)\r\n#define APU_CPU2_DVFS_CTRL_CPU2_AHB1_INDEX_SEL_METHOD_SHIFT (24U)\r\n/*! CPU2_AHB1_INDEX_SEL_METHOD - CPU2 AHB1 index select method */\r\n#define APU_CPU2_DVFS_CTRL_CPU2_AHB1_INDEX_SEL_METHOD(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU2_DVFS_CTRL_CPU2_AHB1_INDEX_SEL_METHOD_SHIFT)) & APU_CPU2_DVFS_CTRL_CPU2_AHB1_INDEX_SEL_METHOD_MASK)\r\n\r\n#define APU_CPU2_DVFS_CTRL_UART_VOL_VAL_MASK     (0xFE000000U)\r\n#define APU_CPU2_DVFS_CTRL_UART_VOL_VAL_SHIFT    (25U)\r\n/*! UART_VOL_VAL - UART Vol Value */\r\n#define APU_CPU2_DVFS_CTRL_UART_VOL_VAL(x)       (((uint32_t)(((uint32_t)(x)) << APU_CPU2_DVFS_CTRL_UART_VOL_VAL_SHIFT)) & APU_CPU2_DVFS_CTRL_UART_VOL_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_FREQ_REG1 - CPU2 Frequency 1 */\r\n/*! @{ */\r\n\r\n#define APU_CPU2_FREQ_REG1_CPU2_FREQ_REG1_MASK   (0xFFFFFFFFU)\r\n#define APU_CPU2_FREQ_REG1_CPU2_FREQ_REG1_SHIFT  (0U)\r\n/*! CPU2_FREQ_REG1 - CPU2 Frequency 1 */\r\n#define APU_CPU2_FREQ_REG1_CPU2_FREQ_REG1(x)     (((uint32_t)(((uint32_t)(x)) << APU_CPU2_FREQ_REG1_CPU2_FREQ_REG1_SHIFT)) & APU_CPU2_FREQ_REG1_CPU2_FREQ_REG1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_FREQ_REG2 - CPU2 Frequency 2 */\r\n/*! @{ */\r\n\r\n#define APU_CPU2_FREQ_REG2_CPU2_FREQ_REG2_MASK   (0xFFFFFFFFU)\r\n#define APU_CPU2_FREQ_REG2_CPU2_FREQ_REG2_SHIFT  (0U)\r\n/*! CPU2_FREQ_REG2 - CPU2Frequency 2 */\r\n#define APU_CPU2_FREQ_REG2_CPU2_FREQ_REG2(x)     (((uint32_t)(((uint32_t)(x)) << APU_CPU2_FREQ_REG2_CPU2_FREQ_REG2_SHIFT)) & APU_CPU2_FREQ_REG2_CPU2_FREQ_REG2_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_PLL_EN_REG - CPU2 PLL Enable */\r\n/*! @{ */\r\n\r\n#define APU_CPU2_PLL_EN_REG_CPU2_PLL_EN_REG_MASK (0xFFFFFFFFU)\r\n#define APU_CPU2_PLL_EN_REG_CPU2_PLL_EN_REG_SHIFT (0U)\r\n/*! CPU2_PLL_EN_REG - CPU2 PLL Enable */\r\n#define APU_CPU2_PLL_EN_REG_CPU2_PLL_EN_REG(x)   (((uint32_t)(((uint32_t)(x)) << APU_CPU2_PLL_EN_REG_CPU2_PLL_EN_REG_SHIFT)) & APU_CPU2_PLL_EN_REG_CPU2_PLL_EN_REG_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_VOL_REG1 - CPU2 Voltage 1 */\r\n/*! @{ */\r\n\r\n#define APU_CPU2_VOL_REG1_CPU2_VOL_REG1_MASK     (0xFFFFFFFFU)\r\n#define APU_CPU2_VOL_REG1_CPU2_VOL_REG1_SHIFT    (0U)\r\n/*! CPU2_VOL_REG1 - CPU2 Voltage 1 */\r\n#define APU_CPU2_VOL_REG1_CPU2_VOL_REG1(x)       (((uint32_t)(((uint32_t)(x)) << APU_CPU2_VOL_REG1_CPU2_VOL_REG1_SHIFT)) & APU_CPU2_VOL_REG1_CPU2_VOL_REG1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_VOL_REG2 - CPU2 Voltage 2 */\r\n/*! @{ */\r\n\r\n#define APU_CPU2_VOL_REG2_CPU2_VOL_REG2_MASK     (0xFFFFFFFFU)\r\n#define APU_CPU2_VOL_REG2_CPU2_VOL_REG2_SHIFT    (0U)\r\n/*! CPU2_VOL_REG2 - CPU2 Voltage 2 */\r\n#define APU_CPU2_VOL_REG2_CPU2_VOL_REG2(x)       (((uint32_t)(((uint32_t)(x)) << APU_CPU2_VOL_REG2_CPU2_VOL_REG2_SHIFT)) & APU_CPU2_VOL_REG2_CPU2_VOL_REG2_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_VOL_REG3 - CPU2 Voltage 3 */\r\n/*! @{ */\r\n\r\n#define APU_CPU2_VOL_REG3_CPU2_VOL_REG3_MASK     (0xFFFFFFFFU)\r\n#define APU_CPU2_VOL_REG3_CPU2_VOL_REG3_SHIFT    (0U)\r\n/*! CPU2_VOL_REG3 - CPU2 Voltage 3 */\r\n#define APU_CPU2_VOL_REG3_CPU2_VOL_REG3(x)       (((uint32_t)(((uint32_t)(x)) << APU_CPU2_VOL_REG3_CPU2_VOL_REG3_SHIFT)) & APU_CPU2_VOL_REG3_CPU2_VOL_REG3_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_VOL_REG4 - CPU2 Voltage 4 */\r\n/*! @{ */\r\n\r\n#define APU_CPU2_VOL_REG4_CPU2_VOL_REG4_MASK     (0xFFFFFFFFU)\r\n#define APU_CPU2_VOL_REG4_CPU2_VOL_REG4_SHIFT    (0U)\r\n/*! CPU2_VOL_REG4 - CPU2 Voltage 4 */\r\n#define APU_CPU2_VOL_REG4_CPU2_VOL_REG4(x)       (((uint32_t)(((uint32_t)(x)) << APU_CPU2_VOL_REG4_CPU2_VOL_REG4_SHIFT)) & APU_CPU2_VOL_REG4_CPU2_VOL_REG4_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYS_FREQ_REG1 - System Frequency 1 */\r\n/*! @{ */\r\n\r\n#define APU_SYS_FREQ_REG1_SYS_FREQ_REG1_MASK     (0xFFFFFFFFU)\r\n#define APU_SYS_FREQ_REG1_SYS_FREQ_REG1_SHIFT    (0U)\r\n/*! SYS_FREQ_REG1 - System Frequency 1 */\r\n#define APU_SYS_FREQ_REG1_SYS_FREQ_REG1(x)       (((uint32_t)(((uint32_t)(x)) << APU_SYS_FREQ_REG1_SYS_FREQ_REG1_SHIFT)) & APU_SYS_FREQ_REG1_SYS_FREQ_REG1_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYS_FREQ_REG2 - System Frequency 2 */\r\n/*! @{ */\r\n\r\n#define APU_SYS_FREQ_REG2_SYS_FREQ_REG2_MASK     (0xFFFFFFFFU)\r\n#define APU_SYS_FREQ_REG2_SYS_FREQ_REG2_SHIFT    (0U)\r\n/*! SYS_FREQ_REG2 - System Frequency 2 */\r\n#define APU_SYS_FREQ_REG2_SYS_FREQ_REG2(x)       (((uint32_t)(((uint32_t)(x)) << APU_SYS_FREQ_REG2_SYS_FREQ_REG2_SHIFT)) & APU_SYS_FREQ_REG2_SYS_FREQ_REG2_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYS_PLL_EN_REG - System PLL Enable */\r\n/*! @{ */\r\n\r\n#define APU_SYS_PLL_EN_REG_SYS_PLL_EN_REG_MASK   (0xFFFFFFFFU)\r\n#define APU_SYS_PLL_EN_REG_SYS_PLL_EN_REG_SHIFT  (0U)\r\n/*! SYS_PLL_EN_REG - System PLL Enable */\r\n#define APU_SYS_PLL_EN_REG_SYS_PLL_EN_REG(x)     (((uint32_t)(((uint32_t)(x)) << APU_SYS_PLL_EN_REG_SYS_PLL_EN_REG_SHIFT)) & APU_SYS_PLL_EN_REG_SYS_PLL_EN_REG_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYS_VOL_REG1 - System Voltage 1 */\r\n/*! @{ */\r\n\r\n#define APU_SYS_VOL_REG1_SYS_VOL_REG1_MASK       (0xFFFFFFFFU)\r\n#define APU_SYS_VOL_REG1_SYS_VOL_REG1_SHIFT      (0U)\r\n/*! SYS_VOL_REG1 - System Voltage 1 */\r\n#define APU_SYS_VOL_REG1_SYS_VOL_REG1(x)         (((uint32_t)(((uint32_t)(x)) << APU_SYS_VOL_REG1_SYS_VOL_REG1_SHIFT)) & APU_SYS_VOL_REG1_SYS_VOL_REG1_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYS_VOL_REG2 - System Voltage 2 */\r\n/*! @{ */\r\n\r\n#define APU_SYS_VOL_REG2_SYS_VOL_REG2_MASK       (0xFFFFFFFFU)\r\n#define APU_SYS_VOL_REG2_SYS_VOL_REG2_SHIFT      (0U)\r\n/*! SYS_VOL_REG2 - System Voltage 2 */\r\n#define APU_SYS_VOL_REG2_SYS_VOL_REG2(x)         (((uint32_t)(((uint32_t)(x)) << APU_SYS_VOL_REG2_SYS_VOL_REG2_SHIFT)) & APU_SYS_VOL_REG2_SYS_VOL_REG2_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYS_VOL_REG3 - System Voltage 3 */\r\n/*! @{ */\r\n\r\n#define APU_SYS_VOL_REG3_SYS_VOL_REG3_MASK       (0xFFFFFFFFU)\r\n#define APU_SYS_VOL_REG3_SYS_VOL_REG3_SHIFT      (0U)\r\n/*! SYS_VOL_REG3 - System Voltage 3 */\r\n#define APU_SYS_VOL_REG3_SYS_VOL_REG3(x)         (((uint32_t)(((uint32_t)(x)) << APU_SYS_VOL_REG3_SYS_VOL_REG3_SHIFT)) & APU_SYS_VOL_REG3_SYS_VOL_REG3_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYS_VOL_REG4 - System Voltage 4 */\r\n/*! @{ */\r\n\r\n#define APU_SYS_VOL_REG4_SYS_VOL_REG4_MASK       (0xFFFFFFFFU)\r\n#define APU_SYS_VOL_REG4_SYS_VOL_REG4_SHIFT      (0U)\r\n/*! SYS_VOL_REG4 - System Voltage 4 */\r\n#define APU_SYS_VOL_REG4_SYS_VOL_REG4(x)         (((uint32_t)(((uint32_t)(x)) << APU_SYS_VOL_REG4_SYS_VOL_REG4_SHIFT)) & APU_SYS_VOL_REG4_SYS_VOL_REG4_MASK)\r\n/*! @} */\r\n\r\n/*! @name DVFS_CTRL - DVFS Control */\r\n/*! @{ */\r\n\r\n#define APU_DVFS_CTRL_DVFS_HOST_VOL_VAL_MASK     (0x7FU)\r\n#define APU_DVFS_CTRL_DVFS_HOST_VOL_VAL_SHIFT    (0U)\r\n/*! DVFS_HOST_VOL_VAL - DVFS Host Vol Value */\r\n#define APU_DVFS_CTRL_DVFS_HOST_VOL_VAL(x)       (((uint32_t)(((uint32_t)(x)) << APU_DVFS_CTRL_DVFS_HOST_VOL_VAL_SHIFT)) & APU_DVFS_CTRL_DVFS_HOST_VOL_VAL_MASK)\r\n\r\n#define APU_DVFS_CTRL_DVFS_EAS_VOL_MASK          (0x3F80U)\r\n#define APU_DVFS_CTRL_DVFS_EAS_VOL_SHIFT         (7U)\r\n/*! DVFS_EAS_VOL - DVFS EAS Vol */\r\n#define APU_DVFS_CTRL_DVFS_EAS_VOL(x)            (((uint32_t)(((uint32_t)(x)) << APU_DVFS_CTRL_DVFS_EAS_VOL_SHIFT)) & APU_DVFS_CTRL_DVFS_EAS_VOL_MASK)\r\n\r\n#define APU_DVFS_CTRL_DVFS_CLK_SWITCH_EN_MASK    (0x4000U)\r\n#define APU_DVFS_CTRL_DVFS_CLK_SWITCH_EN_SHIFT   (14U)\r\n/*! DVFS_CLK_SWITCH_EN - DVFS Clock Switch Enable */\r\n#define APU_DVFS_CTRL_DVFS_CLK_SWITCH_EN(x)      (((uint32_t)(((uint32_t)(x)) << APU_DVFS_CTRL_DVFS_CLK_SWITCH_EN_SHIFT)) & APU_DVFS_CTRL_DVFS_CLK_SWITCH_EN_MASK)\r\n\r\n#define APU_DVFS_CTRL_DVFS_DYN_CLK_EN_MASK       (0x8000U)\r\n#define APU_DVFS_CTRL_DVFS_DYN_CLK_EN_SHIFT      (15U)\r\n/*! DVFS_DYN_CLK_EN - DVFS Dynamic Clock Enable */\r\n#define APU_DVFS_CTRL_DVFS_DYN_CLK_EN(x)         (((uint32_t)(((uint32_t)(x)) << APU_DVFS_CTRL_DVFS_DYN_CLK_EN_SHIFT)) & APU_DVFS_CTRL_DVFS_DYN_CLK_EN_MASK)\r\n\r\n#define APU_DVFS_CTRL_DVFS_MODE_MASK             (0x10000U)\r\n#define APU_DVFS_CTRL_DVFS_MODE_SHIFT            (16U)\r\n/*! DVFS_MODE - DVFS Mode 0: only use partial_dvfs_vol(default) */\r\n#define APU_DVFS_CTRL_DVFS_MODE(x)               (((uint32_t)(((uint32_t)(x)) << APU_DVFS_CTRL_DVFS_MODE_SHIFT)) & APU_DVFS_CTRL_DVFS_MODE_MASK)\r\n\r\n#define APU_DVFS_CTRL_EN_FASTER_DYN_CLK_MASK     (0x20000U)\r\n#define APU_DVFS_CTRL_EN_FASTER_DYN_CLK_SHIFT    (17U)\r\n/*! EN_FASTER_DYN_CLK - Enable Faster Dynamic Clock */\r\n#define APU_DVFS_CTRL_EN_FASTER_DYN_CLK(x)       (((uint32_t)(((uint32_t)(x)) << APU_DVFS_CTRL_EN_FASTER_DYN_CLK_SHIFT)) & APU_DVFS_CTRL_EN_FASTER_DYN_CLK_MASK)\r\n\r\n#define APU_DVFS_CTRL_DVFS_EAS_VOL_DIS_MASK      (0x40000U)\r\n#define APU_DVFS_CTRL_DVFS_EAS_VOL_DIS_SHIFT     (18U)\r\n/*! DVFS_EAS_VOL_DIS - DVFS EAS Vol Disable */\r\n#define APU_DVFS_CTRL_DVFS_EAS_VOL_DIS(x)        (((uint32_t)(((uint32_t)(x)) << APU_DVFS_CTRL_DVFS_EAS_VOL_DIS_SHIFT)) & APU_DVFS_CTRL_DVFS_EAS_VOL_DIS_MASK)\r\n\r\n#define APU_DVFS_CTRL_SW_LOCK_GUARD_DIS_MASK     (0x80000U)\r\n#define APU_DVFS_CTRL_SW_LOCK_GUARD_DIS_SHIFT    (19U)\r\n/*! SW_LOCK_GUARD_DIS - SW Lock Guard Disable */\r\n#define APU_DVFS_CTRL_SW_LOCK_GUARD_DIS(x)       (((uint32_t)(((uint32_t)(x)) << APU_DVFS_CTRL_SW_LOCK_GUARD_DIS_SHIFT)) & APU_DVFS_CTRL_SW_LOCK_GUARD_DIS_MASK)\r\n\r\n#define APU_DVFS_CTRL_EN_FASTER_DVFS_MASK        (0x100000U)\r\n#define APU_DVFS_CTRL_EN_FASTER_DVFS_SHIFT       (20U)\r\n/*! EN_FASTER_DVFS - Enable Faster DVFS */\r\n#define APU_DVFS_CTRL_EN_FASTER_DVFS(x)          (((uint32_t)(((uint32_t)(x)) << APU_DVFS_CTRL_EN_FASTER_DVFS_SHIFT)) & APU_DVFS_CTRL_EN_FASTER_DVFS_MASK)\r\n\r\n#define APU_DVFS_CTRL_UPDATE_BUCK_EN_MASK        (0x200000U)\r\n#define APU_DVFS_CTRL_UPDATE_BUCK_EN_SHIFT       (21U)\r\n/*! UPDATE_BUCK_EN - to enable the forcing buck value when the resolution is not aligned */\r\n#define APU_DVFS_CTRL_UPDATE_BUCK_EN(x)          (((uint32_t)(((uint32_t)(x)) << APU_DVFS_CTRL_UPDATE_BUCK_EN_SHIFT)) & APU_DVFS_CTRL_UPDATE_BUCK_EN_MASK)\r\n\r\n#define APU_DVFS_CTRL_INACTIVE_ACK_EXT_EN_MASK   (0x1000000U)\r\n#define APU_DVFS_CTRL_INACTIVE_ACK_EXT_EN_SHIFT  (24U)\r\n/*! INACTIVE_ACK_EXT_EN - Inactive Ack Ext Enable */\r\n#define APU_DVFS_CTRL_INACTIVE_ACK_EXT_EN(x)     (((uint32_t)(((uint32_t)(x)) << APU_DVFS_CTRL_INACTIVE_ACK_EXT_EN_SHIFT)) & APU_DVFS_CTRL_INACTIVE_ACK_EXT_EN_MASK)\r\n\r\n#define APU_DVFS_CTRL_SDIO_VOL_VAL_MASK          (0xFE000000U)\r\n#define APU_DVFS_CTRL_SDIO_VOL_VAL_SHIFT         (25U)\r\n/*! SDIO_VOL_VAL - SDIO Vol Value */\r\n#define APU_DVFS_CTRL_SDIO_VOL_VAL(x)            (((uint32_t)(((uint32_t)(x)) << APU_DVFS_CTRL_SDIO_VOL_VAL_SHIFT)) & APU_DVFS_CTRL_SDIO_VOL_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name PARTIAL_DVFS_CTRL - Partial DVFS Control */\r\n/*! @{ */\r\n\r\n#define APU_PARTIAL_DVFS_CTRL_PARTIAL_DVFS_VOL_MASK (0x7FU)\r\n#define APU_PARTIAL_DVFS_CTRL_PARTIAL_DVFS_VOL_SHIFT (0U)\r\n/*! PARTIAL_DVFS_VOL - Partial DVFS Vol */\r\n#define APU_PARTIAL_DVFS_CTRL_PARTIAL_DVFS_VOL(x) (((uint32_t)(((uint32_t)(x)) << APU_PARTIAL_DVFS_CTRL_PARTIAL_DVFS_VOL_SHIFT)) & APU_PARTIAL_DVFS_CTRL_PARTIAL_DVFS_VOL_MASK)\r\n\r\n#define APU_PARTIAL_DVFS_CTRL_STATIC_PLL_EN_MASK (0x80U)\r\n#define APU_PARTIAL_DVFS_CTRL_STATIC_PLL_EN_SHIFT (7U)\r\n/*! STATIC_PLL_EN - Static PLL Enable */\r\n#define APU_PARTIAL_DVFS_CTRL_STATIC_PLL_EN(x)   (((uint32_t)(((uint32_t)(x)) << APU_PARTIAL_DVFS_CTRL_STATIC_PLL_EN_SHIFT)) & APU_PARTIAL_DVFS_CTRL_STATIC_PLL_EN_MASK)\r\n\r\n#define APU_PARTIAL_DVFS_CTRL_STATIC_DVFS_FREQ_MASK (0xF00U)\r\n#define APU_PARTIAL_DVFS_CTRL_STATIC_DVFS_FREQ_SHIFT (8U)\r\n/*! STATIC_DVFS_FREQ - Static DVFS Frequency */\r\n#define APU_PARTIAL_DVFS_CTRL_STATIC_DVFS_FREQ(x) (((uint32_t)(((uint32_t)(x)) << APU_PARTIAL_DVFS_CTRL_STATIC_DVFS_FREQ_SHIFT)) & APU_PARTIAL_DVFS_CTRL_STATIC_DVFS_FREQ_MASK)\r\n\r\n#define APU_PARTIAL_DVFS_CTRL_VOL_RESOLUTION_REF_MASK (0x1F0000U)\r\n#define APU_PARTIAL_DVFS_CTRL_VOL_RESOLUTION_REF_SHIFT (16U)\r\n/*! VOL_RESOLUTION_REF - Vol Resolution Ref */\r\n#define APU_PARTIAL_DVFS_CTRL_VOL_RESOLUTION_REF(x) (((uint32_t)(((uint32_t)(x)) << APU_PARTIAL_DVFS_CTRL_VOL_RESOLUTION_REF_SHIFT)) & APU_PARTIAL_DVFS_CTRL_VOL_RESOLUTION_REF_MASK)\r\n\r\n#define APU_PARTIAL_DVFS_CTRL_VOL_RESOLUTION_SLP_MASK (0x3E00000U)\r\n#define APU_PARTIAL_DVFS_CTRL_VOL_RESOLUTION_SLP_SHIFT (21U)\r\n/*! VOL_RESOLUTION_SLP - Vol Resolution Sleep */\r\n#define APU_PARTIAL_DVFS_CTRL_VOL_RESOLUTION_SLP(x) (((uint32_t)(((uint32_t)(x)) << APU_PARTIAL_DVFS_CTRL_VOL_RESOLUTION_SLP_SHIFT)) & APU_PARTIAL_DVFS_CTRL_VOL_RESOLUTION_SLP_MASK)\r\n\r\n#define APU_PARTIAL_DVFS_CTRL_BYPASS_DVFS_FSM_MASK (0x80000000U)\r\n#define APU_PARTIAL_DVFS_CTRL_BYPASS_DVFS_FSM_SHIFT (31U)\r\n/*! BYPASS_DVFS_FSM - Bypass DVFS FSM */\r\n#define APU_PARTIAL_DVFS_CTRL_BYPASS_DVFS_FSM(x) (((uint32_t)(((uint32_t)(x)) << APU_PARTIAL_DVFS_CTRL_BYPASS_DVFS_FSM_SHIFT)) & APU_PARTIAL_DVFS_CTRL_BYPASS_DVFS_FSM_MASK)\r\n/*! @} */\r\n\r\n/*! @name DVFS_TIMER - DVFS Timer */\r\n/*! @{ */\r\n\r\n#define APU_DVFS_TIMER_SLP_CNT_MASK              (0xFFFFU)\r\n#define APU_DVFS_TIMER_SLP_CNT_SHIFT             (0U)\r\n/*! SLP_CNT - Sleep Count */\r\n#define APU_DVFS_TIMER_SLP_CNT(x)                (((uint32_t)(((uint32_t)(x)) << APU_DVFS_TIMER_SLP_CNT_SHIFT)) & APU_DVFS_TIMER_SLP_CNT_MASK)\r\n\r\n#define APU_DVFS_TIMER_REF_CNT_MASK              (0xFFFF0000U)\r\n#define APU_DVFS_TIMER_REF_CNT_SHIFT             (16U)\r\n/*! REF_CNT - Reference Count */\r\n#define APU_DVFS_TIMER_REF_CNT(x)                (((uint32_t)(((uint32_t)(x)) << APU_DVFS_TIMER_REF_CNT_SHIFT)) & APU_DVFS_TIMER_REF_CNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHB1_FREQ_REG1 - AHB1 Frequency 1 */\r\n/*! @{ */\r\n\r\n#define APU_AHB1_FREQ_REG1_AHB1_FREQ_REG1_MASK   (0xFFFFFFFFU)\r\n#define APU_AHB1_FREQ_REG1_AHB1_FREQ_REG1_SHIFT  (0U)\r\n/*! AHB1_FREQ_REG1 - AHB1 Frequency 1 */\r\n#define APU_AHB1_FREQ_REG1_AHB1_FREQ_REG1(x)     (((uint32_t)(((uint32_t)(x)) << APU_AHB1_FREQ_REG1_AHB1_FREQ_REG1_SHIFT)) & APU_AHB1_FREQ_REG1_AHB1_FREQ_REG1_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHB1_FREQ_REG2 - AHB1 Frequency 2 */\r\n/*! @{ */\r\n\r\n#define APU_AHB1_FREQ_REG2_AHB1_FREQ_REG2_MASK   (0xFFFFFFFFU)\r\n#define APU_AHB1_FREQ_REG2_AHB1_FREQ_REG2_SHIFT  (0U)\r\n/*! AHB1_FREQ_REG2 - AHB1 Frequency 2 */\r\n#define APU_AHB1_FREQ_REG2_AHB1_FREQ_REG2(x)     (((uint32_t)(((uint32_t)(x)) << APU_AHB1_FREQ_REG2_AHB1_FREQ_REG2_SHIFT)) & APU_AHB1_FREQ_REG2_AHB1_FREQ_REG2_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHB1_PLL_EN_REG - AHB1 PLL Enable */\r\n/*! @{ */\r\n\r\n#define APU_AHB1_PLL_EN_REG_AHB1_PLL_EN_REG_MASK (0xFFFFFFFFU)\r\n#define APU_AHB1_PLL_EN_REG_AHB1_PLL_EN_REG_SHIFT (0U)\r\n/*! AHB1_PLL_EN_REG - AHB1 PLL Enable */\r\n#define APU_AHB1_PLL_EN_REG_AHB1_PLL_EN_REG(x)   (((uint32_t)(((uint32_t)(x)) << APU_AHB1_PLL_EN_REG_AHB1_PLL_EN_REG_SHIFT)) & APU_AHB1_PLL_EN_REG_AHB1_PLL_EN_REG_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHB1_VOL_REG1 - AHB1 Voltage 1 */\r\n/*! @{ */\r\n\r\n#define APU_AHB1_VOL_REG1_AHB1_VOL_REG1_MASK     (0xFFFFFFFFU)\r\n#define APU_AHB1_VOL_REG1_AHB1_VOL_REG1_SHIFT    (0U)\r\n/*! AHB1_VOL_REG1 - AHB1 Voltage 1 */\r\n#define APU_AHB1_VOL_REG1_AHB1_VOL_REG1(x)       (((uint32_t)(((uint32_t)(x)) << APU_AHB1_VOL_REG1_AHB1_VOL_REG1_SHIFT)) & APU_AHB1_VOL_REG1_AHB1_VOL_REG1_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHB1_VOL_REG2 - AHB1 Voltage 2 */\r\n/*! @{ */\r\n\r\n#define APU_AHB1_VOL_REG2_AHB1_VOL_REG2_MASK     (0xFFFFFFFFU)\r\n#define APU_AHB1_VOL_REG2_AHB1_VOL_REG2_SHIFT    (0U)\r\n/*! AHB1_VOL_REG2 - AHB1 Voltage 2 */\r\n#define APU_AHB1_VOL_REG2_AHB1_VOL_REG2(x)       (((uint32_t)(((uint32_t)(x)) << APU_AHB1_VOL_REG2_AHB1_VOL_REG2_SHIFT)) & APU_AHB1_VOL_REG2_AHB1_VOL_REG2_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHB1_VOL_REG3 - AHB1 Voltage 3 */\r\n/*! @{ */\r\n\r\n#define APU_AHB1_VOL_REG3_AHB1_VOL_REG3_MASK     (0xFFFFFFFFU)\r\n#define APU_AHB1_VOL_REG3_AHB1_VOL_REG3_SHIFT    (0U)\r\n/*! AHB1_VOL_REG3 - AHB1 Voltage 3 */\r\n#define APU_AHB1_VOL_REG3_AHB1_VOL_REG3(x)       (((uint32_t)(((uint32_t)(x)) << APU_AHB1_VOL_REG3_AHB1_VOL_REG3_SHIFT)) & APU_AHB1_VOL_REG3_AHB1_VOL_REG3_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHB1_VOL_REG4 - AHB1 Voltage 4 */\r\n/*! @{ */\r\n\r\n#define APU_AHB1_VOL_REG4_AHB1_VOL_REG4_MASK     (0xFFFFFFFFU)\r\n#define APU_AHB1_VOL_REG4_AHB1_VOL_REG4_SHIFT    (0U)\r\n/*! AHB1_VOL_REG4 - AHB1 Voltage 4 */\r\n#define APU_AHB1_VOL_REG4_AHB1_VOL_REG4(x)       (((uint32_t)(((uint32_t)(x)) << APU_AHB1_VOL_REG4_AHB1_VOL_REG4_SHIFT)) & APU_AHB1_VOL_REG4_AHB1_VOL_REG4_MASK)\r\n/*! @} */\r\n\r\n/*! @name DVFS_STATUS - DVFS Status */\r\n/*! @{ */\r\n\r\n#define APU_DVFS_STATUS_SYS_LOCK_FREQ_MASK       (0x1U)\r\n#define APU_DVFS_STATUS_SYS_LOCK_FREQ_SHIFT      (0U)\r\n/*! SYS_LOCK_FREQ - System Lock Frequency */\r\n#define APU_DVFS_STATUS_SYS_LOCK_FREQ(x)         (((uint32_t)(((uint32_t)(x)) << APU_DVFS_STATUS_SYS_LOCK_FREQ_SHIFT)) & APU_DVFS_STATUS_SYS_LOCK_FREQ_MASK)\r\n\r\n#define APU_DVFS_STATUS_CPU2_LOCK_FREQ_MASK      (0x2U)\r\n#define APU_DVFS_STATUS_CPU2_LOCK_FREQ_SHIFT     (1U)\r\n/*! CPU2_LOCK_FREQ - CPU2 Lock Frequency */\r\n#define APU_DVFS_STATUS_CPU2_LOCK_FREQ(x)        (((uint32_t)(((uint32_t)(x)) << APU_DVFS_STATUS_CPU2_LOCK_FREQ_SHIFT)) & APU_DVFS_STATUS_CPU2_LOCK_FREQ_MASK)\r\n\r\n#define APU_DVFS_STATUS_CPU1_LOCK_FREQ_MASK      (0x4U)\r\n#define APU_DVFS_STATUS_CPU1_LOCK_FREQ_SHIFT     (2U)\r\n/*! CPU1_LOCK_FREQ - CPU1 Lock Frequency */\r\n#define APU_DVFS_STATUS_CPU1_LOCK_FREQ(x)        (((uint32_t)(((uint32_t)(x)) << APU_DVFS_STATUS_CPU1_LOCK_FREQ_SHIFT)) & APU_DVFS_STATUS_CPU1_LOCK_FREQ_MASK)\r\n\r\n#define APU_DVFS_STATUS_LOCK_FREQ_REQ_MASK       (0x8U)\r\n#define APU_DVFS_STATUS_LOCK_FREQ_REQ_SHIFT      (3U)\r\n/*! LOCK_FREQ_REQ - Lock Frequency Request */\r\n#define APU_DVFS_STATUS_LOCK_FREQ_REQ(x)         (((uint32_t)(((uint32_t)(x)) << APU_DVFS_STATUS_LOCK_FREQ_REQ_SHIFT)) & APU_DVFS_STATUS_LOCK_FREQ_REQ_MASK)\r\n\r\n#define APU_DVFS_STATUS_SYS_LOCK_VOL_MASK        (0x10U)\r\n#define APU_DVFS_STATUS_SYS_LOCK_VOL_SHIFT       (4U)\r\n/*! SYS_LOCK_VOL - System Lock Vol */\r\n#define APU_DVFS_STATUS_SYS_LOCK_VOL(x)          (((uint32_t)(((uint32_t)(x)) << APU_DVFS_STATUS_SYS_LOCK_VOL_SHIFT)) & APU_DVFS_STATUS_SYS_LOCK_VOL_MASK)\r\n\r\n#define APU_DVFS_STATUS_CPU2_LOCK_VOL_MASK       (0x20U)\r\n#define APU_DVFS_STATUS_CPU2_LOCK_VOL_SHIFT      (5U)\r\n/*! CPU2_LOCK_VOL - CPU2 Lock Vol */\r\n#define APU_DVFS_STATUS_CPU2_LOCK_VOL(x)         (((uint32_t)(((uint32_t)(x)) << APU_DVFS_STATUS_CPU2_LOCK_VOL_SHIFT)) & APU_DVFS_STATUS_CPU2_LOCK_VOL_MASK)\r\n\r\n#define APU_DVFS_STATUS_CPU1_LOCK_VOL_MASK       (0x40U)\r\n#define APU_DVFS_STATUS_CPU1_LOCK_VOL_SHIFT      (6U)\r\n/*! CPU1_LOCK_VOL - CPU1 Lock Vol */\r\n#define APU_DVFS_STATUS_CPU1_LOCK_VOL(x)         (((uint32_t)(((uint32_t)(x)) << APU_DVFS_STATUS_CPU1_LOCK_VOL_SHIFT)) & APU_DVFS_STATUS_CPU1_LOCK_VOL_MASK)\r\n\r\n#define APU_DVFS_STATUS_LOCK_VOL_REQ_MASK        (0x80U)\r\n#define APU_DVFS_STATUS_LOCK_VOL_REQ_SHIFT       (7U)\r\n/*! LOCK_VOL_REQ - Lock Vol Request */\r\n#define APU_DVFS_STATUS_LOCK_VOL_REQ(x)          (((uint32_t)(((uint32_t)(x)) << APU_DVFS_STATUS_LOCK_VOL_REQ_SHIFT)) & APU_DVFS_STATUS_LOCK_VOL_REQ_MASK)\r\n\r\n#define APU_DVFS_STATUS_SYS_FREQ_CTRL_MASK       (0xF00U)\r\n#define APU_DVFS_STATUS_SYS_FREQ_CTRL_SHIFT      (8U)\r\n/*! SYS_FREQ_CTRL - System Frequency Control */\r\n#define APU_DVFS_STATUS_SYS_FREQ_CTRL(x)         (((uint32_t)(((uint32_t)(x)) << APU_DVFS_STATUS_SYS_FREQ_CTRL_SHIFT)) & APU_DVFS_STATUS_SYS_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_STATUS_CPU2_FREQ_CTRL_MASK      (0xF000U)\r\n#define APU_DVFS_STATUS_CPU2_FREQ_CTRL_SHIFT     (12U)\r\n/*! CPU2_FREQ_CTRL - CPU2 Frequency Control */\r\n#define APU_DVFS_STATUS_CPU2_FREQ_CTRL(x)        (((uint32_t)(((uint32_t)(x)) << APU_DVFS_STATUS_CPU2_FREQ_CTRL_SHIFT)) & APU_DVFS_STATUS_CPU2_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_STATUS_CPU1_FREQ_CTRL_MASK      (0xF0000U)\r\n#define APU_DVFS_STATUS_CPU1_FREQ_CTRL_SHIFT     (16U)\r\n/*! CPU1_FREQ_CTRL - CPU1 Frequency Control */\r\n#define APU_DVFS_STATUS_CPU1_FREQ_CTRL(x)        (((uint32_t)(((uint32_t)(x)) << APU_DVFS_STATUS_CPU1_FREQ_CTRL_SHIFT)) & APU_DVFS_STATUS_CPU1_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_STATUS_SOC_POWER_LVL_REACHED_MASK (0x100000U)\r\n#define APU_DVFS_STATUS_SOC_POWER_LVL_REACHED_SHIFT (20U)\r\n/*! SOC_POWER_LVL_REACHED - SoC Power Level Reached */\r\n#define APU_DVFS_STATUS_SOC_POWER_LVL_REACHED(x) (((uint32_t)(((uint32_t)(x)) << APU_DVFS_STATUS_SOC_POWER_LVL_REACHED_SHIFT)) & APU_DVFS_STATUS_SOC_POWER_LVL_REACHED_MASK)\r\n\r\n#define APU_DVFS_STATUS_USB_VOL_LVL_REACHED_MASK (0x200000U)\r\n#define APU_DVFS_STATUS_USB_VOL_LVL_REACHED_SHIFT (21U)\r\n/*! USB_VOL_LVL_REACHED - USB Vol Level Reached */\r\n#define APU_DVFS_STATUS_USB_VOL_LVL_REACHED(x)   (((uint32_t)(((uint32_t)(x)) << APU_DVFS_STATUS_USB_VOL_LVL_REACHED_SHIFT)) & APU_DVFS_STATUS_USB_VOL_LVL_REACHED_MASK)\r\n\r\n#define APU_DVFS_STATUS_PCIE_VOL_LVL_REACHED_MASK (0x400000U)\r\n#define APU_DVFS_STATUS_PCIE_VOL_LVL_REACHED_SHIFT (22U)\r\n/*! PCIE_VOL_LVL_REACHED - PCIe Vol Level Reached */\r\n#define APU_DVFS_STATUS_PCIE_VOL_LVL_REACHED(x)  (((uint32_t)(((uint32_t)(x)) << APU_DVFS_STATUS_PCIE_VOL_LVL_REACHED_SHIFT)) & APU_DVFS_STATUS_PCIE_VOL_LVL_REACHED_MASK)\r\n\r\n#define APU_DVFS_STATUS_APU_BUCK_LVL_CTRL_MASK   (0x3F800000U)\r\n#define APU_DVFS_STATUS_APU_BUCK_LVL_CTRL_SHIFT  (23U)\r\n/*! APU_BUCK_LVL_CTRL - APU BUCK Level Control */\r\n#define APU_DVFS_STATUS_APU_BUCK_LVL_CTRL(x)     (((uint32_t)(((uint32_t)(x)) << APU_DVFS_STATUS_APU_BUCK_LVL_CTRL_SHIFT)) & APU_DVFS_STATUS_APU_BUCK_LVL_CTRL_MASK)\r\n\r\n#define APU_DVFS_STATUS_SW_FREQ_GAURD_MASK       (0x40000000U)\r\n#define APU_DVFS_STATUS_SW_FREQ_GAURD_SHIFT      (30U)\r\n/*! SW_FREQ_GAURD - SW Frequency Guard */\r\n#define APU_DVFS_STATUS_SW_FREQ_GAURD(x)         (((uint32_t)(((uint32_t)(x)) << APU_DVFS_STATUS_SW_FREQ_GAURD_SHIFT)) & APU_DVFS_STATUS_SW_FREQ_GAURD_MASK)\r\n\r\n#define APU_DVFS_STATUS_SW_LOCK_GAURD_MASK       (0x80000000U)\r\n#define APU_DVFS_STATUS_SW_LOCK_GAURD_SHIFT      (31U)\r\n/*! SW_LOCK_GAURD - SW Lock Guard */\r\n#define APU_DVFS_STATUS_SW_LOCK_GAURD(x)         (((uint32_t)(((uint32_t)(x)) << APU_DVFS_STATUS_SW_LOCK_GAURD_SHIFT)) & APU_DVFS_STATUS_SW_LOCK_GAURD_MASK)\r\n/*! @} */\r\n\r\n/*! @name DVFS_DBG_CTRL - DVFS Debug Control */\r\n/*! @{ */\r\n\r\n#define APU_DVFS_DBG_CTRL_DVFS_DBG_MODE_MASK     (0x1U)\r\n#define APU_DVFS_DBG_CTRL_DVFS_DBG_MODE_SHIFT    (0U)\r\n/*! DVFS_DBG_MODE - DVFS Debug Mode */\r\n#define APU_DVFS_DBG_CTRL_DVFS_DBG_MODE(x)       (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_CTRL_DVFS_DBG_MODE_SHIFT)) & APU_DVFS_DBG_CTRL_DVFS_DBG_MODE_MASK)\r\n\r\n#define APU_DVFS_DBG_CTRL_START_TRIGGER_MASK     (0x2U)\r\n#define APU_DVFS_DBG_CTRL_START_TRIGGER_SHIFT    (1U)\r\n/*! START_TRIGGER - Start Trigger */\r\n#define APU_DVFS_DBG_CTRL_START_TRIGGER(x)       (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_CTRL_START_TRIGGER_SHIFT)) & APU_DVFS_DBG_CTRL_START_TRIGGER_MASK)\r\n\r\n#define APU_DVFS_DBG_CTRL_END_TRIGGER_MASK       (0x4U)\r\n#define APU_DVFS_DBG_CTRL_END_TRIGGER_SHIFT      (2U)\r\n/*! END_TRIGGER - End Trigger */\r\n#define APU_DVFS_DBG_CTRL_END_TRIGGER(x)         (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_CTRL_END_TRIGGER_SHIFT)) & APU_DVFS_DBG_CTRL_END_TRIGGER_MASK)\r\n\r\n#define APU_DVFS_DBG_CTRL_DBG_VOL_SEL_MASK       (0x70U)\r\n#define APU_DVFS_DBG_CTRL_DBG_VOL_SEL_SHIFT      (4U)\r\n/*! DBG_VOL_SEL - Debug Vol Select */\r\n#define APU_DVFS_DBG_CTRL_DBG_VOL_SEL(x)         (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_CTRL_DBG_VOL_SEL_SHIFT)) & APU_DVFS_DBG_CTRL_DBG_VOL_SEL_MASK)\r\n\r\n#define APU_DVFS_DBG_CTRL_DBG_SLP_TIMER_SEL_MASK (0x300U)\r\n#define APU_DVFS_DBG_CTRL_DBG_SLP_TIMER_SEL_SHIFT (8U)\r\n/*! DBG_SLP_TIMER_SEL - Debug Sleep Timer Select */\r\n#define APU_DVFS_DBG_CTRL_DBG_SLP_TIMER_SEL(x)   (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_CTRL_DBG_SLP_TIMER_SEL_SHIFT)) & APU_DVFS_DBG_CTRL_DBG_SLP_TIMER_SEL_MASK)\r\n\r\n#define APU_DVFS_DBG_CTRL_DVFS_CLK_SEL_FW_BYPASS_MASK (0x1000U)\r\n#define APU_DVFS_DBG_CTRL_DVFS_CLK_SEL_FW_BYPASS_SHIFT (12U)\r\n/*! DVFS_CLK_SEL_FW_BYPASS - DVFS Clock Select FW Bypass */\r\n#define APU_DVFS_DBG_CTRL_DVFS_CLK_SEL_FW_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_CTRL_DVFS_CLK_SEL_FW_BYPASS_SHIFT)) & APU_DVFS_DBG_CTRL_DVFS_CLK_SEL_FW_BYPASS_MASK)\r\n\r\n#define APU_DVFS_DBG_CTRL_DVFS_CLK_SEL_FW_VAL_MASK (0x2000U)\r\n#define APU_DVFS_DBG_CTRL_DVFS_CLK_SEL_FW_VAL_SHIFT (13U)\r\n/*! DVFS_CLK_SEL_FW_VAL - DVFS Clock Select FW Value */\r\n#define APU_DVFS_DBG_CTRL_DVFS_CLK_SEL_FW_VAL(x) (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_CTRL_DVFS_CLK_SEL_FW_VAL_SHIFT)) & APU_DVFS_DBG_CTRL_DVFS_CLK_SEL_FW_VAL_MASK)\r\n\r\n#define APU_DVFS_DBG_CTRL_BUCK_EFF_MODE_FIX_MASK (0x8000U)\r\n#define APU_DVFS_DBG_CTRL_BUCK_EFF_MODE_FIX_SHIFT (15U)\r\n/*! BUCK_EFF_MODE_FIX - BUCK Efficiency Mode Fix */\r\n#define APU_DVFS_DBG_CTRL_BUCK_EFF_MODE_FIX(x)   (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_CTRL_BUCK_EFF_MODE_FIX_SHIFT)) & APU_DVFS_DBG_CTRL_BUCK_EFF_MODE_FIX_MASK)\r\n\r\n#define APU_DVFS_DBG_CTRL_SD_CLK_SWITCH_OK_MASK_MASK (0x10000U)\r\n#define APU_DVFS_DBG_CTRL_SD_CLK_SWITCH_OK_MASK_SHIFT (16U)\r\n/*! SD_CLK_SWITCH_OK_MASK - SD Clock Switch Ok Mask */\r\n#define APU_DVFS_DBG_CTRL_SD_CLK_SWITCH_OK_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_CTRL_SD_CLK_SWITCH_OK_MASK_SHIFT)) & APU_DVFS_DBG_CTRL_SD_CLK_SWITCH_OK_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name DVFS_DBG_PATTERN_DATA - DVFS Debug Pattern Data */\r\n/*! @{ */\r\n\r\n#define APU_DVFS_DBG_PATTERN_DATA_VOL_REQ_MASK   (0x1FU)\r\n#define APU_DVFS_DBG_PATTERN_DATA_VOL_REQ_SHIFT  (0U)\r\n/*! VOL_REQ - Vol Request */\r\n#define APU_DVFS_DBG_PATTERN_DATA_VOL_REQ(x)     (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_PATTERN_DATA_VOL_REQ_SHIFT)) & APU_DVFS_DBG_PATTERN_DATA_VOL_REQ_MASK)\r\n\r\n#define APU_DVFS_DBG_PATTERN_DATA_SYS_FREQ_CTRL_MASK (0x1E0U)\r\n#define APU_DVFS_DBG_PATTERN_DATA_SYS_FREQ_CTRL_SHIFT (5U)\r\n/*! SYS_FREQ_CTRL - System Frequency Control */\r\n#define APU_DVFS_DBG_PATTERN_DATA_SYS_FREQ_CTRL(x) (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_PATTERN_DATA_SYS_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_PATTERN_DATA_SYS_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_PATTERN_DATA_CPU2_FREQ_CTRL_MASK (0x1E00U)\r\n#define APU_DVFS_DBG_PATTERN_DATA_CPU2_FREQ_CTRL_SHIFT (9U)\r\n/*! CPU2_FREQ_CTRL - CPU2 Frequency Control */\r\n#define APU_DVFS_DBG_PATTERN_DATA_CPU2_FREQ_CTRL(x) (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_PATTERN_DATA_CPU2_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_PATTERN_DATA_CPU2_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_PATTERN_DATA_CPU1_FREQ_CTRL_MASK (0x1E000U)\r\n#define APU_DVFS_DBG_PATTERN_DATA_CPU1_FREQ_CTRL_SHIFT (13U)\r\n/*! CPU1_FREQ_CTRL - CPU1 Frequency Control */\r\n#define APU_DVFS_DBG_PATTERN_DATA_CPU1_FREQ_CTRL(x) (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_PATTERN_DATA_CPU1_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_PATTERN_DATA_CPU1_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_PATTERN_DATA_APU_BUCK_LVL_CTRL_MASK (0x3E0000U)\r\n#define APU_DVFS_DBG_PATTERN_DATA_APU_BUCK_LVL_CTRL_SHIFT (17U)\r\n/*! APU_BUCK_LVL_CTRL - APU BUCK Level Control */\r\n#define APU_DVFS_DBG_PATTERN_DATA_APU_BUCK_LVL_CTRL(x) (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_PATTERN_DATA_APU_BUCK_LVL_CTRL_SHIFT)) & APU_DVFS_DBG_PATTERN_DATA_APU_BUCK_LVL_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_PATTERN_DATA_SW_VOL_REQ_MASK (0x7C00000U)\r\n#define APU_DVFS_DBG_PATTERN_DATA_SW_VOL_REQ_SHIFT (22U)\r\n/*! SW_VOL_REQ - SW Vol Request */\r\n#define APU_DVFS_DBG_PATTERN_DATA_SW_VOL_REQ(x)  (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_PATTERN_DATA_SW_VOL_REQ_SHIFT)) & APU_DVFS_DBG_PATTERN_DATA_SW_VOL_REQ_MASK)\r\n\r\n#define APU_DVFS_DBG_PATTERN_DATA_HW_VOL_REQ_MASK (0xF8000000U)\r\n#define APU_DVFS_DBG_PATTERN_DATA_HW_VOL_REQ_SHIFT (27U)\r\n/*! HW_VOL_REQ - HW Vol Request */\r\n#define APU_DVFS_DBG_PATTERN_DATA_HW_VOL_REQ(x)  (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_PATTERN_DATA_HW_VOL_REQ_SHIFT)) & APU_DVFS_DBG_PATTERN_DATA_HW_VOL_REQ_MASK)\r\n/*! @} */\r\n\r\n/*! @name DVFS_DBG_REG0 - DVFS Debug 0 */\r\n/*! @{ */\r\n\r\n#define APU_DVFS_DBG_REG0_VOL_REQ_MASK           (0x1FU)\r\n#define APU_DVFS_DBG_REG0_VOL_REQ_SHIFT          (0U)\r\n/*! VOL_REQ - Vol Request */\r\n#define APU_DVFS_DBG_REG0_VOL_REQ(x)             (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG0_VOL_REQ_SHIFT)) & APU_DVFS_DBG_REG0_VOL_REQ_MASK)\r\n\r\n#define APU_DVFS_DBG_REG0_SYS_FREQ_CTRL_MASK     (0x1E0U)\r\n#define APU_DVFS_DBG_REG0_SYS_FREQ_CTRL_SHIFT    (5U)\r\n/*! SYS_FREQ_CTRL - System Frequency Control */\r\n#define APU_DVFS_DBG_REG0_SYS_FREQ_CTRL(x)       (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG0_SYS_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_REG0_SYS_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG0_CPU2_FREQ_CTRL_MASK    (0x1E00U)\r\n#define APU_DVFS_DBG_REG0_CPU2_FREQ_CTRL_SHIFT   (9U)\r\n/*! CPU2_FREQ_CTRL - CPU2 Frequency Control */\r\n#define APU_DVFS_DBG_REG0_CPU2_FREQ_CTRL(x)      (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG0_CPU2_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_REG0_CPU2_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG0_CPU1_FREQ_CTRL_MASK    (0x1E000U)\r\n#define APU_DVFS_DBG_REG0_CPU1_FREQ_CTRL_SHIFT   (13U)\r\n/*! CPU1_FREQ_CTRL - CPU1 Frequency Control */\r\n#define APU_DVFS_DBG_REG0_CPU1_FREQ_CTRL(x)      (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG0_CPU1_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_REG0_CPU1_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG0_APU_BUCK_LVL_CTRL_MASK (0x3E0000U)\r\n#define APU_DVFS_DBG_REG0_APU_BUCK_LVL_CTRL_SHIFT (17U)\r\n/*! APU_BUCK_LVL_CTRL - APU BUCK Level Control */\r\n#define APU_DVFS_DBG_REG0_APU_BUCK_LVL_CTRL(x)   (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG0_APU_BUCK_LVL_CTRL_SHIFT)) & APU_DVFS_DBG_REG0_APU_BUCK_LVL_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG0_SW_VOL_REQ_MASK        (0x7C00000U)\r\n#define APU_DVFS_DBG_REG0_SW_VOL_REQ_SHIFT       (22U)\r\n/*! SW_VOL_REQ - SW Vol Request */\r\n#define APU_DVFS_DBG_REG0_SW_VOL_REQ(x)          (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG0_SW_VOL_REQ_SHIFT)) & APU_DVFS_DBG_REG0_SW_VOL_REQ_MASK)\r\n\r\n#define APU_DVFS_DBG_REG0_HW_VOL_REQ_MASK        (0xF8000000U)\r\n#define APU_DVFS_DBG_REG0_HW_VOL_REQ_SHIFT       (27U)\r\n/*! HW_VOL_REQ - HW Vol Request */\r\n#define APU_DVFS_DBG_REG0_HW_VOL_REQ(x)          (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG0_HW_VOL_REQ_SHIFT)) & APU_DVFS_DBG_REG0_HW_VOL_REQ_MASK)\r\n/*! @} */\r\n\r\n/*! @name DVFS_DBG_REG1 - DVFS Debug 1 */\r\n/*! @{ */\r\n\r\n#define APU_DVFS_DBG_REG1_VOL_REQ_MASK           (0x1FU)\r\n#define APU_DVFS_DBG_REG1_VOL_REQ_SHIFT          (0U)\r\n/*! VOL_REQ - Vol Request */\r\n#define APU_DVFS_DBG_REG1_VOL_REQ(x)             (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG1_VOL_REQ_SHIFT)) & APU_DVFS_DBG_REG1_VOL_REQ_MASK)\r\n\r\n#define APU_DVFS_DBG_REG1_SYS_FREQ_CTRL_MASK     (0x1E0U)\r\n#define APU_DVFS_DBG_REG1_SYS_FREQ_CTRL_SHIFT    (5U)\r\n/*! SYS_FREQ_CTRL - System Frequency Control */\r\n#define APU_DVFS_DBG_REG1_SYS_FREQ_CTRL(x)       (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG1_SYS_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_REG1_SYS_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG1_CPU2_FREQ_CTRL_MASK    (0x1E00U)\r\n#define APU_DVFS_DBG_REG1_CPU2_FREQ_CTRL_SHIFT   (9U)\r\n/*! CPU2_FREQ_CTRL - CPU2 Frequency Control */\r\n#define APU_DVFS_DBG_REG1_CPU2_FREQ_CTRL(x)      (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG1_CPU2_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_REG1_CPU2_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG1_CPU1_FREQ_CTRL_MASK    (0x1E000U)\r\n#define APU_DVFS_DBG_REG1_CPU1_FREQ_CTRL_SHIFT   (13U)\r\n/*! CPU1_FREQ_CTRL - CPU1 Frequency Control */\r\n#define APU_DVFS_DBG_REG1_CPU1_FREQ_CTRL(x)      (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG1_CPU1_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_REG1_CPU1_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG1_APU_BUCK_LVL_CTRL_MASK (0x3E0000U)\r\n#define APU_DVFS_DBG_REG1_APU_BUCK_LVL_CTRL_SHIFT (17U)\r\n/*! APU_BUCK_LVL_CTRL - APU BUCK Level Control */\r\n#define APU_DVFS_DBG_REG1_APU_BUCK_LVL_CTRL(x)   (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG1_APU_BUCK_LVL_CTRL_SHIFT)) & APU_DVFS_DBG_REG1_APU_BUCK_LVL_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG1_SW_VOL_REQ_MASK        (0x7C00000U)\r\n#define APU_DVFS_DBG_REG1_SW_VOL_REQ_SHIFT       (22U)\r\n/*! SW_VOL_REQ - SW Vol Request */\r\n#define APU_DVFS_DBG_REG1_SW_VOL_REQ(x)          (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG1_SW_VOL_REQ_SHIFT)) & APU_DVFS_DBG_REG1_SW_VOL_REQ_MASK)\r\n\r\n#define APU_DVFS_DBG_REG1_HW_VOL_REQ_MASK        (0xF8000000U)\r\n#define APU_DVFS_DBG_REG1_HW_VOL_REQ_SHIFT       (27U)\r\n/*! HW_VOL_REQ - HW Vol Request */\r\n#define APU_DVFS_DBG_REG1_HW_VOL_REQ(x)          (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG1_HW_VOL_REQ_SHIFT)) & APU_DVFS_DBG_REG1_HW_VOL_REQ_MASK)\r\n/*! @} */\r\n\r\n/*! @name DVFS_DBG_REG2 - DVFS Debug 2 */\r\n/*! @{ */\r\n\r\n#define APU_DVFS_DBG_REG2_VOL_REQ_MASK           (0x1FU)\r\n#define APU_DVFS_DBG_REG2_VOL_REQ_SHIFT          (0U)\r\n/*! VOL_REQ - Vol Request */\r\n#define APU_DVFS_DBG_REG2_VOL_REQ(x)             (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG2_VOL_REQ_SHIFT)) & APU_DVFS_DBG_REG2_VOL_REQ_MASK)\r\n\r\n#define APU_DVFS_DBG_REG2_SYS_FREQ_CTRL_MASK     (0x1E0U)\r\n#define APU_DVFS_DBG_REG2_SYS_FREQ_CTRL_SHIFT    (5U)\r\n/*! SYS_FREQ_CTRL - System Frequency Control */\r\n#define APU_DVFS_DBG_REG2_SYS_FREQ_CTRL(x)       (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG2_SYS_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_REG2_SYS_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG2_CPU2_FREQ_CTRL_MASK    (0x1E00U)\r\n#define APU_DVFS_DBG_REG2_CPU2_FREQ_CTRL_SHIFT   (9U)\r\n/*! CPU2_FREQ_CTRL - CPU2 Frequency Control */\r\n#define APU_DVFS_DBG_REG2_CPU2_FREQ_CTRL(x)      (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG2_CPU2_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_REG2_CPU2_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG2_CPU1_FREQ_CTRL_MASK    (0x1E000U)\r\n#define APU_DVFS_DBG_REG2_CPU1_FREQ_CTRL_SHIFT   (13U)\r\n/*! CPU1_FREQ_CTRL - CPU1 Frequency Control */\r\n#define APU_DVFS_DBG_REG2_CPU1_FREQ_CTRL(x)      (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG2_CPU1_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_REG2_CPU1_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG2_APU_BUCK_LVL_CTRL_MASK (0x3E0000U)\r\n#define APU_DVFS_DBG_REG2_APU_BUCK_LVL_CTRL_SHIFT (17U)\r\n/*! APU_BUCK_LVL_CTRL - APU BUCK Level Control */\r\n#define APU_DVFS_DBG_REG2_APU_BUCK_LVL_CTRL(x)   (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG2_APU_BUCK_LVL_CTRL_SHIFT)) & APU_DVFS_DBG_REG2_APU_BUCK_LVL_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG2_SW_VOL_REQ_MASK        (0x7C00000U)\r\n#define APU_DVFS_DBG_REG2_SW_VOL_REQ_SHIFT       (22U)\r\n/*! SW_VOL_REQ - SW Vol Request */\r\n#define APU_DVFS_DBG_REG2_SW_VOL_REQ(x)          (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG2_SW_VOL_REQ_SHIFT)) & APU_DVFS_DBG_REG2_SW_VOL_REQ_MASK)\r\n\r\n#define APU_DVFS_DBG_REG2_HW_VOL_REQ_MASK        (0xF8000000U)\r\n#define APU_DVFS_DBG_REG2_HW_VOL_REQ_SHIFT       (27U)\r\n/*! HW_VOL_REQ - HW Vol Request */\r\n#define APU_DVFS_DBG_REG2_HW_VOL_REQ(x)          (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG2_HW_VOL_REQ_SHIFT)) & APU_DVFS_DBG_REG2_HW_VOL_REQ_MASK)\r\n/*! @} */\r\n\r\n/*! @name DVFS_DBG_REG3 - DVFS Debug 3 */\r\n/*! @{ */\r\n\r\n#define APU_DVFS_DBG_REG3_VOL_REQ_MASK           (0x1FU)\r\n#define APU_DVFS_DBG_REG3_VOL_REQ_SHIFT          (0U)\r\n/*! VOL_REQ - Vol Request */\r\n#define APU_DVFS_DBG_REG3_VOL_REQ(x)             (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG3_VOL_REQ_SHIFT)) & APU_DVFS_DBG_REG3_VOL_REQ_MASK)\r\n\r\n#define APU_DVFS_DBG_REG3_SYS_FREQ_CTRL_MASK     (0x1E0U)\r\n#define APU_DVFS_DBG_REG3_SYS_FREQ_CTRL_SHIFT    (5U)\r\n/*! SYS_FREQ_CTRL - System Frequency Control */\r\n#define APU_DVFS_DBG_REG3_SYS_FREQ_CTRL(x)       (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG3_SYS_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_REG3_SYS_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG3_CPU2_FREQ_CTRL_MASK    (0x1E00U)\r\n#define APU_DVFS_DBG_REG3_CPU2_FREQ_CTRL_SHIFT   (9U)\r\n/*! CPU2_FREQ_CTRL - CPU2 Frequency Control */\r\n#define APU_DVFS_DBG_REG3_CPU2_FREQ_CTRL(x)      (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG3_CPU2_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_REG3_CPU2_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG3_CPU1_FREQ_CTRL_MASK    (0x1E000U)\r\n#define APU_DVFS_DBG_REG3_CPU1_FREQ_CTRL_SHIFT   (13U)\r\n/*! CPU1_FREQ_CTRL - CPU1 Frequency Control */\r\n#define APU_DVFS_DBG_REG3_CPU1_FREQ_CTRL(x)      (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG3_CPU1_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_REG3_CPU1_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG3_APU_BUCK_LVL_CTRL_MASK (0x3E0000U)\r\n#define APU_DVFS_DBG_REG3_APU_BUCK_LVL_CTRL_SHIFT (17U)\r\n/*! APU_BUCK_LVL_CTRL - APU BUCK Level Control */\r\n#define APU_DVFS_DBG_REG3_APU_BUCK_LVL_CTRL(x)   (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG3_APU_BUCK_LVL_CTRL_SHIFT)) & APU_DVFS_DBG_REG3_APU_BUCK_LVL_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG3_SW_VOL_REQ_MASK        (0x7C00000U)\r\n#define APU_DVFS_DBG_REG3_SW_VOL_REQ_SHIFT       (22U)\r\n/*! SW_VOL_REQ - SW Vol Request */\r\n#define APU_DVFS_DBG_REG3_SW_VOL_REQ(x)          (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG3_SW_VOL_REQ_SHIFT)) & APU_DVFS_DBG_REG3_SW_VOL_REQ_MASK)\r\n\r\n#define APU_DVFS_DBG_REG3_HW_VOL_REQ_MASK        (0xF8000000U)\r\n#define APU_DVFS_DBG_REG3_HW_VOL_REQ_SHIFT       (27U)\r\n/*! HW_VOL_REQ - HW Vol Request */\r\n#define APU_DVFS_DBG_REG3_HW_VOL_REQ(x)          (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG3_HW_VOL_REQ_SHIFT)) & APU_DVFS_DBG_REG3_HW_VOL_REQ_MASK)\r\n/*! @} */\r\n\r\n/*! @name DVFS_DBG_REG4 - DVFS Debug 4 */\r\n/*! @{ */\r\n\r\n#define APU_DVFS_DBG_REG4_VOL_REQ_MASK           (0x1FU)\r\n#define APU_DVFS_DBG_REG4_VOL_REQ_SHIFT          (0U)\r\n/*! VOL_REQ - Vol Request */\r\n#define APU_DVFS_DBG_REG4_VOL_REQ(x)             (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG4_VOL_REQ_SHIFT)) & APU_DVFS_DBG_REG4_VOL_REQ_MASK)\r\n\r\n#define APU_DVFS_DBG_REG4_SYS_FREQ_CTRL_MASK     (0x1E0U)\r\n#define APU_DVFS_DBG_REG4_SYS_FREQ_CTRL_SHIFT    (5U)\r\n/*! SYS_FREQ_CTRL - System Frequency Control */\r\n#define APU_DVFS_DBG_REG4_SYS_FREQ_CTRL(x)       (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG4_SYS_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_REG4_SYS_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG4_CPU2_FREQ_CTRL_MASK    (0x1E00U)\r\n#define APU_DVFS_DBG_REG4_CPU2_FREQ_CTRL_SHIFT   (9U)\r\n/*! CPU2_FREQ_CTRL - CPU2 Frequency Control */\r\n#define APU_DVFS_DBG_REG4_CPU2_FREQ_CTRL(x)      (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG4_CPU2_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_REG4_CPU2_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG4_CPU1_FREQ_CTRL_MASK    (0x1E000U)\r\n#define APU_DVFS_DBG_REG4_CPU1_FREQ_CTRL_SHIFT   (13U)\r\n/*! CPU1_FREQ_CTRL - CPU1 Frequency Control */\r\n#define APU_DVFS_DBG_REG4_CPU1_FREQ_CTRL(x)      (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG4_CPU1_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_REG4_CPU1_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG4_APU_BUCK_LVL_CTRL_MASK (0x3E0000U)\r\n#define APU_DVFS_DBG_REG4_APU_BUCK_LVL_CTRL_SHIFT (17U)\r\n/*! APU_BUCK_LVL_CTRL - APU BUCK Level Control */\r\n#define APU_DVFS_DBG_REG4_APU_BUCK_LVL_CTRL(x)   (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG4_APU_BUCK_LVL_CTRL_SHIFT)) & APU_DVFS_DBG_REG4_APU_BUCK_LVL_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG4_SW_VOL_REQ_MASK        (0x7C00000U)\r\n#define APU_DVFS_DBG_REG4_SW_VOL_REQ_SHIFT       (22U)\r\n/*! SW_VOL_REQ - SW Vol Request */\r\n#define APU_DVFS_DBG_REG4_SW_VOL_REQ(x)          (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG4_SW_VOL_REQ_SHIFT)) & APU_DVFS_DBG_REG4_SW_VOL_REQ_MASK)\r\n\r\n#define APU_DVFS_DBG_REG4_HW_VOL_REQ_MASK        (0xF8000000U)\r\n#define APU_DVFS_DBG_REG4_HW_VOL_REQ_SHIFT       (27U)\r\n/*! HW_VOL_REQ - HW Vol Request */\r\n#define APU_DVFS_DBG_REG4_HW_VOL_REQ(x)          (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG4_HW_VOL_REQ_SHIFT)) & APU_DVFS_DBG_REG4_HW_VOL_REQ_MASK)\r\n/*! @} */\r\n\r\n/*! @name DVFS_DBG_REG5 - DVFS Debug 5 */\r\n/*! @{ */\r\n\r\n#define APU_DVFS_DBG_REG5_VOL_REQ_MASK           (0x1FU)\r\n#define APU_DVFS_DBG_REG5_VOL_REQ_SHIFT          (0U)\r\n/*! VOL_REQ - Vol Request */\r\n#define APU_DVFS_DBG_REG5_VOL_REQ(x)             (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG5_VOL_REQ_SHIFT)) & APU_DVFS_DBG_REG5_VOL_REQ_MASK)\r\n\r\n#define APU_DVFS_DBG_REG5_SYS_FREQ_CTRL_MASK     (0x1E0U)\r\n#define APU_DVFS_DBG_REG5_SYS_FREQ_CTRL_SHIFT    (5U)\r\n/*! SYS_FREQ_CTRL - System Frequency Control */\r\n#define APU_DVFS_DBG_REG5_SYS_FREQ_CTRL(x)       (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG5_SYS_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_REG5_SYS_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG5_CPU2_FREQ_CTRL_MASK    (0x1E00U)\r\n#define APU_DVFS_DBG_REG5_CPU2_FREQ_CTRL_SHIFT   (9U)\r\n/*! CPU2_FREQ_CTRL - CPU2 Frequency Control */\r\n#define APU_DVFS_DBG_REG5_CPU2_FREQ_CTRL(x)      (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG5_CPU2_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_REG5_CPU2_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG5_CPU1_FREQ_CTRL_MASK    (0x1E000U)\r\n#define APU_DVFS_DBG_REG5_CPU1_FREQ_CTRL_SHIFT   (13U)\r\n/*! CPU1_FREQ_CTRL - CPU1 Frequency Control */\r\n#define APU_DVFS_DBG_REG5_CPU1_FREQ_CTRL(x)      (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG5_CPU1_FREQ_CTRL_SHIFT)) & APU_DVFS_DBG_REG5_CPU1_FREQ_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG5_APU_BUCK_LVL_CTRL_MASK (0x3E0000U)\r\n#define APU_DVFS_DBG_REG5_APU_BUCK_LVL_CTRL_SHIFT (17U)\r\n/*! APU_BUCK_LVL_CTRL - APU BUCK Level Control */\r\n#define APU_DVFS_DBG_REG5_APU_BUCK_LVL_CTRL(x)   (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG5_APU_BUCK_LVL_CTRL_SHIFT)) & APU_DVFS_DBG_REG5_APU_BUCK_LVL_CTRL_MASK)\r\n\r\n#define APU_DVFS_DBG_REG5_SW_VOL_REQ_MASK        (0x7C00000U)\r\n#define APU_DVFS_DBG_REG5_SW_VOL_REQ_SHIFT       (22U)\r\n/*! SW_VOL_REQ - SW Vol Request */\r\n#define APU_DVFS_DBG_REG5_SW_VOL_REQ(x)          (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG5_SW_VOL_REQ_SHIFT)) & APU_DVFS_DBG_REG5_SW_VOL_REQ_MASK)\r\n\r\n#define APU_DVFS_DBG_REG5_HW_VOL_REQ_MASK        (0xF8000000U)\r\n#define APU_DVFS_DBG_REG5_HW_VOL_REQ_SHIFT       (27U)\r\n/*! HW_VOL_REQ - HW Vol Request */\r\n#define APU_DVFS_DBG_REG5_HW_VOL_REQ(x)          (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_REG5_HW_VOL_REQ_SHIFT)) & APU_DVFS_DBG_REG5_HW_VOL_REQ_MASK)\r\n/*! @} */\r\n\r\n/*! @name DVFS_DBG_STATUS - DVFS Debug Status */\r\n/*! @{ */\r\n\r\n#define APU_DVFS_DBG_STATUS_DVFS_DBG_LOG_DONE_MASK (0x1U)\r\n#define APU_DVFS_DBG_STATUS_DVFS_DBG_LOG_DONE_SHIFT (0U)\r\n/*! DVFS_DBG_LOG_DONE - DVFS Debug Log Done */\r\n#define APU_DVFS_DBG_STATUS_DVFS_DBG_LOG_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_STATUS_DVFS_DBG_LOG_DONE_SHIFT)) & APU_DVFS_DBG_STATUS_DVFS_DBG_LOG_DONE_MASK)\r\n\r\n#define APU_DVFS_DBG_STATUS_BUCK_LVL_REACHED_MASK (0x3EU)\r\n#define APU_DVFS_DBG_STATUS_BUCK_LVL_REACHED_SHIFT (1U)\r\n/*! BUCK_LVL_REACHED - voltage corresponding to PMIC code 0x2 */\r\n#define APU_DVFS_DBG_STATUS_BUCK_LVL_REACHED(x)  (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_STATUS_BUCK_LVL_REACHED_SHIFT)) & APU_DVFS_DBG_STATUS_BUCK_LVL_REACHED_MASK)\r\n\r\n#define APU_DVFS_DBG_STATUS_KEEP_DVFS_LVL_ACTIVE_MASK (0x40U)\r\n#define APU_DVFS_DBG_STATUS_KEEP_DVFS_LVL_ACTIVE_SHIFT (6U)\r\n/*! KEEP_DVFS_LVL_ACTIVE - Keep DVFS Level Active */\r\n#define APU_DVFS_DBG_STATUS_KEEP_DVFS_LVL_ACTIVE(x) (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_STATUS_KEEP_DVFS_LVL_ACTIVE_SHIFT)) & APU_DVFS_DBG_STATUS_KEEP_DVFS_LVL_ACTIVE_MASK)\r\n\r\n#define APU_DVFS_DBG_STATUS_RESET_COUNTER_SYNCED_MASK (0x80U)\r\n#define APU_DVFS_DBG_STATUS_RESET_COUNTER_SYNCED_SHIFT (7U)\r\n/*! RESET_COUNTER_SYNCED - voltage corresponding to PMIC code 0x3 */\r\n#define APU_DVFS_DBG_STATUS_RESET_COUNTER_SYNCED(x) (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_STATUS_RESET_COUNTER_SYNCED_SHIFT)) & APU_DVFS_DBG_STATUS_RESET_COUNTER_SYNCED_MASK)\r\n\r\n#define APU_DVFS_DBG_STATUS_SW_LOCK_GAURD_EN_MASK (0x100U)\r\n#define APU_DVFS_DBG_STATUS_SW_LOCK_GAURD_EN_SHIFT (8U)\r\n/*! SW_LOCK_GAURD_EN - SW Lock Guard Enable */\r\n#define APU_DVFS_DBG_STATUS_SW_LOCK_GAURD_EN(x)  (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_STATUS_SW_LOCK_GAURD_EN_SHIFT)) & APU_DVFS_DBG_STATUS_SW_LOCK_GAURD_EN_MASK)\r\n\r\n#define APU_DVFS_DBG_STATUS_DVFS_CLK_SEL_DVFSCK_MASK (0x200U)\r\n#define APU_DVFS_DBG_STATUS_DVFS_CLK_SEL_DVFSCK_SHIFT (9U)\r\n/*! DVFS_CLK_SEL_DVFSCK - DVFS Clock Select DVFSCK */\r\n#define APU_DVFS_DBG_STATUS_DVFS_CLK_SEL_DVFSCK(x) (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_STATUS_DVFS_CLK_SEL_DVFSCK_SHIFT)) & APU_DVFS_DBG_STATUS_DVFS_CLK_SEL_DVFSCK_MASK)\r\n\r\n#define APU_DVFS_DBG_STATUS_EAS_SEL_MASK         (0x400U)\r\n#define APU_DVFS_DBG_STATUS_EAS_SEL_SHIFT        (10U)\r\n/*! EAS_SEL - EAS Select */\r\n#define APU_DVFS_DBG_STATUS_EAS_SEL(x)           (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_STATUS_EAS_SEL_SHIFT)) & APU_DVFS_DBG_STATUS_EAS_SEL_MASK)\r\n\r\n#define APU_DVFS_DBG_STATUS_SW_FREQ_GAURD_EN_MASK (0x800U)\r\n#define APU_DVFS_DBG_STATUS_SW_FREQ_GAURD_EN_SHIFT (11U)\r\n/*! SW_FREQ_GAURD_EN - SW Frequency Guard Enable */\r\n#define APU_DVFS_DBG_STATUS_SW_FREQ_GAURD_EN(x)  (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_STATUS_SW_FREQ_GAURD_EN_SHIFT)) & APU_DVFS_DBG_STATUS_SW_FREQ_GAURD_EN_MASK)\r\n\r\n#define APU_DVFS_DBG_STATUS_PMIC_TIMER_DONE_REG_MASK (0x1000U)\r\n#define APU_DVFS_DBG_STATUS_PMIC_TIMER_DONE_REG_SHIFT (12U)\r\n/*! PMIC_TIMER_DONE_REG - PMIC Timer Done */\r\n#define APU_DVFS_DBG_STATUS_PMIC_TIMER_DONE_REG(x) (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_STATUS_PMIC_TIMER_DONE_REG_SHIFT)) & APU_DVFS_DBG_STATUS_PMIC_TIMER_DONE_REG_MASK)\r\n\r\n#define APU_DVFS_DBG_STATUS_WLAN_VOL_LVL_REACHED_MASK (0x8000U)\r\n#define APU_DVFS_DBG_STATUS_WLAN_VOL_LVL_REACHED_SHIFT (15U)\r\n/*! WLAN_VOL_LVL_REACHED - WLAN Vol Level Reached */\r\n#define APU_DVFS_DBG_STATUS_WLAN_VOL_LVL_REACHED(x) (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_STATUS_WLAN_VOL_LVL_REACHED_SHIFT)) & APU_DVFS_DBG_STATUS_WLAN_VOL_LVL_REACHED_MASK)\r\n\r\n#define APU_DVFS_DBG_STATUS_NFC_VOL_LVL_REACHED_MASK (0x10000U)\r\n#define APU_DVFS_DBG_STATUS_NFC_VOL_LVL_REACHED_SHIFT (16U)\r\n/*! NFC_VOL_LVL_REACHED - NFC Vol Level Reached */\r\n#define APU_DVFS_DBG_STATUS_NFC_VOL_LVL_REACHED(x) (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_STATUS_NFC_VOL_LVL_REACHED_SHIFT)) & APU_DVFS_DBG_STATUS_NFC_VOL_LVL_REACHED_MASK)\r\n\r\n#define APU_DVFS_DBG_STATUS_NOM_VOL_LVL_REACHED_MASK (0x20000U)\r\n#define APU_DVFS_DBG_STATUS_NOM_VOL_LVL_REACHED_SHIFT (17U)\r\n/*! NOM_VOL_LVL_REACHED - Nominal Vol Level Reached */\r\n#define APU_DVFS_DBG_STATUS_NOM_VOL_LVL_REACHED(x) (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_STATUS_NOM_VOL_LVL_REACHED_SHIFT)) & APU_DVFS_DBG_STATUS_NOM_VOL_LVL_REACHED_MASK)\r\n\r\n#define APU_DVFS_DBG_STATUS_VOL_REQ_MASK         (0x3C0000U)\r\n#define APU_DVFS_DBG_STATUS_VOL_REQ_SHIFT        (18U)\r\n/*! VOL_REQ - Vol Request */\r\n#define APU_DVFS_DBG_STATUS_VOL_REQ(x)           (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_STATUS_VOL_REQ_SHIFT)) & APU_DVFS_DBG_STATUS_VOL_REQ_MASK)\r\n\r\n#define APU_DVFS_DBG_STATUS_SW_VOL_REQ_MASK      (0x7C00000U)\r\n#define APU_DVFS_DBG_STATUS_SW_VOL_REQ_SHIFT     (22U)\r\n/*! SW_VOL_REQ - SW Vol Request */\r\n#define APU_DVFS_DBG_STATUS_SW_VOL_REQ(x)        (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_STATUS_SW_VOL_REQ_SHIFT)) & APU_DVFS_DBG_STATUS_SW_VOL_REQ_MASK)\r\n\r\n#define APU_DVFS_DBG_STATUS_HW_VOL_REQ_MASK      (0xF8000000U)\r\n#define APU_DVFS_DBG_STATUS_HW_VOL_REQ_SHIFT     (27U)\r\n/*! HW_VOL_REQ - HW Vol Request */\r\n#define APU_DVFS_DBG_STATUS_HW_VOL_REQ(x)        (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_STATUS_HW_VOL_REQ_SHIFT)) & APU_DVFS_DBG_STATUS_HW_VOL_REQ_MASK)\r\n/*! @} */\r\n\r\n/*! @name DVFS_DBG_PATTERN_MASK - DVFS Debug Patter Mask */\r\n/*! @{ */\r\n\r\n#define APU_DVFS_DBG_PATTERN_MASK_MASK_MASK      (0xFFFFFFFFU)\r\n#define APU_DVFS_DBG_PATTERN_MASK_MASK_SHIFT     (0U)\r\n/*! MASK - Mask to Delay */\r\n#define APU_DVFS_DBG_PATTERN_MASK_MASK(x)        (((uint32_t)(((uint32_t)(x)) << APU_DVFS_DBG_PATTERN_MASK_MASK_SHIFT)) & APU_DVFS_DBG_PATTERN_MASK_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name DVFS_PMIC_TIMER - DVFS PMIC Timer */\r\n/*! @{ */\r\n\r\n#define APU_DVFS_PMIC_TIMER_REF_CNT_MASK         (0xFFFFU)\r\n#define APU_DVFS_PMIC_TIMER_REF_CNT_SHIFT        (0U)\r\n/*! REF_CNT - Reference Count */\r\n#define APU_DVFS_PMIC_TIMER_REF_CNT(x)           (((uint32_t)(((uint32_t)(x)) << APU_DVFS_PMIC_TIMER_REF_CNT_SHIFT)) & APU_DVFS_PMIC_TIMER_REF_CNT_MASK)\r\n\r\n#define APU_DVFS_PMIC_TIMER_SLP_CNT_MASK         (0xF0000U)\r\n#define APU_DVFS_PMIC_TIMER_SLP_CNT_SHIFT        (16U)\r\n/*! SLP_CNT - Sleep Counts */\r\n#define APU_DVFS_PMIC_TIMER_SLP_CNT(x)           (((uint32_t)(((uint32_t)(x)) << APU_DVFS_PMIC_TIMER_SLP_CNT_SHIFT)) & APU_DVFS_PMIC_TIMER_SLP_CNT_MASK)\r\n\r\n#define APU_DVFS_PMIC_TIMER_ACTIVE_CNT_MASK      (0xFFF00000U)\r\n#define APU_DVFS_PMIC_TIMER_ACTIVE_CNT_SHIFT     (20U)\r\n/*! ACTIVE_CNT - Active Count */\r\n#define APU_DVFS_PMIC_TIMER_ACTIVE_CNT(x)        (((uint32_t)(((uint32_t)(x)) << APU_DVFS_PMIC_TIMER_ACTIVE_CNT_SHIFT)) & APU_DVFS_PMIC_TIMER_ACTIVE_CNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name DVFS_PMIC_MAP - DVFS PMIC Map */\r\n/*! @{ */\r\n\r\n#define APU_DVFS_PMIC_MAP_DVFS_VOL_FOR_PMIC0_MASK (0x7FU)\r\n#define APU_DVFS_PMIC_MAP_DVFS_VOL_FOR_PMIC0_SHIFT (0U)\r\n/*! DVFS_VOL_FOR_PMIC0 - DVFS Vol for PMIC 0 */\r\n#define APU_DVFS_PMIC_MAP_DVFS_VOL_FOR_PMIC0(x)  (((uint32_t)(((uint32_t)(x)) << APU_DVFS_PMIC_MAP_DVFS_VOL_FOR_PMIC0_SHIFT)) & APU_DVFS_PMIC_MAP_DVFS_VOL_FOR_PMIC0_MASK)\r\n\r\n#define APU_DVFS_PMIC_MAP_DVFS_VOL_FOR_PMIC1_MASK (0x7F00U)\r\n#define APU_DVFS_PMIC_MAP_DVFS_VOL_FOR_PMIC1_SHIFT (8U)\r\n/*! DVFS_VOL_FOR_PMIC1 - DVFS Vol for PMIC 1 */\r\n#define APU_DVFS_PMIC_MAP_DVFS_VOL_FOR_PMIC1(x)  (((uint32_t)(((uint32_t)(x)) << APU_DVFS_PMIC_MAP_DVFS_VOL_FOR_PMIC1_SHIFT)) & APU_DVFS_PMIC_MAP_DVFS_VOL_FOR_PMIC1_MASK)\r\n\r\n#define APU_DVFS_PMIC_MAP_DVFS_VOL_FOR_PMIC2_MASK (0x7F0000U)\r\n#define APU_DVFS_PMIC_MAP_DVFS_VOL_FOR_PMIC2_SHIFT (16U)\r\n/*! DVFS_VOL_FOR_PMIC2 - DVFS Vol for PMIC 2 */\r\n#define APU_DVFS_PMIC_MAP_DVFS_VOL_FOR_PMIC2(x)  (((uint32_t)(((uint32_t)(x)) << APU_DVFS_PMIC_MAP_DVFS_VOL_FOR_PMIC2_SHIFT)) & APU_DVFS_PMIC_MAP_DVFS_VOL_FOR_PMIC2_MASK)\r\n\r\n#define APU_DVFS_PMIC_MAP_DVFS_VOL_FOR_PMIC3_MASK (0x7F000000U)\r\n#define APU_DVFS_PMIC_MAP_DVFS_VOL_FOR_PMIC3_SHIFT (24U)\r\n/*! DVFS_VOL_FOR_PMIC3 - DVFS Vol for PMIC 3 */\r\n#define APU_DVFS_PMIC_MAP_DVFS_VOL_FOR_PMIC3(x)  (((uint32_t)(((uint32_t)(x)) << APU_DVFS_PMIC_MAP_DVFS_VOL_FOR_PMIC3_SHIFT)) & APU_DVFS_PMIC_MAP_DVFS_VOL_FOR_PMIC3_MASK)\r\n\r\n#define APU_DVFS_PMIC_MAP_USE_PMIC_TIMER_MASK    (0x80000000U)\r\n#define APU_DVFS_PMIC_MAP_USE_PMIC_TIMER_SHIFT   (31U)\r\n/*! USE_PMIC_TIMER - Use PMIC Timer */\r\n#define APU_DVFS_PMIC_MAP_USE_PMIC_TIMER(x)      (((uint32_t)(((uint32_t)(x)) << APU_DVFS_PMIC_MAP_USE_PMIC_TIMER_SHIFT)) & APU_DVFS_PMIC_MAP_USE_PMIC_TIMER_MASK)\r\n/*! @} */\r\n\r\n/*! @name LDO_CTRL - LDO Control */\r\n/*! @{ */\r\n\r\n#define APU_LDO_CTRL_MAIN_DELAY_CNT_EN_MASK      (0x1U)\r\n#define APU_LDO_CTRL_MAIN_DELAY_CNT_EN_SHIFT     (0U)\r\n/*! MAIN_DELAY_CNT_EN - Main Delay Count Enable */\r\n#define APU_LDO_CTRL_MAIN_DELAY_CNT_EN(x)        (((uint32_t)(((uint32_t)(x)) << APU_LDO_CTRL_MAIN_DELAY_CNT_EN_SHIFT)) & APU_LDO_CTRL_MAIN_DELAY_CNT_EN_MASK)\r\n\r\n#define APU_LDO_CTRL_BACKUP_DELAY_CNT_EN_MASK    (0x2U)\r\n#define APU_LDO_CTRL_BACKUP_DELAY_CNT_EN_SHIFT   (1U)\r\n/*! BACKUP_DELAY_CNT_EN - Backup Delay Count Enable */\r\n#define APU_LDO_CTRL_BACKUP_DELAY_CNT_EN(x)      (((uint32_t)(((uint32_t)(x)) << APU_LDO_CTRL_BACKUP_DELAY_CNT_EN_SHIFT)) & APU_LDO_CTRL_BACKUP_DELAY_CNT_EN_MASK)\r\n\r\n#define APU_LDO_CTRL_MAIN_DELAY_COUNTER_VAL_MASK (0x30U)\r\n#define APU_LDO_CTRL_MAIN_DELAY_COUNTER_VAL_SHIFT (4U)\r\n/*! MAIN_DELAY_COUNTER_VAL - Main Delay Counter Value */\r\n#define APU_LDO_CTRL_MAIN_DELAY_COUNTER_VAL(x)   (((uint32_t)(((uint32_t)(x)) << APU_LDO_CTRL_MAIN_DELAY_COUNTER_VAL_SHIFT)) & APU_LDO_CTRL_MAIN_DELAY_COUNTER_VAL_MASK)\r\n\r\n#define APU_LDO_CTRL_BACKUP_DELAY_COUNTER_VAL_MASK (0xFF00U)\r\n#define APU_LDO_CTRL_BACKUP_DELAY_COUNTER_VAL_SHIFT (8U)\r\n/*! BACKUP_DELAY_COUNTER_VAL - Backup Delay Counter Value */\r\n#define APU_LDO_CTRL_BACKUP_DELAY_COUNTER_VAL(x) (((uint32_t)(((uint32_t)(x)) << APU_LDO_CTRL_BACKUP_DELAY_COUNTER_VAL_SHIFT)) & APU_LDO_CTRL_BACKUP_DELAY_COUNTER_VAL_MASK)\r\n\r\n#define APU_LDO_CTRL_USE_XOSC_EN_AS_SEL_MASK     (0x40000000U)\r\n#define APU_LDO_CTRL_USE_XOSC_EN_AS_SEL_SHIFT    (30U)\r\n/*! USE_XOSC_EN_AS_SEL - Use XOSC Enable as Select */\r\n#define APU_LDO_CTRL_USE_XOSC_EN_AS_SEL(x)       (((uint32_t)(((uint32_t)(x)) << APU_LDO_CTRL_USE_XOSC_EN_AS_SEL_SHIFT)) & APU_LDO_CTRL_USE_XOSC_EN_AS_SEL_MASK)\r\n\r\n#define APU_LDO_CTRL_KEEP_LDO_MAIN_WHILE_SLP_MASK (0x80000000U)\r\n#define APU_LDO_CTRL_KEEP_LDO_MAIN_WHILE_SLP_SHIFT (31U)\r\n/*! KEEP_LDO_MAIN_WHILE_SLP - Keep LDO Main While Sleep */\r\n#define APU_LDO_CTRL_KEEP_LDO_MAIN_WHILE_SLP(x)  (((uint32_t)(((uint32_t)(x)) << APU_LDO_CTRL_KEEP_LDO_MAIN_WHILE_SLP_SHIFT)) & APU_LDO_CTRL_KEEP_LDO_MAIN_WHILE_SLP_MASK)\r\n/*! @} */\r\n\r\n/*! @name LDO_BACKUP_LVL_MAP1 - LDO Backup Level Map 1 */\r\n/*! @{ */\r\n\r\n#define APU_LDO_BACKUP_LVL_MAP1_LDO_BACKUP_LVL_MAP1_MASK (0xFFFFFFFFU)\r\n#define APU_LDO_BACKUP_LVL_MAP1_LDO_BACKUP_LVL_MAP1_SHIFT (0U)\r\n/*! LDO_BACKUP_LVL_MAP1 - LDO Backup Level Map 1 */\r\n#define APU_LDO_BACKUP_LVL_MAP1_LDO_BACKUP_LVL_MAP1(x) (((uint32_t)(((uint32_t)(x)) << APU_LDO_BACKUP_LVL_MAP1_LDO_BACKUP_LVL_MAP1_SHIFT)) & APU_LDO_BACKUP_LVL_MAP1_LDO_BACKUP_LVL_MAP1_MASK)\r\n/*! @} */\r\n\r\n/*! @name LDO_BACKUP_LVL_MAP2 - LDO Backup Level Map 2 */\r\n/*! @{ */\r\n\r\n#define APU_LDO_BACKUP_LVL_MAP2_LDO_BACKUP_LVL_MAP2_MASK (0xFFFFFFFFU)\r\n#define APU_LDO_BACKUP_LVL_MAP2_LDO_BACKUP_LVL_MAP2_SHIFT (0U)\r\n/*! LDO_BACKUP_LVL_MAP2 - LDO Backup Level Map 2 */\r\n#define APU_LDO_BACKUP_LVL_MAP2_LDO_BACKUP_LVL_MAP2(x) (((uint32_t)(((uint32_t)(x)) << APU_LDO_BACKUP_LVL_MAP2_LDO_BACKUP_LVL_MAP2_SHIFT)) & APU_LDO_BACKUP_LVL_MAP2_LDO_BACKUP_LVL_MAP2_MASK)\r\n/*! @} */\r\n\r\n/*! @name LDO_STATUS - LDO Status */\r\n/*! @{ */\r\n\r\n#define APU_LDO_STATUS_LDO_BACKUP_LVL_MASK       (0x7U)\r\n#define APU_LDO_STATUS_LDO_BACKUP_LVL_SHIFT      (0U)\r\n/*! LDO_BACKUP_LVL - LDO Backup Level */\r\n#define APU_LDO_STATUS_LDO_BACKUP_LVL(x)         (((uint32_t)(((uint32_t)(x)) << APU_LDO_STATUS_LDO_BACKUP_LVL_SHIFT)) & APU_LDO_STATUS_LDO_BACKUP_LVL_MASK)\r\n\r\n#define APU_LDO_STATUS_LDO_MAIN_LVL_MASK         (0xF0U)\r\n#define APU_LDO_STATUS_LDO_MAIN_LVL_SHIFT        (4U)\r\n/*! LDO_MAIN_LVL - LDO Main Level */\r\n#define APU_LDO_STATUS_LDO_MAIN_LVL(x)           (((uint32_t)(((uint32_t)(x)) << APU_LDO_STATUS_LDO_MAIN_LVL_SHIFT)) & APU_LDO_STATUS_LDO_MAIN_LVL_MASK)\r\n\r\n#define APU_LDO_STATUS_MAIN_PD_DELAY_CNT_MASK    (0x300U)\r\n#define APU_LDO_STATUS_MAIN_PD_DELAY_CNT_SHIFT   (8U)\r\n/*! MAIN_PD_DELAY_CNT - Main Powerdown Delay Count */\r\n#define APU_LDO_STATUS_MAIN_PD_DELAY_CNT(x)      (((uint32_t)(((uint32_t)(x)) << APU_LDO_STATUS_MAIN_PD_DELAY_CNT_SHIFT)) & APU_LDO_STATUS_MAIN_PD_DELAY_CNT_MASK)\r\n\r\n#define APU_LDO_STATUS_MAIN_PD_DELAY_CNT_MET_MASK (0x400U)\r\n#define APU_LDO_STATUS_MAIN_PD_DELAY_CNT_MET_SHIFT (10U)\r\n/*! MAIN_PD_DELAY_CNT_MET - Main Powerdown Delay Count Met */\r\n#define APU_LDO_STATUS_MAIN_PD_DELAY_CNT_MET(x)  (((uint32_t)(((uint32_t)(x)) << APU_LDO_STATUS_MAIN_PD_DELAY_CNT_MET_SHIFT)) & APU_LDO_STATUS_MAIN_PD_DELAY_CNT_MET_MASK)\r\n\r\n#define APU_LDO_STATUS_LDO_MAIN_PD_MASK          (0x800U)\r\n#define APU_LDO_STATUS_LDO_MAIN_PD_SHIFT         (11U)\r\n/*! LDO_MAIN_PD - LDO Main Powerdown */\r\n#define APU_LDO_STATUS_LDO_MAIN_PD(x)            (((uint32_t)(((uint32_t)(x)) << APU_LDO_STATUS_LDO_MAIN_PD_SHIFT)) & APU_LDO_STATUS_LDO_MAIN_PD_MASK)\r\n\r\n#define APU_LDO_STATUS_ACTIVE_SEL_MASK           (0x1000U)\r\n#define APU_LDO_STATUS_ACTIVE_SEL_SHIFT          (12U)\r\n/*! ACTIVE_SEL - Active Select */\r\n#define APU_LDO_STATUS_ACTIVE_SEL(x)             (((uint32_t)(((uint32_t)(x)) << APU_LDO_STATUS_ACTIVE_SEL_SHIFT)) & APU_LDO_STATUS_ACTIVE_SEL_MASK)\r\n\r\n#define APU_LDO_STATUS_BACK_DELAY_CNT_MET_MASK   (0x2000U)\r\n#define APU_LDO_STATUS_BACK_DELAY_CNT_MET_SHIFT  (13U)\r\n/*! BACK_DELAY_CNT_MET - Back Delay Count Met */\r\n#define APU_LDO_STATUS_BACK_DELAY_CNT_MET(x)     (((uint32_t)(((uint32_t)(x)) << APU_LDO_STATUS_BACK_DELAY_CNT_MET_SHIFT)) & APU_LDO_STATUS_BACK_DELAY_CNT_MET_MASK)\r\n\r\n#define APU_LDO_STATUS_D_LDO_BACKUP_EN_MASK      (0x4000U)\r\n#define APU_LDO_STATUS_D_LDO_BACKUP_EN_SHIFT     (14U)\r\n/*! D_LDO_BACKUP_EN - D LDO Backup Enable */\r\n#define APU_LDO_STATUS_D_LDO_BACKUP_EN(x)        (((uint32_t)(((uint32_t)(x)) << APU_LDO_STATUS_D_LDO_BACKUP_EN_SHIFT)) & APU_LDO_STATUS_D_LDO_BACKUP_EN_MASK)\r\n\r\n#define APU_LDO_STATUS_LDO_BACKUP_EN_MASK        (0x8000U)\r\n#define APU_LDO_STATUS_LDO_BACKUP_EN_SHIFT       (15U)\r\n/*! LDO_BACKUP_EN - LDO Backup Enable */\r\n#define APU_LDO_STATUS_LDO_BACKUP_EN(x)          (((uint32_t)(((uint32_t)(x)) << APU_LDO_STATUS_LDO_BACKUP_EN_SHIFT)) & APU_LDO_STATUS_LDO_BACKUP_EN_MASK)\r\n\r\n#define APU_LDO_STATUS_BACKUP_DELAY_CNT_MASK     (0xFF0000U)\r\n#define APU_LDO_STATUS_BACKUP_DELAY_CNT_SHIFT    (16U)\r\n/*! BACKUP_DELAY_CNT - Backup Delay Count (to check testbus) */\r\n#define APU_LDO_STATUS_BACKUP_DELAY_CNT(x)       (((uint32_t)(((uint32_t)(x)) << APU_LDO_STATUS_BACKUP_DELAY_CNT_SHIFT)) & APU_LDO_STATUS_BACKUP_DELAY_CNT_MASK)\r\n\r\n#define APU_LDO_STATUS_BKUP_LVL2_SEL_MASK        (0x1000000U)\r\n#define APU_LDO_STATUS_BKUP_LVL2_SEL_SHIFT       (24U)\r\n/*! BKUP_LVL2_SEL - Backup Level 2 Select */\r\n#define APU_LDO_STATUS_BKUP_LVL2_SEL(x)          (((uint32_t)(((uint32_t)(x)) << APU_LDO_STATUS_BKUP_LVL2_SEL_SHIFT)) & APU_LDO_STATUS_BKUP_LVL2_SEL_MASK)\r\n\r\n#define APU_LDO_STATUS_BKUP_LVL1_SEL_MASK        (0x2000000U)\r\n#define APU_LDO_STATUS_BKUP_LVL1_SEL_SHIFT       (25U)\r\n/*! BKUP_LVL1_SEL - Backup Level 1 Select */\r\n#define APU_LDO_STATUS_BKUP_LVL1_SEL(x)          (((uint32_t)(((uint32_t)(x)) << APU_LDO_STATUS_BKUP_LVL1_SEL_SHIFT)) & APU_LDO_STATUS_BKUP_LVL1_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name RC32_CAL_CTRL - RC32 Calibration Control */\r\n/*! @{ */\r\n\r\n#define APU_RC32_CAL_CTRL_RC32_FULL_CAL_EN_MASK  (0x1U)\r\n#define APU_RC32_CAL_CTRL_RC32_FULL_CAL_EN_SHIFT (0U)\r\n/*! RC32_FULL_CAL_EN - RC32 Full Calibration Enable */\r\n#define APU_RC32_CAL_CTRL_RC32_FULL_CAL_EN(x)    (((uint32_t)(((uint32_t)(x)) << APU_RC32_CAL_CTRL_RC32_FULL_CAL_EN_SHIFT)) & APU_RC32_CAL_CTRL_RC32_FULL_CAL_EN_MASK)\r\n\r\n#define APU_RC32_CAL_CTRL_RC32_PARTIAL_CAL_EN_MASK (0x2U)\r\n#define APU_RC32_CAL_CTRL_RC32_PARTIAL_CAL_EN_SHIFT (1U)\r\n/*! RC32_PARTIAL_CAL_EN - RC32 Partial Calibration Enable */\r\n#define APU_RC32_CAL_CTRL_RC32_PARTIAL_CAL_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_RC32_CAL_CTRL_RC32_PARTIAL_CAL_EN_SHIFT)) & APU_RC32_CAL_CTRL_RC32_PARTIAL_CAL_EN_MASK)\r\n\r\n#define APU_RC32_CAL_CTRL_RC32_PARTIAL_CAL_EN_ON_BT_WKUP_MASK (0x4U)\r\n#define APU_RC32_CAL_CTRL_RC32_PARTIAL_CAL_EN_ON_BT_WKUP_SHIFT (2U)\r\n/*! RC32_PARTIAL_CAL_EN_ON_BT_WKUP - RC32 Partial Calibration Enable on Bluetooth Wakeup */\r\n#define APU_RC32_CAL_CTRL_RC32_PARTIAL_CAL_EN_ON_BT_WKUP(x) (((uint32_t)(((uint32_t)(x)) << APU_RC32_CAL_CTRL_RC32_PARTIAL_CAL_EN_ON_BT_WKUP_SHIFT)) & APU_RC32_CAL_CTRL_RC32_PARTIAL_CAL_EN_ON_BT_WKUP_MASK)\r\n\r\n#define APU_RC32_CAL_CTRL_USE_RC32_CAL_DONE_MASK (0x8U)\r\n#define APU_RC32_CAL_CTRL_USE_RC32_CAL_DONE_SHIFT (3U)\r\n/*! USE_RC32_CAL_DONE - Use RC32 Calibration Done */\r\n#define APU_RC32_CAL_CTRL_USE_RC32_CAL_DONE(x)   (((uint32_t)(((uint32_t)(x)) << APU_RC32_CAL_CTRL_USE_RC32_CAL_DONE_SHIFT)) & APU_RC32_CAL_CTRL_USE_RC32_CAL_DONE_MASK)\r\n\r\n#define APU_RC32_CAL_CTRL_RC32_CAL_VOL_VAL_MASK  (0x7F0U)\r\n#define APU_RC32_CAL_CTRL_RC32_CAL_VOL_VAL_SHIFT (4U)\r\n/*! RC32_CAL_VOL_VAL - RC32 Calibration Vol Value */\r\n#define APU_RC32_CAL_CTRL_RC32_CAL_VOL_VAL(x)    (((uint32_t)(((uint32_t)(x)) << APU_RC32_CAL_CTRL_RC32_CAL_VOL_VAL_SHIFT)) & APU_RC32_CAL_CTRL_RC32_CAL_VOL_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name RC32_CAL_SLPCLK_TIMER - RC32 Calibration Sleep Clock Timer */\r\n/*! @{ */\r\n\r\n#define APU_RC32_CAL_SLPCLK_TIMER_RC32_CAL_SLPCLK_TIMER_MASK (0xFFFFFFFFU)\r\n#define APU_RC32_CAL_SLPCLK_TIMER_RC32_CAL_SLPCLK_TIMER_SHIFT (0U)\r\n/*! RC32_CAL_SLPCLK_TIMER - RC32 Calibration Sleep Clock Timer */\r\n#define APU_RC32_CAL_SLPCLK_TIMER_RC32_CAL_SLPCLK_TIMER(x) (((uint32_t)(((uint32_t)(x)) << APU_RC32_CAL_SLPCLK_TIMER_RC32_CAL_SLPCLK_TIMER_SHIFT)) & APU_RC32_CAL_SLPCLK_TIMER_RC32_CAL_SLPCLK_TIMER_MASK)\r\n/*! @} */\r\n\r\n/*! @name RC32CAL_SLPCLK_CNT_RD - RC32 Calibration Sleep Clock Count Read */\r\n/*! @{ */\r\n\r\n#define APU_RC32CAL_SLPCLK_CNT_RD_RC32CAL_SLPCLK_CNT_RD_MASK (0xFFFFFFFFU)\r\n#define APU_RC32CAL_SLPCLK_CNT_RD_RC32CAL_SLPCLK_CNT_RD_SHIFT (0U)\r\n/*! RC32CAL_SLPCLK_CNT_RD - RC32 Calibration Sleep Clock Count Read */\r\n#define APU_RC32CAL_SLPCLK_CNT_RD_RC32CAL_SLPCLK_CNT_RD(x) (((uint32_t)(((uint32_t)(x)) << APU_RC32CAL_SLPCLK_CNT_RD_RC32CAL_SLPCLK_CNT_RD_SHIFT)) & APU_RC32CAL_SLPCLK_CNT_RD_RC32CAL_SLPCLK_CNT_RD_MASK)\r\n/*! @} */\r\n\r\n/*! @name TSTBUS_DATA - Testbus Data */\r\n/*! @{ */\r\n\r\n#define APU_TSTBUS_DATA_TSTBUS_DATA_MASK         (0xFFFFFFFFU)\r\n#define APU_TSTBUS_DATA_TSTBUS_DATA_SHIFT        (0U)\r\n/*! TSTBUS_DATA - Testbus Data */\r\n#define APU_TSTBUS_DATA_TSTBUS_DATA(x)           (((uint32_t)(((uint32_t)(x)) << APU_TSTBUS_DATA_TSTBUS_DATA_SHIFT)) & APU_TSTBUS_DATA_TSTBUS_DATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name TST_CTRL - Test Control */\r\n/*! @{ */\r\n\r\n#define APU_TST_CTRL_BT_BLE_TST_CTRL_MASK        (0x1U)\r\n#define APU_TST_CTRL_BT_BLE_TST_CTRL_SHIFT       (0U)\r\n/*! BT_BLE_TST_CTRL - Bluetooth BLE Test Control */\r\n#define APU_TST_CTRL_BT_BLE_TST_CTRL(x)          (((uint32_t)(((uint32_t)(x)) << APU_TST_CTRL_BT_BLE_TST_CTRL_SHIFT)) & APU_TST_CTRL_BT_BLE_TST_CTRL_MASK)\r\n\r\n#define APU_TST_CTRL_FM_TST_CTRL_MASK            (0x2U)\r\n#define APU_TST_CTRL_FM_TST_CTRL_SHIFT           (1U)\r\n/*! FM_TST_CTRL - FM Test Control */\r\n#define APU_TST_CTRL_FM_TST_CTRL(x)              (((uint32_t)(((uint32_t)(x)) << APU_TST_CTRL_FM_TST_CTRL_SHIFT)) & APU_TST_CTRL_FM_TST_CTRL_MASK)\r\n\r\n#define APU_TST_CTRL_NFC_TST_CTRL_MASK           (0x4U)\r\n#define APU_TST_CTRL_NFC_TST_CTRL_SHIFT          (2U)\r\n/*! NFC_TST_CTRL - NFC Test Control */\r\n#define APU_TST_CTRL_NFC_TST_CTRL(x)             (((uint32_t)(((uint32_t)(x)) << APU_TST_CTRL_NFC_TST_CTRL_SHIFT)) & APU_TST_CTRL_NFC_TST_CTRL_MASK)\r\n\r\n#define APU_TST_CTRL_CPU2_CP15_SLP_CTRL_MASK     (0x8U)\r\n#define APU_TST_CTRL_CPU2_CP15_SLP_CTRL_SHIFT    (3U)\r\n/*! CPU2_CP15_SLP_CTRL - CPU2 CP15 Sleep Control */\r\n#define APU_TST_CTRL_CPU2_CP15_SLP_CTRL(x)       (((uint32_t)(((uint32_t)(x)) << APU_TST_CTRL_CPU2_CP15_SLP_CTRL_SHIFT)) & APU_TST_CTRL_CPU2_CP15_SLP_CTRL_MASK)\r\n\r\n#define APU_TST_CTRL_WLAN_TST_CTRL_MASK          (0x10U)\r\n#define APU_TST_CTRL_WLAN_TST_CTRL_SHIFT         (4U)\r\n/*! WLAN_TST_CTRL - WLAN Test Control */\r\n#define APU_TST_CTRL_WLAN_TST_CTRL(x)            (((uint32_t)(((uint32_t)(x)) << APU_TST_CTRL_WLAN_TST_CTRL_SHIFT)) & APU_TST_CTRL_WLAN_TST_CTRL_MASK)\r\n\r\n#define APU_TST_CTRL_CPU1_CP15_SLP_CTRL_MASK     (0x20U)\r\n#define APU_TST_CTRL_CPU1_CP15_SLP_CTRL_SHIFT    (5U)\r\n/*! CPU1_CP15_SLP_CTRL - CPU1 CP15 Sleep Control */\r\n#define APU_TST_CTRL_CPU1_CP15_SLP_CTRL(x)       (((uint32_t)(((uint32_t)(x)) << APU_TST_CTRL_CPU1_CP15_SLP_CTRL_SHIFT)) & APU_TST_CTRL_CPU1_CP15_SLP_CTRL_MASK)\r\n\r\n#define APU_TST_CTRL_CPU2_HOST_TST_CTRL_MASK     (0xF80U)\r\n#define APU_TST_CTRL_CPU2_HOST_TST_CTRL_SHIFT    (7U)\r\n/*! CPU2_HOST_TST_CTRL - CPU2 Host Test Control */\r\n#define APU_TST_CTRL_CPU2_HOST_TST_CTRL(x)       (((uint32_t)(((uint32_t)(x)) << APU_TST_CTRL_CPU2_HOST_TST_CTRL_SHIFT)) & APU_TST_CTRL_CPU2_HOST_TST_CTRL_MASK)\r\n\r\n#define APU_TST_CTRL_TEST_MUX_SEL_SHIFT_BIT_MASK (0xF000U)\r\n#define APU_TST_CTRL_TEST_MUX_SEL_SHIFT_BIT_SHIFT (12U)\r\n/*! TEST_MUX_SEL_SHIFT_BIT - Test MUX Select Shift */\r\n#define APU_TST_CTRL_TEST_MUX_SEL_SHIFT_BIT(x)   (((uint32_t)(((uint32_t)(x)) << APU_TST_CTRL_TEST_MUX_SEL_SHIFT_BIT_SHIFT)) & APU_TST_CTRL_TEST_MUX_SEL_SHIFT_BIT_MASK)\r\n\r\n#define APU_TST_CTRL_APU_TESTBUS_SEL_MASK        (0x1F0000U)\r\n#define APU_TST_CTRL_APU_TESTBUS_SEL_SHIFT       (16U)\r\n/*! APU_TESTBUS_SEL - APU Testbus Select */\r\n#define APU_TST_CTRL_APU_TESTBUS_SEL(x)          (((uint32_t)(((uint32_t)(x)) << APU_TST_CTRL_APU_TESTBUS_SEL_SHIFT)) & APU_TST_CTRL_APU_TESTBUS_SEL_MASK)\r\n\r\n#define APU_TST_CTRL_APU_REG_SUBTEST_SEL_MASK    (0x600000U)\r\n#define APU_TST_CTRL_APU_REG_SUBTEST_SEL_SHIFT   (21U)\r\n/*! APU_REG_SUBTEST_SEL - APU Reg Subtest Select */\r\n#define APU_TST_CTRL_APU_REG_SUBTEST_SEL(x)      (((uint32_t)(((uint32_t)(x)) << APU_TST_CTRL_APU_REG_SUBTEST_SEL_SHIFT)) & APU_TST_CTRL_APU_REG_SUBTEST_SEL_MASK)\r\n\r\n#define APU_TST_CTRL_USE_SOC_APU_SUBTEST_MASK    (0x800000U)\r\n#define APU_TST_CTRL_USE_SOC_APU_SUBTEST_SHIFT   (23U)\r\n/*! USE_SOC_APU_SUBTEST - Use SoC APU Subtest */\r\n#define APU_TST_CTRL_USE_SOC_APU_SUBTEST(x)      (((uint32_t)(((uint32_t)(x)) << APU_TST_CTRL_USE_SOC_APU_SUBTEST_SHIFT)) & APU_TST_CTRL_USE_SOC_APU_SUBTEST_MASK)\r\n\r\n#define APU_TST_CTRL_HOST_TST_CTRL_MASK          (0x3000000U)\r\n#define APU_TST_CTRL_HOST_TST_CTRL_SHIFT         (24U)\r\n/*! HOST_TST_CTRL - Host Test Control */\r\n#define APU_TST_CTRL_HOST_TST_CTRL(x)            (((uint32_t)(((uint32_t)(x)) << APU_TST_CTRL_HOST_TST_CTRL_SHIFT)) & APU_TST_CTRL_HOST_TST_CTRL_MASK)\r\n\r\n#define APU_TST_CTRL_CPU1_HOST_TST_CTRL_MASK     (0x70000000U)\r\n#define APU_TST_CTRL_CPU1_HOST_TST_CTRL_SHIFT    (28U)\r\n/*! CPU1_HOST_TST_CTRL - CPU1 Host Test Control */\r\n#define APU_TST_CTRL_CPU1_HOST_TST_CTRL(x)       (((uint32_t)(((uint32_t)(x)) << APU_TST_CTRL_CPU1_HOST_TST_CTRL_SHIFT)) & APU_TST_CTRL_CPU1_HOST_TST_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name BCA_LTE_CTRL - BCA LTE Control */\r\n/*! @{ */\r\n\r\n#define APU_BCA_LTE_CTRL_LTE_CNT_START_MASK      (0x1U)\r\n#define APU_BCA_LTE_CTRL_LTE_CNT_START_SHIFT     (0U)\r\n/*! LTE_CNT_START - LTE Count Start */\r\n#define APU_BCA_LTE_CTRL_LTE_CNT_START(x)        (((uint32_t)(((uint32_t)(x)) << APU_BCA_LTE_CTRL_LTE_CNT_START_SHIFT)) & APU_BCA_LTE_CTRL_LTE_CNT_START_MASK)\r\n\r\n#define APU_BCA_LTE_CTRL_LTE_TMR1_INT_MASK       (0x2U)\r\n#define APU_BCA_LTE_CTRL_LTE_TMR1_INT_SHIFT      (1U)\r\n/*! LTE_TMR1_INT - LTE TMR1 Interrupt */\r\n#define APU_BCA_LTE_CTRL_LTE_TMR1_INT(x)         (((uint32_t)(((uint32_t)(x)) << APU_BCA_LTE_CTRL_LTE_TMR1_INT_SHIFT)) & APU_BCA_LTE_CTRL_LTE_TMR1_INT_MASK)\r\n\r\n#define APU_BCA_LTE_CTRL_LTE_TMR2_INT_MASK       (0x4U)\r\n#define APU_BCA_LTE_CTRL_LTE_TMR2_INT_SHIFT      (2U)\r\n/*! LTE_TMR2_INT - LTE TMR2 Interrupt */\r\n#define APU_BCA_LTE_CTRL_LTE_TMR2_INT(x)         (((uint32_t)(((uint32_t)(x)) << APU_BCA_LTE_CTRL_LTE_TMR2_INT_SHIFT)) & APU_BCA_LTE_CTRL_LTE_TMR2_INT_MASK)\r\n\r\n#define APU_BCA_LTE_CTRL_LTE_TMR1_CNT_FREEZE_MASK (0x8U)\r\n#define APU_BCA_LTE_CTRL_LTE_TMR1_CNT_FREEZE_SHIFT (3U)\r\n/*! LTE_TMR1_CNT_FREEZE - LTE TMR1 Count Freeze */\r\n#define APU_BCA_LTE_CTRL_LTE_TMR1_CNT_FREEZE(x)  (((uint32_t)(((uint32_t)(x)) << APU_BCA_LTE_CTRL_LTE_TMR1_CNT_FREEZE_SHIFT)) & APU_BCA_LTE_CTRL_LTE_TMR1_CNT_FREEZE_MASK)\r\n\r\n#define APU_BCA_LTE_CTRL_LTE_TMR2_CNT_FREEZE_MASK (0x10U)\r\n#define APU_BCA_LTE_CTRL_LTE_TMR2_CNT_FREEZE_SHIFT (4U)\r\n/*! LTE_TMR2_CNT_FREEZE - LTE TMR2 Count Freeze */\r\n#define APU_BCA_LTE_CTRL_LTE_TMR2_CNT_FREEZE(x)  (((uint32_t)(((uint32_t)(x)) << APU_BCA_LTE_CTRL_LTE_TMR2_CNT_FREEZE_SHIFT)) & APU_BCA_LTE_CTRL_LTE_TMR2_CNT_FREEZE_MASK)\r\n\r\n#define APU_BCA_LTE_CTRL_BCA_LTE_CLK_BYP_MASK    (0x80U)\r\n#define APU_BCA_LTE_CTRL_BCA_LTE_CLK_BYP_SHIFT   (7U)\r\n/*! BCA_LTE_CLK_BYP - BCA LTE Clock Bypass */\r\n#define APU_BCA_LTE_CTRL_BCA_LTE_CLK_BYP(x)      (((uint32_t)(((uint32_t)(x)) << APU_BCA_LTE_CTRL_BCA_LTE_CLK_BYP_SHIFT)) & APU_BCA_LTE_CTRL_BCA_LTE_CLK_BYP_MASK)\r\n\r\n#define APU_BCA_LTE_CTRL_BCA_WL_LTE_COEX_EN_MASK (0x8000U)\r\n#define APU_BCA_LTE_CTRL_BCA_WL_LTE_COEX_EN_SHIFT (15U)\r\n/*! BCA_WL_LTE_COEX_EN - BCA WLAN LTE Coexistence Enable */\r\n#define APU_BCA_LTE_CTRL_BCA_WL_LTE_COEX_EN(x)   (((uint32_t)(((uint32_t)(x)) << APU_BCA_LTE_CTRL_BCA_WL_LTE_COEX_EN_SHIFT)) & APU_BCA_LTE_CTRL_BCA_WL_LTE_COEX_EN_MASK)\r\n\r\n#define APU_BCA_LTE_CTRL_BCA_BT_LTE_COEX_EN_MASK (0x10000U)\r\n#define APU_BCA_LTE_CTRL_BCA_BT_LTE_COEX_EN_SHIFT (16U)\r\n/*! BCA_BT_LTE_COEX_EN - BCA Bluetooth LTE Coexistence Enable */\r\n#define APU_BCA_LTE_CTRL_BCA_BT_LTE_COEX_EN(x)   (((uint32_t)(((uint32_t)(x)) << APU_BCA_LTE_CTRL_BCA_BT_LTE_COEX_EN_SHIFT)) & APU_BCA_LTE_CTRL_BCA_BT_LTE_COEX_EN_MASK)\r\n\r\n#define APU_BCA_LTE_CTRL_USE_SLNA_WHILE_BT_MASK  (0x100000U)\r\n#define APU_BCA_LTE_CTRL_USE_SLNA_WHILE_BT_SHIFT (20U)\r\n/*! USE_SLNA_WHILE_BT - Use sLNA While Bluetooth */\r\n#define APU_BCA_LTE_CTRL_USE_SLNA_WHILE_BT(x)    (((uint32_t)(((uint32_t)(x)) << APU_BCA_LTE_CTRL_USE_SLNA_WHILE_BT_SHIFT)) & APU_BCA_LTE_CTRL_USE_SLNA_WHILE_BT_MASK)\r\n\r\n#define APU_BCA_LTE_CTRL_BCA_FORCE_ON_WHILE_BT_MASK (0x40000000U)\r\n#define APU_BCA_LTE_CTRL_BCA_FORCE_ON_WHILE_BT_SHIFT (30U)\r\n/*! BCA_FORCE_ON_WHILE_BT - BCA Force on While Bluetooth */\r\n#define APU_BCA_LTE_CTRL_BCA_FORCE_ON_WHILE_BT(x) (((uint32_t)(((uint32_t)(x)) << APU_BCA_LTE_CTRL_BCA_FORCE_ON_WHILE_BT_SHIFT)) & APU_BCA_LTE_CTRL_BCA_FORCE_ON_WHILE_BT_MASK)\r\n\r\n#define APU_BCA_LTE_CTRL_BCA_CLK_FW_EN_MASK      (0x80000000U)\r\n#define APU_BCA_LTE_CTRL_BCA_CLK_FW_EN_SHIFT     (31U)\r\n/*! BCA_CLK_FW_EN - BCA Clock FW Enable */\r\n#define APU_BCA_LTE_CTRL_BCA_CLK_FW_EN(x)        (((uint32_t)(((uint32_t)(x)) << APU_BCA_LTE_CTRL_BCA_CLK_FW_EN_SHIFT)) & APU_BCA_LTE_CTRL_BCA_CLK_FW_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BCA_LTE_TIMER1 - BCA LTE Timer 1 */\r\n/*! @{ */\r\n\r\n#define APU_BCA_LTE_TIMER1_BCA_LTE_TIMER1_MASK   (0xFFFFFFFFU)\r\n#define APU_BCA_LTE_TIMER1_BCA_LTE_TIMER1_SHIFT  (0U)\r\n/*! BCA_LTE_TIMER1 - BCA LTE Timer 1 */\r\n#define APU_BCA_LTE_TIMER1_BCA_LTE_TIMER1(x)     (((uint32_t)(((uint32_t)(x)) << APU_BCA_LTE_TIMER1_BCA_LTE_TIMER1_SHIFT)) & APU_BCA_LTE_TIMER1_BCA_LTE_TIMER1_MASK)\r\n/*! @} */\r\n\r\n/*! @name BCA_LTE_TIMER2 - BCA LTE Timer 2 */\r\n/*! @{ */\r\n\r\n#define APU_BCA_LTE_TIMER2_BCA_LTE_TIMER2_MASK   (0xFFFFFFFFU)\r\n#define APU_BCA_LTE_TIMER2_BCA_LTE_TIMER2_SHIFT  (0U)\r\n/*! BCA_LTE_TIMER2 - BCA LTE Timer 2 */\r\n#define APU_BCA_LTE_TIMER2_BCA_LTE_TIMER2(x)     (((uint32_t)(((uint32_t)(x)) << APU_BCA_LTE_TIMER2_BCA_LTE_TIMER2_SHIFT)) & APU_BCA_LTE_TIMER2_BCA_LTE_TIMER2_MASK)\r\n/*! @} */\r\n\r\n/*! @name BCA_MWS_WKUP_TIMER - BCA MWS Wakeup Timer */\r\n/*! @{ */\r\n\r\n#define APU_BCA_MWS_WKUP_TIMER_BCA_MWS_TIMER_MASK (0xFFFFU)\r\n#define APU_BCA_MWS_WKUP_TIMER_BCA_MWS_TIMER_SHIFT (0U)\r\n/*! BCA_MWS_TIMER - BCA MWS Timer */\r\n#define APU_BCA_MWS_WKUP_TIMER_BCA_MWS_TIMER(x)  (((uint32_t)(((uint32_t)(x)) << APU_BCA_MWS_WKUP_TIMER_BCA_MWS_TIMER_SHIFT)) & APU_BCA_MWS_WKUP_TIMER_BCA_MWS_TIMER_MASK)\r\n\r\n#define APU_BCA_MWS_WKUP_TIMER_BCA_BCN_WKUP_CNT_MASK (0xF0000000U)\r\n#define APU_BCA_MWS_WKUP_TIMER_BCA_BCN_WKUP_CNT_SHIFT (28U)\r\n/*! BCA_BCN_WKUP_CNT - BCA Beacon Wakeup Count */\r\n#define APU_BCA_MWS_WKUP_TIMER_BCA_BCN_WKUP_CNT(x) (((uint32_t)(((uint32_t)(x)) << APU_BCA_MWS_WKUP_TIMER_BCA_BCN_WKUP_CNT_SHIFT)) & APU_BCA_MWS_WKUP_TIMER_BCA_BCN_WKUP_CNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name BT2_CTRL - Bluetooth 2 Control */\r\n/*! @{ */\r\n\r\n#define APU_BT2_CTRL_BT_SLP_RDY_MASK             (0x1U)\r\n#define APU_BT2_CTRL_BT_SLP_RDY_SHIFT            (0U)\r\n/*! BT_SLP_RDY - Bluetooth Sleep Ready */\r\n#define APU_BT2_CTRL_BT_SLP_RDY(x)               (((uint32_t)(((uint32_t)(x)) << APU_BT2_CTRL_BT_SLP_RDY_SHIFT)) & APU_BT2_CTRL_BT_SLP_RDY_MASK)\r\n\r\n#define APU_BT2_CTRL_BT_SLP_RDYMASK_MASK         (0x2U)\r\n#define APU_BT2_CTRL_BT_SLP_RDYMASK_SHIFT        (1U)\r\n/*! BT_SLP_RDYMASK - Bluetoot Sleep Ready Mask */\r\n#define APU_BT2_CTRL_BT_SLP_RDYMASK(x)           (((uint32_t)(((uint32_t)(x)) << APU_BT2_CTRL_BT_SLP_RDYMASK_SHIFT)) & APU_BT2_CTRL_BT_SLP_RDYMASK_MASK)\r\n\r\n#define APU_BT2_CTRL_BT_SLP_RDY_FW_MASK          (0x4U)\r\n#define APU_BT2_CTRL_BT_SLP_RDY_FW_SHIFT         (2U)\r\n/*! BT_SLP_RDY_FW - Bluetooth Sleep Ready FW */\r\n#define APU_BT2_CTRL_BT_SLP_RDY_FW(x)            (((uint32_t)(((uint32_t)(x)) << APU_BT2_CTRL_BT_SLP_RDY_FW_SHIFT)) & APU_BT2_CTRL_BT_SLP_RDY_FW_MASK)\r\n\r\n#define APU_BT2_CTRL_BTU_CLK_NCO_MODE_SEL_EN_MASK (0x8U)\r\n#define APU_BT2_CTRL_BTU_CLK_NCO_MODE_SEL_EN_SHIFT (3U)\r\n/*! BTU_CLK_NCO_MODE_SEL_EN - 1- ignore the btu_clk_nco_mode from CIU2, keep the bt_clk_req as XP wakeup source */\r\n#define APU_BT2_CTRL_BTU_CLK_NCO_MODE_SEL_EN(x)  (((uint32_t)(((uint32_t)(x)) << APU_BT2_CTRL_BTU_CLK_NCO_MODE_SEL_EN_SHIFT)) & APU_BT2_CTRL_BTU_CLK_NCO_MODE_SEL_EN_MASK)\r\n\r\n#define APU_BT2_CTRL_USE_BT_INTR_SLP_MASK        (0x80U)\r\n#define APU_BT2_CTRL_USE_BT_INTR_SLP_SHIFT       (7U)\r\n/*! USE_BT_INTR_SLP - Use Bluetooth interrupt Sleep */\r\n#define APU_BT2_CTRL_USE_BT_INTR_SLP(x)          (((uint32_t)(((uint32_t)(x)) << APU_BT2_CTRL_USE_BT_INTR_SLP_SHIFT)) & APU_BT2_CTRL_USE_BT_INTR_SLP_MASK)\r\n\r\n#define APU_BT2_CTRL_BT_CLK_SYNC_MODE_SEL1_MASK  (0x4000000U)\r\n#define APU_BT2_CTRL_BT_CLK_SYNC_MODE_SEL1_SHIFT (26U)\r\n/*! BT_CLK_SYNC_MODE_SEL1 - Bluetooth Clock Sync Mode Select 1 */\r\n#define APU_BT2_CTRL_BT_CLK_SYNC_MODE_SEL1(x)    (((uint32_t)(((uint32_t)(x)) << APU_BT2_CTRL_BT_CLK_SYNC_MODE_SEL1_SHIFT)) & APU_BT2_CTRL_BT_CLK_SYNC_MODE_SEL1_MASK)\r\n\r\n#define APU_BT2_CTRL_USE_GLITCH_FREE_BT_CLK_REQ_MASK (0x8000000U)\r\n#define APU_BT2_CTRL_USE_GLITCH_FREE_BT_CLK_REQ_SHIFT (27U)\r\n/*! USE_GLITCH_FREE_BT_CLK_REQ - Use Glitch-Free Bluetooth Clock Request */\r\n#define APU_BT2_CTRL_USE_GLITCH_FREE_BT_CLK_REQ(x) (((uint32_t)(((uint32_t)(x)) << APU_BT2_CTRL_USE_GLITCH_FREE_BT_CLK_REQ_SHIFT)) & APU_BT2_CTRL_USE_GLITCH_FREE_BT_CLK_REQ_MASK)\r\n\r\n#define APU_BT2_CTRL_BRF_CLK_SYNC_MODE_SEL_MASK  (0x10000000U)\r\n#define APU_BT2_CTRL_BRF_CLK_SYNC_MODE_SEL_SHIFT (28U)\r\n/*! BRF_CLK_SYNC_MODE_SEL - BRF Clock Sync Mode Select */\r\n#define APU_BT2_CTRL_BRF_CLK_SYNC_MODE_SEL(x)    (((uint32_t)(((uint32_t)(x)) << APU_BT2_CTRL_BRF_CLK_SYNC_MODE_SEL_SHIFT)) & APU_BT2_CTRL_BRF_CLK_SYNC_MODE_SEL_MASK)\r\n\r\n#define APU_BT2_CTRL_BT_CLK_SYNC_MODE_SEL0_MASK  (0x20000000U)\r\n#define APU_BT2_CTRL_BT_CLK_SYNC_MODE_SEL0_SHIFT (29U)\r\n/*! BT_CLK_SYNC_MODE_SEL0 - Bluetooth Clock Sync Mode Select 0 */\r\n#define APU_BT2_CTRL_BT_CLK_SYNC_MODE_SEL0(x)    (((uint32_t)(((uint32_t)(x)) << APU_BT2_CTRL_BT_CLK_SYNC_MODE_SEL0_SHIFT)) & APU_BT2_CTRL_BT_CLK_SYNC_MODE_SEL0_MASK)\r\n\r\n#define APU_BT2_CTRL_BT_PLL_SYNC_MODE_SEL_MASK   (0x40000000U)\r\n#define APU_BT2_CTRL_BT_PLL_SYNC_MODE_SEL_SHIFT  (30U)\r\n/*! BT_PLL_SYNC_MODE_SEL - Bluetooth PLL Sync Mode Select */\r\n#define APU_BT2_CTRL_BT_PLL_SYNC_MODE_SEL(x)     (((uint32_t)(((uint32_t)(x)) << APU_BT2_CTRL_BT_PLL_SYNC_MODE_SEL_SHIFT)) & APU_BT2_CTRL_BT_PLL_SYNC_MODE_SEL_MASK)\r\n\r\n#define APU_BT2_CTRL_BT_HOST_SLP_RDY_MASK        (0x80000000U)\r\n#define APU_BT2_CTRL_BT_HOST_SLP_RDY_SHIFT       (31U)\r\n/*! BT_HOST_SLP_RDY - Bluetooth Host Sleep Ready */\r\n#define APU_BT2_CTRL_BT_HOST_SLP_RDY(x)          (((uint32_t)(((uint32_t)(x)) << APU_BT2_CTRL_BT_HOST_SLP_RDY_SHIFT)) & APU_BT2_CTRL_BT_HOST_SLP_RDY_MASK)\r\n/*! @} */\r\n\r\n/*! @name BT2_WKUP_MASK - Bluetooth 2 Wakeup Mask */\r\n/*! @{ */\r\n\r\n#define APU_BT2_WKUP_MASK_BCA_CLK_REQ_MASK_MASK  (0x1U)\r\n#define APU_BT2_WKUP_MASK_BCA_CLK_REQ_MASK_SHIFT (0U)\r\n/*! BCA_CLK_REQ_MASK - BCA Clock Request Mask */\r\n#define APU_BT2_WKUP_MASK_BCA_CLK_REQ_MASK(x)    (((uint32_t)(((uint32_t)(x)) << APU_BT2_WKUP_MASK_BCA_CLK_REQ_MASK_SHIFT)) & APU_BT2_WKUP_MASK_BCA_CLK_REQ_MASK_MASK)\r\n\r\n#define APU_BT2_WKUP_MASK_BT_CLK_REQ_MASK_MASK   (0x2U)\r\n#define APU_BT2_WKUP_MASK_BT_CLK_REQ_MASK_SHIFT  (1U)\r\n/*! BT_CLK_REQ_MASK - Bluetooth Clock Request Mask */\r\n#define APU_BT2_WKUP_MASK_BT_CLK_REQ_MASK(x)     (((uint32_t)(((uint32_t)(x)) << APU_BT2_WKUP_MASK_BT_CLK_REQ_MASK_SHIFT)) & APU_BT2_WKUP_MASK_BT_CLK_REQ_MASK_MASK)\r\n\r\n#define APU_BT2_WKUP_MASK_BT_WB_ACTIVE_REQ_MASK_MASK (0x4U)\r\n#define APU_BT2_WKUP_MASK_BT_WB_ACTIVE_REQ_MASK_SHIFT (2U)\r\n/*! BT_WB_ACTIVE_REQ_MASK - Bluetooth WB Active Request Mask */\r\n#define APU_BT2_WKUP_MASK_BT_WB_ACTIVE_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_BT2_WKUP_MASK_BT_WB_ACTIVE_REQ_MASK_SHIFT)) & APU_BT2_WKUP_MASK_BT_WB_ACTIVE_REQ_MASK_MASK)\r\n\r\n#define APU_BT2_WKUP_MASK_BT_INTR_MASK_MASK      (0x8U)\r\n#define APU_BT2_WKUP_MASK_BT_INTR_MASK_SHIFT     (3U)\r\n/*! BT_INTR_MASK - Bluetooth Interrupt Mask */\r\n#define APU_BT2_WKUP_MASK_BT_INTR_MASK(x)        (((uint32_t)(((uint32_t)(x)) << APU_BT2_WKUP_MASK_BT_INTR_MASK_SHIFT)) & APU_BT2_WKUP_MASK_BT_INTR_MASK_MASK)\r\n\r\n#define APU_BT2_WKUP_MASK_BT_PLL_REQ_MASK_MASK   (0x10U)\r\n#define APU_BT2_WKUP_MASK_BT_PLL_REQ_MASK_SHIFT  (4U)\r\n/*! BT_PLL_REQ_MASK - Bluetooth PLL Request Mask */\r\n#define APU_BT2_WKUP_MASK_BT_PLL_REQ_MASK(x)     (((uint32_t)(((uint32_t)(x)) << APU_BT2_WKUP_MASK_BT_PLL_REQ_MASK_SHIFT)) & APU_BT2_WKUP_MASK_BT_PLL_REQ_MASK_MASK)\r\n\r\n#define APU_BT2_WKUP_MASK_BRF_PLL_REQ_MASK_MASK  (0x20U)\r\n#define APU_BT2_WKUP_MASK_BRF_PLL_REQ_MASK_SHIFT (5U)\r\n/*! BRF_PLL_REQ_MASK - BRF PLL Request Mask */\r\n#define APU_BT2_WKUP_MASK_BRF_PLL_REQ_MASK(x)    (((uint32_t)(((uint32_t)(x)) << APU_BT2_WKUP_MASK_BRF_PLL_REQ_MASK_SHIFT)) & APU_BT2_WKUP_MASK_BRF_PLL_REQ_MASK_MASK)\r\n\r\n#define APU_BT2_WKUP_MASK_BT_HOST_MAP_MASK       (0xFFFF0000U)\r\n#define APU_BT2_WKUP_MASK_BT_HOST_MAP_SHIFT      (16U)\r\n/*! BT_HOST_MAP - Bluetooth Host Map */\r\n#define APU_BT2_WKUP_MASK_BT_HOST_MAP(x)         (((uint32_t)(((uint32_t)(x)) << APU_BT2_WKUP_MASK_BT_HOST_MAP_SHIFT)) & APU_BT2_WKUP_MASK_BT_HOST_MAP_MASK)\r\n/*! @} */\r\n\r\n/*! @name BT2_STATUS - Bluetooth 2 Status */\r\n/*! @{ */\r\n\r\n#define APU_BT2_STATUS_APU_BT_CLK_EN_MASK        (0x1U)\r\n#define APU_BT2_STATUS_APU_BT_CLK_EN_SHIFT       (0U)\r\n/*! APU_BT_CLK_EN - APU Bluetooth Clock Enable */\r\n#define APU_BT2_STATUS_APU_BT_CLK_EN(x)          (((uint32_t)(((uint32_t)(x)) << APU_BT2_STATUS_APU_BT_CLK_EN_SHIFT)) & APU_BT2_STATUS_APU_BT_CLK_EN_MASK)\r\n\r\n#define APU_BT2_STATUS_APU_BRF_CLK_EN_MASK       (0x2U)\r\n#define APU_BT2_STATUS_APU_BRF_CLK_EN_SHIFT      (1U)\r\n/*! APU_BRF_CLK_EN - APU BRF Clock Enable */\r\n#define APU_BT2_STATUS_APU_BRF_CLK_EN(x)         (((uint32_t)(((uint32_t)(x)) << APU_BT2_STATUS_APU_BRF_CLK_EN_SHIFT)) & APU_BT2_STATUS_APU_BRF_CLK_EN_MASK)\r\n\r\n#define APU_BT2_STATUS_BT_ACTIVE_SLPCK_MASK      (0x4U)\r\n#define APU_BT2_STATUS_BT_ACTIVE_SLPCK_SHIFT     (2U)\r\n/*! BT_ACTIVE_SLPCK - Bluetooth Active Sleep Clock */\r\n#define APU_BT2_STATUS_BT_ACTIVE_SLPCK(x)        (((uint32_t)(((uint32_t)(x)) << APU_BT2_STATUS_BT_ACTIVE_SLPCK_SHIFT)) & APU_BT2_STATUS_BT_ACTIVE_SLPCK_MASK)\r\n\r\n#define APU_BT2_STATUS_BT_HOST_WKUP_MASK         (0x10U)\r\n#define APU_BT2_STATUS_BT_HOST_WKUP_SHIFT        (4U)\r\n/*! BT_HOST_WKUP - Bluetooth Host Wakeup */\r\n#define APU_BT2_STATUS_BT_HOST_WKUP(x)           (((uint32_t)(((uint32_t)(x)) << APU_BT2_STATUS_BT_HOST_WKUP_SHIFT)) & APU_BT2_STATUS_BT_HOST_WKUP_MASK)\r\n\r\n#define APU_BT2_STATUS_BT_INTERRUPT_MASK         (0x20U)\r\n#define APU_BT2_STATUS_BT_INTERRUPT_SHIFT        (5U)\r\n/*! BT_INTERRUPT - Bluetooth Interrupt */\r\n#define APU_BT2_STATUS_BT_INTERRUPT(x)           (((uint32_t)(((uint32_t)(x)) << APU_BT2_STATUS_BT_INTERRUPT_SHIFT)) & APU_BT2_STATUS_BT_INTERRUPT_MASK)\r\n\r\n#define APU_BT2_STATUS_BT_PLL_REQ_MASK           (0x40U)\r\n#define APU_BT2_STATUS_BT_PLL_REQ_SHIFT          (6U)\r\n/*! BT_PLL_REQ - Bluetooth PLL Request */\r\n#define APU_BT2_STATUS_BT_PLL_REQ(x)             (((uint32_t)(((uint32_t)(x)) << APU_BT2_STATUS_BT_PLL_REQ_SHIFT)) & APU_BT2_STATUS_BT_PLL_REQ_MASK)\r\n\r\n#define APU_BT2_STATUS_BT_CLK_REQ_MASK           (0x80U)\r\n#define APU_BT2_STATUS_BT_CLK_REQ_SHIFT          (7U)\r\n/*! BT_CLK_REQ - Bluetooth Clock Request */\r\n#define APU_BT2_STATUS_BT_CLK_REQ(x)             (((uint32_t)(((uint32_t)(x)) << APU_BT2_STATUS_BT_CLK_REQ_SHIFT)) & APU_BT2_STATUS_BT_CLK_REQ_MASK)\r\n\r\n#define APU_BT2_STATUS_BRF_PLL_REQ_MASK          (0x100U)\r\n#define APU_BT2_STATUS_BRF_PLL_REQ_SHIFT         (8U)\r\n/*! BRF_PLL_REQ - BRF PLL Request */\r\n#define APU_BT2_STATUS_BRF_PLL_REQ(x)            (((uint32_t)(((uint32_t)(x)) << APU_BT2_STATUS_BRF_PLL_REQ_SHIFT)) & APU_BT2_STATUS_BRF_PLL_REQ_MASK)\r\n\r\n#define APU_BT2_STATUS_BT_WIDEBAND_ACTIVE_MASK   (0x200U)\r\n#define APU_BT2_STATUS_BT_WIDEBAND_ACTIVE_SHIFT  (9U)\r\n/*! BT_WIDEBAND_ACTIVE - Bluetooth Wideband Active */\r\n#define APU_BT2_STATUS_BT_WIDEBAND_ACTIVE(x)     (((uint32_t)(((uint32_t)(x)) << APU_BT2_STATUS_BT_WIDEBAND_ACTIVE_SHIFT)) & APU_BT2_STATUS_BT_WIDEBAND_ACTIVE_MASK)\r\n\r\n#define APU_BT2_STATUS_HOST_WKUP_IN_MASK         (0xFFFF0000U)\r\n#define APU_BT2_STATUS_HOST_WKUP_IN_SHIFT        (16U)\r\n/*! HOST_WKUP_IN - Host Wakeup In */\r\n#define APU_BT2_STATUS_HOST_WKUP_IN(x)           (((uint32_t)(((uint32_t)(x)) << APU_BT2_STATUS_HOST_WKUP_IN_SHIFT)) & APU_BT2_STATUS_HOST_WKUP_IN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BT2_CKEN_CTRL - Bluetooth 2 Clock Enable Control */\r\n/*! @{ */\r\n\r\n#define APU_BT2_CKEN_CTRL_BT_CLK_EN_VAL_PWR_MASK (0x1U)\r\n#define APU_BT2_CKEN_CTRL_BT_CLK_EN_VAL_PWR_SHIFT (0U)\r\n/*! BT_CLK_EN_VAL_PWR - control value for bt_clk_en when power ready */\r\n#define APU_BT2_CKEN_CTRL_BT_CLK_EN_VAL_PWR(x)   (((uint32_t)(((uint32_t)(x)) << APU_BT2_CKEN_CTRL_BT_CLK_EN_VAL_PWR_SHIFT)) & APU_BT2_CKEN_CTRL_BT_CLK_EN_VAL_PWR_MASK)\r\n\r\n#define APU_BT2_CKEN_CTRL_BL_CLK_EN_SEL_PWR_MASK (0x2U)\r\n#define APU_BT2_CKEN_CTRL_BL_CLK_EN_SEL_PWR_SHIFT (1U)\r\n/*! BL_CLK_EN_SEL_PWR - selection for bt_clk_en when power ready */\r\n#define APU_BT2_CKEN_CTRL_BL_CLK_EN_SEL_PWR(x)   (((uint32_t)(((uint32_t)(x)) << APU_BT2_CKEN_CTRL_BL_CLK_EN_SEL_PWR_SHIFT)) & APU_BT2_CKEN_CTRL_BL_CLK_EN_SEL_PWR_MASK)\r\n\r\n#define APU_BT2_CKEN_CTRL_BT_CLK_EN_VAL_XOSC_MASK (0x4U)\r\n#define APU_BT2_CKEN_CTRL_BT_CLK_EN_VAL_XOSC_SHIFT (2U)\r\n/*! BT_CLK_EN_VAL_XOSC - control value for bt_clk_en when XOSC ready */\r\n#define APU_BT2_CKEN_CTRL_BT_CLK_EN_VAL_XOSC(x)  (((uint32_t)(((uint32_t)(x)) << APU_BT2_CKEN_CTRL_BT_CLK_EN_VAL_XOSC_SHIFT)) & APU_BT2_CKEN_CTRL_BT_CLK_EN_VAL_XOSC_MASK)\r\n\r\n#define APU_BT2_CKEN_CTRL_BT_CLK_EN_SEL_XOSC_MASK (0x8U)\r\n#define APU_BT2_CKEN_CTRL_BT_CLK_EN_SEL_XOSC_SHIFT (3U)\r\n/*! BT_CLK_EN_SEL_XOSC - selection for bt_clk_en when XOSC ready */\r\n#define APU_BT2_CKEN_CTRL_BT_CLK_EN_SEL_XOSC(x)  (((uint32_t)(((uint32_t)(x)) << APU_BT2_CKEN_CTRL_BT_CLK_EN_SEL_XOSC_SHIFT)) & APU_BT2_CKEN_CTRL_BT_CLK_EN_SEL_XOSC_MASK)\r\n\r\n#define APU_BT2_CKEN_CTRL_BT_CLK_EN_VAL_MASK     (0x10U)\r\n#define APU_BT2_CKEN_CTRL_BT_CLK_EN_VAL_SHIFT    (4U)\r\n/*! BT_CLK_EN_VAL - control value for bt_clk_en when PLL ready */\r\n#define APU_BT2_CKEN_CTRL_BT_CLK_EN_VAL(x)       (((uint32_t)(((uint32_t)(x)) << APU_BT2_CKEN_CTRL_BT_CLK_EN_VAL_SHIFT)) & APU_BT2_CKEN_CTRL_BT_CLK_EN_VAL_MASK)\r\n\r\n#define APU_BT2_CKEN_CTRL_BT_CLK_EN_SEL_MASK     (0x20U)\r\n#define APU_BT2_CKEN_CTRL_BT_CLK_EN_SEL_SHIFT    (5U)\r\n/*! BT_CLK_EN_SEL - selection for bt_clk_en when PLL ready */\r\n#define APU_BT2_CKEN_CTRL_BT_CLK_EN_SEL(x)       (((uint32_t)(((uint32_t)(x)) << APU_BT2_CKEN_CTRL_BT_CLK_EN_SEL_SHIFT)) & APU_BT2_CKEN_CTRL_BT_CLK_EN_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name BT2_RESRC_CTRL - Bluetooth 2 RESRC Control */\r\n/*! @{ */\r\n\r\n#define APU_BT2_RESRC_CTRL_FW_PWR_REQ_MASK       (0x1U)\r\n#define APU_BT2_RESRC_CTRL_FW_PWR_REQ_SHIFT      (0U)\r\n/*! FW_PWR_REQ - override hw power request */\r\n#define APU_BT2_RESRC_CTRL_FW_PWR_REQ(x)         (((uint32_t)(((uint32_t)(x)) << APU_BT2_RESRC_CTRL_FW_PWR_REQ_SHIFT)) & APU_BT2_RESRC_CTRL_FW_PWR_REQ_MASK)\r\n\r\n#define APU_BT2_RESRC_CTRL_FW_PWR_REQ_VAL_MASK   (0x2U)\r\n#define APU_BT2_RESRC_CTRL_FW_PWR_REQ_VAL_SHIFT  (1U)\r\n/*! FW_PWR_REQ_VAL - override value when apu_bt_resrc_ctrl[0] is set */\r\n#define APU_BT2_RESRC_CTRL_FW_PWR_REQ_VAL(x)     (((uint32_t)(((uint32_t)(x)) << APU_BT2_RESRC_CTRL_FW_PWR_REQ_VAL_SHIFT)) & APU_BT2_RESRC_CTRL_FW_PWR_REQ_VAL_MASK)\r\n\r\n#define APU_BT2_RESRC_CTRL_FW_XOSC_REQ_MASK      (0x4U)\r\n#define APU_BT2_RESRC_CTRL_FW_XOSC_REQ_SHIFT     (2U)\r\n/*! FW_XOSC_REQ - override hw xosc request */\r\n#define APU_BT2_RESRC_CTRL_FW_XOSC_REQ(x)        (((uint32_t)(((uint32_t)(x)) << APU_BT2_RESRC_CTRL_FW_XOSC_REQ_SHIFT)) & APU_BT2_RESRC_CTRL_FW_XOSC_REQ_MASK)\r\n\r\n#define APU_BT2_RESRC_CTRL_FW_XOSC_REQ_VAL_MASK  (0x8U)\r\n#define APU_BT2_RESRC_CTRL_FW_XOSC_REQ_VAL_SHIFT (3U)\r\n/*! FW_XOSC_REQ_VAL - override value when apu_bt_resrc_ctrl[2] is set */\r\n#define APU_BT2_RESRC_CTRL_FW_XOSC_REQ_VAL(x)    (((uint32_t)(((uint32_t)(x)) << APU_BT2_RESRC_CTRL_FW_XOSC_REQ_VAL_SHIFT)) & APU_BT2_RESRC_CTRL_FW_XOSC_REQ_VAL_MASK)\r\n\r\n#define APU_BT2_RESRC_CTRL_FW_XP_REQ_MASK        (0x10U)\r\n#define APU_BT2_RESRC_CTRL_FW_XP_REQ_SHIFT       (4U)\r\n/*! FW_XP_REQ - override hw xosc + pwr request */\r\n#define APU_BT2_RESRC_CTRL_FW_XP_REQ(x)          (((uint32_t)(((uint32_t)(x)) << APU_BT2_RESRC_CTRL_FW_XP_REQ_SHIFT)) & APU_BT2_RESRC_CTRL_FW_XP_REQ_MASK)\r\n\r\n#define APU_BT2_RESRC_CTRL_FW_XP_REQ_VAL_MASK    (0x20U)\r\n#define APU_BT2_RESRC_CTRL_FW_XP_REQ_VAL_SHIFT   (5U)\r\n/*! FW_XP_REQ_VAL - override value when apu_bt_resrc_ctrl[4] is set */\r\n#define APU_BT2_RESRC_CTRL_FW_XP_REQ_VAL(x)      (((uint32_t)(((uint32_t)(x)) << APU_BT2_RESRC_CTRL_FW_XP_REQ_VAL_SHIFT)) & APU_BT2_RESRC_CTRL_FW_XP_REQ_VAL_MASK)\r\n\r\n#define APU_BT2_RESRC_CTRL_FW_SB_REQ_MASK        (0x40U)\r\n#define APU_BT2_RESRC_CTRL_FW_SB_REQ_SHIFT       (6U)\r\n/*! FW_SB_REQ - override hw xosc + pwr + pll sb request */\r\n#define APU_BT2_RESRC_CTRL_FW_SB_REQ(x)          (((uint32_t)(((uint32_t)(x)) << APU_BT2_RESRC_CTRL_FW_SB_REQ_SHIFT)) & APU_BT2_RESRC_CTRL_FW_SB_REQ_MASK)\r\n\r\n#define APU_BT2_RESRC_CTRL_FW_SB_REQ_VAL_MASK    (0x80U)\r\n#define APU_BT2_RESRC_CTRL_FW_SB_REQ_VAL_SHIFT   (7U)\r\n/*! FW_SB_REQ_VAL - override value when apu_bt_resrc_ctrl[6] is set */\r\n#define APU_BT2_RESRC_CTRL_FW_SB_REQ_VAL(x)      (((uint32_t)(((uint32_t)(x)) << APU_BT2_RESRC_CTRL_FW_SB_REQ_VAL_SHIFT)) & APU_BT2_RESRC_CTRL_FW_SB_REQ_VAL_MASK)\r\n\r\n#define APU_BT2_RESRC_CTRL_FW_IPWAKE_REQ_MASK    (0x100U)\r\n#define APU_BT2_RESRC_CTRL_FW_IPWAKE_REQ_SHIFT   (8U)\r\n/*! FW_IPWAKE_REQ - override hw xosc + pwr + pll ipwake request */\r\n#define APU_BT2_RESRC_CTRL_FW_IPWAKE_REQ(x)      (((uint32_t)(((uint32_t)(x)) << APU_BT2_RESRC_CTRL_FW_IPWAKE_REQ_SHIFT)) & APU_BT2_RESRC_CTRL_FW_IPWAKE_REQ_MASK)\r\n\r\n#define APU_BT2_RESRC_CTRL_FW_IPWAKE_REQ_VAL_MASK (0x200U)\r\n#define APU_BT2_RESRC_CTRL_FW_IPWAKE_REQ_VAL_SHIFT (9U)\r\n/*! FW_IPWAKE_REQ_VAL - override value when apu_bt_resrc_ctrl[8] is set */\r\n#define APU_BT2_RESRC_CTRL_FW_IPWAKE_REQ_VAL(x)  (((uint32_t)(((uint32_t)(x)) << APU_BT2_RESRC_CTRL_FW_IPWAKE_REQ_VAL_SHIFT)) & APU_BT2_RESRC_CTRL_FW_IPWAKE_REQ_VAL_MASK)\r\n\r\n#define APU_BT2_RESRC_CTRL_FW_ALLWAKE_REQ_MASK   (0x400U)\r\n#define APU_BT2_RESRC_CTRL_FW_ALLWAKE_REQ_SHIFT  (10U)\r\n/*! FW_ALLWAKE_REQ - firmware override hw xosc + pwr + pll allwake request */\r\n#define APU_BT2_RESRC_CTRL_FW_ALLWAKE_REQ(x)     (((uint32_t)(((uint32_t)(x)) << APU_BT2_RESRC_CTRL_FW_ALLWAKE_REQ_SHIFT)) & APU_BT2_RESRC_CTRL_FW_ALLWAKE_REQ_MASK)\r\n\r\n#define APU_BT2_RESRC_CTRL_FW_ALLWAKE_REQ_VAL_MASK (0x800U)\r\n#define APU_BT2_RESRC_CTRL_FW_ALLWAKE_REQ_VAL_SHIFT (11U)\r\n/*! FW_ALLWAKE_REQ_VAL - firmware override value when apu_bt_resrc_ctrl[10] is set */\r\n#define APU_BT2_RESRC_CTRL_FW_ALLWAKE_REQ_VAL(x) (((uint32_t)(((uint32_t)(x)) << APU_BT2_RESRC_CTRL_FW_ALLWAKE_REQ_VAL_SHIFT)) & APU_BT2_RESRC_CTRL_FW_ALLWAKE_REQ_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name BT2_DVFS_CTRL - Bluetooth 2 DVFS Control */\r\n/*! @{ */\r\n\r\n#define APU_BT2_DVFS_CTRL_BT_VOL_VAL_MASK        (0x7FU)\r\n#define APU_BT2_DVFS_CTRL_BT_VOL_VAL_SHIFT       (0U)\r\n/*! BT_VOL_VAL - Blueooth Vol Value */\r\n#define APU_BT2_DVFS_CTRL_BT_VOL_VAL(x)          (((uint32_t)(((uint32_t)(x)) << APU_BT2_DVFS_CTRL_BT_VOL_VAL_SHIFT)) & APU_BT2_DVFS_CTRL_BT_VOL_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name BLE2_CTRL - BLE 2 Control */\r\n/*! @{ */\r\n\r\n#define APU_BLE2_CTRL_BLE_SLP_RDY_MASK           (0x1U)\r\n#define APU_BLE2_CTRL_BLE_SLP_RDY_SHIFT          (0U)\r\n/*! BLE_SLP_RDY - BLE Sleep Ready */\r\n#define APU_BLE2_CTRL_BLE_SLP_RDY(x)             (((uint32_t)(((uint32_t)(x)) << APU_BLE2_CTRL_BLE_SLP_RDY_SHIFT)) & APU_BLE2_CTRL_BLE_SLP_RDY_MASK)\r\n\r\n#define APU_BLE2_CTRL_BLE_SLP_RDYMASK_MASK       (0x2U)\r\n#define APU_BLE2_CTRL_BLE_SLP_RDYMASK_SHIFT      (1U)\r\n/*! BLE_SLP_RDYMASK - BLE Sleep Ready Mask */\r\n#define APU_BLE2_CTRL_BLE_SLP_RDYMASK(x)         (((uint32_t)(((uint32_t)(x)) << APU_BLE2_CTRL_BLE_SLP_RDYMASK_SHIFT)) & APU_BLE2_CTRL_BLE_SLP_RDYMASK_MASK)\r\n\r\n#define APU_BLE2_CTRL_BLE_SLP_RDY_FW_MASK        (0x4U)\r\n#define APU_BLE2_CTRL_BLE_SLP_RDY_FW_SHIFT       (2U)\r\n/*! BLE_SLP_RDY_FW - BLE Sleep Ready FW */\r\n#define APU_BLE2_CTRL_BLE_SLP_RDY_FW(x)          (((uint32_t)(((uint32_t)(x)) << APU_BLE2_CTRL_BLE_SLP_RDY_FW_SHIFT)) & APU_BLE2_CTRL_BLE_SLP_RDY_FW_MASK)\r\n\r\n#define APU_BLE2_CTRL_BLE_MODE_EN_MASK           (0x8U)\r\n#define APU_BLE2_CTRL_BLE_MODE_EN_SHIFT          (3U)\r\n/*! BLE_MODE_EN - BLE Mode Enable */\r\n#define APU_BLE2_CTRL_BLE_MODE_EN(x)             (((uint32_t)(((uint32_t)(x)) << APU_BLE2_CTRL_BLE_MODE_EN_SHIFT)) & APU_BLE2_CTRL_BLE_MODE_EN_MASK)\r\n\r\n#define APU_BLE2_CTRL_BT_AES_NCO_MODE_MASK       (0x8000U)\r\n#define APU_BLE2_CTRL_BT_AES_NCO_MODE_SHIFT      (15U)\r\n/*! BT_AES_NCO_MODE - Bluetooth AES NCO Mode */\r\n#define APU_BLE2_CTRL_BT_AES_NCO_MODE(x)         (((uint32_t)(((uint32_t)(x)) << APU_BLE2_CTRL_BT_AES_NCO_MODE_SHIFT)) & APU_BLE2_CTRL_BT_AES_NCO_MODE_MASK)\r\n\r\n#define APU_BLE2_CTRL_BLE_XP_REQ_MASK            (0x80000000U)\r\n#define APU_BLE2_CTRL_BLE_XP_REQ_SHIFT           (31U)\r\n/*! BLE_XP_REQ - BLE XP Request */\r\n#define APU_BLE2_CTRL_BLE_XP_REQ(x)              (((uint32_t)(((uint32_t)(x)) << APU_BLE2_CTRL_BLE_XP_REQ_SHIFT)) & APU_BLE2_CTRL_BLE_XP_REQ_MASK)\r\n/*! @} */\r\n\r\n/*! @name BLE2_WKUP_MASK - BLE 2 Wakeup Mask */\r\n/*! @{ */\r\n\r\n#define APU_BLE2_WKUP_MASK_BT_AES_CLK_REQ_MASK_MASK (0x8U)\r\n#define APU_BLE2_WKUP_MASK_BT_AES_CLK_REQ_MASK_SHIFT (3U)\r\n/*! BT_AES_CLK_REQ_MASK - Bluetooth AES Clock Request Mask */\r\n#define APU_BLE2_WKUP_MASK_BT_AES_CLK_REQ_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_BLE2_WKUP_MASK_BT_AES_CLK_REQ_MASK_SHIFT)) & APU_BLE2_WKUP_MASK_BT_AES_CLK_REQ_MASK_MASK)\r\n\r\n#define APU_BLE2_WKUP_MASK_LBC_XP_REQ_MASK_MASK  (0x10U)\r\n#define APU_BLE2_WKUP_MASK_LBC_XP_REQ_MASK_SHIFT (4U)\r\n/*! LBC_XP_REQ_MASK - LBC XP Request Mask */\r\n#define APU_BLE2_WKUP_MASK_LBC_XP_REQ_MASK(x)    (((uint32_t)(((uint32_t)(x)) << APU_BLE2_WKUP_MASK_LBC_XP_REQ_MASK_SHIFT)) & APU_BLE2_WKUP_MASK_LBC_XP_REQ_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name BLE2_STATUS - BLE 2 Status */\r\n/*! @{ */\r\n\r\n#define APU_BLE2_STATUS_APU_BT_AES_CLK_EN_MASK   (0x1U)\r\n#define APU_BLE2_STATUS_APU_BT_AES_CLK_EN_SHIFT  (0U)\r\n/*! APU_BT_AES_CLK_EN - APU Bluetooth AES Clock Enable */\r\n#define APU_BLE2_STATUS_APU_BT_AES_CLK_EN(x)     (((uint32_t)(((uint32_t)(x)) << APU_BLE2_STATUS_APU_BT_AES_CLK_EN_SHIFT)) & APU_BLE2_STATUS_APU_BT_AES_CLK_EN_MASK)\r\n\r\n#define APU_BLE2_STATUS_BT_AES_CLK_SEL_MASK      (0x2U)\r\n#define APU_BLE2_STATUS_BT_AES_CLK_SEL_SHIFT     (1U)\r\n/*! BT_AES_CLK_SEL - Bluetooth AES Clock Select */\r\n#define APU_BLE2_STATUS_BT_AES_CLK_SEL(x)        (((uint32_t)(((uint32_t)(x)) << APU_BLE2_STATUS_BT_AES_CLK_SEL_SHIFT)) & APU_BLE2_STATUS_BT_AES_CLK_SEL_MASK)\r\n\r\n#define APU_BLE2_STATUS_XOSC_STABLE_REFCK_MASK   (0x4U)\r\n#define APU_BLE2_STATUS_XOSC_STABLE_REFCK_SHIFT  (2U)\r\n/*! XOSC_STABLE_REFCK - XOSC Stable Ref Clock */\r\n#define APU_BLE2_STATUS_XOSC_STABLE_REFCK(x)     (((uint32_t)(((uint32_t)(x)) << APU_BLE2_STATUS_XOSC_STABLE_REFCK_SHIFT)) & APU_BLE2_STATUS_XOSC_STABLE_REFCK_MASK)\r\n\r\n#define APU_BLE2_STATUS_T1_STABLE_MASK           (0x8U)\r\n#define APU_BLE2_STATUS_T1_STABLE_SHIFT          (3U)\r\n/*! T1_STABLE - T1 Delay */\r\n#define APU_BLE2_STATUS_T1_STABLE(x)             (((uint32_t)(((uint32_t)(x)) << APU_BLE2_STATUS_T1_STABLE_SHIFT)) & APU_BLE2_STATUS_T1_STABLE_MASK)\r\n\r\n#define APU_BLE2_STATUS_BT_INTERRUPT_MASK        (0x10U)\r\n#define APU_BLE2_STATUS_BT_INTERRUPT_SHIFT       (4U)\r\n/*! BT_INTERRUPT - Bluetooth Interrupt */\r\n#define APU_BLE2_STATUS_BT_INTERRUPT(x)          (((uint32_t)(((uint32_t)(x)) << APU_BLE2_STATUS_BT_INTERRUPT_SHIFT)) & APU_BLE2_STATUS_BT_INTERRUPT_MASK)\r\n\r\n#define APU_BLE2_STATUS_BLE_XP_REQ_MASK          (0x20U)\r\n#define APU_BLE2_STATUS_BLE_XP_REQ_SHIFT         (5U)\r\n/*! BLE_XP_REQ - BLE XP Request */\r\n#define APU_BLE2_STATUS_BLE_XP_REQ(x)            (((uint32_t)(((uint32_t)(x)) << APU_BLE2_STATUS_BLE_XP_REQ_SHIFT)) & APU_BLE2_STATUS_BLE_XP_REQ_MASK)\r\n\r\n#define APU_BLE2_STATUS_BT_AES_NCO_MODE_MASK     (0x40U)\r\n#define APU_BLE2_STATUS_BT_AES_NCO_MODE_SHIFT    (6U)\r\n/*! BT_AES_NCO_MODE - Blueooth AES NCO Mode */\r\n#define APU_BLE2_STATUS_BT_AES_NCO_MODE(x)       (((uint32_t)(((uint32_t)(x)) << APU_BLE2_STATUS_BT_AES_NCO_MODE_SHIFT)) & APU_BLE2_STATUS_BT_AES_NCO_MODE_MASK)\r\n\r\n#define APU_BLE2_STATUS_LBC_XP_REQ_MASK          (0x100U)\r\n#define APU_BLE2_STATUS_LBC_XP_REQ_SHIFT         (8U)\r\n/*! LBC_XP_REQ - LBC XP Request */\r\n#define APU_BLE2_STATUS_LBC_XP_REQ(x)            (((uint32_t)(((uint32_t)(x)) << APU_BLE2_STATUS_LBC_XP_REQ_SHIFT)) & APU_BLE2_STATUS_LBC_XP_REQ_MASK)\r\n\r\n#define APU_BLE2_STATUS_BT_AES_CLK_REQ_MASK      (0x200U)\r\n#define APU_BLE2_STATUS_BT_AES_CLK_REQ_SHIFT     (9U)\r\n/*! BT_AES_CLK_REQ - Bluetooth AES Clock Request Mask */\r\n#define APU_BLE2_STATUS_BT_AES_CLK_REQ(x)        (((uint32_t)(((uint32_t)(x)) << APU_BLE2_STATUS_BT_AES_CLK_REQ_SHIFT)) & APU_BLE2_STATUS_BT_AES_CLK_REQ_MASK)\r\n/*! @} */\r\n\r\n/*! @name LMU_IP_REVISION - LMU IP Revision */\r\n/*! @{ */\r\n\r\n#define APU_LMU_IP_REVISION_IP_REV_MASK          (0xFFFFU)\r\n#define APU_LMU_IP_REVISION_IP_REV_SHIFT         (0U)\r\n/*! IP_REV - IP Revision */\r\n#define APU_LMU_IP_REVISION_IP_REV(x)            (((uint32_t)(((uint32_t)(x)) << APU_LMU_IP_REVISION_IP_REV_SHIFT)) & APU_LMU_IP_REVISION_IP_REV_MASK)\r\n/*! @} */\r\n\r\n/*! @name LMU_CPU1_STA_CFG - LMU CPU1 STA Configuration */\r\n/*! @{ */\r\n\r\n#define APU_LMU_CPU1_STA_CFG_BANK0_STA_OFF_EN_MASK (0x1U)\r\n#define APU_LMU_CPU1_STA_CFG_BANK0_STA_OFF_EN_SHIFT (0U)\r\n/*! BANK0_STA_OFF_EN - Bank0 STA Off Enable */\r\n#define APU_LMU_CPU1_STA_CFG_BANK0_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_BANK0_STA_OFF_EN_SHIFT)) & APU_LMU_CPU1_STA_CFG_BANK0_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED15_MASK     (0x2U)\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED15_SHIFT    (1U)\r\n/*! RESERVED15 - Reserved 15 */\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED15(x)       (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_RESERVED15_SHIFT)) & APU_LMU_CPU1_STA_CFG_RESERVED15_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_BANK1_STA_OFF_EN_MASK (0x4U)\r\n#define APU_LMU_CPU1_STA_CFG_BANK1_STA_OFF_EN_SHIFT (2U)\r\n/*! BANK1_STA_OFF_EN - Bank1 STA Off Enable */\r\n#define APU_LMU_CPU1_STA_CFG_BANK1_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_BANK1_STA_OFF_EN_SHIFT)) & APU_LMU_CPU1_STA_CFG_BANK1_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED14_MASK     (0x8U)\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED14_SHIFT    (3U)\r\n/*! RESERVED14 - Reserved 14 */\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED14(x)       (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_RESERVED14_SHIFT)) & APU_LMU_CPU1_STA_CFG_RESERVED14_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_BANK2_STA_OFF_EN_MASK (0x10U)\r\n#define APU_LMU_CPU1_STA_CFG_BANK2_STA_OFF_EN_SHIFT (4U)\r\n/*! BANK2_STA_OFF_EN - Bank2 STA Off Enable */\r\n#define APU_LMU_CPU1_STA_CFG_BANK2_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_BANK2_STA_OFF_EN_SHIFT)) & APU_LMU_CPU1_STA_CFG_BANK2_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED13_MASK     (0x20U)\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED13_SHIFT    (5U)\r\n/*! RESERVED13 - Reserved 13 */\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED13(x)       (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_RESERVED13_SHIFT)) & APU_LMU_CPU1_STA_CFG_RESERVED13_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_BANK3_STA_OFF_EN_MASK (0x40U)\r\n#define APU_LMU_CPU1_STA_CFG_BANK3_STA_OFF_EN_SHIFT (6U)\r\n/*! BANK3_STA_OFF_EN - Bank3 STA Off Enable */\r\n#define APU_LMU_CPU1_STA_CFG_BANK3_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_BANK3_STA_OFF_EN_SHIFT)) & APU_LMU_CPU1_STA_CFG_BANK3_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED12_MASK     (0x80U)\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED12_SHIFT    (7U)\r\n/*! RESERVED12 - Reserved 12 */\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED12(x)       (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_RESERVED12_SHIFT)) & APU_LMU_CPU1_STA_CFG_RESERVED12_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_BANK4_STA_OFF_EN_MASK (0x100U)\r\n#define APU_LMU_CPU1_STA_CFG_BANK4_STA_OFF_EN_SHIFT (8U)\r\n/*! BANK4_STA_OFF_EN - Bank4 STA Off Enable */\r\n#define APU_LMU_CPU1_STA_CFG_BANK4_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_BANK4_STA_OFF_EN_SHIFT)) & APU_LMU_CPU1_STA_CFG_BANK4_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED11_MASK     (0x200U)\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED11_SHIFT    (9U)\r\n/*! RESERVED11 - Reserved 11 */\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED11(x)       (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_RESERVED11_SHIFT)) & APU_LMU_CPU1_STA_CFG_RESERVED11_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_BANK5_STA_OFF_EN_MASK (0x400U)\r\n#define APU_LMU_CPU1_STA_CFG_BANK5_STA_OFF_EN_SHIFT (10U)\r\n/*! BANK5_STA_OFF_EN - Bank5 STA Off Enable */\r\n#define APU_LMU_CPU1_STA_CFG_BANK5_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_BANK5_STA_OFF_EN_SHIFT)) & APU_LMU_CPU1_STA_CFG_BANK5_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED10_MASK     (0x800U)\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED10_SHIFT    (11U)\r\n/*! RESERVED10 - Reserved 10 */\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED10(x)       (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_RESERVED10_SHIFT)) & APU_LMU_CPU1_STA_CFG_RESERVED10_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_BANK6_STA_OFF_EN_MASK (0x1000U)\r\n#define APU_LMU_CPU1_STA_CFG_BANK6_STA_OFF_EN_SHIFT (12U)\r\n/*! BANK6_STA_OFF_EN - Bank6 STA Off Enable */\r\n#define APU_LMU_CPU1_STA_CFG_BANK6_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_BANK6_STA_OFF_EN_SHIFT)) & APU_LMU_CPU1_STA_CFG_BANK6_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED9_MASK      (0x2000U)\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED9_SHIFT     (13U)\r\n/*! RESERVED9 - Reserved 9 */\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED9(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_RESERVED9_SHIFT)) & APU_LMU_CPU1_STA_CFG_RESERVED9_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_BANK7_STA_OFF_EN_MASK (0x4000U)\r\n#define APU_LMU_CPU1_STA_CFG_BANK7_STA_OFF_EN_SHIFT (14U)\r\n/*! BANK7_STA_OFF_EN - Bank7 STA Off Enable */\r\n#define APU_LMU_CPU1_STA_CFG_BANK7_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_BANK7_STA_OFF_EN_SHIFT)) & APU_LMU_CPU1_STA_CFG_BANK7_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED8_MASK      (0x8000U)\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED8_SHIFT     (15U)\r\n/*! RESERVED8 - Reserved 8 */\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED8(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_RESERVED8_SHIFT)) & APU_LMU_CPU1_STA_CFG_RESERVED8_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_BANK8_STA_OFF_EN_MASK (0x10000U)\r\n#define APU_LMU_CPU1_STA_CFG_BANK8_STA_OFF_EN_SHIFT (16U)\r\n/*! BANK8_STA_OFF_EN - Bank8 STA Off Enable */\r\n#define APU_LMU_CPU1_STA_CFG_BANK8_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_BANK8_STA_OFF_EN_SHIFT)) & APU_LMU_CPU1_STA_CFG_BANK8_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED7_MASK      (0x20000U)\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED7_SHIFT     (17U)\r\n/*! RESERVED7 - Reserved 7 */\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED7(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_RESERVED7_SHIFT)) & APU_LMU_CPU1_STA_CFG_RESERVED7_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_BANK9_STA_OFF_EN_MASK (0x40000U)\r\n#define APU_LMU_CPU1_STA_CFG_BANK9_STA_OFF_EN_SHIFT (18U)\r\n/*! BANK9_STA_OFF_EN - Bank9 STA Off Enable */\r\n#define APU_LMU_CPU1_STA_CFG_BANK9_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_BANK9_STA_OFF_EN_SHIFT)) & APU_LMU_CPU1_STA_CFG_BANK9_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED6_MASK      (0x80000U)\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED6_SHIFT     (19U)\r\n/*! RESERVED6 - Reserved 6 */\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED6(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_RESERVED6_SHIFT)) & APU_LMU_CPU1_STA_CFG_RESERVED6_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_BANK10_STA_OFF_EN_MASK (0x100000U)\r\n#define APU_LMU_CPU1_STA_CFG_BANK10_STA_OFF_EN_SHIFT (20U)\r\n/*! BANK10_STA_OFF_EN - Bank10 STA Off Enable */\r\n#define APU_LMU_CPU1_STA_CFG_BANK10_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_BANK10_STA_OFF_EN_SHIFT)) & APU_LMU_CPU1_STA_CFG_BANK10_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED5_MASK      (0x200000U)\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED5_SHIFT     (21U)\r\n/*! RESERVED5 - Reserved 5 */\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED5(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_RESERVED5_SHIFT)) & APU_LMU_CPU1_STA_CFG_RESERVED5_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_BANK11_STA_OFF_EN_MASK (0x400000U)\r\n#define APU_LMU_CPU1_STA_CFG_BANK11_STA_OFF_EN_SHIFT (22U)\r\n/*! BANK11_STA_OFF_EN - Bank11 STA Off Enable */\r\n#define APU_LMU_CPU1_STA_CFG_BANK11_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_BANK11_STA_OFF_EN_SHIFT)) & APU_LMU_CPU1_STA_CFG_BANK11_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED4_MASK      (0x800000U)\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED4_SHIFT     (23U)\r\n/*! RESERVED4 - Reserved 4 */\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED4(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_RESERVED4_SHIFT)) & APU_LMU_CPU1_STA_CFG_RESERVED4_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_BANK12_STA_OFF_EN_MASK (0x1000000U)\r\n#define APU_LMU_CPU1_STA_CFG_BANK12_STA_OFF_EN_SHIFT (24U)\r\n/*! BANK12_STA_OFF_EN - Bank12 STA Off Enable */\r\n#define APU_LMU_CPU1_STA_CFG_BANK12_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_BANK12_STA_OFF_EN_SHIFT)) & APU_LMU_CPU1_STA_CFG_BANK12_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED3_MASK      (0x2000000U)\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED3_SHIFT     (25U)\r\n/*! RESERVED3 - Reserved 3 */\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED3(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_RESERVED3_SHIFT)) & APU_LMU_CPU1_STA_CFG_RESERVED3_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_BANK13_STA_OFF_EN_MASK (0x4000000U)\r\n#define APU_LMU_CPU1_STA_CFG_BANK13_STA_OFF_EN_SHIFT (26U)\r\n/*! BANK13_STA_OFF_EN - Bank13 STA Off Enable */\r\n#define APU_LMU_CPU1_STA_CFG_BANK13_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_BANK13_STA_OFF_EN_SHIFT)) & APU_LMU_CPU1_STA_CFG_BANK13_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED2_MASK      (0x8000000U)\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED2_SHIFT     (27U)\r\n/*! RESERVED2 - Reserved 2 */\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED2(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_RESERVED2_SHIFT)) & APU_LMU_CPU1_STA_CFG_RESERVED2_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_BANK14_STA_OFF_EN_MASK (0x10000000U)\r\n#define APU_LMU_CPU1_STA_CFG_BANK14_STA_OFF_EN_SHIFT (28U)\r\n/*! BANK14_STA_OFF_EN - Bank14 STA Off Enable */\r\n#define APU_LMU_CPU1_STA_CFG_BANK14_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_BANK14_STA_OFF_EN_SHIFT)) & APU_LMU_CPU1_STA_CFG_BANK14_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED1_MASK      (0x20000000U)\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED1_SHIFT     (29U)\r\n/*! RESERVED1 - Reserved 1 */\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED1(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_RESERVED1_SHIFT)) & APU_LMU_CPU1_STA_CFG_RESERVED1_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_BANK15_STA_OFF_EN_MASK (0x40000000U)\r\n#define APU_LMU_CPU1_STA_CFG_BANK15_STA_OFF_EN_SHIFT (30U)\r\n/*! BANK15_STA_OFF_EN - Bank15 STA Off Enable */\r\n#define APU_LMU_CPU1_STA_CFG_BANK15_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_BANK15_STA_OFF_EN_SHIFT)) & APU_LMU_CPU1_STA_CFG_BANK15_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED0_MASK      (0x80000000U)\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED0_SHIFT     (31U)\r\n/*! RESERVED0 - Reserved 0 */\r\n#define APU_LMU_CPU1_STA_CFG_RESERVED0(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_CFG_RESERVED0_SHIFT)) & APU_LMU_CPU1_STA_CFG_RESERVED0_MASK)\r\n/*! @} */\r\n\r\n/*! @name LMU_CPU1_STA_STATUS1 - LMU CPU1 STA Status 1 */\r\n/*! @{ */\r\n\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK0_FSM_ST_REP_DONE_MASK (0x1U)\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK0_FSM_ST_REP_DONE_SHIFT (0U)\r\n/*! BANK0_FSM_ST_REP_DONE - Bank0 FSM St Rep Done */\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK0_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS1_BANK0_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU1_STA_STATUS1_BANK0_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK0_FSM_ST_MASK (0xEU)\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK0_FSM_ST_SHIFT (1U)\r\n/*! BANK0_FSM_ST - Bank0 FSM St */\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK0_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS1_BANK0_FSM_ST_SHIFT)) & APU_LMU_CPU1_STA_STATUS1_BANK0_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK1_FSM_ST_REP_DONE_MASK (0x10U)\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK1_FSM_ST_REP_DONE_SHIFT (4U)\r\n/*! BANK1_FSM_ST_REP_DONE - Bank1FSM St Rep Done */\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK1_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS1_BANK1_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU1_STA_STATUS1_BANK1_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK1_FSM_ST_MASK (0xE0U)\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK1_FSM_ST_SHIFT (5U)\r\n/*! BANK1_FSM_ST - Bank1 FSM St */\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK1_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS1_BANK1_FSM_ST_SHIFT)) & APU_LMU_CPU1_STA_STATUS1_BANK1_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK2_FSM_ST_REP_DONE_MASK (0x100U)\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK2_FSM_ST_REP_DONE_SHIFT (8U)\r\n/*! BANK2_FSM_ST_REP_DONE - Bank2 FSM St Rep Done */\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK2_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS1_BANK2_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU1_STA_STATUS1_BANK2_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK2_FSM_ST_MASK (0xE00U)\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK2_FSM_ST_SHIFT (9U)\r\n/*! BANK2_FSM_ST - Bank2 FSM St */\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK2_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS1_BANK2_FSM_ST_SHIFT)) & APU_LMU_CPU1_STA_STATUS1_BANK2_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK3_FSM_ST_REP_DONE_MASK (0x1000U)\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK3_FSM_ST_REP_DONE_SHIFT (12U)\r\n/*! BANK3_FSM_ST_REP_DONE - Bank3 FSM St Rep Done */\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK3_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS1_BANK3_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU1_STA_STATUS1_BANK3_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK3_FSM_ST_MASK (0xE000U)\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK3_FSM_ST_SHIFT (13U)\r\n/*! BANK3_FSM_ST - Bank3 FSM St */\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK3_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS1_BANK3_FSM_ST_SHIFT)) & APU_LMU_CPU1_STA_STATUS1_BANK3_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK4_FSM_ST_REP_DONE_MASK (0x10000U)\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK4_FSM_ST_REP_DONE_SHIFT (16U)\r\n/*! BANK4_FSM_ST_REP_DONE - Bank4 FSM St Rep Done */\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK4_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS1_BANK4_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU1_STA_STATUS1_BANK4_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK4_FSM_ST_MASK (0xE0000U)\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK4_FSM_ST_SHIFT (17U)\r\n/*! BANK4_FSM_ST - Bank4 FSM St */\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK4_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS1_BANK4_FSM_ST_SHIFT)) & APU_LMU_CPU1_STA_STATUS1_BANK4_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK5_FSM_ST_REP_DONE_MASK (0x100000U)\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK5_FSM_ST_REP_DONE_SHIFT (20U)\r\n/*! BANK5_FSM_ST_REP_DONE - Bank5 FSM St Rep Done */\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK5_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS1_BANK5_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU1_STA_STATUS1_BANK5_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK5_FSM_ST_MASK (0xE00000U)\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK5_FSM_ST_SHIFT (21U)\r\n/*! BANK5_FSM_ST - Bank5 FSM St */\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK5_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS1_BANK5_FSM_ST_SHIFT)) & APU_LMU_CPU1_STA_STATUS1_BANK5_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK6_FSM_ST_REP_DONE_MASK (0x1000000U)\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK6_FSM_ST_REP_DONE_SHIFT (24U)\r\n/*! BANK6_FSM_ST_REP_DONE - Bank6 FSM St Rep Done */\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK6_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS1_BANK6_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU1_STA_STATUS1_BANK6_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK6_FSM_ST_MASK (0xE000000U)\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK6_FSM_ST_SHIFT (25U)\r\n/*! BANK6_FSM_ST - Bank6 FSM St */\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK6_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS1_BANK6_FSM_ST_SHIFT)) & APU_LMU_CPU1_STA_STATUS1_BANK6_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK7_FSM_ST_REP_DONE_MASK (0x10000000U)\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK7_FSM_ST_REP_DONE_SHIFT (28U)\r\n/*! BANK7_FSM_ST_REP_DONE - Bank7 FSM St Rep Done */\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK7_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS1_BANK7_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU1_STA_STATUS1_BANK7_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK7_FSM_ST_MASK (0xE0000000U)\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK7_FSM_ST_SHIFT (29U)\r\n/*! BANK7_FSM_ST - Bank7 FSM St */\r\n#define APU_LMU_CPU1_STA_STATUS1_BANK7_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS1_BANK7_FSM_ST_SHIFT)) & APU_LMU_CPU1_STA_STATUS1_BANK7_FSM_ST_MASK)\r\n/*! @} */\r\n\r\n/*! @name LMU_CPU1_STA_STATUS2 - LMU CPU1 STA Status 2 */\r\n/*! @{ */\r\n\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK8_FSM_ST_REP_DONE_MASK (0x1U)\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK8_FSM_ST_REP_DONE_SHIFT (0U)\r\n/*! BANK8_FSM_ST_REP_DONE - Bank8 FSM St Rep Done */\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK8_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS2_BANK8_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU1_STA_STATUS2_BANK8_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK8_FSM_ST_MASK (0xEU)\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK8_FSM_ST_SHIFT (1U)\r\n/*! BANK8_FSM_ST - Bank8 FSM St */\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK8_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS2_BANK8_FSM_ST_SHIFT)) & APU_LMU_CPU1_STA_STATUS2_BANK8_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK9_FSM_ST_REP_DONE_MASK (0x10U)\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK9_FSM_ST_REP_DONE_SHIFT (4U)\r\n/*! BANK9_FSM_ST_REP_DONE - Bank9 FSM St Rep Done */\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK9_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS2_BANK9_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU1_STA_STATUS2_BANK9_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK9_FSM_ST_MASK (0xE0U)\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK9_FSM_ST_SHIFT (5U)\r\n/*! BANK9_FSM_ST - Bank9 FSM St */\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK9_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS2_BANK9_FSM_ST_SHIFT)) & APU_LMU_CPU1_STA_STATUS2_BANK9_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK10_FSM_ST_REP_DONE_MASK (0x100U)\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK10_FSM_ST_REP_DONE_SHIFT (8U)\r\n/*! BANK10_FSM_ST_REP_DONE - Bank10 FSM St Rep Done */\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK10_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS2_BANK10_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU1_STA_STATUS2_BANK10_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK10_FSM_ST_MASK (0xE00U)\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK10_FSM_ST_SHIFT (9U)\r\n/*! BANK10_FSM_ST - Bank10 FSM St */\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK10_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS2_BANK10_FSM_ST_SHIFT)) & APU_LMU_CPU1_STA_STATUS2_BANK10_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK11_FSM_ST_REP_DONE_MASK (0x1000U)\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK11_FSM_ST_REP_DONE_SHIFT (12U)\r\n/*! BANK11_FSM_ST_REP_DONE - Bank11 FSM St Rep Done */\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK11_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS2_BANK11_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU1_STA_STATUS2_BANK11_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK11_FSM_ST_MASK (0xE000U)\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK11_FSM_ST_SHIFT (13U)\r\n/*! BANK11_FSM_ST - Bank11 FSM St */\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK11_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS2_BANK11_FSM_ST_SHIFT)) & APU_LMU_CPU1_STA_STATUS2_BANK11_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK12_FSM_ST_REP_DONE_MASK (0x10000U)\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK12_FSM_ST_REP_DONE_SHIFT (16U)\r\n/*! BANK12_FSM_ST_REP_DONE - Bank12 FSM St Rep Done */\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK12_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS2_BANK12_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU1_STA_STATUS2_BANK12_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK12_FSM_ST_MASK (0xE0000U)\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK12_FSM_ST_SHIFT (17U)\r\n/*! BANK12_FSM_ST - Bank12 FSM St */\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK12_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS2_BANK12_FSM_ST_SHIFT)) & APU_LMU_CPU1_STA_STATUS2_BANK12_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK13_FSM_ST_REP_DONE_MASK (0x100000U)\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK13_FSM_ST_REP_DONE_SHIFT (20U)\r\n/*! BANK13_FSM_ST_REP_DONE - Bank13 FSM St Rep Done */\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK13_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS2_BANK13_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU1_STA_STATUS2_BANK13_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK13_FSM_ST_MASK (0xE00000U)\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK13_FSM_ST_SHIFT (21U)\r\n/*! BANK13_FSM_ST - Bank13 FSM St */\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK13_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS2_BANK13_FSM_ST_SHIFT)) & APU_LMU_CPU1_STA_STATUS2_BANK13_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK14_FSM_ST_REP_DONE_MASK (0x1000000U)\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK14_FSM_ST_REP_DONE_SHIFT (24U)\r\n/*! BANK14_FSM_ST_REP_DONE - Bank14 FSM St Rep Done */\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK14_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS2_BANK14_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU1_STA_STATUS2_BANK14_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK14_FSM_ST_MASK (0xE000000U)\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK14_FSM_ST_SHIFT (25U)\r\n/*! BANK14_FSM_ST - Bank14 FSM St */\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK14_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS2_BANK14_FSM_ST_SHIFT)) & APU_LMU_CPU1_STA_STATUS2_BANK14_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK15_FSM_ST_REP_DONE_MASK (0x10000000U)\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK15_FSM_ST_REP_DONE_SHIFT (28U)\r\n/*! BANK15_FSM_ST_REP_DONE - Bank15 FSM St Rep Done */\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK15_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS2_BANK15_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU1_STA_STATUS2_BANK15_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK15_FSM_ST_MASK (0xE0000000U)\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK15_FSM_ST_SHIFT (29U)\r\n/*! BANK15_FSM_ST - Bank15 FSM St */\r\n#define APU_LMU_CPU1_STA_STATUS2_BANK15_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_STA_STATUS2_BANK15_FSM_ST_SHIFT)) & APU_LMU_CPU1_STA_STATUS2_BANK15_FSM_ST_MASK)\r\n/*! @} */\r\n\r\n/*! @name LMU_CPU1_DYN_CTRL - LMU CPU1 Dynamic Control */\r\n/*! @{ */\r\n\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK0_DYN_MODE_EN_MASK (0x1U)\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK0_DYN_MODE_EN_SHIFT (0U)\r\n/*! BANK0_DYN_MODE_EN - Bank0 Dynamic Mode Enable */\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK0_DYN_MODE_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_CTRL_BANK0_DYN_MODE_EN_SHIFT)) & APU_LMU_CPU1_DYN_CTRL_BANK0_DYN_MODE_EN_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK0_DYN_PD_MASK  (0x2U)\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK0_DYN_PD_SHIFT (1U)\r\n/*! BANK0_DYN_PD - Bank0 Dynamic Powerdown */\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK0_DYN_PD(x)    (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_CTRL_BANK0_DYN_PD_SHIFT)) & APU_LMU_CPU1_DYN_CTRL_BANK0_DYN_PD_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_CTRL_RESERVED3_MASK     (0xCU)\r\n#define APU_LMU_CPU1_DYN_CTRL_RESERVED3_SHIFT    (2U)\r\n/*! RESERVED3 - Reserved 3 */\r\n#define APU_LMU_CPU1_DYN_CTRL_RESERVED3(x)       (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_CTRL_RESERVED3_SHIFT)) & APU_LMU_CPU1_DYN_CTRL_RESERVED3_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK1_DYN_MODE_EN_MASK (0x10U)\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK1_DYN_MODE_EN_SHIFT (4U)\r\n/*! BANK1_DYN_MODE_EN - Bank1 Dynamic Mode Enable */\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK1_DYN_MODE_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_CTRL_BANK1_DYN_MODE_EN_SHIFT)) & APU_LMU_CPU1_DYN_CTRL_BANK1_DYN_MODE_EN_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK1_DYN_PD_MASK  (0x20U)\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK1_DYN_PD_SHIFT (5U)\r\n/*! BANK1_DYN_PD - Bank1 Dynamic Powerdown */\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK1_DYN_PD(x)    (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_CTRL_BANK1_DYN_PD_SHIFT)) & APU_LMU_CPU1_DYN_CTRL_BANK1_DYN_PD_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_CTRL_RESERVED2_MASK     (0xC0U)\r\n#define APU_LMU_CPU1_DYN_CTRL_RESERVED2_SHIFT    (6U)\r\n/*! RESERVED2 - Reserved 2 */\r\n#define APU_LMU_CPU1_DYN_CTRL_RESERVED2(x)       (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_CTRL_RESERVED2_SHIFT)) & APU_LMU_CPU1_DYN_CTRL_RESERVED2_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK2_DYN_MODE_EN_MASK (0x100U)\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK2_DYN_MODE_EN_SHIFT (8U)\r\n/*! BANK2_DYN_MODE_EN - Bank2 Dynamic Mode Enable */\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK2_DYN_MODE_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_CTRL_BANK2_DYN_MODE_EN_SHIFT)) & APU_LMU_CPU1_DYN_CTRL_BANK2_DYN_MODE_EN_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK2_DYN_PD_MASK  (0x200U)\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK2_DYN_PD_SHIFT (9U)\r\n/*! BANK2_DYN_PD - Bank2 Dynamic Powerdown */\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK2_DYN_PD(x)    (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_CTRL_BANK2_DYN_PD_SHIFT)) & APU_LMU_CPU1_DYN_CTRL_BANK2_DYN_PD_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_CTRL_RESERVED1_MASK     (0xC00U)\r\n#define APU_LMU_CPU1_DYN_CTRL_RESERVED1_SHIFT    (10U)\r\n/*! RESERVED1 - Reserved 1 */\r\n#define APU_LMU_CPU1_DYN_CTRL_RESERVED1(x)       (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_CTRL_RESERVED1_SHIFT)) & APU_LMU_CPU1_DYN_CTRL_RESERVED1_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK3_DYN_MODE_EN_MASK (0x1000U)\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK3_DYN_MODE_EN_SHIFT (12U)\r\n/*! BANK3_DYN_MODE_EN - Bank3 Dynamic Mode Enable */\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK3_DYN_MODE_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_CTRL_BANK3_DYN_MODE_EN_SHIFT)) & APU_LMU_CPU1_DYN_CTRL_BANK3_DYN_MODE_EN_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK3_DYN_PD_MASK  (0x2000U)\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK3_DYN_PD_SHIFT (13U)\r\n/*! BANK3_DYN_PD - Bank3 Dynamic Powerdown */\r\n#define APU_LMU_CPU1_DYN_CTRL_BANK3_DYN_PD(x)    (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_CTRL_BANK3_DYN_PD_SHIFT)) & APU_LMU_CPU1_DYN_CTRL_BANK3_DYN_PD_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_CTRL_RESERVED0_MASK     (0xFFFFC000U)\r\n#define APU_LMU_CPU1_DYN_CTRL_RESERVED0_SHIFT    (14U)\r\n/*! RESERVED0 - Reserved 0 */\r\n#define APU_LMU_CPU1_DYN_CTRL_RESERVED0(x)       (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_CTRL_RESERVED0_SHIFT)) & APU_LMU_CPU1_DYN_CTRL_RESERVED0_MASK)\r\n/*! @} */\r\n\r\n/*! @name LMU_CPU1_DYN_STATUS - LMU CPU1 Dynamic Status */\r\n/*! @{ */\r\n\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK0_DYN_REP_REQ_MASK (0x1U)\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK0_DYN_REP_REQ_SHIFT (0U)\r\n/*! BANK0_DYN_REP_REQ - Bank0 Dynamic Rep Request */\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK0_DYN_REP_REQ(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_STATUS_BANK0_DYN_REP_REQ_SHIFT)) & APU_LMU_CPU1_DYN_STATUS_BANK0_DYN_REP_REQ_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK0_DYN_REP_MASK (0x2U)\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK0_DYN_REP_SHIFT (1U)\r\n/*! BANK0_DYN_REP - Bank0 Dynamic Rep */\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK0_DYN_REP(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_STATUS_BANK0_DYN_REP_SHIFT)) & APU_LMU_CPU1_DYN_STATUS_BANK0_DYN_REP_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK0_FSM_ST_MASK (0xCU)\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK0_FSM_ST_SHIFT (2U)\r\n/*! BANK0_FSM_ST - Bank0 FSM St */\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK0_FSM_ST(x)  (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_STATUS_BANK0_FSM_ST_SHIFT)) & APU_LMU_CPU1_DYN_STATUS_BANK0_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK1_DYN_REP_REQ_MASK (0x10U)\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK1_DYN_REP_REQ_SHIFT (4U)\r\n/*! BANK1_DYN_REP_REQ - Bank1 Dynamic Rep Request */\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK1_DYN_REP_REQ(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_STATUS_BANK1_DYN_REP_REQ_SHIFT)) & APU_LMU_CPU1_DYN_STATUS_BANK1_DYN_REP_REQ_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK1_DYN_REP_MASK (0x20U)\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK1_DYN_REP_SHIFT (5U)\r\n/*! BANK1_DYN_REP - Bank1 Dynamic Rep */\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK1_DYN_REP(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_STATUS_BANK1_DYN_REP_SHIFT)) & APU_LMU_CPU1_DYN_STATUS_BANK1_DYN_REP_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK1_FSM_ST_MASK (0xC0U)\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK1_FSM_ST_SHIFT (6U)\r\n/*! BANK1_FSM_ST - Bank1 FSM St */\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK1_FSM_ST(x)  (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_STATUS_BANK1_FSM_ST_SHIFT)) & APU_LMU_CPU1_DYN_STATUS_BANK1_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK2_DYN_REP_REQ_MASK (0x100U)\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK2_DYN_REP_REQ_SHIFT (8U)\r\n/*! BANK2_DYN_REP_REQ - Bank2 Dynamic Rep Request */\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK2_DYN_REP_REQ(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_STATUS_BANK2_DYN_REP_REQ_SHIFT)) & APU_LMU_CPU1_DYN_STATUS_BANK2_DYN_REP_REQ_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK2_DYN_REP_MASK (0x200U)\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK2_DYN_REP_SHIFT (9U)\r\n/*! BANK2_DYN_REP - Bank2 Dynamic Rep */\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK2_DYN_REP(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_STATUS_BANK2_DYN_REP_SHIFT)) & APU_LMU_CPU1_DYN_STATUS_BANK2_DYN_REP_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK2_FSM_ST_MASK (0xC00U)\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK2_FSM_ST_SHIFT (10U)\r\n/*! BANK2_FSM_ST - Bank2 FSM St */\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK2_FSM_ST(x)  (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_STATUS_BANK2_FSM_ST_SHIFT)) & APU_LMU_CPU1_DYN_STATUS_BANK2_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK3_DYN_REP_REQ_MASK (0x1000U)\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK3_DYN_REP_REQ_SHIFT (12U)\r\n/*! BANK3_DYN_REP_REQ - Bank3 Dynamic Rep Request */\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK3_DYN_REP_REQ(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_STATUS_BANK3_DYN_REP_REQ_SHIFT)) & APU_LMU_CPU1_DYN_STATUS_BANK3_DYN_REP_REQ_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK3_DYN_REP_MASK (0x2000U)\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK3_DYN_REP_SHIFT (13U)\r\n/*! BANK3_DYN_REP - Bank3 Dynamic Rep */\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK3_DYN_REP(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_STATUS_BANK3_DYN_REP_SHIFT)) & APU_LMU_CPU1_DYN_STATUS_BANK3_DYN_REP_MASK)\r\n\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK3_FSM_ST_MASK (0xC000U)\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK3_FSM_ST_SHIFT (14U)\r\n/*! BANK3_FSM_ST - Bank3 FSM St */\r\n#define APU_LMU_CPU1_DYN_STATUS_BANK3_FSM_ST(x)  (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU1_DYN_STATUS_BANK3_FSM_ST_SHIFT)) & APU_LMU_CPU1_DYN_STATUS_BANK3_FSM_ST_MASK)\r\n/*! @} */\r\n\r\n/*! @name LMU_CPU2_STA_CFG - LMU CPU2 STA Configuration */\r\n/*! @{ */\r\n\r\n#define APU_LMU_CPU2_STA_CFG_BANK0_STA_OFF_EN_MASK (0x1U)\r\n#define APU_LMU_CPU2_STA_CFG_BANK0_STA_OFF_EN_SHIFT (0U)\r\n/*! BANK0_STA_OFF_EN - Bank0 STA Off Enable */\r\n#define APU_LMU_CPU2_STA_CFG_BANK0_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_CFG_BANK0_STA_OFF_EN_SHIFT)) & APU_LMU_CPU2_STA_CFG_BANK0_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED7_MASK      (0x2U)\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED7_SHIFT     (1U)\r\n/*! RESERVED7 - Reserved 7 */\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED7(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_CFG_RESERVED7_SHIFT)) & APU_LMU_CPU2_STA_CFG_RESERVED7_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_CFG_BANK1_STA_OFF_EN_MASK (0x4U)\r\n#define APU_LMU_CPU2_STA_CFG_BANK1_STA_OFF_EN_SHIFT (2U)\r\n/*! BANK1_STA_OFF_EN - Bank1 STA Off Enable */\r\n#define APU_LMU_CPU2_STA_CFG_BANK1_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_CFG_BANK1_STA_OFF_EN_SHIFT)) & APU_LMU_CPU2_STA_CFG_BANK1_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED6_MASK      (0x8U)\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED6_SHIFT     (3U)\r\n/*! RESERVED6 - Reserved 6 */\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED6(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_CFG_RESERVED6_SHIFT)) & APU_LMU_CPU2_STA_CFG_RESERVED6_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_CFG_BANK2_STA_OFF_EN_MASK (0x10U)\r\n#define APU_LMU_CPU2_STA_CFG_BANK2_STA_OFF_EN_SHIFT (4U)\r\n/*! BANK2_STA_OFF_EN - Bank2 STA Off Enable */\r\n#define APU_LMU_CPU2_STA_CFG_BANK2_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_CFG_BANK2_STA_OFF_EN_SHIFT)) & APU_LMU_CPU2_STA_CFG_BANK2_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED5_MASK      (0x20U)\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED5_SHIFT     (5U)\r\n/*! RESERVED5 - Reserved 5 */\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED5(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_CFG_RESERVED5_SHIFT)) & APU_LMU_CPU2_STA_CFG_RESERVED5_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_CFG_BANK3_STA_OFF_EN_MASK (0x40U)\r\n#define APU_LMU_CPU2_STA_CFG_BANK3_STA_OFF_EN_SHIFT (6U)\r\n/*! BANK3_STA_OFF_EN - Bank3 STA Off Enable */\r\n#define APU_LMU_CPU2_STA_CFG_BANK3_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_CFG_BANK3_STA_OFF_EN_SHIFT)) & APU_LMU_CPU2_STA_CFG_BANK3_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED4_MASK      (0x80U)\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED4_SHIFT     (7U)\r\n/*! RESERVED4 - Reserved 4 */\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED4(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_CFG_RESERVED4_SHIFT)) & APU_LMU_CPU2_STA_CFG_RESERVED4_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_CFG_BANK4_STA_OFF_EN_MASK (0x100U)\r\n#define APU_LMU_CPU2_STA_CFG_BANK4_STA_OFF_EN_SHIFT (8U)\r\n/*! BANK4_STA_OFF_EN - Bank4 STA Off Enable */\r\n#define APU_LMU_CPU2_STA_CFG_BANK4_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_CFG_BANK4_STA_OFF_EN_SHIFT)) & APU_LMU_CPU2_STA_CFG_BANK4_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED3_MASK      (0x200U)\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED3_SHIFT     (9U)\r\n/*! RESERVED3 - Reserved 3 */\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED3(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_CFG_RESERVED3_SHIFT)) & APU_LMU_CPU2_STA_CFG_RESERVED3_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_CFG_BANK5_STA_OFF_EN_MASK (0x400U)\r\n#define APU_LMU_CPU2_STA_CFG_BANK5_STA_OFF_EN_SHIFT (10U)\r\n/*! BANK5_STA_OFF_EN - Bank5 STA Off Enable */\r\n#define APU_LMU_CPU2_STA_CFG_BANK5_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_CFG_BANK5_STA_OFF_EN_SHIFT)) & APU_LMU_CPU2_STA_CFG_BANK5_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED2_MASK      (0x800U)\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED2_SHIFT     (11U)\r\n/*! RESERVED2 - Reserved 2 */\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED2(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_CFG_RESERVED2_SHIFT)) & APU_LMU_CPU2_STA_CFG_RESERVED2_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_CFG_BANK6_STA_OFF_EN_MASK (0x1000U)\r\n#define APU_LMU_CPU2_STA_CFG_BANK6_STA_OFF_EN_SHIFT (12U)\r\n/*! BANK6_STA_OFF_EN - Bank6 STA Off Enable */\r\n#define APU_LMU_CPU2_STA_CFG_BANK6_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_CFG_BANK6_STA_OFF_EN_SHIFT)) & APU_LMU_CPU2_STA_CFG_BANK6_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED1_MASK      (0x2000U)\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED1_SHIFT     (13U)\r\n/*! RESERVED1 - Reserved 1 */\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED1(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_CFG_RESERVED1_SHIFT)) & APU_LMU_CPU2_STA_CFG_RESERVED1_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_CFG_BANK7_STA_OFF_EN_MASK (0x4000U)\r\n#define APU_LMU_CPU2_STA_CFG_BANK7_STA_OFF_EN_SHIFT (14U)\r\n/*! BANK7_STA_OFF_EN - Bank7 STA Off Enable */\r\n#define APU_LMU_CPU2_STA_CFG_BANK7_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_CFG_BANK7_STA_OFF_EN_SHIFT)) & APU_LMU_CPU2_STA_CFG_BANK7_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED0_MASK      (0xFFFF8000U)\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED0_SHIFT     (15U)\r\n/*! RESERVED0 - Reserved 0 */\r\n#define APU_LMU_CPU2_STA_CFG_RESERVED0(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_CFG_RESERVED0_SHIFT)) & APU_LMU_CPU2_STA_CFG_RESERVED0_MASK)\r\n/*! @} */\r\n\r\n/*! @name LMU_CPU2_STA_STATUS1 - LMU CPU2 STA Status 1 */\r\n/*! @{ */\r\n\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK0_FSM_ST_REP_DONE_MASK (0x1U)\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK0_FSM_ST_REP_DONE_SHIFT (0U)\r\n/*! BANK0_FSM_ST_REP_DONE - Bank0 FSM St Rep Done */\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK0_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS1_BANK0_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU2_STA_STATUS1_BANK0_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK0_FSM_ST_MASK (0xEU)\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK0_FSM_ST_SHIFT (1U)\r\n/*! BANK0_FSM_ST - Bank0 FSM St */\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK0_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS1_BANK0_FSM_ST_SHIFT)) & APU_LMU_CPU2_STA_STATUS1_BANK0_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK1_FSM_ST_REP_DONE_MASK (0x10U)\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK1_FSM_ST_REP_DONE_SHIFT (4U)\r\n/*! BANK1_FSM_ST_REP_DONE - Bank1 FSM St Rep Done */\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK1_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS1_BANK1_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU2_STA_STATUS1_BANK1_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK1_FSM_ST_MASK (0xE0U)\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK1_FSM_ST_SHIFT (5U)\r\n/*! BANK1_FSM_ST - Bank1 FSM St */\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK1_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS1_BANK1_FSM_ST_SHIFT)) & APU_LMU_CPU2_STA_STATUS1_BANK1_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK2_FSM_ST_REP_DONE_MASK (0x100U)\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK2_FSM_ST_REP_DONE_SHIFT (8U)\r\n/*! BANK2_FSM_ST_REP_DONE - Bank2 FSM St Rep Done */\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK2_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS1_BANK2_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU2_STA_STATUS1_BANK2_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK2_FSM_ST_MASK (0xE00U)\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK2_FSM_ST_SHIFT (9U)\r\n/*! BANK2_FSM_ST - Bank2FSM St */\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK2_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS1_BANK2_FSM_ST_SHIFT)) & APU_LMU_CPU2_STA_STATUS1_BANK2_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK3_FSM_ST_REP_DONE_MASK (0x1000U)\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK3_FSM_ST_REP_DONE_SHIFT (12U)\r\n/*! BANK3_FSM_ST_REP_DONE - Bank3 FSM St Rep Done */\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK3_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS1_BANK3_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU2_STA_STATUS1_BANK3_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK3_FSM_ST_MASK (0xE000U)\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK3_FSM_ST_SHIFT (13U)\r\n/*! BANK3_FSM_ST - Bank3 FSM St */\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK3_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS1_BANK3_FSM_ST_SHIFT)) & APU_LMU_CPU2_STA_STATUS1_BANK3_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK4_FSM_ST_REP_DONE_MASK (0x10000U)\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK4_FSM_ST_REP_DONE_SHIFT (16U)\r\n/*! BANK4_FSM_ST_REP_DONE - Bank4 FSM St Rep Done */\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK4_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS1_BANK4_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU2_STA_STATUS1_BANK4_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK4_FSM_ST_MASK (0xE0000U)\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK4_FSM_ST_SHIFT (17U)\r\n/*! BANK4_FSM_ST - Bank4 FSM St */\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK4_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS1_BANK4_FSM_ST_SHIFT)) & APU_LMU_CPU2_STA_STATUS1_BANK4_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK5_FSM_ST_REP_DONE_MASK (0x100000U)\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK5_FSM_ST_REP_DONE_SHIFT (20U)\r\n/*! BANK5_FSM_ST_REP_DONE - Bank5 FSM St Rep Done */\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK5_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS1_BANK5_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU2_STA_STATUS1_BANK5_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK5_FSM_ST_MASK (0xE00000U)\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK5_FSM_ST_SHIFT (21U)\r\n/*! BANK5_FSM_ST - Bank5 FSM St */\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK5_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS1_BANK5_FSM_ST_SHIFT)) & APU_LMU_CPU2_STA_STATUS1_BANK5_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK6_FSM_ST_REP_DONE_MASK (0x1000000U)\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK6_FSM_ST_REP_DONE_SHIFT (24U)\r\n/*! BANK6_FSM_ST_REP_DONE - Bank6 FSM St Rep Done */\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK6_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS1_BANK6_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU2_STA_STATUS1_BANK6_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK6_FSM_ST_MASK (0xE000000U)\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK6_FSM_ST_SHIFT (25U)\r\n/*! BANK6_FSM_ST - Bank6 FSM St */\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK6_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS1_BANK6_FSM_ST_SHIFT)) & APU_LMU_CPU2_STA_STATUS1_BANK6_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK7_FSM_ST_REP_DONE_MASK (0x10000000U)\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK7_FSM_ST_REP_DONE_SHIFT (28U)\r\n/*! BANK7_FSM_ST_REP_DONE - Bank7 FSM St Rep Done */\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK7_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS1_BANK7_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU2_STA_STATUS1_BANK7_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK7_FSM_ST_MASK (0xE0000000U)\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK7_FSM_ST_SHIFT (29U)\r\n/*! BANK7_FSM_ST - Bank7 FSM St */\r\n#define APU_LMU_CPU2_STA_STATUS1_BANK7_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS1_BANK7_FSM_ST_SHIFT)) & APU_LMU_CPU2_STA_STATUS1_BANK7_FSM_ST_MASK)\r\n/*! @} */\r\n\r\n/*! @name LMU_CPU3_STA_CFG - LMU CPU3 STA Configuration */\r\n/*! @{ */\r\n\r\n#define APU_LMU_CPU3_STA_CFG_BANK0_STA_OFF_EN_MASK (0x1U)\r\n#define APU_LMU_CPU3_STA_CFG_BANK0_STA_OFF_EN_SHIFT (0U)\r\n/*! BANK0_STA_OFF_EN - Bank0 STA Off Enable */\r\n#define APU_LMU_CPU3_STA_CFG_BANK0_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_CFG_BANK0_STA_OFF_EN_SHIFT)) & APU_LMU_CPU3_STA_CFG_BANK0_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED7_MASK      (0x2U)\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED7_SHIFT     (1U)\r\n/*! RESERVED7 - Reserved 7 */\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED7(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_CFG_RESERVED7_SHIFT)) & APU_LMU_CPU3_STA_CFG_RESERVED7_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_CFG_BANK1_STA_OFF_EN_MASK (0x4U)\r\n#define APU_LMU_CPU3_STA_CFG_BANK1_STA_OFF_EN_SHIFT (2U)\r\n/*! BANK1_STA_OFF_EN - Bank1 STA Off Enable */\r\n#define APU_LMU_CPU3_STA_CFG_BANK1_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_CFG_BANK1_STA_OFF_EN_SHIFT)) & APU_LMU_CPU3_STA_CFG_BANK1_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED6_MASK      (0x8U)\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED6_SHIFT     (3U)\r\n/*! RESERVED6 - Reserved 6 */\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED6(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_CFG_RESERVED6_SHIFT)) & APU_LMU_CPU3_STA_CFG_RESERVED6_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_CFG_BANK2_STA_OFF_EN_MASK (0x10U)\r\n#define APU_LMU_CPU3_STA_CFG_BANK2_STA_OFF_EN_SHIFT (4U)\r\n/*! BANK2_STA_OFF_EN - Bank2 STA Off Enable */\r\n#define APU_LMU_CPU3_STA_CFG_BANK2_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_CFG_BANK2_STA_OFF_EN_SHIFT)) & APU_LMU_CPU3_STA_CFG_BANK2_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED5_MASK      (0x20U)\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED5_SHIFT     (5U)\r\n/*! RESERVED5 - Reserved 5 */\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED5(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_CFG_RESERVED5_SHIFT)) & APU_LMU_CPU3_STA_CFG_RESERVED5_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_CFG_BANK3_STA_OFF_EN_MASK (0x40U)\r\n#define APU_LMU_CPU3_STA_CFG_BANK3_STA_OFF_EN_SHIFT (6U)\r\n/*! BANK3_STA_OFF_EN - Bank3 STA Off Enable */\r\n#define APU_LMU_CPU3_STA_CFG_BANK3_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_CFG_BANK3_STA_OFF_EN_SHIFT)) & APU_LMU_CPU3_STA_CFG_BANK3_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED4_MASK      (0x80U)\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED4_SHIFT     (7U)\r\n/*! RESERVED4 - Reserved 4 */\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED4(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_CFG_RESERVED4_SHIFT)) & APU_LMU_CPU3_STA_CFG_RESERVED4_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_CFG_BANK4_STA_OFF_EN_MASK (0x100U)\r\n#define APU_LMU_CPU3_STA_CFG_BANK4_STA_OFF_EN_SHIFT (8U)\r\n/*! BANK4_STA_OFF_EN - Bank4 STA Off Enable */\r\n#define APU_LMU_CPU3_STA_CFG_BANK4_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_CFG_BANK4_STA_OFF_EN_SHIFT)) & APU_LMU_CPU3_STA_CFG_BANK4_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED3_MASK      (0x200U)\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED3_SHIFT     (9U)\r\n/*! RESERVED3 - Reserved 3 */\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED3(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_CFG_RESERVED3_SHIFT)) & APU_LMU_CPU3_STA_CFG_RESERVED3_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_CFG_BANK5_STA_OFF_EN_MASK (0x400U)\r\n#define APU_LMU_CPU3_STA_CFG_BANK5_STA_OFF_EN_SHIFT (10U)\r\n/*! BANK5_STA_OFF_EN - Bank5 STA Off Enable */\r\n#define APU_LMU_CPU3_STA_CFG_BANK5_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_CFG_BANK5_STA_OFF_EN_SHIFT)) & APU_LMU_CPU3_STA_CFG_BANK5_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED2_MASK      (0x800U)\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED2_SHIFT     (11U)\r\n/*! RESERVED2 - Reserved 2 */\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED2(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_CFG_RESERVED2_SHIFT)) & APU_LMU_CPU3_STA_CFG_RESERVED2_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_CFG_BANK6_STA_OFF_EN_MASK (0x1000U)\r\n#define APU_LMU_CPU3_STA_CFG_BANK6_STA_OFF_EN_SHIFT (12U)\r\n/*! BANK6_STA_OFF_EN - Bank6 STA Off Enable */\r\n#define APU_LMU_CPU3_STA_CFG_BANK6_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_CFG_BANK6_STA_OFF_EN_SHIFT)) & APU_LMU_CPU3_STA_CFG_BANK6_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED1_MASK      (0x2000U)\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED1_SHIFT     (13U)\r\n/*! RESERVED1 - Reserved 1 */\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED1(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_CFG_RESERVED1_SHIFT)) & APU_LMU_CPU3_STA_CFG_RESERVED1_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_CFG_BANK7_STA_OFF_EN_MASK (0x4000U)\r\n#define APU_LMU_CPU3_STA_CFG_BANK7_STA_OFF_EN_SHIFT (14U)\r\n/*! BANK7_STA_OFF_EN - Bank7 STA Off Enable */\r\n#define APU_LMU_CPU3_STA_CFG_BANK7_STA_OFF_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_CFG_BANK7_STA_OFF_EN_SHIFT)) & APU_LMU_CPU3_STA_CFG_BANK7_STA_OFF_EN_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED0_MASK      (0xFFFF8000U)\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED0_SHIFT     (15U)\r\n/*! RESERVED0 - Reserved 0 */\r\n#define APU_LMU_CPU3_STA_CFG_RESERVED0(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_CFG_RESERVED0_SHIFT)) & APU_LMU_CPU3_STA_CFG_RESERVED0_MASK)\r\n/*! @} */\r\n\r\n/*! @name LMU_CPU3_STA_STATUS1 - LMU CPU3 STA Status 1 */\r\n/*! @{ */\r\n\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK0_FSM_ST_REP_DONE_MASK (0x1U)\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK0_FSM_ST_REP_DONE_SHIFT (0U)\r\n/*! BANK0_FSM_ST_REP_DONE - Bank0 FSM St Rep Done */\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK0_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS1_BANK0_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU3_STA_STATUS1_BANK0_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK0_FSM_ST_MASK (0xEU)\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK0_FSM_ST_SHIFT (1U)\r\n/*! BANK0_FSM_ST - Bank0 FSM St */\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK0_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS1_BANK0_FSM_ST_SHIFT)) & APU_LMU_CPU3_STA_STATUS1_BANK0_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK1_FSM_ST_REP_DONE_MASK (0x10U)\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK1_FSM_ST_REP_DONE_SHIFT (4U)\r\n/*! BANK1_FSM_ST_REP_DONE - Bank1 FSM St Rep Done */\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK1_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS1_BANK1_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU3_STA_STATUS1_BANK1_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK1_FSM_ST_MASK (0xE0U)\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK1_FSM_ST_SHIFT (5U)\r\n/*! BANK1_FSM_ST - Bank1 FSM St */\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK1_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS1_BANK1_FSM_ST_SHIFT)) & APU_LMU_CPU3_STA_STATUS1_BANK1_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK2_FSM_ST_REP_DONE_MASK (0x100U)\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK2_FSM_ST_REP_DONE_SHIFT (8U)\r\n/*! BANK2_FSM_ST_REP_DONE - Bank2 FSM St Rep Done */\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK2_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS1_BANK2_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU3_STA_STATUS1_BANK2_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK2_FSM_ST_MASK (0xE00U)\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK2_FSM_ST_SHIFT (9U)\r\n/*! BANK2_FSM_ST - Bank2FSM St */\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK2_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS1_BANK2_FSM_ST_SHIFT)) & APU_LMU_CPU3_STA_STATUS1_BANK2_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK3_FSM_ST_REP_DONE_MASK (0x1000U)\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK3_FSM_ST_REP_DONE_SHIFT (12U)\r\n/*! BANK3_FSM_ST_REP_DONE - Bank3 FSM St Rep Done */\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK3_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS1_BANK3_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU3_STA_STATUS1_BANK3_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK3_FSM_ST_MASK (0xE000U)\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK3_FSM_ST_SHIFT (13U)\r\n/*! BANK3_FSM_ST - Bank3 FSM St */\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK3_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS1_BANK3_FSM_ST_SHIFT)) & APU_LMU_CPU3_STA_STATUS1_BANK3_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK4_FSM_ST_REP_DONE_MASK (0x10000U)\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK4_FSM_ST_REP_DONE_SHIFT (16U)\r\n/*! BANK4_FSM_ST_REP_DONE - Bank4 FSM St Rep Done */\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK4_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS1_BANK4_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU3_STA_STATUS1_BANK4_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK4_FSM_ST_MASK (0xE0000U)\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK4_FSM_ST_SHIFT (17U)\r\n/*! BANK4_FSM_ST - Bank4 FSM St */\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK4_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS1_BANK4_FSM_ST_SHIFT)) & APU_LMU_CPU3_STA_STATUS1_BANK4_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK5_FSM_ST_REP_DONE_MASK (0x100000U)\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK5_FSM_ST_REP_DONE_SHIFT (20U)\r\n/*! BANK5_FSM_ST_REP_DONE - Bank5 FSM St Rep Done */\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK5_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS1_BANK5_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU3_STA_STATUS1_BANK5_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK5_FSM_ST_MASK (0xE00000U)\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK5_FSM_ST_SHIFT (21U)\r\n/*! BANK5_FSM_ST - Bank5 FSM St */\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK5_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS1_BANK5_FSM_ST_SHIFT)) & APU_LMU_CPU3_STA_STATUS1_BANK5_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK6_FSM_ST_REP_DONE_MASK (0x1000000U)\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK6_FSM_ST_REP_DONE_SHIFT (24U)\r\n/*! BANK6_FSM_ST_REP_DONE - Bank6 FSM St Rep Done */\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK6_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS1_BANK6_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU3_STA_STATUS1_BANK6_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK6_FSM_ST_MASK (0xE000000U)\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK6_FSM_ST_SHIFT (25U)\r\n/*! BANK6_FSM_ST - Bank6 FSM St */\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK6_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS1_BANK6_FSM_ST_SHIFT)) & APU_LMU_CPU3_STA_STATUS1_BANK6_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK7_FSM_ST_REP_DONE_MASK (0x10000000U)\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK7_FSM_ST_REP_DONE_SHIFT (28U)\r\n/*! BANK7_FSM_ST_REP_DONE - Bank7 FSM St Rep Done */\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK7_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS1_BANK7_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU3_STA_STATUS1_BANK7_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK7_FSM_ST_MASK (0xE0000000U)\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK7_FSM_ST_SHIFT (29U)\r\n/*! BANK7_FSM_ST - Bank7 FSM St */\r\n#define APU_LMU_CPU3_STA_STATUS1_BANK7_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS1_BANK7_FSM_ST_SHIFT)) & APU_LMU_CPU3_STA_STATUS1_BANK7_FSM_ST_MASK)\r\n/*! @} */\r\n\r\n/*! @name LMU_G2BIST_CTRL - LMU G2BIST Control */\r\n/*! @{ */\r\n\r\n#define APU_LMU_G2BIST_CTRL_LMU_G2BIST_MODE_MASK (0x1FU)\r\n#define APU_LMU_G2BIST_CTRL_LMU_G2BIST_MODE_SHIFT (0U)\r\n/*! LMU_G2BIST_MODE - 1 = fuse load mode, default mode when powered up. All repairable memories will be repaired by g2bist engine */\r\n#define APU_LMU_G2BIST_CTRL_LMU_G2BIST_MODE(x)   (((uint32_t)(((uint32_t)(x)) << APU_LMU_G2BIST_CTRL_LMU_G2BIST_MODE_SHIFT)) & APU_LMU_G2BIST_CTRL_LMU_G2BIST_MODE_MASK)\r\n\r\n#define APU_LMU_G2BIST_CTRL_DISABLE_STA_REPAIR_MASK (0x20000000U)\r\n#define APU_LMU_G2BIST_CTRL_DISABLE_STA_REPAIR_SHIFT (29U)\r\n/*! DISABLE_STA_REPAIR - 1= disable static memory repair */\r\n#define APU_LMU_G2BIST_CTRL_DISABLE_STA_REPAIR(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_G2BIST_CTRL_DISABLE_STA_REPAIR_SHIFT)) & APU_LMU_G2BIST_CTRL_DISABLE_STA_REPAIR_MASK)\r\n\r\n#define APU_LMU_G2BIST_CTRL_DISABLE_DYN_REPAIR_MASK (0x40000000U)\r\n#define APU_LMU_G2BIST_CTRL_DISABLE_DYN_REPAIR_SHIFT (30U)\r\n/*! DISABLE_DYN_REPAIR - 1= disable dynamic memory repair */\r\n#define APU_LMU_G2BIST_CTRL_DISABLE_DYN_REPAIR(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_G2BIST_CTRL_DISABLE_DYN_REPAIR_SHIFT)) & APU_LMU_G2BIST_CTRL_DISABLE_DYN_REPAIR_MASK)\r\n/*! @} */\r\n\r\n/*! @name LMU_STATUS - LMU Status */\r\n/*! @{ */\r\n\r\n#define APU_LMU_STATUS_REPAIR_FSM_ST_MASK        (0xFU)\r\n#define APU_LMU_STATUS_REPAIR_FSM_ST_SHIFT       (0U)\r\n/*! REPAIR_FSM_ST - Repair FSM St */\r\n#define APU_LMU_STATUS_REPAIR_FSM_ST(x)          (((uint32_t)(((uint32_t)(x)) << APU_LMU_STATUS_REPAIR_FSM_ST_SHIFT)) & APU_LMU_STATUS_REPAIR_FSM_ST_MASK)\r\n\r\n#define APU_LMU_STATUS_NXT_ST_MASK               (0xF0U)\r\n#define APU_LMU_STATUS_NXT_ST_SHIFT              (4U)\r\n/*! NXT_ST - NXT St */\r\n#define APU_LMU_STATUS_NXT_ST(x)                 (((uint32_t)(((uint32_t)(x)) << APU_LMU_STATUS_NXT_ST_SHIFT)) & APU_LMU_STATUS_NXT_ST_MASK)\r\n\r\n#define APU_LMU_STATUS_LMU_G2BIST_MODE_MASK      (0xF00U)\r\n#define APU_LMU_STATUS_LMU_G2BIST_MODE_SHIFT     (8U)\r\n/*! LMU_G2BIST_MODE - LMU_g to BIST Mode */\r\n#define APU_LMU_STATUS_LMU_G2BIST_MODE(x)        (((uint32_t)(((uint32_t)(x)) << APU_LMU_STATUS_LMU_G2BIST_MODE_SHIFT)) & APU_LMU_STATUS_LMU_G2BIST_MODE_MASK)\r\n\r\n#define APU_LMU_STATUS_LMU_G2BIST_PWRDMN_RPR_REQ_MASK (0xFF000U)\r\n#define APU_LMU_STATUS_LMU_G2BIST_PWRDMN_RPR_REQ_SHIFT (12U)\r\n/*! LMU_G2BIST_PWRDMN_RPR_REQ - LMU_g to BIST Powerdown RPR Request */\r\n#define APU_LMU_STATUS_LMU_G2BIST_PWRDMN_RPR_REQ(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_STATUS_LMU_G2BIST_PWRDMN_RPR_REQ_SHIFT)) & APU_LMU_STATUS_LMU_G2BIST_PWRDMN_RPR_REQ_MASK)\r\n\r\n#define APU_LMU_STATUS_LMU_G2BIST_START_MASK     (0x100000U)\r\n#define APU_LMU_STATUS_LMU_G2BIST_START_SHIFT    (20U)\r\n/*! LMU_G2BIST_START - LMU_g to BIST Start */\r\n#define APU_LMU_STATUS_LMU_G2BIST_START(x)       (((uint32_t)(((uint32_t)(x)) << APU_LMU_STATUS_LMU_G2BIST_START_SHIFT)) & APU_LMU_STATUS_LMU_G2BIST_START_MASK)\r\n/*! @} */\r\n\r\n/*! @name LMU_STA_CFG_MASK - LMU STA Configuration Mask */\r\n/*! @{ */\r\n\r\n#define APU_LMU_STA_CFG_MASK_STA_CFG_MASK_MASK   (0xFFU)\r\n#define APU_LMU_STA_CFG_MASK_STA_CFG_MASK_SHIFT  (0U)\r\n/*! STA_CFG_MASK - STA Configuration Mask */\r\n#define APU_LMU_STA_CFG_MASK_STA_CFG_MASK(x)     (((uint32_t)(((uint32_t)(x)) << APU_LMU_STA_CFG_MASK_STA_CFG_MASK_SHIFT)) & APU_LMU_STA_CFG_MASK_STA_CFG_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name LMU_CPU2_STA_STATUS2 - LMU CPU2 STA Status 2 */\r\n/*! @{ */\r\n\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK8_FSM_ST_REP_DONE_MASK (0x1U)\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK8_FSM_ST_REP_DONE_SHIFT (0U)\r\n/*! BANK8_FSM_ST_REP_DONE - Bank8 FSM St Rep Done */\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK8_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS2_BANK8_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU2_STA_STATUS2_BANK8_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK8_FSM_ST_MASK (0xEU)\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK8_FSM_ST_SHIFT (1U)\r\n/*! BANK8_FSM_ST - Bank8 FSM St */\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK8_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS2_BANK8_FSM_ST_SHIFT)) & APU_LMU_CPU2_STA_STATUS2_BANK8_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK9_FSM_ST_REP_DONE_MASK (0x10U)\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK9_FSM_ST_REP_DONE_SHIFT (4U)\r\n/*! BANK9_FSM_ST_REP_DONE - Bank9 FSM St Rep Done */\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK9_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS2_BANK9_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU2_STA_STATUS2_BANK9_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK9_FSM_ST_MASK (0xE0U)\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK9_FSM_ST_SHIFT (5U)\r\n/*! BANK9_FSM_ST - Bank9 FSM St */\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK9_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS2_BANK9_FSM_ST_SHIFT)) & APU_LMU_CPU2_STA_STATUS2_BANK9_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK10_FSM_ST_REP_DONE_MASK (0x100U)\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK10_FSM_ST_REP_DONE_SHIFT (8U)\r\n/*! BANK10_FSM_ST_REP_DONE - Bank10 FSM St Rep Done */\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK10_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS2_BANK10_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU2_STA_STATUS2_BANK10_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK10_FSM_ST_MASK (0xE00U)\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK10_FSM_ST_SHIFT (9U)\r\n/*! BANK10_FSM_ST - Bank10 FSM St */\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK10_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS2_BANK10_FSM_ST_SHIFT)) & APU_LMU_CPU2_STA_STATUS2_BANK10_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK11_FSM_ST_REP_DONE_MASK (0x1000U)\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK11_FSM_ST_REP_DONE_SHIFT (12U)\r\n/*! BANK11_FSM_ST_REP_DONE - Bank11 FSM St Rep Done */\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK11_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS2_BANK11_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU2_STA_STATUS2_BANK11_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK11_FSM_ST_MASK (0xE000U)\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK11_FSM_ST_SHIFT (13U)\r\n/*! BANK11_FSM_ST - Bank11 FSM St */\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK11_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS2_BANK11_FSM_ST_SHIFT)) & APU_LMU_CPU2_STA_STATUS2_BANK11_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK12_FSM_ST_REP_DONE_MASK (0x10000U)\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK12_FSM_ST_REP_DONE_SHIFT (16U)\r\n/*! BANK12_FSM_ST_REP_DONE - Bank12 FSM St Rep Done */\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK12_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS2_BANK12_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU2_STA_STATUS2_BANK12_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK12_FSM_ST_MASK (0xE0000U)\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK12_FSM_ST_SHIFT (17U)\r\n/*! BANK12_FSM_ST - Bank12 FSM St */\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK12_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS2_BANK12_FSM_ST_SHIFT)) & APU_LMU_CPU2_STA_STATUS2_BANK12_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK13_FSM_ST_REP_DONE_MASK (0x100000U)\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK13_FSM_ST_REP_DONE_SHIFT (20U)\r\n/*! BANK13_FSM_ST_REP_DONE - Bank13 FSM St Rep Done */\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK13_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS2_BANK13_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU2_STA_STATUS2_BANK13_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK13_FSM_ST_MASK (0xE00000U)\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK13_FSM_ST_SHIFT (21U)\r\n/*! BANK13_FSM_ST - Bank13 FSM St */\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK13_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS2_BANK13_FSM_ST_SHIFT)) & APU_LMU_CPU2_STA_STATUS2_BANK13_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK14_FSM_ST_REP_DONE_MASK (0x1000000U)\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK14_FSM_ST_REP_DONE_SHIFT (24U)\r\n/*! BANK14_FSM_ST_REP_DONE - Bank14 FSM St Rep Done */\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK14_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS2_BANK14_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU2_STA_STATUS2_BANK14_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK14_FSM_ST_MASK (0xE000000U)\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK14_FSM_ST_SHIFT (25U)\r\n/*! BANK14_FSM_ST - Bank14 FSM St */\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK14_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS2_BANK14_FSM_ST_SHIFT)) & APU_LMU_CPU2_STA_STATUS2_BANK14_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK15_FSM_ST_REP_DONE_MASK (0x10000000U)\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK15_FSM_ST_REP_DONE_SHIFT (28U)\r\n/*! BANK15_FSM_ST_REP_DONE - Bank15 FSM St Rep Done */\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK15_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS2_BANK15_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU2_STA_STATUS2_BANK15_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK15_FSM_ST_MASK (0xE0000000U)\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK15_FSM_ST_SHIFT (29U)\r\n/*! BANK15_FSM_ST - Bank15 FSM St */\r\n#define APU_LMU_CPU2_STA_STATUS2_BANK15_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU2_STA_STATUS2_BANK15_FSM_ST_SHIFT)) & APU_LMU_CPU2_STA_STATUS2_BANK15_FSM_ST_MASK)\r\n/*! @} */\r\n\r\n/*! @name LMU_CPU3_STA_STATUS2 - LMU CPU3 STA Status 2 */\r\n/*! @{ */\r\n\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK8_FSM_ST_REP_DONE_MASK (0x1U)\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK8_FSM_ST_REP_DONE_SHIFT (0U)\r\n/*! BANK8_FSM_ST_REP_DONE - Bank8 FSM St Rep Done */\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK8_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS2_BANK8_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU3_STA_STATUS2_BANK8_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK8_FSM_ST_MASK (0xEU)\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK8_FSM_ST_SHIFT (1U)\r\n/*! BANK8_FSM_ST - Bank8 FSM St */\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK8_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS2_BANK8_FSM_ST_SHIFT)) & APU_LMU_CPU3_STA_STATUS2_BANK8_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK9_FSM_ST_REP_DONE_MASK (0x10U)\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK9_FSM_ST_REP_DONE_SHIFT (4U)\r\n/*! BANK9_FSM_ST_REP_DONE - Bank9 FSM St Rep Done */\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK9_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS2_BANK9_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU3_STA_STATUS2_BANK9_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK9_FSM_ST_MASK (0xE0U)\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK9_FSM_ST_SHIFT (5U)\r\n/*! BANK9_FSM_ST - Bank9 FSM St */\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK9_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS2_BANK9_FSM_ST_SHIFT)) & APU_LMU_CPU3_STA_STATUS2_BANK9_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK10_FSM_ST_REP_DONE_MASK (0x100U)\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK10_FSM_ST_REP_DONE_SHIFT (8U)\r\n/*! BANK10_FSM_ST_REP_DONE - Bank10 FSM St Rep Done */\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK10_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS2_BANK10_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU3_STA_STATUS2_BANK10_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK10_FSM_ST_MASK (0xE00U)\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK10_FSM_ST_SHIFT (9U)\r\n/*! BANK10_FSM_ST - Bank10 FSM St */\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK10_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS2_BANK10_FSM_ST_SHIFT)) & APU_LMU_CPU3_STA_STATUS2_BANK10_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK11_FSM_ST_REP_DONE_MASK (0x1000U)\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK11_FSM_ST_REP_DONE_SHIFT (12U)\r\n/*! BANK11_FSM_ST_REP_DONE - Bank11 FSM St Rep Done */\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK11_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS2_BANK11_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU3_STA_STATUS2_BANK11_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK11_FSM_ST_MASK (0xE000U)\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK11_FSM_ST_SHIFT (13U)\r\n/*! BANK11_FSM_ST - Bank11 FSM St */\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK11_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS2_BANK11_FSM_ST_SHIFT)) & APU_LMU_CPU3_STA_STATUS2_BANK11_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK12_FSM_ST_REP_DONE_MASK (0x10000U)\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK12_FSM_ST_REP_DONE_SHIFT (16U)\r\n/*! BANK12_FSM_ST_REP_DONE - Bank12 FSM St Rep Done */\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK12_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS2_BANK12_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU3_STA_STATUS2_BANK12_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK12_FSM_ST_MASK (0xE0000U)\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK12_FSM_ST_SHIFT (17U)\r\n/*! BANK12_FSM_ST - Bank12 FSM St */\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK12_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS2_BANK12_FSM_ST_SHIFT)) & APU_LMU_CPU3_STA_STATUS2_BANK12_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK13_FSM_ST_REP_DONE_MASK (0x100000U)\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK13_FSM_ST_REP_DONE_SHIFT (20U)\r\n/*! BANK13_FSM_ST_REP_DONE - Bank13 FSM St Rep Done */\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK13_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS2_BANK13_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU3_STA_STATUS2_BANK13_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK13_FSM_ST_MASK (0xE00000U)\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK13_FSM_ST_SHIFT (21U)\r\n/*! BANK13_FSM_ST - Bank13 FSM St */\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK13_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS2_BANK13_FSM_ST_SHIFT)) & APU_LMU_CPU3_STA_STATUS2_BANK13_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK14_FSM_ST_REP_DONE_MASK (0x1000000U)\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK14_FSM_ST_REP_DONE_SHIFT (24U)\r\n/*! BANK14_FSM_ST_REP_DONE - Bank14 FSM St Rep Done */\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK14_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS2_BANK14_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU3_STA_STATUS2_BANK14_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK14_FSM_ST_MASK (0xE000000U)\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK14_FSM_ST_SHIFT (25U)\r\n/*! BANK14_FSM_ST - Bank14 FSM St */\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK14_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS2_BANK14_FSM_ST_SHIFT)) & APU_LMU_CPU3_STA_STATUS2_BANK14_FSM_ST_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK15_FSM_ST_REP_DONE_MASK (0x10000000U)\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK15_FSM_ST_REP_DONE_SHIFT (28U)\r\n/*! BANK15_FSM_ST_REP_DONE - Bank15 FSM St Rep Done */\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK15_FSM_ST_REP_DONE(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS2_BANK15_FSM_ST_REP_DONE_SHIFT)) & APU_LMU_CPU3_STA_STATUS2_BANK15_FSM_ST_REP_DONE_MASK)\r\n\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK15_FSM_ST_MASK (0xE0000000U)\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK15_FSM_ST_SHIFT (29U)\r\n/*! BANK15_FSM_ST - Bank15 FSM St */\r\n#define APU_LMU_CPU3_STA_STATUS2_BANK15_FSM_ST(x) (((uint32_t)(((uint32_t)(x)) << APU_LMU_CPU3_STA_STATUS2_BANK15_FSM_ST_SHIFT)) & APU_LMU_CPU3_STA_STATUS2_BANK15_FSM_ST_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU3_HOST_WKUP_MASK - CPU3 Host Wakeup Mask */\r\n/*! @{ */\r\n\r\n#define APU_CPU3_HOST_WKUP_MASK_HOST_WKUP_MASK_MASK (0xFFFFU)\r\n#define APU_CPU3_HOST_WKUP_MASK_HOST_WKUP_MASK_SHIFT (0U)\r\n/*! HOST_WKUP_MASK - Host Wakeup Mask */\r\n#define APU_CPU3_HOST_WKUP_MASK_HOST_WKUP_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU3_HOST_WKUP_MASK_HOST_WKUP_MASK_SHIFT)) & APU_CPU3_HOST_WKUP_MASK_HOST_WKUP_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU3_HOST_WKUP_POL - CPU3 Host Wakeup Polarity */\r\n/*! @{ */\r\n\r\n#define APU_CPU3_HOST_WKUP_POL_HOST_WKUP_POL_MASK (0xFFFFU)\r\n#define APU_CPU3_HOST_WKUP_POL_HOST_WKUP_POL_SHIFT (0U)\r\n/*! HOST_WKUP_POL - Host Wakeup Polarity */\r\n#define APU_CPU3_HOST_WKUP_POL_HOST_WKUP_POL(x)  (((uint32_t)(((uint32_t)(x)) << APU_CPU3_HOST_WKUP_POL_HOST_WKUP_POL_SHIFT)) & APU_CPU3_HOST_WKUP_POL_HOST_WKUP_POL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU3_HOST_WKUP_CTRL - CPU3 Host Wakeup Control */\r\n/*! @{ */\r\n\r\n#define APU_CPU3_HOST_WKUP_CTRL_HOST_WKUP_CTRL_MASK (0xFFFFU)\r\n#define APU_CPU3_HOST_WKUP_CTRL_HOST_WKUP_CTRL_SHIFT (0U)\r\n/*! HOST_WKUP_CTRL - Host Wakeup Control */\r\n#define APU_CPU3_HOST_WKUP_CTRL_HOST_WKUP_CTRL(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU3_HOST_WKUP_CTRL_HOST_WKUP_CTRL_SHIFT)) & APU_CPU3_HOST_WKUP_CTRL_HOST_WKUP_CTRL_MASK)\r\n\r\n#define APU_CPU3_HOST_WKUP_CTRL_HOST_INTR_MASK_MASK (0xFFFF0000U)\r\n#define APU_CPU3_HOST_WKUP_CTRL_HOST_INTR_MASK_SHIFT (16U)\r\n/*! HOST_INTR_MASK - Host Interrupt Mask */\r\n#define APU_CPU3_HOST_WKUP_CTRL_HOST_INTR_MASK(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU3_HOST_WKUP_CTRL_HOST_INTR_MASK_SHIFT)) & APU_CPU3_HOST_WKUP_CTRL_HOST_INTR_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU3_CTRL - CPU3 Control */\r\n/*! @{ */\r\n\r\n#define APU_CPU3_CTRL_CPU3_MSG_RDY_MASK_MASK     (0x1U)\r\n#define APU_CPU3_CTRL_CPU3_MSG_RDY_MASK_SHIFT    (0U)\r\n/*! CPU3_MSG_RDY_MASK - CPU3 Message Ready Mask */\r\n#define APU_CPU3_CTRL_CPU3_MSG_RDY_MASK(x)       (((uint32_t)(((uint32_t)(x)) << APU_CPU3_CTRL_CPU3_MSG_RDY_MASK_SHIFT)) & APU_CPU3_CTRL_CPU3_MSG_RDY_MASK_MASK)\r\n\r\n#define APU_CPU3_CTRL_CPU3_CP15_SLP_BYPASS_VAL_MASK (0x4U)\r\n#define APU_CPU3_CTRL_CPU3_CP15_SLP_BYPASS_VAL_SHIFT (2U)\r\n/*! CPU3_CP15_SLP_BYPASS_VAL - CPU3 CP15 Sleep Bypass Value */\r\n#define APU_CPU3_CTRL_CPU3_CP15_SLP_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU3_CTRL_CPU3_CP15_SLP_BYPASS_VAL_SHIFT)) & APU_CPU3_CTRL_CPU3_CP15_SLP_BYPASS_VAL_MASK)\r\n\r\n#define APU_CPU3_CTRL_CPU3_CP15_SLP_BYPASS_EN_MASK (0x8U)\r\n#define APU_CPU3_CTRL_CPU3_CP15_SLP_BYPASS_EN_SHIFT (3U)\r\n/*! CPU3_CP15_SLP_BYPASS_EN - CPU3 CP15 Sleep Bypass Enable */\r\n#define APU_CPU3_CTRL_CPU3_CP15_SLP_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU3_CTRL_CPU3_CP15_SLP_BYPASS_EN_SHIFT)) & APU_CPU3_CTRL_CPU3_CP15_SLP_BYPASS_EN_MASK)\r\n\r\n#define APU_CPU3_CTRL_SOC_USE_REF_ONLY_MASK      (0x10U)\r\n#define APU_CPU3_CTRL_SOC_USE_REF_ONLY_SHIFT     (4U)\r\n/*! SOC_USE_REF_ONLY - SoC Use Ref Only */\r\n#define APU_CPU3_CTRL_SOC_USE_REF_ONLY(x)        (((uint32_t)(((uint32_t)(x)) << APU_CPU3_CTRL_SOC_USE_REF_ONLY_SHIFT)) & APU_CPU3_CTRL_SOC_USE_REF_ONLY_MASK)\r\n\r\n#define APU_CPU3_CTRL_GENERIC_TIMER_EN2_MASK     (0x20U)\r\n#define APU_CPU3_CTRL_GENERIC_TIMER_EN2_SHIFT    (5U)\r\n/*! GENERIC_TIMER_EN2 - Generic Timer Enable 2 */\r\n#define APU_CPU3_CTRL_GENERIC_TIMER_EN2(x)       (((uint32_t)(((uint32_t)(x)) << APU_CPU3_CTRL_GENERIC_TIMER_EN2_SHIFT)) & APU_CPU3_CTRL_GENERIC_TIMER_EN2_MASK)\r\n\r\n#define APU_CPU3_CTRL_APU_SUBSYS3_HOST_MASK      (0x70000U)\r\n#define APU_CPU3_CTRL_APU_SUBSYS3_HOST_SHIFT     (16U)\r\n/*! APU_SUBSYS3_HOST - APU Subsystem 2 Host */\r\n#define APU_CPU3_CTRL_APU_SUBSYS3_HOST(x)        (((uint32_t)(((uint32_t)(x)) << APU_CPU3_CTRL_APU_SUBSYS3_HOST_SHIFT)) & APU_CPU3_CTRL_APU_SUBSYS3_HOST_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU3_DVFS_CTRL - CPU3 DVFS Control */\r\n/*! @{ */\r\n\r\n#define APU_CPU3_DVFS_CTRL_CPU3_ACTIVE_INDEX_MASK (0xFU)\r\n#define APU_CPU3_DVFS_CTRL_CPU3_ACTIVE_INDEX_SHIFT (0U)\r\n/*! CPU3_ACTIVE_INDEX - CPU3 Active Index */\r\n#define APU_CPU3_DVFS_CTRL_CPU3_ACTIVE_INDEX(x)  (((uint32_t)(((uint32_t)(x)) << APU_CPU3_DVFS_CTRL_CPU3_ACTIVE_INDEX_SHIFT)) & APU_CPU3_DVFS_CTRL_CPU3_ACTIVE_INDEX_MASK)\r\n\r\n#define APU_CPU3_DVFS_CTRL_CPU3_INACTIVE_INDEX_MASK (0xF0U)\r\n#define APU_CPU3_DVFS_CTRL_CPU3_INACTIVE_INDEX_SHIFT (4U)\r\n/*! CPU3_INACTIVE_INDEX - CPU3 Inactive Index */\r\n#define APU_CPU3_DVFS_CTRL_CPU3_INACTIVE_INDEX(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU3_DVFS_CTRL_CPU3_INACTIVE_INDEX_SHIFT)) & APU_CPU3_DVFS_CTRL_CPU3_INACTIVE_INDEX_MASK)\r\n\r\n#define APU_CPU3_DVFS_CTRL_CPU3_ACTIVE_SYS_INDEX_MASK (0xF00U)\r\n#define APU_CPU3_DVFS_CTRL_CPU3_ACTIVE_SYS_INDEX_SHIFT (8U)\r\n/*! CPU3_ACTIVE_SYS_INDEX - CPU3 Active System Index */\r\n#define APU_CPU3_DVFS_CTRL_CPU3_ACTIVE_SYS_INDEX(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU3_DVFS_CTRL_CPU3_ACTIVE_SYS_INDEX_SHIFT)) & APU_CPU3_DVFS_CTRL_CPU3_ACTIVE_SYS_INDEX_MASK)\r\n\r\n#define APU_CPU3_DVFS_CTRL_CPU3_INACTIVE_SYS_INDEX_MASK (0xF000U)\r\n#define APU_CPU3_DVFS_CTRL_CPU3_INACTIVE_SYS_INDEX_SHIFT (12U)\r\n/*! CPU3_INACTIVE_SYS_INDEX - CPU3 Inactive System Index */\r\n#define APU_CPU3_DVFS_CTRL_CPU3_INACTIVE_SYS_INDEX(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU3_DVFS_CTRL_CPU3_INACTIVE_SYS_INDEX_SHIFT)) & APU_CPU3_DVFS_CTRL_CPU3_INACTIVE_SYS_INDEX_MASK)\r\n\r\n#define APU_CPU3_DVFS_CTRL_CPU3_ACTIVE_AHB1_INDEX_MASK (0xF0000U)\r\n#define APU_CPU3_DVFS_CTRL_CPU3_ACTIVE_AHB1_INDEX_SHIFT (16U)\r\n/*! CPU3_ACTIVE_AHB1_INDEX - CPU3 Active AHB1 Index */\r\n#define APU_CPU3_DVFS_CTRL_CPU3_ACTIVE_AHB1_INDEX(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU3_DVFS_CTRL_CPU3_ACTIVE_AHB1_INDEX_SHIFT)) & APU_CPU3_DVFS_CTRL_CPU3_ACTIVE_AHB1_INDEX_MASK)\r\n\r\n#define APU_CPU3_DVFS_CTRL_CPU3_INACTIVE_AHB1_INDEX_MASK (0xF00000U)\r\n#define APU_CPU3_DVFS_CTRL_CPU3_INACTIVE_AHB1_INDEX_SHIFT (20U)\r\n/*! CPU3_INACTIVE_AHB1_INDEX - CPU3 Inactive AHB1 Index */\r\n#define APU_CPU3_DVFS_CTRL_CPU3_INACTIVE_AHB1_INDEX(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU3_DVFS_CTRL_CPU3_INACTIVE_AHB1_INDEX_SHIFT)) & APU_CPU3_DVFS_CTRL_CPU3_INACTIVE_AHB1_INDEX_MASK)\r\n\r\n#define APU_CPU3_DVFS_CTRL_CPU3_AHB1_INDEX_SEL_METHOD_MASK (0x1000000U)\r\n#define APU_CPU3_DVFS_CTRL_CPU3_AHB1_INDEX_SEL_METHOD_SHIFT (24U)\r\n/*! CPU3_AHB1_INDEX_SEL_METHOD - CPU3 AHB1 index select method */\r\n#define APU_CPU3_DVFS_CTRL_CPU3_AHB1_INDEX_SEL_METHOD(x) (((uint32_t)(((uint32_t)(x)) << APU_CPU3_DVFS_CTRL_CPU3_AHB1_INDEX_SEL_METHOD_SHIFT)) & APU_CPU3_DVFS_CTRL_CPU3_AHB1_INDEX_SEL_METHOD_MASK)\r\n\r\n#define APU_CPU3_DVFS_CTRL_UART_VOL_VAL_MASK     (0xFE000000U)\r\n#define APU_CPU3_DVFS_CTRL_UART_VOL_VAL_SHIFT    (25U)\r\n/*! UART_VOL_VAL - UART Vol Value */\r\n#define APU_CPU3_DVFS_CTRL_UART_VOL_VAL(x)       (((uint32_t)(((uint32_t)(x)) << APU_CPU3_DVFS_CTRL_UART_VOL_VAL_SHIFT)) & APU_CPU3_DVFS_CTRL_UART_VOL_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU3_FREQ_REG1 - CPU3 Frequency 1 */\r\n/*! @{ */\r\n\r\n#define APU_CPU3_FREQ_REG1_CPU3_FREQ_REG1_MASK   (0xFFFFFFFFU)\r\n#define APU_CPU3_FREQ_REG1_CPU3_FREQ_REG1_SHIFT  (0U)\r\n/*! CPU3_FREQ_REG1 - CPU3 Frequency 1 */\r\n#define APU_CPU3_FREQ_REG1_CPU3_FREQ_REG1(x)     (((uint32_t)(((uint32_t)(x)) << APU_CPU3_FREQ_REG1_CPU3_FREQ_REG1_SHIFT)) & APU_CPU3_FREQ_REG1_CPU3_FREQ_REG1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU3_FREQ_REG2 - CPU3 Frequency 2 */\r\n/*! @{ */\r\n\r\n#define APU_CPU3_FREQ_REG2_CPU3_FREQ_REG2_MASK   (0xFFFFFFFFU)\r\n#define APU_CPU3_FREQ_REG2_CPU3_FREQ_REG2_SHIFT  (0U)\r\n/*! CPU3_FREQ_REG2 - CPU3Frequency 2 */\r\n#define APU_CPU3_FREQ_REG2_CPU3_FREQ_REG2(x)     (((uint32_t)(((uint32_t)(x)) << APU_CPU3_FREQ_REG2_CPU3_FREQ_REG2_SHIFT)) & APU_CPU3_FREQ_REG2_CPU3_FREQ_REG2_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU3_PLL_EN_REG - CPU3 PLL Enable */\r\n/*! @{ */\r\n\r\n#define APU_CPU3_PLL_EN_REG_CPU3_PLL_EN_REG_MASK (0xFFFFFFFFU)\r\n#define APU_CPU3_PLL_EN_REG_CPU3_PLL_EN_REG_SHIFT (0U)\r\n/*! CPU3_PLL_EN_REG - CPU3 PLL Enable */\r\n#define APU_CPU3_PLL_EN_REG_CPU3_PLL_EN_REG(x)   (((uint32_t)(((uint32_t)(x)) << APU_CPU3_PLL_EN_REG_CPU3_PLL_EN_REG_SHIFT)) & APU_CPU3_PLL_EN_REG_CPU3_PLL_EN_REG_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU3_VOL_REG1 - CPU3 Voltage 1 */\r\n/*! @{ */\r\n\r\n#define APU_CPU3_VOL_REG1_CPU3_VOL_REG1_MASK     (0xFFFFFFFFU)\r\n#define APU_CPU3_VOL_REG1_CPU3_VOL_REG1_SHIFT    (0U)\r\n/*! CPU3_VOL_REG1 - CPU3 Voltage 1 */\r\n#define APU_CPU3_VOL_REG1_CPU3_VOL_REG1(x)       (((uint32_t)(((uint32_t)(x)) << APU_CPU3_VOL_REG1_CPU3_VOL_REG1_SHIFT)) & APU_CPU3_VOL_REG1_CPU3_VOL_REG1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU3_VOL_REG2 - CPU3 Voltage 2 */\r\n/*! @{ */\r\n\r\n#define APU_CPU3_VOL_REG2_CPU3_VOL_REG2_MASK     (0xFFFFFFFFU)\r\n#define APU_CPU3_VOL_REG2_CPU3_VOL_REG2_SHIFT    (0U)\r\n/*! CPU3_VOL_REG2 - CPU3 Voltage 2 */\r\n#define APU_CPU3_VOL_REG2_CPU3_VOL_REG2(x)       (((uint32_t)(((uint32_t)(x)) << APU_CPU3_VOL_REG2_CPU3_VOL_REG2_SHIFT)) & APU_CPU3_VOL_REG2_CPU3_VOL_REG2_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU3_VOL_REG3 - CPU3 Voltage 3 */\r\n/*! @{ */\r\n\r\n#define APU_CPU3_VOL_REG3_CPU3_VOL_REG3_MASK     (0xFFFFFFFFU)\r\n#define APU_CPU3_VOL_REG3_CPU3_VOL_REG3_SHIFT    (0U)\r\n/*! CPU3_VOL_REG3 - CPU3 Voltage 3 */\r\n#define APU_CPU3_VOL_REG3_CPU3_VOL_REG3(x)       (((uint32_t)(((uint32_t)(x)) << APU_CPU3_VOL_REG3_CPU3_VOL_REG3_SHIFT)) & APU_CPU3_VOL_REG3_CPU3_VOL_REG3_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU3_VOL_REG4 - CPU3 Voltage 4 */\r\n/*! @{ */\r\n\r\n#define APU_CPU3_VOL_REG4_CPU3_VOL_REG4_MASK     (0xFFFFFFFFU)\r\n#define APU_CPU3_VOL_REG4_CPU3_VOL_REG4_SHIFT    (0U)\r\n/*! CPU3_VOL_REG4 - CPU3 Voltage 4 */\r\n#define APU_CPU3_VOL_REG4_CPU3_VOL_REG4(x)       (((uint32_t)(((uint32_t)(x)) << APU_CPU3_VOL_REG4_CPU3_VOL_REG4_SHIFT)) & APU_CPU3_VOL_REG4_CPU3_VOL_REG4_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group APU_Register_Masks */\r\n\r\n\r\n/* APU - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral APU0 base address */\r\n  #define APU0_BASE                                (0x51258400u)\r\n  /** Peripheral APU0 base address */\r\n  #define APU0_BASE_NS                             (0x41258400u)\r\n  /** Peripheral APU0 base pointer */\r\n  #define APU0                                     ((APU_Type *)APU0_BASE)\r\n  /** Peripheral APU0 base pointer */\r\n  #define APU0_NS                                  ((APU_Type *)APU0_BASE_NS)\r\n  /** Peripheral APU1 base address */\r\n  #define APU1_BASE                                (0x54258400u)\r\n  /** Peripheral APU1 base address */\r\n  #define APU1_BASE_NS                             (0x44258400u)\r\n  /** Peripheral APU1 base pointer */\r\n  #define APU1                                     ((APU_Type *)APU1_BASE)\r\n  /** Peripheral APU1 base pointer */\r\n  #define APU1_NS                                  ((APU_Type *)APU1_BASE_NS)\r\n  /** Array initializer of APU peripheral base addresses */\r\n  #define APU_BASE_ADDRS                           { APU0_BASE, APU1_BASE }\r\n  /** Array initializer of APU peripheral base pointers */\r\n  #define APU_BASE_PTRS                            { APU0, APU1 }\r\n  /** Array initializer of APU peripheral base addresses */\r\n  #define APU_BASE_ADDRS_NS                        { APU0_BASE_NS, APU1_BASE_NS }\r\n  /** Array initializer of APU peripheral base pointers */\r\n  #define APU_BASE_PTRS_NS                         { APU0_NS, APU1_NS }\r\n#else\r\n  /** Peripheral APU0 base address */\r\n  #define APU0_BASE                                (0x41258400u)\r\n  /** Peripheral APU0 base pointer */\r\n  #define APU0                                     ((APU_Type *)APU0_BASE)\r\n  /** Peripheral APU1 base address */\r\n  #define APU1_BASE                                (0x44258400u)\r\n  /** Peripheral APU1 base pointer */\r\n  #define APU1                                     ((APU_Type *)APU1_BASE)\r\n  /** Array initializer of APU peripheral base addresses */\r\n  #define APU_BASE_ADDRS                           { APU0_BASE, APU1_BASE }\r\n  /** Array initializer of APU peripheral base pointers */\r\n  #define APU_BASE_PTRS                            { APU0, APU1 }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group APU_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- BG Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup BG_Peripheral_Access_Layer BG Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** BG - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t CTRL;                              /**< Control Register, offset: 0x0 */\r\n  __I  uint32_t STATUS;                            /**< Status Register, offset: 0x4 */\r\n} BG_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- BG Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup BG_Register_Masks BG Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name CTRL - Control Register */\r\n/*! @{ */\r\n\r\n#define BG_CTRL_PD_MASK                          (0x1U)\r\n#define BG_CTRL_PD_SHIFT                         (0U)\r\n/*! PD - Bandgap power down.\r\n *  0b1..Power down\r\n *  0b0..Power up\r\n */\r\n#define BG_CTRL_PD(x)                            (((uint32_t)(((uint32_t)(x)) << BG_CTRL_PD_SHIFT)) & BG_CTRL_PD_MASK)\r\n\r\n#define BG_CTRL_RES_TRIM_MASK                    (0xF0U)\r\n#define BG_CTRL_RES_TRIM_SHIFT                   (4U)\r\n/*! RES_TRIM - 1.2V voltage reference resistor trim.\r\n *  0b0000..1.159V\r\n *  0b0001..1.163V\r\n *  0b0010..1.168V\r\n *  0b0011..1.172V\r\n *  0b0100..1.177V\r\n *  0b0101..1.181V\r\n *  0b0110..1.186V\r\n *  0b0111..1.190V\r\n *  0b1000..1.194V\r\n *  0b1001..1.199V\r\n *  0b1010..1.204V\r\n *  0b1011..1.208V\r\n *  0b1100..1.213V\r\n *  0b1101..1.217V\r\n *  0b1110..1.222V\r\n *  0b1111..1.226V\r\n */\r\n#define BG_CTRL_RES_TRIM(x)                      (((uint32_t)(((uint32_t)(x)) << BG_CTRL_RES_TRIM_SHIFT)) & BG_CTRL_RES_TRIM_MASK)\r\n/*! @} */\r\n\r\n/*! @name STATUS - Status Register */\r\n/*! @{ */\r\n\r\n#define BG_STATUS_RDY_MASK                       (0x1U)\r\n#define BG_STATUS_RDY_SHIFT                      (0U)\r\n/*! RDY - 1'b1 indicates BG ready flag. */\r\n#define BG_STATUS_RDY(x)                         (((uint32_t)(((uint32_t)(x)) << BG_STATUS_RDY_SHIFT)) & BG_STATUS_RDY_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group BG_Register_Masks */\r\n\r\n\r\n/* BG - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral GAU_BG base address */\r\n  #define GAU_BG_BASE                              (0x50038700u)\r\n  /** Peripheral GAU_BG base address */\r\n  #define GAU_BG_BASE_NS                           (0x40038700u)\r\n  /** Peripheral GAU_BG base pointer */\r\n  #define GAU_BG                                   ((BG_Type *)GAU_BG_BASE)\r\n  /** Peripheral GAU_BG base pointer */\r\n  #define GAU_BG_NS                                ((BG_Type *)GAU_BG_BASE_NS)\r\n  /** Array initializer of BG peripheral base addresses */\r\n  #define BG_BASE_ADDRS                            { GAU_BG_BASE }\r\n  /** Array initializer of BG peripheral base pointers */\r\n  #define BG_BASE_PTRS                             { GAU_BG }\r\n  /** Array initializer of BG peripheral base addresses */\r\n  #define BG_BASE_ADDRS_NS                         { GAU_BG_BASE_NS }\r\n  /** Array initializer of BG peripheral base pointers */\r\n  #define BG_BASE_PTRS_NS                          { GAU_BG_NS }\r\n#else\r\n  /** Peripheral GAU_BG base address */\r\n  #define GAU_BG_BASE                              (0x40038700u)\r\n  /** Peripheral GAU_BG base pointer */\r\n  #define GAU_BG                                   ((BG_Type *)GAU_BG_BASE)\r\n  /** Array initializer of BG peripheral base addresses */\r\n  #define BG_BASE_ADDRS                            { GAU_BG_BASE }\r\n  /** Array initializer of BG peripheral base pointers */\r\n  #define BG_BASE_PTRS                             { GAU_BG }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group BG_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- BLEAPU Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup BLEAPU_Peripheral_Access_Layer BLEAPU Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** BLEAPU - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[8];\r\n  __IO uint32_t SOCBTAPU_APU_BYPASS0;              /**< APU Bypass0, offset: 0x8 */\r\n  __IO uint32_t SOCBTAPU_APU_PWR_CTRL_BYPASS0;     /**< APU power control Bypass Register 0, offset: 0xC */\r\n       uint8_t RESERVED_1[12];\r\n  __IO uint32_t SOCBTAPU_APU_BYPASS1;              /**< APU Bypass Register 1, offset: 0x1C */\r\n  __IO uint32_t SOCBTAPU_APU_BYPASS2;              /**< APU Bypass Register 2, offset: 0x20 */\r\n  __IO uint32_t SOCBTAPU_APU_BYPASS3;              /**< APU Bypass Register 3, offset: 0x24 */\r\n  __IO uint32_t SOCBTAPU_APU_CTRL;                 /**< APU Control, offset: 0x28 */\r\n  __I  uint32_t SOCBTAPU_APU_STATUS;               /**< APU Status Register, offset: 0x2C */\r\n  __IO uint32_t SOCBTAPU_CPU1_LMU_STA_BYPASS0;     /**< LMU static bank control byapss0 Register, offset: 0x30 */\r\n  __IO uint32_t SOCBTAPU_CPU1_LMU_STA_BYPASS1;     /**< LMU static bank control byapss1 Register, offset: 0x34 */\r\n  __IO uint32_t SOCBTAPU_CPU1_LMU_STA_BYPASS2;     /**< LMU static bank byapss2 Register, offset: 0x38 */\r\n  __IO uint32_t SOCBTAPU_LMU_DYN_BYPASS0;          /**< LMU dynamic bank control byapss0 Register, offset: 0x3C */\r\n  __IO uint32_t SOCBTAPU_LMU_G2BIST_CTRL_BYPASS;   /**< LMU G2Bist control bypass Register, offset: 0x40 */\r\n       uint8_t RESERVED_2[12];\r\n  __IO uint32_t SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS; /**< LMU G2Bist control bypass Register for CPU1, offset: 0x50 */\r\n       uint8_t RESERVED_3[8];\r\n  __IO uint32_t SOCBTAPU_APU_PWR_CTRL_BYPASS5;     /**< \", offset: 0x5C */\r\n       uint8_t RESERVED_4[8];\r\n  __IO uint32_t SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0;  /**< LMU static bank control byapss0 Register for smu1 hybrid banks mem, offset: 0x68 */\r\n  __IO uint32_t SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1;  /**< LMU static bank control byapss1 Register for smu1 hybrid banks mem, offset: 0x6C */\r\n  __IO uint32_t SOCBTAPU_SMU1_HYBRID_LMU_BYPASS2;  /**< LMU static bank control byapss2 Register for smu1 hybrid banks mem, offset: 0x70 */\r\n       uint8_t RESERVED_5[8];\r\n  __IO uint32_t SOCBTAPU_APU_ECO_CTRL;             /**< APU ECO Control, offset: 0x7C */\r\n  __IO uint32_t SOCBTAPU_GPIO_WKUP_CTRL0;          /**< \", offset: 0x80 */\r\n  __IO uint32_t SOCBTAPU_GPIO_WKUP_CTRL1;          /**< \", offset: 0x84 */\r\n  __IO uint32_t SOCBTAPU_GPIO_WKUP_CTRL2;          /**< \", offset: 0x88 */\r\n  __IO uint32_t SOCBTAPU_GPIO_WKUP_CTRL3;          /**< \", offset: 0x8C */\r\n  __IO uint32_t SOCBTAPU_HOST_WKUP_MODE;           /**< \", offset: 0x90 */\r\n  __IO uint32_t SOCBTAPU_T3_CLK_DIV_EN_BYPASS;     /**< \", offset: 0x94 */\r\n  __IO uint32_t SOCBTAPU_LDO_LV_CTRL2;             /**< LV LDO Control 2, offset: 0x98 */\r\n  __IO uint32_t SOCBTAPU_CAU_BYPASS;               /**< CAU Bypass, offset: 0x9C */\r\n       uint8_t RESERVED_6[4];\r\n  __IO uint32_t SOCBTAPU_MEM_PWDN2;                /**< Memory Powerdown Control, offset: 0xA4 */\r\n       uint8_t RESERVED_7[8];\r\n  __IO uint32_t SOCBTAPU_HOST_WKUP_SOURCE;         /**< Host Wakeup Source Control, offset: 0xB0 */\r\n} BLEAPU_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- BLEAPU Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup BLEAPU_Register_Masks BLEAPU Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name SOCBTAPU_APU_BYPASS0 - APU Bypass0 */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_C2P_XOSC_EN_BYPASS_EN_MASK (0x1U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_C2P_XOSC_EN_BYPASS_EN_SHIFT (0U)\r\n/*! C2P_XOSC_EN_BYPASS_EN - C2p_Xosc_En_Bypass */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_C2P_XOSC_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_C2P_XOSC_EN_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_C2P_XOSC_EN_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_TCPU_PDB_BYPASS_EN_MASK (0x2U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_TCPU_PDB_BYPASS_EN_SHIFT (1U)\r\n/*! TBG_TCPU_PDB_BYPASS_EN - TCPU_Pdb_Bypass */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_TCPU_PDB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_TCPU_PDB_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_TCPU_PDB_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_BBU1_CLK_EN_BYPASS_EN_MASK (0x4U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_BBU1_CLK_EN_BYPASS_EN_SHIFT (2U)\r\n/*! TBG_BBU1_CLK_EN_BYPASS_EN - TBG512_320_176_BBU1_Clk_En_Bypass */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_BBU1_CLK_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_BBU1_CLK_EN_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_BBU1_CLK_EN_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_T2_PDB_BYPASS_EN_MASK (0x8U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_T2_PDB_BYPASS_EN_SHIFT (3U)\r\n/*! TBG_T2_PDB_BYPASS_EN - tbg t2_Pdb_Bypass */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_T2_PDB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_T2_PDB_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_T2_PDB_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_MAC1_CLK_EN_BYPASS_EN_MASK (0x10U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_MAC1_CLK_EN_BYPASS_EN_SHIFT (4U)\r\n/*! TBG_MAC1_CLK_EN_BYPASS_EN - TBG512_320_176_MAC1_Clk_En_Bypass */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_MAC1_CLK_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_MAC1_CLK_EN_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_MAC1_CLK_EN_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_SOC_CLK_EN_BYPASS_EN_MASK (0x20U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_SOC_CLK_EN_BYPASS_EN_SHIFT (5U)\r\n/*! TBG_SOC_CLK_EN_BYPASS_EN - TBG512_320_176_SoC_Clk_En_Bypass */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_SOC_CLK_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_SOC_CLK_EN_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_SOC_CLK_EN_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_BBU2_CLK_EN_BYPASS_EN_MASK (0x40U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_BBU2_CLK_EN_BYPASS_EN_SHIFT (6U)\r\n/*! TBG_BBU2_CLK_EN_BYPASS_EN - TBG512_320_176_BBU2_Clk_En_Bypass */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_BBU2_CLK_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_BBU2_CLK_EN_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_BBU2_CLK_EN_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_MAC2_CLK_EN_BYPASS_EN_MASK (0x80U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_MAC2_CLK_EN_BYPASS_EN_SHIFT (7U)\r\n/*! TBG_MAC2_CLK_EN_BYPASS_EN - TBG512_320_176_MAC2_Clk_En_Bypass */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_MAC2_CLK_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_MAC2_CLK_EN_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_MAC2_CLK_EN_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TX_PE_BYPASS_EN_MASK (0x400U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TX_PE_BYPASS_EN_SHIFT (10U)\r\n/*! TX_PE_BYPASS_EN - BBU_Rx_Pe_Bypass Enable */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TX_PE_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_TX_PE_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_TX_PE_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RX_PE_BYPASS_EN_MASK (0x800U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RX_PE_BYPASS_EN_SHIFT (11U)\r\n/*! RX_PE_BYPASS_EN - BBU_Rx_Pe_Bypass Enable */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RX_PE_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_RX_PE_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_RX_PE_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PE1_BYPASS_EN_MASK (0x1000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PE1_BYPASS_EN_SHIFT (12U)\r\n/*! RFU_PE1_BYPASS_EN - RFU_PE1_Bypass Enable */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PE1_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PE1_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PE1_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PE2_BYPASS_EN_MASK (0x2000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PE2_BYPASS_EN_SHIFT (13U)\r\n/*! RFU_PE2_BYPASS_EN - RFU_PE2_Bypass Enable */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PE2_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PE2_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PE2_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PA_PE_A_BYPASS_EN_MASK (0x4000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PA_PE_A_BYPASS_EN_SHIFT (14U)\r\n/*! RFU_PA_PE_A_BYPASS_EN - RFU_PA_PE_A_Bypass Enable */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PA_PE_A_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PA_PE_A_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PA_PE_A_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PA_PE_G_BYPASS_EN_MASK (0x8000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PA_PE_G_BYPASS_EN_SHIFT (15U)\r\n/*! RFU_PA_PE_G_BYPASS_EN - RFU_PA_PE_G_Bypass Enable */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PA_PE_G_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PA_PE_G_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PA_PE_G_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_C2P_XOSC_EN_BYPASS_VAL_MASK (0x10000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_C2P_XOSC_EN_BYPASS_VAL_SHIFT (16U)\r\n/*! C2P_XOSC_EN_BYPASS_VAL - C2p_Xosc_En Bypass Value */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_C2P_XOSC_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_C2P_XOSC_EN_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_C2P_XOSC_EN_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_TCPU_PDB_BYPASS_VAL_MASK (0x20000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_TCPU_PDB_BYPASS_VAL_SHIFT (17U)\r\n/*! TBG_TCPU_PDB_BYPASS_VAL - TCPU_Pdb Bypass Value */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_TCPU_PDB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_TCPU_PDB_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_TCPU_PDB_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_BBU1_CLK_EN_BYPASS_VAL_MASK (0x40000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_BBU1_CLK_EN_BYPASS_VAL_SHIFT (18U)\r\n/*! TBG_BBU1_CLK_EN_BYPASS_VAL - TBG512_320_176_BBU1_Clk_En Bypass Value */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_BBU1_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_BBU1_CLK_EN_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_BBU1_CLK_EN_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_T2_PDB_BYPASS_VAL_MASK (0x80000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_T2_PDB_BYPASS_VAL_SHIFT (19U)\r\n/*! TBG_T2_PDB_BYPASS_VAL - TBF176_Pdb Bypass Value */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_T2_PDB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_T2_PDB_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_T2_PDB_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_MAC1_CLK_EN_BYPASS_VAL_MASK (0x100000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_MAC1_CLK_EN_BYPASS_VAL_SHIFT (20U)\r\n/*! TBG_MAC1_CLK_EN_BYPASS_VAL - TBG512_320_176_MAC1_Clk_En Bypass Value */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_MAC1_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_MAC1_CLK_EN_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_MAC1_CLK_EN_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_SOC_CLK_EN_BYPASS_VAL_MASK (0x200000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_SOC_CLK_EN_BYPASS_VAL_SHIFT (21U)\r\n/*! TBG_SOC_CLK_EN_BYPASS_VAL - TBG512_320_176_SoC_Clk_En Bypass Value */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_SOC_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_SOC_CLK_EN_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_SOC_CLK_EN_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_BBU2_CLK_EN_BYPASS_VAL_MASK (0x400000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_BBU2_CLK_EN_BYPASS_VAL_SHIFT (22U)\r\n/*! TBG_BBU2_CLK_EN_BYPASS_VAL - TBG512_320_176_BBU2_Clk_En Bypass Value */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_BBU2_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_BBU2_CLK_EN_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_BBU2_CLK_EN_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_MAC2_CLK_EN_BYPASS_VAL_MASK (0x800000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_MAC2_CLK_EN_BYPASS_VAL_SHIFT (23U)\r\n/*! TBG_MAC2_CLK_EN_BYPASS_VAL - TBG512_320_176_MAC2_Clk_En Bypass Value */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_MAC2_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_MAC2_CLK_EN_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_TBG_MAC2_CLK_EN_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TX_PE_BYPASS_VAL_MASK (0x4000000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TX_PE_BYPASS_VAL_SHIFT (26U)\r\n/*! TX_PE_BYPASS_VAL - Tx_Pe Bypass Value */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_TX_PE_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_TX_PE_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_TX_PE_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RX_PE_BYPASS_VAL_MASK (0x8000000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RX_PE_BYPASS_VAL_SHIFT (27U)\r\n/*! RX_PE_BYPASS_VAL - Rx_Pe Bypass Value */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RX_PE_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_RX_PE_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_RX_PE_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PE1_BYPASS_VAL_MASK (0x10000000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PE1_BYPASS_VAL_SHIFT (28U)\r\n/*! RFU_PE1_BYPASS_VAL - RFU PE1 Bypass Value */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PE1_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PE1_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PE1_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PE2_BYPASS_VAL_MASK (0x20000000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PE2_BYPASS_VAL_SHIFT (29U)\r\n/*! RFU_PE2_BYPASS_VAL - RFU PE2 Bypass Value */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PE2_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PE2_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PE2_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PA_PE_A_BYPASS_VAL_MASK (0x40000000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PA_PE_A_BYPASS_VAL_SHIFT (30U)\r\n/*! RFU_PA_PE_A_BYPASS_VAL - RFU PA_PE_A Bypass Value */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PA_PE_A_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PA_PE_A_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PA_PE_A_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PA_PE_G_BYPASS_VAL_MASK (0x80000000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PA_PE_G_BYPASS_VAL_SHIFT (31U)\r\n/*! RFU_PA_PE_G_BYPASS_VAL - RFU PA_PE_G Bypass Value */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PA_PE_G_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PA_PE_G_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS0_RFU_PA_PE_G_BYPASS_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_APU_PWR_CTRL_BYPASS0 - APU power control Bypass Register 0 */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_PSW_BYPASS_VAL_MASK (0x1U)\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_PSW_BYPASS_VAL_SHIFT (0U)\r\n/*! SOC_PSW_BYPASS_VAL - SoC Power Switch Control */\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_PSW_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_PSW_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_PSW_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_PSW_BYPASS_EN_MASK (0x2U)\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_PSW_BYPASS_EN_SHIFT (1U)\r\n/*! SOC_PSW_BYPASS_EN - SoC Power Switch Control Enable */\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_PSW_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_PSW_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_PSW_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_FWBAR_BYPASS_VAL_MASK (0x4U)\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_FWBAR_BYPASS_VAL_SHIFT (2U)\r\n/*! SOC_FWBAR_BYPASS_VAL - SoC Firewallbar Control */\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_FWBAR_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_FWBAR_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_FWBAR_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_FWBAR_BYPASS_EN_MASK (0x8U)\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_FWBAR_BYPASS_EN_SHIFT (3U)\r\n/*! SOC_FWBAR_BYPASS_EN - SoC Firewallbar Control Enable */\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_FWBAR_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_FWBAR_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_FWBAR_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_ISO_EN_BYPASS_VAL_MASK (0x10U)\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_ISO_EN_BYPASS_VAL_SHIFT (4U)\r\n/*! SOC_ISO_EN_BYPASS_VAL - SoC Isolation Cell Control */\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_ISO_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_ISO_EN_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_ISO_EN_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_ISO_EN_BYPASS_EN_MASK (0x20U)\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_ISO_EN_BYPASS_EN_SHIFT (5U)\r\n/*! SOC_ISO_EN_BYPASS_EN - SoC Isolation Cell Control Enable */\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_ISO_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_ISO_EN_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_ISO_EN_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_CLK_DIV_RSTB_BYPASS_VAL_MASK (0x40U)\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_CLK_DIV_RSTB_BYPASS_VAL_SHIFT (6U)\r\n/*! SOC_CLK_DIV_RSTB_BYPASS_VAL - Firmware Bypass Value for SoC Dlk_Div_Rstb (active low signal) */\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_CLK_DIV_RSTB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_CLK_DIV_RSTB_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_CLK_DIV_RSTB_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_CLK_DIV_RSTB_BYPASS_EN_MASK (0x80U)\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_CLK_DIV_RSTB_BYPASS_EN_SHIFT (7U)\r\n/*! SOC_CLK_DIV_RSTB_BYPASS_EN - Firmware Bypass SoC Clk_Div_Rstb from APU */\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_CLK_DIV_RSTB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_CLK_DIV_RSTB_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_CLK_DIV_RSTB_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_NON_UDR_RST_BYPASS_VAL_MASK (0x100U)\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_NON_UDR_RST_BYPASS_VAL_SHIFT (8U)\r\n/*! SOC_NON_UDR_RST_BYPASS_VAL - Firmware Bypass Value for SoC non udr rst (active low signal) */\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_NON_UDR_RST_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_NON_UDR_RST_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_NON_UDR_RST_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_NON_UDR_RST_BYPASS_EN_MASK (0x200U)\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_NON_UDR_RST_BYPASS_EN_SHIFT (9U)\r\n/*! SOC_NON_UDR_RST_BYPASS_EN - Firmware Bypass SoC non udr rst from APU (used for brf sif only in KF2) */\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_NON_UDR_RST_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_NON_UDR_RST_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS0_SOC_NON_UDR_RST_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_APU_BYPASS1 - APU Bypass Register 1 */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_SOC_CAU_XOSC_EN_BP_EN_MASK (0x40U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_SOC_CAU_XOSC_EN_BP_EN_SHIFT (6U)\r\n/*! SOC_CAU_XOSC_EN_BP_EN - Firmware Bypass Xosc_En to CAU and other parts of the chip including pads */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_SOC_CAU_XOSC_EN_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS1_SOC_CAU_XOSC_EN_BP_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS1_SOC_CAU_XOSC_EN_BP_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_SOC_CAU_XOSC_EN_BP_VAL_MASK (0x80U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_SOC_CAU_XOSC_EN_BP_VAL_SHIFT (7U)\r\n/*! SOC_CAU_XOSC_EN_BP_VAL - Firmware Bypass Xosc_En Value for SoC_CAU_Xosc_En_Bp_En */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_SOC_CAU_XOSC_EN_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS1_SOC_CAU_XOSC_EN_BP_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS1_SOC_CAU_XOSC_EN_BP_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_RXPE_DYN_BYPASS_MASK (0x100U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_RXPE_DYN_BYPASS_SHIFT (8U)\r\n/*! RXPE_DYN_BYPASS - Rxpe_Dyn_Bypass */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_RXPE_DYN_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS1_RXPE_DYN_BYPASS_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS1_RXPE_DYN_BYPASS_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_PE1_DYN_BYPASS_MASK (0x200U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_PE1_DYN_BYPASS_SHIFT (9U)\r\n/*! PE1_DYN_BYPASS - PE1_Dyn_Bypass */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_PE1_DYN_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS1_PE1_DYN_BYPASS_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS1_PE1_DYN_BYPASS_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_PLL_OVERRIDE_BYPASS_MASK (0x400U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_PLL_OVERRIDE_BYPASS_SHIFT (10U)\r\n/*! PLL_OVERRIDE_BYPASS - PLL Override Bypass */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_PLL_OVERRIDE_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS1_PLL_OVERRIDE_BYPASS_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS1_PLL_OVERRIDE_BYPASS_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_BCA_CLK_EN_BYPASS_EN_MASK (0x40000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_BCA_CLK_EN_BYPASS_EN_SHIFT (18U)\r\n/*! BCA_CLK_EN_BYPASS_EN - Firmware Bypass BCA_Clk_En */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_BCA_CLK_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS1_BCA_CLK_EN_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS1_BCA_CLK_EN_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_BCA_CLK_EN_BYPASS_VAL_MASK (0x80000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_BCA_CLK_EN_BYPASS_VAL_SHIFT (19U)\r\n/*! BCA_CLK_EN_BYPASS_VAL - Firmware Bypass Value for BCA_Clk_En (active high signal) */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_BCA_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS1_BCA_CLK_EN_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS1_BCA_CLK_EN_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_SLNA_CLK_EN_BYPASS_EN_MASK (0x4000000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_SLNA_CLK_EN_BYPASS_EN_SHIFT (26U)\r\n/*! SLNA_CLK_EN_BYPASS_EN - Firmware Bypass for SLNA_Clk_En */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_SLNA_CLK_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS1_SLNA_CLK_EN_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS1_SLNA_CLK_EN_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_SLNA_CLK_EN_BYPASS_VAL_MASK (0x8000000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_SLNA_CLK_EN_BYPASS_VAL_SHIFT (27U)\r\n/*! SLNA_CLK_EN_BYPASS_VAL - Firmware Bypass Value for SLNA_Clk_En (active high signal) */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS1_SLNA_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS1_SLNA_CLK_EN_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS1_SLNA_CLK_EN_BYPASS_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_APU_BYPASS2 - APU Bypass Register 2 */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_TBG_T3_PDB_BYPASS_EN_MASK (0x100U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_TBG_T3_PDB_BYPASS_EN_SHIFT (8U)\r\n/*! TBG_T3_PDB_BYPASS_EN - Firmware Bypass for T3_pdb pll */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_TBG_T3_PDB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS2_TBG_T3_PDB_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS2_TBG_T3_PDB_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_TBG_T3_PDB_BYPASS_VAL_MASK (0x200U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_TBG_T3_PDB_BYPASS_VAL_SHIFT (9U)\r\n/*! TBG_T3_PDB_BYPASS_VAL - T3_Pdb Bypass Value */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_TBG_T3_PDB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS2_TBG_T3_PDB_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS2_TBG_T3_PDB_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_T3_PI1_PDB_BYPASS_EN_MASK (0x400U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_T3_PI1_PDB_BYPASS_EN_SHIFT (10U)\r\n/*! T3_PI1_PDB_BYPASS_EN - Firmware Bypass for TBG256 aiu_pi1 */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_T3_PI1_PDB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS2_T3_PI1_PDB_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS2_T3_PI1_PDB_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_T3_PI1_PDB_BYPASS_VAL_MASK (0x800U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_T3_PI1_PDB_BYPASS_VAL_SHIFT (11U)\r\n/*! T3_PI1_PDB_BYPASS_VAL - Firmware Bypass Value for TBG256 aiu pi1 */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_T3_PI1_PDB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS2_T3_PI1_PDB_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS2_T3_PI1_PDB_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_T3_PI2_PDB_BYPASS_EN_MASK (0x1000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_T3_PI2_PDB_BYPASS_EN_SHIFT (12U)\r\n/*! T3_PI2_PDB_BYPASS_EN - Firmware Bypass for TBG256 aiu_pi2 */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_T3_PI2_PDB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS2_T3_PI2_PDB_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS2_T3_PI2_PDB_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_T3_PI2_PDB_BYPASS_VAL_MASK (0x2000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_T3_PI2_PDB_BYPASS_VAL_SHIFT (13U)\r\n/*! T3_PI2_PDB_BYPASS_VAL - Firmware Bypass Value for TBG256 aiu_pi2 */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_T3_PI2_PDB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS2_T3_PI2_PDB_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS2_T3_PI2_PDB_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_TBG_T1_STABLE_BYPASS_EN_MASK (0x2000000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_TBG_T1_STABLE_BYPASS_EN_SHIFT (25U)\r\n/*! TBG_T1_STABLE_BYPASS_EN - Firmware Bypass enable for T1 pll_stable signal from APU */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_TBG_T1_STABLE_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS2_TBG_T1_STABLE_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS2_TBG_T1_STABLE_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_TBG_T1_STABLE_BYPASS_VAL_MASK (0x4000000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_TBG_T1_STABLE_BYPASS_VAL_SHIFT (26U)\r\n/*! TBG_T1_STABLE_BYPASS_VAL - Firmware Bypass value for T1 pll_stable signal from APU */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_TBG_T1_STABLE_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS2_TBG_T1_STABLE_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS2_TBG_T1_STABLE_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_PMIC_DVSC_CTRL_BYPASS_EN_MASK (0x8000000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_PMIC_DVSC_CTRL_BYPASS_EN_SHIFT (27U)\r\n/*! PMIC_DVSC_CTRL_BYPASS_EN - Firmware Bypass enable for pmic dvsc ctrl from APU */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_PMIC_DVSC_CTRL_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS2_PMIC_DVSC_CTRL_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS2_PMIC_DVSC_CTRL_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_PMIC_DVSC_CTRL_BYPASS_VAL_MASK (0x30000000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_PMIC_DVSC_CTRL_BYPASS_VAL_SHIFT (28U)\r\n/*! PMIC_DVSC_CTRL_BYPASS_VAL - Firmware Bypass value for pmic dvsc ctrl from APU (default high power WLAN ode) */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS2_PMIC_DVSC_CTRL_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS2_PMIC_DVSC_CTRL_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS2_PMIC_DVSC_CTRL_BYPASS_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_APU_BYPASS3 - APU Bypass Register 3 */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS3_SYS_CLK_EN_BYPASS_EN_MASK (0x10U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS3_SYS_CLK_EN_BYPASS_EN_SHIFT (4U)\r\n/*! SYS_CLK_EN_BYPASS_EN - Firmware Bypass for sys clock domain clock enable */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS3_SYS_CLK_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS3_SYS_CLK_EN_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS3_SYS_CLK_EN_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS3_SYS_CLK_EN_BYPASS_VAL_MASK (0x20U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS3_SYS_CLK_EN_BYPASS_VAL_SHIFT (5U)\r\n/*! SYS_CLK_EN_BYPASS_VAL - Firmware Bypass Value for sys clock domain clock enable(active high signal) */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS3_SYS_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS3_SYS_CLK_EN_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS3_SYS_CLK_EN_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS3_SPSRAM_RST_BYPASS_EN_MASK (0x4000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS3_SPSRAM_RST_BYPASS_EN_SHIFT (14U)\r\n/*! SPSRAM_RST_BYPASS_EN - Firmware Bypass for Single power SRAM reset enable */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS3_SPSRAM_RST_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS3_SPSRAM_RST_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS3_SPSRAM_RST_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS3_SPSRAM_RST_BYPASS_VAL_MASK (0x8000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS3_SPSRAM_RST_BYPASS_VAL_SHIFT (15U)\r\n/*! SPSRAM_RST_BYPASS_VAL - Firmware Bypass Value for single power sram reset(active low signal) */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS3_SPSRAM_RST_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS3_SPSRAM_RST_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS3_SPSRAM_RST_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS3_SLNA_BBUD_BRF_BYPASS_EN_MASK (0x10000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS3_SLNA_BBUD_BRF_BYPASS_EN_SHIFT (16U)\r\n/*! SLNA_BBUD_BRF_BYPASS_EN - Firmware Bypass for apu mux control of SLNA gain from bbud/brf */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS3_SLNA_BBUD_BRF_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS3_SLNA_BBUD_BRF_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS3_SLNA_BBUD_BRF_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS3_SLNA_BBUD_BRF_BYPASS_VAL_MASK (0x20000U)\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS3_SLNA_BBUD_BRF_BYPASS_VAL_SHIFT (17U)\r\n/*! SLNA_BBUD_BRF_BYPASS_VAL - Firmware Bypass Value for apu mux control of SLNA gain from bbud/brf */\r\n#define BLEAPU_SOCBTAPU_APU_BYPASS3_SLNA_BBUD_BRF_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_BYPASS3_SLNA_BBUD_BRF_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_BYPASS3_SLNA_BBUD_BRF_BYPASS_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_APU_CTRL - APU Control */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_APU_REFCLK_DIV_SEL_MASK (0xFU)\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_APU_REFCLK_DIV_SEL_SHIFT (0U)\r\n/*! APU_REFCLK_DIV_SEL - APU Reference Clock Divider Select */\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_APU_REFCLK_DIV_SEL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_CTRL_APU_REFCLK_DIV_SEL_SHIFT)) & BLEAPU_SOCBTAPU_APU_CTRL_APU_REFCLK_DIV_SEL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_FORCE_BTU_WAKEUP_MASK (0x10U)\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_FORCE_BTU_WAKEUP_SHIFT (4U)\r\n/*! FORCE_BTU_WAKEUP - Force BTU Wakeup */\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_FORCE_BTU_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_CTRL_FORCE_BTU_WAKEUP_SHIFT)) & BLEAPU_SOCBTAPU_APU_CTRL_FORCE_BTU_WAKEUP_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_ISU_WKUP_IN_USE_MASK (0x40U)\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_ISU_WKUP_IN_USE_SHIFT (6U)\r\n/*! ISU_WKUP_IN_USE - APU Wakeup */\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_ISU_WKUP_IN_USE(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_CTRL_ISU_WKUP_IN_USE_SHIFT)) & BLEAPU_SOCBTAPU_APU_CTRL_ISU_WKUP_IN_USE_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_APU_HOST_WKUP_MASK (0x80U)\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_APU_HOST_WKUP_SHIFT (7U)\r\n/*! APU_HOST_WKUP - APU Wakeup triggered by CPU2 */\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_APU_HOST_WKUP(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_CTRL_APU_HOST_WKUP_SHIFT)) & BLEAPU_SOCBTAPU_APU_CTRL_APU_HOST_WKUP_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_BRF_INT_WAKEUP_MASK (0x100U)\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_BRF_INT_WAKEUP_SHIFT (8U)\r\n/*! BRF_INT_WAKEUP - APU Wakeup */\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_BRF_INT_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_CTRL_BRF_INT_WAKEUP_SHIFT)) & BLEAPU_SOCBTAPU_APU_CTRL_BRF_INT_WAKEUP_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_SOC_PA_PE_EN_MASK (0x200U)\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_SOC_PA_PE_EN_SHIFT (9U)\r\n/*! SOC_PA_PE_EN - PA_PE control from SoC to RFU SoC_PA_PE Input */\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_SOC_PA_PE_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_CTRL_SOC_PA_PE_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_CTRL_SOC_PA_PE_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_SOC_PA_PE_A_EN_MASK (0x400U)\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_SOC_PA_PE_A_EN_SHIFT (10U)\r\n/*! SOC_PA_PE_A_EN - PA_PE_A control from SoC to Pad */\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_SOC_PA_PE_A_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_CTRL_SOC_PA_PE_A_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_CTRL_SOC_PA_PE_A_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_SOC_PA_PE_G_EN_MASK (0x800U)\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_SOC_PA_PE_G_EN_SHIFT (11U)\r\n/*! SOC_PA_PE_G_EN - PA_PE_G control from SoC to Pad */\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_SOC_PA_PE_G_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_CTRL_SOC_PA_PE_G_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_CTRL_SOC_PA_PE_G_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_RFU_2G_SRAM_PD_METHOD_SEL_MASK (0x1000U)\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_RFU_2G_SRAM_PD_METHOD_SEL_SHIFT (12U)\r\n/*! RFU_2G_SRAM_PD_METHOD_SEL - Choose apu signal to use for SRAM PD of RFU 2G memories */\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_RFU_2G_SRAM_PD_METHOD_SEL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_CTRL_RFU_2G_SRAM_PD_METHOD_SEL_SHIFT)) & BLEAPU_SOCBTAPU_APU_CTRL_RFU_2G_SRAM_PD_METHOD_SEL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_BRF_SRAM_PD_METHOD_SEL_MASK (0x2000U)\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_BRF_SRAM_PD_METHOD_SEL_SHIFT (13U)\r\n/*! BRF_SRAM_PD_METHOD_SEL - Choose apu signal to use for SRAM PD of BRF memories */\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_BRF_SRAM_PD_METHOD_SEL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_CTRL_BRF_SRAM_PD_METHOD_SEL_SHIFT)) & BLEAPU_SOCBTAPU_APU_CTRL_BRF_SRAM_PD_METHOD_SEL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_LMU_BYPASS_MASK (0x8000U)\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_LMU_BYPASS_SHIFT (15U)\r\n/*! LMU_BYPASS - LMU global bypass bit */\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_LMU_BYPASS(x)   (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_CTRL_LMU_BYPASS_SHIFT)) & BLEAPU_SOCBTAPU_APU_CTRL_LMU_BYPASS_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_SOC_PA_PE_EN_MAC2_MASK (0x10000U)\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_SOC_PA_PE_EN_MAC2_SHIFT (16U)\r\n/*! SOC_PA_PE_EN_MAC2 - PA_PE control from MAC2 to RFU SoC_PA_PE Input */\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_SOC_PA_PE_EN_MAC2(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_CTRL_SOC_PA_PE_EN_MAC2_SHIFT)) & BLEAPU_SOCBTAPU_APU_CTRL_SOC_PA_PE_EN_MAC2_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_RFU_5G_SRAM_PD_METHOD_SEL_MASK (0x20000U)\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_RFU_5G_SRAM_PD_METHOD_SEL_SHIFT (17U)\r\n/*! RFU_5G_SRAM_PD_METHOD_SEL - Choose apu signal to use for SRAM PD of RFU 5G memories */\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_RFU_5G_SRAM_PD_METHOD_SEL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_CTRL_RFU_5G_SRAM_PD_METHOD_SEL_SHIFT)) & BLEAPU_SOCBTAPU_APU_CTRL_RFU_5G_SRAM_PD_METHOD_SEL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_APU_HOST_WKUP_CPU1_MASK (0x40000U)\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_APU_HOST_WKUP_CPU1_SHIFT (18U)\r\n/*! APU_HOST_WKUP_CPU1 - APU Wakeup triggered by CPU1 */\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_APU_HOST_WKUP_CPU1(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_CTRL_APU_HOST_WKUP_CPU1_SHIFT)) & BLEAPU_SOCBTAPU_APU_CTRL_APU_HOST_WKUP_CPU1_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_APU_HOST_WKUP_CPU3_MASK (0x80000U)\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_APU_HOST_WKUP_CPU3_SHIFT (19U)\r\n/*! APU_HOST_WKUP_CPU3 - APU Wakeup triggered by CPU3 */\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_APU_HOST_WKUP_CPU3(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_CTRL_APU_HOST_WKUP_CPU3_SHIFT)) & BLEAPU_SOCBTAPU_APU_CTRL_APU_HOST_WKUP_CPU3_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_FORCE_BTU2_WAKEUP_MASK (0x100000U)\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_FORCE_BTU2_WAKEUP_SHIFT (20U)\r\n/*! FORCE_BTU2_WAKEUP - Force BTU2 Wakeup */\r\n#define BLEAPU_SOCBTAPU_APU_CTRL_FORCE_BTU2_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_CTRL_FORCE_BTU2_WAKEUP_SHIFT)) & BLEAPU_SOCBTAPU_APU_CTRL_FORCE_BTU2_WAKEUP_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_APU_STATUS - APU Status Register */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_APU_STATUS_BRF_CLK_TBG_SEL_MASK (0x1U)\r\n#define BLEAPU_SOCBTAPU_APU_STATUS_BRF_CLK_TBG_SEL_SHIFT (0U)\r\n/*! BRF_CLK_TBG_SEL - Monitor BRF_Clk_TBG_Sel */\r\n#define BLEAPU_SOCBTAPU_APU_STATUS_BRF_CLK_TBG_SEL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_STATUS_BRF_CLK_TBG_SEL_SHIFT)) & BLEAPU_SOCBTAPU_APU_STATUS_BRF_CLK_TBG_SEL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_STATUS_BTU_CLK_TBG_SEL_MASK (0x2U)\r\n#define BLEAPU_SOCBTAPU_APU_STATUS_BTU_CLK_TBG_SEL_SHIFT (1U)\r\n/*! BTU_CLK_TBG_SEL - Monitor BTU_Clk_TBG_Sel */\r\n#define BLEAPU_SOCBTAPU_APU_STATUS_BTU_CLK_TBG_SEL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_STATUS_BTU_CLK_TBG_SEL_SHIFT)) & BLEAPU_SOCBTAPU_APU_STATUS_BTU_CLK_TBG_SEL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_STATUS_SOC_CLK_T3_REF_SEL_MASK (0x4U)\r\n#define BLEAPU_SOCBTAPU_APU_STATUS_SOC_CLK_T3_REF_SEL_SHIFT (2U)\r\n/*! SOC_CLK_T3_REF_SEL - Monitor SoC_Clk_T3_Ref_Sel */\r\n#define BLEAPU_SOCBTAPU_APU_STATUS_SOC_CLK_T3_REF_SEL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_STATUS_SOC_CLK_T3_REF_SEL_SHIFT)) & BLEAPU_SOCBTAPU_APU_STATUS_SOC_CLK_T3_REF_SEL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_STATUS_SOC_CLK_TBG_SEL_MASK (0x8U)\r\n#define BLEAPU_SOCBTAPU_APU_STATUS_SOC_CLK_TBG_SEL_SHIFT (3U)\r\n/*! SOC_CLK_TBG_SEL - Monitor SoC_Clk_TBG_Sel */\r\n#define BLEAPU_SOCBTAPU_APU_STATUS_SOC_CLK_TBG_SEL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_STATUS_SOC_CLK_TBG_SEL_SHIFT)) & BLEAPU_SOCBTAPU_APU_STATUS_SOC_CLK_TBG_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_CPU1_LMU_STA_BYPASS0 - LMU static bank control byapss0 Register */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_EN_MASK (0xFFU)\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_EN_SHIFT (0U)\r\n/*! LMU_STA_BANKS_ISO_EN_BP_EN - Firmware Bypass enable for lmu static banks iso_en */\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_EN_SHIFT)) & BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_VAL_MASK (0xFF00U)\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_VAL_SHIFT (8U)\r\n/*! LMU_STA_BANKS_ISO_EN_BP_VAL - Firmware Bypass value for lmu static banks iso_en */\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_VAL_SHIFT)) & BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_EN_MASK (0xFF0000U)\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_EN_SHIFT (16U)\r\n/*! LMU_STA_BANKS_PSW_EN_BP_EN - Firmware Bypass enable for lmu static banks psw_en */\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_EN_SHIFT)) & BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_VAL_MASK (0xFF000000U)\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_VAL_SHIFT (24U)\r\n/*! LMU_STA_BANKS_PSW_EN_BP_VAL - Firmware Bypass value for lmu static banks psw_en */\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_VAL_SHIFT)) & BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_CPU1_LMU_STA_BYPASS1 - LMU static bank control byapss1 Register */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_EN_MASK (0xFFU)\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_EN_SHIFT (0U)\r\n/*! LMU_STA_BANKS_SRAM_PD_BP_EN - Firmware Bypass enable for lmu static banks sram_pd */\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_EN_SHIFT)) & BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_VAL_MASK (0xFF00U)\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_VAL_SHIFT (8U)\r\n/*! LMU_STA_BANKS_SRAM_PD_BP_VAL - Firmware Bypass value for lmu static banks sram_pd */\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_VAL_SHIFT)) & BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_EN_MASK (0xFF0000U)\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_EN_SHIFT (16U)\r\n/*! LMU_STA_BANKS_FNRST_BP_EN - Firmware Bypass enable for lmu static banks fnrst */\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_EN_SHIFT)) & BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_VAL_MASK (0xFF000000U)\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_VAL_SHIFT (24U)\r\n/*! LMU_STA_BANKS_FNRST_BP_VAL - Firmware Bypass value for lmu static banks fnrst */\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_VAL_SHIFT)) & BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_CPU1_LMU_STA_BYPASS2 - LMU static bank byapss2 Register */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_EN_MASK (0xFFU)\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_EN_SHIFT (0U)\r\n/*! LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_EN - Firmware Bypass enable for lmu static banks vddmc_sw_pd_ctrl */\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_EN_SHIFT)) & BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_MASK (0xFF00U)\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_SHIFT (8U)\r\n/*! LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_VAL - Firmware Bypass value for lmu static banks vddmc_sw_pd_ctrl */\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_SHIFT)) & BLEAPU_SOCBTAPU_CPU1_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_LMU_DYN_BYPASS0 - LMU dynamic bank control byapss0 Register */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_EN_MASK (0x7U)\r\n#define BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_EN_SHIFT (0U)\r\n/*! LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_EN - Firmware Bypass enable for lmu dynamic banks vddmc_sw_pd_ctrl */\r\n#define BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_EN_SHIFT)) & BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_MASK (0x700U)\r\n#define BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_SHIFT (8U)\r\n/*! LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_VAL - Firmware Bypass value for lmu dynamic banks vddmc_sw_pd_ctrl */\r\n#define BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_SHIFT)) & BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_FNRST_BP_EN_MASK (0x70000U)\r\n#define BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_FNRST_BP_EN_SHIFT (16U)\r\n/*! LMU_DYN_BANKS_FNRST_BP_EN - Firmware Bypass enable for lmu dynamic banks fnrst */\r\n#define BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_FNRST_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_FNRST_BP_EN_SHIFT)) & BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_FNRST_BP_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_FNRST_BP_VAL_MASK (0x7000000U)\r\n#define BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_FNRST_BP_VAL_SHIFT (24U)\r\n/*! LMU_DYN_BANKS_FNRST_BP_VAL - Firmware Bypass value for lmu dynamic banks fnrst */\r\n#define BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_FNRST_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_FNRST_BP_VAL_SHIFT)) & BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_FNRST_BP_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_SRAM_FNRST_USE_WLAN_FNRST_MASK (0x80000000U)\r\n#define BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_SRAM_FNRST_USE_WLAN_FNRST_SHIFT (31U)\r\n/*! LMU_DYN_BANKS_SRAM_FNRST_USE_WLAN_FNRST - 1: By default WLAN_SRAM_FNRST is used for SMU off domain banks */\r\n#define BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_SRAM_FNRST_USE_WLAN_FNRST(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_SRAM_FNRST_USE_WLAN_FNRST_SHIFT)) & BLEAPU_SOCBTAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_SRAM_FNRST_USE_WLAN_FNRST_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_LMU_G2BIST_CTRL_BYPASS - LMU G2Bist control bypass Register */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_MODE_BYPASS_EN_MASK (0x1U)\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_MODE_BYPASS_EN_SHIFT (0U)\r\n/*! LMU_G2BIST_MODE_BYPASS_EN - Firmware Bypass enable for lmu g2bist mode */\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_MODE_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_MODE_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_MODE_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_MODE_BYPASS_VAL_MASK (0x3EU)\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_MODE_BYPASS_VAL_SHIFT (1U)\r\n/*! LMU_G2BIST_MODE_BYPASS_VAL - Firmware Bypass value for lmu g2bist mode */\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_MODE_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_MODE_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_MODE_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_START_BP_EN_MASK (0x1000000U)\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_START_BP_EN_SHIFT (24U)\r\n/*! LMU_G2BIST_START_BP_EN - Firmware Bypass enable for lmu g2bist start */\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_START_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_START_BP_EN_SHIFT)) & BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_START_BP_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_START_BP_VAL_MASK (0x2000000U)\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_START_BP_VAL_SHIFT (25U)\r\n/*! LMU_G2BIST_START_BP_VAL - Firmware Bypass value for lmu g2bist start */\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_START_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_START_BP_VAL_SHIFT)) & BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_START_BP_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_CLK_EN_BP_EN_MASK (0x4000000U)\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_CLK_EN_BP_EN_SHIFT (26U)\r\n/*! LMU_G2BIST_CLK_EN_BP_EN - Firmware Bypass enable for lmu g2bist clock en */\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_CLK_EN_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_CLK_EN_BP_EN_SHIFT)) & BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_CLK_EN_BP_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_CLK_EN_BP_VAL_MASK (0x8000000U)\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_CLK_EN_BP_VAL_SHIFT (27U)\r\n/*! LMU_G2BIST_CLK_EN_BP_VAL - Firmware Bypass value for lmu g2bist clock en */\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_CLK_EN_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_CLK_EN_BP_VAL_SHIFT)) & BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_CLK_EN_BP_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_G2BIST_STATUS_MASK (0xF0000000U)\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_G2BIST_STATUS_SHIFT (28U)\r\n/*! G2BIST_STATUS - g2bist status */\r\n#define BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_G2BIST_STATUS(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_G2BIST_STATUS_SHIFT)) & BLEAPU_SOCBTAPU_LMU_G2BIST_CTRL_BYPASS_G2BIST_STATUS_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS - LMU G2Bist control bypass Register for CPU1 */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_EN_MASK (0x1U)\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_EN_SHIFT (0U)\r\n/*! LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_EN - Firmware Bypass enable for CPU1 static banks lmu powerdomain repair request */\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_EN_SHIFT)) & BLEAPU_SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_VAL_MASK (0xFFF0U)\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_VAL_SHIFT (4U)\r\n/*! LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_VAL - Firmware Bypass value for CPU1 static banks lmu powerdomain repair request */\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_VAL_SHIFT)) & BLEAPU_SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_EN_MASK (0x100000U)\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_EN_SHIFT (20U)\r\n/*! LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_EN - Firmware Bypass enable for SMU1 dynamic banks lmu powerdomain repair request */\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_EN_SHIFT)) & BLEAPU_SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_VAL_MASK (0xF000000U)\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_VAL_SHIFT (24U)\r\n/*! LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_VAL - Firmware Bypass value for SMU1 dynamic banks lmu powerdomain repair request */\r\n#define BLEAPU_SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_VAL_SHIFT)) & BLEAPU_SOCBTAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_APU_PWR_CTRL_BYPASS5 - \" */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS5_CPU1_VINITHI_BYPASS_VAL_MASK (0x1000U)\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS5_CPU1_VINITHI_BYPASS_VAL_SHIFT (12U)\r\n/*! CPU1_VINITHI_BYPASS_VAL - Firmware Bypass Value for CPU1 Vinithi (default boot from ROM) */\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS5_CPU1_VINITHI_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS5_CPU1_VINITHI_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS5_CPU1_VINITHI_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS5_CPU1_VINITHI_BYPASS_EN_MASK (0x2000U)\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS5_CPU1_VINITHI_BYPASS_EN_SHIFT (13U)\r\n/*! CPU1_VINITHI_BYPASS_EN - Firmware Bypass enable for CPU1 Vinithi */\r\n#define BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS5_CPU1_VINITHI_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS5_CPU1_VINITHI_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_APU_PWR_CTRL_BYPASS5_CPU1_VINITHI_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0 - LMU static bank control byapss0 Register for smu1 hybrid banks mem */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_ISO_EN_BP_EN_MASK (0xFFU)\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_ISO_EN_BP_EN_SHIFT (0U)\r\n/*! LMU_HYBRID_BANKS_ISO_EN_BP_EN - Firmware Bypass enable for lmu static banks iso_en */\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_ISO_EN_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_ISO_EN_BP_EN_SHIFT)) & BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_ISO_EN_BP_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_ISO_EN_BP_VAL_MASK (0xFF00U)\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_ISO_EN_BP_VAL_SHIFT (8U)\r\n/*! LMU_HYBRID_BANKS_ISO_EN_BP_VAL - Firmware Bypass value for lmu static banks iso_en */\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_ISO_EN_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_ISO_EN_BP_VAL_SHIFT)) & BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_ISO_EN_BP_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_PSW_EN_BP_EN_MASK (0xFF0000U)\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_PSW_EN_BP_EN_SHIFT (16U)\r\n/*! LMU_HYBRID_BANKS_PSW_EN_BP_EN - Firmware Bypass enable for lmu static banks psw_en */\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_PSW_EN_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_PSW_EN_BP_EN_SHIFT)) & BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_PSW_EN_BP_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_PSW_EN_BP_VAL_MASK (0xFF000000U)\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_PSW_EN_BP_VAL_SHIFT (24U)\r\n/*! LMU_HYBRID_BANKS_PSW_EN_BP_VAL - Firmware Bypass value for lmu static banks psw_en */\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_PSW_EN_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_PSW_EN_BP_VAL_SHIFT)) & BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_PSW_EN_BP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1 - LMU static bank control byapss1 Register for smu1 hybrid banks mem */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_SRAM_PD_BP_EN_MASK (0xFFU)\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_SRAM_PD_BP_EN_SHIFT (0U)\r\n/*! LMU_HYBRID_BANKS_SRAM_PD_BP_EN - Firmware Bypass enable for lmu static banks sram_pd */\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_SRAM_PD_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_SRAM_PD_BP_EN_SHIFT)) & BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_SRAM_PD_BP_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_SRAM_PD_BP_VAL_MASK (0xFF00U)\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_SRAM_PD_BP_VAL_SHIFT (8U)\r\n/*! LMU_HYBRID_BANKS_SRAM_PD_BP_VAL - Firmware Bypass value for lmu static banks sram_pd */\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_SRAM_PD_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_SRAM_PD_BP_VAL_SHIFT)) & BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_SRAM_PD_BP_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_FNRST_BP_EN_MASK (0xFF0000U)\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_FNRST_BP_EN_SHIFT (16U)\r\n/*! LMU_HYBRID_BANKS_FNRST_BP_EN - Firmware Bypass enable for lmu static banks fnrst */\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_FNRST_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_FNRST_BP_EN_SHIFT)) & BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_FNRST_BP_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_FNRST_BP_VAL_MASK (0xFF000000U)\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_FNRST_BP_VAL_SHIFT (24U)\r\n/*! LMU_HYBRID_BANKS_FNRST_BP_VAL - Firmware Bypass value for lmu static banks fnrst */\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_FNRST_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_FNRST_BP_VAL_SHIFT)) & BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_FNRST_BP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_SMU1_HYBRID_LMU_BYPASS2 - LMU static bank control byapss2 Register for smu1 hybrid banks mem */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS2_LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_EN_MASK (0xFFU)\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS2_LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_EN_SHIFT (0U)\r\n/*! LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_EN - Firmware Bypass enable for lmu static banks vddmc_sw_pd_ctrl */\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS2_LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS2_LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_EN_SHIFT)) & BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS2_LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS2_LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_MASK (0xFF00U)\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS2_LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_SHIFT (8U)\r\n/*! LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_VAL - Firmware Bypass value for lmu static banks vddmc_sw_pd_ctrl */\r\n#define BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS2_LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS2_LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_SHIFT)) & BLEAPU_SOCBTAPU_SMU1_HYBRID_LMU_BYPASS2_LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_APU_ECO_CTRL - APU ECO Control */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_APU_ECO_CTRL_ECO_BITS_MASK (0xFFFFFFFFU)\r\n#define BLEAPU_SOCBTAPU_APU_ECO_CTRL_ECO_BITS_SHIFT (0U)\r\n/*! ECO_BITS - Reserved for ECOs */\r\n#define BLEAPU_SOCBTAPU_APU_ECO_CTRL_ECO_BITS(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_APU_ECO_CTRL_ECO_BITS_SHIFT)) & BLEAPU_SOCBTAPU_APU_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_GPIO_WKUP_CTRL0 - \" */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_GPIO_WKUP_CTRL0_P2C_WKUP_SELECT_MASK (0xFFFFFFFFU)\r\n#define BLEAPU_SOCBTAPU_GPIO_WKUP_CTRL0_P2C_WKUP_SELECT_SHIFT (0U)\r\n/*! P2C_WKUP_SELECT - [07:00]: Mux 1 of 32 p2c_pad_wkup input pins to APU wakeup input [0] */\r\n#define BLEAPU_SOCBTAPU_GPIO_WKUP_CTRL0_P2C_WKUP_SELECT(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_GPIO_WKUP_CTRL0_P2C_WKUP_SELECT_SHIFT)) & BLEAPU_SOCBTAPU_GPIO_WKUP_CTRL0_P2C_WKUP_SELECT_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_GPIO_WKUP_CTRL1 - \" */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_GPIO_WKUP_CTRL1_P2C_WKUP_SELECT_MASK (0xFFFFFFFFU)\r\n#define BLEAPU_SOCBTAPU_GPIO_WKUP_CTRL1_P2C_WKUP_SELECT_SHIFT (0U)\r\n/*! P2C_WKUP_SELECT - [07:00]: Mux 1 of 32 p2c_pad_wkup input pins to APU wakeup input [4] */\r\n#define BLEAPU_SOCBTAPU_GPIO_WKUP_CTRL1_P2C_WKUP_SELECT(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_GPIO_WKUP_CTRL1_P2C_WKUP_SELECT_SHIFT)) & BLEAPU_SOCBTAPU_GPIO_WKUP_CTRL1_P2C_WKUP_SELECT_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_GPIO_WKUP_CTRL2 - \" */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_GPIO_WKUP_CTRL2_P2C_WKUP_SELECT_MASK (0xFFFFFFFFU)\r\n#define BLEAPU_SOCBTAPU_GPIO_WKUP_CTRL2_P2C_WKUP_SELECT_SHIFT (0U)\r\n/*! P2C_WKUP_SELECT - [07:00]: Mux 1 of 32 p2c_pad_wkup input pins to APU wakeup input [8] */\r\n#define BLEAPU_SOCBTAPU_GPIO_WKUP_CTRL2_P2C_WKUP_SELECT(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_GPIO_WKUP_CTRL2_P2C_WKUP_SELECT_SHIFT)) & BLEAPU_SOCBTAPU_GPIO_WKUP_CTRL2_P2C_WKUP_SELECT_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_GPIO_WKUP_CTRL3 - \" */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_GPIO_WKUP_CTRL3_P2C_WKUP_SELECT_MASK (0xFFFFFFFFU)\r\n#define BLEAPU_SOCBTAPU_GPIO_WKUP_CTRL3_P2C_WKUP_SELECT_SHIFT (0U)\r\n/*! P2C_WKUP_SELECT - [07:00]: Mux 1 of 32 p2c_pad_wkup input pins to APU wakeup input [12] */\r\n#define BLEAPU_SOCBTAPU_GPIO_WKUP_CTRL3_P2C_WKUP_SELECT(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_GPIO_WKUP_CTRL3_P2C_WKUP_SELECT_SHIFT)) & BLEAPU_SOCBTAPU_GPIO_WKUP_CTRL3_P2C_WKUP_SELECT_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_HOST_WKUP_MODE - \" */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_HOST_WKUP_MODE_GPIO_SEL_MASK (0xFFFFU)\r\n#define BLEAPU_SOCBTAPU_HOST_WKUP_MODE_GPIO_SEL_SHIFT (0U)\r\n/*! GPIO_SEL - GPIO select */\r\n#define BLEAPU_SOCBTAPU_HOST_WKUP_MODE_GPIO_SEL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_HOST_WKUP_MODE_GPIO_SEL_SHIFT)) & BLEAPU_SOCBTAPU_HOST_WKUP_MODE_GPIO_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_T3_CLK_DIV_EN_BYPASS - \" */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_256_CLK_DIV_EN_BYPASS_EN_MASK (0x1U)\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_256_CLK_DIV_EN_BYPASS_EN_SHIFT (0U)\r\n/*! T3_SOC_256_CLK_DIV_EN_BYPASS_EN - Enable/ disable value: */\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_256_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_256_CLK_DIV_EN_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_256_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_256_CLK_DIV_EN_BYPASS_VAL_MASK (0x2U)\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_256_CLK_DIV_EN_BYPASS_VAL_SHIFT (1U)\r\n/*! T3_SOC_256_CLK_DIV_EN_BYPASS_VAL - bypass value */\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_256_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_256_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_256_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_320_CLK_DIV_EN_BYPASS_EN_MASK (0x4U)\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_320_CLK_DIV_EN_BYPASS_EN_SHIFT (2U)\r\n/*! T3_SOC_320_CLK_DIV_EN_BYPASS_EN - Enable/ disable value: */\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_320_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_320_CLK_DIV_EN_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_320_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_320_CLK_DIV_EN_BYPASS_VAL_MASK (0x8U)\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_320_CLK_DIV_EN_BYPASS_VAL_SHIFT (3U)\r\n/*! T3_SOC_320_CLK_DIV_EN_BYPASS_VAL - bypass value */\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_320_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_320_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_320_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_365P7_CLK_DIV_EN_BYPASS_EN_MASK (0x10U)\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_365P7_CLK_DIV_EN_BYPASS_EN_SHIFT (4U)\r\n/*! T3_SOC_365P7_CLK_DIV_EN_BYPASS_EN - Enable/ disable value: */\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_365P7_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_365P7_CLK_DIV_EN_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_365P7_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_365P7_CLK_DIV_EN_BYPASS_VAL_MASK (0x20U)\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_365P7_CLK_DIV_EN_BYPASS_VAL_SHIFT (5U)\r\n/*! T3_SOC_365P7_CLK_DIV_EN_BYPASS_VAL - bypass value */\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_365P7_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_365P7_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_365P7_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_426_CLK_DIV_EN_BYPASS_EN_MASK (0x40U)\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_426_CLK_DIV_EN_BYPASS_EN_SHIFT (6U)\r\n/*! T3_SOC_426_CLK_DIV_EN_BYPASS_EN - Enable/ disable value: */\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_426_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_426_CLK_DIV_EN_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_426_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_426_CLK_DIV_EN_BYPASS_VAL_MASK (0x80U)\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_426_CLK_DIV_EN_BYPASS_VAL_SHIFT (7U)\r\n/*! T3_SOC_426_CLK_DIV_EN_BYPASS_VAL - bypass value */\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_426_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_426_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_426_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_512_CLK_DIV_EN_BYPASS_EN_MASK (0x100U)\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_512_CLK_DIV_EN_BYPASS_EN_SHIFT (8U)\r\n/*! T3_SOC_512_CLK_DIV_EN_BYPASS_EN - Enable/ disable value: */\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_512_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_512_CLK_DIV_EN_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_512_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_512_CLK_DIV_EN_BYPASS_VAL_MASK (0x200U)\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_512_CLK_DIV_EN_BYPASS_VAL_SHIFT (9U)\r\n/*! T3_SOC_512_CLK_DIV_EN_BYPASS_VAL - bypass value */\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_512_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_512_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_512_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_213P3_CLK_DIV_EN_BYPASS_EN_MASK (0x400U)\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_213P3_CLK_DIV_EN_BYPASS_EN_SHIFT (10U)\r\n/*! T3_213P3_CLK_DIV_EN_BYPASS_EN - Enable/ disable value: */\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_213P3_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_213P3_CLK_DIV_EN_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_213P3_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_213P3_CLK_DIV_EN_BYPASS_VAL_MASK (0x800U)\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_213P3_CLK_DIV_EN_BYPASS_VAL_SHIFT (11U)\r\n/*! T3_213P3_CLK_DIV_EN_BYPASS_VAL - bypass value */\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_213P3_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_213P3_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_213P3_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC1_CLK_DIV_EN_BYPASS_EN_MASK (0x1000U)\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC1_CLK_DIV_EN_BYPASS_EN_SHIFT (12U)\r\n/*! T3_MAC1_CLK_DIV_EN_BYPASS_EN - Enable/ disable value: */\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC1_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC1_CLK_DIV_EN_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC1_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC1_CLK_DIV_EN_BYPASS_VAL_MASK (0x2000U)\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC1_CLK_DIV_EN_BYPASS_VAL_SHIFT (13U)\r\n/*! T3_MAC1_CLK_DIV_EN_BYPASS_VAL - bypass value */\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC1_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC1_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC1_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC2_CLK_DIV_EN_BYPASS_EN_MASK (0x4000U)\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC2_CLK_DIV_EN_BYPASS_EN_SHIFT (14U)\r\n/*! T3_MAC2_CLK_DIV_EN_BYPASS_EN - Enable/ disable value: */\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC2_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC2_CLK_DIV_EN_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC2_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC2_CLK_DIV_EN_BYPASS_VAL_MASK (0x8000U)\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC2_CLK_DIV_EN_BYPASS_VAL_SHIFT (15U)\r\n/*! T3_MAC2_CLK_DIV_EN_BYPASS_VAL - bypass value */\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC2_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC2_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC2_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_BBUD_CLK_DIV_EN_BYPASS_EN_MASK (0x10000U)\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_BBUD_CLK_DIV_EN_BYPASS_EN_SHIFT (16U)\r\n/*! T3_BBUD_CLK_DIV_EN_BYPASS_EN - Enable/ disable value: */\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_BBUD_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_BBUD_CLK_DIV_EN_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_BBUD_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_BBUD_CLK_DIV_EN_BYPASS_VAL_MASK (0x20000U)\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_BBUD_CLK_DIV_EN_BYPASS_VAL_SHIFT (17U)\r\n/*! T3_BBUD_CLK_DIV_EN_BYPASS_VAL - bypass value */\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_BBUD_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_BBUD_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_T3_BBUD_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_TCPU_CPU_CLK_DIV_EN_BYPASS_EN_MASK (0x40000U)\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_TCPU_CPU_CLK_DIV_EN_BYPASS_EN_SHIFT (18U)\r\n/*! TCPU_CPU_CLK_DIV_EN_BYPASS_EN - Enable/ disable value: */\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_TCPU_CPU_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_TCPU_CPU_CLK_DIV_EN_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_TCPU_CPU_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_TCPU_CPU_CLK_DIV_EN_BYPASS_VAL_MASK (0x80000U)\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_TCPU_CPU_CLK_DIV_EN_BYPASS_VAL_SHIFT (19U)\r\n/*! TCPU_CPU_CLK_DIV_EN_BYPASS_VAL - bypass value for tcpu cpu_clk_en */\r\n#define BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_TCPU_CPU_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_TCPU_CPU_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_T3_CLK_DIV_EN_BYPASS_TCPU_CPU_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_LDO_LV_CTRL2 - LV LDO Control 2 */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_LDO_LV_CTRL2_LDO_GLU_XOSC_VAL_MASK (0x10U)\r\n#define BLEAPU_SOCBTAPU_LDO_LV_CTRL2_LDO_GLU_XOSC_VAL_SHIFT (4U)\r\n/*! LDO_GLU_XOSC_VAL - XOSC_EN value for ldo control logic set by FW */\r\n#define BLEAPU_SOCBTAPU_LDO_LV_CTRL2_LDO_GLU_XOSC_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_LDO_LV_CTRL2_LDO_GLU_XOSC_VAL_SHIFT)) & BLEAPU_SOCBTAPU_LDO_LV_CTRL2_LDO_GLU_XOSC_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_LDO_LV_CTRL2_LDO_GLU_XOSC_BYPASS_EN_MASK (0x20U)\r\n#define BLEAPU_SOCBTAPU_LDO_LV_CTRL2_LDO_GLU_XOSC_BYPASS_EN_SHIFT (5U)\r\n/*! LDO_GLU_XOSC_BYPASS_EN - XOSC_EN control bypass for ldo control logic */\r\n#define BLEAPU_SOCBTAPU_LDO_LV_CTRL2_LDO_GLU_XOSC_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_LDO_LV_CTRL2_LDO_GLU_XOSC_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_LDO_LV_CTRL2_LDO_GLU_XOSC_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_CAU_BYPASS - CAU Bypass */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_CAU_BYPASS_PHY_REF_CLK_BYPASS_VAL_MASK (0x1U)\r\n#define BLEAPU_SOCBTAPU_CAU_BYPASS_PHY_REF_CLK_BYPASS_VAL_SHIFT (0U)\r\n/*! PHY_REF_CLK_BYPASS_VAL - bypass value for phy ref clk enable */\r\n#define BLEAPU_SOCBTAPU_CAU_BYPASS_PHY_REF_CLK_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_CAU_BYPASS_PHY_REF_CLK_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_CAU_BYPASS_PHY_REF_CLK_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_CAU_BYPASS_PHY_REF_CLK_BYPASS_EN_MASK (0x2U)\r\n#define BLEAPU_SOCBTAPU_CAU_BYPASS_PHY_REF_CLK_BYPASS_EN_SHIFT (1U)\r\n/*! PHY_REF_CLK_BYPASS_EN - bypass enable for phy ref clk enable */\r\n#define BLEAPU_SOCBTAPU_CAU_BYPASS_PHY_REF_CLK_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_CAU_BYPASS_PHY_REF_CLK_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_CAU_BYPASS_PHY_REF_CLK_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_CAU_BYPASS_BT_CLK_BYPASS_VAL_MASK (0x4U)\r\n#define BLEAPU_SOCBTAPU_CAU_BYPASS_BT_CLK_BYPASS_VAL_SHIFT (2U)\r\n/*! BT_CLK_BYPASS_VAL - bypass value for bt clk enable */\r\n#define BLEAPU_SOCBTAPU_CAU_BYPASS_BT_CLK_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_CAU_BYPASS_BT_CLK_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_CAU_BYPASS_BT_CLK_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_CAU_BYPASS_BT_CLK_BYPASS_EN_MASK (0x8U)\r\n#define BLEAPU_SOCBTAPU_CAU_BYPASS_BT_CLK_BYPASS_EN_SHIFT (3U)\r\n/*! BT_CLK_BYPASS_EN - bypass enable for bt clk enable */\r\n#define BLEAPU_SOCBTAPU_CAU_BYPASS_BT_CLK_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_CAU_BYPASS_BT_CLK_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_CAU_BYPASS_BT_CLK_BYPASS_EN_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_CAU_BYPASS_BRF_CLK_BYPASS_VAL_MASK (0x40U)\r\n#define BLEAPU_SOCBTAPU_CAU_BYPASS_BRF_CLK_BYPASS_VAL_SHIFT (6U)\r\n/*! BRF_CLK_BYPASS_VAL - bypass value for brf clk */\r\n#define BLEAPU_SOCBTAPU_CAU_BYPASS_BRF_CLK_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_CAU_BYPASS_BRF_CLK_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_CAU_BYPASS_BRF_CLK_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_CAU_BYPASS_BRF_CLK_BYPASS_EN_MASK (0x80U)\r\n#define BLEAPU_SOCBTAPU_CAU_BYPASS_BRF_CLK_BYPASS_EN_SHIFT (7U)\r\n/*! BRF_CLK_BYPASS_EN - bypass enable for brf clk */\r\n#define BLEAPU_SOCBTAPU_CAU_BYPASS_BRF_CLK_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_CAU_BYPASS_BRF_CLK_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_CAU_BYPASS_BRF_CLK_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_MEM_PWDN2 - Memory Powerdown Control */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_MEM_PWDN2_OTP_BYPASS_VAL_MASK (0x2U)\r\n#define BLEAPU_SOCBTAPU_MEM_PWDN2_OTP_BYPASS_VAL_SHIFT (1U)\r\n/*! OTP_BYPASS_VAL - Firmware Bypass Value for OTP Power Down */\r\n#define BLEAPU_SOCBTAPU_MEM_PWDN2_OTP_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_MEM_PWDN2_OTP_BYPASS_VAL_SHIFT)) & BLEAPU_SOCBTAPU_MEM_PWDN2_OTP_BYPASS_VAL_MASK)\r\n\r\n#define BLEAPU_SOCBTAPU_MEM_PWDN2_OTP_BYPASS_EN_MASK (0x20000U)\r\n#define BLEAPU_SOCBTAPU_MEM_PWDN2_OTP_BYPASS_EN_SHIFT (17U)\r\n/*! OTP_BYPASS_EN - Firmware Bypass Enable for OTP Power Down */\r\n#define BLEAPU_SOCBTAPU_MEM_PWDN2_OTP_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_MEM_PWDN2_OTP_BYPASS_EN_SHIFT)) & BLEAPU_SOCBTAPU_MEM_PWDN2_OTP_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCBTAPU_HOST_WKUP_SOURCE - Host Wakeup Source Control */\r\n/*! @{ */\r\n\r\n#define BLEAPU_SOCBTAPU_HOST_WKUP_SOURCE_ENABLE_MASK (0xFFFFU)\r\n#define BLEAPU_SOCBTAPU_HOST_WKUP_SOURCE_ENABLE_SHIFT (0U)\r\n/*! ENABLE - Enable/ disable value: */\r\n#define BLEAPU_SOCBTAPU_HOST_WKUP_SOURCE_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << BLEAPU_SOCBTAPU_HOST_WKUP_SOURCE_ENABLE_SHIFT)) & BLEAPU_SOCBTAPU_HOST_WKUP_SOURCE_ENABLE_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group BLEAPU_Register_Masks */\r\n\r\n\r\n/* BLEAPU - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral BLEAPU base address */\r\n  #define BLEAPU_BASE                              (0x54258000u)\r\n  /** Peripheral BLEAPU base address */\r\n  #define BLEAPU_BASE_NS                           (0x44258000u)\r\n  /** Peripheral BLEAPU base pointer */\r\n  #define BLEAPU                                   ((BLEAPU_Type *)BLEAPU_BASE)\r\n  /** Peripheral BLEAPU base pointer */\r\n  #define BLEAPU_NS                                ((BLEAPU_Type *)BLEAPU_BASE_NS)\r\n  /** Array initializer of BLEAPU peripheral base addresses */\r\n  #define BLEAPU_BASE_ADDRS                        { BLEAPU_BASE }\r\n  /** Array initializer of BLEAPU peripheral base pointers */\r\n  #define BLEAPU_BASE_PTRS                         { BLEAPU }\r\n  /** Array initializer of BLEAPU peripheral base addresses */\r\n  #define BLEAPU_BASE_ADDRS_NS                     { BLEAPU_BASE_NS }\r\n  /** Array initializer of BLEAPU peripheral base pointers */\r\n  #define BLEAPU_BASE_PTRS_NS                      { BLEAPU_NS }\r\n#else\r\n  /** Peripheral BLEAPU base address */\r\n  #define BLEAPU_BASE                              (0x44258000u)\r\n  /** Peripheral BLEAPU base pointer */\r\n  #define BLEAPU                                   ((BLEAPU_Type *)BLEAPU_BASE)\r\n  /** Array initializer of BLEAPU peripheral base addresses */\r\n  #define BLEAPU_BASE_ADDRS                        { BLEAPU_BASE }\r\n  /** Array initializer of BLEAPU peripheral base pointers */\r\n  #define BLEAPU_BASE_PTRS                         { BLEAPU }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group BLEAPU_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- BUCK11 Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup BUCK11_Peripheral_Access_Layer BUCK11 Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** BUCK11 - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[64];\r\n  __I  uint8_t BUCK_BYPASS_SOC_CTRL_ONE_RO_REG;    /**< offset: 0x40 */\r\n  __I  uint8_t BUCK_BYPASS_SOC_CTRL_TWO_RO_REG;    /**< offset: 0x41 */\r\n  __I  uint8_t REG_RO_ONE_REG;                     /**< offset: 0x42 */\r\n  __I  uint8_t REG_RO_TWO_REG;                     /**< offset: 0x43 */\r\n  __I  uint8_t REG_RO_THREE_REG;                   /**< offset: 0x44 */\r\n  __I  uint8_t REG_RO_FOUR_REG;                    /**< offset: 0x45 */\r\n  __IO uint8_t SYS_CTRL_REG;                       /**< offset: 0x46 */\r\n  __IO uint8_t BUCK_BYPASS_SOC_CTRL_ONE_RW_REG;    /**< offset: 0x47 */\r\n  __IO uint8_t BUCK_BYPASS_SOC_CTRL_TWO_RW_REG;    /**< offset: 0x48 */\r\n  __IO uint8_t BUCK_CTRL_ONE_REG;                  /**< offset: 0x49 */\r\n  __IO uint8_t BUCK_CTRL_TWO_REG;                  /**< offset: 0x4A */\r\n  __IO uint8_t BUCK_CTRL_THREE_REG;                /**< offset: 0x4B */\r\n  __IO uint8_t BUCK_CTRL_FOUR_REG;                 /**< offset: 0x4C */\r\n  __IO uint8_t BUCK_CTRL_FIVE_REG;                 /**< offset: 0x4D */\r\n  __IO uint8_t BUCK_CTRL_SIX_REG;                  /**< offset: 0x4E */\r\n  __IO uint8_t BUCK_CTRL_SEVEN_REG;                /**< offset: 0x4F */\r\n  __IO uint8_t BUCK_CTRL_EIGHT_REG;                /**< offset: 0x50 */\r\n  __IO uint8_t BUCK_CTRL_NINE_REG;                 /**< offset: 0x51 */\r\n  __IO uint8_t BUCK_CTRL_TEN_REG;                  /**< offset: 0x52 */\r\n  __IO uint8_t BUCK_CTRL_ELEVEN_REG;               /**< offset: 0x53 */\r\n  __IO uint8_t BUCK_CTRL_TWELVE_REG;               /**< offset: 0x54 */\r\n  __IO uint8_t BUCK_CTRL_THIRTEEN_REG;             /**< offset: 0x55 */\r\n  __IO uint8_t BUCK_CTRL_FOURTEEN_REG;             /**< offset: 0x56 */\r\n  __IO uint8_t BUCK_CTRL_FIFTEEN_REG;              /**< offset: 0x57 */\r\n  __IO uint8_t BUCK_CTRL_SIXTEEN_REG;              /**< offset: 0x58 */\r\n  __IO uint8_t BUCK_CTRL_SEVENTEEN_REG;            /**< offset: 0x59 */\r\n  __IO uint8_t BUCK_CTRL_EIGHTEEN_REG;             /**< offset: 0x5A */\r\n  __IO uint8_t BUCK_CTRL_NINTEEN_REG;              /**< offset: 0x5B */\r\n  __IO uint8_t BUCK_CTRL_TWENTY_REG;               /**< offset: 0x5C */\r\n} BUCK11_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- BUCK11 Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup BUCK11_Register_Masks BUCK11 Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name BUCK_BYPASS_SOC_CTRL_ONE_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_BYPASS_SOC_CTRL_ONE_RO_REG_BUCK_BYPASS_SOC_CTRL_ONE_RO_MASK (0xFFU)\r\n#define BUCK11_BUCK_BYPASS_SOC_CTRL_ONE_RO_REG_BUCK_BYPASS_SOC_CTRL_ONE_RO_SHIFT (0U)\r\n/*! BUCK_BYPASS_SOC_CTRL_ONE_RO - BUCK_BYPASS_SOC_CTRL_ONE_RO */\r\n#define BUCK11_BUCK_BYPASS_SOC_CTRL_ONE_RO_REG_BUCK_BYPASS_SOC_CTRL_ONE_RO(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_BYPASS_SOC_CTRL_ONE_RO_REG_BUCK_BYPASS_SOC_CTRL_ONE_RO_SHIFT)) & BUCK11_BUCK_BYPASS_SOC_CTRL_ONE_RO_REG_BUCK_BYPASS_SOC_CTRL_ONE_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_BYPASS_SOC_CTRL_TWO_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_BYPASS_SOC_CTRL_TWO_RO_REG_BUCK_BYPASS_SOC_CTRL_TWO_RO_MASK (0xFFU)\r\n#define BUCK11_BUCK_BYPASS_SOC_CTRL_TWO_RO_REG_BUCK_BYPASS_SOC_CTRL_TWO_RO_SHIFT (0U)\r\n/*! BUCK_BYPASS_SOC_CTRL_TWO_RO - BUCK_BYPASS_SOC_CTRL_TWO_RO */\r\n#define BUCK11_BUCK_BYPASS_SOC_CTRL_TWO_RO_REG_BUCK_BYPASS_SOC_CTRL_TWO_RO(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_BYPASS_SOC_CTRL_TWO_RO_REG_BUCK_BYPASS_SOC_CTRL_TWO_RO_SHIFT)) & BUCK11_BUCK_BYPASS_SOC_CTRL_TWO_RO_REG_BUCK_BYPASS_SOC_CTRL_TWO_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name REG_RO_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_REG_RO_ONE_REG_REG_RO_ONE_MASK    (0xFFU)\r\n#define BUCK11_REG_RO_ONE_REG_REG_RO_ONE_SHIFT   (0U)\r\n/*! REG_RO_ONE - REG_RO_ONE */\r\n#define BUCK11_REG_RO_ONE_REG_REG_RO_ONE(x)      (((uint8_t)(((uint8_t)(x)) << BUCK11_REG_RO_ONE_REG_REG_RO_ONE_SHIFT)) & BUCK11_REG_RO_ONE_REG_REG_RO_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name REG_RO_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_REG_RO_TWO_REG_REG_RO_TWO_MASK    (0xFFU)\r\n#define BUCK11_REG_RO_TWO_REG_REG_RO_TWO_SHIFT   (0U)\r\n/*! REG_RO_TWO - REG_RO_TWO */\r\n#define BUCK11_REG_RO_TWO_REG_REG_RO_TWO(x)      (((uint8_t)(((uint8_t)(x)) << BUCK11_REG_RO_TWO_REG_REG_RO_TWO_SHIFT)) & BUCK11_REG_RO_TWO_REG_REG_RO_TWO_MASK)\r\n/*! @} */\r\n\r\n/*! @name REG_RO_THREE_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_REG_RO_THREE_REG_REG_RO_THREE_MASK (0xFFU)\r\n#define BUCK11_REG_RO_THREE_REG_REG_RO_THREE_SHIFT (0U)\r\n/*! REG_RO_THREE - REG_RO_THREE */\r\n#define BUCK11_REG_RO_THREE_REG_REG_RO_THREE(x)  (((uint8_t)(((uint8_t)(x)) << BUCK11_REG_RO_THREE_REG_REG_RO_THREE_SHIFT)) & BUCK11_REG_RO_THREE_REG_REG_RO_THREE_MASK)\r\n/*! @} */\r\n\r\n/*! @name REG_RO_FOUR_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_REG_RO_FOUR_REG_REG_RO_FOUR_MASK  (0xFFU)\r\n#define BUCK11_REG_RO_FOUR_REG_REG_RO_FOUR_SHIFT (0U)\r\n/*! REG_RO_FOUR - REG_RO_FOUR */\r\n#define BUCK11_REG_RO_FOUR_REG_REG_RO_FOUR(x)    (((uint8_t)(((uint8_t)(x)) << BUCK11_REG_RO_FOUR_REG_REG_RO_FOUR_SHIFT)) & BUCK11_REG_RO_FOUR_REG_REG_RO_FOUR_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYS_CTRL_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_SYS_CTRL_REG_REG_SYS_CTRL_MASK    (0xFFU)\r\n#define BUCK11_SYS_CTRL_REG_REG_SYS_CTRL_SHIFT   (0U)\r\n/*! REG_SYS_CTRL - REG_SYS_CTRL */\r\n#define BUCK11_SYS_CTRL_REG_REG_SYS_CTRL(x)      (((uint8_t)(((uint8_t)(x)) << BUCK11_SYS_CTRL_REG_REG_SYS_CTRL_SHIFT)) & BUCK11_SYS_CTRL_REG_REG_SYS_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_BYPASS_SOC_CTRL_ONE_RW_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_BYPASS_SOC_CTRL_ONE_RW_REG_REG_BUCK_BYPASS_SOC_CTRL_ONE_RW_MASK (0xFFU)\r\n#define BUCK11_BUCK_BYPASS_SOC_CTRL_ONE_RW_REG_REG_BUCK_BYPASS_SOC_CTRL_ONE_RW_SHIFT (0U)\r\n/*! REG_BUCK_BYPASS_SOC_CTRL_ONE_RW - REG_BUCK_BYPASS_SOC_CTRL_ONE_RW */\r\n#define BUCK11_BUCK_BYPASS_SOC_CTRL_ONE_RW_REG_REG_BUCK_BYPASS_SOC_CTRL_ONE_RW(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_BYPASS_SOC_CTRL_ONE_RW_REG_REG_BUCK_BYPASS_SOC_CTRL_ONE_RW_SHIFT)) & BUCK11_BUCK_BYPASS_SOC_CTRL_ONE_RW_REG_REG_BUCK_BYPASS_SOC_CTRL_ONE_RW_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_BYPASS_SOC_CTRL_TWO_RW_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_BYPASS_SOC_CTRL_TWO_RW_REG_REG_BUCK_BYPASS_SOC_CTRL_TWO_RW_MASK (0xFFU)\r\n#define BUCK11_BUCK_BYPASS_SOC_CTRL_TWO_RW_REG_REG_BUCK_BYPASS_SOC_CTRL_TWO_RW_SHIFT (0U)\r\n/*! REG_BUCK_BYPASS_SOC_CTRL_TWO_RW - REG_BUCK_BYPASS_SOC_CTRL_TWO_RW */\r\n#define BUCK11_BUCK_BYPASS_SOC_CTRL_TWO_RW_REG_REG_BUCK_BYPASS_SOC_CTRL_TWO_RW(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_BYPASS_SOC_CTRL_TWO_RW_REG_REG_BUCK_BYPASS_SOC_CTRL_TWO_RW_SHIFT)) & BUCK11_BUCK_BYPASS_SOC_CTRL_TWO_RW_REG_REG_BUCK_BYPASS_SOC_CTRL_TWO_RW_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_CTRL_ONE_REG_REG_BUCK_CTRL_ONE_MASK (0xFFU)\r\n#define BUCK11_BUCK_CTRL_ONE_REG_REG_BUCK_CTRL_ONE_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_ONE - REG_BUCK_CTRL_ONE */\r\n#define BUCK11_BUCK_CTRL_ONE_REG_REG_BUCK_CTRL_ONE(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_ONE_REG_REG_BUCK_CTRL_ONE_SHIFT)) & BUCK11_BUCK_CTRL_ONE_REG_REG_BUCK_CTRL_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_CTRL_TWO_REG_REG_BUCK_CTRL_TWO_MASK (0xFFU)\r\n#define BUCK11_BUCK_CTRL_TWO_REG_REG_BUCK_CTRL_TWO_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_TWO - REG_BUCK_CTRL_TWO */\r\n#define BUCK11_BUCK_CTRL_TWO_REG_REG_BUCK_CTRL_TWO(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_TWO_REG_REG_BUCK_CTRL_TWO_SHIFT)) & BUCK11_BUCK_CTRL_TWO_REG_REG_BUCK_CTRL_TWO_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_THREE_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_CTRL_THREE_REG_REG_BUCK_CTRL_THREE_MASK (0xFFU)\r\n#define BUCK11_BUCK_CTRL_THREE_REG_REG_BUCK_CTRL_THREE_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_THREE - REG_BUCK_CTRL_THREE */\r\n#define BUCK11_BUCK_CTRL_THREE_REG_REG_BUCK_CTRL_THREE(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_THREE_REG_REG_BUCK_CTRL_THREE_SHIFT)) & BUCK11_BUCK_CTRL_THREE_REG_REG_BUCK_CTRL_THREE_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_FOUR_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_CTRL_FOUR_REG_REG_BUCK_CTRL_FOUR_MASK (0xFFU)\r\n#define BUCK11_BUCK_CTRL_FOUR_REG_REG_BUCK_CTRL_FOUR_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_FOUR - REG_BUCK_CTRL_FOUR */\r\n#define BUCK11_BUCK_CTRL_FOUR_REG_REG_BUCK_CTRL_FOUR(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_FOUR_REG_REG_BUCK_CTRL_FOUR_SHIFT)) & BUCK11_BUCK_CTRL_FOUR_REG_REG_BUCK_CTRL_FOUR_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_FIVE_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_CTRL_FIVE_REG_REG_BUCK_CTRL_FIVE_MASK (0xFFU)\r\n#define BUCK11_BUCK_CTRL_FIVE_REG_REG_BUCK_CTRL_FIVE_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_FIVE - REG_BUCK_CTRL_FIVE */\r\n#define BUCK11_BUCK_CTRL_FIVE_REG_REG_BUCK_CTRL_FIVE(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_FIVE_REG_REG_BUCK_CTRL_FIVE_SHIFT)) & BUCK11_BUCK_CTRL_FIVE_REG_REG_BUCK_CTRL_FIVE_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_SIX_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_CTRL_SIX_REG_REG_BUCK_CTRL_SIX_MASK (0xFFU)\r\n#define BUCK11_BUCK_CTRL_SIX_REG_REG_BUCK_CTRL_SIX_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_SIX - REG_BUCK_CTRL_SIX */\r\n#define BUCK11_BUCK_CTRL_SIX_REG_REG_BUCK_CTRL_SIX(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_SIX_REG_REG_BUCK_CTRL_SIX_SHIFT)) & BUCK11_BUCK_CTRL_SIX_REG_REG_BUCK_CTRL_SIX_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_SEVEN_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_CTRL_SEVEN_REG_REG_BUCK_CTRL_SEVEN_MASK (0xFFU)\r\n#define BUCK11_BUCK_CTRL_SEVEN_REG_REG_BUCK_CTRL_SEVEN_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_SEVEN - REG_BUCK_CTRL_SEVEN */\r\n#define BUCK11_BUCK_CTRL_SEVEN_REG_REG_BUCK_CTRL_SEVEN(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_SEVEN_REG_REG_BUCK_CTRL_SEVEN_SHIFT)) & BUCK11_BUCK_CTRL_SEVEN_REG_REG_BUCK_CTRL_SEVEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_EIGHT_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_CTRL_EIGHT_REG_REG_BUCK_CTRL_EIGHT_MASK (0xFFU)\r\n#define BUCK11_BUCK_CTRL_EIGHT_REG_REG_BUCK_CTRL_EIGHT_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_EIGHT - REG_BUCK_CTRL_EIGHT */\r\n#define BUCK11_BUCK_CTRL_EIGHT_REG_REG_BUCK_CTRL_EIGHT(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_EIGHT_REG_REG_BUCK_CTRL_EIGHT_SHIFT)) & BUCK11_BUCK_CTRL_EIGHT_REG_REG_BUCK_CTRL_EIGHT_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_NINE_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_CTRL_NINE_REG_REG_BUCK_CTRL_NINE_MASK (0xFFU)\r\n#define BUCK11_BUCK_CTRL_NINE_REG_REG_BUCK_CTRL_NINE_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_NINE - REG_BUCK_CTRL_NINE */\r\n#define BUCK11_BUCK_CTRL_NINE_REG_REG_BUCK_CTRL_NINE(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_NINE_REG_REG_BUCK_CTRL_NINE_SHIFT)) & BUCK11_BUCK_CTRL_NINE_REG_REG_BUCK_CTRL_NINE_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_TEN_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_CTRL_TEN_REG_REG_BUCK_CTRL_TEN_MASK (0xFFU)\r\n#define BUCK11_BUCK_CTRL_TEN_REG_REG_BUCK_CTRL_TEN_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_TEN - REG_BUCK_CTRL_TEN */\r\n#define BUCK11_BUCK_CTRL_TEN_REG_REG_BUCK_CTRL_TEN(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_TEN_REG_REG_BUCK_CTRL_TEN_SHIFT)) & BUCK11_BUCK_CTRL_TEN_REG_REG_BUCK_CTRL_TEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_ELEVEN_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_CTRL_ELEVEN_REG_REG_BUCK_CTRL_ELEVEN_MASK (0xFFU)\r\n#define BUCK11_BUCK_CTRL_ELEVEN_REG_REG_BUCK_CTRL_ELEVEN_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_ELEVEN - REG_BUCK_CTRL_ELEVEN */\r\n#define BUCK11_BUCK_CTRL_ELEVEN_REG_REG_BUCK_CTRL_ELEVEN(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_ELEVEN_REG_REG_BUCK_CTRL_ELEVEN_SHIFT)) & BUCK11_BUCK_CTRL_ELEVEN_REG_REG_BUCK_CTRL_ELEVEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_TWELVE_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_CTRL_TWELVE_REG_REG_BUCK_CTRL_TWELVE_MASK (0xFFU)\r\n#define BUCK11_BUCK_CTRL_TWELVE_REG_REG_BUCK_CTRL_TWELVE_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_TWELVE - REG_BUCK_CTRL_TWELVE */\r\n#define BUCK11_BUCK_CTRL_TWELVE_REG_REG_BUCK_CTRL_TWELVE(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_TWELVE_REG_REG_BUCK_CTRL_TWELVE_SHIFT)) & BUCK11_BUCK_CTRL_TWELVE_REG_REG_BUCK_CTRL_TWELVE_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_THIRTEEN_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_CTRL_THIRTEEN_REG_REG_BUCK_CTRL_THIRTEEN_MASK (0xFFU)\r\n#define BUCK11_BUCK_CTRL_THIRTEEN_REG_REG_BUCK_CTRL_THIRTEEN_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_THIRTEEN - REG_BUCK_CTRL_THIRTEEN */\r\n#define BUCK11_BUCK_CTRL_THIRTEEN_REG_REG_BUCK_CTRL_THIRTEEN(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_THIRTEEN_REG_REG_BUCK_CTRL_THIRTEEN_SHIFT)) & BUCK11_BUCK_CTRL_THIRTEEN_REG_REG_BUCK_CTRL_THIRTEEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_FOURTEEN_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_CTRL_FOURTEEN_REG_REG_BUCK_CTRL_FOURTEEN_MASK (0xFFU)\r\n#define BUCK11_BUCK_CTRL_FOURTEEN_REG_REG_BUCK_CTRL_FOURTEEN_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_FOURTEEN - REG_BUCK_CTRL_FOURTEEN */\r\n#define BUCK11_BUCK_CTRL_FOURTEEN_REG_REG_BUCK_CTRL_FOURTEEN(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_FOURTEEN_REG_REG_BUCK_CTRL_FOURTEEN_SHIFT)) & BUCK11_BUCK_CTRL_FOURTEEN_REG_REG_BUCK_CTRL_FOURTEEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_FIFTEEN_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_CTRL_FIFTEEN_REG_REG_BUCK_CTRL_FIFTEEN_MASK (0xFFU)\r\n#define BUCK11_BUCK_CTRL_FIFTEEN_REG_REG_BUCK_CTRL_FIFTEEN_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_FIFTEEN - REG_BUCK_CTRL_FIFTEEN */\r\n#define BUCK11_BUCK_CTRL_FIFTEEN_REG_REG_BUCK_CTRL_FIFTEEN(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_FIFTEEN_REG_REG_BUCK_CTRL_FIFTEEN_SHIFT)) & BUCK11_BUCK_CTRL_FIFTEEN_REG_REG_BUCK_CTRL_FIFTEEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_SIXTEEN_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_CTRL_SIXTEEN_REG_REG_BUCK_CTRL_SIXTEEN_MASK (0xFFU)\r\n#define BUCK11_BUCK_CTRL_SIXTEEN_REG_REG_BUCK_CTRL_SIXTEEN_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_SIXTEEN - REG_BUCK_CTRL_SIXTEEN */\r\n#define BUCK11_BUCK_CTRL_SIXTEEN_REG_REG_BUCK_CTRL_SIXTEEN(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_SIXTEEN_REG_REG_BUCK_CTRL_SIXTEEN_SHIFT)) & BUCK11_BUCK_CTRL_SIXTEEN_REG_REG_BUCK_CTRL_SIXTEEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_SEVENTEEN_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_CTRL_SEVENTEEN_REG_REG_BUCK_CTRL_SEVENTEEN_MASK (0xFFU)\r\n#define BUCK11_BUCK_CTRL_SEVENTEEN_REG_REG_BUCK_CTRL_SEVENTEEN_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_SEVENTEEN - REG_BUCK_CTRL_SEVENTEEN */\r\n#define BUCK11_BUCK_CTRL_SEVENTEEN_REG_REG_BUCK_CTRL_SEVENTEEN(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_SEVENTEEN_REG_REG_BUCK_CTRL_SEVENTEEN_SHIFT)) & BUCK11_BUCK_CTRL_SEVENTEEN_REG_REG_BUCK_CTRL_SEVENTEEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_EIGHTEEN_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_CTRL_EIGHTEEN_REG_EXT_BG_CAL_CODE_MASK (0xFU)\r\n#define BUCK11_BUCK_CTRL_EIGHTEEN_REG_EXT_BG_CAL_CODE_SHIFT (0U)\r\n/*! EXT_BG_CAL_CODE - External calibration code for BG */\r\n#define BUCK11_BUCK_CTRL_EIGHTEEN_REG_EXT_BG_CAL_CODE(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_EIGHTEEN_REG_EXT_BG_CAL_CODE_SHIFT)) & BUCK11_BUCK_CTRL_EIGHTEEN_REG_EXT_BG_CAL_CODE_MASK)\r\n\r\n#define BUCK11_BUCK_CTRL_EIGHTEEN_REG_SEL_BG_CAL_CODE_MASK (0x10U)\r\n#define BUCK11_BUCK_CTRL_EIGHTEEN_REG_SEL_BG_CAL_CODE_SHIFT (4U)\r\n/*! SEL_BG_CAL_CODE - Select internal or external calibration code for BG */\r\n#define BUCK11_BUCK_CTRL_EIGHTEEN_REG_SEL_BG_CAL_CODE(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_EIGHTEEN_REG_SEL_BG_CAL_CODE_SHIFT)) & BUCK11_BUCK_CTRL_EIGHTEEN_REG_SEL_BG_CAL_CODE_MASK)\r\n\r\n#define BUCK11_BUCK_CTRL_EIGHTEEN_REG_SHORT_C11_ENB_MASK (0x20U)\r\n#define BUCK11_BUCK_CTRL_EIGHTEEN_REG_SHORT_C11_ENB_SHIFT (5U)\r\n/*! SHORT_C11_ENB - Short switch enable signal for internal C11 */\r\n#define BUCK11_BUCK_CTRL_EIGHTEEN_REG_SHORT_C11_ENB(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_EIGHTEEN_REG_SHORT_C11_ENB_SHIFT)) & BUCK11_BUCK_CTRL_EIGHTEEN_REG_SHORT_C11_ENB_MASK)\r\n\r\n#define BUCK11_BUCK_CTRL_EIGHTEEN_REG_LPBG_TRIM_MASK (0xC0U)\r\n#define BUCK11_BUCK_CTRL_EIGHTEEN_REG_LPBG_TRIM_SHIFT (6U)\r\n/*! LPBG_TRIM - Bandgap temperature curve trimming */\r\n#define BUCK11_BUCK_CTRL_EIGHTEEN_REG_LPBG_TRIM(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_EIGHTEEN_REG_LPBG_TRIM_SHIFT)) & BUCK11_BUCK_CTRL_EIGHTEEN_REG_LPBG_TRIM_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_NINTEEN_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_CTRL_NINTEEN_REG_REG_BUCK_CTRL_NINTEEN_MASK (0xFFU)\r\n#define BUCK11_BUCK_CTRL_NINTEEN_REG_REG_BUCK_CTRL_NINTEEN_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_NINTEEN - REG_BUCK_CTRL_NINTEEN */\r\n#define BUCK11_BUCK_CTRL_NINTEEN_REG_REG_BUCK_CTRL_NINTEEN(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_NINTEEN_REG_REG_BUCK_CTRL_NINTEEN_SHIFT)) & BUCK11_BUCK_CTRL_NINTEEN_REG_REG_BUCK_CTRL_NINTEEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_TWENTY_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK11_BUCK_CTRL_TWENTY_REG_REG_BUCK_CTRL_TWENTY_MASK (0xFFU)\r\n#define BUCK11_BUCK_CTRL_TWENTY_REG_REG_BUCK_CTRL_TWENTY_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_TWENTY - REG_BUCK_CTRL_TWENTY */\r\n#define BUCK11_BUCK_CTRL_TWENTY_REG_REG_BUCK_CTRL_TWENTY(x) (((uint8_t)(((uint8_t)(x)) << BUCK11_BUCK_CTRL_TWENTY_REG_REG_BUCK_CTRL_TWENTY_SHIFT)) & BUCK11_BUCK_CTRL_TWENTY_REG_REG_BUCK_CTRL_TWENTY_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group BUCK11_Register_Masks */\r\n\r\n\r\n/* BUCK11 - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral BUCK11 base address */\r\n  #define BUCK11_BASE                              (0x55002000u)\r\n  /** Peripheral BUCK11 base address */\r\n  #define BUCK11_BASE_NS                           (0x45002000u)\r\n  /** Peripheral BUCK11 base pointer */\r\n  #define BUCK11                                   ((BUCK11_Type *)BUCK11_BASE)\r\n  /** Peripheral BUCK11 base pointer */\r\n  #define BUCK11_NS                                ((BUCK11_Type *)BUCK11_BASE_NS)\r\n  /** Array initializer of BUCK11 peripheral base addresses */\r\n  #define BUCK11_BASE_ADDRS                        { BUCK11_BASE }\r\n  /** Array initializer of BUCK11 peripheral base pointers */\r\n  #define BUCK11_BASE_PTRS                         { BUCK11 }\r\n  /** Array initializer of BUCK11 peripheral base addresses */\r\n  #define BUCK11_BASE_ADDRS_NS                     { BUCK11_BASE_NS }\r\n  /** Array initializer of BUCK11 peripheral base pointers */\r\n  #define BUCK11_BASE_PTRS_NS                      { BUCK11_NS }\r\n#else\r\n  /** Peripheral BUCK11 base address */\r\n  #define BUCK11_BASE                              (0x45002000u)\r\n  /** Peripheral BUCK11 base pointer */\r\n  #define BUCK11                                   ((BUCK11_Type *)BUCK11_BASE)\r\n  /** Array initializer of BUCK11 peripheral base addresses */\r\n  #define BUCK11_BASE_ADDRS                        { BUCK11_BASE }\r\n  /** Array initializer of BUCK11 peripheral base pointers */\r\n  #define BUCK11_BASE_PTRS                         { BUCK11 }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group BUCK11_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- BUCK18 Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup BUCK18_Peripheral_Access_Layer BUCK18 Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** BUCK18 - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[96];\r\n  __I  uint8_t BUCK_BYPASS_SOC_CTRL_ONE_RO_REG;    /**< offset: 0x60 */\r\n  __I  uint8_t BUCK_BYPASS_SOC_CTRL_TWO_RO_REG;    /**< offset: 0x61 */\r\n  __I  uint8_t REG_RO_ONE_REG;                     /**< offset: 0x62 */\r\n  __I  uint8_t REG_RO_TWO_REG;                     /**< offset: 0x63 */\r\n  __I  uint8_t REG_RO_THREE_REG;                   /**< offset: 0x64 */\r\n  __I  uint8_t REG_RO_FOUR_REG;                    /**< offset: 0x65 */\r\n  __IO uint8_t SYS_CTRL_REG;                       /**< offset: 0x66 */\r\n  __IO uint8_t BUCK_BYPASS_SOC_CTRL_ONE_RW_REG;    /**< offset: 0x67 */\r\n  __IO uint8_t BUCK_BYPASS_SOC_CTRL_TWO_RW_REG;    /**< offset: 0x68 */\r\n  __IO uint8_t BUCK_CTRL_ONE_REG;                  /**< offset: 0x69 */\r\n  __IO uint8_t BUCK_CTRL_TWO_REG;                  /**< offset: 0x6A */\r\n  __IO uint8_t BUCK_CTRL_THREE_REG;                /**< offset: 0x6B */\r\n  __IO uint8_t BUCK_CTRL_FOUR_REG;                 /**< offset: 0x6C */\r\n  __IO uint8_t BUCK_CTRL_FIVE_REG;                 /**< offset: 0x6D */\r\n  __IO uint8_t BUCK_CTRL_SIX_REG;                  /**< offset: 0x6E */\r\n  __IO uint8_t BUCK_CTRL_SEVEN_REG;                /**< offset: 0x6F */\r\n  __IO uint8_t BUCK_CTRL_EIGHT_REG;                /**< offset: 0x70 */\r\n  __IO uint8_t BUCK_CTRL_NINE_REG;                 /**< offset: 0x71 */\r\n  __IO uint8_t BUCK_CTRL_TEN_REG;                  /**< offset: 0x72 */\r\n  __IO uint8_t BUCK_CTRL_ELEVEN_REG;               /**< offset: 0x73 */\r\n  __IO uint8_t BUCK_CTRL_TWELVE_REG;               /**< offset: 0x74 */\r\n  __IO uint8_t BUCK_CTRL_THIRTEEN_REG;             /**< offset: 0x75 */\r\n  __IO uint8_t BUCK_CTRL_FOURTEEN_REG;             /**< offset: 0x76 */\r\n  __IO uint8_t BUCK_CTRL_FIFTEEN_REG;              /**< offset: 0x77 */\r\n  __IO uint8_t BUCK_CTRL_SIXTEEN_REG;              /**< offset: 0x78 */\r\n  __IO uint8_t BUCK_CTRL_SEVENTEEN_REG;            /**< offset: 0x79 */\r\n  __IO uint8_t BUCK_CTRL_EIGHTEEN_REG;             /**< offset: 0x7A */\r\n  __IO uint8_t BUCK_CTRL_NINTEEN_REG;              /**< offset: 0x7B */\r\n  __IO uint8_t BUCK_CTRL_TWENTY_REG;               /**< offset: 0x7C */\r\n} BUCK18_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- BUCK18 Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup BUCK18_Register_Masks BUCK18 Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name BUCK_BYPASS_SOC_CTRL_ONE_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_BYPASS_SOC_CTRL_ONE_RO_REG_BUCK_BYPASS_SOC_CTRL_ONE_RO_MASK (0xFFU)\r\n#define BUCK18_BUCK_BYPASS_SOC_CTRL_ONE_RO_REG_BUCK_BYPASS_SOC_CTRL_ONE_RO_SHIFT (0U)\r\n/*! BUCK_BYPASS_SOC_CTRL_ONE_RO - BUCK_BYPASS_SOC_CTRL_ONE_RO */\r\n#define BUCK18_BUCK_BYPASS_SOC_CTRL_ONE_RO_REG_BUCK_BYPASS_SOC_CTRL_ONE_RO(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_BYPASS_SOC_CTRL_ONE_RO_REG_BUCK_BYPASS_SOC_CTRL_ONE_RO_SHIFT)) & BUCK18_BUCK_BYPASS_SOC_CTRL_ONE_RO_REG_BUCK_BYPASS_SOC_CTRL_ONE_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_BYPASS_SOC_CTRL_TWO_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_BYPASS_SOC_CTRL_TWO_RO_REG_BUCK_BYPASS_SOC_CTRL_TWO_RO_MASK (0xFFU)\r\n#define BUCK18_BUCK_BYPASS_SOC_CTRL_TWO_RO_REG_BUCK_BYPASS_SOC_CTRL_TWO_RO_SHIFT (0U)\r\n/*! BUCK_BYPASS_SOC_CTRL_TWO_RO - BUCK_BYPASS_SOC_CTRL_TWO_RO */\r\n#define BUCK18_BUCK_BYPASS_SOC_CTRL_TWO_RO_REG_BUCK_BYPASS_SOC_CTRL_TWO_RO(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_BYPASS_SOC_CTRL_TWO_RO_REG_BUCK_BYPASS_SOC_CTRL_TWO_RO_SHIFT)) & BUCK18_BUCK_BYPASS_SOC_CTRL_TWO_RO_REG_BUCK_BYPASS_SOC_CTRL_TWO_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name REG_RO_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_REG_RO_ONE_REG_REG_RO_ONE_MASK    (0xFFU)\r\n#define BUCK18_REG_RO_ONE_REG_REG_RO_ONE_SHIFT   (0U)\r\n/*! REG_RO_ONE - REG_RO_ONE */\r\n#define BUCK18_REG_RO_ONE_REG_REG_RO_ONE(x)      (((uint8_t)(((uint8_t)(x)) << BUCK18_REG_RO_ONE_REG_REG_RO_ONE_SHIFT)) & BUCK18_REG_RO_ONE_REG_REG_RO_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name REG_RO_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_REG_RO_TWO_REG_REG_RO_TWO_MASK    (0xFFU)\r\n#define BUCK18_REG_RO_TWO_REG_REG_RO_TWO_SHIFT   (0U)\r\n/*! REG_RO_TWO - REG_RO_TWO */\r\n#define BUCK18_REG_RO_TWO_REG_REG_RO_TWO(x)      (((uint8_t)(((uint8_t)(x)) << BUCK18_REG_RO_TWO_REG_REG_RO_TWO_SHIFT)) & BUCK18_REG_RO_TWO_REG_REG_RO_TWO_MASK)\r\n/*! @} */\r\n\r\n/*! @name REG_RO_THREE_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_REG_RO_THREE_REG_REG_RO_THREE_MASK (0xFFU)\r\n#define BUCK18_REG_RO_THREE_REG_REG_RO_THREE_SHIFT (0U)\r\n/*! REG_RO_THREE - REG_RO_THREE */\r\n#define BUCK18_REG_RO_THREE_REG_REG_RO_THREE(x)  (((uint8_t)(((uint8_t)(x)) << BUCK18_REG_RO_THREE_REG_REG_RO_THREE_SHIFT)) & BUCK18_REG_RO_THREE_REG_REG_RO_THREE_MASK)\r\n/*! @} */\r\n\r\n/*! @name REG_RO_FOUR_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_REG_RO_FOUR_REG_REG_RO_FOUR_MASK  (0xFFU)\r\n#define BUCK18_REG_RO_FOUR_REG_REG_RO_FOUR_SHIFT (0U)\r\n/*! REG_RO_FOUR - REG_RO_FOUR */\r\n#define BUCK18_REG_RO_FOUR_REG_REG_RO_FOUR(x)    (((uint8_t)(((uint8_t)(x)) << BUCK18_REG_RO_FOUR_REG_REG_RO_FOUR_SHIFT)) & BUCK18_REG_RO_FOUR_REG_REG_RO_FOUR_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYS_CTRL_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_SYS_CTRL_REG_REG_SYS_CTRL_MASK    (0xFFU)\r\n#define BUCK18_SYS_CTRL_REG_REG_SYS_CTRL_SHIFT   (0U)\r\n/*! REG_SYS_CTRL - REG_SYS_CTRL */\r\n#define BUCK18_SYS_CTRL_REG_REG_SYS_CTRL(x)      (((uint8_t)(((uint8_t)(x)) << BUCK18_SYS_CTRL_REG_REG_SYS_CTRL_SHIFT)) & BUCK18_SYS_CTRL_REG_REG_SYS_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_BYPASS_SOC_CTRL_ONE_RW_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_BYPASS_SOC_CTRL_ONE_RW_REG_REG_BUCK_BYPASS_SOC_CTRL_ONE_RW_MASK (0xFFU)\r\n#define BUCK18_BUCK_BYPASS_SOC_CTRL_ONE_RW_REG_REG_BUCK_BYPASS_SOC_CTRL_ONE_RW_SHIFT (0U)\r\n/*! REG_BUCK_BYPASS_SOC_CTRL_ONE_RW - REG_BUCK_BYPASS_SOC_CTRL_ONE_RW */\r\n#define BUCK18_BUCK_BYPASS_SOC_CTRL_ONE_RW_REG_REG_BUCK_BYPASS_SOC_CTRL_ONE_RW(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_BYPASS_SOC_CTRL_ONE_RW_REG_REG_BUCK_BYPASS_SOC_CTRL_ONE_RW_SHIFT)) & BUCK18_BUCK_BYPASS_SOC_CTRL_ONE_RW_REG_REG_BUCK_BYPASS_SOC_CTRL_ONE_RW_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_BYPASS_SOC_CTRL_TWO_RW_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_BYPASS_SOC_CTRL_TWO_RW_REG_REG_BUCK_BYPASS_SOC_CTRL_TWO_RW_MASK (0xFFU)\r\n#define BUCK18_BUCK_BYPASS_SOC_CTRL_TWO_RW_REG_REG_BUCK_BYPASS_SOC_CTRL_TWO_RW_SHIFT (0U)\r\n/*! REG_BUCK_BYPASS_SOC_CTRL_TWO_RW - REG_BUCK_BYPASS_SOC_CTRL_TWO_RW */\r\n#define BUCK18_BUCK_BYPASS_SOC_CTRL_TWO_RW_REG_REG_BUCK_BYPASS_SOC_CTRL_TWO_RW(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_BYPASS_SOC_CTRL_TWO_RW_REG_REG_BUCK_BYPASS_SOC_CTRL_TWO_RW_SHIFT)) & BUCK18_BUCK_BYPASS_SOC_CTRL_TWO_RW_REG_REG_BUCK_BYPASS_SOC_CTRL_TWO_RW_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_CTRL_ONE_REG_REG_BUCK_CTRL_ONE_MASK (0xFFU)\r\n#define BUCK18_BUCK_CTRL_ONE_REG_REG_BUCK_CTRL_ONE_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_ONE - REG_BUCK_CTRL_ONE */\r\n#define BUCK18_BUCK_CTRL_ONE_REG_REG_BUCK_CTRL_ONE(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_CTRL_ONE_REG_REG_BUCK_CTRL_ONE_SHIFT)) & BUCK18_BUCK_CTRL_ONE_REG_REG_BUCK_CTRL_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_CTRL_TWO_REG_REG_BUCK_CTRL_TWO_MASK (0xFFU)\r\n#define BUCK18_BUCK_CTRL_TWO_REG_REG_BUCK_CTRL_TWO_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_TWO - REG_BUCK_CTRL_TWO */\r\n#define BUCK18_BUCK_CTRL_TWO_REG_REG_BUCK_CTRL_TWO(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_CTRL_TWO_REG_REG_BUCK_CTRL_TWO_SHIFT)) & BUCK18_BUCK_CTRL_TWO_REG_REG_BUCK_CTRL_TWO_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_THREE_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_CTRL_THREE_REG_REG_BUCK_CTRL_THREE_MASK (0xFFU)\r\n#define BUCK18_BUCK_CTRL_THREE_REG_REG_BUCK_CTRL_THREE_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_THREE - REG_BUCK_CTRL_THREE */\r\n#define BUCK18_BUCK_CTRL_THREE_REG_REG_BUCK_CTRL_THREE(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_CTRL_THREE_REG_REG_BUCK_CTRL_THREE_SHIFT)) & BUCK18_BUCK_CTRL_THREE_REG_REG_BUCK_CTRL_THREE_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_FOUR_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_CTRL_FOUR_REG_REG_BUCK_CTRL_FOUR_MASK (0xFFU)\r\n#define BUCK18_BUCK_CTRL_FOUR_REG_REG_BUCK_CTRL_FOUR_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_FOUR - REG_BUCK_CTRL_FOUR */\r\n#define BUCK18_BUCK_CTRL_FOUR_REG_REG_BUCK_CTRL_FOUR(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_CTRL_FOUR_REG_REG_BUCK_CTRL_FOUR_SHIFT)) & BUCK18_BUCK_CTRL_FOUR_REG_REG_BUCK_CTRL_FOUR_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_FIVE_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_CTRL_FIVE_REG_REG_BUCK_CTRL_FIVE_MASK (0xFFU)\r\n#define BUCK18_BUCK_CTRL_FIVE_REG_REG_BUCK_CTRL_FIVE_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_FIVE - REG_BUCK_CTRL_FIVE */\r\n#define BUCK18_BUCK_CTRL_FIVE_REG_REG_BUCK_CTRL_FIVE(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_CTRL_FIVE_REG_REG_BUCK_CTRL_FIVE_SHIFT)) & BUCK18_BUCK_CTRL_FIVE_REG_REG_BUCK_CTRL_FIVE_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_SIX_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_CTRL_SIX_REG_REG_BUCK_CTRL_SIX_MASK (0xFFU)\r\n#define BUCK18_BUCK_CTRL_SIX_REG_REG_BUCK_CTRL_SIX_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_SIX - REG_BUCK_CTRL_SIX */\r\n#define BUCK18_BUCK_CTRL_SIX_REG_REG_BUCK_CTRL_SIX(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_CTRL_SIX_REG_REG_BUCK_CTRL_SIX_SHIFT)) & BUCK18_BUCK_CTRL_SIX_REG_REG_BUCK_CTRL_SIX_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_SEVEN_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_CTRL_SEVEN_REG_REG_BUCK_CTRL_SEVEN_MASK (0xFFU)\r\n#define BUCK18_BUCK_CTRL_SEVEN_REG_REG_BUCK_CTRL_SEVEN_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_SEVEN - REG_BUCK_CTRL_SEVEN */\r\n#define BUCK18_BUCK_CTRL_SEVEN_REG_REG_BUCK_CTRL_SEVEN(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_CTRL_SEVEN_REG_REG_BUCK_CTRL_SEVEN_SHIFT)) & BUCK18_BUCK_CTRL_SEVEN_REG_REG_BUCK_CTRL_SEVEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_EIGHT_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_CTRL_EIGHT_REG_REG_BUCK_CTRL_EIGHT_MASK (0xFFU)\r\n#define BUCK18_BUCK_CTRL_EIGHT_REG_REG_BUCK_CTRL_EIGHT_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_EIGHT - REG_BUCK_CTRL_EIGHT */\r\n#define BUCK18_BUCK_CTRL_EIGHT_REG_REG_BUCK_CTRL_EIGHT(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_CTRL_EIGHT_REG_REG_BUCK_CTRL_EIGHT_SHIFT)) & BUCK18_BUCK_CTRL_EIGHT_REG_REG_BUCK_CTRL_EIGHT_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_NINE_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_CTRL_NINE_REG_REG_BUCK_CTRL_NINE_MASK (0xFFU)\r\n#define BUCK18_BUCK_CTRL_NINE_REG_REG_BUCK_CTRL_NINE_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_NINE - REG_BUCK_CTRL_NINE */\r\n#define BUCK18_BUCK_CTRL_NINE_REG_REG_BUCK_CTRL_NINE(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_CTRL_NINE_REG_REG_BUCK_CTRL_NINE_SHIFT)) & BUCK18_BUCK_CTRL_NINE_REG_REG_BUCK_CTRL_NINE_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_TEN_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_CTRL_TEN_REG_REG_BUCK_CTRL_TEN_MASK (0xFFU)\r\n#define BUCK18_BUCK_CTRL_TEN_REG_REG_BUCK_CTRL_TEN_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_TEN - REG_BUCK_CTRL_TEN */\r\n#define BUCK18_BUCK_CTRL_TEN_REG_REG_BUCK_CTRL_TEN(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_CTRL_TEN_REG_REG_BUCK_CTRL_TEN_SHIFT)) & BUCK18_BUCK_CTRL_TEN_REG_REG_BUCK_CTRL_TEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_ELEVEN_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_CTRL_ELEVEN_REG_REG_BUCK_CTRL_ELEVEN_MASK (0xFFU)\r\n#define BUCK18_BUCK_CTRL_ELEVEN_REG_REG_BUCK_CTRL_ELEVEN_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_ELEVEN - REG_BUCK_CTRL_ELEVEN */\r\n#define BUCK18_BUCK_CTRL_ELEVEN_REG_REG_BUCK_CTRL_ELEVEN(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_CTRL_ELEVEN_REG_REG_BUCK_CTRL_ELEVEN_SHIFT)) & BUCK18_BUCK_CTRL_ELEVEN_REG_REG_BUCK_CTRL_ELEVEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_TWELVE_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_CTRL_TWELVE_REG_REG_BUCK_CTRL_TWELVE_MASK (0xFFU)\r\n#define BUCK18_BUCK_CTRL_TWELVE_REG_REG_BUCK_CTRL_TWELVE_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_TWELVE - REG_BUCK_CTRL_TWELVE */\r\n#define BUCK18_BUCK_CTRL_TWELVE_REG_REG_BUCK_CTRL_TWELVE(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_CTRL_TWELVE_REG_REG_BUCK_CTRL_TWELVE_SHIFT)) & BUCK18_BUCK_CTRL_TWELVE_REG_REG_BUCK_CTRL_TWELVE_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_THIRTEEN_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_CTRL_THIRTEEN_REG_REG_BUCK_CTRL_THIRTEEN_MASK (0xFFU)\r\n#define BUCK18_BUCK_CTRL_THIRTEEN_REG_REG_BUCK_CTRL_THIRTEEN_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_THIRTEEN - REG_BUCK_CTRL_THIRTEEN */\r\n#define BUCK18_BUCK_CTRL_THIRTEEN_REG_REG_BUCK_CTRL_THIRTEEN(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_CTRL_THIRTEEN_REG_REG_BUCK_CTRL_THIRTEEN_SHIFT)) & BUCK18_BUCK_CTRL_THIRTEEN_REG_REG_BUCK_CTRL_THIRTEEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_FOURTEEN_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_CTRL_FOURTEEN_REG_REG_BUCK_CTRL_FOURTEEN_MASK (0xFFU)\r\n#define BUCK18_BUCK_CTRL_FOURTEEN_REG_REG_BUCK_CTRL_FOURTEEN_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_FOURTEEN - REG_BUCK_CTRL_FOURTEEN */\r\n#define BUCK18_BUCK_CTRL_FOURTEEN_REG_REG_BUCK_CTRL_FOURTEEN(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_CTRL_FOURTEEN_REG_REG_BUCK_CTRL_FOURTEEN_SHIFT)) & BUCK18_BUCK_CTRL_FOURTEEN_REG_REG_BUCK_CTRL_FOURTEEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_FIFTEEN_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_CTRL_FIFTEEN_REG_REG_BUCK_CTRL_FIFTEEN_MASK (0xFFU)\r\n#define BUCK18_BUCK_CTRL_FIFTEEN_REG_REG_BUCK_CTRL_FIFTEEN_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_FIFTEEN - REG_BUCK_CTRL_FIFTEEN */\r\n#define BUCK18_BUCK_CTRL_FIFTEEN_REG_REG_BUCK_CTRL_FIFTEEN(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_CTRL_FIFTEEN_REG_REG_BUCK_CTRL_FIFTEEN_SHIFT)) & BUCK18_BUCK_CTRL_FIFTEEN_REG_REG_BUCK_CTRL_FIFTEEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_SIXTEEN_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_CTRL_SIXTEEN_REG_REG_BUCK_CTRL_SIXTEEN_MASK (0xFFU)\r\n#define BUCK18_BUCK_CTRL_SIXTEEN_REG_REG_BUCK_CTRL_SIXTEEN_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_SIXTEEN - REG_BUCK_CTRL_SIXTEEN */\r\n#define BUCK18_BUCK_CTRL_SIXTEEN_REG_REG_BUCK_CTRL_SIXTEEN(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_CTRL_SIXTEEN_REG_REG_BUCK_CTRL_SIXTEEN_SHIFT)) & BUCK18_BUCK_CTRL_SIXTEEN_REG_REG_BUCK_CTRL_SIXTEEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_SEVENTEEN_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_CTRL_SEVENTEEN_REG_REG_BUCK_CTRL_SEVENTEEN_MASK (0xFFU)\r\n#define BUCK18_BUCK_CTRL_SEVENTEEN_REG_REG_BUCK_CTRL_SEVENTEEN_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_SEVENTEEN - REG_BUCK_CTRL_SEVENTEEN */\r\n#define BUCK18_BUCK_CTRL_SEVENTEEN_REG_REG_BUCK_CTRL_SEVENTEEN(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_CTRL_SEVENTEEN_REG_REG_BUCK_CTRL_SEVENTEEN_SHIFT)) & BUCK18_BUCK_CTRL_SEVENTEEN_REG_REG_BUCK_CTRL_SEVENTEEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_EIGHTEEN_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_CTRL_EIGHTEEN_REG_REG_BUCK_CTRL_EIGHTEEN_MASK (0xFFU)\r\n#define BUCK18_BUCK_CTRL_EIGHTEEN_REG_REG_BUCK_CTRL_EIGHTEEN_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_EIGHTEEN - REG_BUCK_CTRL_EIGHTEEN */\r\n#define BUCK18_BUCK_CTRL_EIGHTEEN_REG_REG_BUCK_CTRL_EIGHTEEN(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_CTRL_EIGHTEEN_REG_REG_BUCK_CTRL_EIGHTEEN_SHIFT)) & BUCK18_BUCK_CTRL_EIGHTEEN_REG_REG_BUCK_CTRL_EIGHTEEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_NINTEEN_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_CTRL_NINTEEN_REG_REG_BUCK_CTRL_NINTEEN_MASK (0xFFU)\r\n#define BUCK18_BUCK_CTRL_NINTEEN_REG_REG_BUCK_CTRL_NINTEEN_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_NINTEEN - REG_BUCK_CTRL_NINTEEN */\r\n#define BUCK18_BUCK_CTRL_NINTEEN_REG_REG_BUCK_CTRL_NINTEEN(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_CTRL_NINTEEN_REG_REG_BUCK_CTRL_NINTEEN_SHIFT)) & BUCK18_BUCK_CTRL_NINTEEN_REG_REG_BUCK_CTRL_NINTEEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUCK_CTRL_TWENTY_REG -  */\r\n/*! @{ */\r\n\r\n#define BUCK18_BUCK_CTRL_TWENTY_REG_REG_BUCK_CTRL_TWENTY_MASK (0xFFU)\r\n#define BUCK18_BUCK_CTRL_TWENTY_REG_REG_BUCK_CTRL_TWENTY_SHIFT (0U)\r\n/*! REG_BUCK_CTRL_TWENTY - REG_BUCK_CTRL_TWENTY */\r\n#define BUCK18_BUCK_CTRL_TWENTY_REG_REG_BUCK_CTRL_TWENTY(x) (((uint8_t)(((uint8_t)(x)) << BUCK18_BUCK_CTRL_TWENTY_REG_REG_BUCK_CTRL_TWENTY_SHIFT)) & BUCK18_BUCK_CTRL_TWENTY_REG_REG_BUCK_CTRL_TWENTY_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group BUCK18_Register_Masks */\r\n\r\n\r\n/* BUCK18 - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral BUCK18 base address */\r\n  #define BUCK18_BASE                              (0x55002000u)\r\n  /** Peripheral BUCK18 base address */\r\n  #define BUCK18_BASE_NS                           (0x45002000u)\r\n  /** Peripheral BUCK18 base pointer */\r\n  #define BUCK18                                   ((BUCK18_Type *)BUCK18_BASE)\r\n  /** Peripheral BUCK18 base pointer */\r\n  #define BUCK18_NS                                ((BUCK18_Type *)BUCK18_BASE_NS)\r\n  /** Array initializer of BUCK18 peripheral base addresses */\r\n  #define BUCK18_BASE_ADDRS                        { BUCK18_BASE }\r\n  /** Array initializer of BUCK18 peripheral base pointers */\r\n  #define BUCK18_BASE_PTRS                         { BUCK18 }\r\n  /** Array initializer of BUCK18 peripheral base addresses */\r\n  #define BUCK18_BASE_ADDRS_NS                     { BUCK18_BASE_NS }\r\n  /** Array initializer of BUCK18 peripheral base pointers */\r\n  #define BUCK18_BASE_PTRS_NS                      { BUCK18_NS }\r\n#else\r\n  /** Peripheral BUCK18 base address */\r\n  #define BUCK18_BASE                              (0x45002000u)\r\n  /** Peripheral BUCK18 base pointer */\r\n  #define BUCK18                                   ((BUCK18_Type *)BUCK18_BASE)\r\n  /** Array initializer of BUCK18 peripheral base addresses */\r\n  #define BUCK18_BASE_ADDRS                        { BUCK18_BASE }\r\n  /** Array initializer of BUCK18 peripheral base pointers */\r\n  #define BUCK18_BASE_PTRS                         { BUCK18 }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group BUCK18_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- CACHE64_CTRL Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup CACHE64_CTRL_Peripheral_Access_Layer CACHE64_CTRL Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** CACHE64_CTRL - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[2048];\r\n  __IO uint32_t CCR;                               /**< Cache control register, offset: 0x800 */\r\n  __IO uint32_t CLCR;                              /**< Cache line control register, offset: 0x804 */\r\n  __IO uint32_t CSAR;                              /**< Cache search address register, offset: 0x808 */\r\n  __IO uint32_t CCVR;                              /**< Cache read/write value register, offset: 0x80C */\r\n} CACHE64_CTRL_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- CACHE64_CTRL Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup CACHE64_CTRL_Register_Masks CACHE64_CTRL Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name CCR - Cache control register */\r\n/*! @{ */\r\n\r\n#define CACHE64_CTRL_CCR_ENCACHE_MASK            (0x1U)\r\n#define CACHE64_CTRL_CCR_ENCACHE_SHIFT           (0U)\r\n/*! ENCACHE - Cache enable\r\n *  0b0..Cache disabled\r\n *  0b1..Cache enabled\r\n */\r\n#define CACHE64_CTRL_CCR_ENCACHE(x)              (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CCR_ENCACHE_SHIFT)) & CACHE64_CTRL_CCR_ENCACHE_MASK)\r\n\r\n#define CACHE64_CTRL_CCR_ENWRBUF_MASK            (0x2U)\r\n#define CACHE64_CTRL_CCR_ENWRBUF_SHIFT           (1U)\r\n/*! ENWRBUF - Enable Write Buffer\r\n *  0b0..Write buffer disabled\r\n *  0b1..Write buffer enabled\r\n */\r\n#define CACHE64_CTRL_CCR_ENWRBUF(x)              (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CCR_ENWRBUF_SHIFT)) & CACHE64_CTRL_CCR_ENWRBUF_MASK)\r\n\r\n#define CACHE64_CTRL_CCR_INVW0_MASK              (0x1000000U)\r\n#define CACHE64_CTRL_CCR_INVW0_SHIFT             (24U)\r\n/*! INVW0 - Invalidate Way 0\r\n *  0b0..No operation\r\n *  0b1..When setting the GO bit, invalidate all lines in way 0.\r\n */\r\n#define CACHE64_CTRL_CCR_INVW0(x)                (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CCR_INVW0_SHIFT)) & CACHE64_CTRL_CCR_INVW0_MASK)\r\n\r\n#define CACHE64_CTRL_CCR_PUSHW0_MASK             (0x2000000U)\r\n#define CACHE64_CTRL_CCR_PUSHW0_SHIFT            (25U)\r\n/*! PUSHW0 - Push Way 0\r\n *  0b0..No operation\r\n *  0b1..When setting the GO bit, push all modified lines in way 0\r\n */\r\n#define CACHE64_CTRL_CCR_PUSHW0(x)               (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CCR_PUSHW0_SHIFT)) & CACHE64_CTRL_CCR_PUSHW0_MASK)\r\n\r\n#define CACHE64_CTRL_CCR_INVW1_MASK              (0x4000000U)\r\n#define CACHE64_CTRL_CCR_INVW1_SHIFT             (26U)\r\n/*! INVW1 - Invalidate Way 1\r\n *  0b0..No operation\r\n *  0b1..When setting the GO bit, invalidate all lines in way 1\r\n */\r\n#define CACHE64_CTRL_CCR_INVW1(x)                (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CCR_INVW1_SHIFT)) & CACHE64_CTRL_CCR_INVW1_MASK)\r\n\r\n#define CACHE64_CTRL_CCR_PUSHW1_MASK             (0x8000000U)\r\n#define CACHE64_CTRL_CCR_PUSHW1_SHIFT            (27U)\r\n/*! PUSHW1 - Push Way 1\r\n *  0b0..No operation\r\n *  0b1..When setting the GO bit, push all modified lines in way 1\r\n */\r\n#define CACHE64_CTRL_CCR_PUSHW1(x)               (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CCR_PUSHW1_SHIFT)) & CACHE64_CTRL_CCR_PUSHW1_MASK)\r\n\r\n#define CACHE64_CTRL_CCR_GO_MASK                 (0x80000000U)\r\n#define CACHE64_CTRL_CCR_GO_SHIFT                (31U)\r\n/*! GO - Initiate Cache Command\r\n *  0b0..Write: no effect. Read: no cache command active.\r\n *  0b1..Write: initiate command indicated by bits 27-24. Read: cache command active.\r\n */\r\n#define CACHE64_CTRL_CCR_GO(x)                   (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CCR_GO_SHIFT)) & CACHE64_CTRL_CCR_GO_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLCR - Cache line control register */\r\n/*! @{ */\r\n\r\n#define CACHE64_CTRL_CLCR_LGO_MASK               (0x1U)\r\n#define CACHE64_CTRL_CLCR_LGO_SHIFT              (0U)\r\n/*! LGO - Initiate Cache Line Command\r\n *  0b0..Write: no effect. Read: no line command active.\r\n *  0b1..Write: initiate line command indicated by bits 27-24. Read: line command active.\r\n */\r\n#define CACHE64_CTRL_CLCR_LGO(x)                 (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CLCR_LGO_SHIFT)) & CACHE64_CTRL_CLCR_LGO_MASK)\r\n\r\n#define CACHE64_CTRL_CLCR_CACHEADDR_MASK         (0x3FFCU)\r\n#define CACHE64_CTRL_CLCR_CACHEADDR_SHIFT        (2U)\r\n/*! CACHEADDR - Cache address */\r\n#define CACHE64_CTRL_CLCR_CACHEADDR(x)           (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CLCR_CACHEADDR_SHIFT)) & CACHE64_CTRL_CLCR_CACHEADDR_MASK)\r\n\r\n#define CACHE64_CTRL_CLCR_WSEL_MASK              (0x4000U)\r\n#define CACHE64_CTRL_CLCR_WSEL_SHIFT             (14U)\r\n/*! WSEL - Way select\r\n *  0b0..Way 0\r\n *  0b1..Way 1\r\n */\r\n#define CACHE64_CTRL_CLCR_WSEL(x)                (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CLCR_WSEL_SHIFT)) & CACHE64_CTRL_CLCR_WSEL_MASK)\r\n\r\n#define CACHE64_CTRL_CLCR_TDSEL_MASK             (0x10000U)\r\n#define CACHE64_CTRL_CLCR_TDSEL_SHIFT            (16U)\r\n/*! TDSEL - Tag/Data Select\r\n *  0b0..Data\r\n *  0b1..Tag\r\n */\r\n#define CACHE64_CTRL_CLCR_TDSEL(x)               (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CLCR_TDSEL_SHIFT)) & CACHE64_CTRL_CLCR_TDSEL_MASK)\r\n\r\n#define CACHE64_CTRL_CLCR_LCIVB_MASK             (0x100000U)\r\n#define CACHE64_CTRL_CLCR_LCIVB_SHIFT            (20U)\r\n/*! LCIVB - Line Command Initial Valid Bit */\r\n#define CACHE64_CTRL_CLCR_LCIVB(x)               (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CLCR_LCIVB_SHIFT)) & CACHE64_CTRL_CLCR_LCIVB_MASK)\r\n\r\n#define CACHE64_CTRL_CLCR_LCIMB_MASK             (0x200000U)\r\n#define CACHE64_CTRL_CLCR_LCIMB_SHIFT            (21U)\r\n/*! LCIMB - Line Command Initial Modified Bit */\r\n#define CACHE64_CTRL_CLCR_LCIMB(x)               (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CLCR_LCIMB_SHIFT)) & CACHE64_CTRL_CLCR_LCIMB_MASK)\r\n\r\n#define CACHE64_CTRL_CLCR_LCWAY_MASK             (0x400000U)\r\n#define CACHE64_CTRL_CLCR_LCWAY_SHIFT            (22U)\r\n/*! LCWAY - Line Command Way */\r\n#define CACHE64_CTRL_CLCR_LCWAY(x)               (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CLCR_LCWAY_SHIFT)) & CACHE64_CTRL_CLCR_LCWAY_MASK)\r\n\r\n#define CACHE64_CTRL_CLCR_LCMD_MASK              (0x3000000U)\r\n#define CACHE64_CTRL_CLCR_LCMD_SHIFT             (24U)\r\n/*! LCMD - Line Command\r\n *  0b00..Search and read or write\r\n *  0b01..Invalidate\r\n *  0b10..Push\r\n *  0b11..Clear\r\n */\r\n#define CACHE64_CTRL_CLCR_LCMD(x)                (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CLCR_LCMD_SHIFT)) & CACHE64_CTRL_CLCR_LCMD_MASK)\r\n\r\n#define CACHE64_CTRL_CLCR_LADSEL_MASK            (0x4000000U)\r\n#define CACHE64_CTRL_CLCR_LADSEL_SHIFT           (26U)\r\n/*! LADSEL - Line Address Select\r\n *  0b0..Cache address\r\n *  0b1..Physical address\r\n */\r\n#define CACHE64_CTRL_CLCR_LADSEL(x)              (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CLCR_LADSEL_SHIFT)) & CACHE64_CTRL_CLCR_LADSEL_MASK)\r\n\r\n#define CACHE64_CTRL_CLCR_LACC_MASK              (0x8000000U)\r\n#define CACHE64_CTRL_CLCR_LACC_SHIFT             (27U)\r\n/*! LACC - Line access type\r\n *  0b0..Read\r\n *  0b1..Write\r\n */\r\n#define CACHE64_CTRL_CLCR_LACC(x)                (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CLCR_LACC_SHIFT)) & CACHE64_CTRL_CLCR_LACC_MASK)\r\n/*! @} */\r\n\r\n/*! @name CSAR - Cache search address register */\r\n/*! @{ */\r\n\r\n#define CACHE64_CTRL_CSAR_LGO_MASK               (0x1U)\r\n#define CACHE64_CTRL_CSAR_LGO_SHIFT              (0U)\r\n/*! LGO - Initiate Cache Line Command\r\n *  0b0..Write: no effect. Read: no line command active.\r\n *  0b1..Write: initiate line command indicated by bits CLCR[27:24]. Read: line command active.\r\n */\r\n#define CACHE64_CTRL_CSAR_LGO(x)                 (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CSAR_LGO_SHIFT)) & CACHE64_CTRL_CSAR_LGO_MASK)\r\n\r\n#define CACHE64_CTRL_CSAR_PHYADDR27_1_MASK       (0xFFFFFFEU)\r\n#define CACHE64_CTRL_CSAR_PHYADDR27_1_SHIFT      (1U)\r\n/*! PHYADDR27_1 - Physical Address */\r\n#define CACHE64_CTRL_CSAR_PHYADDR27_1(x)         (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CSAR_PHYADDR27_1_SHIFT)) & CACHE64_CTRL_CSAR_PHYADDR27_1_MASK)\r\n\r\n#define CACHE64_CTRL_CSAR_PHYADDR31_29_MASK      (0xE0000000U)\r\n#define CACHE64_CTRL_CSAR_PHYADDR31_29_SHIFT     (29U)\r\n/*! PHYADDR31_29 - Physical Address */\r\n#define CACHE64_CTRL_CSAR_PHYADDR31_29(x)        (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CSAR_PHYADDR31_29_SHIFT)) & CACHE64_CTRL_CSAR_PHYADDR31_29_MASK)\r\n/*! @} */\r\n\r\n/*! @name CCVR - Cache read/write value register */\r\n/*! @{ */\r\n\r\n#define CACHE64_CTRL_CCVR_DATA_MASK              (0xFFFFFFFFU)\r\n#define CACHE64_CTRL_CCVR_DATA_SHIFT             (0U)\r\n/*! DATA - Cache read/write Data */\r\n#define CACHE64_CTRL_CCVR_DATA(x)                (((uint32_t)(((uint32_t)(x)) << CACHE64_CTRL_CCVR_DATA_SHIFT)) & CACHE64_CTRL_CCVR_DATA_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group CACHE64_CTRL_Register_Masks */\r\n\r\n\r\n/* CACHE64_CTRL - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral CACHE64_CTRL0 base address */\r\n  #define CACHE64_CTRL0_BASE                       (0x50033000u)\r\n  /** Peripheral CACHE64_CTRL0 base address */\r\n  #define CACHE64_CTRL0_BASE_NS                    (0x40033000u)\r\n  /** Peripheral CACHE64_CTRL0 base pointer */\r\n  #define CACHE64_CTRL0                            ((CACHE64_CTRL_Type *)CACHE64_CTRL0_BASE)\r\n  /** Peripheral CACHE64_CTRL0 base pointer */\r\n  #define CACHE64_CTRL0_NS                         ((CACHE64_CTRL_Type *)CACHE64_CTRL0_BASE_NS)\r\n  /** Peripheral CACHE64_CTRL1 base address */\r\n  #define CACHE64_CTRL1_BASE                       (0x50034000u)\r\n  /** Peripheral CACHE64_CTRL1 base address */\r\n  #define CACHE64_CTRL1_BASE_NS                    (0x40034000u)\r\n  /** Peripheral CACHE64_CTRL1 base pointer */\r\n  #define CACHE64_CTRL1                            ((CACHE64_CTRL_Type *)CACHE64_CTRL1_BASE)\r\n  /** Peripheral CACHE64_CTRL1 base pointer */\r\n  #define CACHE64_CTRL1_NS                         ((CACHE64_CTRL_Type *)CACHE64_CTRL1_BASE_NS)\r\n  /** Array initializer of CACHE64_CTRL peripheral base addresses */\r\n  #define CACHE64_CTRL_BASE_ADDRS                  { CACHE64_CTRL0_BASE, CACHE64_CTRL1_BASE }\r\n  /** Array initializer of CACHE64_CTRL peripheral base pointers */\r\n  #define CACHE64_CTRL_BASE_PTRS                   { CACHE64_CTRL0, CACHE64_CTRL1 }\r\n  /** Array initializer of CACHE64_CTRL peripheral base addresses */\r\n  #define CACHE64_CTRL_BASE_ADDRS_NS               { CACHE64_CTRL0_BASE_NS, CACHE64_CTRL1_BASE_NS }\r\n  /** Array initializer of CACHE64_CTRL peripheral base pointers */\r\n  #define CACHE64_CTRL_BASE_PTRS_NS                { CACHE64_CTRL0_NS, CACHE64_CTRL1_NS }\r\n#else\r\n  /** Peripheral CACHE64_CTRL0 base address */\r\n  #define CACHE64_CTRL0_BASE                       (0x40033000u)\r\n  /** Peripheral CACHE64_CTRL0 base pointer */\r\n  #define CACHE64_CTRL0                            ((CACHE64_CTRL_Type *)CACHE64_CTRL0_BASE)\r\n  /** Peripheral CACHE64_CTRL1 base address */\r\n  #define CACHE64_CTRL1_BASE                       (0x40034000u)\r\n  /** Peripheral CACHE64_CTRL1 base pointer */\r\n  #define CACHE64_CTRL1                            ((CACHE64_CTRL_Type *)CACHE64_CTRL1_BASE)\r\n  /** Array initializer of CACHE64_CTRL peripheral base addresses */\r\n  #define CACHE64_CTRL_BASE_ADDRS                  { CACHE64_CTRL0_BASE, CACHE64_CTRL1_BASE }\r\n  /** Array initializer of CACHE64_CTRL peripheral base pointers */\r\n  #define CACHE64_CTRL_BASE_PTRS                   { CACHE64_CTRL0, CACHE64_CTRL1 }\r\n#endif\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n/** CACHE64_CTRL physical memory base address */\r\n #define CACHE64_CTRL_PHYMEM_BASES                { 0x18000000u, 0x38000000u }\r\n/** CACHE64_CTRL physical memory size */\r\n #define CACHE64_CTRL_PHYMEM_SIZES                { 0x08000000u, 0x08000000u }\r\n/** CACHE64_CTRL physical memory base address */\r\n #define CACHE64_CTRL_PHYMEM_BASES_NS             { 0x08000000u, 0x28000000u }\r\n/** CACHE64_CTRL physical memory size */\r\n #define CACHE64_CTRL_PHYMEM_SIZES_NS             { 0x08000000u, 0x08000000u }\r\n#else\r\n/** CACHE64_CTRL physical memory base address */\r\n #define CACHE64_CTRL_PHYMEM_BASES                { 0x08000000u, 0x28000000u }\r\n/** CACHE64_CTRL physical memory size */\r\n #define CACHE64_CTRL_PHYMEM_SIZES                { 0x08000000u, 0x08000000u }\r\n#endif\r\n/* Backward compatibility */\r\n#define CACHE64_CTRL_CSAR_PHYADDR_MASK (CACHE64_CTRL_CSAR_PHYADDR27_1_MASK | CACHE64_CTRL_CSAR_PHYADDR31_29_MASK)\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group CACHE64_CTRL_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- CACHE64_POLSEL Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup CACHE64_POLSEL_Peripheral_Access_Layer CACHE64_POLSEL Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** CACHE64_POLSEL - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[20];\r\n  __IO uint32_t REG0_TOP;                          /**< Region 0 Top Boundary, offset: 0x14 */\r\n  __IO uint32_t REG1_TOP;                          /**< Region 1 Top Boundary, offset: 0x18 */\r\n  __IO uint32_t POLSEL;                            /**< Policy Select, offset: 0x1C */\r\n} CACHE64_POLSEL_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- CACHE64_POLSEL Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup CACHE64_POLSEL_Register_Masks CACHE64_POLSEL Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name REG0_TOP - Region 0 Top Boundary */\r\n/*! @{ */\r\n\r\n#define CACHE64_POLSEL_REG0_TOP_REG0_TOP_MASK    (0x7FFFC00U)\r\n#define CACHE64_POLSEL_REG0_TOP_REG0_TOP_SHIFT   (10U)\r\n/*! REG0_TOP - Upper limit of Region 0 */\r\n#define CACHE64_POLSEL_REG0_TOP_REG0_TOP(x)      (((uint32_t)(((uint32_t)(x)) << CACHE64_POLSEL_REG0_TOP_REG0_TOP_SHIFT)) & CACHE64_POLSEL_REG0_TOP_REG0_TOP_MASK)\r\n/*! @} */\r\n\r\n/*! @name REG1_TOP - Region 1 Top Boundary */\r\n/*! @{ */\r\n\r\n#define CACHE64_POLSEL_REG1_TOP_REG1_TOP_MASK    (0x7FFFC00U)\r\n#define CACHE64_POLSEL_REG1_TOP_REG1_TOP_SHIFT   (10U)\r\n/*! REG1_TOP - Upper limit of Region 1 */\r\n#define CACHE64_POLSEL_REG1_TOP_REG1_TOP(x)      (((uint32_t)(((uint32_t)(x)) << CACHE64_POLSEL_REG1_TOP_REG1_TOP_SHIFT)) & CACHE64_POLSEL_REG1_TOP_REG1_TOP_MASK)\r\n/*! @} */\r\n\r\n/*! @name POLSEL - Policy Select */\r\n/*! @{ */\r\n\r\n#define CACHE64_POLSEL_POLSEL_REG0_POLICY_MASK   (0x3U)\r\n#define CACHE64_POLSEL_POLSEL_REG0_POLICY_SHIFT  (0U)\r\n/*! REG0_POLICY - Policy Select for Region 0\r\n *  0b00..Non-cache\r\n *  0b01..Write-thru\r\n *  0b10..Write-back\r\n *  0b11..Invalid\r\n */\r\n#define CACHE64_POLSEL_POLSEL_REG0_POLICY(x)     (((uint32_t)(((uint32_t)(x)) << CACHE64_POLSEL_POLSEL_REG0_POLICY_SHIFT)) & CACHE64_POLSEL_POLSEL_REG0_POLICY_MASK)\r\n\r\n#define CACHE64_POLSEL_POLSEL_REG1_POLICY_MASK   (0xCU)\r\n#define CACHE64_POLSEL_POLSEL_REG1_POLICY_SHIFT  (2U)\r\n/*! REG1_POLICY - Policy Select for Region 0\r\n *  0b00..Non-cache\r\n *  0b01..Write-thru\r\n *  0b10..Write-back\r\n *  0b11..Invalid\r\n */\r\n#define CACHE64_POLSEL_POLSEL_REG1_POLICY(x)     (((uint32_t)(((uint32_t)(x)) << CACHE64_POLSEL_POLSEL_REG1_POLICY_SHIFT)) & CACHE64_POLSEL_POLSEL_REG1_POLICY_MASK)\r\n\r\n#define CACHE64_POLSEL_POLSEL_REG02_POLICY_MASK  (0x30U)\r\n#define CACHE64_POLSEL_POLSEL_REG02_POLICY_SHIFT (4U)\r\n/*! REG02_POLICY - Policy Select for Region 0\r\n *  0b00..Non-cache\r\n *  0b01..Write-thru\r\n *  0b10..Write-back\r\n *  0b11..Invalid\r\n */\r\n#define CACHE64_POLSEL_POLSEL_REG02_POLICY(x)    (((uint32_t)(((uint32_t)(x)) << CACHE64_POLSEL_POLSEL_REG02_POLICY_SHIFT)) & CACHE64_POLSEL_POLSEL_REG02_POLICY_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group CACHE64_POLSEL_Register_Masks */\r\n\r\n\r\n/* CACHE64_POLSEL - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral CACHE64_POLSEL0 base address */\r\n  #define CACHE64_POLSEL0_BASE                     (0x50033000u)\r\n  /** Peripheral CACHE64_POLSEL0 base address */\r\n  #define CACHE64_POLSEL0_BASE_NS                  (0x40033000u)\r\n  /** Peripheral CACHE64_POLSEL0 base pointer */\r\n  #define CACHE64_POLSEL0                          ((CACHE64_POLSEL_Type *)CACHE64_POLSEL0_BASE)\r\n  /** Peripheral CACHE64_POLSEL0 base pointer */\r\n  #define CACHE64_POLSEL0_NS                       ((CACHE64_POLSEL_Type *)CACHE64_POLSEL0_BASE_NS)\r\n  /** Peripheral CACHE64_POLSEL1 base address */\r\n  #define CACHE64_POLSEL1_BASE                     (0x50034000u)\r\n  /** Peripheral CACHE64_POLSEL1 base address */\r\n  #define CACHE64_POLSEL1_BASE_NS                  (0x40034000u)\r\n  /** Peripheral CACHE64_POLSEL1 base pointer */\r\n  #define CACHE64_POLSEL1                          ((CACHE64_POLSEL_Type *)CACHE64_POLSEL1_BASE)\r\n  /** Peripheral CACHE64_POLSEL1 base pointer */\r\n  #define CACHE64_POLSEL1_NS                       ((CACHE64_POLSEL_Type *)CACHE64_POLSEL1_BASE_NS)\r\n  /** Array initializer of CACHE64_POLSEL peripheral base addresses */\r\n  #define CACHE64_POLSEL_BASE_ADDRS                { CACHE64_POLSEL0_BASE, CACHE64_POLSEL1_BASE }\r\n  /** Array initializer of CACHE64_POLSEL peripheral base pointers */\r\n  #define CACHE64_POLSEL_BASE_PTRS                 { CACHE64_POLSEL0, CACHE64_POLSEL1 }\r\n  /** Array initializer of CACHE64_POLSEL peripheral base addresses */\r\n  #define CACHE64_POLSEL_BASE_ADDRS_NS             { CACHE64_POLSEL0_BASE_NS, CACHE64_POLSEL1_BASE_NS }\r\n  /** Array initializer of CACHE64_POLSEL peripheral base pointers */\r\n  #define CACHE64_POLSEL_BASE_PTRS_NS              { CACHE64_POLSEL0_NS, CACHE64_POLSEL1_NS }\r\n#else\r\n  /** Peripheral CACHE64_POLSEL0 base address */\r\n  #define CACHE64_POLSEL0_BASE                     (0x40033000u)\r\n  /** Peripheral CACHE64_POLSEL0 base pointer */\r\n  #define CACHE64_POLSEL0                          ((CACHE64_POLSEL_Type *)CACHE64_POLSEL0_BASE)\r\n  /** Peripheral CACHE64_POLSEL1 base address */\r\n  #define CACHE64_POLSEL1_BASE                     (0x40034000u)\r\n  /** Peripheral CACHE64_POLSEL1 base pointer */\r\n  #define CACHE64_POLSEL1                          ((CACHE64_POLSEL_Type *)CACHE64_POLSEL1_BASE)\r\n  /** Array initializer of CACHE64_POLSEL peripheral base addresses */\r\n  #define CACHE64_POLSEL_BASE_ADDRS                { CACHE64_POLSEL0_BASE, CACHE64_POLSEL1_BASE }\r\n  /** Array initializer of CACHE64_POLSEL peripheral base pointers */\r\n  #define CACHE64_POLSEL_BASE_PTRS                 { CACHE64_POLSEL0, CACHE64_POLSEL1 }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group CACHE64_POLSEL_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- CAU Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup CAU_Peripheral_Access_Layer CAU Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** CAU - Register Layout Typedef */\r\ntypedef struct {\r\n  __I  uint8_t BYPASS_SOC_PD_CTRL_RO_REG;          /**< offset: 0x0 */\r\n  __I  uint8_t BYPASS_SOC_CTRL_ONE_RO_REG;         /**< offset: 0x1 */\r\n  __I  uint8_t BYPASS_SOC_CTRL_TWO_RO_REG;         /**< offset: 0x2 */\r\n  __I  uint8_t BYPASS_RFU_CTRL_ONE_RO_REG;         /**< offset: 0x3 */\r\n  __I  uint8_t REG_RO_ONE_REG;                     /**< offset: 0x4 */\r\n  __I  uint8_t REG_RO_TWO_REG;                     /**< offset: 0x5 */\r\n  __I  uint8_t REG_RO_THREE_REG;                   /**< offset: 0x6 */\r\n  __I  uint8_t REG_RO_FOUR_REG;                    /**< offset: 0x7 */\r\n  __I  uint8_t REG_RO_FIVE_REG;                    /**< offset: 0x8 */\r\n  __I  uint8_t REG_RO_SIX_REG;                     /**< offset: 0x9 */\r\n  __IO uint8_t SW_RESET_B_REG;                     /**< offset: 0xA */\r\n  __IO uint8_t SYS_CTRL_REG;                       /**< offset: 0xB */\r\n  __IO uint8_t SYS_CTRL_PWR_OPT_SEL_REG;           /**< offset: 0xC */\r\n  __IO uint8_t BYPASS_SOC_PD_CTRL_RW_REG;          /**< offset: 0xD */\r\n  __IO uint8_t BYPASS_SOC_CTRL_ONE_RW_REG;         /**< offset: 0xE */\r\n  __IO uint8_t BYPASS_SOC_CTRL_TWO_RW_REG;         /**< offset: 0xF */\r\n  __IO uint8_t BYPASS_RFU_CTRL_ONE_RW_REG;         /**< offset: 0x10 */\r\n  __IO uint8_t PD_CTRL_ONE_REG;                    /**< offset: 0x11 */\r\n  __IO uint8_t PD_CTRL_TWO_REG;                    /**< offset: 0x12 */\r\n  __IO uint8_t SLP_CTRL_ONE_REG;                   /**< offset: 0x13 */\r\n  __IO uint8_t SLP_CTRL_TWO_REG;                   /**< offset: 0x14 */\r\n  __IO uint8_t BG_CTRL_REG;                        /**< offset: 0x15 */\r\n  __IO uint8_t CPREG_CTRL_ONE_REG;                 /**< offset: 0x16 */\r\n  __IO uint8_t CPREG_CTRL_TWO_REG;                 /**< offset: 0x17 */\r\n  __IO uint8_t CPREG_CTRL_THREE_REG;               /**< offset: 0x18 */\r\n  __IO uint8_t PSEN_CTRL_ONE_REG;                  /**< offset: 0x19 */\r\n  __IO uint8_t PSEN_CTRL_TWO_REG;                  /**< offset: 0x1A */\r\n  __IO uint8_t TSEN_CTRL_ONE_REG;                  /**< offset: 0x1B */\r\n  __IO uint8_t TSEN_CTRL_THREE_REG;                /**< offset: 0x1C */\r\n  __IO uint8_t ADC_CTRL_ONE_REG;                   /**< offset: 0x1D */\r\n  __IO uint8_t RCAL_CTRL_ONE_REG;                  /**< offset: 0x1E */\r\n  __IO uint8_t RCAL_CTRL_TWO_REG;                  /**< offset: 0x1F */\r\n  __IO uint8_t XTAL_CTRL_ONE_REG;                  /**< offset: 0x20 */\r\n  __IO uint8_t XTAL_CTRL_TWO_REG;                  /**< offset: 0x21 */\r\n  __IO uint8_t XTAL_CTRL_THREE_REG;                /**< offset: 0x22 */\r\n  __IO uint8_t XTAL_CTRL_FOUR_REG;                 /**< offset: 0x23 */\r\n  __IO uint8_t XTAL_CTRL_FIVE_REG;                 /**< offset: 0x24 */\r\n  __IO uint8_t XTAL_CTRL_SIX_REG;                  /**< offset: 0x25 */\r\n  __IO uint8_t XTAL_CTRL_SEVEN_REG;                /**< offset: 0x26 */\r\n  __IO uint8_t XTAL_CTRL_EIGHT_REG;                /**< offset: 0x27 */\r\n  __IO uint8_t XTAL_CTRL_NINE_REG;                 /**< offset: 0x28 */\r\n  __IO uint8_t XTAL_CTRL_TEN_REG;                  /**< offset: 0x29 */\r\n  __IO uint8_t XTAL_CTRL_ELEVEN_REG;               /**< offset: 0x2A */\r\n  __IO uint8_t XTAL_CTRL_TWELVE_REG;               /**< offset: 0x2B */\r\n  __IO uint8_t XTAL_CTRL_THIRTEEN_REG;             /**< offset: 0x2C */\r\n  __IO uint8_t XTAL_CTRL_FOURTEEN_REG;             /**< offset: 0x2D */\r\n  __IO uint8_t XTAL_CTRL_FIFTEEN_REG;              /**< offset: 0x2E */\r\n  __IO uint8_t T1_CTRL_RSVD_HI_REG;                /**< offset: 0x2F */\r\n  __IO uint8_t T1_CTRL_RSVD_LO_REG;                /**< offset: 0x30 */\r\n  __IO uint8_t GPIO_CTRL_REG;                      /**< offset: 0x31 */\r\n  __IO uint8_t ATEST_CTRL_ONE_REG;                 /**< offset: 0x32 */\r\n  __IO uint8_t ATEST_CTRL_TWO_REG;                 /**< offset: 0x33 */\r\n  __IO uint8_t ATEST_CTRL_THREE_REG;               /**< offset: 0x34 */\r\n  __IO uint8_t ATEST_CTRL_FOUR_REG;                /**< offset: 0x35 */\r\n  __IO uint8_t ATEST_CTRL_FIVE_REG;                /**< offset: 0x36 */\r\n  __IO uint8_t ATEST_CTRL_SIX_REG;                 /**< offset: 0x37 */\r\n  __IO uint8_t ATEST_CTRL_SEVEN_REG;               /**< offset: 0x38 */\r\n  __IO uint8_t RESERVED_LO_ONE_REG;                /**< offset: 0x39 */\r\n  __IO uint8_t RESERVED_LO_TWO_REG;                /**< offset: 0x3A */\r\n  __IO uint8_t RESERVED_HI_ONE_REG;                /**< offset: 0x3B */\r\n  __IO uint8_t RESERVED_HI_TWO_REG;                /**< offset: 0x3C */\r\n} CAU_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- CAU Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup CAU_Register_Masks CAU Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name BYPASS_SOC_PD_CTRL_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_BYPASS_SOC_PD_CTRL_RO_REG_BYPASS_SOC_PD_CTRL_RO_MASK (0xFFU)\r\n#define CAU_BYPASS_SOC_PD_CTRL_RO_REG_BYPASS_SOC_PD_CTRL_RO_SHIFT (0U)\r\n/*! BYPASS_SOC_PD_CTRL_RO - BYPASS_SOC_PD_CTRL_RO */\r\n#define CAU_BYPASS_SOC_PD_CTRL_RO_REG_BYPASS_SOC_PD_CTRL_RO(x) (((uint8_t)(((uint8_t)(x)) << CAU_BYPASS_SOC_PD_CTRL_RO_REG_BYPASS_SOC_PD_CTRL_RO_SHIFT)) & CAU_BYPASS_SOC_PD_CTRL_RO_REG_BYPASS_SOC_PD_CTRL_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name BYPASS_SOC_CTRL_ONE_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_BYPASS_SOC_CTRL_ONE_RO_REG_BYPASS_SOC_CTRL_ONE_RO_MASK (0xFFU)\r\n#define CAU_BYPASS_SOC_CTRL_ONE_RO_REG_BYPASS_SOC_CTRL_ONE_RO_SHIFT (0U)\r\n/*! BYPASS_SOC_CTRL_ONE_RO - BYPASS_SOC_CTRL_ONE_RO */\r\n#define CAU_BYPASS_SOC_CTRL_ONE_RO_REG_BYPASS_SOC_CTRL_ONE_RO(x) (((uint8_t)(((uint8_t)(x)) << CAU_BYPASS_SOC_CTRL_ONE_RO_REG_BYPASS_SOC_CTRL_ONE_RO_SHIFT)) & CAU_BYPASS_SOC_CTRL_ONE_RO_REG_BYPASS_SOC_CTRL_ONE_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name BYPASS_SOC_CTRL_TWO_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_BYPASS_SOC_CTRL_TWO_RO_REG_BYPASS_SOC_CTRL_TWO_RO_MASK (0xFFU)\r\n#define CAU_BYPASS_SOC_CTRL_TWO_RO_REG_BYPASS_SOC_CTRL_TWO_RO_SHIFT (0U)\r\n/*! BYPASS_SOC_CTRL_TWO_RO - BYPASS_SOC_CTRL_TWO_RO */\r\n#define CAU_BYPASS_SOC_CTRL_TWO_RO_REG_BYPASS_SOC_CTRL_TWO_RO(x) (((uint8_t)(((uint8_t)(x)) << CAU_BYPASS_SOC_CTRL_TWO_RO_REG_BYPASS_SOC_CTRL_TWO_RO_SHIFT)) & CAU_BYPASS_SOC_CTRL_TWO_RO_REG_BYPASS_SOC_CTRL_TWO_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name BYPASS_RFU_CTRL_ONE_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_BYPASS_RFU_CTRL_ONE_RO_REG_BYPASS_RFU_CTRL_ONE_RO_MASK (0xFFU)\r\n#define CAU_BYPASS_RFU_CTRL_ONE_RO_REG_BYPASS_RFU_CTRL_ONE_RO_SHIFT (0U)\r\n/*! BYPASS_RFU_CTRL_ONE_RO - BYPASS_RFU_CTRL_ONE_RO */\r\n#define CAU_BYPASS_RFU_CTRL_ONE_RO_REG_BYPASS_RFU_CTRL_ONE_RO(x) (((uint8_t)(((uint8_t)(x)) << CAU_BYPASS_RFU_CTRL_ONE_RO_REG_BYPASS_RFU_CTRL_ONE_RO_SHIFT)) & CAU_BYPASS_RFU_CTRL_ONE_RO_REG_BYPASS_RFU_CTRL_ONE_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name REG_RO_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_REG_RO_ONE_REG_REG_RO_ONE_MASK       (0xFFU)\r\n#define CAU_REG_RO_ONE_REG_REG_RO_ONE_SHIFT      (0U)\r\n/*! REG_RO_ONE - REG_RO_ONE */\r\n#define CAU_REG_RO_ONE_REG_REG_RO_ONE(x)         (((uint8_t)(((uint8_t)(x)) << CAU_REG_RO_ONE_REG_REG_RO_ONE_SHIFT)) & CAU_REG_RO_ONE_REG_REG_RO_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name REG_RO_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_REG_RO_TWO_REG_REG_RO_TWO_MASK       (0xFFU)\r\n#define CAU_REG_RO_TWO_REG_REG_RO_TWO_SHIFT      (0U)\r\n/*! REG_RO_TWO - REG_RO_TWO */\r\n#define CAU_REG_RO_TWO_REG_REG_RO_TWO(x)         (((uint8_t)(((uint8_t)(x)) << CAU_REG_RO_TWO_REG_REG_RO_TWO_SHIFT)) & CAU_REG_RO_TWO_REG_REG_RO_TWO_MASK)\r\n/*! @} */\r\n\r\n/*! @name REG_RO_THREE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_REG_RO_THREE_REG_REG_RO_THREE_MASK   (0xFFU)\r\n#define CAU_REG_RO_THREE_REG_REG_RO_THREE_SHIFT  (0U)\r\n/*! REG_RO_THREE - REG_RO_THREE */\r\n#define CAU_REG_RO_THREE_REG_REG_RO_THREE(x)     (((uint8_t)(((uint8_t)(x)) << CAU_REG_RO_THREE_REG_REG_RO_THREE_SHIFT)) & CAU_REG_RO_THREE_REG_REG_RO_THREE_MASK)\r\n/*! @} */\r\n\r\n/*! @name REG_RO_FOUR_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_REG_RO_FOUR_REG_REG_RO_FOUR_MASK     (0xFFU)\r\n#define CAU_REG_RO_FOUR_REG_REG_RO_FOUR_SHIFT    (0U)\r\n/*! REG_RO_FOUR - REG_RO_FOUR */\r\n#define CAU_REG_RO_FOUR_REG_REG_RO_FOUR(x)       (((uint8_t)(((uint8_t)(x)) << CAU_REG_RO_FOUR_REG_REG_RO_FOUR_SHIFT)) & CAU_REG_RO_FOUR_REG_REG_RO_FOUR_MASK)\r\n/*! @} */\r\n\r\n/*! @name REG_RO_FIVE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_REG_RO_FIVE_REG_REG_RO_FIVE_MASK     (0xFFU)\r\n#define CAU_REG_RO_FIVE_REG_REG_RO_FIVE_SHIFT    (0U)\r\n/*! REG_RO_FIVE - REG_RO_FIVE */\r\n#define CAU_REG_RO_FIVE_REG_REG_RO_FIVE(x)       (((uint8_t)(((uint8_t)(x)) << CAU_REG_RO_FIVE_REG_REG_RO_FIVE_SHIFT)) & CAU_REG_RO_FIVE_REG_REG_RO_FIVE_MASK)\r\n/*! @} */\r\n\r\n/*! @name REG_RO_SIX_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_REG_RO_SIX_REG_REG_RO_SIX_MASK       (0xFFU)\r\n#define CAU_REG_RO_SIX_REG_REG_RO_SIX_SHIFT      (0U)\r\n/*! REG_RO_SIX - REG_RO_SIX */\r\n#define CAU_REG_RO_SIX_REG_REG_RO_SIX(x)         (((uint8_t)(((uint8_t)(x)) << CAU_REG_RO_SIX_REG_REG_RO_SIX_SHIFT)) & CAU_REG_RO_SIX_REG_REG_RO_SIX_MASK)\r\n/*! @} */\r\n\r\n/*! @name SW_RESET_B_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_SW_RESET_B_REG_SW_RESET_B_MASK       (0xFFU)\r\n#define CAU_SW_RESET_B_REG_SW_RESET_B_SHIFT      (0U)\r\n/*! SW_RESET_B - SW_RESET_B */\r\n#define CAU_SW_RESET_B_REG_SW_RESET_B(x)         (((uint8_t)(((uint8_t)(x)) << CAU_SW_RESET_B_REG_SW_RESET_B_SHIFT)) & CAU_SW_RESET_B_REG_SW_RESET_B_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYS_CTRL_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_SYS_CTRL_REG_SYS_CTRL_MASK           (0xFFU)\r\n#define CAU_SYS_CTRL_REG_SYS_CTRL_SHIFT          (0U)\r\n/*! SYS_CTRL - SYS_CTRL */\r\n#define CAU_SYS_CTRL_REG_SYS_CTRL(x)             (((uint8_t)(((uint8_t)(x)) << CAU_SYS_CTRL_REG_SYS_CTRL_SHIFT)) & CAU_SYS_CTRL_REG_SYS_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYS_CTRL_PWR_OPT_SEL_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_SYS_CTRL_PWR_OPT_SEL_REG_SYS_CTRL_PWR_OPT_SEL_MASK (0xFFU)\r\n#define CAU_SYS_CTRL_PWR_OPT_SEL_REG_SYS_CTRL_PWR_OPT_SEL_SHIFT (0U)\r\n/*! SYS_CTRL_PWR_OPT_SEL - SYS_CTRL_PWR_OPT_SEL */\r\n#define CAU_SYS_CTRL_PWR_OPT_SEL_REG_SYS_CTRL_PWR_OPT_SEL(x) (((uint8_t)(((uint8_t)(x)) << CAU_SYS_CTRL_PWR_OPT_SEL_REG_SYS_CTRL_PWR_OPT_SEL_SHIFT)) & CAU_SYS_CTRL_PWR_OPT_SEL_REG_SYS_CTRL_PWR_OPT_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name BYPASS_SOC_PD_CTRL_RW_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_BYPASS_SOC_PD_CTRL_RW_REG_BYPASS_SOC_PD_CTRL_RW_MASK (0xFFU)\r\n#define CAU_BYPASS_SOC_PD_CTRL_RW_REG_BYPASS_SOC_PD_CTRL_RW_SHIFT (0U)\r\n/*! BYPASS_SOC_PD_CTRL_RW - BYPASS_SOC_PD_CTRL_RW */\r\n#define CAU_BYPASS_SOC_PD_CTRL_RW_REG_BYPASS_SOC_PD_CTRL_RW(x) (((uint8_t)(((uint8_t)(x)) << CAU_BYPASS_SOC_PD_CTRL_RW_REG_BYPASS_SOC_PD_CTRL_RW_SHIFT)) & CAU_BYPASS_SOC_PD_CTRL_RW_REG_BYPASS_SOC_PD_CTRL_RW_MASK)\r\n/*! @} */\r\n\r\n/*! @name BYPASS_SOC_CTRL_ONE_RW_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_BYPASS_SOC_CTRL_ONE_RW_REG_BYPASS_SOC_CTRL_ONE_RW_MASK (0xFFU)\r\n#define CAU_BYPASS_SOC_CTRL_ONE_RW_REG_BYPASS_SOC_CTRL_ONE_RW_SHIFT (0U)\r\n/*! BYPASS_SOC_CTRL_ONE_RW - BYPASS_SOC_CTRL_ONE_RW */\r\n#define CAU_BYPASS_SOC_CTRL_ONE_RW_REG_BYPASS_SOC_CTRL_ONE_RW(x) (((uint8_t)(((uint8_t)(x)) << CAU_BYPASS_SOC_CTRL_ONE_RW_REG_BYPASS_SOC_CTRL_ONE_RW_SHIFT)) & CAU_BYPASS_SOC_CTRL_ONE_RW_REG_BYPASS_SOC_CTRL_ONE_RW_MASK)\r\n/*! @} */\r\n\r\n/*! @name BYPASS_SOC_CTRL_TWO_RW_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_BYPASS_SOC_CTRL_TWO_RW_REG_BYPASS_SOC_CTRL_TWO_RW_MASK (0xFFU)\r\n#define CAU_BYPASS_SOC_CTRL_TWO_RW_REG_BYPASS_SOC_CTRL_TWO_RW_SHIFT (0U)\r\n/*! BYPASS_SOC_CTRL_TWO_RW - BYPASS_SOC_CTRL_TWO_RW */\r\n#define CAU_BYPASS_SOC_CTRL_TWO_RW_REG_BYPASS_SOC_CTRL_TWO_RW(x) (((uint8_t)(((uint8_t)(x)) << CAU_BYPASS_SOC_CTRL_TWO_RW_REG_BYPASS_SOC_CTRL_TWO_RW_SHIFT)) & CAU_BYPASS_SOC_CTRL_TWO_RW_REG_BYPASS_SOC_CTRL_TWO_RW_MASK)\r\n/*! @} */\r\n\r\n/*! @name BYPASS_RFU_CTRL_ONE_RW_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_BYPASS_RFU_CTRL_ONE_RW_REG_BYPASS_RFU_CTRL_ONE_RW_MASK (0xFFU)\r\n#define CAU_BYPASS_RFU_CTRL_ONE_RW_REG_BYPASS_RFU_CTRL_ONE_RW_SHIFT (0U)\r\n/*! BYPASS_RFU_CTRL_ONE_RW - BYPASS_RFU_CTRL_ONE_RW */\r\n#define CAU_BYPASS_RFU_CTRL_ONE_RW_REG_BYPASS_RFU_CTRL_ONE_RW(x) (((uint8_t)(((uint8_t)(x)) << CAU_BYPASS_RFU_CTRL_ONE_RW_REG_BYPASS_RFU_CTRL_ONE_RW_SHIFT)) & CAU_BYPASS_RFU_CTRL_ONE_RW_REG_BYPASS_RFU_CTRL_ONE_RW_MASK)\r\n/*! @} */\r\n\r\n/*! @name PD_CTRL_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_PD_CTRL_ONE_REG_PD_CTRL_ONE_MASK     (0xFFU)\r\n#define CAU_PD_CTRL_ONE_REG_PD_CTRL_ONE_SHIFT    (0U)\r\n/*! PD_CTRL_ONE - PD_CTRL_ONE */\r\n#define CAU_PD_CTRL_ONE_REG_PD_CTRL_ONE(x)       (((uint8_t)(((uint8_t)(x)) << CAU_PD_CTRL_ONE_REG_PD_CTRL_ONE_SHIFT)) & CAU_PD_CTRL_ONE_REG_PD_CTRL_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name PD_CTRL_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_PD_CTRL_TWO_REG_PD_CTRL_TWO_MASK     (0xFFU)\r\n#define CAU_PD_CTRL_TWO_REG_PD_CTRL_TWO_SHIFT    (0U)\r\n/*! PD_CTRL_TWO - PD_CTRL_TWO */\r\n#define CAU_PD_CTRL_TWO_REG_PD_CTRL_TWO(x)       (((uint8_t)(((uint8_t)(x)) << CAU_PD_CTRL_TWO_REG_PD_CTRL_TWO_SHIFT)) & CAU_PD_CTRL_TWO_REG_PD_CTRL_TWO_MASK)\r\n/*! @} */\r\n\r\n/*! @name SLP_CTRL_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_SLP_CTRL_ONE_REG_SLP_CTRL_ONE_MASK   (0xFFU)\r\n#define CAU_SLP_CTRL_ONE_REG_SLP_CTRL_ONE_SHIFT  (0U)\r\n/*! SLP_CTRL_ONE - SLP_CTRL_ONE */\r\n#define CAU_SLP_CTRL_ONE_REG_SLP_CTRL_ONE(x)     (((uint8_t)(((uint8_t)(x)) << CAU_SLP_CTRL_ONE_REG_SLP_CTRL_ONE_SHIFT)) & CAU_SLP_CTRL_ONE_REG_SLP_CTRL_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name SLP_CTRL_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_SLP_CTRL_TWO_REG_SLP_CTRL_TWO_MASK   (0xFFU)\r\n#define CAU_SLP_CTRL_TWO_REG_SLP_CTRL_TWO_SHIFT  (0U)\r\n/*! SLP_CTRL_TWO - SLP_CTRL_TWO */\r\n#define CAU_SLP_CTRL_TWO_REG_SLP_CTRL_TWO(x)     (((uint8_t)(((uint8_t)(x)) << CAU_SLP_CTRL_TWO_REG_SLP_CTRL_TWO_SHIFT)) & CAU_SLP_CTRL_TWO_REG_SLP_CTRL_TWO_MASK)\r\n/*! @} */\r\n\r\n/*! @name BG_CTRL_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_BG_CTRL_REG_BG_CTRL_MASK             (0xFFU)\r\n#define CAU_BG_CTRL_REG_BG_CTRL_SHIFT            (0U)\r\n/*! BG_CTRL - BG_CTRL */\r\n#define CAU_BG_CTRL_REG_BG_CTRL(x)               (((uint8_t)(((uint8_t)(x)) << CAU_BG_CTRL_REG_BG_CTRL_SHIFT)) & CAU_BG_CTRL_REG_BG_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPREG_CTRL_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_CPREG_CTRL_ONE_REG_CPREG_CTRL_ONE_MASK (0xFFU)\r\n#define CAU_CPREG_CTRL_ONE_REG_CPREG_CTRL_ONE_SHIFT (0U)\r\n/*! CPREG_CTRL_ONE - CPREG_CTRL_ONE */\r\n#define CAU_CPREG_CTRL_ONE_REG_CPREG_CTRL_ONE(x) (((uint8_t)(((uint8_t)(x)) << CAU_CPREG_CTRL_ONE_REG_CPREG_CTRL_ONE_SHIFT)) & CAU_CPREG_CTRL_ONE_REG_CPREG_CTRL_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPREG_CTRL_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_CPREG_CTRL_TWO_REG_CPREG_CTRL_TWO_MASK (0xFFU)\r\n#define CAU_CPREG_CTRL_TWO_REG_CPREG_CTRL_TWO_SHIFT (0U)\r\n/*! CPREG_CTRL_TWO - CPREG_CTRL_TWO */\r\n#define CAU_CPREG_CTRL_TWO_REG_CPREG_CTRL_TWO(x) (((uint8_t)(((uint8_t)(x)) << CAU_CPREG_CTRL_TWO_REG_CPREG_CTRL_TWO_SHIFT)) & CAU_CPREG_CTRL_TWO_REG_CPREG_CTRL_TWO_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPREG_CTRL_THREE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_CPREG_CTRL_THREE_REG_CPREG_CTRL_THREE_MASK (0xFFU)\r\n#define CAU_CPREG_CTRL_THREE_REG_CPREG_CTRL_THREE_SHIFT (0U)\r\n/*! CPREG_CTRL_THREE - CPREG_CTRL_THREE */\r\n#define CAU_CPREG_CTRL_THREE_REG_CPREG_CTRL_THREE(x) (((uint8_t)(((uint8_t)(x)) << CAU_CPREG_CTRL_THREE_REG_CPREG_CTRL_THREE_SHIFT)) & CAU_CPREG_CTRL_THREE_REG_CPREG_CTRL_THREE_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSEN_CTRL_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_PSEN_CTRL_ONE_REG_PSEN_CTRL_ONE_MASK (0xFFU)\r\n#define CAU_PSEN_CTRL_ONE_REG_PSEN_CTRL_ONE_SHIFT (0U)\r\n/*! PSEN_CTRL_ONE - PSEN_CTRL_ONE */\r\n#define CAU_PSEN_CTRL_ONE_REG_PSEN_CTRL_ONE(x)   (((uint8_t)(((uint8_t)(x)) << CAU_PSEN_CTRL_ONE_REG_PSEN_CTRL_ONE_SHIFT)) & CAU_PSEN_CTRL_ONE_REG_PSEN_CTRL_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSEN_CTRL_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_PSEN_CTRL_TWO_REG_PSEN_CTRL_TWO_MASK (0xFFU)\r\n#define CAU_PSEN_CTRL_TWO_REG_PSEN_CTRL_TWO_SHIFT (0U)\r\n/*! PSEN_CTRL_TWO - PSEN_CTRL_TWO */\r\n#define CAU_PSEN_CTRL_TWO_REG_PSEN_CTRL_TWO(x)   (((uint8_t)(((uint8_t)(x)) << CAU_PSEN_CTRL_TWO_REG_PSEN_CTRL_TWO_SHIFT)) & CAU_PSEN_CTRL_TWO_REG_PSEN_CTRL_TWO_MASK)\r\n/*! @} */\r\n\r\n/*! @name TSEN_CTRL_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_TSEN_CTRL_ONE_REG_TSEN_CTRL_ONE_MASK (0xFFU)\r\n#define CAU_TSEN_CTRL_ONE_REG_TSEN_CTRL_ONE_SHIFT (0U)\r\n/*! TSEN_CTRL_ONE - TSEN_CTRL_ONE */\r\n#define CAU_TSEN_CTRL_ONE_REG_TSEN_CTRL_ONE(x)   (((uint8_t)(((uint8_t)(x)) << CAU_TSEN_CTRL_ONE_REG_TSEN_CTRL_ONE_SHIFT)) & CAU_TSEN_CTRL_ONE_REG_TSEN_CTRL_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name TSEN_CTRL_THREE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_TSEN_CTRL_THREE_REG_TSEN_CTRL_TWO_MASK (0xFFU)\r\n#define CAU_TSEN_CTRL_THREE_REG_TSEN_CTRL_TWO_SHIFT (0U)\r\n/*! TSEN_CTRL_TWO - TSEN_CTRL_TWO */\r\n#define CAU_TSEN_CTRL_THREE_REG_TSEN_CTRL_TWO(x) (((uint8_t)(((uint8_t)(x)) << CAU_TSEN_CTRL_THREE_REG_TSEN_CTRL_TWO_SHIFT)) & CAU_TSEN_CTRL_THREE_REG_TSEN_CTRL_TWO_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_CTRL_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_ADC_CTRL_ONE_REG_ADC_CTRL_MASK       (0xFFU)\r\n#define CAU_ADC_CTRL_ONE_REG_ADC_CTRL_SHIFT      (0U)\r\n/*! ADC_CTRL - ADC_CTRL */\r\n#define CAU_ADC_CTRL_ONE_REG_ADC_CTRL(x)         (((uint8_t)(((uint8_t)(x)) << CAU_ADC_CTRL_ONE_REG_ADC_CTRL_SHIFT)) & CAU_ADC_CTRL_ONE_REG_ADC_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name RCAL_CTRL_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_RCAL_CTRL_ONE_REG_RCAL_CTRL_ONE_MASK (0xFFU)\r\n#define CAU_RCAL_CTRL_ONE_REG_RCAL_CTRL_ONE_SHIFT (0U)\r\n/*! RCAL_CTRL_ONE - RCAL_CTRL_ONE */\r\n#define CAU_RCAL_CTRL_ONE_REG_RCAL_CTRL_ONE(x)   (((uint8_t)(((uint8_t)(x)) << CAU_RCAL_CTRL_ONE_REG_RCAL_CTRL_ONE_SHIFT)) & CAU_RCAL_CTRL_ONE_REG_RCAL_CTRL_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name RCAL_CTRL_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_RCAL_CTRL_TWO_REG_RCAL_CTRL_TWO_MASK (0xFFU)\r\n#define CAU_RCAL_CTRL_TWO_REG_RCAL_CTRL_TWO_SHIFT (0U)\r\n/*! RCAL_CTRL_TWO - RCAL_CTRL_TWO */\r\n#define CAU_RCAL_CTRL_TWO_REG_RCAL_CTRL_TWO(x)   (((uint8_t)(((uint8_t)(x)) << CAU_RCAL_CTRL_TWO_REG_RCAL_CTRL_TWO_SHIFT)) & CAU_RCAL_CTRL_TWO_REG_RCAL_CTRL_TWO_MASK)\r\n/*! @} */\r\n\r\n/*! @name XTAL_CTRL_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_XTAL_CTRL_ONE_REG_XTAL_CTRL_ONE_MASK (0xFFU)\r\n#define CAU_XTAL_CTRL_ONE_REG_XTAL_CTRL_ONE_SHIFT (0U)\r\n/*! XTAL_CTRL_ONE - XTAL_CTRL_ONE */\r\n#define CAU_XTAL_CTRL_ONE_REG_XTAL_CTRL_ONE(x)   (((uint8_t)(((uint8_t)(x)) << CAU_XTAL_CTRL_ONE_REG_XTAL_CTRL_ONE_SHIFT)) & CAU_XTAL_CTRL_ONE_REG_XTAL_CTRL_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name XTAL_CTRL_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_XTAL_CTRL_TWO_REG_XTAL_CTRL_TWO_MASK (0xFFU)\r\n#define CAU_XTAL_CTRL_TWO_REG_XTAL_CTRL_TWO_SHIFT (0U)\r\n/*! XTAL_CTRL_TWO - XTAL_CTRL_TWO */\r\n#define CAU_XTAL_CTRL_TWO_REG_XTAL_CTRL_TWO(x)   (((uint8_t)(((uint8_t)(x)) << CAU_XTAL_CTRL_TWO_REG_XTAL_CTRL_TWO_SHIFT)) & CAU_XTAL_CTRL_TWO_REG_XTAL_CTRL_TWO_MASK)\r\n/*! @} */\r\n\r\n/*! @name XTAL_CTRL_THREE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_XTAL_CTRL_THREE_REG_XTAL_CTRL_THREE_MASK (0xFFU)\r\n#define CAU_XTAL_CTRL_THREE_REG_XTAL_CTRL_THREE_SHIFT (0U)\r\n/*! XTAL_CTRL_THREE - XTAL_CTRL_THREE */\r\n#define CAU_XTAL_CTRL_THREE_REG_XTAL_CTRL_THREE(x) (((uint8_t)(((uint8_t)(x)) << CAU_XTAL_CTRL_THREE_REG_XTAL_CTRL_THREE_SHIFT)) & CAU_XTAL_CTRL_THREE_REG_XTAL_CTRL_THREE_MASK)\r\n/*! @} */\r\n\r\n/*! @name XTAL_CTRL_FOUR_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_XTAL_CTRL_FOUR_REG_XTAL_CTRL_FOUR_MASK (0xFFU)\r\n#define CAU_XTAL_CTRL_FOUR_REG_XTAL_CTRL_FOUR_SHIFT (0U)\r\n/*! XTAL_CTRL_FOUR - XTAL_CTRL_FOUR */\r\n#define CAU_XTAL_CTRL_FOUR_REG_XTAL_CTRL_FOUR(x) (((uint8_t)(((uint8_t)(x)) << CAU_XTAL_CTRL_FOUR_REG_XTAL_CTRL_FOUR_SHIFT)) & CAU_XTAL_CTRL_FOUR_REG_XTAL_CTRL_FOUR_MASK)\r\n/*! @} */\r\n\r\n/*! @name XTAL_CTRL_FIVE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_XTAL_CTRL_FIVE_REG_XTAL_CTRL_FIVE_MASK (0xFFU)\r\n#define CAU_XTAL_CTRL_FIVE_REG_XTAL_CTRL_FIVE_SHIFT (0U)\r\n/*! XTAL_CTRL_FIVE - XTAL_CTRL_FIVE */\r\n#define CAU_XTAL_CTRL_FIVE_REG_XTAL_CTRL_FIVE(x) (((uint8_t)(((uint8_t)(x)) << CAU_XTAL_CTRL_FIVE_REG_XTAL_CTRL_FIVE_SHIFT)) & CAU_XTAL_CTRL_FIVE_REG_XTAL_CTRL_FIVE_MASK)\r\n/*! @} */\r\n\r\n/*! @name XTAL_CTRL_SIX_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_XTAL_CTRL_SIX_REG_XTAL_CTRL_SIX_MASK (0xFFU)\r\n#define CAU_XTAL_CTRL_SIX_REG_XTAL_CTRL_SIX_SHIFT (0U)\r\n/*! XTAL_CTRL_SIX - XTAL_CTRL_SIX */\r\n#define CAU_XTAL_CTRL_SIX_REG_XTAL_CTRL_SIX(x)   (((uint8_t)(((uint8_t)(x)) << CAU_XTAL_CTRL_SIX_REG_XTAL_CTRL_SIX_SHIFT)) & CAU_XTAL_CTRL_SIX_REG_XTAL_CTRL_SIX_MASK)\r\n/*! @} */\r\n\r\n/*! @name XTAL_CTRL_SEVEN_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_XTAL_CTRL_SEVEN_REG_XTAL_CTRL_SEVEN_MASK (0xFFU)\r\n#define CAU_XTAL_CTRL_SEVEN_REG_XTAL_CTRL_SEVEN_SHIFT (0U)\r\n/*! XTAL_CTRL_SEVEN - XTAL_CTRL_SEVEN */\r\n#define CAU_XTAL_CTRL_SEVEN_REG_XTAL_CTRL_SEVEN(x) (((uint8_t)(((uint8_t)(x)) << CAU_XTAL_CTRL_SEVEN_REG_XTAL_CTRL_SEVEN_SHIFT)) & CAU_XTAL_CTRL_SEVEN_REG_XTAL_CTRL_SEVEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name XTAL_CTRL_EIGHT_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_XTAL_CTRL_EIGHT_REG_XTAL_CTRL_EIGHT_MASK (0xFFU)\r\n#define CAU_XTAL_CTRL_EIGHT_REG_XTAL_CTRL_EIGHT_SHIFT (0U)\r\n/*! XTAL_CTRL_EIGHT - XTAL_CTRL_EIGHT */\r\n#define CAU_XTAL_CTRL_EIGHT_REG_XTAL_CTRL_EIGHT(x) (((uint8_t)(((uint8_t)(x)) << CAU_XTAL_CTRL_EIGHT_REG_XTAL_CTRL_EIGHT_SHIFT)) & CAU_XTAL_CTRL_EIGHT_REG_XTAL_CTRL_EIGHT_MASK)\r\n/*! @} */\r\n\r\n/*! @name XTAL_CTRL_NINE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_XTAL_CTRL_NINE_REG_XTAL_CTRL_NINE_MASK (0xFFU)\r\n#define CAU_XTAL_CTRL_NINE_REG_XTAL_CTRL_NINE_SHIFT (0U)\r\n/*! XTAL_CTRL_NINE - XTAL_CTRL_NINE */\r\n#define CAU_XTAL_CTRL_NINE_REG_XTAL_CTRL_NINE(x) (((uint8_t)(((uint8_t)(x)) << CAU_XTAL_CTRL_NINE_REG_XTAL_CTRL_NINE_SHIFT)) & CAU_XTAL_CTRL_NINE_REG_XTAL_CTRL_NINE_MASK)\r\n/*! @} */\r\n\r\n/*! @name XTAL_CTRL_TEN_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_XTAL_CTRL_TEN_REG_XTAL_CTRL_TEN_MASK (0xFFU)\r\n#define CAU_XTAL_CTRL_TEN_REG_XTAL_CTRL_TEN_SHIFT (0U)\r\n/*! XTAL_CTRL_TEN - XTAL_CTRL_TEN */\r\n#define CAU_XTAL_CTRL_TEN_REG_XTAL_CTRL_TEN(x)   (((uint8_t)(((uint8_t)(x)) << CAU_XTAL_CTRL_TEN_REG_XTAL_CTRL_TEN_SHIFT)) & CAU_XTAL_CTRL_TEN_REG_XTAL_CTRL_TEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name XTAL_CTRL_ELEVEN_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_XTAL_CTRL_ELEVEN_REG_XTAL_CTRL_ELEVEN_MASK (0xFFU)\r\n#define CAU_XTAL_CTRL_ELEVEN_REG_XTAL_CTRL_ELEVEN_SHIFT (0U)\r\n/*! XTAL_CTRL_ELEVEN - XTAL_CTRL_ELEVEN */\r\n#define CAU_XTAL_CTRL_ELEVEN_REG_XTAL_CTRL_ELEVEN(x) (((uint8_t)(((uint8_t)(x)) << CAU_XTAL_CTRL_ELEVEN_REG_XTAL_CTRL_ELEVEN_SHIFT)) & CAU_XTAL_CTRL_ELEVEN_REG_XTAL_CTRL_ELEVEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name XTAL_CTRL_TWELVE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_XTAL_CTRL_TWELVE_REG_XTAL_CTRL_TWELVE_MASK (0xFFU)\r\n#define CAU_XTAL_CTRL_TWELVE_REG_XTAL_CTRL_TWELVE_SHIFT (0U)\r\n/*! XTAL_CTRL_TWELVE - XTAL_CTRL_TWELVE */\r\n#define CAU_XTAL_CTRL_TWELVE_REG_XTAL_CTRL_TWELVE(x) (((uint8_t)(((uint8_t)(x)) << CAU_XTAL_CTRL_TWELVE_REG_XTAL_CTRL_TWELVE_SHIFT)) & CAU_XTAL_CTRL_TWELVE_REG_XTAL_CTRL_TWELVE_MASK)\r\n/*! @} */\r\n\r\n/*! @name XTAL_CTRL_THIRTEEN_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_XTAL_CTRL_THIRTEEN_REG_XTAL_CTRL_THIRTEEN_MASK (0xFFU)\r\n#define CAU_XTAL_CTRL_THIRTEEN_REG_XTAL_CTRL_THIRTEEN_SHIFT (0U)\r\n/*! XTAL_CTRL_THIRTEEN - XTAL_CTRL_THIRTEEN */\r\n#define CAU_XTAL_CTRL_THIRTEEN_REG_XTAL_CTRL_THIRTEEN(x) (((uint8_t)(((uint8_t)(x)) << CAU_XTAL_CTRL_THIRTEEN_REG_XTAL_CTRL_THIRTEEN_SHIFT)) & CAU_XTAL_CTRL_THIRTEEN_REG_XTAL_CTRL_THIRTEEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name XTAL_CTRL_FOURTEEN_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_XTAL_CTRL_FOURTEEN_REG_XTAL_CTRL_FOURTEEN_MASK (0xFFU)\r\n#define CAU_XTAL_CTRL_FOURTEEN_REG_XTAL_CTRL_FOURTEEN_SHIFT (0U)\r\n/*! XTAL_CTRL_FOURTEEN - XTAL_CTRL_FOURTEEN */\r\n#define CAU_XTAL_CTRL_FOURTEEN_REG_XTAL_CTRL_FOURTEEN(x) (((uint8_t)(((uint8_t)(x)) << CAU_XTAL_CTRL_FOURTEEN_REG_XTAL_CTRL_FOURTEEN_SHIFT)) & CAU_XTAL_CTRL_FOURTEEN_REG_XTAL_CTRL_FOURTEEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name XTAL_CTRL_FIFTEEN_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_XTAL_CTRL_FIFTEEN_REG_XTAL_CTRL_FIFTEEN_MASK (0xFFU)\r\n#define CAU_XTAL_CTRL_FIFTEEN_REG_XTAL_CTRL_FIFTEEN_SHIFT (0U)\r\n/*! XTAL_CTRL_FIFTEEN - XTAL_CTRL_FIFTEEN */\r\n#define CAU_XTAL_CTRL_FIFTEEN_REG_XTAL_CTRL_FIFTEEN(x) (((uint8_t)(((uint8_t)(x)) << CAU_XTAL_CTRL_FIFTEEN_REG_XTAL_CTRL_FIFTEEN_SHIFT)) & CAU_XTAL_CTRL_FIFTEEN_REG_XTAL_CTRL_FIFTEEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name T1_CTRL_RSVD_HI_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_T1_CTRL_RSVD_HI_REG_XTAL_CTRL_RSVD_HI_MASK (0xFFU)\r\n#define CAU_T1_CTRL_RSVD_HI_REG_XTAL_CTRL_RSVD_HI_SHIFT (0U)\r\n/*! XTAL_CTRL_RSVD_HI - XTAL_CTRL_RSVD_HI */\r\n#define CAU_T1_CTRL_RSVD_HI_REG_XTAL_CTRL_RSVD_HI(x) (((uint8_t)(((uint8_t)(x)) << CAU_T1_CTRL_RSVD_HI_REG_XTAL_CTRL_RSVD_HI_SHIFT)) & CAU_T1_CTRL_RSVD_HI_REG_XTAL_CTRL_RSVD_HI_MASK)\r\n/*! @} */\r\n\r\n/*! @name T1_CTRL_RSVD_LO_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_T1_CTRL_RSVD_LO_REG_XTAL_CTRL_RSVD_LO_MASK (0xFFU)\r\n#define CAU_T1_CTRL_RSVD_LO_REG_XTAL_CTRL_RSVD_LO_SHIFT (0U)\r\n/*! XTAL_CTRL_RSVD_LO - XTAL_CTRL_RSVD_LO */\r\n#define CAU_T1_CTRL_RSVD_LO_REG_XTAL_CTRL_RSVD_LO(x) (((uint8_t)(((uint8_t)(x)) << CAU_T1_CTRL_RSVD_LO_REG_XTAL_CTRL_RSVD_LO_SHIFT)) & CAU_T1_CTRL_RSVD_LO_REG_XTAL_CTRL_RSVD_LO_MASK)\r\n/*! @} */\r\n\r\n/*! @name GPIO_CTRL_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_GPIO_CTRL_REG_GPIO_CTRL_MASK         (0xFFU)\r\n#define CAU_GPIO_CTRL_REG_GPIO_CTRL_SHIFT        (0U)\r\n/*! GPIO_CTRL - GPIO_CTRL */\r\n#define CAU_GPIO_CTRL_REG_GPIO_CTRL(x)           (((uint8_t)(((uint8_t)(x)) << CAU_GPIO_CTRL_REG_GPIO_CTRL_SHIFT)) & CAU_GPIO_CTRL_REG_GPIO_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name ATEST_CTRL_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_ATEST_CTRL_ONE_REG_ATEST_CTRL_ONE_MASK (0xFFU)\r\n#define CAU_ATEST_CTRL_ONE_REG_ATEST_CTRL_ONE_SHIFT (0U)\r\n/*! ATEST_CTRL_ONE - ATEST_CTRL_ONE */\r\n#define CAU_ATEST_CTRL_ONE_REG_ATEST_CTRL_ONE(x) (((uint8_t)(((uint8_t)(x)) << CAU_ATEST_CTRL_ONE_REG_ATEST_CTRL_ONE_SHIFT)) & CAU_ATEST_CTRL_ONE_REG_ATEST_CTRL_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name ATEST_CTRL_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_ATEST_CTRL_TWO_REG_ATEST_CTRL_TWO_MASK (0xFFU)\r\n#define CAU_ATEST_CTRL_TWO_REG_ATEST_CTRL_TWO_SHIFT (0U)\r\n/*! ATEST_CTRL_TWO - ATEST_CTRL_TWO */\r\n#define CAU_ATEST_CTRL_TWO_REG_ATEST_CTRL_TWO(x) (((uint8_t)(((uint8_t)(x)) << CAU_ATEST_CTRL_TWO_REG_ATEST_CTRL_TWO_SHIFT)) & CAU_ATEST_CTRL_TWO_REG_ATEST_CTRL_TWO_MASK)\r\n/*! @} */\r\n\r\n/*! @name ATEST_CTRL_THREE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_ATEST_CTRL_THREE_REG_ATEST_CTRL_THREE_MASK (0xFFU)\r\n#define CAU_ATEST_CTRL_THREE_REG_ATEST_CTRL_THREE_SHIFT (0U)\r\n/*! ATEST_CTRL_THREE - ATEST_CTRL_THREE */\r\n#define CAU_ATEST_CTRL_THREE_REG_ATEST_CTRL_THREE(x) (((uint8_t)(((uint8_t)(x)) << CAU_ATEST_CTRL_THREE_REG_ATEST_CTRL_THREE_SHIFT)) & CAU_ATEST_CTRL_THREE_REG_ATEST_CTRL_THREE_MASK)\r\n/*! @} */\r\n\r\n/*! @name ATEST_CTRL_FOUR_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_ATEST_CTRL_FOUR_REG_ATEST_CTRL_FOUR_MASK (0xFFU)\r\n#define CAU_ATEST_CTRL_FOUR_REG_ATEST_CTRL_FOUR_SHIFT (0U)\r\n/*! ATEST_CTRL_FOUR - ATEST_CTRL_FOUR */\r\n#define CAU_ATEST_CTRL_FOUR_REG_ATEST_CTRL_FOUR(x) (((uint8_t)(((uint8_t)(x)) << CAU_ATEST_CTRL_FOUR_REG_ATEST_CTRL_FOUR_SHIFT)) & CAU_ATEST_CTRL_FOUR_REG_ATEST_CTRL_FOUR_MASK)\r\n/*! @} */\r\n\r\n/*! @name ATEST_CTRL_FIVE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_ATEST_CTRL_FIVE_REG_ATEST_CTRL_FIVE_MASK (0xFFU)\r\n#define CAU_ATEST_CTRL_FIVE_REG_ATEST_CTRL_FIVE_SHIFT (0U)\r\n/*! ATEST_CTRL_FIVE - ATEST_CTRL_FIVE */\r\n#define CAU_ATEST_CTRL_FIVE_REG_ATEST_CTRL_FIVE(x) (((uint8_t)(((uint8_t)(x)) << CAU_ATEST_CTRL_FIVE_REG_ATEST_CTRL_FIVE_SHIFT)) & CAU_ATEST_CTRL_FIVE_REG_ATEST_CTRL_FIVE_MASK)\r\n/*! @} */\r\n\r\n/*! @name ATEST_CTRL_SIX_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_ATEST_CTRL_SIX_REG_ATEST_CTRL_SIX_MASK (0xFFU)\r\n#define CAU_ATEST_CTRL_SIX_REG_ATEST_CTRL_SIX_SHIFT (0U)\r\n/*! ATEST_CTRL_SIX - ATEST_CTRL_SIX */\r\n#define CAU_ATEST_CTRL_SIX_REG_ATEST_CTRL_SIX(x) (((uint8_t)(((uint8_t)(x)) << CAU_ATEST_CTRL_SIX_REG_ATEST_CTRL_SIX_SHIFT)) & CAU_ATEST_CTRL_SIX_REG_ATEST_CTRL_SIX_MASK)\r\n/*! @} */\r\n\r\n/*! @name ATEST_CTRL_SEVEN_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_ATEST_CTRL_SEVEN_REG_ATEST_CTRL_SEVEN_MASK (0xFFU)\r\n#define CAU_ATEST_CTRL_SEVEN_REG_ATEST_CTRL_SEVEN_SHIFT (0U)\r\n/*! ATEST_CTRL_SEVEN - ATEST_CTRL_SEVEN */\r\n#define CAU_ATEST_CTRL_SEVEN_REG_ATEST_CTRL_SEVEN(x) (((uint8_t)(((uint8_t)(x)) << CAU_ATEST_CTRL_SEVEN_REG_ATEST_CTRL_SEVEN_SHIFT)) & CAU_ATEST_CTRL_SEVEN_REG_ATEST_CTRL_SEVEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVED_LO_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_RESERVED_LO_ONE_REG_RESERVED_LO_ONE_MASK (0xFFU)\r\n#define CAU_RESERVED_LO_ONE_REG_RESERVED_LO_ONE_SHIFT (0U)\r\n/*! RESERVED_LO_ONE - RESERVED_LO_ONE */\r\n#define CAU_RESERVED_LO_ONE_REG_RESERVED_LO_ONE(x) (((uint8_t)(((uint8_t)(x)) << CAU_RESERVED_LO_ONE_REG_RESERVED_LO_ONE_SHIFT)) & CAU_RESERVED_LO_ONE_REG_RESERVED_LO_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVED_LO_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_RESERVED_LO_TWO_REG_RESERVED_LO_TWO_MASK (0xFFU)\r\n#define CAU_RESERVED_LO_TWO_REG_RESERVED_LO_TWO_SHIFT (0U)\r\n/*! RESERVED_LO_TWO - RESERVED_LO_TWO */\r\n#define CAU_RESERVED_LO_TWO_REG_RESERVED_LO_TWO(x) (((uint8_t)(((uint8_t)(x)) << CAU_RESERVED_LO_TWO_REG_RESERVED_LO_TWO_SHIFT)) & CAU_RESERVED_LO_TWO_REG_RESERVED_LO_TWO_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVED_HI_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_RESERVED_HI_ONE_REG_RESERVED_HI_ONE_MASK (0xFFU)\r\n#define CAU_RESERVED_HI_ONE_REG_RESERVED_HI_ONE_SHIFT (0U)\r\n/*! RESERVED_HI_ONE - RESERVED_HI_ONE */\r\n#define CAU_RESERVED_HI_ONE_REG_RESERVED_HI_ONE(x) (((uint8_t)(((uint8_t)(x)) << CAU_RESERVED_HI_ONE_REG_RESERVED_HI_ONE_SHIFT)) & CAU_RESERVED_HI_ONE_REG_RESERVED_HI_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVED_HI_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define CAU_RESERVED_HI_TWO_REG_RESERVED_HI_TWO_MASK (0xFFU)\r\n#define CAU_RESERVED_HI_TWO_REG_RESERVED_HI_TWO_SHIFT (0U)\r\n/*! RESERVED_HI_TWO - RESERVED_HI_TWO */\r\n#define CAU_RESERVED_HI_TWO_REG_RESERVED_HI_TWO(x) (((uint8_t)(((uint8_t)(x)) << CAU_RESERVED_HI_TWO_REG_RESERVED_HI_TWO_SHIFT)) & CAU_RESERVED_HI_TWO_REG_RESERVED_HI_TWO_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group CAU_Register_Masks */\r\n\r\n\r\n/* CAU - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral CAU base address */\r\n  #define CAU_BASE                                 (0x55002000u)\r\n  /** Peripheral CAU base address */\r\n  #define CAU_BASE_NS                              (0x45002000u)\r\n  /** Peripheral CAU base pointer */\r\n  #define CAU                                      ((CAU_Type *)CAU_BASE)\r\n  /** Peripheral CAU base pointer */\r\n  #define CAU_NS                                   ((CAU_Type *)CAU_BASE_NS)\r\n  /** Array initializer of CAU peripheral base addresses */\r\n  #define CAU_BASE_ADDRS                           { CAU_BASE }\r\n  /** Array initializer of CAU peripheral base pointers */\r\n  #define CAU_BASE_PTRS                            { CAU }\r\n  /** Array initializer of CAU peripheral base addresses */\r\n  #define CAU_BASE_ADDRS_NS                        { CAU_BASE_NS }\r\n  /** Array initializer of CAU peripheral base pointers */\r\n  #define CAU_BASE_PTRS_NS                         { CAU_NS }\r\n#else\r\n  /** Peripheral CAU base address */\r\n  #define CAU_BASE                                 (0x45002000u)\r\n  /** Peripheral CAU base pointer */\r\n  #define CAU                                      ((CAU_Type *)CAU_BASE)\r\n  /** Array initializer of CAU peripheral base addresses */\r\n  #define CAU_BASE_ADDRS                           { CAU_BASE }\r\n  /** Array initializer of CAU peripheral base pointers */\r\n  #define CAU_BASE_PTRS                            { CAU }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group CAU_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- CDOG Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup CDOG_Peripheral_Access_Layer CDOG Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** CDOG - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t CONTROL;                           /**< Control, offset: 0x0 */\r\n  __IO uint32_t RELOAD;                            /**< Instruction Timer reload, offset: 0x4 */\r\n  __IO uint32_t INSTRUCTION_TIMER;                 /**< Instruction Timer, offset: 0x8 */\r\n  __IO uint32_t SECURE_COUNTER;                    /**< Secure Counter, offset: 0xC */\r\n  __I  uint32_t STATUS;                            /**< Status 1, offset: 0x10 */\r\n  __I  uint32_t STATUS2;                           /**< Status 2, offset: 0x14 */\r\n  __IO uint32_t FLAGS;                             /**< Flags, offset: 0x18 */\r\n  __IO uint32_t PERSISTENT;                        /**< Persistent Data Storage, offset: 0x1C */\r\n  __O  uint32_t START;                             /**< START Command, offset: 0x20 */\r\n  __O  uint32_t STOP;                              /**< STOP Command, offset: 0x24 */\r\n  __O  uint32_t RESTART;                           /**< RESTART Command, offset: 0x28 */\r\n  __O  uint32_t ADD;                               /**< ADD Command, offset: 0x2C */\r\n  __O  uint32_t ADD1;                              /**< ADD1 Command, offset: 0x30 */\r\n  __O  uint32_t ADD16;                             /**< ADD16 Command, offset: 0x34 */\r\n  __O  uint32_t ADD256;                            /**< ADD256 Command, offset: 0x38 */\r\n  __O  uint32_t SUB;                               /**< SUB Command, offset: 0x3C */\r\n  __O  uint32_t SUB1;                              /**< SUB1 Command, offset: 0x40 */\r\n  __O  uint32_t SUB16;                             /**< SUB16 Command, offset: 0x44 */\r\n  __O  uint32_t SUB256;                            /**< SUB256 Command, offset: 0x48 */\r\n} CDOG_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- CDOG Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup CDOG_Register_Masks CDOG Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name CONTROL - Control */\r\n/*! @{ */\r\n\r\n#define CDOG_CONTROL_LOCK_CTRL_MASK              (0x3U)\r\n#define CDOG_CONTROL_LOCK_CTRL_SHIFT             (0U)\r\n/*! LOCK_CTRL - Lock control\r\n *  0b01..Locked\r\n *  0b10..Unlocked\r\n */\r\n#define CDOG_CONTROL_LOCK_CTRL(x)                (((uint32_t)(((uint32_t)(x)) << CDOG_CONTROL_LOCK_CTRL_SHIFT)) & CDOG_CONTROL_LOCK_CTRL_MASK)\r\n\r\n#define CDOG_CONTROL_TIMEOUT_CTRL_MASK           (0x1CU)\r\n#define CDOG_CONTROL_TIMEOUT_CTRL_SHIFT          (2U)\r\n/*! TIMEOUT_CTRL - TIMEOUT fault control\r\n *  0b100..Disable both reset and interrupt\r\n *  0b001..Enable reset\r\n *  0b010..Enable interrupt\r\n */\r\n#define CDOG_CONTROL_TIMEOUT_CTRL(x)             (((uint32_t)(((uint32_t)(x)) << CDOG_CONTROL_TIMEOUT_CTRL_SHIFT)) & CDOG_CONTROL_TIMEOUT_CTRL_MASK)\r\n\r\n#define CDOG_CONTROL_MISCOMPARE_CTRL_MASK        (0xE0U)\r\n#define CDOG_CONTROL_MISCOMPARE_CTRL_SHIFT       (5U)\r\n/*! MISCOMPARE_CTRL - MISCOMPARE fault control\r\n *  0b100..Disable both reset and interrupt\r\n *  0b001..Enable reset\r\n *  0b010..Enable interrupt\r\n */\r\n#define CDOG_CONTROL_MISCOMPARE_CTRL(x)          (((uint32_t)(((uint32_t)(x)) << CDOG_CONTROL_MISCOMPARE_CTRL_SHIFT)) & CDOG_CONTROL_MISCOMPARE_CTRL_MASK)\r\n\r\n#define CDOG_CONTROL_SEQUENCE_CTRL_MASK          (0x700U)\r\n#define CDOG_CONTROL_SEQUENCE_CTRL_SHIFT         (8U)\r\n/*! SEQUENCE_CTRL - SEQUENCE fault control\r\n *  0b001..Enable reset\r\n *  0b010..Enable interrupt\r\n *  0b100..Disable both reset and interrupt\r\n */\r\n#define CDOG_CONTROL_SEQUENCE_CTRL(x)            (((uint32_t)(((uint32_t)(x)) << CDOG_CONTROL_SEQUENCE_CTRL_SHIFT)) & CDOG_CONTROL_SEQUENCE_CTRL_MASK)\r\n\r\n#define CDOG_CONTROL_CONTROL_CTRL_MASK           (0x3800U)\r\n#define CDOG_CONTROL_CONTROL_CTRL_SHIFT          (11U)\r\n/*! CONTROL_CTRL - CONTROL fault control\r\n *  0b001..Enable reset\r\n *  0b100..Disable reset\r\n */\r\n#define CDOG_CONTROL_CONTROL_CTRL(x)             (((uint32_t)(((uint32_t)(x)) << CDOG_CONTROL_CONTROL_CTRL_SHIFT)) & CDOG_CONTROL_CONTROL_CTRL_MASK)\r\n\r\n#define CDOG_CONTROL_STATE_CTRL_MASK             (0x1C000U)\r\n#define CDOG_CONTROL_STATE_CTRL_SHIFT            (14U)\r\n/*! STATE_CTRL - STATE fault control\r\n *  0b001..Enable reset\r\n *  0b010..Enable interrupt\r\n *  0b100..Disable both reset and interrupt\r\n */\r\n#define CDOG_CONTROL_STATE_CTRL(x)               (((uint32_t)(((uint32_t)(x)) << CDOG_CONTROL_STATE_CTRL_SHIFT)) & CDOG_CONTROL_STATE_CTRL_MASK)\r\n\r\n#define CDOG_CONTROL_ADDRESS_CTRL_MASK           (0xE0000U)\r\n#define CDOG_CONTROL_ADDRESS_CTRL_SHIFT          (17U)\r\n/*! ADDRESS_CTRL - ADDRESS fault control\r\n *  0b001..Enable reset\r\n *  0b010..Enable interrupt\r\n *  0b100..Disable both reset and interrupt\r\n */\r\n#define CDOG_CONTROL_ADDRESS_CTRL(x)             (((uint32_t)(((uint32_t)(x)) << CDOG_CONTROL_ADDRESS_CTRL_SHIFT)) & CDOG_CONTROL_ADDRESS_CTRL_MASK)\r\n\r\n#define CDOG_CONTROL_IRQ_PAUSE_MASK              (0x30000000U)\r\n#define CDOG_CONTROL_IRQ_PAUSE_SHIFT             (28U)\r\n/*! IRQ_PAUSE - IRQ pause control\r\n *  0b01..Keep the timer running\r\n *  0b10..Stop the timer\r\n */\r\n#define CDOG_CONTROL_IRQ_PAUSE(x)                (((uint32_t)(((uint32_t)(x)) << CDOG_CONTROL_IRQ_PAUSE_SHIFT)) & CDOG_CONTROL_IRQ_PAUSE_MASK)\r\n\r\n#define CDOG_CONTROL_DEBUG_HALT_CTRL_MASK        (0xC0000000U)\r\n#define CDOG_CONTROL_DEBUG_HALT_CTRL_SHIFT       (30U)\r\n/*! DEBUG_HALT_CTRL - DEBUG_HALT control\r\n *  0b01..Keep the timer running\r\n *  0b10..Stop the timer\r\n */\r\n#define CDOG_CONTROL_DEBUG_HALT_CTRL(x)          (((uint32_t)(((uint32_t)(x)) << CDOG_CONTROL_DEBUG_HALT_CTRL_SHIFT)) & CDOG_CONTROL_DEBUG_HALT_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name RELOAD - Instruction Timer reload */\r\n/*! @{ */\r\n\r\n#define CDOG_RELOAD_RLOAD_MASK                   (0xFFFFFFFFU)\r\n#define CDOG_RELOAD_RLOAD_SHIFT                  (0U)\r\n/*! RLOAD - Instruction Timer reload value */\r\n#define CDOG_RELOAD_RLOAD(x)                     (((uint32_t)(((uint32_t)(x)) << CDOG_RELOAD_RLOAD_SHIFT)) & CDOG_RELOAD_RLOAD_MASK)\r\n/*! @} */\r\n\r\n/*! @name INSTRUCTION_TIMER - Instruction Timer */\r\n/*! @{ */\r\n\r\n#define CDOG_INSTRUCTION_TIMER_INSTIM_MASK       (0xFFFFFFFFU)\r\n#define CDOG_INSTRUCTION_TIMER_INSTIM_SHIFT      (0U)\r\n/*! INSTIM - Current value of the Instruction Timer */\r\n#define CDOG_INSTRUCTION_TIMER_INSTIM(x)         (((uint32_t)(((uint32_t)(x)) << CDOG_INSTRUCTION_TIMER_INSTIM_SHIFT)) & CDOG_INSTRUCTION_TIMER_INSTIM_MASK)\r\n/*! @} */\r\n\r\n/*! @name SECURE_COUNTER - Secure Counter */\r\n/*! @{ */\r\n\r\n#define CDOG_SECURE_COUNTER_SECCNT_MASK          (0xFFFFFFFFU)\r\n#define CDOG_SECURE_COUNTER_SECCNT_SHIFT         (0U)\r\n/*! SECCNT - Secure Counter */\r\n#define CDOG_SECURE_COUNTER_SECCNT(x)            (((uint32_t)(((uint32_t)(x)) << CDOG_SECURE_COUNTER_SECCNT_SHIFT)) & CDOG_SECURE_COUNTER_SECCNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name STATUS - Status 1 */\r\n/*! @{ */\r\n\r\n#define CDOG_STATUS_NUMTOF_MASK                  (0xFFU)\r\n#define CDOG_STATUS_NUMTOF_SHIFT                 (0U)\r\n/*! NUMTOF - Number of TIMEOUT faults since the last POR */\r\n#define CDOG_STATUS_NUMTOF(x)                    (((uint32_t)(((uint32_t)(x)) << CDOG_STATUS_NUMTOF_SHIFT)) & CDOG_STATUS_NUMTOF_MASK)\r\n\r\n#define CDOG_STATUS_NUMMISCOMPF_MASK             (0xFF00U)\r\n#define CDOG_STATUS_NUMMISCOMPF_SHIFT            (8U)\r\n/*! NUMMISCOMPF - Number of MISCOMPARE faults since the last POR */\r\n#define CDOG_STATUS_NUMMISCOMPF(x)               (((uint32_t)(((uint32_t)(x)) << CDOG_STATUS_NUMMISCOMPF_SHIFT)) & CDOG_STATUS_NUMMISCOMPF_MASK)\r\n\r\n#define CDOG_STATUS_NUMILSEQF_MASK               (0xFF0000U)\r\n#define CDOG_STATUS_NUMILSEQF_SHIFT              (16U)\r\n/*! NUMILSEQF - Number of SEQUENCE faults since the last POR */\r\n#define CDOG_STATUS_NUMILSEQF(x)                 (((uint32_t)(((uint32_t)(x)) << CDOG_STATUS_NUMILSEQF_SHIFT)) & CDOG_STATUS_NUMILSEQF_MASK)\r\n\r\n#define CDOG_STATUS_CURST_MASK                   (0xF0000000U)\r\n#define CDOG_STATUS_CURST_SHIFT                  (28U)\r\n/*! CURST - Current State */\r\n#define CDOG_STATUS_CURST(x)                     (((uint32_t)(((uint32_t)(x)) << CDOG_STATUS_CURST_SHIFT)) & CDOG_STATUS_CURST_MASK)\r\n/*! @} */\r\n\r\n/*! @name STATUS2 - Status 2 */\r\n/*! @{ */\r\n\r\n#define CDOG_STATUS2_NUMCNTF_MASK                (0xFFU)\r\n#define CDOG_STATUS2_NUMCNTF_SHIFT               (0U)\r\n/*! NUMCNTF - Number of CONTROL faults since the last POR */\r\n#define CDOG_STATUS2_NUMCNTF(x)                  (((uint32_t)(((uint32_t)(x)) << CDOG_STATUS2_NUMCNTF_SHIFT)) & CDOG_STATUS2_NUMCNTF_MASK)\r\n\r\n#define CDOG_STATUS2_NUMILLSTF_MASK              (0xFF00U)\r\n#define CDOG_STATUS2_NUMILLSTF_SHIFT             (8U)\r\n/*! NUMILLSTF - Number of STATE faults since the last POR */\r\n#define CDOG_STATUS2_NUMILLSTF(x)                (((uint32_t)(((uint32_t)(x)) << CDOG_STATUS2_NUMILLSTF_SHIFT)) & CDOG_STATUS2_NUMILLSTF_MASK)\r\n\r\n#define CDOG_STATUS2_NUMILLA_MASK                (0xFF0000U)\r\n#define CDOG_STATUS2_NUMILLA_SHIFT               (16U)\r\n/*! NUMILLA - Number of ADDRESS faults since the last POR */\r\n#define CDOG_STATUS2_NUMILLA(x)                  (((uint32_t)(((uint32_t)(x)) << CDOG_STATUS2_NUMILLA_SHIFT)) & CDOG_STATUS2_NUMILLA_MASK)\r\n/*! @} */\r\n\r\n/*! @name FLAGS - Flags */\r\n/*! @{ */\r\n\r\n#define CDOG_FLAGS_TO_FLAG_MASK                  (0x1U)\r\n#define CDOG_FLAGS_TO_FLAG_SHIFT                 (0U)\r\n/*! TO_FLAG - TIMEOUT fault flag\r\n *  0b0..A TIMEOUT fault has not occurred\r\n *  0b1..A TIMEOUT fault has occurred\r\n */\r\n#define CDOG_FLAGS_TO_FLAG(x)                    (((uint32_t)(((uint32_t)(x)) << CDOG_FLAGS_TO_FLAG_SHIFT)) & CDOG_FLAGS_TO_FLAG_MASK)\r\n\r\n#define CDOG_FLAGS_MISCOM_FLAG_MASK              (0x2U)\r\n#define CDOG_FLAGS_MISCOM_FLAG_SHIFT             (1U)\r\n/*! MISCOM_FLAG - MISCOMPARE fault flag\r\n *  0b0..A MISCOMPARE fault has not occurred\r\n *  0b1..A MISCOMPARE fault has occurred\r\n */\r\n#define CDOG_FLAGS_MISCOM_FLAG(x)                (((uint32_t)(((uint32_t)(x)) << CDOG_FLAGS_MISCOM_FLAG_SHIFT)) & CDOG_FLAGS_MISCOM_FLAG_MASK)\r\n\r\n#define CDOG_FLAGS_SEQ_FLAG_MASK                 (0x4U)\r\n#define CDOG_FLAGS_SEQ_FLAG_SHIFT                (2U)\r\n/*! SEQ_FLAG - SEQUENCE fault flag\r\n *  0b0..A SEQUENCE fault has not occurred\r\n *  0b1..A SEQUENCE fault has occurred\r\n */\r\n#define CDOG_FLAGS_SEQ_FLAG(x)                   (((uint32_t)(((uint32_t)(x)) << CDOG_FLAGS_SEQ_FLAG_SHIFT)) & CDOG_FLAGS_SEQ_FLAG_MASK)\r\n\r\n#define CDOG_FLAGS_CNT_FLAG_MASK                 (0x8U)\r\n#define CDOG_FLAGS_CNT_FLAG_SHIFT                (3U)\r\n/*! CNT_FLAG - CONTROL fault flag\r\n *  0b0..A CONTROL fault has not occurred\r\n *  0b1..A CONTROL fault has occurred\r\n */\r\n#define CDOG_FLAGS_CNT_FLAG(x)                   (((uint32_t)(((uint32_t)(x)) << CDOG_FLAGS_CNT_FLAG_SHIFT)) & CDOG_FLAGS_CNT_FLAG_MASK)\r\n\r\n#define CDOG_FLAGS_STATE_FLAG_MASK               (0x10U)\r\n#define CDOG_FLAGS_STATE_FLAG_SHIFT              (4U)\r\n/*! STATE_FLAG - STATE fault flag\r\n *  0b0..A STATE fault has not occurred\r\n *  0b1..A STATE fault has occurred\r\n */\r\n#define CDOG_FLAGS_STATE_FLAG(x)                 (((uint32_t)(((uint32_t)(x)) << CDOG_FLAGS_STATE_FLAG_SHIFT)) & CDOG_FLAGS_STATE_FLAG_MASK)\r\n\r\n#define CDOG_FLAGS_ADDR_FLAG_MASK                (0x20U)\r\n#define CDOG_FLAGS_ADDR_FLAG_SHIFT               (5U)\r\n/*! ADDR_FLAG - ADDRESS fault flag\r\n *  0b0..An ADDRESS fault has not occurred\r\n *  0b1..An ADDRESS fault has occurred\r\n */\r\n#define CDOG_FLAGS_ADDR_FLAG(x)                  (((uint32_t)(((uint32_t)(x)) << CDOG_FLAGS_ADDR_FLAG_SHIFT)) & CDOG_FLAGS_ADDR_FLAG_MASK)\r\n\r\n#define CDOG_FLAGS_POR_FLAG_MASK                 (0x10000U)\r\n#define CDOG_FLAGS_POR_FLAG_SHIFT                (16U)\r\n/*! POR_FLAG - Power-on reset flag\r\n *  0b0..A Power-on reset event has not occurred\r\n *  0b1..A Power-on reset event has occurred\r\n */\r\n#define CDOG_FLAGS_POR_FLAG(x)                   (((uint32_t)(((uint32_t)(x)) << CDOG_FLAGS_POR_FLAG_SHIFT)) & CDOG_FLAGS_POR_FLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name PERSISTENT - Persistent Data Storage */\r\n/*! @{ */\r\n\r\n#define CDOG_PERSISTENT_PERSIS_MASK              (0xFFFFFFFFU)\r\n#define CDOG_PERSISTENT_PERSIS_SHIFT             (0U)\r\n/*! PERSIS - Persistent Storage */\r\n#define CDOG_PERSISTENT_PERSIS(x)                (((uint32_t)(((uint32_t)(x)) << CDOG_PERSISTENT_PERSIS_SHIFT)) & CDOG_PERSISTENT_PERSIS_MASK)\r\n/*! @} */\r\n\r\n/*! @name START - START Command */\r\n/*! @{ */\r\n\r\n#define CDOG_START_STRT_MASK                     (0xFFFFFFFFU)\r\n#define CDOG_START_STRT_SHIFT                    (0U)\r\n/*! STRT - Start command */\r\n#define CDOG_START_STRT(x)                       (((uint32_t)(((uint32_t)(x)) << CDOG_START_STRT_SHIFT)) & CDOG_START_STRT_MASK)\r\n/*! @} */\r\n\r\n/*! @name STOP - STOP Command */\r\n/*! @{ */\r\n\r\n#define CDOG_STOP_STP_MASK                       (0xFFFFFFFFU)\r\n#define CDOG_STOP_STP_SHIFT                      (0U)\r\n/*! STP - Stop command */\r\n#define CDOG_STOP_STP(x)                         (((uint32_t)(((uint32_t)(x)) << CDOG_STOP_STP_SHIFT)) & CDOG_STOP_STP_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESTART - RESTART Command */\r\n/*! @{ */\r\n\r\n#define CDOG_RESTART_RSTRT_MASK                  (0xFFFFFFFFU)\r\n#define CDOG_RESTART_RSTRT_SHIFT                 (0U)\r\n/*! RSTRT - Restart command */\r\n#define CDOG_RESTART_RSTRT(x)                    (((uint32_t)(((uint32_t)(x)) << CDOG_RESTART_RSTRT_SHIFT)) & CDOG_RESTART_RSTRT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADD - ADD Command */\r\n/*! @{ */\r\n\r\n#define CDOG_ADD_AD_MASK                         (0xFFFFFFFFU)\r\n#define CDOG_ADD_AD_SHIFT                        (0U)\r\n/*! AD - ADD Write Value */\r\n#define CDOG_ADD_AD(x)                           (((uint32_t)(((uint32_t)(x)) << CDOG_ADD_AD_SHIFT)) & CDOG_ADD_AD_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADD1 - ADD1 Command */\r\n/*! @{ */\r\n\r\n#define CDOG_ADD1_AD1_MASK                       (0xFFFFFFFFU)\r\n#define CDOG_ADD1_AD1_SHIFT                      (0U)\r\n/*! AD1 - ADD 1 */\r\n#define CDOG_ADD1_AD1(x)                         (((uint32_t)(((uint32_t)(x)) << CDOG_ADD1_AD1_SHIFT)) & CDOG_ADD1_AD1_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADD16 - ADD16 Command */\r\n/*! @{ */\r\n\r\n#define CDOG_ADD16_AD16_MASK                     (0xFFFFFFFFU)\r\n#define CDOG_ADD16_AD16_SHIFT                    (0U)\r\n/*! AD16 - ADD 16 */\r\n#define CDOG_ADD16_AD16(x)                       (((uint32_t)(((uint32_t)(x)) << CDOG_ADD16_AD16_SHIFT)) & CDOG_ADD16_AD16_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADD256 - ADD256 Command */\r\n/*! @{ */\r\n\r\n#define CDOG_ADD256_AD256_MASK                   (0xFFFFFFFFU)\r\n#define CDOG_ADD256_AD256_SHIFT                  (0U)\r\n/*! AD256 - ADD 256 */\r\n#define CDOG_ADD256_AD256(x)                     (((uint32_t)(((uint32_t)(x)) << CDOG_ADD256_AD256_SHIFT)) & CDOG_ADD256_AD256_MASK)\r\n/*! @} */\r\n\r\n/*! @name SUB - SUB Command */\r\n/*! @{ */\r\n\r\n#define CDOG_SUB_S0B_MASK                        (0xFFFFFFFFU)\r\n#define CDOG_SUB_S0B_SHIFT                       (0U)\r\n/*! S0B - Subtract Write Value */\r\n#define CDOG_SUB_S0B(x)                          (((uint32_t)(((uint32_t)(x)) << CDOG_SUB_S0B_SHIFT)) & CDOG_SUB_S0B_MASK)\r\n/*! @} */\r\n\r\n/*! @name SUB1 - SUB1 Command */\r\n/*! @{ */\r\n\r\n#define CDOG_SUB1_S1B_MASK                       (0xFFFFFFFFU)\r\n#define CDOG_SUB1_S1B_SHIFT                      (0U)\r\n/*! S1B - Subtract 1 */\r\n#define CDOG_SUB1_S1B(x)                         (((uint32_t)(((uint32_t)(x)) << CDOG_SUB1_S1B_SHIFT)) & CDOG_SUB1_S1B_MASK)\r\n/*! @} */\r\n\r\n/*! @name SUB16 - SUB16 Command */\r\n/*! @{ */\r\n\r\n#define CDOG_SUB16_SB16_MASK                     (0xFFFFFFFFU)\r\n#define CDOG_SUB16_SB16_SHIFT                    (0U)\r\n/*! SB16 - Subtract 16 */\r\n#define CDOG_SUB16_SB16(x)                       (((uint32_t)(((uint32_t)(x)) << CDOG_SUB16_SB16_SHIFT)) & CDOG_SUB16_SB16_MASK)\r\n/*! @} */\r\n\r\n/*! @name SUB256 - SUB256 Command */\r\n/*! @{ */\r\n\r\n#define CDOG_SUB256_SB256_MASK                   (0xFFFFFFFFU)\r\n#define CDOG_SUB256_SB256_SHIFT                  (0U)\r\n/*! SB256 - Subtract 256 */\r\n#define CDOG_SUB256_SB256(x)                     (((uint32_t)(((uint32_t)(x)) << CDOG_SUB256_SB256_SHIFT)) & CDOG_SUB256_SB256_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group CDOG_Register_Masks */\r\n\r\n\r\n/* CDOG - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral CDOG base address */\r\n  #define CDOG_BASE                                (0x5014C000u)\r\n  /** Peripheral CDOG base address */\r\n  #define CDOG_BASE_NS                             (0x4014C000u)\r\n  /** Peripheral CDOG base pointer */\r\n  #define CDOG                                     ((CDOG_Type *)CDOG_BASE)\r\n  /** Peripheral CDOG base pointer */\r\n  #define CDOG_NS                                  ((CDOG_Type *)CDOG_BASE_NS)\r\n  /** Array initializer of CDOG peripheral base addresses */\r\n  #define CDOG_BASE_ADDRS                          { CDOG_BASE }\r\n  /** Array initializer of CDOG peripheral base pointers */\r\n  #define CDOG_BASE_PTRS                           { CDOG }\r\n  /** Array initializer of CDOG peripheral base addresses */\r\n  #define CDOG_BASE_ADDRS_NS                       { CDOG_BASE_NS }\r\n  /** Array initializer of CDOG peripheral base pointers */\r\n  #define CDOG_BASE_PTRS_NS                        { CDOG_NS }\r\n#else\r\n  /** Peripheral CDOG base address */\r\n  #define CDOG_BASE                                (0x4014C000u)\r\n  /** Peripheral CDOG base pointer */\r\n  #define CDOG                                     ((CDOG_Type *)CDOG_BASE)\r\n  /** Array initializer of CDOG peripheral base addresses */\r\n  #define CDOG_BASE_ADDRS                          { CDOG_BASE }\r\n  /** Array initializer of CDOG peripheral base pointers */\r\n  #define CDOG_BASE_PTRS                           { CDOG }\r\n#endif\r\n/** Interrupt vectors for the CDOG peripheral type */\r\n#define CDOG_IRQS                                { CDOG_INT_IRQn }\r\n\r\n/*!\r\n * @}\r\n */ /* end of group CDOG_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- CIU1 Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup CIU1_Peripheral_Access_Layer CIU1 Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** CIU1 - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[132];\r\n  __I  uint32_t CIU_CHIP_REV;                      /**< CIU Revision, offset: 0x84 */\r\n       uint8_t RESERVED_1[116];\r\n  __IO uint32_t CIU_CHIP_ECO_CTRL;                 /**< Chip ECO Control, offset: 0xFC */\r\n  __IO uint32_t CIU_CLK_ENABLE;                    /**< Clock Enable, offset: 0x100 */\r\n  __IO uint32_t CIU_CLK_ENABLE2;                   /**< Clock enable2, offset: 0x104 */\r\n  __IO uint32_t CIU_CLK_ENABLE3;                   /**< Clock Enable 3, offset: 0x108 */\r\n       uint8_t RESERVED_2[8];\r\n  __IO uint32_t CIU_CLK_CPU1CLK_CTRL;              /**< CPU1_AHB1 Clock Control, offset: 0x114 */\r\n  __IO uint32_t CIU_CLK_SYSCLK_CTRL;               /**< SYS Clock Control, offset: 0x118 */\r\n       uint8_t RESERVED_3[16];\r\n  __IO uint32_t CIU_CLK_RTU_NCO_CTRL;              /**< RTU NCO Clock Control, offset: 0x12C */\r\n  __IO uint32_t CIU_CLK_LBU1_WLRTU_CTRL;           /**< LBU1 WLRTU1 Clock Control, offset: 0x130 */\r\n  __IO uint32_t CIU_CLK_SOCCLK_CTRL;               /**< SOC Clock Control, offset: 0x134 */\r\n  __IO uint32_t CIU_CLK_SLEEPCLK_CTRL;             /**< Sleep Clock Control, offset: 0x138 */\r\n  __IO uint32_t CIU_CLK_CP15_DIS1;                 /**< Clock Auto Shut-off Enable1, offset: 0x13C */\r\n  __IO uint32_t CIU_CLK_CP15_DIS2;                 /**< Clock Auto Shut-off Enable2, offset: 0x140 */\r\n  __IO uint32_t CIU_CLK_CP15_DIS3;                 /**< Clock Auto Shut-off Enable3, offset: 0x144 */\r\n       uint8_t RESERVED_4[4];\r\n  __IO uint32_t CIU_CLK_ENABLE6;                   /**< Clock Enable 6, offset: 0x14C */\r\n  __IO uint32_t CIU_CLK_SLEEPCLK_CTRL2;            /**< Sleep Clock Control 2, offset: 0x150 */\r\n       uint8_t RESERVED_5[36];\r\n  __IO uint32_t CIU_MAC_CLK_CTRL;                  /**< MAC clock CTRL, offset: 0x178 */\r\n  __IO uint32_t CIU_CLK_ECO_CTRL;                  /**< Clock ECO Control, offset: 0x17C */\r\n  __IO uint32_t CIU_RST_SW1;                       /**< Software Module Reset, offset: 0x180 */\r\n  __IO uint32_t CIU_RST_SW2;                       /**< Software Module Reset, offset: 0x184 */\r\n       uint8_t RESERVED_6[4];\r\n  __IO uint32_t CIU_RST_SW4;                       /**< Software Module Reset, offset: 0x18C */\r\n  __IO uint32_t CIU_RST_SW5;                       /**< Software Module Reset, offset: 0x190 */\r\n       uint8_t RESERVED_7[104];\r\n  __IO uint32_t CIU_RST_ECO_CTRL;                  /**< Reset ECO Control, offset: 0x1FC */\r\n       uint8_t RESERVED_8[4];\r\n  __IO uint32_t CIU_MEM_WRTC2;                     /**< Memory WRTC Control2, offset: 0x204 */\r\n  __IO uint32_t CIU_MEM_WRTC3;                     /**< Memory WRTC Control 3, offset: 0x208 */\r\n       uint8_t RESERVED_9[16];\r\n  __IO uint32_t CIU_MEM_CTRL;                      /**< Memory Control, offset: 0x21C */\r\n  __I  uint32_t CIU_SMU1_DBG_STAT0;                /**< SMU1 debug register0, offset: 0x220 */\r\n  __I  uint32_t CIU_SMU1_DBG_STAT1;                /**< SMU1 debug register1, offset: 0x224 */\r\n  __I  uint32_t CIU_SMU1_DBG_STAT2;                /**< SMU1 debug register2, offset: 0x228 */\r\n       uint8_t RESERVED_10[80];\r\n  __IO uint32_t CIU_MEM_ECO_CTRL;                  /**< Memory ECO Control, offset: 0x27C */\r\n  __IO uint32_t CIU1_INT_MASK;                     /**< CIU1 Interrupt Mask, offset: 0x280 */\r\n  __IO uint32_t CIU1_INT_SELECT;                   /**< CIU1 Interrupt Select, offset: 0x284 */\r\n  __IO uint32_t CIU1_INT_EVENT_MASK;               /**< CIU1 Interrupt Event Mask, offset: 0x288 */\r\n  __I  uint32_t CIU1_INT_STATUS;                   /**< CIU1 Interrupt Status, offset: 0x28C */\r\n  __IO uint32_t CIU_INT_HOST_CTRL;                 /**< Host Interrupt Control, offset: 0x290 */\r\n  __IO uint32_t CIU_BCA1_INT_MASK;                 /**< BCA1 to CPU1 Interrupt Mask, offset: 0x294 */\r\n  __IO uint32_t CIU_BCA1_INT_SELECT;               /**< BCA1 to CPU1 Interrupt Select, offset: 0x298 */\r\n  __IO uint32_t CIU_BCA1_INT_EVENT_MASK;           /**< BCA1 to CPU1 Interrupt Event Mask, offset: 0x29C */\r\n  __I  uint32_t CIU_BCA1_INT_STATUS;               /**< BCA1 to CPU1 Interrupt Status, offset: 0x2A0 */\r\n       uint8_t RESERVED_11[16];\r\n  __IO uint32_t CPU1_ERR_INT_MASK;                 /**< CPU1 ERR Interrupt Mask, offset: 0x2B4 */\r\n  __IO uint32_t CPU1_ERR_INT_SELECT;               /**< CPU1 ERR Interrupt Clear Select, offset: 0x2B8 */\r\n  __IO uint32_t CPU1_ERR_INT_EVENT_MASK;           /**< CPU1 ERR Interrupt Event Mask, offset: 0x2BC */\r\n  __I  uint32_t CPU1_ERR_INT_STATUS;               /**< CPU1 ERR Interrupt Status, offset: 0x2C0 */\r\n       uint8_t RESERVED_12[32];\r\n  __IO uint32_t CPU2_INT_CTRL;                     /**< CPU2 INT control, offset: 0x2E4 */\r\n       uint8_t RESERVED_13[16];\r\n  __IO uint32_t CPU3_INT_CTRL;                     /**< CPU3 INT control, offset: 0x2F8 */\r\n  __IO uint32_t CIU_INT_ECO_CTRL;                  /**< Interrupt ECO Control, offset: 0x2FC */\r\n  __IO uint32_t CIU_PTP_CTRL;                      /**< Vsensor and Vreg Pad Control, offset: 0x300 */\r\n       uint8_t RESERVED_14[156];\r\n  __IO uint32_t CIU_RFU_DBC_MUX_SEL;               /**< RFU related DBC mux selection for different mode, offset: 0x3A0 */\r\n  __IO uint32_t CIU_BCA_DBC_MUX_SEL;               /**< BCA related DBC mux selection for different mode, offset: 0x3A4 */\r\n       uint8_t RESERVED_15[88];\r\n  __I  uint32_t CIU_TST_G2BIST_STATUS;             /**< WL G2BIST Status, offset: 0x400 */\r\n  __I  uint32_t CIU_TST_MBIST_READY;               /**< MBIST Status (BIST_READY), offset: 0x404 */\r\n  __I  uint32_t CIU_TST_MBIST_FAIL;                /**< MBIST Status (BIST_FAIL), offset: 0x408 */\r\n       uint8_t RESERVED_16[28];\r\n  __IO uint32_t CIU_TST_TSTBUS_CTRL2;              /**< Testbux Mux Control2, offset: 0x428 */\r\n       uint8_t RESERVED_17[4];\r\n  __IO uint32_t CIU_TST_CTRL;                      /**< Test Control, offset: 0x430 */\r\n       uint8_t RESERVED_18[72];\r\n  __IO uint32_t CIU_TST_ECO_CTRL;                  /**< Test ECO Control, offset: 0x47C */\r\n       uint8_t RESERVED_19[128];\r\n  __IO uint32_t CIU_GPS_GPIO_MASK;                 /**< GPS GPIO MASK, offset: 0x500 */\r\n  __IO uint32_t CIU_GPS_SW_PERIOD;                 /**< GPS SWITCH CHANNEL PERIOD, offset: 0x504 */\r\n  __IO uint32_t CIU_GPS_SW_EARLY;                  /**< GPS SWITCH CHANNEL EARLY, offset: 0x508 */\r\n  __I  uint32_t CIU_GPS_TMR_RD;                    /**< GPS TIMER READ, offset: 0x50C */\r\n       uint8_t RESERVED_20[1132];\r\n  __IO uint32_t CIU_LDO_ECO_CTRL;                  /**< LDO ECO Control, offset: 0x97C */\r\n       uint8_t RESERVED_21[24];\r\n  __IO uint32_t CIU_AXI_CLK_CTRL2;                 /**< AXI clk bypass contrl2, offset: 0x998 */\r\n  __IO uint32_t CIU_FABRIC_TESTBUS_CTRL;           /**< fabric(scm, wlm) testbus select, offset: 0x99C */\r\n  __IO uint32_t CIU_FABRIC_CREQ_DLY_TIMER;         /**< fabric(scm, wlm) delay timer for c_req, offset: 0x9A0 */\r\n       uint8_t RESERVED_22[88];\r\n  __IO uint32_t CIU_ABU_ECO_CTRL;                  /**< ABU ECO Control, offset: 0x9FC */\r\n  __IO uint32_t CIU1_AHB1_TO_CLEAR;                /**< AHB1 timeout logic clear register, offset: 0xA00 */\r\n  __I  uint32_t CIU_ARB_TO_LAST_ADDR;              /**< AHB Timeout Last Address, offset: 0xA04 */\r\n  __I  uint32_t CIU_ARB_TO_CUR_ADDR;               /**< AHB Current Timeout Address, offset: 0xA08 */\r\n  __IO uint32_t CIU_ARB_CTRL;                      /**< AHB ARB Control, offset: 0xA0C */\r\n       uint8_t RESERVED_23[68];\r\n  __IO uint32_t CIU1_CPU1_ICODE_INV_ADDR_CTRL;     /**< CPU1 Icode invalid address access control, offset: 0xA54 */\r\n  __I  uint32_t CIU1_CPU1_ICODE_INV_ADDR;          /**< CPU1 Icode invalid address, offset: 0xA58 */\r\n  __IO uint32_t CIU1_CPU1_DCODE_INV_ADDR_CTRL;     /**< CPU1 Dcode invalid address access control, offset: 0xA5C */\r\n  __I  uint32_t CIU1_CPU1_DCODE_INV_ADDR;          /**< CPU1 Dcode invalid address, offset: 0xA60 */\r\n  __IO uint32_t CIU1_AHB2AHB_BRIDGE_CTRL;          /**< AHB2AHB Bridge Control Register, offset: 0xA64 */\r\n  __IO uint32_t WL_RAACS_CTRL;                     /**< RAACS control registers, offset: 0xA68 */\r\n  __IO uint32_t WL_RAACS_PERFORMANCE_STATISTICS;   /**< RAACS performance statistics counter., offset: 0xA6C */\r\n  __IO uint32_t CIU_AHB1_TSTBUS_SEL;               /**< AHB1 Control Signals testbus select, offset: 0xA70 */\r\n       uint8_t RESERVED_24[8];\r\n  __IO uint32_t CIU_ARB_ECO_CTRL;                  /**< ARB ECO Control, offset: 0xA7C */\r\n       uint8_t RESERVED_25[8];\r\n  __IO uint32_t CIU_CPU_DYN_CLK_CTRL;              /**< Dynamic CPU Clock Control, offset: 0xA88 */\r\n       uint8_t RESERVED_26[12];\r\n  __I  uint32_t CIU_CPU_DYN_CPUCLK_MONITOR;        /**< Dynamic ahb clock Monitor, offset: 0xA98 */\r\n  __I  uint32_t CIU_CPU_DYN_SYSCLK_MONITOR;        /**< Dynamic sysclk Monitor, offset: 0xA9C */\r\n       uint8_t RESERVED_27[16];\r\n  __IO uint32_t CIU_CPU_CPU1_CTRL;                 /**< CPU1 control register, offset: 0xAB0 */\r\n       uint8_t RESERVED_28[12];\r\n  __IO uint32_t CIU_CPU_CPU1_ACCESS_CTRL;          /**< CPU1 access control register, offset: 0xAC0 */\r\n  __IO uint32_t CIU_CPU_CPU2_ACCESS_CTRL;          /**< CPU2 access control register, offset: 0xAC4 */\r\n  __IO uint32_t CIU_CPU_CPU3_ACCESS_CTRL;          /**< CPU3 access control register, offset: 0xAC8 */\r\n  __I  uint32_t CIU_CPU_CPU1_DBG_STAT1;            /**< CPU1 debug register1, offset: 0xACC */\r\n       uint8_t RESERVED_29[8];\r\n  __IO uint32_t CIU_CPU1_CPU2_FW_DWLD_CTRL;        /**< CPUs FW dwld control register, offset: 0xAD8 */\r\n  __IO uint32_t CIU_CPU_COMM0;                     /**< CPU Communication reserved0, offset: 0xADC */\r\n  __IO uint32_t CIU_CPU_COMM1;                     /**< CPU Communication reserved1, offset: 0xAE0 */\r\n       uint8_t RESERVED_30[88];\r\n  __IO uint32_t CIU_CPU_ECO_CTRL;                  /**< CPU ECO control, offset: 0xB3C */\r\n       uint8_t RESERVED_31[32];\r\n  __IO uint32_t CIU_RFU_CTRL;                      /**< RFU Control and Status, offset: 0xB60 */\r\n  __IO uint32_t CIU_RFU_EXTRA_PORT;                /**< RFU Extra Port Connection, offset: 0xB64 */\r\n       uint8_t RESERVED_32[20];\r\n  __IO uint32_t CIU_RFU_ECO_CTRL;                  /**< RFU ECO Control, offset: 0xB7C */\r\n       uint8_t RESERVED_33[128];\r\n  __IO uint32_t CIU_MCI_EXTRA;                     /**< MCI EXTRA Ports, offset: 0xC00 */\r\n       uint8_t RESERVED_34[252];\r\n  __IO uint32_t CIU_BBUD_CTRL;                     /**< BBUD Control Register, offset: 0xD00 */\r\n  __IO uint32_t CIU_BBUD_EXTRA_PORT;               /**< BBUD Extra Port Connection, offset: 0xD04 */\r\n  __IO uint32_t CIU_BBUD_PTP_INTR_CTRL;            /**< PTP Input capture interrupt control, offset: 0xD08 */\r\n       uint8_t RESERVED_35[112];\r\n  __IO uint32_t CIU_BBUD_ECO_CTRL;                 /**< BBUD ECO Control, offset: 0xD7C */\r\n  __IO uint32_t CIU_AIU_CTRL;                      /**< AIU Control Register, offset: 0xD80 */\r\n       uint8_t RESERVED_36[120];\r\n  __IO uint32_t CIU_AIU_ECO_CTRL;                  /**< AIU ECO Control, offset: 0xDFC */\r\n       uint8_t RESERVED_37[252];\r\n  __IO uint32_t CIU_CBU_ECO_CTRL;                  /**< CBU ECO Control, offset: 0xEFC */\r\n       uint8_t RESERVED_38[1829120];\r\n  __IO uint32_t CIU1_IMU_CPU1_WR_MSG_TO_CPU3;      /**< CPU1(WL) write message to CPU3(MCI) (0xAF0-0xAF4 IMU register access by CPU1), offset: 0x1BF800 */\r\n  __I  uint32_t CIU1_IMU_CPU1_RD_MSG_FROM_CPU3;    /**< cpu1 read message from CPU3, offset: 0x1BF804 */\r\n  __I  uint32_t CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS; /**< cpu1 to CPU3 message FIFO status, offset: 0x1BF808 */\r\n  __IO uint32_t CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL;  /**< cpu1 to CPU3 message FIFO control, offset: 0x1BF80C */\r\n  __I  uint32_t CIU1_IMU_CPU3_RD_MSG_FROM_CPU1_VAL_DBG; /**< CPU3 last message read (from cpu1), offset: 0x1BF810 */\r\n       uint8_t RESERVED_39[12];\r\n  __IO uint32_t CIU1_IMU_CPU3_WR_MSG_TO_CPU1;      /**< CPU3 write message to cpu1 (0xB04-0xB14 IMU register access by CPU3), offset: 0x1BF820 */\r\n  __I  uint32_t CIU1_IMU_CPU3_RD_MSG_FROM_CPU1;    /**< CPU3 read message from cpu1, offset: 0x1BF824 */\r\n  __I  uint32_t CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS; /**< CPU3 to cpu1 message FIFO status, offset: 0x1BF828 */\r\n  __IO uint32_t CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL;  /**< CPU3 to cpu1 message FIFO control, offset: 0x1BF82C */\r\n  __I  uint32_t CIU1_IMU_CPU1_RD_MSG_FROM_CPU3_VAL_DBG; /**< cpu1 last message read (from cpu3), offset: 0x1BF830 */\r\n  __IO uint32_t CIU_CPU1_CPU3_MSG_CTRL;            /**< CPU1_CPU3 message register, offset: 0x1BF834 */\r\n  __IO uint32_t CIU1_CPU3_WAKEUP_CTRL;             /**< CIU1 register to wakeup CPU3, offset: 0x1BF838 */\r\n  __IO uint32_t CIU1_CPU1_WAKEUP_DONE;             /**< Wakeup done Control Register to CPU3, offset: 0x1BF83C */\r\n  __IO uint32_t CIU1_CPU3_NS_GP_INT;               /**< Non Secure region GP interrupt to CPU3, offset: 0x1BF840 */\r\n       uint8_t RESERVED_40[184];\r\n  __IO uint32_t CIU_IMU_ECO_BITS;                  /**< IMU ECO Control, offset: 0x1BF8FC */\r\n} CIU1_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- CIU1 Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup CIU1_Register_Masks CIU1 Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name CIU_CHIP_REV - CIU Revision */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CHIP_REV_CIU_IP_REVISION_MASK   (0xFFFFU)\r\n#define CIU1_CIU_CHIP_REV_CIU_IP_REVISION_SHIFT  (0U)\r\n/*! CIU_IP_REVISION - CIU Revision Number */\r\n#define CIU1_CIU_CHIP_REV_CIU_IP_REVISION(x)     (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CHIP_REV_CIU_IP_REVISION_SHIFT)) & CIU1_CIU_CHIP_REV_CIU_IP_REVISION_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CHIP_ECO_CTRL - Chip ECO Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CHIP_ECO_CTRL_ECO_BITS_MASK     (0xFFFFFFFFU)\r\n#define CIU1_CIU_CHIP_ECO_CTRL_ECO_BITS_SHIFT    (0U)\r\n/*! ECO_BITS - Reserved for ECOs */\r\n#define CIU1_CIU_CHIP_ECO_CTRL_ECO_BITS(x)       (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CHIP_ECO_CTRL_ECO_BITS_SHIFT)) & CIU1_CIU_CHIP_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CLK_ENABLE - Clock Enable */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CLK_ENABLE_BIST_AHB1_CLK_GATING_EN_MASK (0x1U)\r\n#define CIU1_CIU_CLK_ENABLE_BIST_AHB1_CLK_GATING_EN_SHIFT (0U)\r\n/*! BIST_AHB1_CLK_GATING_EN - bist Clock gating for IMEM/DMEM/SMU1/ROM */\r\n#define CIU1_CIU_CLK_ENABLE_BIST_AHB1_CLK_GATING_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_BIST_AHB1_CLK_GATING_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_BIST_AHB1_CLK_GATING_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_CPU1_GATEHCLK_EN_MASK (0x8U)\r\n#define CIU1_CIU_CLK_ENABLE_CPU1_GATEHCLK_EN_SHIFT (3U)\r\n/*! CPU1_GATEHCLK_EN - CPU1 Gate HCLK Control Feature */\r\n#define CIU1_CIU_CLK_ENABLE_CPU1_GATEHCLK_EN(x)  (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_CPU1_GATEHCLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_CPU1_GATEHCLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_CPU1_FABRIC_CLK_EN_MASK (0x10U)\r\n#define CIU1_CIU_CLK_ENABLE_CPU1_FABRIC_CLK_EN_SHIFT (4U)\r\n/*! CPU1_FABRIC_CLK_EN - CPU1 Fabric Clock Control Feature */\r\n#define CIU1_CIU_CLK_ENABLE_CPU1_FABRIC_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_CPU1_FABRIC_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_CPU1_FABRIC_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_CPU1_MEM_SLV_CLK_EN_MASK (0x20U)\r\n#define CIU1_CIU_CLK_ENABLE_CPU1_MEM_SLV_CLK_EN_SHIFT (5U)\r\n/*! CPU1_MEM_SLV_CLK_EN - CPU1 Memory Slave Clock Control Feature */\r\n#define CIU1_CIU_CLK_ENABLE_CPU1_MEM_SLV_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_CPU1_MEM_SLV_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_CPU1_MEM_SLV_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_SMU1_DYN_CLK_GATING_DIS_MASK (0x40U)\r\n#define CIU1_CIU_CLK_ENABLE_SMU1_DYN_CLK_GATING_DIS_SHIFT (6U)\r\n/*! SMU1_DYN_CLK_GATING_DIS - SMU1 Dynamic Clock Gating Feature */\r\n#define CIU1_CIU_CLK_ENABLE_SMU1_DYN_CLK_GATING_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_SMU1_DYN_CLK_GATING_DIS_SHIFT)) & CIU1_CIU_CLK_ENABLE_SMU1_DYN_CLK_GATING_DIS_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_WLRTU1_AHB_CLK_EN_MASK (0x100U)\r\n#define CIU1_CIU_CLK_ENABLE_WLRTU1_AHB_CLK_EN_SHIFT (8U)\r\n/*! WLRTU1_AHB_CLK_EN - WLRTU1 AHB Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE_WLRTU1_AHB_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_WLRTU1_AHB_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_WLRTU1_AHB_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_SMU1_AHB_CLK_EN_MASK (0x200U)\r\n#define CIU1_CIU_CLK_ENABLE_SMU1_AHB_CLK_EN_SHIFT (9U)\r\n/*! SMU1_AHB_CLK_EN - SMU1 AHB Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE_SMU1_AHB_CLK_EN(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_SMU1_AHB_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_SMU1_AHB_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_IPS_HCLK_EN_MASK     (0x400U)\r\n#define CIU1_CIU_CLK_ENABLE_IPS_HCLK_EN_SHIFT    (10U)\r\n/*! IPS_HCLK_EN - IPS AHB Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE_IPS_HCLK_EN(x)       (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_IPS_HCLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_IPS_HCLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_LBU1_AHB_CLK_EN_MASK (0x800U)\r\n#define CIU1_CIU_CLK_ENABLE_LBU1_AHB_CLK_EN_SHIFT (11U)\r\n/*! LBU1_AHB_CLK_EN - PBU AHB Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE_LBU1_AHB_CLK_EN(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_LBU1_AHB_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_LBU1_AHB_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_CIU_WLAPU_AHB_CLK_EN_MASK (0x1000U)\r\n#define CIU1_CIU_CLK_ENABLE_CIU_WLAPU_AHB_CLK_EN_SHIFT (12U)\r\n/*! CIU_WLAPU_AHB_CLK_EN - APU AHB Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE_CIU_WLAPU_AHB_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_CIU_WLAPU_AHB_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_CIU_WLAPU_AHB_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_CIU_WLAPU_SLPCLK_EN_MASK (0x2000U)\r\n#define CIU1_CIU_CLK_ENABLE_CIU_WLAPU_SLPCLK_EN_SHIFT (13U)\r\n/*! CIU_WLAPU_SLPCLK_EN - APU Sleep Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE_CIU_WLAPU_SLPCLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_CIU_WLAPU_SLPCLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_CIU_WLAPU_SLPCLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_CIU_WLAPU_CAL_CLK_EN_MASK (0x4000U)\r\n#define CIU1_CIU_CLK_ENABLE_CIU_WLAPU_CAL_CLK_EN_SHIFT (14U)\r\n/*! CIU_WLAPU_CAL_CLK_EN - APU Calibration Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE_CIU_WLAPU_CAL_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_CIU_WLAPU_CAL_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_CIU_WLAPU_CAL_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_CIU_WLAPU_REF_CLK_EN_MASK (0x8000U)\r\n#define CIU1_CIU_CLK_ENABLE_CIU_WLAPU_REF_CLK_EN_SHIFT (15U)\r\n/*! CIU_WLAPU_REF_CLK_EN - APU Reference Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE_CIU_WLAPU_REF_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_CIU_WLAPU_REF_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_CIU_WLAPU_REF_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_IPS_CLK_EN_MASK      (0x10000U)\r\n#define CIU1_CIU_CLK_ENABLE_IPS_CLK_EN_SHIFT     (16U)\r\n/*! IPS_CLK_EN - Enable for ips functional clock */\r\n#define CIU1_CIU_CLK_ENABLE_IPS_CLK_EN(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_IPS_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_IPS_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_IPS_PCLK_EN_MASK     (0x20000U)\r\n#define CIU1_CIU_CLK_ENABLE_IPS_PCLK_EN_SHIFT    (17U)\r\n/*! IPS_PCLK_EN - Enable for ips apb clock */\r\n#define CIU1_CIU_CLK_ENABLE_IPS_PCLK_EN(x)       (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_IPS_PCLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_IPS_PCLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_MCI_LITE2AHB_HCLK_EN_MASK (0x40000U)\r\n#define CIU1_CIU_CLK_ENABLE_MCI_LITE2AHB_HCLK_EN_SHIFT (18U)\r\n/*! MCI_LITE2AHB_HCLK_EN - Enable for mci lite2ahb module in wl_top */\r\n#define CIU1_CIU_CLK_ENABLE_MCI_LITE2AHB_HCLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_MCI_LITE2AHB_HCLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_MCI_LITE2AHB_HCLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_LBU1_LSBIF_CLK_EN_MASK (0x100000U)\r\n#define CIU1_CIU_CLK_ENABLE_LBU1_LSBIF_CLK_EN_SHIFT (20U)\r\n/*! LBU1_LSBIF_CLK_EN - PBU Device Clock (PCLK) Enable */\r\n#define CIU1_CIU_CLK_ENABLE_LBU1_LSBIF_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_LBU1_LSBIF_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_LBU1_LSBIF_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_EU1_CORE_CLK_EN_MASK (0x400000U)\r\n#define CIU1_CIU_CLK_ENABLE_EU1_CORE_CLK_EN_SHIFT (22U)\r\n/*! EU1_CORE_CLK_EN - EU1 Core Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE_EU1_CORE_CLK_EN(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_EU1_CORE_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_EU1_CORE_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_MCU1_AHB_CLK_EN_MASK (0x800000U)\r\n#define CIU1_CIU_CLK_ENABLE_MCU1_AHB_CLK_EN_SHIFT (23U)\r\n/*! MCU1_AHB_CLK_EN - MCU1 AHB Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE_MCU1_AHB_CLK_EN(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_MCU1_AHB_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_MCU1_AHB_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_WL_AHB2APB_HCLK_EN_MASK (0x2000000U)\r\n#define CIU1_CIU_CLK_ENABLE_WL_AHB2APB_HCLK_EN_SHIFT (25U)\r\n/*! WL_AHB2APB_HCLK_EN - Wireless AHB to APB Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE_WL_AHB2APB_HCLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_WL_AHB2APB_HCLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_WL_AHB2APB_HCLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_MCU1_SYS_CLK_EN_MASK (0x4000000U)\r\n#define CIU1_CIU_CLK_ENABLE_MCU1_SYS_CLK_EN_SHIFT (26U)\r\n/*! MCU1_SYS_CLK_EN - MCU1 System Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE_MCU1_SYS_CLK_EN(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_MCU1_SYS_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_MCU1_SYS_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE_CIU_WLAPU_DVFS_CLK_EN_MASK (0x80000000U)\r\n#define CIU1_CIU_CLK_ENABLE_CIU_WLAPU_DVFS_CLK_EN_SHIFT (31U)\r\n/*! CIU_WLAPU_DVFS_CLK_EN - APU DVFS Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE_CIU_WLAPU_DVFS_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE_CIU_WLAPU_DVFS_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE_CIU_WLAPU_DVFS_CLK_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CLK_ENABLE2 - Clock enable2 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CLK_ENABLE2_IPS_PROM_ADDR_MASK_DIS_MASK (0x1U)\r\n#define CIU1_CIU_CLK_ENABLE2_IPS_PROM_ADDR_MASK_DIS_SHIFT (0U)\r\n/*! IPS_PROM_ADDR_MASK_DIS - ips prom ROM Address Mask Selection */\r\n#define CIU1_CIU_CLK_ENABLE2_IPS_PROM_ADDR_MASK_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE2_IPS_PROM_ADDR_MASK_DIS_SHIFT)) & CIU1_CIU_CLK_ENABLE2_IPS_PROM_ADDR_MASK_DIS_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE2_IPS_PROM_DYN_CLK_DIS_MASK (0x2U)\r\n#define CIU1_CIU_CLK_ENABLE2_IPS_PROM_DYN_CLK_DIS_SHIFT (1U)\r\n/*! IPS_PROM_DYN_CLK_DIS - ips ROM Dynamic Clock Gating Feature */\r\n#define CIU1_CIU_CLK_ENABLE2_IPS_PROM_DYN_CLK_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE2_IPS_PROM_DYN_CLK_DIS_SHIFT)) & CIU1_CIU_CLK_ENABLE2_IPS_PROM_DYN_CLK_DIS_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE2_BR_AHB1_CLK_EN_MASK (0x1F0000U)\r\n#define CIU1_CIU_CLK_ENABLE2_BR_AHB1_CLK_EN_SHIFT (16U)\r\n/*! BR_AHB1_CLK_EN - BRU AHB Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE2_BR_AHB1_CLK_EN(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE2_BR_AHB1_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE2_BR_AHB1_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE2_WEU_AHB_CLK_EN_MASK (0x4000000U)\r\n#define CIU1_CIU_CLK_ENABLE2_WEU_AHB_CLK_EN_SHIFT (26U)\r\n/*! WEU_AHB_CLK_EN - WEU AHB Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE2_WEU_AHB_CLK_EN(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE2_WEU_AHB_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE2_WEU_AHB_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE2_WEU_SYS_CLK_EN_MASK (0x8000000U)\r\n#define CIU1_CIU_CLK_ENABLE2_WEU_SYS_CLK_EN_SHIFT (27U)\r\n/*! WEU_SYS_CLK_EN - WEU SYS Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE2_WEU_SYS_CLK_EN(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE2_WEU_SYS_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE2_WEU_SYS_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE2_HPU1_CIU_CLK_EN_MASK (0x10000000U)\r\n#define CIU1_CIU_CLK_ENABLE2_HPU1_CIU_CLK_EN_SHIFT (28U)\r\n/*! HPU1_CIU_CLK_EN - HPU1 CIU Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE2_HPU1_CIU_CLK_EN(x)  (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE2_HPU1_CIU_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE2_HPU1_CIU_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE2_SMU1_TOP_CLK_EN_MASK (0x20000000U)\r\n#define CIU1_CIU_CLK_ENABLE2_SMU1_TOP_CLK_EN_SHIFT (29U)\r\n/*! SMU1_TOP_CLK_EN - SMU1 Top Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE2_SMU1_TOP_CLK_EN(x)  (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE2_SMU1_TOP_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE2_SMU1_TOP_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE2_SMU1_PORT0_SYS_CLK_EN_MASK (0x40000000U)\r\n#define CIU1_CIU_CLK_ENABLE2_SMU1_PORT0_SYS_CLK_EN_SHIFT (30U)\r\n/*! SMU1_PORT0_SYS_CLK_EN - SMU1 Port 0 System Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE2_SMU1_PORT0_SYS_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE2_SMU1_PORT0_SYS_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE2_SMU1_PORT0_SYS_CLK_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CLK_ENABLE3 - Clock Enable 3 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CLK_ENABLE3_WL_MSC_A2A_CLK_EN_MASK (0x1U)\r\n#define CIU1_CIU_CLK_ENABLE3_WL_MSC_A2A_CLK_EN_SHIFT (0U)\r\n/*! WL_MSC_A2A_CLK_EN - Enable Clock for MSC A2A */\r\n#define CIU1_CIU_CLK_ENABLE3_WL_MSC_A2A_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE3_WL_MSC_A2A_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE3_WL_MSC_A2A_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE3_WL_SOC_A2A_CLK_EN_MASK (0x2U)\r\n#define CIU1_CIU_CLK_ENABLE3_WL_SOC_A2A_CLK_EN_SHIFT (1U)\r\n/*! WL_SOC_A2A_CLK_EN - Enable Clock for SOC A2A */\r\n#define CIU1_CIU_CLK_ENABLE3_WL_SOC_A2A_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE3_WL_SOC_A2A_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE3_WL_SOC_A2A_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE3_WLRTU1_CLK_EN_MASK  (0x40U)\r\n#define CIU1_CIU_CLK_ENABLE3_WLRTU1_CLK_EN_SHIFT (6U)\r\n/*! WLRTU1_CLK_EN - Enable WL RTU1 timer clock */\r\n#define CIU1_CIU_CLK_ENABLE3_WLRTU1_CLK_EN(x)    (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE3_WLRTU1_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE3_WLRTU1_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE3_BRU_AHB1_ADDR_MASK_DIS_MASK (0x1000U)\r\n#define CIU1_CIU_CLK_ENABLE3_BRU_AHB1_ADDR_MASK_DIS_SHIFT (12U)\r\n/*! BRU_AHB1_ADDR_MASK_DIS - CPU1 ROM Address Mask Selection */\r\n#define CIU1_CIU_CLK_ENABLE3_BRU_AHB1_ADDR_MASK_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE3_BRU_AHB1_ADDR_MASK_DIS_SHIFT)) & CIU1_CIU_CLK_ENABLE3_BRU_AHB1_ADDR_MASK_DIS_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE3_BRU_AHB1_DYN_CLK_GATING_DIS_MASK (0x2000U)\r\n#define CIU1_CIU_CLK_ENABLE3_BRU_AHB1_DYN_CLK_GATING_DIS_SHIFT (13U)\r\n/*! BRU_AHB1_DYN_CLK_GATING_DIS - CPU1 ROM Dynamic Clock Gating Feature */\r\n#define CIU1_CIU_CLK_ENABLE3_BRU_AHB1_DYN_CLK_GATING_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE3_BRU_AHB1_DYN_CLK_GATING_DIS_SHIFT)) & CIU1_CIU_CLK_ENABLE3_BRU_AHB1_DYN_CLK_GATING_DIS_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE3_ITCM_AHB1_DYN_CLK_GATING_DIS_MASK (0x4000U)\r\n#define CIU1_CIU_CLK_ENABLE3_ITCM_AHB1_DYN_CLK_GATING_DIS_SHIFT (14U)\r\n/*! ITCM_AHB1_DYN_CLK_GATING_DIS - CPU1 ITCM/IMEM Dynamic Clock Gating Feature */\r\n#define CIU1_CIU_CLK_ENABLE3_ITCM_AHB1_DYN_CLK_GATING_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE3_ITCM_AHB1_DYN_CLK_GATING_DIS_SHIFT)) & CIU1_CIU_CLK_ENABLE3_ITCM_AHB1_DYN_CLK_GATING_DIS_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE3_DTCM_AHB1_DYN_CLK_GATING_DIS_MASK (0x8000U)\r\n#define CIU1_CIU_CLK_ENABLE3_DTCM_AHB1_DYN_CLK_GATING_DIS_SHIFT (15U)\r\n/*! DTCM_AHB1_DYN_CLK_GATING_DIS - CPU1 DTCM/DMEM Dynamic Clock Gating Feature */\r\n#define CIU1_CIU_CLK_ENABLE3_DTCM_AHB1_DYN_CLK_GATING_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE3_DTCM_AHB1_DYN_CLK_GATING_DIS_SHIFT)) & CIU1_CIU_CLK_ENABLE3_DTCM_AHB1_DYN_CLK_GATING_DIS_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE3_SMU1_BANK_SEG_CLK_EN_MASK (0xFF0000U)\r\n#define CIU1_CIU_CLK_ENABLE3_SMU1_BANK_SEG_CLK_EN_SHIFT (16U)\r\n/*! SMU1_BANK_SEG_CLK_EN - SMU1 bank segment Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE3_SMU1_BANK_SEG_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE3_SMU1_BANK_SEG_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE3_SMU1_BANK_SEG_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE3_MCI_A2A_CLK_EN_MASK (0x40000000U)\r\n#define CIU1_CIU_CLK_ENABLE3_MCI_A2A_CLK_EN_SHIFT (30U)\r\n/*! MCI_A2A_CLK_EN - Enable Clock for MCI A2A */\r\n#define CIU1_CIU_CLK_ENABLE3_MCI_A2A_CLK_EN(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE3_MCI_A2A_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE3_MCI_A2A_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE3_SMU1_MEM_SYS_CLK_EN_MASK (0x80000000U)\r\n#define CIU1_CIU_CLK_ENABLE3_SMU1_MEM_SYS_CLK_EN_SHIFT (31U)\r\n/*! SMU1_MEM_SYS_CLK_EN - SMU1 mem banks and peripheral control logic Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE3_SMU1_MEM_SYS_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE3_SMU1_MEM_SYS_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE3_SMU1_MEM_SYS_CLK_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CLK_CPU1CLK_CTRL - CPU1_AHB1 Clock Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CLK_CPU1CLK_CTRL_T1_FREQ_SEL_MASK (0xFU)\r\n#define CIU1_CIU_CLK_CPU1CLK_CTRL_T1_FREQ_SEL_SHIFT (0U)\r\n/*! T1_FREQ_SEL - CPU1 Clock Frequency Select */\r\n#define CIU1_CIU_CLK_CPU1CLK_CTRL_T1_FREQ_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_CPU1CLK_CTRL_T1_FREQ_SEL_SHIFT)) & CIU1_CIU_CLK_CPU1CLK_CTRL_T1_FREQ_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CLK_SYSCLK_CTRL - SYS Clock Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CLK_SYSCLK_CTRL_T1_FREQ_SEL_MASK (0xFU)\r\n#define CIU1_CIU_CLK_SYSCLK_CTRL_T1_FREQ_SEL_SHIFT (0U)\r\n/*! T1_FREQ_SEL - Sys Clock Frequency Select */\r\n#define CIU1_CIU_CLK_SYSCLK_CTRL_T1_FREQ_SEL(x)  (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_SYSCLK_CTRL_T1_FREQ_SEL_SHIFT)) & CIU1_CIU_CLK_SYSCLK_CTRL_T1_FREQ_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CLK_RTU_NCO_CTRL - RTU NCO Clock Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CLK_RTU_NCO_CTRL_CIU_WLRTU_REF_CLK_SEL_MASK (0x1U)\r\n#define CIU1_CIU_CLK_RTU_NCO_CTRL_CIU_WLRTU_REF_CLK_SEL_SHIFT (0U)\r\n/*! CIU_WLRTU_REF_CLK_SEL - RTU Reference Clock from UART reference clock tree */\r\n#define CIU1_CIU_CLK_RTU_NCO_CTRL_CIU_WLRTU_REF_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_RTU_NCO_CTRL_CIU_WLRTU_REF_CLK_SEL_SHIFT)) & CIU1_CIU_CLK_RTU_NCO_CTRL_CIU_WLRTU_REF_CLK_SEL_MASK)\r\n\r\n#define CIU1_CIU_CLK_RTU_NCO_CTRL_CIU_WLRTU_NCO_OUT_SEL_MASK (0x2U)\r\n#define CIU1_CIU_CLK_RTU_NCO_CTRL_CIU_WLRTU_NCO_OUT_SEL_SHIFT (1U)\r\n/*! CIU_WLRTU_NCO_OUT_SEL - RTU NCO Mode Select (Reference Clock Based) */\r\n#define CIU1_CIU_CLK_RTU_NCO_CTRL_CIU_WLRTU_NCO_OUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_RTU_NCO_CTRL_CIU_WLRTU_NCO_OUT_SEL_SHIFT)) & CIU1_CIU_CLK_RTU_NCO_CTRL_CIU_WLRTU_NCO_OUT_SEL_MASK)\r\n\r\n#define CIU1_CIU_CLK_RTU_NCO_CTRL_CIU_WLRTU_NCO_ENABLE_MASK (0x4U)\r\n#define CIU1_CIU_CLK_RTU_NCO_CTRL_CIU_WLRTU_NCO_ENABLE_SHIFT (2U)\r\n/*! CIU_WLRTU_NCO_ENABLE - RTU NCO Enable (Reference Clock Based) */\r\n#define CIU1_CIU_CLK_RTU_NCO_CTRL_CIU_WLRTU_NCO_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_RTU_NCO_CTRL_CIU_WLRTU_NCO_ENABLE_SHIFT)) & CIU1_CIU_CLK_RTU_NCO_CTRL_CIU_WLRTU_NCO_ENABLE_MASK)\r\n\r\n#define CIU1_CIU_CLK_RTU_NCO_CTRL_CIU_WLRTU_NCO_STEP_MASK (0xFFFF0000U)\r\n#define CIU1_CIU_CLK_RTU_NCO_CTRL_CIU_WLRTU_NCO_STEP_SHIFT (16U)\r\n/*! CIU_WLRTU_NCO_STEP - Step size for RTU clock NCO (Reference Clock Based) */\r\n#define CIU1_CIU_CLK_RTU_NCO_CTRL_CIU_WLRTU_NCO_STEP(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_RTU_NCO_CTRL_CIU_WLRTU_NCO_STEP_SHIFT)) & CIU1_CIU_CLK_RTU_NCO_CTRL_CIU_WLRTU_NCO_STEP_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CLK_LBU1_WLRTU_CTRL - LBU1 WLRTU1 Clock Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_USE_REFCLK_MASK (0x2U)\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_USE_REFCLK_SHIFT (1U)\r\n/*! LBU1_USE_REFCLK - Static bit set by FW based on Reference Clock Frequency. If reference clock\r\n *    frequency is lower and LBU can not support high baud rate of UART, then FW will set\r\n *    soc_use_ref_mode = 0. This is an indication for Bluetooth subsystem that there is some IP which need PLL\r\n *    to function which is LBU in this case.\r\n */\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_USE_REFCLK(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_USE_REFCLK_SHIFT)) & CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_USE_REFCLK_MASK)\r\n\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_CLK_SCALE_EN_MASK (0x4U)\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_CLK_SCALE_EN_SHIFT (2U)\r\n/*! LBU1_CLK_SCALE_EN - Enable lbu1 lsb clock div (upto div by 3/4/5/6 only) */\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_CLK_SCALE_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_CLK_SCALE_EN_SHIFT)) & CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_CLK_SCALE_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_CLK_SCALE_FACTOR_MASK (0x38U)\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_CLK_SCALE_FACTOR_SHIFT (3U)\r\n/*! LBU1_CLK_SCALE_FACTOR - lbu1 lsb clock divider value[2:0] */\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_CLK_SCALE_FACTOR(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_CLK_SCALE_FACTOR_SHIFT)) & CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_CLK_SCALE_FACTOR_MASK)\r\n\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_HIGH_BAUD_SEL_MASK (0x40U)\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_HIGH_BAUD_SEL_SHIFT (6U)\r\n/*! LBU1_HIGH_BAUD_SEL - PBU Bus Reference Clock */\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_HIGH_BAUD_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_HIGH_BAUD_SEL_SHIFT)) & CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_HIGH_BAUD_SEL_MASK)\r\n\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_DIV_BY_2_SEL_MASK (0x80U)\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_DIV_BY_2_SEL_SHIFT (7U)\r\n/*! LBU1_DIV_BY_2_SEL - PBU Bus Reference Clock */\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_DIV_BY_2_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_DIV_BY_2_SEL_SHIFT)) & CIU1_CIU_CLK_LBU1_WLRTU_CTRL_LBU1_DIV_BY_2_SEL_MASK)\r\n\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_WLRTU1_TIMER1_USE_SLP_CLK_MASK (0x800U)\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_WLRTU1_TIMER1_USE_SLP_CLK_SHIFT (11U)\r\n/*! WLRTU1_TIMER1_USE_SLP_CLK - Timer 1 WL_RTU1 Clock */\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_WLRTU1_TIMER1_USE_SLP_CLK(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_LBU1_WLRTU_CTRL_WLRTU1_TIMER1_USE_SLP_CLK_SHIFT)) & CIU1_CIU_CLK_LBU1_WLRTU_CTRL_WLRTU1_TIMER1_USE_SLP_CLK_MASK)\r\n\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_WLRTU1_USE_REF_CLK_MASK (0x1000U)\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_WLRTU1_USE_REF_CLK_SHIFT (12U)\r\n/*! WLRTU1_USE_REF_CLK - Static bit set by FW. If it is required that timers need not be programmed\r\n *    with dynamic switching of T1/Reference, the WL_RTU1 source clock is set on reference clock so\r\n *    that the timer are not disturbed.\r\n */\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_WLRTU1_USE_REF_CLK(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_LBU1_WLRTU_CTRL_WLRTU1_USE_REF_CLK_SHIFT)) & CIU1_CIU_CLK_LBU1_WLRTU_CTRL_WLRTU1_USE_REF_CLK_MASK)\r\n\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_WLRTU1_DBG_CLK_CTRL_MASK (0x8000U)\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_WLRTU1_DBG_CLK_CTRL_SHIFT (15U)\r\n/*! WLRTU1_DBG_CLK_CTRL - WLRTU1 Debug Clock Control Feature */\r\n#define CIU1_CIU_CLK_LBU1_WLRTU_CTRL_WLRTU1_DBG_CLK_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_LBU1_WLRTU_CTRL_WLRTU1_DBG_CLK_CTRL_SHIFT)) & CIU1_CIU_CLK_LBU1_WLRTU_CTRL_WLRTU1_DBG_CLK_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CLK_SOCCLK_CTRL - SOC Clock Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CLK_SOCCLK_CTRL_EU1_CORE_CLK_SEL_MASK (0x3U)\r\n#define CIU1_CIU_CLK_SOCCLK_CTRL_EU1_CORE_CLK_SEL_SHIFT (0U)\r\n/*! EU1_CORE_CLK_SEL - EU1 Core Clock Select */\r\n#define CIU1_CIU_CLK_SOCCLK_CTRL_EU1_CORE_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_SOCCLK_CTRL_EU1_CORE_CLK_SEL_SHIFT)) & CIU1_CIU_CLK_SOCCLK_CTRL_EU1_CORE_CLK_SEL_MASK)\r\n\r\n#define CIU1_CIU_CLK_SOCCLK_CTRL_CIU_WLAPU_CONST_CAL_CLK_SEL_MASK (0x400U)\r\n#define CIU1_CIU_CLK_SOCCLK_CTRL_CIU_WLAPU_CONST_CAL_CLK_SEL_SHIFT (10U)\r\n/*! CIU_WLAPU_CONST_CAL_CLK_SEL - PMU Constant Calibration Clock Select */\r\n#define CIU1_CIU_CLK_SOCCLK_CTRL_CIU_WLAPU_CONST_CAL_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_SOCCLK_CTRL_CIU_WLAPU_CONST_CAL_CLK_SEL_SHIFT)) & CIU1_CIU_CLK_SOCCLK_CTRL_CIU_WLAPU_CONST_CAL_CLK_SEL_MASK)\r\n\r\n#define CIU1_CIU_CLK_SOCCLK_CTRL_CIU_WLAPU_CAL_CLK_SEL_MASK (0x800U)\r\n#define CIU1_CIU_CLK_SOCCLK_CTRL_CIU_WLAPU_CAL_CLK_SEL_SHIFT (11U)\r\n/*! CIU_WLAPU_CAL_CLK_SEL - PMU Calibration Clock */\r\n#define CIU1_CIU_CLK_SOCCLK_CTRL_CIU_WLAPU_CAL_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_SOCCLK_CTRL_CIU_WLAPU_CAL_CLK_SEL_SHIFT)) & CIU1_CIU_CLK_SOCCLK_CTRL_CIU_WLAPU_CAL_CLK_SEL_MASK)\r\n\r\n#define CIU1_CIU_CLK_SOCCLK_CTRL_CIU_USE_REFCLK_MASK (0x4000U)\r\n#define CIU1_CIU_CLK_SOCCLK_CTRL_CIU_USE_REFCLK_SHIFT (14U)\r\n/*! CIU_USE_REFCLK - SoC_Clk Clock */\r\n#define CIU1_CIU_CLK_SOCCLK_CTRL_CIU_USE_REFCLK(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_SOCCLK_CTRL_CIU_USE_REFCLK_SHIFT)) & CIU1_CIU_CLK_SOCCLK_CTRL_CIU_USE_REFCLK_MASK)\r\n\r\n#define CIU1_CIU_CLK_SOCCLK_CTRL_WL_AHB2APB_PCLK_DIV_SEL_MASK (0xF0000U)\r\n#define CIU1_CIU_CLK_SOCCLK_CTRL_WL_AHB2APB_PCLK_DIV_SEL_SHIFT (16U)\r\n/*! WL_AHB2APB_PCLK_DIV_SEL - WL AHB2APB PCLK Divider Select */\r\n#define CIU1_CIU_CLK_SOCCLK_CTRL_WL_AHB2APB_PCLK_DIV_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_SOCCLK_CTRL_WL_AHB2APB_PCLK_DIV_SEL_SHIFT)) & CIU1_CIU_CLK_SOCCLK_CTRL_WL_AHB2APB_PCLK_DIV_SEL_MASK)\r\n\r\n#define CIU1_CIU_CLK_SOCCLK_CTRL_WL_AHB2APB_WAIT_CYCLES_MASK (0xF0000000U)\r\n#define CIU1_CIU_CLK_SOCCLK_CTRL_WL_AHB2APB_WAIT_CYCLES_SHIFT (28U)\r\n/*! WL_AHB2APB_WAIT_CYCLES - WL AHB2APB Wait Cycles between each APB transaction */\r\n#define CIU1_CIU_CLK_SOCCLK_CTRL_WL_AHB2APB_WAIT_CYCLES(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_SOCCLK_CTRL_WL_AHB2APB_WAIT_CYCLES_SHIFT)) & CIU1_CIU_CLK_SOCCLK_CTRL_WL_AHB2APB_WAIT_CYCLES_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CLK_SLEEPCLK_CTRL - Sleep Clock Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CLK_SLEEPCLK_CTRL_CIU_SLEEP_CLK_NCO_MVAL_MASK (0xFFFFFFU)\r\n#define CIU1_CIU_CLK_SLEEPCLK_CTRL_CIU_SLEEP_CLK_NCO_MVAL_SHIFT (0U)\r\n/*! CIU_SLEEP_CLK_NCO_MVAL - Sleep Clock NCO */\r\n#define CIU1_CIU_CLK_SLEEPCLK_CTRL_CIU_SLEEP_CLK_NCO_MVAL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_SLEEPCLK_CTRL_CIU_SLEEP_CLK_NCO_MVAL_SHIFT)) & CIU1_CIU_CLK_SLEEPCLK_CTRL_CIU_SLEEP_CLK_NCO_MVAL_MASK)\r\n\r\n#define CIU1_CIU_CLK_SLEEPCLK_CTRL_CIU_NCO_SLEEP_CLK_SEL_MASK (0x2000000U)\r\n#define CIU1_CIU_CLK_SLEEPCLK_CTRL_CIU_NCO_SLEEP_CLK_SEL_SHIFT (25U)\r\n/*! CIU_NCO_SLEEP_CLK_SEL - NCO Sleep Clock Select */\r\n#define CIU1_CIU_CLK_SLEEPCLK_CTRL_CIU_NCO_SLEEP_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_SLEEPCLK_CTRL_CIU_NCO_SLEEP_CLK_SEL_SHIFT)) & CIU1_CIU_CLK_SLEEPCLK_CTRL_CIU_NCO_SLEEP_CLK_SEL_MASK)\r\n\r\n#define CIU1_CIU_CLK_SLEEPCLK_CTRL_CIU_REFCLK_SLEEP_CLK_SEL_MASK (0x10000000U)\r\n#define CIU1_CIU_CLK_SLEEPCLK_CTRL_CIU_REFCLK_SLEEP_CLK_SEL_SHIFT (28U)\r\n/*! CIU_REFCLK_SLEEP_CLK_SEL - Reference Clock Sleep Clock Select */\r\n#define CIU1_CIU_CLK_SLEEPCLK_CTRL_CIU_REFCLK_SLEEP_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_SLEEPCLK_CTRL_CIU_REFCLK_SLEEP_CLK_SEL_SHIFT)) & CIU1_CIU_CLK_SLEEPCLK_CTRL_CIU_REFCLK_SLEEP_CLK_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CLK_CP15_DIS1 - Clock Auto Shut-off Enable1 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CLK_CP15_DIS1_WLAN_HCLK_MASK    (0x40000U)\r\n#define CIU1_CIU_CLK_CP15_DIS1_WLAN_HCLK_SHIFT   (18U)\r\n/*! WLAN_HCLK - WLAN ahb Arbiter/Decoder Shut Off */\r\n#define CIU1_CIU_CLK_CP15_DIS1_WLAN_HCLK(x)      (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_CP15_DIS1_WLAN_HCLK_SHIFT)) & CIU1_CIU_CLK_CP15_DIS1_WLAN_HCLK_MASK)\r\n\r\n#define CIU1_CIU_CLK_CP15_DIS1_CP15_DIS_WLAPU_AHB_CLK_MASK (0x100000U)\r\n#define CIU1_CIU_CLK_CP15_DIS1_CP15_DIS_WLAPU_AHB_CLK_SHIFT (20U)\r\n/*! CP15_DIS_WLAPU_AHB_CLK - APU Shut Off */\r\n#define CIU1_CIU_CLK_CP15_DIS1_CP15_DIS_WLAPU_AHB_CLK(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_CP15_DIS1_CP15_DIS_WLAPU_AHB_CLK_SHIFT)) & CIU1_CIU_CLK_CP15_DIS1_CP15_DIS_WLAPU_AHB_CLK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CLK_CP15_DIS2 - Clock Auto Shut-off Enable2 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CLK_CP15_DIS2_CP15_DIS_CPU1_BROM_CLK_MASK (0x1FU)\r\n#define CIU1_CIU_CLK_CP15_DIS2_CP15_DIS_CPU1_BROM_CLK_SHIFT (0U)\r\n/*! CP15_DIS_CPU1_BROM_CLK - APU Shut Off */\r\n#define CIU1_CIU_CLK_CP15_DIS2_CP15_DIS_CPU1_BROM_CLK(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_CP15_DIS2_CP15_DIS_CPU1_BROM_CLK_SHIFT)) & CIU1_CIU_CLK_CP15_DIS2_CP15_DIS_CPU1_BROM_CLK_MASK)\r\n\r\n#define CIU1_CIU_CLK_CP15_DIS2_CP15_DIS_CPU1_DMEM_CLK_MASK (0x300U)\r\n#define CIU1_CIU_CLK_CP15_DIS2_CP15_DIS_CPU1_DMEM_CLK_SHIFT (8U)\r\n/*! CP15_DIS_CPU1_DMEM_CLK - APU Shut Off */\r\n#define CIU1_CIU_CLK_CP15_DIS2_CP15_DIS_CPU1_DMEM_CLK(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_CP15_DIS2_CP15_DIS_CPU1_DMEM_CLK_SHIFT)) & CIU1_CIU_CLK_CP15_DIS2_CP15_DIS_CPU1_DMEM_CLK_MASK)\r\n\r\n#define CIU1_CIU_CLK_CP15_DIS2_CP15_DIS_CPU1_IMEM_CLK_MASK (0x1F0000U)\r\n#define CIU1_CIU_CLK_CP15_DIS2_CP15_DIS_CPU1_IMEM_CLK_SHIFT (16U)\r\n/*! CP15_DIS_CPU1_IMEM_CLK - APU Shut Off 0 = disable this auto shut off feature 1 = AHB clock for\r\n *    the IMEM is automatically shut off while CPU is asleep\r\n */\r\n#define CIU1_CIU_CLK_CP15_DIS2_CP15_DIS_CPU1_IMEM_CLK(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_CP15_DIS2_CP15_DIS_CPU1_IMEM_CLK_SHIFT)) & CIU1_CIU_CLK_CP15_DIS2_CP15_DIS_CPU1_IMEM_CLK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CLK_CP15_DIS3 - Clock Auto Shut-off Enable3 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CLK_CP15_DIS3_CP15_DIS_WEU_AHB_CLK_MASK (0x100000U)\r\n#define CIU1_CIU_CLK_CP15_DIS3_CP15_DIS_WEU_AHB_CLK_SHIFT (20U)\r\n/*! CP15_DIS_WEU_AHB_CLK - TKIP/WEP WEU AHB Shut Off */\r\n#define CIU1_CIU_CLK_CP15_DIS3_CP15_DIS_WEU_AHB_CLK(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_CP15_DIS3_CP15_DIS_WEU_AHB_CLK_SHIFT)) & CIU1_CIU_CLK_CP15_DIS3_CP15_DIS_WEU_AHB_CLK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CLK_ENABLE6 - Clock Enable 6 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CLK_ENABLE6_CAU_SIF_CLK_SEL_MASK (0x100U)\r\n#define CIU1_CIU_CLK_ENABLE6_CAU_SIF_CLK_SEL_SHIFT (8U)\r\n/*! CAU_SIF_CLK_SEL - CAU SIF Clock Select */\r\n#define CIU1_CIU_CLK_ENABLE6_CAU_SIF_CLK_SEL(x)  (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE6_CAU_SIF_CLK_SEL_SHIFT)) & CIU1_CIU_CLK_ENABLE6_CAU_SIF_CLK_SEL_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE6_CAU_SIF_AHB1_CLK_EN_MASK (0x200U)\r\n#define CIU1_CIU_CLK_ENABLE6_CAU_SIF_AHB1_CLK_EN_SHIFT (9U)\r\n/*! CAU_SIF_AHB1_CLK_EN - CAU AHB2SIF AHB clock enable */\r\n#define CIU1_CIU_CLK_ENABLE6_CAU_SIF_AHB1_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE6_CAU_SIF_AHB1_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE6_CAU_SIF_AHB1_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE6_GPS_PPS_CLK_EN_MASK (0x400U)\r\n#define CIU1_CIU_CLK_ENABLE6_GPS_PPS_CLK_EN_SHIFT (10U)\r\n/*! GPS_PPS_CLK_EN - GPS PPS Clock Enable */\r\n#define CIU1_CIU_CLK_ENABLE6_GPS_PPS_CLK_EN(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE6_GPS_PPS_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE6_GPS_PPS_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE6_MAC1_G2BIST_CLK_EN_MASK (0x800U)\r\n#define CIU1_CIU_CLK_ENABLE6_MAC1_G2BIST_CLK_EN_SHIFT (11U)\r\n/*! MAC1_G2BIST_CLK_EN - Clock Enable for MAC1 BIST Controller Clock */\r\n#define CIU1_CIU_CLK_ENABLE6_MAC1_G2BIST_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE6_MAC1_G2BIST_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE6_MAC1_G2BIST_CLK_EN_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE6_BBUD_MAC_CLK_SEL_MASK (0x2000U)\r\n#define CIU1_CIU_CLK_ENABLE6_BBUD_MAC_CLK_SEL_SHIFT (13U)\r\n/*! BBUD_MAC_CLK_SEL - BBUD MAC Clock Select */\r\n#define CIU1_CIU_CLK_ENABLE6_BBUD_MAC_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE6_BBUD_MAC_CLK_SEL_SHIFT)) & CIU1_CIU_CLK_ENABLE6_BBUD_MAC_CLK_SEL_MASK)\r\n\r\n#define CIU1_CIU_CLK_ENABLE6_PTP_CLK_EN_MASK     (0x4000U)\r\n#define CIU1_CIU_CLK_ENABLE6_PTP_CLK_EN_SHIFT    (14U)\r\n/*! PTP_CLK_EN - PTP input capture pulse interrupt clock enable */\r\n#define CIU1_CIU_CLK_ENABLE6_PTP_CLK_EN(x)       (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ENABLE6_PTP_CLK_EN_SHIFT)) & CIU1_CIU_CLK_ENABLE6_PTP_CLK_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CLK_SLEEPCLK_CTRL2 - Sleep Clock Control 2 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CLK_SLEEPCLK_CTRL2_CIU_SLEEP_CLK_NCO_MVAL_DURING_SLP_MASK (0xFFFFFFU)\r\n#define CIU1_CIU_CLK_SLEEPCLK_CTRL2_CIU_SLEEP_CLK_NCO_MVAL_DURING_SLP_SHIFT (0U)\r\n/*! CIU_SLEEP_CLK_NCO_MVAL_DURING_SLP - Sleep Clock NCO value for the sleep mode */\r\n#define CIU1_CIU_CLK_SLEEPCLK_CTRL2_CIU_SLEEP_CLK_NCO_MVAL_DURING_SLP(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_SLEEPCLK_CTRL2_CIU_SLEEP_CLK_NCO_MVAL_DURING_SLP_SHIFT)) & CIU1_CIU_CLK_SLEEPCLK_CTRL2_CIU_SLEEP_CLK_NCO_MVAL_DURING_SLP_MASK)\r\n\r\n#define CIU1_CIU_CLK_SLEEPCLK_CTRL2_CIU_SLEEP_CLK_NCO_MVAL_BYPASS_MASK (0x1000000U)\r\n#define CIU1_CIU_CLK_SLEEPCLK_CTRL2_CIU_SLEEP_CLK_NCO_MVAL_BYPASS_SHIFT (24U)\r\n/*! CIU_SLEEP_CLK_NCO_MVAL_BYPASS - Sleep Clock NCO MVAL Bypass Feature */\r\n#define CIU1_CIU_CLK_SLEEPCLK_CTRL2_CIU_SLEEP_CLK_NCO_MVAL_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_SLEEPCLK_CTRL2_CIU_SLEEP_CLK_NCO_MVAL_BYPASS_SHIFT)) & CIU1_CIU_CLK_SLEEPCLK_CTRL2_CIU_SLEEP_CLK_NCO_MVAL_BYPASS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_MAC_CLK_CTRL - MAC clock CTRL */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_MAC_CLK_CTRL_MAC1_BBUD_BYPASS_EN_MASK (0x1U)\r\n#define CIU1_CIU_MAC_CLK_CTRL_MAC1_BBUD_BYPASS_EN_SHIFT (0U)\r\n/*! MAC1_BBUD_BYPASS_EN - Bypass 11J_EN and PUB_SFT from BBUD1 */\r\n#define CIU1_CIU_MAC_CLK_CTRL_MAC1_BBUD_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MAC_CLK_CTRL_MAC1_BBUD_BYPASS_EN_SHIFT)) & CIU1_CIU_MAC_CLK_CTRL_MAC1_BBUD_BYPASS_EN_MASK)\r\n\r\n#define CIU1_CIU_MAC_CLK_CTRL_MAC1_BBUD_BYPASS_VAL_MASK (0x6U)\r\n#define CIU1_CIU_MAC_CLK_CTRL_MAC1_BBUD_BYPASS_VAL_SHIFT (1U)\r\n/*! MAC1_BBUD_BYPASS_VAL - Bypass value */\r\n#define CIU1_CIU_MAC_CLK_CTRL_MAC1_BBUD_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MAC_CLK_CTRL_MAC1_BBUD_BYPASS_VAL_SHIFT)) & CIU1_CIU_MAC_CLK_CTRL_MAC1_BBUD_BYPASS_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CLK_ECO_CTRL - Clock ECO Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CLK_ECO_CTRL_ECO_BITS_MASK      (0xFFFFFFFFU)\r\n#define CIU1_CIU_CLK_ECO_CTRL_ECO_BITS_SHIFT     (0U)\r\n/*! ECO_BITS - Reserved for ECOs */\r\n#define CIU1_CIU_CLK_ECO_CTRL_ECO_BITS(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CLK_ECO_CTRL_ECO_BITS_SHIFT)) & CIU1_CIU_CLK_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_RST_SW1 - Software Module Reset */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_RST_SW1_HPU1__MASK              (0x1U)\r\n#define CIU1_CIU_RST_SW1_HPU1__SHIFT             (0U)\r\n/*! HPU1_ - HPU1 Reset */\r\n#define CIU1_CIU_RST_SW1_HPU1_(x)                (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW1_HPU1__SHIFT)) & CIU1_CIU_RST_SW1_HPU1__MASK)\r\n\r\n#define CIU1_CIU_RST_SW1_SMU1_PORT0_SYS_CLK_N_MASK (0x4U)\r\n#define CIU1_CIU_RST_SW1_SMU1_PORT0_SYS_CLK_N_SHIFT (2U)\r\n/*! SMU1_PORT0_SYS_CLK_N - SMU1 port 0 (SYS_Clk) Soft Reset */\r\n#define CIU1_CIU_RST_SW1_SMU1_PORT0_SYS_CLK_N(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW1_SMU1_PORT0_SYS_CLK_N_SHIFT)) & CIU1_CIU_RST_SW1_SMU1_PORT0_SYS_CLK_N_MASK)\r\n\r\n#define CIU1_CIU_RST_SW1_SMU1_MEM_CLK__MASK      (0x8U)\r\n#define CIU1_CIU_RST_SW1_SMU1_MEM_CLK__SHIFT     (3U)\r\n/*! SMU1_MEM_CLK_ - SMU1 bank clock Soft Reset */\r\n#define CIU1_CIU_RST_SW1_SMU1_MEM_CLK_(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW1_SMU1_MEM_CLK__SHIFT)) & CIU1_CIU_RST_SW1_SMU1_MEM_CLK__MASK)\r\n\r\n#define CIU1_CIU_RST_SW1_SMU1_TM_RST__MASK       (0x80U)\r\n#define CIU1_CIU_RST_SW1_SMU1_TM_RST__SHIFT      (7U)\r\n/*! SMU1_TM_RST_ - SMU1 testmode logic reset */\r\n#define CIU1_CIU_RST_SW1_SMU1_TM_RST_(x)         (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW1_SMU1_TM_RST__SHIFT)) & CIU1_CIU_RST_SW1_SMU1_TM_RST__MASK)\r\n\r\n#define CIU1_CIU_RST_SW1_WEU_SYS_CLK_N_MASK      (0x100U)\r\n#define CIU1_CIU_RST_SW1_WEU_SYS_CLK_N_SHIFT     (8U)\r\n/*! WEU_SYS_CLK_N - WEU sys clock domain soft reset */\r\n#define CIU1_CIU_RST_SW1_WEU_SYS_CLK_N(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW1_WEU_SYS_CLK_N_SHIFT)) & CIU1_CIU_RST_SW1_WEU_SYS_CLK_N_MASK)\r\n\r\n#define CIU1_CIU_RST_SW1_WEU_AHB_CLK_N_MASK      (0x200U)\r\n#define CIU1_CIU_RST_SW1_WEU_AHB_CLK_N_SHIFT     (9U)\r\n/*! WEU_AHB_CLK_N - WEU ahb clock domain soft reset */\r\n#define CIU1_CIU_RST_SW1_WEU_AHB_CLK_N(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW1_WEU_AHB_CLK_N_SHIFT)) & CIU1_CIU_RST_SW1_WEU_AHB_CLK_N_MASK)\r\n\r\n#define CIU1_CIU_RST_SW1_CIU1_CFG_RST__MASK      (0x400U)\r\n#define CIU1_CIU_RST_SW1_CIU1_CFG_RST__SHIFT     (10U)\r\n/*! CIU1_CFG_RST_ - CIU ahb clock domain Soft Reset */\r\n#define CIU1_CIU_RST_SW1_CIU1_CFG_RST_(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW1_CIU1_CFG_RST__SHIFT)) & CIU1_CIU_RST_SW1_CIU1_CFG_RST__MASK)\r\n\r\n#define CIU1_CIU_RST_SW1_CIU1_REGISTER_RST__MASK (0x800U)\r\n#define CIU1_CIU_RST_SW1_CIU1_REGISTER_RST__SHIFT (11U)\r\n/*! CIU1_REGISTER_RST_ - CIU_Reg Module Soft Reset */\r\n#define CIU1_CIU_RST_SW1_CIU1_REGISTER_RST_(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW1_CIU1_REGISTER_RST__SHIFT)) & CIU1_CIU_RST_SW1_CIU1_REGISTER_RST__MASK)\r\n\r\n#define CIU1_CIU_RST_SW1_MCU1_SYS_CLK__MASK      (0x8000U)\r\n#define CIU1_CIU_RST_SW1_MCU1_SYS_CLK__SHIFT     (15U)\r\n/*! MCU1_SYS_CLK_ - MCU1 sysclk domain Soft Reset */\r\n#define CIU1_CIU_RST_SW1_MCU1_SYS_CLK_(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW1_MCU1_SYS_CLK__SHIFT)) & CIU1_CIU_RST_SW1_MCU1_SYS_CLK__MASK)\r\n\r\n#define CIU1_CIU_RST_SW1_WL_AHB2APB_CLK_N_MASK   (0x10000U)\r\n#define CIU1_CIU_RST_SW1_WL_AHB2APB_CLK_N_SHIFT  (16U)\r\n/*! WL_AHB2APB_CLK_N - WL AHB2APB AHB clock domain reset */\r\n#define CIU1_CIU_RST_SW1_WL_AHB2APB_CLK_N(x)     (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW1_WL_AHB2APB_CLK_N_SHIFT)) & CIU1_CIU_RST_SW1_WL_AHB2APB_CLK_N_MASK)\r\n\r\n#define CIU1_CIU_RST_SW1_WL_AHB_RST__MASK        (0x80000U)\r\n#define CIU1_CIU_RST_SW1_WL_AHB_RST__SHIFT       (19U)\r\n/*! WL_AHB_RST_ - WL AHB Decoder Mux and Arbiter and CIU AHB intf Soft Reset */\r\n#define CIU1_CIU_RST_SW1_WL_AHB_RST_(x)          (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW1_WL_AHB_RST__SHIFT)) & CIU1_CIU_RST_SW1_WL_AHB_RST__MASK)\r\n\r\n#define CIU1_CIU_RST_SW1_LBU1__MASK              (0x100000U)\r\n#define CIU1_CIU_RST_SW1_LBU1__SHIFT             (20U)\r\n/*! LBU1_ - LBU1 Soft Reset */\r\n#define CIU1_CIU_RST_SW1_LBU1_(x)                (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW1_LBU1__SHIFT)) & CIU1_CIU_RST_SW1_LBU1__MASK)\r\n\r\n#define CIU1_CIU_RST_SW1_WLAPU_REF_CLK__MASK     (0x200000U)\r\n#define CIU1_CIU_RST_SW1_WLAPU_REF_CLK__SHIFT    (21U)\r\n/*! WLAPU_REF_CLK_ - APU ref Clock Reset */\r\n#define CIU1_CIU_RST_SW1_WLAPU_REF_CLK_(x)       (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW1_WLAPU_REF_CLK__SHIFT)) & CIU1_CIU_RST_SW1_WLAPU_REF_CLK__MASK)\r\n\r\n#define CIU1_CIU_RST_SW1_BBU1_DSP__MASK          (0x1000000U)\r\n#define CIU1_CIU_RST_SW1_BBU1_DSP__SHIFT         (24U)\r\n/*! BBU1_DSP_ - BBU1_DSP Reset */\r\n#define CIU1_CIU_RST_SW1_BBU1_DSP_(x)            (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW1_BBU1_DSP__SHIFT)) & CIU1_CIU_RST_SW1_BBU1_DSP__MASK)\r\n\r\n#define CIU1_CIU_RST_SW1_RFU1_PR__MASK           (0x2000000U)\r\n#define CIU1_CIU_RST_SW1_RFU1_PR__SHIFT          (25U)\r\n/*! RFU1_PR_ - RFU1_PR Reset */\r\n#define CIU1_CIU_RST_SW1_RFU1_PR_(x)             (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW1_RFU1_PR__SHIFT)) & CIU1_CIU_RST_SW1_RFU1_PR__MASK)\r\n\r\n#define CIU1_CIU_RST_SW1_WLAPU_AHB_CLK__MASK     (0x4000000U)\r\n#define CIU1_CIU_RST_SW1_WLAPU_AHB_CLK__SHIFT    (26U)\r\n/*! WLAPU_AHB_CLK_ - APU ARM Clock Reset */\r\n#define CIU1_CIU_RST_SW1_WLAPU_AHB_CLK_(x)       (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW1_WLAPU_AHB_CLK__SHIFT)) & CIU1_CIU_RST_SW1_WLAPU_AHB_CLK__MASK)\r\n\r\n#define CIU1_CIU_RST_SW1_WLAPU_SLP_CLK__MASK     (0x8000000U)\r\n#define CIU1_CIU_RST_SW1_WLAPU_SLP_CLK__SHIFT    (27U)\r\n/*! WLAPU_SLP_CLK_ - APU Sleep Clock domain Reset */\r\n#define CIU1_CIU_RST_SW1_WLAPU_SLP_CLK_(x)       (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW1_WLAPU_SLP_CLK__SHIFT)) & CIU1_CIU_RST_SW1_WLAPU_SLP_CLK__MASK)\r\n\r\n#define CIU1_CIU_RST_SW1_MCU1_MCLK__MASK         (0x10000000U)\r\n#define CIU1_CIU_RST_SW1_MCU1_MCLK__SHIFT        (28U)\r\n/*! MCU1_MCLK_ - MCU1 MCLK domain reset */\r\n#define CIU1_CIU_RST_SW1_MCU1_MCLK_(x)           (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW1_MCU1_MCLK__SHIFT)) & CIU1_CIU_RST_SW1_MCU1_MCLK__MASK)\r\n\r\n#define CIU1_CIU_RST_SW1_EU1_CORE_CLK__MASK      (0x20000000U)\r\n#define CIU1_CIU_RST_SW1_EU1_CORE_CLK__SHIFT     (29U)\r\n/*! EU1_CORE_CLK_ - EU1 Core Soft Reset */\r\n#define CIU1_CIU_RST_SW1_EU1_CORE_CLK_(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW1_EU1_CORE_CLK__SHIFT)) & CIU1_CIU_RST_SW1_EU1_CORE_CLK__MASK)\r\n\r\n#define CIU1_CIU_RST_SW1_MCU1_AHB_CLK__MASK      (0x80000000U)\r\n#define CIU1_CIU_RST_SW1_MCU1_AHB_CLK__SHIFT     (31U)\r\n/*! MCU1_AHB_CLK_ - MCU1 AHB Soft Reset */\r\n#define CIU1_CIU_RST_SW1_MCU1_AHB_CLK_(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW1_MCU1_AHB_CLK__SHIFT)) & CIU1_CIU_RST_SW1_MCU1_AHB_CLK__MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_RST_SW2 - Software Module Reset */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_RST_SW2_W1_CLK__MASK            (0x1U)\r\n#define CIU1_CIU_RST_SW2_W1_CLK__SHIFT           (0U)\r\n/*! W1_CLK_ - W1 Interface (PM chip) Soft Reset */\r\n#define CIU1_CIU_RST_SW2_W1_CLK_(x)              (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW2_W1_CLK__SHIFT)) & CIU1_CIU_RST_SW2_W1_CLK__MASK)\r\n\r\n#define CIU1_CIU_RST_SW2_BRU_AHB1_CLK__MASK      (0x8U)\r\n#define CIU1_CIU_RST_SW2_BRU_AHB1_CLK__SHIFT     (3U)\r\n/*! BRU_AHB1_CLK_ - BRU_AHB1 Soft Reset */\r\n#define CIU1_CIU_RST_SW2_BRU_AHB1_CLK_(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW2_BRU_AHB1_CLK__SHIFT)) & CIU1_CIU_RST_SW2_BRU_AHB1_CLK__MASK)\r\n\r\n#define CIU1_CIU_RST_SW2_IPS_CLK__MASK           (0x2000U)\r\n#define CIU1_CIU_RST_SW2_IPS_CLK__SHIFT          (13U)\r\n/*! IPS_CLK_ - ips functional clock SW reset */\r\n#define CIU1_CIU_RST_SW2_IPS_CLK_(x)             (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW2_IPS_CLK__SHIFT)) & CIU1_CIU_RST_SW2_IPS_CLK__MASK)\r\n\r\n#define CIU1_CIU_RST_SW2_IPS_PROM_CLK__MASK      (0x4000U)\r\n#define CIU1_CIU_RST_SW2_IPS_PROM_CLK__SHIFT     (14U)\r\n/*! IPS_PROM_CLK_ - SW reset for ips_prom_clk */\r\n#define CIU1_CIU_RST_SW2_IPS_PROM_CLK_(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW2_IPS_PROM_CLK__SHIFT)) & CIU1_CIU_RST_SW2_IPS_PROM_CLK__MASK)\r\n\r\n#define CIU1_CIU_RST_SW2_WLAN_SUB_G2BIST_RSTB_MASK (0x8000U)\r\n#define CIU1_CIU_RST_SW2_WLAN_SUB_G2BIST_RSTB_SHIFT (15U)\r\n/*! WLAN_SUB_G2BIST_RSTB - SW reset for wlan sub-system g2bist controller */\r\n#define CIU1_CIU_RST_SW2_WLAN_SUB_G2BIST_RSTB(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW2_WLAN_SUB_G2BIST_RSTB_SHIFT)) & CIU1_CIU_RST_SW2_WLAN_SUB_G2BIST_RSTB_MASK)\r\n\r\n#define CIU1_CIU_RST_SW2_IPS_HCLK__MASK          (0x80000U)\r\n#define CIU1_CIU_RST_SW2_IPS_HCLK__SHIFT         (19U)\r\n/*! IPS_HCLK_ - ips block hresetn */\r\n#define CIU1_CIU_RST_SW2_IPS_HCLK_(x)            (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW2_IPS_HCLK__SHIFT)) & CIU1_CIU_RST_SW2_IPS_HCLK__MASK)\r\n\r\n#define CIU1_CIU_RST_SW2_CPU1_TCM__MASK          (0x400000U)\r\n#define CIU1_CIU_RST_SW2_CPU1_TCM__SHIFT         (22U)\r\n/*! CPU1_TCM_ - CPU1 TCM/DMA/Arbiter reset */\r\n#define CIU1_CIU_RST_SW2_CPU1_TCM_(x)            (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW2_CPU1_TCM__SHIFT)) & CIU1_CIU_RST_SW2_CPU1_TCM__MASK)\r\n\r\n#define CIU1_CIU_RST_SW2_APB__MASK               (0x800000U)\r\n#define CIU1_CIU_RST_SW2_APB__SHIFT              (23U)\r\n/*! APB_ - APB core clock Soft Reset (TBD_TREEPIE may not need this) */\r\n#define CIU1_CIU_RST_SW2_APB_(x)                 (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW2_APB__SHIFT)) & CIU1_CIU_RST_SW2_APB__MASK)\r\n\r\n#define CIU1_CIU_RST_SW2_WD1_CHIP_RST_DISABLE_MASK (0x10000000U)\r\n#define CIU1_CIU_RST_SW2_WD1_CHIP_RST_DISABLE_SHIFT (28U)\r\n/*! WD1_CHIP_RST_DISABLE - WD1 Chip Reset Disable Feature */\r\n#define CIU1_CIU_RST_SW2_WD1_CHIP_RST_DISABLE(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW2_WD1_CHIP_RST_DISABLE_SHIFT)) & CIU1_CIU_RST_SW2_WD1_CHIP_RST_DISABLE_MASK)\r\n\r\n#define CIU1_CIU_RST_SW2_WD1_CPU1_RST_DISABLE_MASK (0x20000000U)\r\n#define CIU1_CIU_RST_SW2_WD1_CPU1_RST_DISABLE_SHIFT (29U)\r\n/*! WD1_CPU1_RST_DISABLE - CPU1 Reset Disable Feature */\r\n#define CIU1_CIU_RST_SW2_WD1_CPU1_RST_DISABLE(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW2_WD1_CPU1_RST_DISABLE_SHIFT)) & CIU1_CIU_RST_SW2_WD1_CPU1_RST_DISABLE_MASK)\r\n\r\n#define CIU1_CIU_RST_SW2_CPU1_CORE__MASK         (0x40000000U)\r\n#define CIU1_CIU_RST_SW2_CPU1_CORE__SHIFT        (30U)\r\n/*! CPU1_CORE_ - CPU1 core reset */\r\n#define CIU1_CIU_RST_SW2_CPU1_CORE_(x)           (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW2_CPU1_CORE__SHIFT)) & CIU1_CIU_RST_SW2_CPU1_CORE__MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_RST_SW4 - Software Module Reset */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_RST_SW4_CPU1_DBG__MASK          (0x1U)\r\n#define CIU1_CIU_RST_SW4_CPU1_DBG__SHIFT         (0U)\r\n/*! CPU1_DBG_ - CPU1 debug logic soft reset. */\r\n#define CIU1_CIU_RST_SW4_CPU1_DBG_(x)            (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW4_CPU1_DBG__SHIFT)) & CIU1_CIU_RST_SW4_CPU1_DBG__MASK)\r\n\r\n#define CIU1_CIU_RST_SW4_CPU1_WATCHDOG__MASK     (0x2U)\r\n#define CIU1_CIU_RST_SW4_CPU1_WATCHDOG__SHIFT    (1U)\r\n/*! CPU1_WATCHDOG_ - CPU1 watchdog logic soft reset */\r\n#define CIU1_CIU_RST_SW4_CPU1_WATCHDOG_(x)       (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW4_CPU1_WATCHDOG__SHIFT)) & CIU1_CIU_RST_SW4_CPU1_WATCHDOG__MASK)\r\n\r\n#define CIU1_CIU_RST_SW4_CPU1_G2BIST__MASK       (0x8U)\r\n#define CIU1_CIU_RST_SW4_CPU1_G2BIST__SHIFT      (3U)\r\n/*! CPU1_G2BIST_ - CPU1 g2bist soft reset */\r\n#define CIU1_CIU_RST_SW4_CPU1_G2BIST_(x)         (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW4_CPU1_G2BIST__SHIFT)) & CIU1_CIU_RST_SW4_CPU1_G2BIST__MASK)\r\n\r\n#define CIU1_CIU_RST_SW4_CAU_SIF__MASK           (0x10U)\r\n#define CIU1_CIU_RST_SW4_CAU_SIF__SHIFT          (4U)\r\n/*! CAU_SIF_ - CAU sif clock Soft Reset */\r\n#define CIU1_CIU_RST_SW4_CAU_SIF_(x)             (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW4_CAU_SIF__SHIFT)) & CIU1_CIU_RST_SW4_CAU_SIF__MASK)\r\n\r\n#define CIU1_CIU_RST_SW4_CAU_SIF_AHB1_CLK__MASK  (0x20U)\r\n#define CIU1_CIU_RST_SW4_CAU_SIF_AHB1_CLK__SHIFT (5U)\r\n/*! CAU_SIF_AHB1_CLK_ - CAU sif ahb1 Clock Soft Reset */\r\n#define CIU1_CIU_RST_SW4_CAU_SIF_AHB1_CLK_(x)    (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW4_CAU_SIF_AHB1_CLK__SHIFT)) & CIU1_CIU_RST_SW4_CAU_SIF_AHB1_CLK__MASK)\r\n\r\n#define CIU1_CIU_RST_SW4_WLM_SYS_CLK__MASK       (0x200000U)\r\n#define CIU1_CIU_RST_SW4_WLM_SYS_CLK__SHIFT      (21U)\r\n/*! WLM_SYS_CLK_ - WLM SYS CLK Soft Reset */\r\n#define CIU1_CIU_RST_SW4_WLM_SYS_CLK_(x)         (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW4_WLM_SYS_CLK__SHIFT)) & CIU1_CIU_RST_SW4_WLM_SYS_CLK__MASK)\r\n\r\n#define CIU1_CIU_RST_SW4_WL_SYS_CLK__MASK        (0x400000U)\r\n#define CIU1_CIU_RST_SW4_WL_SYS_CLK__SHIFT       (22U)\r\n/*! WL_SYS_CLK_ - WL SYS CLK Soft Reset (Not used in Rendfinch) */\r\n#define CIU1_CIU_RST_SW4_WL_SYS_CLK_(x)          (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW4_WL_SYS_CLK__SHIFT)) & CIU1_CIU_RST_SW4_WL_SYS_CLK__MASK)\r\n\r\n#define CIU1_CIU_RST_SW4_MCU1_AHB_CLK_RETENTION__MASK (0x1000000U)\r\n#define CIU1_CIU_RST_SW4_MCU1_AHB_CLK_RETENTION__SHIFT (24U)\r\n/*! MCU1_AHB_CLK_RETENTION_ - MCU1 AHB Soft Retention Reset */\r\n#define CIU1_CIU_RST_SW4_MCU1_AHB_CLK_RETENTION_(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW4_MCU1_AHB_CLK_RETENTION__SHIFT)) & CIU1_CIU_RST_SW4_MCU1_AHB_CLK_RETENTION__MASK)\r\n\r\n#define CIU1_CIU_RST_SW4_MCU1_MCLK_RETENTION__MASK (0x2000000U)\r\n#define CIU1_CIU_RST_SW4_MCU1_MCLK_RETENTION__SHIFT (25U)\r\n/*! MCU1_MCLK_RETENTION_ - MCU1 MCLK domain retention reset */\r\n#define CIU1_CIU_RST_SW4_MCU1_MCLK_RETENTION_(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW4_MCU1_MCLK_RETENTION__SHIFT)) & CIU1_CIU_RST_SW4_MCU1_MCLK_RETENTION__MASK)\r\n\r\n#define CIU1_CIU_RST_SW4_MCU1_SYS_CLK_RETENTION__MASK (0x4000000U)\r\n#define CIU1_CIU_RST_SW4_MCU1_SYS_CLK_RETENTION__SHIFT (26U)\r\n/*! MCU1_SYS_CLK_RETENTION_ - MCU1 sysclk domain Soft Retention Reset */\r\n#define CIU1_CIU_RST_SW4_MCU1_SYS_CLK_RETENTION_(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW4_MCU1_SYS_CLK_RETENTION__SHIFT)) & CIU1_CIU_RST_SW4_MCU1_SYS_CLK_RETENTION__MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_RST_SW5 - Software Module Reset */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_RST_SW5_WL_MSC_A2A__MASK        (0x8U)\r\n#define CIU1_CIU_RST_SW5_WL_MSC_A2A__SHIFT       (3U)\r\n/*! WL_MSC_A2A_ - MSC a2a soft reset */\r\n#define CIU1_CIU_RST_SW5_WL_MSC_A2A_(x)          (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW5_WL_MSC_A2A__SHIFT)) & CIU1_CIU_RST_SW5_WL_MSC_A2A__MASK)\r\n\r\n#define CIU1_CIU_RST_SW5_WL_SOC_A2A__MASK        (0x10U)\r\n#define CIU1_CIU_RST_SW5_WL_SOC_A2A__SHIFT       (4U)\r\n/*! WL_SOC_A2A_ - SOC TOP a2a soft reset */\r\n#define CIU1_CIU_RST_SW5_WL_SOC_A2A_(x)          (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW5_WL_SOC_A2A__SHIFT)) & CIU1_CIU_RST_SW5_WL_SOC_A2A__MASK)\r\n\r\n#define CIU1_CIU_RST_SW5_SMU1_AHB_RST__MASK      (0x20U)\r\n#define CIU1_CIU_RST_SW5_SMU1_AHB_RST__SHIFT     (5U)\r\n/*! SMU1_AHB_RST_ - SW reset for smu1 ahb */\r\n#define CIU1_CIU_RST_SW5_SMU1_AHB_RST_(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW5_SMU1_AHB_RST__SHIFT)) & CIU1_CIU_RST_SW5_SMU1_AHB_RST__MASK)\r\n\r\n#define CIU1_CIU_RST_SW5_MCI_LITE2AHB_RST__MASK  (0x40U)\r\n#define CIU1_CIU_RST_SW5_MCI_LITE2AHB_RST__SHIFT (6U)\r\n/*! MCI_LITE2AHB_RST_ - SW reset to mci lite2ahb in wl_top */\r\n#define CIU1_CIU_RST_SW5_MCI_LITE2AHB_RST_(x)    (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW5_MCI_LITE2AHB_RST__SHIFT)) & CIU1_CIU_RST_SW5_MCI_LITE2AHB_RST__MASK)\r\n\r\n#define CIU1_CIU_RST_SW5_SMU1_CFG_RST__MASK      (0x80U)\r\n#define CIU1_CIU_RST_SW5_SMU1_CFG_RST__SHIFT     (7U)\r\n/*! SMU1_CFG_RST_ - SW reset for smu1 reg */\r\n#define CIU1_CIU_RST_SW5_SMU1_CFG_RST_(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW5_SMU1_CFG_RST__SHIFT)) & CIU1_CIU_RST_SW5_SMU1_CFG_RST__MASK)\r\n\r\n#define CIU1_CIU_RST_SW5_SMU1_UNGATED_CLK_RST__MASK (0x100U)\r\n#define CIU1_CIU_RST_SW5_SMU1_UNGATED_CLK_RST__SHIFT (8U)\r\n/*! SMU1_UNGATED_CLK_RST_ - SW reset for the NIC of smu1 */\r\n#define CIU1_CIU_RST_SW5_SMU1_UNGATED_CLK_RST_(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW5_SMU1_UNGATED_CLK_RST__SHIFT)) & CIU1_CIU_RST_SW5_SMU1_UNGATED_CLK_RST__MASK)\r\n\r\n#define CIU1_CIU_RST_SW5_GPS_PPS_RST__MASK       (0x200U)\r\n#define CIU1_CIU_RST_SW5_GPS_PPS_RST__SHIFT      (9U)\r\n/*! GPS_PPS_RST_ - SW Reset for the gps pss */\r\n#define CIU1_CIU_RST_SW5_GPS_PPS_RST_(x)         (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW5_GPS_PPS_RST__SHIFT)) & CIU1_CIU_RST_SW5_GPS_PPS_RST__MASK)\r\n\r\n#define CIU1_CIU_RST_SW5_MCI_WL_A2A_MHRESETN_MASK (0x400U)\r\n#define CIU1_CIU_RST_SW5_MCI_WL_A2A_MHRESETN_SHIFT (10U)\r\n/*! MCI_WL_A2A_MHRESETN - SW Reset for mci_wl_a2a_mhresetn */\r\n#define CIU1_CIU_RST_SW5_MCI_WL_A2A_MHRESETN(x)  (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW5_MCI_WL_A2A_MHRESETN_SHIFT)) & CIU1_CIU_RST_SW5_MCI_WL_A2A_MHRESETN_MASK)\r\n\r\n#define CIU1_CIU_RST_SW5_PTP_RST__MASK           (0x800U)\r\n#define CIU1_CIU_RST_SW5_PTP_RST__SHIFT          (11U)\r\n/*! PTP_RST_ - SW reset for ptp input capture logic */\r\n#define CIU1_CIU_RST_SW5_PTP_RST_(x)             (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_SW5_PTP_RST__SHIFT)) & CIU1_CIU_RST_SW5_PTP_RST__MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_RST_ECO_CTRL - Reset ECO Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_RST_ECO_CTRL_ECO_BITS_MASK      (0xFFFFFFFFU)\r\n#define CIU1_CIU_RST_ECO_CTRL_ECO_BITS_SHIFT     (0U)\r\n/*! ECO_BITS - ECO Bits */\r\n#define CIU1_CIU_RST_ECO_CTRL_ECO_BITS(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RST_ECO_CTRL_ECO_BITS_SHIFT)) & CIU1_CIU_RST_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_MEM_WRTC2 - Memory WRTC Control2 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_MEM_WRTC2_SMU1_RTC_MASK         (0x3000U)\r\n#define CIU1_CIU_MEM_WRTC2_SMU1_RTC_SHIFT        (12U)\r\n/*! SMU1_RTC - SMU1 SEG1 RTC */\r\n#define CIU1_CIU_MEM_WRTC2_SMU1_RTC(x)           (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC2_SMU1_RTC_SHIFT)) & CIU1_CIU_MEM_WRTC2_SMU1_RTC_MASK)\r\n\r\n#define CIU1_CIU_MEM_WRTC2_SMU1_WTC_MASK         (0xC000U)\r\n#define CIU1_CIU_MEM_WRTC2_SMU1_WTC_SHIFT        (14U)\r\n/*! SMU1_WTC - SMU1 SEG1 WTC */\r\n#define CIU1_CIU_MEM_WRTC2_SMU1_WTC(x)           (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC2_SMU1_WTC_SHIFT)) & CIU1_CIU_MEM_WRTC2_SMU1_WTC_MASK)\r\n\r\n#define CIU1_CIU_MEM_WRTC2_R1P_RTC_MASK          (0x30000U)\r\n#define CIU1_CIU_MEM_WRTC2_R1P_RTC_SHIFT         (16U)\r\n/*! R1P_RTC - Small Single Port SRAM RTC */\r\n#define CIU1_CIU_MEM_WRTC2_R1P_RTC(x)            (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC2_R1P_RTC_SHIFT)) & CIU1_CIU_MEM_WRTC2_R1P_RTC_MASK)\r\n\r\n#define CIU1_CIU_MEM_WRTC2_R1P_WTC_MASK          (0xC0000U)\r\n#define CIU1_CIU_MEM_WRTC2_R1P_WTC_SHIFT         (18U)\r\n/*! R1P_WTC - Small Single Port SRAM WTC */\r\n#define CIU1_CIU_MEM_WRTC2_R1P_WTC(x)            (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC2_R1P_WTC_SHIFT)) & CIU1_CIU_MEM_WRTC2_R1P_WTC_MASK)\r\n\r\n#define CIU1_CIU_MEM_WRTC2_R2P_RTC_MASK          (0x300000U)\r\n#define CIU1_CIU_MEM_WRTC2_R2P_RTC_SHIFT         (20U)\r\n/*! R2P_RTC - Small Dual Port SRAM RTC */\r\n#define CIU1_CIU_MEM_WRTC2_R2P_RTC(x)            (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC2_R2P_RTC_SHIFT)) & CIU1_CIU_MEM_WRTC2_R2P_RTC_MASK)\r\n\r\n#define CIU1_CIU_MEM_WRTC2_R2P_WTC_MASK          (0xC00000U)\r\n#define CIU1_CIU_MEM_WRTC2_R2P_WTC_SHIFT         (22U)\r\n/*! R2P_WTC - Small Dual Port SRAM WTC */\r\n#define CIU1_CIU_MEM_WRTC2_R2P_WTC(x)            (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC2_R2P_WTC_SHIFT)) & CIU1_CIU_MEM_WRTC2_R2P_WTC_MASK)\r\n\r\n#define CIU1_CIU_MEM_WRTC2_SMU1_SEG0_RTC_MASK    (0xC000000U)\r\n#define CIU1_CIU_MEM_WRTC2_SMU1_SEG0_RTC_SHIFT   (26U)\r\n/*! SMU1_SEG0_RTC - SMU1 SEG0 RTC */\r\n#define CIU1_CIU_MEM_WRTC2_SMU1_SEG0_RTC(x)      (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC2_SMU1_SEG0_RTC_SHIFT)) & CIU1_CIU_MEM_WRTC2_SMU1_SEG0_RTC_MASK)\r\n\r\n#define CIU1_CIU_MEM_WRTC2_SMU1_SEG0_WTC_MASK    (0xC0000000U)\r\n#define CIU1_CIU_MEM_WRTC2_SMU1_SEG0_WTC_SHIFT   (30U)\r\n/*! SMU1_SEG0_WTC - SMU1 SEG0 WTC */\r\n#define CIU1_CIU_MEM_WRTC2_SMU1_SEG0_WTC(x)      (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC2_SMU1_SEG0_WTC_SHIFT)) & CIU1_CIU_MEM_WRTC2_SMU1_SEG0_WTC_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_MEM_WRTC3 - Memory WRTC Control 3 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_MEM_WRTC3_WEU_ROM_RTC_MASK      (0x7U)\r\n#define CIU1_CIU_MEM_WRTC3_WEU_ROM_RTC_SHIFT     (0U)\r\n/*! WEU_ROM_RTC - WEU 256x15 ROM RTC */\r\n#define CIU1_CIU_MEM_WRTC3_WEU_ROM_RTC(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC3_WEU_ROM_RTC_SHIFT)) & CIU1_CIU_MEM_WRTC3_WEU_ROM_RTC_MASK)\r\n\r\n#define CIU1_CIU_MEM_WRTC3_WEU_ROM_RTC_REF_MASK  (0x30U)\r\n#define CIU1_CIU_MEM_WRTC3_WEU_ROM_RTC_REF_SHIFT (4U)\r\n/*! WEU_ROM_RTC_REF - WEU 256x16 ROM RTC_REF */\r\n#define CIU1_CIU_MEM_WRTC3_WEU_ROM_RTC_REF(x)    (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC3_WEU_ROM_RTC_REF_SHIFT)) & CIU1_CIU_MEM_WRTC3_WEU_ROM_RTC_REF_MASK)\r\n\r\n#define CIU1_CIU_MEM_WRTC3_CPU1_ITCM_RTC_MASK    (0xC0U)\r\n#define CIU1_CIU_MEM_WRTC3_CPU1_ITCM_RTC_SHIFT   (6U)\r\n/*! CPU1_ITCM_RTC - CPU1 ITCM RTC */\r\n#define CIU1_CIU_MEM_WRTC3_CPU1_ITCM_RTC(x)      (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC3_CPU1_ITCM_RTC_SHIFT)) & CIU1_CIU_MEM_WRTC3_CPU1_ITCM_RTC_MASK)\r\n\r\n#define CIU1_CIU_MEM_WRTC3_CPU1_ITCM_WTC_MASK    (0x300U)\r\n#define CIU1_CIU_MEM_WRTC3_CPU1_ITCM_WTC_SHIFT   (8U)\r\n/*! CPU1_ITCM_WTC - CPU1 ITCM WTC */\r\n#define CIU1_CIU_MEM_WRTC3_CPU1_ITCM_WTC(x)      (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC3_CPU1_ITCM_WTC_SHIFT)) & CIU1_CIU_MEM_WRTC3_CPU1_ITCM_WTC_MASK)\r\n\r\n#define CIU1_CIU_MEM_WRTC3_CPU1_DTCM_RTC_MASK    (0xC00U)\r\n#define CIU1_CIU_MEM_WRTC3_CPU1_DTCM_RTC_SHIFT   (10U)\r\n/*! CPU1_DTCM_RTC - CPU1 DTCM RTC */\r\n#define CIU1_CIU_MEM_WRTC3_CPU1_DTCM_RTC(x)      (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC3_CPU1_DTCM_RTC_SHIFT)) & CIU1_CIU_MEM_WRTC3_CPU1_DTCM_RTC_MASK)\r\n\r\n#define CIU1_CIU_MEM_WRTC3_CPU1_DTCM_WTC_MASK    (0x3000U)\r\n#define CIU1_CIU_MEM_WRTC3_CPU1_DTCM_WTC_SHIFT   (12U)\r\n/*! CPU1_DTCM_WTC - CPU1 DTCM WTC */\r\n#define CIU1_CIU_MEM_WRTC3_CPU1_DTCM_WTC(x)      (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC3_CPU1_DTCM_WTC_SHIFT)) & CIU1_CIU_MEM_WRTC3_CPU1_DTCM_WTC_MASK)\r\n\r\n#define CIU1_CIU_MEM_WRTC3_CPU1_ROM_RTC_MASK     (0x1C000U)\r\n#define CIU1_CIU_MEM_WRTC3_CPU1_ROM_RTC_SHIFT    (14U)\r\n/*! CPU1_ROM_RTC - CPU1 ROM RTC */\r\n#define CIU1_CIU_MEM_WRTC3_CPU1_ROM_RTC(x)       (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC3_CPU1_ROM_RTC_SHIFT)) & CIU1_CIU_MEM_WRTC3_CPU1_ROM_RTC_MASK)\r\n\r\n#define CIU1_CIU_MEM_WRTC3_CPU1_ROM_RTC_REF_MASK (0x60000U)\r\n#define CIU1_CIU_MEM_WRTC3_CPU1_ROM_RTC_REF_SHIFT (17U)\r\n/*! CPU1_ROM_RTC_REF - Cpu1 ROM RTC_REF */\r\n#define CIU1_CIU_MEM_WRTC3_CPU1_ROM_RTC_REF(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC3_CPU1_ROM_RTC_REF_SHIFT)) & CIU1_CIU_MEM_WRTC3_CPU1_ROM_RTC_REF_MASK)\r\n\r\n#define CIU1_CIU_MEM_WRTC3_IPS_IRAM_RTC_MASK     (0x180000U)\r\n#define CIU1_CIU_MEM_WRTC3_IPS_IRAM_RTC_SHIFT    (19U)\r\n/*! IPS_IRAM_RTC - IPS IRAM RTC */\r\n#define CIU1_CIU_MEM_WRTC3_IPS_IRAM_RTC(x)       (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC3_IPS_IRAM_RTC_SHIFT)) & CIU1_CIU_MEM_WRTC3_IPS_IRAM_RTC_MASK)\r\n\r\n#define CIU1_CIU_MEM_WRTC3_IPS_IRAM_WTC_MASK     (0x600000U)\r\n#define CIU1_CIU_MEM_WRTC3_IPS_IRAM_WTC_SHIFT    (21U)\r\n/*! IPS_IRAM_WTC - IPS IRAM WTC */\r\n#define CIU1_CIU_MEM_WRTC3_IPS_IRAM_WTC(x)       (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC3_IPS_IRAM_WTC_SHIFT)) & CIU1_CIU_MEM_WRTC3_IPS_IRAM_WTC_MASK)\r\n\r\n#define CIU1_CIU_MEM_WRTC3_IPS_PRAM_RTC_MASK     (0x1800000U)\r\n#define CIU1_CIU_MEM_WRTC3_IPS_PRAM_RTC_SHIFT    (23U)\r\n/*! IPS_PRAM_RTC - IPS PRAM RTC */\r\n#define CIU1_CIU_MEM_WRTC3_IPS_PRAM_RTC(x)       (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC3_IPS_PRAM_RTC_SHIFT)) & CIU1_CIU_MEM_WRTC3_IPS_PRAM_RTC_MASK)\r\n\r\n#define CIU1_CIU_MEM_WRTC3_IPS_PRAM_WTC_MASK     (0x6000000U)\r\n#define CIU1_CIU_MEM_WRTC3_IPS_PRAM_WTC_SHIFT    (25U)\r\n/*! IPS_PRAM_WTC - IPS PRAM WTC */\r\n#define CIU1_CIU_MEM_WRTC3_IPS_PRAM_WTC(x)       (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC3_IPS_PRAM_WTC_SHIFT)) & CIU1_CIU_MEM_WRTC3_IPS_PRAM_WTC_MASK)\r\n\r\n#define CIU1_CIU_MEM_WRTC3_IPS_PROM_RTC_MASK     (0x38000000U)\r\n#define CIU1_CIU_MEM_WRTC3_IPS_PROM_RTC_SHIFT    (27U)\r\n/*! IPS_PROM_RTC - IPS PROM RTC */\r\n#define CIU1_CIU_MEM_WRTC3_IPS_PROM_RTC(x)       (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC3_IPS_PROM_RTC_SHIFT)) & CIU1_CIU_MEM_WRTC3_IPS_PROM_RTC_MASK)\r\n\r\n#define CIU1_CIU_MEM_WRTC3_IPS_PROM_RTC_REF_MASK (0xC0000000U)\r\n#define CIU1_CIU_MEM_WRTC3_IPS_PROM_RTC_REF_SHIFT (30U)\r\n/*! IPS_PROM_RTC_REF - IPS PROM RTC_REF */\r\n#define CIU1_CIU_MEM_WRTC3_IPS_PROM_RTC_REF(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_WRTC3_IPS_PROM_RTC_REF_SHIFT)) & CIU1_CIU_MEM_WRTC3_IPS_PROM_RTC_REF_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_MEM_CTRL - Memory Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_MEM_CTRL_SMU1_DEBUG_ON_MASK     (0x20U)\r\n#define CIU1_CIU_MEM_CTRL_SMU1_DEBUG_ON_SHIFT    (5U)\r\n/*! SMU1_DEBUG_ON - 1= enable smu internal register latch for debug */\r\n#define CIU1_CIU_MEM_CTRL_SMU1_DEBUG_ON(x)       (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_CTRL_SMU1_DEBUG_ON_SHIFT)) & CIU1_CIU_MEM_CTRL_SMU1_DEBUG_ON_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_SMU1_DBG_STAT0 - SMU1 debug register0 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_SMU1_DBG_STAT0_SMU1_DBG_STAT0_MASK (0xFFFFFFFFU)\r\n#define CIU1_CIU_SMU1_DBG_STAT0_SMU1_DBG_STAT0_SHIFT (0U)\r\n/*! SMU1_DBG_STAT0 - smu1 debug addr output */\r\n#define CIU1_CIU_SMU1_DBG_STAT0_SMU1_DBG_STAT0(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_SMU1_DBG_STAT0_SMU1_DBG_STAT0_SHIFT)) & CIU1_CIU_SMU1_DBG_STAT0_SMU1_DBG_STAT0_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_SMU1_DBG_STAT1 - SMU1 debug register1 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_SMU1_DBG_STAT1_SMU1_DBG_STAT1_MASK (0xFFFFFFFFU)\r\n#define CIU1_CIU_SMU1_DBG_STAT1_SMU1_DBG_STAT1_SHIFT (0U)\r\n/*! SMU1_DBG_STAT1 - smu1 debug data output */\r\n#define CIU1_CIU_SMU1_DBG_STAT1_SMU1_DBG_STAT1(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_SMU1_DBG_STAT1_SMU1_DBG_STAT1_SHIFT)) & CIU1_CIU_SMU1_DBG_STAT1_SMU1_DBG_STAT1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_SMU1_DBG_STAT2 - SMU1 debug register2 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_SMU1_DBG_STAT2_SMU1_DBG_STAT2_MASK (0xFFFFFFFFU)\r\n#define CIU1_CIU_SMU1_DBG_STAT2_SMU1_DBG_STAT2_SHIFT (0U)\r\n/*! SMU1_DBG_STAT2 - smu1 debug ctrl output */\r\n#define CIU1_CIU_SMU1_DBG_STAT2_SMU1_DBG_STAT2(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_SMU1_DBG_STAT2_SMU1_DBG_STAT2_SHIFT)) & CIU1_CIU_SMU1_DBG_STAT2_SMU1_DBG_STAT2_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_MEM_ECO_CTRL - Memory ECO Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_MEM_ECO_CTRL_ECO_BITS_MASK      (0xFFFFFFFFU)\r\n#define CIU1_CIU_MEM_ECO_CTRL_ECO_BITS_SHIFT     (0U)\r\n/*! ECO_BITS - Reserved for ECOs */\r\n#define CIU1_CIU_MEM_ECO_CTRL_ECO_BITS(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MEM_ECO_CTRL_ECO_BITS_SHIFT)) & CIU1_CIU_MEM_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_INT_MASK - CIU1 Interrupt Mask */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_INT_MASK_PTP_INPUTCAPTURE_EVENT_INTR_MASK (0x2U)\r\n#define CIU1_CIU1_INT_MASK_PTP_INPUTCAPTURE_EVENT_INTR_SHIFT (1U)\r\n/*! PTP_INPUTCAPTURE_EVENT_INTR - PTP Input Capture Event Interrupt for Time Synchronization. In\r\n *    case of PTP mode input capture pulse from PAD or HMAC is used to latched PHC Value inside BBUD.\r\n *    On receiving this interrupt SW will read the PHC timestamp Value from BBUD register\r\n */\r\n#define CIU1_CIU1_INT_MASK_PTP_INPUTCAPTURE_EVENT_INTR(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_MASK_PTP_INPUTCAPTURE_EVENT_INTR_SHIFT)) & CIU1_CIU1_INT_MASK_PTP_INPUTCAPTURE_EVENT_INTR_MASK)\r\n\r\n#define CIU1_CIU1_INT_MASK_MCI_WL_WAKEUP_DONE_INT_MASK (0xCU)\r\n#define CIU1_CIU1_INT_MASK_MCI_WL_WAKEUP_DONE_INT_SHIFT (2U)\r\n/*! MCI_WL_WAKEUP_DONE_INT - Wake up Interrupt done, from MCI (CPU3) to WL (CPU1) */\r\n#define CIU1_CIU1_INT_MASK_MCI_WL_WAKEUP_DONE_INT(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_MASK_MCI_WL_WAKEUP_DONE_INT_SHIFT)) & CIU1_CIU1_INT_MASK_MCI_WL_WAKEUP_DONE_INT_MASK)\r\n\r\n#define CIU1_CIU1_INT_MASK_CPU1_TO_CPU3_MSG_DONE_MASK (0x10U)\r\n#define CIU1_CIU1_INT_MASK_CPU1_TO_CPU3_MSG_DONE_SHIFT (4U)\r\n/*! CPU1_TO_CPU3_MSG_DONE - CPU1 to CPU3 Message Done Interrupt. After CPU3 completed message\r\n *    processing requested by CPU1 it sends this interrupt to CPU1 by set 1 to CIU_CPU_CPU3_MSG_CTRL[8]\r\n */\r\n#define CIU1_CIU1_INT_MASK_CPU1_TO_CPU3_MSG_DONE(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_MASK_CPU1_TO_CPU3_MSG_DONE_SHIFT)) & CIU1_CIU1_INT_MASK_CPU1_TO_CPU3_MSG_DONE_MASK)\r\n\r\n#define CIU1_CIU1_INT_MASK_IMU13_CPU1_MSG_SPACE_AVAIL_IMU_MASK (0x20U)\r\n#define CIU1_CIU1_INT_MASK_IMU13_CPU1_MSG_SPACE_AVAIL_IMU_SHIFT (5U)\r\n/*! IMU13_CPU1_MSG_SPACE_AVAIL_IMU - CPU1 to CPU3 message FIFO space available for CPU1 to write more messages. (Not used) */\r\n#define CIU1_CIU1_INT_MASK_IMU13_CPU1_MSG_SPACE_AVAIL_IMU(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_MASK_IMU13_CPU1_MSG_SPACE_AVAIL_IMU_SHIFT)) & CIU1_CIU1_INT_MASK_IMU13_CPU1_MSG_SPACE_AVAIL_IMU_MASK)\r\n\r\n#define CIU1_CIU1_INT_MASK_CPU1_TO_CPU2_MSG_DONE_MASK (0x40U)\r\n#define CIU1_CIU1_INT_MASK_CPU1_TO_CPU2_MSG_DONE_SHIFT (6U)\r\n/*! CPU1_TO_CPU2_MSG_DONE - CPU1 to CPU2 Message Done Interrupt. After CPU2 completed message\r\n *    processing requested by CPU1 it sends this interrupt to CPU1 by set 1 to CIU_CPU_CPU2_MSG_CTRL[8]\r\n */\r\n#define CIU1_CIU1_INT_MASK_CPU1_TO_CPU2_MSG_DONE(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_MASK_CPU1_TO_CPU2_MSG_DONE_SHIFT)) & CIU1_CIU1_INT_MASK_CPU1_TO_CPU2_MSG_DONE_MASK)\r\n\r\n#define CIU1_CIU1_INT_MASK_IMU12_CPU1_MSG_SPACE_AVAIL_IMU_MASK (0x80U)\r\n#define CIU1_CIU1_INT_MASK_IMU12_CPU1_MSG_SPACE_AVAIL_IMU_SHIFT (7U)\r\n/*! IMU12_CPU1_MSG_SPACE_AVAIL_IMU - CPU1 to CPU2 message FIFO space available for CPU1 to write more messages.(Not used) */\r\n#define CIU1_CIU1_INT_MASK_IMU12_CPU1_MSG_SPACE_AVAIL_IMU(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_MASK_IMU12_CPU1_MSG_SPACE_AVAIL_IMU_SHIFT)) & CIU1_CIU1_INT_MASK_IMU12_CPU1_MSG_SPACE_AVAIL_IMU_MASK)\r\n\r\n#define CIU1_CIU1_INT_MASK_RFU_INT_2G_MASK       (0x100U)\r\n#define CIU1_CIU1_INT_MASK_RFU_INT_2G_SHIFT      (8U)\r\n/*! RFU_INT_2G - RFU2G interrupt */\r\n#define CIU1_CIU1_INT_MASK_RFU_INT_2G(x)         (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_MASK_RFU_INT_2G_SHIFT)) & CIU1_CIU1_INT_MASK_RFU_INT_2G_MASK)\r\n\r\n#define CIU1_CIU1_INT_MASK_RFU_INT_5G_A_MASK     (0x200U)\r\n#define CIU1_CIU1_INT_MASK_RFU_INT_5G_A_SHIFT    (9U)\r\n/*! RFU_INT_5G_A - RFU5G channel A interrupt */\r\n#define CIU1_CIU1_INT_MASK_RFU_INT_5G_A(x)       (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_MASK_RFU_INT_5G_A_SHIFT)) & CIU1_CIU1_INT_MASK_RFU_INT_5G_A_MASK)\r\n\r\n#define CIU1_CIU1_INT_MASK_GPS_INTR_CH_SW_EARLY_MASK (0x400U)\r\n#define CIU1_CIU1_INT_MASK_GPS_INTR_CH_SW_EARLY_SHIFT (10U)\r\n/*! GPS_INTR_CH_SW_EARLY - GPS PPS timer early interrupt */\r\n#define CIU1_CIU1_INT_MASK_GPS_INTR_CH_SW_EARLY(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_MASK_GPS_INTR_CH_SW_EARLY_SHIFT)) & CIU1_CIU1_INT_MASK_GPS_INTR_CH_SW_EARLY_MASK)\r\n\r\n#define CIU1_CIU1_INT_MASK_GPS_INTR_CH_SW_MASK   (0x800U)\r\n#define CIU1_CIU1_INT_MASK_GPS_INTR_CH_SW_SHIFT  (11U)\r\n/*! GPS_INTR_CH_SW - GPS PPS timer interrupt */\r\n#define CIU1_CIU1_INT_MASK_GPS_INTR_CH_SW(x)     (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_MASK_GPS_INTR_CH_SW_SHIFT)) & CIU1_CIU1_INT_MASK_GPS_INTR_CH_SW_MASK)\r\n\r\n#define CIU1_CIU1_INT_MASK_APU_INTR_BT_WAKEUP_MASK (0x1000U)\r\n#define CIU1_CIU1_INT_MASK_APU_INTR_BT_WAKEUP_SHIFT (12U)\r\n/*! APU_INTR_BT_WAKEUP - APU BT interrupt. This bit indicates that the BTU has encountered some\r\n *    event during hardware sleep and would like the firmware to intervene. During BT wake time, this\r\n *    interrupt path should not be taken. Refer to APU doc for more details on the sleep/wakeup\r\n *    interrupt split.\r\n */\r\n#define CIU1_CIU1_INT_MASK_APU_INTR_BT_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_MASK_APU_INTR_BT_WAKEUP_SHIFT)) & CIU1_CIU1_INT_MASK_APU_INTR_BT_WAKEUP_MASK)\r\n\r\n#define CIU1_CIU1_INT_MASK_APU_INTR_WLAN_WAKEUP1_MASK (0x2000U)\r\n#define CIU1_CIU1_INT_MASK_APU_INTR_WLAN_WAKEUP1_SHIFT (13U)\r\n/*! APU_INTR_WLAN_WAKEUP1 - APU WLAN1 interrupt. This bit indicates that the WLAN hardware needs to\r\n *    wakeup for an incoming beacon. During WLAN wake time, this interrupt path should not be taken.\r\n *    Refer to APU doc for more details on the sleep/wakeup interrupt split.\r\n */\r\n#define CIU1_CIU1_INT_MASK_APU_INTR_WLAN_WAKEUP1(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_MASK_APU_INTR_WLAN_WAKEUP1_SHIFT)) & CIU1_CIU1_INT_MASK_APU_INTR_WLAN_WAKEUP1_MASK)\r\n\r\n#define CIU1_CIU1_INT_MASK_APU_INTR_GEN_TIMER_WAKEUP_MASK (0x4000U)\r\n#define CIU1_CIU1_INT_MASK_APU_INTR_GEN_TIMER_WAKEUP_SHIFT (14U)\r\n/*! APU_INTR_GEN_TIMER_WAKEUP - APU beacon Timer wakeup interrupt */\r\n#define CIU1_CIU1_INT_MASK_APU_INTR_GEN_TIMER_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_MASK_APU_INTR_GEN_TIMER_WAKEUP_SHIFT)) & CIU1_CIU1_INT_MASK_APU_INTR_GEN_TIMER_WAKEUP_MASK)\r\n\r\n#define CIU1_CIU1_INT_MASK_APU_INTR_WAKEUP_MASK  (0x8000U)\r\n#define CIU1_CIU1_INT_MASK_APU_INTR_WAKEUP_SHIFT (15U)\r\n/*! APU_INTR_WAKEUP - APU default interrupt. The purpose of this interrupt is to catch any erroneous\r\n *    host wakeup case. In the event of an erroneous host wakeup, it is possible that the host\r\n *    wakeup interrupt will not assert. In order to ensure that the APU does not get stuck in some\r\n *    unknown state, this dummy interrupt will be thrown in it's place. Firmware should only care about\r\n *    this bit if no other interrupts are set in this register.\r\n */\r\n#define CIU1_CIU1_INT_MASK_APU_INTR_WAKEUP(x)    (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_MASK_APU_INTR_WAKEUP_SHIFT)) & CIU1_CIU1_INT_MASK_APU_INTR_WAKEUP_MASK)\r\n\r\n#define CIU1_CIU1_INT_MASK_APU_INTR_HOST_WAKEUP_MASK (0xFFFF0000U)\r\n#define CIU1_CIU1_INT_MASK_APU_INTR_HOST_WAKEUP_SHIFT (16U)\r\n/*! APU_INTR_HOST_WAKEUP - APU Host wakeup interrupt */\r\n#define CIU1_CIU1_INT_MASK_APU_INTR_HOST_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_MASK_APU_INTR_HOST_WAKEUP_SHIFT)) & CIU1_CIU1_INT_MASK_APU_INTR_HOST_WAKEUP_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_INT_SELECT - CIU1 Interrupt Select */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_INT_SELECT_SEL_MASK            (0xFFFFFFFFU)\r\n#define CIU1_CIU1_INT_SELECT_SEL_SHIFT           (0U)\r\n/*! SEL - Interrupt Read/Write Clear for CIU1 Interrupts */\r\n#define CIU1_CIU1_INT_SELECT_SEL(x)              (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_SELECT_SEL_SHIFT)) & CIU1_CIU1_INT_SELECT_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_INT_EVENT_MASK - CIU1 Interrupt Event Mask */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_INT_EVENT_MASK_PTP_INPUTCAPTURE_EVENT_INTR_MASK (0x2U)\r\n#define CIU1_CIU1_INT_EVENT_MASK_PTP_INPUTCAPTURE_EVENT_INTR_SHIFT (1U)\r\n/*! PTP_INPUTCAPTURE_EVENT_INTR - PTP Input Capture Event Interrupt for Time Synchronization. In\r\n *    case of PTP mode input capture pulse from PAD or HMAC is used to latched PHC Value inside BBUD.\r\n *    On receiving this interrupt SW will read the PHC timestamp Value from BBUD register\r\n */\r\n#define CIU1_CIU1_INT_EVENT_MASK_PTP_INPUTCAPTURE_EVENT_INTR(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_EVENT_MASK_PTP_INPUTCAPTURE_EVENT_INTR_SHIFT)) & CIU1_CIU1_INT_EVENT_MASK_PTP_INPUTCAPTURE_EVENT_INTR_MASK)\r\n\r\n#define CIU1_CIU1_INT_EVENT_MASK_MCI_WL_WAKEUP_DONE_INT_MASK (0xCU)\r\n#define CIU1_CIU1_INT_EVENT_MASK_MCI_WL_WAKEUP_DONE_INT_SHIFT (2U)\r\n/*! MCI_WL_WAKEUP_DONE_INT - Wake up Interrupt done, from MCI (CPU3) to WL (CPU1) */\r\n#define CIU1_CIU1_INT_EVENT_MASK_MCI_WL_WAKEUP_DONE_INT(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_EVENT_MASK_MCI_WL_WAKEUP_DONE_INT_SHIFT)) & CIU1_CIU1_INT_EVENT_MASK_MCI_WL_WAKEUP_DONE_INT_MASK)\r\n\r\n#define CIU1_CIU1_INT_EVENT_MASK_CPU1_TO_CPU3_MSG_DONE_MASK (0x10U)\r\n#define CIU1_CIU1_INT_EVENT_MASK_CPU1_TO_CPU3_MSG_DONE_SHIFT (4U)\r\n/*! CPU1_TO_CPU3_MSG_DONE - CPU1 to CPU3 Message Done Interrupt. After CPU3 completed message\r\n *    processing requested by CPU1 it sends this interrupt to CPU1 by set 1 to CIU_CPU_CPU3_MSG_CTRL[8]\r\n */\r\n#define CIU1_CIU1_INT_EVENT_MASK_CPU1_TO_CPU3_MSG_DONE(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_EVENT_MASK_CPU1_TO_CPU3_MSG_DONE_SHIFT)) & CIU1_CIU1_INT_EVENT_MASK_CPU1_TO_CPU3_MSG_DONE_MASK)\r\n\r\n#define CIU1_CIU1_INT_EVENT_MASK_IMU13_CPU1_MSG_SPACE_AVAIL_IMU_MASK (0x20U)\r\n#define CIU1_CIU1_INT_EVENT_MASK_IMU13_CPU1_MSG_SPACE_AVAIL_IMU_SHIFT (5U)\r\n/*! IMU13_CPU1_MSG_SPACE_AVAIL_IMU - CPU1 to CPU3 message FIFO space available for CPU1 to write more messages. (Not used) */\r\n#define CIU1_CIU1_INT_EVENT_MASK_IMU13_CPU1_MSG_SPACE_AVAIL_IMU(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_EVENT_MASK_IMU13_CPU1_MSG_SPACE_AVAIL_IMU_SHIFT)) & CIU1_CIU1_INT_EVENT_MASK_IMU13_CPU1_MSG_SPACE_AVAIL_IMU_MASK)\r\n\r\n#define CIU1_CIU1_INT_EVENT_MASK_CPU1_TO_CPU2_MSG_DONE_MASK (0x40U)\r\n#define CIU1_CIU1_INT_EVENT_MASK_CPU1_TO_CPU2_MSG_DONE_SHIFT (6U)\r\n/*! CPU1_TO_CPU2_MSG_DONE - CPU1 to CPU2 Message Done Interrupt. After CPU2 completed message\r\n *    processing requested by CPU1 it sends this interrupt to CPU1 by set 1 to CIU_CPU_CPU2_MSG_CTRL[8]\r\n */\r\n#define CIU1_CIU1_INT_EVENT_MASK_CPU1_TO_CPU2_MSG_DONE(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_EVENT_MASK_CPU1_TO_CPU2_MSG_DONE_SHIFT)) & CIU1_CIU1_INT_EVENT_MASK_CPU1_TO_CPU2_MSG_DONE_MASK)\r\n\r\n#define CIU1_CIU1_INT_EVENT_MASK_IMU12_CPU1_MSG_SPACE_AVAIL_IMU_MASK (0x80U)\r\n#define CIU1_CIU1_INT_EVENT_MASK_IMU12_CPU1_MSG_SPACE_AVAIL_IMU_SHIFT (7U)\r\n/*! IMU12_CPU1_MSG_SPACE_AVAIL_IMU - CPU1 to CPU2 message FIFO space available for CPU1 to write more messages.(Not used) */\r\n#define CIU1_CIU1_INT_EVENT_MASK_IMU12_CPU1_MSG_SPACE_AVAIL_IMU(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_EVENT_MASK_IMU12_CPU1_MSG_SPACE_AVAIL_IMU_SHIFT)) & CIU1_CIU1_INT_EVENT_MASK_IMU12_CPU1_MSG_SPACE_AVAIL_IMU_MASK)\r\n\r\n#define CIU1_CIU1_INT_EVENT_MASK_RFU_INT_2G_MASK (0x100U)\r\n#define CIU1_CIU1_INT_EVENT_MASK_RFU_INT_2G_SHIFT (8U)\r\n/*! RFU_INT_2G - RFU2G interrupt */\r\n#define CIU1_CIU1_INT_EVENT_MASK_RFU_INT_2G(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_EVENT_MASK_RFU_INT_2G_SHIFT)) & CIU1_CIU1_INT_EVENT_MASK_RFU_INT_2G_MASK)\r\n\r\n#define CIU1_CIU1_INT_EVENT_MASK_RFU_INT_5G_A_MASK (0x200U)\r\n#define CIU1_CIU1_INT_EVENT_MASK_RFU_INT_5G_A_SHIFT (9U)\r\n/*! RFU_INT_5G_A - RFU5G channel A interrupt */\r\n#define CIU1_CIU1_INT_EVENT_MASK_RFU_INT_5G_A(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_EVENT_MASK_RFU_INT_5G_A_SHIFT)) & CIU1_CIU1_INT_EVENT_MASK_RFU_INT_5G_A_MASK)\r\n\r\n#define CIU1_CIU1_INT_EVENT_MASK_GPS_INTR_CH_SW_EARLY_MASK (0x400U)\r\n#define CIU1_CIU1_INT_EVENT_MASK_GPS_INTR_CH_SW_EARLY_SHIFT (10U)\r\n/*! GPS_INTR_CH_SW_EARLY - GPS PPS timer early interrupt */\r\n#define CIU1_CIU1_INT_EVENT_MASK_GPS_INTR_CH_SW_EARLY(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_EVENT_MASK_GPS_INTR_CH_SW_EARLY_SHIFT)) & CIU1_CIU1_INT_EVENT_MASK_GPS_INTR_CH_SW_EARLY_MASK)\r\n\r\n#define CIU1_CIU1_INT_EVENT_MASK_GPS_INTR_CH_SW_MASK (0x800U)\r\n#define CIU1_CIU1_INT_EVENT_MASK_GPS_INTR_CH_SW_SHIFT (11U)\r\n/*! GPS_INTR_CH_SW - GPS PPS timer interrupt */\r\n#define CIU1_CIU1_INT_EVENT_MASK_GPS_INTR_CH_SW(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_EVENT_MASK_GPS_INTR_CH_SW_SHIFT)) & CIU1_CIU1_INT_EVENT_MASK_GPS_INTR_CH_SW_MASK)\r\n\r\n#define CIU1_CIU1_INT_EVENT_MASK_APU_INTR_BT_WAKEUP_MASK (0x1000U)\r\n#define CIU1_CIU1_INT_EVENT_MASK_APU_INTR_BT_WAKEUP_SHIFT (12U)\r\n/*! APU_INTR_BT_WAKEUP - APU BT interrupt. This bit indicates that the BTU has encountered some\r\n *    event during hardware sleep and would like the firmware to intervene. During BT wake time, this\r\n *    interrupt path should not be taken. Refer to APU doc for more details on the sleep/wakeup\r\n *    interrupt split.\r\n */\r\n#define CIU1_CIU1_INT_EVENT_MASK_APU_INTR_BT_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_EVENT_MASK_APU_INTR_BT_WAKEUP_SHIFT)) & CIU1_CIU1_INT_EVENT_MASK_APU_INTR_BT_WAKEUP_MASK)\r\n\r\n#define CIU1_CIU1_INT_EVENT_MASK_APU_INTR_WLAN_WAKEUP1_MASK (0x2000U)\r\n#define CIU1_CIU1_INT_EVENT_MASK_APU_INTR_WLAN_WAKEUP1_SHIFT (13U)\r\n/*! APU_INTR_WLAN_WAKEUP1 - APU WLAN1 interrupt. This bit indicates that the WLAN hardware needs to\r\n *    wakeup for an incoming beacon. During WLAN wake time, this interrupt path should not be taken.\r\n *    Refer to APU doc for more details on the sleep/wakeup interrupt split.\r\n */\r\n#define CIU1_CIU1_INT_EVENT_MASK_APU_INTR_WLAN_WAKEUP1(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_EVENT_MASK_APU_INTR_WLAN_WAKEUP1_SHIFT)) & CIU1_CIU1_INT_EVENT_MASK_APU_INTR_WLAN_WAKEUP1_MASK)\r\n\r\n#define CIU1_CIU1_INT_EVENT_MASK_APU_INTR_GEN_TIMER_WAKEUP_MASK (0x4000U)\r\n#define CIU1_CIU1_INT_EVENT_MASK_APU_INTR_GEN_TIMER_WAKEUP_SHIFT (14U)\r\n/*! APU_INTR_GEN_TIMER_WAKEUP - APU beacon Timer wakeup interrupt */\r\n#define CIU1_CIU1_INT_EVENT_MASK_APU_INTR_GEN_TIMER_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_EVENT_MASK_APU_INTR_GEN_TIMER_WAKEUP_SHIFT)) & CIU1_CIU1_INT_EVENT_MASK_APU_INTR_GEN_TIMER_WAKEUP_MASK)\r\n\r\n#define CIU1_CIU1_INT_EVENT_MASK_APU_INTR_WAKEUP_MASK (0x8000U)\r\n#define CIU1_CIU1_INT_EVENT_MASK_APU_INTR_WAKEUP_SHIFT (15U)\r\n/*! APU_INTR_WAKEUP - APU default interrupt. The purpose of this interrupt is to catch any erroneous\r\n *    host wakeup case. In the event of an erroneous host wakeup, it is possible that the host\r\n *    wakeup interrupt will not assert. In order to ensure that the APU does not get stuck in some\r\n *    unknown state, this dummy interrupt will be thrown in it's place. Firmware should only care about\r\n *    this bit if no other interrupts are set in this register.\r\n */\r\n#define CIU1_CIU1_INT_EVENT_MASK_APU_INTR_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_EVENT_MASK_APU_INTR_WAKEUP_SHIFT)) & CIU1_CIU1_INT_EVENT_MASK_APU_INTR_WAKEUP_MASK)\r\n\r\n#define CIU1_CIU1_INT_EVENT_MASK_APU_INTR_HOST_WAKEUP_MASK (0xFFFF0000U)\r\n#define CIU1_CIU1_INT_EVENT_MASK_APU_INTR_HOST_WAKEUP_SHIFT (16U)\r\n/*! APU_INTR_HOST_WAKEUP - APU Host wakeup interrupt */\r\n#define CIU1_CIU1_INT_EVENT_MASK_APU_INTR_HOST_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_EVENT_MASK_APU_INTR_HOST_WAKEUP_SHIFT)) & CIU1_CIU1_INT_EVENT_MASK_APU_INTR_HOST_WAKEUP_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_INT_STATUS - CIU1 Interrupt Status */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_INT_STATUS_PTP_INPUTCAPTURE_EVENT_INTR_MASK (0x2U)\r\n#define CIU1_CIU1_INT_STATUS_PTP_INPUTCAPTURE_EVENT_INTR_SHIFT (1U)\r\n/*! PTP_INPUTCAPTURE_EVENT_INTR - PTP Input Capture Event Interrupt for Time Synchronization. In\r\n *    case of PTP mode input capture pulse from PAD or HMAC is used to latched PHC Value inside BBUD.\r\n *    On receiving this interrupt SW will read the PHC timestamp Value from BBUD register\r\n */\r\n#define CIU1_CIU1_INT_STATUS_PTP_INPUTCAPTURE_EVENT_INTR(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_STATUS_PTP_INPUTCAPTURE_EVENT_INTR_SHIFT)) & CIU1_CIU1_INT_STATUS_PTP_INPUTCAPTURE_EVENT_INTR_MASK)\r\n\r\n#define CIU1_CIU1_INT_STATUS_MCI_WL_WAKEUP_DONE_INT_MASK (0xCU)\r\n#define CIU1_CIU1_INT_STATUS_MCI_WL_WAKEUP_DONE_INT_SHIFT (2U)\r\n/*! MCI_WL_WAKEUP_DONE_INT - Wake up Interrupt done, from MCI (CPU3) to WL (CPU1) */\r\n#define CIU1_CIU1_INT_STATUS_MCI_WL_WAKEUP_DONE_INT(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_STATUS_MCI_WL_WAKEUP_DONE_INT_SHIFT)) & CIU1_CIU1_INT_STATUS_MCI_WL_WAKEUP_DONE_INT_MASK)\r\n\r\n#define CIU1_CIU1_INT_STATUS_CPU1_TO_CPU3_MSG_DONE_MASK (0x10U)\r\n#define CIU1_CIU1_INT_STATUS_CPU1_TO_CPU3_MSG_DONE_SHIFT (4U)\r\n/*! CPU1_TO_CPU3_MSG_DONE - CPU1 to CPU3 Message Done Interrupt. After CPU3 completed message\r\n *    processing requested by CPU1 it sends this interrupt to CPU1 by set 1 to CIU_CPU_CPU3_MSG_CTRL[8]\r\n */\r\n#define CIU1_CIU1_INT_STATUS_CPU1_TO_CPU3_MSG_DONE(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_STATUS_CPU1_TO_CPU3_MSG_DONE_SHIFT)) & CIU1_CIU1_INT_STATUS_CPU1_TO_CPU3_MSG_DONE_MASK)\r\n\r\n#define CIU1_CIU1_INT_STATUS_IMU13_CPU1_MSG_SPACE_AVAIL_IMU_MASK (0x20U)\r\n#define CIU1_CIU1_INT_STATUS_IMU13_CPU1_MSG_SPACE_AVAIL_IMU_SHIFT (5U)\r\n/*! IMU13_CPU1_MSG_SPACE_AVAIL_IMU - CPU1 to CPU3 message FIFO space available for CPU1 to write more messages. (Not used) */\r\n#define CIU1_CIU1_INT_STATUS_IMU13_CPU1_MSG_SPACE_AVAIL_IMU(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_STATUS_IMU13_CPU1_MSG_SPACE_AVAIL_IMU_SHIFT)) & CIU1_CIU1_INT_STATUS_IMU13_CPU1_MSG_SPACE_AVAIL_IMU_MASK)\r\n\r\n#define CIU1_CIU1_INT_STATUS_CPU1_TO_CPU2_MSG_DONE_MASK (0x40U)\r\n#define CIU1_CIU1_INT_STATUS_CPU1_TO_CPU2_MSG_DONE_SHIFT (6U)\r\n/*! CPU1_TO_CPU2_MSG_DONE - CPU1 to CPU2 Message Done Interrupt. After CPU2 completed message\r\n *    processing requested by CPU1 it sends this interrupt to CPU1 by set 1 to CIU_CPU_CPU2_MSG_CTRL[8]\r\n */\r\n#define CIU1_CIU1_INT_STATUS_CPU1_TO_CPU2_MSG_DONE(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_STATUS_CPU1_TO_CPU2_MSG_DONE_SHIFT)) & CIU1_CIU1_INT_STATUS_CPU1_TO_CPU2_MSG_DONE_MASK)\r\n\r\n#define CIU1_CIU1_INT_STATUS_IMU12_CPU1_MSG_SPACE_AVAIL_IMU_MASK (0x80U)\r\n#define CIU1_CIU1_INT_STATUS_IMU12_CPU1_MSG_SPACE_AVAIL_IMU_SHIFT (7U)\r\n/*! IMU12_CPU1_MSG_SPACE_AVAIL_IMU - CPU1 to CPU2 message FIFO space available for CPU1 to write more messages.(Not used) */\r\n#define CIU1_CIU1_INT_STATUS_IMU12_CPU1_MSG_SPACE_AVAIL_IMU(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_STATUS_IMU12_CPU1_MSG_SPACE_AVAIL_IMU_SHIFT)) & CIU1_CIU1_INT_STATUS_IMU12_CPU1_MSG_SPACE_AVAIL_IMU_MASK)\r\n\r\n#define CIU1_CIU1_INT_STATUS_RFU_INT_2G_MASK     (0x100U)\r\n#define CIU1_CIU1_INT_STATUS_RFU_INT_2G_SHIFT    (8U)\r\n/*! RFU_INT_2G - RFU2G interrupt */\r\n#define CIU1_CIU1_INT_STATUS_RFU_INT_2G(x)       (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_STATUS_RFU_INT_2G_SHIFT)) & CIU1_CIU1_INT_STATUS_RFU_INT_2G_MASK)\r\n\r\n#define CIU1_CIU1_INT_STATUS_RFU_INT_5G_A_MASK   (0x200U)\r\n#define CIU1_CIU1_INT_STATUS_RFU_INT_5G_A_SHIFT  (9U)\r\n/*! RFU_INT_5G_A - RFU5G channel A interrupt */\r\n#define CIU1_CIU1_INT_STATUS_RFU_INT_5G_A(x)     (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_STATUS_RFU_INT_5G_A_SHIFT)) & CIU1_CIU1_INT_STATUS_RFU_INT_5G_A_MASK)\r\n\r\n#define CIU1_CIU1_INT_STATUS_GPS_INTR_CH_SW_EARLY_MASK (0x400U)\r\n#define CIU1_CIU1_INT_STATUS_GPS_INTR_CH_SW_EARLY_SHIFT (10U)\r\n/*! GPS_INTR_CH_SW_EARLY - GPS PPS timer early interrupt */\r\n#define CIU1_CIU1_INT_STATUS_GPS_INTR_CH_SW_EARLY(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_STATUS_GPS_INTR_CH_SW_EARLY_SHIFT)) & CIU1_CIU1_INT_STATUS_GPS_INTR_CH_SW_EARLY_MASK)\r\n\r\n#define CIU1_CIU1_INT_STATUS_GPS_INTR_CH_SW_MASK (0x800U)\r\n#define CIU1_CIU1_INT_STATUS_GPS_INTR_CH_SW_SHIFT (11U)\r\n/*! GPS_INTR_CH_SW - GPS PPS timer interrupt */\r\n#define CIU1_CIU1_INT_STATUS_GPS_INTR_CH_SW(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_STATUS_GPS_INTR_CH_SW_SHIFT)) & CIU1_CIU1_INT_STATUS_GPS_INTR_CH_SW_MASK)\r\n\r\n#define CIU1_CIU1_INT_STATUS_APU_INTR_BT_WAKEUP_MASK (0x1000U)\r\n#define CIU1_CIU1_INT_STATUS_APU_INTR_BT_WAKEUP_SHIFT (12U)\r\n/*! APU_INTR_BT_WAKEUP - APU BT interrupt. This bit indicates that the BTU has encountered some\r\n *    event during hardware sleep and would like the firmware to intervene. During BT wake time, this\r\n *    interrupt path should not be taken. Refer to APU doc for more details on the sleep/wakeup\r\n *    interrupt split.\r\n */\r\n#define CIU1_CIU1_INT_STATUS_APU_INTR_BT_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_STATUS_APU_INTR_BT_WAKEUP_SHIFT)) & CIU1_CIU1_INT_STATUS_APU_INTR_BT_WAKEUP_MASK)\r\n\r\n#define CIU1_CIU1_INT_STATUS_APU_INTR_WLAN_WAKEUP1_MASK (0x2000U)\r\n#define CIU1_CIU1_INT_STATUS_APU_INTR_WLAN_WAKEUP1_SHIFT (13U)\r\n/*! APU_INTR_WLAN_WAKEUP1 - APU WLAN1 interrupt. This bit indicates that the WLAN hardware needs to\r\n *    wakeup for an incoming beacon. During WLAN wake time, this interrupt path should not be taken.\r\n *    Refer to APU doc for more details on the sleep/wakeup interrupt split.\r\n */\r\n#define CIU1_CIU1_INT_STATUS_APU_INTR_WLAN_WAKEUP1(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_STATUS_APU_INTR_WLAN_WAKEUP1_SHIFT)) & CIU1_CIU1_INT_STATUS_APU_INTR_WLAN_WAKEUP1_MASK)\r\n\r\n#define CIU1_CIU1_INT_STATUS_APU_INTR_GEN_TIMER_WAKEUP_MASK (0x4000U)\r\n#define CIU1_CIU1_INT_STATUS_APU_INTR_GEN_TIMER_WAKEUP_SHIFT (14U)\r\n/*! APU_INTR_GEN_TIMER_WAKEUP - APU beacon Timer wakeup interrupt */\r\n#define CIU1_CIU1_INT_STATUS_APU_INTR_GEN_TIMER_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_STATUS_APU_INTR_GEN_TIMER_WAKEUP_SHIFT)) & CIU1_CIU1_INT_STATUS_APU_INTR_GEN_TIMER_WAKEUP_MASK)\r\n\r\n#define CIU1_CIU1_INT_STATUS_APU_INTR_WAKEUP_MASK (0x8000U)\r\n#define CIU1_CIU1_INT_STATUS_APU_INTR_WAKEUP_SHIFT (15U)\r\n/*! APU_INTR_WAKEUP - APU default interrupt. The purpose of this interrupt is to catch any erroneous\r\n *    host wakeup case. In the event of an erroneous host wakeup, it is possible that the host\r\n *    wakeup interrupt will not assert. In order to ensure that the APU does not get stuck in some\r\n *    unknown state, this dummy interrupt will be thrown in it's place. Firmware should only care about\r\n *    this bit if no other interrupts are set in this register.\r\n */\r\n#define CIU1_CIU1_INT_STATUS_APU_INTR_WAKEUP(x)  (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_STATUS_APU_INTR_WAKEUP_SHIFT)) & CIU1_CIU1_INT_STATUS_APU_INTR_WAKEUP_MASK)\r\n\r\n#define CIU1_CIU1_INT_STATUS_APU_INTR_HOST_WAKEUP_MASK (0xFFFF0000U)\r\n#define CIU1_CIU1_INT_STATUS_APU_INTR_HOST_WAKEUP_SHIFT (16U)\r\n/*! APU_INTR_HOST_WAKEUP - APU Host wakeup interrupt */\r\n#define CIU1_CIU1_INT_STATUS_APU_INTR_HOST_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_INT_STATUS_APU_INTR_HOST_WAKEUP_SHIFT)) & CIU1_CIU1_INT_STATUS_APU_INTR_HOST_WAKEUP_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_INT_HOST_CTRL - Host Interrupt Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_INT_HOST_CTRL_UART_RX_IDLE_STATE_DETECT_MODE_MASK (0x1U)\r\n#define CIU1_CIU_INT_HOST_CTRL_UART_RX_IDLE_STATE_DETECT_MODE_SHIFT (0U)\r\n/*! UART_RX_IDLE_STATE_DETECT_MODE - UART Rx IDLE State Detection Mode. */\r\n#define CIU1_CIU_INT_HOST_CTRL_UART_RX_IDLE_STATE_DETECT_MODE(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_INT_HOST_CTRL_UART_RX_IDLE_STATE_DETECT_MODE_SHIFT)) & CIU1_CIU_INT_HOST_CTRL_UART_RX_IDLE_STATE_DETECT_MODE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_BCA1_INT_MASK - BCA1 to CPU1 Interrupt Mask */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_BCA1_INT_MASK_IMR_MASK          (0xFFFFFFFFU)\r\n#define CIU1_CIU_BCA1_INT_MASK_IMR_SHIFT         (0U)\r\n/*! IMR - Interrupt Mask for BCA1 to CPU1 Interrupts */\r\n#define CIU1_CIU_BCA1_INT_MASK_IMR(x)            (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BCA1_INT_MASK_IMR_SHIFT)) & CIU1_CIU_BCA1_INT_MASK_IMR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_BCA1_INT_SELECT - BCA1 to CPU1 Interrupt Select */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_BCA1_INT_SELECT_RSR_MASK        (0xFFFFFFFFU)\r\n#define CIU1_CIU_BCA1_INT_SELECT_RSR_SHIFT       (0U)\r\n/*! RSR - Interrupt Read/Write Clear for BCA1 to CPU1 Interrupts */\r\n#define CIU1_CIU_BCA1_INT_SELECT_RSR(x)          (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BCA1_INT_SELECT_RSR_SHIFT)) & CIU1_CIU_BCA1_INT_SELECT_RSR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_BCA1_INT_EVENT_MASK - BCA1 to CPU1 Interrupt Event Mask */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_BCA1_INT_EVENT_MASK_SMR_MASK    (0xFFFFFFFFU)\r\n#define CIU1_CIU_BCA1_INT_EVENT_MASK_SMR_SHIFT   (0U)\r\n/*! SMR - Interrupt Event Mask for BCA1 to CPU1 Interrupts */\r\n#define CIU1_CIU_BCA1_INT_EVENT_MASK_SMR(x)      (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BCA1_INT_EVENT_MASK_SMR_SHIFT)) & CIU1_CIU_BCA1_INT_EVENT_MASK_SMR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_BCA1_INT_STATUS - BCA1 to CPU1 Interrupt Status */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_BCA1_INT_STATUS_ISR_MASK        (0xFFFFFFFFU)\r\n#define CIU1_CIU_BCA1_INT_STATUS_ISR_SHIFT       (0U)\r\n/*! ISR - BCA1 to CPU1 Interrupt Status */\r\n#define CIU1_CIU_BCA1_INT_STATUS_ISR(x)          (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BCA1_INT_STATUS_ISR_SHIFT)) & CIU1_CIU_BCA1_INT_STATUS_ISR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU1_ERR_INT_MASK - CPU1 ERR Interrupt Mask */\r\n/*! @{ */\r\n\r\n#define CIU1_CPU1_ERR_INT_MASK_MASK_MASK         (0xFFFFFFFFU)\r\n#define CIU1_CPU1_ERR_INT_MASK_MASK_SHIFT        (0U)\r\n/*! MASK - Interrupt Mask for CPU1 ERR Interrupts */\r\n#define CIU1_CPU1_ERR_INT_MASK_MASK(x)           (((uint32_t)(((uint32_t)(x)) << CIU1_CPU1_ERR_INT_MASK_MASK_SHIFT)) & CIU1_CPU1_ERR_INT_MASK_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU1_ERR_INT_SELECT - CPU1 ERR Interrupt Clear Select */\r\n/*! @{ */\r\n\r\n#define CIU1_CPU1_ERR_INT_SELECT_SEL_MASK        (0xFFFFFFFFU)\r\n#define CIU1_CPU1_ERR_INT_SELECT_SEL_SHIFT       (0U)\r\n/*! SEL - Interrupt Read/Write Clear for CPU1 ERR Interrupts */\r\n#define CIU1_CPU1_ERR_INT_SELECT_SEL(x)          (((uint32_t)(((uint32_t)(x)) << CIU1_CPU1_ERR_INT_SELECT_SEL_SHIFT)) & CIU1_CPU1_ERR_INT_SELECT_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU1_ERR_INT_EVENT_MASK - CPU1 ERR Interrupt Event Mask */\r\n/*! @{ */\r\n\r\n#define CIU1_CPU1_ERR_INT_EVENT_MASK_MASK_MASK   (0xFFFFFFFFU)\r\n#define CIU1_CPU1_ERR_INT_EVENT_MASK_MASK_SHIFT  (0U)\r\n/*! MASK - Interrupt Event Mask for CPU1 ERR Interrupts */\r\n#define CIU1_CPU1_ERR_INT_EVENT_MASK_MASK(x)     (((uint32_t)(((uint32_t)(x)) << CIU1_CPU1_ERR_INT_EVENT_MASK_MASK_SHIFT)) & CIU1_CPU1_ERR_INT_EVENT_MASK_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU1_ERR_INT_STATUS - CPU1 ERR Interrupt Status */\r\n/*! @{ */\r\n\r\n#define CIU1_CPU1_ERR_INT_STATUS_ERR_ISR_MASK    (0xFFFFFFFFU)\r\n#define CIU1_CPU1_ERR_INT_STATUS_ERR_ISR_SHIFT   (0U)\r\n/*! ERR_ISR - CPU1 ERR Interrupt Status (ISR) */\r\n#define CIU1_CPU1_ERR_INT_STATUS_ERR_ISR(x)      (((uint32_t)(((uint32_t)(x)) << CIU1_CPU1_ERR_INT_STATUS_ERR_ISR_SHIFT)) & CIU1_CPU1_ERR_INT_STATUS_ERR_ISR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_INT_CTRL - CPU2 INT control */\r\n/*! @{ */\r\n\r\n#define CIU1_CPU2_INT_CTRL_CPU2_SW_INT_MASK      (0x1U)\r\n#define CIU1_CPU2_INT_CTRL_CPU2_SW_INT_SHIFT     (0U)\r\n/*! CPU2_SW_INT - SW programmed interrupt register for cpu2. write 1 to generate interrupt to CPU2. */\r\n#define CIU1_CPU2_INT_CTRL_CPU2_SW_INT(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CPU2_INT_CTRL_CPU2_SW_INT_SHIFT)) & CIU1_CPU2_INT_CTRL_CPU2_SW_INT_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU3_INT_CTRL - CPU3 INT control */\r\n/*! @{ */\r\n\r\n#define CIU1_CPU3_INT_CTRL_CPU1_CPU3_GP_INT_MASK (0xFU)\r\n#define CIU1_CPU3_INT_CTRL_CPU1_CPU3_GP_INT_SHIFT (0U)\r\n/*! CPU1_CPU3_GP_INT - SW programmed interrupt register for cpu3. write 1 to generate interrupt to CPU3. */\r\n#define CIU1_CPU3_INT_CTRL_CPU1_CPU3_GP_INT(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CPU3_INT_CTRL_CPU1_CPU3_GP_INT_SHIFT)) & CIU1_CPU3_INT_CTRL_CPU1_CPU3_GP_INT_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_INT_ECO_CTRL - Interrupt ECO Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_INT_ECO_CTRL_ECO_BITS_MASK      (0xFFFFFFFFU)\r\n#define CIU1_CIU_INT_ECO_CTRL_ECO_BITS_SHIFT     (0U)\r\n/*! ECO_BITS - Reserved for ECOs */\r\n#define CIU1_CIU_INT_ECO_CTRL_ECO_BITS(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_INT_ECO_CTRL_ECO_BITS_SHIFT)) & CIU1_CIU_INT_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_PTP_CTRL - Vsensor and Vreg Pad Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_PTP_CTRL_MODE_EN_MASK           (0xFFU)\r\n#define CIU1_CIU_PTP_CTRL_MODE_EN_SHIFT          (0U)\r\n/*! MODE_EN - PTP mode enable in iomux (bitwise) */\r\n#define CIU1_CIU_PTP_CTRL_MODE_EN(x)             (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_PTP_CTRL_MODE_EN_SHIFT)) & CIU1_CIU_PTP_CTRL_MODE_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_RFU_DBC_MUX_SEL - RFU related DBC mux selection for different mode */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_A_MUX17_SEL_MASK (0x2U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_A_MUX17_SEL_SHIFT (1U)\r\n/*! RFU5G_A_MUX17_SEL - RFU 5G path A input selection from two bca */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_A_MUX17_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_A_MUX17_SEL_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_A_MUX17_SEL_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_B_MUX18_SEL_MASK (0x4U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_B_MUX18_SEL_SHIFT (2U)\r\n/*! RFU5G_B_MUX18_SEL - RFU 5G path B input selection from two bca */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_B_MUX18_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_B_MUX18_SEL_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_B_MUX18_SEL_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_A_MUX1_SEL_MASK (0x8U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_A_MUX1_SEL_SHIFT (3U)\r\n/*! RFU5G_A_MUX1_SEL - RFU 5G path A input selection from two bbud */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_A_MUX1_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_A_MUX1_SEL_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_A_MUX1_SEL_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_B_MUX2_SEL_MASK (0x10U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_B_MUX2_SEL_SHIFT (4U)\r\n/*! RFU5G_B_MUX2_SEL - RFU 5G path B input selection from two bbud */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_B_MUX2_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_B_MUX2_SEL_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_B_MUX2_SEL_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_A_MUX3_SEL_MASK (0x20U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_A_MUX3_SEL_SHIFT (5U)\r\n/*! RFU2G_A_MUX3_SEL - RFU 2G path A input selection from two bbud */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_A_MUX3_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_A_MUX3_SEL_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_A_MUX3_SEL_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_B_MUX4_SEL_MASK (0x40U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_B_MUX4_SEL_SHIFT (6U)\r\n/*! RFU2G_B_MUX4_SEL - RFU 2G path B input selection from two bbud */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_B_MUX4_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_B_MUX4_SEL_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_B_MUX4_SEL_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD1_A_MUX5_SEL_MASK (0x80U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD1_A_MUX5_SEL_SHIFT (7U)\r\n/*! BBUD1_A_MUX5_SEL - bbud1 path A input selection from two RFU */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD1_A_MUX5_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_BBUD1_A_MUX5_SEL_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_BBUD1_A_MUX5_SEL_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD1_B_MUX6_SEL_MASK (0x100U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD1_B_MUX6_SEL_SHIFT (8U)\r\n/*! BBUD1_B_MUX6_SEL - bbud1 path B input selection from two RFU */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD1_B_MUX6_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_BBUD1_B_MUX6_SEL_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_BBUD1_B_MUX6_SEL_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD2_B_MUX7_SEL_MASK (0x200U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD2_B_MUX7_SEL_SHIFT (9U)\r\n/*! BBUD2_B_MUX7_SEL - bbud2 path B input selection from two RFU */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD2_B_MUX7_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_BBUD2_B_MUX7_SEL_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_BBUD2_B_MUX7_SEL_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD2_A_MUX8_SEL_MASK (0x400U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD2_A_MUX8_SEL_SHIFT (10U)\r\n/*! BBUD2_A_MUX8_SEL - bbud2 path A input selection from two RFU */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD2_A_MUX8_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_BBUD2_A_MUX8_SEL_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_BBUD2_A_MUX8_SEL_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_A_MUX13_SEL_0_MASK (0x1800U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_A_MUX13_SEL_0_SHIFT (11U)\r\n/*! RFU5G_A_MUX13_SEL_0 - RFU 5G path A PE1/PE2/PAPE input selection from two mac */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_A_MUX13_SEL_0(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_A_MUX13_SEL_0_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_A_MUX13_SEL_0_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_B_MUX14_SEL_0_MASK (0x6000U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_B_MUX14_SEL_0_SHIFT (13U)\r\n/*! RFU5G_B_MUX14_SEL_0 - RFU 5G path B PE1/PE2/PAPE input selection from two mac */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_B_MUX14_SEL_0(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_B_MUX14_SEL_0_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_B_MUX14_SEL_0_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_A_MUX15_SEL_0_MASK (0x18000U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_A_MUX15_SEL_0_SHIFT (15U)\r\n/*! RFU2G_A_MUX15_SEL_0 - RFU 2G path A PE1/PE2/PAPE input selection from two mac */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_A_MUX15_SEL_0(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_A_MUX15_SEL_0_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_A_MUX15_SEL_0_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_B_MUX16_SEL_0_MASK (0x60000U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_B_MUX16_SEL_0_SHIFT (17U)\r\n/*! RFU2G_B_MUX16_SEL_0 - RFU 2G path B PE1/PE2/PAPE input selection from two mac */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_B_MUX16_SEL_0(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_B_MUX16_SEL_0_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_B_MUX16_SEL_0_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_A_MUX13_SEL_1_MASK (0x80000U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_A_MUX13_SEL_1_SHIFT (19U)\r\n/*! RFU5G_A_MUX13_SEL_1 - RFU 5G path A other input selection from two mac */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_A_MUX13_SEL_1(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_A_MUX13_SEL_1_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_A_MUX13_SEL_1_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_B_MUX14_SEL_1_MASK (0x100000U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_B_MUX14_SEL_1_SHIFT (20U)\r\n/*! RFU5G_B_MUX14_SEL_1 - RFU 5G path B other input selection from two mac */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_B_MUX14_SEL_1(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_B_MUX14_SEL_1_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_RFU5G_B_MUX14_SEL_1_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_A_MUX15_SEL_1_MASK (0x200000U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_A_MUX15_SEL_1_SHIFT (21U)\r\n/*! RFU2G_A_MUX15_SEL_1 - RFU 2G path A other input selection from two mac */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_A_MUX15_SEL_1(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_A_MUX15_SEL_1_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_A_MUX15_SEL_1_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_B_MUX16_SEL_1_MASK (0x400000U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_B_MUX16_SEL_1_SHIFT (22U)\r\n/*! RFU2G_B_MUX16_SEL_1 - RFU 2G path B other input selection from two mac */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_B_MUX16_SEL_1(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_B_MUX16_SEL_1_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_RFU2G_B_MUX16_SEL_1_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD1_TRX_RDY_A_SEL_MASK (0x1800000U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD1_TRX_RDY_A_SEL_SHIFT (23U)\r\n/*! BBUD1_TRX_RDY_A_SEL - bbud1_RFU_RDY_A and bbud1_RFU_INC_CAL_A selection */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD1_TRX_RDY_A_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_BBUD1_TRX_RDY_A_SEL_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_BBUD1_TRX_RDY_A_SEL_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD2_TRX_RDY_SEL_MASK (0x6000000U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD2_TRX_RDY_SEL_SHIFT (25U)\r\n/*! BBUD2_TRX_RDY_SEL - bbud2_RFU_RDY and bbud2_RFU_INC_CAL selection */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD2_TRX_RDY_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_BBUD2_TRX_RDY_SEL_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_BBUD2_TRX_RDY_SEL_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD1_TRX_RDY_B_SEL_MASK (0x18000000U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD1_TRX_RDY_B_SEL_SHIFT (27U)\r\n/*! BBUD1_TRX_RDY_B_SEL - bbud1_RFU_RDY_E and bbud1_RFU_INC_CAL_E selection */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BBUD1_TRX_RDY_B_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_BBUD1_TRX_RDY_B_SEL_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_BBUD1_TRX_RDY_B_SEL_MASK)\r\n\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BRF_TXPWR_SEL_MASK (0x80000000U)\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BRF_TXPWR_SEL_SHIFT (31U)\r\n/*! BRF_TXPWR_SEL - SOC_BRF_PE1/2_2G and SOC_BRF_TXPWR_2G selection */\r\n#define CIU1_CIU_RFU_DBC_MUX_SEL_BRF_TXPWR_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_DBC_MUX_SEL_BRF_TXPWR_SEL_SHIFT)) & CIU1_CIU_RFU_DBC_MUX_SEL_BRF_TXPWR_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_BCA_DBC_MUX_SEL - BCA related DBC mux selection for different mode */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_BCA1_MUX11_SEL_MASK (0x1U)\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_BCA1_MUX11_SEL_SHIFT (0U)\r\n/*! BCA1_MUX11_SEL - bca1 input selection from two mcu */\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_BCA1_MUX11_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BCA_DBC_MUX_SEL_BCA1_MUX11_SEL_SHIFT)) & CIU1_CIU_BCA_DBC_MUX_SEL_BCA1_MUX11_SEL_MASK)\r\n\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_BCA2_MUX12_SEL_MASK (0x2U)\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_BCA2_MUX12_SEL_SHIFT (1U)\r\n/*! BCA2_MUX12_SEL - bca2 input selection from two mcu */\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_BCA2_MUX12_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BCA_DBC_MUX_SEL_BCA2_MUX12_SEL_SHIFT)) & CIU1_CIU_BCA_DBC_MUX_SEL_BCA2_MUX12_SEL_MASK)\r\n\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_MCU1_MUX9_SEL_MASK (0x4U)\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_MCU1_MUX9_SEL_SHIFT (2U)\r\n/*! MCU1_MUX9_SEL - mcu1 input selection from two bca */\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_MCU1_MUX9_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BCA_DBC_MUX_SEL_MCU1_MUX9_SEL_SHIFT)) & CIU1_CIU_BCA_DBC_MUX_SEL_MCU1_MUX9_SEL_MASK)\r\n\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_MCU2_MUX10_SEL_MASK (0x8U)\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_MCU2_MUX10_SEL_SHIFT (3U)\r\n/*! MCU2_MUX10_SEL - mcu2 input selection from two bca */\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_MCU2_MUX10_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BCA_DBC_MUX_SEL_MCU2_MUX10_SEL_SHIFT)) & CIU1_CIU_BCA_DBC_MUX_SEL_MCU2_MUX10_SEL_MASK)\r\n\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_BCA1_MUX19_SEL_MASK (0x30U)\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_BCA1_MUX19_SEL_SHIFT (4U)\r\n/*! BCA1_MUX19_SEL - bca1 ros cal input selection from two RFU */\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_BCA1_MUX19_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BCA_DBC_MUX_SEL_BCA1_MUX19_SEL_SHIFT)) & CIU1_CIU_BCA_DBC_MUX_SEL_BCA1_MUX19_SEL_MASK)\r\n\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_BCA2_MUX20_SEL_MASK (0xC0U)\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_BCA2_MUX20_SEL_SHIFT (6U)\r\n/*! BCA2_MUX20_SEL - bca2 ros cal input selection from two RFU */\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_BCA2_MUX20_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BCA_DBC_MUX_SEL_BCA2_MUX20_SEL_SHIFT)) & CIU1_CIU_BCA_DBC_MUX_SEL_BCA2_MUX20_SEL_MASK)\r\n\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_BCA1_EPA_BYPASS_SEL_MASK (0x100U)\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_BCA1_EPA_BYPASS_SEL_SHIFT (8U)\r\n/*! BCA1_EPA_BYPASS_SEL - bca1 epa_bypass signal selction from two RFU */\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_BCA1_EPA_BYPASS_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BCA_DBC_MUX_SEL_BCA1_EPA_BYPASS_SEL_SHIFT)) & CIU1_CIU_BCA_DBC_MUX_SEL_BCA1_EPA_BYPASS_SEL_MASK)\r\n\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_BCA2_EPA_BYPASS_SEL_MASK (0x200U)\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_BCA2_EPA_BYPASS_SEL_SHIFT (9U)\r\n/*! BCA2_EPA_BYPASS_SEL - bca2 epa_bypass signal selction from two RFU */\r\n#define CIU1_CIU_BCA_DBC_MUX_SEL_BCA2_EPA_BYPASS_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BCA_DBC_MUX_SEL_BCA2_EPA_BYPASS_SEL_SHIFT)) & CIU1_CIU_BCA_DBC_MUX_SEL_BCA2_EPA_BYPASS_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_TST_G2BIST_STATUS - WL G2BIST Status */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_TST_G2BIST_STATUS_WL_G2B_STATUS_MASK (0xFU)\r\n#define CIU1_CIU_TST_G2BIST_STATUS_WL_G2B_STATUS_SHIFT (0U)\r\n/*! WL_G2B_STATUS - Redundant Bist Selection */\r\n#define CIU1_CIU_TST_G2BIST_STATUS_WL_G2B_STATUS(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_TST_G2BIST_STATUS_WL_G2B_STATUS_SHIFT)) & CIU1_CIU_TST_G2BIST_STATUS_WL_G2B_STATUS_MASK)\r\n\r\n#define CIU1_CIU_TST_G2BIST_STATUS_WL_G2B_FINISH_MASK (0x10U)\r\n#define CIU1_CIU_TST_G2BIST_STATUS_WL_G2B_FINISH_SHIFT (4U)\r\n/*! WL_G2B_FINISH - WL Bist Done */\r\n#define CIU1_CIU_TST_G2BIST_STATUS_WL_G2B_FINISH(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_TST_G2BIST_STATUS_WL_G2B_FINISH_SHIFT)) & CIU1_CIU_TST_G2BIST_STATUS_WL_G2B_FINISH_MASK)\r\n\r\n#define CIU1_CIU_TST_G2BIST_STATUS_MAC1_G2B_FINISH_MASK (0x20U)\r\n#define CIU1_CIU_TST_G2BIST_STATUS_MAC1_G2B_FINISH_SHIFT (5U)\r\n/*! MAC1_G2B_FINISH - MAC1 Bist Done */\r\n#define CIU1_CIU_TST_G2BIST_STATUS_MAC1_G2B_FINISH(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_TST_G2BIST_STATUS_MAC1_G2B_FINISH_SHIFT)) & CIU1_CIU_TST_G2BIST_STATUS_MAC1_G2B_FINISH_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_TST_MBIST_READY - MBIST Status (BIST_READY) */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_TST_MBIST_READY_BIST_READY_MASK (0xFFFFFFFFU)\r\n#define CIU1_CIU_TST_MBIST_READY_BIST_READY_SHIFT (0U)\r\n/*! BIST_READY - Bist ready[31:0] */\r\n#define CIU1_CIU_TST_MBIST_READY_BIST_READY(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_TST_MBIST_READY_BIST_READY_SHIFT)) & CIU1_CIU_TST_MBIST_READY_BIST_READY_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_TST_MBIST_FAIL - MBIST Status (BIST_FAIL) */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_TST_MBIST_FAIL_BIST_FAIL_MASK   (0xFFFFFFFFU)\r\n#define CIU1_CIU_TST_MBIST_FAIL_BIST_FAIL_SHIFT  (0U)\r\n/*! BIST_FAIL - Bist Fail[31:0] */\r\n#define CIU1_CIU_TST_MBIST_FAIL_BIST_FAIL(x)     (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_TST_MBIST_FAIL_BIST_FAIL_SHIFT)) & CIU1_CIU_TST_MBIST_FAIL_BIST_FAIL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_TST_TSTBUS_CTRL2 - Testbux Mux Control2 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_TST_TSTBUS_CTRL2_SMU_DEBUG_SEL_MASK (0xF8U)\r\n#define CIU1_CIU_TST_TSTBUS_CTRL2_SMU_DEBUG_SEL_SHIFT (3U)\r\n/*! SMU_DEBUG_SEL - SMU1/SMU2 Debug Select */\r\n#define CIU1_CIU_TST_TSTBUS_CTRL2_SMU_DEBUG_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_TST_TSTBUS_CTRL2_SMU_DEBUG_SEL_SHIFT)) & CIU1_CIU_TST_TSTBUS_CTRL2_SMU_DEBUG_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_TST_CTRL - Test Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_TST_CTRL_BBU_TEST_MODE_EN_MASK  (0x200000U)\r\n#define CIU1_CIU_TST_CTRL_BBU_TEST_MODE_EN_SHIFT (21U)\r\n/*! BBU_TEST_MODE_EN - Baseband Test Mode Enable */\r\n#define CIU1_CIU_TST_CTRL_BBU_TEST_MODE_EN(x)    (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_TST_CTRL_BBU_TEST_MODE_EN_SHIFT)) & CIU1_CIU_TST_CTRL_BBU_TEST_MODE_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_TST_ECO_CTRL - Test ECO Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_TST_ECO_CTRL_ECO_BITS_MASK      (0xFFFFFFFFU)\r\n#define CIU1_CIU_TST_ECO_CTRL_ECO_BITS_SHIFT     (0U)\r\n/*! ECO_BITS - Reserved for ECOs */\r\n#define CIU1_CIU_TST_ECO_CTRL_ECO_BITS(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_TST_ECO_CTRL_ECO_BITS_SHIFT)) & CIU1_CIU_TST_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_GPS_GPIO_MASK - GPS GPIO MASK */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_GPS_GPIO_MASK_GPIO2GPS_PPS_MASK_MASK (0xFFFFFFFFU)\r\n#define CIU1_CIU_GPS_GPIO_MASK_GPIO2GPS_PPS_MASK_SHIFT (0U)\r\n/*! GPIO2GPS_PPS_MASK - gpio to gps pps mask. '1' is to enable the gpio bit as PPS. Only 1 bit can be set */\r\n#define CIU1_CIU_GPS_GPIO_MASK_GPIO2GPS_PPS_MASK(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_GPS_GPIO_MASK_GPIO2GPS_PPS_MASK_SHIFT)) & CIU1_CIU_GPS_GPIO_MASK_GPIO2GPS_PPS_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_GPS_SW_PERIOD - GPS SWITCH CHANNEL PERIOD */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_GPS_SW_PERIOD_CH_SW_PERIOD_MASK (0x1FFFFFU)\r\n#define CIU1_CIU_GPS_SW_PERIOD_CH_SW_PERIOD_SHIFT (0U)\r\n/*! CH_SW_PERIOD - period for channel switch. default to 50 ms */\r\n#define CIU1_CIU_GPS_SW_PERIOD_CH_SW_PERIOD(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_GPS_SW_PERIOD_CH_SW_PERIOD_SHIFT)) & CIU1_CIU_GPS_SW_PERIOD_CH_SW_PERIOD_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_GPS_SW_EARLY - GPS SWITCH CHANNEL EARLY */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_GPS_SW_EARLY_CH_SW_EARLY_TIME_MASK (0xFFFFU)\r\n#define CIU1_CIU_GPS_SW_EARLY_CH_SW_EARLY_TIME_SHIFT (0U)\r\n/*! CH_SW_EARLY_TIME - time offset from switch channel. default to 1 ms */\r\n#define CIU1_CIU_GPS_SW_EARLY_CH_SW_EARLY_TIME(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_GPS_SW_EARLY_CH_SW_EARLY_TIME_SHIFT)) & CIU1_CIU_GPS_SW_EARLY_CH_SW_EARLY_TIME_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_GPS_TMR_RD - GPS TIMER READ */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_GPS_TMR_RD_GPS_PPS_TMR_STATUS_MASK (0x3FFFFFU)\r\n#define CIU1_CIU_GPS_TMR_RD_GPS_PPS_TMR_STATUS_SHIFT (0U)\r\n/*! GPS_PPS_TMR_STATUS - gps pps timer status read */\r\n#define CIU1_CIU_GPS_TMR_RD_GPS_PPS_TMR_STATUS(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_GPS_TMR_RD_GPS_PPS_TMR_STATUS_SHIFT)) & CIU1_CIU_GPS_TMR_RD_GPS_PPS_TMR_STATUS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_LDO_ECO_CTRL - LDO ECO Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_LDO_ECO_CTRL_ECO_BITS_MASK      (0xFFFFFFFFU)\r\n#define CIU1_CIU_LDO_ECO_CTRL_ECO_BITS_SHIFT     (0U)\r\n/*! ECO_BITS - Reserved for ECOs */\r\n#define CIU1_CIU_LDO_ECO_CTRL_ECO_BITS(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_LDO_ECO_CTRL_ECO_BITS_SHIFT)) & CIU1_CIU_LDO_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_AXI_CLK_CTRL2 - AXI clk bypass contrl2 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_M_WIP_CG_BYPASS_VAL_MASK (0x1U)\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_M_WIP_CG_BYPASS_VAL_SHIFT (0U)\r\n/*! WLM_M_WIP_CG_BYPASS_VAL - AXI Clock gate enable value if bypass is enable. */\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_M_WIP_CG_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_AXI_CLK_CTRL2_WLM_M_WIP_CG_BYPASS_VAL_SHIFT)) & CIU1_CIU_AXI_CLK_CTRL2_WLM_M_WIP_CG_BYPASS_VAL_MASK)\r\n\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_M_WIP_CG_BYPASS_EN_MASK (0x2U)\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_M_WIP_CG_BYPASS_EN_SHIFT (1U)\r\n/*! WLM_M_WIP_CG_BYPASS_EN - AXI Dynamic Clock gating Bypass for WEU */\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_M_WIP_CG_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_AXI_CLK_CTRL2_WLM_M_WIP_CG_BYPASS_EN_SHIFT)) & CIU1_CIU_AXI_CLK_CTRL2_WLM_M_WIP_CG_BYPASS_EN_MASK)\r\n\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_M_TBUS_CG_BYPASS_VAL_MASK (0x4U)\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_M_TBUS_CG_BYPASS_VAL_SHIFT (2U)\r\n/*! WLM_M_TBUS_CG_BYPASS_VAL - AXI Clock gate enable value if bypass is enable. */\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_M_TBUS_CG_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_AXI_CLK_CTRL2_WLM_M_TBUS_CG_BYPASS_VAL_SHIFT)) & CIU1_CIU_AXI_CLK_CTRL2_WLM_M_TBUS_CG_BYPASS_VAL_MASK)\r\n\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_M_TBUS_CG_BYPASS_EN_MASK (0x8U)\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_M_TBUS_CG_BYPASS_EN_SHIFT (3U)\r\n/*! WLM_M_TBUS_CG_BYPASS_EN - AXI Dynamic Clock gating Bypass for BBUd SQU Testbus master */\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_M_TBUS_CG_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_AXI_CLK_CTRL2_WLM_M_TBUS_CG_BYPASS_EN_SHIFT)) & CIU1_CIU_AXI_CLK_CTRL2_WLM_M_TBUS_CG_BYPASS_EN_MASK)\r\n\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_MCU1_64B_CG_BYPASS_VAL_MASK (0x10U)\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_MCU1_64B_CG_BYPASS_VAL_SHIFT (4U)\r\n/*! WLM_MCU1_64B_CG_BYPASS_VAL - AXI Clock gate enable value for HMAC if bypass is enable. */\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_MCU1_64B_CG_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_AXI_CLK_CTRL2_WLM_MCU1_64B_CG_BYPASS_VAL_SHIFT)) & CIU1_CIU_AXI_CLK_CTRL2_WLM_MCU1_64B_CG_BYPASS_VAL_MASK)\r\n\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_MCU1_64B_CG_BYPASS_EN_MASK (0x20U)\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_MCU1_64B_CG_BYPASS_EN_SHIFT (5U)\r\n/*! WLM_MCU1_64B_CG_BYPASS_EN - AXI Dynamic Clock gating Bypass for HMAC */\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_MCU1_64B_CG_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_AXI_CLK_CTRL2_WLM_MCU1_64B_CG_BYPASS_EN_SHIFT)) & CIU1_CIU_AXI_CLK_CTRL2_WLM_MCU1_64B_CG_BYPASS_EN_MASK)\r\n\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_S_WL_CG_BYPASS_VAL_MASK (0x40U)\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_S_WL_CG_BYPASS_VAL_SHIFT (6U)\r\n/*! WLM_S_WL_CG_BYPASS_VAL - wlm_soc_wl_cg_bypass_val */\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_S_WL_CG_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_AXI_CLK_CTRL2_WLM_S_WL_CG_BYPASS_VAL_SHIFT)) & CIU1_CIU_AXI_CLK_CTRL2_WLM_S_WL_CG_BYPASS_VAL_MASK)\r\n\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_S_WL_CG_BYPASS_EN_MASK (0x80U)\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_S_WL_CG_BYPASS_EN_SHIFT (7U)\r\n/*! WLM_S_WL_CG_BYPASS_EN - wlm_soc_wl_cg_bypass_en */\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_S_WL_CG_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_AXI_CLK_CTRL2_WLM_S_WL_CG_BYPASS_EN_SHIFT)) & CIU1_CIU_AXI_CLK_CTRL2_WLM_S_WL_CG_BYPASS_EN_MASK)\r\n\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_GPV_CG_BYPASS_VAL_MASK (0x100U)\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_GPV_CG_BYPASS_VAL_SHIFT (8U)\r\n/*! WLM_GPV_CG_BYPASS_VAL - wlm_gpv_cg_bypass_val */\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_GPV_CG_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_AXI_CLK_CTRL2_WLM_GPV_CG_BYPASS_VAL_SHIFT)) & CIU1_CIU_AXI_CLK_CTRL2_WLM_GPV_CG_BYPASS_VAL_MASK)\r\n\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_GPV_CG_BYPASS_EN_MASK (0x200U)\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_GPV_CG_BYPASS_EN_SHIFT (9U)\r\n/*! WLM_GPV_CG_BYPASS_EN - wlm_gpv_cg_bypass_en */\r\n#define CIU1_CIU_AXI_CLK_CTRL2_WLM_GPV_CG_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_AXI_CLK_CTRL2_WLM_GPV_CG_BYPASS_EN_SHIFT)) & CIU1_CIU_AXI_CLK_CTRL2_WLM_GPV_CG_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_FABRIC_TESTBUS_CTRL - fabric(scm, wlm) testbus select */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_FABRIC_TESTBUS_CTRL_WLM_HIGH_TESTBUS_SEL_MASK (0x3F0000U)\r\n#define CIU1_CIU_FABRIC_TESTBUS_CTRL_WLM_HIGH_TESTBUS_SEL_SHIFT (16U)\r\n/*! WLM_HIGH_TESTBUS_SEL - testbus select for smu1_nic_testbus[15:8] */\r\n#define CIU1_CIU_FABRIC_TESTBUS_CTRL_WLM_HIGH_TESTBUS_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_FABRIC_TESTBUS_CTRL_WLM_HIGH_TESTBUS_SEL_SHIFT)) & CIU1_CIU_FABRIC_TESTBUS_CTRL_WLM_HIGH_TESTBUS_SEL_MASK)\r\n\r\n#define CIU1_CIU_FABRIC_TESTBUS_CTRL_WLM_LOW_TESTBUS_SEL_MASK (0x3F000000U)\r\n#define CIU1_CIU_FABRIC_TESTBUS_CTRL_WLM_LOW_TESTBUS_SEL_SHIFT (24U)\r\n/*! WLM_LOW_TESTBUS_SEL - testbus select for smu1_nic_testbus[7:0] */\r\n#define CIU1_CIU_FABRIC_TESTBUS_CTRL_WLM_LOW_TESTBUS_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_FABRIC_TESTBUS_CTRL_WLM_LOW_TESTBUS_SEL_SHIFT)) & CIU1_CIU_FABRIC_TESTBUS_CTRL_WLM_LOW_TESTBUS_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_FABRIC_CREQ_DLY_TIMER - fabric(scm, wlm) delay timer for c_req */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_FABRIC_CREQ_DLY_TIMER_WLM_CREQ_DLY_TIMER_MASK (0x3FF00000U)\r\n#define CIU1_CIU_FABRIC_CREQ_DLY_TIMER_WLM_CREQ_DLY_TIMER_SHIFT (20U)\r\n/*! WLM_CREQ_DLY_TIMER - wlm delay timer for c_req */\r\n#define CIU1_CIU_FABRIC_CREQ_DLY_TIMER_WLM_CREQ_DLY_TIMER(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_FABRIC_CREQ_DLY_TIMER_WLM_CREQ_DLY_TIMER_SHIFT)) & CIU1_CIU_FABRIC_CREQ_DLY_TIMER_WLM_CREQ_DLY_TIMER_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_ABU_ECO_CTRL - ABU ECO Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_ABU_ECO_CTRL_ECO_BITS_MASK      (0xFFFFFFFFU)\r\n#define CIU1_CIU_ABU_ECO_CTRL_ECO_BITS_SHIFT     (0U)\r\n/*! ECO_BITS - Reserved for ECOs */\r\n#define CIU1_CIU_ABU_ECO_CTRL_ECO_BITS(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_ABU_ECO_CTRL_ECO_BITS_SHIFT)) & CIU1_CIU_ABU_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_AHB1_TO_CLEAR - AHB1 timeout logic clear register */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_AHB1_TO_CLEAR_AHB1_TIMEOUT_CLEAR_MASK (0x1U)\r\n#define CIU1_CIU1_AHB1_TO_CLEAR_AHB1_TIMEOUT_CLEAR_SHIFT (0U)\r\n/*! AHB1_TIMEOUT_CLEAR - After the timeout happened on AHB1 bus, the cpu will read the ERR ISR and\r\n *    read the bus state which cause the timeout and then set this bit to 1 to clear the AHB1 timeout\r\n *    logic to start recroding next transaction. This is self clearing bit\r\n */\r\n#define CIU1_CIU1_AHB1_TO_CLEAR_AHB1_TIMEOUT_CLEAR(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_AHB1_TO_CLEAR_AHB1_TIMEOUT_CLEAR_SHIFT)) & CIU1_CIU1_AHB1_TO_CLEAR_AHB1_TIMEOUT_CLEAR_MASK)\r\n\r\n#define CIU1_CIU1_AHB1_TO_CLEAR_CPU1_DCODE_INV_ADDR_CLR_MASK (0x2U)\r\n#define CIU1_CIU1_AHB1_TO_CLEAR_CPU1_DCODE_INV_ADDR_CLR_SHIFT (1U)\r\n/*! CPU1_DCODE_INV_ADDR_CLR - After the invalid address int happened on CPU1 dcode bus, the cpu1\r\n *    will read the ERR ISR and read the bus state which cause the timeout and then set this bit to 1\r\n *    to clear the CPU1 Dcode invalid addr logic to start recroding next transaction. This is self\r\n *    clearing bit\r\n */\r\n#define CIU1_CIU1_AHB1_TO_CLEAR_CPU1_DCODE_INV_ADDR_CLR(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_AHB1_TO_CLEAR_CPU1_DCODE_INV_ADDR_CLR_SHIFT)) & CIU1_CIU1_AHB1_TO_CLEAR_CPU1_DCODE_INV_ADDR_CLR_MASK)\r\n\r\n#define CIU1_CIU1_AHB1_TO_CLEAR_CPU1_ICODE_INV_ADDR_CLR_MASK (0x4U)\r\n#define CIU1_CIU1_AHB1_TO_CLEAR_CPU1_ICODE_INV_ADDR_CLR_SHIFT (2U)\r\n/*! CPU1_ICODE_INV_ADDR_CLR - After the invalid address int happened on CPU1 icode bus, the cpu1\r\n *    will read the ERR ISR and read the bus state which cause the timeout and then set this bit to 1\r\n *    to clear the CPU1 Icode invalid addr logic to start recroding next transaction. This is self\r\n *    clearing bit\r\n */\r\n#define CIU1_CIU1_AHB1_TO_CLEAR_CPU1_ICODE_INV_ADDR_CLR(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_AHB1_TO_CLEAR_CPU1_ICODE_INV_ADDR_CLR_SHIFT)) & CIU1_CIU1_AHB1_TO_CLEAR_CPU1_ICODE_INV_ADDR_CLR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_ARB_TO_LAST_ADDR - AHB Timeout Last Address */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_ARB_TO_LAST_ADDR_ADDRESS_MASK   (0xFFFFFFFFU)\r\n#define CIU1_CIU_ARB_TO_LAST_ADDR_ADDRESS_SHIFT  (0U)\r\n/*! ADDRESS - Last AHB1 Address Right Before the Current Timeout */\r\n#define CIU1_CIU_ARB_TO_LAST_ADDR_ADDRESS(x)     (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_ARB_TO_LAST_ADDR_ADDRESS_SHIFT)) & CIU1_CIU_ARB_TO_LAST_ADDR_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_ARB_TO_CUR_ADDR - AHB Current Timeout Address */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_ARB_TO_CUR_ADDR_ADDRESS_MASK    (0xFFFFFFFFU)\r\n#define CIU1_CIU_ARB_TO_CUR_ADDR_ADDRESS_SHIFT   (0U)\r\n/*! ADDRESS - Current_TO_Addr */\r\n#define CIU1_CIU_ARB_TO_CUR_ADDR_ADDRESS(x)      (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_ARB_TO_CUR_ADDR_ADDRESS_SHIFT)) & CIU1_CIU_ARB_TO_CUR_ADDR_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_ARB_CTRL - AHB ARB Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_ARB_CTRL_CURRENT_TO_SLAVE_ID_MASK (0xFU)\r\n#define CIU1_CIU_ARB_CTRL_CURRENT_TO_SLAVE_ID_SHIFT (0U)\r\n/*! CURRENT_TO_SLAVE_ID - Current_TO_Slave_ID */\r\n#define CIU1_CIU_ARB_CTRL_CURRENT_TO_SLAVE_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_ARB_CTRL_CURRENT_TO_SLAVE_ID_SHIFT)) & CIU1_CIU_ARB_CTRL_CURRENT_TO_SLAVE_ID_MASK)\r\n\r\n#define CIU1_CIU_ARB_CTRL_LAST_TO_SLAVE_ID_MASK  (0xF0U)\r\n#define CIU1_CIU_ARB_CTRL_LAST_TO_SLAVE_ID_SHIFT (4U)\r\n/*! LAST_TO_SLAVE_ID - Last_TO_Slave_ID */\r\n#define CIU1_CIU_ARB_CTRL_LAST_TO_SLAVE_ID(x)    (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_ARB_CTRL_LAST_TO_SLAVE_ID_SHIFT)) & CIU1_CIU_ARB_CTRL_LAST_TO_SLAVE_ID_MASK)\r\n\r\n#define CIU1_CIU_ARB_CTRL_CURRENT_TO_MASTER_ID_MASK (0x700U)\r\n#define CIU1_CIU_ARB_CTRL_CURRENT_TO_MASTER_ID_SHIFT (8U)\r\n/*! CURRENT_TO_MASTER_ID - Current_TO_Master_ID */\r\n#define CIU1_CIU_ARB_CTRL_CURRENT_TO_MASTER_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_ARB_CTRL_CURRENT_TO_MASTER_ID_SHIFT)) & CIU1_CIU_ARB_CTRL_CURRENT_TO_MASTER_ID_MASK)\r\n\r\n#define CIU1_CIU_ARB_CTRL_LAST_TO_MASTER_ID_MASK (0x3800U)\r\n#define CIU1_CIU_ARB_CTRL_LAST_TO_MASTER_ID_SHIFT (11U)\r\n/*! LAST_TO_MASTER_ID - Last_TO_Master_ID */\r\n#define CIU1_CIU_ARB_CTRL_LAST_TO_MASTER_ID(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_ARB_CTRL_LAST_TO_MASTER_ID_SHIFT)) & CIU1_CIU_ARB_CTRL_LAST_TO_MASTER_ID_MASK)\r\n\r\n#define CIU1_CIU_ARB_CTRL_AHB1_SMU1_MEM_PROT_DIS_MASK (0x10000U)\r\n#define CIU1_CIU_ARB_CTRL_AHB1_SMU1_MEM_PROT_DIS_SHIFT (16U)\r\n/*! AHB1_SMU1_MEM_PROT_DIS - Disable SMU1 Memory Protection from AHB2 side */\r\n#define CIU1_CIU_ARB_CTRL_AHB1_SMU1_MEM_PROT_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_ARB_CTRL_AHB1_SMU1_MEM_PROT_DIS_SHIFT)) & CIU1_CIU_ARB_CTRL_AHB1_SMU1_MEM_PROT_DIS_MASK)\r\n\r\n#define CIU1_CIU_ARB_CTRL_AHB1_CPU1_IMEM_PROT_DIS_MASK (0x20000U)\r\n#define CIU1_CIU_ARB_CTRL_AHB1_CPU1_IMEM_PROT_DIS_SHIFT (17U)\r\n/*! AHB1_CPU1_IMEM_PROT_DIS - 1 = Disable CPU1 Imem Memory Protection from AHB1 side and allow AHB1 to read/write Imem */\r\n#define CIU1_CIU_ARB_CTRL_AHB1_CPU1_IMEM_PROT_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_ARB_CTRL_AHB1_CPU1_IMEM_PROT_DIS_SHIFT)) & CIU1_CIU_ARB_CTRL_AHB1_CPU1_IMEM_PROT_DIS_MASK)\r\n\r\n#define CIU1_CIU_ARB_CTRL_AHB1_CPU1_DMEM_PROT_DIS_MASK (0x40000U)\r\n#define CIU1_CIU_ARB_CTRL_AHB1_CPU1_DMEM_PROT_DIS_SHIFT (18U)\r\n/*! AHB1_CPU1_DMEM_PROT_DIS - 1 = Disable CPU1 Dmem Memory Protection from AHB1 side and allow AHB1 to read/write Dmem */\r\n#define CIU1_CIU_ARB_CTRL_AHB1_CPU1_DMEM_PROT_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_ARB_CTRL_AHB1_CPU1_DMEM_PROT_DIS_SHIFT)) & CIU1_CIU_ARB_CTRL_AHB1_CPU1_DMEM_PROT_DIS_MASK)\r\n\r\n#define CIU1_CIU_ARB_CTRL_AHB1_A2A_PROT_DIS_MASK (0x80000U)\r\n#define CIU1_CIU_ARB_CTRL_AHB1_A2A_PROT_DIS_SHIFT (19U)\r\n/*! AHB1_A2A_PROT_DIS - 1 = Disable A2A Memory Protection from AHB1 side and allow AHB1 to A2A */\r\n#define CIU1_CIU_ARB_CTRL_AHB1_A2A_PROT_DIS(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_ARB_CTRL_AHB1_A2A_PROT_DIS_SHIFT)) & CIU1_CIU_ARB_CTRL_AHB1_A2A_PROT_DIS_MASK)\r\n\r\n#define CIU1_CIU_ARB_CTRL_ARB_TIMEOUT_MODE_MASK  (0xC0000000U)\r\n#define CIU1_CIU_ARB_CTRL_ARB_TIMEOUT_MODE_SHIFT (30U)\r\n/*! ARB_TIMEOUT_MODE - AHB1_TimeoutMode[1:0] */\r\n#define CIU1_CIU_ARB_CTRL_ARB_TIMEOUT_MODE(x)    (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_ARB_CTRL_ARB_TIMEOUT_MODE_SHIFT)) & CIU1_CIU_ARB_CTRL_ARB_TIMEOUT_MODE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_CPU1_ICODE_INV_ADDR_CTRL - CPU1 Icode invalid address access control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_CPU1_ICODE_INV_ADDR_CTRL_LAST2_INV_ADDR_SLAVE_ID_MASK (0xFU)\r\n#define CIU1_CIU1_CPU1_ICODE_INV_ADDR_CTRL_LAST2_INV_ADDR_SLAVE_ID_SHIFT (0U)\r\n/*! LAST2_INV_ADDR_SLAVE_ID - Last2_inv_addr_Slave_ID */\r\n#define CIU1_CIU1_CPU1_ICODE_INV_ADDR_CTRL_LAST2_INV_ADDR_SLAVE_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_CPU1_ICODE_INV_ADDR_CTRL_LAST2_INV_ADDR_SLAVE_ID_SHIFT)) & CIU1_CIU1_CPU1_ICODE_INV_ADDR_CTRL_LAST2_INV_ADDR_SLAVE_ID_MASK)\r\n\r\n#define CIU1_CIU1_CPU1_ICODE_INV_ADDR_CTRL_LAST_INV_ADDR_SLAVE_ID_MASK (0xF0U)\r\n#define CIU1_CIU1_CPU1_ICODE_INV_ADDR_CTRL_LAST_INV_ADDR_SLAVE_ID_SHIFT (4U)\r\n/*! LAST_INV_ADDR_SLAVE_ID - Last_inv_addr_Slave_ID */\r\n#define CIU1_CIU1_CPU1_ICODE_INV_ADDR_CTRL_LAST_INV_ADDR_SLAVE_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_CPU1_ICODE_INV_ADDR_CTRL_LAST_INV_ADDR_SLAVE_ID_SHIFT)) & CIU1_CIU1_CPU1_ICODE_INV_ADDR_CTRL_LAST_INV_ADDR_SLAVE_ID_MASK)\r\n\r\n#define CIU1_CIU1_CPU1_ICODE_INV_ADDR_CTRL_CUR_INV_ADDR_SLAVE_ID_MASK (0xF00U)\r\n#define CIU1_CIU1_CPU1_ICODE_INV_ADDR_CTRL_CUR_INV_ADDR_SLAVE_ID_SHIFT (8U)\r\n/*! CUR_INV_ADDR_SLAVE_ID - Cur_inv_addr_Slave_ID */\r\n#define CIU1_CIU1_CPU1_ICODE_INV_ADDR_CTRL_CUR_INV_ADDR_SLAVE_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_CPU1_ICODE_INV_ADDR_CTRL_CUR_INV_ADDR_SLAVE_ID_SHIFT)) & CIU1_CIU1_CPU1_ICODE_INV_ADDR_CTRL_CUR_INV_ADDR_SLAVE_ID_MASK)\r\n\r\n#define CIU1_CIU1_CPU1_ICODE_INV_ADDR_CTRL_HADDR_ICOD_SEL_MASK (0xC0000000U)\r\n#define CIU1_CIU1_CPU1_ICODE_INV_ADDR_CTRL_HADDR_ICOD_SEL_SHIFT (30U)\r\n/*! HADDR_ICOD_SEL - There are 3 haddr which can be observed by selecting this: */\r\n#define CIU1_CIU1_CPU1_ICODE_INV_ADDR_CTRL_HADDR_ICOD_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_CPU1_ICODE_INV_ADDR_CTRL_HADDR_ICOD_SEL_SHIFT)) & CIU1_CIU1_CPU1_ICODE_INV_ADDR_CTRL_HADDR_ICOD_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_CPU1_ICODE_INV_ADDR - CPU1 Icode invalid address */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_CPU1_ICODE_INV_ADDR_HADDR_INV_ADDR_MASK (0xFFFFFFFFU)\r\n#define CIU1_CIU1_CPU1_ICODE_INV_ADDR_HADDR_INV_ADDR_SHIFT (0U)\r\n/*! HADDR_INV_ADDR - based on CIU1_CPU1_ICODE_INV_ADDR_CTRL[31:30], the address status is observed in this register */\r\n#define CIU1_CIU1_CPU1_ICODE_INV_ADDR_HADDR_INV_ADDR(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_CPU1_ICODE_INV_ADDR_HADDR_INV_ADDR_SHIFT)) & CIU1_CIU1_CPU1_ICODE_INV_ADDR_HADDR_INV_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_CPU1_DCODE_INV_ADDR_CTRL - CPU1 Dcode invalid address access control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_LAST2_INV_ADDR_SLAVE_ID_MASK (0xFU)\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_LAST2_INV_ADDR_SLAVE_ID_SHIFT (0U)\r\n/*! LAST2_INV_ADDR_SLAVE_ID - Last2_inv_addr_Slave_ID */\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_LAST2_INV_ADDR_SLAVE_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_LAST2_INV_ADDR_SLAVE_ID_SHIFT)) & CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_LAST2_INV_ADDR_SLAVE_ID_MASK)\r\n\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_LAST_INV_ADDR_SLAVE_ID_MASK (0xF0U)\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_LAST_INV_ADDR_SLAVE_ID_SHIFT (4U)\r\n/*! LAST_INV_ADDR_SLAVE_ID - Last_inv_addr_Slave_ID */\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_LAST_INV_ADDR_SLAVE_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_LAST_INV_ADDR_SLAVE_ID_SHIFT)) & CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_LAST_INV_ADDR_SLAVE_ID_MASK)\r\n\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_CUR_INV_ADDR_SLAVE_ID_MASK (0xF00U)\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_CUR_INV_ADDR_SLAVE_ID_SHIFT (8U)\r\n/*! CUR_INV_ADDR_SLAVE_ID - Cur_inv_addr_Slave_ID */\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_CUR_INV_ADDR_SLAVE_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_CUR_INV_ADDR_SLAVE_ID_SHIFT)) & CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_CUR_INV_ADDR_SLAVE_ID_MASK)\r\n\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_LAST2_INV_ADDR_MASTER_ID_MASK (0xF000U)\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_LAST2_INV_ADDR_MASTER_ID_SHIFT (12U)\r\n/*! LAST2_INV_ADDR_MASTER_ID - Last2_inv_addr_master_ID */\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_LAST2_INV_ADDR_MASTER_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_LAST2_INV_ADDR_MASTER_ID_SHIFT)) & CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_LAST2_INV_ADDR_MASTER_ID_MASK)\r\n\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_LAST_INV_ADDR_MASTER_ID_MASK (0xF0000U)\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_LAST_INV_ADDR_MASTER_ID_SHIFT (16U)\r\n/*! LAST_INV_ADDR_MASTER_ID - Last_inv_addr_master_ID */\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_LAST_INV_ADDR_MASTER_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_LAST_INV_ADDR_MASTER_ID_SHIFT)) & CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_LAST_INV_ADDR_MASTER_ID_MASK)\r\n\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_CUR_INV_ADDR_MASTER_ID_MASK (0xF00000U)\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_CUR_INV_ADDR_MASTER_ID_SHIFT (20U)\r\n/*! CUR_INV_ADDR_MASTER_ID - Cur_inv_addr_master_ID */\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_CUR_INV_ADDR_MASTER_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_CUR_INV_ADDR_MASTER_ID_SHIFT)) & CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_CUR_INV_ADDR_MASTER_ID_MASK)\r\n\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_HADDR_DCOD_SEL_MASK (0xC0000000U)\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_HADDR_DCOD_SEL_SHIFT (30U)\r\n/*! HADDR_DCOD_SEL - There are 3 haddr which can be observed by selecting this: */\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_HADDR_DCOD_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_HADDR_DCOD_SEL_SHIFT)) & CIU1_CIU1_CPU1_DCODE_INV_ADDR_CTRL_HADDR_DCOD_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_CPU1_DCODE_INV_ADDR - CPU1 Dcode invalid address */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_HADDR_INV_ADDR_MASK (0xFFFFFFFFU)\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_HADDR_INV_ADDR_SHIFT (0U)\r\n/*! HADDR_INV_ADDR - based on CIU1_CPU1_DCODE_INV_ADDR_CTRL[31:30], the address status is observed in this register */\r\n#define CIU1_CIU1_CPU1_DCODE_INV_ADDR_HADDR_INV_ADDR(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_CPU1_DCODE_INV_ADDR_HADDR_INV_ADDR_SHIFT)) & CIU1_CIU1_CPU1_DCODE_INV_ADDR_HADDR_INV_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_AHB2AHB_BRIDGE_CTRL - AHB2AHB Bridge Control Register */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_AHB2AHB_BRIDGE_CTRL_PREFETCH_HSEL_EN_MASK (0x1U)\r\n#define CIU1_CIU1_AHB2AHB_BRIDGE_CTRL_PREFETCH_HSEL_EN_SHIFT (0U)\r\n/*! PREFETCH_HSEL_EN - ahb2ahb bridge pre-fetch hsel enable */\r\n#define CIU1_CIU1_AHB2AHB_BRIDGE_CTRL_PREFETCH_HSEL_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_AHB2AHB_BRIDGE_CTRL_PREFETCH_HSEL_EN_SHIFT)) & CIU1_CIU1_AHB2AHB_BRIDGE_CTRL_PREFETCH_HSEL_EN_MASK)\r\n\r\n#define CIU1_CIU1_AHB2AHB_BRIDGE_CTRL_MCI_WL_A2A_PREFETCH_EN_MASK (0x2U)\r\n#define CIU1_CIU1_AHB2AHB_BRIDGE_CTRL_MCI_WL_A2A_PREFETCH_EN_SHIFT (1U)\r\n/*! MCI_WL_A2A_PREFETCH_EN - MCI-WL ahb2ahb bridge pre-fetch hsel enable */\r\n#define CIU1_CIU1_AHB2AHB_BRIDGE_CTRL_MCI_WL_A2A_PREFETCH_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_AHB2AHB_BRIDGE_CTRL_MCI_WL_A2A_PREFETCH_EN_SHIFT)) & CIU1_CIU1_AHB2AHB_BRIDGE_CTRL_MCI_WL_A2A_PREFETCH_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name WL_RAACS_CTRL - RAACS control registers */\r\n/*! @{ */\r\n\r\n#define CIU1_WL_RAACS_CTRL_RAACS_EN_MASK         (0x1U)\r\n#define CIU1_WL_RAACS_CTRL_RAACS_EN_SHIFT        (0U)\r\n/*! RAACS_EN - raacs en . S/W Write 1 to enable raacs block. */\r\n#define CIU1_WL_RAACS_CTRL_RAACS_EN(x)           (((uint32_t)(((uint32_t)(x)) << CIU1_WL_RAACS_CTRL_RAACS_EN_SHIFT)) & CIU1_WL_RAACS_CTRL_RAACS_EN_MASK)\r\n\r\n#define CIU1_WL_RAACS_CTRL_USE_RAACS_CLK_FOR_CPU_MASK (0x2U)\r\n#define CIU1_WL_RAACS_CTRL_USE_RAACS_CLK_FOR_CPU_SHIFT (1U)\r\n/*! USE_RAACS_CLK_FOR_CPU - SW write 0 to use RAACS clock for CPU. SW write 1 to select clock gating\r\n *    based alternate implementation of RAACS clocking for CM3 CPU.\r\n */\r\n#define CIU1_WL_RAACS_CTRL_USE_RAACS_CLK_FOR_CPU(x) (((uint32_t)(((uint32_t)(x)) << CIU1_WL_RAACS_CTRL_USE_RAACS_CLK_FOR_CPU_SHIFT)) & CIU1_WL_RAACS_CTRL_USE_RAACS_CLK_FOR_CPU_MASK)\r\n\r\n#define CIU1_WL_RAACS_CTRL_RAACS_CLK_SEL_MASK    (0x1CU)\r\n#define CIU1_WL_RAACS_CTRL_RAACS_CLK_SEL_SHIFT   (2U)\r\n/*! RAACS_CLK_SEL - defines the lowest clock to which RAACS will go down to during IDLE period (x/2;\r\n *    x/4; x/8; ... ;x/128) for the given test.\r\n */\r\n#define CIU1_WL_RAACS_CTRL_RAACS_CLK_SEL(x)      (((uint32_t)(((uint32_t)(x)) << CIU1_WL_RAACS_CTRL_RAACS_CLK_SEL_SHIFT)) & CIU1_WL_RAACS_CTRL_RAACS_CLK_SEL_MASK)\r\n\r\n#define CIU1_WL_RAACS_CTRL_RAACS_WAIT_COUNTER_VALUE_MASK (0x7FFE0U)\r\n#define CIU1_WL_RAACS_CTRL_RAACS_WAIT_COUNTER_VALUE_SHIFT (5U)\r\n/*! RAACS_WAIT_COUNTER_VALUE - initial IDLE-time for which RAACS FSM waits before starting to scale down the clock. */\r\n#define CIU1_WL_RAACS_CTRL_RAACS_WAIT_COUNTER_VALUE(x) (((uint32_t)(((uint32_t)(x)) << CIU1_WL_RAACS_CTRL_RAACS_WAIT_COUNTER_VALUE_SHIFT)) & CIU1_WL_RAACS_CTRL_RAACS_WAIT_COUNTER_VALUE_MASK)\r\n\r\n#define CIU1_WL_RAACS_CTRL_RAACS_IDLE_COUNTER_VALUE_MASK (0xFFF80000U)\r\n#define CIU1_WL_RAACS_CTRL_RAACS_IDLE_COUNTER_VALUE_SHIFT (19U)\r\n/*! RAACS_IDLE_COUNTER_VALUE - IDLE time for which RAACS-FSM waits before shifting to next successive scaled clock. */\r\n#define CIU1_WL_RAACS_CTRL_RAACS_IDLE_COUNTER_VALUE(x) (((uint32_t)(((uint32_t)(x)) << CIU1_WL_RAACS_CTRL_RAACS_IDLE_COUNTER_VALUE_SHIFT)) & CIU1_WL_RAACS_CTRL_RAACS_IDLE_COUNTER_VALUE_MASK)\r\n/*! @} */\r\n\r\n/*! @name WL_RAACS_PERFORMANCE_STATISTICS - RAACS performance statistics counter. */\r\n/*! @{ */\r\n\r\n#define CIU1_WL_RAACS_PERFORMANCE_STATISTICS_PERFORMANCE_STATISTICS_CNT_EN_MASK (0x1U)\r\n#define CIU1_WL_RAACS_PERFORMANCE_STATISTICS_PERFORMANCE_STATISTICS_CNT_EN_SHIFT (0U)\r\n/*! PERFORMANCE_STATISTICS_CNT_EN - performance counter en. S/W write 1 to enable performance counter. */\r\n#define CIU1_WL_RAACS_PERFORMANCE_STATISTICS_PERFORMANCE_STATISTICS_CNT_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU1_WL_RAACS_PERFORMANCE_STATISTICS_PERFORMANCE_STATISTICS_CNT_EN_SHIFT)) & CIU1_WL_RAACS_PERFORMANCE_STATISTICS_PERFORMANCE_STATISTICS_CNT_EN_MASK)\r\n\r\n#define CIU1_WL_RAACS_PERFORMANCE_STATISTICS_RAACS_PERFORMANCE_STATISTICS_MASK (0xFFFFFFEU)\r\n#define CIU1_WL_RAACS_PERFORMANCE_STATISTICS_RAACS_PERFORMANCE_STATISTICS_SHIFT (1U)\r\n/*! RAACS_PERFORMANCE_STATISTICS - This counter is maintaining RAACS performance count. This counter\r\n *    will increment by one after every 1 us(1MHZ) when RAACS is in scaled clk state.\r\n */\r\n#define CIU1_WL_RAACS_PERFORMANCE_STATISTICS_RAACS_PERFORMANCE_STATISTICS(x) (((uint32_t)(((uint32_t)(x)) << CIU1_WL_RAACS_PERFORMANCE_STATISTICS_RAACS_PERFORMANCE_STATISTICS_SHIFT)) & CIU1_WL_RAACS_PERFORMANCE_STATISTICS_RAACS_PERFORMANCE_STATISTICS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_AHB1_TSTBUS_SEL - AHB1 Control Signals testbus select */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_AHB1_TSTBUS_SEL_AHB1_TSTBUS_SEL_MASK (0x1U)\r\n#define CIU1_CIU_AHB1_TSTBUS_SEL_AHB1_TSTBUS_SEL_SHIFT (0U)\r\n/*! AHB1_TSTBUS_SEL - Select AHB1 Arbiter Testbus for testing */\r\n#define CIU1_CIU_AHB1_TSTBUS_SEL_AHB1_TSTBUS_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_AHB1_TSTBUS_SEL_AHB1_TSTBUS_SEL_SHIFT)) & CIU1_CIU_AHB1_TSTBUS_SEL_AHB1_TSTBUS_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_ARB_ECO_CTRL - ARB ECO Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_ARB_ECO_CTRL_ECO_BITS_MASK      (0xFFFFFFFFU)\r\n#define CIU1_CIU_ARB_ECO_CTRL_ECO_BITS_SHIFT     (0U)\r\n/*! ECO_BITS - Reserved for ECOs */\r\n#define CIU1_CIU_ARB_ECO_CTRL_ECO_BITS(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_ARB_ECO_CTRL_ECO_BITS_SHIFT)) & CIU1_CIU_ARB_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CPU_DYN_CLK_CTRL - Dynamic CPU Clock Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CPU_DYN_CLK_CTRL_DYN_CPU1_CTRL_DIS_MASK (0x10000000U)\r\n#define CIU1_CIU_CPU_DYN_CLK_CTRL_DYN_CPU1_CTRL_DIS_SHIFT (28U)\r\n/*! DYN_CPU1_CTRL_DIS - Disable Dynamic CPU1 Clock Control Feature */\r\n#define CIU1_CIU_CPU_DYN_CLK_CTRL_DYN_CPU1_CTRL_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU_DYN_CLK_CTRL_DYN_CPU1_CTRL_DIS_SHIFT)) & CIU1_CIU_CPU_DYN_CLK_CTRL_DYN_CPU1_CTRL_DIS_MASK)\r\n\r\n#define CIU1_CIU_CPU_DYN_CLK_CTRL_DYN_SYS_CTRL_DIS_MASK (0x20000000U)\r\n#define CIU1_CIU_CPU_DYN_CLK_CTRL_DYN_SYS_CTRL_DIS_SHIFT (29U)\r\n/*! DYN_SYS_CTRL_DIS - Disable Dynamic SYS Clock Control Feature */\r\n#define CIU1_CIU_CPU_DYN_CLK_CTRL_DYN_SYS_CTRL_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU_DYN_CLK_CTRL_DYN_SYS_CTRL_DIS_SHIFT)) & CIU1_CIU_CPU_DYN_CLK_CTRL_DYN_SYS_CTRL_DIS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CPU_DYN_CPUCLK_MONITOR - Dynamic ahb clock Monitor */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CPU_DYN_CPUCLK_MONITOR_DYN_CPU1_CLK_MON_T1_MASK (0xFU)\r\n#define CIU1_CIU_CPU_DYN_CPUCLK_MONITOR_DYN_CPU1_CLK_MON_T1_SHIFT (0U)\r\n/*! DYN_CPU1_CLK_MON_T1 - Dynamic CPU1 Clock Monitor T1 */\r\n#define CIU1_CIU_CPU_DYN_CPUCLK_MONITOR_DYN_CPU1_CLK_MON_T1(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU_DYN_CPUCLK_MONITOR_DYN_CPU1_CLK_MON_T1_SHIFT)) & CIU1_CIU_CPU_DYN_CPUCLK_MONITOR_DYN_CPU1_CLK_MON_T1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CPU_DYN_SYSCLK_MONITOR - Dynamic sysclk Monitor */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CPU_DYN_SYSCLK_MONITOR_DYN_SYSCLK_MON_T1_MASK (0xFU)\r\n#define CIU1_CIU_CPU_DYN_SYSCLK_MONITOR_DYN_SYSCLK_MON_T1_SHIFT (0U)\r\n/*! DYN_SYSCLK_MON_T1 - Dynamic System Clock Monitor T1 */\r\n#define CIU1_CIU_CPU_DYN_SYSCLK_MONITOR_DYN_SYSCLK_MON_T1(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU_DYN_SYSCLK_MONITOR_DYN_SYSCLK_MON_T1_SHIFT)) & CIU1_CIU_CPU_DYN_SYSCLK_MONITOR_DYN_SYSCLK_MON_T1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CPU_CPU1_CTRL - CPU1 control register */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CPU_CPU1_CTRL_CPU1_DBG_CTRL_MASK (0xFF00U)\r\n#define CIU1_CIU_CPU_CPU1_CTRL_CPU1_DBG_CTRL_SHIFT (8U)\r\n/*! CPU1_DBG_CTRL - cpu2 debug control */\r\n#define CIU1_CIU_CPU_CPU1_CTRL_CPU1_DBG_CTRL(x)  (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU_CPU1_CTRL_CPU1_DBG_CTRL_SHIFT)) & CIU1_CIU_CPU_CPU1_CTRL_CPU1_DBG_CTRL_MASK)\r\n\r\n#define CIU1_CIU_CPU_CPU1_CTRL_CPU1_CPU3_MSG_SCHEME_MASK (0x40000U)\r\n#define CIU1_CIU_CPU_CPU1_CTRL_CPU1_CPU3_MSG_SCHEME_SHIFT (18U)\r\n/*! CPU1_CPU3_MSG_SCHEME - CPU1 to CPU3 Message Scheme */\r\n#define CIU1_CIU_CPU_CPU1_CTRL_CPU1_CPU3_MSG_SCHEME(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU_CPU1_CTRL_CPU1_CPU3_MSG_SCHEME_SHIFT)) & CIU1_CIU_CPU_CPU1_CTRL_CPU1_CPU3_MSG_SCHEME_MASK)\r\n\r\n#define CIU1_CIU_CPU_CPU1_CTRL_CPU3_RESET_INT_MASK (0x20000000U)\r\n#define CIU1_CIU_CPU_CPU1_CTRL_CPU3_RESET_INT_SHIFT (29U)\r\n/*! CPU3_RESET_INT - cpu1 fw reset cpu3 */\r\n#define CIU1_CIU_CPU_CPU1_CTRL_CPU3_RESET_INT(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU_CPU1_CTRL_CPU3_RESET_INT_SHIFT)) & CIU1_CIU_CPU_CPU1_CTRL_CPU3_RESET_INT_MASK)\r\n\r\n#define CIU1_CIU_CPU_CPU1_CTRL_CPU2_RESET_INT_MASK (0x80000000U)\r\n#define CIU1_CIU_CPU_CPU1_CTRL_CPU2_RESET_INT_SHIFT (31U)\r\n/*! CPU2_RESET_INT - cpu1 fw reset cpu2 */\r\n#define CIU1_CIU_CPU_CPU1_CTRL_CPU2_RESET_INT(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU_CPU1_CTRL_CPU2_RESET_INT_SHIFT)) & CIU1_CIU_CPU_CPU1_CTRL_CPU2_RESET_INT_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CPU_CPU1_ACCESS_CTRL - CPU1 access control register */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CPU_CPU1_ACCESS_CTRL_CPU1_ACCESS_CTRL_MASK (0xFFFFFFFFU)\r\n#define CIU1_CIU_CPU_CPU1_ACCESS_CTRL_CPU1_ACCESS_CTRL_SHIFT (0U)\r\n/*! CPU1_ACCESS_CTRL - CPU1 will read CIU_CPU_CPU1_ACCESS_CRTL and set CIU_CPU1_ACCESS_CRTL bit.\r\n *    After writing the bit, the CPU1 will check if the CIU_CPU_CPU1_ACCESS_CRTL bit is set or not. If\r\n *    set then CPU1 will access the resource (for e.g CSU).\r\n */\r\n#define CIU1_CIU_CPU_CPU1_ACCESS_CTRL_CPU1_ACCESS_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU_CPU1_ACCESS_CTRL_CPU1_ACCESS_CTRL_SHIFT)) & CIU1_CIU_CPU_CPU1_ACCESS_CTRL_CPU1_ACCESS_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CPU_CPU2_ACCESS_CTRL - CPU2 access control register */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CPU_CPU2_ACCESS_CTRL_CPU2_ACCESS_CTRL_MASK (0xFFFFFFFFU)\r\n#define CIU1_CIU_CPU_CPU2_ACCESS_CTRL_CPU2_ACCESS_CTRL_SHIFT (0U)\r\n/*! CPU2_ACCESS_CTRL - CPU2 will read CIU_CPU_CPU2_ACCESS_CRTL and set CIU_CPU2_ACCESS_CRTL bit.\r\n *    After writing the bit, the CPU2 will check if the CIU_CPU_CPU2_ACCESS_CRTL bit is set or not. If\r\n *    set then CPU2 will access the resource (for e.g CSU).\r\n */\r\n#define CIU1_CIU_CPU_CPU2_ACCESS_CTRL_CPU2_ACCESS_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU_CPU2_ACCESS_CTRL_CPU2_ACCESS_CTRL_SHIFT)) & CIU1_CIU_CPU_CPU2_ACCESS_CTRL_CPU2_ACCESS_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CPU_CPU3_ACCESS_CTRL - CPU3 access control register */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CPU_CPU3_ACCESS_CTRL_CPU3_ACCESS_CTRL_MASK (0xFFFFFFFFU)\r\n#define CIU1_CIU_CPU_CPU3_ACCESS_CTRL_CPU3_ACCESS_CTRL_SHIFT (0U)\r\n/*! CPU3_ACCESS_CTRL - CPU3 will read CIU_CPU_CPU3_ACCESS_CRTL and set CIU_CPU3_ACCESS_CRTL bit.\r\n *    After writing the bit, the CPU3 will check if the CIU_CPU_CPU3_ACCESS_CRTL bit is set or not. If\r\n *    set then CPU3 will access the resource (for e.g CSU).\r\n */\r\n#define CIU1_CIU_CPU_CPU3_ACCESS_CTRL_CPU3_ACCESS_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU_CPU3_ACCESS_CTRL_CPU3_ACCESS_CTRL_SHIFT)) & CIU1_CIU_CPU_CPU3_ACCESS_CTRL_CPU3_ACCESS_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CPU_CPU1_DBG_STAT1 - CPU1 debug register1 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CPU_CPU1_DBG_STAT1_CPU1_RO_STATUS_MASK (0xFFFFFFFFU)\r\n#define CIU1_CIU_CPU_CPU1_DBG_STAT1_CPU1_RO_STATUS_SHIFT (0U)\r\n/*! CPU1_RO_STATUS - cpu1 debug output */\r\n#define CIU1_CIU_CPU_CPU1_DBG_STAT1_CPU1_RO_STATUS(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU_CPU1_DBG_STAT1_CPU1_RO_STATUS_SHIFT)) & CIU1_CIU_CPU_CPU1_DBG_STAT1_CPU1_RO_STATUS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CPU1_CPU2_FW_DWLD_CTRL - CPUs FW dwld control register */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_FW_DWLD_INFO_VALID_MASK (0x1U)\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_FW_DWLD_INFO_VALID_SHIFT (0U)\r\n/*! FW_DWLD_INFO_VALID - After writing the bit[8] and bit[16], the CPU1 writes valid bit to indicate\r\n *    to cpu2 that information is valid and ready to use. CPU2 polls this bit and once set take\r\n *    appropriate action based on bit[8] and bit[16]\r\n */\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_FW_DWLD_INFO_VALID(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_FW_DWLD_INFO_VALID_SHIFT)) & CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_FW_DWLD_INFO_VALID_MASK)\r\n\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_PARALLEL_DWLD_SKETCH_MASK (0xFEU)\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_PARALLEL_DWLD_SKETCH_SHIFT (1U)\r\n/*! PARALLEL_DWLD_SKETCH - SKETCH register for Parallel download */\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_PARALLEL_DWLD_SKETCH(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_PARALLEL_DWLD_SKETCH_SHIFT)) & CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_PARALLEL_DWLD_SKETCH_MASK)\r\n\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_PARALLEL_DWLD_MASK (0x100U)\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_PARALLEL_DWLD_SHIFT (8U)\r\n/*! PARALLEL_DWLD - For the parallel mode of FW download, CPU1 assert this bit to provide information to CPU2. */\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_PARALLEL_DWLD(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_PARALLEL_DWLD_SHIFT)) & CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_PARALLEL_DWLD_MASK)\r\n\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_CPU2_FW_DWLD_SKETCH_MASK (0xFE00U)\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_CPU2_FW_DWLD_SKETCH_SHIFT (9U)\r\n/*! CPU2_FW_DWLD_SKETCH - Sketch registers for Chip Download */\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_CPU2_FW_DWLD_SKETCH(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_CPU2_FW_DWLD_SKETCH_SHIFT)) & CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_CPU2_FW_DWLD_SKETCH_MASK)\r\n\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_CPU2_FW_DWLD_DONE_MASK (0x10000U)\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_CPU2_FW_DWLD_DONE_SHIFT (16U)\r\n/*! CPU2_FW_DWLD_DONE - For the serial mode of FW download, when CPU1 done with FW download for CPU2\r\n *    also, then it assert this bit. After this CPU2 can jump to it's ITCM to start execution\r\n */\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_CPU2_FW_DWLD_DONE(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_CPU2_FW_DWLD_DONE_SHIFT)) & CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_CPU2_FW_DWLD_DONE_MASK)\r\n\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_CHIP_INIT_DONE_SKETCH_MASK (0x7FFE0000U)\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_CHIP_INIT_DONE_SKETCH_SHIFT (17U)\r\n/*! CHIP_INIT_DONE_SKETCH - Sketch registers for Chip Init */\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_CHIP_INIT_DONE_SKETCH(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_CHIP_INIT_DONE_SKETCH_SHIFT)) & CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_CHIP_INIT_DONE_SKETCH_MASK)\r\n\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_CHIP_INIT_DONE_MASK (0x80000000U)\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_CHIP_INIT_DONE_SHIFT (31U)\r\n/*! CHIP_INIT_DONE - After the FW is downloaded (serial or parallel), the CPU1 does the chip init\r\n *    and set this bit. It is used later by boot code in case the FW crash happen, then it doesn't\r\n *    need to do chip init again\r\n */\r\n#define CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_CHIP_INIT_DONE(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_CHIP_INIT_DONE_SHIFT)) & CIU1_CIU_CPU1_CPU2_FW_DWLD_CTRL_CHIP_INIT_DONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CPU_COMM0 - CPU Communication reserved0 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CPU_COMM0_CPU_COMM0_MASK        (0xFFFFFFFFU)\r\n#define CIU1_CIU_CPU_COMM0_CPU_COMM0_SHIFT       (0U)\r\n/*! CPU_COMM0 - CPUs extra reserved communication reg to be used by FW */\r\n#define CIU1_CIU_CPU_COMM0_CPU_COMM0(x)          (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU_COMM0_CPU_COMM0_SHIFT)) & CIU1_CIU_CPU_COMM0_CPU_COMM0_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CPU_COMM1 - CPU Communication reserved1 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CPU_COMM1_CPU_COMM1_MASK        (0xFFFFFFFFU)\r\n#define CIU1_CIU_CPU_COMM1_CPU_COMM1_SHIFT       (0U)\r\n/*! CPU_COMM1 - CPUs extra reserved communication reg to be used by FW */\r\n#define CIU1_CIU_CPU_COMM1_CPU_COMM1(x)          (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU_COMM1_CPU_COMM1_SHIFT)) & CIU1_CIU_CPU_COMM1_CPU_COMM1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CPU_ECO_CTRL - CPU ECO control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CPU_ECO_CTRL_ECO_BITS_MASK      (0xFFFFFFFFU)\r\n#define CIU1_CIU_CPU_ECO_CTRL_ECO_BITS_SHIFT     (0U)\r\n/*! ECO_BITS - Reserved for ECOs */\r\n#define CIU1_CIU_CPU_ECO_CTRL_ECO_BITS(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU_ECO_CTRL_ECO_BITS_SHIFT)) & CIU1_CIU_CPU_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_RFU_CTRL - RFU Control and Status */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_RFU_CTRL_APB_EN_5G_MASK         (0x2U)\r\n#define CIU1_CIU_RFU_CTRL_APB_EN_5G_SHIFT        (1U)\r\n/*! APB_EN_5G - Enable RFU5G APB Interface for Register Programming */\r\n#define CIU1_CIU_RFU_CTRL_APB_EN_5G(x)           (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_CTRL_APB_EN_5G_SHIFT)) & CIU1_CIU_RFU_CTRL_APB_EN_5G_MASK)\r\n\r\n#define CIU1_CIU_RFU_CTRL_APB_DWORD_SEL_MASK     (0x4U)\r\n#define CIU1_CIU_RFU_CTRL_APB_DWORD_SEL_SHIFT    (2U)\r\n/*! APB_DWORD_SEL - RFU APB DWORD Select */\r\n#define CIU1_CIU_RFU_CTRL_APB_DWORD_SEL(x)       (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_CTRL_APB_DWORD_SEL_SHIFT)) & CIU1_CIU_RFU_CTRL_APB_DWORD_SEL_MASK)\r\n\r\n#define CIU1_CIU_RFU_CTRL_APB_EN_2G_MASK         (0x8U)\r\n#define CIU1_CIU_RFU_CTRL_APB_EN_2G_SHIFT        (3U)\r\n/*! APB_EN_2G - Enable RFU2G APB Interface for Register Programming */\r\n#define CIU1_CIU_RFU_CTRL_APB_EN_2G(x)           (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_CTRL_APB_EN_2G_SHIFT)) & CIU1_CIU_RFU_CTRL_APB_EN_2G_MASK)\r\n\r\n#define CIU1_CIU_RFU_CTRL_RFU_TRX_RDY_2G_A_MASK  (0x20000000U)\r\n#define CIU1_CIU_RFU_CTRL_RFU_TRX_RDY_2G_A_SHIFT (29U)\r\n/*! RFU_TRX_RDY_2G_A - RFU2G channel A Rdy Status */\r\n#define CIU1_CIU_RFU_CTRL_RFU_TRX_RDY_2G_A(x)    (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_CTRL_RFU_TRX_RDY_2G_A_SHIFT)) & CIU1_CIU_RFU_CTRL_RFU_TRX_RDY_2G_A_MASK)\r\n\r\n#define CIU1_CIU_RFU_CTRL_RFU_TRX_RDY_5G_A_MASK  (0x40000000U)\r\n#define CIU1_CIU_RFU_CTRL_RFU_TRX_RDY_5G_A_SHIFT (30U)\r\n/*! RFU_TRX_RDY_5G_A - RFU5G channel A Rdy Status */\r\n#define CIU1_CIU_RFU_CTRL_RFU_TRX_RDY_5G_A(x)    (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_CTRL_RFU_TRX_RDY_5G_A_SHIFT)) & CIU1_CIU_RFU_CTRL_RFU_TRX_RDY_5G_A_MASK)\r\n\r\n#define CIU1_CIU_RFU_CTRL_RFU_TRX_RDY_5G_B_MASK  (0x80000000U)\r\n#define CIU1_CIU_RFU_CTRL_RFU_TRX_RDY_5G_B_SHIFT (31U)\r\n/*! RFU_TRX_RDY_5G_B - RFU5G channel B Rdy Status */\r\n#define CIU1_CIU_RFU_CTRL_RFU_TRX_RDY_5G_B(x)    (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_CTRL_RFU_TRX_RDY_5G_B_SHIFT)) & CIU1_CIU_RFU_CTRL_RFU_TRX_RDY_5G_B_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_RFU_EXTRA_PORT - RFU Extra Port Connection */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_RFU_EXTRA_PORT_SOC_RFU5G_EXTRA_A_MASK (0xFFU)\r\n#define CIU1_CIU_RFU_EXTRA_PORT_SOC_RFU5G_EXTRA_A_SHIFT (0U)\r\n/*! SOC_RFU5G_EXTRA_A - SOC_RFU5G_EXTRA_A[7:0] */\r\n#define CIU1_CIU_RFU_EXTRA_PORT_SOC_RFU5G_EXTRA_A(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_EXTRA_PORT_SOC_RFU5G_EXTRA_A_SHIFT)) & CIU1_CIU_RFU_EXTRA_PORT_SOC_RFU5G_EXTRA_A_MASK)\r\n\r\n#define CIU1_CIU_RFU_EXTRA_PORT_SOC_RFU5G_EXTRA_B_MASK (0xFF00U)\r\n#define CIU1_CIU_RFU_EXTRA_PORT_SOC_RFU5G_EXTRA_B_SHIFT (8U)\r\n/*! SOC_RFU5G_EXTRA_B - SOC_RFU5G_EXTRA_B[7:0] */\r\n#define CIU1_CIU_RFU_EXTRA_PORT_SOC_RFU5G_EXTRA_B(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_EXTRA_PORT_SOC_RFU5G_EXTRA_B_SHIFT)) & CIU1_CIU_RFU_EXTRA_PORT_SOC_RFU5G_EXTRA_B_MASK)\r\n\r\n#define CIU1_CIU_RFU_EXTRA_PORT_SOC_RFU2G_EXTRA_A_MASK (0xFF0000U)\r\n#define CIU1_CIU_RFU_EXTRA_PORT_SOC_RFU2G_EXTRA_A_SHIFT (16U)\r\n/*! SOC_RFU2G_EXTRA_A - SOC_RFU2G_EXTRA_A[7:0] */\r\n#define CIU1_CIU_RFU_EXTRA_PORT_SOC_RFU2G_EXTRA_A(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_EXTRA_PORT_SOC_RFU2G_EXTRA_A_SHIFT)) & CIU1_CIU_RFU_EXTRA_PORT_SOC_RFU2G_EXTRA_A_MASK)\r\n\r\n#define CIU1_CIU_RFU_EXTRA_PORT_SOC_RFU2G_EXTRA_B_MASK (0xF000000U)\r\n#define CIU1_CIU_RFU_EXTRA_PORT_SOC_RFU2G_EXTRA_B_SHIFT (24U)\r\n/*! SOC_RFU2G_EXTRA_B - SOC_RFU2G_EXTRA_B[3:0] */\r\n#define CIU1_CIU_RFU_EXTRA_PORT_SOC_RFU2G_EXTRA_B(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_EXTRA_PORT_SOC_RFU2G_EXTRA_B_SHIFT)) & CIU1_CIU_RFU_EXTRA_PORT_SOC_RFU2G_EXTRA_B_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_RFU_ECO_CTRL - RFU ECO Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_RFU_ECO_CTRL_ECO_BITS_MASK      (0xFFFFFFFFU)\r\n#define CIU1_CIU_RFU_ECO_CTRL_ECO_BITS_SHIFT     (0U)\r\n/*! ECO_BITS - Reserved for ECOs */\r\n#define CIU1_CIU_RFU_ECO_CTRL_ECO_BITS(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_RFU_ECO_CTRL_ECO_BITS_SHIFT)) & CIU1_CIU_RFU_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_MCI_EXTRA - MCI EXTRA Ports */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_MCI_EXTRA_CIU_MCI_EXTRA_OUT_MASK (0xFU)\r\n#define CIU1_CIU_MCI_EXTRA_CIU_MCI_EXTRA_OUT_SHIFT (0U)\r\n/*! CIU_MCI_EXTRA_OUT - Extra Ports to MCI */\r\n#define CIU1_CIU_MCI_EXTRA_CIU_MCI_EXTRA_OUT(x)  (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MCI_EXTRA_CIU_MCI_EXTRA_OUT_SHIFT)) & CIU1_CIU_MCI_EXTRA_CIU_MCI_EXTRA_OUT_MASK)\r\n\r\n#define CIU1_CIU_MCI_EXTRA_CIU_MCI_EXTRA_IN_MASK (0xF0U)\r\n#define CIU1_CIU_MCI_EXTRA_CIU_MCI_EXTRA_IN_SHIFT (4U)\r\n/*! CIU_MCI_EXTRA_IN - Extra Ports from MCI */\r\n#define CIU1_CIU_MCI_EXTRA_CIU_MCI_EXTRA_IN(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_MCI_EXTRA_CIU_MCI_EXTRA_IN_SHIFT)) & CIU1_CIU_MCI_EXTRA_CIU_MCI_EXTRA_IN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_BBUD_CTRL - BBUD Control Register */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_BBUD_CTRL_APB_EN_BBU1_MASK      (0x1U)\r\n#define CIU1_CIU_BBUD_CTRL_APB_EN_BBU1_SHIFT     (0U)\r\n/*! APB_EN_BBU1 - Enable BBUD1 APB Interface for Register Programming */\r\n#define CIU1_CIU_BBUD_CTRL_APB_EN_BBU1(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BBUD_CTRL_APB_EN_BBU1_SHIFT)) & CIU1_CIU_BBUD_CTRL_APB_EN_BBU1_MASK)\r\n\r\n#define CIU1_CIU_BBUD_CTRL_APB_DWORD_SEL_MASK    (0x2U)\r\n#define CIU1_CIU_BBUD_CTRL_APB_DWORD_SEL_SHIFT   (1U)\r\n/*! APB_DWORD_SEL - BBUD APB DWORD Select */\r\n#define CIU1_CIU_BBUD_CTRL_APB_DWORD_SEL(x)      (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BBUD_CTRL_APB_DWORD_SEL_SHIFT)) & CIU1_CIU_BBUD_CTRL_APB_DWORD_SEL_MASK)\r\n\r\n#define CIU1_CIU_BBUD_CTRL_BBUD_SPEC_SEL_MASK    (0x4U)\r\n#define CIU1_CIU_BBUD_CTRL_BBUD_SPEC_SEL_SHIFT   (2U)\r\n/*! BBUD_SPEC_SEL - BBUD SPEC CLK select */\r\n#define CIU1_CIU_BBUD_CTRL_BBUD_SPEC_SEL(x)      (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BBUD_CTRL_BBUD_SPEC_SEL_SHIFT)) & CIU1_CIU_BBUD_CTRL_BBUD_SPEC_SEL_MASK)\r\n\r\n#define CIU1_CIU_BBUD_CTRL_APB_EN_BBU2_MASK      (0x10U)\r\n#define CIU1_CIU_BBUD_CTRL_APB_EN_BBU2_SHIFT     (4U)\r\n/*! APB_EN_BBU2 - Enable BBUD2 APB Interface for Register Programming */\r\n#define CIU1_CIU_BBUD_CTRL_APB_EN_BBU2(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BBUD_CTRL_APB_EN_BBU2_SHIFT)) & CIU1_CIU_BBUD_CTRL_APB_EN_BBU2_MASK)\r\n\r\n#define CIU1_CIU_BBUD_CTRL_PPS_IN_SEL_MASK       (0x300U)\r\n#define CIU1_CIU_BBUD_CTRL_PPS_IN_SEL_SHIFT      (8U)\r\n/*! PPS_IN_SEL - BBUD PPS input select */\r\n#define CIU1_CIU_BBUD_CTRL_PPS_IN_SEL(x)         (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BBUD_CTRL_PPS_IN_SEL_SHIFT)) & CIU1_CIU_BBUD_CTRL_PPS_IN_SEL_MASK)\r\n\r\n#define CIU1_CIU_BBUD_CTRL_PTP_SYNC_PULSE_SEL_MASK (0x10000U)\r\n#define CIU1_CIU_BBUD_CTRL_PTP_SYNC_PULSE_SEL_SHIFT (16U)\r\n/*! PTP_SYNC_PULSE_SEL - Mux select control to select between */\r\n#define CIU1_CIU_BBUD_CTRL_PTP_SYNC_PULSE_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BBUD_CTRL_PTP_SYNC_PULSE_SEL_SHIFT)) & CIU1_CIU_BBUD_CTRL_PTP_SYNC_PULSE_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_BBUD_EXTRA_PORT - BBUD Extra Port Connection */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_BBUD_EXTRA_PORT_SOC_BBUD_EXTRA_MASK (0xFFU)\r\n#define CIU1_CIU_BBUD_EXTRA_PORT_SOC_BBUD_EXTRA_SHIFT (0U)\r\n/*! SOC_BBUD_EXTRA - SOC_BBUD_EXTRA[7:0] */\r\n#define CIU1_CIU_BBUD_EXTRA_PORT_SOC_BBUD_EXTRA(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BBUD_EXTRA_PORT_SOC_BBUD_EXTRA_SHIFT)) & CIU1_CIU_BBUD_EXTRA_PORT_SOC_BBUD_EXTRA_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_BBUD_PTP_INTR_CTRL - PTP Input capture interrupt control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_BBUD_PTP_INTR_CTRL_PTP_INPUTCAPTURE_INTR_MASK_MASK (0x1U)\r\n#define CIU1_CIU_BBUD_PTP_INTR_CTRL_PTP_INPUTCAPTURE_INTR_MASK_SHIFT (0U)\r\n/*! PTP_INPUTCAPTURE_INTR_MASK - Mask control for ptp_inputcaptue interrupt generation */\r\n#define CIU1_CIU_BBUD_PTP_INTR_CTRL_PTP_INPUTCAPTURE_INTR_MASK(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BBUD_PTP_INTR_CTRL_PTP_INPUTCAPTURE_INTR_MASK_SHIFT)) & CIU1_CIU_BBUD_PTP_INTR_CTRL_PTP_INPUTCAPTURE_INTR_MASK_MASK)\r\n\r\n#define CIU1_CIU_BBUD_PTP_INTR_CTRL_PTP_INPUTCAPTURE_EDGE_SEL_MASK (0x80U)\r\n#define CIU1_CIU_BBUD_PTP_INTR_CTRL_PTP_INPUTCAPTURE_EDGE_SEL_SHIFT (7U)\r\n/*! PTP_INPUTCAPTURE_EDGE_SEL - Select edge for generation of PTP interrupt */\r\n#define CIU1_CIU_BBUD_PTP_INTR_CTRL_PTP_INPUTCAPTURE_EDGE_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BBUD_PTP_INTR_CTRL_PTP_INPUTCAPTURE_EDGE_SEL_SHIFT)) & CIU1_CIU_BBUD_PTP_INTR_CTRL_PTP_INPUTCAPTURE_EDGE_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_BBUD_ECO_CTRL - BBUD ECO Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_BBUD_ECO_CTRL_ECO_BITS_MASK     (0xFFFFFFFFU)\r\n#define CIU1_CIU_BBUD_ECO_CTRL_ECO_BITS_SHIFT    (0U)\r\n/*! ECO_BITS - Reserved for ECOs */\r\n#define CIU1_CIU_BBUD_ECO_CTRL_ECO_BITS(x)       (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_BBUD_ECO_CTRL_ECO_BITS_SHIFT)) & CIU1_CIU_BBUD_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_AIU_CTRL - AIU Control Register */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_AIU_CTRL_AIU_MCLK_NCO_EN_MASK   (0x4U)\r\n#define CIU1_CIU_AIU_CTRL_AIU_MCLK_NCO_EN_SHIFT  (2U)\r\n/*! AIU_MCLK_NCO_EN - AIU_MCLK NCO */\r\n#define CIU1_CIU_AIU_CTRL_AIU_MCLK_NCO_EN(x)     (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_AIU_CTRL_AIU_MCLK_NCO_EN_SHIFT)) & CIU1_CIU_AIU_CTRL_AIU_MCLK_NCO_EN_MASK)\r\n\r\n#define CIU1_CIU_AIU_CTRL_AIU_MCLK_NCO_TYPE_MASK (0x8U)\r\n#define CIU1_CIU_AIU_CTRL_AIU_MCLK_NCO_TYPE_SHIFT (3U)\r\n/*! AIU_MCLK_NCO_TYPE - NCO */\r\n#define CIU1_CIU_AIU_CTRL_AIU_MCLK_NCO_TYPE(x)   (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_AIU_CTRL_AIU_MCLK_NCO_TYPE_SHIFT)) & CIU1_CIU_AIU_CTRL_AIU_MCLK_NCO_TYPE_MASK)\r\n\r\n#define CIU1_CIU_AIU_CTRL_AIU_MCLK_NCO_INPUT_SEL_MASK (0x10U)\r\n#define CIU1_CIU_AIU_CTRL_AIU_MCLK_NCO_INPUT_SEL_SHIFT (4U)\r\n/*! AIU_MCLK_NCO_INPUT_SEL - AIU NCO Input */\r\n#define CIU1_CIU_AIU_CTRL_AIU_MCLK_NCO_INPUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_AIU_CTRL_AIU_MCLK_NCO_INPUT_SEL_SHIFT)) & CIU1_CIU_AIU_CTRL_AIU_MCLK_NCO_INPUT_SEL_MASK)\r\n\r\n#define CIU1_CIU_AIU_CTRL_AIU_MCLK_SEL_MASK      (0x20U)\r\n#define CIU1_CIU_AIU_CTRL_AIU_MCLK_SEL_SHIFT     (5U)\r\n/*! AIU_MCLK_SEL - AIU MCLK */\r\n#define CIU1_CIU_AIU_CTRL_AIU_MCLK_SEL(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_AIU_CTRL_AIU_MCLK_SEL_SHIFT)) & CIU1_CIU_AIU_CTRL_AIU_MCLK_SEL_MASK)\r\n\r\n#define CIU1_CIU_AIU_CTRL_AIU_MCLK_NCO_STEP_SIZE_MASK (0xFFFFFF00U)\r\n#define CIU1_CIU_AIU_CTRL_AIU_MCLK_NCO_STEP_SIZE_SHIFT (8U)\r\n/*! AIU_MCLK_NCO_STEP_SIZE - AIU NCO Step Size */\r\n#define CIU1_CIU_AIU_CTRL_AIU_MCLK_NCO_STEP_SIZE(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_AIU_CTRL_AIU_MCLK_NCO_STEP_SIZE_SHIFT)) & CIU1_CIU_AIU_CTRL_AIU_MCLK_NCO_STEP_SIZE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_AIU_ECO_CTRL - AIU ECO Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_AIU_ECO_CTRL_ECO_BITS_MASK      (0xFFFFFFFFU)\r\n#define CIU1_CIU_AIU_ECO_CTRL_ECO_BITS_SHIFT     (0U)\r\n/*! ECO_BITS - Reserved for ECOs */\r\n#define CIU1_CIU_AIU_ECO_CTRL_ECO_BITS(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_AIU_ECO_CTRL_ECO_BITS_SHIFT)) & CIU1_CIU_AIU_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CBU_ECO_CTRL - CBU ECO Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CBU_ECO_CTRL_ECO_BITS_MASK      (0xFFFFFFFFU)\r\n#define CIU1_CIU_CBU_ECO_CTRL_ECO_BITS_SHIFT     (0U)\r\n/*! ECO_BITS - Reserved for ECOs */\r\n#define CIU1_CIU_CBU_ECO_CTRL_ECO_BITS(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CBU_ECO_CTRL_ECO_BITS_SHIFT)) & CIU1_CIU_CBU_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_IMU_CPU1_WR_MSG_TO_CPU3 - CPU1(WL) write message to CPU3(MCI) (0xAF0-0xAF4 IMU register access by CPU1) */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_IMU_CPU1_WR_MSG_TO_CPU3_CPU1_WR_MSG_CPU3_MASK (0xFFFFFFFFU)\r\n#define CIU1_CIU1_IMU_CPU1_WR_MSG_TO_CPU3_CPU1_WR_MSG_CPU3_SHIFT (0U)\r\n/*! CPU1_WR_MSG_CPU3 - Write cpu1 message data to CPU3 (push to FIFO) */\r\n#define CIU1_CIU1_IMU_CPU1_WR_MSG_TO_CPU3_CPU1_WR_MSG_CPU3(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU1_WR_MSG_TO_CPU3_CPU1_WR_MSG_CPU3_SHIFT)) & CIU1_CIU1_IMU_CPU1_WR_MSG_TO_CPU3_CPU1_WR_MSG_CPU3_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_IMU_CPU1_RD_MSG_FROM_CPU3 - cpu1 read message from CPU3 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_IMU_CPU1_RD_MSG_FROM_CPU3_CPU1_RD_MSG_CPU3_MASK (0xFFFFFFFFU)\r\n#define CIU1_CIU1_IMU_CPU1_RD_MSG_FROM_CPU3_CPU1_RD_MSG_CPU3_SHIFT (0U)\r\n/*! CPU1_RD_MSG_CPU3 - cpu1 read message data from CPU3 (pop from FIFO) */\r\n#define CIU1_CIU1_IMU_CPU1_RD_MSG_FROM_CPU3_CPU1_RD_MSG_CPU3(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU1_RD_MSG_FROM_CPU3_CPU1_RD_MSG_CPU3_SHIFT)) & CIU1_CIU1_IMU_CPU1_RD_MSG_FROM_CPU3_CPU1_RD_MSG_CPU3_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS - cpu1 to CPU3 message FIFO status */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_LOCKED_MASK (0x1U)\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_LOCKED_SHIFT (0U)\r\n/*! CPU1_TO_CPU3_MSG_FIFO_LOCKED - cpu1_to_cpu3_msg_fifo_locked */\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_LOCKED(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_LOCKED_SHIFT)) & CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_LOCKED_MASK)\r\n\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_ALMOST_FULL_MASK (0x2U)\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_ALMOST_FULL_SHIFT (1U)\r\n/*! CPU1_TO_CPU3_MSG_FIFO_ALMOST_FULL - cpu1_to_cpu3_msg_fifo_almost_full (based upon FIFO watermark) */\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_ALMOST_FULL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_ALMOST_FULL_SHIFT)) & CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_ALMOST_FULL_MASK)\r\n\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_FULL_MASK (0x4U)\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_FULL_SHIFT (2U)\r\n/*! CPU1_TO_CPU3_MSG_FIFO_FULL - cpu1_to_cpu3_msg_fifo_full (based upon FIFO depth) */\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_FULL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_FULL_SHIFT)) & CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_FULL_MASK)\r\n\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_EMPTY_MASK (0x8U)\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_EMPTY_SHIFT (3U)\r\n/*! CPU1_TO_CPU3_MSG_FIFO_EMPTY - cpu1_to_cpu3_msg_fifo_empty */\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_EMPTY(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_EMPTY_SHIFT)) & CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_EMPTY_MASK)\r\n\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_COUNT_MASK (0x1F0U)\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_COUNT_SHIFT (4U)\r\n/*! CPU1_TO_CPU3_MSG_COUNT - cpu1_to_cpu3_msg_count */\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_COUNT(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_COUNT_SHIFT)) & CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_COUNT_MASK)\r\n\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_WR_PTR_MASK (0xF0000U)\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_WR_PTR_SHIFT (16U)\r\n/*! CPU1_TO_CPU3_MSG_FIFO_WR_PTR - cpu1 to cpu3 msg fifo write pointer for debug */\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_WR_PTR(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_WR_PTR_SHIFT)) & CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_WR_PTR_MASK)\r\n\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_RD_PTR_MASK (0xF00000U)\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_RD_PTR_SHIFT (20U)\r\n/*! CPU1_TO_CPU3_MSG_FIFO_RD_PTR - cpu1 to cpu3 msg fifo read pointer for debug */\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_RD_PTR(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_RD_PTR_SHIFT)) & CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_STATUS_CPU1_TO_CPU3_MSG_FIFO_RD_PTR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL - cpu1 to CPU3 message FIFO control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_MSG_RDY_INT_CLR_MASK (0x1U)\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_MSG_RDY_INT_CLR_SHIFT (0U)\r\n/*! CPU1_MSG_RDY_INT_CLR - Writing 1 to this bit will clear message ready interrupt to CPU1 (self clear bit) */\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_MSG_RDY_INT_CLR(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_MSG_RDY_INT_CLR_SHIFT)) & CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_MSG_RDY_INT_CLR_MASK)\r\n\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_MSG_SP_AV_INT_CLR_MASK (0x100U)\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_MSG_SP_AV_INT_CLR_SHIFT (8U)\r\n/*! CPU1_MSG_SP_AV_INT_CLR - Writing 1 to this bit will clear message space available interrupt to CPU1 (self clear bit) */\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_MSG_SP_AV_INT_CLR(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_MSG_SP_AV_INT_CLR_SHIFT)) & CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_MSG_SP_AV_INT_CLR_MASK)\r\n\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_TO_CPU3_MSG_FIFO_FLUSH_MASK (0x10000U)\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_TO_CPU3_MSG_FIFO_FLUSH_SHIFT (16U)\r\n/*! CPU1_TO_CPU3_MSG_FIFO_FLUSH - Writing 1 to this bit will flush cpu1_to_cpu3 message fifo */\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_TO_CPU3_MSG_FIFO_FLUSH(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_TO_CPU3_MSG_FIFO_FLUSH_SHIFT)) & CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_TO_CPU3_MSG_FIFO_FLUSH_MASK)\r\n\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_WAIT_FOR_ACK_MASK (0x20000U)\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_WAIT_FOR_ACK_SHIFT (17U)\r\n/*! CPU1_WAIT_FOR_ACK - CPU1 Wait for Acknowledgment */\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_WAIT_FOR_ACK(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_WAIT_FOR_ACK_SHIFT)) & CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_WAIT_FOR_ACK_MASK)\r\n\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_TO_CPU3_MSG_FIFO_FULL_WATERMARK_MASK (0xF00000U)\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_TO_CPU3_MSG_FIFO_FULL_WATERMARK_SHIFT (20U)\r\n/*! CPU1_TO_CPU3_MSG_FIFO_FULL_WATERMARK - cpu1_to_cpu3 message fifo full watermark (space avail intr based upon it) */\r\n#define CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_TO_CPU3_MSG_FIFO_FULL_WATERMARK(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_TO_CPU3_MSG_FIFO_FULL_WATERMARK_SHIFT)) & CIU1_CIU1_IMU_CPU1_CPU3_MSG_FIFO_CNTL_CPU1_TO_CPU3_MSG_FIFO_FULL_WATERMARK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_IMU_CPU3_RD_MSG_FROM_CPU1_VAL_DBG - CPU3 last message read (from cpu1) */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_IMU_CPU3_RD_MSG_FROM_CPU1_VAL_DBG_CPU3_RD_MSG_MASK (0xFFFFFFFFU)\r\n#define CIU1_CIU1_IMU_CPU3_RD_MSG_FROM_CPU1_VAL_DBG_CPU3_RD_MSG_SHIFT (0U)\r\n/*! CPU3_RD_MSG - CPU3 last message read (from cpu1) */\r\n#define CIU1_CIU1_IMU_CPU3_RD_MSG_FROM_CPU1_VAL_DBG_CPU3_RD_MSG(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU3_RD_MSG_FROM_CPU1_VAL_DBG_CPU3_RD_MSG_SHIFT)) & CIU1_CIU1_IMU_CPU3_RD_MSG_FROM_CPU1_VAL_DBG_CPU3_RD_MSG_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_IMU_CPU3_WR_MSG_TO_CPU1 - CPU3 write message to cpu1 (0xB04-0xB14 IMU register access by CPU3) */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_IMU_CPU3_WR_MSG_TO_CPU1_CPU3_WR_MSG_CPU1_MASK (0xFFFFFFFFU)\r\n#define CIU1_CIU1_IMU_CPU3_WR_MSG_TO_CPU1_CPU3_WR_MSG_CPU1_SHIFT (0U)\r\n/*! CPU3_WR_MSG_CPU1 - Write CPU3 message data to cpu1 (push to FIFO) */\r\n#define CIU1_CIU1_IMU_CPU3_WR_MSG_TO_CPU1_CPU3_WR_MSG_CPU1(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU3_WR_MSG_TO_CPU1_CPU3_WR_MSG_CPU1_SHIFT)) & CIU1_CIU1_IMU_CPU3_WR_MSG_TO_CPU1_CPU3_WR_MSG_CPU1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_IMU_CPU3_RD_MSG_FROM_CPU1 - CPU3 read message from cpu1 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_IMU_CPU3_RD_MSG_FROM_CPU1_CPU3_RD_MSG_CPU1_MASK (0xFFFFFFFFU)\r\n#define CIU1_CIU1_IMU_CPU3_RD_MSG_FROM_CPU1_CPU3_RD_MSG_CPU1_SHIFT (0U)\r\n/*! CPU3_RD_MSG_CPU1 - CPU3 read message data from cpu1 (pop from FIFO) */\r\n#define CIU1_CIU1_IMU_CPU3_RD_MSG_FROM_CPU1_CPU3_RD_MSG_CPU1(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU3_RD_MSG_FROM_CPU1_CPU3_RD_MSG_CPU1_SHIFT)) & CIU1_CIU1_IMU_CPU3_RD_MSG_FROM_CPU1_CPU3_RD_MSG_CPU1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS - CPU3 to cpu1 message FIFO status */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_LOCKED_MASK (0x1U)\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_LOCKED_SHIFT (0U)\r\n/*! CPU3_TO_CPU1_MSG_FIFO_LOCKED - cpu3_to_cpu1_msg_fifo_locked */\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_LOCKED(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_LOCKED_SHIFT)) & CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_LOCKED_MASK)\r\n\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_ALMOST_FULL_MASK (0x2U)\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_ALMOST_FULL_SHIFT (1U)\r\n/*! CPU3_TO_CPU1_MSG_FIFO_ALMOST_FULL - cpu3_to_cpu1_msg_fifo_almost_full (based upon FIFO watermark) */\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_ALMOST_FULL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_ALMOST_FULL_SHIFT)) & CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_ALMOST_FULL_MASK)\r\n\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_FULL_MASK (0x4U)\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_FULL_SHIFT (2U)\r\n/*! CPU3_TO_CPU1_MSG_FIFO_FULL - cpu3_to_cpu1_msg_fifo_full (based upon FIFO depth) */\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_FULL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_FULL_SHIFT)) & CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_FULL_MASK)\r\n\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_EMPTY_MASK (0x8U)\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_EMPTY_SHIFT (3U)\r\n/*! CPU3_TO_CPU1_MSG_FIFO_EMPTY - cpu3_to_cpu1_msg_fifo_empty */\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_EMPTY(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_EMPTY_SHIFT)) & CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_EMPTY_MASK)\r\n\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_COUNT_MASK (0x1F0U)\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_COUNT_SHIFT (4U)\r\n/*! CPU3_TO_CPU1_MSG_COUNT - cpu3_to_cpu1_msg_count */\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_COUNT(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_COUNT_SHIFT)) & CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_COUNT_MASK)\r\n\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_WR_PTR_MASK (0xF0000U)\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_WR_PTR_SHIFT (16U)\r\n/*! CPU3_TO_CPU1_MSG_FIFO_WR_PTR - cpu3 to cpu1 msg fifo write pointer for debug */\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_WR_PTR(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_WR_PTR_SHIFT)) & CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_WR_PTR_MASK)\r\n\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_RD_PTR_MASK (0xF00000U)\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_RD_PTR_SHIFT (20U)\r\n/*! CPU3_TO_CPU1_MSG_FIFO_RD_PTR - cpu3 to cpu1 msg fifo read pointer for debug */\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_RD_PTR(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_RD_PTR_SHIFT)) & CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_STATUS_CPU3_TO_CPU1_MSG_FIFO_RD_PTR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL - CPU3 to cpu1 message FIFO control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_MSG_RDY_INT_CLR_MASK (0x1U)\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_MSG_RDY_INT_CLR_SHIFT (0U)\r\n/*! CPU3_MSG_RDY_INT_CLR - Writing 1 to this bit will clear message ready interrupt to cpu3 (self clear bit) */\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_MSG_RDY_INT_CLR(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_MSG_RDY_INT_CLR_SHIFT)) & CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_MSG_RDY_INT_CLR_MASK)\r\n\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_MSG_SP_AV_INT_CLR_MASK (0x100U)\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_MSG_SP_AV_INT_CLR_SHIFT (8U)\r\n/*! CPU3_MSG_SP_AV_INT_CLR - Writing 1 to this bit will clear message space available interrupt to CPU3 (self clear bit) */\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_MSG_SP_AV_INT_CLR(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_MSG_SP_AV_INT_CLR_SHIFT)) & CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_MSG_SP_AV_INT_CLR_MASK)\r\n\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_TO_CPU1_MSG_FIFO_FLUSH_MASK (0x10000U)\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_TO_CPU1_MSG_FIFO_FLUSH_SHIFT (16U)\r\n/*! CPU3_TO_CPU1_MSG_FIFO_FLUSH - Writing 1 to this bit will flush cpu3_to_cpu1 message fifo */\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_TO_CPU1_MSG_FIFO_FLUSH(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_TO_CPU1_MSG_FIFO_FLUSH_SHIFT)) & CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_TO_CPU1_MSG_FIFO_FLUSH_MASK)\r\n\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_WAIT_FOR_ACK_MASK (0x20000U)\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_WAIT_FOR_ACK_SHIFT (17U)\r\n/*! CPU3_WAIT_FOR_ACK - CPU3 Wait for Acknowledgment */\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_WAIT_FOR_ACK(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_WAIT_FOR_ACK_SHIFT)) & CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_WAIT_FOR_ACK_MASK)\r\n\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_TO_CPU1_MSG_FIFO_FULL_WATERMARK_MASK (0xF00000U)\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_TO_CPU1_MSG_FIFO_FULL_WATERMARK_SHIFT (20U)\r\n/*! CPU3_TO_CPU1_MSG_FIFO_FULL_WATERMARK - cpu3_to_cpu1 message fifo full watermark (space avail intr based upon it) */\r\n#define CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_TO_CPU1_MSG_FIFO_FULL_WATERMARK(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_TO_CPU1_MSG_FIFO_FULL_WATERMARK_SHIFT)) & CIU1_CIU1_IMU_CPU3_CPU1_MSG_FIFO_CNTL_CPU3_TO_CPU1_MSG_FIFO_FULL_WATERMARK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_IMU_CPU1_RD_MSG_FROM_CPU3_VAL_DBG - cpu1 last message read (from cpu3) */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_IMU_CPU1_RD_MSG_FROM_CPU3_VAL_DBG_CPU1_RD_MSG_MASK (0xFFFFFFFFU)\r\n#define CIU1_CIU1_IMU_CPU1_RD_MSG_FROM_CPU3_VAL_DBG_CPU1_RD_MSG_SHIFT (0U)\r\n/*! CPU1_RD_MSG - cpu1 last message read (from cpu3) */\r\n#define CIU1_CIU1_IMU_CPU1_RD_MSG_FROM_CPU3_VAL_DBG_CPU1_RD_MSG(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_IMU_CPU1_RD_MSG_FROM_CPU3_VAL_DBG_CPU1_RD_MSG_SHIFT)) & CIU1_CIU1_IMU_CPU1_RD_MSG_FROM_CPU3_VAL_DBG_CPU1_RD_MSG_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CPU1_CPU3_MSG_CTRL - CPU1_CPU3 message register */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_CPU1_CPU3_MSG_CTRL_CPU1_TO_CPU3_MSG_RDY_MASK (0x1U)\r\n#define CIU1_CIU_CPU1_CPU3_MSG_CTRL_CPU1_TO_CPU3_MSG_RDY_SHIFT (0U)\r\n/*! CPU1_TO_CPU3_MSG_RDY - CPU1 Message for CPU3 is ready. This is self clearing bit. The CPU1\r\n *    writes 1 to indicate that message for CPU3 is ready. This generates an Interrupt to CPU3 via APU.\r\n *    This is old schema and we should use IMU based scheme.\r\n */\r\n#define CIU1_CIU_CPU1_CPU3_MSG_CTRL_CPU1_TO_CPU3_MSG_RDY(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU1_CPU3_MSG_CTRL_CPU1_TO_CPU3_MSG_RDY_SHIFT)) & CIU1_CIU_CPU1_CPU3_MSG_CTRL_CPU1_TO_CPU3_MSG_RDY_MASK)\r\n\r\n#define CIU1_CIU_CPU1_CPU3_MSG_CTRL_CPU3_TO_CPU1_MSG_RDY_MASK (0x2U)\r\n#define CIU1_CIU_CPU1_CPU3_MSG_CTRL_CPU3_TO_CPU1_MSG_RDY_SHIFT (1U)\r\n/*! CPU3_TO_CPU1_MSG_RDY - CPU3 Message for CPU1 is ready. This is self clearing bit. The CPU3\r\n *    writes 1 to indicate that message for CPU1 is ready. This generates an Interrupt to CPU1 via APU.\r\n *    This is old schema and we should use IMU based scheme.\r\n */\r\n#define CIU1_CIU_CPU1_CPU3_MSG_CTRL_CPU3_TO_CPU1_MSG_RDY(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU1_CPU3_MSG_CTRL_CPU3_TO_CPU1_MSG_RDY_SHIFT)) & CIU1_CIU_CPU1_CPU3_MSG_CTRL_CPU3_TO_CPU1_MSG_RDY_MASK)\r\n\r\n#define CIU1_CIU_CPU1_CPU3_MSG_CTRL_CPU1_TO_CPU3_MSG_PROCESS_DONE_MASK (0x100U)\r\n#define CIU1_CIU_CPU1_CPU3_MSG_CTRL_CPU1_TO_CPU3_MSG_PROCESS_DONE_SHIFT (8U)\r\n/*! CPU1_TO_CPU3_MSG_PROCESS_DONE - CPU1 Message for CPU3 has been read by CPU3 and executed. This\r\n *    is self clearing bit. The CPU3 writes 1 to indicate that message sent by CPU1 is executed. This\r\n *    generates an Interrupt to CPU1 via CIU1.\r\n */\r\n#define CIU1_CIU_CPU1_CPU3_MSG_CTRL_CPU1_TO_CPU3_MSG_PROCESS_DONE(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU1_CPU3_MSG_CTRL_CPU1_TO_CPU3_MSG_PROCESS_DONE_SHIFT)) & CIU1_CIU_CPU1_CPU3_MSG_CTRL_CPU1_TO_CPU3_MSG_PROCESS_DONE_MASK)\r\n\r\n#define CIU1_CIU_CPU1_CPU3_MSG_CTRL_CPU3_TO_CPU1_MSG_PROCESS_DONE_MASK (0x200U)\r\n#define CIU1_CIU_CPU1_CPU3_MSG_CTRL_CPU3_TO_CPU1_MSG_PROCESS_DONE_SHIFT (9U)\r\n/*! CPU3_TO_CPU1_MSG_PROCESS_DONE - CPU3 Message for CPU1 has been read by CPU1 and executed. This\r\n *    is self clearing bit. The CPU1 writes 1 to indicate that message send by CPU3 is executed. This\r\n *    generates an Interrupt to CPU3 via CIU1.\r\n */\r\n#define CIU1_CIU_CPU1_CPU3_MSG_CTRL_CPU3_TO_CPU1_MSG_PROCESS_DONE(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_CPU1_CPU3_MSG_CTRL_CPU3_TO_CPU1_MSG_PROCESS_DONE_SHIFT)) & CIU1_CIU_CPU1_CPU3_MSG_CTRL_CPU3_TO_CPU1_MSG_PROCESS_DONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_CPU3_WAKEUP_CTRL - CIU1 register to wakeup CPU3 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_CPU3_WAKEUP_CTRL_CPU3_WAKEUP_CTRL_MASK (0x1U)\r\n#define CIU1_CIU1_CPU3_WAKEUP_CTRL_CPU3_WAKEUP_CTRL_SHIFT (0U)\r\n/*! CPU3_WAKEUP_CTRL - CPU3 Wakeup Control Register. S/W Write 1 to generate a wake up interrupt to\r\n *    CPU3.Clear by S/W once mci_wl_wakeup_done[1] interrupt is received from CPU3.\r\n */\r\n#define CIU1_CIU1_CPU3_WAKEUP_CTRL_CPU3_WAKEUP_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_CPU3_WAKEUP_CTRL_CPU3_WAKEUP_CTRL_SHIFT)) & CIU1_CIU1_CPU3_WAKEUP_CTRL_CPU3_WAKEUP_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_CPU1_WAKEUP_DONE - Wakeup done Control Register to CPU3 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_CPU1_WAKEUP_DONE_CPU1_WAKEUP_DONE_MASK (0xFFU)\r\n#define CIU1_CIU1_CPU1_WAKEUP_DONE_CPU1_WAKEUP_DONE_SHIFT (0U)\r\n/*! CPU1_WAKEUP_DONE - CPU1 Wakeup is done . This bit is set to 1 by S/W when CPU3 wakesup CPU1.This\r\n *    is self clearing bit. This generates an interrupt to CPU3 via wl_mci_wakeup_done[7:0] signal.\r\n */\r\n#define CIU1_CIU1_CPU1_WAKEUP_DONE_CPU1_WAKEUP_DONE(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_CPU1_WAKEUP_DONE_CPU1_WAKEUP_DONE_SHIFT)) & CIU1_CIU1_CPU1_WAKEUP_DONE_CPU1_WAKEUP_DONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU1_CPU3_NS_GP_INT - Non Secure region GP interrupt to CPU3 */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU1_CPU3_NS_GP_INT_CPU1_CPU3_GP_NS_INT_MASK (0x3U)\r\n#define CIU1_CIU1_CPU3_NS_GP_INT_CPU1_CPU3_GP_NS_INT_SHIFT (0U)\r\n/*! CPU1_CPU3_GP_NS_INT - General Purpose interrupt to CPU3 from non secure registers */\r\n#define CIU1_CIU1_CPU3_NS_GP_INT_CPU1_CPU3_GP_NS_INT(x) (((uint32_t)(((uint32_t)(x)) << CIU1_CIU1_CPU3_NS_GP_INT_CPU1_CPU3_GP_NS_INT_SHIFT)) & CIU1_CIU1_CPU3_NS_GP_INT_CPU1_CPU3_GP_NS_INT_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_IMU_ECO_BITS - IMU ECO Control */\r\n/*! @{ */\r\n\r\n#define CIU1_CIU_IMU_ECO_BITS_ECO_BITS_MASK      (0xFFFFU)\r\n#define CIU1_CIU_IMU_ECO_BITS_ECO_BITS_SHIFT     (0U)\r\n/*! ECO_BITS - Reserved for ECOs */\r\n#define CIU1_CIU_IMU_ECO_BITS_ECO_BITS(x)        (((uint32_t)(((uint32_t)(x)) << CIU1_CIU_IMU_ECO_BITS_ECO_BITS_SHIFT)) & CIU1_CIU_IMU_ECO_BITS_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group CIU1_Register_Masks */\r\n\r\n\r\n/* CIU1 - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral WLCTRL base address */\r\n  #define WLCTRL_BASE                              (0x51240000u)\r\n  /** Peripheral WLCTRL base address */\r\n  #define WLCTRL_BASE_NS                           (0x41240000u)\r\n  /** Peripheral WLCTRL base pointer */\r\n  #define WLCTRL                                   ((CIU1_Type *)WLCTRL_BASE)\r\n  /** Peripheral WLCTRL base pointer */\r\n  #define WLCTRL_NS                                ((CIU1_Type *)WLCTRL_BASE_NS)\r\n  /** Array initializer of CIU1 peripheral base addresses */\r\n  #define CIU1_BASE_ADDRS                          { WLCTRL_BASE }\r\n  /** Array initializer of CIU1 peripheral base pointers */\r\n  #define CIU1_BASE_PTRS                           { WLCTRL }\r\n  /** Array initializer of CIU1 peripheral base addresses */\r\n  #define CIU1_BASE_ADDRS_NS                       { WLCTRL_BASE_NS }\r\n  /** Array initializer of CIU1 peripheral base pointers */\r\n  #define CIU1_BASE_PTRS_NS                        { WLCTRL_NS }\r\n#else\r\n  /** Peripheral WLCTRL base address */\r\n  #define WLCTRL_BASE                              (0x41240000u)\r\n  /** Peripheral WLCTRL base pointer */\r\n  #define WLCTRL                                   ((CIU1_Type *)WLCTRL_BASE)\r\n  /** Array initializer of CIU1 peripheral base addresses */\r\n  #define CIU1_BASE_ADDRS                          { WLCTRL_BASE }\r\n  /** Array initializer of CIU1 peripheral base pointers */\r\n  #define CIU1_BASE_PTRS                           { WLCTRL }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group CIU1_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- CIU2 Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup CIU2_Peripheral_Access_Layer CIU2 Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** CIU2 - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t CIU2_CLK_ENABLE;                   /**< Clock enable, offset: 0x0 */\r\n  __IO uint32_t CIU2_ECO_0;                        /**< ECO Register 0, offset: 0x4 */\r\n  __IO uint32_t CIU2_ECO_1;                        /**< ECO Register 1, offset: 0x8 */\r\n  __IO uint32_t CIU2_ECO_2;                        /**< ECO Register 2, offset: 0xC */\r\n  __IO uint32_t CIU2_ECO_3;                        /**< ECO Register 3, offset: 0x10 */\r\n  __IO uint32_t CIU2_ECO_4;                        /**< ECO Register 4, offset: 0x14 */\r\n  __IO uint32_t CIU2_ECO_5;                        /**< ECO Register 5, offset: 0x18 */\r\n  __IO uint32_t CIU2_ECO_6;                        /**< ECO Register 6, offset: 0x1C */\r\n  __IO uint32_t CIU2_ECO_7;                        /**< ECO Register 7, offset: 0x20 */\r\n  __IO uint32_t CIU2_ECO_8;                        /**< ECO Register 8, offset: 0x24 */\r\n  __IO uint32_t CIU2_ECO_9;                        /**< ECO Register 9, offset: 0x28 */\r\n  __IO uint32_t CIU2_ECO_10;                       /**< ECO Register 10, offset: 0x2C */\r\n  __IO uint32_t CIU2_ECO_11;                       /**< ECO Register 11, offset: 0x30 */\r\n  __IO uint32_t CIU2_ECO_12;                       /**< ECO Register 12, offset: 0x34 */\r\n  __IO uint32_t CIU2_ECO_13;                       /**< ECO Register 13, offset: 0x38 */\r\n  __IO uint32_t CIU2_ECO_14;                       /**< ECO Register 14, offset: 0x3C */\r\n  __IO uint32_t CIU2_ECO_15;                       /**< ECO Register 15, offset: 0x40 */\r\n       uint8_t RESERVED_0[188];\r\n  __IO uint32_t CIU2_CLK_ENABLE4;                  /**< Clock Enable 4, offset: 0x100 */\r\n  __IO uint32_t CIU2_CLK_ENABLE5;                  /**< Clock Enable 5, offset: 0x104 */\r\n  __IO uint32_t CIU2_CLK_CPU2CLK_CTRL;             /**< CPU2_AHB2 Clock Control, offset: 0x108 */\r\n  __IO uint32_t CIU2_CLK_UARTCLK_CTRL;             /**< UART Clock Control, offset: 0x10C */\r\n  __IO uint32_t CIU2_CLK_LBU2_BTRTU1_CTRL;         /**< LBU2 BT_RTU1 Clock Control, offset: 0x110 */\r\n       uint8_t RESERVED_1[4];\r\n  __IO uint32_t CIU2_CLK_CP15_DIS3;                /**< Clock Auto Shut-off Enable3, offset: 0x118 */\r\n  __IO uint32_t CIU2_RST_SW3;                      /**< Software Module Reset, offset: 0x11C */\r\n  __IO uint32_t CIU2_MEM_WRTC3;                    /**< Memory WRTC Control 3, offset: 0x120 */\r\n  __IO uint32_t CIU2_MEM_WRTC4;                    /**< Memory WRTC Control 4, offset: 0x124 */\r\n  __IO uint32_t CIU2_MEM_PWDN3;                    /**< Memory Power down Control, offset: 0x128 */\r\n  __I  uint32_t CIU2_SOC_AHB2APB_STATUS;           /**< SOC AHB2APB Status, offset: 0x12C */\r\n       uint8_t RESERVED_2[16];\r\n  __IO uint32_t CIU2_BLE_CTRL;                     /**< BLE Control and Status, offset: 0x140 */\r\n  __I  uint32_t CIU2_AHB2_TO_LAST_ADDR;            /**< AHB2 Timeout Last Address, offset: 0x144 */\r\n  __I  uint32_t CIU2_AHB2_TO_CUR_ADDR;             /**< AHB2 Current Timeout Address, offset: 0x148 */\r\n  __IO uint32_t CIU2_AHB2_TO_CTRL;                 /**< AHB2 ARB Control, offset: 0x14C */\r\n  __IO uint32_t CIU2_AHB2_SMU1_ACCESS_ADDR;        /**< AHB2 to SMU1 Accessible Address, offset: 0x150 */\r\n  __IO uint32_t CIU2_AHB2_SMU1_ACCESS_MASK;        /**< AHB2 to SMU1 Accessible Mask, offset: 0x154 */\r\n       uint8_t RESERVED_3[4];\r\n  __IO uint32_t CIU2_CPU2_ICODE_INV_ADDR_CTRL;     /**< CPU2 Icode invalid address access control, offset: 0x15C */\r\n  __I  uint32_t CIU2_CPU2_ICODE_INV_ADDR;          /**< CPU2 Icode invalid address, offset: 0x160 */\r\n  __IO uint32_t CIU2_CPU2_DCODE_INV_ADDR_CTRL;     /**< CPU2 Dcode invalid address access control, offset: 0x164 */\r\n  __I  uint32_t CIU2_CPU2_DCODE_INV_ADDR;          /**< CPU2 Dcode invalid address, offset: 0x168 */\r\n  __IO uint32_t CIU2_CPU_CPU2_CTRL;                /**< CPU2 control register, offset: 0x16C */\r\n  __IO uint32_t CIU2_BRF_CTRL;                     /**< BRF Control and Status, offset: 0x170 */\r\n  __IO uint32_t CIU2_BRF_EXTRA_PORT;               /**< BRF Extra Port Connection, offset: 0x174 */\r\n       uint8_t RESERVED_4[4];\r\n  __IO uint32_t CIU2_BRF_ECO_CTRL;                 /**< BRF ECO Control, offset: 0x17C */\r\n  __IO uint32_t CIU2_BTU_CTRL;                     /**< BTU Control and Status, offset: 0x180 */\r\n  __IO uint32_t CIU2_BT_PS;                        /**< BT Clock Power Save, offset: 0x184 */\r\n  __IO uint32_t CIU2_BT_PS2;                       /**< BT Clock Power Save 2, offset: 0x188 */\r\n  __IO uint32_t CIU2_BT_REF_CTRL;                  /**< BT Ref Control, offset: 0x18C */\r\n       uint8_t RESERVED_5[4];\r\n  __IO uint32_t CIU2_BT_PS3;                       /**< BT Clock Power Save 3, offset: 0x194 */\r\n  __IO uint32_t CIU2_BTU_ECO_CTRL;                 /**< BTU ECO Control, offset: 0x198 */\r\n       uint8_t RESERVED_6[4];\r\n  __IO uint32_t CIU2_INT_MASK;                     /**< CIU2 Interrupt Mask, offset: 0x1A0 */\r\n  __IO uint32_t CIU2_INT_SELECT;                   /**< CIU2 Interrupt Select, offset: 0x1A4 */\r\n  __IO uint32_t CIU2_INT_EVENT_MASK;               /**< CIU2 Interrupt Event Mask, offset: 0x1A8 */\r\n  __I  uint32_t CIU2_INT_STATUS;                   /**< CIU2 Interrupt Status, offset: 0x1AC */\r\n  __IO uint32_t CPU2_ERR_INT_MASK;                 /**< CPU2 ERR Interrupt Mask, offset: 0x1B0 */\r\n  __IO uint32_t CPU2_ERR_INT_SELECT;               /**< CPU2 ERR Interrupt Clear Select, offset: 0x1B4 */\r\n  __IO uint32_t CPU2_ERR_INT_EVENT_MASK;           /**< CPU2 ERR Interrupt Event Mask, offset: 0x1B8 */\r\n  __I  uint32_t CPU2_ERR_INT_STATUS;               /**< CPU2 ERR Interrupt Status, offset: 0x1BC */\r\n       uint8_t RESERVED_7[64];\r\n  __IO uint32_t CIU2_BCA1_CPU2_INT_MASK;           /**< BCA1 to CPU2 Interrupt Mask, offset: 0x200 */\r\n  __IO uint32_t CIU2_BCA1_CPU2_INT_SELECT;         /**< BCA1 to CPU2 Interrupt Select, offset: 0x204 */\r\n  __IO uint32_t CIU2_BCA1_CPU2_INT_EVENT_MASK;     /**< BCA1 to CPU2 Interrupt Event Mask, offset: 0x208 */\r\n  __I  uint32_t CIU2_BCA1_CPU2_INT_STATUS;         /**< BCA1 to CPU2 Interrupt Status, offset: 0x20C */\r\n  __IO uint32_t CIU2_APU_BYPASS1;                  /**< CIU2 APU Bypass Register 1, offset: 0x210 */\r\n  __IO uint32_t CIU2_CPU2_LMU_STA_BYPASS0;         /**< LMU static bank control byapss0 Register for CPU2 mem, offset: 0x214 */\r\n  __IO uint32_t CIU2_CPU2_LMU_STA_BYPASS1;         /**< LMU static bank control byapss1 Register for CPU2, offset: 0x218 */\r\n  __IO uint32_t CIU2_CPU2_LMU_STA_BYPASS2;         /**< LMU static bank byapss2 Register for CPU2, offset: 0x21C */\r\n  __IO uint32_t CIU2_CPU2_LMU_G2BIST_CTRL_BYPASS;  /**< LMU G2Bist control bypass Register for CPU2, offset: 0x220 */\r\n       uint8_t RESERVED_8[8];\r\n  __IO uint32_t CIU2_APU_PWR_CTRL_BYPASS1;         /**< APU power control Bypass Register 1, offset: 0x22C */\r\n  __IO uint32_t CIU2_AHB2AHB_BRIDGE_CTRL;          /**< AHB2AHB Bridge Control Register, offset: 0x230 */\r\n  __IO uint32_t CIU2_CLK_CP15_DIS1;                /**< Clock Auto Shut-off Enable1, offset: 0x234 */\r\n  __IO uint32_t CIU_CLK_RTU_NCO_CTRL;              /**< RTU NCO Clock Control, offset: 0x238 */\r\n  __IO uint32_t CIU_CLK_SOCCLK_CTRL;               /**< SOC Clock Control, offset: 0x23C */\r\n  __IO uint32_t CIU_CLK_SLEEPCLK_CTRL;             /**< Sleep Clock Control, offset: 0x240 */\r\n  __IO uint32_t CIU_CLK_SLEEPCLK_CTRL2;            /**< Sleep Clock Control 2, offset: 0x244 */\r\n       uint8_t RESERVED_9[8];\r\n  __IO uint32_t CIU2_IOMUX_MODE_CTRL;              /**< Test Bus Select, offset: 0x250 */\r\n  __IO uint32_t CIU2_RST_SW2;                      /**< Software Module Reset, offset: 0x254 */\r\n       uint8_t RESERVED_10[8];\r\n  __IO uint32_t CIU2_AHB2_TO_CLEAR;                /**< AHB2 timeout logic clear register, offset: 0x260 */\r\n  __IO uint32_t CIU2_CPU_DYN_CLK_CTRL;             /**< Dynamic CPU Clock Control, offset: 0x264 */\r\n  __I  uint32_t CPU2_DBG_STAT;                     /**< CPU2 debug register, offset: 0x268 */\r\n  __I  uint32_t BTSS_MBIST_STAT;                   /**< offset: 0x26C */\r\n       uint8_t RESERVED_11[4];\r\n  __IO uint32_t CIU2_TEST_MODE;                    /**< \", offset: 0x274 */\r\n       uint8_t RESERVED_12[4];\r\n  __IO uint32_t CIU2_APU_BYPASS2;                  /**< CIU2 APU Bypass Register 2, offset: 0x27C */\r\n  __I  uint32_t CIU2_TST_G2BIST_STATUS;            /**< WL G2BIST Status, offset: 0x280 */\r\n  __IO uint32_t CIU2_LPO_CLK_GEN_CTRL;             /**< BLE LPO CLK GEN Control, offset: 0x284 */\r\n  __I  uint32_t CIU2_LPO_CLK_GEN_STATUS;           /**< BLE LPO CLK GEN Status, offset: 0x288 */\r\n  __IO uint32_t CIU2_LPO_SLP_CLK_GEN_CTRL;         /**< \", offset: 0x28C */\r\n  __IO uint32_t CPU2_INT_CTRL;                     /**< \", offset: 0x290 */\r\n  __I  uint32_t CIU2_BRF_EXTRA_PORT_STATUS;        /**< \", offset: 0x294 */\r\n  __I  uint32_t CIU2_DEBUG;                        /**< \", offset: 0x298 */\r\n       uint8_t RESERVED_13[100];\r\n  __IO uint32_t CIU2_MCI_EXTRA;                    /**< MCI EXTRA Ports, offset: 0x300 */\r\n  __IO uint32_t CIU2_TSTBUS_SEL;                   /**< Test Bus Select, offset: 0x304 */\r\n  __IO uint32_t FFU_CTRL;                          /**< FFU Specific Control Register, offset: 0x308 */\r\n       uint8_t RESERVED_14[116];\r\n  __IO uint32_t BLE_RAACS_CTRL;                    /**< RAACS control registers, offset: 0x380 */\r\n  __IO uint32_t BLE_RAACS_PERFORMANCE_STATISTICS;  /**< RAACS performance statistics counter., offset: 0x384 */\r\n       uint8_t RESERVED_15[1832056];\r\n  __IO uint32_t CIU2_CPU_CPU2_MSG_CTRL;            /**< CPU2 message register, offset: 0x1BF800 */\r\n  __IO uint32_t CIU2_IMU_CPU3_WR_MSG_TO_CPU2;      /**< CPU3 write message to CPU2, offset: 0x1BF804 */\r\n  __I  uint32_t CIU2_IMU_CPU3_RD_MSG_FROM_CPU2;    /**< CPU3 read message from CPU2, offset: 0x1BF808 */\r\n  __I  uint32_t CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS; /**< CPU3 to CPU2 message FIFO status, offset: 0x1BF80C */\r\n  __IO uint32_t CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL;  /**< CPU3 to CPU2 message FIFO control, offset: 0x1BF810 */\r\n  __I  uint32_t CIU2_IMU_CPU2_RD_MSG_FROM_CPU3_VAL_DBG; /**< CPU2 last message read (from cpu3), offset: 0x1BF814 */\r\n  __IO uint32_t CIU2_IMU_CPU2_WR_MSG_TO_CPU3;      /**< CPU2 write message to CPU3, offset: 0x1BF818 */\r\n  __I  uint32_t CIU2_IMU_CPU2_RD_MSG_FROM_CPU3;    /**< CPU2 read message from CPU3, offset: 0x1BF81C */\r\n  __I  uint32_t CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS; /**< CPU2 to CPU3 message FIFO status, offset: 0x1BF820 */\r\n  __IO uint32_t CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL;  /**< CPU2 to CPU3 message FIFO control, offset: 0x1BF824 */\r\n  __I  uint32_t CIU2_IMU_CPU3_RD_MSG_FROM_CPU2_VAL_DBG; /**< CPU3 last message read (from cpu2), offset: 0x1BF828 */\r\n  __IO uint32_t CIU2_CPU3_WAKEUP_CTRL;             /**< CIU2 register to wakeup CPU3, offset: 0x1BF82C */\r\n  __IO uint32_t CIU2_CPU2_WAKEUP_DONE;             /**< Wakeup done Control Register to CPU3, offset: 0x1BF830 */\r\n  __IO uint32_t CIU2_CPU3_NS_GP_INT;               /**< Non Secure region GP interrupt to CPU3, offset: 0x1BF834 */\r\n  __IO uint32_t CIU2_IMU_ECO_BITS;                 /**< IMU ECO Control, offset: 0x1BF838 */\r\n} CIU2_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- CIU2 Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup CIU2_Register_Masks CIU2 Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name CIU2_CLK_ENABLE - Clock enable */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CLK_ENABLE_CIU2_AHB2APB_CLK_EN_MASK (0x40000U)\r\n#define CIU2_CIU2_CLK_ENABLE_CIU2_AHB2APB_CLK_EN_SHIFT (18U)\r\n/*! CIU2_AHB2APB_CLK_EN - Enable AHB2APB HCLK */\r\n#define CIU2_CIU2_CLK_ENABLE_CIU2_AHB2APB_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE_CIU2_AHB2APB_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE_CIU2_AHB2APB_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE_CIU2_MCI_A2A_CLK_EN_MASK (0x80000U)\r\n#define CIU2_CIU2_CLK_ENABLE_CIU2_MCI_A2A_CLK_EN_SHIFT (19U)\r\n/*! CIU2_MCI_A2A_CLK_EN - Enable AHB2 Clock to A2A in MCI */\r\n#define CIU2_CIU2_CLK_ENABLE_CIU2_MCI_A2A_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE_CIU2_MCI_A2A_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE_CIU2_MCI_A2A_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE_CIU2_FP4_SLP_CLK_EN_MASK (0x100000U)\r\n#define CIU2_CIU2_CLK_ENABLE_CIU2_FP4_SLP_CLK_EN_SHIFT (20U)\r\n/*! CIU2_FP4_SLP_CLK_EN - Enable FFU Sleep Clock */\r\n#define CIU2_CIU2_CLK_ENABLE_CIU2_FP4_SLP_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE_CIU2_FP4_SLP_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE_CIU2_FP4_SLP_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE_CIU2_FFU_OSC_CLK_EN_MASK (0x200000U)\r\n#define CIU2_CIU2_CLK_ENABLE_CIU2_FFU_OSC_CLK_EN_SHIFT (21U)\r\n/*! CIU2_FFU_OSC_CLK_EN - Enable FFU Oscillator Clock */\r\n#define CIU2_CIU2_CLK_ENABLE_CIU2_FFU_OSC_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE_CIU2_FFU_OSC_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE_CIU2_FFU_OSC_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_SOCCIU_A2A_CLK_EN_MASK (0x400000U)\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_SOCCIU_A2A_CLK_EN_SHIFT (22U)\r\n/*! CIU_SOCCIU_A2A_CLK_EN - Enable AHB2 Clock to A2A in SOCCIU */\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_SOCCIU_A2A_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE_CIU_SOCCIU_A2A_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE_CIU_SOCCIU_A2A_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_MSC_A2A_CLK_EN_MASK (0x800000U)\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_MSC_A2A_CLK_EN_SHIFT (23U)\r\n/*! CIU_MSC_A2A_CLK_EN - Enable AHB2 Clock to A2A in MSC */\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_MSC_A2A_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE_CIU_MSC_A2A_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE_CIU_MSC_A2A_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_DVFS_CLK_EN_MASK (0x1000000U)\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_DVFS_CLK_EN_SHIFT (24U)\r\n/*! CIU_BTAPU_DVFS_CLK_EN - APU DVFS Clock Enable */\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_DVFS_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_DVFS_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_DVFS_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_AHB_CLK_EN_MASK (0x2000000U)\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_AHB_CLK_EN_SHIFT (25U)\r\n/*! CIU_BTAPU_AHB_CLK_EN - APU AHB Clock Enable */\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_AHB_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_AHB_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_AHB_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_SLPCLK_EN_MASK (0x4000000U)\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_SLPCLK_EN_SHIFT (26U)\r\n/*! CIU_BTAPU_SLPCLK_EN - APU Sleep Clock Enable */\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_SLPCLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_SLPCLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_SLPCLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_CAL_CLK_EN_MASK (0x8000000U)\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_CAL_CLK_EN_SHIFT (27U)\r\n/*! CIU_BTAPU_CAL_CLK_EN - APU Calibration Clock Enable */\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_CAL_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_CAL_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_CAL_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_REF_CLK_EN_MASK (0x10000000U)\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_REF_CLK_EN_SHIFT (28U)\r\n/*! CIU_BTAPU_REF_CLK_EN - APU Reference Clock Enable */\r\n#define CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_REF_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_REF_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE_CIU_BTAPU_REF_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE_AHB2_CLK_ENABLE_MASK (0x20000000U)\r\n#define CIU2_CIU2_CLK_ENABLE_AHB2_CLK_ENABLE_SHIFT (29U)\r\n/*! AHB2_CLK_ENABLE - Clock ahb2_clk enable signal. Ahb2_clk enable. 1: enable, 0: disable */\r\n#define CIU2_CIU2_CLK_ENABLE_AHB2_CLK_ENABLE(x)  (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE_AHB2_CLK_ENABLE_SHIFT)) & CIU2_CIU2_CLK_ENABLE_AHB2_CLK_ENABLE_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE_CPU1_DIV_CLK_ENABLE_MASK (0x40000000U)\r\n#define CIU2_CIU2_CLK_ENABLE_CPU1_DIV_CLK_ENABLE_SHIFT (30U)\r\n/*! CPU1_DIV_CLK_ENABLE - Clock cpu1_div_clk enable signal. cpu1_div_clk enable. 1: enable, 0: disable */\r\n#define CIU2_CIU2_CLK_ENABLE_CPU1_DIV_CLK_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE_CPU1_DIV_CLK_ENABLE_SHIFT)) & CIU2_CIU2_CLK_ENABLE_CPU1_DIV_CLK_ENABLE_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE_SOC_AHB_CLK_SEL_MASK (0x80000000U)\r\n#define CIU2_CIU2_CLK_ENABLE_SOC_AHB_CLK_SEL_SHIFT (31U)\r\n/*! SOC_AHB_CLK_SEL - Clock selection for soc_ahb_clk. 0: AHB2_CLK, 1: CPU1_CLK_DIV */\r\n#define CIU2_CIU2_CLK_ENABLE_SOC_AHB_CLK_SEL(x)  (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE_SOC_AHB_CLK_SEL_SHIFT)) & CIU2_CIU2_CLK_ENABLE_SOC_AHB_CLK_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_ECO_0 - ECO Register 0 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_ECO_0_SPARE_MASK               (0xFFFFFFFFU)\r\n#define CIU2_CIU2_ECO_0_SPARE_SHIFT              (0U)\r\n/*! SPARE - Eco Reserve Register */\r\n#define CIU2_CIU2_ECO_0_SPARE(x)                 (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_ECO_0_SPARE_SHIFT)) & CIU2_CIU2_ECO_0_SPARE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_ECO_1 - ECO Register 1 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_ECO_1_SPARE_MASK               (0xFFFFFFFFU)\r\n#define CIU2_CIU2_ECO_1_SPARE_SHIFT              (0U)\r\n/*! SPARE - Eco Reserve Register */\r\n#define CIU2_CIU2_ECO_1_SPARE(x)                 (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_ECO_1_SPARE_SHIFT)) & CIU2_CIU2_ECO_1_SPARE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_ECO_2 - ECO Register 2 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_ECO_2_SPARE_MASK               (0xFFFFFFFFU)\r\n#define CIU2_CIU2_ECO_2_SPARE_SHIFT              (0U)\r\n/*! SPARE - Eco Reserve Register */\r\n#define CIU2_CIU2_ECO_2_SPARE(x)                 (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_ECO_2_SPARE_SHIFT)) & CIU2_CIU2_ECO_2_SPARE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_ECO_3 - ECO Register 3 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_ECO_3_SPARE_MASK               (0xFFFFFFFFU)\r\n#define CIU2_CIU2_ECO_3_SPARE_SHIFT              (0U)\r\n/*! SPARE - Eco Reserve Register */\r\n#define CIU2_CIU2_ECO_3_SPARE(x)                 (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_ECO_3_SPARE_SHIFT)) & CIU2_CIU2_ECO_3_SPARE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_ECO_4 - ECO Register 4 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_ECO_4_SPARE_MASK               (0xFFFFFFFFU)\r\n#define CIU2_CIU2_ECO_4_SPARE_SHIFT              (0U)\r\n/*! SPARE - Eco Reserve Register */\r\n#define CIU2_CIU2_ECO_4_SPARE(x)                 (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_ECO_4_SPARE_SHIFT)) & CIU2_CIU2_ECO_4_SPARE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_ECO_5 - ECO Register 5 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_ECO_5_SPARE_MASK               (0xFFFFFFFFU)\r\n#define CIU2_CIU2_ECO_5_SPARE_SHIFT              (0U)\r\n/*! SPARE - Eco Reserve Register */\r\n#define CIU2_CIU2_ECO_5_SPARE(x)                 (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_ECO_5_SPARE_SHIFT)) & CIU2_CIU2_ECO_5_SPARE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_ECO_6 - ECO Register 6 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_ECO_6_SPARE_MASK               (0xFFFFFFFFU)\r\n#define CIU2_CIU2_ECO_6_SPARE_SHIFT              (0U)\r\n/*! SPARE - Eco Reserve Register */\r\n#define CIU2_CIU2_ECO_6_SPARE(x)                 (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_ECO_6_SPARE_SHIFT)) & CIU2_CIU2_ECO_6_SPARE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_ECO_7 - ECO Register 7 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_ECO_7_SPARE_MASK               (0xFFFFFFFFU)\r\n#define CIU2_CIU2_ECO_7_SPARE_SHIFT              (0U)\r\n/*! SPARE - Eco Reserve Register */\r\n#define CIU2_CIU2_ECO_7_SPARE(x)                 (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_ECO_7_SPARE_SHIFT)) & CIU2_CIU2_ECO_7_SPARE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_ECO_8 - ECO Register 8 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_ECO_8_SPARE_MASK               (0xFFFFFFFFU)\r\n#define CIU2_CIU2_ECO_8_SPARE_SHIFT              (0U)\r\n/*! SPARE - Eco Reserve Register */\r\n#define CIU2_CIU2_ECO_8_SPARE(x)                 (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_ECO_8_SPARE_SHIFT)) & CIU2_CIU2_ECO_8_SPARE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_ECO_9 - ECO Register 9 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_ECO_9_SPARE_MASK               (0xFFFFFFFFU)\r\n#define CIU2_CIU2_ECO_9_SPARE_SHIFT              (0U)\r\n/*! SPARE - Eco Reserve Register */\r\n#define CIU2_CIU2_ECO_9_SPARE(x)                 (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_ECO_9_SPARE_SHIFT)) & CIU2_CIU2_ECO_9_SPARE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_ECO_10 - ECO Register 10 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_ECO_10_SPARE_MASK              (0xFFFFFFFFU)\r\n#define CIU2_CIU2_ECO_10_SPARE_SHIFT             (0U)\r\n/*! SPARE - Eco Reserve Register */\r\n#define CIU2_CIU2_ECO_10_SPARE(x)                (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_ECO_10_SPARE_SHIFT)) & CIU2_CIU2_ECO_10_SPARE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_ECO_11 - ECO Register 11 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_ECO_11_SPARE_MASK              (0xFFFFFFFFU)\r\n#define CIU2_CIU2_ECO_11_SPARE_SHIFT             (0U)\r\n/*! SPARE - Eco Reserve Register */\r\n#define CIU2_CIU2_ECO_11_SPARE(x)                (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_ECO_11_SPARE_SHIFT)) & CIU2_CIU2_ECO_11_SPARE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_ECO_12 - ECO Register 12 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_ECO_12_SPARE_MASK              (0xFFFFFFFFU)\r\n#define CIU2_CIU2_ECO_12_SPARE_SHIFT             (0U)\r\n/*! SPARE - Eco Reserve Register */\r\n#define CIU2_CIU2_ECO_12_SPARE(x)                (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_ECO_12_SPARE_SHIFT)) & CIU2_CIU2_ECO_12_SPARE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_ECO_13 - ECO Register 13 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_ECO_13_SPARE_MASK              (0xFFFFFFFFU)\r\n#define CIU2_CIU2_ECO_13_SPARE_SHIFT             (0U)\r\n/*! SPARE - Eco Reserve Register */\r\n#define CIU2_CIU2_ECO_13_SPARE(x)                (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_ECO_13_SPARE_SHIFT)) & CIU2_CIU2_ECO_13_SPARE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_ECO_14 - ECO Register 14 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_ECO_14_SPARE_MASK              (0xFFFFFFFFU)\r\n#define CIU2_CIU2_ECO_14_SPARE_SHIFT             (0U)\r\n/*! SPARE - Eco Reserve Register */\r\n#define CIU2_CIU2_ECO_14_SPARE(x)                (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_ECO_14_SPARE_SHIFT)) & CIU2_CIU2_ECO_14_SPARE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_ECO_15 - ECO Register 15 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_ECO_15_SPARE_MASK              (0xFFFFFFFFU)\r\n#define CIU2_CIU2_ECO_15_SPARE_SHIFT             (0U)\r\n/*! SPARE - Eco Reserve Register */\r\n#define CIU2_CIU2_ECO_15_SPARE(x)                (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_ECO_15_SPARE_SHIFT)) & CIU2_CIU2_ECO_15_SPARE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CLK_ENABLE4 - Clock Enable 4 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CLK_ENABLE4_BIST_AHB2_CLK_GATING_EN_MASK (0x1U)\r\n#define CIU2_CIU2_CLK_ENABLE4_BIST_AHB2_CLK_GATING_EN_SHIFT (0U)\r\n/*! BIST_AHB2_CLK_GATING_EN - CPU2 bist Clock for IMEM/DMEM/SMU2/EBRAM/ROM */\r\n#define CIU2_CIU2_CLK_ENABLE4_BIST_AHB2_CLK_GATING_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE4_BIST_AHB2_CLK_GATING_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE4_BIST_AHB2_CLK_GATING_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE4_BRU_AHB2_ADDR_MASK_DIS_MASK (0x2U)\r\n#define CIU2_CIU2_CLK_ENABLE4_BRU_AHB2_ADDR_MASK_DIS_SHIFT (1U)\r\n/*! BRU_AHB2_ADDR_MASK_DIS - CPU2 ROM Address Mask Selection */\r\n#define CIU2_CIU2_CLK_ENABLE4_BRU_AHB2_ADDR_MASK_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE4_BRU_AHB2_ADDR_MASK_DIS_SHIFT)) & CIU2_CIU2_CLK_ENABLE4_BRU_AHB2_ADDR_MASK_DIS_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE4_ITCM_AHB2_DYN_CLK_GATING_DIS_MASK (0x4U)\r\n#define CIU2_CIU2_CLK_ENABLE4_ITCM_AHB2_DYN_CLK_GATING_DIS_SHIFT (2U)\r\n/*! ITCM_AHB2_DYN_CLK_GATING_DIS - CPU2 ITCM Dynamic Clock Gating Feature */\r\n#define CIU2_CIU2_CLK_ENABLE4_ITCM_AHB2_DYN_CLK_GATING_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE4_ITCM_AHB2_DYN_CLK_GATING_DIS_SHIFT)) & CIU2_CIU2_CLK_ENABLE4_ITCM_AHB2_DYN_CLK_GATING_DIS_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE4_DTCM_AHB2_DYN_CLK_GATING_DIS_MASK (0x8U)\r\n#define CIU2_CIU2_CLK_ENABLE4_DTCM_AHB2_DYN_CLK_GATING_DIS_SHIFT (3U)\r\n/*! DTCM_AHB2_DYN_CLK_GATING_DIS - CPU2 DTCM Dynamic Clock Gating Feature */\r\n#define CIU2_CIU2_CLK_ENABLE4_DTCM_AHB2_DYN_CLK_GATING_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE4_DTCM_AHB2_DYN_CLK_GATING_DIS_SHIFT)) & CIU2_CIU2_CLK_ENABLE4_DTCM_AHB2_DYN_CLK_GATING_DIS_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE4_BRU_AHB2_DYN_CLK_GATING_DIS_MASK (0x10U)\r\n#define CIU2_CIU2_CLK_ENABLE4_BRU_AHB2_DYN_CLK_GATING_DIS_SHIFT (4U)\r\n/*! BRU_AHB2_DYN_CLK_GATING_DIS - CPU2 ROM Dynamic Clock Gating Feature */\r\n#define CIU2_CIU2_CLK_ENABLE4_BRU_AHB2_DYN_CLK_GATING_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE4_BRU_AHB2_DYN_CLK_GATING_DIS_SHIFT)) & CIU2_CIU2_CLK_ENABLE4_BRU_AHB2_DYN_CLK_GATING_DIS_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE4_SMU2_DYN_CLK_GATING_DIS_MASK (0x20U)\r\n#define CIU2_CIU2_CLK_ENABLE4_SMU2_DYN_CLK_GATING_DIS_SHIFT (5U)\r\n/*! SMU2_DYN_CLK_GATING_DIS - SMU2 Dynamic Clock Gating Feature */\r\n#define CIU2_CIU2_CLK_ENABLE4_SMU2_DYN_CLK_GATING_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE4_SMU2_DYN_CLK_GATING_DIS_SHIFT)) & CIU2_CIU2_CLK_ENABLE4_SMU2_DYN_CLK_GATING_DIS_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE4_EBRAM_BIST_CLK_EN_MASK (0x100U)\r\n#define CIU2_CIU2_CLK_ENABLE4_EBRAM_BIST_CLK_EN_SHIFT (8U)\r\n/*! EBRAM_BIST_CLK_EN - EBRAM BIST Clock Enable */\r\n#define CIU2_CIU2_CLK_ENABLE4_EBRAM_BIST_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE4_EBRAM_BIST_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE4_EBRAM_BIST_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE4_BT_ECLK_EN_MASK    (0x200U)\r\n#define CIU2_CIU2_CLK_ENABLE4_BT_ECLK_EN_SHIFT   (9U)\r\n/*! BT_ECLK_EN - BTU EBC Clock Enable */\r\n#define CIU2_CIU2_CLK_ENABLE4_BT_ECLK_EN(x)      (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE4_BT_ECLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE4_BT_ECLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE4_BT_4MCLK_EN_MASK   (0x400U)\r\n#define CIU2_CIU2_CLK_ENABLE4_BT_4MCLK_EN_SHIFT  (10U)\r\n/*! BT_4MCLK_EN - BTU 4 MHz Clock Enable */\r\n#define CIU2_CIU2_CLK_ENABLE4_BT_4MCLK_EN(x)     (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE4_BT_4MCLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE4_BT_4MCLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE4_BTU_AHB_CLK_EN_MASK (0x2000U)\r\n#define CIU2_CIU2_CLK_ENABLE4_BTU_AHB_CLK_EN_SHIFT (13U)\r\n/*! BTU_AHB_CLK_EN - BTU AHB Clock Enable */\r\n#define CIU2_CIU2_CLK_ENABLE4_BTU_AHB_CLK_EN(x)  (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE4_BTU_AHB_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE4_BTU_AHB_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE4_SIU_CLK_EN_MASK    (0x4000U)\r\n#define CIU2_CIU2_CLK_ENABLE4_SIU_CLK_EN_SHIFT   (14U)\r\n/*! SIU_CLK_EN - BT SIU (UART) clock enable */\r\n#define CIU2_CIU2_CLK_ENABLE4_SIU_CLK_EN(x)      (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE4_SIU_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE4_SIU_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE4_SMU2_AHB_CLK_EN_MASK (0x10000U)\r\n#define CIU2_CIU2_CLK_ENABLE4_SMU2_AHB_CLK_EN_SHIFT (16U)\r\n/*! SMU2_AHB_CLK_EN - SMU2 AHB Clock Enable */\r\n#define CIU2_CIU2_CLK_ENABLE4_SMU2_AHB_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE4_SMU2_AHB_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE4_SMU2_AHB_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE4_HPU2_CIU_CLK_EN_MASK (0x80000U)\r\n#define CIU2_CIU2_CLK_ENABLE4_HPU2_CIU_CLK_EN_SHIFT (19U)\r\n/*! HPU2_CIU_CLK_EN - HPU2 CIU Clock Enable */\r\n#define CIU2_CIU2_CLK_ENABLE4_HPU2_CIU_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE4_HPU2_CIU_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE4_HPU2_CIU_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE4_BLE_AHB_CLK_EN_MASK (0x100000U)\r\n#define CIU2_CIU2_CLK_ENABLE4_BLE_AHB_CLK_EN_SHIFT (20U)\r\n/*! BLE_AHB_CLK_EN - BLE ARM Clock Enable */\r\n#define CIU2_CIU2_CLK_ENABLE4_BLE_AHB_CLK_EN(x)  (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE4_BLE_AHB_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE4_BLE_AHB_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE4_BLE_SYS_CLK_EN_MASK (0x200000U)\r\n#define CIU2_CIU2_CLK_ENABLE4_BLE_SYS_CLK_EN_SHIFT (21U)\r\n/*! BLE_SYS_CLK_EN - BLE SYS Clock Enable */\r\n#define CIU2_CIU2_CLK_ENABLE4_BLE_SYS_CLK_EN(x)  (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE4_BLE_SYS_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE4_BLE_SYS_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE4_BLE_AEU_CLK_EN_MASK (0x400000U)\r\n#define CIU2_CIU2_CLK_ENABLE4_BLE_AEU_CLK_EN_SHIFT (22U)\r\n/*! BLE_AEU_CLK_EN - BT/BLE AEU Clock Enable */\r\n#define CIU2_CIU2_CLK_ENABLE4_BLE_AEU_CLK_EN(x)  (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE4_BLE_AEU_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE4_BLE_AEU_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE4_BT_16M_CLK_EN_MASK (0x800000U)\r\n#define CIU2_CIU2_CLK_ENABLE4_BT_16M_CLK_EN_SHIFT (23U)\r\n/*! BT_16M_CLK_EN - BT 16MHz Clock Enable */\r\n#define CIU2_CIU2_CLK_ENABLE4_BT_16M_CLK_EN(x)   (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE4_BT_16M_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE4_BT_16M_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE4_DBUS_CLK_EN_MASK   (0x1000000U)\r\n#define CIU2_CIU2_CLK_ENABLE4_DBUS_CLK_EN_SHIFT  (24U)\r\n/*! DBUS_CLK_EN - BLE DBUS Clock Enable */\r\n#define CIU2_CIU2_CLK_ENABLE4_DBUS_CLK_EN(x)     (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE4_DBUS_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE4_DBUS_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE4_SIU_AHB2_CLK_EN_MASK (0x20000000U)\r\n#define CIU2_CIU2_CLK_ENABLE4_SIU_AHB2_CLK_EN_SHIFT (29U)\r\n/*! SIU_AHB2_CLK_EN - BT SIU (UART) AHB clock enable */\r\n#define CIU2_CIU2_CLK_ENABLE4_SIU_AHB2_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE4_SIU_AHB2_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE4_SIU_AHB2_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE4_BTRTU1_CLK_EN_MASK (0x40000000U)\r\n#define CIU2_CIU2_CLK_ENABLE4_BTRTU1_CLK_EN_SHIFT (30U)\r\n/*! BTRTU1_CLK_EN - BT RTU1 clock enable */\r\n#define CIU2_CIU2_CLK_ENABLE4_BTRTU1_CLK_EN(x)   (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE4_BTRTU1_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE4_BTRTU1_CLK_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CLK_ENABLE5 - Clock Enable 5 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CLK_ENABLE5_ITCM_AHB2_CLK_EN_MASK (0x7U)\r\n#define CIU2_CIU2_CLK_ENABLE5_ITCM_AHB2_CLK_EN_SHIFT (0U)\r\n/*! ITCM_AHB2_CLK_EN - Enable CPU2 ITCM Banks 1-2 */\r\n#define CIU2_CIU2_CLK_ENABLE5_ITCM_AHB2_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE5_ITCM_AHB2_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE5_ITCM_AHB2_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE5_CIU2_FFU_AHB_CLK_EN_MASK (0x40U)\r\n#define CIU2_CIU2_CLK_ENABLE5_CIU2_FFU_AHB_CLK_EN_SHIFT (6U)\r\n/*! CIU2_FFU_AHB_CLK_EN - Enable for AHB Clock to FFU */\r\n#define CIU2_CIU2_CLK_ENABLE5_CIU2_FFU_AHB_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE5_CIU2_FFU_AHB_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE5_CIU2_FFU_AHB_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE5_CIU2_REG_CLK_EN_MASK (0x80U)\r\n#define CIU2_CIU2_CLK_ENABLE5_CIU2_REG_CLK_EN_SHIFT (7U)\r\n/*! CIU2_REG_CLK_EN - CIU2 Reg Clock Enable */\r\n#define CIU2_CIU2_CLK_ENABLE5_CIU2_REG_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE5_CIU2_REG_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE5_CIU2_REG_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE5_BR_AHB2_CLK_EN_MASK (0x7FFF00U)\r\n#define CIU2_CIU2_CLK_ENABLE5_BR_AHB2_CLK_EN_SHIFT (8U)\r\n/*! BR_AHB2_CLK_EN - CPU2 BROM AHB Clock Enable */\r\n#define CIU2_CIU2_CLK_ENABLE5_BR_AHB2_CLK_EN(x)  (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE5_BR_AHB2_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE5_BR_AHB2_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE5_BTU_MCLK_EN_MASK   (0x800000U)\r\n#define CIU2_CIU2_CLK_ENABLE5_BTU_MCLK_EN_SHIFT  (23U)\r\n/*! BTU_MCLK_EN - BTU MCLK Enable */\r\n#define CIU2_CIU2_CLK_ENABLE5_BTU_MCLK_EN(x)     (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE5_BTU_MCLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE5_BTU_MCLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE5_SMU2_BANK_CLK_EN_MASK (0x3000000U)\r\n#define CIU2_CIU2_CLK_ENABLE5_SMU2_BANK_CLK_EN_SHIFT (24U)\r\n/*! SMU2_BANK_CLK_EN - SMU2 bank Clock Enable */\r\n#define CIU2_CIU2_CLK_ENABLE5_SMU2_BANK_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE5_SMU2_BANK_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE5_SMU2_BANK_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE5_BTRTU1_AHB_CLK_EN_MASK (0x4000000U)\r\n#define CIU2_CIU2_CLK_ENABLE5_BTRTU1_AHB_CLK_EN_SHIFT (26U)\r\n/*! BTRTU1_AHB_CLK_EN - SW enable for btrtu ahb clock */\r\n#define CIU2_CIU2_CLK_ENABLE5_BTRTU1_AHB_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE5_BTRTU1_AHB_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE5_BTRTU1_AHB_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE5_SIF_CLK_SEL_MASK   (0x8000000U)\r\n#define CIU2_CIU2_CLK_ENABLE5_SIF_CLK_SEL_SHIFT  (27U)\r\n/*! SIF_CLK_SEL - SIF Clock Select */\r\n#define CIU2_CIU2_CLK_ENABLE5_SIF_CLK_SEL(x)     (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE5_SIF_CLK_SEL_SHIFT)) & CIU2_CIU2_CLK_ENABLE5_SIF_CLK_SEL_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE5_CPU2_GATEHCLK_EN_MASK (0x10000000U)\r\n#define CIU2_CIU2_CLK_ENABLE5_CPU2_GATEHCLK_EN_SHIFT (28U)\r\n/*! CPU2_GATEHCLK_EN - CPU2gate HCLK Feature */\r\n#define CIU2_CIU2_CLK_ENABLE5_CPU2_GATEHCLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE5_CPU2_GATEHCLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE5_CPU2_GATEHCLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE5_CPU2_FABRIC_CLK_EN_MASK (0x20000000U)\r\n#define CIU2_CIU2_CLK_ENABLE5_CPU2_FABRIC_CLK_EN_SHIFT (29U)\r\n/*! CPU2_FABRIC_CLK_EN - CPU2 Fabric Clock Control Feature */\r\n#define CIU2_CIU2_CLK_ENABLE5_CPU2_FABRIC_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE5_CPU2_FABRIC_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE5_CPU2_FABRIC_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE5_CPU2_MEM_SLV_CLK_EN_MASK (0x40000000U)\r\n#define CIU2_CIU2_CLK_ENABLE5_CPU2_MEM_SLV_CLK_EN_SHIFT (30U)\r\n/*! CPU2_MEM_SLV_CLK_EN - CPU2 Memory Slave Clock Control Feature */\r\n#define CIU2_CIU2_CLK_ENABLE5_CPU2_MEM_SLV_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE5_CPU2_MEM_SLV_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE5_CPU2_MEM_SLV_CLK_EN_MASK)\r\n\r\n#define CIU2_CIU2_CLK_ENABLE5_SIF_AHB2_CLK_EN_MASK (0x80000000U)\r\n#define CIU2_CIU2_CLK_ENABLE5_SIF_AHB2_CLK_EN_SHIFT (31U)\r\n/*! SIF_AHB2_CLK_EN - SIF ahb2 Clock Enable */\r\n#define CIU2_CIU2_CLK_ENABLE5_SIF_AHB2_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_ENABLE5_SIF_AHB2_CLK_EN_SHIFT)) & CIU2_CIU2_CLK_ENABLE5_SIF_AHB2_CLK_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CLK_CPU2CLK_CTRL - CPU2_AHB2 Clock Control */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CLK_CPU2CLK_CTRL_T1_FREQ_SEL_MASK (0xFU)\r\n#define CIU2_CIU2_CLK_CPU2CLK_CTRL_T1_FREQ_SEL_SHIFT (0U)\r\n/*! T1_FREQ_SEL - AHB2 Clock Frequency Select */\r\n#define CIU2_CIU2_CLK_CPU2CLK_CTRL_T1_FREQ_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_CPU2CLK_CTRL_T1_FREQ_SEL_SHIFT)) & CIU2_CIU2_CLK_CPU2CLK_CTRL_T1_FREQ_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CLK_UARTCLK_CTRL - UART Clock Control */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CLK_UARTCLK_CTRL_REFCLK_SEL_MASK (0x1U)\r\n#define CIU2_CIU2_CLK_UARTCLK_CTRL_REFCLK_SEL_SHIFT (0U)\r\n/*! REFCLK_SEL - Reference Clock Select */\r\n#define CIU2_CIU2_CLK_UARTCLK_CTRL_REFCLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_UARTCLK_CTRL_REFCLK_SEL_SHIFT)) & CIU2_CIU2_CLK_UARTCLK_CTRL_REFCLK_SEL_MASK)\r\n\r\n#define CIU2_CIU2_CLK_UARTCLK_CTRL_NCO_STEP_SIZE_MASK (0xFFFFFF80U)\r\n#define CIU2_CIU2_CLK_UARTCLK_CTRL_NCO_STEP_SIZE_SHIFT (7U)\r\n/*! NCO_STEP_SIZE - Programmable UART Clock Frequency */\r\n#define CIU2_CIU2_CLK_UARTCLK_CTRL_NCO_STEP_SIZE(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_UARTCLK_CTRL_NCO_STEP_SIZE_SHIFT)) & CIU2_CIU2_CLK_UARTCLK_CTRL_NCO_STEP_SIZE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CLK_LBU2_BTRTU1_CTRL - LBU2 BT_RTU1 Clock Control */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CLK_LBU2_BTRTU1_CTRL_LBU2_USE_REFCLK_MASK (0x2U)\r\n#define CIU2_CIU2_CLK_LBU2_BTRTU1_CTRL_LBU2_USE_REFCLK_SHIFT (1U)\r\n/*! LBU2_USE_REFCLK - Static bit set by FW based on Reference Clock Frequency. If reference clock\r\n *    frequency is lower and LBU can not support high baud rate of UART, then FW will set\r\n *    soc_use_ref_mode = 0. This is an indication for Bluetooth subsystem that there is some IP which need PLL\r\n *    to function which is LBU in this case.\r\n */\r\n#define CIU2_CIU2_CLK_LBU2_BTRTU1_CTRL_LBU2_USE_REFCLK(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_LBU2_BTRTU1_CTRL_LBU2_USE_REFCLK_SHIFT)) & CIU2_CIU2_CLK_LBU2_BTRTU1_CTRL_LBU2_USE_REFCLK_MASK)\r\n\r\n#define CIU2_CIU2_CLK_LBU2_BTRTU1_CTRL_BTRTU1_TIMER1_USE_SLP_CLK_MASK (0x800U)\r\n#define CIU2_CIU2_CLK_LBU2_BTRTU1_CTRL_BTRTU1_TIMER1_USE_SLP_CLK_SHIFT (11U)\r\n/*! BTRTU1_TIMER1_USE_SLP_CLK - Timer 1 BT_RTU1 Clock */\r\n#define CIU2_CIU2_CLK_LBU2_BTRTU1_CTRL_BTRTU1_TIMER1_USE_SLP_CLK(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_LBU2_BTRTU1_CTRL_BTRTU1_TIMER1_USE_SLP_CLK_SHIFT)) & CIU2_CIU2_CLK_LBU2_BTRTU1_CTRL_BTRTU1_TIMER1_USE_SLP_CLK_MASK)\r\n\r\n#define CIU2_CIU2_CLK_LBU2_BTRTU1_CTRL_BTRTU1_USE_REF_CLK_MASK (0x1000U)\r\n#define CIU2_CIU2_CLK_LBU2_BTRTU1_CTRL_BTRTU1_USE_REF_CLK_SHIFT (12U)\r\n/*! BTRTU1_USE_REF_CLK - Static bit set by FW. If it is required that timers need not be programmed\r\n *    with dynamic switching of T1/Reference, the BT_RTU1 source clock is set on reference clock so\r\n *    that the timer are not disturbed.\r\n */\r\n#define CIU2_CIU2_CLK_LBU2_BTRTU1_CTRL_BTRTU1_USE_REF_CLK(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_LBU2_BTRTU1_CTRL_BTRTU1_USE_REF_CLK_SHIFT)) & CIU2_CIU2_CLK_LBU2_BTRTU1_CTRL_BTRTU1_USE_REF_CLK_MASK)\r\n\r\n#define CIU2_CIU2_CLK_LBU2_BTRTU1_CTRL_BTRTU1_DBG_CLK_CTRL_MASK (0x8000U)\r\n#define CIU2_CIU2_CLK_LBU2_BTRTU1_CTRL_BTRTU1_DBG_CLK_CTRL_SHIFT (15U)\r\n/*! BTRTU1_DBG_CLK_CTRL - BTRTU1 Debug Clock Control Feature */\r\n#define CIU2_CIU2_CLK_LBU2_BTRTU1_CTRL_BTRTU1_DBG_CLK_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_LBU2_BTRTU1_CTRL_BTRTU1_DBG_CLK_CTRL_SHIFT)) & CIU2_CIU2_CLK_LBU2_BTRTU1_CTRL_BTRTU1_DBG_CLK_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CLK_CP15_DIS3 - Clock Auto Shut-off Enable3 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CLK_CP15_DIS3_BR_AHB2_CLK_MASK (0xFFFFU)\r\n#define CIU2_CIU2_CLK_CP15_DIS3_BR_AHB2_CLK_SHIFT (0U)\r\n/*! BR_AHB2_CLK - BRU_AHB2 Shut Off */\r\n#define CIU2_CIU2_CLK_CP15_DIS3_BR_AHB2_CLK(x)   (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_CP15_DIS3_BR_AHB2_CLK_SHIFT)) & CIU2_CIU2_CLK_CP15_DIS3_BR_AHB2_CLK_MASK)\r\n\r\n#define CIU2_CIU2_CLK_CP15_DIS3_FFU_AHB2_CLK_MASK (0x100000U)\r\n#define CIU2_CIU2_CLK_CP15_DIS3_FFU_AHB2_CLK_SHIFT (20U)\r\n/*! FFU_AHB2_CLK - FFU_AHB Shut Off */\r\n#define CIU2_CIU2_CLK_CP15_DIS3_FFU_AHB2_CLK(x)  (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_CP15_DIS3_FFU_AHB2_CLK_SHIFT)) & CIU2_CIU2_CLK_CP15_DIS3_FFU_AHB2_CLK_MASK)\r\n\r\n#define CIU2_CIU2_CLK_CP15_DIS3_IMEM_AHB2_CLK_MASK (0x1E00000U)\r\n#define CIU2_CIU2_CLK_CP15_DIS3_IMEM_AHB2_CLK_SHIFT (21U)\r\n/*! IMEM_AHB2_CLK - IMEM_AHB2 Shut Off */\r\n#define CIU2_CIU2_CLK_CP15_DIS3_IMEM_AHB2_CLK(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_CP15_DIS3_IMEM_AHB2_CLK_SHIFT)) & CIU2_CIU2_CLK_CP15_DIS3_IMEM_AHB2_CLK_MASK)\r\n\r\n#define CIU2_CIU2_CLK_CP15_DIS3_DMEM_AHB2_CLK_MASK (0x6000000U)\r\n#define CIU2_CIU2_CLK_CP15_DIS3_DMEM_AHB2_CLK_SHIFT (25U)\r\n/*! DMEM_AHB2_CLK - DMEM_AHB2 Shut Off */\r\n#define CIU2_CIU2_CLK_CP15_DIS3_DMEM_AHB2_CLK(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_CP15_DIS3_DMEM_AHB2_CLK_SHIFT)) & CIU2_CIU2_CLK_CP15_DIS3_DMEM_AHB2_CLK_MASK)\r\n\r\n#define CIU2_CIU2_CLK_CP15_DIS3_BLE_HCLK_MASK    (0x10000000U)\r\n#define CIU2_CIU2_CLK_CP15_DIS3_BLE_HCLK_SHIFT   (28U)\r\n/*! BLE_HCLK - BLE ahb Arbiter/Decoder Shut Off */\r\n#define CIU2_CIU2_CLK_CP15_DIS3_BLE_HCLK(x)      (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_CP15_DIS3_BLE_HCLK_SHIFT)) & CIU2_CIU2_CLK_CP15_DIS3_BLE_HCLK_MASK)\r\n\r\n#define CIU2_CIU2_CLK_CP15_DIS3_BTU_AHB_CLK_MASK (0x40000000U)\r\n#define CIU2_CIU2_CLK_CP15_DIS3_BTU_AHB_CLK_SHIFT (30U)\r\n/*! BTU_AHB_CLK - BTU Shut Off */\r\n#define CIU2_CIU2_CLK_CP15_DIS3_BTU_AHB_CLK(x)   (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_CP15_DIS3_BTU_AHB_CLK_SHIFT)) & CIU2_CIU2_CLK_CP15_DIS3_BTU_AHB_CLK_MASK)\r\n\r\n#define CIU2_CIU2_CLK_CP15_DIS3_BLE_AHB_CLK_MASK (0x80000000U)\r\n#define CIU2_CIU2_CLK_CP15_DIS3_BLE_AHB_CLK_SHIFT (31U)\r\n/*! BLE_AHB_CLK - BLE Shut Off */\r\n#define CIU2_CIU2_CLK_CP15_DIS3_BLE_AHB_CLK(x)   (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_CP15_DIS3_BLE_AHB_CLK_SHIFT)) & CIU2_CIU2_CLK_CP15_DIS3_BLE_AHB_CLK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_RST_SW3 - Software Module Reset */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_RST_SW3_BTU_AHB_CLK__MASK      (0x1U)\r\n#define CIU2_CIU2_RST_SW3_BTU_AHB_CLK__SHIFT     (0U)\r\n/*! BTU_AHB_CLK_ - BTU (ARM_Clk) Soft Reset */\r\n#define CIU2_CIU2_RST_SW3_BTU_AHB_CLK_(x)        (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW3_BTU_AHB_CLK__SHIFT)) & CIU2_CIU2_RST_SW3_BTU_AHB_CLK__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW3_BLE_SOC__MASK          (0x2U)\r\n#define CIU2_CIU2_RST_SW3_BLE_SOC__SHIFT         (1U)\r\n/*! BLE_SOC_ - BLE SoC Soft Reset */\r\n#define CIU2_CIU2_RST_SW3_BLE_SOC_(x)            (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW3_BLE_SOC__SHIFT)) & CIU2_CIU2_RST_SW3_BLE_SOC__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW3_BT_COMMON__MASK        (0x4U)\r\n#define CIU2_CIU2_RST_SW3_BT_COMMON__SHIFT       (2U)\r\n/*! BT_COMMON_ - BT Common Soft Rest */\r\n#define CIU2_CIU2_RST_SW3_BT_COMMON_(x)          (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW3_BT_COMMON__SHIFT)) & CIU2_CIU2_RST_SW3_BT_COMMON__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW3_CPU2_CORE__MASK        (0x10U)\r\n#define CIU2_CIU2_RST_SW3_CPU2_CORE__SHIFT       (4U)\r\n/*! CPU2_CORE_ - CPU2 core reset */\r\n#define CIU2_CIU2_RST_SW3_CPU2_CORE_(x)          (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW3_CPU2_CORE__SHIFT)) & CIU2_CIU2_RST_SW3_CPU2_CORE__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW3_CPU2_TCM__MASK         (0x20U)\r\n#define CIU2_CIU2_RST_SW3_CPU2_TCM__SHIFT        (5U)\r\n/*! CPU2_TCM_ - CPU2 TCM/DMA/Arbiter reset */\r\n#define CIU2_CIU2_RST_SW3_CPU2_TCM_(x)           (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW3_CPU2_TCM__SHIFT)) & CIU2_CIU2_RST_SW3_CPU2_TCM__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW3_ARB_AHB2_CLK__MASK     (0x80U)\r\n#define CIU2_CIU2_RST_SW3_ARB_AHB2_CLK__SHIFT    (7U)\r\n/*! ARB_AHB2_CLK_ - AHB2 Arbiter Soft Reset */\r\n#define CIU2_CIU2_RST_SW3_ARB_AHB2_CLK_(x)       (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW3_ARB_AHB2_CLK__SHIFT)) & CIU2_CIU2_RST_SW3_ARB_AHB2_CLK__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW3_DEC_AHB2_CLK__MASK     (0x100U)\r\n#define CIU2_CIU2_RST_SW3_DEC_AHB2_CLK__SHIFT    (8U)\r\n/*! DEC_AHB2_CLK_ - AHB2 Decoder Mux Soft Reset */\r\n#define CIU2_CIU2_RST_SW3_DEC_AHB2_CLK_(x)       (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW3_DEC_AHB2_CLK__SHIFT)) & CIU2_CIU2_RST_SW3_DEC_AHB2_CLK__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW3_BRU_AHB2_CLK__MASK     (0x200U)\r\n#define CIU2_CIU2_RST_SW3_BRU_AHB2_CLK__SHIFT    (9U)\r\n/*! BRU_AHB2_CLK_ - BRU_AHB2 Soft Reset */\r\n#define CIU2_CIU2_RST_SW3_BRU_AHB2_CLK_(x)       (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW3_BRU_AHB2_CLK__SHIFT)) & CIU2_CIU2_RST_SW3_BRU_AHB2_CLK__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW3_BT_UART_N_MASK         (0x400U)\r\n#define CIU2_CIU2_RST_SW3_BT_UART_N_SHIFT        (10U)\r\n/*! BT_UART_N - BT UART soft reset */\r\n#define CIU2_CIU2_RST_SW3_BT_UART_N(x)           (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW3_BT_UART_N_SHIFT)) & CIU2_CIU2_RST_SW3_BT_UART_N_MASK)\r\n\r\n#define CIU2_CIU2_RST_SW3_SIU_AHB2_CLK_N_MASK    (0x800U)\r\n#define CIU2_CIU2_RST_SW3_SIU_AHB2_CLK_N_SHIFT   (11U)\r\n/*! SIU_AHB2_CLK_N - BT SIU (UART) AHB soft reset */\r\n#define CIU2_CIU2_RST_SW3_SIU_AHB2_CLK_N(x)      (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW3_SIU_AHB2_CLK_N_SHIFT)) & CIU2_CIU2_RST_SW3_SIU_AHB2_CLK_N_MASK)\r\n\r\n#define CIU2_CIU2_RST_SW3_SMU2_AHB_CLK__MASK     (0x10000U)\r\n#define CIU2_CIU2_RST_SW3_SMU2_AHB_CLK__SHIFT    (16U)\r\n/*! SMU2_AHB_CLK_ - SMU2 (AHB_Clk) Soft Reset */\r\n#define CIU2_CIU2_RST_SW3_SMU2_AHB_CLK_(x)       (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW3_SMU2_AHB_CLK__SHIFT)) & CIU2_CIU2_RST_SW3_SMU2_AHB_CLK__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW3_SIF__MASK              (0x40000U)\r\n#define CIU2_CIU2_RST_SW3_SIF__SHIFT             (18U)\r\n/*! SIF_ - sif clock Soft Reset */\r\n#define CIU2_CIU2_RST_SW3_SIF_(x)                (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW3_SIF__SHIFT)) & CIU2_CIU2_RST_SW3_SIF__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW3_SIF_AHB2_CLK__MASK     (0x80000U)\r\n#define CIU2_CIU2_RST_SW3_SIF_AHB2_CLK__SHIFT    (19U)\r\n/*! SIF_AHB2_CLK_ - sif ahb2 Clock Soft Reset */\r\n#define CIU2_CIU2_RST_SW3_SIF_AHB2_CLK_(x)       (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW3_SIF_AHB2_CLK__SHIFT)) & CIU2_CIU2_RST_SW3_SIF_AHB2_CLK__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW3_HPU2__MASK             (0x100000U)\r\n#define CIU2_CIU2_RST_SW3_HPU2__SHIFT            (20U)\r\n/*! HPU2_ - HPU2 Reset */\r\n#define CIU2_CIU2_RST_SW3_HPU2_(x)               (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW3_HPU2__SHIFT)) & CIU2_CIU2_RST_SW3_HPU2__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW3_CIU2_AHB_CLK__MASK     (0x400000U)\r\n#define CIU2_CIU2_RST_SW3_CIU2_AHB_CLK__SHIFT    (22U)\r\n/*! CIU2_AHB_CLK_ - CIU2 AHB Soft Reset */\r\n#define CIU2_CIU2_RST_SW3_CIU2_AHB_CLK_(x)       (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW3_CIU2_AHB_CLK__SHIFT)) & CIU2_CIU2_RST_SW3_CIU2_AHB_CLK__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW3_BRF_PR__MASK           (0x4000000U)\r\n#define CIU2_CIU2_RST_SW3_BRF_PR__SHIFT          (26U)\r\n/*! BRF_PR_ - BRF_PR Reset */\r\n#define CIU2_CIU2_RST_SW3_BRF_PR_(x)             (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW3_BRF_PR__SHIFT)) & CIU2_CIU2_RST_SW3_BRF_PR__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW3_WD2_CHIP_RST_DISABLE_MASK (0x10000000U)\r\n#define CIU2_CIU2_RST_SW3_WD2_CHIP_RST_DISABLE_SHIFT (28U)\r\n/*! WD2_CHIP_RST_DISABLE - WD2 Chip Reset Control */\r\n#define CIU2_CIU2_RST_SW3_WD2_CHIP_RST_DISABLE(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW3_WD2_CHIP_RST_DISABLE_SHIFT)) & CIU2_CIU2_RST_SW3_WD2_CHIP_RST_DISABLE_MASK)\r\n\r\n#define CIU2_CIU2_RST_SW3_WD2_CPU2_RST_DISABLE_MASK (0x20000000U)\r\n#define CIU2_CIU2_RST_SW3_WD2_CPU2_RST_DISABLE_SHIFT (29U)\r\n/*! WD2_CPU2_RST_DISABLE - WD2 CPU2 Reset Control */\r\n#define CIU2_CIU2_RST_SW3_WD2_CPU2_RST_DISABLE(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW3_WD2_CPU2_RST_DISABLE_SHIFT)) & CIU2_CIU2_RST_SW3_WD2_CPU2_RST_DISABLE_MASK)\r\n\r\n#define CIU2_CIU2_RST_SW3_BT_16M_CLK__MASK       (0x40000000U)\r\n#define CIU2_CIU2_RST_SW3_BT_16M_CLK__SHIFT      (30U)\r\n/*! BT_16M_CLK_ - Bt 16M clock reset */\r\n#define CIU2_CIU2_RST_SW3_BT_16M_CLK_(x)         (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW3_BT_16M_CLK__SHIFT)) & CIU2_CIU2_RST_SW3_BT_16M_CLK__MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_MEM_WRTC3 - Memory WRTC Control 3 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_MEM_WRTC3_BLE_ROM_RTC_MASK     (0x700U)\r\n#define CIU2_CIU2_MEM_WRTC3_BLE_ROM_RTC_SHIFT    (8U)\r\n/*! BLE_ROM_RTC - BLE ROM RTC */\r\n#define CIU2_CIU2_MEM_WRTC3_BLE_ROM_RTC(x)       (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_WRTC3_BLE_ROM_RTC_SHIFT)) & CIU2_CIU2_MEM_WRTC3_BLE_ROM_RTC_MASK)\r\n\r\n#define CIU2_CIU2_MEM_WRTC3_BLE_ROM_RTC_REF_MASK (0x3000U)\r\n#define CIU2_CIU2_MEM_WRTC3_BLE_ROM_RTC_REF_SHIFT (12U)\r\n/*! BLE_ROM_RTC_REF - BLE ROM RTC_REF */\r\n#define CIU2_CIU2_MEM_WRTC3_BLE_ROM_RTC_REF(x)   (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_WRTC3_BLE_ROM_RTC_REF_SHIFT)) & CIU2_CIU2_MEM_WRTC3_BLE_ROM_RTC_REF_MASK)\r\n\r\n#define CIU2_CIU2_MEM_WRTC3_R1P_RTC_MASK         (0xC0000U)\r\n#define CIU2_CIU2_MEM_WRTC3_R1P_RTC_SHIFT        (18U)\r\n/*! R1P_RTC - RTC for small memory for UART in AHB2_TOP */\r\n#define CIU2_CIU2_MEM_WRTC3_R1P_RTC(x)           (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_WRTC3_R1P_RTC_SHIFT)) & CIU2_CIU2_MEM_WRTC3_R1P_RTC_MASK)\r\n\r\n#define CIU2_CIU2_MEM_WRTC3_R1P_WTC_MASK         (0x300000U)\r\n#define CIU2_CIU2_MEM_WRTC3_R1P_WTC_SHIFT        (20U)\r\n/*! R1P_WTC - WTC for small memory for UART in AHB2_TOP */\r\n#define CIU2_CIU2_MEM_WRTC3_R1P_WTC(x)           (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_WRTC3_R1P_WTC_SHIFT)) & CIU2_CIU2_MEM_WRTC3_R1P_WTC_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_MEM_WRTC4 - Memory WRTC Control 4 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_MEM_WRTC4_CPU2_ITCM_RTC_MASK   (0x3U)\r\n#define CIU2_CIU2_MEM_WRTC4_CPU2_ITCM_RTC_SHIFT  (0U)\r\n/*! CPU2_ITCM_RTC - CPU2 ITCM RTC */\r\n#define CIU2_CIU2_MEM_WRTC4_CPU2_ITCM_RTC(x)     (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_WRTC4_CPU2_ITCM_RTC_SHIFT)) & CIU2_CIU2_MEM_WRTC4_CPU2_ITCM_RTC_MASK)\r\n\r\n#define CIU2_CIU2_MEM_WRTC4_CPU2_ITCM_WTC_MASK   (0xCU)\r\n#define CIU2_CIU2_MEM_WRTC4_CPU2_ITCM_WTC_SHIFT  (2U)\r\n/*! CPU2_ITCM_WTC - CPU2 ITCM WTC */\r\n#define CIU2_CIU2_MEM_WRTC4_CPU2_ITCM_WTC(x)     (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_WRTC4_CPU2_ITCM_WTC_SHIFT)) & CIU2_CIU2_MEM_WRTC4_CPU2_ITCM_WTC_MASK)\r\n\r\n#define CIU2_CIU2_MEM_WRTC4_CPU2_DTCM_RTC_MASK   (0x30U)\r\n#define CIU2_CIU2_MEM_WRTC4_CPU2_DTCM_RTC_SHIFT  (4U)\r\n/*! CPU2_DTCM_RTC - CPU2 DTCM RTC */\r\n#define CIU2_CIU2_MEM_WRTC4_CPU2_DTCM_RTC(x)     (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_WRTC4_CPU2_DTCM_RTC_SHIFT)) & CIU2_CIU2_MEM_WRTC4_CPU2_DTCM_RTC_MASK)\r\n\r\n#define CIU2_CIU2_MEM_WRTC4_CPU2_DTCM_WTC_MASK   (0xC0U)\r\n#define CIU2_CIU2_MEM_WRTC4_CPU2_DTCM_WTC_SHIFT  (6U)\r\n/*! CPU2_DTCM_WTC - CPU2 DTCM WTC */\r\n#define CIU2_CIU2_MEM_WRTC4_CPU2_DTCM_WTC(x)     (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_WRTC4_CPU2_DTCM_WTC_SHIFT)) & CIU2_CIU2_MEM_WRTC4_CPU2_DTCM_WTC_MASK)\r\n\r\n#define CIU2_CIU2_MEM_WRTC4_SMU2_RTC_MASK        (0x300U)\r\n#define CIU2_CIU2_MEM_WRTC4_SMU2_RTC_SHIFT       (8U)\r\n/*! SMU2_RTC - SMU2 RTC */\r\n#define CIU2_CIU2_MEM_WRTC4_SMU2_RTC(x)          (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_WRTC4_SMU2_RTC_SHIFT)) & CIU2_CIU2_MEM_WRTC4_SMU2_RTC_MASK)\r\n\r\n#define CIU2_CIU2_MEM_WRTC4_SMU2_WTC_MASK        (0xC00U)\r\n#define CIU2_CIU2_MEM_WRTC4_SMU2_WTC_SHIFT       (10U)\r\n/*! SMU2_WTC - SMU2 WTC */\r\n#define CIU2_CIU2_MEM_WRTC4_SMU2_WTC(x)          (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_WRTC4_SMU2_WTC_SHIFT)) & CIU2_CIU2_MEM_WRTC4_SMU2_WTC_MASK)\r\n\r\n#define CIU2_CIU2_MEM_WRTC4_CPU2_BRU_RTC_MASK    (0x7000U)\r\n#define CIU2_CIU2_MEM_WRTC4_CPU2_BRU_RTC_SHIFT   (12U)\r\n/*! CPU2_BRU_RTC - CPU2 BROM RTC */\r\n#define CIU2_CIU2_MEM_WRTC4_CPU2_BRU_RTC(x)      (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_WRTC4_CPU2_BRU_RTC_SHIFT)) & CIU2_CIU2_MEM_WRTC4_CPU2_BRU_RTC_MASK)\r\n\r\n#define CIU2_CIU2_MEM_WRTC4_CPU2_BRU_RTC_REF_MASK (0x30000U)\r\n#define CIU2_CIU2_MEM_WRTC4_CPU2_BRU_RTC_REF_SHIFT (16U)\r\n/*! CPU2_BRU_RTC_REF - CPU2 BROM RTC_REF */\r\n#define CIU2_CIU2_MEM_WRTC4_CPU2_BRU_RTC_REF(x)  (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_WRTC4_CPU2_BRU_RTC_REF_SHIFT)) & CIU2_CIU2_MEM_WRTC4_CPU2_BRU_RTC_REF_MASK)\r\n\r\n#define CIU2_CIU2_MEM_WRTC4_BTU_RTC_MASK         (0xC0000U)\r\n#define CIU2_CIU2_MEM_WRTC4_BTU_RTC_SHIFT        (18U)\r\n/*! BTU_RTC - BTU EBRAM RTC */\r\n#define CIU2_CIU2_MEM_WRTC4_BTU_RTC(x)           (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_WRTC4_BTU_RTC_SHIFT)) & CIU2_CIU2_MEM_WRTC4_BTU_RTC_MASK)\r\n\r\n#define CIU2_CIU2_MEM_WRTC4_BTU_WTC_MASK         (0x300000U)\r\n#define CIU2_CIU2_MEM_WRTC4_BTU_WTC_SHIFT        (20U)\r\n/*! BTU_WTC - BTU EBRAM WTC */\r\n#define CIU2_CIU2_MEM_WRTC4_BTU_WTC(x)           (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_WRTC4_BTU_WTC_SHIFT)) & CIU2_CIU2_MEM_WRTC4_BTU_WTC_MASK)\r\n\r\n#define CIU2_CIU2_MEM_WRTC4_BLE_RTC_MASK         (0xC000000U)\r\n#define CIU2_CIU2_MEM_WRTC4_BLE_RTC_SHIFT        (26U)\r\n/*! BLE_RTC - ble RTC */\r\n#define CIU2_CIU2_MEM_WRTC4_BLE_RTC(x)           (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_WRTC4_BLE_RTC_SHIFT)) & CIU2_CIU2_MEM_WRTC4_BLE_RTC_MASK)\r\n\r\n#define CIU2_CIU2_MEM_WRTC4_BLE_WTC_MASK         (0x30000000U)\r\n#define CIU2_CIU2_MEM_WRTC4_BLE_WTC_SHIFT        (28U)\r\n/*! BLE_WTC - ble WTC */\r\n#define CIU2_CIU2_MEM_WRTC4_BLE_WTC(x)           (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_WRTC4_BLE_WTC_SHIFT)) & CIU2_CIU2_MEM_WRTC4_BLE_WTC_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_MEM_PWDN3 - Memory Power down Control */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_MEM_PWDN3_CPU2_BRU_BYPASS_VAL_MASK (0x1U)\r\n#define CIU2_CIU2_MEM_PWDN3_CPU2_BRU_BYPASS_VAL_SHIFT (0U)\r\n/*! CPU2_BRU_BYPASS_VAL - Firmware Bypass value for CPU2 Boot ROM Memories Power Down */\r\n#define CIU2_CIU2_MEM_PWDN3_CPU2_BRU_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_PWDN3_CPU2_BRU_BYPASS_VAL_SHIFT)) & CIU2_CIU2_MEM_PWDN3_CPU2_BRU_BYPASS_VAL_MASK)\r\n\r\n#define CIU2_CIU2_MEM_PWDN3_CPU2_DTCM_BYPASS_VAL_MASK (0x2U)\r\n#define CIU2_CIU2_MEM_PWDN3_CPU2_DTCM_BYPASS_VAL_SHIFT (1U)\r\n/*! CPU2_DTCM_BYPASS_VAL - Firmware Bypass value for CPU2 DTCM Memories Power Down */\r\n#define CIU2_CIU2_MEM_PWDN3_CPU2_DTCM_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_PWDN3_CPU2_DTCM_BYPASS_VAL_SHIFT)) & CIU2_CIU2_MEM_PWDN3_CPU2_DTCM_BYPASS_VAL_MASK)\r\n\r\n#define CIU2_CIU2_MEM_PWDN3_CPU2_ITCM_BYPASS_VAL_MASK (0x4U)\r\n#define CIU2_CIU2_MEM_PWDN3_CPU2_ITCM_BYPASS_VAL_SHIFT (2U)\r\n/*! CPU2_ITCM_BYPASS_VAL - Firmware Bypass value for CPU2 ITCM Memories Power Down */\r\n#define CIU2_CIU2_MEM_PWDN3_CPU2_ITCM_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_PWDN3_CPU2_ITCM_BYPASS_VAL_SHIFT)) & CIU2_CIU2_MEM_PWDN3_CPU2_ITCM_BYPASS_VAL_MASK)\r\n\r\n#define CIU2_CIU2_MEM_PWDN3_SMU2_BYPASS_VAL_MASK (0x10U)\r\n#define CIU2_CIU2_MEM_PWDN3_SMU2_BYPASS_VAL_SHIFT (4U)\r\n/*! SMU2_BYPASS_VAL - Firmware Bypass value for SMU2 Memories Power Down */\r\n#define CIU2_CIU2_MEM_PWDN3_SMU2_BYPASS_VAL(x)   (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_PWDN3_SMU2_BYPASS_VAL_SHIFT)) & CIU2_CIU2_MEM_PWDN3_SMU2_BYPASS_VAL_MASK)\r\n\r\n#define CIU2_CIU2_MEM_PWDN3_SIU_BYPASS_VAL_MASK  (0x20U)\r\n#define CIU2_CIU2_MEM_PWDN3_SIU_BYPASS_VAL_SHIFT (5U)\r\n/*! SIU_BYPASS_VAL - Firmware Bypass value for UART Memories Power Down */\r\n#define CIU2_CIU2_MEM_PWDN3_SIU_BYPASS_VAL(x)    (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_PWDN3_SIU_BYPASS_VAL_SHIFT)) & CIU2_CIU2_MEM_PWDN3_SIU_BYPASS_VAL_MASK)\r\n\r\n#define CIU2_CIU2_MEM_PWDN3_BTU_BYPASS_VAL_MASK  (0x40U)\r\n#define CIU2_CIU2_MEM_PWDN3_BTU_BYPASS_VAL_SHIFT (6U)\r\n/*! BTU_BYPASS_VAL - Firmware Bypass value for BTU Memories Power Down */\r\n#define CIU2_CIU2_MEM_PWDN3_BTU_BYPASS_VAL(x)    (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_PWDN3_BTU_BYPASS_VAL_SHIFT)) & CIU2_CIU2_MEM_PWDN3_BTU_BYPASS_VAL_MASK)\r\n\r\n#define CIU2_CIU2_MEM_PWDN3_BT_ADMA_BYPASS_VAL_MASK (0x200U)\r\n#define CIU2_CIU2_MEM_PWDN3_BT_ADMA_BYPASS_VAL_SHIFT (9U)\r\n/*! BT_ADMA_BYPASS_VAL - Firmware Bypass value for BT ADMA Memories Power Down */\r\n#define CIU2_CIU2_MEM_PWDN3_BT_ADMA_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_PWDN3_BT_ADMA_BYPASS_VAL_SHIFT)) & CIU2_CIU2_MEM_PWDN3_BT_ADMA_BYPASS_VAL_MASK)\r\n\r\n#define CIU2_CIU2_MEM_PWDN3_CPU2_BRU_BYPASS_EN_MASK (0x10000U)\r\n#define CIU2_CIU2_MEM_PWDN3_CPU2_BRU_BYPASS_EN_SHIFT (16U)\r\n/*! CPU2_BRU_BYPASS_EN - Firmware Bypass Enable for CPU2 Boot ROM Memories Power Down */\r\n#define CIU2_CIU2_MEM_PWDN3_CPU2_BRU_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_PWDN3_CPU2_BRU_BYPASS_EN_SHIFT)) & CIU2_CIU2_MEM_PWDN3_CPU2_BRU_BYPASS_EN_MASK)\r\n\r\n#define CIU2_CIU2_MEM_PWDN3_CPU2_DTCM_BYPASS_EN_MASK (0x20000U)\r\n#define CIU2_CIU2_MEM_PWDN3_CPU2_DTCM_BYPASS_EN_SHIFT (17U)\r\n/*! CPU2_DTCM_BYPASS_EN - Firmware Bypass Enable for CPU2 DTCM Memories Power Down */\r\n#define CIU2_CIU2_MEM_PWDN3_CPU2_DTCM_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_PWDN3_CPU2_DTCM_BYPASS_EN_SHIFT)) & CIU2_CIU2_MEM_PWDN3_CPU2_DTCM_BYPASS_EN_MASK)\r\n\r\n#define CIU2_CIU2_MEM_PWDN3_CPU2_ITCM_BYPASS_EN_MASK (0x40000U)\r\n#define CIU2_CIU2_MEM_PWDN3_CPU2_ITCM_BYPASS_EN_SHIFT (18U)\r\n/*! CPU2_ITCM_BYPASS_EN - Firmware Bypass Enable for CPU2 ITCM Memories Power Down */\r\n#define CIU2_CIU2_MEM_PWDN3_CPU2_ITCM_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_PWDN3_CPU2_ITCM_BYPASS_EN_SHIFT)) & CIU2_CIU2_MEM_PWDN3_CPU2_ITCM_BYPASS_EN_MASK)\r\n\r\n#define CIU2_CIU2_MEM_PWDN3_SMU2_BYPASS_EN_MASK  (0x100000U)\r\n#define CIU2_CIU2_MEM_PWDN3_SMU2_BYPASS_EN_SHIFT (20U)\r\n/*! SMU2_BYPASS_EN - Firmware Bypass Enable for SMU2 Memories Power Down */\r\n#define CIU2_CIU2_MEM_PWDN3_SMU2_BYPASS_EN(x)    (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_PWDN3_SMU2_BYPASS_EN_SHIFT)) & CIU2_CIU2_MEM_PWDN3_SMU2_BYPASS_EN_MASK)\r\n\r\n#define CIU2_CIU2_MEM_PWDN3_SIU_BYPASS_EN_MASK   (0x200000U)\r\n#define CIU2_CIU2_MEM_PWDN3_SIU_BYPASS_EN_SHIFT  (21U)\r\n/*! SIU_BYPASS_EN - Firmware Bypass Enable for UART Memories Power Down */\r\n#define CIU2_CIU2_MEM_PWDN3_SIU_BYPASS_EN(x)     (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_PWDN3_SIU_BYPASS_EN_SHIFT)) & CIU2_CIU2_MEM_PWDN3_SIU_BYPASS_EN_MASK)\r\n\r\n#define CIU2_CIU2_MEM_PWDN3_BTU_BYPASS_EN_MASK   (0x400000U)\r\n#define CIU2_CIU2_MEM_PWDN3_BTU_BYPASS_EN_SHIFT  (22U)\r\n/*! BTU_BYPASS_EN - Firmware Bypass Enable for BTU Memories Power Down */\r\n#define CIU2_CIU2_MEM_PWDN3_BTU_BYPASS_EN(x)     (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_PWDN3_BTU_BYPASS_EN_SHIFT)) & CIU2_CIU2_MEM_PWDN3_BTU_BYPASS_EN_MASK)\r\n\r\n#define CIU2_CIU2_MEM_PWDN3_BT_ADMA_BYPASS_EN_MASK (0x2000000U)\r\n#define CIU2_CIU2_MEM_PWDN3_BT_ADMA_BYPASS_EN_SHIFT (25U)\r\n/*! BT_ADMA_BYPASS_EN - Firmware Bypass Enable for BT ADMA Memories Power Down */\r\n#define CIU2_CIU2_MEM_PWDN3_BT_ADMA_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MEM_PWDN3_BT_ADMA_BYPASS_EN_SHIFT)) & CIU2_CIU2_MEM_PWDN3_BT_ADMA_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_SOC_AHB2APB_STATUS - SOC AHB2APB Status */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_SOC_AHB2APB_STATUS_CMD_FIFO_AFULL_MASK (0x1U)\r\n#define CIU2_CIU2_SOC_AHB2APB_STATUS_CMD_FIFO_AFULL_SHIFT (0U)\r\n/*! CMD_FIFO_AFULL - soc_io_top ahb2apb command fifo almost full status */\r\n#define CIU2_CIU2_SOC_AHB2APB_STATUS_CMD_FIFO_AFULL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_SOC_AHB2APB_STATUS_CMD_FIFO_AFULL_SHIFT)) & CIU2_CIU2_SOC_AHB2APB_STATUS_CMD_FIFO_AFULL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_BLE_CTRL - BLE Control and Status */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_BLE_CTRL_BT_AES_CLK_FREQ_SEL_MASK (0x100U)\r\n#define CIU2_CIU2_BLE_CTRL_BT_AES_CLK_FREQ_SEL_SHIFT (8U)\r\n/*! BT_AES_CLK_FREQ_SEL - btu_aes_clk Frequency Select */\r\n#define CIU2_CIU2_BLE_CTRL_BT_AES_CLK_FREQ_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BLE_CTRL_BT_AES_CLK_FREQ_SEL_SHIFT)) & CIU2_CIU2_BLE_CTRL_BT_AES_CLK_FREQ_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_AHB2_TO_LAST_ADDR - AHB2 Timeout Last Address */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_AHB2_TO_LAST_ADDR_ADDRESS_MASK (0xFFFFFFFFU)\r\n#define CIU2_CIU2_AHB2_TO_LAST_ADDR_ADDRESS_SHIFT (0U)\r\n/*! ADDRESS - Last AHB2 Address Right Before the Current Timeout */\r\n#define CIU2_CIU2_AHB2_TO_LAST_ADDR_ADDRESS(x)   (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_AHB2_TO_LAST_ADDR_ADDRESS_SHIFT)) & CIU2_CIU2_AHB2_TO_LAST_ADDR_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_AHB2_TO_CUR_ADDR - AHB2 Current Timeout Address */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_AHB2_TO_CUR_ADDR_ADDRESS_MASK  (0xFFFFFFFFU)\r\n#define CIU2_CIU2_AHB2_TO_CUR_ADDR_ADDRESS_SHIFT (0U)\r\n/*! ADDRESS - Current_TO_Addr */\r\n#define CIU2_CIU2_AHB2_TO_CUR_ADDR_ADDRESS(x)    (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_AHB2_TO_CUR_ADDR_ADDRESS_SHIFT)) & CIU2_CIU2_AHB2_TO_CUR_ADDR_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_AHB2_TO_CTRL - AHB2 ARB Control */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_AHB2_TO_CTRL_CURRENT_TO_SLAVE_ID_MASK (0xFU)\r\n#define CIU2_CIU2_AHB2_TO_CTRL_CURRENT_TO_SLAVE_ID_SHIFT (0U)\r\n/*! CURRENT_TO_SLAVE_ID - Current_TO_Slave_ID */\r\n#define CIU2_CIU2_AHB2_TO_CTRL_CURRENT_TO_SLAVE_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_AHB2_TO_CTRL_CURRENT_TO_SLAVE_ID_SHIFT)) & CIU2_CIU2_AHB2_TO_CTRL_CURRENT_TO_SLAVE_ID_MASK)\r\n\r\n#define CIU2_CIU2_AHB2_TO_CTRL_LAST_TO_SLAVE_ID_MASK (0xF0U)\r\n#define CIU2_CIU2_AHB2_TO_CTRL_LAST_TO_SLAVE_ID_SHIFT (4U)\r\n/*! LAST_TO_SLAVE_ID - Last_TO_Slave_ID */\r\n#define CIU2_CIU2_AHB2_TO_CTRL_LAST_TO_SLAVE_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_AHB2_TO_CTRL_LAST_TO_SLAVE_ID_SHIFT)) & CIU2_CIU2_AHB2_TO_CTRL_LAST_TO_SLAVE_ID_MASK)\r\n\r\n#define CIU2_CIU2_AHB2_TO_CTRL_CURRENT_TO_MASTER_ID_MASK (0xF00U)\r\n#define CIU2_CIU2_AHB2_TO_CTRL_CURRENT_TO_MASTER_ID_SHIFT (8U)\r\n/*! CURRENT_TO_MASTER_ID - AHB2 Current_TO_Master_ID */\r\n#define CIU2_CIU2_AHB2_TO_CTRL_CURRENT_TO_MASTER_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_AHB2_TO_CTRL_CURRENT_TO_MASTER_ID_SHIFT)) & CIU2_CIU2_AHB2_TO_CTRL_CURRENT_TO_MASTER_ID_MASK)\r\n\r\n#define CIU2_CIU2_AHB2_TO_CTRL_LAST_TO_MASTER_ID_MASK (0xF000U)\r\n#define CIU2_CIU2_AHB2_TO_CTRL_LAST_TO_MASTER_ID_SHIFT (12U)\r\n/*! LAST_TO_MASTER_ID - AHB2 Last_TO_Master_ID */\r\n#define CIU2_CIU2_AHB2_TO_CTRL_LAST_TO_MASTER_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_AHB2_TO_CTRL_LAST_TO_MASTER_ID_SHIFT)) & CIU2_CIU2_AHB2_TO_CTRL_LAST_TO_MASTER_ID_MASK)\r\n\r\n#define CIU2_CIU2_AHB2_TO_CTRL_AHB2_SMU1_MEM_PROT_DIS_MASK (0x10000U)\r\n#define CIU2_CIU2_AHB2_TO_CTRL_AHB2_SMU1_MEM_PROT_DIS_SHIFT (16U)\r\n/*! AHB2_SMU1_MEM_PROT_DIS - Disable SMU1 Memory Protection from AHB2 side */\r\n#define CIU2_CIU2_AHB2_TO_CTRL_AHB2_SMU1_MEM_PROT_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_AHB2_TO_CTRL_AHB2_SMU1_MEM_PROT_DIS_SHIFT)) & CIU2_CIU2_AHB2_TO_CTRL_AHB2_SMU1_MEM_PROT_DIS_MASK)\r\n\r\n#define CIU2_CIU2_AHB2_TO_CTRL_AHB2_CPU2_IMEM_PROT_DIS_MASK (0x20000U)\r\n#define CIU2_CIU2_AHB2_TO_CTRL_AHB2_CPU2_IMEM_PROT_DIS_SHIFT (17U)\r\n/*! AHB2_CPU2_IMEM_PROT_DIS - 1 = Disable CPU2 Imem Memory Protection from AHB2 side and allow AHB2 to read/write Imem */\r\n#define CIU2_CIU2_AHB2_TO_CTRL_AHB2_CPU2_IMEM_PROT_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_AHB2_TO_CTRL_AHB2_CPU2_IMEM_PROT_DIS_SHIFT)) & CIU2_CIU2_AHB2_TO_CTRL_AHB2_CPU2_IMEM_PROT_DIS_MASK)\r\n\r\n#define CIU2_CIU2_AHB2_TO_CTRL_AHB2_CPU2_DMEM_PROT_DIS_MASK (0x40000U)\r\n#define CIU2_CIU2_AHB2_TO_CTRL_AHB2_CPU2_DMEM_PROT_DIS_SHIFT (18U)\r\n/*! AHB2_CPU2_DMEM_PROT_DIS - 1 = Disable CPU2 Dmem Memory Protection from AHB2 side and allow AHB2 to read/write Dmem */\r\n#define CIU2_CIU2_AHB2_TO_CTRL_AHB2_CPU2_DMEM_PROT_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_AHB2_TO_CTRL_AHB2_CPU2_DMEM_PROT_DIS_SHIFT)) & CIU2_CIU2_AHB2_TO_CTRL_AHB2_CPU2_DMEM_PROT_DIS_MASK)\r\n\r\n#define CIU2_CIU2_AHB2_TO_CTRL_AHB2_TIMEOUT_MODE_MASK (0xC0000000U)\r\n#define CIU2_CIU2_AHB2_TO_CTRL_AHB2_TIMEOUT_MODE_SHIFT (30U)\r\n/*! AHB2_TIMEOUT_MODE - AHB2_TimeoutMode[1:0] */\r\n#define CIU2_CIU2_AHB2_TO_CTRL_AHB2_TIMEOUT_MODE(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_AHB2_TO_CTRL_AHB2_TIMEOUT_MODE_SHIFT)) & CIU2_CIU2_AHB2_TO_CTRL_AHB2_TIMEOUT_MODE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_AHB2_SMU1_ACCESS_ADDR - AHB2 to SMU1 Accessible Address */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_AHB2_SMU1_ACCESS_ADDR_AHB2_SMU1_ACCESS_ADDR_MASK (0xFFFFFFFFU)\r\n#define CIU2_CIU2_AHB2_SMU1_ACCESS_ADDR_AHB2_SMU1_ACCESS_ADDR_SHIFT (0U)\r\n/*! AHB2_SMU1_ACCESS_ADDR - SMU1 Accessible Memory Address from AHB2 side */\r\n#define CIU2_CIU2_AHB2_SMU1_ACCESS_ADDR_AHB2_SMU1_ACCESS_ADDR(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_AHB2_SMU1_ACCESS_ADDR_AHB2_SMU1_ACCESS_ADDR_SHIFT)) & CIU2_CIU2_AHB2_SMU1_ACCESS_ADDR_AHB2_SMU1_ACCESS_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_AHB2_SMU1_ACCESS_MASK - AHB2 to SMU1 Accessible Mask */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_AHB2_SMU1_ACCESS_MASK_AHB2_SMU1_ACCESS_MASK_MASK (0xFFFFFFFFU)\r\n#define CIU2_CIU2_AHB2_SMU1_ACCESS_MASK_AHB2_SMU1_ACCESS_MASK_SHIFT (0U)\r\n/*! AHB2_SMU1_ACCESS_MASK - SMU1 Accessible Memory Mask from AHB2 side */\r\n#define CIU2_CIU2_AHB2_SMU1_ACCESS_MASK_AHB2_SMU1_ACCESS_MASK(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_AHB2_SMU1_ACCESS_MASK_AHB2_SMU1_ACCESS_MASK_SHIFT)) & CIU2_CIU2_AHB2_SMU1_ACCESS_MASK_AHB2_SMU1_ACCESS_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CPU2_ICODE_INV_ADDR_CTRL - CPU2 Icode invalid address access control */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CPU2_ICODE_INV_ADDR_CTRL_LAST2_INV_ADDR_SLAVE_ID_MASK (0xFU)\r\n#define CIU2_CIU2_CPU2_ICODE_INV_ADDR_CTRL_LAST2_INV_ADDR_SLAVE_ID_SHIFT (0U)\r\n/*! LAST2_INV_ADDR_SLAVE_ID - Last2_inv_addr_Slave_ID */\r\n#define CIU2_CIU2_CPU2_ICODE_INV_ADDR_CTRL_LAST2_INV_ADDR_SLAVE_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_ICODE_INV_ADDR_CTRL_LAST2_INV_ADDR_SLAVE_ID_SHIFT)) & CIU2_CIU2_CPU2_ICODE_INV_ADDR_CTRL_LAST2_INV_ADDR_SLAVE_ID_MASK)\r\n\r\n#define CIU2_CIU2_CPU2_ICODE_INV_ADDR_CTRL_LAST_INV_ADDR_SLAVE_ID_MASK (0xF0U)\r\n#define CIU2_CIU2_CPU2_ICODE_INV_ADDR_CTRL_LAST_INV_ADDR_SLAVE_ID_SHIFT (4U)\r\n/*! LAST_INV_ADDR_SLAVE_ID - Last_inv_addr_Slave_ID */\r\n#define CIU2_CIU2_CPU2_ICODE_INV_ADDR_CTRL_LAST_INV_ADDR_SLAVE_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_ICODE_INV_ADDR_CTRL_LAST_INV_ADDR_SLAVE_ID_SHIFT)) & CIU2_CIU2_CPU2_ICODE_INV_ADDR_CTRL_LAST_INV_ADDR_SLAVE_ID_MASK)\r\n\r\n#define CIU2_CIU2_CPU2_ICODE_INV_ADDR_CTRL_CUR_INV_ADDR_SLAVE_ID_MASK (0xF00U)\r\n#define CIU2_CIU2_CPU2_ICODE_INV_ADDR_CTRL_CUR_INV_ADDR_SLAVE_ID_SHIFT (8U)\r\n/*! CUR_INV_ADDR_SLAVE_ID - Cur_inv_addr_Slave_ID */\r\n#define CIU2_CIU2_CPU2_ICODE_INV_ADDR_CTRL_CUR_INV_ADDR_SLAVE_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_ICODE_INV_ADDR_CTRL_CUR_INV_ADDR_SLAVE_ID_SHIFT)) & CIU2_CIU2_CPU2_ICODE_INV_ADDR_CTRL_CUR_INV_ADDR_SLAVE_ID_MASK)\r\n\r\n#define CIU2_CIU2_CPU2_ICODE_INV_ADDR_CTRL_HADDR_ICOD_SEL_MASK (0xC0000000U)\r\n#define CIU2_CIU2_CPU2_ICODE_INV_ADDR_CTRL_HADDR_ICOD_SEL_SHIFT (30U)\r\n/*! HADDR_ICOD_SEL - There are 3 haddr which can be observed by selecting this: */\r\n#define CIU2_CIU2_CPU2_ICODE_INV_ADDR_CTRL_HADDR_ICOD_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_ICODE_INV_ADDR_CTRL_HADDR_ICOD_SEL_SHIFT)) & CIU2_CIU2_CPU2_ICODE_INV_ADDR_CTRL_HADDR_ICOD_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CPU2_ICODE_INV_ADDR - CPU2 Icode invalid address */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CPU2_ICODE_INV_ADDR_HADDR_INV_ADDR_MASK (0xFFFFFFFFU)\r\n#define CIU2_CIU2_CPU2_ICODE_INV_ADDR_HADDR_INV_ADDR_SHIFT (0U)\r\n/*! HADDR_INV_ADDR - based on CIU_CPU2_ICODE_INV_ADDR_CTRL[31:30], the address status is observed in this register */\r\n#define CIU2_CIU2_CPU2_ICODE_INV_ADDR_HADDR_INV_ADDR(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_ICODE_INV_ADDR_HADDR_INV_ADDR_SHIFT)) & CIU2_CIU2_CPU2_ICODE_INV_ADDR_HADDR_INV_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CPU2_DCODE_INV_ADDR_CTRL - CPU2 Dcode invalid address access control */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_LAST2_INV_ADDR_SLAVE_ID_MASK (0xFU)\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_LAST2_INV_ADDR_SLAVE_ID_SHIFT (0U)\r\n/*! LAST2_INV_ADDR_SLAVE_ID - Last2_inv_addr_Slave_ID */\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_LAST2_INV_ADDR_SLAVE_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_LAST2_INV_ADDR_SLAVE_ID_SHIFT)) & CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_LAST2_INV_ADDR_SLAVE_ID_MASK)\r\n\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_LAST_INV_ADDR_SLAVE_ID_MASK (0xF0U)\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_LAST_INV_ADDR_SLAVE_ID_SHIFT (4U)\r\n/*! LAST_INV_ADDR_SLAVE_ID - Last_inv_addr_Slave_ID */\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_LAST_INV_ADDR_SLAVE_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_LAST_INV_ADDR_SLAVE_ID_SHIFT)) & CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_LAST_INV_ADDR_SLAVE_ID_MASK)\r\n\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_CUR_INV_ADDR_SLAVE_ID_MASK (0xF00U)\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_CUR_INV_ADDR_SLAVE_ID_SHIFT (8U)\r\n/*! CUR_INV_ADDR_SLAVE_ID - Cur_inv_addr_Slave_ID */\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_CUR_INV_ADDR_SLAVE_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_CUR_INV_ADDR_SLAVE_ID_SHIFT)) & CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_CUR_INV_ADDR_SLAVE_ID_MASK)\r\n\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_LAST2_INV_ADDR_MASTER_ID_MASK (0xF000U)\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_LAST2_INV_ADDR_MASTER_ID_SHIFT (12U)\r\n/*! LAST2_INV_ADDR_MASTER_ID - Last2_inv_addr_master_ID */\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_LAST2_INV_ADDR_MASTER_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_LAST2_INV_ADDR_MASTER_ID_SHIFT)) & CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_LAST2_INV_ADDR_MASTER_ID_MASK)\r\n\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_LAST_INV_ADDR_MASTER_ID_MASK (0xF0000U)\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_LAST_INV_ADDR_MASTER_ID_SHIFT (16U)\r\n/*! LAST_INV_ADDR_MASTER_ID - Last_inv_addr_master_ID */\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_LAST_INV_ADDR_MASTER_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_LAST_INV_ADDR_MASTER_ID_SHIFT)) & CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_LAST_INV_ADDR_MASTER_ID_MASK)\r\n\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_CUR_INV_ADDR_MASTER_ID_MASK (0xF00000U)\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_CUR_INV_ADDR_MASTER_ID_SHIFT (20U)\r\n/*! CUR_INV_ADDR_MASTER_ID - Cur_inv_addr_master_ID */\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_CUR_INV_ADDR_MASTER_ID(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_CUR_INV_ADDR_MASTER_ID_SHIFT)) & CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_CUR_INV_ADDR_MASTER_ID_MASK)\r\n\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_HADDR_ICOD_SEL_MASK (0xC0000000U)\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_HADDR_ICOD_SEL_SHIFT (30U)\r\n/*! HADDR_ICOD_SEL - There are 3 haddr which can be observed by selecting this: */\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_HADDR_ICOD_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_HADDR_ICOD_SEL_SHIFT)) & CIU2_CIU2_CPU2_DCODE_INV_ADDR_CTRL_HADDR_ICOD_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CPU2_DCODE_INV_ADDR - CPU2 Dcode invalid address */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_HADDR_INV_ADDR_MASK (0xFFFFFFFFU)\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_HADDR_INV_ADDR_SHIFT (0U)\r\n/*! HADDR_INV_ADDR - based on CIU_CPU2_DCODE_INV_ADDR_CTRL[31:30], the address status is observed in this register */\r\n#define CIU2_CIU2_CPU2_DCODE_INV_ADDR_HADDR_INV_ADDR(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_DCODE_INV_ADDR_HADDR_INV_ADDR_SHIFT)) & CIU2_CIU2_CPU2_DCODE_INV_ADDR_HADDR_INV_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CPU_CPU2_CTRL - CPU2 control register */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_VINITHI_MASK     (0x1U)\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_VINITHI_SHIFT    (0U)\r\n/*! VINITHI - Boot Address Control */\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_VINITHI(x)       (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU_CPU2_CTRL_VINITHI_SHIFT)) & CIU2_CIU2_CPU_CPU2_CTRL_VINITHI_MASK)\r\n\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_CPU2_JTAG_CHAIN_BYPASS_MASK (0x4U)\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_CPU2_JTAG_CHAIN_BYPASS_SHIFT (2U)\r\n/*! CPU2_JTAG_CHAIN_BYPASS - CPU2 JTAG Chain Bypass Control */\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_CPU2_JTAG_CHAIN_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU_CPU2_CTRL_CPU2_JTAG_CHAIN_BYPASS_SHIFT)) & CIU2_CIU2_CPU_CPU2_CTRL_CPU2_JTAG_CHAIN_BYPASS_MASK)\r\n\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_CPU2_BOOT_IMEM_MUX_EN_MASK (0x10U)\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_CPU2_BOOT_IMEM_MUX_EN_SHIFT (4U)\r\n/*! CPU2_BOOT_IMEM_MUX_EN - CPU2 Boot IMEM mux Enable */\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_CPU2_BOOT_IMEM_MUX_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU_CPU2_CTRL_CPU2_BOOT_IMEM_MUX_EN_SHIFT)) & CIU2_CIU2_CPU_CPU2_CTRL_CPU2_BOOT_IMEM_MUX_EN_MASK)\r\n\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_CPU2_BOOT_DMEM_MUX_EN_MASK (0x20U)\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_CPU2_BOOT_DMEM_MUX_EN_SHIFT (5U)\r\n/*! CPU2_BOOT_DMEM_MUX_EN - CPU2 DMEM mux Enable */\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_CPU2_BOOT_DMEM_MUX_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU_CPU2_CTRL_CPU2_BOOT_DMEM_MUX_EN_SHIFT)) & CIU2_CIU2_CPU_CPU2_CTRL_CPU2_BOOT_DMEM_MUX_EN_MASK)\r\n\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_CPU2_DBG_CTRL_MASK (0xFFF0000U)\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_CPU2_DBG_CTRL_SHIFT (16U)\r\n/*! CPU2_DBG_CTRL - cpu2 debug control */\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_CPU2_DBG_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU_CPU2_CTRL_CPU2_DBG_CTRL_SHIFT)) & CIU2_CIU2_CPU_CPU2_CTRL_CPU2_DBG_CTRL_MASK)\r\n\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_MCI_AHB2_MSG_SCHEME_MASK (0x10000000U)\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_MCI_AHB2_MSG_SCHEME_SHIFT (28U)\r\n/*! MCI_AHB2_MSG_SCHEME - IMU Scheme Select for Communication between AHB2 & MCI */\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_MCI_AHB2_MSG_SCHEME(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU_CPU2_CTRL_MCI_AHB2_MSG_SCHEME_SHIFT)) & CIU2_CIU2_CPU_CPU2_CTRL_MCI_AHB2_MSG_SCHEME_MASK)\r\n\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_CPU3_RESET_INT_MASK (0x20000000U)\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_CPU3_RESET_INT_SHIFT (29U)\r\n/*! CPU3_RESET_INT - CPU2 fw resets cpu3(or cpu3 fw resets CPU2 if this register is used by cpu3) */\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_CPU3_RESET_INT(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU_CPU2_CTRL_CPU3_RESET_INT_SHIFT)) & CIU2_CIU2_CPU_CPU2_CTRL_CPU3_RESET_INT_MASK)\r\n\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_DSR_WKUP_IN_USE_MASK (0x40000000U)\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_DSR_WKUP_IN_USE_SHIFT (30U)\r\n/*! DSR_WKUP_IN_USE - dsr wkup when dsr_wkup_in_use = 1'b1 */\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_DSR_WKUP_IN_USE(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU_CPU2_CTRL_DSR_WKUP_IN_USE_SHIFT)) & CIU2_CIU2_CPU_CPU2_CTRL_DSR_WKUP_IN_USE_MASK)\r\n\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_CPU1_RESET_INT_MASK (0x80000000U)\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_CPU1_RESET_INT_SHIFT (31U)\r\n/*! CPU1_RESET_INT - CPU2 fw resets cpu1( or cpu3 fw resets cpu1 if this register is used by cpu3) */\r\n#define CIU2_CIU2_CPU_CPU2_CTRL_CPU1_RESET_INT(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU_CPU2_CTRL_CPU1_RESET_INT_SHIFT)) & CIU2_CIU2_CPU_CPU2_CTRL_CPU1_RESET_INT_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_BRF_CTRL - BRF Control and Status */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_BRF_CTRL_AHB_SLV_BRF_SER_EN_MASK (0x1U)\r\n#define CIU2_CIU2_BRF_CTRL_AHB_SLV_BRF_SER_EN_SHIFT (0U)\r\n/*! AHB_SLV_BRF_SER_EN - When set to 1, BRF serial interface will be accessed thru AHB slave memory mapped from 0xA800A000 to 0xA8011FFF */\r\n#define CIU2_CIU2_BRF_CTRL_AHB_SLV_BRF_SER_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BRF_CTRL_AHB_SLV_BRF_SER_EN_SHIFT)) & CIU2_CIU2_BRF_CTRL_AHB_SLV_BRF_SER_EN_MASK)\r\n\r\n#define CIU2_CIU2_BRF_CTRL_CIU_BRF_REF1X_CLK_CTRL_BYPASS_EN_MASK (0x100U)\r\n#define CIU2_CIU2_BRF_CTRL_CIU_BRF_REF1X_CLK_CTRL_BYPASS_EN_SHIFT (8U)\r\n/*! CIU_BRF_REF1X_CLK_CTRL_BYPASS_EN - BRF REF1X Clock Control Bypass Enable */\r\n#define CIU2_CIU2_BRF_CTRL_CIU_BRF_REF1X_CLK_CTRL_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BRF_CTRL_CIU_BRF_REF1X_CLK_CTRL_BYPASS_EN_SHIFT)) & CIU2_CIU2_BRF_CTRL_CIU_BRF_REF1X_CLK_CTRL_BYPASS_EN_MASK)\r\n\r\n#define CIU2_CIU2_BRF_CTRL_CIU_BRF_REF1X_CLK_CTRL_BYPASS_VAL_MASK (0x200U)\r\n#define CIU2_CIU2_BRF_CTRL_CIU_BRF_REF1X_CLK_CTRL_BYPASS_VAL_SHIFT (9U)\r\n/*! CIU_BRF_REF1X_CLK_CTRL_BYPASS_VAL - 1. brf ref clk 1x is enabled */\r\n#define CIU2_CIU2_BRF_CTRL_CIU_BRF_REF1X_CLK_CTRL_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BRF_CTRL_CIU_BRF_REF1X_CLK_CTRL_BYPASS_VAL_SHIFT)) & CIU2_CIU2_BRF_CTRL_CIU_BRF_REF1X_CLK_CTRL_BYPASS_VAL_MASK)\r\n\r\n#define CIU2_CIU2_BRF_CTRL_BRF_SQU_DUMP_EN_MASK  (0x400U)\r\n#define CIU2_CIU2_BRF_CTRL_BRF_SQU_DUMP_EN_SHIFT (10U)\r\n/*! BRF_SQU_DUMP_EN - Enable SQU data dump from BRF */\r\n#define CIU2_CIU2_BRF_CTRL_BRF_SQU_DUMP_EN(x)    (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BRF_CTRL_BRF_SQU_DUMP_EN_SHIFT)) & CIU2_CIU2_BRF_CTRL_BRF_SQU_DUMP_EN_MASK)\r\n\r\n#define CIU2_CIU2_BRF_CTRL_FFU_USE_BRF_RX_PATH_MASK (0x800U)\r\n#define CIU2_CIU2_BRF_CTRL_FFU_USE_BRF_RX_PATH_SHIFT (11U)\r\n/*! FFU_USE_BRF_RX_PATH - This bit is connected to FRF_15P4_USE_BRF_RX_PATH input of BRF as recommended by Sridhar. */\r\n#define CIU2_CIU2_BRF_CTRL_FFU_USE_BRF_RX_PATH(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BRF_CTRL_FFU_USE_BRF_RX_PATH_SHIFT)) & CIU2_CIU2_BRF_CTRL_FFU_USE_BRF_RX_PATH_MASK)\r\n\r\n#define CIU2_CIU2_BRF_CTRL_BRF_CHIP_RDY_MASK     (0x80000000U)\r\n#define CIU2_CIU2_BRF_CTRL_BRF_CHIP_RDY_SHIFT    (31U)\r\n/*! BRF_CHIP_RDY - BRF Chip_Rdy Status */\r\n#define CIU2_CIU2_BRF_CTRL_BRF_CHIP_RDY(x)       (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BRF_CTRL_BRF_CHIP_RDY_SHIFT)) & CIU2_CIU2_BRF_CTRL_BRF_CHIP_RDY_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_BRF_EXTRA_PORT - BRF Extra Port Connection */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_BRF_EXTRA_PORT_SOC_BRF_EXTRA_MASK (0xFU)\r\n#define CIU2_CIU2_BRF_EXTRA_PORT_SOC_BRF_EXTRA_SHIFT (0U)\r\n/*! SOC_BRF_EXTRA - SOC_BRF_EXTRA[3:0] */\r\n#define CIU2_CIU2_BRF_EXTRA_PORT_SOC_BRF_EXTRA(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BRF_EXTRA_PORT_SOC_BRF_EXTRA_SHIFT)) & CIU2_CIU2_BRF_EXTRA_PORT_SOC_BRF_EXTRA_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_BRF_ECO_CTRL - BRF ECO Control */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_BRF_ECO_CTRL_ECO_BITS_MASK     (0xFFFFFFFFU)\r\n#define CIU2_CIU2_BRF_ECO_CTRL_ECO_BITS_SHIFT    (0U)\r\n/*! ECO_BITS - Reserved */\r\n#define CIU2_CIU2_BRF_ECO_CTRL_ECO_BITS(x)       (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BRF_ECO_CTRL_ECO_BITS_SHIFT)) & CIU2_CIU2_BRF_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_BTU_CTRL - BTU Control and Status */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_BTU_CTRL_BTU_CIPHER_EN_MASK    (0x1U)\r\n#define CIU2_CIU2_BTU_CTRL_BTU_CIPHER_EN_SHIFT   (0U)\r\n/*! BTU_CIPHER_EN - Bluetooth Cipher Logic */\r\n#define CIU2_CIU2_BTU_CTRL_BTU_CIPHER_EN(x)      (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BTU_CTRL_BTU_CIPHER_EN_SHIFT)) & CIU2_CIU2_BTU_CTRL_BTU_CIPHER_EN_MASK)\r\n\r\n#define CIU2_CIU2_BTU_CTRL_DBUS_HIGH_SPEED_SEL_MASK (0x2U)\r\n#define CIU2_CIU2_BTU_CTRL_DBUS_HIGH_SPEED_SEL_SHIFT (1U)\r\n/*! DBUS_HIGH_SPEED_SEL - Dbus High Speed Select Signal for Greater than 4 MHz */\r\n#define CIU2_CIU2_BTU_CTRL_DBUS_HIGH_SPEED_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BTU_CTRL_DBUS_HIGH_SPEED_SEL_SHIFT)) & CIU2_CIU2_BTU_CTRL_DBUS_HIGH_SPEED_SEL_MASK)\r\n\r\n#define CIU2_CIU2_BTU_CTRL_BT_CLK_SEL_MASK       (0xCU)\r\n#define CIU2_CIU2_BTU_CTRL_BT_CLK_SEL_SHIFT      (2U)\r\n/*! BT_CLK_SEL - Bluetooth sys Clock Select */\r\n#define CIU2_CIU2_BTU_CTRL_BT_CLK_SEL(x)         (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BTU_CTRL_BT_CLK_SEL_SHIFT)) & CIU2_CIU2_BTU_CTRL_BT_CLK_SEL_MASK)\r\n\r\n#define CIU2_CIU2_BTU_CTRL_BT_IP_SER_SEL_MASK    (0x700U)\r\n#define CIU2_CIU2_BTU_CTRL_BT_IP_SER_SEL_SHIFT   (8U)\r\n/*! BT_IP_SER_SEL - bt_ip_ser_sel */\r\n#define CIU2_CIU2_BTU_CTRL_BT_IP_SER_SEL(x)      (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BTU_CTRL_BT_IP_SER_SEL_SHIFT)) & CIU2_CIU2_BTU_CTRL_BT_IP_SER_SEL_MASK)\r\n\r\n#define CIU2_CIU2_BTU_CTRL_BTU_MC_WAKEUP_MASK    (0x80000000U)\r\n#define CIU2_CIU2_BTU_CTRL_BTU_MC_WAKEUP_SHIFT   (31U)\r\n/*! BTU_MC_WAKEUP - BTU MC_Wakeup Status */\r\n#define CIU2_CIU2_BTU_CTRL_BTU_MC_WAKEUP(x)      (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BTU_CTRL_BTU_MC_WAKEUP_SHIFT)) & CIU2_CIU2_BTU_CTRL_BTU_MC_WAKEUP_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_BT_PS - BT Clock Power Save */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_BT_PS_BT_MCLK_NCO_MVAL_MASK    (0x3FFFFFFU)\r\n#define CIU2_CIU2_BT_PS_BT_MCLK_NCO_MVAL_SHIFT   (0U)\r\n/*! BT_MCLK_NCO_MVAL - BT_MCLK NCO Module Step Control (default 0x0) */\r\n#define CIU2_CIU2_BT_PS_BT_MCLK_NCO_MVAL(x)      (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BT_PS_BT_MCLK_NCO_MVAL_SHIFT)) & CIU2_CIU2_BT_PS_BT_MCLK_NCO_MVAL_MASK)\r\n\r\n#define CIU2_CIU2_BT_PS_BT_MCLK_NCO_EN_MASK      (0x4000000U)\r\n#define CIU2_CIU2_BT_PS_BT_MCLK_NCO_EN_SHIFT     (26U)\r\n/*! BT_MCLK_NCO_EN - BT_MCLK_NCO logic to count */\r\n#define CIU2_CIU2_BT_PS_BT_MCLK_NCO_EN(x)        (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BT_PS_BT_MCLK_NCO_EN_SHIFT)) & CIU2_CIU2_BT_PS_BT_MCLK_NCO_EN_MASK)\r\n\r\n#define CIU2_CIU2_BT_PS_BT_MCLK_TBG_NCO_SEL_MASK (0x8000000U)\r\n#define CIU2_CIU2_BT_PS_BT_MCLK_TBG_NCO_SEL_SHIFT (27U)\r\n/*! BT_MCLK_TBG_NCO_SEL - BT_4M_PCM_CLK */\r\n#define CIU2_CIU2_BT_PS_BT_MCLK_TBG_NCO_SEL(x)   (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BT_PS_BT_MCLK_TBG_NCO_SEL_SHIFT)) & CIU2_CIU2_BT_PS_BT_MCLK_TBG_NCO_SEL_MASK)\r\n\r\n#define CIU2_CIU2_BT_PS_BT_MCLK_FROM_SOC_SEL_MASK (0x10000000U)\r\n#define CIU2_CIU2_BT_PS_BT_MCLK_FROM_SOC_SEL_SHIFT (28U)\r\n/*! BT_MCLK_FROM_SOC_SEL - BT_MCLK */\r\n#define CIU2_CIU2_BT_PS_BT_MCLK_FROM_SOC_SEL(x)  (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BT_PS_BT_MCLK_FROM_SOC_SEL_SHIFT)) & CIU2_CIU2_BT_PS_BT_MCLK_FROM_SOC_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_BT_PS2 - BT Clock Power Save 2 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_BT_PS2_BT_PCM_CLK_NCO_MVAL_MASK (0x3FFFFFFU)\r\n#define CIU2_CIU2_BT_PS2_BT_PCM_CLK_NCO_MVAL_SHIFT (0U)\r\n/*! BT_PCM_CLK_NCO_MVAL - BT_PCM_CLK NCO Module Step Control (default 0x0) */\r\n#define CIU2_CIU2_BT_PS2_BT_PCM_CLK_NCO_MVAL(x)  (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BT_PS2_BT_PCM_CLK_NCO_MVAL_SHIFT)) & CIU2_CIU2_BT_PS2_BT_PCM_CLK_NCO_MVAL_MASK)\r\n\r\n#define CIU2_CIU2_BT_PS2_BT_PCM_CLK_NCO_EN_MASK  (0x4000000U)\r\n#define CIU2_CIU2_BT_PS2_BT_PCM_CLK_NCO_EN_SHIFT (26U)\r\n/*! BT_PCM_CLK_NCO_EN - BT_PCM_CLK_NCO logic to count */\r\n#define CIU2_CIU2_BT_PS2_BT_PCM_CLK_NCO_EN(x)    (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BT_PS2_BT_PCM_CLK_NCO_EN_SHIFT)) & CIU2_CIU2_BT_PS2_BT_PCM_CLK_NCO_EN_MASK)\r\n\r\n#define CIU2_CIU2_BT_PS2_BT_PCM_CLK_TBG_NCO_SEL_MASK (0x8000000U)\r\n#define CIU2_CIU2_BT_PS2_BT_PCM_CLK_TBG_NCO_SEL_SHIFT (27U)\r\n/*! BT_PCM_CLK_TBG_NCO_SEL - BT_4M_PCM_CLK */\r\n#define CIU2_CIU2_BT_PS2_BT_PCM_CLK_TBG_NCO_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BT_PS2_BT_PCM_CLK_TBG_NCO_SEL_SHIFT)) & CIU2_CIU2_BT_PS2_BT_PCM_CLK_TBG_NCO_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_BT_REF_CTRL - BT Ref Control */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_BT_REF_CTRL_NCO_EN_MASK        (0x1U)\r\n#define CIU2_CIU2_BT_REF_CTRL_NCO_EN_SHIFT       (0U)\r\n/*! NCO_EN - Bluetooth Reference Clock NCO Enable information to APU. */\r\n#define CIU2_CIU2_BT_REF_CTRL_NCO_EN(x)          (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BT_REF_CTRL_NCO_EN_SHIFT)) & CIU2_CIU2_BT_REF_CTRL_NCO_EN_MASK)\r\n\r\n#define CIU2_CIU2_BT_REF_CTRL_NCO_SEL_MASK       (0x2U)\r\n#define CIU2_CIU2_BT_REF_CTRL_NCO_SEL_SHIFT      (1U)\r\n/*! NCO_SEL - Bluetooth Reference Clock NCO Select Value */\r\n#define CIU2_CIU2_BT_REF_CTRL_NCO_SEL(x)         (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BT_REF_CTRL_NCO_SEL_SHIFT)) & CIU2_CIU2_BT_REF_CTRL_NCO_SEL_MASK)\r\n\r\n#define CIU2_CIU2_BT_REF_CTRL_NCO_GEN_MASK       (0x3FFFCU)\r\n#define CIU2_CIU2_BT_REF_CTRL_NCO_GEN_SHIFT      (2U)\r\n/*! NCO_GEN - Bluetooth Reference Clock NCO Gen Value */\r\n#define CIU2_CIU2_BT_REF_CTRL_NCO_GEN(x)         (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BT_REF_CTRL_NCO_GEN_SHIFT)) & CIU2_CIU2_BT_REF_CTRL_NCO_GEN_MASK)\r\n\r\n#define CIU2_CIU2_BT_REF_CTRL_BT_CLK_NCO_REFCLK_SEL_MASK (0x100000U)\r\n#define CIU2_CIU2_BT_REF_CTRL_BT_CLK_NCO_REFCLK_SEL_SHIFT (20U)\r\n/*! BT_CLK_NCO_REFCLK_SEL - BT clk (bt sys clk) selection */\r\n#define CIU2_CIU2_BT_REF_CTRL_BT_CLK_NCO_REFCLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BT_REF_CTRL_BT_CLK_NCO_REFCLK_SEL_SHIFT)) & CIU2_CIU2_BT_REF_CTRL_BT_CLK_NCO_REFCLK_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_BT_PS3 - BT Clock Power Save 3 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_BT_PS3_BTU_16M_CLK_NCO_STEP_CTRL_MASK (0x3FFFFFFU)\r\n#define CIU2_CIU2_BT_PS3_BTU_16M_CLK_NCO_STEP_CTRL_SHIFT (0U)\r\n/*! BTU_16M_CLK_NCO_STEP_CTRL - BT_16M_CLK NCO Module Step Control */\r\n#define CIU2_CIU2_BT_PS3_BTU_16M_CLK_NCO_STEP_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BT_PS3_BTU_16M_CLK_NCO_STEP_CTRL_SHIFT)) & CIU2_CIU2_BT_PS3_BTU_16M_CLK_NCO_STEP_CTRL_MASK)\r\n\r\n#define CIU2_CIU2_BT_PS3_BTU_16M_CLK_NCO_EN_MASK (0x4000000U)\r\n#define CIU2_CIU2_BT_PS3_BTU_16M_CLK_NCO_EN_SHIFT (26U)\r\n/*! BTU_16M_CLK_NCO_EN - BTU 16M Clock NCO Enable */\r\n#define CIU2_CIU2_BT_PS3_BTU_16M_CLK_NCO_EN(x)   (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BT_PS3_BTU_16M_CLK_NCO_EN_SHIFT)) & CIU2_CIU2_BT_PS3_BTU_16M_CLK_NCO_EN_MASK)\r\n\r\n#define CIU2_CIU2_BT_PS3_BTU_16M_CLK_NCO_SEL_MASK (0x8000000U)\r\n#define CIU2_CIU2_BT_PS3_BTU_16M_CLK_NCO_SEL_SHIFT (27U)\r\n/*! BTU_16M_CLK_NCO_SEL - BTU 16M clock NCO Select Value */\r\n#define CIU2_CIU2_BT_PS3_BTU_16M_CLK_NCO_SEL(x)  (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BT_PS3_BTU_16M_CLK_NCO_SEL_SHIFT)) & CIU2_CIU2_BT_PS3_BTU_16M_CLK_NCO_SEL_MASK)\r\n\r\n#define CIU2_CIU2_BT_PS3_BTU_CLK_NCO_MODE_MASK   (0x20000000U)\r\n#define CIU2_CIU2_BT_PS3_BTU_CLK_NCO_MODE_SHIFT  (29U)\r\n/*! BTU_CLK_NCO_MODE - BTU Clock source from ref clock (nco mode) */\r\n#define CIU2_CIU2_BT_PS3_BTU_CLK_NCO_MODE(x)     (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BT_PS3_BTU_CLK_NCO_MODE_SHIFT)) & CIU2_CIU2_BT_PS3_BTU_CLK_NCO_MODE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_BTU_ECO_CTRL - BTU ECO Control */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_BTU_ECO_CTRL_ECO_BITS_MASK     (0xFFFFFFFFU)\r\n#define CIU2_CIU2_BTU_ECO_CTRL_ECO_BITS_SHIFT    (0U)\r\n/*! ECO_BITS - Reserved */\r\n#define CIU2_CIU2_BTU_ECO_CTRL_ECO_BITS(x)       (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BTU_ECO_CTRL_ECO_BITS_SHIFT)) & CIU2_CIU2_BTU_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_INT_MASK - CIU2 Interrupt Mask */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_INT_MASK_MASK_MASK             (0xFFFFFFFFU)\r\n#define CIU2_CIU2_INT_MASK_MASK_SHIFT            (0U)\r\n/*! MASK - Interrupt Mask for CIU2 Interrupts */\r\n#define CIU2_CIU2_INT_MASK_MASK(x)               (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_INT_MASK_MASK_SHIFT)) & CIU2_CIU2_INT_MASK_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_INT_SELECT - CIU2 Interrupt Select */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_INT_SELECT_SEL_MASK            (0xFFFFFFFFU)\r\n#define CIU2_CIU2_INT_SELECT_SEL_SHIFT           (0U)\r\n/*! SEL - Interrupt Read/Write Clear for CIU2 Interrupts */\r\n#define CIU2_CIU2_INT_SELECT_SEL(x)              (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_INT_SELECT_SEL_SHIFT)) & CIU2_CIU2_INT_SELECT_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_INT_EVENT_MASK - CIU2 Interrupt Event Mask */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_INT_EVENT_MASK_MASK_MASK       (0xFFFFFFFFU)\r\n#define CIU2_CIU2_INT_EVENT_MASK_MASK_SHIFT      (0U)\r\n/*! MASK - Interrupt Event Mask for CIU2 Interrupts */\r\n#define CIU2_CIU2_INT_EVENT_MASK_MASK(x)         (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_INT_EVENT_MASK_MASK_SHIFT)) & CIU2_CIU2_INT_EVENT_MASK_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_INT_STATUS - CIU2 Interrupt Status */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_INT_STATUS_CIU_ISR_MASK        (0xFFFFFFFFU)\r\n#define CIU2_CIU2_INT_STATUS_CIU_ISR_SHIFT       (0U)\r\n/*! CIU_ISR - CIU2 Interrupt Status (ISR) */\r\n#define CIU2_CIU2_INT_STATUS_CIU_ISR(x)          (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_INT_STATUS_CIU_ISR_SHIFT)) & CIU2_CIU2_INT_STATUS_CIU_ISR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_ERR_INT_MASK - CPU2 ERR Interrupt Mask */\r\n/*! @{ */\r\n\r\n#define CIU2_CPU2_ERR_INT_MASK_MASK_MASK         (0xFFFFFFFFU)\r\n#define CIU2_CPU2_ERR_INT_MASK_MASK_SHIFT        (0U)\r\n/*! MASK - Interrupt Mask for CPU2 ERR Interrupts */\r\n#define CIU2_CPU2_ERR_INT_MASK_MASK(x)           (((uint32_t)(((uint32_t)(x)) << CIU2_CPU2_ERR_INT_MASK_MASK_SHIFT)) & CIU2_CPU2_ERR_INT_MASK_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_ERR_INT_SELECT - CPU2 ERR Interrupt Clear Select */\r\n/*! @{ */\r\n\r\n#define CIU2_CPU2_ERR_INT_SELECT_SEL_MASK        (0xFFFFFFFFU)\r\n#define CIU2_CPU2_ERR_INT_SELECT_SEL_SHIFT       (0U)\r\n/*! SEL - Interrupt Read/Write Clear for CPU2 ERR Interrupts */\r\n#define CIU2_CPU2_ERR_INT_SELECT_SEL(x)          (((uint32_t)(((uint32_t)(x)) << CIU2_CPU2_ERR_INT_SELECT_SEL_SHIFT)) & CIU2_CPU2_ERR_INT_SELECT_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_ERR_INT_EVENT_MASK - CPU2 ERR Interrupt Event Mask */\r\n/*! @{ */\r\n\r\n#define CIU2_CPU2_ERR_INT_EVENT_MASK_MASK_MASK   (0xFFFFFFFFU)\r\n#define CIU2_CPU2_ERR_INT_EVENT_MASK_MASK_SHIFT  (0U)\r\n/*! MASK - Interrupt Event Mask for CPU2 ERR Interrupts */\r\n#define CIU2_CPU2_ERR_INT_EVENT_MASK_MASK(x)     (((uint32_t)(((uint32_t)(x)) << CIU2_CPU2_ERR_INT_EVENT_MASK_MASK_SHIFT)) & CIU2_CPU2_ERR_INT_EVENT_MASK_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_ERR_INT_STATUS - CPU2 ERR Interrupt Status */\r\n/*! @{ */\r\n\r\n#define CIU2_CPU2_ERR_INT_STATUS_ERR_ISR_MASK    (0xFFFFFFFFU)\r\n#define CIU2_CPU2_ERR_INT_STATUS_ERR_ISR_SHIFT   (0U)\r\n/*! ERR_ISR - CPU2 ERR Interrupt Status (ISR) */\r\n#define CIU2_CPU2_ERR_INT_STATUS_ERR_ISR(x)      (((uint32_t)(((uint32_t)(x)) << CIU2_CPU2_ERR_INT_STATUS_ERR_ISR_SHIFT)) & CIU2_CPU2_ERR_INT_STATUS_ERR_ISR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_BCA1_CPU2_INT_MASK - BCA1 to CPU2 Interrupt Mask */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_BCA1_CPU2_INT_MASK_IMR_MASK    (0xFFFFFFFFU)\r\n#define CIU2_CIU2_BCA1_CPU2_INT_MASK_IMR_SHIFT   (0U)\r\n/*! IMR - Interrupt Mask for BCA1 to CPU2 Interrupts */\r\n#define CIU2_CIU2_BCA1_CPU2_INT_MASK_IMR(x)      (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BCA1_CPU2_INT_MASK_IMR_SHIFT)) & CIU2_CIU2_BCA1_CPU2_INT_MASK_IMR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_BCA1_CPU2_INT_SELECT - BCA1 to CPU2 Interrupt Select */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_BCA1_CPU2_INT_SELECT_RSR_MASK  (0xFFFFFFFFU)\r\n#define CIU2_CIU2_BCA1_CPU2_INT_SELECT_RSR_SHIFT (0U)\r\n/*! RSR - Interrupt Read/Write Clear for BCA1 to CPU2 Interrupts */\r\n#define CIU2_CIU2_BCA1_CPU2_INT_SELECT_RSR(x)    (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BCA1_CPU2_INT_SELECT_RSR_SHIFT)) & CIU2_CIU2_BCA1_CPU2_INT_SELECT_RSR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_BCA1_CPU2_INT_EVENT_MASK - BCA1 to CPU2 Interrupt Event Mask */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_BCA1_CPU2_INT_EVENT_MASK_SMR_MASK (0xFFFFFFFFU)\r\n#define CIU2_CIU2_BCA1_CPU2_INT_EVENT_MASK_SMR_SHIFT (0U)\r\n/*! SMR - Interrupt Event Mask for BCA1 to CPU2 Interrupts */\r\n#define CIU2_CIU2_BCA1_CPU2_INT_EVENT_MASK_SMR(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BCA1_CPU2_INT_EVENT_MASK_SMR_SHIFT)) & CIU2_CIU2_BCA1_CPU2_INT_EVENT_MASK_SMR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_BCA1_CPU2_INT_STATUS - BCA1 to CPU2 Interrupt Status */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_BCA1_CPU2_INT_STATUS_ISR_MASK  (0xFFFFFFFFU)\r\n#define CIU2_CIU2_BCA1_CPU2_INT_STATUS_ISR_SHIFT (0U)\r\n/*! ISR - BCA1 to CPU2 Interrupt Status */\r\n#define CIU2_CIU2_BCA1_CPU2_INT_STATUS_ISR(x)    (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BCA1_CPU2_INT_STATUS_ISR_SHIFT)) & CIU2_CIU2_BCA1_CPU2_INT_STATUS_ISR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_APU_BYPASS1 - CIU2 APU Bypass Register 1 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_APU_BYPASS1_BRF_CLK_EN_BYPASS_EN_MASK (0x1U)\r\n#define CIU2_CIU2_APU_BYPASS1_BRF_CLK_EN_BYPASS_EN_SHIFT (0U)\r\n/*! BRF_CLK_EN_BYPASS_EN - Firmware Bypass BRF_Clk_En */\r\n#define CIU2_CIU2_APU_BYPASS1_BRF_CLK_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_BYPASS1_BRF_CLK_EN_BYPASS_EN_SHIFT)) & CIU2_CIU2_APU_BYPASS1_BRF_CLK_EN_BYPASS_EN_MASK)\r\n\r\n#define CIU2_CIU2_APU_BYPASS1_BRF_CLK_EN_BYPASS_VAL_MASK (0x2U)\r\n#define CIU2_CIU2_APU_BYPASS1_BRF_CLK_EN_BYPASS_VAL_SHIFT (1U)\r\n/*! BRF_CLK_EN_BYPASS_VAL - Firmware Bypass Value for BRF_Clk_En (active high signal) */\r\n#define CIU2_CIU2_APU_BYPASS1_BRF_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_BYPASS1_BRF_CLK_EN_BYPASS_VAL_SHIFT)) & CIU2_CIU2_APU_BYPASS1_BRF_CLK_EN_BYPASS_VAL_MASK)\r\n\r\n#define CIU2_CIU2_APU_BYPASS1_BT_AES_CLK_EN_BYPASS_EN_MASK (0x4U)\r\n#define CIU2_CIU2_APU_BYPASS1_BT_AES_CLK_EN_BYPASS_EN_SHIFT (2U)\r\n/*! BT_AES_CLK_EN_BYPASS_EN - Firmware Bypass for Btu_Aes_Clk */\r\n#define CIU2_CIU2_APU_BYPASS1_BT_AES_CLK_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_BYPASS1_BT_AES_CLK_EN_BYPASS_EN_SHIFT)) & CIU2_CIU2_APU_BYPASS1_BT_AES_CLK_EN_BYPASS_EN_MASK)\r\n\r\n#define CIU2_CIU2_APU_BYPASS1_BT_AES_CLK_EN_BYPASS_VAL_MASK (0x8U)\r\n#define CIU2_CIU2_APU_BYPASS1_BT_AES_CLK_EN_BYPASS_VAL_SHIFT (3U)\r\n/*! BT_AES_CLK_EN_BYPASS_VAL - Firmware Bypass Value for Btu_Aes_Clk */\r\n#define CIU2_CIU2_APU_BYPASS1_BT_AES_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_BYPASS1_BT_AES_CLK_EN_BYPASS_VAL_SHIFT)) & CIU2_CIU2_APU_BYPASS1_BT_AES_CLK_EN_BYPASS_VAL_MASK)\r\n\r\n#define CIU2_CIU2_APU_BYPASS1_SOC_CLK_EN2_T1_BYPASS_EN_MASK (0x10U)\r\n#define CIU2_CIU2_APU_BYPASS1_SOC_CLK_EN2_T1_BYPASS_EN_SHIFT (4U)\r\n/*! SOC_CLK_EN2_T1_BYPASS_EN - Firmware Bypass for SoC_Clk_En2 */\r\n#define CIU2_CIU2_APU_BYPASS1_SOC_CLK_EN2_T1_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_BYPASS1_SOC_CLK_EN2_T1_BYPASS_EN_SHIFT)) & CIU2_CIU2_APU_BYPASS1_SOC_CLK_EN2_T1_BYPASS_EN_MASK)\r\n\r\n#define CIU2_CIU2_APU_BYPASS1_SOC_CLK_EN2_T1_BYPASS_VAL_MASK (0x20U)\r\n#define CIU2_CIU2_APU_BYPASS1_SOC_CLK_EN2_T1_BYPASS_VAL_SHIFT (5U)\r\n/*! SOC_CLK_EN2_T1_BYPASS_VAL - Firmware Bypass Value for SoC_Clk_En2(active high signal) */\r\n#define CIU2_CIU2_APU_BYPASS1_SOC_CLK_EN2_T1_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_BYPASS1_SOC_CLK_EN2_T1_BYPASS_VAL_SHIFT)) & CIU2_CIU2_APU_BYPASS1_SOC_CLK_EN2_T1_BYPASS_VAL_MASK)\r\n\r\n#define CIU2_CIU2_APU_BYPASS1_TBG_BTU_CLK_EN_BYPASS_SEL_MASK (0xC0U)\r\n#define CIU2_CIU2_APU_BYPASS1_TBG_BTU_CLK_EN_BYPASS_SEL_SHIFT (6U)\r\n/*! TBG_BTU_CLK_EN_BYPASS_SEL - TBG512_320_176_BTU_Clk_En_Sel to TBG512_320_176 of CAU */\r\n#define CIU2_CIU2_APU_BYPASS1_TBG_BTU_CLK_EN_BYPASS_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_BYPASS1_TBG_BTU_CLK_EN_BYPASS_SEL_SHIFT)) & CIU2_CIU2_APU_BYPASS1_TBG_BTU_CLK_EN_BYPASS_SEL_MASK)\r\n\r\n#define CIU2_CIU2_APU_BYPASS1_BT_AES_CLK_SEL_BYPASS_EN_MASK (0x100U)\r\n#define CIU2_CIU2_APU_BYPASS1_BT_AES_CLK_SEL_BYPASS_EN_SHIFT (8U)\r\n/*! BT_AES_CLK_SEL_BYPASS_EN - Firmware Bypass for Btu_Aes_Clk_Sel */\r\n#define CIU2_CIU2_APU_BYPASS1_BT_AES_CLK_SEL_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_BYPASS1_BT_AES_CLK_SEL_BYPASS_EN_SHIFT)) & CIU2_CIU2_APU_BYPASS1_BT_AES_CLK_SEL_BYPASS_EN_MASK)\r\n\r\n#define CIU2_CIU2_APU_BYPASS1_BT_AES_CLK_SEL_BYPASS_VAL_MASK (0x200U)\r\n#define CIU2_CIU2_APU_BYPASS1_BT_AES_CLK_SEL_BYPASS_VAL_SHIFT (9U)\r\n/*! BT_AES_CLK_SEL_BYPASS_VAL - Firmware Bypass Value for Btu_Aes_Clk_Sel */\r\n#define CIU2_CIU2_APU_BYPASS1_BT_AES_CLK_SEL_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_BYPASS1_BT_AES_CLK_SEL_BYPASS_VAL_SHIFT)) & CIU2_CIU2_APU_BYPASS1_BT_AES_CLK_SEL_BYPASS_VAL_MASK)\r\n\r\n#define CIU2_CIU2_APU_BYPASS1_TBG_BTU_CLK_EN_BYPASS_VAL_MASK (0x400U)\r\n#define CIU2_CIU2_APU_BYPASS1_TBG_BTU_CLK_EN_BYPASS_VAL_SHIFT (10U)\r\n/*! TBG_BTU_CLK_EN_BYPASS_VAL - TBG512_320_176_BTU_Clk_En Bypass Value */\r\n#define CIU2_CIU2_APU_BYPASS1_TBG_BTU_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_BYPASS1_TBG_BTU_CLK_EN_BYPASS_VAL_SHIFT)) & CIU2_CIU2_APU_BYPASS1_TBG_BTU_CLK_EN_BYPASS_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CPU2_LMU_STA_BYPASS0 - LMU static bank control byapss0 Register for CPU2 mem */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_EN_MASK (0xFFU)\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_EN_SHIFT (0U)\r\n/*! LMU_STA_BANKS_ISO_EN_BP_EN - Firmware Bypass enable for lmu static banks iso_en */\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_EN_SHIFT)) & CIU2_CIU2_CPU2_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_EN_MASK)\r\n\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_VAL_MASK (0xFF00U)\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_VAL_SHIFT (8U)\r\n/*! LMU_STA_BANKS_ISO_EN_BP_VAL - Firmware Bypass value for lmu static banks iso_en */\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_VAL_SHIFT)) & CIU2_CIU2_CPU2_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_VAL_MASK)\r\n\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_EN_MASK (0xFF0000U)\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_EN_SHIFT (16U)\r\n/*! LMU_STA_BANKS_PSW_EN_BP_EN - Firmware Bypass enable for lmu static banks psw_en */\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_EN_SHIFT)) & CIU2_CIU2_CPU2_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_EN_MASK)\r\n\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_VAL_MASK (0xFF000000U)\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_VAL_SHIFT (24U)\r\n/*! LMU_STA_BANKS_PSW_EN_BP_VAL - Firmware Bypass value for lmu static banks psw_en */\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_VAL_SHIFT)) & CIU2_CIU2_CPU2_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CPU2_LMU_STA_BYPASS1 - LMU static bank control byapss1 Register for CPU2 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_EN_MASK (0xFFU)\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_EN_SHIFT (0U)\r\n/*! LMU_STA_BANKS_SRAM_PD_BP_EN - Firmware Bypass enable for lmu static banks sram_pd */\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_EN_SHIFT)) & CIU2_CIU2_CPU2_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_EN_MASK)\r\n\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_VAL_MASK (0xFF00U)\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_VAL_SHIFT (8U)\r\n/*! LMU_STA_BANKS_SRAM_PD_BP_VAL - Firmware Bypass value for lmu static banks sram_pd */\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_VAL_SHIFT)) & CIU2_CIU2_CPU2_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_VAL_MASK)\r\n\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_EN_MASK (0xFF0000U)\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_EN_SHIFT (16U)\r\n/*! LMU_STA_BANKS_FNRST_BP_EN - Firmware Bypass enable for lmu static banks fnrst */\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_EN_SHIFT)) & CIU2_CIU2_CPU2_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_EN_MASK)\r\n\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_VAL_MASK (0xFF000000U)\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_VAL_SHIFT (24U)\r\n/*! LMU_STA_BANKS_FNRST_BP_VAL - Firmware Bypass value for lmu static banks fnrst */\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_VAL_SHIFT)) & CIU2_CIU2_CPU2_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CPU2_LMU_STA_BYPASS2 - LMU static bank byapss2 Register for CPU2 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_EN_MASK (0xFFU)\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_EN_SHIFT (0U)\r\n/*! LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_EN - Firmware Bypass enable for lmu static banks vddmc_sw_pd_ctrl */\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_EN_SHIFT)) & CIU2_CIU2_CPU2_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_EN_MASK)\r\n\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_MASK (0xFF00U)\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_SHIFT (8U)\r\n/*! LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_VAL - Firmware Bypass value for lmu static banks vddmc_sw_pd_ctrl */\r\n#define CIU2_CIU2_CPU2_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_SHIFT)) & CIU2_CIU2_CPU2_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CPU2_LMU_G2BIST_CTRL_BYPASS - LMU G2Bist control bypass Register for CPU2 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CPU2_LMU_G2BIST_CTRL_BYPASS_LMU_CPU2_STA_PWRDMN_RPR_REQ_BP_EN_MASK (0x1U)\r\n#define CIU2_CIU2_CPU2_LMU_G2BIST_CTRL_BYPASS_LMU_CPU2_STA_PWRDMN_RPR_REQ_BP_EN_SHIFT (0U)\r\n/*! LMU_CPU2_STA_PWRDMN_RPR_REQ_BP_EN - Firmware Bypass enable for CPU2 static banks lmu power domain repair request */\r\n#define CIU2_CIU2_CPU2_LMU_G2BIST_CTRL_BYPASS_LMU_CPU2_STA_PWRDMN_RPR_REQ_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_LMU_G2BIST_CTRL_BYPASS_LMU_CPU2_STA_PWRDMN_RPR_REQ_BP_EN_SHIFT)) & CIU2_CIU2_CPU2_LMU_G2BIST_CTRL_BYPASS_LMU_CPU2_STA_PWRDMN_RPR_REQ_BP_EN_MASK)\r\n\r\n#define CIU2_CIU2_CPU2_LMU_G2BIST_CTRL_BYPASS_LMU_CPU2_STA_PWRDMN_RPR_REQ_BP_VAL_MASK (0xFEU)\r\n#define CIU2_CIU2_CPU2_LMU_G2BIST_CTRL_BYPASS_LMU_CPU2_STA_PWRDMN_RPR_REQ_BP_VAL_SHIFT (1U)\r\n/*! LMU_CPU2_STA_PWRDMN_RPR_REQ_BP_VAL - Firmware Bypass value for CPU2 static banks lmu power domain repair request */\r\n#define CIU2_CIU2_CPU2_LMU_G2BIST_CTRL_BYPASS_LMU_CPU2_STA_PWRDMN_RPR_REQ_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_LMU_G2BIST_CTRL_BYPASS_LMU_CPU2_STA_PWRDMN_RPR_REQ_BP_VAL_SHIFT)) & CIU2_CIU2_CPU2_LMU_G2BIST_CTRL_BYPASS_LMU_CPU2_STA_PWRDMN_RPR_REQ_BP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_APU_PWR_CTRL_BYPASS1 - APU power control Bypass Register 1 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_PSW_BYPASS_VAL_MASK (0x1U)\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_PSW_BYPASS_VAL_SHIFT (0U)\r\n/*! BRF_PSW_BYPASS_VAL - brf Power Switch Control */\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_PSW_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_PSW_BYPASS_VAL_SHIFT)) & CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_PSW_BYPASS_VAL_MASK)\r\n\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_PSW_BYPASS_EN_MASK (0x2U)\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_PSW_BYPASS_EN_SHIFT (1U)\r\n/*! BRF_PSW_BYPASS_EN - brf Power Switch Control Enable */\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_PSW_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_PSW_BYPASS_EN_SHIFT)) & CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_PSW_BYPASS_EN_MASK)\r\n\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_FWBAR_BYPASS_VAL_MASK (0x4U)\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_FWBAR_BYPASS_VAL_SHIFT (2U)\r\n/*! BRF_FWBAR_BYPASS_VAL - brf Firewallbar Control */\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_FWBAR_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_FWBAR_BYPASS_VAL_SHIFT)) & CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_FWBAR_BYPASS_VAL_MASK)\r\n\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_FWBAR_BYPASS_EN_MASK (0x8U)\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_FWBAR_BYPASS_EN_SHIFT (3U)\r\n/*! BRF_FWBAR_BYPASS_EN - brf Firewallbar Control Enable */\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_FWBAR_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_FWBAR_BYPASS_EN_SHIFT)) & CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_FWBAR_BYPASS_EN_MASK)\r\n\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_ISO_EN_BYPASS_VAL_MASK (0x10U)\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_ISO_EN_BYPASS_VAL_SHIFT (4U)\r\n/*! BRF_ISO_EN_BYPASS_VAL - brf Isolation Cell Control */\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_ISO_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_ISO_EN_BYPASS_VAL_SHIFT)) & CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_ISO_EN_BYPASS_VAL_MASK)\r\n\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_ISO_EN_BYPASS_EN_MASK (0x20U)\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_ISO_EN_BYPASS_EN_SHIFT (5U)\r\n/*! BRF_ISO_EN_BYPASS_EN - brf Isolation Cell Control Enable */\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_ISO_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_ISO_EN_BYPASS_EN_SHIFT)) & CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_ISO_EN_BYPASS_EN_MASK)\r\n\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_CLK_DIV_RSTB_BYPASS_VAL_MASK (0x40U)\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_CLK_DIV_RSTB_BYPASS_VAL_SHIFT (6U)\r\n/*! BRF_CLK_DIV_RSTB_BYPASS_VAL - Firmware Bypass Value for brf Clk_Div_Rstb (active low signal) */\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_CLK_DIV_RSTB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_CLK_DIV_RSTB_BYPASS_VAL_SHIFT)) & CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_CLK_DIV_RSTB_BYPASS_VAL_MASK)\r\n\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_CLK_DIV_RSTB_BYPASS_EN_MASK (0x80U)\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_CLK_DIV_RSTB_BYPASS_EN_SHIFT (7U)\r\n/*! BRF_CLK_DIV_RSTB_BYPASS_EN - Firmware Bypass brf Clk_Div_Rstb from APU */\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_CLK_DIV_RSTB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_CLK_DIV_RSTB_BYPASS_EN_SHIFT)) & CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_CLK_DIV_RSTB_BYPASS_EN_MASK)\r\n\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_SRAM_PD_BYPASS_VAL_MASK (0x100U)\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_SRAM_PD_BYPASS_VAL_SHIFT (8U)\r\n/*! BRF_SRAM_PD_BYPASS_VAL - Firmware Bypass Value for SRAM_PD (active high signal) */\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_SRAM_PD_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_SRAM_PD_BYPASS_VAL_SHIFT)) & CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_SRAM_PD_BYPASS_VAL_MASK)\r\n\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_SRAM_PD_BYPASS_EN_MASK (0x200U)\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_SRAM_PD_BYPASS_EN_SHIFT (9U)\r\n/*! BRF_SRAM_PD_BYPASS_EN - Firmware Bypass SRAM_PD from APU */\r\n#define CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_SRAM_PD_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_SRAM_PD_BYPASS_EN_SHIFT)) & CIU2_CIU2_APU_PWR_CTRL_BYPASS1_BRF_SRAM_PD_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_AHB2AHB_BRIDGE_CTRL - AHB2AHB Bridge Control Register */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_AHB2AHB_BRIDGE_CTRL_PREFETCH_HSEL_EN_MASK (0x1U)\r\n#define CIU2_CIU2_AHB2AHB_BRIDGE_CTRL_PREFETCH_HSEL_EN_SHIFT (0U)\r\n/*! PREFETCH_HSEL_EN - ahb2ahb bridge pre-fetch hsel enable */\r\n#define CIU2_CIU2_AHB2AHB_BRIDGE_CTRL_PREFETCH_HSEL_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_AHB2AHB_BRIDGE_CTRL_PREFETCH_HSEL_EN_SHIFT)) & CIU2_CIU2_AHB2AHB_BRIDGE_CTRL_PREFETCH_HSEL_EN_MASK)\r\n\r\n#define CIU2_CIU2_AHB2AHB_BRIDGE_CTRL_MCI_AHB2_A2A_PREFETCH_EN_MASK (0x2U)\r\n#define CIU2_CIU2_AHB2AHB_BRIDGE_CTRL_MCI_AHB2_A2A_PREFETCH_EN_SHIFT (1U)\r\n/*! MCI_AHB2_A2A_PREFETCH_EN - MCI-AHB2 ahb2ahb bridge pre-fetch hsel enable */\r\n#define CIU2_CIU2_AHB2AHB_BRIDGE_CTRL_MCI_AHB2_A2A_PREFETCH_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_AHB2AHB_BRIDGE_CTRL_MCI_AHB2_A2A_PREFETCH_EN_SHIFT)) & CIU2_CIU2_AHB2AHB_BRIDGE_CTRL_MCI_AHB2_A2A_PREFETCH_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CLK_CP15_DIS1 - Clock Auto Shut-off Enable1 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CLK_CP15_DIS1_CIU_BTAPU_AHB_CLK_DIS_ON_SLP_MASK (0x100000U)\r\n#define CIU2_CIU2_CLK_CP15_DIS1_CIU_BTAPU_AHB_CLK_DIS_ON_SLP_SHIFT (20U)\r\n/*! CIU_BTAPU_AHB_CLK_DIS_ON_SLP - APU Shut Off */\r\n#define CIU2_CIU2_CLK_CP15_DIS1_CIU_BTAPU_AHB_CLK_DIS_ON_SLP(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CLK_CP15_DIS1_CIU_BTAPU_AHB_CLK_DIS_ON_SLP_SHIFT)) & CIU2_CIU2_CLK_CP15_DIS1_CIU_BTAPU_AHB_CLK_DIS_ON_SLP_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CLK_RTU_NCO_CTRL - RTU NCO Clock Control */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU_CLK_RTU_NCO_CTRL_CIU_BTRTU_REF_CLK_SEL_MASK (0x1U)\r\n#define CIU2_CIU_CLK_RTU_NCO_CTRL_CIU_BTRTU_REF_CLK_SEL_SHIFT (0U)\r\n/*! CIU_BTRTU_REF_CLK_SEL - RTU Reference Clock from UART reference clock tree */\r\n#define CIU2_CIU_CLK_RTU_NCO_CTRL_CIU_BTRTU_REF_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_RTU_NCO_CTRL_CIU_BTRTU_REF_CLK_SEL_SHIFT)) & CIU2_CIU_CLK_RTU_NCO_CTRL_CIU_BTRTU_REF_CLK_SEL_MASK)\r\n\r\n#define CIU2_CIU_CLK_RTU_NCO_CTRL_CIU_BTRTU_NCO_OUT_SEL_MASK (0x2U)\r\n#define CIU2_CIU_CLK_RTU_NCO_CTRL_CIU_BTRTU_NCO_OUT_SEL_SHIFT (1U)\r\n/*! CIU_BTRTU_NCO_OUT_SEL - RTU NCO Mode Select (Reference Clock Based) */\r\n#define CIU2_CIU_CLK_RTU_NCO_CTRL_CIU_BTRTU_NCO_OUT_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_RTU_NCO_CTRL_CIU_BTRTU_NCO_OUT_SEL_SHIFT)) & CIU2_CIU_CLK_RTU_NCO_CTRL_CIU_BTRTU_NCO_OUT_SEL_MASK)\r\n\r\n#define CIU2_CIU_CLK_RTU_NCO_CTRL_CIU_BTRTU_NCO_ENABLE_MASK (0x4U)\r\n#define CIU2_CIU_CLK_RTU_NCO_CTRL_CIU_BTRTU_NCO_ENABLE_SHIFT (2U)\r\n/*! CIU_BTRTU_NCO_ENABLE - RTU NCO Enable (Reference Clock Based) */\r\n#define CIU2_CIU_CLK_RTU_NCO_CTRL_CIU_BTRTU_NCO_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_RTU_NCO_CTRL_CIU_BTRTU_NCO_ENABLE_SHIFT)) & CIU2_CIU_CLK_RTU_NCO_CTRL_CIU_BTRTU_NCO_ENABLE_MASK)\r\n\r\n#define CIU2_CIU_CLK_RTU_NCO_CTRL_CIU_BTRTU_NCO_STEP_MASK (0xFFFF0000U)\r\n#define CIU2_CIU_CLK_RTU_NCO_CTRL_CIU_BTRTU_NCO_STEP_SHIFT (16U)\r\n/*! CIU_BTRTU_NCO_STEP - Step size for RTU clock NCO (Reference Clock Based) */\r\n#define CIU2_CIU_CLK_RTU_NCO_CTRL_CIU_BTRTU_NCO_STEP(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_RTU_NCO_CTRL_CIU_BTRTU_NCO_STEP_SHIFT)) & CIU2_CIU_CLK_RTU_NCO_CTRL_CIU_BTRTU_NCO_STEP_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CLK_SOCCLK_CTRL - SOC Clock Control */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_BTU_PCM_CLK_T3_256_DIV125_EN_MASK (0x40U)\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_BTU_PCM_CLK_T3_256_DIV125_EN_SHIFT (6U)\r\n/*! BTU_PCM_CLK_T3_256_DIV125_EN - T3_256 DIV125 Enable */\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_BTU_PCM_CLK_T3_256_DIV125_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_SOCCLK_CTRL_BTU_PCM_CLK_T3_256_DIV125_EN_SHIFT)) & CIU2_CIU_CLK_SOCCLK_CTRL_BTU_PCM_CLK_T3_256_DIV125_EN_MASK)\r\n\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_BTU_PCM_CLK_T3_256_DIV125_CLK_SEL_MASK (0x80U)\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_BTU_PCM_CLK_T3_256_DIV125_CLK_SEL_SHIFT (7U)\r\n/*! BTU_PCM_CLK_T3_256_DIV125_CLK_SEL - T3_256 DIV125 Clock Select */\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_BTU_PCM_CLK_T3_256_DIV125_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_SOCCLK_CTRL_BTU_PCM_CLK_T3_256_DIV125_CLK_SEL_SHIFT)) & CIU2_CIU_CLK_SOCCLK_CTRL_BTU_PCM_CLK_T3_256_DIV125_CLK_SEL_MASK)\r\n\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_BTU_MCLK_T3_512_DIV125_EN_MASK (0x100U)\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_BTU_MCLK_T3_512_DIV125_EN_SHIFT (8U)\r\n/*! BTU_MCLK_T3_512_DIV125_EN - T3_512 DIV125 Enable */\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_BTU_MCLK_T3_512_DIV125_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_SOCCLK_CTRL_BTU_MCLK_T3_512_DIV125_EN_SHIFT)) & CIU2_CIU_CLK_SOCCLK_CTRL_BTU_MCLK_T3_512_DIV125_EN_MASK)\r\n\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_BTU_MCLK_T3_512_DIV125_CLK_SEL_MASK (0x200U)\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_BTU_MCLK_T3_512_DIV125_CLK_SEL_SHIFT (9U)\r\n/*! BTU_MCLK_T3_512_DIV125_CLK_SEL - T3_512 DIV125 Clock Select */\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_BTU_MCLK_T3_512_DIV125_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_SOCCLK_CTRL_BTU_MCLK_T3_512_DIV125_CLK_SEL_SHIFT)) & CIU2_CIU_CLK_SOCCLK_CTRL_BTU_MCLK_T3_512_DIV125_CLK_SEL_MASK)\r\n\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_CIU_BTAPU_CONST_CAL_CLK_SEL_MASK (0x400U)\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_CIU_BTAPU_CONST_CAL_CLK_SEL_SHIFT (10U)\r\n/*! CIU_BTAPU_CONST_CAL_CLK_SEL - PMU Constant Calibration Clock Select */\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_CIU_BTAPU_CONST_CAL_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_SOCCLK_CTRL_CIU_BTAPU_CONST_CAL_CLK_SEL_SHIFT)) & CIU2_CIU_CLK_SOCCLK_CTRL_CIU_BTAPU_CONST_CAL_CLK_SEL_MASK)\r\n\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_CIU_BTAPU_CAL_CLK_SEL_MASK (0x800U)\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_CIU_BTAPU_CAL_CLK_SEL_SHIFT (11U)\r\n/*! CIU_BTAPU_CAL_CLK_SEL - PMU Calibration Clock */\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_CIU_BTAPU_CAL_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_SOCCLK_CTRL_CIU_BTAPU_CAL_CLK_SEL_SHIFT)) & CIU2_CIU_CLK_SOCCLK_CTRL_CIU_BTAPU_CAL_CLK_SEL_MASK)\r\n\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_PM_CLK_SEL_MASK (0x1000U)\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_PM_CLK_SEL_SHIFT (12U)\r\n/*! PM_CLK_SEL - PM Clock source select */\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_PM_CLK_SEL(x)   (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_SOCCLK_CTRL_PM_CLK_SEL_SHIFT)) & CIU2_CIU_CLK_SOCCLK_CTRL_PM_CLK_SEL_MASK)\r\n\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_PM_CLK_TBG_SEL_MASK (0x2000U)\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_PM_CLK_TBG_SEL_SHIFT (13U)\r\n/*! PM_CLK_TBG_SEL - PM Clock */\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_PM_CLK_TBG_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_SOCCLK_CTRL_PM_CLK_TBG_SEL_SHIFT)) & CIU2_CIU_CLK_SOCCLK_CTRL_PM_CLK_TBG_SEL_MASK)\r\n\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_CIU_USE_REFCLK_MASK (0x4000U)\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_CIU_USE_REFCLK_SHIFT (14U)\r\n/*! CIU_USE_REFCLK - SoC_Clk Clock */\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_CIU_USE_REFCLK(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_SOCCLK_CTRL_CIU_USE_REFCLK_SHIFT)) & CIU2_CIU_CLK_SOCCLK_CTRL_CIU_USE_REFCLK_MASK)\r\n\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_BT_AES_CLK_32_64_SEL_MASK (0x8000U)\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_BT_AES_CLK_32_64_SEL_SHIFT (15U)\r\n/*! BT_AES_CLK_32_64_SEL - BT AES Clock Select 32 MHz or 64 MHz select */\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_BT_AES_CLK_32_64_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_SOCCLK_CTRL_BT_AES_CLK_32_64_SEL_SHIFT)) & CIU2_CIU_CLK_SOCCLK_CTRL_BT_AES_CLK_32_64_SEL_MASK)\r\n\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_AHB2_AHB2APB_PCLK_DIV_SEL_MASK (0xF0000U)\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_AHB2_AHB2APB_PCLK_DIV_SEL_SHIFT (16U)\r\n/*! AHB2_AHB2APB_PCLK_DIV_SEL - AHB2 AHB2APB PCLK Divider Select */\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_AHB2_AHB2APB_PCLK_DIV_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_SOCCLK_CTRL_AHB2_AHB2APB_PCLK_DIV_SEL_SHIFT)) & CIU2_CIU_CLK_SOCCLK_CTRL_AHB2_AHB2APB_PCLK_DIV_SEL_MASK)\r\n\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_AHB2_AHB2APB_WAIT_CYCLES_MASK (0xF0000000U)\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_AHB2_AHB2APB_WAIT_CYCLES_SHIFT (28U)\r\n/*! AHB2_AHB2APB_WAIT_CYCLES - AH2 AHB2APB Wait Cycles between each APB transaction */\r\n#define CIU2_CIU_CLK_SOCCLK_CTRL_AHB2_AHB2APB_WAIT_CYCLES(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_SOCCLK_CTRL_AHB2_AHB2APB_WAIT_CYCLES_SHIFT)) & CIU2_CIU_CLK_SOCCLK_CTRL_AHB2_AHB2APB_WAIT_CYCLES_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CLK_SLEEPCLK_CTRL - Sleep Clock Control */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU_CLK_SLEEPCLK_CTRL_CIU_SLEEP_CLK_NCO_MVAL_MASK (0xFFFFFFU)\r\n#define CIU2_CIU_CLK_SLEEPCLK_CTRL_CIU_SLEEP_CLK_NCO_MVAL_SHIFT (0U)\r\n/*! CIU_SLEEP_CLK_NCO_MVAL - Sleep Clock NCO */\r\n#define CIU2_CIU_CLK_SLEEPCLK_CTRL_CIU_SLEEP_CLK_NCO_MVAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_SLEEPCLK_CTRL_CIU_SLEEP_CLK_NCO_MVAL_SHIFT)) & CIU2_CIU_CLK_SLEEPCLK_CTRL_CIU_SLEEP_CLK_NCO_MVAL_MASK)\r\n\r\n#define CIU2_CIU_CLK_SLEEPCLK_CTRL_CIU_NCO_SLEEP_CLK_SEL_MASK (0x2000000U)\r\n#define CIU2_CIU_CLK_SLEEPCLK_CTRL_CIU_NCO_SLEEP_CLK_SEL_SHIFT (25U)\r\n/*! CIU_NCO_SLEEP_CLK_SEL - NCO Sleep Clock Select */\r\n#define CIU2_CIU_CLK_SLEEPCLK_CTRL_CIU_NCO_SLEEP_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_SLEEPCLK_CTRL_CIU_NCO_SLEEP_CLK_SEL_SHIFT)) & CIU2_CIU_CLK_SLEEPCLK_CTRL_CIU_NCO_SLEEP_CLK_SEL_MASK)\r\n\r\n#define CIU2_CIU_CLK_SLEEPCLK_CTRL_CIU_REFCLK_SLEEP_CLK_SEL_MASK (0x10000000U)\r\n#define CIU2_CIU_CLK_SLEEPCLK_CTRL_CIU_REFCLK_SLEEP_CLK_SEL_SHIFT (28U)\r\n/*! CIU_REFCLK_SLEEP_CLK_SEL - Reference Clock Sleep Clock Select */\r\n#define CIU2_CIU_CLK_SLEEPCLK_CTRL_CIU_REFCLK_SLEEP_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_SLEEPCLK_CTRL_CIU_REFCLK_SLEEP_CLK_SEL_SHIFT)) & CIU2_CIU_CLK_SLEEPCLK_CTRL_CIU_REFCLK_SLEEP_CLK_SEL_MASK)\r\n\r\n#define CIU2_CIU_CLK_SLEEPCLK_CTRL_CIU_PCIE_SLP_CLK_SEL_MASK (0x40000000U)\r\n#define CIU2_CIU_CLK_SLEEPCLK_CTRL_CIU_PCIE_SLP_CLK_SEL_SHIFT (30U)\r\n/*! CIU_PCIE_SLP_CLK_SEL - PCIE Sleep Clock Select */\r\n#define CIU2_CIU_CLK_SLEEPCLK_CTRL_CIU_PCIE_SLP_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_SLEEPCLK_CTRL_CIU_PCIE_SLP_CLK_SEL_SHIFT)) & CIU2_CIU_CLK_SLEEPCLK_CTRL_CIU_PCIE_SLP_CLK_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU_CLK_SLEEPCLK_CTRL2 - Sleep Clock Control 2 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU_CLK_SLEEPCLK_CTRL2_CIU_SLEEP_CLK_NCO_MVAL_DURING_SLP_MASK (0xFFFFFFU)\r\n#define CIU2_CIU_CLK_SLEEPCLK_CTRL2_CIU_SLEEP_CLK_NCO_MVAL_DURING_SLP_SHIFT (0U)\r\n/*! CIU_SLEEP_CLK_NCO_MVAL_DURING_SLP - Sleep Clock NCO value for the sleep mode */\r\n#define CIU2_CIU_CLK_SLEEPCLK_CTRL2_CIU_SLEEP_CLK_NCO_MVAL_DURING_SLP(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_SLEEPCLK_CTRL2_CIU_SLEEP_CLK_NCO_MVAL_DURING_SLP_SHIFT)) & CIU2_CIU_CLK_SLEEPCLK_CTRL2_CIU_SLEEP_CLK_NCO_MVAL_DURING_SLP_MASK)\r\n\r\n#define CIU2_CIU_CLK_SLEEPCLK_CTRL2_CIU_SLEEP_CLK_NCO_MVAL_BYPASS_MASK (0x1000000U)\r\n#define CIU2_CIU_CLK_SLEEPCLK_CTRL2_CIU_SLEEP_CLK_NCO_MVAL_BYPASS_SHIFT (24U)\r\n/*! CIU_SLEEP_CLK_NCO_MVAL_BYPASS - Sleep Clock NCO mval Bypass */\r\n#define CIU2_CIU_CLK_SLEEPCLK_CTRL2_CIU_SLEEP_CLK_NCO_MVAL_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU_CLK_SLEEPCLK_CTRL2_CIU_SLEEP_CLK_NCO_MVAL_BYPASS_SHIFT)) & CIU2_CIU_CLK_SLEEPCLK_CTRL2_CIU_SLEEP_CLK_NCO_MVAL_BYPASS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_IOMUX_MODE_CTRL - Test Bus Select */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_IOMUX_MODE_CTRL_CIU2_EXT_BRF_BIDI_MODE_MASK (0x1U)\r\n#define CIU2_CIU2_IOMUX_MODE_CTRL_CIU2_EXT_BRF_BIDI_MODE_SHIFT (0U)\r\n/*! CIU2_EXT_BRF_BIDI_MODE - \" */\r\n#define CIU2_CIU2_IOMUX_MODE_CTRL_CIU2_EXT_BRF_BIDI_MODE(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IOMUX_MODE_CTRL_CIU2_EXT_BRF_BIDI_MODE_SHIFT)) & CIU2_CIU2_IOMUX_MODE_CTRL_CIU2_EXT_BRF_BIDI_MODE_MASK)\r\n\r\n#define CIU2_CIU2_IOMUX_MODE_CTRL_CIU2_BRF_STANDALONE_DATA_MODE_MASK (0x2U)\r\n#define CIU2_CIU2_IOMUX_MODE_CTRL_CIU2_BRF_STANDALONE_DATA_MODE_SHIFT (1U)\r\n/*! CIU2_BRF_STANDALONE_DATA_MODE - \" */\r\n#define CIU2_CIU2_IOMUX_MODE_CTRL_CIU2_BRF_STANDALONE_DATA_MODE(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IOMUX_MODE_CTRL_CIU2_BRF_STANDALONE_DATA_MODE_SHIFT)) & CIU2_CIU2_IOMUX_MODE_CTRL_CIU2_BRF_STANDALONE_DATA_MODE_MASK)\r\n\r\n#define CIU2_CIU2_IOMUX_MODE_CTRL_CIU2_EXT_FRF_MODE_MASK (0x4U)\r\n#define CIU2_CIU2_IOMUX_MODE_CTRL_CIU2_EXT_FRF_MODE_SHIFT (2U)\r\n/*! CIU2_EXT_FRF_MODE - 0: On Chip BRF is used for 15. */\r\n#define CIU2_CIU2_IOMUX_MODE_CTRL_CIU2_EXT_FRF_MODE(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IOMUX_MODE_CTRL_CIU2_EXT_FRF_MODE_SHIFT)) & CIU2_CIU2_IOMUX_MODE_CTRL_CIU2_EXT_FRF_MODE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_RST_SW2 - Software Module Reset */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_RST_SW2_DRO__MASK              (0x2U)\r\n#define CIU2_CIU2_RST_SW2_DRO__SHIFT             (1U)\r\n/*! DRO_ - DRO Clock Reset */\r\n#define CIU2_CIU2_RST_SW2_DRO_(x)                (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW2_DRO__SHIFT)) & CIU2_CIU2_RST_SW2_DRO__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW2_BTAPU_AHB_CLK__MASK    (0x4U)\r\n#define CIU2_CIU2_RST_SW2_BTAPU_AHB_CLK__SHIFT   (2U)\r\n/*! BTAPU_AHB_CLK_ - AHB Clock Logic reset for BTAPU */\r\n#define CIU2_CIU2_RST_SW2_BTAPU_AHB_CLK_(x)      (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW2_BTAPU_AHB_CLK__SHIFT)) & CIU2_CIU2_RST_SW2_BTAPU_AHB_CLK__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW2_BTAPU_REF_CLK__MASK    (0x8U)\r\n#define CIU2_CIU2_RST_SW2_BTAPU_REF_CLK__SHIFT   (3U)\r\n/*! BTAPU_REF_CLK_ - Ref Clock Logic reset for BTAPU */\r\n#define CIU2_CIU2_RST_SW2_BTAPU_REF_CLK_(x)      (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW2_BTAPU_REF_CLK__SHIFT)) & CIU2_CIU2_RST_SW2_BTAPU_REF_CLK__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW2_BTAPU_SLP_CLK__MASK    (0x10U)\r\n#define CIU2_CIU2_RST_SW2_BTAPU_SLP_CLK__SHIFT   (4U)\r\n/*! BTAPU_SLP_CLK_ - Sleep Clock Logic reset for BTAPU */\r\n#define CIU2_CIU2_RST_SW2_BTAPU_SLP_CLK_(x)      (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW2_BTAPU_SLP_CLK__SHIFT)) & CIU2_CIU2_RST_SW2_BTAPU_SLP_CLK__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW2_CIU2_REGISTER_RST__MASK (0x20U)\r\n#define CIU2_CIU2_RST_SW2_CIU2_REGISTER_RST__SHIFT (5U)\r\n/*! CIU2_REGISTER_RST_ - CIU_Reg Module Soft Reset */\r\n#define CIU2_CIU2_RST_SW2_CIU2_REGISTER_RST_(x)  (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW2_CIU2_REGISTER_RST__SHIFT)) & CIU2_CIU2_RST_SW2_CIU2_REGISTER_RST__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW2_SMU2_TM__MASK          (0x40U)\r\n#define CIU2_CIU2_RST_SW2_SMU2_TM__SHIFT         (6U)\r\n/*! SMU2_TM_ - Test Mode Reset for SMU2 */\r\n#define CIU2_CIU2_RST_SW2_SMU2_TM_(x)            (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW2_SMU2_TM__SHIFT)) & CIU2_CIU2_RST_SW2_SMU2_TM__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW2_MSC_A2A__MASK          (0x80U)\r\n#define CIU2_CIU2_RST_SW2_MSC_A2A__SHIFT         (7U)\r\n/*! MSC_A2A_ - Soft Reset to A2A in MSC */\r\n#define CIU2_CIU2_RST_SW2_MSC_A2A_(x)            (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW2_MSC_A2A__SHIFT)) & CIU2_CIU2_RST_SW2_MSC_A2A__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW2_SOCCIU_A2A_RST__MASK   (0x100U)\r\n#define CIU2_CIU2_RST_SW2_SOCCIU_A2A_RST__SHIFT  (8U)\r\n/*! SOCCIU_A2A_RST_ - Soft Reset to A2A in SOCCIU */\r\n#define CIU2_CIU2_RST_SW2_SOCCIU_A2A_RST_(x)     (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW2_SOCCIU_A2A_RST__SHIFT)) & CIU2_CIU2_RST_SW2_SOCCIU_A2A_RST__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW2_CIU2_FFU_RST__MASK     (0x200U)\r\n#define CIU2_CIU2_RST_SW2_CIU2_FFU_RST__SHIFT    (9U)\r\n/*! CIU2_FFU_RST_ - Soft Reset to FFU */\r\n#define CIU2_CIU2_RST_SW2_CIU2_FFU_RST_(x)       (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW2_CIU2_FFU_RST__SHIFT)) & CIU2_CIU2_RST_SW2_CIU2_FFU_RST__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW2_CIU2_AHB2APB_SW_RESETN_MASK (0x400U)\r\n#define CIU2_CIU2_RST_SW2_CIU2_AHB2APB_SW_RESETN_SHIFT (10U)\r\n/*! CIU2_AHB2APB_SW_RESETN - SW reset to the ahb2apb hresetn */\r\n#define CIU2_CIU2_RST_SW2_CIU2_AHB2APB_SW_RESETN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW2_CIU2_AHB2APB_SW_RESETN_SHIFT)) & CIU2_CIU2_RST_SW2_CIU2_AHB2APB_SW_RESETN_MASK)\r\n\r\n#define CIU2_CIU2_RST_SW2_CIU2_FFU_AHB_RST__MASK (0x10000U)\r\n#define CIU2_CIU2_RST_SW2_CIU2_FFU_AHB_RST__SHIFT (16U)\r\n/*! CIU2_FFU_AHB_RST_ - Soft Reset to FFU AHB I/F logic */\r\n#define CIU2_CIU2_RST_SW2_CIU2_FFU_AHB_RST_(x)   (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW2_CIU2_FFU_AHB_RST__SHIFT)) & CIU2_CIU2_RST_SW2_CIU2_FFU_AHB_RST__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW2_CIU2_FFU_SLP_RST__MASK (0x20000U)\r\n#define CIU2_CIU2_RST_SW2_CIU2_FFU_SLP_RST__SHIFT (17U)\r\n/*! CIU2_FFU_SLP_RST_ - Soft Reset to FFU Sleep Clock Domain Logic */\r\n#define CIU2_CIU2_RST_SW2_CIU2_FFU_SLP_RST_(x)   (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW2_CIU2_FFU_SLP_RST__SHIFT)) & CIU2_CIU2_RST_SW2_CIU2_FFU_SLP_RST__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW2_ABH2_SUB_G2BIST_RSTB_MASK (0x40000U)\r\n#define CIU2_CIU2_RST_SW2_ABH2_SUB_G2BIST_RSTB_SHIFT (18U)\r\n/*! ABH2_SUB_G2BIST_RSTB - SW reset for ble abh2-system g2bist controller */\r\n#define CIU2_CIU2_RST_SW2_ABH2_SUB_G2BIST_RSTB(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW2_ABH2_SUB_G2BIST_RSTB_SHIFT)) & CIU2_CIU2_RST_SW2_ABH2_SUB_G2BIST_RSTB_MASK)\r\n\r\n#define CIU2_CIU2_RST_SW2_BLE_AHB_RST__MASK      (0x80000U)\r\n#define CIU2_CIU2_RST_SW2_BLE_AHB_RST__SHIFT     (19U)\r\n/*! BLE_AHB_RST_ - SW reset for ble ahb arb/dec/ciu */\r\n#define CIU2_CIU2_RST_SW2_BLE_AHB_RST_(x)        (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW2_BLE_AHB_RST__SHIFT)) & CIU2_CIU2_RST_SW2_BLE_AHB_RST__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW2_CIU2_BTU_SLP_RST__MASK (0x100000U)\r\n#define CIU2_CIU2_RST_SW2_CIU2_BTU_SLP_RST__SHIFT (20U)\r\n/*! CIU2_BTU_SLP_RST_ - Soft Reset to BTU Sleep Clock Domain Logic */\r\n#define CIU2_CIU2_RST_SW2_CIU2_BTU_SLP_RST_(x)   (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW2_CIU2_BTU_SLP_RST__SHIFT)) & CIU2_CIU2_RST_SW2_CIU2_BTU_SLP_RST__MASK)\r\n\r\n#define CIU2_CIU2_RST_SW2_MCI_BLE_A2A_MHRESETN_MASK (0x200000U)\r\n#define CIU2_CIU2_RST_SW2_MCI_BLE_A2A_MHRESETN_SHIFT (21U)\r\n/*! MCI_BLE_A2A_MHRESETN - SW Reset for mci_wl_a2a_mhresetn */\r\n#define CIU2_CIU2_RST_SW2_MCI_BLE_A2A_MHRESETN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW2_MCI_BLE_A2A_MHRESETN_SHIFT)) & CIU2_CIU2_RST_SW2_MCI_BLE_A2A_MHRESETN_MASK)\r\n\r\n#define CIU2_CIU2_RST_SW2_CIU2_CFG_RST__MASK     (0x400000U)\r\n#define CIU2_CIU2_RST_SW2_CIU2_CFG_RST__SHIFT    (22U)\r\n/*! CIU2_CFG_RST_ - CIU config reset for IMU, RTU, CIU debug sync */\r\n#define CIU2_CIU2_RST_SW2_CIU2_CFG_RST_(x)       (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_RST_SW2_CIU2_CFG_RST__SHIFT)) & CIU2_CIU2_RST_SW2_CIU2_CFG_RST__MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_AHB2_TO_CLEAR - AHB2 timeout logic clear register */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_AHB2_TO_CLEAR_AHB2_TIMEOUT_CLEAR_MASK (0x100U)\r\n#define CIU2_CIU2_AHB2_TO_CLEAR_AHB2_TIMEOUT_CLEAR_SHIFT (8U)\r\n/*! AHB2_TIMEOUT_CLEAR - After the timeout happened on AHB2 bus, the cpu will read the ERR ISR and\r\n *    read the bus state which cause the timeout and then set this bit to 1 to clear the AHB2 timeout\r\n *    logic to start recording next transaction. This is self clearing bit\r\n */\r\n#define CIU2_CIU2_AHB2_TO_CLEAR_AHB2_TIMEOUT_CLEAR(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_AHB2_TO_CLEAR_AHB2_TIMEOUT_CLEAR_SHIFT)) & CIU2_CIU2_AHB2_TO_CLEAR_AHB2_TIMEOUT_CLEAR_MASK)\r\n\r\n#define CIU2_CIU2_AHB2_TO_CLEAR_CPU2_DCODE_INV_ADDR_CLR_MASK (0x200U)\r\n#define CIU2_CIU2_AHB2_TO_CLEAR_CPU2_DCODE_INV_ADDR_CLR_SHIFT (9U)\r\n/*! CPU2_DCODE_INV_ADDR_CLR - After the invalid address int happened on CPU2 dcode bus, the cpu2\r\n *    will read the ERR ISR and read the bus state which cause the timeout and then set this bit to 1\r\n *    to clear the CPU2 Dcode invalid addr logic to start recording next transaction. This is self\r\n *    clearing bit\r\n */\r\n#define CIU2_CIU2_AHB2_TO_CLEAR_CPU2_DCODE_INV_ADDR_CLR(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_AHB2_TO_CLEAR_CPU2_DCODE_INV_ADDR_CLR_SHIFT)) & CIU2_CIU2_AHB2_TO_CLEAR_CPU2_DCODE_INV_ADDR_CLR_MASK)\r\n\r\n#define CIU2_CIU2_AHB2_TO_CLEAR_CPU2_ICODE_INV_ADDR_CLR_MASK (0x400U)\r\n#define CIU2_CIU2_AHB2_TO_CLEAR_CPU2_ICODE_INV_ADDR_CLR_SHIFT (10U)\r\n/*! CPU2_ICODE_INV_ADDR_CLR - After the invalid address int happened on CPU2 icode bus, the cpu2\r\n *    will read the ERR ISR and read the bus state which cause the timeout and then set this bit to 1\r\n *    to clear the CPU2 Icode invalid addr logic to start recording next transaction. This is self\r\n *    clearing bit\r\n */\r\n#define CIU2_CIU2_AHB2_TO_CLEAR_CPU2_ICODE_INV_ADDR_CLR(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_AHB2_TO_CLEAR_CPU2_ICODE_INV_ADDR_CLR_SHIFT)) & CIU2_CIU2_AHB2_TO_CLEAR_CPU2_ICODE_INV_ADDR_CLR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CPU_DYN_CLK_CTRL - Dynamic CPU Clock Control */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CPU_DYN_CLK_CTRL_DYN_CPU2_CTRL_DIS_MASK (0x40000000U)\r\n#define CIU2_CIU2_CPU_DYN_CLK_CTRL_DYN_CPU2_CTRL_DIS_SHIFT (30U)\r\n/*! DYN_CPU2_CTRL_DIS - Disable Dynamic CPU2 Clock Control Feature */\r\n#define CIU2_CIU2_CPU_DYN_CLK_CTRL_DYN_CPU2_CTRL_DIS(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU_DYN_CLK_CTRL_DYN_CPU2_CTRL_DIS_SHIFT)) & CIU2_CIU2_CPU_DYN_CLK_CTRL_DYN_CPU2_CTRL_DIS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_DBG_STAT - CPU2 debug register */\r\n/*! @{ */\r\n\r\n#define CIU2_CPU2_DBG_STAT_CPU2_STATUS_MASK      (0xFFFFFFFFU)\r\n#define CIU2_CPU2_DBG_STAT_CPU2_STATUS_SHIFT     (0U)\r\n/*! CPU2_STATUS - cpu2 debug output */\r\n#define CIU2_CPU2_DBG_STAT_CPU2_STATUS(x)        (((uint32_t)(((uint32_t)(x)) << CIU2_CPU2_DBG_STAT_CPU2_STATUS_SHIFT)) & CIU2_CPU2_DBG_STAT_CPU2_STATUS_MASK)\r\n/*! @} */\r\n\r\n/*! @name BTSS_MBIST_STAT -  */\r\n/*! @{ */\r\n\r\n#define CIU2_BTSS_MBIST_STAT_BLESS_MBIST_FAIL_MASK (0x1FFU)\r\n#define CIU2_BTSS_MBIST_STAT_BLESS_MBIST_FAIL_SHIFT (0U)\r\n/*! BLESS_MBIST_FAIL - BIST Fail Indication from memories in BT Sub System */\r\n#define CIU2_BTSS_MBIST_STAT_BLESS_MBIST_FAIL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_BTSS_MBIST_STAT_BLESS_MBIST_FAIL_SHIFT)) & CIU2_BTSS_MBIST_STAT_BLESS_MBIST_FAIL_MASK)\r\n\r\n#define CIU2_BTSS_MBIST_STAT_BLESS_MBIST_READY_MASK (0x1FF0000U)\r\n#define CIU2_BTSS_MBIST_STAT_BLESS_MBIST_READY_SHIFT (16U)\r\n/*! BLESS_MBIST_READY - BIST Ready from memories in BT Sub System */\r\n#define CIU2_BTSS_MBIST_STAT_BLESS_MBIST_READY(x) (((uint32_t)(((uint32_t)(x)) << CIU2_BTSS_MBIST_STAT_BLESS_MBIST_READY_SHIFT)) & CIU2_BTSS_MBIST_STAT_BLESS_MBIST_READY_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_TEST_MODE - \" */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_TEST_MODE_BT_UART_MODE_MASK    (0x1U)\r\n#define CIU2_CIU2_TEST_MODE_BT_UART_MODE_SHIFT   (0U)\r\n/*! BT_UART_MODE - Indicates UART Mode for I/O muxing */\r\n#define CIU2_CIU2_TEST_MODE_BT_UART_MODE(x)      (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_TEST_MODE_BT_UART_MODE_SHIFT)) & CIU2_CIU2_TEST_MODE_BT_UART_MODE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_APU_BYPASS2 - CIU2 APU Bypass Register 2 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_APU_BYPASS2_TBG_FFU_CLK_EN_BYPASS_SEL_MASK (0xC0000U)\r\n#define CIU2_CIU2_APU_BYPASS2_TBG_FFU_CLK_EN_BYPASS_SEL_SHIFT (18U)\r\n/*! TBG_FFU_CLK_EN_BYPASS_SEL - TBG FFU clock enable bypass select */\r\n#define CIU2_CIU2_APU_BYPASS2_TBG_FFU_CLK_EN_BYPASS_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_BYPASS2_TBG_FFU_CLK_EN_BYPASS_SEL_SHIFT)) & CIU2_CIU2_APU_BYPASS2_TBG_FFU_CLK_EN_BYPASS_SEL_MASK)\r\n\r\n#define CIU2_CIU2_APU_BYPASS2_TBG_FFU_CLK_EN_BYPASS_VAL_MASK (0x100000U)\r\n#define CIU2_CIU2_APU_BYPASS2_TBG_FFU_CLK_EN_BYPASS_VAL_SHIFT (20U)\r\n/*! TBG_FFU_CLK_EN_BYPASS_VAL - TBG FFU clock enable bypass value */\r\n#define CIU2_CIU2_APU_BYPASS2_TBG_FFU_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_APU_BYPASS2_TBG_FFU_CLK_EN_BYPASS_VAL_SHIFT)) & CIU2_CIU2_APU_BYPASS2_TBG_FFU_CLK_EN_BYPASS_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_TST_G2BIST_STATUS - WL G2BIST Status */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_TST_G2BIST_STATUS_AHB2_G2B_STATUS_MASK (0xFU)\r\n#define CIU2_CIU2_TST_G2BIST_STATUS_AHB2_G2B_STATUS_SHIFT (0U)\r\n/*! AHB2_G2B_STATUS - Redundant Bist Selection */\r\n#define CIU2_CIU2_TST_G2BIST_STATUS_AHB2_G2B_STATUS(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_TST_G2BIST_STATUS_AHB2_G2B_STATUS_SHIFT)) & CIU2_CIU2_TST_G2BIST_STATUS_AHB2_G2B_STATUS_MASK)\r\n\r\n#define CIU2_CIU2_TST_G2BIST_STATUS_AHB2_G2B_FINIH_MASK (0x100U)\r\n#define CIU2_CIU2_TST_G2BIST_STATUS_AHB2_G2B_FINIH_SHIFT (8U)\r\n/*! AHB2_G2B_FINIH - AHB2 Bist Done */\r\n#define CIU2_CIU2_TST_G2BIST_STATUS_AHB2_G2B_FINIH(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_TST_G2BIST_STATUS_AHB2_G2B_FINIH_SHIFT)) & CIU2_CIU2_TST_G2BIST_STATUS_AHB2_G2B_FINIH_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_LPO_CLK_GEN_CTRL - BLE LPO CLK GEN Control */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_AUTO_DEJIT_MASK (0x1U)\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_AUTO_DEJIT_SHIFT (0U)\r\n/*! AUTO_DEJIT - Enable Auto Dejitter */\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_AUTO_DEJIT(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_LPO_CLK_GEN_CTRL_AUTO_DEJIT_SHIFT)) & CIU2_CIU2_LPO_CLK_GEN_CTRL_AUTO_DEJIT_MASK)\r\n\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_DEJIT_EN_MASK (0x2U)\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_DEJIT_EN_SHIFT (1U)\r\n/*! DEJIT_EN - Enable De-jitter block */\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_DEJIT_EN(x)   (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_LPO_CLK_GEN_CTRL_DEJIT_EN_SHIFT)) & CIU2_CIU2_LPO_CLK_GEN_CTRL_DEJIT_EN_MASK)\r\n\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_MAN_SEL_NCO_MASK (0x4U)\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_MAN_SEL_NCO_SHIFT (2U)\r\n/*! MAN_SEL_NCO - Manually Switch back to NCO Version */\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_MAN_SEL_NCO(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_LPO_CLK_GEN_CTRL_MAN_SEL_NCO_SHIFT)) & CIU2_CIU2_LPO_CLK_GEN_CTRL_MAN_SEL_NCO_MASK)\r\n\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_SLP_CLK_NCO_EN_MASK (0x8U)\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_SLP_CLK_NCO_EN_SHIFT (3U)\r\n/*! SLP_CLK_NCO_EN - Enable NCO Counter in ble_lpoClk_gen */\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_SLP_CLK_NCO_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_LPO_CLK_GEN_CTRL_SLP_CLK_NCO_EN_SHIFT)) & CIU2_CIU2_LPO_CLK_GEN_CTRL_SLP_CLK_NCO_EN_MASK)\r\n\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_LBC_DEBUG_CTRL_MASK (0x30U)\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_LBC_DEBUG_CTRL_SHIFT (4U)\r\n/*! LBC_DEBUG_CTRL - LBC Debug Control Signal */\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_LBC_DEBUG_CTRL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_LPO_CLK_GEN_CTRL_LBC_DEBUG_CTRL_SHIFT)) & CIU2_CIU2_LPO_CLK_GEN_CTRL_LBC_DEBUG_CTRL_MASK)\r\n\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_SLP_CLK_RST__MASK (0x40U)\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_SLP_CLK_RST__SHIFT (6U)\r\n/*! SLP_CLK_RST_ - Soft Reset to LPO Clock Generator for NCO Sleep Clock Domain Logic */\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_SLP_CLK_RST_(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_LPO_CLK_GEN_CTRL_SLP_CLK_RST__SHIFT)) & CIU2_CIU2_LPO_CLK_GEN_CTRL_SLP_CLK_RST__MASK)\r\n\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_REF_4M_RST__MASK (0x80U)\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_REF_4M_RST__SHIFT (7U)\r\n/*! REF_4M_RST_ - Soft Reset to LPO Clock Generator for 4M Clock Domain Logic */\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_REF_4M_RST_(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_LPO_CLK_GEN_CTRL_REF_4M_RST__SHIFT)) & CIU2_CIU2_LPO_CLK_GEN_CTRL_REF_4M_RST__MASK)\r\n\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_LPO_CLK_SEL_MASK (0x300U)\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_LPO_CLK_SEL_SHIFT (8U)\r\n/*! LPO_CLK_SEL - Selects the source of 4 MHz clock input to BLE LPO Clock Generator */\r\n#define CIU2_CIU2_LPO_CLK_GEN_CTRL_LPO_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_LPO_CLK_GEN_CTRL_LPO_CLK_SEL_SHIFT)) & CIU2_CIU2_LPO_CLK_GEN_CTRL_LPO_CLK_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_LPO_CLK_GEN_STATUS - BLE LPO CLK GEN Status */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_LPO_CLK_GEN_STATUS_LPO_CLK_3K2_CNT_MASK (0x1FU)\r\n#define CIU2_CIU2_LPO_CLK_GEN_STATUS_LPO_CLK_3K2_CNT_SHIFT (0U)\r\n/*! LPO_CLK_3K2_CNT - \" */\r\n#define CIU2_CIU2_LPO_CLK_GEN_STATUS_LPO_CLK_3K2_CNT(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_LPO_CLK_GEN_STATUS_LPO_CLK_3K2_CNT_SHIFT)) & CIU2_CIU2_LPO_CLK_GEN_STATUS_LPO_CLK_3K2_CNT_MASK)\r\n\r\n#define CIU2_CIU2_LPO_CLK_GEN_STATUS_LPO_CLK_SEL_FSM_MASK (0x100U)\r\n#define CIU2_CIU2_LPO_CLK_GEN_STATUS_LPO_CLK_SEL_FSM_SHIFT (8U)\r\n/*! LPO_CLK_SEL_FSM - \" */\r\n#define CIU2_CIU2_LPO_CLK_GEN_STATUS_LPO_CLK_SEL_FSM(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_LPO_CLK_GEN_STATUS_LPO_CLK_SEL_FSM_SHIFT)) & CIU2_CIU2_LPO_CLK_GEN_STATUS_LPO_CLK_SEL_FSM_MASK)\r\n\r\n#define CIU2_CIU2_LPO_CLK_GEN_STATUS_REF_LPO_RAMP_DN_MASK (0x200U)\r\n#define CIU2_CIU2_LPO_CLK_GEN_STATUS_REF_LPO_RAMP_DN_SHIFT (9U)\r\n/*! REF_LPO_RAMP_DN - \" */\r\n#define CIU2_CIU2_LPO_CLK_GEN_STATUS_REF_LPO_RAMP_DN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_LPO_CLK_GEN_STATUS_REF_LPO_RAMP_DN_SHIFT)) & CIU2_CIU2_LPO_CLK_GEN_STATUS_REF_LPO_RAMP_DN_MASK)\r\n\r\n#define CIU2_CIU2_LPO_CLK_GEN_STATUS_REF_LPO_CLK_GOOD_MASK (0x400U)\r\n#define CIU2_CIU2_LPO_CLK_GEN_STATUS_REF_LPO_CLK_GOOD_SHIFT (10U)\r\n/*! REF_LPO_CLK_GOOD - \" */\r\n#define CIU2_CIU2_LPO_CLK_GEN_STATUS_REF_LPO_CLK_GOOD(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_LPO_CLK_GEN_STATUS_REF_LPO_CLK_GOOD_SHIFT)) & CIU2_CIU2_LPO_CLK_GEN_STATUS_REF_LPO_CLK_GOOD_MASK)\r\n\r\n#define CIU2_CIU2_LPO_CLK_GEN_STATUS_NCO_LPO_RAMP_DN_LV_MASK (0x800U)\r\n#define CIU2_CIU2_LPO_CLK_GEN_STATUS_NCO_LPO_RAMP_DN_LV_SHIFT (11U)\r\n/*! NCO_LPO_RAMP_DN_LV - \" */\r\n#define CIU2_CIU2_LPO_CLK_GEN_STATUS_NCO_LPO_RAMP_DN_LV(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_LPO_CLK_GEN_STATUS_NCO_LPO_RAMP_DN_LV_SHIFT)) & CIU2_CIU2_LPO_CLK_GEN_STATUS_NCO_LPO_RAMP_DN_LV_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_LPO_SLP_CLK_GEN_CTRL - \" */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_LPO_SLP_CLK_GEN_CTRL_SLP_CLK_NCO_STEP_MASK (0xFFFFFFFFU)\r\n#define CIU2_CIU2_LPO_SLP_CLK_GEN_CTRL_SLP_CLK_NCO_STEP_SHIFT (0U)\r\n/*! SLP_CLK_NCO_STEP - \" */\r\n#define CIU2_CIU2_LPO_SLP_CLK_GEN_CTRL_SLP_CLK_NCO_STEP(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_LPO_SLP_CLK_GEN_CTRL_SLP_CLK_NCO_STEP_SHIFT)) & CIU2_CIU2_LPO_SLP_CLK_GEN_CTRL_SLP_CLK_NCO_STEP_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPU2_INT_CTRL - \" */\r\n/*! @{ */\r\n\r\n#define CIU2_CPU2_INT_CTRL_CPU2_CPU3_GP_INT_MASK (0xFU)\r\n#define CIU2_CPU2_INT_CTRL_CPU2_CPU3_GP_INT_SHIFT (0U)\r\n/*! CPU2_CPU3_GP_INT - General Purpose Interrupt in Secure Region */\r\n#define CIU2_CPU2_INT_CTRL_CPU2_CPU3_GP_INT(x)   (((uint32_t)(((uint32_t)(x)) << CIU2_CPU2_INT_CTRL_CPU2_CPU3_GP_INT_SHIFT)) & CIU2_CPU2_INT_CTRL_CPU2_CPU3_GP_INT_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_BRF_EXTRA_PORT_STATUS - \" */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_BRF_EXTRA_PORT_STATUS_BRF_CIU2_EXTRA_STATUS_MASK (0x3U)\r\n#define CIU2_CIU2_BRF_EXTRA_PORT_STATUS_BRF_CIU2_EXTRA_STATUS_SHIFT (0U)\r\n/*! BRF_CIU2_EXTRA_STATUS - [1:0] of BRF_SOC_EXTRA output of BRF are made available as status register bits. */\r\n#define CIU2_CIU2_BRF_EXTRA_PORT_STATUS_BRF_CIU2_EXTRA_STATUS(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BRF_EXTRA_PORT_STATUS_BRF_CIU2_EXTRA_STATUS_SHIFT)) & CIU2_CIU2_BRF_EXTRA_PORT_STATUS_BRF_CIU2_EXTRA_STATUS_MASK)\r\n\r\n#define CIU2_CIU2_BRF_EXTRA_PORT_STATUS_BRF_ERR_FLAG_MASK (0x100U)\r\n#define CIU2_CIU2_BRF_EXTRA_PORT_STATUS_BRF_ERR_FLAG_SHIFT (8U)\r\n/*! BRF_ERR_FLAG - Error Flag Output from BRF is reported here. */\r\n#define CIU2_CIU2_BRF_EXTRA_PORT_STATUS_BRF_ERR_FLAG(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_BRF_EXTRA_PORT_STATUS_BRF_ERR_FLAG_SHIFT)) & CIU2_CIU2_BRF_EXTRA_PORT_STATUS_BRF_ERR_FLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_DEBUG - \" */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_DEBUG_P2C_UART_SIN_MASK        (0x1U)\r\n#define CIU2_CIU2_DEBUG_P2C_UART_SIN_SHIFT       (0U)\r\n/*! P2C_UART_SIN - Status of UART SIN (p2c_uart_sin) net is captured here. */\r\n#define CIU2_CIU2_DEBUG_P2C_UART_SIN(x)          (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_DEBUG_P2C_UART_SIN_SHIFT)) & CIU2_CIU2_DEBUG_P2C_UART_SIN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_MCI_EXTRA - MCI EXTRA Ports */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_MCI_EXTRA_CIU2_MCI_EXTRA_OUT_MASK (0xFU)\r\n#define CIU2_CIU2_MCI_EXTRA_CIU2_MCI_EXTRA_OUT_SHIFT (0U)\r\n/*! CIU2_MCI_EXTRA_OUT - Extra Ports to MCI */\r\n#define CIU2_CIU2_MCI_EXTRA_CIU2_MCI_EXTRA_OUT(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MCI_EXTRA_CIU2_MCI_EXTRA_OUT_SHIFT)) & CIU2_CIU2_MCI_EXTRA_CIU2_MCI_EXTRA_OUT_MASK)\r\n\r\n#define CIU2_CIU2_MCI_EXTRA_CIU2_MCI_EXTRA_IN_MASK (0xF0U)\r\n#define CIU2_CIU2_MCI_EXTRA_CIU2_MCI_EXTRA_IN_SHIFT (4U)\r\n/*! CIU2_MCI_EXTRA_IN - Extra Ports from MCI */\r\n#define CIU2_CIU2_MCI_EXTRA_CIU2_MCI_EXTRA_IN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_MCI_EXTRA_CIU2_MCI_EXTRA_IN_SHIFT)) & CIU2_CIU2_MCI_EXTRA_CIU2_MCI_EXTRA_IN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_TSTBUS_SEL - Test Bus Select */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_TSTBUS_SEL_AHB2_TSTBUS_SEL_MASK (0x1U)\r\n#define CIU2_CIU2_TSTBUS_SEL_AHB2_TSTBUS_SEL_SHIFT (0U)\r\n/*! AHB2_TSTBUS_SEL - Select between 2 groups of signals; The output of the mux is driven to BLE\r\n *    Test Mux Logic so that it can be observed on GPIOs.\r\n */\r\n#define CIU2_CIU2_TSTBUS_SEL_AHB2_TSTBUS_SEL(x)  (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_TSTBUS_SEL_AHB2_TSTBUS_SEL_SHIFT)) & CIU2_CIU2_TSTBUS_SEL_AHB2_TSTBUS_SEL_MASK)\r\n\r\n#define CIU2_CIU2_TSTBUS_SEL_SMU2_TSTBUS_SEL_MASK (0x10U)\r\n#define CIU2_CIU2_TSTBUS_SEL_SMU2_TSTBUS_SEL_SHIFT (4U)\r\n/*! SMU2_TSTBUS_SEL - Selects between following 2 Test Buses in SMU2 */\r\n#define CIU2_CIU2_TSTBUS_SEL_SMU2_TSTBUS_SEL(x)  (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_TSTBUS_SEL_SMU2_TSTBUS_SEL_SHIFT)) & CIU2_CIU2_TSTBUS_SEL_SMU2_TSTBUS_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name FFU_CTRL - FFU Specific Control Register */\r\n/*! @{ */\r\n\r\n#define CIU2_FFU_CTRL_USE_TX_EN_EXTEND_MASK      (0x1U)\r\n#define CIU2_FFU_CTRL_USE_TX_EN_EXTEND_SHIFT     (0U)\r\n/*! USE_TX_EN_EXTEND - Selects tx_en_extend port of FFU & drives it on c2p_soc_zigbee_tx_en. */\r\n#define CIU2_FFU_CTRL_USE_TX_EN_EXTEND(x)        (((uint32_t)(((uint32_t)(x)) << CIU2_FFU_CTRL_USE_TX_EN_EXTEND_SHIFT)) & CIU2_FFU_CTRL_USE_TX_EN_EXTEND_MASK)\r\n/*! @} */\r\n\r\n/*! @name BLE_RAACS_CTRL - RAACS control registers */\r\n/*! @{ */\r\n\r\n#define CIU2_BLE_RAACS_CTRL_RAACS_EN_MASK        (0x1U)\r\n#define CIU2_BLE_RAACS_CTRL_RAACS_EN_SHIFT       (0U)\r\n/*! RAACS_EN - raacs en . S/W Write 1 to enable raacs block. */\r\n#define CIU2_BLE_RAACS_CTRL_RAACS_EN(x)          (((uint32_t)(((uint32_t)(x)) << CIU2_BLE_RAACS_CTRL_RAACS_EN_SHIFT)) & CIU2_BLE_RAACS_CTRL_RAACS_EN_MASK)\r\n\r\n#define CIU2_BLE_RAACS_CTRL_USE_RAACS_CLK_FOR_CPU_MASK (0x2U)\r\n#define CIU2_BLE_RAACS_CTRL_USE_RAACS_CLK_FOR_CPU_SHIFT (1U)\r\n/*! USE_RAACS_CLK_FOR_CPU - SW write 0 to use RAACS clock for CPU. SW write 1 to select clock gating\r\n *    based alternate implementation of RAACS clocking for CM3 CPU.\r\n */\r\n#define CIU2_BLE_RAACS_CTRL_USE_RAACS_CLK_FOR_CPU(x) (((uint32_t)(((uint32_t)(x)) << CIU2_BLE_RAACS_CTRL_USE_RAACS_CLK_FOR_CPU_SHIFT)) & CIU2_BLE_RAACS_CTRL_USE_RAACS_CLK_FOR_CPU_MASK)\r\n\r\n#define CIU2_BLE_RAACS_CTRL_RAACS_CLK_SEL_MASK   (0x1CU)\r\n#define CIU2_BLE_RAACS_CTRL_RAACS_CLK_SEL_SHIFT  (2U)\r\n/*! RAACS_CLK_SEL - defines the lowest clock to which RAACS will go down to during IDLE period (x/2;\r\n *    x/4; x/8; ... ;x/128) for the given test.\r\n */\r\n#define CIU2_BLE_RAACS_CTRL_RAACS_CLK_SEL(x)     (((uint32_t)(((uint32_t)(x)) << CIU2_BLE_RAACS_CTRL_RAACS_CLK_SEL_SHIFT)) & CIU2_BLE_RAACS_CTRL_RAACS_CLK_SEL_MASK)\r\n\r\n#define CIU2_BLE_RAACS_CTRL_RAACS_WAIT_COUNTER_VALUE_MASK (0x7FFE0U)\r\n#define CIU2_BLE_RAACS_CTRL_RAACS_WAIT_COUNTER_VALUE_SHIFT (5U)\r\n/*! RAACS_WAIT_COUNTER_VALUE - initial IDLE-time for which RAACS FSM waits before starting to scale down the clock. */\r\n#define CIU2_BLE_RAACS_CTRL_RAACS_WAIT_COUNTER_VALUE(x) (((uint32_t)(((uint32_t)(x)) << CIU2_BLE_RAACS_CTRL_RAACS_WAIT_COUNTER_VALUE_SHIFT)) & CIU2_BLE_RAACS_CTRL_RAACS_WAIT_COUNTER_VALUE_MASK)\r\n\r\n#define CIU2_BLE_RAACS_CTRL_RAACS_IDLE_COUNTER_VALUE_MASK (0xFFF80000U)\r\n#define CIU2_BLE_RAACS_CTRL_RAACS_IDLE_COUNTER_VALUE_SHIFT (19U)\r\n/*! RAACS_IDLE_COUNTER_VALUE - IDLE time for which RAACS-FSM waits before shifting to next successive scaled clock. */\r\n#define CIU2_BLE_RAACS_CTRL_RAACS_IDLE_COUNTER_VALUE(x) (((uint32_t)(((uint32_t)(x)) << CIU2_BLE_RAACS_CTRL_RAACS_IDLE_COUNTER_VALUE_SHIFT)) & CIU2_BLE_RAACS_CTRL_RAACS_IDLE_COUNTER_VALUE_MASK)\r\n/*! @} */\r\n\r\n/*! @name BLE_RAACS_PERFORMANCE_STATISTICS - RAACS performance statistics counter. */\r\n/*! @{ */\r\n\r\n#define CIU2_BLE_RAACS_PERFORMANCE_STATISTICS_PERFORMANCE_STATISTICS_CNT_EN_MASK (0x1U)\r\n#define CIU2_BLE_RAACS_PERFORMANCE_STATISTICS_PERFORMANCE_STATISTICS_CNT_EN_SHIFT (0U)\r\n/*! PERFORMANCE_STATISTICS_CNT_EN - performance counter en. S/W write 1 to enable performance counter. */\r\n#define CIU2_BLE_RAACS_PERFORMANCE_STATISTICS_PERFORMANCE_STATISTICS_CNT_EN(x) (((uint32_t)(((uint32_t)(x)) << CIU2_BLE_RAACS_PERFORMANCE_STATISTICS_PERFORMANCE_STATISTICS_CNT_EN_SHIFT)) & CIU2_BLE_RAACS_PERFORMANCE_STATISTICS_PERFORMANCE_STATISTICS_CNT_EN_MASK)\r\n\r\n#define CIU2_BLE_RAACS_PERFORMANCE_STATISTICS_RAACS_PERFORMANCE_STATISTICS_MASK (0xFFFFFFEU)\r\n#define CIU2_BLE_RAACS_PERFORMANCE_STATISTICS_RAACS_PERFORMANCE_STATISTICS_SHIFT (1U)\r\n/*! RAACS_PERFORMANCE_STATISTICS - This counter is maintaining RAACS performance count. This counter\r\n *    will increment by one after every 1 us(1MHZ) when RAACS is in scaled clk state.\r\n */\r\n#define CIU2_BLE_RAACS_PERFORMANCE_STATISTICS_RAACS_PERFORMANCE_STATISTICS(x) (((uint32_t)(((uint32_t)(x)) << CIU2_BLE_RAACS_PERFORMANCE_STATISTICS_RAACS_PERFORMANCE_STATISTICS_SHIFT)) & CIU2_BLE_RAACS_PERFORMANCE_STATISTICS_RAACS_PERFORMANCE_STATISTICS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CPU_CPU2_MSG_CTRL - CPU2 message register */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CPU_CPU2_MSG_CTRL_CPU2_TO_CPU3_MSG_RDY_MASK (0x1U)\r\n#define CIU2_CIU2_CPU_CPU2_MSG_CTRL_CPU2_TO_CPU3_MSG_RDY_SHIFT (0U)\r\n/*! CPU2_TO_CPU3_MSG_RDY - CPU2 Message for CPU3 is ready. This is self clearing bit. The CPU2\r\n *    writes 1 to indicate that message for CPU3is ready. This generates an Interrupt to CPU3 via APU.\r\n *    This is old scheme and we should use IMU based scheme.\r\n */\r\n#define CIU2_CIU2_CPU_CPU2_MSG_CTRL_CPU2_TO_CPU3_MSG_RDY(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU_CPU2_MSG_CTRL_CPU2_TO_CPU3_MSG_RDY_SHIFT)) & CIU2_CIU2_CPU_CPU2_MSG_CTRL_CPU2_TO_CPU3_MSG_RDY_MASK)\r\n\r\n#define CIU2_CIU2_CPU_CPU2_MSG_CTRL_CPU3_TO_CPU2_MSG_RDY_MASK (0x2U)\r\n#define CIU2_CIU2_CPU_CPU2_MSG_CTRL_CPU3_TO_CPU2_MSG_RDY_SHIFT (1U)\r\n/*! CPU3_TO_CPU2_MSG_RDY - CPU3 Message for CPU2 is ready. This is self clearing bit. The CPU3\r\n *    writes 1 to indicate that message for CPU2 is ready. This generates an Interrupt to CPU2 via APU.\r\n *    This is old scheme and we should use IMU based scheme.\r\n */\r\n#define CIU2_CIU2_CPU_CPU2_MSG_CTRL_CPU3_TO_CPU2_MSG_RDY(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU_CPU2_MSG_CTRL_CPU3_TO_CPU2_MSG_RDY_SHIFT)) & CIU2_CIU2_CPU_CPU2_MSG_CTRL_CPU3_TO_CPU2_MSG_RDY_MASK)\r\n\r\n#define CIU2_CIU2_CPU_CPU2_MSG_CTRL_CPU2_TO_CPU3_MSG_PROCESS_DONE_MASK (0x100U)\r\n#define CIU2_CIU2_CPU_CPU2_MSG_CTRL_CPU2_TO_CPU3_MSG_PROCESS_DONE_SHIFT (8U)\r\n/*! CPU2_TO_CPU3_MSG_PROCESS_DONE - CPU2 Message for CPU3 has been read by CPU3 and executed. This\r\n *    is self clearing bit. The CPU3 writes 1 to indicate that message send by CPU2 is executed. This\r\n *    generates an Interrupt to CPU2 via CIU1.\r\n */\r\n#define CIU2_CIU2_CPU_CPU2_MSG_CTRL_CPU2_TO_CPU3_MSG_PROCESS_DONE(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU_CPU2_MSG_CTRL_CPU2_TO_CPU3_MSG_PROCESS_DONE_SHIFT)) & CIU2_CIU2_CPU_CPU2_MSG_CTRL_CPU2_TO_CPU3_MSG_PROCESS_DONE_MASK)\r\n\r\n#define CIU2_CIU2_CPU_CPU2_MSG_CTRL_CPU3_TO_CPU2_MSG_PROCESS_DONE_MASK (0x200U)\r\n#define CIU2_CIU2_CPU_CPU2_MSG_CTRL_CPU3_TO_CPU2_MSG_PROCESS_DONE_SHIFT (9U)\r\n/*! CPU3_TO_CPU2_MSG_PROCESS_DONE - CPU3 Message for CPU2 has been read by CPU2 and executed. This\r\n *    is self clearing bit. The CPU2 writes 1 to indicate that message send by CPU3 is executed. This\r\n *    generates an Interrupt to CPU3 via CIU1.\r\n */\r\n#define CIU2_CIU2_CPU_CPU2_MSG_CTRL_CPU3_TO_CPU2_MSG_PROCESS_DONE(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU_CPU2_MSG_CTRL_CPU3_TO_CPU2_MSG_PROCESS_DONE_SHIFT)) & CIU2_CIU2_CPU_CPU2_MSG_CTRL_CPU3_TO_CPU2_MSG_PROCESS_DONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_IMU_CPU3_WR_MSG_TO_CPU2 - CPU3 write message to CPU2 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_IMU_CPU3_WR_MSG_TO_CPU2_CPU3_WR_MSG_CPU2_MASK (0xFFFFFFFFU)\r\n#define CIU2_CIU2_IMU_CPU3_WR_MSG_TO_CPU2_CPU3_WR_MSG_CPU2_SHIFT (0U)\r\n/*! CPU3_WR_MSG_CPU2 - Write CPU3 message data to CPU2 (push to FIFO) */\r\n#define CIU2_CIU2_IMU_CPU3_WR_MSG_TO_CPU2_CPU3_WR_MSG_CPU2(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU3_WR_MSG_TO_CPU2_CPU3_WR_MSG_CPU2_SHIFT)) & CIU2_CIU2_IMU_CPU3_WR_MSG_TO_CPU2_CPU3_WR_MSG_CPU2_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_IMU_CPU3_RD_MSG_FROM_CPU2 - CPU3 read message from CPU2 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_IMU_CPU3_RD_MSG_FROM_CPU2_CPU3_RD_MSG_CPU2_MASK (0xFFFFFFFFU)\r\n#define CIU2_CIU2_IMU_CPU3_RD_MSG_FROM_CPU2_CPU3_RD_MSG_CPU2_SHIFT (0U)\r\n/*! CPU3_RD_MSG_CPU2 - CPU3 read message data from CPU2 (pop from FIFO) */\r\n#define CIU2_CIU2_IMU_CPU3_RD_MSG_FROM_CPU2_CPU3_RD_MSG_CPU2(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU3_RD_MSG_FROM_CPU2_CPU3_RD_MSG_CPU2_SHIFT)) & CIU2_CIU2_IMU_CPU3_RD_MSG_FROM_CPU2_CPU3_RD_MSG_CPU2_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS - CPU3 to CPU2 message FIFO status */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_LOCKED_MASK (0x1U)\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_LOCKED_SHIFT (0U)\r\n/*! CPU3_TO_CPU2_MSG_FIFO_LOCKED - cpu3_to_cpu2_msg_fifo_locked */\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_LOCKED(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_LOCKED_SHIFT)) & CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_LOCKED_MASK)\r\n\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_ALMOST_FULL_MASK (0x2U)\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_ALMOST_FULL_SHIFT (1U)\r\n/*! CPU3_TO_CPU2_MSG_FIFO_ALMOST_FULL - cpu3_to_cpu2_msg_fifo_almost_full (based upon FIFO watermark) */\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_ALMOST_FULL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_ALMOST_FULL_SHIFT)) & CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_ALMOST_FULL_MASK)\r\n\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_FULL_MASK (0x4U)\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_FULL_SHIFT (2U)\r\n/*! CPU3_TO_CPU2_MSG_FIFO_FULL - cpu3_to_cpu2_msg_fifo_full (based upon FIFO depth) */\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_FULL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_FULL_SHIFT)) & CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_FULL_MASK)\r\n\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_EMPTY_MASK (0x8U)\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_EMPTY_SHIFT (3U)\r\n/*! CPU3_TO_CPU2_MSG_FIFO_EMPTY - cpu3_to_cpu2_msg_fifo_empty */\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_EMPTY(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_EMPTY_SHIFT)) & CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_EMPTY_MASK)\r\n\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_COUNT_MASK (0x1F0U)\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_COUNT_SHIFT (4U)\r\n/*! CPU3_TO_CPU2_MSG_COUNT - cpu3_to_cpu2_msg_count */\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_COUNT(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_COUNT_SHIFT)) & CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_COUNT_MASK)\r\n\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_WR_PTR_MASK (0xF0000U)\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_WR_PTR_SHIFT (16U)\r\n/*! CPU3_TO_CPU2_MSG_FIFO_WR_PTR - cpu3 to cpu2 msg fifo write pointer for debug */\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_WR_PTR(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_WR_PTR_SHIFT)) & CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_WR_PTR_MASK)\r\n\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_RD_PTR_MASK (0xF00000U)\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_RD_PTR_SHIFT (20U)\r\n/*! CPU3_TO_CPU2_MSG_FIFO_RD_PTR - cpu3 to cpu2 msg fifo read pointer for debug */\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_RD_PTR(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_RD_PTR_SHIFT)) & CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_STATUS_CPU3_TO_CPU2_MSG_FIFO_RD_PTR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL - CPU3 to CPU2 message FIFO control */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_MSG_RDY_INT_CLR_MASK (0x1U)\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_MSG_RDY_INT_CLR_SHIFT (0U)\r\n/*! CPU3_MSG_RDY_INT_CLR - Writing 1 to this bit will clear message ready interrupt to CPU3 (self clear bit) */\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_MSG_RDY_INT_CLR(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_MSG_RDY_INT_CLR_SHIFT)) & CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_MSG_RDY_INT_CLR_MASK)\r\n\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_MSG_SP_AV_INT_CLR_MASK (0x100U)\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_MSG_SP_AV_INT_CLR_SHIFT (8U)\r\n/*! CPU3_MSG_SP_AV_INT_CLR - Writing 1 to this bit will clear message space available interrupt to CPU3 (self clear bit) */\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_MSG_SP_AV_INT_CLR(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_MSG_SP_AV_INT_CLR_SHIFT)) & CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_MSG_SP_AV_INT_CLR_MASK)\r\n\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_TO_CPU2_MSG_FIFO_FLUSH_MASK (0x10000U)\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_TO_CPU2_MSG_FIFO_FLUSH_SHIFT (16U)\r\n/*! CPU3_TO_CPU2_MSG_FIFO_FLUSH - Writing 1 to this bit will flush cpu3_to_cpu2 message fifo */\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_TO_CPU2_MSG_FIFO_FLUSH(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_TO_CPU2_MSG_FIFO_FLUSH_SHIFT)) & CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_TO_CPU2_MSG_FIFO_FLUSH_MASK)\r\n\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_WAIT_FOR_ACK_MASK (0x20000U)\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_WAIT_FOR_ACK_SHIFT (17U)\r\n/*! CPU3_WAIT_FOR_ACK - CPU3 wait for Acknowledgment */\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_WAIT_FOR_ACK(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_WAIT_FOR_ACK_SHIFT)) & CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_WAIT_FOR_ACK_MASK)\r\n\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_CPU2_MSG_FIFO_FULL_WATERMARK_MASK (0xF00000U)\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_CPU2_MSG_FIFO_FULL_WATERMARK_SHIFT (20U)\r\n/*! CPU3_CPU2_MSG_FIFO_FULL_WATERMARK - cpu3_to_cpu2 message fifo full watermark (space avail intr based upon it) */\r\n#define CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_CPU2_MSG_FIFO_FULL_WATERMARK(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_CPU2_MSG_FIFO_FULL_WATERMARK_SHIFT)) & CIU2_CIU2_IMU_CPU3_CPU2_MSG_FIFO_CNTL_CPU3_CPU2_MSG_FIFO_FULL_WATERMARK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_IMU_CPU2_RD_MSG_FROM_CPU3_VAL_DBG - CPU2 last message read (from cpu3) */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_IMU_CPU2_RD_MSG_FROM_CPU3_VAL_DBG_CPU2_RD_MSG_MASK (0xFFFFFFFFU)\r\n#define CIU2_CIU2_IMU_CPU2_RD_MSG_FROM_CPU3_VAL_DBG_CPU2_RD_MSG_SHIFT (0U)\r\n/*! CPU2_RD_MSG - CPU2 last message read (from cpu3) */\r\n#define CIU2_CIU2_IMU_CPU2_RD_MSG_FROM_CPU3_VAL_DBG_CPU2_RD_MSG(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU2_RD_MSG_FROM_CPU3_VAL_DBG_CPU2_RD_MSG_SHIFT)) & CIU2_CIU2_IMU_CPU2_RD_MSG_FROM_CPU3_VAL_DBG_CPU2_RD_MSG_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_IMU_CPU2_WR_MSG_TO_CPU3 - CPU2 write message to CPU3 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_IMU_CPU2_WR_MSG_TO_CPU3_CPU2_WR_MSG_CPU3_MASK (0xFFFFFFFFU)\r\n#define CIU2_CIU2_IMU_CPU2_WR_MSG_TO_CPU3_CPU2_WR_MSG_CPU3_SHIFT (0U)\r\n/*! CPU2_WR_MSG_CPU3 - Write CPU2 message data to CPU3 (push to FIFO) */\r\n#define CIU2_CIU2_IMU_CPU2_WR_MSG_TO_CPU3_CPU2_WR_MSG_CPU3(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU2_WR_MSG_TO_CPU3_CPU2_WR_MSG_CPU3_SHIFT)) & CIU2_CIU2_IMU_CPU2_WR_MSG_TO_CPU3_CPU2_WR_MSG_CPU3_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_IMU_CPU2_RD_MSG_FROM_CPU3 - CPU2 read message from CPU3 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_IMU_CPU2_RD_MSG_FROM_CPU3_CPU2_RD_MSG_CPU3_MASK (0xFFFFFFFFU)\r\n#define CIU2_CIU2_IMU_CPU2_RD_MSG_FROM_CPU3_CPU2_RD_MSG_CPU3_SHIFT (0U)\r\n/*! CPU2_RD_MSG_CPU3 - CPU2 read message data from CPU3 (pop from FIFO) */\r\n#define CIU2_CIU2_IMU_CPU2_RD_MSG_FROM_CPU3_CPU2_RD_MSG_CPU3(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU2_RD_MSG_FROM_CPU3_CPU2_RD_MSG_CPU3_SHIFT)) & CIU2_CIU2_IMU_CPU2_RD_MSG_FROM_CPU3_CPU2_RD_MSG_CPU3_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS - CPU2 to CPU3 message FIFO status */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_LOCKED_MASK (0x1U)\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_LOCKED_SHIFT (0U)\r\n/*! CPU2_TO_CPU3_MSG_FIFO_LOCKED - cpu2_to_cpu3_msg_fifo_locked */\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_LOCKED(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_LOCKED_SHIFT)) & CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_LOCKED_MASK)\r\n\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_ALMOST_FULL_MASK (0x2U)\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_ALMOST_FULL_SHIFT (1U)\r\n/*! CPU2_TO_CPU3_MSG_FIFO_ALMOST_FULL - cpu2_to_cpu3_msg_fifo_almost_full (based upon FIFO watermark) */\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_ALMOST_FULL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_ALMOST_FULL_SHIFT)) & CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_ALMOST_FULL_MASK)\r\n\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_FULL_MASK (0x4U)\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_FULL_SHIFT (2U)\r\n/*! CPU2_TO_CPU3_MSG_FIFO_FULL - cpu2_to_cpu3_msg_fifo_full (based upon FIFO depth) */\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_FULL(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_FULL_SHIFT)) & CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_FULL_MASK)\r\n\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_EMPTY_MASK (0x8U)\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_EMPTY_SHIFT (3U)\r\n/*! CPU2_TO_CPU3_MSG_FIFO_EMPTY - cpu2_to_cpu3_msg_fifo_empty */\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_EMPTY(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_EMPTY_SHIFT)) & CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_EMPTY_MASK)\r\n\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_COUNT_MASK (0x1F0U)\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_COUNT_SHIFT (4U)\r\n/*! CPU2_TO_CPU3_MSG_COUNT - cpu2_to_cpu3_msg_count */\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_COUNT(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_COUNT_SHIFT)) & CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_COUNT_MASK)\r\n\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_WR_PTR_MASK (0xF0000U)\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_WR_PTR_SHIFT (16U)\r\n/*! CPU2_TO_CPU3_MSG_FIFO_WR_PTR - cpu3 to cpu2 msg fifo write pointer for debug */\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_WR_PTR(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_WR_PTR_SHIFT)) & CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_WR_PTR_MASK)\r\n\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_RD_PTR_MASK (0xF00000U)\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_RD_PTR_SHIFT (20U)\r\n/*! CPU2_TO_CPU3_MSG_FIFO_RD_PTR - cpu3 to cpu2 msg fifo read pointer for debug */\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_RD_PTR(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_RD_PTR_SHIFT)) & CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_STATUS_CPU2_TO_CPU3_MSG_FIFO_RD_PTR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL - CPU2 to CPU3 message FIFO control */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_MSG_RDY_INT_CLR_MASK (0x1U)\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_MSG_RDY_INT_CLR_SHIFT (0U)\r\n/*! CPU2_MSG_RDY_INT_CLR - Writing 1 to this bit will clear message ready interrupt to CPU2 (self clear bit) */\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_MSG_RDY_INT_CLR(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_MSG_RDY_INT_CLR_SHIFT)) & CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_MSG_RDY_INT_CLR_MASK)\r\n\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_MSG_SP_AV_INT_CLR_MASK (0x100U)\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_MSG_SP_AV_INT_CLR_SHIFT (8U)\r\n/*! CPU2_MSG_SP_AV_INT_CLR - Writing 1 to this bit will clear message space available interrupt to CPU2 (self clear bit) */\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_MSG_SP_AV_INT_CLR(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_MSG_SP_AV_INT_CLR_SHIFT)) & CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_MSG_SP_AV_INT_CLR_MASK)\r\n\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_TO_CPU3_MSG_FIFO_FLUSH_MASK (0x10000U)\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_TO_CPU3_MSG_FIFO_FLUSH_SHIFT (16U)\r\n/*! CPU2_TO_CPU3_MSG_FIFO_FLUSH - Writing 1 to this bit will flush cpu2_to_cpu3 message fifo */\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_TO_CPU3_MSG_FIFO_FLUSH(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_TO_CPU3_MSG_FIFO_FLUSH_SHIFT)) & CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_TO_CPU3_MSG_FIFO_FLUSH_MASK)\r\n\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_WAIT_FOR_ACK_MASK (0x20000U)\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_WAIT_FOR_ACK_SHIFT (17U)\r\n/*! CPU2_WAIT_FOR_ACK - CPU2 wait for Acknowledgment */\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_WAIT_FOR_ACK(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_WAIT_FOR_ACK_SHIFT)) & CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_WAIT_FOR_ACK_MASK)\r\n\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_CPU3_MSG_FIFO_FULL_WATERMARK_MASK (0xF00000U)\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_CPU3_MSG_FIFO_FULL_WATERMARK_SHIFT (20U)\r\n/*! CPU2_CPU3_MSG_FIFO_FULL_WATERMARK - cpu2_to_cpu3 message fifo full watermark (space avail intr based upon it) */\r\n#define CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_CPU3_MSG_FIFO_FULL_WATERMARK(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_CPU3_MSG_FIFO_FULL_WATERMARK_SHIFT)) & CIU2_CIU2_IMU_CPU2_CPU3_MSG_FIFO_CNTL_CPU2_CPU3_MSG_FIFO_FULL_WATERMARK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_IMU_CPU3_RD_MSG_FROM_CPU2_VAL_DBG - CPU3 last message read (from cpu2) */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_IMU_CPU3_RD_MSG_FROM_CPU2_VAL_DBG_CPU3_RD_MSG_MASK (0xFFFFFFFFU)\r\n#define CIU2_CIU2_IMU_CPU3_RD_MSG_FROM_CPU2_VAL_DBG_CPU3_RD_MSG_SHIFT (0U)\r\n/*! CPU3_RD_MSG - CPU3 last message read (from cpu2) */\r\n#define CIU2_CIU2_IMU_CPU3_RD_MSG_FROM_CPU2_VAL_DBG_CPU3_RD_MSG(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_CPU3_RD_MSG_FROM_CPU2_VAL_DBG_CPU3_RD_MSG_SHIFT)) & CIU2_CIU2_IMU_CPU3_RD_MSG_FROM_CPU2_VAL_DBG_CPU3_RD_MSG_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CPU3_WAKEUP_CTRL - CIU2 register to wakeup CPU3 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CPU3_WAKEUP_CTRL_CPU3_WAKE_UP_MASK (0x1U)\r\n#define CIU2_CIU2_CPU3_WAKEUP_CTRL_CPU3_WAKE_UP_SHIFT (0U)\r\n/*! CPU3_WAKE_UP - CPU3 Wakeup Control Register. S/W Write 1 to generate a wake up interrupt to\r\n *    CPU3.Clear by S/W once mci_wl_wakeup_done[1] interrupt is received from CPU3.\r\n */\r\n#define CIU2_CIU2_CPU3_WAKEUP_CTRL_CPU3_WAKE_UP(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU3_WAKEUP_CTRL_CPU3_WAKE_UP_SHIFT)) & CIU2_CIU2_CPU3_WAKEUP_CTRL_CPU3_WAKE_UP_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CPU2_WAKEUP_DONE - Wakeup done Control Register to CPU3 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CPU2_WAKEUP_DONE_CPU2_WAKEUP_DONE_MASK (0xFFU)\r\n#define CIU2_CIU2_CPU2_WAKEUP_DONE_CPU2_WAKEUP_DONE_SHIFT (0U)\r\n/*! CPU2_WAKEUP_DONE - CPU2 Wakeup is done . This bit is set to 1 by S/W when CPU3 wakesup CPU2.This\r\n *    is self clearing bit. This generates an interrupt to CPU3 via wl_mci_wakeup_done[7:0] signal.\r\n */\r\n#define CIU2_CIU2_CPU2_WAKEUP_DONE_CPU2_WAKEUP_DONE(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU2_WAKEUP_DONE_CPU2_WAKEUP_DONE_SHIFT)) & CIU2_CIU2_CPU2_WAKEUP_DONE_CPU2_WAKEUP_DONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_CPU3_NS_GP_INT - Non Secure region GP interrupt to CPU3 */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_CPU3_NS_GP_INT_CPU2_CPU3_GP_NS_INT_MASK (0x3U)\r\n#define CIU2_CIU2_CPU3_NS_GP_INT_CPU2_CPU3_GP_NS_INT_SHIFT (0U)\r\n/*! CPU2_CPU3_GP_NS_INT - General Purpose interrupt to CPU3 from non secure registers */\r\n#define CIU2_CIU2_CPU3_NS_GP_INT_CPU2_CPU3_GP_NS_INT(x) (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_CPU3_NS_GP_INT_CPU2_CPU3_GP_NS_INT_SHIFT)) & CIU2_CIU2_CPU3_NS_GP_INT_CPU2_CPU3_GP_NS_INT_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIU2_IMU_ECO_BITS - IMU ECO Control */\r\n/*! @{ */\r\n\r\n#define CIU2_CIU2_IMU_ECO_BITS_IMU_ECO_BITS_MASK (0xFFFFU)\r\n#define CIU2_CIU2_IMU_ECO_BITS_IMU_ECO_BITS_SHIFT (0U)\r\n/*! IMU_ECO_BITS - Reserved for ECOs */\r\n#define CIU2_CIU2_IMU_ECO_BITS_IMU_ECO_BITS(x)   (((uint32_t)(((uint32_t)(x)) << CIU2_CIU2_IMU_ECO_BITS_IMU_ECO_BITS_SHIFT)) & CIU2_CIU2_IMU_ECO_BITS_IMU_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group CIU2_Register_Masks */\r\n\r\n\r\n/* CIU2 - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral BLECTRL base address */\r\n  #define BLECTRL_BASE                             (0x54240000u)\r\n  /** Peripheral BLECTRL base address */\r\n  #define BLECTRL_BASE_NS                          (0x44240000u)\r\n  /** Peripheral BLECTRL base pointer */\r\n  #define BLECTRL                                  ((CIU2_Type *)BLECTRL_BASE)\r\n  /** Peripheral BLECTRL base pointer */\r\n  #define BLECTRL_NS                               ((CIU2_Type *)BLECTRL_BASE_NS)\r\n  /** Array initializer of CIU2 peripheral base addresses */\r\n  #define CIU2_BASE_ADDRS                          { BLECTRL_BASE }\r\n  /** Array initializer of CIU2 peripheral base pointers */\r\n  #define CIU2_BASE_PTRS                           { BLECTRL }\r\n  /** Array initializer of CIU2 peripheral base addresses */\r\n  #define CIU2_BASE_ADDRS_NS                       { BLECTRL_BASE_NS }\r\n  /** Array initializer of CIU2 peripheral base pointers */\r\n  #define CIU2_BASE_PTRS_NS                        { BLECTRL_NS }\r\n#else\r\n  /** Peripheral BLECTRL base address */\r\n  #define BLECTRL_BASE                             (0x44240000u)\r\n  /** Peripheral BLECTRL base pointer */\r\n  #define BLECTRL                                  ((CIU2_Type *)BLECTRL_BASE)\r\n  /** Array initializer of CIU2 peripheral base addresses */\r\n  #define CIU2_BASE_ADDRS                          { BLECTRL_BASE }\r\n  /** Array initializer of CIU2 peripheral base pointers */\r\n  #define CIU2_BASE_PTRS                           { BLECTRL }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group CIU2_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- CLKCTL0 Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup CLKCTL0_Peripheral_Access_Layer CLKCTL0 Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** CLKCTL0 - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[16];\r\n  __IO uint32_t PSCCTL0;                           /**< clock control 0, offset: 0x10 */\r\n  __IO uint32_t PSCCTL1;                           /**< clock control 1, offset: 0x14 */\r\n  __IO uint32_t PSCCTL2;                           /**< clock control 2, offset: 0x18 */\r\n       uint8_t RESERVED_1[36];\r\n  __O  uint32_t PSCCTL0_SET;                       /**< Peripheral clock set 0, offset: 0x40 */\r\n  __O  uint32_t PSCCTL1_SET;                       /**< Peripheral clock set 1, offset: 0x44 */\r\n  __O  uint32_t PSCCTL2_SET;                       /**< Peripheral clock set 2, offset: 0x48 */\r\n       uint8_t RESERVED_2[36];\r\n  __O  uint32_t PSCCTL0_CLR;                       /**< Peripheral clock clear 0, offset: 0x70 */\r\n  __O  uint32_t PSCCTL1_CLR;                       /**< Peripheral clock clear 1, offset: 0x74 */\r\n  __O  uint32_t PSCCTL2_CLR;                       /**< Peripheral clock clear 2, offset: 0x78 */\r\n       uint8_t RESERVED_3[236];\r\n  __IO uint32_t SYSOSCBYPASS;                      /**< System oscillator bypass, offset: 0x168 */\r\n       uint8_t RESERVED_4[84];\r\n  __IO uint32_t CLK32KHZCTL0;                      /**< 32k control 0, offset: 0x1C0 */\r\n       uint8_t RESERVED_5[124];\r\n  __IO uint32_t MAINPLLCLKDIV;                     /**< Main PLL clock divider, offset: 0x240 */\r\n       uint8_t RESERVED_6[4];\r\n  __IO uint32_t AUX0PLLCLKDIV;                     /**< AUX0 PLL clock divider, offset: 0x248 */\r\n  __IO uint32_t AUX1PLLCLKDIV;                     /**< AUX1 PLL clock divider, offset: 0x24C */\r\n       uint8_t RESERVED_7[432];\r\n  __IO uint32_t SYSCPUAHBCLKDIV;                   /**< System CPU AHB clock divider, offset: 0x400 */\r\n       uint8_t RESERVED_8[44];\r\n  __IO uint32_t MAINCLKSELA;                       /**< Main clock selection A, offset: 0x430 */\r\n  __IO uint32_t MAINCLKSELB;                       /**< Main clock selection B, offset: 0x434 */\r\n       uint8_t RESERVED_9[488];\r\n  __IO uint32_t FLEXSPIFCLKSEL;                    /**< FlexSPI FCLK selection, offset: 0x620 */\r\n  __IO uint32_t FLEXSPIFCLKDIV;                    /**< FlexSPI FCLK divider, offset: 0x624 */\r\n       uint8_t RESERVED_10[24];\r\n  __IO uint32_t SCTFCLKSEL;                        /**< SCT FCLK selection, offset: 0x640 */\r\n  __IO uint32_t SCTFCLKDIV;                        /**< SCT FCLK divider, offset: 0x644 */\r\n       uint8_t RESERVED_11[184];\r\n  __IO uint32_t UTICKFCLKSEL;                      /**< UTICK FCLK selection, offset: 0x700 */\r\n       uint8_t RESERVED_12[28];\r\n  __IO uint32_t WDT0FCLKSEL;                       /**< WDT clock selection, offset: 0x720 */\r\n       uint8_t RESERVED_13[60];\r\n  __IO uint32_t SYSTICKFCLKSEL;                    /**< System tick FCLK selection, offset: 0x760 */\r\n  __IO uint32_t SYSTICKFCLKDIV;                    /**< System tick FCLK divider, offset: 0x764 */\r\n  __IO uint32_t LCDFCLKDIV;                        /**< Lcd FCLK divider, offset: 0x768 */\r\n  __IO uint32_t GAUFCLKDIV;                        /**< Gau FCLK divider, offset: 0x76C */\r\n  __IO uint32_t USIMFCLKDIV;                       /**< Usim FCLK divider, offset: 0x770 */\r\n  __IO uint32_t USIMFCLKSEL;                       /**< USIM FCLK selection, offset: 0x774 */\r\n  __IO uint32_t LCDFCLKSEL;                        /**< LCD FCLK selection, offset: 0x778 */\r\n  __IO uint32_t GAUFCLKSEL;                        /**< GAU FCLK selection, offset: 0x77C */\r\n  __IO uint32_t PMUFCLKDIV;                        /**< Pmu FCLK divider, offset: 0x780 */\r\n       uint8_t RESERVED_14[12];\r\n  __IO uint32_t BRG_CLK_EN;                        /**< wl/ble/soc bridge clock enable signal, offset: 0x790 */\r\n       uint8_t RESERVED_15[12];\r\n  __IO uint32_t G2BIST_CLK_EN;                     /**< g2bist clock enable signal, offset: 0x7A0 */\r\n  __IO uint32_t MAIN_RAM_CLK_EN;                   /**< main ram clock enable signal, offset: 0x7A4 */\r\n  __IO uint32_t ELS_GDET_CLK_SEL;                  /**< ELS GDET CLK selection, offset: 0x7A8 */\r\n} CLKCTL0_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- CLKCTL0 Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup CLKCTL0_Register_Masks CLKCTL0 Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name PSCCTL0 - clock control 0 */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_PSCCTL0_PQ_MASK                  (0x100U)\r\n#define CLKCTL0_PSCCTL0_PQ_SHIFT                 (8U)\r\n/*! PQ - pq clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL0_PQ(x)                    (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_PQ_SHIFT)) & CLKCTL0_PSCCTL0_PQ_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_PKC_MASK                 (0x200U)\r\n#define CLKCTL0_PSCCTL0_PKC_SHIFT                (9U)\r\n/*! PKC - pkc clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL0_PKC(x)                   (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_PKC_SHIFT)) & CLKCTL0_PSCCTL0_PKC_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_ELS_MASK                 (0x400U)\r\n#define CLKCTL0_PSCCTL0_ELS_SHIFT                (10U)\r\n/*! ELS - els clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL0_ELS(x)                   (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_ELS_SHIFT)) & CLKCTL0_PSCCTL0_ELS_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_PUF_MASK                 (0x800U)\r\n#define CLKCTL0_PSCCTL0_PUF_SHIFT                (11U)\r\n/*! PUF - puf clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL0_PUF(x)                   (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_PUF_SHIFT)) & CLKCTL0_PSCCTL0_PUF_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_FLEXSPI0_MASK            (0x10000U)\r\n#define CLKCTL0_PSCCTL0_FLEXSPI0_SHIFT           (16U)\r\n/*! FLEXSPI0 - flexspi0 clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL0_FLEXSPI0(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_FLEXSPI0_SHIFT)) & CLKCTL0_PSCCTL0_FLEXSPI0_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_HPU_MASK                 (0x100000U)\r\n#define CLKCTL0_PSCCTL0_HPU_SHIFT                (20U)\r\n/*! HPU - hpu clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL0_HPU(x)                   (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_HPU_SHIFT)) & CLKCTL0_PSCCTL0_HPU_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_USB_MASK                 (0x400000U)\r\n#define CLKCTL0_PSCCTL0_USB_SHIFT                (22U)\r\n/*! USB - usb clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL0_USB(x)                   (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_USB_SHIFT)) & CLKCTL0_PSCCTL0_USB_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_SCT_MASK                 (0x1000000U)\r\n#define CLKCTL0_PSCCTL0_SCT_SHIFT                (24U)\r\n/*! SCT - sct clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL0_SCT(x)                   (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_SCT_SHIFT)) & CLKCTL0_PSCCTL0_SCT_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_AON_MEM_MASK             (0x2000000U)\r\n#define CLKCTL0_PSCCTL0_AON_MEM_SHIFT            (25U)\r\n/*! AON_MEM - aon_mem clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL0_AON_MEM(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_AON_MEM_SHIFT)) & CLKCTL0_PSCCTL0_AON_MEM_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_GDMA_MASK                (0x10000000U)\r\n#define CLKCTL0_PSCCTL0_GDMA_SHIFT               (28U)\r\n/*! GDMA - gdma clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL0_GDMA(x)                  (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_GDMA_SHIFT)) & CLKCTL0_PSCCTL0_GDMA_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_DMA0_MASK                (0x20000000U)\r\n#define CLKCTL0_PSCCTL0_DMA0_SHIFT               (29U)\r\n/*! DMA0 - dma0 clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL0_DMA0(x)                  (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_DMA0_SHIFT)) & CLKCTL0_PSCCTL0_DMA0_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_DMA1_MASK                (0x40000000U)\r\n#define CLKCTL0_PSCCTL0_DMA1_SHIFT               (30U)\r\n/*! DMA1 - dma1 clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL0_DMA1(x)                  (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_DMA1_SHIFT)) & CLKCTL0_PSCCTL0_DMA1_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_SDIO_MASK                (0x80000000U)\r\n#define CLKCTL0_PSCCTL0_SDIO_SHIFT               (31U)\r\n/*! SDIO - sdio clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL0_SDIO(x)                  (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_SDIO_SHIFT)) & CLKCTL0_PSCCTL0_SDIO_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSCCTL1 - clock control 1 */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_PSCCTL1_ELS_APB_MASK             (0x1U)\r\n#define CLKCTL0_PSCCTL1_ELS_APB_SHIFT            (0U)\r\n/*! ELS_APB - els_apb clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL1_ELS_APB(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_ELS_APB_SHIFT)) & CLKCTL0_PSCCTL1_ELS_APB_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_SDIO_SLV_MASK            (0x4U)\r\n#define CLKCTL0_PSCCTL1_SDIO_SLV_SHIFT           (2U)\r\n/*! SDIO_SLV - sdio_slv clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL1_SDIO_SLV(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_SDIO_SLV_SHIFT)) & CLKCTL0_PSCCTL1_SDIO_SLV_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_GAU_MASK                 (0x10000U)\r\n#define CLKCTL0_PSCCTL1_GAU_SHIFT                (16U)\r\n/*! GAU - gau clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL1_GAU(x)                   (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_GAU_SHIFT)) & CLKCTL0_PSCCTL1_GAU_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_OTP_MASK                 (0x20000U)\r\n#define CLKCTL0_PSCCTL1_OTP_SHIFT                (17U)\r\n/*! OTP - otp clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL1_OTP(x)                   (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_OTP_SHIFT)) & CLKCTL0_PSCCTL1_OTP_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_SECURE_GPIO_MASK         (0x1000000U)\r\n#define CLKCTL0_PSCCTL1_SECURE_GPIO_SHIFT        (24U)\r\n/*! SECURE_GPIO - secure_gpio clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL1_SECURE_GPIO(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_SECURE_GPIO_SHIFT)) & CLKCTL0_PSCCTL1_SECURE_GPIO_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_ENET_IPG_MASK            (0x2000000U)\r\n#define CLKCTL0_PSCCTL1_ENET_IPG_SHIFT           (25U)\r\n/*! ENET_IPG - enet_ipg clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL1_ENET_IPG(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_ENET_IPG_SHIFT)) & CLKCTL0_PSCCTL1_ENET_IPG_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_ENET_IPG_S_MASK          (0x4000000U)\r\n#define CLKCTL0_PSCCTL1_ENET_IPG_S_SHIFT         (26U)\r\n/*! ENET_IPG_S - enet_ipg_s clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL1_ENET_IPG_S(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_ENET_IPG_S_SHIFT)) & CLKCTL0_PSCCTL1_ENET_IPG_S_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_TRNG_MASK                (0x8000000U)\r\n#define CLKCTL0_PSCCTL1_TRNG_SHIFT               (27U)\r\n/*! TRNG - trng clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL1_TRNG(x)                  (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_TRNG_SHIFT)) & CLKCTL0_PSCCTL1_TRNG_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSCCTL2 - clock control 2 */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_PSCCTL2_UTICK_MASK               (0x1U)\r\n#define CLKCTL0_PSCCTL2_UTICK_SHIFT              (0U)\r\n/*! UTICK - utick clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL2_UTICK(x)                 (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL2_UTICK_SHIFT)) & CLKCTL0_PSCCTL2_UTICK_MASK)\r\n\r\n#define CLKCTL0_PSCCTL2_WWDT0_MASK               (0x2U)\r\n#define CLKCTL0_PSCCTL2_WWDT0_SHIFT              (1U)\r\n/*! WWDT0 - wwdt0 clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL2_WWDT0(x)                 (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL2_WWDT0_SHIFT)) & CLKCTL0_PSCCTL2_WWDT0_MASK)\r\n\r\n#define CLKCTL0_PSCCTL2_USIM_MASK                (0x4U)\r\n#define CLKCTL0_PSCCTL2_USIM_SHIFT               (2U)\r\n/*! USIM - usim clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL2_USIM(x)                  (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL2_USIM_SHIFT)) & CLKCTL0_PSCCTL2_USIM_MASK)\r\n\r\n#define CLKCTL0_PSCCTL2_ITRC_MASK                (0x8U)\r\n#define CLKCTL0_PSCCTL2_ITRC_SHIFT               (3U)\r\n/*! ITRC - itrc clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL2_ITRC(x)                  (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL2_ITRC_SHIFT)) & CLKCTL0_PSCCTL2_ITRC_MASK)\r\n\r\n#define CLKCTL0_PSCCTL2_FREEMRT_MASK             (0x4000000U)\r\n#define CLKCTL0_PSCCTL2_FREEMRT_SHIFT            (26U)\r\n/*! FREEMRT - freemrt clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL2_FREEMRT(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL2_FREEMRT_SHIFT)) & CLKCTL0_PSCCTL2_FREEMRT_MASK)\r\n\r\n#define CLKCTL0_PSCCTL2_LCDIC_MASK               (0x8000000U)\r\n#define CLKCTL0_PSCCTL2_LCDIC_SHIFT              (27U)\r\n/*! LCDIC - lcdic clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL0_PSCCTL2_LCDIC(x)                 (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL2_LCDIC_SHIFT)) & CLKCTL0_PSCCTL2_LCDIC_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSCCTL0_SET - Peripheral clock set 0 */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_PSCCTL0_SET_PQ_MASK              (0x100U)\r\n#define CLKCTL0_PSCCTL0_SET_PQ_SHIFT             (8U)\r\n/*! PQ - pq clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_SET_PQ(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_SET_PQ_SHIFT)) & CLKCTL0_PSCCTL0_SET_PQ_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_SET_PKC_MASK             (0x200U)\r\n#define CLKCTL0_PSCCTL0_SET_PKC_SHIFT            (9U)\r\n/*! PKC - pkc clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_SET_PKC(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_SET_PKC_SHIFT)) & CLKCTL0_PSCCTL0_SET_PKC_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_SET_ELS_MASK             (0x400U)\r\n#define CLKCTL0_PSCCTL0_SET_ELS_SHIFT            (10U)\r\n/*! ELS - els clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_SET_ELS(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_SET_ELS_SHIFT)) & CLKCTL0_PSCCTL0_SET_ELS_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_SET_PUF_MASK             (0x800U)\r\n#define CLKCTL0_PSCCTL0_SET_PUF_SHIFT            (11U)\r\n/*! PUF - puf clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_SET_PUF(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_SET_PUF_SHIFT)) & CLKCTL0_PSCCTL0_SET_PUF_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_SET_FLEXSPI0_MASK        (0x10000U)\r\n#define CLKCTL0_PSCCTL0_SET_FLEXSPI0_SHIFT       (16U)\r\n/*! FLEXSPI0 - flexspi0 clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_SET_FLEXSPI0(x)          (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_SET_FLEXSPI0_SHIFT)) & CLKCTL0_PSCCTL0_SET_FLEXSPI0_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_SET_HPU_MASK             (0x100000U)\r\n#define CLKCTL0_PSCCTL0_SET_HPU_SHIFT            (20U)\r\n/*! HPU - hpu clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_SET_HPU(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_SET_HPU_SHIFT)) & CLKCTL0_PSCCTL0_SET_HPU_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_SET_USB_MASK             (0x400000U)\r\n#define CLKCTL0_PSCCTL0_SET_USB_SHIFT            (22U)\r\n/*! USB - usb clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_SET_USB(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_SET_USB_SHIFT)) & CLKCTL0_PSCCTL0_SET_USB_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_SET_SCT_MASK             (0x1000000U)\r\n#define CLKCTL0_PSCCTL0_SET_SCT_SHIFT            (24U)\r\n/*! SCT - sct clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_SET_SCT(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_SET_SCT_SHIFT)) & CLKCTL0_PSCCTL0_SET_SCT_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_SET_AON_MEM_MASK         (0x2000000U)\r\n#define CLKCTL0_PSCCTL0_SET_AON_MEM_SHIFT        (25U)\r\n/*! AON_MEM - aon_mem clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_SET_AON_MEM(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_SET_AON_MEM_SHIFT)) & CLKCTL0_PSCCTL0_SET_AON_MEM_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_SET_GDMA_MASK            (0x10000000U)\r\n#define CLKCTL0_PSCCTL0_SET_GDMA_SHIFT           (28U)\r\n/*! GDMA - gdma clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_SET_GDMA(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_SET_GDMA_SHIFT)) & CLKCTL0_PSCCTL0_SET_GDMA_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_SET_DMA0_MASK            (0x20000000U)\r\n#define CLKCTL0_PSCCTL0_SET_DMA0_SHIFT           (29U)\r\n/*! DMA0 - dma0 clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_SET_DMA0(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_SET_DMA0_SHIFT)) & CLKCTL0_PSCCTL0_SET_DMA0_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_SET_DMA1_MASK            (0x40000000U)\r\n#define CLKCTL0_PSCCTL0_SET_DMA1_SHIFT           (30U)\r\n/*! DMA1 - dma1 clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_SET_DMA1(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_SET_DMA1_SHIFT)) & CLKCTL0_PSCCTL0_SET_DMA1_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_SET_SDIO_MASK            (0x80000000U)\r\n#define CLKCTL0_PSCCTL0_SET_SDIO_SHIFT           (31U)\r\n/*! SDIO - sdio clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_SET_SDIO(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_SET_SDIO_SHIFT)) & CLKCTL0_PSCCTL0_SET_SDIO_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSCCTL1_SET - Peripheral clock set 1 */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_PSCCTL1_SET_ELS_APB_MASK         (0x1U)\r\n#define CLKCTL0_PSCCTL1_SET_ELS_APB_SHIFT        (0U)\r\n/*! ELS_APB - els_apb clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL1 Bit\r\n */\r\n#define CLKCTL0_PSCCTL1_SET_ELS_APB(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_SET_ELS_APB_SHIFT)) & CLKCTL0_PSCCTL1_SET_ELS_APB_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_SET_SDIO_SLV_MASK        (0x4U)\r\n#define CLKCTL0_PSCCTL1_SET_SDIO_SLV_SHIFT       (2U)\r\n/*! SDIO_SLV - sdio_slv clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL1 Bit\r\n */\r\n#define CLKCTL0_PSCCTL1_SET_SDIO_SLV(x)          (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_SET_SDIO_SLV_SHIFT)) & CLKCTL0_PSCCTL1_SET_SDIO_SLV_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_SET_GAU_MASK             (0x10000U)\r\n#define CLKCTL0_PSCCTL1_SET_GAU_SHIFT            (16U)\r\n/*! GAU - gau clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL1 Bit\r\n */\r\n#define CLKCTL0_PSCCTL1_SET_GAU(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_SET_GAU_SHIFT)) & CLKCTL0_PSCCTL1_SET_GAU_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_SET_OTP_MASK             (0x20000U)\r\n#define CLKCTL0_PSCCTL1_SET_OTP_SHIFT            (17U)\r\n/*! OTP - otp clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL1_SET_OTP(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_SET_OTP_SHIFT)) & CLKCTL0_PSCCTL1_SET_OTP_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_SET_SECURE_GPIO_MASK     (0x1000000U)\r\n#define CLKCTL0_PSCCTL1_SET_SECURE_GPIO_SHIFT    (24U)\r\n/*! SECURE_GPIO - secure_gpio clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL1 Bit\r\n */\r\n#define CLKCTL0_PSCCTL1_SET_SECURE_GPIO(x)       (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_SET_SECURE_GPIO_SHIFT)) & CLKCTL0_PSCCTL1_SET_SECURE_GPIO_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_SET_ENET_IPG_MASK        (0x2000000U)\r\n#define CLKCTL0_PSCCTL1_SET_ENET_IPG_SHIFT       (25U)\r\n/*! ENET_IPG - enet_ipg clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL1 Bit\r\n */\r\n#define CLKCTL0_PSCCTL1_SET_ENET_IPG(x)          (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_SET_ENET_IPG_SHIFT)) & CLKCTL0_PSCCTL1_SET_ENET_IPG_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_SET_ENET_IPG_S_MASK      (0x4000000U)\r\n#define CLKCTL0_PSCCTL1_SET_ENET_IPG_S_SHIFT     (26U)\r\n/*! ENET_IPG_S - enet_ipg_s clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL1 Bit\r\n */\r\n#define CLKCTL0_PSCCTL1_SET_ENET_IPG_S(x)        (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_SET_ENET_IPG_S_SHIFT)) & CLKCTL0_PSCCTL1_SET_ENET_IPG_S_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_SET_TRNG_MASK            (0x8000000U)\r\n#define CLKCTL0_PSCCTL1_SET_TRNG_SHIFT           (27U)\r\n/*! TRNG - trng clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL1 Bit\r\n */\r\n#define CLKCTL0_PSCCTL1_SET_TRNG(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_SET_TRNG_SHIFT)) & CLKCTL0_PSCCTL1_SET_TRNG_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSCCTL2_SET - Peripheral clock set 2 */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_PSCCTL2_SET_UTICK_MASK           (0x1U)\r\n#define CLKCTL0_PSCCTL2_SET_UTICK_SHIFT          (0U)\r\n/*! UTICK - utick clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL2 Bit\r\n */\r\n#define CLKCTL0_PSCCTL2_SET_UTICK(x)             (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL2_SET_UTICK_SHIFT)) & CLKCTL0_PSCCTL2_SET_UTICK_MASK)\r\n\r\n#define CLKCTL0_PSCCTL2_SET_WWDT0_MASK           (0x2U)\r\n#define CLKCTL0_PSCCTL2_SET_WWDT0_SHIFT          (1U)\r\n/*! WWDT0 - wwdt0 clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL2 Bit\r\n */\r\n#define CLKCTL0_PSCCTL2_SET_WWDT0(x)             (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL2_SET_WWDT0_SHIFT)) & CLKCTL0_PSCCTL2_SET_WWDT0_MASK)\r\n\r\n#define CLKCTL0_PSCCTL2_SET_USIM_MASK            (0x4U)\r\n#define CLKCTL0_PSCCTL2_SET_USIM_SHIFT           (2U)\r\n/*! USIM - usim clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL2 Bit\r\n */\r\n#define CLKCTL0_PSCCTL2_SET_USIM(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL2_SET_USIM_SHIFT)) & CLKCTL0_PSCCTL2_SET_USIM_MASK)\r\n\r\n#define CLKCTL0_PSCCTL2_SET_ITRC_MASK            (0x8U)\r\n#define CLKCTL0_PSCCTL2_SET_ITRC_SHIFT           (3U)\r\n/*! ITRC - itrc clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL2 Bit\r\n */\r\n#define CLKCTL0_PSCCTL2_SET_ITRC(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL2_SET_ITRC_SHIFT)) & CLKCTL0_PSCCTL2_SET_ITRC_MASK)\r\n\r\n#define CLKCTL0_PSCCTL2_SET_FREEMRT_MASK         (0x4000000U)\r\n#define CLKCTL0_PSCCTL2_SET_FREEMRT_SHIFT        (26U)\r\n/*! FREEMRT - freemrt clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL2 Bit\r\n */\r\n#define CLKCTL0_PSCCTL2_SET_FREEMRT(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL2_SET_FREEMRT_SHIFT)) & CLKCTL0_PSCCTL2_SET_FREEMRT_MASK)\r\n\r\n#define CLKCTL0_PSCCTL2_SET_LCDIC_MASK           (0x8000000U)\r\n#define CLKCTL0_PSCCTL2_SET_LCDIC_SHIFT          (27U)\r\n/*! LCDIC - lcdic clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL2 Bit\r\n */\r\n#define CLKCTL0_PSCCTL2_SET_LCDIC(x)             (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL2_SET_LCDIC_SHIFT)) & CLKCTL0_PSCCTL2_SET_LCDIC_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSCCTL0_CLR - Peripheral clock clear 0 */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_PSCCTL0_CLR_PQ_MASK              (0x100U)\r\n#define CLKCTL0_PSCCTL0_CLR_PQ_SHIFT             (8U)\r\n/*! PQ - pq clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_CLR_PQ(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_CLR_PQ_SHIFT)) & CLKCTL0_PSCCTL0_CLR_PQ_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_CLR_PKC_MASK             (0x200U)\r\n#define CLKCTL0_PSCCTL0_CLR_PKC_SHIFT            (9U)\r\n/*! PKC - pkc clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_CLR_PKC(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_CLR_PKC_SHIFT)) & CLKCTL0_PSCCTL0_CLR_PKC_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_CLR_ELS_MASK             (0x400U)\r\n#define CLKCTL0_PSCCTL0_CLR_ELS_SHIFT            (10U)\r\n/*! ELS - els clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_CLR_ELS(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_CLR_ELS_SHIFT)) & CLKCTL0_PSCCTL0_CLR_ELS_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_CLR_PUF_MASK             (0x800U)\r\n#define CLKCTL0_PSCCTL0_CLR_PUF_SHIFT            (11U)\r\n/*! PUF - puf clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_CLR_PUF(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_CLR_PUF_SHIFT)) & CLKCTL0_PSCCTL0_CLR_PUF_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_CLR_FLEXSPI0_MASK        (0x10000U)\r\n#define CLKCTL0_PSCCTL0_CLR_FLEXSPI0_SHIFT       (16U)\r\n/*! FLEXSPI0 - flexspi0 clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_CLR_FLEXSPI0(x)          (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_CLR_FLEXSPI0_SHIFT)) & CLKCTL0_PSCCTL0_CLR_FLEXSPI0_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_CLR_HPU_MASK             (0x100000U)\r\n#define CLKCTL0_PSCCTL0_CLR_HPU_SHIFT            (20U)\r\n/*! HPU - hpu clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_CLR_HPU(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_CLR_HPU_SHIFT)) & CLKCTL0_PSCCTL0_CLR_HPU_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_CLR_USB_MASK             (0x400000U)\r\n#define CLKCTL0_PSCCTL0_CLR_USB_SHIFT            (22U)\r\n/*! USB - usb clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_CLR_USB(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_CLR_USB_SHIFT)) & CLKCTL0_PSCCTL0_CLR_USB_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_CLR_SCT_MASK             (0x1000000U)\r\n#define CLKCTL0_PSCCTL0_CLR_SCT_SHIFT            (24U)\r\n/*! SCT - sct clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_CLR_SCT(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_CLR_SCT_SHIFT)) & CLKCTL0_PSCCTL0_CLR_SCT_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_CLR_AON_MEM_MASK         (0x2000000U)\r\n#define CLKCTL0_PSCCTL0_CLR_AON_MEM_SHIFT        (25U)\r\n/*! AON_MEM - aon_mem clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_CLR_AON_MEM(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_CLR_AON_MEM_SHIFT)) & CLKCTL0_PSCCTL0_CLR_AON_MEM_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_CLR_GDMA_MASK            (0x10000000U)\r\n#define CLKCTL0_PSCCTL0_CLR_GDMA_SHIFT           (28U)\r\n/*! GDMA - gdma clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_CLR_GDMA(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_CLR_GDMA_SHIFT)) & CLKCTL0_PSCCTL0_CLR_GDMA_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_CLR_DMA0_MASK            (0x20000000U)\r\n#define CLKCTL0_PSCCTL0_CLR_DMA0_SHIFT           (29U)\r\n/*! DMA0 - dma0 clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_CLR_DMA0(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_CLR_DMA0_SHIFT)) & CLKCTL0_PSCCTL0_CLR_DMA0_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_CLR_DMA1_MASK            (0x40000000U)\r\n#define CLKCTL0_PSCCTL0_CLR_DMA1_SHIFT           (30U)\r\n/*! DMA1 - dma1 clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_CLR_DMA1(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_CLR_DMA1_SHIFT)) & CLKCTL0_PSCCTL0_CLR_DMA1_MASK)\r\n\r\n#define CLKCTL0_PSCCTL0_CLR_SDIO_MASK            (0x80000000U)\r\n#define CLKCTL0_PSCCTL0_CLR_SDIO_SHIFT           (31U)\r\n/*! SDIO - sdio clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL0_CLR_SDIO(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL0_CLR_SDIO_SHIFT)) & CLKCTL0_PSCCTL0_CLR_SDIO_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSCCTL1_CLR - Peripheral clock clear 1 */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_PSCCTL1_CLR_ELS_APB_MASK         (0x1U)\r\n#define CLKCTL0_PSCCTL1_CLR_ELS_APB_SHIFT        (0U)\r\n/*! ELS_APB - els_apb clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL1 Bit\r\n */\r\n#define CLKCTL0_PSCCTL1_CLR_ELS_APB(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_CLR_ELS_APB_SHIFT)) & CLKCTL0_PSCCTL1_CLR_ELS_APB_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_CLR_SDIO_SLV_MASK        (0x4U)\r\n#define CLKCTL0_PSCCTL1_CLR_SDIO_SLV_SHIFT       (2U)\r\n/*! SDIO_SLV - sdio_slv clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL1 Bit\r\n */\r\n#define CLKCTL0_PSCCTL1_CLR_SDIO_SLV(x)          (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_CLR_SDIO_SLV_SHIFT)) & CLKCTL0_PSCCTL1_CLR_SDIO_SLV_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_CLR_GAU_MASK             (0x10000U)\r\n#define CLKCTL0_PSCCTL1_CLR_GAU_SHIFT            (16U)\r\n/*! GAU - gau clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL1 Bit\r\n */\r\n#define CLKCTL0_PSCCTL1_CLR_GAU(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_CLR_GAU_SHIFT)) & CLKCTL0_PSCCTL1_CLR_GAU_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_CLR_OTP_MASK             (0x20000U)\r\n#define CLKCTL0_PSCCTL1_CLR_OTP_SHIFT            (17U)\r\n/*! OTP - otp clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL0_PSCCTL1_CLR_OTP(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_CLR_OTP_SHIFT)) & CLKCTL0_PSCCTL1_CLR_OTP_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_CLR_SECURE_GPIO_MASK     (0x1000000U)\r\n#define CLKCTL0_PSCCTL1_CLR_SECURE_GPIO_SHIFT    (24U)\r\n/*! SECURE_GPIO - secure_gpio clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL1 Bit\r\n */\r\n#define CLKCTL0_PSCCTL1_CLR_SECURE_GPIO(x)       (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_CLR_SECURE_GPIO_SHIFT)) & CLKCTL0_PSCCTL1_CLR_SECURE_GPIO_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_CLR_ENET_IPG_MASK        (0x2000000U)\r\n#define CLKCTL0_PSCCTL1_CLR_ENET_IPG_SHIFT       (25U)\r\n/*! ENET_IPG - enet_ipg clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL1 Bit\r\n */\r\n#define CLKCTL0_PSCCTL1_CLR_ENET_IPG(x)          (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_CLR_ENET_IPG_SHIFT)) & CLKCTL0_PSCCTL1_CLR_ENET_IPG_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_CLR_ENET_IPG_S_MASK      (0x4000000U)\r\n#define CLKCTL0_PSCCTL1_CLR_ENET_IPG_S_SHIFT     (26U)\r\n/*! ENET_IPG_S - enet_ipg_s clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL1 Bit\r\n */\r\n#define CLKCTL0_PSCCTL1_CLR_ENET_IPG_S(x)        (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_CLR_ENET_IPG_S_SHIFT)) & CLKCTL0_PSCCTL1_CLR_ENET_IPG_S_MASK)\r\n\r\n#define CLKCTL0_PSCCTL1_CLR_TRNG_MASK            (0x8000000U)\r\n#define CLKCTL0_PSCCTL1_CLR_TRNG_SHIFT           (27U)\r\n/*! TRNG - trng clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL1 Bit\r\n */\r\n#define CLKCTL0_PSCCTL1_CLR_TRNG(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL1_CLR_TRNG_SHIFT)) & CLKCTL0_PSCCTL1_CLR_TRNG_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSCCTL2_CLR - Peripheral clock clear 2 */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_PSCCTL2_CLR_UTICK_MASK           (0x1U)\r\n#define CLKCTL0_PSCCTL2_CLR_UTICK_SHIFT          (0U)\r\n/*! UTICK - utick clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL2 Bit\r\n */\r\n#define CLKCTL0_PSCCTL2_CLR_UTICK(x)             (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL2_CLR_UTICK_SHIFT)) & CLKCTL0_PSCCTL2_CLR_UTICK_MASK)\r\n\r\n#define CLKCTL0_PSCCTL2_CLR_WWDT0_MASK           (0x2U)\r\n#define CLKCTL0_PSCCTL2_CLR_WWDT0_SHIFT          (1U)\r\n/*! WWDT0 - wwdt0 clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL2 Bit\r\n */\r\n#define CLKCTL0_PSCCTL2_CLR_WWDT0(x)             (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL2_CLR_WWDT0_SHIFT)) & CLKCTL0_PSCCTL2_CLR_WWDT0_MASK)\r\n\r\n#define CLKCTL0_PSCCTL2_CLR_USIM_MASK            (0x4U)\r\n#define CLKCTL0_PSCCTL2_CLR_USIM_SHIFT           (2U)\r\n/*! USIM - usim clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL2 Bit\r\n */\r\n#define CLKCTL0_PSCCTL2_CLR_USIM(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL2_CLR_USIM_SHIFT)) & CLKCTL0_PSCCTL2_CLR_USIM_MASK)\r\n\r\n#define CLKCTL0_PSCCTL2_CLR_ITRC_MASK            (0x8U)\r\n#define CLKCTL0_PSCCTL2_CLR_ITRC_SHIFT           (3U)\r\n/*! ITRC - itrc clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL2 Bit\r\n */\r\n#define CLKCTL0_PSCCTL2_CLR_ITRC(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL2_CLR_ITRC_SHIFT)) & CLKCTL0_PSCCTL2_CLR_ITRC_MASK)\r\n\r\n#define CLKCTL0_PSCCTL2_CLR_FREEMRT_MASK         (0x4000000U)\r\n#define CLKCTL0_PSCCTL2_CLR_FREEMRT_SHIFT        (26U)\r\n/*! FREEMRT - freemrt clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL2 Bit\r\n */\r\n#define CLKCTL0_PSCCTL2_CLR_FREEMRT(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL2_CLR_FREEMRT_SHIFT)) & CLKCTL0_PSCCTL2_CLR_FREEMRT_MASK)\r\n\r\n#define CLKCTL0_PSCCTL2_CLR_LCDIC_MASK           (0x8000000U)\r\n#define CLKCTL0_PSCCTL2_CLR_LCDIC_SHIFT          (27U)\r\n/*! LCDIC - lcdic clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL2 Bit\r\n */\r\n#define CLKCTL0_PSCCTL2_CLR_LCDIC(x)             (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PSCCTL2_CLR_LCDIC_SHIFT)) & CLKCTL0_PSCCTL2_CLR_LCDIC_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSOSCBYPASS - System oscillator bypass */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_SYSOSCBYPASS_SEL_MASK            (0x7U)\r\n#define CLKCTL0_SYSOSCBYPASS_SEL_SHIFT           (0U)\r\n/*! SEL - External clock source selection\r\n *  0b000..Output of the external crystal oscillator\r\n *  0b001..External clock input (CLKIN function from a pin, selected by IOCON)\r\n *  0b010..Reserved\r\n *  0b011..Reserved\r\n *  0b100..Reserved\r\n *  0b101..Reserved\r\n *  0b110..Reserved\r\n *  0b111..NONE.this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL0_SYSOSCBYPASS_SEL(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_SYSOSCBYPASS_SEL_SHIFT)) & CLKCTL0_SYSOSCBYPASS_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLK32KHZCTL0 - 32k control 0 */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_CLK32KHZCTL0_ENA_32KHZ_MASK      (0x1U)\r\n#define CLKCTL0_CLK32KHZCTL0_ENA_32KHZ_SHIFT     (0U)\r\n/*! ENA_32KHZ - 32 kHz Enable\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define CLKCTL0_CLK32KHZCTL0_ENA_32KHZ(x)        (((uint32_t)(((uint32_t)(x)) << CLKCTL0_CLK32KHZCTL0_ENA_32KHZ_SHIFT)) & CLKCTL0_CLK32KHZCTL0_ENA_32KHZ_MASK)\r\n/*! @} */\r\n\r\n/*! @name MAINPLLCLKDIV - Main PLL clock divider */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_MAINPLLCLKDIV_DIV_MASK           (0xFFU)\r\n#define CLKCTL0_MAINPLLCLKDIV_DIV_SHIFT          (0U)\r\n/*! DIV - Clock Divider Value Selection: 0: Divide by 1... 255: Divide by 256 */\r\n#define CLKCTL0_MAINPLLCLKDIV_DIV(x)             (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAINPLLCLKDIV_DIV_SHIFT)) & CLKCTL0_MAINPLLCLKDIV_DIV_MASK)\r\n\r\n#define CLKCTL0_MAINPLLCLKDIV_RESET_MASK         (0x20000000U)\r\n#define CLKCTL0_MAINPLLCLKDIV_RESET_SHIFT        (29U)\r\n/*! RESET - Resets the divider counter. Can be used to make sure a new divider value is used right\r\n *    away rather than completing the previous count\r\n */\r\n#define CLKCTL0_MAINPLLCLKDIV_RESET(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAINPLLCLKDIV_RESET_SHIFT)) & CLKCTL0_MAINPLLCLKDIV_RESET_MASK)\r\n\r\n#define CLKCTL0_MAINPLLCLKDIV_HALT_MASK          (0x40000000U)\r\n#define CLKCTL0_MAINPLLCLKDIV_HALT_SHIFT         (30U)\r\n/*! HALT - Halts the divider counter. The intent is to allow the divider clock source to be changed\r\n *    without the risk of a glitch at the output\r\n */\r\n#define CLKCTL0_MAINPLLCLKDIV_HALT(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAINPLLCLKDIV_HALT_SHIFT)) & CLKCTL0_MAINPLLCLKDIV_HALT_MASK)\r\n\r\n#define CLKCTL0_MAINPLLCLKDIV_REQFLAG_MASK       (0x80000000U)\r\n#define CLKCTL0_MAINPLLCLKDIV_REQFLAG_SHIFT      (31U)\r\n/*! REQFLAG - Divider status flag. Set when a change is made to the divider value, cleared when the\r\n *    change is complete. The clock being divided must be running for this status to change\r\n */\r\n#define CLKCTL0_MAINPLLCLKDIV_REQFLAG(x)         (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAINPLLCLKDIV_REQFLAG_SHIFT)) & CLKCTL0_MAINPLLCLKDIV_REQFLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name AUX0PLLCLKDIV - AUX0 PLL clock divider */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_AUX0PLLCLKDIV_DIV_MASK           (0xFFU)\r\n#define CLKCTL0_AUX0PLLCLKDIV_DIV_SHIFT          (0U)\r\n/*! DIV - Clock Divider Value Selection: 0: Divide by 1... 255: Divide by 256 */\r\n#define CLKCTL0_AUX0PLLCLKDIV_DIV(x)             (((uint32_t)(((uint32_t)(x)) << CLKCTL0_AUX0PLLCLKDIV_DIV_SHIFT)) & CLKCTL0_AUX0PLLCLKDIV_DIV_MASK)\r\n\r\n#define CLKCTL0_AUX0PLLCLKDIV_RESET_MASK         (0x20000000U)\r\n#define CLKCTL0_AUX0PLLCLKDIV_RESET_SHIFT        (29U)\r\n/*! RESET - Resets the divider counter. Can be used to make sure a new divider value is used right\r\n *    away rather than completing the previous count\r\n */\r\n#define CLKCTL0_AUX0PLLCLKDIV_RESET(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL0_AUX0PLLCLKDIV_RESET_SHIFT)) & CLKCTL0_AUX0PLLCLKDIV_RESET_MASK)\r\n\r\n#define CLKCTL0_AUX0PLLCLKDIV_HALT_MASK          (0x40000000U)\r\n#define CLKCTL0_AUX0PLLCLKDIV_HALT_SHIFT         (30U)\r\n/*! HALT - Halts the divider counter. The intent is to allow the divider clock source to be changed\r\n *    without the risk of a glitch at the output\r\n */\r\n#define CLKCTL0_AUX0PLLCLKDIV_HALT(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL0_AUX0PLLCLKDIV_HALT_SHIFT)) & CLKCTL0_AUX0PLLCLKDIV_HALT_MASK)\r\n\r\n#define CLKCTL0_AUX0PLLCLKDIV_REQFLAG_MASK       (0x80000000U)\r\n#define CLKCTL0_AUX0PLLCLKDIV_REQFLAG_SHIFT      (31U)\r\n/*! REQFLAG - Divider status flag. Set when a change is made to the divider value, cleared when the\r\n *    change is complete. The clock being divided must be running for this status to change\r\n */\r\n#define CLKCTL0_AUX0PLLCLKDIV_REQFLAG(x)         (((uint32_t)(((uint32_t)(x)) << CLKCTL0_AUX0PLLCLKDIV_REQFLAG_SHIFT)) & CLKCTL0_AUX0PLLCLKDIV_REQFLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name AUX1PLLCLKDIV - AUX1 PLL clock divider */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_AUX1PLLCLKDIV_DIV_MASK           (0xFFU)\r\n#define CLKCTL0_AUX1PLLCLKDIV_DIV_SHIFT          (0U)\r\n/*! DIV - Clock Divider Value Selection: 0: Divide by 1... 255: Divide by 256 */\r\n#define CLKCTL0_AUX1PLLCLKDIV_DIV(x)             (((uint32_t)(((uint32_t)(x)) << CLKCTL0_AUX1PLLCLKDIV_DIV_SHIFT)) & CLKCTL0_AUX1PLLCLKDIV_DIV_MASK)\r\n\r\n#define CLKCTL0_AUX1PLLCLKDIV_RESET_MASK         (0x20000000U)\r\n#define CLKCTL0_AUX1PLLCLKDIV_RESET_SHIFT        (29U)\r\n/*! RESET - Resets the divider counter. Can be used to make sure a new divider value is used right\r\n *    away rather than completing the previous count\r\n */\r\n#define CLKCTL0_AUX1PLLCLKDIV_RESET(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL0_AUX1PLLCLKDIV_RESET_SHIFT)) & CLKCTL0_AUX1PLLCLKDIV_RESET_MASK)\r\n\r\n#define CLKCTL0_AUX1PLLCLKDIV_HALT_MASK          (0x40000000U)\r\n#define CLKCTL0_AUX1PLLCLKDIV_HALT_SHIFT         (30U)\r\n/*! HALT - Halts the divider counter. The intent is to allow the divider clock source to be changed\r\n *    without the risk of a glitch at the output\r\n */\r\n#define CLKCTL0_AUX1PLLCLKDIV_HALT(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL0_AUX1PLLCLKDIV_HALT_SHIFT)) & CLKCTL0_AUX1PLLCLKDIV_HALT_MASK)\r\n\r\n#define CLKCTL0_AUX1PLLCLKDIV_REQFLAG_MASK       (0x80000000U)\r\n#define CLKCTL0_AUX1PLLCLKDIV_REQFLAG_SHIFT      (31U)\r\n/*! REQFLAG - Divider status flag. Set when a change is made to the divider value, cleared when the\r\n *    change is complete. The clock being divided must be running for this status to change\r\n */\r\n#define CLKCTL0_AUX1PLLCLKDIV_REQFLAG(x)         (((uint32_t)(((uint32_t)(x)) << CLKCTL0_AUX1PLLCLKDIV_REQFLAG_SHIFT)) & CLKCTL0_AUX1PLLCLKDIV_REQFLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSCPUAHBCLKDIV - System CPU AHB clock divider */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_SYSCPUAHBCLKDIV_DIV_MASK         (0xFFU)\r\n#define CLKCTL0_SYSCPUAHBCLKDIV_DIV_SHIFT        (0U)\r\n/*! DIV - Clock Divider Value Selection: 0: Divide by 1... 255: Divide by 256 */\r\n#define CLKCTL0_SYSCPUAHBCLKDIV_DIV(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL0_SYSCPUAHBCLKDIV_DIV_SHIFT)) & CLKCTL0_SYSCPUAHBCLKDIV_DIV_MASK)\r\n\r\n#define CLKCTL0_SYSCPUAHBCLKDIV_REQFLAG_MASK     (0x80000000U)\r\n#define CLKCTL0_SYSCPUAHBCLKDIV_REQFLAG_SHIFT    (31U)\r\n/*! REQFLAG - Divider status flag. Set when a change is made to the divider value, cleared when the\r\n *    change is complete. The clock being divided must be running for this status to change\r\n */\r\n#define CLKCTL0_SYSCPUAHBCLKDIV_REQFLAG(x)       (((uint32_t)(((uint32_t)(x)) << CLKCTL0_SYSCPUAHBCLKDIV_REQFLAG_SHIFT)) & CLKCTL0_SYSCPUAHBCLKDIV_REQFLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name MAINCLKSELA - Main clock selection A */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_MAINCLKSELA_SEL_MASK             (0x3U)\r\n#define CLKCTL0_MAINCLKSELA_SEL_SHIFT            (0U)\r\n/*! SEL - Control Main 1st Stage Control Clock Source\r\n *  0b00..External clock (clk_in) or REFCLK_SYS\r\n *  0b01..FFRO Clock (48/60m_irc) divided by 4\r\n *  0b10..1m_lposc\r\n *  0b11..FFRO Clock\r\n */\r\n#define CLKCTL0_MAINCLKSELA_SEL(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAINCLKSELA_SEL_SHIFT)) & CLKCTL0_MAINCLKSELA_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MAINCLKSELB - Main clock selection B */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_MAINCLKSELB_SEL_MASK             (0x3U)\r\n#define CLKCTL0_MAINCLKSELB_SEL_SHIFT            (0U)\r\n/*! SEL - Control Main 2nd Stage Control Clock Source\r\n *  0b00..MAINCLKSELA 1st Stage Clock\r\n *  0b01..SFRO Clock\r\n *  0b10..Main PLL Clock (main_pll_clk).\r\n *  0b11..32 kHz Clock\r\n */\r\n#define CLKCTL0_MAINCLKSELB_SEL(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAINCLKSELB_SEL_SHIFT)) & CLKCTL0_MAINCLKSELB_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name FLEXSPIFCLKSEL - FlexSPI FCLK selection */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_FLEXSPIFCLKSEL_SEL_MASK          (0x7U)\r\n#define CLKCTL0_FLEXSPIFCLKSEL_SEL_SHIFT         (0U)\r\n/*! SEL - FlexSPI Functional Clock Source Selection\r\n *  0b000..Main Clock\r\n *  0b001..t3pll_mci_flexspi_clk(365M)\r\n *  0b010..AUX0 PLL clock (aux0_pll_clk).\r\n *  0b011..tcpu_mci_flexspi_clk(312M)\r\n *  0b100..AUX1 PLL clock (aux1_pll_clk).\r\n *  0b101..tddr_mci_flexspi_clk(320/355/400M)\r\n *  0b110..t3pll_mci_256m\r\n *  0b111..None, this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL0_FLEXSPIFCLKSEL_SEL(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL0_FLEXSPIFCLKSEL_SEL_SHIFT)) & CLKCTL0_FLEXSPIFCLKSEL_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name FLEXSPIFCLKDIV - FlexSPI FCLK divider */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_FLEXSPIFCLKDIV_DIV_MASK          (0xFFU)\r\n#define CLKCTL0_FLEXSPIFCLKDIV_DIV_SHIFT         (0U)\r\n/*! DIV - Clock Divider Value Selection: 0: Divide by 1... 255: Divide by 256 */\r\n#define CLKCTL0_FLEXSPIFCLKDIV_DIV(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL0_FLEXSPIFCLKDIV_DIV_SHIFT)) & CLKCTL0_FLEXSPIFCLKDIV_DIV_MASK)\r\n\r\n#define CLKCTL0_FLEXSPIFCLKDIV_RESET_MASK        (0x20000000U)\r\n#define CLKCTL0_FLEXSPIFCLKDIV_RESET_SHIFT       (29U)\r\n/*! RESET - Resets the divider counter. Can be used to make sure a new divider value is used right\r\n *    away rather than completing the previous count\r\n */\r\n#define CLKCTL0_FLEXSPIFCLKDIV_RESET(x)          (((uint32_t)(((uint32_t)(x)) << CLKCTL0_FLEXSPIFCLKDIV_RESET_SHIFT)) & CLKCTL0_FLEXSPIFCLKDIV_RESET_MASK)\r\n\r\n#define CLKCTL0_FLEXSPIFCLKDIV_HALT_MASK         (0x40000000U)\r\n#define CLKCTL0_FLEXSPIFCLKDIV_HALT_SHIFT        (30U)\r\n/*! HALT - Halts the divider counter. The intent is to allow the divider clock source to be changed\r\n *    without the risk of a glitch at the output\r\n */\r\n#define CLKCTL0_FLEXSPIFCLKDIV_HALT(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL0_FLEXSPIFCLKDIV_HALT_SHIFT)) & CLKCTL0_FLEXSPIFCLKDIV_HALT_MASK)\r\n\r\n#define CLKCTL0_FLEXSPIFCLKDIV_REQFLAG_MASK      (0x80000000U)\r\n#define CLKCTL0_FLEXSPIFCLKDIV_REQFLAG_SHIFT     (31U)\r\n/*! REQFLAG - Divider status flag. Set when a change is made to the divider value, cleared when the\r\n *    change is complete. The clock being divided must be running for this status to change\r\n */\r\n#define CLKCTL0_FLEXSPIFCLKDIV_REQFLAG(x)        (((uint32_t)(((uint32_t)(x)) << CLKCTL0_FLEXSPIFCLKDIV_REQFLAG_SHIFT)) & CLKCTL0_FLEXSPIFCLKDIV_REQFLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCTFCLKSEL - SCT FCLK selection */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_SCTFCLKSEL_SEL_MASK              (0x7U)\r\n#define CLKCTL0_SCTFCLKSEL_SEL_SHIFT             (0U)\r\n/*! SEL - SCT Functional Clock Source Selection\r\n *  0b000..Main Clock\r\n *  0b001..Main PLL Clock (main_pll_clk).\r\n *  0b010..AUX0 PLL clock (aux0_pll_clk).\r\n *  0b011..FFRO Clock (48/60m_irc).\r\n *  0b100..AUX1 PLL clock (aux1_pll_clk).\r\n *  0b101..Audio PLL Clock (audio_pll_clk).\r\n *  0b110..Reserved\r\n *  0b111..None, this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL0_SCTFCLKSEL_SEL(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL0_SCTFCLKSEL_SEL_SHIFT)) & CLKCTL0_SCTFCLKSEL_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCTFCLKDIV - SCT FCLK divider */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_SCTFCLKDIV_DIV_MASK              (0xFFU)\r\n#define CLKCTL0_SCTFCLKDIV_DIV_SHIFT             (0U)\r\n/*! DIV - Clock Divider Value Selection: 0: Divide by 1... 255: Divide by 256 */\r\n#define CLKCTL0_SCTFCLKDIV_DIV(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL0_SCTFCLKDIV_DIV_SHIFT)) & CLKCTL0_SCTFCLKDIV_DIV_MASK)\r\n\r\n#define CLKCTL0_SCTFCLKDIV_RESET_MASK            (0x20000000U)\r\n#define CLKCTL0_SCTFCLKDIV_RESET_SHIFT           (29U)\r\n/*! RESET - Resets the divider counter. Can be used to make sure a new divider value is used right\r\n *    away rather than completing the previous count\r\n */\r\n#define CLKCTL0_SCTFCLKDIV_RESET(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_SCTFCLKDIV_RESET_SHIFT)) & CLKCTL0_SCTFCLKDIV_RESET_MASK)\r\n\r\n#define CLKCTL0_SCTFCLKDIV_HALT_MASK             (0x40000000U)\r\n#define CLKCTL0_SCTFCLKDIV_HALT_SHIFT            (30U)\r\n/*! HALT - Halts the divider counter. The intent is to allow the divider clock source to be changed\r\n *    without the risk of a glitch at the output\r\n */\r\n#define CLKCTL0_SCTFCLKDIV_HALT(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_SCTFCLKDIV_HALT_SHIFT)) & CLKCTL0_SCTFCLKDIV_HALT_MASK)\r\n\r\n#define CLKCTL0_SCTFCLKDIV_REQFLAG_MASK          (0x80000000U)\r\n#define CLKCTL0_SCTFCLKDIV_REQFLAG_SHIFT         (31U)\r\n/*! REQFLAG - Divider status flag. Set when a change is made to the divider value, cleared when the\r\n *    change is complete. The clock being divided must be running for this status to change\r\n */\r\n#define CLKCTL0_SCTFCLKDIV_REQFLAG(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL0_SCTFCLKDIV_REQFLAG_SHIFT)) & CLKCTL0_SCTFCLKDIV_REQFLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name UTICKFCLKSEL - UTICK FCLK selection */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_UTICKFCLKSEL_SEL_MASK            (0x7U)\r\n#define CLKCTL0_UTICKFCLKSEL_SEL_SHIFT           (0U)\r\n/*! SEL - UTICK Functional Clock Source Selection\r\n *  0b000..1m_lposc\r\n *  0b001..Main Clock\r\n *  0b010..Reserved\r\n *  0b011..Reserved\r\n *  0b100..Reserved\r\n *  0b101..Reserved\r\n *  0b110..Reserved\r\n *  0b111..None, this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL0_UTICKFCLKSEL_SEL(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_UTICKFCLKSEL_SEL_SHIFT)) & CLKCTL0_UTICKFCLKSEL_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name WDT0FCLKSEL - WDT clock selection */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_WDT0FCLKSEL_SEL_MASK             (0x7U)\r\n#define CLKCTL0_WDT0FCLKSEL_SEL_SHIFT            (0U)\r\n/*! SEL - WDT0 Functional Clock Source Selection\r\n *  0b000..1m_lposc\r\n *  0b001..Main Clock\r\n *  0b010..Reserved\r\n *  0b011..Reserved\r\n *  0b100..Reserved\r\n *  0b101..Reserved\r\n *  0b110..Reserved\r\n *  0b111..None, this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL0_WDT0FCLKSEL_SEL(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_WDT0FCLKSEL_SEL_SHIFT)) & CLKCTL0_WDT0FCLKSEL_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSTICKFCLKSEL - System tick FCLK selection */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_SYSTICKFCLKSEL_SEL_MASK          (0x7U)\r\n#define CLKCTL0_SYSTICKFCLKSEL_SEL_SHIFT         (0U)\r\n/*! SEL - SYSTICK Functional Clock Source Selection\r\n *  0b000..Systick Divider Output Clock\r\n *  0b001..1m_lposc\r\n *  0b010..32 kHz Clock\r\n *  0b011..SFRO Clock (16m_irc).\r\n *  0b100..Reserved\r\n *  0b101..Reserved\r\n *  0b110..Reserved\r\n *  0b111..None, this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL0_SYSTICKFCLKSEL_SEL(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL0_SYSTICKFCLKSEL_SEL_SHIFT)) & CLKCTL0_SYSTICKFCLKSEL_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSTICKFCLKDIV - System tick FCLK divider */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_SYSTICKFCLKDIV_DIV_MASK          (0xFFU)\r\n#define CLKCTL0_SYSTICKFCLKDIV_DIV_SHIFT         (0U)\r\n/*! DIV - Clock Divider Value Selection: 0: Divide by 1... 255: Divide by 256 */\r\n#define CLKCTL0_SYSTICKFCLKDIV_DIV(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL0_SYSTICKFCLKDIV_DIV_SHIFT)) & CLKCTL0_SYSTICKFCLKDIV_DIV_MASK)\r\n\r\n#define CLKCTL0_SYSTICKFCLKDIV_RESET_MASK        (0x20000000U)\r\n#define CLKCTL0_SYSTICKFCLKDIV_RESET_SHIFT       (29U)\r\n/*! RESET - Resets the divider counter. Can be used to make sure a new divider value is used right\r\n *    away rather than completing the previous count\r\n */\r\n#define CLKCTL0_SYSTICKFCLKDIV_RESET(x)          (((uint32_t)(((uint32_t)(x)) << CLKCTL0_SYSTICKFCLKDIV_RESET_SHIFT)) & CLKCTL0_SYSTICKFCLKDIV_RESET_MASK)\r\n\r\n#define CLKCTL0_SYSTICKFCLKDIV_HALT_MASK         (0x40000000U)\r\n#define CLKCTL0_SYSTICKFCLKDIV_HALT_SHIFT        (30U)\r\n/*! HALT - Halts the divider counter. The intent is to allow the divider clock source to be changed\r\n *    without the risk of a glitch at the output\r\n */\r\n#define CLKCTL0_SYSTICKFCLKDIV_HALT(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL0_SYSTICKFCLKDIV_HALT_SHIFT)) & CLKCTL0_SYSTICKFCLKDIV_HALT_MASK)\r\n\r\n#define CLKCTL0_SYSTICKFCLKDIV_REQFLAG_MASK      (0x80000000U)\r\n#define CLKCTL0_SYSTICKFCLKDIV_REQFLAG_SHIFT     (31U)\r\n/*! REQFLAG - Divider status flag. Set when a change is made to the divider value, cleared when the\r\n *    change is complete. The clock being divided must be running for this status to change\r\n */\r\n#define CLKCTL0_SYSTICKFCLKDIV_REQFLAG(x)        (((uint32_t)(((uint32_t)(x)) << CLKCTL0_SYSTICKFCLKDIV_REQFLAG_SHIFT)) & CLKCTL0_SYSTICKFCLKDIV_REQFLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name LCDFCLKDIV - Lcd FCLK divider */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_LCDFCLKDIV_DIV_MASK              (0xFFU)\r\n#define CLKCTL0_LCDFCLKDIV_DIV_SHIFT             (0U)\r\n/*! DIV - Clock Divider Value Selection: 0: Divide by 1... 255: Divide by 256 */\r\n#define CLKCTL0_LCDFCLKDIV_DIV(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL0_LCDFCLKDIV_DIV_SHIFT)) & CLKCTL0_LCDFCLKDIV_DIV_MASK)\r\n\r\n#define CLKCTL0_LCDFCLKDIV_RESET_MASK            (0x20000000U)\r\n#define CLKCTL0_LCDFCLKDIV_RESET_SHIFT           (29U)\r\n/*! RESET - Resets the divider counter. Can be used to make sure a new divider value is used right\r\n *    away rather than completing the previous count\r\n */\r\n#define CLKCTL0_LCDFCLKDIV_RESET(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_LCDFCLKDIV_RESET_SHIFT)) & CLKCTL0_LCDFCLKDIV_RESET_MASK)\r\n\r\n#define CLKCTL0_LCDFCLKDIV_HALT_MASK             (0x40000000U)\r\n#define CLKCTL0_LCDFCLKDIV_HALT_SHIFT            (30U)\r\n/*! HALT - Halts the divider counter. The intent is to allow the divider clock source to be changed\r\n *    without the risk of a glitch at the output\r\n */\r\n#define CLKCTL0_LCDFCLKDIV_HALT(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_LCDFCLKDIV_HALT_SHIFT)) & CLKCTL0_LCDFCLKDIV_HALT_MASK)\r\n\r\n#define CLKCTL0_LCDFCLKDIV_REQFLAG_MASK          (0x80000000U)\r\n#define CLKCTL0_LCDFCLKDIV_REQFLAG_SHIFT         (31U)\r\n/*! REQFLAG - Divider status flag. Set when a change is made to the divider value, cleared when the\r\n *    change is complete. The clock being divided must be running for this status to change\r\n */\r\n#define CLKCTL0_LCDFCLKDIV_REQFLAG(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL0_LCDFCLKDIV_REQFLAG_SHIFT)) & CLKCTL0_LCDFCLKDIV_REQFLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name GAUFCLKDIV - Gau FCLK divider */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_GAUFCLKDIV_DIV_MASK              (0xFFU)\r\n#define CLKCTL0_GAUFCLKDIV_DIV_SHIFT             (0U)\r\n/*! DIV - Clock Divider Value Selection: 0: Divide by 1... 255: Divide by 256 */\r\n#define CLKCTL0_GAUFCLKDIV_DIV(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL0_GAUFCLKDIV_DIV_SHIFT)) & CLKCTL0_GAUFCLKDIV_DIV_MASK)\r\n\r\n#define CLKCTL0_GAUFCLKDIV_RESET_MASK            (0x20000000U)\r\n#define CLKCTL0_GAUFCLKDIV_RESET_SHIFT           (29U)\r\n/*! RESET - Resets the divider counter. Can be used to make sure a new divider value is used right\r\n *    away rather than completing the previous count\r\n */\r\n#define CLKCTL0_GAUFCLKDIV_RESET(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_GAUFCLKDIV_RESET_SHIFT)) & CLKCTL0_GAUFCLKDIV_RESET_MASK)\r\n\r\n#define CLKCTL0_GAUFCLKDIV_HALT_MASK             (0x40000000U)\r\n#define CLKCTL0_GAUFCLKDIV_HALT_SHIFT            (30U)\r\n/*! HALT - Halts the divider counter. The intent is to allow the divider clock source to be changed\r\n *    without the risk of a glitch at the output\r\n */\r\n#define CLKCTL0_GAUFCLKDIV_HALT(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_GAUFCLKDIV_HALT_SHIFT)) & CLKCTL0_GAUFCLKDIV_HALT_MASK)\r\n\r\n#define CLKCTL0_GAUFCLKDIV_REQFLAG_MASK          (0x80000000U)\r\n#define CLKCTL0_GAUFCLKDIV_REQFLAG_SHIFT         (31U)\r\n/*! REQFLAG - Divider status flag. Set when a change is made to the divider value, cleared when the\r\n *    change is complete. The clock being divided must be running for this status to change\r\n */\r\n#define CLKCTL0_GAUFCLKDIV_REQFLAG(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL0_GAUFCLKDIV_REQFLAG_SHIFT)) & CLKCTL0_GAUFCLKDIV_REQFLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name USIMFCLKDIV - Usim FCLK divider */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_USIMFCLKDIV_DIV_MASK             (0xFFU)\r\n#define CLKCTL0_USIMFCLKDIV_DIV_SHIFT            (0U)\r\n/*! DIV - Clock Divider Value Selection: 0: Divide by 1... 255: Divide by 256 */\r\n#define CLKCTL0_USIMFCLKDIV_DIV(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_USIMFCLKDIV_DIV_SHIFT)) & CLKCTL0_USIMFCLKDIV_DIV_MASK)\r\n\r\n#define CLKCTL0_USIMFCLKDIV_RESET_MASK           (0x20000000U)\r\n#define CLKCTL0_USIMFCLKDIV_RESET_SHIFT          (29U)\r\n/*! RESET - Resets the divider counter. Can be used to make sure a new divider value is used right\r\n *    away rather than completing the previous count\r\n */\r\n#define CLKCTL0_USIMFCLKDIV_RESET(x)             (((uint32_t)(((uint32_t)(x)) << CLKCTL0_USIMFCLKDIV_RESET_SHIFT)) & CLKCTL0_USIMFCLKDIV_RESET_MASK)\r\n\r\n#define CLKCTL0_USIMFCLKDIV_HALT_MASK            (0x40000000U)\r\n#define CLKCTL0_USIMFCLKDIV_HALT_SHIFT           (30U)\r\n/*! HALT - Halts the divider counter. The intent is to allow the divider clock source to be changed\r\n *    without the risk of a glitch at the output\r\n */\r\n#define CLKCTL0_USIMFCLKDIV_HALT(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_USIMFCLKDIV_HALT_SHIFT)) & CLKCTL0_USIMFCLKDIV_HALT_MASK)\r\n\r\n#define CLKCTL0_USIMFCLKDIV_REQFLAG_MASK         (0x80000000U)\r\n#define CLKCTL0_USIMFCLKDIV_REQFLAG_SHIFT        (31U)\r\n/*! REQFLAG - Divider status flag. Set when a change is made to the divider value, cleared when the\r\n *    change is complete. The clock being divided must be running for this status to change\r\n */\r\n#define CLKCTL0_USIMFCLKDIV_REQFLAG(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL0_USIMFCLKDIV_REQFLAG_SHIFT)) & CLKCTL0_USIMFCLKDIV_REQFLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name USIMFCLKSEL - USIM FCLK selection */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_USIMFCLKSEL_SEL_MASK             (0x7U)\r\n#define CLKCTL0_USIMFCLKSEL_SEL_SHIFT            (0U)\r\n/*! SEL - USIM Functional Clock Source Selection\r\n *  0b000..Main Clock\r\n *  0b001..Audio PLL Clock (audio_pll_clk).\r\n *  0b010..FFRO clock\r\n *  0b011..Reserved\r\n *  0b100..Reserved\r\n *  0b101..Reserved\r\n *  0b110..Reserved\r\n *  0b111..None, this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL0_USIMFCLKSEL_SEL(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_USIMFCLKSEL_SEL_SHIFT)) & CLKCTL0_USIMFCLKSEL_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name LCDFCLKSEL - LCD FCLK selection */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_LCDFCLKSEL_SEL_MASK              (0x7U)\r\n#define CLKCTL0_LCDFCLKSEL_SEL_SHIFT             (0U)\r\n/*! SEL - LCD Functional Clock Source Selection\r\n *  0b000..Main Clock\r\n *  0b001..t3pll_mci_flexspi_clk\r\n *  0b010..tcpu_mci_flexspi_clk\r\n *  0b011..tddr_mci_flexspi_clk\r\n *  0b100..Reserved\r\n *  0b101..Reserved\r\n *  0b110..Reserved\r\n *  0b111..None, this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL0_LCDFCLKSEL_SEL(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL0_LCDFCLKSEL_SEL_SHIFT)) & CLKCTL0_LCDFCLKSEL_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name GAUFCLKSEL - GAU FCLK selection */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_GAUFCLKSEL_SEL_MASK              (0x3U)\r\n#define CLKCTL0_GAUFCLKSEL_SEL_SHIFT             (0U)\r\n/*! SEL - GAU Functional Clock Source Selection\r\n *  0b00..Main Clock\r\n *  0b01..t3pll_mci_256m\r\n *  0b10..avpll_ch2_CLKOUT--64MHz\r\n *  0b11..None, this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL0_GAUFCLKSEL_SEL(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL0_GAUFCLKSEL_SEL_SHIFT)) & CLKCTL0_GAUFCLKSEL_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name PMUFCLKDIV - Pmu FCLK divider */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_PMUFCLKDIV_DIV_MASK              (0xFFU)\r\n#define CLKCTL0_PMUFCLKDIV_DIV_SHIFT             (0U)\r\n/*! DIV - Clock Divider Value Selection: 0: Divide by 1... 255: Divide by 256 */\r\n#define CLKCTL0_PMUFCLKDIV_DIV(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PMUFCLKDIV_DIV_SHIFT)) & CLKCTL0_PMUFCLKDIV_DIV_MASK)\r\n\r\n#define CLKCTL0_PMUFCLKDIV_RESET_MASK            (0x20000000U)\r\n#define CLKCTL0_PMUFCLKDIV_RESET_SHIFT           (29U)\r\n/*! RESET - Resets the divider counter. Can be used to make sure a new divider value is used right\r\n *    away rather than completing the previous count\r\n */\r\n#define CLKCTL0_PMUFCLKDIV_RESET(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PMUFCLKDIV_RESET_SHIFT)) & CLKCTL0_PMUFCLKDIV_RESET_MASK)\r\n\r\n#define CLKCTL0_PMUFCLKDIV_HALT_MASK             (0x40000000U)\r\n#define CLKCTL0_PMUFCLKDIV_HALT_SHIFT            (30U)\r\n/*! HALT - Halts the divider counter. The intent is to allow the divider clock source to be changed\r\n *    without the risk of a glitch at the output\r\n */\r\n#define CLKCTL0_PMUFCLKDIV_HALT(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PMUFCLKDIV_HALT_SHIFT)) & CLKCTL0_PMUFCLKDIV_HALT_MASK)\r\n\r\n#define CLKCTL0_PMUFCLKDIV_REQFLAG_MASK          (0x80000000U)\r\n#define CLKCTL0_PMUFCLKDIV_REQFLAG_SHIFT         (31U)\r\n/*! REQFLAG - Divider status flag. Set when a change is made to the divider value, cleared when the\r\n *    change is complete. The clock being divided must be running for this status to change\r\n */\r\n#define CLKCTL0_PMUFCLKDIV_REQFLAG(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL0_PMUFCLKDIV_REQFLAG_SHIFT)) & CLKCTL0_PMUFCLKDIV_REQFLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name BRG_CLK_EN - wl/ble/soc bridge clock enable signal */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_BRG_CLK_EN_WL_MASK               (0x1U)\r\n#define CLKCTL0_BRG_CLK_EN_WL_SHIFT              (0U)\r\n/*! WL - 1:enable, clock running 0:disable, clock gated */\r\n#define CLKCTL0_BRG_CLK_EN_WL(x)                 (((uint32_t)(((uint32_t)(x)) << CLKCTL0_BRG_CLK_EN_WL_SHIFT)) & CLKCTL0_BRG_CLK_EN_WL_MASK)\r\n\r\n#define CLKCTL0_BRG_CLK_EN_BLE_MASK              (0x2U)\r\n#define CLKCTL0_BRG_CLK_EN_BLE_SHIFT             (1U)\r\n/*! BLE - 1:enable, clock running 0:disable, clock gated */\r\n#define CLKCTL0_BRG_CLK_EN_BLE(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL0_BRG_CLK_EN_BLE_SHIFT)) & CLKCTL0_BRG_CLK_EN_BLE_MASK)\r\n\r\n#define CLKCTL0_BRG_CLK_EN_SOC_MASK              (0x4U)\r\n#define CLKCTL0_BRG_CLK_EN_SOC_SHIFT             (2U)\r\n/*! SOC - 1:enable, clock running 0:disable, clock gated */\r\n#define CLKCTL0_BRG_CLK_EN_SOC(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL0_BRG_CLK_EN_SOC_SHIFT)) & CLKCTL0_BRG_CLK_EN_SOC_MASK)\r\n/*! @} */\r\n\r\n/*! @name G2BIST_CLK_EN - g2bist clock enable signal */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_G2BIST_CLK_EN_VALUE_MASK         (0x1U)\r\n#define CLKCTL0_G2BIST_CLK_EN_VALUE_SHIFT        (0U)\r\n/*! VALUE - 1:enable, g2bist_clk running 0:disable, g2bist_clk gated */\r\n#define CLKCTL0_G2BIST_CLK_EN_VALUE(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL0_G2BIST_CLK_EN_VALUE_SHIFT)) & CLKCTL0_G2BIST_CLK_EN_VALUE_MASK)\r\n/*! @} */\r\n\r\n/*! @name MAIN_RAM_CLK_EN - main ram clock enable signal */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY0_MASK      (0x1U)\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY0_SHIFT     (0U)\r\n/*! ARRAY0 - 1:enable, main ram array0 clock running 0:disable, main ram array0 clock gated */\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY0(x)        (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAIN_RAM_CLK_EN_ARRAY0_SHIFT)) & CLKCTL0_MAIN_RAM_CLK_EN_ARRAY0_MASK)\r\n\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY1_MASK      (0x2U)\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY1_SHIFT     (1U)\r\n/*! ARRAY1 - 1:enable, main ram array1 clock running 0:disable, main ram array0 clock gated */\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY1(x)        (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAIN_RAM_CLK_EN_ARRAY1_SHIFT)) & CLKCTL0_MAIN_RAM_CLK_EN_ARRAY1_MASK)\r\n\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY2_MASK      (0x4U)\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY2_SHIFT     (2U)\r\n/*! ARRAY2 - 1:enable, main ram array2 clock running 0:disable, main ram array0 clock gated */\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY2(x)        (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAIN_RAM_CLK_EN_ARRAY2_SHIFT)) & CLKCTL0_MAIN_RAM_CLK_EN_ARRAY2_MASK)\r\n\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY3_MASK      (0x8U)\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY3_SHIFT     (3U)\r\n/*! ARRAY3 - 1:enable, main ram array3 clock running 0:disable, main ram array0 clock gated */\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY3(x)        (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAIN_RAM_CLK_EN_ARRAY3_SHIFT)) & CLKCTL0_MAIN_RAM_CLK_EN_ARRAY3_MASK)\r\n\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY4_MASK      (0x10U)\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY4_SHIFT     (4U)\r\n/*! ARRAY4 - 1:enable, main ram array4 clock running 0:disable, main ram array0 clock gated */\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY4(x)        (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAIN_RAM_CLK_EN_ARRAY4_SHIFT)) & CLKCTL0_MAIN_RAM_CLK_EN_ARRAY4_MASK)\r\n\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY5_MASK      (0x20U)\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY5_SHIFT     (5U)\r\n/*! ARRAY5 - 1:enable, main ram array5 clock running 0:disable, main ram array0 clock gated */\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY5(x)        (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAIN_RAM_CLK_EN_ARRAY5_SHIFT)) & CLKCTL0_MAIN_RAM_CLK_EN_ARRAY5_MASK)\r\n\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY6_MASK      (0x40U)\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY6_SHIFT     (6U)\r\n/*! ARRAY6 - 1:enable, main ram array6 clock running 0:disable, main ram array0 clock gated */\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY6(x)        (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAIN_RAM_CLK_EN_ARRAY6_SHIFT)) & CLKCTL0_MAIN_RAM_CLK_EN_ARRAY6_MASK)\r\n\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY7_MASK      (0x80U)\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY7_SHIFT     (7U)\r\n/*! ARRAY7 - 1:enable, main ram array7 clock running 0:disable, main ram array0 clock gated */\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY7(x)        (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAIN_RAM_CLK_EN_ARRAY7_SHIFT)) & CLKCTL0_MAIN_RAM_CLK_EN_ARRAY7_MASK)\r\n\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY8_MASK      (0x100U)\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY8_SHIFT     (8U)\r\n/*! ARRAY8 - 1:enable, main ram array8 clock running 0:disable, main ram array0 clock gated */\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY8(x)        (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAIN_RAM_CLK_EN_ARRAY8_SHIFT)) & CLKCTL0_MAIN_RAM_CLK_EN_ARRAY8_MASK)\r\n\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY9_MASK      (0x200U)\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY9_SHIFT     (9U)\r\n/*! ARRAY9 - 1:enable, main ram array9 clock running 0:disable, main ram array0 clock gated */\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY9(x)        (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAIN_RAM_CLK_EN_ARRAY9_SHIFT)) & CLKCTL0_MAIN_RAM_CLK_EN_ARRAY9_MASK)\r\n\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY10_MASK     (0x400U)\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY10_SHIFT    (10U)\r\n/*! ARRAY10 - 1:enable, main ram array10 clock running 0:disable, main ram array0 clock gated */\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY10(x)       (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAIN_RAM_CLK_EN_ARRAY10_SHIFT)) & CLKCTL0_MAIN_RAM_CLK_EN_ARRAY10_MASK)\r\n\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY11_MASK     (0x800U)\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY11_SHIFT    (11U)\r\n/*! ARRAY11 - 1:enable, main ram array11 clock running 0:disable, main ram array0 clock gated */\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY11(x)       (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAIN_RAM_CLK_EN_ARRAY11_SHIFT)) & CLKCTL0_MAIN_RAM_CLK_EN_ARRAY11_MASK)\r\n\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY12_MASK     (0x1000U)\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY12_SHIFT    (12U)\r\n/*! ARRAY12 - 1:enable, main ram array12 clock running 0:disable, main ram array0 clock gated */\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY12(x)       (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAIN_RAM_CLK_EN_ARRAY12_SHIFT)) & CLKCTL0_MAIN_RAM_CLK_EN_ARRAY12_MASK)\r\n\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY13_MASK     (0x2000U)\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY13_SHIFT    (13U)\r\n/*! ARRAY13 - 1:enable, main ram array13 clock running 0:disable, main ram array0 clock gated */\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY13(x)       (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAIN_RAM_CLK_EN_ARRAY13_SHIFT)) & CLKCTL0_MAIN_RAM_CLK_EN_ARRAY13_MASK)\r\n\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY14_MASK     (0x4000U)\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY14_SHIFT    (14U)\r\n/*! ARRAY14 - 1:enable, main ram array14 clock running 0:disable, main ram array0 clock gated */\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY14(x)       (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAIN_RAM_CLK_EN_ARRAY14_SHIFT)) & CLKCTL0_MAIN_RAM_CLK_EN_ARRAY14_MASK)\r\n\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY15_MASK     (0x8000U)\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY15_SHIFT    (15U)\r\n/*! ARRAY15 - 1:enable, main ram array15 clock running 0:disable, main ram array0 clock gated */\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY15(x)       (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAIN_RAM_CLK_EN_ARRAY15_SHIFT)) & CLKCTL0_MAIN_RAM_CLK_EN_ARRAY15_MASK)\r\n\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY16_MASK     (0x10000U)\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY16_SHIFT    (16U)\r\n/*! ARRAY16 - 1:enable, main ram array16 clock running 0:disable, main ram array0 clock gated */\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY16(x)       (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAIN_RAM_CLK_EN_ARRAY16_SHIFT)) & CLKCTL0_MAIN_RAM_CLK_EN_ARRAY16_MASK)\r\n\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY17_MASK     (0x20000U)\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY17_SHIFT    (17U)\r\n/*! ARRAY17 - 1:enable, main ram array17 clock running 0:disable, main ram array0 clock gated */\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY17(x)       (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAIN_RAM_CLK_EN_ARRAY17_SHIFT)) & CLKCTL0_MAIN_RAM_CLK_EN_ARRAY17_MASK)\r\n\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY18_MASK     (0x40000U)\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY18_SHIFT    (18U)\r\n/*! ARRAY18 - 1:enable, main ram array18 clock running 0:disable, main ram array0 clock gated */\r\n#define CLKCTL0_MAIN_RAM_CLK_EN_ARRAY18(x)       (((uint32_t)(((uint32_t)(x)) << CLKCTL0_MAIN_RAM_CLK_EN_ARRAY18_SHIFT)) & CLKCTL0_MAIN_RAM_CLK_EN_ARRAY18_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_GDET_CLK_SEL - ELS GDET CLK selection */\r\n/*! @{ */\r\n\r\n#define CLKCTL0_ELS_GDET_CLK_SEL_SEL_MASK        (0x7U)\r\n#define CLKCTL0_ELS_GDET_CLK_SEL_SEL_SHIFT       (0U)\r\n/*! SEL - ELS GDET Clock Source Selection\r\n *  0b000..t3pll_mci_256m:256Mhz\r\n *  0b001..t3pll_mci_256m/2:128Mhz\r\n *  0b010..t3pll_mci_256m/4:64Mhz\r\n *  0b011..t3pll_mci_256m/8:32Mhz\r\n *  0b100..reserved\r\n *  0b101..reserved\r\n *  0b110..reserved\r\n *  0b111..None, this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL0_ELS_GDET_CLK_SEL_SEL(x)          (((uint32_t)(((uint32_t)(x)) << CLKCTL0_ELS_GDET_CLK_SEL_SEL_SHIFT)) & CLKCTL0_ELS_GDET_CLK_SEL_SEL_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group CLKCTL0_Register_Masks */\r\n\r\n\r\n/* CLKCTL0 - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral CLKCTL0 base address */\r\n  #define CLKCTL0_BASE                             (0x50001000u)\r\n  /** Peripheral CLKCTL0 base address */\r\n  #define CLKCTL0_BASE_NS                          (0x40001000u)\r\n  /** Peripheral CLKCTL0 base pointer */\r\n  #define CLKCTL0                                  ((CLKCTL0_Type *)CLKCTL0_BASE)\r\n  /** Peripheral CLKCTL0 base pointer */\r\n  #define CLKCTL0_NS                               ((CLKCTL0_Type *)CLKCTL0_BASE_NS)\r\n  /** Array initializer of CLKCTL0 peripheral base addresses */\r\n  #define CLKCTL0_BASE_ADDRS                       { CLKCTL0_BASE }\r\n  /** Array initializer of CLKCTL0 peripheral base pointers */\r\n  #define CLKCTL0_BASE_PTRS                        { CLKCTL0 }\r\n  /** Array initializer of CLKCTL0 peripheral base addresses */\r\n  #define CLKCTL0_BASE_ADDRS_NS                    { CLKCTL0_BASE_NS }\r\n  /** Array initializer of CLKCTL0 peripheral base pointers */\r\n  #define CLKCTL0_BASE_PTRS_NS                     { CLKCTL0_NS }\r\n#else\r\n  /** Peripheral CLKCTL0 base address */\r\n  #define CLKCTL0_BASE                             (0x40001000u)\r\n  /** Peripheral CLKCTL0 base pointer */\r\n  #define CLKCTL0                                  ((CLKCTL0_Type *)CLKCTL0_BASE)\r\n  /** Array initializer of CLKCTL0 peripheral base addresses */\r\n  #define CLKCTL0_BASE_ADDRS                       { CLKCTL0_BASE }\r\n  /** Array initializer of CLKCTL0 peripheral base pointers */\r\n  #define CLKCTL0_BASE_PTRS                        { CLKCTL0 }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group CLKCTL0_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- CLKCTL1 Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup CLKCTL1_Peripheral_Access_Layer CLKCTL1 Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** CLKCTL1 - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[16];\r\n  __IO uint32_t PSCCTL0;                           /**< Peripheral clock control 0, offset: 0x10 */\r\n  __IO uint32_t PSCCTL1;                           /**< Peripheral clock control 1, offset: 0x14 */\r\n  __IO uint32_t PSCCTL2;                           /**< Peripheral clock control 2, offset: 0x18 */\r\n       uint8_t RESERVED_1[36];\r\n  __O  uint32_t PSCCTL0_SET;                       /**< Peripheral clock set 0, offset: 0x40 */\r\n  __O  uint32_t PSCCTL1_SET;                       /**< Peripheral clock set 1, offset: 0x44 */\r\n  __O  uint32_t PSCCTL2_SET;                       /**< Peripheral clock set 2, offset: 0x48 */\r\n       uint8_t RESERVED_2[36];\r\n  __O  uint32_t PSCCTL0_CLR;                       /**< Peripheral clock clear 0, offset: 0x70 */\r\n  __O  uint32_t PSCCTL1_CLR;                       /**< Peripheral clock clear 1, offset: 0x74 */\r\n  __O  uint32_t PSCCTL2_CLR;                       /**< Peripheral clock clear 2, offset: 0x78 */\r\n       uint8_t RESERVED_3[452];\r\n  __IO uint32_t AUDIOPLLCLKDIV;                    /**< Audio PLL0 clock divider, offset: 0x240 */\r\n       uint8_t RESERVED_4[572];\r\n  __IO uint32_t OSEVENTFCLKSEL;                    /**< OS EVENT clock selection, offset: 0x480 */\r\n       uint8_t RESERVED_5[124];\r\n  struct {                                         /* offset: 0x500, array step: 0x20 */\r\n    __IO uint32_t FRGCLKSEL;                         /**< FRG clock selection 0..FRG clock selection 3, array offset: 0x500, array step: 0x20 */\r\n    __IO uint32_t FRGCTL;                            /**< FRG clock controller 0..FRG clock controller 3, array offset: 0x504, array step: 0x20 */\r\n    __IO uint32_t FCFCLKSEL;                         /**< Flexcomm Interface clock selection 0..Flexcomm Interface clock selection 3, array offset: 0x508, array step: 0x20 */\r\n         uint8_t RESERVED_0[20];\r\n  } FLEXCOMM[4];\r\n       uint8_t RESERVED_6[320];\r\n  __IO uint32_t FRG14CLKSEL;                       /**< FRG clock selection 14, offset: 0x6C0 */\r\n  __IO uint32_t FRG14CTL;                          /**< FRG clock controller 14, offset: 0x6C4 */\r\n  __IO uint32_t FC14FCLKSEL;                       /**< Flexcomm Interface clock selection 14, offset: 0x6C8 */\r\n       uint8_t RESERVED_7[48];\r\n  __IO uint32_t FRGPLLCLKDIV;                      /**< FRG PLL clock divider, offset: 0x6FC */\r\n  __IO uint32_t DMIC0FCLKSEL;                      /**< DMIC0 clock selection, offset: 0x700 */\r\n  __IO uint32_t DMIC0CLKDIV;                       /**< DMIC clock divider, offset: 0x704 */\r\n       uint8_t RESERVED_8[24];\r\n  __IO uint32_t CT32BITFCLKSEL[4];                 /**< Ct32bit timer 0 clock selection..Ct32bit timer 3 clock selection, array offset: 0x720, array step: 0x4 */\r\n       uint8_t RESERVED_9[16];\r\n  __IO uint32_t AUDIOMCLKSEL;                      /**< Audio MCLK selection, offset: 0x740 */\r\n  __IO uint32_t AUDIOMCLKDIV;                      /**< Audio MCLK divider, offset: 0x744 */\r\n       uint8_t RESERVED_10[24];\r\n  __IO uint32_t CLKOUTSEL0;                        /**< Clock out selection 0, offset: 0x760 */\r\n  __IO uint32_t CLKOUTSEL1;                        /**< Clock out selection 1, offset: 0x764 */\r\n  __IO uint32_t CLKOUTDIV;                         /**< Clock out divider, offset: 0x768 */\r\n  __IO uint32_t CLKOUTSEL2;                        /**< Clock out selection 2, offset: 0x76C */\r\n} CLKCTL1_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- CLKCTL1 Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup CLKCTL1_Register_Masks CLKCTL1 Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name PSCCTL0 - Peripheral clock control 0 */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_PSCCTL0_FC0_MASK                 (0x100U)\r\n#define CLKCTL1_PSCCTL0_FC0_SHIFT                (8U)\r\n/*! FC0 - fc0 clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL0_FC0(x)                   (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_FC0_SHIFT)) & CLKCTL1_PSCCTL0_FC0_MASK)\r\n\r\n#define CLKCTL1_PSCCTL0_FC1_MASK                 (0x200U)\r\n#define CLKCTL1_PSCCTL0_FC1_SHIFT                (9U)\r\n/*! FC1 - fc1 clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL0_FC1(x)                   (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_FC1_SHIFT)) & CLKCTL1_PSCCTL0_FC1_MASK)\r\n\r\n#define CLKCTL1_PSCCTL0_FC2_MASK                 (0x400U)\r\n#define CLKCTL1_PSCCTL0_FC2_SHIFT                (10U)\r\n/*! FC2 - fc2 clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL0_FC2(x)                   (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_FC2_SHIFT)) & CLKCTL1_PSCCTL0_FC2_MASK)\r\n\r\n#define CLKCTL1_PSCCTL0_FC3_MASK                 (0x800U)\r\n#define CLKCTL1_PSCCTL0_FC3_SHIFT                (11U)\r\n/*! FC3 - fc3 clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL0_FC3(x)                   (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_FC3_SHIFT)) & CLKCTL1_PSCCTL0_FC3_MASK)\r\n\r\n#define CLKCTL1_PSCCTL0_FC14_MASK                (0x400000U)\r\n#define CLKCTL1_PSCCTL0_FC14_SHIFT               (22U)\r\n/*! FC14 - fc14 clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL0_FC14(x)                  (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_FC14_SHIFT)) & CLKCTL1_PSCCTL0_FC14_MASK)\r\n\r\n#define CLKCTL1_PSCCTL0_DMIC0_MASK               (0x1000000U)\r\n#define CLKCTL1_PSCCTL0_DMIC0_SHIFT              (24U)\r\n/*! DMIC0 - dmic0 clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL0_DMIC0(x)                 (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_DMIC0_SHIFT)) & CLKCTL1_PSCCTL0_DMIC0_MASK)\r\n\r\n#define CLKCTL1_PSCCTL0_OSEVENTTIMER_MASK        (0x8000000U)\r\n#define CLKCTL1_PSCCTL0_OSEVENTTIMER_SHIFT       (27U)\r\n/*! OSEVENTTIMER - oseventtimer clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL0_OSEVENTTIMER(x)          (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_OSEVENTTIMER_SHIFT)) & CLKCTL1_PSCCTL0_OSEVENTTIMER_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSCCTL1 - Peripheral clock control 1 */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_PSCCTL1_HSGPIO0_MASK             (0x1U)\r\n#define CLKCTL1_PSCCTL1_HSGPIO0_SHIFT            (0U)\r\n/*! HSGPIO0 - hsgpio0 clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL1_HSGPIO0(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL1_HSGPIO0_SHIFT)) & CLKCTL1_PSCCTL1_HSGPIO0_MASK)\r\n\r\n#define CLKCTL1_PSCCTL1_HSGPIO1_MASK             (0x2U)\r\n#define CLKCTL1_PSCCTL1_HSGPIO1_SHIFT            (1U)\r\n/*! HSGPIO1 - hsgpio1 clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL1_HSGPIO1(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL1_HSGPIO1_SHIFT)) & CLKCTL1_PSCCTL1_HSGPIO1_MASK)\r\n\r\n#define CLKCTL1_PSCCTL1_CRC_MASK                 (0x10000U)\r\n#define CLKCTL1_PSCCTL1_CRC_SHIFT                (16U)\r\n/*! CRC - crc clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL1_CRC(x)                   (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL1_CRC_SHIFT)) & CLKCTL1_PSCCTL1_CRC_MASK)\r\n\r\n#define CLKCTL1_PSCCTL1_FREQME_MASK              (0x80000000U)\r\n#define CLKCTL1_PSCCTL1_FREQME_SHIFT             (31U)\r\n/*! FREQME - freqme clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL1_FREQME(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL1_FREQME_SHIFT)) & CLKCTL1_PSCCTL1_FREQME_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSCCTL2 - Peripheral clock control 2 */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_PSCCTL2_CT32B0_MASK              (0x1U)\r\n#define CLKCTL1_PSCCTL2_CT32B0_SHIFT             (0U)\r\n/*! CT32B0 - ct32b0 clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL2_CT32B0(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_CT32B0_SHIFT)) & CLKCTL1_PSCCTL2_CT32B0_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_CT32B1_MASK              (0x2U)\r\n#define CLKCTL1_PSCCTL2_CT32B1_SHIFT             (1U)\r\n/*! CT32B1 - ct32b1 clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL2_CT32B1(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_CT32B1_SHIFT)) & CLKCTL1_PSCCTL2_CT32B1_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_CT32B2_MASK              (0x4U)\r\n#define CLKCTL1_PSCCTL2_CT32B2_SHIFT             (2U)\r\n/*! CT32B2 - ct32b2 clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL2_CT32B2(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_CT32B2_SHIFT)) & CLKCTL1_PSCCTL2_CT32B2_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_CT32B3_MASK              (0x8U)\r\n#define CLKCTL1_PSCCTL2_CT32B3_SHIFT             (3U)\r\n/*! CT32B3 - ct32b3 clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL2_CT32B3(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_CT32B3_SHIFT)) & CLKCTL1_PSCCTL2_CT32B3_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_CT32B4_MASK              (0x10U)\r\n#define CLKCTL1_PSCCTL2_CT32B4_SHIFT             (4U)\r\n/*! CT32B4 - ct32b4 clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL2_CT32B4(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_CT32B4_SHIFT)) & CLKCTL1_PSCCTL2_CT32B4_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_PMU_MASK                 (0x40U)\r\n#define CLKCTL1_PSCCTL2_PMU_SHIFT                (6U)\r\n/*! PMU - pmu clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL2_PMU(x)                   (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_PMU_SHIFT)) & CLKCTL1_PSCCTL2_PMU_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_RTC_LITE_MASK            (0x80U)\r\n#define CLKCTL1_PSCCTL2_RTC_LITE_SHIFT           (7U)\r\n/*! RTC_LITE - rtc_lite clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL2_RTC_LITE(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_RTC_LITE_SHIFT)) & CLKCTL1_PSCCTL2_RTC_LITE_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_MRT_MASK                 (0x100U)\r\n#define CLKCTL1_PSCCTL2_MRT_SHIFT                (8U)\r\n/*! MRT - mrt clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL2_MRT(x)                   (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_MRT_SHIFT)) & CLKCTL1_PSCCTL2_MRT_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_GPIO_INT_MASK            (0x40000000U)\r\n#define CLKCTL1_PSCCTL2_GPIO_INT_SHIFT           (30U)\r\n/*! GPIO_INT - gpio_int clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL2_GPIO_INT(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_GPIO_INT_SHIFT)) & CLKCTL1_PSCCTL2_GPIO_INT_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_PMUX_MASK                (0x80000000U)\r\n#define CLKCTL1_PSCCTL2_PMUX_SHIFT               (31U)\r\n/*! PMUX - pmux clock control\r\n *  0b0..Disable clock\r\n *  0b1..Enable clock\r\n */\r\n#define CLKCTL1_PSCCTL2_PMUX(x)                  (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_PMUX_SHIFT)) & CLKCTL1_PSCCTL2_PMUX_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSCCTL0_SET - Peripheral clock set 0 */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_PSCCTL0_SET_FC0_MASK             (0x100U)\r\n#define CLKCTL1_PSCCTL0_SET_FC0_SHIFT            (8U)\r\n/*! FC0 - fc0 clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL1_PSCCTL0_SET_FC0(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_SET_FC0_SHIFT)) & CLKCTL1_PSCCTL0_SET_FC0_MASK)\r\n\r\n#define CLKCTL1_PSCCTL0_SET_FC1_MASK             (0x200U)\r\n#define CLKCTL1_PSCCTL0_SET_FC1_SHIFT            (9U)\r\n/*! FC1 - fc1 clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL1_PSCCTL0_SET_FC1(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_SET_FC1_SHIFT)) & CLKCTL1_PSCCTL0_SET_FC1_MASK)\r\n\r\n#define CLKCTL1_PSCCTL0_SET_FC2_MASK             (0x400U)\r\n#define CLKCTL1_PSCCTL0_SET_FC2_SHIFT            (10U)\r\n/*! FC2 - fc2 clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL1_PSCCTL0_SET_FC2(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_SET_FC2_SHIFT)) & CLKCTL1_PSCCTL0_SET_FC2_MASK)\r\n\r\n#define CLKCTL1_PSCCTL0_SET_FC3_MASK             (0x800U)\r\n#define CLKCTL1_PSCCTL0_SET_FC3_SHIFT            (11U)\r\n/*! FC3 - fc3 clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL1_PSCCTL0_SET_FC3(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_SET_FC3_SHIFT)) & CLKCTL1_PSCCTL0_SET_FC3_MASK)\r\n\r\n#define CLKCTL1_PSCCTL0_SET_FC14_MASK            (0x400000U)\r\n#define CLKCTL1_PSCCTL0_SET_FC14_SHIFT           (22U)\r\n/*! FC14 - fc14 clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL1_PSCCTL0_SET_FC14(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_SET_FC14_SHIFT)) & CLKCTL1_PSCCTL0_SET_FC14_MASK)\r\n\r\n#define CLKCTL1_PSCCTL0_SET_DMIC0_MASK           (0x1000000U)\r\n#define CLKCTL1_PSCCTL0_SET_DMIC0_SHIFT          (24U)\r\n/*! DMIC0 - dmic0 clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL1_PSCCTL0_SET_DMIC0(x)             (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_SET_DMIC0_SHIFT)) & CLKCTL1_PSCCTL0_SET_DMIC0_MASK)\r\n\r\n#define CLKCTL1_PSCCTL0_SET_OSEVENTTIMER_MASK    (0x8000000U)\r\n#define CLKCTL1_PSCCTL0_SET_OSEVENTTIMER_SHIFT   (27U)\r\n/*! OSEVENTTIMER - oseventtimer clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL0 Bit\r\n */\r\n#define CLKCTL1_PSCCTL0_SET_OSEVENTTIMER(x)      (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_SET_OSEVENTTIMER_SHIFT)) & CLKCTL1_PSCCTL0_SET_OSEVENTTIMER_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSCCTL1_SET - Peripheral clock set 1 */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_PSCCTL1_SET_HSGPIO0_MASK         (0x1U)\r\n#define CLKCTL1_PSCCTL1_SET_HSGPIO0_SHIFT        (0U)\r\n/*! HSGPIO0 - hsgpio0 clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL1 Bit\r\n */\r\n#define CLKCTL1_PSCCTL1_SET_HSGPIO0(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL1_SET_HSGPIO0_SHIFT)) & CLKCTL1_PSCCTL1_SET_HSGPIO0_MASK)\r\n\r\n#define CLKCTL1_PSCCTL1_SET_HSGPIO1_MASK         (0x2U)\r\n#define CLKCTL1_PSCCTL1_SET_HSGPIO1_SHIFT        (1U)\r\n/*! HSGPIO1 - hsgpio1 clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL1 Bit\r\n */\r\n#define CLKCTL1_PSCCTL1_SET_HSGPIO1(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL1_SET_HSGPIO1_SHIFT)) & CLKCTL1_PSCCTL1_SET_HSGPIO1_MASK)\r\n\r\n#define CLKCTL1_PSCCTL1_SET_CRC_MASK             (0x10000U)\r\n#define CLKCTL1_PSCCTL1_SET_CRC_SHIFT            (16U)\r\n/*! CRC - crc clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL1 Bit\r\n */\r\n#define CLKCTL1_PSCCTL1_SET_CRC(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL1_SET_CRC_SHIFT)) & CLKCTL1_PSCCTL1_SET_CRC_MASK)\r\n\r\n#define CLKCTL1_PSCCTL1_SET_FREQME_MASK          (0x80000000U)\r\n#define CLKCTL1_PSCCTL1_SET_FREQME_SHIFT         (31U)\r\n/*! FREQME - freqme clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL1 Bit\r\n */\r\n#define CLKCTL1_PSCCTL1_SET_FREQME(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL1_SET_FREQME_SHIFT)) & CLKCTL1_PSCCTL1_SET_FREQME_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSCCTL2_SET - Peripheral clock set 2 */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_PSCCTL2_SET_CT32B0_MASK          (0x1U)\r\n#define CLKCTL1_PSCCTL2_SET_CT32B0_SHIFT         (0U)\r\n/*! CT32B0 - ct32b0 clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL2 Bit\r\n */\r\n#define CLKCTL1_PSCCTL2_SET_CT32B0(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_SET_CT32B0_SHIFT)) & CLKCTL1_PSCCTL2_SET_CT32B0_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_SET_CT32B1_MASK          (0x2U)\r\n#define CLKCTL1_PSCCTL2_SET_CT32B1_SHIFT         (1U)\r\n/*! CT32B1 - ct32b1 clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL2 Bit\r\n */\r\n#define CLKCTL1_PSCCTL2_SET_CT32B1(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_SET_CT32B1_SHIFT)) & CLKCTL1_PSCCTL2_SET_CT32B1_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_SET_CT32B2_MASK          (0x4U)\r\n#define CLKCTL1_PSCCTL2_SET_CT32B2_SHIFT         (2U)\r\n/*! CT32B2 - ct32b2 clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL2 Bit\r\n */\r\n#define CLKCTL1_PSCCTL2_SET_CT32B2(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_SET_CT32B2_SHIFT)) & CLKCTL1_PSCCTL2_SET_CT32B2_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_SET_CT32B3_MASK          (0x8U)\r\n#define CLKCTL1_PSCCTL2_SET_CT32B3_SHIFT         (3U)\r\n/*! CT32B3 - ct32b3 clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL2 Bit\r\n */\r\n#define CLKCTL1_PSCCTL2_SET_CT32B3(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_SET_CT32B3_SHIFT)) & CLKCTL1_PSCCTL2_SET_CT32B3_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_SET_CT32B4_MASK          (0x10U)\r\n#define CLKCTL1_PSCCTL2_SET_CT32B4_SHIFT         (4U)\r\n/*! CT32B4 - ct32b4 clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL2 Bit\r\n */\r\n#define CLKCTL1_PSCCTL2_SET_CT32B4(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_SET_CT32B4_SHIFT)) & CLKCTL1_PSCCTL2_SET_CT32B4_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_SET_PMU_MASK             (0x40U)\r\n#define CLKCTL1_PSCCTL2_SET_PMU_SHIFT            (6U)\r\n/*! PMU - pmu clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL2 Bit\r\n */\r\n#define CLKCTL1_PSCCTL2_SET_PMU(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_SET_PMU_SHIFT)) & CLKCTL1_PSCCTL2_SET_PMU_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_SET_RTC_LITE_MASK        (0x80U)\r\n#define CLKCTL1_PSCCTL2_SET_RTC_LITE_SHIFT       (7U)\r\n/*! RTC_LITE - rtc_lite clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL2 Bit\r\n */\r\n#define CLKCTL1_PSCCTL2_SET_RTC_LITE(x)          (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_SET_RTC_LITE_SHIFT)) & CLKCTL1_PSCCTL2_SET_RTC_LITE_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_SET_MRT_MASK             (0x100U)\r\n#define CLKCTL1_PSCCTL2_SET_MRT_SHIFT            (8U)\r\n/*! MRT - mrt clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL2 Bit\r\n */\r\n#define CLKCTL1_PSCCTL2_SET_MRT(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_SET_MRT_SHIFT)) & CLKCTL1_PSCCTL2_SET_MRT_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_SET_GPIO_INT_MASK        (0x40000000U)\r\n#define CLKCTL1_PSCCTL2_SET_GPIO_INT_SHIFT       (30U)\r\n/*! GPIO_INT - gpio_int clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL2 Bit\r\n */\r\n#define CLKCTL1_PSCCTL2_SET_GPIO_INT(x)          (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_SET_GPIO_INT_SHIFT)) & CLKCTL1_PSCCTL2_SET_GPIO_INT_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_SET_PMUX_MASK            (0x80000000U)\r\n#define CLKCTL1_PSCCTL2_SET_PMUX_SHIFT           (31U)\r\n/*! PMUX - pmux clock set\r\n *  0b0..No effect\r\n *  0b1..Sets the PSCCTL2 Bit\r\n */\r\n#define CLKCTL1_PSCCTL2_SET_PMUX(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_SET_PMUX_SHIFT)) & CLKCTL1_PSCCTL2_SET_PMUX_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSCCTL0_CLR - Peripheral clock clear 0 */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_PSCCTL0_CLR_FC0_MASK             (0x100U)\r\n#define CLKCTL1_PSCCTL0_CLR_FC0_SHIFT            (8U)\r\n/*! FC0 - fc0 clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL1_PSCCTL0_CLR_FC0(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_CLR_FC0_SHIFT)) & CLKCTL1_PSCCTL0_CLR_FC0_MASK)\r\n\r\n#define CLKCTL1_PSCCTL0_CLR_FC1_MASK             (0x200U)\r\n#define CLKCTL1_PSCCTL0_CLR_FC1_SHIFT            (9U)\r\n/*! FC1 - fc1 clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL1_PSCCTL0_CLR_FC1(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_CLR_FC1_SHIFT)) & CLKCTL1_PSCCTL0_CLR_FC1_MASK)\r\n\r\n#define CLKCTL1_PSCCTL0_CLR_FC2_MASK             (0x400U)\r\n#define CLKCTL1_PSCCTL0_CLR_FC2_SHIFT            (10U)\r\n/*! FC2 - fc2 clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL1_PSCCTL0_CLR_FC2(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_CLR_FC2_SHIFT)) & CLKCTL1_PSCCTL0_CLR_FC2_MASK)\r\n\r\n#define CLKCTL1_PSCCTL0_CLR_FC3_MASK             (0x800U)\r\n#define CLKCTL1_PSCCTL0_CLR_FC3_SHIFT            (11U)\r\n/*! FC3 - fc3 clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL1_PSCCTL0_CLR_FC3(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_CLR_FC3_SHIFT)) & CLKCTL1_PSCCTL0_CLR_FC3_MASK)\r\n\r\n#define CLKCTL1_PSCCTL0_CLR_FC14_MASK            (0x400000U)\r\n#define CLKCTL1_PSCCTL0_CLR_FC14_SHIFT           (22U)\r\n/*! FC14 - fc14 clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL1_PSCCTL0_CLR_FC14(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_CLR_FC14_SHIFT)) & CLKCTL1_PSCCTL0_CLR_FC14_MASK)\r\n\r\n#define CLKCTL1_PSCCTL0_CLR_DMIC0_MASK           (0x1000000U)\r\n#define CLKCTL1_PSCCTL0_CLR_DMIC0_SHIFT          (24U)\r\n/*! DMIC0 - dmic0 clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL1_PSCCTL0_CLR_DMIC0(x)             (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_CLR_DMIC0_SHIFT)) & CLKCTL1_PSCCTL0_CLR_DMIC0_MASK)\r\n\r\n#define CLKCTL1_PSCCTL0_CLR_OSEVENTTIMER_MASK    (0x8000000U)\r\n#define CLKCTL1_PSCCTL0_CLR_OSEVENTTIMER_SHIFT   (27U)\r\n/*! OSEVENTTIMER - oseventtimer clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL0 Bit\r\n */\r\n#define CLKCTL1_PSCCTL0_CLR_OSEVENTTIMER(x)      (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL0_CLR_OSEVENTTIMER_SHIFT)) & CLKCTL1_PSCCTL0_CLR_OSEVENTTIMER_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSCCTL1_CLR - Peripheral clock clear 1 */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_PSCCTL1_CLR_HSGPIO0_MASK         (0x1U)\r\n#define CLKCTL1_PSCCTL1_CLR_HSGPIO0_SHIFT        (0U)\r\n/*! HSGPIO0 - hsgpio0 clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL1 Bit\r\n */\r\n#define CLKCTL1_PSCCTL1_CLR_HSGPIO0(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL1_CLR_HSGPIO0_SHIFT)) & CLKCTL1_PSCCTL1_CLR_HSGPIO0_MASK)\r\n\r\n#define CLKCTL1_PSCCTL1_CLR_HSGPIO1_MASK         (0x2U)\r\n#define CLKCTL1_PSCCTL1_CLR_HSGPIO1_SHIFT        (1U)\r\n/*! HSGPIO1 - hsgpio1 clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL1 Bit\r\n */\r\n#define CLKCTL1_PSCCTL1_CLR_HSGPIO1(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL1_CLR_HSGPIO1_SHIFT)) & CLKCTL1_PSCCTL1_CLR_HSGPIO1_MASK)\r\n\r\n#define CLKCTL1_PSCCTL1_CLR_CRC_MASK             (0x10000U)\r\n#define CLKCTL1_PSCCTL1_CLR_CRC_SHIFT            (16U)\r\n/*! CRC - crc clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL1 Bit\r\n */\r\n#define CLKCTL1_PSCCTL1_CLR_CRC(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL1_CLR_CRC_SHIFT)) & CLKCTL1_PSCCTL1_CLR_CRC_MASK)\r\n\r\n#define CLKCTL1_PSCCTL1_CLR_FREQME_MASK          (0x80000000U)\r\n#define CLKCTL1_PSCCTL1_CLR_FREQME_SHIFT         (31U)\r\n/*! FREQME - freqme clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL1 Bit\r\n */\r\n#define CLKCTL1_PSCCTL1_CLR_FREQME(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL1_CLR_FREQME_SHIFT)) & CLKCTL1_PSCCTL1_CLR_FREQME_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSCCTL2_CLR - Peripheral clock clear 2 */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_PSCCTL2_CLR_CT32B0_MASK          (0x1U)\r\n#define CLKCTL1_PSCCTL2_CLR_CT32B0_SHIFT         (0U)\r\n/*! CT32B0 - ct32b0 clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL2 Bit\r\n */\r\n#define CLKCTL1_PSCCTL2_CLR_CT32B0(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_CLR_CT32B0_SHIFT)) & CLKCTL1_PSCCTL2_CLR_CT32B0_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_CLR_CT32B1_MASK          (0x2U)\r\n#define CLKCTL1_PSCCTL2_CLR_CT32B1_SHIFT         (1U)\r\n/*! CT32B1 - ct32b1 clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL2 Bit\r\n */\r\n#define CLKCTL1_PSCCTL2_CLR_CT32B1(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_CLR_CT32B1_SHIFT)) & CLKCTL1_PSCCTL2_CLR_CT32B1_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_CLR_CT32B2_MASK          (0x4U)\r\n#define CLKCTL1_PSCCTL2_CLR_CT32B2_SHIFT         (2U)\r\n/*! CT32B2 - ct32b2 clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL2 Bit\r\n */\r\n#define CLKCTL1_PSCCTL2_CLR_CT32B2(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_CLR_CT32B2_SHIFT)) & CLKCTL1_PSCCTL2_CLR_CT32B2_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_CLR_CT32B3_MASK          (0x8U)\r\n#define CLKCTL1_PSCCTL2_CLR_CT32B3_SHIFT         (3U)\r\n/*! CT32B3 - ct32b3 clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL2 Bit\r\n */\r\n#define CLKCTL1_PSCCTL2_CLR_CT32B3(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_CLR_CT32B3_SHIFT)) & CLKCTL1_PSCCTL2_CLR_CT32B3_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_CLR_CT32B4_MASK          (0x10U)\r\n#define CLKCTL1_PSCCTL2_CLR_CT32B4_SHIFT         (4U)\r\n/*! CT32B4 - ct32b4 clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL2 Bit\r\n */\r\n#define CLKCTL1_PSCCTL2_CLR_CT32B4(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_CLR_CT32B4_SHIFT)) & CLKCTL1_PSCCTL2_CLR_CT32B4_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_CLR_PMU_MASK             (0x40U)\r\n#define CLKCTL1_PSCCTL2_CLR_PMU_SHIFT            (6U)\r\n/*! PMU - pmu clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL2 Bit\r\n */\r\n#define CLKCTL1_PSCCTL2_CLR_PMU(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_CLR_PMU_SHIFT)) & CLKCTL1_PSCCTL2_CLR_PMU_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_CLR_RTC_LITE_MASK        (0x80U)\r\n#define CLKCTL1_PSCCTL2_CLR_RTC_LITE_SHIFT       (7U)\r\n/*! RTC_LITE - rtc_lite clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL2 Bit\r\n */\r\n#define CLKCTL1_PSCCTL2_CLR_RTC_LITE(x)          (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_CLR_RTC_LITE_SHIFT)) & CLKCTL1_PSCCTL2_CLR_RTC_LITE_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_CLR_MRT_MASK             (0x100U)\r\n#define CLKCTL1_PSCCTL2_CLR_MRT_SHIFT            (8U)\r\n/*! MRT - mrt clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL2 Bit\r\n */\r\n#define CLKCTL1_PSCCTL2_CLR_MRT(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_CLR_MRT_SHIFT)) & CLKCTL1_PSCCTL2_CLR_MRT_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_CLR_GPIO_INT_MASK        (0x40000000U)\r\n#define CLKCTL1_PSCCTL2_CLR_GPIO_INT_SHIFT       (30U)\r\n/*! GPIO_INT - gpio_int clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL2 Bit\r\n */\r\n#define CLKCTL1_PSCCTL2_CLR_GPIO_INT(x)          (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_CLR_GPIO_INT_SHIFT)) & CLKCTL1_PSCCTL2_CLR_GPIO_INT_MASK)\r\n\r\n#define CLKCTL1_PSCCTL2_CLR_PMUX_MASK            (0x80000000U)\r\n#define CLKCTL1_PSCCTL2_CLR_PMUX_SHIFT           (31U)\r\n/*! PMUX - pmux clock clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PSCCTL2 Bit\r\n */\r\n#define CLKCTL1_PSCCTL2_CLR_PMUX(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL1_PSCCTL2_CLR_PMUX_SHIFT)) & CLKCTL1_PSCCTL2_CLR_PMUX_MASK)\r\n/*! @} */\r\n\r\n/*! @name AUDIOPLLCLKDIV - Audio PLL0 clock divider */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_AUDIOPLLCLKDIV_DIV_MASK          (0xFFU)\r\n#define CLKCTL1_AUDIOPLLCLKDIV_DIV_SHIFT         (0U)\r\n/*! DIV - Clock Divider Value Selection: 0: Divide by 1... 255: Divide by 256 */\r\n#define CLKCTL1_AUDIOPLLCLKDIV_DIV(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL1_AUDIOPLLCLKDIV_DIV_SHIFT)) & CLKCTL1_AUDIOPLLCLKDIV_DIV_MASK)\r\n\r\n#define CLKCTL1_AUDIOPLLCLKDIV_RESET_MASK        (0x20000000U)\r\n#define CLKCTL1_AUDIOPLLCLKDIV_RESET_SHIFT       (29U)\r\n/*! RESET - Resets the divider counter. Can be used to make sure a new divider value is used right\r\n *    away rather than completing the previous count\r\n */\r\n#define CLKCTL1_AUDIOPLLCLKDIV_RESET(x)          (((uint32_t)(((uint32_t)(x)) << CLKCTL1_AUDIOPLLCLKDIV_RESET_SHIFT)) & CLKCTL1_AUDIOPLLCLKDIV_RESET_MASK)\r\n\r\n#define CLKCTL1_AUDIOPLLCLKDIV_HALT_MASK         (0x40000000U)\r\n#define CLKCTL1_AUDIOPLLCLKDIV_HALT_SHIFT        (30U)\r\n/*! HALT - Halts the divider counter. The intent is to allow the divider clock source to be changed\r\n *    without the risk of a glitch at the output\r\n */\r\n#define CLKCTL1_AUDIOPLLCLKDIV_HALT(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL1_AUDIOPLLCLKDIV_HALT_SHIFT)) & CLKCTL1_AUDIOPLLCLKDIV_HALT_MASK)\r\n\r\n#define CLKCTL1_AUDIOPLLCLKDIV_REQFLAG_MASK      (0x80000000U)\r\n#define CLKCTL1_AUDIOPLLCLKDIV_REQFLAG_SHIFT     (31U)\r\n/*! REQFLAG - Divider status flag. Set when a change is made to the divider value, cleared when the\r\n *    change is complete. The clock being divided must be running for this status to change\r\n */\r\n#define CLKCTL1_AUDIOPLLCLKDIV_REQFLAG(x)        (((uint32_t)(((uint32_t)(x)) << CLKCTL1_AUDIOPLLCLKDIV_REQFLAG_SHIFT)) & CLKCTL1_AUDIOPLLCLKDIV_REQFLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name OSEVENTFCLKSEL - OS EVENT clock selection */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_OSEVENTFCLKSEL_SEL_MASK          (0x7U)\r\n#define CLKCTL1_OSEVENTFCLKSEL_SEL_SHIFT         (0U)\r\n/*! SEL - OS Event Timer Functional Clock Source Selection\r\n *  0b000..1m_lposc\r\n *  0b001..32 kHz Clock\r\n *  0b010..Cortex-M33 clock (hclk)\r\n *  0b011..Reserved\r\n *  0b100..Reserved\r\n *  0b101..Reserved\r\n *  0b110..Reserved\r\n *  0b111..None, this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL1_OSEVENTFCLKSEL_SEL(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL1_OSEVENTFCLKSEL_SEL_SHIFT)) & CLKCTL1_OSEVENTFCLKSEL_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name FRGCLKSEL - FRG clock selection 0..FRG clock selection 3 */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_FRGCLKSEL_SEL_MASK               (0x7U)\r\n#define CLKCTL1_FRGCLKSEL_SEL_SHIFT              (0U)\r\n/*! SEL - Fractional Gen. Clock Source Selection\r\n *  0b000..Main Clock\r\n *  0b001..FRG PLL Clock\r\n *  0b010..SFRO Clock (16m_irc).\r\n *  0b011..FFRO Clock (48/60m_irc).\r\n *  0b100..Reserved\r\n *  0b101..Reserved\r\n *  0b110..Reserved\r\n *  0b111..None, this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL1_FRGCLKSEL_SEL(x)                 (((uint32_t)(((uint32_t)(x)) << CLKCTL1_FRGCLKSEL_SEL_SHIFT)) & CLKCTL1_FRGCLKSEL_SEL_MASK)\r\n/*! @} */\r\n\r\n/* The count of CLKCTL1_FRGCLKSEL */\r\n#define CLKCTL1_FRGCLKSEL_COUNT                  (4U)\r\n\r\n/*! @name FRGCTL - FRG clock controller 0..FRG clock controller 3 */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_FRGCTL_DIV_MASK                  (0xFFU)\r\n#define CLKCTL1_FRGCTL_DIV_SHIFT                 (0U)\r\n/*! DIV - Denominator of the fractional divider. DIV is minus 1 encoded, the denominator value is\r\n *    the value of this field + 1. Always set to 0xFF (denominator = 256) to use with the fractional\r\n *    baud rate generator.\r\n */\r\n#define CLKCTL1_FRGCTL_DIV(x)                    (((uint32_t)(((uint32_t)(x)) << CLKCTL1_FRGCTL_DIV_SHIFT)) & CLKCTL1_FRGCTL_DIV_MASK)\r\n\r\n#define CLKCTL1_FRGCTL_MULT_MASK                 (0xFF00U)\r\n#define CLKCTL1_FRGCTL_MULT_SHIFT                (8U)\r\n/*! MULT - Numerator of the fractional divider. MULT is not minus 1 encoded, so the numerator value\r\n *    is simply the value in this field.\r\n */\r\n#define CLKCTL1_FRGCTL_MULT(x)                   (((uint32_t)(((uint32_t)(x)) << CLKCTL1_FRGCTL_MULT_SHIFT)) & CLKCTL1_FRGCTL_MULT_MASK)\r\n/*! @} */\r\n\r\n/* The count of CLKCTL1_FRGCTL */\r\n#define CLKCTL1_FRGCTL_COUNT                     (4U)\r\n\r\n/*! @name FCFCLKSEL - Flexcomm Interface clock selection 0..Flexcomm Interface clock selection 3 */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_FCFCLKSEL_SEL_MASK               (0x7U)\r\n#define CLKCTL1_FCFCLKSEL_SEL_SHIFT              (0U)\r\n/*! SEL - Flexcomm Functional Clock Source Selection\r\n *  0b000..SFRO Clock (16m_irc)\r\n *  0b001..FFRO Clock (48/60m_irc).\r\n *  0b010..Audio PLL Clock (audio_pll_clk).\r\n *  0b011..Master Clock In (mclk_in).\r\n *  0b100..FCn FRG Clock (frg_clk n).\r\n *  0b101..Reserved\r\n *  0b110..Reserved\r\n *  0b111..None, this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL1_FCFCLKSEL_SEL(x)                 (((uint32_t)(((uint32_t)(x)) << CLKCTL1_FCFCLKSEL_SEL_SHIFT)) & CLKCTL1_FCFCLKSEL_SEL_MASK)\r\n/*! @} */\r\n\r\n/* The count of CLKCTL1_FCFCLKSEL */\r\n#define CLKCTL1_FCFCLKSEL_COUNT                  (4U)\r\n\r\n/*! @name FRG14CLKSEL - FRG clock selection 14 */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_FRG14CLKSEL_SEL_MASK             (0x7U)\r\n#define CLKCTL1_FRG14CLKSEL_SEL_SHIFT            (0U)\r\n/*! SEL - Fractional Gen. Clock Source Selection\r\n *  0b000..Main Clock\r\n *  0b001..FRG PLL Clock\r\n *  0b010..SFRO Clock (16m_irc).\r\n *  0b011..FFRO Clock (48/60m_irc).\r\n *  0b100..Reserved\r\n *  0b101..Reserved\r\n *  0b110..Reserved\r\n *  0b111..None, this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL1_FRG14CLKSEL_SEL(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL1_FRG14CLKSEL_SEL_SHIFT)) & CLKCTL1_FRG14CLKSEL_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name FRG14CTL - FRG clock controller 14 */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_FRG14CTL_DIV_MASK                (0xFFU)\r\n#define CLKCTL1_FRG14CTL_DIV_SHIFT               (0U)\r\n/*! DIV - Denominator of the fractional divider. DIV is minus 1 encoded, the denominator value is\r\n *    the value of this field + 1. Always set to 0xFF (denominator = 256) to use with the fractional\r\n *    baud rate generator.\r\n */\r\n#define CLKCTL1_FRG14CTL_DIV(x)                  (((uint32_t)(((uint32_t)(x)) << CLKCTL1_FRG14CTL_DIV_SHIFT)) & CLKCTL1_FRG14CTL_DIV_MASK)\r\n\r\n#define CLKCTL1_FRG14CTL_MULT_MASK               (0xFF00U)\r\n#define CLKCTL1_FRG14CTL_MULT_SHIFT              (8U)\r\n/*! MULT - Numerator of the fractional divider. MULT is not minus 1 encoded, so the numerator value\r\n *    is simply the value in this field.\r\n */\r\n#define CLKCTL1_FRG14CTL_MULT(x)                 (((uint32_t)(((uint32_t)(x)) << CLKCTL1_FRG14CTL_MULT_SHIFT)) & CLKCTL1_FRG14CTL_MULT_MASK)\r\n/*! @} */\r\n\r\n/*! @name FC14FCLKSEL - Flexcomm Interface clock selection 14 */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_FC14FCLKSEL_SEL_MASK             (0x7U)\r\n#define CLKCTL1_FC14FCLKSEL_SEL_SHIFT            (0U)\r\n/*! SEL - Flexcomm Functional Clock Source Selection\r\n *  0b000..SFRO Clock (16m_irc)\r\n *  0b001..FFRO Clock (48/60m_irc).\r\n *  0b010..Audio PLL Clock (audio_pll_clk).\r\n *  0b011..Master Clock In (mclk_in).\r\n *  0b100..FCn FRG Clock (frg_clk n).\r\n *  0b101..Reserved\r\n *  0b110..Reserved\r\n *  0b111..None, this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL1_FC14FCLKSEL_SEL(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL1_FC14FCLKSEL_SEL_SHIFT)) & CLKCTL1_FC14FCLKSEL_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name FRGPLLCLKDIV - FRG PLL clock divider */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_FRGPLLCLKDIV_DIV_MASK            (0xFFU)\r\n#define CLKCTL1_FRGPLLCLKDIV_DIV_SHIFT           (0U)\r\n/*! DIV - Clock Divider Value Selection: 0: Divide by 1... 255: Divide by 256 */\r\n#define CLKCTL1_FRGPLLCLKDIV_DIV(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL1_FRGPLLCLKDIV_DIV_SHIFT)) & CLKCTL1_FRGPLLCLKDIV_DIV_MASK)\r\n\r\n#define CLKCTL1_FRGPLLCLKDIV_RESET_MASK          (0x20000000U)\r\n#define CLKCTL1_FRGPLLCLKDIV_RESET_SHIFT         (29U)\r\n/*! RESET - Resets the divider counter. Can be used to make sure a new divider value is used right\r\n *    away rather than completing the previous count\r\n */\r\n#define CLKCTL1_FRGPLLCLKDIV_RESET(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL1_FRGPLLCLKDIV_RESET_SHIFT)) & CLKCTL1_FRGPLLCLKDIV_RESET_MASK)\r\n\r\n#define CLKCTL1_FRGPLLCLKDIV_HALT_MASK           (0x40000000U)\r\n#define CLKCTL1_FRGPLLCLKDIV_HALT_SHIFT          (30U)\r\n/*! HALT - Halts the divider counter. The intent is to allow the divider clock source to be changed\r\n *    without the risk of a glitch at the output\r\n */\r\n#define CLKCTL1_FRGPLLCLKDIV_HALT(x)             (((uint32_t)(((uint32_t)(x)) << CLKCTL1_FRGPLLCLKDIV_HALT_SHIFT)) & CLKCTL1_FRGPLLCLKDIV_HALT_MASK)\r\n\r\n#define CLKCTL1_FRGPLLCLKDIV_REQFLAG_MASK        (0x80000000U)\r\n#define CLKCTL1_FRGPLLCLKDIV_REQFLAG_SHIFT       (31U)\r\n/*! REQFLAG - Divider status flag. Set when a change is made to the divider value, cleared when the\r\n *    change is complete. The clock being divided must be running for this status to change\r\n */\r\n#define CLKCTL1_FRGPLLCLKDIV_REQFLAG(x)          (((uint32_t)(((uint32_t)(x)) << CLKCTL1_FRGPLLCLKDIV_REQFLAG_SHIFT)) & CLKCTL1_FRGPLLCLKDIV_REQFLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMIC0FCLKSEL - DMIC0 clock selection */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_DMIC0FCLKSEL_SEL_MASK            (0x7U)\r\n#define CLKCTL1_DMIC0FCLKSEL_SEL_SHIFT           (0U)\r\n/*! SEL - DMIC Functional Clock Source Selection\r\n *  0b000..SFRO Clock (16m_irc)\r\n *  0b001..FFRO Clock (48/60m_irc).\r\n *  0b010..Audio PLL Clock (audio_pll_clk).\r\n *  0b011..Master Clock In (mclk_in).\r\n *  0b100..1m_lposc\r\n *  0b101..32 kHz Wake Clk\r\n *  0b110..Reserved\r\n *  0b111..None, this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL1_DMIC0FCLKSEL_SEL(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL1_DMIC0FCLKSEL_SEL_SHIFT)) & CLKCTL1_DMIC0FCLKSEL_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMIC0CLKDIV - DMIC clock divider */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_DMIC0CLKDIV_DIV_MASK             (0xFFU)\r\n#define CLKCTL1_DMIC0CLKDIV_DIV_SHIFT            (0U)\r\n/*! DIV - Clock Divider Value Selection: 0: Divide by 1... 255: Divide by 256 */\r\n#define CLKCTL1_DMIC0CLKDIV_DIV(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL1_DMIC0CLKDIV_DIV_SHIFT)) & CLKCTL1_DMIC0CLKDIV_DIV_MASK)\r\n\r\n#define CLKCTL1_DMIC0CLKDIV_RESET_MASK           (0x20000000U)\r\n#define CLKCTL1_DMIC0CLKDIV_RESET_SHIFT          (29U)\r\n/*! RESET - Resets the divider counter. Can be used to make sure a new divider value is used right\r\n *    away rather than completing the previous count\r\n */\r\n#define CLKCTL1_DMIC0CLKDIV_RESET(x)             (((uint32_t)(((uint32_t)(x)) << CLKCTL1_DMIC0CLKDIV_RESET_SHIFT)) & CLKCTL1_DMIC0CLKDIV_RESET_MASK)\r\n\r\n#define CLKCTL1_DMIC0CLKDIV_HALT_MASK            (0x40000000U)\r\n#define CLKCTL1_DMIC0CLKDIV_HALT_SHIFT           (30U)\r\n/*! HALT - Halts the divider counter. The intent is to allow the divider clock source to be changed\r\n *    without the risk of a glitch at the output\r\n */\r\n#define CLKCTL1_DMIC0CLKDIV_HALT(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL1_DMIC0CLKDIV_HALT_SHIFT)) & CLKCTL1_DMIC0CLKDIV_HALT_MASK)\r\n\r\n#define CLKCTL1_DMIC0CLKDIV_REQFLAG_MASK         (0x80000000U)\r\n#define CLKCTL1_DMIC0CLKDIV_REQFLAG_SHIFT        (31U)\r\n/*! REQFLAG - Divider status flag. Set when a change is made to the divider value, cleared when the\r\n *    change is complete. The clock being divided must be running for this status to change\r\n */\r\n#define CLKCTL1_DMIC0CLKDIV_REQFLAG(x)           (((uint32_t)(((uint32_t)(x)) << CLKCTL1_DMIC0CLKDIV_REQFLAG_SHIFT)) & CLKCTL1_DMIC0CLKDIV_REQFLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name CT32BITFCLKSEL - Ct32bit timer 0 clock selection..Ct32bit timer 3 clock selection */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_CT32BITFCLKSEL_SEL_MASK          (0x7U)\r\n#define CLKCTL1_CT32BITFCLKSEL_SEL_SHIFT         (0U)\r\n/*! SEL - CT32Bit Functional Clock Source Selection\r\n *  0b000..Main Clock\r\n *  0b001..SFRO Clock (16m_irc).\r\n *  0b010..FFRO Clock (48/60m_irc).\r\n *  0b011..Audio PLL Clock (audio_pll_clk).\r\n *  0b100..Master Clock In (mclk_in).\r\n *  0b101..1m_lposc\r\n *  0b110..Reserved\r\n *  0b111..None, this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL1_CT32BITFCLKSEL_SEL(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL1_CT32BITFCLKSEL_SEL_SHIFT)) & CLKCTL1_CT32BITFCLKSEL_SEL_MASK)\r\n/*! @} */\r\n\r\n/* The count of CLKCTL1_CT32BITFCLKSEL */\r\n#define CLKCTL1_CT32BITFCLKSEL_COUNT             (4U)\r\n\r\n/*! @name AUDIOMCLKSEL - Audio MCLK selection */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_AUDIOMCLKSEL_SEL_MASK            (0x7U)\r\n#define CLKCTL1_AUDIOMCLKSEL_SEL_SHIFT           (0U)\r\n/*! SEL - Audio MCLK Clock Source Selection\r\n *  0b000..FFRO Clock (48/60m_irc).\r\n *  0b001..Audio PLL Clock (audio_pll_clk).\r\n *  0b010..main_clk\r\n *  0b011..Reserved\r\n *  0b100..Reserved\r\n *  0b101..Reserved\r\n *  0b110..Reserved\r\n *  0b111..None, this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL1_AUDIOMCLKSEL_SEL(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL1_AUDIOMCLKSEL_SEL_SHIFT)) & CLKCTL1_AUDIOMCLKSEL_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name AUDIOMCLKDIV - Audio MCLK divider */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_AUDIOMCLKDIV_DIV_MASK            (0xFFU)\r\n#define CLKCTL1_AUDIOMCLKDIV_DIV_SHIFT           (0U)\r\n/*! DIV - Clock Divider Value Selection: 0: Divide by 1... 255: Divide by 256 */\r\n#define CLKCTL1_AUDIOMCLKDIV_DIV(x)              (((uint32_t)(((uint32_t)(x)) << CLKCTL1_AUDIOMCLKDIV_DIV_SHIFT)) & CLKCTL1_AUDIOMCLKDIV_DIV_MASK)\r\n\r\n#define CLKCTL1_AUDIOMCLKDIV_RESET_MASK          (0x20000000U)\r\n#define CLKCTL1_AUDIOMCLKDIV_RESET_SHIFT         (29U)\r\n/*! RESET - Resets the divider counter. Can be used to make sure a new divider value is used right\r\n *    away rather than completing the previous count\r\n */\r\n#define CLKCTL1_AUDIOMCLKDIV_RESET(x)            (((uint32_t)(((uint32_t)(x)) << CLKCTL1_AUDIOMCLKDIV_RESET_SHIFT)) & CLKCTL1_AUDIOMCLKDIV_RESET_MASK)\r\n\r\n#define CLKCTL1_AUDIOMCLKDIV_HALT_MASK           (0x40000000U)\r\n#define CLKCTL1_AUDIOMCLKDIV_HALT_SHIFT          (30U)\r\n/*! HALT - Halts the divider counter. The intent is to allow the divider clock source to be changed\r\n *    without the risk of a glitch at the output\r\n */\r\n#define CLKCTL1_AUDIOMCLKDIV_HALT(x)             (((uint32_t)(((uint32_t)(x)) << CLKCTL1_AUDIOMCLKDIV_HALT_SHIFT)) & CLKCTL1_AUDIOMCLKDIV_HALT_MASK)\r\n\r\n#define CLKCTL1_AUDIOMCLKDIV_REQFLAG_MASK        (0x80000000U)\r\n#define CLKCTL1_AUDIOMCLKDIV_REQFLAG_SHIFT       (31U)\r\n/*! REQFLAG - Divider status flag. Set when a change is made to the divider value, cleared when the\r\n *    change is complete. The clock being divided must be running for this status to change\r\n */\r\n#define CLKCTL1_AUDIOMCLKDIV_REQFLAG(x)          (((uint32_t)(((uint32_t)(x)) << CLKCTL1_AUDIOMCLKDIV_REQFLAG_SHIFT)) & CLKCTL1_AUDIOMCLKDIV_REQFLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLKOUTSEL0 - Clock out selection 0 */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_CLKOUTSEL0_SEL_MASK              (0x7U)\r\n#define CLKCTL1_CLKOUTSEL0_SEL_SHIFT             (0U)\r\n/*! SEL - Clock Output Select 1st Stage\r\n *  0b000..SFRO Clock\r\n *  0b001..External clock (clk_in).\r\n *  0b010..1m_lposc\r\n *  0b011..FFRO Clock\r\n *  0b100..Main Clock (main_clk).\r\n *  0b101..refclk_sys(38.4M).\r\n *  0b110..avpll_ch2_CLKOUT(64M)\r\n *  0b111..None, this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL1_CLKOUTSEL0_SEL(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL1_CLKOUTSEL0_SEL_SHIFT)) & CLKCTL1_CLKOUTSEL0_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLKOUTSEL1 - Clock out selection 1 */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_CLKOUTSEL1_SEL_MASK              (0x7U)\r\n#define CLKCTL1_CLKOUTSEL1_SEL_SHIFT             (0U)\r\n/*! SEL - Clock Output Select 2nd Stage\r\n *  0b000..CLKOUTSEL0 Multiplexed Output\r\n *  0b001..Main PLL Clock (main_pll_clk).\r\n *  0b010..AUX0 PLL clock (aux0_pll_clk).\r\n *  0b011..Reserved\r\n *  0b100..AUX1 PLL clock (aux1_pll_clk)\r\n *  0b101..Audio PLL Clock (audio_pll_clk).\r\n *  0b110..32 kHz RTC Clock.\r\n *  0b111..None, this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL1_CLKOUTSEL1_SEL(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL1_CLKOUTSEL1_SEL_SHIFT)) & CLKCTL1_CLKOUTSEL1_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLKOUTDIV - Clock out divider */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_CLKOUTDIV_DIV_MASK               (0xFFU)\r\n#define CLKCTL1_CLKOUTDIV_DIV_SHIFT              (0U)\r\n/*! DIV - Clock Divider Value Selection: 0: Divide by 1... 255: Divide by 256 */\r\n#define CLKCTL1_CLKOUTDIV_DIV(x)                 (((uint32_t)(((uint32_t)(x)) << CLKCTL1_CLKOUTDIV_DIV_SHIFT)) & CLKCTL1_CLKOUTDIV_DIV_MASK)\r\n\r\n#define CLKCTL1_CLKOUTDIV_RESET_MASK             (0x20000000U)\r\n#define CLKCTL1_CLKOUTDIV_RESET_SHIFT            (29U)\r\n/*! RESET - Resets the divider counter. Can be used to make sure a new divider value is used right\r\n *    away rather than completing the previous count\r\n */\r\n#define CLKCTL1_CLKOUTDIV_RESET(x)               (((uint32_t)(((uint32_t)(x)) << CLKCTL1_CLKOUTDIV_RESET_SHIFT)) & CLKCTL1_CLKOUTDIV_RESET_MASK)\r\n\r\n#define CLKCTL1_CLKOUTDIV_HALT_MASK              (0x40000000U)\r\n#define CLKCTL1_CLKOUTDIV_HALT_SHIFT             (30U)\r\n/*! HALT - Halts the divider counter. The intent is to allow the divider clock source to be changed\r\n *    without the risk of a glitch at the output\r\n */\r\n#define CLKCTL1_CLKOUTDIV_HALT(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL1_CLKOUTDIV_HALT_SHIFT)) & CLKCTL1_CLKOUTDIV_HALT_MASK)\r\n\r\n#define CLKCTL1_CLKOUTDIV_REQFLAG_MASK           (0x80000000U)\r\n#define CLKCTL1_CLKOUTDIV_REQFLAG_SHIFT          (31U)\r\n/*! REQFLAG - Divider status flag. Set when a change is made to the divider value, cleared when the\r\n *    change is complete. The clock being divided must be running for this status to change\r\n */\r\n#define CLKCTL1_CLKOUTDIV_REQFLAG(x)             (((uint32_t)(((uint32_t)(x)) << CLKCTL1_CLKOUTDIV_REQFLAG_SHIFT)) & CLKCTL1_CLKOUTDIV_REQFLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLKOUTSEL2 - Clock out selection 2 */\r\n/*! @{ */\r\n\r\n#define CLKCTL1_CLKOUTSEL2_SEL_MASK              (0x7U)\r\n#define CLKCTL1_CLKOUTSEL2_SEL_SHIFT             (0U)\r\n/*! SEL - Clock Output Select 3rd Stage\r\n *  0b000..CLKOUTSEL1 Multiplexed Output\r\n *  0b001..tcpu_mci_flexspi_clk\r\n *  0b010..tddr_mci_flexspi_clk\r\n *  0b011..t3pll_mci_flexspi_clk\r\n *  0b100..t3pll_mci_256m\r\n *  0b101..cau_slp_ref_clk\r\n *  0b110..tddr_mci_enet_clk\r\n *  0b111..None, this may be selected in order to reduce power when no output is needed\r\n */\r\n#define CLKCTL1_CLKOUTSEL2_SEL(x)                (((uint32_t)(((uint32_t)(x)) << CLKCTL1_CLKOUTSEL2_SEL_SHIFT)) & CLKCTL1_CLKOUTSEL2_SEL_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group CLKCTL1_Register_Masks */\r\n\r\n\r\n/* CLKCTL1 - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral CLKCTL1 base address */\r\n  #define CLKCTL1_BASE                             (0x50021000u)\r\n  /** Peripheral CLKCTL1 base address */\r\n  #define CLKCTL1_BASE_NS                          (0x40021000u)\r\n  /** Peripheral CLKCTL1 base pointer */\r\n  #define CLKCTL1                                  ((CLKCTL1_Type *)CLKCTL1_BASE)\r\n  /** Peripheral CLKCTL1 base pointer */\r\n  #define CLKCTL1_NS                               ((CLKCTL1_Type *)CLKCTL1_BASE_NS)\r\n  /** Array initializer of CLKCTL1 peripheral base addresses */\r\n  #define CLKCTL1_BASE_ADDRS                       { CLKCTL1_BASE }\r\n  /** Array initializer of CLKCTL1 peripheral base pointers */\r\n  #define CLKCTL1_BASE_PTRS                        { CLKCTL1 }\r\n  /** Array initializer of CLKCTL1 peripheral base addresses */\r\n  #define CLKCTL1_BASE_ADDRS_NS                    { CLKCTL1_BASE_NS }\r\n  /** Array initializer of CLKCTL1 peripheral base pointers */\r\n  #define CLKCTL1_BASE_PTRS_NS                     { CLKCTL1_NS }\r\n#else\r\n  /** Peripheral CLKCTL1 base address */\r\n  #define CLKCTL1_BASE                             (0x40021000u)\r\n  /** Peripheral CLKCTL1 base pointer */\r\n  #define CLKCTL1                                  ((CLKCTL1_Type *)CLKCTL1_BASE)\r\n  /** Array initializer of CLKCTL1 peripheral base addresses */\r\n  #define CLKCTL1_BASE_ADDRS                       { CLKCTL1_BASE }\r\n  /** Array initializer of CLKCTL1 peripheral base pointers */\r\n  #define CLKCTL1_BASE_PTRS                        { CLKCTL1 }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group CLKCTL1_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- CRC Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup CRC_Peripheral_Access_Layer CRC Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** CRC - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t MODE;                              /**< CRC mode register, offset: 0x0 */\r\n  __IO uint32_t SEED;                              /**< CRC seed register, offset: 0x4 */\r\n  union {                                          /* offset: 0x8 */\r\n    __I  uint32_t SUM;                               /**< CRC checksum register, offset: 0x8 */\r\n    __O  uint32_t WR_DATA;                           /**< CRC data register, offset: 0x8 */\r\n  };\r\n} CRC_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- CRC Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup CRC_Register_Masks CRC Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name MODE - CRC mode register */\r\n/*! @{ */\r\n\r\n#define CRC_MODE_CRC_POLY_MASK                   (0x3U)\r\n#define CRC_MODE_CRC_POLY_SHIFT                  (0U)\r\n/*! CRC_POLY - CRC polynomial: 1X = CRC-32 polynomial 01 = CRC-16 polynomial 00 = CRC-CCITT polynomial */\r\n#define CRC_MODE_CRC_POLY(x)                     (((uint32_t)(((uint32_t)(x)) << CRC_MODE_CRC_POLY_SHIFT)) & CRC_MODE_CRC_POLY_MASK)\r\n\r\n#define CRC_MODE_BIT_RVS_WR_MASK                 (0x4U)\r\n#define CRC_MODE_BIT_RVS_WR_SHIFT                (2U)\r\n/*! BIT_RVS_WR - Data bit order: 1 = Bit order reverse for CRC_WR_DATA (per byte) 0 = No bit order reverse for CRC_WR_DATA (per byte) */\r\n#define CRC_MODE_BIT_RVS_WR(x)                   (((uint32_t)(((uint32_t)(x)) << CRC_MODE_BIT_RVS_WR_SHIFT)) & CRC_MODE_BIT_RVS_WR_MASK)\r\n\r\n#define CRC_MODE_CMPL_WR_MASK                    (0x8U)\r\n#define CRC_MODE_CMPL_WR_SHIFT                   (3U)\r\n/*! CMPL_WR - Data complement: 1 = 1's complement for CRC_WR_DATA 0 = No 1's complement for CRC_WR_DATA */\r\n#define CRC_MODE_CMPL_WR(x)                      (((uint32_t)(((uint32_t)(x)) << CRC_MODE_CMPL_WR_SHIFT)) & CRC_MODE_CMPL_WR_MASK)\r\n\r\n#define CRC_MODE_BIT_RVS_SUM_MASK                (0x10U)\r\n#define CRC_MODE_BIT_RVS_SUM_SHIFT               (4U)\r\n/*! BIT_RVS_SUM - CRC sum bit order: 1 = Bit order reverse for CRC_SUM 0 = No bit order reverse for CRC_SUM */\r\n#define CRC_MODE_BIT_RVS_SUM(x)                  (((uint32_t)(((uint32_t)(x)) << CRC_MODE_BIT_RVS_SUM_SHIFT)) & CRC_MODE_BIT_RVS_SUM_MASK)\r\n\r\n#define CRC_MODE_CMPL_SUM_MASK                   (0x20U)\r\n#define CRC_MODE_CMPL_SUM_SHIFT                  (5U)\r\n/*! CMPL_SUM - CRC sum complement: 1 = 1's complement for CRC_SUM 0 = No 1's complement for CRC_SUM */\r\n#define CRC_MODE_CMPL_SUM(x)                     (((uint32_t)(((uint32_t)(x)) << CRC_MODE_CMPL_SUM_SHIFT)) & CRC_MODE_CMPL_SUM_MASK)\r\n/*! @} */\r\n\r\n/*! @name SEED - CRC seed register */\r\n/*! @{ */\r\n\r\n#define CRC_SEED_CRC_SEED_MASK                   (0xFFFFFFFFU)\r\n#define CRC_SEED_CRC_SEED_SHIFT                  (0U)\r\n/*! CRC_SEED - A write access to this register will load CRC seed value to CRC_SUM register with\r\n *    selected bit order and 1's complement pre-processes. A write access to this register will\r\n *    overrule the CRC calculation in progresses.\r\n */\r\n#define CRC_SEED_CRC_SEED(x)                     (((uint32_t)(((uint32_t)(x)) << CRC_SEED_CRC_SEED_SHIFT)) & CRC_SEED_CRC_SEED_MASK)\r\n/*! @} */\r\n\r\n/*! @name SUM - CRC checksum register */\r\n/*! @{ */\r\n\r\n#define CRC_SUM_CRC_SUM_MASK                     (0xFFFFFFFFU)\r\n#define CRC_SUM_CRC_SUM_SHIFT                    (0U)\r\n/*! CRC_SUM - The most recent CRC sum can be read through this register with selected bit order and 1's complement post-processes. */\r\n#define CRC_SUM_CRC_SUM(x)                       (((uint32_t)(((uint32_t)(x)) << CRC_SUM_CRC_SUM_SHIFT)) & CRC_SUM_CRC_SUM_MASK)\r\n/*! @} */\r\n\r\n/*! @name WR_DATA - CRC data register */\r\n/*! @{ */\r\n\r\n#define CRC_WR_DATA_CRC_WR_DATA_MASK             (0xFFFFFFFFU)\r\n#define CRC_WR_DATA_CRC_WR_DATA_SHIFT            (0U)\r\n/*! CRC_WR_DATA - Data written to this register will be taken to perform CRC calculation with\r\n *    selected bit order and 1's complement pre-process. Any write size 8, 16 or 32-bit are allowed and\r\n *    accept back-to-back transactions.\r\n */\r\n#define CRC_WR_DATA_CRC_WR_DATA(x)               (((uint32_t)(((uint32_t)(x)) << CRC_WR_DATA_CRC_WR_DATA_SHIFT)) & CRC_WR_DATA_CRC_WR_DATA_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group CRC_Register_Masks */\r\n\r\n\r\n/* CRC - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral CRC base address */\r\n  #define CRC_BASE                                 (0x50120000u)\r\n  /** Peripheral CRC base address */\r\n  #define CRC_BASE_NS                              (0x40120000u)\r\n  /** Peripheral CRC base pointer */\r\n  #define CRC                                      ((CRC_Type *)CRC_BASE)\r\n  /** Peripheral CRC base pointer */\r\n  #define CRC_NS                                   ((CRC_Type *)CRC_BASE_NS)\r\n  /** Array initializer of CRC peripheral base addresses */\r\n  #define CRC_BASE_ADDRS                           { CRC_BASE }\r\n  /** Array initializer of CRC peripheral base pointers */\r\n  #define CRC_BASE_PTRS                            { CRC }\r\n  /** Array initializer of CRC peripheral base addresses */\r\n  #define CRC_BASE_ADDRS_NS                        { CRC_BASE_NS }\r\n  /** Array initializer of CRC peripheral base pointers */\r\n  #define CRC_BASE_PTRS_NS                         { CRC_NS }\r\n#else\r\n  /** Peripheral CRC base address */\r\n  #define CRC_BASE                                 (0x40120000u)\r\n  /** Peripheral CRC base pointer */\r\n  #define CRC                                      ((CRC_Type *)CRC_BASE)\r\n  /** Array initializer of CRC peripheral base addresses */\r\n  #define CRC_BASE_ADDRS                           { CRC_BASE }\r\n  /** Array initializer of CRC peripheral base pointers */\r\n  #define CRC_BASE_PTRS                            { CRC }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group CRC_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- CTIMER Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup CTIMER_Peripheral_Access_Layer CTIMER Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** CTIMER - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t IR;                                /**< Interrupt Register., offset: 0x0 */\r\n  __IO uint32_t TCR;                               /**< Timer Control Register, offset: 0x4 */\r\n  __IO uint32_t TC;                                /**< Timer Counter, offset: 0x8 */\r\n  __IO uint32_t PR;                                /**< Prescale Register, offset: 0xC */\r\n  __IO uint32_t PC;                                /**< Prescale Counter., offset: 0x10 */\r\n  __IO uint32_t MCR;                               /**< Match Control Register, offset: 0x14 */\r\n  __IO uint32_t MR[4];                             /**< Match Register, array offset: 0x18, array step: 0x4 */\r\n  __IO uint32_t CCR;                               /**< Capture Control Register, offset: 0x28 */\r\n  __I  uint32_t CR[4];                             /**< Capture Register, array offset: 0x2C, array step: 0x4 */\r\n  __IO uint32_t EMR;                               /**< External Match Register, offset: 0x3C */\r\n       uint8_t RESERVED_0[48];\r\n  __IO uint32_t CTCR;                              /**< Count Control Register, offset: 0x70 */\r\n  __IO uint32_t PWMC;                              /**< PWM Control Register, offset: 0x74 */\r\n  __IO uint32_t MSR[4];                            /**< Match Shadow Register, array offset: 0x78, array step: 0x4 */\r\n} CTIMER_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- CTIMER Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup CTIMER_Register_Masks CTIMER Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name IR - Interrupt Register. */\r\n/*! @{ */\r\n\r\n#define CTIMER_IR_MR0INT_MASK                    (0x1U)\r\n#define CTIMER_IR_MR0INT_SHIFT                   (0U)\r\n/*! MR0INT - Interrupt flag for match channel 0 */\r\n#define CTIMER_IR_MR0INT(x)                      (((uint32_t)(((uint32_t)(x)) << CTIMER_IR_MR0INT_SHIFT)) & CTIMER_IR_MR0INT_MASK)\r\n\r\n#define CTIMER_IR_MR1INT_MASK                    (0x2U)\r\n#define CTIMER_IR_MR1INT_SHIFT                   (1U)\r\n/*! MR1INT - Interrupt flag for match channel 1 */\r\n#define CTIMER_IR_MR1INT(x)                      (((uint32_t)(((uint32_t)(x)) << CTIMER_IR_MR1INT_SHIFT)) & CTIMER_IR_MR1INT_MASK)\r\n\r\n#define CTIMER_IR_MR2INT_MASK                    (0x4U)\r\n#define CTIMER_IR_MR2INT_SHIFT                   (2U)\r\n/*! MR2INT - Interrupt flag for match channel 2 */\r\n#define CTIMER_IR_MR2INT(x)                      (((uint32_t)(((uint32_t)(x)) << CTIMER_IR_MR2INT_SHIFT)) & CTIMER_IR_MR2INT_MASK)\r\n\r\n#define CTIMER_IR_MR3INT_MASK                    (0x8U)\r\n#define CTIMER_IR_MR3INT_SHIFT                   (3U)\r\n/*! MR3INT - Interrupt flag for match channel 3 */\r\n#define CTIMER_IR_MR3INT(x)                      (((uint32_t)(((uint32_t)(x)) << CTIMER_IR_MR3INT_SHIFT)) & CTIMER_IR_MR3INT_MASK)\r\n\r\n#define CTIMER_IR_CR0INT_MASK                    (0x10U)\r\n#define CTIMER_IR_CR0INT_SHIFT                   (4U)\r\n/*! CR0INT - Interrupt flag for capture channel 0 event */\r\n#define CTIMER_IR_CR0INT(x)                      (((uint32_t)(((uint32_t)(x)) << CTIMER_IR_CR0INT_SHIFT)) & CTIMER_IR_CR0INT_MASK)\r\n\r\n#define CTIMER_IR_CR1INT_MASK                    (0x20U)\r\n#define CTIMER_IR_CR1INT_SHIFT                   (5U)\r\n/*! CR1INT - Interrupt flag for capture channel 1 event */\r\n#define CTIMER_IR_CR1INT(x)                      (((uint32_t)(((uint32_t)(x)) << CTIMER_IR_CR1INT_SHIFT)) & CTIMER_IR_CR1INT_MASK)\r\n\r\n#define CTIMER_IR_CR2INT_MASK                    (0x40U)\r\n#define CTIMER_IR_CR2INT_SHIFT                   (6U)\r\n/*! CR2INT - Interrupt flag for capture channel 2 event */\r\n#define CTIMER_IR_CR2INT(x)                      (((uint32_t)(((uint32_t)(x)) << CTIMER_IR_CR2INT_SHIFT)) & CTIMER_IR_CR2INT_MASK)\r\n\r\n#define CTIMER_IR_CR3INT_MASK                    (0x80U)\r\n#define CTIMER_IR_CR3INT_SHIFT                   (7U)\r\n/*! CR3INT - Interrupt flag for capture channel 3 event */\r\n#define CTIMER_IR_CR3INT(x)                      (((uint32_t)(((uint32_t)(x)) << CTIMER_IR_CR3INT_SHIFT)) & CTIMER_IR_CR3INT_MASK)\r\n/*! @} */\r\n\r\n/*! @name TCR - Timer Control Register */\r\n/*! @{ */\r\n\r\n#define CTIMER_TCR_CEN_MASK                      (0x1U)\r\n#define CTIMER_TCR_CEN_SHIFT                     (0U)\r\n/*! CEN - Counter enable.\r\n *  0b0..Disabled. The counters are disabled.\r\n *  0b1..Enabled. The Timer Counter and Prescale Counter are enabled. When the timer is enabled by an external\r\n *       trigger or globally enabled by the external global start enable register, the CEN bit will automatically be\r\n *       set to 1.\r\n */\r\n#define CTIMER_TCR_CEN(x)                        (((uint32_t)(((uint32_t)(x)) << CTIMER_TCR_CEN_SHIFT)) & CTIMER_TCR_CEN_MASK)\r\n\r\n#define CTIMER_TCR_CRST_MASK                     (0x2U)\r\n#define CTIMER_TCR_CRST_SHIFT                    (1U)\r\n/*! CRST - Counter reset.\r\n *  0b0..Disabled. Do nothing.\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_TCR_CRST(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_TCR_CRST_SHIFT)) & CTIMER_TCR_CRST_MASK)\r\n\r\n#define CTIMER_TCR_AGCEN_MASK                    (0x10U)\r\n#define CTIMER_TCR_AGCEN_SHIFT                   (4U)\r\n/*! AGCEN - Allow Global Count Enable\r\n *  0b0..Not allowed\r\n *  0b1..Allow input global_enable=1 action to take effect\r\n */\r\n#define CTIMER_TCR_AGCEN(x)                      (((uint32_t)(((uint32_t)(x)) << CTIMER_TCR_AGCEN_SHIFT)) & CTIMER_TCR_AGCEN_MASK)\r\n\r\n#define CTIMER_TCR_ATCEN_MASK                    (0x20U)\r\n#define CTIMER_TCR_ATCEN_SHIFT                   (5U)\r\n/*! ATCEN - Allow Trigger Count Enable\r\n *  0b0..Not allowed\r\n *  0b1..Allow input trigger_enable=1 action to take effect\r\n */\r\n#define CTIMER_TCR_ATCEN(x)                      (((uint32_t)(((uint32_t)(x)) << CTIMER_TCR_ATCEN_SHIFT)) & CTIMER_TCR_ATCEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name TC - Timer Counter */\r\n/*! @{ */\r\n\r\n#define CTIMER_TC_TCVAL_MASK                     (0xFFFFFFFFU)\r\n#define CTIMER_TC_TCVAL_SHIFT                    (0U)\r\n/*! TCVAL - Timer counter value. */\r\n#define CTIMER_TC_TCVAL(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_TC_TCVAL_SHIFT)) & CTIMER_TC_TCVAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name PR - Prescale Register */\r\n/*! @{ */\r\n\r\n#define CTIMER_PR_PRVAL_MASK                     (0xFFFFFFFFU)\r\n#define CTIMER_PR_PRVAL_SHIFT                    (0U)\r\n/*! PRVAL - Prescale reload value. */\r\n#define CTIMER_PR_PRVAL(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_PR_PRVAL_SHIFT)) & CTIMER_PR_PRVAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name PC - Prescale Counter. */\r\n/*! @{ */\r\n\r\n#define CTIMER_PC_PCVAL_MASK                     (0xFFFFFFFFU)\r\n#define CTIMER_PC_PCVAL_SHIFT                    (0U)\r\n/*! PCVAL - Prescale counter value */\r\n#define CTIMER_PC_PCVAL(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_PC_PCVAL_SHIFT)) & CTIMER_PC_PCVAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MCR - Match Control Register */\r\n/*! @{ */\r\n\r\n#define CTIMER_MCR_MR0I_MASK                     (0x1U)\r\n#define CTIMER_MCR_MR0I_SHIFT                    (0U)\r\n/*! MR0I - Interrupt on MR0\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_MCR_MR0I(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR0I_SHIFT)) & CTIMER_MCR_MR0I_MASK)\r\n\r\n#define CTIMER_MCR_MR0R_MASK                     (0x2U)\r\n#define CTIMER_MCR_MR0R_SHIFT                    (1U)\r\n/*! MR0R - Reset on MR0\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_MCR_MR0R(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR0R_SHIFT)) & CTIMER_MCR_MR0R_MASK)\r\n\r\n#define CTIMER_MCR_MR0S_MASK                     (0x4U)\r\n#define CTIMER_MCR_MR0S_SHIFT                    (2U)\r\n/*! MR0S - Stop on MR0\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_MCR_MR0S(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR0S_SHIFT)) & CTIMER_MCR_MR0S_MASK)\r\n\r\n#define CTIMER_MCR_MR1I_MASK                     (0x8U)\r\n#define CTIMER_MCR_MR1I_SHIFT                    (3U)\r\n/*! MR1I - Interrupt on MR1\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_MCR_MR1I(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR1I_SHIFT)) & CTIMER_MCR_MR1I_MASK)\r\n\r\n#define CTIMER_MCR_MR1R_MASK                     (0x10U)\r\n#define CTIMER_MCR_MR1R_SHIFT                    (4U)\r\n/*! MR1R - Reset on MR1\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_MCR_MR1R(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR1R_SHIFT)) & CTIMER_MCR_MR1R_MASK)\r\n\r\n#define CTIMER_MCR_MR1S_MASK                     (0x20U)\r\n#define CTIMER_MCR_MR1S_SHIFT                    (5U)\r\n/*! MR1S - Stop on MR1\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_MCR_MR1S(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR1S_SHIFT)) & CTIMER_MCR_MR1S_MASK)\r\n\r\n#define CTIMER_MCR_MR2I_MASK                     (0x40U)\r\n#define CTIMER_MCR_MR2I_SHIFT                    (6U)\r\n/*! MR2I - Interrupt on MR2\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_MCR_MR2I(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR2I_SHIFT)) & CTIMER_MCR_MR2I_MASK)\r\n\r\n#define CTIMER_MCR_MR2R_MASK                     (0x80U)\r\n#define CTIMER_MCR_MR2R_SHIFT                    (7U)\r\n/*! MR2R - Reset on MR2\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_MCR_MR2R(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR2R_SHIFT)) & CTIMER_MCR_MR2R_MASK)\r\n\r\n#define CTIMER_MCR_MR2S_MASK                     (0x100U)\r\n#define CTIMER_MCR_MR2S_SHIFT                    (8U)\r\n/*! MR2S - Stop on MR2\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_MCR_MR2S(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR2S_SHIFT)) & CTIMER_MCR_MR2S_MASK)\r\n\r\n#define CTIMER_MCR_MR3I_MASK                     (0x200U)\r\n#define CTIMER_MCR_MR3I_SHIFT                    (9U)\r\n/*! MR3I - Interrupt on MR3\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_MCR_MR3I(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR3I_SHIFT)) & CTIMER_MCR_MR3I_MASK)\r\n\r\n#define CTIMER_MCR_MR3R_MASK                     (0x400U)\r\n#define CTIMER_MCR_MR3R_SHIFT                    (10U)\r\n/*! MR3R - Reset on MR3\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_MCR_MR3R(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR3R_SHIFT)) & CTIMER_MCR_MR3R_MASK)\r\n\r\n#define CTIMER_MCR_MR3S_MASK                     (0x800U)\r\n#define CTIMER_MCR_MR3S_SHIFT                    (11U)\r\n/*! MR3S - Stop on MR3\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_MCR_MR3S(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR3S_SHIFT)) & CTIMER_MCR_MR3S_MASK)\r\n\r\n#define CTIMER_MCR_MR0RL_MASK                    (0x1000000U)\r\n#define CTIMER_MCR_MR0RL_SHIFT                   (24U)\r\n/*! MR0RL - Reload MR0\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_MCR_MR0RL(x)                      (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR0RL_SHIFT)) & CTIMER_MCR_MR0RL_MASK)\r\n\r\n#define CTIMER_MCR_MR1RL_MASK                    (0x2000000U)\r\n#define CTIMER_MCR_MR1RL_SHIFT                   (25U)\r\n/*! MR1RL - Reload MR1\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_MCR_MR1RL(x)                      (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR1RL_SHIFT)) & CTIMER_MCR_MR1RL_MASK)\r\n\r\n#define CTIMER_MCR_MR2RL_MASK                    (0x4000000U)\r\n#define CTIMER_MCR_MR2RL_SHIFT                   (26U)\r\n/*! MR2RL - Reload MR2\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_MCR_MR2RL(x)                      (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR2RL_SHIFT)) & CTIMER_MCR_MR2RL_MASK)\r\n\r\n#define CTIMER_MCR_MR3RL_MASK                    (0x8000000U)\r\n#define CTIMER_MCR_MR3RL_SHIFT                   (27U)\r\n/*! MR3RL - Reload MR3\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_MCR_MR3RL(x)                      (((uint32_t)(((uint32_t)(x)) << CTIMER_MCR_MR3RL_SHIFT)) & CTIMER_MCR_MR3RL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MR - Match Register */\r\n/*! @{ */\r\n\r\n#define CTIMER_MR_MATCH_MASK                     (0xFFFFFFFFU)\r\n#define CTIMER_MR_MATCH_SHIFT                    (0U)\r\n/*! MATCH - Timer counter match value */\r\n#define CTIMER_MR_MATCH(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_MR_MATCH_SHIFT)) & CTIMER_MR_MATCH_MASK)\r\n/*! @} */\r\n\r\n/* The count of CTIMER_MR */\r\n#define CTIMER_MR_COUNT                          (4U)\r\n\r\n/*! @name CCR - Capture Control Register */\r\n/*! @{ */\r\n\r\n#define CTIMER_CCR_CAP0RE_MASK                   (0x1U)\r\n#define CTIMER_CCR_CAP0RE_SHIFT                  (0U)\r\n/*! CAP0RE - Rising edge of capture channel 0: a sequence of 0 then 1 causes CR0 to be loaded with the contents of TC.\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_CCR_CAP0RE(x)                     (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP0RE_SHIFT)) & CTIMER_CCR_CAP0RE_MASK)\r\n\r\n#define CTIMER_CCR_CAP0FE_MASK                   (0x2U)\r\n#define CTIMER_CCR_CAP0FE_SHIFT                  (1U)\r\n/*! CAP0FE - Falling edge of capture channel 0: a sequence of 1 then 0 causes CR0 to be loaded with the contents of TC.\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_CCR_CAP0FE(x)                     (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP0FE_SHIFT)) & CTIMER_CCR_CAP0FE_MASK)\r\n\r\n#define CTIMER_CCR_CAP0I_MASK                    (0x4U)\r\n#define CTIMER_CCR_CAP0I_SHIFT                   (2U)\r\n/*! CAP0I - Generate interrupt on channel 0 capture event: a CR0 load generates an interrupt.\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_CCR_CAP0I(x)                      (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP0I_SHIFT)) & CTIMER_CCR_CAP0I_MASK)\r\n\r\n#define CTIMER_CCR_CAP1RE_MASK                   (0x8U)\r\n#define CTIMER_CCR_CAP1RE_SHIFT                  (3U)\r\n/*! CAP1RE - Rising edge of capture channel 1: a sequence of 0 then 1 causes CR1 to be loaded with the contents of TC.\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_CCR_CAP1RE(x)                     (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP1RE_SHIFT)) & CTIMER_CCR_CAP1RE_MASK)\r\n\r\n#define CTIMER_CCR_CAP1FE_MASK                   (0x10U)\r\n#define CTIMER_CCR_CAP1FE_SHIFT                  (4U)\r\n/*! CAP1FE - Falling edge of capture channel 1: a sequence of 1 then 0 causes CR1 to be loaded with the contents of TC.\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_CCR_CAP1FE(x)                     (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP1FE_SHIFT)) & CTIMER_CCR_CAP1FE_MASK)\r\n\r\n#define CTIMER_CCR_CAP1I_MASK                    (0x20U)\r\n#define CTIMER_CCR_CAP1I_SHIFT                   (5U)\r\n/*! CAP1I - Generate interrupt on channel 1 capture event: a CR1 load generates an interrupt.\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_CCR_CAP1I(x)                      (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP1I_SHIFT)) & CTIMER_CCR_CAP1I_MASK)\r\n\r\n#define CTIMER_CCR_CAP2RE_MASK                   (0x40U)\r\n#define CTIMER_CCR_CAP2RE_SHIFT                  (6U)\r\n/*! CAP2RE - Rising edge of capture channel 2: a sequence of 0 then 1 causes CR2 to be loaded with the contents of TC.\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_CCR_CAP2RE(x)                     (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP2RE_SHIFT)) & CTIMER_CCR_CAP2RE_MASK)\r\n\r\n#define CTIMER_CCR_CAP2FE_MASK                   (0x80U)\r\n#define CTIMER_CCR_CAP2FE_SHIFT                  (7U)\r\n/*! CAP2FE - Falling edge of capture channel 2: a sequence of 1 then 0 causes CR2 to be loaded with the contents of TC.\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_CCR_CAP2FE(x)                     (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP2FE_SHIFT)) & CTIMER_CCR_CAP2FE_MASK)\r\n\r\n#define CTIMER_CCR_CAP2I_MASK                    (0x100U)\r\n#define CTIMER_CCR_CAP2I_SHIFT                   (8U)\r\n/*! CAP2I - Generate interrupt on channel 2 capture event: a CR2 load generates an interrupt.\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_CCR_CAP2I(x)                      (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP2I_SHIFT)) & CTIMER_CCR_CAP2I_MASK)\r\n\r\n#define CTIMER_CCR_CAP3RE_MASK                   (0x200U)\r\n#define CTIMER_CCR_CAP3RE_SHIFT                  (9U)\r\n/*! CAP3RE - Rising edge of capture channel 3: a sequence of 0 then 1 causes CR3 to be loaded with the contents of TC.\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_CCR_CAP3RE(x)                     (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP3RE_SHIFT)) & CTIMER_CCR_CAP3RE_MASK)\r\n\r\n#define CTIMER_CCR_CAP3FE_MASK                   (0x400U)\r\n#define CTIMER_CCR_CAP3FE_SHIFT                  (10U)\r\n/*! CAP3FE - Falling edge of capture channel 3: a sequence of 1 then 0 causes CR3 to be loaded with the contents of TC.\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_CCR_CAP3FE(x)                     (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP3FE_SHIFT)) & CTIMER_CCR_CAP3FE_MASK)\r\n\r\n#define CTIMER_CCR_CAP3I_MASK                    (0x800U)\r\n#define CTIMER_CCR_CAP3I_SHIFT                   (11U)\r\n/*! CAP3I - Generate interrupt on channel 3 capture event: a CR3 load generates an interrupt.\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define CTIMER_CCR_CAP3I(x)                      (((uint32_t)(((uint32_t)(x)) << CTIMER_CCR_CAP3I_SHIFT)) & CTIMER_CCR_CAP3I_MASK)\r\n/*! @} */\r\n\r\n/*! @name CR - Capture Register */\r\n/*! @{ */\r\n\r\n#define CTIMER_CR_CAP_MASK                       (0xFFFFFFFFU)\r\n#define CTIMER_CR_CAP_SHIFT                      (0U)\r\n/*! CAP - Timer counter capture value. */\r\n#define CTIMER_CR_CAP(x)                         (((uint32_t)(((uint32_t)(x)) << CTIMER_CR_CAP_SHIFT)) & CTIMER_CR_CAP_MASK)\r\n/*! @} */\r\n\r\n/* The count of CTIMER_CR */\r\n#define CTIMER_CR_COUNT                          (4U)\r\n\r\n/*! @name EMR - External Match Register */\r\n/*! @{ */\r\n\r\n#define CTIMER_EMR_EM0_MASK                      (0x1U)\r\n#define CTIMER_EMR_EM0_SHIFT                     (0U)\r\n/*! EM0 - External Match 0 */\r\n#define CTIMER_EMR_EM0(x)                        (((uint32_t)(((uint32_t)(x)) << CTIMER_EMR_EM0_SHIFT)) & CTIMER_EMR_EM0_MASK)\r\n\r\n#define CTIMER_EMR_EM1_MASK                      (0x2U)\r\n#define CTIMER_EMR_EM1_SHIFT                     (1U)\r\n/*! EM1 - External Match 1 */\r\n#define CTIMER_EMR_EM1(x)                        (((uint32_t)(((uint32_t)(x)) << CTIMER_EMR_EM1_SHIFT)) & CTIMER_EMR_EM1_MASK)\r\n\r\n#define CTIMER_EMR_EM2_MASK                      (0x4U)\r\n#define CTIMER_EMR_EM2_SHIFT                     (2U)\r\n/*! EM2 - External Match 2 */\r\n#define CTIMER_EMR_EM2(x)                        (((uint32_t)(((uint32_t)(x)) << CTIMER_EMR_EM2_SHIFT)) & CTIMER_EMR_EM2_MASK)\r\n\r\n#define CTIMER_EMR_EM3_MASK                      (0x8U)\r\n#define CTIMER_EMR_EM3_SHIFT                     (3U)\r\n/*! EM3 - External Match 3 */\r\n#define CTIMER_EMR_EM3(x)                        (((uint32_t)(((uint32_t)(x)) << CTIMER_EMR_EM3_SHIFT)) & CTIMER_EMR_EM3_MASK)\r\n\r\n#define CTIMER_EMR_EMC0_MASK                     (0x30U)\r\n#define CTIMER_EMR_EMC0_SHIFT                    (4U)\r\n/*! EMC0 - External Match Control 0\r\n *  0b00..Do Nothing.\r\n *  0b01..Clear. Clear the corresponding External Match bit/output to 0 (MAT0 pin is LOW if pinned out).\r\n *  0b10..Set. Set the corresponding External Match bit/output to 1 (MAT0 pin is HIGH if pinned out).\r\n *  0b11..Toggle. Toggle the corresponding External Match bit/output.\r\n */\r\n#define CTIMER_EMR_EMC0(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_EMR_EMC0_SHIFT)) & CTIMER_EMR_EMC0_MASK)\r\n\r\n#define CTIMER_EMR_EMC1_MASK                     (0xC0U)\r\n#define CTIMER_EMR_EMC1_SHIFT                    (6U)\r\n/*! EMC1 - External Match Control 1\r\n *  0b00..Do Nothing\r\n *  0b01..Clear. Clear the corresponding External Match bit/output to 0 (MAT1 pin is LOW if pinned out).\r\n *  0b10..Set. Set the corresponding External Match bit/output to 1 (MAT1 pin is HIGH if pinned out).\r\n *  0b11..Toggle. Toggle the corresponding External Match bit/output.\r\n */\r\n#define CTIMER_EMR_EMC1(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_EMR_EMC1_SHIFT)) & CTIMER_EMR_EMC1_MASK)\r\n\r\n#define CTIMER_EMR_EMC2_MASK                     (0x300U)\r\n#define CTIMER_EMR_EMC2_SHIFT                    (8U)\r\n/*! EMC2 - External Match Control 2\r\n *  0b00..Do Nothing.\r\n *  0b01..Clear. Clear the corresponding External Match bit/output to 0 (MAT2 pin is LOW if pinned out).\r\n *  0b10..Set. Set the corresponding External Match bit/output to 1 (MAT2 pin is HIGH if pinned out).\r\n *  0b11..Toggle. Toggle the corresponding External Match bit/output.\r\n */\r\n#define CTIMER_EMR_EMC2(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_EMR_EMC2_SHIFT)) & CTIMER_EMR_EMC2_MASK)\r\n\r\n#define CTIMER_EMR_EMC3_MASK                     (0xC00U)\r\n#define CTIMER_EMR_EMC3_SHIFT                    (10U)\r\n/*! EMC3 - External Match Control 3\r\n *  0b00..Do Nothing.\r\n *  0b01..Clear. Clear the corresponding External Match bit/output to 0 (MAT3 pin is LOW if pinned out).\r\n *  0b10..Set. Set the corresponding External Match bit/output to 1 (MAT3 pin is HIGH if pinned out).\r\n *  0b11..Toggle. Toggle the corresponding External Match bit/output.\r\n */\r\n#define CTIMER_EMR_EMC3(x)                       (((uint32_t)(((uint32_t)(x)) << CTIMER_EMR_EMC3_SHIFT)) & CTIMER_EMR_EMC3_MASK)\r\n/*! @} */\r\n\r\n/*! @name CTCR - Count Control Register */\r\n/*! @{ */\r\n\r\n#define CTIMER_CTCR_CTMODE_MASK                  (0x3U)\r\n#define CTIMER_CTCR_CTMODE_SHIFT                 (0U)\r\n/*! CTMODE - The Count Control Register (CTCR) is used to select between Timer and Counter mode, and\r\n *    in Counter mode to select the pin and edge(s) for counting.\r\n *  0b00..Timer Mode\r\n *  0b01..Counter Mode rising edge\r\n *  0b10..Counter Mode falling edge\r\n *  0b11..Counter Mode dual edge\r\n */\r\n#define CTIMER_CTCR_CTMODE(x)                    (((uint32_t)(((uint32_t)(x)) << CTIMER_CTCR_CTMODE_SHIFT)) & CTIMER_CTCR_CTMODE_MASK)\r\n\r\n#define CTIMER_CTCR_CINSEL_MASK                  (0xCU)\r\n#define CTIMER_CTCR_CINSEL_SHIFT                 (2U)\r\n/*! CINSEL - Count Input Select\r\n *  0b00..Channel 0. CAPn.0 for CTIMERn\r\n *  0b01..Channel 1. CAPn.1 for CTIMERn\r\n *  0b10..Channel 2. CAPn.2 for CTIMERn\r\n *  0b11..Channel 3. CAPn.3 for CTIMERn\r\n */\r\n#define CTIMER_CTCR_CINSEL(x)                    (((uint32_t)(((uint32_t)(x)) << CTIMER_CTCR_CINSEL_SHIFT)) & CTIMER_CTCR_CINSEL_MASK)\r\n\r\n#define CTIMER_CTCR_ENCC_MASK                    (0x10U)\r\n#define CTIMER_CTCR_ENCC_SHIFT                   (4U)\r\n#define CTIMER_CTCR_ENCC(x)                      (((uint32_t)(((uint32_t)(x)) << CTIMER_CTCR_ENCC_SHIFT)) & CTIMER_CTCR_ENCC_MASK)\r\n\r\n#define CTIMER_CTCR_SELCC_MASK                   (0xE0U)\r\n#define CTIMER_CTCR_SELCC_SHIFT                  (5U)\r\n/*! SELCC - Edge select\r\n *  0b000..Channel 0 Rising Edge. Rising edge of the signal on capture channel 0 clears the timer (if bit 4 is set).\r\n *  0b001..Channel 0 Falling Edge. Falling edge of the signal on capture channel 0 clears the timer (if bit 4 is set).\r\n *  0b010..Channel 1 Rising Edge. Rising edge of the signal on capture channel 1 clears the timer (if bit 4 is set).\r\n *  0b011..Channel 1 Falling Edge. Falling edge of the signal on capture channel 1 clears the timer (if bit 4 is set).\r\n *  0b100..Channel 2 Rising Edge. Rising edge of the signal on capture channel 2 clears the timer (if bit 4 is set).\r\n *  0b101..Channel 2 Falling Edge. Falling edge of the signal on capture channel 2 clears the timer (if bit 4 is set).\r\n */\r\n#define CTIMER_CTCR_SELCC(x)                     (((uint32_t)(((uint32_t)(x)) << CTIMER_CTCR_SELCC_SHIFT)) & CTIMER_CTCR_SELCC_MASK)\r\n/*! @} */\r\n\r\n/*! @name PWMC - PWM Control Register */\r\n/*! @{ */\r\n\r\n#define CTIMER_PWMC_PWMEN0_MASK                  (0x1U)\r\n#define CTIMER_PWMC_PWMEN0_SHIFT                 (0U)\r\n/*! PWMEN0 - PWM mode enable for channel0.\r\n *  0b0..Match. CTIMERn_MAT0 is controlled by EM0.\r\n *  0b1..PWM. PWM mode is enabled for CTIMERn_MAT0.\r\n */\r\n#define CTIMER_PWMC_PWMEN0(x)                    (((uint32_t)(((uint32_t)(x)) << CTIMER_PWMC_PWMEN0_SHIFT)) & CTIMER_PWMC_PWMEN0_MASK)\r\n\r\n#define CTIMER_PWMC_PWMEN1_MASK                  (0x2U)\r\n#define CTIMER_PWMC_PWMEN1_SHIFT                 (1U)\r\n/*! PWMEN1 - PWM mode enable for channel1.\r\n *  0b0..Match. CTIMERn_MAT01 is controlled by EM1.\r\n *  0b1..PWM. PWM mode is enabled for CTIMERn_MAT1.\r\n */\r\n#define CTIMER_PWMC_PWMEN1(x)                    (((uint32_t)(((uint32_t)(x)) << CTIMER_PWMC_PWMEN1_SHIFT)) & CTIMER_PWMC_PWMEN1_MASK)\r\n\r\n#define CTIMER_PWMC_PWMEN2_MASK                  (0x4U)\r\n#define CTIMER_PWMC_PWMEN2_SHIFT                 (2U)\r\n/*! PWMEN2 - PWM mode enable for channel2.\r\n *  0b0..Match. CTIMERn_MAT2 is controlled by EM2.\r\n *  0b1..PWM. PWM mode is enabled for CTIMERn_MAT2.\r\n */\r\n#define CTIMER_PWMC_PWMEN2(x)                    (((uint32_t)(((uint32_t)(x)) << CTIMER_PWMC_PWMEN2_SHIFT)) & CTIMER_PWMC_PWMEN2_MASK)\r\n\r\n#define CTIMER_PWMC_PWMEN3_MASK                  (0x8U)\r\n#define CTIMER_PWMC_PWMEN3_SHIFT                 (3U)\r\n/*! PWMEN3 - PWM mode enable for channel3. Note: It is recommended to use match channel 3 to set the PWM cycle.\r\n *  0b0..Match. CTIMERn_MAT3 is controlled by EM3.\r\n *  0b1..PWM. PWM mode is enabled for CT132Bn_MAT3.\r\n */\r\n#define CTIMER_PWMC_PWMEN3(x)                    (((uint32_t)(((uint32_t)(x)) << CTIMER_PWMC_PWMEN3_SHIFT)) & CTIMER_PWMC_PWMEN3_MASK)\r\n/*! @} */\r\n\r\n/*! @name MSR - Match Shadow Register */\r\n/*! @{ */\r\n\r\n#define CTIMER_MSR_MATCH_SHADOW_MASK             (0xFFFFFFFFU)\r\n#define CTIMER_MSR_MATCH_SHADOW_SHIFT            (0U)\r\n/*! MATCH_SHADOW - Timer counter match shadow value. */\r\n#define CTIMER_MSR_MATCH_SHADOW(x)               (((uint32_t)(((uint32_t)(x)) << CTIMER_MSR_MATCH_SHADOW_SHIFT)) & CTIMER_MSR_MATCH_SHADOW_MASK)\r\n/*! @} */\r\n\r\n/* The count of CTIMER_MSR */\r\n#define CTIMER_MSR_COUNT                         (4U)\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group CTIMER_Register_Masks */\r\n\r\n\r\n/* CTIMER - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral CTIMER0 base address */\r\n  #define CTIMER0_BASE                             (0x50028000u)\r\n  /** Peripheral CTIMER0 base address */\r\n  #define CTIMER0_BASE_NS                          (0x40028000u)\r\n  /** Peripheral CTIMER0 base pointer */\r\n  #define CTIMER0                                  ((CTIMER_Type *)CTIMER0_BASE)\r\n  /** Peripheral CTIMER0 base pointer */\r\n  #define CTIMER0_NS                               ((CTIMER_Type *)CTIMER0_BASE_NS)\r\n  /** Peripheral CTIMER1 base address */\r\n  #define CTIMER1_BASE                             (0x50029000u)\r\n  /** Peripheral CTIMER1 base address */\r\n  #define CTIMER1_BASE_NS                          (0x40029000u)\r\n  /** Peripheral CTIMER1 base pointer */\r\n  #define CTIMER1                                  ((CTIMER_Type *)CTIMER1_BASE)\r\n  /** Peripheral CTIMER1 base pointer */\r\n  #define CTIMER1_NS                               ((CTIMER_Type *)CTIMER1_BASE_NS)\r\n  /** Peripheral CTIMER2 base address */\r\n  #define CTIMER2_BASE                             (0x5002A000u)\r\n  /** Peripheral CTIMER2 base address */\r\n  #define CTIMER2_BASE_NS                          (0x4002A000u)\r\n  /** Peripheral CTIMER2 base pointer */\r\n  #define CTIMER2                                  ((CTIMER_Type *)CTIMER2_BASE)\r\n  /** Peripheral CTIMER2 base pointer */\r\n  #define CTIMER2_NS                               ((CTIMER_Type *)CTIMER2_BASE_NS)\r\n  /** Peripheral CTIMER3 base address */\r\n  #define CTIMER3_BASE                             (0x5002B000u)\r\n  /** Peripheral CTIMER3 base address */\r\n  #define CTIMER3_BASE_NS                          (0x4002B000u)\r\n  /** Peripheral CTIMER3 base pointer */\r\n  #define CTIMER3                                  ((CTIMER_Type *)CTIMER3_BASE)\r\n  /** Peripheral CTIMER3 base pointer */\r\n  #define CTIMER3_NS                               ((CTIMER_Type *)CTIMER3_BASE_NS)\r\n  /** Array initializer of CTIMER peripheral base addresses */\r\n  #define CTIMER_BASE_ADDRS                        { CTIMER0_BASE, CTIMER1_BASE, CTIMER2_BASE, CTIMER3_BASE }\r\n  /** Array initializer of CTIMER peripheral base pointers */\r\n  #define CTIMER_BASE_PTRS                         { CTIMER0, CTIMER1, CTIMER2, CTIMER3 }\r\n  /** Array initializer of CTIMER peripheral base addresses */\r\n  #define CTIMER_BASE_ADDRS_NS                     { CTIMER0_BASE_NS, CTIMER1_BASE_NS, CTIMER2_BASE_NS, CTIMER3_BASE_NS }\r\n  /** Array initializer of CTIMER peripheral base pointers */\r\n  #define CTIMER_BASE_PTRS_NS                      { CTIMER0_NS, CTIMER1_NS, CTIMER2_NS, CTIMER3_NS }\r\n#else\r\n  /** Peripheral CTIMER0 base address */\r\n  #define CTIMER0_BASE                             (0x40028000u)\r\n  /** Peripheral CTIMER0 base pointer */\r\n  #define CTIMER0                                  ((CTIMER_Type *)CTIMER0_BASE)\r\n  /** Peripheral CTIMER1 base address */\r\n  #define CTIMER1_BASE                             (0x40029000u)\r\n  /** Peripheral CTIMER1 base pointer */\r\n  #define CTIMER1                                  ((CTIMER_Type *)CTIMER1_BASE)\r\n  /** Peripheral CTIMER2 base address */\r\n  #define CTIMER2_BASE                             (0x4002A000u)\r\n  /** Peripheral CTIMER2 base pointer */\r\n  #define CTIMER2                                  ((CTIMER_Type *)CTIMER2_BASE)\r\n  /** Peripheral CTIMER3 base address */\r\n  #define CTIMER3_BASE                             (0x4002B000u)\r\n  /** Peripheral CTIMER3 base pointer */\r\n  #define CTIMER3                                  ((CTIMER_Type *)CTIMER3_BASE)\r\n  /** Array initializer of CTIMER peripheral base addresses */\r\n  #define CTIMER_BASE_ADDRS                        { CTIMER0_BASE, CTIMER1_BASE, CTIMER2_BASE, CTIMER3_BASE }\r\n  /** Array initializer of CTIMER peripheral base pointers */\r\n  #define CTIMER_BASE_PTRS                         { CTIMER0, CTIMER1, CTIMER2, CTIMER3 }\r\n#endif\r\n/** Interrupt vectors for the CTIMER peripheral type */\r\n#define CTIMER_IRQS                              { CTIMER0_IRQn, CTIMER1_IRQn, CTIMER2_IRQn, CTIMER3_IRQn }\r\n\r\n/*!\r\n * @}\r\n */ /* end of group CTIMER_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- DAC Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup DAC_Peripheral_Access_Layer DAC Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** DAC - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t CTRL;                              /**< DAC Control Register, offset: 0x0 */\r\n  __I  uint32_t STATUS;                            /**< DAC Status Register, offset: 0x4 */\r\n  __IO uint32_t ACTRL;                             /**< Channel A Control Register, offset: 0x8 */\r\n  __IO uint32_t BCTRL;                             /**< Channel B Control Register, offset: 0xC */\r\n  __IO uint32_t ADATA;                             /**< Channel A Data Register, offset: 0x10 */\r\n  __IO uint32_t BDATA;                             /**< Channel B Data Register, offset: 0x14 */\r\n  __I  uint32_t ISR;                               /**< Interrupt Status Register, offset: 0x18 */\r\n  __IO uint32_t IMR;                               /**< Interrupt Mask Register, offset: 0x1C */\r\n  __I  uint32_t IRSR;                              /**< Interrupt Raw Status Register, offset: 0x20 */\r\n  __IO uint32_t ICR;                               /**< Interrupt Clear Register, offset: 0x24 */\r\n  __IO uint32_t CLK;                               /**< Clock Register, offset: 0x28 */\r\n  __IO uint32_t RST;                               /**< Soft Reset Register, offset: 0x2C */\r\n} DAC_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- DAC Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup DAC_Register_Masks DAC Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name CTRL - DAC Control Register */\r\n/*! @{ */\r\n\r\n#define DAC_CTRL_REF_SEL_MASK                    (0x1U)\r\n#define DAC_CTRL_REF_SEL_SHIFT                   (0U)\r\n/*! REF_SEL - Reference selector\r\n *  0b0..internal reference\r\n *  0b1..external reference\r\n */\r\n#define DAC_CTRL_REF_SEL(x)                      (((uint32_t)(((uint32_t)(x)) << DAC_CTRL_REF_SEL_SHIFT)) & DAC_CTRL_REF_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name STATUS - DAC Status Register */\r\n/*! @{ */\r\n\r\n#define DAC_STATUS_A_DV_MASK                     (0x1U)\r\n#define DAC_STATUS_A_DV_SHIFT                    (0U)\r\n/*! A_DV - DACA conversion status.\r\n *  0b0..channel A conversion is not done\r\n *  0b1..channel A conversion complete\r\n */\r\n#define DAC_STATUS_A_DV(x)                       (((uint32_t)(((uint32_t)(x)) << DAC_STATUS_A_DV_SHIFT)) & DAC_STATUS_A_DV_MASK)\r\n\r\n#define DAC_STATUS_B_DV_MASK                     (0x2U)\r\n#define DAC_STATUS_B_DV_SHIFT                    (1U)\r\n/*! B_DV - DACB conversion status\r\n *  0b0..channel B conversion is not done\r\n *  0b1..channel B conversion complete\r\n */\r\n#define DAC_STATUS_B_DV(x)                       (((uint32_t)(((uint32_t)(x)) << DAC_STATUS_B_DV_SHIFT)) & DAC_STATUS_B_DV_MASK)\r\n/*! @} */\r\n\r\n/*! @name ACTRL - Channel A Control Register */\r\n/*! @{ */\r\n\r\n#define DAC_ACTRL_A_EN_MASK                      (0x1U)\r\n#define DAC_ACTRL_A_EN_SHIFT                     (0U)\r\n/*! A_EN - Channel A Enable/Disable signal\r\n *  0b0..disable channel A conversion\r\n *  0b1..enable channel A conversion\r\n */\r\n#define DAC_ACTRL_A_EN(x)                        (((uint32_t)(((uint32_t)(x)) << DAC_ACTRL_A_EN_SHIFT)) & DAC_ACTRL_A_EN_MASK)\r\n\r\n#define DAC_ACTRL_A_IO_EN_MASK                   (0x2U)\r\n#define DAC_ACTRL_A_IO_EN_SHIFT                  (1U)\r\n/*! A_IO_EN - Channel A conversion output to pad enable\r\n *  0b0..disable channel A conversion result to GPIO\r\n *  0b1..enable channel A conversion result to GPIO\r\n */\r\n#define DAC_ACTRL_A_IO_EN(x)                     (((uint32_t)(((uint32_t)(x)) << DAC_ACTRL_A_IO_EN_SHIFT)) & DAC_ACTRL_A_IO_EN_MASK)\r\n\r\n#define DAC_ACTRL_A_TRIG_EN_MASK                 (0x4U)\r\n#define DAC_ACTRL_A_TRIG_EN_SHIFT                (2U)\r\n/*! A_TRIG_EN - Channel A trigger enable\r\n *  0b0..Channel A conversion triggered by external event disabled\r\n *  0b1..Channel A conversion triggered by external event enabled\r\n */\r\n#define DAC_ACTRL_A_TRIG_EN(x)                   (((uint32_t)(((uint32_t)(x)) << DAC_ACTRL_A_TRIG_EN_SHIFT)) & DAC_ACTRL_A_TRIG_EN_MASK)\r\n\r\n#define DAC_ACTRL_A_TRIG_SEL_MASK                (0x18U)\r\n#define DAC_ACTRL_A_TRIG_SEL_SHIFT               (3U)\r\n/*! A_TRIG_SEL - Channel A trigger selector\r\n *  0b00..ctimer1 match2\r\n *  0b01..ctimer1 match1\r\n *  0b10..GPIO50\r\n *  0b11..GPIO55\r\n */\r\n#define DAC_ACTRL_A_TRIG_SEL(x)                  (((uint32_t)(((uint32_t)(x)) << DAC_ACTRL_A_TRIG_SEL_SHIFT)) & DAC_ACTRL_A_TRIG_SEL_MASK)\r\n\r\n#define DAC_ACTRL_A_TRIG_TYP_MASK                (0x60U)\r\n#define DAC_ACTRL_A_TRIG_TYP_SHIFT               (5U)\r\n/*! A_TRIG_TYP - Channel A trigger type\r\n *  0b00..reserved\r\n *  0b01..rising edge trigger\r\n *  0b10..falling edge trigger\r\n *  0b11..both rising and falling edge trigger\r\n */\r\n#define DAC_ACTRL_A_TRIG_TYP(x)                  (((uint32_t)(((uint32_t)(x)) << DAC_ACTRL_A_TRIG_TYP_SHIFT)) & DAC_ACTRL_A_TRIG_TYP_MASK)\r\n\r\n#define DAC_ACTRL_A_DEN_MASK                     (0x80U)\r\n#define DAC_ACTRL_A_DEN_SHIFT                    (7U)\r\n/*! A_DEN - Channel A DMA enable\r\n *  0b0..DMA data transfer disabled\r\n *  0b1..DMA data transfer enabled\r\n */\r\n#define DAC_ACTRL_A_DEN(x)                       (((uint32_t)(((uint32_t)(x)) << DAC_ACTRL_A_DEN_SHIFT)) & DAC_ACTRL_A_DEN_MASK)\r\n\r\n#define DAC_ACTRL_A_TIME_MODE_MASK               (0x100U)\r\n#define DAC_ACTRL_A_TIME_MODE_SHIFT              (8U)\r\n/*! A_TIME_MODE - Channel A Mode\r\n *  0b0..non-timing related\r\n *  0b1..timing related\r\n */\r\n#define DAC_ACTRL_A_TIME_MODE(x)                 (((uint32_t)(((uint32_t)(x)) << DAC_ACTRL_A_TIME_MODE_SHIFT)) & DAC_ACTRL_A_TIME_MODE_MASK)\r\n\r\n#define DAC_ACTRL_A_TRIA_HALF_MASK               (0x200U)\r\n#define DAC_ACTRL_A_TRIA_HALF_SHIFT              (9U)\r\n/*! A_TRIA_HALF - Channel A triangle wave type selector.\r\n *  0b0..full triangle\r\n *  0b1..half triangle\r\n */\r\n#define DAC_ACTRL_A_TRIA_HALF(x)                 (((uint32_t)(((uint32_t)(x)) << DAC_ACTRL_A_TRIA_HALF_SHIFT)) & DAC_ACTRL_A_TRIA_HALF_MASK)\r\n\r\n#define DAC_ACTRL_A_TRIA_MAMP_SEL_MASK           (0x3C00U)\r\n#define DAC_ACTRL_A_TRIA_MAMP_SEL_SHIFT          (10U)\r\n/*! A_TRIA_MAMP_SEL - Channel A triangle wave max amplitude selector.\r\n *  0b0000..63\r\n *  0b0001..127\r\n *  0b0010..191\r\n *  0b0011..255\r\n *  0b0100..319\r\n *  0b0101..383\r\n *  0b0110..447\r\n *  0b0111..511\r\n *  0b1000..575\r\n *  0b1001..639\r\n *  0b1010..703\r\n *  0b1011..767\r\n *  0b1100..831\r\n *  0b1101..895\r\n *  0b1110..959\r\n *  0b1111..1023\r\n */\r\n#define DAC_ACTRL_A_TRIA_MAMP_SEL(x)             (((uint32_t)(((uint32_t)(x)) << DAC_ACTRL_A_TRIA_MAMP_SEL_SHIFT)) & DAC_ACTRL_A_TRIA_MAMP_SEL_MASK)\r\n\r\n#define DAC_ACTRL_A_TRIA_STEP_SEL_MASK           (0xC000U)\r\n#define DAC_ACTRL_A_TRIA_STEP_SEL_SHIFT          (14U)\r\n/*! A_TRIA_STEP_SEL - Channel A triangle wave step selector.\r\n *  0b00..1\r\n *  0b01..3\r\n *  0b10..15\r\n *  0b11..511\r\n */\r\n#define DAC_ACTRL_A_TRIA_STEP_SEL(x)             (((uint32_t)(((uint32_t)(x)) << DAC_ACTRL_A_TRIA_STEP_SEL_SHIFT)) & DAC_ACTRL_A_TRIA_STEP_SEL_MASK)\r\n\r\n#define DAC_ACTRL_A_WAVE_MASK                    (0x30000U)\r\n#define DAC_ACTRL_A_WAVE_SHIFT                   (16U)\r\n/*! A_WAVE - Channel A wave type select.\r\n *  0b00..\r\n *  0b01..triangle wave\r\n *  0b11..\r\n *  0b10..sine wave\r\n */\r\n#define DAC_ACTRL_A_WAVE(x)                      (((uint32_t)(((uint32_t)(x)) << DAC_ACTRL_A_WAVE_SHIFT)) & DAC_ACTRL_A_WAVE_MASK)\r\n\r\n#define DAC_ACTRL_A_RANGE_MASK                   (0xC0000U)\r\n#define DAC_ACTRL_A_RANGE_SHIFT                  (18U)\r\n/*! A_RANGE - Output voltage range control, with Internal/External reference\r\n *  0b00..0.16+(0.64*input code/1023) with ref_sel=0(internal)/0.08* Vref_ext+(0.32* Vref_ext*input_code/1023) with ref_sel=1(external)\r\n *  0b01..0.19+(1.01*input code /1023) with ref_sel=0(internal)/0.095* Vref_ext+(0.505* Vref_ext*input_code/1023) with ref_sel=1(external)\r\n *  0b10..0.19+(1.01*input code /1023) with ref_sel=0(internal)/0.095* Vref_ext+(0.505* Vref_ext*input_code/1023) with ref_sel=1(external)\r\n *  0b11..0.18+(1.42*input code /1023) with ref_sel=0(internal)/0.09*Vref_ext+(0.71* Vref_ext*input_code/1023) with ref_sel=1(external)\r\n */\r\n#define DAC_ACTRL_A_RANGE(x)                     (((uint32_t)(((uint32_t)(x)) << DAC_ACTRL_A_RANGE_SHIFT)) & DAC_ACTRL_A_RANGE_MASK)\r\n/*! @} */\r\n\r\n/*! @name BCTRL - Channel B Control Register */\r\n/*! @{ */\r\n\r\n#define DAC_BCTRL_B_EN_MASK                      (0x1U)\r\n#define DAC_BCTRL_B_EN_SHIFT                     (0U)\r\n/*! B_EN - Channel B Enable/Disable signal\r\n *  0b0..disable channel B conversion\r\n *  0b1..enable channel B conversion\r\n */\r\n#define DAC_BCTRL_B_EN(x)                        (((uint32_t)(((uint32_t)(x)) << DAC_BCTRL_B_EN_SHIFT)) & DAC_BCTRL_B_EN_MASK)\r\n\r\n#define DAC_BCTRL_B_IO_EN_MASK                   (0x2U)\r\n#define DAC_BCTRL_B_IO_EN_SHIFT                  (1U)\r\n/*! B_IO_EN - Channel B conversion output to pad enable\r\n *  0b0..disable channel B conversion result to GPIO\r\n *  0b1..enable channel B conversion result to GPIO\r\n */\r\n#define DAC_BCTRL_B_IO_EN(x)                     (((uint32_t)(((uint32_t)(x)) << DAC_BCTRL_B_IO_EN_SHIFT)) & DAC_BCTRL_B_IO_EN_MASK)\r\n\r\n#define DAC_BCTRL_B_TRIG_EN_MASK                 (0x4U)\r\n#define DAC_BCTRL_B_TRIG_EN_SHIFT                (2U)\r\n/*! B_TRIG_EN - Channel B trigger enable\r\n *  0b0..Channel B conversion triggered by external event disabled\r\n *  0b1..Channel B conversion triggered by external event enabled\r\n */\r\n#define DAC_BCTRL_B_TRIG_EN(x)                   (((uint32_t)(((uint32_t)(x)) << DAC_BCTRL_B_TRIG_EN_SHIFT)) & DAC_BCTRL_B_TRIG_EN_MASK)\r\n\r\n#define DAC_BCTRL_B_TRIG_SEL_MASK                (0x18U)\r\n#define DAC_BCTRL_B_TRIG_SEL_SHIFT               (3U)\r\n/*! B_TRIG_SEL - Channel B trigger selector\r\n *  0b00..ctimer1 match2\r\n *  0b01..ctimer1 match1\r\n *  0b10..GPIO50\r\n *  0b11..GPIO55\r\n */\r\n#define DAC_BCTRL_B_TRIG_SEL(x)                  (((uint32_t)(((uint32_t)(x)) << DAC_BCTRL_B_TRIG_SEL_SHIFT)) & DAC_BCTRL_B_TRIG_SEL_MASK)\r\n\r\n#define DAC_BCTRL_B_TRIG_TYP_MASK                (0x60U)\r\n#define DAC_BCTRL_B_TRIG_TYP_SHIFT               (5U)\r\n/*! B_TRIG_TYP - Channel B trigger type\r\n *  0b00..reserved\r\n *  0b01..rising edge trigger\r\n *  0b10..falling edge trigger\r\n *  0b11..both rising and falling edge trigger\r\n */\r\n#define DAC_BCTRL_B_TRIG_TYP(x)                  (((uint32_t)(((uint32_t)(x)) << DAC_BCTRL_B_TRIG_TYP_SHIFT)) & DAC_BCTRL_B_TRIG_TYP_MASK)\r\n\r\n#define DAC_BCTRL_B_DEN_MASK                     (0x80U)\r\n#define DAC_BCTRL_B_DEN_SHIFT                    (7U)\r\n/*! B_DEN - Channel B DMA enable\r\n *  0b0..DMA data transfer disabled\r\n *  0b1..DMA data transfer enabled\r\n */\r\n#define DAC_BCTRL_B_DEN(x)                       (((uint32_t)(((uint32_t)(x)) << DAC_BCTRL_B_DEN_SHIFT)) & DAC_BCTRL_B_DEN_MASK)\r\n\r\n#define DAC_BCTRL_B_TIME_MODE_MASK               (0x100U)\r\n#define DAC_BCTRL_B_TIME_MODE_SHIFT              (8U)\r\n/*! B_TIME_MODE - Channel B Mode\r\n *  0b0..non-timing related\r\n *  0b1..timing related\r\n */\r\n#define DAC_BCTRL_B_TIME_MODE(x)                 (((uint32_t)(((uint32_t)(x)) << DAC_BCTRL_B_TIME_MODE_SHIFT)) & DAC_BCTRL_B_TIME_MODE_MASK)\r\n\r\n#define DAC_BCTRL_B_WAVE_MASK                    (0x600U)\r\n#define DAC_BCTRL_B_WAVE_SHIFT                   (9U)\r\n/*! B_WAVE - Channel B wave type select.\r\n *  0b00..\r\n *  0b01..reserved\r\n *  0b10..reserved\r\n *  0b11..differential mode with channel A\r\n */\r\n#define DAC_BCTRL_B_WAVE(x)                      (((uint32_t)(((uint32_t)(x)) << DAC_BCTRL_B_WAVE_SHIFT)) & DAC_BCTRL_B_WAVE_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADATA - Channel A Data Register */\r\n/*! @{ */\r\n\r\n#define DAC_ADATA_A_DATA_MASK                    (0x3FFU)\r\n#define DAC_ADATA_A_DATA_SHIFT                   (0U)\r\n/*! A_DATA - Channel A Data input */\r\n#define DAC_ADATA_A_DATA(x)                      (((uint32_t)(((uint32_t)(x)) << DAC_ADATA_A_DATA_SHIFT)) & DAC_ADATA_A_DATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name BDATA - Channel B Data Register */\r\n/*! @{ */\r\n\r\n#define DAC_BDATA_B_DATA_MASK                    (0x3FFU)\r\n#define DAC_BDATA_B_DATA_SHIFT                   (0U)\r\n/*! B_DATA - Channel B Data input */\r\n#define DAC_BDATA_B_DATA(x)                      (((uint32_t)(((uint32_t)(x)) << DAC_BDATA_B_DATA_SHIFT)) & DAC_BDATA_B_DATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name ISR - Interrupt Status Register */\r\n/*! @{ */\r\n\r\n#define DAC_ISR_A_RDY_INT_MASK                   (0x1U)\r\n#define DAC_ISR_A_RDY_INT_SHIFT                  (0U)\r\n/*! A_RDY_INT - Channel A Data Ready */\r\n#define DAC_ISR_A_RDY_INT(x)                     (((uint32_t)(((uint32_t)(x)) << DAC_ISR_A_RDY_INT_SHIFT)) & DAC_ISR_A_RDY_INT_MASK)\r\n\r\n#define DAC_ISR_B_RDY_INT_MASK                   (0x2U)\r\n#define DAC_ISR_B_RDY_INT_SHIFT                  (1U)\r\n/*! B_RDY_INT - Channel B Data Ready */\r\n#define DAC_ISR_B_RDY_INT(x)                     (((uint32_t)(((uint32_t)(x)) << DAC_ISR_B_RDY_INT_SHIFT)) & DAC_ISR_B_RDY_INT_MASK)\r\n\r\n#define DAC_ISR_A_TO_INT_MASK                    (0x4U)\r\n#define DAC_ISR_A_TO_INT_SHIFT                   (2U)\r\n/*! A_TO_INT - Channel A Timeout */\r\n#define DAC_ISR_A_TO_INT(x)                      (((uint32_t)(((uint32_t)(x)) << DAC_ISR_A_TO_INT_SHIFT)) & DAC_ISR_A_TO_INT_MASK)\r\n\r\n#define DAC_ISR_B_TO_INT_MASK                    (0x8U)\r\n#define DAC_ISR_B_TO_INT_SHIFT                   (3U)\r\n/*! B_TO_INT - Channel B Timeout */\r\n#define DAC_ISR_B_TO_INT(x)                      (((uint32_t)(((uint32_t)(x)) << DAC_ISR_B_TO_INT_SHIFT)) & DAC_ISR_B_TO_INT_MASK)\r\n\r\n#define DAC_ISR_TRIA_OVFL_INT_MASK               (0x10U)\r\n#define DAC_ISR_TRIA_OVFL_INT_SHIFT              (4U)\r\n/*! TRIA_OVFL_INT - Triangle Overflow */\r\n#define DAC_ISR_TRIA_OVFL_INT(x)                 (((uint32_t)(((uint32_t)(x)) << DAC_ISR_TRIA_OVFL_INT_SHIFT)) & DAC_ISR_TRIA_OVFL_INT_MASK)\r\n/*! @} */\r\n\r\n/*! @name IMR - Interrupt Mask Register */\r\n/*! @{ */\r\n\r\n#define DAC_IMR_A_RDY_INT_MSK_MASK               (0x1U)\r\n#define DAC_IMR_A_RDY_INT_MSK_SHIFT              (0U)\r\n/*! A_RDY_INT_MSK - Channel A Data Ready Mask */\r\n#define DAC_IMR_A_RDY_INT_MSK(x)                 (((uint32_t)(((uint32_t)(x)) << DAC_IMR_A_RDY_INT_MSK_SHIFT)) & DAC_IMR_A_RDY_INT_MSK_MASK)\r\n\r\n#define DAC_IMR_B_RDY_INT_MSK_MASK               (0x2U)\r\n#define DAC_IMR_B_RDY_INT_MSK_SHIFT              (1U)\r\n/*! B_RDY_INT_MSK - Channel B Data Ready Mask */\r\n#define DAC_IMR_B_RDY_INT_MSK(x)                 (((uint32_t)(((uint32_t)(x)) << DAC_IMR_B_RDY_INT_MSK_SHIFT)) & DAC_IMR_B_RDY_INT_MSK_MASK)\r\n\r\n#define DAC_IMR_A_TO_INT_MSK_MASK                (0x4U)\r\n#define DAC_IMR_A_TO_INT_MSK_SHIFT               (2U)\r\n/*! A_TO_INT_MSK - Channel A Timeout Mask */\r\n#define DAC_IMR_A_TO_INT_MSK(x)                  (((uint32_t)(((uint32_t)(x)) << DAC_IMR_A_TO_INT_MSK_SHIFT)) & DAC_IMR_A_TO_INT_MSK_MASK)\r\n\r\n#define DAC_IMR_B_TO_INT_MSK_MASK                (0x8U)\r\n#define DAC_IMR_B_TO_INT_MSK_SHIFT               (3U)\r\n/*! B_TO_INT_MSK - Channel B Timeout Mask */\r\n#define DAC_IMR_B_TO_INT_MSK(x)                  (((uint32_t)(((uint32_t)(x)) << DAC_IMR_B_TO_INT_MSK_SHIFT)) & DAC_IMR_B_TO_INT_MSK_MASK)\r\n\r\n#define DAC_IMR_TRIA_OVFL_INT_MSK_MASK           (0x10U)\r\n#define DAC_IMR_TRIA_OVFL_INT_MSK_SHIFT          (4U)\r\n/*! TRIA_OVFL_INT_MSK - Triangle Overflow Mask */\r\n#define DAC_IMR_TRIA_OVFL_INT_MSK(x)             (((uint32_t)(((uint32_t)(x)) << DAC_IMR_TRIA_OVFL_INT_MSK_SHIFT)) & DAC_IMR_TRIA_OVFL_INT_MSK_MASK)\r\n/*! @} */\r\n\r\n/*! @name IRSR - Interrupt Raw Status Register */\r\n/*! @{ */\r\n\r\n#define DAC_IRSR_A_RDY_INT_RAW_MASK              (0x1U)\r\n#define DAC_IRSR_A_RDY_INT_RAW_SHIFT             (0U)\r\n/*! A_RDY_INT_RAW - Channel A Data Ready Raw */\r\n#define DAC_IRSR_A_RDY_INT_RAW(x)                (((uint32_t)(((uint32_t)(x)) << DAC_IRSR_A_RDY_INT_RAW_SHIFT)) & DAC_IRSR_A_RDY_INT_RAW_MASK)\r\n\r\n#define DAC_IRSR_B_RDY_INT_RAW_MASK              (0x2U)\r\n#define DAC_IRSR_B_RDY_INT_RAW_SHIFT             (1U)\r\n/*! B_RDY_INT_RAW - Channel B Data Ready Raw */\r\n#define DAC_IRSR_B_RDY_INT_RAW(x)                (((uint32_t)(((uint32_t)(x)) << DAC_IRSR_B_RDY_INT_RAW_SHIFT)) & DAC_IRSR_B_RDY_INT_RAW_MASK)\r\n\r\n#define DAC_IRSR_A_TO_INT_RAW_MASK               (0x4U)\r\n#define DAC_IRSR_A_TO_INT_RAW_SHIFT              (2U)\r\n/*! A_TO_INT_RAW - Channel A Timeout Raw */\r\n#define DAC_IRSR_A_TO_INT_RAW(x)                 (((uint32_t)(((uint32_t)(x)) << DAC_IRSR_A_TO_INT_RAW_SHIFT)) & DAC_IRSR_A_TO_INT_RAW_MASK)\r\n\r\n#define DAC_IRSR_B_TO_INT_RAW_MASK               (0x8U)\r\n#define DAC_IRSR_B_TO_INT_RAW_SHIFT              (3U)\r\n/*! B_TO_INT_RAW - Channel B Timeout Raw */\r\n#define DAC_IRSR_B_TO_INT_RAW(x)                 (((uint32_t)(((uint32_t)(x)) << DAC_IRSR_B_TO_INT_RAW_SHIFT)) & DAC_IRSR_B_TO_INT_RAW_MASK)\r\n\r\n#define DAC_IRSR_TRIA_OVFL_INT_RAW_MASK          (0x10U)\r\n#define DAC_IRSR_TRIA_OVFL_INT_RAW_SHIFT         (4U)\r\n/*! TRIA_OVFL_INT_RAW - Triangle Overflow Raw */\r\n#define DAC_IRSR_TRIA_OVFL_INT_RAW(x)            (((uint32_t)(((uint32_t)(x)) << DAC_IRSR_TRIA_OVFL_INT_RAW_SHIFT)) & DAC_IRSR_TRIA_OVFL_INT_RAW_MASK)\r\n/*! @} */\r\n\r\n/*! @name ICR - Interrupt Clear Register */\r\n/*! @{ */\r\n\r\n#define DAC_ICR_A_RDY_INT_CLR_MASK               (0x1U)\r\n#define DAC_ICR_A_RDY_INT_CLR_SHIFT              (0U)\r\n/*! A_RDY_INT_CLR - Channel A Data Ready Clear */\r\n#define DAC_ICR_A_RDY_INT_CLR(x)                 (((uint32_t)(((uint32_t)(x)) << DAC_ICR_A_RDY_INT_CLR_SHIFT)) & DAC_ICR_A_RDY_INT_CLR_MASK)\r\n\r\n#define DAC_ICR_B_RDY_INT_CLR_MASK               (0x2U)\r\n#define DAC_ICR_B_RDY_INT_CLR_SHIFT              (1U)\r\n/*! B_RDY_INT_CLR - Channel B Data Ready Clear */\r\n#define DAC_ICR_B_RDY_INT_CLR(x)                 (((uint32_t)(((uint32_t)(x)) << DAC_ICR_B_RDY_INT_CLR_SHIFT)) & DAC_ICR_B_RDY_INT_CLR_MASK)\r\n\r\n#define DAC_ICR_A_TO_INT_CLR_MASK                (0x4U)\r\n#define DAC_ICR_A_TO_INT_CLR_SHIFT               (2U)\r\n/*! A_TO_INT_CLR - Channel A Timeout Clear */\r\n#define DAC_ICR_A_TO_INT_CLR(x)                  (((uint32_t)(((uint32_t)(x)) << DAC_ICR_A_TO_INT_CLR_SHIFT)) & DAC_ICR_A_TO_INT_CLR_MASK)\r\n\r\n#define DAC_ICR_B_TO_INT_CLR_MASK                (0x8U)\r\n#define DAC_ICR_B_TO_INT_CLR_SHIFT               (3U)\r\n/*! B_TO_INT_CLR - Channel B Timeout Clear */\r\n#define DAC_ICR_B_TO_INT_CLR(x)                  (((uint32_t)(((uint32_t)(x)) << DAC_ICR_B_TO_INT_CLR_SHIFT)) & DAC_ICR_B_TO_INT_CLR_MASK)\r\n\r\n#define DAC_ICR_TRIA_OVFL_INT_CLR_MASK           (0x10U)\r\n#define DAC_ICR_TRIA_OVFL_INT_CLR_SHIFT          (4U)\r\n/*! TRIA_OVFL_INT_CLR - Triangle Overflow Clear */\r\n#define DAC_ICR_TRIA_OVFL_INT_CLR(x)             (((uint32_t)(((uint32_t)(x)) << DAC_ICR_TRIA_OVFL_INT_CLR_SHIFT)) & DAC_ICR_TRIA_OVFL_INT_CLR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLK - Clock Register */\r\n/*! @{ */\r\n\r\n#define DAC_CLK_CLK_CTRL_MASK                    (0x6U)\r\n#define DAC_CLK_CLK_CTRL_SHIFT                   (1U)\r\n/*! CLK_CTRL - DAC conversion rate selector.\r\n *  0b00..62.5K\r\n *  0b01..125K\r\n *  0b10..250K\r\n *  0b11..500K\r\n */\r\n#define DAC_CLK_CLK_CTRL(x)                      (((uint32_t)(((uint32_t)(x)) << DAC_CLK_CLK_CTRL_SHIFT)) & DAC_CLK_CLK_CTRL_MASK)\r\n\r\n#define DAC_CLK_SOFT_CLK_RST_MASK                (0x10U)\r\n#define DAC_CLK_SOFT_CLK_RST_SHIFT               (4U)\r\n/*! SOFT_CLK_RST - Soft reset for clock divider\r\n *  0b0..\r\n *  0b1..\r\n */\r\n#define DAC_CLK_SOFT_CLK_RST(x)                  (((uint32_t)(((uint32_t)(x)) << DAC_CLK_SOFT_CLK_RST_SHIFT)) & DAC_CLK_SOFT_CLK_RST_MASK)\r\n/*! @} */\r\n\r\n/*! @name RST - Soft Reset Register */\r\n/*! @{ */\r\n\r\n#define DAC_RST_A_SOFT_RST_MASK                  (0x1U)\r\n#define DAC_RST_A_SOFT_RST_SHIFT                 (0U)\r\n/*! A_SOFT_RST - Soft reset for DAC channel A, active high\r\n *  0b0..no action\r\n *  0b1..\r\n */\r\n#define DAC_RST_A_SOFT_RST(x)                    (((uint32_t)(((uint32_t)(x)) << DAC_RST_A_SOFT_RST_SHIFT)) & DAC_RST_A_SOFT_RST_MASK)\r\n\r\n#define DAC_RST_B_SOFT_RST_MASK                  (0x2U)\r\n#define DAC_RST_B_SOFT_RST_SHIFT                 (1U)\r\n/*! B_SOFT_RST - Soft reset for DAC channel B, active high\r\n *  0b0..no action\r\n *  0b1..\r\n */\r\n#define DAC_RST_B_SOFT_RST(x)                    (((uint32_t)(((uint32_t)(x)) << DAC_RST_B_SOFT_RST_SHIFT)) & DAC_RST_B_SOFT_RST_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group DAC_Register_Masks */\r\n\r\n\r\n/* DAC - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral GAU_DAC0 base address */\r\n  #define GAU_DAC0_BASE                            (0x50038200u)\r\n  /** Peripheral GAU_DAC0 base address */\r\n  #define GAU_DAC0_BASE_NS                         (0x40038200u)\r\n  /** Peripheral GAU_DAC0 base pointer */\r\n  #define GAU_DAC0                                 ((DAC_Type *)GAU_DAC0_BASE)\r\n  /** Peripheral GAU_DAC0 base pointer */\r\n  #define GAU_DAC0_NS                              ((DAC_Type *)GAU_DAC0_BASE_NS)\r\n  /** Array initializer of DAC peripheral base addresses */\r\n  #define DAC_BASE_ADDRS                           { GAU_DAC0_BASE }\r\n  /** Array initializer of DAC peripheral base pointers */\r\n  #define DAC_BASE_PTRS                            { GAU_DAC0 }\r\n  /** Array initializer of DAC peripheral base addresses */\r\n  #define DAC_BASE_ADDRS_NS                        { GAU_DAC0_BASE_NS }\r\n  /** Array initializer of DAC peripheral base pointers */\r\n  #define DAC_BASE_PTRS_NS                         { GAU_DAC0_NS }\r\n#else\r\n  /** Peripheral GAU_DAC0 base address */\r\n  #define GAU_DAC0_BASE                            (0x40038200u)\r\n  /** Peripheral GAU_DAC0 base pointer */\r\n  #define GAU_DAC0                                 ((DAC_Type *)GAU_DAC0_BASE)\r\n  /** Array initializer of DAC peripheral base addresses */\r\n  #define DAC_BASE_ADDRS                           { GAU_DAC0_BASE }\r\n  /** Array initializer of DAC peripheral base pointers */\r\n  #define DAC_BASE_PTRS                            { GAU_DAC0 }\r\n#endif\r\n/** Interrupt vectors for the DAC peripheral type */\r\n#define DAC_IRQS                                 { GAU_DAC_IRQn }\r\n/* Backward compatibility */\r\n#define kDAC_GPT2Trigger                         kDAC_TriggerSourceCtimer1Match2\r\n#define kDAC_GPT3Trigger                         kDAC_TriggerSourceCtimer1Match1\r\n#define kDAC_GPIO45Trigger                       kDAC_TriggerSourceGpio50\r\n#define kDAC_GPIO44Trigger                       kDAC_TriggerSourceGpio55\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group DAC_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- DBGMAILBOX Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup DBGMAILBOX_Peripheral_Access_Layer DBGMAILBOX Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** DBGMAILBOX - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t CSW;                               /**< Command and status word, offset: 0x0 */\r\n  __IO uint32_t REQUEST;                           /**< Request Value, offset: 0x4 */\r\n  __IO uint32_t RETURN;                            /**< Return Value, offset: 0x8 */\r\n       uint8_t RESERVED_0[240];\r\n  __I  uint32_t ID;                                /**< Identification, offset: 0xFC */\r\n} DBGMAILBOX_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- DBGMAILBOX Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup DBGMAILBOX_Register_Masks DBGMAILBOX Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name CSW - Command and status word */\r\n/*! @{ */\r\n\r\n#define DBGMAILBOX_CSW_RESYNCH_REQ_MASK          (0x1U)\r\n#define DBGMAILBOX_CSW_RESYNCH_REQ_SHIFT         (0U)\r\n/*! RESYNCH_REQ - Re-synchronization Request\r\n *  0b0..No Request\r\n *  0b1..Request for re-synchronization\r\n */\r\n#define DBGMAILBOX_CSW_RESYNCH_REQ(x)            (((uint32_t)(((uint32_t)(x)) << DBGMAILBOX_CSW_RESYNCH_REQ_SHIFT)) & DBGMAILBOX_CSW_RESYNCH_REQ_MASK)\r\n\r\n#define DBGMAILBOX_CSW_REQ_PENDING_MASK          (0x2U)\r\n#define DBGMAILBOX_CSW_REQ_PENDING_SHIFT         (1U)\r\n/*! REQ_PENDING - Request Pending\r\n *  0b0..No Request Pending\r\n *  0b1..Request for Re-synchronization Pending\r\n */\r\n#define DBGMAILBOX_CSW_REQ_PENDING(x)            (((uint32_t)(((uint32_t)(x)) << DBGMAILBOX_CSW_REQ_PENDING_SHIFT)) & DBGMAILBOX_CSW_REQ_PENDING_MASK)\r\n\r\n#define DBGMAILBOX_CSW_DBG_OR_ERR_MASK           (0x4U)\r\n#define DBGMAILBOX_CSW_DBG_OR_ERR_SHIFT          (2U)\r\n/*! DBG_OR_ERR - Debug Overrun Error\r\n *  0b0..No Debug Overrun error\r\n *  0b1..Debug Overrun Error. A debug overrun occurred.\r\n */\r\n#define DBGMAILBOX_CSW_DBG_OR_ERR(x)             (((uint32_t)(((uint32_t)(x)) << DBGMAILBOX_CSW_DBG_OR_ERR_SHIFT)) & DBGMAILBOX_CSW_DBG_OR_ERR_MASK)\r\n\r\n#define DBGMAILBOX_CSW_AHB_OR_ERR_MASK           (0x8U)\r\n#define DBGMAILBOX_CSW_AHB_OR_ERR_SHIFT          (3U)\r\n/*! AHB_OR_ERR - AHB Overrun Error\r\n *  0b0..No AHB Overrun Error\r\n *  0b1..AHB Overrun Error. An AHB overrun occurred.\r\n */\r\n#define DBGMAILBOX_CSW_AHB_OR_ERR(x)             (((uint32_t)(((uint32_t)(x)) << DBGMAILBOX_CSW_AHB_OR_ERR_SHIFT)) & DBGMAILBOX_CSW_AHB_OR_ERR_MASK)\r\n\r\n#define DBGMAILBOX_CSW_SOFT_RESET_MASK           (0x10U)\r\n#define DBGMAILBOX_CSW_SOFT_RESET_SHIFT          (4U)\r\n/*! SOFT_RESET - Soft Reset */\r\n#define DBGMAILBOX_CSW_SOFT_RESET(x)             (((uint32_t)(((uint32_t)(x)) << DBGMAILBOX_CSW_SOFT_RESET_SHIFT)) & DBGMAILBOX_CSW_SOFT_RESET_MASK)\r\n\r\n#define DBGMAILBOX_CSW_CHIP_RESET_REQ_MASK       (0x20U)\r\n#define DBGMAILBOX_CSW_CHIP_RESET_REQ_SHIFT      (5U)\r\n/*! CHIP_RESET_REQ - Chip Reset Request */\r\n#define DBGMAILBOX_CSW_CHIP_RESET_REQ(x)         (((uint32_t)(((uint32_t)(x)) << DBGMAILBOX_CSW_CHIP_RESET_REQ_SHIFT)) & DBGMAILBOX_CSW_CHIP_RESET_REQ_MASK)\r\n/*! @} */\r\n\r\n/*! @name REQUEST - Request Value */\r\n/*! @{ */\r\n\r\n#define DBGMAILBOX_REQUEST_REQUEST_MASK          (0xFFFFFFFFU)\r\n#define DBGMAILBOX_REQUEST_REQUEST_SHIFT         (0U)\r\n/*! REQUEST - Request Value */\r\n#define DBGMAILBOX_REQUEST_REQUEST(x)            (((uint32_t)(((uint32_t)(x)) << DBGMAILBOX_REQUEST_REQUEST_SHIFT)) & DBGMAILBOX_REQUEST_REQUEST_MASK)\r\n/*! @} */\r\n\r\n/*! @name RETURN - Return Value */\r\n/*! @{ */\r\n\r\n#define DBGMAILBOX_RETURN_RET_MASK               (0xFFFFFFFFU)\r\n#define DBGMAILBOX_RETURN_RET_SHIFT              (0U)\r\n/*! RET - Return Value */\r\n#define DBGMAILBOX_RETURN_RET(x)                 (((uint32_t)(((uint32_t)(x)) << DBGMAILBOX_RETURN_RET_SHIFT)) & DBGMAILBOX_RETURN_RET_MASK)\r\n/*! @} */\r\n\r\n/*! @name ID - Identification */\r\n/*! @{ */\r\n\r\n#define DBGMAILBOX_ID_ID_MASK                    (0xFFFFFFFFU)\r\n#define DBGMAILBOX_ID_ID_SHIFT                   (0U)\r\n/*! ID - Identification Value */\r\n#define DBGMAILBOX_ID_ID(x)                      (((uint32_t)(((uint32_t)(x)) << DBGMAILBOX_ID_ID_SHIFT)) & DBGMAILBOX_ID_ID_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group DBGMAILBOX_Register_Masks */\r\n\r\n\r\n/* DBGMAILBOX - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral DBGMAILBOX base address */\r\n  #define DBGMAILBOX_BASE                          (0x5010F000u)\r\n  /** Peripheral DBGMAILBOX base address */\r\n  #define DBGMAILBOX_BASE_NS                       (0x4010F000u)\r\n  /** Peripheral DBGMAILBOX base pointer */\r\n  #define DBGMAILBOX                               ((DBGMAILBOX_Type *)DBGMAILBOX_BASE)\r\n  /** Peripheral DBGMAILBOX base pointer */\r\n  #define DBGMAILBOX_NS                            ((DBGMAILBOX_Type *)DBGMAILBOX_BASE_NS)\r\n  /** Array initializer of DBGMAILBOX peripheral base addresses */\r\n  #define DBGMAILBOX_BASE_ADDRS                    { DBGMAILBOX_BASE }\r\n  /** Array initializer of DBGMAILBOX peripheral base pointers */\r\n  #define DBGMAILBOX_BASE_PTRS                     { DBGMAILBOX }\r\n  /** Array initializer of DBGMAILBOX peripheral base addresses */\r\n  #define DBGMAILBOX_BASE_ADDRS_NS                 { DBGMAILBOX_BASE_NS }\r\n  /** Array initializer of DBGMAILBOX peripheral base pointers */\r\n  #define DBGMAILBOX_BASE_PTRS_NS                  { DBGMAILBOX_NS }\r\n#else\r\n  /** Peripheral DBGMAILBOX base address */\r\n  #define DBGMAILBOX_BASE                          (0x4010F000u)\r\n  /** Peripheral DBGMAILBOX base pointer */\r\n  #define DBGMAILBOX                               ((DBGMAILBOX_Type *)DBGMAILBOX_BASE)\r\n  /** Array initializer of DBGMAILBOX peripheral base addresses */\r\n  #define DBGMAILBOX_BASE_ADDRS                    { DBGMAILBOX_BASE }\r\n  /** Array initializer of DBGMAILBOX peripheral base pointers */\r\n  #define DBGMAILBOX_BASE_PTRS                     { DBGMAILBOX }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group DBGMAILBOX_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- DMA Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup DMA_Peripheral_Access_Layer DMA Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** DMA - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t CTRL;                              /**< DMA control, offset: 0x0 */\r\n  __I  uint32_t INTSTAT;                           /**< Interrupt status, offset: 0x4 */\r\n  __IO uint32_t SRAMBASE;                          /**< SRAM address of the channel configuration table, offset: 0x8 */\r\n       uint8_t RESERVED_0[20];\r\n  struct {                                         /* offset: 0x20, array step: 0x60 */\r\n    __IO uint32_t ENABLESET;                         /**< Channel Enable read and set for all DMA channels, array offset: 0x20, array step: 0x60 */\r\n    __IO uint32_t ENABLESET1;                        /**< Channel Enable read and set for all DMA channels, array offset: 0x24, array step: 0x60 */\r\n    __IO uint32_t ENABLECLR;                         /**< Channel Enable Clear for all DMA channels, array offset: 0x28, array step: 0x60 */\r\n    __IO uint32_t ENABLECLR1;                        /**< Channel Enable Clear for all DMA channels, array offset: 0x2C, array step: 0x60 */\r\n    __I  uint32_t ACTIVE;                            /**< Channel Active status for all DMA channels, array offset: 0x30, array step: 0x60 */\r\n    __I  uint32_t ACTIVE1;                           /**< Channel Active status for all DMA channels, array offset: 0x34, array step: 0x60 */\r\n    __I  uint32_t BUSY;                              /**< Channel Busy status for all DMA channels, array offset: 0x38, array step: 0x60 */\r\n    __I  uint32_t BUSY1;                             /**< Channel Busy status for all DMA channels, array offset: 0x3C, array step: 0x60 */\r\n    __IO uint32_t ERRINT;                            /**< Error Interrupt status for all DMA channels, array offset: 0x40, array step: 0x60 */\r\n    __IO uint32_t ERRINT1;                           /**< Error Interrupt status for all DMA channels, array offset: 0x44, array step: 0x60 */\r\n    __IO uint32_t INTENSET;                          /**< Interrupt Enable read and Set for all DMA channels, array offset: 0x48, array step: 0x60 */\r\n    __IO uint32_t INTENSET1;                         /**< Interrupt Enable read and Set for all DMA channels, array offset: 0x4C, array step: 0x60 */\r\n    __O  uint32_t INTENCLR;                          /**< Interrupt Enable Clear for all DMA channels, array offset: 0x50, array step: 0x60 */\r\n    __O  uint32_t INTENCLR1;                         /**< Interrupt Enable Clear for all DMA channels, array offset: 0x54, array step: 0x60 */\r\n    __IO uint32_t INTA;                              /**< Interrupt A status for all DMA channels, array offset: 0x58, array step: 0x60 */\r\n    __IO uint32_t INTA1;                             /**< Interrupt A status for all DMA channels, array offset: 0x5C, array step: 0x60 */\r\n    __IO uint32_t INTB;                              /**< Interrupt B status for all DMA channels, array offset: 0x60, array step: 0x60 */\r\n    __IO uint32_t INTB1;                             /**< Interrupt B status for all DMA channels, array offset: 0x64, array step: 0x60 */\r\n    __O  uint32_t SETVALID;                          /**< Set ValidPending control bits for all DMA channels, array offset: 0x68, array step: 0x60 */\r\n    __O  uint32_t SETVALID1;                         /**< Set ValidPending control bits for all DMA channels, array offset: 0x6C, array step: 0x60 */\r\n    __O  uint32_t SETTRIG;                           /**< Set Trigger control bits for all DMA channels, array offset: 0x70, array step: 0x60 */\r\n    __O  uint32_t SETTRIG1;                          /**< Set Trigger control bits for all DMA channels, array offset: 0x74, array step: 0x60 */\r\n    __O  uint32_t ABORT;                             /**< Channel Abort control for all DMA channels, array offset: 0x78, array step: 0x60 */\r\n    __O  uint32_t ABORT1;                            /**< Channel Abort control for all DMA channels, array offset: 0x7C, array step: 0x60 */\r\n  } COMMON[1];\r\n       uint8_t RESERVED_1[896];\r\n  struct {                                         /* offset: 0x400, array step: 0x10 */\r\n    __IO uint32_t CFG;                               /**< Configuration register for DMA channel, array offset: 0x400, array step: 0x10 */\r\n    __I  uint32_t CTLSTAT;                           /**< Control and status register for DMA channel, array offset: 0x404, array step: 0x10 */\r\n    __IO uint32_t XFERCFG;                           /**< Transfer configuration register for DMA channel, array offset: 0x408, array step: 0x10 */\r\n         uint8_t RESERVED_0[4];\r\n  } CHANNEL[33];\r\n} DMA_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- DMA Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup DMA_Register_Masks DMA Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name CTRL - DMA control */\r\n/*! @{ */\r\n\r\n#define DMA_CTRL_ENABLE_MASK                     (0x1U)\r\n#define DMA_CTRL_ENABLE_SHIFT                    (0U)\r\n/*! ENABLE - DMA controller master enable.\r\n *  0b0..DMA controller is disabled.\r\n *  0b1..Enabled.\r\n */\r\n#define DMA_CTRL_ENABLE(x)                       (((uint32_t)(((uint32_t)(x)) << DMA_CTRL_ENABLE_SHIFT)) & DMA_CTRL_ENABLE_MASK)\r\n/*! @} */\r\n\r\n/*! @name INTSTAT - Interrupt status */\r\n/*! @{ */\r\n\r\n#define DMA_INTSTAT_ACTIVEINT_MASK               (0x2U)\r\n#define DMA_INTSTAT_ACTIVEINT_SHIFT              (1U)\r\n/*! ACTIVEINT - Summarizes whether any enabled interrupts (other than error interrupts) are pending.\r\n *  0b0..No enabled interrupts are pending.\r\n *  0b1..At least one enabled interrupt is pending.\r\n */\r\n#define DMA_INTSTAT_ACTIVEINT(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_INTSTAT_ACTIVEINT_SHIFT)) & DMA_INTSTAT_ACTIVEINT_MASK)\r\n\r\n#define DMA_INTSTAT_ACTIVEERRINT_MASK            (0x4U)\r\n#define DMA_INTSTAT_ACTIVEERRINT_SHIFT           (2U)\r\n/*! ACTIVEERRINT - Summarizes whether any error interrupts are pending.\r\n *  0b0..No error interrupts are pending.\r\n *  0b1..At least one error interrupt is pending.\r\n */\r\n#define DMA_INTSTAT_ACTIVEERRINT(x)              (((uint32_t)(((uint32_t)(x)) << DMA_INTSTAT_ACTIVEERRINT_SHIFT)) & DMA_INTSTAT_ACTIVEERRINT_MASK)\r\n/*! @} */\r\n\r\n/*! @name SRAMBASE - SRAM address of the channel configuration table */\r\n/*! @{ */\r\n\r\n#define DMA_SRAMBASE_OFFSET_MASK                 (0xFFFFFE00U)\r\n#define DMA_SRAMBASE_OFFSET_SHIFT                (9U)\r\n/*! OFFSET - Offset */\r\n#define DMA_SRAMBASE_OFFSET(x)                   (((uint32_t)(((uint32_t)(x)) << DMA_SRAMBASE_OFFSET_SHIFT)) & DMA_SRAMBASE_OFFSET_MASK)\r\n/*! @} */\r\n\r\n/*! @name COMMON_ENABLESET - Channel Enable read and set for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE0_MASK        (0x1U)\r\n#define DMA_COMMON_ENABLESET_ENABLE0_SHIFT       (0U)\r\n/*! ENABLE0 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE0(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE0_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE0_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE1_MASK        (0x2U)\r\n#define DMA_COMMON_ENABLESET_ENABLE1_SHIFT       (1U)\r\n/*! ENABLE1 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE1(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE1_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE1_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE2_MASK        (0x4U)\r\n#define DMA_COMMON_ENABLESET_ENABLE2_SHIFT       (2U)\r\n/*! ENABLE2 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE2(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE2_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE2_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE3_MASK        (0x8U)\r\n#define DMA_COMMON_ENABLESET_ENABLE3_SHIFT       (3U)\r\n/*! ENABLE3 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE3(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE3_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE3_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE4_MASK        (0x10U)\r\n#define DMA_COMMON_ENABLESET_ENABLE4_SHIFT       (4U)\r\n/*! ENABLE4 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE4(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE4_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE4_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE5_MASK        (0x20U)\r\n#define DMA_COMMON_ENABLESET_ENABLE5_SHIFT       (5U)\r\n/*! ENABLE5 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE5(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE5_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE5_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE6_MASK        (0x40U)\r\n#define DMA_COMMON_ENABLESET_ENABLE6_SHIFT       (6U)\r\n/*! ENABLE6 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE6(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE6_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE6_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE7_MASK        (0x80U)\r\n#define DMA_COMMON_ENABLESET_ENABLE7_SHIFT       (7U)\r\n/*! ENABLE7 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE7(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE7_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE7_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE8_MASK        (0x100U)\r\n#define DMA_COMMON_ENABLESET_ENABLE8_SHIFT       (8U)\r\n/*! ENABLE8 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE8(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE8_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE8_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE9_MASK        (0x200U)\r\n#define DMA_COMMON_ENABLESET_ENABLE9_SHIFT       (9U)\r\n/*! ENABLE9 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE9(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE9_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE9_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE10_MASK       (0x400U)\r\n#define DMA_COMMON_ENABLESET_ENABLE10_SHIFT      (10U)\r\n/*! ENABLE10 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE10(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE10_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE10_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE11_MASK       (0x800U)\r\n#define DMA_COMMON_ENABLESET_ENABLE11_SHIFT      (11U)\r\n/*! ENABLE11 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE11(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE11_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE11_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE12_MASK       (0x1000U)\r\n#define DMA_COMMON_ENABLESET_ENABLE12_SHIFT      (12U)\r\n/*! ENABLE12 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE12(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE12_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE12_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE13_MASK       (0x2000U)\r\n#define DMA_COMMON_ENABLESET_ENABLE13_SHIFT      (13U)\r\n/*! ENABLE13 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE13(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE13_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE13_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE14_MASK       (0x4000U)\r\n#define DMA_COMMON_ENABLESET_ENABLE14_SHIFT      (14U)\r\n/*! ENABLE14 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE14(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE14_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE14_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE15_MASK       (0x8000U)\r\n#define DMA_COMMON_ENABLESET_ENABLE15_SHIFT      (15U)\r\n/*! ENABLE15 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE15(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE15_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE15_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE16_MASK       (0x10000U)\r\n#define DMA_COMMON_ENABLESET_ENABLE16_SHIFT      (16U)\r\n/*! ENABLE16 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE16(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE16_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE16_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE17_MASK       (0x20000U)\r\n#define DMA_COMMON_ENABLESET_ENABLE17_SHIFT      (17U)\r\n/*! ENABLE17 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE17(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE17_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE17_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE18_MASK       (0x40000U)\r\n#define DMA_COMMON_ENABLESET_ENABLE18_SHIFT      (18U)\r\n/*! ENABLE18 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE18(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE18_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE18_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE19_MASK       (0x80000U)\r\n#define DMA_COMMON_ENABLESET_ENABLE19_SHIFT      (19U)\r\n/*! ENABLE19 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE19(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE19_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE19_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE20_MASK       (0x100000U)\r\n#define DMA_COMMON_ENABLESET_ENABLE20_SHIFT      (20U)\r\n/*! ENABLE20 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE20(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE20_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE20_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE21_MASK       (0x200000U)\r\n#define DMA_COMMON_ENABLESET_ENABLE21_SHIFT      (21U)\r\n/*! ENABLE21 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE21(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE21_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE21_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE22_MASK       (0x400000U)\r\n#define DMA_COMMON_ENABLESET_ENABLE22_SHIFT      (22U)\r\n/*! ENABLE22 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE22(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE22_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE22_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE23_MASK       (0x800000U)\r\n#define DMA_COMMON_ENABLESET_ENABLE23_SHIFT      (23U)\r\n/*! ENABLE23 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE23(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE23_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE23_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE24_MASK       (0x1000000U)\r\n#define DMA_COMMON_ENABLESET_ENABLE24_SHIFT      (24U)\r\n/*! ENABLE24 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE24(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE24_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE24_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE25_MASK       (0x2000000U)\r\n#define DMA_COMMON_ENABLESET_ENABLE25_SHIFT      (25U)\r\n/*! ENABLE25 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE25(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE25_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE25_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE26_MASK       (0x4000000U)\r\n#define DMA_COMMON_ENABLESET_ENABLE26_SHIFT      (26U)\r\n/*! ENABLE26 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE26(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE26_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE26_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE27_MASK       (0x8000000U)\r\n#define DMA_COMMON_ENABLESET_ENABLE27_SHIFT      (27U)\r\n/*! ENABLE27 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE27(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE27_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE27_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE28_MASK       (0x10000000U)\r\n#define DMA_COMMON_ENABLESET_ENABLE28_SHIFT      (28U)\r\n/*! ENABLE28 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE28(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE28_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE28_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE29_MASK       (0x20000000U)\r\n#define DMA_COMMON_ENABLESET_ENABLE29_SHIFT      (29U)\r\n/*! ENABLE29 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE29(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE29_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE29_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE30_MASK       (0x40000000U)\r\n#define DMA_COMMON_ENABLESET_ENABLE30_SHIFT      (30U)\r\n/*! ENABLE30 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE30(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE30_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE30_MASK)\r\n\r\n#define DMA_COMMON_ENABLESET_ENABLE31_MASK       (0x80000000U)\r\n#define DMA_COMMON_ENABLESET_ENABLE31_SHIFT      (31U)\r\n/*! ENABLE31 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET_ENABLE31(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET_ENABLE31_SHIFT)) & DMA_COMMON_ENABLESET_ENABLE31_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_ENABLESET */\r\n#define DMA_COMMON_ENABLESET_COUNT               (1U)\r\n\r\n/*! @name COMMON_ENABLESET1 - Channel Enable read and set for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_ENABLESET1_ENABLE32_MASK      (0x1U)\r\n#define DMA_COMMON_ENABLESET1_ENABLE32_SHIFT     (0U)\r\n/*! ENABLE32 - Enable for DMA channel\r\n *  0b0..DMA channel is disabled.\r\n *  0b1..DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_ENABLESET1_ENABLE32(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLESET1_ENABLE32_SHIFT)) & DMA_COMMON_ENABLESET1_ENABLE32_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_ENABLESET1 */\r\n#define DMA_COMMON_ENABLESET1_COUNT              (1U)\r\n\r\n/*! @name COMMON_ENABLECLR - Channel Enable Clear for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR0_MASK           (0x1U)\r\n#define DMA_COMMON_ENABLECLR_CLR0_SHIFT          (0U)\r\n/*! CLR0 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR0(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR0_SHIFT)) & DMA_COMMON_ENABLECLR_CLR0_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR1_MASK           (0x2U)\r\n#define DMA_COMMON_ENABLECLR_CLR1_SHIFT          (1U)\r\n/*! CLR1 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR1(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR1_SHIFT)) & DMA_COMMON_ENABLECLR_CLR1_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR2_MASK           (0x4U)\r\n#define DMA_COMMON_ENABLECLR_CLR2_SHIFT          (2U)\r\n/*! CLR2 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR2(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR2_SHIFT)) & DMA_COMMON_ENABLECLR_CLR2_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR3_MASK           (0x8U)\r\n#define DMA_COMMON_ENABLECLR_CLR3_SHIFT          (3U)\r\n/*! CLR3 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR3(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR3_SHIFT)) & DMA_COMMON_ENABLECLR_CLR3_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR4_MASK           (0x10U)\r\n#define DMA_COMMON_ENABLECLR_CLR4_SHIFT          (4U)\r\n/*! CLR4 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR4(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR4_SHIFT)) & DMA_COMMON_ENABLECLR_CLR4_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR5_MASK           (0x20U)\r\n#define DMA_COMMON_ENABLECLR_CLR5_SHIFT          (5U)\r\n/*! CLR5 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR5(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR5_SHIFT)) & DMA_COMMON_ENABLECLR_CLR5_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR6_MASK           (0x40U)\r\n#define DMA_COMMON_ENABLECLR_CLR6_SHIFT          (6U)\r\n/*! CLR6 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR6(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR6_SHIFT)) & DMA_COMMON_ENABLECLR_CLR6_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR7_MASK           (0x80U)\r\n#define DMA_COMMON_ENABLECLR_CLR7_SHIFT          (7U)\r\n/*! CLR7 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR7(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR7_SHIFT)) & DMA_COMMON_ENABLECLR_CLR7_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR8_MASK           (0x100U)\r\n#define DMA_COMMON_ENABLECLR_CLR8_SHIFT          (8U)\r\n/*! CLR8 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR8(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR8_SHIFT)) & DMA_COMMON_ENABLECLR_CLR8_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR9_MASK           (0x200U)\r\n#define DMA_COMMON_ENABLECLR_CLR9_SHIFT          (9U)\r\n/*! CLR9 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR9(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR9_SHIFT)) & DMA_COMMON_ENABLECLR_CLR9_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR10_MASK          (0x400U)\r\n#define DMA_COMMON_ENABLECLR_CLR10_SHIFT         (10U)\r\n/*! CLR10 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR10(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR10_SHIFT)) & DMA_COMMON_ENABLECLR_CLR10_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR11_MASK          (0x800U)\r\n#define DMA_COMMON_ENABLECLR_CLR11_SHIFT         (11U)\r\n/*! CLR11 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR11(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR11_SHIFT)) & DMA_COMMON_ENABLECLR_CLR11_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR12_MASK          (0x1000U)\r\n#define DMA_COMMON_ENABLECLR_CLR12_SHIFT         (12U)\r\n/*! CLR12 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR12(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR12_SHIFT)) & DMA_COMMON_ENABLECLR_CLR12_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR13_MASK          (0x2000U)\r\n#define DMA_COMMON_ENABLECLR_CLR13_SHIFT         (13U)\r\n/*! CLR13 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR13(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR13_SHIFT)) & DMA_COMMON_ENABLECLR_CLR13_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR14_MASK          (0x4000U)\r\n#define DMA_COMMON_ENABLECLR_CLR14_SHIFT         (14U)\r\n/*! CLR14 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR14(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR14_SHIFT)) & DMA_COMMON_ENABLECLR_CLR14_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR15_MASK          (0x8000U)\r\n#define DMA_COMMON_ENABLECLR_CLR15_SHIFT         (15U)\r\n/*! CLR15 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR15(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR15_SHIFT)) & DMA_COMMON_ENABLECLR_CLR15_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR16_MASK          (0x10000U)\r\n#define DMA_COMMON_ENABLECLR_CLR16_SHIFT         (16U)\r\n/*! CLR16 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR16(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR16_SHIFT)) & DMA_COMMON_ENABLECLR_CLR16_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR17_MASK          (0x20000U)\r\n#define DMA_COMMON_ENABLECLR_CLR17_SHIFT         (17U)\r\n/*! CLR17 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR17(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR17_SHIFT)) & DMA_COMMON_ENABLECLR_CLR17_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR18_MASK          (0x40000U)\r\n#define DMA_COMMON_ENABLECLR_CLR18_SHIFT         (18U)\r\n/*! CLR18 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR18(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR18_SHIFT)) & DMA_COMMON_ENABLECLR_CLR18_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR19_MASK          (0x80000U)\r\n#define DMA_COMMON_ENABLECLR_CLR19_SHIFT         (19U)\r\n/*! CLR19 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR19(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR19_SHIFT)) & DMA_COMMON_ENABLECLR_CLR19_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR20_MASK          (0x100000U)\r\n#define DMA_COMMON_ENABLECLR_CLR20_SHIFT         (20U)\r\n/*! CLR20 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR20(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR20_SHIFT)) & DMA_COMMON_ENABLECLR_CLR20_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR21_MASK          (0x200000U)\r\n#define DMA_COMMON_ENABLECLR_CLR21_SHIFT         (21U)\r\n/*! CLR21 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR21(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR21_SHIFT)) & DMA_COMMON_ENABLECLR_CLR21_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR22_MASK          (0x400000U)\r\n#define DMA_COMMON_ENABLECLR_CLR22_SHIFT         (22U)\r\n/*! CLR22 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR22(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR22_SHIFT)) & DMA_COMMON_ENABLECLR_CLR22_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR23_MASK          (0x800000U)\r\n#define DMA_COMMON_ENABLECLR_CLR23_SHIFT         (23U)\r\n/*! CLR23 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR23(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR23_SHIFT)) & DMA_COMMON_ENABLECLR_CLR23_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR24_MASK          (0x1000000U)\r\n#define DMA_COMMON_ENABLECLR_CLR24_SHIFT         (24U)\r\n/*! CLR24 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR24(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR24_SHIFT)) & DMA_COMMON_ENABLECLR_CLR24_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR25_MASK          (0x2000000U)\r\n#define DMA_COMMON_ENABLECLR_CLR25_SHIFT         (25U)\r\n/*! CLR25 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR25(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR25_SHIFT)) & DMA_COMMON_ENABLECLR_CLR25_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR26_MASK          (0x4000000U)\r\n#define DMA_COMMON_ENABLECLR_CLR26_SHIFT         (26U)\r\n/*! CLR26 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR26(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR26_SHIFT)) & DMA_COMMON_ENABLECLR_CLR26_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR27_MASK          (0x8000000U)\r\n#define DMA_COMMON_ENABLECLR_CLR27_SHIFT         (27U)\r\n/*! CLR27 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR27(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR27_SHIFT)) & DMA_COMMON_ENABLECLR_CLR27_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR28_MASK          (0x10000000U)\r\n#define DMA_COMMON_ENABLECLR_CLR28_SHIFT         (28U)\r\n/*! CLR28 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR28(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR28_SHIFT)) & DMA_COMMON_ENABLECLR_CLR28_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR29_MASK          (0x20000000U)\r\n#define DMA_COMMON_ENABLECLR_CLR29_SHIFT         (29U)\r\n/*! CLR29 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR29(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR29_SHIFT)) & DMA_COMMON_ENABLECLR_CLR29_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR30_MASK          (0x40000000U)\r\n#define DMA_COMMON_ENABLECLR_CLR30_SHIFT         (30U)\r\n/*! CLR30 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR30(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR30_SHIFT)) & DMA_COMMON_ENABLECLR_CLR30_MASK)\r\n\r\n#define DMA_COMMON_ENABLECLR_CLR31_MASK          (0x80000000U)\r\n#define DMA_COMMON_ENABLECLR_CLR31_SHIFT         (31U)\r\n/*! CLR31 - Writing ones to this register clears the corresponding bits in ENABLESET0.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR_CLR31(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR_CLR31_SHIFT)) & DMA_COMMON_ENABLECLR_CLR31_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_ENABLECLR */\r\n#define DMA_COMMON_ENABLECLR_COUNT               (1U)\r\n\r\n/*! @name COMMON_ENABLECLR1 - Channel Enable Clear for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_ENABLECLR1_CLR32_MASK         (0x1U)\r\n#define DMA_COMMON_ENABLECLR1_CLR32_SHIFT        (0U)\r\n/*! CLR32 - Writing ones to this register clears the corresponding bits in ENABLESET1.\r\n *  0b0..No effect.\r\n *  0b1..DMA channel is cleared.\r\n */\r\n#define DMA_COMMON_ENABLECLR1_CLR32(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ENABLECLR1_CLR32_SHIFT)) & DMA_COMMON_ENABLECLR1_CLR32_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_ENABLECLR1 */\r\n#define DMA_COMMON_ENABLECLR1_COUNT              (1U)\r\n\r\n/*! @name COMMON_ACTIVE - Channel Active status for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE0_MASK           (0x1U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE0_SHIFT          (0U)\r\n/*! ACTIVE0 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE0(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE0_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE0_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE1_MASK           (0x2U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE1_SHIFT          (1U)\r\n/*! ACTIVE1 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE1(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE1_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE1_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE2_MASK           (0x4U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE2_SHIFT          (2U)\r\n/*! ACTIVE2 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE2(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE2_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE2_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE3_MASK           (0x8U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE3_SHIFT          (3U)\r\n/*! ACTIVE3 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE3(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE3_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE3_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE4_MASK           (0x10U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE4_SHIFT          (4U)\r\n/*! ACTIVE4 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE4(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE4_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE4_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE5_MASK           (0x20U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE5_SHIFT          (5U)\r\n/*! ACTIVE5 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE5(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE5_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE5_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE6_MASK           (0x40U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE6_SHIFT          (6U)\r\n/*! ACTIVE6 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE6(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE6_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE6_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE7_MASK           (0x80U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE7_SHIFT          (7U)\r\n/*! ACTIVE7 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE7(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE7_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE7_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE8_MASK           (0x100U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE8_SHIFT          (8U)\r\n/*! ACTIVE8 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE8(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE8_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE8_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE9_MASK           (0x200U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE9_SHIFT          (9U)\r\n/*! ACTIVE9 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE9(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE9_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE9_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE10_MASK          (0x400U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE10_SHIFT         (10U)\r\n/*! ACTIVE10 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE10(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE10_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE10_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE11_MASK          (0x800U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE11_SHIFT         (11U)\r\n/*! ACTIVE11 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE11(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE11_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE11_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE12_MASK          (0x1000U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE12_SHIFT         (12U)\r\n/*! ACTIVE12 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE12(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE12_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE12_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE13_MASK          (0x2000U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE13_SHIFT         (13U)\r\n/*! ACTIVE13 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE13(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE13_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE13_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE14_MASK          (0x4000U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE14_SHIFT         (14U)\r\n/*! ACTIVE14 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE14(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE14_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE14_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE15_MASK          (0x8000U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE15_SHIFT         (15U)\r\n/*! ACTIVE15 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE15(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE15_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE15_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE16_MASK          (0x10000U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE16_SHIFT         (16U)\r\n/*! ACTIVE16 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE16(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE16_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE16_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE17_MASK          (0x20000U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE17_SHIFT         (17U)\r\n/*! ACTIVE17 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE17(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE17_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE17_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE18_MASK          (0x40000U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE18_SHIFT         (18U)\r\n/*! ACTIVE18 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE18(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE18_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE18_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE19_MASK          (0x80000U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE19_SHIFT         (19U)\r\n/*! ACTIVE19 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE19(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE19_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE19_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE20_MASK          (0x100000U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE20_SHIFT         (20U)\r\n/*! ACTIVE20 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE20(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE20_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE20_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE21_MASK          (0x200000U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE21_SHIFT         (21U)\r\n/*! ACTIVE21 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE21(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE21_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE21_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE22_MASK          (0x400000U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE22_SHIFT         (22U)\r\n/*! ACTIVE22 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE22(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE22_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE22_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE23_MASK          (0x800000U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE23_SHIFT         (23U)\r\n/*! ACTIVE23 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE23(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE23_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE23_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE24_MASK          (0x1000000U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE24_SHIFT         (24U)\r\n/*! ACTIVE24 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE24(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE24_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE24_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE25_MASK          (0x2000000U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE25_SHIFT         (25U)\r\n/*! ACTIVE25 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE25(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE25_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE25_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE26_MASK          (0x4000000U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE26_SHIFT         (26U)\r\n/*! ACTIVE26 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE26(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE26_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE26_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE27_MASK          (0x8000000U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE27_SHIFT         (27U)\r\n/*! ACTIVE27 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE27(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE27_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE27_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE28_MASK          (0x10000000U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE28_SHIFT         (28U)\r\n/*! ACTIVE28 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE28(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE28_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE28_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE29_MASK          (0x20000000U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE29_SHIFT         (29U)\r\n/*! ACTIVE29 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE29(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE29_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE29_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE30_MASK          (0x40000000U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE30_SHIFT         (30U)\r\n/*! ACTIVE30 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE30(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE30_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE30_MASK)\r\n\r\n#define DMA_COMMON_ACTIVE_ACTIVE31_MASK          (0x80000000U)\r\n#define DMA_COMMON_ACTIVE_ACTIVE31_SHIFT         (31U)\r\n/*! ACTIVE31 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE_ACTIVE31(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE_ACTIVE31_SHIFT)) & DMA_COMMON_ACTIVE_ACTIVE31_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_ACTIVE */\r\n#define DMA_COMMON_ACTIVE_COUNT                  (1U)\r\n\r\n/*! @name COMMON_ACTIVE1 - Channel Active status for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_ACTIVE1_ACTIVE32_MASK         (0x1U)\r\n#define DMA_COMMON_ACTIVE1_ACTIVE32_SHIFT        (0U)\r\n/*! ACTIVE32 - Active flag for DMA channel.\r\n *  0b0..DMA channel is not active.\r\n *  0b1..DMA channel is active.\r\n */\r\n#define DMA_COMMON_ACTIVE1_ACTIVE32(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ACTIVE1_ACTIVE32_SHIFT)) & DMA_COMMON_ACTIVE1_ACTIVE32_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_ACTIVE1 */\r\n#define DMA_COMMON_ACTIVE1_COUNT                 (1U)\r\n\r\n/*! @name COMMON_BUSY - Channel Busy status for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_BUSY_BUSY0_MASK               (0x1U)\r\n#define DMA_COMMON_BUSY_BUSY0_SHIFT              (0U)\r\n/*! BUSY0 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY0(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY0_SHIFT)) & DMA_COMMON_BUSY_BUSY0_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY1_MASK               (0x2U)\r\n#define DMA_COMMON_BUSY_BUSY1_SHIFT              (1U)\r\n/*! BUSY1 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY1(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY1_SHIFT)) & DMA_COMMON_BUSY_BUSY1_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY2_MASK               (0x4U)\r\n#define DMA_COMMON_BUSY_BUSY2_SHIFT              (2U)\r\n/*! BUSY2 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY2(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY2_SHIFT)) & DMA_COMMON_BUSY_BUSY2_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY3_MASK               (0x8U)\r\n#define DMA_COMMON_BUSY_BUSY3_SHIFT              (3U)\r\n/*! BUSY3 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY3(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY3_SHIFT)) & DMA_COMMON_BUSY_BUSY3_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY4_MASK               (0x10U)\r\n#define DMA_COMMON_BUSY_BUSY4_SHIFT              (4U)\r\n/*! BUSY4 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY4(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY4_SHIFT)) & DMA_COMMON_BUSY_BUSY4_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY5_MASK               (0x20U)\r\n#define DMA_COMMON_BUSY_BUSY5_SHIFT              (5U)\r\n/*! BUSY5 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY5(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY5_SHIFT)) & DMA_COMMON_BUSY_BUSY5_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY6_MASK               (0x40U)\r\n#define DMA_COMMON_BUSY_BUSY6_SHIFT              (6U)\r\n/*! BUSY6 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY6(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY6_SHIFT)) & DMA_COMMON_BUSY_BUSY6_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY7_MASK               (0x80U)\r\n#define DMA_COMMON_BUSY_BUSY7_SHIFT              (7U)\r\n/*! BUSY7 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY7(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY7_SHIFT)) & DMA_COMMON_BUSY_BUSY7_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY8_MASK               (0x100U)\r\n#define DMA_COMMON_BUSY_BUSY8_SHIFT              (8U)\r\n/*! BUSY8 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY8(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY8_SHIFT)) & DMA_COMMON_BUSY_BUSY8_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY9_MASK               (0x200U)\r\n#define DMA_COMMON_BUSY_BUSY9_SHIFT              (9U)\r\n/*! BUSY9 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY9(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY9_SHIFT)) & DMA_COMMON_BUSY_BUSY9_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY10_MASK              (0x400U)\r\n#define DMA_COMMON_BUSY_BUSY10_SHIFT             (10U)\r\n/*! BUSY10 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY10(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY10_SHIFT)) & DMA_COMMON_BUSY_BUSY10_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY11_MASK              (0x800U)\r\n#define DMA_COMMON_BUSY_BUSY11_SHIFT             (11U)\r\n/*! BUSY11 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY11(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY11_SHIFT)) & DMA_COMMON_BUSY_BUSY11_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY12_MASK              (0x1000U)\r\n#define DMA_COMMON_BUSY_BUSY12_SHIFT             (12U)\r\n/*! BUSY12 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY12(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY12_SHIFT)) & DMA_COMMON_BUSY_BUSY12_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY13_MASK              (0x2000U)\r\n#define DMA_COMMON_BUSY_BUSY13_SHIFT             (13U)\r\n/*! BUSY13 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY13(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY13_SHIFT)) & DMA_COMMON_BUSY_BUSY13_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY14_MASK              (0x4000U)\r\n#define DMA_COMMON_BUSY_BUSY14_SHIFT             (14U)\r\n/*! BUSY14 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY14(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY14_SHIFT)) & DMA_COMMON_BUSY_BUSY14_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY15_MASK              (0x8000U)\r\n#define DMA_COMMON_BUSY_BUSY15_SHIFT             (15U)\r\n/*! BUSY15 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY15(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY15_SHIFT)) & DMA_COMMON_BUSY_BUSY15_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY16_MASK              (0x10000U)\r\n#define DMA_COMMON_BUSY_BUSY16_SHIFT             (16U)\r\n/*! BUSY16 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY16(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY16_SHIFT)) & DMA_COMMON_BUSY_BUSY16_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY17_MASK              (0x20000U)\r\n#define DMA_COMMON_BUSY_BUSY17_SHIFT             (17U)\r\n/*! BUSY17 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY17(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY17_SHIFT)) & DMA_COMMON_BUSY_BUSY17_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY18_MASK              (0x40000U)\r\n#define DMA_COMMON_BUSY_BUSY18_SHIFT             (18U)\r\n/*! BUSY18 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY18(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY18_SHIFT)) & DMA_COMMON_BUSY_BUSY18_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY19_MASK              (0x80000U)\r\n#define DMA_COMMON_BUSY_BUSY19_SHIFT             (19U)\r\n/*! BUSY19 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY19(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY19_SHIFT)) & DMA_COMMON_BUSY_BUSY19_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY20_MASK              (0x100000U)\r\n#define DMA_COMMON_BUSY_BUSY20_SHIFT             (20U)\r\n/*! BUSY20 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY20(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY20_SHIFT)) & DMA_COMMON_BUSY_BUSY20_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY21_MASK              (0x200000U)\r\n#define DMA_COMMON_BUSY_BUSY21_SHIFT             (21U)\r\n/*! BUSY21 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY21(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY21_SHIFT)) & DMA_COMMON_BUSY_BUSY21_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY22_MASK              (0x400000U)\r\n#define DMA_COMMON_BUSY_BUSY22_SHIFT             (22U)\r\n/*! BUSY22 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY22(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY22_SHIFT)) & DMA_COMMON_BUSY_BUSY22_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY23_MASK              (0x800000U)\r\n#define DMA_COMMON_BUSY_BUSY23_SHIFT             (23U)\r\n/*! BUSY23 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY23(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY23_SHIFT)) & DMA_COMMON_BUSY_BUSY23_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY24_MASK              (0x1000000U)\r\n#define DMA_COMMON_BUSY_BUSY24_SHIFT             (24U)\r\n/*! BUSY24 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY24(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY24_SHIFT)) & DMA_COMMON_BUSY_BUSY24_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY25_MASK              (0x2000000U)\r\n#define DMA_COMMON_BUSY_BUSY25_SHIFT             (25U)\r\n/*! BUSY25 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY25(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY25_SHIFT)) & DMA_COMMON_BUSY_BUSY25_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY26_MASK              (0x4000000U)\r\n#define DMA_COMMON_BUSY_BUSY26_SHIFT             (26U)\r\n/*! BUSY26 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY26(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY26_SHIFT)) & DMA_COMMON_BUSY_BUSY26_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY27_MASK              (0x8000000U)\r\n#define DMA_COMMON_BUSY_BUSY27_SHIFT             (27U)\r\n/*! BUSY27 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY27(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY27_SHIFT)) & DMA_COMMON_BUSY_BUSY27_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY28_MASK              (0x10000000U)\r\n#define DMA_COMMON_BUSY_BUSY28_SHIFT             (28U)\r\n/*! BUSY28 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY28(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY28_SHIFT)) & DMA_COMMON_BUSY_BUSY28_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY29_MASK              (0x20000000U)\r\n#define DMA_COMMON_BUSY_BUSY29_SHIFT             (29U)\r\n/*! BUSY29 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY29(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY29_SHIFT)) & DMA_COMMON_BUSY_BUSY29_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY30_MASK              (0x40000000U)\r\n#define DMA_COMMON_BUSY_BUSY30_SHIFT             (30U)\r\n/*! BUSY30 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY30(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY30_SHIFT)) & DMA_COMMON_BUSY_BUSY30_MASK)\r\n\r\n#define DMA_COMMON_BUSY_BUSY31_MASK              (0x80000000U)\r\n#define DMA_COMMON_BUSY_BUSY31_SHIFT             (31U)\r\n/*! BUSY31 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY_BUSY31(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY_BUSY31_SHIFT)) & DMA_COMMON_BUSY_BUSY31_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_BUSY */\r\n#define DMA_COMMON_BUSY_COUNT                    (1U)\r\n\r\n/*! @name COMMON_BUSY1 - Channel Busy status for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_BUSY1_BUSY32_MASK             (0x1U)\r\n#define DMA_COMMON_BUSY1_BUSY32_SHIFT            (0U)\r\n/*! BUSY32 - Busy flag for DMA channel.\r\n *  0b0..DMA channel is not busy.\r\n *  0b1..DMA channel is busy.\r\n */\r\n#define DMA_COMMON_BUSY1_BUSY32(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_BUSY1_BUSY32_SHIFT)) & DMA_COMMON_BUSY1_BUSY32_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_BUSY1 */\r\n#define DMA_COMMON_BUSY1_COUNT                   (1U)\r\n\r\n/*! @name COMMON_ERRINT - Error Interrupt status for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_ERRINT_ERR0_MASK              (0x1U)\r\n#define DMA_COMMON_ERRINT_ERR0_SHIFT             (0U)\r\n/*! ERR0 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR0(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR0_SHIFT)) & DMA_COMMON_ERRINT_ERR0_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR1_MASK              (0x2U)\r\n#define DMA_COMMON_ERRINT_ERR1_SHIFT             (1U)\r\n/*! ERR1 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR1(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR1_SHIFT)) & DMA_COMMON_ERRINT_ERR1_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR2_MASK              (0x4U)\r\n#define DMA_COMMON_ERRINT_ERR2_SHIFT             (2U)\r\n/*! ERR2 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR2(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR2_SHIFT)) & DMA_COMMON_ERRINT_ERR2_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR3_MASK              (0x8U)\r\n#define DMA_COMMON_ERRINT_ERR3_SHIFT             (3U)\r\n/*! ERR3 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR3(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR3_SHIFT)) & DMA_COMMON_ERRINT_ERR3_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR4_MASK              (0x10U)\r\n#define DMA_COMMON_ERRINT_ERR4_SHIFT             (4U)\r\n/*! ERR4 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR4(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR4_SHIFT)) & DMA_COMMON_ERRINT_ERR4_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR5_MASK              (0x20U)\r\n#define DMA_COMMON_ERRINT_ERR5_SHIFT             (5U)\r\n/*! ERR5 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR5(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR5_SHIFT)) & DMA_COMMON_ERRINT_ERR5_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR6_MASK              (0x40U)\r\n#define DMA_COMMON_ERRINT_ERR6_SHIFT             (6U)\r\n/*! ERR6 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR6(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR6_SHIFT)) & DMA_COMMON_ERRINT_ERR6_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR7_MASK              (0x80U)\r\n#define DMA_COMMON_ERRINT_ERR7_SHIFT             (7U)\r\n/*! ERR7 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR7(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR7_SHIFT)) & DMA_COMMON_ERRINT_ERR7_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR8_MASK              (0x100U)\r\n#define DMA_COMMON_ERRINT_ERR8_SHIFT             (8U)\r\n/*! ERR8 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR8(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR8_SHIFT)) & DMA_COMMON_ERRINT_ERR8_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR9_MASK              (0x200U)\r\n#define DMA_COMMON_ERRINT_ERR9_SHIFT             (9U)\r\n/*! ERR9 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR9(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR9_SHIFT)) & DMA_COMMON_ERRINT_ERR9_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR10_MASK             (0x400U)\r\n#define DMA_COMMON_ERRINT_ERR10_SHIFT            (10U)\r\n/*! ERR10 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR10(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR10_SHIFT)) & DMA_COMMON_ERRINT_ERR10_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR11_MASK             (0x800U)\r\n#define DMA_COMMON_ERRINT_ERR11_SHIFT            (11U)\r\n/*! ERR11 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR11(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR11_SHIFT)) & DMA_COMMON_ERRINT_ERR11_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR12_MASK             (0x1000U)\r\n#define DMA_COMMON_ERRINT_ERR12_SHIFT            (12U)\r\n/*! ERR12 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR12(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR12_SHIFT)) & DMA_COMMON_ERRINT_ERR12_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR13_MASK             (0x2000U)\r\n#define DMA_COMMON_ERRINT_ERR13_SHIFT            (13U)\r\n/*! ERR13 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR13(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR13_SHIFT)) & DMA_COMMON_ERRINT_ERR13_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR14_MASK             (0x4000U)\r\n#define DMA_COMMON_ERRINT_ERR14_SHIFT            (14U)\r\n/*! ERR14 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR14(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR14_SHIFT)) & DMA_COMMON_ERRINT_ERR14_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR15_MASK             (0x8000U)\r\n#define DMA_COMMON_ERRINT_ERR15_SHIFT            (15U)\r\n/*! ERR15 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR15(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR15_SHIFT)) & DMA_COMMON_ERRINT_ERR15_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR16_MASK             (0x10000U)\r\n#define DMA_COMMON_ERRINT_ERR16_SHIFT            (16U)\r\n/*! ERR16 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR16(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR16_SHIFT)) & DMA_COMMON_ERRINT_ERR16_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR17_MASK             (0x20000U)\r\n#define DMA_COMMON_ERRINT_ERR17_SHIFT            (17U)\r\n/*! ERR17 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR17(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR17_SHIFT)) & DMA_COMMON_ERRINT_ERR17_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR18_MASK             (0x40000U)\r\n#define DMA_COMMON_ERRINT_ERR18_SHIFT            (18U)\r\n/*! ERR18 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR18(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR18_SHIFT)) & DMA_COMMON_ERRINT_ERR18_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR19_MASK             (0x80000U)\r\n#define DMA_COMMON_ERRINT_ERR19_SHIFT            (19U)\r\n/*! ERR19 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR19(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR19_SHIFT)) & DMA_COMMON_ERRINT_ERR19_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR20_MASK             (0x100000U)\r\n#define DMA_COMMON_ERRINT_ERR20_SHIFT            (20U)\r\n/*! ERR20 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR20(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR20_SHIFT)) & DMA_COMMON_ERRINT_ERR20_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR21_MASK             (0x200000U)\r\n#define DMA_COMMON_ERRINT_ERR21_SHIFT            (21U)\r\n/*! ERR21 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR21(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR21_SHIFT)) & DMA_COMMON_ERRINT_ERR21_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR22_MASK             (0x400000U)\r\n#define DMA_COMMON_ERRINT_ERR22_SHIFT            (22U)\r\n/*! ERR22 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR22(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR22_SHIFT)) & DMA_COMMON_ERRINT_ERR22_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR23_MASK             (0x800000U)\r\n#define DMA_COMMON_ERRINT_ERR23_SHIFT            (23U)\r\n/*! ERR23 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR23(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR23_SHIFT)) & DMA_COMMON_ERRINT_ERR23_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR24_MASK             (0x1000000U)\r\n#define DMA_COMMON_ERRINT_ERR24_SHIFT            (24U)\r\n/*! ERR24 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR24(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR24_SHIFT)) & DMA_COMMON_ERRINT_ERR24_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR25_MASK             (0x2000000U)\r\n#define DMA_COMMON_ERRINT_ERR25_SHIFT            (25U)\r\n/*! ERR25 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR25(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR25_SHIFT)) & DMA_COMMON_ERRINT_ERR25_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR26_MASK             (0x4000000U)\r\n#define DMA_COMMON_ERRINT_ERR26_SHIFT            (26U)\r\n/*! ERR26 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR26(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR26_SHIFT)) & DMA_COMMON_ERRINT_ERR26_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR27_MASK             (0x8000000U)\r\n#define DMA_COMMON_ERRINT_ERR27_SHIFT            (27U)\r\n/*! ERR27 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR27(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR27_SHIFT)) & DMA_COMMON_ERRINT_ERR27_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR28_MASK             (0x10000000U)\r\n#define DMA_COMMON_ERRINT_ERR28_SHIFT            (28U)\r\n/*! ERR28 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR28(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR28_SHIFT)) & DMA_COMMON_ERRINT_ERR28_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR29_MASK             (0x20000000U)\r\n#define DMA_COMMON_ERRINT_ERR29_SHIFT            (29U)\r\n/*! ERR29 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR29(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR29_SHIFT)) & DMA_COMMON_ERRINT_ERR29_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR30_MASK             (0x40000000U)\r\n#define DMA_COMMON_ERRINT_ERR30_SHIFT            (30U)\r\n/*! ERR30 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR30(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR30_SHIFT)) & DMA_COMMON_ERRINT_ERR30_MASK)\r\n\r\n#define DMA_COMMON_ERRINT_ERR31_MASK             (0x80000000U)\r\n#define DMA_COMMON_ERRINT_ERR31_SHIFT            (31U)\r\n/*! ERR31 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT_ERR31(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT_ERR31_SHIFT)) & DMA_COMMON_ERRINT_ERR31_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_ERRINT */\r\n#define DMA_COMMON_ERRINT_COUNT                  (1U)\r\n\r\n/*! @name COMMON_ERRINT1 - Error Interrupt status for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_ERRINT1_ERR32_MASK            (0x1U)\r\n#define DMA_COMMON_ERRINT1_ERR32_SHIFT           (0U)\r\n/*! ERR32 - Error Interrupt flag for DMA channel.\r\n *  0b0..The Error Interrupt is not active for DMA channel.\r\n *  0b1..The Error Interrupt is pending for DMA channel.\r\n */\r\n#define DMA_COMMON_ERRINT1_ERR32(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ERRINT1_ERR32_SHIFT)) & DMA_COMMON_ERRINT1_ERR32_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_ERRINT1 */\r\n#define DMA_COMMON_ERRINT1_COUNT                 (1U)\r\n\r\n/*! @name COMMON_INTENSET - Interrupt Enable read and Set for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_INTENSET_INTEN0_MASK          (0x1U)\r\n#define DMA_COMMON_INTENSET_INTEN0_SHIFT         (0U)\r\n/*! INTEN0 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN0(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN0_SHIFT)) & DMA_COMMON_INTENSET_INTEN0_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN1_MASK          (0x2U)\r\n#define DMA_COMMON_INTENSET_INTEN1_SHIFT         (1U)\r\n/*! INTEN1 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN1(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN1_SHIFT)) & DMA_COMMON_INTENSET_INTEN1_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN2_MASK          (0x4U)\r\n#define DMA_COMMON_INTENSET_INTEN2_SHIFT         (2U)\r\n/*! INTEN2 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN2(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN2_SHIFT)) & DMA_COMMON_INTENSET_INTEN2_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN3_MASK          (0x8U)\r\n#define DMA_COMMON_INTENSET_INTEN3_SHIFT         (3U)\r\n/*! INTEN3 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN3(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN3_SHIFT)) & DMA_COMMON_INTENSET_INTEN3_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN4_MASK          (0x10U)\r\n#define DMA_COMMON_INTENSET_INTEN4_SHIFT         (4U)\r\n/*! INTEN4 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN4(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN4_SHIFT)) & DMA_COMMON_INTENSET_INTEN4_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN5_MASK          (0x20U)\r\n#define DMA_COMMON_INTENSET_INTEN5_SHIFT         (5U)\r\n/*! INTEN5 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN5(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN5_SHIFT)) & DMA_COMMON_INTENSET_INTEN5_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN6_MASK          (0x40U)\r\n#define DMA_COMMON_INTENSET_INTEN6_SHIFT         (6U)\r\n/*! INTEN6 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN6(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN6_SHIFT)) & DMA_COMMON_INTENSET_INTEN6_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN7_MASK          (0x80U)\r\n#define DMA_COMMON_INTENSET_INTEN7_SHIFT         (7U)\r\n/*! INTEN7 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN7(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN7_SHIFT)) & DMA_COMMON_INTENSET_INTEN7_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN8_MASK          (0x100U)\r\n#define DMA_COMMON_INTENSET_INTEN8_SHIFT         (8U)\r\n/*! INTEN8 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN8(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN8_SHIFT)) & DMA_COMMON_INTENSET_INTEN8_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN9_MASK          (0x200U)\r\n#define DMA_COMMON_INTENSET_INTEN9_SHIFT         (9U)\r\n/*! INTEN9 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN9(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN9_SHIFT)) & DMA_COMMON_INTENSET_INTEN9_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN10_MASK         (0x400U)\r\n#define DMA_COMMON_INTENSET_INTEN10_SHIFT        (10U)\r\n/*! INTEN10 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN10(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN10_SHIFT)) & DMA_COMMON_INTENSET_INTEN10_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN11_MASK         (0x800U)\r\n#define DMA_COMMON_INTENSET_INTEN11_SHIFT        (11U)\r\n/*! INTEN11 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN11(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN11_SHIFT)) & DMA_COMMON_INTENSET_INTEN11_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN12_MASK         (0x1000U)\r\n#define DMA_COMMON_INTENSET_INTEN12_SHIFT        (12U)\r\n/*! INTEN12 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN12(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN12_SHIFT)) & DMA_COMMON_INTENSET_INTEN12_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN13_MASK         (0x2000U)\r\n#define DMA_COMMON_INTENSET_INTEN13_SHIFT        (13U)\r\n/*! INTEN13 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN13(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN13_SHIFT)) & DMA_COMMON_INTENSET_INTEN13_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN14_MASK         (0x4000U)\r\n#define DMA_COMMON_INTENSET_INTEN14_SHIFT        (14U)\r\n/*! INTEN14 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN14(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN14_SHIFT)) & DMA_COMMON_INTENSET_INTEN14_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN15_MASK         (0x8000U)\r\n#define DMA_COMMON_INTENSET_INTEN15_SHIFT        (15U)\r\n/*! INTEN15 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN15(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN15_SHIFT)) & DMA_COMMON_INTENSET_INTEN15_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN16_MASK         (0x10000U)\r\n#define DMA_COMMON_INTENSET_INTEN16_SHIFT        (16U)\r\n/*! INTEN16 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN16(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN16_SHIFT)) & DMA_COMMON_INTENSET_INTEN16_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN17_MASK         (0x20000U)\r\n#define DMA_COMMON_INTENSET_INTEN17_SHIFT        (17U)\r\n/*! INTEN17 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN17(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN17_SHIFT)) & DMA_COMMON_INTENSET_INTEN17_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN18_MASK         (0x40000U)\r\n#define DMA_COMMON_INTENSET_INTEN18_SHIFT        (18U)\r\n/*! INTEN18 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN18(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN18_SHIFT)) & DMA_COMMON_INTENSET_INTEN18_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN19_MASK         (0x80000U)\r\n#define DMA_COMMON_INTENSET_INTEN19_SHIFT        (19U)\r\n/*! INTEN19 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN19(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN19_SHIFT)) & DMA_COMMON_INTENSET_INTEN19_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN20_MASK         (0x100000U)\r\n#define DMA_COMMON_INTENSET_INTEN20_SHIFT        (20U)\r\n/*! INTEN20 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN20(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN20_SHIFT)) & DMA_COMMON_INTENSET_INTEN20_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN21_MASK         (0x200000U)\r\n#define DMA_COMMON_INTENSET_INTEN21_SHIFT        (21U)\r\n/*! INTEN21 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN21(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN21_SHIFT)) & DMA_COMMON_INTENSET_INTEN21_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN22_MASK         (0x400000U)\r\n#define DMA_COMMON_INTENSET_INTEN22_SHIFT        (22U)\r\n/*! INTEN22 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN22(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN22_SHIFT)) & DMA_COMMON_INTENSET_INTEN22_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN23_MASK         (0x800000U)\r\n#define DMA_COMMON_INTENSET_INTEN23_SHIFT        (23U)\r\n/*! INTEN23 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN23(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN23_SHIFT)) & DMA_COMMON_INTENSET_INTEN23_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN24_MASK         (0x1000000U)\r\n#define DMA_COMMON_INTENSET_INTEN24_SHIFT        (24U)\r\n/*! INTEN24 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN24(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN24_SHIFT)) & DMA_COMMON_INTENSET_INTEN24_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN25_MASK         (0x2000000U)\r\n#define DMA_COMMON_INTENSET_INTEN25_SHIFT        (25U)\r\n/*! INTEN25 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN25(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN25_SHIFT)) & DMA_COMMON_INTENSET_INTEN25_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN26_MASK         (0x4000000U)\r\n#define DMA_COMMON_INTENSET_INTEN26_SHIFT        (26U)\r\n/*! INTEN26 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN26(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN26_SHIFT)) & DMA_COMMON_INTENSET_INTEN26_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN27_MASK         (0x8000000U)\r\n#define DMA_COMMON_INTENSET_INTEN27_SHIFT        (27U)\r\n/*! INTEN27 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN27(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN27_SHIFT)) & DMA_COMMON_INTENSET_INTEN27_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN28_MASK         (0x10000000U)\r\n#define DMA_COMMON_INTENSET_INTEN28_SHIFT        (28U)\r\n/*! INTEN28 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN28(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN28_SHIFT)) & DMA_COMMON_INTENSET_INTEN28_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN29_MASK         (0x20000000U)\r\n#define DMA_COMMON_INTENSET_INTEN29_SHIFT        (29U)\r\n/*! INTEN29 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN29(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN29_SHIFT)) & DMA_COMMON_INTENSET_INTEN29_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN30_MASK         (0x40000000U)\r\n#define DMA_COMMON_INTENSET_INTEN30_SHIFT        (30U)\r\n/*! INTEN30 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN30(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN30_SHIFT)) & DMA_COMMON_INTENSET_INTEN30_MASK)\r\n\r\n#define DMA_COMMON_INTENSET_INTEN31_MASK         (0x80000000U)\r\n#define DMA_COMMON_INTENSET_INTEN31_SHIFT        (31U)\r\n/*! INTEN31 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET_INTEN31(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET_INTEN31_SHIFT)) & DMA_COMMON_INTENSET_INTEN31_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_INTENSET */\r\n#define DMA_COMMON_INTENSET_COUNT                (1U)\r\n\r\n/*! @name COMMON_INTENSET1 - Interrupt Enable read and Set for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_INTENSET1_INTEN32_MASK        (0x1U)\r\n#define DMA_COMMON_INTENSET1_INTEN32_SHIFT       (0U)\r\n/*! INTEN32 - Interrupt Enable read and set for DMA channel.\r\n *  0b0..The Interrupt for DMA channel is disabled.\r\n *  0b1..The Interrupt for DMA channel is enabled.\r\n */\r\n#define DMA_COMMON_INTENSET1_INTEN32(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENSET1_INTEN32_SHIFT)) & DMA_COMMON_INTENSET1_INTEN32_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_INTENSET1 */\r\n#define DMA_COMMON_INTENSET1_COUNT               (1U)\r\n\r\n/*! @name COMMON_INTENCLR - Interrupt Enable Clear for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_INTENCLR_CLR0_MASK            (0x1U)\r\n#define DMA_COMMON_INTENCLR_CLR0_SHIFT           (0U)\r\n/*! CLR0 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR0(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR0_SHIFT)) & DMA_COMMON_INTENCLR_CLR0_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR1_MASK            (0x2U)\r\n#define DMA_COMMON_INTENCLR_CLR1_SHIFT           (1U)\r\n/*! CLR1 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR1(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR1_SHIFT)) & DMA_COMMON_INTENCLR_CLR1_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR2_MASK            (0x4U)\r\n#define DMA_COMMON_INTENCLR_CLR2_SHIFT           (2U)\r\n/*! CLR2 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR2(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR2_SHIFT)) & DMA_COMMON_INTENCLR_CLR2_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR3_MASK            (0x8U)\r\n#define DMA_COMMON_INTENCLR_CLR3_SHIFT           (3U)\r\n/*! CLR3 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR3(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR3_SHIFT)) & DMA_COMMON_INTENCLR_CLR3_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR4_MASK            (0x10U)\r\n#define DMA_COMMON_INTENCLR_CLR4_SHIFT           (4U)\r\n/*! CLR4 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR4(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR4_SHIFT)) & DMA_COMMON_INTENCLR_CLR4_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR5_MASK            (0x20U)\r\n#define DMA_COMMON_INTENCLR_CLR5_SHIFT           (5U)\r\n/*! CLR5 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR5(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR5_SHIFT)) & DMA_COMMON_INTENCLR_CLR5_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR6_MASK            (0x40U)\r\n#define DMA_COMMON_INTENCLR_CLR6_SHIFT           (6U)\r\n/*! CLR6 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR6(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR6_SHIFT)) & DMA_COMMON_INTENCLR_CLR6_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR7_MASK            (0x80U)\r\n#define DMA_COMMON_INTENCLR_CLR7_SHIFT           (7U)\r\n/*! CLR7 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR7(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR7_SHIFT)) & DMA_COMMON_INTENCLR_CLR7_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR8_MASK            (0x100U)\r\n#define DMA_COMMON_INTENCLR_CLR8_SHIFT           (8U)\r\n/*! CLR8 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR8(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR8_SHIFT)) & DMA_COMMON_INTENCLR_CLR8_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR9_MASK            (0x200U)\r\n#define DMA_COMMON_INTENCLR_CLR9_SHIFT           (9U)\r\n/*! CLR9 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR9(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR9_SHIFT)) & DMA_COMMON_INTENCLR_CLR9_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR10_MASK           (0x400U)\r\n#define DMA_COMMON_INTENCLR_CLR10_SHIFT          (10U)\r\n/*! CLR10 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR10(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR10_SHIFT)) & DMA_COMMON_INTENCLR_CLR10_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR11_MASK           (0x800U)\r\n#define DMA_COMMON_INTENCLR_CLR11_SHIFT          (11U)\r\n/*! CLR11 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR11(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR11_SHIFT)) & DMA_COMMON_INTENCLR_CLR11_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR12_MASK           (0x1000U)\r\n#define DMA_COMMON_INTENCLR_CLR12_SHIFT          (12U)\r\n/*! CLR12 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR12(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR12_SHIFT)) & DMA_COMMON_INTENCLR_CLR12_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR13_MASK           (0x2000U)\r\n#define DMA_COMMON_INTENCLR_CLR13_SHIFT          (13U)\r\n/*! CLR13 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR13(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR13_SHIFT)) & DMA_COMMON_INTENCLR_CLR13_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR14_MASK           (0x4000U)\r\n#define DMA_COMMON_INTENCLR_CLR14_SHIFT          (14U)\r\n/*! CLR14 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR14(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR14_SHIFT)) & DMA_COMMON_INTENCLR_CLR14_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR15_MASK           (0x8000U)\r\n#define DMA_COMMON_INTENCLR_CLR15_SHIFT          (15U)\r\n/*! CLR15 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR15(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR15_SHIFT)) & DMA_COMMON_INTENCLR_CLR15_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR16_MASK           (0x10000U)\r\n#define DMA_COMMON_INTENCLR_CLR16_SHIFT          (16U)\r\n/*! CLR16 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR16(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR16_SHIFT)) & DMA_COMMON_INTENCLR_CLR16_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR17_MASK           (0x20000U)\r\n#define DMA_COMMON_INTENCLR_CLR17_SHIFT          (17U)\r\n/*! CLR17 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR17(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR17_SHIFT)) & DMA_COMMON_INTENCLR_CLR17_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR18_MASK           (0x40000U)\r\n#define DMA_COMMON_INTENCLR_CLR18_SHIFT          (18U)\r\n/*! CLR18 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR18(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR18_SHIFT)) & DMA_COMMON_INTENCLR_CLR18_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR19_MASK           (0x80000U)\r\n#define DMA_COMMON_INTENCLR_CLR19_SHIFT          (19U)\r\n/*! CLR19 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR19(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR19_SHIFT)) & DMA_COMMON_INTENCLR_CLR19_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR20_MASK           (0x100000U)\r\n#define DMA_COMMON_INTENCLR_CLR20_SHIFT          (20U)\r\n/*! CLR20 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR20(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR20_SHIFT)) & DMA_COMMON_INTENCLR_CLR20_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR21_MASK           (0x200000U)\r\n#define DMA_COMMON_INTENCLR_CLR21_SHIFT          (21U)\r\n/*! CLR21 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR21(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR21_SHIFT)) & DMA_COMMON_INTENCLR_CLR21_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR22_MASK           (0x400000U)\r\n#define DMA_COMMON_INTENCLR_CLR22_SHIFT          (22U)\r\n/*! CLR22 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR22(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR22_SHIFT)) & DMA_COMMON_INTENCLR_CLR22_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR23_MASK           (0x800000U)\r\n#define DMA_COMMON_INTENCLR_CLR23_SHIFT          (23U)\r\n/*! CLR23 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR23(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR23_SHIFT)) & DMA_COMMON_INTENCLR_CLR23_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR24_MASK           (0x1000000U)\r\n#define DMA_COMMON_INTENCLR_CLR24_SHIFT          (24U)\r\n/*! CLR24 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR24(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR24_SHIFT)) & DMA_COMMON_INTENCLR_CLR24_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR25_MASK           (0x2000000U)\r\n#define DMA_COMMON_INTENCLR_CLR25_SHIFT          (25U)\r\n/*! CLR25 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR25(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR25_SHIFT)) & DMA_COMMON_INTENCLR_CLR25_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR26_MASK           (0x4000000U)\r\n#define DMA_COMMON_INTENCLR_CLR26_SHIFT          (26U)\r\n/*! CLR26 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR26(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR26_SHIFT)) & DMA_COMMON_INTENCLR_CLR26_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR27_MASK           (0x8000000U)\r\n#define DMA_COMMON_INTENCLR_CLR27_SHIFT          (27U)\r\n/*! CLR27 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR27(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR27_SHIFT)) & DMA_COMMON_INTENCLR_CLR27_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR28_MASK           (0x10000000U)\r\n#define DMA_COMMON_INTENCLR_CLR28_SHIFT          (28U)\r\n/*! CLR28 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR28(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR28_SHIFT)) & DMA_COMMON_INTENCLR_CLR28_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR29_MASK           (0x20000000U)\r\n#define DMA_COMMON_INTENCLR_CLR29_SHIFT          (29U)\r\n/*! CLR29 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR29(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR29_SHIFT)) & DMA_COMMON_INTENCLR_CLR29_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR30_MASK           (0x40000000U)\r\n#define DMA_COMMON_INTENCLR_CLR30_SHIFT          (30U)\r\n/*! CLR30 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR30(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR30_SHIFT)) & DMA_COMMON_INTENCLR_CLR30_MASK)\r\n\r\n#define DMA_COMMON_INTENCLR_CLR31_MASK           (0x80000000U)\r\n#define DMA_COMMON_INTENCLR_CLR31_SHIFT          (31U)\r\n/*! CLR31 - Writing ones to this register clears corresponding bits in the DMAIntEnSet0. */\r\n#define DMA_COMMON_INTENCLR_CLR31(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR_CLR31_SHIFT)) & DMA_COMMON_INTENCLR_CLR31_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_INTENCLR */\r\n#define DMA_COMMON_INTENCLR_COUNT                (1U)\r\n\r\n/*! @name COMMON_INTENCLR1 - Interrupt Enable Clear for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_INTENCLR1_CLR32_MASK          (0x1U)\r\n#define DMA_COMMON_INTENCLR1_CLR32_SHIFT         (0U)\r\n/*! CLR32 - Writing ones to this register clears corresponding bits in the DMAIntEnSet1. */\r\n#define DMA_COMMON_INTENCLR1_CLR32(x)            (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTENCLR1_CLR32_SHIFT)) & DMA_COMMON_INTENCLR1_CLR32_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_INTENCLR1 */\r\n#define DMA_COMMON_INTENCLR1_COUNT               (1U)\r\n\r\n/*! @name COMMON_INTA - Interrupt A status for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_INTA_INTA0_MASK               (0x1U)\r\n#define DMA_COMMON_INTA_INTA0_SHIFT              (0U)\r\n/*! INTA0 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA0(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA0_SHIFT)) & DMA_COMMON_INTA_INTA0_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA1_MASK               (0x2U)\r\n#define DMA_COMMON_INTA_INTA1_SHIFT              (1U)\r\n/*! INTA1 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA1(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA1_SHIFT)) & DMA_COMMON_INTA_INTA1_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA2_MASK               (0x4U)\r\n#define DMA_COMMON_INTA_INTA2_SHIFT              (2U)\r\n/*! INTA2 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA2(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA2_SHIFT)) & DMA_COMMON_INTA_INTA2_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA3_MASK               (0x8U)\r\n#define DMA_COMMON_INTA_INTA3_SHIFT              (3U)\r\n/*! INTA3 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA3(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA3_SHIFT)) & DMA_COMMON_INTA_INTA3_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA4_MASK               (0x10U)\r\n#define DMA_COMMON_INTA_INTA4_SHIFT              (4U)\r\n/*! INTA4 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA4(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA4_SHIFT)) & DMA_COMMON_INTA_INTA4_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA5_MASK               (0x20U)\r\n#define DMA_COMMON_INTA_INTA5_SHIFT              (5U)\r\n/*! INTA5 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA5(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA5_SHIFT)) & DMA_COMMON_INTA_INTA5_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA6_MASK               (0x40U)\r\n#define DMA_COMMON_INTA_INTA6_SHIFT              (6U)\r\n/*! INTA6 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA6(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA6_SHIFT)) & DMA_COMMON_INTA_INTA6_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA7_MASK               (0x80U)\r\n#define DMA_COMMON_INTA_INTA7_SHIFT              (7U)\r\n/*! INTA7 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA7(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA7_SHIFT)) & DMA_COMMON_INTA_INTA7_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA8_MASK               (0x100U)\r\n#define DMA_COMMON_INTA_INTA8_SHIFT              (8U)\r\n/*! INTA8 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA8(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA8_SHIFT)) & DMA_COMMON_INTA_INTA8_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA9_MASK               (0x200U)\r\n#define DMA_COMMON_INTA_INTA9_SHIFT              (9U)\r\n/*! INTA9 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA9(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA9_SHIFT)) & DMA_COMMON_INTA_INTA9_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA10_MASK              (0x400U)\r\n#define DMA_COMMON_INTA_INTA10_SHIFT             (10U)\r\n/*! INTA10 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA10(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA10_SHIFT)) & DMA_COMMON_INTA_INTA10_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA11_MASK              (0x800U)\r\n#define DMA_COMMON_INTA_INTA11_SHIFT             (11U)\r\n/*! INTA11 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA11(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA11_SHIFT)) & DMA_COMMON_INTA_INTA11_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA12_MASK              (0x1000U)\r\n#define DMA_COMMON_INTA_INTA12_SHIFT             (12U)\r\n/*! INTA12 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA12(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA12_SHIFT)) & DMA_COMMON_INTA_INTA12_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA13_MASK              (0x2000U)\r\n#define DMA_COMMON_INTA_INTA13_SHIFT             (13U)\r\n/*! INTA13 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA13(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA13_SHIFT)) & DMA_COMMON_INTA_INTA13_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA14_MASK              (0x4000U)\r\n#define DMA_COMMON_INTA_INTA14_SHIFT             (14U)\r\n/*! INTA14 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA14(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA14_SHIFT)) & DMA_COMMON_INTA_INTA14_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA15_MASK              (0x8000U)\r\n#define DMA_COMMON_INTA_INTA15_SHIFT             (15U)\r\n/*! INTA15 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA15(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA15_SHIFT)) & DMA_COMMON_INTA_INTA15_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA16_MASK              (0x10000U)\r\n#define DMA_COMMON_INTA_INTA16_SHIFT             (16U)\r\n/*! INTA16 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA16(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA16_SHIFT)) & DMA_COMMON_INTA_INTA16_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA17_MASK              (0x20000U)\r\n#define DMA_COMMON_INTA_INTA17_SHIFT             (17U)\r\n/*! INTA17 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA17(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA17_SHIFT)) & DMA_COMMON_INTA_INTA17_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA18_MASK              (0x40000U)\r\n#define DMA_COMMON_INTA_INTA18_SHIFT             (18U)\r\n/*! INTA18 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA18(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA18_SHIFT)) & DMA_COMMON_INTA_INTA18_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA19_MASK              (0x80000U)\r\n#define DMA_COMMON_INTA_INTA19_SHIFT             (19U)\r\n/*! INTA19 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA19(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA19_SHIFT)) & DMA_COMMON_INTA_INTA19_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA20_MASK              (0x100000U)\r\n#define DMA_COMMON_INTA_INTA20_SHIFT             (20U)\r\n/*! INTA20 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA20(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA20_SHIFT)) & DMA_COMMON_INTA_INTA20_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA21_MASK              (0x200000U)\r\n#define DMA_COMMON_INTA_INTA21_SHIFT             (21U)\r\n/*! INTA21 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA21(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA21_SHIFT)) & DMA_COMMON_INTA_INTA21_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA22_MASK              (0x400000U)\r\n#define DMA_COMMON_INTA_INTA22_SHIFT             (22U)\r\n/*! INTA22 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA22(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA22_SHIFT)) & DMA_COMMON_INTA_INTA22_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA23_MASK              (0x800000U)\r\n#define DMA_COMMON_INTA_INTA23_SHIFT             (23U)\r\n/*! INTA23 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA23(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA23_SHIFT)) & DMA_COMMON_INTA_INTA23_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA24_MASK              (0x1000000U)\r\n#define DMA_COMMON_INTA_INTA24_SHIFT             (24U)\r\n/*! INTA24 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA24(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA24_SHIFT)) & DMA_COMMON_INTA_INTA24_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA25_MASK              (0x2000000U)\r\n#define DMA_COMMON_INTA_INTA25_SHIFT             (25U)\r\n/*! INTA25 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA25(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA25_SHIFT)) & DMA_COMMON_INTA_INTA25_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA26_MASK              (0x4000000U)\r\n#define DMA_COMMON_INTA_INTA26_SHIFT             (26U)\r\n/*! INTA26 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA26(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA26_SHIFT)) & DMA_COMMON_INTA_INTA26_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA27_MASK              (0x8000000U)\r\n#define DMA_COMMON_INTA_INTA27_SHIFT             (27U)\r\n/*! INTA27 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA27(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA27_SHIFT)) & DMA_COMMON_INTA_INTA27_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA28_MASK              (0x10000000U)\r\n#define DMA_COMMON_INTA_INTA28_SHIFT             (28U)\r\n/*! INTA28 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA28(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA28_SHIFT)) & DMA_COMMON_INTA_INTA28_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA29_MASK              (0x20000000U)\r\n#define DMA_COMMON_INTA_INTA29_SHIFT             (29U)\r\n/*! INTA29 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA29(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA29_SHIFT)) & DMA_COMMON_INTA_INTA29_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA30_MASK              (0x40000000U)\r\n#define DMA_COMMON_INTA_INTA30_SHIFT             (30U)\r\n/*! INTA30 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA30(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA30_SHIFT)) & DMA_COMMON_INTA_INTA30_MASK)\r\n\r\n#define DMA_COMMON_INTA_INTA31_MASK              (0x80000000U)\r\n#define DMA_COMMON_INTA_INTA31_SHIFT             (31U)\r\n/*! INTA31 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA_INTA31(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA_INTA31_SHIFT)) & DMA_COMMON_INTA_INTA31_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_INTA */\r\n#define DMA_COMMON_INTA_COUNT                    (1U)\r\n\r\n/*! @name COMMON_INTA1 - Interrupt A status for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_INTA1_INTA32_MASK             (0x1U)\r\n#define DMA_COMMON_INTA1_INTA32_SHIFT            (0U)\r\n/*! INTA32 - Interrupt A status for DMA channel.\r\n *  0b0..The DMA channel interrupt A is not active.\r\n *  0b1..The DMA channel interrupt A is active.\r\n */\r\n#define DMA_COMMON_INTA1_INTA32(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTA1_INTA32_SHIFT)) & DMA_COMMON_INTA1_INTA32_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_INTA1 */\r\n#define DMA_COMMON_INTA1_COUNT                   (1U)\r\n\r\n/*! @name COMMON_INTB - Interrupt B status for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_INTB_INTB0_MASK               (0x1U)\r\n#define DMA_COMMON_INTB_INTB0_SHIFT              (0U)\r\n/*! INTB0 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB0(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB0_SHIFT)) & DMA_COMMON_INTB_INTB0_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB1_MASK               (0x2U)\r\n#define DMA_COMMON_INTB_INTB1_SHIFT              (1U)\r\n/*! INTB1 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB1(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB1_SHIFT)) & DMA_COMMON_INTB_INTB1_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB2_MASK               (0x4U)\r\n#define DMA_COMMON_INTB_INTB2_SHIFT              (2U)\r\n/*! INTB2 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB2(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB2_SHIFT)) & DMA_COMMON_INTB_INTB2_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB3_MASK               (0x8U)\r\n#define DMA_COMMON_INTB_INTB3_SHIFT              (3U)\r\n/*! INTB3 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB3(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB3_SHIFT)) & DMA_COMMON_INTB_INTB3_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB4_MASK               (0x10U)\r\n#define DMA_COMMON_INTB_INTB4_SHIFT              (4U)\r\n/*! INTB4 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB4(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB4_SHIFT)) & DMA_COMMON_INTB_INTB4_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB5_MASK               (0x20U)\r\n#define DMA_COMMON_INTB_INTB5_SHIFT              (5U)\r\n/*! INTB5 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB5(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB5_SHIFT)) & DMA_COMMON_INTB_INTB5_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB6_MASK               (0x40U)\r\n#define DMA_COMMON_INTB_INTB6_SHIFT              (6U)\r\n/*! INTB6 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB6(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB6_SHIFT)) & DMA_COMMON_INTB_INTB6_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB7_MASK               (0x80U)\r\n#define DMA_COMMON_INTB_INTB7_SHIFT              (7U)\r\n/*! INTB7 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB7(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB7_SHIFT)) & DMA_COMMON_INTB_INTB7_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB8_MASK               (0x100U)\r\n#define DMA_COMMON_INTB_INTB8_SHIFT              (8U)\r\n/*! INTB8 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB8(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB8_SHIFT)) & DMA_COMMON_INTB_INTB8_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB9_MASK               (0x200U)\r\n#define DMA_COMMON_INTB_INTB9_SHIFT              (9U)\r\n/*! INTB9 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB9(x)                 (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB9_SHIFT)) & DMA_COMMON_INTB_INTB9_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB10_MASK              (0x400U)\r\n#define DMA_COMMON_INTB_INTB10_SHIFT             (10U)\r\n/*! INTB10 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB10(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB10_SHIFT)) & DMA_COMMON_INTB_INTB10_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB11_MASK              (0x800U)\r\n#define DMA_COMMON_INTB_INTB11_SHIFT             (11U)\r\n/*! INTB11 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB11(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB11_SHIFT)) & DMA_COMMON_INTB_INTB11_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB12_MASK              (0x1000U)\r\n#define DMA_COMMON_INTB_INTB12_SHIFT             (12U)\r\n/*! INTB12 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB12(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB12_SHIFT)) & DMA_COMMON_INTB_INTB12_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB13_MASK              (0x2000U)\r\n#define DMA_COMMON_INTB_INTB13_SHIFT             (13U)\r\n/*! INTB13 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB13(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB13_SHIFT)) & DMA_COMMON_INTB_INTB13_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB14_MASK              (0x4000U)\r\n#define DMA_COMMON_INTB_INTB14_SHIFT             (14U)\r\n/*! INTB14 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB14(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB14_SHIFT)) & DMA_COMMON_INTB_INTB14_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB15_MASK              (0x8000U)\r\n#define DMA_COMMON_INTB_INTB15_SHIFT             (15U)\r\n/*! INTB15 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB15(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB15_SHIFT)) & DMA_COMMON_INTB_INTB15_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB16_MASK              (0x10000U)\r\n#define DMA_COMMON_INTB_INTB16_SHIFT             (16U)\r\n/*! INTB16 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB16(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB16_SHIFT)) & DMA_COMMON_INTB_INTB16_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB17_MASK              (0x20000U)\r\n#define DMA_COMMON_INTB_INTB17_SHIFT             (17U)\r\n/*! INTB17 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB17(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB17_SHIFT)) & DMA_COMMON_INTB_INTB17_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB18_MASK              (0x40000U)\r\n#define DMA_COMMON_INTB_INTB18_SHIFT             (18U)\r\n/*! INTB18 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB18(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB18_SHIFT)) & DMA_COMMON_INTB_INTB18_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB19_MASK              (0x80000U)\r\n#define DMA_COMMON_INTB_INTB19_SHIFT             (19U)\r\n/*! INTB19 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB19(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB19_SHIFT)) & DMA_COMMON_INTB_INTB19_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB20_MASK              (0x100000U)\r\n#define DMA_COMMON_INTB_INTB20_SHIFT             (20U)\r\n/*! INTB20 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB20(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB20_SHIFT)) & DMA_COMMON_INTB_INTB20_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB21_MASK              (0x200000U)\r\n#define DMA_COMMON_INTB_INTB21_SHIFT             (21U)\r\n/*! INTB21 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB21(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB21_SHIFT)) & DMA_COMMON_INTB_INTB21_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB22_MASK              (0x400000U)\r\n#define DMA_COMMON_INTB_INTB22_SHIFT             (22U)\r\n/*! INTB22 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB22(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB22_SHIFT)) & DMA_COMMON_INTB_INTB22_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB23_MASK              (0x800000U)\r\n#define DMA_COMMON_INTB_INTB23_SHIFT             (23U)\r\n/*! INTB23 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB23(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB23_SHIFT)) & DMA_COMMON_INTB_INTB23_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB24_MASK              (0x1000000U)\r\n#define DMA_COMMON_INTB_INTB24_SHIFT             (24U)\r\n/*! INTB24 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB24(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB24_SHIFT)) & DMA_COMMON_INTB_INTB24_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB25_MASK              (0x2000000U)\r\n#define DMA_COMMON_INTB_INTB25_SHIFT             (25U)\r\n/*! INTB25 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB25(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB25_SHIFT)) & DMA_COMMON_INTB_INTB25_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB26_MASK              (0x4000000U)\r\n#define DMA_COMMON_INTB_INTB26_SHIFT             (26U)\r\n/*! INTB26 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB26(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB26_SHIFT)) & DMA_COMMON_INTB_INTB26_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB27_MASK              (0x8000000U)\r\n#define DMA_COMMON_INTB_INTB27_SHIFT             (27U)\r\n/*! INTB27 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB27(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB27_SHIFT)) & DMA_COMMON_INTB_INTB27_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB28_MASK              (0x10000000U)\r\n#define DMA_COMMON_INTB_INTB28_SHIFT             (28U)\r\n/*! INTB28 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB28(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB28_SHIFT)) & DMA_COMMON_INTB_INTB28_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB29_MASK              (0x20000000U)\r\n#define DMA_COMMON_INTB_INTB29_SHIFT             (29U)\r\n/*! INTB29 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB29(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB29_SHIFT)) & DMA_COMMON_INTB_INTB29_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB30_MASK              (0x40000000U)\r\n#define DMA_COMMON_INTB_INTB30_SHIFT             (30U)\r\n/*! INTB30 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB30(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB30_SHIFT)) & DMA_COMMON_INTB_INTB30_MASK)\r\n\r\n#define DMA_COMMON_INTB_INTB31_MASK              (0x80000000U)\r\n#define DMA_COMMON_INTB_INTB31_SHIFT             (31U)\r\n/*! INTB31 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB_INTB31(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB_INTB31_SHIFT)) & DMA_COMMON_INTB_INTB31_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_INTB */\r\n#define DMA_COMMON_INTB_COUNT                    (1U)\r\n\r\n/*! @name COMMON_INTB1 - Interrupt B status for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_INTB1_INTB0_MASK              (0x1U)\r\n#define DMA_COMMON_INTB1_INTB0_SHIFT             (0U)\r\n/*! INTB0 - Interrupt B status for DMA channel.\r\n *  0b0..The DMA channel interrupt B is not active.\r\n *  0b1..The DMA channel interrupt B is active.\r\n */\r\n#define DMA_COMMON_INTB1_INTB0(x)                (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_INTB1_INTB0_SHIFT)) & DMA_COMMON_INTB1_INTB0_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_INTB1 */\r\n#define DMA_COMMON_INTB1_COUNT                   (1U)\r\n\r\n/*! @name COMMON_SETVALID - Set ValidPending control bits for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID0_MASK       (0x1U)\r\n#define DMA_COMMON_SETVALID_SETVALID0_SHIFT      (0U)\r\n/*! SETVALID0 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID0(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID0_SHIFT)) & DMA_COMMON_SETVALID_SETVALID0_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID1_MASK       (0x2U)\r\n#define DMA_COMMON_SETVALID_SETVALID1_SHIFT      (1U)\r\n/*! SETVALID1 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID1(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID1_SHIFT)) & DMA_COMMON_SETVALID_SETVALID1_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID2_MASK       (0x4U)\r\n#define DMA_COMMON_SETVALID_SETVALID2_SHIFT      (2U)\r\n/*! SETVALID2 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID2(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID2_SHIFT)) & DMA_COMMON_SETVALID_SETVALID2_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID3_MASK       (0x8U)\r\n#define DMA_COMMON_SETVALID_SETVALID3_SHIFT      (3U)\r\n/*! SETVALID3 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID3(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID3_SHIFT)) & DMA_COMMON_SETVALID_SETVALID3_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID4_MASK       (0x10U)\r\n#define DMA_COMMON_SETVALID_SETVALID4_SHIFT      (4U)\r\n/*! SETVALID4 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID4(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID4_SHIFT)) & DMA_COMMON_SETVALID_SETVALID4_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID5_MASK       (0x20U)\r\n#define DMA_COMMON_SETVALID_SETVALID5_SHIFT      (5U)\r\n/*! SETVALID5 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID5(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID5_SHIFT)) & DMA_COMMON_SETVALID_SETVALID5_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID6_MASK       (0x40U)\r\n#define DMA_COMMON_SETVALID_SETVALID6_SHIFT      (6U)\r\n/*! SETVALID6 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID6(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID6_SHIFT)) & DMA_COMMON_SETVALID_SETVALID6_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID7_MASK       (0x80U)\r\n#define DMA_COMMON_SETVALID_SETVALID7_SHIFT      (7U)\r\n/*! SETVALID7 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID7(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID7_SHIFT)) & DMA_COMMON_SETVALID_SETVALID7_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID8_MASK       (0x100U)\r\n#define DMA_COMMON_SETVALID_SETVALID8_SHIFT      (8U)\r\n/*! SETVALID8 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID8(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID8_SHIFT)) & DMA_COMMON_SETVALID_SETVALID8_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID9_MASK       (0x200U)\r\n#define DMA_COMMON_SETVALID_SETVALID9_SHIFT      (9U)\r\n/*! SETVALID9 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID9(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID9_SHIFT)) & DMA_COMMON_SETVALID_SETVALID9_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID10_MASK      (0x400U)\r\n#define DMA_COMMON_SETVALID_SETVALID10_SHIFT     (10U)\r\n/*! SETVALID10 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID10(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID10_SHIFT)) & DMA_COMMON_SETVALID_SETVALID10_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID11_MASK      (0x800U)\r\n#define DMA_COMMON_SETVALID_SETVALID11_SHIFT     (11U)\r\n/*! SETVALID11 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID11(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID11_SHIFT)) & DMA_COMMON_SETVALID_SETVALID11_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID12_MASK      (0x1000U)\r\n#define DMA_COMMON_SETVALID_SETVALID12_SHIFT     (12U)\r\n/*! SETVALID12 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID12(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID12_SHIFT)) & DMA_COMMON_SETVALID_SETVALID12_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID13_MASK      (0x2000U)\r\n#define DMA_COMMON_SETVALID_SETVALID13_SHIFT     (13U)\r\n/*! SETVALID13 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID13(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID13_SHIFT)) & DMA_COMMON_SETVALID_SETVALID13_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID14_MASK      (0x4000U)\r\n#define DMA_COMMON_SETVALID_SETVALID14_SHIFT     (14U)\r\n/*! SETVALID14 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID14(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID14_SHIFT)) & DMA_COMMON_SETVALID_SETVALID14_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID15_MASK      (0x8000U)\r\n#define DMA_COMMON_SETVALID_SETVALID15_SHIFT     (15U)\r\n/*! SETVALID15 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID15(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID15_SHIFT)) & DMA_COMMON_SETVALID_SETVALID15_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID16_MASK      (0x10000U)\r\n#define DMA_COMMON_SETVALID_SETVALID16_SHIFT     (16U)\r\n/*! SETVALID16 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID16(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID16_SHIFT)) & DMA_COMMON_SETVALID_SETVALID16_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID17_MASK      (0x20000U)\r\n#define DMA_COMMON_SETVALID_SETVALID17_SHIFT     (17U)\r\n/*! SETVALID17 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID17(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID17_SHIFT)) & DMA_COMMON_SETVALID_SETVALID17_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID18_MASK      (0x40000U)\r\n#define DMA_COMMON_SETVALID_SETVALID18_SHIFT     (18U)\r\n/*! SETVALID18 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID18(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID18_SHIFT)) & DMA_COMMON_SETVALID_SETVALID18_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID19_MASK      (0x80000U)\r\n#define DMA_COMMON_SETVALID_SETVALID19_SHIFT     (19U)\r\n/*! SETVALID19 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID19(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID19_SHIFT)) & DMA_COMMON_SETVALID_SETVALID19_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID20_MASK      (0x100000U)\r\n#define DMA_COMMON_SETVALID_SETVALID20_SHIFT     (20U)\r\n/*! SETVALID20 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID20(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID20_SHIFT)) & DMA_COMMON_SETVALID_SETVALID20_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID21_MASK      (0x200000U)\r\n#define DMA_COMMON_SETVALID_SETVALID21_SHIFT     (21U)\r\n/*! SETVALID21 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID21(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID21_SHIFT)) & DMA_COMMON_SETVALID_SETVALID21_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID22_MASK      (0x400000U)\r\n#define DMA_COMMON_SETVALID_SETVALID22_SHIFT     (22U)\r\n/*! SETVALID22 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID22(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID22_SHIFT)) & DMA_COMMON_SETVALID_SETVALID22_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID23_MASK      (0x800000U)\r\n#define DMA_COMMON_SETVALID_SETVALID23_SHIFT     (23U)\r\n/*! SETVALID23 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID23(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID23_SHIFT)) & DMA_COMMON_SETVALID_SETVALID23_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID24_MASK      (0x1000000U)\r\n#define DMA_COMMON_SETVALID_SETVALID24_SHIFT     (24U)\r\n/*! SETVALID24 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID24(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID24_SHIFT)) & DMA_COMMON_SETVALID_SETVALID24_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID25_MASK      (0x2000000U)\r\n#define DMA_COMMON_SETVALID_SETVALID25_SHIFT     (25U)\r\n/*! SETVALID25 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID25(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID25_SHIFT)) & DMA_COMMON_SETVALID_SETVALID25_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID26_MASK      (0x4000000U)\r\n#define DMA_COMMON_SETVALID_SETVALID26_SHIFT     (26U)\r\n/*! SETVALID26 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID26(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID26_SHIFT)) & DMA_COMMON_SETVALID_SETVALID26_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID27_MASK      (0x8000000U)\r\n#define DMA_COMMON_SETVALID_SETVALID27_SHIFT     (27U)\r\n/*! SETVALID27 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID27(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID27_SHIFT)) & DMA_COMMON_SETVALID_SETVALID27_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID28_MASK      (0x10000000U)\r\n#define DMA_COMMON_SETVALID_SETVALID28_SHIFT     (28U)\r\n/*! SETVALID28 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID28(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID28_SHIFT)) & DMA_COMMON_SETVALID_SETVALID28_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID29_MASK      (0x20000000U)\r\n#define DMA_COMMON_SETVALID_SETVALID29_SHIFT     (29U)\r\n/*! SETVALID29 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID29(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID29_SHIFT)) & DMA_COMMON_SETVALID_SETVALID29_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID30_MASK      (0x40000000U)\r\n#define DMA_COMMON_SETVALID_SETVALID30_SHIFT     (30U)\r\n/*! SETVALID30 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID30(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID30_SHIFT)) & DMA_COMMON_SETVALID_SETVALID30_MASK)\r\n\r\n#define DMA_COMMON_SETVALID_SETVALID31_MASK      (0x80000000U)\r\n#define DMA_COMMON_SETVALID_SETVALID31_SHIFT     (31U)\r\n/*! SETVALID31 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID_SETVALID31(x)        (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID_SETVALID31_SHIFT)) & DMA_COMMON_SETVALID_SETVALID31_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_SETVALID */\r\n#define DMA_COMMON_SETVALID_COUNT                (1U)\r\n\r\n/*! @name COMMON_SETVALID1 - Set ValidPending control bits for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_SETVALID1_SETVALID32_MASK     (0x1U)\r\n#define DMA_COMMON_SETVALID1_SETVALID32_SHIFT    (0U)\r\n/*! SETVALID32 - SetValid control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the ValidPending control bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETVALID1_SETVALID32(x)       (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETVALID1_SETVALID32_SHIFT)) & DMA_COMMON_SETVALID1_SETVALID32_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_SETVALID1 */\r\n#define DMA_COMMON_SETVALID1_COUNT               (1U)\r\n\r\n/*! @name COMMON_SETTRIG - Set Trigger control bits for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG0_MASK         (0x1U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG0_SHIFT        (0U)\r\n/*! SETTRIG0 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG0(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG0_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG0_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG1_MASK         (0x2U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG1_SHIFT        (1U)\r\n/*! SETTRIG1 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG1(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG1_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG1_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG2_MASK         (0x4U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG2_SHIFT        (2U)\r\n/*! SETTRIG2 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG2(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG2_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG2_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG3_MASK         (0x8U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG3_SHIFT        (3U)\r\n/*! SETTRIG3 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG3(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG3_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG3_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG4_MASK         (0x10U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG4_SHIFT        (4U)\r\n/*! SETTRIG4 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG4(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG4_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG4_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG5_MASK         (0x20U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG5_SHIFT        (5U)\r\n/*! SETTRIG5 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG5(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG5_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG5_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG6_MASK         (0x40U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG6_SHIFT        (6U)\r\n/*! SETTRIG6 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG6(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG6_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG6_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG7_MASK         (0x80U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG7_SHIFT        (7U)\r\n/*! SETTRIG7 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG7(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG7_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG7_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG8_MASK         (0x100U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG8_SHIFT        (8U)\r\n/*! SETTRIG8 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG8(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG8_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG8_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG9_MASK         (0x200U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG9_SHIFT        (9U)\r\n/*! SETTRIG9 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG9(x)           (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG9_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG9_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG10_MASK        (0x400U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG10_SHIFT       (10U)\r\n/*! SETTRIG10 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG10(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG10_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG10_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG11_MASK        (0x800U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG11_SHIFT       (11U)\r\n/*! SETTRIG11 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG11(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG11_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG11_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG12_MASK        (0x1000U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG12_SHIFT       (12U)\r\n/*! SETTRIG12 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG12(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG12_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG12_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG13_MASK        (0x2000U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG13_SHIFT       (13U)\r\n/*! SETTRIG13 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG13(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG13_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG13_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG14_MASK        (0x4000U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG14_SHIFT       (14U)\r\n/*! SETTRIG14 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG14(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG14_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG14_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG15_MASK        (0x8000U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG15_SHIFT       (15U)\r\n/*! SETTRIG15 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG15(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG15_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG15_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG16_MASK        (0x10000U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG16_SHIFT       (16U)\r\n/*! SETTRIG16 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG16(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG16_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG16_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG17_MASK        (0x20000U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG17_SHIFT       (17U)\r\n/*! SETTRIG17 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG17(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG17_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG17_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG18_MASK        (0x40000U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG18_SHIFT       (18U)\r\n/*! SETTRIG18 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG18(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG18_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG18_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG19_MASK        (0x80000U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG19_SHIFT       (19U)\r\n/*! SETTRIG19 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG19(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG19_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG19_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG20_MASK        (0x100000U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG20_SHIFT       (20U)\r\n/*! SETTRIG20 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG20(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG20_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG20_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG21_MASK        (0x200000U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG21_SHIFT       (21U)\r\n/*! SETTRIG21 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG21(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG21_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG21_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG22_MASK        (0x400000U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG22_SHIFT       (22U)\r\n/*! SETTRIG22 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG22(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG22_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG22_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG23_MASK        (0x800000U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG23_SHIFT       (23U)\r\n/*! SETTRIG23 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG23(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG23_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG23_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG24_MASK        (0x1000000U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG24_SHIFT       (24U)\r\n/*! SETTRIG24 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG24(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG24_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG24_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG25_MASK        (0x2000000U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG25_SHIFT       (25U)\r\n/*! SETTRIG25 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG25(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG25_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG25_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG26_MASK        (0x4000000U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG26_SHIFT       (26U)\r\n/*! SETTRIG26 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG26(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG26_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG26_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG27_MASK        (0x8000000U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG27_SHIFT       (27U)\r\n/*! SETTRIG27 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG27(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG27_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG27_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG28_MASK        (0x10000000U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG28_SHIFT       (28U)\r\n/*! SETTRIG28 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG28(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG28_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG28_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG29_MASK        (0x20000000U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG29_SHIFT       (29U)\r\n/*! SETTRIG29 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG29(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG29_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG29_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG30_MASK        (0x40000000U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG30_SHIFT       (30U)\r\n/*! SETTRIG30 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG30(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG30_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG30_MASK)\r\n\r\n#define DMA_COMMON_SETTRIG_SETTRIG31_MASK        (0x80000000U)\r\n#define DMA_COMMON_SETTRIG_SETTRIG31_SHIFT       (31U)\r\n/*! SETTRIG31 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG_SETTRIG31(x)          (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG_SETTRIG31_SHIFT)) & DMA_COMMON_SETTRIG_SETTRIG31_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_SETTRIG */\r\n#define DMA_COMMON_SETTRIG_COUNT                 (1U)\r\n\r\n/*! @name COMMON_SETTRIG1 - Set Trigger control bits for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_SETTRIG1_SETTRIG32_MASK       (0x1U)\r\n#define DMA_COMMON_SETTRIG1_SETTRIG32_SHIFT      (0U)\r\n/*! SETTRIG32 - Set Trigger control bit for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Sets the Trig bit for DMA channel.\r\n */\r\n#define DMA_COMMON_SETTRIG1_SETTRIG32(x)         (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_SETTRIG1_SETTRIG32_SHIFT)) & DMA_COMMON_SETTRIG1_SETTRIG32_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_SETTRIG1 */\r\n#define DMA_COMMON_SETTRIG1_COUNT                (1U)\r\n\r\n/*! @name COMMON_ABORT - Channel Abort control for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_ABORT_ABORT0_MASK             (0x1U)\r\n#define DMA_COMMON_ABORT_ABORT0_SHIFT            (0U)\r\n/*! ABORT0 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT0(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT0_SHIFT)) & DMA_COMMON_ABORT_ABORT0_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT1_MASK             (0x2U)\r\n#define DMA_COMMON_ABORT_ABORT1_SHIFT            (1U)\r\n/*! ABORT1 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT1(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT1_SHIFT)) & DMA_COMMON_ABORT_ABORT1_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT2_MASK             (0x4U)\r\n#define DMA_COMMON_ABORT_ABORT2_SHIFT            (2U)\r\n/*! ABORT2 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT2(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT2_SHIFT)) & DMA_COMMON_ABORT_ABORT2_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT3_MASK             (0x8U)\r\n#define DMA_COMMON_ABORT_ABORT3_SHIFT            (3U)\r\n/*! ABORT3 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT3(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT3_SHIFT)) & DMA_COMMON_ABORT_ABORT3_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT4_MASK             (0x10U)\r\n#define DMA_COMMON_ABORT_ABORT4_SHIFT            (4U)\r\n/*! ABORT4 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT4(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT4_SHIFT)) & DMA_COMMON_ABORT_ABORT4_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT5_MASK             (0x20U)\r\n#define DMA_COMMON_ABORT_ABORT5_SHIFT            (5U)\r\n/*! ABORT5 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT5(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT5_SHIFT)) & DMA_COMMON_ABORT_ABORT5_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT6_MASK             (0x40U)\r\n#define DMA_COMMON_ABORT_ABORT6_SHIFT            (6U)\r\n/*! ABORT6 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT6(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT6_SHIFT)) & DMA_COMMON_ABORT_ABORT6_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT7_MASK             (0x80U)\r\n#define DMA_COMMON_ABORT_ABORT7_SHIFT            (7U)\r\n/*! ABORT7 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT7(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT7_SHIFT)) & DMA_COMMON_ABORT_ABORT7_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT8_MASK             (0x100U)\r\n#define DMA_COMMON_ABORT_ABORT8_SHIFT            (8U)\r\n/*! ABORT8 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT8(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT8_SHIFT)) & DMA_COMMON_ABORT_ABORT8_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT9_MASK             (0x200U)\r\n#define DMA_COMMON_ABORT_ABORT9_SHIFT            (9U)\r\n/*! ABORT9 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT9(x)               (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT9_SHIFT)) & DMA_COMMON_ABORT_ABORT9_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT10_MASK            (0x400U)\r\n#define DMA_COMMON_ABORT_ABORT10_SHIFT           (10U)\r\n/*! ABORT10 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT10(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT10_SHIFT)) & DMA_COMMON_ABORT_ABORT10_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT11_MASK            (0x800U)\r\n#define DMA_COMMON_ABORT_ABORT11_SHIFT           (11U)\r\n/*! ABORT11 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT11(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT11_SHIFT)) & DMA_COMMON_ABORT_ABORT11_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT12_MASK            (0x1000U)\r\n#define DMA_COMMON_ABORT_ABORT12_SHIFT           (12U)\r\n/*! ABORT12 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT12(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT12_SHIFT)) & DMA_COMMON_ABORT_ABORT12_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT13_MASK            (0x2000U)\r\n#define DMA_COMMON_ABORT_ABORT13_SHIFT           (13U)\r\n/*! ABORT13 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT13(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT13_SHIFT)) & DMA_COMMON_ABORT_ABORT13_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT14_MASK            (0x4000U)\r\n#define DMA_COMMON_ABORT_ABORT14_SHIFT           (14U)\r\n/*! ABORT14 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT14(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT14_SHIFT)) & DMA_COMMON_ABORT_ABORT14_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT15_MASK            (0x8000U)\r\n#define DMA_COMMON_ABORT_ABORT15_SHIFT           (15U)\r\n/*! ABORT15 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT15(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT15_SHIFT)) & DMA_COMMON_ABORT_ABORT15_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT16_MASK            (0x10000U)\r\n#define DMA_COMMON_ABORT_ABORT16_SHIFT           (16U)\r\n/*! ABORT16 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT16(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT16_SHIFT)) & DMA_COMMON_ABORT_ABORT16_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT17_MASK            (0x20000U)\r\n#define DMA_COMMON_ABORT_ABORT17_SHIFT           (17U)\r\n/*! ABORT17 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT17(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT17_SHIFT)) & DMA_COMMON_ABORT_ABORT17_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT18_MASK            (0x40000U)\r\n#define DMA_COMMON_ABORT_ABORT18_SHIFT           (18U)\r\n/*! ABORT18 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT18(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT18_SHIFT)) & DMA_COMMON_ABORT_ABORT18_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT19_MASK            (0x80000U)\r\n#define DMA_COMMON_ABORT_ABORT19_SHIFT           (19U)\r\n/*! ABORT19 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT19(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT19_SHIFT)) & DMA_COMMON_ABORT_ABORT19_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT20_MASK            (0x100000U)\r\n#define DMA_COMMON_ABORT_ABORT20_SHIFT           (20U)\r\n/*! ABORT20 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT20(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT20_SHIFT)) & DMA_COMMON_ABORT_ABORT20_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT21_MASK            (0x200000U)\r\n#define DMA_COMMON_ABORT_ABORT21_SHIFT           (21U)\r\n/*! ABORT21 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT21(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT21_SHIFT)) & DMA_COMMON_ABORT_ABORT21_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT22_MASK            (0x400000U)\r\n#define DMA_COMMON_ABORT_ABORT22_SHIFT           (22U)\r\n/*! ABORT22 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT22(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT22_SHIFT)) & DMA_COMMON_ABORT_ABORT22_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT23_MASK            (0x800000U)\r\n#define DMA_COMMON_ABORT_ABORT23_SHIFT           (23U)\r\n/*! ABORT23 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT23(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT23_SHIFT)) & DMA_COMMON_ABORT_ABORT23_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT24_MASK            (0x1000000U)\r\n#define DMA_COMMON_ABORT_ABORT24_SHIFT           (24U)\r\n/*! ABORT24 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT24(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT24_SHIFT)) & DMA_COMMON_ABORT_ABORT24_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT25_MASK            (0x2000000U)\r\n#define DMA_COMMON_ABORT_ABORT25_SHIFT           (25U)\r\n/*! ABORT25 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT25(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT25_SHIFT)) & DMA_COMMON_ABORT_ABORT25_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT26_MASK            (0x4000000U)\r\n#define DMA_COMMON_ABORT_ABORT26_SHIFT           (26U)\r\n/*! ABORT26 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT26(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT26_SHIFT)) & DMA_COMMON_ABORT_ABORT26_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT27_MASK            (0x8000000U)\r\n#define DMA_COMMON_ABORT_ABORT27_SHIFT           (27U)\r\n/*! ABORT27 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT27(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT27_SHIFT)) & DMA_COMMON_ABORT_ABORT27_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT28_MASK            (0x10000000U)\r\n#define DMA_COMMON_ABORT_ABORT28_SHIFT           (28U)\r\n/*! ABORT28 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT28(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT28_SHIFT)) & DMA_COMMON_ABORT_ABORT28_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT29_MASK            (0x20000000U)\r\n#define DMA_COMMON_ABORT_ABORT29_SHIFT           (29U)\r\n/*! ABORT29 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT29(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT29_SHIFT)) & DMA_COMMON_ABORT_ABORT29_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT30_MASK            (0x40000000U)\r\n#define DMA_COMMON_ABORT_ABORT30_SHIFT           (30U)\r\n/*! ABORT30 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT30(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT30_SHIFT)) & DMA_COMMON_ABORT_ABORT30_MASK)\r\n\r\n#define DMA_COMMON_ABORT_ABORT31_MASK            (0x80000000U)\r\n#define DMA_COMMON_ABORT_ABORT31_SHIFT           (31U)\r\n/*! ABORT31 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT_ABORT31(x)              (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT_ABORT31_SHIFT)) & DMA_COMMON_ABORT_ABORT31_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_ABORT */\r\n#define DMA_COMMON_ABORT_COUNT                   (1U)\r\n\r\n/*! @name COMMON_ABORT1 - Channel Abort control for all DMA channels */\r\n/*! @{ */\r\n\r\n#define DMA_COMMON_ABORT1_ABORT32_MASK           (0x1U)\r\n#define DMA_COMMON_ABORT1_ABORT32_SHIFT          (0U)\r\n/*! ABORT32 - Abort control for DMA channel.\r\n *  0b0..No effect.\r\n *  0b1..Aborts DMA operations on channel.\r\n */\r\n#define DMA_COMMON_ABORT1_ABORT32(x)             (((uint32_t)(((uint32_t)(x)) << DMA_COMMON_ABORT1_ABORT32_SHIFT)) & DMA_COMMON_ABORT1_ABORT32_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_COMMON_ABORT1 */\r\n#define DMA_COMMON_ABORT1_COUNT                  (1U)\r\n\r\n/*! @name CHANNEL_CFG - Configuration register for DMA channel */\r\n/*! @{ */\r\n\r\n#define DMA_CHANNEL_CFG_PERIPHREQEN_MASK         (0x1U)\r\n#define DMA_CHANNEL_CFG_PERIPHREQEN_SHIFT        (0U)\r\n/*! PERIPHREQEN - Peripheral request Enable.\r\n *  0b0..Peripheral DMA requests disabled.\r\n *  0b1..Peripheral DMA requests enabled.\r\n */\r\n#define DMA_CHANNEL_CFG_PERIPHREQEN(x)           (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_CFG_PERIPHREQEN_SHIFT)) & DMA_CHANNEL_CFG_PERIPHREQEN_MASK)\r\n\r\n#define DMA_CHANNEL_CFG_HWTRIGEN_MASK            (0x2U)\r\n#define DMA_CHANNEL_CFG_HWTRIGEN_SHIFT           (1U)\r\n/*! HWTRIGEN - Hardware Triggering Enable for channel.\r\n *  0b0..Hardware triggering not used for channel.\r\n *  0b1..Hardware triggering used for channel.\r\n */\r\n#define DMA_CHANNEL_CFG_HWTRIGEN(x)              (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_CFG_HWTRIGEN_SHIFT)) & DMA_CHANNEL_CFG_HWTRIGEN_MASK)\r\n\r\n#define DMA_CHANNEL_CFG_TRIGPOL_MASK             (0x10U)\r\n#define DMA_CHANNEL_CFG_TRIGPOL_SHIFT            (4U)\r\n/*! TRIGPOL - Trigger Polarity.\r\n *  0b0..Active low - falling edge. Hardware trigger is active low or falling edge triggered, based on TRIGTYPE.\r\n *  0b1..Active high - rising edge. Hardware trigger is active high or rising edge triggered, based on TRIGTYPE.\r\n */\r\n#define DMA_CHANNEL_CFG_TRIGPOL(x)               (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_CFG_TRIGPOL_SHIFT)) & DMA_CHANNEL_CFG_TRIGPOL_MASK)\r\n\r\n#define DMA_CHANNEL_CFG_TRIGTYPE_MASK            (0x20U)\r\n#define DMA_CHANNEL_CFG_TRIGTYPE_SHIFT           (5U)\r\n/*! TRIGTYPE - Trigger Type.\r\n *  0b0..Edge. Hardware trigger is edge triggered. Transfers will be initiated and completed, as specified for a single trigger.\r\n *  0b1..Level.\r\n */\r\n#define DMA_CHANNEL_CFG_TRIGTYPE(x)              (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_CFG_TRIGTYPE_SHIFT)) & DMA_CHANNEL_CFG_TRIGTYPE_MASK)\r\n\r\n#define DMA_CHANNEL_CFG_TRIGBURST_MASK           (0x40U)\r\n#define DMA_CHANNEL_CFG_TRIGBURST_SHIFT          (6U)\r\n/*! TRIGBURST - Trigger Burst.\r\n *  0b0..Single transfer.\r\n *  0b1..Burst transfer.\r\n */\r\n#define DMA_CHANNEL_CFG_TRIGBURST(x)             (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_CFG_TRIGBURST_SHIFT)) & DMA_CHANNEL_CFG_TRIGBURST_MASK)\r\n\r\n#define DMA_CHANNEL_CFG_BURSTPOWER_MASK          (0xF00U)\r\n#define DMA_CHANNEL_CFG_BURSTPOWER_SHIFT         (8U)\r\n/*! BURSTPOWER - Burst Power. */\r\n#define DMA_CHANNEL_CFG_BURSTPOWER(x)            (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_CFG_BURSTPOWER_SHIFT)) & DMA_CHANNEL_CFG_BURSTPOWER_MASK)\r\n\r\n#define DMA_CHANNEL_CFG_SRCBURSTWRAP_MASK        (0x4000U)\r\n#define DMA_CHANNEL_CFG_SRCBURSTWRAP_SHIFT       (14U)\r\n/*! SRCBURSTWRAP - Source Burst Wrap.\r\n *  0b0..Disabled.\r\n *  0b1..Enabled.\r\n */\r\n#define DMA_CHANNEL_CFG_SRCBURSTWRAP(x)          (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_CFG_SRCBURSTWRAP_SHIFT)) & DMA_CHANNEL_CFG_SRCBURSTWRAP_MASK)\r\n\r\n#define DMA_CHANNEL_CFG_DSTBURSTWRAP_MASK        (0x8000U)\r\n#define DMA_CHANNEL_CFG_DSTBURSTWRAP_SHIFT       (15U)\r\n/*! DSTBURSTWRAP - Destination Burst Wrap.\r\n *  0b0..Disabled. Destination burst wrapping is not enabled for this DMA channel.\r\n *  0b1..Enabled. Destination burst wrapping is enabled for this DMA channel.\r\n */\r\n#define DMA_CHANNEL_CFG_DSTBURSTWRAP(x)          (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_CFG_DSTBURSTWRAP_SHIFT)) & DMA_CHANNEL_CFG_DSTBURSTWRAP_MASK)\r\n\r\n#define DMA_CHANNEL_CFG_CHPRIORITY_MASK          (0x70000U)\r\n#define DMA_CHANNEL_CFG_CHPRIORITY_SHIFT         (16U)\r\n/*! CHPRIORITY - Priority of channel when multiple DMA requests are pending. */\r\n#define DMA_CHANNEL_CFG_CHPRIORITY(x)            (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_CFG_CHPRIORITY_SHIFT)) & DMA_CHANNEL_CFG_CHPRIORITY_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_CHANNEL_CFG */\r\n#define DMA_CHANNEL_CFG_COUNT                    (33U)\r\n\r\n/*! @name CHANNEL_CTLSTAT - Control and status register for DMA channel */\r\n/*! @{ */\r\n\r\n#define DMA_CHANNEL_CTLSTAT_VALIDPENDING_MASK    (0x1U)\r\n#define DMA_CHANNEL_CTLSTAT_VALIDPENDING_SHIFT   (0U)\r\n/*! VALIDPENDING - Valid pending flag for this channel.\r\n *  0b0..No effect on DMA operation.\r\n *  0b1..Valid pending.\r\n */\r\n#define DMA_CHANNEL_CTLSTAT_VALIDPENDING(x)      (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_CTLSTAT_VALIDPENDING_SHIFT)) & DMA_CHANNEL_CTLSTAT_VALIDPENDING_MASK)\r\n\r\n#define DMA_CHANNEL_CTLSTAT_TRIG_MASK            (0x4U)\r\n#define DMA_CHANNEL_CTLSTAT_TRIG_SHIFT           (2U)\r\n/*! TRIG - Trigger flag.\r\n *  0b0..Not triggered. The trigger for this DMA channel is not set. DMA operations will not be carried out.\r\n *  0b1..Triggered. The trigger for this DMA channel is set. DMA operations will be carried out.\r\n */\r\n#define DMA_CHANNEL_CTLSTAT_TRIG(x)              (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_CTLSTAT_TRIG_SHIFT)) & DMA_CHANNEL_CTLSTAT_TRIG_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_CHANNEL_CTLSTAT */\r\n#define DMA_CHANNEL_CTLSTAT_COUNT                (33U)\r\n\r\n/*! @name CHANNEL_XFERCFG - Transfer configuration register for DMA channel */\r\n/*! @{ */\r\n\r\n#define DMA_CHANNEL_XFERCFG_CFGVALID_MASK        (0x1U)\r\n#define DMA_CHANNEL_XFERCFG_CFGVALID_SHIFT       (0U)\r\n/*! CFGVALID - Configuration Valid flag.\r\n *  0b0..Not valid.\r\n *  0b1..Valid.\r\n */\r\n#define DMA_CHANNEL_XFERCFG_CFGVALID(x)          (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_XFERCFG_CFGVALID_SHIFT)) & DMA_CHANNEL_XFERCFG_CFGVALID_MASK)\r\n\r\n#define DMA_CHANNEL_XFERCFG_RELOAD_MASK          (0x2U)\r\n#define DMA_CHANNEL_XFERCFG_RELOAD_SHIFT         (1U)\r\n/*! RELOAD - Reload.\r\n *  0b0..Disabled. The channels' control structure should not be reloaded when the current descriptor is exhausted.\r\n *  0b1..Enabled. The channels' control structure should be reloaded when the current descriptor is exhausted.\r\n */\r\n#define DMA_CHANNEL_XFERCFG_RELOAD(x)            (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_XFERCFG_RELOAD_SHIFT)) & DMA_CHANNEL_XFERCFG_RELOAD_MASK)\r\n\r\n#define DMA_CHANNEL_XFERCFG_SWTRIG_MASK          (0x4U)\r\n#define DMA_CHANNEL_XFERCFG_SWTRIG_SHIFT         (2U)\r\n/*! SWTRIG - Software Trigger.\r\n *  0b0..Not set.\r\n *  0b1..Set.\r\n */\r\n#define DMA_CHANNEL_XFERCFG_SWTRIG(x)            (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_XFERCFG_SWTRIG_SHIFT)) & DMA_CHANNEL_XFERCFG_SWTRIG_MASK)\r\n\r\n#define DMA_CHANNEL_XFERCFG_CLRTRIG_MASK         (0x8U)\r\n#define DMA_CHANNEL_XFERCFG_CLRTRIG_SHIFT        (3U)\r\n/*! CLRTRIG - Clear Trigger.\r\n *  0b0..Not cleared.\r\n *  0b1..Cleared.\r\n */\r\n#define DMA_CHANNEL_XFERCFG_CLRTRIG(x)           (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_XFERCFG_CLRTRIG_SHIFT)) & DMA_CHANNEL_XFERCFG_CLRTRIG_MASK)\r\n\r\n#define DMA_CHANNEL_XFERCFG_SETINTA_MASK         (0x10U)\r\n#define DMA_CHANNEL_XFERCFG_SETINTA_SHIFT        (4U)\r\n/*! SETINTA - Set Interrupt flag A for channel.\r\n *  0b0..No effect.\r\n *  0b1..Set. The INTA flag for this channel will be set when the current descriptor is exhausted.\r\n */\r\n#define DMA_CHANNEL_XFERCFG_SETINTA(x)           (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_XFERCFG_SETINTA_SHIFT)) & DMA_CHANNEL_XFERCFG_SETINTA_MASK)\r\n\r\n#define DMA_CHANNEL_XFERCFG_SETINTB_MASK         (0x20U)\r\n#define DMA_CHANNEL_XFERCFG_SETINTB_SHIFT        (5U)\r\n/*! SETINTB - Set Interrupt flag B for channel.\r\n *  0b0..No effect.\r\n *  0b1..Set. The INTB flag for this channel will be set when the current descriptor is exhausted.\r\n */\r\n#define DMA_CHANNEL_XFERCFG_SETINTB(x)           (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_XFERCFG_SETINTB_SHIFT)) & DMA_CHANNEL_XFERCFG_SETINTB_MASK)\r\n\r\n#define DMA_CHANNEL_XFERCFG_WIDTH_MASK           (0x300U)\r\n#define DMA_CHANNEL_XFERCFG_WIDTH_SHIFT          (8U)\r\n/*! WIDTH - Transfer width used for this DMA channel.\r\n *  0b00..8-bit.\r\n *  0b01..16-bit.\r\n *  0b10..32-bit.\r\n *  0b11..Reserved.\r\n */\r\n#define DMA_CHANNEL_XFERCFG_WIDTH(x)             (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_XFERCFG_WIDTH_SHIFT)) & DMA_CHANNEL_XFERCFG_WIDTH_MASK)\r\n\r\n#define DMA_CHANNEL_XFERCFG_SRCINC_MASK          (0x3000U)\r\n#define DMA_CHANNEL_XFERCFG_SRCINC_SHIFT         (12U)\r\n/*! SRCINC - Source address increment\r\n *  0b00..No increment.\r\n *  0b01..1 x width.\r\n *  0b10..2 x width.\r\n *  0b11..4 x width.\r\n */\r\n#define DMA_CHANNEL_XFERCFG_SRCINC(x)            (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_XFERCFG_SRCINC_SHIFT)) & DMA_CHANNEL_XFERCFG_SRCINC_MASK)\r\n\r\n#define DMA_CHANNEL_XFERCFG_DSTINC_MASK          (0xC000U)\r\n#define DMA_CHANNEL_XFERCFG_DSTINC_SHIFT         (14U)\r\n/*! DSTINC - Destination address increment\r\n *  0b00..No increment.\r\n *  0b01..1 x width.\r\n *  0b10..2 x width.\r\n *  0b11..4 x width.\r\n */\r\n#define DMA_CHANNEL_XFERCFG_DSTINC(x)            (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_XFERCFG_DSTINC_SHIFT)) & DMA_CHANNEL_XFERCFG_DSTINC_MASK)\r\n\r\n#define DMA_CHANNEL_XFERCFG_XFERCOUNT_MASK       (0x3FF0000U)\r\n#define DMA_CHANNEL_XFERCFG_XFERCOUNT_SHIFT      (16U)\r\n/*! XFERCOUNT - Total number of transfers to be performed, minus 1 encoded. */\r\n#define DMA_CHANNEL_XFERCFG_XFERCOUNT(x)         (((uint32_t)(((uint32_t)(x)) << DMA_CHANNEL_XFERCFG_XFERCOUNT_SHIFT)) & DMA_CHANNEL_XFERCFG_XFERCOUNT_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMA_CHANNEL_XFERCFG */\r\n#define DMA_CHANNEL_XFERCFG_COUNT                (33U)\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group DMA_Register_Masks */\r\n\r\n\r\n/* DMA - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral DMA0 base address */\r\n  #define DMA0_BASE                                (0x50104000u)\r\n  /** Peripheral DMA0 base address */\r\n  #define DMA0_BASE_NS                             (0x40104000u)\r\n  /** Peripheral DMA0 base pointer */\r\n  #define DMA0                                     ((DMA_Type *)DMA0_BASE)\r\n  /** Peripheral DMA0 base pointer */\r\n  #define DMA0_NS                                  ((DMA_Type *)DMA0_BASE_NS)\r\n  /** Peripheral DMA1 base address */\r\n  #define DMA1_BASE                                (0x50105000u)\r\n  /** Peripheral DMA1 base address */\r\n  #define DMA1_BASE_NS                             (0x40105000u)\r\n  /** Peripheral DMA1 base pointer */\r\n  #define DMA1                                     ((DMA_Type *)DMA1_BASE)\r\n  /** Peripheral DMA1 base pointer */\r\n  #define DMA1_NS                                  ((DMA_Type *)DMA1_BASE_NS)\r\n  /** Array initializer of DMA peripheral base addresses */\r\n  #define DMA_BASE_ADDRS                           { DMA0_BASE, DMA1_BASE }\r\n  /** Array initializer of DMA peripheral base pointers */\r\n  #define DMA_BASE_PTRS                            { DMA0, DMA1 }\r\n  /** Array initializer of DMA peripheral base addresses */\r\n  #define DMA_BASE_ADDRS_NS                        { DMA0_BASE_NS, DMA1_BASE_NS }\r\n  /** Array initializer of DMA peripheral base pointers */\r\n  #define DMA_BASE_PTRS_NS                         { DMA0_NS, DMA1_NS }\r\n#else\r\n  /** Peripheral DMA0 base address */\r\n  #define DMA0_BASE                                (0x40104000u)\r\n  /** Peripheral DMA0 base pointer */\r\n  #define DMA0                                     ((DMA_Type *)DMA0_BASE)\r\n  /** Peripheral DMA1 base address */\r\n  #define DMA1_BASE                                (0x40105000u)\r\n  /** Peripheral DMA1 base pointer */\r\n  #define DMA1                                     ((DMA_Type *)DMA1_BASE)\r\n  /** Array initializer of DMA peripheral base addresses */\r\n  #define DMA_BASE_ADDRS                           { DMA0_BASE, DMA1_BASE }\r\n  /** Array initializer of DMA peripheral base pointers */\r\n  #define DMA_BASE_PTRS                            { DMA0, DMA1 }\r\n#endif\r\n/** Interrupt vectors for the DMA peripheral type */\r\n#define DMA_IRQS                                 { DMA0_IRQn, DMA1_IRQn }\r\n\r\n/*!\r\n * @}\r\n */ /* end of group DMA_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- DMIC Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup DMIC_Peripheral_Access_Layer DMIC Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** DMIC - Register Layout Typedef */\r\ntypedef struct {\r\n  struct {                                         /* offset: 0x0, array step: 0x100 */\r\n    __IO uint32_t OSR;                               /**< Oversample Rate, array offset: 0x0, array step: 0x100 */\r\n    __IO uint32_t DIVHFCLK;                          /**< DMIC Clock, array offset: 0x4, array step: 0x100 */\r\n    __IO uint32_t PREAC2FSCOEF;                      /**< Compensation Filter for 2 FS, array offset: 0x8, array step: 0x100 */\r\n    __IO uint32_t PREAC4FSCOEF;                      /**< Compensation Filter for 4 FS, array offset: 0xC, array step: 0x100 */\r\n    __IO uint32_t GAINSHIFT;                         /**< Decimator Gain Shift, array offset: 0x10, array step: 0x100 */\r\n         uint8_t RESERVED_0[108];\r\n    __IO uint32_t FIFO_CTRL;                         /**< FIFO Control, array offset: 0x80, array step: 0x100 */\r\n    __IO uint32_t FIFO_STATUS;                       /**< FIFO Status, array offset: 0x84, array step: 0x100 */\r\n    __I  uint32_t FIFO_DATA;                         /**< FIFO Data, array offset: 0x88, array step: 0x100 */\r\n    __IO uint32_t PHY_CTRL;                          /**< Physical Control, array offset: 0x8C, array step: 0x100 */\r\n    __IO uint32_t DC_CTRL;                           /**< DC Filter Control, array offset: 0x90, array step: 0x100 */\r\n         uint8_t RESERVED_1[108];\r\n  } CHANNEL[4];\r\n       uint8_t RESERVED_0[2816];\r\n  __IO uint32_t CHANEN;                            /**< Channel Enable, offset: 0xF00 */\r\n       uint8_t RESERVED_1[12];\r\n  __IO uint32_t USE2FS;                            /**< Use 2 FS register, offset: 0xF10 */\r\n  __IO uint32_t GLOBAL_SYCN_EN;                    /**< Global Channel Synchronization Enable, offset: 0xF14 */\r\n  __IO uint32_t GLOBAL_COUNT_VAL;                  /**< Global channel synchronization counter value, offset: 0xF18 */\r\n  __IO uint32_t DECRESET;                          /**< DMIC decimator reset, offset: 0xF1C */\r\n       uint8_t RESERVED_2[96];\r\n  __IO uint32_t HWVADGAIN;                         /**< HWVAD Input Gain, offset: 0xF80 */\r\n  __IO uint32_t HWVADHPFS;                         /**< HWVAD Filter Control, offset: 0xF84 */\r\n  __IO uint32_t HWVADST10;                         /**< HWVAD Control, offset: 0xF88 */\r\n  __IO uint32_t HWVADRSTT;                         /**< HWVAD Filter Reset, offset: 0xF8C */\r\n  __IO uint32_t HWVADTHGN;                         /**< HWVAD Noise Estimator Gain, offset: 0xF90 */\r\n  __IO uint32_t HWVADTHGS;                         /**< HWVAD Signal Estimator Gain, offset: 0xF94 */\r\n  __I  uint32_t HWVADLOWZ;                         /**< HWVAD Noise Envelope Estimator, offset: 0xF98 */\r\n} DMIC_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- DMIC Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup DMIC_Register_Masks DMIC Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name CHANNEL_OSR - Oversample Rate */\r\n/*! @{ */\r\n\r\n#define DMIC_CHANNEL_OSR_OSR_MASK                (0xFFU)\r\n#define DMIC_CHANNEL_OSR_OSR_SHIFT               (0U)\r\n/*! OSR - Oversample Rate */\r\n#define DMIC_CHANNEL_OSR_OSR(x)                  (((uint32_t)(((uint32_t)(x)) << DMIC_CHANNEL_OSR_OSR_SHIFT)) & DMIC_CHANNEL_OSR_OSR_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMIC_CHANNEL_OSR */\r\n#define DMIC_CHANNEL_OSR_COUNT                   (4U)\r\n\r\n/*! @name CHANNEL_DIVHFCLK - DMIC Clock */\r\n/*! @{ */\r\n\r\n#define DMIC_CHANNEL_DIVHFCLK_PDMDIV_MASK        (0xFU)\r\n#define DMIC_CHANNEL_DIVHFCLK_PDMDIV_SHIFT       (0U)\r\n/*! PDMDIV - PDM Clock Divider Value\r\n *  0b0000..Divide by 1\r\n *  0b0001..Divide by 2\r\n *  0b0010..Divide by 3\r\n *  0b0011..Divide by 4\r\n *  0b0100..Divide by 6\r\n *  0b0101..Divide by 8\r\n *  0b0110..Divide by 12\r\n *  0b0111..Divide by 16\r\n *  0b1000..Divide by 24\r\n *  0b1001..Divide by 32\r\n *  0b1010..Divide by 48\r\n *  0b1011..Divide by 64\r\n *  0b1100..Divide by 96\r\n *  0b1101..Divide by 128\r\n *  0b1110-0b1111..Reserved\r\n */\r\n#define DMIC_CHANNEL_DIVHFCLK_PDMDIV(x)          (((uint32_t)(((uint32_t)(x)) << DMIC_CHANNEL_DIVHFCLK_PDMDIV_SHIFT)) & DMIC_CHANNEL_DIVHFCLK_PDMDIV_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMIC_CHANNEL_DIVHFCLK */\r\n#define DMIC_CHANNEL_DIVHFCLK_COUNT              (4U)\r\n\r\n/*! @name CHANNEL_PREAC2FSCOEF - Compensation Filter for 2 FS */\r\n/*! @{ */\r\n\r\n#define DMIC_CHANNEL_PREAC2FSCOEF_COMP_MASK      (0x3U)\r\n#define DMIC_CHANNEL_PREAC2FSCOEF_COMP_SHIFT     (0U)\r\n/*! COMP - Compensation value\r\n *  0b00..Compensation = 0. This is the recommended setting.\r\n *  0b01..Compensation = -0.16\r\n *  0b10..Compensation = -0.15\r\n *  0b11..Compensation = -0.13\r\n */\r\n#define DMIC_CHANNEL_PREAC2FSCOEF_COMP(x)        (((uint32_t)(((uint32_t)(x)) << DMIC_CHANNEL_PREAC2FSCOEF_COMP_SHIFT)) & DMIC_CHANNEL_PREAC2FSCOEF_COMP_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMIC_CHANNEL_PREAC2FSCOEF */\r\n#define DMIC_CHANNEL_PREAC2FSCOEF_COUNT          (4U)\r\n\r\n/*! @name CHANNEL_PREAC4FSCOEF - Compensation Filter for 4 FS */\r\n/*! @{ */\r\n\r\n#define DMIC_CHANNEL_PREAC4FSCOEF_COMP_MASK      (0x3U)\r\n#define DMIC_CHANNEL_PREAC4FSCOEF_COMP_SHIFT     (0U)\r\n/*! COMP - Compensation value\r\n *  0b00..Compensation = 0. This is the recommended setting.\r\n *  0b01..Compensation = -0.16\r\n *  0b10..Compensation = -0.15\r\n *  0b11..Compensation = -0.13\r\n */\r\n#define DMIC_CHANNEL_PREAC4FSCOEF_COMP(x)        (((uint32_t)(((uint32_t)(x)) << DMIC_CHANNEL_PREAC4FSCOEF_COMP_SHIFT)) & DMIC_CHANNEL_PREAC4FSCOEF_COMP_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMIC_CHANNEL_PREAC4FSCOEF */\r\n#define DMIC_CHANNEL_PREAC4FSCOEF_COUNT          (4U)\r\n\r\n/*! @name CHANNEL_GAINSHIFT - Decimator Gain Shift */\r\n/*! @{ */\r\n\r\n#define DMIC_CHANNEL_GAINSHIFT_GAIN_MASK         (0x3FU)\r\n#define DMIC_CHANNEL_GAINSHIFT_GAIN_SHIFT        (0U)\r\n/*! GAIN - Gain */\r\n#define DMIC_CHANNEL_GAINSHIFT_GAIN(x)           (((uint32_t)(((uint32_t)(x)) << DMIC_CHANNEL_GAINSHIFT_GAIN_SHIFT)) & DMIC_CHANNEL_GAINSHIFT_GAIN_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMIC_CHANNEL_GAINSHIFT */\r\n#define DMIC_CHANNEL_GAINSHIFT_COUNT             (4U)\r\n\r\n/*! @name CHANNEL_FIFO_CTRL - FIFO Control */\r\n/*! @{ */\r\n\r\n#define DMIC_CHANNEL_FIFO_CTRL_ENABLE_MASK       (0x1U)\r\n#define DMIC_CHANNEL_FIFO_CTRL_ENABLE_SHIFT      (0U)\r\n/*! ENABLE - FIFO Enable.\r\n *  0b0..FIFO is not enabled. Enabling a DMIC channel with the FIFO disabled could be useful while data is being\r\n *       streamed to the I2S, or in order to avoid a filter settling delay when a channel is re-enabled after a\r\n *       period when the data was not needed.\r\n *  0b1..FIFO is enabled. The FIFO must be enabled in order for the CPU or DMA to read data from the DMIC via the FIFODATA register.\r\n */\r\n#define DMIC_CHANNEL_FIFO_CTRL_ENABLE(x)         (((uint32_t)(((uint32_t)(x)) << DMIC_CHANNEL_FIFO_CTRL_ENABLE_SHIFT)) & DMIC_CHANNEL_FIFO_CTRL_ENABLE_MASK)\r\n\r\n#define DMIC_CHANNEL_FIFO_CTRL_RESETN_MASK       (0x2U)\r\n#define DMIC_CHANNEL_FIFO_CTRL_RESETN_SHIFT      (1U)\r\n/*! RESETN - FIFO Reset\r\n *  0b0..Reset the FIFO. This must be cleared before resuming operation.\r\n *  0b1..Normal operation\r\n */\r\n#define DMIC_CHANNEL_FIFO_CTRL_RESETN(x)         (((uint32_t)(((uint32_t)(x)) << DMIC_CHANNEL_FIFO_CTRL_RESETN_SHIFT)) & DMIC_CHANNEL_FIFO_CTRL_RESETN_MASK)\r\n\r\n#define DMIC_CHANNEL_FIFO_CTRL_INTEN_MASK        (0x4U)\r\n#define DMIC_CHANNEL_FIFO_CTRL_INTEN_SHIFT       (2U)\r\n/*! INTEN - Interrupt Enable.\r\n *  0b0..FIFO level interrupts are not enabled.\r\n *  0b1..FIFO level interrupts are enabled.\r\n */\r\n#define DMIC_CHANNEL_FIFO_CTRL_INTEN(x)          (((uint32_t)(((uint32_t)(x)) << DMIC_CHANNEL_FIFO_CTRL_INTEN_SHIFT)) & DMIC_CHANNEL_FIFO_CTRL_INTEN_MASK)\r\n\r\n#define DMIC_CHANNEL_FIFO_CTRL_DMAEN_MASK        (0x8U)\r\n#define DMIC_CHANNEL_FIFO_CTRL_DMAEN_SHIFT       (3U)\r\n/*! DMAEN - DMA Enable\r\n *  0b0..DMA requests are not enabled.\r\n *  0b1..DMA requests based on FIFO level are enabled.\r\n */\r\n#define DMIC_CHANNEL_FIFO_CTRL_DMAEN(x)          (((uint32_t)(((uint32_t)(x)) << DMIC_CHANNEL_FIFO_CTRL_DMAEN_SHIFT)) & DMIC_CHANNEL_FIFO_CTRL_DMAEN_MASK)\r\n\r\n#define DMIC_CHANNEL_FIFO_CTRL_TRIGLVL_MASK      (0x1F0000U)\r\n#define DMIC_CHANNEL_FIFO_CTRL_TRIGLVL_SHIFT     (16U)\r\n/*! TRIGLVL - FIFO Trigger Level for Interrupt\r\n *  0b00000..Trigger when the FIFO has received one entry (is no longer empty).\r\n *  0b00001..Trigger when the FIFO has received two entries.\r\n *  0b01110..Trigger when the FIFO has received 15 entries.\r\n *  0b01111..Trigger when the FIFO has received 16 entries (has become full).\r\n */\r\n#define DMIC_CHANNEL_FIFO_CTRL_TRIGLVL(x)        (((uint32_t)(((uint32_t)(x)) << DMIC_CHANNEL_FIFO_CTRL_TRIGLVL_SHIFT)) & DMIC_CHANNEL_FIFO_CTRL_TRIGLVL_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMIC_CHANNEL_FIFO_CTRL */\r\n#define DMIC_CHANNEL_FIFO_CTRL_COUNT             (4U)\r\n\r\n/*! @name CHANNEL_FIFO_STATUS - FIFO Status */\r\n/*! @{ */\r\n\r\n#define DMIC_CHANNEL_FIFO_STATUS_INT_MASK        (0x1U)\r\n#define DMIC_CHANNEL_FIFO_STATUS_INT_SHIFT       (0U)\r\n/*! INT - Status of Interrupt (write 1 to clear) */\r\n#define DMIC_CHANNEL_FIFO_STATUS_INT(x)          (((uint32_t)(((uint32_t)(x)) << DMIC_CHANNEL_FIFO_STATUS_INT_SHIFT)) & DMIC_CHANNEL_FIFO_STATUS_INT_MASK)\r\n\r\n#define DMIC_CHANNEL_FIFO_STATUS_OVERRUN_MASK    (0x2U)\r\n#define DMIC_CHANNEL_FIFO_STATUS_OVERRUN_SHIFT   (1U)\r\n/*! OVERRUN - Overrun Detected (write 1 to clear) */\r\n#define DMIC_CHANNEL_FIFO_STATUS_OVERRUN(x)      (((uint32_t)(((uint32_t)(x)) << DMIC_CHANNEL_FIFO_STATUS_OVERRUN_SHIFT)) & DMIC_CHANNEL_FIFO_STATUS_OVERRUN_MASK)\r\n\r\n#define DMIC_CHANNEL_FIFO_STATUS_UNDERRUN_MASK   (0x4U)\r\n#define DMIC_CHANNEL_FIFO_STATUS_UNDERRUN_SHIFT  (2U)\r\n/*! UNDERRUN - Underrun Detected (write 1 to clear) */\r\n#define DMIC_CHANNEL_FIFO_STATUS_UNDERRUN(x)     (((uint32_t)(((uint32_t)(x)) << DMIC_CHANNEL_FIFO_STATUS_UNDERRUN_SHIFT)) & DMIC_CHANNEL_FIFO_STATUS_UNDERRUN_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMIC_CHANNEL_FIFO_STATUS */\r\n#define DMIC_CHANNEL_FIFO_STATUS_COUNT           (4U)\r\n\r\n/*! @name CHANNEL_FIFO_DATA - FIFO Data */\r\n/*! @{ */\r\n\r\n#define DMIC_CHANNEL_FIFO_DATA_DATA_MASK         (0xFFFFFFU)\r\n#define DMIC_CHANNEL_FIFO_DATA_DATA_SHIFT        (0U)\r\n/*! DATA - PCM Data */\r\n#define DMIC_CHANNEL_FIFO_DATA_DATA(x)           (((uint32_t)(((uint32_t)(x)) << DMIC_CHANNEL_FIFO_DATA_DATA_SHIFT)) & DMIC_CHANNEL_FIFO_DATA_DATA_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMIC_CHANNEL_FIFO_DATA */\r\n#define DMIC_CHANNEL_FIFO_DATA_COUNT             (4U)\r\n\r\n/*! @name CHANNEL_PHY_CTRL - Physical Control */\r\n/*! @{ */\r\n\r\n#define DMIC_CHANNEL_PHY_CTRL_PHY_FALL_MASK      (0x1U)\r\n#define DMIC_CHANNEL_PHY_CTRL_PHY_FALL_SHIFT     (0U)\r\n/*! PHY_FALL - Capture DMIC on Falling edge (0 means on rising)\r\n *  0b0..Capture PDM_DATA on the rising edge of PDM_CLK.\r\n *  0b1..Capture PDM_DATA on the falling edge of PDM_CLK.\r\n */\r\n#define DMIC_CHANNEL_PHY_CTRL_PHY_FALL(x)        (((uint32_t)(((uint32_t)(x)) << DMIC_CHANNEL_PHY_CTRL_PHY_FALL_SHIFT)) & DMIC_CHANNEL_PHY_CTRL_PHY_FALL_MASK)\r\n\r\n#define DMIC_CHANNEL_PHY_CTRL_PHY_HALF_MASK      (0x2U)\r\n#define DMIC_CHANNEL_PHY_CTRL_PHY_HALF_SHIFT     (1U)\r\n/*! PHY_HALF - Use Half rate sampling (ie Clock to dmic is sent at half the speed than the decimator is providing)\r\n *  0b0..Standard half rate sampling. The clock to the DMIC is sent at the same rate as the decimator is providing.\r\n *  0b1..Use half rate sampling. The clock to the DMIC is sent at half the rate that the decimator is providing.\r\n */\r\n#define DMIC_CHANNEL_PHY_CTRL_PHY_HALF(x)        (((uint32_t)(((uint32_t)(x)) << DMIC_CHANNEL_PHY_CTRL_PHY_HALF_SHIFT)) & DMIC_CHANNEL_PHY_CTRL_PHY_HALF_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMIC_CHANNEL_PHY_CTRL */\r\n#define DMIC_CHANNEL_PHY_CTRL_COUNT              (4U)\r\n\r\n/*! @name CHANNEL_DC_CTRL - DC Filter Control */\r\n/*! @{ */\r\n\r\n#define DMIC_CHANNEL_DC_CTRL_DCPOLE_MASK         (0x3U)\r\n#define DMIC_CHANNEL_DC_CTRL_DCPOLE_SHIFT        (0U)\r\n/*! DCPOLE - DC Block Filter\r\n *  0b00..Flat Response, no filter\r\n *  0b01..155 Hz\r\n *  0b10..78 Hz\r\n *  0b11..39 Hz\r\n */\r\n#define DMIC_CHANNEL_DC_CTRL_DCPOLE(x)           (((uint32_t)(((uint32_t)(x)) << DMIC_CHANNEL_DC_CTRL_DCPOLE_SHIFT)) & DMIC_CHANNEL_DC_CTRL_DCPOLE_MASK)\r\n\r\n#define DMIC_CHANNEL_DC_CTRL_DCGAIN_MASK         (0xF0U)\r\n#define DMIC_CHANNEL_DC_CTRL_DCGAIN_SHIFT        (4U)\r\n/*! DCGAIN - DC Gain */\r\n#define DMIC_CHANNEL_DC_CTRL_DCGAIN(x)           (((uint32_t)(((uint32_t)(x)) << DMIC_CHANNEL_DC_CTRL_DCGAIN_SHIFT)) & DMIC_CHANNEL_DC_CTRL_DCGAIN_MASK)\r\n\r\n#define DMIC_CHANNEL_DC_CTRL_SATURATEAT16BIT_MASK (0x100U)\r\n#define DMIC_CHANNEL_DC_CTRL_SATURATEAT16BIT_SHIFT (8U)\r\n/*! SATURATEAT16BIT - Saturate at 16 Bit\r\n *  0b0..Do not Saturate. Results roll over if out range and do not saturate.\r\n *  0b1..Saturate. If the result overflows, it saturates at 0xFFFF for positive overflow and 0x8000 for negative overflow.\r\n */\r\n#define DMIC_CHANNEL_DC_CTRL_SATURATEAT16BIT(x)  (((uint32_t)(((uint32_t)(x)) << DMIC_CHANNEL_DC_CTRL_SATURATEAT16BIT_SHIFT)) & DMIC_CHANNEL_DC_CTRL_SATURATEAT16BIT_MASK)\r\n\r\n#define DMIC_CHANNEL_DC_CTRL_SIGNEXTEND_MASK     (0x200U)\r\n#define DMIC_CHANNEL_DC_CTRL_SIGNEXTEND_SHIFT    (9U)\r\n/*! SIGNEXTEND - Sign Extend\r\n *  0b0..The top byte of the FIFODATA register is always 0.\r\n *  0b1..The top byte of the FIFODATA register is sign extended.\r\n */\r\n#define DMIC_CHANNEL_DC_CTRL_SIGNEXTEND(x)       (((uint32_t)(((uint32_t)(x)) << DMIC_CHANNEL_DC_CTRL_SIGNEXTEND_SHIFT)) & DMIC_CHANNEL_DC_CTRL_SIGNEXTEND_MASK)\r\n/*! @} */\r\n\r\n/* The count of DMIC_CHANNEL_DC_CTRL */\r\n#define DMIC_CHANNEL_DC_CTRL_COUNT               (4U)\r\n\r\n/*! @name CHANEN - Channel Enable */\r\n/*! @{ */\r\n\r\n#define DMIC_CHANEN_EN_CH0_MASK                  (0x1U)\r\n#define DMIC_CHANEN_EN_CH0_SHIFT                 (0U)\r\n/*! EN_CH0 - Enable Channel n\r\n *  0b0..PDM channel n is disabled.\r\n *  0b1..PDM channel n is enabled.\r\n */\r\n#define DMIC_CHANEN_EN_CH0(x)                    (((uint32_t)(((uint32_t)(x)) << DMIC_CHANEN_EN_CH0_SHIFT)) & DMIC_CHANEN_EN_CH0_MASK)\r\n\r\n#define DMIC_CHANEN_EN_CH1_MASK                  (0x2U)\r\n#define DMIC_CHANEN_EN_CH1_SHIFT                 (1U)\r\n/*! EN_CH1 - Enable Channel n\r\n *  0b0..PDM channel n is disabled.\r\n *  0b1..PDM channel n is enabled.\r\n */\r\n#define DMIC_CHANEN_EN_CH1(x)                    (((uint32_t)(((uint32_t)(x)) << DMIC_CHANEN_EN_CH1_SHIFT)) & DMIC_CHANEN_EN_CH1_MASK)\r\n\r\n#define DMIC_CHANEN_EN_CH2_MASK                  (0x4U)\r\n#define DMIC_CHANEN_EN_CH2_SHIFT                 (2U)\r\n/*! EN_CH2 - Enable Channel n\r\n *  0b0..PDM channel n is disabled.\r\n *  0b1..PDM channel n is enabled.\r\n */\r\n#define DMIC_CHANEN_EN_CH2(x)                    (((uint32_t)(((uint32_t)(x)) << DMIC_CHANEN_EN_CH2_SHIFT)) & DMIC_CHANEN_EN_CH2_MASK)\r\n\r\n#define DMIC_CHANEN_EN_CH3_MASK                  (0x8U)\r\n#define DMIC_CHANEN_EN_CH3_SHIFT                 (3U)\r\n/*! EN_CH3 - Enable Channel n\r\n *  0b0..PDM channel n is disabled.\r\n *  0b1..PDM channel n is enabled.\r\n */\r\n#define DMIC_CHANEN_EN_CH3(x)                    (((uint32_t)(((uint32_t)(x)) << DMIC_CHANEN_EN_CH3_SHIFT)) & DMIC_CHANEN_EN_CH3_MASK)\r\n/*! @} */\r\n\r\n/*! @name USE2FS - Use 2 FS register */\r\n/*! @{ */\r\n\r\n#define DMIC_USE2FS_USE2FS_MASK                  (0x1U)\r\n#define DMIC_USE2FS_USE2FS_SHIFT                 (0U)\r\n/*! USE2FS - Use 2FS register\r\n *  0b0..Use 1 FS output for PCM data.\r\n *  0b1..Use 2 FS output for PCM data.\r\n */\r\n#define DMIC_USE2FS_USE2FS(x)                    (((uint32_t)(((uint32_t)(x)) << DMIC_USE2FS_USE2FS_SHIFT)) & DMIC_USE2FS_USE2FS_MASK)\r\n/*! @} */\r\n\r\n/*! @name GLOBAL_SYCN_EN - Global Channel Synchronization Enable */\r\n/*! @{ */\r\n\r\n#define DMIC_GLOBAL_SYCN_EN_CH_SYNC_EN_MASK      (0xFU)\r\n#define DMIC_GLOBAL_SYCN_EN_CH_SYNC_EN_SHIFT     (0U)\r\n/*! CH_SYNC_EN - Channel synch enable */\r\n#define DMIC_GLOBAL_SYCN_EN_CH_SYNC_EN(x)        (((uint32_t)(((uint32_t)(x)) << DMIC_GLOBAL_SYCN_EN_CH_SYNC_EN_SHIFT)) & DMIC_GLOBAL_SYCN_EN_CH_SYNC_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name GLOBAL_COUNT_VAL - Global channel synchronization counter value */\r\n/*! @{ */\r\n\r\n#define DMIC_GLOBAL_COUNT_VAL_CCOUNTVAL_MASK     (0xFFFFFFFFU)\r\n#define DMIC_GLOBAL_COUNT_VAL_CCOUNTVAL_SHIFT    (0U)\r\n/*! CCOUNTVAL - Channel Counter Value */\r\n#define DMIC_GLOBAL_COUNT_VAL_CCOUNTVAL(x)       (((uint32_t)(((uint32_t)(x)) << DMIC_GLOBAL_COUNT_VAL_CCOUNTVAL_SHIFT)) & DMIC_GLOBAL_COUNT_VAL_CCOUNTVAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name DECRESET - DMIC decimator reset */\r\n/*! @{ */\r\n\r\n#define DMIC_DECRESET_DECRESET_MASK              (0xFU)\r\n#define DMIC_DECRESET_DECRESET_SHIFT             (0U)\r\n/*! DECRESET - Decimator reset\r\n *  0b0000..Release reset to decimator\r\n *  0b0001..Assert reset to decimator\r\n */\r\n#define DMIC_DECRESET_DECRESET(x)                (((uint32_t)(((uint32_t)(x)) << DMIC_DECRESET_DECRESET_SHIFT)) & DMIC_DECRESET_DECRESET_MASK)\r\n/*! @} */\r\n\r\n/*! @name HWVADGAIN - HWVAD Input Gain */\r\n/*! @{ */\r\n\r\n#define DMIC_HWVADGAIN_INPUTGAIN_MASK            (0xFU)\r\n#define DMIC_HWVADGAIN_INPUTGAIN_SHIFT           (0U)\r\n/*! INPUTGAIN\r\n *  0b0000..-10 bits\r\n *  0b0001..-8 bits\r\n *  0b0010..-6 bits\r\n *  0b0011..-4 bits\r\n *  0b0100..-2 bits\r\n *  0b0101..0 bits (default)\r\n *  0b0110..+2 bits\r\n *  0b0111..+4 bits\r\n *  0b1000..+6 bits\r\n *  0b1001..+8 bits\r\n *  0b1010..+10 bits\r\n *  0b1011..+12 bits\r\n *  0b1100..+14 bits\r\n *  0b1101-0b1111..Reserved\r\n */\r\n#define DMIC_HWVADGAIN_INPUTGAIN(x)              (((uint32_t)(((uint32_t)(x)) << DMIC_HWVADGAIN_INPUTGAIN_SHIFT)) & DMIC_HWVADGAIN_INPUTGAIN_MASK)\r\n/*! @} */\r\n\r\n/*! @name HWVADHPFS - HWVAD Filter Control */\r\n/*! @{ */\r\n\r\n#define DMIC_HWVADHPFS_HPFS_MASK                 (0x3U)\r\n#define DMIC_HWVADHPFS_HPFS_SHIFT                (0U)\r\n/*! HPFS - The HPFS field chooses the High Pass filter in first part of HWVAD.\r\n *  0b00..BYPASS. First filter by-pass.\r\n *  0b01..HIGH_PASS_1750HZ. High pass filter with -3dB cut-off at 1750 Hz.\r\n *  0b10..HIGH_PASS_215HZ. High pass filter with -3dB cut-off at 215 Hz.\r\n *  0b11..Reserved\r\n */\r\n#define DMIC_HWVADHPFS_HPFS(x)                   (((uint32_t)(((uint32_t)(x)) << DMIC_HWVADHPFS_HPFS_SHIFT)) & DMIC_HWVADHPFS_HPFS_MASK)\r\n/*! @} */\r\n\r\n/*! @name HWVADST10 - HWVAD Control */\r\n/*! @{ */\r\n\r\n#define DMIC_HWVADST10_ST10_MASK                 (0x1U)\r\n#define DMIC_HWVADST10_ST10_SHIFT                (0U)\r\n/*! ST10 - STAGE 1\r\n *  0b0..Normal operation, waiting for HWVAD trigger event (stage 0).\r\n *  0b1..Reset internal interrupt flag by writing a '1' (stage 1) pulse.\r\n */\r\n#define DMIC_HWVADST10_ST10(x)                   (((uint32_t)(((uint32_t)(x)) << DMIC_HWVADST10_ST10_SHIFT)) & DMIC_HWVADST10_ST10_MASK)\r\n/*! @} */\r\n\r\n/*! @name HWVADRSTT - HWVAD Filter Reset */\r\n/*! @{ */\r\n\r\n#define DMIC_HWVADRSTT_RSST_MASK                 (0x1U)\r\n#define DMIC_HWVADRSTT_RSST_SHIFT                (0U)\r\n/*! RSST - Reset HWVAD */\r\n#define DMIC_HWVADRSTT_RSST(x)                   (((uint32_t)(((uint32_t)(x)) << DMIC_HWVADRSTT_RSST_SHIFT)) & DMIC_HWVADRSTT_RSST_MASK)\r\n/*! @} */\r\n\r\n/*! @name HWVADTHGN - HWVAD Noise Estimator Gain */\r\n/*! @{ */\r\n\r\n#define DMIC_HWVADTHGN_THGN_MASK                 (0xFU)\r\n#define DMIC_HWVADTHGN_THGN_SHIFT                (0U)\r\n/*! THGN - Gain Factor for Noise Estimator */\r\n#define DMIC_HWVADTHGN_THGN(x)                   (((uint32_t)(((uint32_t)(x)) << DMIC_HWVADTHGN_THGN_SHIFT)) & DMIC_HWVADTHGN_THGN_MASK)\r\n/*! @} */\r\n\r\n/*! @name HWVADTHGS - HWVAD Signal Estimator Gain */\r\n/*! @{ */\r\n\r\n#define DMIC_HWVADTHGS_THGS_MASK                 (0xFU)\r\n#define DMIC_HWVADTHGS_THGS_SHIFT                (0U)\r\n/*! THGS - Signal Gain Factor */\r\n#define DMIC_HWVADTHGS_THGS(x)                   (((uint32_t)(((uint32_t)(x)) << DMIC_HWVADTHGS_THGS_SHIFT)) & DMIC_HWVADTHGS_THGS_MASK)\r\n/*! @} */\r\n\r\n/*! @name HWVADLOWZ - HWVAD Noise Envelope Estimator */\r\n/*! @{ */\r\n\r\n#define DMIC_HWVADLOWZ_LOWZ_MASK                 (0xFFFFU)\r\n#define DMIC_HWVADLOWZ_LOWZ_SHIFT                (0U)\r\n/*! LOWZ - Average Noise-floor Value */\r\n#define DMIC_HWVADLOWZ_LOWZ(x)                   (((uint32_t)(((uint32_t)(x)) << DMIC_HWVADLOWZ_LOWZ_SHIFT)) & DMIC_HWVADLOWZ_LOWZ_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group DMIC_Register_Masks */\r\n\r\n\r\n/* DMIC - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral DMIC0 base address */\r\n  #define DMIC0_BASE                               (0x50121000u)\r\n  /** Peripheral DMIC0 base address */\r\n  #define DMIC0_BASE_NS                            (0x40121000u)\r\n  /** Peripheral DMIC0 base pointer */\r\n  #define DMIC0                                    ((DMIC_Type *)DMIC0_BASE)\r\n  /** Peripheral DMIC0 base pointer */\r\n  #define DMIC0_NS                                 ((DMIC_Type *)DMIC0_BASE_NS)\r\n  /** Array initializer of DMIC peripheral base addresses */\r\n  #define DMIC_BASE_ADDRS                          { DMIC0_BASE }\r\n  /** Array initializer of DMIC peripheral base pointers */\r\n  #define DMIC_BASE_PTRS                           { DMIC0 }\r\n  /** Array initializer of DMIC peripheral base addresses */\r\n  #define DMIC_BASE_ADDRS_NS                       { DMIC0_BASE_NS }\r\n  /** Array initializer of DMIC peripheral base pointers */\r\n  #define DMIC_BASE_PTRS_NS                        { DMIC0_NS }\r\n#else\r\n  /** Peripheral DMIC0 base address */\r\n  #define DMIC0_BASE                               (0x40121000u)\r\n  /** Peripheral DMIC0 base pointer */\r\n  #define DMIC0                                    ((DMIC_Type *)DMIC0_BASE)\r\n  /** Array initializer of DMIC peripheral base addresses */\r\n  #define DMIC_BASE_ADDRS                          { DMIC0_BASE }\r\n  /** Array initializer of DMIC peripheral base pointers */\r\n  #define DMIC_BASE_PTRS                           { DMIC0 }\r\n#endif\r\n/** Interrupt vectors for the DMIC peripheral type */\r\n#define DMIC_IRQS                                { DMIC_IRQn }\r\n#define DMIC_HWVAD_IRQS                          { HWVAD_IRQn }\r\n\r\n/*!\r\n * @}\r\n */ /* end of group DMIC_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- ELS Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup ELS_Peripheral_Access_Layer ELS Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** ELS - Register Layout Typedef */\r\ntypedef struct {\r\n  __I  uint32_t ELS_STATUS;                        /**< Status register, offset: 0x0 */\r\n  __IO uint32_t ELS_CTRL;                          /**< ELS Control register, offset: 0x4 */\r\n  __IO uint32_t ELS_CMDCFG0;                       /**< ELS command configuration register, offset: 0x8 */\r\n  __IO uint32_t ELS_CFG;                           /**< ELS configuration register, offset: 0xC */\r\n  __IO uint32_t ELS_KIDX0;                         /**< Keystore index 0 - for commands that access a single key, offset: 0x10 */\r\n  __IO uint32_t ELS_KIDX1;                         /**< Keystore index 1 - for commands that access 2 keys, offset: 0x14 */\r\n  __IO uint32_t ELS_KPROPIN;                       /**< key properties request, offset: 0x18 */\r\n       uint8_t RESERVED_0[4];\r\n  __IO uint32_t ELS_DMA_SRC0;                      /**< ELS DMA Source 0, offset: 0x20 */\r\n  __IO uint32_t ELS_DMA_SRC0_LEN;                  /**< ELS DMA Source 0 length, offset: 0x24 */\r\n  __IO uint32_t ELS_DMA_SRC1;                      /**< ELS DMA Source 1, offset: 0x28 */\r\n       uint8_t RESERVED_1[4];\r\n  __IO uint32_t ELS_DMA_SRC2;                      /**< ELS DMA Source 2, offset: 0x30 */\r\n  __IO uint32_t ELS_DMA_SRC2_LEN;                  /**< ELS DMA Source 2 length, offset: 0x34 */\r\n  __IO uint32_t ELS_DMA_RES0;                      /**< ELS DMA Result 0, offset: 0x38 */\r\n  __IO uint32_t ELS_DMA_RES0_LEN;                  /**< ELS DMA Result 0 Size, offset: 0x3C */\r\n  __IO uint32_t ELS_INT_ENABLE;                    /**< Interrupt enable, offset: 0x40 */\r\n  __O  uint32_t ELS_INT_STATUS_CLR;                /**< Interrupt status clear, offset: 0x44 */\r\n  __O  uint32_t ELS_INT_STATUS_SET;                /**< Interrupt status set, offset: 0x48 */\r\n  __I  uint32_t ELS_ERR_STATUS;                    /**< Status register, offset: 0x4C */\r\n  __O  uint32_t ELS_ERR_STATUS_CLR;                /**< Interrupt status clear, offset: 0x50 */\r\n  __I  uint32_t ELS_VERSION;                       /**< ELS Version, offset: 0x54 */\r\n  __I  uint32_t ELS_CONFIG;                        /**< ELS Config, offset: 0x58 */\r\n  __I  uint32_t ELS_PRNG_DATOUT;                   /**< PRNG SW read out register, offset: 0x5C */\r\n  __I  uint32_t ELS_GDET_EVTCNT;                   /**< ELS GDET Event Counter, offset: 0x60 */\r\n  __O  uint32_t ELS_GDET_EVTCNT_CLR;               /**< ELS GDET Event Counter Clear, offset: 0x64 */\r\n       uint8_t RESERVED_2[152];\r\n  __I  uint32_t ELS_SHA2_STATUS;                   /**< ELS SHA2 Status Register, offset: 0x100 */\r\n  __IO uint32_t ELS_SHA2_CTRL;                     /**< SHA2 Control register, offset: 0x104 */\r\n  __IO uint32_t ELS_SHA2_DIN;                      /**< ELS SHA_DATA IN Register 0, offset: 0x108 */\r\n  __I  uint32_t ELS_SHA2_DOUT0;                    /**< ELS ELS_SHA_DATA Out Register 0, offset: 0x10C */\r\n  __I  uint32_t ELS_SHA2_DOUT1;                    /**< ELS SHA_DATA Out Register 1, offset: 0x110 */\r\n  __I  uint32_t ELS_SHA2_DOUT2;                    /**< ELS SHA_DATA Out Register 2, offset: 0x114 */\r\n  __I  uint32_t ELS_SHA2_DOUT3;                    /**< ELS SHA_DATA Out Register 3, offset: 0x118 */\r\n  __I  uint32_t ELS_SHA2_DOUT4;                    /**< ELS SHA_DATA Out Register 4, offset: 0x11C */\r\n  __I  uint32_t ELS_SHA2_DOUT5;                    /**< ELS SHA_DATA Out Register 5, offset: 0x120 */\r\n  __I  uint32_t ELS_SHA2_DOUT6;                    /**< ELS SHA_DATA Out Register 6, offset: 0x124 */\r\n  __I  uint32_t ELS_SHA2_DOUT7;                    /**< ELS SHA_DATA Out Register 7, offset: 0x128 */\r\n  __I  uint32_t ELS_SHA2_DOUT8;                    /**< ELS ELS_SHA_DATA Out Register 8, offset: 0x12C */\r\n  __I  uint32_t ELS_SHA2_DOUT9;                    /**< ELS SHA_DATA Out Register 9, offset: 0x130 */\r\n  __I  uint32_t ELS_SHA2_DOUT10;                   /**< ELS SHA_DATA Out Register 10, offset: 0x134 */\r\n  __I  uint32_t ELS_SHA2_DOUT11;                   /**< ELS SHA_DATA Out Register 11, offset: 0x138 */\r\n  __I  uint32_t ELS_SHA2_DOUT12;                   /**< ELS SHA_DATA Out Register 12, offset: 0x13C */\r\n  __I  uint32_t ELS_SHA2_DOUT13;                   /**< ELS SHA_DATA Out Register 13, offset: 0x140 */\r\n  __I  uint32_t ELS_SHA2_DOUT14;                   /**< ELS SHA_DATA Out Register 14, offset: 0x144 */\r\n  __I  uint32_t ELS_SHA2_DOUT15;                   /**< ELS SHA_DATA Out Register 15, offset: 0x148 */\r\n       uint8_t RESERVED_3[4];\r\n  __I  uint32_t ELS_KS0;                           /**< Status register, offset: 0x150 */\r\n  __I  uint32_t ELS_KS1;                           /**< Status register, offset: 0x154 */\r\n  __I  uint32_t ELS_KS2;                           /**< Status register, offset: 0x158 */\r\n  __I  uint32_t ELS_KS3;                           /**< Status register, offset: 0x15C */\r\n  __I  uint32_t ELS_KS4;                           /**< Status register, offset: 0x160 */\r\n  __I  uint32_t ELS_KS5;                           /**< Status register, offset: 0x164 */\r\n  __I  uint32_t ELS_KS6;                           /**< Status register, offset: 0x168 */\r\n  __I  uint32_t ELS_KS7;                           /**< Status register, offset: 0x16C */\r\n  __I  uint32_t ELS_KS8;                           /**< Status register, offset: 0x170 */\r\n  __I  uint32_t ELS_KS9;                           /**< Status register, offset: 0x174 */\r\n  __I  uint32_t ELS_KS10;                          /**< Status register, offset: 0x178 */\r\n  __I  uint32_t ELS_KS11;                          /**< Status register, offset: 0x17C */\r\n  __I  uint32_t ELS_KS12;                          /**< Status register, offset: 0x180 */\r\n  __I  uint32_t ELS_KS13;                          /**< Status register, offset: 0x184 */\r\n  __I  uint32_t ELS_KS14;                          /**< Status register, offset: 0x188 */\r\n  __I  uint32_t ELS_KS15;                          /**< Status register, offset: 0x18C */\r\n  __I  uint32_t ELS_KS16;                          /**< Status register, offset: 0x190 */\r\n  __I  uint32_t ELS_KS17;                          /**< Status register, offset: 0x194 */\r\n  __I  uint32_t ELS_KS18;                          /**< Status register, offset: 0x198 */\r\n  __I  uint32_t ELS_KS19;                          /**< Status register, offset: 0x19C */\r\n       uint8_t RESERVED_4[4];\r\n  __IO uint32_t ELS_BOOT_ADDR;                     /**< SW control for the ELS boot addr, offset: 0x1A4 */\r\n  __IO uint32_t ELS_DBG_CFG;                       /**< ELS Debug Config SFR, offset: 0x1A8 */\r\n} ELS_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- ELS Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup ELS_Register_Masks ELS Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name ELS_STATUS - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_STATUS_ELS_BUSY_MASK             (0x1U)\r\n#define ELS_ELS_STATUS_ELS_BUSY_SHIFT            (0U)\r\n/*! ELS_BUSY - High to indicate the ELS is executing a Crypto Sequence */\r\n#define ELS_ELS_STATUS_ELS_BUSY(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_STATUS_ELS_BUSY_SHIFT)) & ELS_ELS_STATUS_ELS_BUSY_MASK)\r\n\r\n#define ELS_ELS_STATUS_ELS_IRQ_MASK              (0x2U)\r\n#define ELS_ELS_STATUS_ELS_IRQ_SHIFT             (1U)\r\n/*! ELS_IRQ - High to indicate the ELS has an active interrupt */\r\n#define ELS_ELS_STATUS_ELS_IRQ(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_STATUS_ELS_IRQ_SHIFT)) & ELS_ELS_STATUS_ELS_IRQ_MASK)\r\n\r\n#define ELS_ELS_STATUS_ELS_ERR_MASK              (0x4U)\r\n#define ELS_ELS_STATUS_ELS_ERR_SHIFT             (2U)\r\n/*! ELS_ERR - High to indicate the ELS has detected an internal error */\r\n#define ELS_ELS_STATUS_ELS_ERR(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_STATUS_ELS_ERR_SHIFT)) & ELS_ELS_STATUS_ELS_ERR_MASK)\r\n\r\n#define ELS_ELS_STATUS_PRNG_RDY_MASK             (0x8U)\r\n#define ELS_ELS_STATUS_PRNG_RDY_SHIFT            (3U)\r\n/*! PRNG_RDY - High to indicate the internal PRNG is ready. */\r\n#define ELS_ELS_STATUS_PRNG_RDY(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_STATUS_PRNG_RDY_SHIFT)) & ELS_ELS_STATUS_PRNG_RDY_MASK)\r\n\r\n#define ELS_ELS_STATUS_ECDSA_VFY_STATUS_MASK     (0x30U)\r\n#define ELS_ELS_STATUS_ECDSA_VFY_STATUS_SHIFT    (4U)\r\n/*! ECDSA_VFY_STATUS - Signature Verify Result Status; 0 == No Verify Run; 1 == Signature Verify\r\n *    Failed; 2 == Signature Verify Passed; 3 == Invalid , Error\r\n */\r\n#define ELS_ELS_STATUS_ECDSA_VFY_STATUS(x)       (((uint32_t)(((uint32_t)(x)) << ELS_ELS_STATUS_ECDSA_VFY_STATUS_SHIFT)) & ELS_ELS_STATUS_ECDSA_VFY_STATUS_MASK)\r\n\r\n#define ELS_ELS_STATUS_PPROT_MASK                (0xC0U)\r\n#define ELS_ELS_STATUS_PPROT_SHIFT               (6U)\r\n/*! PPROT - Current command privilege level */\r\n#define ELS_ELS_STATUS_PPROT(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_STATUS_PPROT_SHIFT)) & ELS_ELS_STATUS_PPROT_MASK)\r\n\r\n#define ELS_ELS_STATUS_DRBG_ENT_LVL_MASK         (0x300U)\r\n#define ELS_ELS_STATUS_DRBG_ENT_LVL_SHIFT        (8U)\r\n/*! DRBG_ENT_LVL - Entropy quality of the current DRBG instance. */\r\n#define ELS_ELS_STATUS_DRBG_ENT_LVL(x)           (((uint32_t)(((uint32_t)(x)) << ELS_ELS_STATUS_DRBG_ENT_LVL_SHIFT)) & ELS_ELS_STATUS_DRBG_ENT_LVL_MASK)\r\n\r\n#define ELS_ELS_STATUS_DTRNG_BUSY_MASK           (0x400U)\r\n#define ELS_ELS_STATUS_DTRNG_BUSY_SHIFT          (10U)\r\n/*! DTRNG_BUSY - When set, it indicates the DTRNG is gathering entropy */\r\n#define ELS_ELS_STATUS_DTRNG_BUSY(x)             (((uint32_t)(((uint32_t)(x)) << ELS_ELS_STATUS_DTRNG_BUSY_SHIFT)) & ELS_ELS_STATUS_DTRNG_BUSY_MASK)\r\n\r\n#define ELS_ELS_STATUS_GDET_IRQ_POS_MASK         (0x800U)\r\n#define ELS_ELS_STATUS_GDET_IRQ_POS_SHIFT        (11U)\r\n/*! GDET_IRQ_POS - IRQ for GDET has detected a negative glitch: active high irq */\r\n#define ELS_ELS_STATUS_GDET_IRQ_POS(x)           (((uint32_t)(((uint32_t)(x)) << ELS_ELS_STATUS_GDET_IRQ_POS_SHIFT)) & ELS_ELS_STATUS_GDET_IRQ_POS_MASK)\r\n\r\n#define ELS_ELS_STATUS_GDET_IRQ_NEG_MASK         (0x1000U)\r\n#define ELS_ELS_STATUS_GDET_IRQ_NEG_SHIFT        (12U)\r\n/*! GDET_IRQ_NEG - IRQ for GDET has detected a positive glitch: active high irq */\r\n#define ELS_ELS_STATUS_GDET_IRQ_NEG(x)           (((uint32_t)(((uint32_t)(x)) << ELS_ELS_STATUS_GDET_IRQ_NEG_SHIFT)) & ELS_ELS_STATUS_GDET_IRQ_NEG_MASK)\r\n\r\n#define ELS_ELS_STATUS_STATUS_RSVD_MASK          (0xFFFFE000U)\r\n#define ELS_ELS_STATUS_STATUS_RSVD_SHIFT         (13U)\r\n#define ELS_ELS_STATUS_STATUS_RSVD(x)            (((uint32_t)(((uint32_t)(x)) << ELS_ELS_STATUS_STATUS_RSVD_SHIFT)) & ELS_ELS_STATUS_STATUS_RSVD_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_CTRL - ELS Control register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_CTRL_ELS_EN_MASK                 (0x1U)\r\n#define ELS_ELS_CTRL_ELS_EN_SHIFT                (0U)\r\n/*! ELS_EN - ELS enable 0=ELS disabled, 1= ELS is enabled */\r\n#define ELS_ELS_CTRL_ELS_EN(x)                   (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CTRL_ELS_EN_SHIFT)) & ELS_ELS_CTRL_ELS_EN_MASK)\r\n\r\n#define ELS_ELS_CTRL_ELS_START_MASK              (0x2U)\r\n#define ELS_ELS_CTRL_ELS_START_SHIFT             (1U)\r\n/*! ELS_START - Write to 1 to start a ELS Operation */\r\n#define ELS_ELS_CTRL_ELS_START(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CTRL_ELS_START_SHIFT)) & ELS_ELS_CTRL_ELS_START_MASK)\r\n\r\n#define ELS_ELS_CTRL_ELS_RESET_MASK              (0x4U)\r\n#define ELS_ELS_CTRL_ELS_RESET_SHIFT             (2U)\r\n/*! ELS_RESET - Write to 1 to perform a ELS synchronous Reset */\r\n#define ELS_ELS_CTRL_ELS_RESET(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CTRL_ELS_RESET_SHIFT)) & ELS_ELS_CTRL_ELS_RESET_MASK)\r\n\r\n#define ELS_ELS_CTRL_ELS_CMD_MASK                (0xF8U)\r\n#define ELS_ELS_CTRL_ELS_CMD_SHIFT               (3U)\r\n/*! ELS_CMD - ELS Command Field: List of Valid commands:; CIPHER; AUTH_CIPHER; ECSIGN; ECVFY;\r\n *    ECKXCH; KEYGEN; KEYIN; KEYOUT; KDELETE; KEYPROV; CKDF; HKDF; TLS_INIT; HASH; HMAC; CMAC; DRBG_REQ;\r\n *    DRBG_TEST; DTRNG_CFG_LOAD; DTRNG_EVAL; GDET_CFG_LOAD; GDET_TRIM\r\n */\r\n#define ELS_ELS_CTRL_ELS_CMD(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CTRL_ELS_CMD_SHIFT)) & ELS_ELS_CTRL_ELS_CMD_MASK)\r\n\r\n#define ELS_ELS_CTRL_BYTE_ORDER_MASK             (0x100U)\r\n#define ELS_ELS_CTRL_BYTE_ORDER_SHIFT            (8U)\r\n/*! BYTE_ORDER - Defines Endianness - 1: BigEndian, 0: Little Endian */\r\n#define ELS_ELS_CTRL_BYTE_ORDER(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CTRL_BYTE_ORDER_SHIFT)) & ELS_ELS_CTRL_BYTE_ORDER_MASK)\r\n\r\n#define ELS_ELS_CTRL_CTRL_RFU_MASK               (0xFFFFFE00U)\r\n#define ELS_ELS_CTRL_CTRL_RFU_SHIFT              (9U)\r\n/*! CTRL_RFU - reserved */\r\n#define ELS_ELS_CTRL_CTRL_RFU(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CTRL_CTRL_RFU_SHIFT)) & ELS_ELS_CTRL_CTRL_RFU_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_CMDCFG0 - ELS command configuration register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_CMDCFG0_CMDCFG0_MASK             (0xFFFFFFFFU)\r\n#define ELS_ELS_CMDCFG0_CMDCFG0_SHIFT            (0U)\r\n/*! CMDCFG0 - refer to reference manual for assignment of this field */\r\n#define ELS_ELS_CMDCFG0_CMDCFG0(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CMDCFG0_CMDCFG0_SHIFT)) & ELS_ELS_CMDCFG0_CMDCFG0_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_CFG - ELS configuration register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_CFG_CFG_RSVD0_MASK               (0xFFFFU)\r\n#define ELS_ELS_CFG_CFG_RSVD0_SHIFT              (0U)\r\n/*! CFG_RSVD0 - reserved */\r\n#define ELS_ELS_CFG_CFG_RSVD0(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CFG_CFG_RSVD0_SHIFT)) & ELS_ELS_CFG_CFG_RSVD0_MASK)\r\n\r\n#define ELS_ELS_CFG_ADCTRL_MASK                  (0x3FF0000U)\r\n#define ELS_ELS_CFG_ADCTRL_SHIFT                 (16U)\r\n/*! ADCTRL - maximum aes start delay */\r\n#define ELS_ELS_CFG_ADCTRL(x)                    (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CFG_ADCTRL_SHIFT)) & ELS_ELS_CFG_ADCTRL_MASK)\r\n\r\n#define ELS_ELS_CFG_CFG_RSVD1_MASK               (0x7C000000U)\r\n#define ELS_ELS_CFG_CFG_RSVD1_SHIFT              (26U)\r\n/*! CFG_RSVD1 - reserved */\r\n#define ELS_ELS_CFG_CFG_RSVD1(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CFG_CFG_RSVD1_SHIFT)) & ELS_ELS_CFG_CFG_RSVD1_MASK)\r\n\r\n#define ELS_ELS_CFG_SHA2_DIRECT_MASK             (0x80000000U)\r\n#define ELS_ELS_CFG_SHA2_DIRECT_SHIFT            (31U)\r\n/*! SHA2_DIRECT - 1=enable sha2 direct mode: direct access from external; bus to els internal sha */\r\n#define ELS_ELS_CFG_SHA2_DIRECT(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CFG_SHA2_DIRECT_SHIFT)) & ELS_ELS_CFG_SHA2_DIRECT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KIDX0 - Keystore index 0 - for commands that access a single key */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KIDX0_KIDX0_MASK                 (0x7FU)\r\n#define ELS_ELS_KIDX0_KIDX0_SHIFT                (0U)\r\n/*! KIDX0 - keystore is indexed as an array of 128 bit key slots */\r\n#define ELS_ELS_KIDX0_KIDX0(x)                   (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KIDX0_KIDX0_SHIFT)) & ELS_ELS_KIDX0_KIDX0_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KIDX1 - Keystore index 1 - for commands that access 2 keys */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KIDX1_KIDX1_MASK                 (0x7FU)\r\n#define ELS_ELS_KIDX1_KIDX1_SHIFT                (0U)\r\n/*! KIDX1 - keystore is indexed as an array of 128 bit key slots */\r\n#define ELS_ELS_KIDX1_KIDX1(x)                   (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KIDX1_KIDX1_SHIFT)) & ELS_ELS_KIDX1_KIDX1_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KPROPIN - key properties request */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KPROPIN_KPROPIN_MASK             (0xFFFFFFFFU)\r\n#define ELS_ELS_KPROPIN_KPROPIN_SHIFT            (0U)\r\n/*! KPROPIN - for commands that create a key - requested properties; of the key that is being created */\r\n#define ELS_ELS_KPROPIN_KPROPIN(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KPROPIN_KPROPIN_SHIFT)) & ELS_ELS_KPROPIN_KPROPIN_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_DMA_SRC0 - ELS DMA Source 0 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_DMA_SRC0_ADDR_SRC0_MASK          (0xFFFFFFFFU)\r\n#define ELS_ELS_DMA_SRC0_ADDR_SRC0_SHIFT         (0U)\r\n/*! ADDR_SRC0 - defines the System address of the start of the; data to be transferred to the ELS via DMA */\r\n#define ELS_ELS_DMA_SRC0_ADDR_SRC0(x)            (((uint32_t)(((uint32_t)(x)) << ELS_ELS_DMA_SRC0_ADDR_SRC0_SHIFT)) & ELS_ELS_DMA_SRC0_ADDR_SRC0_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_DMA_SRC0_LEN - ELS DMA Source 0 length */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_DMA_SRC0_LEN_SIZE_SRC0_LEN_MASK  (0xFFFFFFFFU)\r\n#define ELS_ELS_DMA_SRC0_LEN_SIZE_SRC0_LEN_SHIFT (0U)\r\n/*! SIZE_SRC0_LEN - Size in bytes of the data to be transferred from; the target defined in SFR ELS_DMA_SRC0 */\r\n#define ELS_ELS_DMA_SRC0_LEN_SIZE_SRC0_LEN(x)    (((uint32_t)(((uint32_t)(x)) << ELS_ELS_DMA_SRC0_LEN_SIZE_SRC0_LEN_SHIFT)) & ELS_ELS_DMA_SRC0_LEN_SIZE_SRC0_LEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_DMA_SRC1 - ELS DMA Source 1 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_DMA_SRC1_ADDR_SRC1_MASK          (0xFFFFFFFFU)\r\n#define ELS_ELS_DMA_SRC1_ADDR_SRC1_SHIFT         (0U)\r\n/*! ADDR_SRC1 - defines the System address of the start of the; data to be transferred to the ELS via DMA */\r\n#define ELS_ELS_DMA_SRC1_ADDR_SRC1(x)            (((uint32_t)(((uint32_t)(x)) << ELS_ELS_DMA_SRC1_ADDR_SRC1_SHIFT)) & ELS_ELS_DMA_SRC1_ADDR_SRC1_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_DMA_SRC2 - ELS DMA Source 2 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_DMA_SRC2_ADDR_SRC2_MASK          (0xFFFFFFFFU)\r\n#define ELS_ELS_DMA_SRC2_ADDR_SRC2_SHIFT         (0U)\r\n/*! ADDR_SRC2 - defines the System address of the start of the; data to be transferred to the ELS via DMA */\r\n#define ELS_ELS_DMA_SRC2_ADDR_SRC2(x)            (((uint32_t)(((uint32_t)(x)) << ELS_ELS_DMA_SRC2_ADDR_SRC2_SHIFT)) & ELS_ELS_DMA_SRC2_ADDR_SRC2_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_DMA_SRC2_LEN - ELS DMA Source 2 length */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_DMA_SRC2_LEN_SIZE_SRC2_LEN_MASK  (0xFFFFFFFFU)\r\n#define ELS_ELS_DMA_SRC2_LEN_SIZE_SRC2_LEN_SHIFT (0U)\r\n/*! SIZE_SRC2_LEN - Size in bytes of the data to be transferred from; the target defined in SFR ELS_DMA_SRC2 */\r\n#define ELS_ELS_DMA_SRC2_LEN_SIZE_SRC2_LEN(x)    (((uint32_t)(((uint32_t)(x)) << ELS_ELS_DMA_SRC2_LEN_SIZE_SRC2_LEN_SHIFT)) & ELS_ELS_DMA_SRC2_LEN_SIZE_SRC2_LEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_DMA_RES0 - ELS DMA Result 0 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_DMA_RES0_ADDR_RES0_MASK          (0xFFFFFFFFU)\r\n#define ELS_ELS_DMA_RES0_ADDR_RES0_SHIFT         (0U)\r\n/*! ADDR_RES0 - defines the System Start address of where the result; of the ELS operation will be transferred via DMA */\r\n#define ELS_ELS_DMA_RES0_ADDR_RES0(x)            (((uint32_t)(((uint32_t)(x)) << ELS_ELS_DMA_RES0_ADDR_RES0_SHIFT)) & ELS_ELS_DMA_RES0_ADDR_RES0_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_DMA_RES0_LEN - ELS DMA Result 0 Size */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_DMA_RES0_LEN_SIZE_RES0_LEN_MASK  (0xFFFFFFFFU)\r\n#define ELS_ELS_DMA_RES0_LEN_SIZE_RES0_LEN_SHIFT (0U)\r\n/*! SIZE_RES0_LEN - Size in bytes of the data to be transferred to */\r\n#define ELS_ELS_DMA_RES0_LEN_SIZE_RES0_LEN(x)    (((uint32_t)(((uint32_t)(x)) << ELS_ELS_DMA_RES0_LEN_SIZE_RES0_LEN_SHIFT)) & ELS_ELS_DMA_RES0_LEN_SIZE_RES0_LEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_INT_ENABLE - Interrupt enable */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_INT_ENABLE_INT_EN_MASK           (0x1U)\r\n#define ELS_ELS_INT_ENABLE_INT_EN_SHIFT          (0U)\r\n/*! INT_EN - Interrupt enable bit */\r\n#define ELS_ELS_INT_ENABLE_INT_EN(x)             (((uint32_t)(((uint32_t)(x)) << ELS_ELS_INT_ENABLE_INT_EN_SHIFT)) & ELS_ELS_INT_ENABLE_INT_EN_MASK)\r\n\r\n#define ELS_ELS_INT_ENABLE_GDET_INT_EN_MASK      (0x2U)\r\n#define ELS_ELS_INT_ENABLE_GDET_INT_EN_SHIFT     (1U)\r\n/*! GDET_INT_EN - GDET Interrupt enable bit */\r\n#define ELS_ELS_INT_ENABLE_GDET_INT_EN(x)        (((uint32_t)(((uint32_t)(x)) << ELS_ELS_INT_ENABLE_GDET_INT_EN_SHIFT)) & ELS_ELS_INT_ENABLE_GDET_INT_EN_MASK)\r\n\r\n#define ELS_ELS_INT_ENABLE_INT_ENA_RSVD_MASK     (0xFFFFFFFCU)\r\n#define ELS_ELS_INT_ENABLE_INT_ENA_RSVD_SHIFT    (2U)\r\n/*! INT_ENA_RSVD - reserved */\r\n#define ELS_ELS_INT_ENABLE_INT_ENA_RSVD(x)       (((uint32_t)(((uint32_t)(x)) << ELS_ELS_INT_ENABLE_INT_ENA_RSVD_SHIFT)) & ELS_ELS_INT_ENABLE_INT_ENA_RSVD_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_INT_STATUS_CLR - Interrupt status clear */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_INT_STATUS_CLR_INT_CLR_MASK      (0x1U)\r\n#define ELS_ELS_INT_STATUS_CLR_INT_CLR_SHIFT     (0U)\r\n/*! INT_CLR - Interrupt status clear */\r\n#define ELS_ELS_INT_STATUS_CLR_INT_CLR(x)        (((uint32_t)(((uint32_t)(x)) << ELS_ELS_INT_STATUS_CLR_INT_CLR_SHIFT)) & ELS_ELS_INT_STATUS_CLR_INT_CLR_MASK)\r\n\r\n#define ELS_ELS_INT_STATUS_CLR_GDET_INT_CLR_MASK (0x2U)\r\n#define ELS_ELS_INT_STATUS_CLR_GDET_INT_CLR_SHIFT (1U)\r\n/*! GDET_INT_CLR - GDET Interrupt status clear */\r\n#define ELS_ELS_INT_STATUS_CLR_GDET_INT_CLR(x)   (((uint32_t)(((uint32_t)(x)) << ELS_ELS_INT_STATUS_CLR_GDET_INT_CLR_SHIFT)) & ELS_ELS_INT_STATUS_CLR_GDET_INT_CLR_MASK)\r\n\r\n#define ELS_ELS_INT_STATUS_CLR_INT_STSC_RSVD_MASK (0xFFFFFFFCU)\r\n#define ELS_ELS_INT_STATUS_CLR_INT_STSC_RSVD_SHIFT (2U)\r\n/*! INT_STSC_RSVD - reserved */\r\n#define ELS_ELS_INT_STATUS_CLR_INT_STSC_RSVD(x)  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_INT_STATUS_CLR_INT_STSC_RSVD_SHIFT)) & ELS_ELS_INT_STATUS_CLR_INT_STSC_RSVD_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_INT_STATUS_SET - Interrupt status set */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_INT_STATUS_SET_INT_SET_MASK      (0x1U)\r\n#define ELS_ELS_INT_STATUS_SET_INT_SET_SHIFT     (0U)\r\n/*! INT_SET - Set interrupt by software */\r\n#define ELS_ELS_INT_STATUS_SET_INT_SET(x)        (((uint32_t)(((uint32_t)(x)) << ELS_ELS_INT_STATUS_SET_INT_SET_SHIFT)) & ELS_ELS_INT_STATUS_SET_INT_SET_MASK)\r\n\r\n#define ELS_ELS_INT_STATUS_SET_GDET_INT_NEG_SET_MASK (0x2U)\r\n#define ELS_ELS_INT_STATUS_SET_GDET_INT_NEG_SET_SHIFT (1U)\r\n/*! GDET_INT_NEG_SET - Set GDET interrupt by software */\r\n#define ELS_ELS_INT_STATUS_SET_GDET_INT_NEG_SET(x) (((uint32_t)(((uint32_t)(x)) << ELS_ELS_INT_STATUS_SET_GDET_INT_NEG_SET_SHIFT)) & ELS_ELS_INT_STATUS_SET_GDET_INT_NEG_SET_MASK)\r\n\r\n#define ELS_ELS_INT_STATUS_SET_GDET_INT_POS_SET_MASK (0x4U)\r\n#define ELS_ELS_INT_STATUS_SET_GDET_INT_POS_SET_SHIFT (2U)\r\n/*! GDET_INT_POS_SET - Set GDET interrupt by software */\r\n#define ELS_ELS_INT_STATUS_SET_GDET_INT_POS_SET(x) (((uint32_t)(((uint32_t)(x)) << ELS_ELS_INT_STATUS_SET_GDET_INT_POS_SET_SHIFT)) & ELS_ELS_INT_STATUS_SET_GDET_INT_POS_SET_MASK)\r\n\r\n#define ELS_ELS_INT_STATUS_SET_INT_STSS_RSVD_MASK (0xFFFFFFF8U)\r\n#define ELS_ELS_INT_STATUS_SET_INT_STSS_RSVD_SHIFT (3U)\r\n/*! INT_STSS_RSVD - reserved */\r\n#define ELS_ELS_INT_STATUS_SET_INT_STSS_RSVD(x)  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_INT_STATUS_SET_INT_STSS_RSVD_SHIFT)) & ELS_ELS_INT_STATUS_SET_INT_STSS_RSVD_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_ERR_STATUS - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_ERR_STATUS_BUS_ERR_MASK          (0x1U)\r\n#define ELS_ELS_ERR_STATUS_BUS_ERR_SHIFT         (0U)\r\n/*! BUS_ERR - Bus access error: public or private bus */\r\n#define ELS_ELS_ERR_STATUS_BUS_ERR(x)            (((uint32_t)(((uint32_t)(x)) << ELS_ELS_ERR_STATUS_BUS_ERR_SHIFT)) & ELS_ELS_ERR_STATUS_BUS_ERR_MASK)\r\n\r\n#define ELS_ELS_ERR_STATUS_OPN_ERR_MASK          (0x2U)\r\n#define ELS_ELS_ERR_STATUS_OPN_ERR_SHIFT         (1U)\r\n/*! OPN_ERR - Operational error:; ELS has been incorrectly operated */\r\n#define ELS_ELS_ERR_STATUS_OPN_ERR(x)            (((uint32_t)(((uint32_t)(x)) << ELS_ELS_ERR_STATUS_OPN_ERR_SHIFT)) & ELS_ELS_ERR_STATUS_OPN_ERR_MASK)\r\n\r\n#define ELS_ELS_ERR_STATUS_ALG_ERR_MASK          (0x4U)\r\n#define ELS_ELS_ERR_STATUS_ALG_ERR_SHIFT         (2U)\r\n/*! ALG_ERR - Algorithm error: An internal algorithm has; produced an unexpected result. */\r\n#define ELS_ELS_ERR_STATUS_ALG_ERR(x)            (((uint32_t)(((uint32_t)(x)) << ELS_ELS_ERR_STATUS_ALG_ERR_SHIFT)) & ELS_ELS_ERR_STATUS_ALG_ERR_MASK)\r\n\r\n#define ELS_ELS_ERR_STATUS_ITG_ERR_MASK          (0x8U)\r\n#define ELS_ELS_ERR_STATUS_ITG_ERR_SHIFT         (3U)\r\n/*! ITG_ERR - Data integrity error:; Internal data integrity check failed */\r\n#define ELS_ELS_ERR_STATUS_ITG_ERR(x)            (((uint32_t)(((uint32_t)(x)) << ELS_ELS_ERR_STATUS_ITG_ERR_SHIFT)) & ELS_ELS_ERR_STATUS_ITG_ERR_MASK)\r\n\r\n#define ELS_ELS_ERR_STATUS_FLT_ERR_MASK          (0x10U)\r\n#define ELS_ELS_ERR_STATUS_FLT_ERR_SHIFT         (4U)\r\n/*! FLT_ERR - Hardware fault error: Attempt to change the value; of an internal register */\r\n#define ELS_ELS_ERR_STATUS_FLT_ERR(x)            (((uint32_t)(((uint32_t)(x)) << ELS_ELS_ERR_STATUS_FLT_ERR_SHIFT)) & ELS_ELS_ERR_STATUS_FLT_ERR_MASK)\r\n\r\n#define ELS_ELS_ERR_STATUS_PRNG_ERR_MASK         (0x20U)\r\n#define ELS_ELS_ERR_STATUS_PRNG_ERR_SHIFT        (5U)\r\n/*! PRNG_ERR - User Read of ELS_PRNG_DATOUT when ELS_STATUS. */\r\n#define ELS_ELS_ERR_STATUS_PRNG_ERR(x)           (((uint32_t)(((uint32_t)(x)) << ELS_ELS_ERR_STATUS_PRNG_ERR_SHIFT)) & ELS_ELS_ERR_STATUS_PRNG_ERR_MASK)\r\n\r\n#define ELS_ELS_ERR_STATUS_ERR_LVL_MASK          (0xC0U)\r\n#define ELS_ELS_ERR_STATUS_ERR_LVL_SHIFT         (6U)\r\n/*! ERR_LVL - Indicates Error Level which has been triggerer. */\r\n#define ELS_ELS_ERR_STATUS_ERR_LVL(x)            (((uint32_t)(((uint32_t)(x)) << ELS_ELS_ERR_STATUS_ERR_LVL_SHIFT)) & ELS_ELS_ERR_STATUS_ERR_LVL_MASK)\r\n\r\n#define ELS_ELS_ERR_STATUS_DTRNG_ERR_MASK        (0x100U)\r\n#define ELS_ELS_ERR_STATUS_DTRNG_ERR_SHIFT       (8U)\r\n/*! DTRNG_ERR - DTRNG unable to gather entropy with the current; configuration. */\r\n#define ELS_ELS_ERR_STATUS_DTRNG_ERR(x)          (((uint32_t)(((uint32_t)(x)) << ELS_ELS_ERR_STATUS_DTRNG_ERR_SHIFT)) & ELS_ELS_ERR_STATUS_DTRNG_ERR_MASK)\r\n\r\n#define ELS_ELS_ERR_STATUS_ERR_STAT_RSVD_MASK    (0xFFFFFE00U)\r\n#define ELS_ELS_ERR_STATUS_ERR_STAT_RSVD_SHIFT   (9U)\r\n#define ELS_ELS_ERR_STATUS_ERR_STAT_RSVD(x)      (((uint32_t)(((uint32_t)(x)) << ELS_ELS_ERR_STATUS_ERR_STAT_RSVD_SHIFT)) & ELS_ELS_ERR_STATUS_ERR_STAT_RSVD_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_ERR_STATUS_CLR - Interrupt status clear */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_ERR_STATUS_CLR_ERR_CLR_MASK      (0x1U)\r\n#define ELS_ELS_ERR_STATUS_CLR_ERR_CLR_SHIFT     (0U)\r\n/*! ERR_CLR - 1=clear ELS error status bits and exit ELS error state */\r\n#define ELS_ELS_ERR_STATUS_CLR_ERR_CLR(x)        (((uint32_t)(((uint32_t)(x)) << ELS_ELS_ERR_STATUS_CLR_ERR_CLR_SHIFT)) & ELS_ELS_ERR_STATUS_CLR_ERR_CLR_MASK)\r\n\r\n#define ELS_ELS_ERR_STATUS_CLR_ERR_STSC_RSVD_MASK (0xFFFFFFFEU)\r\n#define ELS_ELS_ERR_STATUS_CLR_ERR_STSC_RSVD_SHIFT (1U)\r\n/*! ERR_STSC_RSVD - reserved */\r\n#define ELS_ELS_ERR_STATUS_CLR_ERR_STSC_RSVD(x)  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_ERR_STATUS_CLR_ERR_STSC_RSVD_SHIFT)) & ELS_ELS_ERR_STATUS_CLR_ERR_STSC_RSVD_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_VERSION - ELS Version */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_VERSION_Z_MASK                   (0xFU)\r\n#define ELS_ELS_VERSION_Z_SHIFT                  (0U)\r\n/*! Z - extended revision version: possible values 0-9 */\r\n#define ELS_ELS_VERSION_Z(x)                     (((uint32_t)(((uint32_t)(x)) << ELS_ELS_VERSION_Z_SHIFT)) & ELS_ELS_VERSION_Z_MASK)\r\n\r\n#define ELS_ELS_VERSION_Y2_MASK                  (0xF0U)\r\n#define ELS_ELS_VERSION_Y2_SHIFT                 (4U)\r\n/*! Y2 - minor release version digit0: possible values 0-9 */\r\n#define ELS_ELS_VERSION_Y2(x)                    (((uint32_t)(((uint32_t)(x)) << ELS_ELS_VERSION_Y2_SHIFT)) & ELS_ELS_VERSION_Y2_MASK)\r\n\r\n#define ELS_ELS_VERSION_Y1_MASK                  (0xF00U)\r\n#define ELS_ELS_VERSION_Y1_SHIFT                 (8U)\r\n/*! Y1 - minor release version digit1: possible values 0-9 */\r\n#define ELS_ELS_VERSION_Y1(x)                    (((uint32_t)(((uint32_t)(x)) << ELS_ELS_VERSION_Y1_SHIFT)) & ELS_ELS_VERSION_Y1_MASK)\r\n\r\n#define ELS_ELS_VERSION_X_MASK                   (0xF000U)\r\n#define ELS_ELS_VERSION_X_SHIFT                  (12U)\r\n/*! X - major release version: possible values 1-9 */\r\n#define ELS_ELS_VERSION_X(x)                     (((uint32_t)(((uint32_t)(x)) << ELS_ELS_VERSION_X_SHIFT)) & ELS_ELS_VERSION_X_MASK)\r\n\r\n#define ELS_ELS_VERSION_SW_Z_MASK                (0xF0000U)\r\n#define ELS_ELS_VERSION_SW_Z_SHIFT               (16U)\r\n/*! SW_Z - software extended revision version: possible values 0-9 */\r\n#define ELS_ELS_VERSION_SW_Z(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_VERSION_SW_Z_SHIFT)) & ELS_ELS_VERSION_SW_Z_MASK)\r\n\r\n#define ELS_ELS_VERSION_SW_Y2_MASK               (0xF00000U)\r\n#define ELS_ELS_VERSION_SW_Y2_SHIFT              (20U)\r\n/*! SW_Y2 - software minor release version digit0: possible values 0-9 */\r\n#define ELS_ELS_VERSION_SW_Y2(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_VERSION_SW_Y2_SHIFT)) & ELS_ELS_VERSION_SW_Y2_MASK)\r\n\r\n#define ELS_ELS_VERSION_SW_Y1_MASK               (0xF000000U)\r\n#define ELS_ELS_VERSION_SW_Y1_SHIFT              (24U)\r\n/*! SW_Y1 - software minor release version digit1: possible values 0-9 */\r\n#define ELS_ELS_VERSION_SW_Y1(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_VERSION_SW_Y1_SHIFT)) & ELS_ELS_VERSION_SW_Y1_MASK)\r\n\r\n#define ELS_ELS_VERSION_SW_X_MASK                (0xF0000000U)\r\n#define ELS_ELS_VERSION_SW_X_SHIFT               (28U)\r\n/*! SW_X - software major release version: possible values 1-9 */\r\n#define ELS_ELS_VERSION_SW_X(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_VERSION_SW_X_SHIFT)) & ELS_ELS_VERSION_SW_X_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_CONFIG - ELS Config */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_CONFIG_CIPHER_SUP_MASK           (0x1U)\r\n#define ELS_ELS_CONFIG_CIPHER_SUP_SHIFT          (0U)\r\n/*! CIPHER_SUP - cipher command is supported */\r\n#define ELS_ELS_CONFIG_CIPHER_SUP(x)             (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_CIPHER_SUP_SHIFT)) & ELS_ELS_CONFIG_CIPHER_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_AUTH_CIPHER_SUP_MASK      (0x2U)\r\n#define ELS_ELS_CONFIG_AUTH_CIPHER_SUP_SHIFT     (1U)\r\n/*! AUTH_CIPHER_SUP - auth_cipher command is supported */\r\n#define ELS_ELS_CONFIG_AUTH_CIPHER_SUP(x)        (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_AUTH_CIPHER_SUP_SHIFT)) & ELS_ELS_CONFIG_AUTH_CIPHER_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_ECSIGN_SUP_MASK           (0x4U)\r\n#define ELS_ELS_CONFIG_ECSIGN_SUP_SHIFT          (2U)\r\n/*! ECSIGN_SUP - ecsign command is supported */\r\n#define ELS_ELS_CONFIG_ECSIGN_SUP(x)             (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_ECSIGN_SUP_SHIFT)) & ELS_ELS_CONFIG_ECSIGN_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_ECVFY_SUP_MASK            (0x8U)\r\n#define ELS_ELS_CONFIG_ECVFY_SUP_SHIFT           (3U)\r\n/*! ECVFY_SUP - ecvfy command is supported */\r\n#define ELS_ELS_CONFIG_ECVFY_SUP(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_ECVFY_SUP_SHIFT)) & ELS_ELS_CONFIG_ECVFY_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_ECKXCH_SUP_MASK           (0x10U)\r\n#define ELS_ELS_CONFIG_ECKXCH_SUP_SHIFT          (4U)\r\n/*! ECKXCH_SUP - dhkey_xch command is supported */\r\n#define ELS_ELS_CONFIG_ECKXCH_SUP(x)             (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_ECKXCH_SUP_SHIFT)) & ELS_ELS_CONFIG_ECKXCH_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_KEYGEN_SUP_MASK           (0x20U)\r\n#define ELS_ELS_CONFIG_KEYGEN_SUP_SHIFT          (5U)\r\n/*! KEYGEN_SUP - keygen command is supported */\r\n#define ELS_ELS_CONFIG_KEYGEN_SUP(x)             (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_KEYGEN_SUP_SHIFT)) & ELS_ELS_CONFIG_KEYGEN_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_KEYIN_SUP_MASK            (0x40U)\r\n#define ELS_ELS_CONFIG_KEYIN_SUP_SHIFT           (6U)\r\n/*! KEYIN_SUP - keyin command is supported */\r\n#define ELS_ELS_CONFIG_KEYIN_SUP(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_KEYIN_SUP_SHIFT)) & ELS_ELS_CONFIG_KEYIN_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_KEYOUT_SUP_MASK           (0x80U)\r\n#define ELS_ELS_CONFIG_KEYOUT_SUP_SHIFT          (7U)\r\n/*! KEYOUT_SUP - keyout command is supported */\r\n#define ELS_ELS_CONFIG_KEYOUT_SUP(x)             (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_KEYOUT_SUP_SHIFT)) & ELS_ELS_CONFIG_KEYOUT_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_KDELETE_SUP_MASK          (0x100U)\r\n#define ELS_ELS_CONFIG_KDELETE_SUP_SHIFT         (8U)\r\n/*! KDELETE_SUP - kdelete command is supported */\r\n#define ELS_ELS_CONFIG_KDELETE_SUP(x)            (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_KDELETE_SUP_SHIFT)) & ELS_ELS_CONFIG_KDELETE_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_KEYPROV_SUP_MASK          (0x200U)\r\n#define ELS_ELS_CONFIG_KEYPROV_SUP_SHIFT         (9U)\r\n/*! KEYPROV_SUP - keyprov command is supported */\r\n#define ELS_ELS_CONFIG_KEYPROV_SUP(x)            (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_KEYPROV_SUP_SHIFT)) & ELS_ELS_CONFIG_KEYPROV_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_CKDF_SUP_MASK             (0x400U)\r\n#define ELS_ELS_CONFIG_CKDF_SUP_SHIFT            (10U)\r\n/*! CKDF_SUP - ckdf command is supported */\r\n#define ELS_ELS_CONFIG_CKDF_SUP(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_CKDF_SUP_SHIFT)) & ELS_ELS_CONFIG_CKDF_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_HKDF_SUP_MASK             (0x800U)\r\n#define ELS_ELS_CONFIG_HKDF_SUP_SHIFT            (11U)\r\n/*! HKDF_SUP - hkdf command is supported */\r\n#define ELS_ELS_CONFIG_HKDF_SUP(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_HKDF_SUP_SHIFT)) & ELS_ELS_CONFIG_HKDF_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_TLS_INIT_SUP_MASK         (0x1000U)\r\n#define ELS_ELS_CONFIG_TLS_INIT_SUP_SHIFT        (12U)\r\n/*! TLS_INIT_SUP - tls_init command is supported */\r\n#define ELS_ELS_CONFIG_TLS_INIT_SUP(x)           (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_TLS_INIT_SUP_SHIFT)) & ELS_ELS_CONFIG_TLS_INIT_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_HASH_SUP_MASK             (0x2000U)\r\n#define ELS_ELS_CONFIG_HASH_SUP_SHIFT            (13U)\r\n/*! HASH_SUP - hash command is supported */\r\n#define ELS_ELS_CONFIG_HASH_SUP(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_HASH_SUP_SHIFT)) & ELS_ELS_CONFIG_HASH_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_HMAC_SUP_MASK             (0x4000U)\r\n#define ELS_ELS_CONFIG_HMAC_SUP_SHIFT            (14U)\r\n/*! HMAC_SUP - hmac command is supported */\r\n#define ELS_ELS_CONFIG_HMAC_SUP(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_HMAC_SUP_SHIFT)) & ELS_ELS_CONFIG_HMAC_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_CMAC_SUP_MASK             (0x8000U)\r\n#define ELS_ELS_CONFIG_CMAC_SUP_SHIFT            (15U)\r\n/*! CMAC_SUP - cmac command is supported */\r\n#define ELS_ELS_CONFIG_CMAC_SUP(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_CMAC_SUP_SHIFT)) & ELS_ELS_CONFIG_CMAC_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_DRBG_REQ_SUP_MASK         (0x10000U)\r\n#define ELS_ELS_CONFIG_DRBG_REQ_SUP_SHIFT        (16U)\r\n/*! DRBG_REQ_SUP - drbg_req command is supported */\r\n#define ELS_ELS_CONFIG_DRBG_REQ_SUP(x)           (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_DRBG_REQ_SUP_SHIFT)) & ELS_ELS_CONFIG_DRBG_REQ_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_DRBG_TEST_SUP_MASK        (0x20000U)\r\n#define ELS_ELS_CONFIG_DRBG_TEST_SUP_SHIFT       (17U)\r\n/*! DRBG_TEST_SUP - drbg_test command is supported */\r\n#define ELS_ELS_CONFIG_DRBG_TEST_SUP(x)          (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_DRBG_TEST_SUP_SHIFT)) & ELS_ELS_CONFIG_DRBG_TEST_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_DTRNG_CFG_LOAD_SUP_MASK   (0x40000U)\r\n#define ELS_ELS_CONFIG_DTRNG_CFG_LOAD_SUP_SHIFT  (18U)\r\n/*! DTRNG_CFG_LOAD_SUP - dtrng_cfg_load command is supported */\r\n#define ELS_ELS_CONFIG_DTRNG_CFG_LOAD_SUP(x)     (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_DTRNG_CFG_LOAD_SUP_SHIFT)) & ELS_ELS_CONFIG_DTRNG_CFG_LOAD_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_DTRNG_EVAL_SUP_MASK       (0x80000U)\r\n#define ELS_ELS_CONFIG_DTRNG_EVAL_SUP_SHIFT      (19U)\r\n/*! DTRNG_EVAL_SUP - dtrng_eval command is supported */\r\n#define ELS_ELS_CONFIG_DTRNG_EVAL_SUP(x)         (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_DTRNG_EVAL_SUP_SHIFT)) & ELS_ELS_CONFIG_DTRNG_EVAL_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_GDET_CFG_LOAD_SUP_MASK    (0x100000U)\r\n#define ELS_ELS_CONFIG_GDET_CFG_LOAD_SUP_SHIFT   (20U)\r\n/*! GDET_CFG_LOAD_SUP - gdet_cfg_load command is supported */\r\n#define ELS_ELS_CONFIG_GDET_CFG_LOAD_SUP(x)      (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_GDET_CFG_LOAD_SUP_SHIFT)) & ELS_ELS_CONFIG_GDET_CFG_LOAD_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_GDET_TRIM_SUP_MASK        (0x200000U)\r\n#define ELS_ELS_CONFIG_GDET_TRIM_SUP_SHIFT       (21U)\r\n/*! GDET_TRIM_SUP - gdet_trim command is supported */\r\n#define ELS_ELS_CONFIG_GDET_TRIM_SUP(x)          (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_GDET_TRIM_SUP_SHIFT)) & ELS_ELS_CONFIG_GDET_TRIM_SUP_MASK)\r\n\r\n#define ELS_ELS_CONFIG_CONFIG_RSVD_MASK          (0xFFC00000U)\r\n#define ELS_ELS_CONFIG_CONFIG_RSVD_SHIFT         (22U)\r\n/*! CONFIG_RSVD - reserved */\r\n#define ELS_ELS_CONFIG_CONFIG_RSVD(x)            (((uint32_t)(((uint32_t)(x)) << ELS_ELS_CONFIG_CONFIG_RSVD_SHIFT)) & ELS_ELS_CONFIG_CONFIG_RSVD_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_PRNG_DATOUT - PRNG SW read out register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_PRNG_DATOUT_PRNG_DATOUT_MASK     (0xFFFFFFFFU)\r\n#define ELS_ELS_PRNG_DATOUT_PRNG_DATOUT_SHIFT    (0U)\r\n/*! PRNG_DATOUT - 32-bit wide pseudo-random number */\r\n#define ELS_ELS_PRNG_DATOUT_PRNG_DATOUT(x)       (((uint32_t)(((uint32_t)(x)) << ELS_ELS_PRNG_DATOUT_PRNG_DATOUT_SHIFT)) & ELS_ELS_PRNG_DATOUT_PRNG_DATOUT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_GDET_EVTCNT - ELS GDET Event Counter */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_GDET_EVTCNT_GDET_EVTCNT_MASK     (0xFFU)\r\n#define ELS_ELS_GDET_EVTCNT_GDET_EVTCNT_SHIFT    (0U)\r\n/*! GDET_EVTCNT - Number of glitch event recorded */\r\n#define ELS_ELS_GDET_EVTCNT_GDET_EVTCNT(x)       (((uint32_t)(((uint32_t)(x)) << ELS_ELS_GDET_EVTCNT_GDET_EVTCNT_SHIFT)) & ELS_ELS_GDET_EVTCNT_GDET_EVTCNT_MASK)\r\n\r\n#define ELS_ELS_GDET_EVTCNT_GDET_EVTCNT_CLR_DONE_MASK (0x100U)\r\n#define ELS_ELS_GDET_EVTCNT_GDET_EVTCNT_CLR_DONE_SHIFT (8U)\r\n/*! GDET_EVTCNT_CLR_DONE - The GDET event counter has been cleared */\r\n#define ELS_ELS_GDET_EVTCNT_GDET_EVTCNT_CLR_DONE(x) (((uint32_t)(((uint32_t)(x)) << ELS_ELS_GDET_EVTCNT_GDET_EVTCNT_CLR_DONE_SHIFT)) & ELS_ELS_GDET_EVTCNT_GDET_EVTCNT_CLR_DONE_MASK)\r\n\r\n#define ELS_ELS_GDET_EVTCNT_GDET_EVTCNT_RSVD_MASK (0xFFFFFE00U)\r\n#define ELS_ELS_GDET_EVTCNT_GDET_EVTCNT_RSVD_SHIFT (9U)\r\n/*! GDET_EVTCNT_RSVD - reserved */\r\n#define ELS_ELS_GDET_EVTCNT_GDET_EVTCNT_RSVD(x)  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_GDET_EVTCNT_GDET_EVTCNT_RSVD_SHIFT)) & ELS_ELS_GDET_EVTCNT_GDET_EVTCNT_RSVD_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_GDET_EVTCNT_CLR - ELS GDET Event Counter Clear */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_GDET_EVTCNT_CLR_GDET_EVTCNT_CLR_MASK (0x1U)\r\n#define ELS_ELS_GDET_EVTCNT_CLR_GDET_EVTCNT_CLR_SHIFT (0U)\r\n/*! GDET_EVTCNT_CLR - 1=clear GDET event counter clear */\r\n#define ELS_ELS_GDET_EVTCNT_CLR_GDET_EVTCNT_CLR(x) (((uint32_t)(((uint32_t)(x)) << ELS_ELS_GDET_EVTCNT_CLR_GDET_EVTCNT_CLR_SHIFT)) & ELS_ELS_GDET_EVTCNT_CLR_GDET_EVTCNT_CLR_MASK)\r\n\r\n#define ELS_ELS_GDET_EVTCNT_CLR_GDET_EVTCNT_CLR_RSVD_MASK (0xFFFFFFFEU)\r\n#define ELS_ELS_GDET_EVTCNT_CLR_GDET_EVTCNT_CLR_RSVD_SHIFT (1U)\r\n/*! GDET_EVTCNT_CLR_RSVD - reserved */\r\n#define ELS_ELS_GDET_EVTCNT_CLR_GDET_EVTCNT_CLR_RSVD(x) (((uint32_t)(((uint32_t)(x)) << ELS_ELS_GDET_EVTCNT_CLR_GDET_EVTCNT_CLR_RSVD_SHIFT)) & ELS_ELS_GDET_EVTCNT_CLR_GDET_EVTCNT_CLR_RSVD_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_SHA2_STATUS - ELS SHA2 Status Register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_SHA2_STATUS_SHA2_BUSY_MASK       (0x1U)\r\n#define ELS_ELS_SHA2_STATUS_SHA2_BUSY_SHIFT      (0U)\r\n#define ELS_ELS_SHA2_STATUS_SHA2_BUSY(x)         (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_STATUS_SHA2_BUSY_SHIFT)) & ELS_ELS_SHA2_STATUS_SHA2_BUSY_MASK)\r\n\r\n#define ELS_ELS_SHA2_STATUS_STATUS_RSVD1_MASK    (0xFFFFFFFEU)\r\n#define ELS_ELS_SHA2_STATUS_STATUS_RSVD1_SHIFT   (1U)\r\n/*! STATUS_RSVD1 - reserved */\r\n#define ELS_ELS_SHA2_STATUS_STATUS_RSVD1(x)      (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_STATUS_STATUS_RSVD1_SHIFT)) & ELS_ELS_SHA2_STATUS_STATUS_RSVD1_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_SHA2_CTRL - SHA2 Control register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_SHA2_CTRL_SHA2_START_MASK        (0x1U)\r\n#define ELS_ELS_SHA2_CTRL_SHA2_START_SHIFT       (0U)\r\n/*! SHA2_START - Write to 1 to Init the SHA2 Module */\r\n#define ELS_ELS_SHA2_CTRL_SHA2_START(x)          (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_CTRL_SHA2_START_SHIFT)) & ELS_ELS_SHA2_CTRL_SHA2_START_MASK)\r\n\r\n#define ELS_ELS_SHA2_CTRL_SHA2_RST_MASK          (0x2U)\r\n#define ELS_ELS_SHA2_CTRL_SHA2_RST_SHIFT         (1U)\r\n/*! SHA2_RST - Write to 1 to Reset a SHA2 operation */\r\n#define ELS_ELS_SHA2_CTRL_SHA2_RST(x)            (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_CTRL_SHA2_RST_SHIFT)) & ELS_ELS_SHA2_CTRL_SHA2_RST_MASK)\r\n\r\n#define ELS_ELS_SHA2_CTRL_SHA2_INIT_MASK         (0x4U)\r\n#define ELS_ELS_SHA2_CTRL_SHA2_INIT_SHIFT        (2U)\r\n/*! SHA2_INIT - Write to 1 to Init the SHA2 Kernel */\r\n#define ELS_ELS_SHA2_CTRL_SHA2_INIT(x)           (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_CTRL_SHA2_INIT_SHIFT)) & ELS_ELS_SHA2_CTRL_SHA2_INIT_MASK)\r\n\r\n#define ELS_ELS_SHA2_CTRL_SHA2_LOAD_MASK         (0x8U)\r\n#define ELS_ELS_SHA2_CTRL_SHA2_LOAD_SHIFT        (3U)\r\n/*! SHA2_LOAD - Write to 1 to Load the SHA2 Kernel */\r\n#define ELS_ELS_SHA2_CTRL_SHA2_LOAD(x)           (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_CTRL_SHA2_LOAD_SHIFT)) & ELS_ELS_SHA2_CTRL_SHA2_LOAD_MASK)\r\n\r\n#define ELS_ELS_SHA2_CTRL_SHA2_MODE_MASK         (0x30U)\r\n#define ELS_ELS_SHA2_CTRL_SHA2_MODE_SHIFT        (4U)\r\n/*! SHA2_MODE - SHA2 MODE:; 2'b11 - SHA512; 2'b10 - SHA384; 2'b01 - SHA224; 2'b00 - SHA256 */\r\n#define ELS_ELS_SHA2_CTRL_SHA2_MODE(x)           (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_CTRL_SHA2_MODE_SHIFT)) & ELS_ELS_SHA2_CTRL_SHA2_MODE_MASK)\r\n\r\n#define ELS_ELS_SHA2_CTRL_CTRL_RSVD1_MASK        (0x1C0U)\r\n#define ELS_ELS_SHA2_CTRL_CTRL_RSVD1_SHIFT       (6U)\r\n/*! CTRL_RSVD1 - r-eserved */\r\n#define ELS_ELS_SHA2_CTRL_CTRL_RSVD1(x)          (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_CTRL_CTRL_RSVD1_SHIFT)) & ELS_ELS_SHA2_CTRL_CTRL_RSVD1_MASK)\r\n\r\n#define ELS_ELS_SHA2_CTRL_SHA2_BYTE_ORDER_MASK   (0x200U)\r\n#define ELS_ELS_SHA2_CTRL_SHA2_BYTE_ORDER_SHIFT  (9U)\r\n/*! SHA2_BYTE_ORDER - Write to 1 to Reverse byte endianess */\r\n#define ELS_ELS_SHA2_CTRL_SHA2_BYTE_ORDER(x)     (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_CTRL_SHA2_BYTE_ORDER_SHIFT)) & ELS_ELS_SHA2_CTRL_SHA2_BYTE_ORDER_MASK)\r\n\r\n#define ELS_ELS_SHA2_CTRL_CTRL_RSVD_MASK         (0xFFFFFC00U)\r\n#define ELS_ELS_SHA2_CTRL_CTRL_RSVD_SHIFT        (10U)\r\n/*! CTRL_RSVD - r-eserved */\r\n#define ELS_ELS_SHA2_CTRL_CTRL_RSVD(x)           (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_CTRL_CTRL_RSVD_SHIFT)) & ELS_ELS_SHA2_CTRL_CTRL_RSVD_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_SHA2_DIN - ELS SHA_DATA IN Register 0 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_SHA2_DIN_SHA_DATIN_MASK          (0xFFFFFFFFU)\r\n#define ELS_ELS_SHA2_DIN_SHA_DATIN_SHIFT         (0U)\r\n/*! SHA_DATIN - Output ELS_SHA_DATIN from ELS Application being executed */\r\n#define ELS_ELS_SHA2_DIN_SHA_DATIN(x)            (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_DIN_SHA_DATIN_SHIFT)) & ELS_ELS_SHA2_DIN_SHA_DATIN_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_SHA2_DOUT0 - ELS ELS_SHA_DATA Out Register 0 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_SHA2_DOUT0_SHA_DATA0_MASK        (0xFFFFFFFFU)\r\n#define ELS_ELS_SHA2_DOUT0_SHA_DATA0_SHIFT       (0U)\r\n/*! SHA_DATA0 - Output SHA_DATA from ELS Application being executed */\r\n#define ELS_ELS_SHA2_DOUT0_SHA_DATA0(x)          (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_DOUT0_SHA_DATA0_SHIFT)) & ELS_ELS_SHA2_DOUT0_SHA_DATA0_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_SHA2_DOUT1 - ELS SHA_DATA Out Register 1 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_SHA2_DOUT1_SHA_DATA1_MASK        (0xFFFFFFFFU)\r\n#define ELS_ELS_SHA2_DOUT1_SHA_DATA1_SHIFT       (0U)\r\n/*! SHA_DATA1 - Output SHA_DATA from ELS Application being executed */\r\n#define ELS_ELS_SHA2_DOUT1_SHA_DATA1(x)          (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_DOUT1_SHA_DATA1_SHIFT)) & ELS_ELS_SHA2_DOUT1_SHA_DATA1_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_SHA2_DOUT2 - ELS SHA_DATA Out Register 2 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_SHA2_DOUT2_SHA_DATA2_MASK        (0xFFFFFFFFU)\r\n#define ELS_ELS_SHA2_DOUT2_SHA_DATA2_SHIFT       (0U)\r\n/*! SHA_DATA2 - Output SHA_DATA from ELS Application being executed */\r\n#define ELS_ELS_SHA2_DOUT2_SHA_DATA2(x)          (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_DOUT2_SHA_DATA2_SHIFT)) & ELS_ELS_SHA2_DOUT2_SHA_DATA2_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_SHA2_DOUT3 - ELS SHA_DATA Out Register 3 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_SHA2_DOUT3_SHA_DATA3_MASK        (0xFFFFFFFFU)\r\n#define ELS_ELS_SHA2_DOUT3_SHA_DATA3_SHIFT       (0U)\r\n/*! SHA_DATA3 - Output SHA_DATA from ELS Application being executed */\r\n#define ELS_ELS_SHA2_DOUT3_SHA_DATA3(x)          (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_DOUT3_SHA_DATA3_SHIFT)) & ELS_ELS_SHA2_DOUT3_SHA_DATA3_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_SHA2_DOUT4 - ELS SHA_DATA Out Register 4 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_SHA2_DOUT4_SHA_DATA4_MASK        (0xFFFFFFFFU)\r\n#define ELS_ELS_SHA2_DOUT4_SHA_DATA4_SHIFT       (0U)\r\n/*! SHA_DATA4 - Output SHA_DATA from ELS Application being executed */\r\n#define ELS_ELS_SHA2_DOUT4_SHA_DATA4(x)          (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_DOUT4_SHA_DATA4_SHIFT)) & ELS_ELS_SHA2_DOUT4_SHA_DATA4_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_SHA2_DOUT5 - ELS SHA_DATA Out Register 5 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_SHA2_DOUT5_SHA_DATA5_MASK        (0xFFFFFFFFU)\r\n#define ELS_ELS_SHA2_DOUT5_SHA_DATA5_SHIFT       (0U)\r\n/*! SHA_DATA5 - Output SHA_DATA from ELS Application being executed */\r\n#define ELS_ELS_SHA2_DOUT5_SHA_DATA5(x)          (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_DOUT5_SHA_DATA5_SHIFT)) & ELS_ELS_SHA2_DOUT5_SHA_DATA5_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_SHA2_DOUT6 - ELS SHA_DATA Out Register 6 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_SHA2_DOUT6_SHA_DATA6_MASK        (0xFFFFFFFFU)\r\n#define ELS_ELS_SHA2_DOUT6_SHA_DATA6_SHIFT       (0U)\r\n/*! SHA_DATA6 - Output SHA_DATA from ELS Application being executed */\r\n#define ELS_ELS_SHA2_DOUT6_SHA_DATA6(x)          (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_DOUT6_SHA_DATA6_SHIFT)) & ELS_ELS_SHA2_DOUT6_SHA_DATA6_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_SHA2_DOUT7 - ELS SHA_DATA Out Register 7 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_SHA2_DOUT7_SHA_DATA7_MASK        (0xFFFFFFFFU)\r\n#define ELS_ELS_SHA2_DOUT7_SHA_DATA7_SHIFT       (0U)\r\n/*! SHA_DATA7 - Output SHA_DATA from ELS Application being executed */\r\n#define ELS_ELS_SHA2_DOUT7_SHA_DATA7(x)          (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_DOUT7_SHA_DATA7_SHIFT)) & ELS_ELS_SHA2_DOUT7_SHA_DATA7_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_SHA2_DOUT8 - ELS ELS_SHA_DATA Out Register 8 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_SHA2_DOUT8_SHA_DATA8_MASK        (0xFFFFFFFFU)\r\n#define ELS_ELS_SHA2_DOUT8_SHA_DATA8_SHIFT       (0U)\r\n/*! SHA_DATA8 - Output SHA_DATA from ELS Application being executed */\r\n#define ELS_ELS_SHA2_DOUT8_SHA_DATA8(x)          (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_DOUT8_SHA_DATA8_SHIFT)) & ELS_ELS_SHA2_DOUT8_SHA_DATA8_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_SHA2_DOUT9 - ELS SHA_DATA Out Register 9 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_SHA2_DOUT9_SHA_DATA9_MASK        (0xFFFFFFFFU)\r\n#define ELS_ELS_SHA2_DOUT9_SHA_DATA9_SHIFT       (0U)\r\n/*! SHA_DATA9 - Output SHA_DATA from ELS Application being executed */\r\n#define ELS_ELS_SHA2_DOUT9_SHA_DATA9(x)          (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_DOUT9_SHA_DATA9_SHIFT)) & ELS_ELS_SHA2_DOUT9_SHA_DATA9_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_SHA2_DOUT10 - ELS SHA_DATA Out Register 10 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_SHA2_DOUT10_SHA_DATA10_MASK      (0xFFFFFFFFU)\r\n#define ELS_ELS_SHA2_DOUT10_SHA_DATA10_SHIFT     (0U)\r\n/*! SHA_DATA10 - Output SHA_DATA from ELS Application being executed */\r\n#define ELS_ELS_SHA2_DOUT10_SHA_DATA10(x)        (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_DOUT10_SHA_DATA10_SHIFT)) & ELS_ELS_SHA2_DOUT10_SHA_DATA10_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_SHA2_DOUT11 - ELS SHA_DATA Out Register 11 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_SHA2_DOUT11_SHA_DATA11_MASK      (0xFFFFFFFFU)\r\n#define ELS_ELS_SHA2_DOUT11_SHA_DATA11_SHIFT     (0U)\r\n/*! SHA_DATA11 - Output SHA_DATA from ELS Application being executed */\r\n#define ELS_ELS_SHA2_DOUT11_SHA_DATA11(x)        (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_DOUT11_SHA_DATA11_SHIFT)) & ELS_ELS_SHA2_DOUT11_SHA_DATA11_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_SHA2_DOUT12 - ELS SHA_DATA Out Register 12 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_SHA2_DOUT12_SHA_DATA12_MASK      (0xFFFFFFFFU)\r\n#define ELS_ELS_SHA2_DOUT12_SHA_DATA12_SHIFT     (0U)\r\n/*! SHA_DATA12 - Output SHA_DATA from ELS Application being executed */\r\n#define ELS_ELS_SHA2_DOUT12_SHA_DATA12(x)        (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_DOUT12_SHA_DATA12_SHIFT)) & ELS_ELS_SHA2_DOUT12_SHA_DATA12_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_SHA2_DOUT13 - ELS SHA_DATA Out Register 13 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_SHA2_DOUT13_SHA_DATA13_MASK      (0xFFFFFFFFU)\r\n#define ELS_ELS_SHA2_DOUT13_SHA_DATA13_SHIFT     (0U)\r\n/*! SHA_DATA13 - Output SHA_DATA from ELS Application being executed */\r\n#define ELS_ELS_SHA2_DOUT13_SHA_DATA13(x)        (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_DOUT13_SHA_DATA13_SHIFT)) & ELS_ELS_SHA2_DOUT13_SHA_DATA13_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_SHA2_DOUT14 - ELS SHA_DATA Out Register 14 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_SHA2_DOUT14_SHA_DATA14_MASK      (0xFFFFFFFFU)\r\n#define ELS_ELS_SHA2_DOUT14_SHA_DATA14_SHIFT     (0U)\r\n/*! SHA_DATA14 - Output SHA_DATA from ELS Application being executed */\r\n#define ELS_ELS_SHA2_DOUT14_SHA_DATA14(x)        (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_DOUT14_SHA_DATA14_SHIFT)) & ELS_ELS_SHA2_DOUT14_SHA_DATA14_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_SHA2_DOUT15 - ELS SHA_DATA Out Register 15 */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_SHA2_DOUT15_SHA_DATA15_MASK      (0xFFFFFFFFU)\r\n#define ELS_ELS_SHA2_DOUT15_SHA_DATA15_SHIFT     (0U)\r\n/*! SHA_DATA15 - Output SHA_DATA from ELS Application being executed */\r\n#define ELS_ELS_SHA2_DOUT15_SHA_DATA15(x)        (((uint32_t)(((uint32_t)(x)) << ELS_ELS_SHA2_DOUT15_SHA_DATA15_SHIFT)) & ELS_ELS_SHA2_DOUT15_SHA_DATA15_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KS0 - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KS0_KS0_KSIZE_MASK               (0x1U)\r\n#define ELS_ELS_KS0_KS0_KSIZE_SHIFT              (0U)\r\n/*! KS0_KSIZE - Key size: 0-128, 1-256 */\r\n#define ELS_ELS_KS0_KS0_KSIZE(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_KSIZE_SHIFT)) & ELS_ELS_KS0_KS0_KSIZE_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_RSVD0_MASK               (0x1EU)\r\n#define ELS_ELS_KS0_KS0_RSVD0_SHIFT              (1U)\r\n/*! KS0_RSVD0 - Reserved 0 */\r\n#define ELS_ELS_KS0_KS0_RSVD0(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_RSVD0_SHIFT)) & ELS_ELS_KS0_KS0_RSVD0_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_KACT_MASK                (0x20U)\r\n#define ELS_ELS_KS0_KS0_KACT_SHIFT               (5U)\r\n/*! KS0_KACT - Key is active */\r\n#define ELS_ELS_KS0_KS0_KACT(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_KACT_SHIFT)) & ELS_ELS_KS0_KS0_KACT_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_KBASE_MASK               (0x40U)\r\n#define ELS_ELS_KS0_KS0_KBASE_SHIFT              (6U)\r\n/*! KS0_KBASE - First slot in a multislot key */\r\n#define ELS_ELS_KS0_KS0_KBASE(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_KBASE_SHIFT)) & ELS_ELS_KS0_KS0_KBASE_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_FGP_MASK                 (0x80U)\r\n#define ELS_ELS_KS0_KS0_FGP_SHIFT                (7U)\r\n/*! KS0_FGP - Hardware Feature General Purpose */\r\n#define ELS_ELS_KS0_KS0_FGP(x)                   (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_FGP_SHIFT)) & ELS_ELS_KS0_KS0_FGP_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_FRTN_MASK                (0x100U)\r\n#define ELS_ELS_KS0_KS0_FRTN_SHIFT               (8U)\r\n/*! KS0_FRTN - Hardware Feature Retention */\r\n#define ELS_ELS_KS0_KS0_FRTN(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_FRTN_SHIFT)) & ELS_ELS_KS0_KS0_FRTN_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_FHWO_MASK                (0x200U)\r\n#define ELS_ELS_KS0_KS0_FHWO_SHIFT               (9U)\r\n/*! KS0_FHWO - Hardware Feature Output */\r\n#define ELS_ELS_KS0_KS0_FHWO(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_FHWO_SHIFT)) & ELS_ELS_KS0_KS0_FHWO_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_RSVD1_MASK               (0x1C00U)\r\n#define ELS_ELS_KS0_KS0_RSVD1_SHIFT              (10U)\r\n/*! KS0_RSVD1 - Reserved 1 */\r\n#define ELS_ELS_KS0_KS0_RSVD1(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_RSVD1_SHIFT)) & ELS_ELS_KS0_KS0_RSVD1_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_UCMAC_MASK               (0x2000U)\r\n#define ELS_ELS_KS0_KS0_UCMAC_SHIFT              (13U)\r\n/*! KS0_UCMAC - CMAC key */\r\n#define ELS_ELS_KS0_KS0_UCMAC(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_UCMAC_SHIFT)) & ELS_ELS_KS0_KS0_UCMAC_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_UKSK_MASK                (0x4000U)\r\n#define ELS_ELS_KS0_KS0_UKSK_SHIFT               (14U)\r\n/*! KS0_UKSK - KSK key */\r\n#define ELS_ELS_KS0_KS0_UKSK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_UKSK_SHIFT)) & ELS_ELS_KS0_KS0_UKSK_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_URTF_MASK                (0x8000U)\r\n#define ELS_ELS_KS0_KS0_URTF_SHIFT               (15U)\r\n/*! KS0_URTF - Real Time Fingerprint key */\r\n#define ELS_ELS_KS0_KS0_URTF(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_URTF_SHIFT)) & ELS_ELS_KS0_KS0_URTF_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_UCKDF_MASK               (0x10000U)\r\n#define ELS_ELS_KS0_KS0_UCKDF_SHIFT              (16U)\r\n/*! KS0_UCKDF - Derivation key for CKDF command */\r\n#define ELS_ELS_KS0_KS0_UCKDF(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_UCKDF_SHIFT)) & ELS_ELS_KS0_KS0_UCKDF_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_UHKDF_MASK               (0x20000U)\r\n#define ELS_ELS_KS0_KS0_UHKDF_SHIFT              (17U)\r\n/*! KS0_UHKDF - Derivation key for HKDF command */\r\n#define ELS_ELS_KS0_KS0_UHKDF(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_UHKDF_SHIFT)) & ELS_ELS_KS0_KS0_UHKDF_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_UECSG_MASK               (0x40000U)\r\n#define ELS_ELS_KS0_KS0_UECSG_SHIFT              (18U)\r\n/*! KS0_UECSG - Ecc signing key */\r\n#define ELS_ELS_KS0_KS0_UECSG(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_UECSG_SHIFT)) & ELS_ELS_KS0_KS0_UECSG_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_UECDH_MASK               (0x80000U)\r\n#define ELS_ELS_KS0_KS0_UECDH_SHIFT              (19U)\r\n/*! KS0_UECDH - Ecc diffie hellman key */\r\n#define ELS_ELS_KS0_KS0_UECDH(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_UECDH_SHIFT)) & ELS_ELS_KS0_KS0_UECDH_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_UAES_MASK                (0x100000U)\r\n#define ELS_ELS_KS0_KS0_UAES_SHIFT               (20U)\r\n/*! KS0_UAES - Aes key */\r\n#define ELS_ELS_KS0_KS0_UAES(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_UAES_SHIFT)) & ELS_ELS_KS0_KS0_UAES_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_UHMAC_MASK               (0x200000U)\r\n#define ELS_ELS_KS0_KS0_UHMAC_SHIFT              (21U)\r\n/*! KS0_UHMAC - Hmac key */\r\n#define ELS_ELS_KS0_KS0_UHMAC(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_UHMAC_SHIFT)) & ELS_ELS_KS0_KS0_UHMAC_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_UKWK_MASK                (0x400000U)\r\n#define ELS_ELS_KS0_KS0_UKWK_SHIFT               (22U)\r\n/*! KS0_UKWK - Key wrapping key */\r\n#define ELS_ELS_KS0_KS0_UKWK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_UKWK_SHIFT)) & ELS_ELS_KS0_KS0_UKWK_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_UKUOK_MASK               (0x800000U)\r\n#define ELS_ELS_KS0_KS0_UKUOK_SHIFT              (23U)\r\n/*! KS0_UKUOK - Key unwrapping key */\r\n#define ELS_ELS_KS0_KS0_UKUOK(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_UKUOK_SHIFT)) & ELS_ELS_KS0_KS0_UKUOK_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_UTLSPMS_MASK             (0x1000000U)\r\n#define ELS_ELS_KS0_KS0_UTLSPMS_SHIFT            (24U)\r\n/*! KS0_UTLSPMS - TLS Pre Master Secret */\r\n#define ELS_ELS_KS0_KS0_UTLSPMS(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_UTLSPMS_SHIFT)) & ELS_ELS_KS0_KS0_UTLSPMS_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_UTLSMS_MASK              (0x2000000U)\r\n#define ELS_ELS_KS0_KS0_UTLSMS_SHIFT             (25U)\r\n/*! KS0_UTLSMS - TLS Master Secret */\r\n#define ELS_ELS_KS0_KS0_UTLSMS(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_UTLSMS_SHIFT)) & ELS_ELS_KS0_KS0_UTLSMS_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_UKGSRC_MASK              (0x4000000U)\r\n#define ELS_ELS_KS0_KS0_UKGSRC_SHIFT             (26U)\r\n/*! KS0_UKGSRC - Supply KEYGEN source */\r\n#define ELS_ELS_KS0_KS0_UKGSRC(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_UKGSRC_SHIFT)) & ELS_ELS_KS0_KS0_UKGSRC_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_UHWO_MASK                (0x8000000U)\r\n#define ELS_ELS_KS0_KS0_UHWO_SHIFT               (27U)\r\n/*! KS0_UHWO - Hardware out key */\r\n#define ELS_ELS_KS0_KS0_UHWO(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_UHWO_SHIFT)) & ELS_ELS_KS0_KS0_UHWO_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_UWRPOK_MASK              (0x10000000U)\r\n#define ELS_ELS_KS0_KS0_UWRPOK_SHIFT             (28U)\r\n/*! KS0_UWRPOK - Ok to wrap key */\r\n#define ELS_ELS_KS0_KS0_UWRPOK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_UWRPOK_SHIFT)) & ELS_ELS_KS0_KS0_UWRPOK_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_UDUK_MASK                (0x20000000U)\r\n#define ELS_ELS_KS0_KS0_UDUK_SHIFT               (29U)\r\n/*! KS0_UDUK - Device Unique Key */\r\n#define ELS_ELS_KS0_KS0_UDUK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_UDUK_SHIFT)) & ELS_ELS_KS0_KS0_UDUK_MASK)\r\n\r\n#define ELS_ELS_KS0_KS0_UPPROT_MASK              (0xC0000000U)\r\n#define ELS_ELS_KS0_KS0_UPPROT_SHIFT             (30U)\r\n/*! KS0_UPPROT - Priviledge level */\r\n#define ELS_ELS_KS0_KS0_UPPROT(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS0_KS0_UPPROT_SHIFT)) & ELS_ELS_KS0_KS0_UPPROT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KS1 - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KS1_KS1_KSIZE_MASK               (0x1U)\r\n#define ELS_ELS_KS1_KS1_KSIZE_SHIFT              (0U)\r\n/*! KS1_KSIZE - Key size: 0-128, 1-256 */\r\n#define ELS_ELS_KS1_KS1_KSIZE(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_KSIZE_SHIFT)) & ELS_ELS_KS1_KS1_KSIZE_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_RSVD0_MASK               (0x1EU)\r\n#define ELS_ELS_KS1_KS1_RSVD0_SHIFT              (1U)\r\n/*! KS1_RSVD0 - Reserved 0 */\r\n#define ELS_ELS_KS1_KS1_RSVD0(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_RSVD0_SHIFT)) & ELS_ELS_KS1_KS1_RSVD0_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_KACT_MASK                (0x20U)\r\n#define ELS_ELS_KS1_KS1_KACT_SHIFT               (5U)\r\n/*! KS1_KACT - Key is active */\r\n#define ELS_ELS_KS1_KS1_KACT(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_KACT_SHIFT)) & ELS_ELS_KS1_KS1_KACT_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_KBASE_MASK               (0x40U)\r\n#define ELS_ELS_KS1_KS1_KBASE_SHIFT              (6U)\r\n/*! KS1_KBASE - First slot in a multislot key */\r\n#define ELS_ELS_KS1_KS1_KBASE(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_KBASE_SHIFT)) & ELS_ELS_KS1_KS1_KBASE_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_FGP_MASK                 (0x80U)\r\n#define ELS_ELS_KS1_KS1_FGP_SHIFT                (7U)\r\n/*! KS1_FGP - Hardware Feature General Purpose */\r\n#define ELS_ELS_KS1_KS1_FGP(x)                   (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_FGP_SHIFT)) & ELS_ELS_KS1_KS1_FGP_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_FRTN_MASK                (0x100U)\r\n#define ELS_ELS_KS1_KS1_FRTN_SHIFT               (8U)\r\n/*! KS1_FRTN - Hardware Feature Retention */\r\n#define ELS_ELS_KS1_KS1_FRTN(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_FRTN_SHIFT)) & ELS_ELS_KS1_KS1_FRTN_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_FHWO_MASK                (0x200U)\r\n#define ELS_ELS_KS1_KS1_FHWO_SHIFT               (9U)\r\n/*! KS1_FHWO - Hardware Feature Output */\r\n#define ELS_ELS_KS1_KS1_FHWO(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_FHWO_SHIFT)) & ELS_ELS_KS1_KS1_FHWO_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_RSVD1_MASK               (0x1C00U)\r\n#define ELS_ELS_KS1_KS1_RSVD1_SHIFT              (10U)\r\n/*! KS1_RSVD1 - Reserved 1 */\r\n#define ELS_ELS_KS1_KS1_RSVD1(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_RSVD1_SHIFT)) & ELS_ELS_KS1_KS1_RSVD1_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_UCMAC_MASK               (0x2000U)\r\n#define ELS_ELS_KS1_KS1_UCMAC_SHIFT              (13U)\r\n/*! KS1_UCMAC - CMAC key */\r\n#define ELS_ELS_KS1_KS1_UCMAC(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_UCMAC_SHIFT)) & ELS_ELS_KS1_KS1_UCMAC_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_UKSK_MASK                (0x4000U)\r\n#define ELS_ELS_KS1_KS1_UKSK_SHIFT               (14U)\r\n/*! KS1_UKSK - KSK key */\r\n#define ELS_ELS_KS1_KS1_UKSK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_UKSK_SHIFT)) & ELS_ELS_KS1_KS1_UKSK_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_URTF_MASK                (0x8000U)\r\n#define ELS_ELS_KS1_KS1_URTF_SHIFT               (15U)\r\n/*! KS1_URTF - Real Time Fingerprint key */\r\n#define ELS_ELS_KS1_KS1_URTF(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_URTF_SHIFT)) & ELS_ELS_KS1_KS1_URTF_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_UCKDF_MASK               (0x10000U)\r\n#define ELS_ELS_KS1_KS1_UCKDF_SHIFT              (16U)\r\n/*! KS1_UCKDF - Derivation key for CKDF command */\r\n#define ELS_ELS_KS1_KS1_UCKDF(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_UCKDF_SHIFT)) & ELS_ELS_KS1_KS1_UCKDF_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_UHKDF_MASK               (0x20000U)\r\n#define ELS_ELS_KS1_KS1_UHKDF_SHIFT              (17U)\r\n/*! KS1_UHKDF - Derivation key for HKDF command */\r\n#define ELS_ELS_KS1_KS1_UHKDF(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_UHKDF_SHIFT)) & ELS_ELS_KS1_KS1_UHKDF_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_UECSG_MASK               (0x40000U)\r\n#define ELS_ELS_KS1_KS1_UECSG_SHIFT              (18U)\r\n/*! KS1_UECSG - Ecc signing key */\r\n#define ELS_ELS_KS1_KS1_UECSG(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_UECSG_SHIFT)) & ELS_ELS_KS1_KS1_UECSG_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_UECDH_MASK               (0x80000U)\r\n#define ELS_ELS_KS1_KS1_UECDH_SHIFT              (19U)\r\n/*! KS1_UECDH - Ecc diffie hellman key */\r\n#define ELS_ELS_KS1_KS1_UECDH(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_UECDH_SHIFT)) & ELS_ELS_KS1_KS1_UECDH_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_UAES_MASK                (0x100000U)\r\n#define ELS_ELS_KS1_KS1_UAES_SHIFT               (20U)\r\n/*! KS1_UAES - Aes key */\r\n#define ELS_ELS_KS1_KS1_UAES(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_UAES_SHIFT)) & ELS_ELS_KS1_KS1_UAES_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_UHMAC_MASK               (0x200000U)\r\n#define ELS_ELS_KS1_KS1_UHMAC_SHIFT              (21U)\r\n/*! KS1_UHMAC - Hmac key */\r\n#define ELS_ELS_KS1_KS1_UHMAC(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_UHMAC_SHIFT)) & ELS_ELS_KS1_KS1_UHMAC_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_UKWK_MASK                (0x400000U)\r\n#define ELS_ELS_KS1_KS1_UKWK_SHIFT               (22U)\r\n/*! KS1_UKWK - Key wrapping key */\r\n#define ELS_ELS_KS1_KS1_UKWK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_UKWK_SHIFT)) & ELS_ELS_KS1_KS1_UKWK_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_UKUOK_MASK               (0x800000U)\r\n#define ELS_ELS_KS1_KS1_UKUOK_SHIFT              (23U)\r\n/*! KS1_UKUOK - Key unwrapping key */\r\n#define ELS_ELS_KS1_KS1_UKUOK(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_UKUOK_SHIFT)) & ELS_ELS_KS1_KS1_UKUOK_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_UTLSPMS_MASK             (0x1000000U)\r\n#define ELS_ELS_KS1_KS1_UTLSPMS_SHIFT            (24U)\r\n/*! KS1_UTLSPMS - TLS Pre Master Secret */\r\n#define ELS_ELS_KS1_KS1_UTLSPMS(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_UTLSPMS_SHIFT)) & ELS_ELS_KS1_KS1_UTLSPMS_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_UTLSMS_MASK              (0x2000000U)\r\n#define ELS_ELS_KS1_KS1_UTLSMS_SHIFT             (25U)\r\n/*! KS1_UTLSMS - TLS Master Secret */\r\n#define ELS_ELS_KS1_KS1_UTLSMS(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_UTLSMS_SHIFT)) & ELS_ELS_KS1_KS1_UTLSMS_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_UKGSRC_MASK              (0x4000000U)\r\n#define ELS_ELS_KS1_KS1_UKGSRC_SHIFT             (26U)\r\n/*! KS1_UKGSRC - Supply KEYGEN source */\r\n#define ELS_ELS_KS1_KS1_UKGSRC(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_UKGSRC_SHIFT)) & ELS_ELS_KS1_KS1_UKGSRC_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_UHWO_MASK                (0x8000000U)\r\n#define ELS_ELS_KS1_KS1_UHWO_SHIFT               (27U)\r\n/*! KS1_UHWO - Hardware out key */\r\n#define ELS_ELS_KS1_KS1_UHWO(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_UHWO_SHIFT)) & ELS_ELS_KS1_KS1_UHWO_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_UWRPOK_MASK              (0x10000000U)\r\n#define ELS_ELS_KS1_KS1_UWRPOK_SHIFT             (28U)\r\n/*! KS1_UWRPOK - Ok to wrap key */\r\n#define ELS_ELS_KS1_KS1_UWRPOK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_UWRPOK_SHIFT)) & ELS_ELS_KS1_KS1_UWRPOK_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_UDUK_MASK                (0x20000000U)\r\n#define ELS_ELS_KS1_KS1_UDUK_SHIFT               (29U)\r\n/*! KS1_UDUK - Device Unique Key */\r\n#define ELS_ELS_KS1_KS1_UDUK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_UDUK_SHIFT)) & ELS_ELS_KS1_KS1_UDUK_MASK)\r\n\r\n#define ELS_ELS_KS1_KS1_UPPROT_MASK              (0xC0000000U)\r\n#define ELS_ELS_KS1_KS1_UPPROT_SHIFT             (30U)\r\n/*! KS1_UPPROT - Priviledge level */\r\n#define ELS_ELS_KS1_KS1_UPPROT(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS1_KS1_UPPROT_SHIFT)) & ELS_ELS_KS1_KS1_UPPROT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KS2 - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KS2_KS2_KSIZE_MASK               (0x1U)\r\n#define ELS_ELS_KS2_KS2_KSIZE_SHIFT              (0U)\r\n/*! KS2_KSIZE - Key size: 0-128, 1-256 */\r\n#define ELS_ELS_KS2_KS2_KSIZE(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_KSIZE_SHIFT)) & ELS_ELS_KS2_KS2_KSIZE_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_RSVD0_MASK               (0x1EU)\r\n#define ELS_ELS_KS2_KS2_RSVD0_SHIFT              (1U)\r\n/*! KS2_RSVD0 - Reserved 0 */\r\n#define ELS_ELS_KS2_KS2_RSVD0(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_RSVD0_SHIFT)) & ELS_ELS_KS2_KS2_RSVD0_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_KACT_MASK                (0x20U)\r\n#define ELS_ELS_KS2_KS2_KACT_SHIFT               (5U)\r\n/*! KS2_KACT - Key is active */\r\n#define ELS_ELS_KS2_KS2_KACT(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_KACT_SHIFT)) & ELS_ELS_KS2_KS2_KACT_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_KBASE_MASK               (0x40U)\r\n#define ELS_ELS_KS2_KS2_KBASE_SHIFT              (6U)\r\n/*! KS2_KBASE - First slot in a multislot key */\r\n#define ELS_ELS_KS2_KS2_KBASE(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_KBASE_SHIFT)) & ELS_ELS_KS2_KS2_KBASE_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_FGP_MASK                 (0x80U)\r\n#define ELS_ELS_KS2_KS2_FGP_SHIFT                (7U)\r\n/*! KS2_FGP - Hardware Feature General Purpose */\r\n#define ELS_ELS_KS2_KS2_FGP(x)                   (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_FGP_SHIFT)) & ELS_ELS_KS2_KS2_FGP_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_FRTN_MASK                (0x100U)\r\n#define ELS_ELS_KS2_KS2_FRTN_SHIFT               (8U)\r\n/*! KS2_FRTN - Hardware Feature Retention */\r\n#define ELS_ELS_KS2_KS2_FRTN(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_FRTN_SHIFT)) & ELS_ELS_KS2_KS2_FRTN_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_FHWO_MASK                (0x200U)\r\n#define ELS_ELS_KS2_KS2_FHWO_SHIFT               (9U)\r\n/*! KS2_FHWO - Hardware Feature Output */\r\n#define ELS_ELS_KS2_KS2_FHWO(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_FHWO_SHIFT)) & ELS_ELS_KS2_KS2_FHWO_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_RSVD1_MASK               (0x1C00U)\r\n#define ELS_ELS_KS2_KS2_RSVD1_SHIFT              (10U)\r\n/*! KS2_RSVD1 - Reserved 1 */\r\n#define ELS_ELS_KS2_KS2_RSVD1(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_RSVD1_SHIFT)) & ELS_ELS_KS2_KS2_RSVD1_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_UCMAC_MASK               (0x2000U)\r\n#define ELS_ELS_KS2_KS2_UCMAC_SHIFT              (13U)\r\n/*! KS2_UCMAC - CMAC key */\r\n#define ELS_ELS_KS2_KS2_UCMAC(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_UCMAC_SHIFT)) & ELS_ELS_KS2_KS2_UCMAC_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_UKSK_MASK                (0x4000U)\r\n#define ELS_ELS_KS2_KS2_UKSK_SHIFT               (14U)\r\n/*! KS2_UKSK - KSK key */\r\n#define ELS_ELS_KS2_KS2_UKSK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_UKSK_SHIFT)) & ELS_ELS_KS2_KS2_UKSK_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_URTF_MASK                (0x8000U)\r\n#define ELS_ELS_KS2_KS2_URTF_SHIFT               (15U)\r\n/*! KS2_URTF - Real Time Fingerprint key */\r\n#define ELS_ELS_KS2_KS2_URTF(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_URTF_SHIFT)) & ELS_ELS_KS2_KS2_URTF_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_UCKDF_MASK               (0x10000U)\r\n#define ELS_ELS_KS2_KS2_UCKDF_SHIFT              (16U)\r\n/*! KS2_UCKDF - Derivation key for CKDF command */\r\n#define ELS_ELS_KS2_KS2_UCKDF(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_UCKDF_SHIFT)) & ELS_ELS_KS2_KS2_UCKDF_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_UHKDF_MASK               (0x20000U)\r\n#define ELS_ELS_KS2_KS2_UHKDF_SHIFT              (17U)\r\n/*! KS2_UHKDF - Derivation key for HKDF command */\r\n#define ELS_ELS_KS2_KS2_UHKDF(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_UHKDF_SHIFT)) & ELS_ELS_KS2_KS2_UHKDF_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_UECSG_MASK               (0x40000U)\r\n#define ELS_ELS_KS2_KS2_UECSG_SHIFT              (18U)\r\n/*! KS2_UECSG - Ecc signing key */\r\n#define ELS_ELS_KS2_KS2_UECSG(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_UECSG_SHIFT)) & ELS_ELS_KS2_KS2_UECSG_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_UECDH_MASK               (0x80000U)\r\n#define ELS_ELS_KS2_KS2_UECDH_SHIFT              (19U)\r\n/*! KS2_UECDH - Ecc diffie hellman key */\r\n#define ELS_ELS_KS2_KS2_UECDH(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_UECDH_SHIFT)) & ELS_ELS_KS2_KS2_UECDH_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_UAES_MASK                (0x100000U)\r\n#define ELS_ELS_KS2_KS2_UAES_SHIFT               (20U)\r\n/*! KS2_UAES - Aes key */\r\n#define ELS_ELS_KS2_KS2_UAES(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_UAES_SHIFT)) & ELS_ELS_KS2_KS2_UAES_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_UHMAC_MASK               (0x200000U)\r\n#define ELS_ELS_KS2_KS2_UHMAC_SHIFT              (21U)\r\n/*! KS2_UHMAC - Hmac key */\r\n#define ELS_ELS_KS2_KS2_UHMAC(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_UHMAC_SHIFT)) & ELS_ELS_KS2_KS2_UHMAC_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_UKWK_MASK                (0x400000U)\r\n#define ELS_ELS_KS2_KS2_UKWK_SHIFT               (22U)\r\n/*! KS2_UKWK - Key wrapping key */\r\n#define ELS_ELS_KS2_KS2_UKWK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_UKWK_SHIFT)) & ELS_ELS_KS2_KS2_UKWK_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_UKUOK_MASK               (0x800000U)\r\n#define ELS_ELS_KS2_KS2_UKUOK_SHIFT              (23U)\r\n/*! KS2_UKUOK - Key unwrapping key */\r\n#define ELS_ELS_KS2_KS2_UKUOK(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_UKUOK_SHIFT)) & ELS_ELS_KS2_KS2_UKUOK_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_UTLSPMS_MASK             (0x1000000U)\r\n#define ELS_ELS_KS2_KS2_UTLSPMS_SHIFT            (24U)\r\n/*! KS2_UTLSPMS - TLS Pre Master Secret */\r\n#define ELS_ELS_KS2_KS2_UTLSPMS(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_UTLSPMS_SHIFT)) & ELS_ELS_KS2_KS2_UTLSPMS_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_UTLSMS_MASK              (0x2000000U)\r\n#define ELS_ELS_KS2_KS2_UTLSMS_SHIFT             (25U)\r\n/*! KS2_UTLSMS - TLS Master Secret */\r\n#define ELS_ELS_KS2_KS2_UTLSMS(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_UTLSMS_SHIFT)) & ELS_ELS_KS2_KS2_UTLSMS_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_UKGSRC_MASK              (0x4000000U)\r\n#define ELS_ELS_KS2_KS2_UKGSRC_SHIFT             (26U)\r\n/*! KS2_UKGSRC - Supply KEYGEN source */\r\n#define ELS_ELS_KS2_KS2_UKGSRC(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_UKGSRC_SHIFT)) & ELS_ELS_KS2_KS2_UKGSRC_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_UHWO_MASK                (0x8000000U)\r\n#define ELS_ELS_KS2_KS2_UHWO_SHIFT               (27U)\r\n/*! KS2_UHWO - Hardware out key */\r\n#define ELS_ELS_KS2_KS2_UHWO(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_UHWO_SHIFT)) & ELS_ELS_KS2_KS2_UHWO_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_UWRPOK_MASK              (0x10000000U)\r\n#define ELS_ELS_KS2_KS2_UWRPOK_SHIFT             (28U)\r\n/*! KS2_UWRPOK - Ok to wrap key */\r\n#define ELS_ELS_KS2_KS2_UWRPOK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_UWRPOK_SHIFT)) & ELS_ELS_KS2_KS2_UWRPOK_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_UDUK_MASK                (0x20000000U)\r\n#define ELS_ELS_KS2_KS2_UDUK_SHIFT               (29U)\r\n/*! KS2_UDUK - Device Unique Key */\r\n#define ELS_ELS_KS2_KS2_UDUK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_UDUK_SHIFT)) & ELS_ELS_KS2_KS2_UDUK_MASK)\r\n\r\n#define ELS_ELS_KS2_KS2_UPPROT_MASK              (0xC0000000U)\r\n#define ELS_ELS_KS2_KS2_UPPROT_SHIFT             (30U)\r\n/*! KS2_UPPROT - Priviledge level */\r\n#define ELS_ELS_KS2_KS2_UPPROT(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS2_KS2_UPPROT_SHIFT)) & ELS_ELS_KS2_KS2_UPPROT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KS3 - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KS3_KS3_KSIZE_MASK               (0x1U)\r\n#define ELS_ELS_KS3_KS3_KSIZE_SHIFT              (0U)\r\n/*! KS3_KSIZE - Key size: 0-128, 1-256 */\r\n#define ELS_ELS_KS3_KS3_KSIZE(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_KSIZE_SHIFT)) & ELS_ELS_KS3_KS3_KSIZE_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_RSVD0_MASK               (0x1EU)\r\n#define ELS_ELS_KS3_KS3_RSVD0_SHIFT              (1U)\r\n/*! KS3_RSVD0 - Reserved 0 */\r\n#define ELS_ELS_KS3_KS3_RSVD0(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_RSVD0_SHIFT)) & ELS_ELS_KS3_KS3_RSVD0_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_KACT_MASK                (0x20U)\r\n#define ELS_ELS_KS3_KS3_KACT_SHIFT               (5U)\r\n/*! KS3_KACT - Key is active */\r\n#define ELS_ELS_KS3_KS3_KACT(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_KACT_SHIFT)) & ELS_ELS_KS3_KS3_KACT_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_KBASE_MASK               (0x40U)\r\n#define ELS_ELS_KS3_KS3_KBASE_SHIFT              (6U)\r\n/*! KS3_KBASE - First slot in a multislot key */\r\n#define ELS_ELS_KS3_KS3_KBASE(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_KBASE_SHIFT)) & ELS_ELS_KS3_KS3_KBASE_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_FGP_MASK                 (0x80U)\r\n#define ELS_ELS_KS3_KS3_FGP_SHIFT                (7U)\r\n/*! KS3_FGP - Hardware Feature General Purpose */\r\n#define ELS_ELS_KS3_KS3_FGP(x)                   (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_FGP_SHIFT)) & ELS_ELS_KS3_KS3_FGP_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_FRTN_MASK                (0x100U)\r\n#define ELS_ELS_KS3_KS3_FRTN_SHIFT               (8U)\r\n/*! KS3_FRTN - Hardware Feature Retention */\r\n#define ELS_ELS_KS3_KS3_FRTN(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_FRTN_SHIFT)) & ELS_ELS_KS3_KS3_FRTN_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_FHWO_MASK                (0x200U)\r\n#define ELS_ELS_KS3_KS3_FHWO_SHIFT               (9U)\r\n/*! KS3_FHWO - Hardware Feature Output */\r\n#define ELS_ELS_KS3_KS3_FHWO(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_FHWO_SHIFT)) & ELS_ELS_KS3_KS3_FHWO_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_RSVD1_MASK               (0x1C00U)\r\n#define ELS_ELS_KS3_KS3_RSVD1_SHIFT              (10U)\r\n/*! KS3_RSVD1 - Reserved 1 */\r\n#define ELS_ELS_KS3_KS3_RSVD1(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_RSVD1_SHIFT)) & ELS_ELS_KS3_KS3_RSVD1_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_UCMAC_MASK               (0x2000U)\r\n#define ELS_ELS_KS3_KS3_UCMAC_SHIFT              (13U)\r\n/*! KS3_UCMAC - CMAC key */\r\n#define ELS_ELS_KS3_KS3_UCMAC(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_UCMAC_SHIFT)) & ELS_ELS_KS3_KS3_UCMAC_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_UKSK_MASK                (0x4000U)\r\n#define ELS_ELS_KS3_KS3_UKSK_SHIFT               (14U)\r\n/*! KS3_UKSK - KSK key */\r\n#define ELS_ELS_KS3_KS3_UKSK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_UKSK_SHIFT)) & ELS_ELS_KS3_KS3_UKSK_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_URTF_MASK                (0x8000U)\r\n#define ELS_ELS_KS3_KS3_URTF_SHIFT               (15U)\r\n/*! KS3_URTF - Real Time Fingerprint key */\r\n#define ELS_ELS_KS3_KS3_URTF(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_URTF_SHIFT)) & ELS_ELS_KS3_KS3_URTF_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_UCKDF_MASK               (0x10000U)\r\n#define ELS_ELS_KS3_KS3_UCKDF_SHIFT              (16U)\r\n/*! KS3_UCKDF - Derivation key for CKDF command */\r\n#define ELS_ELS_KS3_KS3_UCKDF(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_UCKDF_SHIFT)) & ELS_ELS_KS3_KS3_UCKDF_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_UHKDF_MASK               (0x20000U)\r\n#define ELS_ELS_KS3_KS3_UHKDF_SHIFT              (17U)\r\n/*! KS3_UHKDF - Derivation key for HKDF command */\r\n#define ELS_ELS_KS3_KS3_UHKDF(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_UHKDF_SHIFT)) & ELS_ELS_KS3_KS3_UHKDF_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_UECSG_MASK               (0x40000U)\r\n#define ELS_ELS_KS3_KS3_UECSG_SHIFT              (18U)\r\n/*! KS3_UECSG - Ecc signing key */\r\n#define ELS_ELS_KS3_KS3_UECSG(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_UECSG_SHIFT)) & ELS_ELS_KS3_KS3_UECSG_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_UECDH_MASK               (0x80000U)\r\n#define ELS_ELS_KS3_KS3_UECDH_SHIFT              (19U)\r\n/*! KS3_UECDH - Ecc diffie hellman key */\r\n#define ELS_ELS_KS3_KS3_UECDH(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_UECDH_SHIFT)) & ELS_ELS_KS3_KS3_UECDH_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_UAES_MASK                (0x100000U)\r\n#define ELS_ELS_KS3_KS3_UAES_SHIFT               (20U)\r\n/*! KS3_UAES - Aes key */\r\n#define ELS_ELS_KS3_KS3_UAES(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_UAES_SHIFT)) & ELS_ELS_KS3_KS3_UAES_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_UHMAC_MASK               (0x200000U)\r\n#define ELS_ELS_KS3_KS3_UHMAC_SHIFT              (21U)\r\n/*! KS3_UHMAC - Hmac key */\r\n#define ELS_ELS_KS3_KS3_UHMAC(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_UHMAC_SHIFT)) & ELS_ELS_KS3_KS3_UHMAC_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_UKWK_MASK                (0x400000U)\r\n#define ELS_ELS_KS3_KS3_UKWK_SHIFT               (22U)\r\n/*! KS3_UKWK - Key wrapping key */\r\n#define ELS_ELS_KS3_KS3_UKWK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_UKWK_SHIFT)) & ELS_ELS_KS3_KS3_UKWK_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_UKUOK_MASK               (0x800000U)\r\n#define ELS_ELS_KS3_KS3_UKUOK_SHIFT              (23U)\r\n/*! KS3_UKUOK - Key unwrapping key */\r\n#define ELS_ELS_KS3_KS3_UKUOK(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_UKUOK_SHIFT)) & ELS_ELS_KS3_KS3_UKUOK_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_UTLSPMS_MASK             (0x1000000U)\r\n#define ELS_ELS_KS3_KS3_UTLSPMS_SHIFT            (24U)\r\n/*! KS3_UTLSPMS - TLS Pre Master Secret */\r\n#define ELS_ELS_KS3_KS3_UTLSPMS(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_UTLSPMS_SHIFT)) & ELS_ELS_KS3_KS3_UTLSPMS_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_UTLSMS_MASK              (0x2000000U)\r\n#define ELS_ELS_KS3_KS3_UTLSMS_SHIFT             (25U)\r\n/*! KS3_UTLSMS - TLS Master Secret */\r\n#define ELS_ELS_KS3_KS3_UTLSMS(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_UTLSMS_SHIFT)) & ELS_ELS_KS3_KS3_UTLSMS_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_UKGSRC_MASK              (0x4000000U)\r\n#define ELS_ELS_KS3_KS3_UKGSRC_SHIFT             (26U)\r\n/*! KS3_UKGSRC - Supply KEYGEN source */\r\n#define ELS_ELS_KS3_KS3_UKGSRC(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_UKGSRC_SHIFT)) & ELS_ELS_KS3_KS3_UKGSRC_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_UHWO_MASK                (0x8000000U)\r\n#define ELS_ELS_KS3_KS3_UHWO_SHIFT               (27U)\r\n/*! KS3_UHWO - Hardware out key */\r\n#define ELS_ELS_KS3_KS3_UHWO(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_UHWO_SHIFT)) & ELS_ELS_KS3_KS3_UHWO_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_UWRPOK_MASK              (0x10000000U)\r\n#define ELS_ELS_KS3_KS3_UWRPOK_SHIFT             (28U)\r\n/*! KS3_UWRPOK - Ok to wrap key */\r\n#define ELS_ELS_KS3_KS3_UWRPOK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_UWRPOK_SHIFT)) & ELS_ELS_KS3_KS3_UWRPOK_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_UDUK_MASK                (0x20000000U)\r\n#define ELS_ELS_KS3_KS3_UDUK_SHIFT               (29U)\r\n/*! KS3_UDUK - Device Unique Key */\r\n#define ELS_ELS_KS3_KS3_UDUK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_UDUK_SHIFT)) & ELS_ELS_KS3_KS3_UDUK_MASK)\r\n\r\n#define ELS_ELS_KS3_KS3_UPPROT_MASK              (0xC0000000U)\r\n#define ELS_ELS_KS3_KS3_UPPROT_SHIFT             (30U)\r\n/*! KS3_UPPROT - Priviledge level */\r\n#define ELS_ELS_KS3_KS3_UPPROT(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS3_KS3_UPPROT_SHIFT)) & ELS_ELS_KS3_KS3_UPPROT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KS4 - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KS4_KS4_KSIZE_MASK               (0x1U)\r\n#define ELS_ELS_KS4_KS4_KSIZE_SHIFT              (0U)\r\n/*! KS4_KSIZE - Key size: 0-128, 1-256 */\r\n#define ELS_ELS_KS4_KS4_KSIZE(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_KSIZE_SHIFT)) & ELS_ELS_KS4_KS4_KSIZE_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_RSVD0_MASK               (0x1EU)\r\n#define ELS_ELS_KS4_KS4_RSVD0_SHIFT              (1U)\r\n/*! KS4_RSVD0 - Reserved 0 */\r\n#define ELS_ELS_KS4_KS4_RSVD0(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_RSVD0_SHIFT)) & ELS_ELS_KS4_KS4_RSVD0_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_KACT_MASK                (0x20U)\r\n#define ELS_ELS_KS4_KS4_KACT_SHIFT               (5U)\r\n/*! KS4_KACT - Key is active */\r\n#define ELS_ELS_KS4_KS4_KACT(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_KACT_SHIFT)) & ELS_ELS_KS4_KS4_KACT_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_KBASE_MASK               (0x40U)\r\n#define ELS_ELS_KS4_KS4_KBASE_SHIFT              (6U)\r\n/*! KS4_KBASE - First slot in a multislot key */\r\n#define ELS_ELS_KS4_KS4_KBASE(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_KBASE_SHIFT)) & ELS_ELS_KS4_KS4_KBASE_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_FGP_MASK                 (0x80U)\r\n#define ELS_ELS_KS4_KS4_FGP_SHIFT                (7U)\r\n/*! KS4_FGP - Hardware Feature General Purpose */\r\n#define ELS_ELS_KS4_KS4_FGP(x)                   (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_FGP_SHIFT)) & ELS_ELS_KS4_KS4_FGP_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_FRTN_MASK                (0x100U)\r\n#define ELS_ELS_KS4_KS4_FRTN_SHIFT               (8U)\r\n/*! KS4_FRTN - Hardware Feature Retention */\r\n#define ELS_ELS_KS4_KS4_FRTN(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_FRTN_SHIFT)) & ELS_ELS_KS4_KS4_FRTN_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_FHWO_MASK                (0x200U)\r\n#define ELS_ELS_KS4_KS4_FHWO_SHIFT               (9U)\r\n/*! KS4_FHWO - Hardware Feature Output */\r\n#define ELS_ELS_KS4_KS4_FHWO(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_FHWO_SHIFT)) & ELS_ELS_KS4_KS4_FHWO_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_RSVD1_MASK               (0x1C00U)\r\n#define ELS_ELS_KS4_KS4_RSVD1_SHIFT              (10U)\r\n/*! KS4_RSVD1 - Reserved 1 */\r\n#define ELS_ELS_KS4_KS4_RSVD1(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_RSVD1_SHIFT)) & ELS_ELS_KS4_KS4_RSVD1_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_UCMAC_MASK               (0x2000U)\r\n#define ELS_ELS_KS4_KS4_UCMAC_SHIFT              (13U)\r\n/*! KS4_UCMAC - CMAC key */\r\n#define ELS_ELS_KS4_KS4_UCMAC(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_UCMAC_SHIFT)) & ELS_ELS_KS4_KS4_UCMAC_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_UKSK_MASK                (0x4000U)\r\n#define ELS_ELS_KS4_KS4_UKSK_SHIFT               (14U)\r\n/*! KS4_UKSK - KSK key */\r\n#define ELS_ELS_KS4_KS4_UKSK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_UKSK_SHIFT)) & ELS_ELS_KS4_KS4_UKSK_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_URTF_MASK                (0x8000U)\r\n#define ELS_ELS_KS4_KS4_URTF_SHIFT               (15U)\r\n/*! KS4_URTF - Real Time Fingerprint key */\r\n#define ELS_ELS_KS4_KS4_URTF(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_URTF_SHIFT)) & ELS_ELS_KS4_KS4_URTF_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_UCKDF_MASK               (0x10000U)\r\n#define ELS_ELS_KS4_KS4_UCKDF_SHIFT              (16U)\r\n/*! KS4_UCKDF - Derivation key for CKDF command */\r\n#define ELS_ELS_KS4_KS4_UCKDF(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_UCKDF_SHIFT)) & ELS_ELS_KS4_KS4_UCKDF_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_UHKDF_MASK               (0x20000U)\r\n#define ELS_ELS_KS4_KS4_UHKDF_SHIFT              (17U)\r\n/*! KS4_UHKDF - Derivation key for HKDF command */\r\n#define ELS_ELS_KS4_KS4_UHKDF(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_UHKDF_SHIFT)) & ELS_ELS_KS4_KS4_UHKDF_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_UECSG_MASK               (0x40000U)\r\n#define ELS_ELS_KS4_KS4_UECSG_SHIFT              (18U)\r\n/*! KS4_UECSG - Ecc signing key */\r\n#define ELS_ELS_KS4_KS4_UECSG(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_UECSG_SHIFT)) & ELS_ELS_KS4_KS4_UECSG_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_UECDH_MASK               (0x80000U)\r\n#define ELS_ELS_KS4_KS4_UECDH_SHIFT              (19U)\r\n/*! KS4_UECDH - Ecc diffie hellman key */\r\n#define ELS_ELS_KS4_KS4_UECDH(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_UECDH_SHIFT)) & ELS_ELS_KS4_KS4_UECDH_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_UAES_MASK                (0x100000U)\r\n#define ELS_ELS_KS4_KS4_UAES_SHIFT               (20U)\r\n/*! KS4_UAES - Aes key */\r\n#define ELS_ELS_KS4_KS4_UAES(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_UAES_SHIFT)) & ELS_ELS_KS4_KS4_UAES_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_UHMAC_MASK               (0x200000U)\r\n#define ELS_ELS_KS4_KS4_UHMAC_SHIFT              (21U)\r\n/*! KS4_UHMAC - Hmac key */\r\n#define ELS_ELS_KS4_KS4_UHMAC(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_UHMAC_SHIFT)) & ELS_ELS_KS4_KS4_UHMAC_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_UKWK_MASK                (0x400000U)\r\n#define ELS_ELS_KS4_KS4_UKWK_SHIFT               (22U)\r\n/*! KS4_UKWK - Key wrapping key */\r\n#define ELS_ELS_KS4_KS4_UKWK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_UKWK_SHIFT)) & ELS_ELS_KS4_KS4_UKWK_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_UKUOK_MASK               (0x800000U)\r\n#define ELS_ELS_KS4_KS4_UKUOK_SHIFT              (23U)\r\n/*! KS4_UKUOK - Key unwrapping key */\r\n#define ELS_ELS_KS4_KS4_UKUOK(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_UKUOK_SHIFT)) & ELS_ELS_KS4_KS4_UKUOK_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_UTLSPMS_MASK             (0x1000000U)\r\n#define ELS_ELS_KS4_KS4_UTLSPMS_SHIFT            (24U)\r\n/*! KS4_UTLSPMS - TLS Pre Master Secret */\r\n#define ELS_ELS_KS4_KS4_UTLSPMS(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_UTLSPMS_SHIFT)) & ELS_ELS_KS4_KS4_UTLSPMS_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_UTLSMS_MASK              (0x2000000U)\r\n#define ELS_ELS_KS4_KS4_UTLSMS_SHIFT             (25U)\r\n/*! KS4_UTLSMS - TLS Master Secret */\r\n#define ELS_ELS_KS4_KS4_UTLSMS(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_UTLSMS_SHIFT)) & ELS_ELS_KS4_KS4_UTLSMS_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_UKGSRC_MASK              (0x4000000U)\r\n#define ELS_ELS_KS4_KS4_UKGSRC_SHIFT             (26U)\r\n/*! KS4_UKGSRC - Supply KEYGEN source */\r\n#define ELS_ELS_KS4_KS4_UKGSRC(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_UKGSRC_SHIFT)) & ELS_ELS_KS4_KS4_UKGSRC_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_UHWO_MASK                (0x8000000U)\r\n#define ELS_ELS_KS4_KS4_UHWO_SHIFT               (27U)\r\n/*! KS4_UHWO - Hardware out key */\r\n#define ELS_ELS_KS4_KS4_UHWO(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_UHWO_SHIFT)) & ELS_ELS_KS4_KS4_UHWO_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_UWRPOK_MASK              (0x10000000U)\r\n#define ELS_ELS_KS4_KS4_UWRPOK_SHIFT             (28U)\r\n/*! KS4_UWRPOK - Ok to wrap key */\r\n#define ELS_ELS_KS4_KS4_UWRPOK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_UWRPOK_SHIFT)) & ELS_ELS_KS4_KS4_UWRPOK_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_UDUK_MASK                (0x20000000U)\r\n#define ELS_ELS_KS4_KS4_UDUK_SHIFT               (29U)\r\n/*! KS4_UDUK - Device Unique Key */\r\n#define ELS_ELS_KS4_KS4_UDUK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_UDUK_SHIFT)) & ELS_ELS_KS4_KS4_UDUK_MASK)\r\n\r\n#define ELS_ELS_KS4_KS4_UPPROT_MASK              (0xC0000000U)\r\n#define ELS_ELS_KS4_KS4_UPPROT_SHIFT             (30U)\r\n/*! KS4_UPPROT - Priviledge level */\r\n#define ELS_ELS_KS4_KS4_UPPROT(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS4_KS4_UPPROT_SHIFT)) & ELS_ELS_KS4_KS4_UPPROT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KS5 - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KS5_KS5_KSIZE_MASK               (0x1U)\r\n#define ELS_ELS_KS5_KS5_KSIZE_SHIFT              (0U)\r\n/*! KS5_KSIZE - Key size: 0-128, 1-256 */\r\n#define ELS_ELS_KS5_KS5_KSIZE(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_KSIZE_SHIFT)) & ELS_ELS_KS5_KS5_KSIZE_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_RSVD0_MASK               (0x1EU)\r\n#define ELS_ELS_KS5_KS5_RSVD0_SHIFT              (1U)\r\n/*! KS5_RSVD0 - Reserved 0 */\r\n#define ELS_ELS_KS5_KS5_RSVD0(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_RSVD0_SHIFT)) & ELS_ELS_KS5_KS5_RSVD0_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_KACT_MASK                (0x20U)\r\n#define ELS_ELS_KS5_KS5_KACT_SHIFT               (5U)\r\n/*! KS5_KACT - Key is active */\r\n#define ELS_ELS_KS5_KS5_KACT(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_KACT_SHIFT)) & ELS_ELS_KS5_KS5_KACT_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_KBASE_MASK               (0x40U)\r\n#define ELS_ELS_KS5_KS5_KBASE_SHIFT              (6U)\r\n/*! KS5_KBASE - First slot in a multislot key */\r\n#define ELS_ELS_KS5_KS5_KBASE(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_KBASE_SHIFT)) & ELS_ELS_KS5_KS5_KBASE_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_FGP_MASK                 (0x80U)\r\n#define ELS_ELS_KS5_KS5_FGP_SHIFT                (7U)\r\n/*! KS5_FGP - Hardware Feature General Purpose */\r\n#define ELS_ELS_KS5_KS5_FGP(x)                   (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_FGP_SHIFT)) & ELS_ELS_KS5_KS5_FGP_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_FRTN_MASK                (0x100U)\r\n#define ELS_ELS_KS5_KS5_FRTN_SHIFT               (8U)\r\n/*! KS5_FRTN - Hardware Feature Retention */\r\n#define ELS_ELS_KS5_KS5_FRTN(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_FRTN_SHIFT)) & ELS_ELS_KS5_KS5_FRTN_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_FHWO_MASK                (0x200U)\r\n#define ELS_ELS_KS5_KS5_FHWO_SHIFT               (9U)\r\n/*! KS5_FHWO - Hardware Feature Output */\r\n#define ELS_ELS_KS5_KS5_FHWO(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_FHWO_SHIFT)) & ELS_ELS_KS5_KS5_FHWO_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_RSVD1_MASK               (0x1C00U)\r\n#define ELS_ELS_KS5_KS5_RSVD1_SHIFT              (10U)\r\n/*! KS5_RSVD1 - Reserved 1 */\r\n#define ELS_ELS_KS5_KS5_RSVD1(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_RSVD1_SHIFT)) & ELS_ELS_KS5_KS5_RSVD1_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_UCMAC_MASK               (0x2000U)\r\n#define ELS_ELS_KS5_KS5_UCMAC_SHIFT              (13U)\r\n/*! KS5_UCMAC - CMAC key */\r\n#define ELS_ELS_KS5_KS5_UCMAC(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_UCMAC_SHIFT)) & ELS_ELS_KS5_KS5_UCMAC_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_UKSK_MASK                (0x4000U)\r\n#define ELS_ELS_KS5_KS5_UKSK_SHIFT               (14U)\r\n/*! KS5_UKSK - KSK key */\r\n#define ELS_ELS_KS5_KS5_UKSK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_UKSK_SHIFT)) & ELS_ELS_KS5_KS5_UKSK_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_URTF_MASK                (0x8000U)\r\n#define ELS_ELS_KS5_KS5_URTF_SHIFT               (15U)\r\n/*! KS5_URTF - Real Time Fingerprint key */\r\n#define ELS_ELS_KS5_KS5_URTF(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_URTF_SHIFT)) & ELS_ELS_KS5_KS5_URTF_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_UCKDF_MASK               (0x10000U)\r\n#define ELS_ELS_KS5_KS5_UCKDF_SHIFT              (16U)\r\n/*! KS5_UCKDF - Derivation key for CKDF command */\r\n#define ELS_ELS_KS5_KS5_UCKDF(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_UCKDF_SHIFT)) & ELS_ELS_KS5_KS5_UCKDF_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_UHKDF_MASK               (0x20000U)\r\n#define ELS_ELS_KS5_KS5_UHKDF_SHIFT              (17U)\r\n/*! KS5_UHKDF - Derivation key for HKDF command */\r\n#define ELS_ELS_KS5_KS5_UHKDF(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_UHKDF_SHIFT)) & ELS_ELS_KS5_KS5_UHKDF_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_UECSG_MASK               (0x40000U)\r\n#define ELS_ELS_KS5_KS5_UECSG_SHIFT              (18U)\r\n/*! KS5_UECSG - Ecc signing key */\r\n#define ELS_ELS_KS5_KS5_UECSG(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_UECSG_SHIFT)) & ELS_ELS_KS5_KS5_UECSG_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_UECDH_MASK               (0x80000U)\r\n#define ELS_ELS_KS5_KS5_UECDH_SHIFT              (19U)\r\n/*! KS5_UECDH - Ecc diffie hellman key */\r\n#define ELS_ELS_KS5_KS5_UECDH(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_UECDH_SHIFT)) & ELS_ELS_KS5_KS5_UECDH_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_UAES_MASK                (0x100000U)\r\n#define ELS_ELS_KS5_KS5_UAES_SHIFT               (20U)\r\n/*! KS5_UAES - Aes key */\r\n#define ELS_ELS_KS5_KS5_UAES(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_UAES_SHIFT)) & ELS_ELS_KS5_KS5_UAES_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_UHMAC_MASK               (0x200000U)\r\n#define ELS_ELS_KS5_KS5_UHMAC_SHIFT              (21U)\r\n/*! KS5_UHMAC - Hmac key */\r\n#define ELS_ELS_KS5_KS5_UHMAC(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_UHMAC_SHIFT)) & ELS_ELS_KS5_KS5_UHMAC_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_UKWK_MASK                (0x400000U)\r\n#define ELS_ELS_KS5_KS5_UKWK_SHIFT               (22U)\r\n/*! KS5_UKWK - Key wrapping key */\r\n#define ELS_ELS_KS5_KS5_UKWK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_UKWK_SHIFT)) & ELS_ELS_KS5_KS5_UKWK_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_UKUOK_MASK               (0x800000U)\r\n#define ELS_ELS_KS5_KS5_UKUOK_SHIFT              (23U)\r\n/*! KS5_UKUOK - Key unwrapping key */\r\n#define ELS_ELS_KS5_KS5_UKUOK(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_UKUOK_SHIFT)) & ELS_ELS_KS5_KS5_UKUOK_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_UTLSPMS_MASK             (0x1000000U)\r\n#define ELS_ELS_KS5_KS5_UTLSPMS_SHIFT            (24U)\r\n/*! KS5_UTLSPMS - TLS Pre Master Secret */\r\n#define ELS_ELS_KS5_KS5_UTLSPMS(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_UTLSPMS_SHIFT)) & ELS_ELS_KS5_KS5_UTLSPMS_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_UTLSMS_MASK              (0x2000000U)\r\n#define ELS_ELS_KS5_KS5_UTLSMS_SHIFT             (25U)\r\n/*! KS5_UTLSMS - TLS Master Secret */\r\n#define ELS_ELS_KS5_KS5_UTLSMS(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_UTLSMS_SHIFT)) & ELS_ELS_KS5_KS5_UTLSMS_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_UKGSRC_MASK              (0x4000000U)\r\n#define ELS_ELS_KS5_KS5_UKGSRC_SHIFT             (26U)\r\n/*! KS5_UKGSRC - Supply KEYGEN source */\r\n#define ELS_ELS_KS5_KS5_UKGSRC(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_UKGSRC_SHIFT)) & ELS_ELS_KS5_KS5_UKGSRC_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_UHWO_MASK                (0x8000000U)\r\n#define ELS_ELS_KS5_KS5_UHWO_SHIFT               (27U)\r\n/*! KS5_UHWO - Hardware out key */\r\n#define ELS_ELS_KS5_KS5_UHWO(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_UHWO_SHIFT)) & ELS_ELS_KS5_KS5_UHWO_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_UWRPOK_MASK              (0x10000000U)\r\n#define ELS_ELS_KS5_KS5_UWRPOK_SHIFT             (28U)\r\n/*! KS5_UWRPOK - Ok to wrap key */\r\n#define ELS_ELS_KS5_KS5_UWRPOK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_UWRPOK_SHIFT)) & ELS_ELS_KS5_KS5_UWRPOK_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_UDUK_MASK                (0x20000000U)\r\n#define ELS_ELS_KS5_KS5_UDUK_SHIFT               (29U)\r\n/*! KS5_UDUK - Device Unique Key */\r\n#define ELS_ELS_KS5_KS5_UDUK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_UDUK_SHIFT)) & ELS_ELS_KS5_KS5_UDUK_MASK)\r\n\r\n#define ELS_ELS_KS5_KS5_UPPROT_MASK              (0xC0000000U)\r\n#define ELS_ELS_KS5_KS5_UPPROT_SHIFT             (30U)\r\n/*! KS5_UPPROT - Priviledge level */\r\n#define ELS_ELS_KS5_KS5_UPPROT(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS5_KS5_UPPROT_SHIFT)) & ELS_ELS_KS5_KS5_UPPROT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KS6 - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KS6_KS6_KSIZE_MASK               (0x1U)\r\n#define ELS_ELS_KS6_KS6_KSIZE_SHIFT              (0U)\r\n/*! KS6_KSIZE - Key size: 0-128, 1-256 */\r\n#define ELS_ELS_KS6_KS6_KSIZE(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_KSIZE_SHIFT)) & ELS_ELS_KS6_KS6_KSIZE_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_RSVD0_MASK               (0x1EU)\r\n#define ELS_ELS_KS6_KS6_RSVD0_SHIFT              (1U)\r\n/*! KS6_RSVD0 - Reserved 0 */\r\n#define ELS_ELS_KS6_KS6_RSVD0(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_RSVD0_SHIFT)) & ELS_ELS_KS6_KS6_RSVD0_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_KACT_MASK                (0x20U)\r\n#define ELS_ELS_KS6_KS6_KACT_SHIFT               (5U)\r\n/*! KS6_KACT - Key is active */\r\n#define ELS_ELS_KS6_KS6_KACT(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_KACT_SHIFT)) & ELS_ELS_KS6_KS6_KACT_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_KBASE_MASK               (0x40U)\r\n#define ELS_ELS_KS6_KS6_KBASE_SHIFT              (6U)\r\n/*! KS6_KBASE - First slot in a multislot key */\r\n#define ELS_ELS_KS6_KS6_KBASE(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_KBASE_SHIFT)) & ELS_ELS_KS6_KS6_KBASE_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_FGP_MASK                 (0x80U)\r\n#define ELS_ELS_KS6_KS6_FGP_SHIFT                (7U)\r\n/*! KS6_FGP - Hardware Feature General Purpose */\r\n#define ELS_ELS_KS6_KS6_FGP(x)                   (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_FGP_SHIFT)) & ELS_ELS_KS6_KS6_FGP_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_FRTN_MASK                (0x100U)\r\n#define ELS_ELS_KS6_KS6_FRTN_SHIFT               (8U)\r\n/*! KS6_FRTN - Hardware Feature Retention */\r\n#define ELS_ELS_KS6_KS6_FRTN(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_FRTN_SHIFT)) & ELS_ELS_KS6_KS6_FRTN_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_FHWO_MASK                (0x200U)\r\n#define ELS_ELS_KS6_KS6_FHWO_SHIFT               (9U)\r\n/*! KS6_FHWO - Hardware Feature Output */\r\n#define ELS_ELS_KS6_KS6_FHWO(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_FHWO_SHIFT)) & ELS_ELS_KS6_KS6_FHWO_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_RSVD1_MASK               (0x1C00U)\r\n#define ELS_ELS_KS6_KS6_RSVD1_SHIFT              (10U)\r\n/*! KS6_RSVD1 - Reserved 1 */\r\n#define ELS_ELS_KS6_KS6_RSVD1(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_RSVD1_SHIFT)) & ELS_ELS_KS6_KS6_RSVD1_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_UCMAC_MASK               (0x2000U)\r\n#define ELS_ELS_KS6_KS6_UCMAC_SHIFT              (13U)\r\n/*! KS6_UCMAC - CMAC key */\r\n#define ELS_ELS_KS6_KS6_UCMAC(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_UCMAC_SHIFT)) & ELS_ELS_KS6_KS6_UCMAC_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_UKSK_MASK                (0x4000U)\r\n#define ELS_ELS_KS6_KS6_UKSK_SHIFT               (14U)\r\n/*! KS6_UKSK - KSK key */\r\n#define ELS_ELS_KS6_KS6_UKSK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_UKSK_SHIFT)) & ELS_ELS_KS6_KS6_UKSK_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_URTF_MASK                (0x8000U)\r\n#define ELS_ELS_KS6_KS6_URTF_SHIFT               (15U)\r\n/*! KS6_URTF - Real Time Fingerprint key */\r\n#define ELS_ELS_KS6_KS6_URTF(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_URTF_SHIFT)) & ELS_ELS_KS6_KS6_URTF_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_UCKDF_MASK               (0x10000U)\r\n#define ELS_ELS_KS6_KS6_UCKDF_SHIFT              (16U)\r\n/*! KS6_UCKDF - Derivation key for CKDF command */\r\n#define ELS_ELS_KS6_KS6_UCKDF(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_UCKDF_SHIFT)) & ELS_ELS_KS6_KS6_UCKDF_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_UHKDF_MASK               (0x20000U)\r\n#define ELS_ELS_KS6_KS6_UHKDF_SHIFT              (17U)\r\n/*! KS6_UHKDF - Derivation key for HKDF command */\r\n#define ELS_ELS_KS6_KS6_UHKDF(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_UHKDF_SHIFT)) & ELS_ELS_KS6_KS6_UHKDF_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_UECSG_MASK               (0x40000U)\r\n#define ELS_ELS_KS6_KS6_UECSG_SHIFT              (18U)\r\n/*! KS6_UECSG - Ecc signing key */\r\n#define ELS_ELS_KS6_KS6_UECSG(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_UECSG_SHIFT)) & ELS_ELS_KS6_KS6_UECSG_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_UECDH_MASK               (0x80000U)\r\n#define ELS_ELS_KS6_KS6_UECDH_SHIFT              (19U)\r\n/*! KS6_UECDH - Ecc diffie hellman key */\r\n#define ELS_ELS_KS6_KS6_UECDH(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_UECDH_SHIFT)) & ELS_ELS_KS6_KS6_UECDH_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_UAES_MASK                (0x100000U)\r\n#define ELS_ELS_KS6_KS6_UAES_SHIFT               (20U)\r\n/*! KS6_UAES - Aes key */\r\n#define ELS_ELS_KS6_KS6_UAES(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_UAES_SHIFT)) & ELS_ELS_KS6_KS6_UAES_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_UHMAC_MASK               (0x200000U)\r\n#define ELS_ELS_KS6_KS6_UHMAC_SHIFT              (21U)\r\n/*! KS6_UHMAC - Hmac key */\r\n#define ELS_ELS_KS6_KS6_UHMAC(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_UHMAC_SHIFT)) & ELS_ELS_KS6_KS6_UHMAC_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_UKWK_MASK                (0x400000U)\r\n#define ELS_ELS_KS6_KS6_UKWK_SHIFT               (22U)\r\n/*! KS6_UKWK - Key wrapping key */\r\n#define ELS_ELS_KS6_KS6_UKWK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_UKWK_SHIFT)) & ELS_ELS_KS6_KS6_UKWK_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_UKUOK_MASK               (0x800000U)\r\n#define ELS_ELS_KS6_KS6_UKUOK_SHIFT              (23U)\r\n/*! KS6_UKUOK - Key unwrapping key */\r\n#define ELS_ELS_KS6_KS6_UKUOK(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_UKUOK_SHIFT)) & ELS_ELS_KS6_KS6_UKUOK_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_UTLSPMS_MASK             (0x1000000U)\r\n#define ELS_ELS_KS6_KS6_UTLSPMS_SHIFT            (24U)\r\n/*! KS6_UTLSPMS - TLS Pre Master Secret */\r\n#define ELS_ELS_KS6_KS6_UTLSPMS(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_UTLSPMS_SHIFT)) & ELS_ELS_KS6_KS6_UTLSPMS_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_UTLSMS_MASK              (0x2000000U)\r\n#define ELS_ELS_KS6_KS6_UTLSMS_SHIFT             (25U)\r\n/*! KS6_UTLSMS - TLS Master Secret */\r\n#define ELS_ELS_KS6_KS6_UTLSMS(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_UTLSMS_SHIFT)) & ELS_ELS_KS6_KS6_UTLSMS_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_UKGSRC_MASK              (0x4000000U)\r\n#define ELS_ELS_KS6_KS6_UKGSRC_SHIFT             (26U)\r\n/*! KS6_UKGSRC - Supply KEYGEN source */\r\n#define ELS_ELS_KS6_KS6_UKGSRC(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_UKGSRC_SHIFT)) & ELS_ELS_KS6_KS6_UKGSRC_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_UHWO_MASK                (0x8000000U)\r\n#define ELS_ELS_KS6_KS6_UHWO_SHIFT               (27U)\r\n/*! KS6_UHWO - Hardware out key */\r\n#define ELS_ELS_KS6_KS6_UHWO(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_UHWO_SHIFT)) & ELS_ELS_KS6_KS6_UHWO_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_UWRPOK_MASK              (0x10000000U)\r\n#define ELS_ELS_KS6_KS6_UWRPOK_SHIFT             (28U)\r\n/*! KS6_UWRPOK - Ok to wrap key */\r\n#define ELS_ELS_KS6_KS6_UWRPOK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_UWRPOK_SHIFT)) & ELS_ELS_KS6_KS6_UWRPOK_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_UDUK_MASK                (0x20000000U)\r\n#define ELS_ELS_KS6_KS6_UDUK_SHIFT               (29U)\r\n/*! KS6_UDUK - Device Unique Key */\r\n#define ELS_ELS_KS6_KS6_UDUK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_UDUK_SHIFT)) & ELS_ELS_KS6_KS6_UDUK_MASK)\r\n\r\n#define ELS_ELS_KS6_KS6_UPPROT_MASK              (0xC0000000U)\r\n#define ELS_ELS_KS6_KS6_UPPROT_SHIFT             (30U)\r\n/*! KS6_UPPROT - Priviledge level */\r\n#define ELS_ELS_KS6_KS6_UPPROT(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS6_KS6_UPPROT_SHIFT)) & ELS_ELS_KS6_KS6_UPPROT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KS7 - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KS7_KS7_KSIZE_MASK               (0x1U)\r\n#define ELS_ELS_KS7_KS7_KSIZE_SHIFT              (0U)\r\n/*! KS7_KSIZE - Key size: 0-128, 1-256 */\r\n#define ELS_ELS_KS7_KS7_KSIZE(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_KSIZE_SHIFT)) & ELS_ELS_KS7_KS7_KSIZE_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_RSVD0_MASK               (0x1EU)\r\n#define ELS_ELS_KS7_KS7_RSVD0_SHIFT              (1U)\r\n/*! KS7_RSVD0 - Reserved 0 */\r\n#define ELS_ELS_KS7_KS7_RSVD0(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_RSVD0_SHIFT)) & ELS_ELS_KS7_KS7_RSVD0_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_KACT_MASK                (0x20U)\r\n#define ELS_ELS_KS7_KS7_KACT_SHIFT               (5U)\r\n/*! KS7_KACT - Key is active */\r\n#define ELS_ELS_KS7_KS7_KACT(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_KACT_SHIFT)) & ELS_ELS_KS7_KS7_KACT_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_KBASE_MASK               (0x40U)\r\n#define ELS_ELS_KS7_KS7_KBASE_SHIFT              (6U)\r\n/*! KS7_KBASE - First slot in a multislot key */\r\n#define ELS_ELS_KS7_KS7_KBASE(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_KBASE_SHIFT)) & ELS_ELS_KS7_KS7_KBASE_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_FGP_MASK                 (0x80U)\r\n#define ELS_ELS_KS7_KS7_FGP_SHIFT                (7U)\r\n/*! KS7_FGP - Hardware Feature General Purpose */\r\n#define ELS_ELS_KS7_KS7_FGP(x)                   (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_FGP_SHIFT)) & ELS_ELS_KS7_KS7_FGP_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_FRTN_MASK                (0x100U)\r\n#define ELS_ELS_KS7_KS7_FRTN_SHIFT               (8U)\r\n/*! KS7_FRTN - Hardware Feature Retention */\r\n#define ELS_ELS_KS7_KS7_FRTN(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_FRTN_SHIFT)) & ELS_ELS_KS7_KS7_FRTN_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_FHWO_MASK                (0x200U)\r\n#define ELS_ELS_KS7_KS7_FHWO_SHIFT               (9U)\r\n/*! KS7_FHWO - Hardware Feature Output */\r\n#define ELS_ELS_KS7_KS7_FHWO(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_FHWO_SHIFT)) & ELS_ELS_KS7_KS7_FHWO_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_RSVD1_MASK               (0x1C00U)\r\n#define ELS_ELS_KS7_KS7_RSVD1_SHIFT              (10U)\r\n/*! KS7_RSVD1 - Reserved 1 */\r\n#define ELS_ELS_KS7_KS7_RSVD1(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_RSVD1_SHIFT)) & ELS_ELS_KS7_KS7_RSVD1_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_UCMAC_MASK               (0x2000U)\r\n#define ELS_ELS_KS7_KS7_UCMAC_SHIFT              (13U)\r\n/*! KS7_UCMAC - CMAC key */\r\n#define ELS_ELS_KS7_KS7_UCMAC(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_UCMAC_SHIFT)) & ELS_ELS_KS7_KS7_UCMAC_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_UKSK_MASK                (0x4000U)\r\n#define ELS_ELS_KS7_KS7_UKSK_SHIFT               (14U)\r\n/*! KS7_UKSK - KSK key */\r\n#define ELS_ELS_KS7_KS7_UKSK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_UKSK_SHIFT)) & ELS_ELS_KS7_KS7_UKSK_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_URTF_MASK                (0x8000U)\r\n#define ELS_ELS_KS7_KS7_URTF_SHIFT               (15U)\r\n/*! KS7_URTF - Real Time Fingerprint key */\r\n#define ELS_ELS_KS7_KS7_URTF(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_URTF_SHIFT)) & ELS_ELS_KS7_KS7_URTF_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_UCKDF_MASK               (0x10000U)\r\n#define ELS_ELS_KS7_KS7_UCKDF_SHIFT              (16U)\r\n/*! KS7_UCKDF - Derivation key for CKDF command */\r\n#define ELS_ELS_KS7_KS7_UCKDF(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_UCKDF_SHIFT)) & ELS_ELS_KS7_KS7_UCKDF_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_UHKDF_MASK               (0x20000U)\r\n#define ELS_ELS_KS7_KS7_UHKDF_SHIFT              (17U)\r\n/*! KS7_UHKDF - Derivation key for HKDF command */\r\n#define ELS_ELS_KS7_KS7_UHKDF(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_UHKDF_SHIFT)) & ELS_ELS_KS7_KS7_UHKDF_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_UECSG_MASK               (0x40000U)\r\n#define ELS_ELS_KS7_KS7_UECSG_SHIFT              (18U)\r\n/*! KS7_UECSG - Ecc signing key */\r\n#define ELS_ELS_KS7_KS7_UECSG(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_UECSG_SHIFT)) & ELS_ELS_KS7_KS7_UECSG_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_UECDH_MASK               (0x80000U)\r\n#define ELS_ELS_KS7_KS7_UECDH_SHIFT              (19U)\r\n/*! KS7_UECDH - Ecc diffie hellman key */\r\n#define ELS_ELS_KS7_KS7_UECDH(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_UECDH_SHIFT)) & ELS_ELS_KS7_KS7_UECDH_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_UAES_MASK                (0x100000U)\r\n#define ELS_ELS_KS7_KS7_UAES_SHIFT               (20U)\r\n/*! KS7_UAES - Aes key */\r\n#define ELS_ELS_KS7_KS7_UAES(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_UAES_SHIFT)) & ELS_ELS_KS7_KS7_UAES_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_UHMAC_MASK               (0x200000U)\r\n#define ELS_ELS_KS7_KS7_UHMAC_SHIFT              (21U)\r\n/*! KS7_UHMAC - Hmac key */\r\n#define ELS_ELS_KS7_KS7_UHMAC(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_UHMAC_SHIFT)) & ELS_ELS_KS7_KS7_UHMAC_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_UKWK_MASK                (0x400000U)\r\n#define ELS_ELS_KS7_KS7_UKWK_SHIFT               (22U)\r\n/*! KS7_UKWK - Key wrapping key */\r\n#define ELS_ELS_KS7_KS7_UKWK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_UKWK_SHIFT)) & ELS_ELS_KS7_KS7_UKWK_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_UKUOK_MASK               (0x800000U)\r\n#define ELS_ELS_KS7_KS7_UKUOK_SHIFT              (23U)\r\n/*! KS7_UKUOK - Key unwrapping key */\r\n#define ELS_ELS_KS7_KS7_UKUOK(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_UKUOK_SHIFT)) & ELS_ELS_KS7_KS7_UKUOK_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_UTLSPMS_MASK             (0x1000000U)\r\n#define ELS_ELS_KS7_KS7_UTLSPMS_SHIFT            (24U)\r\n/*! KS7_UTLSPMS - TLS Pre Master Secret */\r\n#define ELS_ELS_KS7_KS7_UTLSPMS(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_UTLSPMS_SHIFT)) & ELS_ELS_KS7_KS7_UTLSPMS_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_UTLSMS_MASK              (0x2000000U)\r\n#define ELS_ELS_KS7_KS7_UTLSMS_SHIFT             (25U)\r\n/*! KS7_UTLSMS - TLS Master Secret */\r\n#define ELS_ELS_KS7_KS7_UTLSMS(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_UTLSMS_SHIFT)) & ELS_ELS_KS7_KS7_UTLSMS_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_UKGSRC_MASK              (0x4000000U)\r\n#define ELS_ELS_KS7_KS7_UKGSRC_SHIFT             (26U)\r\n/*! KS7_UKGSRC - Supply KEYGEN source */\r\n#define ELS_ELS_KS7_KS7_UKGSRC(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_UKGSRC_SHIFT)) & ELS_ELS_KS7_KS7_UKGSRC_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_UHWO_MASK                (0x8000000U)\r\n#define ELS_ELS_KS7_KS7_UHWO_SHIFT               (27U)\r\n/*! KS7_UHWO - Hardware out key */\r\n#define ELS_ELS_KS7_KS7_UHWO(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_UHWO_SHIFT)) & ELS_ELS_KS7_KS7_UHWO_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_UWRPOK_MASK              (0x10000000U)\r\n#define ELS_ELS_KS7_KS7_UWRPOK_SHIFT             (28U)\r\n/*! KS7_UWRPOK - Ok to wrap key */\r\n#define ELS_ELS_KS7_KS7_UWRPOK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_UWRPOK_SHIFT)) & ELS_ELS_KS7_KS7_UWRPOK_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_UDUK_MASK                (0x20000000U)\r\n#define ELS_ELS_KS7_KS7_UDUK_SHIFT               (29U)\r\n/*! KS7_UDUK - Device Unique Key */\r\n#define ELS_ELS_KS7_KS7_UDUK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_UDUK_SHIFT)) & ELS_ELS_KS7_KS7_UDUK_MASK)\r\n\r\n#define ELS_ELS_KS7_KS7_UPPROT_MASK              (0xC0000000U)\r\n#define ELS_ELS_KS7_KS7_UPPROT_SHIFT             (30U)\r\n/*! KS7_UPPROT - Priviledge level */\r\n#define ELS_ELS_KS7_KS7_UPPROT(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS7_KS7_UPPROT_SHIFT)) & ELS_ELS_KS7_KS7_UPPROT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KS8 - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KS8_KS8_KSIZE_MASK               (0x1U)\r\n#define ELS_ELS_KS8_KS8_KSIZE_SHIFT              (0U)\r\n/*! KS8_KSIZE - Key size: 0-128, 1-256 */\r\n#define ELS_ELS_KS8_KS8_KSIZE(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_KSIZE_SHIFT)) & ELS_ELS_KS8_KS8_KSIZE_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_RSVD0_MASK               (0x1EU)\r\n#define ELS_ELS_KS8_KS8_RSVD0_SHIFT              (1U)\r\n/*! KS8_RSVD0 - Reserved 0 */\r\n#define ELS_ELS_KS8_KS8_RSVD0(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_RSVD0_SHIFT)) & ELS_ELS_KS8_KS8_RSVD0_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_KACT_MASK                (0x20U)\r\n#define ELS_ELS_KS8_KS8_KACT_SHIFT               (5U)\r\n/*! KS8_KACT - Key is active */\r\n#define ELS_ELS_KS8_KS8_KACT(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_KACT_SHIFT)) & ELS_ELS_KS8_KS8_KACT_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_KBASE_MASK               (0x40U)\r\n#define ELS_ELS_KS8_KS8_KBASE_SHIFT              (6U)\r\n/*! KS8_KBASE - First slot in a multislot key */\r\n#define ELS_ELS_KS8_KS8_KBASE(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_KBASE_SHIFT)) & ELS_ELS_KS8_KS8_KBASE_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_FGP_MASK                 (0x80U)\r\n#define ELS_ELS_KS8_KS8_FGP_SHIFT                (7U)\r\n/*! KS8_FGP - Hardware Feature General Purpose */\r\n#define ELS_ELS_KS8_KS8_FGP(x)                   (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_FGP_SHIFT)) & ELS_ELS_KS8_KS8_FGP_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_FRTN_MASK                (0x100U)\r\n#define ELS_ELS_KS8_KS8_FRTN_SHIFT               (8U)\r\n/*! KS8_FRTN - Hardware Feature Retention */\r\n#define ELS_ELS_KS8_KS8_FRTN(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_FRTN_SHIFT)) & ELS_ELS_KS8_KS8_FRTN_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_FHWO_MASK                (0x200U)\r\n#define ELS_ELS_KS8_KS8_FHWO_SHIFT               (9U)\r\n/*! KS8_FHWO - Hardware Feature Output */\r\n#define ELS_ELS_KS8_KS8_FHWO(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_FHWO_SHIFT)) & ELS_ELS_KS8_KS8_FHWO_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_RSVD1_MASK               (0x1C00U)\r\n#define ELS_ELS_KS8_KS8_RSVD1_SHIFT              (10U)\r\n/*! KS8_RSVD1 - Reserved 1 */\r\n#define ELS_ELS_KS8_KS8_RSVD1(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_RSVD1_SHIFT)) & ELS_ELS_KS8_KS8_RSVD1_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_UCMAC_MASK               (0x2000U)\r\n#define ELS_ELS_KS8_KS8_UCMAC_SHIFT              (13U)\r\n/*! KS8_UCMAC - CMAC key */\r\n#define ELS_ELS_KS8_KS8_UCMAC(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_UCMAC_SHIFT)) & ELS_ELS_KS8_KS8_UCMAC_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_UKSK_MASK                (0x4000U)\r\n#define ELS_ELS_KS8_KS8_UKSK_SHIFT               (14U)\r\n/*! KS8_UKSK - KSK key */\r\n#define ELS_ELS_KS8_KS8_UKSK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_UKSK_SHIFT)) & ELS_ELS_KS8_KS8_UKSK_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_URTF_MASK                (0x8000U)\r\n#define ELS_ELS_KS8_KS8_URTF_SHIFT               (15U)\r\n/*! KS8_URTF - Real Time Fingerprint key */\r\n#define ELS_ELS_KS8_KS8_URTF(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_URTF_SHIFT)) & ELS_ELS_KS8_KS8_URTF_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_UCKDF_MASK               (0x10000U)\r\n#define ELS_ELS_KS8_KS8_UCKDF_SHIFT              (16U)\r\n/*! KS8_UCKDF - Derivation key for CKDF command */\r\n#define ELS_ELS_KS8_KS8_UCKDF(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_UCKDF_SHIFT)) & ELS_ELS_KS8_KS8_UCKDF_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_UHKDF_MASK               (0x20000U)\r\n#define ELS_ELS_KS8_KS8_UHKDF_SHIFT              (17U)\r\n/*! KS8_UHKDF - Derivation key for HKDF command */\r\n#define ELS_ELS_KS8_KS8_UHKDF(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_UHKDF_SHIFT)) & ELS_ELS_KS8_KS8_UHKDF_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_UECSG_MASK               (0x40000U)\r\n#define ELS_ELS_KS8_KS8_UECSG_SHIFT              (18U)\r\n/*! KS8_UECSG - Ecc signing key */\r\n#define ELS_ELS_KS8_KS8_UECSG(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_UECSG_SHIFT)) & ELS_ELS_KS8_KS8_UECSG_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_UECDH_MASK               (0x80000U)\r\n#define ELS_ELS_KS8_KS8_UECDH_SHIFT              (19U)\r\n/*! KS8_UECDH - Ecc diffie hellman key */\r\n#define ELS_ELS_KS8_KS8_UECDH(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_UECDH_SHIFT)) & ELS_ELS_KS8_KS8_UECDH_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_UAES_MASK                (0x100000U)\r\n#define ELS_ELS_KS8_KS8_UAES_SHIFT               (20U)\r\n/*! KS8_UAES - Aes key */\r\n#define ELS_ELS_KS8_KS8_UAES(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_UAES_SHIFT)) & ELS_ELS_KS8_KS8_UAES_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_UHMAC_MASK               (0x200000U)\r\n#define ELS_ELS_KS8_KS8_UHMAC_SHIFT              (21U)\r\n/*! KS8_UHMAC - Hmac key */\r\n#define ELS_ELS_KS8_KS8_UHMAC(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_UHMAC_SHIFT)) & ELS_ELS_KS8_KS8_UHMAC_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_UKWK_MASK                (0x400000U)\r\n#define ELS_ELS_KS8_KS8_UKWK_SHIFT               (22U)\r\n/*! KS8_UKWK - Key wrapping key */\r\n#define ELS_ELS_KS8_KS8_UKWK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_UKWK_SHIFT)) & ELS_ELS_KS8_KS8_UKWK_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_UKUOK_MASK               (0x800000U)\r\n#define ELS_ELS_KS8_KS8_UKUOK_SHIFT              (23U)\r\n/*! KS8_UKUOK - Key unwrapping key */\r\n#define ELS_ELS_KS8_KS8_UKUOK(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_UKUOK_SHIFT)) & ELS_ELS_KS8_KS8_UKUOK_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_UTLSPMS_MASK             (0x1000000U)\r\n#define ELS_ELS_KS8_KS8_UTLSPMS_SHIFT            (24U)\r\n/*! KS8_UTLSPMS - TLS Pre Master Secret */\r\n#define ELS_ELS_KS8_KS8_UTLSPMS(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_UTLSPMS_SHIFT)) & ELS_ELS_KS8_KS8_UTLSPMS_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_UTLSMS_MASK              (0x2000000U)\r\n#define ELS_ELS_KS8_KS8_UTLSMS_SHIFT             (25U)\r\n/*! KS8_UTLSMS - TLS Master Secret */\r\n#define ELS_ELS_KS8_KS8_UTLSMS(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_UTLSMS_SHIFT)) & ELS_ELS_KS8_KS8_UTLSMS_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_UKGSRC_MASK              (0x4000000U)\r\n#define ELS_ELS_KS8_KS8_UKGSRC_SHIFT             (26U)\r\n/*! KS8_UKGSRC - Supply KEYGEN source */\r\n#define ELS_ELS_KS8_KS8_UKGSRC(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_UKGSRC_SHIFT)) & ELS_ELS_KS8_KS8_UKGSRC_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_UHWO_MASK                (0x8000000U)\r\n#define ELS_ELS_KS8_KS8_UHWO_SHIFT               (27U)\r\n/*! KS8_UHWO - Hardware out key */\r\n#define ELS_ELS_KS8_KS8_UHWO(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_UHWO_SHIFT)) & ELS_ELS_KS8_KS8_UHWO_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_UWRPOK_MASK              (0x10000000U)\r\n#define ELS_ELS_KS8_KS8_UWRPOK_SHIFT             (28U)\r\n/*! KS8_UWRPOK - Ok to wrap key */\r\n#define ELS_ELS_KS8_KS8_UWRPOK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_UWRPOK_SHIFT)) & ELS_ELS_KS8_KS8_UWRPOK_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_UDUK_MASK                (0x20000000U)\r\n#define ELS_ELS_KS8_KS8_UDUK_SHIFT               (29U)\r\n/*! KS8_UDUK - Device Unique Key */\r\n#define ELS_ELS_KS8_KS8_UDUK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_UDUK_SHIFT)) & ELS_ELS_KS8_KS8_UDUK_MASK)\r\n\r\n#define ELS_ELS_KS8_KS8_UPPROT_MASK              (0xC0000000U)\r\n#define ELS_ELS_KS8_KS8_UPPROT_SHIFT             (30U)\r\n/*! KS8_UPPROT - Priviledge level */\r\n#define ELS_ELS_KS8_KS8_UPPROT(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS8_KS8_UPPROT_SHIFT)) & ELS_ELS_KS8_KS8_UPPROT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KS9 - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KS9_KS9_KSIZE_MASK               (0x1U)\r\n#define ELS_ELS_KS9_KS9_KSIZE_SHIFT              (0U)\r\n/*! KS9_KSIZE - Key size: 0-128, 1-256 */\r\n#define ELS_ELS_KS9_KS9_KSIZE(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_KSIZE_SHIFT)) & ELS_ELS_KS9_KS9_KSIZE_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_RSVD0_MASK               (0x1EU)\r\n#define ELS_ELS_KS9_KS9_RSVD0_SHIFT              (1U)\r\n/*! KS9_RSVD0 - Reserved 0 */\r\n#define ELS_ELS_KS9_KS9_RSVD0(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_RSVD0_SHIFT)) & ELS_ELS_KS9_KS9_RSVD0_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_KACT_MASK                (0x20U)\r\n#define ELS_ELS_KS9_KS9_KACT_SHIFT               (5U)\r\n/*! KS9_KACT - Key is active */\r\n#define ELS_ELS_KS9_KS9_KACT(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_KACT_SHIFT)) & ELS_ELS_KS9_KS9_KACT_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_KBASE_MASK               (0x40U)\r\n#define ELS_ELS_KS9_KS9_KBASE_SHIFT              (6U)\r\n/*! KS9_KBASE - First slot in a multislot key */\r\n#define ELS_ELS_KS9_KS9_KBASE(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_KBASE_SHIFT)) & ELS_ELS_KS9_KS9_KBASE_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_FGP_MASK                 (0x80U)\r\n#define ELS_ELS_KS9_KS9_FGP_SHIFT                (7U)\r\n/*! KS9_FGP - Hardware Feature General Purpose */\r\n#define ELS_ELS_KS9_KS9_FGP(x)                   (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_FGP_SHIFT)) & ELS_ELS_KS9_KS9_FGP_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_FRTN_MASK                (0x100U)\r\n#define ELS_ELS_KS9_KS9_FRTN_SHIFT               (8U)\r\n/*! KS9_FRTN - Hardware Feature Retention */\r\n#define ELS_ELS_KS9_KS9_FRTN(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_FRTN_SHIFT)) & ELS_ELS_KS9_KS9_FRTN_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_FHWO_MASK                (0x200U)\r\n#define ELS_ELS_KS9_KS9_FHWO_SHIFT               (9U)\r\n/*! KS9_FHWO - Hardware Feature Output */\r\n#define ELS_ELS_KS9_KS9_FHWO(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_FHWO_SHIFT)) & ELS_ELS_KS9_KS9_FHWO_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_RSVD1_MASK               (0x1C00U)\r\n#define ELS_ELS_KS9_KS9_RSVD1_SHIFT              (10U)\r\n/*! KS9_RSVD1 - Reserved 1 */\r\n#define ELS_ELS_KS9_KS9_RSVD1(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_RSVD1_SHIFT)) & ELS_ELS_KS9_KS9_RSVD1_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_UCMAC_MASK               (0x2000U)\r\n#define ELS_ELS_KS9_KS9_UCMAC_SHIFT              (13U)\r\n/*! KS9_UCMAC - CMAC key */\r\n#define ELS_ELS_KS9_KS9_UCMAC(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_UCMAC_SHIFT)) & ELS_ELS_KS9_KS9_UCMAC_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_UKSK_MASK                (0x4000U)\r\n#define ELS_ELS_KS9_KS9_UKSK_SHIFT               (14U)\r\n/*! KS9_UKSK - KSK key */\r\n#define ELS_ELS_KS9_KS9_UKSK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_UKSK_SHIFT)) & ELS_ELS_KS9_KS9_UKSK_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_URTF_MASK                (0x8000U)\r\n#define ELS_ELS_KS9_KS9_URTF_SHIFT               (15U)\r\n/*! KS9_URTF - Real Time Fingerprint key */\r\n#define ELS_ELS_KS9_KS9_URTF(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_URTF_SHIFT)) & ELS_ELS_KS9_KS9_URTF_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_UCKDF_MASK               (0x10000U)\r\n#define ELS_ELS_KS9_KS9_UCKDF_SHIFT              (16U)\r\n/*! KS9_UCKDF - Derivation key for CKDF command */\r\n#define ELS_ELS_KS9_KS9_UCKDF(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_UCKDF_SHIFT)) & ELS_ELS_KS9_KS9_UCKDF_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_UHKDF_MASK               (0x20000U)\r\n#define ELS_ELS_KS9_KS9_UHKDF_SHIFT              (17U)\r\n/*! KS9_UHKDF - Derivation key for HKDF command */\r\n#define ELS_ELS_KS9_KS9_UHKDF(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_UHKDF_SHIFT)) & ELS_ELS_KS9_KS9_UHKDF_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_UECSG_MASK               (0x40000U)\r\n#define ELS_ELS_KS9_KS9_UECSG_SHIFT              (18U)\r\n/*! KS9_UECSG - Ecc signing key */\r\n#define ELS_ELS_KS9_KS9_UECSG(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_UECSG_SHIFT)) & ELS_ELS_KS9_KS9_UECSG_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_UECDH_MASK               (0x80000U)\r\n#define ELS_ELS_KS9_KS9_UECDH_SHIFT              (19U)\r\n/*! KS9_UECDH - Ecc diffie hellman key */\r\n#define ELS_ELS_KS9_KS9_UECDH(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_UECDH_SHIFT)) & ELS_ELS_KS9_KS9_UECDH_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_UAES_MASK                (0x100000U)\r\n#define ELS_ELS_KS9_KS9_UAES_SHIFT               (20U)\r\n/*! KS9_UAES - Aes key */\r\n#define ELS_ELS_KS9_KS9_UAES(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_UAES_SHIFT)) & ELS_ELS_KS9_KS9_UAES_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_UHMAC_MASK               (0x200000U)\r\n#define ELS_ELS_KS9_KS9_UHMAC_SHIFT              (21U)\r\n/*! KS9_UHMAC - Hmac key */\r\n#define ELS_ELS_KS9_KS9_UHMAC(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_UHMAC_SHIFT)) & ELS_ELS_KS9_KS9_UHMAC_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_UKWK_MASK                (0x400000U)\r\n#define ELS_ELS_KS9_KS9_UKWK_SHIFT               (22U)\r\n/*! KS9_UKWK - Key wrapping key */\r\n#define ELS_ELS_KS9_KS9_UKWK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_UKWK_SHIFT)) & ELS_ELS_KS9_KS9_UKWK_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_UKUOK_MASK               (0x800000U)\r\n#define ELS_ELS_KS9_KS9_UKUOK_SHIFT              (23U)\r\n/*! KS9_UKUOK - Key unwrapping key */\r\n#define ELS_ELS_KS9_KS9_UKUOK(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_UKUOK_SHIFT)) & ELS_ELS_KS9_KS9_UKUOK_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_UTLSPMS_MASK             (0x1000000U)\r\n#define ELS_ELS_KS9_KS9_UTLSPMS_SHIFT            (24U)\r\n/*! KS9_UTLSPMS - TLS Pre Master Secret */\r\n#define ELS_ELS_KS9_KS9_UTLSPMS(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_UTLSPMS_SHIFT)) & ELS_ELS_KS9_KS9_UTLSPMS_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_UTLSMS_MASK              (0x2000000U)\r\n#define ELS_ELS_KS9_KS9_UTLSMS_SHIFT             (25U)\r\n/*! KS9_UTLSMS - TLS Master Secret */\r\n#define ELS_ELS_KS9_KS9_UTLSMS(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_UTLSMS_SHIFT)) & ELS_ELS_KS9_KS9_UTLSMS_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_UKGSRC_MASK              (0x4000000U)\r\n#define ELS_ELS_KS9_KS9_UKGSRC_SHIFT             (26U)\r\n/*! KS9_UKGSRC - Supply KEYGEN source */\r\n#define ELS_ELS_KS9_KS9_UKGSRC(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_UKGSRC_SHIFT)) & ELS_ELS_KS9_KS9_UKGSRC_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_UHWO_MASK                (0x8000000U)\r\n#define ELS_ELS_KS9_KS9_UHWO_SHIFT               (27U)\r\n/*! KS9_UHWO - Hardware out key */\r\n#define ELS_ELS_KS9_KS9_UHWO(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_UHWO_SHIFT)) & ELS_ELS_KS9_KS9_UHWO_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_UWRPOK_MASK              (0x10000000U)\r\n#define ELS_ELS_KS9_KS9_UWRPOK_SHIFT             (28U)\r\n/*! KS9_UWRPOK - Ok to wrap key */\r\n#define ELS_ELS_KS9_KS9_UWRPOK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_UWRPOK_SHIFT)) & ELS_ELS_KS9_KS9_UWRPOK_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_UDUK_MASK                (0x20000000U)\r\n#define ELS_ELS_KS9_KS9_UDUK_SHIFT               (29U)\r\n/*! KS9_UDUK - Device Unique Key */\r\n#define ELS_ELS_KS9_KS9_UDUK(x)                  (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_UDUK_SHIFT)) & ELS_ELS_KS9_KS9_UDUK_MASK)\r\n\r\n#define ELS_ELS_KS9_KS9_UPPROT_MASK              (0xC0000000U)\r\n#define ELS_ELS_KS9_KS9_UPPROT_SHIFT             (30U)\r\n/*! KS9_UPPROT - Priviledge level */\r\n#define ELS_ELS_KS9_KS9_UPPROT(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS9_KS9_UPPROT_SHIFT)) & ELS_ELS_KS9_KS9_UPPROT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KS10 - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KS10_KS10_KSIZE_MASK             (0x1U)\r\n#define ELS_ELS_KS10_KS10_KSIZE_SHIFT            (0U)\r\n/*! KS10_KSIZE - Key size: 0-128, 1-256 */\r\n#define ELS_ELS_KS10_KS10_KSIZE(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_KSIZE_SHIFT)) & ELS_ELS_KS10_KS10_KSIZE_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_RSVD0_MASK             (0x1EU)\r\n#define ELS_ELS_KS10_KS10_RSVD0_SHIFT            (1U)\r\n/*! KS10_RSVD0 - Reserved 0 */\r\n#define ELS_ELS_KS10_KS10_RSVD0(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_RSVD0_SHIFT)) & ELS_ELS_KS10_KS10_RSVD0_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_KACT_MASK              (0x20U)\r\n#define ELS_ELS_KS10_KS10_KACT_SHIFT             (5U)\r\n/*! KS10_KACT - Key is active */\r\n#define ELS_ELS_KS10_KS10_KACT(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_KACT_SHIFT)) & ELS_ELS_KS10_KS10_KACT_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_KBASE_MASK             (0x40U)\r\n#define ELS_ELS_KS10_KS10_KBASE_SHIFT            (6U)\r\n/*! KS10_KBASE - First slot in a multislot key */\r\n#define ELS_ELS_KS10_KS10_KBASE(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_KBASE_SHIFT)) & ELS_ELS_KS10_KS10_KBASE_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_FGP_MASK               (0x80U)\r\n#define ELS_ELS_KS10_KS10_FGP_SHIFT              (7U)\r\n/*! KS10_FGP - Hardware Feature General Purpose */\r\n#define ELS_ELS_KS10_KS10_FGP(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_FGP_SHIFT)) & ELS_ELS_KS10_KS10_FGP_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_FRTN_MASK              (0x100U)\r\n#define ELS_ELS_KS10_KS10_FRTN_SHIFT             (8U)\r\n/*! KS10_FRTN - Hardware Feature Retention */\r\n#define ELS_ELS_KS10_KS10_FRTN(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_FRTN_SHIFT)) & ELS_ELS_KS10_KS10_FRTN_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_FHWO_MASK              (0x200U)\r\n#define ELS_ELS_KS10_KS10_FHWO_SHIFT             (9U)\r\n/*! KS10_FHWO - Hardware Feature Output */\r\n#define ELS_ELS_KS10_KS10_FHWO(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_FHWO_SHIFT)) & ELS_ELS_KS10_KS10_FHWO_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_RSVD1_MASK             (0x1C00U)\r\n#define ELS_ELS_KS10_KS10_RSVD1_SHIFT            (10U)\r\n/*! KS10_RSVD1 - Reserved 1 */\r\n#define ELS_ELS_KS10_KS10_RSVD1(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_RSVD1_SHIFT)) & ELS_ELS_KS10_KS10_RSVD1_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_UCMAC_MASK             (0x2000U)\r\n#define ELS_ELS_KS10_KS10_UCMAC_SHIFT            (13U)\r\n/*! KS10_UCMAC - CMAC key */\r\n#define ELS_ELS_KS10_KS10_UCMAC(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_UCMAC_SHIFT)) & ELS_ELS_KS10_KS10_UCMAC_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_UKSK_MASK              (0x4000U)\r\n#define ELS_ELS_KS10_KS10_UKSK_SHIFT             (14U)\r\n/*! KS10_UKSK - KSK key */\r\n#define ELS_ELS_KS10_KS10_UKSK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_UKSK_SHIFT)) & ELS_ELS_KS10_KS10_UKSK_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_URTF_MASK              (0x8000U)\r\n#define ELS_ELS_KS10_KS10_URTF_SHIFT             (15U)\r\n/*! KS10_URTF - Real Time Fingerprint key */\r\n#define ELS_ELS_KS10_KS10_URTF(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_URTF_SHIFT)) & ELS_ELS_KS10_KS10_URTF_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_UCKDF_MASK             (0x10000U)\r\n#define ELS_ELS_KS10_KS10_UCKDF_SHIFT            (16U)\r\n/*! KS10_UCKDF - Derivation key for CKDF command */\r\n#define ELS_ELS_KS10_KS10_UCKDF(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_UCKDF_SHIFT)) & ELS_ELS_KS10_KS10_UCKDF_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_UHKDF_MASK             (0x20000U)\r\n#define ELS_ELS_KS10_KS10_UHKDF_SHIFT            (17U)\r\n/*! KS10_UHKDF - Derivation key for HKDF command */\r\n#define ELS_ELS_KS10_KS10_UHKDF(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_UHKDF_SHIFT)) & ELS_ELS_KS10_KS10_UHKDF_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_UECSG_MASK             (0x40000U)\r\n#define ELS_ELS_KS10_KS10_UECSG_SHIFT            (18U)\r\n/*! KS10_UECSG - Ecc signing key */\r\n#define ELS_ELS_KS10_KS10_UECSG(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_UECSG_SHIFT)) & ELS_ELS_KS10_KS10_UECSG_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_UECDH_MASK             (0x80000U)\r\n#define ELS_ELS_KS10_KS10_UECDH_SHIFT            (19U)\r\n/*! KS10_UECDH - Ecc diffie hellman key */\r\n#define ELS_ELS_KS10_KS10_UECDH(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_UECDH_SHIFT)) & ELS_ELS_KS10_KS10_UECDH_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_UAES_MASK              (0x100000U)\r\n#define ELS_ELS_KS10_KS10_UAES_SHIFT             (20U)\r\n/*! KS10_UAES - Aes key */\r\n#define ELS_ELS_KS10_KS10_UAES(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_UAES_SHIFT)) & ELS_ELS_KS10_KS10_UAES_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_UHMAC_MASK             (0x200000U)\r\n#define ELS_ELS_KS10_KS10_UHMAC_SHIFT            (21U)\r\n/*! KS10_UHMAC - Hmac key */\r\n#define ELS_ELS_KS10_KS10_UHMAC(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_UHMAC_SHIFT)) & ELS_ELS_KS10_KS10_UHMAC_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_UKWK_MASK              (0x400000U)\r\n#define ELS_ELS_KS10_KS10_UKWK_SHIFT             (22U)\r\n/*! KS10_UKWK - Key wrapping key */\r\n#define ELS_ELS_KS10_KS10_UKWK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_UKWK_SHIFT)) & ELS_ELS_KS10_KS10_UKWK_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_UKUOK_MASK             (0x800000U)\r\n#define ELS_ELS_KS10_KS10_UKUOK_SHIFT            (23U)\r\n/*! KS10_UKUOK - Key unwrapping key */\r\n#define ELS_ELS_KS10_KS10_UKUOK(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_UKUOK_SHIFT)) & ELS_ELS_KS10_KS10_UKUOK_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_UTLSPMS_MASK           (0x1000000U)\r\n#define ELS_ELS_KS10_KS10_UTLSPMS_SHIFT          (24U)\r\n/*! KS10_UTLSPMS - TLS Pre Master Secret */\r\n#define ELS_ELS_KS10_KS10_UTLSPMS(x)             (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_UTLSPMS_SHIFT)) & ELS_ELS_KS10_KS10_UTLSPMS_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_UTLSMS_MASK            (0x2000000U)\r\n#define ELS_ELS_KS10_KS10_UTLSMS_SHIFT           (25U)\r\n/*! KS10_UTLSMS - TLS Master Secret */\r\n#define ELS_ELS_KS10_KS10_UTLSMS(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_UTLSMS_SHIFT)) & ELS_ELS_KS10_KS10_UTLSMS_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_UKGSRC_MASK            (0x4000000U)\r\n#define ELS_ELS_KS10_KS10_UKGSRC_SHIFT           (26U)\r\n/*! KS10_UKGSRC - Supply KEYGEN source */\r\n#define ELS_ELS_KS10_KS10_UKGSRC(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_UKGSRC_SHIFT)) & ELS_ELS_KS10_KS10_UKGSRC_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_UHWO_MASK              (0x8000000U)\r\n#define ELS_ELS_KS10_KS10_UHWO_SHIFT             (27U)\r\n/*! KS10_UHWO - Hardware out key */\r\n#define ELS_ELS_KS10_KS10_UHWO(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_UHWO_SHIFT)) & ELS_ELS_KS10_KS10_UHWO_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_UWRPOK_MASK            (0x10000000U)\r\n#define ELS_ELS_KS10_KS10_UWRPOK_SHIFT           (28U)\r\n/*! KS10_UWRPOK - Ok to wrap key */\r\n#define ELS_ELS_KS10_KS10_UWRPOK(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_UWRPOK_SHIFT)) & ELS_ELS_KS10_KS10_UWRPOK_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_UDUK_MASK              (0x20000000U)\r\n#define ELS_ELS_KS10_KS10_UDUK_SHIFT             (29U)\r\n/*! KS10_UDUK - Device Unique Key */\r\n#define ELS_ELS_KS10_KS10_UDUK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_UDUK_SHIFT)) & ELS_ELS_KS10_KS10_UDUK_MASK)\r\n\r\n#define ELS_ELS_KS10_KS10_UPPROT_MASK            (0xC0000000U)\r\n#define ELS_ELS_KS10_KS10_UPPROT_SHIFT           (30U)\r\n/*! KS10_UPPROT - Priviledge level */\r\n#define ELS_ELS_KS10_KS10_UPPROT(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS10_KS10_UPPROT_SHIFT)) & ELS_ELS_KS10_KS10_UPPROT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KS11 - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KS11_KS11_KSIZE_MASK             (0x1U)\r\n#define ELS_ELS_KS11_KS11_KSIZE_SHIFT            (0U)\r\n/*! KS11_KSIZE - Key size: 0-128, 1-256 */\r\n#define ELS_ELS_KS11_KS11_KSIZE(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_KSIZE_SHIFT)) & ELS_ELS_KS11_KS11_KSIZE_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_RSVD0_MASK             (0x1EU)\r\n#define ELS_ELS_KS11_KS11_RSVD0_SHIFT            (1U)\r\n/*! KS11_RSVD0 - Reserved 0 */\r\n#define ELS_ELS_KS11_KS11_RSVD0(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_RSVD0_SHIFT)) & ELS_ELS_KS11_KS11_RSVD0_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_KACT_MASK              (0x20U)\r\n#define ELS_ELS_KS11_KS11_KACT_SHIFT             (5U)\r\n/*! KS11_KACT - Key is active */\r\n#define ELS_ELS_KS11_KS11_KACT(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_KACT_SHIFT)) & ELS_ELS_KS11_KS11_KACT_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_KBASE_MASK             (0x40U)\r\n#define ELS_ELS_KS11_KS11_KBASE_SHIFT            (6U)\r\n/*! KS11_KBASE - First slot in a multislot key */\r\n#define ELS_ELS_KS11_KS11_KBASE(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_KBASE_SHIFT)) & ELS_ELS_KS11_KS11_KBASE_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_FGP_MASK               (0x80U)\r\n#define ELS_ELS_KS11_KS11_FGP_SHIFT              (7U)\r\n/*! KS11_FGP - Hardware Feature General Purpose */\r\n#define ELS_ELS_KS11_KS11_FGP(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_FGP_SHIFT)) & ELS_ELS_KS11_KS11_FGP_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_FRTN_MASK              (0x100U)\r\n#define ELS_ELS_KS11_KS11_FRTN_SHIFT             (8U)\r\n/*! KS11_FRTN - Hardware Feature Retention */\r\n#define ELS_ELS_KS11_KS11_FRTN(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_FRTN_SHIFT)) & ELS_ELS_KS11_KS11_FRTN_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_FHWO_MASK              (0x200U)\r\n#define ELS_ELS_KS11_KS11_FHWO_SHIFT             (9U)\r\n/*! KS11_FHWO - Hardware Feature Output */\r\n#define ELS_ELS_KS11_KS11_FHWO(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_FHWO_SHIFT)) & ELS_ELS_KS11_KS11_FHWO_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_RSVD1_MASK             (0x1C00U)\r\n#define ELS_ELS_KS11_KS11_RSVD1_SHIFT            (10U)\r\n/*! KS11_RSVD1 - Reserved 1 */\r\n#define ELS_ELS_KS11_KS11_RSVD1(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_RSVD1_SHIFT)) & ELS_ELS_KS11_KS11_RSVD1_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_UCMAC_MASK             (0x2000U)\r\n#define ELS_ELS_KS11_KS11_UCMAC_SHIFT            (13U)\r\n/*! KS11_UCMAC - CMAC key */\r\n#define ELS_ELS_KS11_KS11_UCMAC(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_UCMAC_SHIFT)) & ELS_ELS_KS11_KS11_UCMAC_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_UKSK_MASK              (0x4000U)\r\n#define ELS_ELS_KS11_KS11_UKSK_SHIFT             (14U)\r\n/*! KS11_UKSK - KSK key */\r\n#define ELS_ELS_KS11_KS11_UKSK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_UKSK_SHIFT)) & ELS_ELS_KS11_KS11_UKSK_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_URTF_MASK              (0x8000U)\r\n#define ELS_ELS_KS11_KS11_URTF_SHIFT             (15U)\r\n/*! KS11_URTF - Real Time Fingerprint key */\r\n#define ELS_ELS_KS11_KS11_URTF(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_URTF_SHIFT)) & ELS_ELS_KS11_KS11_URTF_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_UCKDF_MASK             (0x10000U)\r\n#define ELS_ELS_KS11_KS11_UCKDF_SHIFT            (16U)\r\n/*! KS11_UCKDF - Derivation key for CKDF command */\r\n#define ELS_ELS_KS11_KS11_UCKDF(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_UCKDF_SHIFT)) & ELS_ELS_KS11_KS11_UCKDF_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_UHKDF_MASK             (0x20000U)\r\n#define ELS_ELS_KS11_KS11_UHKDF_SHIFT            (17U)\r\n/*! KS11_UHKDF - Derivation key for HKDF command */\r\n#define ELS_ELS_KS11_KS11_UHKDF(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_UHKDF_SHIFT)) & ELS_ELS_KS11_KS11_UHKDF_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_UECSG_MASK             (0x40000U)\r\n#define ELS_ELS_KS11_KS11_UECSG_SHIFT            (18U)\r\n/*! KS11_UECSG - Ecc signing key */\r\n#define ELS_ELS_KS11_KS11_UECSG(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_UECSG_SHIFT)) & ELS_ELS_KS11_KS11_UECSG_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_UECDH_MASK             (0x80000U)\r\n#define ELS_ELS_KS11_KS11_UECDH_SHIFT            (19U)\r\n/*! KS11_UECDH - Ecc diffie hellman key */\r\n#define ELS_ELS_KS11_KS11_UECDH(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_UECDH_SHIFT)) & ELS_ELS_KS11_KS11_UECDH_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_UAES_MASK              (0x100000U)\r\n#define ELS_ELS_KS11_KS11_UAES_SHIFT             (20U)\r\n/*! KS11_UAES - Aes key */\r\n#define ELS_ELS_KS11_KS11_UAES(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_UAES_SHIFT)) & ELS_ELS_KS11_KS11_UAES_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_UHMAC_MASK             (0x200000U)\r\n#define ELS_ELS_KS11_KS11_UHMAC_SHIFT            (21U)\r\n/*! KS11_UHMAC - Hmac key */\r\n#define ELS_ELS_KS11_KS11_UHMAC(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_UHMAC_SHIFT)) & ELS_ELS_KS11_KS11_UHMAC_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_UKWK_MASK              (0x400000U)\r\n#define ELS_ELS_KS11_KS11_UKWK_SHIFT             (22U)\r\n/*! KS11_UKWK - Key wrapping key */\r\n#define ELS_ELS_KS11_KS11_UKWK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_UKWK_SHIFT)) & ELS_ELS_KS11_KS11_UKWK_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_UKUOK_MASK             (0x800000U)\r\n#define ELS_ELS_KS11_KS11_UKUOK_SHIFT            (23U)\r\n/*! KS11_UKUOK - Key unwrapping key */\r\n#define ELS_ELS_KS11_KS11_UKUOK(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_UKUOK_SHIFT)) & ELS_ELS_KS11_KS11_UKUOK_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_UTLSPMS_MASK           (0x1000000U)\r\n#define ELS_ELS_KS11_KS11_UTLSPMS_SHIFT          (24U)\r\n/*! KS11_UTLSPMS - TLS Pre Master Secret */\r\n#define ELS_ELS_KS11_KS11_UTLSPMS(x)             (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_UTLSPMS_SHIFT)) & ELS_ELS_KS11_KS11_UTLSPMS_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_UTLSMS_MASK            (0x2000000U)\r\n#define ELS_ELS_KS11_KS11_UTLSMS_SHIFT           (25U)\r\n/*! KS11_UTLSMS - TLS Master Secret */\r\n#define ELS_ELS_KS11_KS11_UTLSMS(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_UTLSMS_SHIFT)) & ELS_ELS_KS11_KS11_UTLSMS_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_UKGSRC_MASK            (0x4000000U)\r\n#define ELS_ELS_KS11_KS11_UKGSRC_SHIFT           (26U)\r\n/*! KS11_UKGSRC - Supply KEYGEN source */\r\n#define ELS_ELS_KS11_KS11_UKGSRC(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_UKGSRC_SHIFT)) & ELS_ELS_KS11_KS11_UKGSRC_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_UHWO_MASK              (0x8000000U)\r\n#define ELS_ELS_KS11_KS11_UHWO_SHIFT             (27U)\r\n/*! KS11_UHWO - Hardware out key */\r\n#define ELS_ELS_KS11_KS11_UHWO(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_UHWO_SHIFT)) & ELS_ELS_KS11_KS11_UHWO_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_UWRPOK_MASK            (0x10000000U)\r\n#define ELS_ELS_KS11_KS11_UWRPOK_SHIFT           (28U)\r\n/*! KS11_UWRPOK - Ok to wrap key */\r\n#define ELS_ELS_KS11_KS11_UWRPOK(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_UWRPOK_SHIFT)) & ELS_ELS_KS11_KS11_UWRPOK_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_UDUK_MASK              (0x20000000U)\r\n#define ELS_ELS_KS11_KS11_UDUK_SHIFT             (29U)\r\n/*! KS11_UDUK - Device Unique Key */\r\n#define ELS_ELS_KS11_KS11_UDUK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_UDUK_SHIFT)) & ELS_ELS_KS11_KS11_UDUK_MASK)\r\n\r\n#define ELS_ELS_KS11_KS11_UPPROT_MASK            (0xC0000000U)\r\n#define ELS_ELS_KS11_KS11_UPPROT_SHIFT           (30U)\r\n/*! KS11_UPPROT - Priviledge level */\r\n#define ELS_ELS_KS11_KS11_UPPROT(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS11_KS11_UPPROT_SHIFT)) & ELS_ELS_KS11_KS11_UPPROT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KS12 - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KS12_KS12_KSIZE_MASK             (0x1U)\r\n#define ELS_ELS_KS12_KS12_KSIZE_SHIFT            (0U)\r\n/*! KS12_KSIZE - Key size: 0-128, 1-256 */\r\n#define ELS_ELS_KS12_KS12_KSIZE(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_KSIZE_SHIFT)) & ELS_ELS_KS12_KS12_KSIZE_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_RSVD0_MASK             (0x1EU)\r\n#define ELS_ELS_KS12_KS12_RSVD0_SHIFT            (1U)\r\n/*! KS12_RSVD0 - Reserved 0 */\r\n#define ELS_ELS_KS12_KS12_RSVD0(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_RSVD0_SHIFT)) & ELS_ELS_KS12_KS12_RSVD0_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_KACT_MASK              (0x20U)\r\n#define ELS_ELS_KS12_KS12_KACT_SHIFT             (5U)\r\n/*! KS12_KACT - Key is active */\r\n#define ELS_ELS_KS12_KS12_KACT(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_KACT_SHIFT)) & ELS_ELS_KS12_KS12_KACT_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_KBASE_MASK             (0x40U)\r\n#define ELS_ELS_KS12_KS12_KBASE_SHIFT            (6U)\r\n/*! KS12_KBASE - First slot in a multislot key */\r\n#define ELS_ELS_KS12_KS12_KBASE(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_KBASE_SHIFT)) & ELS_ELS_KS12_KS12_KBASE_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_FGP_MASK               (0x80U)\r\n#define ELS_ELS_KS12_KS12_FGP_SHIFT              (7U)\r\n/*! KS12_FGP - Hardware Feature General Purpose */\r\n#define ELS_ELS_KS12_KS12_FGP(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_FGP_SHIFT)) & ELS_ELS_KS12_KS12_FGP_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_FRTN_MASK              (0x100U)\r\n#define ELS_ELS_KS12_KS12_FRTN_SHIFT             (8U)\r\n/*! KS12_FRTN - Hardware Feature Retention */\r\n#define ELS_ELS_KS12_KS12_FRTN(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_FRTN_SHIFT)) & ELS_ELS_KS12_KS12_FRTN_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_FHWO_MASK              (0x200U)\r\n#define ELS_ELS_KS12_KS12_FHWO_SHIFT             (9U)\r\n/*! KS12_FHWO - Hardware Feature Output */\r\n#define ELS_ELS_KS12_KS12_FHWO(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_FHWO_SHIFT)) & ELS_ELS_KS12_KS12_FHWO_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_RSVD1_MASK             (0x1C00U)\r\n#define ELS_ELS_KS12_KS12_RSVD1_SHIFT            (10U)\r\n/*! KS12_RSVD1 - Reserved 1 */\r\n#define ELS_ELS_KS12_KS12_RSVD1(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_RSVD1_SHIFT)) & ELS_ELS_KS12_KS12_RSVD1_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_UCMAC_MASK             (0x2000U)\r\n#define ELS_ELS_KS12_KS12_UCMAC_SHIFT            (13U)\r\n/*! KS12_UCMAC - CMAC key */\r\n#define ELS_ELS_KS12_KS12_UCMAC(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_UCMAC_SHIFT)) & ELS_ELS_KS12_KS12_UCMAC_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_UKSK_MASK              (0x4000U)\r\n#define ELS_ELS_KS12_KS12_UKSK_SHIFT             (14U)\r\n/*! KS12_UKSK - KSK key */\r\n#define ELS_ELS_KS12_KS12_UKSK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_UKSK_SHIFT)) & ELS_ELS_KS12_KS12_UKSK_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_URTF_MASK              (0x8000U)\r\n#define ELS_ELS_KS12_KS12_URTF_SHIFT             (15U)\r\n/*! KS12_URTF - Real Time Fingerprint key */\r\n#define ELS_ELS_KS12_KS12_URTF(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_URTF_SHIFT)) & ELS_ELS_KS12_KS12_URTF_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_UCKDF_MASK             (0x10000U)\r\n#define ELS_ELS_KS12_KS12_UCKDF_SHIFT            (16U)\r\n/*! KS12_UCKDF - Derivation key for CKDF command */\r\n#define ELS_ELS_KS12_KS12_UCKDF(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_UCKDF_SHIFT)) & ELS_ELS_KS12_KS12_UCKDF_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_UHKDF_MASK             (0x20000U)\r\n#define ELS_ELS_KS12_KS12_UHKDF_SHIFT            (17U)\r\n/*! KS12_UHKDF - Derivation key for HKDF command */\r\n#define ELS_ELS_KS12_KS12_UHKDF(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_UHKDF_SHIFT)) & ELS_ELS_KS12_KS12_UHKDF_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_UECSG_MASK             (0x40000U)\r\n#define ELS_ELS_KS12_KS12_UECSG_SHIFT            (18U)\r\n/*! KS12_UECSG - Ecc signing key */\r\n#define ELS_ELS_KS12_KS12_UECSG(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_UECSG_SHIFT)) & ELS_ELS_KS12_KS12_UECSG_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_UECDH_MASK             (0x80000U)\r\n#define ELS_ELS_KS12_KS12_UECDH_SHIFT            (19U)\r\n/*! KS12_UECDH - Ecc diffie hellman key */\r\n#define ELS_ELS_KS12_KS12_UECDH(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_UECDH_SHIFT)) & ELS_ELS_KS12_KS12_UECDH_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_UAES_MASK              (0x100000U)\r\n#define ELS_ELS_KS12_KS12_UAES_SHIFT             (20U)\r\n/*! KS12_UAES - Aes key */\r\n#define ELS_ELS_KS12_KS12_UAES(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_UAES_SHIFT)) & ELS_ELS_KS12_KS12_UAES_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_UHMAC_MASK             (0x200000U)\r\n#define ELS_ELS_KS12_KS12_UHMAC_SHIFT            (21U)\r\n/*! KS12_UHMAC - Hmac key */\r\n#define ELS_ELS_KS12_KS12_UHMAC(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_UHMAC_SHIFT)) & ELS_ELS_KS12_KS12_UHMAC_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_UKWK_MASK              (0x400000U)\r\n#define ELS_ELS_KS12_KS12_UKWK_SHIFT             (22U)\r\n/*! KS12_UKWK - Key wrapping key */\r\n#define ELS_ELS_KS12_KS12_UKWK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_UKWK_SHIFT)) & ELS_ELS_KS12_KS12_UKWK_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_UKUOK_MASK             (0x800000U)\r\n#define ELS_ELS_KS12_KS12_UKUOK_SHIFT            (23U)\r\n/*! KS12_UKUOK - Key unwrapping key */\r\n#define ELS_ELS_KS12_KS12_UKUOK(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_UKUOK_SHIFT)) & ELS_ELS_KS12_KS12_UKUOK_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_UTLSPMS_MASK           (0x1000000U)\r\n#define ELS_ELS_KS12_KS12_UTLSPMS_SHIFT          (24U)\r\n/*! KS12_UTLSPMS - TLS Pre Master Secret */\r\n#define ELS_ELS_KS12_KS12_UTLSPMS(x)             (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_UTLSPMS_SHIFT)) & ELS_ELS_KS12_KS12_UTLSPMS_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_UTLSMS_MASK            (0x2000000U)\r\n#define ELS_ELS_KS12_KS12_UTLSMS_SHIFT           (25U)\r\n/*! KS12_UTLSMS - TLS Master Secret */\r\n#define ELS_ELS_KS12_KS12_UTLSMS(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_UTLSMS_SHIFT)) & ELS_ELS_KS12_KS12_UTLSMS_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_UKGSRC_MASK            (0x4000000U)\r\n#define ELS_ELS_KS12_KS12_UKGSRC_SHIFT           (26U)\r\n/*! KS12_UKGSRC - Supply KEYGEN source */\r\n#define ELS_ELS_KS12_KS12_UKGSRC(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_UKGSRC_SHIFT)) & ELS_ELS_KS12_KS12_UKGSRC_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_UHWO_MASK              (0x8000000U)\r\n#define ELS_ELS_KS12_KS12_UHWO_SHIFT             (27U)\r\n/*! KS12_UHWO - Hardware out key */\r\n#define ELS_ELS_KS12_KS12_UHWO(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_UHWO_SHIFT)) & ELS_ELS_KS12_KS12_UHWO_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_UWRPOK_MASK            (0x10000000U)\r\n#define ELS_ELS_KS12_KS12_UWRPOK_SHIFT           (28U)\r\n/*! KS12_UWRPOK - Ok to wrap key */\r\n#define ELS_ELS_KS12_KS12_UWRPOK(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_UWRPOK_SHIFT)) & ELS_ELS_KS12_KS12_UWRPOK_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_UDUK_MASK              (0x20000000U)\r\n#define ELS_ELS_KS12_KS12_UDUK_SHIFT             (29U)\r\n/*! KS12_UDUK - Device Unique Key */\r\n#define ELS_ELS_KS12_KS12_UDUK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_UDUK_SHIFT)) & ELS_ELS_KS12_KS12_UDUK_MASK)\r\n\r\n#define ELS_ELS_KS12_KS12_UPPROT_MASK            (0xC0000000U)\r\n#define ELS_ELS_KS12_KS12_UPPROT_SHIFT           (30U)\r\n/*! KS12_UPPROT - Priviledge level */\r\n#define ELS_ELS_KS12_KS12_UPPROT(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS12_KS12_UPPROT_SHIFT)) & ELS_ELS_KS12_KS12_UPPROT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KS13 - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KS13_KS13_KSIZE_MASK             (0x1U)\r\n#define ELS_ELS_KS13_KS13_KSIZE_SHIFT            (0U)\r\n/*! KS13_KSIZE - Key size: 0-128, 1-256 */\r\n#define ELS_ELS_KS13_KS13_KSIZE(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_KSIZE_SHIFT)) & ELS_ELS_KS13_KS13_KSIZE_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_RSVD0_MASK             (0x1EU)\r\n#define ELS_ELS_KS13_KS13_RSVD0_SHIFT            (1U)\r\n/*! KS13_RSVD0 - Reserved 0 */\r\n#define ELS_ELS_KS13_KS13_RSVD0(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_RSVD0_SHIFT)) & ELS_ELS_KS13_KS13_RSVD0_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_KACT_MASK              (0x20U)\r\n#define ELS_ELS_KS13_KS13_KACT_SHIFT             (5U)\r\n/*! KS13_KACT - Key is active */\r\n#define ELS_ELS_KS13_KS13_KACT(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_KACT_SHIFT)) & ELS_ELS_KS13_KS13_KACT_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_KBASE_MASK             (0x40U)\r\n#define ELS_ELS_KS13_KS13_KBASE_SHIFT            (6U)\r\n/*! KS13_KBASE - First slot in a multislot key */\r\n#define ELS_ELS_KS13_KS13_KBASE(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_KBASE_SHIFT)) & ELS_ELS_KS13_KS13_KBASE_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_FGP_MASK               (0x80U)\r\n#define ELS_ELS_KS13_KS13_FGP_SHIFT              (7U)\r\n/*! KS13_FGP - Hardware Feature General Purpose */\r\n#define ELS_ELS_KS13_KS13_FGP(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_FGP_SHIFT)) & ELS_ELS_KS13_KS13_FGP_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_FRTN_MASK              (0x100U)\r\n#define ELS_ELS_KS13_KS13_FRTN_SHIFT             (8U)\r\n/*! KS13_FRTN - Hardware Feature Retention */\r\n#define ELS_ELS_KS13_KS13_FRTN(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_FRTN_SHIFT)) & ELS_ELS_KS13_KS13_FRTN_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_FHWO_MASK              (0x200U)\r\n#define ELS_ELS_KS13_KS13_FHWO_SHIFT             (9U)\r\n/*! KS13_FHWO - Hardware Feature Output */\r\n#define ELS_ELS_KS13_KS13_FHWO(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_FHWO_SHIFT)) & ELS_ELS_KS13_KS13_FHWO_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_RSVD1_MASK             (0x1C00U)\r\n#define ELS_ELS_KS13_KS13_RSVD1_SHIFT            (10U)\r\n/*! KS13_RSVD1 - Reserved 1 */\r\n#define ELS_ELS_KS13_KS13_RSVD1(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_RSVD1_SHIFT)) & ELS_ELS_KS13_KS13_RSVD1_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_UCMAC_MASK             (0x2000U)\r\n#define ELS_ELS_KS13_KS13_UCMAC_SHIFT            (13U)\r\n/*! KS13_UCMAC - CMAC key */\r\n#define ELS_ELS_KS13_KS13_UCMAC(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_UCMAC_SHIFT)) & ELS_ELS_KS13_KS13_UCMAC_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_UKSK_MASK              (0x4000U)\r\n#define ELS_ELS_KS13_KS13_UKSK_SHIFT             (14U)\r\n/*! KS13_UKSK - KSK key */\r\n#define ELS_ELS_KS13_KS13_UKSK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_UKSK_SHIFT)) & ELS_ELS_KS13_KS13_UKSK_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_URTF_MASK              (0x8000U)\r\n#define ELS_ELS_KS13_KS13_URTF_SHIFT             (15U)\r\n/*! KS13_URTF - Real Time Fingerprint key */\r\n#define ELS_ELS_KS13_KS13_URTF(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_URTF_SHIFT)) & ELS_ELS_KS13_KS13_URTF_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_UCKDF_MASK             (0x10000U)\r\n#define ELS_ELS_KS13_KS13_UCKDF_SHIFT            (16U)\r\n/*! KS13_UCKDF - Derivation key for CKDF command */\r\n#define ELS_ELS_KS13_KS13_UCKDF(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_UCKDF_SHIFT)) & ELS_ELS_KS13_KS13_UCKDF_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_UHKDF_MASK             (0x20000U)\r\n#define ELS_ELS_KS13_KS13_UHKDF_SHIFT            (17U)\r\n/*! KS13_UHKDF - Derivation key for HKDF command */\r\n#define ELS_ELS_KS13_KS13_UHKDF(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_UHKDF_SHIFT)) & ELS_ELS_KS13_KS13_UHKDF_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_UECSG_MASK             (0x40000U)\r\n#define ELS_ELS_KS13_KS13_UECSG_SHIFT            (18U)\r\n/*! KS13_UECSG - Ecc signing key */\r\n#define ELS_ELS_KS13_KS13_UECSG(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_UECSG_SHIFT)) & ELS_ELS_KS13_KS13_UECSG_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_UECDH_MASK             (0x80000U)\r\n#define ELS_ELS_KS13_KS13_UECDH_SHIFT            (19U)\r\n/*! KS13_UECDH - Ecc diffie hellman key */\r\n#define ELS_ELS_KS13_KS13_UECDH(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_UECDH_SHIFT)) & ELS_ELS_KS13_KS13_UECDH_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_UAES_MASK              (0x100000U)\r\n#define ELS_ELS_KS13_KS13_UAES_SHIFT             (20U)\r\n/*! KS13_UAES - Aes key */\r\n#define ELS_ELS_KS13_KS13_UAES(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_UAES_SHIFT)) & ELS_ELS_KS13_KS13_UAES_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_UHMAC_MASK             (0x200000U)\r\n#define ELS_ELS_KS13_KS13_UHMAC_SHIFT            (21U)\r\n/*! KS13_UHMAC - Hmac key */\r\n#define ELS_ELS_KS13_KS13_UHMAC(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_UHMAC_SHIFT)) & ELS_ELS_KS13_KS13_UHMAC_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_UKWK_MASK              (0x400000U)\r\n#define ELS_ELS_KS13_KS13_UKWK_SHIFT             (22U)\r\n/*! KS13_UKWK - Key wrapping key */\r\n#define ELS_ELS_KS13_KS13_UKWK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_UKWK_SHIFT)) & ELS_ELS_KS13_KS13_UKWK_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_UKUOK_MASK             (0x800000U)\r\n#define ELS_ELS_KS13_KS13_UKUOK_SHIFT            (23U)\r\n/*! KS13_UKUOK - Key unwrapping key */\r\n#define ELS_ELS_KS13_KS13_UKUOK(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_UKUOK_SHIFT)) & ELS_ELS_KS13_KS13_UKUOK_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_UTLSPMS_MASK           (0x1000000U)\r\n#define ELS_ELS_KS13_KS13_UTLSPMS_SHIFT          (24U)\r\n/*! KS13_UTLSPMS - TLS Pre Master Secret */\r\n#define ELS_ELS_KS13_KS13_UTLSPMS(x)             (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_UTLSPMS_SHIFT)) & ELS_ELS_KS13_KS13_UTLSPMS_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_UTLSMS_MASK            (0x2000000U)\r\n#define ELS_ELS_KS13_KS13_UTLSMS_SHIFT           (25U)\r\n/*! KS13_UTLSMS - TLS Master Secret */\r\n#define ELS_ELS_KS13_KS13_UTLSMS(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_UTLSMS_SHIFT)) & ELS_ELS_KS13_KS13_UTLSMS_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_UKGSRC_MASK            (0x4000000U)\r\n#define ELS_ELS_KS13_KS13_UKGSRC_SHIFT           (26U)\r\n/*! KS13_UKGSRC - Supply KEYGEN source */\r\n#define ELS_ELS_KS13_KS13_UKGSRC(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_UKGSRC_SHIFT)) & ELS_ELS_KS13_KS13_UKGSRC_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_UHWO_MASK              (0x8000000U)\r\n#define ELS_ELS_KS13_KS13_UHWO_SHIFT             (27U)\r\n/*! KS13_UHWO - Hardware out key */\r\n#define ELS_ELS_KS13_KS13_UHWO(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_UHWO_SHIFT)) & ELS_ELS_KS13_KS13_UHWO_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_UWRPOK_MASK            (0x10000000U)\r\n#define ELS_ELS_KS13_KS13_UWRPOK_SHIFT           (28U)\r\n/*! KS13_UWRPOK - Ok to wrap key */\r\n#define ELS_ELS_KS13_KS13_UWRPOK(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_UWRPOK_SHIFT)) & ELS_ELS_KS13_KS13_UWRPOK_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_UDUK_MASK              (0x20000000U)\r\n#define ELS_ELS_KS13_KS13_UDUK_SHIFT             (29U)\r\n/*! KS13_UDUK - Device Unique Key */\r\n#define ELS_ELS_KS13_KS13_UDUK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_UDUK_SHIFT)) & ELS_ELS_KS13_KS13_UDUK_MASK)\r\n\r\n#define ELS_ELS_KS13_KS13_UPPROT_MASK            (0xC0000000U)\r\n#define ELS_ELS_KS13_KS13_UPPROT_SHIFT           (30U)\r\n/*! KS13_UPPROT - Priviledge level */\r\n#define ELS_ELS_KS13_KS13_UPPROT(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS13_KS13_UPPROT_SHIFT)) & ELS_ELS_KS13_KS13_UPPROT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KS14 - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KS14_KS14_KSIZE_MASK             (0x1U)\r\n#define ELS_ELS_KS14_KS14_KSIZE_SHIFT            (0U)\r\n/*! KS14_KSIZE - Key size: 0-128, 1-256 */\r\n#define ELS_ELS_KS14_KS14_KSIZE(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_KSIZE_SHIFT)) & ELS_ELS_KS14_KS14_KSIZE_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_RSVD0_MASK             (0x1EU)\r\n#define ELS_ELS_KS14_KS14_RSVD0_SHIFT            (1U)\r\n/*! KS14_RSVD0 - Reserved 0 */\r\n#define ELS_ELS_KS14_KS14_RSVD0(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_RSVD0_SHIFT)) & ELS_ELS_KS14_KS14_RSVD0_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_KACT_MASK              (0x20U)\r\n#define ELS_ELS_KS14_KS14_KACT_SHIFT             (5U)\r\n/*! KS14_KACT - Key is active */\r\n#define ELS_ELS_KS14_KS14_KACT(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_KACT_SHIFT)) & ELS_ELS_KS14_KS14_KACT_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_KBASE_MASK             (0x40U)\r\n#define ELS_ELS_KS14_KS14_KBASE_SHIFT            (6U)\r\n/*! KS14_KBASE - First slot in a multislot key */\r\n#define ELS_ELS_KS14_KS14_KBASE(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_KBASE_SHIFT)) & ELS_ELS_KS14_KS14_KBASE_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_FGP_MASK               (0x80U)\r\n#define ELS_ELS_KS14_KS14_FGP_SHIFT              (7U)\r\n/*! KS14_FGP - Hardware Feature General Purpose */\r\n#define ELS_ELS_KS14_KS14_FGP(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_FGP_SHIFT)) & ELS_ELS_KS14_KS14_FGP_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_FRTN_MASK              (0x100U)\r\n#define ELS_ELS_KS14_KS14_FRTN_SHIFT             (8U)\r\n/*! KS14_FRTN - Hardware Feature Retention */\r\n#define ELS_ELS_KS14_KS14_FRTN(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_FRTN_SHIFT)) & ELS_ELS_KS14_KS14_FRTN_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_FHWO_MASK              (0x200U)\r\n#define ELS_ELS_KS14_KS14_FHWO_SHIFT             (9U)\r\n/*! KS14_FHWO - Hardware Feature Output */\r\n#define ELS_ELS_KS14_KS14_FHWO(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_FHWO_SHIFT)) & ELS_ELS_KS14_KS14_FHWO_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_RSVD1_MASK             (0x1C00U)\r\n#define ELS_ELS_KS14_KS14_RSVD1_SHIFT            (10U)\r\n/*! KS14_RSVD1 - Reserved 1 */\r\n#define ELS_ELS_KS14_KS14_RSVD1(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_RSVD1_SHIFT)) & ELS_ELS_KS14_KS14_RSVD1_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_UCMAC_MASK             (0x2000U)\r\n#define ELS_ELS_KS14_KS14_UCMAC_SHIFT            (13U)\r\n/*! KS14_UCMAC - CMAC key */\r\n#define ELS_ELS_KS14_KS14_UCMAC(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_UCMAC_SHIFT)) & ELS_ELS_KS14_KS14_UCMAC_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_UKSK_MASK              (0x4000U)\r\n#define ELS_ELS_KS14_KS14_UKSK_SHIFT             (14U)\r\n/*! KS14_UKSK - KSK key */\r\n#define ELS_ELS_KS14_KS14_UKSK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_UKSK_SHIFT)) & ELS_ELS_KS14_KS14_UKSK_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_URTF_MASK              (0x8000U)\r\n#define ELS_ELS_KS14_KS14_URTF_SHIFT             (15U)\r\n/*! KS14_URTF - Real Time Fingerprint key */\r\n#define ELS_ELS_KS14_KS14_URTF(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_URTF_SHIFT)) & ELS_ELS_KS14_KS14_URTF_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_UCKDF_MASK             (0x10000U)\r\n#define ELS_ELS_KS14_KS14_UCKDF_SHIFT            (16U)\r\n/*! KS14_UCKDF - Derivation key for CKDF command */\r\n#define ELS_ELS_KS14_KS14_UCKDF(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_UCKDF_SHIFT)) & ELS_ELS_KS14_KS14_UCKDF_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_UHKDF_MASK             (0x20000U)\r\n#define ELS_ELS_KS14_KS14_UHKDF_SHIFT            (17U)\r\n/*! KS14_UHKDF - Derivation key for HKDF command */\r\n#define ELS_ELS_KS14_KS14_UHKDF(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_UHKDF_SHIFT)) & ELS_ELS_KS14_KS14_UHKDF_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_UECSG_MASK             (0x40000U)\r\n#define ELS_ELS_KS14_KS14_UECSG_SHIFT            (18U)\r\n/*! KS14_UECSG - Ecc signing key */\r\n#define ELS_ELS_KS14_KS14_UECSG(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_UECSG_SHIFT)) & ELS_ELS_KS14_KS14_UECSG_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_UECDH_MASK             (0x80000U)\r\n#define ELS_ELS_KS14_KS14_UECDH_SHIFT            (19U)\r\n/*! KS14_UECDH - Ecc diffie hellman key */\r\n#define ELS_ELS_KS14_KS14_UECDH(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_UECDH_SHIFT)) & ELS_ELS_KS14_KS14_UECDH_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_UAES_MASK              (0x100000U)\r\n#define ELS_ELS_KS14_KS14_UAES_SHIFT             (20U)\r\n/*! KS14_UAES - Aes key */\r\n#define ELS_ELS_KS14_KS14_UAES(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_UAES_SHIFT)) & ELS_ELS_KS14_KS14_UAES_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_UHMAC_MASK             (0x200000U)\r\n#define ELS_ELS_KS14_KS14_UHMAC_SHIFT            (21U)\r\n/*! KS14_UHMAC - Hmac key */\r\n#define ELS_ELS_KS14_KS14_UHMAC(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_UHMAC_SHIFT)) & ELS_ELS_KS14_KS14_UHMAC_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_UKWK_MASK              (0x400000U)\r\n#define ELS_ELS_KS14_KS14_UKWK_SHIFT             (22U)\r\n/*! KS14_UKWK - Key wrapping key */\r\n#define ELS_ELS_KS14_KS14_UKWK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_UKWK_SHIFT)) & ELS_ELS_KS14_KS14_UKWK_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_UKUOK_MASK             (0x800000U)\r\n#define ELS_ELS_KS14_KS14_UKUOK_SHIFT            (23U)\r\n/*! KS14_UKUOK - Key unwrapping key */\r\n#define ELS_ELS_KS14_KS14_UKUOK(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_UKUOK_SHIFT)) & ELS_ELS_KS14_KS14_UKUOK_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_UTLSPMS_MASK           (0x1000000U)\r\n#define ELS_ELS_KS14_KS14_UTLSPMS_SHIFT          (24U)\r\n/*! KS14_UTLSPMS - TLS Pre Master Secret */\r\n#define ELS_ELS_KS14_KS14_UTLSPMS(x)             (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_UTLSPMS_SHIFT)) & ELS_ELS_KS14_KS14_UTLSPMS_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_UTLSMS_MASK            (0x2000000U)\r\n#define ELS_ELS_KS14_KS14_UTLSMS_SHIFT           (25U)\r\n/*! KS14_UTLSMS - TLS Master Secret */\r\n#define ELS_ELS_KS14_KS14_UTLSMS(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_UTLSMS_SHIFT)) & ELS_ELS_KS14_KS14_UTLSMS_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_UKGSRC_MASK            (0x4000000U)\r\n#define ELS_ELS_KS14_KS14_UKGSRC_SHIFT           (26U)\r\n/*! KS14_UKGSRC - Supply KEYGEN source */\r\n#define ELS_ELS_KS14_KS14_UKGSRC(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_UKGSRC_SHIFT)) & ELS_ELS_KS14_KS14_UKGSRC_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_UHWO_MASK              (0x8000000U)\r\n#define ELS_ELS_KS14_KS14_UHWO_SHIFT             (27U)\r\n/*! KS14_UHWO - Hardware out key */\r\n#define ELS_ELS_KS14_KS14_UHWO(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_UHWO_SHIFT)) & ELS_ELS_KS14_KS14_UHWO_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_UWRPOK_MASK            (0x10000000U)\r\n#define ELS_ELS_KS14_KS14_UWRPOK_SHIFT           (28U)\r\n/*! KS14_UWRPOK - Ok to wrap key */\r\n#define ELS_ELS_KS14_KS14_UWRPOK(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_UWRPOK_SHIFT)) & ELS_ELS_KS14_KS14_UWRPOK_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_UDUK_MASK              (0x20000000U)\r\n#define ELS_ELS_KS14_KS14_UDUK_SHIFT             (29U)\r\n/*! KS14_UDUK - Device Unique Key */\r\n#define ELS_ELS_KS14_KS14_UDUK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_UDUK_SHIFT)) & ELS_ELS_KS14_KS14_UDUK_MASK)\r\n\r\n#define ELS_ELS_KS14_KS14_UPPROT_MASK            (0xC0000000U)\r\n#define ELS_ELS_KS14_KS14_UPPROT_SHIFT           (30U)\r\n/*! KS14_UPPROT - Priviledge level */\r\n#define ELS_ELS_KS14_KS14_UPPROT(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS14_KS14_UPPROT_SHIFT)) & ELS_ELS_KS14_KS14_UPPROT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KS15 - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KS15_KS15_KSIZE_MASK             (0x1U)\r\n#define ELS_ELS_KS15_KS15_KSIZE_SHIFT            (0U)\r\n/*! KS15_KSIZE - Key size: 0-128, 1-256 */\r\n#define ELS_ELS_KS15_KS15_KSIZE(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_KSIZE_SHIFT)) & ELS_ELS_KS15_KS15_KSIZE_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_RSVD0_MASK             (0x1EU)\r\n#define ELS_ELS_KS15_KS15_RSVD0_SHIFT            (1U)\r\n/*! KS15_RSVD0 - Reserved 0 */\r\n#define ELS_ELS_KS15_KS15_RSVD0(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_RSVD0_SHIFT)) & ELS_ELS_KS15_KS15_RSVD0_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_KACT_MASK              (0x20U)\r\n#define ELS_ELS_KS15_KS15_KACT_SHIFT             (5U)\r\n/*! KS15_KACT - Key is active */\r\n#define ELS_ELS_KS15_KS15_KACT(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_KACT_SHIFT)) & ELS_ELS_KS15_KS15_KACT_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_KBASE_MASK             (0x40U)\r\n#define ELS_ELS_KS15_KS15_KBASE_SHIFT            (6U)\r\n/*! KS15_KBASE - First slot in a multislot key */\r\n#define ELS_ELS_KS15_KS15_KBASE(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_KBASE_SHIFT)) & ELS_ELS_KS15_KS15_KBASE_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_FGP_MASK               (0x80U)\r\n#define ELS_ELS_KS15_KS15_FGP_SHIFT              (7U)\r\n/*! KS15_FGP - Hardware Feature General Purpose */\r\n#define ELS_ELS_KS15_KS15_FGP(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_FGP_SHIFT)) & ELS_ELS_KS15_KS15_FGP_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_FRTN_MASK              (0x100U)\r\n#define ELS_ELS_KS15_KS15_FRTN_SHIFT             (8U)\r\n/*! KS15_FRTN - Hardware Feature Retention */\r\n#define ELS_ELS_KS15_KS15_FRTN(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_FRTN_SHIFT)) & ELS_ELS_KS15_KS15_FRTN_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_FHWO_MASK              (0x200U)\r\n#define ELS_ELS_KS15_KS15_FHWO_SHIFT             (9U)\r\n/*! KS15_FHWO - Hardware Feature Output */\r\n#define ELS_ELS_KS15_KS15_FHWO(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_FHWO_SHIFT)) & ELS_ELS_KS15_KS15_FHWO_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_RSVD1_MASK             (0x1C00U)\r\n#define ELS_ELS_KS15_KS15_RSVD1_SHIFT            (10U)\r\n/*! KS15_RSVD1 - Reserved 1 */\r\n#define ELS_ELS_KS15_KS15_RSVD1(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_RSVD1_SHIFT)) & ELS_ELS_KS15_KS15_RSVD1_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_UCMAC_MASK             (0x2000U)\r\n#define ELS_ELS_KS15_KS15_UCMAC_SHIFT            (13U)\r\n/*! KS15_UCMAC - CMAC key */\r\n#define ELS_ELS_KS15_KS15_UCMAC(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_UCMAC_SHIFT)) & ELS_ELS_KS15_KS15_UCMAC_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_UKSK_MASK              (0x4000U)\r\n#define ELS_ELS_KS15_KS15_UKSK_SHIFT             (14U)\r\n/*! KS15_UKSK - KSK key */\r\n#define ELS_ELS_KS15_KS15_UKSK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_UKSK_SHIFT)) & ELS_ELS_KS15_KS15_UKSK_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_URTF_MASK              (0x8000U)\r\n#define ELS_ELS_KS15_KS15_URTF_SHIFT             (15U)\r\n/*! KS15_URTF - Real Time Fingerprint key */\r\n#define ELS_ELS_KS15_KS15_URTF(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_URTF_SHIFT)) & ELS_ELS_KS15_KS15_URTF_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_UCKDF_MASK             (0x10000U)\r\n#define ELS_ELS_KS15_KS15_UCKDF_SHIFT            (16U)\r\n/*! KS15_UCKDF - Derivation key for CKDF command */\r\n#define ELS_ELS_KS15_KS15_UCKDF(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_UCKDF_SHIFT)) & ELS_ELS_KS15_KS15_UCKDF_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_UHKDF_MASK             (0x20000U)\r\n#define ELS_ELS_KS15_KS15_UHKDF_SHIFT            (17U)\r\n/*! KS15_UHKDF - Derivation key for HKDF command */\r\n#define ELS_ELS_KS15_KS15_UHKDF(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_UHKDF_SHIFT)) & ELS_ELS_KS15_KS15_UHKDF_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_UECSG_MASK             (0x40000U)\r\n#define ELS_ELS_KS15_KS15_UECSG_SHIFT            (18U)\r\n/*! KS15_UECSG - Ecc signing key */\r\n#define ELS_ELS_KS15_KS15_UECSG(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_UECSG_SHIFT)) & ELS_ELS_KS15_KS15_UECSG_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_UECDH_MASK             (0x80000U)\r\n#define ELS_ELS_KS15_KS15_UECDH_SHIFT            (19U)\r\n/*! KS15_UECDH - Ecc diffie hellman key */\r\n#define ELS_ELS_KS15_KS15_UECDH(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_UECDH_SHIFT)) & ELS_ELS_KS15_KS15_UECDH_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_UAES_MASK              (0x100000U)\r\n#define ELS_ELS_KS15_KS15_UAES_SHIFT             (20U)\r\n/*! KS15_UAES - Aes key */\r\n#define ELS_ELS_KS15_KS15_UAES(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_UAES_SHIFT)) & ELS_ELS_KS15_KS15_UAES_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_UHMAC_MASK             (0x200000U)\r\n#define ELS_ELS_KS15_KS15_UHMAC_SHIFT            (21U)\r\n/*! KS15_UHMAC - Hmac key */\r\n#define ELS_ELS_KS15_KS15_UHMAC(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_UHMAC_SHIFT)) & ELS_ELS_KS15_KS15_UHMAC_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_UKWK_MASK              (0x400000U)\r\n#define ELS_ELS_KS15_KS15_UKWK_SHIFT             (22U)\r\n/*! KS15_UKWK - Key wrapping key */\r\n#define ELS_ELS_KS15_KS15_UKWK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_UKWK_SHIFT)) & ELS_ELS_KS15_KS15_UKWK_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_UKUOK_MASK             (0x800000U)\r\n#define ELS_ELS_KS15_KS15_UKUOK_SHIFT            (23U)\r\n/*! KS15_UKUOK - Key unwrapping key */\r\n#define ELS_ELS_KS15_KS15_UKUOK(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_UKUOK_SHIFT)) & ELS_ELS_KS15_KS15_UKUOK_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_UTLSPMS_MASK           (0x1000000U)\r\n#define ELS_ELS_KS15_KS15_UTLSPMS_SHIFT          (24U)\r\n/*! KS15_UTLSPMS - TLS Pre Master Secret */\r\n#define ELS_ELS_KS15_KS15_UTLSPMS(x)             (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_UTLSPMS_SHIFT)) & ELS_ELS_KS15_KS15_UTLSPMS_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_UTLSMS_MASK            (0x2000000U)\r\n#define ELS_ELS_KS15_KS15_UTLSMS_SHIFT           (25U)\r\n/*! KS15_UTLSMS - TLS Master Secret */\r\n#define ELS_ELS_KS15_KS15_UTLSMS(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_UTLSMS_SHIFT)) & ELS_ELS_KS15_KS15_UTLSMS_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_UKGSRC_MASK            (0x4000000U)\r\n#define ELS_ELS_KS15_KS15_UKGSRC_SHIFT           (26U)\r\n/*! KS15_UKGSRC - Supply KEYGEN source */\r\n#define ELS_ELS_KS15_KS15_UKGSRC(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_UKGSRC_SHIFT)) & ELS_ELS_KS15_KS15_UKGSRC_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_UHWO_MASK              (0x8000000U)\r\n#define ELS_ELS_KS15_KS15_UHWO_SHIFT             (27U)\r\n/*! KS15_UHWO - Hardware out key */\r\n#define ELS_ELS_KS15_KS15_UHWO(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_UHWO_SHIFT)) & ELS_ELS_KS15_KS15_UHWO_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_UWRPOK_MASK            (0x10000000U)\r\n#define ELS_ELS_KS15_KS15_UWRPOK_SHIFT           (28U)\r\n/*! KS15_UWRPOK - Ok to wrap key */\r\n#define ELS_ELS_KS15_KS15_UWRPOK(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_UWRPOK_SHIFT)) & ELS_ELS_KS15_KS15_UWRPOK_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_UDUK_MASK              (0x20000000U)\r\n#define ELS_ELS_KS15_KS15_UDUK_SHIFT             (29U)\r\n/*! KS15_UDUK - Device Unique Key */\r\n#define ELS_ELS_KS15_KS15_UDUK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_UDUK_SHIFT)) & ELS_ELS_KS15_KS15_UDUK_MASK)\r\n\r\n#define ELS_ELS_KS15_KS15_UPPROT_MASK            (0xC0000000U)\r\n#define ELS_ELS_KS15_KS15_UPPROT_SHIFT           (30U)\r\n/*! KS15_UPPROT - Priviledge level */\r\n#define ELS_ELS_KS15_KS15_UPPROT(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS15_KS15_UPPROT_SHIFT)) & ELS_ELS_KS15_KS15_UPPROT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KS16 - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KS16_KS16_KSIZE_MASK             (0x1U)\r\n#define ELS_ELS_KS16_KS16_KSIZE_SHIFT            (0U)\r\n/*! KS16_KSIZE - Key size: 0-128, 1-256 */\r\n#define ELS_ELS_KS16_KS16_KSIZE(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_KSIZE_SHIFT)) & ELS_ELS_KS16_KS16_KSIZE_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_RSVD0_MASK             (0x1EU)\r\n#define ELS_ELS_KS16_KS16_RSVD0_SHIFT            (1U)\r\n/*! KS16_RSVD0 - Reserved 0 */\r\n#define ELS_ELS_KS16_KS16_RSVD0(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_RSVD0_SHIFT)) & ELS_ELS_KS16_KS16_RSVD0_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_KACT_MASK              (0x20U)\r\n#define ELS_ELS_KS16_KS16_KACT_SHIFT             (5U)\r\n/*! KS16_KACT - Key is active */\r\n#define ELS_ELS_KS16_KS16_KACT(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_KACT_SHIFT)) & ELS_ELS_KS16_KS16_KACT_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_KBASE_MASK             (0x40U)\r\n#define ELS_ELS_KS16_KS16_KBASE_SHIFT            (6U)\r\n/*! KS16_KBASE - First slot in a multislot key */\r\n#define ELS_ELS_KS16_KS16_KBASE(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_KBASE_SHIFT)) & ELS_ELS_KS16_KS16_KBASE_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_FGP_MASK               (0x80U)\r\n#define ELS_ELS_KS16_KS16_FGP_SHIFT              (7U)\r\n/*! KS16_FGP - Hardware Feature General Purpose */\r\n#define ELS_ELS_KS16_KS16_FGP(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_FGP_SHIFT)) & ELS_ELS_KS16_KS16_FGP_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_FRTN_MASK              (0x100U)\r\n#define ELS_ELS_KS16_KS16_FRTN_SHIFT             (8U)\r\n/*! KS16_FRTN - Hardware Feature Retention */\r\n#define ELS_ELS_KS16_KS16_FRTN(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_FRTN_SHIFT)) & ELS_ELS_KS16_KS16_FRTN_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_FHWO_MASK              (0x200U)\r\n#define ELS_ELS_KS16_KS16_FHWO_SHIFT             (9U)\r\n/*! KS16_FHWO - Hardware Feature Output */\r\n#define ELS_ELS_KS16_KS16_FHWO(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_FHWO_SHIFT)) & ELS_ELS_KS16_KS16_FHWO_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_RSVD1_MASK             (0x1C00U)\r\n#define ELS_ELS_KS16_KS16_RSVD1_SHIFT            (10U)\r\n/*! KS16_RSVD1 - Reserved 1 */\r\n#define ELS_ELS_KS16_KS16_RSVD1(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_RSVD1_SHIFT)) & ELS_ELS_KS16_KS16_RSVD1_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_UCMAC_MASK             (0x2000U)\r\n#define ELS_ELS_KS16_KS16_UCMAC_SHIFT            (13U)\r\n/*! KS16_UCMAC - CMAC key */\r\n#define ELS_ELS_KS16_KS16_UCMAC(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_UCMAC_SHIFT)) & ELS_ELS_KS16_KS16_UCMAC_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_UKSK_MASK              (0x4000U)\r\n#define ELS_ELS_KS16_KS16_UKSK_SHIFT             (14U)\r\n/*! KS16_UKSK - KSK key */\r\n#define ELS_ELS_KS16_KS16_UKSK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_UKSK_SHIFT)) & ELS_ELS_KS16_KS16_UKSK_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_URTF_MASK              (0x8000U)\r\n#define ELS_ELS_KS16_KS16_URTF_SHIFT             (15U)\r\n/*! KS16_URTF - Real Time Fingerprint key */\r\n#define ELS_ELS_KS16_KS16_URTF(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_URTF_SHIFT)) & ELS_ELS_KS16_KS16_URTF_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_UCKDF_MASK             (0x10000U)\r\n#define ELS_ELS_KS16_KS16_UCKDF_SHIFT            (16U)\r\n/*! KS16_UCKDF - Derivation key for CKDF command */\r\n#define ELS_ELS_KS16_KS16_UCKDF(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_UCKDF_SHIFT)) & ELS_ELS_KS16_KS16_UCKDF_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_UHKDF_MASK             (0x20000U)\r\n#define ELS_ELS_KS16_KS16_UHKDF_SHIFT            (17U)\r\n/*! KS16_UHKDF - Derivation key for HKDF command */\r\n#define ELS_ELS_KS16_KS16_UHKDF(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_UHKDF_SHIFT)) & ELS_ELS_KS16_KS16_UHKDF_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_UECSG_MASK             (0x40000U)\r\n#define ELS_ELS_KS16_KS16_UECSG_SHIFT            (18U)\r\n/*! KS16_UECSG - Ecc signing key */\r\n#define ELS_ELS_KS16_KS16_UECSG(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_UECSG_SHIFT)) & ELS_ELS_KS16_KS16_UECSG_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_UECDH_MASK             (0x80000U)\r\n#define ELS_ELS_KS16_KS16_UECDH_SHIFT            (19U)\r\n/*! KS16_UECDH - Ecc diffie hellman key */\r\n#define ELS_ELS_KS16_KS16_UECDH(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_UECDH_SHIFT)) & ELS_ELS_KS16_KS16_UECDH_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_UAES_MASK              (0x100000U)\r\n#define ELS_ELS_KS16_KS16_UAES_SHIFT             (20U)\r\n/*! KS16_UAES - Aes key */\r\n#define ELS_ELS_KS16_KS16_UAES(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_UAES_SHIFT)) & ELS_ELS_KS16_KS16_UAES_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_UHMAC_MASK             (0x200000U)\r\n#define ELS_ELS_KS16_KS16_UHMAC_SHIFT            (21U)\r\n/*! KS16_UHMAC - Hmac key */\r\n#define ELS_ELS_KS16_KS16_UHMAC(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_UHMAC_SHIFT)) & ELS_ELS_KS16_KS16_UHMAC_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_UKWK_MASK              (0x400000U)\r\n#define ELS_ELS_KS16_KS16_UKWK_SHIFT             (22U)\r\n/*! KS16_UKWK - Key wrapping key */\r\n#define ELS_ELS_KS16_KS16_UKWK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_UKWK_SHIFT)) & ELS_ELS_KS16_KS16_UKWK_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_UKUOK_MASK             (0x800000U)\r\n#define ELS_ELS_KS16_KS16_UKUOK_SHIFT            (23U)\r\n/*! KS16_UKUOK - Key unwrapping key */\r\n#define ELS_ELS_KS16_KS16_UKUOK(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_UKUOK_SHIFT)) & ELS_ELS_KS16_KS16_UKUOK_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_UTLSPMS_MASK           (0x1000000U)\r\n#define ELS_ELS_KS16_KS16_UTLSPMS_SHIFT          (24U)\r\n/*! KS16_UTLSPMS - TLS Pre Master Secret */\r\n#define ELS_ELS_KS16_KS16_UTLSPMS(x)             (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_UTLSPMS_SHIFT)) & ELS_ELS_KS16_KS16_UTLSPMS_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_UTLSMS_MASK            (0x2000000U)\r\n#define ELS_ELS_KS16_KS16_UTLSMS_SHIFT           (25U)\r\n/*! KS16_UTLSMS - TLS Master Secret */\r\n#define ELS_ELS_KS16_KS16_UTLSMS(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_UTLSMS_SHIFT)) & ELS_ELS_KS16_KS16_UTLSMS_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_UKGSRC_MASK            (0x4000000U)\r\n#define ELS_ELS_KS16_KS16_UKGSRC_SHIFT           (26U)\r\n/*! KS16_UKGSRC - Supply KEYGEN source */\r\n#define ELS_ELS_KS16_KS16_UKGSRC(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_UKGSRC_SHIFT)) & ELS_ELS_KS16_KS16_UKGSRC_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_UHWO_MASK              (0x8000000U)\r\n#define ELS_ELS_KS16_KS16_UHWO_SHIFT             (27U)\r\n/*! KS16_UHWO - Hardware out key */\r\n#define ELS_ELS_KS16_KS16_UHWO(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_UHWO_SHIFT)) & ELS_ELS_KS16_KS16_UHWO_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_UWRPOK_MASK            (0x10000000U)\r\n#define ELS_ELS_KS16_KS16_UWRPOK_SHIFT           (28U)\r\n/*! KS16_UWRPOK - Ok to wrap key */\r\n#define ELS_ELS_KS16_KS16_UWRPOK(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_UWRPOK_SHIFT)) & ELS_ELS_KS16_KS16_UWRPOK_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_UDUK_MASK              (0x20000000U)\r\n#define ELS_ELS_KS16_KS16_UDUK_SHIFT             (29U)\r\n/*! KS16_UDUK - Device Unique Key */\r\n#define ELS_ELS_KS16_KS16_UDUK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_UDUK_SHIFT)) & ELS_ELS_KS16_KS16_UDUK_MASK)\r\n\r\n#define ELS_ELS_KS16_KS16_UPPROT_MASK            (0xC0000000U)\r\n#define ELS_ELS_KS16_KS16_UPPROT_SHIFT           (30U)\r\n/*! KS16_UPPROT - Priviledge level */\r\n#define ELS_ELS_KS16_KS16_UPPROT(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS16_KS16_UPPROT_SHIFT)) & ELS_ELS_KS16_KS16_UPPROT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KS17 - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KS17_KS17_KSIZE_MASK             (0x1U)\r\n#define ELS_ELS_KS17_KS17_KSIZE_SHIFT            (0U)\r\n/*! KS17_KSIZE - Key size: 0-128, 1-256 */\r\n#define ELS_ELS_KS17_KS17_KSIZE(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_KSIZE_SHIFT)) & ELS_ELS_KS17_KS17_KSIZE_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_RSVD0_MASK             (0x1EU)\r\n#define ELS_ELS_KS17_KS17_RSVD0_SHIFT            (1U)\r\n/*! KS17_RSVD0 - Reserved 0 */\r\n#define ELS_ELS_KS17_KS17_RSVD0(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_RSVD0_SHIFT)) & ELS_ELS_KS17_KS17_RSVD0_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_KACT_MASK              (0x20U)\r\n#define ELS_ELS_KS17_KS17_KACT_SHIFT             (5U)\r\n/*! KS17_KACT - Key is active */\r\n#define ELS_ELS_KS17_KS17_KACT(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_KACT_SHIFT)) & ELS_ELS_KS17_KS17_KACT_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_KBASE_MASK             (0x40U)\r\n#define ELS_ELS_KS17_KS17_KBASE_SHIFT            (6U)\r\n/*! KS17_KBASE - First slot in a multislot key */\r\n#define ELS_ELS_KS17_KS17_KBASE(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_KBASE_SHIFT)) & ELS_ELS_KS17_KS17_KBASE_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_FGP_MASK               (0x80U)\r\n#define ELS_ELS_KS17_KS17_FGP_SHIFT              (7U)\r\n/*! KS17_FGP - Hardware Feature General Purpose */\r\n#define ELS_ELS_KS17_KS17_FGP(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_FGP_SHIFT)) & ELS_ELS_KS17_KS17_FGP_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_FRTN_MASK              (0x100U)\r\n#define ELS_ELS_KS17_KS17_FRTN_SHIFT             (8U)\r\n/*! KS17_FRTN - Hardware Feature Retention */\r\n#define ELS_ELS_KS17_KS17_FRTN(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_FRTN_SHIFT)) & ELS_ELS_KS17_KS17_FRTN_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_FHWO_MASK              (0x200U)\r\n#define ELS_ELS_KS17_KS17_FHWO_SHIFT             (9U)\r\n/*! KS17_FHWO - Hardware Feature Output */\r\n#define ELS_ELS_KS17_KS17_FHWO(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_FHWO_SHIFT)) & ELS_ELS_KS17_KS17_FHWO_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_RSVD1_MASK             (0x1C00U)\r\n#define ELS_ELS_KS17_KS17_RSVD1_SHIFT            (10U)\r\n/*! KS17_RSVD1 - Reserved 1 */\r\n#define ELS_ELS_KS17_KS17_RSVD1(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_RSVD1_SHIFT)) & ELS_ELS_KS17_KS17_RSVD1_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_UCMAC_MASK             (0x2000U)\r\n#define ELS_ELS_KS17_KS17_UCMAC_SHIFT            (13U)\r\n/*! KS17_UCMAC - CMAC key */\r\n#define ELS_ELS_KS17_KS17_UCMAC(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_UCMAC_SHIFT)) & ELS_ELS_KS17_KS17_UCMAC_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_UKSK_MASK              (0x4000U)\r\n#define ELS_ELS_KS17_KS17_UKSK_SHIFT             (14U)\r\n/*! KS17_UKSK - KSK key */\r\n#define ELS_ELS_KS17_KS17_UKSK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_UKSK_SHIFT)) & ELS_ELS_KS17_KS17_UKSK_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_URTF_MASK              (0x8000U)\r\n#define ELS_ELS_KS17_KS17_URTF_SHIFT             (15U)\r\n/*! KS17_URTF - Real Time Fingerprint key */\r\n#define ELS_ELS_KS17_KS17_URTF(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_URTF_SHIFT)) & ELS_ELS_KS17_KS17_URTF_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_UCKDF_MASK             (0x10000U)\r\n#define ELS_ELS_KS17_KS17_UCKDF_SHIFT            (16U)\r\n/*! KS17_UCKDF - Derivation key for CKDF command */\r\n#define ELS_ELS_KS17_KS17_UCKDF(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_UCKDF_SHIFT)) & ELS_ELS_KS17_KS17_UCKDF_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_UHKDF_MASK             (0x20000U)\r\n#define ELS_ELS_KS17_KS17_UHKDF_SHIFT            (17U)\r\n/*! KS17_UHKDF - Derivation key for HKDF command */\r\n#define ELS_ELS_KS17_KS17_UHKDF(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_UHKDF_SHIFT)) & ELS_ELS_KS17_KS17_UHKDF_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_UECSG_MASK             (0x40000U)\r\n#define ELS_ELS_KS17_KS17_UECSG_SHIFT            (18U)\r\n/*! KS17_UECSG - Ecc signing key */\r\n#define ELS_ELS_KS17_KS17_UECSG(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_UECSG_SHIFT)) & ELS_ELS_KS17_KS17_UECSG_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_UECDH_MASK             (0x80000U)\r\n#define ELS_ELS_KS17_KS17_UECDH_SHIFT            (19U)\r\n/*! KS17_UECDH - Ecc diffie hellman key */\r\n#define ELS_ELS_KS17_KS17_UECDH(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_UECDH_SHIFT)) & ELS_ELS_KS17_KS17_UECDH_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_UAES_MASK              (0x100000U)\r\n#define ELS_ELS_KS17_KS17_UAES_SHIFT             (20U)\r\n/*! KS17_UAES - Aes key */\r\n#define ELS_ELS_KS17_KS17_UAES(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_UAES_SHIFT)) & ELS_ELS_KS17_KS17_UAES_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_UHMAC_MASK             (0x200000U)\r\n#define ELS_ELS_KS17_KS17_UHMAC_SHIFT            (21U)\r\n/*! KS17_UHMAC - Hmac key */\r\n#define ELS_ELS_KS17_KS17_UHMAC(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_UHMAC_SHIFT)) & ELS_ELS_KS17_KS17_UHMAC_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_UKWK_MASK              (0x400000U)\r\n#define ELS_ELS_KS17_KS17_UKWK_SHIFT             (22U)\r\n/*! KS17_UKWK - Key wrapping key */\r\n#define ELS_ELS_KS17_KS17_UKWK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_UKWK_SHIFT)) & ELS_ELS_KS17_KS17_UKWK_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_UKUOK_MASK             (0x800000U)\r\n#define ELS_ELS_KS17_KS17_UKUOK_SHIFT            (23U)\r\n/*! KS17_UKUOK - Key unwrapping key */\r\n#define ELS_ELS_KS17_KS17_UKUOK(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_UKUOK_SHIFT)) & ELS_ELS_KS17_KS17_UKUOK_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_UTLSPMS_MASK           (0x1000000U)\r\n#define ELS_ELS_KS17_KS17_UTLSPMS_SHIFT          (24U)\r\n/*! KS17_UTLSPMS - TLS Pre Master Secret */\r\n#define ELS_ELS_KS17_KS17_UTLSPMS(x)             (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_UTLSPMS_SHIFT)) & ELS_ELS_KS17_KS17_UTLSPMS_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_UTLSMS_MASK            (0x2000000U)\r\n#define ELS_ELS_KS17_KS17_UTLSMS_SHIFT           (25U)\r\n/*! KS17_UTLSMS - TLS Master Secret */\r\n#define ELS_ELS_KS17_KS17_UTLSMS(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_UTLSMS_SHIFT)) & ELS_ELS_KS17_KS17_UTLSMS_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_UKGSRC_MASK            (0x4000000U)\r\n#define ELS_ELS_KS17_KS17_UKGSRC_SHIFT           (26U)\r\n/*! KS17_UKGSRC - Supply KEYGEN source */\r\n#define ELS_ELS_KS17_KS17_UKGSRC(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_UKGSRC_SHIFT)) & ELS_ELS_KS17_KS17_UKGSRC_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_UHWO_MASK              (0x8000000U)\r\n#define ELS_ELS_KS17_KS17_UHWO_SHIFT             (27U)\r\n/*! KS17_UHWO - Hardware out key */\r\n#define ELS_ELS_KS17_KS17_UHWO(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_UHWO_SHIFT)) & ELS_ELS_KS17_KS17_UHWO_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_UWRPOK_MASK            (0x10000000U)\r\n#define ELS_ELS_KS17_KS17_UWRPOK_SHIFT           (28U)\r\n/*! KS17_UWRPOK - Ok to wrap key */\r\n#define ELS_ELS_KS17_KS17_UWRPOK(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_UWRPOK_SHIFT)) & ELS_ELS_KS17_KS17_UWRPOK_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_UDUK_MASK              (0x20000000U)\r\n#define ELS_ELS_KS17_KS17_UDUK_SHIFT             (29U)\r\n/*! KS17_UDUK - Device Unique Key */\r\n#define ELS_ELS_KS17_KS17_UDUK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_UDUK_SHIFT)) & ELS_ELS_KS17_KS17_UDUK_MASK)\r\n\r\n#define ELS_ELS_KS17_KS17_UPPROT_MASK            (0xC0000000U)\r\n#define ELS_ELS_KS17_KS17_UPPROT_SHIFT           (30U)\r\n/*! KS17_UPPROT - Priviledge level */\r\n#define ELS_ELS_KS17_KS17_UPPROT(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS17_KS17_UPPROT_SHIFT)) & ELS_ELS_KS17_KS17_UPPROT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KS18 - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KS18_KS18_KSIZE_MASK             (0x1U)\r\n#define ELS_ELS_KS18_KS18_KSIZE_SHIFT            (0U)\r\n/*! KS18_KSIZE - Key size: 0-128, 1-256 */\r\n#define ELS_ELS_KS18_KS18_KSIZE(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_KSIZE_SHIFT)) & ELS_ELS_KS18_KS18_KSIZE_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_RSVD0_MASK             (0x1EU)\r\n#define ELS_ELS_KS18_KS18_RSVD0_SHIFT            (1U)\r\n/*! KS18_RSVD0 - Reserved 0 */\r\n#define ELS_ELS_KS18_KS18_RSVD0(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_RSVD0_SHIFT)) & ELS_ELS_KS18_KS18_RSVD0_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_KACT_MASK              (0x20U)\r\n#define ELS_ELS_KS18_KS18_KACT_SHIFT             (5U)\r\n/*! KS18_KACT - Key is active */\r\n#define ELS_ELS_KS18_KS18_KACT(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_KACT_SHIFT)) & ELS_ELS_KS18_KS18_KACT_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_KBASE_MASK             (0x40U)\r\n#define ELS_ELS_KS18_KS18_KBASE_SHIFT            (6U)\r\n/*! KS18_KBASE - First slot in a multislot key */\r\n#define ELS_ELS_KS18_KS18_KBASE(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_KBASE_SHIFT)) & ELS_ELS_KS18_KS18_KBASE_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_FGP_MASK               (0x80U)\r\n#define ELS_ELS_KS18_KS18_FGP_SHIFT              (7U)\r\n/*! KS18_FGP - Hardware Feature General Purpose */\r\n#define ELS_ELS_KS18_KS18_FGP(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_FGP_SHIFT)) & ELS_ELS_KS18_KS18_FGP_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_FRTN_MASK              (0x100U)\r\n#define ELS_ELS_KS18_KS18_FRTN_SHIFT             (8U)\r\n/*! KS18_FRTN - Hardware Feature Retention */\r\n#define ELS_ELS_KS18_KS18_FRTN(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_FRTN_SHIFT)) & ELS_ELS_KS18_KS18_FRTN_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_FHWO_MASK              (0x200U)\r\n#define ELS_ELS_KS18_KS18_FHWO_SHIFT             (9U)\r\n/*! KS18_FHWO - Hardware Feature Output */\r\n#define ELS_ELS_KS18_KS18_FHWO(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_FHWO_SHIFT)) & ELS_ELS_KS18_KS18_FHWO_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_RSVD1_MASK             (0x1C00U)\r\n#define ELS_ELS_KS18_KS18_RSVD1_SHIFT            (10U)\r\n/*! KS18_RSVD1 - Reserved 1 */\r\n#define ELS_ELS_KS18_KS18_RSVD1(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_RSVD1_SHIFT)) & ELS_ELS_KS18_KS18_RSVD1_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_UCMAC_MASK             (0x2000U)\r\n#define ELS_ELS_KS18_KS18_UCMAC_SHIFT            (13U)\r\n/*! KS18_UCMAC - CMAC key */\r\n#define ELS_ELS_KS18_KS18_UCMAC(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_UCMAC_SHIFT)) & ELS_ELS_KS18_KS18_UCMAC_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_UKSK_MASK              (0x4000U)\r\n#define ELS_ELS_KS18_KS18_UKSK_SHIFT             (14U)\r\n/*! KS18_UKSK - KSK key */\r\n#define ELS_ELS_KS18_KS18_UKSK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_UKSK_SHIFT)) & ELS_ELS_KS18_KS18_UKSK_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_URTF_MASK              (0x8000U)\r\n#define ELS_ELS_KS18_KS18_URTF_SHIFT             (15U)\r\n/*! KS18_URTF - Real Time Fingerprint key */\r\n#define ELS_ELS_KS18_KS18_URTF(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_URTF_SHIFT)) & ELS_ELS_KS18_KS18_URTF_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_UCKDF_MASK             (0x10000U)\r\n#define ELS_ELS_KS18_KS18_UCKDF_SHIFT            (16U)\r\n/*! KS18_UCKDF - Derivation key for CKDF command */\r\n#define ELS_ELS_KS18_KS18_UCKDF(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_UCKDF_SHIFT)) & ELS_ELS_KS18_KS18_UCKDF_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_UHKDF_MASK             (0x20000U)\r\n#define ELS_ELS_KS18_KS18_UHKDF_SHIFT            (17U)\r\n/*! KS18_UHKDF - Derivation key for HKDF command */\r\n#define ELS_ELS_KS18_KS18_UHKDF(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_UHKDF_SHIFT)) & ELS_ELS_KS18_KS18_UHKDF_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_UECSG_MASK             (0x40000U)\r\n#define ELS_ELS_KS18_KS18_UECSG_SHIFT            (18U)\r\n/*! KS18_UECSG - Ecc signing key */\r\n#define ELS_ELS_KS18_KS18_UECSG(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_UECSG_SHIFT)) & ELS_ELS_KS18_KS18_UECSG_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_UECDH_MASK             (0x80000U)\r\n#define ELS_ELS_KS18_KS18_UECDH_SHIFT            (19U)\r\n/*! KS18_UECDH - Ecc diffie hellman key */\r\n#define ELS_ELS_KS18_KS18_UECDH(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_UECDH_SHIFT)) & ELS_ELS_KS18_KS18_UECDH_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_UAES_MASK              (0x100000U)\r\n#define ELS_ELS_KS18_KS18_UAES_SHIFT             (20U)\r\n/*! KS18_UAES - Aes key */\r\n#define ELS_ELS_KS18_KS18_UAES(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_UAES_SHIFT)) & ELS_ELS_KS18_KS18_UAES_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_UHMAC_MASK             (0x200000U)\r\n#define ELS_ELS_KS18_KS18_UHMAC_SHIFT            (21U)\r\n/*! KS18_UHMAC - Hmac key */\r\n#define ELS_ELS_KS18_KS18_UHMAC(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_UHMAC_SHIFT)) & ELS_ELS_KS18_KS18_UHMAC_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_UKWK_MASK              (0x400000U)\r\n#define ELS_ELS_KS18_KS18_UKWK_SHIFT             (22U)\r\n/*! KS18_UKWK - Key wrapping key */\r\n#define ELS_ELS_KS18_KS18_UKWK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_UKWK_SHIFT)) & ELS_ELS_KS18_KS18_UKWK_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_UKUOK_MASK             (0x800000U)\r\n#define ELS_ELS_KS18_KS18_UKUOK_SHIFT            (23U)\r\n/*! KS18_UKUOK - Key unwrapping key */\r\n#define ELS_ELS_KS18_KS18_UKUOK(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_UKUOK_SHIFT)) & ELS_ELS_KS18_KS18_UKUOK_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_UTLSPMS_MASK           (0x1000000U)\r\n#define ELS_ELS_KS18_KS18_UTLSPMS_SHIFT          (24U)\r\n/*! KS18_UTLSPMS - TLS Pre Master Secret */\r\n#define ELS_ELS_KS18_KS18_UTLSPMS(x)             (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_UTLSPMS_SHIFT)) & ELS_ELS_KS18_KS18_UTLSPMS_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_UTLSMS_MASK            (0x2000000U)\r\n#define ELS_ELS_KS18_KS18_UTLSMS_SHIFT           (25U)\r\n/*! KS18_UTLSMS - TLS Master Secret */\r\n#define ELS_ELS_KS18_KS18_UTLSMS(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_UTLSMS_SHIFT)) & ELS_ELS_KS18_KS18_UTLSMS_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_UKGSRC_MASK            (0x4000000U)\r\n#define ELS_ELS_KS18_KS18_UKGSRC_SHIFT           (26U)\r\n/*! KS18_UKGSRC - Supply KEYGEN source */\r\n#define ELS_ELS_KS18_KS18_UKGSRC(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_UKGSRC_SHIFT)) & ELS_ELS_KS18_KS18_UKGSRC_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_UHWO_MASK              (0x8000000U)\r\n#define ELS_ELS_KS18_KS18_UHWO_SHIFT             (27U)\r\n/*! KS18_UHWO - Hardware out key */\r\n#define ELS_ELS_KS18_KS18_UHWO(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_UHWO_SHIFT)) & ELS_ELS_KS18_KS18_UHWO_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_UWRPOK_MASK            (0x10000000U)\r\n#define ELS_ELS_KS18_KS18_UWRPOK_SHIFT           (28U)\r\n/*! KS18_UWRPOK - Ok to wrap key */\r\n#define ELS_ELS_KS18_KS18_UWRPOK(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_UWRPOK_SHIFT)) & ELS_ELS_KS18_KS18_UWRPOK_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_UDUK_MASK              (0x20000000U)\r\n#define ELS_ELS_KS18_KS18_UDUK_SHIFT             (29U)\r\n/*! KS18_UDUK - Device Unique Key */\r\n#define ELS_ELS_KS18_KS18_UDUK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_UDUK_SHIFT)) & ELS_ELS_KS18_KS18_UDUK_MASK)\r\n\r\n#define ELS_ELS_KS18_KS18_UPPROT_MASK            (0xC0000000U)\r\n#define ELS_ELS_KS18_KS18_UPPROT_SHIFT           (30U)\r\n/*! KS18_UPPROT - Priviledge level */\r\n#define ELS_ELS_KS18_KS18_UPPROT(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS18_KS18_UPPROT_SHIFT)) & ELS_ELS_KS18_KS18_UPPROT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_KS19 - Status register */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_KS19_KS19_KSIZE_MASK             (0x1U)\r\n#define ELS_ELS_KS19_KS19_KSIZE_SHIFT            (0U)\r\n/*! KS19_KSIZE - Key size: 0-128, 1-256 */\r\n#define ELS_ELS_KS19_KS19_KSIZE(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_KSIZE_SHIFT)) & ELS_ELS_KS19_KS19_KSIZE_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_RSVD0_MASK             (0x1EU)\r\n#define ELS_ELS_KS19_KS19_RSVD0_SHIFT            (1U)\r\n/*! KS19_RSVD0 - Reserved 0 */\r\n#define ELS_ELS_KS19_KS19_RSVD0(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_RSVD0_SHIFT)) & ELS_ELS_KS19_KS19_RSVD0_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_KACT_MASK              (0x20U)\r\n#define ELS_ELS_KS19_KS19_KACT_SHIFT             (5U)\r\n/*! KS19_KACT - Key is active */\r\n#define ELS_ELS_KS19_KS19_KACT(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_KACT_SHIFT)) & ELS_ELS_KS19_KS19_KACT_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_KBASE_MASK             (0x40U)\r\n#define ELS_ELS_KS19_KS19_KBASE_SHIFT            (6U)\r\n/*! KS19_KBASE - First slot in a multislot key */\r\n#define ELS_ELS_KS19_KS19_KBASE(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_KBASE_SHIFT)) & ELS_ELS_KS19_KS19_KBASE_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_FGP_MASK               (0x80U)\r\n#define ELS_ELS_KS19_KS19_FGP_SHIFT              (7U)\r\n/*! KS19_FGP - Hardware Feature General Purpose */\r\n#define ELS_ELS_KS19_KS19_FGP(x)                 (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_FGP_SHIFT)) & ELS_ELS_KS19_KS19_FGP_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_FRTN_MASK              (0x100U)\r\n#define ELS_ELS_KS19_KS19_FRTN_SHIFT             (8U)\r\n/*! KS19_FRTN - Hardware Feature Retention */\r\n#define ELS_ELS_KS19_KS19_FRTN(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_FRTN_SHIFT)) & ELS_ELS_KS19_KS19_FRTN_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_FHWO_MASK              (0x200U)\r\n#define ELS_ELS_KS19_KS19_FHWO_SHIFT             (9U)\r\n/*! KS19_FHWO - Hardware Feature Output */\r\n#define ELS_ELS_KS19_KS19_FHWO(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_FHWO_SHIFT)) & ELS_ELS_KS19_KS19_FHWO_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_RSVD1_MASK             (0x1C00U)\r\n#define ELS_ELS_KS19_KS19_RSVD1_SHIFT            (10U)\r\n/*! KS19_RSVD1 - Reserved 1 */\r\n#define ELS_ELS_KS19_KS19_RSVD1(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_RSVD1_SHIFT)) & ELS_ELS_KS19_KS19_RSVD1_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_UCMAC_MASK             (0x2000U)\r\n#define ELS_ELS_KS19_KS19_UCMAC_SHIFT            (13U)\r\n/*! KS19_UCMAC - CMAC key */\r\n#define ELS_ELS_KS19_KS19_UCMAC(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_UCMAC_SHIFT)) & ELS_ELS_KS19_KS19_UCMAC_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_UKSK_MASK              (0x4000U)\r\n#define ELS_ELS_KS19_KS19_UKSK_SHIFT             (14U)\r\n/*! KS19_UKSK - KSK key */\r\n#define ELS_ELS_KS19_KS19_UKSK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_UKSK_SHIFT)) & ELS_ELS_KS19_KS19_UKSK_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_URTF_MASK              (0x8000U)\r\n#define ELS_ELS_KS19_KS19_URTF_SHIFT             (15U)\r\n/*! KS19_URTF - Real Time Fingerprint key */\r\n#define ELS_ELS_KS19_KS19_URTF(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_URTF_SHIFT)) & ELS_ELS_KS19_KS19_URTF_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_UCKDF_MASK             (0x10000U)\r\n#define ELS_ELS_KS19_KS19_UCKDF_SHIFT            (16U)\r\n/*! KS19_UCKDF - Derivation key for CKDF command */\r\n#define ELS_ELS_KS19_KS19_UCKDF(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_UCKDF_SHIFT)) & ELS_ELS_KS19_KS19_UCKDF_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_UHKDF_MASK             (0x20000U)\r\n#define ELS_ELS_KS19_KS19_UHKDF_SHIFT            (17U)\r\n/*! KS19_UHKDF - Derivation key for HKDF command */\r\n#define ELS_ELS_KS19_KS19_UHKDF(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_UHKDF_SHIFT)) & ELS_ELS_KS19_KS19_UHKDF_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_UECSG_MASK             (0x40000U)\r\n#define ELS_ELS_KS19_KS19_UECSG_SHIFT            (18U)\r\n/*! KS19_UECSG - Ecc signing key */\r\n#define ELS_ELS_KS19_KS19_UECSG(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_UECSG_SHIFT)) & ELS_ELS_KS19_KS19_UECSG_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_UECDH_MASK             (0x80000U)\r\n#define ELS_ELS_KS19_KS19_UECDH_SHIFT            (19U)\r\n/*! KS19_UECDH - Ecc diffie hellman key */\r\n#define ELS_ELS_KS19_KS19_UECDH(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_UECDH_SHIFT)) & ELS_ELS_KS19_KS19_UECDH_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_UAES_MASK              (0x100000U)\r\n#define ELS_ELS_KS19_KS19_UAES_SHIFT             (20U)\r\n/*! KS19_UAES - Aes key */\r\n#define ELS_ELS_KS19_KS19_UAES(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_UAES_SHIFT)) & ELS_ELS_KS19_KS19_UAES_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_UHMAC_MASK             (0x200000U)\r\n#define ELS_ELS_KS19_KS19_UHMAC_SHIFT            (21U)\r\n/*! KS19_UHMAC - Hmac key */\r\n#define ELS_ELS_KS19_KS19_UHMAC(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_UHMAC_SHIFT)) & ELS_ELS_KS19_KS19_UHMAC_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_UKWK_MASK              (0x400000U)\r\n#define ELS_ELS_KS19_KS19_UKWK_SHIFT             (22U)\r\n/*! KS19_UKWK - Key wrapping key */\r\n#define ELS_ELS_KS19_KS19_UKWK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_UKWK_SHIFT)) & ELS_ELS_KS19_KS19_UKWK_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_UKUOK_MASK             (0x800000U)\r\n#define ELS_ELS_KS19_KS19_UKUOK_SHIFT            (23U)\r\n/*! KS19_UKUOK - Key unwrapping key */\r\n#define ELS_ELS_KS19_KS19_UKUOK(x)               (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_UKUOK_SHIFT)) & ELS_ELS_KS19_KS19_UKUOK_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_UTLSPMS_MASK           (0x1000000U)\r\n#define ELS_ELS_KS19_KS19_UTLSPMS_SHIFT          (24U)\r\n/*! KS19_UTLSPMS - TLS Pre Master Secret */\r\n#define ELS_ELS_KS19_KS19_UTLSPMS(x)             (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_UTLSPMS_SHIFT)) & ELS_ELS_KS19_KS19_UTLSPMS_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_UTLSMS_MASK            (0x2000000U)\r\n#define ELS_ELS_KS19_KS19_UTLSMS_SHIFT           (25U)\r\n/*! KS19_UTLSMS - TLS Master Secret */\r\n#define ELS_ELS_KS19_KS19_UTLSMS(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_UTLSMS_SHIFT)) & ELS_ELS_KS19_KS19_UTLSMS_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_UKGSRC_MASK            (0x4000000U)\r\n#define ELS_ELS_KS19_KS19_UKGSRC_SHIFT           (26U)\r\n/*! KS19_UKGSRC - Supply KEYGEN source */\r\n#define ELS_ELS_KS19_KS19_UKGSRC(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_UKGSRC_SHIFT)) & ELS_ELS_KS19_KS19_UKGSRC_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_UHWO_MASK              (0x8000000U)\r\n#define ELS_ELS_KS19_KS19_UHWO_SHIFT             (27U)\r\n/*! KS19_UHWO - Hardware out key */\r\n#define ELS_ELS_KS19_KS19_UHWO(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_UHWO_SHIFT)) & ELS_ELS_KS19_KS19_UHWO_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_UWRPOK_MASK            (0x10000000U)\r\n#define ELS_ELS_KS19_KS19_UWRPOK_SHIFT           (28U)\r\n/*! KS19_UWRPOK - Ok to wrap key */\r\n#define ELS_ELS_KS19_KS19_UWRPOK(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_UWRPOK_SHIFT)) & ELS_ELS_KS19_KS19_UWRPOK_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_UDUK_MASK              (0x20000000U)\r\n#define ELS_ELS_KS19_KS19_UDUK_SHIFT             (29U)\r\n/*! KS19_UDUK - Device Unique Key */\r\n#define ELS_ELS_KS19_KS19_UDUK(x)                (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_UDUK_SHIFT)) & ELS_ELS_KS19_KS19_UDUK_MASK)\r\n\r\n#define ELS_ELS_KS19_KS19_UPPROT_MASK            (0xC0000000U)\r\n#define ELS_ELS_KS19_KS19_UPPROT_SHIFT           (30U)\r\n/*! KS19_UPPROT - Priviledge level */\r\n#define ELS_ELS_KS19_KS19_UPPROT(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_KS19_KS19_UPPROT_SHIFT)) & ELS_ELS_KS19_KS19_UPPROT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_BOOT_ADDR - SW control for the ELS boot addr */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_BOOT_ADDR_BOOT_ADDR_MASK         (0xFFFFFFFFU)\r\n#define ELS_ELS_BOOT_ADDR_BOOT_ADDR_SHIFT        (0U)\r\n/*! BOOT_ADDR - 32-bit wide boot offset */\r\n#define ELS_ELS_BOOT_ADDR_BOOT_ADDR(x)           (((uint32_t)(((uint32_t)(x)) << ELS_ELS_BOOT_ADDR_BOOT_ADDR_SHIFT)) & ELS_ELS_BOOT_ADDR_BOOT_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name ELS_DBG_CFG - ELS Debug Config SFR */\r\n/*! @{ */\r\n\r\n#define ELS_ELS_DBG_CFG_DBG_CFG0_MASK            (0x7U)\r\n#define ELS_ELS_DBG_CFG_DBG_CFG0_SHIFT           (0U)\r\n/*! DBG_CFG0 - Debug Config 0 */\r\n#define ELS_ELS_DBG_CFG_DBG_CFG0(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_DBG_CFG_DBG_CFG0_SHIFT)) & ELS_ELS_DBG_CFG_DBG_CFG0_MASK)\r\n\r\n#define ELS_ELS_DBG_CFG_DBG_CFG1_MASK            (0x38U)\r\n#define ELS_ELS_DBG_CFG_DBG_CFG1_SHIFT           (3U)\r\n/*! DBG_CFG1 - Debug Config 1 */\r\n#define ELS_ELS_DBG_CFG_DBG_CFG1(x)              (((uint32_t)(((uint32_t)(x)) << ELS_ELS_DBG_CFG_DBG_CFG1_SHIFT)) & ELS_ELS_DBG_CFG_DBG_CFG1_MASK)\r\n\r\n#define ELS_ELS_DBG_CFG_DBG_CFG_RFU_MASK         (0xFFFFFFC0U)\r\n#define ELS_ELS_DBG_CFG_DBG_CFG_RFU_SHIFT        (6U)\r\n/*! DBG_CFG_RFU - reserved */\r\n#define ELS_ELS_DBG_CFG_DBG_CFG_RFU(x)           (((uint32_t)(((uint32_t)(x)) << ELS_ELS_DBG_CFG_DBG_CFG_RFU_SHIFT)) & ELS_ELS_DBG_CFG_DBG_CFG_RFU_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group ELS_Register_Masks */\r\n\r\n\r\n/* ELS - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral ELS base address */\r\n  #define ELS_BASE                                 (0x50007000u)\r\n  /** Peripheral ELS base address */\r\n  #define ELS_BASE_NS                              (0x40007000u)\r\n  /** Peripheral ELS base pointer */\r\n  #define ELS                                      ((ELS_Type *)ELS_BASE)\r\n  /** Peripheral ELS base pointer */\r\n  #define ELS_NS                                   ((ELS_Type *)ELS_BASE_NS)\r\n  /** Array initializer of ELS peripheral base addresses */\r\n  #define ELS_BASE_ADDRS                           { ELS_BASE }\r\n  /** Array initializer of ELS peripheral base pointers */\r\n  #define ELS_BASE_PTRS                            { ELS }\r\n  /** Array initializer of ELS peripheral base addresses */\r\n  #define ELS_BASE_ADDRS_NS                        { ELS_BASE_NS }\r\n  /** Array initializer of ELS peripheral base pointers */\r\n  #define ELS_BASE_PTRS_NS                         { ELS_NS }\r\n#else\r\n  /** Peripheral ELS base address */\r\n  #define ELS_BASE                                 (0x40007000u)\r\n  /** Peripheral ELS base pointer */\r\n  #define ELS                                      ((ELS_Type *)ELS_BASE)\r\n  /** Array initializer of ELS peripheral base addresses */\r\n  #define ELS_BASE_ADDRS                           { ELS_BASE }\r\n  /** Array initializer of ELS peripheral base pointers */\r\n  #define ELS_BASE_PTRS                            { ELS }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group ELS_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- ENET Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup ENET_Peripheral_Access_Layer ENET Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** ENET - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[4];\r\n  __IO uint32_t EIR;                               /**< Interrupt Event Register, offset: 0x4 */\r\n  __IO uint32_t EIMR;                              /**< Interrupt Mask Register, offset: 0x8 */\r\n       uint8_t RESERVED_1[4];\r\n  __IO uint32_t RDAR;                              /**< Receive Descriptor Active Register - Ring 0, offset: 0x10 */\r\n  __IO uint32_t TDAR;                              /**< Transmit Descriptor Active Register - Ring 0, offset: 0x14 */\r\n       uint8_t RESERVED_2[12];\r\n  __IO uint32_t ECR;                               /**< Ethernet Control Register, offset: 0x24 */\r\n       uint8_t RESERVED_3[24];\r\n  __IO uint32_t MMFR;                              /**< MII Management Frame Register, offset: 0x40 */\r\n  __IO uint32_t MSCR;                              /**< MII Speed Control Register, offset: 0x44 */\r\n       uint8_t RESERVED_4[28];\r\n  __IO uint32_t MIBC;                              /**< MIB Control Register, offset: 0x64 */\r\n       uint8_t RESERVED_5[28];\r\n  __IO uint32_t RCR;                               /**< Receive Control Register, offset: 0x84 */\r\n       uint8_t RESERVED_6[60];\r\n  __IO uint32_t TCR;                               /**< Transmit Control Register, offset: 0xC4 */\r\n       uint8_t RESERVED_7[28];\r\n  __IO uint32_t PALR;                              /**< Physical Address Lower Register, offset: 0xE4 */\r\n  __IO uint32_t PAUR;                              /**< Physical Address Upper Register, offset: 0xE8 */\r\n  __IO uint32_t OPD;                               /**< Opcode/Pause Duration Register, offset: 0xEC */\r\n  __IO uint32_t TXIC[1];                           /**< Transmit Interrupt Coalescing Register, array offset: 0xF0, array step: 0x4 */\r\n       uint8_t RESERVED_8[12];\r\n  __IO uint32_t RXIC[1];                           /**< Receive Interrupt Coalescing Register, array offset: 0x100, array step: 0x4 */\r\n       uint8_t RESERVED_9[20];\r\n  __IO uint32_t IAUR;                              /**< Descriptor Individual Upper Address Register, offset: 0x118 */\r\n  __IO uint32_t IALR;                              /**< Descriptor Individual Lower Address Register, offset: 0x11C */\r\n  __IO uint32_t GAUR;                              /**< Descriptor Group Upper Address Register, offset: 0x120 */\r\n  __IO uint32_t GALR;                              /**< Descriptor Group Lower Address Register, offset: 0x124 */\r\n       uint8_t RESERVED_10[28];\r\n  __IO uint32_t TFWR;                              /**< Transmit FIFO Watermark Register, offset: 0x144 */\r\n       uint8_t RESERVED_11[56];\r\n  __IO uint32_t RDSR;                              /**< Receive Descriptor Ring 0 Start Register, offset: 0x180 */\r\n  __IO uint32_t TDSR;                              /**< Transmit Buffer Descriptor Ring 0 Start Register, offset: 0x184 */\r\n  __IO uint32_t MRBR;                              /**< Maximum Receive Buffer Size Register - Ring 0, offset: 0x188 */\r\n       uint8_t RESERVED_12[4];\r\n  __IO uint32_t RSFL;                              /**< Receive FIFO Section Full Threshold, offset: 0x190 */\r\n  __IO uint32_t RSEM;                              /**< Receive FIFO Section Empty Threshold, offset: 0x194 */\r\n  __IO uint32_t RAEM;                              /**< Receive FIFO Almost Empty Threshold, offset: 0x198 */\r\n  __IO uint32_t RAFL;                              /**< Receive FIFO Almost Full Threshold, offset: 0x19C */\r\n  __IO uint32_t TSEM;                              /**< Transmit FIFO Section Empty Threshold, offset: 0x1A0 */\r\n  __IO uint32_t TAEM;                              /**< Transmit FIFO Almost Empty Threshold, offset: 0x1A4 */\r\n  __IO uint32_t TAFL;                              /**< Transmit FIFO Almost Full Threshold, offset: 0x1A8 */\r\n  __IO uint32_t TIPG;                              /**< Transmit Inter-Packet Gap, offset: 0x1AC */\r\n  __IO uint32_t FTRL;                              /**< Frame Truncation Length, offset: 0x1B0 */\r\n       uint8_t RESERVED_13[12];\r\n  __IO uint32_t TACC;                              /**< Transmit Accelerator Function Configuration, offset: 0x1C0 */\r\n  __IO uint32_t RACC;                              /**< Receive Accelerator Function Configuration, offset: 0x1C4 */\r\n       uint8_t RESERVED_14[60];\r\n  __I  uint32_t RMON_T_PACKETS;                    /**< Tx Packet Count Statistic Register, offset: 0x204 */\r\n  __I  uint32_t RMON_T_BC_PKT;                     /**< Tx Broadcast Packets Statistic Register, offset: 0x208 */\r\n  __I  uint32_t RMON_T_MC_PKT;                     /**< Tx Multicast Packets Statistic Register, offset: 0x20C */\r\n  __I  uint32_t RMON_T_CRC_ALIGN;                  /**< Tx Packets with CRC/Align Error Statistic Register, offset: 0x210 */\r\n  __I  uint32_t RMON_T_UNDERSIZE;                  /**< Tx Packets Less Than Bytes and Good CRC Statistic Register, offset: 0x214 */\r\n  __I  uint32_t RMON_T_OVERSIZE;                   /**< Tx Packets GT MAX_FL bytes and Good CRC Statistic Register, offset: 0x218 */\r\n  __I  uint32_t RMON_T_FRAG;                       /**< Tx Packets Less Than 64 Bytes and Bad CRC Statistic Register, offset: 0x21C */\r\n  __I  uint32_t RMON_T_JAB;                        /**< Tx Packets Greater Than MAX_FL bytes and Bad CRC Statistic Register, offset: 0x220 */\r\n  __I  uint32_t RMON_T_COL;                        /**< Tx Collision Count Statistic Register, offset: 0x224 */\r\n  __I  uint32_t RMON_T_P64;                        /**< Tx 64-Byte Packets Statistic Register, offset: 0x228 */\r\n  __I  uint32_t RMON_T_P65TO127;                   /**< Tx 65- to 127-byte Packets Statistic Register, offset: 0x22C */\r\n  __I  uint32_t RMON_T_P128TO255;                  /**< Tx 128- to 255-byte Packets Statistic Register, offset: 0x230 */\r\n  __I  uint32_t RMON_T_P256TO511;                  /**< Tx 256- to 511-byte Packets Statistic Register, offset: 0x234 */\r\n  __I  uint32_t RMON_T_P512TO1023;                 /**< Tx 512- to 1023-byte Packets Statistic Register, offset: 0x238 */\r\n  __I  uint32_t RMON_T_P1024TO2047;                /**< Tx 1024- to 2047-byte Packets Statistic Register, offset: 0x23C */\r\n  __I  uint32_t RMON_T_P_GTE2048;                  /**< Tx Packets Greater Than 2048 Bytes Statistic Register, offset: 0x240 */\r\n  __I  uint32_t RMON_T_OCTETS;                     /**< Tx Octets Statistic Register, offset: 0x244 */\r\n       uint32_t IEEE_T_DROP;                       /**< Reserved Statistic Register, offset: 0x248 */\r\n  __I  uint32_t IEEE_T_FRAME_OK;                   /**< Frames Transmitted OK Statistic Register, offset: 0x24C */\r\n  __I  uint32_t IEEE_T_1COL;                       /**< Frames Transmitted with Single Collision Statistic Register, offset: 0x250 */\r\n  __I  uint32_t IEEE_T_MCOL;                       /**< Frames Transmitted with Multiple Collisions Statistic Register, offset: 0x254 */\r\n  __I  uint32_t IEEE_T_DEF;                        /**< Frames Transmitted after Deferral Delay Statistic Register, offset: 0x258 */\r\n  __I  uint32_t IEEE_T_LCOL;                       /**< Frames Transmitted with Late Collision Statistic Register, offset: 0x25C */\r\n  __I  uint32_t IEEE_T_EXCOL;                      /**< Frames Transmitted with Excessive Collisions Statistic Register, offset: 0x260 */\r\n  __I  uint32_t IEEE_T_MACERR;                     /**< Frames Transmitted with Tx FIFO Underrun Statistic Register, offset: 0x264 */\r\n  __I  uint32_t IEEE_T_CSERR;                      /**< Frames Transmitted with Carrier Sense Error Statistic Register, offset: 0x268 */\r\n  __I  uint32_t IEEE_T_SQE;                        /**< Reserved Statistic Register, offset: 0x26C */\r\n  __I  uint32_t IEEE_T_FDXFC;                      /**< Flow Control Pause Frames Transmitted Statistic Register, offset: 0x270 */\r\n  __I  uint32_t IEEE_T_OCTETS_OK;                  /**< Octet Count for Frames Transmitted w/o Error Statistic Register, offset: 0x274 */\r\n       uint8_t RESERVED_15[12];\r\n  __I  uint32_t RMON_R_PACKETS;                    /**< Rx Packet Count Statistic Register, offset: 0x284 */\r\n  __I  uint32_t RMON_R_BC_PKT;                     /**< Rx Broadcast Packets Statistic Register, offset: 0x288 */\r\n  __I  uint32_t RMON_R_MC_PKT;                     /**< Rx Multicast Packets Statistic Register, offset: 0x28C */\r\n  __I  uint32_t RMON_R_CRC_ALIGN;                  /**< Rx Packets with CRC/Align Error Statistic Register, offset: 0x290 */\r\n  __I  uint32_t RMON_R_UNDERSIZE;                  /**< Rx Packets with Less Than 64 Bytes and Good CRC Statistic Register, offset: 0x294 */\r\n  __I  uint32_t RMON_R_OVERSIZE;                   /**< Rx Packets Greater Than MAX_FL and Good CRC Statistic Register, offset: 0x298 */\r\n  __I  uint32_t RMON_R_FRAG;                       /**< Rx Packets Less Than 64 Bytes and Bad CRC Statistic Register, offset: 0x29C */\r\n  __I  uint32_t RMON_R_JAB;                        /**< Rx Packets Greater Than MAX_FL Bytes and Bad CRC Statistic Register, offset: 0x2A0 */\r\n       uint8_t RESERVED_16[4];\r\n  __I  uint32_t RMON_R_P64;                        /**< Rx 64-Byte Packets Statistic Register, offset: 0x2A8 */\r\n  __I  uint32_t RMON_R_P65TO127;                   /**< Rx 65- to 127-Byte Packets Statistic Register, offset: 0x2AC */\r\n  __I  uint32_t RMON_R_P128TO255;                  /**< Rx 128- to 255-Byte Packets Statistic Register, offset: 0x2B0 */\r\n  __I  uint32_t RMON_R_P256TO511;                  /**< Rx 256- to 511-Byte Packets Statistic Register, offset: 0x2B4 */\r\n  __I  uint32_t RMON_R_P512TO1023;                 /**< Rx 512- to 1023-Byte Packets Statistic Register, offset: 0x2B8 */\r\n  __I  uint32_t RMON_R_P1024TO2047;                /**< Rx 1024- to 2047-Byte Packets Statistic Register, offset: 0x2BC */\r\n  __I  uint32_t RMON_R_P_GTE2048;                  /**< Rx Packets Greater than 2048 Bytes Statistic Register, offset: 0x2C0 */\r\n  __I  uint32_t RMON_R_OCTETS;                     /**< Rx Octets Statistic Register, offset: 0x2C4 */\r\n  __I  uint32_t IEEE_R_DROP;                       /**< Frames not Counted Correctly Statistic Register, offset: 0x2C8 */\r\n  __I  uint32_t IEEE_R_FRAME_OK;                   /**< Frames Received OK Statistic Register, offset: 0x2CC */\r\n  __I  uint32_t IEEE_R_CRC;                        /**< Frames Received with CRC Error Statistic Register, offset: 0x2D0 */\r\n  __I  uint32_t IEEE_R_ALIGN;                      /**< Frames Received with Alignment Error Statistic Register, offset: 0x2D4 */\r\n  __I  uint32_t IEEE_R_MACERR;                     /**< Receive FIFO Overflow Count Statistic Register, offset: 0x2D8 */\r\n  __I  uint32_t IEEE_R_FDXFC;                      /**< Flow Control Pause Frames Received Statistic Register, offset: 0x2DC */\r\n  __I  uint32_t IEEE_R_OCTETS_OK;                  /**< Octet Count for Frames Received without Error Statistic Register, offset: 0x2E0 */\r\n       uint8_t RESERVED_17[284];\r\n  __IO uint32_t ATCR;                              /**< Adjustable Timer Control Register, offset: 0x400 */\r\n  __IO uint32_t ATVR;                              /**< Timer Value Register, offset: 0x404 */\r\n  __IO uint32_t ATOFF;                             /**< Timer Offset Register, offset: 0x408 */\r\n  __IO uint32_t ATPER;                             /**< Timer Period Register, offset: 0x40C */\r\n  __IO uint32_t ATCOR;                             /**< Timer Correction Register, offset: 0x410 */\r\n  __IO uint32_t ATINC;                             /**< Time-Stamping Clock Period Register, offset: 0x414 */\r\n  __I  uint32_t ATSTMP;                            /**< Timestamp of Last Transmitted Frame, offset: 0x418 */\r\n       uint8_t RESERVED_18[488];\r\n  __IO uint32_t TGSR;                              /**< Timer Global Status Register, offset: 0x604 */\r\n  struct {                                         /* offset: 0x608, array step: 0x8 */\r\n    __IO uint32_t TCSR;                              /**< Timer Control Status Register, array offset: 0x608, array step: 0x8 */\r\n    __IO uint32_t TCCR;                              /**< Timer Compare Capture Register, array offset: 0x60C, array step: 0x8 */\r\n  } CHANNEL[4];\r\n} ENET_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- ENET Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup ENET_Register_Masks ENET Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name EIR - Interrupt Event Register */\r\n/*! @{ */\r\n\r\n#define ENET_EIR_TS_TIMER_MASK                   (0x8000U)\r\n#define ENET_EIR_TS_TIMER_SHIFT                  (15U)\r\n/*! TS_TIMER - Timestamp Timer */\r\n#define ENET_EIR_TS_TIMER(x)                     (((uint32_t)(((uint32_t)(x)) << ENET_EIR_TS_TIMER_SHIFT)) & ENET_EIR_TS_TIMER_MASK)\r\n\r\n#define ENET_EIR_TS_AVAIL_MASK                   (0x10000U)\r\n#define ENET_EIR_TS_AVAIL_SHIFT                  (16U)\r\n/*! TS_AVAIL - Transmit Timestamp Available */\r\n#define ENET_EIR_TS_AVAIL(x)                     (((uint32_t)(((uint32_t)(x)) << ENET_EIR_TS_AVAIL_SHIFT)) & ENET_EIR_TS_AVAIL_MASK)\r\n\r\n#define ENET_EIR_WAKEUP_MASK                     (0x20000U)\r\n#define ENET_EIR_WAKEUP_SHIFT                    (17U)\r\n/*! WAKEUP - Node Wakeup Request Indication */\r\n#define ENET_EIR_WAKEUP(x)                       (((uint32_t)(((uint32_t)(x)) << ENET_EIR_WAKEUP_SHIFT)) & ENET_EIR_WAKEUP_MASK)\r\n\r\n#define ENET_EIR_PLR_MASK                        (0x40000U)\r\n#define ENET_EIR_PLR_SHIFT                       (18U)\r\n/*! PLR - Payload Receive Error */\r\n#define ENET_EIR_PLR(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_EIR_PLR_SHIFT)) & ENET_EIR_PLR_MASK)\r\n\r\n#define ENET_EIR_UN_MASK                         (0x80000U)\r\n#define ENET_EIR_UN_SHIFT                        (19U)\r\n/*! UN - Transmit FIFO Underrun */\r\n#define ENET_EIR_UN(x)                           (((uint32_t)(((uint32_t)(x)) << ENET_EIR_UN_SHIFT)) & ENET_EIR_UN_MASK)\r\n\r\n#define ENET_EIR_RL_MASK                         (0x100000U)\r\n#define ENET_EIR_RL_SHIFT                        (20U)\r\n/*! RL - Collision Retry Limit */\r\n#define ENET_EIR_RL(x)                           (((uint32_t)(((uint32_t)(x)) << ENET_EIR_RL_SHIFT)) & ENET_EIR_RL_MASK)\r\n\r\n#define ENET_EIR_LC_MASK                         (0x200000U)\r\n#define ENET_EIR_LC_SHIFT                        (21U)\r\n/*! LC - Late Collision */\r\n#define ENET_EIR_LC(x)                           (((uint32_t)(((uint32_t)(x)) << ENET_EIR_LC_SHIFT)) & ENET_EIR_LC_MASK)\r\n\r\n#define ENET_EIR_EBERR_MASK                      (0x400000U)\r\n#define ENET_EIR_EBERR_SHIFT                     (22U)\r\n/*! EBERR - Ethernet Bus Error */\r\n#define ENET_EIR_EBERR(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_EIR_EBERR_SHIFT)) & ENET_EIR_EBERR_MASK)\r\n\r\n#define ENET_EIR_MII_MASK                        (0x800000U)\r\n#define ENET_EIR_MII_SHIFT                       (23U)\r\n/*! MII - MII Interrupt. */\r\n#define ENET_EIR_MII(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_EIR_MII_SHIFT)) & ENET_EIR_MII_MASK)\r\n\r\n#define ENET_EIR_RXB_MASK                        (0x1000000U)\r\n#define ENET_EIR_RXB_SHIFT                       (24U)\r\n/*! RXB - Receive Buffer Interrupt */\r\n#define ENET_EIR_RXB(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_EIR_RXB_SHIFT)) & ENET_EIR_RXB_MASK)\r\n\r\n#define ENET_EIR_RXF_MASK                        (0x2000000U)\r\n#define ENET_EIR_RXF_SHIFT                       (25U)\r\n/*! RXF - Receive Frame Interrupt */\r\n#define ENET_EIR_RXF(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_EIR_RXF_SHIFT)) & ENET_EIR_RXF_MASK)\r\n\r\n#define ENET_EIR_TXB_MASK                        (0x4000000U)\r\n#define ENET_EIR_TXB_SHIFT                       (26U)\r\n/*! TXB - Transmit Buffer Interrupt */\r\n#define ENET_EIR_TXB(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_EIR_TXB_SHIFT)) & ENET_EIR_TXB_MASK)\r\n\r\n#define ENET_EIR_TXF_MASK                        (0x8000000U)\r\n#define ENET_EIR_TXF_SHIFT                       (27U)\r\n/*! TXF - Transmit Frame Interrupt */\r\n#define ENET_EIR_TXF(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_EIR_TXF_SHIFT)) & ENET_EIR_TXF_MASK)\r\n\r\n#define ENET_EIR_GRA_MASK                        (0x10000000U)\r\n#define ENET_EIR_GRA_SHIFT                       (28U)\r\n/*! GRA - Graceful Stop Complete */\r\n#define ENET_EIR_GRA(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_EIR_GRA_SHIFT)) & ENET_EIR_GRA_MASK)\r\n\r\n#define ENET_EIR_BABT_MASK                       (0x20000000U)\r\n#define ENET_EIR_BABT_SHIFT                      (29U)\r\n/*! BABT - Babbling Transmit Error */\r\n#define ENET_EIR_BABT(x)                         (((uint32_t)(((uint32_t)(x)) << ENET_EIR_BABT_SHIFT)) & ENET_EIR_BABT_MASK)\r\n\r\n#define ENET_EIR_BABR_MASK                       (0x40000000U)\r\n#define ENET_EIR_BABR_SHIFT                      (30U)\r\n/*! BABR - Babbling Receive Error */\r\n#define ENET_EIR_BABR(x)                         (((uint32_t)(((uint32_t)(x)) << ENET_EIR_BABR_SHIFT)) & ENET_EIR_BABR_MASK)\r\n/*! @} */\r\n\r\n/*! @name EIMR - Interrupt Mask Register */\r\n/*! @{ */\r\n\r\n#define ENET_EIMR_TS_TIMER_MASK                  (0x8000U)\r\n#define ENET_EIMR_TS_TIMER_SHIFT                 (15U)\r\n/*! TS_TIMER - TS_TIMER Interrupt Mask\r\n *  0b0..The corresponding interrupt source is masked.\r\n *  0b1..The corresponding interrupt source is not masked.\r\n */\r\n#define ENET_EIMR_TS_TIMER(x)                    (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_TS_TIMER_SHIFT)) & ENET_EIMR_TS_TIMER_MASK)\r\n\r\n#define ENET_EIMR_TS_AVAIL_MASK                  (0x10000U)\r\n#define ENET_EIMR_TS_AVAIL_SHIFT                 (16U)\r\n/*! TS_AVAIL - TS_AVAIL Interrupt Mask\r\n *  0b0..The corresponding interrupt source is masked.\r\n *  0b1..The corresponding interrupt source is not masked.\r\n */\r\n#define ENET_EIMR_TS_AVAIL(x)                    (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_TS_AVAIL_SHIFT)) & ENET_EIMR_TS_AVAIL_MASK)\r\n\r\n#define ENET_EIMR_WAKEUP_MASK                    (0x20000U)\r\n#define ENET_EIMR_WAKEUP_SHIFT                   (17U)\r\n/*! WAKEUP - WAKEUP Interrupt Mask\r\n *  0b0..The corresponding interrupt source is masked.\r\n *  0b1..The corresponding interrupt source is not masked.\r\n */\r\n#define ENET_EIMR_WAKEUP(x)                      (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_WAKEUP_SHIFT)) & ENET_EIMR_WAKEUP_MASK)\r\n\r\n#define ENET_EIMR_PLR_MASK                       (0x40000U)\r\n#define ENET_EIMR_PLR_SHIFT                      (18U)\r\n/*! PLR - PLR Interrupt Mask\r\n *  0b0..The corresponding interrupt source is masked.\r\n *  0b1..The corresponding interrupt source is not masked.\r\n */\r\n#define ENET_EIMR_PLR(x)                         (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_PLR_SHIFT)) & ENET_EIMR_PLR_MASK)\r\n\r\n#define ENET_EIMR_UN_MASK                        (0x80000U)\r\n#define ENET_EIMR_UN_SHIFT                       (19U)\r\n/*! UN - UN Interrupt Mask\r\n *  0b0..The corresponding interrupt source is masked.\r\n *  0b1..The corresponding interrupt source is not masked.\r\n */\r\n#define ENET_EIMR_UN(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_UN_SHIFT)) & ENET_EIMR_UN_MASK)\r\n\r\n#define ENET_EIMR_RL_MASK                        (0x100000U)\r\n#define ENET_EIMR_RL_SHIFT                       (20U)\r\n/*! RL - RL Interrupt Mask\r\n *  0b0..The corresponding interrupt source is masked.\r\n *  0b1..The corresponding interrupt source is not masked.\r\n */\r\n#define ENET_EIMR_RL(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_RL_SHIFT)) & ENET_EIMR_RL_MASK)\r\n\r\n#define ENET_EIMR_LC_MASK                        (0x200000U)\r\n#define ENET_EIMR_LC_SHIFT                       (21U)\r\n/*! LC - LC Interrupt Mask\r\n *  0b0..The corresponding interrupt source is masked.\r\n *  0b1..The corresponding interrupt source is not masked.\r\n */\r\n#define ENET_EIMR_LC(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_LC_SHIFT)) & ENET_EIMR_LC_MASK)\r\n\r\n#define ENET_EIMR_EBERR_MASK                     (0x400000U)\r\n#define ENET_EIMR_EBERR_SHIFT                    (22U)\r\n/*! EBERR - EBERR Interrupt Mask\r\n *  0b0..The corresponding interrupt source is masked.\r\n *  0b1..The corresponding interrupt source is not masked.\r\n */\r\n#define ENET_EIMR_EBERR(x)                       (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_EBERR_SHIFT)) & ENET_EIMR_EBERR_MASK)\r\n\r\n#define ENET_EIMR_MII_MASK                       (0x800000U)\r\n#define ENET_EIMR_MII_SHIFT                      (23U)\r\n/*! MII - MII Interrupt Mask\r\n *  0b0..The corresponding interrupt source is masked.\r\n *  0b1..The corresponding interrupt source is not masked.\r\n */\r\n#define ENET_EIMR_MII(x)                         (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_MII_SHIFT)) & ENET_EIMR_MII_MASK)\r\n\r\n#define ENET_EIMR_RXB_MASK                       (0x1000000U)\r\n#define ENET_EIMR_RXB_SHIFT                      (24U)\r\n/*! RXB - RXB Interrupt Mask\r\n *  0b0..The corresponding interrupt source is masked.\r\n *  0b1..The corresponding interrupt source is not masked.\r\n */\r\n#define ENET_EIMR_RXB(x)                         (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_RXB_SHIFT)) & ENET_EIMR_RXB_MASK)\r\n\r\n#define ENET_EIMR_RXF_MASK                       (0x2000000U)\r\n#define ENET_EIMR_RXF_SHIFT                      (25U)\r\n/*! RXF - RXF Interrupt Mask\r\n *  0b0..The corresponding interrupt source is masked.\r\n *  0b1..The corresponding interrupt source is not masked.\r\n */\r\n#define ENET_EIMR_RXF(x)                         (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_RXF_SHIFT)) & ENET_EIMR_RXF_MASK)\r\n\r\n#define ENET_EIMR_TXB_MASK                       (0x4000000U)\r\n#define ENET_EIMR_TXB_SHIFT                      (26U)\r\n/*! TXB - TXB Interrupt Mask\r\n *  0b0..The corresponding interrupt source is masked.\r\n *  0b1..The corresponding interrupt source is not masked.\r\n */\r\n#define ENET_EIMR_TXB(x)                         (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_TXB_SHIFT)) & ENET_EIMR_TXB_MASK)\r\n\r\n#define ENET_EIMR_TXF_MASK                       (0x8000000U)\r\n#define ENET_EIMR_TXF_SHIFT                      (27U)\r\n/*! TXF - TXF Interrupt Mask\r\n *  0b0..The corresponding interrupt source is masked.\r\n *  0b1..The corresponding interrupt source is not masked.\r\n */\r\n#define ENET_EIMR_TXF(x)                         (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_TXF_SHIFT)) & ENET_EIMR_TXF_MASK)\r\n\r\n#define ENET_EIMR_GRA_MASK                       (0x10000000U)\r\n#define ENET_EIMR_GRA_SHIFT                      (28U)\r\n/*! GRA - GRA Interrupt Mask\r\n *  0b0..The corresponding interrupt source is masked.\r\n *  0b1..The corresponding interrupt source is not masked.\r\n */\r\n#define ENET_EIMR_GRA(x)                         (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_GRA_SHIFT)) & ENET_EIMR_GRA_MASK)\r\n\r\n#define ENET_EIMR_BABT_MASK                      (0x20000000U)\r\n#define ENET_EIMR_BABT_SHIFT                     (29U)\r\n/*! BABT - BABT Interrupt Mask\r\n *  0b0..The corresponding interrupt source is masked.\r\n *  0b1..The corresponding interrupt source is not masked.\r\n */\r\n#define ENET_EIMR_BABT(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_BABT_SHIFT)) & ENET_EIMR_BABT_MASK)\r\n\r\n#define ENET_EIMR_BABR_MASK                      (0x40000000U)\r\n#define ENET_EIMR_BABR_SHIFT                     (30U)\r\n/*! BABR - BABR Interrupt Mask\r\n *  0b0..The corresponding interrupt source is masked.\r\n *  0b1..The corresponding interrupt source is not masked.\r\n */\r\n#define ENET_EIMR_BABR(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_EIMR_BABR_SHIFT)) & ENET_EIMR_BABR_MASK)\r\n/*! @} */\r\n\r\n/*! @name RDAR - Receive Descriptor Active Register - Ring 0 */\r\n/*! @{ */\r\n\r\n#define ENET_RDAR_RDAR_MASK                      (0x1000000U)\r\n#define ENET_RDAR_RDAR_SHIFT                     (24U)\r\n/*! RDAR - Receive Descriptor Active */\r\n#define ENET_RDAR_RDAR(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_RDAR_RDAR_SHIFT)) & ENET_RDAR_RDAR_MASK)\r\n/*! @} */\r\n\r\n/*! @name TDAR - Transmit Descriptor Active Register - Ring 0 */\r\n/*! @{ */\r\n\r\n#define ENET_TDAR_TDAR_MASK                      (0x1000000U)\r\n#define ENET_TDAR_TDAR_SHIFT                     (24U)\r\n/*! TDAR - Transmit Descriptor Active */\r\n#define ENET_TDAR_TDAR(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_TDAR_TDAR_SHIFT)) & ENET_TDAR_TDAR_MASK)\r\n/*! @} */\r\n\r\n/*! @name ECR - Ethernet Control Register */\r\n/*! @{ */\r\n\r\n#define ENET_ECR_RESET_MASK                      (0x1U)\r\n#define ENET_ECR_RESET_SHIFT                     (0U)\r\n/*! RESET - Ethernet MAC Reset */\r\n#define ENET_ECR_RESET(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_ECR_RESET_SHIFT)) & ENET_ECR_RESET_MASK)\r\n\r\n#define ENET_ECR_ETHEREN_MASK                    (0x2U)\r\n#define ENET_ECR_ETHEREN_SHIFT                   (1U)\r\n/*! ETHEREN - Ethernet Enable\r\n *  0b0..Reception immediately stops and transmission stops after a bad CRC is appended to any currently transmitted frame.\r\n *  0b1..MAC is enabled, and reception and transmission are possible.\r\n */\r\n#define ENET_ECR_ETHEREN(x)                      (((uint32_t)(((uint32_t)(x)) << ENET_ECR_ETHEREN_SHIFT)) & ENET_ECR_ETHEREN_MASK)\r\n\r\n#define ENET_ECR_MAGICEN_MASK                    (0x4U)\r\n#define ENET_ECR_MAGICEN_SHIFT                   (2U)\r\n/*! MAGICEN - Magic Packet Detection Enable\r\n *  0b0..Magic detection logic disabled.\r\n *  0b1..The MAC core detects magic packets and asserts EIR[WAKEUP] when a frame is detected.\r\n */\r\n#define ENET_ECR_MAGICEN(x)                      (((uint32_t)(((uint32_t)(x)) << ENET_ECR_MAGICEN_SHIFT)) & ENET_ECR_MAGICEN_MASK)\r\n\r\n#define ENET_ECR_SLEEP_MASK                      (0x8U)\r\n#define ENET_ECR_SLEEP_SHIFT                     (3U)\r\n/*! SLEEP - Sleep Mode Enable\r\n *  0b0..Normal operating mode.\r\n *  0b1..Sleep mode.\r\n */\r\n#define ENET_ECR_SLEEP(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_ECR_SLEEP_SHIFT)) & ENET_ECR_SLEEP_MASK)\r\n\r\n#define ENET_ECR_EN1588_MASK                     (0x10U)\r\n#define ENET_ECR_EN1588_SHIFT                    (4U)\r\n/*! EN1588 - EN1588 Enable\r\n *  0b0..Legacy FEC buffer descriptors and functions enabled.\r\n *  0b1..Enhanced frame time-stamping functions enabled. Has no effect within the MAC besides controlling the DMA control bit ena_1588.\r\n */\r\n#define ENET_ECR_EN1588(x)                       (((uint32_t)(((uint32_t)(x)) << ENET_ECR_EN1588_SHIFT)) & ENET_ECR_EN1588_MASK)\r\n\r\n#define ENET_ECR_DBGEN_MASK                      (0x40U)\r\n#define ENET_ECR_DBGEN_SHIFT                     (6U)\r\n/*! DBGEN - Debug Enable\r\n *  0b0..MAC continues operation in debug mode.\r\n *  0b1..MAC enters hardware freeze mode when the processor is in debug mode.\r\n */\r\n#define ENET_ECR_DBGEN(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_ECR_DBGEN_SHIFT)) & ENET_ECR_DBGEN_MASK)\r\n\r\n#define ENET_ECR_DBSWP_MASK                      (0x100U)\r\n#define ENET_ECR_DBSWP_SHIFT                     (8U)\r\n/*! DBSWP - Descriptor Byte Swapping Enable\r\n *  0b0..The buffer descriptor bytes are not swapped to support big-endian devices.\r\n *  0b1..The buffer descriptor bytes are swapped to support little-endian devices.\r\n */\r\n#define ENET_ECR_DBSWP(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_ECR_DBSWP_SHIFT)) & ENET_ECR_DBSWP_MASK)\r\n/*! @} */\r\n\r\n/*! @name MMFR - MII Management Frame Register */\r\n/*! @{ */\r\n\r\n#define ENET_MMFR_DATA_MASK                      (0xFFFFU)\r\n#define ENET_MMFR_DATA_SHIFT                     (0U)\r\n/*! DATA - Management Frame Data */\r\n#define ENET_MMFR_DATA(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_MMFR_DATA_SHIFT)) & ENET_MMFR_DATA_MASK)\r\n\r\n#define ENET_MMFR_TA_MASK                        (0x30000U)\r\n#define ENET_MMFR_TA_SHIFT                       (16U)\r\n/*! TA - Turn Around */\r\n#define ENET_MMFR_TA(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_MMFR_TA_SHIFT)) & ENET_MMFR_TA_MASK)\r\n\r\n#define ENET_MMFR_RA_MASK                        (0x7C0000U)\r\n#define ENET_MMFR_RA_SHIFT                       (18U)\r\n/*! RA - Register Address */\r\n#define ENET_MMFR_RA(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_MMFR_RA_SHIFT)) & ENET_MMFR_RA_MASK)\r\n\r\n#define ENET_MMFR_PA_MASK                        (0xF800000U)\r\n#define ENET_MMFR_PA_SHIFT                       (23U)\r\n/*! PA - PHY Address */\r\n#define ENET_MMFR_PA(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_MMFR_PA_SHIFT)) & ENET_MMFR_PA_MASK)\r\n\r\n#define ENET_MMFR_OP_MASK                        (0x30000000U)\r\n#define ENET_MMFR_OP_SHIFT                       (28U)\r\n/*! OP - Operation Code */\r\n#define ENET_MMFR_OP(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_MMFR_OP_SHIFT)) & ENET_MMFR_OP_MASK)\r\n\r\n#define ENET_MMFR_ST_MASK                        (0xC0000000U)\r\n#define ENET_MMFR_ST_SHIFT                       (30U)\r\n/*! ST - Start Of Frame Delimiter */\r\n#define ENET_MMFR_ST(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_MMFR_ST_SHIFT)) & ENET_MMFR_ST_MASK)\r\n/*! @} */\r\n\r\n/*! @name MSCR - MII Speed Control Register */\r\n/*! @{ */\r\n\r\n#define ENET_MSCR_MII_SPEED_MASK                 (0x7EU)\r\n#define ENET_MSCR_MII_SPEED_SHIFT                (1U)\r\n/*! MII_SPEED - MII Speed */\r\n#define ENET_MSCR_MII_SPEED(x)                   (((uint32_t)(((uint32_t)(x)) << ENET_MSCR_MII_SPEED_SHIFT)) & ENET_MSCR_MII_SPEED_MASK)\r\n\r\n#define ENET_MSCR_DIS_PRE_MASK                   (0x80U)\r\n#define ENET_MSCR_DIS_PRE_SHIFT                  (7U)\r\n/*! DIS_PRE - Disable Preamble\r\n *  0b0..Preamble enabled.\r\n *  0b1..Preamble (32 ones) is not prepended to the MII management frame.\r\n */\r\n#define ENET_MSCR_DIS_PRE(x)                     (((uint32_t)(((uint32_t)(x)) << ENET_MSCR_DIS_PRE_SHIFT)) & ENET_MSCR_DIS_PRE_MASK)\r\n\r\n#define ENET_MSCR_HOLDTIME_MASK                  (0x700U)\r\n#define ENET_MSCR_HOLDTIME_SHIFT                 (8U)\r\n/*! HOLDTIME - Hold time On MDIO Output\r\n *  0b000..1 internal module clock cycle\r\n *  0b001..2 internal module clock cycles\r\n *  0b010..3 internal module clock cycles\r\n *  0b111..8 internal module clock cycles\r\n */\r\n#define ENET_MSCR_HOLDTIME(x)                    (((uint32_t)(((uint32_t)(x)) << ENET_MSCR_HOLDTIME_SHIFT)) & ENET_MSCR_HOLDTIME_MASK)\r\n/*! @} */\r\n\r\n/*! @name MIBC - MIB Control Register */\r\n/*! @{ */\r\n\r\n#define ENET_MIBC_MIB_CLEAR_MASK                 (0x20000000U)\r\n#define ENET_MIBC_MIB_CLEAR_SHIFT                (29U)\r\n/*! MIB_CLEAR - MIB Clear\r\n *  0b0..See note above.\r\n *  0b1..All statistics counters are reset to 0.\r\n */\r\n#define ENET_MIBC_MIB_CLEAR(x)                   (((uint32_t)(((uint32_t)(x)) << ENET_MIBC_MIB_CLEAR_SHIFT)) & ENET_MIBC_MIB_CLEAR_MASK)\r\n\r\n#define ENET_MIBC_MIB_IDLE_MASK                  (0x40000000U)\r\n#define ENET_MIBC_MIB_IDLE_SHIFT                 (30U)\r\n/*! MIB_IDLE - MIB Idle\r\n *  0b0..The MIB block is updating MIB counters.\r\n *  0b1..The MIB block is not currently updating any MIB counters.\r\n */\r\n#define ENET_MIBC_MIB_IDLE(x)                    (((uint32_t)(((uint32_t)(x)) << ENET_MIBC_MIB_IDLE_SHIFT)) & ENET_MIBC_MIB_IDLE_MASK)\r\n\r\n#define ENET_MIBC_MIB_DIS_MASK                   (0x80000000U)\r\n#define ENET_MIBC_MIB_DIS_SHIFT                  (31U)\r\n/*! MIB_DIS - Disable MIB Logic\r\n *  0b0..MIB logic is enabled.\r\n *  0b1..MIB logic is disabled. The MIB logic halts and does not update any MIB counters.\r\n */\r\n#define ENET_MIBC_MIB_DIS(x)                     (((uint32_t)(((uint32_t)(x)) << ENET_MIBC_MIB_DIS_SHIFT)) & ENET_MIBC_MIB_DIS_MASK)\r\n/*! @} */\r\n\r\n/*! @name RCR - Receive Control Register */\r\n/*! @{ */\r\n\r\n#define ENET_RCR_LOOP_MASK                       (0x1U)\r\n#define ENET_RCR_LOOP_SHIFT                      (0U)\r\n/*! LOOP - Internal Loopback\r\n *  0b0..Loopback disabled.\r\n *  0b1..Transmitted frames are looped back internal to the device and transmit MII output signals are not asserted. DRT must be cleared.\r\n */\r\n#define ENET_RCR_LOOP(x)                         (((uint32_t)(((uint32_t)(x)) << ENET_RCR_LOOP_SHIFT)) & ENET_RCR_LOOP_MASK)\r\n\r\n#define ENET_RCR_DRT_MASK                        (0x2U)\r\n#define ENET_RCR_DRT_SHIFT                       (1U)\r\n/*! DRT - Disable Receive On Transmit\r\n *  0b0..Receive path operates independently of transmit (i.e., full-duplex mode). Can also be used to monitor transmit activity in half-duplex mode.\r\n *  0b1..Disable reception of frames while transmitting. (Normally used for half-duplex mode.)\r\n */\r\n#define ENET_RCR_DRT(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_RCR_DRT_SHIFT)) & ENET_RCR_DRT_MASK)\r\n\r\n#define ENET_RCR_MII_MODE_MASK                   (0x4U)\r\n#define ENET_RCR_MII_MODE_SHIFT                  (2U)\r\n/*! MII_MODE - Media Independent Interface Mode\r\n *  0b0..Reserved.\r\n *  0b1..MII or RMII mode, as indicated by the RMII_MODE field.\r\n */\r\n#define ENET_RCR_MII_MODE(x)                     (((uint32_t)(((uint32_t)(x)) << ENET_RCR_MII_MODE_SHIFT)) & ENET_RCR_MII_MODE_MASK)\r\n\r\n#define ENET_RCR_PROM_MASK                       (0x8U)\r\n#define ENET_RCR_PROM_SHIFT                      (3U)\r\n/*! PROM - Promiscuous Mode\r\n *  0b0..Disabled.\r\n *  0b1..Enabled.\r\n */\r\n#define ENET_RCR_PROM(x)                         (((uint32_t)(((uint32_t)(x)) << ENET_RCR_PROM_SHIFT)) & ENET_RCR_PROM_MASK)\r\n\r\n#define ENET_RCR_BC_REJ_MASK                     (0x10U)\r\n#define ENET_RCR_BC_REJ_SHIFT                    (4U)\r\n/*! BC_REJ - Broadcast Frame Reject\r\n *  0b0..Will not reject frames as described above\r\n *  0b1..Will reject frames as described above\r\n */\r\n#define ENET_RCR_BC_REJ(x)                       (((uint32_t)(((uint32_t)(x)) << ENET_RCR_BC_REJ_SHIFT)) & ENET_RCR_BC_REJ_MASK)\r\n\r\n#define ENET_RCR_FCE_MASK                        (0x20U)\r\n#define ENET_RCR_FCE_SHIFT                       (5U)\r\n/*! FCE - Flow Control Enable\r\n *  0b0..Disable flow control\r\n *  0b1..Enable flow control\r\n */\r\n#define ENET_RCR_FCE(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_RCR_FCE_SHIFT)) & ENET_RCR_FCE_MASK)\r\n\r\n#define ENET_RCR_RMII_MODE_MASK                  (0x100U)\r\n#define ENET_RCR_RMII_MODE_SHIFT                 (8U)\r\n/*! RMII_MODE - RMII Mode Enable\r\n *  0b0..MAC configured for MII mode.\r\n *  0b1..MAC configured for RMII operation.\r\n */\r\n#define ENET_RCR_RMII_MODE(x)                    (((uint32_t)(((uint32_t)(x)) << ENET_RCR_RMII_MODE_SHIFT)) & ENET_RCR_RMII_MODE_MASK)\r\n\r\n#define ENET_RCR_RMII_10T_MASK                   (0x200U)\r\n#define ENET_RCR_RMII_10T_SHIFT                  (9U)\r\n/*! RMII_10T\r\n *  0b0..100-Mbit/s operation.\r\n *  0b1..10-Mbit/s operation.\r\n */\r\n#define ENET_RCR_RMII_10T(x)                     (((uint32_t)(((uint32_t)(x)) << ENET_RCR_RMII_10T_SHIFT)) & ENET_RCR_RMII_10T_MASK)\r\n\r\n#define ENET_RCR_PADEN_MASK                      (0x1000U)\r\n#define ENET_RCR_PADEN_SHIFT                     (12U)\r\n/*! PADEN - Enable Frame Padding Remove On Receive\r\n *  0b0..No padding is removed on receive by the MAC.\r\n *  0b1..Padding is removed from received frames.\r\n */\r\n#define ENET_RCR_PADEN(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_RCR_PADEN_SHIFT)) & ENET_RCR_PADEN_MASK)\r\n\r\n#define ENET_RCR_PAUFWD_MASK                     (0x2000U)\r\n#define ENET_RCR_PAUFWD_SHIFT                    (13U)\r\n/*! PAUFWD - Terminate/Forward Pause Frames\r\n *  0b0..Pause frames are terminated and discarded in the MAC.\r\n *  0b1..Pause frames are forwarded to the user application.\r\n */\r\n#define ENET_RCR_PAUFWD(x)                       (((uint32_t)(((uint32_t)(x)) << ENET_RCR_PAUFWD_SHIFT)) & ENET_RCR_PAUFWD_MASK)\r\n\r\n#define ENET_RCR_CRCFWD_MASK                     (0x4000U)\r\n#define ENET_RCR_CRCFWD_SHIFT                    (14U)\r\n/*! CRCFWD - Terminate/Forward Received CRC\r\n *  0b0..The CRC field of received frames is transmitted to the user application.\r\n *  0b1..The CRC field is stripped from the frame.\r\n */\r\n#define ENET_RCR_CRCFWD(x)                       (((uint32_t)(((uint32_t)(x)) << ENET_RCR_CRCFWD_SHIFT)) & ENET_RCR_CRCFWD_MASK)\r\n\r\n#define ENET_RCR_CFEN_MASK                       (0x8000U)\r\n#define ENET_RCR_CFEN_SHIFT                      (15U)\r\n/*! CFEN - MAC Control Frame Enable\r\n *  0b0..MAC control frames with any opcode other than 0x0001 (pause frame) are accepted and forwarded to the client interface.\r\n *  0b1..MAC control frames with any opcode other than 0x0001 (pause frame) are silently discarded.\r\n */\r\n#define ENET_RCR_CFEN(x)                         (((uint32_t)(((uint32_t)(x)) << ENET_RCR_CFEN_SHIFT)) & ENET_RCR_CFEN_MASK)\r\n\r\n#define ENET_RCR_MAX_FL_MASK                     (0x3FFF0000U)\r\n#define ENET_RCR_MAX_FL_SHIFT                    (16U)\r\n/*! MAX_FL - Maximum Frame Length */\r\n#define ENET_RCR_MAX_FL(x)                       (((uint32_t)(((uint32_t)(x)) << ENET_RCR_MAX_FL_SHIFT)) & ENET_RCR_MAX_FL_MASK)\r\n\r\n#define ENET_RCR_NLC_MASK                        (0x40000000U)\r\n#define ENET_RCR_NLC_SHIFT                       (30U)\r\n/*! NLC - Payload Length Check Disable\r\n *  0b0..The payload length check is disabled.\r\n *  0b1..The core checks the frame's payload length with the frame length/type field. Errors are indicated in the EIR[PLR] field.\r\n */\r\n#define ENET_RCR_NLC(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_RCR_NLC_SHIFT)) & ENET_RCR_NLC_MASK)\r\n\r\n#define ENET_RCR_GRS_MASK                        (0x80000000U)\r\n#define ENET_RCR_GRS_SHIFT                       (31U)\r\n/*! GRS - Graceful Receive Stopped\r\n *  0b0..Receive not stopped\r\n *  0b1..Receive stopped\r\n */\r\n#define ENET_RCR_GRS(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_RCR_GRS_SHIFT)) & ENET_RCR_GRS_MASK)\r\n/*! @} */\r\n\r\n/*! @name TCR - Transmit Control Register */\r\n/*! @{ */\r\n\r\n#define ENET_TCR_GTS_MASK                        (0x1U)\r\n#define ENET_TCR_GTS_SHIFT                       (0U)\r\n/*! GTS - Graceful Transmit Stop\r\n *  0b0..Disable graceful transmit stop\r\n *  0b1..Enable graceful transmit stop\r\n */\r\n#define ENET_TCR_GTS(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_TCR_GTS_SHIFT)) & ENET_TCR_GTS_MASK)\r\n\r\n#define ENET_TCR_FDEN_MASK                       (0x4U)\r\n#define ENET_TCR_FDEN_SHIFT                      (2U)\r\n/*! FDEN - Full-Duplex Enable\r\n *  0b0..Disable full-duplex\r\n *  0b1..Enable full-duplex\r\n */\r\n#define ENET_TCR_FDEN(x)                         (((uint32_t)(((uint32_t)(x)) << ENET_TCR_FDEN_SHIFT)) & ENET_TCR_FDEN_MASK)\r\n\r\n#define ENET_TCR_TFC_PAUSE_MASK                  (0x8U)\r\n#define ENET_TCR_TFC_PAUSE_SHIFT                 (3U)\r\n/*! TFC_PAUSE - Transmit Frame Control Pause\r\n *  0b0..No PAUSE frame transmitted.\r\n *  0b1..The MAC stops transmission of data frames after the current transmission is complete.\r\n */\r\n#define ENET_TCR_TFC_PAUSE(x)                    (((uint32_t)(((uint32_t)(x)) << ENET_TCR_TFC_PAUSE_SHIFT)) & ENET_TCR_TFC_PAUSE_MASK)\r\n\r\n#define ENET_TCR_RFC_PAUSE_MASK                  (0x10U)\r\n#define ENET_TCR_RFC_PAUSE_SHIFT                 (4U)\r\n/*! RFC_PAUSE - Receive Frame Control Pause */\r\n#define ENET_TCR_RFC_PAUSE(x)                    (((uint32_t)(((uint32_t)(x)) << ENET_TCR_RFC_PAUSE_SHIFT)) & ENET_TCR_RFC_PAUSE_MASK)\r\n\r\n#define ENET_TCR_ADDSEL_MASK                     (0xE0U)\r\n#define ENET_TCR_ADDSEL_SHIFT                    (5U)\r\n/*! ADDSEL - Source MAC Address Select On Transmit\r\n *  0b000..Node MAC address programmed on PADDR1/2 registers.\r\n *  0b100..Reserved.\r\n *  0b101..Reserved.\r\n *  0b110..Reserved.\r\n */\r\n#define ENET_TCR_ADDSEL(x)                       (((uint32_t)(((uint32_t)(x)) << ENET_TCR_ADDSEL_SHIFT)) & ENET_TCR_ADDSEL_MASK)\r\n\r\n#define ENET_TCR_ADDINS_MASK                     (0x100U)\r\n#define ENET_TCR_ADDINS_SHIFT                    (8U)\r\n/*! ADDINS - Set MAC Address On Transmit\r\n *  0b0..The source MAC address is not modified by the MAC.\r\n *  0b1..The MAC overwrites the source MAC address with the programmed MAC address according to ADDSEL.\r\n */\r\n#define ENET_TCR_ADDINS(x)                       (((uint32_t)(((uint32_t)(x)) << ENET_TCR_ADDINS_SHIFT)) & ENET_TCR_ADDINS_MASK)\r\n\r\n#define ENET_TCR_CRCFWD_MASK                     (0x200U)\r\n#define ENET_TCR_CRCFWD_SHIFT                    (9U)\r\n/*! CRCFWD - Forward Frame From Application With CRC\r\n *  0b0..TxBD[TC] controls whether the frame has a CRC from the application.\r\n *  0b1..The transmitter does not append any CRC to transmitted frames, as it is expecting a frame with CRC from the application.\r\n */\r\n#define ENET_TCR_CRCFWD(x)                       (((uint32_t)(((uint32_t)(x)) << ENET_TCR_CRCFWD_SHIFT)) & ENET_TCR_CRCFWD_MASK)\r\n/*! @} */\r\n\r\n/*! @name PALR - Physical Address Lower Register */\r\n/*! @{ */\r\n\r\n#define ENET_PALR_PADDR1_MASK                    (0xFFFFFFFFU)\r\n#define ENET_PALR_PADDR1_SHIFT                   (0U)\r\n/*! PADDR1 - Pause Address */\r\n#define ENET_PALR_PADDR1(x)                      (((uint32_t)(((uint32_t)(x)) << ENET_PALR_PADDR1_SHIFT)) & ENET_PALR_PADDR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAUR - Physical Address Upper Register */\r\n/*! @{ */\r\n\r\n#define ENET_PAUR_TYPE_MASK                      (0xFFFFU)\r\n#define ENET_PAUR_TYPE_SHIFT                     (0U)\r\n/*! TYPE - Type Field In PAUSE Frames */\r\n#define ENET_PAUR_TYPE(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_PAUR_TYPE_SHIFT)) & ENET_PAUR_TYPE_MASK)\r\n\r\n#define ENET_PAUR_PADDR2_MASK                    (0xFFFF0000U)\r\n#define ENET_PAUR_PADDR2_SHIFT                   (16U)\r\n#define ENET_PAUR_PADDR2(x)                      (((uint32_t)(((uint32_t)(x)) << ENET_PAUR_PADDR2_SHIFT)) & ENET_PAUR_PADDR2_MASK)\r\n/*! @} */\r\n\r\n/*! @name OPD - Opcode/Pause Duration Register */\r\n/*! @{ */\r\n\r\n#define ENET_OPD_PAUSE_DUR_MASK                  (0xFFFFU)\r\n#define ENET_OPD_PAUSE_DUR_SHIFT                 (0U)\r\n/*! PAUSE_DUR - Pause Duration */\r\n#define ENET_OPD_PAUSE_DUR(x)                    (((uint32_t)(((uint32_t)(x)) << ENET_OPD_PAUSE_DUR_SHIFT)) & ENET_OPD_PAUSE_DUR_MASK)\r\n\r\n#define ENET_OPD_OPCODE_MASK                     (0xFFFF0000U)\r\n#define ENET_OPD_OPCODE_SHIFT                    (16U)\r\n/*! OPCODE - Opcode Field In PAUSE Frames */\r\n#define ENET_OPD_OPCODE(x)                       (((uint32_t)(((uint32_t)(x)) << ENET_OPD_OPCODE_SHIFT)) & ENET_OPD_OPCODE_MASK)\r\n/*! @} */\r\n\r\n/*! @name TXIC - Transmit Interrupt Coalescing Register */\r\n/*! @{ */\r\n\r\n#define ENET_TXIC_ICTT_MASK                      (0xFFFFU)\r\n#define ENET_TXIC_ICTT_SHIFT                     (0U)\r\n/*! ICTT - Interrupt coalescing timer threshold */\r\n#define ENET_TXIC_ICTT(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_TXIC_ICTT_SHIFT)) & ENET_TXIC_ICTT_MASK)\r\n\r\n#define ENET_TXIC_ICFT_MASK                      (0xFF00000U)\r\n#define ENET_TXIC_ICFT_SHIFT                     (20U)\r\n/*! ICFT - Interrupt coalescing frame count threshold */\r\n#define ENET_TXIC_ICFT(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_TXIC_ICFT_SHIFT)) & ENET_TXIC_ICFT_MASK)\r\n\r\n#define ENET_TXIC_ICCS_MASK                      (0x40000000U)\r\n#define ENET_TXIC_ICCS_SHIFT                     (30U)\r\n/*! ICCS - Interrupt Coalescing Timer Clock Source Select\r\n *  0b0..Use MII/GMII TX clocks.\r\n *  0b1..Use ENET system clock.\r\n */\r\n#define ENET_TXIC_ICCS(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_TXIC_ICCS_SHIFT)) & ENET_TXIC_ICCS_MASK)\r\n\r\n#define ENET_TXIC_ICEN_MASK                      (0x80000000U)\r\n#define ENET_TXIC_ICEN_SHIFT                     (31U)\r\n/*! ICEN - Interrupt Coalescing Enable\r\n *  0b0..Disable Interrupt coalescing.\r\n *  0b1..Enable Interrupt coalescing.\r\n */\r\n#define ENET_TXIC_ICEN(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_TXIC_ICEN_SHIFT)) & ENET_TXIC_ICEN_MASK)\r\n/*! @} */\r\n\r\n/* The count of ENET_TXIC */\r\n#define ENET_TXIC_COUNT                          (1U)\r\n\r\n/*! @name RXIC - Receive Interrupt Coalescing Register */\r\n/*! @{ */\r\n\r\n#define ENET_RXIC_ICTT_MASK                      (0xFFFFU)\r\n#define ENET_RXIC_ICTT_SHIFT                     (0U)\r\n/*! ICTT - Interrupt coalescing timer threshold */\r\n#define ENET_RXIC_ICTT(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_RXIC_ICTT_SHIFT)) & ENET_RXIC_ICTT_MASK)\r\n\r\n#define ENET_RXIC_ICFT_MASK                      (0xFF00000U)\r\n#define ENET_RXIC_ICFT_SHIFT                     (20U)\r\n/*! ICFT - Interrupt coalescing frame count threshold */\r\n#define ENET_RXIC_ICFT(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_RXIC_ICFT_SHIFT)) & ENET_RXIC_ICFT_MASK)\r\n\r\n#define ENET_RXIC_ICCS_MASK                      (0x40000000U)\r\n#define ENET_RXIC_ICCS_SHIFT                     (30U)\r\n/*! ICCS - Interrupt Coalescing Timer Clock Source Select\r\n *  0b0..Use MII/GMII TX clocks.\r\n *  0b1..Use ENET system clock.\r\n */\r\n#define ENET_RXIC_ICCS(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_RXIC_ICCS_SHIFT)) & ENET_RXIC_ICCS_MASK)\r\n\r\n#define ENET_RXIC_ICEN_MASK                      (0x80000000U)\r\n#define ENET_RXIC_ICEN_SHIFT                     (31U)\r\n/*! ICEN - Interrupt Coalescing Enable\r\n *  0b0..Disable Interrupt coalescing.\r\n *  0b1..Enable Interrupt coalescing.\r\n */\r\n#define ENET_RXIC_ICEN(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_RXIC_ICEN_SHIFT)) & ENET_RXIC_ICEN_MASK)\r\n/*! @} */\r\n\r\n/* The count of ENET_RXIC */\r\n#define ENET_RXIC_COUNT                          (1U)\r\n\r\n/*! @name IAUR - Descriptor Individual Upper Address Register */\r\n/*! @{ */\r\n\r\n#define ENET_IAUR_IADDR1_MASK                    (0xFFFFFFFFU)\r\n#define ENET_IAUR_IADDR1_SHIFT                   (0U)\r\n#define ENET_IAUR_IADDR1(x)                      (((uint32_t)(((uint32_t)(x)) << ENET_IAUR_IADDR1_SHIFT)) & ENET_IAUR_IADDR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IALR - Descriptor Individual Lower Address Register */\r\n/*! @{ */\r\n\r\n#define ENET_IALR_IADDR2_MASK                    (0xFFFFFFFFU)\r\n#define ENET_IALR_IADDR2_SHIFT                   (0U)\r\n#define ENET_IALR_IADDR2(x)                      (((uint32_t)(((uint32_t)(x)) << ENET_IALR_IADDR2_SHIFT)) & ENET_IALR_IADDR2_MASK)\r\n/*! @} */\r\n\r\n/*! @name GAUR - Descriptor Group Upper Address Register */\r\n/*! @{ */\r\n\r\n#define ENET_GAUR_GADDR1_MASK                    (0xFFFFFFFFU)\r\n#define ENET_GAUR_GADDR1_SHIFT                   (0U)\r\n#define ENET_GAUR_GADDR1(x)                      (((uint32_t)(((uint32_t)(x)) << ENET_GAUR_GADDR1_SHIFT)) & ENET_GAUR_GADDR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name GALR - Descriptor Group Lower Address Register */\r\n/*! @{ */\r\n\r\n#define ENET_GALR_GADDR2_MASK                    (0xFFFFFFFFU)\r\n#define ENET_GALR_GADDR2_SHIFT                   (0U)\r\n#define ENET_GALR_GADDR2(x)                      (((uint32_t)(((uint32_t)(x)) << ENET_GALR_GADDR2_SHIFT)) & ENET_GALR_GADDR2_MASK)\r\n/*! @} */\r\n\r\n/*! @name TFWR - Transmit FIFO Watermark Register */\r\n/*! @{ */\r\n\r\n#define ENET_TFWR_TFWR_MASK                      (0x3FU)\r\n#define ENET_TFWR_TFWR_SHIFT                     (0U)\r\n/*! TFWR - Transmit FIFO Write\r\n *  0b000000..64 bytes written.\r\n *  0b000001..64 bytes written.\r\n *  0b000010..128 bytes written.\r\n *  0b000011..192 bytes written.\r\n *  0b011111..1984 bytes written.\r\n */\r\n#define ENET_TFWR_TFWR(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_TFWR_TFWR_SHIFT)) & ENET_TFWR_TFWR_MASK)\r\n\r\n#define ENET_TFWR_STRFWD_MASK                    (0x100U)\r\n#define ENET_TFWR_STRFWD_SHIFT                   (8U)\r\n/*! STRFWD - Store And Forward Enable\r\n *  0b0..Reset. The transmission start threshold is programmed in TFWR[TFWR].\r\n *  0b1..Enabled.\r\n */\r\n#define ENET_TFWR_STRFWD(x)                      (((uint32_t)(((uint32_t)(x)) << ENET_TFWR_STRFWD_SHIFT)) & ENET_TFWR_STRFWD_MASK)\r\n/*! @} */\r\n\r\n/*! @name RDSR - Receive Descriptor Ring 0 Start Register */\r\n/*! @{ */\r\n\r\n#define ENET_RDSR_R_DES_START_MASK               (0xFFFFFFF8U)\r\n#define ENET_RDSR_R_DES_START_SHIFT              (3U)\r\n#define ENET_RDSR_R_DES_START(x)                 (((uint32_t)(((uint32_t)(x)) << ENET_RDSR_R_DES_START_SHIFT)) & ENET_RDSR_R_DES_START_MASK)\r\n/*! @} */\r\n\r\n/*! @name TDSR - Transmit Buffer Descriptor Ring 0 Start Register */\r\n/*! @{ */\r\n\r\n#define ENET_TDSR_X_DES_START_MASK               (0xFFFFFFF8U)\r\n#define ENET_TDSR_X_DES_START_SHIFT              (3U)\r\n#define ENET_TDSR_X_DES_START(x)                 (((uint32_t)(((uint32_t)(x)) << ENET_TDSR_X_DES_START_SHIFT)) & ENET_TDSR_X_DES_START_MASK)\r\n/*! @} */\r\n\r\n/*! @name MRBR - Maximum Receive Buffer Size Register - Ring 0 */\r\n/*! @{ */\r\n\r\n#define ENET_MRBR_R_BUF_SIZE_MASK                (0x3FF0U)\r\n#define ENET_MRBR_R_BUF_SIZE_SHIFT               (4U)\r\n#define ENET_MRBR_R_BUF_SIZE(x)                  (((uint32_t)(((uint32_t)(x)) << ENET_MRBR_R_BUF_SIZE_SHIFT)) & ENET_MRBR_R_BUF_SIZE_MASK)\r\n/*! @} */\r\n\r\n/*! @name RSFL - Receive FIFO Section Full Threshold */\r\n/*! @{ */\r\n\r\n#define ENET_RSFL_RX_SECTION_FULL_MASK           (0xFFU)\r\n#define ENET_RSFL_RX_SECTION_FULL_SHIFT          (0U)\r\n/*! RX_SECTION_FULL - Value Of Receive FIFO Section Full Threshold */\r\n#define ENET_RSFL_RX_SECTION_FULL(x)             (((uint32_t)(((uint32_t)(x)) << ENET_RSFL_RX_SECTION_FULL_SHIFT)) & ENET_RSFL_RX_SECTION_FULL_MASK)\r\n/*! @} */\r\n\r\n/*! @name RSEM - Receive FIFO Section Empty Threshold */\r\n/*! @{ */\r\n\r\n#define ENET_RSEM_RX_SECTION_EMPTY_MASK          (0xFFU)\r\n#define ENET_RSEM_RX_SECTION_EMPTY_SHIFT         (0U)\r\n/*! RX_SECTION_EMPTY - Value Of The Receive FIFO Section Empty Threshold */\r\n#define ENET_RSEM_RX_SECTION_EMPTY(x)            (((uint32_t)(((uint32_t)(x)) << ENET_RSEM_RX_SECTION_EMPTY_SHIFT)) & ENET_RSEM_RX_SECTION_EMPTY_MASK)\r\n\r\n#define ENET_RSEM_STAT_SECTION_EMPTY_MASK        (0x1F0000U)\r\n#define ENET_RSEM_STAT_SECTION_EMPTY_SHIFT       (16U)\r\n/*! STAT_SECTION_EMPTY - RX Status FIFO Section Empty Threshold */\r\n#define ENET_RSEM_STAT_SECTION_EMPTY(x)          (((uint32_t)(((uint32_t)(x)) << ENET_RSEM_STAT_SECTION_EMPTY_SHIFT)) & ENET_RSEM_STAT_SECTION_EMPTY_MASK)\r\n/*! @} */\r\n\r\n/*! @name RAEM - Receive FIFO Almost Empty Threshold */\r\n/*! @{ */\r\n\r\n#define ENET_RAEM_RX_ALMOST_EMPTY_MASK           (0xFFU)\r\n#define ENET_RAEM_RX_ALMOST_EMPTY_SHIFT          (0U)\r\n/*! RX_ALMOST_EMPTY - Value Of The Receive FIFO Almost Empty Threshold */\r\n#define ENET_RAEM_RX_ALMOST_EMPTY(x)             (((uint32_t)(((uint32_t)(x)) << ENET_RAEM_RX_ALMOST_EMPTY_SHIFT)) & ENET_RAEM_RX_ALMOST_EMPTY_MASK)\r\n/*! @} */\r\n\r\n/*! @name RAFL - Receive FIFO Almost Full Threshold */\r\n/*! @{ */\r\n\r\n#define ENET_RAFL_RX_ALMOST_FULL_MASK            (0xFFU)\r\n#define ENET_RAFL_RX_ALMOST_FULL_SHIFT           (0U)\r\n/*! RX_ALMOST_FULL - Value Of The Receive FIFO Almost Full Threshold */\r\n#define ENET_RAFL_RX_ALMOST_FULL(x)              (((uint32_t)(((uint32_t)(x)) << ENET_RAFL_RX_ALMOST_FULL_SHIFT)) & ENET_RAFL_RX_ALMOST_FULL_MASK)\r\n/*! @} */\r\n\r\n/*! @name TSEM - Transmit FIFO Section Empty Threshold */\r\n/*! @{ */\r\n\r\n#define ENET_TSEM_TX_SECTION_EMPTY_MASK          (0xFFU)\r\n#define ENET_TSEM_TX_SECTION_EMPTY_SHIFT         (0U)\r\n/*! TX_SECTION_EMPTY - Value Of The Transmit FIFO Section Empty Threshold */\r\n#define ENET_TSEM_TX_SECTION_EMPTY(x)            (((uint32_t)(((uint32_t)(x)) << ENET_TSEM_TX_SECTION_EMPTY_SHIFT)) & ENET_TSEM_TX_SECTION_EMPTY_MASK)\r\n/*! @} */\r\n\r\n/*! @name TAEM - Transmit FIFO Almost Empty Threshold */\r\n/*! @{ */\r\n\r\n#define ENET_TAEM_TX_ALMOST_EMPTY_MASK           (0xFFU)\r\n#define ENET_TAEM_TX_ALMOST_EMPTY_SHIFT          (0U)\r\n/*! TX_ALMOST_EMPTY - Value of Transmit FIFO Almost Empty Threshold */\r\n#define ENET_TAEM_TX_ALMOST_EMPTY(x)             (((uint32_t)(((uint32_t)(x)) << ENET_TAEM_TX_ALMOST_EMPTY_SHIFT)) & ENET_TAEM_TX_ALMOST_EMPTY_MASK)\r\n/*! @} */\r\n\r\n/*! @name TAFL - Transmit FIFO Almost Full Threshold */\r\n/*! @{ */\r\n\r\n#define ENET_TAFL_TX_ALMOST_FULL_MASK            (0xFFU)\r\n#define ENET_TAFL_TX_ALMOST_FULL_SHIFT           (0U)\r\n/*! TX_ALMOST_FULL - Value Of The Transmit FIFO Almost Full Threshold */\r\n#define ENET_TAFL_TX_ALMOST_FULL(x)              (((uint32_t)(((uint32_t)(x)) << ENET_TAFL_TX_ALMOST_FULL_SHIFT)) & ENET_TAFL_TX_ALMOST_FULL_MASK)\r\n/*! @} */\r\n\r\n/*! @name TIPG - Transmit Inter-Packet Gap */\r\n/*! @{ */\r\n\r\n#define ENET_TIPG_IPG_MASK                       (0x1FU)\r\n#define ENET_TIPG_IPG_SHIFT                      (0U)\r\n/*! IPG - Transmit Inter-Packet Gap */\r\n#define ENET_TIPG_IPG(x)                         (((uint32_t)(((uint32_t)(x)) << ENET_TIPG_IPG_SHIFT)) & ENET_TIPG_IPG_MASK)\r\n/*! @} */\r\n\r\n/*! @name FTRL - Frame Truncation Length */\r\n/*! @{ */\r\n\r\n#define ENET_FTRL_TRUNC_FL_MASK                  (0x3FFFU)\r\n#define ENET_FTRL_TRUNC_FL_SHIFT                 (0U)\r\n/*! TRUNC_FL - Frame Truncation Length */\r\n#define ENET_FTRL_TRUNC_FL(x)                    (((uint32_t)(((uint32_t)(x)) << ENET_FTRL_TRUNC_FL_SHIFT)) & ENET_FTRL_TRUNC_FL_MASK)\r\n/*! @} */\r\n\r\n/*! @name TACC - Transmit Accelerator Function Configuration */\r\n/*! @{ */\r\n\r\n#define ENET_TACC_SHIFT16_MASK                   (0x1U)\r\n#define ENET_TACC_SHIFT16_SHIFT                  (0U)\r\n/*! SHIFT16 - TX FIFO Shift-16\r\n *  0b0..Disabled.\r\n *  0b1..Indicates to the transmit data FIFO that the written frames contain two additional octets before the\r\n *       frame data. This means the actual frame begins at bit 16 of the first word written into the FIFO. This\r\n *       function allows putting the frame payload on a 32-bit boundary in memory, as the 14-byte Ethernet header is\r\n *       extended to a 16-byte header.\r\n */\r\n#define ENET_TACC_SHIFT16(x)                     (((uint32_t)(((uint32_t)(x)) << ENET_TACC_SHIFT16_SHIFT)) & ENET_TACC_SHIFT16_MASK)\r\n\r\n#define ENET_TACC_IPCHK_MASK                     (0x8U)\r\n#define ENET_TACC_IPCHK_SHIFT                    (3U)\r\n/*! IPCHK\r\n *  0b0..Checksum is not inserted.\r\n *  0b1..If an IP frame is transmitted, the checksum is inserted automatically. The IP header checksum field must\r\n *       be cleared. If a non-IP frame is transmitted the frame is not modified.\r\n */\r\n#define ENET_TACC_IPCHK(x)                       (((uint32_t)(((uint32_t)(x)) << ENET_TACC_IPCHK_SHIFT)) & ENET_TACC_IPCHK_MASK)\r\n\r\n#define ENET_TACC_PROCHK_MASK                    (0x10U)\r\n#define ENET_TACC_PROCHK_SHIFT                   (4U)\r\n/*! PROCHK\r\n *  0b0..Checksum not inserted.\r\n *  0b1..If an IP frame with a known protocol is transmitted, the checksum is inserted automatically into the\r\n *       frame. The checksum field must be cleared. The other frames are not modified.\r\n */\r\n#define ENET_TACC_PROCHK(x)                      (((uint32_t)(((uint32_t)(x)) << ENET_TACC_PROCHK_SHIFT)) & ENET_TACC_PROCHK_MASK)\r\n/*! @} */\r\n\r\n/*! @name RACC - Receive Accelerator Function Configuration */\r\n/*! @{ */\r\n\r\n#define ENET_RACC_PADREM_MASK                    (0x1U)\r\n#define ENET_RACC_PADREM_SHIFT                   (0U)\r\n/*! PADREM - Enable Padding Removal For Short IP Frames\r\n *  0b0..Padding not removed.\r\n *  0b1..Any bytes following the IP payload section of the frame are removed from the frame.\r\n */\r\n#define ENET_RACC_PADREM(x)                      (((uint32_t)(((uint32_t)(x)) << ENET_RACC_PADREM_SHIFT)) & ENET_RACC_PADREM_MASK)\r\n\r\n#define ENET_RACC_IPDIS_MASK                     (0x2U)\r\n#define ENET_RACC_IPDIS_SHIFT                    (1U)\r\n/*! IPDIS - Enable Discard Of Frames With Wrong IPv4 Header Checksum\r\n *  0b0..Frames with wrong IPv4 header checksum are not discarded.\r\n *  0b1..If an IPv4 frame is received with a mismatching header checksum, the frame is discarded. IPv6 has no\r\n *       header checksum and is not affected by this setting. Discarding is only available when the RX FIFO operates in\r\n *       store and forward mode (RSFL cleared).\r\n */\r\n#define ENET_RACC_IPDIS(x)                       (((uint32_t)(((uint32_t)(x)) << ENET_RACC_IPDIS_SHIFT)) & ENET_RACC_IPDIS_MASK)\r\n\r\n#define ENET_RACC_PRODIS_MASK                    (0x4U)\r\n#define ENET_RACC_PRODIS_SHIFT                   (2U)\r\n/*! PRODIS - Enable Discard Of Frames With Wrong Protocol Checksum\r\n *  0b0..Frames with wrong checksum are not discarded.\r\n *  0b1..If a TCP/IP, UDP/IP, or ICMP/IP frame is received that has a wrong TCP, UDP, or ICMP checksum, the frame\r\n *       is discarded. Discarding is only available when the RX FIFO operates in store and forward mode (RSFL\r\n *       cleared).\r\n */\r\n#define ENET_RACC_PRODIS(x)                      (((uint32_t)(((uint32_t)(x)) << ENET_RACC_PRODIS_SHIFT)) & ENET_RACC_PRODIS_MASK)\r\n\r\n#define ENET_RACC_LINEDIS_MASK                   (0x40U)\r\n#define ENET_RACC_LINEDIS_SHIFT                  (6U)\r\n/*! LINEDIS - Enable Discard Of Frames With MAC Layer Errors\r\n *  0b0..Frames with errors are not discarded.\r\n *  0b1..Any frame received with a CRC, length, or PHY error is automatically discarded and not forwarded to the user application interface.\r\n */\r\n#define ENET_RACC_LINEDIS(x)                     (((uint32_t)(((uint32_t)(x)) << ENET_RACC_LINEDIS_SHIFT)) & ENET_RACC_LINEDIS_MASK)\r\n\r\n#define ENET_RACC_SHIFT16_MASK                   (0x80U)\r\n#define ENET_RACC_SHIFT16_SHIFT                  (7U)\r\n/*! SHIFT16 - RX FIFO Shift-16\r\n *  0b0..Disabled.\r\n *  0b1..Instructs the MAC to write two additional bytes in front of each frame received into the RX FIFO.\r\n */\r\n#define ENET_RACC_SHIFT16(x)                     (((uint32_t)(((uint32_t)(x)) << ENET_RACC_SHIFT16_SHIFT)) & ENET_RACC_SHIFT16_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_T_PACKETS - Tx Packet Count Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_T_PACKETS_TXPKTS_MASK          (0xFFFFU)\r\n#define ENET_RMON_T_PACKETS_TXPKTS_SHIFT         (0U)\r\n/*! TXPKTS - Packet count */\r\n#define ENET_RMON_T_PACKETS_TXPKTS(x)            (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_PACKETS_TXPKTS_SHIFT)) & ENET_RMON_T_PACKETS_TXPKTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_T_BC_PKT - Tx Broadcast Packets Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_T_BC_PKT_TXPKTS_MASK           (0xFFFFU)\r\n#define ENET_RMON_T_BC_PKT_TXPKTS_SHIFT          (0U)\r\n/*! TXPKTS - Broadcast packets */\r\n#define ENET_RMON_T_BC_PKT_TXPKTS(x)             (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_BC_PKT_TXPKTS_SHIFT)) & ENET_RMON_T_BC_PKT_TXPKTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_T_MC_PKT - Tx Multicast Packets Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_T_MC_PKT_TXPKTS_MASK           (0xFFFFU)\r\n#define ENET_RMON_T_MC_PKT_TXPKTS_SHIFT          (0U)\r\n/*! TXPKTS - Multicast packets */\r\n#define ENET_RMON_T_MC_PKT_TXPKTS(x)             (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_MC_PKT_TXPKTS_SHIFT)) & ENET_RMON_T_MC_PKT_TXPKTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_T_CRC_ALIGN - Tx Packets with CRC/Align Error Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_T_CRC_ALIGN_TXPKTS_MASK        (0xFFFFU)\r\n#define ENET_RMON_T_CRC_ALIGN_TXPKTS_SHIFT       (0U)\r\n/*! TXPKTS - Packets with CRC/align error */\r\n#define ENET_RMON_T_CRC_ALIGN_TXPKTS(x)          (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_CRC_ALIGN_TXPKTS_SHIFT)) & ENET_RMON_T_CRC_ALIGN_TXPKTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_T_UNDERSIZE - Tx Packets Less Than Bytes and Good CRC Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_T_UNDERSIZE_TXPKTS_MASK        (0xFFFFU)\r\n#define ENET_RMON_T_UNDERSIZE_TXPKTS_SHIFT       (0U)\r\n/*! TXPKTS - Number of transmit packets less than 64 bytes with good CRC */\r\n#define ENET_RMON_T_UNDERSIZE_TXPKTS(x)          (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_UNDERSIZE_TXPKTS_SHIFT)) & ENET_RMON_T_UNDERSIZE_TXPKTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_T_OVERSIZE - Tx Packets GT MAX_FL bytes and Good CRC Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_T_OVERSIZE_TXPKTS_MASK         (0xFFFFU)\r\n#define ENET_RMON_T_OVERSIZE_TXPKTS_SHIFT        (0U)\r\n/*! TXPKTS - Number of transmit packets greater than MAX_FL bytes with good CRC */\r\n#define ENET_RMON_T_OVERSIZE_TXPKTS(x)           (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_OVERSIZE_TXPKTS_SHIFT)) & ENET_RMON_T_OVERSIZE_TXPKTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_T_FRAG - Tx Packets Less Than 64 Bytes and Bad CRC Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_T_FRAG_TXPKTS_MASK             (0xFFFFU)\r\n#define ENET_RMON_T_FRAG_TXPKTS_SHIFT            (0U)\r\n/*! TXPKTS - Number of packets less than 64 bytes with bad CRC */\r\n#define ENET_RMON_T_FRAG_TXPKTS(x)               (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_FRAG_TXPKTS_SHIFT)) & ENET_RMON_T_FRAG_TXPKTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_T_JAB - Tx Packets Greater Than MAX_FL bytes and Bad CRC Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_T_JAB_TXPKTS_MASK              (0xFFFFU)\r\n#define ENET_RMON_T_JAB_TXPKTS_SHIFT             (0U)\r\n/*! TXPKTS - Number of transmit packets greater than MAX_FL bytes and bad CRC */\r\n#define ENET_RMON_T_JAB_TXPKTS(x)                (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_JAB_TXPKTS_SHIFT)) & ENET_RMON_T_JAB_TXPKTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_T_COL - Tx Collision Count Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_T_COL_TXPKTS_MASK              (0xFFFFU)\r\n#define ENET_RMON_T_COL_TXPKTS_SHIFT             (0U)\r\n/*! TXPKTS - Number of transmit collisions */\r\n#define ENET_RMON_T_COL_TXPKTS(x)                (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_COL_TXPKTS_SHIFT)) & ENET_RMON_T_COL_TXPKTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_T_P64 - Tx 64-Byte Packets Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_T_P64_TXPKTS_MASK              (0xFFFFU)\r\n#define ENET_RMON_T_P64_TXPKTS_SHIFT             (0U)\r\n/*! TXPKTS - Number of 64-byte transmit packets */\r\n#define ENET_RMON_T_P64_TXPKTS(x)                (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_P64_TXPKTS_SHIFT)) & ENET_RMON_T_P64_TXPKTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_T_P65TO127 - Tx 65- to 127-byte Packets Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_T_P65TO127_TXPKTS_MASK         (0xFFFFU)\r\n#define ENET_RMON_T_P65TO127_TXPKTS_SHIFT        (0U)\r\n/*! TXPKTS - Number of 65- to 127-byte transmit packets */\r\n#define ENET_RMON_T_P65TO127_TXPKTS(x)           (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_P65TO127_TXPKTS_SHIFT)) & ENET_RMON_T_P65TO127_TXPKTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_T_P128TO255 - Tx 128- to 255-byte Packets Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_T_P128TO255_TXPKTS_MASK        (0xFFFFU)\r\n#define ENET_RMON_T_P128TO255_TXPKTS_SHIFT       (0U)\r\n/*! TXPKTS - Number of 128- to 255-byte transmit packets */\r\n#define ENET_RMON_T_P128TO255_TXPKTS(x)          (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_P128TO255_TXPKTS_SHIFT)) & ENET_RMON_T_P128TO255_TXPKTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_T_P256TO511 - Tx 256- to 511-byte Packets Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_T_P256TO511_TXPKTS_MASK        (0xFFFFU)\r\n#define ENET_RMON_T_P256TO511_TXPKTS_SHIFT       (0U)\r\n/*! TXPKTS - Number of 256- to 511-byte transmit packets */\r\n#define ENET_RMON_T_P256TO511_TXPKTS(x)          (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_P256TO511_TXPKTS_SHIFT)) & ENET_RMON_T_P256TO511_TXPKTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_T_P512TO1023 - Tx 512- to 1023-byte Packets Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_T_P512TO1023_TXPKTS_MASK       (0xFFFFU)\r\n#define ENET_RMON_T_P512TO1023_TXPKTS_SHIFT      (0U)\r\n/*! TXPKTS - Number of 512- to 1023-byte transmit packets */\r\n#define ENET_RMON_T_P512TO1023_TXPKTS(x)         (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_P512TO1023_TXPKTS_SHIFT)) & ENET_RMON_T_P512TO1023_TXPKTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_T_P1024TO2047 - Tx 1024- to 2047-byte Packets Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_T_P1024TO2047_TXPKTS_MASK      (0xFFFFU)\r\n#define ENET_RMON_T_P1024TO2047_TXPKTS_SHIFT     (0U)\r\n/*! TXPKTS - Number of 1024- to 2047-byte transmit packets */\r\n#define ENET_RMON_T_P1024TO2047_TXPKTS(x)        (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_P1024TO2047_TXPKTS_SHIFT)) & ENET_RMON_T_P1024TO2047_TXPKTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_T_P_GTE2048 - Tx Packets Greater Than 2048 Bytes Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_T_P_GTE2048_TXPKTS_MASK        (0xFFFFU)\r\n#define ENET_RMON_T_P_GTE2048_TXPKTS_SHIFT       (0U)\r\n/*! TXPKTS - Number of transmit packets greater than 2048 bytes */\r\n#define ENET_RMON_T_P_GTE2048_TXPKTS(x)          (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_P_GTE2048_TXPKTS_SHIFT)) & ENET_RMON_T_P_GTE2048_TXPKTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_T_OCTETS - Tx Octets Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_T_OCTETS_TXOCTS_MASK           (0xFFFFFFFFU)\r\n#define ENET_RMON_T_OCTETS_TXOCTS_SHIFT          (0U)\r\n/*! TXOCTS - Number of transmit octets */\r\n#define ENET_RMON_T_OCTETS_TXOCTS(x)             (((uint32_t)(((uint32_t)(x)) << ENET_RMON_T_OCTETS_TXOCTS_SHIFT)) & ENET_RMON_T_OCTETS_TXOCTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IEEE_T_FRAME_OK - Frames Transmitted OK Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_IEEE_T_FRAME_OK_COUNT_MASK          (0xFFFFU)\r\n#define ENET_IEEE_T_FRAME_OK_COUNT_SHIFT         (0U)\r\n/*! COUNT - Number of frames transmitted OK */\r\n#define ENET_IEEE_T_FRAME_OK_COUNT(x)            (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_FRAME_OK_COUNT_SHIFT)) & ENET_IEEE_T_FRAME_OK_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name IEEE_T_1COL - Frames Transmitted with Single Collision Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_IEEE_T_1COL_COUNT_MASK              (0xFFFFU)\r\n#define ENET_IEEE_T_1COL_COUNT_SHIFT             (0U)\r\n/*! COUNT - Number of frames transmitted with one collision */\r\n#define ENET_IEEE_T_1COL_COUNT(x)                (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_1COL_COUNT_SHIFT)) & ENET_IEEE_T_1COL_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name IEEE_T_MCOL - Frames Transmitted with Multiple Collisions Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_IEEE_T_MCOL_COUNT_MASK              (0xFFFFU)\r\n#define ENET_IEEE_T_MCOL_COUNT_SHIFT             (0U)\r\n/*! COUNT - Number of frames transmitted with multiple collisions */\r\n#define ENET_IEEE_T_MCOL_COUNT(x)                (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_MCOL_COUNT_SHIFT)) & ENET_IEEE_T_MCOL_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name IEEE_T_DEF - Frames Transmitted after Deferral Delay Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_IEEE_T_DEF_COUNT_MASK               (0xFFFFU)\r\n#define ENET_IEEE_T_DEF_COUNT_SHIFT              (0U)\r\n/*! COUNT - Number of frames transmitted with deferral delay */\r\n#define ENET_IEEE_T_DEF_COUNT(x)                 (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_DEF_COUNT_SHIFT)) & ENET_IEEE_T_DEF_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name IEEE_T_LCOL - Frames Transmitted with Late Collision Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_IEEE_T_LCOL_COUNT_MASK              (0xFFFFU)\r\n#define ENET_IEEE_T_LCOL_COUNT_SHIFT             (0U)\r\n/*! COUNT - Number of frames transmitted with late collision */\r\n#define ENET_IEEE_T_LCOL_COUNT(x)                (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_LCOL_COUNT_SHIFT)) & ENET_IEEE_T_LCOL_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name IEEE_T_EXCOL - Frames Transmitted with Excessive Collisions Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_IEEE_T_EXCOL_COUNT_MASK             (0xFFFFU)\r\n#define ENET_IEEE_T_EXCOL_COUNT_SHIFT            (0U)\r\n/*! COUNT - Number of frames transmitted with excessive collisions */\r\n#define ENET_IEEE_T_EXCOL_COUNT(x)               (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_EXCOL_COUNT_SHIFT)) & ENET_IEEE_T_EXCOL_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name IEEE_T_MACERR - Frames Transmitted with Tx FIFO Underrun Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_IEEE_T_MACERR_COUNT_MASK            (0xFFFFU)\r\n#define ENET_IEEE_T_MACERR_COUNT_SHIFT           (0U)\r\n/*! COUNT - Number of frames transmitted with transmit FIFO underrun */\r\n#define ENET_IEEE_T_MACERR_COUNT(x)              (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_MACERR_COUNT_SHIFT)) & ENET_IEEE_T_MACERR_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name IEEE_T_CSERR - Frames Transmitted with Carrier Sense Error Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_IEEE_T_CSERR_COUNT_MASK             (0xFFFFU)\r\n#define ENET_IEEE_T_CSERR_COUNT_SHIFT            (0U)\r\n/*! COUNT - Number of frames transmitted with carrier sense error */\r\n#define ENET_IEEE_T_CSERR_COUNT(x)               (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_CSERR_COUNT_SHIFT)) & ENET_IEEE_T_CSERR_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name IEEE_T_SQE - Reserved Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_IEEE_T_SQE_COUNT_MASK               (0xFFFFU)\r\n#define ENET_IEEE_T_SQE_COUNT_SHIFT              (0U)\r\n/*! COUNT - This read-only field is reserved and always has the value 0 */\r\n#define ENET_IEEE_T_SQE_COUNT(x)                 (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_SQE_COUNT_SHIFT)) & ENET_IEEE_T_SQE_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name IEEE_T_FDXFC - Flow Control Pause Frames Transmitted Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_IEEE_T_FDXFC_COUNT_MASK             (0xFFFFU)\r\n#define ENET_IEEE_T_FDXFC_COUNT_SHIFT            (0U)\r\n/*! COUNT - Number of flow-control pause frames transmitted */\r\n#define ENET_IEEE_T_FDXFC_COUNT(x)               (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_FDXFC_COUNT_SHIFT)) & ENET_IEEE_T_FDXFC_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name IEEE_T_OCTETS_OK - Octet Count for Frames Transmitted w/o Error Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_IEEE_T_OCTETS_OK_COUNT_MASK         (0xFFFFFFFFU)\r\n#define ENET_IEEE_T_OCTETS_OK_COUNT_SHIFT        (0U)\r\n/*! COUNT - Octet count for frames transmitted without error Counts total octets (includes header and FCS fields). */\r\n#define ENET_IEEE_T_OCTETS_OK_COUNT(x)           (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_T_OCTETS_OK_COUNT_SHIFT)) & ENET_IEEE_T_OCTETS_OK_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_R_PACKETS - Rx Packet Count Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_R_PACKETS_COUNT_MASK           (0xFFFFU)\r\n#define ENET_RMON_R_PACKETS_COUNT_SHIFT          (0U)\r\n/*! COUNT - Number of packets received */\r\n#define ENET_RMON_R_PACKETS_COUNT(x)             (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_PACKETS_COUNT_SHIFT)) & ENET_RMON_R_PACKETS_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_R_BC_PKT - Rx Broadcast Packets Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_R_BC_PKT_COUNT_MASK            (0xFFFFU)\r\n#define ENET_RMON_R_BC_PKT_COUNT_SHIFT           (0U)\r\n/*! COUNT - Number of receive broadcast packets */\r\n#define ENET_RMON_R_BC_PKT_COUNT(x)              (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_BC_PKT_COUNT_SHIFT)) & ENET_RMON_R_BC_PKT_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_R_MC_PKT - Rx Multicast Packets Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_R_MC_PKT_COUNT_MASK            (0xFFFFU)\r\n#define ENET_RMON_R_MC_PKT_COUNT_SHIFT           (0U)\r\n/*! COUNT - Number of receive multicast packets */\r\n#define ENET_RMON_R_MC_PKT_COUNT(x)              (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_MC_PKT_COUNT_SHIFT)) & ENET_RMON_R_MC_PKT_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_R_CRC_ALIGN - Rx Packets with CRC/Align Error Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_R_CRC_ALIGN_COUNT_MASK         (0xFFFFU)\r\n#define ENET_RMON_R_CRC_ALIGN_COUNT_SHIFT        (0U)\r\n/*! COUNT - Number of receive packets with CRC or align error */\r\n#define ENET_RMON_R_CRC_ALIGN_COUNT(x)           (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_CRC_ALIGN_COUNT_SHIFT)) & ENET_RMON_R_CRC_ALIGN_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_R_UNDERSIZE - Rx Packets with Less Than 64 Bytes and Good CRC Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_R_UNDERSIZE_COUNT_MASK         (0xFFFFU)\r\n#define ENET_RMON_R_UNDERSIZE_COUNT_SHIFT        (0U)\r\n/*! COUNT - Number of receive packets with less than 64 bytes and good CRC */\r\n#define ENET_RMON_R_UNDERSIZE_COUNT(x)           (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_UNDERSIZE_COUNT_SHIFT)) & ENET_RMON_R_UNDERSIZE_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_R_OVERSIZE - Rx Packets Greater Than MAX_FL and Good CRC Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_R_OVERSIZE_COUNT_MASK          (0xFFFFU)\r\n#define ENET_RMON_R_OVERSIZE_COUNT_SHIFT         (0U)\r\n/*! COUNT - Number of receive packets greater than MAX_FL and good CRC */\r\n#define ENET_RMON_R_OVERSIZE_COUNT(x)            (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_OVERSIZE_COUNT_SHIFT)) & ENET_RMON_R_OVERSIZE_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_R_FRAG - Rx Packets Less Than 64 Bytes and Bad CRC Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_R_FRAG_COUNT_MASK              (0xFFFFU)\r\n#define ENET_RMON_R_FRAG_COUNT_SHIFT             (0U)\r\n/*! COUNT - Number of receive packets with less than 64 bytes and bad CRC */\r\n#define ENET_RMON_R_FRAG_COUNT(x)                (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_FRAG_COUNT_SHIFT)) & ENET_RMON_R_FRAG_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_R_JAB - Rx Packets Greater Than MAX_FL Bytes and Bad CRC Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_R_JAB_COUNT_MASK               (0xFFFFU)\r\n#define ENET_RMON_R_JAB_COUNT_SHIFT              (0U)\r\n/*! COUNT - Number of receive packets greater than MAX_FL and bad CRC */\r\n#define ENET_RMON_R_JAB_COUNT(x)                 (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_JAB_COUNT_SHIFT)) & ENET_RMON_R_JAB_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_R_P64 - Rx 64-Byte Packets Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_R_P64_COUNT_MASK               (0xFFFFU)\r\n#define ENET_RMON_R_P64_COUNT_SHIFT              (0U)\r\n/*! COUNT - Number of 64-byte receive packets */\r\n#define ENET_RMON_R_P64_COUNT(x)                 (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_P64_COUNT_SHIFT)) & ENET_RMON_R_P64_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_R_P65TO127 - Rx 65- to 127-Byte Packets Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_R_P65TO127_COUNT_MASK          (0xFFFFU)\r\n#define ENET_RMON_R_P65TO127_COUNT_SHIFT         (0U)\r\n/*! COUNT - Number of 65- to 127-byte recieve packets */\r\n#define ENET_RMON_R_P65TO127_COUNT(x)            (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_P65TO127_COUNT_SHIFT)) & ENET_RMON_R_P65TO127_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_R_P128TO255 - Rx 128- to 255-Byte Packets Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_R_P128TO255_COUNT_MASK         (0xFFFFU)\r\n#define ENET_RMON_R_P128TO255_COUNT_SHIFT        (0U)\r\n/*! COUNT - Number of 128- to 255-byte recieve packets */\r\n#define ENET_RMON_R_P128TO255_COUNT(x)           (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_P128TO255_COUNT_SHIFT)) & ENET_RMON_R_P128TO255_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_R_P256TO511 - Rx 256- to 511-Byte Packets Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_R_P256TO511_COUNT_MASK         (0xFFFFU)\r\n#define ENET_RMON_R_P256TO511_COUNT_SHIFT        (0U)\r\n/*! COUNT - Number of 256- to 511-byte recieve packets */\r\n#define ENET_RMON_R_P256TO511_COUNT(x)           (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_P256TO511_COUNT_SHIFT)) & ENET_RMON_R_P256TO511_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_R_P512TO1023 - Rx 512- to 1023-Byte Packets Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_R_P512TO1023_COUNT_MASK        (0xFFFFU)\r\n#define ENET_RMON_R_P512TO1023_COUNT_SHIFT       (0U)\r\n/*! COUNT - Number of 512- to 1023-byte recieve packets */\r\n#define ENET_RMON_R_P512TO1023_COUNT(x)          (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_P512TO1023_COUNT_SHIFT)) & ENET_RMON_R_P512TO1023_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_R_P1024TO2047 - Rx 1024- to 2047-Byte Packets Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_R_P1024TO2047_COUNT_MASK       (0xFFFFU)\r\n#define ENET_RMON_R_P1024TO2047_COUNT_SHIFT      (0U)\r\n/*! COUNT - Number of 1024- to 2047-byte recieve packets */\r\n#define ENET_RMON_R_P1024TO2047_COUNT(x)         (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_P1024TO2047_COUNT_SHIFT)) & ENET_RMON_R_P1024TO2047_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_R_P_GTE2048 - Rx Packets Greater than 2048 Bytes Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_R_P_GTE2048_COUNT_MASK         (0xFFFFU)\r\n#define ENET_RMON_R_P_GTE2048_COUNT_SHIFT        (0U)\r\n/*! COUNT - Number of greater-than-2048-byte recieve packets */\r\n#define ENET_RMON_R_P_GTE2048_COUNT(x)           (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_P_GTE2048_COUNT_SHIFT)) & ENET_RMON_R_P_GTE2048_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name RMON_R_OCTETS - Rx Octets Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_RMON_R_OCTETS_COUNT_MASK            (0xFFFFFFFFU)\r\n#define ENET_RMON_R_OCTETS_COUNT_SHIFT           (0U)\r\n/*! COUNT - Number of receive octets */\r\n#define ENET_RMON_R_OCTETS_COUNT(x)              (((uint32_t)(((uint32_t)(x)) << ENET_RMON_R_OCTETS_COUNT_SHIFT)) & ENET_RMON_R_OCTETS_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name IEEE_R_DROP - Frames not Counted Correctly Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_IEEE_R_DROP_COUNT_MASK              (0xFFFFU)\r\n#define ENET_IEEE_R_DROP_COUNT_SHIFT             (0U)\r\n/*! COUNT - Frame count */\r\n#define ENET_IEEE_R_DROP_COUNT(x)                (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_R_DROP_COUNT_SHIFT)) & ENET_IEEE_R_DROP_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name IEEE_R_FRAME_OK - Frames Received OK Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_IEEE_R_FRAME_OK_COUNT_MASK          (0xFFFFU)\r\n#define ENET_IEEE_R_FRAME_OK_COUNT_SHIFT         (0U)\r\n/*! COUNT - Number of frames received OK */\r\n#define ENET_IEEE_R_FRAME_OK_COUNT(x)            (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_R_FRAME_OK_COUNT_SHIFT)) & ENET_IEEE_R_FRAME_OK_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name IEEE_R_CRC - Frames Received with CRC Error Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_IEEE_R_CRC_COUNT_MASK               (0xFFFFU)\r\n#define ENET_IEEE_R_CRC_COUNT_SHIFT              (0U)\r\n/*! COUNT - Number of frames received with CRC error */\r\n#define ENET_IEEE_R_CRC_COUNT(x)                 (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_R_CRC_COUNT_SHIFT)) & ENET_IEEE_R_CRC_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name IEEE_R_ALIGN - Frames Received with Alignment Error Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_IEEE_R_ALIGN_COUNT_MASK             (0xFFFFU)\r\n#define ENET_IEEE_R_ALIGN_COUNT_SHIFT            (0U)\r\n/*! COUNT - Number of frames received with alignment error */\r\n#define ENET_IEEE_R_ALIGN_COUNT(x)               (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_R_ALIGN_COUNT_SHIFT)) & ENET_IEEE_R_ALIGN_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name IEEE_R_MACERR - Receive FIFO Overflow Count Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_IEEE_R_MACERR_COUNT_MASK            (0xFFFFU)\r\n#define ENET_IEEE_R_MACERR_COUNT_SHIFT           (0U)\r\n/*! COUNT - Receive FIFO overflow count */\r\n#define ENET_IEEE_R_MACERR_COUNT(x)              (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_R_MACERR_COUNT_SHIFT)) & ENET_IEEE_R_MACERR_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name IEEE_R_FDXFC - Flow Control Pause Frames Received Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_IEEE_R_FDXFC_COUNT_MASK             (0xFFFFU)\r\n#define ENET_IEEE_R_FDXFC_COUNT_SHIFT            (0U)\r\n/*! COUNT - Number of flow-control pause frames received */\r\n#define ENET_IEEE_R_FDXFC_COUNT(x)               (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_R_FDXFC_COUNT_SHIFT)) & ENET_IEEE_R_FDXFC_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name IEEE_R_OCTETS_OK - Octet Count for Frames Received without Error Statistic Register */\r\n/*! @{ */\r\n\r\n#define ENET_IEEE_R_OCTETS_OK_COUNT_MASK         (0xFFFFFFFFU)\r\n#define ENET_IEEE_R_OCTETS_OK_COUNT_SHIFT        (0U)\r\n/*! COUNT - Number of octets for frames received without error */\r\n#define ENET_IEEE_R_OCTETS_OK_COUNT(x)           (((uint32_t)(((uint32_t)(x)) << ENET_IEEE_R_OCTETS_OK_COUNT_SHIFT)) & ENET_IEEE_R_OCTETS_OK_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ATCR - Adjustable Timer Control Register */\r\n/*! @{ */\r\n\r\n#define ENET_ATCR_EN_MASK                        (0x1U)\r\n#define ENET_ATCR_EN_SHIFT                       (0U)\r\n/*! EN - Enable Timer\r\n *  0b0..The timer stops at the current value.\r\n *  0b1..The timer starts incrementing.\r\n */\r\n#define ENET_ATCR_EN(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_ATCR_EN_SHIFT)) & ENET_ATCR_EN_MASK)\r\n\r\n#define ENET_ATCR_OFFEN_MASK                     (0x4U)\r\n#define ENET_ATCR_OFFEN_SHIFT                    (2U)\r\n/*! OFFEN - Enable One-Shot Offset Event\r\n *  0b0..Disable.\r\n *  0b1..The timer can be reset to zero when the given offset time is reached (offset event). The field is cleared\r\n *       when the offset event is reached, so no further event occurs until the field is set again. The timer\r\n *       offset value must be set before setting this field.\r\n */\r\n#define ENET_ATCR_OFFEN(x)                       (((uint32_t)(((uint32_t)(x)) << ENET_ATCR_OFFEN_SHIFT)) & ENET_ATCR_OFFEN_MASK)\r\n\r\n#define ENET_ATCR_OFFRST_MASK                    (0x8U)\r\n#define ENET_ATCR_OFFRST_SHIFT                   (3U)\r\n/*! OFFRST - Reset Timer On Offset Event\r\n *  0b0..The timer is not affected and no action occurs, besides clearing OFFEN, when the offset is reached.\r\n *  0b1..If OFFEN is set, the timer resets to zero when the offset setting is reached. The offset event does not cause a timer interrupt.\r\n */\r\n#define ENET_ATCR_OFFRST(x)                      (((uint32_t)(((uint32_t)(x)) << ENET_ATCR_OFFRST_SHIFT)) & ENET_ATCR_OFFRST_MASK)\r\n\r\n#define ENET_ATCR_PEREN_MASK                     (0x10U)\r\n#define ENET_ATCR_PEREN_SHIFT                    (4U)\r\n/*! PEREN - Enable Periodical Event\r\n *  0b0..Disable.\r\n *  0b1..A period event interrupt can be generated (EIR[TS_TIMER]) and the event signal output is asserted when\r\n *       the timer wraps around according to the periodic setting ATPER. The timer period value must be set before\r\n *       setting this bit. Not all devices contain the event signal output. See the chip configuration details.\r\n */\r\n#define ENET_ATCR_PEREN(x)                       (((uint32_t)(((uint32_t)(x)) << ENET_ATCR_PEREN_SHIFT)) & ENET_ATCR_PEREN_MASK)\r\n\r\n#define ENET_ATCR_PINPER_MASK                    (0x80U)\r\n#define ENET_ATCR_PINPER_SHIFT                   (7U)\r\n/*! PINPER - Enables event signal output external pin frc_evt_period assertion on period event\r\n *  0b0..Disable.\r\n *  0b1..Enable.\r\n */\r\n#define ENET_ATCR_PINPER(x)                      (((uint32_t)(((uint32_t)(x)) << ENET_ATCR_PINPER_SHIFT)) & ENET_ATCR_PINPER_MASK)\r\n\r\n#define ENET_ATCR_RESTART_MASK                   (0x200U)\r\n#define ENET_ATCR_RESTART_SHIFT                  (9U)\r\n/*! RESTART - Reset Timer */\r\n#define ENET_ATCR_RESTART(x)                     (((uint32_t)(((uint32_t)(x)) << ENET_ATCR_RESTART_SHIFT)) & ENET_ATCR_RESTART_MASK)\r\n\r\n#define ENET_ATCR_CAPTURE_MASK                   (0x800U)\r\n#define ENET_ATCR_CAPTURE_SHIFT                  (11U)\r\n/*! CAPTURE - Capture Timer Value\r\n *  0b0..No effect.\r\n *  0b1..The current time is captured and can be read from the ATVR register.\r\n */\r\n#define ENET_ATCR_CAPTURE(x)                     (((uint32_t)(((uint32_t)(x)) << ENET_ATCR_CAPTURE_SHIFT)) & ENET_ATCR_CAPTURE_MASK)\r\n\r\n#define ENET_ATCR_SLAVE_MASK                     (0x2000U)\r\n#define ENET_ATCR_SLAVE_SHIFT                    (13U)\r\n/*! SLAVE - Enable Timer Slave Mode\r\n *  0b0..The timer is active and all configuration fields in this register are relevant.\r\n *  0b1..The internal timer is disabled and the externally provided timer value is used. All other fields, except\r\n *       CAPTURE, in this register have no effect. CAPTURE can still be used to capture the current timer value.\r\n */\r\n#define ENET_ATCR_SLAVE(x)                       (((uint32_t)(((uint32_t)(x)) << ENET_ATCR_SLAVE_SHIFT)) & ENET_ATCR_SLAVE_MASK)\r\n/*! @} */\r\n\r\n/*! @name ATVR - Timer Value Register */\r\n/*! @{ */\r\n\r\n#define ENET_ATVR_ATIME_MASK                     (0xFFFFFFFFU)\r\n#define ENET_ATVR_ATIME_SHIFT                    (0U)\r\n#define ENET_ATVR_ATIME(x)                       (((uint32_t)(((uint32_t)(x)) << ENET_ATVR_ATIME_SHIFT)) & ENET_ATVR_ATIME_MASK)\r\n/*! @} */\r\n\r\n/*! @name ATOFF - Timer Offset Register */\r\n/*! @{ */\r\n\r\n#define ENET_ATOFF_OFFSET_MASK                   (0xFFFFFFFFU)\r\n#define ENET_ATOFF_OFFSET_SHIFT                  (0U)\r\n#define ENET_ATOFF_OFFSET(x)                     (((uint32_t)(((uint32_t)(x)) << ENET_ATOFF_OFFSET_SHIFT)) & ENET_ATOFF_OFFSET_MASK)\r\n/*! @} */\r\n\r\n/*! @name ATPER - Timer Period Register */\r\n/*! @{ */\r\n\r\n#define ENET_ATPER_PERIOD_MASK                   (0xFFFFFFFFU)\r\n#define ENET_ATPER_PERIOD_SHIFT                  (0U)\r\n/*! PERIOD - Value for generating periodic events */\r\n#define ENET_ATPER_PERIOD(x)                     (((uint32_t)(((uint32_t)(x)) << ENET_ATPER_PERIOD_SHIFT)) & ENET_ATPER_PERIOD_MASK)\r\n/*! @} */\r\n\r\n/*! @name ATCOR - Timer Correction Register */\r\n/*! @{ */\r\n\r\n#define ENET_ATCOR_COR_MASK                      (0x7FFFFFFFU)\r\n#define ENET_ATCOR_COR_SHIFT                     (0U)\r\n/*! COR - Correction Counter Wrap-Around Value */\r\n#define ENET_ATCOR_COR(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_ATCOR_COR_SHIFT)) & ENET_ATCOR_COR_MASK)\r\n/*! @} */\r\n\r\n/*! @name ATINC - Time-Stamping Clock Period Register */\r\n/*! @{ */\r\n\r\n#define ENET_ATINC_INC_MASK                      (0x7FU)\r\n#define ENET_ATINC_INC_SHIFT                     (0U)\r\n/*! INC - Clock Period Of The Timestamping Clock (ts_clk) In Nanoseconds */\r\n#define ENET_ATINC_INC(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_ATINC_INC_SHIFT)) & ENET_ATINC_INC_MASK)\r\n\r\n#define ENET_ATINC_INC_CORR_MASK                 (0x7F00U)\r\n#define ENET_ATINC_INC_CORR_SHIFT                (8U)\r\n/*! INC_CORR - Correction Increment Value */\r\n#define ENET_ATINC_INC_CORR(x)                   (((uint32_t)(((uint32_t)(x)) << ENET_ATINC_INC_CORR_SHIFT)) & ENET_ATINC_INC_CORR_MASK)\r\n/*! @} */\r\n\r\n/*! @name ATSTMP - Timestamp of Last Transmitted Frame */\r\n/*! @{ */\r\n\r\n#define ENET_ATSTMP_TIMESTAMP_MASK               (0xFFFFFFFFU)\r\n#define ENET_ATSTMP_TIMESTAMP_SHIFT              (0U)\r\n/*! TIMESTAMP - Timestamp of the last frame transmitted by the core that had TxBD[TS] set the\r\n *    ff_tx_ts_frm signal asserted from the user application\r\n */\r\n#define ENET_ATSTMP_TIMESTAMP(x)                 (((uint32_t)(((uint32_t)(x)) << ENET_ATSTMP_TIMESTAMP_SHIFT)) & ENET_ATSTMP_TIMESTAMP_MASK)\r\n/*! @} */\r\n\r\n/*! @name TGSR - Timer Global Status Register */\r\n/*! @{ */\r\n\r\n#define ENET_TGSR_TF0_MASK                       (0x1U)\r\n#define ENET_TGSR_TF0_SHIFT                      (0U)\r\n/*! TF0 - Copy Of Timer Flag For Channel 0\r\n *  0b0..Timer Flag for Channel 0 is clear\r\n *  0b1..Timer Flag for Channel 0 is set\r\n */\r\n#define ENET_TGSR_TF0(x)                         (((uint32_t)(((uint32_t)(x)) << ENET_TGSR_TF0_SHIFT)) & ENET_TGSR_TF0_MASK)\r\n\r\n#define ENET_TGSR_TF1_MASK                       (0x2U)\r\n#define ENET_TGSR_TF1_SHIFT                      (1U)\r\n/*! TF1 - Copy Of Timer Flag For Channel 1\r\n *  0b0..Timer Flag for Channel 1 is clear\r\n *  0b1..Timer Flag for Channel 1 is set\r\n */\r\n#define ENET_TGSR_TF1(x)                         (((uint32_t)(((uint32_t)(x)) << ENET_TGSR_TF1_SHIFT)) & ENET_TGSR_TF1_MASK)\r\n\r\n#define ENET_TGSR_TF2_MASK                       (0x4U)\r\n#define ENET_TGSR_TF2_SHIFT                      (2U)\r\n/*! TF2 - Copy Of Timer Flag For Channel 2\r\n *  0b0..Timer Flag for Channel 2 is clear\r\n *  0b1..Timer Flag for Channel 2 is set\r\n */\r\n#define ENET_TGSR_TF2(x)                         (((uint32_t)(((uint32_t)(x)) << ENET_TGSR_TF2_SHIFT)) & ENET_TGSR_TF2_MASK)\r\n\r\n#define ENET_TGSR_TF3_MASK                       (0x8U)\r\n#define ENET_TGSR_TF3_SHIFT                      (3U)\r\n/*! TF3 - Copy Of Timer Flag For Channel 3\r\n *  0b0..Timer Flag for Channel 3 is clear\r\n *  0b1..Timer Flag for Channel 3 is set\r\n */\r\n#define ENET_TGSR_TF3(x)                         (((uint32_t)(((uint32_t)(x)) << ENET_TGSR_TF3_SHIFT)) & ENET_TGSR_TF3_MASK)\r\n/*! @} */\r\n\r\n/*! @name TCSR - Timer Control Status Register */\r\n/*! @{ */\r\n\r\n#define ENET_TCSR_TDRE_MASK                      (0x1U)\r\n#define ENET_TCSR_TDRE_SHIFT                     (0U)\r\n/*! TDRE - Timer DMA Request Enable\r\n *  0b0..DMA request is disabled\r\n *  0b1..DMA request is enabled\r\n */\r\n#define ENET_TCSR_TDRE(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_TCSR_TDRE_SHIFT)) & ENET_TCSR_TDRE_MASK)\r\n\r\n#define ENET_TCSR_TMODE_MASK                     (0x3CU)\r\n#define ENET_TCSR_TMODE_SHIFT                    (2U)\r\n/*! TMODE - Timer Mode\r\n *  0b0000..Timer Channel is disabled.\r\n *  0b0001..Timer Channel is configured for Input Capture on rising edge.\r\n *  0b0010..Timer Channel is configured for Input Capture on falling edge.\r\n *  0b0011..Timer Channel is configured for Input Capture on both edges.\r\n *  0b0100..Timer Channel is configured for Output Compare - software only.\r\n *  0b0101..Timer Channel is configured for Output Compare - toggle output on compare.\r\n *  0b0110..Timer Channel is configured for Output Compare - clear output on compare.\r\n *  0b0111..Timer Channel is configured for Output Compare - set output on compare.\r\n *  0b1000..Reserved\r\n *  0b1010..Timer Channel is configured for Output Compare - clear output on compare, set output on overflow.\r\n *  0b10x1..Timer Channel is configured for Output Compare - set output on compare, clear output on overflow.\r\n *  0b110x..Reserved\r\n *  0b1110..Timer Channel is configured for Output Compare - pulse output low on compare for 1 to 32 1588-clock cycles as specified by TPWC.\r\n *  0b1111..Timer Channel is configured for Output Compare - pulse output high on compare for 1 to 32 1588-clock cycles as specified by TPWC.\r\n */\r\n#define ENET_TCSR_TMODE(x)                       (((uint32_t)(((uint32_t)(x)) << ENET_TCSR_TMODE_SHIFT)) & ENET_TCSR_TMODE_MASK)\r\n\r\n#define ENET_TCSR_TIE_MASK                       (0x40U)\r\n#define ENET_TCSR_TIE_SHIFT                      (6U)\r\n/*! TIE - Timer Interrupt Enable\r\n *  0b0..Interrupt is disabled\r\n *  0b1..Interrupt is enabled\r\n */\r\n#define ENET_TCSR_TIE(x)                         (((uint32_t)(((uint32_t)(x)) << ENET_TCSR_TIE_SHIFT)) & ENET_TCSR_TIE_MASK)\r\n\r\n#define ENET_TCSR_TF_MASK                        (0x80U)\r\n#define ENET_TCSR_TF_SHIFT                       (7U)\r\n/*! TF - Timer Flag\r\n *  0b0..Input Capture or Output Compare has not occurred.\r\n *  0b1..Input Capture or Output Compare has occurred.\r\n */\r\n#define ENET_TCSR_TF(x)                          (((uint32_t)(((uint32_t)(x)) << ENET_TCSR_TF_SHIFT)) & ENET_TCSR_TF_MASK)\r\n\r\n#define ENET_TCSR_TPWC_MASK                      (0xF800U)\r\n#define ENET_TCSR_TPWC_SHIFT                     (11U)\r\n/*! TPWC - Timer PulseWidth Control\r\n *  0b00000..Pulse width is one 1588-clock cycle.\r\n *  0b00001..Pulse width is two 1588-clock cycles.\r\n *  0b00010..Pulse width is three 1588-clock cycles.\r\n *  0b00011..Pulse width is four 1588-clock cycles.\r\n *  0b11111..Pulse width is 32 1588-clock cycles.\r\n */\r\n#define ENET_TCSR_TPWC(x)                        (((uint32_t)(((uint32_t)(x)) << ENET_TCSR_TPWC_SHIFT)) & ENET_TCSR_TPWC_MASK)\r\n/*! @} */\r\n\r\n/* The count of ENET_TCSR */\r\n#define ENET_TCSR_COUNT                          (4U)\r\n\r\n/*! @name TCCR - Timer Compare Capture Register */\r\n/*! @{ */\r\n\r\n#define ENET_TCCR_TCC_MASK                       (0xFFFFFFFFU)\r\n#define ENET_TCCR_TCC_SHIFT                      (0U)\r\n/*! TCC - Timer Capture Compare */\r\n#define ENET_TCCR_TCC(x)                         (((uint32_t)(((uint32_t)(x)) << ENET_TCCR_TCC_SHIFT)) & ENET_TCCR_TCC_MASK)\r\n/*! @} */\r\n\r\n/* The count of ENET_TCCR */\r\n#define ENET_TCCR_COUNT                          (4U)\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group ENET_Register_Masks */\r\n\r\n\r\n/* ENET - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral ENET base address */\r\n  #define ENET_BASE                                (0x50138000u)\r\n  /** Peripheral ENET base address */\r\n  #define ENET_BASE_NS                             (0x40138000u)\r\n  /** Peripheral ENET base pointer */\r\n  #define ENET                                     ((ENET_Type *)ENET_BASE)\r\n  /** Peripheral ENET base pointer */\r\n  #define ENET_NS                                  ((ENET_Type *)ENET_BASE_NS)\r\n  /** Array initializer of ENET peripheral base addresses */\r\n  #define ENET_BASE_ADDRS                          { ENET_BASE }\r\n  /** Array initializer of ENET peripheral base pointers */\r\n  #define ENET_BASE_PTRS                           { ENET }\r\n  /** Array initializer of ENET peripheral base addresses */\r\n  #define ENET_BASE_ADDRS_NS                       { ENET_BASE_NS }\r\n  /** Array initializer of ENET peripheral base pointers */\r\n  #define ENET_BASE_PTRS_NS                        { ENET_NS }\r\n#else\r\n  /** Peripheral ENET base address */\r\n  #define ENET_BASE                                (0x40138000u)\r\n  /** Peripheral ENET base pointer */\r\n  #define ENET                                     ((ENET_Type *)ENET_BASE)\r\n  /** Array initializer of ENET peripheral base addresses */\r\n  #define ENET_BASE_ADDRS                          { ENET_BASE }\r\n  /** Array initializer of ENET peripheral base pointers */\r\n  #define ENET_BASE_PTRS                           { ENET }\r\n#endif\r\n/** Interrupt vectors for the ENET peripheral type */\r\n#define ENET_Transmit_IRQS                       { ENET_IRQn }\r\n#define ENET_Receive_IRQS                        { ENET_IRQn }\r\n#define ENET_Error_IRQS                          { ENET_IRQn }\r\n#define ENET_1588_Timer_IRQS                     { ENET_TIMER_IRQn }\r\n#define ENET_Ts_IRQS                             { ENET_IRQn }\r\n/* ENET Buffer Descriptor and Buffer Address Alignment. */\r\n#define ENET_BUFF_ALIGNMENT                      (64U)\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group ENET_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- FLEXCOMM Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup FLEXCOMM_Peripheral_Access_Layer FLEXCOMM Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** FLEXCOMM - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[4088];\r\n  __IO uint32_t PSELID;                            /**< Peripheral Select and Flexcomm module ID, offset: 0xFF8 */\r\n  __I  uint32_t PID;                               /**< Peripheral Identification, offset: 0xFFC */\r\n} FLEXCOMM_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- FLEXCOMM Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup FLEXCOMM_Register_Masks FLEXCOMM Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name PSELID - Peripheral Select and Flexcomm module ID */\r\n/*! @{ */\r\n\r\n#define FLEXCOMM_PSELID_PERSEL_MASK              (0x7U)\r\n#define FLEXCOMM_PSELID_PERSEL_SHIFT             (0U)\r\n/*! PERSEL - Peripheral Select\r\n *  0b000..No peripheral selected.\r\n *  0b001..USART function selected\r\n *  0b010..SPI function selected\r\n *  0b011..I2C\r\n *  0b100..I2S Transmit\r\n *  0b101..I2S Receive\r\n *  0b110..Reserved\r\n *  0b111..Reserved\r\n */\r\n#define FLEXCOMM_PSELID_PERSEL(x)                (((uint32_t)(((uint32_t)(x)) << FLEXCOMM_PSELID_PERSEL_SHIFT)) & FLEXCOMM_PSELID_PERSEL_MASK)\r\n\r\n#define FLEXCOMM_PSELID_LOCK_MASK                (0x8U)\r\n#define FLEXCOMM_PSELID_LOCK_SHIFT               (3U)\r\n/*! LOCK - Lock the peripheral select\r\n *  0b0..Peripheral select can be changed by software.\r\n *  0b1..Peripheral select is locked and cannot be changed until this Flexcomm module or the entire device is reset.\r\n */\r\n#define FLEXCOMM_PSELID_LOCK(x)                  (((uint32_t)(((uint32_t)(x)) << FLEXCOMM_PSELID_LOCK_SHIFT)) & FLEXCOMM_PSELID_LOCK_MASK)\r\n\r\n#define FLEXCOMM_PSELID_USARTPRESENT_MASK        (0x10U)\r\n#define FLEXCOMM_PSELID_USARTPRESENT_SHIFT       (4U)\r\n/*! USARTPRESENT - USART present indicator\r\n *  0b0..This Flexcomm module does not include the USART function.\r\n *  0b1..This Flexcomm module includes the USART function.\r\n */\r\n#define FLEXCOMM_PSELID_USARTPRESENT(x)          (((uint32_t)(((uint32_t)(x)) << FLEXCOMM_PSELID_USARTPRESENT_SHIFT)) & FLEXCOMM_PSELID_USARTPRESENT_MASK)\r\n\r\n#define FLEXCOMM_PSELID_SPIPRESENT_MASK          (0x20U)\r\n#define FLEXCOMM_PSELID_SPIPRESENT_SHIFT         (5U)\r\n/*! SPIPRESENT - SPI present indicator\r\n *  0b0..This Flexcomm module does not include the SPI function.\r\n *  0b1..This Flexcomm module includes the SPI function.\r\n */\r\n#define FLEXCOMM_PSELID_SPIPRESENT(x)            (((uint32_t)(((uint32_t)(x)) << FLEXCOMM_PSELID_SPIPRESENT_SHIFT)) & FLEXCOMM_PSELID_SPIPRESENT_MASK)\r\n\r\n#define FLEXCOMM_PSELID_I2CPRESENT_MASK          (0x40U)\r\n#define FLEXCOMM_PSELID_I2CPRESENT_SHIFT         (6U)\r\n/*! I2CPRESENT - I2C present indicator\r\n *  0b0..I2C Not Present\r\n *  0b1..I2C Present\r\n */\r\n#define FLEXCOMM_PSELID_I2CPRESENT(x)            (((uint32_t)(((uint32_t)(x)) << FLEXCOMM_PSELID_I2CPRESENT_SHIFT)) & FLEXCOMM_PSELID_I2CPRESENT_MASK)\r\n\r\n#define FLEXCOMM_PSELID_I2SPRESENT_MASK          (0x80U)\r\n#define FLEXCOMM_PSELID_I2SPRESENT_SHIFT         (7U)\r\n/*! I2SPRESENT - I2S Present\r\n *  0b0..I2S Not Present\r\n *  0b1..I2S Present\r\n */\r\n#define FLEXCOMM_PSELID_I2SPRESENT(x)            (((uint32_t)(((uint32_t)(x)) << FLEXCOMM_PSELID_I2SPRESENT_SHIFT)) & FLEXCOMM_PSELID_I2SPRESENT_MASK)\r\n\r\n#define FLEXCOMM_PSELID_ID_MASK                  (0xFFFFF000U)\r\n#define FLEXCOMM_PSELID_ID_SHIFT                 (12U)\r\n/*! ID - Flexcomm ID */\r\n#define FLEXCOMM_PSELID_ID(x)                    (((uint32_t)(((uint32_t)(x)) << FLEXCOMM_PSELID_ID_SHIFT)) & FLEXCOMM_PSELID_ID_MASK)\r\n/*! @} */\r\n\r\n/*! @name PID - Peripheral Identification */\r\n/*! @{ */\r\n\r\n#define FLEXCOMM_PID_MINOR_REV_MASK              (0xF00U)\r\n#define FLEXCOMM_PID_MINOR_REV_SHIFT             (8U)\r\n/*! MINOR_REV - Minor revision of module implementation */\r\n#define FLEXCOMM_PID_MINOR_REV(x)                (((uint32_t)(((uint32_t)(x)) << FLEXCOMM_PID_MINOR_REV_SHIFT)) & FLEXCOMM_PID_MINOR_REV_MASK)\r\n\r\n#define FLEXCOMM_PID_MAJOR_REV_MASK              (0xF000U)\r\n#define FLEXCOMM_PID_MAJOR_REV_SHIFT             (12U)\r\n/*! MAJOR_REV - Major revision of module implementation */\r\n#define FLEXCOMM_PID_MAJOR_REV(x)                (((uint32_t)(((uint32_t)(x)) << FLEXCOMM_PID_MAJOR_REV_SHIFT)) & FLEXCOMM_PID_MAJOR_REV_MASK)\r\n\r\n#define FLEXCOMM_PID_ID_MASK                     (0xFFFF0000U)\r\n#define FLEXCOMM_PID_ID_SHIFT                    (16U)\r\n/*! ID - Module identifier for the selected function */\r\n#define FLEXCOMM_PID_ID(x)                       (((uint32_t)(((uint32_t)(x)) << FLEXCOMM_PID_ID_SHIFT)) & FLEXCOMM_PID_ID_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group FLEXCOMM_Register_Masks */\r\n\r\n\r\n/* FLEXCOMM - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral FLEXCOMM0 base address */\r\n  #define FLEXCOMM0_BASE                           (0x50106000u)\r\n  /** Peripheral FLEXCOMM0 base address */\r\n  #define FLEXCOMM0_BASE_NS                        (0x40106000u)\r\n  /** Peripheral FLEXCOMM0 base pointer */\r\n  #define FLEXCOMM0                                ((FLEXCOMM_Type *)FLEXCOMM0_BASE)\r\n  /** Peripheral FLEXCOMM0 base pointer */\r\n  #define FLEXCOMM0_NS                             ((FLEXCOMM_Type *)FLEXCOMM0_BASE_NS)\r\n  /** Peripheral FLEXCOMM1 base address */\r\n  #define FLEXCOMM1_BASE                           (0x50107000u)\r\n  /** Peripheral FLEXCOMM1 base address */\r\n  #define FLEXCOMM1_BASE_NS                        (0x40107000u)\r\n  /** Peripheral FLEXCOMM1 base pointer */\r\n  #define FLEXCOMM1                                ((FLEXCOMM_Type *)FLEXCOMM1_BASE)\r\n  /** Peripheral FLEXCOMM1 base pointer */\r\n  #define FLEXCOMM1_NS                             ((FLEXCOMM_Type *)FLEXCOMM1_BASE_NS)\r\n  /** Peripheral FLEXCOMM2 base address */\r\n  #define FLEXCOMM2_BASE                           (0x50108000u)\r\n  /** Peripheral FLEXCOMM2 base address */\r\n  #define FLEXCOMM2_BASE_NS                        (0x40108000u)\r\n  /** Peripheral FLEXCOMM2 base pointer */\r\n  #define FLEXCOMM2                                ((FLEXCOMM_Type *)FLEXCOMM2_BASE)\r\n  /** Peripheral FLEXCOMM2 base pointer */\r\n  #define FLEXCOMM2_NS                             ((FLEXCOMM_Type *)FLEXCOMM2_BASE_NS)\r\n  /** Peripheral FLEXCOMM3 base address */\r\n  #define FLEXCOMM3_BASE                           (0x50109000u)\r\n  /** Peripheral FLEXCOMM3 base address */\r\n  #define FLEXCOMM3_BASE_NS                        (0x40109000u)\r\n  /** Peripheral FLEXCOMM3 base pointer */\r\n  #define FLEXCOMM3                                ((FLEXCOMM_Type *)FLEXCOMM3_BASE)\r\n  /** Peripheral FLEXCOMM3 base pointer */\r\n  #define FLEXCOMM3_NS                             ((FLEXCOMM_Type *)FLEXCOMM3_BASE_NS)\r\n  /** Peripheral FLEXCOMM14 base address */\r\n  #define FLEXCOMM14_BASE                          (0x50126000u)\r\n  /** Peripheral FLEXCOMM14 base address */\r\n  #define FLEXCOMM14_BASE_NS                       (0x40126000u)\r\n  /** Peripheral FLEXCOMM14 base pointer */\r\n  #define FLEXCOMM14                               ((FLEXCOMM_Type *)FLEXCOMM14_BASE)\r\n  /** Peripheral FLEXCOMM14 base pointer */\r\n  #define FLEXCOMM14_NS                            ((FLEXCOMM_Type *)FLEXCOMM14_BASE_NS)\r\n  /** Array initializer of FLEXCOMM peripheral base addresses */\r\n  #define FLEXCOMM_BASE_ADDRS                      { FLEXCOMM0_BASE, FLEXCOMM1_BASE, FLEXCOMM2_BASE, FLEXCOMM3_BASE, FLEXCOMM14_BASE }\r\n  /** Array initializer of FLEXCOMM peripheral base pointers */\r\n  #define FLEXCOMM_BASE_PTRS                       { FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM14 }\r\n  /** Array initializer of FLEXCOMM peripheral base addresses */\r\n  #define FLEXCOMM_BASE_ADDRS_NS                   { FLEXCOMM0_BASE_NS, FLEXCOMM1_BASE_NS, FLEXCOMM2_BASE_NS, FLEXCOMM3_BASE_NS, FLEXCOMM14_BASE_NS }\r\n  /** Array initializer of FLEXCOMM peripheral base pointers */\r\n  #define FLEXCOMM_BASE_PTRS_NS                    { FLEXCOMM0_NS, FLEXCOMM1_NS, FLEXCOMM2_NS, FLEXCOMM3_NS, FLEXCOMM14_NS }\r\n#else\r\n  /** Peripheral FLEXCOMM0 base address */\r\n  #define FLEXCOMM0_BASE                           (0x40106000u)\r\n  /** Peripheral FLEXCOMM0 base pointer */\r\n  #define FLEXCOMM0                                ((FLEXCOMM_Type *)FLEXCOMM0_BASE)\r\n  /** Peripheral FLEXCOMM1 base address */\r\n  #define FLEXCOMM1_BASE                           (0x40107000u)\r\n  /** Peripheral FLEXCOMM1 base pointer */\r\n  #define FLEXCOMM1                                ((FLEXCOMM_Type *)FLEXCOMM1_BASE)\r\n  /** Peripheral FLEXCOMM2 base address */\r\n  #define FLEXCOMM2_BASE                           (0x40108000u)\r\n  /** Peripheral FLEXCOMM2 base pointer */\r\n  #define FLEXCOMM2                                ((FLEXCOMM_Type *)FLEXCOMM2_BASE)\r\n  /** Peripheral FLEXCOMM3 base address */\r\n  #define FLEXCOMM3_BASE                           (0x40109000u)\r\n  /** Peripheral FLEXCOMM3 base pointer */\r\n  #define FLEXCOMM3                                ((FLEXCOMM_Type *)FLEXCOMM3_BASE)\r\n  /** Peripheral FLEXCOMM14 base address */\r\n  #define FLEXCOMM14_BASE                          (0x40126000u)\r\n  /** Peripheral FLEXCOMM14 base pointer */\r\n  #define FLEXCOMM14                               ((FLEXCOMM_Type *)FLEXCOMM14_BASE)\r\n  /** Array initializer of FLEXCOMM peripheral base addresses */\r\n  #define FLEXCOMM_BASE_ADDRS                      { FLEXCOMM0_BASE, FLEXCOMM1_BASE, FLEXCOMM2_BASE, FLEXCOMM3_BASE, FLEXCOMM14_BASE }\r\n  /** Array initializer of FLEXCOMM peripheral base pointers */\r\n  #define FLEXCOMM_BASE_PTRS                       { FLEXCOMM0, FLEXCOMM1, FLEXCOMM2, FLEXCOMM3, FLEXCOMM14 }\r\n#endif\r\n/** Interrupt vectors for the FLEXCOMM peripheral type */\r\n#define FLEXCOMM_IRQS                            { FLEXCOMM0_IRQn, FLEXCOMM1_IRQn, FLEXCOMM2_IRQn, FLEXCOMM3_IRQn, FLEXCOMM14_IRQn }\r\n\r\n/*!\r\n * @}\r\n */ /* end of group FLEXCOMM_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- FLEXSPI Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup FLEXSPI_Peripheral_Access_Layer FLEXSPI Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** FLEXSPI - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t MCR0;                              /**< Module Control Register 0, offset: 0x0 */\r\n  __IO uint32_t MCR1;                              /**< Module Control Register 1, offset: 0x4 */\r\n  __IO uint32_t MCR2;                              /**< Module Control Register 2, offset: 0x8 */\r\n  __IO uint32_t AHBCR;                             /**< AHB Bus Control Register, offset: 0xC */\r\n  __IO uint32_t INTEN;                             /**< Interrupt Enable Register, offset: 0x10 */\r\n  __IO uint32_t INTR;                              /**< Interrupt Register, offset: 0x14 */\r\n  __IO uint32_t LUTKEY;                            /**< LUT Key Register, offset: 0x18 */\r\n  __IO uint32_t LUTCR;                             /**< LUT Control Register, offset: 0x1C */\r\n  __IO uint32_t AHBRXBUFCR0[8];                    /**< AHB RX Buffer 0 Control Register 0..AHB RX Buffer 7 Control Register 0, array offset: 0x20, array step: 0x4 */\r\n       uint8_t RESERVED_0[32];\r\n  __IO uint32_t FLSHCR0[4];                        /**< Flash Control Register 0, array offset: 0x60, array step: 0x4 */\r\n  __IO uint32_t FLSHCR1[4];                        /**< Flash Control Register 1, array offset: 0x70, array step: 0x4 */\r\n  __IO uint32_t FLSHCR2[4];                        /**< Flash Control Register 2, array offset: 0x80, array step: 0x4 */\r\n       uint8_t RESERVED_1[4];\r\n  __IO uint32_t FLSHCR4;                           /**< Flash Control Register 4, offset: 0x94 */\r\n       uint8_t RESERVED_2[8];\r\n  __IO uint32_t IPCR0;                             /**< IP Control Register 0, offset: 0xA0 */\r\n  __IO uint32_t IPCR1;                             /**< IP Control Register 1, offset: 0xA4 */\r\n       uint8_t RESERVED_3[8];\r\n  __IO uint32_t IPCMD;                             /**< IP Command Register, offset: 0xB0 */\r\n  __IO uint32_t DLPR;                              /**< Data Learn Pattern Register, offset: 0xB4 */\r\n  __IO uint32_t IPRXFCR;                           /**< IP RX FIFO Control Register, offset: 0xB8 */\r\n  __IO uint32_t IPTXFCR;                           /**< IP TX FIFO Control Register, offset: 0xBC */\r\n  __IO uint32_t DLLCR[2];                          /**< DLL Control Register 0, array offset: 0xC0, array step: 0x4 */\r\n       uint8_t RESERVED_4[24];\r\n  __I  uint32_t STS0;                              /**< Status Register 0, offset: 0xE0 */\r\n  __I  uint32_t STS1;                              /**< Status Register 1, offset: 0xE4 */\r\n  __I  uint32_t STS2;                              /**< Status Register 2, offset: 0xE8 */\r\n  __I  uint32_t AHBSPNDSTS;                        /**< AHB Suspend Status Register, offset: 0xEC */\r\n  __I  uint32_t IPRXFSTS;                          /**< IP RX FIFO Status Register, offset: 0xF0 */\r\n  __I  uint32_t IPTXFSTS;                          /**< IP TX FIFO Status Register, offset: 0xF4 */\r\n       uint8_t RESERVED_5[8];\r\n  __I  uint32_t RFDR[32];                          /**< IP RX FIFO Data Register 0..IP RX FIFO Data Register 31, array offset: 0x100, array step: 0x4 */\r\n  __O  uint32_t TFDR[32];                          /**< IP TX FIFO Data Register 0..IP TX FIFO Data Register 31, array offset: 0x180, array step: 0x4 */\r\n  __IO uint32_t LUT[64];                           /**< LUT 0..LUT 63, array offset: 0x200, array step: 0x4 */\r\n       uint8_t RESERVED_6[288];\r\n  __IO uint32_t HADDRSTART;                        /**< HADDR REMAP START ADDR, offset: 0x420 */\r\n  __IO uint32_t HADDREND;                          /**< HADDR REMAP END ADDR, offset: 0x424 */\r\n  __IO uint32_t HADDROFFSET;                       /**< HADDR REMAP OFFSET, offset: 0x428 */\r\n  __IO uint32_t IPEDCTRL;                          /**< IPED function control, offset: 0x42C */\r\n  __IO uint32_t IPSNSZSTART0;                      /**< IPS nonsecure region Start address of region 0, offset: 0x430 */\r\n  __IO uint32_t IPSNSZEND0;                        /**< IPS nonsecure region End address of region 0, offset: 0x434 */\r\n  __IO uint32_t IPSNSZSTART1;                      /**< IPS nonsecure region Start address of region 1, offset: 0x438 */\r\n  __IO uint32_t IPSNSZEND1;                        /**< IPS nonsecure region End address of region 1, offset: 0x43C */\r\n  __IO uint32_t AHBBUFREGIONSTART0;                /**< RX BUF Start address of region 0, offset: 0x440 */\r\n  __IO uint32_t AHBBUFREGIONEND0;                  /**< RX BUF region End address of region 0, offset: 0x444 */\r\n  __IO uint32_t AHBBUFREGIONSTART1;                /**< RX BUF Start address of region 1, offset: 0x448 */\r\n  __IO uint32_t AHBBUFREGIONEND1;                  /**< RX BUF region End address of region 1, offset: 0x44C */\r\n  __IO uint32_t AHBBUFREGIONSTART2;                /**< RX BUF Start address of region 2, offset: 0x450 */\r\n  __IO uint32_t AHBBUFREGIONEND2;                  /**< RX BUF region End address of region 2, offset: 0x454 */\r\n  __IO uint32_t AHBBUFREGIONSTART3;                /**< RX BUF Start address of region 3, offset: 0x458 */\r\n  __IO uint32_t AHBBUFREGIONEND3;                  /**< RX BUF region End address of region 3, offset: 0x45C */\r\n       uint8_t RESERVED_7[160];\r\n  __IO uint32_t IPEDCTXCTRL[2];                    /**< IPED context control 0..IPED context control 1, array offset: 0x500, array step: 0x4 */\r\n       uint8_t RESERVED_8[24];\r\n  __IO uint32_t IPEDCTX0IV0;                       /**< IPED context0 IV0, offset: 0x520 */\r\n  __IO uint32_t IPEDCTX0IV1;                       /**< IPED context0 IV1, offset: 0x524 */\r\n  __IO uint32_t IPEDCTX0START;                     /**< Start address of region 0, offset: 0x528 */\r\n  __IO uint32_t IPEDCTX0END;                       /**< End address of region 0, offset: 0x52C */\r\n  __IO uint32_t IPEDCTX0AAD0;                      /**< IPED context0 AAD0, offset: 0x530 */\r\n  __IO uint32_t IPEDCTX0AAD1;                      /**< IPED context0 AAD1, offset: 0x534 */\r\n       uint8_t RESERVED_9[8];\r\n  __IO uint32_t IPEDCTX1IV0;                       /**< IPED context1 IV0, offset: 0x540 */\r\n  __IO uint32_t IPEDCTX1IV1;                       /**< IPED context1 IV1, offset: 0x544 */\r\n  __IO uint32_t IPEDCTX1START;                     /**< Start address of region 1, offset: 0x548 */\r\n  __IO uint32_t IPEDCTX1END;                       /**< End address of region 1, offset: 0x54C */\r\n  __IO uint32_t IPEDCTX1AAD0;                      /**< IPED context1 AAD0, offset: 0x550 */\r\n  __IO uint32_t IPEDCTX1AAD1;                      /**< IPED context1 AAD1, offset: 0x554 */\r\n       uint8_t RESERVED_10[8];\r\n  __IO uint32_t IPEDCTX2IV0;                       /**< IPED context2 IV0, offset: 0x560 */\r\n  __IO uint32_t IPEDCTX2IV1;                       /**< IPED context2 IV1, offset: 0x564 */\r\n  __IO uint32_t IPEDCTX2START;                     /**< Start address of region 2, offset: 0x568 */\r\n  __IO uint32_t IPEDCTX2END;                       /**< End address of region 2, offset: 0x56C */\r\n  __IO uint32_t IPEDCTX2AAD0;                      /**< IPED context2 AAD0, offset: 0x570 */\r\n  __IO uint32_t IPEDCTX2AAD1;                      /**< IPED context2 AAD1, offset: 0x574 */\r\n       uint8_t RESERVED_11[8];\r\n  __IO uint32_t IPEDCTX3IV0;                       /**< IPED context3 IV0, offset: 0x580 */\r\n  __IO uint32_t IPEDCTX3IV1;                       /**< IPED context3 IV1, offset: 0x584 */\r\n  __IO uint32_t IPEDCTX3START;                     /**< Start address of region 3, offset: 0x588 */\r\n  __IO uint32_t IPEDCTX3END;                       /**< End address of region 3, offset: 0x58C */\r\n  __IO uint32_t IPEDCTX3AAD0;                      /**< IPED context3 AAD0, offset: 0x590 */\r\n  __IO uint32_t IPEDCTX3AAD1;                      /**< IPED context3 AAD1, offset: 0x594 */\r\n       uint8_t RESERVED_12[8];\r\n  __IO uint32_t IPEDCTX4IV0;                       /**< IPED context4 IV0, offset: 0x5A0 */\r\n  __IO uint32_t IPEDCTX4IV1;                       /**< IPED context4 IV1, offset: 0x5A4 */\r\n  __IO uint32_t IPEDCTX4START;                     /**< Start address of region 4, offset: 0x5A8 */\r\n  __IO uint32_t IPEDCTX4END;                       /**< End address of region 4, offset: 0x5AC */\r\n  __IO uint32_t IPEDCTX4AAD0;                      /**< IPED context4 AAD0, offset: 0x5B0 */\r\n  __IO uint32_t IPEDCTX4AAD1;                      /**< IPED context4 AAD1, offset: 0x5B4 */\r\n       uint8_t RESERVED_13[8];\r\n  __IO uint32_t IPEDCTX5IV0;                       /**< IPED context5 IV0, offset: 0x5C0 */\r\n  __IO uint32_t IPEDCTX5IV1;                       /**< IPED context5 IV1, offset: 0x5C4 */\r\n  __IO uint32_t IPEDCTX5START;                     /**< Start address of region 5, offset: 0x5C8 */\r\n  __IO uint32_t IPEDCTX5END;                       /**< End address of region 5, offset: 0x5CC */\r\n  __IO uint32_t IPEDCTX5AAD0;                      /**< IPED context5 AAD0, offset: 0x5D0 */\r\n  __IO uint32_t IPEDCTX5AAD1;                      /**< IPED context5 AAD1, offset: 0x5D4 */\r\n       uint8_t RESERVED_14[8];\r\n  __IO uint32_t IPEDCTX6IV0;                       /**< IPED context6 IV0, offset: 0x5E0 */\r\n  __IO uint32_t IPEDCTX6IV1;                       /**< IPED context6 IV1, offset: 0x5E4 */\r\n  __IO uint32_t IPEDCTX6START;                     /**< Start address of region 6, offset: 0x5E8 */\r\n  __IO uint32_t IPEDCTX6END;                       /**< End address of region 6, offset: 0x5EC */\r\n  __IO uint32_t IPEDCTX6AAD0;                      /**< IPED context6 AAD0, offset: 0x5F0 */\r\n  __IO uint32_t IPEDCTX6AAD1;                      /**< IPED context6 AAD1, offset: 0x5F4 */\r\n       uint8_t RESERVED_15[8];\r\n  __IO uint32_t IPEDCTX7IV0;                       /**< IPED context7 IV0, offset: 0x600 */\r\n  __IO uint32_t IPEDCTX7IV1;                       /**< IPED context7 IV1, offset: 0x604 */\r\n  __IO uint32_t IPEDCTX7START;                     /**< Start address of region 7, offset: 0x608 */\r\n  __IO uint32_t IPEDCTX7END;                       /**< End address of region 7, offset: 0x60C */\r\n  __IO uint32_t IPEDCTX7AAD0;                      /**< IPED context7 AAD0, offset: 0x610 */\r\n  __IO uint32_t IPEDCTX7AAD1;                      /**< IPED context7 AAD1, offset: 0x614 */\r\n       uint8_t RESERVED_16[8];\r\n  __IO uint32_t IPEDCTX8IV0;                       /**< IPED context8 IV0, offset: 0x620 */\r\n  __IO uint32_t IPEDCTX8IV1;                       /**< IPED context8 IV1, offset: 0x624 */\r\n  __IO uint32_t IPEDCTX8START;                     /**< Start address of region 8, offset: 0x628 */\r\n  __IO uint32_t IPEDCTX8END;                       /**< End address of region 8, offset: 0x62C */\r\n  __IO uint32_t IPEDCTX8AAD0;                      /**< IPED context8 AAD0, offset: 0x630 */\r\n  __IO uint32_t IPEDCTX8AAD1;                      /**< IPED context8 AAD1, offset: 0x634 */\r\n       uint8_t RESERVED_17[8];\r\n  __IO uint32_t IPEDCTX9IV0;                       /**< IPED context9 IV0, offset: 0x640 */\r\n  __IO uint32_t IPEDCTX9IV1;                       /**< IPED context9 IV1, offset: 0x644 */\r\n  __IO uint32_t IPEDCTX9START;                     /**< Start address of region 9, offset: 0x648 */\r\n  __IO uint32_t IPEDCTX9END;                       /**< End address of region 9, offset: 0x64C */\r\n  __IO uint32_t IPEDCTX9AAD0;                      /**< IPED context9 AAD0, offset: 0x650 */\r\n  __IO uint32_t IPEDCTX9AAD1;                      /**< IPED context9 AAD1, offset: 0x654 */\r\n       uint8_t RESERVED_18[8];\r\n  __IO uint32_t IPEDCTX10IV0;                      /**< IPED context10 IV0, offset: 0x660 */\r\n  __IO uint32_t IPEDCTX10IV1;                      /**< IPED context10 IV1, offset: 0x664 */\r\n  __IO uint32_t IPEDCTX10START;                    /**< Start address of region 10, offset: 0x668 */\r\n  __IO uint32_t IPEDCTX10END;                      /**< End address of region 10, offset: 0x66C */\r\n  __IO uint32_t IPEDCTX10AAD0;                     /**< IPED context10 AAD0, offset: 0x670 */\r\n  __IO uint32_t IPEDCTX10AAD1;                     /**< IPED context10 AAD1, offset: 0x674 */\r\n       uint8_t RESERVED_19[8];\r\n  __IO uint32_t IPEDCTX11IV0;                      /**< IPED context11 IV0, offset: 0x680 */\r\n  __IO uint32_t IPEDCTX11IV1;                      /**< IPED context11 IV1, offset: 0x684 */\r\n  __IO uint32_t IPEDCTX11START;                    /**< Start address of region 11, offset: 0x688 */\r\n  __IO uint32_t IPEDCTX11END;                      /**< End address of region 11, offset: 0x68C */\r\n  __IO uint32_t IPEDCTX11AAD0;                     /**< IPED context11 AAD0, offset: 0x690 */\r\n  __IO uint32_t IPEDCTX11AAD1;                     /**< IPED context11 AAD1, offset: 0x694 */\r\n       uint8_t RESERVED_20[8];\r\n  __IO uint32_t IPEDCTX12IV0;                      /**< IPED context12 IV0, offset: 0x6A0 */\r\n  __IO uint32_t IPEDCTX12IV1;                      /**< IPED context12 IV1, offset: 0x6A4 */\r\n  __IO uint32_t IPEDCTX12START;                    /**< Start address of region 12, offset: 0x6A8 */\r\n  __IO uint32_t IPEDCTX12END;                      /**< End address of region 12, offset: 0x6AC */\r\n  __IO uint32_t IPEDCTX12AAD0;                     /**< IPED context12 AAD0, offset: 0x6B0 */\r\n  __IO uint32_t IPEDCTX12AAD1;                     /**< IPED context12 AAD1, offset: 0x6B4 */\r\n       uint8_t RESERVED_21[8];\r\n  __IO uint32_t IPEDCTX13IV0;                      /**< IPED context13 IV0, offset: 0x6C0 */\r\n  __IO uint32_t IPEDCTX13IV1;                      /**< IPED context13 IV1, offset: 0x6C4 */\r\n  __IO uint32_t IPEDCTX13START;                    /**< Start address of region 13, offset: 0x6C8 */\r\n  __IO uint32_t IPEDCTX13END;                      /**< End address of region 13, offset: 0x6CC */\r\n  __IO uint32_t IPEDCTX13AAD0;                     /**< IPED context13 AAD0, offset: 0x6D0 */\r\n  __IO uint32_t IPEDCTX13AAD1;                     /**< IPED context13 AAD1, offset: 0x6D4 */\r\n       uint8_t RESERVED_22[8];\r\n  __IO uint32_t IPEDCTX14IV0;                      /**< IPED context14 IV0, offset: 0x6E0 */\r\n  __IO uint32_t IPEDCTX14IV1;                      /**< IPED context14 IV1, offset: 0x6E4 */\r\n  __IO uint32_t IPEDCTX14START;                    /**< Start address of region 14, offset: 0x6E8 */\r\n  __IO uint32_t IPEDCTX14END;                      /**< End address of region 14, offset: 0x6EC */\r\n  __IO uint32_t IPEDCTX14AAD0;                     /**< IPED context14 AAD0, offset: 0x6F0 */\r\n  __IO uint32_t IPEDCTX14AAD1;                     /**< IPED context14 AAD1, offset: 0x6F4 */\r\n} FLEXSPI_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- FLEXSPI Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup FLEXSPI_Register_Masks FLEXSPI Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name MCR0 - Module Control Register 0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_MCR0_SWRESET_MASK                (0x1U)\r\n#define FLEXSPI_MCR0_SWRESET_SHIFT               (0U)\r\n/*! SWRESET - Software Reset */\r\n#define FLEXSPI_MCR0_SWRESET(x)                  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_SWRESET_SHIFT)) & FLEXSPI_MCR0_SWRESET_MASK)\r\n\r\n#define FLEXSPI_MCR0_MDIS_MASK                   (0x2U)\r\n#define FLEXSPI_MCR0_MDIS_SHIFT                  (1U)\r\n/*! MDIS - Module Disable */\r\n#define FLEXSPI_MCR0_MDIS(x)                     (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_MDIS_SHIFT)) & FLEXSPI_MCR0_MDIS_MASK)\r\n\r\n#define FLEXSPI_MCR0_RXCLKSRC_MASK               (0x30U)\r\n#define FLEXSPI_MCR0_RXCLKSRC_SHIFT              (4U)\r\n/*! RXCLKSRC - Sample Clock source selection for Flash Reading\r\n *  0b00..Dummy Read strobe generated by FlexSPI Controller and loopback internally.\r\n *  0b01..Dummy Read strobe generated by FlexSPI Controller and loopback from DQS pad.\r\n *  0b10..Reserved\r\n *  0b11..Flash provided Read strobe and input from DQS pad\r\n */\r\n#define FLEXSPI_MCR0_RXCLKSRC(x)                 (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_RXCLKSRC_SHIFT)) & FLEXSPI_MCR0_RXCLKSRC_MASK)\r\n\r\n#define FLEXSPI_MCR0_ARDFEN_MASK                 (0x40U)\r\n#define FLEXSPI_MCR0_ARDFEN_SHIFT                (6U)\r\n/*! ARDFEN - Enable AHB bus Read Access to IP RX FIFO.\r\n *  0b0..IP RX FIFO should be read by IP Bus. AHB Bus read access to IP RX FIFO memory space will get bus error response.\r\n *  0b1..IP RX FIFO should be read by AHB Bus. IP Bus read access to IP RX FIFO memory space will always return data zero but no bus error response.\r\n */\r\n#define FLEXSPI_MCR0_ARDFEN(x)                   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_ARDFEN_SHIFT)) & FLEXSPI_MCR0_ARDFEN_MASK)\r\n\r\n#define FLEXSPI_MCR0_ATDFEN_MASK                 (0x80U)\r\n#define FLEXSPI_MCR0_ATDFEN_SHIFT                (7U)\r\n/*! ATDFEN - Enable AHB bus Write Access to IP TX FIFO.\r\n *  0b0..IP TX FIFO should be written by IP Bus. AHB Bus write access to IP TX FIFO memory space will get bus error response.\r\n *  0b1..IP TX FIFO should be written by AHB Bus. IP Bus write access to IP TX FIFO memory space will be ignored but no bus error response.\r\n */\r\n#define FLEXSPI_MCR0_ATDFEN(x)                   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_ATDFEN_SHIFT)) & FLEXSPI_MCR0_ATDFEN_MASK)\r\n\r\n#define FLEXSPI_MCR0_SERCLKDIV_MASK              (0x700U)\r\n#define FLEXSPI_MCR0_SERCLKDIV_SHIFT             (8U)\r\n/*! SERCLKDIV - Serial root clock\r\n *  0b000..Divided by 1\r\n *  0b001..Divided by 2\r\n *  0b010..Divided by 3\r\n *  0b011..Divided by 4\r\n *  0b100..Divided by 5\r\n *  0b101..Divided by 6\r\n *  0b110..Divided by 7\r\n *  0b111..Divided by 8\r\n */\r\n#define FLEXSPI_MCR0_SERCLKDIV(x)                (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_SERCLKDIV_SHIFT)) & FLEXSPI_MCR0_SERCLKDIV_MASK)\r\n\r\n#define FLEXSPI_MCR0_HSEN_MASK                   (0x800U)\r\n#define FLEXSPI_MCR0_HSEN_SHIFT                  (11U)\r\n/*! HSEN - Half Speed Serial Flash access Enable.\r\n *  0b0..Disable divide by 2 of serial flash clock for half speed commands.\r\n *  0b1..Enable divide by 2 of serial flash clock for half speed commands.\r\n */\r\n#define FLEXSPI_MCR0_HSEN(x)                     (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_HSEN_SHIFT)) & FLEXSPI_MCR0_HSEN_MASK)\r\n\r\n#define FLEXSPI_MCR0_DOZEEN_MASK                 (0x1000U)\r\n#define FLEXSPI_MCR0_DOZEEN_SHIFT                (12U)\r\n/*! DOZEEN - Doze mode enable bit\r\n *  0b0..Doze mode support disabled. AHB clock and serial clock will not be gated off when there is doze mode request from system.\r\n *  0b1..Doze mode support enabled. AHB clock and serial clock will be gated off when there is doze mode request from system.\r\n */\r\n#define FLEXSPI_MCR0_DOZEEN(x)                   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_DOZEEN_SHIFT)) & FLEXSPI_MCR0_DOZEEN_MASK)\r\n\r\n#define FLEXSPI_MCR0_COMBINATIONEN_MASK          (0x2000U)\r\n#define FLEXSPI_MCR0_COMBINATIONEN_SHIFT         (13U)\r\n/*! COMBINATIONEN - This bit is to support Flash Octal mode access by combining Port A and B Data\r\n *    pins (A_DATA[3:0] and B_DATA[3:0]), when Port A and Port B are of 4 bit data width.\r\n *  0b0..Disable.\r\n *  0b1..Enable.\r\n */\r\n#define FLEXSPI_MCR0_COMBINATIONEN(x)            (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_COMBINATIONEN_SHIFT)) & FLEXSPI_MCR0_COMBINATIONEN_MASK)\r\n\r\n#define FLEXSPI_MCR0_SCKFREERUNEN_MASK           (0x4000U)\r\n#define FLEXSPI_MCR0_SCKFREERUNEN_SHIFT          (14U)\r\n/*! SCKFREERUNEN - This bit is used to force SCLK output free-running. For FPGA applications,\r\n *    external device may use SCLK as reference clock to its internal PLL.\r\n *  0b0..Disable.\r\n *  0b1..Enable.\r\n */\r\n#define FLEXSPI_MCR0_SCKFREERUNEN(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_SCKFREERUNEN_SHIFT)) & FLEXSPI_MCR0_SCKFREERUNEN_MASK)\r\n\r\n#define FLEXSPI_MCR0_LEARNEN_MASK                (0x8000U)\r\n#define FLEXSPI_MCR0_LEARNEN_SHIFT               (15U)\r\n/*! LEARNEN - This bit is used to enable/disable data learning feature. When data learning is\r\n *    disabled, the sampling clock phase 0 is always used for RX data sampling even if LEARN instruction\r\n *    is correctly executed.\r\n *  0b0..Disable.\r\n *  0b1..Enable.\r\n */\r\n#define FLEXSPI_MCR0_LEARNEN(x)                  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_LEARNEN_SHIFT)) & FLEXSPI_MCR0_LEARNEN_MASK)\r\n\r\n#define FLEXSPI_MCR0_IPGRANTWAIT_MASK            (0xFF0000U)\r\n#define FLEXSPI_MCR0_IPGRANTWAIT_SHIFT           (16U)\r\n/*! IPGRANTWAIT - Timeout wait cycle for IP command grant. */\r\n#define FLEXSPI_MCR0_IPGRANTWAIT(x)              (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_IPGRANTWAIT_SHIFT)) & FLEXSPI_MCR0_IPGRANTWAIT_MASK)\r\n\r\n#define FLEXSPI_MCR0_AHBGRANTWAIT_MASK           (0xFF000000U)\r\n#define FLEXSPI_MCR0_AHBGRANTWAIT_SHIFT          (24U)\r\n/*! AHBGRANTWAIT - Timeout wait cycle for AHB command grant. */\r\n#define FLEXSPI_MCR0_AHBGRANTWAIT(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR0_AHBGRANTWAIT_SHIFT)) & FLEXSPI_MCR0_AHBGRANTWAIT_MASK)\r\n/*! @} */\r\n\r\n/*! @name MCR1 - Module Control Register 1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_MCR1_AHBBUSWAIT_MASK             (0xFFFFU)\r\n#define FLEXSPI_MCR1_AHBBUSWAIT_SHIFT            (0U)\r\n/*! AHBBUSWAIT - AHB Bus wait */\r\n#define FLEXSPI_MCR1_AHBBUSWAIT(x)               (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR1_AHBBUSWAIT_SHIFT)) & FLEXSPI_MCR1_AHBBUSWAIT_MASK)\r\n\r\n#define FLEXSPI_MCR1_SEQWAIT_MASK                (0xFFFF0000U)\r\n#define FLEXSPI_MCR1_SEQWAIT_SHIFT               (16U)\r\n/*! SEQWAIT - Command Sequence Execution will timeout and abort after SEQWAIT * 1024 Serial Root\r\n *    Clock cycles. When sequence execution timeout occurs, there will be an interrupt generated\r\n *    (INTR[SEQTIMEOUT]) if this interrupt is enabled (INTEN[SEQTIMEOUTEN] is set 0x1) and AHB command is\r\n *    ignored by arbitrator.\r\n */\r\n#define FLEXSPI_MCR1_SEQWAIT(x)                  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR1_SEQWAIT_SHIFT)) & FLEXSPI_MCR1_SEQWAIT_MASK)\r\n/*! @} */\r\n\r\n/*! @name MCR2 - Module Control Register 2 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_MCR2_CLRAHBBUFOPT_MASK           (0x800U)\r\n#define FLEXSPI_MCR2_CLRAHBBUFOPT_SHIFT          (11U)\r\n/*! CLRAHBBUFOPT - Clear AHB buffer\r\n *  0b0..AHB RX/TX Buffer will not be cleaned automatically when FlexSPI return Stop mode ACK.\r\n *  0b1..AHB RX/TX Buffer will be cleaned automatically when FlexSPI return Stop mode ACK.\r\n */\r\n#define FLEXSPI_MCR2_CLRAHBBUFOPT(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_CLRAHBBUFOPT_SHIFT)) & FLEXSPI_MCR2_CLRAHBBUFOPT_MASK)\r\n\r\n#define FLEXSPI_MCR2_CLRLEARNPHASE_MASK          (0x4000U)\r\n#define FLEXSPI_MCR2_CLRLEARNPHASE_SHIFT         (14U)\r\n/*! CLRLEARNPHASE - The sampling clock phase selection will be reset to phase 0 when this bit is\r\n *    written with 0x1. This bit will be auto-cleared immediately.\r\n */\r\n#define FLEXSPI_MCR2_CLRLEARNPHASE(x)            (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_CLRLEARNPHASE_SHIFT)) & FLEXSPI_MCR2_CLRLEARNPHASE_MASK)\r\n\r\n#define FLEXSPI_MCR2_SAMEDEVICEEN_MASK           (0x8000U)\r\n#define FLEXSPI_MCR2_SAMEDEVICEEN_SHIFT          (15U)\r\n/*! SAMEDEVICEEN - All external devices are same devices (both in types and size) for A1/A2/B1/B2.\r\n *  0b0..In Individual mode, FLSHA1CRx/FLSHA2CRx/FLSHB1CRx/FLSHB2CRx register setting will be applied to Flash A1/A2/B1/B2 separately. Disabled.\r\n *  0b1..FLSHA1CR0/FLSHA1CR1/FLSHA1CR2 register settings will be applied to Flash A1/A2/B1/B2. FLSHA2CRx/FLSHB1CRx/FLSHB2CRx will be ignored.\r\n */\r\n#define FLEXSPI_MCR2_SAMEDEVICEEN(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_SAMEDEVICEEN_SHIFT)) & FLEXSPI_MCR2_SAMEDEVICEEN_MASK)\r\n\r\n#define FLEXSPI_MCR2_SCKBDIFFOPT_MASK            (0x80000U)\r\n#define FLEXSPI_MCR2_SCKBDIFFOPT_SHIFT           (19U)\r\n/*! SCKBDIFFOPT - B_SCLK pad can be used as A_SCLK differential clock output (inverted clock to\r\n *    A_SCLK). In this case, port B flash access is not available. After changing the value of this\r\n *    field, MCR0[SWRESET] should be set.\r\n *  0b1..B_SCLK pad is used as port A SCLK inverted clock output (Differential clock to A_SCLK). Port B flash access is not available.\r\n *  0b0..B_SCLK pad is used as port B SCLK clock output. Port B flash access is available.\r\n */\r\n#define FLEXSPI_MCR2_SCKBDIFFOPT(x)              (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_SCKBDIFFOPT_SHIFT)) & FLEXSPI_MCR2_SCKBDIFFOPT_MASK)\r\n\r\n#define FLEXSPI_MCR2_RXCLKSRC_B_MASK             (0x600000U)\r\n#define FLEXSPI_MCR2_RXCLKSRC_B_SHIFT            (21U)\r\n/*! RXCLKSRC_B - Sample Clock source selection for Flash Reading\r\n *  0b00..Dummy Read strobe generated by FlexSPI Controller and loopback internally.\r\n *  0b01..Dummy Read strobe generated by FlexSPI Controller and loopback from DQS pad.\r\n *  0b10..SCLK output clock and loopback from SCLK padReserved\r\n *  0b11..Flash provided Read strobe and input from DQS pad\r\n */\r\n#define FLEXSPI_MCR2_RXCLKSRC_B(x)               (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_RXCLKSRC_B_SHIFT)) & FLEXSPI_MCR2_RXCLKSRC_B_MASK)\r\n\r\n#define FLEXSPI_MCR2_RX_CLK_SRC_DIFF_MASK        (0x800000U)\r\n#define FLEXSPI_MCR2_RX_CLK_SRC_DIFF_SHIFT       (23U)\r\n/*! RX_CLK_SRC_DIFF - Sample Clock source or source_b selection for Flash Reading */\r\n#define FLEXSPI_MCR2_RX_CLK_SRC_DIFF(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_RX_CLK_SRC_DIFF_SHIFT)) & FLEXSPI_MCR2_RX_CLK_SRC_DIFF_MASK)\r\n\r\n#define FLEXSPI_MCR2_RESUMEWAIT_MASK             (0xFF000000U)\r\n#define FLEXSPI_MCR2_RESUMEWAIT_SHIFT            (24U)\r\n/*! RESUMEWAIT - Wait cycle (in AHB clock cycle) for idle state before suspended command sequence resumed. */\r\n#define FLEXSPI_MCR2_RESUMEWAIT(x)               (((uint32_t)(((uint32_t)(x)) << FLEXSPI_MCR2_RESUMEWAIT_SHIFT)) & FLEXSPI_MCR2_RESUMEWAIT_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHBCR - AHB Bus Control Register */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_AHBCR_CLRAHBRXBUF_MASK           (0x2U)\r\n#define FLEXSPI_AHBCR_CLRAHBRXBUF_SHIFT          (1U)\r\n/*! CLRAHBRXBUF - Clear the status/pointers of AHB RX Buffer. Auto-cleared. */\r\n#define FLEXSPI_AHBCR_CLRAHBRXBUF(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_CLRAHBRXBUF_SHIFT)) & FLEXSPI_AHBCR_CLRAHBRXBUF_MASK)\r\n\r\n#define FLEXSPI_AHBCR_CLRAHBTXBUF_MASK           (0x4U)\r\n#define FLEXSPI_AHBCR_CLRAHBTXBUF_SHIFT          (2U)\r\n/*! CLRAHBTXBUF - Clear the status/pointers of AHB TX Buffer. Auto-cleared. */\r\n#define FLEXSPI_AHBCR_CLRAHBTXBUF(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_CLRAHBTXBUF_SHIFT)) & FLEXSPI_AHBCR_CLRAHBTXBUF_MASK)\r\n\r\n#define FLEXSPI_AHBCR_CACHABLEEN_MASK            (0x8U)\r\n#define FLEXSPI_AHBCR_CACHABLEEN_SHIFT           (3U)\r\n/*! CACHABLEEN - Enable AHB bus cachable read access support.\r\n *  0b0..Disabled. When there is AHB bus cachable read access, FlexSPI will not check whether it hit AHB TX Buffer.\r\n *  0b1..Enabled. When there is AHB bus cachable read access, FlexSPI will check whether it hit AHB TX Buffer first.\r\n */\r\n#define FLEXSPI_AHBCR_CACHABLEEN(x)              (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_CACHABLEEN_SHIFT)) & FLEXSPI_AHBCR_CACHABLEEN_MASK)\r\n\r\n#define FLEXSPI_AHBCR_BUFFERABLEEN_MASK          (0x10U)\r\n#define FLEXSPI_AHBCR_BUFFERABLEEN_SHIFT         (4U)\r\n/*! BUFFERABLEEN - Enable AHB bus bufferable write access support.\r\n *  0b0..Disabled. For all AHB write access (no matter bufferable or non-bufferable ), FlexSPI will return AHB Bus\r\n *       ready after all data is transmitted to External device and AHB command finished.\r\n *  0b1..Enabled. For AHB bufferable write access, FlexSPI will return AHB Bus ready when the AHB command is\r\n *       granted by arbitrator and will not wait for AHB command finished.\r\n */\r\n#define FLEXSPI_AHBCR_BUFFERABLEEN(x)            (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_BUFFERABLEEN_SHIFT)) & FLEXSPI_AHBCR_BUFFERABLEEN_MASK)\r\n\r\n#define FLEXSPI_AHBCR_PREFETCHEN_MASK            (0x20U)\r\n#define FLEXSPI_AHBCR_PREFETCHEN_SHIFT           (5U)\r\n/*! PREFETCHEN - AHB Read Prefetch Enable. */\r\n#define FLEXSPI_AHBCR_PREFETCHEN(x)              (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_PREFETCHEN_SHIFT)) & FLEXSPI_AHBCR_PREFETCHEN_MASK)\r\n\r\n#define FLEXSPI_AHBCR_READADDROPT_MASK           (0x40U)\r\n#define FLEXSPI_AHBCR_READADDROPT_SHIFT          (6U)\r\n/*! READADDROPT - AHB Read Address option bit. This option bit is intend to remove AHB burst start address alignment limitation.\r\n *  0b0..There is AHB read burst start address alignment limitation when flash is accessed in flash is word-addressable.\r\n *  0b1..There is no AHB read burst start address alignment limitation. FlexSPI will fetch more data than AHB\r\n *       burst required to meet the alignment requirement.\r\n */\r\n#define FLEXSPI_AHBCR_READADDROPT(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_READADDROPT_SHIFT)) & FLEXSPI_AHBCR_READADDROPT_MASK)\r\n\r\n#define FLEXSPI_AHBCR_READSZALIGN_MASK           (0x400U)\r\n#define FLEXSPI_AHBCR_READSZALIGN_SHIFT          (10U)\r\n/*! READSZALIGN - AHB Read Size Alignment\r\n *  0b0..AHB read size will be decided by other register setting like PREFETCH_EN\r\n *  0b1..AHB read size to up size to 8 bytes aligned, no prefetching\r\n */\r\n#define FLEXSPI_AHBCR_READSZALIGN(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_READSZALIGN_SHIFT)) & FLEXSPI_AHBCR_READSZALIGN_MASK)\r\n\r\n#define FLEXSPI_AHBCR_ALIGNMENT_MASK             (0x300000U)\r\n#define FLEXSPI_AHBCR_ALIGNMENT_SHIFT            (20U)\r\n/*! ALIGNMENT - Decides all AHB read/write boundary. All access cross the boundary will be divided into smaller sub accesses.\r\n *  0b00..No limit\r\n *  0b01..1 KBytes\r\n *  0b10..512 Bytes\r\n *  0b11..256 Bytes\r\n */\r\n#define FLEXSPI_AHBCR_ALIGNMENT(x)               (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBCR_ALIGNMENT_SHIFT)) & FLEXSPI_AHBCR_ALIGNMENT_MASK)\r\n/*! @} */\r\n\r\n/*! @name INTEN - Interrupt Enable Register */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_INTEN_IPCMDDONEEN_MASK           (0x1U)\r\n#define FLEXSPI_INTEN_IPCMDDONEEN_SHIFT          (0U)\r\n/*! IPCMDDONEEN - IP triggered Command Sequences Execution finished interrupt enable. */\r\n#define FLEXSPI_INTEN_IPCMDDONEEN(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_IPCMDDONEEN_SHIFT)) & FLEXSPI_INTEN_IPCMDDONEEN_MASK)\r\n\r\n#define FLEXSPI_INTEN_IPCMDGEEN_MASK             (0x2U)\r\n#define FLEXSPI_INTEN_IPCMDGEEN_SHIFT            (1U)\r\n/*! IPCMDGEEN - IP triggered Command Sequences Grant Timeout interrupt enable. */\r\n#define FLEXSPI_INTEN_IPCMDGEEN(x)               (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_IPCMDGEEN_SHIFT)) & FLEXSPI_INTEN_IPCMDGEEN_MASK)\r\n\r\n#define FLEXSPI_INTEN_AHBCMDGEEN_MASK            (0x4U)\r\n#define FLEXSPI_INTEN_AHBCMDGEEN_SHIFT           (2U)\r\n/*! AHBCMDGEEN - AHB triggered Command Sequences Grant Timeout interrupt enable. */\r\n#define FLEXSPI_INTEN_AHBCMDGEEN(x)              (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_AHBCMDGEEN_SHIFT)) & FLEXSPI_INTEN_AHBCMDGEEN_MASK)\r\n\r\n#define FLEXSPI_INTEN_IPCMDERREN_MASK            (0x8U)\r\n#define FLEXSPI_INTEN_IPCMDERREN_SHIFT           (3U)\r\n/*! IPCMDERREN - IP triggered Command Sequences Error Detected interrupt enable. */\r\n#define FLEXSPI_INTEN_IPCMDERREN(x)              (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_IPCMDERREN_SHIFT)) & FLEXSPI_INTEN_IPCMDERREN_MASK)\r\n\r\n#define FLEXSPI_INTEN_AHBCMDERREN_MASK           (0x10U)\r\n#define FLEXSPI_INTEN_AHBCMDERREN_SHIFT          (4U)\r\n/*! AHBCMDERREN - AHB triggered Command Sequences Error Detected interrupt enable. */\r\n#define FLEXSPI_INTEN_AHBCMDERREN(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_AHBCMDERREN_SHIFT)) & FLEXSPI_INTEN_AHBCMDERREN_MASK)\r\n\r\n#define FLEXSPI_INTEN_IPRXWAEN_MASK              (0x20U)\r\n#define FLEXSPI_INTEN_IPRXWAEN_SHIFT             (5U)\r\n/*! IPRXWAEN - IP RX FIFO WaterMark available interrupt enable. */\r\n#define FLEXSPI_INTEN_IPRXWAEN(x)                (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_IPRXWAEN_SHIFT)) & FLEXSPI_INTEN_IPRXWAEN_MASK)\r\n\r\n#define FLEXSPI_INTEN_IPTXWEEN_MASK              (0x40U)\r\n#define FLEXSPI_INTEN_IPTXWEEN_SHIFT             (6U)\r\n/*! IPTXWEEN - IP TX FIFO WaterMark empty interrupt enable. */\r\n#define FLEXSPI_INTEN_IPTXWEEN(x)                (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_IPTXWEEN_SHIFT)) & FLEXSPI_INTEN_IPTXWEEN_MASK)\r\n\r\n#define FLEXSPI_INTEN_DATALEARNFAILEN_MASK       (0x80U)\r\n#define FLEXSPI_INTEN_DATALEARNFAILEN_SHIFT      (7U)\r\n/*! DATALEARNFAILEN - Data Learning failed interrupt enable. */\r\n#define FLEXSPI_INTEN_DATALEARNFAILEN(x)         (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_DATALEARNFAILEN_SHIFT)) & FLEXSPI_INTEN_DATALEARNFAILEN_MASK)\r\n\r\n#define FLEXSPI_INTEN_SCKSTOPBYRDEN_MASK         (0x100U)\r\n#define FLEXSPI_INTEN_SCKSTOPBYRDEN_SHIFT        (8U)\r\n/*! SCKSTOPBYRDEN - SCLK is stopped during command sequence because Async RX FIFO full interrupt enable. */\r\n#define FLEXSPI_INTEN_SCKSTOPBYRDEN(x)           (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_SCKSTOPBYRDEN_SHIFT)) & FLEXSPI_INTEN_SCKSTOPBYRDEN_MASK)\r\n\r\n#define FLEXSPI_INTEN_SCKSTOPBYWREN_MASK         (0x200U)\r\n#define FLEXSPI_INTEN_SCKSTOPBYWREN_SHIFT        (9U)\r\n/*! SCKSTOPBYWREN - SCLK is stopped during command sequence because Async TX FIFO empty interrupt enable. */\r\n#define FLEXSPI_INTEN_SCKSTOPBYWREN(x)           (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_SCKSTOPBYWREN_SHIFT)) & FLEXSPI_INTEN_SCKSTOPBYWREN_MASK)\r\n\r\n#define FLEXSPI_INTEN_AHBBUSTIMEOUTEN_MASK       (0x400U)\r\n#define FLEXSPI_INTEN_AHBBUSTIMEOUTEN_SHIFT      (10U)\r\n/*! AHBBUSTIMEOUTEN - AHB Bus timeout interrupt. */\r\n#define FLEXSPI_INTEN_AHBBUSTIMEOUTEN(x)         (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_AHBBUSTIMEOUTEN_SHIFT)) & FLEXSPI_INTEN_AHBBUSTIMEOUTEN_MASK)\r\n\r\n#define FLEXSPI_INTEN_SEQTIMEOUTEN_MASK          (0x800U)\r\n#define FLEXSPI_INTEN_SEQTIMEOUTEN_SHIFT         (11U)\r\n/*! SEQTIMEOUTEN - Sequence execution timeout interrupt enable. */\r\n#define FLEXSPI_INTEN_SEQTIMEOUTEN(x)            (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_SEQTIMEOUTEN_SHIFT)) & FLEXSPI_INTEN_SEQTIMEOUTEN_MASK)\r\n\r\n#define FLEXSPI_INTEN_IPCMDSECUREVIOEN_MASK      (0x10000U)\r\n#define FLEXSPI_INTEN_IPCMDSECUREVIOEN_SHIFT     (16U)\r\n/*! IPCMDSECUREVIOEN - IP command security violation interrupt enable. */\r\n#define FLEXSPI_INTEN_IPCMDSECUREVIOEN(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_IPCMDSECUREVIOEN_SHIFT)) & FLEXSPI_INTEN_IPCMDSECUREVIOEN_MASK)\r\n\r\n#define FLEXSPI_INTEN_AHBGCMERREN_MASK           (0x20000U)\r\n#define FLEXSPI_INTEN_AHBGCMERREN_SHIFT          (17U)\r\n/*! AHBGCMERREN - AHB read gcm error interrupt enable. */\r\n#define FLEXSPI_INTEN_AHBGCMERREN(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTEN_AHBGCMERREN_SHIFT)) & FLEXSPI_INTEN_AHBGCMERREN_MASK)\r\n/*! @} */\r\n\r\n/*! @name INTR - Interrupt Register */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_INTR_IPCMDDONE_MASK              (0x1U)\r\n#define FLEXSPI_INTR_IPCMDDONE_SHIFT             (0U)\r\n/*! IPCMDDONE - IP triggered Command Sequences Execution finished interrupt. This interrupt is also\r\n *    generated when there is IPCMDGE or IPCMDERR interrupt generated.\r\n */\r\n#define FLEXSPI_INTR_IPCMDDONE(x)                (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_IPCMDDONE_SHIFT)) & FLEXSPI_INTR_IPCMDDONE_MASK)\r\n\r\n#define FLEXSPI_INTR_IPCMDGE_MASK                (0x2U)\r\n#define FLEXSPI_INTR_IPCMDGE_SHIFT               (1U)\r\n/*! IPCMDGE - IP triggered Command Sequences Grant Timeout interrupt. */\r\n#define FLEXSPI_INTR_IPCMDGE(x)                  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_IPCMDGE_SHIFT)) & FLEXSPI_INTR_IPCMDGE_MASK)\r\n\r\n#define FLEXSPI_INTR_AHBCMDGE_MASK               (0x4U)\r\n#define FLEXSPI_INTR_AHBCMDGE_SHIFT              (2U)\r\n/*! AHBCMDGE - AHB triggered Command Sequences Grant Timeout interrupt. */\r\n#define FLEXSPI_INTR_AHBCMDGE(x)                 (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_AHBCMDGE_SHIFT)) & FLEXSPI_INTR_AHBCMDGE_MASK)\r\n\r\n#define FLEXSPI_INTR_IPCMDERR_MASK               (0x8U)\r\n#define FLEXSPI_INTR_IPCMDERR_SHIFT              (3U)\r\n/*! IPCMDERR - IP triggered Command Sequences Error Detected interrupt. When an error detected for\r\n *    IP command, this command will be ignored and not executed at all.\r\n */\r\n#define FLEXSPI_INTR_IPCMDERR(x)                 (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_IPCMDERR_SHIFT)) & FLEXSPI_INTR_IPCMDERR_MASK)\r\n\r\n#define FLEXSPI_INTR_AHBCMDERR_MASK              (0x10U)\r\n#define FLEXSPI_INTR_AHBCMDERR_SHIFT             (4U)\r\n/*! AHBCMDERR - AHB triggered Command Sequences Error Detected interrupt. When an error detected for\r\n *    AHB command, this command will be ignored and not executed at all.\r\n */\r\n#define FLEXSPI_INTR_AHBCMDERR(x)                (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_AHBCMDERR_SHIFT)) & FLEXSPI_INTR_AHBCMDERR_MASK)\r\n\r\n#define FLEXSPI_INTR_IPRXWA_MASK                 (0x20U)\r\n#define FLEXSPI_INTR_IPRXWA_SHIFT                (5U)\r\n/*! IPRXWA - IP RX FIFO watermark available interrupt. */\r\n#define FLEXSPI_INTR_IPRXWA(x)                   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_IPRXWA_SHIFT)) & FLEXSPI_INTR_IPRXWA_MASK)\r\n\r\n#define FLEXSPI_INTR_IPTXWE_MASK                 (0x40U)\r\n#define FLEXSPI_INTR_IPTXWE_SHIFT                (6U)\r\n/*! IPTXWE - IP TX FIFO watermark empty interrupt. */\r\n#define FLEXSPI_INTR_IPTXWE(x)                   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_IPTXWE_SHIFT)) & FLEXSPI_INTR_IPTXWE_MASK)\r\n\r\n#define FLEXSPI_INTR_DATALEARNFAIL_MASK          (0x80U)\r\n#define FLEXSPI_INTR_DATALEARNFAIL_SHIFT         (7U)\r\n/*! DATALEARNFAIL - Data Learning failed interrupt. */\r\n#define FLEXSPI_INTR_DATALEARNFAIL(x)            (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_DATALEARNFAIL_SHIFT)) & FLEXSPI_INTR_DATALEARNFAIL_MASK)\r\n\r\n#define FLEXSPI_INTR_SCKSTOPBYRD_MASK            (0x100U)\r\n#define FLEXSPI_INTR_SCKSTOPBYRD_SHIFT           (8U)\r\n/*! SCKSTOPBYRD - SCLK is stopped during command sequence because Async RX FIFO full interrupt. */\r\n#define FLEXSPI_INTR_SCKSTOPBYRD(x)              (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_SCKSTOPBYRD_SHIFT)) & FLEXSPI_INTR_SCKSTOPBYRD_MASK)\r\n\r\n#define FLEXSPI_INTR_SCKSTOPBYWR_MASK            (0x200U)\r\n#define FLEXSPI_INTR_SCKSTOPBYWR_SHIFT           (9U)\r\n/*! SCKSTOPBYWR - SCLK is stopped during command sequence because Async TX FIFO empty interrupt. */\r\n#define FLEXSPI_INTR_SCKSTOPBYWR(x)              (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_SCKSTOPBYWR_SHIFT)) & FLEXSPI_INTR_SCKSTOPBYWR_MASK)\r\n\r\n#define FLEXSPI_INTR_AHBBUSTIMEOUT_MASK          (0x400U)\r\n#define FLEXSPI_INTR_AHBBUSTIMEOUT_SHIFT         (10U)\r\n/*! AHBBUSTIMEOUT - AHB Bus timeout interrupt. */\r\n#define FLEXSPI_INTR_AHBBUSTIMEOUT(x)            (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_AHBBUSTIMEOUT_SHIFT)) & FLEXSPI_INTR_AHBBUSTIMEOUT_MASK)\r\n\r\n#define FLEXSPI_INTR_SEQTIMEOUT_MASK             (0x800U)\r\n#define FLEXSPI_INTR_SEQTIMEOUT_SHIFT            (11U)\r\n/*! SEQTIMEOUT - Sequence execution timeout interrupt. */\r\n#define FLEXSPI_INTR_SEQTIMEOUT(x)               (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_SEQTIMEOUT_SHIFT)) & FLEXSPI_INTR_SEQTIMEOUT_MASK)\r\n\r\n#define FLEXSPI_INTR_IPCMDSECUREVIO_MASK         (0x10000U)\r\n#define FLEXSPI_INTR_IPCMDSECUREVIO_SHIFT        (16U)\r\n/*! IPCMDSECUREVIO - IP command security violation interrupt. */\r\n#define FLEXSPI_INTR_IPCMDSECUREVIO(x)           (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_IPCMDSECUREVIO_SHIFT)) & FLEXSPI_INTR_IPCMDSECUREVIO_MASK)\r\n\r\n#define FLEXSPI_INTR_AHBGCMERR_MASK              (0x20000U)\r\n#define FLEXSPI_INTR_AHBGCMERR_SHIFT             (17U)\r\n/*! AHBGCMERR - AHB read gcm error interrupt. */\r\n#define FLEXSPI_INTR_AHBGCMERR(x)                (((uint32_t)(((uint32_t)(x)) << FLEXSPI_INTR_AHBGCMERR_SHIFT)) & FLEXSPI_INTR_AHBGCMERR_MASK)\r\n/*! @} */\r\n\r\n/*! @name LUTKEY - LUT Key Register */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_LUTKEY_KEY_MASK                  (0xFFFFFFFFU)\r\n#define FLEXSPI_LUTKEY_KEY_SHIFT                 (0U)\r\n/*! KEY - The Key to lock or unlock LUT. */\r\n#define FLEXSPI_LUTKEY_KEY(x)                    (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUTKEY_KEY_SHIFT)) & FLEXSPI_LUTKEY_KEY_MASK)\r\n/*! @} */\r\n\r\n/*! @name LUTCR - LUT Control Register */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_LUTCR_LOCK_MASK                  (0x1U)\r\n#define FLEXSPI_LUTCR_LOCK_SHIFT                 (0U)\r\n/*! LOCK - Lock LUT */\r\n#define FLEXSPI_LUTCR_LOCK(x)                    (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUTCR_LOCK_SHIFT)) & FLEXSPI_LUTCR_LOCK_MASK)\r\n\r\n#define FLEXSPI_LUTCR_UNLOCK_MASK                (0x2U)\r\n#define FLEXSPI_LUTCR_UNLOCK_SHIFT               (1U)\r\n/*! UNLOCK - Unlock LUT */\r\n#define FLEXSPI_LUTCR_UNLOCK(x)                  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUTCR_UNLOCK_SHIFT)) & FLEXSPI_LUTCR_UNLOCK_MASK)\r\n\r\n#define FLEXSPI_LUTCR_PROTECT_MASK               (0x4U)\r\n#define FLEXSPI_LUTCR_PROTECT_SHIFT              (2U)\r\n/*! PROTECT - LUT protection */\r\n#define FLEXSPI_LUTCR_PROTECT(x)                 (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUTCR_PROTECT_SHIFT)) & FLEXSPI_LUTCR_PROTECT_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHBRXBUFCR0 - AHB RX Buffer 0 Control Register 0..AHB RX Buffer 7 Control Register 0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_AHBRXBUFCR0_BUFSZ_MASK           (0xFFU)\r\n#define FLEXSPI_AHBRXBUFCR0_BUFSZ_SHIFT          (0U)\r\n/*! BUFSZ - AHB RX Buffer Size in 64 bits. */\r\n#define FLEXSPI_AHBRXBUFCR0_BUFSZ(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBRXBUFCR0_BUFSZ_SHIFT)) & FLEXSPI_AHBRXBUFCR0_BUFSZ_MASK)\r\n\r\n#define FLEXSPI_AHBRXBUFCR0_MSTRID_MASK          (0xF0000U)\r\n#define FLEXSPI_AHBRXBUFCR0_MSTRID_SHIFT         (16U)\r\n/*! MSTRID - This AHB RX Buffer is assigned according to AHB Master with ID (MSTR_ID). */\r\n#define FLEXSPI_AHBRXBUFCR0_MSTRID(x)            (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBRXBUFCR0_MSTRID_SHIFT)) & FLEXSPI_AHBRXBUFCR0_MSTRID_MASK)\r\n\r\n#define FLEXSPI_AHBRXBUFCR0_PRIORITY_MASK        (0x7000000U)\r\n#define FLEXSPI_AHBRXBUFCR0_PRIORITY_SHIFT       (24U)\r\n/*! PRIORITY - This priority for AHB Master Read which this AHB RX Buffer is assigned. 7 is the highest priority, 0 the lowest. */\r\n#define FLEXSPI_AHBRXBUFCR0_PRIORITY(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBRXBUFCR0_PRIORITY_SHIFT)) & FLEXSPI_AHBRXBUFCR0_PRIORITY_MASK)\r\n\r\n#define FLEXSPI_AHBRXBUFCR0_REGIONEN_MASK        (0x40000000U)\r\n#define FLEXSPI_AHBRXBUFCR0_REGIONEN_SHIFT       (30U)\r\n/*! REGIONEN - AHB RX Buffer address region funciton enable */\r\n#define FLEXSPI_AHBRXBUFCR0_REGIONEN(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBRXBUFCR0_REGIONEN_SHIFT)) & FLEXSPI_AHBRXBUFCR0_REGIONEN_MASK)\r\n\r\n#define FLEXSPI_AHBRXBUFCR0_PREFETCHEN_MASK      (0x80000000U)\r\n#define FLEXSPI_AHBRXBUFCR0_PREFETCHEN_SHIFT     (31U)\r\n/*! PREFETCHEN - AHB Read Prefetch Enable for current AHB RX Buffer corresponding Master. */\r\n#define FLEXSPI_AHBRXBUFCR0_PREFETCHEN(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBRXBUFCR0_PREFETCHEN_SHIFT)) & FLEXSPI_AHBRXBUFCR0_PREFETCHEN_MASK)\r\n/*! @} */\r\n\r\n/* The count of FLEXSPI_AHBRXBUFCR0 */\r\n#define FLEXSPI_AHBRXBUFCR0_COUNT                (8U)\r\n\r\n/*! @name FLSHCR0 - Flash Control Register 0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_FLSHCR0_FLSHSZ_MASK              (0x7FFFFFU)\r\n#define FLEXSPI_FLSHCR0_FLSHSZ_SHIFT             (0U)\r\n/*! FLSHSZ - Flash Size in KByte. */\r\n#define FLEXSPI_FLSHCR0_FLSHSZ(x)                (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR0_FLSHSZ_SHIFT)) & FLEXSPI_FLSHCR0_FLSHSZ_MASK)\r\n\r\n#define FLEXSPI_FLSHCR0_ADDRSHIFT_MASK           (0x20000000U)\r\n#define FLEXSPI_FLSHCR0_ADDRSHIFT_SHIFT          (29U)\r\n/*! ADDRSHIFT - AHB address shift function control.\r\n *  0b0..Disabled.\r\n *  0b1..Enabled.\r\n */\r\n#define FLEXSPI_FLSHCR0_ADDRSHIFT(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR0_ADDRSHIFT_SHIFT)) & FLEXSPI_FLSHCR0_ADDRSHIFT_MASK)\r\n\r\n#define FLEXSPI_FLSHCR0_SPLITWREN_MASK           (0x40000000U)\r\n#define FLEXSPI_FLSHCR0_SPLITWREN_SHIFT          (30U)\r\n/*! SPLITWREN - AHB write access split function control. */\r\n#define FLEXSPI_FLSHCR0_SPLITWREN(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR0_SPLITWREN_SHIFT)) & FLEXSPI_FLSHCR0_SPLITWREN_MASK)\r\n\r\n#define FLEXSPI_FLSHCR0_SPLITRDEN_MASK           (0x80000000U)\r\n#define FLEXSPI_FLSHCR0_SPLITRDEN_SHIFT          (31U)\r\n/*! SPLITRDEN - AHB read access split function control. */\r\n#define FLEXSPI_FLSHCR0_SPLITRDEN(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR0_SPLITRDEN_SHIFT)) & FLEXSPI_FLSHCR0_SPLITRDEN_MASK)\r\n/*! @} */\r\n\r\n/* The count of FLEXSPI_FLSHCR0 */\r\n#define FLEXSPI_FLSHCR0_COUNT                    (4U)\r\n\r\n/*! @name FLSHCR1 - Flash Control Register 1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_FLSHCR1_TCSS_MASK                (0x1FU)\r\n#define FLEXSPI_FLSHCR1_TCSS_SHIFT               (0U)\r\n/*! TCSS - Serial Flash CS setup time. */\r\n#define FLEXSPI_FLSHCR1_TCSS(x)                  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR1_TCSS_SHIFT)) & FLEXSPI_FLSHCR1_TCSS_MASK)\r\n\r\n#define FLEXSPI_FLSHCR1_TCSH_MASK                (0x3E0U)\r\n#define FLEXSPI_FLSHCR1_TCSH_SHIFT               (5U)\r\n/*! TCSH - Serial Flash CS Hold time. */\r\n#define FLEXSPI_FLSHCR1_TCSH(x)                  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR1_TCSH_SHIFT)) & FLEXSPI_FLSHCR1_TCSH_MASK)\r\n\r\n#define FLEXSPI_FLSHCR1_WA_MASK                  (0x400U)\r\n#define FLEXSPI_FLSHCR1_WA_SHIFT                 (10U)\r\n/*! WA - Word Addressable. */\r\n#define FLEXSPI_FLSHCR1_WA(x)                    (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR1_WA_SHIFT)) & FLEXSPI_FLSHCR1_WA_MASK)\r\n\r\n#define FLEXSPI_FLSHCR1_CAS_MASK                 (0x7800U)\r\n#define FLEXSPI_FLSHCR1_CAS_SHIFT                (11U)\r\n/*! CAS - Column Address Size. */\r\n#define FLEXSPI_FLSHCR1_CAS(x)                   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR1_CAS_SHIFT)) & FLEXSPI_FLSHCR1_CAS_MASK)\r\n\r\n#define FLEXSPI_FLSHCR1_CSINTERVALUNIT_MASK      (0x8000U)\r\n#define FLEXSPI_FLSHCR1_CSINTERVALUNIT_SHIFT     (15U)\r\n/*! CSINTERVALUNIT - CS interval unit\r\n *  0b0..The CS interval unit is 1 serial clock cycle\r\n *  0b1..The CS interval unit is 256 serial clock cycle\r\n */\r\n#define FLEXSPI_FLSHCR1_CSINTERVALUNIT(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR1_CSINTERVALUNIT_SHIFT)) & FLEXSPI_FLSHCR1_CSINTERVALUNIT_MASK)\r\n\r\n#define FLEXSPI_FLSHCR1_CSINTERVAL_MASK          (0xFFFF0000U)\r\n#define FLEXSPI_FLSHCR1_CSINTERVAL_SHIFT         (16U)\r\n/*! CSINTERVAL - This field is used to set the minimum interval between flash device Chip selection\r\n *    deassertion and flash device Chip selection assertion. If external flash has a limitation on\r\n *    the interval between command sequences, this field should be set accordingly. If there is no\r\n *    limitation, set this field with value 0x0.\r\n */\r\n#define FLEXSPI_FLSHCR1_CSINTERVAL(x)            (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR1_CSINTERVAL_SHIFT)) & FLEXSPI_FLSHCR1_CSINTERVAL_MASK)\r\n/*! @} */\r\n\r\n/* The count of FLEXSPI_FLSHCR1 */\r\n#define FLEXSPI_FLSHCR1_COUNT                    (4U)\r\n\r\n/*! @name FLSHCR2 - Flash Control Register 2 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_FLSHCR2_ARDSEQID_MASK            (0xFU)\r\n#define FLEXSPI_FLSHCR2_ARDSEQID_SHIFT           (0U)\r\n/*! ARDSEQID - Sequence Index for AHB Read triggered Command in LUT. */\r\n#define FLEXSPI_FLSHCR2_ARDSEQID(x)              (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_ARDSEQID_SHIFT)) & FLEXSPI_FLSHCR2_ARDSEQID_MASK)\r\n\r\n#define FLEXSPI_FLSHCR2_ARDSEQNUM_MASK           (0xE0U)\r\n#define FLEXSPI_FLSHCR2_ARDSEQNUM_SHIFT          (5U)\r\n/*! ARDSEQNUM - Sequence Number for AHB Read triggered Command in LUT. */\r\n#define FLEXSPI_FLSHCR2_ARDSEQNUM(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_ARDSEQNUM_SHIFT)) & FLEXSPI_FLSHCR2_ARDSEQNUM_MASK)\r\n\r\n#define FLEXSPI_FLSHCR2_AWRSEQID_MASK            (0xF00U)\r\n#define FLEXSPI_FLSHCR2_AWRSEQID_SHIFT           (8U)\r\n/*! AWRSEQID - Sequence Index for AHB Write triggered Command. */\r\n#define FLEXSPI_FLSHCR2_AWRSEQID(x)              (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_AWRSEQID_SHIFT)) & FLEXSPI_FLSHCR2_AWRSEQID_MASK)\r\n\r\n#define FLEXSPI_FLSHCR2_AWRSEQNUM_MASK           (0xE000U)\r\n#define FLEXSPI_FLSHCR2_AWRSEQNUM_SHIFT          (13U)\r\n/*! AWRSEQNUM - Sequence Number for AHB Write triggered Command. */\r\n#define FLEXSPI_FLSHCR2_AWRSEQNUM(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_AWRSEQNUM_SHIFT)) & FLEXSPI_FLSHCR2_AWRSEQNUM_MASK)\r\n\r\n#define FLEXSPI_FLSHCR2_AWRWAIT_MASK             (0xFFF0000U)\r\n#define FLEXSPI_FLSHCR2_AWRWAIT_SHIFT            (16U)\r\n/*! AWRWAIT - For certain devices (such as FPGA), it need some time to write data into internal\r\n *    memory after the command sequences finished on FlexSPI interface. If another Read command sequence\r\n *    comes before previous programming finished internally, the read data may be wrong. This field\r\n *    is used to hold AHB Bus ready for AHB write access to wait the programming finished in\r\n *    external device. Then there will be no AHB read command triggered before the programming finished in\r\n *    external device. The Wait cycle between AHB triggered command sequences finished on FlexSPI\r\n *    interface and AHB return Bus ready: AWRWAIT * AWRWAITUNIT\r\n */\r\n#define FLEXSPI_FLSHCR2_AWRWAIT(x)               (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_AWRWAIT_SHIFT)) & FLEXSPI_FLSHCR2_AWRWAIT_MASK)\r\n\r\n#define FLEXSPI_FLSHCR2_AWRWAITUNIT_MASK         (0x70000000U)\r\n#define FLEXSPI_FLSHCR2_AWRWAITUNIT_SHIFT        (28U)\r\n/*! AWRWAITUNIT - AWRWAIT unit\r\n *  0b000..The AWRWAIT unit is 2 ahb clock cycle\r\n *  0b001..The AWRWAIT unit is 8 ahb clock cycle\r\n *  0b010..The AWRWAIT unit is 32 ahb clock cycle\r\n *  0b011..The AWRWAIT unit is 128 ahb clock cycle\r\n *  0b100..The AWRWAIT unit is 512 ahb clock cycle\r\n *  0b101..The AWRWAIT unit is 2048 ahb clock cycle\r\n *  0b110..The AWRWAIT unit is 8192 ahb clock cycle\r\n *  0b111..The AWRWAIT unit is 32768 ahb clock cycle\r\n */\r\n#define FLEXSPI_FLSHCR2_AWRWAITUNIT(x)           (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_AWRWAITUNIT_SHIFT)) & FLEXSPI_FLSHCR2_AWRWAITUNIT_MASK)\r\n\r\n#define FLEXSPI_FLSHCR2_CLRINSTRPTR_MASK         (0x80000000U)\r\n#define FLEXSPI_FLSHCR2_CLRINSTRPTR_SHIFT        (31U)\r\n/*! CLRINSTRPTR - Clear the instruction pointer which is internally saved pointer by JMP_ON_CS. */\r\n#define FLEXSPI_FLSHCR2_CLRINSTRPTR(x)           (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR2_CLRINSTRPTR_SHIFT)) & FLEXSPI_FLSHCR2_CLRINSTRPTR_MASK)\r\n/*! @} */\r\n\r\n/* The count of FLEXSPI_FLSHCR2 */\r\n#define FLEXSPI_FLSHCR2_COUNT                    (4U)\r\n\r\n/*! @name FLSHCR4 - Flash Control Register 4 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_FLSHCR4_WMOPT1_MASK              (0x1U)\r\n#define FLEXSPI_FLSHCR4_WMOPT1_SHIFT             (0U)\r\n/*! WMOPT1 - Write mask option bit 1. This option bit could be used to remove AHB write burst start address alignment limitation.\r\n *  0b0..DQS pin will be used as Write Mask when writing to external device. There is no limitation on AHB write\r\n *       burst start address alignment when flash is accessed in individual mode.\r\n *  0b1..DQS pin will not be used as Write Mask when writing to external device. There is limitation on AHB write\r\n *       burst start address alignment when flash is accessed in individual mode.\r\n */\r\n#define FLEXSPI_FLSHCR4_WMOPT1(x)                (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR4_WMOPT1_SHIFT)) & FLEXSPI_FLSHCR4_WMOPT1_MASK)\r\n\r\n#define FLEXSPI_FLSHCR4_WMOPT2_MASK              (0x2U)\r\n#define FLEXSPI_FLSHCR4_WMOPT2_SHIFT             (1U)\r\n/*! WMOPT2 - Write mask option bit 2. When using AP memory, This option bit could be used to remove\r\n *    AHB write burst minimal length limitation. When using this bit, WMOPT1 should also be set.\r\n *  0b0..DQS pin will be used as Write Mask when writing to external device. There is no limitation on AHB write\r\n *       burst length when flash is accessed in individual mode.\r\n *  0b1..DQS pin will not be used as Write Mask when writing to external device. There is limitation on AHB write\r\n *       burst length when flash is accessed in individual mode, the minimal write burst length should be 4.\r\n */\r\n#define FLEXSPI_FLSHCR4_WMOPT2(x)                (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR4_WMOPT2_SHIFT)) & FLEXSPI_FLSHCR4_WMOPT2_MASK)\r\n\r\n#define FLEXSPI_FLSHCR4_WMENA_MASK               (0x4U)\r\n#define FLEXSPI_FLSHCR4_WMENA_SHIFT              (2U)\r\n/*! WMENA - Write mask enable bit for flash device on port A. When write mask function is needed for\r\n *    memory device on port A, this bit must be set.\r\n *  0b0..Write mask is disabled, DQS(RWDS) pin will not be driven when writing to external device.\r\n *  0b1..Write mask is enabled, DQS(RWDS) pin will be driven by FlexSPI as write mask output when writing to external device.\r\n */\r\n#define FLEXSPI_FLSHCR4_WMENA(x)                 (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR4_WMENA_SHIFT)) & FLEXSPI_FLSHCR4_WMENA_MASK)\r\n\r\n#define FLEXSPI_FLSHCR4_WMENB_MASK               (0x8U)\r\n#define FLEXSPI_FLSHCR4_WMENB_SHIFT              (3U)\r\n/*! WMENB - Write mask enable bit for flash device on port B. When write mask function is needed for\r\n *    memory device on port B, this bit must be set.\r\n *  0b0..Write mask is disabled, DQS(RWDS) pin will not be driven when writing to external device.\r\n *  0b1..Write mask is enabled, DQS(RWDS) pin will be driven by FlexSPI as write mask output when writing to external device.\r\n */\r\n#define FLEXSPI_FLSHCR4_WMENB(x)                 (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR4_WMENB_SHIFT)) & FLEXSPI_FLSHCR4_WMENB_MASK)\r\n\r\n#define FLEXSPI_FLSHCR4_PAR_WM_MASK              (0x600U)\r\n#define FLEXSPI_FLSHCR4_PAR_WM_SHIFT             (9U)\r\n/*! PAR_WM - Enable APMEM 16 bit write mask function, bit 9 for A1-B1 pair, bit 10 for A2-B2 pair. */\r\n#define FLEXSPI_FLSHCR4_PAR_WM(x)                (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR4_PAR_WM_SHIFT)) & FLEXSPI_FLSHCR4_PAR_WM_MASK)\r\n\r\n#define FLEXSPI_FLSHCR4_PAR_ADDR_ADJ_DIS_MASK    (0x800U)\r\n#define FLEXSPI_FLSHCR4_PAR_ADDR_ADJ_DIS_SHIFT   (11U)\r\n/*! PAR_ADDR_ADJ_DIS - Disable the address shift logic for lower density of 16 bit PSRAM. */\r\n#define FLEXSPI_FLSHCR4_PAR_ADDR_ADJ_DIS(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_FLSHCR4_PAR_ADDR_ADJ_DIS_SHIFT)) & FLEXSPI_FLSHCR4_PAR_ADDR_ADJ_DIS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPCR0 - IP Control Register 0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPCR0_SFAR_MASK                  (0xFFFFFFFFU)\r\n#define FLEXSPI_IPCR0_SFAR_SHIFT                 (0U)\r\n/*! SFAR - Serial Flash Address for IP command. */\r\n#define FLEXSPI_IPCR0_SFAR(x)                    (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPCR0_SFAR_SHIFT)) & FLEXSPI_IPCR0_SFAR_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPCR1 - IP Control Register 1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPCR1_IDATSZ_MASK                (0xFFFFU)\r\n#define FLEXSPI_IPCR1_IDATSZ_SHIFT               (0U)\r\n/*! IDATSZ - Flash Read/Program Data Size (in Bytes) for IP command. */\r\n#define FLEXSPI_IPCR1_IDATSZ(x)                  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPCR1_IDATSZ_SHIFT)) & FLEXSPI_IPCR1_IDATSZ_MASK)\r\n\r\n#define FLEXSPI_IPCR1_ISEQID_MASK                (0xF0000U)\r\n#define FLEXSPI_IPCR1_ISEQID_SHIFT               (16U)\r\n/*! ISEQID - Sequence Index in LUT for IP command. */\r\n#define FLEXSPI_IPCR1_ISEQID(x)                  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPCR1_ISEQID_SHIFT)) & FLEXSPI_IPCR1_ISEQID_MASK)\r\n\r\n#define FLEXSPI_IPCR1_ISEQNUM_MASK               (0x7000000U)\r\n#define FLEXSPI_IPCR1_ISEQNUM_SHIFT              (24U)\r\n/*! ISEQNUM - Sequence Number for IP command: ISEQNUM+1. */\r\n#define FLEXSPI_IPCR1_ISEQNUM(x)                 (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPCR1_ISEQNUM_SHIFT)) & FLEXSPI_IPCR1_ISEQNUM_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPCMD - IP Command Register */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPCMD_TRG_MASK                   (0x1U)\r\n#define FLEXSPI_IPCMD_TRG_SHIFT                  (0U)\r\n/*! TRG - Setting this bit will trigger an IP Command. */\r\n#define FLEXSPI_IPCMD_TRG(x)                     (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPCMD_TRG_SHIFT)) & FLEXSPI_IPCMD_TRG_MASK)\r\n/*! @} */\r\n\r\n/*! @name DLPR - Data Learn Pattern Register */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_DLPR_DLP_MASK                    (0xFFFFFFFFU)\r\n#define FLEXSPI_DLPR_DLP_SHIFT                   (0U)\r\n/*! DLP - Data Learning Pattern. */\r\n#define FLEXSPI_DLPR_DLP(x)                      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLPR_DLP_SHIFT)) & FLEXSPI_DLPR_DLP_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPRXFCR - IP RX FIFO Control Register */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPRXFCR_CLRIPRXF_MASK            (0x1U)\r\n#define FLEXSPI_IPRXFCR_CLRIPRXF_SHIFT           (0U)\r\n/*! CLRIPRXF - Clear all valid data entries in IP RX FIFO. */\r\n#define FLEXSPI_IPRXFCR_CLRIPRXF(x)              (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPRXFCR_CLRIPRXF_SHIFT)) & FLEXSPI_IPRXFCR_CLRIPRXF_MASK)\r\n\r\n#define FLEXSPI_IPRXFCR_RXDMAEN_MASK             (0x2U)\r\n#define FLEXSPI_IPRXFCR_RXDMAEN_SHIFT            (1U)\r\n/*! RXDMAEN - IP RX FIFO reading by DMA enabled.\r\n *  0b0..IP RX FIFO would be read by processor.\r\n *  0b1..IP RX FIFO would be read by DMA.\r\n */\r\n#define FLEXSPI_IPRXFCR_RXDMAEN(x)               (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPRXFCR_RXDMAEN_SHIFT)) & FLEXSPI_IPRXFCR_RXDMAEN_MASK)\r\n\r\n#define FLEXSPI_IPRXFCR_RXWMRK_MASK              (0x1FCU)\r\n#define FLEXSPI_IPRXFCR_RXWMRK_SHIFT             (2U)\r\n/*! RXWMRK - Watermark level is (RXWMRK+1)*64 Bits. */\r\n#define FLEXSPI_IPRXFCR_RXWMRK(x)                (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPRXFCR_RXWMRK_SHIFT)) & FLEXSPI_IPRXFCR_RXWMRK_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPTXFCR - IP TX FIFO Control Register */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPTXFCR_CLRIPTXF_MASK            (0x1U)\r\n#define FLEXSPI_IPTXFCR_CLRIPTXF_SHIFT           (0U)\r\n/*! CLRIPTXF - Clear all valid data entries in IP TX FIFO. */\r\n#define FLEXSPI_IPTXFCR_CLRIPTXF(x)              (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPTXFCR_CLRIPTXF_SHIFT)) & FLEXSPI_IPTXFCR_CLRIPTXF_MASK)\r\n\r\n#define FLEXSPI_IPTXFCR_TXDMAEN_MASK             (0x2U)\r\n#define FLEXSPI_IPTXFCR_TXDMAEN_SHIFT            (1U)\r\n/*! TXDMAEN - IP TX FIFO filling by DMA enabled.\r\n *  0b0..IP TX FIFO would be filled by processor.\r\n *  0b1..IP TX FIFO would be filled by DMA.\r\n */\r\n#define FLEXSPI_IPTXFCR_TXDMAEN(x)               (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPTXFCR_TXDMAEN_SHIFT)) & FLEXSPI_IPTXFCR_TXDMAEN_MASK)\r\n\r\n#define FLEXSPI_IPTXFCR_TXWMRK_MASK              (0x1FCU)\r\n#define FLEXSPI_IPTXFCR_TXWMRK_SHIFT             (2U)\r\n/*! TXWMRK - Watermark level is (TXWMRK+1)*64 Bits. */\r\n#define FLEXSPI_IPTXFCR_TXWMRK(x)                (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPTXFCR_TXWMRK_SHIFT)) & FLEXSPI_IPTXFCR_TXWMRK_MASK)\r\n/*! @} */\r\n\r\n/*! @name DLLCR - DLL Control Register 0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_DLLCR_DLLEN_MASK                 (0x1U)\r\n#define FLEXSPI_DLLCR_DLLEN_SHIFT                (0U)\r\n/*! DLLEN - DLL calibration enable. */\r\n#define FLEXSPI_DLLCR_DLLEN(x)                   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_DLLEN_SHIFT)) & FLEXSPI_DLLCR_DLLEN_MASK)\r\n\r\n#define FLEXSPI_DLLCR_DLLRESET_MASK              (0x2U)\r\n#define FLEXSPI_DLLCR_DLLRESET_SHIFT             (1U)\r\n/*! DLLRESET - DLL reset */\r\n#define FLEXSPI_DLLCR_DLLRESET(x)                (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_DLLRESET_SHIFT)) & FLEXSPI_DLLCR_DLLRESET_MASK)\r\n\r\n#define FLEXSPI_DLLCR_SLVDLYTARGET_MASK          (0x78U)\r\n#define FLEXSPI_DLLCR_SLVDLYTARGET_SHIFT         (3U)\r\n/*! SLVDLYTARGET - The delay target for slave delay line is: ((SLVDLYTARGET+1) * 1/32 * clock cycle\r\n *    of reference clock (serial root clock). If serial root clock is >= 100 MHz, DLLEN set to 0x1,\r\n *    OVRDEN set to =0x0, then SLVDLYTARGET setting of 0xF is recommended.\r\n */\r\n#define FLEXSPI_DLLCR_SLVDLYTARGET(x)            (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_SLVDLYTARGET_SHIFT)) & FLEXSPI_DLLCR_SLVDLYTARGET_MASK)\r\n\r\n#define FLEXSPI_DLLCR_OVRDEN_MASK                (0x100U)\r\n#define FLEXSPI_DLLCR_OVRDEN_SHIFT               (8U)\r\n/*! OVRDEN - Slave clock delay line delay cell number selection override enable. */\r\n#define FLEXSPI_DLLCR_OVRDEN(x)                  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_OVRDEN_SHIFT)) & FLEXSPI_DLLCR_OVRDEN_MASK)\r\n\r\n#define FLEXSPI_DLLCR_OVRDVAL_MASK               (0x7E00U)\r\n#define FLEXSPI_DLLCR_OVRDVAL_SHIFT              (9U)\r\n/*! OVRDVAL - Slave clock delay line delay cell number selection override value. */\r\n#define FLEXSPI_DLLCR_OVRDVAL(x)                 (((uint32_t)(((uint32_t)(x)) << FLEXSPI_DLLCR_OVRDVAL_SHIFT)) & FLEXSPI_DLLCR_OVRDVAL_MASK)\r\n/*! @} */\r\n\r\n/* The count of FLEXSPI_DLLCR */\r\n#define FLEXSPI_DLLCR_COUNT                      (2U)\r\n\r\n/*! @name STS0 - Status Register 0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_STS0_SEQIDLE_MASK                (0x1U)\r\n#define FLEXSPI_STS0_SEQIDLE_SHIFT               (0U)\r\n/*! SEQIDLE - This status bit indicates the state machine in SEQ_CTL is idle and there is command\r\n *    sequence executing on FlexSPI interface.\r\n */\r\n#define FLEXSPI_STS0_SEQIDLE(x)                  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS0_SEQIDLE_SHIFT)) & FLEXSPI_STS0_SEQIDLE_MASK)\r\n\r\n#define FLEXSPI_STS0_ARBIDLE_MASK                (0x2U)\r\n#define FLEXSPI_STS0_ARBIDLE_SHIFT               (1U)\r\n/*! ARBIDLE - This status bit indicates the state machine in ARB_CTL is busy and there is command\r\n *    sequence granted by arbitrator and not finished yet on FlexSPI interface. When ARB_CTL state\r\n *    (ARBIDLE=0x1) is idle, there will be no transaction on FlexSPI interface also (SEQIDLE=0x1). So\r\n *    this bit should be polled to wait for FlexSPI controller become idle instead of SEQIDLE.\r\n */\r\n#define FLEXSPI_STS0_ARBIDLE(x)                  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS0_ARBIDLE_SHIFT)) & FLEXSPI_STS0_ARBIDLE_MASK)\r\n\r\n#define FLEXSPI_STS0_ARBCMDSRC_MASK              (0xCU)\r\n#define FLEXSPI_STS0_ARBCMDSRC_SHIFT             (2U)\r\n/*! ARBCMDSRC - This status field indicates the trigger source of current command sequence granted\r\n *    by arbitrator. This field value is meaningless when ARB_CTL is not busy (STS0[ARBIDLE]=0x1).\r\n *  0b00..Triggered by AHB read command (triggered by AHB read).\r\n *  0b01..Triggered by AHB write command (triggered by AHB Write).\r\n *  0b10..Triggered by IP command (triggered by setting register bit IPCMD.TRG).\r\n *  0b11..Triggered by suspended command (resumed).\r\n */\r\n#define FLEXSPI_STS0_ARBCMDSRC(x)                (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS0_ARBCMDSRC_SHIFT)) & FLEXSPI_STS0_ARBCMDSRC_MASK)\r\n\r\n#define FLEXSPI_STS0_DATALEARNPHASEA_MASK        (0xF0U)\r\n#define FLEXSPI_STS0_DATALEARNPHASEA_SHIFT       (4U)\r\n/*! DATALEARNPHASEA - Indicate the sampling clock phase selection on Port A after Data Learning. */\r\n#define FLEXSPI_STS0_DATALEARNPHASEA(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS0_DATALEARNPHASEA_SHIFT)) & FLEXSPI_STS0_DATALEARNPHASEA_MASK)\r\n\r\n#define FLEXSPI_STS0_DATALEARNPHASEB_MASK        (0xF00U)\r\n#define FLEXSPI_STS0_DATALEARNPHASEB_SHIFT       (8U)\r\n/*! DATALEARNPHASEB - Indicate the sampling clock phase selection on Port B after Data Learning. */\r\n#define FLEXSPI_STS0_DATALEARNPHASEB(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS0_DATALEARNPHASEB_SHIFT)) & FLEXSPI_STS0_DATALEARNPHASEB_MASK)\r\n/*! @} */\r\n\r\n/*! @name STS1 - Status Register 1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_STS1_AHBCMDERRID_MASK            (0xFU)\r\n#define FLEXSPI_STS1_AHBCMDERRID_SHIFT           (0U)\r\n/*! AHBCMDERRID - Indicates the sequence index when an AHB command error is detected. This field\r\n *    will be cleared when INTR[AHBCMDERR] is write-1-clear(w1c).\r\n */\r\n#define FLEXSPI_STS1_AHBCMDERRID(x)              (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS1_AHBCMDERRID_SHIFT)) & FLEXSPI_STS1_AHBCMDERRID_MASK)\r\n\r\n#define FLEXSPI_STS1_AHBCMDERRCODE_MASK          (0xF00U)\r\n#define FLEXSPI_STS1_AHBCMDERRCODE_SHIFT         (8U)\r\n/*! AHBCMDERRCODE - Indicates the Error Code when AHB command Error detected. This field will be\r\n *    cleared when INTR[AHBCMDERR] is write-1-clear(w1c).\r\n *  0b0000..No error.\r\n *  0b0010..AHB Write command with JMP_ON_CS instruction used in the sequence.\r\n *  0b0011..There is unknown instruction opcode in the sequence.\r\n *  0b0100..Instruction DUMMY_SDR/DUMMY_RWDS_SDR used in DDR sequence.\r\n *  0b0101..Instruction DUMMY_DDR/DUMMY_RWDS_DDR used in SDR sequence.\r\n *  0b1110..Sequence execution timeout.\r\n */\r\n#define FLEXSPI_STS1_AHBCMDERRCODE(x)            (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS1_AHBCMDERRCODE_SHIFT)) & FLEXSPI_STS1_AHBCMDERRCODE_MASK)\r\n\r\n#define FLEXSPI_STS1_IPCMDERRID_MASK             (0xF0000U)\r\n#define FLEXSPI_STS1_IPCMDERRID_SHIFT            (16U)\r\n/*! IPCMDERRID - Indicates the sequence Index when IP command error detected. */\r\n#define FLEXSPI_STS1_IPCMDERRID(x)               (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS1_IPCMDERRID_SHIFT)) & FLEXSPI_STS1_IPCMDERRID_MASK)\r\n\r\n#define FLEXSPI_STS1_IPCMDERRCODE_MASK           (0xF000000U)\r\n#define FLEXSPI_STS1_IPCMDERRCODE_SHIFT          (24U)\r\n/*! IPCMDERRCODE - Indicates the Error Code when IP command Error detected. This field will be\r\n *    cleared when INTR[IPCMDERR] is write-1-clear(w1c).\r\n *  0b0000..No error.\r\n *  0b0010..IP command with JMP_ON_CS instruction used in the sequence.\r\n *  0b0011..There is unknown instruction opcode in the sequence.\r\n *  0b0100..Instruction DUMMY_SDR/DUMMY_RWDS_SDR used in DDR sequence.\r\n *  0b0101..Instruction DUMMY_DDR/DUMMY_RWDS_DDR used in SDR sequence.\r\n *  0b0110..Flash access start address exceed the whole flash address range (A1/A2/B1/B2).\r\n *  0b1110..Sequence execution timeout.\r\n *  0b1111..Flash boundary crossed.\r\n */\r\n#define FLEXSPI_STS1_IPCMDERRCODE(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS1_IPCMDERRCODE_SHIFT)) & FLEXSPI_STS1_IPCMDERRCODE_MASK)\r\n/*! @} */\r\n\r\n/*! @name STS2 - Status Register 2 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_STS2_ASLVLOCK_MASK               (0x1U)\r\n#define FLEXSPI_STS2_ASLVLOCK_SHIFT              (0U)\r\n/*! ASLVLOCK - Flash A sample clock slave delay line locked. */\r\n#define FLEXSPI_STS2_ASLVLOCK(x)                 (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_ASLVLOCK_SHIFT)) & FLEXSPI_STS2_ASLVLOCK_MASK)\r\n\r\n#define FLEXSPI_STS2_AREFLOCK_MASK               (0x2U)\r\n#define FLEXSPI_STS2_AREFLOCK_SHIFT              (1U)\r\n/*! AREFLOCK - Flash A sample clock reference delay line locked. */\r\n#define FLEXSPI_STS2_AREFLOCK(x)                 (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_AREFLOCK_SHIFT)) & FLEXSPI_STS2_AREFLOCK_MASK)\r\n\r\n#define FLEXSPI_STS2_ASLVSEL_MASK                (0xFCU)\r\n#define FLEXSPI_STS2_ASLVSEL_SHIFT               (2U)\r\n/*! ASLVSEL - Flash A sample clock slave delay line delay cell number selection . */\r\n#define FLEXSPI_STS2_ASLVSEL(x)                  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_ASLVSEL_SHIFT)) & FLEXSPI_STS2_ASLVSEL_MASK)\r\n\r\n#define FLEXSPI_STS2_AREFSEL_MASK                (0x3F00U)\r\n#define FLEXSPI_STS2_AREFSEL_SHIFT               (8U)\r\n/*! AREFSEL - Flash A sample clock reference delay line delay cell number selection. */\r\n#define FLEXSPI_STS2_AREFSEL(x)                  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_AREFSEL_SHIFT)) & FLEXSPI_STS2_AREFSEL_MASK)\r\n\r\n#define FLEXSPI_STS2_BSLVLOCK_MASK               (0x10000U)\r\n#define FLEXSPI_STS2_BSLVLOCK_SHIFT              (16U)\r\n/*! BSLVLOCK - Flash B sample clock slave delay line locked. */\r\n#define FLEXSPI_STS2_BSLVLOCK(x)                 (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_BSLVLOCK_SHIFT)) & FLEXSPI_STS2_BSLVLOCK_MASK)\r\n\r\n#define FLEXSPI_STS2_BREFLOCK_MASK               (0x20000U)\r\n#define FLEXSPI_STS2_BREFLOCK_SHIFT              (17U)\r\n/*! BREFLOCK - Flash B sample clock reference delay line locked. */\r\n#define FLEXSPI_STS2_BREFLOCK(x)                 (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_BREFLOCK_SHIFT)) & FLEXSPI_STS2_BREFLOCK_MASK)\r\n\r\n#define FLEXSPI_STS2_BSLVSEL_MASK                (0xFC0000U)\r\n#define FLEXSPI_STS2_BSLVSEL_SHIFT               (18U)\r\n/*! BSLVSEL - Flash B sample clock slave delay line delay cell number selection. */\r\n#define FLEXSPI_STS2_BSLVSEL(x)                  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_BSLVSEL_SHIFT)) & FLEXSPI_STS2_BSLVSEL_MASK)\r\n\r\n#define FLEXSPI_STS2_BREFSEL_MASK                (0x3F000000U)\r\n#define FLEXSPI_STS2_BREFSEL_SHIFT               (24U)\r\n/*! BREFSEL - Flash B sample clock reference delay line delay cell number selection. */\r\n#define FLEXSPI_STS2_BREFSEL(x)                  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_STS2_BREFSEL_SHIFT)) & FLEXSPI_STS2_BREFSEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHBSPNDSTS - AHB Suspend Status Register */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_AHBSPNDSTS_ACTIVE_MASK           (0x1U)\r\n#define FLEXSPI_AHBSPNDSTS_ACTIVE_SHIFT          (0U)\r\n/*! ACTIVE - Indicates if an AHB read prefetch command sequence has been suspended. */\r\n#define FLEXSPI_AHBSPNDSTS_ACTIVE(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBSPNDSTS_ACTIVE_SHIFT)) & FLEXSPI_AHBSPNDSTS_ACTIVE_MASK)\r\n\r\n#define FLEXSPI_AHBSPNDSTS_BUFID_MASK            (0xEU)\r\n#define FLEXSPI_AHBSPNDSTS_BUFID_SHIFT           (1U)\r\n/*! BUFID - AHB RX BUF ID for suspended command sequence. */\r\n#define FLEXSPI_AHBSPNDSTS_BUFID(x)              (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBSPNDSTS_BUFID_SHIFT)) & FLEXSPI_AHBSPNDSTS_BUFID_MASK)\r\n\r\n#define FLEXSPI_AHBSPNDSTS_DATLFT_MASK           (0xFFFF0000U)\r\n#define FLEXSPI_AHBSPNDSTS_DATLFT_SHIFT          (16U)\r\n/*! DATLFT - Left Data size for suspended command sequence (in byte). */\r\n#define FLEXSPI_AHBSPNDSTS_DATLFT(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBSPNDSTS_DATLFT_SHIFT)) & FLEXSPI_AHBSPNDSTS_DATLFT_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPRXFSTS - IP RX FIFO Status Register */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPRXFSTS_FILL_MASK               (0xFFU)\r\n#define FLEXSPI_IPRXFSTS_FILL_SHIFT              (0U)\r\n/*! FILL - Fill level of IP RX FIFO. */\r\n#define FLEXSPI_IPRXFSTS_FILL(x)                 (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPRXFSTS_FILL_SHIFT)) & FLEXSPI_IPRXFSTS_FILL_MASK)\r\n\r\n#define FLEXSPI_IPRXFSTS_RDCNTR_MASK             (0xFFFF0000U)\r\n#define FLEXSPI_IPRXFSTS_RDCNTR_SHIFT            (16U)\r\n/*! RDCNTR - Total Read Data Counter: RDCNTR * 64 Bits. */\r\n#define FLEXSPI_IPRXFSTS_RDCNTR(x)               (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPRXFSTS_RDCNTR_SHIFT)) & FLEXSPI_IPRXFSTS_RDCNTR_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPTXFSTS - IP TX FIFO Status Register */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPTXFSTS_FILL_MASK               (0xFFU)\r\n#define FLEXSPI_IPTXFSTS_FILL_SHIFT              (0U)\r\n/*! FILL - Fill level of IP TX FIFO. */\r\n#define FLEXSPI_IPTXFSTS_FILL(x)                 (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPTXFSTS_FILL_SHIFT)) & FLEXSPI_IPTXFSTS_FILL_MASK)\r\n\r\n#define FLEXSPI_IPTXFSTS_WRCNTR_MASK             (0xFFFF0000U)\r\n#define FLEXSPI_IPTXFSTS_WRCNTR_SHIFT            (16U)\r\n/*! WRCNTR - Total Write Data Counter: WRCNTR * 64 Bits. */\r\n#define FLEXSPI_IPTXFSTS_WRCNTR(x)               (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPTXFSTS_WRCNTR_SHIFT)) & FLEXSPI_IPTXFSTS_WRCNTR_MASK)\r\n/*! @} */\r\n\r\n/*! @name RFDR - IP RX FIFO Data Register 0..IP RX FIFO Data Register 31 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_RFDR_RXDATA_MASK                 (0xFFFFFFFFU)\r\n#define FLEXSPI_RFDR_RXDATA_SHIFT                (0U)\r\n/*! RXDATA - RX Data */\r\n#define FLEXSPI_RFDR_RXDATA(x)                   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_RFDR_RXDATA_SHIFT)) & FLEXSPI_RFDR_RXDATA_MASK)\r\n/*! @} */\r\n\r\n/* The count of FLEXSPI_RFDR */\r\n#define FLEXSPI_RFDR_COUNT                       (32U)\r\n\r\n/*! @name TFDR - IP TX FIFO Data Register 0..IP TX FIFO Data Register 31 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_TFDR_TXDATA_MASK                 (0xFFFFFFFFU)\r\n#define FLEXSPI_TFDR_TXDATA_SHIFT                (0U)\r\n/*! TXDATA - TX Data */\r\n#define FLEXSPI_TFDR_TXDATA(x)                   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_TFDR_TXDATA_SHIFT)) & FLEXSPI_TFDR_TXDATA_MASK)\r\n/*! @} */\r\n\r\n/* The count of FLEXSPI_TFDR */\r\n#define FLEXSPI_TFDR_COUNT                       (32U)\r\n\r\n/*! @name LUT - LUT 0..LUT 63 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_LUT_OPERAND0_MASK                (0xFFU)\r\n#define FLEXSPI_LUT_OPERAND0_SHIFT               (0U)\r\n/*! OPERAND0 - OPERAND0 */\r\n#define FLEXSPI_LUT_OPERAND0(x)                  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUT_OPERAND0_SHIFT)) & FLEXSPI_LUT_OPERAND0_MASK)\r\n\r\n#define FLEXSPI_LUT_NUM_PADS0_MASK               (0x300U)\r\n#define FLEXSPI_LUT_NUM_PADS0_SHIFT              (8U)\r\n/*! NUM_PADS0 - NUM_PADS0 */\r\n#define FLEXSPI_LUT_NUM_PADS0(x)                 (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUT_NUM_PADS0_SHIFT)) & FLEXSPI_LUT_NUM_PADS0_MASK)\r\n\r\n#define FLEXSPI_LUT_OPCODE0_MASK                 (0xFC00U)\r\n#define FLEXSPI_LUT_OPCODE0_SHIFT                (10U)\r\n/*! OPCODE0 - OPCODE */\r\n#define FLEXSPI_LUT_OPCODE0(x)                   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUT_OPCODE0_SHIFT)) & FLEXSPI_LUT_OPCODE0_MASK)\r\n\r\n#define FLEXSPI_LUT_OPERAND1_MASK                (0xFF0000U)\r\n#define FLEXSPI_LUT_OPERAND1_SHIFT               (16U)\r\n/*! OPERAND1 - OPERAND1 */\r\n#define FLEXSPI_LUT_OPERAND1(x)                  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUT_OPERAND1_SHIFT)) & FLEXSPI_LUT_OPERAND1_MASK)\r\n\r\n#define FLEXSPI_LUT_NUM_PADS1_MASK               (0x3000000U)\r\n#define FLEXSPI_LUT_NUM_PADS1_SHIFT              (24U)\r\n/*! NUM_PADS1 - NUM_PADS1 */\r\n#define FLEXSPI_LUT_NUM_PADS1(x)                 (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUT_NUM_PADS1_SHIFT)) & FLEXSPI_LUT_NUM_PADS1_MASK)\r\n\r\n#define FLEXSPI_LUT_OPCODE1_MASK                 (0xFC000000U)\r\n#define FLEXSPI_LUT_OPCODE1_SHIFT                (26U)\r\n/*! OPCODE1 - OPCODE1 */\r\n#define FLEXSPI_LUT_OPCODE1(x)                   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_LUT_OPCODE1_SHIFT)) & FLEXSPI_LUT_OPCODE1_MASK)\r\n/*! @} */\r\n\r\n/* The count of FLEXSPI_LUT */\r\n#define FLEXSPI_LUT_COUNT                        (64U)\r\n\r\n/*! @name HADDRSTART - HADDR REMAP START ADDR */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_HADDRSTART_REMAPEN_MASK          (0x1U)\r\n#define FLEXSPI_HADDRSTART_REMAPEN_SHIFT         (0U)\r\n/*! REMAPEN - AHB Bus address remap function enable\r\n *  0b0..HADDR REMAP Disabled\r\n *  0b1..HADDR REMAP Enabled\r\n */\r\n#define FLEXSPI_HADDRSTART_REMAPEN(x)            (((uint32_t)(((uint32_t)(x)) << FLEXSPI_HADDRSTART_REMAPEN_SHIFT)) & FLEXSPI_HADDRSTART_REMAPEN_MASK)\r\n\r\n#define FLEXSPI_HADDRSTART_ADDRSTART_MASK        (0xFFFFF000U)\r\n#define FLEXSPI_HADDRSTART_ADDRSTART_SHIFT       (12U)\r\n/*! ADDRSTART - HADDR start address */\r\n#define FLEXSPI_HADDRSTART_ADDRSTART(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_HADDRSTART_ADDRSTART_SHIFT)) & FLEXSPI_HADDRSTART_ADDRSTART_MASK)\r\n/*! @} */\r\n\r\n/*! @name HADDREND - HADDR REMAP END ADDR */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_HADDREND_ENDSTART_MASK           (0xFFFFF000U)\r\n#define FLEXSPI_HADDREND_ENDSTART_SHIFT          (12U)\r\n/*! ENDSTART - HADDR remap range's end addr, 4K aligned */\r\n#define FLEXSPI_HADDREND_ENDSTART(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_HADDREND_ENDSTART_SHIFT)) & FLEXSPI_HADDREND_ENDSTART_MASK)\r\n/*! @} */\r\n\r\n/*! @name HADDROFFSET - HADDR REMAP OFFSET */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_HADDROFFSET_ADDROFFSET_MASK      (0xFFFFF000U)\r\n#define FLEXSPI_HADDROFFSET_ADDROFFSET_SHIFT     (12U)\r\n/*! ADDROFFSET - HADDR offset field, remapped address will be ADDR[31:12]=ADDR_original[31:12]+ADDROFFSET */\r\n#define FLEXSPI_HADDROFFSET_ADDROFFSET(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_HADDROFFSET_ADDROFFSET_SHIFT)) & FLEXSPI_HADDROFFSET_ADDROFFSET_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTRL - IPED function control */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTRL_CONFIG_MASK             (0x1U)\r\n#define FLEXSPI_IPEDCTRL_CONFIG_SHIFT            (0U)\r\n/*! CONFIG - Drive IPED interface i_config. */\r\n#define FLEXSPI_IPEDCTRL_CONFIG(x)               (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTRL_CONFIG_SHIFT)) & FLEXSPI_IPEDCTRL_CONFIG_MASK)\r\n\r\n#define FLEXSPI_IPEDCTRL_IPED_EN_MASK            (0x2U)\r\n#define FLEXSPI_IPEDCTRL_IPED_EN_SHIFT           (1U)\r\n/*! IPED_EN - Drive IPED interface i_enable */\r\n#define FLEXSPI_IPEDCTRL_IPED_EN(x)              (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTRL_IPED_EN_SHIFT)) & FLEXSPI_IPEDCTRL_IPED_EN_MASK)\r\n\r\n#define FLEXSPI_IPEDCTRL_IPWR_EN_MASK            (0x4U)\r\n#define FLEXSPI_IPEDCTRL_IPWR_EN_SHIFT           (2U)\r\n/*! IPWR_EN - IP write IPED CTR mode encryption enable */\r\n#define FLEXSPI_IPEDCTRL_IPWR_EN(x)              (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTRL_IPWR_EN_SHIFT)) & FLEXSPI_IPEDCTRL_IPWR_EN_MASK)\r\n\r\n#define FLEXSPI_IPEDCTRL_AHBWR_EN_MASK           (0x8U)\r\n#define FLEXSPI_IPEDCTRL_AHBWR_EN_SHIFT          (3U)\r\n/*! AHBWR_EN - AHB write IPED CTR mode encryption enable */\r\n#define FLEXSPI_IPEDCTRL_AHBWR_EN(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTRL_AHBWR_EN_SHIFT)) & FLEXSPI_IPEDCTRL_AHBWR_EN_MASK)\r\n\r\n#define FLEXSPI_IPEDCTRL_AHBRD_EN_MASK           (0x10U)\r\n#define FLEXSPI_IPEDCTRL_AHBRD_EN_SHIFT          (4U)\r\n/*! AHBRD_EN - AHB read IPED CTR mode decryption enable */\r\n#define FLEXSPI_IPEDCTRL_AHBRD_EN(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTRL_AHBRD_EN_SHIFT)) & FLEXSPI_IPEDCTRL_AHBRD_EN_MASK)\r\n\r\n#define FLEXSPI_IPEDCTRL_IPWROTA_MASK            (0x20U)\r\n#define FLEXSPI_IPEDCTRL_IPWROTA_SHIFT           (5U)\r\n/*! IPWROTA - IP GCM mode command write OTA region */\r\n#define FLEXSPI_IPEDCTRL_IPWROTA(x)              (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTRL_IPWROTA_SHIFT)) & FLEXSPI_IPEDCTRL_IPWROTA_MASK)\r\n\r\n#define FLEXSPI_IPEDCTRL_IPGCMWR_MASK            (0x40U)\r\n#define FLEXSPI_IPEDCTRL_IPGCMWR_SHIFT           (6U)\r\n/*! IPGCMWR - IP write GCM mode enable */\r\n#define FLEXSPI_IPEDCTRL_IPGCMWR(x)              (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTRL_IPGCMWR_SHIFT)) & FLEXSPI_IPEDCTRL_IPGCMWR_MASK)\r\n\r\n#define FLEXSPI_IPEDCTRL_AHGCMWR_MASK            (0x80U)\r\n#define FLEXSPI_IPEDCTRL_AHGCMWR_SHIFT           (7U)\r\n/*! AHGCMWR - AHB write IPED GCM mode encryption enable */\r\n#define FLEXSPI_IPEDCTRL_AHGCMWR(x)              (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTRL_AHGCMWR_SHIFT)) & FLEXSPI_IPEDCTRL_AHGCMWR_MASK)\r\n\r\n#define FLEXSPI_IPEDCTRL_AHBGCMRD_MASK           (0x100U)\r\n#define FLEXSPI_IPEDCTRL_AHBGCMRD_SHIFT          (8U)\r\n/*! AHBGCMRD - AHB read IPED GCM mode decryption enable */\r\n#define FLEXSPI_IPEDCTRL_AHBGCMRD(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTRL_AHBGCMRD_SHIFT)) & FLEXSPI_IPEDCTRL_AHBGCMRD_MASK)\r\n\r\n#define FLEXSPI_IPEDCTRL_IPED_PROTECT_MASK       (0x200U)\r\n#define FLEXSPI_IPEDCTRL_IPED_PROTECT_SHIFT      (9U)\r\n/*! IPED_PROTECT - when ipedctrl protect = 0 or priviledge access, no restriction when ipedctrl\r\n *    protect = 1, only priviledge access can write.\r\n */\r\n#define FLEXSPI_IPEDCTRL_IPED_PROTECT(x)         (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTRL_IPED_PROTECT_SHIFT)) & FLEXSPI_IPEDCTRL_IPED_PROTECT_MASK)\r\n\r\n#define FLEXSPI_IPEDCTRL_IPED_SWRESET_MASK       (0x400U)\r\n#define FLEXSPI_IPEDCTRL_IPED_SWRESET_SHIFT      (10U)\r\n/*! IPED_SWRESET - Drive IPED interface i_abort. */\r\n#define FLEXSPI_IPEDCTRL_IPED_SWRESET(x)         (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTRL_IPED_SWRESET_SHIFT)) & FLEXSPI_IPEDCTRL_IPED_SWRESET_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPSNSZSTART0 - IPS nonsecure region Start address of region 0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPSNSZSTART0_START_ADDRESS_MASK  (0xFFFFF000U)\r\n#define FLEXSPI_IPSNSZSTART0_START_ADDRESS_SHIFT (12U)\r\n/*! START_ADDRESS - Start address of region 0. Minimal 4K Bytes aligned. It is flash address. */\r\n#define FLEXSPI_IPSNSZSTART0_START_ADDRESS(x)    (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPSNSZSTART0_START_ADDRESS_SHIFT)) & FLEXSPI_IPSNSZSTART0_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPSNSZEND0 - IPS nonsecure region End address of region 0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPSNSZEND0_END_ADDRESS_MASK      (0xFFFFF000U)\r\n#define FLEXSPI_IPSNSZEND0_END_ADDRESS_SHIFT     (12U)\r\n/*! END_ADDRESS - End address of region 0. Minimal 4K Bytes aligned. It is flash address. */\r\n#define FLEXSPI_IPSNSZEND0_END_ADDRESS(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPSNSZEND0_END_ADDRESS_SHIFT)) & FLEXSPI_IPSNSZEND0_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPSNSZSTART1 - IPS nonsecure region Start address of region 1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPSNSZSTART1_START_ADDRESS_MASK  (0xFFFFF000U)\r\n#define FLEXSPI_IPSNSZSTART1_START_ADDRESS_SHIFT (12U)\r\n/*! START_ADDRESS - Start address of region 1. Minimal 4K Bytes aligned. It is flash address. */\r\n#define FLEXSPI_IPSNSZSTART1_START_ADDRESS(x)    (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPSNSZSTART1_START_ADDRESS_SHIFT)) & FLEXSPI_IPSNSZSTART1_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPSNSZEND1 - IPS nonsecure region End address of region 1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPSNSZEND1_END_ADDRESS_MASK      (0xFFFFF000U)\r\n#define FLEXSPI_IPSNSZEND1_END_ADDRESS_SHIFT     (12U)\r\n/*! END_ADDRESS - End address of region 1. Minimal 4K Bytes aligned. It is flash address. */\r\n#define FLEXSPI_IPSNSZEND1_END_ADDRESS(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPSNSZEND1_END_ADDRESS_SHIFT)) & FLEXSPI_IPSNSZEND1_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHBBUFREGIONSTART0 - RX BUF Start address of region 0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_AHBBUFREGIONSTART0_START_ADDRESS_MASK (0xFFFFF000U)\r\n#define FLEXSPI_AHBBUFREGIONSTART0_START_ADDRESS_SHIFT (12U)\r\n/*! START_ADDRESS - Start address of region 0. Minimal 4K Bytes aligned. It is system address. */\r\n#define FLEXSPI_AHBBUFREGIONSTART0_START_ADDRESS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBBUFREGIONSTART0_START_ADDRESS_SHIFT)) & FLEXSPI_AHBBUFREGIONSTART0_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHBBUFREGIONEND0 - RX BUF region End address of region 0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_AHBBUFREGIONEND0_END_ADDRESS_MASK (0xFFFFF000U)\r\n#define FLEXSPI_AHBBUFREGIONEND0_END_ADDRESS_SHIFT (12U)\r\n/*! END_ADDRESS - End address of region 0. Minimal 4K Bytes aligned. It is system address. */\r\n#define FLEXSPI_AHBBUFREGIONEND0_END_ADDRESS(x)  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBBUFREGIONEND0_END_ADDRESS_SHIFT)) & FLEXSPI_AHBBUFREGIONEND0_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHBBUFREGIONSTART1 - RX BUF Start address of region 1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_AHBBUFREGIONSTART1_START_ADDRESS_MASK (0xFFFFF000U)\r\n#define FLEXSPI_AHBBUFREGIONSTART1_START_ADDRESS_SHIFT (12U)\r\n/*! START_ADDRESS - Start address of region 1. Minimal 4K Bytes aligned. It is system address. */\r\n#define FLEXSPI_AHBBUFREGIONSTART1_START_ADDRESS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBBUFREGIONSTART1_START_ADDRESS_SHIFT)) & FLEXSPI_AHBBUFREGIONSTART1_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHBBUFREGIONEND1 - RX BUF region End address of region 1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_AHBBUFREGIONEND1_END_ADDRESS_MASK (0xFFFFF000U)\r\n#define FLEXSPI_AHBBUFREGIONEND1_END_ADDRESS_SHIFT (12U)\r\n/*! END_ADDRESS - End address of region 1. Minimal 4K Bytes aligned. It is system address. */\r\n#define FLEXSPI_AHBBUFREGIONEND1_END_ADDRESS(x)  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBBUFREGIONEND1_END_ADDRESS_SHIFT)) & FLEXSPI_AHBBUFREGIONEND1_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHBBUFREGIONSTART2 - RX BUF Start address of region 2 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_AHBBUFREGIONSTART2_START_ADDRESS_MASK (0xFFFFF000U)\r\n#define FLEXSPI_AHBBUFREGIONSTART2_START_ADDRESS_SHIFT (12U)\r\n/*! START_ADDRESS - Start address of region 2. Minimal 4K Bytes aligned. It is system address. */\r\n#define FLEXSPI_AHBBUFREGIONSTART2_START_ADDRESS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBBUFREGIONSTART2_START_ADDRESS_SHIFT)) & FLEXSPI_AHBBUFREGIONSTART2_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHBBUFREGIONEND2 - RX BUF region End address of region 2 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_AHBBUFREGIONEND2_END_ADDRESS_MASK (0xFFFFF000U)\r\n#define FLEXSPI_AHBBUFREGIONEND2_END_ADDRESS_SHIFT (12U)\r\n/*! END_ADDRESS - End address of region 2. Minimal 4K Bytes aligned. It is system address. */\r\n#define FLEXSPI_AHBBUFREGIONEND2_END_ADDRESS(x)  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBBUFREGIONEND2_END_ADDRESS_SHIFT)) & FLEXSPI_AHBBUFREGIONEND2_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHBBUFREGIONSTART3 - RX BUF Start address of region 3 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_AHBBUFREGIONSTART3_START_ADDRESS_MASK (0xFFFFF000U)\r\n#define FLEXSPI_AHBBUFREGIONSTART3_START_ADDRESS_SHIFT (12U)\r\n/*! START_ADDRESS - Start address of region 3. Minimal 4K Bytes aligned. It is system address. */\r\n#define FLEXSPI_AHBBUFREGIONSTART3_START_ADDRESS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBBUFREGIONSTART3_START_ADDRESS_SHIFT)) & FLEXSPI_AHBBUFREGIONSTART3_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name AHBBUFREGIONEND3 - RX BUF region End address of region 3 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_AHBBUFREGIONEND3_END_ADDRESS_MASK (0xFFFFF000U)\r\n#define FLEXSPI_AHBBUFREGIONEND3_END_ADDRESS_SHIFT (12U)\r\n/*! END_ADDRESS - End address of region 3. Minimal 4K Bytes aligned. It is system address. */\r\n#define FLEXSPI_AHBBUFREGIONEND3_END_ADDRESS(x)  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_AHBBUFREGIONEND3_END_ADDRESS_SHIFT)) & FLEXSPI_AHBBUFREGIONEND3_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTXCTRL - IPED context control 0..IPED context control 1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX0_FREEZE0_MASK    (0x3U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX0_FREEZE0_SHIFT   (0U)\r\n/*! CTX0_FREEZE0 - Controls the RW properties of this field and region 0 context registers (CTX0_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX0_FREEZE0(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX0_FREEZE0_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX0_FREEZE0_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX0_FREEZE1_MASK    (0x3U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX0_FREEZE1_SHIFT   (0U)\r\n/*! CTX0_FREEZE1 - Controls the RW properties of this field and region 0 context registers (CTX0_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX0_FREEZE1(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX0_FREEZE1_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX0_FREEZE1_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX1_FREEZE0_MASK    (0xCU)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX1_FREEZE0_SHIFT   (2U)\r\n/*! CTX1_FREEZE0 - Controls the RW properties of this field and region 1 context registers (CTX1_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX1_FREEZE0(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX1_FREEZE0_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX1_FREEZE0_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX1_FREEZE1_MASK    (0xCU)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX1_FREEZE1_SHIFT   (2U)\r\n/*! CTX1_FREEZE1 - Controls the RW properties of this field and region 1 context registers (CTX1_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX1_FREEZE1(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX1_FREEZE1_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX1_FREEZE1_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX2_FREEZE0_MASK    (0x30U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX2_FREEZE0_SHIFT   (4U)\r\n/*! CTX2_FREEZE0 - Controls the RW properties of this field and region 2 context registers (CTX2_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX2_FREEZE0(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX2_FREEZE0_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX2_FREEZE0_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX2_FREEZE1_MASK    (0x30U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX2_FREEZE1_SHIFT   (4U)\r\n/*! CTX2_FREEZE1 - Controls the RW properties of this field and region 2 context registers (CTX2_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX2_FREEZE1(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX2_FREEZE1_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX2_FREEZE1_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX3_FREEZE0_MASK    (0xC0U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX3_FREEZE0_SHIFT   (6U)\r\n/*! CTX3_FREEZE0 - Controls the RW properties of this field and region 3 context registers (CTX3_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX3_FREEZE0(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX3_FREEZE0_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX3_FREEZE0_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX3_FREEZE1_MASK    (0xC0U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX3_FREEZE1_SHIFT   (6U)\r\n/*! CTX3_FREEZE1 - Controls the RW properties of this field and region 3 context registers (CTX3_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX3_FREEZE1(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX3_FREEZE1_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX3_FREEZE1_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX4_FREEZE0_MASK    (0x300U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX4_FREEZE0_SHIFT   (8U)\r\n/*! CTX4_FREEZE0 - Controls the RW properties of this field and region 4 context registers (CTX4_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX4_FREEZE0(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX4_FREEZE0_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX4_FREEZE0_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX4_FREEZE1_MASK    (0x300U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX4_FREEZE1_SHIFT   (8U)\r\n/*! CTX4_FREEZE1 - Controls the RW properties of this field and region 4 context registers (CTX4_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX4_FREEZE1(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX4_FREEZE1_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX4_FREEZE1_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX5_FREEZE0_MASK    (0xC00U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX5_FREEZE0_SHIFT   (10U)\r\n/*! CTX5_FREEZE0 - Controls the RW properties of this field and region 5 context registers (CTX5_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX5_FREEZE0(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX5_FREEZE0_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX5_FREEZE0_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX5_FREEZE1_MASK    (0xC00U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX5_FREEZE1_SHIFT   (10U)\r\n/*! CTX5_FREEZE1 - Controls the RW properties of this field and region 5 context registers (CTX5_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX5_FREEZE1(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX5_FREEZE1_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX5_FREEZE1_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX6_FREEZE0_MASK    (0x3000U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX6_FREEZE0_SHIFT   (12U)\r\n/*! CTX6_FREEZE0 - Controls the RW properties of this field and region 6 context registers (CTX6_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX6_FREEZE0(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX6_FREEZE0_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX6_FREEZE0_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX6_FREEZE1_MASK    (0x3000U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX6_FREEZE1_SHIFT   (12U)\r\n/*! CTX6_FREEZE1 - Controls the RW properties of this field and region 6 context registers (CTX6_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX6_FREEZE1(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX6_FREEZE1_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX6_FREEZE1_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX7_FREEZE0_MASK    (0xC000U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX7_FREEZE0_SHIFT   (14U)\r\n/*! CTX7_FREEZE0 - Controls the RW properties of this field and region 7 context registers (CTX7_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX7_FREEZE0(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX7_FREEZE0_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX7_FREEZE0_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX7_FREEZE1_MASK    (0xC000U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX7_FREEZE1_SHIFT   (14U)\r\n/*! CTX7_FREEZE1 - Controls the RW properties of this field and region 7 context registers (CTX7_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX7_FREEZE1(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX7_FREEZE1_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX7_FREEZE1_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX8_FREEZE0_MASK    (0x30000U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX8_FREEZE0_SHIFT   (16U)\r\n/*! CTX8_FREEZE0 - Controls the RW properties of this field and region 8 context registers (CTX8_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX8_FREEZE0(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX8_FREEZE0_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX8_FREEZE0_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX8_FREEZE1_MASK    (0x30000U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX8_FREEZE1_SHIFT   (16U)\r\n/*! CTX8_FREEZE1 - Controls the RW properties of this field and region 8 context registers (CTX8_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX8_FREEZE1(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX8_FREEZE1_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX8_FREEZE1_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX9_FREEZE0_MASK    (0xC0000U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX9_FREEZE0_SHIFT   (18U)\r\n/*! CTX9_FREEZE0 - Controls the RW properties of this field and region 9 context registers (CTX9_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX9_FREEZE0(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX9_FREEZE0_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX9_FREEZE0_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX9_FREEZE1_MASK    (0xC0000U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX9_FREEZE1_SHIFT   (18U)\r\n/*! CTX9_FREEZE1 - Controls the RW properties of this field and region 9 context registers (CTX9_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX9_FREEZE1(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX9_FREEZE1_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX9_FREEZE1_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX10_FREEZE0_MASK   (0x300000U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX10_FREEZE0_SHIFT  (20U)\r\n/*! CTX10_FREEZE0 - Controls the RW properties of this field and region 10 context registers (CTX10_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX10_FREEZE0(x)     (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX10_FREEZE0_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX10_FREEZE0_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX10_FREEZE1_MASK   (0x300000U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX10_FREEZE1_SHIFT  (20U)\r\n/*! CTX10_FREEZE1 - Controls the RW properties of this field and region 10 context registers (CTX10_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX10_FREEZE1(x)     (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX10_FREEZE1_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX10_FREEZE1_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX11_FREEZE0_MASK   (0xC00000U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX11_FREEZE0_SHIFT  (22U)\r\n/*! CTX11_FREEZE0 - Controls the RW properties of this field and region 11 context registers (CTX11_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX11_FREEZE0(x)     (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX11_FREEZE0_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX11_FREEZE0_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX11_FREEZE1_MASK   (0xC00000U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX11_FREEZE1_SHIFT  (22U)\r\n/*! CTX11_FREEZE1 - Controls the RW properties of this field and region 11 context registers (CTX11_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX11_FREEZE1(x)     (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX11_FREEZE1_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX11_FREEZE1_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX12_FREEZE0_MASK   (0x3000000U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX12_FREEZE0_SHIFT  (24U)\r\n/*! CTX12_FREEZE0 - Controls the RW properties of this field and region 12 context registers (CTX12_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX12_FREEZE0(x)     (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX12_FREEZE0_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX12_FREEZE0_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX12_FREEZE1_MASK   (0x3000000U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX12_FREEZE1_SHIFT  (24U)\r\n/*! CTX12_FREEZE1 - Controls the RW properties of this field and region 12 context registers (CTX12_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX12_FREEZE1(x)     (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX12_FREEZE1_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX12_FREEZE1_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX13_FREEZE0_MASK   (0xC000000U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX13_FREEZE0_SHIFT  (26U)\r\n/*! CTX13_FREEZE0 - Controls the RW properties of this field and region 13 context registers (CTX13_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX13_FREEZE0(x)     (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX13_FREEZE0_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX13_FREEZE0_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX13_FREEZE1_MASK   (0xC000000U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX13_FREEZE1_SHIFT  (26U)\r\n/*! CTX13_FREEZE1 - Controls the RW properties of this field and region 13 context registers (CTX13_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX13_FREEZE1(x)     (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX13_FREEZE1_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX13_FREEZE1_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX14_FREEZE0_MASK   (0x30000000U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX14_FREEZE0_SHIFT  (28U)\r\n/*! CTX14_FREEZE0 - Controls the RW properties of this field and region 14 context registers (CTX14_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX14_FREEZE0(x)     (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX14_FREEZE0_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX14_FREEZE0_MASK)\r\n\r\n#define FLEXSPI_IPEDCTXCTRL_CTX14_FREEZE1_MASK   (0x30000000U)\r\n#define FLEXSPI_IPEDCTXCTRL_CTX14_FREEZE1_SHIFT  (28U)\r\n/*! CTX14_FREEZE1 - Controls the RW properties of this field and region 14 context registers (CTX14_xxxx). */\r\n#define FLEXSPI_IPEDCTXCTRL_CTX14_FREEZE1(x)     (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTXCTRL_CTX14_FREEZE1_SHIFT)) & FLEXSPI_IPEDCTXCTRL_CTX14_FREEZE1_MASK)\r\n/*! @} */\r\n\r\n/* The count of FLEXSPI_IPEDCTXCTRL */\r\n#define FLEXSPI_IPEDCTXCTRL_COUNT                (2U)\r\n\r\n/*! @name IPEDCTX0IV0 - IPED context0 IV0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX0IV0_CTX0_IV0_MASK        (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX0IV0_CTX0_IV0_SHIFT       (0U)\r\n/*! CTX0_IV0 - Lowest 32 bits of IV for region 0. */\r\n#define FLEXSPI_IPEDCTX0IV0_CTX0_IV0(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX0IV0_CTX0_IV0_SHIFT)) & FLEXSPI_IPEDCTX0IV0_CTX0_IV0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX0IV1 - IPED context0 IV1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX0IV1_CTX0_IV1_MASK        (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX0IV1_CTX0_IV1_SHIFT       (0U)\r\n/*! CTX0_IV1 - Highest 32 bits of IV for region 0. */\r\n#define FLEXSPI_IPEDCTX0IV1_CTX0_IV1(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX0IV1_CTX0_IV1_SHIFT)) & FLEXSPI_IPEDCTX0IV1_CTX0_IV1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX0START - Start address of region 0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX0START_GCM_MASK           (0x1U)\r\n#define FLEXSPI_IPEDCTX0START_GCM_SHIFT          (0U)\r\n/*! GCM - If this bit is 1, current region is GCM mode region. */\r\n#define FLEXSPI_IPEDCTX0START_GCM(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX0START_GCM_SHIFT)) & FLEXSPI_IPEDCTX0START_GCM_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX0START_AHBBUSERROR_DIS_MASK (0x2U)\r\n#define FLEXSPI_IPEDCTX0START_AHBBUSERROR_DIS_SHIFT (1U)\r\n/*! AHBBUSERROR_DIS - If this bit is 1, ahb bus error is disable. */\r\n#define FLEXSPI_IPEDCTX0START_AHBBUSERROR_DIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX0START_AHBBUSERROR_DIS_SHIFT)) & FLEXSPI_IPEDCTX0START_AHBBUSERROR_DIS_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX0START_START_ADDRESS_MASK (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX0START_START_ADDRESS_SHIFT (8U)\r\n/*! START_ADDRESS - Start address of region 0. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX0START_START_ADDRESS(x)   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX0START_START_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX0START_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX0END - End address of region 0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX0END_END_ADDRESS_MASK     (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX0END_END_ADDRESS_SHIFT    (8U)\r\n/*! END_ADDRESS - End address of region 0. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX0END_END_ADDRESS(x)       (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX0END_END_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX0END_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX0AAD0 - IPED context0 AAD0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX0AAD0_CTX0_AAD0_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX0AAD0_CTX0_AAD0_SHIFT     (0U)\r\n/*! CTX0_AAD0 - Lowest 32 bits of AAD for region 0. */\r\n#define FLEXSPI_IPEDCTX0AAD0_CTX0_AAD0(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX0AAD0_CTX0_AAD0_SHIFT)) & FLEXSPI_IPEDCTX0AAD0_CTX0_AAD0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX0AAD1 - IPED context0 AAD1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX0AAD1_CTX0_AAD1_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX0AAD1_CTX0_AAD1_SHIFT     (0U)\r\n/*! CTX0_AAD1 - Highest 32 bits of AAD for region 0. */\r\n#define FLEXSPI_IPEDCTX0AAD1_CTX0_AAD1(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX0AAD1_CTX0_AAD1_SHIFT)) & FLEXSPI_IPEDCTX0AAD1_CTX0_AAD1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX1IV0 - IPED context1 IV0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX1IV0_CTX1_IV0_MASK        (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX1IV0_CTX1_IV0_SHIFT       (0U)\r\n/*! CTX1_IV0 - Lowest 32 bits of IV for region 1. */\r\n#define FLEXSPI_IPEDCTX1IV0_CTX1_IV0(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX1IV0_CTX1_IV0_SHIFT)) & FLEXSPI_IPEDCTX1IV0_CTX1_IV0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX1IV1 - IPED context1 IV1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX1IV1_CTX1_IV1_MASK        (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX1IV1_CTX1_IV1_SHIFT       (0U)\r\n/*! CTX1_IV1 - Highest 32 bits of IV for region 1. */\r\n#define FLEXSPI_IPEDCTX1IV1_CTX1_IV1(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX1IV1_CTX1_IV1_SHIFT)) & FLEXSPI_IPEDCTX1IV1_CTX1_IV1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX1START - Start address of region 1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX1START_GCM_MASK           (0x1U)\r\n#define FLEXSPI_IPEDCTX1START_GCM_SHIFT          (0U)\r\n/*! GCM - If this bit is 1, current region is GCM mode region. */\r\n#define FLEXSPI_IPEDCTX1START_GCM(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX1START_GCM_SHIFT)) & FLEXSPI_IPEDCTX1START_GCM_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX1START_AHBBUSERROR_DIS_MASK (0x2U)\r\n#define FLEXSPI_IPEDCTX1START_AHBBUSERROR_DIS_SHIFT (1U)\r\n/*! AHBBUSERROR_DIS - If this bit is 1, ahb bus error is disable. */\r\n#define FLEXSPI_IPEDCTX1START_AHBBUSERROR_DIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX1START_AHBBUSERROR_DIS_SHIFT)) & FLEXSPI_IPEDCTX1START_AHBBUSERROR_DIS_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX1START_START_ADDRESS_MASK (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX1START_START_ADDRESS_SHIFT (8U)\r\n/*! START_ADDRESS - Start address of region 1. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX1START_START_ADDRESS(x)   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX1START_START_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX1START_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX1END - End address of region 1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX1END_END_ADDRESS_MASK     (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX1END_END_ADDRESS_SHIFT    (8U)\r\n/*! END_ADDRESS - End address of region 1. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX1END_END_ADDRESS(x)       (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX1END_END_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX1END_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX1AAD0 - IPED context1 AAD0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX1AAD0_CTX1_AAD0_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX1AAD0_CTX1_AAD0_SHIFT     (0U)\r\n/*! CTX1_AAD0 - Lowest 32 bits of AAD for region 1. */\r\n#define FLEXSPI_IPEDCTX1AAD0_CTX1_AAD0(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX1AAD0_CTX1_AAD0_SHIFT)) & FLEXSPI_IPEDCTX1AAD0_CTX1_AAD0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX1AAD1 - IPED context1 AAD1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX1AAD1_CTX1_AAD1_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX1AAD1_CTX1_AAD1_SHIFT     (0U)\r\n/*! CTX1_AAD1 - Highest 32 bits of AAD for region 1. */\r\n#define FLEXSPI_IPEDCTX1AAD1_CTX1_AAD1(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX1AAD1_CTX1_AAD1_SHIFT)) & FLEXSPI_IPEDCTX1AAD1_CTX1_AAD1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX2IV0 - IPED context2 IV0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX2IV0_CTX2_IV0_MASK        (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX2IV0_CTX2_IV0_SHIFT       (0U)\r\n/*! CTX2_IV0 - Lowest 32 bits of IV for region 2. */\r\n#define FLEXSPI_IPEDCTX2IV0_CTX2_IV0(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX2IV0_CTX2_IV0_SHIFT)) & FLEXSPI_IPEDCTX2IV0_CTX2_IV0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX2IV1 - IPED context2 IV1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX2IV1_CTX2_IV1_MASK        (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX2IV1_CTX2_IV1_SHIFT       (0U)\r\n/*! CTX2_IV1 - Highest 32 bits of IV for region 2. */\r\n#define FLEXSPI_IPEDCTX2IV1_CTX2_IV1(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX2IV1_CTX2_IV1_SHIFT)) & FLEXSPI_IPEDCTX2IV1_CTX2_IV1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX2START - Start address of region 2 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX2START_GCM_MASK           (0x1U)\r\n#define FLEXSPI_IPEDCTX2START_GCM_SHIFT          (0U)\r\n/*! GCM - If this bit is 1, current region is GCM mode region. */\r\n#define FLEXSPI_IPEDCTX2START_GCM(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX2START_GCM_SHIFT)) & FLEXSPI_IPEDCTX2START_GCM_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX2START_AHBBUSERROR_DIS_MASK (0x2U)\r\n#define FLEXSPI_IPEDCTX2START_AHBBUSERROR_DIS_SHIFT (1U)\r\n/*! AHBBUSERROR_DIS - If this bit is 1, ahb bus error is disable. */\r\n#define FLEXSPI_IPEDCTX2START_AHBBUSERROR_DIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX2START_AHBBUSERROR_DIS_SHIFT)) & FLEXSPI_IPEDCTX2START_AHBBUSERROR_DIS_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX2START_START_ADDRESS_MASK (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX2START_START_ADDRESS_SHIFT (8U)\r\n/*! START_ADDRESS - Start address of region 2. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX2START_START_ADDRESS(x)   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX2START_START_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX2START_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX2END - End address of region 2 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX2END_END_ADDRESS_MASK     (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX2END_END_ADDRESS_SHIFT    (8U)\r\n/*! END_ADDRESS - End address of region 2. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX2END_END_ADDRESS(x)       (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX2END_END_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX2END_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX2AAD0 - IPED context2 AAD0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX2AAD0_CTX2_AAD0_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX2AAD0_CTX2_AAD0_SHIFT     (0U)\r\n/*! CTX2_AAD0 - Lowest 32 bits of AAD for region 2. */\r\n#define FLEXSPI_IPEDCTX2AAD0_CTX2_AAD0(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX2AAD0_CTX2_AAD0_SHIFT)) & FLEXSPI_IPEDCTX2AAD0_CTX2_AAD0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX2AAD1 - IPED context2 AAD1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX2AAD1_CTX2_AAD1_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX2AAD1_CTX2_AAD1_SHIFT     (0U)\r\n/*! CTX2_AAD1 - Highest 32 bits of AAD for region 2. */\r\n#define FLEXSPI_IPEDCTX2AAD1_CTX2_AAD1(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX2AAD1_CTX2_AAD1_SHIFT)) & FLEXSPI_IPEDCTX2AAD1_CTX2_AAD1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX3IV0 - IPED context3 IV0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX3IV0_CTX3_IV0_MASK        (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX3IV0_CTX3_IV0_SHIFT       (0U)\r\n/*! CTX3_IV0 - Lowest 32 bits of IV for region 3. */\r\n#define FLEXSPI_IPEDCTX3IV0_CTX3_IV0(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX3IV0_CTX3_IV0_SHIFT)) & FLEXSPI_IPEDCTX3IV0_CTX3_IV0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX3IV1 - IPED context3 IV1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX3IV1_CTX3_IV1_MASK        (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX3IV1_CTX3_IV1_SHIFT       (0U)\r\n/*! CTX3_IV1 - Highest 32 bits of IV for region 3. */\r\n#define FLEXSPI_IPEDCTX3IV1_CTX3_IV1(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX3IV1_CTX3_IV1_SHIFT)) & FLEXSPI_IPEDCTX3IV1_CTX3_IV1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX3START - Start address of region 3 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX3START_GCM_MASK           (0x1U)\r\n#define FLEXSPI_IPEDCTX3START_GCM_SHIFT          (0U)\r\n/*! GCM - If this bit is 1, current region is GCM mode region. */\r\n#define FLEXSPI_IPEDCTX3START_GCM(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX3START_GCM_SHIFT)) & FLEXSPI_IPEDCTX3START_GCM_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX3START_AHBBUSERROR_DIS_MASK (0x2U)\r\n#define FLEXSPI_IPEDCTX3START_AHBBUSERROR_DIS_SHIFT (1U)\r\n/*! AHBBUSERROR_DIS - If this bit is 1, ahb bus error is disable. */\r\n#define FLEXSPI_IPEDCTX3START_AHBBUSERROR_DIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX3START_AHBBUSERROR_DIS_SHIFT)) & FLEXSPI_IPEDCTX3START_AHBBUSERROR_DIS_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX3START_START_ADDRESS_MASK (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX3START_START_ADDRESS_SHIFT (8U)\r\n/*! START_ADDRESS - Start address of region 3. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX3START_START_ADDRESS(x)   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX3START_START_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX3START_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX3END - End address of region 3 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX3END_END_ADDRESS_MASK     (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX3END_END_ADDRESS_SHIFT    (8U)\r\n/*! END_ADDRESS - End address of region 3. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX3END_END_ADDRESS(x)       (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX3END_END_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX3END_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX3AAD0 - IPED context3 AAD0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX3AAD0_CTX3_AAD0_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX3AAD0_CTX3_AAD0_SHIFT     (0U)\r\n/*! CTX3_AAD0 - Lowest 32 bits of AAD for region 3. */\r\n#define FLEXSPI_IPEDCTX3AAD0_CTX3_AAD0(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX3AAD0_CTX3_AAD0_SHIFT)) & FLEXSPI_IPEDCTX3AAD0_CTX3_AAD0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX3AAD1 - IPED context3 AAD1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX3AAD1_CTX3_AAD1_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX3AAD1_CTX3_AAD1_SHIFT     (0U)\r\n/*! CTX3_AAD1 - Highest 32 bits of AAD for region 3. */\r\n#define FLEXSPI_IPEDCTX3AAD1_CTX3_AAD1(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX3AAD1_CTX3_AAD1_SHIFT)) & FLEXSPI_IPEDCTX3AAD1_CTX3_AAD1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX4IV0 - IPED context4 IV0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX4IV0_CTX4_IV0_MASK        (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX4IV0_CTX4_IV0_SHIFT       (0U)\r\n/*! CTX4_IV0 - Lowest 32 bits of IV for region 4. */\r\n#define FLEXSPI_IPEDCTX4IV0_CTX4_IV0(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX4IV0_CTX4_IV0_SHIFT)) & FLEXSPI_IPEDCTX4IV0_CTX4_IV0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX4IV1 - IPED context4 IV1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX4IV1_CTX4_IV1_MASK        (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX4IV1_CTX4_IV1_SHIFT       (0U)\r\n/*! CTX4_IV1 - Highest 32 bits of IV for region 4. */\r\n#define FLEXSPI_IPEDCTX4IV1_CTX4_IV1(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX4IV1_CTX4_IV1_SHIFT)) & FLEXSPI_IPEDCTX4IV1_CTX4_IV1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX4START - Start address of region 4 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX4START_GCM_MASK           (0x1U)\r\n#define FLEXSPI_IPEDCTX4START_GCM_SHIFT          (0U)\r\n/*! GCM - If this bit is 1, current region is GCM mode region. */\r\n#define FLEXSPI_IPEDCTX4START_GCM(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX4START_GCM_SHIFT)) & FLEXSPI_IPEDCTX4START_GCM_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX4START_AHBBUSERROR_DIS_MASK (0x2U)\r\n#define FLEXSPI_IPEDCTX4START_AHBBUSERROR_DIS_SHIFT (1U)\r\n/*! AHBBUSERROR_DIS - If this bit is 1, ahb bus error is disable. */\r\n#define FLEXSPI_IPEDCTX4START_AHBBUSERROR_DIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX4START_AHBBUSERROR_DIS_SHIFT)) & FLEXSPI_IPEDCTX4START_AHBBUSERROR_DIS_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX4START_START_ADDRESS_MASK (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX4START_START_ADDRESS_SHIFT (8U)\r\n/*! START_ADDRESS - Start address of region 4. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX4START_START_ADDRESS(x)   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX4START_START_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX4START_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX4END - End address of region 4 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX4END_END_ADDRESS_MASK     (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX4END_END_ADDRESS_SHIFT    (8U)\r\n/*! END_ADDRESS - End address of region 4. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX4END_END_ADDRESS(x)       (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX4END_END_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX4END_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX4AAD0 - IPED context4 AAD0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX4AAD0_CTX4_AAD0_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX4AAD0_CTX4_AAD0_SHIFT     (0U)\r\n/*! CTX4_AAD0 - Lowest 32 bits of AAD for region 4. */\r\n#define FLEXSPI_IPEDCTX4AAD0_CTX4_AAD0(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX4AAD0_CTX4_AAD0_SHIFT)) & FLEXSPI_IPEDCTX4AAD0_CTX4_AAD0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX4AAD1 - IPED context4 AAD1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX4AAD1_CTX4_AAD1_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX4AAD1_CTX4_AAD1_SHIFT     (0U)\r\n/*! CTX4_AAD1 - Highest 32 bits of AAD for region 4. */\r\n#define FLEXSPI_IPEDCTX4AAD1_CTX4_AAD1(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX4AAD1_CTX4_AAD1_SHIFT)) & FLEXSPI_IPEDCTX4AAD1_CTX4_AAD1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX5IV0 - IPED context5 IV0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX5IV0_CTX5_IV0_MASK        (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX5IV0_CTX5_IV0_SHIFT       (0U)\r\n/*! CTX5_IV0 - Lowest 32 bits of IV for region 5. */\r\n#define FLEXSPI_IPEDCTX5IV0_CTX5_IV0(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX5IV0_CTX5_IV0_SHIFT)) & FLEXSPI_IPEDCTX5IV0_CTX5_IV0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX5IV1 - IPED context5 IV1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX5IV1_CTX5_IV1_MASK        (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX5IV1_CTX5_IV1_SHIFT       (0U)\r\n/*! CTX5_IV1 - Highest 32 bits of IV for region 5. */\r\n#define FLEXSPI_IPEDCTX5IV1_CTX5_IV1(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX5IV1_CTX5_IV1_SHIFT)) & FLEXSPI_IPEDCTX5IV1_CTX5_IV1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX5START - Start address of region 5 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX5START_GCM_MASK           (0x1U)\r\n#define FLEXSPI_IPEDCTX5START_GCM_SHIFT          (0U)\r\n/*! GCM - If this bit is 1, current region is GCM mode region. */\r\n#define FLEXSPI_IPEDCTX5START_GCM(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX5START_GCM_SHIFT)) & FLEXSPI_IPEDCTX5START_GCM_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX5START_AHBBUSERROR_DIS_MASK (0x2U)\r\n#define FLEXSPI_IPEDCTX5START_AHBBUSERROR_DIS_SHIFT (1U)\r\n/*! AHBBUSERROR_DIS - If this bit is 1, ahb bus error is disable. */\r\n#define FLEXSPI_IPEDCTX5START_AHBBUSERROR_DIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX5START_AHBBUSERROR_DIS_SHIFT)) & FLEXSPI_IPEDCTX5START_AHBBUSERROR_DIS_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX5START_START_ADDRESS_MASK (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX5START_START_ADDRESS_SHIFT (8U)\r\n/*! START_ADDRESS - Start address of region 5. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX5START_START_ADDRESS(x)   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX5START_START_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX5START_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX5END - End address of region 5 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX5END_END_ADDRESS_MASK     (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX5END_END_ADDRESS_SHIFT    (8U)\r\n/*! END_ADDRESS - End address of region 5. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX5END_END_ADDRESS(x)       (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX5END_END_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX5END_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX5AAD0 - IPED context5 AAD0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX5AAD0_CTX5_AAD0_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX5AAD0_CTX5_AAD0_SHIFT     (0U)\r\n/*! CTX5_AAD0 - Lowest 32 bits of AAD for region 5. */\r\n#define FLEXSPI_IPEDCTX5AAD0_CTX5_AAD0(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX5AAD0_CTX5_AAD0_SHIFT)) & FLEXSPI_IPEDCTX5AAD0_CTX5_AAD0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX5AAD1 - IPED context5 AAD1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX5AAD1_CTX5_AAD1_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX5AAD1_CTX5_AAD1_SHIFT     (0U)\r\n/*! CTX5_AAD1 - Highest 32 bits of AAD for region 5. */\r\n#define FLEXSPI_IPEDCTX5AAD1_CTX5_AAD1(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX5AAD1_CTX5_AAD1_SHIFT)) & FLEXSPI_IPEDCTX5AAD1_CTX5_AAD1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX6IV0 - IPED context6 IV0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX6IV0_CTX6_IV0_MASK        (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX6IV0_CTX6_IV0_SHIFT       (0U)\r\n/*! CTX6_IV0 - Lowest 32 bits of IV for region 6. */\r\n#define FLEXSPI_IPEDCTX6IV0_CTX6_IV0(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX6IV0_CTX6_IV0_SHIFT)) & FLEXSPI_IPEDCTX6IV0_CTX6_IV0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX6IV1 - IPED context6 IV1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX6IV1_CTX6_IV1_MASK        (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX6IV1_CTX6_IV1_SHIFT       (0U)\r\n/*! CTX6_IV1 - Highest 32 bits of IV for region 6. */\r\n#define FLEXSPI_IPEDCTX6IV1_CTX6_IV1(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX6IV1_CTX6_IV1_SHIFT)) & FLEXSPI_IPEDCTX6IV1_CTX6_IV1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX6START - Start address of region 6 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX6START_GCM_MASK           (0x1U)\r\n#define FLEXSPI_IPEDCTX6START_GCM_SHIFT          (0U)\r\n/*! GCM - If this bit is 1, current region is GCM mode region. */\r\n#define FLEXSPI_IPEDCTX6START_GCM(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX6START_GCM_SHIFT)) & FLEXSPI_IPEDCTX6START_GCM_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX6START_AHBBUSERROR_DIS_MASK (0x2U)\r\n#define FLEXSPI_IPEDCTX6START_AHBBUSERROR_DIS_SHIFT (1U)\r\n/*! AHBBUSERROR_DIS - If this bit is 1, ahb bus error is disable. */\r\n#define FLEXSPI_IPEDCTX6START_AHBBUSERROR_DIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX6START_AHBBUSERROR_DIS_SHIFT)) & FLEXSPI_IPEDCTX6START_AHBBUSERROR_DIS_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX6START_START_ADDRESS_MASK (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX6START_START_ADDRESS_SHIFT (8U)\r\n/*! START_ADDRESS - Start address of region 6. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX6START_START_ADDRESS(x)   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX6START_START_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX6START_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX6END - End address of region 6 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX6END_END_ADDRESS_MASK     (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX6END_END_ADDRESS_SHIFT    (8U)\r\n/*! END_ADDRESS - End address of region 6. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX6END_END_ADDRESS(x)       (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX6END_END_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX6END_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX6AAD0 - IPED context6 AAD0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX6AAD0_CTX6_AAD0_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX6AAD0_CTX6_AAD0_SHIFT     (0U)\r\n/*! CTX6_AAD0 - Lowest 32 bits of AAD for region 6. */\r\n#define FLEXSPI_IPEDCTX6AAD0_CTX6_AAD0(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX6AAD0_CTX6_AAD0_SHIFT)) & FLEXSPI_IPEDCTX6AAD0_CTX6_AAD0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX6AAD1 - IPED context6 AAD1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX6AAD1_CTX6_AAD1_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX6AAD1_CTX6_AAD1_SHIFT     (0U)\r\n/*! CTX6_AAD1 - Highest 32 bits of AAD for region 6. */\r\n#define FLEXSPI_IPEDCTX6AAD1_CTX6_AAD1(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX6AAD1_CTX6_AAD1_SHIFT)) & FLEXSPI_IPEDCTX6AAD1_CTX6_AAD1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX7IV0 - IPED context7 IV0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX7IV0_CTX7_IV0_MASK        (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX7IV0_CTX7_IV0_SHIFT       (0U)\r\n/*! CTX7_IV0 - Lowest 32 bits of IV for region 7. */\r\n#define FLEXSPI_IPEDCTX7IV0_CTX7_IV0(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX7IV0_CTX7_IV0_SHIFT)) & FLEXSPI_IPEDCTX7IV0_CTX7_IV0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX7IV1 - IPED context7 IV1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX7IV1_CTX7_IV1_MASK        (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX7IV1_CTX7_IV1_SHIFT       (0U)\r\n/*! CTX7_IV1 - Highest 32 bits of IV for region 7. */\r\n#define FLEXSPI_IPEDCTX7IV1_CTX7_IV1(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX7IV1_CTX7_IV1_SHIFT)) & FLEXSPI_IPEDCTX7IV1_CTX7_IV1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX7START - Start address of region 7 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX7START_GCM_MASK           (0x1U)\r\n#define FLEXSPI_IPEDCTX7START_GCM_SHIFT          (0U)\r\n/*! GCM - If this bit is 1, current region is GCM mode region. */\r\n#define FLEXSPI_IPEDCTX7START_GCM(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX7START_GCM_SHIFT)) & FLEXSPI_IPEDCTX7START_GCM_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX7START_AHBBUSERROR_DIS_MASK (0x2U)\r\n#define FLEXSPI_IPEDCTX7START_AHBBUSERROR_DIS_SHIFT (1U)\r\n/*! AHBBUSERROR_DIS - If this bit is 1, ahb bus error is disable. */\r\n#define FLEXSPI_IPEDCTX7START_AHBBUSERROR_DIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX7START_AHBBUSERROR_DIS_SHIFT)) & FLEXSPI_IPEDCTX7START_AHBBUSERROR_DIS_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX7START_START_ADDRESS_MASK (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX7START_START_ADDRESS_SHIFT (8U)\r\n/*! START_ADDRESS - Start address of region 7. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX7START_START_ADDRESS(x)   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX7START_START_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX7START_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX7END - End address of region 7 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX7END_END_ADDRESS_MASK     (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX7END_END_ADDRESS_SHIFT    (8U)\r\n/*! END_ADDRESS - End address of region 7. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX7END_END_ADDRESS(x)       (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX7END_END_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX7END_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX7AAD0 - IPED context7 AAD0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX7AAD0_CTX7_AAD0_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX7AAD0_CTX7_AAD0_SHIFT     (0U)\r\n/*! CTX7_AAD0 - Lowest 32 bits of AAD for region 7. */\r\n#define FLEXSPI_IPEDCTX7AAD0_CTX7_AAD0(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX7AAD0_CTX7_AAD0_SHIFT)) & FLEXSPI_IPEDCTX7AAD0_CTX7_AAD0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX7AAD1 - IPED context7 AAD1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX7AAD1_CTX7_AAD1_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX7AAD1_CTX7_AAD1_SHIFT     (0U)\r\n/*! CTX7_AAD1 - Highest 32 bits of AAD for region 7. */\r\n#define FLEXSPI_IPEDCTX7AAD1_CTX7_AAD1(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX7AAD1_CTX7_AAD1_SHIFT)) & FLEXSPI_IPEDCTX7AAD1_CTX7_AAD1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX8IV0 - IPED context8 IV0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX8IV0_CTX8_IV0_MASK        (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX8IV0_CTX8_IV0_SHIFT       (0U)\r\n/*! CTX8_IV0 - Lowest 32 bits of IV for region 8. */\r\n#define FLEXSPI_IPEDCTX8IV0_CTX8_IV0(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX8IV0_CTX8_IV0_SHIFT)) & FLEXSPI_IPEDCTX8IV0_CTX8_IV0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX8IV1 - IPED context8 IV1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX8IV1_CTX8_IV1_MASK        (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX8IV1_CTX8_IV1_SHIFT       (0U)\r\n/*! CTX8_IV1 - Highest 32 bits of IV for region 8. */\r\n#define FLEXSPI_IPEDCTX8IV1_CTX8_IV1(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX8IV1_CTX8_IV1_SHIFT)) & FLEXSPI_IPEDCTX8IV1_CTX8_IV1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX8START - Start address of region 8 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX8START_GCM_MASK           (0x1U)\r\n#define FLEXSPI_IPEDCTX8START_GCM_SHIFT          (0U)\r\n/*! GCM - If this bit is 1, current region is GCM mode region. */\r\n#define FLEXSPI_IPEDCTX8START_GCM(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX8START_GCM_SHIFT)) & FLEXSPI_IPEDCTX8START_GCM_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX8START_AHBBUSERROR_DIS_MASK (0x2U)\r\n#define FLEXSPI_IPEDCTX8START_AHBBUSERROR_DIS_SHIFT (1U)\r\n/*! AHBBUSERROR_DIS - If this bit is 1, ahb bus error is disable. */\r\n#define FLEXSPI_IPEDCTX8START_AHBBUSERROR_DIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX8START_AHBBUSERROR_DIS_SHIFT)) & FLEXSPI_IPEDCTX8START_AHBBUSERROR_DIS_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX8START_START_ADDRESS_MASK (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX8START_START_ADDRESS_SHIFT (8U)\r\n/*! START_ADDRESS - Start address of region 8. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX8START_START_ADDRESS(x)   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX8START_START_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX8START_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX8END - End address of region 8 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX8END_END_ADDRESS_MASK     (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX8END_END_ADDRESS_SHIFT    (8U)\r\n/*! END_ADDRESS - End address of region 8. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX8END_END_ADDRESS(x)       (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX8END_END_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX8END_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX8AAD0 - IPED context8 AAD0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX8AAD0_CTX8_AAD0_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX8AAD0_CTX8_AAD0_SHIFT     (0U)\r\n/*! CTX8_AAD0 - Lowest 32 bits of AAD for region 8. */\r\n#define FLEXSPI_IPEDCTX8AAD0_CTX8_AAD0(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX8AAD0_CTX8_AAD0_SHIFT)) & FLEXSPI_IPEDCTX8AAD0_CTX8_AAD0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX8AAD1 - IPED context8 AAD1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX8AAD1_CTX8_AAD1_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX8AAD1_CTX8_AAD1_SHIFT     (0U)\r\n/*! CTX8_AAD1 - Highest 32 bits of AAD for region 8. */\r\n#define FLEXSPI_IPEDCTX8AAD1_CTX8_AAD1(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX8AAD1_CTX8_AAD1_SHIFT)) & FLEXSPI_IPEDCTX8AAD1_CTX8_AAD1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX9IV0 - IPED context9 IV0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX9IV0_CTX9_IV0_MASK        (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX9IV0_CTX9_IV0_SHIFT       (0U)\r\n/*! CTX9_IV0 - Lowest 32 bits of IV for region 9. */\r\n#define FLEXSPI_IPEDCTX9IV0_CTX9_IV0(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX9IV0_CTX9_IV0_SHIFT)) & FLEXSPI_IPEDCTX9IV0_CTX9_IV0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX9IV1 - IPED context9 IV1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX9IV1_CTX9_IV1_MASK        (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX9IV1_CTX9_IV1_SHIFT       (0U)\r\n/*! CTX9_IV1 - Highest 32 bits of IV for region 9. */\r\n#define FLEXSPI_IPEDCTX9IV1_CTX9_IV1(x)          (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX9IV1_CTX9_IV1_SHIFT)) & FLEXSPI_IPEDCTX9IV1_CTX9_IV1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX9START - Start address of region 9 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX9START_GCM_MASK           (0x1U)\r\n#define FLEXSPI_IPEDCTX9START_GCM_SHIFT          (0U)\r\n/*! GCM - If this bit is 1, current region is GCM mode region. */\r\n#define FLEXSPI_IPEDCTX9START_GCM(x)             (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX9START_GCM_SHIFT)) & FLEXSPI_IPEDCTX9START_GCM_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX9START_AHBBUSERROR_DIS_MASK (0x2U)\r\n#define FLEXSPI_IPEDCTX9START_AHBBUSERROR_DIS_SHIFT (1U)\r\n/*! AHBBUSERROR_DIS - If this bit is 1, ahb bus error is disable. */\r\n#define FLEXSPI_IPEDCTX9START_AHBBUSERROR_DIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX9START_AHBBUSERROR_DIS_SHIFT)) & FLEXSPI_IPEDCTX9START_AHBBUSERROR_DIS_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX9START_START_ADDRESS_MASK (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX9START_START_ADDRESS_SHIFT (8U)\r\n/*! START_ADDRESS - Start address of region 9. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX9START_START_ADDRESS(x)   (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX9START_START_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX9START_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX9END - End address of region 9 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX9END_END_ADDRESS_MASK     (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX9END_END_ADDRESS_SHIFT    (8U)\r\n/*! END_ADDRESS - End address of region 9. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX9END_END_ADDRESS(x)       (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX9END_END_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX9END_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX9AAD0 - IPED context9 AAD0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX9AAD0_CTX9_AAD0_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX9AAD0_CTX9_AAD0_SHIFT     (0U)\r\n/*! CTX9_AAD0 - Lowest 32 bits of AAD for region 9. */\r\n#define FLEXSPI_IPEDCTX9AAD0_CTX9_AAD0(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX9AAD0_CTX9_AAD0_SHIFT)) & FLEXSPI_IPEDCTX9AAD0_CTX9_AAD0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX9AAD1 - IPED context9 AAD1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX9AAD1_CTX9_AAD1_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX9AAD1_CTX9_AAD1_SHIFT     (0U)\r\n/*! CTX9_AAD1 - Highest 32 bits of AAD for region 9. */\r\n#define FLEXSPI_IPEDCTX9AAD1_CTX9_AAD1(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX9AAD1_CTX9_AAD1_SHIFT)) & FLEXSPI_IPEDCTX9AAD1_CTX9_AAD1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX10IV0 - IPED context10 IV0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX10IV0_CTX10_IV0_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX10IV0_CTX10_IV0_SHIFT     (0U)\r\n/*! CTX10_IV0 - Lowest 32 bits of IV for region 10. */\r\n#define FLEXSPI_IPEDCTX10IV0_CTX10_IV0(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX10IV0_CTX10_IV0_SHIFT)) & FLEXSPI_IPEDCTX10IV0_CTX10_IV0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX10IV1 - IPED context10 IV1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX10IV1_CTX10_IV1_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX10IV1_CTX10_IV1_SHIFT     (0U)\r\n/*! CTX10_IV1 - Highest 32 bits of IV for region 10. */\r\n#define FLEXSPI_IPEDCTX10IV1_CTX10_IV1(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX10IV1_CTX10_IV1_SHIFT)) & FLEXSPI_IPEDCTX10IV1_CTX10_IV1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX10START - Start address of region 10 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX10START_GCM_MASK          (0x1U)\r\n#define FLEXSPI_IPEDCTX10START_GCM_SHIFT         (0U)\r\n/*! GCM - If this bit is 1, current region is GCM mode region. */\r\n#define FLEXSPI_IPEDCTX10START_GCM(x)            (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX10START_GCM_SHIFT)) & FLEXSPI_IPEDCTX10START_GCM_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX10START_AHBBUSERROR_DIS_MASK (0x2U)\r\n#define FLEXSPI_IPEDCTX10START_AHBBUSERROR_DIS_SHIFT (1U)\r\n/*! AHBBUSERROR_DIS - If this bit is 1, ahb bus error is disable. */\r\n#define FLEXSPI_IPEDCTX10START_AHBBUSERROR_DIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX10START_AHBBUSERROR_DIS_SHIFT)) & FLEXSPI_IPEDCTX10START_AHBBUSERROR_DIS_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX10START_START_ADDRESS_MASK (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX10START_START_ADDRESS_SHIFT (8U)\r\n/*! START_ADDRESS - Start address of region 10. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX10START_START_ADDRESS(x)  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX10START_START_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX10START_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX10END - End address of region 10 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX10END_END_ADDRESS_MASK    (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX10END_END_ADDRESS_SHIFT   (8U)\r\n/*! END_ADDRESS - End address of region 10. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX10END_END_ADDRESS(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX10END_END_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX10END_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX10AAD0 - IPED context10 AAD0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX10AAD0_CTX10_AAD0_MASK    (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX10AAD0_CTX10_AAD0_SHIFT   (0U)\r\n/*! CTX10_AAD0 - Lowest 32 bits of AAD for region 10. */\r\n#define FLEXSPI_IPEDCTX10AAD0_CTX10_AAD0(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX10AAD0_CTX10_AAD0_SHIFT)) & FLEXSPI_IPEDCTX10AAD0_CTX10_AAD0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX10AAD1 - IPED context10 AAD1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX10AAD1_CTX10_AAD1_MASK    (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX10AAD1_CTX10_AAD1_SHIFT   (0U)\r\n/*! CTX10_AAD1 - Highest 32 bits of AAD for region 10. */\r\n#define FLEXSPI_IPEDCTX10AAD1_CTX10_AAD1(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX10AAD1_CTX10_AAD1_SHIFT)) & FLEXSPI_IPEDCTX10AAD1_CTX10_AAD1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX11IV0 - IPED context11 IV0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX11IV0_CTX11_IV0_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX11IV0_CTX11_IV0_SHIFT     (0U)\r\n/*! CTX11_IV0 - Lowest 32 bits of IV for region 11. */\r\n#define FLEXSPI_IPEDCTX11IV0_CTX11_IV0(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX11IV0_CTX11_IV0_SHIFT)) & FLEXSPI_IPEDCTX11IV0_CTX11_IV0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX11IV1 - IPED context11 IV1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX11IV1_CTX11_IV1_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX11IV1_CTX11_IV1_SHIFT     (0U)\r\n/*! CTX11_IV1 - Highest 32 bits of IV for region 11. */\r\n#define FLEXSPI_IPEDCTX11IV1_CTX11_IV1(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX11IV1_CTX11_IV1_SHIFT)) & FLEXSPI_IPEDCTX11IV1_CTX11_IV1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX11START - Start address of region 11 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX11START_GCM_MASK          (0x1U)\r\n#define FLEXSPI_IPEDCTX11START_GCM_SHIFT         (0U)\r\n/*! GCM - If this bit is 1, current region is GCM mode region. */\r\n#define FLEXSPI_IPEDCTX11START_GCM(x)            (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX11START_GCM_SHIFT)) & FLEXSPI_IPEDCTX11START_GCM_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX11START_AHBBUSERROR_DIS_MASK (0x2U)\r\n#define FLEXSPI_IPEDCTX11START_AHBBUSERROR_DIS_SHIFT (1U)\r\n/*! AHBBUSERROR_DIS - If this bit is 1, ahb bus error is disable. */\r\n#define FLEXSPI_IPEDCTX11START_AHBBUSERROR_DIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX11START_AHBBUSERROR_DIS_SHIFT)) & FLEXSPI_IPEDCTX11START_AHBBUSERROR_DIS_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX11START_START_ADDRESS_MASK (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX11START_START_ADDRESS_SHIFT (8U)\r\n/*! START_ADDRESS - Start address of region 11. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX11START_START_ADDRESS(x)  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX11START_START_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX11START_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX11END - End address of region 11 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX11END_END_ADDRESS_MASK    (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX11END_END_ADDRESS_SHIFT   (8U)\r\n/*! END_ADDRESS - End address of region 11. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX11END_END_ADDRESS(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX11END_END_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX11END_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX11AAD0 - IPED context11 AAD0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX11AAD0_CTX11_AAD0_MASK    (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX11AAD0_CTX11_AAD0_SHIFT   (0U)\r\n/*! CTX11_AAD0 - Lowest 32 bits of AAD for region 11. */\r\n#define FLEXSPI_IPEDCTX11AAD0_CTX11_AAD0(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX11AAD0_CTX11_AAD0_SHIFT)) & FLEXSPI_IPEDCTX11AAD0_CTX11_AAD0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX11AAD1 - IPED context11 AAD1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX11AAD1_CTX11_AAD1_MASK    (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX11AAD1_CTX11_AAD1_SHIFT   (0U)\r\n/*! CTX11_AAD1 - Highest 32 bits of AAD for region 11. */\r\n#define FLEXSPI_IPEDCTX11AAD1_CTX11_AAD1(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX11AAD1_CTX11_AAD1_SHIFT)) & FLEXSPI_IPEDCTX11AAD1_CTX11_AAD1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX12IV0 - IPED context12 IV0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX12IV0_CTX12_IV0_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX12IV0_CTX12_IV0_SHIFT     (0U)\r\n/*! CTX12_IV0 - Lowest 32 bits of IV for region 12. */\r\n#define FLEXSPI_IPEDCTX12IV0_CTX12_IV0(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX12IV0_CTX12_IV0_SHIFT)) & FLEXSPI_IPEDCTX12IV0_CTX12_IV0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX12IV1 - IPED context12 IV1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX12IV1_CTX12_IV1_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX12IV1_CTX12_IV1_SHIFT     (0U)\r\n/*! CTX12_IV1 - Highest 32 bits of IV for region 12. */\r\n#define FLEXSPI_IPEDCTX12IV1_CTX12_IV1(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX12IV1_CTX12_IV1_SHIFT)) & FLEXSPI_IPEDCTX12IV1_CTX12_IV1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX12START - Start address of region 12 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX12START_GCM_MASK          (0x1U)\r\n#define FLEXSPI_IPEDCTX12START_GCM_SHIFT         (0U)\r\n/*! GCM - If this bit is 1, current region is GCM mode region. */\r\n#define FLEXSPI_IPEDCTX12START_GCM(x)            (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX12START_GCM_SHIFT)) & FLEXSPI_IPEDCTX12START_GCM_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX12START_AHBBUSERROR_DIS_MASK (0x2U)\r\n#define FLEXSPI_IPEDCTX12START_AHBBUSERROR_DIS_SHIFT (1U)\r\n/*! AHBBUSERROR_DIS - If this bit is 1, ahb bus error is disable. */\r\n#define FLEXSPI_IPEDCTX12START_AHBBUSERROR_DIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX12START_AHBBUSERROR_DIS_SHIFT)) & FLEXSPI_IPEDCTX12START_AHBBUSERROR_DIS_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX12START_START_ADDRESS_MASK (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX12START_START_ADDRESS_SHIFT (8U)\r\n/*! START_ADDRESS - Start address of region 12. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX12START_START_ADDRESS(x)  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX12START_START_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX12START_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX12END - End address of region 12 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX12END_END_ADDRESS_MASK    (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX12END_END_ADDRESS_SHIFT   (8U)\r\n/*! END_ADDRESS - End address of region 12. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX12END_END_ADDRESS(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX12END_END_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX12END_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX12AAD0 - IPED context12 AAD0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX12AAD0_CTX12_AAD0_MASK    (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX12AAD0_CTX12_AAD0_SHIFT   (0U)\r\n/*! CTX12_AAD0 - Lowest 32 bits of AAD for region 12. */\r\n#define FLEXSPI_IPEDCTX12AAD0_CTX12_AAD0(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX12AAD0_CTX12_AAD0_SHIFT)) & FLEXSPI_IPEDCTX12AAD0_CTX12_AAD0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX12AAD1 - IPED context12 AAD1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX12AAD1_CTX12_AAD1_MASK    (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX12AAD1_CTX12_AAD1_SHIFT   (0U)\r\n/*! CTX12_AAD1 - Highest 32 bits of AAD for region 12. */\r\n#define FLEXSPI_IPEDCTX12AAD1_CTX12_AAD1(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX12AAD1_CTX12_AAD1_SHIFT)) & FLEXSPI_IPEDCTX12AAD1_CTX12_AAD1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX13IV0 - IPED context13 IV0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX13IV0_CTX13_IV0_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX13IV0_CTX13_IV0_SHIFT     (0U)\r\n/*! CTX13_IV0 - Lowest 32 bits of IV for region 13. */\r\n#define FLEXSPI_IPEDCTX13IV0_CTX13_IV0(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX13IV0_CTX13_IV0_SHIFT)) & FLEXSPI_IPEDCTX13IV0_CTX13_IV0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX13IV1 - IPED context13 IV1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX13IV1_CTX13_IV1_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX13IV1_CTX13_IV1_SHIFT     (0U)\r\n/*! CTX13_IV1 - Highest 32 bits of IV for region 13. */\r\n#define FLEXSPI_IPEDCTX13IV1_CTX13_IV1(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX13IV1_CTX13_IV1_SHIFT)) & FLEXSPI_IPEDCTX13IV1_CTX13_IV1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX13START - Start address of region 13 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX13START_GCM_MASK          (0x1U)\r\n#define FLEXSPI_IPEDCTX13START_GCM_SHIFT         (0U)\r\n/*! GCM - If this bit is 1, current region is GCM mode region. */\r\n#define FLEXSPI_IPEDCTX13START_GCM(x)            (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX13START_GCM_SHIFT)) & FLEXSPI_IPEDCTX13START_GCM_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX13START_AHBBUSERROR_DIS_MASK (0x2U)\r\n#define FLEXSPI_IPEDCTX13START_AHBBUSERROR_DIS_SHIFT (1U)\r\n/*! AHBBUSERROR_DIS - If this bit is 1, ahb bus error is disable. */\r\n#define FLEXSPI_IPEDCTX13START_AHBBUSERROR_DIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX13START_AHBBUSERROR_DIS_SHIFT)) & FLEXSPI_IPEDCTX13START_AHBBUSERROR_DIS_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX13START_START_ADDRESS_MASK (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX13START_START_ADDRESS_SHIFT (8U)\r\n/*! START_ADDRESS - Start address of region 13. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX13START_START_ADDRESS(x)  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX13START_START_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX13START_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX13END - End address of region 13 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX13END_END_ADDRESS_MASK    (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX13END_END_ADDRESS_SHIFT   (8U)\r\n/*! END_ADDRESS - End address of region 13. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX13END_END_ADDRESS(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX13END_END_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX13END_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX13AAD0 - IPED context13 AAD0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX13AAD0_CTX13_AAD0_MASK    (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX13AAD0_CTX13_AAD0_SHIFT   (0U)\r\n/*! CTX13_AAD0 - Lowest 32 bits of AAD for region 13. */\r\n#define FLEXSPI_IPEDCTX13AAD0_CTX13_AAD0(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX13AAD0_CTX13_AAD0_SHIFT)) & FLEXSPI_IPEDCTX13AAD0_CTX13_AAD0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX13AAD1 - IPED context13 AAD1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX13AAD1_CTX13_AAD1_MASK    (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX13AAD1_CTX13_AAD1_SHIFT   (0U)\r\n/*! CTX13_AAD1 - Highest 32 bits of AAD for region 13. */\r\n#define FLEXSPI_IPEDCTX13AAD1_CTX13_AAD1(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX13AAD1_CTX13_AAD1_SHIFT)) & FLEXSPI_IPEDCTX13AAD1_CTX13_AAD1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX14IV0 - IPED context14 IV0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX14IV0_CTX14_IV0_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX14IV0_CTX14_IV0_SHIFT     (0U)\r\n/*! CTX14_IV0 - Lowest 32 bits of IV for region 14. */\r\n#define FLEXSPI_IPEDCTX14IV0_CTX14_IV0(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX14IV0_CTX14_IV0_SHIFT)) & FLEXSPI_IPEDCTX14IV0_CTX14_IV0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX14IV1 - IPED context14 IV1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX14IV1_CTX14_IV1_MASK      (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX14IV1_CTX14_IV1_SHIFT     (0U)\r\n/*! CTX14_IV1 - Highest 32 bits of IV for region 14. */\r\n#define FLEXSPI_IPEDCTX14IV1_CTX14_IV1(x)        (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX14IV1_CTX14_IV1_SHIFT)) & FLEXSPI_IPEDCTX14IV1_CTX14_IV1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX14START - Start address of region 14 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX14START_GCM_MASK          (0x1U)\r\n#define FLEXSPI_IPEDCTX14START_GCM_SHIFT         (0U)\r\n/*! GCM - If this bit is 1, current region is GCM mode region. */\r\n#define FLEXSPI_IPEDCTX14START_GCM(x)            (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX14START_GCM_SHIFT)) & FLEXSPI_IPEDCTX14START_GCM_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX14START_AHBBUSERROR_DIS_MASK (0x2U)\r\n#define FLEXSPI_IPEDCTX14START_AHBBUSERROR_DIS_SHIFT (1U)\r\n/*! AHBBUSERROR_DIS - If this bit is 1, ahb bus error is disable. */\r\n#define FLEXSPI_IPEDCTX14START_AHBBUSERROR_DIS(x) (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX14START_AHBBUSERROR_DIS_SHIFT)) & FLEXSPI_IPEDCTX14START_AHBBUSERROR_DIS_MASK)\r\n\r\n#define FLEXSPI_IPEDCTX14START_START_ADDRESS_MASK (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX14START_START_ADDRESS_SHIFT (8U)\r\n/*! START_ADDRESS - Start address of region 14. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX14START_START_ADDRESS(x)  (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX14START_START_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX14START_START_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX14END - End address of region 14 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX14END_END_ADDRESS_MASK    (0xFFFFFF00U)\r\n#define FLEXSPI_IPEDCTX14END_END_ADDRESS_SHIFT   (8U)\r\n/*! END_ADDRESS - End address of region 14. Minimal 256 Bytes aligned. It is system address. */\r\n#define FLEXSPI_IPEDCTX14END_END_ADDRESS(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX14END_END_ADDRESS_SHIFT)) & FLEXSPI_IPEDCTX14END_END_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX14AAD0 - IPED context14 AAD0 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX14AAD0_CTX14_AAD0_MASK    (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX14AAD0_CTX14_AAD0_SHIFT   (0U)\r\n/*! CTX14_AAD0 - Lowest 32 bits of AAD for region 14. */\r\n#define FLEXSPI_IPEDCTX14AAD0_CTX14_AAD0(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX14AAD0_CTX14_AAD0_SHIFT)) & FLEXSPI_IPEDCTX14AAD0_CTX14_AAD0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IPEDCTX14AAD1 - IPED context14 AAD1 */\r\n/*! @{ */\r\n\r\n#define FLEXSPI_IPEDCTX14AAD1_CTX14_AAD1_MASK    (0xFFFFFFFFU)\r\n#define FLEXSPI_IPEDCTX14AAD1_CTX14_AAD1_SHIFT   (0U)\r\n/*! CTX14_AAD1 - Highest 32 bits of AAD for region 14. */\r\n#define FLEXSPI_IPEDCTX14AAD1_CTX14_AAD1(x)      (((uint32_t)(((uint32_t)(x)) << FLEXSPI_IPEDCTX14AAD1_CTX14_AAD1_SHIFT)) & FLEXSPI_IPEDCTX14AAD1_CTX14_AAD1_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group FLEXSPI_Register_Masks */\r\n\r\n\r\n/* FLEXSPI - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral FLEXSPI base address */\r\n  #define FLEXSPI_BASE                             (0x50134000u)\r\n  /** Peripheral FLEXSPI base address */\r\n  #define FLEXSPI_BASE_NS                          (0x40134000u)\r\n  /** Peripheral FLEXSPI base pointer */\r\n  #define FLEXSPI                                  ((FLEXSPI_Type *)FLEXSPI_BASE)\r\n  /** Peripheral FLEXSPI base pointer */\r\n  #define FLEXSPI_NS                               ((FLEXSPI_Type *)FLEXSPI_BASE_NS)\r\n  /** Array initializer of FLEXSPI peripheral base addresses */\r\n  #define FLEXSPI_BASE_ADDRS                       { FLEXSPI_BASE }\r\n  /** Array initializer of FLEXSPI peripheral base pointers */\r\n  #define FLEXSPI_BASE_PTRS                        { FLEXSPI }\r\n  /** Array initializer of FLEXSPI peripheral base addresses */\r\n  #define FLEXSPI_BASE_ADDRS_NS                    { FLEXSPI_BASE_NS }\r\n  /** Array initializer of FLEXSPI peripheral base pointers */\r\n  #define FLEXSPI_BASE_PTRS_NS                     { FLEXSPI_NS }\r\n#else\r\n  /** Peripheral FLEXSPI base address */\r\n  #define FLEXSPI_BASE                             (0x40134000u)\r\n  /** Peripheral FLEXSPI base pointer */\r\n  #define FLEXSPI                                  ((FLEXSPI_Type *)FLEXSPI_BASE)\r\n  /** Array initializer of FLEXSPI peripheral base addresses */\r\n  #define FLEXSPI_BASE_ADDRS                       { FLEXSPI_BASE }\r\n  /** Array initializer of FLEXSPI peripheral base pointers */\r\n  #define FLEXSPI_BASE_PTRS                        { FLEXSPI }\r\n#endif\r\n/** Interrupt vectors for the FLEXSPI peripheral type */\r\n#define FLEXSPI_IRQS                             { FLEXSPI_IRQn }\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n/** FlexSPI AMBA Cache0 address. */\r\n#define FlexSPI_AMBA_PC_CACHE_BASE                 (0x18000000u)\r\n/** FlexSPI AMBA Cache1 address. */\r\n#define FlexSPI_AMBA_PS_CACHE_BASE                 (0x38000000u)\r\n/** FlexSPI AMBA Non-Cache address. */\r\n#define FlexSPI_AMBA_PS_NCACHE_BASE                (0x58000000u)\r\n/** FlexSPI AMBA Cache0 address */\r\n#define FlexSPI_AMBA_PC_CACHE_BASE_NS              (0x08000000u)\r\n/** FlexSPI AMBA Cache1 address */\r\n#define FlexSPI_AMBA_PS_CACHE_BASE_NS              (0x28000000u)\r\n/** FlexSPI AMBA Non-Cache address */\r\n#define FlexSPI_AMBA_PS_NCACHE_BASE_NS             (0x48000000u)\r\n#else\r\n/** FlexSPI AMBA Cache0 address. */\r\n#define FlexSPI_AMBA_PC_CACHE_BASE                 (0x08000000u)\r\n/** FlexSPI AMBA Cache1 address. */\r\n#define FlexSPI_AMBA_PS_CACHE_BASE                 (0x28000000u)\r\n/** FlexSPI AMBA Non-cache address. */\r\n#define FlexSPI_AMBA_PS_NCACHE_BASE                (0x48000000u)\r\n#endif\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group FLEXSPI_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- FREQME Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup FREQME_Peripheral_Access_Layer FREQME Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** FREQME - Register Layout Typedef */\r\ntypedef struct {\r\n  union {                                          /* offset: 0x0 */\r\n    __I  uint32_t FREQMECTRL_R;                      /**< Frequency Measurement (in Read mode), offset: 0x0 */\r\n    __O  uint32_t FREQMECTRL_W;                      /**< Freqeuncy Measurement (in Write mode), offset: 0x0 */\r\n  };\r\n} FREQME_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- FREQME Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup FREQME_Register_Masks FREQME Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name FREQMECTRL_R - Frequency Measurement (in Read mode) */\r\n/*! @{ */\r\n\r\n#define FREQME_FREQMECTRL_R_RESULT_MASK          (0x7FFFFFFFU)\r\n#define FREQME_FREQMECTRL_R_RESULT_SHIFT         (0U)\r\n/*! RESULT - Result */\r\n#define FREQME_FREQMECTRL_R_RESULT(x)            (((uint32_t)(((uint32_t)(x)) << FREQME_FREQMECTRL_R_RESULT_SHIFT)) & FREQME_FREQMECTRL_R_RESULT_MASK)\r\n\r\n#define FREQME_FREQMECTRL_R_MEASURE_IN_PROGRESS_MASK (0x80000000U)\r\n#define FREQME_FREQMECTRL_R_MEASURE_IN_PROGRESS_SHIFT (31U)\r\n/*! MEASURE_IN_PROGRESS - Measure in Progress\r\n *  0b0..Process complete. Measurement cycle is complete. The results are ready in the RESULT field.\r\n *  0b1..In Progress. Measurement cycle is in progress.\r\n */\r\n#define FREQME_FREQMECTRL_R_MEASURE_IN_PROGRESS(x) (((uint32_t)(((uint32_t)(x)) << FREQME_FREQMECTRL_R_MEASURE_IN_PROGRESS_SHIFT)) & FREQME_FREQMECTRL_R_MEASURE_IN_PROGRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name FREQMECTRL_W - Freqeuncy Measurement (in Write mode) */\r\n/*! @{ */\r\n\r\n#define FREQME_FREQMECTRL_W_REF_SCALE_MASK       (0x1FU)\r\n#define FREQME_FREQMECTRL_W_REF_SCALE_SHIFT      (0U)\r\n/*! REF_SCALE - Reference Clock Scaling Factor\r\n *  0b00000..Count cycle = 2^0 = 1\r\n *  0b00001..Count cycle = 2^1 = 2\r\n *  0b00010..Count cycle = 2^4 = 4\r\n *  0b11111..Count cycle = 2^31 = 2,147,483,648\r\n */\r\n#define FREQME_FREQMECTRL_W_REF_SCALE(x)         (((uint32_t)(((uint32_t)(x)) << FREQME_FREQMECTRL_W_REF_SCALE_SHIFT)) & FREQME_FREQMECTRL_W_REF_SCALE_MASK)\r\n\r\n#define FREQME_FREQMECTRL_W_PULSE_MODE_MASK      (0x100U)\r\n#define FREQME_FREQMECTRL_W_PULSE_MODE_SHIFT     (8U)\r\n/*! PULSE_MODE - Pulse Width Measurement mode select\r\n *  0b0..Frequency Measurement Mode. FREQMECTRL works in a Frequency Measurement mode. Once the measurement starts\r\n *       (real count start is aligned at rising edge arrival on reference clock), the target counter increments by\r\n *       the target clock until the reference counter running by the reference clock reaches the count end point\r\n *       selected by REF_SCALE.\r\n *  0b1..Pulse Width Measurement mode. FREQMECTRL works in a Pulse Width Measurement mode, measuring the high or\r\n *       low period of reference clock input selected by PULSE_POL. The target counter starts incrementing by the\r\n *       target clock once a corresponding trigger edge (rising edge for high period measurement and falling edge for\r\n *       low period) occurs.\r\n */\r\n#define FREQME_FREQMECTRL_W_PULSE_MODE(x)        (((uint32_t)(((uint32_t)(x)) << FREQME_FREQMECTRL_W_PULSE_MODE_SHIFT)) & FREQME_FREQMECTRL_W_PULSE_MODE_MASK)\r\n\r\n#define FREQME_FREQMECTRL_W_PULSE_POL_MASK       (0x200U)\r\n#define FREQME_FREQMECTRL_W_PULSE_POL_SHIFT      (9U)\r\n/*! PULSE_POL - Pulse Polarity\r\n *  0b0..High Period. High period of reference clock is measured in Pulse Width Measurement mode triggered by the\r\n *       rising edge on the reference clock input.\r\n *  0b1..Low Period. Low period of reference clock is measured in Pulse Width Measurement mode triggered by the\r\n *       falling edge on the reference clock input.\r\n */\r\n#define FREQME_FREQMECTRL_W_PULSE_POL(x)         (((uint32_t)(((uint32_t)(x)) << FREQME_FREQMECTRL_W_PULSE_POL_SHIFT)) & FREQME_FREQMECTRL_W_PULSE_POL_MASK)\r\n\r\n#define FREQME_FREQMECTRL_W_MEASURE_IN_PROGRESS_MASK (0x80000000U)\r\n#define FREQME_FREQMECTRL_W_MEASURE_IN_PROGRESS_SHIFT (31U)\r\n/*! MEASURE_IN_PROGRESS - Measure in Progress\r\n *  0b0..Force Terminate. Forces the termination of any measurement cycle currently in progress and resets RESULT or just resets RESULT if in idle.\r\n *  0b1..Initiates Measurement Cycle. Initiates frequency or pulse width measurement process. Hardware clears the\r\n *       MEASURE_IN_PROGRESS bit when the measurement cycle completes. A new measurement starts if there is an\r\n *       active measurement in progress.\r\n */\r\n#define FREQME_FREQMECTRL_W_MEASURE_IN_PROGRESS(x) (((uint32_t)(((uint32_t)(x)) << FREQME_FREQMECTRL_W_MEASURE_IN_PROGRESS_SHIFT)) & FREQME_FREQMECTRL_W_MEASURE_IN_PROGRESS_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group FREQME_Register_Masks */\r\n\r\n\r\n/* FREQME - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral FREQME base address */\r\n  #define FREQME_BASE                              (0x5002F000u)\r\n  /** Peripheral FREQME base address */\r\n  #define FREQME_BASE_NS                           (0x4002F000u)\r\n  /** Peripheral FREQME base pointer */\r\n  #define FREQME                                   ((FREQME_Type *)FREQME_BASE)\r\n  /** Peripheral FREQME base pointer */\r\n  #define FREQME_NS                                ((FREQME_Type *)FREQME_BASE_NS)\r\n  /** Array initializer of FREQME peripheral base addresses */\r\n  #define FREQME_BASE_ADDRS                        { FREQME_BASE }\r\n  /** Array initializer of FREQME peripheral base pointers */\r\n  #define FREQME_BASE_PTRS                         { FREQME }\r\n  /** Array initializer of FREQME peripheral base addresses */\r\n  #define FREQME_BASE_ADDRS_NS                     { FREQME_BASE_NS }\r\n  /** Array initializer of FREQME peripheral base pointers */\r\n  #define FREQME_BASE_PTRS_NS                      { FREQME_NS }\r\n#else\r\n  /** Peripheral FREQME base address */\r\n  #define FREQME_BASE                              (0x4002F000u)\r\n  /** Peripheral FREQME base pointer */\r\n  #define FREQME                                   ((FREQME_Type *)FREQME_BASE)\r\n  /** Array initializer of FREQME peripheral base addresses */\r\n  #define FREQME_BASE_ADDRS                        { FREQME_BASE }\r\n  /** Array initializer of FREQME peripheral base pointers */\r\n  #define FREQME_BASE_PTRS                         { FREQME }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group FREQME_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- GDMA Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup GDMA_Peripheral_Access_Layer GDMA Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** GDMA - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[64];\r\n  struct {                                         /* offset: 0x40, array step: 0x40 */\r\n    __IO uint32_t SADR;                              /**< DMA SOURCE ADDRESS REGISTERS, array offset: 0x40, array step: 0x40 */\r\n    __IO uint32_t DADR;                              /**< DMA DESTINATION ADDRESS REGISTERS, array offset: 0x44, array step: 0x40 */\r\n    __IO uint32_t LLI;                               /**< DMA CHANNEL LINKED LIST ITEM REGISTERS, array offset: 0x48, array step: 0x40 */\r\n    __IO uint32_t CTRL;                              /**< DMA CONTROL REGISTERS, array offset: 0x4C, array step: 0x40 */\r\n    __IO uint32_t CONFIG;                            /**< DMA CONFIGURE REGISTERS, array offset: 0x50, array step: 0x40 */\r\n    __IO uint32_t CHL_EN;                            /**< DMA CHANNEL ENABLE REGISTERS, array offset: 0x54, array step: 0x40 */\r\n    __IO uint32_t CHL_STOP;                          /**< DMA CHANNEL STOP REGISTERS, array offset: 0x58, array step: 0x40 */\r\n    __IO uint32_t CHNL_INT;                          /**< DMA INT REGISTERS, array offset: 0x5C, array step: 0x40 */\r\n         uint8_t RESERVED_0[16];\r\n    __IO uint32_t NUM_OF_DESCRIPTOR;                 /**< the number of descriptor, array offset: 0x70, array step: 0x40 */\r\n         uint8_t RESERVED_1[12];\r\n  } CH[4];\r\n} GDMA_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- GDMA Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup GDMA_Register_Masks GDMA Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name SADR - DMA SOURCE ADDRESS REGISTERS */\r\n/*! @{ */\r\n\r\n#define GDMA_SADR_SRCADDR_MASK                   (0xFFFFFFFFU)\r\n#define GDMA_SADR_SRCADDR_SHIFT                  (0U)\r\n/*! SRCADDR - SOURCE ADDRESS */\r\n#define GDMA_SADR_SRCADDR(x)                     (((uint32_t)(((uint32_t)(x)) << GDMA_SADR_SRCADDR_SHIFT)) & GDMA_SADR_SRCADDR_MASK)\r\n/*! @} */\r\n\r\n/* The count of GDMA_SADR */\r\n#define GDMA_SADR_COUNT                          (4U)\r\n\r\n/*! @name DADR - DMA DESTINATION ADDRESS REGISTERS */\r\n/*! @{ */\r\n\r\n#define GDMA_DADR_DESTADDR_MASK                  (0xFFFFFFFFU)\r\n#define GDMA_DADR_DESTADDR_SHIFT                 (0U)\r\n/*! DESTADDR - DESTINATION ADDRESS */\r\n#define GDMA_DADR_DESTADDR(x)                    (((uint32_t)(((uint32_t)(x)) << GDMA_DADR_DESTADDR_SHIFT)) & GDMA_DADR_DESTADDR_MASK)\r\n/*! @} */\r\n\r\n/* The count of GDMA_DADR */\r\n#define GDMA_DADR_COUNT                          (4U)\r\n\r\n/*! @name LLI - DMA CHANNEL LINKED LIST ITEM REGISTERS */\r\n/*! @{ */\r\n\r\n#define GDMA_LLI_STOP_MASK                       (0x1U)\r\n#define GDMA_LLI_STOP_SHIFT                      (0U)\r\n/*! STOP - STOP the channel after transaction is finished */\r\n#define GDMA_LLI_STOP(x)                         (((uint32_t)(((uint32_t)(x)) << GDMA_LLI_STOP_SHIFT)) & GDMA_LLI_STOP_MASK)\r\n\r\n#define GDMA_LLI_DESC_INT_EN_MASK                (0x2U)\r\n#define GDMA_LLI_DESC_INT_EN_SHIFT               (1U)\r\n/*! DESC_INT_EN - the interrupt enable for descriptor finish */\r\n#define GDMA_LLI_DESC_INT_EN(x)                  (((uint32_t)(((uint32_t)(x)) << GDMA_LLI_DESC_INT_EN_SHIFT)) & GDMA_LLI_DESC_INT_EN_MASK)\r\n\r\n#define GDMA_LLI_LLI_MASK                        (0xFFFFFFF0U)\r\n#define GDMA_LLI_LLI_SHIFT                       (4U)\r\n/*! LLI - LINKED LIST ITEM ADDRESS */\r\n#define GDMA_LLI_LLI(x)                          (((uint32_t)(((uint32_t)(x)) << GDMA_LLI_LLI_SHIFT)) & GDMA_LLI_LLI_MASK)\r\n/*! @} */\r\n\r\n/* The count of GDMA_LLI */\r\n#define GDMA_LLI_COUNT                           (4U)\r\n\r\n/*! @name CTRL - DMA CONTROL REGISTERS */\r\n/*! @{ */\r\n\r\n#define GDMA_CTRL_LEN_MASK                       (0x1FFFU)\r\n#define GDMA_CTRL_LEN_SHIFT                      (0U)\r\n/*! LEN - Length of the transfer in bytes */\r\n#define GDMA_CTRL_LEN(x)                         (((uint32_t)(((uint32_t)(x)) << GDMA_CTRL_LEN_SHIFT)) & GDMA_CTRL_LEN_MASK)\r\n\r\n#define GDMA_CTRL_DESTBSIZE_MASK                 (0xE0000U)\r\n#define GDMA_CTRL_DESTBSIZE_SHIFT                (17U)\r\n/*! DESTBSIZE - Destination peripheral/memory transfer burst size */\r\n#define GDMA_CTRL_DESTBSIZE(x)                   (((uint32_t)(((uint32_t)(x)) << GDMA_CTRL_DESTBSIZE_SHIFT)) & GDMA_CTRL_DESTBSIZE_MASK)\r\n\r\n#define GDMA_CTRL_SRCBSIZE_MASK                  (0x700000U)\r\n#define GDMA_CTRL_SRCBSIZE_SHIFT                 (20U)\r\n/*! SRCBSIZE - Source peripheral/memory transfer burst size */\r\n#define GDMA_CTRL_SRCBSIZE(x)                    (((uint32_t)(((uint32_t)(x)) << GDMA_CTRL_SRCBSIZE_SHIFT)) & GDMA_CTRL_SRCBSIZE_MASK)\r\n\r\n#define GDMA_CTRL_DESTWIDTH_MASK                 (0x1800000U)\r\n#define GDMA_CTRL_DESTWIDTH_SHIFT                (23U)\r\n/*! DESTWIDTH - Destination peripheral/memory transfer width */\r\n#define GDMA_CTRL_DESTWIDTH(x)                   (((uint32_t)(((uint32_t)(x)) << GDMA_CTRL_DESTWIDTH_SHIFT)) & GDMA_CTRL_DESTWIDTH_MASK)\r\n\r\n#define GDMA_CTRL_SRCWIDTH_MASK                  (0x6000000U)\r\n#define GDMA_CTRL_SRCWIDTH_SHIFT                 (25U)\r\n/*! SRCWIDTH - Source peripheral/memory transfer width */\r\n#define GDMA_CTRL_SRCWIDTH(x)                    (((uint32_t)(((uint32_t)(x)) << GDMA_CTRL_SRCWIDTH_SHIFT)) & GDMA_CTRL_SRCWIDTH_MASK)\r\n\r\n#define GDMA_CTRL_DESTADDRINC_MASK               (0x8000000U)\r\n#define GDMA_CTRL_DESTADDRINC_SHIFT              (27U)\r\n/*! DESTADDRINC - destination address increment */\r\n#define GDMA_CTRL_DESTADDRINC(x)                 (((uint32_t)(((uint32_t)(x)) << GDMA_CTRL_DESTADDRINC_SHIFT)) & GDMA_CTRL_DESTADDRINC_MASK)\r\n\r\n#define GDMA_CTRL_SRCADDRINC_MASK                (0x10000000U)\r\n#define GDMA_CTRL_SRCADDRINC_SHIFT               (28U)\r\n/*! SRCADDRINC - Source address increment */\r\n#define GDMA_CTRL_SRCADDRINC(x)                  (((uint32_t)(((uint32_t)(x)) << GDMA_CTRL_SRCADDRINC_SHIFT)) & GDMA_CTRL_SRCADDRINC_MASK)\r\n\r\n#define GDMA_CTRL_PROT_MASK                      (0xE0000000U)\r\n#define GDMA_CTRL_PROT_SHIFT                     (29U)\r\n/*! PROT - Protection info for AHB master bus */\r\n#define GDMA_CTRL_PROT(x)                        (((uint32_t)(((uint32_t)(x)) << GDMA_CTRL_PROT_SHIFT)) & GDMA_CTRL_PROT_MASK)\r\n/*! @} */\r\n\r\n/* The count of GDMA_CTRL */\r\n#define GDMA_CTRL_COUNT                          (4U)\r\n\r\n/*! @name CONFIG - DMA CONFIGURE REGISTERS */\r\n/*! @{ */\r\n\r\n#define GDMA_CONFIG_LLE_MASK                     (0x1U)\r\n#define GDMA_CONFIG_LLE_SHIFT                    (0U)\r\n/*! LLE - Link List Enable */\r\n#define GDMA_CONFIG_LLE(x)                       (((uint32_t)(((uint32_t)(x)) << GDMA_CONFIG_LLE_SHIFT)) & GDMA_CONFIG_LLE_MASK)\r\n\r\n#define GDMA_CONFIG_HW_EN_SRC_MASK               (0x38000000U)\r\n#define GDMA_CONFIG_HW_EN_SRC_SHIFT              (27U)\r\n/*! HW_EN_SRC - hardware enable trigger source */\r\n#define GDMA_CONFIG_HW_EN_SRC(x)                 (((uint32_t)(((uint32_t)(x)) << GDMA_CONFIG_HW_EN_SRC_SHIFT)) & GDMA_CONFIG_HW_EN_SRC_MASK)\r\n\r\n#define GDMA_CONFIG_HW_EN_MASK                   (0x40000000U)\r\n#define GDMA_CONFIG_HW_EN_SHIFT                  (30U)\r\n/*! HW_EN - Hardware enable configuration of current channel */\r\n#define GDMA_CONFIG_HW_EN(x)                     (((uint32_t)(((uint32_t)(x)) << GDMA_CONFIG_HW_EN_SHIFT)) & GDMA_CONFIG_HW_EN_MASK)\r\n\r\n#define GDMA_CONFIG_FIFO_EMPTY_MASK              (0x80000000U)\r\n#define GDMA_CONFIG_FIFO_EMPTY_SHIFT             (31U)\r\n/*! FIFO_EMPTY - FIFO status of current channel */\r\n#define GDMA_CONFIG_FIFO_EMPTY(x)                (((uint32_t)(((uint32_t)(x)) << GDMA_CONFIG_FIFO_EMPTY_SHIFT)) & GDMA_CONFIG_FIFO_EMPTY_MASK)\r\n/*! @} */\r\n\r\n/* The count of GDMA_CONFIG */\r\n#define GDMA_CONFIG_COUNT                        (4U)\r\n\r\n/*! @name CHL_EN - DMA CHANNEL ENABLE REGISTERS */\r\n/*! @{ */\r\n\r\n#define GDMA_CHL_EN_CHL_PRIORITY_WEIGHT_MASK     (0xFU)\r\n#define GDMA_CHL_EN_CHL_PRIORITY_WEIGHT_SHIFT    (0U)\r\n/*! CHL_PRIORITY_WEIGHT - DMA Channel Priority Weight */\r\n#define GDMA_CHL_EN_CHL_PRIORITY_WEIGHT(x)       (((uint32_t)(((uint32_t)(x)) << GDMA_CHL_EN_CHL_PRIORITY_WEIGHT_SHIFT)) & GDMA_CHL_EN_CHL_PRIORITY_WEIGHT_MASK)\r\n\r\n#define GDMA_CHL_EN_TEST_BUS_SIGNAL_SEL_MASK     (0xF0U)\r\n#define GDMA_CHL_EN_TEST_BUS_SIGNAL_SEL_SHIFT    (4U)\r\n/*! TEST_BUS_SIGNAL_SEL - TEST_BUS_SIGNAL_SEL */\r\n#define GDMA_CHL_EN_TEST_BUS_SIGNAL_SEL(x)       (((uint32_t)(((uint32_t)(x)) << GDMA_CHL_EN_TEST_BUS_SIGNAL_SEL_SHIFT)) & GDMA_CHL_EN_TEST_BUS_SIGNAL_SEL_MASK)\r\n\r\n#define GDMA_CHL_EN_CHL_EN_MASK                  (0x80000000U)\r\n#define GDMA_CHL_EN_CHL_EN_SHIFT                 (31U)\r\n/*! CHL_EN - Enable/Disable the channel */\r\n#define GDMA_CHL_EN_CHL_EN(x)                    (((uint32_t)(((uint32_t)(x)) << GDMA_CHL_EN_CHL_EN_SHIFT)) & GDMA_CHL_EN_CHL_EN_MASK)\r\n/*! @} */\r\n\r\n/* The count of GDMA_CHL_EN */\r\n#define GDMA_CHL_EN_COUNT                        (4U)\r\n\r\n/*! @name CHL_STOP - DMA CHANNEL STOP REGISTERS */\r\n/*! @{ */\r\n\r\n#define GDMA_CHL_STOP_CHL_STOP_MASK              (0x80000000U)\r\n#define GDMA_CHL_STOP_CHL_STOP_SHIFT             (31U)\r\n/*! CHL_STOP - Stop the running channel */\r\n#define GDMA_CHL_STOP_CHL_STOP(x)                (((uint32_t)(((uint32_t)(x)) << GDMA_CHL_STOP_CHL_STOP_SHIFT)) & GDMA_CHL_STOP_CHL_STOP_MASK)\r\n/*! @} */\r\n\r\n/* The count of GDMA_CHL_STOP */\r\n#define GDMA_CHL_STOP_COUNT                      (4U)\r\n\r\n/*! @name CHNL_INT - DMA INT REGISTERS */\r\n/*! @{ */\r\n\r\n#define GDMA_CHNL_INT_MASK_BLOCKINT_MASK         (0x1U)\r\n#define GDMA_CHNL_INT_MASK_BLOCKINT_SHIFT        (0U)\r\n/*! MASK_BLOCKINT - DMA channel block transfer interrupt mask bit */\r\n#define GDMA_CHNL_INT_MASK_BLOCKINT(x)           (((uint32_t)(((uint32_t)(x)) << GDMA_CHNL_INT_MASK_BLOCKINT_SHIFT)) & GDMA_CHNL_INT_MASK_BLOCKINT_MASK)\r\n\r\n#define GDMA_CHNL_INT_STATUS_BLOCKINT_MASK       (0x2U)\r\n#define GDMA_CHNL_INT_STATUS_BLOCKINT_SHIFT      (1U)\r\n/*! STATUS_BLOCKINT - DMA channel block transfer interrupt bit */\r\n#define GDMA_CHNL_INT_STATUS_BLOCKINT(x)         (((uint32_t)(((uint32_t)(x)) << GDMA_CHNL_INT_STATUS_BLOCKINT_SHIFT)) & GDMA_CHNL_INT_STATUS_BLOCKINT_MASK)\r\n\r\n#define GDMA_CHNL_INT_MASK_TFRINT_MASK           (0x4U)\r\n#define GDMA_CHNL_INT_MASK_TFRINT_SHIFT          (2U)\r\n/*! MASK_TFRINT - transfer interrupt mask bit */\r\n#define GDMA_CHNL_INT_MASK_TFRINT(x)             (((uint32_t)(((uint32_t)(x)) << GDMA_CHNL_INT_MASK_TFRINT_SHIFT)) & GDMA_CHNL_INT_MASK_TFRINT_MASK)\r\n\r\n#define GDMA_CHNL_INT_STATUS_TFRINT_MASK         (0x8U)\r\n#define GDMA_CHNL_INT_STATUS_TFRINT_SHIFT        (3U)\r\n/*! STATUS_TFRINT - transfer interrupt bit */\r\n#define GDMA_CHNL_INT_STATUS_TFRINT(x)           (((uint32_t)(((uint32_t)(x)) << GDMA_CHNL_INT_STATUS_TFRINT_SHIFT)) & GDMA_CHNL_INT_STATUS_TFRINT_MASK)\r\n\r\n#define GDMA_CHNL_INT_MASK_BUSERRINT_MASK        (0x10U)\r\n#define GDMA_CHNL_INT_MASK_BUSERRINT_SHIFT       (4U)\r\n/*! MASK_BUSERRINT - DMA channel bus error interrupt mask bit */\r\n#define GDMA_CHNL_INT_MASK_BUSERRINT(x)          (((uint32_t)(((uint32_t)(x)) << GDMA_CHNL_INT_MASK_BUSERRINT_SHIFT)) & GDMA_CHNL_INT_MASK_BUSERRINT_MASK)\r\n\r\n#define GDMA_CHNL_INT_STATUS_BUSERRINT_MASK      (0x20U)\r\n#define GDMA_CHNL_INT_STATUS_BUSERRINT_SHIFT     (5U)\r\n/*! STATUS_BUSERRINT - DMA channel bus error interrupt bit */\r\n#define GDMA_CHNL_INT_STATUS_BUSERRINT(x)        (((uint32_t)(((uint32_t)(x)) << GDMA_CHNL_INT_STATUS_BUSERRINT_SHIFT)) & GDMA_CHNL_INT_STATUS_BUSERRINT_MASK)\r\n\r\n#define GDMA_CHNL_INT_MASK_ADDRERRINT_MASK       (0x40U)\r\n#define GDMA_CHNL_INT_MASK_ADDRERRINT_SHIFT      (6U)\r\n/*! MASK_ADDRERRINT - DMA Channel source/destination address alignment error interrupt mask bit */\r\n#define GDMA_CHNL_INT_MASK_ADDRERRINT(x)         (((uint32_t)(((uint32_t)(x)) << GDMA_CHNL_INT_MASK_ADDRERRINT_SHIFT)) & GDMA_CHNL_INT_MASK_ADDRERRINT_MASK)\r\n\r\n#define GDMA_CHNL_INT_STATUS_ADDRERRINT_MASK     (0x80U)\r\n#define GDMA_CHNL_INT_STATUS_ADDRERRINT_SHIFT    (7U)\r\n/*! STATUS_ADDRERRINT - DMA Channel source/destination address alignment error interrupt bit */\r\n#define GDMA_CHNL_INT_STATUS_ADDRERRINT(x)       (((uint32_t)(((uint32_t)(x)) << GDMA_CHNL_INT_STATUS_ADDRERRINT_SHIFT)) & GDMA_CHNL_INT_STATUS_ADDRERRINT_MASK)\r\n\r\n#define GDMA_CHNL_INT_STATUS_CHLINT_MASK         (0x100U)\r\n#define GDMA_CHNL_INT_STATUS_CHLINT_SHIFT        (8U)\r\n/*! STATUS_CHLINT - DMA channel interrupt */\r\n#define GDMA_CHNL_INT_STATUS_CHLINT(x)           (((uint32_t)(((uint32_t)(x)) << GDMA_CHNL_INT_STATUS_CHLINT_SHIFT)) & GDMA_CHNL_INT_STATUS_CHLINT_MASK)\r\n\r\n#define GDMA_CHNL_INT_MASK_DESC_TFRINT_MASK      (0x200U)\r\n#define GDMA_CHNL_INT_MASK_DESC_TFRINT_SHIFT     (9U)\r\n/*! MASK_DESC_TFRINT - descriptor transfer interrupt mask bit */\r\n#define GDMA_CHNL_INT_MASK_DESC_TFRINT(x)        (((uint32_t)(((uint32_t)(x)) << GDMA_CHNL_INT_MASK_DESC_TFRINT_SHIFT)) & GDMA_CHNL_INT_MASK_DESC_TFRINT_MASK)\r\n\r\n#define GDMA_CHNL_INT_DESC_STATUS_TFRINT_MASK    (0x400U)\r\n#define GDMA_CHNL_INT_DESC_STATUS_TFRINT_SHIFT   (10U)\r\n/*! DESC_STATUS_TFRINT - configurable descriptor transfer interrupt bit */\r\n#define GDMA_CHNL_INT_DESC_STATUS_TFRINT(x)      (((uint32_t)(((uint32_t)(x)) << GDMA_CHNL_INT_DESC_STATUS_TFRINT_SHIFT)) & GDMA_CHNL_INT_DESC_STATUS_TFRINT_MASK)\r\n/*! @} */\r\n\r\n/* The count of GDMA_CHNL_INT */\r\n#define GDMA_CHNL_INT_COUNT                      (4U)\r\n\r\n/*! @name NUM_OF_DESCRIPTOR - the number of descriptor */\r\n/*! @{ */\r\n\r\n#define GDMA_NUM_OF_DESCRIPTOR_DATA_MASK         (0xFFFFFFFFU)\r\n#define GDMA_NUM_OF_DESCRIPTOR_DATA_SHIFT        (0U)\r\n/*! DATA - the number of descriptor */\r\n#define GDMA_NUM_OF_DESCRIPTOR_DATA(x)           (((uint32_t)(((uint32_t)(x)) << GDMA_NUM_OF_DESCRIPTOR_DATA_SHIFT)) & GDMA_NUM_OF_DESCRIPTOR_DATA_MASK)\r\n/*! @} */\r\n\r\n/* The count of GDMA_NUM_OF_DESCRIPTOR */\r\n#define GDMA_NUM_OF_DESCRIPTOR_COUNT             (4U)\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group GDMA_Register_Masks */\r\n\r\n\r\n/* GDMA - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral GDMA base address */\r\n  #define GDMA_BASE                                (0x5014E000u)\r\n  /** Peripheral GDMA base address */\r\n  #define GDMA_BASE_NS                             (0x4014E000u)\r\n  /** Peripheral GDMA base pointer */\r\n  #define GDMA                                     ((GDMA_Type *)GDMA_BASE)\r\n  /** Peripheral GDMA base pointer */\r\n  #define GDMA_NS                                  ((GDMA_Type *)GDMA_BASE_NS)\r\n  /** Array initializer of GDMA peripheral base addresses */\r\n  #define GDMA_BASE_ADDRS                          { GDMA_BASE }\r\n  /** Array initializer of GDMA peripheral base pointers */\r\n  #define GDMA_BASE_PTRS                           { GDMA }\r\n  /** Array initializer of GDMA peripheral base addresses */\r\n  #define GDMA_BASE_ADDRS_NS                       { GDMA_BASE_NS }\r\n  /** Array initializer of GDMA peripheral base pointers */\r\n  #define GDMA_BASE_PTRS_NS                        { GDMA_NS }\r\n#else\r\n  /** Peripheral GDMA base address */\r\n  #define GDMA_BASE                                (0x4014E000u)\r\n  /** Peripheral GDMA base pointer */\r\n  #define GDMA                                     ((GDMA_Type *)GDMA_BASE)\r\n  /** Array initializer of GDMA peripheral base addresses */\r\n  #define GDMA_BASE_ADDRS                          { GDMA_BASE }\r\n  /** Array initializer of GDMA peripheral base pointers */\r\n  #define GDMA_BASE_PTRS                           { GDMA }\r\n#endif\r\n/** Interrupt vectors for the GDMA peripheral type */\r\n#define GDMA_IRQS                                { GDMA_IRQn }\r\n\r\n/*!\r\n * @}\r\n */ /* end of group GDMA_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- GPIO Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup GPIO_Peripheral_Access_Layer GPIO Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** GPIO - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint8_t B[2][32];                           /**< Byte pin registers for all port GPIO pins, array offset: 0x0, array step: index*0x20, index2*0x1, irregular array, not all indices are valid */\r\n       uint8_t RESERVED_0[4032];\r\n  __IO uint32_t W[2][32];                          /**< Word pin registers for all port GPIO pins, array offset: 0x1000, array step: index*0x80, index2*0x4, irregular array, not all indices are valid */\r\n       uint8_t RESERVED_1[3840];\r\n  __O  uint32_t DIR[2];                            /**< Port direction, array offset: 0x2000, array step: 0x4, irregular array, not all indices are valid */\r\n       uint8_t RESERVED_2[120];\r\n  __IO uint32_t MASK[2];                           /**< Port mask, array offset: 0x2080, array step: 0x4, irregular array, not all indices are valid */\r\n       uint8_t RESERVED_3[120];\r\n  __IO uint32_t PIN[2];                            /**< Port pin, array offset: 0x2100, array step: 0x4, irregular array, not all indices are valid */\r\n       uint8_t RESERVED_4[120];\r\n  __IO uint32_t MPIN[2];                           /**< Masked Port Pin, array offset: 0x2180, array step: 0x4, irregular array, not all indices are valid */\r\n       uint8_t RESERVED_5[120];\r\n  __IO uint32_t SET[2];                            /**< Port set, array offset: 0x2200, array step: 0x4, irregular array, not all indices are valid */\r\n       uint8_t RESERVED_6[120];\r\n  __IO uint32_t CLR[2];                            /**< Port clear, array offset: 0x2280, array step: 0x4, irregular array, not all indices are valid */\r\n       uint8_t RESERVED_7[120];\r\n  __O  uint32_t NOT[2];                            /**< Port toggle, array offset: 0x2300, array step: 0x4, irregular array, not all indices are valid */\r\n       uint8_t RESERVED_8[120];\r\n  __O  uint32_t DIRSET[2];                         /**< Port direction set, array offset: 0x2380, array step: 0x4, irregular array, not all indices are valid */\r\n       uint8_t RESERVED_9[120];\r\n  __IO uint32_t DIRCLR[2];                         /**< Port direction clear, array offset: 0x2400, array step: 0x4, irregular array, not all indices are valid */\r\n       uint8_t RESERVED_10[120];\r\n  __O  uint32_t DIRNOT[2];                         /**< Port direction toggle, array offset: 0x2480, array step: 0x4, irregular array, not all indices are valid */\r\n       uint8_t RESERVED_11[120];\r\n  __IO uint32_t INTENA[2];                         /**< Interrupt A enable control, array offset: 0x2500, array step: 0x4, irregular array, not all indices are valid */\r\n       uint8_t RESERVED_12[120];\r\n  __IO uint32_t INTENB[2];                         /**< Interrupt B enable control, array offset: 0x2580, array step: 0x4, irregular array, not all indices are valid */\r\n       uint8_t RESERVED_13[120];\r\n  __IO uint32_t INTPOL[2];                         /**< Interupt polarity control, array offset: 0x2600, array step: 0x4, irregular array, not all indices are valid */\r\n       uint8_t RESERVED_14[120];\r\n  __IO uint32_t INTEDG[2];                         /**< Interrupt edge select, array offset: 0x2680, array step: 0x4, irregular array, not all indices are valid */\r\n       uint8_t RESERVED_15[120];\r\n  __IO uint32_t INTSTATA[2];                       /**< Interrupt status for interrupt A, array offset: 0x2700, array step: 0x4, irregular array, not all indices are valid */\r\n       uint8_t RESERVED_16[120];\r\n  __IO uint32_t INTSTATB[2];                       /**< Interrupt status for interrupt B, array offset: 0x2780, array step: 0x4, irregular array, not all indices are valid */\r\n} GPIO_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- GPIO Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup GPIO_Register_Masks GPIO Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name B - Byte pin registers for all port GPIO pins */\r\n/*! @{ */\r\n\r\n#define GPIO_B_PBYTE_MASK                        (0x1U)\r\n#define GPIO_B_PBYTE_SHIFT                       (0U)\r\n/*! PBYTE - Port Byte */\r\n#define GPIO_B_PBYTE(x)                          (((uint8_t)(((uint8_t)(x)) << GPIO_B_PBYTE_SHIFT)) & GPIO_B_PBYTE_MASK)\r\n/*! @} */\r\n\r\n/* The count of GPIO_B */\r\n#define GPIO_B_COUNT                             (2U)\r\n\r\n/* The count of GPIO_B */\r\n#define GPIO_B_COUNT2                            (32U)\r\n\r\n/*! @name W - Word pin registers for all port GPIO pins */\r\n/*! @{ */\r\n\r\n#define GPIO_W_PWORD_MASK                        (0xFFFFFFFFU)\r\n#define GPIO_W_PWORD_SHIFT                       (0U)\r\n/*! PWORD - PWORD */\r\n#define GPIO_W_PWORD(x)                          (((uint32_t)(((uint32_t)(x)) << GPIO_W_PWORD_SHIFT)) & GPIO_W_PWORD_MASK)\r\n/*! @} */\r\n\r\n/* The count of GPIO_W */\r\n#define GPIO_W_COUNT                             (2U)\r\n\r\n/* The count of GPIO_W */\r\n#define GPIO_W_COUNT2                            (32U)\r\n\r\n/*! @name DIR - Port direction */\r\n/*! @{ */\r\n\r\n#define GPIO_DIR_DIRP0_MASK                      (0x1U)\r\n#define GPIO_DIR_DIRP0_SHIFT                     (0U)\r\n/*! DIRP0 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP0(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP0_SHIFT)) & GPIO_DIR_DIRP0_MASK)\r\n\r\n#define GPIO_DIR_DIRP1_MASK                      (0x2U)\r\n#define GPIO_DIR_DIRP1_SHIFT                     (1U)\r\n/*! DIRP1 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP1(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP1_SHIFT)) & GPIO_DIR_DIRP1_MASK)\r\n\r\n#define GPIO_DIR_DIRP2_MASK                      (0x4U)\r\n#define GPIO_DIR_DIRP2_SHIFT                     (2U)\r\n/*! DIRP2 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP2(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP2_SHIFT)) & GPIO_DIR_DIRP2_MASK)\r\n\r\n#define GPIO_DIR_DIRP3_MASK                      (0x8U)\r\n#define GPIO_DIR_DIRP3_SHIFT                     (3U)\r\n/*! DIRP3 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP3(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP3_SHIFT)) & GPIO_DIR_DIRP3_MASK)\r\n\r\n#define GPIO_DIR_DIRP4_MASK                      (0x10U)\r\n#define GPIO_DIR_DIRP4_SHIFT                     (4U)\r\n/*! DIRP4 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP4(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP4_SHIFT)) & GPIO_DIR_DIRP4_MASK)\r\n\r\n#define GPIO_DIR_DIRP5_MASK                      (0x20U)\r\n#define GPIO_DIR_DIRP5_SHIFT                     (5U)\r\n/*! DIRP5 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP5(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP5_SHIFT)) & GPIO_DIR_DIRP5_MASK)\r\n\r\n#define GPIO_DIR_DIRP6_MASK                      (0x40U)\r\n#define GPIO_DIR_DIRP6_SHIFT                     (6U)\r\n/*! DIRP6 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP6(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP6_SHIFT)) & GPIO_DIR_DIRP6_MASK)\r\n\r\n#define GPIO_DIR_DIRP7_MASK                      (0x80U)\r\n#define GPIO_DIR_DIRP7_SHIFT                     (7U)\r\n/*! DIRP7 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP7(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP7_SHIFT)) & GPIO_DIR_DIRP7_MASK)\r\n\r\n#define GPIO_DIR_DIRP8_MASK                      (0x100U)\r\n#define GPIO_DIR_DIRP8_SHIFT                     (8U)\r\n/*! DIRP8 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP8(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP8_SHIFT)) & GPIO_DIR_DIRP8_MASK)\r\n\r\n#define GPIO_DIR_DIRP9_MASK                      (0x200U)\r\n#define GPIO_DIR_DIRP9_SHIFT                     (9U)\r\n/*! DIRP9 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP9(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP9_SHIFT)) & GPIO_DIR_DIRP9_MASK)\r\n\r\n#define GPIO_DIR_DIRP10_MASK                     (0x400U)\r\n#define GPIO_DIR_DIRP10_SHIFT                    (10U)\r\n/*! DIRP10 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP10(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP10_SHIFT)) & GPIO_DIR_DIRP10_MASK)\r\n\r\n#define GPIO_DIR_DIRP11_MASK                     (0x800U)\r\n#define GPIO_DIR_DIRP11_SHIFT                    (11U)\r\n/*! DIRP11 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP11(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP11_SHIFT)) & GPIO_DIR_DIRP11_MASK)\r\n\r\n#define GPIO_DIR_DIRP12_MASK                     (0x1000U)\r\n#define GPIO_DIR_DIRP12_SHIFT                    (12U)\r\n/*! DIRP12 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP12(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP12_SHIFT)) & GPIO_DIR_DIRP12_MASK)\r\n\r\n#define GPIO_DIR_DIRP13_MASK                     (0x2000U)\r\n#define GPIO_DIR_DIRP13_SHIFT                    (13U)\r\n/*! DIRP13 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP13(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP13_SHIFT)) & GPIO_DIR_DIRP13_MASK)\r\n\r\n#define GPIO_DIR_DIRP14_MASK                     (0x4000U)\r\n#define GPIO_DIR_DIRP14_SHIFT                    (14U)\r\n/*! DIRP14 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP14(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP14_SHIFT)) & GPIO_DIR_DIRP14_MASK)\r\n\r\n#define GPIO_DIR_DIRP15_MASK                     (0x8000U)\r\n#define GPIO_DIR_DIRP15_SHIFT                    (15U)\r\n/*! DIRP15 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP15(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP15_SHIFT)) & GPIO_DIR_DIRP15_MASK)\r\n\r\n#define GPIO_DIR_DIRP16_MASK                     (0x10000U)\r\n#define GPIO_DIR_DIRP16_SHIFT                    (16U)\r\n/*! DIRP16 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP16(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP16_SHIFT)) & GPIO_DIR_DIRP16_MASK)\r\n\r\n#define GPIO_DIR_DIRP17_MASK                     (0x20000U)\r\n#define GPIO_DIR_DIRP17_SHIFT                    (17U)\r\n/*! DIRP17 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP17(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP17_SHIFT)) & GPIO_DIR_DIRP17_MASK)\r\n\r\n#define GPIO_DIR_DIRP18_MASK                     (0x40000U)\r\n#define GPIO_DIR_DIRP18_SHIFT                    (18U)\r\n/*! DIRP18 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP18(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP18_SHIFT)) & GPIO_DIR_DIRP18_MASK)\r\n\r\n#define GPIO_DIR_DIRP19_MASK                     (0x80000U)\r\n#define GPIO_DIR_DIRP19_SHIFT                    (19U)\r\n/*! DIRP19 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP19(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP19_SHIFT)) & GPIO_DIR_DIRP19_MASK)\r\n\r\n#define GPIO_DIR_DIRP20_MASK                     (0x100000U)\r\n#define GPIO_DIR_DIRP20_SHIFT                    (20U)\r\n/*! DIRP20 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP20(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP20_SHIFT)) & GPIO_DIR_DIRP20_MASK)\r\n\r\n#define GPIO_DIR_DIRP21_MASK                     (0x200000U)\r\n#define GPIO_DIR_DIRP21_SHIFT                    (21U)\r\n/*! DIRP21 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP21(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP21_SHIFT)) & GPIO_DIR_DIRP21_MASK)\r\n\r\n#define GPIO_DIR_DIRP22_MASK                     (0x400000U)\r\n#define GPIO_DIR_DIRP22_SHIFT                    (22U)\r\n/*! DIRP22 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP22(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP22_SHIFT)) & GPIO_DIR_DIRP22_MASK)\r\n\r\n#define GPIO_DIR_DIRP23_MASK                     (0x800000U)\r\n#define GPIO_DIR_DIRP23_SHIFT                    (23U)\r\n/*! DIRP23 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP23(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP23_SHIFT)) & GPIO_DIR_DIRP23_MASK)\r\n\r\n#define GPIO_DIR_DIRP24_MASK                     (0x1000000U)\r\n#define GPIO_DIR_DIRP24_SHIFT                    (24U)\r\n/*! DIRP24 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP24(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP24_SHIFT)) & GPIO_DIR_DIRP24_MASK)\r\n\r\n#define GPIO_DIR_DIRP25_MASK                     (0x2000000U)\r\n#define GPIO_DIR_DIRP25_SHIFT                    (25U)\r\n/*! DIRP25 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP25(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP25_SHIFT)) & GPIO_DIR_DIRP25_MASK)\r\n\r\n#define GPIO_DIR_DIRP26_MASK                     (0x4000000U)\r\n#define GPIO_DIR_DIRP26_SHIFT                    (26U)\r\n/*! DIRP26 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP26(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP26_SHIFT)) & GPIO_DIR_DIRP26_MASK)\r\n\r\n#define GPIO_DIR_DIRP27_MASK                     (0x8000000U)\r\n#define GPIO_DIR_DIRP27_SHIFT                    (27U)\r\n/*! DIRP27 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP27(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP27_SHIFT)) & GPIO_DIR_DIRP27_MASK)\r\n\r\n#define GPIO_DIR_DIRP28_MASK                     (0x10000000U)\r\n#define GPIO_DIR_DIRP28_SHIFT                    (28U)\r\n/*! DIRP28 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP28(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP28_SHIFT)) & GPIO_DIR_DIRP28_MASK)\r\n\r\n#define GPIO_DIR_DIRP29_MASK                     (0x20000000U)\r\n#define GPIO_DIR_DIRP29_SHIFT                    (29U)\r\n/*! DIRP29 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP29(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP29_SHIFT)) & GPIO_DIR_DIRP29_MASK)\r\n\r\n#define GPIO_DIR_DIRP30_MASK                     (0x40000000U)\r\n#define GPIO_DIR_DIRP30_SHIFT                    (30U)\r\n/*! DIRP30 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP30(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP30_SHIFT)) & GPIO_DIR_DIRP30_MASK)\r\n\r\n#define GPIO_DIR_DIRP31_MASK                     (0x80000000U)\r\n#define GPIO_DIR_DIRP31_SHIFT                    (31U)\r\n/*! DIRP31 - Selects pin direction for pin PIOa_b.\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define GPIO_DIR_DIRP31(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_DIR_DIRP31_SHIFT)) & GPIO_DIR_DIRP31_MASK)\r\n/*! @} */\r\n\r\n/* The count of GPIO_DIR */\r\n#define GPIO_DIR_COUNT                           (2U)\r\n\r\n/*! @name MASK - Port mask */\r\n/*! @{ */\r\n\r\n#define GPIO_MASK_MASKP0_MASK                    (0x1U)\r\n#define GPIO_MASK_MASKP0_SHIFT                   (0U)\r\n/*! MASKP0 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP0(x)                      (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP0_SHIFT)) & GPIO_MASK_MASKP0_MASK)\r\n\r\n#define GPIO_MASK_MASKP1_MASK                    (0x2U)\r\n#define GPIO_MASK_MASKP1_SHIFT                   (1U)\r\n/*! MASKP1 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP1(x)                      (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP1_SHIFT)) & GPIO_MASK_MASKP1_MASK)\r\n\r\n#define GPIO_MASK_MASKP2_MASK                    (0x4U)\r\n#define GPIO_MASK_MASKP2_SHIFT                   (2U)\r\n/*! MASKP2 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP2(x)                      (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP2_SHIFT)) & GPIO_MASK_MASKP2_MASK)\r\n\r\n#define GPIO_MASK_MASKP3_MASK                    (0x8U)\r\n#define GPIO_MASK_MASKP3_SHIFT                   (3U)\r\n/*! MASKP3 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP3(x)                      (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP3_SHIFT)) & GPIO_MASK_MASKP3_MASK)\r\n\r\n#define GPIO_MASK_MASKP4_MASK                    (0x10U)\r\n#define GPIO_MASK_MASKP4_SHIFT                   (4U)\r\n/*! MASKP4 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP4(x)                      (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP4_SHIFT)) & GPIO_MASK_MASKP4_MASK)\r\n\r\n#define GPIO_MASK_MASKP5_MASK                    (0x20U)\r\n#define GPIO_MASK_MASKP5_SHIFT                   (5U)\r\n/*! MASKP5 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP5(x)                      (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP5_SHIFT)) & GPIO_MASK_MASKP5_MASK)\r\n\r\n#define GPIO_MASK_MASKP6_MASK                    (0x40U)\r\n#define GPIO_MASK_MASKP6_SHIFT                   (6U)\r\n/*! MASKP6 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP6(x)                      (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP6_SHIFT)) & GPIO_MASK_MASKP6_MASK)\r\n\r\n#define GPIO_MASK_MASKP7_MASK                    (0x80U)\r\n#define GPIO_MASK_MASKP7_SHIFT                   (7U)\r\n/*! MASKP7 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP7(x)                      (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP7_SHIFT)) & GPIO_MASK_MASKP7_MASK)\r\n\r\n#define GPIO_MASK_MASKP8_MASK                    (0x100U)\r\n#define GPIO_MASK_MASKP8_SHIFT                   (8U)\r\n/*! MASKP8 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP8(x)                      (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP8_SHIFT)) & GPIO_MASK_MASKP8_MASK)\r\n\r\n#define GPIO_MASK_MASKP9_MASK                    (0x200U)\r\n#define GPIO_MASK_MASKP9_SHIFT                   (9U)\r\n/*! MASKP9 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP9(x)                      (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP9_SHIFT)) & GPIO_MASK_MASKP9_MASK)\r\n\r\n#define GPIO_MASK_MASKP10_MASK                   (0x400U)\r\n#define GPIO_MASK_MASKP10_SHIFT                  (10U)\r\n/*! MASKP10 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP10(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP10_SHIFT)) & GPIO_MASK_MASKP10_MASK)\r\n\r\n#define GPIO_MASK_MASKP11_MASK                   (0x800U)\r\n#define GPIO_MASK_MASKP11_SHIFT                  (11U)\r\n/*! MASKP11 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP11(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP11_SHIFT)) & GPIO_MASK_MASKP11_MASK)\r\n\r\n#define GPIO_MASK_MASKP12_MASK                   (0x1000U)\r\n#define GPIO_MASK_MASKP12_SHIFT                  (12U)\r\n/*! MASKP12 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP12(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP12_SHIFT)) & GPIO_MASK_MASKP12_MASK)\r\n\r\n#define GPIO_MASK_MASKP13_MASK                   (0x2000U)\r\n#define GPIO_MASK_MASKP13_SHIFT                  (13U)\r\n/*! MASKP13 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP13(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP13_SHIFT)) & GPIO_MASK_MASKP13_MASK)\r\n\r\n#define GPIO_MASK_MASKP14_MASK                   (0x4000U)\r\n#define GPIO_MASK_MASKP14_SHIFT                  (14U)\r\n/*! MASKP14 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP14(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP14_SHIFT)) & GPIO_MASK_MASKP14_MASK)\r\n\r\n#define GPIO_MASK_MASKP15_MASK                   (0x8000U)\r\n#define GPIO_MASK_MASKP15_SHIFT                  (15U)\r\n/*! MASKP15 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP15(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP15_SHIFT)) & GPIO_MASK_MASKP15_MASK)\r\n\r\n#define GPIO_MASK_MASKP16_MASK                   (0x10000U)\r\n#define GPIO_MASK_MASKP16_SHIFT                  (16U)\r\n/*! MASKP16 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP16(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP16_SHIFT)) & GPIO_MASK_MASKP16_MASK)\r\n\r\n#define GPIO_MASK_MASKP17_MASK                   (0x20000U)\r\n#define GPIO_MASK_MASKP17_SHIFT                  (17U)\r\n/*! MASKP17 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP17(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP17_SHIFT)) & GPIO_MASK_MASKP17_MASK)\r\n\r\n#define GPIO_MASK_MASKP18_MASK                   (0x40000U)\r\n#define GPIO_MASK_MASKP18_SHIFT                  (18U)\r\n/*! MASKP18 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP18(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP18_SHIFT)) & GPIO_MASK_MASKP18_MASK)\r\n\r\n#define GPIO_MASK_MASKP19_MASK                   (0x80000U)\r\n#define GPIO_MASK_MASKP19_SHIFT                  (19U)\r\n/*! MASKP19 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP19(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP19_SHIFT)) & GPIO_MASK_MASKP19_MASK)\r\n\r\n#define GPIO_MASK_MASKP20_MASK                   (0x100000U)\r\n#define GPIO_MASK_MASKP20_SHIFT                  (20U)\r\n/*! MASKP20 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP20(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP20_SHIFT)) & GPIO_MASK_MASKP20_MASK)\r\n\r\n#define GPIO_MASK_MASKP21_MASK                   (0x200000U)\r\n#define GPIO_MASK_MASKP21_SHIFT                  (21U)\r\n/*! MASKP21 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP21(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP21_SHIFT)) & GPIO_MASK_MASKP21_MASK)\r\n\r\n#define GPIO_MASK_MASKP22_MASK                   (0x400000U)\r\n#define GPIO_MASK_MASKP22_SHIFT                  (22U)\r\n/*! MASKP22 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP22(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP22_SHIFT)) & GPIO_MASK_MASKP22_MASK)\r\n\r\n#define GPIO_MASK_MASKP23_MASK                   (0x800000U)\r\n#define GPIO_MASK_MASKP23_SHIFT                  (23U)\r\n/*! MASKP23 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP23(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP23_SHIFT)) & GPIO_MASK_MASKP23_MASK)\r\n\r\n#define GPIO_MASK_MASKP24_MASK                   (0x1000000U)\r\n#define GPIO_MASK_MASKP24_SHIFT                  (24U)\r\n/*! MASKP24 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP24(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP24_SHIFT)) & GPIO_MASK_MASKP24_MASK)\r\n\r\n#define GPIO_MASK_MASKP25_MASK                   (0x2000000U)\r\n#define GPIO_MASK_MASKP25_SHIFT                  (25U)\r\n/*! MASKP25 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP25(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP25_SHIFT)) & GPIO_MASK_MASKP25_MASK)\r\n\r\n#define GPIO_MASK_MASKP26_MASK                   (0x4000000U)\r\n#define GPIO_MASK_MASKP26_SHIFT                  (26U)\r\n/*! MASKP26 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP26(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP26_SHIFT)) & GPIO_MASK_MASKP26_MASK)\r\n\r\n#define GPIO_MASK_MASKP27_MASK                   (0x8000000U)\r\n#define GPIO_MASK_MASKP27_SHIFT                  (27U)\r\n/*! MASKP27 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP27(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP27_SHIFT)) & GPIO_MASK_MASKP27_MASK)\r\n\r\n#define GPIO_MASK_MASKP28_MASK                   (0x10000000U)\r\n#define GPIO_MASK_MASKP28_SHIFT                  (28U)\r\n/*! MASKP28 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP28(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP28_SHIFT)) & GPIO_MASK_MASKP28_MASK)\r\n\r\n#define GPIO_MASK_MASKP29_MASK                   (0x20000000U)\r\n#define GPIO_MASK_MASKP29_SHIFT                  (29U)\r\n/*! MASKP29 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP29(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP29_SHIFT)) & GPIO_MASK_MASKP29_MASK)\r\n\r\n#define GPIO_MASK_MASKP30_MASK                   (0x40000000U)\r\n#define GPIO_MASK_MASKP30_SHIFT                  (30U)\r\n/*! MASKP30 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP30(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP30_SHIFT)) & GPIO_MASK_MASKP30_MASK)\r\n\r\n#define GPIO_MASK_MASKP31_MASK                   (0x80000000U)\r\n#define GPIO_MASK_MASKP31_SHIFT                  (31U)\r\n/*! MASKP31 - Port Mask\r\n *  0b0..Read MPIN: pin state; write MPIN: load output bit\r\n *  0b1..Read MPIN: 0; write MPIN: output bit not affected\r\n */\r\n#define GPIO_MASK_MASKP31(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MASK_MASKP31_SHIFT)) & GPIO_MASK_MASKP31_MASK)\r\n/*! @} */\r\n\r\n/* The count of GPIO_MASK */\r\n#define GPIO_MASK_COUNT                          (2U)\r\n\r\n/*! @name PIN - Port pin */\r\n/*! @{ */\r\n\r\n#define GPIO_PIN_PORT0_MASK                      (0x1U)\r\n#define GPIO_PIN_PORT0_SHIFT                     (0U)\r\n/*! PORT0 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT0(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT0_SHIFT)) & GPIO_PIN_PORT0_MASK)\r\n\r\n#define GPIO_PIN_PORT1_MASK                      (0x2U)\r\n#define GPIO_PIN_PORT1_SHIFT                     (1U)\r\n/*! PORT1 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT1(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT1_SHIFT)) & GPIO_PIN_PORT1_MASK)\r\n\r\n#define GPIO_PIN_PORT2_MASK                      (0x4U)\r\n#define GPIO_PIN_PORT2_SHIFT                     (2U)\r\n/*! PORT2 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT2(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT2_SHIFT)) & GPIO_PIN_PORT2_MASK)\r\n\r\n#define GPIO_PIN_PORT3_MASK                      (0x8U)\r\n#define GPIO_PIN_PORT3_SHIFT                     (3U)\r\n/*! PORT3 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT3(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT3_SHIFT)) & GPIO_PIN_PORT3_MASK)\r\n\r\n#define GPIO_PIN_PORT4_MASK                      (0x10U)\r\n#define GPIO_PIN_PORT4_SHIFT                     (4U)\r\n/*! PORT4 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT4(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT4_SHIFT)) & GPIO_PIN_PORT4_MASK)\r\n\r\n#define GPIO_PIN_PORT5_MASK                      (0x20U)\r\n#define GPIO_PIN_PORT5_SHIFT                     (5U)\r\n/*! PORT5 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT5(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT5_SHIFT)) & GPIO_PIN_PORT5_MASK)\r\n\r\n#define GPIO_PIN_PORT6_MASK                      (0x40U)\r\n#define GPIO_PIN_PORT6_SHIFT                     (6U)\r\n/*! PORT6 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT6(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT6_SHIFT)) & GPIO_PIN_PORT6_MASK)\r\n\r\n#define GPIO_PIN_PORT7_MASK                      (0x80U)\r\n#define GPIO_PIN_PORT7_SHIFT                     (7U)\r\n/*! PORT7 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT7(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT7_SHIFT)) & GPIO_PIN_PORT7_MASK)\r\n\r\n#define GPIO_PIN_PORT8_MASK                      (0x100U)\r\n#define GPIO_PIN_PORT8_SHIFT                     (8U)\r\n/*! PORT8 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT8(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT8_SHIFT)) & GPIO_PIN_PORT8_MASK)\r\n\r\n#define GPIO_PIN_PORT9_MASK                      (0x200U)\r\n#define GPIO_PIN_PORT9_SHIFT                     (9U)\r\n/*! PORT9 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT9(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT9_SHIFT)) & GPIO_PIN_PORT9_MASK)\r\n\r\n#define GPIO_PIN_PORT10_MASK                     (0x400U)\r\n#define GPIO_PIN_PORT10_SHIFT                    (10U)\r\n/*! PORT10 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT10(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT10_SHIFT)) & GPIO_PIN_PORT10_MASK)\r\n\r\n#define GPIO_PIN_PORT11_MASK                     (0x800U)\r\n#define GPIO_PIN_PORT11_SHIFT                    (11U)\r\n/*! PORT11 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT11(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT11_SHIFT)) & GPIO_PIN_PORT11_MASK)\r\n\r\n#define GPIO_PIN_PORT12_MASK                     (0x1000U)\r\n#define GPIO_PIN_PORT12_SHIFT                    (12U)\r\n/*! PORT12 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT12(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT12_SHIFT)) & GPIO_PIN_PORT12_MASK)\r\n\r\n#define GPIO_PIN_PORT13_MASK                     (0x2000U)\r\n#define GPIO_PIN_PORT13_SHIFT                    (13U)\r\n/*! PORT13 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT13(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT13_SHIFT)) & GPIO_PIN_PORT13_MASK)\r\n\r\n#define GPIO_PIN_PORT14_MASK                     (0x4000U)\r\n#define GPIO_PIN_PORT14_SHIFT                    (14U)\r\n/*! PORT14 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT14(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT14_SHIFT)) & GPIO_PIN_PORT14_MASK)\r\n\r\n#define GPIO_PIN_PORT15_MASK                     (0x8000U)\r\n#define GPIO_PIN_PORT15_SHIFT                    (15U)\r\n/*! PORT15 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT15(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT15_SHIFT)) & GPIO_PIN_PORT15_MASK)\r\n\r\n#define GPIO_PIN_PORT16_MASK                     (0x10000U)\r\n#define GPIO_PIN_PORT16_SHIFT                    (16U)\r\n/*! PORT16 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT16(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT16_SHIFT)) & GPIO_PIN_PORT16_MASK)\r\n\r\n#define GPIO_PIN_PORT17_MASK                     (0x20000U)\r\n#define GPIO_PIN_PORT17_SHIFT                    (17U)\r\n/*! PORT17 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT17(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT17_SHIFT)) & GPIO_PIN_PORT17_MASK)\r\n\r\n#define GPIO_PIN_PORT18_MASK                     (0x40000U)\r\n#define GPIO_PIN_PORT18_SHIFT                    (18U)\r\n/*! PORT18 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT18(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT18_SHIFT)) & GPIO_PIN_PORT18_MASK)\r\n\r\n#define GPIO_PIN_PORT19_MASK                     (0x80000U)\r\n#define GPIO_PIN_PORT19_SHIFT                    (19U)\r\n/*! PORT19 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT19(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT19_SHIFT)) & GPIO_PIN_PORT19_MASK)\r\n\r\n#define GPIO_PIN_PORT20_MASK                     (0x100000U)\r\n#define GPIO_PIN_PORT20_SHIFT                    (20U)\r\n/*! PORT20 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT20(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT20_SHIFT)) & GPIO_PIN_PORT20_MASK)\r\n\r\n#define GPIO_PIN_PORT21_MASK                     (0x200000U)\r\n#define GPIO_PIN_PORT21_SHIFT                    (21U)\r\n/*! PORT21 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT21(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT21_SHIFT)) & GPIO_PIN_PORT21_MASK)\r\n\r\n#define GPIO_PIN_PORT22_MASK                     (0x400000U)\r\n#define GPIO_PIN_PORT22_SHIFT                    (22U)\r\n/*! PORT22 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT22(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT22_SHIFT)) & GPIO_PIN_PORT22_MASK)\r\n\r\n#define GPIO_PIN_PORT23_MASK                     (0x800000U)\r\n#define GPIO_PIN_PORT23_SHIFT                    (23U)\r\n/*! PORT23 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT23(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT23_SHIFT)) & GPIO_PIN_PORT23_MASK)\r\n\r\n#define GPIO_PIN_PORT24_MASK                     (0x1000000U)\r\n#define GPIO_PIN_PORT24_SHIFT                    (24U)\r\n/*! PORT24 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT24(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT24_SHIFT)) & GPIO_PIN_PORT24_MASK)\r\n\r\n#define GPIO_PIN_PORT25_MASK                     (0x2000000U)\r\n#define GPIO_PIN_PORT25_SHIFT                    (25U)\r\n/*! PORT25 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT25(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT25_SHIFT)) & GPIO_PIN_PORT25_MASK)\r\n\r\n#define GPIO_PIN_PORT26_MASK                     (0x4000000U)\r\n#define GPIO_PIN_PORT26_SHIFT                    (26U)\r\n/*! PORT26 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT26(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT26_SHIFT)) & GPIO_PIN_PORT26_MASK)\r\n\r\n#define GPIO_PIN_PORT27_MASK                     (0x8000000U)\r\n#define GPIO_PIN_PORT27_SHIFT                    (27U)\r\n/*! PORT27 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT27(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT27_SHIFT)) & GPIO_PIN_PORT27_MASK)\r\n\r\n#define GPIO_PIN_PORT28_MASK                     (0x10000000U)\r\n#define GPIO_PIN_PORT28_SHIFT                    (28U)\r\n/*! PORT28 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT28(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT28_SHIFT)) & GPIO_PIN_PORT28_MASK)\r\n\r\n#define GPIO_PIN_PORT29_MASK                     (0x20000000U)\r\n#define GPIO_PIN_PORT29_SHIFT                    (29U)\r\n/*! PORT29 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT29(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT29_SHIFT)) & GPIO_PIN_PORT29_MASK)\r\n\r\n#define GPIO_PIN_PORT30_MASK                     (0x40000000U)\r\n#define GPIO_PIN_PORT30_SHIFT                    (30U)\r\n/*! PORT30 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT30(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT30_SHIFT)) & GPIO_PIN_PORT30_MASK)\r\n\r\n#define GPIO_PIN_PORT31_MASK                     (0x80000000U)\r\n#define GPIO_PIN_PORT31_SHIFT                    (31U)\r\n/*! PORT31 - Port pins\r\n *  0b0..Read- pin is low; Write- clear output bit\r\n *  0b1..Read- pin is high; Write- set output bit\r\n */\r\n#define GPIO_PIN_PORT31(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_PIN_PORT31_SHIFT)) & GPIO_PIN_PORT31_MASK)\r\n/*! @} */\r\n\r\n/* The count of GPIO_PIN */\r\n#define GPIO_PIN_COUNT                           (2U)\r\n\r\n/*! @name MPIN - Masked Port Pin */\r\n/*! @{ */\r\n\r\n#define GPIO_MPIN_MPORTP0_MASK                   (0x1U)\r\n#define GPIO_MPIN_MPORTP0_SHIFT                  (0U)\r\n/*! MPORTP0 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP0(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP0_SHIFT)) & GPIO_MPIN_MPORTP0_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP1_MASK                   (0x2U)\r\n#define GPIO_MPIN_MPORTP1_SHIFT                  (1U)\r\n/*! MPORTP1 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP1(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP1_SHIFT)) & GPIO_MPIN_MPORTP1_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP2_MASK                   (0x4U)\r\n#define GPIO_MPIN_MPORTP2_SHIFT                  (2U)\r\n/*! MPORTP2 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP2(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP2_SHIFT)) & GPIO_MPIN_MPORTP2_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP3_MASK                   (0x8U)\r\n#define GPIO_MPIN_MPORTP3_SHIFT                  (3U)\r\n/*! MPORTP3 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP3(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP3_SHIFT)) & GPIO_MPIN_MPORTP3_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP4_MASK                   (0x10U)\r\n#define GPIO_MPIN_MPORTP4_SHIFT                  (4U)\r\n/*! MPORTP4 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP4(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP4_SHIFT)) & GPIO_MPIN_MPORTP4_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP5_MASK                   (0x20U)\r\n#define GPIO_MPIN_MPORTP5_SHIFT                  (5U)\r\n/*! MPORTP5 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP5(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP5_SHIFT)) & GPIO_MPIN_MPORTP5_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP6_MASK                   (0x40U)\r\n#define GPIO_MPIN_MPORTP6_SHIFT                  (6U)\r\n/*! MPORTP6 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP6(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP6_SHIFT)) & GPIO_MPIN_MPORTP6_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP7_MASK                   (0x80U)\r\n#define GPIO_MPIN_MPORTP7_SHIFT                  (7U)\r\n/*! MPORTP7 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP7(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP7_SHIFT)) & GPIO_MPIN_MPORTP7_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP8_MASK                   (0x100U)\r\n#define GPIO_MPIN_MPORTP8_SHIFT                  (8U)\r\n/*! MPORTP8 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP8(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP8_SHIFT)) & GPIO_MPIN_MPORTP8_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP9_MASK                   (0x200U)\r\n#define GPIO_MPIN_MPORTP9_SHIFT                  (9U)\r\n/*! MPORTP9 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP9(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP9_SHIFT)) & GPIO_MPIN_MPORTP9_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP10_MASK                  (0x400U)\r\n#define GPIO_MPIN_MPORTP10_SHIFT                 (10U)\r\n/*! MPORTP10 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP10(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP10_SHIFT)) & GPIO_MPIN_MPORTP10_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP11_MASK                  (0x800U)\r\n#define GPIO_MPIN_MPORTP11_SHIFT                 (11U)\r\n/*! MPORTP11 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP11(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP11_SHIFT)) & GPIO_MPIN_MPORTP11_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP12_MASK                  (0x1000U)\r\n#define GPIO_MPIN_MPORTP12_SHIFT                 (12U)\r\n/*! MPORTP12 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP12(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP12_SHIFT)) & GPIO_MPIN_MPORTP12_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP13_MASK                  (0x2000U)\r\n#define GPIO_MPIN_MPORTP13_SHIFT                 (13U)\r\n/*! MPORTP13 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP13(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP13_SHIFT)) & GPIO_MPIN_MPORTP13_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP14_MASK                  (0x4000U)\r\n#define GPIO_MPIN_MPORTP14_SHIFT                 (14U)\r\n/*! MPORTP14 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP14(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP14_SHIFT)) & GPIO_MPIN_MPORTP14_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP15_MASK                  (0x8000U)\r\n#define GPIO_MPIN_MPORTP15_SHIFT                 (15U)\r\n/*! MPORTP15 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP15(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP15_SHIFT)) & GPIO_MPIN_MPORTP15_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP16_MASK                  (0x10000U)\r\n#define GPIO_MPIN_MPORTP16_SHIFT                 (16U)\r\n/*! MPORTP16 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP16(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP16_SHIFT)) & GPIO_MPIN_MPORTP16_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP17_MASK                  (0x20000U)\r\n#define GPIO_MPIN_MPORTP17_SHIFT                 (17U)\r\n/*! MPORTP17 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP17(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP17_SHIFT)) & GPIO_MPIN_MPORTP17_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP18_MASK                  (0x40000U)\r\n#define GPIO_MPIN_MPORTP18_SHIFT                 (18U)\r\n/*! MPORTP18 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP18(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP18_SHIFT)) & GPIO_MPIN_MPORTP18_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP19_MASK                  (0x80000U)\r\n#define GPIO_MPIN_MPORTP19_SHIFT                 (19U)\r\n/*! MPORTP19 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP19(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP19_SHIFT)) & GPIO_MPIN_MPORTP19_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP20_MASK                  (0x100000U)\r\n#define GPIO_MPIN_MPORTP20_SHIFT                 (20U)\r\n/*! MPORTP20 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP20(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP20_SHIFT)) & GPIO_MPIN_MPORTP20_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP21_MASK                  (0x200000U)\r\n#define GPIO_MPIN_MPORTP21_SHIFT                 (21U)\r\n/*! MPORTP21 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP21(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP21_SHIFT)) & GPIO_MPIN_MPORTP21_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP22_MASK                  (0x400000U)\r\n#define GPIO_MPIN_MPORTP22_SHIFT                 (22U)\r\n/*! MPORTP22 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP22(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP22_SHIFT)) & GPIO_MPIN_MPORTP22_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP23_MASK                  (0x800000U)\r\n#define GPIO_MPIN_MPORTP23_SHIFT                 (23U)\r\n/*! MPORTP23 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP23(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP23_SHIFT)) & GPIO_MPIN_MPORTP23_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP24_MASK                  (0x1000000U)\r\n#define GPIO_MPIN_MPORTP24_SHIFT                 (24U)\r\n/*! MPORTP24 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP24(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP24_SHIFT)) & GPIO_MPIN_MPORTP24_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP25_MASK                  (0x2000000U)\r\n#define GPIO_MPIN_MPORTP25_SHIFT                 (25U)\r\n/*! MPORTP25 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP25(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP25_SHIFT)) & GPIO_MPIN_MPORTP25_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP26_MASK                  (0x4000000U)\r\n#define GPIO_MPIN_MPORTP26_SHIFT                 (26U)\r\n/*! MPORTP26 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP26(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP26_SHIFT)) & GPIO_MPIN_MPORTP26_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP27_MASK                  (0x8000000U)\r\n#define GPIO_MPIN_MPORTP27_SHIFT                 (27U)\r\n/*! MPORTP27 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP27(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP27_SHIFT)) & GPIO_MPIN_MPORTP27_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP28_MASK                  (0x10000000U)\r\n#define GPIO_MPIN_MPORTP28_SHIFT                 (28U)\r\n/*! MPORTP28 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP28(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP28_SHIFT)) & GPIO_MPIN_MPORTP28_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP29_MASK                  (0x20000000U)\r\n#define GPIO_MPIN_MPORTP29_SHIFT                 (29U)\r\n/*! MPORTP29 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP29(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP29_SHIFT)) & GPIO_MPIN_MPORTP29_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP30_MASK                  (0x40000000U)\r\n#define GPIO_MPIN_MPORTP30_SHIFT                 (30U)\r\n/*! MPORTP30 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP30(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP30_SHIFT)) & GPIO_MPIN_MPORTP30_MASK)\r\n\r\n#define GPIO_MPIN_MPORTP31_MASK                  (0x80000000U)\r\n#define GPIO_MPIN_MPORTP31_SHIFT                 (31U)\r\n/*! MPORTP31 - Mask bits for port pins\r\n *  0b0..Read- pin is LOW and/or the corresponding bit in the MASK register is 1; write- clear output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n *  0b1..Read- pin is HIGH and the corresponding bit in the MASK register is 0; write- set output bit if the\r\n *       corresponding bit in the MASK register is 0\r\n */\r\n#define GPIO_MPIN_MPORTP31(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_MPIN_MPORTP31_SHIFT)) & GPIO_MPIN_MPORTP31_MASK)\r\n/*! @} */\r\n\r\n/* The count of GPIO_MPIN */\r\n#define GPIO_MPIN_COUNT                          (2U)\r\n\r\n/*! @name SET - Port set */\r\n/*! @{ */\r\n\r\n#define GPIO_SET_SETP_MASK                       (0xFFFFFFFFU)\r\n#define GPIO_SET_SETP_SHIFT                      (0U)\r\n/*! SETP - Read or set output bits\r\n *  0b00000000000000000000000000000000..Read- output bit; write- no operation\r\n *  0b00000000000000000000000000000001..Read- output bit; write- set output bit\r\n */\r\n#define GPIO_SET_SETP(x)                         (((uint32_t)(((uint32_t)(x)) << GPIO_SET_SETP_SHIFT)) & GPIO_SET_SETP_MASK)\r\n/*! @} */\r\n\r\n/* The count of GPIO_SET */\r\n#define GPIO_SET_COUNT                           (2U)\r\n\r\n/*! @name CLR - Port clear */\r\n/*! @{ */\r\n\r\n#define GPIO_CLR_CLRP0_MASK                      (0x1U)\r\n#define GPIO_CLR_CLRP0_SHIFT                     (0U)\r\n/*! CLRP0 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP0(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP0_SHIFT)) & GPIO_CLR_CLRP0_MASK)\r\n\r\n#define GPIO_CLR_CLRP1_MASK                      (0x2U)\r\n#define GPIO_CLR_CLRP1_SHIFT                     (1U)\r\n/*! CLRP1 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP1(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP1_SHIFT)) & GPIO_CLR_CLRP1_MASK)\r\n\r\n#define GPIO_CLR_CLRP2_MASK                      (0x4U)\r\n#define GPIO_CLR_CLRP2_SHIFT                     (2U)\r\n/*! CLRP2 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP2(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP2_SHIFT)) & GPIO_CLR_CLRP2_MASK)\r\n\r\n#define GPIO_CLR_CLRP3_MASK                      (0x8U)\r\n#define GPIO_CLR_CLRP3_SHIFT                     (3U)\r\n/*! CLRP3 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP3(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP3_SHIFT)) & GPIO_CLR_CLRP3_MASK)\r\n\r\n#define GPIO_CLR_CLRP4_MASK                      (0x10U)\r\n#define GPIO_CLR_CLRP4_SHIFT                     (4U)\r\n/*! CLRP4 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP4(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP4_SHIFT)) & GPIO_CLR_CLRP4_MASK)\r\n\r\n#define GPIO_CLR_CLRP5_MASK                      (0x20U)\r\n#define GPIO_CLR_CLRP5_SHIFT                     (5U)\r\n/*! CLRP5 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP5(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP5_SHIFT)) & GPIO_CLR_CLRP5_MASK)\r\n\r\n#define GPIO_CLR_CLRP6_MASK                      (0x40U)\r\n#define GPIO_CLR_CLRP6_SHIFT                     (6U)\r\n/*! CLRP6 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP6(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP6_SHIFT)) & GPIO_CLR_CLRP6_MASK)\r\n\r\n#define GPIO_CLR_CLRP7_MASK                      (0x80U)\r\n#define GPIO_CLR_CLRP7_SHIFT                     (7U)\r\n/*! CLRP7 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP7(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP7_SHIFT)) & GPIO_CLR_CLRP7_MASK)\r\n\r\n#define GPIO_CLR_CLRP8_MASK                      (0x100U)\r\n#define GPIO_CLR_CLRP8_SHIFT                     (8U)\r\n/*! CLRP8 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP8(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP8_SHIFT)) & GPIO_CLR_CLRP8_MASK)\r\n\r\n#define GPIO_CLR_CLRP9_MASK                      (0x200U)\r\n#define GPIO_CLR_CLRP9_SHIFT                     (9U)\r\n/*! CLRP9 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP9(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP9_SHIFT)) & GPIO_CLR_CLRP9_MASK)\r\n\r\n#define GPIO_CLR_CLRP10_MASK                     (0x400U)\r\n#define GPIO_CLR_CLRP10_SHIFT                    (10U)\r\n/*! CLRP10 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP10(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP10_SHIFT)) & GPIO_CLR_CLRP10_MASK)\r\n\r\n#define GPIO_CLR_CLRP11_MASK                     (0x800U)\r\n#define GPIO_CLR_CLRP11_SHIFT                    (11U)\r\n/*! CLRP11 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP11(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP11_SHIFT)) & GPIO_CLR_CLRP11_MASK)\r\n\r\n#define GPIO_CLR_CLRP12_MASK                     (0x1000U)\r\n#define GPIO_CLR_CLRP12_SHIFT                    (12U)\r\n/*! CLRP12 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP12(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP12_SHIFT)) & GPIO_CLR_CLRP12_MASK)\r\n\r\n#define GPIO_CLR_CLRP13_MASK                     (0x2000U)\r\n#define GPIO_CLR_CLRP13_SHIFT                    (13U)\r\n/*! CLRP13 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP13(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP13_SHIFT)) & GPIO_CLR_CLRP13_MASK)\r\n\r\n#define GPIO_CLR_CLRP14_MASK                     (0x4000U)\r\n#define GPIO_CLR_CLRP14_SHIFT                    (14U)\r\n/*! CLRP14 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP14(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP14_SHIFT)) & GPIO_CLR_CLRP14_MASK)\r\n\r\n#define GPIO_CLR_CLRP15_MASK                     (0x8000U)\r\n#define GPIO_CLR_CLRP15_SHIFT                    (15U)\r\n/*! CLRP15 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP15(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP15_SHIFT)) & GPIO_CLR_CLRP15_MASK)\r\n\r\n#define GPIO_CLR_CLRP16_MASK                     (0x10000U)\r\n#define GPIO_CLR_CLRP16_SHIFT                    (16U)\r\n/*! CLRP16 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP16(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP16_SHIFT)) & GPIO_CLR_CLRP16_MASK)\r\n\r\n#define GPIO_CLR_CLRP17_MASK                     (0x20000U)\r\n#define GPIO_CLR_CLRP17_SHIFT                    (17U)\r\n/*! CLRP17 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP17(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP17_SHIFT)) & GPIO_CLR_CLRP17_MASK)\r\n\r\n#define GPIO_CLR_CLRP18_MASK                     (0x40000U)\r\n#define GPIO_CLR_CLRP18_SHIFT                    (18U)\r\n/*! CLRP18 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP18(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP18_SHIFT)) & GPIO_CLR_CLRP18_MASK)\r\n\r\n#define GPIO_CLR_CLRP19_MASK                     (0x80000U)\r\n#define GPIO_CLR_CLRP19_SHIFT                    (19U)\r\n/*! CLRP19 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP19(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP19_SHIFT)) & GPIO_CLR_CLRP19_MASK)\r\n\r\n#define GPIO_CLR_CLRP20_MASK                     (0x100000U)\r\n#define GPIO_CLR_CLRP20_SHIFT                    (20U)\r\n/*! CLRP20 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP20(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP20_SHIFT)) & GPIO_CLR_CLRP20_MASK)\r\n\r\n#define GPIO_CLR_CLRP21_MASK                     (0x200000U)\r\n#define GPIO_CLR_CLRP21_SHIFT                    (21U)\r\n/*! CLRP21 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP21(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP21_SHIFT)) & GPIO_CLR_CLRP21_MASK)\r\n\r\n#define GPIO_CLR_CLRP22_MASK                     (0x400000U)\r\n#define GPIO_CLR_CLRP22_SHIFT                    (22U)\r\n/*! CLRP22 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP22(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP22_SHIFT)) & GPIO_CLR_CLRP22_MASK)\r\n\r\n#define GPIO_CLR_CLRP23_MASK                     (0x800000U)\r\n#define GPIO_CLR_CLRP23_SHIFT                    (23U)\r\n/*! CLRP23 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP23(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP23_SHIFT)) & GPIO_CLR_CLRP23_MASK)\r\n\r\n#define GPIO_CLR_CLRP24_MASK                     (0x1000000U)\r\n#define GPIO_CLR_CLRP24_SHIFT                    (24U)\r\n/*! CLRP24 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP24(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP24_SHIFT)) & GPIO_CLR_CLRP24_MASK)\r\n\r\n#define GPIO_CLR_CLRP25_MASK                     (0x2000000U)\r\n#define GPIO_CLR_CLRP25_SHIFT                    (25U)\r\n/*! CLRP25 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP25(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP25_SHIFT)) & GPIO_CLR_CLRP25_MASK)\r\n\r\n#define GPIO_CLR_CLRP26_MASK                     (0x4000000U)\r\n#define GPIO_CLR_CLRP26_SHIFT                    (26U)\r\n/*! CLRP26 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP26(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP26_SHIFT)) & GPIO_CLR_CLRP26_MASK)\r\n\r\n#define GPIO_CLR_CLRP27_MASK                     (0x8000000U)\r\n#define GPIO_CLR_CLRP27_SHIFT                    (27U)\r\n/*! CLRP27 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP27(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP27_SHIFT)) & GPIO_CLR_CLRP27_MASK)\r\n\r\n#define GPIO_CLR_CLRP28_MASK                     (0x10000000U)\r\n#define GPIO_CLR_CLRP28_SHIFT                    (28U)\r\n/*! CLRP28 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP28(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP28_SHIFT)) & GPIO_CLR_CLRP28_MASK)\r\n\r\n#define GPIO_CLR_CLRP29_MASK                     (0x20000000U)\r\n#define GPIO_CLR_CLRP29_SHIFT                    (29U)\r\n/*! CLRP29 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP29(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP29_SHIFT)) & GPIO_CLR_CLRP29_MASK)\r\n\r\n#define GPIO_CLR_CLRP30_MASK                     (0x40000000U)\r\n#define GPIO_CLR_CLRP30_SHIFT                    (30U)\r\n/*! CLRP30 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP30(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP30_SHIFT)) & GPIO_CLR_CLRP30_MASK)\r\n\r\n#define GPIO_CLR_CLRP31_MASK                     (0x80000000U)\r\n#define GPIO_CLR_CLRP31_SHIFT                    (31U)\r\n/*! CLRP31 - Clear output bits\r\n *  0b0..No operation\r\n *  0b1..Clears output bit\r\n */\r\n#define GPIO_CLR_CLRP31(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_CLR_CLRP31_SHIFT)) & GPIO_CLR_CLRP31_MASK)\r\n/*! @} */\r\n\r\n/* The count of GPIO_CLR */\r\n#define GPIO_CLR_COUNT                           (2U)\r\n\r\n/*! @name NOT - Port toggle */\r\n/*! @{ */\r\n\r\n#define GPIO_NOT_NOTP0_MASK                      (0x1U)\r\n#define GPIO_NOT_NOTP0_SHIFT                     (0U)\r\n/*! NOTP0 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP0(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP0_SHIFT)) & GPIO_NOT_NOTP0_MASK)\r\n\r\n#define GPIO_NOT_NOTP1_MASK                      (0x2U)\r\n#define GPIO_NOT_NOTP1_SHIFT                     (1U)\r\n/*! NOTP1 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP1(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP1_SHIFT)) & GPIO_NOT_NOTP1_MASK)\r\n\r\n#define GPIO_NOT_NOTP2_MASK                      (0x4U)\r\n#define GPIO_NOT_NOTP2_SHIFT                     (2U)\r\n/*! NOTP2 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP2(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP2_SHIFT)) & GPIO_NOT_NOTP2_MASK)\r\n\r\n#define GPIO_NOT_NOTP3_MASK                      (0x8U)\r\n#define GPIO_NOT_NOTP3_SHIFT                     (3U)\r\n/*! NOTP3 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP3(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP3_SHIFT)) & GPIO_NOT_NOTP3_MASK)\r\n\r\n#define GPIO_NOT_NOTP4_MASK                      (0x10U)\r\n#define GPIO_NOT_NOTP4_SHIFT                     (4U)\r\n/*! NOTP4 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP4(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP4_SHIFT)) & GPIO_NOT_NOTP4_MASK)\r\n\r\n#define GPIO_NOT_NOTP5_MASK                      (0x20U)\r\n#define GPIO_NOT_NOTP5_SHIFT                     (5U)\r\n/*! NOTP5 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP5(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP5_SHIFT)) & GPIO_NOT_NOTP5_MASK)\r\n\r\n#define GPIO_NOT_NOTP6_MASK                      (0x40U)\r\n#define GPIO_NOT_NOTP6_SHIFT                     (6U)\r\n/*! NOTP6 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP6(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP6_SHIFT)) & GPIO_NOT_NOTP6_MASK)\r\n\r\n#define GPIO_NOT_NOTP7_MASK                      (0x80U)\r\n#define GPIO_NOT_NOTP7_SHIFT                     (7U)\r\n/*! NOTP7 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP7(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP7_SHIFT)) & GPIO_NOT_NOTP7_MASK)\r\n\r\n#define GPIO_NOT_NOTP8_MASK                      (0x100U)\r\n#define GPIO_NOT_NOTP8_SHIFT                     (8U)\r\n/*! NOTP8 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP8(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP8_SHIFT)) & GPIO_NOT_NOTP8_MASK)\r\n\r\n#define GPIO_NOT_NOTP9_MASK                      (0x200U)\r\n#define GPIO_NOT_NOTP9_SHIFT                     (9U)\r\n/*! NOTP9 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP9(x)                        (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP9_SHIFT)) & GPIO_NOT_NOTP9_MASK)\r\n\r\n#define GPIO_NOT_NOTP10_MASK                     (0x400U)\r\n#define GPIO_NOT_NOTP10_SHIFT                    (10U)\r\n/*! NOTP10 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP10(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP10_SHIFT)) & GPIO_NOT_NOTP10_MASK)\r\n\r\n#define GPIO_NOT_NOTP11_MASK                     (0x800U)\r\n#define GPIO_NOT_NOTP11_SHIFT                    (11U)\r\n/*! NOTP11 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP11(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP11_SHIFT)) & GPIO_NOT_NOTP11_MASK)\r\n\r\n#define GPIO_NOT_NOTP12_MASK                     (0x1000U)\r\n#define GPIO_NOT_NOTP12_SHIFT                    (12U)\r\n/*! NOTP12 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP12(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP12_SHIFT)) & GPIO_NOT_NOTP12_MASK)\r\n\r\n#define GPIO_NOT_NOTP13_MASK                     (0x2000U)\r\n#define GPIO_NOT_NOTP13_SHIFT                    (13U)\r\n/*! NOTP13 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP13(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP13_SHIFT)) & GPIO_NOT_NOTP13_MASK)\r\n\r\n#define GPIO_NOT_NOTP14_MASK                     (0x4000U)\r\n#define GPIO_NOT_NOTP14_SHIFT                    (14U)\r\n/*! NOTP14 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP14(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP14_SHIFT)) & GPIO_NOT_NOTP14_MASK)\r\n\r\n#define GPIO_NOT_NOTP15_MASK                     (0x8000U)\r\n#define GPIO_NOT_NOTP15_SHIFT                    (15U)\r\n/*! NOTP15 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP15(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP15_SHIFT)) & GPIO_NOT_NOTP15_MASK)\r\n\r\n#define GPIO_NOT_NOTP16_MASK                     (0x10000U)\r\n#define GPIO_NOT_NOTP16_SHIFT                    (16U)\r\n/*! NOTP16 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP16(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP16_SHIFT)) & GPIO_NOT_NOTP16_MASK)\r\n\r\n#define GPIO_NOT_NOTP17_MASK                     (0x20000U)\r\n#define GPIO_NOT_NOTP17_SHIFT                    (17U)\r\n/*! NOTP17 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP17(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP17_SHIFT)) & GPIO_NOT_NOTP17_MASK)\r\n\r\n#define GPIO_NOT_NOTP18_MASK                     (0x40000U)\r\n#define GPIO_NOT_NOTP18_SHIFT                    (18U)\r\n/*! NOTP18 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP18(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP18_SHIFT)) & GPIO_NOT_NOTP18_MASK)\r\n\r\n#define GPIO_NOT_NOTP19_MASK                     (0x80000U)\r\n#define GPIO_NOT_NOTP19_SHIFT                    (19U)\r\n/*! NOTP19 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP19(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP19_SHIFT)) & GPIO_NOT_NOTP19_MASK)\r\n\r\n#define GPIO_NOT_NOTP20_MASK                     (0x100000U)\r\n#define GPIO_NOT_NOTP20_SHIFT                    (20U)\r\n/*! NOTP20 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP20(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP20_SHIFT)) & GPIO_NOT_NOTP20_MASK)\r\n\r\n#define GPIO_NOT_NOTP21_MASK                     (0x200000U)\r\n#define GPIO_NOT_NOTP21_SHIFT                    (21U)\r\n/*! NOTP21 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP21(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP21_SHIFT)) & GPIO_NOT_NOTP21_MASK)\r\n\r\n#define GPIO_NOT_NOTP22_MASK                     (0x400000U)\r\n#define GPIO_NOT_NOTP22_SHIFT                    (22U)\r\n/*! NOTP22 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP22(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP22_SHIFT)) & GPIO_NOT_NOTP22_MASK)\r\n\r\n#define GPIO_NOT_NOTP23_MASK                     (0x800000U)\r\n#define GPIO_NOT_NOTP23_SHIFT                    (23U)\r\n/*! NOTP23 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP23(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP23_SHIFT)) & GPIO_NOT_NOTP23_MASK)\r\n\r\n#define GPIO_NOT_NOTP24_MASK                     (0x1000000U)\r\n#define GPIO_NOT_NOTP24_SHIFT                    (24U)\r\n/*! NOTP24 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP24(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP24_SHIFT)) & GPIO_NOT_NOTP24_MASK)\r\n\r\n#define GPIO_NOT_NOTP25_MASK                     (0x2000000U)\r\n#define GPIO_NOT_NOTP25_SHIFT                    (25U)\r\n/*! NOTP25 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP25(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP25_SHIFT)) & GPIO_NOT_NOTP25_MASK)\r\n\r\n#define GPIO_NOT_NOTP26_MASK                     (0x4000000U)\r\n#define GPIO_NOT_NOTP26_SHIFT                    (26U)\r\n/*! NOTP26 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP26(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP26_SHIFT)) & GPIO_NOT_NOTP26_MASK)\r\n\r\n#define GPIO_NOT_NOTP27_MASK                     (0x8000000U)\r\n#define GPIO_NOT_NOTP27_SHIFT                    (27U)\r\n/*! NOTP27 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP27(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP27_SHIFT)) & GPIO_NOT_NOTP27_MASK)\r\n\r\n#define GPIO_NOT_NOTP28_MASK                     (0x10000000U)\r\n#define GPIO_NOT_NOTP28_SHIFT                    (28U)\r\n/*! NOTP28 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP28(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP28_SHIFT)) & GPIO_NOT_NOTP28_MASK)\r\n\r\n#define GPIO_NOT_NOTP29_MASK                     (0x20000000U)\r\n#define GPIO_NOT_NOTP29_SHIFT                    (29U)\r\n/*! NOTP29 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP29(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP29_SHIFT)) & GPIO_NOT_NOTP29_MASK)\r\n\r\n#define GPIO_NOT_NOTP30_MASK                     (0x40000000U)\r\n#define GPIO_NOT_NOTP30_SHIFT                    (30U)\r\n/*! NOTP30 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP30(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP30_SHIFT)) & GPIO_NOT_NOTP30_MASK)\r\n\r\n#define GPIO_NOT_NOTP31_MASK                     (0x80000000U)\r\n#define GPIO_NOT_NOTP31_SHIFT                    (31U)\r\n/*! NOTP31 - Toggle output bits\r\n *  0b0..No operation\r\n *  0b1..Toggle output bit\r\n */\r\n#define GPIO_NOT_NOTP31(x)                       (((uint32_t)(((uint32_t)(x)) << GPIO_NOT_NOTP31_SHIFT)) & GPIO_NOT_NOTP31_MASK)\r\n/*! @} */\r\n\r\n/* The count of GPIO_NOT */\r\n#define GPIO_NOT_COUNT                           (2U)\r\n\r\n/*! @name DIRSET - Port direction set */\r\n/*! @{ */\r\n\r\n#define GPIO_DIRSET_DIRSETP0_MASK                (0x1U)\r\n#define GPIO_DIRSET_DIRSETP0_SHIFT               (0U)\r\n/*! DIRSETP0 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP0(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP0_SHIFT)) & GPIO_DIRSET_DIRSETP0_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP1_MASK                (0x2U)\r\n#define GPIO_DIRSET_DIRSETP1_SHIFT               (1U)\r\n/*! DIRSETP1 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP1(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP1_SHIFT)) & GPIO_DIRSET_DIRSETP1_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP2_MASK                (0x4U)\r\n#define GPIO_DIRSET_DIRSETP2_SHIFT               (2U)\r\n/*! DIRSETP2 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP2(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP2_SHIFT)) & GPIO_DIRSET_DIRSETP2_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP3_MASK                (0x8U)\r\n#define GPIO_DIRSET_DIRSETP3_SHIFT               (3U)\r\n/*! DIRSETP3 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP3(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP3_SHIFT)) & GPIO_DIRSET_DIRSETP3_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP4_MASK                (0x10U)\r\n#define GPIO_DIRSET_DIRSETP4_SHIFT               (4U)\r\n/*! DIRSETP4 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP4(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP4_SHIFT)) & GPIO_DIRSET_DIRSETP4_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP5_MASK                (0x20U)\r\n#define GPIO_DIRSET_DIRSETP5_SHIFT               (5U)\r\n/*! DIRSETP5 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP5(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP5_SHIFT)) & GPIO_DIRSET_DIRSETP5_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP6_MASK                (0x40U)\r\n#define GPIO_DIRSET_DIRSETP6_SHIFT               (6U)\r\n/*! DIRSETP6 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP6(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP6_SHIFT)) & GPIO_DIRSET_DIRSETP6_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP7_MASK                (0x80U)\r\n#define GPIO_DIRSET_DIRSETP7_SHIFT               (7U)\r\n/*! DIRSETP7 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP7(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP7_SHIFT)) & GPIO_DIRSET_DIRSETP7_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP8_MASK                (0x100U)\r\n#define GPIO_DIRSET_DIRSETP8_SHIFT               (8U)\r\n/*! DIRSETP8 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP8(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP8_SHIFT)) & GPIO_DIRSET_DIRSETP8_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP9_MASK                (0x200U)\r\n#define GPIO_DIRSET_DIRSETP9_SHIFT               (9U)\r\n/*! DIRSETP9 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP9(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP9_SHIFT)) & GPIO_DIRSET_DIRSETP9_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP10_MASK               (0x400U)\r\n#define GPIO_DIRSET_DIRSETP10_SHIFT              (10U)\r\n/*! DIRSETP10 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP10(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP10_SHIFT)) & GPIO_DIRSET_DIRSETP10_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP11_MASK               (0x800U)\r\n#define GPIO_DIRSET_DIRSETP11_SHIFT              (11U)\r\n/*! DIRSETP11 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP11(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP11_SHIFT)) & GPIO_DIRSET_DIRSETP11_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP12_MASK               (0x1000U)\r\n#define GPIO_DIRSET_DIRSETP12_SHIFT              (12U)\r\n/*! DIRSETP12 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP12(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP12_SHIFT)) & GPIO_DIRSET_DIRSETP12_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP13_MASK               (0x2000U)\r\n#define GPIO_DIRSET_DIRSETP13_SHIFT              (13U)\r\n/*! DIRSETP13 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP13(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP13_SHIFT)) & GPIO_DIRSET_DIRSETP13_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP14_MASK               (0x4000U)\r\n#define GPIO_DIRSET_DIRSETP14_SHIFT              (14U)\r\n/*! DIRSETP14 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP14(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP14_SHIFT)) & GPIO_DIRSET_DIRSETP14_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP15_MASK               (0x8000U)\r\n#define GPIO_DIRSET_DIRSETP15_SHIFT              (15U)\r\n/*! DIRSETP15 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP15(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP15_SHIFT)) & GPIO_DIRSET_DIRSETP15_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP16_MASK               (0x10000U)\r\n#define GPIO_DIRSET_DIRSETP16_SHIFT              (16U)\r\n/*! DIRSETP16 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP16(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP16_SHIFT)) & GPIO_DIRSET_DIRSETP16_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP17_MASK               (0x20000U)\r\n#define GPIO_DIRSET_DIRSETP17_SHIFT              (17U)\r\n/*! DIRSETP17 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP17(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP17_SHIFT)) & GPIO_DIRSET_DIRSETP17_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP18_MASK               (0x40000U)\r\n#define GPIO_DIRSET_DIRSETP18_SHIFT              (18U)\r\n/*! DIRSETP18 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP18(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP18_SHIFT)) & GPIO_DIRSET_DIRSETP18_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP19_MASK               (0x80000U)\r\n#define GPIO_DIRSET_DIRSETP19_SHIFT              (19U)\r\n/*! DIRSETP19 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP19(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP19_SHIFT)) & GPIO_DIRSET_DIRSETP19_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP20_MASK               (0x100000U)\r\n#define GPIO_DIRSET_DIRSETP20_SHIFT              (20U)\r\n/*! DIRSETP20 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP20(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP20_SHIFT)) & GPIO_DIRSET_DIRSETP20_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP21_MASK               (0x200000U)\r\n#define GPIO_DIRSET_DIRSETP21_SHIFT              (21U)\r\n/*! DIRSETP21 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP21(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP21_SHIFT)) & GPIO_DIRSET_DIRSETP21_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP22_MASK               (0x400000U)\r\n#define GPIO_DIRSET_DIRSETP22_SHIFT              (22U)\r\n/*! DIRSETP22 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP22(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP22_SHIFT)) & GPIO_DIRSET_DIRSETP22_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP23_MASK               (0x800000U)\r\n#define GPIO_DIRSET_DIRSETP23_SHIFT              (23U)\r\n/*! DIRSETP23 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP23(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP23_SHIFT)) & GPIO_DIRSET_DIRSETP23_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP24_MASK               (0x1000000U)\r\n#define GPIO_DIRSET_DIRSETP24_SHIFT              (24U)\r\n/*! DIRSETP24 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP24(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP24_SHIFT)) & GPIO_DIRSET_DIRSETP24_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP25_MASK               (0x2000000U)\r\n#define GPIO_DIRSET_DIRSETP25_SHIFT              (25U)\r\n/*! DIRSETP25 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP25(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP25_SHIFT)) & GPIO_DIRSET_DIRSETP25_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP26_MASK               (0x4000000U)\r\n#define GPIO_DIRSET_DIRSETP26_SHIFT              (26U)\r\n/*! DIRSETP26 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP26(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP26_SHIFT)) & GPIO_DIRSET_DIRSETP26_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP27_MASK               (0x8000000U)\r\n#define GPIO_DIRSET_DIRSETP27_SHIFT              (27U)\r\n/*! DIRSETP27 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP27(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP27_SHIFT)) & GPIO_DIRSET_DIRSETP27_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP28_MASK               (0x10000000U)\r\n#define GPIO_DIRSET_DIRSETP28_SHIFT              (28U)\r\n/*! DIRSETP28 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP28(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP28_SHIFT)) & GPIO_DIRSET_DIRSETP28_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP29_MASK               (0x20000000U)\r\n#define GPIO_DIRSET_DIRSETP29_SHIFT              (29U)\r\n/*! DIRSETP29 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP29(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP29_SHIFT)) & GPIO_DIRSET_DIRSETP29_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP30_MASK               (0x40000000U)\r\n#define GPIO_DIRSET_DIRSETP30_SHIFT              (30U)\r\n/*! DIRSETP30 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP30(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP30_SHIFT)) & GPIO_DIRSET_DIRSETP30_MASK)\r\n\r\n#define GPIO_DIRSET_DIRSETP31_MASK               (0x80000000U)\r\n#define GPIO_DIRSET_DIRSETP31_SHIFT              (31U)\r\n/*! DIRSETP31 - Direction set bits for Port pins\r\n *  0b0..No operation\r\n *  0b1..Sets direction bit\r\n */\r\n#define GPIO_DIRSET_DIRSETP31(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRSET_DIRSETP31_SHIFT)) & GPIO_DIRSET_DIRSETP31_MASK)\r\n/*! @} */\r\n\r\n/* The count of GPIO_DIRSET */\r\n#define GPIO_DIRSET_COUNT                        (2U)\r\n\r\n/*! @name DIRCLR - Port direction clear */\r\n/*! @{ */\r\n\r\n#define GPIO_DIRCLR_DIRCLRP0_MASK                (0x1U)\r\n#define GPIO_DIRCLR_DIRCLRP0_SHIFT               (0U)\r\n/*! DIRCLRP0 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP0(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP0_SHIFT)) & GPIO_DIRCLR_DIRCLRP0_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP1_MASK                (0x2U)\r\n#define GPIO_DIRCLR_DIRCLRP1_SHIFT               (1U)\r\n/*! DIRCLRP1 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP1(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP1_SHIFT)) & GPIO_DIRCLR_DIRCLRP1_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP2_MASK                (0x4U)\r\n#define GPIO_DIRCLR_DIRCLRP2_SHIFT               (2U)\r\n/*! DIRCLRP2 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP2(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP2_SHIFT)) & GPIO_DIRCLR_DIRCLRP2_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP3_MASK                (0x8U)\r\n#define GPIO_DIRCLR_DIRCLRP3_SHIFT               (3U)\r\n/*! DIRCLRP3 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP3(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP3_SHIFT)) & GPIO_DIRCLR_DIRCLRP3_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP4_MASK                (0x10U)\r\n#define GPIO_DIRCLR_DIRCLRP4_SHIFT               (4U)\r\n/*! DIRCLRP4 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP4(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP4_SHIFT)) & GPIO_DIRCLR_DIRCLRP4_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP5_MASK                (0x20U)\r\n#define GPIO_DIRCLR_DIRCLRP5_SHIFT               (5U)\r\n/*! DIRCLRP5 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP5(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP5_SHIFT)) & GPIO_DIRCLR_DIRCLRP5_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP6_MASK                (0x40U)\r\n#define GPIO_DIRCLR_DIRCLRP6_SHIFT               (6U)\r\n/*! DIRCLRP6 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP6(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP6_SHIFT)) & GPIO_DIRCLR_DIRCLRP6_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP7_MASK                (0x80U)\r\n#define GPIO_DIRCLR_DIRCLRP7_SHIFT               (7U)\r\n/*! DIRCLRP7 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP7(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP7_SHIFT)) & GPIO_DIRCLR_DIRCLRP7_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP8_MASK                (0x100U)\r\n#define GPIO_DIRCLR_DIRCLRP8_SHIFT               (8U)\r\n/*! DIRCLRP8 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP8(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP8_SHIFT)) & GPIO_DIRCLR_DIRCLRP8_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP9_MASK                (0x200U)\r\n#define GPIO_DIRCLR_DIRCLRP9_SHIFT               (9U)\r\n/*! DIRCLRP9 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP9(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP9_SHIFT)) & GPIO_DIRCLR_DIRCLRP9_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP10_MASK               (0x400U)\r\n#define GPIO_DIRCLR_DIRCLRP10_SHIFT              (10U)\r\n/*! DIRCLRP10 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP10(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP10_SHIFT)) & GPIO_DIRCLR_DIRCLRP10_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP11_MASK               (0x800U)\r\n#define GPIO_DIRCLR_DIRCLRP11_SHIFT              (11U)\r\n/*! DIRCLRP11 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP11(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP11_SHIFT)) & GPIO_DIRCLR_DIRCLRP11_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP12_MASK               (0x1000U)\r\n#define GPIO_DIRCLR_DIRCLRP12_SHIFT              (12U)\r\n/*! DIRCLRP12 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP12(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP12_SHIFT)) & GPIO_DIRCLR_DIRCLRP12_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP13_MASK               (0x2000U)\r\n#define GPIO_DIRCLR_DIRCLRP13_SHIFT              (13U)\r\n/*! DIRCLRP13 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP13(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP13_SHIFT)) & GPIO_DIRCLR_DIRCLRP13_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP14_MASK               (0x4000U)\r\n#define GPIO_DIRCLR_DIRCLRP14_SHIFT              (14U)\r\n/*! DIRCLRP14 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP14(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP14_SHIFT)) & GPIO_DIRCLR_DIRCLRP14_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP15_MASK               (0x8000U)\r\n#define GPIO_DIRCLR_DIRCLRP15_SHIFT              (15U)\r\n/*! DIRCLRP15 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP15(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP15_SHIFT)) & GPIO_DIRCLR_DIRCLRP15_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP16_MASK               (0x10000U)\r\n#define GPIO_DIRCLR_DIRCLRP16_SHIFT              (16U)\r\n/*! DIRCLRP16 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP16(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP16_SHIFT)) & GPIO_DIRCLR_DIRCLRP16_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP17_MASK               (0x20000U)\r\n#define GPIO_DIRCLR_DIRCLRP17_SHIFT              (17U)\r\n/*! DIRCLRP17 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP17(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP17_SHIFT)) & GPIO_DIRCLR_DIRCLRP17_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP18_MASK               (0x40000U)\r\n#define GPIO_DIRCLR_DIRCLRP18_SHIFT              (18U)\r\n/*! DIRCLRP18 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP18(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP18_SHIFT)) & GPIO_DIRCLR_DIRCLRP18_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP19_MASK               (0x80000U)\r\n#define GPIO_DIRCLR_DIRCLRP19_SHIFT              (19U)\r\n/*! DIRCLRP19 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP19(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP19_SHIFT)) & GPIO_DIRCLR_DIRCLRP19_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP20_MASK               (0x100000U)\r\n#define GPIO_DIRCLR_DIRCLRP20_SHIFT              (20U)\r\n/*! DIRCLRP20 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP20(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP20_SHIFT)) & GPIO_DIRCLR_DIRCLRP20_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP21_MASK               (0x200000U)\r\n#define GPIO_DIRCLR_DIRCLRP21_SHIFT              (21U)\r\n/*! DIRCLRP21 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP21(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP21_SHIFT)) & GPIO_DIRCLR_DIRCLRP21_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP22_MASK               (0x400000U)\r\n#define GPIO_DIRCLR_DIRCLRP22_SHIFT              (22U)\r\n/*! DIRCLRP22 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP22(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP22_SHIFT)) & GPIO_DIRCLR_DIRCLRP22_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP23_MASK               (0x800000U)\r\n#define GPIO_DIRCLR_DIRCLRP23_SHIFT              (23U)\r\n/*! DIRCLRP23 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP23(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP23_SHIFT)) & GPIO_DIRCLR_DIRCLRP23_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP24_MASK               (0x1000000U)\r\n#define GPIO_DIRCLR_DIRCLRP24_SHIFT              (24U)\r\n/*! DIRCLRP24 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP24(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP24_SHIFT)) & GPIO_DIRCLR_DIRCLRP24_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP25_MASK               (0x2000000U)\r\n#define GPIO_DIRCLR_DIRCLRP25_SHIFT              (25U)\r\n/*! DIRCLRP25 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP25(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP25_SHIFT)) & GPIO_DIRCLR_DIRCLRP25_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP26_MASK               (0x4000000U)\r\n#define GPIO_DIRCLR_DIRCLRP26_SHIFT              (26U)\r\n/*! DIRCLRP26 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP26(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP26_SHIFT)) & GPIO_DIRCLR_DIRCLRP26_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP27_MASK               (0x8000000U)\r\n#define GPIO_DIRCLR_DIRCLRP27_SHIFT              (27U)\r\n/*! DIRCLRP27 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP27(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP27_SHIFT)) & GPIO_DIRCLR_DIRCLRP27_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP28_MASK               (0x10000000U)\r\n#define GPIO_DIRCLR_DIRCLRP28_SHIFT              (28U)\r\n/*! DIRCLRP28 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP28(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP28_SHIFT)) & GPIO_DIRCLR_DIRCLRP28_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP29_MASK               (0x20000000U)\r\n#define GPIO_DIRCLR_DIRCLRP29_SHIFT              (29U)\r\n/*! DIRCLRP29 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP29(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP29_SHIFT)) & GPIO_DIRCLR_DIRCLRP29_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP30_MASK               (0x40000000U)\r\n#define GPIO_DIRCLR_DIRCLRP30_SHIFT              (30U)\r\n/*! DIRCLRP30 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP30(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP30_SHIFT)) & GPIO_DIRCLR_DIRCLRP30_MASK)\r\n\r\n#define GPIO_DIRCLR_DIRCLRP31_MASK               (0x80000000U)\r\n#define GPIO_DIRCLR_DIRCLRP31_SHIFT              (31U)\r\n/*! DIRCLRP31 - Clear direction bits.\r\n *  0b0..No operation\r\n *  0b1..Clears direction bits\r\n */\r\n#define GPIO_DIRCLR_DIRCLRP31(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_DIRCLR_DIRCLRP31_SHIFT)) & GPIO_DIRCLR_DIRCLRP31_MASK)\r\n/*! @} */\r\n\r\n/* The count of GPIO_DIRCLR */\r\n#define GPIO_DIRCLR_COUNT                        (2U)\r\n\r\n/*! @name DIRNOT - Port direction toggle */\r\n/*! @{ */\r\n\r\n#define GPIO_DIRNOT_DIRNOTP_MASK                 (0x1FFFFFFFU)\r\n#define GPIO_DIRNOT_DIRNOTP_SHIFT                (0U)\r\n/*! DIRNOTP - Toggle direction bits.\r\n *  0b00000000000000000000000000000..No operation\r\n *  0b00000000000000000000000000001..Toggles direction bit\r\n */\r\n#define GPIO_DIRNOT_DIRNOTP(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_DIRNOT_DIRNOTP_SHIFT)) & GPIO_DIRNOT_DIRNOTP_MASK)\r\n/*! @} */\r\n\r\n/* The count of GPIO_DIRNOT */\r\n#define GPIO_DIRNOT_COUNT                        (2U)\r\n\r\n/*! @name INTENA - Interrupt A enable control */\r\n/*! @{ */\r\n\r\n#define GPIO_INTENA_INT_EN0_MASK                 (0x1U)\r\n#define GPIO_INTENA_INT_EN0_SHIFT                (0U)\r\n/*! INT_EN0 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN0(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN0_SHIFT)) & GPIO_INTENA_INT_EN0_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN1_MASK                 (0x2U)\r\n#define GPIO_INTENA_INT_EN1_SHIFT                (1U)\r\n/*! INT_EN1 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN1(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN1_SHIFT)) & GPIO_INTENA_INT_EN1_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN2_MASK                 (0x4U)\r\n#define GPIO_INTENA_INT_EN2_SHIFT                (2U)\r\n/*! INT_EN2 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN2(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN2_SHIFT)) & GPIO_INTENA_INT_EN2_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN3_MASK                 (0x8U)\r\n#define GPIO_INTENA_INT_EN3_SHIFT                (3U)\r\n/*! INT_EN3 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN3(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN3_SHIFT)) & GPIO_INTENA_INT_EN3_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN4_MASK                 (0x10U)\r\n#define GPIO_INTENA_INT_EN4_SHIFT                (4U)\r\n/*! INT_EN4 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN4(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN4_SHIFT)) & GPIO_INTENA_INT_EN4_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN5_MASK                 (0x20U)\r\n#define GPIO_INTENA_INT_EN5_SHIFT                (5U)\r\n/*! INT_EN5 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN5(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN5_SHIFT)) & GPIO_INTENA_INT_EN5_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN6_MASK                 (0x40U)\r\n#define GPIO_INTENA_INT_EN6_SHIFT                (6U)\r\n/*! INT_EN6 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN6(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN6_SHIFT)) & GPIO_INTENA_INT_EN6_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN7_MASK                 (0x80U)\r\n#define GPIO_INTENA_INT_EN7_SHIFT                (7U)\r\n/*! INT_EN7 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN7(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN7_SHIFT)) & GPIO_INTENA_INT_EN7_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN8_MASK                 (0x100U)\r\n#define GPIO_INTENA_INT_EN8_SHIFT                (8U)\r\n/*! INT_EN8 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN8(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN8_SHIFT)) & GPIO_INTENA_INT_EN8_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN9_MASK                 (0x200U)\r\n#define GPIO_INTENA_INT_EN9_SHIFT                (9U)\r\n/*! INT_EN9 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN9(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN9_SHIFT)) & GPIO_INTENA_INT_EN9_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN10_MASK                (0x400U)\r\n#define GPIO_INTENA_INT_EN10_SHIFT               (10U)\r\n/*! INT_EN10 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN10(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN10_SHIFT)) & GPIO_INTENA_INT_EN10_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN11_MASK                (0x800U)\r\n#define GPIO_INTENA_INT_EN11_SHIFT               (11U)\r\n/*! INT_EN11 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN11(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN11_SHIFT)) & GPIO_INTENA_INT_EN11_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN12_MASK                (0x1000U)\r\n#define GPIO_INTENA_INT_EN12_SHIFT               (12U)\r\n/*! INT_EN12 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN12(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN12_SHIFT)) & GPIO_INTENA_INT_EN12_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN13_MASK                (0x2000U)\r\n#define GPIO_INTENA_INT_EN13_SHIFT               (13U)\r\n/*! INT_EN13 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN13(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN13_SHIFT)) & GPIO_INTENA_INT_EN13_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN14_MASK                (0x4000U)\r\n#define GPIO_INTENA_INT_EN14_SHIFT               (14U)\r\n/*! INT_EN14 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN14(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN14_SHIFT)) & GPIO_INTENA_INT_EN14_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN15_MASK                (0x8000U)\r\n#define GPIO_INTENA_INT_EN15_SHIFT               (15U)\r\n/*! INT_EN15 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN15(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN15_SHIFT)) & GPIO_INTENA_INT_EN15_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN16_MASK                (0x10000U)\r\n#define GPIO_INTENA_INT_EN16_SHIFT               (16U)\r\n/*! INT_EN16 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN16(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN16_SHIFT)) & GPIO_INTENA_INT_EN16_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN17_MASK                (0x20000U)\r\n#define GPIO_INTENA_INT_EN17_SHIFT               (17U)\r\n/*! INT_EN17 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN17(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN17_SHIFT)) & GPIO_INTENA_INT_EN17_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN18_MASK                (0x40000U)\r\n#define GPIO_INTENA_INT_EN18_SHIFT               (18U)\r\n/*! INT_EN18 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN18(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN18_SHIFT)) & GPIO_INTENA_INT_EN18_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN19_MASK                (0x80000U)\r\n#define GPIO_INTENA_INT_EN19_SHIFT               (19U)\r\n/*! INT_EN19 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN19(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN19_SHIFT)) & GPIO_INTENA_INT_EN19_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN20_MASK                (0x100000U)\r\n#define GPIO_INTENA_INT_EN20_SHIFT               (20U)\r\n/*! INT_EN20 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN20(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN20_SHIFT)) & GPIO_INTENA_INT_EN20_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN21_MASK                (0x200000U)\r\n#define GPIO_INTENA_INT_EN21_SHIFT               (21U)\r\n/*! INT_EN21 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN21(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN21_SHIFT)) & GPIO_INTENA_INT_EN21_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN22_MASK                (0x400000U)\r\n#define GPIO_INTENA_INT_EN22_SHIFT               (22U)\r\n/*! INT_EN22 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN22(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN22_SHIFT)) & GPIO_INTENA_INT_EN22_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN23_MASK                (0x800000U)\r\n#define GPIO_INTENA_INT_EN23_SHIFT               (23U)\r\n/*! INT_EN23 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN23(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN23_SHIFT)) & GPIO_INTENA_INT_EN23_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN24_MASK                (0x1000000U)\r\n#define GPIO_INTENA_INT_EN24_SHIFT               (24U)\r\n/*! INT_EN24 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN24(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN24_SHIFT)) & GPIO_INTENA_INT_EN24_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN25_MASK                (0x2000000U)\r\n#define GPIO_INTENA_INT_EN25_SHIFT               (25U)\r\n/*! INT_EN25 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN25(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN25_SHIFT)) & GPIO_INTENA_INT_EN25_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN26_MASK                (0x4000000U)\r\n#define GPIO_INTENA_INT_EN26_SHIFT               (26U)\r\n/*! INT_EN26 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN26(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN26_SHIFT)) & GPIO_INTENA_INT_EN26_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN27_MASK                (0x8000000U)\r\n#define GPIO_INTENA_INT_EN27_SHIFT               (27U)\r\n/*! INT_EN27 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN27(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN27_SHIFT)) & GPIO_INTENA_INT_EN27_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN28_MASK                (0x10000000U)\r\n#define GPIO_INTENA_INT_EN28_SHIFT               (28U)\r\n/*! INT_EN28 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN28(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN28_SHIFT)) & GPIO_INTENA_INT_EN28_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN29_MASK                (0x20000000U)\r\n#define GPIO_INTENA_INT_EN29_SHIFT               (29U)\r\n/*! INT_EN29 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN29(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN29_SHIFT)) & GPIO_INTENA_INT_EN29_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN30_MASK                (0x40000000U)\r\n#define GPIO_INTENA_INT_EN30_SHIFT               (30U)\r\n/*! INT_EN30 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN30(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN30_SHIFT)) & GPIO_INTENA_INT_EN30_MASK)\r\n\r\n#define GPIO_INTENA_INT_EN31_MASK                (0x80000000U)\r\n#define GPIO_INTENA_INT_EN31_SHIFT               (31U)\r\n/*! INT_EN31 - Interrupt A enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt A\r\n *  0b1..Pin contributes to GPIO interrupt A\r\n */\r\n#define GPIO_INTENA_INT_EN31(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENA_INT_EN31_SHIFT)) & GPIO_INTENA_INT_EN31_MASK)\r\n/*! @} */\r\n\r\n/* The count of GPIO_INTENA */\r\n#define GPIO_INTENA_COUNT                        (2U)\r\n\r\n/*! @name INTENB - Interrupt B enable control */\r\n/*! @{ */\r\n\r\n#define GPIO_INTENB_INT_EN0_MASK                 (0x1U)\r\n#define GPIO_INTENB_INT_EN0_SHIFT                (0U)\r\n/*! INT_EN0 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN0(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN0_SHIFT)) & GPIO_INTENB_INT_EN0_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN1_MASK                 (0x2U)\r\n#define GPIO_INTENB_INT_EN1_SHIFT                (1U)\r\n/*! INT_EN1 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN1(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN1_SHIFT)) & GPIO_INTENB_INT_EN1_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN2_MASK                 (0x4U)\r\n#define GPIO_INTENB_INT_EN2_SHIFT                (2U)\r\n/*! INT_EN2 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN2(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN2_SHIFT)) & GPIO_INTENB_INT_EN2_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN3_MASK                 (0x8U)\r\n#define GPIO_INTENB_INT_EN3_SHIFT                (3U)\r\n/*! INT_EN3 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN3(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN3_SHIFT)) & GPIO_INTENB_INT_EN3_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN4_MASK                 (0x10U)\r\n#define GPIO_INTENB_INT_EN4_SHIFT                (4U)\r\n/*! INT_EN4 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN4(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN4_SHIFT)) & GPIO_INTENB_INT_EN4_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN5_MASK                 (0x20U)\r\n#define GPIO_INTENB_INT_EN5_SHIFT                (5U)\r\n/*! INT_EN5 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN5(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN5_SHIFT)) & GPIO_INTENB_INT_EN5_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN6_MASK                 (0x40U)\r\n#define GPIO_INTENB_INT_EN6_SHIFT                (6U)\r\n/*! INT_EN6 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN6(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN6_SHIFT)) & GPIO_INTENB_INT_EN6_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN7_MASK                 (0x80U)\r\n#define GPIO_INTENB_INT_EN7_SHIFT                (7U)\r\n/*! INT_EN7 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN7(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN7_SHIFT)) & GPIO_INTENB_INT_EN7_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN8_MASK                 (0x100U)\r\n#define GPIO_INTENB_INT_EN8_SHIFT                (8U)\r\n/*! INT_EN8 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN8(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN8_SHIFT)) & GPIO_INTENB_INT_EN8_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN9_MASK                 (0x200U)\r\n#define GPIO_INTENB_INT_EN9_SHIFT                (9U)\r\n/*! INT_EN9 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN9(x)                   (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN9_SHIFT)) & GPIO_INTENB_INT_EN9_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN10_MASK                (0x400U)\r\n#define GPIO_INTENB_INT_EN10_SHIFT               (10U)\r\n/*! INT_EN10 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN10(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN10_SHIFT)) & GPIO_INTENB_INT_EN10_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN11_MASK                (0x800U)\r\n#define GPIO_INTENB_INT_EN11_SHIFT               (11U)\r\n/*! INT_EN11 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN11(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN11_SHIFT)) & GPIO_INTENB_INT_EN11_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN12_MASK                (0x1000U)\r\n#define GPIO_INTENB_INT_EN12_SHIFT               (12U)\r\n/*! INT_EN12 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN12(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN12_SHIFT)) & GPIO_INTENB_INT_EN12_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN13_MASK                (0x2000U)\r\n#define GPIO_INTENB_INT_EN13_SHIFT               (13U)\r\n/*! INT_EN13 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN13(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN13_SHIFT)) & GPIO_INTENB_INT_EN13_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN14_MASK                (0x4000U)\r\n#define GPIO_INTENB_INT_EN14_SHIFT               (14U)\r\n/*! INT_EN14 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN14(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN14_SHIFT)) & GPIO_INTENB_INT_EN14_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN15_MASK                (0x8000U)\r\n#define GPIO_INTENB_INT_EN15_SHIFT               (15U)\r\n/*! INT_EN15 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN15(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN15_SHIFT)) & GPIO_INTENB_INT_EN15_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN16_MASK                (0x10000U)\r\n#define GPIO_INTENB_INT_EN16_SHIFT               (16U)\r\n/*! INT_EN16 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN16(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN16_SHIFT)) & GPIO_INTENB_INT_EN16_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN17_MASK                (0x20000U)\r\n#define GPIO_INTENB_INT_EN17_SHIFT               (17U)\r\n/*! INT_EN17 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN17(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN17_SHIFT)) & GPIO_INTENB_INT_EN17_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN18_MASK                (0x40000U)\r\n#define GPIO_INTENB_INT_EN18_SHIFT               (18U)\r\n/*! INT_EN18 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN18(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN18_SHIFT)) & GPIO_INTENB_INT_EN18_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN19_MASK                (0x80000U)\r\n#define GPIO_INTENB_INT_EN19_SHIFT               (19U)\r\n/*! INT_EN19 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN19(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN19_SHIFT)) & GPIO_INTENB_INT_EN19_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN20_MASK                (0x100000U)\r\n#define GPIO_INTENB_INT_EN20_SHIFT               (20U)\r\n/*! INT_EN20 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN20(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN20_SHIFT)) & GPIO_INTENB_INT_EN20_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN21_MASK                (0x200000U)\r\n#define GPIO_INTENB_INT_EN21_SHIFT               (21U)\r\n/*! INT_EN21 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN21(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN21_SHIFT)) & GPIO_INTENB_INT_EN21_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN22_MASK                (0x400000U)\r\n#define GPIO_INTENB_INT_EN22_SHIFT               (22U)\r\n/*! INT_EN22 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN22(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN22_SHIFT)) & GPIO_INTENB_INT_EN22_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN23_MASK                (0x800000U)\r\n#define GPIO_INTENB_INT_EN23_SHIFT               (23U)\r\n/*! INT_EN23 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN23(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN23_SHIFT)) & GPIO_INTENB_INT_EN23_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN24_MASK                (0x1000000U)\r\n#define GPIO_INTENB_INT_EN24_SHIFT               (24U)\r\n/*! INT_EN24 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN24(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN24_SHIFT)) & GPIO_INTENB_INT_EN24_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN25_MASK                (0x2000000U)\r\n#define GPIO_INTENB_INT_EN25_SHIFT               (25U)\r\n/*! INT_EN25 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN25(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN25_SHIFT)) & GPIO_INTENB_INT_EN25_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN26_MASK                (0x4000000U)\r\n#define GPIO_INTENB_INT_EN26_SHIFT               (26U)\r\n/*! INT_EN26 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN26(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN26_SHIFT)) & GPIO_INTENB_INT_EN26_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN27_MASK                (0x8000000U)\r\n#define GPIO_INTENB_INT_EN27_SHIFT               (27U)\r\n/*! INT_EN27 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN27(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN27_SHIFT)) & GPIO_INTENB_INT_EN27_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN28_MASK                (0x10000000U)\r\n#define GPIO_INTENB_INT_EN28_SHIFT               (28U)\r\n/*! INT_EN28 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN28(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN28_SHIFT)) & GPIO_INTENB_INT_EN28_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN29_MASK                (0x20000000U)\r\n#define GPIO_INTENB_INT_EN29_SHIFT               (29U)\r\n/*! INT_EN29 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN29(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN29_SHIFT)) & GPIO_INTENB_INT_EN29_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN30_MASK                (0x40000000U)\r\n#define GPIO_INTENB_INT_EN30_SHIFT               (30U)\r\n/*! INT_EN30 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN30(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN30_SHIFT)) & GPIO_INTENB_INT_EN30_MASK)\r\n\r\n#define GPIO_INTENB_INT_EN31_MASK                (0x80000000U)\r\n#define GPIO_INTENB_INT_EN31_SHIFT               (31U)\r\n/*! INT_EN31 - Interrupt B enable bits.\r\n *  0b0..Pin does not contribute to GPIO interrupt B\r\n *  0b1..Pin contributes to GPIO interrupt B\r\n */\r\n#define GPIO_INTENB_INT_EN31(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTENB_INT_EN31_SHIFT)) & GPIO_INTENB_INT_EN31_MASK)\r\n/*! @} */\r\n\r\n/* The count of GPIO_INTENB */\r\n#define GPIO_INTENB_COUNT                        (2U)\r\n\r\n/*! @name INTPOL - Interupt polarity control */\r\n/*! @{ */\r\n\r\n#define GPIO_INTPOL_POL_CTL0_MASK                (0x1U)\r\n#define GPIO_INTPOL_POL_CTL0_SHIFT               (0U)\r\n/*! POL_CTL0 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL0(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL0_SHIFT)) & GPIO_INTPOL_POL_CTL0_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL1_MASK                (0x2U)\r\n#define GPIO_INTPOL_POL_CTL1_SHIFT               (1U)\r\n/*! POL_CTL1 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL1(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL1_SHIFT)) & GPIO_INTPOL_POL_CTL1_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL2_MASK                (0x4U)\r\n#define GPIO_INTPOL_POL_CTL2_SHIFT               (2U)\r\n/*! POL_CTL2 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL2(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL2_SHIFT)) & GPIO_INTPOL_POL_CTL2_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL3_MASK                (0x8U)\r\n#define GPIO_INTPOL_POL_CTL3_SHIFT               (3U)\r\n/*! POL_CTL3 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL3(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL3_SHIFT)) & GPIO_INTPOL_POL_CTL3_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL4_MASK                (0x10U)\r\n#define GPIO_INTPOL_POL_CTL4_SHIFT               (4U)\r\n/*! POL_CTL4 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL4(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL4_SHIFT)) & GPIO_INTPOL_POL_CTL4_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL5_MASK                (0x20U)\r\n#define GPIO_INTPOL_POL_CTL5_SHIFT               (5U)\r\n/*! POL_CTL5 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL5(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL5_SHIFT)) & GPIO_INTPOL_POL_CTL5_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL6_MASK                (0x40U)\r\n#define GPIO_INTPOL_POL_CTL6_SHIFT               (6U)\r\n/*! POL_CTL6 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL6(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL6_SHIFT)) & GPIO_INTPOL_POL_CTL6_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL7_MASK                (0x80U)\r\n#define GPIO_INTPOL_POL_CTL7_SHIFT               (7U)\r\n/*! POL_CTL7 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL7(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL7_SHIFT)) & GPIO_INTPOL_POL_CTL7_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL8_MASK                (0x100U)\r\n#define GPIO_INTPOL_POL_CTL8_SHIFT               (8U)\r\n/*! POL_CTL8 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL8(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL8_SHIFT)) & GPIO_INTPOL_POL_CTL8_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL9_MASK                (0x200U)\r\n#define GPIO_INTPOL_POL_CTL9_SHIFT               (9U)\r\n/*! POL_CTL9 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL9(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL9_SHIFT)) & GPIO_INTPOL_POL_CTL9_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL10_MASK               (0x400U)\r\n#define GPIO_INTPOL_POL_CTL10_SHIFT              (10U)\r\n/*! POL_CTL10 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL10(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL10_SHIFT)) & GPIO_INTPOL_POL_CTL10_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL11_MASK               (0x800U)\r\n#define GPIO_INTPOL_POL_CTL11_SHIFT              (11U)\r\n/*! POL_CTL11 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL11(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL11_SHIFT)) & GPIO_INTPOL_POL_CTL11_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL12_MASK               (0x1000U)\r\n#define GPIO_INTPOL_POL_CTL12_SHIFT              (12U)\r\n/*! POL_CTL12 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL12(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL12_SHIFT)) & GPIO_INTPOL_POL_CTL12_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL13_MASK               (0x2000U)\r\n#define GPIO_INTPOL_POL_CTL13_SHIFT              (13U)\r\n/*! POL_CTL13 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL13(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL13_SHIFT)) & GPIO_INTPOL_POL_CTL13_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL14_MASK               (0x4000U)\r\n#define GPIO_INTPOL_POL_CTL14_SHIFT              (14U)\r\n/*! POL_CTL14 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL14(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL14_SHIFT)) & GPIO_INTPOL_POL_CTL14_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL15_MASK               (0x8000U)\r\n#define GPIO_INTPOL_POL_CTL15_SHIFT              (15U)\r\n/*! POL_CTL15 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL15(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL15_SHIFT)) & GPIO_INTPOL_POL_CTL15_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL16_MASK               (0x10000U)\r\n#define GPIO_INTPOL_POL_CTL16_SHIFT              (16U)\r\n/*! POL_CTL16 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL16(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL16_SHIFT)) & GPIO_INTPOL_POL_CTL16_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL17_MASK               (0x20000U)\r\n#define GPIO_INTPOL_POL_CTL17_SHIFT              (17U)\r\n/*! POL_CTL17 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL17(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL17_SHIFT)) & GPIO_INTPOL_POL_CTL17_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL18_MASK               (0x40000U)\r\n#define GPIO_INTPOL_POL_CTL18_SHIFT              (18U)\r\n/*! POL_CTL18 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL18(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL18_SHIFT)) & GPIO_INTPOL_POL_CTL18_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL19_MASK               (0x80000U)\r\n#define GPIO_INTPOL_POL_CTL19_SHIFT              (19U)\r\n/*! POL_CTL19 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL19(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL19_SHIFT)) & GPIO_INTPOL_POL_CTL19_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL20_MASK               (0x100000U)\r\n#define GPIO_INTPOL_POL_CTL20_SHIFT              (20U)\r\n/*! POL_CTL20 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL20(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL20_SHIFT)) & GPIO_INTPOL_POL_CTL20_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL21_MASK               (0x200000U)\r\n#define GPIO_INTPOL_POL_CTL21_SHIFT              (21U)\r\n/*! POL_CTL21 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL21(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL21_SHIFT)) & GPIO_INTPOL_POL_CTL21_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL22_MASK               (0x400000U)\r\n#define GPIO_INTPOL_POL_CTL22_SHIFT              (22U)\r\n/*! POL_CTL22 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL22(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL22_SHIFT)) & GPIO_INTPOL_POL_CTL22_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL23_MASK               (0x800000U)\r\n#define GPIO_INTPOL_POL_CTL23_SHIFT              (23U)\r\n/*! POL_CTL23 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL23(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL23_SHIFT)) & GPIO_INTPOL_POL_CTL23_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL24_MASK               (0x1000000U)\r\n#define GPIO_INTPOL_POL_CTL24_SHIFT              (24U)\r\n/*! POL_CTL24 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL24(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL24_SHIFT)) & GPIO_INTPOL_POL_CTL24_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL25_MASK               (0x2000000U)\r\n#define GPIO_INTPOL_POL_CTL25_SHIFT              (25U)\r\n/*! POL_CTL25 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL25(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL25_SHIFT)) & GPIO_INTPOL_POL_CTL25_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL26_MASK               (0x4000000U)\r\n#define GPIO_INTPOL_POL_CTL26_SHIFT              (26U)\r\n/*! POL_CTL26 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL26(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL26_SHIFT)) & GPIO_INTPOL_POL_CTL26_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL27_MASK               (0x8000000U)\r\n#define GPIO_INTPOL_POL_CTL27_SHIFT              (27U)\r\n/*! POL_CTL27 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL27(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL27_SHIFT)) & GPIO_INTPOL_POL_CTL27_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL28_MASK               (0x10000000U)\r\n#define GPIO_INTPOL_POL_CTL28_SHIFT              (28U)\r\n/*! POL_CTL28 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL28(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL28_SHIFT)) & GPIO_INTPOL_POL_CTL28_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL29_MASK               (0x20000000U)\r\n#define GPIO_INTPOL_POL_CTL29_SHIFT              (29U)\r\n/*! POL_CTL29 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL29(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL29_SHIFT)) & GPIO_INTPOL_POL_CTL29_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL30_MASK               (0x40000000U)\r\n#define GPIO_INTPOL_POL_CTL30_SHIFT              (30U)\r\n/*! POL_CTL30 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL30(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL30_SHIFT)) & GPIO_INTPOL_POL_CTL30_MASK)\r\n\r\n#define GPIO_INTPOL_POL_CTL31_MASK               (0x80000000U)\r\n#define GPIO_INTPOL_POL_CTL31_SHIFT              (31U)\r\n/*! POL_CTL31 - Polarity control for each pin\r\n *  0b0..High level or rising edge triggered\r\n *  0b1..Low level or falling edge triggered\r\n */\r\n#define GPIO_INTPOL_POL_CTL31(x)                 (((uint32_t)(((uint32_t)(x)) << GPIO_INTPOL_POL_CTL31_SHIFT)) & GPIO_INTPOL_POL_CTL31_MASK)\r\n/*! @} */\r\n\r\n/* The count of GPIO_INTPOL */\r\n#define GPIO_INTPOL_COUNT                        (2U)\r\n\r\n/*! @name INTEDG - Interrupt edge select */\r\n/*! @{ */\r\n\r\n#define GPIO_INTEDG_EDGE0_MASK                   (0x1U)\r\n#define GPIO_INTEDG_EDGE0_SHIFT                  (0U)\r\n/*! EDGE0 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE0(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE0_SHIFT)) & GPIO_INTEDG_EDGE0_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE1_MASK                   (0x2U)\r\n#define GPIO_INTEDG_EDGE1_SHIFT                  (1U)\r\n/*! EDGE1 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE1(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE1_SHIFT)) & GPIO_INTEDG_EDGE1_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE2_MASK                   (0x4U)\r\n#define GPIO_INTEDG_EDGE2_SHIFT                  (2U)\r\n/*! EDGE2 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE2(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE2_SHIFT)) & GPIO_INTEDG_EDGE2_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE3_MASK                   (0x8U)\r\n#define GPIO_INTEDG_EDGE3_SHIFT                  (3U)\r\n/*! EDGE3 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE3(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE3_SHIFT)) & GPIO_INTEDG_EDGE3_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE4_MASK                   (0x10U)\r\n#define GPIO_INTEDG_EDGE4_SHIFT                  (4U)\r\n/*! EDGE4 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE4(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE4_SHIFT)) & GPIO_INTEDG_EDGE4_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE5_MASK                   (0x20U)\r\n#define GPIO_INTEDG_EDGE5_SHIFT                  (5U)\r\n/*! EDGE5 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE5(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE5_SHIFT)) & GPIO_INTEDG_EDGE5_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE6_MASK                   (0x40U)\r\n#define GPIO_INTEDG_EDGE6_SHIFT                  (6U)\r\n/*! EDGE6 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE6(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE6_SHIFT)) & GPIO_INTEDG_EDGE6_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE7_MASK                   (0x80U)\r\n#define GPIO_INTEDG_EDGE7_SHIFT                  (7U)\r\n/*! EDGE7 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE7(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE7_SHIFT)) & GPIO_INTEDG_EDGE7_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE8_MASK                   (0x100U)\r\n#define GPIO_INTEDG_EDGE8_SHIFT                  (8U)\r\n/*! EDGE8 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE8(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE8_SHIFT)) & GPIO_INTEDG_EDGE8_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE9_MASK                   (0x200U)\r\n#define GPIO_INTEDG_EDGE9_SHIFT                  (9U)\r\n/*! EDGE9 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE9(x)                     (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE9_SHIFT)) & GPIO_INTEDG_EDGE9_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE10_MASK                  (0x400U)\r\n#define GPIO_INTEDG_EDGE10_SHIFT                 (10U)\r\n/*! EDGE10 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE10(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE10_SHIFT)) & GPIO_INTEDG_EDGE10_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE11_MASK                  (0x800U)\r\n#define GPIO_INTEDG_EDGE11_SHIFT                 (11U)\r\n/*! EDGE11 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE11(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE11_SHIFT)) & GPIO_INTEDG_EDGE11_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE12_MASK                  (0x1000U)\r\n#define GPIO_INTEDG_EDGE12_SHIFT                 (12U)\r\n/*! EDGE12 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE12(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE12_SHIFT)) & GPIO_INTEDG_EDGE12_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE13_MASK                  (0x2000U)\r\n#define GPIO_INTEDG_EDGE13_SHIFT                 (13U)\r\n/*! EDGE13 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE13(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE13_SHIFT)) & GPIO_INTEDG_EDGE13_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE14_MASK                  (0x4000U)\r\n#define GPIO_INTEDG_EDGE14_SHIFT                 (14U)\r\n/*! EDGE14 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE14(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE14_SHIFT)) & GPIO_INTEDG_EDGE14_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE15_MASK                  (0x8000U)\r\n#define GPIO_INTEDG_EDGE15_SHIFT                 (15U)\r\n/*! EDGE15 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE15(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE15_SHIFT)) & GPIO_INTEDG_EDGE15_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE16_MASK                  (0x10000U)\r\n#define GPIO_INTEDG_EDGE16_SHIFT                 (16U)\r\n/*! EDGE16 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE16(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE16_SHIFT)) & GPIO_INTEDG_EDGE16_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE17_MASK                  (0x20000U)\r\n#define GPIO_INTEDG_EDGE17_SHIFT                 (17U)\r\n/*! EDGE17 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE17(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE17_SHIFT)) & GPIO_INTEDG_EDGE17_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE18_MASK                  (0x40000U)\r\n#define GPIO_INTEDG_EDGE18_SHIFT                 (18U)\r\n/*! EDGE18 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE18(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE18_SHIFT)) & GPIO_INTEDG_EDGE18_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE19_MASK                  (0x80000U)\r\n#define GPIO_INTEDG_EDGE19_SHIFT                 (19U)\r\n/*! EDGE19 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE19(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE19_SHIFT)) & GPIO_INTEDG_EDGE19_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE20_MASK                  (0x100000U)\r\n#define GPIO_INTEDG_EDGE20_SHIFT                 (20U)\r\n/*! EDGE20 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE20(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE20_SHIFT)) & GPIO_INTEDG_EDGE20_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE21_MASK                  (0x200000U)\r\n#define GPIO_INTEDG_EDGE21_SHIFT                 (21U)\r\n/*! EDGE21 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE21(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE21_SHIFT)) & GPIO_INTEDG_EDGE21_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE22_MASK                  (0x400000U)\r\n#define GPIO_INTEDG_EDGE22_SHIFT                 (22U)\r\n/*! EDGE22 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE22(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE22_SHIFT)) & GPIO_INTEDG_EDGE22_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE23_MASK                  (0x800000U)\r\n#define GPIO_INTEDG_EDGE23_SHIFT                 (23U)\r\n/*! EDGE23 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE23(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE23_SHIFT)) & GPIO_INTEDG_EDGE23_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE24_MASK                  (0x1000000U)\r\n#define GPIO_INTEDG_EDGE24_SHIFT                 (24U)\r\n/*! EDGE24 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE24(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE24_SHIFT)) & GPIO_INTEDG_EDGE24_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE25_MASK                  (0x2000000U)\r\n#define GPIO_INTEDG_EDGE25_SHIFT                 (25U)\r\n/*! EDGE25 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE25(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE25_SHIFT)) & GPIO_INTEDG_EDGE25_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE26_MASK                  (0x4000000U)\r\n#define GPIO_INTEDG_EDGE26_SHIFT                 (26U)\r\n/*! EDGE26 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE26(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE26_SHIFT)) & GPIO_INTEDG_EDGE26_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE27_MASK                  (0x8000000U)\r\n#define GPIO_INTEDG_EDGE27_SHIFT                 (27U)\r\n/*! EDGE27 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE27(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE27_SHIFT)) & GPIO_INTEDG_EDGE27_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE28_MASK                  (0x10000000U)\r\n#define GPIO_INTEDG_EDGE28_SHIFT                 (28U)\r\n/*! EDGE28 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE28(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE28_SHIFT)) & GPIO_INTEDG_EDGE28_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE29_MASK                  (0x20000000U)\r\n#define GPIO_INTEDG_EDGE29_SHIFT                 (29U)\r\n/*! EDGE29 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE29(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE29_SHIFT)) & GPIO_INTEDG_EDGE29_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE30_MASK                  (0x40000000U)\r\n#define GPIO_INTEDG_EDGE30_SHIFT                 (30U)\r\n/*! EDGE30 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE30(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE30_SHIFT)) & GPIO_INTEDG_EDGE30_MASK)\r\n\r\n#define GPIO_INTEDG_EDGE31_MASK                  (0x80000000U)\r\n#define GPIO_INTEDG_EDGE31_SHIFT                 (31U)\r\n/*! EDGE31 - Edge or level mode select bits.\r\n *  0b0..Level mode\r\n *  0b1..Edge mode\r\n */\r\n#define GPIO_INTEDG_EDGE31(x)                    (((uint32_t)(((uint32_t)(x)) << GPIO_INTEDG_EDGE31_SHIFT)) & GPIO_INTEDG_EDGE31_MASK)\r\n/*! @} */\r\n\r\n/* The count of GPIO_INTEDG */\r\n#define GPIO_INTEDG_COUNT                        (2U)\r\n\r\n/*! @name INTSTATA - Interrupt status for interrupt A */\r\n/*! @{ */\r\n\r\n#define GPIO_INTSTATA_STATUS_MASK                (0xFFFFFFFFU)\r\n#define GPIO_INTSTATA_STATUS_SHIFT               (0U)\r\n/*! STATUS - Interrupt status. */\r\n#define GPIO_INTSTATA_STATUS(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTSTATA_STATUS_SHIFT)) & GPIO_INTSTATA_STATUS_MASK)\r\n/*! @} */\r\n\r\n/* The count of GPIO_INTSTATA */\r\n#define GPIO_INTSTATA_COUNT                      (2U)\r\n\r\n/*! @name INTSTATB - Interrupt status for interrupt B */\r\n/*! @{ */\r\n\r\n#define GPIO_INTSTATB_STATUS_MASK                (0xFFFFFFFFU)\r\n#define GPIO_INTSTATB_STATUS_SHIFT               (0U)\r\n/*! STATUS - Interrupt status */\r\n#define GPIO_INTSTATB_STATUS(x)                  (((uint32_t)(((uint32_t)(x)) << GPIO_INTSTATB_STATUS_SHIFT)) & GPIO_INTSTATB_STATUS_MASK)\r\n/*! @} */\r\n\r\n/* The count of GPIO_INTSTATB */\r\n#define GPIO_INTSTATB_COUNT                      (2U)\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group GPIO_Register_Masks */\r\n\r\n\r\n/* GPIO - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral GPIO base address */\r\n  #define GPIO_BASE                                (0x50100000u)\r\n  /** Peripheral GPIO base address */\r\n  #define GPIO_BASE_NS                             (0x40100000u)\r\n  /** Peripheral GPIO base pointer */\r\n  #define GPIO                                     ((GPIO_Type *)GPIO_BASE)\r\n  /** Peripheral GPIO base pointer */\r\n  #define GPIO_NS                                  ((GPIO_Type *)GPIO_BASE_NS)\r\n  /** Peripheral SECGPIO base address */\r\n  #define SECGPIO_BASE                             (0x50154000u)\r\n  /** Peripheral SECGPIO base address */\r\n  #define SECGPIO_BASE_NS                          (0x40154000u)\r\n  /** Peripheral SECGPIO base pointer */\r\n  #define SECGPIO                                  ((GPIO_Type *)SECGPIO_BASE)\r\n  /** Peripheral SECGPIO base pointer */\r\n  #define SECGPIO_NS                               ((GPIO_Type *)SECGPIO_BASE_NS)\r\n  /** Array initializer of GPIO peripheral base addresses */\r\n  #define GPIO_BASE_ADDRS                          { GPIO_BASE, SECGPIO_BASE }\r\n  /** Array initializer of GPIO peripheral base pointers */\r\n  #define GPIO_BASE_PTRS                           { GPIO, SECGPIO }\r\n  /** Array initializer of GPIO peripheral base addresses */\r\n  #define GPIO_BASE_ADDRS_NS                       { GPIO_BASE_NS, SECGPIO_BASE_NS }\r\n  /** Array initializer of GPIO peripheral base pointers */\r\n  #define GPIO_BASE_PTRS_NS                        { GPIO_NS, SECGPIO_NS }\r\n#else\r\n  /** Peripheral GPIO base address */\r\n  #define GPIO_BASE                                (0x40100000u)\r\n  /** Peripheral GPIO base pointer */\r\n  #define GPIO                                     ((GPIO_Type *)GPIO_BASE)\r\n  /** Peripheral SECGPIO base address */\r\n  #define SECGPIO_BASE                             (0x40154000u)\r\n  /** Peripheral SECGPIO base pointer */\r\n  #define SECGPIO                                  ((GPIO_Type *)SECGPIO_BASE)\r\n  /** Array initializer of GPIO peripheral base addresses */\r\n  #define GPIO_BASE_ADDRS                          { GPIO_BASE, SECGPIO_BASE }\r\n  /** Array initializer of GPIO peripheral base pointers */\r\n  #define GPIO_BASE_PTRS                           { GPIO, SECGPIO }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group GPIO_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- I2C Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup I2C_Peripheral_Access_Layer I2C Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** I2C - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[2048];\r\n  __IO uint32_t CFG;                               /**< Configuration Register, offset: 0x800 */\r\n  __IO uint32_t STAT;                              /**< Status Register, offset: 0x804 */\r\n  __IO uint32_t INTENSET;                          /**< Interrupt Enable Set Register, offset: 0x808 */\r\n  __O  uint32_t INTENCLR;                          /**< Interrupt Enable Clear Register, offset: 0x80C */\r\n  __IO uint32_t TIMEOUT;                           /**< Time-out Register, offset: 0x810 */\r\n  __IO uint32_t CLKDIV;                            /**< Clock Divider Register, offset: 0x814 */\r\n  __I  uint32_t INTSTAT;                           /**< Interrupt Status Register, offset: 0x818 */\r\n       uint8_t RESERVED_1[4];\r\n  __IO uint32_t MSTCTL;                            /**< Master Control Register, offset: 0x820 */\r\n  __IO uint32_t MSTTIME;                           /**< Master Timing Register, offset: 0x824 */\r\n  __IO uint32_t MSTDAT;                            /**< Master Data Register, offset: 0x828 */\r\n       uint8_t RESERVED_2[20];\r\n  __IO uint32_t SLVCTL;                            /**< Slave Control Register, offset: 0x840 */\r\n  __IO uint32_t SLVDAT;                            /**< Slave Data Register, offset: 0x844 */\r\n  __IO uint32_t SLVADR[4];                         /**< Slave Address Register, array offset: 0x848, array step: 0x4 */\r\n  __IO uint32_t SLVQUAL0;                          /**< Slave Qualification for Address 0 Register, offset: 0x858 */\r\n       uint8_t RESERVED_3[36];\r\n  __I  uint32_t MONRXDAT;                          /**< Monitor Receiver Data Register, offset: 0x880 */\r\n       uint8_t RESERVED_4[1912];\r\n  __I  uint32_t ID;                                /**< Peripheral Identification Register, offset: 0xFFC */\r\n} I2C_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- I2C Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup I2C_Register_Masks I2C Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name CFG - Configuration Register */\r\n/*! @{ */\r\n\r\n#define I2C_CFG_MSTEN_MASK                       (0x1U)\r\n#define I2C_CFG_MSTEN_SHIFT                      (0U)\r\n/*! MSTEN - Master Enable\r\n *  0b0..Disabled. The I2C Master function is disabled. When disabled, the Master configuration settings are not\r\n *       changed, but the Master function is internally reset.\r\n *  0b1..Enabled. The I2C Master function is enabled.\r\n */\r\n#define I2C_CFG_MSTEN(x)                         (((uint32_t)(((uint32_t)(x)) << I2C_CFG_MSTEN_SHIFT)) & I2C_CFG_MSTEN_MASK)\r\n\r\n#define I2C_CFG_SLVEN_MASK                       (0x2U)\r\n#define I2C_CFG_SLVEN_SHIFT                      (1U)\r\n/*! SLVEN - Slave Enable\r\n *  0b0..Disabled. The I2C slave function is disabled. When disabled, the Slave configuration settings are not\r\n *       changed, but the Slave function is internally reset.\r\n *  0b1..Enabled. The I2C slave function is enabled.\r\n */\r\n#define I2C_CFG_SLVEN(x)                         (((uint32_t)(((uint32_t)(x)) << I2C_CFG_SLVEN_SHIFT)) & I2C_CFG_SLVEN_MASK)\r\n\r\n#define I2C_CFG_MONEN_MASK                       (0x4U)\r\n#define I2C_CFG_MONEN_SHIFT                      (2U)\r\n/*! MONEN - Monitor Enable\r\n *  0b0..Disabled. The I2C Monitor function is disabled. When disabled, the Monitor function configuration\r\n *       settings are not changed, but the Monitor function is internally reset.\r\n *  0b1..Enabled. The I2C Monitor function is enabled.\r\n */\r\n#define I2C_CFG_MONEN(x)                         (((uint32_t)(((uint32_t)(x)) << I2C_CFG_MONEN_SHIFT)) & I2C_CFG_MONEN_MASK)\r\n\r\n#define I2C_CFG_TIMEOUTEN_MASK                   (0x8U)\r\n#define I2C_CFG_TIMEOUTEN_SHIFT                  (3U)\r\n/*! TIMEOUTEN - I2C bus Time-out Enable\r\n *  0b0..Disabled. The time-out function is disabled. When disabled, the time-out function is internally reset.\r\n *  0b1..Enabled. The time-out function is enabled. Both types of time-out flags will be generated and will cause\r\n *       interrupts if those flags are enabled. Typically, only one time-out flag will be used in a system.\r\n */\r\n#define I2C_CFG_TIMEOUTEN(x)                     (((uint32_t)(((uint32_t)(x)) << I2C_CFG_TIMEOUTEN_SHIFT)) & I2C_CFG_TIMEOUTEN_MASK)\r\n\r\n#define I2C_CFG_MONCLKSTR_MASK                   (0x10U)\r\n#define I2C_CFG_MONCLKSTR_SHIFT                  (4U)\r\n/*! MONCLKSTR - Monitor function Clock Stretching\r\n *  0b0..Disabled. The Monitor function will not perform clock stretching. Software or DMA may not always be able\r\n *       to read data provided by the Monitor function before it (the data) is overwritten. This mode can be used\r\n *       when non-invasive monitoring is critical.\r\n *  0b1..Enabled. The Monitor function will perform clock stretching, to ensure that the software or DMA can read\r\n *       all incoming data supplied by the Monitor function.\r\n */\r\n#define I2C_CFG_MONCLKSTR(x)                     (((uint32_t)(((uint32_t)(x)) << I2C_CFG_MONCLKSTR_SHIFT)) & I2C_CFG_MONCLKSTR_MASK)\r\n\r\n#define I2C_CFG_HSCAPABLE_MASK                   (0x20U)\r\n#define I2C_CFG_HSCAPABLE_SHIFT                  (5U)\r\n/*! HSCAPABLE - High Speed mode Capable enable\r\n *  0b0..Fast mode Plus enable\r\n *  0b1..High Speed mode enable\r\n */\r\n#define I2C_CFG_HSCAPABLE(x)                     (((uint32_t)(((uint32_t)(x)) << I2C_CFG_HSCAPABLE_SHIFT)) & I2C_CFG_HSCAPABLE_MASK)\r\n/*! @} */\r\n\r\n/*! @name STAT - Status Register */\r\n/*! @{ */\r\n\r\n#define I2C_STAT_MSTPENDING_MASK                 (0x1U)\r\n#define I2C_STAT_MSTPENDING_SHIFT                (0U)\r\n/*! MSTPENDING - Master Pending\r\n *  0b0..In progress. Communication is in progress and the Master function is busy and cannot currently accept a command.\r\n *  0b1..Pending. The Master function needs software service or is in the idle state. If the master is not in the\r\n *       idle state, then the master is waiting to receive or transmit data, or is waiting for the NACK bit.\r\n */\r\n#define I2C_STAT_MSTPENDING(x)                   (((uint32_t)(((uint32_t)(x)) << I2C_STAT_MSTPENDING_SHIFT)) & I2C_STAT_MSTPENDING_MASK)\r\n\r\n#define I2C_STAT_MSTSTATE_MASK                   (0xEU)\r\n#define I2C_STAT_MSTSTATE_SHIFT                  (1U)\r\n/*! MSTSTATE - Master State code\r\n *  0b000..Idle. The Master function is available to be used for a new transaction.\r\n *  0b001..Receive ready. Received data is available (in Master Receiver mode). Address plus Read was previously sent and Acknowledged by a slave.\r\n *  0b010..Transmit ready. Data can be transmitted (in Master Transmitter mode). Address plus Write was previously sent and Acknowledged by a slave.\r\n *  0b011..NACK Address. Slave NACKed address.\r\n *  0b100..NACK Data. Slave NACKed transmitted data.\r\n */\r\n#define I2C_STAT_MSTSTATE(x)                     (((uint32_t)(((uint32_t)(x)) << I2C_STAT_MSTSTATE_SHIFT)) & I2C_STAT_MSTSTATE_MASK)\r\n\r\n#define I2C_STAT_MSTARBLOSS_MASK                 (0x10U)\r\n#define I2C_STAT_MSTARBLOSS_SHIFT                (4U)\r\n/*! MSTARBLOSS - Master Arbitration Loss flag\r\n *  0b0..No Arbitration Loss has occurred\r\n *  0b1..Arbitration loss. The Master function has experienced an Arbitration Loss. At this point, the Master\r\n *       function has already stopped driving the bus and has gone into an idle state. Software can respond by doing\r\n *       nothing, or by sending a Start (to attempt to gain control of the bus when the bus next becomes idle).\r\n */\r\n#define I2C_STAT_MSTARBLOSS(x)                   (((uint32_t)(((uint32_t)(x)) << I2C_STAT_MSTARBLOSS_SHIFT)) & I2C_STAT_MSTARBLOSS_MASK)\r\n\r\n#define I2C_STAT_MSTSTSTPERR_MASK                (0x40U)\r\n#define I2C_STAT_MSTSTSTPERR_SHIFT               (6U)\r\n/*! MSTSTSTPERR - Master Start/Stop Error flag\r\n *  0b0..No Start/Stop Error has occurred.\r\n *  0b1..The Master function has experienced a Start/Stop Error. A Start or Stop was detected at a time when Start\r\n *       or Stop is not allowed by the I2C specification. The Master interface has stopped driving the bus and\r\n *       gone into an idle state; no action is required. A request for a Start could be made, or software could\r\n *       attempt to make sure that the bus has not stalled.\r\n */\r\n#define I2C_STAT_MSTSTSTPERR(x)                  (((uint32_t)(((uint32_t)(x)) << I2C_STAT_MSTSTSTPERR_SHIFT)) & I2C_STAT_MSTSTSTPERR_MASK)\r\n\r\n#define I2C_STAT_SLVPENDING_MASK                 (0x100U)\r\n#define I2C_STAT_SLVPENDING_SHIFT                (8U)\r\n/*! SLVPENDING - Slave Pending\r\n *  0b0..In progress. The Slave function does not currently need software service.\r\n *  0b1..Pending. The Slave function needs software service. Information about what is needed is in the Slave state field (SLVSTATE).\r\n */\r\n#define I2C_STAT_SLVPENDING(x)                   (((uint32_t)(((uint32_t)(x)) << I2C_STAT_SLVPENDING_SHIFT)) & I2C_STAT_SLVPENDING_MASK)\r\n\r\n#define I2C_STAT_SLVSTATE_MASK                   (0x600U)\r\n#define I2C_STAT_SLVSTATE_SHIFT                  (9U)\r\n/*! SLVSTATE - Slave State\r\n *  0b00..Slave address. Address plus R/W received. At least one of the 4 slave addresses has been matched by hardware.\r\n *  0b01..Slave receive. Received data is available (in Slave Receiver mode).\r\n *  0b10..Slave transmit. Data can be transmitted (in Slave Transmitter mode).\r\n *  0b11..Reserved\r\n */\r\n#define I2C_STAT_SLVSTATE(x)                     (((uint32_t)(((uint32_t)(x)) << I2C_STAT_SLVSTATE_SHIFT)) & I2C_STAT_SLVSTATE_MASK)\r\n\r\n#define I2C_STAT_SLVNOTSTR_MASK                  (0x800U)\r\n#define I2C_STAT_SLVNOTSTR_SHIFT                 (11U)\r\n/*! SLVNOTSTR - Slave Not Stretching\r\n *  0b0..Stretching. The slave function is currently stretching the I2C bus clock. Deep-Sleepmode cannot be entered at this time.\r\n *  0b1..Not stretching. The slave function is not currently stretching the I2C bus clock. Deep-sleep mode can be entered at this time.\r\n */\r\n#define I2C_STAT_SLVNOTSTR(x)                    (((uint32_t)(((uint32_t)(x)) << I2C_STAT_SLVNOTSTR_SHIFT)) & I2C_STAT_SLVNOTSTR_MASK)\r\n\r\n#define I2C_STAT_SLVIDX_MASK                     (0x3000U)\r\n#define I2C_STAT_SLVIDX_SHIFT                    (12U)\r\n/*! SLVIDX - Slave address match Index T\r\n *  0b00..Address 0. Slave address 0 was matched.\r\n *  0b01..Address 1. Slave address 1 was matched.\r\n *  0b10..Address 2. Slave address 2 was matched.\r\n *  0b11..Address 3. Slave address 3 was matched.\r\n */\r\n#define I2C_STAT_SLVIDX(x)                       (((uint32_t)(((uint32_t)(x)) << I2C_STAT_SLVIDX_SHIFT)) & I2C_STAT_SLVIDX_MASK)\r\n\r\n#define I2C_STAT_SLVSEL_MASK                     (0x4000U)\r\n#define I2C_STAT_SLVSEL_SHIFT                    (14U)\r\n/*! SLVSEL - Slave selected flag\r\n *  0b0..Not selected. The Slave function is not currently selected.\r\n *  0b1..Selected. The Slave function is currently selected.\r\n */\r\n#define I2C_STAT_SLVSEL(x)                       (((uint32_t)(((uint32_t)(x)) << I2C_STAT_SLVSEL_SHIFT)) & I2C_STAT_SLVSEL_MASK)\r\n\r\n#define I2C_STAT_SLVDESEL_MASK                   (0x8000U)\r\n#define I2C_STAT_SLVDESEL_SHIFT                  (15U)\r\n/*! SLVDESEL - Slave Deselected flag\r\n *  0b0..Not deselected. The Slave function has not become deselected. This does not mean that the Slave is\r\n *       currently selected. That information is in the SLVSEL flag.\r\n *  0b1..Deselected. The Slave function has become deselected. This is specifically caused by the SLVSEL flag\r\n *       changing from 1 to 0. See SLVSEL for details about when that event occurs.\r\n */\r\n#define I2C_STAT_SLVDESEL(x)                     (((uint32_t)(((uint32_t)(x)) << I2C_STAT_SLVDESEL_SHIFT)) & I2C_STAT_SLVDESEL_MASK)\r\n\r\n#define I2C_STAT_MONRDY_MASK                     (0x10000U)\r\n#define I2C_STAT_MONRDY_SHIFT                    (16U)\r\n/*! MONRDY - Monitor Ready\r\n *  0b0..No data. The Monitor function does not currently have data available.\r\n *  0b1..Data waiting. The Monitor function has data waiting to be read.\r\n */\r\n#define I2C_STAT_MONRDY(x)                       (((uint32_t)(((uint32_t)(x)) << I2C_STAT_MONRDY_SHIFT)) & I2C_STAT_MONRDY_MASK)\r\n\r\n#define I2C_STAT_MONOV_MASK                      (0x20000U)\r\n#define I2C_STAT_MONOV_SHIFT                     (17U)\r\n/*! MONOV - Monitor Overflow flag\r\n *  0b0..No overrun. Monitor data has not overrun.\r\n *  0b1..Overrun. A Monitor data overrun has occurred. An overrun can only happen when Monitor clock stretching\r\n *       not enabled via the CFG[MONCLKSTR] bit. Writing 1 to MONOV bit clears the MONOV flag.\r\n */\r\n#define I2C_STAT_MONOV(x)                        (((uint32_t)(((uint32_t)(x)) << I2C_STAT_MONOV_SHIFT)) & I2C_STAT_MONOV_MASK)\r\n\r\n#define I2C_STAT_MONACTIVE_MASK                  (0x40000U)\r\n#define I2C_STAT_MONACTIVE_SHIFT                 (18U)\r\n/*! MONACTIVE - Monitor Active flag\r\n *  0b0..Inactive. The Monitor function considers the I2C bus to be inactive.\r\n *  0b1..Active. The Monitor function considers the I2C bus to be active.\r\n */\r\n#define I2C_STAT_MONACTIVE(x)                    (((uint32_t)(((uint32_t)(x)) << I2C_STAT_MONACTIVE_SHIFT)) & I2C_STAT_MONACTIVE_MASK)\r\n\r\n#define I2C_STAT_MONIDLE_MASK                    (0x80000U)\r\n#define I2C_STAT_MONIDLE_SHIFT                   (19U)\r\n/*! MONIDLE - Monitor Idle flag\r\n *  0b0..Not idle. The I2C bus is not idle, or MONIDLE flag has been cleared by software.\r\n *  0b1..Idle. The I2C bus has gone idle at least once, since the last time MONIDLE flag was cleared by software.\r\n */\r\n#define I2C_STAT_MONIDLE(x)                      (((uint32_t)(((uint32_t)(x)) << I2C_STAT_MONIDLE_SHIFT)) & I2C_STAT_MONIDLE_MASK)\r\n\r\n#define I2C_STAT_EVENTTIMEOUT_MASK               (0x1000000U)\r\n#define I2C_STAT_EVENTTIMEOUT_SHIFT              (24U)\r\n/*! EVENTTIMEOUT - Event Time-out Interrupt flag\r\n *  0b0..No time-out. I2C bus events have not caused a time-out.\r\n *  0b1..Event time-out. The time between I2C bus events has been longer than the time specified by the TIMEOUT register.\r\n */\r\n#define I2C_STAT_EVENTTIMEOUT(x)                 (((uint32_t)(((uint32_t)(x)) << I2C_STAT_EVENTTIMEOUT_SHIFT)) & I2C_STAT_EVENTTIMEOUT_MASK)\r\n\r\n#define I2C_STAT_SCLTIMEOUT_MASK                 (0x2000000U)\r\n#define I2C_STAT_SCLTIMEOUT_SHIFT                (25U)\r\n/*! SCLTIMEOUT - SCL Time-out Interrupt flag\r\n *  0b0..No time-out. SCL low time has not caused a time-out.\r\n *  0b1..Time-out. SCL low time has caused a time-out.\r\n */\r\n#define I2C_STAT_SCLTIMEOUT(x)                   (((uint32_t)(((uint32_t)(x)) << I2C_STAT_SCLTIMEOUT_SHIFT)) & I2C_STAT_SCLTIMEOUT_MASK)\r\n/*! @} */\r\n\r\n/*! @name INTENSET - Interrupt Enable Set Register */\r\n/*! @{ */\r\n\r\n#define I2C_INTENSET_MSTPENDINGEN_MASK           (0x1U)\r\n#define I2C_INTENSET_MSTPENDINGEN_SHIFT          (0U)\r\n/*! MSTPENDINGEN - Master Pending interrupt Enable\r\n *  0b0..Disabled. The MstPending interrupt is disabled.\r\n *  0b1..Enabled. The MstPending interrupt is enabled.\r\n */\r\n#define I2C_INTENSET_MSTPENDINGEN(x)             (((uint32_t)(((uint32_t)(x)) << I2C_INTENSET_MSTPENDINGEN_SHIFT)) & I2C_INTENSET_MSTPENDINGEN_MASK)\r\n\r\n#define I2C_INTENSET_MSTARBLOSSEN_MASK           (0x10U)\r\n#define I2C_INTENSET_MSTARBLOSSEN_SHIFT          (4U)\r\n/*! MSTARBLOSSEN - Master Arbitration Loss interrupt Enable\r\n *  0b0..Disabled. The MstArbLoss interrupt is disabled.\r\n *  0b1..Enabled. The MstArbLoss interrupt is enabled.\r\n */\r\n#define I2C_INTENSET_MSTARBLOSSEN(x)             (((uint32_t)(((uint32_t)(x)) << I2C_INTENSET_MSTARBLOSSEN_SHIFT)) & I2C_INTENSET_MSTARBLOSSEN_MASK)\r\n\r\n#define I2C_INTENSET_MSTSTSTPERREN_MASK          (0x40U)\r\n#define I2C_INTENSET_MSTSTSTPERREN_SHIFT         (6U)\r\n/*! MSTSTSTPERREN - Master Start/Stop Error interrupt Enable\r\n *  0b0..Disabled. The MstStStpErr interrupt is disabled.\r\n *  0b1..Enabled. The MstStStpErr interrupt is enabled.\r\n */\r\n#define I2C_INTENSET_MSTSTSTPERREN(x)            (((uint32_t)(((uint32_t)(x)) << I2C_INTENSET_MSTSTSTPERREN_SHIFT)) & I2C_INTENSET_MSTSTSTPERREN_MASK)\r\n\r\n#define I2C_INTENSET_SLVPENDINGEN_MASK           (0x100U)\r\n#define I2C_INTENSET_SLVPENDINGEN_SHIFT          (8U)\r\n/*! SLVPENDINGEN - Slave Pending interrupt Enable\r\n *  0b0..Disabled. The SlvPending interrupt is disabled.\r\n *  0b1..Enabled. The SlvPending interrupt is enabled.\r\n */\r\n#define I2C_INTENSET_SLVPENDINGEN(x)             (((uint32_t)(((uint32_t)(x)) << I2C_INTENSET_SLVPENDINGEN_SHIFT)) & I2C_INTENSET_SLVPENDINGEN_MASK)\r\n\r\n#define I2C_INTENSET_SLVNOTSTREN_MASK            (0x800U)\r\n#define I2C_INTENSET_SLVNOTSTREN_SHIFT           (11U)\r\n/*! SLVNOTSTREN - Slave Not Stretching interrupt Enable\r\n *  0b0..Disabled. The SlvNotStr interrupt is disabled.\r\n *  0b1..Enabled. The SlvNotStr interrupt is enabled.\r\n */\r\n#define I2C_INTENSET_SLVNOTSTREN(x)              (((uint32_t)(((uint32_t)(x)) << I2C_INTENSET_SLVNOTSTREN_SHIFT)) & I2C_INTENSET_SLVNOTSTREN_MASK)\r\n\r\n#define I2C_INTENSET_SLVDESELEN_MASK             (0x8000U)\r\n#define I2C_INTENSET_SLVDESELEN_SHIFT            (15U)\r\n/*! SLVDESELEN - Slave Deselect interrupt Enable\r\n *  0b0..Disabled. The SlvDeSel interrupt is disabled.\r\n *  0b1..Enabled. The SlvDeSel interrupt is enabled.\r\n */\r\n#define I2C_INTENSET_SLVDESELEN(x)               (((uint32_t)(((uint32_t)(x)) << I2C_INTENSET_SLVDESELEN_SHIFT)) & I2C_INTENSET_SLVDESELEN_MASK)\r\n\r\n#define I2C_INTENSET_MONRDYEN_MASK               (0x10000U)\r\n#define I2C_INTENSET_MONRDYEN_SHIFT              (16U)\r\n/*! MONRDYEN - Monitor data Ready interrupt Enable\r\n *  0b0..Disabled. The MonRdy interrupt is disabled.\r\n *  0b1..Enabled. The MonRdy interrupt is enabled.\r\n */\r\n#define I2C_INTENSET_MONRDYEN(x)                 (((uint32_t)(((uint32_t)(x)) << I2C_INTENSET_MONRDYEN_SHIFT)) & I2C_INTENSET_MONRDYEN_MASK)\r\n\r\n#define I2C_INTENSET_MONOVEN_MASK                (0x20000U)\r\n#define I2C_INTENSET_MONOVEN_SHIFT               (17U)\r\n/*! MONOVEN - Monitor Overrun interrupt Enable\r\n *  0b0..Disabled. The MonOv interrupt is disabled.\r\n *  0b1..Enabled. The MonOv interrupt is enabled.\r\n */\r\n#define I2C_INTENSET_MONOVEN(x)                  (((uint32_t)(((uint32_t)(x)) << I2C_INTENSET_MONOVEN_SHIFT)) & I2C_INTENSET_MONOVEN_MASK)\r\n\r\n#define I2C_INTENSET_MONIDLEEN_MASK              (0x80000U)\r\n#define I2C_INTENSET_MONIDLEEN_SHIFT             (19U)\r\n/*! MONIDLEEN - Monitor Idle interrupt Enable\r\n *  0b0..Disabled. The MonIdle interrupt is disabled.\r\n *  0b1..Enabled. The MonIdle interrupt is enabled.\r\n */\r\n#define I2C_INTENSET_MONIDLEEN(x)                (((uint32_t)(((uint32_t)(x)) << I2C_INTENSET_MONIDLEEN_SHIFT)) & I2C_INTENSET_MONIDLEEN_MASK)\r\n\r\n#define I2C_INTENSET_EVENTTIMEOUTEN_MASK         (0x1000000U)\r\n#define I2C_INTENSET_EVENTTIMEOUTEN_SHIFT        (24U)\r\n/*! EVENTTIMEOUTEN - Event Time-out interrupt Enable\r\n *  0b0..Disabled. The Event time-out interrupt is disabled.\r\n *  0b1..Enabled. The Event time-out interrupt is enabled.\r\n */\r\n#define I2C_INTENSET_EVENTTIMEOUTEN(x)           (((uint32_t)(((uint32_t)(x)) << I2C_INTENSET_EVENTTIMEOUTEN_SHIFT)) & I2C_INTENSET_EVENTTIMEOUTEN_MASK)\r\n\r\n#define I2C_INTENSET_SCLTIMEOUTEN_MASK           (0x2000000U)\r\n#define I2C_INTENSET_SCLTIMEOUTEN_SHIFT          (25U)\r\n/*! SCLTIMEOUTEN - SCL Time-out interrupt Enable\r\n *  0b0..Disabled. The SCL time-out interrupt is disabled.\r\n *  0b1..Enabled. The SCL time-out interrupt is enabled.\r\n */\r\n#define I2C_INTENSET_SCLTIMEOUTEN(x)             (((uint32_t)(((uint32_t)(x)) << I2C_INTENSET_SCLTIMEOUTEN_SHIFT)) & I2C_INTENSET_SCLTIMEOUTEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name INTENCLR - Interrupt Enable Clear Register */\r\n/*! @{ */\r\n\r\n#define I2C_INTENCLR_MSTPENDINGCLR_MASK          (0x1U)\r\n#define I2C_INTENCLR_MSTPENDINGCLR_SHIFT         (0U)\r\n/*! MSTPENDINGCLR - Master Pending interrupt clear\r\n *  0b0..No effect on interrupt\r\n *  0b1..Clears the interrupt bit in INTENSET register\r\n */\r\n#define I2C_INTENCLR_MSTPENDINGCLR(x)            (((uint32_t)(((uint32_t)(x)) << I2C_INTENCLR_MSTPENDINGCLR_SHIFT)) & I2C_INTENCLR_MSTPENDINGCLR_MASK)\r\n\r\n#define I2C_INTENCLR_MSTARBLOSSCLR_MASK          (0x10U)\r\n#define I2C_INTENCLR_MSTARBLOSSCLR_SHIFT         (4U)\r\n/*! MSTARBLOSSCLR - Master Arbitration Loss interrupt clear\r\n *  0b0..No effect on interrupt\r\n *  0b1..Clears the interrupt bit in INTENSET register\r\n */\r\n#define I2C_INTENCLR_MSTARBLOSSCLR(x)            (((uint32_t)(((uint32_t)(x)) << I2C_INTENCLR_MSTARBLOSSCLR_SHIFT)) & I2C_INTENCLR_MSTARBLOSSCLR_MASK)\r\n\r\n#define I2C_INTENCLR_MSTSTSTPERRCLR_MASK         (0x40U)\r\n#define I2C_INTENCLR_MSTSTSTPERRCLR_SHIFT        (6U)\r\n/*! MSTSTSTPERRCLR - Master Start/Stop Error interrupt clear\r\n *  0b0..No effect on interrupt\r\n *  0b1..Clears the interrupt bit in INTENSET register\r\n */\r\n#define I2C_INTENCLR_MSTSTSTPERRCLR(x)           (((uint32_t)(((uint32_t)(x)) << I2C_INTENCLR_MSTSTSTPERRCLR_SHIFT)) & I2C_INTENCLR_MSTSTSTPERRCLR_MASK)\r\n\r\n#define I2C_INTENCLR_SLVPENDINGCLR_MASK          (0x100U)\r\n#define I2C_INTENCLR_SLVPENDINGCLR_SHIFT         (8U)\r\n/*! SLVPENDINGCLR - Slave Pending interrupt clear\r\n *  0b0..No effect on interrupt\r\n *  0b1..Clears the interrupt bit in INTENSET register\r\n */\r\n#define I2C_INTENCLR_SLVPENDINGCLR(x)            (((uint32_t)(((uint32_t)(x)) << I2C_INTENCLR_SLVPENDINGCLR_SHIFT)) & I2C_INTENCLR_SLVPENDINGCLR_MASK)\r\n\r\n#define I2C_INTENCLR_SLVNOTSTRCLR_MASK           (0x800U)\r\n#define I2C_INTENCLR_SLVNOTSTRCLR_SHIFT          (11U)\r\n/*! SLVNOTSTRCLR - Slave Not Stretching interrupt clear\r\n *  0b0..No effect on interrupt\r\n *  0b1..Clears the interrupt bit in INTENSET register\r\n */\r\n#define I2C_INTENCLR_SLVNOTSTRCLR(x)             (((uint32_t)(((uint32_t)(x)) << I2C_INTENCLR_SLVNOTSTRCLR_SHIFT)) & I2C_INTENCLR_SLVNOTSTRCLR_MASK)\r\n\r\n#define I2C_INTENCLR_SLVDESELCLR_MASK            (0x8000U)\r\n#define I2C_INTENCLR_SLVDESELCLR_SHIFT           (15U)\r\n/*! SLVDESELCLR - Slave Deselect interrupt clear\r\n *  0b0..No effect on interrupt\r\n *  0b1..Clears the interrupt bit in INTENSET register\r\n */\r\n#define I2C_INTENCLR_SLVDESELCLR(x)              (((uint32_t)(((uint32_t)(x)) << I2C_INTENCLR_SLVDESELCLR_SHIFT)) & I2C_INTENCLR_SLVDESELCLR_MASK)\r\n\r\n#define I2C_INTENCLR_MONRDYCLR_MASK              (0x10000U)\r\n#define I2C_INTENCLR_MONRDYCLR_SHIFT             (16U)\r\n/*! MONRDYCLR - Monitor data Ready interrupt clear\r\n *  0b0..No effect on interrupt\r\n *  0b1..Clears the interrupt bit in INTENSET register\r\n */\r\n#define I2C_INTENCLR_MONRDYCLR(x)                (((uint32_t)(((uint32_t)(x)) << I2C_INTENCLR_MONRDYCLR_SHIFT)) & I2C_INTENCLR_MONRDYCLR_MASK)\r\n\r\n#define I2C_INTENCLR_MONOVCLR_MASK               (0x20000U)\r\n#define I2C_INTENCLR_MONOVCLR_SHIFT              (17U)\r\n/*! MONOVCLR - Monitor Overrun interrupt clear\r\n *  0b0..No effect on interrupt\r\n *  0b1..Clears the interrupt bit in INTENSET register\r\n */\r\n#define I2C_INTENCLR_MONOVCLR(x)                 (((uint32_t)(((uint32_t)(x)) << I2C_INTENCLR_MONOVCLR_SHIFT)) & I2C_INTENCLR_MONOVCLR_MASK)\r\n\r\n#define I2C_INTENCLR_MONIDLECLR_MASK             (0x80000U)\r\n#define I2C_INTENCLR_MONIDLECLR_SHIFT            (19U)\r\n/*! MONIDLECLR - Monitor Idle interrupt clear\r\n *  0b0..No effect on interrupt\r\n *  0b1..Clears the interrupt bit in INTENSET register\r\n */\r\n#define I2C_INTENCLR_MONIDLECLR(x)               (((uint32_t)(((uint32_t)(x)) << I2C_INTENCLR_MONIDLECLR_SHIFT)) & I2C_INTENCLR_MONIDLECLR_MASK)\r\n\r\n#define I2C_INTENCLR_EVENTTIMEOUTCLR_MASK        (0x1000000U)\r\n#define I2C_INTENCLR_EVENTTIMEOUTCLR_SHIFT       (24U)\r\n/*! EVENTTIMEOUTCLR - Event time-out interrupt clear\r\n *  0b0..No effect on interrupt\r\n *  0b1..Clears the interrupt bit in INTENSET register\r\n */\r\n#define I2C_INTENCLR_EVENTTIMEOUTCLR(x)          (((uint32_t)(((uint32_t)(x)) << I2C_INTENCLR_EVENTTIMEOUTCLR_SHIFT)) & I2C_INTENCLR_EVENTTIMEOUTCLR_MASK)\r\n\r\n#define I2C_INTENCLR_SCLTIMEOUTCLR_MASK          (0x2000000U)\r\n#define I2C_INTENCLR_SCLTIMEOUTCLR_SHIFT         (25U)\r\n/*! SCLTIMEOUTCLR - SCL time-out interrupt clear\r\n *  0b0..No effect on interrupt\r\n *  0b1..Clears the interrupt bit in INTENSET register\r\n */\r\n#define I2C_INTENCLR_SCLTIMEOUTCLR(x)            (((uint32_t)(((uint32_t)(x)) << I2C_INTENCLR_SCLTIMEOUTCLR_SHIFT)) & I2C_INTENCLR_SCLTIMEOUTCLR_MASK)\r\n/*! @} */\r\n\r\n/*! @name TIMEOUT - Time-out Register */\r\n/*! @{ */\r\n\r\n#define I2C_TIMEOUT_TOMIN_MASK                   (0xFU)\r\n#define I2C_TIMEOUT_TOMIN_SHIFT                  (0U)\r\n/*! TOMIN - Time-out time value, the bottom 4 bits */\r\n#define I2C_TIMEOUT_TOMIN(x)                     (((uint32_t)(((uint32_t)(x)) << I2C_TIMEOUT_TOMIN_SHIFT)) & I2C_TIMEOUT_TOMIN_MASK)\r\n\r\n#define I2C_TIMEOUT_TO_MASK                      (0xFFF0U)\r\n#define I2C_TIMEOUT_TO_SHIFT                     (4U)\r\n/*! TO - Time-out time value\r\n *  0b000000000000..A time-out will occur after 16 counts of the I2C function clock.\r\n *  0b000000000001..A time-out will occur after 32 counts of the I2C function clock.\r\n *  0b111111111111..A time-out will occur after 65,536 counts of the I2C function clock.\r\n */\r\n#define I2C_TIMEOUT_TO(x)                        (((uint32_t)(((uint32_t)(x)) << I2C_TIMEOUT_TO_SHIFT)) & I2C_TIMEOUT_TO_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLKDIV - Clock Divider Register */\r\n/*! @{ */\r\n\r\n#define I2C_CLKDIV_DIVVAL_MASK                   (0xFFFFU)\r\n#define I2C_CLKDIV_DIVVAL_SHIFT                  (0U)\r\n/*! DIVVAL - Divider Value\r\n *  0b0000000000000000..FCLK is used directly by the I2C.\r\n *  0b0000000000000001..FCLK is divided by 2 before being used by the I2C.\r\n *  0b0000000000000010..FCLK is divided by 3 before being used by the I2C.\r\n *  0b1111111111111111..FCLK is divided by 65,536 before being used by the I2C.\r\n */\r\n#define I2C_CLKDIV_DIVVAL(x)                     (((uint32_t)(((uint32_t)(x)) << I2C_CLKDIV_DIVVAL_SHIFT)) & I2C_CLKDIV_DIVVAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name INTSTAT - Interrupt Status Register */\r\n/*! @{ */\r\n\r\n#define I2C_INTSTAT_MSTPENDING_MASK              (0x1U)\r\n#define I2C_INTSTAT_MSTPENDING_SHIFT             (0U)\r\n/*! MSTPENDING - Master Pending\r\n *  0b0..Not active\r\n *  0b1..Active\r\n */\r\n#define I2C_INTSTAT_MSTPENDING(x)                (((uint32_t)(((uint32_t)(x)) << I2C_INTSTAT_MSTPENDING_SHIFT)) & I2C_INTSTAT_MSTPENDING_MASK)\r\n\r\n#define I2C_INTSTAT_MSTARBLOSS_MASK              (0x10U)\r\n#define I2C_INTSTAT_MSTARBLOSS_SHIFT             (4U)\r\n/*! MSTARBLOSS - Master Arbitration Loss flag\r\n *  0b0..Not active\r\n *  0b1..Active\r\n */\r\n#define I2C_INTSTAT_MSTARBLOSS(x)                (((uint32_t)(((uint32_t)(x)) << I2C_INTSTAT_MSTARBLOSS_SHIFT)) & I2C_INTSTAT_MSTARBLOSS_MASK)\r\n\r\n#define I2C_INTSTAT_MSTSTSTPERR_MASK             (0x40U)\r\n#define I2C_INTSTAT_MSTSTSTPERR_SHIFT            (6U)\r\n/*! MSTSTSTPERR - Master Start/Stop Error flag\r\n *  0b0..Not active\r\n *  0b1..Active\r\n */\r\n#define I2C_INTSTAT_MSTSTSTPERR(x)               (((uint32_t)(((uint32_t)(x)) << I2C_INTSTAT_MSTSTSTPERR_SHIFT)) & I2C_INTSTAT_MSTSTSTPERR_MASK)\r\n\r\n#define I2C_INTSTAT_SLVPENDING_MASK              (0x100U)\r\n#define I2C_INTSTAT_SLVPENDING_SHIFT             (8U)\r\n/*! SLVPENDING - Slave Pending\r\n *  0b0..Not active\r\n *  0b1..Active\r\n */\r\n#define I2C_INTSTAT_SLVPENDING(x)                (((uint32_t)(((uint32_t)(x)) << I2C_INTSTAT_SLVPENDING_SHIFT)) & I2C_INTSTAT_SLVPENDING_MASK)\r\n\r\n#define I2C_INTSTAT_SLVNOTSTR_MASK               (0x800U)\r\n#define I2C_INTSTAT_SLVNOTSTR_SHIFT              (11U)\r\n/*! SLVNOTSTR - Slave Not Stretching status\r\n *  0b0..Not active\r\n *  0b1..Active\r\n */\r\n#define I2C_INTSTAT_SLVNOTSTR(x)                 (((uint32_t)(((uint32_t)(x)) << I2C_INTSTAT_SLVNOTSTR_SHIFT)) & I2C_INTSTAT_SLVNOTSTR_MASK)\r\n\r\n#define I2C_INTSTAT_SLVDESEL_MASK                (0x8000U)\r\n#define I2C_INTSTAT_SLVDESEL_SHIFT               (15U)\r\n/*! SLVDESEL - Slave Deselected flag\r\n *  0b0..Not active\r\n *  0b1..Active\r\n */\r\n#define I2C_INTSTAT_SLVDESEL(x)                  (((uint32_t)(((uint32_t)(x)) << I2C_INTSTAT_SLVDESEL_SHIFT)) & I2C_INTSTAT_SLVDESEL_MASK)\r\n\r\n#define I2C_INTSTAT_MONRDY_MASK                  (0x10000U)\r\n#define I2C_INTSTAT_MONRDY_SHIFT                 (16U)\r\n/*! MONRDY - Monitor Ready\r\n *  0b0..Not active\r\n *  0b1..Active\r\n */\r\n#define I2C_INTSTAT_MONRDY(x)                    (((uint32_t)(((uint32_t)(x)) << I2C_INTSTAT_MONRDY_SHIFT)) & I2C_INTSTAT_MONRDY_MASK)\r\n\r\n#define I2C_INTSTAT_MONOV_MASK                   (0x20000U)\r\n#define I2C_INTSTAT_MONOV_SHIFT                  (17U)\r\n/*! MONOV - Monitor Overflow flag\r\n *  0b0..Not active\r\n *  0b1..Active\r\n */\r\n#define I2C_INTSTAT_MONOV(x)                     (((uint32_t)(((uint32_t)(x)) << I2C_INTSTAT_MONOV_SHIFT)) & I2C_INTSTAT_MONOV_MASK)\r\n\r\n#define I2C_INTSTAT_MONIDLE_MASK                 (0x80000U)\r\n#define I2C_INTSTAT_MONIDLE_SHIFT                (19U)\r\n/*! MONIDLE - Monitor Idle flag\r\n *  0b0..Not active\r\n *  0b1..Active\r\n */\r\n#define I2C_INTSTAT_MONIDLE(x)                   (((uint32_t)(((uint32_t)(x)) << I2C_INTSTAT_MONIDLE_SHIFT)) & I2C_INTSTAT_MONIDLE_MASK)\r\n\r\n#define I2C_INTSTAT_EVENTTIMEOUT_MASK            (0x1000000U)\r\n#define I2C_INTSTAT_EVENTTIMEOUT_SHIFT           (24U)\r\n/*! EVENTTIMEOUT - Event Time-out Interrupt flag\r\n *  0b0..Not active\r\n *  0b1..Active\r\n */\r\n#define I2C_INTSTAT_EVENTTIMEOUT(x)              (((uint32_t)(((uint32_t)(x)) << I2C_INTSTAT_EVENTTIMEOUT_SHIFT)) & I2C_INTSTAT_EVENTTIMEOUT_MASK)\r\n\r\n#define I2C_INTSTAT_SCLTIMEOUT_MASK              (0x2000000U)\r\n#define I2C_INTSTAT_SCLTIMEOUT_SHIFT             (25U)\r\n/*! SCLTIMEOUT - SCL Time-out Interrupt flag\r\n *  0b0..Not active\r\n *  0b1..Active\r\n */\r\n#define I2C_INTSTAT_SCLTIMEOUT(x)                (((uint32_t)(((uint32_t)(x)) << I2C_INTSTAT_SCLTIMEOUT_SHIFT)) & I2C_INTSTAT_SCLTIMEOUT_MASK)\r\n/*! @} */\r\n\r\n/*! @name MSTCTL - Master Control Register */\r\n/*! @{ */\r\n\r\n#define I2C_MSTCTL_MSTCONTINUE_MASK              (0x1U)\r\n#define I2C_MSTCTL_MSTCONTINUE_SHIFT             (0U)\r\n/*! MSTCONTINUE - Master Continue(write-only)\r\n *  0b0..No effect\r\n *  0b1..Continue. Informs the Master function to continue to the next operation. This action must done after\r\n *       writing transmit data, reading received data, or any other housekeeping related to the next bus operation.\r\n */\r\n#define I2C_MSTCTL_MSTCONTINUE(x)                (((uint32_t)(((uint32_t)(x)) << I2C_MSTCTL_MSTCONTINUE_SHIFT)) & I2C_MSTCTL_MSTCONTINUE_MASK)\r\n\r\n#define I2C_MSTCTL_MSTSTART_MASK                 (0x2U)\r\n#define I2C_MSTCTL_MSTSTART_SHIFT                (1U)\r\n/*! MSTSTART - Master Start control(write-only)\r\n *  0b0..No effect\r\n *  0b1..Start. A Start will be generated on the I2C bus at the next allowed time.\r\n */\r\n#define I2C_MSTCTL_MSTSTART(x)                   (((uint32_t)(((uint32_t)(x)) << I2C_MSTCTL_MSTSTART_SHIFT)) & I2C_MSTCTL_MSTSTART_MASK)\r\n\r\n#define I2C_MSTCTL_MSTSTOP_MASK                  (0x4U)\r\n#define I2C_MSTCTL_MSTSTOP_SHIFT                 (2U)\r\n/*! MSTSTOP - Master Stop control(write-only)\r\n *  0b0..No effect\r\n *  0b1..Stop. A Stop will be generated on the I2C bus at the next allowed time, preceded by a NACK to the slave\r\n *       if the master is receiving data from the slave (in Master Receiver mode).\r\n */\r\n#define I2C_MSTCTL_MSTSTOP(x)                    (((uint32_t)(((uint32_t)(x)) << I2C_MSTCTL_MSTSTOP_SHIFT)) & I2C_MSTCTL_MSTSTOP_MASK)\r\n\r\n#define I2C_MSTCTL_MSTDMA_MASK                   (0x8U)\r\n#define I2C_MSTCTL_MSTDMA_SHIFT                  (3U)\r\n/*! MSTDMA - Master DMA enable\r\n *  0b0..Disable. No DMA requests are generated for master operation.\r\n *  0b1..Enable. A DMA request is generated for I2C master data operations. When this I2C master is generating\r\n *       Acknowledge bits in Master Receiver mode, the acknowledge is generated automatically.\r\n */\r\n#define I2C_MSTCTL_MSTDMA(x)                     (((uint32_t)(((uint32_t)(x)) << I2C_MSTCTL_MSTDMA_SHIFT)) & I2C_MSTCTL_MSTDMA_MASK)\r\n/*! @} */\r\n\r\n/*! @name MSTTIME - Master Timing Register */\r\n/*! @{ */\r\n\r\n#define I2C_MSTTIME_MSTSCLLOW_MASK               (0x7U)\r\n#define I2C_MSTTIME_MSTSCLLOW_SHIFT              (0U)\r\n/*! MSTSCLLOW - Master SCL Low time\r\n *  0b000..2 clocks. Minimum SCL low time is 2 clocks of the I2C clock pre-divider.\r\n *  0b001..3 clocks. Minimum SCL low time is 3 clocks of the I2C clock pre-divider.\r\n *  0b010..4 clocks. Minimum SCL low time is 4 clocks of the I2C clock pre-divider.\r\n *  0b011..5 clocks. Minimum SCL low time is 5 clocks of the I2C clock pre-divider.\r\n *  0b100..6 clocks. Minimum SCL low time is 6 clocks of the I2C clock pre-divider.\r\n *  0b101..7 clocks. Minimum SCL low time is 7 clocks of the I2C clock pre-divider.\r\n *  0b110..8 clocks. Minimum SCL low time is 8 clocks of the I2C clock pre-divider.\r\n *  0b111..9 clocks. Minimum SCL low time is 9 clocks of the I2C clock pre-divider.\r\n */\r\n#define I2C_MSTTIME_MSTSCLLOW(x)                 (((uint32_t)(((uint32_t)(x)) << I2C_MSTTIME_MSTSCLLOW_SHIFT)) & I2C_MSTTIME_MSTSCLLOW_MASK)\r\n\r\n#define I2C_MSTTIME_MSTSCLHIGH_MASK              (0x70U)\r\n#define I2C_MSTTIME_MSTSCLHIGH_SHIFT             (4U)\r\n/*! MSTSCLHIGH - Master SCL High time\r\n *  0b000..2 clocks. Minimum SCL high time is 2 clocks of the I2C clock pre-divider.\r\n *  0b001..3 clocks. Minimum SCL high time is 3 clocks of the I2C clock pre-divider .\r\n *  0b010..4 clocks. Minimum SCL high time is 4 clocks of the I2C clock pre-divider.\r\n *  0b011..5 clocks. Minimum SCL high time is 5 clocks of the I2C clock pre-divider.\r\n *  0b100..6 clocks. Minimum SCL high time is 6 clocks of the I2C clock pre-divider.\r\n *  0b101..7 clocks. Minimum SCL high time is 7 clocks of the I2C clock pre-divider.\r\n *  0b110..8 clocks. Minimum SCL high time is 8 clocks of the I2C clock pre-divider.\r\n *  0b111..9 clocks. Minimum SCL high time is 9 clocks of the I2C clock pre-divider.\r\n */\r\n#define I2C_MSTTIME_MSTSCLHIGH(x)                (((uint32_t)(((uint32_t)(x)) << I2C_MSTTIME_MSTSCLHIGH_SHIFT)) & I2C_MSTTIME_MSTSCLHIGH_MASK)\r\n/*! @} */\r\n\r\n/*! @name MSTDAT - Master Data Register */\r\n/*! @{ */\r\n\r\n#define I2C_MSTDAT_DATA_MASK                     (0xFFU)\r\n#define I2C_MSTDAT_DATA_SHIFT                    (0U)\r\n/*! DATA - Master function data register */\r\n#define I2C_MSTDAT_DATA(x)                       (((uint32_t)(((uint32_t)(x)) << I2C_MSTDAT_DATA_SHIFT)) & I2C_MSTDAT_DATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name SLVCTL - Slave Control Register */\r\n/*! @{ */\r\n\r\n#define I2C_SLVCTL_SLVCONTINUE_MASK              (0x1U)\r\n#define I2C_SLVCTL_SLVCONTINUE_SHIFT             (0U)\r\n/*! SLVCONTINUE - Slave Continue\r\n *  0b0..No effect\r\n *  0b1..Continue. Informs the Slave function to continue to the next operation, by clearing the STAT[SLVPENDING]\r\n *       flag. This must be done after writing transmit data, reading received data, or any other housekeeping\r\n *       related to the next bus operation. Automatic Operation has different requirements. SLVCONTINUE should not be\r\n *       set unless SLVPENDING = 1.\r\n */\r\n#define I2C_SLVCTL_SLVCONTINUE(x)                (((uint32_t)(((uint32_t)(x)) << I2C_SLVCTL_SLVCONTINUE_SHIFT)) & I2C_SLVCTL_SLVCONTINUE_MASK)\r\n\r\n#define I2C_SLVCTL_SLVNACK_MASK                  (0x2U)\r\n#define I2C_SLVCTL_SLVNACK_SHIFT                 (1U)\r\n/*! SLVNACK - Slave NACK\r\n *  0b0..No effect\r\n *  0b1..NACK. Causes the Slave function to NACK the master when the slave is receiving data from the master (in Slave Receiver mode).\r\n */\r\n#define I2C_SLVCTL_SLVNACK(x)                    (((uint32_t)(((uint32_t)(x)) << I2C_SLVCTL_SLVNACK_SHIFT)) & I2C_SLVCTL_SLVNACK_MASK)\r\n\r\n#define I2C_SLVCTL_SLVDMA_MASK                   (0x8U)\r\n#define I2C_SLVCTL_SLVDMA_SHIFT                  (3U)\r\n/*! SLVDMA - Slave DMA enable\r\n *  0b0..Disabled. No DMA requests are issued for Slave mode operation.\r\n *  0b1..Enabled. DMA requests are issued for I2C slave data transmission and reception.\r\n */\r\n#define I2C_SLVCTL_SLVDMA(x)                     (((uint32_t)(((uint32_t)(x)) << I2C_SLVCTL_SLVDMA_SHIFT)) & I2C_SLVCTL_SLVDMA_MASK)\r\n\r\n#define I2C_SLVCTL_AUTOACK_MASK                  (0x100U)\r\n#define I2C_SLVCTL_AUTOACK_SHIFT                 (8U)\r\n/*! AUTOACK - Automatic Acknowledge\r\n *  0b0..Normal, non-automatic operation. If AUTONACK = 0, then a SlvPending interrupt is generated when a\r\n *       matching address is received. If AUTONACK = 1, then received addresses are NACKed (ignored).\r\n *  0b1..A header with matching SLVADR0 and matching direction as set by AUTOMATCHREAD will be ACKed immediately,\r\n *       allowing the master to move on to the data bytes. If the address matches SLVADR0, but the direction does\r\n *       not match AUTOMATCHREAD, then the behavior will depend on the SLVADR0[AUTONACK] bit: if AUTONACK is set,\r\n *       then it will be Nacked; if AUTONACK is clear, then a SlvPending interrupt is generated.\r\n */\r\n#define I2C_SLVCTL_AUTOACK(x)                    (((uint32_t)(((uint32_t)(x)) << I2C_SLVCTL_AUTOACK_SHIFT)) & I2C_SLVCTL_AUTOACK_MASK)\r\n\r\n#define I2C_SLVCTL_AUTOMATCHREAD_MASK            (0x200U)\r\n#define I2C_SLVCTL_AUTOMATCHREAD_SHIFT           (9U)\r\n/*! AUTOMATCHREAD - Automatic Match Read\r\n *  0b0..In Automatic Mode, the expected next operation is an I2C write.\r\n *  0b1..In Automatic Mode, the expected next operation is an I2C read.\r\n */\r\n#define I2C_SLVCTL_AUTOMATCHREAD(x)              (((uint32_t)(((uint32_t)(x)) << I2C_SLVCTL_AUTOMATCHREAD_SHIFT)) & I2C_SLVCTL_AUTOMATCHREAD_MASK)\r\n/*! @} */\r\n\r\n/*! @name SLVDAT - Slave Data Register */\r\n/*! @{ */\r\n\r\n#define I2C_SLVDAT_DATA_MASK                     (0xFFU)\r\n#define I2C_SLVDAT_DATA_SHIFT                    (0U)\r\n/*! DATA - Slave function data register */\r\n#define I2C_SLVDAT_DATA(x)                       (((uint32_t)(((uint32_t)(x)) << I2C_SLVDAT_DATA_SHIFT)) & I2C_SLVDAT_DATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name SLVADR - Slave Address Register */\r\n/*! @{ */\r\n\r\n#define I2C_SLVADR_SADISABLE_MASK                (0x1U)\r\n#define I2C_SLVADR_SADISABLE_SHIFT               (0U)\r\n/*! SADISABLE - Slave Address n Disable\r\n *  0b0..Enabled. Slave Address n is enabled.\r\n *  0b1..Ignored. Slave Address n is ignored.\r\n */\r\n#define I2C_SLVADR_SADISABLE(x)                  (((uint32_t)(((uint32_t)(x)) << I2C_SLVADR_SADISABLE_SHIFT)) & I2C_SLVADR_SADISABLE_MASK)\r\n\r\n#define I2C_SLVADR_SLVADR_MASK                   (0xFEU)\r\n#define I2C_SLVADR_SLVADR_SHIFT                  (1U)\r\n/*! SLVADR - Slave Address. */\r\n#define I2C_SLVADR_SLVADR(x)                     (((uint32_t)(((uint32_t)(x)) << I2C_SLVADR_SLVADR_SHIFT)) & I2C_SLVADR_SLVADR_MASK)\r\n\r\n#define I2C_SLVADR_AUTONACK_MASK                 (0x8000U)\r\n#define I2C_SLVADR_AUTONACK_SHIFT                (15U)\r\n/*! AUTONACK - Automatic NACK operation\r\n *  0b0..Normal operation, matching I2C addresses are not ignored.\r\n *  0b1..Automatic-only mode. All incoming addresses are ignored (NACKed), unless AUTOACK is set, and the address\r\n *       matches SLVADRn, and AUTOMATCHREAD matches the direction.\r\n */\r\n#define I2C_SLVADR_AUTONACK(x)                   (((uint32_t)(((uint32_t)(x)) << I2C_SLVADR_AUTONACK_SHIFT)) & I2C_SLVADR_AUTONACK_MASK)\r\n/*! @} */\r\n\r\n/* The count of I2C_SLVADR */\r\n#define I2C_SLVADR_COUNT                         (4U)\r\n\r\n/*! @name SLVQUAL0 - Slave Qualification for Address 0 Register */\r\n/*! @{ */\r\n\r\n#define I2C_SLVQUAL0_QUALMODE0_MASK              (0x1U)\r\n#define I2C_SLVQUAL0_QUALMODE0_SHIFT             (0U)\r\n/*! QUALMODE0 - Qualify mode for slave address 0\r\n *  0b0..Mask. The SLVQUAL0 field is used as a logical mask for matching address 0.\r\n *  0b1..Extend. The SLVQUAL0 field is used to extend address 0 matching in a range of addresses.\r\n */\r\n#define I2C_SLVQUAL0_QUALMODE0(x)                (((uint32_t)(((uint32_t)(x)) << I2C_SLVQUAL0_QUALMODE0_SHIFT)) & I2C_SLVQUAL0_QUALMODE0_MASK)\r\n\r\n#define I2C_SLVQUAL0_SLVQUAL0_MASK               (0xFEU)\r\n#define I2C_SLVQUAL0_SLVQUAL0_SHIFT              (1U)\r\n/*! SLVQUAL0 - Slave address Qualifier for address 0 */\r\n#define I2C_SLVQUAL0_SLVQUAL0(x)                 (((uint32_t)(((uint32_t)(x)) << I2C_SLVQUAL0_SLVQUAL0_SHIFT)) & I2C_SLVQUAL0_SLVQUAL0_MASK)\r\n/*! @} */\r\n\r\n/*! @name MONRXDAT - Monitor Receiver Data Register */\r\n/*! @{ */\r\n\r\n#define I2C_MONRXDAT_MONRXDAT_MASK               (0xFFU)\r\n#define I2C_MONRXDAT_MONRXDAT_SHIFT              (0U)\r\n/*! MONRXDAT - Monitor function Receiver Data */\r\n#define I2C_MONRXDAT_MONRXDAT(x)                 (((uint32_t)(((uint32_t)(x)) << I2C_MONRXDAT_MONRXDAT_SHIFT)) & I2C_MONRXDAT_MONRXDAT_MASK)\r\n\r\n#define I2C_MONRXDAT_MONSTART_MASK               (0x100U)\r\n#define I2C_MONRXDAT_MONSTART_SHIFT              (8U)\r\n/*! MONSTART - Monitor Received Start\r\n *  0b0..No start detected. The Monitor function has not detected a Start event on the I2C bus.\r\n *  0b1..Start detected. The Monitor function has detected a Start event on the I2C bus.\r\n */\r\n#define I2C_MONRXDAT_MONSTART(x)                 (((uint32_t)(((uint32_t)(x)) << I2C_MONRXDAT_MONSTART_SHIFT)) & I2C_MONRXDAT_MONSTART_MASK)\r\n\r\n#define I2C_MONRXDAT_MONRESTART_MASK             (0x200U)\r\n#define I2C_MONRXDAT_MONRESTART_SHIFT            (9U)\r\n/*! MONRESTART - Monitor Received Repeated Start\r\n *  0b0..No repeated start detected. The Monitor function has not detected a Repeated Start event on the I2C bus.\r\n *  0b1..Repeated start detected. The Monitor function has detected a Repeated Start event on the I2C bus.\r\n */\r\n#define I2C_MONRXDAT_MONRESTART(x)               (((uint32_t)(((uint32_t)(x)) << I2C_MONRXDAT_MONRESTART_SHIFT)) & I2C_MONRXDAT_MONRESTART_MASK)\r\n\r\n#define I2C_MONRXDAT_MONNACK_MASK                (0x400U)\r\n#define I2C_MONRXDAT_MONNACK_SHIFT               (10U)\r\n/*! MONNACK - Monitor Received NACK\r\n *  0b0..Acknowledged. The data currently being provided by the Monitor function was acknowledged by at least one master or slave receiver.\r\n *  0b1..Not acknowledged. The data currently being provided by the Monitor function was not acknowledged by any receiver.\r\n */\r\n#define I2C_MONRXDAT_MONNACK(x)                  (((uint32_t)(((uint32_t)(x)) << I2C_MONRXDAT_MONNACK_SHIFT)) & I2C_MONRXDAT_MONNACK_MASK)\r\n/*! @} */\r\n\r\n/*! @name ID - Peripheral Identification Register */\r\n/*! @{ */\r\n\r\n#define I2C_ID_APERTURE_MASK                     (0xFFU)\r\n#define I2C_ID_APERTURE_SHIFT                    (0U)\r\n/*! APERTURE - Aperture */\r\n#define I2C_ID_APERTURE(x)                       (((uint32_t)(((uint32_t)(x)) << I2C_ID_APERTURE_SHIFT)) & I2C_ID_APERTURE_MASK)\r\n\r\n#define I2C_ID_MINOR_REV_MASK                    (0xF00U)\r\n#define I2C_ID_MINOR_REV_SHIFT                   (8U)\r\n/*! MINOR_REV - Minor revision of module implementation */\r\n#define I2C_ID_MINOR_REV(x)                      (((uint32_t)(((uint32_t)(x)) << I2C_ID_MINOR_REV_SHIFT)) & I2C_ID_MINOR_REV_MASK)\r\n\r\n#define I2C_ID_MAJOR_REV_MASK                    (0xF000U)\r\n#define I2C_ID_MAJOR_REV_SHIFT                   (12U)\r\n/*! MAJOR_REV - Major revision of module implementation */\r\n#define I2C_ID_MAJOR_REV(x)                      (((uint32_t)(((uint32_t)(x)) << I2C_ID_MAJOR_REV_SHIFT)) & I2C_ID_MAJOR_REV_MASK)\r\n\r\n#define I2C_ID_ID_MASK                           (0xFFFF0000U)\r\n#define I2C_ID_ID_SHIFT                          (16U)\r\n/*! ID - Module identifier for the selected function */\r\n#define I2C_ID_ID(x)                             (((uint32_t)(((uint32_t)(x)) << I2C_ID_ID_SHIFT)) & I2C_ID_ID_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group I2C_Register_Masks */\r\n\r\n\r\n/* I2C - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral I2C0 base address */\r\n  #define I2C0_BASE                                (0x50106000u)\r\n  /** Peripheral I2C0 base address */\r\n  #define I2C0_BASE_NS                             (0x40106000u)\r\n  /** Peripheral I2C0 base pointer */\r\n  #define I2C0                                     ((I2C_Type *)I2C0_BASE)\r\n  /** Peripheral I2C0 base pointer */\r\n  #define I2C0_NS                                  ((I2C_Type *)I2C0_BASE_NS)\r\n  /** Peripheral I2C1 base address */\r\n  #define I2C1_BASE                                (0x50107000u)\r\n  /** Peripheral I2C1 base address */\r\n  #define I2C1_BASE_NS                             (0x40107000u)\r\n  /** Peripheral I2C1 base pointer */\r\n  #define I2C1                                     ((I2C_Type *)I2C1_BASE)\r\n  /** Peripheral I2C1 base pointer */\r\n  #define I2C1_NS                                  ((I2C_Type *)I2C1_BASE_NS)\r\n  /** Peripheral I2C2 base address */\r\n  #define I2C2_BASE                                (0x50108000u)\r\n  /** Peripheral I2C2 base address */\r\n  #define I2C2_BASE_NS                             (0x40108000u)\r\n  /** Peripheral I2C2 base pointer */\r\n  #define I2C2                                     ((I2C_Type *)I2C2_BASE)\r\n  /** Peripheral I2C2 base pointer */\r\n  #define I2C2_NS                                  ((I2C_Type *)I2C2_BASE_NS)\r\n  /** Peripheral I2C3 base address */\r\n  #define I2C3_BASE                                (0x50109000u)\r\n  /** Peripheral I2C3 base address */\r\n  #define I2C3_BASE_NS                             (0x40109000u)\r\n  /** Peripheral I2C3 base pointer */\r\n  #define I2C3                                     ((I2C_Type *)I2C3_BASE)\r\n  /** Peripheral I2C3 base pointer */\r\n  #define I2C3_NS                                  ((I2C_Type *)I2C3_BASE_NS)\r\n  /** Peripheral I2C14 base address */\r\n  #define I2C14_BASE                               (0x50126000u)\r\n  /** Peripheral I2C14 base address */\r\n  #define I2C14_BASE_NS                            (0x40126000u)\r\n  /** Peripheral I2C14 base pointer */\r\n  #define I2C14                                    ((I2C_Type *)I2C14_BASE)\r\n  /** Peripheral I2C14 base pointer */\r\n  #define I2C14_NS                                 ((I2C_Type *)I2C14_BASE_NS)\r\n  /** Array initializer of I2C peripheral base addresses */\r\n  #define I2C_BASE_ADDRS                           { I2C0_BASE, I2C1_BASE, I2C2_BASE, I2C3_BASE, I2C14_BASE }\r\n  /** Array initializer of I2C peripheral base pointers */\r\n  #define I2C_BASE_PTRS                            { I2C0, I2C1, I2C2, I2C3, I2C14 }\r\n  /** Array initializer of I2C peripheral base addresses */\r\n  #define I2C_BASE_ADDRS_NS                        { I2C0_BASE_NS, I2C1_BASE_NS, I2C2_BASE_NS, I2C3_BASE_NS, I2C14_BASE_NS }\r\n  /** Array initializer of I2C peripheral base pointers */\r\n  #define I2C_BASE_PTRS_NS                         { I2C0_NS, I2C1_NS, I2C2_NS, I2C3_NS, I2C14_NS }\r\n#else\r\n  /** Peripheral I2C0 base address */\r\n  #define I2C0_BASE                                (0x40106000u)\r\n  /** Peripheral I2C0 base pointer */\r\n  #define I2C0                                     ((I2C_Type *)I2C0_BASE)\r\n  /** Peripheral I2C1 base address */\r\n  #define I2C1_BASE                                (0x40107000u)\r\n  /** Peripheral I2C1 base pointer */\r\n  #define I2C1                                     ((I2C_Type *)I2C1_BASE)\r\n  /** Peripheral I2C2 base address */\r\n  #define I2C2_BASE                                (0x40108000u)\r\n  /** Peripheral I2C2 base pointer */\r\n  #define I2C2                                     ((I2C_Type *)I2C2_BASE)\r\n  /** Peripheral I2C3 base address */\r\n  #define I2C3_BASE                                (0x40109000u)\r\n  /** Peripheral I2C3 base pointer */\r\n  #define I2C3                                     ((I2C_Type *)I2C3_BASE)\r\n  /** Peripheral I2C14 base address */\r\n  #define I2C14_BASE                               (0x40126000u)\r\n  /** Peripheral I2C14 base pointer */\r\n  #define I2C14                                    ((I2C_Type *)I2C14_BASE)\r\n  /** Array initializer of I2C peripheral base addresses */\r\n  #define I2C_BASE_ADDRS                           { I2C0_BASE, I2C1_BASE, I2C2_BASE, I2C3_BASE, I2C14_BASE }\r\n  /** Array initializer of I2C peripheral base pointers */\r\n  #define I2C_BASE_PTRS                            { I2C0, I2C1, I2C2, I2C3, I2C14 }\r\n#endif\r\n/** Interrupt vectors for the I2C peripheral type */\r\n#define I2C_IRQS                                 { FLEXCOMM0_IRQn, FLEXCOMM1_IRQn, FLEXCOMM2_IRQn, FLEXCOMM3_IRQn, FLEXCOMM14_IRQn }\r\n\r\n/*!\r\n * @}\r\n */ /* end of group I2C_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- I2S Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup I2S_Peripheral_Access_Layer I2S Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** I2S - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[3072];\r\n  __IO uint32_t CFG1;                              /**< Configuration Register 1 for the Primary Channel Pair, offset: 0xC00 */\r\n  __IO uint32_t CFG2;                              /**< Configuration Register 2 for the Primary Channel Pair, offset: 0xC04 */\r\n  __IO uint32_t STAT;                              /**< Status Register for the Primary Channel Pair, offset: 0xC08 */\r\n       uint8_t RESERVED_1[16];\r\n  __IO uint32_t DIV;                               /**< Clock Divider, offset: 0xC1C */\r\n  struct {                                         /* offset: 0xC20, array step: 0x20 */\r\n    __IO uint32_t PCFG1;                             /**< Configuration Register 1 for Channel Pair 1..Configuration Register 1 for Channel Pair 3, array offset: 0xC20, array step: 0x20 */\r\n    __IO uint32_t PCFG2;                             /**< Configuration Register 2 for Channel Pair 1..Configuration Register 2 for Channel Pair 3, array offset: 0xC24, array step: 0x20 */\r\n    __I  uint32_t PSTAT;                             /**< Status Register for Channel Pair 1..Status Register for Channel Pair 3, array offset: 0xC28, array step: 0x20 */\r\n         uint8_t RESERVED_0[20];\r\n  } SECCHANNEL[3];\r\n       uint8_t RESERVED_2[384];\r\n  __IO uint32_t FIFOCFG;                           /**< FIFO Configuration and Enable, offset: 0xE00 */\r\n  __IO uint32_t FIFOSTAT;                          /**< FIFO Status, offset: 0xE04 */\r\n  __IO uint32_t FIFOTRIG;                          /**< FIFO Trigger Settings, offset: 0xE08 */\r\n       uint8_t RESERVED_3[4];\r\n  __IO uint32_t FIFOINTENSET;                      /**< FIFO Interrupt Enable Set and Read, offset: 0xE10 */\r\n  __IO uint32_t FIFOINTENCLR;                      /**< FIFO Interrupt Enable Clear and Read, offset: 0xE14 */\r\n  __I  uint32_t FIFOINTSTAT;                       /**< FIFO Interrupt Status, offset: 0xE18 */\r\n       uint8_t RESERVED_4[4];\r\n  __O  uint32_t FIFOWR;                            /**< FIFO Write Data, offset: 0xE20 */\r\n  __O  uint32_t FIFOWR48H;                         /**< FIFO Write Data for Upper Data Bits, offset: 0xE24 */\r\n       uint8_t RESERVED_5[8];\r\n  __I  uint32_t FIFORD;                            /**< FIFO Read Data, offset: 0xE30 */\r\n  __I  uint32_t FIFORD48H;                         /**< FIFO Read Data for Upper Data Bits, offset: 0xE34 */\r\n       uint8_t RESERVED_6[8];\r\n  __I  uint32_t FIFORDNOPOP;                       /**< FIFO Data Read with No FIFO Pop, offset: 0xE40 */\r\n  __I  uint32_t FIFORD48HNOPOP;                    /**< FIFO Data Read for Upper Data Bits with No FIFO Pop, offset: 0xE44 */\r\n  __I  uint32_t FIFOSIZE;                          /**< FIFO Size Register, offset: 0xE48 */\r\n  struct {                                         /* offset: 0xE4C */\r\n    __IO uint32_t FIFORXTIMEOUTCFG;                  /**< FIFO Receive Timeout Configuration, offset: 0xE4C */\r\n    __I  uint32_t FIFORXTIMEOUTCNT;                  /**< FIFO Receive Timeout Counter, offset: 0xE50 */\r\n  } FIFO_I2S;\r\n       uint8_t RESERVED_7[424];\r\n  __I  uint32_t ID;                                /**< I2S Module Identification, offset: 0xFFC */\r\n} I2S_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- I2S Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup I2S_Register_Masks I2S Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name CFG1 - Configuration Register 1 for the Primary Channel Pair */\r\n/*! @{ */\r\n\r\n#define I2S_CFG1_MAINENABLE_MASK                 (0x1U)\r\n#define I2S_CFG1_MAINENABLE_SHIFT                (0U)\r\n/*! MAINENABLE - Main Enable\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define I2S_CFG1_MAINENABLE(x)                   (((uint32_t)(((uint32_t)(x)) << I2S_CFG1_MAINENABLE_SHIFT)) & I2S_CFG1_MAINENABLE_MASK)\r\n\r\n#define I2S_CFG1_DATAPAUSE_MASK                  (0x2U)\r\n#define I2S_CFG1_DATAPAUSE_SHIFT                 (1U)\r\n/*! DATAPAUSE - Data Flow Pause\r\n *  0b0..Normal operation\r\n *  0b1..Pause\r\n */\r\n#define I2S_CFG1_DATAPAUSE(x)                    (((uint32_t)(((uint32_t)(x)) << I2S_CFG1_DATAPAUSE_SHIFT)) & I2S_CFG1_DATAPAUSE_MASK)\r\n\r\n#define I2S_CFG1_PAIRCOUNT_MASK                  (0xCU)\r\n#define I2S_CFG1_PAIRCOUNT_SHIFT                 (2U)\r\n/*! PAIRCOUNT - Pair Count\r\n *  0b00..One Pair\r\n *  0b01..Two Pairs\r\n *  0b10..Three Pairs\r\n *  0b11..Four Pairs\r\n */\r\n#define I2S_CFG1_PAIRCOUNT(x)                    (((uint32_t)(((uint32_t)(x)) << I2S_CFG1_PAIRCOUNT_SHIFT)) & I2S_CFG1_PAIRCOUNT_MASK)\r\n\r\n#define I2S_CFG1_MSTSLVCFG_MASK                  (0x30U)\r\n#define I2S_CFG1_MSTSLVCFG_SHIFT                 (4U)\r\n/*! MSTSLVCFG - Master/Slave Configuration Selection\r\n *  0b00..Normal Slave Mode\r\n *  0b01..WS Synchronized Master Mode\r\n *  0b10..Master Using an Existing SCK Mode\r\n *  0b11..Normal Master Mode\r\n */\r\n#define I2S_CFG1_MSTSLVCFG(x)                    (((uint32_t)(((uint32_t)(x)) << I2S_CFG1_MSTSLVCFG_SHIFT)) & I2S_CFG1_MSTSLVCFG_MASK)\r\n\r\n#define I2S_CFG1_MODE_MASK                       (0xC0U)\r\n#define I2S_CFG1_MODE_SHIFT                      (6U)\r\n/*! MODE - Mode\r\n *  0b00..Classic Mode\r\n *  0b01..DSP mode WS 50% duty cycle\r\n *  0b10..DSP mode WS 1 clock\r\n *  0b11..DSP mode WS 1 data\r\n */\r\n#define I2S_CFG1_MODE(x)                         (((uint32_t)(((uint32_t)(x)) << I2S_CFG1_MODE_SHIFT)) & I2S_CFG1_MODE_MASK)\r\n\r\n#define I2S_CFG1_RIGHTLOW_MASK                   (0x100U)\r\n#define I2S_CFG1_RIGHTLOW_SHIFT                  (8U)\r\n/*! RIGHTLOW - Right Channel Low\r\n *  0b0..Right high\r\n *  0b1..Right low\r\n */\r\n#define I2S_CFG1_RIGHTLOW(x)                     (((uint32_t)(((uint32_t)(x)) << I2S_CFG1_RIGHTLOW_SHIFT)) & I2S_CFG1_RIGHTLOW_MASK)\r\n\r\n#define I2S_CFG1_LEFTJUST_MASK                   (0x200U)\r\n#define I2S_CFG1_LEFTJUST_SHIFT                  (9U)\r\n/*! LEFTJUST - Left-Justify Data\r\n *  0b0..Right-justified\r\n *  0b1..Left-justified\r\n */\r\n#define I2S_CFG1_LEFTJUST(x)                     (((uint32_t)(((uint32_t)(x)) << I2S_CFG1_LEFTJUST_SHIFT)) & I2S_CFG1_LEFTJUST_MASK)\r\n\r\n#define I2S_CFG1_ONECHANNEL_MASK                 (0x400U)\r\n#define I2S_CFG1_ONECHANNEL_SHIFT                (10U)\r\n/*! ONECHANNEL - Single Channel Mode\r\n *  0b0..Dual channel\r\n *  0b1..Single channel\r\n */\r\n#define I2S_CFG1_ONECHANNEL(x)                   (((uint32_t)(((uint32_t)(x)) << I2S_CFG1_ONECHANNEL_SHIFT)) & I2S_CFG1_ONECHANNEL_MASK)\r\n\r\n#define I2S_CFG1_PDMDATA_MASK                    (0x800U)\r\n#define I2S_CFG1_PDMDATA_SHIFT                   (11U)\r\n/*! PDMDATA - PDM Data Selection\r\n *  0b0..Normal Operation\r\n *  0b1..DMIC subsystem\r\n */\r\n#define I2S_CFG1_PDMDATA(x)                      (((uint32_t)(((uint32_t)(x)) << I2S_CFG1_PDMDATA_SHIFT)) & I2S_CFG1_PDMDATA_MASK)\r\n\r\n#define I2S_CFG1_SCK_POL_MASK                    (0x1000U)\r\n#define I2S_CFG1_SCK_POL_SHIFT                   (12U)\r\n/*! SCK_POL - SCK Polarity\r\n *  0b0..Falling edge\r\n *  0b1..Rising edge\r\n */\r\n#define I2S_CFG1_SCK_POL(x)                      (((uint32_t)(((uint32_t)(x)) << I2S_CFG1_SCK_POL_SHIFT)) & I2S_CFG1_SCK_POL_MASK)\r\n\r\n#define I2S_CFG1_WS_POL_MASK                     (0x2000U)\r\n#define I2S_CFG1_WS_POL_SHIFT                    (13U)\r\n/*! WS_POL - WS Polarity\r\n *  0b0..Not inverted\r\n *  0b1..Inverted. The WS signal is inverted.\r\n */\r\n#define I2S_CFG1_WS_POL(x)                       (((uint32_t)(((uint32_t)(x)) << I2S_CFG1_WS_POL_SHIFT)) & I2S_CFG1_WS_POL_MASK)\r\n\r\n#define I2S_CFG1_DATALEN_MASK                    (0x1F0000U)\r\n#define I2S_CFG1_DATALEN_SHIFT                   (16U)\r\n/*! DATALEN - Data Length\r\n *  0b00011..Data is 4 bits in length.\r\n *  0b00100..Data is 5 bits in length.\r\n *  0b00111..Data is 8 bits in length.\r\n *  0b11110..Data is 31 bits in length.\r\n *  0b11111..Data is 32 bits in length.\r\n */\r\n#define I2S_CFG1_DATALEN(x)                      (((uint32_t)(((uint32_t)(x)) << I2S_CFG1_DATALEN_SHIFT)) & I2S_CFG1_DATALEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CFG2 - Configuration Register 2 for the Primary Channel Pair */\r\n/*! @{ */\r\n\r\n#define I2S_CFG2_FRAMELEN_MASK                   (0x7FFU)\r\n#define I2S_CFG2_FRAMELEN_SHIFT                  (0U)\r\n/*! FRAMELEN - Frame Length\r\n *  0b00000000011..Frame is 4 bits in total length\r\n *  0b00000000100..Frame is 5 bits in total length\r\n *  0b00111111111..Frame is 512 bits in total length\r\n *  0b11111111111..Frame is 2048 bits in total length\r\n */\r\n#define I2S_CFG2_FRAMELEN(x)                     (((uint32_t)(((uint32_t)(x)) << I2S_CFG2_FRAMELEN_SHIFT)) & I2S_CFG2_FRAMELEN_MASK)\r\n\r\n#define I2S_CFG2_POSITION_MASK                   (0x7FF0000U)\r\n#define I2S_CFG2_POSITION_SHIFT                  (16U)\r\n/*! POSITION - Data Position\r\n *  0b00000000000..Data begins at bit position 0 (the first bit position) within the frame or WS phase\r\n *  0b00000000001..Data begins at bit position 1 within the frame or WS phase\r\n *  0b00000000010..Data begins at bit position 2 within the frame or WS phase\r\n */\r\n#define I2S_CFG2_POSITION(x)                     (((uint32_t)(((uint32_t)(x)) << I2S_CFG2_POSITION_SHIFT)) & I2S_CFG2_POSITION_MASK)\r\n/*! @} */\r\n\r\n/*! @name STAT - Status Register for the Primary Channel Pair */\r\n/*! @{ */\r\n\r\n#define I2S_STAT_BUSY_MASK                       (0x1U)\r\n#define I2S_STAT_BUSY_SHIFT                      (0U)\r\n/*! BUSY - Busy Status\r\n *  0b0..Idle\r\n *  0b1..Busy\r\n */\r\n#define I2S_STAT_BUSY(x)                         (((uint32_t)(((uint32_t)(x)) << I2S_STAT_BUSY_SHIFT)) & I2S_STAT_BUSY_MASK)\r\n\r\n#define I2S_STAT_SLVFRMERR_MASK                  (0x2U)\r\n#define I2S_STAT_SLVFRMERR_SHIFT                 (1U)\r\n/*! SLVFRMERR - Slave Frame Error\r\n *  0b0..No error\r\n *  0b1..Error\r\n */\r\n#define I2S_STAT_SLVFRMERR(x)                    (((uint32_t)(((uint32_t)(x)) << I2S_STAT_SLVFRMERR_SHIFT)) & I2S_STAT_SLVFRMERR_MASK)\r\n\r\n#define I2S_STAT_LR_MASK                         (0x4U)\r\n#define I2S_STAT_LR_SHIFT                        (2U)\r\n/*! LR - Left/Right Indication\r\n *  0b0..Left channel\r\n *  0b1..Right channel\r\n */\r\n#define I2S_STAT_LR(x)                           (((uint32_t)(((uint32_t)(x)) << I2S_STAT_LR_SHIFT)) & I2S_STAT_LR_MASK)\r\n\r\n#define I2S_STAT_DATAPAUSED_MASK                 (0x8U)\r\n#define I2S_STAT_DATAPAUSED_SHIFT                (3U)\r\n/*! DATAPAUSED - Data Paused\r\n *  0b0..Not Paused\r\n *  0b1..Paused\r\n */\r\n#define I2S_STAT_DATAPAUSED(x)                   (((uint32_t)(((uint32_t)(x)) << I2S_STAT_DATAPAUSED_SHIFT)) & I2S_STAT_DATAPAUSED_MASK)\r\n/*! @} */\r\n\r\n/*! @name DIV - Clock Divider */\r\n/*! @{ */\r\n\r\n#define I2S_DIV_DIV_MASK                         (0xFFFU)\r\n#define I2S_DIV_DIV_SHIFT                        (0U)\r\n/*! DIV - Divider\r\n *  0b000000000000..FCLK is used directly.\r\n *  0b000000000001..FCLK is divided by 2.\r\n *  0b000000000010..FCLK is divided by 3.\r\n *  0b111111111111..FCLK is divided by 4,096.\r\n */\r\n#define I2S_DIV_DIV(x)                           (((uint32_t)(((uint32_t)(x)) << I2S_DIV_DIV_SHIFT)) & I2S_DIV_DIV_MASK)\r\n/*! @} */\r\n\r\n/*! @name SECCHANNEL_PCFG1 - Configuration Register 1 for Channel Pair 1..Configuration Register 1 for Channel Pair 3 */\r\n/*! @{ */\r\n\r\n#define I2S_SECCHANNEL_PCFG1_PAIRENABLE_MASK     (0x1U)\r\n#define I2S_SECCHANNEL_PCFG1_PAIRENABLE_SHIFT    (0U)\r\n/*! PAIRENABLE - Pair Enable\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define I2S_SECCHANNEL_PCFG1_PAIRENABLE(x)       (((uint32_t)(((uint32_t)(x)) << I2S_SECCHANNEL_PCFG1_PAIRENABLE_SHIFT)) & I2S_SECCHANNEL_PCFG1_PAIRENABLE_MASK)\r\n\r\n#define I2S_SECCHANNEL_PCFG1_ONECHANNEL_MASK     (0x400U)\r\n#define I2S_SECCHANNEL_PCFG1_ONECHANNEL_SHIFT    (10U)\r\n/*! ONECHANNEL - Single Channel Mode\r\n *  0b0..Dual Channel\r\n *  0b1..Single Channel\r\n */\r\n#define I2S_SECCHANNEL_PCFG1_ONECHANNEL(x)       (((uint32_t)(((uint32_t)(x)) << I2S_SECCHANNEL_PCFG1_ONECHANNEL_SHIFT)) & I2S_SECCHANNEL_PCFG1_ONECHANNEL_MASK)\r\n/*! @} */\r\n\r\n/* The count of I2S_SECCHANNEL_PCFG1 */\r\n#define I2S_SECCHANNEL_PCFG1_COUNT               (3U)\r\n\r\n/*! @name SECCHANNEL_PCFG2 - Configuration Register 2 for Channel Pair 1..Configuration Register 2 for Channel Pair 3 */\r\n/*! @{ */\r\n\r\n#define I2S_SECCHANNEL_PCFG2_POSITION_MASK       (0x1FF0000U)\r\n#define I2S_SECCHANNEL_PCFG2_POSITION_SHIFT      (16U)\r\n/*! POSITION - Data Position */\r\n#define I2S_SECCHANNEL_PCFG2_POSITION(x)         (((uint32_t)(((uint32_t)(x)) << I2S_SECCHANNEL_PCFG2_POSITION_SHIFT)) & I2S_SECCHANNEL_PCFG2_POSITION_MASK)\r\n/*! @} */\r\n\r\n/* The count of I2S_SECCHANNEL_PCFG2 */\r\n#define I2S_SECCHANNEL_PCFG2_COUNT               (3U)\r\n\r\n/*! @name SECCHANNEL_PSTAT - Status Register for Channel Pair 1..Status Register for Channel Pair 3 */\r\n/*! @{ */\r\n\r\n#define I2S_SECCHANNEL_PSTAT_BUSY_MASK           (0x1U)\r\n#define I2S_SECCHANNEL_PSTAT_BUSY_SHIFT          (0U)\r\n/*! BUSY - Busy Status for Channel Pair\r\n *  0b0..Idle. The transmitter/receiver for this channel pair is currently idle.\r\n *  0b1..Busy. The transmitter/receiver for this channel pair is currently processing data.\r\n */\r\n#define I2S_SECCHANNEL_PSTAT_BUSY(x)             (((uint32_t)(((uint32_t)(x)) << I2S_SECCHANNEL_PSTAT_BUSY_SHIFT)) & I2S_SECCHANNEL_PSTAT_BUSY_MASK)\r\n\r\n#define I2S_SECCHANNEL_PSTAT_SLVFRMERR_MASK      (0x2U)\r\n#define I2S_SECCHANNEL_PSTAT_SLVFRMERR_SHIFT     (1U)\r\n/*! SLVFRMERR - Save Frame Error Flag\r\n *  0b0..No Error\r\n *  0b1..Error\r\n */\r\n#define I2S_SECCHANNEL_PSTAT_SLVFRMERR(x)        (((uint32_t)(((uint32_t)(x)) << I2S_SECCHANNEL_PSTAT_SLVFRMERR_SHIFT)) & I2S_SECCHANNEL_PSTAT_SLVFRMERR_MASK)\r\n\r\n#define I2S_SECCHANNEL_PSTAT_LR_MASK             (0x4U)\r\n#define I2S_SECCHANNEL_PSTAT_LR_SHIFT            (2U)\r\n/*! LR - Left/Right Indication\r\n *  0b0..Left channel\r\n *  0b1..Right channel\r\n */\r\n#define I2S_SECCHANNEL_PSTAT_LR(x)               (((uint32_t)(((uint32_t)(x)) << I2S_SECCHANNEL_PSTAT_LR_SHIFT)) & I2S_SECCHANNEL_PSTAT_LR_MASK)\r\n\r\n#define I2S_SECCHANNEL_PSTAT_DATAPAUSED_MASK     (0x8U)\r\n#define I2S_SECCHANNEL_PSTAT_DATAPAUSED_SHIFT    (3U)\r\n/*! DATAPAUSED - Data Paused Status Flag\r\n *  0b0..Data Not Paused. Data is not currently paused. A data pause may have been requested but is not yet in\r\n *       force, waiting for an allowed pause point. Refer to the description in CFG1[DATAPAUSE].\r\n *  0b1..Data Paused. A data pause has been requested and is now in force.\r\n */\r\n#define I2S_SECCHANNEL_PSTAT_DATAPAUSED(x)       (((uint32_t)(((uint32_t)(x)) << I2S_SECCHANNEL_PSTAT_DATAPAUSED_SHIFT)) & I2S_SECCHANNEL_PSTAT_DATAPAUSED_MASK)\r\n/*! @} */\r\n\r\n/* The count of I2S_SECCHANNEL_PSTAT */\r\n#define I2S_SECCHANNEL_PSTAT_COUNT               (3U)\r\n\r\n/*! @name FIFOCFG - FIFO Configuration and Enable */\r\n/*! @{ */\r\n\r\n#define I2S_FIFOCFG_ENABLETX_MASK                (0x1U)\r\n#define I2S_FIFOCFG_ENABLETX_SHIFT               (0U)\r\n/*! ENABLETX - Enable Transmit FIFO\r\n *  0b0..Disabled Transmit. The transmit FIFO is not enabled.\r\n *  0b1..Enabled transmit. The transmit FIFO is enabled.\r\n */\r\n#define I2S_FIFOCFG_ENABLETX(x)                  (((uint32_t)(((uint32_t)(x)) << I2S_FIFOCFG_ENABLETX_SHIFT)) & I2S_FIFOCFG_ENABLETX_MASK)\r\n\r\n#define I2S_FIFOCFG_ENABLERX_MASK                (0x2U)\r\n#define I2S_FIFOCFG_ENABLERX_SHIFT               (1U)\r\n/*! ENABLERX - Enable Receive FIFO\r\n *  0b0..Disabled. The receive FIFO is not enabled.\r\n *  0b1..Enabled. The receive FIFO is enabled.\r\n */\r\n#define I2S_FIFOCFG_ENABLERX(x)                  (((uint32_t)(((uint32_t)(x)) << I2S_FIFOCFG_ENABLERX_SHIFT)) & I2S_FIFOCFG_ENABLERX_MASK)\r\n\r\n#define I2S_FIFOCFG_TXI2SE0_MASK                 (0x4U)\r\n#define I2S_FIFOCFG_TXI2SE0_SHIFT                (2U)\r\n/*! TXI2SE0 - Transmit I2S Empty 0\r\n *  0b0..Last value\r\n *  0b1..Zero\r\n */\r\n#define I2S_FIFOCFG_TXI2SE0(x)                   (((uint32_t)(((uint32_t)(x)) << I2S_FIFOCFG_TXI2SE0_SHIFT)) & I2S_FIFOCFG_TXI2SE0_MASK)\r\n\r\n#define I2S_FIFOCFG_PACK48_MASK                  (0x8U)\r\n#define I2S_FIFOCFG_PACK48_SHIFT                 (3U)\r\n/*! PACK48 - Packing Format 48-bit data\r\n *  0b0..Bits_24\r\n *  0b1..Bits_32_16\r\n */\r\n#define I2S_FIFOCFG_PACK48(x)                    (((uint32_t)(((uint32_t)(x)) << I2S_FIFOCFG_PACK48_SHIFT)) & I2S_FIFOCFG_PACK48_MASK)\r\n\r\n#define I2S_FIFOCFG_SIZE_MASK                    (0x30U)\r\n#define I2S_FIFOCFG_SIZE_SHIFT                   (4U)\r\n/*! SIZE - FIFO Size Configuration\r\n *  0b10..Size 32 Bits\r\n *  0b11..Size 48 Bits\r\n */\r\n#define I2S_FIFOCFG_SIZE(x)                      (((uint32_t)(((uint32_t)(x)) << I2S_FIFOCFG_SIZE_SHIFT)) & I2S_FIFOCFG_SIZE_MASK)\r\n\r\n#define I2S_FIFOCFG_DMATX_MASK                   (0x1000U)\r\n#define I2S_FIFOCFG_DMATX_SHIFT                  (12U)\r\n/*! DMATX - DMA Transmit\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define I2S_FIFOCFG_DMATX(x)                     (((uint32_t)(((uint32_t)(x)) << I2S_FIFOCFG_DMATX_SHIFT)) & I2S_FIFOCFG_DMATX_MASK)\r\n\r\n#define I2S_FIFOCFG_DMARX_MASK                   (0x2000U)\r\n#define I2S_FIFOCFG_DMARX_SHIFT                  (13U)\r\n/*! DMARX - DMA Receive\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define I2S_FIFOCFG_DMARX(x)                     (((uint32_t)(((uint32_t)(x)) << I2S_FIFOCFG_DMARX_SHIFT)) & I2S_FIFOCFG_DMARX_MASK)\r\n\r\n#define I2S_FIFOCFG_WAKETX_MASK                  (0x4000U)\r\n#define I2S_FIFOCFG_WAKETX_SHIFT                 (14U)\r\n/*! WAKETX - Wake-up for Transmit FIFO Level\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define I2S_FIFOCFG_WAKETX(x)                    (((uint32_t)(((uint32_t)(x)) << I2S_FIFOCFG_WAKETX_SHIFT)) & I2S_FIFOCFG_WAKETX_MASK)\r\n\r\n#define I2S_FIFOCFG_WAKERX_MASK                  (0x8000U)\r\n#define I2S_FIFOCFG_WAKERX_SHIFT                 (15U)\r\n/*! WAKERX - Wake-up for Receive FIFO Level\r\n *  0b0..Only enabled interrupts wake up the device from reduced power modes.\r\n *  0b1..A device wake-up for DMA occurs if the receive FIFO level reaches the value specified by FIFOTRIG[RXLVL],\r\n *       even when the RXLVL interrupt is not enabled.\r\n */\r\n#define I2S_FIFOCFG_WAKERX(x)                    (((uint32_t)(((uint32_t)(x)) << I2S_FIFOCFG_WAKERX_SHIFT)) & I2S_FIFOCFG_WAKERX_MASK)\r\n\r\n#define I2S_FIFOCFG_EMPTYTX_MASK                 (0x10000U)\r\n#define I2S_FIFOCFG_EMPTYTX_SHIFT                (16U)\r\n/*! EMPTYTX - Empty command for the transmit FIFO. When a 1 is written to this bit, the TX FIFO is emptied. */\r\n#define I2S_FIFOCFG_EMPTYTX(x)                   (((uint32_t)(((uint32_t)(x)) << I2S_FIFOCFG_EMPTYTX_SHIFT)) & I2S_FIFOCFG_EMPTYTX_MASK)\r\n\r\n#define I2S_FIFOCFG_EMPTYRX_MASK                 (0x20000U)\r\n#define I2S_FIFOCFG_EMPTYRX_SHIFT                (17U)\r\n/*! EMPTYRX - Empty command for the receive FIFO. When a 1 is written to this bit, the RX FIFO is emptied. */\r\n#define I2S_FIFOCFG_EMPTYRX(x)                   (((uint32_t)(((uint32_t)(x)) << I2S_FIFOCFG_EMPTYRX_SHIFT)) & I2S_FIFOCFG_EMPTYRX_MASK)\r\n\r\n#define I2S_FIFOCFG_POPDBG_MASK                  (0x40000U)\r\n#define I2S_FIFOCFG_POPDBG_SHIFT                 (18U)\r\n/*! POPDBG - Pop FIFO for Debug Reads\r\n *  0b0..Debug reads of the FIFO do not pop the FIFO.\r\n *  0b1..A debug read causes the FIFO to pop.\r\n */\r\n#define I2S_FIFOCFG_POPDBG(x)                    (((uint32_t)(((uint32_t)(x)) << I2S_FIFOCFG_POPDBG_SHIFT)) & I2S_FIFOCFG_POPDBG_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOSTAT - FIFO Status */\r\n/*! @{ */\r\n\r\n#define I2S_FIFOSTAT_TXERR_MASK                  (0x1U)\r\n#define I2S_FIFOSTAT_TXERR_SHIFT                 (0U)\r\n/*! TXERR - TX FIFO Error\r\n *  0b0..No transmit FIFO error occured\r\n *  0b1..Transmit FIFO error occured\r\n */\r\n#define I2S_FIFOSTAT_TXERR(x)                    (((uint32_t)(((uint32_t)(x)) << I2S_FIFOSTAT_TXERR_SHIFT)) & I2S_FIFOSTAT_TXERR_MASK)\r\n\r\n#define I2S_FIFOSTAT_RXERR_MASK                  (0x2U)\r\n#define I2S_FIFOSTAT_RXERR_SHIFT                 (1U)\r\n/*! RXERR - RX FIFO Error\r\n *  0b0..No receive FIFO error occured\r\n *  0b1..Receive FIFO error occured\r\n */\r\n#define I2S_FIFOSTAT_RXERR(x)                    (((uint32_t)(((uint32_t)(x)) << I2S_FIFOSTAT_RXERR_SHIFT)) & I2S_FIFOSTAT_RXERR_MASK)\r\n\r\n#define I2S_FIFOSTAT_PERINT_MASK                 (0x8U)\r\n#define I2S_FIFOSTAT_PERINT_SHIFT                (3U)\r\n/*! PERINT - Peripheral Interrupt\r\n *  0b0..No interrupt\r\n *  0b1..Interrupt\r\n */\r\n#define I2S_FIFOSTAT_PERINT(x)                   (((uint32_t)(((uint32_t)(x)) << I2S_FIFOSTAT_PERINT_SHIFT)) & I2S_FIFOSTAT_PERINT_MASK)\r\n\r\n#define I2S_FIFOSTAT_TXEMPTY_MASK                (0x10U)\r\n#define I2S_FIFOSTAT_TXEMPTY_SHIFT               (4U)\r\n/*! TXEMPTY - Transmit FIFO Empty\r\n *  0b0..Transmit FIFO is not empty\r\n *  0b1..Transmit FIFO is empty; however, the peripheral may still be processing the last piece of data.\r\n */\r\n#define I2S_FIFOSTAT_TXEMPTY(x)                  (((uint32_t)(((uint32_t)(x)) << I2S_FIFOSTAT_TXEMPTY_SHIFT)) & I2S_FIFOSTAT_TXEMPTY_MASK)\r\n\r\n#define I2S_FIFOSTAT_TXNOTFULL_MASK              (0x20U)\r\n#define I2S_FIFOSTAT_TXNOTFULL_SHIFT             (5U)\r\n/*! TXNOTFULL - Transmit FIFO Not Full\r\n *  0b0..Transmit FIFO is full, and another write would cause an overflow\r\n *  0b1..Transmit FIFO is not full, so more data can be written\r\n */\r\n#define I2S_FIFOSTAT_TXNOTFULL(x)                (((uint32_t)(((uint32_t)(x)) << I2S_FIFOSTAT_TXNOTFULL_SHIFT)) & I2S_FIFOSTAT_TXNOTFULL_MASK)\r\n\r\n#define I2S_FIFOSTAT_RXNOTEMPTY_MASK             (0x40U)\r\n#define I2S_FIFOSTAT_RXNOTEMPTY_SHIFT            (6U)\r\n/*! RXNOTEMPTY - Receive FIFO Not Empty\r\n *  0b0..Receive FIFO is empty\r\n *  0b1..Receive FIFO is not empty, so data can be read.\r\n */\r\n#define I2S_FIFOSTAT_RXNOTEMPTY(x)               (((uint32_t)(((uint32_t)(x)) << I2S_FIFOSTAT_RXNOTEMPTY_SHIFT)) & I2S_FIFOSTAT_RXNOTEMPTY_MASK)\r\n\r\n#define I2S_FIFOSTAT_RXFULL_MASK                 (0x80U)\r\n#define I2S_FIFOSTAT_RXFULL_SHIFT                (7U)\r\n/*! RXFULL - Receive FIFO Full\r\n *  0b0..Receive FIFO is not full\r\n *  0b1..Receive FIFO is full\r\n */\r\n#define I2S_FIFOSTAT_RXFULL(x)                   (((uint32_t)(((uint32_t)(x)) << I2S_FIFOSTAT_RXFULL_SHIFT)) & I2S_FIFOSTAT_RXFULL_MASK)\r\n\r\n#define I2S_FIFOSTAT_TXLVL_MASK                  (0x1F00U)\r\n#define I2S_FIFOSTAT_TXLVL_SHIFT                 (8U)\r\n/*! TXLVL - Transmit FIFO Current Level\r\n *  0b00000..TX FIFO is empty\r\n */\r\n#define I2S_FIFOSTAT_TXLVL(x)                    (((uint32_t)(((uint32_t)(x)) << I2S_FIFOSTAT_TXLVL_SHIFT)) & I2S_FIFOSTAT_TXLVL_MASK)\r\n\r\n#define I2S_FIFOSTAT_RXLVL_MASK                  (0x1F0000U)\r\n#define I2S_FIFOSTAT_RXLVL_SHIFT                 (16U)\r\n/*! RXLVL - Receive FIFO Current Level\r\n *  0b00000..RX FIFO is empty\r\n */\r\n#define I2S_FIFOSTAT_RXLVL(x)                    (((uint32_t)(((uint32_t)(x)) << I2S_FIFOSTAT_RXLVL_SHIFT)) & I2S_FIFOSTAT_RXLVL_MASK)\r\n\r\n#define I2S_FIFOSTAT_RXTIMEOUT_MASK              (0x1000000U)\r\n#define I2S_FIFOSTAT_RXTIMEOUT_SHIFT             (24U)\r\n/*! RXTIMEOUT - Receive FIFO Timeout\r\n *  0b0..RX FIFO on\r\n *  0b1..RX FIFO has timed out, based on the timeout configuration in the FIFORXTIMEOUTCFG register.\r\n */\r\n#define I2S_FIFOSTAT_RXTIMEOUT(x)                (((uint32_t)(((uint32_t)(x)) << I2S_FIFOSTAT_RXTIMEOUT_SHIFT)) & I2S_FIFOSTAT_RXTIMEOUT_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOTRIG - FIFO Trigger Settings */\r\n/*! @{ */\r\n\r\n#define I2S_FIFOTRIG_TXLVLENA_MASK               (0x1U)\r\n#define I2S_FIFOTRIG_TXLVLENA_SHIFT              (0U)\r\n/*! TXLVLENA - Transmit FIFO Level Trigger Enable\r\n *  0b0..Transmit FIFO level does not generate a FIFO level trigger.\r\n *  0b1..An trigger generates if the transmit FIFO level reaches the value specified by the TXLVL field in this register.\r\n */\r\n#define I2S_FIFOTRIG_TXLVLENA(x)                 (((uint32_t)(((uint32_t)(x)) << I2S_FIFOTRIG_TXLVLENA_SHIFT)) & I2S_FIFOTRIG_TXLVLENA_MASK)\r\n\r\n#define I2S_FIFOTRIG_RXLVLENA_MASK               (0x2U)\r\n#define I2S_FIFOTRIG_RXLVLENA_SHIFT              (1U)\r\n/*! RXLVLENA - Receive FIFO Level Trigger Enable\r\n *  0b0..Receive FIFO level does not generate a FIFO level trigger.\r\n *  0b1..An trigger generates if the receive FIFO level reaches the value specified by the RXLVL.\r\n */\r\n#define I2S_FIFOTRIG_RXLVLENA(x)                 (((uint32_t)(((uint32_t)(x)) << I2S_FIFOTRIG_RXLVLENA_SHIFT)) & I2S_FIFOTRIG_RXLVLENA_MASK)\r\n\r\n#define I2S_FIFOTRIG_TXLVL_MASK                  (0xF00U)\r\n#define I2S_FIFOTRIG_TXLVL_SHIFT                 (8U)\r\n/*! TXLVL - Transmit FIFO Level Trigger Point\r\n *  0b0000..Trigger when the TX FIFO becomes empty.\r\n *  0b0001..Trigger when the TX FIFO level decreases to one entry.\r\n *  0b1111..Trigger when the TX FIFO level decreases to 15 entries (is no longer full).\r\n */\r\n#define I2S_FIFOTRIG_TXLVL(x)                    (((uint32_t)(((uint32_t)(x)) << I2S_FIFOTRIG_TXLVL_SHIFT)) & I2S_FIFOTRIG_TXLVL_MASK)\r\n\r\n#define I2S_FIFOTRIG_RXLVL_MASK                  (0xF0000U)\r\n#define I2S_FIFOTRIG_RXLVL_SHIFT                 (16U)\r\n/*! RXLVL - Receive FIFO Level Trigger Point\r\n *  0b0000..Trigger when the RX FIFO has received 1 entry (the FIFO is no longer empty).\r\n *  0b0001..Trigger when the RX FIFO has received 2 entries.\r\n *  0b1111..Trigger when the RX FIFO has received 16 entries (the FIFO has become full).\r\n */\r\n#define I2S_FIFOTRIG_RXLVL(x)                    (((uint32_t)(((uint32_t)(x)) << I2S_FIFOTRIG_RXLVL_SHIFT)) & I2S_FIFOTRIG_RXLVL_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOINTENSET - FIFO Interrupt Enable Set and Read */\r\n/*! @{ */\r\n\r\n#define I2S_FIFOINTENSET_TXERR_MASK              (0x1U)\r\n#define I2S_FIFOINTENSET_TXERR_SHIFT             (0U)\r\n/*! TXERR - Transmit Error Interrupt\r\n *  0b0..Disabled. No interrupt generates for a transmit error.\r\n *  0b1..Enabled. An interrupt generates when a transmit error occurs.\r\n */\r\n#define I2S_FIFOINTENSET_TXERR(x)                (((uint32_t)(((uint32_t)(x)) << I2S_FIFOINTENSET_TXERR_SHIFT)) & I2S_FIFOINTENSET_TXERR_MASK)\r\n\r\n#define I2S_FIFOINTENSET_RXERR_MASK              (0x2U)\r\n#define I2S_FIFOINTENSET_RXERR_SHIFT             (1U)\r\n/*! RXERR - Receive Error Interrupt\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define I2S_FIFOINTENSET_RXERR(x)                (((uint32_t)(((uint32_t)(x)) << I2S_FIFOINTENSET_RXERR_SHIFT)) & I2S_FIFOINTENSET_RXERR_MASK)\r\n\r\n#define I2S_FIFOINTENSET_TXLVL_MASK              (0x4U)\r\n#define I2S_FIFOINTENSET_TXLVL_SHIFT             (2U)\r\n/*! TXLVL - Transmit Level Interrupt\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define I2S_FIFOINTENSET_TXLVL(x)                (((uint32_t)(((uint32_t)(x)) << I2S_FIFOINTENSET_TXLVL_SHIFT)) & I2S_FIFOINTENSET_TXLVL_MASK)\r\n\r\n#define I2S_FIFOINTENSET_RXLVL_MASK              (0x8U)\r\n#define I2S_FIFOINTENSET_RXLVL_SHIFT             (3U)\r\n/*! RXLVL - Receive Level Interrupt\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define I2S_FIFOINTENSET_RXLVL(x)                (((uint32_t)(((uint32_t)(x)) << I2S_FIFOINTENSET_RXLVL_SHIFT)) & I2S_FIFOINTENSET_RXLVL_MASK)\r\n\r\n#define I2S_FIFOINTENSET_RXTIMEOUT_MASK          (0x1000000U)\r\n#define I2S_FIFOINTENSET_RXTIMEOUT_SHIFT         (24U)\r\n/*! RXTIMEOUT - Receive Timeout\r\n *  0b0..No RX interrupt will be generated.\r\n *  0b1..Asserts RX interrupt if RX FIFO Timeout event occurs.\r\n */\r\n#define I2S_FIFOINTENSET_RXTIMEOUT(x)            (((uint32_t)(((uint32_t)(x)) << I2S_FIFOINTENSET_RXTIMEOUT_SHIFT)) & I2S_FIFOINTENSET_RXTIMEOUT_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOINTENCLR - FIFO Interrupt Enable Clear and Read */\r\n/*! @{ */\r\n\r\n#define I2S_FIFOINTENCLR_TXERR_MASK              (0x1U)\r\n#define I2S_FIFOINTENCLR_TXERR_SHIFT             (0U)\r\n/*! TXERR - Transmit Error Interrupt Clear\r\n *  0b0..Interrupt is not cleared.\r\n *  0b1..Interrupt is cleared.\r\n */\r\n#define I2S_FIFOINTENCLR_TXERR(x)                (((uint32_t)(((uint32_t)(x)) << I2S_FIFOINTENCLR_TXERR_SHIFT)) & I2S_FIFOINTENCLR_TXERR_MASK)\r\n\r\n#define I2S_FIFOINTENCLR_RXERR_MASK              (0x2U)\r\n#define I2S_FIFOINTENCLR_RXERR_SHIFT             (1U)\r\n/*! RXERR - Receive Error Interrupt Clear\r\n *  0b0..Interrupt is not cleared.\r\n *  0b1..Interrupt is cleared.\r\n */\r\n#define I2S_FIFOINTENCLR_RXERR(x)                (((uint32_t)(((uint32_t)(x)) << I2S_FIFOINTENCLR_RXERR_SHIFT)) & I2S_FIFOINTENCLR_RXERR_MASK)\r\n\r\n#define I2S_FIFOINTENCLR_TXLVL_MASK              (0x4U)\r\n#define I2S_FIFOINTENCLR_TXLVL_SHIFT             (2U)\r\n/*! TXLVL - Transmit Level Interrupt Clear\r\n *  0b0..Interrupt is not cleared.\r\n *  0b1..Interrupt is cleared.\r\n */\r\n#define I2S_FIFOINTENCLR_TXLVL(x)                (((uint32_t)(((uint32_t)(x)) << I2S_FIFOINTENCLR_TXLVL_SHIFT)) & I2S_FIFOINTENCLR_TXLVL_MASK)\r\n\r\n#define I2S_FIFOINTENCLR_RXLVL_MASK              (0x8U)\r\n#define I2S_FIFOINTENCLR_RXLVL_SHIFT             (3U)\r\n/*! RXLVL - Receive Level Interrupt Clear\r\n *  0b0..Interrupt is not cleared.\r\n *  0b1..Interrupt is cleared.\r\n */\r\n#define I2S_FIFOINTENCLR_RXLVL(x)                (((uint32_t)(((uint32_t)(x)) << I2S_FIFOINTENCLR_RXLVL_SHIFT)) & I2S_FIFOINTENCLR_RXLVL_MASK)\r\n\r\n#define I2S_FIFOINTENCLR_RXTIMEOUT_MASK          (0x1000000U)\r\n#define I2S_FIFOINTENCLR_RXTIMEOUT_SHIFT         (24U)\r\n/*! RXTIMEOUT - Receive Timeout\r\n *  0b0..No effect\r\n *  0b1..Clear the interrupt\r\n */\r\n#define I2S_FIFOINTENCLR_RXTIMEOUT(x)            (((uint32_t)(((uint32_t)(x)) << I2S_FIFOINTENCLR_RXTIMEOUT_SHIFT)) & I2S_FIFOINTENCLR_RXTIMEOUT_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOINTSTAT - FIFO Interrupt Status */\r\n/*! @{ */\r\n\r\n#define I2S_FIFOINTSTAT_TXERR_MASK               (0x1U)\r\n#define I2S_FIFOINTSTAT_TXERR_SHIFT              (0U)\r\n/*! TXERR - TX FIFO Error Interrupt Status\r\n *  0b0..Not pending\r\n *  0b1..Pending\r\n */\r\n#define I2S_FIFOINTSTAT_TXERR(x)                 (((uint32_t)(((uint32_t)(x)) << I2S_FIFOINTSTAT_TXERR_SHIFT)) & I2S_FIFOINTSTAT_TXERR_MASK)\r\n\r\n#define I2S_FIFOINTSTAT_RXERR_MASK               (0x2U)\r\n#define I2S_FIFOINTSTAT_RXERR_SHIFT              (1U)\r\n/*! RXERR - RX FIFO Error Interrupt Status\r\n *  0b0..Not pending\r\n *  0b1..Pending\r\n */\r\n#define I2S_FIFOINTSTAT_RXERR(x)                 (((uint32_t)(((uint32_t)(x)) << I2S_FIFOINTSTAT_RXERR_SHIFT)) & I2S_FIFOINTSTAT_RXERR_MASK)\r\n\r\n#define I2S_FIFOINTSTAT_TXLVL_MASK               (0x4U)\r\n#define I2S_FIFOINTSTAT_TXLVL_SHIFT              (2U)\r\n/*! TXLVL - Transmit FIFO Level Interrupt Status\r\n *  0b0..Not pending\r\n *  0b1..Pending\r\n */\r\n#define I2S_FIFOINTSTAT_TXLVL(x)                 (((uint32_t)(((uint32_t)(x)) << I2S_FIFOINTSTAT_TXLVL_SHIFT)) & I2S_FIFOINTSTAT_TXLVL_MASK)\r\n\r\n#define I2S_FIFOINTSTAT_RXLVL_MASK               (0x8U)\r\n#define I2S_FIFOINTSTAT_RXLVL_SHIFT              (3U)\r\n/*! RXLVL - Receive FIFO Level Interrupt Status\r\n *  0b0..Not pending\r\n *  0b1..Pending\r\n */\r\n#define I2S_FIFOINTSTAT_RXLVL(x)                 (((uint32_t)(((uint32_t)(x)) << I2S_FIFOINTSTAT_RXLVL_SHIFT)) & I2S_FIFOINTSTAT_RXLVL_MASK)\r\n\r\n#define I2S_FIFOINTSTAT_PERINT_MASK              (0x10U)\r\n#define I2S_FIFOINTSTAT_PERINT_SHIFT             (4U)\r\n/*! PERINT - Peripheral Interrupt Status\r\n *  0b0..Not pending\r\n *  0b1..Pending\r\n */\r\n#define I2S_FIFOINTSTAT_PERINT(x)                (((uint32_t)(((uint32_t)(x)) << I2S_FIFOINTSTAT_PERINT_SHIFT)) & I2S_FIFOINTSTAT_PERINT_MASK)\r\n\r\n#define I2S_FIFOINTSTAT_RXTIMEOUT_MASK           (0x1000000U)\r\n#define I2S_FIFOINTSTAT_RXTIMEOUT_SHIFT          (24U)\r\n/*! RXTIMEOUT - Receive Timeout Status\r\n *  0b0..Not pending\r\n *  0b1..Pending\r\n */\r\n#define I2S_FIFOINTSTAT_RXTIMEOUT(x)             (((uint32_t)(((uint32_t)(x)) << I2S_FIFOINTSTAT_RXTIMEOUT_SHIFT)) & I2S_FIFOINTSTAT_RXTIMEOUT_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOWR - FIFO Write Data */\r\n/*! @{ */\r\n\r\n#define I2S_FIFOWR_TXDATA_MASK                   (0xFFFFFFFFU)\r\n#define I2S_FIFOWR_TXDATA_SHIFT                  (0U)\r\n/*! TXDATA - Transmit Data to the FIFO */\r\n#define I2S_FIFOWR_TXDATA(x)                     (((uint32_t)(((uint32_t)(x)) << I2S_FIFOWR_TXDATA_SHIFT)) & I2S_FIFOWR_TXDATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOWR48H - FIFO Write Data for Upper Data Bits */\r\n/*! @{ */\r\n\r\n#define I2S_FIFOWR48H_TXDATA_MASK                (0xFFFFFFU)\r\n#define I2S_FIFOWR48H_TXDATA_SHIFT               (0U)\r\n/*! TXDATA - Transmit Data to the FIFO */\r\n#define I2S_FIFOWR48H_TXDATA(x)                  (((uint32_t)(((uint32_t)(x)) << I2S_FIFOWR48H_TXDATA_SHIFT)) & I2S_FIFOWR48H_TXDATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFORD - FIFO Read Data */\r\n/*! @{ */\r\n\r\n#define I2S_FIFORD_RXDATA_MASK                   (0xFFFFFFFFU)\r\n#define I2S_FIFORD_RXDATA_SHIFT                  (0U)\r\n/*! RXDATA - Received Data from the FIFO */\r\n#define I2S_FIFORD_RXDATA(x)                     (((uint32_t)(((uint32_t)(x)) << I2S_FIFORD_RXDATA_SHIFT)) & I2S_FIFORD_RXDATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFORD48H - FIFO Read Data for Upper Data Bits */\r\n/*! @{ */\r\n\r\n#define I2S_FIFORD48H_RXDATA_MASK                (0xFFFFFFU)\r\n#define I2S_FIFORD48H_RXDATA_SHIFT               (0U)\r\n/*! RXDATA - Received Data from the FIFO */\r\n#define I2S_FIFORD48H_RXDATA(x)                  (((uint32_t)(((uint32_t)(x)) << I2S_FIFORD48H_RXDATA_SHIFT)) & I2S_FIFORD48H_RXDATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFORDNOPOP - FIFO Data Read with No FIFO Pop */\r\n/*! @{ */\r\n\r\n#define I2S_FIFORDNOPOP_RXDATA_MASK              (0xFFFFFFFFU)\r\n#define I2S_FIFORDNOPOP_RXDATA_SHIFT             (0U)\r\n/*! RXDATA - Received Data from the FIFO */\r\n#define I2S_FIFORDNOPOP_RXDATA(x)                (((uint32_t)(((uint32_t)(x)) << I2S_FIFORDNOPOP_RXDATA_SHIFT)) & I2S_FIFORDNOPOP_RXDATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFORD48HNOPOP - FIFO Data Read for Upper Data Bits with No FIFO Pop */\r\n/*! @{ */\r\n\r\n#define I2S_FIFORD48HNOPOP_RXDATA_MASK           (0xFFFFFFU)\r\n#define I2S_FIFORD48HNOPOP_RXDATA_SHIFT          (0U)\r\n/*! RXDATA - Received Data from the FIFO */\r\n#define I2S_FIFORD48HNOPOP_RXDATA(x)             (((uint32_t)(((uint32_t)(x)) << I2S_FIFORD48HNOPOP_RXDATA_SHIFT)) & I2S_FIFORD48HNOPOP_RXDATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOSIZE - FIFO Size Register */\r\n/*! @{ */\r\n\r\n#define I2S_FIFOSIZE_FIFOSIZE_MASK               (0x1FU)\r\n#define I2S_FIFOSIZE_FIFOSIZE_SHIFT              (0U)\r\n#define I2S_FIFOSIZE_FIFOSIZE(x)                 (((uint32_t)(((uint32_t)(x)) << I2S_FIFOSIZE_FIFOSIZE_SHIFT)) & I2S_FIFOSIZE_FIFOSIZE_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFORXTIMEOUTCFG - FIFO Receive Timeout Configuration */\r\n/*! @{ */\r\n\r\n#define I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_PRESCALER_MASK (0xFFU)\r\n#define I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_PRESCALER_SHIFT (0U)\r\n/*! RXTIMEOUT_PRESCALER - Receive Timeout Counter Clock Prescaler */\r\n#define I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_PRESCALER(x) (((uint32_t)(((uint32_t)(x)) << I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_PRESCALER_SHIFT)) & I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_PRESCALER_MASK)\r\n\r\n#define I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_VALUE_MASK (0xFFFF00U)\r\n#define I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_VALUE_SHIFT (8U)\r\n/*! RXTIMEOUT_VALUE - Receive Timeout Value */\r\n#define I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_VALUE(x)  (((uint32_t)(((uint32_t)(x)) << I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_VALUE_SHIFT)) & I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_VALUE_MASK)\r\n\r\n#define I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_EN_MASK   (0x1000000U)\r\n#define I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_EN_SHIFT  (24U)\r\n/*! RXTIMEOUT_EN - Receive Timeout Enable\r\n *  0b0..Disable RX FIFO timeout\r\n *  0b1..Enable RX FIFO timeout\r\n */\r\n#define I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_EN(x)     (((uint32_t)(((uint32_t)(x)) << I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_EN_SHIFT)) & I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_EN_MASK)\r\n\r\n#define I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_COW_MASK  (0x2000000U)\r\n#define I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_COW_SHIFT (25U)\r\n/*! RXTIMEOUT_COW - Receive Timeout Continue On Write\r\n *  0b0..RX FIFO timeout counter is reset every time data is transferred from the peripheral into the RX FIFO.\r\n *  0b1..RX FIFO timeout counter is not reset every time data is transferred from the peripheral into the RX FIFO.\r\n */\r\n#define I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_COW(x)    (((uint32_t)(((uint32_t)(x)) << I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_COW_SHIFT)) & I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_COW_MASK)\r\n\r\n#define I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_COE_MASK  (0x4000000U)\r\n#define I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_COE_SHIFT (26U)\r\n/*! RXTIMEOUT_COE - Receive Timeout Continue On Empty\r\n *  0b0..RX FIFO timeout counter is reset when the RX FIFO becomes empty.\r\n *  0b1..RX FIFO timeout counter is not reset when the RX FIFO becomes empty.\r\n */\r\n#define I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_COE(x)    (((uint32_t)(((uint32_t)(x)) << I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_COE_SHIFT)) & I2S_FIFORXTIMEOUTCFG_RXTIMEOUT_COE_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFORXTIMEOUTCNT - FIFO Receive Timeout Counter */\r\n/*! @{ */\r\n\r\n#define I2S_FIFORXTIMEOUTCNT_RXTIMEOUT_CNT_MASK  (0xFFFFU)\r\n#define I2S_FIFORXTIMEOUTCNT_RXTIMEOUT_CNT_SHIFT (0U)\r\n/*! RXTIMEOUT_CNT - Current RX FIFO timeout counter value */\r\n#define I2S_FIFORXTIMEOUTCNT_RXTIMEOUT_CNT(x)    (((uint32_t)(((uint32_t)(x)) << I2S_FIFORXTIMEOUTCNT_RXTIMEOUT_CNT_SHIFT)) & I2S_FIFORXTIMEOUTCNT_RXTIMEOUT_CNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ID - I2S Module Identification */\r\n/*! @{ */\r\n\r\n#define I2S_ID_APERTURE_MASK                     (0xFFU)\r\n#define I2S_ID_APERTURE_SHIFT                    (0U)\r\n/*! APERTURE - Aperture */\r\n#define I2S_ID_APERTURE(x)                       (((uint32_t)(((uint32_t)(x)) << I2S_ID_APERTURE_SHIFT)) & I2S_ID_APERTURE_MASK)\r\n\r\n#define I2S_ID_MINOR_REV_MASK                    (0xF00U)\r\n#define I2S_ID_MINOR_REV_SHIFT                   (8U)\r\n/*! MINOR_REV - Minor Revision */\r\n#define I2S_ID_MINOR_REV(x)                      (((uint32_t)(((uint32_t)(x)) << I2S_ID_MINOR_REV_SHIFT)) & I2S_ID_MINOR_REV_MASK)\r\n\r\n#define I2S_ID_MAJOR_REV_MASK                    (0xF000U)\r\n#define I2S_ID_MAJOR_REV_SHIFT                   (12U)\r\n/*! MAJOR_REV - Major Revision */\r\n#define I2S_ID_MAJOR_REV(x)                      (((uint32_t)(((uint32_t)(x)) << I2S_ID_MAJOR_REV_SHIFT)) & I2S_ID_MAJOR_REV_MASK)\r\n\r\n#define I2S_ID_ID_MASK                           (0xFFFF0000U)\r\n#define I2S_ID_ID_SHIFT                          (16U)\r\n/*! ID - Module Identifier */\r\n#define I2S_ID_ID(x)                             (((uint32_t)(((uint32_t)(x)) << I2S_ID_ID_SHIFT)) & I2S_ID_ID_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group I2S_Register_Masks */\r\n\r\n\r\n/* I2S - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral I2S0 base address */\r\n  #define I2S0_BASE                                (0x50106000u)\r\n  /** Peripheral I2S0 base address */\r\n  #define I2S0_BASE_NS                             (0x40106000u)\r\n  /** Peripheral I2S0 base pointer */\r\n  #define I2S0                                     ((I2S_Type *)I2S0_BASE)\r\n  /** Peripheral I2S0 base pointer */\r\n  #define I2S0_NS                                  ((I2S_Type *)I2S0_BASE_NS)\r\n  /** Peripheral I2S1 base address */\r\n  #define I2S1_BASE                                (0x50107000u)\r\n  /** Peripheral I2S1 base address */\r\n  #define I2S1_BASE_NS                             (0x40107000u)\r\n  /** Peripheral I2S1 base pointer */\r\n  #define I2S1                                     ((I2S_Type *)I2S1_BASE)\r\n  /** Peripheral I2S1 base pointer */\r\n  #define I2S1_NS                                  ((I2S_Type *)I2S1_BASE_NS)\r\n  /** Peripheral I2S2 base address */\r\n  #define I2S2_BASE                                (0x50108000u)\r\n  /** Peripheral I2S2 base address */\r\n  #define I2S2_BASE_NS                             (0x40108000u)\r\n  /** Peripheral I2S2 base pointer */\r\n  #define I2S2                                     ((I2S_Type *)I2S2_BASE)\r\n  /** Peripheral I2S2 base pointer */\r\n  #define I2S2_NS                                  ((I2S_Type *)I2S2_BASE_NS)\r\n  /** Peripheral I2S3 base address */\r\n  #define I2S3_BASE                                (0x50109000u)\r\n  /** Peripheral I2S3 base address */\r\n  #define I2S3_BASE_NS                             (0x40109000u)\r\n  /** Peripheral I2S3 base pointer */\r\n  #define I2S3                                     ((I2S_Type *)I2S3_BASE)\r\n  /** Peripheral I2S3 base pointer */\r\n  #define I2S3_NS                                  ((I2S_Type *)I2S3_BASE_NS)\r\n  /** Peripheral I2S14 base address */\r\n  #define I2S14_BASE                               (0x50126000u)\r\n  /** Peripheral I2S14 base address */\r\n  #define I2S14_BASE_NS                            (0x40126000u)\r\n  /** Peripheral I2S14 base pointer */\r\n  #define I2S14                                    ((I2S_Type *)I2S14_BASE)\r\n  /** Peripheral I2S14 base pointer */\r\n  #define I2S14_NS                                 ((I2S_Type *)I2S14_BASE_NS)\r\n  /** Array initializer of I2S peripheral base addresses */\r\n  #define I2S_BASE_ADDRS                           { I2S0_BASE, I2S1_BASE, I2S2_BASE, I2S3_BASE, I2S14_BASE }\r\n  /** Array initializer of I2S peripheral base pointers */\r\n  #define I2S_BASE_PTRS                            { I2S0, I2S1, I2S2, I2S3, I2S14 }\r\n  /** Array initializer of I2S peripheral base addresses */\r\n  #define I2S_BASE_ADDRS_NS                        { I2S0_BASE_NS, I2S1_BASE_NS, I2S2_BASE_NS, I2S3_BASE_NS, I2S14_BASE_NS }\r\n  /** Array initializer of I2S peripheral base pointers */\r\n  #define I2S_BASE_PTRS_NS                         { I2S0_NS, I2S1_NS, I2S2_NS, I2S3_NS, I2S14_NS }\r\n#else\r\n  /** Peripheral I2S0 base address */\r\n  #define I2S0_BASE                                (0x40106000u)\r\n  /** Peripheral I2S0 base pointer */\r\n  #define I2S0                                     ((I2S_Type *)I2S0_BASE)\r\n  /** Peripheral I2S1 base address */\r\n  #define I2S1_BASE                                (0x40107000u)\r\n  /** Peripheral I2S1 base pointer */\r\n  #define I2S1                                     ((I2S_Type *)I2S1_BASE)\r\n  /** Peripheral I2S2 base address */\r\n  #define I2S2_BASE                                (0x40108000u)\r\n  /** Peripheral I2S2 base pointer */\r\n  #define I2S2                                     ((I2S_Type *)I2S2_BASE)\r\n  /** Peripheral I2S3 base address */\r\n  #define I2S3_BASE                                (0x40109000u)\r\n  /** Peripheral I2S3 base pointer */\r\n  #define I2S3                                     ((I2S_Type *)I2S3_BASE)\r\n  /** Peripheral I2S14 base address */\r\n  #define I2S14_BASE                               (0x40126000u)\r\n  /** Peripheral I2S14 base pointer */\r\n  #define I2S14                                    ((I2S_Type *)I2S14_BASE)\r\n  /** Array initializer of I2S peripheral base addresses */\r\n  #define I2S_BASE_ADDRS                           { I2S0_BASE, I2S1_BASE, I2S2_BASE, I2S3_BASE, I2S14_BASE }\r\n  /** Array initializer of I2S peripheral base pointers */\r\n  #define I2S_BASE_PTRS                            { I2S0, I2S1, I2S2, I2S3, I2S14 }\r\n#endif\r\n/** Interrupt vectors for the I2S peripheral type */\r\n#define I2S_IRQS                                 { FLEXCOMM0_IRQn, FLEXCOMM1_IRQn, FLEXCOMM2_IRQn, FLEXCOMM3_IRQn, FLEXCOMM14_IRQn }\r\n\r\n/*!\r\n * @}\r\n */ /* end of group I2S_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- INPUTMUX Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup INPUTMUX_Peripheral_Access_Layer INPUTMUX Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** INPUTMUX - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t SCT0_IN_SEL[7];                    /**< SCT Peripheral Input Multiplexers N, array offset: 0x0, array step: 0x4 */\r\n       uint8_t RESERVED_0[228];\r\n  __IO uint32_t PINT_SEL[8];                       /**< GPIO Pin Input Multiplexer N, array offset: 0x100, array step: 0x4 */\r\n       uint8_t RESERVED_1[224];\r\n  __IO uint32_t DMAC0_ITRIG_SEL[33];               /**< DMAC0 Input Trigger Multiplexers N, array offset: 0x200, array step: 0x4 */\r\n       uint8_t RESERVED_2[124];\r\n  __IO uint32_t DMAC0_OTRIG_SEL[4];                /**< DMAC0 Output Trigger Multiplexers N, array offset: 0x300, array step: 0x4 */\r\n       uint8_t RESERVED_3[240];\r\n  __IO uint32_t DMAC1_ITRIG_SEL[33];               /**< DMAC1 Input Trigger Multiplexers N, array offset: 0x400, array step: 0x4 */\r\n       uint8_t RESERVED_4[124];\r\n  __IO uint32_t DMAC1_OTRIG_SEL[4];                /**< DMAC1 Output Trigger Multiplexers N, array offset: 0x500, array step: 0x4 */\r\n       uint8_t RESERVED_5[240];\r\n  __IO uint32_t CT32BIT_CAP_SEL[4][4];             /**< CT32BIT N Counter Timer Capture Trigger Multiplexers M, array offset: 0x600, array step: index*0x10, index2*0x4 */\r\n       uint8_t RESERVED_6[192];\r\n  __IO uint32_t FMEASURE_CH_SEL[2];                /**< Frequency Measurement Input Channel Multiplexers, array offset: 0x700, array step: 0x4 */\r\n       uint8_t RESERVED_7[56];\r\n  __IO uint32_t DMAC0_REQ_ENA0;                    /**< DMAC0 request enable 0, offset: 0x740 */\r\n       uint8_t RESERVED_8[4];\r\n  __O  uint32_t DMAC0_REQ_ENA0_SET;                /**< DMAC0 request enable set 0, offset: 0x748 */\r\n       uint8_t RESERVED_9[4];\r\n  __O  uint32_t DMAC0_REQ_ENA0_CLR;                /**< DMAC0 request enable clear 0, offset: 0x750 */\r\n       uint8_t RESERVED_10[12];\r\n  __IO uint32_t DMAC1_REQ_ENA0;                    /**< DMAC1 request enable 0, offset: 0x760 */\r\n       uint8_t RESERVED_11[4];\r\n  __O  uint32_t DMAC1_REQ_ENA0_SET;                /**< DMAC1 request enable set 0, offset: 0x768 */\r\n       uint8_t RESERVED_12[4];\r\n  __O  uint32_t DMAC1_REQ_ENA0_CLR;                /**< DMAC1 request enable clear 0, offset: 0x770 */\r\n       uint8_t RESERVED_13[12];\r\n  __IO uint32_t DMAC0_ITRIG_ENA0;                  /**< DMAC0 input trigger enable 0, offset: 0x780 */\r\n  __IO uint32_t DMAC0_ITRIG_ENA1;                  /**< DMAC0 input trigger enable 1, offset: 0x784 */\r\n  __O  uint32_t DMAC0_ITRIG_ENA0_SET;              /**< DMAC0 input trigger enable set 0, offset: 0x788 */\r\n  __O  uint32_t DMAC0_ITRIG_ENA1_SET;              /**< DMAC0 input trigger enable set 1, offset: 0x78C */\r\n  __O  uint32_t DMAC0_ITRIG_ENA0_CLR;              /**< DMAC0 input trigger enable clear 0, offset: 0x790 */\r\n  __O  uint32_t DMAC0_ITRIG_ENA1_CLR;              /**< DMAC0 input trigger enable clear 1, offset: 0x794 */\r\n       uint8_t RESERVED_14[8];\r\n  __IO uint32_t DMAC1_ITRIG_ENA0;                  /**< DMAC1 input trigger enable 0, offset: 0x7A0 */\r\n  __IO uint32_t DMAC1_ITRIG_ENA1;                  /**< DMAC1 input trigger enable 1, offset: 0x7A4 */\r\n  __O  uint32_t DMAC1_ITRIG_ENA0_SET;              /**< DMAC1 input trigger enable set 0, offset: 0x7A8 */\r\n  __O  uint32_t DMAC1_ITRIG_ENA1_SET;              /**< DMAC1 input trigger enable set 1, offset: 0x7AC */\r\n  __O  uint32_t DMAC1_ITRIG_ENA0_CLR;              /**< DMAC1 input trigger enable clear 0, offset: 0x7B0 */\r\n  __O  uint32_t DMAC1_ITRIG_ENA1_CLR;              /**< DMAC1 input trigger enable clear 1, offset: 0x7B4 */\r\n} INPUTMUX_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- INPUTMUX Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup INPUTMUX_Register_Masks INPUTMUX Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name SCT0_IN_SEL - SCT Peripheral Input Multiplexers N */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_SCT0_IN_SEL_SCT_IN_SEL_MASK     (0x1FU)\r\n#define INPUTMUX_SCT0_IN_SEL_SCT_IN_SEL_SHIFT    (0U)\r\n/*! SCT_IN_SEL - SCT0 Input(n) Selection. 24:1 Selection for each. . .\r\n *  0b00000..SCT0_PIN_INP0\r\n *  0b00001..SCT0_PIN_INP1\r\n *  0b00010..SCT0_PIN_INP2\r\n *  0b00011..SCT0_PIN_INP3\r\n *  0b00100..SCT0_PIN_INP4\r\n *  0b00101..SCT0_PIN_INP5\r\n *  0b00110..SCT0_PIN_INP6\r\n *  0b00111..SCT0_PIN_INP7\r\n *  0b01000..CT32BIT0_MAT0\r\n *  0b01001..CT32BIT1_MAT0\r\n *  0b01010..CT32BIT2_MAT0\r\n *  0b01011..CT32BIT3_MAT0\r\n *  0b01100..RESERVED\r\n *  0b01101..RESERVED\r\n *  0b01110..GPIOINT_BMATCH\r\n *  0b01111..NOT_CONNECTED\r\n *  0b10000..NOT_CONNECTED\r\n *  0b10001..SHARED I2S0_SCLK\r\n *  0b10010..SHARED I2S1_SCLK\r\n *  0b10011..SHARED I2S0_WS\r\n *  0b10100..SHARED I2S1_WS\r\n *  0b10101..MCLK\r\n *  0b10110..ARM_TXEV\r\n *  0b10111..DEBUG_HALTED\r\n *  0b11000..RESERVED\r\n *  0b11001..RESERVED\r\n *  0b11010..RESERVED\r\n *  0b11011..RESERVED\r\n *  0b11100..RESERVED\r\n *  0b11101..RESERVED\r\n *  0b11110..RESERVED\r\n *  0b11111..RESERVED\r\n */\r\n#define INPUTMUX_SCT0_IN_SEL_SCT_IN_SEL(x)       (((uint32_t)(((uint32_t)(x)) << INPUTMUX_SCT0_IN_SEL_SCT_IN_SEL_SHIFT)) & INPUTMUX_SCT0_IN_SEL_SCT_IN_SEL_MASK)\r\n/*! @} */\r\n\r\n/* The count of INPUTMUX_SCT0_IN_SEL */\r\n#define INPUTMUX_SCT0_IN_SEL_COUNT               (7U)\r\n\r\n/*! @name PINT_SEL - GPIO Pin Input Multiplexer N */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_PINT_SEL_PINT_SEL_MASK          (0xFFU)\r\n#define INPUTMUX_PINT_SEL_PINT_SEL_SHIFT         (0U)\r\n/*! PINT_SEL - Port Input (PIOx.y) 64 to 8 Mux Select. . . Pin number select for pin interrupt or\r\n *    pattern match engine input. (For PIOx_y: INTPIN = (x * 32) + y. PIO0_0 to PIO1_31 correspond to\r\n *    numbers 0 to 63.\r\n */\r\n#define INPUTMUX_PINT_SEL_PINT_SEL(x)            (((uint32_t)(((uint32_t)(x)) << INPUTMUX_PINT_SEL_PINT_SEL_SHIFT)) & INPUTMUX_PINT_SEL_PINT_SEL_MASK)\r\n/*! @} */\r\n\r\n/* The count of INPUTMUX_PINT_SEL */\r\n#define INPUTMUX_PINT_SEL_COUNT                  (8U)\r\n\r\n/*! @name DMAC0_ITRIG_SEL - DMAC0 Input Trigger Multiplexers N */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_SEL_DMA0_ITRIG_SEL_MASK (0x3FU)\r\n#define INPUTMUX_DMAC0_ITRIG_SEL_DMA0_ITRIG_SEL_SHIFT (0U)\r\n/*! DMA0_ITRIG_SEL - DMA Input Triggers(n) Selection. 22:1 Selection for each. . .\r\n *  0b000000..NSGPIOPINT0_INT0\r\n *  0b000001..NSGPIOPINT0_INT1\r\n *  0b000010..NSGPIOPINT0_INT2\r\n *  0b000011..NSGPIOPINT0_INT3\r\n *  0b000100..CT32BIT0_DMAREQ_M0\r\n *  0b000101..CT32BIT0_DMAREQ_M1\r\n *  0b000110..CT32BIT1_DMAREQ_M0\r\n *  0b000111..CT32BIT1_DMAREQ_M1\r\n *  0b001000..CT32BIT2_DMAREQ_M0\r\n *  0b001001..CT32BIT2_DMAREQ_M1\r\n *  0b001010..CT32BIT3_DMAREQ_M0\r\n *  0b001011..CT32BIT3_DMAREQ_M1\r\n *  0b001100..RESERVED\r\n *  0b001101..RESERVED\r\n *  0b001110..DMAC0_TRIGOUT_A\r\n *  0b001111..DMAC0_TRIGOUT_B\r\n *  0b010000..DMAC0_TRIGOUT_C\r\n *  0b010001..DMAC0_TRIGOUT_D\r\n *  0b010010..SCT0_DMA0\r\n *  0b010011..SCT0_DMA1\r\n *  0b010100..ENET_MAC0_DMA_REQ0\r\n *  0b010101..ENET_MAC0_DMA_REQ1\r\n *  0b010110..USIM_DMA_RX_SINGLE\r\n *  0b010111..USIM_DMA_TX_SINGLE\r\n *  0b011000..GAU_GPADC0_DMA_SINGLE\r\n *  0b011001..GAU_GPADC1_DMA_SINGLE\r\n *  0b011010..GAU_GPADCA_DMA_REQ\r\n *  0b011011..GAU_GPADCB_DMA_REQ\r\n *  0b011100..FLEXSPI_RX\r\n *  0b011101..FLEXSPI_TX\r\n *  0b011110..RESERVED\r\n *  0b011111..RESERVED\r\n *  0b100000..LCD_RX_REQ_TO_DMA_SINGLE\r\n *  0b100001..LCD_TX_REQ_TO_DMA_SINGLE\r\n *  0b100010..RESERVED\r\n *  0b100011..RESERVED\r\n *  0b100100..RESERVED\r\n *  0b100101..RESERVED\r\n *  0b100110..RESERVED\r\n *  0b100111..RESERVED\r\n *  0b101000..RESERVED\r\n *  0b101001..RESERVED\r\n *  0b101010..RESERVED\r\n *  0b101011..RESERVED\r\n *  0b101100..RESERVED\r\n *  0b101101..RESERVED\r\n *  0b101110..RESERVED\r\n *  0b101111..RESERVED\r\n *  0b110000..RESERVED\r\n *  0b110001..RESERVED\r\n *  0b110010..RESERVED\r\n *  0b110011..RESERVED\r\n *  0b110100..RESERVED\r\n *  0b110101..RESERVED\r\n *  0b110110..RESERVED\r\n *  0b110111..RESERVED\r\n *  0b111000..RESERVED\r\n *  0b111001..RESERVED\r\n *  0b111010..RESERVED\r\n *  0b111011..RESERVED\r\n *  0b111100..RESERVED\r\n *  0b111101..RESERVED\r\n *  0b111110..RESERVED\r\n *  0b111111..RESERVED\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_SEL_DMA0_ITRIG_SEL(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_SEL_DMA0_ITRIG_SEL_SHIFT)) & INPUTMUX_DMAC0_ITRIG_SEL_DMA0_ITRIG_SEL_MASK)\r\n/*! @} */\r\n\r\n/* The count of INPUTMUX_DMAC0_ITRIG_SEL */\r\n#define INPUTMUX_DMAC0_ITRIG_SEL_COUNT           (33U)\r\n\r\n/*! @name DMAC0_OTRIG_SEL - DMAC0 Output Trigger Multiplexers N */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC0_OTRIG_SEL_DMAC0_OTRIG_SEL_MASK (0x3FU)\r\n#define INPUTMUX_DMAC0_OTRIG_SEL_DMAC0_OTRIG_SEL_SHIFT (0U)\r\n/*! DMAC0_OTRIG_SEL - DMAC0 Output Triggers Select for A, B, C, D IE.,DMAC0_OTRIG_A, DMAC0_OTRIG_B,\r\n *    DMAC0_OTRIG_C, DMAC0_OTRIG_D DMA0 Output Triggers(n) Selection. 32:1 Selection for each. . .\r\n *  0b000000..DMAC0_OTRIG_CH0\r\n *  0b000001..DMAC0_OTRIG_CH1\r\n *  0b000010..DMAC0_OTRIG_CH2\r\n *  0b000011..DMAC0_OTRIG_CH3\r\n *  0b000100..DMAC0_OTRIG_CH4\r\n *  0b000101..DMAC0_OTRIG_CH5\r\n *  0b000110..DMAC0_OTRIG_CH6\r\n *  0b000111..DMAC0_OTRIG_CH7\r\n *  0b001000..DMAC0_OTRIG_CH8\r\n *  0b001001..DMAC0_OTRIG_CH9\r\n *  0b001010..DMAC0_OTRIG_CH10\r\n *  0b001011..DMAC0_OTRIG_CH11\r\n *  0b001100..DMAC0_OTRIG_CH12\r\n *  0b001101..DMAC0_OTRIG_CH13\r\n *  0b001110..DMAC0_OTRIG_CH14\r\n *  0b001111..DMAC0_OTRIG_CH15\r\n *  0b010000..DMAC0_OTRIG_CH16\r\n *  0b010001..DMAC0_OTRIG_CH17\r\n *  0b010010..DMAC0_OTRIG_CH18\r\n *  0b010011..DMAC0_OTRIG_CH19\r\n *  0b010100..DMAC0_OTRIG_CH20\r\n *  0b010101..DMAC0_OTRIG_CH21\r\n *  0b010110..DMAC0_OTRIG_CH22\r\n *  0b010111..DMAC0_OTRIG_CH23\r\n *  0b011000..DMAC0_OTRIG_CH24\r\n *  0b011001..DMAC0_OTRIG_CH25\r\n *  0b011010..DMAC0_OTRIG_CH26\r\n *  0b011011..DMAC0_OTRIG_CH27\r\n *  0b011100..DMAC0_OTRIG_CH28\r\n *  0b011101..DMAC0_OTRIG_CH29\r\n *  0b011110..DMAC0_OTRIG_CH30\r\n *  0b011111..DMAC0_OTRIG_CH31\r\n *  0b100000..DMAC0_OTRIG_CH32\r\n */\r\n#define INPUTMUX_DMAC0_OTRIG_SEL_DMAC0_OTRIG_SEL(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_OTRIG_SEL_DMAC0_OTRIG_SEL_SHIFT)) & INPUTMUX_DMAC0_OTRIG_SEL_DMAC0_OTRIG_SEL_MASK)\r\n/*! @} */\r\n\r\n/* The count of INPUTMUX_DMAC0_OTRIG_SEL */\r\n#define INPUTMUX_DMAC0_OTRIG_SEL_COUNT           (4U)\r\n\r\n/*! @name DMAC1_ITRIG_SEL - DMAC1 Input Trigger Multiplexers N */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_SEL_DMA1_ITRIG_SEL_MASK (0x3FU)\r\n#define INPUTMUX_DMAC1_ITRIG_SEL_DMA1_ITRIG_SEL_SHIFT (0U)\r\n/*! DMA1_ITRIG_SEL - DMA Input Triggers(n) Selection. 18:1 Selection for each. . .\r\n *  0b000000..NSGPIOPINT0_INT0\r\n *  0b000001..NSGPIOPINT0_INT1\r\n *  0b000010..NSGPIOPINT0_INT2\r\n *  0b000011..NSGPIOPINT0_INT3\r\n *  0b000100..CT32BIT0_DMAREQ_M0\r\n *  0b000101..CT32BIT0_DMAREQ_M1\r\n *  0b000110..CT32BIT1_DMAREQ_M0\r\n *  0b000111..CT32BIT1_DMAREQ_M1\r\n *  0b001000..CT32BIT2_DMAREQ_M0\r\n *  0b001001..CT32BIT2_DMAREQ_M1\r\n *  0b001010..CT32BIT3_DMAREQ_M0\r\n *  0b001011..CT32BIT3_DMAREQ_M1\r\n *  0b001100..RESERVED\r\n *  0b001101..RESERVED\r\n *  0b001110..DMAC1_TRIGOUT_A\r\n *  0b001111..DMAC1_TRIGOUT_B\r\n *  0b010000..DMAC1_TRIGOUT_C\r\n *  0b010001..DMAC1_TRIGOUT_D\r\n *  0b010010..SCT0_DMAC0\r\n *  0b010011..SCT0_DMAC1\r\n *  0b010100..ENET_MAC0_DMA_REQ0\r\n *  0b010101..ENET_MAC0_DMA_REQ1\r\n *  0b010110..USIM_DMA_RX_SINGLE\r\n *  0b010111..USIM_DMA_TX_SINGLE\r\n *  0b011000..GAU_GPADC0_DMA_SINGLE\r\n *  0b011001..GAU_GPADC1_DMA_SINGLE\r\n *  0b011010..RESERVED\r\n *  0b011011..RESERVED\r\n *  0b011100..FLEXSPI_RX\r\n *  0b011101..FLEXSPI_TX\r\n *  0b011110..RESERVED\r\n *  0b011111..RESERVED\r\n *  0b100000..LCD_RX_REQ_TO_DMA_SINGLE\r\n *  0b100001..LCD_TX_REQ_TO_DMA_SINGLE\r\n *  0b100010..RESERVED\r\n *  0b100011..RESERVED\r\n *  0b100100..RESERVED\r\n *  0b100101..RESERVED\r\n *  0b100110..RESERVED\r\n *  0b100111..RESERVED\r\n *  0b101000..RESERVED\r\n *  0b101001..RESERVED\r\n *  0b101010..RESERVED\r\n *  0b101011..RESERVED\r\n *  0b101100..RESERVED\r\n *  0b101101..RESERVED\r\n *  0b101110..RESERVED\r\n *  0b101111..RESERVED\r\n *  0b110000..RESERVED\r\n *  0b110001..RESERVED\r\n *  0b110010..RESERVED\r\n *  0b110011..RESERVED\r\n *  0b110100..RESERVED\r\n *  0b110101..RESERVED\r\n *  0b110110..RESERVED\r\n *  0b110111..RESERVED\r\n *  0b111000..RESERVED\r\n *  0b111001..RESERVED\r\n *  0b111010..RESERVED\r\n *  0b111011..RESERVED\r\n *  0b111100..RESERVED\r\n *  0b111101..RESERVED\r\n *  0b111110..RESERVED\r\n *  0b111111..RESERVED\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_SEL_DMA1_ITRIG_SEL(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_SEL_DMA1_ITRIG_SEL_SHIFT)) & INPUTMUX_DMAC1_ITRIG_SEL_DMA1_ITRIG_SEL_MASK)\r\n/*! @} */\r\n\r\n/* The count of INPUTMUX_DMAC1_ITRIG_SEL */\r\n#define INPUTMUX_DMAC1_ITRIG_SEL_COUNT           (33U)\r\n\r\n/*! @name DMAC1_OTRIG_SEL - DMAC1 Output Trigger Multiplexers N */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC1_OTRIG_SEL_DMA1_OTRIG_SEL_MASK (0x3FU)\r\n#define INPUTMUX_DMAC1_OTRIG_SEL_DMA1_OTRIG_SEL_SHIFT (0U)\r\n/*! DMA1_OTRIG_SEL - DMA1 Output Triggers Select for A, B, C, D IE., DMA1_OTRIG_A, DMA1_OTRIG_B,\r\n *    DM1_OTRIG_C, DMA1_OTRIG_D DMA0 Output Triggers(n) Selection. 32:1 Selection for each. . .\r\n *  0b000000..DMAC1_OTRIG_CH0\r\n *  0b000001..DMAC1_OTRIG_CH1\r\n *  0b000010..DMAC1_OTRIG_CH2\r\n *  0b000011..DMAC1_OTRIG_CH3\r\n *  0b000100..DMAC1_OTRIG_CH4\r\n *  0b000101..DMAC1_OTRIG_CH5\r\n *  0b000110..DMAC1_OTRIG_CH6\r\n *  0b000111..DMAC1_OTRIG_CH7\r\n *  0b001000..DMAC1_OTRIG_CH8\r\n *  0b001001..DMAC1_OTRIG_CH9\r\n *  0b001010..DMAC1_OTRIG_CH10\r\n *  0b001011..DMAC1_OTRIG_CH11\r\n *  0b001100..DMAC1_OTRIG_CH12\r\n *  0b001101..DMAC1_OTRIG_CH13\r\n *  0b001110..DMAC1_OTRIG_CH14\r\n *  0b001111..DMAC1_OTRIG_CH15\r\n *  0b010000..DMAC1_OTRIG_CH16\r\n *  0b010001..DMAC1_OTRIG_CH17\r\n *  0b010010..DMAC1_OTRIG_CH18\r\n *  0b010011..DMAC1_OTRIG_CH19\r\n *  0b010100..DMAC1_OTRIG_CH20\r\n *  0b010101..DMAC1_OTRIG_CH21\r\n *  0b010110..DMAC1_OTRIG_CH22\r\n *  0b010111..DMAC1_OTRIG_CH23\r\n *  0b011000..DMAC1_OTRIG_CH24\r\n *  0b011001..DMAC1_OTRIG_CH25\r\n *  0b011010..DMAC1_OTRIG_CH26\r\n *  0b011011..DMAC1_OTRIG_CH27\r\n *  0b011100..DMAC1_OTRIG_CH28\r\n *  0b011101..DMAC1_OTRIG_CH29\r\n *  0b011110..DMAC1_OTRIG_CH30\r\n *  0b011111..DMAC1_OTRIG_CH31\r\n *  0b100000..DMAC1_OTRIG_CH32\r\n */\r\n#define INPUTMUX_DMAC1_OTRIG_SEL_DMA1_OTRIG_SEL(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_OTRIG_SEL_DMA1_OTRIG_SEL_SHIFT)) & INPUTMUX_DMAC1_OTRIG_SEL_DMA1_OTRIG_SEL_MASK)\r\n/*! @} */\r\n\r\n/* The count of INPUTMUX_DMAC1_OTRIG_SEL */\r\n#define INPUTMUX_DMAC1_OTRIG_SEL_COUNT           (4U)\r\n\r\n/*! @name CT32BIT_CAP_SEL - CT32BIT N Counter Timer Capture Trigger Multiplexers M */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_CT32BIT_CAP_SEL_CAPN_SEL_MASK   (0x1FU)\r\n#define INPUTMUX_CT32BIT_CAP_SEL_CAPN_SEL_SHIFT  (0U)\r\n/*! CAPN_SEL - Counter Timer m, Capture Port Input n 19:1 Mux Select. . .\r\n *  0b00000..CT_INP0\r\n *  0b00001..CT_INP1\r\n *  0b00010..CT_INP2\r\n *  0b00011..CT_INP3\r\n *  0b00100..CT_INP4\r\n *  0b00101..CT_INP5\r\n *  0b00110..CT_INP6\r\n *  0b00111..CT_INP7\r\n *  0b01000..CT_INP8\r\n *  0b01001..CT_INP9\r\n *  0b01010..CT_INP10\r\n *  0b01011..CT_INP11\r\n *  0b01100..CT_INP12\r\n *  0b01101..CT_INP13\r\n *  0b01110..CT_INP14\r\n *  0b01111..RESERVED\r\n *  0b10000..SHARED I2S0_WS\r\n *  0b10001..SHARED I2S1_WS\r\n *  0b10010..ENET(only for timer1)\r\n *  0b10011..BTU_HOST_TRIGGER_0\r\n *  0b10100..BTU_HOST_TRIGGER_1\r\n *  0b10101..BTU_HOST_TRIGGER_2\r\n *  0b10110..FLEXCOMM_DMA_DONE0(only for timer0 and timer2)\r\n *  0b10111..FLEXCOMM_DMA_DONE1(only for timer0 and timer2)\r\n *  0b11000..FLEXCOMM_DMA_CMPLT_DONE0(only for timer0 and timer2)\r\n *  0b11001..FLEXCOMM_DMA_CMPLT_DONE1(only for timer0 and timer2)\r\n *  0b11010..RESERVED\r\n *  0b11011..RESERVED\r\n *  0b11100..RESERVED\r\n *  0b11101..RESERVED\r\n *  0b11110..RESERVED\r\n *  0b11111..RESERVED\r\n */\r\n#define INPUTMUX_CT32BIT_CAP_SEL_CAPN_SEL(x)     (((uint32_t)(((uint32_t)(x)) << INPUTMUX_CT32BIT_CAP_SEL_CAPN_SEL_SHIFT)) & INPUTMUX_CT32BIT_CAP_SEL_CAPN_SEL_MASK)\r\n/*! @} */\r\n\r\n/* The count of INPUTMUX_CT32BIT_CAP_SEL */\r\n#define INPUTMUX_CT32BIT_CAP_SEL_COUNT           (4U)\r\n\r\n/* The count of INPUTMUX_CT32BIT_CAP_SEL */\r\n#define INPUTMUX_CT32BIT_CAP_SEL_COUNT2          (4U)\r\n\r\n/*! @name FMEASURE_CH_SEL - Frequency Measurement Input Channel Multiplexers */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_FMEASURE_CH_SEL_FMEASURE_SEL_MASK (0x1FU)\r\n#define INPUTMUX_FMEASURE_CH_SEL_FMEASURE_SEL_SHIFT (0U)\r\n/*! FMEASURE_SEL - Frequency Measure Channel n Selection 7:1 Mux Select. . .\r\n *  0b00000..SYSOSC Clock\r\n *  0b00001..SFRO\r\n *  0b00010..FFRO\r\n *  0b00011..Low Power Oscillator Clock (LPOSC)\r\n *  0b00100..XTAL32K\r\n *  0b00101..c0_fr_hclk\r\n *  0b00110..FREQME_GPIO_CLK_IN\r\n *  0b00111..T3PLL_MCU_FLEXSPI_CLK\r\n *  0b01000..TDDR_MCU_FLEXSPI_CLK\r\n *  0b01001..TDDR_MCU_ENET_CLK\r\n *  0b01010..TCPU_MCU_FLEXSPI_CLK\r\n *  0b10010..NCO_32K\r\n *  0b10011..PMU_FCLK\r\n *  0b10100..OSC32K_CLK_1HZ\r\n *  0b10101..OSC32K_CLK_1KHZ\r\n *  0b10110..LCD_FCLK\r\n *  0b10111..FLEXCOMM0_FCLK\r\n *  0b11000..DMIC_FCLK\r\n *  0b11001..FLEXSPI0_FCLK\r\n *  0b11010..TCPU_MCU_CLK\r\n *  0b11011..AVPLL_CH2_CLKOUT(64M)\r\n *  0b11100..RESERVED\r\n *  0b11101..RESERVED\r\n *  0b11110..RESERVED\r\n *  0b11111..RESERVED\r\n */\r\n#define INPUTMUX_FMEASURE_CH_SEL_FMEASURE_SEL(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_FMEASURE_CH_SEL_FMEASURE_SEL_SHIFT)) & INPUTMUX_FMEASURE_CH_SEL_FMEASURE_SEL_MASK)\r\n/*! @} */\r\n\r\n/* The count of INPUTMUX_FMEASURE_CH_SEL */\r\n#define INPUTMUX_FMEASURE_CH_SEL_COUNT           (2U)\r\n\r\n/*! @name DMAC0_REQ_ENA0 - DMAC0 request enable 0 */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM0_RX_MASK (0x1U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM0_RX_SHIFT (0U)\r\n/*! FLEXCOMM0_RX - FLEXCOMM0 RX enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM0_RX(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM0_RX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM0_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM0_TX_MASK (0x2U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM0_TX_SHIFT (1U)\r\n/*! FLEXCOMM0_TX - FLEXCOMM0 TX enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM0_TX(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM0_TX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM0_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM1_RX_MASK (0x4U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM1_RX_SHIFT (2U)\r\n/*! FLEXCOMM1_RX - FLEXCOMM1 RX enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM1_RX(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM1_RX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM1_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM1_TX_MASK (0x8U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM1_TX_SHIFT (3U)\r\n/*! FLEXCOMM1_TX - FLEXCOMM1 TX enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM1_TX(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM1_TX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM1_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM2_RX_MASK (0x10U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM2_RX_SHIFT (4U)\r\n/*! FLEXCOMM2_RX - FLEXCOMM2 RX enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM2_RX(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM2_RX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM2_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM2_TX_MASK (0x20U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM2_TX_SHIFT (5U)\r\n/*! FLEXCOMM2_TX - FLEXCOMM2 TX enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM2_TX(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM2_TX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM2_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM3_RX_MASK (0x40U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM3_RX_SHIFT (6U)\r\n/*! FLEXCOMM3_RX - FLEXCOMM3 RX enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM3_RX(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM3_RX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM3_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM3_TX_MASK (0x80U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM3_TX_SHIFT (7U)\r\n/*! FLEXCOMM3_TX - FLEXCOMM3 TX enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM3_TX(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM3_TX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM3_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_DMIC0CH0_MASK    (0x10000U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_DMIC0CH0_SHIFT   (16U)\r\n/*! DMIC0CH0 - DMIC0 channel 0 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_DMIC0CH0(x)      (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_DMIC0CH0_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_DMIC0CH0_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_DMIC0CH1_MASK    (0x20000U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_DMIC0CH1_SHIFT   (17U)\r\n/*! DMIC0CH1 - DMIC0 channel 1 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_DMIC0CH1(x)      (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_DMIC0CH1_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_DMIC0CH1_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_DMIC0CH2_MASK    (0x40000U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_DMIC0CH2_SHIFT   (18U)\r\n/*! DMIC0CH2 - DMIC0 channel 2 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_DMIC0CH2(x)      (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_DMIC0CH2_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_DMIC0CH2_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_DMIC0CH3_MASK    (0x80000U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_DMIC0CH3_SHIFT   (19U)\r\n/*! DMIC0CH3 - DMIC0 channel 3 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_DMIC0CH3(x)      (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_DMIC0CH3_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_DMIC0CH3_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM14_RX_MASK (0x4000000U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM14_RX_SHIFT (26U)\r\n/*! FLEXCOMM14_RX - FLEXCOMM14 RX enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM14_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM14_RX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM14_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM14_TX_MASK (0x8000000U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM14_TX_SHIFT (27U)\r\n/*! FLEXCOMM14_TX - FLEXCOMM14 TX enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM14_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM14_TX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_FLEXCOMM14_TX_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMAC0_REQ_ENA0_SET - DMAC0 request enable set 0 */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM0_RX_MASK (0x1U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM0_RX_SHIFT (0U)\r\n/*! FLEXCOMM0_RX - FLEXCOMM0 RX enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM0_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM0_RX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM0_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM0_TX_MASK (0x2U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM0_TX_SHIFT (1U)\r\n/*! FLEXCOMM0_TX - FLEXCOMM0 TX enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM0_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM0_TX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM0_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM1_RX_MASK (0x4U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM1_RX_SHIFT (2U)\r\n/*! FLEXCOMM1_RX - FLEXCOMM1 RX enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM1_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM1_RX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM1_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM1_TX_MASK (0x8U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM1_TX_SHIFT (3U)\r\n/*! FLEXCOMM1_TX - FLEXCOMM1 TX enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM1_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM1_TX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM1_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM2_RX_MASK (0x10U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM2_RX_SHIFT (4U)\r\n/*! FLEXCOMM2_RX - FLEXCOMM2 RX enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM2_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM2_RX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM2_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM2_TX_MASK (0x20U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM2_TX_SHIFT (5U)\r\n/*! FLEXCOMM2_TX - FLEXCOMM2 TX enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM2_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM2_TX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM2_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM3_RX_MASK (0x40U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM3_RX_SHIFT (6U)\r\n/*! FLEXCOMM3_RX - FLEXCOMM3 RX enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM3_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM3_RX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM3_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM3_TX_MASK (0x80U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM3_TX_SHIFT (7U)\r\n/*! FLEXCOMM3_TX - FLEXCOMM3 TX enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM3_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM3_TX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM3_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_DMIC0CH0_MASK (0x10000U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_DMIC0CH0_SHIFT (16U)\r\n/*! DMIC0CH0 - DMIC0 channel 0 enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_DMIC0CH0(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_SET_DMIC0CH0_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_SET_DMIC0CH0_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_DMIC0CH1_MASK (0x20000U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_DMIC0CH1_SHIFT (17U)\r\n/*! DMIC0CH1 - DMIC0 channel 1 enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_DMIC0CH1(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_SET_DMIC0CH1_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_SET_DMIC0CH1_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_DMIC0CH2_MASK (0x40000U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_DMIC0CH2_SHIFT (18U)\r\n/*! DMIC0CH2 - DMIC0 channel 2 enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_DMIC0CH2(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_SET_DMIC0CH2_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_SET_DMIC0CH2_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_DMIC0CH3_MASK (0x80000U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_DMIC0CH3_SHIFT (19U)\r\n/*! DMIC0CH3 - DMIC0 channel 3 enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_DMIC0CH3(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_SET_DMIC0CH3_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_SET_DMIC0CH3_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM14_RX_MASK (0x4000000U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM14_RX_SHIFT (26U)\r\n/*! FLEXCOMM14_RX - FLEXCOMM14 RX enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM14_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM14_RX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM14_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM14_TX_MASK (0x8000000U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM14_TX_SHIFT (27U)\r\n/*! FLEXCOMM14_TX - FLEXCOMM14 TX enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM14_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM14_TX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_SET_FLEXCOMM14_TX_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMAC0_REQ_ENA0_CLR - DMAC0 request enable clear 0 */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM0_RX_MASK (0x1U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM0_RX_SHIFT (0U)\r\n/*! FLEXCOMM0_RX - FLEXCOMM0 RX enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM0_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM0_RX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM0_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM0_TX_MASK (0x2U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM0_TX_SHIFT (1U)\r\n/*! FLEXCOMM0_TX - FLEXCOMM0 TX enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM0_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM0_TX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM0_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM1_RX_MASK (0x4U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM1_RX_SHIFT (2U)\r\n/*! FLEXCOMM1_RX - FLEXCOMM1 RX enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM1_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM1_RX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM1_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM1_TX_MASK (0x8U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM1_TX_SHIFT (3U)\r\n/*! FLEXCOMM1_TX - FLEXCOMM1 TX enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM1_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM1_TX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM1_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM2_RX_MASK (0x10U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM2_RX_SHIFT (4U)\r\n/*! FLEXCOMM2_RX - FLEXCOMM2 RX enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM2_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM2_RX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM2_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM2_TX_MASK (0x20U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM2_TX_SHIFT (5U)\r\n/*! FLEXCOMM2_TX - FLEXCOMM2 TX enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM2_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM2_TX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM2_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM3_RX_MASK (0x40U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM3_RX_SHIFT (6U)\r\n/*! FLEXCOMM3_RX - FLEXCOMM3 RX enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM3_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM3_RX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM3_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM3_TX_MASK (0x80U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM3_TX_SHIFT (7U)\r\n/*! FLEXCOMM3_TX - FLEXCOMM3 TX enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM3_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM3_TX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM3_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_DMIC0CH0_MASK (0x10000U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_DMIC0CH0_SHIFT (16U)\r\n/*! DMIC0CH0 - DMIC0 channel 0 enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_DMIC0CH0(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_CLR_DMIC0CH0_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_CLR_DMIC0CH0_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_DMIC0CH1_MASK (0x20000U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_DMIC0CH1_SHIFT (17U)\r\n/*! DMIC0CH1 - DMIC0 channel 1 enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_DMIC0CH1(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_CLR_DMIC0CH1_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_CLR_DMIC0CH1_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_DMIC0CH2_MASK (0x40000U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_DMIC0CH2_SHIFT (18U)\r\n/*! DMIC0CH2 - DMIC0 channel 2 enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_DMIC0CH2(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_CLR_DMIC0CH2_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_CLR_DMIC0CH2_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_DMIC0CH3_MASK (0x80000U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_DMIC0CH3_SHIFT (19U)\r\n/*! DMIC0CH3 - DMIC0 channel 3 enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_DMIC0CH3(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_CLR_DMIC0CH3_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_CLR_DMIC0CH3_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM14_RX_MASK (0x4000000U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM14_RX_SHIFT (26U)\r\n/*! FLEXCOMM14_RX - FLEXCOMM14 RX enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM14_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM14_RX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM14_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM14_TX_MASK (0x8000000U)\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM14_TX_SHIFT (27U)\r\n/*! FLEXCOMM14_TX - FLEXCOMM14 TX enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM14_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM14_TX_SHIFT)) & INPUTMUX_DMAC0_REQ_ENA0_CLR_FLEXCOMM14_TX_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMAC1_REQ_ENA0 - DMAC1 request enable 0 */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM0_RX_MASK (0x1U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM0_RX_SHIFT (0U)\r\n/*! FLEXCOMM0_RX - FLEXCOMM0 RX enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM0_RX(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM0_RX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM0_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM0_TX_MASK (0x2U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM0_TX_SHIFT (1U)\r\n/*! FLEXCOMM0_TX - FLEXCOMM0 TX enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM0_TX(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM0_TX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM0_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM1_RX_MASK (0x4U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM1_RX_SHIFT (2U)\r\n/*! FLEXCOMM1_RX - FLEXCOMM1 RX enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM1_RX(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM1_RX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM1_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM1_TX_MASK (0x8U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM1_TX_SHIFT (3U)\r\n/*! FLEXCOMM1_TX - FLEXCOMM1 TX enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM1_TX(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM1_TX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM1_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM2_RX_MASK (0x10U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM2_RX_SHIFT (4U)\r\n/*! FLEXCOMM2_RX - FLEXCOMM2 RX enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM2_RX(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM2_RX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM2_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM2_TX_MASK (0x20U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM2_TX_SHIFT (5U)\r\n/*! FLEXCOMM2_TX - FLEXCOMM2 TX enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM2_TX(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM2_TX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM2_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM3_RX_MASK (0x40U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM3_RX_SHIFT (6U)\r\n/*! FLEXCOMM3_RX - FLEXCOMM3 RX enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM3_RX(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM3_RX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM3_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM3_TX_MASK (0x80U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM3_TX_SHIFT (7U)\r\n/*! FLEXCOMM3_TX - FLEXCOMM3 TX enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM3_TX(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM3_TX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM3_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_DMIC0CH0_MASK    (0x10000U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_DMIC0CH0_SHIFT   (16U)\r\n/*! DMIC0CH0 - DMIC0 channel 0 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_DMIC0CH0(x)      (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_DMIC0CH0_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_DMIC0CH0_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_DMIC0CH1_MASK    (0x20000U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_DMIC0CH1_SHIFT   (17U)\r\n/*! DMIC0CH1 - DMIC0 channel 1 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_DMIC0CH1(x)      (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_DMIC0CH1_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_DMIC0CH1_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_DMIC0CH2_MASK    (0x40000U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_DMIC0CH2_SHIFT   (18U)\r\n/*! DMIC0CH2 - DMIC0 channel 2 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_DMIC0CH2(x)      (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_DMIC0CH2_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_DMIC0CH2_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_DMIC0CH3_MASK    (0x80000U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_DMIC0CH3_SHIFT   (19U)\r\n/*! DMIC0CH3 - DMIC0 channel 3 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_DMIC0CH3(x)      (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_DMIC0CH3_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_DMIC0CH3_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM14_RX_MASK (0x4000000U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM14_RX_SHIFT (26U)\r\n/*! FLEXCOMM14_RX - FLEXCOMM14 RX enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM14_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM14_RX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM14_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM14_TX_MASK (0x8000000U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM14_TX_SHIFT (27U)\r\n/*! FLEXCOMM14_TX - FLEXCOMM14 TX enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM14_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM14_TX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_FLEXCOMM14_TX_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMAC1_REQ_ENA0_SET - DMAC1 request enable set 0 */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM0_RX_MASK (0x1U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM0_RX_SHIFT (0U)\r\n/*! FLEXCOMM0_RX - FLEXCOMM0 RX enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM0_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM0_RX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM0_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM0_TX_MASK (0x2U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM0_TX_SHIFT (1U)\r\n/*! FLEXCOMM0_TX - FLEXCOMM0 TX enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM0_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM0_TX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM0_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM1_RX_MASK (0x4U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM1_RX_SHIFT (2U)\r\n/*! FLEXCOMM1_RX - FLEXCOMM1 RX enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM1_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM1_RX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM1_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM1_TX_MASK (0x8U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM1_TX_SHIFT (3U)\r\n/*! FLEXCOMM1_TX - FLEXCOMM1 TX enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM1_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM1_TX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM1_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM2_RX_MASK (0x10U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM2_RX_SHIFT (4U)\r\n/*! FLEXCOMM2_RX - FLEXCOMM2 RX enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM2_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM2_RX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM2_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM2_TX_MASK (0x20U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM2_TX_SHIFT (5U)\r\n/*! FLEXCOMM2_TX - FLEXCOMM2 TX enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM2_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM2_TX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM2_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM3_RX_MASK (0x40U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM3_RX_SHIFT (6U)\r\n/*! FLEXCOMM3_RX - FLEXCOMM3 RX enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM3_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM3_RX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM3_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM3_TX_MASK (0x80U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM3_TX_SHIFT (7U)\r\n/*! FLEXCOMM3_TX - FLEXCOMM3 TX enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM3_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM3_TX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM3_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_DMIC0CH0_MASK (0x10000U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_DMIC0CH0_SHIFT (16U)\r\n/*! DMIC0CH0 - DMIC0 channel 0 enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_DMIC0CH0(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_SET_DMIC0CH0_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_SET_DMIC0CH0_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_DMIC0CH1_MASK (0x20000U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_DMIC0CH1_SHIFT (17U)\r\n/*! DMIC0CH1 - DMIC0 channel 1 enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_DMIC0CH1(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_SET_DMIC0CH1_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_SET_DMIC0CH1_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_DMIC0CH2_MASK (0x40000U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_DMIC0CH2_SHIFT (18U)\r\n/*! DMIC0CH2 - DMIC0 channel 2 enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_DMIC0CH2(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_SET_DMIC0CH2_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_SET_DMIC0CH2_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_DMIC0CH3_MASK (0x80000U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_DMIC0CH3_SHIFT (19U)\r\n/*! DMIC0CH3 - DMIC0 channel 3 enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_DMIC0CH3(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_SET_DMIC0CH3_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_SET_DMIC0CH3_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM14_RX_MASK (0x4000000U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM14_RX_SHIFT (26U)\r\n/*! FLEXCOMM14_RX - FLEXCOMM14 RX enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM14_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM14_RX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM14_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM14_TX_MASK (0x8000000U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM14_TX_SHIFT (27U)\r\n/*! FLEXCOMM14_TX - FLEXCOMM14 TX enable\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM14_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM14_TX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_SET_FLEXCOMM14_TX_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMAC1_REQ_ENA0_CLR - DMAC1 request enable clear 0 */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM0_RX_MASK (0x1U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM0_RX_SHIFT (0U)\r\n/*! FLEXCOMM0_RX - FLEXCOMM0 RX enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM0_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM0_RX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM0_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM0_TX_MASK (0x2U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM0_TX_SHIFT (1U)\r\n/*! FLEXCOMM0_TX - FLEXCOMM0 TX enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM0_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM0_TX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM0_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM1_RX_MASK (0x4U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM1_RX_SHIFT (2U)\r\n/*! FLEXCOMM1_RX - FLEXCOMM1 RX enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM1_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM1_RX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM1_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM1_TX_MASK (0x8U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM1_TX_SHIFT (3U)\r\n/*! FLEXCOMM1_TX - FLEXCOMM1 TX enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM1_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM1_TX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM1_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM2_RX_MASK (0x10U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM2_RX_SHIFT (4U)\r\n/*! FLEXCOMM2_RX - FLEXCOMM2 RX enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM2_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM2_RX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM2_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM2_TX_MASK (0x20U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM2_TX_SHIFT (5U)\r\n/*! FLEXCOMM2_TX - FLEXCOMM2 TX enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM2_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM2_TX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM2_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM3_RX_MASK (0x40U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM3_RX_SHIFT (6U)\r\n/*! FLEXCOMM3_RX - FLEXCOMM3 RX enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM3_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM3_RX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM3_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM3_TX_MASK (0x80U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM3_TX_SHIFT (7U)\r\n/*! FLEXCOMM3_TX - FLEXCOMM3 TX enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM3_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM3_TX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM3_TX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_DMIC0CH0_MASK (0x10000U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_DMIC0CH0_SHIFT (16U)\r\n/*! DMIC0CH0 - DMIC0 channel 0 enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_DMIC0CH0(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_CLR_DMIC0CH0_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_CLR_DMIC0CH0_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_DMIC0CH1_MASK (0x20000U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_DMIC0CH1_SHIFT (17U)\r\n/*! DMIC0CH1 - DMIC0 channel 1 enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_DMIC0CH1(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_CLR_DMIC0CH1_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_CLR_DMIC0CH1_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_DMIC0CH2_MASK (0x40000U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_DMIC0CH2_SHIFT (18U)\r\n/*! DMIC0CH2 - DMIC0 channel 2 enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_DMIC0CH2(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_CLR_DMIC0CH2_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_CLR_DMIC0CH2_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_DMIC0CH3_MASK (0x80000U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_DMIC0CH3_SHIFT (19U)\r\n/*! DMIC0CH3 - DMIC0 channel 3 enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_DMIC0CH3(x)  (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_CLR_DMIC0CH3_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_CLR_DMIC0CH3_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM14_RX_MASK (0x4000000U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM14_RX_SHIFT (26U)\r\n/*! FLEXCOMM14_RX - FLEXCOMM14 RX enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM14_RX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM14_RX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM14_RX_MASK)\r\n\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM14_TX_MASK (0x8000000U)\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM14_TX_SHIFT (27U)\r\n/*! FLEXCOMM14_TX - FLEXCOMM14 TX enable clear\r\n *  0b0..No Effect\r\n *  0b1..Clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM14_TX(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM14_TX_SHIFT)) & INPUTMUX_DMAC1_REQ_ENA0_CLR_FLEXCOMM14_TX_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMAC0_ITRIG_ENA0 - DMAC0 input trigger enable 0 */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX0_MASK (0x1U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX0_SHIFT (0U)\r\n/*! DMAC0_ITRIG_INMUX0 - DMAC0 input trigger inmux 0 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX0(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX0_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX0_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX1_MASK (0x2U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX1_SHIFT (1U)\r\n/*! DMAC0_ITRIG_INMUX1 - DMAC0 input trigger inmux 1 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX1(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX1_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX1_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX2_MASK (0x4U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX2_SHIFT (2U)\r\n/*! DMAC0_ITRIG_INMUX2 - DMAC0 input trigger inmux 2 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX2(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX2_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX2_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX3_MASK (0x8U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX3_SHIFT (3U)\r\n/*! DMAC0_ITRIG_INMUX3 - DMAC0 input trigger inmux 3 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX3(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX3_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX3_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX4_MASK (0x10U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX4_SHIFT (4U)\r\n/*! DMAC0_ITRIG_INMUX4 - DMAC0 input trigger inmux 4 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX4(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX4_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX4_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX5_MASK (0x20U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX5_SHIFT (5U)\r\n/*! DMAC0_ITRIG_INMUX5 - DMAC0 input trigger inmux 5 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX5(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX5_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX5_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX6_MASK (0x40U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX6_SHIFT (6U)\r\n/*! DMAC0_ITRIG_INMUX6 - DMAC0 input trigger inmux 6 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX6(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX6_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX6_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX7_MASK (0x80U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX7_SHIFT (7U)\r\n/*! DMAC0_ITRIG_INMUX7 - DMAC0 input trigger inmux 7 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX7(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX7_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX7_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX8_MASK (0x100U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX8_SHIFT (8U)\r\n/*! DMAC0_ITRIG_INMUX8 - DMAC0 input trigger inmux 8 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX8(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX8_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX8_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX9_MASK (0x200U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX9_SHIFT (9U)\r\n/*! DMAC0_ITRIG_INMUX9 - DMAC0 input trigger inmux 9 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX9(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX9_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX9_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX10_MASK (0x400U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX10_SHIFT (10U)\r\n/*! DMAC0_ITRIG_INMUX10 - DMAC0 input trigger inmux 10 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX10(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX10_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX10_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX11_MASK (0x800U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX11_SHIFT (11U)\r\n/*! DMAC0_ITRIG_INMUX11 - DMAC0 input trigger inmux 11 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX11(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX11_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX11_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX12_MASK (0x1000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX12_SHIFT (12U)\r\n/*! DMAC0_ITRIG_INMUX12 - DMAC0 input trigger inmux 12 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX12(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX12_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX12_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX13_MASK (0x2000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX13_SHIFT (13U)\r\n/*! DMAC0_ITRIG_INMUX13 - DMAC0 input trigger inmux 13 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX13(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX13_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX13_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX14_MASK (0x4000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX14_SHIFT (14U)\r\n/*! DMAC0_ITRIG_INMUX14 - DMAC0 input trigger inmux 14 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX14(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX14_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX14_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX15_MASK (0x8000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX15_SHIFT (15U)\r\n/*! DMAC0_ITRIG_INMUX15 - DMAC0 input trigger inmux 15 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX15(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX15_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX15_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX16_MASK (0x10000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX16_SHIFT (16U)\r\n/*! DMAC0_ITRIG_INMUX16 - DMAC0 input trigger inmux 16 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX16(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX16_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX16_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX17_MASK (0x20000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX17_SHIFT (17U)\r\n/*! DMAC0_ITRIG_INMUX17 - DMAC0 input trigger inmux 17 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX17(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX17_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX17_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX18_MASK (0x40000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX18_SHIFT (18U)\r\n/*! DMAC0_ITRIG_INMUX18 - DMAC0 input trigger inmux 18 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX18(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX18_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX18_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX19_MASK (0x80000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX19_SHIFT (19U)\r\n/*! DMAC0_ITRIG_INMUX19 - DMAC0 input trigger inmux 19 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX19(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX19_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX19_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX20_MASK (0x100000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX20_SHIFT (20U)\r\n/*! DMAC0_ITRIG_INMUX20 - DMAC0 input trigger inmux 20 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX20(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX20_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX20_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX21_MASK (0x200000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX21_SHIFT (21U)\r\n/*! DMAC0_ITRIG_INMUX21 - DMAC0 input trigger inmux 21 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX21(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX21_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX21_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX22_MASK (0x400000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX22_SHIFT (22U)\r\n/*! DMAC0_ITRIG_INMUX22 - DMAC0 input trigger inmux 22 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX22(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX22_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX22_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX23_MASK (0x800000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX23_SHIFT (23U)\r\n/*! DMAC0_ITRIG_INMUX23 - DMAC0 input trigger inmux 23 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX23(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX23_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX23_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX24_MASK (0x1000000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX24_SHIFT (24U)\r\n/*! DMAC0_ITRIG_INMUX24 - DMAC0 input trigger inmux 24 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX24(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX24_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX24_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX25_MASK (0x2000000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX25_SHIFT (25U)\r\n/*! DMAC0_ITRIG_INMUX25 - DMAC0 input trigger inmux 25 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX25(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX25_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX25_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX26_MASK (0x4000000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX26_SHIFT (26U)\r\n/*! DMAC0_ITRIG_INMUX26 - DMAC0 input trigger inmux 26 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX26(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX26_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX26_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX27_MASK (0x8000000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX27_SHIFT (27U)\r\n/*! DMAC0_ITRIG_INMUX27 - DMAC0 input trigger inmux 27 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX27(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX27_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX27_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX28_MASK (0x10000000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX28_SHIFT (28U)\r\n/*! DMAC0_ITRIG_INMUX28 - DMAC0 input trigger inmux 28 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX28(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX28_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX28_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX29_MASK (0x20000000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX29_SHIFT (29U)\r\n/*! DMAC0_ITRIG_INMUX29 - DMAC0 input trigger inmux 29 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX29(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX29_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_DMAC0_ITRIG_INMUX29_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMAC0_ITRIG_ENA1 - DMAC0 input trigger enable 1 */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA1_DMAC0_ITRIG_INMUX0_MASK (0x1U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA1_DMAC0_ITRIG_INMUX0_SHIFT (0U)\r\n/*! DMAC0_ITRIG_INMUX0 - DMAC0 input trigger inmux 0 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA1_DMAC0_ITRIG_INMUX0(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA1_DMAC0_ITRIG_INMUX0_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA1_DMAC0_ITRIG_INMUX0_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA1_DMAC0_ITRIG_INMUX1_MASK (0x2U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA1_DMAC0_ITRIG_INMUX1_SHIFT (1U)\r\n/*! DMAC0_ITRIG_INMUX1 - DMAC0 input trigger inmux 1 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA1_DMAC0_ITRIG_INMUX1(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA1_DMAC0_ITRIG_INMUX1_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA1_DMAC0_ITRIG_INMUX1_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMAC0_ITRIG_ENA0_SET - DMAC0 input trigger enable set 0 */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX0_MASK (0x1U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX0_SHIFT (0U)\r\n/*! DMAC0_ITRIG_INMUX0 - DMAC0 input trigger inmux 0 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX0(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX0_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX0_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX1_MASK (0x2U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX1_SHIFT (1U)\r\n/*! DMAC0_ITRIG_INMUX1 - DMAC0 input trigger inmux 1 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX1(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX1_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX1_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX2_MASK (0x4U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX2_SHIFT (2U)\r\n/*! DMAC0_ITRIG_INMUX2 - DMAC0 input trigger inmux 2 enable set */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX2(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX2_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX2_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX3_MASK (0x8U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX3_SHIFT (3U)\r\n/*! DMAC0_ITRIG_INMUX3 - DMAC0 input trigger inmux 3 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX3(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX3_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX3_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX4_MASK (0x10U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX4_SHIFT (4U)\r\n/*! DMAC0_ITRIG_INMUX4 - DMAC0 input trigger inmux 4 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX4(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX4_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX4_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX5_MASK (0x20U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX5_SHIFT (5U)\r\n/*! DMAC0_ITRIG_INMUX5 - DMAC0 input trigger inmux 5 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX5(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX5_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX5_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX6_MASK (0x40U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX6_SHIFT (6U)\r\n/*! DMAC0_ITRIG_INMUX6 - DMAC0 input trigger inmux 6 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX6(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX6_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX6_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX7_MASK (0x80U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX7_SHIFT (7U)\r\n/*! DMAC0_ITRIG_INMUX7 - DMAC0 input trigger inmux 7 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX7(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX7_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX7_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX8_MASK (0x100U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX8_SHIFT (8U)\r\n/*! DMAC0_ITRIG_INMUX8 - DMAC0 input trigger inmux 8 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX8(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX8_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX8_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX9_MASK (0x200U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX9_SHIFT (9U)\r\n/*! DMAC0_ITRIG_INMUX9 - DMAC0 input trigger inmux 9 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX9(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX9_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX9_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX10_MASK (0x400U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX10_SHIFT (10U)\r\n/*! DMAC0_ITRIG_INMUX10 - DMAC0 input trigger inmux 10 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX10(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX10_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX10_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX11_MASK (0x800U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX11_SHIFT (11U)\r\n/*! DMAC0_ITRIG_INMUX11 - DMAC0 input trigger inmux 11 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX11(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX11_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX11_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX12_MASK (0x1000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX12_SHIFT (12U)\r\n/*! DMAC0_ITRIG_INMUX12 - DMAC0 input trigger inmux 12 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX12(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX12_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX12_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX13_MASK (0x2000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX13_SHIFT (13U)\r\n/*! DMAC0_ITRIG_INMUX13 - DMAC0 input trigger inmux 13 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX13(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX13_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX13_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX14_MASK (0x4000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX14_SHIFT (14U)\r\n/*! DMAC0_ITRIG_INMUX14 - DMAC0 input trigger inmux 14 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX14(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX14_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX14_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX15_MASK (0x8000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX15_SHIFT (15U)\r\n/*! DMAC0_ITRIG_INMUX15 - DMAC0 input trigger inmux 15 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX15(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX15_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX15_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX16_MASK (0x10000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX16_SHIFT (16U)\r\n/*! DMAC0_ITRIG_INMUX16 - DMAC0 input trigger inmux 16 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX16(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX16_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX16_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX17_MASK (0x20000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX17_SHIFT (17U)\r\n/*! DMAC0_ITRIG_INMUX17 - DMAC0 input trigger inmux 17 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX17(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX17_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX17_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX18_MASK (0x40000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX18_SHIFT (18U)\r\n/*! DMAC0_ITRIG_INMUX18 - DMAC0 input trigger inmux 18 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX18(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX18_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX18_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX19_MASK (0x80000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX19_SHIFT (19U)\r\n/*! DMAC0_ITRIG_INMUX19 - DMAC0 input trigger inmux 19 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX19(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX19_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX19_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX20_MASK (0x100000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX20_SHIFT (20U)\r\n/*! DMAC0_ITRIG_INMUX20 - DMAC0 input trigger inmux 20 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX20(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX20_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX20_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX21_MASK (0x200000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX21_SHIFT (21U)\r\n/*! DMAC0_ITRIG_INMUX21 - DMAC0 input trigger inmux 21 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX21(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX21_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX21_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX22_MASK (0x400000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX22_SHIFT (22U)\r\n/*! DMAC0_ITRIG_INMUX22 - DMAC0 input trigger inmux 22 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX22(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX22_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX22_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX23_MASK (0x800000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX23_SHIFT (23U)\r\n/*! DMAC0_ITRIG_INMUX23 - DMAC0 input trigger inmux 23 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX23(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX23_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX23_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX24_MASK (0x1000000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX24_SHIFT (24U)\r\n/*! DMAC0_ITRIG_INMUX24 - DMAC0 input trigger inmux 24 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX24(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX24_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX24_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX25_MASK (0x2000000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX25_SHIFT (25U)\r\n/*! DMAC0_ITRIG_INMUX25 - DMAC0 input trigger inmux 25 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX25(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX25_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX25_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX26_MASK (0x4000000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX26_SHIFT (26U)\r\n/*! DMAC0_ITRIG_INMUX26 - DMAC0 input trigger inmux 26 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX26(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX26_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX26_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX27_MASK (0x8000000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX27_SHIFT (27U)\r\n/*! DMAC0_ITRIG_INMUX27 - DMAC0 input trigger inmux 27 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX27(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX27_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX27_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX28_MASK (0x10000000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX28_SHIFT (28U)\r\n/*! DMAC0_ITRIG_INMUX28 - DMAC0 input trigger inmux 28 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX28(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX28_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX28_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX29_MASK (0x20000000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX29_SHIFT (29U)\r\n/*! DMAC0_ITRIG_INMUX29 - DMAC0 input trigger inmux 29 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX29(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX29_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_SET_DMAC0_ITRIG_INMUX29_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMAC0_ITRIG_ENA1_SET - DMAC0 input trigger enable set 1 */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA1_SET_DMAC0_ITRIG_INMUX0_MASK (0x1U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA1_SET_DMAC0_ITRIG_INMUX0_SHIFT (0U)\r\n/*! DMAC0_ITRIG_INMUX0 - DMAC0 input trigger inmux 0 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA1_SET_DMAC0_ITRIG_INMUX0(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA1_SET_DMAC0_ITRIG_INMUX0_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA1_SET_DMAC0_ITRIG_INMUX0_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA1_SET_DMAC0_ITRIG_INMUX1_MASK (0x2U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA1_SET_DMAC0_ITRIG_INMUX1_SHIFT (1U)\r\n/*! DMAC0_ITRIG_INMUX1 - DMAC0 input trigger inmux 1 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA1_SET_DMAC0_ITRIG_INMUX1(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA1_SET_DMAC0_ITRIG_INMUX1_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA1_SET_DMAC0_ITRIG_INMUX1_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMAC0_ITRIG_ENA0_CLR - DMAC0 input trigger enable clear 0 */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX0_MASK (0x1U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX0_SHIFT (0U)\r\n/*! DMAC0_ITRIG_INMUX0 - DMAC0 input trigger inmux 0 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX0(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX0_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX0_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX1_MASK (0x2U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX1_SHIFT (1U)\r\n/*! DMAC0_ITRIG_INMUX1 - DMAC0 input trigger inmux 1 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX1(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX1_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX1_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX2_MASK (0x4U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX2_SHIFT (2U)\r\n/*! DMAC0_ITRIG_INMUX2 - DMAC0 input trigger inmux 2 enable clear */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX2(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX2_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX2_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX3_MASK (0x8U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX3_SHIFT (3U)\r\n/*! DMAC0_ITRIG_INMUX3 - DMAC0 input trigger inmux 3 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX3(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX3_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX3_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX4_MASK (0x10U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX4_SHIFT (4U)\r\n/*! DMAC0_ITRIG_INMUX4 - DMAC0 input trigger inmux 4 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX4(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX4_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX4_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX5_MASK (0x20U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX5_SHIFT (5U)\r\n/*! DMAC0_ITRIG_INMUX5 - DMAC0 input trigger inmux 5 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX5(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX5_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX5_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX6_MASK (0x40U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX6_SHIFT (6U)\r\n/*! DMAC0_ITRIG_INMUX6 - DMAC0 input trigger inmux 6 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX6(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX6_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX6_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX7_MASK (0x80U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX7_SHIFT (7U)\r\n/*! DMAC0_ITRIG_INMUX7 - DMAC0 input trigger inmux 7 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX7(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX7_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX7_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX8_MASK (0x100U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX8_SHIFT (8U)\r\n/*! DMAC0_ITRIG_INMUX8 - DMAC0 input trigger inmux 8 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX8(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX8_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX8_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX9_MASK (0x200U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX9_SHIFT (9U)\r\n/*! DMAC0_ITRIG_INMUX9 - DMAC0 input trigger inmux 9 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX9(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX9_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX9_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX10_MASK (0x400U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX10_SHIFT (10U)\r\n/*! DMAC0_ITRIG_INMUX10 - DMAC0 input trigger inmux 10 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX10(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX10_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX10_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX11_MASK (0x800U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX11_SHIFT (11U)\r\n/*! DMAC0_ITRIG_INMUX11 - DMAC0 input trigger inmux 11 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX11(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX11_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX11_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX12_MASK (0x1000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX12_SHIFT (12U)\r\n/*! DMAC0_ITRIG_INMUX12 - DMAC0 input trigger inmux 12 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX12(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX12_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX12_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX13_MASK (0x2000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX13_SHIFT (13U)\r\n/*! DMAC0_ITRIG_INMUX13 - DMAC0 input trigger inmux 13 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX13(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX13_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX13_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX14_MASK (0x4000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX14_SHIFT (14U)\r\n/*! DMAC0_ITRIG_INMUX14 - DMAC0 input trigger inmux 14 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX14(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX14_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX14_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX15_MASK (0x8000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX15_SHIFT (15U)\r\n/*! DMAC0_ITRIG_INMUX15 - DMAC0 input trigger inmux 15 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX15(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX15_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX15_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX16_MASK (0x10000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX16_SHIFT (16U)\r\n/*! DMAC0_ITRIG_INMUX16 - DMAC0 input trigger inmux 16 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX16(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX16_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX16_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX17_MASK (0x20000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX17_SHIFT (17U)\r\n/*! DMAC0_ITRIG_INMUX17 - DMAC0 input trigger inmux 17 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX17(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX17_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX17_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX18_MASK (0x40000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX18_SHIFT (18U)\r\n/*! DMAC0_ITRIG_INMUX18 - DMAC0 input trigger inmux 18 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX18(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX18_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX18_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX19_MASK (0x80000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX19_SHIFT (19U)\r\n/*! DMAC0_ITRIG_INMUX19 - DMAC0 input trigger inmux 19 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX19(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX19_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX19_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX20_MASK (0x100000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX20_SHIFT (20U)\r\n/*! DMAC0_ITRIG_INMUX20 - DMAC0 input trigger inmux 20 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX20(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX20_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX20_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX21_MASK (0x200000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX21_SHIFT (21U)\r\n/*! DMAC0_ITRIG_INMUX21 - DMAC0 input trigger inmux 21 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX21(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX21_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX21_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX22_MASK (0x400000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX22_SHIFT (22U)\r\n/*! DMAC0_ITRIG_INMUX22 - DMAC0 input trigger inmux 22 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX22(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX22_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX22_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX23_MASK (0x800000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX23_SHIFT (23U)\r\n/*! DMAC0_ITRIG_INMUX23 - DMAC0 input trigger inmux 23 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX23(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX23_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX23_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX24_MASK (0x1000000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX24_SHIFT (24U)\r\n/*! DMAC0_ITRIG_INMUX24 - DMAC0 input trigger inmux 24 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX24(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX24_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX24_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX25_MASK (0x2000000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX25_SHIFT (25U)\r\n/*! DMAC0_ITRIG_INMUX25 - DMAC0 input trigger inmux 25 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX25(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX25_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX25_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX26_MASK (0x4000000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX26_SHIFT (26U)\r\n/*! DMAC0_ITRIG_INMUX26 - DMAC0 input trigger inmux 26 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX26(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX26_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX26_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX27_MASK (0x8000000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX27_SHIFT (27U)\r\n/*! DMAC0_ITRIG_INMUX27 - DMAC0 input trigger inmux 27 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX27(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX27_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX27_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX28_MASK (0x10000000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX28_SHIFT (28U)\r\n/*! DMAC0_ITRIG_INMUX28 - DMAC0 input trigger inmux 28 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX28(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX28_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX28_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX29_MASK (0x20000000U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX29_SHIFT (29U)\r\n/*! DMAC0_ITRIG_INMUX29 - DMAC0 input trigger inmux 29 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX29(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX29_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA0_CLR_DMAC0_ITRIG_INMUX29_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMAC0_ITRIG_ENA1_CLR - DMAC0 input trigger enable clear 1 */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA1_CLR_DMAC0_ITRIG_INMUX0_MASK (0x1U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA1_CLR_DMAC0_ITRIG_INMUX0_SHIFT (0U)\r\n/*! DMAC0_ITRIG_INMUX0 - DMAC0 input trigger inmux 0 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA1_CLR_DMAC0_ITRIG_INMUX0(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA1_CLR_DMAC0_ITRIG_INMUX0_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA1_CLR_DMAC0_ITRIG_INMUX0_MASK)\r\n\r\n#define INPUTMUX_DMAC0_ITRIG_ENA1_CLR_DMAC0_ITRIG_INMUX1_MASK (0x2U)\r\n#define INPUTMUX_DMAC0_ITRIG_ENA1_CLR_DMAC0_ITRIG_INMUX1_SHIFT (1U)\r\n/*! DMAC0_ITRIG_INMUX1 - DMAC0 input trigger inmux 1 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC0_ITRIG_ENA1_CLR_DMAC0_ITRIG_INMUX1(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC0_ITRIG_ENA1_CLR_DMAC0_ITRIG_INMUX1_SHIFT)) & INPUTMUX_DMAC0_ITRIG_ENA1_CLR_DMAC0_ITRIG_INMUX1_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMAC1_ITRIG_ENA0 - DMAC1 input trigger enable 0 */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX0_MASK (0x1U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX0_SHIFT (0U)\r\n/*! DMAC1_ITRIG_INMUX0 - DMAC1 input trigger inmux 0 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX0(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX0_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX0_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX1_MASK (0x2U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX1_SHIFT (1U)\r\n/*! DMAC1_ITRIG_INMUX1 - DMAC1 input trigger inmux 1 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX1(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX1_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX1_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX2_MASK (0x4U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX2_SHIFT (2U)\r\n/*! DMAC1_ITRIG_INMUX2 - DMAC1 input trigger inmux 2 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX2(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX2_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX2_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX3_MASK (0x8U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX3_SHIFT (3U)\r\n/*! DMAC1_ITRIG_INMUX3 - DMAC1 input trigger inmux 3 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX3(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX3_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX3_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX4_MASK (0x10U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX4_SHIFT (4U)\r\n/*! DMAC1_ITRIG_INMUX4 - DMAC1 input trigger inmux 4 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX4(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX4_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX4_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX5_MASK (0x20U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX5_SHIFT (5U)\r\n/*! DMAC1_ITRIG_INMUX5 - DMAC1 input trigger inmux 5 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX5(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX5_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX5_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX6_MASK (0x40U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX6_SHIFT (6U)\r\n/*! DMAC1_ITRIG_INMUX6 - DMAC1 input trigger inmux 6 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX6(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX6_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX6_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX7_MASK (0x80U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX7_SHIFT (7U)\r\n/*! DMAC1_ITRIG_INMUX7 - DMAC1 input trigger inmux 7 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX7(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX7_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX7_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX8_MASK (0x100U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX8_SHIFT (8U)\r\n/*! DMAC1_ITRIG_INMUX8 - DMAC1 input trigger inmux 8 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX8(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX8_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX8_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX9_MASK (0x200U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX9_SHIFT (9U)\r\n/*! DMAC1_ITRIG_INMUX9 - DMAC1 input trigger inmux 9 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX9(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX9_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX9_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX10_MASK (0x400U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX10_SHIFT (10U)\r\n/*! DMAC1_ITRIG_INMUX10 - DMAC1 input trigger inmux 10 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX10(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX10_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX10_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX11_MASK (0x800U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX11_SHIFT (11U)\r\n/*! DMAC1_ITRIG_INMUX11 - DMAC1 input trigger inmux 11 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX11(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX11_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX11_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX12_MASK (0x1000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX12_SHIFT (12U)\r\n/*! DMAC1_ITRIG_INMUX12 - DMAC1 input trigger inmux 12 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX12(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX12_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX12_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX13_MASK (0x2000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX13_SHIFT (13U)\r\n/*! DMAC1_ITRIG_INMUX13 - DMAC1 input trigger inmux 13 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX13(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX13_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX13_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX14_MASK (0x4000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX14_SHIFT (14U)\r\n/*! DMAC1_ITRIG_INMUX14 - DMAC1 input trigger inmux 14 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX14(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX14_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX14_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX15_MASK (0x8000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX15_SHIFT (15U)\r\n/*! DMAC1_ITRIG_INMUX15 - DMAC1 input trigger inmux 15 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX15(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX15_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX15_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX16_MASK (0x10000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX16_SHIFT (16U)\r\n/*! DMAC1_ITRIG_INMUX16 - DMAC1 input trigger inmux 16 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX16(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX16_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX16_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX17_MASK (0x20000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX17_SHIFT (17U)\r\n/*! DMAC1_ITRIG_INMUX17 - DMAC1 input trigger inmux 17 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX17(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX17_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX17_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX18_MASK (0x40000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX18_SHIFT (18U)\r\n/*! DMAC1_ITRIG_INMUX18 - DMAC1 input trigger inmux 18 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX18(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX18_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX18_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX19_MASK (0x80000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX19_SHIFT (19U)\r\n/*! DMAC1_ITRIG_INMUX19 - DMAC1 input trigger inmux 19 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX19(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX19_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX19_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX20_MASK (0x100000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX20_SHIFT (20U)\r\n/*! DMAC1_ITRIG_INMUX20 - DMAC1 input trigger inmux 20 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX20(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX20_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX20_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX21_MASK (0x200000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX21_SHIFT (21U)\r\n/*! DMAC1_ITRIG_INMUX21 - DMAC1 input trigger inmux 21 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX21(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX21_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX21_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX22_MASK (0x400000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX22_SHIFT (22U)\r\n/*! DMAC1_ITRIG_INMUX22 - DMAC1 input trigger inmux 22 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX22(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX22_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX22_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX23_MASK (0x800000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX23_SHIFT (23U)\r\n/*! DMAC1_ITRIG_INMUX23 - DMAC1 input trigger inmux 23 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX23(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX23_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX23_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX24_MASK (0x1000000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX24_SHIFT (24U)\r\n/*! DMAC1_ITRIG_INMUX24 - DMAC1 input trigger inmux 24 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX24(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX24_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX24_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX25_MASK (0x2000000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX25_SHIFT (25U)\r\n/*! DMAC1_ITRIG_INMUX25 - DMAC1 input trigger inmux 25 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX25(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX25_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX25_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX26_MASK (0x4000000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX26_SHIFT (26U)\r\n/*! DMAC1_ITRIG_INMUX26 - DMAC1 input trigger inmux 25 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX26(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX26_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX26_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX27_MASK (0x8000000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX27_SHIFT (27U)\r\n/*! DMAC1_ITRIG_INMUX27 - DMAC1 input trigger inmux 25 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX27(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX27_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX27_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX28_MASK (0x10000000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX28_SHIFT (28U)\r\n/*! DMAC1_ITRIG_INMUX28 - DMAC1 input trigger inmux 25 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX28(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX28_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX28_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX29_MASK (0x20000000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX29_SHIFT (29U)\r\n/*! DMAC1_ITRIG_INMUX29 - DMAC1 input trigger inmux 25 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX29(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX29_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_DMAC1_ITRIG_INMUX29_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMAC1_ITRIG_ENA1 - DMAC1 input trigger enable 1 */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA1_DMAC1_ITRIG_INMUX0_MASK (0x1U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA1_DMAC1_ITRIG_INMUX0_SHIFT (0U)\r\n/*! DMAC1_ITRIG_INMUX0 - DMAC1 input trigger inmux 0 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA1_DMAC1_ITRIG_INMUX0(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA1_DMAC1_ITRIG_INMUX0_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA1_DMAC1_ITRIG_INMUX0_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA1_DMAC1_ITRIG_INMUX1_MASK (0x2U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA1_DMAC1_ITRIG_INMUX1_SHIFT (1U)\r\n/*! DMAC1_ITRIG_INMUX1 - DMAC1 input trigger inmux 1 enable\r\n *  0b0..disable\r\n *  0b1..enable\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA1_DMAC1_ITRIG_INMUX1(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA1_DMAC1_ITRIG_INMUX1_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA1_DMAC1_ITRIG_INMUX1_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMAC1_ITRIG_ENA0_SET - DMAC1 input trigger enable set 0 */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX0_MASK (0x1U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX0_SHIFT (0U)\r\n/*! DMAC1_ITRIG_INMUX0 - DMAC1 input trigger inmux 0 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX0(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX0_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX0_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX1_MASK (0x2U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX1_SHIFT (1U)\r\n/*! DMAC1_ITRIG_INMUX1 - DMAC1 input trigger inmux 1 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX1(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX1_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX1_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX2_MASK (0x4U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX2_SHIFT (2U)\r\n/*! DMAC1_ITRIG_INMUX2 - DMAC1 input trigger inmux 2 enable set */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX2(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX2_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX2_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX3_MASK (0x8U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX3_SHIFT (3U)\r\n/*! DMAC1_ITRIG_INMUX3 - DMAC1 input trigger inmux 3 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX3(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX3_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX3_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX4_MASK (0x10U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX4_SHIFT (4U)\r\n/*! DMAC1_ITRIG_INMUX4 - DMAC1 input trigger inmux 4 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX4(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX4_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX4_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX5_MASK (0x20U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX5_SHIFT (5U)\r\n/*! DMAC1_ITRIG_INMUX5 - DMAC1 input trigger inmux 5 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX5(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX5_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX5_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX6_MASK (0x40U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX6_SHIFT (6U)\r\n/*! DMAC1_ITRIG_INMUX6 - DMAC1 input trigger inmux 6 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX6(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX6_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX6_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX7_MASK (0x80U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX7_SHIFT (7U)\r\n/*! DMAC1_ITRIG_INMUX7 - DMAC1 input trigger inmux 7 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX7(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX7_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX7_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX8_MASK (0x100U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX8_SHIFT (8U)\r\n/*! DMAC1_ITRIG_INMUX8 - DMAC1 input trigger inmux 8 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX8(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX8_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX8_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX9_MASK (0x200U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX9_SHIFT (9U)\r\n/*! DMAC1_ITRIG_INMUX9 - DMAC1 input trigger inmux 9 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX9(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX9_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX9_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX10_MASK (0x400U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX10_SHIFT (10U)\r\n/*! DMAC1_ITRIG_INMUX10 - DMAC1 input trigger inmux 10 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX10(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX10_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX10_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX11_MASK (0x800U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX11_SHIFT (11U)\r\n/*! DMAC1_ITRIG_INMUX11 - DMAC1 input trigger inmux 11 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX11(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX11_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX11_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX12_MASK (0x1000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX12_SHIFT (12U)\r\n/*! DMAC1_ITRIG_INMUX12 - DMAC1 input trigger inmux 12 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX12(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX12_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX12_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX13_MASK (0x2000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX13_SHIFT (13U)\r\n/*! DMAC1_ITRIG_INMUX13 - DMAC1 input trigger inmux 13 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX13(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX13_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX13_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX14_MASK (0x4000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX14_SHIFT (14U)\r\n/*! DMAC1_ITRIG_INMUX14 - DMAC1 input trigger inmux 14 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX14(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX14_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX14_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX15_MASK (0x8000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX15_SHIFT (15U)\r\n/*! DMAC1_ITRIG_INMUX15 - DMAC1 input trigger inmux 15 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX15(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX15_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX15_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX16_MASK (0x10000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX16_SHIFT (16U)\r\n/*! DMAC1_ITRIG_INMUX16 - DMAC1 input trigger inmux 16 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX16(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX16_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX16_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX17_MASK (0x20000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX17_SHIFT (17U)\r\n/*! DMAC1_ITRIG_INMUX17 - DMAC1 input trigger inmux 17 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX17(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX17_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX17_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX18_MASK (0x40000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX18_SHIFT (18U)\r\n/*! DMAC1_ITRIG_INMUX18 - DMAC1 input trigger inmux 18 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX18(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX18_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX18_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX19_MASK (0x80000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX19_SHIFT (19U)\r\n/*! DMAC1_ITRIG_INMUX19 - DMAC1 input trigger inmux 19 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX19(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX19_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX19_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX20_MASK (0x100000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX20_SHIFT (20U)\r\n/*! DMAC1_ITRIG_INMUX20 - DMAC1 input trigger inmux 20 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX20(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX20_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX20_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX21_MASK (0x200000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX21_SHIFT (21U)\r\n/*! DMAC1_ITRIG_INMUX21 - DMAC1 input trigger inmux 21 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX21(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX21_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX21_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX22_MASK (0x400000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX22_SHIFT (22U)\r\n/*! DMAC1_ITRIG_INMUX22 - DMAC1 input trigger inmux 22 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX22(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX22_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX22_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX23_MASK (0x800000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX23_SHIFT (23U)\r\n/*! DMAC1_ITRIG_INMUX23 - DMAC1 input trigger inmux 23 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX23(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX23_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX23_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX24_MASK (0x1000000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX24_SHIFT (24U)\r\n/*! DMAC1_ITRIG_INMUX24 - DMAC1 input trigger inmux 24 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX24(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX24_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX24_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX25_MASK (0x2000000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX25_SHIFT (25U)\r\n/*! DMAC1_ITRIG_INMUX25 - DMAC1 input trigger inmux 25 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX25(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX25_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX25_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX26_MASK (0x4000000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX26_SHIFT (26U)\r\n/*! DMAC1_ITRIG_INMUX26 - DMAC1 input trigger inmux 25 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX26(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX26_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX26_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX27_MASK (0x8000000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX27_SHIFT (27U)\r\n/*! DMAC1_ITRIG_INMUX27 - DMAC1 input trigger inmux 25 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX27(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX27_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX27_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX28_MASK (0x10000000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX28_SHIFT (28U)\r\n/*! DMAC1_ITRIG_INMUX28 - DMAC1 input trigger inmux 25 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX28(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX28_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX28_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX29_MASK (0x20000000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX29_SHIFT (29U)\r\n/*! DMAC1_ITRIG_INMUX29 - DMAC1 input trigger inmux 25 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX29(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX29_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_SET_DMAC1_ITRIG_INMUX29_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMAC1_ITRIG_ENA1_SET - DMAC1 input trigger enable set 1 */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA1_SET_DMAC1_ITRIG_INMUX0_MASK (0x1U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA1_SET_DMAC1_ITRIG_INMUX0_SHIFT (0U)\r\n/*! DMAC1_ITRIG_INMUX0 - DMAC1 input trigger inmux 0 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA1_SET_DMAC1_ITRIG_INMUX0(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA1_SET_DMAC1_ITRIG_INMUX0_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA1_SET_DMAC1_ITRIG_INMUX0_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA1_SET_DMAC1_ITRIG_INMUX1_MASK (0x2U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA1_SET_DMAC1_ITRIG_INMUX1_SHIFT (1U)\r\n/*! DMAC1_ITRIG_INMUX1 - DMAC1 input trigger inmux 1 enable set\r\n *  0b0..No Effect\r\n *  0b1..Sets the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA1_SET_DMAC1_ITRIG_INMUX1(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA1_SET_DMAC1_ITRIG_INMUX1_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA1_SET_DMAC1_ITRIG_INMUX1_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMAC1_ITRIG_ENA0_CLR - DMAC1 input trigger enable clear 0 */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX0_MASK (0x1U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX0_SHIFT (0U)\r\n/*! DMAC1_ITRIG_INMUX0 - DMAC1 input trigger inmux 0 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX0(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX0_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX0_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX1_MASK (0x2U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX1_SHIFT (1U)\r\n/*! DMAC1_ITRIG_INMUX1 - DMAC1 input trigger inmux 1 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX1(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX1_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX1_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX2_MASK (0x4U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX2_SHIFT (2U)\r\n/*! DMAC1_ITRIG_INMUX2 - DMAC1 input trigger inmux 2 enable clear */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX2(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX2_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX2_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX3_MASK (0x8U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX3_SHIFT (3U)\r\n/*! DMAC1_ITRIG_INMUX3 - DMAC1 input trigger inmux 3 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX3(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX3_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX3_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX4_MASK (0x10U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX4_SHIFT (4U)\r\n/*! DMAC1_ITRIG_INMUX4 - DMAC1 input trigger inmux 4 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX4(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX4_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX4_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX5_MASK (0x20U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX5_SHIFT (5U)\r\n/*! DMAC1_ITRIG_INMUX5 - DMAC1 input trigger inmux 5 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX5(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX5_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX5_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX6_MASK (0x40U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX6_SHIFT (6U)\r\n/*! DMAC1_ITRIG_INMUX6 - DMAC1 input trigger inmux 6 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX6(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX6_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX6_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX7_MASK (0x80U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX7_SHIFT (7U)\r\n/*! DMAC1_ITRIG_INMUX7 - DMAC1 input trigger inmux 7 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX7(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX7_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX7_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX8_MASK (0x100U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX8_SHIFT (8U)\r\n/*! DMAC1_ITRIG_INMUX8 - DMAC1 input trigger inmux 8 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX8(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX8_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX8_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX9_MASK (0x200U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX9_SHIFT (9U)\r\n/*! DMAC1_ITRIG_INMUX9 - DMAC1 input trigger inmux 9 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX9(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX9_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX9_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX10_MASK (0x400U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX10_SHIFT (10U)\r\n/*! DMAC1_ITRIG_INMUX10 - DMAC1 input trigger inmux 10 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX10(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX10_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX10_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX11_MASK (0x800U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX11_SHIFT (11U)\r\n/*! DMAC1_ITRIG_INMUX11 - DMAC1 input trigger inmux 11 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX11(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX11_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX11_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX12_MASK (0x1000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX12_SHIFT (12U)\r\n/*! DMAC1_ITRIG_INMUX12 - DMAC1 input trigger inmux 12 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX12(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX12_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX12_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX13_MASK (0x2000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX13_SHIFT (13U)\r\n/*! DMAC1_ITRIG_INMUX13 - DMAC1 input trigger inmux 13 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX13(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX13_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX13_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX14_MASK (0x4000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX14_SHIFT (14U)\r\n/*! DMAC1_ITRIG_INMUX14 - DMAC1 input trigger inmux 14 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX14(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX14_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX14_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX15_MASK (0x8000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX15_SHIFT (15U)\r\n/*! DMAC1_ITRIG_INMUX15 - DMAC1 input trigger inmux 15 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX15(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX15_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX15_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX16_MASK (0x10000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX16_SHIFT (16U)\r\n/*! DMAC1_ITRIG_INMUX16 - DMAC1 input trigger inmux 16 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX16(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX16_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX16_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX17_MASK (0x20000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX17_SHIFT (17U)\r\n/*! DMAC1_ITRIG_INMUX17 - DMAC1 input trigger inmux 17 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX17(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX17_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX17_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX18_MASK (0x40000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX18_SHIFT (18U)\r\n/*! DMAC1_ITRIG_INMUX18 - DMAC1 input trigger inmux 18 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX18(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX18_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX18_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX19_MASK (0x80000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX19_SHIFT (19U)\r\n/*! DMAC1_ITRIG_INMUX19 - DMAC1 input trigger inmux 19 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX19(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX19_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX19_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX20_MASK (0x100000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX20_SHIFT (20U)\r\n/*! DMAC1_ITRIG_INMUX20 - DMAC1 input trigger inmux 20 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX20(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX20_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX20_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX21_MASK (0x200000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX21_SHIFT (21U)\r\n/*! DMAC1_ITRIG_INMUX21 - DMAC1 input trigger inmux 21 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX21(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX21_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX21_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX22_MASK (0x400000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX22_SHIFT (22U)\r\n/*! DMAC1_ITRIG_INMUX22 - DMAC1 input trigger inmux 22 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX22(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX22_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX22_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX23_MASK (0x800000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX23_SHIFT (23U)\r\n/*! DMAC1_ITRIG_INMUX23 - DMAC1 input trigger inmux 23 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX23(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX23_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX23_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX24_MASK (0x1000000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX24_SHIFT (24U)\r\n/*! DMAC1_ITRIG_INMUX24 - DMAC1 input trigger inmux 24 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX24(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX24_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX24_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX25_MASK (0x2000000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX25_SHIFT (25U)\r\n/*! DMAC1_ITRIG_INMUX25 - DMAC1 input trigger inmux 25 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX25(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX25_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX25_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX26_MASK (0x4000000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX26_SHIFT (26U)\r\n/*! DMAC1_ITRIG_INMUX26 - DMAC1 input trigger inmux 25 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX26(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX26_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX26_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX27_MASK (0x8000000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX27_SHIFT (27U)\r\n/*! DMAC1_ITRIG_INMUX27 - DMAC1 input trigger inmux 25 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX27(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX27_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX27_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX28_MASK (0x10000000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX28_SHIFT (28U)\r\n/*! DMAC1_ITRIG_INMUX28 - DMAC1 input trigger inmux 25 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX28(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX28_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX28_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX29_MASK (0x20000000U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX29_SHIFT (29U)\r\n/*! DMAC1_ITRIG_INMUX29 - DMAC1 input trigger inmux 25 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX29(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX29_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA0_CLR_DMAC1_ITRIG_INMUX29_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMAC1_ITRIG_ENA1_CLR - DMAC1 input trigger enable clear 1 */\r\n/*! @{ */\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA1_CLR_DMAC1_ITRIG_INMUX0_MASK (0x1U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA1_CLR_DMAC1_ITRIG_INMUX0_SHIFT (0U)\r\n/*! DMAC1_ITRIG_INMUX0 - DMAC1 input trigger inmux 0 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA1_CLR_DMAC1_ITRIG_INMUX0(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA1_CLR_DMAC1_ITRIG_INMUX0_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA1_CLR_DMAC1_ITRIG_INMUX0_MASK)\r\n\r\n#define INPUTMUX_DMAC1_ITRIG_ENA1_CLR_DMAC1_ITRIG_INMUX1_MASK (0x2U)\r\n#define INPUTMUX_DMAC1_ITRIG_ENA1_CLR_DMAC1_ITRIG_INMUX1_SHIFT (1U)\r\n/*! DMAC1_ITRIG_INMUX1 - DMAC1 input trigger inmux 1 enable clear\r\n *  0b0..No Effect\r\n *  0b1..clears the ENA0 Bit\r\n */\r\n#define INPUTMUX_DMAC1_ITRIG_ENA1_CLR_DMAC1_ITRIG_INMUX1(x) (((uint32_t)(((uint32_t)(x)) << INPUTMUX_DMAC1_ITRIG_ENA1_CLR_DMAC1_ITRIG_INMUX1_SHIFT)) & INPUTMUX_DMAC1_ITRIG_ENA1_CLR_DMAC1_ITRIG_INMUX1_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group INPUTMUX_Register_Masks */\r\n\r\n\r\n/* INPUTMUX - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral INPUTMUX base address */\r\n  #define INPUTMUX_BASE                            (0x50026000u)\r\n  /** Peripheral INPUTMUX base address */\r\n  #define INPUTMUX_BASE_NS                         (0x40026000u)\r\n  /** Peripheral INPUTMUX base pointer */\r\n  #define INPUTMUX                                 ((INPUTMUX_Type *)INPUTMUX_BASE)\r\n  /** Peripheral INPUTMUX base pointer */\r\n  #define INPUTMUX_NS                              ((INPUTMUX_Type *)INPUTMUX_BASE_NS)\r\n  /** Array initializer of INPUTMUX peripheral base addresses */\r\n  #define INPUTMUX_BASE_ADDRS                      { INPUTMUX_BASE }\r\n  /** Array initializer of INPUTMUX peripheral base pointers */\r\n  #define INPUTMUX_BASE_PTRS                       { INPUTMUX }\r\n  /** Array initializer of INPUTMUX peripheral base addresses */\r\n  #define INPUTMUX_BASE_ADDRS_NS                   { INPUTMUX_BASE_NS }\r\n  /** Array initializer of INPUTMUX peripheral base pointers */\r\n  #define INPUTMUX_BASE_PTRS_NS                    { INPUTMUX_NS }\r\n#else\r\n  /** Peripheral INPUTMUX base address */\r\n  #define INPUTMUX_BASE                            (0x40026000u)\r\n  /** Peripheral INPUTMUX base pointer */\r\n  #define INPUTMUX                                 ((INPUTMUX_Type *)INPUTMUX_BASE)\r\n  /** Array initializer of INPUTMUX peripheral base addresses */\r\n  #define INPUTMUX_BASE_ADDRS                      { INPUTMUX_BASE }\r\n  /** Array initializer of INPUTMUX peripheral base pointers */\r\n  #define INPUTMUX_BASE_PTRS                       { INPUTMUX }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group INPUTMUX_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- ITRC Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup ITRC_Peripheral_Access_Layer ITRC Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** ITRC - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t STATUS0;                           /**< Status0 register, offset: 0x0 */\r\n  __IO uint32_t STATUS1;                           /**< Status1 register, offset: 0x4 */\r\n  __IO uint32_t OUT0_SEL0;                         /**< ITRC_IRQ Trigger source selector 0 register for Event 0 to 15., offset: 0x8 */\r\n  __IO uint32_t OUT0_SEL1;                         /**< ITRC_IRQ Trigger source selector 1 register for Event 0 to 15., offset: 0xC */\r\n  __IO uint32_t OUT1_SEL0;                         /**< CHIP_RESET Trigger source selector 0 register for Event 0 to 15., offset: 0x10 */\r\n  __IO uint32_t OUT1_SEL1;                         /**< CHIP_RESET Trigger source selector 1 register for Event 0 to 15., offset: 0x14 */\r\n       uint8_t RESERVED_0[48];\r\n  __IO uint32_t OUT0_SEL0_EVENT16_31;              /**< ITRC_IRQ Trigger source selector 0 register for Event 16 to 31., offset: 0x48 */\r\n  __IO uint32_t OUT0_SEL1_EVENT16_31;              /**< ITRC_IRQ Trigger source selector 1 register for Event 16 to 31., offset: 0x4C */\r\n  __IO uint32_t OUT1_SEL0_EVENT16_31;              /**< CHIP_RESET Trigger source selector 0 register for Event 16 to 31., offset: 0x50 */\r\n  __IO uint32_t OUT1_SEL1_EVENT16_31;              /**< CHIP_RESET Trigger source selector 1 register for Event 16 to 31., offset: 0x54 */\r\n       uint8_t RESERVED_1[152];\r\n  __O  uint32_t SW_EVENT0;                         /**< Software event 0, offset: 0xF0 */\r\n  __O  uint32_t SW_EVENT1;                         /**< Software event 1, offset: 0xF4 */\r\n} ITRC_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- ITRC Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup ITRC_Register_Masks ITRC Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name STATUS0 - Status0 register */\r\n/*! @{ */\r\n\r\n#define ITRC_STATUS0_IN0_STATUS_MASK             (0x1U)\r\n#define ITRC_STATUS0_IN0_STATUS_SHIFT            (0U)\r\n/*! IN0_STATUS - CAU Temeprature Sensor detector event occurred. */\r\n#define ITRC_STATUS0_IN0_STATUS(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS0_IN0_STATUS_SHIFT)) & ITRC_STATUS0_IN0_STATUS_MASK)\r\n\r\n#define ITRC_STATUS0_IN1_STATUS_MASK             (0x2U)\r\n#define ITRC_STATUS0_IN1_STATUS_SHIFT            (1U)\r\n/*! IN1_STATUS - PMIP Temperature Sensor detector event occurred. */\r\n#define ITRC_STATUS0_IN1_STATUS(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS0_IN1_STATUS_SHIFT)) & ITRC_STATUS0_IN1_STATUS_MASK)\r\n\r\n#define ITRC_STATUS0_IN2_STATUS_MASK             (0x4U)\r\n#define ITRC_STATUS0_IN2_STATUS_SHIFT            (2U)\r\n/*! IN2_STATUS - Voltage Sensor detector event occured on VDD_CORE rail. */\r\n#define ITRC_STATUS0_IN2_STATUS(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS0_IN2_STATUS_SHIFT)) & ITRC_STATUS0_IN2_STATUS_MASK)\r\n\r\n#define ITRC_STATUS0_IN3_STATUS_MASK             (0x8U)\r\n#define ITRC_STATUS0_IN3_STATUS_SHIFT            (3U)\r\n/*! IN3_STATUS - Voltage Sensor detector event occured on VDD_18 rail. */\r\n#define ITRC_STATUS0_IN3_STATUS(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS0_IN3_STATUS_SHIFT)) & ITRC_STATUS0_IN3_STATUS_MASK)\r\n\r\n#define ITRC_STATUS0_IN4_STATUS_MASK             (0x10U)\r\n#define ITRC_STATUS0_IN4_STATUS_SHIFT            (4U)\r\n/*! IN4_STATUS - Voltage Sensor detector event occured on VDD_33 rail. */\r\n#define ITRC_STATUS0_IN4_STATUS(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS0_IN4_STATUS_SHIFT)) & ITRC_STATUS0_IN4_STATUS_MASK)\r\n\r\n#define ITRC_STATUS0_IN5_STATUS_MASK             (0x20U)\r\n#define ITRC_STATUS0_IN5_STATUS_SHIFT            (5U)\r\n/*! IN5_STATUS - CAU Analog glitch sensor event occurred on VDD_CORE rail. */\r\n#define ITRC_STATUS0_IN5_STATUS(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS0_IN5_STATUS_SHIFT)) & ITRC_STATUS0_IN5_STATUS_MASK)\r\n\r\n#define ITRC_STATUS0_IN6_STATUS_MASK             (0x40U)\r\n#define ITRC_STATUS0_IN6_STATUS_SHIFT            (6U)\r\n/*! IN6_STATUS - Analog Sensor configuration control anamoly detected. */\r\n#define ITRC_STATUS0_IN6_STATUS(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS0_IN6_STATUS_SHIFT)) & ITRC_STATUS0_IN6_STATUS_MASK)\r\n\r\n#define ITRC_STATUS0_IN7_STATUS_MASK             (0x80U)\r\n#define ITRC_STATUS0_IN7_STATUS_SHIFT            (7U)\r\n/*! IN7_STATUS - AHB secure bus checkers detected illegal access. */\r\n#define ITRC_STATUS0_IN7_STATUS(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS0_IN7_STATUS_SHIFT)) & ITRC_STATUS0_IN7_STATUS_MASK)\r\n\r\n#define ITRC_STATUS0_IN8_STATUS_MASK             (0x100U)\r\n#define ITRC_STATUS0_IN8_STATUS_SHIFT            (8U)\r\n/*! IN8_STATUS - Code watchdog detected an code execution anomaly. */\r\n#define ITRC_STATUS0_IN8_STATUS(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS0_IN8_STATUS_SHIFT)) & ITRC_STATUS0_IN8_STATUS_MASK)\r\n\r\n#define ITRC_STATUS0_IN9_STATUS_MASK             (0x200U)\r\n#define ITRC_STATUS0_IN9_STATUS_SHIFT            (9U)\r\n/*! IN9_STATUS - ELS error event occurred. */\r\n#define ITRC_STATUS0_IN9_STATUS(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS0_IN9_STATUS_SHIFT)) & ITRC_STATUS0_IN9_STATUS_MASK)\r\n\r\n#define ITRC_STATUS0_IN10_STATUS_MASK            (0x400U)\r\n#define ITRC_STATUS0_IN10_STATUS_SHIFT           (10U)\r\n/*! IN10_STATUS - PKC module detected an error event. */\r\n#define ITRC_STATUS0_IN10_STATUS(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS0_IN10_STATUS_SHIFT)) & ITRC_STATUS0_IN10_STATUS_MASK)\r\n\r\n#define ITRC_STATUS0_IN11_STATUS_MASK            (0x800U)\r\n#define ITRC_STATUS0_IN11_STATUS_SHIFT           (11U)\r\n/*! IN11_STATUS - OTP module detected an error event. */\r\n#define ITRC_STATUS0_IN11_STATUS(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS0_IN11_STATUS_SHIFT)) & ITRC_STATUS0_IN11_STATUS_MASK)\r\n\r\n#define ITRC_STATUS0_IN12_STATUS_MASK            (0x1000U)\r\n#define ITRC_STATUS0_IN12_STATUS_SHIFT           (12U)\r\n/*! IN12_STATUS - Prince IP module detected an error event. */\r\n#define ITRC_STATUS0_IN12_STATUS(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS0_IN12_STATUS_SHIFT)) & ITRC_STATUS0_IN12_STATUS_MASK)\r\n\r\n#define ITRC_STATUS0_IN13_STATUS_MASK            (0x2000U)\r\n#define ITRC_STATUS0_IN13_STATUS_SHIFT           (13U)\r\n/*! IN13_STATUS - ELS glitch detector module detected an error event. */\r\n#define ITRC_STATUS0_IN13_STATUS(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS0_IN13_STATUS_SHIFT)) & ITRC_STATUS0_IN13_STATUS_MASK)\r\n\r\n#define ITRC_STATUS0_IN14_STATUS_MASK            (0x4000U)\r\n#define ITRC_STATUS0_IN14_STATUS_SHIFT           (14U)\r\n/*! IN14_STATUS - Security IP Command violation error event. */\r\n#define ITRC_STATUS0_IN14_STATUS(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS0_IN14_STATUS_SHIFT)) & ITRC_STATUS0_IN14_STATUS_MASK)\r\n\r\n#define ITRC_STATUS0_IN15_STATUS_MASK            (0x8000U)\r\n#define ITRC_STATUS0_IN15_STATUS_SHIFT           (15U)\r\n/*! IN15_STATUS - True Random Number generator error event. */\r\n#define ITRC_STATUS0_IN15_STATUS(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS0_IN15_STATUS_SHIFT)) & ITRC_STATUS0_IN15_STATUS_MASK)\r\n\r\n#define ITRC_STATUS0_OUT0_STATUS_MASK            (0x10000U)\r\n#define ITRC_STATUS0_OUT0_STATUS_SHIFT           (16U)\r\n/*! OUT0_STATUS - ITRC triggered ITRC_IRQ output. */\r\n#define ITRC_STATUS0_OUT0_STATUS(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS0_OUT0_STATUS_SHIFT)) & ITRC_STATUS0_OUT0_STATUS_MASK)\r\n\r\n#define ITRC_STATUS0_OUT1_STATUS_MASK            (0x20000U)\r\n#define ITRC_STATUS0_OUT1_STATUS_SHIFT           (17U)\r\n/*! OUT1_STATUS - ITRC triggered CHIP_RESET to reset the chip after all other response process finished. */\r\n#define ITRC_STATUS0_OUT1_STATUS(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS0_OUT1_STATUS_SHIFT)) & ITRC_STATUS0_OUT1_STATUS_MASK)\r\n/*! @} */\r\n\r\n/*! @name STATUS1 - Status1 register */\r\n/*! @{ */\r\n\r\n#define ITRC_STATUS1_IN16_STATUS_MASK            (0x1U)\r\n#define ITRC_STATUS1_IN16_STATUS_SHIFT           (0U)\r\n/*! IN16_STATUS - PMIP Analog glitch sensor event occurred on VDD_18 rail. */\r\n#define ITRC_STATUS1_IN16_STATUS(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS1_IN16_STATUS_SHIFT)) & ITRC_STATUS1_IN16_STATUS_MASK)\r\n\r\n#define ITRC_STATUS1_IN17_STATUS_MASK            (0x2U)\r\n#define ITRC_STATUS1_IN17_STATUS_SHIFT           (1U)\r\n/*! IN17_STATUS - PMIP Analog glitch sensor event occurred on VDD_CORE rail. */\r\n#define ITRC_STATUS1_IN17_STATUS(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS1_IN17_STATUS_SHIFT)) & ITRC_STATUS1_IN17_STATUS_MASK)\r\n\r\n#define ITRC_STATUS1_IN18_STATUS_MASK            (0x4U)\r\n#define ITRC_STATUS1_IN18_STATUS_SHIFT           (2U)\r\n/*! IN18_STATUS - TCPU PLL UnLock Error occurred. */\r\n#define ITRC_STATUS1_IN18_STATUS(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS1_IN18_STATUS_SHIFT)) & ITRC_STATUS1_IN18_STATUS_MASK)\r\n\r\n#define ITRC_STATUS1_IN19_STATUS_MASK            (0x8U)\r\n#define ITRC_STATUS1_IN19_STATUS_SHIFT           (3U)\r\n/*! IN19_STATUS - T3 PLL UnLock Error occurred. */\r\n#define ITRC_STATUS1_IN19_STATUS(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS1_IN19_STATUS_SHIFT)) & ITRC_STATUS1_IN19_STATUS_MASK)\r\n\r\n#define ITRC_STATUS1_IN20_STATUS_MASK            (0x10U)\r\n#define ITRC_STATUS1_IN20_STATUS_SHIFT           (4U)\r\n/*! IN20_STATUS - Software event 0 occurred. */\r\n#define ITRC_STATUS1_IN20_STATUS(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS1_IN20_STATUS_SHIFT)) & ITRC_STATUS1_IN20_STATUS_MASK)\r\n\r\n#define ITRC_STATUS1_IN21_STATUS_MASK            (0x20U)\r\n#define ITRC_STATUS1_IN21_STATUS_SHIFT           (5U)\r\n/*! IN21_STATUS - Software event 1 occurred. */\r\n#define ITRC_STATUS1_IN21_STATUS(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_STATUS1_IN21_STATUS_SHIFT)) & ITRC_STATUS1_IN21_STATUS_MASK)\r\n/*! @} */\r\n\r\n/*! @name OUT0_SEL0 - ITRC_IRQ Trigger source selector 0 register for Event 0 to 15. */\r\n/*! @{ */\r\n\r\n#define ITRC_OUT0_SEL0_IN0_SEL0_MASK             (0x3U)\r\n#define ITRC_OUT0_SEL0_IN0_SEL0_SHIFT            (0U)\r\n/*! IN0_SEL0 - Selects CAU Temeprature Sensor event as a trigger source. */\r\n#define ITRC_OUT0_SEL0_IN0_SEL0(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_IN0_SEL0_SHIFT)) & ITRC_OUT0_SEL0_IN0_SEL0_MASK)\r\n\r\n#define ITRC_OUT0_SEL0_IN1_SEL0_MASK             (0xCU)\r\n#define ITRC_OUT0_SEL0_IN1_SEL0_SHIFT            (2U)\r\n/*! IN1_SEL0 - Selects PMIP Temperature Sensor event as a trigger source. */\r\n#define ITRC_OUT0_SEL0_IN1_SEL0(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_IN1_SEL0_SHIFT)) & ITRC_OUT0_SEL0_IN1_SEL0_MASK)\r\n\r\n#define ITRC_OUT0_SEL0_IN2_SEL0_MASK             (0x30U)\r\n#define ITRC_OUT0_SEL0_IN2_SEL0_SHIFT            (4U)\r\n/*! IN2_SEL0 - Selects Voltage Sensor detector event on VDD_CORE rail as a trigger source. */\r\n#define ITRC_OUT0_SEL0_IN2_SEL0(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_IN2_SEL0_SHIFT)) & ITRC_OUT0_SEL0_IN2_SEL0_MASK)\r\n\r\n#define ITRC_OUT0_SEL0_IN3_SEL0_MASK             (0xC0U)\r\n#define ITRC_OUT0_SEL0_IN3_SEL0_SHIFT            (6U)\r\n/*! IN3_SEL0 - Selects Voltage Sensor detector event on VDD_18 rail as a trigger source. */\r\n#define ITRC_OUT0_SEL0_IN3_SEL0(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_IN3_SEL0_SHIFT)) & ITRC_OUT0_SEL0_IN3_SEL0_MASK)\r\n\r\n#define ITRC_OUT0_SEL0_IN4_SEL0_MASK             (0x300U)\r\n#define ITRC_OUT0_SEL0_IN4_SEL0_SHIFT            (8U)\r\n/*! IN4_SEL0 - Selects Voltage Sensor detector event on VDD_33 rail as a trigger source. */\r\n#define ITRC_OUT0_SEL0_IN4_SEL0(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_IN4_SEL0_SHIFT)) & ITRC_OUT0_SEL0_IN4_SEL0_MASK)\r\n\r\n#define ITRC_OUT0_SEL0_IN5_SEL0_MASK             (0xC00U)\r\n#define ITRC_OUT0_SEL0_IN5_SEL0_SHIFT            (10U)\r\n/*! IN5_SEL0 - Selects Analog glitch sensor event on VDD_CORE rail as a trigger source. */\r\n#define ITRC_OUT0_SEL0_IN5_SEL0(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_IN5_SEL0_SHIFT)) & ITRC_OUT0_SEL0_IN5_SEL0_MASK)\r\n\r\n#define ITRC_OUT0_SEL0_IN6_SEL0_MASK             (0x3000U)\r\n#define ITRC_OUT0_SEL0_IN6_SEL0_SHIFT            (12U)\r\n/*! IN6_SEL0 - Selects Analog Sensor configuration anamoly event as a trigger source. */\r\n#define ITRC_OUT0_SEL0_IN6_SEL0(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_IN6_SEL0_SHIFT)) & ITRC_OUT0_SEL0_IN6_SEL0_MASK)\r\n\r\n#define ITRC_OUT0_SEL0_IN7_SEL0_MASK             (0xC000U)\r\n#define ITRC_OUT0_SEL0_IN7_SEL0_SHIFT            (14U)\r\n/*! IN7_SEL0 - Selects AHB secure bus illegal access event as a trigger source. */\r\n#define ITRC_OUT0_SEL0_IN7_SEL0(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_IN7_SEL0_SHIFT)) & ITRC_OUT0_SEL0_IN7_SEL0_MASK)\r\n\r\n#define ITRC_OUT0_SEL0_IN8_SEL0_MASK             (0x30000U)\r\n#define ITRC_OUT0_SEL0_IN8_SEL0_SHIFT            (16U)\r\n/*! IN8_SEL0 - Selects Code Watch Dog event as a trigger source. */\r\n#define ITRC_OUT0_SEL0_IN8_SEL0(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_IN8_SEL0_SHIFT)) & ITRC_OUT0_SEL0_IN8_SEL0_MASK)\r\n\r\n#define ITRC_OUT0_SEL0_IN9_SEL0_MASK             (0xC0000U)\r\n#define ITRC_OUT0_SEL0_IN9_SEL0_SHIFT            (18U)\r\n/*! IN9_SEL0 - Selects ELS error event as a trigger source. */\r\n#define ITRC_OUT0_SEL0_IN9_SEL0(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_IN9_SEL0_SHIFT)) & ITRC_OUT0_SEL0_IN9_SEL0_MASK)\r\n\r\n#define ITRC_OUT0_SEL0_IN10_SEL0_MASK            (0x300000U)\r\n#define ITRC_OUT0_SEL0_IN10_SEL0_SHIFT           (20U)\r\n/*! IN10_SEL0 - Selects PKC error event as a trigger source. */\r\n#define ITRC_OUT0_SEL0_IN10_SEL0(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_IN10_SEL0_SHIFT)) & ITRC_OUT0_SEL0_IN10_SEL0_MASK)\r\n\r\n#define ITRC_OUT0_SEL0_IN11_SEL0_MASK            (0xC00000U)\r\n#define ITRC_OUT0_SEL0_IN11_SEL0_SHIFT           (22U)\r\n/*! IN11_SEL0 - Selects OTP error event as a trigger source. */\r\n#define ITRC_OUT0_SEL0_IN11_SEL0(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_IN11_SEL0_SHIFT)) & ITRC_OUT0_SEL0_IN11_SEL0_MASK)\r\n\r\n#define ITRC_OUT0_SEL0_IN12_SEL0_MASK            (0x3000000U)\r\n#define ITRC_OUT0_SEL0_IN12_SEL0_SHIFT           (24U)\r\n/*! IN12_SEL0 - Selects PRINCE IP error event as a trigger source. */\r\n#define ITRC_OUT0_SEL0_IN12_SEL0(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_IN12_SEL0_SHIFT)) & ITRC_OUT0_SEL0_IN12_SEL0_MASK)\r\n\r\n#define ITRC_OUT0_SEL0_IN13_SEL0_MASK            (0xC000000U)\r\n#define ITRC_OUT0_SEL0_IN13_SEL0_SHIFT           (26U)\r\n/*! IN13_SEL0 - Selects ELS glitch detector error event as a trigger source. */\r\n#define ITRC_OUT0_SEL0_IN13_SEL0(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_IN13_SEL0_SHIFT)) & ITRC_OUT0_SEL0_IN13_SEL0_MASK)\r\n\r\n#define ITRC_OUT0_SEL0_IN14_SEL0_MASK            (0x30000000U)\r\n#define ITRC_OUT0_SEL0_IN14_SEL0_SHIFT           (28U)\r\n/*! IN14_SEL0 - Selects Security IP Command violation error event as a trigger source. */\r\n#define ITRC_OUT0_SEL0_IN14_SEL0(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_IN14_SEL0_SHIFT)) & ITRC_OUT0_SEL0_IN14_SEL0_MASK)\r\n\r\n#define ITRC_OUT0_SEL0_IN15_SEL0_MASK            (0xC0000000U)\r\n#define ITRC_OUT0_SEL0_IN15_SEL0_SHIFT           (30U)\r\n/*! IN15_SEL0 - Selects TRNG violation error event as a trigger source. */\r\n#define ITRC_OUT0_SEL0_IN15_SEL0(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_IN15_SEL0_SHIFT)) & ITRC_OUT0_SEL0_IN15_SEL0_MASK)\r\n/*! @} */\r\n\r\n/*! @name OUT0_SEL1 - ITRC_IRQ Trigger source selector 1 register for Event 0 to 15. */\r\n/*! @{ */\r\n\r\n#define ITRC_OUT0_SEL1_IN0_SEL1_MASK             (0x3U)\r\n#define ITRC_OUT0_SEL1_IN0_SEL1_SHIFT            (0U)\r\n/*! IN0_SEL1 - Selects CAU Temeprature Sensor event as a trigger source. */\r\n#define ITRC_OUT0_SEL1_IN0_SEL1(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_IN0_SEL1_SHIFT)) & ITRC_OUT0_SEL1_IN0_SEL1_MASK)\r\n\r\n#define ITRC_OUT0_SEL1_IN1_SEL1_MASK             (0xCU)\r\n#define ITRC_OUT0_SEL1_IN1_SEL1_SHIFT            (2U)\r\n/*! IN1_SEL1 - Selects PMIP Temperature Sensor event as a trigger source. */\r\n#define ITRC_OUT0_SEL1_IN1_SEL1(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_IN1_SEL1_SHIFT)) & ITRC_OUT0_SEL1_IN1_SEL1_MASK)\r\n\r\n#define ITRC_OUT0_SEL1_IN2_SEL1_MASK             (0x30U)\r\n#define ITRC_OUT0_SEL1_IN2_SEL1_SHIFT            (4U)\r\n/*! IN2_SEL1 - Selects Voltage Sensor detector event on VDD_CORE rail as a trigger source. */\r\n#define ITRC_OUT0_SEL1_IN2_SEL1(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_IN2_SEL1_SHIFT)) & ITRC_OUT0_SEL1_IN2_SEL1_MASK)\r\n\r\n#define ITRC_OUT0_SEL1_IN3_SEL1_MASK             (0xC0U)\r\n#define ITRC_OUT0_SEL1_IN3_SEL1_SHIFT            (6U)\r\n/*! IN3_SEL1 - Selects Voltage Sensor detector event on VDD_18 rail as a trigger source. */\r\n#define ITRC_OUT0_SEL1_IN3_SEL1(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_IN3_SEL1_SHIFT)) & ITRC_OUT0_SEL1_IN3_SEL1_MASK)\r\n\r\n#define ITRC_OUT0_SEL1_IN4_SEL1_MASK             (0x300U)\r\n#define ITRC_OUT0_SEL1_IN4_SEL1_SHIFT            (8U)\r\n/*! IN4_SEL1 - Selects Voltage Sensor detector event on VDD_33 rail as a trigger source. */\r\n#define ITRC_OUT0_SEL1_IN4_SEL1(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_IN4_SEL1_SHIFT)) & ITRC_OUT0_SEL1_IN4_SEL1_MASK)\r\n\r\n#define ITRC_OUT0_SEL1_IN5_SEL1_MASK             (0xC00U)\r\n#define ITRC_OUT0_SEL1_IN5_SEL1_SHIFT            (10U)\r\n/*! IN5_SEL1 - Selects Analog glitch sensor event on VDD_CORE rail as a trigger source. */\r\n#define ITRC_OUT0_SEL1_IN5_SEL1(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_IN5_SEL1_SHIFT)) & ITRC_OUT0_SEL1_IN5_SEL1_MASK)\r\n\r\n#define ITRC_OUT0_SEL1_IN6_SEL1_MASK             (0x3000U)\r\n#define ITRC_OUT0_SEL1_IN6_SEL1_SHIFT            (12U)\r\n/*! IN6_SEL1 - >Selects Analog Sensor configuration anamoly event as a trigger source. */\r\n#define ITRC_OUT0_SEL1_IN6_SEL1(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_IN6_SEL1_SHIFT)) & ITRC_OUT0_SEL1_IN6_SEL1_MASK)\r\n\r\n#define ITRC_OUT0_SEL1_IN7_SEL1_MASK             (0xC000U)\r\n#define ITRC_OUT0_SEL1_IN7_SEL1_SHIFT            (14U)\r\n/*! IN7_SEL1 - Selects AHB secure bus illegal access event as a trigger source. */\r\n#define ITRC_OUT0_SEL1_IN7_SEL1(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_IN7_SEL1_SHIFT)) & ITRC_OUT0_SEL1_IN7_SEL1_MASK)\r\n\r\n#define ITRC_OUT0_SEL1_IN8_SEL1_MASK             (0x30000U)\r\n#define ITRC_OUT0_SEL1_IN8_SEL1_SHIFT            (16U)\r\n/*! IN8_SEL1 - Selects Code Watch Dog event as a trigger source. */\r\n#define ITRC_OUT0_SEL1_IN8_SEL1(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_IN8_SEL1_SHIFT)) & ITRC_OUT0_SEL1_IN8_SEL1_MASK)\r\n\r\n#define ITRC_OUT0_SEL1_IN9_SEL1_MASK             (0xC0000U)\r\n#define ITRC_OUT0_SEL1_IN9_SEL1_SHIFT            (18U)\r\n/*! IN9_SEL1 - Selects ELS error event as a trigger source. */\r\n#define ITRC_OUT0_SEL1_IN9_SEL1(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_IN9_SEL1_SHIFT)) & ITRC_OUT0_SEL1_IN9_SEL1_MASK)\r\n\r\n#define ITRC_OUT0_SEL1_IN10_SEL1_MASK            (0x300000U)\r\n#define ITRC_OUT0_SEL1_IN10_SEL1_SHIFT           (20U)\r\n/*! IN10_SEL1 - Selects PKC error event as a trigger source. */\r\n#define ITRC_OUT0_SEL1_IN10_SEL1(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_IN10_SEL1_SHIFT)) & ITRC_OUT0_SEL1_IN10_SEL1_MASK)\r\n\r\n#define ITRC_OUT0_SEL1_IN11_SEL1_MASK            (0xC00000U)\r\n#define ITRC_OUT0_SEL1_IN11_SEL1_SHIFT           (22U)\r\n/*! IN11_SEL1 - Selects OTP error event as a trigger source. */\r\n#define ITRC_OUT0_SEL1_IN11_SEL1(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_IN11_SEL1_SHIFT)) & ITRC_OUT0_SEL1_IN11_SEL1_MASK)\r\n\r\n#define ITRC_OUT0_SEL1_IN12_SEL1_MASK            (0x3000000U)\r\n#define ITRC_OUT0_SEL1_IN12_SEL1_SHIFT           (24U)\r\n/*! IN12_SEL1 - Selects PRINCE IP error event as a trigger source. */\r\n#define ITRC_OUT0_SEL1_IN12_SEL1(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_IN12_SEL1_SHIFT)) & ITRC_OUT0_SEL1_IN12_SEL1_MASK)\r\n\r\n#define ITRC_OUT0_SEL1_IN13_SEL1_MASK            (0xC000000U)\r\n#define ITRC_OUT0_SEL1_IN13_SEL1_SHIFT           (26U)\r\n/*! IN13_SEL1 - Selects ELS glitch detector error event as a trigger source. */\r\n#define ITRC_OUT0_SEL1_IN13_SEL1(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_IN13_SEL1_SHIFT)) & ITRC_OUT0_SEL1_IN13_SEL1_MASK)\r\n\r\n#define ITRC_OUT0_SEL1_IN14_SEL1_MASK            (0x30000000U)\r\n#define ITRC_OUT0_SEL1_IN14_SEL1_SHIFT           (28U)\r\n/*! IN14_SEL1 - Selects Security IP Command violation error event as a trigger source. */\r\n#define ITRC_OUT0_SEL1_IN14_SEL1(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_IN14_SEL1_SHIFT)) & ITRC_OUT0_SEL1_IN14_SEL1_MASK)\r\n\r\n#define ITRC_OUT0_SEL1_IN15_SEL1_MASK            (0xC0000000U)\r\n#define ITRC_OUT0_SEL1_IN15_SEL1_SHIFT           (30U)\r\n/*! IN15_SEL1 - Selects TRNG violation error event as a trigger source. */\r\n#define ITRC_OUT0_SEL1_IN15_SEL1(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_IN15_SEL1_SHIFT)) & ITRC_OUT0_SEL1_IN15_SEL1_MASK)\r\n/*! @} */\r\n\r\n/*! @name OUT1_SEL0 - CHIP_RESET Trigger source selector 0 register for Event 0 to 15. */\r\n/*! @{ */\r\n\r\n#define ITRC_OUT1_SEL0_IN0_SEL0_MASK             (0x3U)\r\n#define ITRC_OUT1_SEL0_IN0_SEL0_SHIFT            (0U)\r\n/*! IN0_SEL0 - Selects CAU Temeprature Sensor event as a trigger source. */\r\n#define ITRC_OUT1_SEL0_IN0_SEL0(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_IN0_SEL0_SHIFT)) & ITRC_OUT1_SEL0_IN0_SEL0_MASK)\r\n\r\n#define ITRC_OUT1_SEL0_IN1_SEL0_MASK             (0xCU)\r\n#define ITRC_OUT1_SEL0_IN1_SEL0_SHIFT            (2U)\r\n/*! IN1_SEL0 - Selects PMIP Temperature Sensor event as a trigger source. */\r\n#define ITRC_OUT1_SEL0_IN1_SEL0(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_IN1_SEL0_SHIFT)) & ITRC_OUT1_SEL0_IN1_SEL0_MASK)\r\n\r\n#define ITRC_OUT1_SEL0_IN2_SEL0_MASK             (0x30U)\r\n#define ITRC_OUT1_SEL0_IN2_SEL0_SHIFT            (4U)\r\n/*! IN2_SEL0 - Selects Voltage Sensor detector event on VDD_CORE rail as a trigger source. */\r\n#define ITRC_OUT1_SEL0_IN2_SEL0(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_IN2_SEL0_SHIFT)) & ITRC_OUT1_SEL0_IN2_SEL0_MASK)\r\n\r\n#define ITRC_OUT1_SEL0_IN3_SEL0_MASK             (0xC0U)\r\n#define ITRC_OUT1_SEL0_IN3_SEL0_SHIFT            (6U)\r\n/*! IN3_SEL0 - Selects Voltage Sensor detector event on VDD_18 rail as a trigger source. */\r\n#define ITRC_OUT1_SEL0_IN3_SEL0(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_IN3_SEL0_SHIFT)) & ITRC_OUT1_SEL0_IN3_SEL0_MASK)\r\n\r\n#define ITRC_OUT1_SEL0_IN4_SEL0_MASK             (0x300U)\r\n#define ITRC_OUT1_SEL0_IN4_SEL0_SHIFT            (8U)\r\n/*! IN4_SEL0 - Selects Voltage Sensor detector event on VDD_33 rail as a trigger source. */\r\n#define ITRC_OUT1_SEL0_IN4_SEL0(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_IN4_SEL0_SHIFT)) & ITRC_OUT1_SEL0_IN4_SEL0_MASK)\r\n\r\n#define ITRC_OUT1_SEL0_IN5_SEL0_MASK             (0xC00U)\r\n#define ITRC_OUT1_SEL0_IN5_SEL0_SHIFT            (10U)\r\n/*! IN5_SEL0 - Selects Analog glitch sensor event on VDD_CORE rail as a trigger source. */\r\n#define ITRC_OUT1_SEL0_IN5_SEL0(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_IN5_SEL0_SHIFT)) & ITRC_OUT1_SEL0_IN5_SEL0_MASK)\r\n\r\n#define ITRC_OUT1_SEL0_IN6_SEL0_MASK             (0x3000U)\r\n#define ITRC_OUT1_SEL0_IN6_SEL0_SHIFT            (12U)\r\n/*! IN6_SEL0 - >Selects Analog Sensor configuration anamoly event as a trigger source. */\r\n#define ITRC_OUT1_SEL0_IN6_SEL0(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_IN6_SEL0_SHIFT)) & ITRC_OUT1_SEL0_IN6_SEL0_MASK)\r\n\r\n#define ITRC_OUT1_SEL0_IN7_SEL0_MASK             (0xC000U)\r\n#define ITRC_OUT1_SEL0_IN7_SEL0_SHIFT            (14U)\r\n/*! IN7_SEL0 - Selects AHB secure bus illegal access event as a trigger source. */\r\n#define ITRC_OUT1_SEL0_IN7_SEL0(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_IN7_SEL0_SHIFT)) & ITRC_OUT1_SEL0_IN7_SEL0_MASK)\r\n\r\n#define ITRC_OUT1_SEL0_IN8_SEL0_MASK             (0x30000U)\r\n#define ITRC_OUT1_SEL0_IN8_SEL0_SHIFT            (16U)\r\n/*! IN8_SEL0 - Selects Code Watch Dog event as a trigger source. */\r\n#define ITRC_OUT1_SEL0_IN8_SEL0(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_IN8_SEL0_SHIFT)) & ITRC_OUT1_SEL0_IN8_SEL0_MASK)\r\n\r\n#define ITRC_OUT1_SEL0_IN9_SEL0_MASK             (0xC0000U)\r\n#define ITRC_OUT1_SEL0_IN9_SEL0_SHIFT            (18U)\r\n/*! IN9_SEL0 - Selects ELS error event as a trigger source. */\r\n#define ITRC_OUT1_SEL0_IN9_SEL0(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_IN9_SEL0_SHIFT)) & ITRC_OUT1_SEL0_IN9_SEL0_MASK)\r\n\r\n#define ITRC_OUT1_SEL0_IN10_SEL0_MASK            (0x300000U)\r\n#define ITRC_OUT1_SEL0_IN10_SEL0_SHIFT           (20U)\r\n/*! IN10_SEL0 - Selects PKC error event as a trigger source. */\r\n#define ITRC_OUT1_SEL0_IN10_SEL0(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_IN10_SEL0_SHIFT)) & ITRC_OUT1_SEL0_IN10_SEL0_MASK)\r\n\r\n#define ITRC_OUT1_SEL0_IN11_SEL0_MASK            (0xC00000U)\r\n#define ITRC_OUT1_SEL0_IN11_SEL0_SHIFT           (22U)\r\n/*! IN11_SEL0 - Selects OTP error event as a trigger source. */\r\n#define ITRC_OUT1_SEL0_IN11_SEL0(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_IN11_SEL0_SHIFT)) & ITRC_OUT1_SEL0_IN11_SEL0_MASK)\r\n\r\n#define ITRC_OUT1_SEL0_IN12_SEL0_MASK            (0x3000000U)\r\n#define ITRC_OUT1_SEL0_IN12_SEL0_SHIFT           (24U)\r\n/*! IN12_SEL0 - Selects PRINCE IP error event as a trigger source. */\r\n#define ITRC_OUT1_SEL0_IN12_SEL0(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_IN12_SEL0_SHIFT)) & ITRC_OUT1_SEL0_IN12_SEL0_MASK)\r\n\r\n#define ITRC_OUT1_SEL0_IN13_SEL0_MASK            (0xC000000U)\r\n#define ITRC_OUT1_SEL0_IN13_SEL0_SHIFT           (26U)\r\n/*! IN13_SEL0 - Selects ELS glitch detector error event as a trigger source. */\r\n#define ITRC_OUT1_SEL0_IN13_SEL0(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_IN13_SEL0_SHIFT)) & ITRC_OUT1_SEL0_IN13_SEL0_MASK)\r\n\r\n#define ITRC_OUT1_SEL0_IN14_SEL0_MASK            (0x30000000U)\r\n#define ITRC_OUT1_SEL0_IN14_SEL0_SHIFT           (28U)\r\n/*! IN14_SEL0 - Selects Security IP Command violation error event as a trigger source. */\r\n#define ITRC_OUT1_SEL0_IN14_SEL0(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_IN14_SEL0_SHIFT)) & ITRC_OUT1_SEL0_IN14_SEL0_MASK)\r\n\r\n#define ITRC_OUT1_SEL0_IN15_SEL0_MASK            (0xC0000000U)\r\n#define ITRC_OUT1_SEL0_IN15_SEL0_SHIFT           (30U)\r\n/*! IN15_SEL0 - Selects TRNG violation error event as a trigger source. */\r\n#define ITRC_OUT1_SEL0_IN15_SEL0(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_IN15_SEL0_SHIFT)) & ITRC_OUT1_SEL0_IN15_SEL0_MASK)\r\n/*! @} */\r\n\r\n/*! @name OUT1_SEL1 - CHIP_RESET Trigger source selector 1 register for Event 0 to 15. */\r\n/*! @{ */\r\n\r\n#define ITRC_OUT1_SEL1_IN0_SEL1_MASK             (0x3U)\r\n#define ITRC_OUT1_SEL1_IN0_SEL1_SHIFT            (0U)\r\n/*! IN0_SEL1 - Selects CAU Temeprature Sensor event as a trigger source. */\r\n#define ITRC_OUT1_SEL1_IN0_SEL1(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_IN0_SEL1_SHIFT)) & ITRC_OUT1_SEL1_IN0_SEL1_MASK)\r\n\r\n#define ITRC_OUT1_SEL1_IN1_SEL1_MASK             (0xCU)\r\n#define ITRC_OUT1_SEL1_IN1_SEL1_SHIFT            (2U)\r\n/*! IN1_SEL1 - Selects PMIP Temperature Sensor event as a trigger source. */\r\n#define ITRC_OUT1_SEL1_IN1_SEL1(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_IN1_SEL1_SHIFT)) & ITRC_OUT1_SEL1_IN1_SEL1_MASK)\r\n\r\n#define ITRC_OUT1_SEL1_IN2_SEL1_MASK             (0x30U)\r\n#define ITRC_OUT1_SEL1_IN2_SEL1_SHIFT            (4U)\r\n/*! IN2_SEL1 - Selects Voltage Sensor detector event on VDD_CORE rail as a trigger source. */\r\n#define ITRC_OUT1_SEL1_IN2_SEL1(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_IN2_SEL1_SHIFT)) & ITRC_OUT1_SEL1_IN2_SEL1_MASK)\r\n\r\n#define ITRC_OUT1_SEL1_IN3_SEL1_MASK             (0xC0U)\r\n#define ITRC_OUT1_SEL1_IN3_SEL1_SHIFT            (6U)\r\n/*! IN3_SEL1 - Selects Voltage Sensor detector event on VDD_18 rail as a trigger source. */\r\n#define ITRC_OUT1_SEL1_IN3_SEL1(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_IN3_SEL1_SHIFT)) & ITRC_OUT1_SEL1_IN3_SEL1_MASK)\r\n\r\n#define ITRC_OUT1_SEL1_IN4_SEL1_MASK             (0x300U)\r\n#define ITRC_OUT1_SEL1_IN4_SEL1_SHIFT            (8U)\r\n/*! IN4_SEL1 - Selects Voltage Sensor detector event on VDD_33 rail as a trigger source. */\r\n#define ITRC_OUT1_SEL1_IN4_SEL1(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_IN4_SEL1_SHIFT)) & ITRC_OUT1_SEL1_IN4_SEL1_MASK)\r\n\r\n#define ITRC_OUT1_SEL1_IN5_SEL1_MASK             (0xC00U)\r\n#define ITRC_OUT1_SEL1_IN5_SEL1_SHIFT            (10U)\r\n/*! IN5_SEL1 - Selects Analog glitch sensor event on VDD_CORE rail as a trigger source. */\r\n#define ITRC_OUT1_SEL1_IN5_SEL1(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_IN5_SEL1_SHIFT)) & ITRC_OUT1_SEL1_IN5_SEL1_MASK)\r\n\r\n#define ITRC_OUT1_SEL1_IN6_SEL1_MASK             (0x3000U)\r\n#define ITRC_OUT1_SEL1_IN6_SEL1_SHIFT            (12U)\r\n/*! IN6_SEL1 - >Selects Analog Sensor configuration anamoly event as a trigger source. */\r\n#define ITRC_OUT1_SEL1_IN6_SEL1(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_IN6_SEL1_SHIFT)) & ITRC_OUT1_SEL1_IN6_SEL1_MASK)\r\n\r\n#define ITRC_OUT1_SEL1_IN7_SEL1_MASK             (0xC000U)\r\n#define ITRC_OUT1_SEL1_IN7_SEL1_SHIFT            (14U)\r\n/*! IN7_SEL1 - Selects AHB secure bus illegal access event as a trigger source. */\r\n#define ITRC_OUT1_SEL1_IN7_SEL1(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_IN7_SEL1_SHIFT)) & ITRC_OUT1_SEL1_IN7_SEL1_MASK)\r\n\r\n#define ITRC_OUT1_SEL1_IN8_SEL1_MASK             (0x30000U)\r\n#define ITRC_OUT1_SEL1_IN8_SEL1_SHIFT            (16U)\r\n/*! IN8_SEL1 - Selects Code Watch Dog event as a trigger source. */\r\n#define ITRC_OUT1_SEL1_IN8_SEL1(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_IN8_SEL1_SHIFT)) & ITRC_OUT1_SEL1_IN8_SEL1_MASK)\r\n\r\n#define ITRC_OUT1_SEL1_IN9_SEL1_MASK             (0xC0000U)\r\n#define ITRC_OUT1_SEL1_IN9_SEL1_SHIFT            (18U)\r\n/*! IN9_SEL1 - Selects ELS error event as a trigger source. */\r\n#define ITRC_OUT1_SEL1_IN9_SEL1(x)               (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_IN9_SEL1_SHIFT)) & ITRC_OUT1_SEL1_IN9_SEL1_MASK)\r\n\r\n#define ITRC_OUT1_SEL1_IN10_SEL1_MASK            (0x300000U)\r\n#define ITRC_OUT1_SEL1_IN10_SEL1_SHIFT           (20U)\r\n/*! IN10_SEL1 - Selects PKC error event as a trigger source. */\r\n#define ITRC_OUT1_SEL1_IN10_SEL1(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_IN10_SEL1_SHIFT)) & ITRC_OUT1_SEL1_IN10_SEL1_MASK)\r\n\r\n#define ITRC_OUT1_SEL1_IN11_SEL1_MASK            (0xC00000U)\r\n#define ITRC_OUT1_SEL1_IN11_SEL1_SHIFT           (22U)\r\n/*! IN11_SEL1 - Selects OTP error event as a trigger source. */\r\n#define ITRC_OUT1_SEL1_IN11_SEL1(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_IN11_SEL1_SHIFT)) & ITRC_OUT1_SEL1_IN11_SEL1_MASK)\r\n\r\n#define ITRC_OUT1_SEL1_IN12_SEL1_MASK            (0x3000000U)\r\n#define ITRC_OUT1_SEL1_IN12_SEL1_SHIFT           (24U)\r\n/*! IN12_SEL1 - Selects PRINCE IP error event as a trigger source. */\r\n#define ITRC_OUT1_SEL1_IN12_SEL1(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_IN12_SEL1_SHIFT)) & ITRC_OUT1_SEL1_IN12_SEL1_MASK)\r\n\r\n#define ITRC_OUT1_SEL1_IN13_SEL1_MASK            (0xC000000U)\r\n#define ITRC_OUT1_SEL1_IN13_SEL1_SHIFT           (26U)\r\n/*! IN13_SEL1 - Selects ELS glitch detector error event as a trigger source. */\r\n#define ITRC_OUT1_SEL1_IN13_SEL1(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_IN13_SEL1_SHIFT)) & ITRC_OUT1_SEL1_IN13_SEL1_MASK)\r\n\r\n#define ITRC_OUT1_SEL1_IN14_SEL1_MASK            (0x30000000U)\r\n#define ITRC_OUT1_SEL1_IN14_SEL1_SHIFT           (28U)\r\n/*! IN14_SEL1 - Selects Security IP Command violation error event as a trigger source. */\r\n#define ITRC_OUT1_SEL1_IN14_SEL1(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_IN14_SEL1_SHIFT)) & ITRC_OUT1_SEL1_IN14_SEL1_MASK)\r\n\r\n#define ITRC_OUT1_SEL1_IN15_SEL1_MASK            (0xC0000000U)\r\n#define ITRC_OUT1_SEL1_IN15_SEL1_SHIFT           (30U)\r\n/*! IN15_SEL1 - Selects TRNG violation error event as a trigger source. */\r\n#define ITRC_OUT1_SEL1_IN15_SEL1(x)              (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_IN15_SEL1_SHIFT)) & ITRC_OUT1_SEL1_IN15_SEL1_MASK)\r\n/*! @} */\r\n\r\n/*! @name OUT0_SEL0_EVENT16_31 - ITRC_IRQ Trigger source selector 0 register for Event 16 to 31. */\r\n/*! @{ */\r\n\r\n#define ITRC_OUT0_SEL0_EVENT16_31_IN16_SEL0_MASK (0x3U)\r\n#define ITRC_OUT0_SEL0_EVENT16_31_IN16_SEL0_SHIFT (0U)\r\n/*! IN16_SEL0 - Selects PMIP Analog glitch sensor event on VDD_18 rail as a trigger source. */\r\n#define ITRC_OUT0_SEL0_EVENT16_31_IN16_SEL0(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_EVENT16_31_IN16_SEL0_SHIFT)) & ITRC_OUT0_SEL0_EVENT16_31_IN16_SEL0_MASK)\r\n\r\n#define ITRC_OUT0_SEL0_EVENT16_31_IN17_SEL0_MASK (0xCU)\r\n#define ITRC_OUT0_SEL0_EVENT16_31_IN17_SEL0_SHIFT (2U)\r\n/*! IN17_SEL0 - Selects PMIP Analog glitch sensor event on VDD_CORE rail as a trigger source. */\r\n#define ITRC_OUT0_SEL0_EVENT16_31_IN17_SEL0(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_EVENT16_31_IN17_SEL0_SHIFT)) & ITRC_OUT0_SEL0_EVENT16_31_IN17_SEL0_MASK)\r\n\r\n#define ITRC_OUT0_SEL0_EVENT16_31_IN18_SEL0_MASK (0x30U)\r\n#define ITRC_OUT0_SEL0_EVENT16_31_IN18_SEL0_SHIFT (4U)\r\n/*! IN18_SEL0 - Selects TCPU PLL Unlock event as a trigger source. */\r\n#define ITRC_OUT0_SEL0_EVENT16_31_IN18_SEL0(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_EVENT16_31_IN18_SEL0_SHIFT)) & ITRC_OUT0_SEL0_EVENT16_31_IN18_SEL0_MASK)\r\n\r\n#define ITRC_OUT0_SEL0_EVENT16_31_IN19_SEL0_MASK (0xC0U)\r\n#define ITRC_OUT0_SEL0_EVENT16_31_IN19_SEL0_SHIFT (6U)\r\n/*! IN19_SEL0 - Selects T3 PLL Unlock event as a trigger source. */\r\n#define ITRC_OUT0_SEL0_EVENT16_31_IN19_SEL0(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_EVENT16_31_IN19_SEL0_SHIFT)) & ITRC_OUT0_SEL0_EVENT16_31_IN19_SEL0_MASK)\r\n\r\n#define ITRC_OUT0_SEL0_EVENT16_31_IN20_SEL0_MASK (0x300U)\r\n#define ITRC_OUT0_SEL0_EVENT16_31_IN20_SEL0_SHIFT (8U)\r\n/*! IN20_SEL0 - Selects software event 0 as a trigger source. */\r\n#define ITRC_OUT0_SEL0_EVENT16_31_IN20_SEL0(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_EVENT16_31_IN20_SEL0_SHIFT)) & ITRC_OUT0_SEL0_EVENT16_31_IN20_SEL0_MASK)\r\n\r\n#define ITRC_OUT0_SEL0_EVENT16_31_IN21_SEL0_MASK (0xC00U)\r\n#define ITRC_OUT0_SEL0_EVENT16_31_IN21_SEL0_SHIFT (10U)\r\n/*! IN21_SEL0 - Selects software event 1 as a trigger source. */\r\n#define ITRC_OUT0_SEL0_EVENT16_31_IN21_SEL0(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL0_EVENT16_31_IN21_SEL0_SHIFT)) & ITRC_OUT0_SEL0_EVENT16_31_IN21_SEL0_MASK)\r\n/*! @} */\r\n\r\n/*! @name OUT0_SEL1_EVENT16_31 - ITRC_IRQ Trigger source selector 1 register for Event 16 to 31. */\r\n/*! @{ */\r\n\r\n#define ITRC_OUT0_SEL1_EVENT16_31_IN16_SEL1_MASK (0x3U)\r\n#define ITRC_OUT0_SEL1_EVENT16_31_IN16_SEL1_SHIFT (0U)\r\n/*! IN16_SEL1 - Selects PMIP Analog glitch sensor event on VDD_18 rail as a trigger source. */\r\n#define ITRC_OUT0_SEL1_EVENT16_31_IN16_SEL1(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_EVENT16_31_IN16_SEL1_SHIFT)) & ITRC_OUT0_SEL1_EVENT16_31_IN16_SEL1_MASK)\r\n\r\n#define ITRC_OUT0_SEL1_EVENT16_31_IN17_SEL1_MASK (0xCU)\r\n#define ITRC_OUT0_SEL1_EVENT16_31_IN17_SEL1_SHIFT (2U)\r\n/*! IN17_SEL1 - Selects PMIP Analog glitch sensor event on VDD_CORE rail as a trigger source. */\r\n#define ITRC_OUT0_SEL1_EVENT16_31_IN17_SEL1(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_EVENT16_31_IN17_SEL1_SHIFT)) & ITRC_OUT0_SEL1_EVENT16_31_IN17_SEL1_MASK)\r\n\r\n#define ITRC_OUT0_SEL1_EVENT16_31_IN18_SEL1_MASK (0x30U)\r\n#define ITRC_OUT0_SEL1_EVENT16_31_IN18_SEL1_SHIFT (4U)\r\n/*! IN18_SEL1 - Selects TCPU PLL Unlock event as a trigger source. */\r\n#define ITRC_OUT0_SEL1_EVENT16_31_IN18_SEL1(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_EVENT16_31_IN18_SEL1_SHIFT)) & ITRC_OUT0_SEL1_EVENT16_31_IN18_SEL1_MASK)\r\n\r\n#define ITRC_OUT0_SEL1_EVENT16_31_IN19_SEL1_MASK (0xC0U)\r\n#define ITRC_OUT0_SEL1_EVENT16_31_IN19_SEL1_SHIFT (6U)\r\n/*! IN19_SEL1 - Selects T3 PLL Unlock event as a trigger source. */\r\n#define ITRC_OUT0_SEL1_EVENT16_31_IN19_SEL1(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_EVENT16_31_IN19_SEL1_SHIFT)) & ITRC_OUT0_SEL1_EVENT16_31_IN19_SEL1_MASK)\r\n\r\n#define ITRC_OUT0_SEL1_EVENT16_31_IN20_SEL1_MASK (0x300U)\r\n#define ITRC_OUT0_SEL1_EVENT16_31_IN20_SEL1_SHIFT (8U)\r\n/*! IN20_SEL1 - Selects software event 0 as a trigger source. */\r\n#define ITRC_OUT0_SEL1_EVENT16_31_IN20_SEL1(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_EVENT16_31_IN20_SEL1_SHIFT)) & ITRC_OUT0_SEL1_EVENT16_31_IN20_SEL1_MASK)\r\n\r\n#define ITRC_OUT0_SEL1_EVENT16_31_IN21_SEL1_MASK (0xC00U)\r\n#define ITRC_OUT0_SEL1_EVENT16_31_IN21_SEL1_SHIFT (10U)\r\n/*! IN21_SEL1 - Selects software event 1 as a trigger source. */\r\n#define ITRC_OUT0_SEL1_EVENT16_31_IN21_SEL1(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT0_SEL1_EVENT16_31_IN21_SEL1_SHIFT)) & ITRC_OUT0_SEL1_EVENT16_31_IN21_SEL1_MASK)\r\n/*! @} */\r\n\r\n/*! @name OUT1_SEL0_EVENT16_31 - CHIP_RESET Trigger source selector 0 register for Event 16 to 31. */\r\n/*! @{ */\r\n\r\n#define ITRC_OUT1_SEL0_EVENT16_31_IN16_SEL0_MASK (0x3U)\r\n#define ITRC_OUT1_SEL0_EVENT16_31_IN16_SEL0_SHIFT (0U)\r\n/*! IN16_SEL0 - Selects PMIP Analog glitch sensor event on VDD_18 rail as a trigger source. */\r\n#define ITRC_OUT1_SEL0_EVENT16_31_IN16_SEL0(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_EVENT16_31_IN16_SEL0_SHIFT)) & ITRC_OUT1_SEL0_EVENT16_31_IN16_SEL0_MASK)\r\n\r\n#define ITRC_OUT1_SEL0_EVENT16_31_IN17_SEL0_MASK (0xCU)\r\n#define ITRC_OUT1_SEL0_EVENT16_31_IN17_SEL0_SHIFT (2U)\r\n/*! IN17_SEL0 - Selects PMIP Analog glitch sensor event on VDD_CORE rail as a trigger source. */\r\n#define ITRC_OUT1_SEL0_EVENT16_31_IN17_SEL0(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_EVENT16_31_IN17_SEL0_SHIFT)) & ITRC_OUT1_SEL0_EVENT16_31_IN17_SEL0_MASK)\r\n\r\n#define ITRC_OUT1_SEL0_EVENT16_31_IN18_SEL0_MASK (0x30U)\r\n#define ITRC_OUT1_SEL0_EVENT16_31_IN18_SEL0_SHIFT (4U)\r\n/*! IN18_SEL0 - Selects TCPU PLL Unlock event as a trigger source. */\r\n#define ITRC_OUT1_SEL0_EVENT16_31_IN18_SEL0(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_EVENT16_31_IN18_SEL0_SHIFT)) & ITRC_OUT1_SEL0_EVENT16_31_IN18_SEL0_MASK)\r\n\r\n#define ITRC_OUT1_SEL0_EVENT16_31_IN19_SEL0_MASK (0xC0U)\r\n#define ITRC_OUT1_SEL0_EVENT16_31_IN19_SEL0_SHIFT (6U)\r\n/*! IN19_SEL0 - Selects T3 PLL Unlock event as a trigger source. */\r\n#define ITRC_OUT1_SEL0_EVENT16_31_IN19_SEL0(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_EVENT16_31_IN19_SEL0_SHIFT)) & ITRC_OUT1_SEL0_EVENT16_31_IN19_SEL0_MASK)\r\n\r\n#define ITRC_OUT1_SEL0_EVENT16_31_IN20_SEL0_MASK (0x300U)\r\n#define ITRC_OUT1_SEL0_EVENT16_31_IN20_SEL0_SHIFT (8U)\r\n/*! IN20_SEL0 - Selects software event 0 as a trigger source. */\r\n#define ITRC_OUT1_SEL0_EVENT16_31_IN20_SEL0(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_EVENT16_31_IN20_SEL0_SHIFT)) & ITRC_OUT1_SEL0_EVENT16_31_IN20_SEL0_MASK)\r\n\r\n#define ITRC_OUT1_SEL0_EVENT16_31_IN21_SEL0_MASK (0xC00U)\r\n#define ITRC_OUT1_SEL0_EVENT16_31_IN21_SEL0_SHIFT (10U)\r\n/*! IN21_SEL0 - Selects software event 1 as a trigger source. */\r\n#define ITRC_OUT1_SEL0_EVENT16_31_IN21_SEL0(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL0_EVENT16_31_IN21_SEL0_SHIFT)) & ITRC_OUT1_SEL0_EVENT16_31_IN21_SEL0_MASK)\r\n/*! @} */\r\n\r\n/*! @name OUT1_SEL1_EVENT16_31 - CHIP_RESET Trigger source selector 1 register for Event 16 to 31. */\r\n/*! @{ */\r\n\r\n#define ITRC_OUT1_SEL1_EVENT16_31_IN16_SEL1_MASK (0x3U)\r\n#define ITRC_OUT1_SEL1_EVENT16_31_IN16_SEL1_SHIFT (0U)\r\n/*! IN16_SEL1 - Selects PMIP Analog glitch sensor event on VDD_18 rail as a trigger source. */\r\n#define ITRC_OUT1_SEL1_EVENT16_31_IN16_SEL1(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_EVENT16_31_IN16_SEL1_SHIFT)) & ITRC_OUT1_SEL1_EVENT16_31_IN16_SEL1_MASK)\r\n\r\n#define ITRC_OUT1_SEL1_EVENT16_31_IN17_SEL1_MASK (0xCU)\r\n#define ITRC_OUT1_SEL1_EVENT16_31_IN17_SEL1_SHIFT (2U)\r\n/*! IN17_SEL1 - Selects PMIP Analog glitch sensor event on VDD_CORE rail as a trigger source. */\r\n#define ITRC_OUT1_SEL1_EVENT16_31_IN17_SEL1(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_EVENT16_31_IN17_SEL1_SHIFT)) & ITRC_OUT1_SEL1_EVENT16_31_IN17_SEL1_MASK)\r\n\r\n#define ITRC_OUT1_SEL1_EVENT16_31_IN18_SEL1_MASK (0x30U)\r\n#define ITRC_OUT1_SEL1_EVENT16_31_IN18_SEL1_SHIFT (4U)\r\n/*! IN18_SEL1 - Selects TCPU PLL Unlock event as a trigger source. */\r\n#define ITRC_OUT1_SEL1_EVENT16_31_IN18_SEL1(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_EVENT16_31_IN18_SEL1_SHIFT)) & ITRC_OUT1_SEL1_EVENT16_31_IN18_SEL1_MASK)\r\n\r\n#define ITRC_OUT1_SEL1_EVENT16_31_IN19_SEL1_MASK (0xC0U)\r\n#define ITRC_OUT1_SEL1_EVENT16_31_IN19_SEL1_SHIFT (6U)\r\n/*! IN19_SEL1 - Selects T3 PLL Unlock event as a trigger source. */\r\n#define ITRC_OUT1_SEL1_EVENT16_31_IN19_SEL1(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_EVENT16_31_IN19_SEL1_SHIFT)) & ITRC_OUT1_SEL1_EVENT16_31_IN19_SEL1_MASK)\r\n\r\n#define ITRC_OUT1_SEL1_EVENT16_31_IN20_SEL1_MASK (0x300U)\r\n#define ITRC_OUT1_SEL1_EVENT16_31_IN20_SEL1_SHIFT (8U)\r\n/*! IN20_SEL1 - Selects software event 0 as a trigger source. */\r\n#define ITRC_OUT1_SEL1_EVENT16_31_IN20_SEL1(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_EVENT16_31_IN20_SEL1_SHIFT)) & ITRC_OUT1_SEL1_EVENT16_31_IN20_SEL1_MASK)\r\n\r\n#define ITRC_OUT1_SEL1_EVENT16_31_IN21_SEL1_MASK (0xC00U)\r\n#define ITRC_OUT1_SEL1_EVENT16_31_IN21_SEL1_SHIFT (10U)\r\n/*! IN21_SEL1 - Selects software event 1 as a trigger source. */\r\n#define ITRC_OUT1_SEL1_EVENT16_31_IN21_SEL1(x)   (((uint32_t)(((uint32_t)(x)) << ITRC_OUT1_SEL1_EVENT16_31_IN21_SEL1_SHIFT)) & ITRC_OUT1_SEL1_EVENT16_31_IN21_SEL1_MASK)\r\n/*! @} */\r\n\r\n/*! @name SW_EVENT0 - Software event 0 */\r\n/*! @{ */\r\n\r\n#define ITRC_SW_EVENT0_TRIGGER_SW_EVENT_0_MASK   (0xFFFFFFFFU)\r\n#define ITRC_SW_EVENT0_TRIGGER_SW_EVENT_0_SHIFT  (0U)\r\n/*! TRIGGER_SW_EVENT_0 - Trigger software event 0. */\r\n#define ITRC_SW_EVENT0_TRIGGER_SW_EVENT_0(x)     (((uint32_t)(((uint32_t)(x)) << ITRC_SW_EVENT0_TRIGGER_SW_EVENT_0_SHIFT)) & ITRC_SW_EVENT0_TRIGGER_SW_EVENT_0_MASK)\r\n/*! @} */\r\n\r\n/*! @name SW_EVENT1 - Software event 1 */\r\n/*! @{ */\r\n\r\n#define ITRC_SW_EVENT1_TRIGGER_SW_EVENT_1_MASK   (0xFFFFFFFFU)\r\n#define ITRC_SW_EVENT1_TRIGGER_SW_EVENT_1_SHIFT  (0U)\r\n/*! TRIGGER_SW_EVENT_1 - Trigger software event 1. */\r\n#define ITRC_SW_EVENT1_TRIGGER_SW_EVENT_1(x)     (((uint32_t)(((uint32_t)(x)) << ITRC_SW_EVENT1_TRIGGER_SW_EVENT_1_SHIFT)) & ITRC_SW_EVENT1_TRIGGER_SW_EVENT_1_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group ITRC_Register_Masks */\r\n\r\n\r\n/* ITRC - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral ITRC base address */\r\n  #define ITRC_BASE                                (0x50024000u)\r\n  /** Peripheral ITRC base address */\r\n  #define ITRC_BASE_NS                             (0x40024000u)\r\n  /** Peripheral ITRC base pointer */\r\n  #define ITRC                                     ((ITRC_Type *)ITRC_BASE)\r\n  /** Peripheral ITRC base pointer */\r\n  #define ITRC_NS                                  ((ITRC_Type *)ITRC_BASE_NS)\r\n  /** Array initializer of ITRC peripheral base addresses */\r\n  #define ITRC_BASE_ADDRS                          { ITRC_BASE }\r\n  /** Array initializer of ITRC peripheral base pointers */\r\n  #define ITRC_BASE_PTRS                           { ITRC }\r\n  /** Array initializer of ITRC peripheral base addresses */\r\n  #define ITRC_BASE_ADDRS_NS                       { ITRC_BASE_NS }\r\n  /** Array initializer of ITRC peripheral base pointers */\r\n  #define ITRC_BASE_PTRS_NS                        { ITRC_NS }\r\n#else\r\n  /** Peripheral ITRC base address */\r\n  #define ITRC_BASE                                (0x40024000u)\r\n  /** Peripheral ITRC base pointer */\r\n  #define ITRC                                     ((ITRC_Type *)ITRC_BASE)\r\n  /** Array initializer of ITRC peripheral base addresses */\r\n  #define ITRC_BASE_ADDRS                          { ITRC_BASE }\r\n  /** Array initializer of ITRC peripheral base pointers */\r\n  #define ITRC_BASE_PTRS                           { ITRC }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group ITRC_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- LCDIC Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup LCDIC_Peripheral_Access_Layer LCDIC Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** LCDIC - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[8];\r\n  __IO uint32_t CTRL;                              /**< LCDIC Control Register, offset: 0x8 */\r\n  __IO uint32_t FIFO_CTRL;                         /**< FIFO Control Register, offset: 0xC */\r\n  __IO uint32_t TIMER_CTRL;                        /**< Timer Control Register, offset: 0x10 */\r\n  __IO uint32_t RST_CTRL;                          /**< Reset Control Register, offset: 0x14 */\r\n  __IO uint32_t I8080_CTRL0;                       /**< I8080 Control0 Register, offset: 0x18 */\r\n  __IO uint32_t I8080_CTRL1;                       /**< I8080 Control1 Reigster, offset: 0x1C */\r\n  __IO uint32_t SPI_CTRL;                          /**< SPI Control, offset: 0x20 */\r\n  __IO uint32_t TE_CTRL;                           /**< Tearing Effect Control, offset: 0x24 */\r\n  __IO uint32_t TO_CTRL;                           /**< Baseline Control Register 0, offset: 0x28 */\r\n  __O  uint32_t TFIFO_WDATA;                       /**< Baseline Control Register 1, offset: 0x2C */\r\n  __I  uint32_t RFIFO_RDATA;                       /**< Baseline Control Register 2, offset: 0x30 */\r\n  __I  uint32_t ISR;                               /**< Interrupt Status Register, offset: 0x34 */\r\n  __I  uint32_t IRSR;                              /**< Interrupt Raw Status Register, offset: 0x38 */\r\n  __IO uint32_t ICR;                               /**< Interrupt Clear Register, offset: 0x3C */\r\n  __IO uint32_t IMR;                               /**< Touch Detection Control Register2, offset: 0x40 */\r\n  __I  uint32_t STATUS0;                           /**< Status Register, offset: 0x44 */\r\n  __I  uint32_t STATUS1;                           /**< Touch Detection Control Register4, offset: 0x48 */\r\n} LCDIC_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- LCDIC Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup LCDIC_Register_Masks LCDIC Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name CTRL - LCDIC Control Register */\r\n/*! @{ */\r\n\r\n#define LCDIC_CTRL_LCDIC_EN_MASK                 (0x1U)\r\n#define LCDIC_CTRL_LCDIC_EN_SHIFT                (0U)\r\n/*! LCDIC_EN - LCDIC enable. */\r\n#define LCDIC_CTRL_LCDIC_EN(x)                   (((uint32_t)(((uint32_t)(x)) << LCDIC_CTRL_LCDIC_EN_SHIFT)) & LCDIC_CTRL_LCDIC_EN_MASK)\r\n\r\n#define LCDIC_CTRL_LCDIC_MD_MASK                 (0x2U)\r\n#define LCDIC_CTRL_LCDIC_MD_SHIFT                (1U)\r\n/*! LCDIC_MD - LCDIC mode. */\r\n#define LCDIC_CTRL_LCDIC_MD(x)                   (((uint32_t)(((uint32_t)(x)) << LCDIC_CTRL_LCDIC_MD_SHIFT)) & LCDIC_CTRL_LCDIC_MD_MASK)\r\n\r\n#define LCDIC_CTRL_SPI_MD_MASK                   (0x4U)\r\n#define LCDIC_CTRL_SPI_MD_SHIFT                  (2U)\r\n/*! SPI_MD - SPI mode. Only valid when lcdic_md = 1'd0. */\r\n#define LCDIC_CTRL_SPI_MD(x)                     (((uint32_t)(((uint32_t)(x)) << LCDIC_CTRL_SPI_MD_SHIFT)) & LCDIC_CTRL_SPI_MD_MASK)\r\n\r\n#define LCDIC_CTRL_DMA_EN_MASK                   (0x8U)\r\n#define LCDIC_CTRL_DMA_EN_SHIFT                  (3U)\r\n/*! DMA_EN - DMA enable. */\r\n#define LCDIC_CTRL_DMA_EN(x)                     (((uint32_t)(((uint32_t)(x)) << LCDIC_CTRL_DMA_EN_SHIFT)) & LCDIC_CTRL_DMA_EN_MASK)\r\n\r\n#define LCDIC_CTRL_DAT_ENDIAN_MASK               (0x10U)\r\n#define LCDIC_CTRL_DAT_ENDIAN_SHIFT              (4U)\r\n/*! DAT_ENDIAN - Byte data endian. */\r\n#define LCDIC_CTRL_DAT_ENDIAN(x)                 (((uint32_t)(((uint32_t)(x)) << LCDIC_CTRL_DAT_ENDIAN_SHIFT)) & LCDIC_CTRL_DAT_ENDIAN_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFO_CTRL - FIFO Control Register */\r\n/*! @{ */\r\n\r\n#define LCDIC_FIFO_CTRL_TFIFO_THRES_MASK         (0x7U)\r\n#define LCDIC_FIFO_CTRL_TFIFO_THRES_SHIFT        (0U)\r\n/*! TFIFO_THRES - TX FIFO threshold. */\r\n#define LCDIC_FIFO_CTRL_TFIFO_THRES(x)           (((uint32_t)(((uint32_t)(x)) << LCDIC_FIFO_CTRL_TFIFO_THRES_SHIFT)) & LCDIC_FIFO_CTRL_TFIFO_THRES_MASK)\r\n\r\n#define LCDIC_FIFO_CTRL_RFIFO_THRES_MASK         (0x8U)\r\n#define LCDIC_FIFO_CTRL_RFIFO_THRES_SHIFT        (3U)\r\n/*! RFIFO_THRES - RX FIFO threshold. */\r\n#define LCDIC_FIFO_CTRL_RFIFO_THRES(x)           (((uint32_t)(((uint32_t)(x)) << LCDIC_FIFO_CTRL_RFIFO_THRES_SHIFT)) & LCDIC_FIFO_CTRL_RFIFO_THRES_MASK)\r\n/*! @} */\r\n\r\n/*! @name TIMER_CTRL - Timer Control Register */\r\n/*! @{ */\r\n\r\n#define LCDIC_TIMER_CTRL_TIMER_RATIO0_MASK       (0xFU)\r\n#define LCDIC_TIMER_CTRL_TIMER_RATIO0_SHIFT      (0U)\r\n/*! TIMER_RATIO0 - Timer ratio0. */\r\n#define LCDIC_TIMER_CTRL_TIMER_RATIO0(x)         (((uint32_t)(((uint32_t)(x)) << LCDIC_TIMER_CTRL_TIMER_RATIO0_SHIFT)) & LCDIC_TIMER_CTRL_TIMER_RATIO0_MASK)\r\n\r\n#define LCDIC_TIMER_CTRL_TIMER_RATIO1_MASK       (0xF0U)\r\n#define LCDIC_TIMER_CTRL_TIMER_RATIO1_SHIFT      (4U)\r\n/*! TIMER_RATIO1 - Timer ratio1. */\r\n#define LCDIC_TIMER_CTRL_TIMER_RATIO1(x)         (((uint32_t)(((uint32_t)(x)) << LCDIC_TIMER_CTRL_TIMER_RATIO1_SHIFT)) & LCDIC_TIMER_CTRL_TIMER_RATIO1_MASK)\r\n/*! @} */\r\n\r\n/*! @name RST_CTRL - Reset Control Register */\r\n/*! @{ */\r\n\r\n#define LCDIC_RST_CTRL_RST_START_MASK            (0x1U)\r\n#define LCDIC_RST_CTRL_RST_START_SHIFT           (0U)\r\n/*! RST_START - LCD reset start signal. Single pulse. */\r\n#define LCDIC_RST_CTRL_RST_START(x)              (((uint32_t)(((uint32_t)(x)) << LCDIC_RST_CTRL_RST_START_SHIFT)) & LCDIC_RST_CTRL_RST_START_MASK)\r\n\r\n#define LCDIC_RST_CTRL_RST_POL_MASK              (0x2U)\r\n#define LCDIC_RST_CTRL_RST_POL_SHIFT             (1U)\r\n/*! RST_POL - Reset signal polarity. */\r\n#define LCDIC_RST_CTRL_RST_POL(x)                (((uint32_t)(((uint32_t)(x)) << LCDIC_RST_CTRL_RST_POL_SHIFT)) & LCDIC_RST_CTRL_RST_POL_MASK)\r\n\r\n#define LCDIC_RST_CTRL_RST_SEQ_NUM_MASK          (0x1CU)\r\n#define LCDIC_RST_CTRL_RST_SEQ_NUM_SHIFT         (2U)\r\n/*! RST_SEQ_NUM - Reset sequence pulse number. 3'd0: 1 pulse; 3'd7: 8 pulse. */\r\n#define LCDIC_RST_CTRL_RST_SEQ_NUM(x)            (((uint32_t)(((uint32_t)(x)) << LCDIC_RST_CTRL_RST_SEQ_NUM_SHIFT)) & LCDIC_RST_CTRL_RST_SEQ_NUM_MASK)\r\n\r\n#define LCDIC_RST_CTRL_RST_SEQ_MASK              (0x1FE0U)\r\n#define LCDIC_RST_CTRL_RST_SEQ_SHIFT             (5U)\r\n/*! RST_SEQ - Reset sequence. LCD_RST will send rst_seq[0] onto lcd_reset first, and then followed\r\n *    by rst_seq[1] until rst_seq_num is reached.\r\n */\r\n#define LCDIC_RST_CTRL_RST_SEQ(x)                (((uint32_t)(((uint32_t)(x)) << LCDIC_RST_CTRL_RST_SEQ_SHIFT)) & LCDIC_RST_CTRL_RST_SEQ_MASK)\r\n\r\n#define LCDIC_RST_CTRL_RST_WIDTH_MASK            (0x7E000U)\r\n#define LCDIC_RST_CTRL_RST_WIDTH_SHIFT           (13U)\r\n/*! RST_WIDTH - Width of each reset pulse. Unit is T(timer_base0). T(reset pulse) = T(timer_base0)*(rst_width+1). */\r\n#define LCDIC_RST_CTRL_RST_WIDTH(x)              (((uint32_t)(((uint32_t)(x)) << LCDIC_RST_CTRL_RST_WIDTH_SHIFT)) & LCDIC_RST_CTRL_RST_WIDTH_MASK)\r\n/*! @} */\r\n\r\n/*! @name I8080_CTRL0 - I8080 Control0 Register */\r\n/*! @{ */\r\n\r\n#define LCDIC_I8080_CTRL0_CS_POL_MASK            (0x1U)\r\n#define LCDIC_I8080_CTRL0_CS_POL_SHIFT           (0U)\r\n/*! CS_POL - CS polarity. */\r\n#define LCDIC_I8080_CTRL0_CS_POL(x)              (((uint32_t)(((uint32_t)(x)) << LCDIC_I8080_CTRL0_CS_POL_SHIFT)) & LCDIC_I8080_CTRL0_CS_POL_MASK)\r\n\r\n#define LCDIC_I8080_CTRL0_DC_POL_MASK            (0x2U)\r\n#define LCDIC_I8080_CTRL0_DC_POL_SHIFT           (1U)\r\n/*! DC_POL - DC polarity. */\r\n#define LCDIC_I8080_CTRL0_DC_POL(x)              (((uint32_t)(((uint32_t)(x)) << LCDIC_I8080_CTRL0_DC_POL_SHIFT)) & LCDIC_I8080_CTRL0_DC_POL_MASK)\r\n\r\n#define LCDIC_I8080_CTRL0_RD_POL_MASK            (0x4U)\r\n#define LCDIC_I8080_CTRL0_RD_POL_SHIFT           (2U)\r\n/*! RD_POL - RD polarity. */\r\n#define LCDIC_I8080_CTRL0_RD_POL(x)              (((uint32_t)(((uint32_t)(x)) << LCDIC_I8080_CTRL0_RD_POL_SHIFT)) & LCDIC_I8080_CTRL0_RD_POL_MASK)\r\n\r\n#define LCDIC_I8080_CTRL0_WR_POL_MASK            (0x8U)\r\n#define LCDIC_I8080_CTRL0_WR_POL_SHIFT           (3U)\r\n/*! WR_POL - WR polarity. */\r\n#define LCDIC_I8080_CTRL0_WR_POL(x)              (((uint32_t)(((uint32_t)(x)) << LCDIC_I8080_CTRL0_WR_POL_SHIFT)) & LCDIC_I8080_CTRL0_WR_POL_MASK)\r\n\r\n#define LCDIC_I8080_CTRL0_EN_DC_OFF_MASK         (0x10U)\r\n#define LCDIC_I8080_CTRL0_EN_DC_OFF_SHIFT        (4U)\r\n/*! EN_DC_OFF - CS off while DC switches. */\r\n#define LCDIC_I8080_CTRL0_EN_DC_OFF(x)           (((uint32_t)(((uint32_t)(x)) << LCDIC_I8080_CTRL0_EN_DC_OFF_SHIFT)) & LCDIC_I8080_CTRL0_EN_DC_OFF_MASK)\r\n\r\n#define LCDIC_I8080_CTRL0_EN_IDLE_OFF_MASK       (0x20U)\r\n#define LCDIC_I8080_CTRL0_EN_IDLE_OFF_SHIFT      (5U)\r\n/*! EN_IDLE_OFF - CS off while no transmission. */\r\n#define LCDIC_I8080_CTRL0_EN_IDLE_OFF(x)         (((uint32_t)(((uint32_t)(x)) << LCDIC_I8080_CTRL0_EN_IDLE_OFF_SHIFT)) & LCDIC_I8080_CTRL0_EN_IDLE_OFF_MASK)\r\n\r\n#define LCDIC_I8080_CTRL0_TCSW_MASK              (0x1C0U)\r\n#define LCDIC_I8080_CTRL0_TCSW_SHIFT             (6U)\r\n/*! TCSW - CS wait time. Minimum CS inactive pulse width. T(csw)=T(lcdic_clk)*tcsw. */\r\n#define LCDIC_I8080_CTRL0_TCSW(x)                (((uint32_t)(((uint32_t)(x)) << LCDIC_I8080_CTRL0_TCSW_SHIFT)) & LCDIC_I8080_CTRL0_TCSW_MASK)\r\n\r\n#define LCDIC_I8080_CTRL0_TCSS_MASK              (0x1FE00U)\r\n#define LCDIC_I8080_CTRL0_TCSS_SHIFT             (9U)\r\n/*! TCSS - CS setup time. Minimum CS setup time before WR/RD. T(css)=T(lcdic_clk)*tcss. */\r\n#define LCDIC_I8080_CTRL0_TCSS(x)                (((uint32_t)(((uint32_t)(x)) << LCDIC_I8080_CTRL0_TCSS_SHIFT)) & LCDIC_I8080_CTRL0_TCSS_MASK)\r\n\r\n#define LCDIC_I8080_CTRL0_TCSH_MASK              (0xE0000U)\r\n#define LCDIC_I8080_CTRL0_TCSH_SHIFT             (17U)\r\n/*! TCSH - CS hold time. Minimum CS hold time after WR/RD. T(csh)=T(lcdic_clk)*tcsh. */\r\n#define LCDIC_I8080_CTRL0_TCSH(x)                (((uint32_t)(((uint32_t)(x)) << LCDIC_I8080_CTRL0_TCSH_SHIFT)) & LCDIC_I8080_CTRL0_TCSH_MASK)\r\n\r\n#define LCDIC_I8080_CTRL0_TDCS_MASK              (0x700000U)\r\n#define LCDIC_I8080_CTRL0_TDCS_SHIFT             (20U)\r\n/*! TDCS - DC setupt time. Minimum DC setup time before WR/RD/CS. T(dcs)=T(lcdic_clk)*tdcs. */\r\n#define LCDIC_I8080_CTRL0_TDCS(x)                (((uint32_t)(((uint32_t)(x)) << LCDIC_I8080_CTRL0_TDCS_SHIFT)) & LCDIC_I8080_CTRL0_TDCS_MASK)\r\n\r\n#define LCDIC_I8080_CTRL0_TDCH_MASK              (0x3800000U)\r\n#define LCDIC_I8080_CTRL0_TDCH_SHIFT             (23U)\r\n/*! TDCH - DC hold time. Minimum DC hold time after WR/RD/CS. T(dch)=T(lcdic_clk)*tdch. */\r\n#define LCDIC_I8080_CTRL0_TDCH(x)                (((uint32_t)(((uint32_t)(x)) << LCDIC_I8080_CTRL0_TDCH_SHIFT)) & LCDIC_I8080_CTRL0_TDCH_MASK)\r\n\r\n#define LCDIC_I8080_CTRL0_TWDS_MASK              (0x1C000000U)\r\n#define LCDIC_I8080_CTRL0_TWDS_SHIFT             (26U)\r\n/*! TWDS - Write data setup time. Minimum write data setup time before WR active. T(wds)=T(lcdic_clk)*twds. */\r\n#define LCDIC_I8080_CTRL0_TWDS(x)                (((uint32_t)(((uint32_t)(x)) << LCDIC_I8080_CTRL0_TWDS_SHIFT)) & LCDIC_I8080_CTRL0_TWDS_MASK)\r\n\r\n#define LCDIC_I8080_CTRL0_TWDH_MASK              (0xE0000000U)\r\n#define LCDIC_I8080_CTRL0_TWDH_SHIFT             (29U)\r\n/*! TWDH - Write data hold time. Minimum write data setup time after WR active. T(wdh)=T(lcdic_clk)*twdh. */\r\n#define LCDIC_I8080_CTRL0_TWDH(x)                (((uint32_t)(((uint32_t)(x)) << LCDIC_I8080_CTRL0_TWDH_SHIFT)) & LCDIC_I8080_CTRL0_TWDH_MASK)\r\n/*! @} */\r\n\r\n/*! @name I8080_CTRL1 - I8080 Control1 Reigster */\r\n/*! @{ */\r\n\r\n#define LCDIC_I8080_CTRL1_TWAW_MASK              (0x3FU)\r\n#define LCDIC_I8080_CTRL1_TWAW_SHIFT             (0U)\r\n/*! TWAW - Minmum write enable active pulse width. T(waw)=T(lcdic_clk)*twaw. */\r\n#define LCDIC_I8080_CTRL1_TWAW(x)                (((uint32_t)(((uint32_t)(x)) << LCDIC_I8080_CTRL1_TWAW_SHIFT)) & LCDIC_I8080_CTRL1_TWAW_MASK)\r\n\r\n#define LCDIC_I8080_CTRL1_TWIW_MASK              (0xFC0U)\r\n#define LCDIC_I8080_CTRL1_TWIW_SHIFT             (6U)\r\n/*! TWIW - Minmum write enable inactive pulse width. T(wiw)=T(lcdic_clk)*twiw. */\r\n#define LCDIC_I8080_CTRL1_TWIW(x)                (((uint32_t)(((uint32_t)(x)) << LCDIC_I8080_CTRL1_TWIW_SHIFT)) & LCDIC_I8080_CTRL1_TWIW_MASK)\r\n\r\n#define LCDIC_I8080_CTRL1_TRAW_MASK              (0xFF000U)\r\n#define LCDIC_I8080_CTRL1_TRAW_SHIFT             (12U)\r\n/*! TRAW - Minmum read enable active pulse width. T(raw)=T(lcdic_clk)*traw. */\r\n#define LCDIC_I8080_CTRL1_TRAW(x)                (((uint32_t)(((uint32_t)(x)) << LCDIC_I8080_CTRL1_TRAW_SHIFT)) & LCDIC_I8080_CTRL1_TRAW_MASK)\r\n\r\n#define LCDIC_I8080_CTRL1_TRIW_MASK              (0xFF00000U)\r\n#define LCDIC_I8080_CTRL1_TRIW_SHIFT             (20U)\r\n/*! TRIW - Minmum read enable inactive pulse width. T(riw)=T(lcdic_clk)*triw. */\r\n#define LCDIC_I8080_CTRL1_TRIW(x)                (((uint32_t)(((uint32_t)(x)) << LCDIC_I8080_CTRL1_TRIW_SHIFT)) & LCDIC_I8080_CTRL1_TRIW_MASK)\r\n/*! @} */\r\n\r\n/*! @name SPI_CTRL - SPI Control */\r\n/*! @{ */\r\n\r\n#define LCDIC_SPI_CTRL_DC_POL_MASK               (0x1U)\r\n#define LCDIC_SPI_CTRL_DC_POL_SHIFT              (0U)\r\n/*! DC_POL - DC polarity. */\r\n#define LCDIC_SPI_CTRL_DC_POL(x)                 (((uint32_t)(((uint32_t)(x)) << LCDIC_SPI_CTRL_DC_POL_SHIFT)) & LCDIC_SPI_CTRL_DC_POL_MASK)\r\n\r\n#define LCDIC_SPI_CTRL_CPOL_MASK                 (0x2U)\r\n#define LCDIC_SPI_CTRL_CPOL_SHIFT                (1U)\r\n/*! CPOL - SPI CPOL. */\r\n#define LCDIC_SPI_CTRL_CPOL(x)                   (((uint32_t)(((uint32_t)(x)) << LCDIC_SPI_CTRL_CPOL_SHIFT)) & LCDIC_SPI_CTRL_CPOL_MASK)\r\n\r\n#define LCDIC_SPI_CTRL_CPHA_MASK                 (0x4U)\r\n#define LCDIC_SPI_CTRL_CPHA_SHIFT                (2U)\r\n/*! CPHA - SPI CPHA. */\r\n#define LCDIC_SPI_CTRL_CPHA(x)                   (((uint32_t)(((uint32_t)(x)) << LCDIC_SPI_CTRL_CPHA_SHIFT)) & LCDIC_SPI_CTRL_CPHA_MASK)\r\n\r\n#define LCDIC_SPI_CTRL_SDAT_ENDIAN_MASK          (0x8U)\r\n#define LCDIC_SPI_CTRL_SDAT_ENDIAN_SHIFT         (3U)\r\n/*! SDAT_ENDIAN - SPI serial data endian. */\r\n#define LCDIC_SPI_CTRL_SDAT_ENDIAN(x)            (((uint32_t)(((uint32_t)(x)) << LCDIC_SPI_CTRL_SDAT_ENDIAN_SHIFT)) & LCDIC_SPI_CTRL_SDAT_ENDIAN_MASK)\r\n/*! @} */\r\n\r\n/*! @name TE_CTRL - Tearing Effect Control */\r\n/*! @{ */\r\n\r\n#define LCDIC_TE_CTRL_TTEW_MASK                  (0x3FU)\r\n#define LCDIC_TE_CTRL_TTEW_SHIFT                 (0U)\r\n/*! TTEW - Tearing effect signal synchronization wait time. Unit is T(timer_base1). T(tew)=T(timer_base1)*ttew. */\r\n#define LCDIC_TE_CTRL_TTEW(x)                    (((uint32_t)(((uint32_t)(x)) << LCDIC_TE_CTRL_TTEW_SHIFT)) & LCDIC_TE_CTRL_TTEW_MASK)\r\n\r\n#define LCDIC_TE_CTRL_TE_TO_MASK                 (0xFC0U)\r\n#define LCDIC_TE_CTRL_TE_TO_SHIFT                (6U)\r\n/*! TE_TO - Tearing effect timeout time. Unit is T(timer_base1). T(te_to)=T(timer_base1)*te_to. 6'd0 means no te_to check. */\r\n#define LCDIC_TE_CTRL_TE_TO(x)                   (((uint32_t)(((uint32_t)(x)) << LCDIC_TE_CTRL_TE_TO_SHIFT)) & LCDIC_TE_CTRL_TE_TO_MASK)\r\n/*! @} */\r\n\r\n/*! @name TO_CTRL - Baseline Control Register 0 */\r\n/*! @{ */\r\n\r\n#define LCDIC_TO_CTRL_CMD_SHORT_TO_MASK          (0xFU)\r\n#define LCDIC_TO_CTRL_CMD_SHORT_TO_SHIFT         (0U)\r\n/*! CMD_SHORT_TO - Command short timeout. Unit is T(timer_base0).\r\n *    T(cmd_short_to)=T(timer_base0)*cmd_short_to. 4'd0 means no cmd_short_to check.\r\n */\r\n#define LCDIC_TO_CTRL_CMD_SHORT_TO(x)            (((uint32_t)(((uint32_t)(x)) << LCDIC_TO_CTRL_CMD_SHORT_TO_SHIFT)) & LCDIC_TO_CTRL_CMD_SHORT_TO_MASK)\r\n\r\n#define LCDIC_TO_CTRL_CMD_LONG_TO_MASK           (0x3F0U)\r\n#define LCDIC_TO_CTRL_CMD_LONG_TO_SHIFT          (4U)\r\n/*! CMD_LONG_TO - Command long timeout. Unit is T(timer_base1).\r\n *    T(cmd_long_to)=T(timer_base1)*cmd_long_to. 16'd0 means no cmd_long_to check.\r\n */\r\n#define LCDIC_TO_CTRL_CMD_LONG_TO(x)             (((uint32_t)(((uint32_t)(x)) << LCDIC_TO_CTRL_CMD_LONG_TO_SHIFT)) & LCDIC_TO_CTRL_CMD_LONG_TO_MASK)\r\n/*! @} */\r\n\r\n/*! @name TFIFO_WDATA - Baseline Control Register 1 */\r\n/*! @{ */\r\n\r\n#define LCDIC_TFIFO_WDATA_TFIFO_WDATA_MASK       (0xFFFFFFFFU)\r\n#define LCDIC_TFIFO_WDATA_TFIFO_WDATA_SHIFT      (0U)\r\n/*! TFIFO_WDATA - TX FIFO write data. */\r\n#define LCDIC_TFIFO_WDATA_TFIFO_WDATA(x)         (((uint32_t)(((uint32_t)(x)) << LCDIC_TFIFO_WDATA_TFIFO_WDATA_SHIFT)) & LCDIC_TFIFO_WDATA_TFIFO_WDATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name RFIFO_RDATA - Baseline Control Register 2 */\r\n/*! @{ */\r\n\r\n#define LCDIC_RFIFO_RDATA_RFIFO_RDATA_MASK       (0xFFFFFFFFU)\r\n#define LCDIC_RFIFO_RDATA_RFIFO_RDATA_SHIFT      (0U)\r\n/*! RFIFO_RDATA - RX FIFO read data. */\r\n#define LCDIC_RFIFO_RDATA_RFIFO_RDATA(x)         (((uint32_t)(((uint32_t)(x)) << LCDIC_RFIFO_RDATA_RFIFO_RDATA_SHIFT)) & LCDIC_RFIFO_RDATA_RFIFO_RDATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name ISR - Interrupt Status Register */\r\n/*! @{ */\r\n\r\n#define LCDIC_ISR_RFIFO_THRES_INTR_MASK          (0x1U)\r\n#define LCDIC_ISR_RFIFO_THRES_INTR_SHIFT         (0U)\r\n/*! RFIFO_THRES_INTR - RX FIFO threshold interrupt. */\r\n#define LCDIC_ISR_RFIFO_THRES_INTR(x)            (((uint32_t)(((uint32_t)(x)) << LCDIC_ISR_RFIFO_THRES_INTR_SHIFT)) & LCDIC_ISR_RFIFO_THRES_INTR_MASK)\r\n\r\n#define LCDIC_ISR_RFIFO_UNDERFLOW_INTR_MASK      (0x2U)\r\n#define LCDIC_ISR_RFIFO_UNDERFLOW_INTR_SHIFT     (1U)\r\n/*! RFIFO_UNDERFLOW_INTR - RX FIFO underflow interrupt. */\r\n#define LCDIC_ISR_RFIFO_UNDERFLOW_INTR(x)        (((uint32_t)(((uint32_t)(x)) << LCDIC_ISR_RFIFO_UNDERFLOW_INTR_SHIFT)) & LCDIC_ISR_RFIFO_UNDERFLOW_INTR_MASK)\r\n\r\n#define LCDIC_ISR_TFIFO_THRES_INTR_MASK          (0x4U)\r\n#define LCDIC_ISR_TFIFO_THRES_INTR_SHIFT         (2U)\r\n/*! TFIFO_THRES_INTR - TX FIFO threshold interrupt. */\r\n#define LCDIC_ISR_TFIFO_THRES_INTR(x)            (((uint32_t)(((uint32_t)(x)) << LCDIC_ISR_TFIFO_THRES_INTR_SHIFT)) & LCDIC_ISR_TFIFO_THRES_INTR_MASK)\r\n\r\n#define LCDIC_ISR_TFIFO_OVERFLOW_INTR_MASK       (0x8U)\r\n#define LCDIC_ISR_TFIFO_OVERFLOW_INTR_SHIFT      (3U)\r\n/*! TFIFO_OVERFLOW_INTR - TX FIFO overflow interrupt. */\r\n#define LCDIC_ISR_TFIFO_OVERFLOW_INTR(x)         (((uint32_t)(((uint32_t)(x)) << LCDIC_ISR_TFIFO_OVERFLOW_INTR_SHIFT)) & LCDIC_ISR_TFIFO_OVERFLOW_INTR_MASK)\r\n\r\n#define LCDIC_ISR_TE_TO_INTR_MASK                (0x10U)\r\n#define LCDIC_ISR_TE_TO_INTR_SHIFT               (4U)\r\n/*! TE_TO_INTR - TE timeout interrupt. */\r\n#define LCDIC_ISR_TE_TO_INTR(x)                  (((uint32_t)(((uint32_t)(x)) << LCDIC_ISR_TE_TO_INTR_SHIFT)) & LCDIC_ISR_TE_TO_INTR_MASK)\r\n\r\n#define LCDIC_ISR_CMD_TO_INTR_MASK               (0x20U)\r\n#define LCDIC_ISR_CMD_TO_INTR_SHIFT              (5U)\r\n/*! CMD_TO_INTR - TRX command timeout interrupt. */\r\n#define LCDIC_ISR_CMD_TO_INTR(x)                 (((uint32_t)(((uint32_t)(x)) << LCDIC_ISR_CMD_TO_INTR_SHIFT)) & LCDIC_ISR_CMD_TO_INTR_MASK)\r\n\r\n#define LCDIC_ISR_CMD_DONE_INTR_MASK             (0x40U)\r\n#define LCDIC_ISR_CMD_DONE_INTR_SHIFT            (6U)\r\n/*! CMD_DONE_INTR - TRX command done interrupt. */\r\n#define LCDIC_ISR_CMD_DONE_INTR(x)               (((uint32_t)(((uint32_t)(x)) << LCDIC_ISR_CMD_DONE_INTR_SHIFT)) & LCDIC_ISR_CMD_DONE_INTR_MASK)\r\n\r\n#define LCDIC_ISR_RST_DONE_INTR_MASK             (0x80U)\r\n#define LCDIC_ISR_RST_DONE_INTR_SHIFT            (7U)\r\n/*! RST_DONE_INTR - Reset done interrupt. */\r\n#define LCDIC_ISR_RST_DONE_INTR(x)               (((uint32_t)(((uint32_t)(x)) << LCDIC_ISR_RST_DONE_INTR_SHIFT)) & LCDIC_ISR_RST_DONE_INTR_MASK)\r\n/*! @} */\r\n\r\n/*! @name IRSR - Interrupt Raw Status Register */\r\n/*! @{ */\r\n\r\n#define LCDIC_IRSR_RFIFO_THRES_RAW_INTR_MASK     (0x1U)\r\n#define LCDIC_IRSR_RFIFO_THRES_RAW_INTR_SHIFT    (0U)\r\n/*! RFIFO_THRES_RAW_INTR - RX FIFO threshold raw interrupt. */\r\n#define LCDIC_IRSR_RFIFO_THRES_RAW_INTR(x)       (((uint32_t)(((uint32_t)(x)) << LCDIC_IRSR_RFIFO_THRES_RAW_INTR_SHIFT)) & LCDIC_IRSR_RFIFO_THRES_RAW_INTR_MASK)\r\n\r\n#define LCDIC_IRSR_RFIFO_UNDERFLOW_RAW_INTR_MASK (0x2U)\r\n#define LCDIC_IRSR_RFIFO_UNDERFLOW_RAW_INTR_SHIFT (1U)\r\n/*! RFIFO_UNDERFLOW_RAW_INTR - RX FIFO underflow raw interrupt. */\r\n#define LCDIC_IRSR_RFIFO_UNDERFLOW_RAW_INTR(x)   (((uint32_t)(((uint32_t)(x)) << LCDIC_IRSR_RFIFO_UNDERFLOW_RAW_INTR_SHIFT)) & LCDIC_IRSR_RFIFO_UNDERFLOW_RAW_INTR_MASK)\r\n\r\n#define LCDIC_IRSR_TFIFO_THRES_RAW_INTR_MASK     (0x4U)\r\n#define LCDIC_IRSR_TFIFO_THRES_RAW_INTR_SHIFT    (2U)\r\n/*! TFIFO_THRES_RAW_INTR - TX FIFO threshold raw interrupt. */\r\n#define LCDIC_IRSR_TFIFO_THRES_RAW_INTR(x)       (((uint32_t)(((uint32_t)(x)) << LCDIC_IRSR_TFIFO_THRES_RAW_INTR_SHIFT)) & LCDIC_IRSR_TFIFO_THRES_RAW_INTR_MASK)\r\n\r\n#define LCDIC_IRSR_TFIFO_OVERFLOW_RAW_INTR_MASK  (0x8U)\r\n#define LCDIC_IRSR_TFIFO_OVERFLOW_RAW_INTR_SHIFT (3U)\r\n/*! TFIFO_OVERFLOW_RAW_INTR - TX FIFO overflow raw interrupt. */\r\n#define LCDIC_IRSR_TFIFO_OVERFLOW_RAW_INTR(x)    (((uint32_t)(((uint32_t)(x)) << LCDIC_IRSR_TFIFO_OVERFLOW_RAW_INTR_SHIFT)) & LCDIC_IRSR_TFIFO_OVERFLOW_RAW_INTR_MASK)\r\n\r\n#define LCDIC_IRSR_TE_TO_RAW_INTR_MASK           (0x10U)\r\n#define LCDIC_IRSR_TE_TO_RAW_INTR_SHIFT          (4U)\r\n/*! TE_TO_RAW_INTR - TE timeout raw interrupt. */\r\n#define LCDIC_IRSR_TE_TO_RAW_INTR(x)             (((uint32_t)(((uint32_t)(x)) << LCDIC_IRSR_TE_TO_RAW_INTR_SHIFT)) & LCDIC_IRSR_TE_TO_RAW_INTR_MASK)\r\n\r\n#define LCDIC_IRSR_CMD_TO_RAW_INTR_MASK          (0x20U)\r\n#define LCDIC_IRSR_CMD_TO_RAW_INTR_SHIFT         (5U)\r\n/*! CMD_TO_RAW_INTR - TRX command timeout raw interrupt. */\r\n#define LCDIC_IRSR_CMD_TO_RAW_INTR(x)            (((uint32_t)(((uint32_t)(x)) << LCDIC_IRSR_CMD_TO_RAW_INTR_SHIFT)) & LCDIC_IRSR_CMD_TO_RAW_INTR_MASK)\r\n\r\n#define LCDIC_IRSR_CMD_DONE_RAW_INTR_MASK        (0x40U)\r\n#define LCDIC_IRSR_CMD_DONE_RAW_INTR_SHIFT       (6U)\r\n/*! CMD_DONE_RAW_INTR - TRX command done raw interrupt. */\r\n#define LCDIC_IRSR_CMD_DONE_RAW_INTR(x)          (((uint32_t)(((uint32_t)(x)) << LCDIC_IRSR_CMD_DONE_RAW_INTR_SHIFT)) & LCDIC_IRSR_CMD_DONE_RAW_INTR_MASK)\r\n\r\n#define LCDIC_IRSR_RST_DONE_RAW_INTR_MASK        (0x80U)\r\n#define LCDIC_IRSR_RST_DONE_RAW_INTR_SHIFT       (7U)\r\n/*! RST_DONE_RAW_INTR - Reset done raw interrupt. */\r\n#define LCDIC_IRSR_RST_DONE_RAW_INTR(x)          (((uint32_t)(((uint32_t)(x)) << LCDIC_IRSR_RST_DONE_RAW_INTR_SHIFT)) & LCDIC_IRSR_RST_DONE_RAW_INTR_MASK)\r\n/*! @} */\r\n\r\n/*! @name ICR - Interrupt Clear Register */\r\n/*! @{ */\r\n\r\n#define LCDIC_ICR_RFIFO_THRES_INTR_CLR_MASK      (0x1U)\r\n#define LCDIC_ICR_RFIFO_THRES_INTR_CLR_SHIFT     (0U)\r\n/*! RFIFO_THRES_INTR_CLR - RX FIFO threshold interrupt clear. */\r\n#define LCDIC_ICR_RFIFO_THRES_INTR_CLR(x)        (((uint32_t)(((uint32_t)(x)) << LCDIC_ICR_RFIFO_THRES_INTR_CLR_SHIFT)) & LCDIC_ICR_RFIFO_THRES_INTR_CLR_MASK)\r\n\r\n#define LCDIC_ICR_RFIFO_UNDERFLOW_INTR_CLR_MASK  (0x2U)\r\n#define LCDIC_ICR_RFIFO_UNDERFLOW_INTR_CLR_SHIFT (1U)\r\n/*! RFIFO_UNDERFLOW_INTR_CLR - RX FIFO underflow interrupt clear. */\r\n#define LCDIC_ICR_RFIFO_UNDERFLOW_INTR_CLR(x)    (((uint32_t)(((uint32_t)(x)) << LCDIC_ICR_RFIFO_UNDERFLOW_INTR_CLR_SHIFT)) & LCDIC_ICR_RFIFO_UNDERFLOW_INTR_CLR_MASK)\r\n\r\n#define LCDIC_ICR_TFIFO_THRES_INTR_CLR_MASK      (0x4U)\r\n#define LCDIC_ICR_TFIFO_THRES_INTR_CLR_SHIFT     (2U)\r\n/*! TFIFO_THRES_INTR_CLR - TX FIFO threshold interrupt clear. */\r\n#define LCDIC_ICR_TFIFO_THRES_INTR_CLR(x)        (((uint32_t)(((uint32_t)(x)) << LCDIC_ICR_TFIFO_THRES_INTR_CLR_SHIFT)) & LCDIC_ICR_TFIFO_THRES_INTR_CLR_MASK)\r\n\r\n#define LCDIC_ICR_TFIFO_OVERFLOW_INTR_CLR_MASK   (0x8U)\r\n#define LCDIC_ICR_TFIFO_OVERFLOW_INTR_CLR_SHIFT  (3U)\r\n/*! TFIFO_OVERFLOW_INTR_CLR - TX FIFO overflow interrupt clear. */\r\n#define LCDIC_ICR_TFIFO_OVERFLOW_INTR_CLR(x)     (((uint32_t)(((uint32_t)(x)) << LCDIC_ICR_TFIFO_OVERFLOW_INTR_CLR_SHIFT)) & LCDIC_ICR_TFIFO_OVERFLOW_INTR_CLR_MASK)\r\n\r\n#define LCDIC_ICR_TE_TO_INTR_CLR_MASK            (0x10U)\r\n#define LCDIC_ICR_TE_TO_INTR_CLR_SHIFT           (4U)\r\n/*! TE_TO_INTR_CLR - TE timeout interrupt clear. */\r\n#define LCDIC_ICR_TE_TO_INTR_CLR(x)              (((uint32_t)(((uint32_t)(x)) << LCDIC_ICR_TE_TO_INTR_CLR_SHIFT)) & LCDIC_ICR_TE_TO_INTR_CLR_MASK)\r\n\r\n#define LCDIC_ICR_CMD_TO_INTR_CLR_MASK           (0x20U)\r\n#define LCDIC_ICR_CMD_TO_INTR_CLR_SHIFT          (5U)\r\n/*! CMD_TO_INTR_CLR - TRX command timeout interrupt clear. */\r\n#define LCDIC_ICR_CMD_TO_INTR_CLR(x)             (((uint32_t)(((uint32_t)(x)) << LCDIC_ICR_CMD_TO_INTR_CLR_SHIFT)) & LCDIC_ICR_CMD_TO_INTR_CLR_MASK)\r\n\r\n#define LCDIC_ICR_CMD_DONE_INTR_CLR_MASK         (0x40U)\r\n#define LCDIC_ICR_CMD_DONE_INTR_CLR_SHIFT        (6U)\r\n/*! CMD_DONE_INTR_CLR - TRX command done interrupt clear. */\r\n#define LCDIC_ICR_CMD_DONE_INTR_CLR(x)           (((uint32_t)(((uint32_t)(x)) << LCDIC_ICR_CMD_DONE_INTR_CLR_SHIFT)) & LCDIC_ICR_CMD_DONE_INTR_CLR_MASK)\r\n\r\n#define LCDIC_ICR_RST_DONE_INTR_CLR_MASK         (0x80U)\r\n#define LCDIC_ICR_RST_DONE_INTR_CLR_SHIFT        (7U)\r\n/*! RST_DONE_INTR_CLR - Reset done interrupt clear. */\r\n#define LCDIC_ICR_RST_DONE_INTR_CLR(x)           (((uint32_t)(((uint32_t)(x)) << LCDIC_ICR_RST_DONE_INTR_CLR_SHIFT)) & LCDIC_ICR_RST_DONE_INTR_CLR_MASK)\r\n/*! @} */\r\n\r\n/*! @name IMR - Touch Detection Control Register2 */\r\n/*! @{ */\r\n\r\n#define LCDIC_IMR_RFIFO_THRES_INTR_MSK_MASK      (0x1U)\r\n#define LCDIC_IMR_RFIFO_THRES_INTR_MSK_SHIFT     (0U)\r\n/*! RFIFO_THRES_INTR_MSK - RX FIFO threshold interrupt mask. */\r\n#define LCDIC_IMR_RFIFO_THRES_INTR_MSK(x)        (((uint32_t)(((uint32_t)(x)) << LCDIC_IMR_RFIFO_THRES_INTR_MSK_SHIFT)) & LCDIC_IMR_RFIFO_THRES_INTR_MSK_MASK)\r\n\r\n#define LCDIC_IMR_RFIFO_UNDERFLOW_INTR_MSK_MASK  (0x2U)\r\n#define LCDIC_IMR_RFIFO_UNDERFLOW_INTR_MSK_SHIFT (1U)\r\n/*! RFIFO_UNDERFLOW_INTR_MSK - RX FIFO underflow interrupt mask. */\r\n#define LCDIC_IMR_RFIFO_UNDERFLOW_INTR_MSK(x)    (((uint32_t)(((uint32_t)(x)) << LCDIC_IMR_RFIFO_UNDERFLOW_INTR_MSK_SHIFT)) & LCDIC_IMR_RFIFO_UNDERFLOW_INTR_MSK_MASK)\r\n\r\n#define LCDIC_IMR_TFIFO_THRES_INTR_MSK_MASK      (0x4U)\r\n#define LCDIC_IMR_TFIFO_THRES_INTR_MSK_SHIFT     (2U)\r\n/*! TFIFO_THRES_INTR_MSK - TX FIFO threshold interrupt mask. */\r\n#define LCDIC_IMR_TFIFO_THRES_INTR_MSK(x)        (((uint32_t)(((uint32_t)(x)) << LCDIC_IMR_TFIFO_THRES_INTR_MSK_SHIFT)) & LCDIC_IMR_TFIFO_THRES_INTR_MSK_MASK)\r\n\r\n#define LCDIC_IMR_TFIFO_OVERFLOW_INTR_MSK_MASK   (0x8U)\r\n#define LCDIC_IMR_TFIFO_OVERFLOW_INTR_MSK_SHIFT  (3U)\r\n/*! TFIFO_OVERFLOW_INTR_MSK - TX FIFO overflow interrupt mask. */\r\n#define LCDIC_IMR_TFIFO_OVERFLOW_INTR_MSK(x)     (((uint32_t)(((uint32_t)(x)) << LCDIC_IMR_TFIFO_OVERFLOW_INTR_MSK_SHIFT)) & LCDIC_IMR_TFIFO_OVERFLOW_INTR_MSK_MASK)\r\n\r\n#define LCDIC_IMR_TE_TO_INTR_MSK_MASK            (0x10U)\r\n#define LCDIC_IMR_TE_TO_INTR_MSK_SHIFT           (4U)\r\n/*! TE_TO_INTR_MSK - TE timeout interrupt mask. */\r\n#define LCDIC_IMR_TE_TO_INTR_MSK(x)              (((uint32_t)(((uint32_t)(x)) << LCDIC_IMR_TE_TO_INTR_MSK_SHIFT)) & LCDIC_IMR_TE_TO_INTR_MSK_MASK)\r\n\r\n#define LCDIC_IMR_CMD_TO_INTR_MSK_MASK           (0x20U)\r\n#define LCDIC_IMR_CMD_TO_INTR_MSK_SHIFT          (5U)\r\n/*! CMD_TO_INTR_MSK - TRX command timeout interrupt mask. */\r\n#define LCDIC_IMR_CMD_TO_INTR_MSK(x)             (((uint32_t)(((uint32_t)(x)) << LCDIC_IMR_CMD_TO_INTR_MSK_SHIFT)) & LCDIC_IMR_CMD_TO_INTR_MSK_MASK)\r\n\r\n#define LCDIC_IMR_CMD_DONE_INTR_MSK_MASK         (0x40U)\r\n#define LCDIC_IMR_CMD_DONE_INTR_MSK_SHIFT        (6U)\r\n/*! CMD_DONE_INTR_MSK - TRX command done interrupt mask. */\r\n#define LCDIC_IMR_CMD_DONE_INTR_MSK(x)           (((uint32_t)(((uint32_t)(x)) << LCDIC_IMR_CMD_DONE_INTR_MSK_SHIFT)) & LCDIC_IMR_CMD_DONE_INTR_MSK_MASK)\r\n\r\n#define LCDIC_IMR_RST_DONE_INTR_MSK_MASK         (0x80U)\r\n#define LCDIC_IMR_RST_DONE_INTR_MSK_SHIFT        (7U)\r\n/*! RST_DONE_INTR_MSK - Reset done interrupt mask. */\r\n#define LCDIC_IMR_RST_DONE_INTR_MSK(x)           (((uint32_t)(((uint32_t)(x)) << LCDIC_IMR_RST_DONE_INTR_MSK_SHIFT)) & LCDIC_IMR_RST_DONE_INTR_MSK_MASK)\r\n/*! @} */\r\n\r\n/*! @name STATUS0 - Status Register */\r\n/*! @{ */\r\n\r\n#define LCDIC_STATUS0_LCDIC_IDLE_MASK            (0x1U)\r\n#define LCDIC_STATUS0_LCDIC_IDLE_SHIFT           (0U)\r\n/*! LCDIC_IDLE - lcdic system idle. */\r\n#define LCDIC_STATUS0_LCDIC_IDLE(x)              (((uint32_t)(((uint32_t)(x)) << LCDIC_STATUS0_LCDIC_IDLE_SHIFT)) & LCDIC_STATUS0_LCDIC_IDLE_MASK)\r\n\r\n#define LCDIC_STATUS0_TFIFO_THRES_MASK           (0x2U)\r\n#define LCDIC_STATUS0_TFIFO_THRES_SHIFT          (1U)\r\n/*! TFIFO_THRES - TX FIFO threshold status. */\r\n#define LCDIC_STATUS0_TFIFO_THRES(x)             (((uint32_t)(((uint32_t)(x)) << LCDIC_STATUS0_TFIFO_THRES_SHIFT)) & LCDIC_STATUS0_TFIFO_THRES_MASK)\r\n\r\n#define LCDIC_STATUS0_TFIFO_FULL_MASK            (0x4U)\r\n#define LCDIC_STATUS0_TFIFO_FULL_SHIFT           (2U)\r\n/*! TFIFO_FULL - TX FIFO full. */\r\n#define LCDIC_STATUS0_TFIFO_FULL(x)              (((uint32_t)(((uint32_t)(x)) << LCDIC_STATUS0_TFIFO_FULL_SHIFT)) & LCDIC_STATUS0_TFIFO_FULL_MASK)\r\n\r\n#define LCDIC_STATUS0_RFIFO_THRES_MASK           (0x8U)\r\n#define LCDIC_STATUS0_RFIFO_THRES_SHIFT          (3U)\r\n/*! RFIFO_THRES - RX FIFO threshold status. */\r\n#define LCDIC_STATUS0_RFIFO_THRES(x)             (((uint32_t)(((uint32_t)(x)) << LCDIC_STATUS0_RFIFO_THRES_SHIFT)) & LCDIC_STATUS0_RFIFO_THRES_MASK)\r\n\r\n#define LCDIC_STATUS0_RFIFO_EMPTY_MASK           (0x10U)\r\n#define LCDIC_STATUS0_RFIFO_EMPTY_SHIFT          (4U)\r\n/*! RFIFO_EMPTY - RX FIFO empty. */\r\n#define LCDIC_STATUS0_RFIFO_EMPTY(x)             (((uint32_t)(((uint32_t)(x)) << LCDIC_STATUS0_RFIFO_EMPTY_SHIFT)) & LCDIC_STATUS0_RFIFO_EMPTY_MASK)\r\n\r\n#define LCDIC_STATUS0_TB_CNT_MASK                (0x7FFFE0U)\r\n#define LCDIC_STATUS0_TB_CNT_SHIFT               (5U)\r\n/*! TB_CNT - Transmission byte counter which indicates how many TB has been successfully transmitted. */\r\n#define LCDIC_STATUS0_TB_CNT(x)                  (((uint32_t)(((uint32_t)(x)) << LCDIC_STATUS0_TB_CNT_SHIFT)) & LCDIC_STATUS0_TB_CNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name STATUS1 - Touch Detection Control Register4 */\r\n/*! @{ */\r\n\r\n#define LCDIC_STATUS1_TRX_CMD_MASK               (0xFFFFFFFFU)\r\n#define LCDIC_STATUS1_TRX_CMD_SHIFT              (0U)\r\n/*! TRX_CMD - TRX command which is under processing. */\r\n#define LCDIC_STATUS1_TRX_CMD(x)                 (((uint32_t)(((uint32_t)(x)) << LCDIC_STATUS1_TRX_CMD_SHIFT)) & LCDIC_STATUS1_TRX_CMD_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group LCDIC_Register_Masks */\r\n\r\n\r\n/* LCDIC - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral LCDIC base address */\r\n  #define LCDIC_BASE                               (0x50128000u)\r\n  /** Peripheral LCDIC base address */\r\n  #define LCDIC_BASE_NS                            (0x40128000u)\r\n  /** Peripheral LCDIC base pointer */\r\n  #define LCDIC                                    ((LCDIC_Type *)LCDIC_BASE)\r\n  /** Peripheral LCDIC base pointer */\r\n  #define LCDIC_NS                                 ((LCDIC_Type *)LCDIC_BASE_NS)\r\n  /** Array initializer of LCDIC peripheral base addresses */\r\n  #define LCDIC_BASE_ADDRS                         { LCDIC_BASE }\r\n  /** Array initializer of LCDIC peripheral base pointers */\r\n  #define LCDIC_BASE_PTRS                          { LCDIC }\r\n  /** Array initializer of LCDIC peripheral base addresses */\r\n  #define LCDIC_BASE_ADDRS_NS                      { LCDIC_BASE_NS }\r\n  /** Array initializer of LCDIC peripheral base pointers */\r\n  #define LCDIC_BASE_PTRS_NS                       { LCDIC_NS }\r\n#else\r\n  /** Peripheral LCDIC base address */\r\n  #define LCDIC_BASE                               (0x40128000u)\r\n  /** Peripheral LCDIC base pointer */\r\n  #define LCDIC                                    ((LCDIC_Type *)LCDIC_BASE)\r\n  /** Array initializer of LCDIC peripheral base addresses */\r\n  #define LCDIC_BASE_ADDRS                         { LCDIC_BASE }\r\n  /** Array initializer of LCDIC peripheral base pointers */\r\n  #define LCDIC_BASE_PTRS                          { LCDIC }\r\n#endif\r\n/** Interrupt vectors for the LCDIC peripheral type */\r\n#define LCDIC_IRQS                               { LCD_IRQn }\r\n\r\n/*!\r\n * @}\r\n */ /* end of group LCDIC_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- MCI_IO_MUX Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup MCI_IO_MUX_Peripheral_Access_Layer MCI_IO_MUX Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** MCI_IO_MUX - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t S_GPIO;                            /**< security GPIO sel, offset: 0x0 */\r\n  __IO uint32_t FC0;                               /**< flexcomm0 function sel, offset: 0x4 */\r\n  __IO uint32_t FC1;                               /**< flexcomm1 function sel, offset: 0x8 */\r\n  __IO uint32_t FC2;                               /**< flexcomm2 function sel, offset: 0xC */\r\n  __IO uint32_t FC3;                               /**< flexcomm3 function sel, offset: 0x10 */\r\n       uint8_t RESERVED_0[8];\r\n  __IO uint32_t FC14;                              /**< flexcomm14 function sel, offset: 0x1C */\r\n  __IO uint32_t FSEL;                              /**< function sel, offset: 0x20 */\r\n  __IO uint32_t C_TIMER_IN;                        /**< ctimer input function sel, offset: 0x24 */\r\n  __IO uint32_t C_TIMER_OUT;                       /**< ctimer output function sel, offset: 0x28 */\r\n  __IO uint32_t SC_TIMER;                          /**< sctimer function sel, offset: 0x2C */\r\n  __IO uint32_t GPIO_GRP0;                         /**< GPIO[31:0] sel, offset: 0x30 */\r\n  __IO uint32_t GPIO_GRP1;                         /**< GPIO[63:32] sel, offset: 0x34 */\r\n} MCI_IO_MUX_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- MCI_IO_MUX Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup MCI_IO_MUX_Register_Masks MCI_IO_MUX Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name S_GPIO - security GPIO sel */\r\n/*! @{ */\r\n\r\n#define MCI_IO_MUX_S_GPIO_SEL_MASK               (0xFFFFFFFFU)\r\n#define MCI_IO_MUX_S_GPIO_SEL_SHIFT              (0U)\r\n/*! SEL - spio0[31:0] selection, high valid; sel[i]->spio0[i]->GPIO[i+32] */\r\n#define MCI_IO_MUX_S_GPIO_SEL(x)                 (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_S_GPIO_SEL_SHIFT)) & MCI_IO_MUX_S_GPIO_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name FC0 - flexcomm0 function sel */\r\n/*! @{ */\r\n\r\n#define MCI_IO_MUX_FC0_SEL_FC0_USART_SCK_MASK    (0x1U)\r\n#define MCI_IO_MUX_FC0_SEL_FC0_USART_SCK_SHIFT   (0U)\r\n/*! SEL_FC0_USART_SCK - flexcomm0:select GPIO-4 as usart sck */\r\n#define MCI_IO_MUX_FC0_SEL_FC0_USART_SCK(x)      (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC0_SEL_FC0_USART_SCK_SHIFT)) & MCI_IO_MUX_FC0_SEL_FC0_USART_SCK_MASK)\r\n\r\n#define MCI_IO_MUX_FC0_SEL_FC0_I2C_MASK          (0x2U)\r\n#define MCI_IO_MUX_FC0_SEL_FC0_I2C_SHIFT         (1U)\r\n/*! SEL_FC0_I2C - flexcomm0:select GPIO-2/3 as i2c function */\r\n#define MCI_IO_MUX_FC0_SEL_FC0_I2C(x)            (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC0_SEL_FC0_I2C_SHIFT)) & MCI_IO_MUX_FC0_SEL_FC0_I2C_MASK)\r\n\r\n#define MCI_IO_MUX_FC0_SEL_FC0_I2S_MASK          (0x4U)\r\n#define MCI_IO_MUX_FC0_SEL_FC0_I2S_SHIFT         (2U)\r\n/*! SEL_FC0_I2S - flexcomm0:select GPIO-2/3/4 as i2s function */\r\n#define MCI_IO_MUX_FC0_SEL_FC0_I2S(x)            (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC0_SEL_FC0_I2S_SHIFT)) & MCI_IO_MUX_FC0_SEL_FC0_I2S_MASK)\r\n\r\n#define MCI_IO_MUX_FC0_SEL_FC0_SPI_MASK          (0x8U)\r\n#define MCI_IO_MUX_FC0_SEL_FC0_SPI_SHIFT         (3U)\r\n/*! SEL_FC0_SPI - flexcomm0:select GPIO-0/2/3/4 as spi function */\r\n#define MCI_IO_MUX_FC0_SEL_FC0_SPI(x)            (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC0_SEL_FC0_SPI_SHIFT)) & MCI_IO_MUX_FC0_SEL_FC0_SPI_MASK)\r\n\r\n#define MCI_IO_MUX_FC0_SEL_FC0_I2S_DATA_ONLY_MASK (0x100U)\r\n#define MCI_IO_MUX_FC0_SEL_FC0_I2S_DATA_ONLY_SHIFT (8U)\r\n/*! SEL_FC0_I2S_DATA_ONLY - flexcomm0:select GPIO-2 as i2s data */\r\n#define MCI_IO_MUX_FC0_SEL_FC0_I2S_DATA_ONLY(x)  (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC0_SEL_FC0_I2S_DATA_ONLY_SHIFT)) & MCI_IO_MUX_FC0_SEL_FC0_I2S_DATA_ONLY_MASK)\r\n\r\n#define MCI_IO_MUX_FC0_SEL_FC0_USART_DATA_MASK   (0x200U)\r\n#define MCI_IO_MUX_FC0_SEL_FC0_USART_DATA_SHIFT  (9U)\r\n/*! SEL_FC0_USART_DATA - flexcomm0:select GPIO-2/3 as usart rxd/txd */\r\n#define MCI_IO_MUX_FC0_SEL_FC0_USART_DATA(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC0_SEL_FC0_USART_DATA_SHIFT)) & MCI_IO_MUX_FC0_SEL_FC0_USART_DATA_MASK)\r\n\r\n#define MCI_IO_MUX_FC0_SEL_FC0_USART_CMD_MASK    (0x400U)\r\n#define MCI_IO_MUX_FC0_SEL_FC0_USART_CMD_SHIFT   (10U)\r\n/*! SEL_FC0_USART_CMD - flexcomm0:select GPIO-0/5 as usart cts/rts */\r\n#define MCI_IO_MUX_FC0_SEL_FC0_USART_CMD(x)      (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC0_SEL_FC0_USART_CMD_SHIFT)) & MCI_IO_MUX_FC0_SEL_FC0_USART_CMD_MASK)\r\n/*! @} */\r\n\r\n/*! @name FC1 - flexcomm1 function sel */\r\n/*! @{ */\r\n\r\n#define MCI_IO_MUX_FC1_SEL_FC1_USART_SCK_MASK    (0x1U)\r\n#define MCI_IO_MUX_FC1_SEL_FC1_USART_SCK_SHIFT   (0U)\r\n/*! SEL_FC1_USART_SCK - flexcomm1:select GPIO-7 as usart sck */\r\n#define MCI_IO_MUX_FC1_SEL_FC1_USART_SCK(x)      (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC1_SEL_FC1_USART_SCK_SHIFT)) & MCI_IO_MUX_FC1_SEL_FC1_USART_SCK_MASK)\r\n\r\n#define MCI_IO_MUX_FC1_SEL_FC1_I2C_MASK          (0x2U)\r\n#define MCI_IO_MUX_FC1_SEL_FC1_I2C_SHIFT         (1U)\r\n/*! SEL_FC1_I2C - flexcomm1:select GPIO-8/9 as i2c function */\r\n#define MCI_IO_MUX_FC1_SEL_FC1_I2C(x)            (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC1_SEL_FC1_I2C_SHIFT)) & MCI_IO_MUX_FC1_SEL_FC1_I2C_MASK)\r\n\r\n#define MCI_IO_MUX_FC1_SEL_FC1_I2S_MASK          (0x4U)\r\n#define MCI_IO_MUX_FC1_SEL_FC1_I2S_SHIFT         (2U)\r\n/*! SEL_FC1_I2S - flexcomm1:select GPIO-7/8/9 as i2s function */\r\n#define MCI_IO_MUX_FC1_SEL_FC1_I2S(x)            (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC1_SEL_FC1_I2S_SHIFT)) & MCI_IO_MUX_FC1_SEL_FC1_I2S_MASK)\r\n\r\n#define MCI_IO_MUX_FC1_SEL_FC1_SPI_MASK          (0x8U)\r\n#define MCI_IO_MUX_FC1_SEL_FC1_SPI_SHIFT         (3U)\r\n/*! SEL_FC1_SPI - flexcomm1:select GPIO-6/7/8/9 as spi function */\r\n#define MCI_IO_MUX_FC1_SEL_FC1_SPI(x)            (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC1_SEL_FC1_SPI_SHIFT)) & MCI_IO_MUX_FC1_SEL_FC1_SPI_MASK)\r\n\r\n#define MCI_IO_MUX_FC1_SEL_FC1_I2S_DATA_ONLY_MASK (0x100U)\r\n#define MCI_IO_MUX_FC1_SEL_FC1_I2S_DATA_ONLY_SHIFT (8U)\r\n/*! SEL_FC1_I2S_DATA_ONLY - flexcomm1:select GPIO-9 as i2s data */\r\n#define MCI_IO_MUX_FC1_SEL_FC1_I2S_DATA_ONLY(x)  (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC1_SEL_FC1_I2S_DATA_ONLY_SHIFT)) & MCI_IO_MUX_FC1_SEL_FC1_I2S_DATA_ONLY_MASK)\r\n\r\n#define MCI_IO_MUX_FC1_SEL_FC1_USART_DATA_MASK   (0x200U)\r\n#define MCI_IO_MUX_FC1_SEL_FC1_USART_DATA_SHIFT  (9U)\r\n/*! SEL_FC1_USART_DATA - flexcomm1:select GPIO-8/9 as usart txd/rxd */\r\n#define MCI_IO_MUX_FC1_SEL_FC1_USART_DATA(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC1_SEL_FC1_USART_DATA_SHIFT)) & MCI_IO_MUX_FC1_SEL_FC1_USART_DATA_MASK)\r\n\r\n#define MCI_IO_MUX_FC1_SEL_FC1_USART_CMD_MASK    (0x400U)\r\n#define MCI_IO_MUX_FC1_SEL_FC1_USART_CMD_SHIFT   (10U)\r\n/*! SEL_FC1_USART_CMD - flexcomm1:select GPIO-6/10 as usart cts/rts */\r\n#define MCI_IO_MUX_FC1_SEL_FC1_USART_CMD(x)      (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC1_SEL_FC1_USART_CMD_SHIFT)) & MCI_IO_MUX_FC1_SEL_FC1_USART_CMD_MASK)\r\n/*! @} */\r\n\r\n/*! @name FC2 - flexcomm2 function sel */\r\n/*! @{ */\r\n\r\n#define MCI_IO_MUX_FC2_SEL_FC2_USART_SCK_MASK    (0x1U)\r\n#define MCI_IO_MUX_FC2_SEL_FC2_USART_SCK_SHIFT   (0U)\r\n/*! SEL_FC2_USART_SCK - flexcomm2:select GPIO-15 as usart sck */\r\n#define MCI_IO_MUX_FC2_SEL_FC2_USART_SCK(x)      (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC2_SEL_FC2_USART_SCK_SHIFT)) & MCI_IO_MUX_FC2_SEL_FC2_USART_SCK_MASK)\r\n\r\n#define MCI_IO_MUX_FC2_SEL_FC2_I2C_MASK          (0x2U)\r\n#define MCI_IO_MUX_FC2_SEL_FC2_I2C_SHIFT         (1U)\r\n/*! SEL_FC2_I2C - flexcomm2:select GPIO-13/14 as i2c function */\r\n#define MCI_IO_MUX_FC2_SEL_FC2_I2C(x)            (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC2_SEL_FC2_I2C_SHIFT)) & MCI_IO_MUX_FC2_SEL_FC2_I2C_MASK)\r\n\r\n#define MCI_IO_MUX_FC2_SEL_FC2_I2S_MASK          (0x4U)\r\n#define MCI_IO_MUX_FC2_SEL_FC2_I2S_SHIFT         (2U)\r\n/*! SEL_FC2_I2S - flexcomm2:select GPIO-13/14/15 as i2s function */\r\n#define MCI_IO_MUX_FC2_SEL_FC2_I2S(x)            (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC2_SEL_FC2_I2S_SHIFT)) & MCI_IO_MUX_FC2_SEL_FC2_I2S_MASK)\r\n\r\n#define MCI_IO_MUX_FC2_SEL_FC2_SPI_MASK          (0x8U)\r\n#define MCI_IO_MUX_FC2_SEL_FC2_SPI_SHIFT         (3U)\r\n/*! SEL_FC2_SPI - flexcomm2:select GPIO-13/14/15/16 as spi function */\r\n#define MCI_IO_MUX_FC2_SEL_FC2_SPI(x)            (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC2_SEL_FC2_SPI_SHIFT)) & MCI_IO_MUX_FC2_SEL_FC2_SPI_MASK)\r\n\r\n#define MCI_IO_MUX_FC2_SEL_FC2_I2C_COPY_PIN_MASK (0x10U)\r\n#define MCI_IO_MUX_FC2_SEL_FC2_I2C_COPY_PIN_SHIFT (4U)\r\n/*! SEL_FC2_I2C_COPY_PIN - flexcomm2:select GPIO-16/17 as i2c function */\r\n#define MCI_IO_MUX_FC2_SEL_FC2_I2C_COPY_PIN(x)   (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC2_SEL_FC2_I2C_COPY_PIN_SHIFT)) & MCI_IO_MUX_FC2_SEL_FC2_I2C_COPY_PIN_MASK)\r\n\r\n#define MCI_IO_MUX_FC2_SEL_FC2_I2S_DATA_ONLY_MASK (0x100U)\r\n#define MCI_IO_MUX_FC2_SEL_FC2_I2S_DATA_ONLY_SHIFT (8U)\r\n/*! SEL_FC2_I2S_DATA_ONLY - flexcomm2:select GPIO-13 as i2s data function */\r\n#define MCI_IO_MUX_FC2_SEL_FC2_I2S_DATA_ONLY(x)  (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC2_SEL_FC2_I2S_DATA_ONLY_SHIFT)) & MCI_IO_MUX_FC2_SEL_FC2_I2S_DATA_ONLY_MASK)\r\n\r\n#define MCI_IO_MUX_FC2_SEL_FC2_USART_DATA_MASK   (0x200U)\r\n#define MCI_IO_MUX_FC2_SEL_FC2_USART_DATA_SHIFT  (9U)\r\n/*! SEL_FC2_USART_DATA - flexcomm2:select GPIO-13/14 as usart rxd/txd */\r\n#define MCI_IO_MUX_FC2_SEL_FC2_USART_DATA(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC2_SEL_FC2_USART_DATA_SHIFT)) & MCI_IO_MUX_FC2_SEL_FC2_USART_DATA_MASK)\r\n\r\n#define MCI_IO_MUX_FC2_SEL_FC2_USART_CMD_MASK    (0x400U)\r\n#define MCI_IO_MUX_FC2_SEL_FC2_USART_CMD_SHIFT   (10U)\r\n/*! SEL_FC2_USART_CMD - flexcomm2:select GPIO-16/17 as usart cts/rts */\r\n#define MCI_IO_MUX_FC2_SEL_FC2_USART_CMD(x)      (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC2_SEL_FC2_USART_CMD_SHIFT)) & MCI_IO_MUX_FC2_SEL_FC2_USART_CMD_MASK)\r\n/*! @} */\r\n\r\n/*! @name FC3 - flexcomm3 function sel */\r\n/*! @{ */\r\n\r\n#define MCI_IO_MUX_FC3_SEL_FC3_USART_SCK_MASK    (0x1U)\r\n#define MCI_IO_MUX_FC3_SEL_FC3_USART_SCK_SHIFT   (0U)\r\n/*! SEL_FC3_USART_SCK - flexcomm3:select GPIO-25 as usart sck */\r\n#define MCI_IO_MUX_FC3_SEL_FC3_USART_SCK(x)      (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC3_SEL_FC3_USART_SCK_SHIFT)) & MCI_IO_MUX_FC3_SEL_FC3_USART_SCK_MASK)\r\n\r\n#define MCI_IO_MUX_FC3_SEL_FC3_I2C_MASK          (0x2U)\r\n#define MCI_IO_MUX_FC3_SEL_FC3_I2C_SHIFT         (1U)\r\n/*! SEL_FC3_I2C - flexcomm3:select GPIO-24/26 as i2c function */\r\n#define MCI_IO_MUX_FC3_SEL_FC3_I2C(x)            (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC3_SEL_FC3_I2C_SHIFT)) & MCI_IO_MUX_FC3_SEL_FC3_I2C_MASK)\r\n\r\n#define MCI_IO_MUX_FC3_SEL_FC3_I2S_MASK          (0x4U)\r\n#define MCI_IO_MUX_FC3_SEL_FC3_I2S_SHIFT         (2U)\r\n/*! SEL_FC3_I2S - flexcomm3:select GPIO-24/25/26 as i2s function */\r\n#define MCI_IO_MUX_FC3_SEL_FC3_I2S(x)            (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC3_SEL_FC3_I2S_SHIFT)) & MCI_IO_MUX_FC3_SEL_FC3_I2S_MASK)\r\n\r\n#define MCI_IO_MUX_FC3_SEL_FC3_SPI_MASK          (0x8U)\r\n#define MCI_IO_MUX_FC3_SEL_FC3_SPI_SHIFT         (3U)\r\n/*! SEL_FC3_SPI - flexcomm3:select GPIO-20/24/25/26 as spi function */\r\n#define MCI_IO_MUX_FC3_SEL_FC3_SPI(x)            (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC3_SEL_FC3_SPI_SHIFT)) & MCI_IO_MUX_FC3_SEL_FC3_SPI_MASK)\r\n\r\n#define MCI_IO_MUX_FC3_SEL_FC3_I2C_COPY_PIN_MASK (0x10U)\r\n#define MCI_IO_MUX_FC3_SEL_FC3_I2C_COPY_PIN_SHIFT (4U)\r\n/*! SEL_FC3_I2C_COPY_PIN - flexcomm3:select GPIO-19/20 as i2c function */\r\n#define MCI_IO_MUX_FC3_SEL_FC3_I2C_COPY_PIN(x)   (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC3_SEL_FC3_I2C_COPY_PIN_SHIFT)) & MCI_IO_MUX_FC3_SEL_FC3_I2C_COPY_PIN_MASK)\r\n\r\n#define MCI_IO_MUX_FC3_SEL_FC3_I2S_DATA_ONLY_MASK (0x100U)\r\n#define MCI_IO_MUX_FC3_SEL_FC3_I2S_DATA_ONLY_SHIFT (8U)\r\n/*! SEL_FC3_I2S_DATA_ONLY - flexcomm3:select GPIO-24 as i2s data */\r\n#define MCI_IO_MUX_FC3_SEL_FC3_I2S_DATA_ONLY(x)  (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC3_SEL_FC3_I2S_DATA_ONLY_SHIFT)) & MCI_IO_MUX_FC3_SEL_FC3_I2S_DATA_ONLY_MASK)\r\n\r\n#define MCI_IO_MUX_FC3_SEL_FC3_USART_DATA_MASK   (0x200U)\r\n#define MCI_IO_MUX_FC3_SEL_FC3_USART_DATA_SHIFT  (9U)\r\n/*! SEL_FC3_USART_DATA - flexcomm3:select GPIO-24/26 as usart rxd/txd */\r\n#define MCI_IO_MUX_FC3_SEL_FC3_USART_DATA(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC3_SEL_FC3_USART_DATA_SHIFT)) & MCI_IO_MUX_FC3_SEL_FC3_USART_DATA_MASK)\r\n\r\n#define MCI_IO_MUX_FC3_SEL_FC3_USART_CMD_MASK    (0x400U)\r\n#define MCI_IO_MUX_FC3_SEL_FC3_USART_CMD_SHIFT   (10U)\r\n/*! SEL_FC3_USART_CMD - flexcomm3:select GPIO-19/20 as usart rts/cts */\r\n#define MCI_IO_MUX_FC3_SEL_FC3_USART_CMD(x)      (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC3_SEL_FC3_USART_CMD_SHIFT)) & MCI_IO_MUX_FC3_SEL_FC3_USART_CMD_MASK)\r\n/*! @} */\r\n\r\n/*! @name FC14 - flexcomm14 function sel */\r\n/*! @{ */\r\n\r\n#define MCI_IO_MUX_FC14_SEL_FC14_USART_SCK_MASK  (0x1U)\r\n#define MCI_IO_MUX_FC14_SEL_FC14_USART_SCK_SHIFT (0U)\r\n/*! SEL_FC14_USART_SCK - flexcomm14:select GPIO-54 as usart sck */\r\n#define MCI_IO_MUX_FC14_SEL_FC14_USART_SCK(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC14_SEL_FC14_USART_SCK_SHIFT)) & MCI_IO_MUX_FC14_SEL_FC14_USART_SCK_MASK)\r\n\r\n#define MCI_IO_MUX_FC14_SEL_FC14_I2C_MASK        (0x2U)\r\n#define MCI_IO_MUX_FC14_SEL_FC14_I2C_SHIFT       (1U)\r\n/*! SEL_FC14_I2C - flexcomm14:select GPIO-56/57 as i2c function */\r\n#define MCI_IO_MUX_FC14_SEL_FC14_I2C(x)          (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC14_SEL_FC14_I2C_SHIFT)) & MCI_IO_MUX_FC14_SEL_FC14_I2C_MASK)\r\n\r\n#define MCI_IO_MUX_FC14_SEL_FC14_I2S_MASK        (0x4U)\r\n#define MCI_IO_MUX_FC14_SEL_FC14_I2S_SHIFT       (2U)\r\n/*! SEL_FC14_I2S - flexcomm14:select GPIO-54/56/57 as i2s function */\r\n#define MCI_IO_MUX_FC14_SEL_FC14_I2S(x)          (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC14_SEL_FC14_I2S_SHIFT)) & MCI_IO_MUX_FC14_SEL_FC14_I2S_MASK)\r\n\r\n#define MCI_IO_MUX_FC14_SEL_FC14_SPI_MASK        (0x8U)\r\n#define MCI_IO_MUX_FC14_SEL_FC14_SPI_SHIFT       (3U)\r\n/*! SEL_FC14_SPI - flexcomm14:select GPIO-53/54/56/57 as spi function */\r\n#define MCI_IO_MUX_FC14_SEL_FC14_SPI(x)          (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC14_SEL_FC14_SPI_SHIFT)) & MCI_IO_MUX_FC14_SEL_FC14_SPI_MASK)\r\n\r\n#define MCI_IO_MUX_FC14_SEL_FC14_I2S_DATA_ONLY_MASK (0x100U)\r\n#define MCI_IO_MUX_FC14_SEL_FC14_I2S_DATA_ONLY_SHIFT (8U)\r\n/*! SEL_FC14_I2S_DATA_ONLY - flexcomm14:select GPIO-57 as i2s data */\r\n#define MCI_IO_MUX_FC14_SEL_FC14_I2S_DATA_ONLY(x) (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC14_SEL_FC14_I2S_DATA_ONLY_SHIFT)) & MCI_IO_MUX_FC14_SEL_FC14_I2S_DATA_ONLY_MASK)\r\n\r\n#define MCI_IO_MUX_FC14_SEL_FC14_USART_DATA_MASK (0x200U)\r\n#define MCI_IO_MUX_FC14_SEL_FC14_USART_DATA_SHIFT (9U)\r\n/*! SEL_FC14_USART_DATA - flexcomm14:select GPIO-56/57 as usart txd/rxd */\r\n#define MCI_IO_MUX_FC14_SEL_FC14_USART_DATA(x)   (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC14_SEL_FC14_USART_DATA_SHIFT)) & MCI_IO_MUX_FC14_SEL_FC14_USART_DATA_MASK)\r\n\r\n#define MCI_IO_MUX_FC14_SEL_FC14_USART_CMD_MASK  (0x400U)\r\n#define MCI_IO_MUX_FC14_SEL_FC14_USART_CMD_SHIFT (10U)\r\n/*! SEL_FC14_USART_CMD - flexcomm14:select GPIO-53/55 as usart cts/rts */\r\n#define MCI_IO_MUX_FC14_SEL_FC14_USART_CMD(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FC14_SEL_FC14_USART_CMD_SHIFT)) & MCI_IO_MUX_FC14_SEL_FC14_USART_CMD_MASK)\r\n/*! @} */\r\n\r\n/*! @name FSEL - function sel */\r\n/*! @{ */\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_QUAD_SPI_FLASH_MASK  (0x2U)\r\n#define MCI_IO_MUX_FSEL_SEL_QUAD_SPI_FLASH_SHIFT (1U)\r\n/*! SEL_QUAD_SPI_FLASH - select quad_spi_flash function */\r\n#define MCI_IO_MUX_FSEL_SEL_QUAD_SPI_FLASH(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_QUAD_SPI_FLASH_SHIFT)) & MCI_IO_MUX_FSEL_SEL_QUAD_SPI_FLASH_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_QUAD_SPI_PSRAM_MASK  (0x8U)\r\n#define MCI_IO_MUX_FSEL_SEL_QUAD_SPI_PSRAM_SHIFT (3U)\r\n/*! SEL_QUAD_SPI_PSRAM - select quad_spi_psram function */\r\n#define MCI_IO_MUX_FSEL_SEL_QUAD_SPI_PSRAM(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_QUAD_SPI_PSRAM_SHIFT)) & MCI_IO_MUX_FSEL_SEL_QUAD_SPI_PSRAM_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_PDM_MASK             (0x10U)\r\n#define MCI_IO_MUX_FSEL_SEL_PDM_SHIFT            (4U)\r\n/*! SEL_PDM - select pdm function */\r\n#define MCI_IO_MUX_FSEL_SEL_PDM(x)               (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_PDM_SHIFT)) & MCI_IO_MUX_FSEL_SEL_PDM_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_USB_MASK             (0x20U)\r\n#define MCI_IO_MUX_FSEL_SEL_USB_SHIFT            (5U)\r\n/*! SEL_USB - select usb function */\r\n#define MCI_IO_MUX_FSEL_SEL_USB(x)               (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_USB_SHIFT)) & MCI_IO_MUX_FSEL_SEL_USB_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_MCLK_MASK            (0x40U)\r\n#define MCI_IO_MUX_FSEL_SEL_MCLK_SHIFT           (6U)\r\n/*! SEL_MCLK - select mclk function */\r\n#define MCI_IO_MUX_FSEL_SEL_MCLK(x)              (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_MCLK_SHIFT)) & MCI_IO_MUX_FSEL_SEL_MCLK_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_UTICK_MASK           (0x200U)\r\n#define MCI_IO_MUX_FSEL_SEL_UTICK_SHIFT          (9U)\r\n/*! SEL_UTICK - select utick function */\r\n#define MCI_IO_MUX_FSEL_SEL_UTICK(x)             (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_UTICK_SHIFT)) & MCI_IO_MUX_FSEL_SEL_UTICK_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_USIM_MASK            (0x400U)\r\n#define MCI_IO_MUX_FSEL_SEL_USIM_SHIFT           (10U)\r\n/*! SEL_USIM - select usim function */\r\n#define MCI_IO_MUX_FSEL_SEL_USIM(x)              (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_USIM_SHIFT)) & MCI_IO_MUX_FSEL_SEL_USIM_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_LCD_8080_MASK        (0x800U)\r\n#define MCI_IO_MUX_FSEL_SEL_LCD_8080_SHIFT       (11U)\r\n/*! SEL_LCD_8080 - select lcd_8080 function */\r\n#define MCI_IO_MUX_FSEL_SEL_LCD_8080(x)          (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_LCD_8080_SHIFT)) & MCI_IO_MUX_FSEL_SEL_LCD_8080_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_LCD_SPI_MASK         (0x1000U)\r\n#define MCI_IO_MUX_FSEL_SEL_LCD_SPI_SHIFT        (12U)\r\n/*! SEL_LCD_SPI - select lcd_spi function */\r\n#define MCI_IO_MUX_FSEL_SEL_LCD_SPI(x)           (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_LCD_SPI_SHIFT)) & MCI_IO_MUX_FSEL_SEL_LCD_SPI_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_FREQ_GPIO_CLK_MASK   (0x2000U)\r\n#define MCI_IO_MUX_FSEL_SEL_FREQ_GPIO_CLK_SHIFT  (13U)\r\n/*! SEL_FREQ_GPIO_CLK - select freq_gpio_clk function */\r\n#define MCI_IO_MUX_FSEL_SEL_FREQ_GPIO_CLK(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_FREQ_GPIO_CLK_SHIFT)) & MCI_IO_MUX_FSEL_SEL_FREQ_GPIO_CLK_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_GPIO_INT_BMATCH_MASK (0x4000U)\r\n#define MCI_IO_MUX_FSEL_SEL_GPIO_INT_BMATCH_SHIFT (14U)\r\n/*! SEL_GPIO_INT_BMATCH - select gpio_int_bmatch function */\r\n#define MCI_IO_MUX_FSEL_SEL_GPIO_INT_BMATCH(x)   (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_GPIO_INT_BMATCH_SHIFT)) & MCI_IO_MUX_FSEL_SEL_GPIO_INT_BMATCH_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_SDIO_MASK            (0x8000U)\r\n#define MCI_IO_MUX_FSEL_SEL_SDIO_SHIFT           (15U)\r\n/*! SEL_SDIO - select sdio function */\r\n#define MCI_IO_MUX_FSEL_SEL_SDIO(x)              (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_SDIO_SHIFT)) & MCI_IO_MUX_FSEL_SEL_SDIO_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_CLK_MASK        (0x10000U)\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_CLK_SHIFT       (16U)\r\n/*! SEL_ENET_CLK - select enet function clk pin */\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_CLK(x)          (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_ENET_CLK_SHIFT)) & MCI_IO_MUX_FSEL_SEL_ENET_CLK_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_GAU_TRIGGER0_MASK    (0x20000U)\r\n#define MCI_IO_MUX_FSEL_SEL_GAU_TRIGGER0_SHIFT   (17U)\r\n/*! SEL_GAU_TRIGGER0 - select gau trigger0 function */\r\n#define MCI_IO_MUX_FSEL_SEL_GAU_TRIGGER0(x)      (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_GAU_TRIGGER0_SHIFT)) & MCI_IO_MUX_FSEL_SEL_GAU_TRIGGER0_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_ACOMP0_GPIO_OUT_MASK (0x40000U)\r\n#define MCI_IO_MUX_FSEL_SEL_ACOMP0_GPIO_OUT_SHIFT (18U)\r\n/*! SEL_ACOMP0_GPIO_OUT - select gau acomp0_gpio_out function */\r\n#define MCI_IO_MUX_FSEL_SEL_ACOMP0_GPIO_OUT(x)   (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_ACOMP0_GPIO_OUT_SHIFT)) & MCI_IO_MUX_FSEL_SEL_ACOMP0_GPIO_OUT_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_ACOMP0_EDGE_PULSE_MASK (0x80000U)\r\n#define MCI_IO_MUX_FSEL_SEL_ACOMP0_EDGE_PULSE_SHIFT (19U)\r\n/*! SEL_ACOMP0_EDGE_PULSE - select gau acomp0_edge_pulse function */\r\n#define MCI_IO_MUX_FSEL_SEL_ACOMP0_EDGE_PULSE(x) (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_ACOMP0_EDGE_PULSE_SHIFT)) & MCI_IO_MUX_FSEL_SEL_ACOMP0_EDGE_PULSE_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_ACOMP1_GPIO_OUT_MASK (0x100000U)\r\n#define MCI_IO_MUX_FSEL_SEL_ACOMP1_GPIO_OUT_SHIFT (20U)\r\n/*! SEL_ACOMP1_GPIO_OUT - select gau acomp1_gpio_out function */\r\n#define MCI_IO_MUX_FSEL_SEL_ACOMP1_GPIO_OUT(x)   (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_ACOMP1_GPIO_OUT_SHIFT)) & MCI_IO_MUX_FSEL_SEL_ACOMP1_GPIO_OUT_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_ACOMP1_EDGE_PULSE_MASK (0x200000U)\r\n#define MCI_IO_MUX_FSEL_SEL_ACOMP1_EDGE_PULSE_SHIFT (21U)\r\n/*! SEL_ACOMP1_EDGE_PULSE - select gau acomp1_edge_pulse function */\r\n#define MCI_IO_MUX_FSEL_SEL_ACOMP1_EDGE_PULSE(x) (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_ACOMP1_EDGE_PULSE_SHIFT)) & MCI_IO_MUX_FSEL_SEL_ACOMP1_EDGE_PULSE_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_GAU_TRIGGER1_MASK    (0x400000U)\r\n#define MCI_IO_MUX_FSEL_SEL_GAU_TRIGGER1_SHIFT   (22U)\r\n/*! SEL_GAU_TRIGGER1 - select gau trigger1 function */\r\n#define MCI_IO_MUX_FSEL_SEL_GAU_TRIGGER1(x)      (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_GAU_TRIGGER1_SHIFT)) & MCI_IO_MUX_FSEL_SEL_GAU_TRIGGER1_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_CLKIN_FRM_PD_MASK    (0x800000U)\r\n#define MCI_IO_MUX_FSEL_SEL_CLKIN_FRM_PD_SHIFT   (23U)\r\n/*! SEL_CLKIN_FRM_PD - select clkin function */\r\n#define MCI_IO_MUX_FSEL_SEL_CLKIN_FRM_PD(x)      (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_CLKIN_FRM_PD_SHIFT)) & MCI_IO_MUX_FSEL_SEL_CLKIN_FRM_PD_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_TX_MASK         (0x2000000U)\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_TX_SHIFT        (25U)\r\n/*! SEL_ENET_TX - select enet function tx pin */\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_TX(x)           (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_ENET_TX_SHIFT)) & MCI_IO_MUX_FSEL_SEL_ENET_TX_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_RX_MASK         (0x4000000U)\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_RX_SHIFT        (26U)\r\n/*! SEL_ENET_RX - select enet function rx pin */\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_RX(x)           (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_ENET_RX_SHIFT)) & MCI_IO_MUX_FSEL_SEL_ENET_RX_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_MDIO_MASK       (0x8000000U)\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_MDIO_SHIFT      (27U)\r\n/*! SEL_ENET_MDIO - select enet function mdio pin */\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_MDIO(x)         (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_ENET_MDIO_SHIFT)) & MCI_IO_MUX_FSEL_SEL_ENET_MDIO_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_TIMER0_MASK     (0x10000000U)\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_TIMER0_SHIFT    (28U)\r\n/*! SEL_ENET_TIMER0 - select enet function timer0 pin */\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_TIMER0(x)       (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_ENET_TIMER0_SHIFT)) & MCI_IO_MUX_FSEL_SEL_ENET_TIMER0_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_TIMER1_MASK     (0x20000000U)\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_TIMER1_SHIFT    (29U)\r\n/*! SEL_ENET_TIMER1 - select enet function timer1 pin */\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_TIMER1(x)       (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_ENET_TIMER1_SHIFT)) & MCI_IO_MUX_FSEL_SEL_ENET_TIMER1_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_TIMER2_MASK     (0x40000000U)\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_TIMER2_SHIFT    (30U)\r\n/*! SEL_ENET_TIMER2 - select enet function timer2 pin */\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_TIMER2(x)       (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_ENET_TIMER2_SHIFT)) & MCI_IO_MUX_FSEL_SEL_ENET_TIMER2_MASK)\r\n\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_TIMER3_MASK     (0x80000000U)\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_TIMER3_SHIFT    (31U)\r\n/*! SEL_ENET_TIMER3 - select enet function timer3 pin */\r\n#define MCI_IO_MUX_FSEL_SEL_ENET_TIMER3(x)       (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_FSEL_SEL_ENET_TIMER3_SHIFT)) & MCI_IO_MUX_FSEL_SEL_ENET_TIMER3_MASK)\r\n/*! @} */\r\n\r\n/*! @name C_TIMER_IN - ctimer input function sel */\r\n/*! @{ */\r\n\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP0_SEL_MASK   (0x1U)\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP0_SEL_SHIFT  (0U)\r\n/*! CT_INP0_SEL - ct_inp0 sel */\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP0_SEL(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_IN_CT_INP0_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_IN_CT_INP0_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP1_SEL_MASK   (0x2U)\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP1_SEL_SHIFT  (1U)\r\n/*! CT_INP1_SEL - ct_inp1 sel */\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP1_SEL(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_IN_CT_INP1_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_IN_CT_INP1_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP2_SEL_MASK   (0x4U)\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP2_SEL_SHIFT  (2U)\r\n/*! CT_INP2_SEL - ct_inp2 sel */\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP2_SEL(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_IN_CT_INP2_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_IN_CT_INP2_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP3_SEL_MASK   (0x8U)\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP3_SEL_SHIFT  (3U)\r\n/*! CT_INP3_SEL - ct_inp3 sel */\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP3_SEL(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_IN_CT_INP3_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_IN_CT_INP3_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP4_SEL_MASK   (0x10U)\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP4_SEL_SHIFT  (4U)\r\n/*! CT_INP4_SEL - ct_inp4 sel */\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP4_SEL(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_IN_CT_INP4_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_IN_CT_INP4_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP5_SEL_MASK   (0x20U)\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP5_SEL_SHIFT  (5U)\r\n/*! CT_INP5_SEL - ct_inp5 sel */\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP5_SEL(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_IN_CT_INP5_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_IN_CT_INP5_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP6_SEL_MASK   (0x40U)\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP6_SEL_SHIFT  (6U)\r\n/*! CT_INP6_SEL - ct_inp6 sel */\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP6_SEL(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_IN_CT_INP6_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_IN_CT_INP6_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP7_SEL_MASK   (0x80U)\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP7_SEL_SHIFT  (7U)\r\n/*! CT_INP7_SEL - ct_inp7 sel */\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP7_SEL(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_IN_CT_INP7_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_IN_CT_INP7_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP8_SEL_MASK   (0x100U)\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP8_SEL_SHIFT  (8U)\r\n/*! CT_INP8_SEL - ct_inp8 sel */\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP8_SEL(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_IN_CT_INP8_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_IN_CT_INP8_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP9_SEL_MASK   (0x200U)\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP9_SEL_SHIFT  (9U)\r\n/*! CT_INP9_SEL - ct_inp9 sel */\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP9_SEL(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_IN_CT_INP9_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_IN_CT_INP9_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP10_SEL_MASK  (0x400U)\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP10_SEL_SHIFT (10U)\r\n/*! CT_INP10_SEL - ct_inp10 sel */\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP10_SEL(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_IN_CT_INP10_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_IN_CT_INP10_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP11_SEL_MASK  (0x800U)\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP11_SEL_SHIFT (11U)\r\n/*! CT_INP11_SEL - ct_inp11 sel */\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP11_SEL(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_IN_CT_INP11_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_IN_CT_INP11_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP12_SEL_MASK  (0x1000U)\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP12_SEL_SHIFT (12U)\r\n/*! CT_INP12_SEL - ct_inp12 sel */\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP12_SEL(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_IN_CT_INP12_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_IN_CT_INP12_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP13_SEL_MASK  (0x2000U)\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP13_SEL_SHIFT (13U)\r\n/*! CT_INP13_SEL - ct_inp13 sel */\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP13_SEL(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_IN_CT_INP13_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_IN_CT_INP13_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP14_SEL_MASK  (0x4000U)\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP14_SEL_SHIFT (14U)\r\n/*! CT_INP14_SEL - ct_inp14 sel */\r\n#define MCI_IO_MUX_C_TIMER_IN_CT_INP14_SEL(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_IN_CT_INP14_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_IN_CT_INP14_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name C_TIMER_OUT - ctimer output function sel */\r\n/*! @{ */\r\n\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT0MAT0_SEL_MASK  (0x1U)\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT0MAT0_SEL_SHIFT (0U)\r\n/*! CT0MAT0_SEL - ct0mat0 sel */\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT0MAT0_SEL(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_OUT_CT0MAT0_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_OUT_CT0MAT0_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT0MAT1_SEL_MASK  (0x2U)\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT0MAT1_SEL_SHIFT (1U)\r\n/*! CT0MAT1_SEL - ct0mat1 sel */\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT0MAT1_SEL(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_OUT_CT0MAT1_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_OUT_CT0MAT1_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT0MAT2_SEL_MASK  (0x4U)\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT0MAT2_SEL_SHIFT (2U)\r\n/*! CT0MAT2_SEL - ct0mat2 sel */\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT0MAT2_SEL(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_OUT_CT0MAT2_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_OUT_CT0MAT2_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT0MAT3_SEL_MASK  (0x8U)\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT0MAT3_SEL_SHIFT (3U)\r\n/*! CT0MAT3_SEL - ct0mat3 sel */\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT0MAT3_SEL(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_OUT_CT0MAT3_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_OUT_CT0MAT3_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT1MAT0_SEL_MASK  (0x10U)\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT1MAT0_SEL_SHIFT (4U)\r\n/*! CT1MAT0_SEL - ct1mat0 sel */\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT1MAT0_SEL(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_OUT_CT1MAT0_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_OUT_CT1MAT0_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT1MAT1_SEL_MASK  (0x20U)\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT1MAT1_SEL_SHIFT (5U)\r\n/*! CT1MAT1_SEL - ct1mat1 sel */\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT1MAT1_SEL(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_OUT_CT1MAT1_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_OUT_CT1MAT1_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT1MAT2_SEL_MASK  (0x40U)\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT1MAT2_SEL_SHIFT (6U)\r\n/*! CT1MAT2_SEL - ct1mat2 sel */\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT1MAT2_SEL(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_OUT_CT1MAT2_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_OUT_CT1MAT2_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT1MAT3_SEL_MASK  (0x80U)\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT1MAT3_SEL_SHIFT (7U)\r\n/*! CT1MAT3_SEL - ct1mat3 sel */\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT1MAT3_SEL(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_OUT_CT1MAT3_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_OUT_CT1MAT3_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT2MAT0_SEL_MASK  (0x100U)\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT2MAT0_SEL_SHIFT (8U)\r\n/*! CT2MAT0_SEL - ct2mat0 sel */\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT2MAT0_SEL(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_OUT_CT2MAT0_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_OUT_CT2MAT0_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT2MAT1_SEL_MASK  (0x200U)\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT2MAT1_SEL_SHIFT (9U)\r\n/*! CT2MAT1_SEL - ct2mat1 sel */\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT2MAT1_SEL(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_OUT_CT2MAT1_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_OUT_CT2MAT1_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT2MAT2_SEL_MASK  (0x400U)\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT2MAT2_SEL_SHIFT (10U)\r\n/*! CT2MAT2_SEL - ct2mat2 sel */\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT2MAT2_SEL(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_OUT_CT2MAT2_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_OUT_CT2MAT2_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT2MAT3_SEL_MASK  (0x800U)\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT2MAT3_SEL_SHIFT (11U)\r\n/*! CT2MAT3_SEL - ct2mat3 sel */\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT2MAT3_SEL(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_OUT_CT2MAT3_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_OUT_CT2MAT3_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT3MAT0_SEL_MASK  (0x1000U)\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT3MAT0_SEL_SHIFT (12U)\r\n/*! CT3MAT0_SEL - ct3mat0 sel */\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT3MAT0_SEL(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_OUT_CT3MAT0_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_OUT_CT3MAT0_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT3MAT1_SEL_MASK  (0x2000U)\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT3MAT1_SEL_SHIFT (13U)\r\n/*! CT3MAT1_SEL - ct3mat1 sel */\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT3MAT1_SEL(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_OUT_CT3MAT1_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_OUT_CT3MAT1_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT3MAT2_SEL_MASK  (0x4000U)\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT3MAT2_SEL_SHIFT (14U)\r\n/*! CT3MAT2_SEL - ct3mat2 sel */\r\n#define MCI_IO_MUX_C_TIMER_OUT_CT3MAT2_SEL(x)    (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_C_TIMER_OUT_CT3MAT2_SEL_SHIFT)) & MCI_IO_MUX_C_TIMER_OUT_CT3MAT2_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SC_TIMER - sctimer function sel */\r\n/*! @{ */\r\n\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP0_SEL_MASK (0x1U)\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP0_SEL_SHIFT (0U)\r\n/*! SCT0_PIN_INP0_SEL - sct0_pin_inp0 sel */\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP0_SEL(x) (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP0_SEL_SHIFT)) & MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP0_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP1_SEL_MASK (0x2U)\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP1_SEL_SHIFT (1U)\r\n/*! SCT0_PIN_INP1_SEL - sct0_pin_inp1 sel */\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP1_SEL(x) (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP1_SEL_SHIFT)) & MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP1_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP2_SEL_MASK (0x4U)\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP2_SEL_SHIFT (2U)\r\n/*! SCT0_PIN_INP2_SEL - sct0_pin_inp2 sel */\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP2_SEL(x) (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP2_SEL_SHIFT)) & MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP2_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP3_SEL_MASK (0x8U)\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP3_SEL_SHIFT (3U)\r\n/*! SCT0_PIN_INP3_SEL - sct0_pin_inp3 sel */\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP3_SEL(x) (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP3_SEL_SHIFT)) & MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP3_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP4_SEL_MASK (0x10U)\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP4_SEL_SHIFT (4U)\r\n/*! SCT0_PIN_INP4_SEL - sct0_pin_inp4 sel */\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP4_SEL(x) (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP4_SEL_SHIFT)) & MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP4_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP5_SEL_MASK (0x20U)\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP5_SEL_SHIFT (5U)\r\n/*! SCT0_PIN_INP5_SEL - sct0_pin_inp5 sel */\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP5_SEL(x) (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP5_SEL_SHIFT)) & MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP5_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP6_SEL_MASK (0x40U)\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP6_SEL_SHIFT (6U)\r\n/*! SCT0_PIN_INP6_SEL - sct0_pin_inp6 sel */\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP6_SEL(x) (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP6_SEL_SHIFT)) & MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP6_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP7_SEL_MASK (0x80U)\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP7_SEL_SHIFT (7U)\r\n/*! SCT0_PIN_INP7_SEL - sct0_pin_inp7 sel */\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP7_SEL(x) (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP7_SEL_SHIFT)) & MCI_IO_MUX_SC_TIMER_SCT0_PIN_INP7_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT0_SEL_MASK   (0x10000U)\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT0_SEL_SHIFT  (16U)\r\n/*! SCT0_OUT0_SEL - sct0_out0 sel */\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT0_SEL(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_SC_TIMER_SCT0_OUT0_SEL_SHIFT)) & MCI_IO_MUX_SC_TIMER_SCT0_OUT0_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT1_SEL_MASK   (0x20000U)\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT1_SEL_SHIFT  (17U)\r\n/*! SCT0_OUT1_SEL - sct0_out1 sel */\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT1_SEL(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_SC_TIMER_SCT0_OUT1_SEL_SHIFT)) & MCI_IO_MUX_SC_TIMER_SCT0_OUT1_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT4_SEL_MASK   (0x100000U)\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT4_SEL_SHIFT  (20U)\r\n/*! SCT0_OUT4_SEL - sct0_out4 sel */\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT4_SEL(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_SC_TIMER_SCT0_OUT4_SEL_SHIFT)) & MCI_IO_MUX_SC_TIMER_SCT0_OUT4_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT5_SEL_MASK   (0x200000U)\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT5_SEL_SHIFT  (21U)\r\n/*! SCT0_OUT5_SEL - sct0_out5 sel */\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT5_SEL(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_SC_TIMER_SCT0_OUT5_SEL_SHIFT)) & MCI_IO_MUX_SC_TIMER_SCT0_OUT5_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT6_SEL_MASK   (0x400000U)\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT6_SEL_SHIFT  (22U)\r\n/*! SCT0_OUT6_SEL - sct0_out6 sel */\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT6_SEL(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_SC_TIMER_SCT0_OUT6_SEL_SHIFT)) & MCI_IO_MUX_SC_TIMER_SCT0_OUT6_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT7_SEL_MASK   (0x800000U)\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT7_SEL_SHIFT  (23U)\r\n/*! SCT0_OUT7_SEL - sct0_out7 sel */\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT7_SEL(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_SC_TIMER_SCT0_OUT7_SEL_SHIFT)) & MCI_IO_MUX_SC_TIMER_SCT0_OUT7_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT8_SEL_MASK   (0x1000000U)\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT8_SEL_SHIFT  (24U)\r\n/*! SCT0_OUT8_SEL - sct0_out8 sel */\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT8_SEL(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_SC_TIMER_SCT0_OUT8_SEL_SHIFT)) & MCI_IO_MUX_SC_TIMER_SCT0_OUT8_SEL_MASK)\r\n\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT9_SEL_MASK   (0x2000000U)\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT9_SEL_SHIFT  (25U)\r\n/*! SCT0_OUT9_SEL - sct0_out9 sel */\r\n#define MCI_IO_MUX_SC_TIMER_SCT0_OUT9_SEL(x)     (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_SC_TIMER_SCT0_OUT9_SEL_SHIFT)) & MCI_IO_MUX_SC_TIMER_SCT0_OUT9_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name GPIO_GRP0 - GPIO[31:0] sel */\r\n/*! @{ */\r\n\r\n#define MCI_IO_MUX_GPIO_GRP0_SEL_MASK            (0xFFFFFFFFU)\r\n#define MCI_IO_MUX_GPIO_GRP0_SEL_SHIFT           (0U)\r\n/*! SEL - pio0[31:0] selection, high valid; sel[i]->pio0[i]->GPIO[i] */\r\n#define MCI_IO_MUX_GPIO_GRP0_SEL(x)              (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_GPIO_GRP0_SEL_SHIFT)) & MCI_IO_MUX_GPIO_GRP0_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name GPIO_GRP1 - GPIO[63:32] sel */\r\n/*! @{ */\r\n\r\n#define MCI_IO_MUX_GPIO_GRP1_SEL_MASK            (0xFFFFFFFFU)\r\n#define MCI_IO_MUX_GPIO_GRP1_SEL_SHIFT           (0U)\r\n/*! SEL - pio0[63:32] selection, high valid; sel[i]->pio0[i+32]->GPIO[i+32] */\r\n#define MCI_IO_MUX_GPIO_GRP1_SEL(x)              (((uint32_t)(((uint32_t)(x)) << MCI_IO_MUX_GPIO_GRP1_SEL_SHIFT)) & MCI_IO_MUX_GPIO_GRP1_SEL_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group MCI_IO_MUX_Register_Masks */\r\n\r\n\r\n/* MCI_IO_MUX - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral MCI_IO_MUX base address */\r\n  #define MCI_IO_MUX_BASE                          (0x50004000u)\r\n  /** Peripheral MCI_IO_MUX base address */\r\n  #define MCI_IO_MUX_BASE_NS                       (0x40004000u)\r\n  /** Peripheral MCI_IO_MUX base pointer */\r\n  #define MCI_IO_MUX                               ((MCI_IO_MUX_Type *)MCI_IO_MUX_BASE)\r\n  /** Peripheral MCI_IO_MUX base pointer */\r\n  #define MCI_IO_MUX_NS                            ((MCI_IO_MUX_Type *)MCI_IO_MUX_BASE_NS)\r\n  /** Array initializer of MCI_IO_MUX peripheral base addresses */\r\n  #define MCI_IO_MUX_BASE_ADDRS                    { MCI_IO_MUX_BASE }\r\n  /** Array initializer of MCI_IO_MUX peripheral base pointers */\r\n  #define MCI_IO_MUX_BASE_PTRS                     { MCI_IO_MUX }\r\n  /** Array initializer of MCI_IO_MUX peripheral base addresses */\r\n  #define MCI_IO_MUX_BASE_ADDRS_NS                 { MCI_IO_MUX_BASE_NS }\r\n  /** Array initializer of MCI_IO_MUX peripheral base pointers */\r\n  #define MCI_IO_MUX_BASE_PTRS_NS                  { MCI_IO_MUX_NS }\r\n#else\r\n  /** Peripheral MCI_IO_MUX base address */\r\n  #define MCI_IO_MUX_BASE                          (0x40004000u)\r\n  /** Peripheral MCI_IO_MUX base pointer */\r\n  #define MCI_IO_MUX                               ((MCI_IO_MUX_Type *)MCI_IO_MUX_BASE)\r\n  /** Array initializer of MCI_IO_MUX peripheral base addresses */\r\n  #define MCI_IO_MUX_BASE_ADDRS                    { MCI_IO_MUX_BASE }\r\n  /** Array initializer of MCI_IO_MUX peripheral base pointers */\r\n  #define MCI_IO_MUX_BASE_PTRS                     { MCI_IO_MUX }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group MCI_IO_MUX_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- MRT Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup MRT_Peripheral_Access_Layer MRT Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** MRT - Register Layout Typedef */\r\ntypedef struct {\r\n  struct {                                         /* offset: 0x0, array step: 0x10 */\r\n    __IO uint32_t INTVAL;                            /**< Time Interval Value, array offset: 0x0, array step: 0x10, irregular array, not all indices are valid */\r\n    __I  uint32_t TIMER;                             /**< Timer, array offset: 0x4, array step: 0x10, irregular array, not all indices are valid */\r\n    __IO uint32_t CTRL;                              /**< Control, array offset: 0x8, array step: 0x10, irregular array, not all indices are valid */\r\n    __IO uint32_t STAT;                              /**< Status, array offset: 0xC, array step: 0x10, irregular array, not all indices are valid */\r\n  } CHANNEL[8];\r\n       uint8_t RESERVED_0[112];\r\n  __IO uint32_t MODCFG;                            /**< Module Configuration, offset: 0xF0 */\r\n  __I  uint32_t IDLE_CH;                           /**< Idle Channel, offset: 0xF4 */\r\n  __IO uint32_t IRQ_FLAG;                          /**< Global Interrupt Flag, offset: 0xF8 */\r\n  __I  uint32_t ID_CODE;                           /**< Multi-Rate Timer ID code, offset: 0xFC */\r\n} MRT_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- MRT Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup MRT_Register_Masks MRT Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name CHANNEL_INTVAL - Time Interval Value */\r\n/*! @{ */\r\n\r\n#define MRT_CHANNEL_INTVAL_IVALUE_MASK           (0xFFFFFFU)\r\n#define MRT_CHANNEL_INTVAL_IVALUE_SHIFT          (0U)\r\n/*! IVALUE - Time interval load value. */\r\n#define MRT_CHANNEL_INTVAL_IVALUE(x)             (((uint32_t)(((uint32_t)(x)) << MRT_CHANNEL_INTVAL_IVALUE_SHIFT)) & MRT_CHANNEL_INTVAL_IVALUE_MASK)\r\n\r\n#define MRT_CHANNEL_INTVAL_LOAD_MASK             (0x80000000U)\r\n#define MRT_CHANNEL_INTVAL_LOAD_SHIFT            (31U)\r\n/*! LOAD - Determines how the timer interval value (IVALUE -1) is loaded into the TIMER n register.\r\n *  0b0..No force load.\r\n *  0b1..Force load. T\r\n */\r\n#define MRT_CHANNEL_INTVAL_LOAD(x)               (((uint32_t)(((uint32_t)(x)) << MRT_CHANNEL_INTVAL_LOAD_SHIFT)) & MRT_CHANNEL_INTVAL_LOAD_MASK)\r\n/*! @} */\r\n\r\n/* The count of MRT_CHANNEL_INTVAL */\r\n#define MRT_CHANNEL_INTVAL_COUNT                 (8U)\r\n\r\n/*! @name CHANNEL_TIMER - Timer */\r\n/*! @{ */\r\n\r\n#define MRT_CHANNEL_TIMER_VALUE_MASK             (0xFFFFFFU)\r\n#define MRT_CHANNEL_TIMER_VALUE_SHIFT            (0U)\r\n/*! VALUE - Holds the current timer value of the down-counter. */\r\n#define MRT_CHANNEL_TIMER_VALUE(x)               (((uint32_t)(((uint32_t)(x)) << MRT_CHANNEL_TIMER_VALUE_SHIFT)) & MRT_CHANNEL_TIMER_VALUE_MASK)\r\n/*! @} */\r\n\r\n/* The count of MRT_CHANNEL_TIMER */\r\n#define MRT_CHANNEL_TIMER_COUNT                  (8U)\r\n\r\n/*! @name CHANNEL_CTRL - Control */\r\n/*! @{ */\r\n\r\n#define MRT_CHANNEL_CTRL_INTEN_MASK              (0x1U)\r\n#define MRT_CHANNEL_CTRL_INTEN_SHIFT             (0U)\r\n/*! INTEN - Enable the TIMER n interrupt.\r\n *  0b0..Disabled. TIMER n interrupt is disabled.\r\n *  0b1..Enabled. TIMER n interrupt is enabled.\r\n */\r\n#define MRT_CHANNEL_CTRL_INTEN(x)                (((uint32_t)(((uint32_t)(x)) << MRT_CHANNEL_CTRL_INTEN_SHIFT)) & MRT_CHANNEL_CTRL_INTEN_MASK)\r\n\r\n#define MRT_CHANNEL_CTRL_MODE_MASK               (0x6U)\r\n#define MRT_CHANNEL_CTRL_MODE_SHIFT              (1U)\r\n/*! MODE - Selects the timer mode\r\n *  0b00..Repeat interrupt mode\r\n *  0b01..One-shot interrupt mode\r\n *  0b10..One-shot stall mode\r\n *  0b11..Reserved\r\n */\r\n#define MRT_CHANNEL_CTRL_MODE(x)                 (((uint32_t)(((uint32_t)(x)) << MRT_CHANNEL_CTRL_MODE_SHIFT)) & MRT_CHANNEL_CTRL_MODE_MASK)\r\n/*! @} */\r\n\r\n/* The count of MRT_CHANNEL_CTRL */\r\n#define MRT_CHANNEL_CTRL_COUNT                   (8U)\r\n\r\n/*! @name CHANNEL_STAT - Status */\r\n/*! @{ */\r\n\r\n#define MRT_CHANNEL_STAT_INTFLAG_MASK            (0x1U)\r\n#define MRT_CHANNEL_STAT_INTFLAG_SHIFT           (0U)\r\n/*! INTFLAG - Monitors the interrupt flag\r\n *  0b0..No pending interrupt. Writing a zero is equivalent to no operation.\r\n *  0b1..Pending interrupt.\r\n */\r\n#define MRT_CHANNEL_STAT_INTFLAG(x)              (((uint32_t)(((uint32_t)(x)) << MRT_CHANNEL_STAT_INTFLAG_SHIFT)) & MRT_CHANNEL_STAT_INTFLAG_MASK)\r\n\r\n#define MRT_CHANNEL_STAT_RUN_MASK                (0x2U)\r\n#define MRT_CHANNEL_STAT_RUN_SHIFT               (1U)\r\n/*! RUN - Indicates the state of TIMER n . RUN bit is read-only.\r\n *  0b0..Idle state. TIMER n has stopped.\r\n *  0b1..Running. TIMER n is running.\r\n */\r\n#define MRT_CHANNEL_STAT_RUN(x)                  (((uint32_t)(((uint32_t)(x)) << MRT_CHANNEL_STAT_RUN_SHIFT)) & MRT_CHANNEL_STAT_RUN_MASK)\r\n\r\n#define MRT_CHANNEL_STAT_INUSE_MASK              (0x4U)\r\n#define MRT_CHANNEL_STAT_INUSE_SHIFT             (2U)\r\n/*! INUSE - Channel-In-Use flag. Operating details depend on the operating mode bit\r\n *    (MODCFG.MULTITASK), and affects the use of the Idle Channel register (IDLE_CH).\r\n *  0b0..This timer channel is not in use.\r\n *  0b1..This timer channel is in use.\r\n */\r\n#define MRT_CHANNEL_STAT_INUSE(x)                (((uint32_t)(((uint32_t)(x)) << MRT_CHANNEL_STAT_INUSE_SHIFT)) & MRT_CHANNEL_STAT_INUSE_MASK)\r\n/*! @} */\r\n\r\n/* The count of MRT_CHANNEL_STAT */\r\n#define MRT_CHANNEL_STAT_COUNT                   (8U)\r\n\r\n/*! @name MODCFG - Module Configuration */\r\n/*! @{ */\r\n\r\n#define MRT_MODCFG_NOC_MASK                      (0xFU)\r\n#define MRT_MODCFG_NOC_SHIFT                     (0U)\r\n/*! NOC - Number Of Channels: identifies the number of channels in this MRT. (Minus 1 encoded) */\r\n#define MRT_MODCFG_NOC(x)                        (((uint32_t)(((uint32_t)(x)) << MRT_MODCFG_NOC_SHIFT)) & MRT_MODCFG_NOC_MASK)\r\n\r\n#define MRT_MODCFG_NOB_MASK                      (0x1F0U)\r\n#define MRT_MODCFG_NOB_SHIFT                     (4U)\r\n/*! NOB - Number Of Bits: identifies the number of timer bits in this MRT. (24 bits on this device) */\r\n#define MRT_MODCFG_NOB(x)                        (((uint32_t)(((uint32_t)(x)) << MRT_MODCFG_NOB_SHIFT)) & MRT_MODCFG_NOB_MASK)\r\n\r\n#define MRT_MODCFG_MULTITASK_MASK                (0x80000000U)\r\n#define MRT_MODCFG_MULTITASK_SHIFT               (31U)\r\n/*! MULTITASK - Selects the operating mode for the INUSE flags and the IDLE_CH register.\r\n *  0b0..Hardware status mode. In this mode, the INUSE(n) flags for all channels are reset.\r\n *  0b1..Multi-task mode\r\n */\r\n#define MRT_MODCFG_MULTITASK(x)                  (((uint32_t)(((uint32_t)(x)) << MRT_MODCFG_MULTITASK_SHIFT)) & MRT_MODCFG_MULTITASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name IDLE_CH - Idle Channel */\r\n/*! @{ */\r\n\r\n#define MRT_IDLE_CH_CHAN_MASK                    (0xF0U)\r\n#define MRT_IDLE_CH_CHAN_SHIFT                   (4U)\r\n/*! CHAN - Idle channel. Reading the CHAN bits, returns the lowest idle timer channel. The number is\r\n *    positioned so that it can be used as an offset from the MRT base address, to access the\r\n *    registers for the allocated channel. If all timer channels are running, then CHAN = 0xF.\r\n */\r\n#define MRT_IDLE_CH_CHAN(x)                      (((uint32_t)(((uint32_t)(x)) << MRT_IDLE_CH_CHAN_SHIFT)) & MRT_IDLE_CH_CHAN_MASK)\r\n/*! @} */\r\n\r\n/*! @name IRQ_FLAG - Global Interrupt Flag */\r\n/*! @{ */\r\n\r\n#define MRT_IRQ_FLAG_GFLAG0_MASK                 (0x1U)\r\n#define MRT_IRQ_FLAG_GFLAG0_SHIFT                (0U)\r\n/*! GFLAG0 - Monitors the interrupt flag of TIMER0.\r\n *  0b0..No pending interrupt. Writing a zero is equivalent to no operation.\r\n *  0b1..Pending interrupt. The interrupt is pending because TIMER0 has reached the end of the time interval. If\r\n *       the INTEN bit in the CONTROL0 register is also set to 1, then the interrupt for timer channel 0 and the\r\n *       global interrupt are generated. Writing a 1 to GFLAG0 bit clears the interrupt request.\r\n */\r\n#define MRT_IRQ_FLAG_GFLAG0(x)                   (((uint32_t)(((uint32_t)(x)) << MRT_IRQ_FLAG_GFLAG0_SHIFT)) & MRT_IRQ_FLAG_GFLAG0_MASK)\r\n\r\n#define MRT_IRQ_FLAG_GFLAG1_MASK                 (0x2U)\r\n#define MRT_IRQ_FLAG_GFLAG1_SHIFT                (1U)\r\n/*! GFLAG1 - Monitors the interrupt flag of TIMER1, and acts similarly to channel 0. */\r\n#define MRT_IRQ_FLAG_GFLAG1(x)                   (((uint32_t)(((uint32_t)(x)) << MRT_IRQ_FLAG_GFLAG1_SHIFT)) & MRT_IRQ_FLAG_GFLAG1_MASK)\r\n\r\n#define MRT_IRQ_FLAG_GFLAG2_MASK                 (0x4U)\r\n#define MRT_IRQ_FLAG_GFLAG2_SHIFT                (2U)\r\n/*! GFLAG2 - Monitors the interrupt flag of TIMER2, and acts similarly to channel 0. */\r\n#define MRT_IRQ_FLAG_GFLAG2(x)                   (((uint32_t)(((uint32_t)(x)) << MRT_IRQ_FLAG_GFLAG2_SHIFT)) & MRT_IRQ_FLAG_GFLAG2_MASK)\r\n\r\n#define MRT_IRQ_FLAG_GFLAG3_MASK                 (0x8U)\r\n#define MRT_IRQ_FLAG_GFLAG3_SHIFT                (3U)\r\n/*! GFLAG3 - Monitors the interrupt flag of TIMER3, and acts similarly to channel 0. */\r\n#define MRT_IRQ_FLAG_GFLAG3(x)                   (((uint32_t)(((uint32_t)(x)) << MRT_IRQ_FLAG_GFLAG3_SHIFT)) & MRT_IRQ_FLAG_GFLAG3_MASK)\r\n/*! @} */\r\n\r\n/*! @name ID_CODE - Multi-Rate Timer ID code */\r\n/*! @{ */\r\n\r\n#define MRT_ID_CODE_ID_CODE_MASK                 (0xFFFFFFFFU)\r\n#define MRT_ID_CODE_ID_CODE_SHIFT                (0U)\r\n/*! ID_CODE - Multi-Rate Timer ID code */\r\n#define MRT_ID_CODE_ID_CODE(x)                   (((uint32_t)(((uint32_t)(x)) << MRT_ID_CODE_ID_CODE_SHIFT)) & MRT_ID_CODE_ID_CODE_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group MRT_Register_Masks */\r\n\r\n\r\n/* MRT - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral MRT0 base address */\r\n  #define MRT0_BASE                                (0x5002D000u)\r\n  /** Peripheral MRT0 base address */\r\n  #define MRT0_BASE_NS                             (0x4002D000u)\r\n  /** Peripheral MRT0 base pointer */\r\n  #define MRT0                                     ((MRT_Type *)MRT0_BASE)\r\n  /** Peripheral MRT0 base pointer */\r\n  #define MRT0_NS                                  ((MRT_Type *)MRT0_BASE_NS)\r\n  /** Peripheral MRT1 base address */\r\n  #define MRT1_BASE                                (0x5003F000u)\r\n  /** Peripheral MRT1 base address */\r\n  #define MRT1_BASE_NS                             (0x4003F000u)\r\n  /** Peripheral MRT1 base pointer */\r\n  #define MRT1                                     ((MRT_Type *)MRT1_BASE)\r\n  /** Peripheral MRT1 base pointer */\r\n  #define MRT1_NS                                  ((MRT_Type *)MRT1_BASE_NS)\r\n  /** Array initializer of MRT peripheral base addresses */\r\n  #define MRT_BASE_ADDRS                           { MRT0_BASE, MRT1_BASE }\r\n  /** Array initializer of MRT peripheral base pointers */\r\n  #define MRT_BASE_PTRS                            { MRT0, MRT1 }\r\n  /** Array initializer of MRT peripheral base addresses */\r\n  #define MRT_BASE_ADDRS_NS                        { MRT0_BASE_NS, MRT1_BASE_NS }\r\n  /** Array initializer of MRT peripheral base pointers */\r\n  #define MRT_BASE_PTRS_NS                         { MRT0_NS, MRT1_NS }\r\n#else\r\n  /** Peripheral MRT0 base address */\r\n  #define MRT0_BASE                                (0x4002D000u)\r\n  /** Peripheral MRT0 base pointer */\r\n  #define MRT0                                     ((MRT_Type *)MRT0_BASE)\r\n  /** Peripheral MRT1 base address */\r\n  #define MRT1_BASE                                (0x4003F000u)\r\n  /** Peripheral MRT1 base pointer */\r\n  #define MRT1                                     ((MRT_Type *)MRT1_BASE)\r\n  /** Array initializer of MRT peripheral base addresses */\r\n  #define MRT_BASE_ADDRS                           { MRT0_BASE, MRT1_BASE }\r\n  /** Array initializer of MRT peripheral base pointers */\r\n  #define MRT_BASE_PTRS                            { MRT0, MRT1 }\r\n#endif\r\n/** Interrupt vectors for the MRT peripheral type */\r\n#define MRT_IRQS                                 { MRT_IRQn, GFMRT_IRQn }\r\n\r\n/*!\r\n * @}\r\n */ /* end of group MRT_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- OCOTP Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup OCOTP_Peripheral_Access_Layer OCOTP Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** OCOTP - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t OTP_SHADOW[420];                   /**< OTP shadow register N, array offset: 0x0, array step: 0x4 */\r\n       uint8_t RESERVED_0[368];\r\n  __IO uint32_t OTP_CTRL;                          /**< OTP Controller Control Register, offset: 0x800 */\r\n  __IO uint32_t OTP_PDN;                           /**< OTP Controller PDN Register, offset: 0x804 */\r\n  __IO uint32_t OTP_WRITE_DATA;                    /**< OTP Controller Write Data Register, offset: 0x808 */\r\n  __IO uint32_t OTP_READ_CTRL;                     /**< OTP Controller Read Ctrl Register, offset: 0x80C */\r\n  __IO uint32_t OTP_READ_DATA;                     /**< OTP Controller Read Data Register, offset: 0x810 */\r\n  __IO uint32_t OTP_CLK_DIV;                       /**< OTP Controller Clock Divider register, offset: 0x814 */\r\n  __IO uint32_t OTP_CRC_CTRL;                      /**< OTP Controller CRC Ctrl Register, offset: 0x818 */\r\n  __I  uint32_t OTP_CRC_VALUE;                     /**< OTP Controller CRC Value Register, offset: 0x81C */\r\n  __IO uint32_t OTP_STATUS;                        /**< OTP Controller Status Register, offset: 0x820 */\r\n  __I  uint32_t OTP_STARTWORD;                     /**< OTP Controller Startword Register, offset: 0x824 */\r\n  __I  uint32_t OTP_VERSION;                       /**< OTP Controller Version Register, offset: 0x828 */\r\n  __IO uint32_t OTP_NONMASK_STATUS1;               /**< OTP Controller Nonmask Status1 Register, offset: 0x82C */\r\n  __IO uint32_t OTP_MASK_CTRL1;                    /**< OTP Controller Mask Ctrl1 Register, offset: 0x830 */\r\n  __IO uint32_t OTP_MASK_STATUS1;                  /**< OTP Controller Nonmask Status1 Register, offset: 0x834 */\r\n  __IO uint32_t OTP_ECC_CTRL;                      /**< OTP Controller ECC Ctrl Register, offset: 0x838 */\r\n  __IO uint32_t OTP_ECC_DATA;                      /**< OTP Controller ECC Date Register, offset: 0x83C */\r\n  __I  uint32_t OTP_ECC_DBG1;                      /**< OTP Controller ECC DBG Register1, offset: 0x840 */\r\n  __I  uint32_t OTP_ECC_DBG2;                      /**< OTP Controller ECC DBG Register2, offset: 0x844 */\r\n  __IO uint32_t OTP_ECC_DBG3;                      /**< OTP Controller ECC DBG Register3, offset: 0x848 */\r\n  __IO uint32_t OTP_PRNG_RAND_SEED;                /**< OTP Controller PRNG Random Seed Register, offset: 0x84C */\r\n  __I  uint32_t OTP_SRAM_ENTROPY_DATA;             /**< OTP Controller SRAM Entropy Data Register, offset: 0x850 */\r\n  __I  uint32_t OTP_PRNG_OUTPUT_DATA;              /**< OTP Controller PRNG Output Data Register, offset: 0x854 */\r\n       uint8_t RESERVED_1[4];\r\n  __IO uint32_t OTP_CRC_LUT[8];                    /**< OTP Controller CRC LUT Register0..OTP Controller CRC LUT Register7, array offset: 0x85C, array step: 0x4 */\r\n  __IO uint32_t OTP_LOCK_STICKY_0;                 /**< OTP Controller Lock Sticky Register0, offset: 0x87C */\r\n  __IO uint32_t OTP_LOCK_STICKY_1;                 /**< OTP Controller Lock Sticky Register1, offset: 0x880 */\r\n  __IO uint32_t OTP_LOCK_STICKY_2;                 /**< OTP Controller Lock Sticky Register2, offset: 0x884 */\r\n  __IO uint32_t OTP_LOCK_STICKY_3;                 /**< OTP Controller Lock Sticky Register3, offset: 0x888 */\r\n  __IO uint32_t OTP_LOCK_STICKY_4;                 /**< OTP Controller Lock Sticky Register4, offset: 0x88C */\r\n  __IO uint32_t OTP_LOCK_STICKY_5;                 /**< OTP Controller Lock Sticky Register5, offset: 0x890 */\r\n  __IO uint32_t OTP_LOCK_STICKY_6;                 /**< OTP Controller Lock Sticky Register6, offset: 0x894 */\r\n  __IO uint32_t OTP_LOCK_STICKY_7;                 /**< OTP Controller Lock Sticky Register7, offset: 0x898 */\r\n  __IO uint32_t OTP_LOCK_STICKY_8;                 /**< OTP Controller Lock Sticky Register8, offset: 0x89C */\r\n  __IO uint32_t OTP_LOCK_STICKY_9;                 /**< OTP Controller Lock Sticky Register9, offset: 0x8A0 */\r\n  __IO uint32_t OTP_LOCK_STICKY_10;                /**< OTP Controller Lock Sticky Register10, offset: 0x8A4 */\r\n  __IO uint32_t OTP_LOCK_STICKY_11;                /**< OTP Controller Lock Sticky Register11, offset: 0x8A8 */\r\n} OCOTP_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- OCOTP Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup OCOTP_Register_Masks OCOTP Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name OTP_SHADOW - OTP shadow register N */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_SHADOW_SHADOW_MASK             (0xFFFFFFFFU)\r\n#define OCOTP_OTP_SHADOW_SHADOW_SHIFT            (0U)\r\n/*! SHADOW - OTP shadow register */\r\n#define OCOTP_OTP_SHADOW_SHADOW(x)               (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_SHADOW_SHADOW_SHIFT)) & OCOTP_OTP_SHADOW_SHADOW_MASK)\r\n/*! @} */\r\n\r\n/* The count of OCOTP_OTP_SHADOW */\r\n#define OCOTP_OTP_SHADOW_COUNT                   (420U)\r\n\r\n/*! @name OTP_CTRL - OTP Controller Control Register */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_CTRL_ADDR_MASK                 (0x1FFU)\r\n#define OCOTP_OTP_CTRL_ADDR_SHIFT                (0U)\r\n#define OCOTP_OTP_CTRL_ADDR(x)                   (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CTRL_ADDR_SHIFT)) & OCOTP_OTP_CTRL_ADDR_MASK)\r\n\r\n#define OCOTP_OTP_CTRL_PRNG_OUTPUT_DATA_EN_MASK  (0x200U)\r\n#define OCOTP_OTP_CTRL_PRNG_OUTPUT_DATA_EN_SHIFT (9U)\r\n#define OCOTP_OTP_CTRL_PRNG_OUTPUT_DATA_EN(x)    (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CTRL_PRNG_OUTPUT_DATA_EN_SHIFT)) & OCOTP_OTP_CTRL_PRNG_OUTPUT_DATA_EN_MASK)\r\n\r\n#define OCOTP_OTP_CTRL_SRAM_ENTROPY_DATA_EN_MASK (0x400U)\r\n#define OCOTP_OTP_CTRL_SRAM_ENTROPY_DATA_EN_SHIFT (10U)\r\n#define OCOTP_OTP_CTRL_SRAM_ENTROPY_DATA_EN(x)   (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CTRL_SRAM_ENTROPY_DATA_EN_SHIFT)) & OCOTP_OTP_CTRL_SRAM_ENTROPY_DATA_EN_MASK)\r\n\r\n#define OCOTP_OTP_CTRL_RELOAD_SHADOWS_MASK       (0x800U)\r\n#define OCOTP_OTP_CTRL_RELOAD_SHADOWS_SHIFT      (11U)\r\n#define OCOTP_OTP_CTRL_RELOAD_SHADOWS(x)         (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CTRL_RELOAD_SHADOWS_SHIFT)) & OCOTP_OTP_CTRL_RELOAD_SHADOWS_MASK)\r\n\r\n#define OCOTP_OTP_CTRL_RED_MUX_SEL_MASK          (0x3000U)\r\n#define OCOTP_OTP_CTRL_RED_MUX_SEL_SHIFT         (12U)\r\n#define OCOTP_OTP_CTRL_RED_MUX_SEL(x)            (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CTRL_RED_MUX_SEL_SHIFT)) & OCOTP_OTP_CTRL_RED_MUX_SEL_MASK)\r\n\r\n#define OCOTP_OTP_CTRL_SUPPADD_MASK              (0x4000U)\r\n#define OCOTP_OTP_CTRL_SUPPADD_SHIFT             (14U)\r\n#define OCOTP_OTP_CTRL_SUPPADD(x)                (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CTRL_SUPPADD_SHIFT)) & OCOTP_OTP_CTRL_SUPPADD_MASK)\r\n\r\n#define OCOTP_OTP_CTRL_WR_UNLOCK_MASK            (0xFFFF0000U)\r\n#define OCOTP_OTP_CTRL_WR_UNLOCK_SHIFT           (16U)\r\n#define OCOTP_OTP_CTRL_WR_UNLOCK(x)              (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CTRL_WR_UNLOCK_SHIFT)) & OCOTP_OTP_CTRL_WR_UNLOCK_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_PDN - OTP Controller PDN Register */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_PDN_PDN_MASK                   (0x1U)\r\n#define OCOTP_OTP_PDN_PDN_SHIFT                  (0U)\r\n#define OCOTP_OTP_PDN_PDN(x)                     (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_PDN_PDN_SHIFT)) & OCOTP_OTP_PDN_PDN_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_WRITE_DATA - OTP Controller Write Data Register */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_WRITE_DATA_WRITE_DATA_MASK     (0xFFFFFFFFU)\r\n#define OCOTP_OTP_WRITE_DATA_WRITE_DATA_SHIFT    (0U)\r\n#define OCOTP_OTP_WRITE_DATA_WRITE_DATA(x)       (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_WRITE_DATA_WRITE_DATA_SHIFT)) & OCOTP_OTP_WRITE_DATA_WRITE_DATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_READ_CTRL - OTP Controller Read Ctrl Register */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_READ_CTRL_READ_MASK            (0x1U)\r\n#define OCOTP_OTP_READ_CTRL_READ_SHIFT           (0U)\r\n#define OCOTP_OTP_READ_CTRL_READ(x)              (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_READ_CTRL_READ_SHIFT)) & OCOTP_OTP_READ_CTRL_READ_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_READ_DATA - OTP Controller Read Data Register */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_READ_DATA_READ_DATA_MASK       (0xFFFFFFFFU)\r\n#define OCOTP_OTP_READ_DATA_READ_DATA_SHIFT      (0U)\r\n#define OCOTP_OTP_READ_DATA_READ_DATA(x)         (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_READ_DATA_READ_DATA_SHIFT)) & OCOTP_OTP_READ_DATA_READ_DATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_CLK_DIV - OTP Controller Clock Divider register */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_CLK_DIV_DIV_MASK               (0xFU)\r\n#define OCOTP_OTP_CLK_DIV_DIV_SHIFT              (0U)\r\n#define OCOTP_OTP_CLK_DIV_DIV(x)                 (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CLK_DIV_DIV_SHIFT)) & OCOTP_OTP_CLK_DIV_DIV_MASK)\r\n\r\n#define OCOTP_OTP_CLK_DIV_RESET_MASK             (0x20000000U)\r\n#define OCOTP_OTP_CLK_DIV_RESET_SHIFT            (29U)\r\n#define OCOTP_OTP_CLK_DIV_RESET(x)               (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CLK_DIV_RESET_SHIFT)) & OCOTP_OTP_CLK_DIV_RESET_MASK)\r\n\r\n#define OCOTP_OTP_CLK_DIV_HALT_MASK              (0x40000000U)\r\n#define OCOTP_OTP_CLK_DIV_HALT_SHIFT             (30U)\r\n#define OCOTP_OTP_CLK_DIV_HALT(x)                (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CLK_DIV_HALT_SHIFT)) & OCOTP_OTP_CLK_DIV_HALT_MASK)\r\n\r\n#define OCOTP_OTP_CLK_DIV_REQFLAG_MASK           (0x80000000U)\r\n#define OCOTP_OTP_CLK_DIV_REQFLAG_SHIFT          (31U)\r\n#define OCOTP_OTP_CLK_DIV_REQFLAG(x)             (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CLK_DIV_REQFLAG_SHIFT)) & OCOTP_OTP_CLK_DIV_REQFLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_CRC_CTRL - OTP Controller CRC Ctrl Register */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_CRC_CTRL_CRC_RUN_MASK          (0x1U)\r\n#define OCOTP_OTP_CRC_CTRL_CRC_RUN_SHIFT         (0U)\r\n#define OCOTP_OTP_CRC_CTRL_CRC_RUN(x)            (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CRC_CTRL_CRC_RUN_SHIFT)) & OCOTP_OTP_CRC_CTRL_CRC_RUN_MASK)\r\n\r\n#define OCOTP_OTP_CRC_CTRL_CRC_DONE_MASK         (0x2U)\r\n#define OCOTP_OTP_CRC_CTRL_CRC_DONE_SHIFT        (1U)\r\n#define OCOTP_OTP_CRC_CTRL_CRC_DONE(x)           (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CRC_CTRL_CRC_DONE_SHIFT)) & OCOTP_OTP_CRC_CTRL_CRC_DONE_MASK)\r\n\r\n#define OCOTP_OTP_CRC_CTRL_CRC_STATUS_MASK       (0x4U)\r\n#define OCOTP_OTP_CRC_CTRL_CRC_STATUS_SHIFT      (2U)\r\n#define OCOTP_OTP_CRC_CTRL_CRC_STATUS(x)         (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CRC_CTRL_CRC_STATUS_SHIFT)) & OCOTP_OTP_CRC_CTRL_CRC_STATUS_MASK)\r\n\r\n#define OCOTP_OTP_CRC_CTRL_CRC_RUN_LOCK_MASK     (0x8U)\r\n#define OCOTP_OTP_CRC_CTRL_CRC_RUN_LOCK_SHIFT    (3U)\r\n#define OCOTP_OTP_CRC_CTRL_CRC_RUN_LOCK(x)       (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CRC_CTRL_CRC_RUN_LOCK_SHIFT)) & OCOTP_OTP_CRC_CTRL_CRC_RUN_LOCK_MASK)\r\n\r\n#define OCOTP_OTP_CRC_CTRL_CRC_LUT_SEL_MASK      (0xF0000U)\r\n#define OCOTP_OTP_CRC_CTRL_CRC_LUT_SEL_SHIFT     (16U)\r\n#define OCOTP_OTP_CRC_CTRL_CRC_LUT_SEL(x)        (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CRC_CTRL_CRC_LUT_SEL_SHIFT)) & OCOTP_OTP_CRC_CTRL_CRC_LUT_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_CRC_VALUE - OTP Controller CRC Value Register */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_CRC_VALUE_CRC_VALUE_MASK       (0xFFFFFFFFU)\r\n#define OCOTP_OTP_CRC_VALUE_CRC_VALUE_SHIFT      (0U)\r\n#define OCOTP_OTP_CRC_VALUE_CRC_VALUE(x)         (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CRC_VALUE_CRC_VALUE_SHIFT)) & OCOTP_OTP_CRC_VALUE_CRC_VALUE_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_STATUS - OTP Controller Status Register */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_STATUS_LOAD_COUNTER_MASK       (0x1FFU)\r\n#define OCOTP_OTP_STATUS_LOAD_COUNTER_SHIFT      (0U)\r\n#define OCOTP_OTP_STATUS_LOAD_COUNTER(x)         (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_STATUS_LOAD_COUNTER_SHIFT)) & OCOTP_OTP_STATUS_LOAD_COUNTER_MASK)\r\n\r\n#define OCOTP_OTP_STATUS_LC_NOT_BLANK_STICKY_MASK (0x200U)\r\n#define OCOTP_OTP_STATUS_LC_NOT_BLANK_STICKY_SHIFT (9U)\r\n#define OCOTP_OTP_STATUS_LC_NOT_BLANK_STICKY(x)  (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_STATUS_LC_NOT_BLANK_STICKY_SHIFT)) & OCOTP_OTP_STATUS_LC_NOT_BLANK_STICKY_MASK)\r\n\r\n#define OCOTP_OTP_STATUS_LOCKED_MASK             (0x800U)\r\n#define OCOTP_OTP_STATUS_LOCKED_SHIFT            (11U)\r\n#define OCOTP_OTP_STATUS_LOCKED(x)               (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_STATUS_LOCKED_SHIFT)) & OCOTP_OTP_STATUS_LOCKED_MASK)\r\n\r\n#define OCOTP_OTP_STATUS_PROGFAIL_MASK           (0x1000U)\r\n#define OCOTP_OTP_STATUS_PROGFAIL_SHIFT          (12U)\r\n#define OCOTP_OTP_STATUS_PROGFAIL(x)             (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_STATUS_PROGFAIL_SHIFT)) & OCOTP_OTP_STATUS_PROGFAIL_MASK)\r\n\r\n#define OCOTP_OTP_STATUS_ACK_MASK                (0x2000U)\r\n#define OCOTP_OTP_STATUS_ACK_SHIFT               (13U)\r\n#define OCOTP_OTP_STATUS_ACK(x)                  (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_STATUS_ACK_SHIFT)) & OCOTP_OTP_STATUS_ACK_MASK)\r\n\r\n#define OCOTP_OTP_STATUS_PWOK_MASK               (0x4000U)\r\n#define OCOTP_OTP_STATUS_PWOK_SHIFT              (14U)\r\n#define OCOTP_OTP_STATUS_PWOK(x)                 (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_STATUS_PWOK_SHIFT)) & OCOTP_OTP_STATUS_PWOK_MASK)\r\n\r\n#define OCOTP_OTP_STATUS_FLAGSTATE_MASK          (0xF0000U)\r\n#define OCOTP_OTP_STATUS_FLAGSTATE_SHIFT         (16U)\r\n#define OCOTP_OTP_STATUS_FLAGSTATE(x)            (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_STATUS_FLAGSTATE_SHIFT)) & OCOTP_OTP_STATUS_FLAGSTATE_MASK)\r\n\r\n#define OCOTP_OTP_STATUS_BUSY_MASK               (0x400000U)\r\n#define OCOTP_OTP_STATUS_BUSY_SHIFT              (22U)\r\n#define OCOTP_OTP_STATUS_BUSY(x)                 (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_STATUS_BUSY_SHIFT)) & OCOTP_OTP_STATUS_BUSY_MASK)\r\n\r\n#define OCOTP_OTP_STATUS_FUSE_LATCHED_MASK       (0x2000000U)\r\n#define OCOTP_OTP_STATUS_FUSE_LATCHED_SHIFT      (25U)\r\n#define OCOTP_OTP_STATUS_FUSE_LATCHED(x)         (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_STATUS_FUSE_LATCHED_SHIFT)) & OCOTP_OTP_STATUS_FUSE_LATCHED_MASK)\r\n\r\n#define OCOTP_OTP_STATUS_CALIBRATED_MASK         (0x4000000U)\r\n#define OCOTP_OTP_STATUS_CALIBRATED_SHIFT        (26U)\r\n#define OCOTP_OTP_STATUS_CALIBRATED(x)           (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_STATUS_CALIBRATED_SHIFT)) & OCOTP_OTP_STATUS_CALIBRATED_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_STARTWORD - OTP Controller Startword Register */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_STARTWORD_STARTWORD_MASK       (0xFFFFU)\r\n#define OCOTP_OTP_STARTWORD_STARTWORD_SHIFT      (0U)\r\n#define OCOTP_OTP_STARTWORD_STARTWORD(x)         (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_STARTWORD_STARTWORD_SHIFT)) & OCOTP_OTP_STARTWORD_STARTWORD_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_VERSION - OTP Controller Version Register */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_VERSION_STEP_VER_MASK          (0xFFFFU)\r\n#define OCOTP_OTP_VERSION_STEP_VER_SHIFT         (0U)\r\n#define OCOTP_OTP_VERSION_STEP_VER(x)            (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_VERSION_STEP_VER_SHIFT)) & OCOTP_OTP_VERSION_STEP_VER_MASK)\r\n\r\n#define OCOTP_OTP_VERSION_MINOR_VER_MASK         (0xFF0000U)\r\n#define OCOTP_OTP_VERSION_MINOR_VER_SHIFT        (16U)\r\n#define OCOTP_OTP_VERSION_MINOR_VER(x)           (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_VERSION_MINOR_VER_SHIFT)) & OCOTP_OTP_VERSION_MINOR_VER_MASK)\r\n\r\n#define OCOTP_OTP_VERSION_MAJOR_VER_MASK         (0xFF000000U)\r\n#define OCOTP_OTP_VERSION_MAJOR_VER_SHIFT        (24U)\r\n#define OCOTP_OTP_VERSION_MAJOR_VER(x)           (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_VERSION_MAJOR_VER_SHIFT)) & OCOTP_OTP_VERSION_MAJOR_VER_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_NONMASK_STATUS1 - OTP Controller Nonmask Status1 Register */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_PBRICK_ERR_MASK (0x20U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_PBRICK_ERR_SHIFT (5U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_PBRICK_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_PBRICK_ERR_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_PBRICK_ERR_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_OTP_STATE_ERR_MASK (0x40U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_OTP_STATE_ERR_SHIFT (6U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_OTP_STATE_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_OTP_STATE_ERR_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_OTP_STATE_ERR_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_DED_RELOAD_MASK (0x80U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_DED_RELOAD_SHIFT (7U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_DED_RELOAD(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_DED_RELOAD_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_DED_RELOAD_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_DED_MASK (0x100U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_DED_SHIFT (8U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_DED(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_DED_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_DED_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SEC_RELOAD_MASK (0x200U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SEC_RELOAD_SHIFT (9U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SEC_RELOAD(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_SEC_RELOAD_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_SEC_RELOAD_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SEC_MASK (0x400U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SEC_SHIFT (10U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SEC(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_SEC_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_SEC_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_DONE_MASK (0x800U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_DONE_SHIFT (11U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_DONE(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_DONE_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_DONE_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_LUT_SEL_ERR_MASK (0x1000U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_LUT_SEL_ERR_SHIFT (12U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_LUT_SEL_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_LUT_SEL_ERR_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_LUT_SEL_ERR_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_ADDRESS_RANGE_ERR_MASK (0x2000U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_ADDRESS_RANGE_ERR_SHIFT (13U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_ADDRESS_RANGE_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_ADDRESS_RANGE_ERR_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_ADDRESS_RANGE_ERR_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_WRITE_PROTECT_ERR_MASK (0x4000U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_WRITE_PROTECT_ERR_SHIFT (14U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_WRITE_PROTECT_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_WRITE_PROTECT_ERR_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_WRITE_PROTECT_ERR_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_SECURTY_PROTECT_ERR_MASK (0x8000U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_SECURTY_PROTECT_ERR_SHIFT (15U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_SECURTY_PROTECT_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_SECURTY_PROTECT_ERR_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_SECURTY_PROTECT_ERR_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_WRITE_ERR_MASK (0x10000U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_WRITE_ERR_SHIFT (16U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_WRITE_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_WRITE_ERR_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_WRITE_ERR_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_LOAD_ERR_MASK (0x20000U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_LOAD_ERR_SHIFT (17U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_LOAD_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_LOAD_ERR_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_LOAD_ERR_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_COUNTER_ERR_MASK (0x40000U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_COUNTER_ERR_SHIFT (18U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_COUNTER_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_COUNTER_ERR_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_COUNTER_ERR_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_BITPROTECT_ERR_MASK (0x80000U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_BITPROTECT_ERR_SHIFT (19U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_BITPROTECT_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_BITPROTECT_ERR_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_BITPROTECT_ERR_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_PRNG_O_FAULT_MASK (0x100000U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_PRNG_O_FAULT_SHIFT (20U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_PRNG_O_FAULT(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_PRNG_O_FAULT_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_PRNG_O_FAULT_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_ECC_ZEROIZED_ERR_MASK (0x200000U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_ECC_ZEROIZED_ERR_SHIFT (21U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_ECC_ZEROIZED_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_ECC_ZEROIZED_ERR_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_ECC_ZEROIZED_ERR_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_FUSE_ACCESS_ERR_MASK (0x400000U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_FUSE_ACCESS_ERR_SHIFT (22U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_FUSE_ACCESS_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_FUSE_ACCESS_ERR_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_FUSE_ACCESS_ERR_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_RELOAD_REQ_ERR_MASK (0x800000U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_RELOAD_REQ_ERR_SHIFT (23U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_RELOAD_REQ_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_RELOAD_REQ_ERR_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_RELOAD_REQ_ERR_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_WRITE_DURING_RELOAD_ERR_MASK (0x1000000U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_WRITE_DURING_RELOAD_ERR_SHIFT (24U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_WRITE_DURING_RELOAD_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_WRITE_DURING_RELOAD_ERR_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_WRITE_DURING_RELOAD_ERR_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_HVF_READ_ERR_MASK (0x2000000U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_HVF_READ_ERR_SHIFT (25U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_HVF_READ_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_HVF_READ_ERR_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_HVF_READ_ERR_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_HVF_WRITE_ERR_MASK (0x4000000U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_HVF_WRITE_ERR_SHIFT (26U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_HVF_WRITE_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_HVF_WRITE_ERR_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_HVF_WRITE_ERR_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_SRAM_READ_ERR_MASK (0x8000000U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_SRAM_READ_ERR_SHIFT (27U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_SRAM_READ_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_SRAM_READ_ERR_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_SRAM_READ_ERR_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_SRAM_WRITE_ERR_MASK (0x10000000U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_SRAM_WRITE_ERR_SHIFT (28U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_SRAM_WRITE_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_SRAM_WRITE_ERR_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_SRAM_WRITE_ERR_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_FUSE_READ_ERR_MASK (0x20000000U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_FUSE_READ_ERR_SHIFT (29U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_FUSE_READ_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_FUSE_READ_ERR_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_FUSE_READ_ERR_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_FUSE_PROG_ERR_MASK (0x40000000U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_FUSE_PROG_ERR_SHIFT (30U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_FUSE_PROG_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_FUSE_PROG_ERR_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_FUSE_PROG_ERR_MASK)\r\n\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_NO_ACCESS_MASK (0x80000000U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_NO_ACCESS_SHIFT (31U)\r\n#define OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_NO_ACCESS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_NO_ACCESS_SHIFT)) & OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_NO_ACCESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_MASK_CTRL1 - OTP Controller Mask Ctrl1 Register */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_TIMEOUT_COUNTER_MASK (0x7U)\r\n#define OCOTP_OTP_MASK_CTRL1_TIMEOUT_COUNTER_SHIFT (0U)\r\n#define OCOTP_OTP_MASK_CTRL1_TIMEOUT_COUNTER(x)  (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_TIMEOUT_COUNTER_SHIFT)) & OCOTP_OTP_MASK_CTRL1_TIMEOUT_COUNTER_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_TMEOUT_COUNTER_EN_MASK (0x8U)\r\n#define OCOTP_OTP_MASK_CTRL1_TMEOUT_COUNTER_EN_SHIFT (3U)\r\n#define OCOTP_OTP_MASK_CTRL1_TMEOUT_COUNTER_EN(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_TMEOUT_COUNTER_EN_SHIFT)) & OCOTP_OTP_MASK_CTRL1_TMEOUT_COUNTER_EN_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_PBRICK_ERR_MASK (0x20U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_PBRICK_ERR_SHIFT (5U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_PBRICK_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_PBRICK_ERR_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_PBRICK_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_OTP_STATE_ERR_MASK (0x40U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_OTP_STATE_ERR_SHIFT (6U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_OTP_STATE_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_OTP_STATE_ERR_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_OTP_STATE_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_DED_RELOAD_MASK (0x80U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_DED_RELOAD_SHIFT (7U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_DED_RELOAD(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_DED_RELOAD_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_DED_RELOAD_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_DED_MASK  (0x100U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_DED_SHIFT (8U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_DED(x)    (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_DED_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_DED_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SEC_RELOAD_MASK (0x200U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SEC_RELOAD_SHIFT (9U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SEC_RELOAD(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SEC_RELOAD_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SEC_RELOAD_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SEC_MASK  (0x400U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SEC_SHIFT (10U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SEC(x)    (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SEC_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SEC_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_DONE_MASK (0x800U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_DONE_SHIFT (11U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_DONE(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_DONE_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_DONE_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_LUT_SEL_ERR_MASK (0x1000U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_LUT_SEL_ERR_SHIFT (12U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_LUT_SEL_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_LUT_SEL_ERR_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_LUT_SEL_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_ADDRESS_RANGE_ERR_MASK (0x2000U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_ADDRESS_RANGE_ERR_SHIFT (13U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_ADDRESS_RANGE_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_ADDRESS_RANGE_ERR_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_ADDRESS_RANGE_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_WRITE_PROTECT_ERR_MASK (0x4000U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_WRITE_PROTECT_ERR_SHIFT (14U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_WRITE_PROTECT_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_WRITE_PROTECT_ERR_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_WRITE_PROTECT_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_SECURTY_PROTECT_ERR_MASK (0x8000U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_SECURTY_PROTECT_ERR_SHIFT (15U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_SECURTY_PROTECT_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_SECURTY_PROTECT_ERR_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_CRC_SECURTY_PROTECT_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_WRITE_ERR_MASK (0x10000U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_WRITE_ERR_SHIFT (16U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_WRITE_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_WRITE_ERR_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_WRITE_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_LOAD_ERR_MASK (0x20000U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_LOAD_ERR_SHIFT (17U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_LOAD_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_LOAD_ERR_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_LOAD_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_COUNTER_ERR_MASK (0x40000U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_COUNTER_ERR_SHIFT (18U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_COUNTER_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_COUNTER_ERR_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_COUNTER_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_BITPROTECT_ERR_MASK (0x80000U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_BITPROTECT_ERR_SHIFT (19U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_BITPROTECT_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_BITPROTECT_ERR_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_BITPROTECT_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_PRNG_O_FAULT_MASK (0x100000U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_PRNG_O_FAULT_SHIFT (20U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_PRNG_O_FAULT(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_PRNG_O_FAULT_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_PRNG_O_FAULT_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_ECC_ZEROIZED_ERR_MASK (0x200000U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_ECC_ZEROIZED_ERR_SHIFT (21U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_ECC_ZEROIZED_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_ECC_ZEROIZED_ERR_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_ECC_ZEROIZED_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_FUSE_ACCESS_ERR_MASK (0x400000U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_FUSE_ACCESS_ERR_SHIFT (22U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_FUSE_ACCESS_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_FUSE_ACCESS_ERR_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_FUSE_ACCESS_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_RELOAD_REQ_ERR_MASK (0x800000U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_RELOAD_REQ_ERR_SHIFT (23U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_RELOAD_REQ_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_RELOAD_REQ_ERR_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_RELOAD_REQ_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_WRITE_DURING_RELOAD_ERR_MASK (0x1000000U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_WRITE_DURING_RELOAD_ERR_SHIFT (24U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_WRITE_DURING_RELOAD_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_WRITE_DURING_RELOAD_ERR_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_WRITE_DURING_RELOAD_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_HVF_READ_ERR_MASK (0x2000000U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_HVF_READ_ERR_SHIFT (25U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_HVF_READ_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_HVF_READ_ERR_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_HVF_READ_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_HVF_WRITE_ERR_MASK (0x4000000U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_HVF_WRITE_ERR_SHIFT (26U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_HVF_WRITE_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_HVF_WRITE_ERR_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_HVF_WRITE_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_SRAM_READ_ERR_MASK (0x8000000U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_SRAM_READ_ERR_SHIFT (27U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_SRAM_READ_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_SRAM_READ_ERR_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_SRAM_READ_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_SRAM_WRITE_ERR_MASK (0x10000000U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_SRAM_WRITE_ERR_SHIFT (28U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_SRAM_WRITE_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_SRAM_WRITE_ERR_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_SRAM_WRITE_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_FUSE_READ_ERR_MASK (0x20000000U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_FUSE_READ_ERR_SHIFT (29U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_FUSE_READ_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_FUSE_READ_ERR_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_FUSE_READ_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_FUSE_PROG_ERR_MASK (0x40000000U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_FUSE_PROG_ERR_SHIFT (30U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_FUSE_PROG_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_FUSE_PROG_ERR_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_FUSE_PROG_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_NO_ACCESS_MASK (0x80000000U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_NO_ACCESS_SHIFT (31U)\r\n#define OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_NO_ACCESS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_NO_ACCESS_SHIFT)) & OCOTP_OTP_MASK_CTRL1_CTRL_MASK_SHADOW_NO_ACCESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_MASK_STATUS1 - OTP Controller Nonmask Status1 Register */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_PBRICK_ERR_MASK (0x20U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_PBRICK_ERR_SHIFT (5U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_PBRICK_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_PBRICK_ERR_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_PBRICK_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_OTP_STATE_ERR_MASK (0x40U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_OTP_STATE_ERR_SHIFT (6U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_OTP_STATE_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_OTP_STATE_ERR_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_OTP_STATE_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_DED_RELOAD_MASK   (0x80U)\r\n#define OCOTP_OTP_MASK_STATUS1_DED_RELOAD_SHIFT  (7U)\r\n#define OCOTP_OTP_MASK_STATUS1_DED_RELOAD(x)     (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_DED_RELOAD_SHIFT)) & OCOTP_OTP_MASK_STATUS1_DED_RELOAD_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_DED_MASK     (0x100U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_DED_SHIFT    (8U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_DED(x)       (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_DED_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_DED_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_SEC_RELOAD_MASK   (0x200U)\r\n#define OCOTP_OTP_MASK_STATUS1_SEC_RELOAD_SHIFT  (9U)\r\n#define OCOTP_OTP_MASK_STATUS1_SEC_RELOAD(x)     (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_SEC_RELOAD_SHIFT)) & OCOTP_OTP_MASK_STATUS1_SEC_RELOAD_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_SEC_MASK     (0x400U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_SEC_SHIFT    (10U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_SEC(x)       (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_SEC_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_SEC_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_CRC_DONE_MASK (0x800U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_CRC_DONE_SHIFT (11U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_CRC_DONE(x)  (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_CRC_DONE_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_CRC_DONE_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_CRC_LUT_SEL_ERR_MASK (0x1000U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_CRC_LUT_SEL_ERR_SHIFT (12U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_CRC_LUT_SEL_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_CRC_LUT_SEL_ERR_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_CRC_LUT_SEL_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_CRC_ADDRESS_RANGE_ERR_MASK (0x2000U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_CRC_ADDRESS_RANGE_ERR_SHIFT (13U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_CRC_ADDRESS_RANGE_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_CRC_ADDRESS_RANGE_ERR_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_CRC_ADDRESS_RANGE_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_CRC_WRITE_PROTECT_ERR_MASK (0x4000U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_CRC_WRITE_PROTECT_ERR_SHIFT (14U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_CRC_WRITE_PROTECT_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_CRC_WRITE_PROTECT_ERR_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_CRC_WRITE_PROTECT_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_CRC_SECURTY_PROTECT_ERR_MASK (0x8000U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_CRC_SECURTY_PROTECT_ERR_SHIFT (15U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_CRC_SECURTY_PROTECT_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_CRC_SECURTY_PROTECT_ERR_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_CRC_SECURTY_PROTECT_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_WRITE_ERR_MASK (0x10000U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_WRITE_ERR_SHIFT (16U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_WRITE_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_WRITE_ERR_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_WRITE_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_LOAD_ERR_MASK (0x20000U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_LOAD_ERR_SHIFT (17U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_LOAD_ERR(x)  (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_LOAD_ERR_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_LOAD_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_COUNTER_ERR_MASK (0x40000U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_COUNTER_ERR_SHIFT (18U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_COUNTER_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_COUNTER_ERR_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_COUNTER_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_BITPROTECT_ERR_MASK (0x80000U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_BITPROTECT_ERR_SHIFT (19U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_BITPROTECT_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_BITPROTECT_ERR_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_BITPROTECT_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_PRNG_O_FAULT_MASK (0x100000U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_PRNG_O_FAULT_SHIFT (20U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_PRNG_O_FAULT(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_PRNG_O_FAULT_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_PRNG_O_FAULT_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_ECC_ZEROIZED_ERR_MASK (0x200000U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_ECC_ZEROIZED_ERR_SHIFT (21U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_ECC_ZEROIZED_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_ECC_ZEROIZED_ERR_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_ECC_ZEROIZED_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_FUSE_ACCESS_ERR_MASK (0x400000U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_FUSE_ACCESS_ERR_SHIFT (22U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_FUSE_ACCESS_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_FUSE_ACCESS_ERR_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_FUSE_ACCESS_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_RELOAD_REQ_ERR_MASK (0x800000U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_RELOAD_REQ_ERR_SHIFT (23U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_RELOAD_REQ_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_RELOAD_REQ_ERR_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_RELOAD_REQ_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_WRITE_DURING_RELOAD_ERR_MASK (0x1000000U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_WRITE_DURING_RELOAD_ERR_SHIFT (24U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_WRITE_DURING_RELOAD_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_WRITE_DURING_RELOAD_ERR_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_WRITE_DURING_RELOAD_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_HVF_READ_ERR_MASK (0x2000000U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_HVF_READ_ERR_SHIFT (25U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_HVF_READ_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_HVF_READ_ERR_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_HVF_READ_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_HVF_WRITE_ERR_MASK (0x4000000U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_HVF_WRITE_ERR_SHIFT (26U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_HVF_WRITE_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_HVF_WRITE_ERR_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_HVF_WRITE_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_SRAM_READ_ERR_MASK (0x8000000U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_SRAM_READ_ERR_SHIFT (27U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_SRAM_READ_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_SRAM_READ_ERR_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_SRAM_READ_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_SRAM_WRITE_ERR_MASK (0x10000000U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_SRAM_WRITE_ERR_SHIFT (28U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_SRAM_WRITE_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_SRAM_WRITE_ERR_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_SRAM_WRITE_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_FUSE_READ_ERR_MASK (0x20000000U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_FUSE_READ_ERR_SHIFT (29U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_FUSE_READ_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_FUSE_READ_ERR_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_FUSE_READ_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_FUSE_PROG_ERR_MASK (0x40000000U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_FUSE_PROG_ERR_SHIFT (30U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_FUSE_PROG_ERR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_FUSE_PROG_ERR_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_FUSE_PROG_ERR_MASK)\r\n\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_NO_ACCESS_MASK (0x80000000U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_NO_ACCESS_SHIFT (31U)\r\n#define OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_NO_ACCESS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_NO_ACCESS_SHIFT)) & OCOTP_OTP_MASK_STATUS1_MASK_SHADOW_NO_ACCESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_ECC_CTRL - OTP Controller ECC Ctrl Register */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_ADDR_MASK (0x1FFU)\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_ADDR_SHIFT (0U)\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_ADDR(x)  (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_ADDR_SHIFT)) & OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_ADDR_MASK)\r\n\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_DATA_MASK (0x7F0000U)\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_DATA_SHIFT (16U)\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_DATA(x)  (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_DATA_SHIFT)) & OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_DATA_MASK)\r\n\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_RD_DATA_SEL_MASK (0x2000000U)\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_RD_DATA_SEL_SHIFT (25U)\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_RD_DATA_SEL(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_RD_DATA_SEL_SHIFT)) & OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_RD_DATA_SEL_MASK)\r\n\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_SEC_DISABLE_MASK (0x4000000U)\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_SEC_DISABLE_SHIFT (26U)\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_SEC_DISABLE(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_ECC_CTRL_CTRL_ECC_SEC_DISABLE_SHIFT)) & OCOTP_OTP_ECC_CTRL_CTRL_ECC_SEC_DISABLE_MASK)\r\n\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_EN_MASK  (0x8000000U)\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_EN_SHIFT (27U)\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_EN(x)    (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_EN_SHIFT)) & OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_EN_MASK)\r\n\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_DATA_SEL_MASK (0x10000000U)\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_DATA_SEL_SHIFT (28U)\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_DATA_SEL(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_DATA_SEL_SHIFT)) & OCOTP_OTP_ECC_CTRL_CTRL_ECC_GEN_DATA_SEL_MASK)\r\n\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_BLOCK_DISABLE_MASK (0x20000000U)\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_BLOCK_DISABLE_SHIFT (29U)\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_BLOCK_DISABLE(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_ECC_CTRL_CTRL_ECC_BLOCK_DISABLE_SHIFT)) & OCOTP_OTP_ECC_CTRL_CTRL_ECC_BLOCK_DISABLE_MASK)\r\n\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_BLOCK_MASK   (0x40000000U)\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_BLOCK_SHIFT  (30U)\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_BLOCK(x)     (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_ECC_CTRL_CTRL_ECC_BLOCK_SHIFT)) & OCOTP_OTP_ECC_CTRL_CTRL_ECC_BLOCK_MASK)\r\n\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_ZERO_MASK    (0x80000000U)\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_ZERO_SHIFT   (31U)\r\n#define OCOTP_OTP_ECC_CTRL_CTRL_ECC_ZERO(x)      (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_ECC_CTRL_CTRL_ECC_ZERO_SHIFT)) & OCOTP_OTP_ECC_CTRL_CTRL_ECC_ZERO_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_ECC_DATA - OTP Controller ECC Date Register */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_ECC_DATA_DATA_MASK             (0xFFFFFFFFU)\r\n#define OCOTP_OTP_ECC_DATA_DATA_SHIFT            (0U)\r\n#define OCOTP_OTP_ECC_DATA_DATA(x)               (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_ECC_DATA_DATA_SHIFT)) & OCOTP_OTP_ECC_DATA_DATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_ECC_DBG1 - OTP Controller ECC DBG Register1 */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_ECC_DBG1_SEC_ADDR_MASK         (0x1FFU)\r\n#define OCOTP_OTP_ECC_DBG1_SEC_ADDR_SHIFT        (0U)\r\n#define OCOTP_OTP_ECC_DBG1_SEC_ADDR(x)           (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_ECC_DBG1_SEC_ADDR_SHIFT)) & OCOTP_OTP_ECC_DBG1_SEC_ADDR_MASK)\r\n\r\n#define OCOTP_OTP_ECC_DBG1_DED_ADDR_MASK         (0x1FF0000U)\r\n#define OCOTP_OTP_ECC_DBG1_DED_ADDR_SHIFT        (16U)\r\n#define OCOTP_OTP_ECC_DBG1_DED_ADDR(x)           (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_ECC_DBG1_DED_ADDR_SHIFT)) & OCOTP_OTP_ECC_DBG1_DED_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_ECC_DBG2 - OTP Controller ECC DBG Register2 */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_ECC_DBG2_WRITE_ECC_PARITY_MASK (0x7FU)\r\n#define OCOTP_OTP_ECC_DBG2_WRITE_ECC_PARITY_SHIFT (0U)\r\n#define OCOTP_OTP_ECC_DBG2_WRITE_ECC_PARITY(x)   (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_ECC_DBG2_WRITE_ECC_PARITY_SHIFT)) & OCOTP_OTP_ECC_DBG2_WRITE_ECC_PARITY_MASK)\r\n\r\n#define OCOTP_OTP_ECC_DBG2_READ_ECC_PARITY_MASK  (0x7F00U)\r\n#define OCOTP_OTP_ECC_DBG2_READ_ECC_PARITY_SHIFT (8U)\r\n#define OCOTP_OTP_ECC_DBG2_READ_ECC_PARITY(x)    (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_ECC_DBG2_READ_ECC_PARITY_SHIFT)) & OCOTP_OTP_ECC_DBG2_READ_ECC_PARITY_MASK)\r\n\r\n#define OCOTP_OTP_ECC_DBG2_ECC_SYNDROME_MASK     (0x7F0000U)\r\n#define OCOTP_OTP_ECC_DBG2_ECC_SYNDROME_SHIFT    (16U)\r\n#define OCOTP_OTP_ECC_DBG2_ECC_SYNDROME(x)       (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_ECC_DBG2_ECC_SYNDROME_SHIFT)) & OCOTP_OTP_ECC_DBG2_ECC_SYNDROME_MASK)\r\n\r\n#define OCOTP_OTP_ECC_DBG2_ECC_CORRECTION_DETECTION_PARITYBITS_MASK (0x7F000000U)\r\n#define OCOTP_OTP_ECC_DBG2_ECC_CORRECTION_DETECTION_PARITYBITS_SHIFT (24U)\r\n#define OCOTP_OTP_ECC_DBG2_ECC_CORRECTION_DETECTION_PARITYBITS(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_ECC_DBG2_ECC_CORRECTION_DETECTION_PARITYBITS_SHIFT)) & OCOTP_OTP_ECC_DBG2_ECC_CORRECTION_DETECTION_PARITYBITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_ECC_DBG3 - OTP Controller ECC DBG Register3 */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_ECC_DBG3_BITS_MASK             (0xFFFFFFFFU)\r\n#define OCOTP_OTP_ECC_DBG3_BITS_SHIFT            (0U)\r\n#define OCOTP_OTP_ECC_DBG3_BITS(x)               (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_ECC_DBG3_BITS_SHIFT)) & OCOTP_OTP_ECC_DBG3_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_PRNG_RAND_SEED - OTP Controller PRNG Random Seed Register */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_PRNG_RAND_SEED_PRNG_RAND_SEED_MASK (0xFFFFFFFFU)\r\n#define OCOTP_OTP_PRNG_RAND_SEED_PRNG_RAND_SEED_SHIFT (0U)\r\n#define OCOTP_OTP_PRNG_RAND_SEED_PRNG_RAND_SEED(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_PRNG_RAND_SEED_PRNG_RAND_SEED_SHIFT)) & OCOTP_OTP_PRNG_RAND_SEED_PRNG_RAND_SEED_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_SRAM_ENTROPY_DATA - OTP Controller SRAM Entropy Data Register */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_SRAM_ENTROPY_DATA_SRAM_ENTROPY_DATA_MASK (0xFFFFFFFFU)\r\n#define OCOTP_OTP_SRAM_ENTROPY_DATA_SRAM_ENTROPY_DATA_SHIFT (0U)\r\n#define OCOTP_OTP_SRAM_ENTROPY_DATA_SRAM_ENTROPY_DATA(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_SRAM_ENTROPY_DATA_SRAM_ENTROPY_DATA_SHIFT)) & OCOTP_OTP_SRAM_ENTROPY_DATA_SRAM_ENTROPY_DATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_PRNG_OUTPUT_DATA - OTP Controller PRNG Output Data Register */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_PRNG_OUTPUT_DATA_PRNG_OUTPUT_DATA_MASK (0x3FFFFU)\r\n#define OCOTP_OTP_PRNG_OUTPUT_DATA_PRNG_OUTPUT_DATA_SHIFT (0U)\r\n#define OCOTP_OTP_PRNG_OUTPUT_DATA_PRNG_OUTPUT_DATA(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_PRNG_OUTPUT_DATA_PRNG_OUTPUT_DATA_SHIFT)) & OCOTP_OTP_PRNG_OUTPUT_DATA_PRNG_OUTPUT_DATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_CRC_LUT - OTP Controller CRC LUT Register0..OTP Controller CRC LUT Register7 */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_CRC_LUT_CRC_FUSE_START_ADDR_MASK (0x7FU)\r\n#define OCOTP_OTP_CRC_LUT_CRC_FUSE_START_ADDR_SHIFT (0U)\r\n#define OCOTP_OTP_CRC_LUT_CRC_FUSE_START_ADDR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CRC_LUT_CRC_FUSE_START_ADDR_SHIFT)) & OCOTP_OTP_CRC_LUT_CRC_FUSE_START_ADDR_MASK)\r\n\r\n#define OCOTP_OTP_CRC_LUT_CRC_EXP_VAL_FUSE_ADDR_MASK (0x700U)\r\n#define OCOTP_OTP_CRC_LUT_CRC_EXP_VAL_FUSE_ADDR_SHIFT (8U)\r\n#define OCOTP_OTP_CRC_LUT_CRC_EXP_VAL_FUSE_ADDR(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CRC_LUT_CRC_EXP_VAL_FUSE_ADDR_SHIFT)) & OCOTP_OTP_CRC_LUT_CRC_EXP_VAL_FUSE_ADDR_MASK)\r\n\r\n#define OCOTP_OTP_CRC_LUT_CRC_FUSE_END_ADDR_MASK (0x7F0000U)\r\n#define OCOTP_OTP_CRC_LUT_CRC_FUSE_END_ADDR_SHIFT (16U)\r\n#define OCOTP_OTP_CRC_LUT_CRC_FUSE_END_ADDR(x)   (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CRC_LUT_CRC_FUSE_END_ADDR_SHIFT)) & OCOTP_OTP_CRC_LUT_CRC_FUSE_END_ADDR_MASK)\r\n\r\n#define OCOTP_OTP_CRC_LUT_READ_PROTECTION_MASK   (0x20000000U)\r\n#define OCOTP_OTP_CRC_LUT_READ_PROTECTION_SHIFT  (29U)\r\n#define OCOTP_OTP_CRC_LUT_READ_PROTECTION(x)     (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CRC_LUT_READ_PROTECTION_SHIFT)) & OCOTP_OTP_CRC_LUT_READ_PROTECTION_MASK)\r\n\r\n#define OCOTP_OTP_CRC_LUT_SECURITY_PROTECTION_MASK (0x40000000U)\r\n#define OCOTP_OTP_CRC_LUT_SECURITY_PROTECTION_SHIFT (30U)\r\n#define OCOTP_OTP_CRC_LUT_SECURITY_PROTECTION(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CRC_LUT_SECURITY_PROTECTION_SHIFT)) & OCOTP_OTP_CRC_LUT_SECURITY_PROTECTION_MASK)\r\n\r\n#define OCOTP_OTP_CRC_LUT_WRITE_PROTECTION_MASK  (0x80000000U)\r\n#define OCOTP_OTP_CRC_LUT_WRITE_PROTECTION_SHIFT (31U)\r\n#define OCOTP_OTP_CRC_LUT_WRITE_PROTECTION(x)    (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_CRC_LUT_WRITE_PROTECTION_SHIFT)) & OCOTP_OTP_CRC_LUT_WRITE_PROTECTION_MASK)\r\n/*! @} */\r\n\r\n/* The count of OCOTP_OTP_CRC_LUT */\r\n#define OCOTP_OTP_CRC_LUT_COUNT                  (8U)\r\n\r\n/*! @name OTP_LOCK_STICKY_0 - OTP Controller Lock Sticky Register0 */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT0_MASK (0x1U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT0_SHIFT (0U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT0(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT0_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT0_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT1_MASK (0x2U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT1_SHIFT (1U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT1(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT1_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT1_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT2_MASK (0x4U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT2_SHIFT (2U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT2(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT2_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT2_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT3_MASK (0x8U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT3_SHIFT (3U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT3(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT3_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT3_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT4_MASK (0x10U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT4_SHIFT (4U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT4(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT4_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT4_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT5_MASK (0x20U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT5_SHIFT (5U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT5(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT5_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT5_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT6_MASK (0x40U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT6_SHIFT (6U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT6(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT6_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT6_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT7_MASK (0x80U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT7_SHIFT (7U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT7(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT7_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT7_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT8_MASK (0x100U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT8_SHIFT (8U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT8(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT8_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT8_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT9_MASK (0x200U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT9_SHIFT (9U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT9(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT9_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT9_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT10_MASK (0x400U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT10_SHIFT (10U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT10(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT10_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT10_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT11_MASK (0x800U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT11_SHIFT (11U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT11(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT11_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT11_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT12_MASK (0x1000U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT12_SHIFT (12U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT12(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT12_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT12_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT13_MASK (0x2000U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT13_SHIFT (13U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT13(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT13_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT13_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT14_MASK (0x4000U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT14_SHIFT (14U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT14(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT14_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT14_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT15_MASK (0x8000U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT15_SHIFT (15U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT15(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT15_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT15_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT16_MASK (0x10000U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT16_SHIFT (16U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT16(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT16_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT16_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT17_MASK (0x20000U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT17_SHIFT (17U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT17(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT17_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT17_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT18_MASK (0x40000U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT18_SHIFT (18U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT18(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT18_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT18_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT19_MASK (0x80000U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT19_SHIFT (19U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT19(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT19_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT19_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT20_MASK (0x100000U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT20_SHIFT (20U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT20(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT20_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT20_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT21_MASK (0x200000U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT21_SHIFT (21U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT21(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT21_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT21_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT22_MASK (0x400000U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT22_SHIFT (22U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT22(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT22_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT22_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT23_MASK (0x800000U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT23_SHIFT (23U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT23(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT23_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT23_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT24_MASK (0x1000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT24_SHIFT (24U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT24(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT24_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT24_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT25_MASK (0x2000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT25_SHIFT (25U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT25(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT25_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT25_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT26_MASK (0x4000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT26_SHIFT (26U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT26(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT26_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT26_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT27_MASK (0x8000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT27_SHIFT (27U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT27(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT27_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT27_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT28_MASK (0x10000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT28_SHIFT (28U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT28(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT28_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT28_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT29_MASK (0x20000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT29_SHIFT (29U)\r\n#define OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT29(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT29_SHIFT)) & OCOTP_OTP_LOCK_STICKY_0_LOCK_STICKY_BIT29_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_LOCK_STICKY_1 - OTP Controller Lock Sticky Register1 */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT30_MASK (0x1U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT30_SHIFT (0U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT30(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT30_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT30_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT31_MASK (0x2U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT31_SHIFT (1U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT31(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT31_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT31_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT32_MASK (0x4U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT32_SHIFT (2U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT32(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT32_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT32_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT33_MASK (0x8U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT33_SHIFT (3U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT33(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT33_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT33_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT34_MASK (0x10U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT34_SHIFT (4U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT34(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT34_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT34_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT35_MASK (0x20U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT35_SHIFT (5U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT35(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT35_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT35_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT36_MASK (0x40U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT36_SHIFT (6U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT36(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT36_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT36_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT37_MASK (0x80U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT37_SHIFT (7U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT37(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT37_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT37_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT38_MASK (0x100U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT38_SHIFT (8U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT38(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT38_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT38_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT39_MASK (0x200U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT39_SHIFT (9U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT39(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT39_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT39_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT40_MASK (0x400U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT40_SHIFT (10U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT40(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT40_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT40_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT41_MASK (0x800U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT41_SHIFT (11U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT41(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT41_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT41_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT42_MASK (0x1000U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT42_SHIFT (12U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT42(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT42_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT42_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT43_MASK (0x2000U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT43_SHIFT (13U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT43(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT43_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT43_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT44_MASK (0x4000U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT44_SHIFT (14U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT44(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT44_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT44_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT45_MASK (0x8000U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT45_SHIFT (15U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT45(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT45_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT45_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT46_MASK (0x10000U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT46_SHIFT (16U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT46(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT46_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT46_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT47_MASK (0x20000U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT47_SHIFT (17U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT47(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT47_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT47_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT48_MASK (0x40000U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT48_SHIFT (18U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT48(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT48_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT48_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT49_MASK (0x80000U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT49_SHIFT (19U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT49(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT49_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT49_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT50_MASK (0x100000U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT50_SHIFT (20U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT50(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT50_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT50_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT51_MASK (0x200000U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT51_SHIFT (21U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT51(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT51_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT51_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT52_MASK (0x400000U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT52_SHIFT (22U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT52(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT52_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT52_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT53_MASK (0x800000U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT53_SHIFT (23U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT53(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT53_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT53_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT54_MASK (0x1000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT54_SHIFT (24U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT54(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT54_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT54_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT55_MASK (0x2000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT55_SHIFT (25U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT55(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT55_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT55_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT56_MASK (0x4000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT56_SHIFT (26U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT56(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT56_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT56_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT57_MASK (0x8000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT57_SHIFT (27U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT57(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT57_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT57_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT58_MASK (0x10000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT58_SHIFT (28U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT58(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT58_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT58_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT59_MASK (0x20000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT59_SHIFT (29U)\r\n#define OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT59(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT59_SHIFT)) & OCOTP_OTP_LOCK_STICKY_1_LOCK_STICKY_BIT59_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_LOCK_STICKY_2 - OTP Controller Lock Sticky Register2 */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT60_MASK (0x1U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT60_SHIFT (0U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT60(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT60_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT60_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT61_MASK (0x2U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT61_SHIFT (1U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT61(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT61_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT61_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT62_MASK (0x4U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT62_SHIFT (2U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT62(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT62_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT62_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT63_MASK (0x8U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT63_SHIFT (3U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT63(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT63_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT63_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT64_MASK (0x10U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT64_SHIFT (4U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT64(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT64_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT64_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT65_MASK (0x20U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT65_SHIFT (5U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT65(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT65_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT65_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT66_MASK (0x40U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT66_SHIFT (6U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT66(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT66_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT66_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT67_MASK (0x80U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT67_SHIFT (7U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT67(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT67_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT67_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT68_MASK (0x100U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT68_SHIFT (8U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT68(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT68_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT68_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT69_MASK (0x200U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT69_SHIFT (9U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT69(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT69_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT69_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT70_MASK (0x400U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT70_SHIFT (10U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT70(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT70_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT70_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT71_MASK (0x800U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT71_SHIFT (11U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT71(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT71_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT71_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT72_MASK (0x1000U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT72_SHIFT (12U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT72(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT72_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT72_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT73_MASK (0x2000U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT73_SHIFT (13U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT73(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT73_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT73_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT74_MASK (0x4000U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT74_SHIFT (14U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT74(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT74_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT74_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT75_MASK (0x8000U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT75_SHIFT (15U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT75(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT75_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT75_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT76_MASK (0x10000U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT76_SHIFT (16U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT76(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT76_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT76_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT77_MASK (0x20000U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT77_SHIFT (17U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT77(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT77_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT77_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT78_MASK (0x40000U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT78_SHIFT (18U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT78(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT78_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT78_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT79_MASK (0x80000U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT79_SHIFT (19U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT79(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT79_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT79_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT80_MASK (0x100000U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT80_SHIFT (20U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT80(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT80_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT80_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT81_MASK (0x200000U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT81_SHIFT (21U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT81(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT81_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT81_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT82_MASK (0x400000U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT82_SHIFT (22U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT82(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT82_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT82_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT83_MASK (0x800000U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT83_SHIFT (23U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT83(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT83_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT83_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT84_MASK (0x1000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT84_SHIFT (24U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT84(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT84_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT84_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT85_MASK (0x2000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT85_SHIFT (25U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT85(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT85_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT85_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT86_MASK (0x4000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT86_SHIFT (26U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT86(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT86_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT86_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT87_MASK (0x8000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT87_SHIFT (27U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT87(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT87_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT87_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT88_MASK (0x10000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT88_SHIFT (28U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT88(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT88_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT88_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT89_MASK (0x20000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT89_SHIFT (29U)\r\n#define OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT89(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT89_SHIFT)) & OCOTP_OTP_LOCK_STICKY_2_LOCK_STICKY_BIT89_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_LOCK_STICKY_3 - OTP Controller Lock Sticky Register3 */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT90_MASK (0x1U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT90_SHIFT (0U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT90(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT90_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT90_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT91_MASK (0x2U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT91_SHIFT (1U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT91(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT91_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT91_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT92_MASK (0x4U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT92_SHIFT (2U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT92(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT92_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT92_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT93_MASK (0x8U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT93_SHIFT (3U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT93(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT93_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT93_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT94_MASK (0x10U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT94_SHIFT (4U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT94(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT94_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT94_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT95_MASK (0x20U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT95_SHIFT (5U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT95(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT95_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT95_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT96_MASK (0x40U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT96_SHIFT (6U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT96(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT96_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT96_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT97_MASK (0x80U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT97_SHIFT (7U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT97(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT97_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT97_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT98_MASK (0x100U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT98_SHIFT (8U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT98(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT98_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT98_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT99_MASK (0x200U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT99_SHIFT (9U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT99(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT99_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT99_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT100_MASK (0x400U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT100_SHIFT (10U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT100(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT100_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT100_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT101_MASK (0x800U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT101_SHIFT (11U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT101(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT101_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT101_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT102_MASK (0x1000U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT102_SHIFT (12U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT102(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT102_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT102_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT103_MASK (0x2000U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT103_SHIFT (13U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT103(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT103_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT103_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT104_MASK (0x4000U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT104_SHIFT (14U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT104(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT104_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT104_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT105_MASK (0x8000U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT105_SHIFT (15U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT105(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT105_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT105_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT106_MASK (0x10000U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT106_SHIFT (16U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT106(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT106_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT106_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT107_MASK (0x20000U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT107_SHIFT (17U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT107(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT107_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT107_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT108_MASK (0x40000U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT108_SHIFT (18U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT108(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT108_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT108_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT109_MASK (0x80000U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT109_SHIFT (19U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT109(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT109_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT109_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT110_MASK (0x100000U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT110_SHIFT (20U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT110(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT110_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT110_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT111_MASK (0x200000U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT111_SHIFT (21U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT111(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT111_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT111_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT112_MASK (0x400000U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT112_SHIFT (22U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT112(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT112_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT112_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT113_MASK (0x800000U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT113_SHIFT (23U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT113(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT113_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT113_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT114_MASK (0x1000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT114_SHIFT (24U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT114(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT114_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT114_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT115_MASK (0x2000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT115_SHIFT (25U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT115(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT115_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT115_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT116_MASK (0x4000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT116_SHIFT (26U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT116(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT116_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT116_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT117_MASK (0x8000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT117_SHIFT (27U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT117(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT117_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT117_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT118_MASK (0x10000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT118_SHIFT (28U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT118(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT118_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT118_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT119_MASK (0x20000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT119_SHIFT (29U)\r\n#define OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT119(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT119_SHIFT)) & OCOTP_OTP_LOCK_STICKY_3_LOCK_STICKY_BIT119_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_LOCK_STICKY_4 - OTP Controller Lock Sticky Register4 */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT120_MASK (0x1U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT120_SHIFT (0U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT120(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT120_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT120_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT121_MASK (0x2U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT121_SHIFT (1U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT121(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT121_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT121_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT122_MASK (0x4U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT122_SHIFT (2U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT122(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT122_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT122_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT123_MASK (0x8U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT123_SHIFT (3U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT123(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT123_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT123_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT124_MASK (0x10U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT124_SHIFT (4U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT124(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT124_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT124_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT125_MASK (0x20U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT125_SHIFT (5U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT125(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT125_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT125_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT126_MASK (0x40U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT126_SHIFT (6U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT126(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT126_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT126_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT127_MASK (0x80U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT127_SHIFT (7U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT127(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT127_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT127_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT128_MASK (0x100U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT128_SHIFT (8U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT128(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT128_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT128_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT129_MASK (0x200U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT129_SHIFT (9U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT129(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT129_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT129_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT130_MASK (0x400U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT130_SHIFT (10U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT130(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT130_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT130_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT131_MASK (0x800U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT131_SHIFT (11U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT131(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT131_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT131_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT132_MASK (0x1000U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT132_SHIFT (12U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT132(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT132_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT132_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT133_MASK (0x2000U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT133_SHIFT (13U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT133(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT133_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT133_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT134_MASK (0x4000U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT134_SHIFT (14U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT134(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT134_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT134_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT135_MASK (0x8000U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT135_SHIFT (15U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT135(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT135_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT135_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT136_MASK (0x10000U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT136_SHIFT (16U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT136(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT136_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT136_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT137_MASK (0x20000U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT137_SHIFT (17U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT137(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT137_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT137_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT138_MASK (0x40000U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT138_SHIFT (18U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT138(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT138_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT138_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT139_MASK (0x80000U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT139_SHIFT (19U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT139(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT139_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT139_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT140_MASK (0x100000U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT140_SHIFT (20U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT140(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT140_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT140_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT141_MASK (0x200000U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT141_SHIFT (21U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT141(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT141_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT141_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT142_MASK (0x400000U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT142_SHIFT (22U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT142(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT142_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT142_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT143_MASK (0x800000U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT143_SHIFT (23U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT143(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT143_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT143_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT144_MASK (0x1000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT144_SHIFT (24U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT144(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT144_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT144_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT145_MASK (0x2000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT145_SHIFT (25U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT145(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT145_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT145_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT146_MASK (0x4000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT146_SHIFT (26U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT146(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT146_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT146_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT147_MASK (0x8000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT147_SHIFT (27U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT147(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT147_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT147_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT148_MASK (0x10000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT148_SHIFT (28U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT148(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT148_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT148_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT149_MASK (0x20000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT149_SHIFT (29U)\r\n#define OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT149(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT149_SHIFT)) & OCOTP_OTP_LOCK_STICKY_4_LOCK_STICKY_BIT149_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_LOCK_STICKY_5 - OTP Controller Lock Sticky Register5 */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT150_MASK (0x1U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT150_SHIFT (0U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT150(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT150_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT150_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT151_MASK (0x2U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT151_SHIFT (1U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT151(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT151_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT151_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT152_MASK (0x4U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT152_SHIFT (2U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT152(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT152_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT152_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT153_MASK (0x8U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT153_SHIFT (3U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT153(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT153_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT153_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT154_MASK (0x10U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT154_SHIFT (4U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT154(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT154_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT154_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT155_MASK (0x20U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT155_SHIFT (5U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT155(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT155_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT155_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT156_MASK (0x40U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT156_SHIFT (6U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT156(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT156_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT156_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT157_MASK (0x80U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT157_SHIFT (7U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT157(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT157_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT157_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT158_MASK (0x100U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT158_SHIFT (8U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT158(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT158_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT158_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT159_MASK (0x200U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT159_SHIFT (9U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT159(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT159_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT159_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT160_MASK (0x400U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT160_SHIFT (10U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT160(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT160_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT160_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT161_MASK (0x800U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT161_SHIFT (11U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT161(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT161_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT161_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT162_MASK (0x1000U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT162_SHIFT (12U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT162(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT162_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT162_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT163_MASK (0x2000U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT163_SHIFT (13U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT163(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT163_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT163_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT164_MASK (0x4000U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT164_SHIFT (14U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT164(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT164_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT164_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT165_MASK (0x8000U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT165_SHIFT (15U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT165(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT165_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT165_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT166_MASK (0x10000U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT166_SHIFT (16U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT166(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT166_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT166_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT167_MASK (0x20000U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT167_SHIFT (17U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT167(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT167_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT167_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT168_MASK (0x40000U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT168_SHIFT (18U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT168(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT168_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT168_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT169_MASK (0x80000U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT169_SHIFT (19U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT169(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT169_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT169_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT170_MASK (0x100000U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT170_SHIFT (20U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT170(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT170_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT170_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT171_MASK (0x200000U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT171_SHIFT (21U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT171(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT171_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT171_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT172_MASK (0x400000U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT172_SHIFT (22U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT172(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT172_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT172_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT173_MASK (0x800000U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT173_SHIFT (23U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT173(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT173_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT173_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT174_MASK (0x1000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT174_SHIFT (24U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT174(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT174_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT174_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT175_MASK (0x2000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT175_SHIFT (25U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT175(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT175_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT175_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT176_MASK (0x4000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT176_SHIFT (26U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT176(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT176_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT176_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT177_MASK (0x8000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT177_SHIFT (27U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT177(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT177_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT177_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT178_MASK (0x10000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT178_SHIFT (28U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT178(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT178_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT178_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT179_MASK (0x20000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT179_SHIFT (29U)\r\n#define OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT179(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT179_SHIFT)) & OCOTP_OTP_LOCK_STICKY_5_LOCK_STICKY_BIT179_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_LOCK_STICKY_6 - OTP Controller Lock Sticky Register6 */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT180_MASK (0x1U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT180_SHIFT (0U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT180(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT180_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT180_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT181_MASK (0x2U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT181_SHIFT (1U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT181(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT181_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT181_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT182_MASK (0x4U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT182_SHIFT (2U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT182(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT182_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT182_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT183_MASK (0x8U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT183_SHIFT (3U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT183(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT183_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT183_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT184_MASK (0x10U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT184_SHIFT (4U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT184(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT184_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT184_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT185_MASK (0x20U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT185_SHIFT (5U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT185(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT185_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT185_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT186_MASK (0x40U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT186_SHIFT (6U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT186(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT186_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT186_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT187_MASK (0x80U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT187_SHIFT (7U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT187(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT187_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT187_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT188_MASK (0x100U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT188_SHIFT (8U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT188(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT188_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT188_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT189_MASK (0x200U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT189_SHIFT (9U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT189(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT189_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT189_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT190_MASK (0x400U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT190_SHIFT (10U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT190(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT190_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT190_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT191_MASK (0x800U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT191_SHIFT (11U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT191(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT191_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT191_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT192_MASK (0x1000U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT192_SHIFT (12U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT192(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT192_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT192_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT193_MASK (0x2000U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT193_SHIFT (13U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT193(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT193_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT193_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT194_MASK (0x4000U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT194_SHIFT (14U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT194(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT194_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT194_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT195_MASK (0x8000U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT195_SHIFT (15U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT195(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT195_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT195_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT196_MASK (0x10000U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT196_SHIFT (16U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT196(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT196_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT196_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT197_MASK (0x20000U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT197_SHIFT (17U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT197(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT197_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT197_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT198_MASK (0x40000U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT198_SHIFT (18U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT198(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT198_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT198_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT199_MASK (0x80000U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT199_SHIFT (19U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT199(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT199_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT199_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT200_MASK (0x100000U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT200_SHIFT (20U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT200(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT200_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT200_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT201_MASK (0x200000U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT201_SHIFT (21U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT201(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT201_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT201_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT202_MASK (0x400000U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT202_SHIFT (22U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT202(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT202_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT202_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT203_MASK (0x800000U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT203_SHIFT (23U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT203(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT203_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT203_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT204_MASK (0x1000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT204_SHIFT (24U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT204(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT204_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT204_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT205_MASK (0x2000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT205_SHIFT (25U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT205(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT205_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT205_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT206_MASK (0x4000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT206_SHIFT (26U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT206(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT206_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT206_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT207_MASK (0x8000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT207_SHIFT (27U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT207(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT207_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT207_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT208_MASK (0x10000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT208_SHIFT (28U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT208(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT208_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT208_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT209_MASK (0x20000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT209_SHIFT (29U)\r\n#define OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT209(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT209_SHIFT)) & OCOTP_OTP_LOCK_STICKY_6_LOCK_STICKY_BIT209_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_LOCK_STICKY_7 - OTP Controller Lock Sticky Register7 */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT210_MASK (0x1U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT210_SHIFT (0U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT210(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT210_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT210_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT211_MASK (0x2U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT211_SHIFT (1U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT211(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT211_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT211_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT212_MASK (0x4U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT212_SHIFT (2U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT212(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT212_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT212_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT213_MASK (0x8U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT213_SHIFT (3U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT213(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT213_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT213_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT214_MASK (0x10U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT214_SHIFT (4U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT214(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT214_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT214_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT215_MASK (0x20U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT215_SHIFT (5U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT215(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT215_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT215_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT216_MASK (0x40U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT216_SHIFT (6U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT216(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT216_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT216_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT217_MASK (0x80U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT217_SHIFT (7U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT217(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT217_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT217_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT218_MASK (0x100U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT218_SHIFT (8U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT218(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT218_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT218_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT219_MASK (0x200U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT219_SHIFT (9U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT219(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT219_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT219_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT220_MASK (0x400U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT220_SHIFT (10U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT220(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT220_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT220_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT221_MASK (0x800U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT221_SHIFT (11U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT221(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT221_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT221_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT222_MASK (0x1000U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT222_SHIFT (12U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT222(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT222_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT222_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT223_MASK (0x2000U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT223_SHIFT (13U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT223(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT223_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT223_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT224_MASK (0x4000U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT224_SHIFT (14U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT224(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT224_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT224_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT225_MASK (0x8000U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT225_SHIFT (15U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT225(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT225_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT225_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT226_MASK (0x10000U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT226_SHIFT (16U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT226(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT226_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT226_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT227_MASK (0x20000U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT227_SHIFT (17U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT227(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT227_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT227_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT228_MASK (0x40000U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT228_SHIFT (18U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT228(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT228_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT228_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT229_MASK (0x80000U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT229_SHIFT (19U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT229(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT229_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT229_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT230_MASK (0x100000U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT230_SHIFT (20U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT230(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT230_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT230_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT231_MASK (0x200000U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT231_SHIFT (21U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT231(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT231_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT231_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT232_MASK (0x400000U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT232_SHIFT (22U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT232(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT232_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT232_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT233_MASK (0x800000U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT233_SHIFT (23U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT233(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT233_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT233_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT234_MASK (0x1000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT234_SHIFT (24U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT234(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT234_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT234_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT235_MASK (0x2000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT235_SHIFT (25U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT235(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT235_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT235_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT236_MASK (0x4000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT236_SHIFT (26U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT236(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT236_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT236_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT237_MASK (0x8000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT237_SHIFT (27U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT237(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT237_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT237_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT238_MASK (0x10000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT238_SHIFT (28U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT238(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT238_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT238_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT239_MASK (0x20000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT239_SHIFT (29U)\r\n#define OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT239(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT239_SHIFT)) & OCOTP_OTP_LOCK_STICKY_7_LOCK_STICKY_BIT239_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_LOCK_STICKY_8 - OTP Controller Lock Sticky Register8 */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT240_MASK (0x1U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT240_SHIFT (0U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT240(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT240_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT240_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT241_MASK (0x2U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT241_SHIFT (1U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT241(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT241_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT241_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT242_MASK (0x4U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT242_SHIFT (2U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT242(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT242_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT242_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT243_MASK (0x8U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT243_SHIFT (3U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT243(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT243_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT243_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT244_MASK (0x10U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT244_SHIFT (4U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT244(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT244_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT244_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT245_MASK (0x20U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT245_SHIFT (5U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT245(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT245_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT245_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT246_MASK (0x40U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT246_SHIFT (6U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT246(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT246_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT246_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT247_MASK (0x80U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT247_SHIFT (7U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT247(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT247_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT247_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT248_MASK (0x100U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT248_SHIFT (8U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT248(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT248_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT248_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT249_MASK (0x200U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT249_SHIFT (9U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT249(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT249_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT249_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT250_MASK (0x400U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT250_SHIFT (10U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT250(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT250_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT250_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT251_MASK (0x800U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT251_SHIFT (11U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT251(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT251_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT251_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT252_MASK (0x1000U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT252_SHIFT (12U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT252(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT252_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT252_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT253_MASK (0x2000U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT253_SHIFT (13U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT253(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT253_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT253_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT254_MASK (0x4000U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT254_SHIFT (14U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT254(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT254_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT254_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT255_MASK (0x8000U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT255_SHIFT (15U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT255(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT255_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT255_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT256_MASK (0x10000U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT256_SHIFT (16U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT256(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT256_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT256_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT257_MASK (0x20000U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT257_SHIFT (17U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT257(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT257_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT257_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT258_MASK (0x40000U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT258_SHIFT (18U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT258(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT258_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT258_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT259_MASK (0x80000U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT259_SHIFT (19U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT259(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT259_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT259_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT260_MASK (0x100000U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT260_SHIFT (20U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT260(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT260_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT260_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT261_MASK (0x200000U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT261_SHIFT (21U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT261(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT261_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT261_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT262_MASK (0x400000U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT262_SHIFT (22U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT262(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT262_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT262_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT263_MASK (0x800000U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT263_SHIFT (23U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT263(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT263_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT263_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT264_MASK (0x1000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT264_SHIFT (24U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT264(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT264_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT264_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT265_MASK (0x2000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT265_SHIFT (25U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT265(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT265_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT265_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT266_MASK (0x4000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT266_SHIFT (26U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT266(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT266_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT266_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT267_MASK (0x8000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT267_SHIFT (27U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT267(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT267_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT267_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT268_MASK (0x10000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT268_SHIFT (28U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT268(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT268_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT268_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT269_MASK (0x20000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT269_SHIFT (29U)\r\n#define OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT269(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT269_SHIFT)) & OCOTP_OTP_LOCK_STICKY_8_LOCK_STICKY_BIT269_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_LOCK_STICKY_9 - OTP Controller Lock Sticky Register9 */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT270_MASK (0x1U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT270_SHIFT (0U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT270(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT270_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT270_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT271_MASK (0x2U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT271_SHIFT (1U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT271(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT271_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT271_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT272_MASK (0x4U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT272_SHIFT (2U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT272(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT272_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT272_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT273_MASK (0x8U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT273_SHIFT (3U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT273(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT273_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT273_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT274_MASK (0x10U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT274_SHIFT (4U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT274(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT274_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT274_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT275_MASK (0x20U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT275_SHIFT (5U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT275(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT275_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT275_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT276_MASK (0x40U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT276_SHIFT (6U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT276(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT276_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT276_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT277_MASK (0x80U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT277_SHIFT (7U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT277(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT277_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT277_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT278_MASK (0x100U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT278_SHIFT (8U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT278(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT278_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT278_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT279_MASK (0x200U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT279_SHIFT (9U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT279(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT279_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT279_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT280_MASK (0x400U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT280_SHIFT (10U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT280(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT280_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT280_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT281_MASK (0x800U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT281_SHIFT (11U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT281(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT281_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT281_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT282_MASK (0x1000U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT282_SHIFT (12U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT282(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT282_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT282_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT283_MASK (0x2000U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT283_SHIFT (13U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT283(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT283_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT283_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT284_MASK (0x4000U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT284_SHIFT (14U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT284(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT284_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT284_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT285_MASK (0x8000U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT285_SHIFT (15U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT285(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT285_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT285_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT286_MASK (0x10000U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT286_SHIFT (16U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT286(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT286_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT286_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT287_MASK (0x20000U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT287_SHIFT (17U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT287(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT287_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT287_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT288_MASK (0x40000U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT288_SHIFT (18U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT288(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT288_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT288_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT289_MASK (0x80000U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT289_SHIFT (19U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT289(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT289_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT289_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT290_MASK (0x100000U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT290_SHIFT (20U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT290(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT290_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT290_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT291_MASK (0x200000U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT291_SHIFT (21U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT291(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT291_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT291_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT292_MASK (0x400000U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT292_SHIFT (22U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT292(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT292_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT292_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT293_MASK (0x800000U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT293_SHIFT (23U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT293(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT293_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT293_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT294_MASK (0x1000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT294_SHIFT (24U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT294(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT294_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT294_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT295_MASK (0x2000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT295_SHIFT (25U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT295(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT295_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT295_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT296_MASK (0x4000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT296_SHIFT (26U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT296(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT296_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT296_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT297_MASK (0x8000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT297_SHIFT (27U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT297(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT297_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT297_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT298_MASK (0x10000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT298_SHIFT (28U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT298(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT298_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT298_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT299_MASK (0x20000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT299_SHIFT (29U)\r\n#define OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT299(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT299_SHIFT)) & OCOTP_OTP_LOCK_STICKY_9_LOCK_STICKY_BIT299_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_LOCK_STICKY_10 - OTP Controller Lock Sticky Register10 */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT300_MASK (0x1U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT300_SHIFT (0U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT300(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT300_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT300_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT301_MASK (0x2U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT301_SHIFT (1U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT301(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT301_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT301_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT302_MASK (0x4U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT302_SHIFT (2U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT302(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT302_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT302_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT303_MASK (0x8U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT303_SHIFT (3U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT303(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT303_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT303_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT304_MASK (0x10U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT304_SHIFT (4U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT304(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT304_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT304_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT305_MASK (0x20U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT305_SHIFT (5U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT305(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT305_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT305_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT306_MASK (0x40U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT306_SHIFT (6U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT306(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT306_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT306_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT307_MASK (0x80U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT307_SHIFT (7U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT307(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT307_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT307_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT308_MASK (0x100U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT308_SHIFT (8U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT308(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT308_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT308_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT309_MASK (0x200U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT309_SHIFT (9U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT309(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT309_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT309_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT310_MASK (0x400U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT310_SHIFT (10U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT310(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT310_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT310_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT311_MASK (0x800U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT311_SHIFT (11U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT311(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT311_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT311_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT312_MASK (0x1000U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT312_SHIFT (12U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT312(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT312_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT312_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT313_MASK (0x2000U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT313_SHIFT (13U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT313(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT313_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT313_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT314_MASK (0x4000U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT314_SHIFT (14U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT314(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT314_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT314_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT315_MASK (0x8000U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT315_SHIFT (15U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT315(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT315_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT315_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT316_MASK (0x10000U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT316_SHIFT (16U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT316(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT316_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT316_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT317_MASK (0x20000U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT317_SHIFT (17U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT317(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT317_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT317_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT318_MASK (0x40000U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT318_SHIFT (18U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT318(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT318_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT318_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT319_MASK (0x80000U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT319_SHIFT (19U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT319(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT319_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT319_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT320_MASK (0x100000U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT320_SHIFT (20U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT320(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT320_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT320_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT321_MASK (0x200000U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT321_SHIFT (21U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT321(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT321_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT321_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT322_MASK (0x400000U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT322_SHIFT (22U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT322(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT322_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT322_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT323_MASK (0x800000U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT323_SHIFT (23U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT323(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT323_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT323_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT324_MASK (0x1000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT324_SHIFT (24U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT324(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT324_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT324_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT325_MASK (0x2000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT325_SHIFT (25U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT325(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT325_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT325_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT326_MASK (0x4000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT326_SHIFT (26U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT326(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT326_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT326_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT327_MASK (0x8000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT327_SHIFT (27U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT327(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT327_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT327_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT328_MASK (0x10000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT328_SHIFT (28U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT328(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT328_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT328_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT329_MASK (0x20000000U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT329_SHIFT (29U)\r\n#define OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT329(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT329_SHIFT)) & OCOTP_OTP_LOCK_STICKY_10_LOCK_STICKY_BIT329_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_LOCK_STICKY_11 - OTP Controller Lock Sticky Register11 */\r\n/*! @{ */\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT330_MASK (0x1U)\r\n#define OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT330_SHIFT (0U)\r\n#define OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT330(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT330_SHIFT)) & OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT330_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT331_MASK (0x2U)\r\n#define OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT331_SHIFT (1U)\r\n#define OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT331(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT331_SHIFT)) & OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT331_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT332_MASK (0x4U)\r\n#define OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT332_SHIFT (2U)\r\n#define OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT332(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT332_SHIFT)) & OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT332_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT333_MASK (0x8U)\r\n#define OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT333_SHIFT (3U)\r\n#define OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT333(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT333_SHIFT)) & OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT333_MASK)\r\n\r\n#define OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT334_MASK (0x10U)\r\n#define OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT334_SHIFT (4U)\r\n#define OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT334(x) (((uint32_t)(((uint32_t)(x)) << OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT334_SHIFT)) & OCOTP_OTP_LOCK_STICKY_11_LOCK_STICKY_BIT334_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group OCOTP_Register_Masks */\r\n\r\n\r\n/* OCOTP - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral OCOTP base address */\r\n  #define OCOTP_BASE                               (0x5000A000u)\r\n  /** Peripheral OCOTP base address */\r\n  #define OCOTP_BASE_NS                            (0x4000A000u)\r\n  /** Peripheral OCOTP base pointer */\r\n  #define OCOTP                                    ((OCOTP_Type *)OCOTP_BASE)\r\n  /** Peripheral OCOTP base pointer */\r\n  #define OCOTP_NS                                 ((OCOTP_Type *)OCOTP_BASE_NS)\r\n  /** Array initializer of OCOTP peripheral base addresses */\r\n  #define OCOTP_BASE_ADDRS                         { OCOTP_BASE }\r\n  /** Array initializer of OCOTP peripheral base pointers */\r\n  #define OCOTP_BASE_PTRS                          { OCOTP }\r\n  /** Array initializer of OCOTP peripheral base addresses */\r\n  #define OCOTP_BASE_ADDRS_NS                      { OCOTP_BASE_NS }\r\n  /** Array initializer of OCOTP peripheral base pointers */\r\n  #define OCOTP_BASE_PTRS_NS                       { OCOTP_NS }\r\n#else\r\n  /** Peripheral OCOTP base address */\r\n  #define OCOTP_BASE                               (0x4000A000u)\r\n  /** Peripheral OCOTP base pointer */\r\n  #define OCOTP                                    ((OCOTP_Type *)OCOTP_BASE)\r\n  /** Array initializer of OCOTP peripheral base addresses */\r\n  #define OCOTP_BASE_ADDRS                         { OCOTP_BASE }\r\n  /** Array initializer of OCOTP peripheral base pointers */\r\n  #define OCOTP_BASE_PTRS                          { OCOTP }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group OCOTP_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- OSTIMER Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup OSTIMER_Peripheral_Access_Layer OSTIMER Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** OSTIMER - Register Layout Typedef */\r\ntypedef struct {\r\n  __I  uint32_t EVTIMERL;                          /**< EVTIMER Low Register, offset: 0x0 */\r\n  __I  uint32_t EVTIMERH;                          /**< EVTIMER High Register, offset: 0x4 */\r\n  __I  uint32_t CAPTURE_L;                         /**< Local Capture Low Register for CPU, offset: 0x8 */\r\n  __I  uint32_t CAPTURE_H;                         /**< Local Capture High Register for CPU, offset: 0xC */\r\n  __IO uint32_t MATCH_L;                           /**< Local Match Low Register for CPU, offset: 0x10 */\r\n  __IO uint32_t MATCH_H;                           /**< Local Match High Register for CPU, offset: 0x14 */\r\n       uint8_t RESERVED_0[4];\r\n  __IO uint32_t OSEVENT_CTRL;                      /**< OS Event Timer Control Register for CPU, offset: 0x1C */\r\n} OSTIMER_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- OSTIMER Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup OSTIMER_Register_Masks OSTIMER Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name EVTIMERL - EVTIMER Low Register */\r\n/*! @{ */\r\n\r\n#define OSTIMER_EVTIMERL_EVTIMER_COUNT_VALUE_MASK (0xFFFFFFFFU)\r\n#define OSTIMER_EVTIMERL_EVTIMER_COUNT_VALUE_SHIFT (0U)\r\n/*! EVTIMER_COUNT_VALUE - EVTimer Count value */\r\n#define OSTIMER_EVTIMERL_EVTIMER_COUNT_VALUE(x)  (((uint32_t)(((uint32_t)(x)) << OSTIMER_EVTIMERL_EVTIMER_COUNT_VALUE_SHIFT)) & OSTIMER_EVTIMERL_EVTIMER_COUNT_VALUE_MASK)\r\n/*! @} */\r\n\r\n/*! @name EVTIMERH - EVTIMER High Register */\r\n/*! @{ */\r\n\r\n#define OSTIMER_EVTIMERH_EVTIMER_COUNT_VALUE_MASK (0xFFFFFFFFU)\r\n#define OSTIMER_EVTIMERH_EVTIMER_COUNT_VALUE_SHIFT (0U)\r\n/*! EVTIMER_COUNT_VALUE - EVTimer Count value */\r\n#define OSTIMER_EVTIMERH_EVTIMER_COUNT_VALUE(x)  (((uint32_t)(((uint32_t)(x)) << OSTIMER_EVTIMERH_EVTIMER_COUNT_VALUE_SHIFT)) & OSTIMER_EVTIMERH_EVTIMER_COUNT_VALUE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CAPTURE_L - Local Capture Low Register for CPU */\r\n/*! @{ */\r\n\r\n#define OSTIMER_CAPTURE_L_CAPTURE_VALUE_MASK     (0xFFFFFFFFU)\r\n#define OSTIMER_CAPTURE_L_CAPTURE_VALUE_SHIFT    (0U)\r\n/*! CAPTURE_VALUE - EVTimer Capture value */\r\n#define OSTIMER_CAPTURE_L_CAPTURE_VALUE(x)       (((uint32_t)(((uint32_t)(x)) << OSTIMER_CAPTURE_L_CAPTURE_VALUE_SHIFT)) & OSTIMER_CAPTURE_L_CAPTURE_VALUE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CAPTURE_H - Local Capture High Register for CPU */\r\n/*! @{ */\r\n\r\n#define OSTIMER_CAPTURE_H_CAPTURE_VALUE_MASK     (0xFFFFFFFFU)\r\n#define OSTIMER_CAPTURE_H_CAPTURE_VALUE_SHIFT    (0U)\r\n/*! CAPTURE_VALUE - EVTimer Capture value */\r\n#define OSTIMER_CAPTURE_H_CAPTURE_VALUE(x)       (((uint32_t)(((uint32_t)(x)) << OSTIMER_CAPTURE_H_CAPTURE_VALUE_SHIFT)) & OSTIMER_CAPTURE_H_CAPTURE_VALUE_MASK)\r\n/*! @} */\r\n\r\n/*! @name MATCH_L - Local Match Low Register for CPU */\r\n/*! @{ */\r\n\r\n#define OSTIMER_MATCH_L_MATCH_VALUE_MASK         (0xFFFFFFFFU)\r\n#define OSTIMER_MATCH_L_MATCH_VALUE_SHIFT        (0U)\r\n/*! MATCH_VALUE - EVTimer Match value */\r\n#define OSTIMER_MATCH_L_MATCH_VALUE(x)           (((uint32_t)(((uint32_t)(x)) << OSTIMER_MATCH_L_MATCH_VALUE_SHIFT)) & OSTIMER_MATCH_L_MATCH_VALUE_MASK)\r\n/*! @} */\r\n\r\n/*! @name MATCH_H - Local Match High Register for CPU */\r\n/*! @{ */\r\n\r\n#define OSTIMER_MATCH_H_MATCH_VALUE_MASK         (0xFFFFFFFFU)\r\n#define OSTIMER_MATCH_H_MATCH_VALUE_SHIFT        (0U)\r\n/*! MATCH_VALUE - EVTimer Match value */\r\n#define OSTIMER_MATCH_H_MATCH_VALUE(x)           (((uint32_t)(((uint32_t)(x)) << OSTIMER_MATCH_H_MATCH_VALUE_SHIFT)) & OSTIMER_MATCH_H_MATCH_VALUE_MASK)\r\n/*! @} */\r\n\r\n/*! @name OSEVENT_CTRL - OS Event Timer Control Register for CPU */\r\n/*! @{ */\r\n\r\n#define OSTIMER_OSEVENT_CTRL_OSTIMER_INTRFLAG_MASK (0x1U)\r\n#define OSTIMER_OSEVENT_CTRL_OSTIMER_INTRFLAG_SHIFT (0U)\r\n/*! OSTIMER_INTRFLAG - Interrupt Flag */\r\n#define OSTIMER_OSEVENT_CTRL_OSTIMER_INTRFLAG(x) (((uint32_t)(((uint32_t)(x)) << OSTIMER_OSEVENT_CTRL_OSTIMER_INTRFLAG_SHIFT)) & OSTIMER_OSEVENT_CTRL_OSTIMER_INTRFLAG_MASK)\r\n\r\n#define OSTIMER_OSEVENT_CTRL_OSTIMER_INTENA_MASK (0x2U)\r\n#define OSTIMER_OSEVENT_CTRL_OSTIMER_INTENA_SHIFT (1U)\r\n/*! OSTIMER_INTENA - Interrupt/Wake-up Request\r\n *  0b0..Interrupt/wake-up requests due to the OSTIMER_INTR flag are blocked.\r\n *  0b1..An interrupt/wake-up request to the domain processor will be asserted when the OSTIMER_INTR flag is set.\r\n */\r\n#define OSTIMER_OSEVENT_CTRL_OSTIMER_INTENA(x)   (((uint32_t)(((uint32_t)(x)) << OSTIMER_OSEVENT_CTRL_OSTIMER_INTENA_SHIFT)) & OSTIMER_OSEVENT_CTRL_OSTIMER_INTENA_MASK)\r\n\r\n#define OSTIMER_OSEVENT_CTRL_MATCH_WR_RDY_MASK   (0x4U)\r\n#define OSTIMER_OSEVENT_CTRL_MATCH_WR_RDY_SHIFT  (2U)\r\n/*! MATCH_WR_RDY - EVTimer Match Write Ready */\r\n#define OSTIMER_OSEVENT_CTRL_MATCH_WR_RDY(x)     (((uint32_t)(((uint32_t)(x)) << OSTIMER_OSEVENT_CTRL_MATCH_WR_RDY_SHIFT)) & OSTIMER_OSEVENT_CTRL_MATCH_WR_RDY_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group OSTIMER_Register_Masks */\r\n\r\n\r\n/* OSTIMER - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral OSTIMER base address */\r\n  #define OSTIMER_BASE                             (0x5013B000u)\r\n  /** Peripheral OSTIMER base address */\r\n  #define OSTIMER_BASE_NS                          (0x4013B000u)\r\n  /** Peripheral OSTIMER base pointer */\r\n  #define OSTIMER                                  ((OSTIMER_Type *)OSTIMER_BASE)\r\n  /** Peripheral OSTIMER base pointer */\r\n  #define OSTIMER_NS                               ((OSTIMER_Type *)OSTIMER_BASE_NS)\r\n  /** Array initializer of OSTIMER peripheral base addresses */\r\n  #define OSTIMER_BASE_ADDRS                       { OSTIMER_BASE }\r\n  /** Array initializer of OSTIMER peripheral base pointers */\r\n  #define OSTIMER_BASE_PTRS                        { OSTIMER }\r\n  /** Array initializer of OSTIMER peripheral base addresses */\r\n  #define OSTIMER_BASE_ADDRS_NS                    { OSTIMER_BASE_NS }\r\n  /** Array initializer of OSTIMER peripheral base pointers */\r\n  #define OSTIMER_BASE_PTRS_NS                     { OSTIMER_NS }\r\n#else\r\n  /** Peripheral OSTIMER base address */\r\n  #define OSTIMER_BASE                             (0x4013B000u)\r\n  /** Peripheral OSTIMER base pointer */\r\n  #define OSTIMER                                  ((OSTIMER_Type *)OSTIMER_BASE)\r\n  /** Array initializer of OSTIMER peripheral base addresses */\r\n  #define OSTIMER_BASE_ADDRS                       { OSTIMER_BASE }\r\n  /** Array initializer of OSTIMER peripheral base pointers */\r\n  #define OSTIMER_BASE_PTRS                        { OSTIMER }\r\n#endif\r\n/** Interrupt vectors for the OSTIMER peripheral type */\r\n#define OSTIMER_IRQS                             { OS_EVENT_TIMER_IRQn }\r\n\r\n/*!\r\n * @}\r\n */ /* end of group OSTIMER_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- PINT Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup PINT_Peripheral_Access_Layer PINT Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** PINT - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t ISEL;                              /**< Pin Interrupt Mode, offset: 0x0 */\r\n  __IO uint32_t IENR;                              /**< Pin Interrupt Level or Rising Edge Interrupt Enable, offset: 0x4 */\r\n  __O  uint32_t SIENR;                             /**< Pin Interrupt Level or Rising Edge Interrupt Set, offset: 0x8 */\r\n  __IO uint32_t CIENR;                             /**< Pin Interrupt Level (Rising Edge Interrupt) Clear, offset: 0xC */\r\n  __IO uint32_t IENF;                              /**< Pin Interrupt Active Level or Falling Edge Interrupt Enable, offset: 0x10 */\r\n  __O  uint32_t SIENF;                             /**< Pin Interrupt Active Level or Falling Edge Interrupt Set, offset: 0x14 */\r\n  __O  uint32_t CIENF;                             /**< Pin Interrupt Active Level or Falling Edge Interrupt Clear, offset: 0x18 */\r\n  __IO uint32_t RISE;                              /**< Pin Interrupt Rising Edge, offset: 0x1C */\r\n  __IO uint32_t FALL;                              /**< Pin Interrupt Falling Edge, offset: 0x20 */\r\n  __IO uint32_t IST;                               /**< Pin Interrupt Status, offset: 0x24 */\r\n  __IO uint32_t PMCTRL;                            /**< Pattern Match Interrupt Control, offset: 0x28 */\r\n  __IO uint32_t PMSRC;                             /**< Pattern Match Interrupt Bit-Slice Source, offset: 0x2C */\r\n  __IO uint32_t PMCFG;                             /**< Pattern Match Interrupt Bit Slice Configuration, offset: 0x30 */\r\n} PINT_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- PINT Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup PINT_Register_Masks PINT Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name ISEL - Pin Interrupt Mode */\r\n/*! @{ */\r\n\r\n#define PINT_ISEL_PMODE_MASK                     (0xFFU)\r\n#define PINT_ISEL_PMODE_SHIFT                    (0U)\r\n/*! PMODE - Interrupt mode\r\n *  0b00000000..Edge-sensitive\r\n *  0b00000001..Level-sensitive\r\n */\r\n#define PINT_ISEL_PMODE(x)                       (((uint32_t)(((uint32_t)(x)) << PINT_ISEL_PMODE_SHIFT)) & PINT_ISEL_PMODE_MASK)\r\n/*! @} */\r\n\r\n/*! @name IENR - Pin Interrupt Level or Rising Edge Interrupt Enable */\r\n/*! @{ */\r\n\r\n#define PINT_IENR_ENRL_MASK                      (0xFFU)\r\n#define PINT_IENR_ENRL_SHIFT                     (0U)\r\n/*! ENRL - Enable Interrupt\r\n *  0b00000000..Disable rising edge or level interrupt\r\n *  0b00000001..Enable rising edge or level interrupt\r\n */\r\n#define PINT_IENR_ENRL(x)                        (((uint32_t)(((uint32_t)(x)) << PINT_IENR_ENRL_SHIFT)) & PINT_IENR_ENRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SIENR - Pin Interrupt Level or Rising Edge Interrupt Set */\r\n/*! @{ */\r\n\r\n#define PINT_SIENR_SETENRL_MASK                  (0xFFU)\r\n#define PINT_SIENR_SETENRL_SHIFT                 (0U)\r\n/*! SETENRL - Set bits in the IENR\r\n *  0b00000000..No operation\r\n *  0b00000001..Enable rising edge or level interrupt\r\n */\r\n#define PINT_SIENR_SETENRL(x)                    (((uint32_t)(((uint32_t)(x)) << PINT_SIENR_SETENRL_SHIFT)) & PINT_SIENR_SETENRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIENR - Pin Interrupt Level (Rising Edge Interrupt) Clear */\r\n/*! @{ */\r\n\r\n#define PINT_CIENR_CENRL_MASK                    (0xFFU)\r\n#define PINT_CIENR_CENRL_SHIFT                   (0U)\r\n/*! CENRL - Clear bits in the IENR\r\n *  0b00000000..No operation\r\n *  0b00000001..Disable rising edge or level interrupt\r\n */\r\n#define PINT_CIENR_CENRL(x)                      (((uint32_t)(((uint32_t)(x)) << PINT_CIENR_CENRL_SHIFT)) & PINT_CIENR_CENRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name IENF - Pin Interrupt Active Level or Falling Edge Interrupt Enable */\r\n/*! @{ */\r\n\r\n#define PINT_IENF_ENAF_MASK                      (0xFFU)\r\n#define PINT_IENF_ENAF_SHIFT                     (0U)\r\n/*! ENAF - Enable Interrupt\r\n *  0b00000000..Disable falling edge interrupt or set active interrupt level LOW\r\n *  0b00000001..Enable falling edge interrupt enabled or set active interrupt level HIGH\r\n */\r\n#define PINT_IENF_ENAF(x)                        (((uint32_t)(((uint32_t)(x)) << PINT_IENF_ENAF_SHIFT)) & PINT_IENF_ENAF_MASK)\r\n/*! @} */\r\n\r\n/*! @name SIENF - Pin Interrupt Active Level or Falling Edge Interrupt Set */\r\n/*! @{ */\r\n\r\n#define PINT_SIENF_SETENAF_MASK                  (0xFFU)\r\n#define PINT_SIENF_SETENAF_SHIFT                 (0U)\r\n/*! SETENAF - Set bits in the IENF\r\n *  0b00000000..No operation\r\n *  0b00000001..Select HIGH-active interrupt or enable falling edge interrupt\r\n */\r\n#define PINT_SIENF_SETENAF(x)                    (((uint32_t)(((uint32_t)(x)) << PINT_SIENF_SETENAF_SHIFT)) & PINT_SIENF_SETENAF_MASK)\r\n/*! @} */\r\n\r\n/*! @name CIENF - Pin Interrupt Active Level or Falling Edge Interrupt Clear */\r\n/*! @{ */\r\n\r\n#define PINT_CIENF_CENAF_MASK                    (0xFFU)\r\n#define PINT_CIENF_CENAF_SHIFT                   (0U)\r\n/*! CENAF - Clear bits in the IENF\r\n *  0b00000000..No operation\r\n *  0b00000001..LOW-active interrupt selected or falling edge interrupt disabled\r\n */\r\n#define PINT_CIENF_CENAF(x)                      (((uint32_t)(((uint32_t)(x)) << PINT_CIENF_CENAF_SHIFT)) & PINT_CIENF_CENAF_MASK)\r\n/*! @} */\r\n\r\n/*! @name RISE - Pin Interrupt Rising Edge */\r\n/*! @{ */\r\n\r\n#define PINT_RISE_RDET_MASK                      (0xFFU)\r\n#define PINT_RISE_RDET_SHIFT                     (0U)\r\n/*! RDET - Rising edge detect\r\n *  0b00000000..Read 0- No rising edge has been detected on this pin since Reset or the last time a one was written to this bit, Write 0- no operation\r\n *  0b00000001..Read 1- a rising edge has been detected since Reset or the last time a one was written to this\r\n *              bit, Write 1- clear rising edge detection for this pin\r\n */\r\n#define PINT_RISE_RDET(x)                        (((uint32_t)(((uint32_t)(x)) << PINT_RISE_RDET_SHIFT)) & PINT_RISE_RDET_MASK)\r\n/*! @} */\r\n\r\n/*! @name FALL - Pin Interrupt Falling Edge */\r\n/*! @{ */\r\n\r\n#define PINT_FALL_FDET_MASK                      (0xFFU)\r\n#define PINT_FALL_FDET_SHIFT                     (0U)\r\n/*! FDET - Falling edge detect\r\n *  0b00000000..Read 0- No falling edge has been detected on this pin since Reset or the last time a one was written to this bit, Write 0- no operation\r\n *  0b00000001..Read 1- a falling edge has been detected since Reset or the last time a one was written to this\r\n *              bit, Write 1- clear falling edge detection for this bit\r\n */\r\n#define PINT_FALL_FDET(x)                        (((uint32_t)(((uint32_t)(x)) << PINT_FALL_FDET_SHIFT)) & PINT_FALL_FDET_MASK)\r\n/*! @} */\r\n\r\n/*! @name IST - Pin Interrupt Status */\r\n/*! @{ */\r\n\r\n#define PINT_IST_PSTAT_MASK                      (0xFFU)\r\n#define PINT_IST_PSTAT_SHIFT                     (0U)\r\n/*! PSTAT - Pin interrupt status\r\n *  0b00000000..Read 0- interrupt is not being requested for this pin, Write 0- no operation.\r\n *  0b00000001..Read 1- interrupt is being requested for this pin, Write 1 (edge-sensitive)- clear rising- and\r\n *              falling-edge detection for this pin, Write 1 (level-sensitive)- switch the active level for this pin\r\n *              (in the IENF register).\r\n */\r\n#define PINT_IST_PSTAT(x)                        (((uint32_t)(((uint32_t)(x)) << PINT_IST_PSTAT_SHIFT)) & PINT_IST_PSTAT_MASK)\r\n/*! @} */\r\n\r\n/*! @name PMCTRL - Pattern Match Interrupt Control */\r\n/*! @{ */\r\n\r\n#define PINT_PMCTRL_SEL_PMATCH_MASK              (0x1U)\r\n#define PINT_PMCTRL_SEL_PMATCH_SHIFT             (0U)\r\n/*! SEL_PMATCH - Specifies whether the pin interrupts are controlled by the pin interrupt function or by the pattern match function.\r\n *  0b0..Pin interrupt- interrupts are driven in response to the standard pin interrupt function.\r\n *  0b1..Pattern match- interrupts are driven in response to pattern matches.\r\n */\r\n#define PINT_PMCTRL_SEL_PMATCH(x)                (((uint32_t)(((uint32_t)(x)) << PINT_PMCTRL_SEL_PMATCH_SHIFT)) & PINT_PMCTRL_SEL_PMATCH_MASK)\r\n\r\n#define PINT_PMCTRL_ENA_RXEV_MASK                (0x2U)\r\n#define PINT_PMCTRL_ENA_RXEV_SHIFT               (1U)\r\n/*! ENA_RXEV - Enables the RXEV output to the CPU and/or to a GPIO output, when the specified boolean expression evaluates to true.\r\n *  0b0..Disabled- RXEV output to the CPU is disabled.\r\n *  0b1..Enabled- RXEV output to the CPU is enabled.\r\n */\r\n#define PINT_PMCTRL_ENA_RXEV(x)                  (((uint32_t)(((uint32_t)(x)) << PINT_PMCTRL_ENA_RXEV_SHIFT)) & PINT_PMCTRL_ENA_RXEV_MASK)\r\n\r\n#define PINT_PMCTRL_PMAT_MASK                    (0xFF000000U)\r\n#define PINT_PMCTRL_PMAT_SHIFT                   (24U)\r\n/*! PMAT - Pattern Matches\r\n *  0b00000001..The corresponding product term is matched by the current state of the appropriate inputs.\r\n */\r\n#define PINT_PMCTRL_PMAT(x)                      (((uint32_t)(((uint32_t)(x)) << PINT_PMCTRL_PMAT_SHIFT)) & PINT_PMCTRL_PMAT_MASK)\r\n/*! @} */\r\n\r\n/*! @name PMSRC - Pattern Match Interrupt Bit-Slice Source */\r\n/*! @{ */\r\n\r\n#define PINT_PMSRC_SRC0_MASK                     (0x700U)\r\n#define PINT_PMSRC_SRC0_SHIFT                    (8U)\r\n/*! SRC0 - Selects the input source for bit slice 0\r\n *  0b000..Input 0. Selects the pin selected in the PINT_SEL0 register as the source to bit slice n.\r\n *  0b001..Input 1. Selects the pin selected in the PINT_SEL1 register as the source to bit slice n.\r\n *  0b010..Input 2. Selects the pin selected in the PINT_SEL2 register as the source to bit slice n.\r\n *  0b011..Input 3. Selects the pin selected in the PINT_SEL3 register as the source to bit slice n.\r\n *  0b100..Input 4. Selects the pin selected in the PINT_SEL4 register as the source to bit slice n.\r\n *  0b101..Input 5. Selects the pin selected in the PINT_SEL5 register as the source to bit slice n.\r\n *  0b110..Input 6. Selects the pin selected in the PINT_SEL6 register as the source to bit slice n.\r\n *  0b111..Input 7. Selects the pin selected in the PINT_SEL7 register as the source to bit slice n.\r\n */\r\n#define PINT_PMSRC_SRC0(x)                       (((uint32_t)(((uint32_t)(x)) << PINT_PMSRC_SRC0_SHIFT)) & PINT_PMSRC_SRC0_MASK)\r\n\r\n#define PINT_PMSRC_SRC1_MASK                     (0x3800U)\r\n#define PINT_PMSRC_SRC1_SHIFT                    (11U)\r\n/*! SRC1 - Selects the input source for bit slice 1\r\n *  0b000..Input 0. Selects the pin selected in the PINT_SEL0 register as the source to bit slice n.\r\n *  0b001..Input 1. Selects the pin selected in the PINT_SEL1 register as the source to bit slice n.\r\n *  0b010..Input 2. Selects the pin selected in the PINT_SEL2 register as the source to bit slice n.\r\n *  0b011..Input 3. Selects the pin selected in the PINT_SEL3 register as the source to bit slice n.\r\n *  0b100..Input 4. Selects the pin selected in the PINT_SEL4 register as the source to bit slice n.\r\n *  0b101..Input 5. Selects the pin selected in the PINT_SEL5 register as the source to bit slice n.\r\n *  0b110..Input 6. Selects the pin selected in the PINT_SEL6 register as the source to bit slice n.\r\n *  0b111..Input 7. Selects the pin selected in the PINT_SEL7 register as the source to bit slice n.\r\n */\r\n#define PINT_PMSRC_SRC1(x)                       (((uint32_t)(((uint32_t)(x)) << PINT_PMSRC_SRC1_SHIFT)) & PINT_PMSRC_SRC1_MASK)\r\n\r\n#define PINT_PMSRC_SRC2_MASK                     (0x1C000U)\r\n#define PINT_PMSRC_SRC2_SHIFT                    (14U)\r\n/*! SRC2 - Selects the input source for bit slice 2\r\n *  0b000..Input 0. Selects the pin selected in the PINT_SEL0 register as the source to bit slice n.\r\n *  0b001..Input 1. Selects the pin selected in the PINT_SEL1 register as the source to bit slice n.\r\n *  0b010..Input 2. Selects the pin selected in the PINT_SEL2 register as the source to bit slice n.\r\n *  0b011..Input 3. Selects the pin selected in the PINT_SEL3 register as the source to bit slice n.\r\n *  0b100..Input 4. Selects the pin selected in the PINT_SEL4 register as the source to bit slice n.\r\n *  0b101..Input 5. Selects the pin selected in the PINT_SEL5 register as the source to bit slice n.\r\n *  0b110..Input 6. Selects the pin selected in the PINT_SEL6 register as the source to bit slice n.\r\n *  0b111..Input 7. Selects the pin selected in the PINT_SEL7 register as the source to bit slice n.\r\n */\r\n#define PINT_PMSRC_SRC2(x)                       (((uint32_t)(((uint32_t)(x)) << PINT_PMSRC_SRC2_SHIFT)) & PINT_PMSRC_SRC2_MASK)\r\n\r\n#define PINT_PMSRC_SRC3_MASK                     (0xE0000U)\r\n#define PINT_PMSRC_SRC3_SHIFT                    (17U)\r\n/*! SRC3 - Selects the input source for bit slice 3\r\n *  0b000..Input 0. Selects the pin selected in the PINT_SEL0 register as the source to bit slice n.\r\n *  0b001..Input 1. Selects the pin selected in the PINT_SEL1 register as the source to bit slice n.\r\n *  0b010..Input 2. Selects the pin selected in the PINT_SEL2 register as the source to bit slice n.\r\n *  0b011..Input 3. Selects the pin selected in the PINT_SEL3 register as the source to bit slice n.\r\n *  0b100..Input 4. Selects the pin selected in the PINT_SEL4 register as the source to bit slice n.\r\n *  0b101..Input 5. Selects the pin selected in the PINT_SEL5 register as the source to bit slice n.\r\n *  0b110..Input 6. Selects the pin selected in the PINT_SEL6 register as the source to bit slice n.\r\n *  0b111..Input 7. Selects the pin selected in the PINT_SEL7 register as the source to bit slice n.\r\n */\r\n#define PINT_PMSRC_SRC3(x)                       (((uint32_t)(((uint32_t)(x)) << PINT_PMSRC_SRC3_SHIFT)) & PINT_PMSRC_SRC3_MASK)\r\n\r\n#define PINT_PMSRC_SRC4_MASK                     (0x700000U)\r\n#define PINT_PMSRC_SRC4_SHIFT                    (20U)\r\n/*! SRC4 - Selects the input source for bit slice 4\r\n *  0b000..Input 0. Selects the pin selected in the PINT_SEL0 register as the source to bit slice n.\r\n *  0b001..Input 1. Selects the pin selected in the PINT_SEL1 register as the source to bit slice n.\r\n *  0b010..Input 2. Selects the pin selected in the PINT_SEL2 register as the source to bit slice n.\r\n *  0b011..Input 3. Selects the pin selected in the PINT_SEL3 register as the source to bit slice n.\r\n *  0b100..Input 4. Selects the pin selected in the PINT_SEL4 register as the source to bit slice n.\r\n *  0b101..Input 5. Selects the pin selected in the PINT_SEL5 register as the source to bit slice n.\r\n *  0b110..Input 6. Selects the pin selected in the PINT_SEL6 register as the source to bit slice n.\r\n *  0b111..Input 7. Selects the pin selected in the PINT_SEL7 register as the source to bit slice n.\r\n */\r\n#define PINT_PMSRC_SRC4(x)                       (((uint32_t)(((uint32_t)(x)) << PINT_PMSRC_SRC4_SHIFT)) & PINT_PMSRC_SRC4_MASK)\r\n\r\n#define PINT_PMSRC_SRC5_MASK                     (0x3800000U)\r\n#define PINT_PMSRC_SRC5_SHIFT                    (23U)\r\n/*! SRC5 - Selects the input source for bit slice 5\r\n *  0b000..Input 0. Selects the pin selected in the PINT_SEL0 register as the source to bit slice n.\r\n *  0b001..Input 1. Selects the pin selected in the PINT_SEL1 register as the source to bit slice n.\r\n *  0b010..Input 2. Selects the pin selected in the PINT_SEL2 register as the source to bit slice n.\r\n *  0b011..Input 3. Selects the pin selected in the PINT_SEL3 register as the source to bit slice n.\r\n *  0b100..Input 4. Selects the pin selected in the PINT_SEL4 register as the source to bit slice n.\r\n *  0b101..Input 5. Selects the pin selected in the PINT_SEL5 register as the source to bit slice n.\r\n *  0b110..Input 6. Selects the pin selected in the PINT_SEL6 register as the source to bit slice n.\r\n *  0b111..Input 7. Selects the pin selected in the PINT_SEL7 register as the source to bit slice n.\r\n */\r\n#define PINT_PMSRC_SRC5(x)                       (((uint32_t)(((uint32_t)(x)) << PINT_PMSRC_SRC5_SHIFT)) & PINT_PMSRC_SRC5_MASK)\r\n\r\n#define PINT_PMSRC_SRC6_MASK                     (0x1C000000U)\r\n#define PINT_PMSRC_SRC6_SHIFT                    (26U)\r\n/*! SRC6 - Selects the input source for bit slice 6\r\n *  0b000..Input 0. Selects the pin selected in the PINT_SEL0 register as the source to bit slice n.\r\n *  0b001..Input 1. Selects the pin selected in the PINT_SEL1 register as the source to bit slice n.\r\n *  0b010..Input 2. Selects the pin selected in the PINT_SEL2 register as the source to bit slice n.\r\n *  0b011..Input 3. Selects the pin selected in the PINT_SEL3 register as the source to bit slice n.\r\n *  0b100..Input 4. Selects the pin selected in the PINT_SEL4 register as the source to bit slice n.\r\n *  0b101..Input 5. Selects the pin selected in the PINT_SEL5 register as the source to bit slice n.\r\n *  0b110..Input 6. Selects the pin selected in the PINT_SEL6 register as the source to bit slice n.\r\n *  0b111..Input 7. Selects the pin selected in the PINT_SEL7 register as the source to bit slice n.\r\n */\r\n#define PINT_PMSRC_SRC6(x)                       (((uint32_t)(((uint32_t)(x)) << PINT_PMSRC_SRC6_SHIFT)) & PINT_PMSRC_SRC6_MASK)\r\n\r\n#define PINT_PMSRC_SRC7_MASK                     (0xE0000000U)\r\n#define PINT_PMSRC_SRC7_SHIFT                    (29U)\r\n/*! SRC7 - Selects the input source for bit slice 7\r\n *  0b000..Input 0. Selects the pin selected in the PINT_SEL0 register as the source to bit slice n.\r\n *  0b001..Input 1. Selects the pin selected in the PINT_SEL1 register as the source to bit slice n.\r\n *  0b010..Input 2. Selects the pin selected in the PINT_SEL2 register as the source to bit slice n.\r\n *  0b011..Input 3. Selects the pin selected in the PINT_SEL3 register as the source to bit slice n.\r\n *  0b100..Input 4. Selects the pin selected in the PINT_SEL4 register as the source to bit slice n.\r\n *  0b101..Input 5. Selects the pin selected in the PINT_SEL5 register as the source to bit slice n.\r\n *  0b110..Input 6. Selects the pin selected in the PINT_SEL6 register as the source to bit slice n.\r\n *  0b111..Input 7. Selects the pin selected in the PINT_SEL7 register as the source to bit slice n.\r\n */\r\n#define PINT_PMSRC_SRC7(x)                       (((uint32_t)(((uint32_t)(x)) << PINT_PMSRC_SRC7_SHIFT)) & PINT_PMSRC_SRC7_MASK)\r\n/*! @} */\r\n\r\n/*! @name PMCFG - Pattern Match Interrupt Bit Slice Configuration */\r\n/*! @{ */\r\n\r\n#define PINT_PMCFG_PROD_ENDPTS0_MASK             (0x1U)\r\n#define PINT_PMCFG_PROD_ENDPTS0_SHIFT            (0U)\r\n/*! PROD_ENDPTS0 - Determines whether slice 0 is an endpoint.\r\n *  0b0..No effect. Slice 0 is not an endpoint.\r\n *  0b1..Endpoint. Slice 0 is the endpoint of a product term (minterm). Pin interrupt 0 in the NVIC is raised if the minterm evaluates as true.\r\n */\r\n#define PINT_PMCFG_PROD_ENDPTS0(x)               (((uint32_t)(((uint32_t)(x)) << PINT_PMCFG_PROD_ENDPTS0_SHIFT)) & PINT_PMCFG_PROD_ENDPTS0_MASK)\r\n\r\n#define PINT_PMCFG_PROD_ENDPTS1_MASK             (0x2U)\r\n#define PINT_PMCFG_PROD_ENDPTS1_SHIFT            (1U)\r\n/*! PROD_ENDPTS1 - Determines whether slice 1 is an endpoint.\r\n *  0b0..No effect. Slice 1 is not an endpoint.\r\n *  0b1..Endpoint. Slice 1 is the endpoint of a product term (minterm). Pin interrupt 1 in the NVIC is raised if the minterm evaluates as true.\r\n */\r\n#define PINT_PMCFG_PROD_ENDPTS1(x)               (((uint32_t)(((uint32_t)(x)) << PINT_PMCFG_PROD_ENDPTS1_SHIFT)) & PINT_PMCFG_PROD_ENDPTS1_MASK)\r\n\r\n#define PINT_PMCFG_PROD_ENDPTS2_MASK             (0x4U)\r\n#define PINT_PMCFG_PROD_ENDPTS2_SHIFT            (2U)\r\n/*! PROD_ENDPTS2 - Determines whether slice 2 is an endpoint.\r\n *  0b0..No effect. Slice 2 is not an endpoint.\r\n *  0b1..Endpoint. Slice 2 is the endpoint of a product term (minterm). Pin interrupt 2 in the NVIC is raised if the minterm evaluates as true.\r\n */\r\n#define PINT_PMCFG_PROD_ENDPTS2(x)               (((uint32_t)(((uint32_t)(x)) << PINT_PMCFG_PROD_ENDPTS2_SHIFT)) & PINT_PMCFG_PROD_ENDPTS2_MASK)\r\n\r\n#define PINT_PMCFG_PROD_ENDPTS3_MASK             (0x8U)\r\n#define PINT_PMCFG_PROD_ENDPTS3_SHIFT            (3U)\r\n/*! PROD_ENDPTS3 - Determines whether slice 3 is an endpoint.\r\n *  0b0..No effect. Slice 3 is not an endpoint.\r\n *  0b1..Endpoint. Slice 3 is the endpoint of a product term (minterm). Pin interrupt 3 in the NVIC is raised if the minterm evaluates as true.\r\n */\r\n#define PINT_PMCFG_PROD_ENDPTS3(x)               (((uint32_t)(((uint32_t)(x)) << PINT_PMCFG_PROD_ENDPTS3_SHIFT)) & PINT_PMCFG_PROD_ENDPTS3_MASK)\r\n\r\n#define PINT_PMCFG_PROD_ENDPTS4_MASK             (0x10U)\r\n#define PINT_PMCFG_PROD_ENDPTS4_SHIFT            (4U)\r\n/*! PROD_ENDPTS4 - Determines whether slice 4 is an endpoint.\r\n *  0b0..No effect. Slice 4 is not an endpoint.\r\n *  0b1..Endpoint. Slice 4 is the endpoint of a product term (minterm). Pin interrupt 4 in the NVIC is raised if the minterm evaluates as true.\r\n */\r\n#define PINT_PMCFG_PROD_ENDPTS4(x)               (((uint32_t)(((uint32_t)(x)) << PINT_PMCFG_PROD_ENDPTS4_SHIFT)) & PINT_PMCFG_PROD_ENDPTS4_MASK)\r\n\r\n#define PINT_PMCFG_PROD_ENDPTS5_MASK             (0x20U)\r\n#define PINT_PMCFG_PROD_ENDPTS5_SHIFT            (5U)\r\n/*! PROD_ENDPTS5 - Determines whether slice 5 is an endpoint.\r\n *  0b0..No effect. Slice 5 is not an endpoint.\r\n *  0b1..Endpoint. Slice 5 is the endpoint of a product term (minterm). Pin interrupt 5 in the NVIC is raised if the minterm evaluates as true.\r\n */\r\n#define PINT_PMCFG_PROD_ENDPTS5(x)               (((uint32_t)(((uint32_t)(x)) << PINT_PMCFG_PROD_ENDPTS5_SHIFT)) & PINT_PMCFG_PROD_ENDPTS5_MASK)\r\n\r\n#define PINT_PMCFG_PROD_ENDPTS6_MASK             (0x40U)\r\n#define PINT_PMCFG_PROD_ENDPTS6_SHIFT            (6U)\r\n/*! PROD_ENDPTS6 - Determines whether slice 6 is an endpoint.\r\n *  0b0..No effect. Slice 6 is not an endpoint.\r\n *  0b1..Endpoint. Slice 6 is the endpoint of a product term (minterm). Pin interrupt 6 in the NVIC is raised if the minterm evaluates as true.\r\n */\r\n#define PINT_PMCFG_PROD_ENDPTS6(x)               (((uint32_t)(((uint32_t)(x)) << PINT_PMCFG_PROD_ENDPTS6_SHIFT)) & PINT_PMCFG_PROD_ENDPTS6_MASK)\r\n\r\n#define PINT_PMCFG_CFG0_MASK                     (0x700U)\r\n#define PINT_PMCFG_CFG0_SHIFT                    (8U)\r\n/*! CFG0 - Specifies the match contribution condition for bit slice 0.\r\n *  0b000..Constant HIGH\r\n *  0b001..Sticky rising edge. Match occurs if a rising edge on the specified input has occurred since the last\r\n *         time the edge detection for this bit slice was cleared. This match condition is only cleared when the\r\n *         PMCFG or the PMSRC registers are written to.\r\n *  0b010..Sticky falling edge. Match occurs if a falling edge on the specified input has occurred since the last\r\n *         time the edge detection for this bit slice was cleared. This match condition is only cleared when the\r\n *         PMCFG or the PMSRC registers are written to.\r\n *  0b011..Sticky rising or falling edge. Match occurs if either a rising or falling edge on the specified input\r\n *         has occurred since the last time the edge detection for this bit slice was cleared. This match condition\r\n *         is only cleared when the PMCFG or the PMSRC registers are written to.\r\n *  0b100..High level. Match (for this bit slice) occurs when there is a high level on the input specified for this bit slice in the PMSRC register.\r\n *  0b101..Low level. Match occurs when there is a low level on the specified input.\r\n *  0b110..Constant 0. This bit slice never contributes to a match (should be used to disable any unused bit slices).\r\n *  0b111..Event. Non-sticky rising or falling edge. Match occurs on an event when either a rising or falling edge\r\n *         is first detected on the specified input (this is a non-sticky version of value 0x3). This bit is\r\n *         cleared after 1 clock cycle.\r\n */\r\n#define PINT_PMCFG_CFG0(x)                       (((uint32_t)(((uint32_t)(x)) << PINT_PMCFG_CFG0_SHIFT)) & PINT_PMCFG_CFG0_MASK)\r\n\r\n#define PINT_PMCFG_CFG1_MASK                     (0x3800U)\r\n#define PINT_PMCFG_CFG1_SHIFT                    (11U)\r\n/*! CFG1 - Specifies the match contribution condition for bit slice 1.\r\n *  0b000..Constant HIGH\r\n *  0b001..Sticky rising edge. Match occurs if a rising edge on the specified input has occurred since the last\r\n *         time the edge detection for this bit slice was cleared. This match condition is only cleared when the\r\n *         PMCFG or the PMSRC registers are written to.\r\n *  0b010..Sticky falling edge. Match occurs if a falling edge on the specified input has occurred since the last\r\n *         time the edge detection for this bit slice was cleared. This match condition is only cleared when the\r\n *         PMCFG or the PMSRC registers are written to.\r\n *  0b011..Sticky rising or falling edge. Match occurs if either a rising or falling edge on the specified input\r\n *         has occurred since the last time the edge detection for this bit slice was cleared. This match condition\r\n *         is only cleared when the PMCFG or the PMSRC registers are written to.\r\n *  0b100..High level. Match (for this bit slice) occurs when there is a high level on the input specified for this bit slice in the PMSRC register.\r\n *  0b101..Low level. Match occurs when there is a low level on the specified input.\r\n *  0b110..Constant 0. This bit slice never contributes to a match (should be used to disable any unused bit slices).\r\n *  0b111..Event. Non-sticky rising or falling edge. Match occurs on an event when either a rising or falling edge\r\n *         is first detected on the specified input (this is a non-sticky version of value 0x3). This bit is\r\n *         cleared after 1 clock cycle.\r\n */\r\n#define PINT_PMCFG_CFG1(x)                       (((uint32_t)(((uint32_t)(x)) << PINT_PMCFG_CFG1_SHIFT)) & PINT_PMCFG_CFG1_MASK)\r\n\r\n#define PINT_PMCFG_CFG2_MASK                     (0x1C000U)\r\n#define PINT_PMCFG_CFG2_SHIFT                    (14U)\r\n/*! CFG2 - Specifies the match contribution condition for bit slice 2.\r\n *  0b000..Constant HIGH\r\n *  0b001..Sticky rising edge. Match occurs if a rising edge on the specified input has occurred since the last\r\n *         time the edge detection for this bit slice was cleared. This match condition is only cleared when the\r\n *         PMCFG or the PMSRC registers are written to.\r\n *  0b010..Sticky falling edge. Match occurs if a falling edge on the specified input has occurred since the last\r\n *         time the edge detection for this bit slice was cleared. This match condition is only cleared when the\r\n *         PMCFG or the PMSRC registers are written to.\r\n *  0b011..Sticky rising or falling edge. Match occurs if either a rising or falling edge on the specified input\r\n *         has occurred since the last time the edge detection for this bit slice was cleared. This match condition\r\n *         is only cleared when the PMCFG or the PMSRC registers are written to.\r\n *  0b100..High level. Match (for this bit slice) occurs when there is a high level on the input specified for this bit slice in the PMSRC register.\r\n *  0b101..Low level. Match occurs when there is a low level on the specified input.\r\n *  0b110..Constant 0. This bit slice never contributes to a match (should be used to disable any unused bit slices).\r\n *  0b111..Event. Non-sticky rising or falling edge. Match occurs on an event when either a rising or falling edge\r\n *         is first detected on the specified input (this is a non-sticky version of value 0x3). This bit is\r\n *         cleared after 1 clock cycle.\r\n */\r\n#define PINT_PMCFG_CFG2(x)                       (((uint32_t)(((uint32_t)(x)) << PINT_PMCFG_CFG2_SHIFT)) & PINT_PMCFG_CFG2_MASK)\r\n\r\n#define PINT_PMCFG_CFG3_MASK                     (0xE0000U)\r\n#define PINT_PMCFG_CFG3_SHIFT                    (17U)\r\n/*! CFG3 - Specifies the match contribution condition for bit slice 3.\r\n *  0b000..Constant HIGH\r\n *  0b001..Sticky rising edge. Match occurs if a rising edge on the specified input has occurred since the last\r\n *         time the edge detection for this bit slice was cleared. This match condition is only cleared when the\r\n *         PMCFG or the PMSRC registers are written to.\r\n *  0b010..Sticky falling edge. Match occurs if a falling edge on the specified input has occurred since the last\r\n *         time the edge detection for this bit slice was cleared. This match condition is only cleared when the\r\n *         PMCFG or the PMSRC registers are written to.\r\n *  0b011..Sticky rising or falling edge. Match occurs if either a rising or falling edge on the specified input\r\n *         has occurred since the last time the edge detection for this bit slice was cleared. This match condition\r\n *         is only cleared when the PMCFG or the PMSRC registers are written to.\r\n *  0b100..High level. Match (for this bit slice) occurs when there is a high level on the input specified for this bit slice in the PMSRC register.\r\n *  0b101..Low level. Match occurs when there is a low level on the specified input.\r\n *  0b110..Constant 0. This bit slice never contributes to a match (should be used to disable any unused bit slices).\r\n *  0b111..Event. Non-sticky rising or falling edge. Match occurs on an event when either a rising or falling edge\r\n *         is first detected on the specified input (this is a non-sticky version of value 0x3). This bit is\r\n *         cleared after 1 clock cycle.\r\n */\r\n#define PINT_PMCFG_CFG3(x)                       (((uint32_t)(((uint32_t)(x)) << PINT_PMCFG_CFG3_SHIFT)) & PINT_PMCFG_CFG3_MASK)\r\n\r\n#define PINT_PMCFG_CFG4_MASK                     (0x700000U)\r\n#define PINT_PMCFG_CFG4_SHIFT                    (20U)\r\n/*! CFG4 - Specifies the match contribution condition for bit slice 4.\r\n *  0b000..Constant HIGH\r\n *  0b001..Sticky rising edge. Match occurs if a rising edge on the specified input has occurred since the last\r\n *         time the edge detection for this bit slice was cleared. This match condition is only cleared when the\r\n *         PMCFG or the PMSRC registers are written to.\r\n *  0b010..Sticky falling edge. Match occurs if a falling edge on the specified input has occurred since the last\r\n *         time the edge detection for this bit slice was cleared. This match condition is only cleared when the\r\n *         PMCFG or the PMSRC registers are written to.\r\n *  0b011..Sticky rising or falling edge. Match occurs if either a rising or falling edge on the specified input\r\n *         has occurred since the last time the edge detection for this bit slice was cleared. This match condition\r\n *         is only cleared when the PMCFG or the PMSRC registers are written to.\r\n *  0b100..High level. Match (for this bit slice) occurs when there is a high level on the input specified for this bit slice in the PMSRC register.\r\n *  0b101..Low level. Match occurs when there is a low level on the specified input.\r\n *  0b110..Constant 0. This bit slice never contributes to a match (should be used to disable any unused bit slices).\r\n *  0b111..Event. Non-sticky rising or falling edge. Match occurs on an event when either a rising or falling edge\r\n *         is first detected on the specified input (this is a non-sticky version of value 0x3). This bit is\r\n *         cleared after 1 clock cycle.\r\n */\r\n#define PINT_PMCFG_CFG4(x)                       (((uint32_t)(((uint32_t)(x)) << PINT_PMCFG_CFG4_SHIFT)) & PINT_PMCFG_CFG4_MASK)\r\n\r\n#define PINT_PMCFG_CFG5_MASK                     (0x3800000U)\r\n#define PINT_PMCFG_CFG5_SHIFT                    (23U)\r\n/*! CFG5 - Specifies the match contribution condition for bit slice 5.\r\n *  0b000..Constant HIGH\r\n *  0b001..Sticky rising edge. Match occurs if a rising edge on the specified input has occurred since the last\r\n *         time the edge detection for this bit slice was cleared. This match condition is only cleared when the\r\n *         PMCFG or the PMSRC registers are written to.\r\n *  0b010..Sticky falling edge. Match occurs if a falling edge on the specified input has occurred since the last\r\n *         time the edge detection for this bit slice was cleared. This match condition is only cleared when the\r\n *         PMCFG or the PMSRC registers are written to.\r\n *  0b011..Sticky rising or falling edge. Match occurs if either a rising or falling edge on the specified input\r\n *         has occurred since the last time the edge detection for this bit slice was cleared. This match condition\r\n *         is only cleared when the PMCFG or the PMSRC registers are written to.\r\n *  0b100..High level. Match (for this bit slice) occurs when there is a high level on the input specified for this bit slice in the PMSRC register.\r\n *  0b101..Low level. Match occurs when there is a low level on the specified input.\r\n *  0b110..Constant 0. This bit slice never contributes to a match (should be used to disable any unused bit slices).\r\n *  0b111..Event. Non-sticky rising or falling edge. Match occurs on an event when either a rising or falling edge\r\n *         is first detected on the specified input (this is a non-sticky version of value 0x3). This bit is\r\n *         cleared after 1 clock cycle.\r\n */\r\n#define PINT_PMCFG_CFG5(x)                       (((uint32_t)(((uint32_t)(x)) << PINT_PMCFG_CFG5_SHIFT)) & PINT_PMCFG_CFG5_MASK)\r\n\r\n#define PINT_PMCFG_CFG6_MASK                     (0x1C000000U)\r\n#define PINT_PMCFG_CFG6_SHIFT                    (26U)\r\n/*! CFG6 - Specifies the match contribution condition for bit slice 6.\r\n *  0b000..Constant HIGH\r\n *  0b001..Sticky rising edge. Match occurs if a rising edge on the specified input has occurred since the last\r\n *         time the edge detection for this bit slice was cleared. This match condition is only cleared when the\r\n *         PMCFG or the PMSRC registers are written to.\r\n *  0b010..Sticky falling edge. Match occurs if a falling edge on the specified input has occurred since the last\r\n *         time the edge detection for this bit slice was cleared. This match condition is only cleared when the\r\n *         PMCFG or the PMSRC registers are written to.\r\n *  0b011..Sticky rising or falling edge. Match occurs if either a rising or falling edge on the specified input\r\n *         has occurred since the last time the edge detection for this bit slice was cleared. This match condition\r\n *         is only cleared when the PMCFG or the PMSRC registers are written to.\r\n *  0b100..High level. Match (for this bit slice) occurs when there is a high level on the input specified for this bit slice in the PMSRC register.\r\n *  0b101..Low level. Match occurs when there is a low level on the specified input.\r\n *  0b110..Constant 0. This bit slice never contributes to a match (should be used to disable any unused bit slices).\r\n *  0b111..Event. Non-sticky rising or falling edge. Match occurs on an event when either a rising or falling edge\r\n *         is first detected on the specified input (this is a non-sticky version of value 0x3). This bit is\r\n *         cleared after 1 clock cycle.\r\n */\r\n#define PINT_PMCFG_CFG6(x)                       (((uint32_t)(((uint32_t)(x)) << PINT_PMCFG_CFG6_SHIFT)) & PINT_PMCFG_CFG6_MASK)\r\n\r\n#define PINT_PMCFG_CFG7_MASK                     (0xE0000000U)\r\n#define PINT_PMCFG_CFG7_SHIFT                    (29U)\r\n/*! CFG7 - Specifies the match contribution condition for bit slice 7.\r\n *  0b000..Constant HIGH\r\n *  0b001..Sticky rising edge. Match occurs if a rising edge on the specified input has occurred since the last\r\n *         time the edge detection for this bit slice was cleared. This match condition is only cleared when the\r\n *         PMCFG or the PMSRC registers are written to.\r\n *  0b010..Sticky falling edge. Match occurs if a falling edge on the specified input has occurred since the last\r\n *         time the edge detection for this bit slice was cleared. This match condition is only cleared when the\r\n *         PMCFG or the PMSRC registers are written to.\r\n *  0b011..Sticky rising or falling edge. Match occurs if either a rising or falling edge on the specified input\r\n *         has occurred since the last time the edge detection for this bit slice was cleared. This match condition\r\n *         is only cleared when the PMCFG or the PMSRC registers are written to.\r\n *  0b100..High level. Match (for this bit slice) occurs when there is a high level on the input specified for this bit slice in the PMSRC register.\r\n *  0b101..Low level. Match occurs when there is a low level on the specified input.\r\n *  0b110..Constant 0. This bit slice never contributes to a match (should be used to disable any unused bit slices).\r\n *  0b111..Event. Non-sticky rising or falling edge. Match occurs on an event when either a rising or falling edge\r\n *         is first detected on the specified input (this is a non-sticky version of value 0x3). This bit is\r\n *         cleared after 1 clock cycle.\r\n */\r\n#define PINT_PMCFG_CFG7(x)                       (((uint32_t)(((uint32_t)(x)) << PINT_PMCFG_CFG7_SHIFT)) & PINT_PMCFG_CFG7_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group PINT_Register_Masks */\r\n\r\n\r\n/* PINT - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral PINT base address */\r\n  #define PINT_BASE                                (0x50025000u)\r\n  /** Peripheral PINT base address */\r\n  #define PINT_BASE_NS                             (0x40025000u)\r\n  /** Peripheral PINT base pointer */\r\n  #define PINT                                     ((PINT_Type *)PINT_BASE)\r\n  /** Peripheral PINT base pointer */\r\n  #define PINT_NS                                  ((PINT_Type *)PINT_BASE_NS)\r\n  /** Array initializer of PINT peripheral base addresses */\r\n  #define PINT_BASE_ADDRS                          { PINT_BASE }\r\n  /** Array initializer of PINT peripheral base pointers */\r\n  #define PINT_BASE_PTRS                           { PINT }\r\n  /** Array initializer of PINT peripheral base addresses */\r\n  #define PINT_BASE_ADDRS_NS                       { PINT_BASE_NS }\r\n  /** Array initializer of PINT peripheral base pointers */\r\n  #define PINT_BASE_PTRS_NS                        { PINT_NS }\r\n#else\r\n  /** Peripheral PINT base address */\r\n  #define PINT_BASE                                (0x40025000u)\r\n  /** Peripheral PINT base pointer */\r\n  #define PINT                                     ((PINT_Type *)PINT_BASE)\r\n  /** Array initializer of PINT peripheral base addresses */\r\n  #define PINT_BASE_ADDRS                          { PINT_BASE }\r\n  /** Array initializer of PINT peripheral base pointers */\r\n  #define PINT_BASE_PTRS                           { PINT }\r\n#endif\r\n/** Interrupt vectors for the PINT peripheral type */\r\n#define PINT_IRQS                                { PIN_INT0_IRQn, PIN_INT1_IRQn, PIN_INT2_IRQn, PIN_INT3_IRQn, PIN_INT4_IRQn, PIN_INT5_IRQn, PIN_INT6_IRQn, PIN_INT7_IRQn }\r\n\r\n/*!\r\n * @}\r\n */ /* end of group PINT_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- PKC Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup PKC_Peripheral_Access_Layer PKC Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** PKC - Register Layout Typedef */\r\ntypedef struct {\r\n  __I  uint32_t PKC_STATUS;                        /**< Status register, offset: 0x0 */\r\n  __IO uint32_t PKC_CTRL;                          /**< Control register, offset: 0x4 */\r\n  __IO uint32_t PKC_CFG;                           /**< Configuration register, offset: 0x8 */\r\n       uint8_t RESERVED_0[4];\r\n  __IO uint32_t PKC_MODE1;                         /**< Mode register, parameter set 1, offset: 0x10 */\r\n  __IO uint32_t PKC_XYPTR1;                        /**< X+Y pointer register, parameter set 1, offset: 0x14 */\r\n  __IO uint32_t PKC_ZRPTR1;                        /**< Z+R pointer register, parameter set 1, offset: 0x18 */\r\n  __IO uint32_t PKC_LEN1;                          /**< Length register, parameter set 1, offset: 0x1C */\r\n  __IO uint32_t PKC_MODE2;                         /**< Mode register, parameter set 2, offset: 0x20 */\r\n  __IO uint32_t PKC_XYPTR2;                        /**< X+Y pointer register, parameter set 2, offset: 0x24 */\r\n  __IO uint32_t PKC_ZRPTR2;                        /**< Z+R pointer register, parameter set 2, offset: 0x28 */\r\n  __IO uint32_t PKC_LEN2;                          /**< Length register, parameter set 2, offset: 0x2C */\r\n       uint8_t RESERVED_1[16];\r\n  __IO uint32_t PKC_UPTR;                          /**< Universal pointer FUP program, offset: 0x40 */\r\n  __IO uint32_t PKC_UPTRT;                         /**< Universal pointer FUP table, offset: 0x44 */\r\n  __IO uint32_t PKC_ULEN;                          /**< Universal pointer length, offset: 0x48 */\r\n       uint8_t RESERVED_2[4];\r\n  __IO uint32_t PKC_MCDATA;                        /**< MC pattern data interface, offset: 0x50 */\r\n       uint8_t RESERVED_3[12];\r\n  __I  uint32_t PKC_VERSION;                       /**< PKC version register, offset: 0x60 */\r\n       uint8_t RESERVED_4[3916];\r\n  __O  uint32_t PKC_SOFT_RST;                      /**< Software reset, offset: 0xFB0 */\r\n       uint8_t RESERVED_5[12];\r\n  __I  uint32_t PKC_ACCESS_ERR;                    /**< Access Error, offset: 0xFC0 */\r\n  __O  uint32_t PKC_ACCESS_ERR_CLR;                /**< Clear Access Error, offset: 0xFC4 */\r\n       uint8_t RESERVED_6[16];\r\n  __O  uint32_t PKC_INT_CLR_ENABLE;                /**< Interrupt enable clear, offset: 0xFD8 */\r\n  __O  uint32_t PKC_INT_SET_ENABLE;                /**< Interrupt enable set, offset: 0xFDC */\r\n  __I  uint32_t PKC_INT_STATUS;                    /**< Interrupt status, offset: 0xFE0 */\r\n  __I  uint32_t PKC_INT_ENABLE;                    /**< Interrupt enable, offset: 0xFE4 */\r\n  __O  uint32_t PKC_INT_CLR_STATUS;                /**< Interrupt status clear, offset: 0xFE8 */\r\n  __O  uint32_t PKC_INT_SET_STATUS;                /**< Interrupt status set, offset: 0xFEC */\r\n       uint8_t RESERVED_7[12];\r\n  __I  uint32_t PKC_MODULE_ID;                     /**< Module ID, offset: 0xFFC */\r\n} PKC_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- PKC Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup PKC_Register_Masks PKC Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name PKC_STATUS - Status register */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_STATUS_ACTIV_MASK                (0x1U)\r\n#define PKC_PKC_STATUS_ACTIV_SHIFT               (0U)\r\n/*! ACTIV - PKC active: ACTIV=1 signals that a calculation is in progress or about to start. */\r\n#define PKC_PKC_STATUS_ACTIV(x)                  (((uint32_t)(((uint32_t)(x)) << PKC_PKC_STATUS_ACTIV_SHIFT)) & PKC_PKC_STATUS_ACTIV_MASK)\r\n\r\n#define PKC_PKC_STATUS_CARRY_MASK                (0x2U)\r\n#define PKC_PKC_STATUS_CARRY_SHIFT               (1U)\r\n/*! CARRY - Carry overflow flag: CARRY is set by the PKC at the end of a calculation in case; - an\r\n *    addition or multiplication with addition operation has been executed and an overflow in the\r\n *    most significant bit has occured.\r\n */\r\n#define PKC_PKC_STATUS_CARRY(x)                  (((uint32_t)(((uint32_t)(x)) << PKC_PKC_STATUS_CARRY_SHIFT)) & PKC_PKC_STATUS_CARRY_MASK)\r\n\r\n#define PKC_PKC_STATUS_ZERO_MASK                 (0x4U)\r\n#define PKC_PKC_STATUS_ZERO_SHIFT                (2U)\r\n/*! ZERO - Zero result flag: ZERO is set by the PKC at the end of a calculation in case the result\r\n *    of the calculation is equal zero.\r\n */\r\n#define PKC_PKC_STATUS_ZERO(x)                   (((uint32_t)(((uint32_t)(x)) << PKC_PKC_STATUS_ZERO_SHIFT)) & PKC_PKC_STATUS_ZERO_MASK)\r\n\r\n#define PKC_PKC_STATUS_GOANY_MASK                (0x8U)\r\n#define PKC_PKC_STATUS_GOANY_SHIFT               (3U)\r\n/*! GOANY - Combined GO status flag: GOANY is set in case either PKC_CTRL. */\r\n#define PKC_PKC_STATUS_GOANY(x)                  (((uint32_t)(((uint32_t)(x)) << PKC_PKC_STATUS_GOANY_SHIFT)) & PKC_PKC_STATUS_GOANY_MASK)\r\n\r\n#define PKC_PKC_STATUS_LOCKED_MASK               (0x60U)\r\n#define PKC_PKC_STATUS_LOCKED_SHIFT              (5U)\r\n/*! LOCKED - Parameter set locked: Indicates if parameter set is locked due to a pending calculation start or can be overwritten. */\r\n#define PKC_PKC_STATUS_LOCKED(x)                 (((uint32_t)(((uint32_t)(x)) << PKC_PKC_STATUS_LOCKED_SHIFT)) & PKC_PKC_STATUS_LOCKED_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_CTRL - Control register */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_CTRL_RESET_MASK                  (0x1U)\r\n#define PKC_PKC_CTRL_RESET_SHIFT                 (0U)\r\n/*! RESET - PKC reset control bit: RESET=1 enforces the PKC's reset state during which a calculation\r\n *    cannot be started and by which any ongoing calculation process is stopped.\r\n */\r\n#define PKC_PKC_CTRL_RESET(x)                    (((uint32_t)(((uint32_t)(x)) << PKC_PKC_CTRL_RESET_SHIFT)) & PKC_PKC_CTRL_RESET_MASK)\r\n\r\n#define PKC_PKC_CTRL_STOP_MASK                   (0x2U)\r\n#define PKC_PKC_CTRL_STOP_SHIFT                  (1U)\r\n/*! STOP - Freeze PKC calculation: STOP=1 freezes all PKC activity incl. */\r\n#define PKC_PKC_CTRL_STOP(x)                     (((uint32_t)(((uint32_t)(x)) << PKC_PKC_CTRL_STOP_SHIFT)) & PKC_PKC_CTRL_STOP_MASK)\r\n\r\n#define PKC_PKC_CTRL_GOD1_MASK                   (0x4U)\r\n#define PKC_PKC_CTRL_GOD1_SHIFT                  (2U)\r\n/*! GOD1 - Control bit to start direct operation using parameter set 1: If GOD1 is set PKC will\r\n *    start a direct / layer0 operation using parameter set 1 (PKC_MODE1, PKC_XYPTR1, PKC_ZRPTR1,\r\n *    PKC_LEN1).\r\n */\r\n#define PKC_PKC_CTRL_GOD1(x)                     (((uint32_t)(((uint32_t)(x)) << PKC_PKC_CTRL_GOD1_SHIFT)) & PKC_PKC_CTRL_GOD1_MASK)\r\n\r\n#define PKC_PKC_CTRL_GOD2_MASK                   (0x8U)\r\n#define PKC_PKC_CTRL_GOD2_SHIFT                  (3U)\r\n/*! GOD2 - Control bit to start direct operation using parameter set 2: If GOD2 is set PKC will\r\n *    start a direct / layer0 operation using parameter set 2 (PKC_MODE2, PKC_XYPTR2, PKC_ZRPTR2,\r\n *    PKC_LEN2).\r\n */\r\n#define PKC_PKC_CTRL_GOD2(x)                     (((uint32_t)(((uint32_t)(x)) << PKC_PKC_CTRL_GOD2_SHIFT)) & PKC_PKC_CTRL_GOD2_MASK)\r\n\r\n#define PKC_PKC_CTRL_GOM1_MASK                   (0x10U)\r\n#define PKC_PKC_CTRL_GOM1_SHIFT                  (4U)\r\n/*! GOM1 - Control bit to start MC pattern using parameter set 1: If GOM1 is set PKC will start a MC\r\n *    pattern / layer1 operation using parameter set 1 (PKC_MODE1, PKC_XYPTR1, PKC_ZRPTR1,\r\n *    PKC_LEN1).\r\n */\r\n#define PKC_PKC_CTRL_GOM1(x)                     (((uint32_t)(((uint32_t)(x)) << PKC_PKC_CTRL_GOM1_SHIFT)) & PKC_PKC_CTRL_GOM1_MASK)\r\n\r\n#define PKC_PKC_CTRL_GOM2_MASK                   (0x20U)\r\n#define PKC_PKC_CTRL_GOM2_SHIFT                  (5U)\r\n/*! GOM2 - Control bit to start MC pattern using parameter set 2: If GOM2 is set PKC will start a MC\r\n *    pattern / layer1 operation using parameter set 2 (PKC_MODE2, PKC_XYPTR2, PKC_ZRPTR2,\r\n *    PKC_LEN2).\r\n */\r\n#define PKC_PKC_CTRL_GOM2(x)                     (((uint32_t)(((uint32_t)(x)) << PKC_PKC_CTRL_GOM2_SHIFT)) & PKC_PKC_CTRL_GOM2_MASK)\r\n\r\n#define PKC_PKC_CTRL_GOU_MASK                    (0x40U)\r\n#define PKC_PKC_CTRL_GOU_SHIFT                   (6U)\r\n/*! GOU - Control bit to start pipe operation: If GOU is set PKC will start the pipe / layer2\r\n *    operation (parameter fetch & calculation) described in section 'PKC Universal Pointer Fetch\r\n *    Operation'.\r\n */\r\n#define PKC_PKC_CTRL_GOU(x)                      (((uint32_t)(((uint32_t)(x)) << PKC_PKC_CTRL_GOU_SHIFT)) & PKC_PKC_CTRL_GOU_MASK)\r\n\r\n#define PKC_PKC_CTRL_GF2CONV_MASK                (0x80U)\r\n#define PKC_PKC_CTRL_GF2CONV_SHIFT               (7U)\r\n/*! GF2CONV - Convert to GF2 calculation modes: If GF2CONV is set operations are mapped to their GF(2) equivalent operation modes. */\r\n#define PKC_PKC_CTRL_GF2CONV(x)                  (((uint32_t)(((uint32_t)(x)) << PKC_PKC_CTRL_GF2CONV_SHIFT)) & PKC_PKC_CTRL_GF2CONV_MASK)\r\n\r\n#define PKC_PKC_CTRL_CLRCACHE_MASK               (0x100U)\r\n#define PKC_PKC_CTRL_CLRCACHE_SHIFT              (8U)\r\n/*! CLRCACHE - Clear universal pointer cache: Invalidates the cache such that all previously fetched\r\n *    parameters are withdrawn and have to be fetched again via DMA accesses.\r\n */\r\n#define PKC_PKC_CTRL_CLRCACHE(x)                 (((uint32_t)(((uint32_t)(x)) << PKC_PKC_CTRL_CLRCACHE_SHIFT)) & PKC_PKC_CTRL_CLRCACHE_MASK)\r\n\r\n#define PKC_PKC_CTRL_CACHE_EN_MASK               (0x200U)\r\n#define PKC_PKC_CTRL_CACHE_EN_SHIFT              (9U)\r\n/*! CACHE_EN - Enable universal pointer cache: If CACHE_EN=1 the cache for the universal pointer parameters is enabled. */\r\n#define PKC_PKC_CTRL_CACHE_EN(x)                 (((uint32_t)(((uint32_t)(x)) << PKC_PKC_CTRL_CACHE_EN_SHIFT)) & PKC_PKC_CTRL_CACHE_EN_MASK)\r\n\r\n#define PKC_PKC_CTRL_REDMUL_MASK                 (0xC00U)\r\n#define PKC_PKC_CTRL_REDMUL_SHIFT                (10U)\r\n/*! REDMUL - Reduced multiplier mode: REDMUL defines the operand width processed by the PKC coprocessor. */\r\n#define PKC_PKC_CTRL_REDMUL(x)                   (((uint32_t)(((uint32_t)(x)) << PKC_PKC_CTRL_REDMUL_SHIFT)) & PKC_PKC_CTRL_REDMUL_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_CFG - Configuration register */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_CFG_IDLEOP_MASK                  (0x1U)\r\n#define PKC_PKC_CFG_IDLEOP_SHIFT                 (0U)\r\n/*! IDLEOP - Idle operation feature not available in this version (flag is don't care). */\r\n#define PKC_PKC_CFG_IDLEOP(x)                    (((uint32_t)(((uint32_t)(x)) << PKC_PKC_CFG_IDLEOP_SHIFT)) & PKC_PKC_CFG_IDLEOP_MASK)\r\n\r\n#define PKC_PKC_CFG_RFU1_MASK                    (0x2U)\r\n#define PKC_PKC_CFG_RFU1_SHIFT                   (1U)\r\n/*! RFU1 - RFU */\r\n#define PKC_PKC_CFG_RFU1(x)                      (((uint32_t)(((uint32_t)(x)) << PKC_PKC_CFG_RFU1_SHIFT)) & PKC_PKC_CFG_RFU1_MASK)\r\n\r\n#define PKC_PKC_CFG_RFU2_MASK                    (0x4U)\r\n#define PKC_PKC_CFG_RFU2_SHIFT                   (2U)\r\n/*! RFU2 - RFU */\r\n#define PKC_PKC_CFG_RFU2(x)                      (((uint32_t)(((uint32_t)(x)) << PKC_PKC_CFG_RFU2_SHIFT)) & PKC_PKC_CFG_RFU2_MASK)\r\n\r\n#define PKC_PKC_CFG_CLKRND_MASK                  (0x8U)\r\n#define PKC_PKC_CFG_CLKRND_SHIFT                 (3U)\r\n/*! CLKRND - Clock randomization feature not available in this version (flag is don't care). */\r\n#define PKC_PKC_CFG_CLKRND(x)                    (((uint32_t)(((uint32_t)(x)) << PKC_PKC_CFG_CLKRND_SHIFT)) & PKC_PKC_CFG_CLKRND_MASK)\r\n\r\n#define PKC_PKC_CFG_REDMULNOISE_MASK             (0x10U)\r\n#define PKC_PKC_CFG_REDMULNOISE_SHIFT            (4U)\r\n/*! REDMULNOISE - Noise in reduced multiplier mode feature not available in this version (flag is don't care). */\r\n#define PKC_PKC_CFG_REDMULNOISE(x)               (((uint32_t)(((uint32_t)(x)) << PKC_PKC_CFG_REDMULNOISE_SHIFT)) & PKC_PKC_CFG_REDMULNOISE_MASK)\r\n\r\n#define PKC_PKC_CFG_RNDDLY_MASK                  (0xE0U)\r\n#define PKC_PKC_CFG_RNDDLY_SHIFT                 (5U)\r\n/*! RNDDLY - Random delay feature not available in this version (flag is don't care). */\r\n#define PKC_PKC_CFG_RNDDLY(x)                    (((uint32_t)(((uint32_t)(x)) << PKC_PKC_CFG_RNDDLY_SHIFT)) & PKC_PKC_CFG_RNDDLY_MASK)\r\n\r\n#define PKC_PKC_CFG_SBXNOISE_MASK                (0x100U)\r\n#define PKC_PKC_CFG_SBXNOISE_SHIFT               (8U)\r\n/*! SBXNOISE - Noise feature not available in this version (flag is don't care). */\r\n#define PKC_PKC_CFG_SBXNOISE(x)                  (((uint32_t)(((uint32_t)(x)) << PKC_PKC_CFG_SBXNOISE_SHIFT)) & PKC_PKC_CFG_SBXNOISE_MASK)\r\n\r\n#define PKC_PKC_CFG_ALPNOISE_MASK                (0x200U)\r\n#define PKC_PKC_CFG_ALPNOISE_SHIFT               (9U)\r\n/*! ALPNOISE - Noise feature not available in this version (flag is don't care). */\r\n#define PKC_PKC_CFG_ALPNOISE(x)                  (((uint32_t)(((uint32_t)(x)) << PKC_PKC_CFG_ALPNOISE_SHIFT)) & PKC_PKC_CFG_ALPNOISE_MASK)\r\n\r\n#define PKC_PKC_CFG_FMULNOISE_MASK               (0x400U)\r\n#define PKC_PKC_CFG_FMULNOISE_SHIFT              (10U)\r\n/*! FMULNOISE - Noise feature not available in this version (flag is don't care). */\r\n#define PKC_PKC_CFG_FMULNOISE(x)                 (((uint32_t)(((uint32_t)(x)) << PKC_PKC_CFG_FMULNOISE_SHIFT)) & PKC_PKC_CFG_FMULNOISE_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_MODE1 - Mode register, parameter set 1 */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_MODE1_MODE_MASK                  (0xFFU)\r\n#define PKC_PKC_MODE1_MODE_SHIFT                 (0U)\r\n/*! MODE - Calculation Mode / MC Start address:; Calculation mode of direct calculation (layer0) are\r\n *    listed in a table in Section 'PKC arithmetic unit (layer 0)'.\r\n */\r\n#define PKC_PKC_MODE1_MODE(x)                    (((uint32_t)(((uint32_t)(x)) << PKC_PKC_MODE1_MODE_SHIFT)) & PKC_PKC_MODE1_MODE_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_XYPTR1 - X+Y pointer register, parameter set 1 */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_XYPTR1_XPTR_MASK                 (0xFFFFU)\r\n#define PKC_PKC_XYPTR1_XPTR_SHIFT                (0U)\r\n/*! XPTR - Start address of X operand in PKCRAM with byte granularity: Least significant bits are ignored depending on PKC_CTRL. */\r\n#define PKC_PKC_XYPTR1_XPTR(x)                   (((uint32_t)(((uint32_t)(x)) << PKC_PKC_XYPTR1_XPTR_SHIFT)) & PKC_PKC_XYPTR1_XPTR_MASK)\r\n\r\n#define PKC_PKC_XYPTR1_YPTR_MASK                 (0xFFFF0000U)\r\n#define PKC_PKC_XYPTR1_YPTR_SHIFT                (16U)\r\n/*! YPTR - Start address of Y operand in PKCRAM with byte granularity: Least significant bits are ignored depending on PKC_CTRL. */\r\n#define PKC_PKC_XYPTR1_YPTR(x)                   (((uint32_t)(((uint32_t)(x)) << PKC_PKC_XYPTR1_YPTR_SHIFT)) & PKC_PKC_XYPTR1_YPTR_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_ZRPTR1 - Z+R pointer register, parameter set 1 */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_ZRPTR1_ZPTR_MASK                 (0xFFFFU)\r\n#define PKC_PKC_ZRPTR1_ZPTR_SHIFT                (0U)\r\n/*! ZPTR - Start address of Z operand in PKCRAM with byte granularity or constant for calculation\r\n *    modes using CONST:; If ZPTR is used as address pointer the least significant bits are ignored\r\n *    depending on PKC_CTRL.\r\n */\r\n#define PKC_PKC_ZRPTR1_ZPTR(x)                   (((uint32_t)(((uint32_t)(x)) << PKC_PKC_ZRPTR1_ZPTR_SHIFT)) & PKC_PKC_ZRPTR1_ZPTR_MASK)\r\n\r\n#define PKC_PKC_ZRPTR1_RPTR_MASK                 (0xFFFF0000U)\r\n#define PKC_PKC_ZRPTR1_RPTR_SHIFT                (16U)\r\n/*! RPTR - Start address of R result in PKCRAM with byte granularity: Least significant bits are ignored depending on PKC_CTRL. */\r\n#define PKC_PKC_ZRPTR1_RPTR(x)                   (((uint32_t)(((uint32_t)(x)) << PKC_PKC_ZRPTR1_RPTR_SHIFT)) & PKC_PKC_ZRPTR1_RPTR_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_LEN1 - Length register, parameter set 1 */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_LEN1_LEN_MASK                    (0xFFFFU)\r\n#define PKC_PKC_LEN1_LEN_SHIFT                   (0U)\r\n/*! LEN - Operand length: LEN defines the length of the operands and the result in bytes. */\r\n#define PKC_PKC_LEN1_LEN(x)                      (((uint32_t)(((uint32_t)(x)) << PKC_PKC_LEN1_LEN_SHIFT)) & PKC_PKC_LEN1_LEN_MASK)\r\n\r\n#define PKC_PKC_LEN1_MCLEN_MASK                  (0xFFFF0000U)\r\n#define PKC_PKC_LEN1_MCLEN_SHIFT                 (16U)\r\n/*! MCLEN - Loop counter for microcode pattern: MCLEN defines the length of the loop counter that\r\n *    can be used in layer1 calculation mode, e.\r\n */\r\n#define PKC_PKC_LEN1_MCLEN(x)                    (((uint32_t)(((uint32_t)(x)) << PKC_PKC_LEN1_MCLEN_SHIFT)) & PKC_PKC_LEN1_MCLEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_MODE2 - Mode register, parameter set 2 */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_MODE2_MODE_MASK                  (0xFFU)\r\n#define PKC_PKC_MODE2_MODE_SHIFT                 (0U)\r\n/*! MODE - Calculation Mode / MC Start address:; Calculation mode of direct calculation (layer0) are\r\n *    listed in a table in Section 'PKC arithmetic unit (layer 0)'.\r\n */\r\n#define PKC_PKC_MODE2_MODE(x)                    (((uint32_t)(((uint32_t)(x)) << PKC_PKC_MODE2_MODE_SHIFT)) & PKC_PKC_MODE2_MODE_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_XYPTR2 - X+Y pointer register, parameter set 2 */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_XYPTR2_XPTR_MASK                 (0xFFFFU)\r\n#define PKC_PKC_XYPTR2_XPTR_SHIFT                (0U)\r\n/*! XPTR - Start address of X operand in PKCRAM with byte granularity: Least significant bits are ignored depending on PKC_CTRL. */\r\n#define PKC_PKC_XYPTR2_XPTR(x)                   (((uint32_t)(((uint32_t)(x)) << PKC_PKC_XYPTR2_XPTR_SHIFT)) & PKC_PKC_XYPTR2_XPTR_MASK)\r\n\r\n#define PKC_PKC_XYPTR2_YPTR_MASK                 (0xFFFF0000U)\r\n#define PKC_PKC_XYPTR2_YPTR_SHIFT                (16U)\r\n/*! YPTR - Start address of Y operand in PKCRAM with byte granularity: Least significant bits are ignored depending on PKC_CTRL. */\r\n#define PKC_PKC_XYPTR2_YPTR(x)                   (((uint32_t)(((uint32_t)(x)) << PKC_PKC_XYPTR2_YPTR_SHIFT)) & PKC_PKC_XYPTR2_YPTR_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_ZRPTR2 - Z+R pointer register, parameter set 2 */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_ZRPTR2_ZPTR_MASK                 (0xFFFFU)\r\n#define PKC_PKC_ZRPTR2_ZPTR_SHIFT                (0U)\r\n/*! ZPTR - Start address of Z operand in PKCRAM with byte granularity or constant for calculation\r\n *    modes using CONST:; If ZPTR is used as address pointer the least significant bits are ignored\r\n *    depending on PKC_CTRL.\r\n */\r\n#define PKC_PKC_ZRPTR2_ZPTR(x)                   (((uint32_t)(((uint32_t)(x)) << PKC_PKC_ZRPTR2_ZPTR_SHIFT)) & PKC_PKC_ZRPTR2_ZPTR_MASK)\r\n\r\n#define PKC_PKC_ZRPTR2_RPTR_MASK                 (0xFFFF0000U)\r\n#define PKC_PKC_ZRPTR2_RPTR_SHIFT                (16U)\r\n/*! RPTR - Start address of R result in PKCRAM with byte granularity: Least significant bits are ignored depending on PKC_CTRL. */\r\n#define PKC_PKC_ZRPTR2_RPTR(x)                   (((uint32_t)(((uint32_t)(x)) << PKC_PKC_ZRPTR2_RPTR_SHIFT)) & PKC_PKC_ZRPTR2_RPTR_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_LEN2 - Length register, parameter set 2 */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_LEN2_LEN_MASK                    (0xFFFFU)\r\n#define PKC_PKC_LEN2_LEN_SHIFT                   (0U)\r\n/*! LEN - Operand length: LEN defines the length of the operands and the result in bytes. */\r\n#define PKC_PKC_LEN2_LEN(x)                      (((uint32_t)(((uint32_t)(x)) << PKC_PKC_LEN2_LEN_SHIFT)) & PKC_PKC_LEN2_LEN_MASK)\r\n\r\n#define PKC_PKC_LEN2_MCLEN_MASK                  (0xFFFF0000U)\r\n#define PKC_PKC_LEN2_MCLEN_SHIFT                 (16U)\r\n/*! MCLEN - Loop counter for microcode pattern: MCLEN defines the length of the loop counter that\r\n *    can be used in layer1 calculation mode, e.\r\n */\r\n#define PKC_PKC_LEN2_MCLEN(x)                    (((uint32_t)(((uint32_t)(x)) << PKC_PKC_LEN2_MCLEN_SHIFT)) & PKC_PKC_LEN2_MCLEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_UPTR - Universal pointer FUP program */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_UPTR_PTR_MASK                    (0xFFFFFFFFU)\r\n#define PKC_PKC_UPTR_PTR_SHIFT                   (0U)\r\n/*! PTR - Pointer to start address of PKC FUP program: PKC_UPTR needs to be defined before starting\r\n *    a universal pointer PKC calculation (layer2) via PKC_CTRL.\r\n */\r\n#define PKC_PKC_UPTR_PTR(x)                      (((uint32_t)(((uint32_t)(x)) << PKC_PKC_UPTR_PTR_SHIFT)) & PKC_PKC_UPTR_PTR_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_UPTRT - Universal pointer FUP table */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_UPTRT_PTR_MASK                   (0xFFFFFFFFU)\r\n#define PKC_PKC_UPTRT_PTR_SHIFT                  (0U)\r\n/*! PTR - Pointer to start address of PKC FUP table: PKC_UPTRT needs to be defined before starting a\r\n *    universal pointer PKC calculation (layer2) via PKC_CTRL.\r\n */\r\n#define PKC_PKC_UPTRT_PTR(x)                     (((uint32_t)(((uint32_t)(x)) << PKC_PKC_UPTRT_PTR_SHIFT)) & PKC_PKC_UPTRT_PTR_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_ULEN - Universal pointer length */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_ULEN_LEN_MASK                    (0xFFU)\r\n#define PKC_PKC_ULEN_LEN_SHIFT                   (0U)\r\n/*! LEN - Length of universal pointer calculation: PKC_ULEN defines how many FUP program entries\r\n *    shall be processed for one layer2 calculation started via PKC_CTRL.\r\n */\r\n#define PKC_PKC_ULEN_LEN(x)                      (((uint32_t)(((uint32_t)(x)) << PKC_PKC_ULEN_LEN_SHIFT)) & PKC_PKC_ULEN_LEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_MCDATA - MC pattern data interface */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_MCDATA_MCDATA_MASK               (0xFFFFFFFFU)\r\n#define PKC_PKC_MCDATA_MCDATA_SHIFT              (0U)\r\n/*! MCDATA - Microcode read/write data: This IP version does not support flexible MC patterns (only hard coded ones). */\r\n#define PKC_PKC_MCDATA_MCDATA(x)                 (((uint32_t)(((uint32_t)(x)) << PKC_PKC_MCDATA_MCDATA_SHIFT)) & PKC_PKC_MCDATA_MCDATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_VERSION - PKC version register */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_VERSION_MULSIZE_MASK             (0x3U)\r\n#define PKC_PKC_VERSION_MULSIZE_SHIFT            (0U)\r\n/*! MULSIZE - native multiplier size and operand granularity */\r\n#define PKC_PKC_VERSION_MULSIZE(x)               (((uint32_t)(((uint32_t)(x)) << PKC_PKC_VERSION_MULSIZE_SHIFT)) & PKC_PKC_VERSION_MULSIZE_MASK)\r\n\r\n#define PKC_PKC_VERSION_MCAVAIL_MASK             (0x4U)\r\n#define PKC_PKC_VERSION_MCAVAIL_SHIFT            (2U)\r\n/*! MCAVAIL - MC feature (layer1 calculation) is available */\r\n#define PKC_PKC_VERSION_MCAVAIL(x)               (((uint32_t)(((uint32_t)(x)) << PKC_PKC_VERSION_MCAVAIL_SHIFT)) & PKC_PKC_VERSION_MCAVAIL_MASK)\r\n\r\n#define PKC_PKC_VERSION_UPAVAIL_MASK             (0x8U)\r\n#define PKC_PKC_VERSION_UPAVAIL_SHIFT            (3U)\r\n/*! UPAVAIL - UP feature (layer2 calculation) is available */\r\n#define PKC_PKC_VERSION_UPAVAIL(x)               (((uint32_t)(((uint32_t)(x)) << PKC_PKC_VERSION_UPAVAIL_SHIFT)) & PKC_PKC_VERSION_UPAVAIL_MASK)\r\n\r\n#define PKC_PKC_VERSION_UPCACHEAVAIL_MASK        (0x10U)\r\n#define PKC_PKC_VERSION_UPCACHEAVAIL_SHIFT       (4U)\r\n/*! UPCACHEAVAIL - UP cache is available */\r\n#define PKC_PKC_VERSION_UPCACHEAVAIL(x)          (((uint32_t)(((uint32_t)(x)) << PKC_PKC_VERSION_UPCACHEAVAIL_SHIFT)) & PKC_PKC_VERSION_UPCACHEAVAIL_MASK)\r\n\r\n#define PKC_PKC_VERSION_GF2AVAIL_MASK            (0x20U)\r\n#define PKC_PKC_VERSION_GF2AVAIL_SHIFT           (5U)\r\n/*! GF2AVAIL - GF2 calculation modes are available */\r\n#define PKC_PKC_VERSION_GF2AVAIL(x)              (((uint32_t)(((uint32_t)(x)) << PKC_PKC_VERSION_GF2AVAIL_SHIFT)) & PKC_PKC_VERSION_GF2AVAIL_MASK)\r\n\r\n#define PKC_PKC_VERSION_PARAMNUM_MASK            (0xC0U)\r\n#define PKC_PKC_VERSION_PARAMNUM_SHIFT           (6U)\r\n/*! PARAMNUM - Number of parameter sets for real calculation */\r\n#define PKC_PKC_VERSION_PARAMNUM(x)              (((uint32_t)(((uint32_t)(x)) << PKC_PKC_VERSION_PARAMNUM_SHIFT)) & PKC_PKC_VERSION_PARAMNUM_MASK)\r\n\r\n#define PKC_PKC_VERSION_SBX0AVAIL_MASK           (0x100U)\r\n#define PKC_PKC_VERSION_SBX0AVAIL_SHIFT          (8U)\r\n/*! SBX0AVAIL - SBX0 operation is available */\r\n#define PKC_PKC_VERSION_SBX0AVAIL(x)             (((uint32_t)(((uint32_t)(x)) << PKC_PKC_VERSION_SBX0AVAIL_SHIFT)) & PKC_PKC_VERSION_SBX0AVAIL_MASK)\r\n\r\n#define PKC_PKC_VERSION_SBX1AVAIL_MASK           (0x200U)\r\n#define PKC_PKC_VERSION_SBX1AVAIL_SHIFT          (9U)\r\n/*! SBX1AVAIL - SBX1 operation is available */\r\n#define PKC_PKC_VERSION_SBX1AVAIL(x)             (((uint32_t)(((uint32_t)(x)) << PKC_PKC_VERSION_SBX1AVAIL_SHIFT)) & PKC_PKC_VERSION_SBX1AVAIL_MASK)\r\n\r\n#define PKC_PKC_VERSION_SBX2AVAIL_MASK           (0x400U)\r\n#define PKC_PKC_VERSION_SBX2AVAIL_SHIFT          (10U)\r\n/*! SBX2AVAIL - SBX2 operation is available */\r\n#define PKC_PKC_VERSION_SBX2AVAIL(x)             (((uint32_t)(((uint32_t)(x)) << PKC_PKC_VERSION_SBX2AVAIL_SHIFT)) & PKC_PKC_VERSION_SBX2AVAIL_MASK)\r\n\r\n#define PKC_PKC_VERSION_SBX3AVAIL_MASK           (0x800U)\r\n#define PKC_PKC_VERSION_SBX3AVAIL_SHIFT          (11U)\r\n/*! SBX3AVAIL - SBX3 operation is available */\r\n#define PKC_PKC_VERSION_SBX3AVAIL(x)             (((uint32_t)(((uint32_t)(x)) << PKC_PKC_VERSION_SBX3AVAIL_SHIFT)) & PKC_PKC_VERSION_SBX3AVAIL_MASK)\r\n\r\n#define PKC_PKC_VERSION_MCRECONF_SIZE_MASK       (0xFF000U)\r\n#define PKC_PKC_VERSION_MCRECONF_SIZE_SHIFT      (12U)\r\n/*! MCRECONF_SIZE - Size of reconfigurable MC table in bytes */\r\n#define PKC_PKC_VERSION_MCRECONF_SIZE(x)         (((uint32_t)(((uint32_t)(x)) << PKC_PKC_VERSION_MCRECONF_SIZE_SHIFT)) & PKC_PKC_VERSION_MCRECONF_SIZE_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_SOFT_RST - Software reset */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_SOFT_RST_SOFT_RST_MASK           (0x1U)\r\n#define PKC_PKC_SOFT_RST_SOFT_RST_SHIFT          (0U)\r\n/*! SOFT_RST - Write 1 to reset module (0 has no effect). */\r\n#define PKC_PKC_SOFT_RST_SOFT_RST(x)             (((uint32_t)(((uint32_t)(x)) << PKC_PKC_SOFT_RST_SOFT_RST_SHIFT)) & PKC_PKC_SOFT_RST_SOFT_RST_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_ACCESS_ERR - Access Error */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_ACCESS_ERR_APB_NOTAV_MASK        (0x1U)\r\n#define PKC_PKC_ACCESS_ERR_APB_NOTAV_SHIFT       (0U)\r\n/*! APB_NOTAV - APB Error: address not available */\r\n#define PKC_PKC_ACCESS_ERR_APB_NOTAV(x)          (((uint32_t)(((uint32_t)(x)) << PKC_PKC_ACCESS_ERR_APB_NOTAV_SHIFT)) & PKC_PKC_ACCESS_ERR_APB_NOTAV_MASK)\r\n\r\n#define PKC_PKC_ACCESS_ERR_APB_WRGMD_MASK        (0x2U)\r\n#define PKC_PKC_ACCESS_ERR_APB_WRGMD_SHIFT       (1U)\r\n/*! APB_WRGMD - APB Error: Wrong access mode */\r\n#define PKC_PKC_ACCESS_ERR_APB_WRGMD(x)          (((uint32_t)(((uint32_t)(x)) << PKC_PKC_ACCESS_ERR_APB_WRGMD_SHIFT)) & PKC_PKC_ACCESS_ERR_APB_WRGMD_MASK)\r\n\r\n#define PKC_PKC_ACCESS_ERR_APB_MASTER_MASK       (0xF0U)\r\n#define PKC_PKC_ACCESS_ERR_APB_MASTER_SHIFT      (4U)\r\n/*! APB_MASTER - APB Master that triggered first APB error (APB_WRGMD or APB_NOTAV) */\r\n#define PKC_PKC_ACCESS_ERR_APB_MASTER(x)         (((uint32_t)(((uint32_t)(x)) << PKC_PKC_ACCESS_ERR_APB_MASTER_SHIFT)) & PKC_PKC_ACCESS_ERR_APB_MASTER_MASK)\r\n\r\n#define PKC_PKC_ACCESS_ERR_AHB_MASK              (0x400U)\r\n#define PKC_PKC_ACCESS_ERR_AHB_SHIFT             (10U)\r\n/*! AHB - AHB Error: invalid AHB access Layer2 Only */\r\n#define PKC_PKC_ACCESS_ERR_AHB(x)                (((uint32_t)(((uint32_t)(x)) << PKC_PKC_ACCESS_ERR_AHB_SHIFT)) & PKC_PKC_ACCESS_ERR_AHB_MASK)\r\n\r\n#define PKC_PKC_ACCESS_ERR_PKCC_MASK             (0x10000U)\r\n#define PKC_PKC_ACCESS_ERR_PKCC_SHIFT            (16U)\r\n/*! PKCC - Error in PKC coprocessor kernel */\r\n#define PKC_PKC_ACCESS_ERR_PKCC(x)               (((uint32_t)(((uint32_t)(x)) << PKC_PKC_ACCESS_ERR_PKCC_SHIFT)) & PKC_PKC_ACCESS_ERR_PKCC_MASK)\r\n\r\n#define PKC_PKC_ACCESS_ERR_FDET_MASK             (0x20000U)\r\n#define PKC_PKC_ACCESS_ERR_FDET_SHIFT            (17U)\r\n/*! FDET - Error due to error detection circuitry */\r\n#define PKC_PKC_ACCESS_ERR_FDET(x)               (((uint32_t)(((uint32_t)(x)) << PKC_PKC_ACCESS_ERR_FDET_SHIFT)) & PKC_PKC_ACCESS_ERR_FDET_MASK)\r\n\r\n#define PKC_PKC_ACCESS_ERR_CTRL_MASK             (0x40000U)\r\n#define PKC_PKC_ACCESS_ERR_CTRL_SHIFT            (18U)\r\n/*! CTRL - Error in PKC software control */\r\n#define PKC_PKC_ACCESS_ERR_CTRL(x)               (((uint32_t)(((uint32_t)(x)) << PKC_PKC_ACCESS_ERR_CTRL_SHIFT)) & PKC_PKC_ACCESS_ERR_CTRL_MASK)\r\n\r\n#define PKC_PKC_ACCESS_ERR_UCRC_MASK             (0x80000U)\r\n#define PKC_PKC_ACCESS_ERR_UCRC_SHIFT            (19U)\r\n/*! UCRC - Error in layer2 CRC check */\r\n#define PKC_PKC_ACCESS_ERR_UCRC(x)               (((uint32_t)(((uint32_t)(x)) << PKC_PKC_ACCESS_ERR_UCRC_SHIFT)) & PKC_PKC_ACCESS_ERR_UCRC_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_ACCESS_ERR_CLR - Clear Access Error */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_ACCESS_ERR_CLR_ERR_CLR_MASK      (0x1U)\r\n#define PKC_PKC_ACCESS_ERR_CLR_ERR_CLR_SHIFT     (0U)\r\n/*! ERR_CLR - Write 1 to reset PKC_ACCESS_ERR SFR. */\r\n#define PKC_PKC_ACCESS_ERR_CLR_ERR_CLR(x)        (((uint32_t)(((uint32_t)(x)) << PKC_PKC_ACCESS_ERR_CLR_ERR_CLR_SHIFT)) & PKC_PKC_ACCESS_ERR_CLR_ERR_CLR_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_INT_CLR_ENABLE - Interrupt enable clear */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_INT_CLR_ENABLE_EN_PDONE_MASK     (0x1U)\r\n#define PKC_PKC_INT_CLR_ENABLE_EN_PDONE_SHIFT    (0U)\r\n/*! EN_PDONE - Write to clear PDONE interrupt enable flag (PKC_INT_ENABLE. */\r\n#define PKC_PKC_INT_CLR_ENABLE_EN_PDONE(x)       (((uint32_t)(((uint32_t)(x)) << PKC_PKC_INT_CLR_ENABLE_EN_PDONE_SHIFT)) & PKC_PKC_INT_CLR_ENABLE_EN_PDONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_INT_SET_ENABLE - Interrupt enable set */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_INT_SET_ENABLE_EN_PDONE_MASK     (0x1U)\r\n#define PKC_PKC_INT_SET_ENABLE_EN_PDONE_SHIFT    (0U)\r\n/*! EN_PDONE - Write to set PDONE interrupt enable flag (PKC_INT_ENABLE. */\r\n#define PKC_PKC_INT_SET_ENABLE_EN_PDONE(x)       (((uint32_t)(((uint32_t)(x)) << PKC_PKC_INT_SET_ENABLE_EN_PDONE_SHIFT)) & PKC_PKC_INT_SET_ENABLE_EN_PDONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_INT_STATUS - Interrupt status */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_INT_STATUS_INT_PDONE_MASK        (0x1U)\r\n#define PKC_PKC_INT_STATUS_INT_PDONE_SHIFT       (0U)\r\n/*! INT_PDONE - End-of-computation status flag: INT_PDONE is set after EACH single PKC layer0 or layer1 calculation. */\r\n#define PKC_PKC_INT_STATUS_INT_PDONE(x)          (((uint32_t)(((uint32_t)(x)) << PKC_PKC_INT_STATUS_INT_PDONE_SHIFT)) & PKC_PKC_INT_STATUS_INT_PDONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_INT_ENABLE - Interrupt enable */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_INT_ENABLE_EN_PDONE_MASK         (0x1U)\r\n#define PKC_PKC_INT_ENABLE_EN_PDONE_SHIFT        (0U)\r\n/*! EN_PDONE - PDONE interrupt enable flag: If EN_PDONE=1 an interrupt is triggered every time PKC_INT_STATUS. */\r\n#define PKC_PKC_INT_ENABLE_EN_PDONE(x)           (((uint32_t)(((uint32_t)(x)) << PKC_PKC_INT_ENABLE_EN_PDONE_SHIFT)) & PKC_PKC_INT_ENABLE_EN_PDONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_INT_CLR_STATUS - Interrupt status clear */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_INT_CLR_STATUS_INT_PDONE_MASK    (0x1U)\r\n#define PKC_PKC_INT_CLR_STATUS_INT_PDONE_SHIFT   (0U)\r\n/*! INT_PDONE - Write to clear End-of-computation status flag (PKC_INT_STATUS. */\r\n#define PKC_PKC_INT_CLR_STATUS_INT_PDONE(x)      (((uint32_t)(((uint32_t)(x)) << PKC_PKC_INT_CLR_STATUS_INT_PDONE_SHIFT)) & PKC_PKC_INT_CLR_STATUS_INT_PDONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_INT_SET_STATUS - Interrupt status set */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_INT_SET_STATUS_INT_PDONE_MASK    (0x1U)\r\n#define PKC_PKC_INT_SET_STATUS_INT_PDONE_SHIFT   (0U)\r\n/*! INT_PDONE - Write to set End-of-computation status flag (PKC_INT_STATUS. */\r\n#define PKC_PKC_INT_SET_STATUS_INT_PDONE(x)      (((uint32_t)(((uint32_t)(x)) << PKC_PKC_INT_SET_STATUS_INT_PDONE_SHIFT)) & PKC_PKC_INT_SET_STATUS_INT_PDONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKC_MODULE_ID - Module ID */\r\n/*! @{ */\r\n\r\n#define PKC_PKC_MODULE_ID_SIZE_MASK              (0xFFU)\r\n#define PKC_PKC_MODULE_ID_SIZE_SHIFT             (0U)\r\n/*! SIZE - Address space of the IP */\r\n#define PKC_PKC_MODULE_ID_SIZE(x)                (((uint32_t)(((uint32_t)(x)) << PKC_PKC_MODULE_ID_SIZE_SHIFT)) & PKC_PKC_MODULE_ID_SIZE_MASK)\r\n\r\n#define PKC_PKC_MODULE_ID_MINOR_REV_MASK         (0xF00U)\r\n#define PKC_PKC_MODULE_ID_MINOR_REV_SHIFT        (8U)\r\n/*! MINOR_REV - Minor revision */\r\n#define PKC_PKC_MODULE_ID_MINOR_REV(x)           (((uint32_t)(((uint32_t)(x)) << PKC_PKC_MODULE_ID_MINOR_REV_SHIFT)) & PKC_PKC_MODULE_ID_MINOR_REV_MASK)\r\n\r\n#define PKC_PKC_MODULE_ID_MAJOR_REV_MASK         (0xF000U)\r\n#define PKC_PKC_MODULE_ID_MAJOR_REV_SHIFT        (12U)\r\n/*! MAJOR_REV - Major revision */\r\n#define PKC_PKC_MODULE_ID_MAJOR_REV(x)           (((uint32_t)(((uint32_t)(x)) << PKC_PKC_MODULE_ID_MAJOR_REV_SHIFT)) & PKC_PKC_MODULE_ID_MAJOR_REV_MASK)\r\n\r\n#define PKC_PKC_MODULE_ID_ID_MASK                (0xFFFF0000U)\r\n#define PKC_PKC_MODULE_ID_ID_SHIFT               (16U)\r\n/*! ID - Module ID */\r\n#define PKC_PKC_MODULE_ID_ID(x)                  (((uint32_t)(((uint32_t)(x)) << PKC_PKC_MODULE_ID_ID_SHIFT)) & PKC_PKC_MODULE_ID_ID_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group PKC_Register_Masks */\r\n\r\n\r\n/* PKC - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral PKC base address */\r\n  #define PKC_BASE                                 (0x50009000u)\r\n  /** Peripheral PKC base address */\r\n  #define PKC_BASE_NS                              (0x40009000u)\r\n  /** Peripheral PKC base pointer */\r\n  #define PKC                                      ((PKC_Type *)PKC_BASE)\r\n  /** Peripheral PKC base pointer */\r\n  #define PKC_NS                                   ((PKC_Type *)PKC_BASE_NS)\r\n  /** Array initializer of PKC peripheral base addresses */\r\n  #define PKC_BASE_ADDRS                           { PKC_BASE }\r\n  /** Array initializer of PKC peripheral base pointers */\r\n  #define PKC_BASE_PTRS                            { PKC }\r\n  /** Array initializer of PKC peripheral base addresses */\r\n  #define PKC_BASE_ADDRS_NS                        { PKC_BASE_NS }\r\n  /** Array initializer of PKC peripheral base pointers */\r\n  #define PKC_BASE_PTRS_NS                         { PKC_NS }\r\n#else\r\n  /** Peripheral PKC base address */\r\n  #define PKC_BASE                                 (0x40009000u)\r\n  /** Peripheral PKC base pointer */\r\n  #define PKC                                      ((PKC_Type *)PKC_BASE)\r\n  /** Array initializer of PKC peripheral base addresses */\r\n  #define PKC_BASE_ADDRS                           { PKC_BASE }\r\n  /** Array initializer of PKC peripheral base pointers */\r\n  #define PKC_BASE_PTRS                            { PKC }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group PKC_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- PMU Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup PMU_Peripheral_Access_Layer PMU Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** PMU - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t PWR_MODE;                          /**< Power mode control register, offset: 0x0 */\r\n  __I  uint32_t PWR_MODE_STATUS;                   /**< Power mode status register, offset: 0x4 */\r\n  __IO uint32_t SYS_RST_EN;                        /**< sys reset enable resister, offset: 0x8 */\r\n  __I  uint32_t SYS_RST_STATUS;                    /**< Reset status Register, offset: 0xC */\r\n  __IO uint32_t SYS_RST_CLR;                       /**< sys reset clear resister, offset: 0x10 */\r\n  __IO uint32_t WAKEUP_LEVEL;                      /**< Wakeup Level Register, offset: 0x14 */\r\n  __IO uint32_t WAKEUP_MASK;                       /**< Wakeup Mask Interrupt Register, offset: 0x18 */\r\n  __I  uint32_t WAKEUP_STATUS;                     /**< Wakeup status register, offset: 0x1C */\r\n  __IO uint32_t WAKE_SRC_CLR;                      /**< Wake up source clear register, offset: 0x20 */\r\n  __IO uint32_t WL_BLE_WAKEUP_DONE;                /**< Wake up done register, offset: 0x24 */\r\n  __IO uint32_t CAU_SLP_CTRL;                      /**< CAU sleep clock control register, offset: 0x28 */\r\n  __I  uint32_t SOC_CIU_RDY;                       /**< soc_ciu_rdy register, offset: 0x2C */\r\n  __IO uint32_t CAPT_PULSE;                        /**< pulse in register, offset: 0x30 */\r\n  __IO uint32_t CAPT_PULSE_BASE_VAL;               /**< capt_pulse_base_val, offset: 0x34 */\r\n  __I  uint32_t CAPT_PULSE_VAL;                    /**< capt_pulse_val, offset: 0x38 */\r\n  __IO uint32_t XTAL32K_CTRL;                      /**< XTAL32k Control Register, offset: 0x3C */\r\n       uint8_t RESERVED_0[4];\r\n  __IO uint32_t PMIP_BUCK_LVL;                     /**< PMIP BUCK LEVEL, offset: 0x44 */\r\n  __IO uint32_t PMIP_BUCK_CTRL;                    /**< PMIP BUCK ctrl, offset: 0x48 */\r\n  __IO uint32_t PMIP_LDO_LVL;                      /**< PMIP LDO level ctrl, offset: 0x4C */\r\n  __IO uint32_t PMIP_RST;                          /**< PMIP reset request register, offset: 0x50 */\r\n       uint8_t RESERVED_1[8];\r\n  __IO uint32_t BOD;                               /**< BOD register, offset: 0x5C */\r\n  __IO uint32_t MEM_CFG;                           /**< mem configuration register, offset: 0x60 */\r\n  __IO uint32_t RESET_DISABLE;                     /**< reset disable register, offset: 0x64 */\r\n  __IO uint32_t WLAN_CTRL;                         /**< WLAN Control Register, offset: 0x68 */\r\n  __IO uint32_t BLE_CTRL;                          /**< BLEControl Register, offset: 0x6C */\r\n  __IO uint32_t CLK_AON;                           /**< Always on Domain Clock select, offset: 0x70 */\r\n  __IO uint32_t SOC_MEM_PDWN;                      /**< soc mem pdwn register, offset: 0x74 */\r\n       uint8_t RESERVED_2[8];\r\n  __IO uint32_t AON_PAD_OUT_CTRL;                  /**< aon pad out control, offset: 0x80 */\r\n  __IO uint32_t WAKEUP_PM2_MASK0;                  /**< Wakeup PM2 state Mask Interrupt Register, offset: 0x84 */\r\n  __IO uint32_t WAKEUP_PM2_MASK1;                  /**< Wakeup PM2 state Mask Interrupt Register, offset: 0x88 */\r\n       uint8_t RESERVED_3[4];\r\n  __IO uint32_t WAKEUP_PM2_MASK3;                  /**< Wakeup PM2 state Mask Interrupt Register, offset: 0x90 */\r\n  __I  uint32_t WAKEUP_PM2_STATUS0;                /**< Wakeup PM2 status Register, offset: 0x94 */\r\n  __I  uint32_t WAKEUP_PM2_STATUS1;                /**< Wakeup PM2 status Register, offset: 0x98 */\r\n       uint8_t RESERVED_4[4];\r\n  __I  uint32_t WAKEUP_PM2_STATUS3;                /**< WAKEUP_PM2_STATUS3, offset: 0xA0 */\r\n  __IO uint32_t WAKEUP_PM2_SRC_CLR0;               /**< Wakeup PM2 source clear Register, offset: 0xA4 */\r\n  __IO uint32_t WAKEUP_PM2_SRC_CLR1;               /**< Wakeup PM2 source clear Register, offset: 0xA8 */\r\n       uint8_t RESERVED_5[4];\r\n  __IO uint32_t WAKEUP_PM2_SRC_CLR3;               /**< Wakeup PM2 source clear Register, offset: 0xB0 */\r\n       uint8_t RESERVED_6[4];\r\n  __IO uint32_t SW_CTRL_WL;                        /**< WL part-SW Control register bypass HW output, offset: 0xB8 */\r\n  __IO uint32_t SW_CTRL_BLE;                       /**< BLE part-SW Control register bypass HW output, offset: 0xBC */\r\n       uint8_t RESERVED_7[76];\r\n  __IO uint32_t PSW18_OTP;                         /**< PSW18 OTP psw control signal, offset: 0x10C */\r\n  __IO uint32_t TIME_OUT_CTRL;                     /**< tieme out control signal, offset: 0x110 */\r\n  __IO uint32_t TIME_OUT_CFG_VALUE;                /**< tieme out configure value, offset: 0x114 */\r\n       uint8_t RESERVED_8[12];\r\n  __IO uint32_t RESERVE_REG0;                      /**< reserve R/W regs, offset: 0x124 */\r\n  __I  uint32_t RESERVE_REG1;                      /**< reserve Read only regs, offset: 0x128 */\r\n} PMU_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- PMU Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup PMU_Register_Masks PMU Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name PWR_MODE - Power mode control register */\r\n/*! @{ */\r\n\r\n#define PMU_PWR_MODE_PWR_MODE_MASK               (0x3U)\r\n#define PMU_PWR_MODE_PWR_MODE_SHIFT              (0U)\r\n/*! PWR_MODE - Power mode switch\r\n *  0b00..PM0 or PM1\r\n *  0b01..PM2\r\n *  0b10..PM3\r\n *  0b11..PM4\r\n */\r\n#define PMU_PWR_MODE_PWR_MODE(x)                 (((uint32_t)(((uint32_t)(x)) << PMU_PWR_MODE_PWR_MODE_SHIFT)) & PMU_PWR_MODE_PWR_MODE_MASK)\r\n/*! @} */\r\n\r\n/*! @name PWR_MODE_STATUS - Power mode status register */\r\n/*! @{ */\r\n\r\n#define PMU_PWR_MODE_STATUS_PWR_MODE_STATUS_MASK (0x3U)\r\n#define PMU_PWR_MODE_STATUS_PWR_MODE_STATUS_SHIFT (0U)\r\n/*! PWR_MODE_STATUS - Power mode status\r\n *  0b00..PM0 or PM1\r\n *  0b01..\r\n *  0b10..\r\n *  0b11..\r\n */\r\n#define PMU_PWR_MODE_STATUS_PWR_MODE_STATUS(x)   (((uint32_t)(((uint32_t)(x)) << PMU_PWR_MODE_STATUS_PWR_MODE_STATUS_SHIFT)) & PMU_PWR_MODE_STATUS_PWR_MODE_STATUS_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYS_RST_EN - sys reset enable resister */\r\n/*! @{ */\r\n\r\n#define PMU_SYS_RST_EN_CM33_SYSRESETREQ_EN_MASK  (0x1U)\r\n#define PMU_SYS_RST_EN_CM33_SYSRESETREQ_EN_SHIFT (0U)\r\n/*! CM33_SYSRESETREQ_EN - cm33_sysresetreq reset enable */\r\n#define PMU_SYS_RST_EN_CM33_SYSRESETREQ_EN(x)    (((uint32_t)(((uint32_t)(x)) << PMU_SYS_RST_EN_CM33_SYSRESETREQ_EN_SHIFT)) & PMU_SYS_RST_EN_CM33_SYSRESETREQ_EN_MASK)\r\n\r\n#define PMU_SYS_RST_EN_CM33_LOCKUP_EN_MASK       (0x2U)\r\n#define PMU_SYS_RST_EN_CM33_LOCKUP_EN_SHIFT      (1U)\r\n/*! CM33_LOCKUP_EN - cm33_lockup reset enable */\r\n#define PMU_SYS_RST_EN_CM33_LOCKUP_EN(x)         (((uint32_t)(((uint32_t)(x)) << PMU_SYS_RST_EN_CM33_LOCKUP_EN_SHIFT)) & PMU_SYS_RST_EN_CM33_LOCKUP_EN_MASK)\r\n\r\n#define PMU_SYS_RST_EN_WDT_EN_MASK               (0x4U)\r\n#define PMU_SYS_RST_EN_WDT_EN_SHIFT              (2U)\r\n/*! WDT_EN - wdt rst enable */\r\n#define PMU_SYS_RST_EN_WDT_EN(x)                 (((uint32_t)(((uint32_t)(x)) << PMU_SYS_RST_EN_WDT_EN_SHIFT)) & PMU_SYS_RST_EN_WDT_EN_MASK)\r\n\r\n#define PMU_SYS_RST_EN_AP_SYSRESETREQ_EN_MASK    (0x8U)\r\n#define PMU_SYS_RST_EN_AP_SYSRESETREQ_EN_SHIFT   (3U)\r\n/*! AP_SYSRESETREQ_EN - ap_sysresetreq rst enable */\r\n#define PMU_SYS_RST_EN_AP_SYSRESETREQ_EN(x)      (((uint32_t)(((uint32_t)(x)) << PMU_SYS_RST_EN_AP_SYSRESETREQ_EN_SHIFT)) & PMU_SYS_RST_EN_AP_SYSRESETREQ_EN_MASK)\r\n\r\n#define PMU_SYS_RST_EN_CODE_WDT_EN_MASK          (0x10U)\r\n#define PMU_SYS_RST_EN_CODE_WDT_EN_SHIFT         (4U)\r\n/*! CODE_WDT_EN - code_wdt rst enable */\r\n#define PMU_SYS_RST_EN_CODE_WDT_EN(x)            (((uint32_t)(((uint32_t)(x)) << PMU_SYS_RST_EN_CODE_WDT_EN_SHIFT)) & PMU_SYS_RST_EN_CODE_WDT_EN_MASK)\r\n\r\n#define PMU_SYS_RST_EN_ITRC_EN_MASK              (0x20U)\r\n#define PMU_SYS_RST_EN_ITRC_EN_SHIFT             (5U)\r\n/*! ITRC_EN - itrc_chip rst enable */\r\n#define PMU_SYS_RST_EN_ITRC_EN(x)                (((uint32_t)(((uint32_t)(x)) << PMU_SYS_RST_EN_ITRC_EN_SHIFT)) & PMU_SYS_RST_EN_ITRC_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYS_RST_STATUS - Reset status Register */\r\n/*! @{ */\r\n\r\n#define PMU_SYS_RST_STATUS_CM33_SYSRESETREQ_MASK (0x1U)\r\n#define PMU_SYS_RST_STATUS_CM33_SYSRESETREQ_SHIFT (0U)\r\n/*! CM33_SYSRESETREQ - CM4 System software reset request\r\n *  0b0..reset cause is not system software reset request\r\n *  0b1..reset cause is system software reset request\r\n */\r\n#define PMU_SYS_RST_STATUS_CM33_SYSRESETREQ(x)   (((uint32_t)(((uint32_t)(x)) << PMU_SYS_RST_STATUS_CM33_SYSRESETREQ_SHIFT)) & PMU_SYS_RST_STATUS_CM33_SYSRESETREQ_MASK)\r\n\r\n#define PMU_SYS_RST_STATUS_CM33_LOCKUP_MASK      (0x2U)\r\n#define PMU_SYS_RST_STATUS_CM33_LOCKUP_SHIFT     (1U)\r\n/*! CM33_LOCKUP - CM4 Lockup\r\n *  0b0..reset cause is not lockup\r\n *  0b1..reset cause is lockup\r\n */\r\n#define PMU_SYS_RST_STATUS_CM33_LOCKUP(x)        (((uint32_t)(((uint32_t)(x)) << PMU_SYS_RST_STATUS_CM33_LOCKUP_SHIFT)) & PMU_SYS_RST_STATUS_CM33_LOCKUP_MASK)\r\n\r\n#define PMU_SYS_RST_STATUS_WDT_RST_MASK          (0x4U)\r\n#define PMU_SYS_RST_STATUS_WDT_RST_SHIFT         (2U)\r\n/*! WDT_RST - WDT Reset\r\n *  0b0..reset cause is not watchdog timer\r\n *  0b1..reset cause is watchdog timer\r\n */\r\n#define PMU_SYS_RST_STATUS_WDT_RST(x)            (((uint32_t)(((uint32_t)(x)) << PMU_SYS_RST_STATUS_WDT_RST_SHIFT)) & PMU_SYS_RST_STATUS_WDT_RST_MASK)\r\n\r\n#define PMU_SYS_RST_STATUS_AP_SYSRESETREQ_MASK   (0x8U)\r\n#define PMU_SYS_RST_STATUS_AP_SYSRESETREQ_SHIFT  (3U)\r\n/*! AP_SYSRESETREQ - Debug mailbox Reset\r\n *  0b0..reset cause is not ap_sysresetreq\r\n *  0b1..reset cause is ap_sysresetreq\r\n */\r\n#define PMU_SYS_RST_STATUS_AP_SYSRESETREQ(x)     (((uint32_t)(((uint32_t)(x)) << PMU_SYS_RST_STATUS_AP_SYSRESETREQ_SHIFT)) & PMU_SYS_RST_STATUS_AP_SYSRESETREQ_MASK)\r\n\r\n#define PMU_SYS_RST_STATUS_CODE_WDT_RST_MASK     (0x10U)\r\n#define PMU_SYS_RST_STATUS_CODE_WDT_RST_SHIFT    (4U)\r\n/*! CODE_WDT_RST - CODE_WDT Reset\r\n *  0b0..reset cause is not code watchdog timer\r\n *  0b1..reset cause is code watchdog timer\r\n */\r\n#define PMU_SYS_RST_STATUS_CODE_WDT_RST(x)       (((uint32_t)(((uint32_t)(x)) << PMU_SYS_RST_STATUS_CODE_WDT_RST_SHIFT)) & PMU_SYS_RST_STATUS_CODE_WDT_RST_MASK)\r\n\r\n#define PMU_SYS_RST_STATUS_ITRC_CHIP_RST_MASK    (0x20U)\r\n#define PMU_SYS_RST_STATUS_ITRC_CHIP_RST_SHIFT   (5U)\r\n/*! ITRC_CHIP_RST - ITRC_CHIP Reset\r\n *  0b0..reset cause is not itrc chip reset\r\n *  0b1..reset cause is itrc chip reset\r\n */\r\n#define PMU_SYS_RST_STATUS_ITRC_CHIP_RST(x)      (((uint32_t)(((uint32_t)(x)) << PMU_SYS_RST_STATUS_ITRC_CHIP_RST_SHIFT)) & PMU_SYS_RST_STATUS_ITRC_CHIP_RST_MASK)\r\n\r\n#define PMU_SYS_RST_STATUS_SW_RESETB_SCANTEST_MASK (0x40U)\r\n#define PMU_SYS_RST_STATUS_SW_RESETB_SCANTEST_SHIFT (6U)\r\n/*! SW_RESETB_SCANTEST - sw_resetb_scantest Reset\r\n *  0b0..reset cause is not sw_resetb_scantest reset\r\n *  0b1..reset cause is sw_resetb_scantest reset\r\n */\r\n#define PMU_SYS_RST_STATUS_SW_RESETB_SCANTEST(x) (((uint32_t)(((uint32_t)(x)) << PMU_SYS_RST_STATUS_SW_RESETB_SCANTEST_SHIFT)) & PMU_SYS_RST_STATUS_SW_RESETB_SCANTEST_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYS_RST_CLR - sys reset clear resister */\r\n/*! @{ */\r\n\r\n#define PMU_SYS_RST_CLR_CM33_SYSRESETREQ_CLR_MASK (0x1U)\r\n#define PMU_SYS_RST_CLR_CM33_SYSRESETREQ_CLR_SHIFT (0U)\r\n/*! CM33_SYSRESETREQ_CLR - cm33_sysresetreq reset clear */\r\n#define PMU_SYS_RST_CLR_CM33_SYSRESETREQ_CLR(x)  (((uint32_t)(((uint32_t)(x)) << PMU_SYS_RST_CLR_CM33_SYSRESETREQ_CLR_SHIFT)) & PMU_SYS_RST_CLR_CM33_SYSRESETREQ_CLR_MASK)\r\n\r\n#define PMU_SYS_RST_CLR_CM33_LOCKUP_CLR_MASK     (0x2U)\r\n#define PMU_SYS_RST_CLR_CM33_LOCKUP_CLR_SHIFT    (1U)\r\n/*! CM33_LOCKUP_CLR - cm33_lockup reset clear */\r\n#define PMU_SYS_RST_CLR_CM33_LOCKUP_CLR(x)       (((uint32_t)(((uint32_t)(x)) << PMU_SYS_RST_CLR_CM33_LOCKUP_CLR_SHIFT)) & PMU_SYS_RST_CLR_CM33_LOCKUP_CLR_MASK)\r\n\r\n#define PMU_SYS_RST_CLR_WDT_CLR_MASK             (0x4U)\r\n#define PMU_SYS_RST_CLR_WDT_CLR_SHIFT            (2U)\r\n/*! WDT_CLR - wdt rst clear */\r\n#define PMU_SYS_RST_CLR_WDT_CLR(x)               (((uint32_t)(((uint32_t)(x)) << PMU_SYS_RST_CLR_WDT_CLR_SHIFT)) & PMU_SYS_RST_CLR_WDT_CLR_MASK)\r\n\r\n#define PMU_SYS_RST_CLR_AP_SYSRESETREQ_CLR_MASK  (0x8U)\r\n#define PMU_SYS_RST_CLR_AP_SYSRESETREQ_CLR_SHIFT (3U)\r\n/*! AP_SYSRESETREQ_CLR - ap_sysresetreq rst clear */\r\n#define PMU_SYS_RST_CLR_AP_SYSRESETREQ_CLR(x)    (((uint32_t)(((uint32_t)(x)) << PMU_SYS_RST_CLR_AP_SYSRESETREQ_CLR_SHIFT)) & PMU_SYS_RST_CLR_AP_SYSRESETREQ_CLR_MASK)\r\n\r\n#define PMU_SYS_RST_CLR_CODE_WDT_CLR_MASK        (0x10U)\r\n#define PMU_SYS_RST_CLR_CODE_WDT_CLR_SHIFT       (4U)\r\n/*! CODE_WDT_CLR - code_wdt rst clear */\r\n#define PMU_SYS_RST_CLR_CODE_WDT_CLR(x)          (((uint32_t)(((uint32_t)(x)) << PMU_SYS_RST_CLR_CODE_WDT_CLR_SHIFT)) & PMU_SYS_RST_CLR_CODE_WDT_CLR_MASK)\r\n\r\n#define PMU_SYS_RST_CLR_ITRC_CLR_MASK            (0x20U)\r\n#define PMU_SYS_RST_CLR_ITRC_CLR_SHIFT           (5U)\r\n/*! ITRC_CLR - itrc chip rst clear */\r\n#define PMU_SYS_RST_CLR_ITRC_CLR(x)              (((uint32_t)(((uint32_t)(x)) << PMU_SYS_RST_CLR_ITRC_CLR_SHIFT)) & PMU_SYS_RST_CLR_ITRC_CLR_MASK)\r\n\r\n#define PMU_SYS_RST_CLR_SW_RESETB_SCANTEST_CLR_MASK (0x40U)\r\n#define PMU_SYS_RST_CLR_SW_RESETB_SCANTEST_CLR_SHIFT (6U)\r\n/*! SW_RESETB_SCANTEST_CLR - sw_resetb_scantest rst clear */\r\n#define PMU_SYS_RST_CLR_SW_RESETB_SCANTEST_CLR(x) (((uint32_t)(((uint32_t)(x)) << PMU_SYS_RST_CLR_SW_RESETB_SCANTEST_CLR_SHIFT)) & PMU_SYS_RST_CLR_SW_RESETB_SCANTEST_CLR_MASK)\r\n/*! @} */\r\n\r\n/*! @name WAKEUP_LEVEL - Wakeup Level Register */\r\n/*! @{ */\r\n\r\n#define PMU_WAKEUP_LEVEL_PIN0_MASK               (0x1U)\r\n#define PMU_WAKEUP_LEVEL_PIN0_SHIFT              (0U)\r\n/*! PIN0 - 0 = connect to gound wake up\r\n *  0b1..connect to VDDO wake up\r\n */\r\n#define PMU_WAKEUP_LEVEL_PIN0(x)                 (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_LEVEL_PIN0_SHIFT)) & PMU_WAKEUP_LEVEL_PIN0_MASK)\r\n\r\n#define PMU_WAKEUP_LEVEL_PIN1_MASK               (0x2U)\r\n#define PMU_WAKEUP_LEVEL_PIN1_SHIFT              (1U)\r\n/*! PIN1 - 0 = connect to gound wake up\r\n *  0b1..connect to VDDO wake up\r\n */\r\n#define PMU_WAKEUP_LEVEL_PIN1(x)                 (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_LEVEL_PIN1_SHIFT)) & PMU_WAKEUP_LEVEL_PIN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name WAKEUP_MASK - Wakeup Mask Interrupt Register */\r\n/*! @{ */\r\n\r\n#define PMU_WAKEUP_MASK_PIN0_MASK_MASK           (0x1U)\r\n#define PMU_WAKEUP_MASK_PIN0_MASK_SHIFT          (0U)\r\n/*! PIN0_MASK - Pin0 Wakeup Mask\r\n *  0b0..mask pin0 wakeup interrupt\r\n *  0b1..unmask pin0 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_MASK_PIN0_MASK(x)             (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_MASK_PIN0_MASK_SHIFT)) & PMU_WAKEUP_MASK_PIN0_MASK_MASK)\r\n\r\n#define PMU_WAKEUP_MASK_PIN1_MASK_MASK           (0x2U)\r\n#define PMU_WAKEUP_MASK_PIN1_MASK_SHIFT          (1U)\r\n/*! PIN1_MASK - Pin1 Wakeup Mask\r\n *  0b0..mask pin1 wakeup interrupt\r\n *  0b1..unmask pin1 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_MASK_PIN1_MASK(x)             (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_MASK_PIN1_MASK_SHIFT)) & PMU_WAKEUP_MASK_PIN1_MASK_MASK)\r\n\r\n#define PMU_WAKEUP_MASK_RTC_MASK_MASK            (0x4U)\r\n#define PMU_WAKEUP_MASK_RTC_MASK_SHIFT           (2U)\r\n/*! RTC_MASK - RTC Wakeup Mask\r\n *  0b0..mask RTC wakeup interrupt\r\n *  0b1..unmask RTC wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_MASK_RTC_MASK(x)              (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_MASK_RTC_MASK_SHIFT)) & PMU_WAKEUP_MASK_RTC_MASK_MASK)\r\n\r\n#define PMU_WAKEUP_MASK_CAPT_MASK_MASK           (0x10U)\r\n#define PMU_WAKEUP_MASK_CAPT_MASK_SHIFT          (4U)\r\n/*! CAPT_MASK - capture pulse Wakeup Mask\r\n *  0b0..mask capt wakeup interrupt\r\n *  0b1..unmask capt wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_MASK_CAPT_MASK(x)             (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_MASK_CAPT_MASK_SHIFT)) & PMU_WAKEUP_MASK_CAPT_MASK_MASK)\r\n\r\n#define PMU_WAKEUP_MASK_WL_MASK_MASK             (0x60U)\r\n#define PMU_WAKEUP_MASK_WL_MASK_SHIFT            (5U)\r\n/*! WL_MASK - WLAN Wakeup Mask\r\n *  0b00..mask WLAN wakeup interrupt\r\n *  0b01..unmask WLAN wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_MASK_WL_MASK(x)               (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_MASK_WL_MASK_SHIFT)) & PMU_WAKEUP_MASK_WL_MASK_MASK)\r\n\r\n#define PMU_WAKEUP_MASK_BLE_MASK_MASK            (0x180U)\r\n#define PMU_WAKEUP_MASK_BLE_MASK_SHIFT           (7U)\r\n/*! BLE_MASK - BLE Wakeup Mask\r\n *  0b00..mask BLE wakeup interrupt\r\n *  0b01..unmask BLE wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_MASK_BLE_MASK(x)              (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_MASK_BLE_MASK_SHIFT)) & PMU_WAKEUP_MASK_BLE_MASK_MASK)\r\n\r\n#define PMU_WAKEUP_MASK_BOD1_MASK_MASK           (0x200U)\r\n#define PMU_WAKEUP_MASK_BOD1_MASK_SHIFT          (9U)\r\n/*! BOD1_MASK - bod1 Wakeup Mask\r\n *  0b0..mask bod1 wakeup interrupt\r\n *  0b1..unmask bod1 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_MASK_BOD1_MASK(x)             (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_MASK_BOD1_MASK_SHIFT)) & PMU_WAKEUP_MASK_BOD1_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name WAKEUP_STATUS - Wakeup status register */\r\n/*! @{ */\r\n\r\n#define PMU_WAKEUP_STATUS_PIN0_MASK              (0x1U)\r\n#define PMU_WAKEUP_STATUS_PIN0_SHIFT             (0U)\r\n/*! PIN0 - External Pin0 wakeup status */\r\n#define PMU_WAKEUP_STATUS_PIN0(x)                (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_STATUS_PIN0_SHIFT)) & PMU_WAKEUP_STATUS_PIN0_MASK)\r\n\r\n#define PMU_WAKEUP_STATUS_PIN1_MASK              (0x2U)\r\n#define PMU_WAKEUP_STATUS_PIN1_SHIFT             (1U)\r\n/*! PIN1 - External Pin1 wakeup status */\r\n#define PMU_WAKEUP_STATUS_PIN1(x)                (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_STATUS_PIN1_SHIFT)) & PMU_WAKEUP_STATUS_PIN1_MASK)\r\n\r\n#define PMU_WAKEUP_STATUS_RTC_MASK               (0x4U)\r\n#define PMU_WAKEUP_STATUS_RTC_SHIFT              (2U)\r\n/*! RTC - RTC wakeup status */\r\n#define PMU_WAKEUP_STATUS_RTC(x)                 (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_STATUS_RTC_SHIFT)) & PMU_WAKEUP_STATUS_RTC_MASK)\r\n\r\n#define PMU_WAKEUP_STATUS_CAPT_MASK              (0x10U)\r\n#define PMU_WAKEUP_STATUS_CAPT_SHIFT             (4U)\r\n/*! CAPT - capt interrupt wakeup status */\r\n#define PMU_WAKEUP_STATUS_CAPT(x)                (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_STATUS_CAPT_SHIFT)) & PMU_WAKEUP_STATUS_CAPT_MASK)\r\n\r\n#define PMU_WAKEUP_STATUS_WL_MASK                (0x60U)\r\n#define PMU_WAKEUP_STATUS_WL_SHIFT               (5U)\r\n/*! WL - WL interrupt wakeup status */\r\n#define PMU_WAKEUP_STATUS_WL(x)                  (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_STATUS_WL_SHIFT)) & PMU_WAKEUP_STATUS_WL_MASK)\r\n\r\n#define PMU_WAKEUP_STATUS_BLE_MASK               (0x180U)\r\n#define PMU_WAKEUP_STATUS_BLE_SHIFT              (7U)\r\n/*! BLE - BLE interrupt wakeup status */\r\n#define PMU_WAKEUP_STATUS_BLE(x)                 (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_STATUS_BLE_SHIFT)) & PMU_WAKEUP_STATUS_BLE_MASK)\r\n\r\n#define PMU_WAKEUP_STATUS_BOD1_MASK              (0x200U)\r\n#define PMU_WAKEUP_STATUS_BOD1_SHIFT             (9U)\r\n/*! BOD1 - bod1 wakeup status */\r\n#define PMU_WAKEUP_STATUS_BOD1(x)                (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_STATUS_BOD1_SHIFT)) & PMU_WAKEUP_STATUS_BOD1_MASK)\r\n/*! @} */\r\n\r\n/*! @name WAKE_SRC_CLR - Wake up source clear register */\r\n/*! @{ */\r\n\r\n#define PMU_WAKE_SRC_CLR_PIN0_CLR_MASK           (0x1U)\r\n#define PMU_WAKE_SRC_CLR_PIN0_CLR_SHIFT          (0U)\r\n/*! PIN0_CLR - Clear Pin0 interrupt request */\r\n#define PMU_WAKE_SRC_CLR_PIN0_CLR(x)             (((uint32_t)(((uint32_t)(x)) << PMU_WAKE_SRC_CLR_PIN0_CLR_SHIFT)) & PMU_WAKE_SRC_CLR_PIN0_CLR_MASK)\r\n\r\n#define PMU_WAKE_SRC_CLR_PIN1_CLR_MASK           (0x2U)\r\n#define PMU_WAKE_SRC_CLR_PIN1_CLR_SHIFT          (1U)\r\n/*! PIN1_CLR - Clear Pin1 interrupt request */\r\n#define PMU_WAKE_SRC_CLR_PIN1_CLR(x)             (((uint32_t)(((uint32_t)(x)) << PMU_WAKE_SRC_CLR_PIN1_CLR_SHIFT)) & PMU_WAKE_SRC_CLR_PIN1_CLR_MASK)\r\n\r\n#define PMU_WAKE_SRC_CLR_RTC_CLR_MASK            (0x4U)\r\n#define PMU_WAKE_SRC_CLR_RTC_CLR_SHIFT           (2U)\r\n/*! RTC_CLR - Clear RTC interrupt request */\r\n#define PMU_WAKE_SRC_CLR_RTC_CLR(x)              (((uint32_t)(((uint32_t)(x)) << PMU_WAKE_SRC_CLR_RTC_CLR_SHIFT)) & PMU_WAKE_SRC_CLR_RTC_CLR_MASK)\r\n\r\n#define PMU_WAKE_SRC_CLR_CAPT_CLR_MASK           (0x10U)\r\n#define PMU_WAKE_SRC_CLR_CAPT_CLR_SHIFT          (4U)\r\n/*! CAPT_CLR - Clear capture interrupt request */\r\n#define PMU_WAKE_SRC_CLR_CAPT_CLR(x)             (((uint32_t)(((uint32_t)(x)) << PMU_WAKE_SRC_CLR_CAPT_CLR_SHIFT)) & PMU_WAKE_SRC_CLR_CAPT_CLR_MASK)\r\n\r\n#define PMU_WAKE_SRC_CLR_WL_CLR_MASK             (0x60U)\r\n#define PMU_WAKE_SRC_CLR_WL_CLR_SHIFT            (5U)\r\n/*! WL_CLR - Clear WL interrupt request */\r\n#define PMU_WAKE_SRC_CLR_WL_CLR(x)               (((uint32_t)(((uint32_t)(x)) << PMU_WAKE_SRC_CLR_WL_CLR_SHIFT)) & PMU_WAKE_SRC_CLR_WL_CLR_MASK)\r\n\r\n#define PMU_WAKE_SRC_CLR_BLE_CLR_MASK            (0x180U)\r\n#define PMU_WAKE_SRC_CLR_BLE_CLR_SHIFT           (7U)\r\n/*! BLE_CLR - Clear BLE interrupt request */\r\n#define PMU_WAKE_SRC_CLR_BLE_CLR(x)              (((uint32_t)(((uint32_t)(x)) << PMU_WAKE_SRC_CLR_BLE_CLR_SHIFT)) & PMU_WAKE_SRC_CLR_BLE_CLR_MASK)\r\n\r\n#define PMU_WAKE_SRC_CLR_BOD1_CLR_MASK           (0x200U)\r\n#define PMU_WAKE_SRC_CLR_BOD1_CLR_SHIFT          (9U)\r\n/*! BOD1_CLR - Clear bod1 interrupt request */\r\n#define PMU_WAKE_SRC_CLR_BOD1_CLR(x)             (((uint32_t)(((uint32_t)(x)) << PMU_WAKE_SRC_CLR_BOD1_CLR_SHIFT)) & PMU_WAKE_SRC_CLR_BOD1_CLR_MASK)\r\n/*! @} */\r\n\r\n/*! @name WL_BLE_WAKEUP_DONE - Wake up done register */\r\n/*! @{ */\r\n\r\n#define PMU_WL_BLE_WAKEUP_DONE_WL_DONE_BIT0_MASK (0x20U)\r\n#define PMU_WL_BLE_WAKEUP_DONE_WL_DONE_BIT0_SHIFT (5U)\r\n/*! WL_DONE_BIT0 - WL wake up MCI done bit0 signal */\r\n#define PMU_WL_BLE_WAKEUP_DONE_WL_DONE_BIT0(x)   (((uint32_t)(((uint32_t)(x)) << PMU_WL_BLE_WAKEUP_DONE_WL_DONE_BIT0_SHIFT)) & PMU_WL_BLE_WAKEUP_DONE_WL_DONE_BIT0_MASK)\r\n\r\n#define PMU_WL_BLE_WAKEUP_DONE_WL_DONE_BIT1_MASK (0x40U)\r\n#define PMU_WL_BLE_WAKEUP_DONE_WL_DONE_BIT1_SHIFT (6U)\r\n/*! WL_DONE_BIT1 - WL wake up MCI done bit1 signal */\r\n#define PMU_WL_BLE_WAKEUP_DONE_WL_DONE_BIT1(x)   (((uint32_t)(((uint32_t)(x)) << PMU_WL_BLE_WAKEUP_DONE_WL_DONE_BIT1_SHIFT)) & PMU_WL_BLE_WAKEUP_DONE_WL_DONE_BIT1_MASK)\r\n\r\n#define PMU_WL_BLE_WAKEUP_DONE_BLE_DONE_BIT0_MASK (0x80U)\r\n#define PMU_WL_BLE_WAKEUP_DONE_BLE_DONE_BIT0_SHIFT (7U)\r\n/*! BLE_DONE_BIT0 - BLE wake up MCI done signal */\r\n#define PMU_WL_BLE_WAKEUP_DONE_BLE_DONE_BIT0(x)  (((uint32_t)(((uint32_t)(x)) << PMU_WL_BLE_WAKEUP_DONE_BLE_DONE_BIT0_SHIFT)) & PMU_WL_BLE_WAKEUP_DONE_BLE_DONE_BIT0_MASK)\r\n\r\n#define PMU_WL_BLE_WAKEUP_DONE_BLE_DONE_BIT1_MASK (0x100U)\r\n#define PMU_WL_BLE_WAKEUP_DONE_BLE_DONE_BIT1_SHIFT (8U)\r\n/*! BLE_DONE_BIT1 - BLE wake up MCI done signal */\r\n#define PMU_WL_BLE_WAKEUP_DONE_BLE_DONE_BIT1(x)  (((uint32_t)(((uint32_t)(x)) << PMU_WL_BLE_WAKEUP_DONE_BLE_DONE_BIT1_SHIFT)) & PMU_WL_BLE_WAKEUP_DONE_BLE_DONE_BIT1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CAU_SLP_CTRL - CAU sleep clock control register */\r\n/*! @{ */\r\n\r\n#define PMU_CAU_SLP_CTRL_SOC_SLP_RDY_MASK        (0x2U)\r\n#define PMU_CAU_SLP_CTRL_SOC_SLP_RDY_SHIFT       (1U)\r\n/*! SOC_SLP_RDY - CAU_SOC_SLP_REF_GEN_CLK is ready */\r\n#define PMU_CAU_SLP_CTRL_SOC_SLP_RDY(x)          (((uint32_t)(((uint32_t)(x)) << PMU_CAU_SLP_CTRL_SOC_SLP_RDY_SHIFT)) & PMU_CAU_SLP_CTRL_SOC_SLP_RDY_MASK)\r\n\r\n#define PMU_CAU_SLP_CTRL_CAU_SOC_SLP_CG_MASK     (0x4U)\r\n#define PMU_CAU_SLP_CTRL_CAU_SOC_SLP_CG_SHIFT    (2U)\r\n/*! CAU_SOC_SLP_CG - gate cau_soc_slp_ref_gen_clk */\r\n#define PMU_CAU_SLP_CTRL_CAU_SOC_SLP_CG(x)       (((uint32_t)(((uint32_t)(x)) << PMU_CAU_SLP_CTRL_CAU_SOC_SLP_CG_SHIFT)) & PMU_CAU_SLP_CTRL_CAU_SOC_SLP_CG_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOC_CIU_RDY - soc_ciu_rdy register */\r\n/*! @{ */\r\n\r\n#define PMU_SOC_CIU_RDY_VAL_MASK                 (0x4U)\r\n#define PMU_SOC_CIU_RDY_VAL_SHIFT                (2U)\r\n/*! VAL - indicate soc IO strap finish, boot rom can read strap value */\r\n#define PMU_SOC_CIU_RDY_VAL(x)                   (((uint32_t)(((uint32_t)(x)) << PMU_SOC_CIU_RDY_VAL_SHIFT)) & PMU_SOC_CIU_RDY_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CAPT_PULSE - pulse in register */\r\n/*! @{ */\r\n\r\n#define PMU_CAPT_PULSE_CAPTURE_SLOW_PULSE_CNT_EN_MASK (0x1U)\r\n#define PMU_CAPT_PULSE_CAPTURE_SLOW_PULSE_CNT_EN_SHIFT (0U)\r\n/*! CAPTURE_SLOW_PULSE_CNT_EN - enable signal */\r\n#define PMU_CAPT_PULSE_CAPTURE_SLOW_PULSE_CNT_EN(x) (((uint32_t)(((uint32_t)(x)) << PMU_CAPT_PULSE_CAPTURE_SLOW_PULSE_CNT_EN_SHIFT)) & PMU_CAPT_PULSE_CAPTURE_SLOW_PULSE_CNT_EN_MASK)\r\n\r\n#define PMU_CAPT_PULSE_CAPTURE_FAST_PULSE_CNT_EN_MASK (0x2U)\r\n#define PMU_CAPT_PULSE_CAPTURE_FAST_PULSE_CNT_EN_SHIFT (1U)\r\n/*! CAPTURE_FAST_PULSE_CNT_EN - enable signal */\r\n#define PMU_CAPT_PULSE_CAPTURE_FAST_PULSE_CNT_EN(x) (((uint32_t)(((uint32_t)(x)) << PMU_CAPT_PULSE_CAPTURE_FAST_PULSE_CNT_EN_SHIFT)) & PMU_CAPT_PULSE_CAPTURE_FAST_PULSE_CNT_EN_MASK)\r\n\r\n#define PMU_CAPT_PULSE_IC_EDGE_CLK_CNT_MASK      (0xCU)\r\n#define PMU_CAPT_PULSE_IC_EDGE_CLK_CNT_SHIFT     (2U)\r\n/*! IC_EDGE_CLK_CNT - when capture_slow_pulse_cnt_en=1, indicate the trigger condition of counter,\r\n *    0: rising edge 1: falling edge ; others: both\r\n */\r\n#define PMU_CAPT_PULSE_IC_EDGE_CLK_CNT(x)        (((uint32_t)(((uint32_t)(x)) << PMU_CAPT_PULSE_IC_EDGE_CLK_CNT_SHIFT)) & PMU_CAPT_PULSE_IC_EDGE_CLK_CNT_MASK)\r\n\r\n#define PMU_CAPT_PULSE_IC_WIDTH_CLK_CNT_MASK     (0x70U)\r\n#define PMU_CAPT_PULSE_IC_WIDTH_CLK_CNT_SHIFT    (4U)\r\n/*! IC_WIDTH_CLK_CNT - Input Capture Filter Width only used when capture_slow_pulse_cnt_en=1 */\r\n#define PMU_CAPT_PULSE_IC_WIDTH_CLK_CNT(x)       (((uint32_t)(((uint32_t)(x)) << PMU_CAPT_PULSE_IC_WIDTH_CLK_CNT_SHIFT)) & PMU_CAPT_PULSE_IC_WIDTH_CLK_CNT_MASK)\r\n\r\n#define PMU_CAPT_PULSE_IRQ_CLR_MASK              (0x80U)\r\n#define PMU_CAPT_PULSE_IRQ_CLR_SHIFT             (7U)\r\n/*! IRQ_CLR - clear the interrupt and wakeup */\r\n#define PMU_CAPT_PULSE_IRQ_CLR(x)                (((uint32_t)(((uint32_t)(x)) << PMU_CAPT_PULSE_IRQ_CLR_SHIFT)) & PMU_CAPT_PULSE_IRQ_CLR_MASK)\r\n\r\n#define PMU_CAPT_PULSE_IRQ_STATUS_MASK           (0x100U)\r\n#define PMU_CAPT_PULSE_IRQ_STATUS_SHIFT          (8U)\r\n/*! IRQ_STATUS - interrupt status */\r\n#define PMU_CAPT_PULSE_IRQ_STATUS(x)             (((uint32_t)(((uint32_t)(x)) << PMU_CAPT_PULSE_IRQ_STATUS_SHIFT)) & PMU_CAPT_PULSE_IRQ_STATUS_MASK)\r\n\r\n#define PMU_CAPT_PULSE_IRQ_MSK_MASK              (0x200U)\r\n#define PMU_CAPT_PULSE_IRQ_MSK_SHIFT             (9U)\r\n/*! IRQ_MSK - only mask the interrupt */\r\n#define PMU_CAPT_PULSE_IRQ_MSK(x)                (((uint32_t)(((uint32_t)(x)) << PMU_CAPT_PULSE_IRQ_MSK_SHIFT)) & PMU_CAPT_PULSE_IRQ_MSK_MASK)\r\n\r\n#define PMU_CAPT_PULSE_CLK_SEL_MASK              (0x400U)\r\n#define PMU_CAPT_PULSE_CLK_SEL_SHIFT             (10U)\r\n/*! CLK_SEL - 0 choose 32k for slow capture,1 choose 3.84/4M for fast capture as functional clock */\r\n#define PMU_CAPT_PULSE_CLK_SEL(x)                (((uint32_t)(((uint32_t)(x)) << PMU_CAPT_PULSE_CLK_SEL_SHIFT)) & PMU_CAPT_PULSE_CLK_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CAPT_PULSE_BASE_VAL - capt_pulse_base_val */\r\n/*! @{ */\r\n\r\n#define PMU_CAPT_PULSE_BASE_VAL_CAPTURE_CNT_BASE_VAL_MASK (0xFFFFFFFFU)\r\n#define PMU_CAPT_PULSE_BASE_VAL_CAPTURE_CNT_BASE_VAL_SHIFT (0U)\r\n/*! CAPTURE_CNT_BASE_VAL - the counter reaches this register value, interrupt will be generated */\r\n#define PMU_CAPT_PULSE_BASE_VAL_CAPTURE_CNT_BASE_VAL(x) (((uint32_t)(((uint32_t)(x)) << PMU_CAPT_PULSE_BASE_VAL_CAPTURE_CNT_BASE_VAL_SHIFT)) & PMU_CAPT_PULSE_BASE_VAL_CAPTURE_CNT_BASE_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CAPT_PULSE_VAL - capt_pulse_val */\r\n/*! @{ */\r\n\r\n#define PMU_CAPT_PULSE_VAL_CAPTURE_CNT_VAL_MASK  (0xFFFFFFFFU)\r\n#define PMU_CAPT_PULSE_VAL_CAPTURE_CNT_VAL_SHIFT (0U)\r\n/*! CAPTURE_CNT_VAL - counter pulse value */\r\n#define PMU_CAPT_PULSE_VAL_CAPTURE_CNT_VAL(x)    (((uint32_t)(((uint32_t)(x)) << PMU_CAPT_PULSE_VAL_CAPTURE_CNT_VAL_SHIFT)) & PMU_CAPT_PULSE_VAL_CAPTURE_CNT_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name XTAL32K_CTRL - XTAL32k Control Register */\r\n/*! @{ */\r\n\r\n#define PMU_XTAL32K_CTRL_X32K_RDY_MASK           (0x1U)\r\n#define PMU_XTAL32K_CTRL_X32K_RDY_SHIFT          (0U)\r\n/*! X32K_RDY - Assert high when ready */\r\n#define PMU_XTAL32K_CTRL_X32K_RDY(x)             (((uint32_t)(((uint32_t)(x)) << PMU_XTAL32K_CTRL_X32K_RDY_SHIFT)) & PMU_XTAL32K_CTRL_X32K_RDY_MASK)\r\n\r\n#define PMU_XTAL32K_CTRL_X32K_STUP_ASSIST_MASK   (0x6U)\r\n#define PMU_XTAL32K_CTRL_X32K_STUP_ASSIST_SHIFT  (1U)\r\n/*! X32K_STUP_ASSIST - Use startup assist ckt for 32 kHz xosc */\r\n#define PMU_XTAL32K_CTRL_X32K_STUP_ASSIST(x)     (((uint32_t)(((uint32_t)(x)) << PMU_XTAL32K_CTRL_X32K_STUP_ASSIST_SHIFT)) & PMU_XTAL32K_CTRL_X32K_STUP_ASSIST_MASK)\r\n\r\n#define PMU_XTAL32K_CTRL_X32K_TEST_EN_MASK       (0x8U)\r\n#define PMU_XTAL32K_CTRL_X32K_TEST_EN_SHIFT      (3U)\r\n/*! X32K_TEST_EN - Test enabling for 32k xtal ckt */\r\n#define PMU_XTAL32K_CTRL_X32K_TEST_EN(x)         (((uint32_t)(((uint32_t)(x)) << PMU_XTAL32K_CTRL_X32K_TEST_EN_SHIFT)) & PMU_XTAL32K_CTRL_X32K_TEST_EN_MASK)\r\n\r\n#define PMU_XTAL32K_CTRL_X32K_TMODE_MASK         (0x30U)\r\n#define PMU_XTAL32K_CTRL_X32K_TMODE_SHIFT        (4U)\r\n/*! X32K_TMODE - Test mode enabling for 32k xtal ckt */\r\n#define PMU_XTAL32K_CTRL_X32K_TMODE(x)           (((uint32_t)(((uint32_t)(x)) << PMU_XTAL32K_CTRL_X32K_TMODE_SHIFT)) & PMU_XTAL32K_CTRL_X32K_TMODE_MASK)\r\n\r\n#define PMU_XTAL32K_CTRL_X32K_VDDXO_CNTL_MASK    (0x300U)\r\n#define PMU_XTAL32K_CTRL_X32K_VDDXO_CNTL_SHIFT   (8U)\r\n/*! X32K_VDDXO_CNTL - Control VDDXO level */\r\n#define PMU_XTAL32K_CTRL_X32K_VDDXO_CNTL(x)      (((uint32_t)(((uint32_t)(x)) << PMU_XTAL32K_CTRL_X32K_VDDXO_CNTL_SHIFT)) & PMU_XTAL32K_CTRL_X32K_VDDXO_CNTL_MASK)\r\n\r\n#define PMU_XTAL32K_CTRL_X32K_EXT_OSC_EN_MASK    (0x400U)\r\n#define PMU_XTAL32K_CTRL_X32K_EXT_OSC_EN_SHIFT   (10U)\r\n/*! X32K_EXT_OSC_EN - Enable external oscillator mode for outside clock */\r\n#define PMU_XTAL32K_CTRL_X32K_EXT_OSC_EN(x)      (((uint32_t)(((uint32_t)(x)) << PMU_XTAL32K_CTRL_X32K_EXT_OSC_EN_SHIFT)) & PMU_XTAL32K_CTRL_X32K_EXT_OSC_EN_MASK)\r\n\r\n#define PMU_XTAL32K_CTRL_X32K_EN_MASK            (0x800U)\r\n#define PMU_XTAL32K_CTRL_X32K_EN_SHIFT           (11U)\r\n/*! X32K_EN - Enable 32k oscillator */\r\n#define PMU_XTAL32K_CTRL_X32K_EN(x)              (((uint32_t)(((uint32_t)(x)) << PMU_XTAL32K_CTRL_X32K_EN_SHIFT)) & PMU_XTAL32K_CTRL_X32K_EN_MASK)\r\n\r\n#define PMU_XTAL32K_CTRL_X32K_DLY_SEL_MASK       (0x3000U)\r\n#define PMU_XTAL32K_CTRL_X32K_DLY_SEL_SHIFT      (12U)\r\n/*! X32K_DLY_SEL - 32k Delay Select */\r\n#define PMU_XTAL32K_CTRL_X32K_DLY_SEL(x)         (((uint32_t)(((uint32_t)(x)) << PMU_XTAL32K_CTRL_X32K_DLY_SEL_SHIFT)) & PMU_XTAL32K_CTRL_X32K_DLY_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name PMIP_BUCK_LVL - PMIP BUCK LEVEL */\r\n/*! @{ */\r\n\r\n#define PMU_PMIP_BUCK_LVL_NORMAL_BUCK11_SEL_MASK (0x7FU)\r\n#define PMU_PMIP_BUCK_LVL_NORMAL_BUCK11_SEL_SHIFT (0U)\r\n/*! NORMAL_BUCK11_SEL - Select normal mode output voltage for v11_aon VOUT = LVL*5mV + 630mV */\r\n#define PMU_PMIP_BUCK_LVL_NORMAL_BUCK11_SEL(x)   (((uint32_t)(((uint32_t)(x)) << PMU_PMIP_BUCK_LVL_NORMAL_BUCK11_SEL_SHIFT)) & PMU_PMIP_BUCK_LVL_NORMAL_BUCK11_SEL_MASK)\r\n\r\n#define PMU_PMIP_BUCK_LVL_NORMAL_BUCK18_SEL_MASK (0x7F00U)\r\n#define PMU_PMIP_BUCK_LVL_NORMAL_BUCK18_SEL_SHIFT (8U)\r\n/*! NORMAL_BUCK18_SEL - Select normal mode output voltage for v18_aon VOUT = LVL*10mV + 840mV */\r\n#define PMU_PMIP_BUCK_LVL_NORMAL_BUCK18_SEL(x)   (((uint32_t)(((uint32_t)(x)) << PMU_PMIP_BUCK_LVL_NORMAL_BUCK18_SEL_SHIFT)) & PMU_PMIP_BUCK_LVL_NORMAL_BUCK18_SEL_MASK)\r\n\r\n#define PMU_PMIP_BUCK_LVL_SLEEP_BUCK11_SEL_MASK  (0x7F0000U)\r\n#define PMU_PMIP_BUCK_LVL_SLEEP_BUCK11_SEL_SHIFT (16U)\r\n/*! SLEEP_BUCK11_SEL - Select sleep mode output voltage for v11_aon VOUT = LVL*5mV + 630mV */\r\n#define PMU_PMIP_BUCK_LVL_SLEEP_BUCK11_SEL(x)    (((uint32_t)(((uint32_t)(x)) << PMU_PMIP_BUCK_LVL_SLEEP_BUCK11_SEL_SHIFT)) & PMU_PMIP_BUCK_LVL_SLEEP_BUCK11_SEL_MASK)\r\n\r\n#define PMU_PMIP_BUCK_LVL_SLEEP_BUCK18_SEL_MASK  (0x7F000000U)\r\n#define PMU_PMIP_BUCK_LVL_SLEEP_BUCK18_SEL_SHIFT (24U)\r\n/*! SLEEP_BUCK18_SEL - Select sleep mode output voltage for v18_aon VOUT = LVL*10mV + 840mV */\r\n#define PMU_PMIP_BUCK_LVL_SLEEP_BUCK18_SEL(x)    (((uint32_t)(((uint32_t)(x)) << PMU_PMIP_BUCK_LVL_SLEEP_BUCK18_SEL_SHIFT)) & PMU_PMIP_BUCK_LVL_SLEEP_BUCK18_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name PMIP_BUCK_CTRL - PMIP BUCK ctrl */\r\n/*! @{ */\r\n\r\n#define PMU_PMIP_BUCK_CTRL_BUCK11_SLP_EN_MASK    (0x1U)\r\n#define PMU_PMIP_BUCK_CTRL_BUCK11_SLP_EN_SHIFT   (0U)\r\n/*! BUCK11_SLP_EN - 1'b1: sleep mode; 1'b0: active mode. */\r\n#define PMU_PMIP_BUCK_CTRL_BUCK11_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << PMU_PMIP_BUCK_CTRL_BUCK11_SLP_EN_SHIFT)) & PMU_PMIP_BUCK_CTRL_BUCK11_SLP_EN_MASK)\r\n\r\n#define PMU_PMIP_BUCK_CTRL_BUCK11_SW_PD_MASK     (0x2U)\r\n#define PMU_PMIP_BUCK_CTRL_BUCK11_SW_PD_SHIFT    (1U)\r\n/*! BUCK11_SW_PD - Power Down BUCK11 */\r\n#define PMU_PMIP_BUCK_CTRL_BUCK11_SW_PD(x)       (((uint32_t)(((uint32_t)(x)) << PMU_PMIP_BUCK_CTRL_BUCK11_SW_PD_SHIFT)) & PMU_PMIP_BUCK_CTRL_BUCK11_SW_PD_MASK)\r\n\r\n#define PMU_PMIP_BUCK_CTRL_BUCK18_SLP_EN_MASK    (0x4U)\r\n#define PMU_PMIP_BUCK_CTRL_BUCK18_SLP_EN_SHIFT   (2U)\r\n/*! BUCK18_SLP_EN - 1'b1: sleep mode; 1'b0: active mode. */\r\n#define PMU_PMIP_BUCK_CTRL_BUCK18_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << PMU_PMIP_BUCK_CTRL_BUCK18_SLP_EN_SHIFT)) & PMU_PMIP_BUCK_CTRL_BUCK18_SLP_EN_MASK)\r\n\r\n#define PMU_PMIP_BUCK_CTRL_BUCK18_SW_PD_MASK     (0x8U)\r\n#define PMU_PMIP_BUCK_CTRL_BUCK18_SW_PD_SHIFT    (3U)\r\n/*! BUCK18_SW_PD - Power Down BUCK18 */\r\n#define PMU_PMIP_BUCK_CTRL_BUCK18_SW_PD(x)       (((uint32_t)(((uint32_t)(x)) << PMU_PMIP_BUCK_CTRL_BUCK18_SW_PD_SHIFT)) & PMU_PMIP_BUCK_CTRL_BUCK18_SW_PD_MASK)\r\n\r\n#define PMU_PMIP_BUCK_CTRL_PM3_BUCK11_ON_MASK    (0x40U)\r\n#define PMU_PMIP_BUCK_CTRL_PM3_BUCK11_ON_SHIFT   (6U)\r\n/*! PM3_BUCK11_ON - provide a enable when sleep condition:1'b1:PM3 BUCK11 ON;1'b0:PM3 BUCK11 SLEEP */\r\n#define PMU_PMIP_BUCK_CTRL_PM3_BUCK11_ON(x)      (((uint32_t)(((uint32_t)(x)) << PMU_PMIP_BUCK_CTRL_PM3_BUCK11_ON_SHIFT)) & PMU_PMIP_BUCK_CTRL_PM3_BUCK11_ON_MASK)\r\n\r\n#define PMU_PMIP_BUCK_CTRL_PM3_BUCK18_ON_MASK    (0x80U)\r\n#define PMU_PMIP_BUCK_CTRL_PM3_BUCK18_ON_SHIFT   (7U)\r\n/*! PM3_BUCK18_ON - provide a enable when sleep condition:1'b1:PM3 BUCK18 ON;1'b0:PM3 BUCK18 SLEEP */\r\n#define PMU_PMIP_BUCK_CTRL_PM3_BUCK18_ON(x)      (((uint32_t)(((uint32_t)(x)) << PMU_PMIP_BUCK_CTRL_PM3_BUCK18_ON_SHIFT)) & PMU_PMIP_BUCK_CTRL_PM3_BUCK18_ON_MASK)\r\n/*! @} */\r\n\r\n/*! @name PMIP_LDO_LVL - PMIP LDO level ctrl */\r\n/*! @{ */\r\n\r\n#define PMU_PMIP_LDO_LVL_LDO18_SEL_MASK          (0x7U)\r\n#define PMU_PMIP_LDO_LVL_LDO18_SEL_SHIFT         (0U)\r\n/*! LDO18_SEL - Select output voltage for v18_aon\r\n *  0b000..1.60V\r\n *  0b001..1.65V\r\n *  0b010..1.70V\r\n *  0b011..1.75V\r\n *  0b100..1.80V\r\n *  0b101..1.85V\r\n *  0b110..1.90V\r\n *  0b111..1.95V\r\n */\r\n#define PMU_PMIP_LDO_LVL_LDO18_SEL(x)            (((uint32_t)(((uint32_t)(x)) << PMU_PMIP_LDO_LVL_LDO18_SEL_SHIFT)) & PMU_PMIP_LDO_LVL_LDO18_SEL_MASK)\r\n\r\n#define PMU_PMIP_LDO_LVL_LDO11_SEL_MASK          (0x70U)\r\n#define PMU_PMIP_LDO_LVL_LDO11_SEL_SHIFT         (4U)\r\n/*! LDO11_SEL - Select output voltage for v11_aon\r\n *  0b000..0.75V\r\n *  0b001..0.80V\r\n *  0b010..0.85V\r\n *  0b011..0.90V\r\n *  0b100..0.95V\r\n *  0b101..1.00V\r\n *  0b110..1.05V\r\n *  0b111..1.10V\r\n */\r\n#define PMU_PMIP_LDO_LVL_LDO11_SEL(x)            (((uint32_t)(((uint32_t)(x)) << PMU_PMIP_LDO_LVL_LDO11_SEL_SHIFT)) & PMU_PMIP_LDO_LVL_LDO11_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name PMIP_RST - PMIP reset request register */\r\n/*! @{ */\r\n\r\n#define PMU_PMIP_RST_SW_RST_REQ_MASK             (0x1U)\r\n#define PMU_PMIP_RST_SW_RST_REQ_SHIFT            (0U)\r\n/*! SW_RST_REQ - PMIP software por request\r\n *  0b0..no rst request\r\n *  0b1..send rst request, need write 1->0->1->0 sequence\r\n */\r\n#define PMU_PMIP_RST_SW_RST_REQ(x)               (((uint32_t)(((uint32_t)(x)) << PMU_PMIP_RST_SW_RST_REQ_SHIFT)) & PMU_PMIP_RST_SW_RST_REQ_MASK)\r\n/*! @} */\r\n\r\n/*! @name BOD - BOD register */\r\n/*! @{ */\r\n\r\n#define PMU_BOD_EN_MASK                          (0x1U)\r\n#define PMU_BOD_EN_SHIFT                         (0U)\r\n/*! EN - bod enable */\r\n#define PMU_BOD_EN(x)                            (((uint32_t)(((uint32_t)(x)) << PMU_BOD_EN_SHIFT)) & PMU_BOD_EN_MASK)\r\n\r\n#define PMU_BOD__1_85_INT_NEG_MASK               (0x10U)\r\n#define PMU_BOD__1_85_INT_NEG_SHIFT              (4U)\r\n/*! _1_85_INT_NEG - bod_1_85_int negedge */\r\n#define PMU_BOD__1_85_INT_NEG(x)                 (((uint32_t)(((uint32_t)(x)) << PMU_BOD__1_85_INT_NEG_SHIFT)) & PMU_BOD__1_85_INT_NEG_MASK)\r\n\r\n#define PMU_BOD__1_85_INT_CLR_NEG_MASK           (0x20U)\r\n#define PMU_BOD__1_85_INT_CLR_NEG_SHIFT          (5U)\r\n/*! _1_85_INT_CLR_NEG - clr bod_1_85_int negedge */\r\n#define PMU_BOD__1_85_INT_CLR_NEG(x)             (((uint32_t)(((uint32_t)(x)) << PMU_BOD__1_85_INT_CLR_NEG_SHIFT)) & PMU_BOD__1_85_INT_CLR_NEG_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_CFG - mem configuration register */\r\n/*! @{ */\r\n\r\n#define PMU_MEM_CFG_MEM_RET_MASK                 (0x3FU)\r\n#define PMU_MEM_CFG_MEM_RET_SHIFT                (0U)\r\n/*! MEM_RET - mem Retention enable register in PM3 mode\r\n *  0b000000..in PM3, it will keep retention\r\n *  0b000001..in PM3, it will shut down\r\n */\r\n#define PMU_MEM_CFG_MEM_RET(x)                   (((uint32_t)(((uint32_t)(x)) << PMU_MEM_CFG_MEM_RET_SHIFT)) & PMU_MEM_CFG_MEM_RET_MASK)\r\n\r\n#define PMU_MEM_CFG_AON_MEM_RET_MASK             (0x100U)\r\n#define PMU_MEM_CFG_AON_MEM_RET_SHIFT            (8U)\r\n/*! AON_MEM_RET - aon mem Retention enable register in PM4 mode\r\n *  0b0..in PM4, it will keep retention\r\n *  0b1..in PM4, it will shut down\r\n */\r\n#define PMU_MEM_CFG_AON_MEM_RET(x)               (((uint32_t)(((uint32_t)(x)) << PMU_MEM_CFG_AON_MEM_RET_SHIFT)) & PMU_MEM_CFG_AON_MEM_RET_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESET_DISABLE - reset disable register */\r\n/*! @{ */\r\n\r\n#define PMU_RESET_DISABLE_PINMUX_MASK            (0x1U)\r\n#define PMU_RESET_DISABLE_PINMUX_SHIFT           (0U)\r\n/*! PINMUX - avoid reset warm reset\r\n *  0b0..not disable warm reset for pinmux\r\n *  0b1..disable warm reset for pinmux\r\n */\r\n#define PMU_RESET_DISABLE_PINMUX(x)              (((uint32_t)(((uint32_t)(x)) << PMU_RESET_DISABLE_PINMUX_SHIFT)) & PMU_RESET_DISABLE_PINMUX_MASK)\r\n/*! @} */\r\n\r\n/*! @name WLAN_CTRL - WLAN Control Register */\r\n/*! @{ */\r\n\r\n#define PMU_WLAN_CTRL_WL_XOSC_EN_MASK            (0x2U)\r\n#define PMU_WLAN_CTRL_WL_XOSC_EN_SHIFT           (1U)\r\n/*! WL_XOSC_EN - wl request control different modes for CAU XTAL (1 for normal mode, 0 for sleep/full PD) */\r\n#define PMU_WLAN_CTRL_WL_XOSC_EN(x)              (((uint32_t)(((uint32_t)(x)) << PMU_WLAN_CTRL_WL_XOSC_EN_SHIFT)) & PMU_WLAN_CTRL_WL_XOSC_EN_MASK)\r\n\r\n#define PMU_WLAN_CTRL_WL_SLEEP_MASK              (0xCU)\r\n#define PMU_WLAN_CTRL_WL_SLEEP_SHIFT             (2U)\r\n/*! WL_SLEEP - WLAN SYS sleep; bit[0]:SOCWLAPU_WLGATED_PSW_PD_AON, bit[1]:cpu1_cp15_sleep */\r\n#define PMU_WLAN_CTRL_WL_SLEEP(x)                (((uint32_t)(((uint32_t)(x)) << PMU_WLAN_CTRL_WL_SLEEP_SHIFT)) & PMU_WLAN_CTRL_WL_SLEEP_MASK)\r\n\r\n#define PMU_WLAN_CTRL_WL_WAKEUP_MASK             (0xFF00U)\r\n#define PMU_WLAN_CTRL_WL_WAKEUP_SHIFT            (8U)\r\n/*! WL_WAKEUP - MCI_WL_WAKEUP */\r\n#define PMU_WLAN_CTRL_WL_WAKEUP(x)               (((uint32_t)(((uint32_t)(x)) << PMU_WLAN_CTRL_WL_WAKEUP_SHIFT)) & PMU_WLAN_CTRL_WL_WAKEUP_MASK)\r\n/*! @} */\r\n\r\n/*! @name BLE_CTRL - BLEControl Register */\r\n/*! @{ */\r\n\r\n#define PMU_BLE_CTRL_BLE_XOSC_EN_MASK            (0x2U)\r\n#define PMU_BLE_CTRL_BLE_XOSC_EN_SHIFT           (1U)\r\n/*! BLE_XOSC_EN - ble request control different modes for CAU XTAL (1 for normal mode, 0 for sleep/full PD) */\r\n#define PMU_BLE_CTRL_BLE_XOSC_EN(x)              (((uint32_t)(((uint32_t)(x)) << PMU_BLE_CTRL_BLE_XOSC_EN_SHIFT)) & PMU_BLE_CTRL_BLE_XOSC_EN_MASK)\r\n\r\n#define PMU_BLE_CTRL_BLE_SLEEP_MASK              (0xCU)\r\n#define PMU_BLE_CTRL_BLE_SLEEP_SHIFT             (2U)\r\n/*! BLE_SLEEP - BLE SYS sleep; bit[0]:SOCBTAPU_BLEGATED_PSW_PD_AON, bit[1]:cpu2_cp15_sleep */\r\n#define PMU_BLE_CTRL_BLE_SLEEP(x)                (((uint32_t)(((uint32_t)(x)) << PMU_BLE_CTRL_BLE_SLEEP_SHIFT)) & PMU_BLE_CTRL_BLE_SLEEP_MASK)\r\n\r\n#define PMU_BLE_CTRL_BLE_WAKEUP_MASK             (0xFF00U)\r\n#define PMU_BLE_CTRL_BLE_WAKEUP_SHIFT            (8U)\r\n/*! BLE_WAKEUP - MCI_BLE_WAKEUP */\r\n#define PMU_BLE_CTRL_BLE_WAKEUP(x)               (((uint32_t)(((uint32_t)(x)) << PMU_BLE_CTRL_BLE_WAKEUP_SHIFT)) & PMU_BLE_CTRL_BLE_WAKEUP_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLK_AON - Always on Domain Clock select */\r\n/*! @{ */\r\n\r\n#define PMU_CLK_AON_CLK_32K_AON_MASK             (0x3U)\r\n#define PMU_CLK_AON_CLK_32K_AON_SHIFT            (0U)\r\n/*! CLK_32K_AON - 32K clock select for PMU and RTC\r\n *  0b00..RC32K clock\r\n *  0b01..XTAL32K clock\r\n *  0b10..NCO32K clock\r\n */\r\n#define PMU_CLK_AON_CLK_32K_AON(x)               (((uint32_t)(((uint32_t)(x)) << PMU_CLK_AON_CLK_32K_AON_SHIFT)) & PMU_CLK_AON_CLK_32K_AON_MASK)\r\n\r\n#define PMU_CLK_AON_PMU_CLK_MASK                 (0x4U)\r\n#define PMU_CLK_AON_PMU_CLK_SHIFT                (2U)\r\n/*! PMU_CLK - pmu clock select\r\n *  0b0..fast clock, sys clock after divider\r\n *  0b1..slow clock,clk_32k\r\n */\r\n#define PMU_CLK_AON_PMU_CLK(x)                   (((uint32_t)(((uint32_t)(x)) << PMU_CLK_AON_PMU_CLK_SHIFT)) & PMU_CLK_AON_PMU_CLK_MASK)\r\n\r\n#define PMU_CLK_AON_PMIP_SLOW_CLK_RDY_MASK       (0x10U)\r\n#define PMU_CLK_AON_PMIP_SLOW_CLK_RDY_SHIFT      (4U)\r\n/*! PMIP_SLOW_CLK_RDY - one of 32k source ready signal\r\n *  0b0..none 32k is ready\r\n *  0b1..one of 32k source is ready\r\n */\r\n#define PMU_CLK_AON_PMIP_SLOW_CLK_RDY(x)         (((uint32_t)(((uint32_t)(x)) << PMU_CLK_AON_PMIP_SLOW_CLK_RDY_SHIFT)) & PMU_CLK_AON_PMIP_SLOW_CLK_RDY_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOC_MEM_PDWN - soc mem pdwn register */\r\n/*! @{ */\r\n\r\n#define PMU_SOC_MEM_PDWN_MSC_MEM_PDWN_CTRL_MASK  (0x1U)\r\n#define PMU_SOC_MEM_PDWN_MSC_MEM_PDWN_CTRL_SHIFT (0U)\r\n/*! MSC_MEM_PDWN_CTRL - msc mem pdwn control register\r\n *  0b0..HW control mem_pdwn\r\n *  0b1..SW CFG mem_pdwn\r\n */\r\n#define PMU_SOC_MEM_PDWN_MSC_MEM_PDWN_CTRL(x)    (((uint32_t)(((uint32_t)(x)) << PMU_SOC_MEM_PDWN_MSC_MEM_PDWN_CTRL_SHIFT)) & PMU_SOC_MEM_PDWN_MSC_MEM_PDWN_CTRL_MASK)\r\n\r\n#define PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN_CTRL_MASK (0x2U)\r\n#define PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN_CTRL_SHIFT (1U)\r\n/*! SOCTOP_OTP_PDWN_CTRL - soc top otp pdwn control register\r\n *  0b0..HW control pdwn\r\n *  0b1..SW CFG pdwn\r\n */\r\n#define PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN_CTRL(x) (((uint32_t)(((uint32_t)(x)) << PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN_CTRL_SHIFT)) & PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN_CTRL_MASK)\r\n\r\n#define PMU_SOC_MEM_PDWN_MSC_MEM_PDWN_MASK       (0x10U)\r\n#define PMU_SOC_MEM_PDWN_MSC_MEM_PDWN_SHIFT      (4U)\r\n/*! MSC_MEM_PDWN - msc mem pdwn cfg register\r\n *  0b0..de-assert mem_pdwn\r\n *  0b1..assert mem_pdwn\r\n */\r\n#define PMU_SOC_MEM_PDWN_MSC_MEM_PDWN(x)         (((uint32_t)(((uint32_t)(x)) << PMU_SOC_MEM_PDWN_MSC_MEM_PDWN_SHIFT)) & PMU_SOC_MEM_PDWN_MSC_MEM_PDWN_MASK)\r\n\r\n#define PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN0_MASK   (0x20U)\r\n#define PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN0_SHIFT  (5U)\r\n/*! SOCTOP_OTP_PDWN0 - soc_top_otp_pdwn0 cfg register\r\n *  0b0..de-assert pdwn\r\n *  0b1..assert pdwn\r\n */\r\n#define PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN0(x)     (((uint32_t)(((uint32_t)(x)) << PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN0_SHIFT)) & PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN0_MASK)\r\n\r\n#define PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN1_MASK   (0x40U)\r\n#define PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN1_SHIFT  (6U)\r\n/*! SOCTOP_OTP_PDWN1 - soc_top_otp_pdwn1 cfg register\r\n *  0b0..de-assert pdwn\r\n *  0b1..assert pdwn\r\n */\r\n#define PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN1(x)     (((uint32_t)(((uint32_t)(x)) << PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN1_SHIFT)) & PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN1_MASK)\r\n\r\n#define PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN2_MASK   (0x80U)\r\n#define PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN2_SHIFT  (7U)\r\n/*! SOCTOP_OTP_PDWN2 - soc_top_otp_pdwn2 cfg register\r\n *  0b0..de-assert pdwn\r\n *  0b1..assert pdwn\r\n */\r\n#define PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN2(x)     (((uint32_t)(((uint32_t)(x)) << PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN2_SHIFT)) & PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN2_MASK)\r\n/*! @} */\r\n\r\n/*! @name AON_PAD_OUT_CTRL - aon pad out control */\r\n/*! @{ */\r\n\r\n#define PMU_AON_PAD_OUT_CTRL_EN_MASK             (0x1U)\r\n#define PMU_AON_PAD_OUT_CTRL_EN_SHIFT            (0U)\r\n/*! EN - aon pad ouput en */\r\n#define PMU_AON_PAD_OUT_CTRL_EN(x)               (((uint32_t)(((uint32_t)(x)) << PMU_AON_PAD_OUT_CTRL_EN_SHIFT)) & PMU_AON_PAD_OUT_CTRL_EN_MASK)\r\n\r\n#define PMU_AON_PAD_OUT_CTRL_VALUE_MASK          (0x2U)\r\n#define PMU_AON_PAD_OUT_CTRL_VALUE_SHIFT         (1U)\r\n/*! VALUE - aon pad output value */\r\n#define PMU_AON_PAD_OUT_CTRL_VALUE(x)            (((uint32_t)(((uint32_t)(x)) << PMU_AON_PAD_OUT_CTRL_VALUE_SHIFT)) & PMU_AON_PAD_OUT_CTRL_VALUE_MASK)\r\n/*! @} */\r\n\r\n/*! @name WAKEUP_PM2_MASK0 - Wakeup PM2 state Mask Interrupt Register */\r\n/*! @{ */\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_WDT0_MASK           (0x1U)\r\n#define PMU_WAKEUP_PM2_MASK0_WDT0_SHIFT          (0U)\r\n/*! WDT0 - WDT0 Wakeup Mask\r\n *  0b0..mask wdt0 wakeup interrupt\r\n *  0b1..unmask wdt0 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_WDT0(x)             (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_WDT0_SHIFT)) & PMU_WAKEUP_PM2_MASK0_WDT0_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_DMA0_MASK           (0x2U)\r\n#define PMU_WAKEUP_PM2_MASK0_DMA0_SHIFT          (1U)\r\n/*! DMA0 - DMA0 Wakeup Mask\r\n *  0b0..mask dma0 wakeup interrupt\r\n *  0b1..unmask dma0 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_DMA0(x)             (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_DMA0_SHIFT)) & PMU_WAKEUP_PM2_MASK0_DMA0_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_GPIO_INTA_MASK      (0x4U)\r\n#define PMU_WAKEUP_PM2_MASK0_GPIO_INTA_SHIFT     (2U)\r\n/*! GPIO_INTA - GPIO_INTA Wakeup Mask\r\n *  0b0..mask gpio_inta wakeup interrupt\r\n *  0b1..unmask gpio_inta wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_GPIO_INTA(x)        (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_GPIO_INTA_SHIFT)) & PMU_WAKEUP_PM2_MASK0_GPIO_INTA_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_GPIO_INTB_MASK      (0x8U)\r\n#define PMU_WAKEUP_PM2_MASK0_GPIO_INTB_SHIFT     (3U)\r\n/*! GPIO_INTB - GPIO_INTB Wakeup Mask\r\n *  0b0..mask gpio_intb wakeup interrupt\r\n *  0b1..unmask gpio_intb wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_GPIO_INTB(x)        (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_GPIO_INTB_SHIFT)) & PMU_WAKEUP_PM2_MASK0_GPIO_INTB_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_PIN_INT0_MASK       (0x10U)\r\n#define PMU_WAKEUP_PM2_MASK0_PIN_INT0_SHIFT      (4U)\r\n/*! PIN_INT0 - PIN_INT0 Wakeup Mask\r\n *  0b0..mask pin_int0 wakeup interrupt\r\n *  0b1..unmask pin_int0 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_PIN_INT0(x)         (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_PIN_INT0_SHIFT)) & PMU_WAKEUP_PM2_MASK0_PIN_INT0_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_PIN_INT1_MASK       (0x20U)\r\n#define PMU_WAKEUP_PM2_MASK0_PIN_INT1_SHIFT      (5U)\r\n/*! PIN_INT1 - PIN_INT1 Wakeup Mask\r\n *  0b0..mask pin_int1 wakeup interrupt\r\n *  0b1..unmask pin_int1 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_PIN_INT1(x)         (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_PIN_INT1_SHIFT)) & PMU_WAKEUP_PM2_MASK0_PIN_INT1_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_PIN_INT2_MASK       (0x40U)\r\n#define PMU_WAKEUP_PM2_MASK0_PIN_INT2_SHIFT      (6U)\r\n/*! PIN_INT2 - PIN_INT2 Wakeup Mask\r\n *  0b0..mask pin_int2 wakeup interrupt\r\n *  0b1..unmask pin_int2 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_PIN_INT2(x)         (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_PIN_INT2_SHIFT)) & PMU_WAKEUP_PM2_MASK0_PIN_INT2_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_PIN_INT3_MASK       (0x80U)\r\n#define PMU_WAKEUP_PM2_MASK0_PIN_INT3_SHIFT      (7U)\r\n/*! PIN_INT3 - PIN_INT3 Wakeup Mask\r\n *  0b0..mask pin_int3 wakeup interrupt\r\n *  0b1..unmask pin_int3 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_PIN_INT3(x)         (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_PIN_INT3_SHIFT)) & PMU_WAKEUP_PM2_MASK0_PIN_INT3_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_UTICK_MASK          (0x100U)\r\n#define PMU_WAKEUP_PM2_MASK0_UTICK_SHIFT         (8U)\r\n/*! UTICK - UTICK Wakeup Mask\r\n *  0b0..mask utick wakeup interrupt\r\n *  0b1..unmask utick wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_UTICK(x)            (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_UTICK_SHIFT)) & PMU_WAKEUP_PM2_MASK0_UTICK_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_MRT_MASK            (0x200U)\r\n#define PMU_WAKEUP_PM2_MASK0_MRT_SHIFT           (9U)\r\n/*! MRT - MRT Wakeup Mask\r\n *  0b0..mask mrt wakeup interrupt\r\n *  0b1..unmask mrt wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_MRT(x)              (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_MRT_SHIFT)) & PMU_WAKEUP_PM2_MASK0_MRT_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_CTIMER0_MASK        (0x400U)\r\n#define PMU_WAKEUP_PM2_MASK0_CTIMER0_SHIFT       (10U)\r\n/*! CTIMER0 - CTIMER0 Wakeup Mask\r\n *  0b0..mask ctimer0 wakeup interrupt\r\n *  0b1..unmask ctimer0 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_CTIMER0(x)          (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_CTIMER0_SHIFT)) & PMU_WAKEUP_PM2_MASK0_CTIMER0_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_CTIMER1_MASK        (0x800U)\r\n#define PMU_WAKEUP_PM2_MASK0_CTIMER1_SHIFT       (11U)\r\n/*! CTIMER1 - CTIMER1 Wakeup Mask\r\n *  0b0..mask CTIMER1 wakeup interrupt\r\n *  0b1..unmask CTIMER1 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_CTIMER1(x)          (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_CTIMER1_SHIFT)) & PMU_WAKEUP_PM2_MASK0_CTIMER1_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_SCT0_MASK           (0x1000U)\r\n#define PMU_WAKEUP_PM2_MASK0_SCT0_SHIFT          (12U)\r\n/*! SCT0 - SCT0 Wakeup Mask\r\n *  0b0..mask sct0 wakeup interrupt\r\n *  0b1..unmask sct0 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_SCT0(x)             (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_SCT0_SHIFT)) & PMU_WAKEUP_PM2_MASK0_SCT0_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_CTIMER3_MASK        (0x2000U)\r\n#define PMU_WAKEUP_PM2_MASK0_CTIMER3_SHIFT       (13U)\r\n/*! CTIMER3 - CTIMER3 Wakeup Mask\r\n *  0b0..mask ctimer3 wakeup interrupt\r\n *  0b1..unmask ctimer3 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_CTIMER3(x)          (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_CTIMER3_SHIFT)) & PMU_WAKEUP_PM2_MASK0_CTIMER3_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_FLEXCOMM0_MASK      (0x4000U)\r\n#define PMU_WAKEUP_PM2_MASK0_FLEXCOMM0_SHIFT     (14U)\r\n/*! FLEXCOMM0 - FLEXCOMM0 Wakeup Mask\r\n *  0b0..mask flexcomm0 wakeup interrupt\r\n *  0b1..unmask flexcomm0 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_FLEXCOMM0(x)        (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_FLEXCOMM0_SHIFT)) & PMU_WAKEUP_PM2_MASK0_FLEXCOMM0_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_FLEXCOMM1_MASK      (0x8000U)\r\n#define PMU_WAKEUP_PM2_MASK0_FLEXCOMM1_SHIFT     (15U)\r\n/*! FLEXCOMM1 - FLEXCOMM1 Wakeup Mask\r\n *  0b0..mask flexcomm1 wakeup interrupt\r\n *  0b1..unmask flexcomm1 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_FLEXCOMM1(x)        (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_FLEXCOMM1_SHIFT)) & PMU_WAKEUP_PM2_MASK0_FLEXCOMM1_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_FLEXCOMM2_MASK      (0x10000U)\r\n#define PMU_WAKEUP_PM2_MASK0_FLEXCOMM2_SHIFT     (16U)\r\n/*! FLEXCOMM2 - FLEXCOMM2 Wakeup Mask\r\n *  0b0..mask flexcomm2 wakeup interrupt\r\n *  0b1..unmask flexcomm2 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_FLEXCOMM2(x)        (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_FLEXCOMM2_SHIFT)) & PMU_WAKEUP_PM2_MASK0_FLEXCOMM2_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_FLEXCOMM3_MASK      (0x20000U)\r\n#define PMU_WAKEUP_PM2_MASK0_FLEXCOMM3_SHIFT     (17U)\r\n/*! FLEXCOMM3 - FLEXCOMM3 Wakeup Mask\r\n *  0b0..mask flexcomm3 wakeup interrupt\r\n *  0b1..unmask flexcomm3 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_FLEXCOMM3(x)        (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_FLEXCOMM3_SHIFT)) & PMU_WAKEUP_PM2_MASK0_FLEXCOMM3_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_FLEXCOMM14_MASK     (0x100000U)\r\n#define PMU_WAKEUP_PM2_MASK0_FLEXCOMM14_SHIFT    (20U)\r\n/*! FLEXCOMM14 - FLEXCOMM14 Wakeup Mask\r\n *  0b0..mask flexcomm14 wakeup interrupt\r\n *  0b1..unmask flexcomm14 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_FLEXCOMM14(x)       (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_FLEXCOMM14_SHIFT)) & PMU_WAKEUP_PM2_MASK0_FLEXCOMM14_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_FREEMRT_GLOBAL_MASK (0x800000U)\r\n#define PMU_WAKEUP_PM2_MASK0_FREEMRT_GLOBAL_SHIFT (23U)\r\n/*! FREEMRT_GLOBAL - Free Multi-rate timer Wakeup Mask\r\n *  0b0..mask freemrt_global wakeup interrupt\r\n *  0b1..unmask freemrt_global wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_FREEMRT_GLOBAL(x)   (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_FREEMRT_GLOBAL_SHIFT)) & PMU_WAKEUP_PM2_MASK0_FREEMRT_GLOBAL_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_DMIC_MASK           (0x2000000U)\r\n#define PMU_WAKEUP_PM2_MASK0_DMIC_SHIFT          (25U)\r\n/*! DMIC - DMIC Wakeup Mask\r\n *  0b0..mask dmic wakeup interrupt\r\n *  0b1..unmask dmic wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_DMIC(x)             (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_DMIC_SHIFT)) & PMU_WAKEUP_PM2_MASK0_DMIC_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_WAKEUP_FROM_DEEPSLEEP_MASK (0x4000000U)\r\n#define PMU_WAKEUP_PM2_MASK0_WAKEUP_FROM_DEEPSLEEP_SHIFT (26U)\r\n/*! WAKEUP_FROM_DEEPSLEEP - Wakeup from Deepsleep Wakeup Mask\r\n *  0b0..mask wakeup_from_deepsleep wakeup interrupt\r\n *  0b1..unmask wakeup_from_deepsleep wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_WAKEUP_FROM_DEEPSLEEP(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_WAKEUP_FROM_DEEPSLEEP_SHIFT)) & PMU_WAKEUP_PM2_MASK0_WAKEUP_FROM_DEEPSLEEP_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_HYPERVISOR_MASK     (0x8000000U)\r\n#define PMU_WAKEUP_PM2_MASK0_HYPERVISOR_SHIFT    (27U)\r\n/*! HYPERVISOR - HYPERVISOR Wakeup Mask\r\n *  0b0..mask hypervisor wakeup interrupt\r\n *  0b1..unmask hypervisor wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_HYPERVISOR(x)       (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_HYPERVISOR_SHIFT)) & PMU_WAKEUP_PM2_MASK0_HYPERVISOR_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_SECUREVIOLATION_MASK (0x10000000U)\r\n#define PMU_WAKEUP_PM2_MASK0_SECUREVIOLATION_SHIFT (28U)\r\n/*! SECUREVIOLATION - Secure Violation Wakeup Mask\r\n *  0b0..mask secure violation wakeup interrupt\r\n *  0b1..unmask secure violation wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_SECUREVIOLATION(x)  (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_SECUREVIOLATION_SHIFT)) & PMU_WAKEUP_PM2_MASK0_SECUREVIOLATION_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK0_HWVAD_MASK          (0x20000000U)\r\n#define PMU_WAKEUP_PM2_MASK0_HWVAD_SHIFT         (29U)\r\n/*! HWVAD - Hardware Voice Activity Detector Wakeup Mask\r\n *  0b0..mask hwvad wakeup interrupt\r\n *  0b1..unmask hwvad wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK0_HWVAD(x)            (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK0_HWVAD_SHIFT)) & PMU_WAKEUP_PM2_MASK0_HWVAD_MASK)\r\n/*! @} */\r\n\r\n/*! @name WAKEUP_PM2_MASK1 - Wakeup PM2 state Mask Interrupt Register */\r\n/*! @{ */\r\n\r\n#define PMU_WAKEUP_PM2_MASK1_RTC_MASK            (0x1U)\r\n#define PMU_WAKEUP_PM2_MASK1_RTC_SHIFT           (0U)\r\n/*! RTC - RTC Wakeup Mask\r\n *  0b0..mask rtc wakeup interrupt\r\n *  0b1..unmask rtc wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK1_RTC(x)              (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK1_RTC_SHIFT)) & PMU_WAKEUP_PM2_MASK1_RTC_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK1_PIN_INT4_MASK       (0x8U)\r\n#define PMU_WAKEUP_PM2_MASK1_PIN_INT4_SHIFT      (3U)\r\n/*! PIN_INT4 - PIN_INT4 Wakeup Mask\r\n *  0b0..mask pin_int4 wakeup interrupt\r\n *  0b1..unmask pin_int4 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK1_PIN_INT4(x)         (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK1_PIN_INT4_SHIFT)) & PMU_WAKEUP_PM2_MASK1_PIN_INT4_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK1_PIN_INT5_MASK       (0x10U)\r\n#define PMU_WAKEUP_PM2_MASK1_PIN_INT5_SHIFT      (4U)\r\n/*! PIN_INT5 - PIN_INT5 Wakeup Mask\r\n *  0b0..mask pin_int5 wakeup interrupt\r\n *  0b1..unmask pin_int5 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK1_PIN_INT5(x)         (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK1_PIN_INT5_SHIFT)) & PMU_WAKEUP_PM2_MASK1_PIN_INT5_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK1_PIN_INT6_MASK       (0x20U)\r\n#define PMU_WAKEUP_PM2_MASK1_PIN_INT6_SHIFT      (5U)\r\n/*! PIN_INT6 - PIN_INT6 Wakeup Mask\r\n *  0b0..mask pin_int6 wakeup interrupt\r\n *  0b1..unmask pin_int6 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK1_PIN_INT6(x)         (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK1_PIN_INT6_SHIFT)) & PMU_WAKEUP_PM2_MASK1_PIN_INT6_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK1_PIN_INT7_MASK       (0x40U)\r\n#define PMU_WAKEUP_PM2_MASK1_PIN_INT7_SHIFT      (6U)\r\n/*! PIN_INT7 - PIN_INT7 Wakeup Mask\r\n *  0b0..mask pin_int7 wakeup interrupt\r\n *  0b1..unmask pin_int7 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK1_PIN_INT7(x)         (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK1_PIN_INT7_SHIFT)) & PMU_WAKEUP_PM2_MASK1_PIN_INT7_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK1_CTIMER2_MASK        (0x80U)\r\n#define PMU_WAKEUP_PM2_MASK1_CTIMER2_SHIFT       (7U)\r\n/*! CTIMER2 - CTIMER2 Wakeup Mask\r\n *  0b0..mask ctimer2 wakeup interrupt\r\n *  0b1..unmask ctimer2 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK1_CTIMER2(x)          (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK1_CTIMER2_SHIFT)) & PMU_WAKEUP_PM2_MASK1_CTIMER2_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK1_OS_EVENT_TIMER_MASK (0x200U)\r\n#define PMU_WAKEUP_PM2_MASK1_OS_EVENT_TIMER_SHIFT (9U)\r\n/*! OS_EVENT_TIMER - OS_EVENT_TIMER Wakeup Mask\r\n *  0b0..mask os_event_timer wakeup interrupt\r\n *  0b1..unmask os_event_timer wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK1_OS_EVENT_TIMER(x)   (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK1_OS_EVENT_TIMER_SHIFT)) & PMU_WAKEUP_PM2_MASK1_OS_EVENT_TIMER_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK1_FLEX_SPI_MASK       (0x400U)\r\n#define PMU_WAKEUP_PM2_MASK1_FLEX_SPI_SHIFT      (10U)\r\n/*! FLEX_SPI - Flex SPI Wakeup Mask\r\n *  0b0..mask flex_spi wakeup interrupt\r\n *  0b1..unmask flex_spi wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK1_FLEX_SPI(x)         (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK1_FLEX_SPI_SHIFT)) & PMU_WAKEUP_PM2_MASK1_FLEX_SPI_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK1_SDU_MASK            (0x4000U)\r\n#define PMU_WAKEUP_PM2_MASK1_SDU_SHIFT           (14U)\r\n/*! SDU - SDU Wakeup Mask\r\n *  0b0..mask sdu wakeup interrupt\r\n *  0b1..unmask sdu wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK1_SDU(x)              (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK1_SDU_SHIFT)) & PMU_WAKEUP_PM2_MASK1_SDU_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK1_SGPIO_INTA_MASK     (0x8000U)\r\n#define PMU_WAKEUP_PM2_MASK1_SGPIO_INTA_SHIFT    (15U)\r\n/*! SGPIO_INTA - SGPIO_INTA Wakeup Mask\r\n *  0b0..mask sgpio_inta wakeup interrupt\r\n *  0b1..unmask sgpio_inta wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK1_SGPIO_INTA(x)       (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK1_SGPIO_INTA_SHIFT)) & PMU_WAKEUP_PM2_MASK1_SGPIO_INTA_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK1_SGPIO_INTB_MASK     (0x10000U)\r\n#define PMU_WAKEUP_PM2_MASK1_SGPIO_INTB_SHIFT    (16U)\r\n/*! SGPIO_INTB - SGPIO_INTB Wakeup Mask\r\n *  0b0..mask sgpio_intb wakeup interrupt\r\n *  0b1..unmask sgpio_intb wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK1_SGPIO_INTB(x)       (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK1_SGPIO_INTB_SHIFT)) & PMU_WAKEUP_PM2_MASK1_SGPIO_INTB_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK1_USB_MASK            (0x40000U)\r\n#define PMU_WAKEUP_PM2_MASK1_USB_SHIFT           (18U)\r\n/*! USB - USB Wakeup Mask\r\n *  0b0..mask usb wakeup interrupt\r\n *  0b1..unmask usb wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK1_USB(x)              (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK1_USB_SHIFT)) & PMU_WAKEUP_PM2_MASK1_USB_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK1_DMA1_MASK           (0x400000U)\r\n#define PMU_WAKEUP_PM2_MASK1_DMA1_SHIFT          (22U)\r\n/*! DMA1 - DMA1 Wakeup Mask\r\n *  0b0..mask dma1 wakeup interrupt\r\n *  0b1..unmask dma1 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK1_DMA1(x)             (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK1_DMA1_SHIFT)) & PMU_WAKEUP_PM2_MASK1_DMA1_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK1_PUF_MASK            (0x800000U)\r\n#define PMU_WAKEUP_PM2_MASK1_PUF_SHIFT           (23U)\r\n/*! PUF - PUF Wakeup Mask\r\n *  0b0..mask puf wakeup interrupt\r\n *  0b1..unmask puf wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK1_PUF(x)              (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK1_PUF_SHIFT)) & PMU_WAKEUP_PM2_MASK1_PUF_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK1_POWER_QUAD_MASK     (0x1000000U)\r\n#define PMU_WAKEUP_PM2_MASK1_POWER_QUAD_SHIFT    (24U)\r\n/*! POWER_QUAD - POWER QUAD Wakeup Mask\r\n *  0b0..mask power_quad wakeup interrupt\r\n *  0b1..unmask power_quad wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK1_POWER_QUAD(x)       (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK1_POWER_QUAD_SHIFT)) & PMU_WAKEUP_PM2_MASK1_POWER_QUAD_MASK)\r\n/*! @} */\r\n\r\n/*! @name WAKEUP_PM2_MASK3 - Wakeup PM2 state Mask Interrupt Register */\r\n/*! @{ */\r\n\r\n#define PMU_WAKEUP_PM2_MASK3_GAU_GPDAC_INT_FUN11_MASK (0x1000U)\r\n#define PMU_WAKEUP_PM2_MASK3_GAU_GPDAC_INT_FUN11_SHIFT (12U)\r\n/*! GAU_GPDAC_INT_FUN11 - gau_gpdac_int_fun11 Wakeup Mask\r\n *  0b0..mask gau_gpdac_int_fun11 wakeup interrupt\r\n *  0b1..unmask gau_gpdac_int_fun11 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK3_GAU_GPDAC_INT_FUN11(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK3_GAU_GPDAC_INT_FUN11_SHIFT)) & PMU_WAKEUP_PM2_MASK3_GAU_GPDAC_INT_FUN11_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK3_GAU_ACOMP_INT_WKUP11_MASK (0x2000U)\r\n#define PMU_WAKEUP_PM2_MASK3_GAU_ACOMP_INT_WKUP11_SHIFT (13U)\r\n/*! GAU_ACOMP_INT_WKUP11 - gau_acomp_int_wkup11 Wakeup Mask\r\n *  0b0..mask gau_acomp_int_wkup11 wakeup interrupt\r\n *  0b1..unmask gau_acomp_int_wkup11 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK3_GAU_ACOMP_INT_WKUP11(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK3_GAU_ACOMP_INT_WKUP11_SHIFT)) & PMU_WAKEUP_PM2_MASK3_GAU_ACOMP_INT_WKUP11_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK3_GAU_ACOMP_INT_FUNC11_MASK (0x4000U)\r\n#define PMU_WAKEUP_PM2_MASK3_GAU_ACOMP_INT_FUNC11_SHIFT (14U)\r\n/*! GAU_ACOMP_INT_FUNC11 - gau_acomp_int_func11 Wakeup Mask\r\n *  0b0..mask gau_acomp_int_func11 wakeup interrupt\r\n *  0b1..unmask gau_acomp_int_func11 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK3_GAU_ACOMP_INT_FUNC11(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK3_GAU_ACOMP_INT_FUNC11_SHIFT)) & PMU_WAKEUP_PM2_MASK3_GAU_ACOMP_INT_FUNC11_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK3_GAU_GPADC1_INT_FUNC11_MASK (0x8000U)\r\n#define PMU_WAKEUP_PM2_MASK3_GAU_GPADC1_INT_FUNC11_SHIFT (15U)\r\n/*! GAU_GPADC1_INT_FUNC11 - gau_gpadc1_int_func11 Wakeup Mask\r\n *  0b0..mask gau_gpadc1_int_func11 wakeup interrupt\r\n *  0b1..unmask gau_gpadc1_int_func11 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK3_GAU_GPADC1_INT_FUNC11(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK3_GAU_GPADC1_INT_FUNC11_SHIFT)) & PMU_WAKEUP_PM2_MASK3_GAU_GPADC1_INT_FUNC11_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK3_GAU_GPADC0_INT_FUNC11_MASK (0x10000U)\r\n#define PMU_WAKEUP_PM2_MASK3_GAU_GPADC0_INT_FUNC11_SHIFT (16U)\r\n/*! GAU_GPADC0_INT_FUNC11 - gau_gpadc0_int_func11 Wakeup Mask\r\n *  0b0..mask gau_gpadc0_int_func11 wakeup interrupt\r\n *  0b1..unmask gau_gpadc0_int_func11 wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK3_GAU_GPADC0_INT_FUNC11(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK3_GAU_GPADC0_INT_FUNC11_SHIFT)) & PMU_WAKEUP_PM2_MASK3_GAU_GPADC0_INT_FUNC11_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK3_USIM_MASK           (0x20000U)\r\n#define PMU_WAKEUP_PM2_MASK3_USIM_SHIFT          (17U)\r\n/*! USIM - usim Wakeup Mask\r\n *  0b0..mask usim wakeup interrupt\r\n *  0b1..unmask usim wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK3_USIM(x)             (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK3_USIM_SHIFT)) & PMU_WAKEUP_PM2_MASK3_USIM_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK3_ENET_MASK           (0x80000U)\r\n#define PMU_WAKEUP_PM2_MASK3_ENET_SHIFT          (19U)\r\n/*! ENET - enet Wakeup Mask\r\n *  0b0..mask enet wakeup interrupt\r\n *  0b1..unmask enet wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK3_ENET(x)             (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK3_ENET_SHIFT)) & PMU_WAKEUP_PM2_MASK3_ENET_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK3_ENET_TIMER_MASK     (0x100000U)\r\n#define PMU_WAKEUP_PM2_MASK3_ENET_TIMER_SHIFT    (20U)\r\n/*! ENET_TIMER - enet_timer Wakeup Mask\r\n *  0b0..mask enet_timer wakeup interrupt\r\n *  0b1..unmask enet_timer wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK3_ENET_TIMER(x)       (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK3_ENET_TIMER_SHIFT)) & PMU_WAKEUP_PM2_MASK3_ENET_TIMER_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_MASK3_ITRC_RST_MASK       (0x800000U)\r\n#define PMU_WAKEUP_PM2_MASK3_ITRC_RST_SHIFT      (23U)\r\n/*! ITRC_RST - itrc_rst Wakeup Mask\r\n *  0b0..mask itrc_rst wakeup interrupt\r\n *  0b1..unmask itrc_rst wakeup interrupt\r\n */\r\n#define PMU_WAKEUP_PM2_MASK3_ITRC_RST(x)         (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_MASK3_ITRC_RST_SHIFT)) & PMU_WAKEUP_PM2_MASK3_ITRC_RST_MASK)\r\n/*! @} */\r\n\r\n/*! @name WAKEUP_PM2_STATUS0 - Wakeup PM2 status Register */\r\n/*! @{ */\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_WDT0_MASK         (0x1U)\r\n#define PMU_WAKEUP_PM2_STATUS0_WDT0_SHIFT        (0U)\r\n/*! WDT0 - WDT0 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_WDT0(x)           (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_WDT0_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_WDT0_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_DMA0_MASK         (0x2U)\r\n#define PMU_WAKEUP_PM2_STATUS0_DMA0_SHIFT        (1U)\r\n/*! DMA0 - DMA0 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_DMA0(x)           (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_DMA0_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_DMA0_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_GPIO_INTA_MASK    (0x4U)\r\n#define PMU_WAKEUP_PM2_STATUS0_GPIO_INTA_SHIFT   (2U)\r\n/*! GPIO_INTA - GPIO_INTA interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_GPIO_INTA(x)      (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_GPIO_INTA_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_GPIO_INTA_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_GPIO_INTB_MASK    (0x8U)\r\n#define PMU_WAKEUP_PM2_STATUS0_GPIO_INTB_SHIFT   (3U)\r\n/*! GPIO_INTB - GPIO_INTB interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_GPIO_INTB(x)      (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_GPIO_INTB_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_GPIO_INTB_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_PIN_INT0_MASK     (0x10U)\r\n#define PMU_WAKEUP_PM2_STATUS0_PIN_INT0_SHIFT    (4U)\r\n/*! PIN_INT0 - PIN_INT0 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_PIN_INT0(x)       (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_PIN_INT0_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_PIN_INT0_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_PIN_INT1_MASK     (0x20U)\r\n#define PMU_WAKEUP_PM2_STATUS0_PIN_INT1_SHIFT    (5U)\r\n/*! PIN_INT1 - PIN_INT1 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_PIN_INT1(x)       (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_PIN_INT1_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_PIN_INT1_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_PIN_INT2_MASK     (0x40U)\r\n#define PMU_WAKEUP_PM2_STATUS0_PIN_INT2_SHIFT    (6U)\r\n/*! PIN_INT2 - PIN_INT2 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_PIN_INT2(x)       (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_PIN_INT2_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_PIN_INT2_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_PIN_INT3_MASK     (0x80U)\r\n#define PMU_WAKEUP_PM2_STATUS0_PIN_INT3_SHIFT    (7U)\r\n/*! PIN_INT3 - PIN_INT3 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_PIN_INT3(x)       (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_PIN_INT3_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_PIN_INT3_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_UTICK_MASK        (0x100U)\r\n#define PMU_WAKEUP_PM2_STATUS0_UTICK_SHIFT       (8U)\r\n/*! UTICK - UTICK interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_UTICK(x)          (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_UTICK_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_UTICK_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_MRT_MASK          (0x200U)\r\n#define PMU_WAKEUP_PM2_STATUS0_MRT_SHIFT         (9U)\r\n/*! MRT - MRT interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_MRT(x)            (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_MRT_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_MRT_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_CTIMER0_MASK      (0x400U)\r\n#define PMU_WAKEUP_PM2_STATUS0_CTIMER0_SHIFT     (10U)\r\n/*! CTIMER0 - CTIMER0 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_CTIMER0(x)        (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_CTIMER0_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_CTIMER0_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_CTIMER1_MASK      (0x800U)\r\n#define PMU_WAKEUP_PM2_STATUS0_CTIMER1_SHIFT     (11U)\r\n/*! CTIMER1 - CTIMER1 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_CTIMER1(x)        (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_CTIMER1_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_CTIMER1_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_SCT0_MASK         (0x1000U)\r\n#define PMU_WAKEUP_PM2_STATUS0_SCT0_SHIFT        (12U)\r\n/*! SCT0 - SCT0 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_SCT0(x)           (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_SCT0_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_SCT0_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_CTIMER3_MASK      (0x2000U)\r\n#define PMU_WAKEUP_PM2_STATUS0_CTIMER3_SHIFT     (13U)\r\n/*! CTIMER3 - CTIMER3 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_CTIMER3(x)        (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_CTIMER3_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_CTIMER3_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_FLEXCOMM0_MASK    (0x4000U)\r\n#define PMU_WAKEUP_PM2_STATUS0_FLEXCOMM0_SHIFT   (14U)\r\n/*! FLEXCOMM0 - FLEXCOMM0 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_FLEXCOMM0(x)      (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_FLEXCOMM0_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_FLEXCOMM0_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_FLEXCOMM1_MASK    (0x8000U)\r\n#define PMU_WAKEUP_PM2_STATUS0_FLEXCOMM1_SHIFT   (15U)\r\n/*! FLEXCOMM1 - FLEXCOMM1 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_FLEXCOMM1(x)      (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_FLEXCOMM1_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_FLEXCOMM1_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_FLEXCOMM2_MASK    (0x10000U)\r\n#define PMU_WAKEUP_PM2_STATUS0_FLEXCOMM2_SHIFT   (16U)\r\n/*! FLEXCOMM2 - FLEXCOMM2 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_FLEXCOMM2(x)      (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_FLEXCOMM2_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_FLEXCOMM2_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_FLEXCOMM3_MASK    (0x20000U)\r\n#define PMU_WAKEUP_PM2_STATUS0_FLEXCOMM3_SHIFT   (17U)\r\n/*! FLEXCOMM3 - FLEXCOMM3 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_FLEXCOMM3(x)      (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_FLEXCOMM3_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_FLEXCOMM3_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_FLEXCOMM14_MASK   (0x100000U)\r\n#define PMU_WAKEUP_PM2_STATUS0_FLEXCOMM14_SHIFT  (20U)\r\n/*! FLEXCOMM14 - FLEXCOMM14 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_FLEXCOMM14(x)     (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_FLEXCOMM14_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_FLEXCOMM14_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_FREEMRT_GLOBAL_MASK (0x800000U)\r\n#define PMU_WAKEUP_PM2_STATUS0_FREEMRT_GLOBAL_SHIFT (23U)\r\n/*! FREEMRT_GLOBAL - Free Multi-rate timer interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_FREEMRT_GLOBAL(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_FREEMRT_GLOBAL_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_FREEMRT_GLOBAL_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_DMIC_MASK         (0x2000000U)\r\n#define PMU_WAKEUP_PM2_STATUS0_DMIC_SHIFT        (25U)\r\n/*! DMIC - DMIC interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_DMIC(x)           (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_DMIC_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_DMIC_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_WAKEUP_FROM_DEEPSLEEP_MASK (0x4000000U)\r\n#define PMU_WAKEUP_PM2_STATUS0_WAKEUP_FROM_DEEPSLEEP_SHIFT (26U)\r\n/*! WAKEUP_FROM_DEEPSLEEP - Wakeup from Deepsleep interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_WAKEUP_FROM_DEEPSLEEP(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_WAKEUP_FROM_DEEPSLEEP_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_WAKEUP_FROM_DEEPSLEEP_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_HYPERVISOR_MASK   (0x8000000U)\r\n#define PMU_WAKEUP_PM2_STATUS0_HYPERVISOR_SHIFT  (27U)\r\n/*! HYPERVISOR - HYPERVISOR interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_HYPERVISOR(x)     (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_HYPERVISOR_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_HYPERVISOR_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_SECUREVIOLATION_MASK (0x10000000U)\r\n#define PMU_WAKEUP_PM2_STATUS0_SECUREVIOLATION_SHIFT (28U)\r\n/*! SECUREVIOLATION - Secure Violation interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_SECUREVIOLATION(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_SECUREVIOLATION_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_SECUREVIOLATION_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS0_HWVAD_MASK        (0x20000000U)\r\n#define PMU_WAKEUP_PM2_STATUS0_HWVAD_SHIFT       (29U)\r\n/*! HWVAD - Hardware Voice Activity Detector interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS0_HWVAD(x)          (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS0_HWVAD_SHIFT)) & PMU_WAKEUP_PM2_STATUS0_HWVAD_MASK)\r\n/*! @} */\r\n\r\n/*! @name WAKEUP_PM2_STATUS1 - Wakeup PM2 status Register */\r\n/*! @{ */\r\n\r\n#define PMU_WAKEUP_PM2_STATUS1_RTC_MASK          (0x1U)\r\n#define PMU_WAKEUP_PM2_STATUS1_RTC_SHIFT         (0U)\r\n/*! RTC - rtc interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS1_RTC(x)            (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS1_RTC_SHIFT)) & PMU_WAKEUP_PM2_STATUS1_RTC_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS1_PIN_INT4_MASK     (0x8U)\r\n#define PMU_WAKEUP_PM2_STATUS1_PIN_INT4_SHIFT    (3U)\r\n/*! PIN_INT4 - PIN_INT4 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS1_PIN_INT4(x)       (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS1_PIN_INT4_SHIFT)) & PMU_WAKEUP_PM2_STATUS1_PIN_INT4_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS1_PIN_INT5_MASK     (0x10U)\r\n#define PMU_WAKEUP_PM2_STATUS1_PIN_INT5_SHIFT    (4U)\r\n/*! PIN_INT5 - PIN_INT5 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS1_PIN_INT5(x)       (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS1_PIN_INT5_SHIFT)) & PMU_WAKEUP_PM2_STATUS1_PIN_INT5_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS1_PIN_INT6_MASK     (0x20U)\r\n#define PMU_WAKEUP_PM2_STATUS1_PIN_INT6_SHIFT    (5U)\r\n/*! PIN_INT6 - PIN_INT6 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS1_PIN_INT6(x)       (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS1_PIN_INT6_SHIFT)) & PMU_WAKEUP_PM2_STATUS1_PIN_INT6_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS1_PIN_INT7_MASK     (0x40U)\r\n#define PMU_WAKEUP_PM2_STATUS1_PIN_INT7_SHIFT    (6U)\r\n/*! PIN_INT7 - PIN_INT7 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS1_PIN_INT7(x)       (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS1_PIN_INT7_SHIFT)) & PMU_WAKEUP_PM2_STATUS1_PIN_INT7_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS1_CTIMER2_MASK      (0x80U)\r\n#define PMU_WAKEUP_PM2_STATUS1_CTIMER2_SHIFT     (7U)\r\n/*! CTIMER2 - CTIMER2 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS1_CTIMER2(x)        (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS1_CTIMER2_SHIFT)) & PMU_WAKEUP_PM2_STATUS1_CTIMER2_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS1_OS_EVENT_TIMER_MASK (0x200U)\r\n#define PMU_WAKEUP_PM2_STATUS1_OS_EVENT_TIMER_SHIFT (9U)\r\n/*! OS_EVENT_TIMER - OS_EVENT_TIMER interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS1_OS_EVENT_TIMER(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS1_OS_EVENT_TIMER_SHIFT)) & PMU_WAKEUP_PM2_STATUS1_OS_EVENT_TIMER_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS1_FLEX_SPI_MASK     (0x400U)\r\n#define PMU_WAKEUP_PM2_STATUS1_FLEX_SPI_SHIFT    (10U)\r\n/*! FLEX_SPI - Flex SPI interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS1_FLEX_SPI(x)       (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS1_FLEX_SPI_SHIFT)) & PMU_WAKEUP_PM2_STATUS1_FLEX_SPI_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS1_SDU_MASK          (0x4000U)\r\n#define PMU_WAKEUP_PM2_STATUS1_SDU_SHIFT         (14U)\r\n/*! SDU - SDU interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS1_SDU(x)            (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS1_SDU_SHIFT)) & PMU_WAKEUP_PM2_STATUS1_SDU_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS1_SGPIO_INTA_MASK   (0x8000U)\r\n#define PMU_WAKEUP_PM2_STATUS1_SGPIO_INTA_SHIFT  (15U)\r\n/*! SGPIO_INTA - SGPIO_INTA interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS1_SGPIO_INTA(x)     (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS1_SGPIO_INTA_SHIFT)) & PMU_WAKEUP_PM2_STATUS1_SGPIO_INTA_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS1_SGPIO_INTB_MASK   (0x10000U)\r\n#define PMU_WAKEUP_PM2_STATUS1_SGPIO_INTB_SHIFT  (16U)\r\n/*! SGPIO_INTB - SGPIO_INTB interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS1_SGPIO_INTB(x)     (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS1_SGPIO_INTB_SHIFT)) & PMU_WAKEUP_PM2_STATUS1_SGPIO_INTB_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS1_USB_MASK          (0x40000U)\r\n#define PMU_WAKEUP_PM2_STATUS1_USB_SHIFT         (18U)\r\n/*! USB - USB interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS1_USB(x)            (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS1_USB_SHIFT)) & PMU_WAKEUP_PM2_STATUS1_USB_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS1_DMA1_MASK         (0x400000U)\r\n#define PMU_WAKEUP_PM2_STATUS1_DMA1_SHIFT        (22U)\r\n/*! DMA1 - DMA1 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS1_DMA1(x)           (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS1_DMA1_SHIFT)) & PMU_WAKEUP_PM2_STATUS1_DMA1_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS1_PUF_MASK          (0x800000U)\r\n#define PMU_WAKEUP_PM2_STATUS1_PUF_SHIFT         (23U)\r\n/*! PUF - PUF interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS1_PUF(x)            (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS1_PUF_SHIFT)) & PMU_WAKEUP_PM2_STATUS1_PUF_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS1_POWER_QUAD_MASK   (0x1000000U)\r\n#define PMU_WAKEUP_PM2_STATUS1_POWER_QUAD_SHIFT  (24U)\r\n/*! POWER_QUAD - POWER QUAD interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS1_POWER_QUAD(x)     (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS1_POWER_QUAD_SHIFT)) & PMU_WAKEUP_PM2_STATUS1_POWER_QUAD_MASK)\r\n/*! @} */\r\n\r\n/*! @name WAKEUP_PM2_STATUS3 - WAKEUP_PM2_STATUS3 */\r\n/*! @{ */\r\n\r\n#define PMU_WAKEUP_PM2_STATUS3_GAU_GPDAC_INT_FUN11_MASK (0x1000U)\r\n#define PMU_WAKEUP_PM2_STATUS3_GAU_GPDAC_INT_FUN11_SHIFT (12U)\r\n/*! GAU_GPDAC_INT_FUN11 - gau_gpdac_int_fun11 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS3_GAU_GPDAC_INT_FUN11(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS3_GAU_GPDAC_INT_FUN11_SHIFT)) & PMU_WAKEUP_PM2_STATUS3_GAU_GPDAC_INT_FUN11_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS3_GAU_ACOMP_INT_WKUP11_MASK (0x2000U)\r\n#define PMU_WAKEUP_PM2_STATUS3_GAU_ACOMP_INT_WKUP11_SHIFT (13U)\r\n/*! GAU_ACOMP_INT_WKUP11 - gau_acomp_int_wkup11 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS3_GAU_ACOMP_INT_WKUP11(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS3_GAU_ACOMP_INT_WKUP11_SHIFT)) & PMU_WAKEUP_PM2_STATUS3_GAU_ACOMP_INT_WKUP11_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS3_GAU_ACOMP_INT_FUNC11_MASK (0x4000U)\r\n#define PMU_WAKEUP_PM2_STATUS3_GAU_ACOMP_INT_FUNC11_SHIFT (14U)\r\n/*! GAU_ACOMP_INT_FUNC11 - gau_acomp_int_func11 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS3_GAU_ACOMP_INT_FUNC11(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS3_GAU_ACOMP_INT_FUNC11_SHIFT)) & PMU_WAKEUP_PM2_STATUS3_GAU_ACOMP_INT_FUNC11_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS3_GAU_GPADC1_INT_FUNC11_MASK (0x8000U)\r\n#define PMU_WAKEUP_PM2_STATUS3_GAU_GPADC1_INT_FUNC11_SHIFT (15U)\r\n/*! GAU_GPADC1_INT_FUNC11 - gau_gpadc1_int_func11 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS3_GAU_GPADC1_INT_FUNC11(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS3_GAU_GPADC1_INT_FUNC11_SHIFT)) & PMU_WAKEUP_PM2_STATUS3_GAU_GPADC1_INT_FUNC11_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS3_GAU_GPADC0_INT_FUNC11_MASK (0x10000U)\r\n#define PMU_WAKEUP_PM2_STATUS3_GAU_GPADC0_INT_FUNC11_SHIFT (16U)\r\n/*! GAU_GPADC0_INT_FUNC11 - gau_gpadc0_int_func11 interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS3_GAU_GPADC0_INT_FUNC11(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS3_GAU_GPADC0_INT_FUNC11_SHIFT)) & PMU_WAKEUP_PM2_STATUS3_GAU_GPADC0_INT_FUNC11_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS3_USIM_MASK         (0x20000U)\r\n#define PMU_WAKEUP_PM2_STATUS3_USIM_SHIFT        (17U)\r\n/*! USIM - usim interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS3_USIM(x)           (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS3_USIM_SHIFT)) & PMU_WAKEUP_PM2_STATUS3_USIM_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS3_ENET_MASK         (0x80000U)\r\n#define PMU_WAKEUP_PM2_STATUS3_ENET_SHIFT        (19U)\r\n/*! ENET - enet interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS3_ENET(x)           (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS3_ENET_SHIFT)) & PMU_WAKEUP_PM2_STATUS3_ENET_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS3_ENET_TIMER_MASK   (0x100000U)\r\n#define PMU_WAKEUP_PM2_STATUS3_ENET_TIMER_SHIFT  (20U)\r\n/*! ENET_TIMER - enet_timer interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS3_ENET_TIMER(x)     (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS3_ENET_TIMER_SHIFT)) & PMU_WAKEUP_PM2_STATUS3_ENET_TIMER_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_STATUS3_ITRC_RST_MASK     (0x800000U)\r\n#define PMU_WAKEUP_PM2_STATUS3_ITRC_RST_SHIFT    (23U)\r\n/*! ITRC_RST - itrc_rst interrupt wakeup status */\r\n#define PMU_WAKEUP_PM2_STATUS3_ITRC_RST(x)       (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_STATUS3_ITRC_RST_SHIFT)) & PMU_WAKEUP_PM2_STATUS3_ITRC_RST_MASK)\r\n/*! @} */\r\n\r\n/*! @name WAKEUP_PM2_SRC_CLR0 - Wakeup PM2 source clear Register */\r\n/*! @{ */\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_WDT0_MASK        (0x1U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_WDT0_SHIFT       (0U)\r\n/*! WDT0 - clear WDT0 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_WDT0(x)          (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_WDT0_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_WDT0_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_DMA0_MASK        (0x2U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_DMA0_SHIFT       (1U)\r\n/*! DMA0 - clear DMA0 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_DMA0(x)          (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_DMA0_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_DMA0_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_GPIO_INTA_MASK   (0x4U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_GPIO_INTA_SHIFT  (2U)\r\n/*! GPIO_INTA - clear GPIO_INTA interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_GPIO_INTA(x)     (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_GPIO_INTA_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_GPIO_INTA_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_GPIO_INTB_MASK   (0x8U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_GPIO_INTB_SHIFT  (3U)\r\n/*! GPIO_INTB - clear GPIO_INTB interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_GPIO_INTB(x)     (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_GPIO_INTB_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_GPIO_INTB_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_PIN_INT0_MASK    (0x10U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_PIN_INT0_SHIFT   (4U)\r\n/*! PIN_INT0 - clear PIN_INT0 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_PIN_INT0(x)      (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_PIN_INT0_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_PIN_INT0_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_PIN_INT1_MASK    (0x20U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_PIN_INT1_SHIFT   (5U)\r\n/*! PIN_INT1 - clear PIN_INT1 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_PIN_INT1(x)      (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_PIN_INT1_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_PIN_INT1_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_PIN_INT2_MASK    (0x40U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_PIN_INT2_SHIFT   (6U)\r\n/*! PIN_INT2 - clear PIN_INT2 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_PIN_INT2(x)      (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_PIN_INT2_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_PIN_INT2_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_PIN_INT3_MASK    (0x80U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_PIN_INT3_SHIFT   (7U)\r\n/*! PIN_INT3 - clear PIN_INT3 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_PIN_INT3(x)      (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_PIN_INT3_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_PIN_INT3_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_UTICK_MASK       (0x100U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_UTICK_SHIFT      (8U)\r\n/*! UTICK - clear UTICK interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_UTICK(x)         (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_UTICK_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_UTICK_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_MRT_MASK         (0x200U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_MRT_SHIFT        (9U)\r\n/*! MRT - clear MRT interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_MRT(x)           (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_MRT_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_MRT_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_CTIMER0_MASK     (0x400U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_CTIMER0_SHIFT    (10U)\r\n/*! CTIMER0 - clear CTIMER0 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_CTIMER0(x)       (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_CTIMER0_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_CTIMER0_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_CTIMER1_MASK     (0x800U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_CTIMER1_SHIFT    (11U)\r\n/*! CTIMER1 - clear CTIMER1 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_CTIMER1(x)       (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_CTIMER1_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_CTIMER1_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_SCT0_MASK        (0x1000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_SCT0_SHIFT       (12U)\r\n/*! SCT0 - clear SCT0 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_SCT0(x)          (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_SCT0_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_SCT0_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_CTIMER3_MASK     (0x2000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_CTIMER3_SHIFT    (13U)\r\n/*! CTIMER3 - clear CTIMER3 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_CTIMER3(x)       (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_CTIMER3_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_CTIMER3_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM0_MASK   (0x4000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM0_SHIFT  (14U)\r\n/*! FLEXCOMM0 - clear FLEXCOMM0 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM0(x)     (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM0_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM0_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM1_MASK   (0x8000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM1_SHIFT  (15U)\r\n/*! FLEXCOMM1 - clear FLEXCOMM1 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM1(x)     (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM1_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM1_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM2_MASK   (0x10000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM2_SHIFT  (16U)\r\n/*! FLEXCOMM2 - clear FLEXCOMM2 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM2(x)     (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM2_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM2_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM3_MASK   (0x20000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM3_SHIFT  (17U)\r\n/*! FLEXCOMM3 - clear FLEXCOMM3 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM3(x)     (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM3_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM3_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM14_MASK  (0x100000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM14_SHIFT (20U)\r\n/*! FLEXCOMM14 - clear FLEXCOMM14 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM14(x)    (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM14_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_FLEXCOMM14_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_FREEMRT_GLOBAL_MASK (0x800000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_FREEMRT_GLOBAL_SHIFT (23U)\r\n/*! FREEMRT_GLOBAL - clear Free Multi-rate timer interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_FREEMRT_GLOBAL(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_FREEMRT_GLOBAL_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_FREEMRT_GLOBAL_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_DMIC_MASK        (0x2000000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_DMIC_SHIFT       (25U)\r\n/*! DMIC - clear DMIC interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_DMIC(x)          (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_DMIC_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_DMIC_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_WAKEUP_FROM_DEEPSLEEP_MASK (0x4000000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_WAKEUP_FROM_DEEPSLEEP_SHIFT (26U)\r\n/*! WAKEUP_FROM_DEEPSLEEP - clear Wakeup from Deepsleep interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_WAKEUP_FROM_DEEPSLEEP(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_WAKEUP_FROM_DEEPSLEEP_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_WAKEUP_FROM_DEEPSLEEP_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_HYPERVISOR_MASK  (0x8000000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_HYPERVISOR_SHIFT (27U)\r\n/*! HYPERVISOR - clear HYPERVISOR interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_HYPERVISOR(x)    (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_HYPERVISOR_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_HYPERVISOR_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_SECUREVIOLATION_MASK (0x10000000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_SECUREVIOLATION_SHIFT (28U)\r\n/*! SECUREVIOLATION - clear Secure Violation interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_SECUREVIOLATION(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_SECUREVIOLATION_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_SECUREVIOLATION_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_HWVAD_MASK       (0x20000000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_HWVAD_SHIFT      (29U)\r\n/*! HWVAD - clear Hardware Voice Activity Detector interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR0_HWVAD(x)         (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR0_HWVAD_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR0_HWVAD_MASK)\r\n/*! @} */\r\n\r\n/*! @name WAKEUP_PM2_SRC_CLR1 - Wakeup PM2 source clear Register */\r\n/*! @{ */\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_RTC_MASK         (0x1U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_RTC_SHIFT        (0U)\r\n/*! RTC - clear rtc interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_RTC(x)           (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR1_RTC_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR1_RTC_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_PIN_INT4_MASK    (0x8U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_PIN_INT4_SHIFT   (3U)\r\n/*! PIN_INT4 - clear PIN_INT4 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_PIN_INT4(x)      (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR1_PIN_INT4_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR1_PIN_INT4_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_PIN_INT5_MASK    (0x10U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_PIN_INT5_SHIFT   (4U)\r\n/*! PIN_INT5 - clear PIN_INT5 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_PIN_INT5(x)      (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR1_PIN_INT5_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR1_PIN_INT5_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_PIN_INT6_MASK    (0x20U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_PIN_INT6_SHIFT   (5U)\r\n/*! PIN_INT6 - clear PIN_INT6 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_PIN_INT6(x)      (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR1_PIN_INT6_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR1_PIN_INT6_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_PIN_INT7_MASK    (0x40U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_PIN_INT7_SHIFT   (6U)\r\n/*! PIN_INT7 - clear PIN_INT7 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_PIN_INT7(x)      (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR1_PIN_INT7_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR1_PIN_INT7_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_CTIMER2_MASK     (0x80U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_CTIMER2_SHIFT    (7U)\r\n/*! CTIMER2 - clear CTIMER2 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_CTIMER2(x)       (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR1_CTIMER2_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR1_CTIMER2_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_OS_EVENT_TIMER_MASK (0x200U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_OS_EVENT_TIMER_SHIFT (9U)\r\n/*! OS_EVENT_TIMER - clear OS_EVENT_TIMER interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_OS_EVENT_TIMER(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR1_OS_EVENT_TIMER_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR1_OS_EVENT_TIMER_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_FLEX_SPI_MASK    (0x400U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_FLEX_SPI_SHIFT   (10U)\r\n/*! FLEX_SPI - clear Flex SPI interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_FLEX_SPI(x)      (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR1_FLEX_SPI_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR1_FLEX_SPI_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_SDU_MASK         (0x4000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_SDU_SHIFT        (14U)\r\n/*! SDU - clear SDU interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_SDU(x)           (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR1_SDU_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR1_SDU_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_SGPIO_INTA_MASK  (0x8000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_SGPIO_INTA_SHIFT (15U)\r\n/*! SGPIO_INTA - clear SGPIO_INTA interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_SGPIO_INTA(x)    (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR1_SGPIO_INTA_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR1_SGPIO_INTA_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_SGPIO_INTB_MASK  (0x10000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_SGPIO_INTB_SHIFT (16U)\r\n/*! SGPIO_INTB - clear SGPIO_INTB interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_SGPIO_INTB(x)    (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR1_SGPIO_INTB_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR1_SGPIO_INTB_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_USB_MASK         (0x40000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_USB_SHIFT        (18U)\r\n/*! USB - clear USB interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_USB(x)           (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR1_USB_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR1_USB_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_DMA1_MASK        (0x400000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_DMA1_SHIFT       (22U)\r\n/*! DMA1 - clear DMA1 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_DMA1(x)          (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR1_DMA1_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR1_DMA1_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_PUF_MASK         (0x800000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_PUF_SHIFT        (23U)\r\n/*! PUF - clear PUF interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_PUF(x)           (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR1_PUF_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR1_PUF_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_POWER_QUAD_MASK  (0x1000000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_POWER_QUAD_SHIFT (24U)\r\n/*! POWER_QUAD - clear POWER QUAD interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR1_POWER_QUAD(x)    (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR1_POWER_QUAD_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR1_POWER_QUAD_MASK)\r\n/*! @} */\r\n\r\n/*! @name WAKEUP_PM2_SRC_CLR3 - Wakeup PM2 source clear Register */\r\n/*! @{ */\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_GAU_GPDAC_INT_FUN11_MASK (0x1000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_GAU_GPDAC_INT_FUN11_SHIFT (12U)\r\n/*! GAU_GPDAC_INT_FUN11 - clear gau_gpdac_int_fun11 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_GAU_GPDAC_INT_FUN11(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR3_GAU_GPDAC_INT_FUN11_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR3_GAU_GPDAC_INT_FUN11_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_GAU_ACOMP_INT_WKUP11_MASK (0x2000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_GAU_ACOMP_INT_WKUP11_SHIFT (13U)\r\n/*! GAU_ACOMP_INT_WKUP11 - clear gau_acomp_int_wkup11 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_GAU_ACOMP_INT_WKUP11(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR3_GAU_ACOMP_INT_WKUP11_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR3_GAU_ACOMP_INT_WKUP11_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_GAU_ACOMP_INT_FUNC11_MASK (0x4000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_GAU_ACOMP_INT_FUNC11_SHIFT (14U)\r\n/*! GAU_ACOMP_INT_FUNC11 - clear gau_acomp_int_func11 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_GAU_ACOMP_INT_FUNC11(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR3_GAU_ACOMP_INT_FUNC11_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR3_GAU_ACOMP_INT_FUNC11_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_GAU_GPADC1_INT_FUNC11_MASK (0x8000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_GAU_GPADC1_INT_FUNC11_SHIFT (15U)\r\n/*! GAU_GPADC1_INT_FUNC11 - clear gau_gpadc1_int_func11 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_GAU_GPADC1_INT_FUNC11(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR3_GAU_GPADC1_INT_FUNC11_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR3_GAU_GPADC1_INT_FUNC11_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_GAU_GPADC0_INT_FUNC11_MASK (0x10000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_GAU_GPADC0_INT_FUNC11_SHIFT (16U)\r\n/*! GAU_GPADC0_INT_FUNC11 - clear gau_gpadc0_int_func11 interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_GAU_GPADC0_INT_FUNC11(x) (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR3_GAU_GPADC0_INT_FUNC11_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR3_GAU_GPADC0_INT_FUNC11_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_USIM_MASK        (0x20000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_USIM_SHIFT       (17U)\r\n/*! USIM - clear usim interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_USIM(x)          (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR3_USIM_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR3_USIM_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_ENET_MASK        (0x80000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_ENET_SHIFT       (19U)\r\n/*! ENET - clear enet interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_ENET(x)          (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR3_ENET_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR3_ENET_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_ENET_TIMER_MASK  (0x100000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_ENET_TIMER_SHIFT (20U)\r\n/*! ENET_TIMER - clear enet_timer interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_ENET_TIMER(x)    (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR3_ENET_TIMER_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR3_ENET_TIMER_MASK)\r\n\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_ITRC_RST_MASK    (0x800000U)\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_ITRC_RST_SHIFT   (23U)\r\n/*! ITRC_RST - clear itrc_rst interrupt request */\r\n#define PMU_WAKEUP_PM2_SRC_CLR3_ITRC_RST(x)      (((uint32_t)(((uint32_t)(x)) << PMU_WAKEUP_PM2_SRC_CLR3_ITRC_RST_SHIFT)) & PMU_WAKEUP_PM2_SRC_CLR3_ITRC_RST_MASK)\r\n/*! @} */\r\n\r\n/*! @name SW_CTRL_WL - WL part-SW Control register bypass HW output */\r\n/*! @{ */\r\n\r\n#define PMU_SW_CTRL_WL_WL_EN_MASK                (0x1U)\r\n#define PMU_SW_CTRL_WL_WL_EN_SHIFT               (0U)\r\n/*! WL_EN - WL part-SW bypass pmu HW output enable;1:SW mode;0:HW mode */\r\n#define PMU_SW_CTRL_WL_WL_EN(x)                  (((uint32_t)(((uint32_t)(x)) << PMU_SW_CTRL_WL_WL_EN_SHIFT)) & PMU_SW_CTRL_WL_WL_EN_MASK)\r\n\r\n#define PMU_SW_CTRL_WL_MCI_ISO_WL_N_MASK         (0x8U)\r\n#define PMU_SW_CTRL_WL_MCI_ISO_WL_N_SHIFT        (3U)\r\n/*! MCI_ISO_WL_N - MCI_ISO_WL_EN_N, 0:iso enable,assert iso before psw off; 1:iso disable,release iso after psw on; */\r\n#define PMU_SW_CTRL_WL_MCI_ISO_WL_N(x)           (((uint32_t)(((uint32_t)(x)) << PMU_SW_CTRL_WL_MCI_ISO_WL_N_SHIFT)) & PMU_SW_CTRL_WL_MCI_ISO_WL_N_MASK)\r\n\r\n#define PMU_SW_CTRL_WL_PSW_WL_PD_MASK            (0x40U)\r\n#define PMU_SW_CTRL_WL_PSW_WL_PD_SHIFT           (6U)\r\n/*! PSW_WL_PD - psw_wl, 0:power on, after request buck on,then delay some time to set psw on;\r\n *    1:power gated, do it before request buck off\r\n */\r\n#define PMU_SW_CTRL_WL_PSW_WL_PD(x)              (((uint32_t)(((uint32_t)(x)) << PMU_SW_CTRL_WL_PSW_WL_PD_SHIFT)) & PMU_SW_CTRL_WL_PSW_WL_PD_MASK)\r\n\r\n#define PMU_SW_CTRL_WL_MCI_WL_PU_RST_MASK        (0x200U)\r\n#define PMU_SW_CTRL_WL_MCI_WL_PU_RST_SHIFT       (9U)\r\n/*! MCI_WL_PU_RST - mci_wl_pu_rst, 0:reset release; 1:reset assert */\r\n#define PMU_SW_CTRL_WL_MCI_WL_PU_RST(x)          (((uint32_t)(((uint32_t)(x)) << PMU_SW_CTRL_WL_MCI_WL_PU_RST_SHIFT)) & PMU_SW_CTRL_WL_MCI_WL_PU_RST_MASK)\r\n\r\n#define PMU_SW_CTRL_WL_WL_BUCK_ON_REQ_MASK       (0x800U)\r\n#define PMU_SW_CTRL_WL_WL_BUCK_ON_REQ_SHIFT      (11U)\r\n/*! WL_BUCK_ON_REQ - wl request buck on,then need wait 5 fast clk_pmu cycles(about 96ns),do psw on, then iso release */\r\n#define PMU_SW_CTRL_WL_WL_BUCK_ON_REQ(x)         (((uint32_t)(((uint32_t)(x)) << PMU_SW_CTRL_WL_WL_BUCK_ON_REQ_SHIFT)) & PMU_SW_CTRL_WL_WL_BUCK_ON_REQ_MASK)\r\n\r\n#define PMU_SW_CTRL_WL_WL_BUCK_OFF_REQ_MASK      (0x2000U)\r\n#define PMU_SW_CTRL_WL_WL_BUCK_OFF_REQ_SHIFT     (13U)\r\n/*! WL_BUCK_OFF_REQ - wl request buck off,need to be cfg after iso en, psw pd */\r\n#define PMU_SW_CTRL_WL_WL_BUCK_OFF_REQ(x)        (((uint32_t)(((uint32_t)(x)) << PMU_SW_CTRL_WL_WL_BUCK_OFF_REQ_SHIFT)) & PMU_SW_CTRL_WL_WL_BUCK_OFF_REQ_MASK)\r\n\r\n#define PMU_SW_CTRL_WL_SET_WL_SLP_MASK           (0x8000U)\r\n#define PMU_SW_CTRL_WL_SET_WL_SLP_SHIFT          (15U)\r\n/*! SET_WL_SLP - set_wl_slp,provide another slp way, if you don't want use HW slp signal */\r\n#define PMU_SW_CTRL_WL_SET_WL_SLP(x)             (((uint32_t)(((uint32_t)(x)) << PMU_SW_CTRL_WL_SET_WL_SLP_SHIFT)) & PMU_SW_CTRL_WL_SET_WL_SLP_MASK)\r\n/*! @} */\r\n\r\n/*! @name SW_CTRL_BLE - BLE part-SW Control register bypass HW output */\r\n/*! @{ */\r\n\r\n#define PMU_SW_CTRL_BLE_BLE_EN_MASK              (0x1U)\r\n#define PMU_SW_CTRL_BLE_BLE_EN_SHIFT             (0U)\r\n/*! BLE_EN - BLE part-SW bypass pmu HW output enable;1:SW mode;0:HW mode */\r\n#define PMU_SW_CTRL_BLE_BLE_EN(x)                (((uint32_t)(((uint32_t)(x)) << PMU_SW_CTRL_BLE_BLE_EN_SHIFT)) & PMU_SW_CTRL_BLE_BLE_EN_MASK)\r\n\r\n#define PMU_SW_CTRL_BLE_MCI_ISO_BLE_N_MASK       (0x8U)\r\n#define PMU_SW_CTRL_BLE_MCI_ISO_BLE_N_SHIFT      (3U)\r\n/*! MCI_ISO_BLE_N - MCI_ISO_BLE_EN_N, 0:iso enable,assert iso before psw off; 1:iso disable,release iso after psw on; */\r\n#define PMU_SW_CTRL_BLE_MCI_ISO_BLE_N(x)         (((uint32_t)(((uint32_t)(x)) << PMU_SW_CTRL_BLE_MCI_ISO_BLE_N_SHIFT)) & PMU_SW_CTRL_BLE_MCI_ISO_BLE_N_MASK)\r\n\r\n#define PMU_SW_CTRL_BLE_PSW_BLE_PD_MASK          (0x40U)\r\n#define PMU_SW_CTRL_BLE_PSW_BLE_PD_SHIFT         (6U)\r\n/*! PSW_BLE_PD - psw_ble, 0:power on, after request buck on,then delay some time to set psw on;\r\n *    1:power gated, do it before request buck off\r\n */\r\n#define PMU_SW_CTRL_BLE_PSW_BLE_PD(x)            (((uint32_t)(((uint32_t)(x)) << PMU_SW_CTRL_BLE_PSW_BLE_PD_SHIFT)) & PMU_SW_CTRL_BLE_PSW_BLE_PD_MASK)\r\n\r\n#define PMU_SW_CTRL_BLE_MCI_BLE_PU_RST_MASK      (0x200U)\r\n#define PMU_SW_CTRL_BLE_MCI_BLE_PU_RST_SHIFT     (9U)\r\n/*! MCI_BLE_PU_RST - mci_ble_pu_rst, 0:reset release; 1:reset assert */\r\n#define PMU_SW_CTRL_BLE_MCI_BLE_PU_RST(x)        (((uint32_t)(((uint32_t)(x)) << PMU_SW_CTRL_BLE_MCI_BLE_PU_RST_SHIFT)) & PMU_SW_CTRL_BLE_MCI_BLE_PU_RST_MASK)\r\n\r\n#define PMU_SW_CTRL_BLE_BLE_BUCK_ON_REQ_MASK     (0x800U)\r\n#define PMU_SW_CTRL_BLE_BLE_BUCK_ON_REQ_SHIFT    (11U)\r\n/*! BLE_BUCK_ON_REQ - ble request buck on,then need wait 5 fast clk_pmu cycles(about 96ns), do psw on, then iso release */\r\n#define PMU_SW_CTRL_BLE_BLE_BUCK_ON_REQ(x)       (((uint32_t)(((uint32_t)(x)) << PMU_SW_CTRL_BLE_BLE_BUCK_ON_REQ_SHIFT)) & PMU_SW_CTRL_BLE_BLE_BUCK_ON_REQ_MASK)\r\n\r\n#define PMU_SW_CTRL_BLE_BLE_BUCK_OFF_REQ_MASK    (0x2000U)\r\n#define PMU_SW_CTRL_BLE_BLE_BUCK_OFF_REQ_SHIFT   (13U)\r\n/*! BLE_BUCK_OFF_REQ - ble request buck off,need to be cfg after iso en, psw pd */\r\n#define PMU_SW_CTRL_BLE_BLE_BUCK_OFF_REQ(x)      (((uint32_t)(((uint32_t)(x)) << PMU_SW_CTRL_BLE_BLE_BUCK_OFF_REQ_SHIFT)) & PMU_SW_CTRL_BLE_BLE_BUCK_OFF_REQ_MASK)\r\n\r\n#define PMU_SW_CTRL_BLE_SET_BLE_SLP_MASK         (0x8000U)\r\n#define PMU_SW_CTRL_BLE_SET_BLE_SLP_SHIFT        (15U)\r\n/*! SET_BLE_SLP - set_ble_slp,provide another slp way, if you don't want use HW slp signal */\r\n#define PMU_SW_CTRL_BLE_SET_BLE_SLP(x)           (((uint32_t)(((uint32_t)(x)) << PMU_SW_CTRL_BLE_SET_BLE_SLP_SHIFT)) & PMU_SW_CTRL_BLE_SET_BLE_SLP_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSW18_OTP - PSW18 OTP psw control signal */\r\n/*! @{ */\r\n\r\n#define PMU_PSW18_OTP_CTRL_MASK                  (0x1U)\r\n#define PMU_PSW18_OTP_CTRL_SHIFT                 (0U)\r\n/*! CTRL - 0:power on; 1:power down */\r\n#define PMU_PSW18_OTP_CTRL(x)                    (((uint32_t)(((uint32_t)(x)) << PMU_PSW18_OTP_CTRL_SHIFT)) & PMU_PSW18_OTP_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name TIME_OUT_CTRL - tieme out control signal */\r\n/*! @{ */\r\n\r\n#define PMU_TIME_OUT_CTRL_V11_RDY_NO_TMT_MASK    (0x1U)\r\n#define PMU_TIME_OUT_CTRL_V11_RDY_NO_TMT_SHIFT   (0U)\r\n/*! V11_RDY_NO_TMT - v11_rdy use PMIP output/time out generated logic;\r\n *  0b0..use time out generated, for external supply\r\n *  0b1..use PMIP output signal, for internal supply-BUCK\r\n */\r\n#define PMU_TIME_OUT_CTRL_V11_RDY_NO_TMT(x)      (((uint32_t)(((uint32_t)(x)) << PMU_TIME_OUT_CTRL_V11_RDY_NO_TMT_SHIFT)) & PMU_TIME_OUT_CTRL_V11_RDY_NO_TMT_MASK)\r\n\r\n#define PMU_TIME_OUT_CTRL_V18_RDY_NO_TMT_MASK    (0x2U)\r\n#define PMU_TIME_OUT_CTRL_V18_RDY_NO_TMT_SHIFT   (1U)\r\n/*! V18_RDY_NO_TMT - v18_rdy use PMIP output/time out generated logic;\r\n *  0b0..use time out generated, for external supply\r\n *  0b1..use PMIP output signal, for internal supply-BUCK\r\n */\r\n#define PMU_TIME_OUT_CTRL_V18_RDY_NO_TMT(x)      (((uint32_t)(((uint32_t)(x)) << PMU_TIME_OUT_CTRL_V18_RDY_NO_TMT_SHIFT)) & PMU_TIME_OUT_CTRL_V18_RDY_NO_TMT_MASK)\r\n\r\n#define PMU_TIME_OUT_CTRL_PSW_MCI_RDY_NO_TMT_MASK (0x4U)\r\n#define PMU_TIME_OUT_CTRL_PSW_MCI_RDY_NO_TMT_SHIFT (2U)\r\n/*! PSW_MCI_RDY_NO_TMT - psw_mci_rdy_n use psw output/time out generated logic;\r\n *  0b0..use time out generated\r\n *  0b1..use PSW output signal\r\n */\r\n#define PMU_TIME_OUT_CTRL_PSW_MCI_RDY_NO_TMT(x)  (((uint32_t)(((uint32_t)(x)) << PMU_TIME_OUT_CTRL_PSW_MCI_RDY_NO_TMT_SHIFT)) & PMU_TIME_OUT_CTRL_PSW_MCI_RDY_NO_TMT_MASK)\r\n/*! @} */\r\n\r\n/*! @name TIME_OUT_CFG_VALUE - tieme out configure value */\r\n/*! @{ */\r\n\r\n#define PMU_TIME_OUT_CFG_VALUE_V11_RDY_ASRT_MASK (0x1FU)\r\n#define PMU_TIME_OUT_CFG_VALUE_V11_RDY_ASRT_SHIFT (0U)\r\n/*! V11_RDY_ASRT - the time from buck11 on to v11_rdy assert, suggest use the max value 5'h1f */\r\n#define PMU_TIME_OUT_CFG_VALUE_V11_RDY_ASRT(x)   (((uint32_t)(((uint32_t)(x)) << PMU_TIME_OUT_CFG_VALUE_V11_RDY_ASRT_SHIFT)) & PMU_TIME_OUT_CFG_VALUE_V11_RDY_ASRT_MASK)\r\n\r\n#define PMU_TIME_OUT_CFG_VALUE_V11_RDY_DE_ASRT_MASK (0x3E0U)\r\n#define PMU_TIME_OUT_CFG_VALUE_V11_RDY_DE_ASRT_SHIFT (5U)\r\n/*! V11_RDY_DE_ASRT - the time from buck11 off to v11_rdy de-assert, suggest use the max value 5'h1f */\r\n#define PMU_TIME_OUT_CFG_VALUE_V11_RDY_DE_ASRT(x) (((uint32_t)(((uint32_t)(x)) << PMU_TIME_OUT_CFG_VALUE_V11_RDY_DE_ASRT_SHIFT)) & PMU_TIME_OUT_CFG_VALUE_V11_RDY_DE_ASRT_MASK)\r\n\r\n#define PMU_TIME_OUT_CFG_VALUE_V18_RDY_ASRT_MASK (0x7C00U)\r\n#define PMU_TIME_OUT_CFG_VALUE_V18_RDY_ASRT_SHIFT (10U)\r\n/*! V18_RDY_ASRT - the time from buck18 on to v18_rdy assert, suggest use the max value 5'h1f */\r\n#define PMU_TIME_OUT_CFG_VALUE_V18_RDY_ASRT(x)   (((uint32_t)(((uint32_t)(x)) << PMU_TIME_OUT_CFG_VALUE_V18_RDY_ASRT_SHIFT)) & PMU_TIME_OUT_CFG_VALUE_V18_RDY_ASRT_MASK)\r\n\r\n#define PMU_TIME_OUT_CFG_VALUE_V18_RDY_DE_ASRT_MASK (0xF8000U)\r\n#define PMU_TIME_OUT_CFG_VALUE_V18_RDY_DE_ASRT_SHIFT (15U)\r\n/*! V18_RDY_DE_ASRT - the time from buck18 off to v18_rdy de-assert, suggest use the max value 5'h1f */\r\n#define PMU_TIME_OUT_CFG_VALUE_V18_RDY_DE_ASRT(x) (((uint32_t)(((uint32_t)(x)) << PMU_TIME_OUT_CFG_VALUE_V18_RDY_DE_ASRT_SHIFT)) & PMU_TIME_OUT_CFG_VALUE_V18_RDY_DE_ASRT_MASK)\r\n\r\n#define PMU_TIME_OUT_CFG_VALUE_PSW_MCI_RDY_ASRT_MASK (0x1F00000U)\r\n#define PMU_TIME_OUT_CFG_VALUE_PSW_MCI_RDY_ASRT_SHIFT (20U)\r\n/*! PSW_MCI_RDY_ASRT - the time from psw_mci on to psw_mci_rdy assert */\r\n#define PMU_TIME_OUT_CFG_VALUE_PSW_MCI_RDY_ASRT(x) (((uint32_t)(((uint32_t)(x)) << PMU_TIME_OUT_CFG_VALUE_PSW_MCI_RDY_ASRT_SHIFT)) & PMU_TIME_OUT_CFG_VALUE_PSW_MCI_RDY_ASRT_MASK)\r\n\r\n#define PMU_TIME_OUT_CFG_VALUE_PSW_MCI_RDY_DE_ASRT_MASK (0x3E000000U)\r\n#define PMU_TIME_OUT_CFG_VALUE_PSW_MCI_RDY_DE_ASRT_SHIFT (25U)\r\n/*! PSW_MCI_RDY_DE_ASRT - the time from psw_mci off to psw_mci_rdy de-assert */\r\n#define PMU_TIME_OUT_CFG_VALUE_PSW_MCI_RDY_DE_ASRT(x) (((uint32_t)(((uint32_t)(x)) << PMU_TIME_OUT_CFG_VALUE_PSW_MCI_RDY_DE_ASRT_SHIFT)) & PMU_TIME_OUT_CFG_VALUE_PSW_MCI_RDY_DE_ASRT_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVE_REG0 - reserve R/W regs */\r\n/*! @{ */\r\n\r\n#define PMU_RESERVE_REG0_VALUE_MASK              (0xFFFFFFFFU)\r\n#define PMU_RESERVE_REG0_VALUE_SHIFT             (0U)\r\n/*! VALUE - reserve R/W regs */\r\n#define PMU_RESERVE_REG0_VALUE(x)                (((uint32_t)(((uint32_t)(x)) << PMU_RESERVE_REG0_VALUE_SHIFT)) & PMU_RESERVE_REG0_VALUE_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVE_REG1 - reserve Read only regs */\r\n/*! @{ */\r\n\r\n#define PMU_RESERVE_REG1_VALUE_MASK              (0xFFFFFFFFU)\r\n#define PMU_RESERVE_REG1_VALUE_SHIFT             (0U)\r\n/*! VALUE - reserve Read only regs */\r\n#define PMU_RESERVE_REG1_VALUE(x)                (((uint32_t)(((uint32_t)(x)) << PMU_RESERVE_REG1_VALUE_SHIFT)) & PMU_RESERVE_REG1_VALUE_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group PMU_Register_Masks */\r\n\r\n\r\n/* PMU - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral PMU base address */\r\n  #define PMU_BASE                                 (0x50031000u)\r\n  /** Peripheral PMU base address */\r\n  #define PMU_BASE_NS                              (0x40031000u)\r\n  /** Peripheral PMU base pointer */\r\n  #define PMU                                      ((PMU_Type *)PMU_BASE)\r\n  /** Peripheral PMU base pointer */\r\n  #define PMU_NS                                   ((PMU_Type *)PMU_BASE_NS)\r\n  /** Array initializer of PMU peripheral base addresses */\r\n  #define PMU_BASE_ADDRS                           { PMU_BASE }\r\n  /** Array initializer of PMU peripheral base pointers */\r\n  #define PMU_BASE_PTRS                            { PMU }\r\n  /** Array initializer of PMU peripheral base addresses */\r\n  #define PMU_BASE_ADDRS_NS                        { PMU_BASE_NS }\r\n  /** Array initializer of PMU peripheral base pointers */\r\n  #define PMU_BASE_PTRS_NS                         { PMU_NS }\r\n#else\r\n  /** Peripheral PMU base address */\r\n  #define PMU_BASE                                 (0x40031000u)\r\n  /** Peripheral PMU base pointer */\r\n  #define PMU                                      ((PMU_Type *)PMU_BASE)\r\n  /** Array initializer of PMU peripheral base addresses */\r\n  #define PMU_BASE_ADDRS                           { PMU_BASE }\r\n  /** Array initializer of PMU peripheral base pointers */\r\n  #define PMU_BASE_PTRS                            { PMU }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group PMU_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- POWERQUAD Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup POWERQUAD_Peripheral_Access_Layer POWERQUAD Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** POWERQUAD - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t OUTBASE;                           /**< Base address register for output region, offset: 0x0 */\r\n  __IO uint32_t OUTFORMAT;                         /**< Output format, offset: 0x4 */\r\n  __IO uint32_t TMPBASE;                           /**< Base address register for temp region, offset: 0x8 */\r\n  __IO uint32_t TMPFORMAT;                         /**< Temp format, offset: 0xC */\r\n  __IO uint32_t INABASE;                           /**< Base address register for input A region, offset: 0x10 */\r\n  __IO uint32_t INAFORMAT;                         /**< Input A format, offset: 0x14 */\r\n  __IO uint32_t INBBASE;                           /**< Base address register for input B region, offset: 0x18 */\r\n  __IO uint32_t INBFORMAT;                         /**< Input B format, offset: 0x1C */\r\n       uint8_t RESERVED_0[224];\r\n  __IO uint32_t CONTROL;                           /**< PowerQuad Control register, offset: 0x100 */\r\n  __IO uint32_t LENGTH;                            /**< Length register, offset: 0x104 */\r\n  __IO uint32_t CPPRE;                             /**< Pre-scale register, offset: 0x108 */\r\n  __IO uint32_t MISC;                              /**< Misc register, offset: 0x10C */\r\n  __IO uint32_t CURSORY;                           /**< Cursory register, offset: 0x110 */\r\n       uint8_t RESERVED_1[108];\r\n  __IO uint32_t CORDIC_X;                          /**< Cordic input X register, offset: 0x180 */\r\n  __IO uint32_t CORDIC_Y;                          /**< Cordic input Y register, offset: 0x184 */\r\n  __IO uint32_t CORDIC_Z;                          /**< Cordic input Z register, offset: 0x188 */\r\n  __IO uint32_t ERRSTAT;                           /**< Read/Write register where error statuses are captured (sticky), offset: 0x18C */\r\n  __IO uint32_t INTREN;                            /**< INTERRUPT enable register, offset: 0x190 */\r\n  __IO uint32_t EVENTEN;                           /**< Event Enable register, offset: 0x194 */\r\n  __IO uint32_t INTRSTAT;                          /**< INTERRUPT STATUS register, offset: 0x198 */\r\n       uint8_t RESERVED_2[100];\r\n  __IO uint32_t GPREG[16];                         /**< General purpose register bank N., array offset: 0x200, array step: 0x4 */\r\n  __IO uint32_t COMPREG[8];                        /**< Compute register bank, array offset: 0x240, array step: 0x4 */\r\n} POWERQUAD_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- POWERQUAD Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup POWERQUAD_Register_Masks POWERQUAD Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name OUTBASE - Base address register for output region */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_OUTBASE_OUTBASE_MASK           (0xFFFFFFFFU)\r\n#define POWERQUAD_OUTBASE_OUTBASE_SHIFT          (0U)\r\n/*! OUTBASE - Base address register for the output region */\r\n#define POWERQUAD_OUTBASE_OUTBASE(x)             (((uint32_t)(((uint32_t)(x)) << POWERQUAD_OUTBASE_OUTBASE_SHIFT)) & POWERQUAD_OUTBASE_OUTBASE_MASK)\r\n/*! @} */\r\n\r\n/*! @name OUTFORMAT - Output format */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_OUTFORMAT_OUT_FORMATINT_MASK   (0x3U)\r\n#define POWERQUAD_OUTFORMAT_OUT_FORMATINT_SHIFT  (0U)\r\n/*! OUT_FORMATINT - Output Internal format (00: q15; 01:q31; 10:float) */\r\n#define POWERQUAD_OUTFORMAT_OUT_FORMATINT(x)     (((uint32_t)(((uint32_t)(x)) << POWERQUAD_OUTFORMAT_OUT_FORMATINT_SHIFT)) & POWERQUAD_OUTFORMAT_OUT_FORMATINT_MASK)\r\n\r\n#define POWERQUAD_OUTFORMAT_OUT_FORMATEXT_MASK   (0x30U)\r\n#define POWERQUAD_OUTFORMAT_OUT_FORMATEXT_SHIFT  (4U)\r\n/*! OUT_FORMATEXT - Output External format (00: q15; 01:q31; 10:float) */\r\n#define POWERQUAD_OUTFORMAT_OUT_FORMATEXT(x)     (((uint32_t)(((uint32_t)(x)) << POWERQUAD_OUTFORMAT_OUT_FORMATEXT_SHIFT)) & POWERQUAD_OUTFORMAT_OUT_FORMATEXT_MASK)\r\n\r\n#define POWERQUAD_OUTFORMAT_OUT_SCALER_MASK      (0xFF00U)\r\n#define POWERQUAD_OUTFORMAT_OUT_SCALER_SHIFT     (8U)\r\n/*! OUT_SCALER - Output Scaler value (for scaled 'q31' formats) */\r\n#define POWERQUAD_OUTFORMAT_OUT_SCALER(x)        (((uint32_t)(((uint32_t)(x)) << POWERQUAD_OUTFORMAT_OUT_SCALER_SHIFT)) & POWERQUAD_OUTFORMAT_OUT_SCALER_MASK)\r\n/*! @} */\r\n\r\n/*! @name TMPBASE - Base address register for temp region */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_TMPBASE_TMPBASE_MASK           (0xFFFFFFFFU)\r\n#define POWERQUAD_TMPBASE_TMPBASE_SHIFT          (0U)\r\n/*! TMPBASE - Base address register for the temporary region */\r\n#define POWERQUAD_TMPBASE_TMPBASE(x)             (((uint32_t)(((uint32_t)(x)) << POWERQUAD_TMPBASE_TMPBASE_SHIFT)) & POWERQUAD_TMPBASE_TMPBASE_MASK)\r\n/*! @} */\r\n\r\n/*! @name TMPFORMAT - Temp format */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_TMPFORMAT_TMP_FORMATINT_MASK   (0x3U)\r\n#define POWERQUAD_TMPFORMAT_TMP_FORMATINT_SHIFT  (0U)\r\n/*! TMP_FORMATINT - Temp Internal format (00: q15; 01:q31; 10:float) */\r\n#define POWERQUAD_TMPFORMAT_TMP_FORMATINT(x)     (((uint32_t)(((uint32_t)(x)) << POWERQUAD_TMPFORMAT_TMP_FORMATINT_SHIFT)) & POWERQUAD_TMPFORMAT_TMP_FORMATINT_MASK)\r\n\r\n#define POWERQUAD_TMPFORMAT_TMP_FORMATEXT_MASK   (0x30U)\r\n#define POWERQUAD_TMPFORMAT_TMP_FORMATEXT_SHIFT  (4U)\r\n/*! TMP_FORMATEXT - Temp External format (00: q15; 01:q31; 10:float) */\r\n#define POWERQUAD_TMPFORMAT_TMP_FORMATEXT(x)     (((uint32_t)(((uint32_t)(x)) << POWERQUAD_TMPFORMAT_TMP_FORMATEXT_SHIFT)) & POWERQUAD_TMPFORMAT_TMP_FORMATEXT_MASK)\r\n\r\n#define POWERQUAD_TMPFORMAT_TMP_SCALER_MASK      (0xFF00U)\r\n#define POWERQUAD_TMPFORMAT_TMP_SCALER_SHIFT     (8U)\r\n/*! TMP_SCALER - Temp Scaler value (for scaled 'q31' formats) */\r\n#define POWERQUAD_TMPFORMAT_TMP_SCALER(x)        (((uint32_t)(((uint32_t)(x)) << POWERQUAD_TMPFORMAT_TMP_SCALER_SHIFT)) & POWERQUAD_TMPFORMAT_TMP_SCALER_MASK)\r\n/*! @} */\r\n\r\n/*! @name INABASE - Base address register for input A region */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_INABASE_INABASE_MASK           (0xFFFFFFFFU)\r\n#define POWERQUAD_INABASE_INABASE_SHIFT          (0U)\r\n/*! INABASE - Base address register for the input A region */\r\n#define POWERQUAD_INABASE_INABASE(x)             (((uint32_t)(((uint32_t)(x)) << POWERQUAD_INABASE_INABASE_SHIFT)) & POWERQUAD_INABASE_INABASE_MASK)\r\n/*! @} */\r\n\r\n/*! @name INAFORMAT - Input A format */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_INAFORMAT_INA_FORMATINT_MASK   (0x3U)\r\n#define POWERQUAD_INAFORMAT_INA_FORMATINT_SHIFT  (0U)\r\n/*! INA_FORMATINT - Input A Internal format (00: q15; 01:q31; 10:float) */\r\n#define POWERQUAD_INAFORMAT_INA_FORMATINT(x)     (((uint32_t)(((uint32_t)(x)) << POWERQUAD_INAFORMAT_INA_FORMATINT_SHIFT)) & POWERQUAD_INAFORMAT_INA_FORMATINT_MASK)\r\n\r\n#define POWERQUAD_INAFORMAT_INA_FORMATEXT_MASK   (0x30U)\r\n#define POWERQUAD_INAFORMAT_INA_FORMATEXT_SHIFT  (4U)\r\n/*! INA_FORMATEXT - Input A External format (00: q15; 01:q31; 10:float) */\r\n#define POWERQUAD_INAFORMAT_INA_FORMATEXT(x)     (((uint32_t)(((uint32_t)(x)) << POWERQUAD_INAFORMAT_INA_FORMATEXT_SHIFT)) & POWERQUAD_INAFORMAT_INA_FORMATEXT_MASK)\r\n\r\n#define POWERQUAD_INAFORMAT_INA_SCALER_MASK      (0xFF00U)\r\n#define POWERQUAD_INAFORMAT_INA_SCALER_SHIFT     (8U)\r\n/*! INA_SCALER - Input A Scaler value (for scaled 'q31' formats) */\r\n#define POWERQUAD_INAFORMAT_INA_SCALER(x)        (((uint32_t)(((uint32_t)(x)) << POWERQUAD_INAFORMAT_INA_SCALER_SHIFT)) & POWERQUAD_INAFORMAT_INA_SCALER_MASK)\r\n/*! @} */\r\n\r\n/*! @name INBBASE - Base address register for input B region */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_INBBASE_INBBASE_MASK           (0xFFFFFFFFU)\r\n#define POWERQUAD_INBBASE_INBBASE_SHIFT          (0U)\r\n/*! INBBASE - Base address register for the input B region */\r\n#define POWERQUAD_INBBASE_INBBASE(x)             (((uint32_t)(((uint32_t)(x)) << POWERQUAD_INBBASE_INBBASE_SHIFT)) & POWERQUAD_INBBASE_INBBASE_MASK)\r\n/*! @} */\r\n\r\n/*! @name INBFORMAT - Input B format */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_INBFORMAT_INB_FORMATINT_MASK   (0x3U)\r\n#define POWERQUAD_INBFORMAT_INB_FORMATINT_SHIFT  (0U)\r\n/*! INB_FORMATINT - Input B Internal format (00: q15; 01:q31; 10:float) */\r\n#define POWERQUAD_INBFORMAT_INB_FORMATINT(x)     (((uint32_t)(((uint32_t)(x)) << POWERQUAD_INBFORMAT_INB_FORMATINT_SHIFT)) & POWERQUAD_INBFORMAT_INB_FORMATINT_MASK)\r\n\r\n#define POWERQUAD_INBFORMAT_INB_FORMATEXT_MASK   (0x30U)\r\n#define POWERQUAD_INBFORMAT_INB_FORMATEXT_SHIFT  (4U)\r\n/*! INB_FORMATEXT - Input B External format (00: q15; 01:q31; 10:float) */\r\n#define POWERQUAD_INBFORMAT_INB_FORMATEXT(x)     (((uint32_t)(((uint32_t)(x)) << POWERQUAD_INBFORMAT_INB_FORMATEXT_SHIFT)) & POWERQUAD_INBFORMAT_INB_FORMATEXT_MASK)\r\n\r\n#define POWERQUAD_INBFORMAT_INB_SCALER_MASK      (0xFF00U)\r\n#define POWERQUAD_INBFORMAT_INB_SCALER_SHIFT     (8U)\r\n/*! INB_SCALER - Input B Scaler value (for scaled 'q31' formats) */\r\n#define POWERQUAD_INBFORMAT_INB_SCALER(x)        (((uint32_t)(((uint32_t)(x)) << POWERQUAD_INBFORMAT_INB_SCALER_SHIFT)) & POWERQUAD_INBFORMAT_INB_SCALER_MASK)\r\n/*! @} */\r\n\r\n/*! @name CONTROL - PowerQuad Control register */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_CONTROL_DECODE_OPCODE_MASK     (0xFU)\r\n#define POWERQUAD_CONTROL_DECODE_OPCODE_SHIFT    (0U)\r\n/*! DECODE_OPCODE - opcode specific to decode_machine */\r\n#define POWERQUAD_CONTROL_DECODE_OPCODE(x)       (((uint32_t)(((uint32_t)(x)) << POWERQUAD_CONTROL_DECODE_OPCODE_SHIFT)) & POWERQUAD_CONTROL_DECODE_OPCODE_MASK)\r\n\r\n#define POWERQUAD_CONTROL_DECODE_MACHINE_MASK    (0xF0U)\r\n#define POWERQUAD_CONTROL_DECODE_MACHINE_SHIFT   (4U)\r\n/*! DECODE_MACHINE - 0 : Coprocessor , 1 : matrix , 2 : fft , 3 : fir , 4 : stat , 5 : cordic , 6 -15 : NA */\r\n#define POWERQUAD_CONTROL_DECODE_MACHINE(x)      (((uint32_t)(((uint32_t)(x)) << POWERQUAD_CONTROL_DECODE_MACHINE_SHIFT)) & POWERQUAD_CONTROL_DECODE_MACHINE_MASK)\r\n\r\n#define POWERQUAD_CONTROL_INST_BUSY_MASK         (0x80000000U)\r\n#define POWERQUAD_CONTROL_INST_BUSY_SHIFT        (31U)\r\n/*! INST_BUSY - Instruction busy signal when high indicates processing is on */\r\n#define POWERQUAD_CONTROL_INST_BUSY(x)           (((uint32_t)(((uint32_t)(x)) << POWERQUAD_CONTROL_INST_BUSY_SHIFT)) & POWERQUAD_CONTROL_INST_BUSY_MASK)\r\n/*! @} */\r\n\r\n/*! @name LENGTH - Length register */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_LENGTH_INST_LENGTH_MASK        (0xFFFFFFFFU)\r\n#define POWERQUAD_LENGTH_INST_LENGTH_SHIFT       (0U)\r\n/*! INST_LENGTH - Length register. When FIR : fir_xlength = inst_length[15:0] , fir_tlength =\r\n *    inst_len[31:16]. When MTX : rows_a = inst_length[4:0] , cols_a = inst_length[12:8] , cols_b =\r\n *    inst_length[20:16]\r\n */\r\n#define POWERQUAD_LENGTH_INST_LENGTH(x)          (((uint32_t)(((uint32_t)(x)) << POWERQUAD_LENGTH_INST_LENGTH_SHIFT)) & POWERQUAD_LENGTH_INST_LENGTH_MASK)\r\n/*! @} */\r\n\r\n/*! @name CPPRE - Pre-scale register */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_CPPRE_CPPRE_IN_MASK            (0xFFU)\r\n#define POWERQUAD_CPPRE_CPPRE_IN_SHIFT           (0U)\r\n/*! CPPRE_IN - co-processor scaling of input */\r\n#define POWERQUAD_CPPRE_CPPRE_IN(x)              (((uint32_t)(((uint32_t)(x)) << POWERQUAD_CPPRE_CPPRE_IN_SHIFT)) & POWERQUAD_CPPRE_CPPRE_IN_MASK)\r\n\r\n#define POWERQUAD_CPPRE_CPPRE_OUT_MASK           (0xFF00U)\r\n#define POWERQUAD_CPPRE_CPPRE_OUT_SHIFT          (8U)\r\n/*! CPPRE_OUT - co-processor fixed point output */\r\n#define POWERQUAD_CPPRE_CPPRE_OUT(x)             (((uint32_t)(((uint32_t)(x)) << POWERQUAD_CPPRE_CPPRE_OUT_SHIFT)) & POWERQUAD_CPPRE_CPPRE_OUT_MASK)\r\n\r\n#define POWERQUAD_CPPRE_CPPRE_SAT_MASK           (0x10000U)\r\n#define POWERQUAD_CPPRE_CPPRE_SAT_SHIFT          (16U)\r\n/*! CPPRE_SAT - 1 : forces sub-32 bit saturation */\r\n#define POWERQUAD_CPPRE_CPPRE_SAT(x)             (((uint32_t)(((uint32_t)(x)) << POWERQUAD_CPPRE_CPPRE_SAT_SHIFT)) & POWERQUAD_CPPRE_CPPRE_SAT_MASK)\r\n\r\n#define POWERQUAD_CPPRE_CPPRE_SAT8_MASK          (0x20000U)\r\n#define POWERQUAD_CPPRE_CPPRE_SAT8_SHIFT         (17U)\r\n/*! CPPRE_SAT8 - 0 = 8bits, 1 = 16bits */\r\n#define POWERQUAD_CPPRE_CPPRE_SAT8(x)            (((uint32_t)(((uint32_t)(x)) << POWERQUAD_CPPRE_CPPRE_SAT8_SHIFT)) & POWERQUAD_CPPRE_CPPRE_SAT8_MASK)\r\n/*! @} */\r\n\r\n/*! @name MISC - Misc register */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_MISC_INST_MISC_MASK            (0xFFFFFFFFU)\r\n#define POWERQUAD_MISC_INST_MISC_SHIFT           (0U)\r\n/*! INST_MISC - Misc register. For Matrix : Used for scale factor */\r\n#define POWERQUAD_MISC_INST_MISC(x)              (((uint32_t)(((uint32_t)(x)) << POWERQUAD_MISC_INST_MISC_SHIFT)) & POWERQUAD_MISC_INST_MISC_MASK)\r\n/*! @} */\r\n\r\n/*! @name CURSORY - Cursory register */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_CURSORY_CURSORY_MASK           (0x1U)\r\n#define POWERQUAD_CURSORY_CURSORY_SHIFT          (0U)\r\n/*! CURSORY - 1 : Enable cursory mode */\r\n#define POWERQUAD_CURSORY_CURSORY(x)             (((uint32_t)(((uint32_t)(x)) << POWERQUAD_CURSORY_CURSORY_SHIFT)) & POWERQUAD_CURSORY_CURSORY_MASK)\r\n/*! @} */\r\n\r\n/*! @name CORDIC_X - Cordic input X register */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_CORDIC_X_CORDIC_X_MASK         (0xFFFFFFFFU)\r\n#define POWERQUAD_CORDIC_X_CORDIC_X_SHIFT        (0U)\r\n/*! CORDIC_X - Cordic input x */\r\n#define POWERQUAD_CORDIC_X_CORDIC_X(x)           (((uint32_t)(((uint32_t)(x)) << POWERQUAD_CORDIC_X_CORDIC_X_SHIFT)) & POWERQUAD_CORDIC_X_CORDIC_X_MASK)\r\n/*! @} */\r\n\r\n/*! @name CORDIC_Y - Cordic input Y register */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_CORDIC_Y_CORDIC_Y_MASK         (0xFFFFFFFFU)\r\n#define POWERQUAD_CORDIC_Y_CORDIC_Y_SHIFT        (0U)\r\n/*! CORDIC_Y - Cordic input y */\r\n#define POWERQUAD_CORDIC_Y_CORDIC_Y(x)           (((uint32_t)(((uint32_t)(x)) << POWERQUAD_CORDIC_Y_CORDIC_Y_SHIFT)) & POWERQUAD_CORDIC_Y_CORDIC_Y_MASK)\r\n/*! @} */\r\n\r\n/*! @name CORDIC_Z - Cordic input Z register */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_CORDIC_Z_CORDIC_Z_MASK         (0xFFFFFFFFU)\r\n#define POWERQUAD_CORDIC_Z_CORDIC_Z_SHIFT        (0U)\r\n/*! CORDIC_Z - Cordic input z */\r\n#define POWERQUAD_CORDIC_Z_CORDIC_Z(x)           (((uint32_t)(((uint32_t)(x)) << POWERQUAD_CORDIC_Z_CORDIC_Z_SHIFT)) & POWERQUAD_CORDIC_Z_CORDIC_Z_MASK)\r\n/*! @} */\r\n\r\n/*! @name ERRSTAT - Read/Write register where error statuses are captured (sticky) */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_ERRSTAT_OVERFLOW_MASK          (0x1U)\r\n#define POWERQUAD_ERRSTAT_OVERFLOW_SHIFT         (0U)\r\n/*! OVERFLOW - overflow */\r\n#define POWERQUAD_ERRSTAT_OVERFLOW(x)            (((uint32_t)(((uint32_t)(x)) << POWERQUAD_ERRSTAT_OVERFLOW_SHIFT)) & POWERQUAD_ERRSTAT_OVERFLOW_MASK)\r\n\r\n#define POWERQUAD_ERRSTAT_NAN_MASK               (0x2U)\r\n#define POWERQUAD_ERRSTAT_NAN_SHIFT              (1U)\r\n/*! NAN - nan */\r\n#define POWERQUAD_ERRSTAT_NAN(x)                 (((uint32_t)(((uint32_t)(x)) << POWERQUAD_ERRSTAT_NAN_SHIFT)) & POWERQUAD_ERRSTAT_NAN_MASK)\r\n\r\n#define POWERQUAD_ERRSTAT_FIXEDOVERFLOW_MASK     (0x4U)\r\n#define POWERQUAD_ERRSTAT_FIXEDOVERFLOW_SHIFT    (2U)\r\n/*! FIXEDOVERFLOW - fixed_pt_overflow */\r\n#define POWERQUAD_ERRSTAT_FIXEDOVERFLOW(x)       (((uint32_t)(((uint32_t)(x)) << POWERQUAD_ERRSTAT_FIXEDOVERFLOW_SHIFT)) & POWERQUAD_ERRSTAT_FIXEDOVERFLOW_MASK)\r\n\r\n#define POWERQUAD_ERRSTAT_UNDERFLOW_MASK         (0x8U)\r\n#define POWERQUAD_ERRSTAT_UNDERFLOW_SHIFT        (3U)\r\n/*! UNDERFLOW - underflow */\r\n#define POWERQUAD_ERRSTAT_UNDERFLOW(x)           (((uint32_t)(((uint32_t)(x)) << POWERQUAD_ERRSTAT_UNDERFLOW_SHIFT)) & POWERQUAD_ERRSTAT_UNDERFLOW_MASK)\r\n\r\n#define POWERQUAD_ERRSTAT_BUSERROR_MASK          (0x10U)\r\n#define POWERQUAD_ERRSTAT_BUSERROR_SHIFT         (4U)\r\n/*! BUSERROR - bus_error */\r\n#define POWERQUAD_ERRSTAT_BUSERROR(x)            (((uint32_t)(((uint32_t)(x)) << POWERQUAD_ERRSTAT_BUSERROR_SHIFT)) & POWERQUAD_ERRSTAT_BUSERROR_MASK)\r\n/*! @} */\r\n\r\n/*! @name INTREN - INTERRUPT enable register */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_INTREN_INTR_OFLOW_MASK         (0x1U)\r\n#define POWERQUAD_INTREN_INTR_OFLOW_SHIFT        (0U)\r\n/*! INTR_OFLOW - 1 : Enable interrupt on Floating point overflow */\r\n#define POWERQUAD_INTREN_INTR_OFLOW(x)           (((uint32_t)(((uint32_t)(x)) << POWERQUAD_INTREN_INTR_OFLOW_SHIFT)) & POWERQUAD_INTREN_INTR_OFLOW_MASK)\r\n\r\n#define POWERQUAD_INTREN_INTR_NAN_MASK           (0x2U)\r\n#define POWERQUAD_INTREN_INTR_NAN_SHIFT          (1U)\r\n/*! INTR_NAN - 1 : Enable interrupt on Floating point NaN */\r\n#define POWERQUAD_INTREN_INTR_NAN(x)             (((uint32_t)(((uint32_t)(x)) << POWERQUAD_INTREN_INTR_NAN_SHIFT)) & POWERQUAD_INTREN_INTR_NAN_MASK)\r\n\r\n#define POWERQUAD_INTREN_INTR_FIXED_MASK         (0x4U)\r\n#define POWERQUAD_INTREN_INTR_FIXED_SHIFT        (2U)\r\n/*! INTR_FIXED - 1: Enable interrupt on Fixed point Overflow */\r\n#define POWERQUAD_INTREN_INTR_FIXED(x)           (((uint32_t)(((uint32_t)(x)) << POWERQUAD_INTREN_INTR_FIXED_SHIFT)) & POWERQUAD_INTREN_INTR_FIXED_MASK)\r\n\r\n#define POWERQUAD_INTREN_INTR_UFLOW_MASK         (0x8U)\r\n#define POWERQUAD_INTREN_INTR_UFLOW_SHIFT        (3U)\r\n/*! INTR_UFLOW - 1 : Enable interrupt on Subnormal truncation */\r\n#define POWERQUAD_INTREN_INTR_UFLOW(x)           (((uint32_t)(((uint32_t)(x)) << POWERQUAD_INTREN_INTR_UFLOW_SHIFT)) & POWERQUAD_INTREN_INTR_UFLOW_MASK)\r\n\r\n#define POWERQUAD_INTREN_INTR_BERR_MASK          (0x10U)\r\n#define POWERQUAD_INTREN_INTR_BERR_SHIFT         (4U)\r\n/*! INTR_BERR - 1: Enable interrupt on AHBM Buss Error */\r\n#define POWERQUAD_INTREN_INTR_BERR(x)            (((uint32_t)(((uint32_t)(x)) << POWERQUAD_INTREN_INTR_BERR_SHIFT)) & POWERQUAD_INTREN_INTR_BERR_MASK)\r\n\r\n#define POWERQUAD_INTREN_INTR_COMP_MASK          (0x80U)\r\n#define POWERQUAD_INTREN_INTR_COMP_SHIFT         (7U)\r\n/*! INTR_COMP - 1: Enable interrupt on instruction completion */\r\n#define POWERQUAD_INTREN_INTR_COMP(x)            (((uint32_t)(((uint32_t)(x)) << POWERQUAD_INTREN_INTR_COMP_SHIFT)) & POWERQUAD_INTREN_INTR_COMP_MASK)\r\n/*! @} */\r\n\r\n/*! @name EVENTEN - Event Enable register */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_EVENTEN_EVENT_OFLOW_MASK       (0x1U)\r\n#define POWERQUAD_EVENTEN_EVENT_OFLOW_SHIFT      (0U)\r\n/*! EVENT_OFLOW - 1 : Enable event trigger on Floating point overflow */\r\n#define POWERQUAD_EVENTEN_EVENT_OFLOW(x)         (((uint32_t)(((uint32_t)(x)) << POWERQUAD_EVENTEN_EVENT_OFLOW_SHIFT)) & POWERQUAD_EVENTEN_EVENT_OFLOW_MASK)\r\n\r\n#define POWERQUAD_EVENTEN_EVENT_NAN_MASK         (0x2U)\r\n#define POWERQUAD_EVENTEN_EVENT_NAN_SHIFT        (1U)\r\n/*! EVENT_NAN - 1 : Enable event trigger on Floating point NaN */\r\n#define POWERQUAD_EVENTEN_EVENT_NAN(x)           (((uint32_t)(((uint32_t)(x)) << POWERQUAD_EVENTEN_EVENT_NAN_SHIFT)) & POWERQUAD_EVENTEN_EVENT_NAN_MASK)\r\n\r\n#define POWERQUAD_EVENTEN_EVENT_FIXED_MASK       (0x4U)\r\n#define POWERQUAD_EVENTEN_EVENT_FIXED_SHIFT      (2U)\r\n/*! EVENT_FIXED - 1: Enable event trigger on Fixed point Overflow */\r\n#define POWERQUAD_EVENTEN_EVENT_FIXED(x)         (((uint32_t)(((uint32_t)(x)) << POWERQUAD_EVENTEN_EVENT_FIXED_SHIFT)) & POWERQUAD_EVENTEN_EVENT_FIXED_MASK)\r\n\r\n#define POWERQUAD_EVENTEN_EVENT_UFLOW_MASK       (0x8U)\r\n#define POWERQUAD_EVENTEN_EVENT_UFLOW_SHIFT      (3U)\r\n/*! EVENT_UFLOW - 1 : Enable event trigger on Subnormal truncation */\r\n#define POWERQUAD_EVENTEN_EVENT_UFLOW(x)         (((uint32_t)(((uint32_t)(x)) << POWERQUAD_EVENTEN_EVENT_UFLOW_SHIFT)) & POWERQUAD_EVENTEN_EVENT_UFLOW_MASK)\r\n\r\n#define POWERQUAD_EVENTEN_EVENT_BERR_MASK        (0x10U)\r\n#define POWERQUAD_EVENTEN_EVENT_BERR_SHIFT       (4U)\r\n/*! EVENT_BERR - 1: Enable event trigger on AHBM Buss Error */\r\n#define POWERQUAD_EVENTEN_EVENT_BERR(x)          (((uint32_t)(((uint32_t)(x)) << POWERQUAD_EVENTEN_EVENT_BERR_SHIFT)) & POWERQUAD_EVENTEN_EVENT_BERR_MASK)\r\n\r\n#define POWERQUAD_EVENTEN_EVENT_COMP_MASK        (0x80U)\r\n#define POWERQUAD_EVENTEN_EVENT_COMP_SHIFT       (7U)\r\n/*! EVENT_COMP - 1: Enable event trigger on instruction completion */\r\n#define POWERQUAD_EVENTEN_EVENT_COMP(x)          (((uint32_t)(((uint32_t)(x)) << POWERQUAD_EVENTEN_EVENT_COMP_SHIFT)) & POWERQUAD_EVENTEN_EVENT_COMP_MASK)\r\n/*! @} */\r\n\r\n/*! @name INTRSTAT - INTERRUPT STATUS register */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_INTRSTAT_INTR_STAT_MASK        (0x1U)\r\n#define POWERQUAD_INTRSTAT_INTR_STAT_SHIFT       (0U)\r\n/*! INTR_STAT - Intr status ( 1 bit to indicate interrupt captured, 0 means no new interrupt), write any value will clear this bit */\r\n#define POWERQUAD_INTRSTAT_INTR_STAT(x)          (((uint32_t)(((uint32_t)(x)) << POWERQUAD_INTRSTAT_INTR_STAT_SHIFT)) & POWERQUAD_INTRSTAT_INTR_STAT_MASK)\r\n/*! @} */\r\n\r\n/*! @name GPREG - General purpose register bank N. */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_GPREG_GPREG_MASK               (0xFFFFFFFFU)\r\n#define POWERQUAD_GPREG_GPREG_SHIFT              (0U)\r\n/*! GPREG - General purpose register bank */\r\n#define POWERQUAD_GPREG_GPREG(x)                 (((uint32_t)(((uint32_t)(x)) << POWERQUAD_GPREG_GPREG_SHIFT)) & POWERQUAD_GPREG_GPREG_MASK)\r\n/*! @} */\r\n\r\n/* The count of POWERQUAD_GPREG */\r\n#define POWERQUAD_GPREG_COUNT                    (16U)\r\n\r\n/*! @name COMPREGS_COMPREG - Compute register bank */\r\n/*! @{ */\r\n\r\n#define POWERQUAD_COMPREGS_COMPREG_COMPREG_MASK  (0xFFFFFFFFU)\r\n#define POWERQUAD_COMPREGS_COMPREG_COMPREG_SHIFT (0U)\r\n/*! COMPREG - Compute register bank */\r\n#define POWERQUAD_COMPREGS_COMPREG_COMPREG(x)    (((uint32_t)(((uint32_t)(x)) << POWERQUAD_COMPREGS_COMPREG_COMPREG_SHIFT)) & POWERQUAD_COMPREGS_COMPREG_COMPREG_MASK)\r\n/*! @} */\r\n\r\n/* The count of POWERQUAD_COMPREGS_COMPREG */\r\n#define POWERQUAD_COMPREGS_COMPREG_COUNT         (8U)\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group POWERQUAD_Register_Masks */\r\n\r\n\r\n/* POWERQUAD - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral POWERQUAD base address */\r\n  #define POWERQUAD_BASE                           (0x50150000u)\r\n  /** Peripheral POWERQUAD base address */\r\n  #define POWERQUAD_BASE_NS                        (0x40150000u)\r\n  /** Peripheral POWERQUAD base pointer */\r\n  #define POWERQUAD                                ((POWERQUAD_Type *)POWERQUAD_BASE)\r\n  /** Peripheral POWERQUAD base pointer */\r\n  #define POWERQUAD_NS                             ((POWERQUAD_Type *)POWERQUAD_BASE_NS)\r\n  /** Array initializer of POWERQUAD peripheral base addresses */\r\n  #define POWERQUAD_BASE_ADDRS                     { POWERQUAD_BASE }\r\n  /** Array initializer of POWERQUAD peripheral base pointers */\r\n  #define POWERQUAD_BASE_PTRS                      { POWERQUAD }\r\n  /** Array initializer of POWERQUAD peripheral base addresses */\r\n  #define POWERQUAD_BASE_ADDRS_NS                  { POWERQUAD_BASE_NS }\r\n  /** Array initializer of POWERQUAD peripheral base pointers */\r\n  #define POWERQUAD_BASE_PTRS_NS                   { POWERQUAD_NS }\r\n#else\r\n  /** Peripheral POWERQUAD base address */\r\n  #define POWERQUAD_BASE                           (0x40150000u)\r\n  /** Peripheral POWERQUAD base pointer */\r\n  #define POWERQUAD                                ((POWERQUAD_Type *)POWERQUAD_BASE)\r\n  /** Array initializer of POWERQUAD peripheral base addresses */\r\n  #define POWERQUAD_BASE_ADDRS                     { POWERQUAD_BASE }\r\n  /** Array initializer of POWERQUAD peripheral base pointers */\r\n  #define POWERQUAD_BASE_PTRS                      { POWERQUAD }\r\n#endif\r\n/** Interrupt vectors for the POWERQUAD peripheral type */\r\n#define POWERQUAD_IRQS                           { POWERQUAD_IRQn }\r\n\r\n/*!\r\n * @}\r\n */ /* end of group POWERQUAD_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- PUF Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup PUF_Peripheral_Access_Layer PUF Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** PUF - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t MODE;                              /**< Mode register, offset: 0x0 */\r\n  __IO uint32_t CTRL;                              /**< Control register, offset: 0x4 */\r\n  __I  uint32_t STATUS;                            /**< Status register, offset: 0x8 */\r\n  __I  uint32_t VERSION;                           /**< Version register, offset: 0xC */\r\n  __IO uint32_t CKSUM;                             /**< Checksum register, offset: 0x10 */\r\n       uint8_t RESERVED_0[12];\r\n  __IO uint32_t PARITY_0;                          /**< Parity register, offset: 0x20 */\r\n  __IO uint32_t PARITY_1;                          /**< Parity register, offset: 0x24 */\r\n  __IO uint32_t PARITY_2;                          /**< Parity register, offset: 0x28 */\r\n       uint8_t RESERVED_1[20];\r\n  __IO uint32_t IGNORE;                            /**< Ignore register, offset: 0x40 */\r\n       uint8_t RESERVED_2[12];\r\n  __IO uint32_t RNG;                               /**< Random Number register, offset: 0x50 */\r\n       uint8_t RESERVED_3[12];\r\n  __I  uint32_t KEY_0;                             /**< Key register, offset: 0x60 */\r\n  __I  uint32_t KEY_1;                             /**< Key register, offset: 0x64 */\r\n       uint8_t RESERVED_4[8];\r\n  __IO uint32_t LOCK;                              /**< Lock register, offset: 0x70 */\r\n  __I  uint32_t RO_FREQ;                           /**< RO Frequency register, offset: 0x74 */\r\n  __I  uint32_t SLW_RO;                            /**< Slow RO register, offset: 0x78 */\r\n       uint8_t RESERVED_5[4];\r\n  __IO uint32_t EVAL_SEL;                          /**< Evaluation Select register, offset: 0x80 */\r\n  __I  uint32_t EVAL_VAL;                          /**< Evaluation Value register, offset: 0x84 */\r\n  __I  uint32_t EVAL_RAW;                          /**< Evaluation Raw register, offset: 0x88 */\r\n  __I  uint32_t EVAL_BCH;                          /**< Evaluation BCH register, offset: 0x8C */\r\n  __I  uint32_t EVAL_ERR_LOC_0_1;                  /**< Error Location register, offset: 0x90 */\r\n  __I  uint32_t EVAL_ERR_LOC_2_3;                  /**< Error Location register, offset: 0x94 */\r\n  __I  uint32_t EVAL_ERR_LOC_4_5;                  /**< Error Location register, offset: 0x98 */\r\n  __I  uint32_t EVAL_ERR_LOC_6_7;                  /**< Error Location register, offset: 0x9C */\r\n  __I  uint32_t EVAL_ERR_LOC_8_9;                  /**< Error Location register, offset: 0xA0 */\r\n       uint8_t RESERVED_6[76];\r\n  __I  uint32_t EVAL_RND_KEY_0;                    /**< Evaluation Round Key register, offset: 0xF0 */\r\n  __I  uint32_t EVAL_RND_KEY_1;                    /**< Evaluation Round Key register, offset: 0xF4 */\r\n       uint8_t RESERVED_7[4];\r\n  __IO uint32_t EVAL_CTRL;                         /**< Evaluation Control register, offset: 0xFC */\r\n       uint8_t RESERVED_8[3776];\r\n  __I  uint32_t ACCESS_ERR;                        /**< Access Error register, offset: 0xFC0 */\r\n  __IO uint32_t ACCESS_ERR_CLR;                    /**< Access Error Clear register, offset: 0xFC4 */\r\n       uint8_t RESERVED_9[24];\r\n  __I  uint32_t INT_STATUS;                        /**< Interrupt Status register, offset: 0xFE0 */\r\n  __IO uint32_t INT_ENABLE;                        /**< Interrupt Enable register, offset: 0xFE4 */\r\n  __IO uint32_t INT_STATUS_CLR;                    /**< Interrupt Status Clear register, offset: 0xFE8 */\r\n  __IO uint32_t INT_STATUS_SET;                    /**< Interrupt Status Set register, offset: 0xFEC */\r\n       uint8_t RESERVED_10[12];\r\n  __I  uint32_t MODULE_ID;                         /**< Module ID register, offset: 0xFFC */\r\n} PUF_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- PUF Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup PUF_Register_Masks PUF Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name MODE - Mode register */\r\n/*! @{ */\r\n\r\n#define PUF_MODE_START_MASK                      (0x1U)\r\n#define PUF_MODE_START_SHIFT                     (0U)\r\n/*! START - Start */\r\n#define PUF_MODE_START(x)                        (((uint32_t)(((uint32_t)(x)) << PUF_MODE_START_SHIFT)) & PUF_MODE_START_MASK)\r\n\r\n#define PUF_MODE_ENROLL_MASK                     (0x2U)\r\n#define PUF_MODE_ENROLL_SHIFT                    (1U)\r\n/*! ENROLL - Enrollment; 1'b0 - Reconstruction; 1'b1 - Enrollment */\r\n#define PUF_MODE_ENROLL(x)                       (((uint32_t)(((uint32_t)(x)) << PUF_MODE_ENROLL_SHIFT)) & PUF_MODE_ENROLL_MASK)\r\n\r\n#define PUF_MODE_MODE_RSVD_3_MASK                (0xCU)\r\n#define PUF_MODE_MODE_RSVD_3_SHIFT               (2U)\r\n/*! MODE_RSVD_3 - Reserved */\r\n#define PUF_MODE_MODE_RSVD_3(x)                  (((uint32_t)(((uint32_t)(x)) << PUF_MODE_MODE_RSVD_3_SHIFT)) & PUF_MODE_MODE_RSVD_3_MASK)\r\n\r\n#define PUF_MODE_SLW_LMT_MASK                    (0xF0U)\r\n#define PUF_MODE_SLW_LMT_SHIFT                   (4U)\r\n/*! SLW_LMT - Power of 2 count limit for slow limit */\r\n#define PUF_MODE_SLW_LMT(x)                      (((uint32_t)(((uint32_t)(x)) << PUF_MODE_SLW_LMT_SHIFT)) & PUF_MODE_SLW_LMT_MASK)\r\n\r\n#define PUF_MODE_MODE_RSVD_2_MASK                (0xF00U)\r\n#define PUF_MODE_MODE_RSVD_2_SHIFT               (8U)\r\n/*! MODE_RSVD_2 - Reserved */\r\n#define PUF_MODE_MODE_RSVD_2(x)                  (((uint32_t)(((uint32_t)(x)) << PUF_MODE_MODE_RSVD_2_SHIFT)) & PUF_MODE_MODE_RSVD_2_MASK)\r\n\r\n#define PUF_MODE_WRM_LMT_MASK                    (0xF000U)\r\n#define PUF_MODE_WRM_LMT_SHIFT                   (12U)\r\n/*! WRM_LMT - Power of 2 count limit for warmup */\r\n#define PUF_MODE_WRM_LMT(x)                      (((uint32_t)(((uint32_t)(x)) << PUF_MODE_WRM_LMT_SHIFT)) & PUF_MODE_WRM_LMT_MASK)\r\n\r\n#define PUF_MODE_MODE_RSVD_1_MASK                (0xF0000U)\r\n#define PUF_MODE_MODE_RSVD_1_SHIFT               (16U)\r\n/*! MODE_RSVD_1 - Reserved */\r\n#define PUF_MODE_MODE_RSVD_1(x)                  (((uint32_t)(((uint32_t)(x)) << PUF_MODE_MODE_RSVD_1_SHIFT)) & PUF_MODE_MODE_RSVD_1_MASK)\r\n\r\n#define PUF_MODE_REC_LMT_MASK                    (0xF00000U)\r\n#define PUF_MODE_REC_LMT_SHIFT                   (20U)\r\n/*! REC_LMT - Power of 2 count limit for reconstruction */\r\n#define PUF_MODE_REC_LMT(x)                      (((uint32_t)(((uint32_t)(x)) << PUF_MODE_REC_LMT_SHIFT)) & PUF_MODE_REC_LMT_MASK)\r\n\r\n#define PUF_MODE_MODE_RSVD_0_MASK                (0xF000000U)\r\n#define PUF_MODE_MODE_RSVD_0_SHIFT               (24U)\r\n/*! MODE_RSVD_0 - Reserved */\r\n#define PUF_MODE_MODE_RSVD_0(x)                  (((uint32_t)(((uint32_t)(x)) << PUF_MODE_MODE_RSVD_0_SHIFT)) & PUF_MODE_MODE_RSVD_0_MASK)\r\n\r\n#define PUF_MODE_ENR_LMT_MASK                    (0xF0000000U)\r\n#define PUF_MODE_ENR_LMT_SHIFT                   (28U)\r\n/*! ENR_LMT - Power of 2 count limit for enrollment */\r\n#define PUF_MODE_ENR_LMT(x)                      (((uint32_t)(((uint32_t)(x)) << PUF_MODE_ENR_LMT_SHIFT)) & PUF_MODE_ENR_LMT_MASK)\r\n/*! @} */\r\n\r\n/*! @name CTRL - Control register */\r\n/*! @{ */\r\n\r\n#define PUF_CTRL_GEN_KEY_MASK                    (0x1U)\r\n#define PUF_CTRL_GEN_KEY_SHIFT                   (0U)\r\n/*! GEN_KEY - Generate Next Key; Request another key of a different KEY_ID */\r\n#define PUF_CTRL_GEN_KEY(x)                      (((uint32_t)(((uint32_t)(x)) << PUF_CTRL_GEN_KEY_SHIFT)) & PUF_CTRL_GEN_KEY_MASK)\r\n\r\n#define PUF_CTRL_NEXT_CHUNK_MASK                 (0x2U)\r\n#define PUF_CTRL_NEXT_CHUNK_SHIFT                (1U)\r\n/*! NEXT_CHUNK - Next Key Chunk; Request next chunk of key with current key ID */\r\n#define PUF_CTRL_NEXT_CHUNK(x)                   (((uint32_t)(((uint32_t)(x)) << PUF_CTRL_NEXT_CHUNK_SHIFT)) & PUF_CTRL_NEXT_CHUNK_MASK)\r\n\r\n#define PUF_CTRL_CTRL_RSVD_1_MASK                (0xCU)\r\n#define PUF_CTRL_CTRL_RSVD_1_SHIFT               (2U)\r\n/*! CTRL_RSVD_1 - Reserved */\r\n#define PUF_CTRL_CTRL_RSVD_1(x)                  (((uint32_t)(((uint32_t)(x)) << PUF_CTRL_CTRL_RSVD_1_SHIFT)) & PUF_CTRL_CTRL_RSVD_1_MASK)\r\n\r\n#define PUF_CTRL_KEY_ID_MASK                     (0xF0U)\r\n#define PUF_CTRL_KEY_ID_SHIFT                    (4U)\r\n/*! KEY_ID - Key ID; Upper nibble of the key generation seed. */\r\n#define PUF_CTRL_KEY_ID(x)                       (((uint32_t)(((uint32_t)(x)) << PUF_CTRL_KEY_ID_SHIFT)) & PUF_CTRL_KEY_ID_MASK)\r\n\r\n#define PUF_CTRL_CTRL_RSVD_0_MASK                (0x7FFFFF00U)\r\n#define PUF_CTRL_CTRL_RSVD_0_SHIFT               (8U)\r\n/*! CTRL_RSVD_0 - Reserved */\r\n#define PUF_CTRL_CTRL_RSVD_0(x)                  (((uint32_t)(((uint32_t)(x)) << PUF_CTRL_CTRL_RSVD_0_SHIFT)) & PUF_CTRL_CTRL_RSVD_0_MASK)\r\n\r\n#define PUF_CTRL_PUF_RST_MASK                    (0x80000000U)\r\n#define PUF_CTRL_PUF_RST_SHIFT                   (31U)\r\n/*! PUF_RST - Synchronous Reset */\r\n#define PUF_CTRL_PUF_RST(x)                      (((uint32_t)(((uint32_t)(x)) << PUF_CTRL_PUF_RST_SHIFT)) & PUF_CTRL_PUF_RST_MASK)\r\n/*! @} */\r\n\r\n/*! @name STATUS - Status register */\r\n/*! @{ */\r\n\r\n#define PUF_STATUS_BUSY_MASK                     (0x1U)\r\n#define PUF_STATUS_BUSY_SHIFT                    (0U)\r\n/*! BUSY - PUF is busy */\r\n#define PUF_STATUS_BUSY(x)                       (((uint32_t)(((uint32_t)(x)) << PUF_STATUS_BUSY_SHIFT)) & PUF_STATUS_BUSY_MASK)\r\n\r\n#define PUF_STATUS_STATUS_RSVD_1_MASK            (0xFFFFFEU)\r\n#define PUF_STATUS_STATUS_RSVD_1_SHIFT           (1U)\r\n/*! STATUS_RSVD_1 - Reserved */\r\n#define PUF_STATUS_STATUS_RSVD_1(x)              (((uint32_t)(((uint32_t)(x)) << PUF_STATUS_STATUS_RSVD_1_SHIFT)) & PUF_STATUS_STATUS_RSVD_1_MASK)\r\n\r\n#define PUF_STATUS_ERROR_MASK                    (0xF000000U)\r\n#define PUF_STATUS_ERROR_SHIFT                   (24U)\r\n/*! ERROR - Error Code; 4'b0001 - Checksum mismatch; 4'b0010 - Chunk overflow, next chunk invalid;\r\n *    4'b0011 - Key ID requested is locked; 4'b0100 - Invalid counter limit; 4'b0101 -\r\n *    Enroll/reconstruction is locked; 4'b0110 - Next chunk requested before key requested; 4'b0111 - Invalid lock\r\n *    code\r\n */\r\n#define PUF_STATUS_ERROR(x)                      (((uint32_t)(((uint32_t)(x)) << PUF_STATUS_ERROR_SHIFT)) & PUF_STATUS_ERROR_MASK)\r\n\r\n#define PUF_STATUS_STATUS_RSVD_0_MASK            (0xF0000000U)\r\n#define PUF_STATUS_STATUS_RSVD_0_SHIFT           (28U)\r\n/*! STATUS_RSVD_0 - Reserved */\r\n#define PUF_STATUS_STATUS_RSVD_0(x)              (((uint32_t)(((uint32_t)(x)) << PUF_STATUS_STATUS_RSVD_0_SHIFT)) & PUF_STATUS_STATUS_RSVD_0_MASK)\r\n/*! @} */\r\n\r\n/*! @name VERSION - Version register */\r\n/*! @{ */\r\n\r\n#define PUF_VERSION_ENTROPY_MASK                 (0xFFU)\r\n#define PUF_VERSION_ENTROPY_SHIFT                (0U)\r\n/*! ENTROPY - Entropy Divided by Four */\r\n#define PUF_VERSION_ENTROPY(x)                   (((uint32_t)(((uint32_t)(x)) << PUF_VERSION_ENTROPY_SHIFT)) & PUF_VERSION_ENTROPY_MASK)\r\n\r\n#define PUF_VERSION_NUM_RO_GRP_MASK              (0xFF00U)\r\n#define PUF_VERSION_NUM_RO_GRP_SHIFT             (8U)\r\n/*! NUM_RO_GRP - Number of RO Groups */\r\n#define PUF_VERSION_NUM_RO_GRP(x)                (((uint32_t)(((uint32_t)(x)) << PUF_VERSION_NUM_RO_GRP_SHIFT)) & PUF_VERSION_NUM_RO_GRP_MASK)\r\n\r\n#define PUF_VERSION_MIN_VER_MASK                 (0xFF0000U)\r\n#define PUF_VERSION_MIN_VER_SHIFT                (16U)\r\n/*! MIN_VER - Minor Version */\r\n#define PUF_VERSION_MIN_VER(x)                   (((uint32_t)(((uint32_t)(x)) << PUF_VERSION_MIN_VER_SHIFT)) & PUF_VERSION_MIN_VER_MASK)\r\n\r\n#define PUF_VERSION_MAJ_VER_MASK                 (0xFF000000U)\r\n#define PUF_VERSION_MAJ_VER_SHIFT                (24U)\r\n/*! MAJ_VER - Major Version */\r\n#define PUF_VERSION_MAJ_VER(x)                   (((uint32_t)(((uint32_t)(x)) << PUF_VERSION_MAJ_VER_SHIFT)) & PUF_VERSION_MAJ_VER_MASK)\r\n/*! @} */\r\n\r\n/*! @name CKSUM - Checksum register */\r\n/*! @{ */\r\n\r\n#define PUF_CKSUM_CKSUM_MASK                     (0xFFFFFFFFU)\r\n#define PUF_CKSUM_CKSUM_SHIFT                    (0U)\r\n/*! CKSUM - Checksum; Enrollment: read after operation to store computed checksum; Reconstruction:\r\n *    rxpected checksum to compare written before operation\r\n */\r\n#define PUF_CKSUM_CKSUM(x)                       (((uint32_t)(((uint32_t)(x)) << PUF_CKSUM_CKSUM_SHIFT)) & PUF_CKSUM_CKSUM_MASK)\r\n/*! @} */\r\n\r\n/*! @name PARITY_0 - Parity register */\r\n/*! @{ */\r\n\r\n#define PUF_PARITY_0_PARITY_0_MASK               (0xFFFFFFFFU)\r\n#define PUF_PARITY_0_PARITY_0_SHIFT              (0U)\r\n/*! PARITY_0 - Bits [31:0] of the helper parity data */\r\n#define PUF_PARITY_0_PARITY_0(x)                 (((uint32_t)(((uint32_t)(x)) << PUF_PARITY_0_PARITY_0_SHIFT)) & PUF_PARITY_0_PARITY_0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PARITY_1 - Parity register */\r\n/*! @{ */\r\n\r\n#define PUF_PARITY_1_PARITY_1_MASK               (0xFFFFFFFFU)\r\n#define PUF_PARITY_1_PARITY_1_SHIFT              (0U)\r\n/*! PARITY_1 - Bits [63:32] of the helper parity data */\r\n#define PUF_PARITY_1_PARITY_1(x)                 (((uint32_t)(((uint32_t)(x)) << PUF_PARITY_1_PARITY_1_SHIFT)) & PUF_PARITY_1_PARITY_1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PARITY_2 - Parity register */\r\n/*! @{ */\r\n\r\n#define PUF_PARITY_2_PARITY_2_MASK               (0xFFFU)\r\n#define PUF_PARITY_2_PARITY_2_SHIFT              (0U)\r\n/*! PARITY_2 - Bits [75:64] of the helper parity data */\r\n#define PUF_PARITY_2_PARITY_2(x)                 (((uint32_t)(((uint32_t)(x)) << PUF_PARITY_2_PARITY_2_SHIFT)) & PUF_PARITY_2_PARITY_2_MASK)\r\n\r\n#define PUF_PARITY_2_PAR_RSVD_MASK               (0xFFFFF000U)\r\n#define PUF_PARITY_2_PAR_RSVD_SHIFT              (12U)\r\n/*! PAR_RSVD - Reserved */\r\n#define PUF_PARITY_2_PAR_RSVD(x)                 (((uint32_t)(((uint32_t)(x)) << PUF_PARITY_2_PAR_RSVD_SHIFT)) & PUF_PARITY_2_PAR_RSVD_MASK)\r\n/*! @} */\r\n\r\n/*! @name IGNORE - Ignore register */\r\n/*! @{ */\r\n\r\n#define PUF_IGNORE_IGNORE_MASK                   (0xFFFFFFFFU)\r\n#define PUF_IGNORE_IGNORE_SHIFT                  (0U)\r\n/*! IGNORE - Ignore data; Enrollment: Read after operation to store computed ignore tags;\r\n *    Reconstruction: Written before operation to load ignore tags\r\n */\r\n#define PUF_IGNORE_IGNORE(x)                     (((uint32_t)(((uint32_t)(x)) << PUF_IGNORE_IGNORE_SHIFT)) & PUF_IGNORE_IGNORE_MASK)\r\n/*! @} */\r\n\r\n/*! @name RNG - Random Number register */\r\n/*! @{ */\r\n\r\n#define PUF_RNG_RNG_MASK                         (0xFFFFFFFFU)\r\n#define PUF_RNG_RNG_SHIFT                        (0U)\r\n/*! RNG - Random bits used for masking during reconstruction */\r\n#define PUF_RNG_RNG(x)                           (((uint32_t)(((uint32_t)(x)) << PUF_RNG_RNG_SHIFT)) & PUF_RNG_RNG_MASK)\r\n/*! @} */\r\n\r\n/*! @name KEY_0 - Key register */\r\n/*! @{ */\r\n\r\n#define PUF_KEY_0_KEY_0_MASK                     (0xFFFFFFFFU)\r\n#define PUF_KEY_0_KEY_0_SHIFT                    (0U)\r\n/*! KEY_0 - Bits [31:0] of generated key chunk */\r\n#define PUF_KEY_0_KEY_0(x)                       (((uint32_t)(((uint32_t)(x)) << PUF_KEY_0_KEY_0_SHIFT)) & PUF_KEY_0_KEY_0_MASK)\r\n/*! @} */\r\n\r\n/*! @name KEY_1 - Key register */\r\n/*! @{ */\r\n\r\n#define PUF_KEY_1_KEY_1_MASK                     (0xFFFFFFFFU)\r\n#define PUF_KEY_1_KEY_1_SHIFT                    (0U)\r\n/*! KEY_1 - Bits [63:32] of generated key chunk */\r\n#define PUF_KEY_1_KEY_1(x)                       (((uint32_t)(((uint32_t)(x)) << PUF_KEY_1_KEY_1_SHIFT)) & PUF_KEY_1_KEY_1_MASK)\r\n/*! @} */\r\n\r\n/*! @name LOCK - Lock register */\r\n/*! @{ */\r\n\r\n#define PUF_LOCK_KEY_ID_LCK_MASK                 (0xFFFFU)\r\n#define PUF_LOCK_KEY_ID_LCK_SHIFT                (0U)\r\n/*! KEY_ID_LCK - Key Lock; Each bit position represents the Key ID of a key; 1'b0 - Unlocked; 1'b1 - Locked */\r\n#define PUF_LOCK_KEY_ID_LCK(x)                   (((uint32_t)(((uint32_t)(x)) << PUF_LOCK_KEY_ID_LCK_SHIFT)) & PUF_LOCK_KEY_ID_LCK_MASK)\r\n\r\n#define PUF_LOCK_LOCK_RSVD_MASK                  (0xFF0000U)\r\n#define PUF_LOCK_LOCK_RSVD_SHIFT                 (16U)\r\n/*! LOCK_RSVD - Reserved */\r\n#define PUF_LOCK_LOCK_RSVD(x)                    (((uint32_t)(((uint32_t)(x)) << PUF_LOCK_LOCK_RSVD_SHIFT)) & PUF_LOCK_LOCK_RSVD_MASK)\r\n\r\n#define PUF_LOCK_REC_LCK_MASK                    (0xF000000U)\r\n#define PUF_LOCK_REC_LCK_SHIFT                   (24U)\r\n/*! REC_LCK - Reconstruction lock; 4'h5 - Locked; 4'hA - Unlocked */\r\n#define PUF_LOCK_REC_LCK(x)                      (((uint32_t)(((uint32_t)(x)) << PUF_LOCK_REC_LCK_SHIFT)) & PUF_LOCK_REC_LCK_MASK)\r\n\r\n#define PUF_LOCK_ENR_LCK_MASK                    (0xF0000000U)\r\n#define PUF_LOCK_ENR_LCK_SHIFT                   (28U)\r\n/*! ENR_LCK - Enrollment lock; 4'h5 - Locked; 4'hA - Unlocked */\r\n#define PUF_LOCK_ENR_LCK(x)                      (((uint32_t)(((uint32_t)(x)) << PUF_LOCK_ENR_LCK_SHIFT)) & PUF_LOCK_ENR_LCK_MASK)\r\n/*! @} */\r\n\r\n/*! @name RO_FREQ - RO Frequency register */\r\n/*! @{ */\r\n\r\n#define PUF_RO_FREQ_RO_FREQ_MASK                 (0xFFFFFFFFU)\r\n#define PUF_RO_FREQ_RO_FREQ_SHIFT                (0U)\r\n/*! RO_FREQ - System clock count it takes for the fastest RO of each group to reach the limit */\r\n#define PUF_RO_FREQ_RO_FREQ(x)                   (((uint32_t)(((uint32_t)(x)) << PUF_RO_FREQ_RO_FREQ_SHIFT)) & PUF_RO_FREQ_RO_FREQ_MASK)\r\n/*! @} */\r\n\r\n/*! @name SLW_RO - Slow RO register */\r\n/*! @{ */\r\n\r\n#define PUF_SLW_RO_SLW_RO_MASK                   (0x1FU)\r\n#define PUF_SLW_RO_SLW_RO_SHIFT                  (0U)\r\n/*! SLW_RO - Number of slow ROs in the current group. */\r\n#define PUF_SLW_RO_SLW_RO(x)                     (((uint32_t)(((uint32_t)(x)) << PUF_SLW_RO_SLW_RO_SHIFT)) & PUF_SLW_RO_SLW_RO_MASK)\r\n\r\n#define PUF_SLW_RO_SLW_MAX_PER_GRP_MASK          (0x1F00U)\r\n#define PUF_SLW_RO_SLW_MAX_PER_GRP_SHIFT         (8U)\r\n/*! SLW_MAX_PER_GRP - Largest number of slow ROs detected in a single group */\r\n#define PUF_SLW_RO_SLW_MAX_PER_GRP(x)            (((uint32_t)(((uint32_t)(x)) << PUF_SLW_RO_SLW_MAX_PER_GRP_SHIFT)) & PUF_SLW_RO_SLW_MAX_PER_GRP_MASK)\r\n\r\n#define PUF_SLW_RO_SLW_TOTAL_MASK                (0x1FF0000U)\r\n#define PUF_SLW_RO_SLW_TOTAL_SHIFT               (16U)\r\n/*! SLW_TOTAL - Running total number of slow ROs */\r\n#define PUF_SLW_RO_SLW_TOTAL(x)                  (((uint32_t)(((uint32_t)(x)) << PUF_SLW_RO_SLW_TOTAL_SHIFT)) & PUF_SLW_RO_SLW_TOTAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name EVAL_SEL - Evaluation Select register */\r\n/*! @{ */\r\n\r\n#define PUF_EVAL_SEL_E_RANK_SEL_MASK             (0x1FU)\r\n#define PUF_EVAL_SEL_E_RANK_SEL_SHIFT            (0U)\r\n/*! E_RANK_SEL - Select RO based its post-ranking position */\r\n#define PUF_EVAL_SEL_E_RANK_SEL(x)               (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_SEL_E_RANK_SEL_SHIFT)) & PUF_EVAL_SEL_E_RANK_SEL_MASK)\r\n\r\n#define PUF_EVAL_SEL_E_RSVD_2_MASK               (0xE0U)\r\n#define PUF_EVAL_SEL_E_RSVD_2_SHIFT              (5U)\r\n/*! E_RSVD_2 - Reserved */\r\n#define PUF_EVAL_SEL_E_RSVD_2(x)                 (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_SEL_E_RSVD_2_SHIFT)) & PUF_EVAL_SEL_E_RSVD_2_MASK)\r\n\r\n#define PUF_EVAL_SEL_E_FREE_GRP_MASK             (0x300U)\r\n#define PUF_EVAL_SEL_E_FREE_GRP_SHIFT            (8U)\r\n/*! E_FREE_GRP - Free run mode group select */\r\n#define PUF_EVAL_SEL_E_FREE_GRP(x)               (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_SEL_E_FREE_GRP_SHIFT)) & PUF_EVAL_SEL_E_FREE_GRP_MASK)\r\n\r\n#define PUF_EVAL_SEL_E_RSVD_1_MASK               (0xC00U)\r\n#define PUF_EVAL_SEL_E_RSVD_1_SHIFT              (10U)\r\n/*! E_RSVD_1 - Reserved */\r\n#define PUF_EVAL_SEL_E_RSVD_1(x)                 (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_SEL_E_RSVD_1_SHIFT)) & PUF_EVAL_SEL_E_RSVD_1_MASK)\r\n\r\n#define PUF_EVAL_SEL_E_FREE_SEC_MASK             (0x7000U)\r\n#define PUF_EVAL_SEL_E_FREE_SEC_SHIFT            (12U)\r\n/*! E_FREE_SEC - Free run mode section select */\r\n#define PUF_EVAL_SEL_E_FREE_SEC(x)               (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_SEL_E_FREE_SEC_SHIFT)) & PUF_EVAL_SEL_E_FREE_SEC_MASK)\r\n\r\n#define PUF_EVAL_SEL_E_RSVD_0_MASK               (0xFFFF8000U)\r\n#define PUF_EVAL_SEL_E_RSVD_0_SHIFT              (15U)\r\n/*! E_RSVD_0 - Reserved */\r\n#define PUF_EVAL_SEL_E_RSVD_0(x)                 (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_SEL_E_RSVD_0_SHIFT)) & PUF_EVAL_SEL_E_RSVD_0_MASK)\r\n/*! @} */\r\n\r\n/*! @name EVAL_VAL - Evaluation Value register */\r\n/*! @{ */\r\n\r\n#define PUF_EVAL_VAL_E_CNT_MASK                  (0xFFFFU)\r\n#define PUF_EVAL_VAL_E_CNT_SHIFT                 (0U)\r\n/*! E_CNT - Counter value of the selected RO in PUF_EVAL_SEL */\r\n#define PUF_EVAL_VAL_E_CNT(x)                    (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_VAL_E_CNT_SHIFT)) & PUF_EVAL_VAL_E_CNT_MASK)\r\n\r\n#define PUF_EVAL_VAL_E_RSVD_4_MASK               (0xFF0000U)\r\n#define PUF_EVAL_VAL_E_RSVD_4_SHIFT              (16U)\r\n/*! E_RSVD_4 - Reserved */\r\n#define PUF_EVAL_VAL_E_RSVD_4(x)                 (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_VAL_E_RSVD_4_SHIFT)) & PUF_EVAL_VAL_E_RSVD_4_MASK)\r\n\r\n#define PUF_EVAL_VAL_E_RO_NUM_MASK               (0x1F000000U)\r\n#define PUF_EVAL_VAL_E_RO_NUM_SHIFT              (24U)\r\n/*! E_RO_NUM - Original position of the selected RO in PUF_EVAL_SEL */\r\n#define PUF_EVAL_VAL_E_RO_NUM(x)                 (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_VAL_E_RO_NUM_SHIFT)) & PUF_EVAL_VAL_E_RO_NUM_MASK)\r\n\r\n#define PUF_EVAL_VAL_E_RSVD_3_MASK               (0xE0000000U)\r\n#define PUF_EVAL_VAL_E_RSVD_3_SHIFT              (29U)\r\n/*! E_RSVD_3 - Reserved */\r\n#define PUF_EVAL_VAL_E_RSVD_3(x)                 (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_VAL_E_RSVD_3_SHIFT)) & PUF_EVAL_VAL_E_RSVD_3_MASK)\r\n/*! @} */\r\n\r\n/*! @name EVAL_RAW - Evaluation Raw register */\r\n/*! @{ */\r\n\r\n#define PUF_EVAL_RAW_E_RAW_MASK                  (0xFFFU)\r\n#define PUF_EVAL_RAW_E_RAW_SHIFT                 (0U)\r\n/*! E_RAW - Raw value generated by the current group of ROs */\r\n#define PUF_EVAL_RAW_E_RAW(x)                    (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_RAW_E_RAW_SHIFT)) & PUF_EVAL_RAW_E_RAW_MASK)\r\n\r\n#define PUF_EVAL_RAW_E_RSVD_5_MASK               (0xFFFFF000U)\r\n#define PUF_EVAL_RAW_E_RSVD_5_SHIFT              (12U)\r\n/*! E_RSVD_5 - Reserved */\r\n#define PUF_EVAL_RAW_E_RSVD_5(x)                 (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_RAW_E_RSVD_5_SHIFT)) & PUF_EVAL_RAW_E_RSVD_5_MASK)\r\n/*! @} */\r\n\r\n/*! @name EVAL_BCH - Evaluation BCH register */\r\n/*! @{ */\r\n\r\n#define PUF_EVAL_BCH_E_BCH_ERR_MASK              (0xFU)\r\n#define PUF_EVAL_BCH_E_BCH_ERR_SHIFT             (0U)\r\n/*! E_BCH_ERR - Number of errors PUF detected */\r\n#define PUF_EVAL_BCH_E_BCH_ERR(x)                (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_BCH_E_BCH_ERR_SHIFT)) & PUF_EVAL_BCH_E_BCH_ERR_MASK)\r\n\r\n#define PUF_EVAL_BCH_E_RSVD_7_MASK               (0xF0U)\r\n#define PUF_EVAL_BCH_E_RSVD_7_SHIFT              (4U)\r\n/*! E_RSVD_7 - Reserved */\r\n#define PUF_EVAL_BCH_E_RSVD_7(x)                 (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_BCH_E_RSVD_7_SHIFT)) & PUF_EVAL_BCH_E_RSVD_7_MASK)\r\n\r\n#define PUF_EVAL_BCH_E_ERR_LMT_MASK              (0xF00U)\r\n#define PUF_EVAL_BCH_E_ERR_LMT_SHIFT             (8U)\r\n/*! E_ERR_LMT - Number of errors PUF can detect */\r\n#define PUF_EVAL_BCH_E_ERR_LMT(x)                (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_BCH_E_ERR_LMT_SHIFT)) & PUF_EVAL_BCH_E_ERR_LMT_MASK)\r\n\r\n#define PUF_EVAL_BCH_E_RSVD_6_MASK               (0xFFFFF000U)\r\n#define PUF_EVAL_BCH_E_RSVD_6_SHIFT              (12U)\r\n/*! E_RSVD_6 - Reserved */\r\n#define PUF_EVAL_BCH_E_RSVD_6(x)                 (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_BCH_E_RSVD_6_SHIFT)) & PUF_EVAL_BCH_E_RSVD_6_MASK)\r\n/*! @} */\r\n\r\n/*! @name EVAL_ERR_LOC_0_1 - Error Location register */\r\n/*! @{ */\r\n\r\n#define PUF_EVAL_ERR_LOC_0_1_E_ERR_LOC_0_MASK    (0xFFU)\r\n#define PUF_EVAL_ERR_LOC_0_1_E_ERR_LOC_0_SHIFT   (0U)\r\n/*! E_ERR_LOC_0 - Error location 0 */\r\n#define PUF_EVAL_ERR_LOC_0_1_E_ERR_LOC_0(x)      (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_ERR_LOC_0_1_E_ERR_LOC_0_SHIFT)) & PUF_EVAL_ERR_LOC_0_1_E_ERR_LOC_0_MASK)\r\n\r\n#define PUF_EVAL_ERR_LOC_0_1_E_RSVD_9_MASK       (0xFF00U)\r\n#define PUF_EVAL_ERR_LOC_0_1_E_RSVD_9_SHIFT      (8U)\r\n/*! E_RSVD_9 - Reserved */\r\n#define PUF_EVAL_ERR_LOC_0_1_E_RSVD_9(x)         (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_ERR_LOC_0_1_E_RSVD_9_SHIFT)) & PUF_EVAL_ERR_LOC_0_1_E_RSVD_9_MASK)\r\n\r\n#define PUF_EVAL_ERR_LOC_0_1_E_ERR_LOC_1_MASK    (0xFF0000U)\r\n#define PUF_EVAL_ERR_LOC_0_1_E_ERR_LOC_1_SHIFT   (16U)\r\n/*! E_ERR_LOC_1 - Error location 1 */\r\n#define PUF_EVAL_ERR_LOC_0_1_E_ERR_LOC_1(x)      (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_ERR_LOC_0_1_E_ERR_LOC_1_SHIFT)) & PUF_EVAL_ERR_LOC_0_1_E_ERR_LOC_1_MASK)\r\n\r\n#define PUF_EVAL_ERR_LOC_0_1_E_RSVD_8_MASK       (0xFF000000U)\r\n#define PUF_EVAL_ERR_LOC_0_1_E_RSVD_8_SHIFT      (24U)\r\n/*! E_RSVD_8 - Reserved */\r\n#define PUF_EVAL_ERR_LOC_0_1_E_RSVD_8(x)         (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_ERR_LOC_0_1_E_RSVD_8_SHIFT)) & PUF_EVAL_ERR_LOC_0_1_E_RSVD_8_MASK)\r\n/*! @} */\r\n\r\n/*! @name EVAL_ERR_LOC_2_3 - Error Location register */\r\n/*! @{ */\r\n\r\n#define PUF_EVAL_ERR_LOC_2_3_E_ERR_LOC_2_MASK    (0xFFU)\r\n#define PUF_EVAL_ERR_LOC_2_3_E_ERR_LOC_2_SHIFT   (0U)\r\n/*! E_ERR_LOC_2 - Error location 2 */\r\n#define PUF_EVAL_ERR_LOC_2_3_E_ERR_LOC_2(x)      (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_ERR_LOC_2_3_E_ERR_LOC_2_SHIFT)) & PUF_EVAL_ERR_LOC_2_3_E_ERR_LOC_2_MASK)\r\n\r\n#define PUF_EVAL_ERR_LOC_2_3_E_RSVD_11_MASK      (0xFF00U)\r\n#define PUF_EVAL_ERR_LOC_2_3_E_RSVD_11_SHIFT     (8U)\r\n/*! E_RSVD_11 - Reserved */\r\n#define PUF_EVAL_ERR_LOC_2_3_E_RSVD_11(x)        (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_ERR_LOC_2_3_E_RSVD_11_SHIFT)) & PUF_EVAL_ERR_LOC_2_3_E_RSVD_11_MASK)\r\n\r\n#define PUF_EVAL_ERR_LOC_2_3_E_ERR_LOC_3_MASK    (0xFF0000U)\r\n#define PUF_EVAL_ERR_LOC_2_3_E_ERR_LOC_3_SHIFT   (16U)\r\n/*! E_ERR_LOC_3 - Error location 3 */\r\n#define PUF_EVAL_ERR_LOC_2_3_E_ERR_LOC_3(x)      (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_ERR_LOC_2_3_E_ERR_LOC_3_SHIFT)) & PUF_EVAL_ERR_LOC_2_3_E_ERR_LOC_3_MASK)\r\n\r\n#define PUF_EVAL_ERR_LOC_2_3_E_RSVD_10_MASK      (0xFF000000U)\r\n#define PUF_EVAL_ERR_LOC_2_3_E_RSVD_10_SHIFT     (24U)\r\n/*! E_RSVD_10 - Reserved */\r\n#define PUF_EVAL_ERR_LOC_2_3_E_RSVD_10(x)        (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_ERR_LOC_2_3_E_RSVD_10_SHIFT)) & PUF_EVAL_ERR_LOC_2_3_E_RSVD_10_MASK)\r\n/*! @} */\r\n\r\n/*! @name EVAL_ERR_LOC_4_5 - Error Location register */\r\n/*! @{ */\r\n\r\n#define PUF_EVAL_ERR_LOC_4_5_E_ERR_LOC_4_MASK    (0xFFU)\r\n#define PUF_EVAL_ERR_LOC_4_5_E_ERR_LOC_4_SHIFT   (0U)\r\n/*! E_ERR_LOC_4 - Error location 4 */\r\n#define PUF_EVAL_ERR_LOC_4_5_E_ERR_LOC_4(x)      (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_ERR_LOC_4_5_E_ERR_LOC_4_SHIFT)) & PUF_EVAL_ERR_LOC_4_5_E_ERR_LOC_4_MASK)\r\n\r\n#define PUF_EVAL_ERR_LOC_4_5_E_RSVD_13_MASK      (0xFF00U)\r\n#define PUF_EVAL_ERR_LOC_4_5_E_RSVD_13_SHIFT     (8U)\r\n/*! E_RSVD_13 - Reserved */\r\n#define PUF_EVAL_ERR_LOC_4_5_E_RSVD_13(x)        (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_ERR_LOC_4_5_E_RSVD_13_SHIFT)) & PUF_EVAL_ERR_LOC_4_5_E_RSVD_13_MASK)\r\n\r\n#define PUF_EVAL_ERR_LOC_4_5_E_ERR_LOC_5_MASK    (0xFF0000U)\r\n#define PUF_EVAL_ERR_LOC_4_5_E_ERR_LOC_5_SHIFT   (16U)\r\n/*! E_ERR_LOC_5 - Error location 5 */\r\n#define PUF_EVAL_ERR_LOC_4_5_E_ERR_LOC_5(x)      (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_ERR_LOC_4_5_E_ERR_LOC_5_SHIFT)) & PUF_EVAL_ERR_LOC_4_5_E_ERR_LOC_5_MASK)\r\n\r\n#define PUF_EVAL_ERR_LOC_4_5_E_RSVD_12_MASK      (0xFF000000U)\r\n#define PUF_EVAL_ERR_LOC_4_5_E_RSVD_12_SHIFT     (24U)\r\n/*! E_RSVD_12 - Reserved */\r\n#define PUF_EVAL_ERR_LOC_4_5_E_RSVD_12(x)        (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_ERR_LOC_4_5_E_RSVD_12_SHIFT)) & PUF_EVAL_ERR_LOC_4_5_E_RSVD_12_MASK)\r\n/*! @} */\r\n\r\n/*! @name EVAL_ERR_LOC_6_7 - Error Location register */\r\n/*! @{ */\r\n\r\n#define PUF_EVAL_ERR_LOC_6_7_E_ERR_LOC_6_MASK    (0xFFU)\r\n#define PUF_EVAL_ERR_LOC_6_7_E_ERR_LOC_6_SHIFT   (0U)\r\n/*! E_ERR_LOC_6 - Error location 6 */\r\n#define PUF_EVAL_ERR_LOC_6_7_E_ERR_LOC_6(x)      (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_ERR_LOC_6_7_E_ERR_LOC_6_SHIFT)) & PUF_EVAL_ERR_LOC_6_7_E_ERR_LOC_6_MASK)\r\n\r\n#define PUF_EVAL_ERR_LOC_6_7_E_RSVD_15_MASK      (0xFF00U)\r\n#define PUF_EVAL_ERR_LOC_6_7_E_RSVD_15_SHIFT     (8U)\r\n/*! E_RSVD_15 - Reserved */\r\n#define PUF_EVAL_ERR_LOC_6_7_E_RSVD_15(x)        (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_ERR_LOC_6_7_E_RSVD_15_SHIFT)) & PUF_EVAL_ERR_LOC_6_7_E_RSVD_15_MASK)\r\n\r\n#define PUF_EVAL_ERR_LOC_6_7_E_ERR_LOC_7_MASK    (0xFF0000U)\r\n#define PUF_EVAL_ERR_LOC_6_7_E_ERR_LOC_7_SHIFT   (16U)\r\n/*! E_ERR_LOC_7 - Error location 7 */\r\n#define PUF_EVAL_ERR_LOC_6_7_E_ERR_LOC_7(x)      (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_ERR_LOC_6_7_E_ERR_LOC_7_SHIFT)) & PUF_EVAL_ERR_LOC_6_7_E_ERR_LOC_7_MASK)\r\n\r\n#define PUF_EVAL_ERR_LOC_6_7_E_RSVD_14_MASK      (0xFF000000U)\r\n#define PUF_EVAL_ERR_LOC_6_7_E_RSVD_14_SHIFT     (24U)\r\n/*! E_RSVD_14 - Reserved */\r\n#define PUF_EVAL_ERR_LOC_6_7_E_RSVD_14(x)        (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_ERR_LOC_6_7_E_RSVD_14_SHIFT)) & PUF_EVAL_ERR_LOC_6_7_E_RSVD_14_MASK)\r\n/*! @} */\r\n\r\n/*! @name EVAL_ERR_LOC_8_9 - Error Location register */\r\n/*! @{ */\r\n\r\n#define PUF_EVAL_ERR_LOC_8_9_E_ERR_LOC_8_MASK    (0xFFU)\r\n#define PUF_EVAL_ERR_LOC_8_9_E_ERR_LOC_8_SHIFT   (0U)\r\n/*! E_ERR_LOC_8 - Error location 8 */\r\n#define PUF_EVAL_ERR_LOC_8_9_E_ERR_LOC_8(x)      (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_ERR_LOC_8_9_E_ERR_LOC_8_SHIFT)) & PUF_EVAL_ERR_LOC_8_9_E_ERR_LOC_8_MASK)\r\n\r\n#define PUF_EVAL_ERR_LOC_8_9_E_RSVD_17_MASK      (0xFF00U)\r\n#define PUF_EVAL_ERR_LOC_8_9_E_RSVD_17_SHIFT     (8U)\r\n/*! E_RSVD_17 - Reserved */\r\n#define PUF_EVAL_ERR_LOC_8_9_E_RSVD_17(x)        (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_ERR_LOC_8_9_E_RSVD_17_SHIFT)) & PUF_EVAL_ERR_LOC_8_9_E_RSVD_17_MASK)\r\n\r\n#define PUF_EVAL_ERR_LOC_8_9_E_ERR_LOC_9_MASK    (0xFF0000U)\r\n#define PUF_EVAL_ERR_LOC_8_9_E_ERR_LOC_9_SHIFT   (16U)\r\n/*! E_ERR_LOC_9 - Error location 9 */\r\n#define PUF_EVAL_ERR_LOC_8_9_E_ERR_LOC_9(x)      (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_ERR_LOC_8_9_E_ERR_LOC_9_SHIFT)) & PUF_EVAL_ERR_LOC_8_9_E_ERR_LOC_9_MASK)\r\n\r\n#define PUF_EVAL_ERR_LOC_8_9_E_RSVD_16_MASK      (0xFF000000U)\r\n#define PUF_EVAL_ERR_LOC_8_9_E_RSVD_16_SHIFT     (24U)\r\n/*! E_RSVD_16 - Reserved */\r\n#define PUF_EVAL_ERR_LOC_8_9_E_RSVD_16(x)        (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_ERR_LOC_8_9_E_RSVD_16_SHIFT)) & PUF_EVAL_ERR_LOC_8_9_E_RSVD_16_MASK)\r\n/*! @} */\r\n\r\n/*! @name EVAL_RND_KEY_0 - Evaluation Round Key register */\r\n/*! @{ */\r\n\r\n#define PUF_EVAL_RND_KEY_0_E_RND_KEY_0_MASK      (0xFFFFFFFFU)\r\n#define PUF_EVAL_RND_KEY_0_E_RND_KEY_0_SHIFT     (0U)\r\n/*! E_RND_KEY_0 - Bits [31:0] of current round key used in PRASH */\r\n#define PUF_EVAL_RND_KEY_0_E_RND_KEY_0(x)        (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_RND_KEY_0_E_RND_KEY_0_SHIFT)) & PUF_EVAL_RND_KEY_0_E_RND_KEY_0_MASK)\r\n/*! @} */\r\n\r\n/*! @name EVAL_RND_KEY_1 - Evaluation Round Key register */\r\n/*! @{ */\r\n\r\n#define PUF_EVAL_RND_KEY_1_E_RND_KEY_1_MASK      (0xFFFFFFFFU)\r\n#define PUF_EVAL_RND_KEY_1_E_RND_KEY_1_SHIFT     (0U)\r\n/*! E_RND_KEY_1 - Bits [63:32] of current round key used in PRASH */\r\n#define PUF_EVAL_RND_KEY_1_E_RND_KEY_1(x)        (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_RND_KEY_1_E_RND_KEY_1_SHIFT)) & PUF_EVAL_RND_KEY_1_E_RND_KEY_1_MASK)\r\n/*! @} */\r\n\r\n/*! @name EVAL_CTRL - Evaluation Control register */\r\n/*! @{ */\r\n\r\n#define PUF_EVAL_CTRL_E_EVAL_EN_MASK             (0xFU)\r\n#define PUF_EVAL_CTRL_E_EVAL_EN_SHIFT            (0U)\r\n/*! E_EVAL_EN - Evaluation mode enable; 4'h5 - Disabled; 4'hA - Enabled */\r\n#define PUF_EVAL_CTRL_E_EVAL_EN(x)               (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_CTRL_E_EVAL_EN_SHIFT)) & PUF_EVAL_CTRL_E_EVAL_EN_MASK)\r\n\r\n#define PUF_EVAL_CTRL_E_EVAL_LCK_MASK            (0xF0U)\r\n#define PUF_EVAL_CTRL_E_EVAL_LCK_SHIFT           (4U)\r\n/*! E_EVAL_LCK - Evaluation mode lock; 4'h5 - Locked; 4'hA - Unlocked */\r\n#define PUF_EVAL_CTRL_E_EVAL_LCK(x)              (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_CTRL_E_EVAL_LCK_SHIFT)) & PUF_EVAL_CTRL_E_EVAL_LCK_MASK)\r\n\r\n#define PUF_EVAL_CTRL_E_FREE_MASK                (0x100U)\r\n#define PUF_EVAL_CTRL_E_FREE_SHIFT               (8U)\r\n/*! E_FREE - Free running mode; 1'b0 - Off; 1'b1 - On */\r\n#define PUF_EVAL_CTRL_E_FREE(x)                  (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_CTRL_E_FREE_SHIFT)) & PUF_EVAL_CTRL_E_FREE_MASK)\r\n\r\n#define PUF_EVAL_CTRL_E_RSVD_18_MASK             (0xFFFFFE00U)\r\n#define PUF_EVAL_CTRL_E_RSVD_18_SHIFT            (9U)\r\n/*! E_RSVD_18 - Reserved */\r\n#define PUF_EVAL_CTRL_E_RSVD_18(x)               (((uint32_t)(((uint32_t)(x)) << PUF_EVAL_CTRL_E_RSVD_18_SHIFT)) & PUF_EVAL_CTRL_E_RSVD_18_MASK)\r\n/*! @} */\r\n\r\n/*! @name ACCESS_ERR - Access Error register */\r\n/*! @{ */\r\n\r\n#define PUF_ACCESS_ERR_APB_NOTAV_MASK            (0x1U)\r\n#define PUF_ACCESS_ERR_APB_NOTAV_SHIFT           (0U)\r\n/*! APB_NOTAV - APB error: address not available */\r\n#define PUF_ACCESS_ERR_APB_NOTAV(x)              (((uint32_t)(((uint32_t)(x)) << PUF_ACCESS_ERR_APB_NOTAV_SHIFT)) & PUF_ACCESS_ERR_APB_NOTAV_MASK)\r\n\r\n#define PUF_ACCESS_ERR_APB_WRGMD_MASK            (0x2U)\r\n#define PUF_ACCESS_ERR_APB_WRGMD_SHIFT           (1U)\r\n/*! APB_WRGMD - APB error: wrong access mode */\r\n#define PUF_ACCESS_ERR_APB_WRGMD(x)              (((uint32_t)(((uint32_t)(x)) << PUF_ACCESS_ERR_APB_WRGMD_SHIFT)) & PUF_ACCESS_ERR_APB_WRGMD_MASK)\r\n\r\n#define PUF_ACCESS_ERR_ACCESS_ERR_RSVD_1_MASK    (0xCU)\r\n#define PUF_ACCESS_ERR_ACCESS_ERR_RSVD_1_SHIFT   (2U)\r\n/*! ACCESS_ERR_RSVD_1 - Reserved */\r\n#define PUF_ACCESS_ERR_ACCESS_ERR_RSVD_1(x)      (((uint32_t)(((uint32_t)(x)) << PUF_ACCESS_ERR_ACCESS_ERR_RSVD_1_SHIFT)) & PUF_ACCESS_ERR_ACCESS_ERR_RSVD_1_MASK)\r\n\r\n#define PUF_ACCESS_ERR_APB_MASTER_MASK           (0xF0U)\r\n#define PUF_ACCESS_ERR_APB_MASTER_SHIFT          (4U)\r\n/*! APB_MASTER - APB Master that triggered the APB error */\r\n#define PUF_ACCESS_ERR_APB_MASTER(x)             (((uint32_t)(((uint32_t)(x)) << PUF_ACCESS_ERR_APB_MASTER_SHIFT)) & PUF_ACCESS_ERR_APB_MASTER_MASK)\r\n\r\n#define PUF_ACCESS_ERR_ACCESS_ERR_RSVD_0_MASK    (0xFFFFFF00U)\r\n#define PUF_ACCESS_ERR_ACCESS_ERR_RSVD_0_SHIFT   (8U)\r\n/*! ACCESS_ERR_RSVD_0 - Reserved */\r\n#define PUF_ACCESS_ERR_ACCESS_ERR_RSVD_0(x)      (((uint32_t)(((uint32_t)(x)) << PUF_ACCESS_ERR_ACCESS_ERR_RSVD_0_SHIFT)) & PUF_ACCESS_ERR_ACCESS_ERR_RSVD_0_MASK)\r\n/*! @} */\r\n\r\n/*! @name ACCESS_ERR_CLR - Access Error Clear register */\r\n/*! @{ */\r\n\r\n#define PUF_ACCESS_ERR_CLR_ACCESS_ERR_CLR_MASK   (0x1U)\r\n#define PUF_ACCESS_ERR_CLR_ACCESS_ERR_CLR_SHIFT  (0U)\r\n/*! ACCESS_ERR_CLR - Clear access errors */\r\n#define PUF_ACCESS_ERR_CLR_ACCESS_ERR_CLR(x)     (((uint32_t)(((uint32_t)(x)) << PUF_ACCESS_ERR_CLR_ACCESS_ERR_CLR_SHIFT)) & PUF_ACCESS_ERR_CLR_ACCESS_ERR_CLR_MASK)\r\n\r\n#define PUF_ACCESS_ERR_CLR_ACCESS_ERR_CLR_RSVD_MASK (0xFFFFFFFEU)\r\n#define PUF_ACCESS_ERR_CLR_ACCESS_ERR_CLR_RSVD_SHIFT (1U)\r\n/*! ACCESS_ERR_CLR_RSVD - Reserved */\r\n#define PUF_ACCESS_ERR_CLR_ACCESS_ERR_CLR_RSVD(x) (((uint32_t)(((uint32_t)(x)) << PUF_ACCESS_ERR_CLR_ACCESS_ERR_CLR_RSVD_SHIFT)) & PUF_ACCESS_ERR_CLR_ACCESS_ERR_CLR_RSVD_MASK)\r\n/*! @} */\r\n\r\n/*! @name INT_STATUS - Interrupt Status register */\r\n/*! @{ */\r\n\r\n#define PUF_INT_STATUS_INT_ERROR_MASK            (0x1U)\r\n#define PUF_INT_STATUS_INT_ERROR_SHIFT           (0U)\r\n/*! INT_ERROR - Error has occured */\r\n#define PUF_INT_STATUS_INT_ERROR(x)              (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_INT_ERROR_SHIFT)) & PUF_INT_STATUS_INT_ERROR_MASK)\r\n\r\n#define PUF_INT_STATUS_RNG_RDY_MASK              (0x2U)\r\n#define PUF_INT_STATUS_RNG_RDY_SHIFT             (1U)\r\n/*! RNG_RDY - Reconstruction only: more random data is required */\r\n#define PUF_INT_STATUS_RNG_RDY(x)                (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_RNG_RDY_SHIFT)) & PUF_INT_STATUS_RNG_RDY_MASK)\r\n\r\n#define PUF_INT_STATUS_RANK_DONE_MASK            (0x4U)\r\n#define PUF_INT_STATUS_RANK_DONE_SHIFT           (2U)\r\n/*! RANK_DONE - Enrollment only: Ranking is complete and ignore data is ready to be read */\r\n#define PUF_INT_STATUS_RANK_DONE(x)              (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_RANK_DONE_SHIFT)) & PUF_INT_STATUS_RANK_DONE_MASK)\r\n\r\n#define PUF_INT_STATUS_PAR_RDY_MASK              (0x8U)\r\n#define PUF_INT_STATUS_PAR_RDY_SHIFT             (3U)\r\n/*! PAR_RDY - Parity data has been calculated and ready to be read */\r\n#define PUF_INT_STATUS_PAR_RDY(x)                (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_PAR_RDY_SHIFT)) & PUF_INT_STATUS_PAR_RDY_MASK)\r\n\r\n#define PUF_INT_STATUS_CKS_RDY_MASK              (0x10U)\r\n#define PUF_INT_STATUS_CKS_RDY_SHIFT             (4U)\r\n/*! CKS_RDY - Checksum has been calculated and ready to be read */\r\n#define PUF_INT_STATUS_CKS_RDY(x)                (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_CKS_RDY_SHIFT)) & PUF_INT_STATUS_CKS_RDY_MASK)\r\n\r\n#define PUF_INT_STATUS_IGN_LOAD_MASK             (0x20U)\r\n#define PUF_INT_STATUS_IGN_LOAD_SHIFT            (5U)\r\n/*! IGN_LOAD - Reconstruction only: ignore data is required to be loaded */\r\n#define PUF_INT_STATUS_IGN_LOAD(x)               (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_IGN_LOAD_SHIFT)) & PUF_INT_STATUS_IGN_LOAD_MASK)\r\n\r\n#define PUF_INT_STATUS_KEY_RDY_MASK              (0x40U)\r\n#define PUF_INT_STATUS_KEY_RDY_SHIFT             (6U)\r\n/*! KEY_RDY - Key chunk has been generated and ready to be read */\r\n#define PUF_INT_STATUS_KEY_RDY(x)                (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_KEY_RDY_SHIFT)) & PUF_INT_STATUS_KEY_RDY_MASK)\r\n\r\n#define PUF_INT_STATUS_INT_RSVD_MASK             (0xFFFFFF80U)\r\n#define PUF_INT_STATUS_INT_RSVD_SHIFT            (7U)\r\n/*! INT_RSVD - Reserved */\r\n#define PUF_INT_STATUS_INT_RSVD(x)               (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_INT_RSVD_SHIFT)) & PUF_INT_STATUS_INT_RSVD_MASK)\r\n/*! @} */\r\n\r\n/*! @name INT_ENABLE - Interrupt Enable register */\r\n/*! @{ */\r\n\r\n#define PUF_INT_ENABLE_INT_EN_ERROR_MASK         (0x1U)\r\n#define PUF_INT_ENABLE_INT_EN_ERROR_SHIFT        (0U)\r\n/*! INT_EN_ERROR - Interrupt enable for error interrupt */\r\n#define PUF_INT_ENABLE_INT_EN_ERROR(x)           (((uint32_t)(((uint32_t)(x)) << PUF_INT_ENABLE_INT_EN_ERROR_SHIFT)) & PUF_INT_ENABLE_INT_EN_ERROR_MASK)\r\n\r\n#define PUF_INT_ENABLE_INT_EN_RNG_RDY_MASK       (0x2U)\r\n#define PUF_INT_ENABLE_INT_EN_RNG_RDY_SHIFT      (1U)\r\n/*! INT_EN_RNG_RDY - Interrupt enable for RNG_RDY */\r\n#define PUF_INT_ENABLE_INT_EN_RNG_RDY(x)         (((uint32_t)(((uint32_t)(x)) << PUF_INT_ENABLE_INT_EN_RNG_RDY_SHIFT)) & PUF_INT_ENABLE_INT_EN_RNG_RDY_MASK)\r\n\r\n#define PUF_INT_ENABLE_INT_EN_RANK_DONE_MASK     (0x4U)\r\n#define PUF_INT_ENABLE_INT_EN_RANK_DONE_SHIFT    (2U)\r\n/*! INT_EN_RANK_DONE - Interrupt enable for RANK_DONE */\r\n#define PUF_INT_ENABLE_INT_EN_RANK_DONE(x)       (((uint32_t)(((uint32_t)(x)) << PUF_INT_ENABLE_INT_EN_RANK_DONE_SHIFT)) & PUF_INT_ENABLE_INT_EN_RANK_DONE_MASK)\r\n\r\n#define PUF_INT_ENABLE_INT_EN_PAR_RDY_MASK       (0x8U)\r\n#define PUF_INT_ENABLE_INT_EN_PAR_RDY_SHIFT      (3U)\r\n/*! INT_EN_PAR_RDY - Interrupt enable for PAR_RDY */\r\n#define PUF_INT_ENABLE_INT_EN_PAR_RDY(x)         (((uint32_t)(((uint32_t)(x)) << PUF_INT_ENABLE_INT_EN_PAR_RDY_SHIFT)) & PUF_INT_ENABLE_INT_EN_PAR_RDY_MASK)\r\n\r\n#define PUF_INT_ENABLE_INT_EN_CKS_RDY_MASK       (0x10U)\r\n#define PUF_INT_ENABLE_INT_EN_CKS_RDY_SHIFT      (4U)\r\n/*! INT_EN_CKS_RDY - Interrupt enable for CKS_RDY */\r\n#define PUF_INT_ENABLE_INT_EN_CKS_RDY(x)         (((uint32_t)(((uint32_t)(x)) << PUF_INT_ENABLE_INT_EN_CKS_RDY_SHIFT)) & PUF_INT_ENABLE_INT_EN_CKS_RDY_MASK)\r\n\r\n#define PUF_INT_ENABLE_INT_EN_IGN_LOAD_MASK      (0x20U)\r\n#define PUF_INT_ENABLE_INT_EN_IGN_LOAD_SHIFT     (5U)\r\n/*! INT_EN_IGN_LOAD - Interrupt enable for IGN_LOAD */\r\n#define PUF_INT_ENABLE_INT_EN_IGN_LOAD(x)        (((uint32_t)(((uint32_t)(x)) << PUF_INT_ENABLE_INT_EN_IGN_LOAD_SHIFT)) & PUF_INT_ENABLE_INT_EN_IGN_LOAD_MASK)\r\n\r\n#define PUF_INT_ENABLE_INT_EN_KEY_RDY_MASK       (0x40U)\r\n#define PUF_INT_ENABLE_INT_EN_KEY_RDY_SHIFT      (6U)\r\n/*! INT_EN_KEY_RDY - Interrupt enable for KEY_RDY */\r\n#define PUF_INT_ENABLE_INT_EN_KEY_RDY(x)         (((uint32_t)(((uint32_t)(x)) << PUF_INT_ENABLE_INT_EN_KEY_RDY_SHIFT)) & PUF_INT_ENABLE_INT_EN_KEY_RDY_MASK)\r\n\r\n#define PUF_INT_ENABLE_INT_EN_RSVD_MASK          (0xFFFFFF80U)\r\n#define PUF_INT_ENABLE_INT_EN_RSVD_SHIFT         (7U)\r\n/*! INT_EN_RSVD - Reserved */\r\n#define PUF_INT_ENABLE_INT_EN_RSVD(x)            (((uint32_t)(((uint32_t)(x)) << PUF_INT_ENABLE_INT_EN_RSVD_SHIFT)) & PUF_INT_ENABLE_INT_EN_RSVD_MASK)\r\n/*! @} */\r\n\r\n/*! @name INT_STATUS_CLR - Interrupt Status Clear register */\r\n/*! @{ */\r\n\r\n#define PUF_INT_STATUS_CLR_INT_CLR_ERROR_MASK    (0x1U)\r\n#define PUF_INT_STATUS_CLR_INT_CLR_ERROR_SHIFT   (0U)\r\n/*! INT_CLR_ERROR - Interrupt clear for error interrupt */\r\n#define PUF_INT_STATUS_CLR_INT_CLR_ERROR(x)      (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_CLR_INT_CLR_ERROR_SHIFT)) & PUF_INT_STATUS_CLR_INT_CLR_ERROR_MASK)\r\n\r\n#define PUF_INT_STATUS_CLR_INT_CLR_RNG_RDY_MASK  (0x2U)\r\n#define PUF_INT_STATUS_CLR_INT_CLR_RNG_RDY_SHIFT (1U)\r\n/*! INT_CLR_RNG_RDY - Interrupt clear for RNG_RDY */\r\n#define PUF_INT_STATUS_CLR_INT_CLR_RNG_RDY(x)    (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_CLR_INT_CLR_RNG_RDY_SHIFT)) & PUF_INT_STATUS_CLR_INT_CLR_RNG_RDY_MASK)\r\n\r\n#define PUF_INT_STATUS_CLR_INT_CLR_RANK_DONE_MASK (0x4U)\r\n#define PUF_INT_STATUS_CLR_INT_CLR_RANK_DONE_SHIFT (2U)\r\n/*! INT_CLR_RANK_DONE - Interrupt clear for RANK_DONE */\r\n#define PUF_INT_STATUS_CLR_INT_CLR_RANK_DONE(x)  (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_CLR_INT_CLR_RANK_DONE_SHIFT)) & PUF_INT_STATUS_CLR_INT_CLR_RANK_DONE_MASK)\r\n\r\n#define PUF_INT_STATUS_CLR_INT_CLR_PAR_RDY_MASK  (0x8U)\r\n#define PUF_INT_STATUS_CLR_INT_CLR_PAR_RDY_SHIFT (3U)\r\n/*! INT_CLR_PAR_RDY - Interrupt clear for PAR_RDY */\r\n#define PUF_INT_STATUS_CLR_INT_CLR_PAR_RDY(x)    (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_CLR_INT_CLR_PAR_RDY_SHIFT)) & PUF_INT_STATUS_CLR_INT_CLR_PAR_RDY_MASK)\r\n\r\n#define PUF_INT_STATUS_CLR_INT_CLR_CKS_RDY_MASK  (0x10U)\r\n#define PUF_INT_STATUS_CLR_INT_CLR_CKS_RDY_SHIFT (4U)\r\n/*! INT_CLR_CKS_RDY - Interrupt clear for CKS_RDY */\r\n#define PUF_INT_STATUS_CLR_INT_CLR_CKS_RDY(x)    (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_CLR_INT_CLR_CKS_RDY_SHIFT)) & PUF_INT_STATUS_CLR_INT_CLR_CKS_RDY_MASK)\r\n\r\n#define PUF_INT_STATUS_CLR_INT_CLR_IGN_LOAD_MASK (0x20U)\r\n#define PUF_INT_STATUS_CLR_INT_CLR_IGN_LOAD_SHIFT (5U)\r\n/*! INT_CLR_IGN_LOAD - Interrupt clear for IGN_LOAD */\r\n#define PUF_INT_STATUS_CLR_INT_CLR_IGN_LOAD(x)   (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_CLR_INT_CLR_IGN_LOAD_SHIFT)) & PUF_INT_STATUS_CLR_INT_CLR_IGN_LOAD_MASK)\r\n\r\n#define PUF_INT_STATUS_CLR_INT_CLR_KEY_RDY_MASK  (0x40U)\r\n#define PUF_INT_STATUS_CLR_INT_CLR_KEY_RDY_SHIFT (6U)\r\n/*! INT_CLR_KEY_RDY - Interrupt clear for KEY_RDY */\r\n#define PUF_INT_STATUS_CLR_INT_CLR_KEY_RDY(x)    (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_CLR_INT_CLR_KEY_RDY_SHIFT)) & PUF_INT_STATUS_CLR_INT_CLR_KEY_RDY_MASK)\r\n\r\n#define PUF_INT_STATUS_CLR_INT_CLR_RSVD_MASK     (0xFFFFFF80U)\r\n#define PUF_INT_STATUS_CLR_INT_CLR_RSVD_SHIFT    (7U)\r\n/*! INT_CLR_RSVD - Reserved */\r\n#define PUF_INT_STATUS_CLR_INT_CLR_RSVD(x)       (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_CLR_INT_CLR_RSVD_SHIFT)) & PUF_INT_STATUS_CLR_INT_CLR_RSVD_MASK)\r\n/*! @} */\r\n\r\n/*! @name INT_STATUS_SET - Interrupt Status Set register */\r\n/*! @{ */\r\n\r\n#define PUF_INT_STATUS_SET_INT_SET_ERROR_MASK    (0x1U)\r\n#define PUF_INT_STATUS_SET_INT_SET_ERROR_SHIFT   (0U)\r\n/*! INT_SET_ERROR - Interrupt set for error interrupt */\r\n#define PUF_INT_STATUS_SET_INT_SET_ERROR(x)      (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_SET_INT_SET_ERROR_SHIFT)) & PUF_INT_STATUS_SET_INT_SET_ERROR_MASK)\r\n\r\n#define PUF_INT_STATUS_SET_INT_SET_RNG_RDY_MASK  (0x2U)\r\n#define PUF_INT_STATUS_SET_INT_SET_RNG_RDY_SHIFT (1U)\r\n/*! INT_SET_RNG_RDY - Interrupt set for RNG_RDY */\r\n#define PUF_INT_STATUS_SET_INT_SET_RNG_RDY(x)    (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_SET_INT_SET_RNG_RDY_SHIFT)) & PUF_INT_STATUS_SET_INT_SET_RNG_RDY_MASK)\r\n\r\n#define PUF_INT_STATUS_SET_INT_SET_RANK_DONE_MASK (0x4U)\r\n#define PUF_INT_STATUS_SET_INT_SET_RANK_DONE_SHIFT (2U)\r\n/*! INT_SET_RANK_DONE - Interrupt set for RANK_DONE */\r\n#define PUF_INT_STATUS_SET_INT_SET_RANK_DONE(x)  (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_SET_INT_SET_RANK_DONE_SHIFT)) & PUF_INT_STATUS_SET_INT_SET_RANK_DONE_MASK)\r\n\r\n#define PUF_INT_STATUS_SET_INT_SET_PAR_RDY_MASK  (0x8U)\r\n#define PUF_INT_STATUS_SET_INT_SET_PAR_RDY_SHIFT (3U)\r\n/*! INT_SET_PAR_RDY - Interrupt set for PAR_RDY */\r\n#define PUF_INT_STATUS_SET_INT_SET_PAR_RDY(x)    (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_SET_INT_SET_PAR_RDY_SHIFT)) & PUF_INT_STATUS_SET_INT_SET_PAR_RDY_MASK)\r\n\r\n#define PUF_INT_STATUS_SET_INT_SET_CKS_RDY_MASK  (0x10U)\r\n#define PUF_INT_STATUS_SET_INT_SET_CKS_RDY_SHIFT (4U)\r\n/*! INT_SET_CKS_RDY - Interrupt set for CKS_RDY */\r\n#define PUF_INT_STATUS_SET_INT_SET_CKS_RDY(x)    (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_SET_INT_SET_CKS_RDY_SHIFT)) & PUF_INT_STATUS_SET_INT_SET_CKS_RDY_MASK)\r\n\r\n#define PUF_INT_STATUS_SET_INT_SET_IGN_LOAD_MASK (0x20U)\r\n#define PUF_INT_STATUS_SET_INT_SET_IGN_LOAD_SHIFT (5U)\r\n/*! INT_SET_IGN_LOAD - Interrupt set for IGN_LOAD */\r\n#define PUF_INT_STATUS_SET_INT_SET_IGN_LOAD(x)   (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_SET_INT_SET_IGN_LOAD_SHIFT)) & PUF_INT_STATUS_SET_INT_SET_IGN_LOAD_MASK)\r\n\r\n#define PUF_INT_STATUS_SET_INT_SET_KEY_RDY_MASK  (0x40U)\r\n#define PUF_INT_STATUS_SET_INT_SET_KEY_RDY_SHIFT (6U)\r\n/*! INT_SET_KEY_RDY - Interrupt set for KEY_RDY */\r\n#define PUF_INT_STATUS_SET_INT_SET_KEY_RDY(x)    (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_SET_INT_SET_KEY_RDY_SHIFT)) & PUF_INT_STATUS_SET_INT_SET_KEY_RDY_MASK)\r\n\r\n#define PUF_INT_STATUS_SET_INT_SET_RSVD_MASK     (0xFFFFFF80U)\r\n#define PUF_INT_STATUS_SET_INT_SET_RSVD_SHIFT    (7U)\r\n/*! INT_SET_RSVD - Reserved */\r\n#define PUF_INT_STATUS_SET_INT_SET_RSVD(x)       (((uint32_t)(((uint32_t)(x)) << PUF_INT_STATUS_SET_INT_SET_RSVD_SHIFT)) & PUF_INT_STATUS_SET_INT_SET_RSVD_MASK)\r\n/*! @} */\r\n\r\n/*! @name MODULE_ID - Module ID register */\r\n/*! @{ */\r\n\r\n#define PUF_MODULE_ID_PLACEHOLDER_MASK           (0xFFFFFFFFU)\r\n#define PUF_MODULE_ID_PLACEHOLDER_SHIFT          (0U)\r\n/*! PLACEHOLDER - Module ID */\r\n#define PUF_MODULE_ID_PLACEHOLDER(x)             (((uint32_t)(((uint32_t)(x)) << PUF_MODULE_ID_PLACEHOLDER_SHIFT)) & PUF_MODULE_ID_PLACEHOLDER_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group PUF_Register_Masks */\r\n\r\n\r\n/* PUF - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral PUF base address */\r\n  #define PUF_BASE                                 (0x50006000u)\r\n  /** Peripheral PUF base address */\r\n  #define PUF_BASE_NS                              (0x40006000u)\r\n  /** Peripheral PUF base pointer */\r\n  #define PUF                                      ((PUF_Type *)PUF_BASE)\r\n  /** Peripheral PUF base pointer */\r\n  #define PUF_NS                                   ((PUF_Type *)PUF_BASE_NS)\r\n  /** Array initializer of PUF peripheral base addresses */\r\n  #define PUF_BASE_ADDRS                           { PUF_BASE }\r\n  /** Array initializer of PUF peripheral base pointers */\r\n  #define PUF_BASE_PTRS                            { PUF }\r\n  /** Array initializer of PUF peripheral base addresses */\r\n  #define PUF_BASE_ADDRS_NS                        { PUF_BASE_NS }\r\n  /** Array initializer of PUF peripheral base pointers */\r\n  #define PUF_BASE_PTRS_NS                         { PUF_NS }\r\n#else\r\n  /** Peripheral PUF base address */\r\n  #define PUF_BASE                                 (0x40006000u)\r\n  /** Peripheral PUF base pointer */\r\n  #define PUF                                      ((PUF_Type *)PUF_BASE)\r\n  /** Array initializer of PUF peripheral base addresses */\r\n  #define PUF_BASE_ADDRS                           { PUF_BASE }\r\n  /** Array initializer of PUF peripheral base pointers */\r\n  #define PUF_BASE_PTRS                            { PUF }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group PUF_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- RF_SYSCON Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup RF_SYSCON_Peripheral_Access_Layer RF_SYSCON Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** RF_SYSCON - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[1024];\r\n  __I  uint32_t WO_SCRATCH_REG[8];                 /**< Write once scratch register 0..Write once scratch register 7, array offset: 0x400, array step: 0x4 */\r\n       uint8_t RESERVED_1[96];\r\n  __IO uint32_t RW_SCRATCH_REG[8];                 /**< Scratch register 0..Scratch register 7, array offset: 0x480, array step: 0x4 */\r\n} RF_SYSCON_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- RF_SYSCON Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup RF_SYSCON_Register_Masks RF_SYSCON Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name WO_SCRATCH_REG - Write once scratch register 0..Write once scratch register 7 */\r\n/*! @{ */\r\n\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG0_MASK (0xFFFFFFFFU)\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG0_SHIFT (0U)\r\n/*! WO_SCRATCH_REG0 - Write once scratch register 0 */\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG0(x) (((uint32_t)(((uint32_t)(x)) << RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG0_SHIFT)) & RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG0_MASK)\r\n\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG1_MASK (0xFFFFFFFFU)\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG1_SHIFT (0U)\r\n/*! WO_SCRATCH_REG1 - Write once scratch register 1 */\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG1(x) (((uint32_t)(((uint32_t)(x)) << RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG1_SHIFT)) & RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG1_MASK)\r\n\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG2_MASK (0xFFFFFFFFU)\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG2_SHIFT (0U)\r\n/*! WO_SCRATCH_REG2 - Write once scratch register 2 */\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG2(x) (((uint32_t)(((uint32_t)(x)) << RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG2_SHIFT)) & RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG2_MASK)\r\n\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG3_MASK (0xFFFFFFFFU)\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG3_SHIFT (0U)\r\n/*! WO_SCRATCH_REG3 - Write once scratch register 3 */\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG3(x) (((uint32_t)(((uint32_t)(x)) << RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG3_SHIFT)) & RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG3_MASK)\r\n\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG4_MASK (0xFFFFFFFFU)\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG4_SHIFT (0U)\r\n/*! WO_SCRATCH_REG4 - Write once scratch register 4 */\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG4(x) (((uint32_t)(((uint32_t)(x)) << RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG4_SHIFT)) & RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG4_MASK)\r\n\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG5_MASK (0xFFFFFFFFU)\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG5_SHIFT (0U)\r\n/*! WO_SCRATCH_REG5 - Write once scratch register 5 */\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG5(x) (((uint32_t)(((uint32_t)(x)) << RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG5_SHIFT)) & RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG5_MASK)\r\n\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG6_MASK (0xFFFFFFFFU)\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG6_SHIFT (0U)\r\n/*! WO_SCRATCH_REG6 - Write once scratch register 6 */\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG6(x) (((uint32_t)(((uint32_t)(x)) << RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG6_SHIFT)) & RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG6_MASK)\r\n\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG7_MASK (0xFFFFFFFFU)\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG7_SHIFT (0U)\r\n/*! WO_SCRATCH_REG7 - Write once scratch register 7 */\r\n#define RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG7(x) (((uint32_t)(((uint32_t)(x)) << RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG7_SHIFT)) & RF_SYSCON_WO_SCRATCH_REG_WO_SCRATCH_REG7_MASK)\r\n/*! @} */\r\n\r\n/* The count of RF_SYSCON_WO_SCRATCH_REG */\r\n#define RF_SYSCON_WO_SCRATCH_REG_COUNT           (8U)\r\n\r\n/*! @name RW_SCRATCH_REG - Scratch register 0..Scratch register 7 */\r\n/*! @{ */\r\n\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG0_MASK (0xFFFFFFFFU)\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG0_SHIFT (0U)\r\n/*! RW_SCRATCH_REG0 - Scratch register 0 */\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG0(x) (((uint32_t)(((uint32_t)(x)) << RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG0_SHIFT)) & RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG0_MASK)\r\n\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG1_MASK (0xFFFFFFFFU)\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG1_SHIFT (0U)\r\n/*! RW_SCRATCH_REG1 - Scratch register 1 */\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG1(x) (((uint32_t)(((uint32_t)(x)) << RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG1_SHIFT)) & RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG1_MASK)\r\n\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG2_MASK (0xFFFFFFFFU)\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG2_SHIFT (0U)\r\n/*! RW_SCRATCH_REG2 - Scratch register 2 */\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG2(x) (((uint32_t)(((uint32_t)(x)) << RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG2_SHIFT)) & RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG2_MASK)\r\n\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG3_MASK (0xFFFFFFFFU)\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG3_SHIFT (0U)\r\n/*! RW_SCRATCH_REG3 - Scratch register 3 */\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG3(x) (((uint32_t)(((uint32_t)(x)) << RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG3_SHIFT)) & RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG3_MASK)\r\n\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG4_MASK (0xFFFFFFFFU)\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG4_SHIFT (0U)\r\n/*! RW_SCRATCH_REG4 - Scratch register 4 */\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG4(x) (((uint32_t)(((uint32_t)(x)) << RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG4_SHIFT)) & RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG4_MASK)\r\n\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG5_MASK (0xFFFFFFFFU)\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG5_SHIFT (0U)\r\n/*! RW_SCRATCH_REG5 - Scratch register 5 */\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG5(x) (((uint32_t)(((uint32_t)(x)) << RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG5_SHIFT)) & RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG5_MASK)\r\n\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG6_MASK (0xFFFFFFFFU)\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG6_SHIFT (0U)\r\n/*! RW_SCRATCH_REG6 - Scratch register 6 */\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG6(x) (((uint32_t)(((uint32_t)(x)) << RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG6_SHIFT)) & RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG6_MASK)\r\n\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG7_MASK (0xFFFFFFFFU)\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG7_SHIFT (0U)\r\n/*! RW_SCRATCH_REG7 - Scratch register 7 */\r\n#define RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG7(x) (((uint32_t)(((uint32_t)(x)) << RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG7_SHIFT)) & RF_SYSCON_RW_SCRATCH_REG_RW_SCRATCH_REG7_MASK)\r\n/*! @} */\r\n\r\n/* The count of RF_SYSCON_RW_SCRATCH_REG */\r\n#define RF_SYSCON_RW_SCRATCH_REG_COUNT           (8U)\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group RF_SYSCON_Register_Masks */\r\n\r\n\r\n/* RF_SYSCON - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral RF_SYSCON base address */\r\n  #define RF_SYSCON_BASE                           (0x5003B000u)\r\n  /** Peripheral RF_SYSCON base address */\r\n  #define RF_SYSCON_BASE_NS                        (0x4003B000u)\r\n  /** Peripheral RF_SYSCON base pointer */\r\n  #define RF_SYSCON                                ((RF_SYSCON_Type *)RF_SYSCON_BASE)\r\n  /** Peripheral RF_SYSCON base pointer */\r\n  #define RF_SYSCON_NS                             ((RF_SYSCON_Type *)RF_SYSCON_BASE_NS)\r\n  /** Array initializer of RF_SYSCON peripheral base addresses */\r\n  #define RF_SYSCON_BASE_ADDRS                     { RF_SYSCON_BASE }\r\n  /** Array initializer of RF_SYSCON peripheral base pointers */\r\n  #define RF_SYSCON_BASE_PTRS                      { RF_SYSCON }\r\n  /** Array initializer of RF_SYSCON peripheral base addresses */\r\n  #define RF_SYSCON_BASE_ADDRS_NS                  { RF_SYSCON_BASE_NS }\r\n  /** Array initializer of RF_SYSCON peripheral base pointers */\r\n  #define RF_SYSCON_BASE_PTRS_NS                   { RF_SYSCON_NS }\r\n#else\r\n  /** Peripheral RF_SYSCON base address */\r\n  #define RF_SYSCON_BASE                           (0x4003B000u)\r\n  /** Peripheral RF_SYSCON base pointer */\r\n  #define RF_SYSCON                                ((RF_SYSCON_Type *)RF_SYSCON_BASE)\r\n  /** Array initializer of RF_SYSCON peripheral base addresses */\r\n  #define RF_SYSCON_BASE_ADDRS                     { RF_SYSCON_BASE }\r\n  /** Array initializer of RF_SYSCON peripheral base pointers */\r\n  #define RF_SYSCON_BASE_PTRS                      { RF_SYSCON }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group RF_SYSCON_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- ROMCP Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup ROMCP_Peripheral_Access_Layer ROMCP Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** ROMCP - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[212];\r\n  __IO uint32_t ROMPATCHD[8];                      /**< ROMC Data Registers, array offset: 0xD4, array step: 0x4 */\r\n  __IO uint32_t ROMPATCHCNTL;                      /**< ROMC Control Register, offset: 0xF4 */\r\n       uint32_t ROMPATCHENH;                       /**< ROMC Enable Register High, offset: 0xF8 */\r\n  __IO uint32_t ROMPATCHENL;                       /**< ROMC Enable Register Low, offset: 0xFC */\r\n  __IO uint32_t ROMPATCHA[16];                     /**< ROMC Address Registers, array offset: 0x100, array step: 0x4 */\r\n       uint8_t RESERVED_1[200];\r\n  __IO uint32_t ROMPATCHSR;                        /**< ROMC Status Register, offset: 0x208 */\r\n} ROMCP_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- ROMCP Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup ROMCP_Register_Masks ROMCP Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name ROMPATCHD - ROMC Data Registers */\r\n/*! @{ */\r\n\r\n#define ROMCP_ROMPATCHD_DATAX_MASK               (0xFFFFFFFFU)\r\n#define ROMCP_ROMPATCHD_DATAX_SHIFT              (0U)\r\n/*! DATAX - Data Fix Registers */\r\n#define ROMCP_ROMPATCHD_DATAX(x)                 (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHD_DATAX_SHIFT)) & ROMCP_ROMPATCHD_DATAX_MASK)\r\n/*! @} */\r\n\r\n/* The count of ROMCP_ROMPATCHD */\r\n#define ROMCP_ROMPATCHD_COUNT                    (8U)\r\n\r\n/*! @name ROMPATCHCNTL - ROMC Control Register */\r\n/*! @{ */\r\n\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX0_MASK         (0x1U)\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX0_SHIFT        (0U)\r\n/*! DATAFIX0 - Data Fix Enable\r\n *  0b0..Trigger an opcode patch\r\n *  0b1..Trigger a data fix\r\n */\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX0(x)           (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHCNTL_DATAFIX0_SHIFT)) & ROMCP_ROMPATCHCNTL_DATAFIX0_MASK)\r\n\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX1_MASK         (0x2U)\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX1_SHIFT        (1U)\r\n/*! DATAFIX1 - Data Fix Enable\r\n *  0b0..Trigger an opcode patch\r\n *  0b1..Trigger a data fix\r\n */\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX1(x)           (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHCNTL_DATAFIX1_SHIFT)) & ROMCP_ROMPATCHCNTL_DATAFIX1_MASK)\r\n\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX2_MASK         (0x4U)\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX2_SHIFT        (2U)\r\n/*! DATAFIX2 - Data Fix Enable\r\n *  0b0..Trigger an opcode patch\r\n *  0b1..Trigger a data fix\r\n */\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX2(x)           (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHCNTL_DATAFIX2_SHIFT)) & ROMCP_ROMPATCHCNTL_DATAFIX2_MASK)\r\n\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX3_MASK         (0x8U)\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX3_SHIFT        (3U)\r\n/*! DATAFIX3 - Data Fix Enable\r\n *  0b0..Trigger an opcode patch\r\n *  0b1..Trigger a data fix\r\n */\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX3(x)           (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHCNTL_DATAFIX3_SHIFT)) & ROMCP_ROMPATCHCNTL_DATAFIX3_MASK)\r\n\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX4_MASK         (0x10U)\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX4_SHIFT        (4U)\r\n/*! DATAFIX4 - Data Fix Enable\r\n *  0b0..Trigger an opcode patch\r\n *  0b1..Trigger a data fix\r\n */\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX4(x)           (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHCNTL_DATAFIX4_SHIFT)) & ROMCP_ROMPATCHCNTL_DATAFIX4_MASK)\r\n\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX5_MASK         (0x20U)\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX5_SHIFT        (5U)\r\n/*! DATAFIX5 - Data Fix Enable\r\n *  0b0..Trigger an opcode patch\r\n *  0b1..Trigger a data fix\r\n */\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX5(x)           (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHCNTL_DATAFIX5_SHIFT)) & ROMCP_ROMPATCHCNTL_DATAFIX5_MASK)\r\n\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX6_MASK         (0x40U)\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX6_SHIFT        (6U)\r\n/*! DATAFIX6 - Data Fix Enable\r\n *  0b0..Trigger an opcode patch\r\n *  0b1..Trigger a data fix\r\n */\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX6(x)           (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHCNTL_DATAFIX6_SHIFT)) & ROMCP_ROMPATCHCNTL_DATAFIX6_MASK)\r\n\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX7_MASK         (0x80U)\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX7_SHIFT        (7U)\r\n/*! DATAFIX7 - Data Fix Enable\r\n *  0b0..Trigger an opcode patch\r\n *  0b1..Trigger a data fix\r\n */\r\n#define ROMCP_ROMPATCHCNTL_DATAFIX7(x)           (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHCNTL_DATAFIX7_SHIFT)) & ROMCP_ROMPATCHCNTL_DATAFIX7_MASK)\r\n\r\n#define ROMCP_ROMPATCHCNTL_DIS_MASK              (0x20000000U)\r\n#define ROMCP_ROMPATCHCNTL_DIS_SHIFT             (29U)\r\n/*! DIS - ROMC Disable\r\n *  0b0..Does not affect any ROMC functions (default)\r\n *  0b1..Disables all ROMC functions: data fixing and opcode patching\r\n */\r\n#define ROMCP_ROMPATCHCNTL_DIS(x)                (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHCNTL_DIS_SHIFT)) & ROMCP_ROMPATCHCNTL_DIS_MASK)\r\n\r\n#define ROMCP_ROMPATCHCNTL_LK_MASK               (0x80000000U)\r\n#define ROMCP_ROMPATCHCNTL_LK_SHIFT              (31U)\r\n/*! LK - Register Lock\r\n *  0b0..All registers remain accessible (unlocked).\r\n *  0b1..Lock access to all registers. All ROMCP register accesses are treated as read-as-zero, except for this LK\r\n *       bit which reads as set. All writes are ignored.\r\n */\r\n#define ROMCP_ROMPATCHCNTL_LK(x)                 (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHCNTL_LK_SHIFT)) & ROMCP_ROMPATCHCNTL_LK_MASK)\r\n/*! @} */\r\n\r\n/*! @name ROMPATCHENL - ROMC Enable Register Low */\r\n/*! @{ */\r\n\r\n#define ROMCP_ROMPATCHENL_ENABLE0_MASK           (0x1U)\r\n#define ROMCP_ROMPATCHENL_ENABLE0_SHIFT          (0U)\r\n/*! ENABLE0 - Enable Address Comparator n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define ROMCP_ROMPATCHENL_ENABLE0(x)             (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHENL_ENABLE0_SHIFT)) & ROMCP_ROMPATCHENL_ENABLE0_MASK)\r\n\r\n#define ROMCP_ROMPATCHENL_ENABLE1_MASK           (0x2U)\r\n#define ROMCP_ROMPATCHENL_ENABLE1_SHIFT          (1U)\r\n/*! ENABLE1 - Enable Address Comparator n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define ROMCP_ROMPATCHENL_ENABLE1(x)             (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHENL_ENABLE1_SHIFT)) & ROMCP_ROMPATCHENL_ENABLE1_MASK)\r\n\r\n#define ROMCP_ROMPATCHENL_ENABLE2_MASK           (0x4U)\r\n#define ROMCP_ROMPATCHENL_ENABLE2_SHIFT          (2U)\r\n/*! ENABLE2 - Enable Address Comparator n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define ROMCP_ROMPATCHENL_ENABLE2(x)             (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHENL_ENABLE2_SHIFT)) & ROMCP_ROMPATCHENL_ENABLE2_MASK)\r\n\r\n#define ROMCP_ROMPATCHENL_ENABLE3_MASK           (0x8U)\r\n#define ROMCP_ROMPATCHENL_ENABLE3_SHIFT          (3U)\r\n/*! ENABLE3 - Enable Address Comparator n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define ROMCP_ROMPATCHENL_ENABLE3(x)             (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHENL_ENABLE3_SHIFT)) & ROMCP_ROMPATCHENL_ENABLE3_MASK)\r\n\r\n#define ROMCP_ROMPATCHENL_ENABLE4_MASK           (0x10U)\r\n#define ROMCP_ROMPATCHENL_ENABLE4_SHIFT          (4U)\r\n/*! ENABLE4 - Enable Address Comparator n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define ROMCP_ROMPATCHENL_ENABLE4(x)             (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHENL_ENABLE4_SHIFT)) & ROMCP_ROMPATCHENL_ENABLE4_MASK)\r\n\r\n#define ROMCP_ROMPATCHENL_ENABLE5_MASK           (0x20U)\r\n#define ROMCP_ROMPATCHENL_ENABLE5_SHIFT          (5U)\r\n/*! ENABLE5 - Enable Address Comparator n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define ROMCP_ROMPATCHENL_ENABLE5(x)             (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHENL_ENABLE5_SHIFT)) & ROMCP_ROMPATCHENL_ENABLE5_MASK)\r\n\r\n#define ROMCP_ROMPATCHENL_ENABLE6_MASK           (0x40U)\r\n#define ROMCP_ROMPATCHENL_ENABLE6_SHIFT          (6U)\r\n/*! ENABLE6 - Enable Address Comparator n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define ROMCP_ROMPATCHENL_ENABLE6(x)             (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHENL_ENABLE6_SHIFT)) & ROMCP_ROMPATCHENL_ENABLE6_MASK)\r\n\r\n#define ROMCP_ROMPATCHENL_ENABLE7_MASK           (0x80U)\r\n#define ROMCP_ROMPATCHENL_ENABLE7_SHIFT          (7U)\r\n/*! ENABLE7 - Enable Address Comparator n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define ROMCP_ROMPATCHENL_ENABLE7(x)             (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHENL_ENABLE7_SHIFT)) & ROMCP_ROMPATCHENL_ENABLE7_MASK)\r\n\r\n#define ROMCP_ROMPATCHENL_ENABLE8_MASK           (0x100U)\r\n#define ROMCP_ROMPATCHENL_ENABLE8_SHIFT          (8U)\r\n/*! ENABLE8 - Enable Address Comparator n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define ROMCP_ROMPATCHENL_ENABLE8(x)             (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHENL_ENABLE8_SHIFT)) & ROMCP_ROMPATCHENL_ENABLE8_MASK)\r\n\r\n#define ROMCP_ROMPATCHENL_ENABLE9_MASK           (0x200U)\r\n#define ROMCP_ROMPATCHENL_ENABLE9_SHIFT          (9U)\r\n/*! ENABLE9 - Enable Address Comparator n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define ROMCP_ROMPATCHENL_ENABLE9(x)             (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHENL_ENABLE9_SHIFT)) & ROMCP_ROMPATCHENL_ENABLE9_MASK)\r\n\r\n#define ROMCP_ROMPATCHENL_ENABLE10_MASK          (0x400U)\r\n#define ROMCP_ROMPATCHENL_ENABLE10_SHIFT         (10U)\r\n/*! ENABLE10 - Enable Address Comparator n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define ROMCP_ROMPATCHENL_ENABLE10(x)            (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHENL_ENABLE10_SHIFT)) & ROMCP_ROMPATCHENL_ENABLE10_MASK)\r\n\r\n#define ROMCP_ROMPATCHENL_ENABLE11_MASK          (0x800U)\r\n#define ROMCP_ROMPATCHENL_ENABLE11_SHIFT         (11U)\r\n/*! ENABLE11 - Enable Address Comparator n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define ROMCP_ROMPATCHENL_ENABLE11(x)            (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHENL_ENABLE11_SHIFT)) & ROMCP_ROMPATCHENL_ENABLE11_MASK)\r\n\r\n#define ROMCP_ROMPATCHENL_ENABLE12_MASK          (0x1000U)\r\n#define ROMCP_ROMPATCHENL_ENABLE12_SHIFT         (12U)\r\n/*! ENABLE12 - Enable Address Comparator n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define ROMCP_ROMPATCHENL_ENABLE12(x)            (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHENL_ENABLE12_SHIFT)) & ROMCP_ROMPATCHENL_ENABLE12_MASK)\r\n\r\n#define ROMCP_ROMPATCHENL_ENABLE13_MASK          (0x2000U)\r\n#define ROMCP_ROMPATCHENL_ENABLE13_SHIFT         (13U)\r\n/*! ENABLE13 - Enable Address Comparator n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define ROMCP_ROMPATCHENL_ENABLE13(x)            (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHENL_ENABLE13_SHIFT)) & ROMCP_ROMPATCHENL_ENABLE13_MASK)\r\n\r\n#define ROMCP_ROMPATCHENL_ENABLE14_MASK          (0x4000U)\r\n#define ROMCP_ROMPATCHENL_ENABLE14_SHIFT         (14U)\r\n/*! ENABLE14 - Enable Address Comparator n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define ROMCP_ROMPATCHENL_ENABLE14(x)            (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHENL_ENABLE14_SHIFT)) & ROMCP_ROMPATCHENL_ENABLE14_MASK)\r\n\r\n#define ROMCP_ROMPATCHENL_ENABLE15_MASK          (0x8000U)\r\n#define ROMCP_ROMPATCHENL_ENABLE15_SHIFT         (15U)\r\n/*! ENABLE15 - Enable Address Comparator n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define ROMCP_ROMPATCHENL_ENABLE15(x)            (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHENL_ENABLE15_SHIFT)) & ROMCP_ROMPATCHENL_ENABLE15_MASK)\r\n/*! @} */\r\n\r\n/*! @name ROMPATCHA - ROMC Address Registers */\r\n/*! @{ */\r\n\r\n#define ROMCP_ROMPATCHA_THUMBX_MASK              (0x1U)\r\n#define ROMCP_ROMPATCHA_THUMBX_SHIFT             (0U)\r\n/*! THUMBX - THUMB Comparator Select\r\n *  0b0..ARM patch\r\n *  0b1..THUMB patch (ignore if a data fix)\r\n */\r\n#define ROMCP_ROMPATCHA_THUMBX(x)                (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHA_THUMBX_SHIFT)) & ROMCP_ROMPATCHA_THUMBX_MASK)\r\n\r\n#define ROMCP_ROMPATCHA_ADDRX_MASK               (0x7FFFFEU)\r\n#define ROMCP_ROMPATCHA_ADDRX_SHIFT              (1U)\r\n/*! ADDRX - Address Comparator Registers */\r\n#define ROMCP_ROMPATCHA_ADDRX(x)                 (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHA_ADDRX_SHIFT)) & ROMCP_ROMPATCHA_ADDRX_MASK)\r\n/*! @} */\r\n\r\n/* The count of ROMCP_ROMPATCHA */\r\n#define ROMCP_ROMPATCHA_COUNT                    (16U)\r\n\r\n/*! @name ROMPATCHSR - ROMC Status Register */\r\n/*! @{ */\r\n\r\n#define ROMCP_ROMPATCHSR_SOURCE_MASK             (0x3FU)\r\n#define ROMCP_ROMPATCHSR_SOURCE_SHIFT            (0U)\r\n/*! SOURCE - ROMC Source Number\r\n *  0b000000..Address Comparator 0 matched\r\n *  0b000001..Address Comparator 1 matched\r\n *  0b001111..Address Comparator 15 matched\r\n */\r\n#define ROMCP_ROMPATCHSR_SOURCE(x)               (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHSR_SOURCE_SHIFT)) & ROMCP_ROMPATCHSR_SOURCE_MASK)\r\n\r\n#define ROMCP_ROMPATCHSR_SW_MASK                 (0x20000U)\r\n#define ROMCP_ROMPATCHSR_SW_SHIFT                (17U)\r\n/*! SW - ROMC AHB Multiple Address Comparator Match Indicator\r\n *  0b0..No event or comparator collisions have occurred\r\n *  0b1..A collision has occurred\r\n */\r\n#define ROMCP_ROMPATCHSR_SW(x)                   (((uint32_t)(((uint32_t)(x)) << ROMCP_ROMPATCHSR_SW_SHIFT)) & ROMCP_ROMPATCHSR_SW_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group ROMCP_Register_Masks */\r\n\r\n\r\n/* ROMCP - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral ROMCP base address */\r\n  #define ROMCP_BASE                               (0x5013C000u)\r\n  /** Peripheral ROMCP base address */\r\n  #define ROMCP_BASE_NS                            (0x4013C000u)\r\n  /** Peripheral ROMCP base pointer */\r\n  #define ROMCP                                    ((ROMCP_Type *)ROMCP_BASE)\r\n  /** Peripheral ROMCP base pointer */\r\n  #define ROMCP_NS                                 ((ROMCP_Type *)ROMCP_BASE_NS)\r\n  /** Array initializer of ROMCP peripheral base addresses */\r\n  #define ROMCP_BASE_ADDRS                         { ROMCP_BASE }\r\n  /** Array initializer of ROMCP peripheral base pointers */\r\n  #define ROMCP_BASE_PTRS                          { ROMCP }\r\n  /** Array initializer of ROMCP peripheral base addresses */\r\n  #define ROMCP_BASE_ADDRS_NS                      { ROMCP_BASE_NS }\r\n  /** Array initializer of ROMCP peripheral base pointers */\r\n  #define ROMCP_BASE_PTRS_NS                       { ROMCP_NS }\r\n#else\r\n  /** Peripheral ROMCP base address */\r\n  #define ROMCP_BASE                               (0x4013C000u)\r\n  /** Peripheral ROMCP base pointer */\r\n  #define ROMCP                                    ((ROMCP_Type *)ROMCP_BASE)\r\n  /** Array initializer of ROMCP peripheral base addresses */\r\n  #define ROMCP_BASE_ADDRS                         { ROMCP_BASE }\r\n  /** Array initializer of ROMCP peripheral base pointers */\r\n  #define ROMCP_BASE_PTRS                          { ROMCP }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group ROMCP_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- RSTCTL0 Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup RSTCTL0_Peripheral_Access_Layer RSTCTL0 Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** RSTCTL0 - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[16];\r\n  __IO uint32_t PRSTCTL0;                          /**< Peripheral reset control 0, offset: 0x10 */\r\n  __IO uint32_t PRSTCTL1;                          /**< Peripheral reset control 1, offset: 0x14 */\r\n  __IO uint32_t PRSTCTL2;                          /**< Peripheral reset control 2, offset: 0x18 */\r\n       uint8_t RESERVED_1[36];\r\n  __IO uint32_t PRSTCTL0_SET;                      /**< Peripheral reset set 0, offset: 0x40 */\r\n  __O  uint32_t PRSTCTL1_SET;                      /**< Peripheral reset set 1, offset: 0x44 */\r\n  __O  uint32_t PRSTCTL2_SET;                      /**< Peripheral reset set 2, offset: 0x48 */\r\n       uint8_t RESERVED_2[36];\r\n  __O  uint32_t PRSTCTL0_CLR;                      /**< Peripheral reset clear 0, offset: 0x70 */\r\n  __O  uint32_t PRSTCTL1_CLR;                      /**< Peripheral reset clear 1, offset: 0x74 */\r\n  __O  uint32_t PRSTCTL2_CLR;                      /**< Peripheral reset clear 2, offset: 0x78 */\r\n} RSTCTL0_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- RSTCTL0 Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup RSTCTL0_Register_Masks RSTCTL0 Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name PRSTCTL0 - Peripheral reset control 0 */\r\n/*! @{ */\r\n\r\n#define RSTCTL0_PRSTCTL0_PQ_MASK                 (0x100U)\r\n#define RSTCTL0_PRSTCTL0_PQ_SHIFT                (8U)\r\n/*! PQ - pq reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL0_PQ(x)                   (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_PQ_SHIFT)) & RSTCTL0_PRSTCTL0_PQ_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_PKC_MASK                (0x200U)\r\n#define RSTCTL0_PRSTCTL0_PKC_SHIFT               (9U)\r\n/*! PKC - pkc reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL0_PKC(x)                  (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_PKC_SHIFT)) & RSTCTL0_PRSTCTL0_PKC_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_ELS_MASK                (0x400U)\r\n#define RSTCTL0_PRSTCTL0_ELS_SHIFT               (10U)\r\n/*! ELS - els reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL0_ELS(x)                  (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_ELS_SHIFT)) & RSTCTL0_PRSTCTL0_ELS_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_PUF_MASK                (0x800U)\r\n#define RSTCTL0_PRSTCTL0_PUF_SHIFT               (11U)\r\n/*! PUF - puf reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL0_PUF(x)                  (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_PUF_SHIFT)) & RSTCTL0_PRSTCTL0_PUF_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_FLEXSPI0_MASK           (0x10000U)\r\n#define RSTCTL0_PRSTCTL0_FLEXSPI0_SHIFT          (16U)\r\n/*! FLEXSPI0 - flexspi0 reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL0_FLEXSPI0(x)             (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_FLEXSPI0_SHIFT)) & RSTCTL0_PRSTCTL0_FLEXSPI0_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_HPU_MASK                (0x100000U)\r\n#define RSTCTL0_PRSTCTL0_HPU_SHIFT               (20U)\r\n/*! HPU - hpu reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL0_HPU(x)                  (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_HPU_SHIFT)) & RSTCTL0_PRSTCTL0_HPU_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_USB_MASK                (0x400000U)\r\n#define RSTCTL0_PRSTCTL0_USB_SHIFT               (22U)\r\n/*! USB - usb reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL0_USB(x)                  (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_USB_SHIFT)) & RSTCTL0_PRSTCTL0_USB_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_SCT_MASK                (0x1000000U)\r\n#define RSTCTL0_PRSTCTL0_SCT_SHIFT               (24U)\r\n/*! SCT - sct reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL0_SCT(x)                  (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_SCT_SHIFT)) & RSTCTL0_PRSTCTL0_SCT_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_AON_MEM_MASK            (0x2000000U)\r\n#define RSTCTL0_PRSTCTL0_AON_MEM_SHIFT           (25U)\r\n/*! AON_MEM - aon_mem reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL0_AON_MEM(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_AON_MEM_SHIFT)) & RSTCTL0_PRSTCTL0_AON_MEM_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_GDMA_MASK               (0x10000000U)\r\n#define RSTCTL0_PRSTCTL0_GDMA_SHIFT              (28U)\r\n/*! GDMA - gdma reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL0_GDMA(x)                 (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_GDMA_SHIFT)) & RSTCTL0_PRSTCTL0_GDMA_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_DMA0_MASK               (0x20000000U)\r\n#define RSTCTL0_PRSTCTL0_DMA0_SHIFT              (29U)\r\n/*! DMA0 - dma0 reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL0_DMA0(x)                 (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_DMA0_SHIFT)) & RSTCTL0_PRSTCTL0_DMA0_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_DMA1_MASK               (0x40000000U)\r\n#define RSTCTL0_PRSTCTL0_DMA1_SHIFT              (30U)\r\n/*! DMA1 - dma1 reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL0_DMA1(x)                 (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_DMA1_SHIFT)) & RSTCTL0_PRSTCTL0_DMA1_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_SDIO_MASK               (0x80000000U)\r\n#define RSTCTL0_PRSTCTL0_SDIO_SHIFT              (31U)\r\n/*! SDIO - sdio reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL0_SDIO(x)                 (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_SDIO_SHIFT)) & RSTCTL0_PRSTCTL0_SDIO_MASK)\r\n/*! @} */\r\n\r\n/*! @name PRSTCTL1 - Peripheral reset control 1 */\r\n/*! @{ */\r\n\r\n#define RSTCTL0_PRSTCTL1_ELS_APB_MASK            (0x1U)\r\n#define RSTCTL0_PRSTCTL1_ELS_APB_SHIFT           (0U)\r\n/*! ELS_APB - els_apb reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL1_ELS_APB(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_ELS_APB_SHIFT)) & RSTCTL0_PRSTCTL1_ELS_APB_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_ELS_GDET_REF_RST_N_MASK (0x2U)\r\n#define RSTCTL0_PRSTCTL1_ELS_GDET_REF_RST_N_SHIFT (1U)\r\n/*! ELS_GDET_REF_RST_N - els_gdet_ref_rst_n control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL1_ELS_GDET_REF_RST_N(x)   (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_ELS_GDET_REF_RST_N_SHIFT)) & RSTCTL0_PRSTCTL1_ELS_GDET_REF_RST_N_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_SDIO_SLV_MASK           (0x4U)\r\n#define RSTCTL0_PRSTCTL1_SDIO_SLV_SHIFT          (2U)\r\n/*! SDIO_SLV - sdio_slv reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL1_SDIO_SLV(x)             (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_SDIO_SLV_SHIFT)) & RSTCTL0_PRSTCTL1_SDIO_SLV_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_GAU_MASK                (0x10000U)\r\n#define RSTCTL0_PRSTCTL1_GAU_SHIFT               (16U)\r\n/*! GAU - gau reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL1_GAU(x)                  (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_GAU_SHIFT)) & RSTCTL0_PRSTCTL1_GAU_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_OTP_MASK                (0x20000U)\r\n#define RSTCTL0_PRSTCTL1_OTP_SHIFT               (17U)\r\n/*! OTP - otp reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL1_OTP(x)                  (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_OTP_SHIFT)) & RSTCTL0_PRSTCTL1_OTP_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_SECURE_GPIO_MASK        (0x1000000U)\r\n#define RSTCTL0_PRSTCTL1_SECURE_GPIO_SHIFT       (24U)\r\n/*! SECURE_GPIO - secure_gpio reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL1_SECURE_GPIO(x)          (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_SECURE_GPIO_SHIFT)) & RSTCTL0_PRSTCTL1_SECURE_GPIO_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_ENET_IPG_MASK           (0x2000000U)\r\n#define RSTCTL0_PRSTCTL1_ENET_IPG_SHIFT          (25U)\r\n/*! ENET_IPG - enet_ipg reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL1_ENET_IPG(x)             (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_ENET_IPG_SHIFT)) & RSTCTL0_PRSTCTL1_ENET_IPG_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_ENET_IPG_S_MASK         (0x4000000U)\r\n#define RSTCTL0_PRSTCTL1_ENET_IPG_S_SHIFT        (26U)\r\n/*! ENET_IPG_S - enet_ipg_s reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL1_ENET_IPG_S(x)           (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_ENET_IPG_S_SHIFT)) & RSTCTL0_PRSTCTL1_ENET_IPG_S_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_TRNG_MASK               (0x8000000U)\r\n#define RSTCTL0_PRSTCTL1_TRNG_SHIFT              (27U)\r\n/*! TRNG - trng reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL1_TRNG(x)                 (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_TRNG_SHIFT)) & RSTCTL0_PRSTCTL1_TRNG_MASK)\r\n/*! @} */\r\n\r\n/*! @name PRSTCTL2 - Peripheral reset control 2 */\r\n/*! @{ */\r\n\r\n#define RSTCTL0_PRSTCTL2_UTICK_MASK              (0x1U)\r\n#define RSTCTL0_PRSTCTL2_UTICK_SHIFT             (0U)\r\n/*! UTICK - utick reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL2_UTICK(x)                (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL2_UTICK_SHIFT)) & RSTCTL0_PRSTCTL2_UTICK_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL2_WWDT0_MASK              (0x2U)\r\n#define RSTCTL0_PRSTCTL2_WWDT0_SHIFT             (1U)\r\n/*! WWDT0 - wwdt0 reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL2_WWDT0(x)                (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL2_WWDT0_SHIFT)) & RSTCTL0_PRSTCTL2_WWDT0_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL2_USIM_MASK               (0x4U)\r\n#define RSTCTL0_PRSTCTL2_USIM_SHIFT              (2U)\r\n/*! USIM - usim reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL2_USIM(x)                 (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL2_USIM_SHIFT)) & RSTCTL0_PRSTCTL2_USIM_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL2_FREEMRT_MASK            (0x4000000U)\r\n#define RSTCTL0_PRSTCTL2_FREEMRT_SHIFT           (26U)\r\n/*! FREEMRT - freemrt reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL2_FREEMRT(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL2_FREEMRT_SHIFT)) & RSTCTL0_PRSTCTL2_FREEMRT_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL2_LCDIC_MASK              (0x8000000U)\r\n#define RSTCTL0_PRSTCTL2_LCDIC_SHIFT             (27U)\r\n/*! LCDIC - lcdic reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL0_PRSTCTL2_LCDIC(x)                (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL2_LCDIC_SHIFT)) & RSTCTL0_PRSTCTL2_LCDIC_MASK)\r\n/*! @} */\r\n\r\n/*! @name PRSTCTL0_SET - Peripheral reset set 0 */\r\n/*! @{ */\r\n\r\n#define RSTCTL0_PRSTCTL0_SET_PQ_MASK             (0x100U)\r\n#define RSTCTL0_PRSTCTL0_SET_PQ_SHIFT            (8U)\r\n/*! PQ - pq reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_SET_PQ(x)               (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_SET_PQ_SHIFT)) & RSTCTL0_PRSTCTL0_SET_PQ_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_SET_PKC_MASK            (0x200U)\r\n#define RSTCTL0_PRSTCTL0_SET_PKC_SHIFT           (9U)\r\n/*! PKC - pkc reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_SET_PKC(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_SET_PKC_SHIFT)) & RSTCTL0_PRSTCTL0_SET_PKC_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_SET_ELS_MASK            (0x400U)\r\n#define RSTCTL0_PRSTCTL0_SET_ELS_SHIFT           (10U)\r\n/*! ELS - els reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_SET_ELS(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_SET_ELS_SHIFT)) & RSTCTL0_PRSTCTL0_SET_ELS_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_SET_PUF_MASK            (0x800U)\r\n#define RSTCTL0_PRSTCTL0_SET_PUF_SHIFT           (11U)\r\n/*! PUF - puf reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_SET_PUF(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_SET_PUF_SHIFT)) & RSTCTL0_PRSTCTL0_SET_PUF_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_SET_FLEXSPI0_MASK       (0x10000U)\r\n#define RSTCTL0_PRSTCTL0_SET_FLEXSPI0_SHIFT      (16U)\r\n/*! FLEXSPI0 - flexspi0 reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_SET_FLEXSPI0(x)         (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_SET_FLEXSPI0_SHIFT)) & RSTCTL0_PRSTCTL0_SET_FLEXSPI0_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_SET_HPU_MASK            (0x100000U)\r\n#define RSTCTL0_PRSTCTL0_SET_HPU_SHIFT           (20U)\r\n/*! HPU - hpu reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_SET_HPU(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_SET_HPU_SHIFT)) & RSTCTL0_PRSTCTL0_SET_HPU_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_SET_USB_MASK            (0x400000U)\r\n#define RSTCTL0_PRSTCTL0_SET_USB_SHIFT           (22U)\r\n/*! USB - usb reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_SET_USB(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_SET_USB_SHIFT)) & RSTCTL0_PRSTCTL0_SET_USB_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_SET_SCT_MASK            (0x1000000U)\r\n#define RSTCTL0_PRSTCTL0_SET_SCT_SHIFT           (24U)\r\n/*! SCT - sct reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_SET_SCT(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_SET_SCT_SHIFT)) & RSTCTL0_PRSTCTL0_SET_SCT_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_SET_AON_MEM_MASK        (0x2000000U)\r\n#define RSTCTL0_PRSTCTL0_SET_AON_MEM_SHIFT       (25U)\r\n/*! AON_MEM - aon_mem reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_SET_AON_MEM(x)          (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_SET_AON_MEM_SHIFT)) & RSTCTL0_PRSTCTL0_SET_AON_MEM_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_SET_GDMA_MASK           (0x10000000U)\r\n#define RSTCTL0_PRSTCTL0_SET_GDMA_SHIFT          (28U)\r\n/*! GDMA - gdma reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_SET_GDMA(x)             (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_SET_GDMA_SHIFT)) & RSTCTL0_PRSTCTL0_SET_GDMA_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_SET_DMA0_MASK           (0x20000000U)\r\n#define RSTCTL0_PRSTCTL0_SET_DMA0_SHIFT          (29U)\r\n/*! DMA0 - dma0 reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_SET_DMA0(x)             (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_SET_DMA0_SHIFT)) & RSTCTL0_PRSTCTL0_SET_DMA0_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_SET_DMA1_MASK           (0x40000000U)\r\n#define RSTCTL0_PRSTCTL0_SET_DMA1_SHIFT          (30U)\r\n/*! DMA1 - dma1 reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_SET_DMA1(x)             (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_SET_DMA1_SHIFT)) & RSTCTL0_PRSTCTL0_SET_DMA1_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_SET_SDIO_MASK           (0x80000000U)\r\n#define RSTCTL0_PRSTCTL0_SET_SDIO_SHIFT          (31U)\r\n/*! SDIO - sdio reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_SET_SDIO(x)             (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_SET_SDIO_SHIFT)) & RSTCTL0_PRSTCTL0_SET_SDIO_MASK)\r\n/*! @} */\r\n\r\n/*! @name PRSTCTL1_SET - Peripheral reset set 1 */\r\n/*! @{ */\r\n\r\n#define RSTCTL0_PRSTCTL1_SET_ELS_APB_MASK        (0x1U)\r\n#define RSTCTL0_PRSTCTL1_SET_ELS_APB_SHIFT       (0U)\r\n/*! ELS_APB - els_apb reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL1_SET_ELS_APB(x)          (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_SET_ELS_APB_SHIFT)) & RSTCTL0_PRSTCTL1_SET_ELS_APB_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_SET_ELS_GDET_REF_RST_N_MASK (0x2U)\r\n#define RSTCTL0_PRSTCTL1_SET_ELS_GDET_REF_RST_N_SHIFT (1U)\r\n/*! ELS_GDET_REF_RST_N - els_gdet_ref_rst_n reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL1_SET_ELS_GDET_REF_RST_N(x) (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_SET_ELS_GDET_REF_RST_N_SHIFT)) & RSTCTL0_PRSTCTL1_SET_ELS_GDET_REF_RST_N_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_SET_SDIO_SLV_MASK       (0x4U)\r\n#define RSTCTL0_PRSTCTL1_SET_SDIO_SLV_SHIFT      (2U)\r\n/*! SDIO_SLV - sdio_slv reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL1_SET_SDIO_SLV(x)         (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_SET_SDIO_SLV_SHIFT)) & RSTCTL0_PRSTCTL1_SET_SDIO_SLV_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_SET_GAU_MASK            (0x10000U)\r\n#define RSTCTL0_PRSTCTL1_SET_GAU_SHIFT           (16U)\r\n/*! GAU - gau reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL1_SET_GAU(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_SET_GAU_SHIFT)) & RSTCTL0_PRSTCTL1_SET_GAU_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_SET_OTP_MASK            (0x20000U)\r\n#define RSTCTL0_PRSTCTL1_SET_OTP_SHIFT           (17U)\r\n/*! OTP - otp reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL1_SET_OTP(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_SET_OTP_SHIFT)) & RSTCTL0_PRSTCTL1_SET_OTP_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_SET_SECURE_GPIO_MASK    (0x1000000U)\r\n#define RSTCTL0_PRSTCTL1_SET_SECURE_GPIO_SHIFT   (24U)\r\n/*! SECURE_GPIO - secure_gpio reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL1_SET_SECURE_GPIO(x)      (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_SET_SECURE_GPIO_SHIFT)) & RSTCTL0_PRSTCTL1_SET_SECURE_GPIO_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_SET_ENET_IPG_MASK       (0x2000000U)\r\n#define RSTCTL0_PRSTCTL1_SET_ENET_IPG_SHIFT      (25U)\r\n/*! ENET_IPG - enet_ipg reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL1_SET_ENET_IPG(x)         (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_SET_ENET_IPG_SHIFT)) & RSTCTL0_PRSTCTL1_SET_ENET_IPG_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_SET_ENET_IPG_S_MASK     (0x4000000U)\r\n#define RSTCTL0_PRSTCTL1_SET_ENET_IPG_S_SHIFT    (26U)\r\n/*! ENET_IPG_S - enet_ipg_s reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL1_SET_ENET_IPG_S(x)       (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_SET_ENET_IPG_S_SHIFT)) & RSTCTL0_PRSTCTL1_SET_ENET_IPG_S_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_SET_TRNG_MASK           (0x8000000U)\r\n#define RSTCTL0_PRSTCTL1_SET_TRNG_SHIFT          (27U)\r\n/*! TRNG - trng reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL1_SET_TRNG(x)             (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_SET_TRNG_SHIFT)) & RSTCTL0_PRSTCTL1_SET_TRNG_MASK)\r\n/*! @} */\r\n\r\n/*! @name PRSTCTL2_SET - Peripheral reset set 2 */\r\n/*! @{ */\r\n\r\n#define RSTCTL0_PRSTCTL2_SET_UTICK_MASK          (0x1U)\r\n#define RSTCTL0_PRSTCTL2_SET_UTICK_SHIFT         (0U)\r\n/*! UTICK - utick reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL2_SET_UTICK(x)            (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL2_SET_UTICK_SHIFT)) & RSTCTL0_PRSTCTL2_SET_UTICK_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL2_SET_WWDT0_MASK          (0x2U)\r\n#define RSTCTL0_PRSTCTL2_SET_WWDT0_SHIFT         (1U)\r\n/*! WWDT0 - wwdt0 reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL2_SET_WWDT0(x)            (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL2_SET_WWDT0_SHIFT)) & RSTCTL0_PRSTCTL2_SET_WWDT0_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL2_SET_USIM_MASK           (0x4U)\r\n#define RSTCTL0_PRSTCTL2_SET_USIM_SHIFT          (2U)\r\n/*! USIM - usim reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL2_SET_USIM(x)             (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL2_SET_USIM_SHIFT)) & RSTCTL0_PRSTCTL2_SET_USIM_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL2_SET_FREEMRT_MASK        (0x4000000U)\r\n#define RSTCTL0_PRSTCTL2_SET_FREEMRT_SHIFT       (26U)\r\n/*! FREEMRT - freemrt reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL2_SET_FREEMRT(x)          (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL2_SET_FREEMRT_SHIFT)) & RSTCTL0_PRSTCTL2_SET_FREEMRT_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL2_SET_LCDIC_MASK          (0x8000000U)\r\n#define RSTCTL0_PRSTCTL2_SET_LCDIC_SHIFT         (27U)\r\n/*! LCDIC - lcdic reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL2_SET_LCDIC(x)            (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL2_SET_LCDIC_SHIFT)) & RSTCTL0_PRSTCTL2_SET_LCDIC_MASK)\r\n/*! @} */\r\n\r\n/*! @name PRSTCTL0_CLR - Peripheral reset clear 0 */\r\n/*! @{ */\r\n\r\n#define RSTCTL0_PRSTCTL0_CLR_PQ_MASK             (0x100U)\r\n#define RSTCTL0_PRSTCTL0_CLR_PQ_SHIFT            (8U)\r\n/*! PQ - pq reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_CLR_PQ(x)               (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_CLR_PQ_SHIFT)) & RSTCTL0_PRSTCTL0_CLR_PQ_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_CLR_PKC_MASK            (0x200U)\r\n#define RSTCTL0_PRSTCTL0_CLR_PKC_SHIFT           (9U)\r\n/*! PKC - pkc reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_CLR_PKC(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_CLR_PKC_SHIFT)) & RSTCTL0_PRSTCTL0_CLR_PKC_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_CLR_ELS_MASK            (0x400U)\r\n#define RSTCTL0_PRSTCTL0_CLR_ELS_SHIFT           (10U)\r\n/*! ELS - els reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_CLR_ELS(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_CLR_ELS_SHIFT)) & RSTCTL0_PRSTCTL0_CLR_ELS_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_CLR_PUF_MASK            (0x800U)\r\n#define RSTCTL0_PRSTCTL0_CLR_PUF_SHIFT           (11U)\r\n/*! PUF - puf reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_CLR_PUF(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_CLR_PUF_SHIFT)) & RSTCTL0_PRSTCTL0_CLR_PUF_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_CLR_FLEXSPI0_MASK       (0x10000U)\r\n#define RSTCTL0_PRSTCTL0_CLR_FLEXSPI0_SHIFT      (16U)\r\n/*! FLEXSPI0 - flexspi0 reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_CLR_FLEXSPI0(x)         (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_CLR_FLEXSPI0_SHIFT)) & RSTCTL0_PRSTCTL0_CLR_FLEXSPI0_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_CLR_HPU_MASK            (0x100000U)\r\n#define RSTCTL0_PRSTCTL0_CLR_HPU_SHIFT           (20U)\r\n/*! HPU - hpu reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_CLR_HPU(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_CLR_HPU_SHIFT)) & RSTCTL0_PRSTCTL0_CLR_HPU_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_CLR_USB_MASK            (0x400000U)\r\n#define RSTCTL0_PRSTCTL0_CLR_USB_SHIFT           (22U)\r\n/*! USB - usb reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_CLR_USB(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_CLR_USB_SHIFT)) & RSTCTL0_PRSTCTL0_CLR_USB_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_CLR_SCT_MASK            (0x1000000U)\r\n#define RSTCTL0_PRSTCTL0_CLR_SCT_SHIFT           (24U)\r\n/*! SCT - sct reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_CLR_SCT(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_CLR_SCT_SHIFT)) & RSTCTL0_PRSTCTL0_CLR_SCT_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_CLR_AON_MEM_MASK        (0x2000000U)\r\n#define RSTCTL0_PRSTCTL0_CLR_AON_MEM_SHIFT       (25U)\r\n/*! AON_MEM - aon_mem reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_CLR_AON_MEM(x)          (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_CLR_AON_MEM_SHIFT)) & RSTCTL0_PRSTCTL0_CLR_AON_MEM_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_CLR_GDMA_MASK           (0x10000000U)\r\n#define RSTCTL0_PRSTCTL0_CLR_GDMA_SHIFT          (28U)\r\n/*! GDMA - gdma reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_CLR_GDMA(x)             (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_CLR_GDMA_SHIFT)) & RSTCTL0_PRSTCTL0_CLR_GDMA_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_CLR_DMA0_MASK           (0x20000000U)\r\n#define RSTCTL0_PRSTCTL0_CLR_DMA0_SHIFT          (29U)\r\n/*! DMA0 - dma0 reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_CLR_DMA0(x)             (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_CLR_DMA0_SHIFT)) & RSTCTL0_PRSTCTL0_CLR_DMA0_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_CLR_DMA1_MASK           (0x40000000U)\r\n#define RSTCTL0_PRSTCTL0_CLR_DMA1_SHIFT          (30U)\r\n/*! DMA1 - dma1 reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_CLR_DMA1(x)             (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_CLR_DMA1_SHIFT)) & RSTCTL0_PRSTCTL0_CLR_DMA1_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL0_CLR_SDIO_MASK           (0x80000000U)\r\n#define RSTCTL0_PRSTCTL0_CLR_SDIO_SHIFT          (31U)\r\n/*! SDIO - sdio reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL0_CLR_SDIO(x)             (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL0_CLR_SDIO_SHIFT)) & RSTCTL0_PRSTCTL0_CLR_SDIO_MASK)\r\n/*! @} */\r\n\r\n/*! @name PRSTCTL1_CLR - Peripheral reset clear 1 */\r\n/*! @{ */\r\n\r\n#define RSTCTL0_PRSTCTL1_CLR_ELS_APB_MASK        (0x1U)\r\n#define RSTCTL0_PRSTCTL1_CLR_ELS_APB_SHIFT       (0U)\r\n/*! ELS_APB - els_apb reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL1_CLR_ELS_APB(x)          (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_CLR_ELS_APB_SHIFT)) & RSTCTL0_PRSTCTL1_CLR_ELS_APB_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_CLR_ELS_GDET_REF_RST_N_MASK (0x2U)\r\n#define RSTCTL0_PRSTCTL1_CLR_ELS_GDET_REF_RST_N_SHIFT (1U)\r\n/*! ELS_GDET_REF_RST_N - els_gdet_ref_rst_n reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL1_CLR_ELS_GDET_REF_RST_N(x) (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_CLR_ELS_GDET_REF_RST_N_SHIFT)) & RSTCTL0_PRSTCTL1_CLR_ELS_GDET_REF_RST_N_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_CLR_SDIO_SLV_MASK       (0x4U)\r\n#define RSTCTL0_PRSTCTL1_CLR_SDIO_SLV_SHIFT      (2U)\r\n/*! SDIO_SLV - sdio_slv reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL1_CLR_SDIO_SLV(x)         (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_CLR_SDIO_SLV_SHIFT)) & RSTCTL0_PRSTCTL1_CLR_SDIO_SLV_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_CLR_GAU_MASK            (0x10000U)\r\n#define RSTCTL0_PRSTCTL1_CLR_GAU_SHIFT           (16U)\r\n/*! GAU - gau reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL1_CLR_GAU(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_CLR_GAU_SHIFT)) & RSTCTL0_PRSTCTL1_CLR_GAU_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_CLR_OTP_MASK            (0x20000U)\r\n#define RSTCTL0_PRSTCTL1_CLR_OTP_SHIFT           (17U)\r\n/*! OTP - otp reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL1_CLR_OTP(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_CLR_OTP_SHIFT)) & RSTCTL0_PRSTCTL1_CLR_OTP_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_CLR_SECURE_GPIO_MASK    (0x1000000U)\r\n#define RSTCTL0_PRSTCTL1_CLR_SECURE_GPIO_SHIFT   (24U)\r\n/*! SECURE_GPIO - secure_gpio reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL1_CLR_SECURE_GPIO(x)      (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_CLR_SECURE_GPIO_SHIFT)) & RSTCTL0_PRSTCTL1_CLR_SECURE_GPIO_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_CLR_ENET_IPG_MASK       (0x2000000U)\r\n#define RSTCTL0_PRSTCTL1_CLR_ENET_IPG_SHIFT      (25U)\r\n/*! ENET_IPG - enet_ipg reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL1_CLR_ENET_IPG(x)         (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_CLR_ENET_IPG_SHIFT)) & RSTCTL0_PRSTCTL1_CLR_ENET_IPG_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_CLR_ENET_IPG_S_MASK     (0x4000000U)\r\n#define RSTCTL0_PRSTCTL1_CLR_ENET_IPG_S_SHIFT    (26U)\r\n/*! ENET_IPG_S - enet_ipg_s reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL1_CLR_ENET_IPG_S(x)       (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_CLR_ENET_IPG_S_SHIFT)) & RSTCTL0_PRSTCTL1_CLR_ENET_IPG_S_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL1_CLR_TRNG_MASK           (0x8000000U)\r\n#define RSTCTL0_PRSTCTL1_CLR_TRNG_SHIFT          (27U)\r\n/*! TRNG - trng reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL1_CLR_TRNG(x)             (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL1_CLR_TRNG_SHIFT)) & RSTCTL0_PRSTCTL1_CLR_TRNG_MASK)\r\n/*! @} */\r\n\r\n/*! @name PRSTCTL2_CLR - Peripheral reset clear 2 */\r\n/*! @{ */\r\n\r\n#define RSTCTL0_PRSTCTL2_CLR_UTICK_MASK          (0x1U)\r\n#define RSTCTL0_PRSTCTL2_CLR_UTICK_SHIFT         (0U)\r\n/*! UTICK - utick reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL2_CLR_UTICK(x)            (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL2_CLR_UTICK_SHIFT)) & RSTCTL0_PRSTCTL2_CLR_UTICK_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL2_CLR_WWDT0_MASK          (0x2U)\r\n#define RSTCTL0_PRSTCTL2_CLR_WWDT0_SHIFT         (1U)\r\n/*! WWDT0 - wwdt0 reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL2_CLR_WWDT0(x)            (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL2_CLR_WWDT0_SHIFT)) & RSTCTL0_PRSTCTL2_CLR_WWDT0_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL2_CLR_USIM_MASK           (0x4U)\r\n#define RSTCTL0_PRSTCTL2_CLR_USIM_SHIFT          (2U)\r\n/*! USIM - usim reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL2_CLR_USIM(x)             (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL2_CLR_USIM_SHIFT)) & RSTCTL0_PRSTCTL2_CLR_USIM_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL2_CLR_FREEMRT_MASK        (0x4000000U)\r\n#define RSTCTL0_PRSTCTL2_CLR_FREEMRT_SHIFT       (26U)\r\n/*! FREEMRT - freemrt reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL2_CLR_FREEMRT(x)          (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL2_CLR_FREEMRT_SHIFT)) & RSTCTL0_PRSTCTL2_CLR_FREEMRT_MASK)\r\n\r\n#define RSTCTL0_PRSTCTL2_CLR_LCDIC_MASK          (0x8000000U)\r\n#define RSTCTL0_PRSTCTL2_CLR_LCDIC_SHIFT         (27U)\r\n/*! LCDIC - lcdic reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL0_PRSTCTL2_CLR_LCDIC(x)            (((uint32_t)(((uint32_t)(x)) << RSTCTL0_PRSTCTL2_CLR_LCDIC_SHIFT)) & RSTCTL0_PRSTCTL2_CLR_LCDIC_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group RSTCTL0_Register_Masks */\r\n\r\n\r\n/* RSTCTL0 - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral RSTCTL0 base address */\r\n  #define RSTCTL0_BASE                             (0x50000000u)\r\n  /** Peripheral RSTCTL0 base address */\r\n  #define RSTCTL0_BASE_NS                          (0x40000000u)\r\n  /** Peripheral RSTCTL0 base pointer */\r\n  #define RSTCTL0                                  ((RSTCTL0_Type *)RSTCTL0_BASE)\r\n  /** Peripheral RSTCTL0 base pointer */\r\n  #define RSTCTL0_NS                               ((RSTCTL0_Type *)RSTCTL0_BASE_NS)\r\n  /** Array initializer of RSTCTL0 peripheral base addresses */\r\n  #define RSTCTL0_BASE_ADDRS                       { RSTCTL0_BASE }\r\n  /** Array initializer of RSTCTL0 peripheral base pointers */\r\n  #define RSTCTL0_BASE_PTRS                        { RSTCTL0 }\r\n  /** Array initializer of RSTCTL0 peripheral base addresses */\r\n  #define RSTCTL0_BASE_ADDRS_NS                    { RSTCTL0_BASE_NS }\r\n  /** Array initializer of RSTCTL0 peripheral base pointers */\r\n  #define RSTCTL0_BASE_PTRS_NS                     { RSTCTL0_NS }\r\n#else\r\n  /** Peripheral RSTCTL0 base address */\r\n  #define RSTCTL0_BASE                             (0x40000000u)\r\n  /** Peripheral RSTCTL0 base pointer */\r\n  #define RSTCTL0                                  ((RSTCTL0_Type *)RSTCTL0_BASE)\r\n  /** Array initializer of RSTCTL0 peripheral base addresses */\r\n  #define RSTCTL0_BASE_ADDRS                       { RSTCTL0_BASE }\r\n  /** Array initializer of RSTCTL0 peripheral base pointers */\r\n  #define RSTCTL0_BASE_PTRS                        { RSTCTL0 }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group RSTCTL0_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- RSTCTL1 Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup RSTCTL1_Peripheral_Access_Layer RSTCTL1 Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** RSTCTL1 - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[16];\r\n  __IO uint32_t PRSTCTL0;                          /**< Peripheral reset control 0, offset: 0x10 */\r\n  __IO uint32_t PRSTCTL1;                          /**< Peripheral reset control 1, offset: 0x14 */\r\n  __IO uint32_t PRSTCTL2;                          /**< Peripheral reset control 2, offset: 0x18 */\r\n       uint8_t RESERVED_1[36];\r\n  __O  uint32_t PRSTCTL0_SET;                      /**< Peripheral reset set 0, offset: 0x40 */\r\n  __IO uint32_t PRSTCTL1_SET;                      /**< Peripheral reset set 1, offset: 0x44 */\r\n  __O  uint32_t PRSTCTL2_SET;                      /**< Peripheral reset set 2, offset: 0x48 */\r\n       uint8_t RESERVED_2[36];\r\n  __O  uint32_t PRSTCTL0_CLR;                      /**< Peripheral reset clear 0, offset: 0x70 */\r\n  __O  uint32_t PRSTCTL1_CLR;                      /**< Peripheral reset clear 1, offset: 0x74 */\r\n  __O  uint32_t PRSTCTL2_CLR;                      /**< Peripheral reset clear 2, offset: 0x78 */\r\n       uint8_t RESERVED_3[20];\r\n  __IO uint32_t SDIO;                              /**< SDIO sdclk_sw_rst_n control, offset: 0x90 */\r\n} RSTCTL1_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- RSTCTL1 Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup RSTCTL1_Register_Masks RSTCTL1 Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name PRSTCTL0 - Peripheral reset control 0 */\r\n/*! @{ */\r\n\r\n#define RSTCTL1_PRSTCTL0_FC0_MASK                (0x100U)\r\n#define RSTCTL1_PRSTCTL0_FC0_SHIFT               (8U)\r\n/*! FC0 - fc0 reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL1_PRSTCTL0_FC0(x)                  (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_FC0_SHIFT)) & RSTCTL1_PRSTCTL0_FC0_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL0_FC1_MASK                (0x200U)\r\n#define RSTCTL1_PRSTCTL0_FC1_SHIFT               (9U)\r\n/*! FC1 - fc1 reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL1_PRSTCTL0_FC1(x)                  (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_FC1_SHIFT)) & RSTCTL1_PRSTCTL0_FC1_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL0_FC2_MASK                (0x400U)\r\n#define RSTCTL1_PRSTCTL0_FC2_SHIFT               (10U)\r\n/*! FC2 - fc2 reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL1_PRSTCTL0_FC2(x)                  (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_FC2_SHIFT)) & RSTCTL1_PRSTCTL0_FC2_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL0_FC3_MASK                (0x800U)\r\n#define RSTCTL1_PRSTCTL0_FC3_SHIFT               (11U)\r\n/*! FC3 - fc3 reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL1_PRSTCTL0_FC3(x)                  (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_FC3_SHIFT)) & RSTCTL1_PRSTCTL0_FC3_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL0_FC14_MASK               (0x400000U)\r\n#define RSTCTL1_PRSTCTL0_FC14_SHIFT              (22U)\r\n/*! FC14 - fc14 reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL1_PRSTCTL0_FC14(x)                 (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_FC14_SHIFT)) & RSTCTL1_PRSTCTL0_FC14_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL0_DMIC0_MASK              (0x1000000U)\r\n#define RSTCTL1_PRSTCTL0_DMIC0_SHIFT             (24U)\r\n/*! DMIC0 - dmic0 reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL1_PRSTCTL0_DMIC0(x)                (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_DMIC0_SHIFT)) & RSTCTL1_PRSTCTL0_DMIC0_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL0_OSEVENTTIMER_MASK       (0x8000000U)\r\n#define RSTCTL1_PRSTCTL0_OSEVENTTIMER_SHIFT      (27U)\r\n/*! OSEVENTTIMER - oseventtimer reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL1_PRSTCTL0_OSEVENTTIMER(x)         (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_OSEVENTTIMER_SHIFT)) & RSTCTL1_PRSTCTL0_OSEVENTTIMER_MASK)\r\n/*! @} */\r\n\r\n/*! @name PRSTCTL1 - Peripheral reset control 1 */\r\n/*! @{ */\r\n\r\n#define RSTCTL1_PRSTCTL1_HSGPIO0_MASK            (0x1U)\r\n#define RSTCTL1_PRSTCTL1_HSGPIO0_SHIFT           (0U)\r\n/*! HSGPIO0 - hsgpio0 reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL1_PRSTCTL1_HSGPIO0(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL1_HSGPIO0_SHIFT)) & RSTCTL1_PRSTCTL1_HSGPIO0_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL1_HSGPIO1_MASK            (0x2U)\r\n#define RSTCTL1_PRSTCTL1_HSGPIO1_SHIFT           (1U)\r\n/*! HSGPIO1 - hsgpio1 reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL1_PRSTCTL1_HSGPIO1(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL1_HSGPIO1_SHIFT)) & RSTCTL1_PRSTCTL1_HSGPIO1_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL1_CRC_MASK                (0x10000U)\r\n#define RSTCTL1_PRSTCTL1_CRC_SHIFT               (16U)\r\n/*! CRC - crc reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL1_PRSTCTL1_CRC(x)                  (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL1_CRC_SHIFT)) & RSTCTL1_PRSTCTL1_CRC_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL1_FREQME_MASK             (0x80000000U)\r\n#define RSTCTL1_PRSTCTL1_FREQME_SHIFT            (31U)\r\n/*! FREQME - freqme reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL1_PRSTCTL1_FREQME(x)               (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL1_FREQME_SHIFT)) & RSTCTL1_PRSTCTL1_FREQME_MASK)\r\n/*! @} */\r\n\r\n/*! @name PRSTCTL2 - Peripheral reset control 2 */\r\n/*! @{ */\r\n\r\n#define RSTCTL1_PRSTCTL2_CT32B0_MASK             (0x1U)\r\n#define RSTCTL1_PRSTCTL2_CT32B0_SHIFT            (0U)\r\n/*! CT32B0 - ct32b0 reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL1_PRSTCTL2_CT32B0(x)               (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_CT32B0_SHIFT)) & RSTCTL1_PRSTCTL2_CT32B0_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_CT32B1_MASK             (0x2U)\r\n#define RSTCTL1_PRSTCTL2_CT32B1_SHIFT            (1U)\r\n/*! CT32B1 - ct32b1 reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL1_PRSTCTL2_CT32B1(x)               (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_CT32B1_SHIFT)) & RSTCTL1_PRSTCTL2_CT32B1_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_CT32B2_MASK             (0x4U)\r\n#define RSTCTL1_PRSTCTL2_CT32B2_SHIFT            (2U)\r\n/*! CT32B2 - ct32b2 reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL1_PRSTCTL2_CT32B2(x)               (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_CT32B2_SHIFT)) & RSTCTL1_PRSTCTL2_CT32B2_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_CT32B3_MASK             (0x8U)\r\n#define RSTCTL1_PRSTCTL2_CT32B3_SHIFT            (3U)\r\n/*! CT32B3 - ct32b3 reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL1_PRSTCTL2_CT32B3(x)               (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_CT32B3_SHIFT)) & RSTCTL1_PRSTCTL2_CT32B3_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_CT32B4_MASK             (0x10U)\r\n#define RSTCTL1_PRSTCTL2_CT32B4_SHIFT            (4U)\r\n/*! CT32B4 - ct32b4 reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL1_PRSTCTL2_CT32B4(x)               (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_CT32B4_SHIFT)) & RSTCTL1_PRSTCTL2_CT32B4_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_MRT_MASK                (0x100U)\r\n#define RSTCTL1_PRSTCTL2_MRT_SHIFT               (8U)\r\n/*! MRT - mrt reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL1_PRSTCTL2_MRT(x)                  (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_MRT_SHIFT)) & RSTCTL1_PRSTCTL2_MRT_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_GPIO_INT_MASK           (0x40000000U)\r\n#define RSTCTL1_PRSTCTL2_GPIO_INT_SHIFT          (30U)\r\n/*! GPIO_INT - gpio_int reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL1_PRSTCTL2_GPIO_INT(x)             (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_GPIO_INT_SHIFT)) & RSTCTL1_PRSTCTL2_GPIO_INT_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_PMUX_MASK               (0x80000000U)\r\n#define RSTCTL1_PRSTCTL2_PMUX_SHIFT              (31U)\r\n/*! PMUX - pmux reset control\r\n *  0b0..Clear reset\r\n *  0b1..Set reset\r\n */\r\n#define RSTCTL1_PRSTCTL2_PMUX(x)                 (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_PMUX_SHIFT)) & RSTCTL1_PRSTCTL2_PMUX_MASK)\r\n/*! @} */\r\n\r\n/*! @name PRSTCTL0_SET - Peripheral reset set 0 */\r\n/*! @{ */\r\n\r\n#define RSTCTL1_PRSTCTL0_SET_FC0_MASK            (0x100U)\r\n#define RSTCTL1_PRSTCTL0_SET_FC0_SHIFT           (8U)\r\n/*! FC0 - fc0 reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL0_SET_FC0(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_SET_FC0_SHIFT)) & RSTCTL1_PRSTCTL0_SET_FC0_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL0_SET_FC1_MASK            (0x200U)\r\n#define RSTCTL1_PRSTCTL0_SET_FC1_SHIFT           (9U)\r\n/*! FC1 - fc1 reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL0_SET_FC1(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_SET_FC1_SHIFT)) & RSTCTL1_PRSTCTL0_SET_FC1_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL0_SET_FC2_MASK            (0x400U)\r\n#define RSTCTL1_PRSTCTL0_SET_FC2_SHIFT           (10U)\r\n/*! FC2 - fc2 reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL0_SET_FC2(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_SET_FC2_SHIFT)) & RSTCTL1_PRSTCTL0_SET_FC2_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL0_SET_FC3_MASK            (0x800U)\r\n#define RSTCTL1_PRSTCTL0_SET_FC3_SHIFT           (11U)\r\n/*! FC3 - fc3 reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL0_SET_FC3(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_SET_FC3_SHIFT)) & RSTCTL1_PRSTCTL0_SET_FC3_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL0_SET_FC14_MASK           (0x400000U)\r\n#define RSTCTL1_PRSTCTL0_SET_FC14_SHIFT          (22U)\r\n/*! FC14 - fc14 reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL0_SET_FC14(x)             (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_SET_FC14_SHIFT)) & RSTCTL1_PRSTCTL0_SET_FC14_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL0_SET_DMIC0_MASK          (0x1000000U)\r\n#define RSTCTL1_PRSTCTL0_SET_DMIC0_SHIFT         (24U)\r\n/*! DMIC0 - dmic0 reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL0_SET_DMIC0(x)            (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_SET_DMIC0_SHIFT)) & RSTCTL1_PRSTCTL0_SET_DMIC0_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL0_SET_OSEVENTTIMER_MASK   (0x8000000U)\r\n#define RSTCTL1_PRSTCTL0_SET_OSEVENTTIMER_SHIFT  (27U)\r\n/*! OSEVENTTIMER - oseventtimer reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL0_SET_OSEVENTTIMER(x)     (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_SET_OSEVENTTIMER_SHIFT)) & RSTCTL1_PRSTCTL0_SET_OSEVENTTIMER_MASK)\r\n/*! @} */\r\n\r\n/*! @name PRSTCTL1_SET - Peripheral reset set 1 */\r\n/*! @{ */\r\n\r\n#define RSTCTL1_PRSTCTL1_SET_HSGPIO0_MASK        (0x1U)\r\n#define RSTCTL1_PRSTCTL1_SET_HSGPIO0_SHIFT       (0U)\r\n/*! HSGPIO0 - hsgpio0 reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL1_SET_HSGPIO0(x)          (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL1_SET_HSGPIO0_SHIFT)) & RSTCTL1_PRSTCTL1_SET_HSGPIO0_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL1_SET_HSGPIO1_MASK        (0x2U)\r\n#define RSTCTL1_PRSTCTL1_SET_HSGPIO1_SHIFT       (1U)\r\n/*! HSGPIO1 - hsgpio1 reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL1_SET_HSGPIO1(x)          (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL1_SET_HSGPIO1_SHIFT)) & RSTCTL1_PRSTCTL1_SET_HSGPIO1_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL1_SET_CRC_MASK            (0x10000U)\r\n#define RSTCTL1_PRSTCTL1_SET_CRC_SHIFT           (16U)\r\n/*! CRC - crc reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL1_SET_CRC(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL1_SET_CRC_SHIFT)) & RSTCTL1_PRSTCTL1_SET_CRC_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL1_SET_FREQME_MASK         (0x80000000U)\r\n#define RSTCTL1_PRSTCTL1_SET_FREQME_SHIFT        (31U)\r\n/*! FREQME - freqme reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL1_SET_FREQME(x)           (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL1_SET_FREQME_SHIFT)) & RSTCTL1_PRSTCTL1_SET_FREQME_MASK)\r\n/*! @} */\r\n\r\n/*! @name PRSTCTL2_SET - Peripheral reset set 2 */\r\n/*! @{ */\r\n\r\n#define RSTCTL1_PRSTCTL2_SET_CT32B0_MASK         (0x1U)\r\n#define RSTCTL1_PRSTCTL2_SET_CT32B0_SHIFT        (0U)\r\n/*! CT32B0 - ct32b0 reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL2_SET_CT32B0(x)           (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_SET_CT32B0_SHIFT)) & RSTCTL1_PRSTCTL2_SET_CT32B0_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_SET_CT32B1_MASK         (0x2U)\r\n#define RSTCTL1_PRSTCTL2_SET_CT32B1_SHIFT        (1U)\r\n/*! CT32B1 - ct32b1 reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL2_SET_CT32B1(x)           (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_SET_CT32B1_SHIFT)) & RSTCTL1_PRSTCTL2_SET_CT32B1_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_SET_CT32B2_MASK         (0x4U)\r\n#define RSTCTL1_PRSTCTL2_SET_CT32B2_SHIFT        (2U)\r\n/*! CT32B2 - ct32b2 reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL2_SET_CT32B2(x)           (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_SET_CT32B2_SHIFT)) & RSTCTL1_PRSTCTL2_SET_CT32B2_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_SET_CT32B3_MASK         (0x8U)\r\n#define RSTCTL1_PRSTCTL2_SET_CT32B3_SHIFT        (3U)\r\n/*! CT32B3 - ct32b3 reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL2_SET_CT32B3(x)           (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_SET_CT32B3_SHIFT)) & RSTCTL1_PRSTCTL2_SET_CT32B3_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_SET_CT32B4_MASK         (0x10U)\r\n#define RSTCTL1_PRSTCTL2_SET_CT32B4_SHIFT        (4U)\r\n/*! CT32B4 - ct32b4 reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL2_SET_CT32B4(x)           (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_SET_CT32B4_SHIFT)) & RSTCTL1_PRSTCTL2_SET_CT32B4_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_SET_MRT_MASK            (0x100U)\r\n#define RSTCTL1_PRSTCTL2_SET_MRT_SHIFT           (8U)\r\n/*! MRT - mrt reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL2_SET_MRT(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_SET_MRT_SHIFT)) & RSTCTL1_PRSTCTL2_SET_MRT_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_SET_GPIO_INT_MASK       (0x40000000U)\r\n#define RSTCTL1_PRSTCTL2_SET_GPIO_INT_SHIFT      (30U)\r\n/*! GPIO_INT - gpio_int reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL2_SET_GPIO_INT(x)         (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_SET_GPIO_INT_SHIFT)) & RSTCTL1_PRSTCTL2_SET_GPIO_INT_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_SET_PMUX_MASK           (0x80000000U)\r\n#define RSTCTL1_PRSTCTL2_SET_PMUX_SHIFT          (31U)\r\n/*! PMUX - pmux reset set\r\n *  0b0..No effect\r\n *  0b1..Sets the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL2_SET_PMUX(x)             (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_SET_PMUX_SHIFT)) & RSTCTL1_PRSTCTL2_SET_PMUX_MASK)\r\n/*! @} */\r\n\r\n/*! @name PRSTCTL0_CLR - Peripheral reset clear 0 */\r\n/*! @{ */\r\n\r\n#define RSTCTL1_PRSTCTL0_CLR_FC0_MASK            (0x100U)\r\n#define RSTCTL1_PRSTCTL0_CLR_FC0_SHIFT           (8U)\r\n/*! FC0 - fc0 reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL0_CLR_FC0(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_CLR_FC0_SHIFT)) & RSTCTL1_PRSTCTL0_CLR_FC0_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL0_CLR_FC1_MASK            (0x200U)\r\n#define RSTCTL1_PRSTCTL0_CLR_FC1_SHIFT           (9U)\r\n/*! FC1 - fc1 reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL0_CLR_FC1(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_CLR_FC1_SHIFT)) & RSTCTL1_PRSTCTL0_CLR_FC1_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL0_CLR_FC2_MASK            (0x400U)\r\n#define RSTCTL1_PRSTCTL0_CLR_FC2_SHIFT           (10U)\r\n/*! FC2 - fc2 reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL0_CLR_FC2(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_CLR_FC2_SHIFT)) & RSTCTL1_PRSTCTL0_CLR_FC2_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL0_CLR_FC3_MASK            (0x800U)\r\n#define RSTCTL1_PRSTCTL0_CLR_FC3_SHIFT           (11U)\r\n/*! FC3 - fc3 reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL0_CLR_FC3(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_CLR_FC3_SHIFT)) & RSTCTL1_PRSTCTL0_CLR_FC3_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL0_CLR_FC14_MASK           (0x400000U)\r\n#define RSTCTL1_PRSTCTL0_CLR_FC14_SHIFT          (22U)\r\n/*! FC14 - fc14 reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL0_CLR_FC14(x)             (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_CLR_FC14_SHIFT)) & RSTCTL1_PRSTCTL0_CLR_FC14_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL0_CLR_DMIC0_MASK          (0x1000000U)\r\n#define RSTCTL1_PRSTCTL0_CLR_DMIC0_SHIFT         (24U)\r\n/*! DMIC0 - dmic0 reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL0_CLR_DMIC0(x)            (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_CLR_DMIC0_SHIFT)) & RSTCTL1_PRSTCTL0_CLR_DMIC0_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL0_CLR_OSEVENTTIMER_MASK   (0x8000000U)\r\n#define RSTCTL1_PRSTCTL0_CLR_OSEVENTTIMER_SHIFT  (27U)\r\n/*! OSEVENTTIMER - oseventtimer reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL0 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL0_CLR_OSEVENTTIMER(x)     (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL0_CLR_OSEVENTTIMER_SHIFT)) & RSTCTL1_PRSTCTL0_CLR_OSEVENTTIMER_MASK)\r\n/*! @} */\r\n\r\n/*! @name PRSTCTL1_CLR - Peripheral reset clear 1 */\r\n/*! @{ */\r\n\r\n#define RSTCTL1_PRSTCTL1_CLR_HSGPIO0_MASK        (0x1U)\r\n#define RSTCTL1_PRSTCTL1_CLR_HSGPIO0_SHIFT       (0U)\r\n/*! HSGPIO0 - hsgpio0 reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL1_CLR_HSGPIO0(x)          (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL1_CLR_HSGPIO0_SHIFT)) & RSTCTL1_PRSTCTL1_CLR_HSGPIO0_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL1_CLR_HSGPIO1_MASK        (0x2U)\r\n#define RSTCTL1_PRSTCTL1_CLR_HSGPIO1_SHIFT       (1U)\r\n/*! HSGPIO1 - hsgpio1 reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL1_CLR_HSGPIO1(x)          (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL1_CLR_HSGPIO1_SHIFT)) & RSTCTL1_PRSTCTL1_CLR_HSGPIO1_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL1_CLR_CRC_MASK            (0x10000U)\r\n#define RSTCTL1_PRSTCTL1_CLR_CRC_SHIFT           (16U)\r\n/*! CRC - crc reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL1_CLR_CRC(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL1_CLR_CRC_SHIFT)) & RSTCTL1_PRSTCTL1_CLR_CRC_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL1_CLR_FREQME_MASK         (0x80000000U)\r\n#define RSTCTL1_PRSTCTL1_CLR_FREQME_SHIFT        (31U)\r\n/*! FREQME - freqme reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL1 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL1_CLR_FREQME(x)           (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL1_CLR_FREQME_SHIFT)) & RSTCTL1_PRSTCTL1_CLR_FREQME_MASK)\r\n/*! @} */\r\n\r\n/*! @name PRSTCTL2_CLR - Peripheral reset clear 2 */\r\n/*! @{ */\r\n\r\n#define RSTCTL1_PRSTCTL2_CLR_CT32B0_MASK         (0x1U)\r\n#define RSTCTL1_PRSTCTL2_CLR_CT32B0_SHIFT        (0U)\r\n/*! CT32B0 - ct32b0 reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL2_CLR_CT32B0(x)           (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_CLR_CT32B0_SHIFT)) & RSTCTL1_PRSTCTL2_CLR_CT32B0_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_CLR_CT32B1_MASK         (0x2U)\r\n#define RSTCTL1_PRSTCTL2_CLR_CT32B1_SHIFT        (1U)\r\n/*! CT32B1 - ct32b1 reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL2_CLR_CT32B1(x)           (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_CLR_CT32B1_SHIFT)) & RSTCTL1_PRSTCTL2_CLR_CT32B1_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_CLR_CT32B2_MASK         (0x4U)\r\n#define RSTCTL1_PRSTCTL2_CLR_CT32B2_SHIFT        (2U)\r\n/*! CT32B2 - ct32b2 reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL2_CLR_CT32B2(x)           (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_CLR_CT32B2_SHIFT)) & RSTCTL1_PRSTCTL2_CLR_CT32B2_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_CLR_CT32B3_MASK         (0x8U)\r\n#define RSTCTL1_PRSTCTL2_CLR_CT32B3_SHIFT        (3U)\r\n/*! CT32B3 - ct32b3 reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL2_CLR_CT32B3(x)           (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_CLR_CT32B3_SHIFT)) & RSTCTL1_PRSTCTL2_CLR_CT32B3_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_CLR_CT32B4_MASK         (0x10U)\r\n#define RSTCTL1_PRSTCTL2_CLR_CT32B4_SHIFT        (4U)\r\n/*! CT32B4 - ct32b4 reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL2_CLR_CT32B4(x)           (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_CLR_CT32B4_SHIFT)) & RSTCTL1_PRSTCTL2_CLR_CT32B4_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_CLR_MRT_MASK            (0x100U)\r\n#define RSTCTL1_PRSTCTL2_CLR_MRT_SHIFT           (8U)\r\n/*! MRT - mrt reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL2_CLR_MRT(x)              (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_CLR_MRT_SHIFT)) & RSTCTL1_PRSTCTL2_CLR_MRT_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_CLR_GPIO_INT_MASK       (0x40000000U)\r\n#define RSTCTL1_PRSTCTL2_CLR_GPIO_INT_SHIFT      (30U)\r\n/*! GPIO_INT - gpio_int reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL2_CLR_GPIO_INT(x)         (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_CLR_GPIO_INT_SHIFT)) & RSTCTL1_PRSTCTL2_CLR_GPIO_INT_MASK)\r\n\r\n#define RSTCTL1_PRSTCTL2_CLR_PMUX_MASK           (0x80000000U)\r\n#define RSTCTL1_PRSTCTL2_CLR_PMUX_SHIFT          (31U)\r\n/*! PMUX - pmux reset clear\r\n *  0b0..No effect\r\n *  0b1..Clears the PRSTCTL2 Bit\r\n */\r\n#define RSTCTL1_PRSTCTL2_CLR_PMUX(x)             (((uint32_t)(((uint32_t)(x)) << RSTCTL1_PRSTCTL2_CLR_PMUX_SHIFT)) & RSTCTL1_PRSTCTL2_CLR_PMUX_MASK)\r\n/*! @} */\r\n\r\n/*! @name SDIO - SDIO sdclk_sw_rst_n control */\r\n/*! @{ */\r\n\r\n#define RSTCTL1_SDIO_SDCLK_SW_RST_N_MASK         (0x1U)\r\n#define RSTCTL1_SDIO_SDCLK_SW_RST_N_SHIFT        (0U)\r\n/*! SDCLK_SW_RST_N - 0: sw reset 1: reset release */\r\n#define RSTCTL1_SDIO_SDCLK_SW_RST_N(x)           (((uint32_t)(((uint32_t)(x)) << RSTCTL1_SDIO_SDCLK_SW_RST_N_SHIFT)) & RSTCTL1_SDIO_SDCLK_SW_RST_N_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group RSTCTL1_Register_Masks */\r\n\r\n\r\n/* RSTCTL1 - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral RSTCTL1 base address */\r\n  #define RSTCTL1_BASE                             (0x50020000u)\r\n  /** Peripheral RSTCTL1 base address */\r\n  #define RSTCTL1_BASE_NS                          (0x40020000u)\r\n  /** Peripheral RSTCTL1 base pointer */\r\n  #define RSTCTL1                                  ((RSTCTL1_Type *)RSTCTL1_BASE)\r\n  /** Peripheral RSTCTL1 base pointer */\r\n  #define RSTCTL1_NS                               ((RSTCTL1_Type *)RSTCTL1_BASE_NS)\r\n  /** Array initializer of RSTCTL1 peripheral base addresses */\r\n  #define RSTCTL1_BASE_ADDRS                       { RSTCTL1_BASE }\r\n  /** Array initializer of RSTCTL1 peripheral base pointers */\r\n  #define RSTCTL1_BASE_PTRS                        { RSTCTL1 }\r\n  /** Array initializer of RSTCTL1 peripheral base addresses */\r\n  #define RSTCTL1_BASE_ADDRS_NS                    { RSTCTL1_BASE_NS }\r\n  /** Array initializer of RSTCTL1 peripheral base pointers */\r\n  #define RSTCTL1_BASE_PTRS_NS                     { RSTCTL1_NS }\r\n#else\r\n  /** Peripheral RSTCTL1 base address */\r\n  #define RSTCTL1_BASE                             (0x40020000u)\r\n  /** Peripheral RSTCTL1 base pointer */\r\n  #define RSTCTL1                                  ((RSTCTL1_Type *)RSTCTL1_BASE)\r\n  /** Array initializer of RSTCTL1 peripheral base addresses */\r\n  #define RSTCTL1_BASE_ADDRS                       { RSTCTL1_BASE }\r\n  /** Array initializer of RSTCTL1 peripheral base pointers */\r\n  #define RSTCTL1_BASE_PTRS                        { RSTCTL1 }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group RSTCTL1_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- RTC Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup RTC_Peripheral_Access_Layer RTC Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** RTC - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t CTRL;                              /**< RTC control register, offset: 0x0 */\r\n  __IO uint32_t MATCH;                             /**< RTC match register, offset: 0x4 */\r\n  __IO uint32_t COUNT;                             /**< RTC counter register, offset: 0x8 */\r\n  __IO uint32_t WAKE;                              /**< High-resolution/wake-up timer control register, offset: 0xC */\r\n  __I  uint32_t SUBSEC;                            /**< RTC Sub-second Counter register, offset: 0x10 */\r\n       uint8_t RESERVED_0[108];\r\n  __IO uint32_t GPREG[8];                          /**< General Purpose register, array offset: 0x80, array step: 0x4 */\r\n} RTC_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- RTC Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup RTC_Register_Masks RTC Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name CTRL - RTC control register */\r\n/*! @{ */\r\n\r\n#define RTC_CTRL_SWRESET_MASK                    (0x1U)\r\n#define RTC_CTRL_SWRESET_SHIFT                   (0U)\r\n/*! SWRESET - Software reset control\r\n *  0b0..Not in reset. The RTC is not held in reset. This bit must be cleared prior to configuring or initiating any operation of the RTC.\r\n *  0b1..In reset. The RTC is held in reset. All register bits within the RTC will be forced to their reset value\r\n *       except the OFD bit. This bit must be cleared before writing to any register in the RTC - including writes\r\n *       to set any of the other bits within this register. Do not attempt to write to any bits of this register at\r\n *       the same time that the reset bit is being cleared.\r\n */\r\n#define RTC_CTRL_SWRESET(x)                      (((uint32_t)(((uint32_t)(x)) << RTC_CTRL_SWRESET_SHIFT)) & RTC_CTRL_SWRESET_MASK)\r\n\r\n#define RTC_CTRL_OFD_MASK                        (0x2U)\r\n#define RTC_CTRL_OFD_SHIFT                       (1U)\r\n/*! OFD - Oscillator fail detect status.\r\n *  0b0..Run. The RTC oscillator is running properly. Writing a 0 has no effect.\r\n *  0b1..Fail. RTC oscillator fail detected. Clear this flag after the following power-up. Writing a 1 clears this bit.\r\n */\r\n#define RTC_CTRL_OFD(x)                          (((uint32_t)(((uint32_t)(x)) << RTC_CTRL_OFD_SHIFT)) & RTC_CTRL_OFD_MASK)\r\n\r\n#define RTC_CTRL_ALARM1HZ_MASK                   (0x4U)\r\n#define RTC_CTRL_ALARM1HZ_SHIFT                  (2U)\r\n/*! ALARM1HZ - RTC 1 Hz timer alarm flag status.\r\n *  0b0..No match. No match has occurred on the 1 Hz RTC timer. Writing a 0 has no effect.\r\n *  0b1..Match. A match condition has occurred on the 1 Hz RTC timer. This flag generates an RTC alarm interrupt\r\n *       request RTC_ALARM which can also wake up the part from any low power mode. Writing a 1 clears this bit.\r\n */\r\n#define RTC_CTRL_ALARM1HZ(x)                     (((uint32_t)(((uint32_t)(x)) << RTC_CTRL_ALARM1HZ_SHIFT)) & RTC_CTRL_ALARM1HZ_MASK)\r\n\r\n#define RTC_CTRL_WAKE1KHZ_MASK                   (0x8U)\r\n#define RTC_CTRL_WAKE1KHZ_SHIFT                  (3U)\r\n/*! WAKE1KHZ - RTC 1 kHz timer wake-up flag status.\r\n *  0b0..Run. The RTC 1 kHz timer is running. Writing a 0 has no effect.\r\n *  0b1..Time-out. The 1 kHz high-resolution/wake-up timer has timed out. This flag generates an RTC wake-up\r\n *       interrupt request RTC-WAKE which can also wake up the part from any low power mode. Writing a 1 clears this bit.\r\n */\r\n#define RTC_CTRL_WAKE1KHZ(x)                     (((uint32_t)(((uint32_t)(x)) << RTC_CTRL_WAKE1KHZ_SHIFT)) & RTC_CTRL_WAKE1KHZ_MASK)\r\n\r\n#define RTC_CTRL_ALARMDPD_EN_MASK                (0x10U)\r\n#define RTC_CTRL_ALARMDPD_EN_SHIFT               (4U)\r\n/*! ALARMDPD_EN - RTC 1 Hz timer alarm enable for Deep power-down.\r\n *  0b0..Disable. A match on the 1 Hz RTC timer will not bring the part out of Deep power-down mode.\r\n *  0b1..Enable. A match on the 1 Hz RTC timer bring the part out of Deep power-down mode.\r\n */\r\n#define RTC_CTRL_ALARMDPD_EN(x)                  (((uint32_t)(((uint32_t)(x)) << RTC_CTRL_ALARMDPD_EN_SHIFT)) & RTC_CTRL_ALARMDPD_EN_MASK)\r\n\r\n#define RTC_CTRL_WAKEDPD_EN_MASK                 (0x20U)\r\n#define RTC_CTRL_WAKEDPD_EN_SHIFT                (5U)\r\n/*! WAKEDPD_EN - RTC 1 kHz timer wake-up enable for Deep power-down.\r\n *  0b0..Disable. A match on the 1 kHz RTC timer will not bring the part out of Deep power-down mode.\r\n *  0b1..Enable. A match on the 1 kHz RTC timer bring the part out of Deep power-down mode.\r\n */\r\n#define RTC_CTRL_WAKEDPD_EN(x)                   (((uint32_t)(((uint32_t)(x)) << RTC_CTRL_WAKEDPD_EN_SHIFT)) & RTC_CTRL_WAKEDPD_EN_MASK)\r\n\r\n#define RTC_CTRL_RTC1KHZ_EN_MASK                 (0x40U)\r\n#define RTC_CTRL_RTC1KHZ_EN_SHIFT                (6U)\r\n/*! RTC1KHZ_EN - RTC 1 kHz clock enable. This bit can be set to 0 to conserve power if the 1 kHz\r\n *    timer is not used. This bit has no effect when the RTC is disabled (bit 7 of this register is 0).\r\n *  0b0..Disable. A match on the 1 kHz RTC timer will not bring the part out of Deep power-down mode.\r\n *  0b1..Enable. The 1 kHz RTC timer is enabled.\r\n */\r\n#define RTC_CTRL_RTC1KHZ_EN(x)                   (((uint32_t)(((uint32_t)(x)) << RTC_CTRL_RTC1KHZ_EN_SHIFT)) & RTC_CTRL_RTC1KHZ_EN_MASK)\r\n\r\n#define RTC_CTRL_RTC_EN_MASK                     (0x80U)\r\n#define RTC_CTRL_RTC_EN_SHIFT                    (7U)\r\n/*! RTC_EN - RTC enable.\r\n *  0b0..Disable. The RTC 1 Hz and 1 kHz clocks are shut down and the RTC operation is disabled. This bit should\r\n *       be 0 when writing to load a value in the RTC counter register.\r\n *  0b1..Enable. The 1 Hz RTC clock is running and RTC operation is enabled. This bit must be set to initiate\r\n *       operation of the RTC. The first clock to the RTC counter occurs 1 s after this bit is set. To also enable the\r\n *       high-resolution, 1 kHz clock, set bit 6 in this register.\r\n */\r\n#define RTC_CTRL_RTC_EN(x)                       (((uint32_t)(((uint32_t)(x)) << RTC_CTRL_RTC_EN_SHIFT)) & RTC_CTRL_RTC_EN_MASK)\r\n\r\n#define RTC_CTRL_RTC_OSC_PD_MASK                 (0x100U)\r\n#define RTC_CTRL_RTC_OSC_PD_SHIFT                (8U)\r\n/*! RTC_OSC_PD - The RTC oscillator enable\r\n *  0b0..The RTC oscillator is enabled. This bit must be cleared in order for the RTC module to function\r\n *  0b1..The RTC oscillator is shut-off to reserve power consumption. RTC operation is disabled.\r\n */\r\n#define RTC_CTRL_RTC_OSC_PD(x)                   (((uint32_t)(((uint32_t)(x)) << RTC_CTRL_RTC_OSC_PD_SHIFT)) & RTC_CTRL_RTC_OSC_PD_MASK)\r\n\r\n#define RTC_CTRL_RTC_OSC_BYPASS_MASK             (0x200U)\r\n#define RTC_CTRL_RTC_OSC_BYPASS_SHIFT            (9U)\r\n/*! RTC_OSC_BYPASS - The RTC Oscillator bypass\r\n *  0b0..The RTC Oscillator operates normally as a crystal oscillator with the crystal connected between the RTC_XTLALIN and RTC_XTALOUT pins.\r\n *  0b1..The RTC oscillator is in bypass mode. In this mode a clock can be directly input into the RTC_XTALIN pin.\r\n */\r\n#define RTC_CTRL_RTC_OSC_BYPASS(x)               (((uint32_t)(((uint32_t)(x)) << RTC_CTRL_RTC_OSC_BYPASS_SHIFT)) & RTC_CTRL_RTC_OSC_BYPASS_MASK)\r\n\r\n#define RTC_CTRL_RTC_SUBSEC_ENA_MASK             (0x400U)\r\n#define RTC_CTRL_RTC_SUBSEC_ENA_SHIFT            (10U)\r\n/*! RTC_SUBSEC_ENA - The 32 KHz sub-second counter enable\r\n *  0b0..The sub-second counter (if implemented) is disabled. This bit is cleared by a system-level POR or BOD\r\n *       reset as well as a by the RTC_ENA bit (bit 7 in this register). On modules not equipped with a sub-second\r\n *       counter, this bit will always read-back as a '0'\r\n *  0b1..The 32 KHz sub-second counter is enabled (if implemented). Counting will commence on the start of the\r\n *       first one-second interval after this bit is set. Note: This bit can only be set after the RTC_ENA bit (bit 7)\r\n *       has been set by a previous write operation. Note: The RTC sub-second counter must be re-enabled whenever\r\n *       the chip exits deep_powerdown mode.\r\n */\r\n#define RTC_CTRL_RTC_SUBSEC_ENA(x)               (((uint32_t)(((uint32_t)(x)) << RTC_CTRL_RTC_SUBSEC_ENA_SHIFT)) & RTC_CTRL_RTC_SUBSEC_ENA_MASK)\r\n\r\n#define RTC_CTRL_RTC_OSC_LOADCAP_MASK            (0xF0000000U)\r\n#define RTC_CTRL_RTC_OSC_LOADCAP_SHIFT           (28U)\r\n/*! RTC_OSC_LOADCAP - capacitive load selection */\r\n#define RTC_CTRL_RTC_OSC_LOADCAP(x)              (((uint32_t)(((uint32_t)(x)) << RTC_CTRL_RTC_OSC_LOADCAP_SHIFT)) & RTC_CTRL_RTC_OSC_LOADCAP_MASK)\r\n/*! @} */\r\n\r\n/*! @name MATCH - RTC match register */\r\n/*! @{ */\r\n\r\n#define RTC_MATCH_MATVAL_MASK                    (0xFFFFFFFFU)\r\n#define RTC_MATCH_MATVAL_SHIFT                   (0U)\r\n/*! MATVAL - Contains the match value against which the 1 Hz RTC timer will be compared to set the\r\n *    alarm flag RTC_ALARM and generate an alarm interrupt/wake-up if enabled.\r\n */\r\n#define RTC_MATCH_MATVAL(x)                      (((uint32_t)(((uint32_t)(x)) << RTC_MATCH_MATVAL_SHIFT)) & RTC_MATCH_MATVAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name COUNT - RTC counter register */\r\n/*! @{ */\r\n\r\n#define RTC_COUNT_VAL_MASK                       (0xFFFFFFFFU)\r\n#define RTC_COUNT_VAL_SHIFT                      (0U)\r\n/*! VAL - A read reflects the current value of the main, 1 Hz RTC timer. A write loads a new initial\r\n *    value into the timer. The RTC counter will count up continuously at a 1 Hz rate once the RTC\r\n *    Software Reset is removed (by clearing bit 0 of the CTRL register). Only write to this\r\n *    register when the RTC_EN bit in the RTC CTRL Register is 0. The counter increments one second after\r\n *    the RTC_EN bit is set.\r\n */\r\n#define RTC_COUNT_VAL(x)                         (((uint32_t)(((uint32_t)(x)) << RTC_COUNT_VAL_SHIFT)) & RTC_COUNT_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name WAKE - High-resolution/wake-up timer control register */\r\n/*! @{ */\r\n\r\n#define RTC_WAKE_VAL_MASK                        (0xFFFFU)\r\n#define RTC_WAKE_VAL_SHIFT                       (0U)\r\n/*! VAL - A read reflects the current value of the high-resolution/wake-up timer. A write pre-loads\r\n *    a start count value into the wake-up timer and initializes a count-down sequence. Do not write\r\n *    to this register while counting is in progress.\r\n */\r\n#define RTC_WAKE_VAL(x)                          (((uint32_t)(((uint32_t)(x)) << RTC_WAKE_VAL_SHIFT)) & RTC_WAKE_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SUBSEC - RTC Sub-second Counter register */\r\n/*! @{ */\r\n\r\n#define RTC_SUBSEC_RTC_SUBSEC_MASK               (0x7FFFU)\r\n#define RTC_SUBSEC_RTC_SUBSEC_SHIFT              (0U)\r\n/*! RTC_SUBSEC - A read reflects the current value of the 32Khz sub-second counter. This counter\r\n *    will be cleared whenever the SUBSEC_ENA bit in the RTC_CONTROL register is low. Up-counting at a\r\n *    32 KHz rate commences at the start of the next one-second interval after the SUBSEC_ENA bit is\r\n *    set. This counter must be re-enabled after exiting deep_powerdown mode or after the main RTC\r\n *    module has been disabled and re-enabled. On modules not equipped with a sub-second counter,\r\n *    this register will read-back as all zeroes.\r\n */\r\n#define RTC_SUBSEC_RTC_SUBSEC(x)                 (((uint32_t)(((uint32_t)(x)) << RTC_SUBSEC_RTC_SUBSEC_SHIFT)) & RTC_SUBSEC_RTC_SUBSEC_MASK)\r\n/*! @} */\r\n\r\n/*! @name GPREG - General Purpose register */\r\n/*! @{ */\r\n\r\n#define RTC_GPREG_GPDATA_MASK                    (0xFFFFFFFFU)\r\n#define RTC_GPREG_GPDATA_SHIFT                   (0U)\r\n/*! GPDATA - Data retained during Deep power-down mode or loss of main power as long as VBAT is supplied. */\r\n#define RTC_GPREG_GPDATA(x)                      (((uint32_t)(((uint32_t)(x)) << RTC_GPREG_GPDATA_SHIFT)) & RTC_GPREG_GPDATA_MASK)\r\n/*! @} */\r\n\r\n/* The count of RTC_GPREG */\r\n#define RTC_GPREG_COUNT                          (8U)\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group RTC_Register_Masks */\r\n\r\n\r\n/* RTC - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral RTC base address */\r\n  #define RTC_BASE                                 (0x50030000u)\r\n  /** Peripheral RTC base address */\r\n  #define RTC_BASE_NS                              (0x40030000u)\r\n  /** Peripheral RTC base pointer */\r\n  #define RTC                                      ((RTC_Type *)RTC_BASE)\r\n  /** Peripheral RTC base pointer */\r\n  #define RTC_NS                                   ((RTC_Type *)RTC_BASE_NS)\r\n  /** Array initializer of RTC peripheral base addresses */\r\n  #define RTC_BASE_ADDRS                           { RTC_BASE }\r\n  /** Array initializer of RTC peripheral base pointers */\r\n  #define RTC_BASE_PTRS                            { RTC }\r\n  /** Array initializer of RTC peripheral base addresses */\r\n  #define RTC_BASE_ADDRS_NS                        { RTC_BASE_NS }\r\n  /** Array initializer of RTC peripheral base pointers */\r\n  #define RTC_BASE_PTRS_NS                         { RTC_NS }\r\n#else\r\n  /** Peripheral RTC base address */\r\n  #define RTC_BASE                                 (0x40030000u)\r\n  /** Peripheral RTC base pointer */\r\n  #define RTC                                      ((RTC_Type *)RTC_BASE)\r\n  /** Array initializer of RTC peripheral base addresses */\r\n  #define RTC_BASE_ADDRS                           { RTC_BASE }\r\n  /** Array initializer of RTC peripheral base pointers */\r\n  #define RTC_BASE_PTRS                            { RTC }\r\n#endif\r\n/** Interrupt vectors for the RTC peripheral type */\r\n#define RTC_IRQS                                 { RTC_IRQn }\r\n\r\n/*!\r\n * @}\r\n */ /* end of group RTC_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SCT Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SCT_Peripheral_Access_Layer SCT Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** SCT - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t CONFIG;                            /**< SCTimer Configuration, offset: 0x0 */\r\n  union {                                          /* offset: 0x4 */\r\n    struct {                                         /* offset: 0x4 */\r\n      __IO uint16_t CTRLL;                             /**< SCT_CTRLL register, offset: 0x4 */\r\n      __IO uint16_t CTRLH;                             /**< SCT_CTRLH register, offset: 0x6 */\r\n    } CTRL_ACCESS16BIT;\r\n    __IO uint32_t CTRL;                              /**< SCT Control, offset: 0x4 */\r\n  };\r\n  union {                                          /* offset: 0x8 */\r\n    struct {                                         /* offset: 0x8 */\r\n      __IO uint16_t LIMITL;                            /**< SCT_LIMITL register, offset: 0x8 */\r\n      __IO uint16_t LIMITH;                            /**< SCT_LIMITH register, offset: 0xA */\r\n    } LIMIT_ACCESS16BIT;\r\n    __IO uint32_t LIMIT;                             /**< SCT Limit Event Select, offset: 0x8 */\r\n  };\r\n  union {                                          /* offset: 0xC */\r\n    struct {                                         /* offset: 0xC */\r\n      __IO uint16_t HALTL;                             /**< SCT_HALTL register, offset: 0xC */\r\n      __IO uint16_t HALTH;                             /**< SCT_HALTH register, offset: 0xE */\r\n    } HALT_ACCESS16BIT;\r\n    __IO uint32_t HALT;                              /**< Halt Event Select, offset: 0xC */\r\n  };\r\n  union {                                          /* offset: 0x10 */\r\n    struct {                                         /* offset: 0x10 */\r\n      __IO uint16_t STOPL;                             /**< SCT_STOPL register, offset: 0x10 */\r\n      __IO uint16_t STOPH;                             /**< SCT_STOPH register, offset: 0x12 */\r\n    } STOP_ACCESS16BIT;\r\n    __IO uint32_t STOP;                              /**< Stop Event Select, offset: 0x10 */\r\n  };\r\n  union {                                          /* offset: 0x14 */\r\n    struct {                                         /* offset: 0x14 */\r\n      __IO uint16_t STARTL;                            /**< SCT_STARTL register, offset: 0x14 */\r\n      __IO uint16_t STARTH;                            /**< SCT_STARTH register, offset: 0x16 */\r\n    } START_ACCESS16BIT;\r\n    __IO uint32_t START;                             /**< Start Event Select, offset: 0x14 */\r\n  };\r\n       uint8_t RESERVED_0[40];\r\n  union {                                          /* offset: 0x40 */\r\n    struct {                                         /* offset: 0x40 */\r\n      __IO uint16_t COUNTL;                            /**< SCT_COUNTL register, offset: 0x40 */\r\n      __IO uint16_t COUNTH;                            /**< SCT_COUNTH register, offset: 0x42 */\r\n    } COUNT_ACCESS16BIT;\r\n    __IO uint32_t COUNT;                             /**< Counter, offset: 0x40 */\r\n  };\r\n  union {                                          /* offset: 0x44 */\r\n    struct {                                         /* offset: 0x44 */\r\n      __IO uint16_t STATEL;                            /**< SCT_STATEL register, offset: 0x44 */\r\n      __IO uint16_t STATEH;                            /**< SCT_STATEH register, offset: 0x46 */\r\n    } STATE_ACCESS16BIT;\r\n    __IO uint32_t STATE;                             /**< State, offset: 0x44 */\r\n  };\r\n  __I  uint32_t INPUT;                             /**< Input, offset: 0x48 */\r\n  union {                                          /* offset: 0x4C */\r\n    struct {                                         /* offset: 0x4C */\r\n      __IO uint16_t REGMODEL;                          /**< SCT_REGMODEL register, offset: 0x4C */\r\n      __IO uint16_t REGMODEH;                          /**< SCT_REGMODEH register, offset: 0x4E */\r\n    } REGMODE_ACCESS16BIT;\r\n    __IO uint32_t REGMODE;                           /**< Match/Capture Mode, offset: 0x4C */\r\n  };\r\n  __IO uint32_t OUTPUT;                            /**< Output, offset: 0x50 */\r\n  __IO uint32_t OUTPUTDIRCTRL;                     /**< Output Counter Direction Control, offset: 0x54 */\r\n  __IO uint32_t RES;                               /**< Output Conflict Resolution, offset: 0x58 */\r\n  __IO uint32_t DMAREQ0;                           /**< DMA Request 0, offset: 0x5C */\r\n  __IO uint32_t DMAREQ1;                           /**< DMA Request 1, offset: 0x60 */\r\n       uint8_t RESERVED_1[140];\r\n  __IO uint32_t EVEN;                              /**< Event Interrupt Enable, offset: 0xF0 */\r\n  __IO uint32_t EVFLAG;                            /**< Event Flag, offset: 0xF4 */\r\n  __IO uint32_t CONEN;                             /**< Conflict Interrupt Enable, offset: 0xF8 */\r\n  __IO uint32_t CONFLAG;                           /**< Conflict Flag, offset: 0xFC */\r\n  union {                                          /* offset: 0x100 */\r\n    union {                                          /* offset: 0x100, array step: 0x4 */\r\n      struct {                                         /* offset: 0x100, array step: 0x4 */\r\n        __IO uint16_t CAPL;                              /**< SCT_CAPL register, array offset: 0x100, array step: 0x4 */\r\n        __IO uint16_t CAPH;                              /**< SCT_CAPH register, array offset: 0x102, array step: 0x4 */\r\n      } CAP_ACCESS16BIT[16];\r\n      __IO uint32_t CAP[16];                           /**< Capture Value, array offset: 0x100, array step: 0x4 */\r\n    };\r\n    union {                                          /* offset: 0x100, array step: 0x4 */\r\n      struct {                                         /* offset: 0x100, array step: 0x4 */\r\n        __IO uint16_t MATCHL;                            /**< SCT_MATCHL register, array offset: 0x100, array step: 0x4 */\r\n        __IO uint16_t MATCHH;                            /**< SCT_MATCHH register, array offset: 0x102, array step: 0x4 */\r\n      } MATCH_ACCESS16BIT[16];\r\n      __IO uint32_t MATCH[16];                         /**< Match Value, array offset: 0x100, array step: 0x4 */\r\n    };\r\n  };\r\n       uint8_t RESERVED_2[192];\r\n  union {                                          /* offset: 0x200 */\r\n    union {                                          /* offset: 0x200, array step: 0x4 */\r\n      struct {                                         /* offset: 0x200, array step: 0x4 */\r\n        __IO uint16_t CAPCTRLL;                          /**< SCT_CAPCTRLL register, array offset: 0x200, array step: 0x4 */\r\n        __IO uint16_t CAPCTRLH;                          /**< SCT_CAPCTRLH register, array offset: 0x202, array step: 0x4 */\r\n      } CAPCTRL_ACCESS16BIT[16];\r\n      __IO uint32_t CAPCTRL[16];                       /**< Capture Control, array offset: 0x200, array step: 0x4 */\r\n    };\r\n    union {                                          /* offset: 0x200, array step: 0x4 */\r\n      struct {                                         /* offset: 0x200, array step: 0x4 */\r\n        __IO uint16_t MATCHRELL;                         /**< SCT_MATCHRELL register, array offset: 0x200, array step: 0x4 */\r\n        __IO uint16_t MATCHRELH;                         /**< SCT_MATCHRELH register, array offset: 0x202, array step: 0x4 */\r\n      } MATCHREL_ACCESS16BIT[16];\r\n      __IO uint32_t MATCHREL[16];                      /**< Match Reload Value, array offset: 0x200, array step: 0x4 */\r\n    };\r\n  };\r\n       uint8_t RESERVED_3[192];\r\n  struct {                                         /* offset: 0x300, array step: 0x8 */\r\n    __IO uint32_t STATE;                             /**< Event n State, array offset: 0x300, array step: 0x8 */\r\n    __IO uint32_t CTRL;                              /**< Event n Control, array offset: 0x304, array step: 0x8 */\r\n  } EV[16];\r\n       uint8_t RESERVED_4[384];\r\n  struct {                                         /* offset: 0x500, array step: 0x8 */\r\n    __IO uint32_t SET;                               /**< Output n Set, array offset: 0x500, array step: 0x8 */\r\n    __IO uint32_t CLR;                               /**< Output n Clear, array offset: 0x504, array step: 0x8 */\r\n  } OUT[10];\r\n} SCT_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SCT Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SCT_Register_Masks SCT Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name CONFIG - SCTimer Configuration */\r\n/*! @{ */\r\n\r\n#define SCT_CONFIG_UNIFY_MASK                    (0x1U)\r\n#define SCT_CONFIG_UNIFY_SHIFT                   (0U)\r\n/*! UNIFY - SCT Operation\r\n *  0b0..Dual counter. The SCT operates as two 16-bit counters named COUNTER_L and COUNTER_H.\r\n *  0b1..Unified counter. The SCT operates as a unified 32-bit counter.\r\n */\r\n#define SCT_CONFIG_UNIFY(x)                      (((uint32_t)(((uint32_t)(x)) << SCT_CONFIG_UNIFY_SHIFT)) & SCT_CONFIG_UNIFY_MASK)\r\n\r\n#define SCT_CONFIG_CLKMODE_MASK                  (0x6U)\r\n#define SCT_CONFIG_CLKMODE_SHIFT                 (1U)\r\n/*! CLKMODE - SCT Clock Mode\r\n *  0b00..System Clock Mode. The system clock clocks the entire SCT module including all counters and counter prescalers.\r\n *  0b01..Sampled System Clock Mode. The system clock clocks the SCT module, but the counter and prescalers are\r\n *        only enabled to count when the designated edge is detected on the input selected by the CKSEL field. The\r\n *        minimum pulse width on the selected clock-gate input is 1 bus clock period. This mode is the\r\n *        high-performance, sampled-clock mode.\r\n *  0b10..SCT Input Clock Mode. The input/edge selected by the CKSEL field clocks the SCT module, including all\r\n *        counters and prescalers, after first being synchronized to the system clock. The minimum pulse width on the\r\n *        clock input is 1 bus clock period. This mode is the low-power, sampled-clock mode.\r\n *  0b11..Asynchronous Mode. The entire SCT module is clocked directly by the input/edge selected by the CKSEL\r\n *        field. In this mode, the SCT outputs are switched synchronously to the SCT input clock - not the system\r\n *        clock. The input clock rate must be at least half the system clock rate and can be the same or faster than\r\n *        the system clock.\r\n */\r\n#define SCT_CONFIG_CLKMODE(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_CONFIG_CLKMODE_SHIFT)) & SCT_CONFIG_CLKMODE_MASK)\r\n\r\n#define SCT_CONFIG_CKSEL_MASK                    (0x78U)\r\n#define SCT_CONFIG_CKSEL_SHIFT                   (3U)\r\n/*! CKSEL - SCT Clock Select. The specific functionality of the designated input/edge is dependent\r\n *    on the CLKMODE bit selection in this register.\r\n *  0b0000..Rising edges on input 0\r\n *  0b0001..Falling edges on input 0\r\n *  0b0010..Rising edges on input 1\r\n *  0b0011..Falling edges on input 1\r\n *  0b0100..Rising edges on input 2\r\n *  0b0101..Falling edges on input 2\r\n *  0b0110..Rising edges on input 3\r\n *  0b0111..Falling edges on input 3\r\n *  0b1000..Rising edges on input 4\r\n *  0b1001..Falling edges on input 4\r\n *  0b1010..Rising edges on input 5\r\n *  0b1011..Falling edges on input 5\r\n *  0b1100..Rising edges on input 6\r\n *  0b1101..Falling edges on input 6\r\n *  0b1110..Rising edges on input 7\r\n *  0b1111..Falling edges on input 7\r\n */\r\n#define SCT_CONFIG_CKSEL(x)                      (((uint32_t)(((uint32_t)(x)) << SCT_CONFIG_CKSEL_SHIFT)) & SCT_CONFIG_CKSEL_MASK)\r\n\r\n#define SCT_CONFIG_NORELOAD_L_MASK               (0x80U)\r\n#define SCT_CONFIG_NORELOAD_L_SHIFT              (7U)\r\n/*! NORELOAD_L - No Reload Lower Match\r\n *  0b0..Reload. The default setting.\r\n *  0b1..No Reload. Prevents the lower match registers from being reloaded from their respective reload registers.\r\n */\r\n#define SCT_CONFIG_NORELOAD_L(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_CONFIG_NORELOAD_L_SHIFT)) & SCT_CONFIG_NORELOAD_L_MASK)\r\n\r\n#define SCT_CONFIG_NORELOAD_H_MASK               (0x100U)\r\n#define SCT_CONFIG_NORELOAD_H_SHIFT              (8U)\r\n/*! NORELOAD_H - No Reload Higher Match\r\n *  0b0..Reload. The default setting.\r\n *  0b1..No Reload. Prevents the higher match registers from being reloaded from their respective reload registers.\r\n */\r\n#define SCT_CONFIG_NORELOAD_H(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_CONFIG_NORELOAD_H_SHIFT)) & SCT_CONFIG_NORELOAD_H_MASK)\r\n\r\n#define SCT_CONFIG_INSYNC_MASK                   (0x1FE00U)\r\n#define SCT_CONFIG_INSYNC_SHIFT                  (9U)\r\n/*! INSYNC - Input Synchronization */\r\n#define SCT_CONFIG_INSYNC(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_CONFIG_INSYNC_SHIFT)) & SCT_CONFIG_INSYNC_MASK)\r\n\r\n#define SCT_CONFIG_AUTOLIMIT_L_MASK              (0x20000U)\r\n#define SCT_CONFIG_AUTOLIMIT_L_SHIFT             (17U)\r\n/*! AUTOLIMIT_L - Auto Limit Lower\r\n *  0b0..Disable.\r\n *  0b1..Enable. A match on match register 0 is the LIMIT condition. No need to define an associated event.\r\n */\r\n#define SCT_CONFIG_AUTOLIMIT_L(x)                (((uint32_t)(((uint32_t)(x)) << SCT_CONFIG_AUTOLIMIT_L_SHIFT)) & SCT_CONFIG_AUTOLIMIT_L_MASK)\r\n\r\n#define SCT_CONFIG_AUTOLIMIT_H_MASK              (0x40000U)\r\n#define SCT_CONFIG_AUTOLIMIT_H_SHIFT             (18U)\r\n/*! AUTOLIMIT_H - Auto Limit Higher\r\n *  0b0..Disable.\r\n *  0b1..Enable. A match on match register 0 is the LIMIT condition. No need to define an associated event.\r\n */\r\n#define SCT_CONFIG_AUTOLIMIT_H(x)                (((uint32_t)(((uint32_t)(x)) << SCT_CONFIG_AUTOLIMIT_H_SHIFT)) & SCT_CONFIG_AUTOLIMIT_H_MASK)\r\n/*! @} */\r\n\r\n/*! @name CTRLL - SCT_CTRLL register */\r\n/*! @{ */\r\n\r\n#define SCT_CTRLL_DOWN_L_MASK                    (0x1U)\r\n#define SCT_CTRLL_DOWN_L_SHIFT                   (0U)\r\n/*! DOWN_L - Down Counter Low\r\n *  0b0..Up. The L or unified counter is counting up.\r\n *  0b1..Down. The L or unified counter is counting down.\r\n */\r\n#define SCT_CTRLL_DOWN_L(x)                      (((uint16_t)(((uint16_t)(x)) << SCT_CTRLL_DOWN_L_SHIFT)) & SCT_CTRLL_DOWN_L_MASK)\r\n\r\n#define SCT_CTRLL_STOP_L_MASK                    (0x2U)\r\n#define SCT_CTRLL_STOP_L_SHIFT                   (1U)\r\n/*! STOP_L - Stop Counter Low\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_CTRLL_STOP_L(x)                      (((uint16_t)(((uint16_t)(x)) << SCT_CTRLL_STOP_L_SHIFT)) & SCT_CTRLL_STOP_L_MASK)\r\n\r\n#define SCT_CTRLL_HALT_L_MASK                    (0x4U)\r\n#define SCT_CTRLL_HALT_L_SHIFT                   (2U)\r\n/*! HALT_L - Halt Counter Low\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_CTRLL_HALT_L(x)                      (((uint16_t)(((uint16_t)(x)) << SCT_CTRLL_HALT_L_SHIFT)) & SCT_CTRLL_HALT_L_MASK)\r\n\r\n#define SCT_CTRLL_CLRCTR_L_MASK                  (0x8U)\r\n#define SCT_CTRLL_CLRCTR_L_SHIFT                 (3U)\r\n/*! CLRCTR_L - Clear Counter Low */\r\n#define SCT_CTRLL_CLRCTR_L(x)                    (((uint16_t)(((uint16_t)(x)) << SCT_CTRLL_CLRCTR_L_SHIFT)) & SCT_CTRLL_CLRCTR_L_MASK)\r\n\r\n#define SCT_CTRLL_BIDIR_L_MASK                   (0x10U)\r\n#define SCT_CTRLL_BIDIR_L_SHIFT                  (4U)\r\n/*! BIDIR_L - Bidirectional Select Low\r\n *  0b0..Up. The counter counts up to a limit condition, then is cleared to zero.\r\n *  0b1..Up-down. The counter counts up to a limit, then counts down to a limit condition or to 0.\r\n */\r\n#define SCT_CTRLL_BIDIR_L(x)                     (((uint16_t)(((uint16_t)(x)) << SCT_CTRLL_BIDIR_L_SHIFT)) & SCT_CTRLL_BIDIR_L_MASK)\r\n\r\n#define SCT_CTRLL_PRE_L_MASK                     (0x1FE0U)\r\n#define SCT_CTRLL_PRE_L_SHIFT                    (5U)\r\n/*! PRE_L - Prescaler for Low Counter */\r\n#define SCT_CTRLL_PRE_L(x)                       (((uint16_t)(((uint16_t)(x)) << SCT_CTRLL_PRE_L_SHIFT)) & SCT_CTRLL_PRE_L_MASK)\r\n/*! @} */\r\n\r\n/*! @name CTRLH - SCT_CTRLH register */\r\n/*! @{ */\r\n\r\n#define SCT_CTRLH_DOWN_H_MASK                    (0x1U)\r\n#define SCT_CTRLH_DOWN_H_SHIFT                   (0U)\r\n/*! DOWN_H - Down Counter High\r\n *  0b0..Up. The H counter is counting up.\r\n *  0b1..Down. The H counter is counting down.\r\n */\r\n#define SCT_CTRLH_DOWN_H(x)                      (((uint16_t)(((uint16_t)(x)) << SCT_CTRLH_DOWN_H_SHIFT)) & SCT_CTRLH_DOWN_H_MASK)\r\n\r\n#define SCT_CTRLH_STOP_H_MASK                    (0x2U)\r\n#define SCT_CTRLH_STOP_H_SHIFT                   (1U)\r\n/*! STOP_H - Stop Counter High\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_CTRLH_STOP_H(x)                      (((uint16_t)(((uint16_t)(x)) << SCT_CTRLH_STOP_H_SHIFT)) & SCT_CTRLH_STOP_H_MASK)\r\n\r\n#define SCT_CTRLH_HALT_H_MASK                    (0x4U)\r\n#define SCT_CTRLH_HALT_H_SHIFT                   (2U)\r\n/*! HALT_H - Halt Counter High\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_CTRLH_HALT_H(x)                      (((uint16_t)(((uint16_t)(x)) << SCT_CTRLH_HALT_H_SHIFT)) & SCT_CTRLH_HALT_H_MASK)\r\n\r\n#define SCT_CTRLH_CLRCTR_H_MASK                  (0x8U)\r\n#define SCT_CTRLH_CLRCTR_H_SHIFT                 (3U)\r\n/*! CLRCTR_H - Clear Counter High */\r\n#define SCT_CTRLH_CLRCTR_H(x)                    (((uint16_t)(((uint16_t)(x)) << SCT_CTRLH_CLRCTR_H_SHIFT)) & SCT_CTRLH_CLRCTR_H_MASK)\r\n\r\n#define SCT_CTRLH_BIDIR_H_MASK                   (0x10U)\r\n#define SCT_CTRLH_BIDIR_H_SHIFT                  (4U)\r\n/*! BIDIR_H - Bidirectional Select High\r\n *  0b0..Up. The H counter counts up to its limit condition, then is cleared to zero.\r\n *  0b1..Up-down. The H counter counts up to its limit, then counts down to a limit condition or to 0.\r\n */\r\n#define SCT_CTRLH_BIDIR_H(x)                     (((uint16_t)(((uint16_t)(x)) << SCT_CTRLH_BIDIR_H_SHIFT)) & SCT_CTRLH_BIDIR_H_MASK)\r\n\r\n#define SCT_CTRLH_PRE_H_MASK                     (0x1FE0U)\r\n#define SCT_CTRLH_PRE_H_SHIFT                    (5U)\r\n/*! PRE_H - Prescaler for High Counter */\r\n#define SCT_CTRLH_PRE_H(x)                       (((uint16_t)(((uint16_t)(x)) << SCT_CTRLH_PRE_H_SHIFT)) & SCT_CTRLH_PRE_H_MASK)\r\n/*! @} */\r\n\r\n/*! @name CTRL - SCT Control */\r\n/*! @{ */\r\n\r\n#define SCT_CTRL_DOWN_L_MASK                     (0x1U)\r\n#define SCT_CTRL_DOWN_L_SHIFT                    (0U)\r\n/*! DOWN_L - Down Counter Low\r\n *  0b0..Up. The L or unified counter is counting up.\r\n *  0b1..Down. The L or unified counter is counting down.\r\n */\r\n#define SCT_CTRL_DOWN_L(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_CTRL_DOWN_L_SHIFT)) & SCT_CTRL_DOWN_L_MASK)\r\n\r\n#define SCT_CTRL_STOP_L_MASK                     (0x2U)\r\n#define SCT_CTRL_STOP_L_SHIFT                    (1U)\r\n/*! STOP_L - Stop Counter Low\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_CTRL_STOP_L(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_CTRL_STOP_L_SHIFT)) & SCT_CTRL_STOP_L_MASK)\r\n\r\n#define SCT_CTRL_HALT_L_MASK                     (0x4U)\r\n#define SCT_CTRL_HALT_L_SHIFT                    (2U)\r\n/*! HALT_L - Halt Counter Low\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_CTRL_HALT_L(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_CTRL_HALT_L_SHIFT)) & SCT_CTRL_HALT_L_MASK)\r\n\r\n#define SCT_CTRL_CLRCTR_L_MASK                   (0x8U)\r\n#define SCT_CTRL_CLRCTR_L_SHIFT                  (3U)\r\n/*! CLRCTR_L - Clear Counter Low */\r\n#define SCT_CTRL_CLRCTR_L(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_CTRL_CLRCTR_L_SHIFT)) & SCT_CTRL_CLRCTR_L_MASK)\r\n\r\n#define SCT_CTRL_BIDIR_L_MASK                    (0x10U)\r\n#define SCT_CTRL_BIDIR_L_SHIFT                   (4U)\r\n/*! BIDIR_L - Bidirectional Select Low\r\n *  0b0..Up. The counter counts up to a limit condition, then is cleared to zero.\r\n *  0b1..Up-down. The counter counts up to a limit, then counts down to a limit condition or to 0.\r\n */\r\n#define SCT_CTRL_BIDIR_L(x)                      (((uint32_t)(((uint32_t)(x)) << SCT_CTRL_BIDIR_L_SHIFT)) & SCT_CTRL_BIDIR_L_MASK)\r\n\r\n#define SCT_CTRL_PRE_L_MASK                      (0x1FE0U)\r\n#define SCT_CTRL_PRE_L_SHIFT                     (5U)\r\n/*! PRE_L - Prescaler for Low Counter */\r\n#define SCT_CTRL_PRE_L(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_CTRL_PRE_L_SHIFT)) & SCT_CTRL_PRE_L_MASK)\r\n\r\n#define SCT_CTRL_DOWN_H_MASK                     (0x10000U)\r\n#define SCT_CTRL_DOWN_H_SHIFT                    (16U)\r\n/*! DOWN_H - Down Counter High\r\n *  0b0..Up. The H counter is counting up.\r\n *  0b1..Down. The H counter is counting down.\r\n */\r\n#define SCT_CTRL_DOWN_H(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_CTRL_DOWN_H_SHIFT)) & SCT_CTRL_DOWN_H_MASK)\r\n\r\n#define SCT_CTRL_STOP_H_MASK                     (0x20000U)\r\n#define SCT_CTRL_STOP_H_SHIFT                    (17U)\r\n/*! STOP_H - Stop Counter High\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_CTRL_STOP_H(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_CTRL_STOP_H_SHIFT)) & SCT_CTRL_STOP_H_MASK)\r\n\r\n#define SCT_CTRL_HALT_H_MASK                     (0x40000U)\r\n#define SCT_CTRL_HALT_H_SHIFT                    (18U)\r\n/*! HALT_H - Halt Counter High\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_CTRL_HALT_H(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_CTRL_HALT_H_SHIFT)) & SCT_CTRL_HALT_H_MASK)\r\n\r\n#define SCT_CTRL_CLRCTR_H_MASK                   (0x80000U)\r\n#define SCT_CTRL_CLRCTR_H_SHIFT                  (19U)\r\n/*! CLRCTR_H - Clear Counter High */\r\n#define SCT_CTRL_CLRCTR_H(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_CTRL_CLRCTR_H_SHIFT)) & SCT_CTRL_CLRCTR_H_MASK)\r\n\r\n#define SCT_CTRL_BIDIR_H_MASK                    (0x100000U)\r\n#define SCT_CTRL_BIDIR_H_SHIFT                   (20U)\r\n/*! BIDIR_H - Bidirectional Select High\r\n *  0b0..Up. The H counter counts up to its limit condition, then is cleared to zero.\r\n *  0b1..Up-down. The H counter counts up to its limit, then counts down to a limit condition or to 0.\r\n */\r\n#define SCT_CTRL_BIDIR_H(x)                      (((uint32_t)(((uint32_t)(x)) << SCT_CTRL_BIDIR_H_SHIFT)) & SCT_CTRL_BIDIR_H_MASK)\r\n\r\n#define SCT_CTRL_PRE_H_MASK                      (0x1FE00000U)\r\n#define SCT_CTRL_PRE_H_SHIFT                     (21U)\r\n/*! PRE_H - Prescaler for High Counter */\r\n#define SCT_CTRL_PRE_H(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_CTRL_PRE_H_SHIFT)) & SCT_CTRL_PRE_H_MASK)\r\n/*! @} */\r\n\r\n/*! @name LIMITL - SCT_LIMITL register */\r\n/*! @{ */\r\n\r\n#define SCT_LIMITL_LIMITL_MASK                   (0xFFFFU)\r\n#define SCT_LIMITL_LIMITL_SHIFT                  (0U)\r\n#define SCT_LIMITL_LIMITL(x)                     (((uint16_t)(((uint16_t)(x)) << SCT_LIMITL_LIMITL_SHIFT)) & SCT_LIMITL_LIMITL_MASK)\r\n/*! @} */\r\n\r\n/*! @name LIMITH - SCT_LIMITH register */\r\n/*! @{ */\r\n\r\n#define SCT_LIMITH_LIMITH_MASK                   (0xFFFFU)\r\n#define SCT_LIMITH_LIMITH_SHIFT                  (0U)\r\n#define SCT_LIMITH_LIMITH(x)                     (((uint16_t)(((uint16_t)(x)) << SCT_LIMITH_LIMITH_SHIFT)) & SCT_LIMITH_LIMITH_MASK)\r\n/*! @} */\r\n\r\n/*! @name LIMIT - SCT Limit Event Select */\r\n/*! @{ */\r\n\r\n#define SCT_LIMIT_LIMMSK_L_MASK                  (0xFFFFU)\r\n#define SCT_LIMIT_LIMMSK_L_SHIFT                 (0U)\r\n/*! LIMMSK_L - Limit Event Counter Low */\r\n#define SCT_LIMIT_LIMMSK_L(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_LIMIT_LIMMSK_L_SHIFT)) & SCT_LIMIT_LIMMSK_L_MASK)\r\n\r\n#define SCT_LIMIT_LIMMSK_H_MASK                  (0xFFFF0000U)\r\n#define SCT_LIMIT_LIMMSK_H_SHIFT                 (16U)\r\n/*! LIMMSK_H - Limit Event Counter High */\r\n#define SCT_LIMIT_LIMMSK_H(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_LIMIT_LIMMSK_H_SHIFT)) & SCT_LIMIT_LIMMSK_H_MASK)\r\n/*! @} */\r\n\r\n/*! @name HALTL - SCT_HALTL register */\r\n/*! @{ */\r\n\r\n#define SCT_HALTL_HALTL_MASK                     (0xFFFFU)\r\n#define SCT_HALTL_HALTL_SHIFT                    (0U)\r\n#define SCT_HALTL_HALTL(x)                       (((uint16_t)(((uint16_t)(x)) << SCT_HALTL_HALTL_SHIFT)) & SCT_HALTL_HALTL_MASK)\r\n/*! @} */\r\n\r\n/*! @name HALTH - SCT_HALTH register */\r\n/*! @{ */\r\n\r\n#define SCT_HALTH_HALTH_MASK                     (0xFFFFU)\r\n#define SCT_HALTH_HALTH_SHIFT                    (0U)\r\n#define SCT_HALTH_HALTH(x)                       (((uint16_t)(((uint16_t)(x)) << SCT_HALTH_HALTH_SHIFT)) & SCT_HALTH_HALTH_MASK)\r\n/*! @} */\r\n\r\n/*! @name HALT - Halt Event Select */\r\n/*! @{ */\r\n\r\n#define SCT_HALT_HALTMSK_L_MASK                  (0xFFFFU)\r\n#define SCT_HALT_HALTMSK_L_SHIFT                 (0U)\r\n/*! HALTMSK_L - Halt Event Low */\r\n#define SCT_HALT_HALTMSK_L(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_HALT_HALTMSK_L_SHIFT)) & SCT_HALT_HALTMSK_L_MASK)\r\n\r\n#define SCT_HALT_HALTMSK_H_MASK                  (0xFFFF0000U)\r\n#define SCT_HALT_HALTMSK_H_SHIFT                 (16U)\r\n/*! HALTMSK_H - Halt Event High */\r\n#define SCT_HALT_HALTMSK_H(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_HALT_HALTMSK_H_SHIFT)) & SCT_HALT_HALTMSK_H_MASK)\r\n/*! @} */\r\n\r\n/*! @name STOPL - SCT_STOPL register */\r\n/*! @{ */\r\n\r\n#define SCT_STOPL_STOPL_MASK                     (0xFFFFU)\r\n#define SCT_STOPL_STOPL_SHIFT                    (0U)\r\n#define SCT_STOPL_STOPL(x)                       (((uint16_t)(((uint16_t)(x)) << SCT_STOPL_STOPL_SHIFT)) & SCT_STOPL_STOPL_MASK)\r\n/*! @} */\r\n\r\n/*! @name STOPH - SCT_STOPH register */\r\n/*! @{ */\r\n\r\n#define SCT_STOPH_STOPH_MASK                     (0xFFFFU)\r\n#define SCT_STOPH_STOPH_SHIFT                    (0U)\r\n#define SCT_STOPH_STOPH(x)                       (((uint16_t)(((uint16_t)(x)) << SCT_STOPH_STOPH_SHIFT)) & SCT_STOPH_STOPH_MASK)\r\n/*! @} */\r\n\r\n/*! @name STOP - Stop Event Select */\r\n/*! @{ */\r\n\r\n#define SCT_STOP_STOPMSK_L_MASK                  (0xFFFFU)\r\n#define SCT_STOP_STOPMSK_L_SHIFT                 (0U)\r\n/*! STOPMSK_L - Stop Event Low */\r\n#define SCT_STOP_STOPMSK_L(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_STOP_STOPMSK_L_SHIFT)) & SCT_STOP_STOPMSK_L_MASK)\r\n\r\n#define SCT_STOP_STOPMSK_H_MASK                  (0xFFFF0000U)\r\n#define SCT_STOP_STOPMSK_H_SHIFT                 (16U)\r\n/*! STOPMSK_H - Stop Event High */\r\n#define SCT_STOP_STOPMSK_H(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_STOP_STOPMSK_H_SHIFT)) & SCT_STOP_STOPMSK_H_MASK)\r\n/*! @} */\r\n\r\n/*! @name STARTL - SCT_STARTL register */\r\n/*! @{ */\r\n\r\n#define SCT_STARTL_STARTL_MASK                   (0xFFFFU)\r\n#define SCT_STARTL_STARTL_SHIFT                  (0U)\r\n#define SCT_STARTL_STARTL(x)                     (((uint16_t)(((uint16_t)(x)) << SCT_STARTL_STARTL_SHIFT)) & SCT_STARTL_STARTL_MASK)\r\n/*! @} */\r\n\r\n/*! @name STARTH - SCT_STARTH register */\r\n/*! @{ */\r\n\r\n#define SCT_STARTH_STARTH_MASK                   (0xFFFFU)\r\n#define SCT_STARTH_STARTH_SHIFT                  (0U)\r\n#define SCT_STARTH_STARTH(x)                     (((uint16_t)(((uint16_t)(x)) << SCT_STARTH_STARTH_SHIFT)) & SCT_STARTH_STARTH_MASK)\r\n/*! @} */\r\n\r\n/*! @name START - Start Event Select */\r\n/*! @{ */\r\n\r\n#define SCT_START_STARTMSK_L_MASK                (0xFFFFU)\r\n#define SCT_START_STARTMSK_L_SHIFT               (0U)\r\n/*! STARTMSK_L - If bit n is one, event n clears the CTRL[STOP_L] = 0 (event 0 = bit 0, event 1 =\r\n *    bit 1, etc.). The number of bits = number of events in this SCT.\r\n */\r\n#define SCT_START_STARTMSK_L(x)                  (((uint32_t)(((uint32_t)(x)) << SCT_START_STARTMSK_L_SHIFT)) & SCT_START_STARTMSK_L_MASK)\r\n\r\n#define SCT_START_STARTMSK_H_MASK                (0xFFFF0000U)\r\n#define SCT_START_STARTMSK_H_SHIFT               (16U)\r\n/*! STARTMSK_H - If bit n is one, event n clears the CTRL[STOP_H] = 0 (event 0 = bit 16, event 1 =\r\n *    bit 17, etc.). The number of bits = number of events in this SCT.\r\n */\r\n#define SCT_START_STARTMSK_H(x)                  (((uint32_t)(((uint32_t)(x)) << SCT_START_STARTMSK_H_SHIFT)) & SCT_START_STARTMSK_H_MASK)\r\n/*! @} */\r\n\r\n/*! @name COUNTL - SCT_COUNTL register */\r\n/*! @{ */\r\n\r\n#define SCT_COUNTL_COUNTL_MASK                   (0xFFFFU)\r\n#define SCT_COUNTL_COUNTL_SHIFT                  (0U)\r\n#define SCT_COUNTL_COUNTL(x)                     (((uint16_t)(((uint16_t)(x)) << SCT_COUNTL_COUNTL_SHIFT)) & SCT_COUNTL_COUNTL_MASK)\r\n/*! @} */\r\n\r\n/*! @name COUNTH - SCT_COUNTH register */\r\n/*! @{ */\r\n\r\n#define SCT_COUNTH_COUNTH_MASK                   (0xFFFFU)\r\n#define SCT_COUNTH_COUNTH_SHIFT                  (0U)\r\n#define SCT_COUNTH_COUNTH(x)                     (((uint16_t)(((uint16_t)(x)) << SCT_COUNTH_COUNTH_SHIFT)) & SCT_COUNTH_COUNTH_MASK)\r\n/*! @} */\r\n\r\n/*! @name COUNT - Counter */\r\n/*! @{ */\r\n\r\n#define SCT_COUNT_CTR_L_MASK                     (0xFFFFU)\r\n#define SCT_COUNT_CTR_L_SHIFT                    (0U)\r\n/*! CTR_L - Counter Low */\r\n#define SCT_COUNT_CTR_L(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_COUNT_CTR_L_SHIFT)) & SCT_COUNT_CTR_L_MASK)\r\n\r\n#define SCT_COUNT_CTR_H_MASK                     (0xFFFF0000U)\r\n#define SCT_COUNT_CTR_H_SHIFT                    (16U)\r\n/*! CTR_H - Counter High */\r\n#define SCT_COUNT_CTR_H(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_COUNT_CTR_H_SHIFT)) & SCT_COUNT_CTR_H_MASK)\r\n/*! @} */\r\n\r\n/*! @name STATEL - SCT_STATEL register */\r\n/*! @{ */\r\n\r\n#define SCT_STATEL_STATEL_MASK                   (0xFFFFU)\r\n#define SCT_STATEL_STATEL_SHIFT                  (0U)\r\n#define SCT_STATEL_STATEL(x)                     (((uint16_t)(((uint16_t)(x)) << SCT_STATEL_STATEL_SHIFT)) & SCT_STATEL_STATEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name STATEH - SCT_STATEH register */\r\n/*! @{ */\r\n\r\n#define SCT_STATEH_STATEH_MASK                   (0xFFFFU)\r\n#define SCT_STATEH_STATEH_SHIFT                  (0U)\r\n#define SCT_STATEH_STATEH(x)                     (((uint16_t)(((uint16_t)(x)) << SCT_STATEH_STATEH_SHIFT)) & SCT_STATEH_STATEH_MASK)\r\n/*! @} */\r\n\r\n/*! @name STATE - State */\r\n/*! @{ */\r\n\r\n#define SCT_STATE_STATE_L_MASK                   (0x1FU)\r\n#define SCT_STATE_STATE_L_SHIFT                  (0U)\r\n/*! STATE_L - State variable */\r\n#define SCT_STATE_STATE_L(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_STATE_STATE_L_SHIFT)) & SCT_STATE_STATE_L_MASK)\r\n\r\n#define SCT_STATE_STATE_H_MASK                   (0x1F0000U)\r\n#define SCT_STATE_STATE_H_SHIFT                  (16U)\r\n/*! STATE_H - State variable */\r\n#define SCT_STATE_STATE_H(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_STATE_STATE_H_SHIFT)) & SCT_STATE_STATE_H_MASK)\r\n/*! @} */\r\n\r\n/*! @name INPUT - Input */\r\n/*! @{ */\r\n\r\n#define SCT_INPUT_AIN0_MASK                      (0x1U)\r\n#define SCT_INPUT_AIN0_SHIFT                     (0U)\r\n/*! AIN0 - Input 0 state. Input 0 state on the last SCT clock edge. */\r\n#define SCT_INPUT_AIN0(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_AIN0_SHIFT)) & SCT_INPUT_AIN0_MASK)\r\n\r\n#define SCT_INPUT_AIN1_MASK                      (0x2U)\r\n#define SCT_INPUT_AIN1_SHIFT                     (1U)\r\n/*! AIN1 - Input 1 state. Input 1 state on the last SCT clock edge. */\r\n#define SCT_INPUT_AIN1(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_AIN1_SHIFT)) & SCT_INPUT_AIN1_MASK)\r\n\r\n#define SCT_INPUT_AIN2_MASK                      (0x4U)\r\n#define SCT_INPUT_AIN2_SHIFT                     (2U)\r\n/*! AIN2 - Input 2 state. Input 2 state on the last SCT clock edge. */\r\n#define SCT_INPUT_AIN2(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_AIN2_SHIFT)) & SCT_INPUT_AIN2_MASK)\r\n\r\n#define SCT_INPUT_AIN3_MASK                      (0x8U)\r\n#define SCT_INPUT_AIN3_SHIFT                     (3U)\r\n/*! AIN3 - Input 3 state. Input 3 state on the last SCT clock edge. */\r\n#define SCT_INPUT_AIN3(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_AIN3_SHIFT)) & SCT_INPUT_AIN3_MASK)\r\n\r\n#define SCT_INPUT_AIN4_MASK                      (0x10U)\r\n#define SCT_INPUT_AIN4_SHIFT                     (4U)\r\n/*! AIN4 - Input 4 state. Input 4 state on the last SCT clock edge. */\r\n#define SCT_INPUT_AIN4(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_AIN4_SHIFT)) & SCT_INPUT_AIN4_MASK)\r\n\r\n#define SCT_INPUT_AIN5_MASK                      (0x20U)\r\n#define SCT_INPUT_AIN5_SHIFT                     (5U)\r\n/*! AIN5 - Input 5 state. Input 5 state on the last SCT clock edge. */\r\n#define SCT_INPUT_AIN5(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_AIN5_SHIFT)) & SCT_INPUT_AIN5_MASK)\r\n\r\n#define SCT_INPUT_AIN6_MASK                      (0x40U)\r\n#define SCT_INPUT_AIN6_SHIFT                     (6U)\r\n/*! AIN6 - Input 6 state. Input 6 state on the last SCT clock edge. */\r\n#define SCT_INPUT_AIN6(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_AIN6_SHIFT)) & SCT_INPUT_AIN6_MASK)\r\n\r\n#define SCT_INPUT_AIN7_MASK                      (0x80U)\r\n#define SCT_INPUT_AIN7_SHIFT                     (7U)\r\n/*! AIN7 - Input 7 state. Input 7 state on the last SCT clock edge. */\r\n#define SCT_INPUT_AIN7(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_AIN7_SHIFT)) & SCT_INPUT_AIN7_MASK)\r\n\r\n#define SCT_INPUT_AIN8_MASK                      (0x100U)\r\n#define SCT_INPUT_AIN8_SHIFT                     (8U)\r\n/*! AIN8 - Input 8 state. Input 8 state on the last SCT clock edge. */\r\n#define SCT_INPUT_AIN8(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_AIN8_SHIFT)) & SCT_INPUT_AIN8_MASK)\r\n\r\n#define SCT_INPUT_AIN9_MASK                      (0x200U)\r\n#define SCT_INPUT_AIN9_SHIFT                     (9U)\r\n/*! AIN9 - Input 9 state. Input 9 state on the last SCT clock edge. */\r\n#define SCT_INPUT_AIN9(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_AIN9_SHIFT)) & SCT_INPUT_AIN9_MASK)\r\n\r\n#define SCT_INPUT_AIN10_MASK                     (0x400U)\r\n#define SCT_INPUT_AIN10_SHIFT                    (10U)\r\n/*! AIN10 - Input 10 state. Input 10 state on the last SCT clock edge. */\r\n#define SCT_INPUT_AIN10(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_AIN10_SHIFT)) & SCT_INPUT_AIN10_MASK)\r\n\r\n#define SCT_INPUT_AIN11_MASK                     (0x800U)\r\n#define SCT_INPUT_AIN11_SHIFT                    (11U)\r\n/*! AIN11 - Input 11 state. Input 11 state on the last SCT clock edge. */\r\n#define SCT_INPUT_AIN11(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_AIN11_SHIFT)) & SCT_INPUT_AIN11_MASK)\r\n\r\n#define SCT_INPUT_AIN12_MASK                     (0x1000U)\r\n#define SCT_INPUT_AIN12_SHIFT                    (12U)\r\n/*! AIN12 - Input 12 state. Input 12 state on the last SCT clock edge. */\r\n#define SCT_INPUT_AIN12(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_AIN12_SHIFT)) & SCT_INPUT_AIN12_MASK)\r\n\r\n#define SCT_INPUT_AIN13_MASK                     (0x2000U)\r\n#define SCT_INPUT_AIN13_SHIFT                    (13U)\r\n/*! AIN13 - Input 13 state. Input 13 state on the last SCT clock edge. */\r\n#define SCT_INPUT_AIN13(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_AIN13_SHIFT)) & SCT_INPUT_AIN13_MASK)\r\n\r\n#define SCT_INPUT_AIN14_MASK                     (0x4000U)\r\n#define SCT_INPUT_AIN14_SHIFT                    (14U)\r\n/*! AIN14 - Input 14 state. Input 14 state on the last SCT clock edge. */\r\n#define SCT_INPUT_AIN14(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_AIN14_SHIFT)) & SCT_INPUT_AIN14_MASK)\r\n\r\n#define SCT_INPUT_AIN15_MASK                     (0x8000U)\r\n#define SCT_INPUT_AIN15_SHIFT                    (15U)\r\n/*! AIN15 - Input 15 state. Input 15 state on the last SCT clock edge. */\r\n#define SCT_INPUT_AIN15(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_AIN15_SHIFT)) & SCT_INPUT_AIN15_MASK)\r\n\r\n#define SCT_INPUT_SIN0_MASK                      (0x10000U)\r\n#define SCT_INPUT_SIN0_SHIFT                     (16U)\r\n/*! SIN0 - Input 0 state. Input 0 state following the synchronization specified by INSYNC. */\r\n#define SCT_INPUT_SIN0(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_SIN0_SHIFT)) & SCT_INPUT_SIN0_MASK)\r\n\r\n#define SCT_INPUT_SIN1_MASK                      (0x20000U)\r\n#define SCT_INPUT_SIN1_SHIFT                     (17U)\r\n/*! SIN1 - Input 1 state. Input 1 state following the synchronization specified by INSYNC. */\r\n#define SCT_INPUT_SIN1(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_SIN1_SHIFT)) & SCT_INPUT_SIN1_MASK)\r\n\r\n#define SCT_INPUT_SIN2_MASK                      (0x40000U)\r\n#define SCT_INPUT_SIN2_SHIFT                     (18U)\r\n/*! SIN2 - Input 2 state. Input 2 state following the synchronization specified by INSYNC. */\r\n#define SCT_INPUT_SIN2(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_SIN2_SHIFT)) & SCT_INPUT_SIN2_MASK)\r\n\r\n#define SCT_INPUT_SIN3_MASK                      (0x80000U)\r\n#define SCT_INPUT_SIN3_SHIFT                     (19U)\r\n/*! SIN3 - Input 3 state. Input 3 state following the synchronization specified by INSYNC. */\r\n#define SCT_INPUT_SIN3(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_SIN3_SHIFT)) & SCT_INPUT_SIN3_MASK)\r\n\r\n#define SCT_INPUT_SIN4_MASK                      (0x100000U)\r\n#define SCT_INPUT_SIN4_SHIFT                     (20U)\r\n/*! SIN4 - Input 4 state. Input 4 state following the synchronization specified by INSYNC. */\r\n#define SCT_INPUT_SIN4(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_SIN4_SHIFT)) & SCT_INPUT_SIN4_MASK)\r\n\r\n#define SCT_INPUT_SIN5_MASK                      (0x200000U)\r\n#define SCT_INPUT_SIN5_SHIFT                     (21U)\r\n/*! SIN5 - Input 5 state. Input 5 state following the synchronization specified by INSYNC. */\r\n#define SCT_INPUT_SIN5(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_SIN5_SHIFT)) & SCT_INPUT_SIN5_MASK)\r\n\r\n#define SCT_INPUT_SIN6_MASK                      (0x400000U)\r\n#define SCT_INPUT_SIN6_SHIFT                     (22U)\r\n/*! SIN6 - Input 6 state. Input 6 state following the synchronization specified by INSYNC. */\r\n#define SCT_INPUT_SIN6(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_SIN6_SHIFT)) & SCT_INPUT_SIN6_MASK)\r\n\r\n#define SCT_INPUT_SIN7_MASK                      (0x800000U)\r\n#define SCT_INPUT_SIN7_SHIFT                     (23U)\r\n/*! SIN7 - Input 7 state. Input 7 state following the synchronization specified by INSYNC. */\r\n#define SCT_INPUT_SIN7(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_SIN7_SHIFT)) & SCT_INPUT_SIN7_MASK)\r\n\r\n#define SCT_INPUT_SIN8_MASK                      (0x1000000U)\r\n#define SCT_INPUT_SIN8_SHIFT                     (24U)\r\n/*! SIN8 - Input 8 state. Input 8 state following the synchronization specified by INSYNC. */\r\n#define SCT_INPUT_SIN8(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_SIN8_SHIFT)) & SCT_INPUT_SIN8_MASK)\r\n\r\n#define SCT_INPUT_SIN9_MASK                      (0x2000000U)\r\n#define SCT_INPUT_SIN9_SHIFT                     (25U)\r\n/*! SIN9 - Input 9 state. Input 9 state following the synchronization specified by INSYNC. */\r\n#define SCT_INPUT_SIN9(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_SIN9_SHIFT)) & SCT_INPUT_SIN9_MASK)\r\n\r\n#define SCT_INPUT_SIN10_MASK                     (0x4000000U)\r\n#define SCT_INPUT_SIN10_SHIFT                    (26U)\r\n/*! SIN10 - Input 10 state. Input 10 state following the synchronization specified by INSYNC. */\r\n#define SCT_INPUT_SIN10(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_SIN10_SHIFT)) & SCT_INPUT_SIN10_MASK)\r\n\r\n#define SCT_INPUT_SIN11_MASK                     (0x8000000U)\r\n#define SCT_INPUT_SIN11_SHIFT                    (27U)\r\n/*! SIN11 - Input 11 state. Input 11 state following the synchronization specified by INSYNC. */\r\n#define SCT_INPUT_SIN11(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_SIN11_SHIFT)) & SCT_INPUT_SIN11_MASK)\r\n\r\n#define SCT_INPUT_SIN12_MASK                     (0x10000000U)\r\n#define SCT_INPUT_SIN12_SHIFT                    (28U)\r\n/*! SIN12 - Input 12 state. Input 12 state following the synchronization specified by INSYNC. */\r\n#define SCT_INPUT_SIN12(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_SIN12_SHIFT)) & SCT_INPUT_SIN12_MASK)\r\n\r\n#define SCT_INPUT_SIN13_MASK                     (0x20000000U)\r\n#define SCT_INPUT_SIN13_SHIFT                    (29U)\r\n/*! SIN13 - Input 13 state. Input 13 state following the synchronization specified by INSYNC. */\r\n#define SCT_INPUT_SIN13(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_SIN13_SHIFT)) & SCT_INPUT_SIN13_MASK)\r\n\r\n#define SCT_INPUT_SIN14_MASK                     (0x40000000U)\r\n#define SCT_INPUT_SIN14_SHIFT                    (30U)\r\n/*! SIN14 - Input 14 state. Input 14 state following the synchronization specified by INSYNC. */\r\n#define SCT_INPUT_SIN14(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_SIN14_SHIFT)) & SCT_INPUT_SIN14_MASK)\r\n\r\n#define SCT_INPUT_SIN15_MASK                     (0x80000000U)\r\n#define SCT_INPUT_SIN15_SHIFT                    (31U)\r\n/*! SIN15 - Input 15 state. Input 15 state following the synchronization specified by INSYNC. */\r\n#define SCT_INPUT_SIN15(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_INPUT_SIN15_SHIFT)) & SCT_INPUT_SIN15_MASK)\r\n/*! @} */\r\n\r\n/*! @name REGMODEL - SCT_REGMODEL register */\r\n/*! @{ */\r\n\r\n#define SCT_REGMODEL_REGMODEL_MASK               (0xFFFFU)\r\n#define SCT_REGMODEL_REGMODEL_SHIFT              (0U)\r\n/*! REGMODEL\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODEL_REGMODEL(x)                 (((uint16_t)(((uint16_t)(x)) << SCT_REGMODEL_REGMODEL_SHIFT)) & SCT_REGMODEL_REGMODEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name REGMODEH - SCT_REGMODEH register */\r\n/*! @{ */\r\n\r\n#define SCT_REGMODEH_REGMODEH_MASK               (0xFFFFU)\r\n#define SCT_REGMODEH_REGMODEH_SHIFT              (0U)\r\n/*! REGMODEH\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODEH_REGMODEH(x)                 (((uint16_t)(((uint16_t)(x)) << SCT_REGMODEH_REGMODEH_SHIFT)) & SCT_REGMODEH_REGMODEH_MASK)\r\n/*! @} */\r\n\r\n/*! @name REGMODE - Match/Capture Mode */\r\n/*! @{ */\r\n\r\n#define SCT_REGMODE_REGMOD_L0_MASK               (0x1U)\r\n#define SCT_REGMODE_REGMOD_L0_SHIFT              (0U)\r\n/*! REGMOD_L0 - Register Mode Low n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_L0(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_L0_SHIFT)) & SCT_REGMODE_REGMOD_L0_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_L1_MASK               (0x2U)\r\n#define SCT_REGMODE_REGMOD_L1_SHIFT              (1U)\r\n/*! REGMOD_L1 - Register Mode Low n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_L1(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_L1_SHIFT)) & SCT_REGMODE_REGMOD_L1_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_L2_MASK               (0x4U)\r\n#define SCT_REGMODE_REGMOD_L2_SHIFT              (2U)\r\n/*! REGMOD_L2 - Register Mode Low n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_L2(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_L2_SHIFT)) & SCT_REGMODE_REGMOD_L2_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_L3_MASK               (0x8U)\r\n#define SCT_REGMODE_REGMOD_L3_SHIFT              (3U)\r\n/*! REGMOD_L3 - Register Mode Low n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_L3(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_L3_SHIFT)) & SCT_REGMODE_REGMOD_L3_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_L4_MASK               (0x10U)\r\n#define SCT_REGMODE_REGMOD_L4_SHIFT              (4U)\r\n/*! REGMOD_L4 - Register Mode Low n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_L4(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_L4_SHIFT)) & SCT_REGMODE_REGMOD_L4_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_L5_MASK               (0x20U)\r\n#define SCT_REGMODE_REGMOD_L5_SHIFT              (5U)\r\n/*! REGMOD_L5 - Register Mode Low n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_L5(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_L5_SHIFT)) & SCT_REGMODE_REGMOD_L5_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_L6_MASK               (0x40U)\r\n#define SCT_REGMODE_REGMOD_L6_SHIFT              (6U)\r\n/*! REGMOD_L6 - Register Mode Low n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_L6(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_L6_SHIFT)) & SCT_REGMODE_REGMOD_L6_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_L7_MASK               (0x80U)\r\n#define SCT_REGMODE_REGMOD_L7_SHIFT              (7U)\r\n/*! REGMOD_L7 - Register Mode Low n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_L7(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_L7_SHIFT)) & SCT_REGMODE_REGMOD_L7_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_L8_MASK               (0x100U)\r\n#define SCT_REGMODE_REGMOD_L8_SHIFT              (8U)\r\n/*! REGMOD_L8 - Register Mode Low n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_L8(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_L8_SHIFT)) & SCT_REGMODE_REGMOD_L8_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_L9_MASK               (0x200U)\r\n#define SCT_REGMODE_REGMOD_L9_SHIFT              (9U)\r\n/*! REGMOD_L9 - Register Mode Low n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_L9(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_L9_SHIFT)) & SCT_REGMODE_REGMOD_L9_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_L10_MASK              (0x400U)\r\n#define SCT_REGMODE_REGMOD_L10_SHIFT             (10U)\r\n/*! REGMOD_L10 - Register Mode Low n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_L10(x)                (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_L10_SHIFT)) & SCT_REGMODE_REGMOD_L10_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_L11_MASK              (0x800U)\r\n#define SCT_REGMODE_REGMOD_L11_SHIFT             (11U)\r\n/*! REGMOD_L11 - Register Mode Low n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_L11(x)                (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_L11_SHIFT)) & SCT_REGMODE_REGMOD_L11_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_L12_MASK              (0x1000U)\r\n#define SCT_REGMODE_REGMOD_L12_SHIFT             (12U)\r\n/*! REGMOD_L12 - Register Mode Low n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_L12(x)                (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_L12_SHIFT)) & SCT_REGMODE_REGMOD_L12_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_L13_MASK              (0x2000U)\r\n#define SCT_REGMODE_REGMOD_L13_SHIFT             (13U)\r\n/*! REGMOD_L13 - Register Mode Low n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_L13(x)                (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_L13_SHIFT)) & SCT_REGMODE_REGMOD_L13_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_L14_MASK              (0x4000U)\r\n#define SCT_REGMODE_REGMOD_L14_SHIFT             (14U)\r\n/*! REGMOD_L14 - Register Mode Low n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_L14(x)                (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_L14_SHIFT)) & SCT_REGMODE_REGMOD_L14_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_L15_MASK              (0x8000U)\r\n#define SCT_REGMODE_REGMOD_L15_SHIFT             (15U)\r\n/*! REGMOD_L15 - Register Mode Low n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_L15(x)                (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_L15_SHIFT)) & SCT_REGMODE_REGMOD_L15_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_H0_MASK               (0x10000U)\r\n#define SCT_REGMODE_REGMOD_H0_SHIFT              (16U)\r\n/*! REGMOD_H0 - Register Mode High n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_H0(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_H0_SHIFT)) & SCT_REGMODE_REGMOD_H0_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_H1_MASK               (0x20000U)\r\n#define SCT_REGMODE_REGMOD_H1_SHIFT              (17U)\r\n/*! REGMOD_H1 - Register Mode High n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_H1(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_H1_SHIFT)) & SCT_REGMODE_REGMOD_H1_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_H2_MASK               (0x40000U)\r\n#define SCT_REGMODE_REGMOD_H2_SHIFT              (18U)\r\n/*! REGMOD_H2 - Register Mode High n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_H2(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_H2_SHIFT)) & SCT_REGMODE_REGMOD_H2_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_H3_MASK               (0x80000U)\r\n#define SCT_REGMODE_REGMOD_H3_SHIFT              (19U)\r\n/*! REGMOD_H3 - Register Mode High n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_H3(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_H3_SHIFT)) & SCT_REGMODE_REGMOD_H3_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_H4_MASK               (0x100000U)\r\n#define SCT_REGMODE_REGMOD_H4_SHIFT              (20U)\r\n/*! REGMOD_H4 - Register Mode High n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_H4(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_H4_SHIFT)) & SCT_REGMODE_REGMOD_H4_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_H5_MASK               (0x200000U)\r\n#define SCT_REGMODE_REGMOD_H5_SHIFT              (21U)\r\n/*! REGMOD_H5 - Register Mode High n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_H5(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_H5_SHIFT)) & SCT_REGMODE_REGMOD_H5_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_H6_MASK               (0x400000U)\r\n#define SCT_REGMODE_REGMOD_H6_SHIFT              (22U)\r\n/*! REGMOD_H6 - Register Mode High n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_H6(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_H6_SHIFT)) & SCT_REGMODE_REGMOD_H6_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_H7_MASK               (0x800000U)\r\n#define SCT_REGMODE_REGMOD_H7_SHIFT              (23U)\r\n/*! REGMOD_H7 - Register Mode High n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_H7(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_H7_SHIFT)) & SCT_REGMODE_REGMOD_H7_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_H8_MASK               (0x1000000U)\r\n#define SCT_REGMODE_REGMOD_H8_SHIFT              (24U)\r\n/*! REGMOD_H8 - Register Mode High n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_H8(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_H8_SHIFT)) & SCT_REGMODE_REGMOD_H8_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_H9_MASK               (0x2000000U)\r\n#define SCT_REGMODE_REGMOD_H9_SHIFT              (25U)\r\n/*! REGMOD_H9 - Register Mode High n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_H9(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_H9_SHIFT)) & SCT_REGMODE_REGMOD_H9_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_H10_MASK              (0x4000000U)\r\n#define SCT_REGMODE_REGMOD_H10_SHIFT             (26U)\r\n/*! REGMOD_H10 - Register Mode High n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_H10(x)                (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_H10_SHIFT)) & SCT_REGMODE_REGMOD_H10_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_H11_MASK              (0x8000000U)\r\n#define SCT_REGMODE_REGMOD_H11_SHIFT             (27U)\r\n/*! REGMOD_H11 - Register Mode High n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_H11(x)                (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_H11_SHIFT)) & SCT_REGMODE_REGMOD_H11_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_H12_MASK              (0x10000000U)\r\n#define SCT_REGMODE_REGMOD_H12_SHIFT             (28U)\r\n/*! REGMOD_H12 - Register Mode High n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_H12(x)                (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_H12_SHIFT)) & SCT_REGMODE_REGMOD_H12_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_H13_MASK              (0x20000000U)\r\n#define SCT_REGMODE_REGMOD_H13_SHIFT             (29U)\r\n/*! REGMOD_H13 - Register Mode High n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_H13(x)                (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_H13_SHIFT)) & SCT_REGMODE_REGMOD_H13_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_H14_MASK              (0x40000000U)\r\n#define SCT_REGMODE_REGMOD_H14_SHIFT             (30U)\r\n/*! REGMOD_H14 - Register Mode High n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_H14(x)                (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_H14_SHIFT)) & SCT_REGMODE_REGMOD_H14_MASK)\r\n\r\n#define SCT_REGMODE_REGMOD_H15_MASK              (0x80000000U)\r\n#define SCT_REGMODE_REGMOD_H15_SHIFT             (31U)\r\n/*! REGMOD_H15 - Register Mode High n\r\n *  0b0..Match. Register n operates as a match register\r\n *  0b1..Capture. Register n operates as a capture register\r\n */\r\n#define SCT_REGMODE_REGMOD_H15(x)                (((uint32_t)(((uint32_t)(x)) << SCT_REGMODE_REGMOD_H15_SHIFT)) & SCT_REGMODE_REGMOD_H15_MASK)\r\n/*! @} */\r\n\r\n/*! @name OUTPUT - Output */\r\n/*! @{ */\r\n\r\n#define SCT_OUTPUT_OUT0_MASK                     (0x1U)\r\n#define SCT_OUTPUT_OUT0_SHIFT                    (0U)\r\n/*! OUT0 - Output n\r\n *  0b0..Writing a 0 forces the corresponding output low\r\n *  0b1..Writing a 1 forces the corresponding output high\r\n */\r\n#define SCT_OUTPUT_OUT0(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_OUTPUT_OUT0_SHIFT)) & SCT_OUTPUT_OUT0_MASK)\r\n\r\n#define SCT_OUTPUT_OUT1_MASK                     (0x2U)\r\n#define SCT_OUTPUT_OUT1_SHIFT                    (1U)\r\n/*! OUT1 - Output n\r\n *  0b0..Writing a 0 forces the corresponding output low\r\n *  0b1..Writing a 1 forces the corresponding output high\r\n */\r\n#define SCT_OUTPUT_OUT1(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_OUTPUT_OUT1_SHIFT)) & SCT_OUTPUT_OUT1_MASK)\r\n\r\n#define SCT_OUTPUT_OUT2_MASK                     (0x4U)\r\n#define SCT_OUTPUT_OUT2_SHIFT                    (2U)\r\n/*! OUT2 - Output n\r\n *  0b0..Writing a 0 forces the corresponding output low\r\n *  0b1..Writing a 1 forces the corresponding output high\r\n */\r\n#define SCT_OUTPUT_OUT2(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_OUTPUT_OUT2_SHIFT)) & SCT_OUTPUT_OUT2_MASK)\r\n\r\n#define SCT_OUTPUT_OUT3_MASK                     (0x8U)\r\n#define SCT_OUTPUT_OUT3_SHIFT                    (3U)\r\n/*! OUT3 - Output n\r\n *  0b0..Writing a 0 forces the corresponding output low\r\n *  0b1..Writing a 1 forces the corresponding output high\r\n */\r\n#define SCT_OUTPUT_OUT3(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_OUTPUT_OUT3_SHIFT)) & SCT_OUTPUT_OUT3_MASK)\r\n\r\n#define SCT_OUTPUT_OUT4_MASK                     (0x10U)\r\n#define SCT_OUTPUT_OUT4_SHIFT                    (4U)\r\n/*! OUT4 - Output n\r\n *  0b0..Writing a 0 forces the corresponding output low\r\n *  0b1..Writing a 1 forces the corresponding output high\r\n */\r\n#define SCT_OUTPUT_OUT4(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_OUTPUT_OUT4_SHIFT)) & SCT_OUTPUT_OUT4_MASK)\r\n\r\n#define SCT_OUTPUT_OUT5_MASK                     (0x20U)\r\n#define SCT_OUTPUT_OUT5_SHIFT                    (5U)\r\n/*! OUT5 - Output n\r\n *  0b0..Writing a 0 forces the corresponding output low\r\n *  0b1..Writing a 1 forces the corresponding output high\r\n */\r\n#define SCT_OUTPUT_OUT5(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_OUTPUT_OUT5_SHIFT)) & SCT_OUTPUT_OUT5_MASK)\r\n\r\n#define SCT_OUTPUT_OUT6_MASK                     (0x40U)\r\n#define SCT_OUTPUT_OUT6_SHIFT                    (6U)\r\n/*! OUT6 - Output n\r\n *  0b0..Writing a 0 forces the corresponding output low\r\n *  0b1..Writing a 1 forces the corresponding output high\r\n */\r\n#define SCT_OUTPUT_OUT6(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_OUTPUT_OUT6_SHIFT)) & SCT_OUTPUT_OUT6_MASK)\r\n\r\n#define SCT_OUTPUT_OUT7_MASK                     (0x80U)\r\n#define SCT_OUTPUT_OUT7_SHIFT                    (7U)\r\n/*! OUT7 - Output n\r\n *  0b0..Writing a 0 forces the corresponding output low\r\n *  0b1..Writing a 1 forces the corresponding output high\r\n */\r\n#define SCT_OUTPUT_OUT7(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_OUTPUT_OUT7_SHIFT)) & SCT_OUTPUT_OUT7_MASK)\r\n\r\n#define SCT_OUTPUT_OUT8_MASK                     (0x100U)\r\n#define SCT_OUTPUT_OUT8_SHIFT                    (8U)\r\n/*! OUT8 - Output n\r\n *  0b0..Writing a 0 forces the corresponding output low\r\n *  0b1..Writing a 1 forces the corresponding output high\r\n */\r\n#define SCT_OUTPUT_OUT8(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_OUTPUT_OUT8_SHIFT)) & SCT_OUTPUT_OUT8_MASK)\r\n\r\n#define SCT_OUTPUT_OUT9_MASK                     (0x200U)\r\n#define SCT_OUTPUT_OUT9_SHIFT                    (9U)\r\n/*! OUT9 - Output n\r\n *  0b0..Writing a 0 forces the corresponding output low\r\n *  0b1..Writing a 1 forces the corresponding output high\r\n */\r\n#define SCT_OUTPUT_OUT9(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_OUTPUT_OUT9_SHIFT)) & SCT_OUTPUT_OUT9_MASK)\r\n/*! @} */\r\n\r\n/*! @name OUTPUTDIRCTRL - Output Counter Direction Control */\r\n/*! @{ */\r\n\r\n#define SCT_OUTPUTDIRCTRL_SETCLR0_MASK           (0x3U)\r\n#define SCT_OUTPUTDIRCTRL_SETCLR0_SHIFT          (0U)\r\n/*! SETCLR0 - Set/Clear Operation on Output n\r\n *  0b00..Set and clear do not depend on the direction of any counter.\r\n *  0b01..Set and clear are reversed when counter L or the unified counter is counting down.\r\n *  0b10..Set and clear are reversed when counter H is counting down. Do not use if UNIFY = 1.\r\n *  0b11..Reserved. Do not program this value.\r\n */\r\n#define SCT_OUTPUTDIRCTRL_SETCLR0(x)             (((uint32_t)(((uint32_t)(x)) << SCT_OUTPUTDIRCTRL_SETCLR0_SHIFT)) & SCT_OUTPUTDIRCTRL_SETCLR0_MASK)\r\n\r\n#define SCT_OUTPUTDIRCTRL_SETCLR1_MASK           (0xCU)\r\n#define SCT_OUTPUTDIRCTRL_SETCLR1_SHIFT          (2U)\r\n/*! SETCLR1 - Set/Clear Operation on Output n\r\n *  0b00..Set and clear do not depend on the direction of any counter.\r\n *  0b01..Set and clear are reversed when counter L or the unified counter is counting down.\r\n *  0b10..Set and clear are reversed when counter H is counting down. Do not use if UNIFY = 1.\r\n *  0b11..Reserved. Do not program this value.\r\n */\r\n#define SCT_OUTPUTDIRCTRL_SETCLR1(x)             (((uint32_t)(((uint32_t)(x)) << SCT_OUTPUTDIRCTRL_SETCLR1_SHIFT)) & SCT_OUTPUTDIRCTRL_SETCLR1_MASK)\r\n\r\n#define SCT_OUTPUTDIRCTRL_SETCLR2_MASK           (0x30U)\r\n#define SCT_OUTPUTDIRCTRL_SETCLR2_SHIFT          (4U)\r\n/*! SETCLR2 - Set/Clear Operation on Output n\r\n *  0b00..Set and clear do not depend on the direction of any counter.\r\n *  0b01..Set and clear are reversed when counter L or the unified counter is counting down.\r\n *  0b10..Set and clear are reversed when counter H is counting down. Do not use if UNIFY = 1.\r\n *  0b11..Reserved. Do not program this value.\r\n */\r\n#define SCT_OUTPUTDIRCTRL_SETCLR2(x)             (((uint32_t)(((uint32_t)(x)) << SCT_OUTPUTDIRCTRL_SETCLR2_SHIFT)) & SCT_OUTPUTDIRCTRL_SETCLR2_MASK)\r\n\r\n#define SCT_OUTPUTDIRCTRL_SETCLR3_MASK           (0xC0U)\r\n#define SCT_OUTPUTDIRCTRL_SETCLR3_SHIFT          (6U)\r\n/*! SETCLR3 - Set/Clear Operation on Output n\r\n *  0b00..Set and clear do not depend on the direction of any counter.\r\n *  0b01..Set and clear are reversed when counter L or the unified counter is counting down.\r\n *  0b10..Set and clear are reversed when counter H is counting down. Do not use if UNIFY = 1.\r\n *  0b11..Reserved. Do not program this value.\r\n */\r\n#define SCT_OUTPUTDIRCTRL_SETCLR3(x)             (((uint32_t)(((uint32_t)(x)) << SCT_OUTPUTDIRCTRL_SETCLR3_SHIFT)) & SCT_OUTPUTDIRCTRL_SETCLR3_MASK)\r\n\r\n#define SCT_OUTPUTDIRCTRL_SETCLR4_MASK           (0x300U)\r\n#define SCT_OUTPUTDIRCTRL_SETCLR4_SHIFT          (8U)\r\n/*! SETCLR4 - Set/Clear Operation on Output n\r\n *  0b00..Set and clear do not depend on the direction of any counter.\r\n *  0b01..Set and clear are reversed when counter L or the unified counter is counting down.\r\n *  0b10..Set and clear are reversed when counter H is counting down. Do not use if UNIFY = 1.\r\n *  0b11..Reserved. Do not program this value.\r\n */\r\n#define SCT_OUTPUTDIRCTRL_SETCLR4(x)             (((uint32_t)(((uint32_t)(x)) << SCT_OUTPUTDIRCTRL_SETCLR4_SHIFT)) & SCT_OUTPUTDIRCTRL_SETCLR4_MASK)\r\n\r\n#define SCT_OUTPUTDIRCTRL_SETCLR5_MASK           (0xC00U)\r\n#define SCT_OUTPUTDIRCTRL_SETCLR5_SHIFT          (10U)\r\n/*! SETCLR5 - Set/Clear Operation on Output n\r\n *  0b00..Set and clear do not depend on the direction of any counter.\r\n *  0b01..Set and clear are reversed when counter L or the unified counter is counting down.\r\n *  0b10..Set and clear are reversed when counter H is counting down. Do not use if UNIFY = 1.\r\n *  0b11..Reserved. Do not program this value.\r\n */\r\n#define SCT_OUTPUTDIRCTRL_SETCLR5(x)             (((uint32_t)(((uint32_t)(x)) << SCT_OUTPUTDIRCTRL_SETCLR5_SHIFT)) & SCT_OUTPUTDIRCTRL_SETCLR5_MASK)\r\n\r\n#define SCT_OUTPUTDIRCTRL_SETCLR6_MASK           (0x3000U)\r\n#define SCT_OUTPUTDIRCTRL_SETCLR6_SHIFT          (12U)\r\n/*! SETCLR6 - Set/Clear Operation on Output n\r\n *  0b00..Set and clear do not depend on the direction of any counter.\r\n *  0b01..Set and clear are reversed when counter L or the unified counter is counting down.\r\n *  0b10..Set and clear are reversed when counter H is counting down. Do not use if UNIFY = 1.\r\n *  0b11..Reserved. Do not program this value.\r\n */\r\n#define SCT_OUTPUTDIRCTRL_SETCLR6(x)             (((uint32_t)(((uint32_t)(x)) << SCT_OUTPUTDIRCTRL_SETCLR6_SHIFT)) & SCT_OUTPUTDIRCTRL_SETCLR6_MASK)\r\n\r\n#define SCT_OUTPUTDIRCTRL_SETCLR7_MASK           (0xC000U)\r\n#define SCT_OUTPUTDIRCTRL_SETCLR7_SHIFT          (14U)\r\n/*! SETCLR7 - Set/Clear Operation on Output n\r\n *  0b00..Set and clear do not depend on the direction of any counter.\r\n *  0b01..Set and clear are reversed when counter L or the unified counter is counting down.\r\n *  0b10..Set and clear are reversed when counter H is counting down. Do not use if UNIFY = 1.\r\n *  0b11..Reserved. Do not program this value.\r\n */\r\n#define SCT_OUTPUTDIRCTRL_SETCLR7(x)             (((uint32_t)(((uint32_t)(x)) << SCT_OUTPUTDIRCTRL_SETCLR7_SHIFT)) & SCT_OUTPUTDIRCTRL_SETCLR7_MASK)\r\n\r\n#define SCT_OUTPUTDIRCTRL_SETCLR8_MASK           (0x30000U)\r\n#define SCT_OUTPUTDIRCTRL_SETCLR8_SHIFT          (16U)\r\n/*! SETCLR8 - Set/Clear Operation on Output n\r\n *  0b00..Set and clear do not depend on the direction of any counter.\r\n *  0b01..Set and clear are reversed when counter L or the unified counter is counting down.\r\n *  0b10..Set and clear are reversed when counter H is counting down. Do not use if UNIFY = 1.\r\n *  0b11..Reserved. Do not program this value.\r\n */\r\n#define SCT_OUTPUTDIRCTRL_SETCLR8(x)             (((uint32_t)(((uint32_t)(x)) << SCT_OUTPUTDIRCTRL_SETCLR8_SHIFT)) & SCT_OUTPUTDIRCTRL_SETCLR8_MASK)\r\n\r\n#define SCT_OUTPUTDIRCTRL_SETCLR9_MASK           (0xC0000U)\r\n#define SCT_OUTPUTDIRCTRL_SETCLR9_SHIFT          (18U)\r\n/*! SETCLR9 - Set/Clear Operation on Output n\r\n *  0b00..Set and clear do not depend on the direction of any counter.\r\n *  0b01..Set and clear are reversed when counter L or the unified counter is counting down.\r\n *  0b10..Set and clear are reversed when counter H is counting down. Do not use if UNIFY = 1.\r\n *  0b11..Reserved. Do not program this value.\r\n */\r\n#define SCT_OUTPUTDIRCTRL_SETCLR9(x)             (((uint32_t)(((uint32_t)(x)) << SCT_OUTPUTDIRCTRL_SETCLR9_SHIFT)) & SCT_OUTPUTDIRCTRL_SETCLR9_MASK)\r\n/*! @} */\r\n\r\n/*! @name RES - Output Conflict Resolution */\r\n/*! @{ */\r\n\r\n#define SCT_RES_O0RES_MASK                       (0x3U)\r\n#define SCT_RES_O0RES_SHIFT                      (0U)\r\n/*! O0RES - Effect of simultaneous set and clear on output n\r\n *  0b00..No change\r\n *  0b01..Set output (or clear based on the OUTPUTDIRCTRL[SETCLRn] field)\r\n *  0b10..Clear output (or set based on the OUTPUTDIRCTRL[SETCLRn] field)\r\n *  0b11..Toggle output\r\n */\r\n#define SCT_RES_O0RES(x)                         (((uint32_t)(((uint32_t)(x)) << SCT_RES_O0RES_SHIFT)) & SCT_RES_O0RES_MASK)\r\n\r\n#define SCT_RES_O1RES_MASK                       (0xCU)\r\n#define SCT_RES_O1RES_SHIFT                      (2U)\r\n/*! O1RES - Effect of simultaneous set and clear on output n\r\n *  0b00..No change\r\n *  0b01..Set output (or clear based on the OUTPUTDIRCTRL[SETCLRn] field)\r\n *  0b10..Clear output (or set based on the OUTPUTDIRCTRL[SETCLRn] field)\r\n *  0b11..Toggle output\r\n */\r\n#define SCT_RES_O1RES(x)                         (((uint32_t)(((uint32_t)(x)) << SCT_RES_O1RES_SHIFT)) & SCT_RES_O1RES_MASK)\r\n\r\n#define SCT_RES_O2RES_MASK                       (0x30U)\r\n#define SCT_RES_O2RES_SHIFT                      (4U)\r\n/*! O2RES - Effect of simultaneous set and clear on output n\r\n *  0b00..No change\r\n *  0b01..Set output (or clear based on the OUTPUTDIRCTRL[SETCLRn] field)\r\n *  0b10..Clear output (or set based on the OUTPUTDIRCTRL[SETCLRn] field)\r\n *  0b11..Toggle output\r\n */\r\n#define SCT_RES_O2RES(x)                         (((uint32_t)(((uint32_t)(x)) << SCT_RES_O2RES_SHIFT)) & SCT_RES_O2RES_MASK)\r\n\r\n#define SCT_RES_O3RES_MASK                       (0xC0U)\r\n#define SCT_RES_O3RES_SHIFT                      (6U)\r\n/*! O3RES - Effect of simultaneous set and clear on output n\r\n *  0b00..No change\r\n *  0b01..Set output (or clear based on the OUTPUTDIRCTRL[SETCLRn] field)\r\n *  0b10..Clear output (or set based on the OUTPUTDIRCTRL[SETCLRn] field)\r\n *  0b11..Toggle output\r\n */\r\n#define SCT_RES_O3RES(x)                         (((uint32_t)(((uint32_t)(x)) << SCT_RES_O3RES_SHIFT)) & SCT_RES_O3RES_MASK)\r\n\r\n#define SCT_RES_O4RES_MASK                       (0x300U)\r\n#define SCT_RES_O4RES_SHIFT                      (8U)\r\n/*! O4RES - Effect of simultaneous set and clear on output n\r\n *  0b00..No change\r\n *  0b01..Set output (or clear based on the OUTPUTDIRCTRL[SETCLRn] field)\r\n *  0b10..Clear output (or set based on the OUTPUTDIRCTRL[SETCLRn] field)\r\n *  0b11..Toggle output\r\n */\r\n#define SCT_RES_O4RES(x)                         (((uint32_t)(((uint32_t)(x)) << SCT_RES_O4RES_SHIFT)) & SCT_RES_O4RES_MASK)\r\n\r\n#define SCT_RES_O5RES_MASK                       (0xC00U)\r\n#define SCT_RES_O5RES_SHIFT                      (10U)\r\n/*! O5RES - Effect of simultaneous set and clear on output n\r\n *  0b00..No change\r\n *  0b01..Set output (or clear based on the OUTPUTDIRCTRL[SETCLRn] field)\r\n *  0b10..Clear output (or set based on the OUTPUTDIRCTRL[SETCLRn] field)\r\n *  0b11..Toggle output\r\n */\r\n#define SCT_RES_O5RES(x)                         (((uint32_t)(((uint32_t)(x)) << SCT_RES_O5RES_SHIFT)) & SCT_RES_O5RES_MASK)\r\n\r\n#define SCT_RES_O6RES_MASK                       (0x3000U)\r\n#define SCT_RES_O6RES_SHIFT                      (12U)\r\n/*! O6RES - Effect of simultaneous set and clear on output n\r\n *  0b00..No change\r\n *  0b01..Set output (or clear based on the OUTPUTDIRCTRL[SETCLRn] field)\r\n *  0b10..Clear output (or set based on the OUTPUTDIRCTRL[SETCLRn] field)\r\n *  0b11..Toggle output\r\n */\r\n#define SCT_RES_O6RES(x)                         (((uint32_t)(((uint32_t)(x)) << SCT_RES_O6RES_SHIFT)) & SCT_RES_O6RES_MASK)\r\n\r\n#define SCT_RES_O7RES_MASK                       (0xC000U)\r\n#define SCT_RES_O7RES_SHIFT                      (14U)\r\n/*! O7RES - Effect of simultaneous set and clear on output n\r\n *  0b00..No change\r\n *  0b01..Set output (or clear based on the OUTPUTDIRCTRL[SETCLRn] field)\r\n *  0b10..Clear output (or set based on the OUTPUTDIRCTRL[SETCLRn] field)\r\n *  0b11..Toggle output\r\n */\r\n#define SCT_RES_O7RES(x)                         (((uint32_t)(((uint32_t)(x)) << SCT_RES_O7RES_SHIFT)) & SCT_RES_O7RES_MASK)\r\n\r\n#define SCT_RES_O8RES_MASK                       (0x30000U)\r\n#define SCT_RES_O8RES_SHIFT                      (16U)\r\n/*! O8RES - Effect of simultaneous set and clear on output n\r\n *  0b00..No change\r\n *  0b01..Set output (or clear based on the OUTPUTDIRCTRL[SETCLRn] field)\r\n *  0b10..Clear output (or set based on the OUTPUTDIRCTRL[SETCLRn] field)\r\n *  0b11..Toggle output\r\n */\r\n#define SCT_RES_O8RES(x)                         (((uint32_t)(((uint32_t)(x)) << SCT_RES_O8RES_SHIFT)) & SCT_RES_O8RES_MASK)\r\n\r\n#define SCT_RES_O9RES_MASK                       (0xC0000U)\r\n#define SCT_RES_O9RES_SHIFT                      (18U)\r\n/*! O9RES - Effect of simultaneous set and clear on output n\r\n *  0b00..No change\r\n *  0b01..Set output (or clear based on the OUTPUTDIRCTRL[SETCLRn] field)\r\n *  0b10..Clear output (or set based on the OUTPUTDIRCTRL[SETCLRn] field)\r\n *  0b11..Toggle output\r\n */\r\n#define SCT_RES_O9RES(x)                         (((uint32_t)(((uint32_t)(x)) << SCT_RES_O9RES_SHIFT)) & SCT_RES_O9RES_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMAREQ0 - DMA Request 0 */\r\n/*! @{ */\r\n\r\n#define SCT_DMAREQ0_DEV_0_MASK                   (0x1U)\r\n#define SCT_DMAREQ0_DEV_0_SHIFT                  (0U)\r\n/*! DEV_0 - DMA Request Event n */\r\n#define SCT_DMAREQ0_DEV_0(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ0_DEV_0_SHIFT)) & SCT_DMAREQ0_DEV_0_MASK)\r\n\r\n#define SCT_DMAREQ0_DEV_1_MASK                   (0x2U)\r\n#define SCT_DMAREQ0_DEV_1_SHIFT                  (1U)\r\n/*! DEV_1 - DMA Request Event n */\r\n#define SCT_DMAREQ0_DEV_1(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ0_DEV_1_SHIFT)) & SCT_DMAREQ0_DEV_1_MASK)\r\n\r\n#define SCT_DMAREQ0_DEV_2_MASK                   (0x4U)\r\n#define SCT_DMAREQ0_DEV_2_SHIFT                  (2U)\r\n/*! DEV_2 - DMA Request Event n */\r\n#define SCT_DMAREQ0_DEV_2(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ0_DEV_2_SHIFT)) & SCT_DMAREQ0_DEV_2_MASK)\r\n\r\n#define SCT_DMAREQ0_DEV_3_MASK                   (0x8U)\r\n#define SCT_DMAREQ0_DEV_3_SHIFT                  (3U)\r\n/*! DEV_3 - DMA Request Event n */\r\n#define SCT_DMAREQ0_DEV_3(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ0_DEV_3_SHIFT)) & SCT_DMAREQ0_DEV_3_MASK)\r\n\r\n#define SCT_DMAREQ0_DEV_4_MASK                   (0x10U)\r\n#define SCT_DMAREQ0_DEV_4_SHIFT                  (4U)\r\n/*! DEV_4 - DMA Request Event n */\r\n#define SCT_DMAREQ0_DEV_4(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ0_DEV_4_SHIFT)) & SCT_DMAREQ0_DEV_4_MASK)\r\n\r\n#define SCT_DMAREQ0_DEV_5_MASK                   (0x20U)\r\n#define SCT_DMAREQ0_DEV_5_SHIFT                  (5U)\r\n/*! DEV_5 - DMA Request Event n */\r\n#define SCT_DMAREQ0_DEV_5(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ0_DEV_5_SHIFT)) & SCT_DMAREQ0_DEV_5_MASK)\r\n\r\n#define SCT_DMAREQ0_DEV_6_MASK                   (0x40U)\r\n#define SCT_DMAREQ0_DEV_6_SHIFT                  (6U)\r\n/*! DEV_6 - DMA Request Event n */\r\n#define SCT_DMAREQ0_DEV_6(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ0_DEV_6_SHIFT)) & SCT_DMAREQ0_DEV_6_MASK)\r\n\r\n#define SCT_DMAREQ0_DEV_7_MASK                   (0x80U)\r\n#define SCT_DMAREQ0_DEV_7_SHIFT                  (7U)\r\n/*! DEV_7 - DMA Request Event n */\r\n#define SCT_DMAREQ0_DEV_7(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ0_DEV_7_SHIFT)) & SCT_DMAREQ0_DEV_7_MASK)\r\n\r\n#define SCT_DMAREQ0_DEV_8_MASK                   (0x100U)\r\n#define SCT_DMAREQ0_DEV_8_SHIFT                  (8U)\r\n/*! DEV_8 - DMA Request Event n */\r\n#define SCT_DMAREQ0_DEV_8(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ0_DEV_8_SHIFT)) & SCT_DMAREQ0_DEV_8_MASK)\r\n\r\n#define SCT_DMAREQ0_DEV_9_MASK                   (0x200U)\r\n#define SCT_DMAREQ0_DEV_9_SHIFT                  (9U)\r\n/*! DEV_9 - DMA Request Event n */\r\n#define SCT_DMAREQ0_DEV_9(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ0_DEV_9_SHIFT)) & SCT_DMAREQ0_DEV_9_MASK)\r\n\r\n#define SCT_DMAREQ0_DEV_10_MASK                  (0x400U)\r\n#define SCT_DMAREQ0_DEV_10_SHIFT                 (10U)\r\n/*! DEV_10 - DMA Request Event n */\r\n#define SCT_DMAREQ0_DEV_10(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ0_DEV_10_SHIFT)) & SCT_DMAREQ0_DEV_10_MASK)\r\n\r\n#define SCT_DMAREQ0_DEV_11_MASK                  (0x800U)\r\n#define SCT_DMAREQ0_DEV_11_SHIFT                 (11U)\r\n/*! DEV_11 - DMA Request Event n */\r\n#define SCT_DMAREQ0_DEV_11(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ0_DEV_11_SHIFT)) & SCT_DMAREQ0_DEV_11_MASK)\r\n\r\n#define SCT_DMAREQ0_DEV_12_MASK                  (0x1000U)\r\n#define SCT_DMAREQ0_DEV_12_SHIFT                 (12U)\r\n/*! DEV_12 - DMA Request Event n */\r\n#define SCT_DMAREQ0_DEV_12(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ0_DEV_12_SHIFT)) & SCT_DMAREQ0_DEV_12_MASK)\r\n\r\n#define SCT_DMAREQ0_DEV_13_MASK                  (0x2000U)\r\n#define SCT_DMAREQ0_DEV_13_SHIFT                 (13U)\r\n/*! DEV_13 - DMA Request Event n */\r\n#define SCT_DMAREQ0_DEV_13(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ0_DEV_13_SHIFT)) & SCT_DMAREQ0_DEV_13_MASK)\r\n\r\n#define SCT_DMAREQ0_DEV_14_MASK                  (0x4000U)\r\n#define SCT_DMAREQ0_DEV_14_SHIFT                 (14U)\r\n/*! DEV_14 - DMA Request Event n */\r\n#define SCT_DMAREQ0_DEV_14(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ0_DEV_14_SHIFT)) & SCT_DMAREQ0_DEV_14_MASK)\r\n\r\n#define SCT_DMAREQ0_DEV_15_MASK                  (0x8000U)\r\n#define SCT_DMAREQ0_DEV_15_SHIFT                 (15U)\r\n/*! DEV_15 - DMA Request Event n */\r\n#define SCT_DMAREQ0_DEV_15(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ0_DEV_15_SHIFT)) & SCT_DMAREQ0_DEV_15_MASK)\r\n\r\n#define SCT_DMAREQ0_DRL0_MASK                    (0x40000000U)\r\n#define SCT_DMAREQ0_DRL0_SHIFT                   (30U)\r\n/*! DRL0 - A 1 in this bit triggers DMA request 0 when it loads the MATCH_L/Unified registers from the RELOAD_L/Unified registers. */\r\n#define SCT_DMAREQ0_DRL0(x)                      (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ0_DRL0_SHIFT)) & SCT_DMAREQ0_DRL0_MASK)\r\n\r\n#define SCT_DMAREQ0_DRQ0_MASK                    (0x80000000U)\r\n#define SCT_DMAREQ0_DRQ0_SHIFT                   (31U)\r\n/*! DRQ0 - DMA Request 0 State */\r\n#define SCT_DMAREQ0_DRQ0(x)                      (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ0_DRQ0_SHIFT)) & SCT_DMAREQ0_DRQ0_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMAREQ1 - DMA Request 1 */\r\n/*! @{ */\r\n\r\n#define SCT_DMAREQ1_DEV_0_MASK                   (0x1U)\r\n#define SCT_DMAREQ1_DEV_0_SHIFT                  (0U)\r\n/*! DEV_0 - DMA Request Event n */\r\n#define SCT_DMAREQ1_DEV_0(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ1_DEV_0_SHIFT)) & SCT_DMAREQ1_DEV_0_MASK)\r\n\r\n#define SCT_DMAREQ1_DEV_1_MASK                   (0x2U)\r\n#define SCT_DMAREQ1_DEV_1_SHIFT                  (1U)\r\n/*! DEV_1 - DMA Request Event n */\r\n#define SCT_DMAREQ1_DEV_1(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ1_DEV_1_SHIFT)) & SCT_DMAREQ1_DEV_1_MASK)\r\n\r\n#define SCT_DMAREQ1_DEV_2_MASK                   (0x4U)\r\n#define SCT_DMAREQ1_DEV_2_SHIFT                  (2U)\r\n/*! DEV_2 - DMA Request Event n */\r\n#define SCT_DMAREQ1_DEV_2(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ1_DEV_2_SHIFT)) & SCT_DMAREQ1_DEV_2_MASK)\r\n\r\n#define SCT_DMAREQ1_DEV_3_MASK                   (0x8U)\r\n#define SCT_DMAREQ1_DEV_3_SHIFT                  (3U)\r\n/*! DEV_3 - DMA Request Event n */\r\n#define SCT_DMAREQ1_DEV_3(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ1_DEV_3_SHIFT)) & SCT_DMAREQ1_DEV_3_MASK)\r\n\r\n#define SCT_DMAREQ1_DEV_4_MASK                   (0x10U)\r\n#define SCT_DMAREQ1_DEV_4_SHIFT                  (4U)\r\n/*! DEV_4 - DMA Request Event n */\r\n#define SCT_DMAREQ1_DEV_4(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ1_DEV_4_SHIFT)) & SCT_DMAREQ1_DEV_4_MASK)\r\n\r\n#define SCT_DMAREQ1_DEV_5_MASK                   (0x20U)\r\n#define SCT_DMAREQ1_DEV_5_SHIFT                  (5U)\r\n/*! DEV_5 - DMA Request Event n */\r\n#define SCT_DMAREQ1_DEV_5(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ1_DEV_5_SHIFT)) & SCT_DMAREQ1_DEV_5_MASK)\r\n\r\n#define SCT_DMAREQ1_DEV_6_MASK                   (0x40U)\r\n#define SCT_DMAREQ1_DEV_6_SHIFT                  (6U)\r\n/*! DEV_6 - DMA Request Event n */\r\n#define SCT_DMAREQ1_DEV_6(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ1_DEV_6_SHIFT)) & SCT_DMAREQ1_DEV_6_MASK)\r\n\r\n#define SCT_DMAREQ1_DEV_7_MASK                   (0x80U)\r\n#define SCT_DMAREQ1_DEV_7_SHIFT                  (7U)\r\n/*! DEV_7 - DMA Request Event n */\r\n#define SCT_DMAREQ1_DEV_7(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ1_DEV_7_SHIFT)) & SCT_DMAREQ1_DEV_7_MASK)\r\n\r\n#define SCT_DMAREQ1_DEV_8_MASK                   (0x100U)\r\n#define SCT_DMAREQ1_DEV_8_SHIFT                  (8U)\r\n/*! DEV_8 - DMA Request Event n */\r\n#define SCT_DMAREQ1_DEV_8(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ1_DEV_8_SHIFT)) & SCT_DMAREQ1_DEV_8_MASK)\r\n\r\n#define SCT_DMAREQ1_DEV_9_MASK                   (0x200U)\r\n#define SCT_DMAREQ1_DEV_9_SHIFT                  (9U)\r\n/*! DEV_9 - DMA Request Event n */\r\n#define SCT_DMAREQ1_DEV_9(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ1_DEV_9_SHIFT)) & SCT_DMAREQ1_DEV_9_MASK)\r\n\r\n#define SCT_DMAREQ1_DEV_10_MASK                  (0x400U)\r\n#define SCT_DMAREQ1_DEV_10_SHIFT                 (10U)\r\n/*! DEV_10 - DMA Request Event n */\r\n#define SCT_DMAREQ1_DEV_10(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ1_DEV_10_SHIFT)) & SCT_DMAREQ1_DEV_10_MASK)\r\n\r\n#define SCT_DMAREQ1_DEV_11_MASK                  (0x800U)\r\n#define SCT_DMAREQ1_DEV_11_SHIFT                 (11U)\r\n/*! DEV_11 - DMA Request Event n */\r\n#define SCT_DMAREQ1_DEV_11(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ1_DEV_11_SHIFT)) & SCT_DMAREQ1_DEV_11_MASK)\r\n\r\n#define SCT_DMAREQ1_DEV_12_MASK                  (0x1000U)\r\n#define SCT_DMAREQ1_DEV_12_SHIFT                 (12U)\r\n/*! DEV_12 - DMA Request Event n */\r\n#define SCT_DMAREQ1_DEV_12(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ1_DEV_12_SHIFT)) & SCT_DMAREQ1_DEV_12_MASK)\r\n\r\n#define SCT_DMAREQ1_DEV_13_MASK                  (0x2000U)\r\n#define SCT_DMAREQ1_DEV_13_SHIFT                 (13U)\r\n/*! DEV_13 - DMA Request Event n */\r\n#define SCT_DMAREQ1_DEV_13(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ1_DEV_13_SHIFT)) & SCT_DMAREQ1_DEV_13_MASK)\r\n\r\n#define SCT_DMAREQ1_DEV_14_MASK                  (0x4000U)\r\n#define SCT_DMAREQ1_DEV_14_SHIFT                 (14U)\r\n/*! DEV_14 - DMA Request Event n */\r\n#define SCT_DMAREQ1_DEV_14(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ1_DEV_14_SHIFT)) & SCT_DMAREQ1_DEV_14_MASK)\r\n\r\n#define SCT_DMAREQ1_DEV_15_MASK                  (0x8000U)\r\n#define SCT_DMAREQ1_DEV_15_SHIFT                 (15U)\r\n/*! DEV_15 - DMA Request Event n */\r\n#define SCT_DMAREQ1_DEV_15(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ1_DEV_15_SHIFT)) & SCT_DMAREQ1_DEV_15_MASK)\r\n\r\n#define SCT_DMAREQ1_DRL1_MASK                    (0x40000000U)\r\n#define SCT_DMAREQ1_DRL1_SHIFT                   (30U)\r\n/*! DRL1 - A 1 in this bit triggers DMA request 1 when it loads the Match L/Unified registers from the Reload L/Unified registers. */\r\n#define SCT_DMAREQ1_DRL1(x)                      (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ1_DRL1_SHIFT)) & SCT_DMAREQ1_DRL1_MASK)\r\n\r\n#define SCT_DMAREQ1_DRQ1_MASK                    (0x80000000U)\r\n#define SCT_DMAREQ1_DRQ1_SHIFT                   (31U)\r\n/*! DRQ1 - DMA Request 1 State */\r\n#define SCT_DMAREQ1_DRQ1(x)                      (((uint32_t)(((uint32_t)(x)) << SCT_DMAREQ1_DRQ1_SHIFT)) & SCT_DMAREQ1_DRQ1_MASK)\r\n/*! @} */\r\n\r\n/*! @name EVEN - Event Interrupt Enable */\r\n/*! @{ */\r\n\r\n#define SCT_EVEN_IEN0_MASK                       (0x1U)\r\n#define SCT_EVEN_IEN0_SHIFT                      (0U)\r\n/*! IEN0 - Event Interrupt Enable n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_EVEN_IEN0(x)                         (((uint32_t)(((uint32_t)(x)) << SCT_EVEN_IEN0_SHIFT)) & SCT_EVEN_IEN0_MASK)\r\n\r\n#define SCT_EVEN_IEN1_MASK                       (0x2U)\r\n#define SCT_EVEN_IEN1_SHIFT                      (1U)\r\n/*! IEN1 - Event Interrupt Enable n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_EVEN_IEN1(x)                         (((uint32_t)(((uint32_t)(x)) << SCT_EVEN_IEN1_SHIFT)) & SCT_EVEN_IEN1_MASK)\r\n\r\n#define SCT_EVEN_IEN2_MASK                       (0x4U)\r\n#define SCT_EVEN_IEN2_SHIFT                      (2U)\r\n/*! IEN2 - Event Interrupt Enable n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_EVEN_IEN2(x)                         (((uint32_t)(((uint32_t)(x)) << SCT_EVEN_IEN2_SHIFT)) & SCT_EVEN_IEN2_MASK)\r\n\r\n#define SCT_EVEN_IEN3_MASK                       (0x8U)\r\n#define SCT_EVEN_IEN3_SHIFT                      (3U)\r\n/*! IEN3 - Event Interrupt Enable n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_EVEN_IEN3(x)                         (((uint32_t)(((uint32_t)(x)) << SCT_EVEN_IEN3_SHIFT)) & SCT_EVEN_IEN3_MASK)\r\n\r\n#define SCT_EVEN_IEN4_MASK                       (0x10U)\r\n#define SCT_EVEN_IEN4_SHIFT                      (4U)\r\n/*! IEN4 - Event Interrupt Enable n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_EVEN_IEN4(x)                         (((uint32_t)(((uint32_t)(x)) << SCT_EVEN_IEN4_SHIFT)) & SCT_EVEN_IEN4_MASK)\r\n\r\n#define SCT_EVEN_IEN5_MASK                       (0x20U)\r\n#define SCT_EVEN_IEN5_SHIFT                      (5U)\r\n/*! IEN5 - Event Interrupt Enable n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_EVEN_IEN5(x)                         (((uint32_t)(((uint32_t)(x)) << SCT_EVEN_IEN5_SHIFT)) & SCT_EVEN_IEN5_MASK)\r\n\r\n#define SCT_EVEN_IEN6_MASK                       (0x40U)\r\n#define SCT_EVEN_IEN6_SHIFT                      (6U)\r\n/*! IEN6 - Event Interrupt Enable n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_EVEN_IEN6(x)                         (((uint32_t)(((uint32_t)(x)) << SCT_EVEN_IEN6_SHIFT)) & SCT_EVEN_IEN6_MASK)\r\n\r\n#define SCT_EVEN_IEN7_MASK                       (0x80U)\r\n#define SCT_EVEN_IEN7_SHIFT                      (7U)\r\n/*! IEN7 - Event Interrupt Enable n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_EVEN_IEN7(x)                         (((uint32_t)(((uint32_t)(x)) << SCT_EVEN_IEN7_SHIFT)) & SCT_EVEN_IEN7_MASK)\r\n\r\n#define SCT_EVEN_IEN8_MASK                       (0x100U)\r\n#define SCT_EVEN_IEN8_SHIFT                      (8U)\r\n/*! IEN8 - Event Interrupt Enable n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_EVEN_IEN8(x)                         (((uint32_t)(((uint32_t)(x)) << SCT_EVEN_IEN8_SHIFT)) & SCT_EVEN_IEN8_MASK)\r\n\r\n#define SCT_EVEN_IEN9_MASK                       (0x200U)\r\n#define SCT_EVEN_IEN9_SHIFT                      (9U)\r\n/*! IEN9 - Event Interrupt Enable n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_EVEN_IEN9(x)                         (((uint32_t)(((uint32_t)(x)) << SCT_EVEN_IEN9_SHIFT)) & SCT_EVEN_IEN9_MASK)\r\n\r\n#define SCT_EVEN_IEN10_MASK                      (0x400U)\r\n#define SCT_EVEN_IEN10_SHIFT                     (10U)\r\n/*! IEN10 - Event Interrupt Enable n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_EVEN_IEN10(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_EVEN_IEN10_SHIFT)) & SCT_EVEN_IEN10_MASK)\r\n\r\n#define SCT_EVEN_IEN11_MASK                      (0x800U)\r\n#define SCT_EVEN_IEN11_SHIFT                     (11U)\r\n/*! IEN11 - Event Interrupt Enable n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_EVEN_IEN11(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_EVEN_IEN11_SHIFT)) & SCT_EVEN_IEN11_MASK)\r\n\r\n#define SCT_EVEN_IEN12_MASK                      (0x1000U)\r\n#define SCT_EVEN_IEN12_SHIFT                     (12U)\r\n/*! IEN12 - Event Interrupt Enable n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_EVEN_IEN12(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_EVEN_IEN12_SHIFT)) & SCT_EVEN_IEN12_MASK)\r\n\r\n#define SCT_EVEN_IEN13_MASK                      (0x2000U)\r\n#define SCT_EVEN_IEN13_SHIFT                     (13U)\r\n/*! IEN13 - Event Interrupt Enable n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_EVEN_IEN13(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_EVEN_IEN13_SHIFT)) & SCT_EVEN_IEN13_MASK)\r\n\r\n#define SCT_EVEN_IEN14_MASK                      (0x4000U)\r\n#define SCT_EVEN_IEN14_SHIFT                     (14U)\r\n/*! IEN14 - Event Interrupt Enable n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_EVEN_IEN14(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_EVEN_IEN14_SHIFT)) & SCT_EVEN_IEN14_MASK)\r\n\r\n#define SCT_EVEN_IEN15_MASK                      (0x8000U)\r\n#define SCT_EVEN_IEN15_SHIFT                     (15U)\r\n/*! IEN15 - Event Interrupt Enable n\r\n *  0b0..Disable\r\n *  0b1..Enable\r\n */\r\n#define SCT_EVEN_IEN15(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_EVEN_IEN15_SHIFT)) & SCT_EVEN_IEN15_MASK)\r\n/*! @} */\r\n\r\n/*! @name EVFLAG - Event Flag */\r\n/*! @{ */\r\n\r\n#define SCT_EVFLAG_FLAG0_MASK                    (0x1U)\r\n#define SCT_EVFLAG_FLAG0_SHIFT                   (0U)\r\n/*! FLAG0 - Event Flag n\r\n *  0b0..No Flag\r\n *  0b1..Event n Flag\r\n */\r\n#define SCT_EVFLAG_FLAG0(x)                      (((uint32_t)(((uint32_t)(x)) << SCT_EVFLAG_FLAG0_SHIFT)) & SCT_EVFLAG_FLAG0_MASK)\r\n\r\n#define SCT_EVFLAG_FLAG1_MASK                    (0x2U)\r\n#define SCT_EVFLAG_FLAG1_SHIFT                   (1U)\r\n/*! FLAG1 - Event Flag n\r\n *  0b0..No Flag\r\n *  0b1..Event n Flag\r\n */\r\n#define SCT_EVFLAG_FLAG1(x)                      (((uint32_t)(((uint32_t)(x)) << SCT_EVFLAG_FLAG1_SHIFT)) & SCT_EVFLAG_FLAG1_MASK)\r\n\r\n#define SCT_EVFLAG_FLAG2_MASK                    (0x4U)\r\n#define SCT_EVFLAG_FLAG2_SHIFT                   (2U)\r\n/*! FLAG2 - Event Flag n\r\n *  0b0..No Flag\r\n *  0b1..Event n Flag\r\n */\r\n#define SCT_EVFLAG_FLAG2(x)                      (((uint32_t)(((uint32_t)(x)) << SCT_EVFLAG_FLAG2_SHIFT)) & SCT_EVFLAG_FLAG2_MASK)\r\n\r\n#define SCT_EVFLAG_FLAG3_MASK                    (0x8U)\r\n#define SCT_EVFLAG_FLAG3_SHIFT                   (3U)\r\n/*! FLAG3 - Event Flag n\r\n *  0b0..No Flag\r\n *  0b1..Event n Flag\r\n */\r\n#define SCT_EVFLAG_FLAG3(x)                      (((uint32_t)(((uint32_t)(x)) << SCT_EVFLAG_FLAG3_SHIFT)) & SCT_EVFLAG_FLAG3_MASK)\r\n\r\n#define SCT_EVFLAG_FLAG4_MASK                    (0x10U)\r\n#define SCT_EVFLAG_FLAG4_SHIFT                   (4U)\r\n/*! FLAG4 - Event Flag n\r\n *  0b0..No Flag\r\n *  0b1..Event n Flag\r\n */\r\n#define SCT_EVFLAG_FLAG4(x)                      (((uint32_t)(((uint32_t)(x)) << SCT_EVFLAG_FLAG4_SHIFT)) & SCT_EVFLAG_FLAG4_MASK)\r\n\r\n#define SCT_EVFLAG_FLAG5_MASK                    (0x20U)\r\n#define SCT_EVFLAG_FLAG5_SHIFT                   (5U)\r\n/*! FLAG5 - Event Flag n\r\n *  0b0..No Flag\r\n *  0b1..Event n Flag\r\n */\r\n#define SCT_EVFLAG_FLAG5(x)                      (((uint32_t)(((uint32_t)(x)) << SCT_EVFLAG_FLAG5_SHIFT)) & SCT_EVFLAG_FLAG5_MASK)\r\n\r\n#define SCT_EVFLAG_FLAG6_MASK                    (0x40U)\r\n#define SCT_EVFLAG_FLAG6_SHIFT                   (6U)\r\n/*! FLAG6 - Event Flag n\r\n *  0b0..No Flag\r\n *  0b1..Event n Flag\r\n */\r\n#define SCT_EVFLAG_FLAG6(x)                      (((uint32_t)(((uint32_t)(x)) << SCT_EVFLAG_FLAG6_SHIFT)) & SCT_EVFLAG_FLAG6_MASK)\r\n\r\n#define SCT_EVFLAG_FLAG7_MASK                    (0x80U)\r\n#define SCT_EVFLAG_FLAG7_SHIFT                   (7U)\r\n/*! FLAG7 - Event Flag n\r\n *  0b0..No Flag\r\n *  0b1..Event n Flag\r\n */\r\n#define SCT_EVFLAG_FLAG7(x)                      (((uint32_t)(((uint32_t)(x)) << SCT_EVFLAG_FLAG7_SHIFT)) & SCT_EVFLAG_FLAG7_MASK)\r\n\r\n#define SCT_EVFLAG_FLAG8_MASK                    (0x100U)\r\n#define SCT_EVFLAG_FLAG8_SHIFT                   (8U)\r\n/*! FLAG8 - Event Flag n\r\n *  0b0..No Flag\r\n *  0b1..Event n Flag\r\n */\r\n#define SCT_EVFLAG_FLAG8(x)                      (((uint32_t)(((uint32_t)(x)) << SCT_EVFLAG_FLAG8_SHIFT)) & SCT_EVFLAG_FLAG8_MASK)\r\n\r\n#define SCT_EVFLAG_FLAG9_MASK                    (0x200U)\r\n#define SCT_EVFLAG_FLAG9_SHIFT                   (9U)\r\n/*! FLAG9 - Event Flag n\r\n *  0b0..No Flag\r\n *  0b1..Event n Flag\r\n */\r\n#define SCT_EVFLAG_FLAG9(x)                      (((uint32_t)(((uint32_t)(x)) << SCT_EVFLAG_FLAG9_SHIFT)) & SCT_EVFLAG_FLAG9_MASK)\r\n\r\n#define SCT_EVFLAG_FLAG10_MASK                   (0x400U)\r\n#define SCT_EVFLAG_FLAG10_SHIFT                  (10U)\r\n/*! FLAG10 - Event Flag n\r\n *  0b0..No Flag\r\n *  0b1..Event n Flag\r\n */\r\n#define SCT_EVFLAG_FLAG10(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_EVFLAG_FLAG10_SHIFT)) & SCT_EVFLAG_FLAG10_MASK)\r\n\r\n#define SCT_EVFLAG_FLAG11_MASK                   (0x800U)\r\n#define SCT_EVFLAG_FLAG11_SHIFT                  (11U)\r\n/*! FLAG11 - Event Flag n\r\n *  0b0..No Flag\r\n *  0b1..Event n Flag\r\n */\r\n#define SCT_EVFLAG_FLAG11(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_EVFLAG_FLAG11_SHIFT)) & SCT_EVFLAG_FLAG11_MASK)\r\n\r\n#define SCT_EVFLAG_FLAG12_MASK                   (0x1000U)\r\n#define SCT_EVFLAG_FLAG12_SHIFT                  (12U)\r\n/*! FLAG12 - Event Flag n\r\n *  0b0..No Flag\r\n *  0b1..Event n Flag\r\n */\r\n#define SCT_EVFLAG_FLAG12(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_EVFLAG_FLAG12_SHIFT)) & SCT_EVFLAG_FLAG12_MASK)\r\n\r\n#define SCT_EVFLAG_FLAG13_MASK                   (0x2000U)\r\n#define SCT_EVFLAG_FLAG13_SHIFT                  (13U)\r\n/*! FLAG13 - Event Flag n\r\n *  0b0..No Flag\r\n *  0b1..Event n Flag\r\n */\r\n#define SCT_EVFLAG_FLAG13(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_EVFLAG_FLAG13_SHIFT)) & SCT_EVFLAG_FLAG13_MASK)\r\n\r\n#define SCT_EVFLAG_FLAG14_MASK                   (0x4000U)\r\n#define SCT_EVFLAG_FLAG14_SHIFT                  (14U)\r\n/*! FLAG14 - Event Flag n\r\n *  0b0..No Flag\r\n *  0b1..Event n Flag\r\n */\r\n#define SCT_EVFLAG_FLAG14(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_EVFLAG_FLAG14_SHIFT)) & SCT_EVFLAG_FLAG14_MASK)\r\n\r\n#define SCT_EVFLAG_FLAG15_MASK                   (0x8000U)\r\n#define SCT_EVFLAG_FLAG15_SHIFT                  (15U)\r\n/*! FLAG15 - Event Flag n\r\n *  0b0..No Flag\r\n *  0b1..Event n Flag\r\n */\r\n#define SCT_EVFLAG_FLAG15(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_EVFLAG_FLAG15_SHIFT)) & SCT_EVFLAG_FLAG15_MASK)\r\n/*! @} */\r\n\r\n/*! @name CONEN - Conflict Interrupt Enable */\r\n/*! @{ */\r\n\r\n#define SCT_CONEN_NCEN0_MASK                     (0x1U)\r\n#define SCT_CONEN_NCEN0_SHIFT                    (0U)\r\n/*! NCEN0 - No Change Conflict Event/Interrupt Enable\r\n *  0b0..No interrupt\r\n *  0b1..Interrupt\r\n */\r\n#define SCT_CONEN_NCEN0(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_CONEN_NCEN0_SHIFT)) & SCT_CONEN_NCEN0_MASK)\r\n\r\n#define SCT_CONEN_NCEN1_MASK                     (0x2U)\r\n#define SCT_CONEN_NCEN1_SHIFT                    (1U)\r\n/*! NCEN1 - No Change Conflict Event/Interrupt Enable\r\n *  0b0..No interrupt\r\n *  0b1..Interrupt\r\n */\r\n#define SCT_CONEN_NCEN1(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_CONEN_NCEN1_SHIFT)) & SCT_CONEN_NCEN1_MASK)\r\n\r\n#define SCT_CONEN_NCEN2_MASK                     (0x4U)\r\n#define SCT_CONEN_NCEN2_SHIFT                    (2U)\r\n/*! NCEN2 - No Change Conflict Event/Interrupt Enable\r\n *  0b0..No interrupt\r\n *  0b1..Interrupt\r\n */\r\n#define SCT_CONEN_NCEN2(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_CONEN_NCEN2_SHIFT)) & SCT_CONEN_NCEN2_MASK)\r\n\r\n#define SCT_CONEN_NCEN3_MASK                     (0x8U)\r\n#define SCT_CONEN_NCEN3_SHIFT                    (3U)\r\n/*! NCEN3 - No Change Conflict Event/Interrupt Enable\r\n *  0b0..No interrupt\r\n *  0b1..Interrupt\r\n */\r\n#define SCT_CONEN_NCEN3(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_CONEN_NCEN3_SHIFT)) & SCT_CONEN_NCEN3_MASK)\r\n\r\n#define SCT_CONEN_NCEN4_MASK                     (0x10U)\r\n#define SCT_CONEN_NCEN4_SHIFT                    (4U)\r\n/*! NCEN4 - No Change Conflict Event/Interrupt Enable\r\n *  0b0..No interrupt\r\n *  0b1..Interrupt\r\n */\r\n#define SCT_CONEN_NCEN4(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_CONEN_NCEN4_SHIFT)) & SCT_CONEN_NCEN4_MASK)\r\n\r\n#define SCT_CONEN_NCEN5_MASK                     (0x20U)\r\n#define SCT_CONEN_NCEN5_SHIFT                    (5U)\r\n/*! NCEN5 - No Change Conflict Event/Interrupt Enable\r\n *  0b0..No interrupt\r\n *  0b1..Interrupt\r\n */\r\n#define SCT_CONEN_NCEN5(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_CONEN_NCEN5_SHIFT)) & SCT_CONEN_NCEN5_MASK)\r\n\r\n#define SCT_CONEN_NCEN6_MASK                     (0x40U)\r\n#define SCT_CONEN_NCEN6_SHIFT                    (6U)\r\n/*! NCEN6 - No Change Conflict Event/Interrupt Enable\r\n *  0b0..No interrupt\r\n *  0b1..Interrupt\r\n */\r\n#define SCT_CONEN_NCEN6(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_CONEN_NCEN6_SHIFT)) & SCT_CONEN_NCEN6_MASK)\r\n\r\n#define SCT_CONEN_NCEN7_MASK                     (0x80U)\r\n#define SCT_CONEN_NCEN7_SHIFT                    (7U)\r\n/*! NCEN7 - No Change Conflict Event/Interrupt Enable\r\n *  0b0..No interrupt\r\n *  0b1..Interrupt\r\n */\r\n#define SCT_CONEN_NCEN7(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_CONEN_NCEN7_SHIFT)) & SCT_CONEN_NCEN7_MASK)\r\n\r\n#define SCT_CONEN_NCEN8_MASK                     (0x100U)\r\n#define SCT_CONEN_NCEN8_SHIFT                    (8U)\r\n/*! NCEN8 - No Change Conflict Event/Interrupt Enable\r\n *  0b0..No interrupt\r\n *  0b1..Interrupt\r\n */\r\n#define SCT_CONEN_NCEN8(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_CONEN_NCEN8_SHIFT)) & SCT_CONEN_NCEN8_MASK)\r\n\r\n#define SCT_CONEN_NCEN9_MASK                     (0x200U)\r\n#define SCT_CONEN_NCEN9_SHIFT                    (9U)\r\n/*! NCEN9 - No Change Conflict Event/Interrupt Enable\r\n *  0b0..No interrupt\r\n *  0b1..Interrupt\r\n */\r\n#define SCT_CONEN_NCEN9(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_CONEN_NCEN9_SHIFT)) & SCT_CONEN_NCEN9_MASK)\r\n/*! @} */\r\n\r\n/*! @name CONFLAG - Conflict Flag */\r\n/*! @{ */\r\n\r\n#define SCT_CONFLAG_NCFLAG0_MASK                 (0x1U)\r\n#define SCT_CONFLAG_NCFLAG0_SHIFT                (0U)\r\n/*! NCFLAG0 - No Change Conflict Event Flag\r\n *  0b0..No Conflict Event\r\n *  0b1..A No Change Conflict Event occured\r\n */\r\n#define SCT_CONFLAG_NCFLAG0(x)                   (((uint32_t)(((uint32_t)(x)) << SCT_CONFLAG_NCFLAG0_SHIFT)) & SCT_CONFLAG_NCFLAG0_MASK)\r\n\r\n#define SCT_CONFLAG_NCFLAG1_MASK                 (0x2U)\r\n#define SCT_CONFLAG_NCFLAG1_SHIFT                (1U)\r\n/*! NCFLAG1 - No Change Conflict Event Flag\r\n *  0b0..No Conflict Event\r\n *  0b1..A No Change Conflict Event occured\r\n */\r\n#define SCT_CONFLAG_NCFLAG1(x)                   (((uint32_t)(((uint32_t)(x)) << SCT_CONFLAG_NCFLAG1_SHIFT)) & SCT_CONFLAG_NCFLAG1_MASK)\r\n\r\n#define SCT_CONFLAG_NCFLAG2_MASK                 (0x4U)\r\n#define SCT_CONFLAG_NCFLAG2_SHIFT                (2U)\r\n/*! NCFLAG2 - No Change Conflict Event Flag\r\n *  0b0..No Conflict Event\r\n *  0b1..A No Change Conflict Event occured\r\n */\r\n#define SCT_CONFLAG_NCFLAG2(x)                   (((uint32_t)(((uint32_t)(x)) << SCT_CONFLAG_NCFLAG2_SHIFT)) & SCT_CONFLAG_NCFLAG2_MASK)\r\n\r\n#define SCT_CONFLAG_NCFLAG3_MASK                 (0x8U)\r\n#define SCT_CONFLAG_NCFLAG3_SHIFT                (3U)\r\n/*! NCFLAG3 - No Change Conflict Event Flag\r\n *  0b0..No Conflict Event\r\n *  0b1..A No Change Conflict Event occured\r\n */\r\n#define SCT_CONFLAG_NCFLAG3(x)                   (((uint32_t)(((uint32_t)(x)) << SCT_CONFLAG_NCFLAG3_SHIFT)) & SCT_CONFLAG_NCFLAG3_MASK)\r\n\r\n#define SCT_CONFLAG_NCFLAG4_MASK                 (0x10U)\r\n#define SCT_CONFLAG_NCFLAG4_SHIFT                (4U)\r\n/*! NCFLAG4 - No Change Conflict Event Flag\r\n *  0b0..No Conflict Event\r\n *  0b1..A No Change Conflict Event occured\r\n */\r\n#define SCT_CONFLAG_NCFLAG4(x)                   (((uint32_t)(((uint32_t)(x)) << SCT_CONFLAG_NCFLAG4_SHIFT)) & SCT_CONFLAG_NCFLAG4_MASK)\r\n\r\n#define SCT_CONFLAG_NCFLAG5_MASK                 (0x20U)\r\n#define SCT_CONFLAG_NCFLAG5_SHIFT                (5U)\r\n/*! NCFLAG5 - No Change Conflict Event Flag\r\n *  0b0..No Conflict Event\r\n *  0b1..A No Change Conflict Event occured\r\n */\r\n#define SCT_CONFLAG_NCFLAG5(x)                   (((uint32_t)(((uint32_t)(x)) << SCT_CONFLAG_NCFLAG5_SHIFT)) & SCT_CONFLAG_NCFLAG5_MASK)\r\n\r\n#define SCT_CONFLAG_NCFLAG6_MASK                 (0x40U)\r\n#define SCT_CONFLAG_NCFLAG6_SHIFT                (6U)\r\n/*! NCFLAG6 - No Change Conflict Event Flag\r\n *  0b0..No Conflict Event\r\n *  0b1..A No Change Conflict Event occured\r\n */\r\n#define SCT_CONFLAG_NCFLAG6(x)                   (((uint32_t)(((uint32_t)(x)) << SCT_CONFLAG_NCFLAG6_SHIFT)) & SCT_CONFLAG_NCFLAG6_MASK)\r\n\r\n#define SCT_CONFLAG_NCFLAG7_MASK                 (0x80U)\r\n#define SCT_CONFLAG_NCFLAG7_SHIFT                (7U)\r\n/*! NCFLAG7 - No Change Conflict Event Flag\r\n *  0b0..No Conflict Event\r\n *  0b1..A No Change Conflict Event occured\r\n */\r\n#define SCT_CONFLAG_NCFLAG7(x)                   (((uint32_t)(((uint32_t)(x)) << SCT_CONFLAG_NCFLAG7_SHIFT)) & SCT_CONFLAG_NCFLAG7_MASK)\r\n\r\n#define SCT_CONFLAG_NCFLAG8_MASK                 (0x100U)\r\n#define SCT_CONFLAG_NCFLAG8_SHIFT                (8U)\r\n/*! NCFLAG8 - No Change Conflict Event Flag\r\n *  0b0..No Conflict Event\r\n *  0b1..A No Change Conflict Event occured\r\n */\r\n#define SCT_CONFLAG_NCFLAG8(x)                   (((uint32_t)(((uint32_t)(x)) << SCT_CONFLAG_NCFLAG8_SHIFT)) & SCT_CONFLAG_NCFLAG8_MASK)\r\n\r\n#define SCT_CONFLAG_NCFLAG9_MASK                 (0x200U)\r\n#define SCT_CONFLAG_NCFLAG9_SHIFT                (9U)\r\n/*! NCFLAG9 - No Change Conflict Event Flag\r\n *  0b0..No Conflict Event\r\n *  0b1..A No Change Conflict Event occured\r\n */\r\n#define SCT_CONFLAG_NCFLAG9(x)                   (((uint32_t)(((uint32_t)(x)) << SCT_CONFLAG_NCFLAG9_SHIFT)) & SCT_CONFLAG_NCFLAG9_MASK)\r\n\r\n#define SCT_CONFLAG_BUSERRL_MASK                 (0x40000000U)\r\n#define SCT_CONFLAG_BUSERRL_SHIFT                (30U)\r\n/*! BUSERRL - Bus Error Low/Unified */\r\n#define SCT_CONFLAG_BUSERRL(x)                   (((uint32_t)(((uint32_t)(x)) << SCT_CONFLAG_BUSERRL_SHIFT)) & SCT_CONFLAG_BUSERRL_MASK)\r\n\r\n#define SCT_CONFLAG_BUSERRH_MASK                 (0x80000000U)\r\n#define SCT_CONFLAG_BUSERRH_SHIFT                (31U)\r\n/*! BUSERRH - Bus Error High */\r\n#define SCT_CONFLAG_BUSERRH(x)                   (((uint32_t)(((uint32_t)(x)) << SCT_CONFLAG_BUSERRH_SHIFT)) & SCT_CONFLAG_BUSERRH_MASK)\r\n/*! @} */\r\n\r\n/*! @name CAPL - SCT_CAPL register */\r\n/*! @{ */\r\n\r\n#define SCT_CAPL_CAPL_MASK                       (0xFFFFU)\r\n#define SCT_CAPL_CAPL_SHIFT                      (0U)\r\n#define SCT_CAPL_CAPL(x)                         (((uint16_t)(((uint16_t)(x)) << SCT_CAPL_CAPL_SHIFT)) & SCT_CAPL_CAPL_MASK)\r\n/*! @} */\r\n\r\n/* The count of SCT_CAPL */\r\n#define SCT_CAPL_COUNT                           (16U)\r\n\r\n/*! @name CAPH - SCT_CAPH register */\r\n/*! @{ */\r\n\r\n#define SCT_CAPH_CAPH_MASK                       (0xFFFFU)\r\n#define SCT_CAPH_CAPH_SHIFT                      (0U)\r\n#define SCT_CAPH_CAPH(x)                         (((uint16_t)(((uint16_t)(x)) << SCT_CAPH_CAPH_SHIFT)) & SCT_CAPH_CAPH_MASK)\r\n/*! @} */\r\n\r\n/* The count of SCT_CAPH */\r\n#define SCT_CAPH_COUNT                           (16U)\r\n\r\n/*! @name CAP - Capture Value */\r\n/*! @{ */\r\n\r\n#define SCT_CAP_CAPN_L_MASK                      (0xFFFFU)\r\n#define SCT_CAP_CAPN_L_SHIFT                     (0U)\r\n/*! CAPN_L - Capture n Low */\r\n#define SCT_CAP_CAPN_L(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_CAP_CAPN_L_SHIFT)) & SCT_CAP_CAPN_L_MASK)\r\n\r\n#define SCT_CAP_CAPN_H_MASK                      (0xFFFF0000U)\r\n#define SCT_CAP_CAPN_H_SHIFT                     (16U)\r\n/*! CAPN_H - Capture n High */\r\n#define SCT_CAP_CAPN_H(x)                        (((uint32_t)(((uint32_t)(x)) << SCT_CAP_CAPN_H_SHIFT)) & SCT_CAP_CAPN_H_MASK)\r\n/*! @} */\r\n\r\n/* The count of SCT_CAP */\r\n#define SCT_CAP_COUNT                            (16U)\r\n\r\n/*! @name MATCHL - SCT_MATCHL register */\r\n/*! @{ */\r\n\r\n#define SCT_MATCHL_MATCHL_MASK                   (0xFFFFU)\r\n#define SCT_MATCHL_MATCHL_SHIFT                  (0U)\r\n#define SCT_MATCHL_MATCHL(x)                     (((uint16_t)(((uint16_t)(x)) << SCT_MATCHL_MATCHL_SHIFT)) & SCT_MATCHL_MATCHL_MASK)\r\n/*! @} */\r\n\r\n/* The count of SCT_MATCHL */\r\n#define SCT_MATCHL_COUNT                         (16U)\r\n\r\n/*! @name MATCHH - SCT_MATCHH register */\r\n/*! @{ */\r\n\r\n#define SCT_MATCHH_MATCHH_MASK                   (0xFFFFU)\r\n#define SCT_MATCHH_MATCHH_SHIFT                  (0U)\r\n#define SCT_MATCHH_MATCHH(x)                     (((uint16_t)(((uint16_t)(x)) << SCT_MATCHH_MATCHH_SHIFT)) & SCT_MATCHH_MATCHH_MASK)\r\n/*! @} */\r\n\r\n/* The count of SCT_MATCHH */\r\n#define SCT_MATCHH_COUNT                         (16U)\r\n\r\n/*! @name MATCH - Match Value */\r\n/*! @{ */\r\n\r\n#define SCT_MATCH_MATCHN_L_MASK                  (0xFFFFU)\r\n#define SCT_MATCH_MATCHN_L_SHIFT                 (0U)\r\n/*! MATCHN_L - Match n Low */\r\n#define SCT_MATCH_MATCHN_L(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_MATCH_MATCHN_L_SHIFT)) & SCT_MATCH_MATCHN_L_MASK)\r\n\r\n#define SCT_MATCH_MATCHN_H_MASK                  (0xFFFF0000U)\r\n#define SCT_MATCH_MATCHN_H_SHIFT                 (16U)\r\n/*! MATCHN_H - Match n High */\r\n#define SCT_MATCH_MATCHN_H(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_MATCH_MATCHN_H_SHIFT)) & SCT_MATCH_MATCHN_H_MASK)\r\n/*! @} */\r\n\r\n/* The count of SCT_MATCH */\r\n#define SCT_MATCH_COUNT                          (16U)\r\n\r\n/*! @name CAPCTRLL - SCT_CAPCTRLL register */\r\n/*! @{ */\r\n\r\n#define SCT_CAPCTRLL_CAPCTRLL_MASK               (0xFFFFU)\r\n#define SCT_CAPCTRLL_CAPCTRLL_SHIFT              (0U)\r\n#define SCT_CAPCTRLL_CAPCTRLL(x)                 (((uint16_t)(((uint16_t)(x)) << SCT_CAPCTRLL_CAPCTRLL_SHIFT)) & SCT_CAPCTRLL_CAPCTRLL_MASK)\r\n/*! @} */\r\n\r\n/* The count of SCT_CAPCTRLL */\r\n#define SCT_CAPCTRLL_COUNT                       (16U)\r\n\r\n/*! @name CAPCTRLH - SCT_CAPCTRLH register */\r\n/*! @{ */\r\n\r\n#define SCT_CAPCTRLH_CAPCTRLH_MASK               (0xFFFFU)\r\n#define SCT_CAPCTRLH_CAPCTRLH_SHIFT              (0U)\r\n#define SCT_CAPCTRLH_CAPCTRLH(x)                 (((uint16_t)(((uint16_t)(x)) << SCT_CAPCTRLH_CAPCTRLH_SHIFT)) & SCT_CAPCTRLH_CAPCTRLH_MASK)\r\n/*! @} */\r\n\r\n/* The count of SCT_CAPCTRLH */\r\n#define SCT_CAPCTRLH_COUNT                       (16U)\r\n\r\n/*! @name SCTCAPCTRL_CAPCTRL - Capture Control */\r\n/*! @{ */\r\n\r\n#define SCT_SCTCAPCTRL_CAPCTRL_CAPCONN_L_MASK    (0xFFFFU)\r\n#define SCT_SCTCAPCTRL_CAPCTRL_CAPCONN_L_SHIFT   (0U)\r\n/*! CAPCONN_L - Capture Control n Low */\r\n#define SCT_SCTCAPCTRL_CAPCTRL_CAPCONN_L(x)      (((uint32_t)(((uint32_t)(x)) << SCT_SCTCAPCTRL_CAPCTRL_CAPCONN_L_SHIFT)) & SCT_SCTCAPCTRL_CAPCTRL_CAPCONN_L_MASK)\r\n\r\n#define SCT_SCTCAPCTRL_CAPCTRL_CAPCONN_H_MASK    (0xFFFF0000U)\r\n#define SCT_SCTCAPCTRL_CAPCTRL_CAPCONN_H_SHIFT   (16U)\r\n/*! CAPCONN_H - Capture Control n High */\r\n#define SCT_SCTCAPCTRL_CAPCTRL_CAPCONN_H(x)      (((uint32_t)(((uint32_t)(x)) << SCT_SCTCAPCTRL_CAPCTRL_CAPCONN_H_SHIFT)) & SCT_SCTCAPCTRL_CAPCTRL_CAPCONN_H_MASK)\r\n/*! @} */\r\n\r\n/* The count of SCT_SCTCAPCTRL_CAPCTRL */\r\n#define SCT_SCTCAPCTRL_CAPCTRL_COUNT             (16U)\r\n\r\n/*! @name MATCHRELL - SCT_MATCHRELL register */\r\n/*! @{ */\r\n\r\n#define SCT_MATCHRELL_MATCHRELL_MASK             (0xFFFFU)\r\n#define SCT_MATCHRELL_MATCHRELL_SHIFT            (0U)\r\n#define SCT_MATCHRELL_MATCHRELL(x)               (((uint16_t)(((uint16_t)(x)) << SCT_MATCHRELL_MATCHRELL_SHIFT)) & SCT_MATCHRELL_MATCHRELL_MASK)\r\n/*! @} */\r\n\r\n/* The count of SCT_MATCHRELL */\r\n#define SCT_MATCHRELL_COUNT                      (16U)\r\n\r\n/*! @name MATCHRELH - SCT_MATCHRELH register */\r\n/*! @{ */\r\n\r\n#define SCT_MATCHRELH_MATCHRELH_MASK             (0xFFFFU)\r\n#define SCT_MATCHRELH_MATCHRELH_SHIFT            (0U)\r\n#define SCT_MATCHRELH_MATCHRELH(x)               (((uint16_t)(((uint16_t)(x)) << SCT_MATCHRELH_MATCHRELH_SHIFT)) & SCT_MATCHRELH_MATCHRELH_MASK)\r\n/*! @} */\r\n\r\n/* The count of SCT_MATCHRELH */\r\n#define SCT_MATCHRELH_COUNT                      (16U)\r\n\r\n/*! @name MATCHREL - Match Reload Value */\r\n/*! @{ */\r\n\r\n#define SCT_MATCHREL_RELOADN_L_MASK              (0xFFFFU)\r\n#define SCT_MATCHREL_RELOADN_L_SHIFT             (0U)\r\n/*! RELOADN_L - Reload n Low */\r\n#define SCT_MATCHREL_RELOADN_L(x)                (((uint32_t)(((uint32_t)(x)) << SCT_MATCHREL_RELOADN_L_SHIFT)) & SCT_MATCHREL_RELOADN_L_MASK)\r\n\r\n#define SCT_MATCHREL_RELOADN_H_MASK              (0xFFFF0000U)\r\n#define SCT_MATCHREL_RELOADN_H_SHIFT             (16U)\r\n/*! RELOADN_H - Reload n High */\r\n#define SCT_MATCHREL_RELOADN_H(x)                (((uint32_t)(((uint32_t)(x)) << SCT_MATCHREL_RELOADN_H_SHIFT)) & SCT_MATCHREL_RELOADN_H_MASK)\r\n/*! @} */\r\n\r\n/* The count of SCT_MATCHREL */\r\n#define SCT_MATCHREL_COUNT                       (16U)\r\n\r\n/*! @name EV_STATE - Event n State */\r\n/*! @{ */\r\n\r\n#define SCT_EV_STATE_STATEMSKN_MASK              (0xFFFFFFFFU)\r\n#define SCT_EV_STATE_STATEMSKN_SHIFT             (0U)\r\n/*! STATEMSKN - Event State Mask n */\r\n#define SCT_EV_STATE_STATEMSKN(x)                (((uint32_t)(((uint32_t)(x)) << SCT_EV_STATE_STATEMSKN_SHIFT)) & SCT_EV_STATE_STATEMSKN_MASK)\r\n/*! @} */\r\n\r\n/* The count of SCT_EV_STATE */\r\n#define SCT_EV_STATE_COUNT                       (16U)\r\n\r\n/*! @name EV_CTRL - Event n Control */\r\n/*! @{ */\r\n\r\n#define SCT_EV_CTRL_MATCHSEL_MASK                (0xFU)\r\n#define SCT_EV_CTRL_MATCHSEL_SHIFT               (0U)\r\n/*! MATCHSEL - Match Select */\r\n#define SCT_EV_CTRL_MATCHSEL(x)                  (((uint32_t)(((uint32_t)(x)) << SCT_EV_CTRL_MATCHSEL_SHIFT)) & SCT_EV_CTRL_MATCHSEL_MASK)\r\n\r\n#define SCT_EV_CTRL_HEVENT_MASK                  (0x10U)\r\n#define SCT_EV_CTRL_HEVENT_SHIFT                 (4U)\r\n/*! HEVENT - High Event\r\n *  0b0..Low Counter\r\n *  0b1..High Counter\r\n */\r\n#define SCT_EV_CTRL_HEVENT(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_EV_CTRL_HEVENT_SHIFT)) & SCT_EV_CTRL_HEVENT_MASK)\r\n\r\n#define SCT_EV_CTRL_OUTSEL_MASK                  (0x20U)\r\n#define SCT_EV_CTRL_OUTSEL_SHIFT                 (5U)\r\n/*! OUTSEL - Input/Output Select\r\n *  0b0..Selects the inputs selected by IOSEL.\r\n *  0b1..Selects the outputs selected by IOSEL.\r\n */\r\n#define SCT_EV_CTRL_OUTSEL(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_EV_CTRL_OUTSEL_SHIFT)) & SCT_EV_CTRL_OUTSEL_MASK)\r\n\r\n#define SCT_EV_CTRL_IOSEL_MASK                   (0x3C0U)\r\n#define SCT_EV_CTRL_IOSEL_SHIFT                  (6U)\r\n/*! IOSEL - Input/Output Signal Select */\r\n#define SCT_EV_CTRL_IOSEL(x)                     (((uint32_t)(((uint32_t)(x)) << SCT_EV_CTRL_IOSEL_SHIFT)) & SCT_EV_CTRL_IOSEL_MASK)\r\n\r\n#define SCT_EV_CTRL_IOCOND_MASK                  (0xC00U)\r\n#define SCT_EV_CTRL_IOCOND_SHIFT                 (10U)\r\n/*! IOCOND - Input/Output Condition\r\n *  0b00..Low\r\n *  0b01..Rise\r\n *  0b10..Fall\r\n *  0b11..High\r\n */\r\n#define SCT_EV_CTRL_IOCOND(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_EV_CTRL_IOCOND_SHIFT)) & SCT_EV_CTRL_IOCOND_MASK)\r\n\r\n#define SCT_EV_CTRL_COMBMODE_MASK                (0x3000U)\r\n#define SCT_EV_CTRL_COMBMODE_SHIFT               (12U)\r\n/*! COMBMODE - Combination Mode\r\n *  0b00..OR. The event occurs when either the specified match or I/O condition occurs.\r\n *  0b01..MATCH. Uses the specified match only.\r\n *  0b10..IO. Uses the specified I/O condition only.\r\n *  0b11..AND. The event occurs when the specified match and I/O condition occur simultaneously.\r\n */\r\n#define SCT_EV_CTRL_COMBMODE(x)                  (((uint32_t)(((uint32_t)(x)) << SCT_EV_CTRL_COMBMODE_SHIFT)) & SCT_EV_CTRL_COMBMODE_MASK)\r\n\r\n#define SCT_EV_CTRL_STATELD_MASK                 (0x4000U)\r\n#define SCT_EV_CTRL_STATELD_SHIFT                (14U)\r\n/*! STATELD - State Load\r\n *  0b0..Add. STATEV value is added into STATE (the carry-out is ignored).\r\n *  0b1..Load. STATEV value is loaded into STATE.\r\n */\r\n#define SCT_EV_CTRL_STATELD(x)                   (((uint32_t)(((uint32_t)(x)) << SCT_EV_CTRL_STATELD_SHIFT)) & SCT_EV_CTRL_STATELD_MASK)\r\n\r\n#define SCT_EV_CTRL_STATEV_MASK                  (0xF8000U)\r\n#define SCT_EV_CTRL_STATEV_SHIFT                 (15U)\r\n/*! STATEV - State Value */\r\n#define SCT_EV_CTRL_STATEV(x)                    (((uint32_t)(((uint32_t)(x)) << SCT_EV_CTRL_STATEV_SHIFT)) & SCT_EV_CTRL_STATEV_MASK)\r\n\r\n#define SCT_EV_CTRL_MATCHMEM_MASK                (0x100000U)\r\n#define SCT_EV_CTRL_MATCHMEM_SHIFT               (20U)\r\n/*! MATCHMEM - Match Mem */\r\n#define SCT_EV_CTRL_MATCHMEM(x)                  (((uint32_t)(((uint32_t)(x)) << SCT_EV_CTRL_MATCHMEM_SHIFT)) & SCT_EV_CTRL_MATCHMEM_MASK)\r\n\r\n#define SCT_EV_CTRL_DIRECTION_MASK               (0x600000U)\r\n#define SCT_EV_CTRL_DIRECTION_SHIFT              (21U)\r\n/*! DIRECTION - Direction\r\n *  0b00..Direction independent. This event is triggered regardless of the count direction.\r\n *  0b01..Counting up. This event is triggered only during up-counting when BIDIR = 1.\r\n *  0b10..Counting down. This event is triggered only during down-counting when BIDIR = 1.\r\n *  0b11..Reserved\r\n */\r\n#define SCT_EV_CTRL_DIRECTION(x)                 (((uint32_t)(((uint32_t)(x)) << SCT_EV_CTRL_DIRECTION_SHIFT)) & SCT_EV_CTRL_DIRECTION_MASK)\r\n/*! @} */\r\n\r\n/* The count of SCT_EV_CTRL */\r\n#define SCT_EV_CTRL_COUNT                        (16U)\r\n\r\n/*! @name OUT_SET - Output n Set */\r\n/*! @{ */\r\n\r\n#define SCT_OUT_SET_SET_MASK                     (0xFFFFU)\r\n#define SCT_OUT_SET_SET_SHIFT                    (0U)\r\n/*! SET - Set */\r\n#define SCT_OUT_SET_SET(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_OUT_SET_SET_SHIFT)) & SCT_OUT_SET_SET_MASK)\r\n/*! @} */\r\n\r\n/* The count of SCT_OUT_SET */\r\n#define SCT_OUT_SET_COUNT                        (10U)\r\n\r\n/*! @name OUT_CLR - Output n Clear */\r\n/*! @{ */\r\n\r\n#define SCT_OUT_CLR_CLR_MASK                     (0xFFFFU)\r\n#define SCT_OUT_CLR_CLR_SHIFT                    (0U)\r\n/*! CLR - Clear */\r\n#define SCT_OUT_CLR_CLR(x)                       (((uint32_t)(((uint32_t)(x)) << SCT_OUT_CLR_CLR_SHIFT)) & SCT_OUT_CLR_CLR_MASK)\r\n/*! @} */\r\n\r\n/* The count of SCT_OUT_CLR */\r\n#define SCT_OUT_CLR_COUNT                        (10U)\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SCT_Register_Masks */\r\n\r\n\r\n/* SCT - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral SCT0 base address */\r\n  #define SCT0_BASE                                (0x50146000u)\r\n  /** Peripheral SCT0 base address */\r\n  #define SCT0_BASE_NS                             (0x40146000u)\r\n  /** Peripheral SCT0 base pointer */\r\n  #define SCT0                                     ((SCT_Type *)SCT0_BASE)\r\n  /** Peripheral SCT0 base pointer */\r\n  #define SCT0_NS                                  ((SCT_Type *)SCT0_BASE_NS)\r\n  /** Array initializer of SCT peripheral base addresses */\r\n  #define SCT_BASE_ADDRS                           { SCT0_BASE }\r\n  /** Array initializer of SCT peripheral base pointers */\r\n  #define SCT_BASE_PTRS                            { SCT0 }\r\n  /** Array initializer of SCT peripheral base addresses */\r\n  #define SCT_BASE_ADDRS_NS                        { SCT0_BASE_NS }\r\n  /** Array initializer of SCT peripheral base pointers */\r\n  #define SCT_BASE_PTRS_NS                         { SCT0_NS }\r\n#else\r\n  /** Peripheral SCT0 base address */\r\n  #define SCT0_BASE                                (0x40146000u)\r\n  /** Peripheral SCT0 base pointer */\r\n  #define SCT0                                     ((SCT_Type *)SCT0_BASE)\r\n  /** Array initializer of SCT peripheral base addresses */\r\n  #define SCT_BASE_ADDRS                           { SCT0_BASE }\r\n  /** Array initializer of SCT peripheral base pointers */\r\n  #define SCT_BASE_PTRS                            { SCT0 }\r\n#endif\r\n/** Interrupt vectors for the SCT peripheral type */\r\n#define SCT_IRQS                                 { SCT0_IRQn }\r\n/* Backward compatibility */\r\n#define SCT_CAP_CAPn_L_MASK                      SCT_CAP_CAPN_L_MASK\r\n#define SCT_CAP_CAPn_L_SHIFT                     SCT_CAP_CAPN_L_SHIFT\r\n#define SCT_CAP_CAPn_L(x)                        SCT_CAP_CAPN_L(x)\r\n#define SCT_CAP_CAPn_H_MASK                      SCT_CAP_CAPN_H_MASK\r\n#define SCT_CAP_CAPn_H_SHIFT                     SCT_CAP_CAPN_H_SHIFT\r\n#define SCT_CAP_CAPn_H(x)                        SCT_CAP_CAPN_H(x)\r\n#define SCT_MATCH_MATCHn_L_MASK                  SCT_MATCH_MATCHN_L_MASK\r\n#define SCT_MATCH_MATCHn_L_SHIFT                 SCT_MATCH_MATCHN_L_SHIFT\r\n#define SCT_MATCH_MATCHn_L(x)                    SCT_MATCH_MATCHN_L(x)\r\n#define SCT_MATCH_MATCHn_H_MASK                  SCT_MATCH_MATCHN_H_MASK\r\n#define SCT_MATCH_MATCHn_H_SHIFT                 SCT_MATCH_MATCHN_H_SHIFT\r\n#define SCT_MATCH_MATCHn_H(x)                    SCT_MATCH_MATCHN_H(x)\r\n#define SCT_SCTCAPCTRL_CAPCTRL_CAPCONn_L_MASK    SCT_SCTCAPCTRL_CAPCTRL_CAPCONN_L_MASK\r\n#define SCT_SCTCAPCTRL_CAPCTRL_CAPCONn_L_SHIFT   SCT_SCTCAPCTRL_CAPCTRL_CAPCONN_L_SHIFT\r\n#define SCT_SCTCAPCTRL_CAPCTRL_CAPCONn_L(x)      SCT_SCTCAPCTRL_CAPCTRL_CAPCONN_L(x)\r\n#define SCT_SCTCAPCTRL_CAPCTRL_CAPCONn_H_MASK    SCT_SCTCAPCTRL_CAPCTRL_CAPCONN_H_MASK\r\n#define SCT_SCTCAPCTRL_CAPCTRL_CAPCONn_H_SHIFT   SCT_SCTCAPCTRL_CAPCTRL_CAPCONN_H_SHIFT\r\n#define SCT_SCTCAPCTRL_CAPCTRL_CAPCONn_H(x)      SCT_SCTCAPCTRL_CAPCTRL_CAPCONN_H(x)\r\n#define SCT_MATCHREL_RELOADn_L_MASK              SCT_MATCHREL_RELOADN_L_MASK\r\n#define SCT_MATCHREL_RELOADn_L_SHIFT             SCT_MATCHREL_RELOADN_L_SHIFT\r\n#define SCT_MATCHREL_RELOADn_L(x)                SCT_MATCHREL_RELOADN_L(x)\r\n#define SCT_MATCHREL_RELOADn_H_MASK              SCT_MATCHREL_RELOADN_H_MASK\r\n#define SCT_MATCHREL_RELOADn_H_SHIFT             SCT_MATCHREL_RELOADN_H_SHIFT\r\n#define SCT_MATCHREL_RELOADn_H(x)                SCT_MATCHREL_RELOADN_H(x)\r\n#define SCT_EV_STATE_STATEMSKn_MASK              SCT_EV_STATE_STATEMSKN_MASK\r\n#define SCT_EV_STATE_STATEMSKn_SHIFT             SCT_EV_STATE_STATEMSKN_SHIFT\r\n#define SCT_EV_STATE_STATEMSKn(x)                SCT_EV_STATE_STATEMSKN(x)\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SCT_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SDU_FBR_CARD Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SDU_FBR_CARD_Peripheral_Access_Layer SDU_FBR_CARD Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** SDU_FBR_CARD - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint8_t FN_CODE;                            /**< Function Code, offset: 0x0 */\r\n  __I  uint8_t FN_EXT_CODE;                        /**< Extended Function Code, offset: 0x1 */\r\n  __IO uint8_t FN_POWER_SELECT;                    /**< Function Power Select, offset: 0x2 */\r\n       uint8_t RESERVED_0[2];\r\n  __I  uint8_t FN_CIS_0;                           /**< Function CIS Pointer 0, offset: 0x5 */\r\n  __I  uint8_t FN_CIS_1;                           /**< Function CIS Pointer 1, offset: 0x6 */\r\n  __I  uint8_t FN_CIS_2;                           /**< Function CIS Pointer 2, offset: 0x7 */\r\n  __I  uint8_t FN_BLOCK_SIZE_0;                    /**< Function Block Size 0, offset: 0x8 */\r\n  __I  uint8_t FN_BLOCK_SIZE_1;                    /**< Function Block Size 1, offset: 0x9 */\r\n} SDU_FBR_CARD_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SDU_FBR_CARD Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SDU_FBR_CARD_Register_Masks SDU_FBR_CARD Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name FN_CODE - Function Code */\r\n/*! @{ */\r\n\r\n#define SDU_FBR_CARD_FN_CODE_CODE_MASK           (0xFU)\r\n#define SDU_FBR_CARD_FN_CODE_CODE_SHIFT          (0U)\r\n/*! CODE - Standard I/O device interface code */\r\n#define SDU_FBR_CARD_FN_CODE_CODE(x)             (((uint8_t)(((uint8_t)(x)) << SDU_FBR_CARD_FN_CODE_CODE_SHIFT)) & SDU_FBR_CARD_FN_CODE_CODE_MASK)\r\n\r\n#define SDU_FBR_CARD_FN_CODE_CSA_MASK            (0x40U)\r\n#define SDU_FBR_CARD_FN_CODE_CSA_SHIFT           (6U)\r\n/*! CSA - Function supports Code Storage Area (CSA) 0 = function does not support CSA 1 = function supports CSA */\r\n#define SDU_FBR_CARD_FN_CODE_CSA(x)              (((uint8_t)(((uint8_t)(x)) << SDU_FBR_CARD_FN_CODE_CSA_SHIFT)) & SDU_FBR_CARD_FN_CODE_CSA_MASK)\r\n\r\n#define SDU_FBR_CARD_FN_CODE_CSA_EN_MASK         (0x80U)\r\n#define SDU_FBR_CARD_FN_CODE_CSA_EN_SHIFT        (7U)\r\n/*! CSA_EN - Function CSA Enable */\r\n#define SDU_FBR_CARD_FN_CODE_CSA_EN(x)           (((uint8_t)(((uint8_t)(x)) << SDU_FBR_CARD_FN_CODE_CSA_EN_SHIFT)) & SDU_FBR_CARD_FN_CODE_CSA_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name FN_EXT_CODE - Extended Function Code */\r\n/*! @{ */\r\n\r\n#define SDU_FBR_CARD_FN_EXT_CODE_FN_EXT_CODE_MASK (0xFFU)\r\n#define SDU_FBR_CARD_FN_EXT_CODE_FN_EXT_CODE_SHIFT (0U)\r\n/*! FN_EXT_CODE - Extended SDIO standard function interface code. */\r\n#define SDU_FBR_CARD_FN_EXT_CODE_FN_EXT_CODE(x)  (((uint8_t)(((uint8_t)(x)) << SDU_FBR_CARD_FN_EXT_CODE_FN_EXT_CODE_SHIFT)) & SDU_FBR_CARD_FN_EXT_CODE_FN_EXT_CODE_MASK)\r\n/*! @} */\r\n\r\n/*! @name FN_POWER_SELECT - Function Power Select */\r\n/*! @{ */\r\n\r\n#define SDU_FBR_CARD_FN_POWER_SELECT_SPS_MASK    (0x1U)\r\n#define SDU_FBR_CARD_FN_POWER_SELECT_SPS_SHIFT   (0U)\r\n/*! SPS - Power Selection 0 = no power selection 1 = two power modes selected by EPS bit */\r\n#define SDU_FBR_CARD_FN_POWER_SELECT_SPS(x)      (((uint8_t)(((uint8_t)(x)) << SDU_FBR_CARD_FN_POWER_SELECT_SPS_SHIFT)) & SDU_FBR_CARD_FN_POWER_SELECT_SPS_MASK)\r\n\r\n#define SDU_FBR_CARD_FN_POWER_SELECT_EPS_MASK    (0x2U)\r\n#define SDU_FBR_CARD_FN_POWER_SELECT_EPS_SHIFT   (1U)\r\n/*! EPS - Current Mode 0 = function operates in high current mode 1 = function operates in low current mode */\r\n#define SDU_FBR_CARD_FN_POWER_SELECT_EPS(x)      (((uint8_t)(((uint8_t)(x)) << SDU_FBR_CARD_FN_POWER_SELECT_EPS_SHIFT)) & SDU_FBR_CARD_FN_POWER_SELECT_EPS_MASK)\r\n\r\n#define SDU_FBR_CARD_FN_POWER_SELECT_FN_PS_MASK  (0xF0U)\r\n#define SDU_FBR_CARD_FN_POWER_SELECT_FN_PS_SHIFT (4U)\r\n/*! FN_PS - Power State */\r\n#define SDU_FBR_CARD_FN_POWER_SELECT_FN_PS(x)    (((uint8_t)(((uint8_t)(x)) << SDU_FBR_CARD_FN_POWER_SELECT_FN_PS_SHIFT)) & SDU_FBR_CARD_FN_POWER_SELECT_FN_PS_MASK)\r\n/*! @} */\r\n\r\n/*! @name FN_CIS_0 - Function CIS Pointer 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FBR_CARD_FN_CIS_0_FN_CIS_PTR0_MASK   (0xFFU)\r\n#define SDU_FBR_CARD_FN_CIS_0_FN_CIS_PTR0_SHIFT  (0U)\r\n/*! FN_CIS_PTR0 - 24b Function Pointer [7:0] Function card information structure pointer [7:0]\r\n *    Function n CIS pointer is (0x8000 | n << 7) Therefore, Function 1 CIS pointer is 0x008080 Function\r\n *    2 CIS pointer is 0x008100 Function 3 CIS pointer is 0x008180 ... Function 7 CIS pointer is\r\n *    0x008380\r\n */\r\n#define SDU_FBR_CARD_FN_CIS_0_FN_CIS_PTR0(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FBR_CARD_FN_CIS_0_FN_CIS_PTR0_SHIFT)) & SDU_FBR_CARD_FN_CIS_0_FN_CIS_PTR0_MASK)\r\n/*! @} */\r\n\r\n/*! @name FN_CIS_1 - Function CIS Pointer 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FBR_CARD_FN_CIS_1_FN_CIS_PTR1_MASK   (0xFFU)\r\n#define SDU_FBR_CARD_FN_CIS_1_FN_CIS_PTR1_SHIFT  (0U)\r\n/*! FN_CIS_PTR1 - 24b Function 1 Pointer [15:8] Function card information structure pointer [15:8] */\r\n#define SDU_FBR_CARD_FN_CIS_1_FN_CIS_PTR1(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FBR_CARD_FN_CIS_1_FN_CIS_PTR1_SHIFT)) & SDU_FBR_CARD_FN_CIS_1_FN_CIS_PTR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name FN_CIS_2 - Function CIS Pointer 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FBR_CARD_FN_CIS_2_FN_CIS_PTR2_MASK   (0xFFU)\r\n#define SDU_FBR_CARD_FN_CIS_2_FN_CIS_PTR2_SHIFT  (0U)\r\n/*! FN_CIS_PTR2 - 24b Function 1 Pointer [23:16] Function card information structure pointer [23:16] */\r\n#define SDU_FBR_CARD_FN_CIS_2_FN_CIS_PTR2(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FBR_CARD_FN_CIS_2_FN_CIS_PTR2_SHIFT)) & SDU_FBR_CARD_FN_CIS_2_FN_CIS_PTR2_MASK)\r\n/*! @} */\r\n\r\n/*! @name FN_BLOCK_SIZE_0 - Function Block Size 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FBR_CARD_FN_BLOCK_SIZE_0_FN_BLK_SIZE0_MASK (0xFFU)\r\n#define SDU_FBR_CARD_FN_BLOCK_SIZE_0_FN_BLK_SIZE0_SHIFT (0U)\r\n/*! FN_BLK_SIZE0 - Block Size [7:0] for I/O Block Operation */\r\n#define SDU_FBR_CARD_FN_BLOCK_SIZE_0_FN_BLK_SIZE0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FBR_CARD_FN_BLOCK_SIZE_0_FN_BLK_SIZE0_SHIFT)) & SDU_FBR_CARD_FN_BLOCK_SIZE_0_FN_BLK_SIZE0_MASK)\r\n/*! @} */\r\n\r\n/*! @name FN_BLOCK_SIZE_1 - Function Block Size 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FBR_CARD_FN_BLOCK_SIZE_1_FN_BLK_SIZE1_MASK (0x1U)\r\n#define SDU_FBR_CARD_FN_BLOCK_SIZE_1_FN_BLK_SIZE1_SHIFT (0U)\r\n/*! FN_BLK_SIZE1 - Block Size [8] for I/O Block Operation */\r\n#define SDU_FBR_CARD_FN_BLOCK_SIZE_1_FN_BLK_SIZE1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FBR_CARD_FN_BLOCK_SIZE_1_FN_BLK_SIZE1_SHIFT)) & SDU_FBR_CARD_FN_BLOCK_SIZE_1_FN_BLK_SIZE1_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SDU_FBR_CARD_Register_Masks */\r\n\r\n\r\n/* SDU_FBR_CARD - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral SDU_FBR_CARD base address */\r\n  #define SDU_FBR_CARD_BASE                        (0x50158020u)\r\n  /** Peripheral SDU_FBR_CARD base address */\r\n  #define SDU_FBR_CARD_BASE_NS                     (0x40158020u)\r\n  /** Peripheral SDU_FBR_CARD base pointer */\r\n  #define SDU_FBR_CARD                             ((SDU_FBR_CARD_Type *)SDU_FBR_CARD_BASE)\r\n  /** Peripheral SDU_FBR_CARD base pointer */\r\n  #define SDU_FBR_CARD_NS                          ((SDU_FBR_CARD_Type *)SDU_FBR_CARD_BASE_NS)\r\n  /** Array initializer of SDU_FBR_CARD peripheral base addresses */\r\n  #define SDU_FBR_CARD_BASE_ADDRS                  { SDU_FBR_CARD_BASE }\r\n  /** Array initializer of SDU_FBR_CARD peripheral base pointers */\r\n  #define SDU_FBR_CARD_BASE_PTRS                   { SDU_FBR_CARD }\r\n  /** Array initializer of SDU_FBR_CARD peripheral base addresses */\r\n  #define SDU_FBR_CARD_BASE_ADDRS_NS               { SDU_FBR_CARD_BASE_NS }\r\n  /** Array initializer of SDU_FBR_CARD peripheral base pointers */\r\n  #define SDU_FBR_CARD_BASE_PTRS_NS                { SDU_FBR_CARD_NS }\r\n#else\r\n  /** Peripheral SDU_FBR_CARD base address */\r\n  #define SDU_FBR_CARD_BASE                        (0x40158020u)\r\n  /** Peripheral SDU_FBR_CARD base pointer */\r\n  #define SDU_FBR_CARD                             ((SDU_FBR_CARD_Type *)SDU_FBR_CARD_BASE)\r\n  /** Array initializer of SDU_FBR_CARD peripheral base addresses */\r\n  #define SDU_FBR_CARD_BASE_ADDRS                  { SDU_FBR_CARD_BASE }\r\n  /** Array initializer of SDU_FBR_CARD peripheral base pointers */\r\n  #define SDU_FBR_CARD_BASE_PTRS                   { SDU_FBR_CARD }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SDU_FBR_CARD_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SDU_FN0_CARD Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SDU_FN0_CARD_Peripheral_Access_Layer SDU_FN0_CARD Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** SDU_FN0_CARD - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint8_t CCCR;                               /**< CCCR/SDIO Revision, offset: 0x0 */\r\n  __IO uint8_t VER;                                /**< SD Specification Revision, offset: 0x1 */\r\n  __I  uint8_t IO_ENABLE;                          /**< I/O Enable, offset: 0x2 */\r\n  __I  uint8_t IO_READY;                           /**< I/O Function Ready, offset: 0x3 */\r\n  __I  uint8_t INT_ENABLE;                         /**< Interrupt Enable, offset: 0x4 */\r\n  __I  uint8_t INT_PENDING;                        /**< Interrupt Pending, offset: 0x5 */\r\n  __I  uint8_t IO_ABORT;                           /**< I/O Abort, offset: 0x6 */\r\n  __IO uint8_t BUS_INTF_CTRL;                      /**< Bus Interface Control, offset: 0x7 */\r\n  __I  uint8_t CAPAB;                              /**< Card Capability, offset: 0x8 */\r\n  __I  uint8_t FUNC0_CIS_0;                        /**< Function 0 CIS Pointer 0, offset: 0x9 */\r\n  __I  uint8_t FUNC0_CIS_1;                        /**< Function 0 CIS Pointer 1, offset: 0xA */\r\n  __I  uint8_t FUNC0_CIS_2;                        /**< Function 0 CIS Pointer 2, offset: 0xB */\r\n  __I  uint8_t BUS_SUSP;                           /**< Bus Suspend, offset: 0xC */\r\n  __I  uint8_t BUS_SEL;                            /**< Function Select, offset: 0xD */\r\n  __I  uint8_t EXEC;                               /**< Execute Flags, offset: 0xE */\r\n  __I  uint8_t READY;                              /**< Ready Flags, offset: 0xF */\r\n  __I  uint8_t FN0_BLOCK_SIZE_0;                   /**< Function 0 Block Size 0, offset: 0x10 */\r\n  __I  uint8_t FN0_BLOCK_SIZE_1;                   /**< Function 0 Block Size 1, offset: 0x11 */\r\n  __IO uint8_t POWER_CONTROL;                      /**< Power Control, offset: 0x12 */\r\n  __IO uint8_t BUS_SPEED_SELECT;                   /**< Bus Speed Select, offset: 0x13 */\r\n  __IO uint8_t UHS_SUPPORT;                        /**< UHS-I Support, offset: 0x14 */\r\n  __IO uint8_t DRIVER_STR;                         /**< Driver Strength, offset: 0x15 */\r\n  __IO uint8_t INTERRUPT_EXT;                      /**< Interrupt Extension, offset: 0x16 */\r\n       uint8_t RESERVED_0[117];\r\n  __IO uint8_t CARD_CTRL1;                         /**< Card Control 1, offset: 0x8C */\r\n  __IO uint8_t CARD_CTRL2;                         /**< Card Control 2, offset: 0x8D */\r\n  __IO uint8_t CMD19_CTRL1;                        /**< CMD19 Control1, offset: 0x8E */\r\n  __IO uint8_t CMD19_CTRL2;                        /**< CMD19 Control2, offset: 0x8F */\r\n  __I  uint8_t FUNC_CARD_INT;                      /**< Function Card Interrupt, offset: 0x90 */\r\n  __IO uint8_t FUNC0_CARD_INTMASK;                 /**< Function Card Interrupt Mask, offset: 0x91 */\r\n  __IO uint8_t DEV_SLEEP;                          /**< Device Sleep, offset: 0x92 */\r\n  __IO uint8_t CARD_CTRL3;                         /**< Card Control 3, offset: 0x93 */\r\n  __IO uint8_t FN0_CARD_INTMASK0;                  /**< Function 0 Card Interrupt Mask 0, offset: 0x94 */\r\n  __IO uint8_t FN0_CARD_INTMASK1;                  /**< Function 0 Card Interrupt Mask 1, offset: 0x95 */\r\n  __IO uint8_t FN0_CARD_INTRSR0;                   /**< Function 0 Card Interrupt Reset Select 0, offset: 0x96 */\r\n  __IO uint8_t FN0_CARD_INTRSR1;                   /**< Function 0 Card Interrupt Reset Select 1, offset: 0x97 */\r\n  __I  uint8_t FN0_CARD_INTSTATUS0;                /**< Function 0 Card Interrupt Status 0, offset: 0x98 */\r\n  __I  uint8_t FN0_CARD_INTSTATUS1;                /**< Function 0 Card Interrupt Status 1, offset: 0x99 */\r\n  __I  uint8_t FN0_CARD_ACTVINTMASK0;              /**< Function 0 Card Active Interrupt Mask 0, offset: 0x9A */\r\n  __I  uint8_t FN0_CARD_ACTVINTMASK1;              /**< Function 0 Card Active Interrupt Mask 1, offset: 0x9B */\r\n  __IO uint8_t CARD_CTRL4;                         /**< Card Control 4, offset: 0x9C */\r\n  __IO uint8_t CARD_CTRL5;                         /**< Card Control 5, offset: 0x9D */\r\n  __IO uint8_t CARD_CTRL6;                         /**< Card Control 6, offset: 0x9E */\r\n  __IO uint8_t CARD_CTRL7;                         /**< Card Control 7, offset: 0x9F */\r\n} SDU_FN0_CARD_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SDU_FN0_CARD Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SDU_FN0_CARD_Register_Masks SDU_FN0_CARD Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name CCCR - CCCR/SDIO Revision */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_CCCR_CCCR_REV_MASK          (0xFU)\r\n#define SDU_FN0_CARD_CCCR_CCCR_REV_SHIFT         (0U)\r\n/*! CCCR_REV - CCCR Format Version Number Version of the CCCR format that this card supports. */\r\n#define SDU_FN0_CARD_CCCR_CCCR_REV(x)            (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CCCR_CCCR_REV_SHIFT)) & SDU_FN0_CARD_CCCR_CCCR_REV_MASK)\r\n\r\n#define SDU_FN0_CARD_CCCR_SDIO_REV_MASK          (0xF0U)\r\n#define SDU_FN0_CARD_CCCR_SDIO_REV_SHIFT         (4U)\r\n/*! SDIO_REV - SDIO Specification Revision Number Version of the SDIO specification that this card supports. */\r\n#define SDU_FN0_CARD_CCCR_SDIO_REV(x)            (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CCCR_SDIO_REV_SHIFT)) & SDU_FN0_CARD_CCCR_SDIO_REV_MASK)\r\n/*! @} */\r\n\r\n/*! @name VER - SD Specification Revision */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_VER_SD_PHY_REV_MASK         (0xFU)\r\n#define SDU_FN0_CARD_VER_SD_PHY_REV_SHIFT        (0U)\r\n/*! SD_PHY_REV - SD Format Version Number Version of the SD Physical specification that this card supports. */\r\n#define SDU_FN0_CARD_VER_SD_PHY_REV(x)           (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_VER_SD_PHY_REV_SHIFT)) & SDU_FN0_CARD_VER_SD_PHY_REV_MASK)\r\n/*! @} */\r\n\r\n/*! @name IO_ENABLE - I/O Enable */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_IO_ENABLE_IOE_MASK          (0xFEU)\r\n#define SDU_FN0_CARD_IO_ENABLE_IOE_SHIFT         (1U)\r\n/*! IOE - Function I/O enable 0 = function disabled 1 = function enabled */\r\n#define SDU_FN0_CARD_IO_ENABLE_IOE(x)            (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_IO_ENABLE_IOE_SHIFT)) & SDU_FN0_CARD_IO_ENABLE_IOE_MASK)\r\n/*! @} */\r\n\r\n/*! @name IO_READY - I/O Function Ready */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_IO_READY_FN_IO_RDY_MASK     (0xFEU)\r\n#define SDU_FN0_CARD_IO_READY_FN_IO_RDY_SHIFT    (1U)\r\n/*! FN_IO_RDY - Function I/O ready 0 = function not ready to operate 1 = function ready to operate */\r\n#define SDU_FN0_CARD_IO_READY_FN_IO_RDY(x)       (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_IO_READY_FN_IO_RDY_SHIFT)) & SDU_FN0_CARD_IO_READY_FN_IO_RDY_MASK)\r\n/*! @} */\r\n\r\n/*! @name INT_ENABLE - Interrupt Enable */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_INT_ENABLE_HOST_IEN_MASK    (0x1U)\r\n#define SDU_FN0_CARD_INT_ENABLE_HOST_IEN_SHIFT   (0U)\r\n/*! HOST_IEN - Host Interrupt Enable 0 = no interrupts from this card sent to host 1 = any function's interrupt sent to host */\r\n#define SDU_FN0_CARD_INT_ENABLE_HOST_IEN(x)      (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_INT_ENABLE_HOST_IEN_SHIFT)) & SDU_FN0_CARD_INT_ENABLE_HOST_IEN_MASK)\r\n\r\n#define SDU_FN0_CARD_INT_ENABLE_IEN_MASK         (0xFEU)\r\n#define SDU_FN0_CARD_INT_ENABLE_IEN_SHIFT        (1U)\r\n/*! IEN - Function Interrupt Enable 0 = interrupt from this function not sent to host 1 = interrupt\r\n *    from this function sent to host (host_ien must also be set)\r\n */\r\n#define SDU_FN0_CARD_INT_ENABLE_IEN(x)           (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_INT_ENABLE_IEN_SHIFT)) & SDU_FN0_CARD_INT_ENABLE_IEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name INT_PENDING - Interrupt Pending */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_INT_PENDING_FN_INT_HOST_MASK (0xFEU)\r\n#define SDU_FN0_CARD_INT_PENDING_FN_INT_HOST_SHIFT (1U)\r\n/*! FN_INT_HOST - Function Interrupt Pending 0 = no interrupts pending from this function 1 =\r\n *    interrupt pending If the ien[x] or host_ien bits are not set in INT_ENABLE, the host will not\r\n *    receive the pending interrupt.\r\n */\r\n#define SDU_FN0_CARD_INT_PENDING_FN_INT_HOST(x)  (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_INT_PENDING_FN_INT_HOST_SHIFT)) & SDU_FN0_CARD_INT_PENDING_FN_INT_HOST_MASK)\r\n/*! @} */\r\n\r\n/*! @name IO_ABORT - I/O Abort */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_IO_ABORT_ABORT_SEL_MASK     (0x7U)\r\n#define SDU_FN0_CARD_IO_ABORT_ABORT_SEL_SHIFT    (0U)\r\n/*! ABORT_SEL - Abort Select To abort an I/O read or write to free the SD bus, the function that is\r\n *    currently transferring data must be addressed.\r\n */\r\n#define SDU_FN0_CARD_IO_ABORT_ABORT_SEL(x)       (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_IO_ABORT_ABORT_SEL_SHIFT)) & SDU_FN0_CARD_IO_ABORT_ABORT_SEL_MASK)\r\n\r\n#define SDU_FN0_CARD_IO_ABORT_IO_CARD_RST_MASK   (0x8U)\r\n#define SDU_FN0_CARD_IO_ABORT_IO_CARD_RST_SHIFT  (3U)\r\n/*! IO_CARD_RST - I/O Card Reset If host sets this bit, an interrupt is generated to the card. */\r\n#define SDU_FN0_CARD_IO_ABORT_IO_CARD_RST(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_IO_ABORT_IO_CARD_RST_SHIFT)) & SDU_FN0_CARD_IO_ABORT_IO_CARD_RST_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUS_INTF_CTRL - Bus Interface Control */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_BUS_INTF_CTRL_BUS_WIDTH_MASK (0x3U)\r\n#define SDU_FN0_CARD_BUS_INTF_CTRL_BUS_WIDTH_SHIFT (0U)\r\n/*! BUS_WIDTH - Bus Width Data bus width used for data transfer 00 = 1 bit 10 = 4 bits All\r\n *    full-speed SDIO cards support both 1-bit and 4-bit bus.\r\n */\r\n#define SDU_FN0_CARD_BUS_INTF_CTRL_BUS_WIDTH(x)  (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_BUS_INTF_CTRL_BUS_WIDTH_SHIFT)) & SDU_FN0_CARD_BUS_INTF_CTRL_BUS_WIDTH_MASK)\r\n\r\n#define SDU_FN0_CARD_BUS_INTF_CTRL_ECSI_MASK     (0x20U)\r\n#define SDU_FN0_CARD_BUS_INTF_CTRL_ECSI_SHIFT    (5U)\r\n/*! ECSI - ecsi */\r\n#define SDU_FN0_CARD_BUS_INTF_CTRL_ECSI(x)       (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_BUS_INTF_CTRL_ECSI_SHIFT)) & SDU_FN0_CARD_BUS_INTF_CTRL_ECSI_MASK)\r\n\r\n#define SDU_FN0_CARD_BUS_INTF_CTRL_SCSI_MASK     (0x40U)\r\n#define SDU_FN0_CARD_BUS_INTF_CTRL_SCSI_SHIFT    (6U)\r\n/*! SCSI - Support continuous SPI Interrupt writable from internal bus only 0 = SPI supports\r\n *    interrupt assertion only when CS (SD)DAT[3] pin) is asserted 1 = SPI supports interrupt assertion\r\n *    independent of CS\r\n */\r\n#define SDU_FN0_CARD_BUS_INTF_CTRL_SCSI(x)       (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_BUS_INTF_CTRL_SCSI_SHIFT)) & SDU_FN0_CARD_BUS_INTF_CTRL_SCSI_MASK)\r\n\r\n#define SDU_FN0_CARD_BUS_INTF_CTRL_CD_DISABLE_MASK (0x80U)\r\n#define SDU_FN0_CARD_BUS_INTF_CTRL_CD_DISABLE_SHIFT (7U)\r\n/*! CD_DISABLE - Connect/Disconnet Disable Connect[0]/disconnect[1] the 10K-90 kO pull-up resistor on pin 1 of card. */\r\n#define SDU_FN0_CARD_BUS_INTF_CTRL_CD_DISABLE(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_BUS_INTF_CTRL_CD_DISABLE_SHIFT)) & SDU_FN0_CARD_BUS_INTF_CTRL_CD_DISABLE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CAPAB - Card Capability */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_CAPAB_SDC_MASK              (0x1U)\r\n#define SDU_FN0_CARD_CAPAB_SDC_SHIFT             (0U)\r\n/*! SDC - Support Direct Commands Card supports direct commands during multi-byte transfer 0 = all\r\n *    I/O functions do not accept and execute 1 = all I/O functions accept and execute\r\n */\r\n#define SDU_FN0_CARD_CAPAB_SDC(x)                (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CAPAB_SDC_SHIFT)) & SDU_FN0_CARD_CAPAB_SDC_MASK)\r\n\r\n#define SDU_FN0_CARD_CAPAB_SMB_MASK              (0x2U)\r\n#define SDU_FN0_CARD_CAPAB_SMB_SHIFT             (1U)\r\n/*! SMB - Support Multi-Block Card supports multi block indicator 0 = all I/O functions do not\r\n *    accept and execute 1 = all I/O functions accept and execute\r\n */\r\n#define SDU_FN0_CARD_CAPAB_SMB(x)                (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CAPAB_SMB_SHIFT)) & SDU_FN0_CARD_CAPAB_SMB_MASK)\r\n\r\n#define SDU_FN0_CARD_CAPAB_S4MI_MASK             (0x10U)\r\n#define SDU_FN0_CARD_CAPAB_S4MI_SHIFT            (4U)\r\n/*! S4MI - Support 4-bit Mode Interrupt Supports interrupt between blocks of data in 4-bit mode 0 =\r\n *    card not able to signal an interrupt during a 4-bit multi-block data transfer 1 = card is able\r\n *    to signal an interrupt between blocks during data transfer\r\n */\r\n#define SDU_FN0_CARD_CAPAB_S4MI(x)               (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CAPAB_S4MI_SHIFT)) & SDU_FN0_CARD_CAPAB_S4MI_MASK)\r\n\r\n#define SDU_FN0_CARD_CAPAB_E4MI_MASK             (0x20U)\r\n#define SDU_FN0_CARD_CAPAB_E4MI_SHIFT            (5U)\r\n/*! E4MI - Enable 4-bit Mode Interrupt Enable interrupt between blocks of data in 4-bit mode. */\r\n#define SDU_FN0_CARD_CAPAB_E4MI(x)               (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CAPAB_E4MI_SHIFT)) & SDU_FN0_CARD_CAPAB_E4MI_MASK)\r\n/*! @} */\r\n\r\n/*! @name FUNC0_CIS_0 - Function 0 CIS Pointer 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_FUNC0_CIS_0_F0_CIS_PTR0_MASK (0xFFU)\r\n#define SDU_FN0_CARD_FUNC0_CIS_0_F0_CIS_PTR0_SHIFT (0U)\r\n/*! F0_CIS_PTR0 - CIS Pointer Bits[7:0] */\r\n#define SDU_FN0_CARD_FUNC0_CIS_0_F0_CIS_PTR0(x)  (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_FUNC0_CIS_0_F0_CIS_PTR0_SHIFT)) & SDU_FN0_CARD_FUNC0_CIS_0_F0_CIS_PTR0_MASK)\r\n/*! @} */\r\n\r\n/*! @name FUNC0_CIS_1 - Function 0 CIS Pointer 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_FUNC0_CIS_1_F0_CIS_PTR1_MASK (0xFFU)\r\n#define SDU_FN0_CARD_FUNC0_CIS_1_F0_CIS_PTR1_SHIFT (0U)\r\n/*! F0_CIS_PTR1 - CIS Pointer Bits[15:8] */\r\n#define SDU_FN0_CARD_FUNC0_CIS_1_F0_CIS_PTR1(x)  (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_FUNC0_CIS_1_F0_CIS_PTR1_SHIFT)) & SDU_FN0_CARD_FUNC0_CIS_1_F0_CIS_PTR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name FUNC0_CIS_2 - Function 0 CIS Pointer 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_FUNC0_CIS_2_F0_CIS_PTR2_MASK (0xFFU)\r\n#define SDU_FN0_CARD_FUNC0_CIS_2_F0_CIS_PTR2_SHIFT (0U)\r\n/*! F0_CIS_PTR2 - CIS Pointer Bits[23:16] */\r\n#define SDU_FN0_CARD_FUNC0_CIS_2_F0_CIS_PTR2(x)  (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_FUNC0_CIS_2_F0_CIS_PTR2_SHIFT)) & SDU_FN0_CARD_FUNC0_CIS_2_F0_CIS_PTR2_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUS_SUSP - Bus Suspend */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_BUS_SUSP_BUS_STATUS_MASK    (0x1U)\r\n#define SDU_FN0_CARD_BUS_SUSP_BUS_STATUS_SHIFT   (0U)\r\n/*! BUS_STATUS - Bus Status Bus status indicator 0 = N/A 1 = currently addressed function is currently executing a command */\r\n#define SDU_FN0_CARD_BUS_SUSP_BUS_STATUS(x)      (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_BUS_SUSP_BUS_STATUS_SHIFT)) & SDU_FN0_CARD_BUS_SUSP_BUS_STATUS_MASK)\r\n\r\n#define SDU_FN0_CARD_BUS_SUSP_BUS_RELEASE_MASK   (0x2U)\r\n#define SDU_FN0_CARD_BUS_SUSP_BUS_RELEASE_SHIFT  (1U)\r\n/*! BUS_RELEASE - Bus Release Bus release request/status indicator 0 = N/A 1 = suspend request still in progress */\r\n#define SDU_FN0_CARD_BUS_SUSP_BUS_RELEASE(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_BUS_SUSP_BUS_RELEASE_SHIFT)) & SDU_FN0_CARD_BUS_SUSP_BUS_RELEASE_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUS_SEL - Function Select */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_BUS_SEL_FN_SELECT_MASK      (0xFU)\r\n#define SDU_FN0_CARD_BUS_SEL_FN_SELECT_SHIFT     (0U)\r\n/*! FN_SELECT - Select Function (Not used) */\r\n#define SDU_FN0_CARD_BUS_SEL_FN_SELECT(x)        (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_BUS_SEL_FN_SELECT_SHIFT)) & SDU_FN0_CARD_BUS_SEL_FN_SELECT_MASK)\r\n\r\n#define SDU_FN0_CARD_BUS_SEL_DATA_FLAG_MASK      (0x80U)\r\n#define SDU_FN0_CARD_BUS_SEL_DATA_FLAG_SHIFT     (7U)\r\n/*! DATA_FLAG - Data Flag (Not used) */\r\n#define SDU_FN0_CARD_BUS_SEL_DATA_FLAG(x)        (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_BUS_SEL_DATA_FLAG_SHIFT)) & SDU_FN0_CARD_BUS_SEL_DATA_FLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name EXEC - Execute Flags */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_EXEC_MEM_EXEC_MASK          (0x1U)\r\n#define SDU_FN0_CARD_EXEC_MEM_EXEC_SHIFT         (0U)\r\n/*! MEM_EXEC - Execution Flag for memory (Not used) */\r\n#define SDU_FN0_CARD_EXEC_MEM_EXEC(x)            (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_EXEC_MEM_EXEC_SHIFT)) & SDU_FN0_CARD_EXEC_MEM_EXEC_MASK)\r\n\r\n#define SDU_FN0_CARD_EXEC_FN_EXEC_MASK           (0xFEU)\r\n#define SDU_FN0_CARD_EXEC_FN_EXEC_SHIFT          (1U)\r\n/*! FN_EXEC - Execution Flag for functions (Not used) */\r\n#define SDU_FN0_CARD_EXEC_FN_EXEC(x)             (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_EXEC_FN_EXEC_SHIFT)) & SDU_FN0_CARD_EXEC_FN_EXEC_MASK)\r\n/*! @} */\r\n\r\n/*! @name READY - Ready Flags */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_READY_MEM_RDY_FLAG_MASK     (0x1U)\r\n#define SDU_FN0_CARD_READY_MEM_RDY_FLAG_SHIFT    (0U)\r\n/*! MEM_RDY_FLAG - Ready Flag for memory (Not used) */\r\n#define SDU_FN0_CARD_READY_MEM_RDY_FLAG(x)       (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_READY_MEM_RDY_FLAG_SHIFT)) & SDU_FN0_CARD_READY_MEM_RDY_FLAG_MASK)\r\n\r\n#define SDU_FN0_CARD_READY_FN_RDY_FLAG_MASK      (0xFEU)\r\n#define SDU_FN0_CARD_READY_FN_RDY_FLAG_SHIFT     (1U)\r\n/*! FN_RDY_FLAG - Ready Flag for functions (Not used) */\r\n#define SDU_FN0_CARD_READY_FN_RDY_FLAG(x)        (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_READY_FN_RDY_FLAG_SHIFT)) & SDU_FN0_CARD_READY_FN_RDY_FLAG_MASK)\r\n/*! @} */\r\n\r\n/*! @name FN0_BLOCK_SIZE_0 - Function 0 Block Size 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_FN0_BLOCK_SIZE_0_FN0_BLK_SIZE0_MASK (0xFFU)\r\n#define SDU_FN0_CARD_FN0_BLOCK_SIZE_0_FN0_BLK_SIZE0_SHIFT (0U)\r\n/*! FN0_BLK_SIZE0 - Block size [7:0] for Function 0 I/O block operations */\r\n#define SDU_FN0_CARD_FN0_BLOCK_SIZE_0_FN0_BLK_SIZE0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_FN0_BLOCK_SIZE_0_FN0_BLK_SIZE0_SHIFT)) & SDU_FN0_CARD_FN0_BLOCK_SIZE_0_FN0_BLK_SIZE0_MASK)\r\n/*! @} */\r\n\r\n/*! @name FN0_BLOCK_SIZE_1 - Function 0 Block Size 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_FN0_BLOCK_SIZE_1_FN0_BLK_SIZE1_MASK (0x1U)\r\n#define SDU_FN0_CARD_FN0_BLOCK_SIZE_1_FN0_BLK_SIZE1_SHIFT (0U)\r\n/*! FN0_BLK_SIZE1 - Block size [8] for Function 0 I/O block operations */\r\n#define SDU_FN0_CARD_FN0_BLOCK_SIZE_1_FN0_BLK_SIZE1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_FN0_BLOCK_SIZE_1_FN0_BLK_SIZE1_SHIFT)) & SDU_FN0_CARD_FN0_BLOCK_SIZE_1_FN0_BLK_SIZE1_MASK)\r\n/*! @} */\r\n\r\n/*! @name POWER_CONTROL - Power Control */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_POWER_CONTROL_SMPC_MASK     (0x1U)\r\n#define SDU_FN0_CARD_POWER_CONTROL_SMPC_SHIFT    (0U)\r\n/*! SMPC - Support Master Power Control 0 = do not support 1 = support */\r\n#define SDU_FN0_CARD_POWER_CONTROL_SMPC(x)       (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_POWER_CONTROL_SMPC_SHIFT)) & SDU_FN0_CARD_POWER_CONTROL_SMPC_MASK)\r\n\r\n#define SDU_FN0_CARD_POWER_CONTROL_EMPC_MASK     (0x2U)\r\n#define SDU_FN0_CARD_POWER_CONTROL_EMPC_SHIFT    (1U)\r\n/*! EMPC - Enable Master Power Control 0 = disable 1 = enable */\r\n#define SDU_FN0_CARD_POWER_CONTROL_EMPC(x)       (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_POWER_CONTROL_EMPC_SHIFT)) & SDU_FN0_CARD_POWER_CONTROL_EMPC_MASK)\r\n/*! @} */\r\n\r\n/*! @name BUS_SPEED_SELECT - Bus Speed Select */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_BUS_SPEED_SELECT_SHS_MASK   (0x1U)\r\n#define SDU_FN0_CARD_BUS_SPEED_SELECT_SHS_SHIFT  (0U)\r\n/*! SHS - Support High Speed Mode 0 = do not support 1 = support */\r\n#define SDU_FN0_CARD_BUS_SPEED_SELECT_SHS(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_BUS_SPEED_SELECT_SHS_SHIFT)) & SDU_FN0_CARD_BUS_SPEED_SELECT_SHS_MASK)\r\n\r\n#define SDU_FN0_CARD_BUS_SPEED_SELECT_BSS_MASK   (0xEU)\r\n#define SDU_FN0_CARD_BUS_SPEED_SELECT_BSS_SHIFT  (1U)\r\n/*! BSS - Select Ultra High Speed Mode BSS Bus speed(1. */\r\n#define SDU_FN0_CARD_BUS_SPEED_SELECT_BSS(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_BUS_SPEED_SELECT_BSS_SHIFT)) & SDU_FN0_CARD_BUS_SPEED_SELECT_BSS_MASK)\r\n/*! @} */\r\n\r\n/*! @name UHS_SUPPORT - UHS-I Support */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_UHS_SUPPORT_SSDR50_MASK     (0x1U)\r\n#define SDU_FN0_CARD_UHS_SUPPORT_SSDR50_SHIFT    (0U)\r\n/*! SSDR50 - This bit indicates support of sdr50. */\r\n#define SDU_FN0_CARD_UHS_SUPPORT_SSDR50(x)       (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_UHS_SUPPORT_SSDR50_SHIFT)) & SDU_FN0_CARD_UHS_SUPPORT_SSDR50_MASK)\r\n\r\n#define SDU_FN0_CARD_UHS_SUPPORT_SSDR104_MASK    (0x2U)\r\n#define SDU_FN0_CARD_UHS_SUPPORT_SSDR104_SHIFT   (1U)\r\n/*! SSDR104 - This bit indicates support of sdr104. */\r\n#define SDU_FN0_CARD_UHS_SUPPORT_SSDR104(x)      (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_UHS_SUPPORT_SSDR104_SHIFT)) & SDU_FN0_CARD_UHS_SUPPORT_SSDR104_MASK)\r\n\r\n#define SDU_FN0_CARD_UHS_SUPPORT_SDDR50_MASK     (0x4U)\r\n#define SDU_FN0_CARD_UHS_SUPPORT_SDDR50_SHIFT    (2U)\r\n/*! SDDR50 - This bit indicates support of ddr50. */\r\n#define SDU_FN0_CARD_UHS_SUPPORT_SDDR50(x)       (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_UHS_SUPPORT_SDDR50_SHIFT)) & SDU_FN0_CARD_UHS_SUPPORT_SDDR50_MASK)\r\n/*! @} */\r\n\r\n/*! @name DRIVER_STR - Driver Strength */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_DRIVER_STR_SDTA_MASK        (0x1U)\r\n#define SDU_FN0_CARD_DRIVER_STR_SDTA_SHIFT       (0U)\r\n/*! SDTA - Support Driver Type A This bit indicates support of Driver Type A */\r\n#define SDU_FN0_CARD_DRIVER_STR_SDTA(x)          (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_DRIVER_STR_SDTA_SHIFT)) & SDU_FN0_CARD_DRIVER_STR_SDTA_MASK)\r\n\r\n#define SDU_FN0_CARD_DRIVER_STR_SDTC_MASK        (0x2U)\r\n#define SDU_FN0_CARD_DRIVER_STR_SDTC_SHIFT       (1U)\r\n/*! SDTC - Support Driver Type C This bit indicates support of Driver Type C */\r\n#define SDU_FN0_CARD_DRIVER_STR_SDTC(x)          (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_DRIVER_STR_SDTC_SHIFT)) & SDU_FN0_CARD_DRIVER_STR_SDTC_MASK)\r\n\r\n#define SDU_FN0_CARD_DRIVER_STR_SDTD_MASK        (0x4U)\r\n#define SDU_FN0_CARD_DRIVER_STR_SDTD_SHIFT       (2U)\r\n/*! SDTD - Support Driver Type D This bit indicates support of Driver Type D */\r\n#define SDU_FN0_CARD_DRIVER_STR_SDTD(x)          (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_DRIVER_STR_SDTD_SHIFT)) & SDU_FN0_CARD_DRIVER_STR_SDTD_MASK)\r\n\r\n#define SDU_FN0_CARD_DRIVER_STR_DTS_MASK         (0x30U)\r\n#define SDU_FN0_CARD_DRIVER_STR_DTS_SHIFT        (4U)\r\n/*! DTS - Driver Type Select */\r\n#define SDU_FN0_CARD_DRIVER_STR_DTS(x)           (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_DRIVER_STR_DTS_SHIFT)) & SDU_FN0_CARD_DRIVER_STR_DTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name INTERRUPT_EXT - Interrupt Extension */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_INTERRUPT_EXT_SAI_MASK      (0x1U)\r\n#define SDU_FN0_CARD_INTERRUPT_EXT_SAI_SHIFT     (0U)\r\n/*! SAI - Support Asynchronous Interrupt Support bit of asynchronous interrupt. */\r\n#define SDU_FN0_CARD_INTERRUPT_EXT_SAI(x)        (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_INTERRUPT_EXT_SAI_SHIFT)) & SDU_FN0_CARD_INTERRUPT_EXT_SAI_MASK)\r\n\r\n#define SDU_FN0_CARD_INTERRUPT_EXT_EAI_MASK      (0x2U)\r\n#define SDU_FN0_CARD_INTERRUPT_EXT_EAI_SHIFT     (1U)\r\n/*! EAI - Enable Asynchronous Interrupt Enable bit of asynchronous interrupt. */\r\n#define SDU_FN0_CARD_INTERRUPT_EXT_EAI(x)        (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_INTERRUPT_EXT_EAI_SHIFT)) & SDU_FN0_CARD_INTERRUPT_EXT_EAI_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_CTRL1 - Card Control 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL1_CMD52_WR_ERR_WKUP_EN_MASK (0x1U)\r\n#define SDU_FN0_CARD_CARD_CTRL1_CMD52_WR_ERR_WKUP_EN_SHIFT (0U)\r\n/*! CMD52_WR_ERR_WKUP_EN - CMD52 Write Error Wakeup Enable If host issues CMD52 write access to any\r\n *    off-domain register during sleep mode, setting this bit will trigger wakeup event to the APU.\r\n */\r\n#define SDU_FN0_CARD_CARD_CTRL1_CMD52_WR_ERR_WKUP_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL1_CMD52_WR_ERR_WKUP_EN_SHIFT)) & SDU_FN0_CARD_CARD_CTRL1_CMD52_WR_ERR_WKUP_EN_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL1_CMD52_RD_ERR_WKUP_EN_MASK (0x2U)\r\n#define SDU_FN0_CARD_CARD_CTRL1_CMD52_RD_ERR_WKUP_EN_SHIFT (1U)\r\n/*! CMD52_RD_ERR_WKUP_EN - CMD52 Read Error Wakeup Enable If host issues CMD52 read access to any\r\n *    off-domain register during sleep mode, setting this bit will trigger wakeup event to the APU.\r\n */\r\n#define SDU_FN0_CARD_CARD_CTRL1_CMD52_RD_ERR_WKUP_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL1_CMD52_RD_ERR_WKUP_EN_SHIFT)) & SDU_FN0_CARD_CARD_CTRL1_CMD52_RD_ERR_WKUP_EN_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL1_CMD53_WR_ERR_WKUP_EN_MASK (0x4U)\r\n#define SDU_FN0_CARD_CARD_CTRL1_CMD53_WR_ERR_WKUP_EN_SHIFT (2U)\r\n/*! CMD53_WR_ERR_WKUP_EN - CMD53 Write Error Wakeup Enable If host issues CMD53 write access during\r\n *    sleep mode, setting this bit will trigger wakeup event to the APU.\r\n */\r\n#define SDU_FN0_CARD_CARD_CTRL1_CMD53_WR_ERR_WKUP_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL1_CMD53_WR_ERR_WKUP_EN_SHIFT)) & SDU_FN0_CARD_CARD_CTRL1_CMD53_WR_ERR_WKUP_EN_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL1_CMD53_RD_ERR_WKUP_EN_MASK (0x8U)\r\n#define SDU_FN0_CARD_CARD_CTRL1_CMD53_RD_ERR_WKUP_EN_SHIFT (3U)\r\n/*! CMD53_RD_ERR_WKUP_EN - CMD53 Read Error Wakeup Enable If host issues CMD53 read access during\r\n *    sleep mode, setting this bit will trigger wakeup event to the APU.\r\n */\r\n#define SDU_FN0_CARD_CARD_CTRL1_CMD53_RD_ERR_WKUP_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL1_CMD53_RD_ERR_WKUP_EN_SHIFT)) & SDU_FN0_CARD_CARD_CTRL1_CMD53_RD_ERR_WKUP_EN_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL1_SD_HOST_INT_ACT_LVL_MASK (0x10U)\r\n#define SDU_FN0_CARD_CARD_CTRL1_SD_HOST_INT_ACT_LVL_SHIFT (4U)\r\n/*! SD_HOST_INT_ACT_LVL - SD Host Interrupt Active Level 0 = Active Low 1 = Active High */\r\n#define SDU_FN0_CARD_CARD_CTRL1_SD_HOST_INT_ACT_LVL(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL1_SD_HOST_INT_ACT_LVL_SHIFT)) & SDU_FN0_CARD_CARD_CTRL1_SD_HOST_INT_ACT_LVL_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL1_CMD53_RFIFO_TH_MASK (0xC0U)\r\n#define SDU_FN0_CARD_CARD_CTRL1_CMD53_RFIFO_TH_SHIFT (6U)\r\n/*! CMD53_RFIFO_TH - CMD53 read fifo threshold 00 = 1 block size 01 = .5 block size 10 = ¼ block size 11 = ¾ block size */\r\n#define SDU_FN0_CARD_CARD_CTRL1_CMD53_RFIFO_TH(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL1_CMD53_RFIFO_TH_SHIFT)) & SDU_FN0_CARD_CARD_CTRL1_CMD53_RFIFO_TH_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_CTRL2 - Card Control 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL2_ASYNC_INT_MASK_EN_MASK (0x1U)\r\n#define SDU_FN0_CARD_CARD_CTRL2_ASYNC_INT_MASK_EN_SHIFT (0U)\r\n/*! ASYNC_INT_MASK_EN - Enable asynchronous interrupt mask */\r\n#define SDU_FN0_CARD_CARD_CTRL2_ASYNC_INT_MASK_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL2_ASYNC_INT_MASK_EN_SHIFT)) & SDU_FN0_CARD_CARD_CTRL2_ASYNC_INT_MASK_EN_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL2_NGFF_SD_RST_EN_MASK (0x2U)\r\n#define SDU_FN0_CARD_CARD_CTRL2_NGFF_SD_RST_EN_SHIFT (1U)\r\n/*! NGFF_SD_RST_EN - Allow NGFF SDIO RESET# to reset OCR value. */\r\n#define SDU_FN0_CARD_CARD_CTRL2_NGFF_SD_RST_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL2_NGFF_SD_RST_EN_SHIFT)) & SDU_FN0_CARD_CARD_CTRL2_NGFF_SD_RST_EN_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL2_CMD52_WR_RESP_EN_MASK (0x4U)\r\n#define SDU_FN0_CARD_CARD_CTRL2_CMD52_WR_RESP_EN_SHIFT (2U)\r\n/*! CMD52_WR_RESP_EN - Enable delay of CMD52 write response (Not used) */\r\n#define SDU_FN0_CARD_CARD_CTRL2_CMD52_WR_RESP_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL2_CMD52_WR_RESP_EN_SHIFT)) & SDU_FN0_CARD_CARD_CTRL2_CMD52_WR_RESP_EN_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL2_CMD52_DLY_RES_RDATA_EN_MASK (0x8U)\r\n#define SDU_FN0_CARD_CARD_CTRL2_CMD52_DLY_RES_RDATA_EN_SHIFT (3U)\r\n/*! CMD52_DLY_RES_RDATA_EN - Delay latching of CMD52 read data until it is serially shifted out */\r\n#define SDU_FN0_CARD_CARD_CTRL2_CMD52_DLY_RES_RDATA_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL2_CMD52_DLY_RES_RDATA_EN_SHIFT)) & SDU_FN0_CARD_CARD_CTRL2_CMD52_DLY_RES_RDATA_EN_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL2_CMD52_PWUP_EN_MASK (0x10U)\r\n#define SDU_FN0_CARD_CARD_CTRL2_CMD52_PWUP_EN_SHIFT (4U)\r\n/*! CMD52_PWUP_EN - If this is set to 1, host can issue any CMD52 to wake up the chip. */\r\n#define SDU_FN0_CARD_CARD_CTRL2_CMD52_PWUP_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL2_CMD52_PWUP_EN_SHIFT)) & SDU_FN0_CARD_CARD_CTRL2_CMD52_PWUP_EN_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL2_APU_DEV_SLEEP_EN_MASK (0x20U)\r\n#define SDU_FN0_CARD_CARD_CTRL2_APU_DEV_SLEEP_EN_SHIFT (5U)\r\n/*! APU_DEV_SLEEP_EN - If this is set to 1, the IO_READY status and Card Ready status depend on APU sleep/wake state. */\r\n#define SDU_FN0_CARD_CARD_CTRL2_APU_DEV_SLEEP_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL2_APU_DEV_SLEEP_EN_SHIFT)) & SDU_FN0_CARD_CARD_CTRL2_APU_DEV_SLEEP_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CMD19_CTRL1 - CMD19 Control1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_CMD19_CTRL1_CMD19_TP_ADDR_MASK (0xFFU)\r\n#define SDU_FN0_CARD_CMD19_CTRL1_CMD19_TP_ADDR_SHIFT (0U)\r\n/*! CMD19_TP_ADDR - CMD19 tuning pattern address Set address value for CMD19 tuning pattern array */\r\n#define SDU_FN0_CARD_CMD19_CTRL1_CMD19_TP_ADDR(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CMD19_CTRL1_CMD19_TP_ADDR_SHIFT)) & SDU_FN0_CARD_CMD19_CTRL1_CMD19_TP_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CMD19_CTRL2 - CMD19 Control2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_CMD19_CTRL2_CMD19_TP_DATA_MASK (0xFFU)\r\n#define SDU_FN0_CARD_CMD19_CTRL2_CMD19_TP_DATA_SHIFT (0U)\r\n/*! CMD19_TP_DATA - CMD19 tuning pattern data CMD19 tuning pattern data at cmd19_tp_addr */\r\n#define SDU_FN0_CARD_CMD19_CTRL2_CMD19_TP_DATA(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CMD19_CTRL2_CMD19_TP_DATA_SHIFT)) & SDU_FN0_CARD_CMD19_CTRL2_CMD19_TP_DATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name FUNC_CARD_INT - Function Card Interrupt */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_FUNC_CARD_INT_FN_CARD_INT1_MASK (0xFU)\r\n#define SDU_FN0_CARD_FUNC_CARD_INT_FN_CARD_INT1_SHIFT (0U)\r\n/*! FN_CARD_INT1 - Pending card interrupt for each function to cpu1 */\r\n#define SDU_FN0_CARD_FUNC_CARD_INT_FN_CARD_INT1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_FUNC_CARD_INT_FN_CARD_INT1_SHIFT)) & SDU_FN0_CARD_FUNC_CARD_INT_FN_CARD_INT1_MASK)\r\n\r\n#define SDU_FN0_CARD_FUNC_CARD_INT_FN_CARD_INT2_MASK (0xF0U)\r\n#define SDU_FN0_CARD_FUNC_CARD_INT_FN_CARD_INT2_SHIFT (4U)\r\n/*! FN_CARD_INT2 - Pending card interrupt for each function to cpu2 */\r\n#define SDU_FN0_CARD_FUNC_CARD_INT_FN_CARD_INT2(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_FUNC_CARD_INT_FN_CARD_INT2_SHIFT)) & SDU_FN0_CARD_FUNC_CARD_INT_FN_CARD_INT2_MASK)\r\n/*! @} */\r\n\r\n/*! @name FUNC0_CARD_INTMASK - Function Card Interrupt Mask */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_FUNC0_CARD_INTMASK_FN0_CARD_INTMASK_MASK (0x7U)\r\n#define SDU_FN0_CARD_FUNC0_CARD_INTMASK_FN0_CARD_INTMASK_SHIFT (0U)\r\n/*! FN0_CARD_INTMASK - Card interrupt mask for function 0. */\r\n#define SDU_FN0_CARD_FUNC0_CARD_INTMASK_FN0_CARD_INTMASK(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_FUNC0_CARD_INTMASK_FN0_CARD_INTMASK_SHIFT)) & SDU_FN0_CARD_FUNC0_CARD_INTMASK_FN0_CARD_INTMASK_MASK)\r\n\r\n#define SDU_FN0_CARD_FUNC0_CARD_INTMASK_FN_CARD_INT3_MASK (0xF0U)\r\n#define SDU_FN0_CARD_FUNC0_CARD_INTMASK_FN_CARD_INT3_SHIFT (4U)\r\n/*! FN_CARD_INT3 - Pending card interrupt for each function to cpu3 */\r\n#define SDU_FN0_CARD_FUNC0_CARD_INTMASK_FN_CARD_INT3(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_FUNC0_CARD_INTMASK_FN_CARD_INT3_SHIFT)) & SDU_FN0_CARD_FUNC0_CARD_INTMASK_FN_CARD_INT3_MASK)\r\n/*! @} */\r\n\r\n/*! @name DEV_SLEEP - Device Sleep */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_DEV_SLEEP_DEV_SLEEP_MASK    (0x1U)\r\n#define SDU_FN0_CARD_DEV_SLEEP_DEV_SLEEP_SHIFT   (0U)\r\n/*! DEV_SLEEP - Device Sleep If this is set to 1, IO_READY and CARD_READY status will be 0. */\r\n#define SDU_FN0_CARD_DEV_SLEEP_DEV_SLEEP(x)      (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_DEV_SLEEP_DEV_SLEEP_SHIFT)) & SDU_FN0_CARD_DEV_SLEEP_DEV_SLEEP_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_CTRL3 - Card Control 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL3_CMD53_WR_BUSY_HW_EN_MASK (0x1U)\r\n#define SDU_FN0_CARD_CARD_CTRL3_CMD53_WR_BUSY_HW_EN_SHIFT (0U)\r\n/*! CMD53_WR_BUSY_HW_EN - Main enable bit for cmd53_wr_busy_hw_ctrl feature. */\r\n#define SDU_FN0_CARD_CARD_CTRL3_CMD53_WR_BUSY_HW_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL3_CMD53_WR_BUSY_HW_EN_SHIFT)) & SDU_FN0_CARD_CARD_CTRL3_CMD53_WR_BUSY_HW_EN_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL3_CMD52_PWUP_MASK  (0x40U)\r\n#define SDU_FN0_CARD_CARD_CTRL3_CMD52_PWUP_SHIFT (6U)\r\n/*! CMD52_PWUP - Wakeup signal to APU. */\r\n#define SDU_FN0_CARD_CARD_CTRL3_CMD52_PWUP(x)    (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL3_CMD52_PWUP_SHIFT)) & SDU_FN0_CARD_CARD_CTRL3_CMD52_PWUP_MASK)\r\n/*! @} */\r\n\r\n/*! @name FN0_CARD_INTMASK0 - Function 0 Card Interrupt Mask 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_FN0_CARD_INTMASK0_FN0_CARD_INTMASK0_MASK (0xFFU)\r\n#define SDU_FN0_CARD_FN0_CARD_INTMASK0_FN0_CARD_INTMASK0_SHIFT (0U)\r\n/*! FN0_CARD_INTMASK0 - Function 0 card interrupt mask [7:0] */\r\n#define SDU_FN0_CARD_FN0_CARD_INTMASK0_FN0_CARD_INTMASK0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_FN0_CARD_INTMASK0_FN0_CARD_INTMASK0_SHIFT)) & SDU_FN0_CARD_FN0_CARD_INTMASK0_FN0_CARD_INTMASK0_MASK)\r\n/*! @} */\r\n\r\n/*! @name FN0_CARD_INTMASK1 - Function 0 Card Interrupt Mask 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_FN0_CARD_INTMASK1_FN0_CARD_INTMASK1_MASK (0xFFU)\r\n#define SDU_FN0_CARD_FN0_CARD_INTMASK1_FN0_CARD_INTMASK1_SHIFT (0U)\r\n/*! FN0_CARD_INTMASK1 - Function 0 card interrupt mask [15:8] */\r\n#define SDU_FN0_CARD_FN0_CARD_INTMASK1_FN0_CARD_INTMASK1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_FN0_CARD_INTMASK1_FN0_CARD_INTMASK1_SHIFT)) & SDU_FN0_CARD_FN0_CARD_INTMASK1_FN0_CARD_INTMASK1_MASK)\r\n/*! @} */\r\n\r\n/*! @name FN0_CARD_INTRSR0 - Function 0 Card Interrupt Reset Select 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_FN0_CARD_INTRSR0_FN0_CARD_INTRSR0_MASK (0xFFU)\r\n#define SDU_FN0_CARD_FN0_CARD_INTRSR0_FN0_CARD_INTRSR0_SHIFT (0U)\r\n/*! FN0_CARD_INTRSR0 - Function 0 card interrupt reset select [7:0] 0 = ISR bit clears when 0 is written to it 1 = ISR bit clears when read */\r\n#define SDU_FN0_CARD_FN0_CARD_INTRSR0_FN0_CARD_INTRSR0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_FN0_CARD_INTRSR0_FN0_CARD_INTRSR0_SHIFT)) & SDU_FN0_CARD_FN0_CARD_INTRSR0_FN0_CARD_INTRSR0_MASK)\r\n/*! @} */\r\n\r\n/*! @name FN0_CARD_INTRSR1 - Function 0 Card Interrupt Reset Select 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_FN0_CARD_INTRSR1_FN0_CARD_INTRSR1_MASK (0xFFU)\r\n#define SDU_FN0_CARD_FN0_CARD_INTRSR1_FN0_CARD_INTRSR1_SHIFT (0U)\r\n/*! FN0_CARD_INTRSR1 - Function 0 card interrupt reset select [15:8] 0 = ISR bit clears when 0 is written to it 1 = ISR bit clears when read */\r\n#define SDU_FN0_CARD_FN0_CARD_INTRSR1_FN0_CARD_INTRSR1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_FN0_CARD_INTRSR1_FN0_CARD_INTRSR1_SHIFT)) & SDU_FN0_CARD_FN0_CARD_INTRSR1_FN0_CARD_INTRSR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name FN0_CARD_INTSTATUS0 - Function 0 Card Interrupt Status 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_FN0_CARD_INTSTATUS0_FN0_CARD_INTSTAT0_MASK (0xFFU)\r\n#define SDU_FN0_CARD_FN0_CARD_INTSTATUS0_FN0_CARD_INTSTAT0_SHIFT (0U)\r\n/*! FN0_CARD_INTSTAT0 - Function 0 card interrupt status [7:0] of the following events: [7:1] = fn_ps_event [0] = drv_snth_event */\r\n#define SDU_FN0_CARD_FN0_CARD_INTSTATUS0_FN0_CARD_INTSTAT0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_FN0_CARD_INTSTATUS0_FN0_CARD_INTSTAT0_SHIFT)) & SDU_FN0_CARD_FN0_CARD_INTSTATUS0_FN0_CARD_INTSTAT0_MASK)\r\n/*! @} */\r\n\r\n/*! @name FN0_CARD_INTSTATUS1 - Function 0 Card Interrupt Status 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_FN0_CARD_INTSTATUS1_FN0_CARD_INTSTAT1_MASK (0xFFU)\r\n#define SDU_FN0_CARD_FN0_CARD_INTSTATUS1_FN0_CARD_INTSTAT1_SHIFT (0U)\r\n/*! FN0_CARD_INTSTAT1 - Function 0 card interrupt status [15:8] of the following events: [7] = FN0\r\n *    CMD53 read access during sleep mode [6] = FN0 CMD53 write access during sleep mode [5] = FN0\r\n *    CMD52 read access to off-domain sdu register during sleep mode [4] = FN0 CMD52 write access to\r\n *    off-domain sdu register during sleep mode [3] = CMD5 is received [2] = CMD11 start [1] = CMD11\r\n *    switch start [0] = CMD11 succeeded\r\n */\r\n#define SDU_FN0_CARD_FN0_CARD_INTSTATUS1_FN0_CARD_INTSTAT1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_FN0_CARD_INTSTATUS1_FN0_CARD_INTSTAT1_SHIFT)) & SDU_FN0_CARD_FN0_CARD_INTSTATUS1_FN0_CARD_INTSTAT1_MASK)\r\n/*! @} */\r\n\r\n/*! @name FN0_CARD_ACTVINTMASK0 - Function 0 Card Active Interrupt Mask 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_FN0_CARD_ACTVINTMASK0_FN0_CARD_ACTVINTMASK0_MASK (0xFFU)\r\n#define SDU_FN0_CARD_FN0_CARD_ACTVINTMASK0_FN0_CARD_ACTVINTMASK0_SHIFT (0U)\r\n/*! FN0_CARD_ACTVINTMASK0 - Function 0 card active interrupt mask[7:0] */\r\n#define SDU_FN0_CARD_FN0_CARD_ACTVINTMASK0_FN0_CARD_ACTVINTMASK0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_FN0_CARD_ACTVINTMASK0_FN0_CARD_ACTVINTMASK0_SHIFT)) & SDU_FN0_CARD_FN0_CARD_ACTVINTMASK0_FN0_CARD_ACTVINTMASK0_MASK)\r\n/*! @} */\r\n\r\n/*! @name FN0_CARD_ACTVINTMASK1 - Function 0 Card Active Interrupt Mask 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_FN0_CARD_ACTVINTMASK1_FN0_CARD_ACTVINTMASK1_MASK (0xFFU)\r\n#define SDU_FN0_CARD_FN0_CARD_ACTVINTMASK1_FN0_CARD_ACTVINTMASK1_SHIFT (0U)\r\n/*! FN0_CARD_ACTVINTMASK1 - Function 0 card active interrupt mask[15:8] */\r\n#define SDU_FN0_CARD_FN0_CARD_ACTVINTMASK1_FN0_CARD_ACTVINTMASK1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_FN0_CARD_ACTVINTMASK1_FN0_CARD_ACTVINTMASK1_SHIFT)) & SDU_FN0_CARD_FN0_CARD_ACTVINTMASK1_FN0_CARD_ACTVINTMASK1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_CTRL4 - Card Control 4 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD11_V18_BYPASS_VAL_MASK (0x1U)\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD11_V18_BYPASS_VAL_SHIFT (0U)\r\n/*! CMD11_V18_BYPASS_VAL - FW bypass value that overrides the V18 signal from the SD pad voltage sensor. */\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD11_V18_BYPASS_VAL(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL4_CMD11_V18_BYPASS_VAL_SHIFT)) & SDU_FN0_CARD_CARD_CTRL4_CMD11_V18_BYPASS_VAL_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD11_V18_BYPASS_EN_MASK (0x2U)\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD11_V18_BYPASS_EN_SHIFT (1U)\r\n/*! CMD11_V18_BYPASS_EN - If this is set, the V18 signal from the SD pad voltage sensor is bypassed. */\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD11_V18_BYPASS_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL4_CMD11_V18_BYPASS_EN_SHIFT)) & SDU_FN0_CARD_CARD_CTRL4_CMD11_V18_BYPASS_EN_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD11_VIO_CHK_BYPASS_MASK (0x4U)\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD11_VIO_CHK_BYPASS_SHIFT (2U)\r\n/*! CMD11_VIO_CHK_BYPASS - If this is set, the cmd11 state machine will bypass the VIO pad sensor check. */\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD11_VIO_CHK_BYPASS(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL4_CMD11_VIO_CHK_BYPASS_SHIFT)) & SDU_FN0_CARD_CARD_CTRL4_CMD11_VIO_CHK_BYPASS_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD11_SD_CLK_STOP_BYPASS_MASK (0x8U)\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD11_SD_CLK_STOP_BYPASS_SHIFT (3U)\r\n/*! CMD11_SD_CLK_STOP_BYPASS - If this is set, the cmd11 state machine will bypass the SD clk idle checking logic. */\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD11_SD_CLK_STOP_BYPASS(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL4_CMD11_SD_CLK_STOP_BYPASS_SHIFT)) & SDU_FN0_CARD_CARD_CTRL4_CMD11_SD_CLK_STOP_BYPASS_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD5_R4_S18A_BYPASS_VAL_MASK (0x10U)\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD5_R4_S18A_BYPASS_VAL_SHIFT (4U)\r\n/*! CMD5_R4_S18A_BYPASS_VAL - FW bypass value that overrides the S18A field in cmd5 R4 response. */\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD5_R4_S18A_BYPASS_VAL(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL4_CMD5_R4_S18A_BYPASS_VAL_SHIFT)) & SDU_FN0_CARD_CARD_CTRL4_CMD5_R4_S18A_BYPASS_VAL_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD5_R4_S18A_BYPASS_EN_MASK (0x20U)\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD5_R4_S18A_BYPASS_EN_SHIFT (5U)\r\n/*! CMD5_R4_S18A_BYPASS_EN - If this is set, the S18A field in cmd5 R4 response is bypassed. */\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD5_R4_S18A_BYPASS_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL4_CMD5_R4_S18A_BYPASS_EN_SHIFT)) & SDU_FN0_CARD_CARD_CTRL4_CMD5_R4_S18A_BYPASS_EN_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL4_SET_CMD11_ILLEGAL_MASK (0x40U)\r\n#define SDU_FN0_CARD_CARD_CTRL4_SET_CMD11_ILLEGAL_SHIFT (6U)\r\n/*! SET_CMD11_ILLEGAL - If this is set and SD VIO pad sensor V18=1 (1. */\r\n#define SDU_FN0_CARD_CARD_CTRL4_SET_CMD11_ILLEGAL(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL4_SET_CMD11_ILLEGAL_SHIFT)) & SDU_FN0_CARD_CARD_CTRL4_SET_CMD11_ILLEGAL_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD5_S18R_CHK_MASK (0x80U)\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD5_S18R_CHK_SHIFT (7U)\r\n/*! CMD5_S18R_CHK - If this is set, S18A in R4 depends on CMD5 S18R bit. */\r\n#define SDU_FN0_CARD_CARD_CTRL4_CMD5_S18R_CHK(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL4_CMD5_S18R_CHK_SHIFT)) & SDU_FN0_CARD_CARD_CTRL4_CMD5_S18R_CHK_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_CTRL5 - Card Control 5 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL5_CMD5_R4_FN_BYPASS_VAL_MASK (0x7U)\r\n#define SDU_FN0_CARD_CARD_CTRL5_CMD5_R4_FN_BYPASS_VAL_SHIFT (0U)\r\n/*! CMD5_R4_FN_BYPASS_VAL - FW bypass value that overrides the function number derived from chip strap settings. */\r\n#define SDU_FN0_CARD_CARD_CTRL5_CMD5_R4_FN_BYPASS_VAL(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL5_CMD5_R4_FN_BYPASS_VAL_SHIFT)) & SDU_FN0_CARD_CARD_CTRL5_CMD5_R4_FN_BYPASS_VAL_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL5_CMD5_R4_FN_BYPASS_EN_MASK (0x8U)\r\n#define SDU_FN0_CARD_CARD_CTRL5_CMD5_R4_FN_BYPASS_EN_SHIFT (3U)\r\n/*! CMD5_R4_FN_BYPASS_EN - If this is set, the function number field of R4 is controlled by\r\n *    cmd5_r4_fn_bypass_val rather than from chip strap settings.\r\n */\r\n#define SDU_FN0_CARD_CARD_CTRL5_CMD5_R4_FN_BYPASS_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL5_CMD5_R4_FN_BYPASS_EN_SHIFT)) & SDU_FN0_CARD_CARD_CTRL5_CMD5_R4_FN_BYPASS_EN_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL5_REPEAT_SDU_INIT_MASK (0x10U)\r\n#define SDU_FN0_CARD_CARD_CTRL5_REPEAT_SDU_INIT_SHIFT (4U)\r\n/*! REPEAT_SDU_INIT - If this is set, sdu can handle enumeration sequence initiated by host multiple times */\r\n#define SDU_FN0_CARD_CARD_CTRL5_REPEAT_SDU_INIT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL5_REPEAT_SDU_INIT_SHIFT)) & SDU_FN0_CARD_CARD_CTRL5_REPEAT_SDU_INIT_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL5_RESET_RCA_MASK   (0x20U)\r\n#define SDU_FN0_CARD_CARD_CTRL5_RESET_RCA_SHIFT  (5U)\r\n/*! RESET_RCA - Reset RCA. */\r\n#define SDU_FN0_CARD_CARD_CTRL5_RESET_RCA(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL5_RESET_RCA_SHIFT)) & SDU_FN0_CARD_CARD_CTRL5_RESET_RCA_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL5_SD_RESET_AFTER_CMD52_R5_MASK (0x40U)\r\n#define SDU_FN0_CARD_CARD_CTRL5_SD_RESET_AFTER_CMD52_R5_SHIFT (6U)\r\n/*! SD_RESET_AFTER_CMD52_R5 - Generate sd_reset after cmd52 R5 response. */\r\n#define SDU_FN0_CARD_CARD_CTRL5_SD_RESET_AFTER_CMD52_R5(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL5_SD_RESET_AFTER_CMD52_R5_SHIFT)) & SDU_FN0_CARD_CARD_CTRL5_SD_RESET_AFTER_CMD52_R5_MASK)\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL5_CMD52_RES_VALID_MODE_MASK (0x80U)\r\n#define SDU_FN0_CARD_CARD_CTRL5_CMD52_RES_VALID_MODE_SHIFT (7U)\r\n/*! CMD52_RES_VALID_MODE - CMD52 response valid mode 0 = CMD52 response valid is generated only\r\n *    after write operation is completed in the ahb_clk domain.\r\n */\r\n#define SDU_FN0_CARD_CARD_CTRL5_CMD52_RES_VALID_MODE(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL5_CMD52_RES_VALID_MODE_SHIFT)) & SDU_FN0_CARD_CARD_CTRL5_CMD52_RES_VALID_MODE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_CTRL6 - Card Control 6 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL6_TESTBUS_SEL_LO_MASK (0xFFU)\r\n#define SDU_FN0_CARD_CARD_CTRL6_TESTBUS_SEL_LO_SHIFT (0U)\r\n/*! TESTBUS_SEL_LO - SDU testbus select [7:0] */\r\n#define SDU_FN0_CARD_CARD_CTRL6_TESTBUS_SEL_LO(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL6_TESTBUS_SEL_LO_SHIFT)) & SDU_FN0_CARD_CARD_CTRL6_TESTBUS_SEL_LO_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_CTRL7 - Card Control 7 */\r\n/*! @{ */\r\n\r\n#define SDU_FN0_CARD_CARD_CTRL7_TESTBUS_SEL_HI_MASK (0xFFU)\r\n#define SDU_FN0_CARD_CARD_CTRL7_TESTBUS_SEL_HI_SHIFT (0U)\r\n/*! TESTBUS_SEL_HI - SDU testbus select [15:8] */\r\n#define SDU_FN0_CARD_CARD_CTRL7_TESTBUS_SEL_HI(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN0_CARD_CARD_CTRL7_TESTBUS_SEL_HI_SHIFT)) & SDU_FN0_CARD_CARD_CTRL7_TESTBUS_SEL_HI_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SDU_FN0_CARD_Register_Masks */\r\n\r\n\r\n/* SDU_FN0_CARD - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral SDU_FN0_CARD base address */\r\n  #define SDU_FN0_CARD_BASE                        (0x50158000u)\r\n  /** Peripheral SDU_FN0_CARD base address */\r\n  #define SDU_FN0_CARD_BASE_NS                     (0x40158000u)\r\n  /** Peripheral SDU_FN0_CARD base pointer */\r\n  #define SDU_FN0_CARD                             ((SDU_FN0_CARD_Type *)SDU_FN0_CARD_BASE)\r\n  /** Peripheral SDU_FN0_CARD base pointer */\r\n  #define SDU_FN0_CARD_NS                          ((SDU_FN0_CARD_Type *)SDU_FN0_CARD_BASE_NS)\r\n  /** Array initializer of SDU_FN0_CARD peripheral base addresses */\r\n  #define SDU_FN0_CARD_BASE_ADDRS                  { SDU_FN0_CARD_BASE }\r\n  /** Array initializer of SDU_FN0_CARD peripheral base pointers */\r\n  #define SDU_FN0_CARD_BASE_PTRS                   { SDU_FN0_CARD }\r\n  /** Array initializer of SDU_FN0_CARD peripheral base addresses */\r\n  #define SDU_FN0_CARD_BASE_ADDRS_NS               { SDU_FN0_CARD_BASE_NS }\r\n  /** Array initializer of SDU_FN0_CARD peripheral base pointers */\r\n  #define SDU_FN0_CARD_BASE_PTRS_NS                { SDU_FN0_CARD_NS }\r\n#else\r\n  /** Peripheral SDU_FN0_CARD base address */\r\n  #define SDU_FN0_CARD_BASE                        (0x40158000u)\r\n  /** Peripheral SDU_FN0_CARD base pointer */\r\n  #define SDU_FN0_CARD                             ((SDU_FN0_CARD_Type *)SDU_FN0_CARD_BASE)\r\n  /** Array initializer of SDU_FN0_CARD peripheral base addresses */\r\n  #define SDU_FN0_CARD_BASE_ADDRS                  { SDU_FN0_CARD_BASE }\r\n  /** Array initializer of SDU_FN0_CARD peripheral base pointers */\r\n  #define SDU_FN0_CARD_BASE_PTRS                   { SDU_FN0_CARD }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SDU_FN0_CARD_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SDU_FN_CARD Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SDU_FN_CARD_Peripheral_Access_Layer SDU_FN_CARD Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** SDU_FN_CARD - Register Layout Typedef */\r\ntypedef struct {\r\n  __I  uint8_t H2C_INTEVENT;                       /**< Host to Card Interrupt Event, offset: 0x0 */\r\n       uint8_t RESERVED_0[3];\r\n  __I  uint8_t HOST_INTRSR0;                       /**< Host Interrupt Reset Select 0, offset: 0x4 */\r\n  __I  uint8_t HOST_INTRSR1;                       /**< Host Interrupt Reset Select 1, offset: 0x5 */\r\n       uint8_t RESERVED_1[2];\r\n  __I  uint8_t HOST_INTMASK0;                      /**< Host Interrupt Mask 0, offset: 0x8 */\r\n  __I  uint8_t HOST_INTMASK1;                      /**< Host Interrupt Mask 1, offset: 0x9 */\r\n       uint8_t RESERVED_2[2];\r\n  __I  uint8_t HOST_INTSTATUS0;                    /**< Host Interrupt Status 0, offset: 0xC */\r\n  __I  uint8_t HOST_INTSTATUS1;                    /**< Host Interrupt Status 1, offset: 0xD */\r\n       uint8_t RESERVED_3[2];\r\n  __IO uint8_t PKT_RD_BITMAP0;                     /**< Packet Read Bitmap 0, offset: 0x10 */\r\n  __IO uint8_t PKT_RD_BITMAP1;                     /**< Packet Read Bitmap 1, offset: 0x11 */\r\n  __IO uint8_t PKT_RD_BITMAP2;                     /**< Packet Read Bitmap 2, offset: 0x12 */\r\n  __IO uint8_t PKT_RD_BITMAP3;                     /**< Packet Read Bitmap 3, offset: 0x13 */\r\n  __IO uint8_t PKT_WR_BITMAP0;                     /**< Packet Write Bitmap 0, offset: 0x14 */\r\n  __IO uint8_t PKT_WR_BITMAP1;                     /**< Packet Write Bitmap 1, offset: 0x15 */\r\n  __IO uint8_t PKT_WR_BITMAP2;                     /**< Packet Write Bitmap 2, offset: 0x16 */\r\n  __IO uint8_t PKT_WR_BITMAP3;                     /**< Packet Write Bitmap 3, offset: 0x17 */\r\n  __IO uint8_t PORT0_RD_LEN0;                      /**< Port 0 Packet Read Length 0, offset: 0x18 */\r\n  __IO uint8_t PORT0_RD_LEN1;                      /**< Port 0 Packet Read Length 1, offset: 0x19 */\r\n  __IO uint8_t PORT1_RD_LEN0;                      /**< Port 1 Packet Read Length 0, offset: 0x1A */\r\n  __IO uint8_t PORT1_RD_LEN1;                      /**< Port 1 Packet Read Length 1, offset: 0x1B */\r\n  __IO uint8_t PORT2_RD_LEN0;                      /**< Port 2 Packet Read Length 0, offset: 0x1C */\r\n  __IO uint8_t PORT2_RD_LEN1;                      /**< Port 2 Packet Read Length 1, offset: 0x1D */\r\n  __IO uint8_t PORT3_RD_LEN0;                      /**< Port 3 Packet Read Length 0, offset: 0x1E */\r\n  __IO uint8_t PORT3_RD_LEN1;                      /**< Port 3 Packet Read Length 1, offset: 0x1F */\r\n  __IO uint8_t PORT4_RD_LEN0;                      /**< Port 4 Packet Read Length 0, offset: 0x20 */\r\n  __IO uint8_t PORT4_RD_LEN1;                      /**< Port 4 Packet Read Length 1, offset: 0x21 */\r\n  __IO uint8_t PORT5_RD_LEN0;                      /**< Port 5 Packet Read Length 0, offset: 0x22 */\r\n  __IO uint8_t PORT5_RD_LEN1;                      /**< Port 5 Packet Read Length 1, offset: 0x23 */\r\n  __IO uint8_t PORT6_RD_LEN0;                      /**< Port 6 Packet Read Length 0, offset: 0x24 */\r\n  __IO uint8_t PORT6_RD_LEN1;                      /**< Port 6 Packet Read Length 1, offset: 0x25 */\r\n  __IO uint8_t PORT7_RD_LEN0;                      /**< Port 7 Packet Read Length 0, offset: 0x26 */\r\n  __IO uint8_t PORT7_RD_LEN1;                      /**< Port 7 Packet Read Length 1, offset: 0x27 */\r\n  __IO uint8_t PORT8_RD_LEN0;                      /**< Port 8 Packet Read Length 0, offset: 0x28 */\r\n  __IO uint8_t PORT8_RD_LEN1;                      /**< Port 8 Packet Read Length 1, offset: 0x29 */\r\n  __IO uint8_t PORT9_RD_LEN0;                      /**< Port 9 Packet Read Length 0, offset: 0x2A */\r\n  __IO uint8_t PORT9_RD_LEN1;                      /**< Port 9 Packet Read Length 1, offset: 0x2B */\r\n  __IO uint8_t PORT10_RD_LEN0;                     /**< Port 10 Packet Read Length 0, offset: 0x2C */\r\n  __IO uint8_t PORT10_RD_LEN1;                     /**< Port 10 Packet Read Length 1, offset: 0x2D */\r\n  __IO uint8_t PORT11_RD_LEN0;                     /**< Port 11 Packet Read Length 0, offset: 0x2E */\r\n  __IO uint8_t PORT11_RD_LEN1;                     /**< Port 11 Packet Read Length 1, offset: 0x2F */\r\n  __IO uint8_t PORT12_RD_LEN0;                     /**< Port 12 Packet Read Length 0, offset: 0x30 */\r\n  __IO uint8_t PORT12_RD_LEN1;                     /**< Port 12 Packet Read Length 1, offset: 0x31 */\r\n  __IO uint8_t PORT13_RD_LEN0;                     /**< Port 13 Packet Read Length 0, offset: 0x32 */\r\n  __IO uint8_t PORT13_RD_LEN1;                     /**< Port 13 Packet Read Length 1, offset: 0x33 */\r\n  __IO uint8_t PORT14_RD_LEN0;                     /**< Port 14 Packet Read Length 0, offset: 0x34 */\r\n  __IO uint8_t PORT14_RD_LEN1;                     /**< Port 14 Packet Read Length 1, offset: 0x35 */\r\n  __IO uint8_t PORT15_RD_LEN0;                     /**< Port 15 Packet Read Length 0, offset: 0x36 */\r\n  __IO uint8_t PORT15_RD_LEN1;                     /**< Port 15 Packet Read Length 1, offset: 0x37 */\r\n  __IO uint8_t PORT16_RD_LEN0;                     /**< Port 16 Packet Read Length 0, offset: 0x38 */\r\n  __IO uint8_t PORT16_RD_LEN1;                     /**< Port 16 Packet Read Length 1, offset: 0x39 */\r\n  __IO uint8_t PORT17_RD_LEN0;                     /**< Port 17 Packet Read Length 0, offset: 0x3A */\r\n  __IO uint8_t PORT17_RD_LEN1;                     /**< Port 17 Packet Read Length 1, offset: 0x3B */\r\n  __IO uint8_t PORT18_RD_LEN0;                     /**< Port 18 Packet Read Length 0, offset: 0x3C */\r\n  __IO uint8_t PORT18_RD_LEN1;                     /**< Port 18 Packet Read Length 1, offset: 0x3D */\r\n  __IO uint8_t PORT19_RD_LEN0;                     /**< Port 19 Packet Read Length 0, offset: 0x3E */\r\n  __IO uint8_t PORT19_RD_LEN1;                     /**< Port 19 Packet Read Length 1, offset: 0x3F */\r\n  __IO uint8_t PORT20_RD_LEN0;                     /**< Port 20 Packet Read Length 0, offset: 0x40 */\r\n  __IO uint8_t PORT20_RD_LEN1;                     /**< Port 20 Packet Read Length 1, offset: 0x41 */\r\n  __IO uint8_t PORT21_RD_LEN0;                     /**< Port 21 Packet Read Length 0, offset: 0x42 */\r\n  __IO uint8_t PORT21_RD_LEN1;                     /**< Port 21 Packet Read Length 1, offset: 0x43 */\r\n  __IO uint8_t PORT22_RD_LEN0;                     /**< Port 22 Packet Read Length 0, offset: 0x44 */\r\n  __IO uint8_t PORT22_RD_LEN1;                     /**< Port 22 Packet Read Length 1, offset: 0x45 */\r\n  __IO uint8_t PORT23_RD_LEN0;                     /**< Port 23 Packet Read Length 0, offset: 0x46 */\r\n  __IO uint8_t PORT23_RD_LEN1;                     /**< Port 23 Packet Read Length 1, offset: 0x47 */\r\n  __IO uint8_t PORT24_RD_LEN0;                     /**< Port 24 Packet Read Length 0, offset: 0x48 */\r\n  __IO uint8_t PORT24_RD_LEN1;                     /**< Port 24 Packet Read Length 1, offset: 0x49 */\r\n  __IO uint8_t PORT25_RD_LEN0;                     /**< Port 25 Packet Read Length 0, offset: 0x4A */\r\n  __IO uint8_t PORT25_RD_LEN1;                     /**< Port 25 Packet Read Length 1, offset: 0x4B */\r\n  __IO uint8_t PORT26_RD_LEN0;                     /**< Port 26 Packet Read Length 0, offset: 0x4C */\r\n  __IO uint8_t PORT26_RD_LEN1;                     /**< Port 26 Packet Read Length 1, offset: 0x4D */\r\n  __IO uint8_t PORT27_RD_LEN0;                     /**< Port 27 Packet Read Length 0, offset: 0x4E */\r\n  __IO uint8_t PORT27_RD_LEN1;                     /**< Port 27 Packet Read Length 1, offset: 0x4F */\r\n  __IO uint8_t PORT28_RD_LEN0;                     /**< Port 28 Packet Read Length 0, offset: 0x50 */\r\n  __IO uint8_t PORT28_RD_LEN1;                     /**< Port 28 Packet Read Length 1, offset: 0x51 */\r\n  __IO uint8_t PORT29_RD_LEN0;                     /**< Port 29 Packet Read Length 0, offset: 0x52 */\r\n  __IO uint8_t PORT29_RD_LEN1;                     /**< Port 29 Packet Read Length 1, offset: 0x53 */\r\n  __IO uint8_t PORT30_RD_LEN0;                     /**< Port 30 Packet Read Length 0, offset: 0x54 */\r\n  __IO uint8_t PORT30_RD_LEN1;                     /**< Port 30 Packet Read Length 1, offset: 0x55 */\r\n  __IO uint8_t PORT31_RD_LEN0;                     /**< Port 31 Packet Read Length 0, offset: 0x56 */\r\n  __IO uint8_t PORT31_RD_LEN1;                     /**< Port 31 Packet Read Length 1, offset: 0x57 */\r\n  __I  uint8_t HOST_RESTART;                       /**< Host Transfer Status, offset: 0x58 */\r\n  __IO uint8_t FN_CARD_INTMASK;                    /**< Function Card Interrupt Mask, offset: 0x59 */\r\n  __IO uint8_t Q_PRT_RANGE0;                       /**< Queue Port Range 0, offset: 0x5A */\r\n  __IO uint8_t Q_PRT_RANGE1;                       /**< Queue Port Range 1, offset: 0x5B */\r\n  __IO uint8_t C2H_INTEVENT0;                      /**< Card to Host Event 0, offset: 0x5C */\r\n  __IO uint8_t C2H_INTEVENT1;                      /**< Card to Host Event 1, offset: 0x5D */\r\n       uint8_t RESERVED_4[2];\r\n  __IO uint8_t CARD_INTMASK0;                      /**< Card Interrupt Mask 0, offset: 0x60 */\r\n  __IO uint8_t CARD_INTMASK1;                      /**< Card Interrupt Mask 1, offset: 0x61 */\r\n  __IO uint8_t CARD_INTMASK2;                      /**< Card Interrupt Mask 2, offset: 0x62 */\r\n       uint8_t RESERVED_5[1];\r\n  __I  uint8_t CARD_INTSTATUS0;                    /**< Card Interrupt Status 0, offset: 0x64 */\r\n  __I  uint8_t CARD_INTSTATUS1;                    /**< Card Interrupt Status 1, offset: 0x65 */\r\n  __I  uint8_t CARD_INTSTATUS2;                    /**< Card Interrupt Status 2, offset: 0x66 */\r\n       uint8_t RESERVED_6[1];\r\n  __IO uint8_t CARD_INTRSR0;                       /**< Card Interrupt Reset Select 0, offset: 0x68 */\r\n  __IO uint8_t CARD_INTRSR1;                       /**< Card Interrupt Reset Select 1, offset: 0x69 */\r\n  __IO uint8_t CARD_INTRSR2;                       /**< Card Interrupt Reset Select 2, offset: 0x6A */\r\n       uint8_t RESERVED_7[1];\r\n  __IO uint8_t RD_BASE0;                           /**< SQ Read Base Address 0, offset: 0x6C */\r\n  __IO uint8_t RD_BASE1;                           /**< SQ Read Base Address 1, offset: 0x6D */\r\n  __IO uint8_t RD_BASE2;                           /**< SQ Read Base Address 2, offset: 0x6E */\r\n  __IO uint8_t RD_BASE3;                           /**< SQ Read Base Address 3, offset: 0x6F */\r\n  __IO uint8_t WR_BASE0;                           /**< SQ Write Base Address 0, offset: 0x70 */\r\n  __IO uint8_t WR_BASE1;                           /**< SQ Write Base Address 1, offset: 0x71 */\r\n  __IO uint8_t WR_BASE2;                           /**< SQ Write Base Address 2, offset: 0x72 */\r\n  __IO uint8_t WR_BASE3;                           /**< SQ Write Base Address 3, offset: 0x73 */\r\n  __IO uint8_t RD_IDX;                             /**< Read Base Address Index, offset: 0x74 */\r\n  __IO uint8_t WR_IDX;                             /**< Write Base Address Index, offset: 0x75 */\r\n       uint8_t RESERVED_8[2];\r\n  __IO uint8_t APU_SLP_RDY_EN;                     /**< APU Sleep Ready Enable, offset: 0x78 */\r\n       uint8_t RESERVED_9[3];\r\n  __IO uint8_t HOST_ERR_WKUP_EN;                   /**< Host Error Wakeup Enable, offset: 0x7C */\r\n       uint8_t RESERVED_10[3];\r\n  __I  uint8_t HOST_ERR_CMD0;                      /**< Host Error Command 0, offset: 0x80 */\r\n  __I  uint8_t HOST_ERR_CMD1;                      /**< Host Error Command 1, offset: 0x81 */\r\n  __I  uint8_t HOST_ERR_CMD2;                      /**< Host Error Command 2, offset: 0x82 */\r\n  __I  uint8_t HOST_ERR_CMD3;                      /**< Host Error Command 3, offset: 0x83 */\r\n  __I  uint8_t HOST_ERR_CMD4;                      /**< Host Error Command 4, offset: 0x84 */\r\n  __I  uint8_t HOST_ERR_CMD5;                      /**< Host Error Command 5, offset: 0x85 */\r\n       uint8_t RESERVED_11[2];\r\n  __O  uint8_t PKT_WR_BITMAP_CLR0;                 /**< Packet Write Bitmap Clear 0, offset: 0x88 */\r\n  __O  uint8_t PKT_WR_BITMAP_CLR1;                 /**< Packet Write Bitmap Clear 1, offset: 0x89 */\r\n  __O  uint8_t PKT_WR_BITMAP_CLR2;                 /**< Packet Write Bitmap Clear 2, offset: 0x8A */\r\n  __O  uint8_t PKT_WR_BITMAP_CLR3;                 /**< Packet Write Bitmap Clear 3, offset: 0x8B */\r\n  __O  uint8_t PKT_RD_BITMAP_CLR0;                 /**< Packet Read Bitmap Clear 0, offset: 0x8C */\r\n  __O  uint8_t PKT_RD_BITMAP_CLR1;                 /**< Packet Read Bitmap Clear 1, offset: 0x8D */\r\n  __O  uint8_t PKT_RD_BITMAP_CLR2;                 /**< Packet Read Bitmap Clear 2, offset: 0x8E */\r\n  __O  uint8_t PKT_RD_BITMAP_CLR3;                 /**< Packet Read Bitmap Clear 3, offset: 0x8F */\r\n  __IO uint8_t HOST_INT_ACT_MASK_EN0;              /**< Host Interrupt Active Mask Enable 0, offset: 0x90 */\r\n  __IO uint8_t HOST_INT_ACT_MASK_EN1;              /**< Host Interrupt Active Mask Enable 1, offset: 0x91 */\r\n  __IO uint8_t HOST_INT_ACT_MASK_EN2;              /**< Host Interrupt Active Mask Enable 2, offset: 0x92 */\r\n  __IO uint8_t HOST_INT_ACT_MASK_EN3;              /**< Host Interrupt Active Mask Enable 3, offset: 0x93 */\r\n  __O  uint8_t HOST_INT_ACT_MASK_CLR0;             /**< Host Interrupt Active Mask Clear 0, offset: 0x94 */\r\n  __O  uint8_t HOST_INT_ACT_MASK_CLR1;             /**< Host Interrupt Active Mask Clear 1, offset: 0x95 */\r\n  __O  uint8_t HOST_INT_ACT_MASK_CLR2;             /**< Host Interrupt Active Mask Clear 2, offset: 0x96 */\r\n  __O  uint8_t HOST_INT_ACT_MASK_CLR3;             /**< Host Interrupt Active Mask Clear 3, offset: 0x97 */\r\n  __I  uint8_t HOST_INT_ACT_MASK_STATUS0;          /**< Host Interrupt Active Mask Status 0, offset: 0x98 */\r\n  __I  uint8_t HOST_INT_ACT_MASK_STATUS1;          /**< Host Interrupt Active Mask Status 1, offset: 0x99 */\r\n  __I  uint8_t HOST_INT_ACT_MASK_STATUS2;          /**< Host Interrupt Active Mask Status 2, offset: 0x9A */\r\n  __I  uint8_t HOST_INT_ACT_MASK_STATUS3;          /**< Host Interrupt Active Mask Status 3, offset: 0x9B */\r\n  __IO uint8_t CARD_INT_ACT_MASK_EN0;              /**< Card Interrupt Active Mask Enable 0, offset: 0x9C */\r\n  __IO uint8_t CARD_INT_ACT_MASK_EN1;              /**< Card Interrupt Active Mask Enable 1, offset: 0x9D */\r\n  __IO uint8_t CARD_INT_ACT_MASK_EN2;              /**< Card Interrupt Active Mask Enable 2, offset: 0x9E */\r\n  __IO uint8_t CARD_INT_ACT_MASK_EN3;              /**< Card Interrupt Active Mask Enable 3, offset: 0x9F */\r\n  __O  uint8_t CARD_INT_ACT_MASK_CLR0;             /**< Card Interrupt Active Mask Clear 0, offset: 0xA0 */\r\n  __O  uint8_t CARD_INT_ACT_MASK_CLR1;             /**< Card Interrupt Active Mask Clear 1, offset: 0xA1 */\r\n  __O  uint8_t CARD_INT_ACT_MASK_CLR2;             /**< Card Interrupt Active Mask Clear 2, offset: 0xA2 */\r\n  __O  uint8_t CARD_INT_ACT_MASK_CLR3;             /**< Card Interrupt Active Mask Clear 3, offset: 0xA3 */\r\n  __I  uint8_t CARD_INT_ACT_MASK_STATUS0;          /**< Card Interrupt Active Mask Status 0, offset: 0xA4 */\r\n  __I  uint8_t CARD_INT_ACT_MASK_STATUS1;          /**< Card Interrupt Active Mask Status 1, offset: 0xA5 */\r\n  __I  uint8_t CARD_INT_ACT_MASK_STATUS2;          /**< Card Interrupt Active Mask Status 2, offset: 0xA6 */\r\n  __I  uint8_t CARD_INT_ACT_MASK_STATUS3;          /**< Card Interrupt Active Mask Status 3, offset: 0xA7 */\r\n       uint8_t RESERVED_12[16];\r\n  __IO uint8_t CMD_PORT_WR_BASE_0;                 /**< Command Port SQ Write Base Address 0, offset: 0xB8 */\r\n  __IO uint8_t CMD_PORT_WR_BASE_1;                 /**< Command Port SQ Write Base Address 1, offset: 0xB9 */\r\n  __IO uint8_t CMD_PORT_WR_BASE_2;                 /**< Command Port SQ Write Base Address 2, offset: 0xBA */\r\n  __IO uint8_t CMD_PORT_WR_BASE_3;                 /**< Command Port SQ Write Base Address 3, offset: 0xBB */\r\n  __IO uint8_t CMD_PORT_RD_BASE_0;                 /**< Command Port SQ Read Base Address 0, offset: 0xBC */\r\n  __IO uint8_t CMD_PORT_RD_BASE_1;                 /**< Command Port SQ Read Base Address 1, offset: 0xBD */\r\n  __IO uint8_t CMD_PORT_RD_BASE_2;                 /**< Command Port SQ Read Base Address 2, offset: 0xBE */\r\n  __IO uint8_t CMD_PORT_RD_BASE_3;                 /**< Command Port SQ Read Base Address 3, offset: 0xBF */\r\n  __IO uint8_t CMD_PORT_RD_LEN_0;                  /**< Command Port Read Length 0, offset: 0xC0 */\r\n  __IO uint8_t CMD_PORT_RD_LEN_1;                  /**< Command Port Read Length 1, offset: 0xC1 */\r\n       uint8_t RESERVED_13[2];\r\n  __IO uint8_t CMD_PORT_CONFIG_0;                  /**< Command Port Config 0, offset: 0xC4 */\r\n  __IO uint8_t CMD_PORT_CONFIG_1;                  /**< Command Port Config 1, offset: 0xC5 */\r\n  __I  uint8_t CMD_PORT_CONFIG_2;                  /**< Command Port Config 2, offset: 0xC6 */\r\n  __I  uint8_t CMD_PORT_CONFIG_3;                  /**< Command Port Config 3, offset: 0xC7 */\r\n  __I  uint8_t CHIP_REV;                           /**< Chip Revision, offset: 0xC8 */\r\n       uint8_t RESERVED_14[1];\r\n  __I  uint8_t IP_REV0;                            /**< SDU Minor IP Revision, offset: 0xCA */\r\n  __I  uint8_t IP_REV1;                            /**< SDU Major IP Revision, offset: 0xCB */\r\n  __IO uint8_t PKT_END_RADDR0;                     /**< PKT_END_RADDR0, offset: 0xCC */\r\n  __IO uint8_t PKT_END_RADDR1;                     /**< PKT_END_RADDR1, offset: 0xCD */\r\n  __IO uint8_t PKT_END_RADDR2;                     /**< PKT_END_RADDR2, offset: 0xCE */\r\n  __IO uint8_t PKT_END_RADDR3;                     /**< PKT_END_RADDR3, offset: 0xCF */\r\n  __IO uint8_t PKT_END_WADDR0;                     /**< PKT_END_WADDR0, offset: 0xD0 */\r\n  __IO uint8_t PKT_END_WADDR1;                     /**< PKT_END_WADDR1, offset: 0xD1 */\r\n  __IO uint8_t PKT_END_WADDR2;                     /**< PKT_END_WADDR2, offset: 0xD2 */\r\n  __IO uint8_t PKT_END_WADDR3;                     /**< PKT_END_WADDR3, offset: 0xD3 */\r\n  __I  uint8_t OCR_0;                              /**< Operation Conditions 0, offset: 0xD4 */\r\n  __I  uint8_t OCR_1;                              /**< Operation Conditions 1, offset: 0xD5 */\r\n  __I  uint8_t OCR_2;                              /**< Operation Conditions 2, offset: 0xD6 */\r\n  __IO uint8_t CARD_CONFIG_1;                      /**< Card Config1, offset: 0xD7 */\r\n  __IO uint8_t CARD_CONFIG2_0;                     /**< Card Config2 0, offset: 0xD8 */\r\n  __IO uint8_t CARD_CONFIG2_1;                     /**< Card Config2 1, offset: 0xD9 */\r\n  __IO uint8_t CARD_CONFIG2_2;                     /**< Card Config2 2, offset: 0xDA */\r\n  __IO uint8_t CARD_CONFIG2_3;                     /**< Card Config2 3, offset: 0xDB */\r\n  __I  uint8_t TESTBUS0;                           /**< Testbus 0, offset: 0xDC */\r\n  __I  uint8_t TESTBUS1;                           /**< Testbus 1, offset: 0xDD */\r\n  __I  uint8_t RCA0;                               /**< RCA 0, offset: 0xDE */\r\n  __I  uint8_t RCA1;                               /**< RCA 1, offset: 0xDF */\r\n  __I  uint8_t DMA_ADDR0;                          /**< DMA Address 0, offset: 0xE0 */\r\n  __I  uint8_t DMA_ADDR1;                          /**< DMA Address 1, offset: 0xE1 */\r\n  __I  uint8_t DMA_ADDR2;                          /**< DMA Address 2, offset: 0xE2 */\r\n  __I  uint8_t DMA_ADDR3;                          /**< DMA Address 3, offset: 0xE3 */\r\n  __I  uint8_t IO_PORT0;                           /**< I/O Port 0, offset: 0xE4 */\r\n  __I  uint8_t IO_PORT1;                           /**< I/O Port 1, offset: 0xE5 */\r\n  __I  uint8_t IO_PORT2;                           /**< I/O Port 2, offset: 0xE6 */\r\n       uint8_t RESERVED_15[1];\r\n  __IO uint8_t SCRATCH2_0;                         /**< Scratch 2 0, offset: 0xE8 */\r\n  __IO uint8_t SCRATCH2_1;                         /**< Scratch 2 1, offset: 0xE9 */\r\n  __IO uint8_t SCRATCH2_2;                         /**< Scratch 2 2, offset: 0xEA */\r\n  __IO uint8_t SCRATCH2_3;                         /**< Scratch 2 3, offset: 0xEB */\r\n  __IO uint8_t SCRATCH3_0;                         /**< Scratch 3 0, offset: 0xEC */\r\n  __IO uint8_t SCRATCH3_1;                         /**< Scratch 3 1, offset: 0xED */\r\n  __IO uint8_t SCRATCH3_2;                         /**< Scratch 3 2, offset: 0xEE */\r\n  __IO uint8_t SCRATCH3_3;                         /**< Scratch 3 3, offset: 0xEF */\r\n  __IO uint8_t SCRATCH4_0;                         /**< Scratch 4 0, offset: 0xF0 */\r\n  __IO uint8_t SCRATCH4_1;                         /**< Scratch 4 1, offset: 0xF1 */\r\n  __IO uint8_t SCRATCH4_2;                         /**< Scratch 4 2, offset: 0xF2 */\r\n  __IO uint8_t SCRATCH4_3;                         /**< Scratch 4 3, offset: 0xF3 */\r\n  __IO uint8_t SCRATCH5_0;                         /**< Scratch 5 0, offset: 0xF4 */\r\n  __IO uint8_t SCRATCH5_1;                         /**< Scratch 5 1, offset: 0xF5 */\r\n  __IO uint8_t SCRATCH5_2;                         /**< Scratch 5 2, offset: 0xF6 */\r\n  __IO uint8_t SCRATCH5_3;                         /**< Scratch 5 3, offset: 0xF7 */\r\n  __IO uint8_t SCRATCH6_0;                         /**< Scratch 6 0, offset: 0xF8 */\r\n  __IO uint8_t SCRATCH6_1;                         /**< Scratch 6 1, offset: 0xF9 */\r\n  __IO uint8_t SCRATCH6_2;                         /**< Scratch 6 2, offset: 0xFA */\r\n  __IO uint8_t SCRATCH6_3;                         /**< Scratch 6 3, offset: 0xFB */\r\n  __IO uint8_t SCRATCH7_0;                         /**< Scratch 7 0, offset: 0xFC */\r\n  __IO uint8_t SCRATCH7_1;                         /**< Scratch 7 1, offset: 0xFD */\r\n  __IO uint8_t SCRATCH7_2;                         /**< Scratch 7 2, offset: 0xFE */\r\n  __IO uint8_t SCRATCH7_3;                         /**< Scratch 7 3, offset: 0xFF */\r\n} SDU_FN_CARD_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SDU_FN_CARD Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SDU_FN_CARD_Register_Masks SDU_FN_CARD Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name H2C_INTEVENT - Host to Card Interrupt Event */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_H2C_INTEVENT_HOST_PWR_DOWN_MASK (0x1U)\r\n#define SDU_FN_CARD_H2C_INTEVENT_HOST_PWR_DOWN_SHIFT (0U)\r\n/*! HOST_PWR_DOWN - Host power down event When host sets this bit, interrupt is generated to the CPU. */\r\n#define SDU_FN_CARD_H2C_INTEVENT_HOST_PWR_DOWN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_H2C_INTEVENT_HOST_PWR_DOWN_SHIFT)) & SDU_FN_CARD_H2C_INTEVENT_HOST_PWR_DOWN_MASK)\r\n\r\n#define SDU_FN_CARD_H2C_INTEVENT_HOST_PWR_UP_MASK (0x2U)\r\n#define SDU_FN_CARD_H2C_INTEVENT_HOST_PWR_UP_SHIFT (1U)\r\n/*! HOST_PWR_UP - Host power up event When host sets this bit, interrupt is generated to the CPU. */\r\n#define SDU_FN_CARD_H2C_INTEVENT_HOST_PWR_UP(x)  (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_H2C_INTEVENT_HOST_PWR_UP_SHIFT)) & SDU_FN_CARD_H2C_INTEVENT_HOST_PWR_UP_MASK)\r\n\r\n#define SDU_FN_CARD_H2C_INTEVENT_HOST_TERMINATE_CMD53_MASK (0x4U)\r\n#define SDU_FN_CARD_H2C_INTEVENT_HOST_TERMINATE_CMD53_SHIFT (2U)\r\n/*! HOST_TERMINATE_CMD53 - Host terminates CMD53 When host sets this bit, current cmd53 data transfer will terminate. */\r\n#define SDU_FN_CARD_H2C_INTEVENT_HOST_TERMINATE_CMD53(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_H2C_INTEVENT_HOST_TERMINATE_CMD53_SHIFT)) & SDU_FN_CARD_H2C_INTEVENT_HOST_TERMINATE_CMD53_MASK)\r\n\r\n#define SDU_FN_CARD_H2C_INTEVENT_HOST_TO_CARD_EVENT_MASK (0x8U)\r\n#define SDU_FN_CARD_H2C_INTEVENT_HOST_TO_CARD_EVENT_SHIFT (3U)\r\n/*! HOST_TO_CARD_EVENT - Host to card event When host sets this bit, interrupt is generated to the CPU. */\r\n#define SDU_FN_CARD_H2C_INTEVENT_HOST_TO_CARD_EVENT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_H2C_INTEVENT_HOST_TO_CARD_EVENT_SHIFT)) & SDU_FN_CARD_H2C_INTEVENT_HOST_TO_CARD_EVENT_MASK)\r\n\r\n#define SDU_FN_CARD_H2C_INTEVENT_HOST_RST_EVENT_MASK (0x10U)\r\n#define SDU_FN_CARD_H2C_INTEVENT_HOST_RST_EVENT_SHIFT (4U)\r\n/*! HOST_RST_EVENT - Host reset event When host sets this bit, interrupt is generated to the CPU. */\r\n#define SDU_FN_CARD_H2C_INTEVENT_HOST_RST_EVENT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_H2C_INTEVENT_HOST_RST_EVENT_SHIFT)) & SDU_FN_CARD_H2C_INTEVENT_HOST_RST_EVENT_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_INTRSR0 - Host Interrupt Reset Select 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_INTRSR0_HOST_INT_RSR0_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_INTRSR0_HOST_INT_RSR0_SHIFT (0U)\r\n/*! HOST_INT_RSR0 - Host Interrupt Reset Select [7:0] 0 = ISR bit clears when 0 is written to it 1 = ISR bit clears when read */\r\n#define SDU_FN_CARD_HOST_INTRSR0_HOST_INT_RSR0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INTRSR0_HOST_INT_RSR0_SHIFT)) & SDU_FN_CARD_HOST_INTRSR0_HOST_INT_RSR0_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_INTRSR1 - Host Interrupt Reset Select 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_INTRSR1_HOST_INT_RSR1_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_INTRSR1_HOST_INT_RSR1_SHIFT (0U)\r\n/*! HOST_INT_RSR1 - Host Interrupt Reset Select [15:8] 0 = ISR bit clears when 0 is written to it 1 = ISR bit clears when read */\r\n#define SDU_FN_CARD_HOST_INTRSR1_HOST_INT_RSR1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INTRSR1_HOST_INT_RSR1_SHIFT)) & SDU_FN_CARD_HOST_INTRSR1_HOST_INT_RSR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_INTMASK0 - Host Interrupt Mask 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_INTMASK0_HOST_INT_MASK0_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_INTMASK0_HOST_INT_MASK0_SHIFT (0U)\r\n/*! HOST_INT_MASK0 - Host Interrupt Mask [7:0] 0 = disable card to host interrupt 1 = enable card to host interrupt */\r\n#define SDU_FN_CARD_HOST_INTMASK0_HOST_INT_MASK0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INTMASK0_HOST_INT_MASK0_SHIFT)) & SDU_FN_CARD_HOST_INTMASK0_HOST_INT_MASK0_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_INTMASK1 - Host Interrupt Mask 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_INTMASK1_HOST_INT_MASK1_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_INTMASK1_HOST_INT_MASK1_SHIFT (0U)\r\n/*! HOST_INT_MASK1 - Host Interrupt Mask [15:8] 0 = disable card to host interrupt 1 = enable card to host interrupt */\r\n#define SDU_FN_CARD_HOST_INTMASK1_HOST_INT_MASK1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INTMASK1_HOST_INT_MASK1_SHIFT)) & SDU_FN_CARD_HOST_INTMASK1_HOST_INT_MASK1_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_INTSTATUS0 - Host Interrupt Status 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_Q0_UPLD_HOST_INT_MASK (0x1U)\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_Q0_UPLD_HOST_INT_SHIFT (0U)\r\n/*! Q0_UPLD_HOST_INT - Queue 0 Upload Host Interrupt Status Set when card has packet ready for upload and card is in I/O ready state. */\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_Q0_UPLD_HOST_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INTSTATUS0_Q0_UPLD_HOST_INT_SHIFT)) & SDU_FN_CARD_HOST_INTSTATUS0_Q0_UPLD_HOST_INT_MASK)\r\n\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_Q0_DNLD_HOST_INT_MASK (0x2U)\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_Q0_DNLD_HOST_INT_SHIFT (1U)\r\n/*! Q0_DNLD_HOST_INT - Queue 0 Download Host Interrupt Status Set when card is ready for download from host. */\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_Q0_DNLD_HOST_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INTSTATUS0_Q0_DNLD_HOST_INT_SHIFT)) & SDU_FN_CARD_HOST_INTSTATUS0_Q0_DNLD_HOST_INT_MASK)\r\n\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_FIFO_UNDERFLOW_MASK (0x4U)\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_FIFO_UNDERFLOW_SHIFT (2U)\r\n/*! FIFO_UNDERFLOW - Fifo Underflow Set when FIFO underflow occurs during upload. */\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_FIFO_UNDERFLOW(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INTSTATUS0_FIFO_UNDERFLOW_SHIFT)) & SDU_FN_CARD_HOST_INTSTATUS0_FIFO_UNDERFLOW_MASK)\r\n\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_FIFO_OVERFLOW_MASK (0x8U)\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_FIFO_OVERFLOW_SHIFT (3U)\r\n/*! FIFO_OVERFLOW - Fifo Overflow Set when FIFO overflow occurs during download. */\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_FIFO_OVERFLOW(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INTSTATUS0_FIFO_OVERFLOW_SHIFT)) & SDU_FN_CARD_HOST_INTSTATUS0_FIFO_OVERFLOW_MASK)\r\n\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_CARD_TO_HOST_INT_MASK (0x30U)\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_CARD_TO_HOST_INT_SHIFT (4U)\r\n/*! CARD_TO_HOST_INT - 2-bit FW controlled interrupts to host. */\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_CARD_TO_HOST_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INTSTATUS0_CARD_TO_HOST_INT_SHIFT)) & SDU_FN_CARD_HOST_INTSTATUS0_CARD_TO_HOST_INT_MASK)\r\n\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_CMD_PORT_UPLD_INT_MASK (0x40U)\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_CMD_PORT_UPLD_INT_SHIFT (6U)\r\n/*! CMD_PORT_UPLD_INT - Command Port Upload Host Interrupt Status Set when card has packet ready for\r\n *    command port upload and card is in I/O ready state.\r\n */\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_CMD_PORT_UPLD_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INTSTATUS0_CMD_PORT_UPLD_INT_SHIFT)) & SDU_FN_CARD_HOST_INTSTATUS0_CMD_PORT_UPLD_INT_MASK)\r\n\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_CMD_PORT_DNLD_INT_MASK (0x80U)\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_CMD_PORT_DNLD_INT_SHIFT (7U)\r\n/*! CMD_PORT_DNLD_INT - Command Port Download Host Interrupt Status Set when card is ready for command port download from host. */\r\n#define SDU_FN_CARD_HOST_INTSTATUS0_CMD_PORT_DNLD_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INTSTATUS0_CMD_PORT_DNLD_INT_SHIFT)) & SDU_FN_CARD_HOST_INTSTATUS0_CMD_PORT_DNLD_INT_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_INTSTATUS1 - Host Interrupt Status 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_INTSTATUS1_Q1_UPLD_HOST_INT_MASK (0x1U)\r\n#define SDU_FN_CARD_HOST_INTSTATUS1_Q1_UPLD_HOST_INT_SHIFT (0U)\r\n/*! Q1_UPLD_HOST_INT - Queue 1 Upload Host Interrupt Status Set when card has packet ready for upload and card is in I/O ready state. */\r\n#define SDU_FN_CARD_HOST_INTSTATUS1_Q1_UPLD_HOST_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INTSTATUS1_Q1_UPLD_HOST_INT_SHIFT)) & SDU_FN_CARD_HOST_INTSTATUS1_Q1_UPLD_HOST_INT_MASK)\r\n\r\n#define SDU_FN_CARD_HOST_INTSTATUS1_Q2_UPLD_HOST_INT_MASK (0x2U)\r\n#define SDU_FN_CARD_HOST_INTSTATUS1_Q2_UPLD_HOST_INT_SHIFT (1U)\r\n/*! Q2_UPLD_HOST_INT - Queue 2 Upload Host Interrupt Status Set when card has packet ready for upload and card is in I/O ready state. */\r\n#define SDU_FN_CARD_HOST_INTSTATUS1_Q2_UPLD_HOST_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INTSTATUS1_Q2_UPLD_HOST_INT_SHIFT)) & SDU_FN_CARD_HOST_INTSTATUS1_Q2_UPLD_HOST_INT_MASK)\r\n\r\n#define SDU_FN_CARD_HOST_INTSTATUS1_Q3_UPLD_HOST_INT_MASK (0x4U)\r\n#define SDU_FN_CARD_HOST_INTSTATUS1_Q3_UPLD_HOST_INT_SHIFT (2U)\r\n/*! Q3_UPLD_HOST_INT - Queue 3 Upload Host Interrupt Status Set when card has packet ready for upload and card is in I/O ready state. */\r\n#define SDU_FN_CARD_HOST_INTSTATUS1_Q3_UPLD_HOST_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INTSTATUS1_Q3_UPLD_HOST_INT_SHIFT)) & SDU_FN_CARD_HOST_INTSTATUS1_Q3_UPLD_HOST_INT_MASK)\r\n\r\n#define SDU_FN_CARD_HOST_INTSTATUS1_Q1_DNLD_HOST_INT_MASK (0x8U)\r\n#define SDU_FN_CARD_HOST_INTSTATUS1_Q1_DNLD_HOST_INT_SHIFT (3U)\r\n/*! Q1_DNLD_HOST_INT - Queue 1 Download Host Interrupt Status Set when card is ready for download from host. */\r\n#define SDU_FN_CARD_HOST_INTSTATUS1_Q1_DNLD_HOST_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INTSTATUS1_Q1_DNLD_HOST_INT_SHIFT)) & SDU_FN_CARD_HOST_INTSTATUS1_Q1_DNLD_HOST_INT_MASK)\r\n\r\n#define SDU_FN_CARD_HOST_INTSTATUS1_Q2_DNLD_HOST_INT_MASK (0x10U)\r\n#define SDU_FN_CARD_HOST_INTSTATUS1_Q2_DNLD_HOST_INT_SHIFT (4U)\r\n/*! Q2_DNLD_HOST_INT - Queue 2 Download Host Interrupt Status Set when card is ready for download from host. */\r\n#define SDU_FN_CARD_HOST_INTSTATUS1_Q2_DNLD_HOST_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INTSTATUS1_Q2_DNLD_HOST_INT_SHIFT)) & SDU_FN_CARD_HOST_INTSTATUS1_Q2_DNLD_HOST_INT_MASK)\r\n\r\n#define SDU_FN_CARD_HOST_INTSTATUS1_Q3_DNLD_HOST_INT_MASK (0x20U)\r\n#define SDU_FN_CARD_HOST_INTSTATUS1_Q3_DNLD_HOST_INT_SHIFT (5U)\r\n/*! Q3_DNLD_HOST_INT - Queue 3 Download Host Interrupt Status Set when card is ready for download from host. */\r\n#define SDU_FN_CARD_HOST_INTSTATUS1_Q3_DNLD_HOST_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INTSTATUS1_Q3_DNLD_HOST_INT_SHIFT)) & SDU_FN_CARD_HOST_INTSTATUS1_Q3_DNLD_HOST_INT_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_RD_BITMAP0 - Packet Read Bitmap 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP0_MASK (0x1U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP0_SHIFT (0U)\r\n/*! PKT_RD_BITMAP0 - Packet read bitmap[0] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP0_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP0_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP1_MASK (0x2U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP1_SHIFT (1U)\r\n/*! PKT_RD_BITMAP1 - Packet read bitmap[1] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP1_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP1_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP2_MASK (0x4U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP2_SHIFT (2U)\r\n/*! PKT_RD_BITMAP2 - Packet read bitmap[2] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP2(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP2_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP2_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP3_MASK (0x8U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP3_SHIFT (3U)\r\n/*! PKT_RD_BITMAP3 - Packet read bitmap[3] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP3(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP3_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP3_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP4_MASK (0x10U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP4_SHIFT (4U)\r\n/*! PKT_RD_BITMAP4 - Packet read bitmap[4] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP4(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP4_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP4_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP5_MASK (0x20U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP5_SHIFT (5U)\r\n/*! PKT_RD_BITMAP5 - Packet read bitmap[5] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP5(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP5_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP5_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP6_MASK (0x40U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP6_SHIFT (6U)\r\n/*! PKT_RD_BITMAP6 - Packet read bitmap[6] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP6(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP6_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP6_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP7_MASK (0x80U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP7_SHIFT (7U)\r\n/*! PKT_RD_BITMAP7 - Packet read bitmap[7]. */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP7(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP7_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP0_PKT_RD_BITMAP7_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_RD_BITMAP1 - Packet Read Bitmap 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP8_MASK (0x1U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP8_SHIFT (0U)\r\n/*! PKT_RD_BITMAP8 - Packet read bitmap[8] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP8(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP8_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP8_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP9_MASK (0x2U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP9_SHIFT (1U)\r\n/*! PKT_RD_BITMAP9 - Packet read bitmap[9] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP9(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP9_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP9_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP10_MASK (0x4U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP10_SHIFT (2U)\r\n/*! PKT_RD_BITMAP10 - Packet read bitmap[10] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP10(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP10_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP10_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP11_MASK (0x8U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP11_SHIFT (3U)\r\n/*! PKT_RD_BITMAP11 - Packet read bitmap[11] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP11(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP11_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP11_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP12_MASK (0x10U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP12_SHIFT (4U)\r\n/*! PKT_RD_BITMAP12 - Packet read bitmap[12] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP12(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP12_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP12_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP13_MASK (0x20U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP13_SHIFT (5U)\r\n/*! PKT_RD_BITMAP13 - Packet read bitmap[13] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP13(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP13_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP13_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP14_MASK (0x40U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP14_SHIFT (6U)\r\n/*! PKT_RD_BITMAP14 - Packet read bitmap[14] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP14(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP14_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP14_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP15_MASK (0x80U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP15_SHIFT (7U)\r\n/*! PKT_RD_BITMAP15 - Packet read bitmap[15]. */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP15(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP15_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP1_PKT_RD_BITMAP15_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_RD_BITMAP2 - Packet Read Bitmap 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP16_MASK (0x1U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP16_SHIFT (0U)\r\n/*! PKT_RD_BITMAP16 - Packet read bitmap[16] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP16(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP16_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP16_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP17_MASK (0x2U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP17_SHIFT (1U)\r\n/*! PKT_RD_BITMAP17 - Packet read bitmap[17] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP17(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP17_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP17_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP18_MASK (0x4U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP18_SHIFT (2U)\r\n/*! PKT_RD_BITMAP18 - Packet read bitmap[18] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP18(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP18_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP18_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP19_MASK (0x8U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP19_SHIFT (3U)\r\n/*! PKT_RD_BITMAP19 - Packet read bitmap[19] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP19(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP19_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP19_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP20_MASK (0x10U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP20_SHIFT (4U)\r\n/*! PKT_RD_BITMAP20 - Packet read bitmap[20] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP20(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP20_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP20_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP21_MASK (0x20U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP21_SHIFT (5U)\r\n/*! PKT_RD_BITMAP21 - Packet read bitmap[21] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP21(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP21_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP21_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP22_MASK (0x40U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP22_SHIFT (6U)\r\n/*! PKT_RD_BITMAP22 - Packet read bitmap[22] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP22(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP22_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP22_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP23_MASK (0x80U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP23_SHIFT (7U)\r\n/*! PKT_RD_BITMAP23 - Packet read bitmap[23]. */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP23(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP23_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP2_PKT_RD_BITMAP23_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_RD_BITMAP3 - Packet Read Bitmap 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP24_MASK (0x1U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP24_SHIFT (0U)\r\n/*! PKT_RD_BITMAP24 - Packet read bitmap[24] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP24(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP24_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP24_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP25_MASK (0x2U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP25_SHIFT (1U)\r\n/*! PKT_RD_BITMAP25 - Packet read bitmap[25] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP25(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP25_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP25_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP26_MASK (0x4U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP26_SHIFT (2U)\r\n/*! PKT_RD_BITMAP26 - Packet read bitmap[26] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP26(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP26_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP26_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP27_MASK (0x8U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP27_SHIFT (3U)\r\n/*! PKT_RD_BITMAP27 - Packet read bitmap[27] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP27(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP27_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP27_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP28_MASK (0x10U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP28_SHIFT (4U)\r\n/*! PKT_RD_BITMAP28 - Packet read bitmap[28] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP28(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP28_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP28_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP29_MASK (0x20U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP29_SHIFT (5U)\r\n/*! PKT_RD_BITMAP29 - Packet read bitmap[29] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP29(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP29_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP29_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP30_MASK (0x40U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP30_SHIFT (6U)\r\n/*! PKT_RD_BITMAP30 - Packet read bitmap[30] */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP30(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP30_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP30_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP31_MASK (0x80U)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP31_SHIFT (7U)\r\n/*! PKT_RD_BITMAP31 - Packet read bitmap[31]. */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP31(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP31_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP3_PKT_RD_BITMAP31_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_WR_BITMAP0 - Packet Write Bitmap 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP0_MASK (0x1U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP0_SHIFT (0U)\r\n/*! PKT_WR_BITMAP0 - Packet write bitmap[0] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP0_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP0_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP1_MASK (0x2U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP1_SHIFT (1U)\r\n/*! PKT_WR_BITMAP1 - Packet write bitmap[1] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP1_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP1_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP2_MASK (0x4U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP2_SHIFT (2U)\r\n/*! PKT_WR_BITMAP2 - Packet write bitmap[2] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP2(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP2_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP2_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP3_MASK (0x8U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP3_SHIFT (3U)\r\n/*! PKT_WR_BITMAP3 - Packet write bitmap[3] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP3(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP3_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP3_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP4_MASK (0x10U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP4_SHIFT (4U)\r\n/*! PKT_WR_BITMAP4 - Packet write bitmap[4] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP4(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP4_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP4_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP5_MASK (0x20U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP5_SHIFT (5U)\r\n/*! PKT_WR_BITMAP5 - Packet write bitmap[5] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP5(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP5_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP5_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP6_MASK (0x40U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP6_SHIFT (6U)\r\n/*! PKT_WR_BITMAP6 - Packet write bitmap[6] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP6(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP6_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP6_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP7_MASK (0x80U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP7_SHIFT (7U)\r\n/*! PKT_WR_BITMAP7 - Packet write bitmap[7]. */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP7(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP7_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP0_PKT_WR_BITMAP7_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_WR_BITMAP1 - Packet Write Bitmap 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP8_MASK (0x1U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP8_SHIFT (0U)\r\n/*! PKT_WR_BITMAP8 - Packet write bitmap[8] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP8(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP8_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP8_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP9_MASK (0x2U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP9_SHIFT (1U)\r\n/*! PKT_WR_BITMAP9 - Packet write bitmap[9] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP9(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP9_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP9_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP10_MASK (0x4U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP10_SHIFT (2U)\r\n/*! PKT_WR_BITMAP10 - Packet write bitmap[10] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP10(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP10_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP10_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP11_MASK (0x8U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP11_SHIFT (3U)\r\n/*! PKT_WR_BITMAP11 - Packet write bitmap[11] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP11(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP11_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP11_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP12_MASK (0x10U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP12_SHIFT (4U)\r\n/*! PKT_WR_BITMAP12 - Packet write bitmap[12] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP12(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP12_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP12_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP13_MASK (0x20U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP13_SHIFT (5U)\r\n/*! PKT_WR_BITMAP13 - Packet write bitmap[13] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP13(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP13_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP13_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP14_MASK (0x40U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP14_SHIFT (6U)\r\n/*! PKT_WR_BITMAP14 - Packet write bitmap[14] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP14(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP14_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP14_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP15_MASK (0x80U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP15_SHIFT (7U)\r\n/*! PKT_WR_BITMAP15 - Packet write bitmap[15]. */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP15(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP15_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP1_PKT_WR_BITMAP15_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_WR_BITMAP2 - Packet Write Bitmap 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP16_MASK (0x1U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP16_SHIFT (0U)\r\n/*! PKT_WR_BITMAP16 - Packet write bitmap[16] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP16(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP16_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP16_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP17_MASK (0x2U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP17_SHIFT (1U)\r\n/*! PKT_WR_BITMAP17 - Packet write bitmap[17] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP17(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP17_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP17_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP18_MASK (0x4U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP18_SHIFT (2U)\r\n/*! PKT_WR_BITMAP18 - Packet write bitmap[18] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP18(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP18_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP18_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP19_MASK (0x8U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP19_SHIFT (3U)\r\n/*! PKT_WR_BITMAP19 - Packet write bitmap[19] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP19(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP19_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP19_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP20_MASK (0x10U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP20_SHIFT (4U)\r\n/*! PKT_WR_BITMAP20 - Packet write bitmap[20] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP20(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP20_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP20_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP21_MASK (0x20U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP21_SHIFT (5U)\r\n/*! PKT_WR_BITMAP21 - Packet write bitmap[21] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP21(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP21_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP21_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP22_MASK (0x40U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP22_SHIFT (6U)\r\n/*! PKT_WR_BITMAP22 - Packet write bitmap[22] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP22(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP22_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP22_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP23_MASK (0x80U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP23_SHIFT (7U)\r\n/*! PKT_WR_BITMAP23 - Packet write bitmap[23]. */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP23(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP23_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP2_PKT_WR_BITMAP23_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_WR_BITMAP3 - Packet Write Bitmap 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP24_MASK (0x1U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP24_SHIFT (0U)\r\n/*! PKT_WR_BITMAP24 - Packet write bitmap[24] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP24(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP24_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP24_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP25_MASK (0x2U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP25_SHIFT (1U)\r\n/*! PKT_WR_BITMAP25 - Packet write bitmap[25] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP25(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP25_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP25_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP26_MASK (0x4U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP26_SHIFT (2U)\r\n/*! PKT_WR_BITMAP26 - Packet write bitmap[26] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP26(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP26_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP26_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP27_MASK (0x8U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP27_SHIFT (3U)\r\n/*! PKT_WR_BITMAP27 - Packet write bitmap[27] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP27(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP27_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP27_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP28_MASK (0x10U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP28_SHIFT (4U)\r\n/*! PKT_WR_BITMAP28 - Packet write bitmap[28] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP28(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP28_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP28_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP29_MASK (0x20U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP29_SHIFT (5U)\r\n/*! PKT_WR_BITMAP29 - Packet write bitmap[29] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP29(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP29_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP29_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP30_MASK (0x40U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP30_SHIFT (6U)\r\n/*! PKT_WR_BITMAP30 - Packet write bitmap[30] */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP30(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP30_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP30_MASK)\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP31_MASK (0x80U)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP31_SHIFT (7U)\r\n/*! PKT_WR_BITMAP31 - Packet write bitmap[31]. */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP31(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP31_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP3_PKT_WR_BITMAP31_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT0_RD_LEN0 - Port 0 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT0_RD_LEN0_PORT0_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT0_RD_LEN0_PORT0_RD_LEN0_SHIFT (0U)\r\n/*! PORT0_RD_LEN0 - Port 0 read length [7:0] */\r\n#define SDU_FN_CARD_PORT0_RD_LEN0_PORT0_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT0_RD_LEN0_PORT0_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT0_RD_LEN0_PORT0_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT0_RD_LEN1 - Port 0 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT0_RD_LEN1_PORT0_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT0_RD_LEN1_PORT0_RD_LEN1_SHIFT (0U)\r\n/*! PORT0_RD_LEN1 - Port 0 read length [15:8] */\r\n#define SDU_FN_CARD_PORT0_RD_LEN1_PORT0_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT0_RD_LEN1_PORT0_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT0_RD_LEN1_PORT0_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT1_RD_LEN0 - Port 1 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT1_RD_LEN0_PORT1_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT1_RD_LEN0_PORT1_RD_LEN0_SHIFT (0U)\r\n/*! PORT1_RD_LEN0 - Port 1 read length [7:0] */\r\n#define SDU_FN_CARD_PORT1_RD_LEN0_PORT1_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT1_RD_LEN0_PORT1_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT1_RD_LEN0_PORT1_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT1_RD_LEN1 - Port 1 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT1_RD_LEN1_PORT1_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT1_RD_LEN1_PORT1_RD_LEN1_SHIFT (0U)\r\n/*! PORT1_RD_LEN1 - Port 1 read length [15:8] */\r\n#define SDU_FN_CARD_PORT1_RD_LEN1_PORT1_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT1_RD_LEN1_PORT1_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT1_RD_LEN1_PORT1_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT2_RD_LEN0 - Port 2 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT2_RD_LEN0_PORT2_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT2_RD_LEN0_PORT2_RD_LEN0_SHIFT (0U)\r\n/*! PORT2_RD_LEN0 - Port 2 read length [7:0] */\r\n#define SDU_FN_CARD_PORT2_RD_LEN0_PORT2_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT2_RD_LEN0_PORT2_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT2_RD_LEN0_PORT2_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT2_RD_LEN1 - Port 2 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT2_RD_LEN1_PORT2_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT2_RD_LEN1_PORT2_RD_LEN1_SHIFT (0U)\r\n/*! PORT2_RD_LEN1 - Port 2 read length [15:8] */\r\n#define SDU_FN_CARD_PORT2_RD_LEN1_PORT2_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT2_RD_LEN1_PORT2_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT2_RD_LEN1_PORT2_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT3_RD_LEN0 - Port 3 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT3_RD_LEN0_PORT3_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT3_RD_LEN0_PORT3_RD_LEN0_SHIFT (0U)\r\n/*! PORT3_RD_LEN0 - Port 3 read length [7:0] */\r\n#define SDU_FN_CARD_PORT3_RD_LEN0_PORT3_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT3_RD_LEN0_PORT3_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT3_RD_LEN0_PORT3_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT3_RD_LEN1 - Port 3 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT3_RD_LEN1_PORT3_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT3_RD_LEN1_PORT3_RD_LEN1_SHIFT (0U)\r\n/*! PORT3_RD_LEN1 - Port 3 read length [15:8] */\r\n#define SDU_FN_CARD_PORT3_RD_LEN1_PORT3_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT3_RD_LEN1_PORT3_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT3_RD_LEN1_PORT3_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT4_RD_LEN0 - Port 4 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT4_RD_LEN0_PORT4_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT4_RD_LEN0_PORT4_RD_LEN0_SHIFT (0U)\r\n/*! PORT4_RD_LEN0 - Port 4 read length [7:0] */\r\n#define SDU_FN_CARD_PORT4_RD_LEN0_PORT4_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT4_RD_LEN0_PORT4_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT4_RD_LEN0_PORT4_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT4_RD_LEN1 - Port 4 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT4_RD_LEN1_PORT4_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT4_RD_LEN1_PORT4_RD_LEN1_SHIFT (0U)\r\n/*! PORT4_RD_LEN1 - Port 4 read length [15:8] */\r\n#define SDU_FN_CARD_PORT4_RD_LEN1_PORT4_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT4_RD_LEN1_PORT4_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT4_RD_LEN1_PORT4_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT5_RD_LEN0 - Port 5 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT5_RD_LEN0_PORT5_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT5_RD_LEN0_PORT5_RD_LEN0_SHIFT (0U)\r\n/*! PORT5_RD_LEN0 - Port 5 read length [7:0] */\r\n#define SDU_FN_CARD_PORT5_RD_LEN0_PORT5_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT5_RD_LEN0_PORT5_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT5_RD_LEN0_PORT5_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT5_RD_LEN1 - Port 5 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT5_RD_LEN1_PORT5_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT5_RD_LEN1_PORT5_RD_LEN1_SHIFT (0U)\r\n/*! PORT5_RD_LEN1 - Port 5 read length [15:8] */\r\n#define SDU_FN_CARD_PORT5_RD_LEN1_PORT5_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT5_RD_LEN1_PORT5_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT5_RD_LEN1_PORT5_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT6_RD_LEN0 - Port 6 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT6_RD_LEN0_PORT6_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT6_RD_LEN0_PORT6_RD_LEN0_SHIFT (0U)\r\n/*! PORT6_RD_LEN0 - Port 6 read length [7:0] */\r\n#define SDU_FN_CARD_PORT6_RD_LEN0_PORT6_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT6_RD_LEN0_PORT6_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT6_RD_LEN0_PORT6_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT6_RD_LEN1 - Port 6 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT6_RD_LEN1_PORT6_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT6_RD_LEN1_PORT6_RD_LEN1_SHIFT (0U)\r\n/*! PORT6_RD_LEN1 - Port 6 read length [15:8] */\r\n#define SDU_FN_CARD_PORT6_RD_LEN1_PORT6_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT6_RD_LEN1_PORT6_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT6_RD_LEN1_PORT6_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT7_RD_LEN0 - Port 7 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT7_RD_LEN0_PORT7_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT7_RD_LEN0_PORT7_RD_LEN0_SHIFT (0U)\r\n/*! PORT7_RD_LEN0 - Port 7 read length [7:0] */\r\n#define SDU_FN_CARD_PORT7_RD_LEN0_PORT7_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT7_RD_LEN0_PORT7_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT7_RD_LEN0_PORT7_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT7_RD_LEN1 - Port 7 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT7_RD_LEN1_PORT7_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT7_RD_LEN1_PORT7_RD_LEN1_SHIFT (0U)\r\n/*! PORT7_RD_LEN1 - Port 7 read length [15:8] */\r\n#define SDU_FN_CARD_PORT7_RD_LEN1_PORT7_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT7_RD_LEN1_PORT7_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT7_RD_LEN1_PORT7_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT8_RD_LEN0 - Port 8 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT8_RD_LEN0_PORT8_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT8_RD_LEN0_PORT8_RD_LEN0_SHIFT (0U)\r\n/*! PORT8_RD_LEN0 - Port 8 read length [7:0] */\r\n#define SDU_FN_CARD_PORT8_RD_LEN0_PORT8_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT8_RD_LEN0_PORT8_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT8_RD_LEN0_PORT8_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT8_RD_LEN1 - Port 8 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT8_RD_LEN1_PORT8_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT8_RD_LEN1_PORT8_RD_LEN1_SHIFT (0U)\r\n/*! PORT8_RD_LEN1 - Port 8 read length [15:8] */\r\n#define SDU_FN_CARD_PORT8_RD_LEN1_PORT8_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT8_RD_LEN1_PORT8_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT8_RD_LEN1_PORT8_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT9_RD_LEN0 - Port 9 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT9_RD_LEN0_PORT9_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT9_RD_LEN0_PORT9_RD_LEN0_SHIFT (0U)\r\n/*! PORT9_RD_LEN0 - Port 9 read length [7:0] */\r\n#define SDU_FN_CARD_PORT9_RD_LEN0_PORT9_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT9_RD_LEN0_PORT9_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT9_RD_LEN0_PORT9_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT9_RD_LEN1 - Port 9 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT9_RD_LEN1_PORT9_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT9_RD_LEN1_PORT9_RD_LEN1_SHIFT (0U)\r\n/*! PORT9_RD_LEN1 - Port 9 read length [15:8] */\r\n#define SDU_FN_CARD_PORT9_RD_LEN1_PORT9_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT9_RD_LEN1_PORT9_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT9_RD_LEN1_PORT9_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT10_RD_LEN0 - Port 10 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT10_RD_LEN0_PORT10_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT10_RD_LEN0_PORT10_RD_LEN0_SHIFT (0U)\r\n/*! PORT10_RD_LEN0 - Port 10 read length [7:0] */\r\n#define SDU_FN_CARD_PORT10_RD_LEN0_PORT10_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT10_RD_LEN0_PORT10_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT10_RD_LEN0_PORT10_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT10_RD_LEN1 - Port 10 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT10_RD_LEN1_PORT10_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT10_RD_LEN1_PORT10_RD_LEN1_SHIFT (0U)\r\n/*! PORT10_RD_LEN1 - Port 10 read length [15:8] */\r\n#define SDU_FN_CARD_PORT10_RD_LEN1_PORT10_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT10_RD_LEN1_PORT10_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT10_RD_LEN1_PORT10_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT11_RD_LEN0 - Port 11 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT11_RD_LEN0_PORT11_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT11_RD_LEN0_PORT11_RD_LEN0_SHIFT (0U)\r\n/*! PORT11_RD_LEN0 - Port 11 read length [7:0] */\r\n#define SDU_FN_CARD_PORT11_RD_LEN0_PORT11_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT11_RD_LEN0_PORT11_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT11_RD_LEN0_PORT11_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT11_RD_LEN1 - Port 11 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT11_RD_LEN1_PORT11_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT11_RD_LEN1_PORT11_RD_LEN1_SHIFT (0U)\r\n/*! PORT11_RD_LEN1 - Port 11 read length [15:8] */\r\n#define SDU_FN_CARD_PORT11_RD_LEN1_PORT11_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT11_RD_LEN1_PORT11_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT11_RD_LEN1_PORT11_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT12_RD_LEN0 - Port 12 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT12_RD_LEN0_PORT12_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT12_RD_LEN0_PORT12_RD_LEN0_SHIFT (0U)\r\n/*! PORT12_RD_LEN0 - Port 12 read length [7:0] */\r\n#define SDU_FN_CARD_PORT12_RD_LEN0_PORT12_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT12_RD_LEN0_PORT12_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT12_RD_LEN0_PORT12_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT12_RD_LEN1 - Port 12 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT12_RD_LEN1_PORT12_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT12_RD_LEN1_PORT12_RD_LEN1_SHIFT (0U)\r\n/*! PORT12_RD_LEN1 - Port 12 read length [15:8] */\r\n#define SDU_FN_CARD_PORT12_RD_LEN1_PORT12_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT12_RD_LEN1_PORT12_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT12_RD_LEN1_PORT12_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT13_RD_LEN0 - Port 13 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT13_RD_LEN0_PORT13_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT13_RD_LEN0_PORT13_RD_LEN0_SHIFT (0U)\r\n/*! PORT13_RD_LEN0 - Port 13 read length [7:0] */\r\n#define SDU_FN_CARD_PORT13_RD_LEN0_PORT13_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT13_RD_LEN0_PORT13_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT13_RD_LEN0_PORT13_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT13_RD_LEN1 - Port 13 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT13_RD_LEN1_PORT13_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT13_RD_LEN1_PORT13_RD_LEN1_SHIFT (0U)\r\n/*! PORT13_RD_LEN1 - Port 13 read length [15:8] */\r\n#define SDU_FN_CARD_PORT13_RD_LEN1_PORT13_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT13_RD_LEN1_PORT13_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT13_RD_LEN1_PORT13_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT14_RD_LEN0 - Port 14 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT14_RD_LEN0_PORT14_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT14_RD_LEN0_PORT14_RD_LEN0_SHIFT (0U)\r\n/*! PORT14_RD_LEN0 - Port 14 read length [7:0] */\r\n#define SDU_FN_CARD_PORT14_RD_LEN0_PORT14_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT14_RD_LEN0_PORT14_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT14_RD_LEN0_PORT14_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT14_RD_LEN1 - Port 14 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT14_RD_LEN1_PORT14_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT14_RD_LEN1_PORT14_RD_LEN1_SHIFT (0U)\r\n/*! PORT14_RD_LEN1 - Port 14 read length [15:8] */\r\n#define SDU_FN_CARD_PORT14_RD_LEN1_PORT14_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT14_RD_LEN1_PORT14_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT14_RD_LEN1_PORT14_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT15_RD_LEN0 - Port 15 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT15_RD_LEN0_PORT15_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT15_RD_LEN0_PORT15_RD_LEN0_SHIFT (0U)\r\n/*! PORT15_RD_LEN0 - Port 15 read length [7:0] */\r\n#define SDU_FN_CARD_PORT15_RD_LEN0_PORT15_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT15_RD_LEN0_PORT15_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT15_RD_LEN0_PORT15_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT15_RD_LEN1 - Port 15 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT15_RD_LEN1_PORT15_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT15_RD_LEN1_PORT15_RD_LEN1_SHIFT (0U)\r\n/*! PORT15_RD_LEN1 - Port 15 read length [15:8] */\r\n#define SDU_FN_CARD_PORT15_RD_LEN1_PORT15_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT15_RD_LEN1_PORT15_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT15_RD_LEN1_PORT15_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT16_RD_LEN0 - Port 16 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT16_RD_LEN0_PORT16_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT16_RD_LEN0_PORT16_RD_LEN0_SHIFT (0U)\r\n/*! PORT16_RD_LEN0 - Port 16 read length [7:0] */\r\n#define SDU_FN_CARD_PORT16_RD_LEN0_PORT16_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT16_RD_LEN0_PORT16_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT16_RD_LEN0_PORT16_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT16_RD_LEN1 - Port 16 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT16_RD_LEN1_PORT16_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT16_RD_LEN1_PORT16_RD_LEN1_SHIFT (0U)\r\n/*! PORT16_RD_LEN1 - Port 16 read length [15:8] */\r\n#define SDU_FN_CARD_PORT16_RD_LEN1_PORT16_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT16_RD_LEN1_PORT16_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT16_RD_LEN1_PORT16_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT17_RD_LEN0 - Port 17 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT17_RD_LEN0_PORT17_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT17_RD_LEN0_PORT17_RD_LEN0_SHIFT (0U)\r\n/*! PORT17_RD_LEN0 - Port 17 read length [7:0] */\r\n#define SDU_FN_CARD_PORT17_RD_LEN0_PORT17_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT17_RD_LEN0_PORT17_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT17_RD_LEN0_PORT17_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT17_RD_LEN1 - Port 17 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT17_RD_LEN1_PORT17_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT17_RD_LEN1_PORT17_RD_LEN1_SHIFT (0U)\r\n/*! PORT17_RD_LEN1 - Port 17 read length [15:8] */\r\n#define SDU_FN_CARD_PORT17_RD_LEN1_PORT17_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT17_RD_LEN1_PORT17_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT17_RD_LEN1_PORT17_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT18_RD_LEN0 - Port 18 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT18_RD_LEN0_PORT18_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT18_RD_LEN0_PORT18_RD_LEN0_SHIFT (0U)\r\n/*! PORT18_RD_LEN0 - Port 18 read length [7:0] */\r\n#define SDU_FN_CARD_PORT18_RD_LEN0_PORT18_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT18_RD_LEN0_PORT18_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT18_RD_LEN0_PORT18_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT18_RD_LEN1 - Port 18 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT18_RD_LEN1_PORT18_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT18_RD_LEN1_PORT18_RD_LEN1_SHIFT (0U)\r\n/*! PORT18_RD_LEN1 - Port 18 read length [15:8] */\r\n#define SDU_FN_CARD_PORT18_RD_LEN1_PORT18_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT18_RD_LEN1_PORT18_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT18_RD_LEN1_PORT18_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT19_RD_LEN0 - Port 19 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT19_RD_LEN0_PORT19_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT19_RD_LEN0_PORT19_RD_LEN0_SHIFT (0U)\r\n/*! PORT19_RD_LEN0 - Port 19 read length [7:0] */\r\n#define SDU_FN_CARD_PORT19_RD_LEN0_PORT19_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT19_RD_LEN0_PORT19_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT19_RD_LEN0_PORT19_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT19_RD_LEN1 - Port 19 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT19_RD_LEN1_PORT19_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT19_RD_LEN1_PORT19_RD_LEN1_SHIFT (0U)\r\n/*! PORT19_RD_LEN1 - Port 19 read length [15:8] */\r\n#define SDU_FN_CARD_PORT19_RD_LEN1_PORT19_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT19_RD_LEN1_PORT19_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT19_RD_LEN1_PORT19_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT20_RD_LEN0 - Port 20 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT20_RD_LEN0_PORT20_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT20_RD_LEN0_PORT20_RD_LEN0_SHIFT (0U)\r\n/*! PORT20_RD_LEN0 - Port 20 read length [7:0] */\r\n#define SDU_FN_CARD_PORT20_RD_LEN0_PORT20_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT20_RD_LEN0_PORT20_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT20_RD_LEN0_PORT20_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT20_RD_LEN1 - Port 20 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT20_RD_LEN1_PORT20_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT20_RD_LEN1_PORT20_RD_LEN1_SHIFT (0U)\r\n/*! PORT20_RD_LEN1 - Port 20 read length [15:8] */\r\n#define SDU_FN_CARD_PORT20_RD_LEN1_PORT20_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT20_RD_LEN1_PORT20_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT20_RD_LEN1_PORT20_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT21_RD_LEN0 - Port 21 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT21_RD_LEN0_PORT21_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT21_RD_LEN0_PORT21_RD_LEN0_SHIFT (0U)\r\n/*! PORT21_RD_LEN0 - Port 21 read length [7:0] */\r\n#define SDU_FN_CARD_PORT21_RD_LEN0_PORT21_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT21_RD_LEN0_PORT21_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT21_RD_LEN0_PORT21_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT21_RD_LEN1 - Port 21 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT21_RD_LEN1_PORT21_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT21_RD_LEN1_PORT21_RD_LEN1_SHIFT (0U)\r\n/*! PORT21_RD_LEN1 - Port 21 read length [15:8] */\r\n#define SDU_FN_CARD_PORT21_RD_LEN1_PORT21_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT21_RD_LEN1_PORT21_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT21_RD_LEN1_PORT21_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT22_RD_LEN0 - Port 22 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT22_RD_LEN0_PORT22_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT22_RD_LEN0_PORT22_RD_LEN0_SHIFT (0U)\r\n/*! PORT22_RD_LEN0 - Port 22 read length [7:0] */\r\n#define SDU_FN_CARD_PORT22_RD_LEN0_PORT22_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT22_RD_LEN0_PORT22_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT22_RD_LEN0_PORT22_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT22_RD_LEN1 - Port 22 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT22_RD_LEN1_PORT22_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT22_RD_LEN1_PORT22_RD_LEN1_SHIFT (0U)\r\n/*! PORT22_RD_LEN1 - Port 22 read length [15:8] */\r\n#define SDU_FN_CARD_PORT22_RD_LEN1_PORT22_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT22_RD_LEN1_PORT22_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT22_RD_LEN1_PORT22_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT23_RD_LEN0 - Port 23 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT23_RD_LEN0_PORT23_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT23_RD_LEN0_PORT23_RD_LEN0_SHIFT (0U)\r\n/*! PORT23_RD_LEN0 - Port 23 read length [7:0] */\r\n#define SDU_FN_CARD_PORT23_RD_LEN0_PORT23_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT23_RD_LEN0_PORT23_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT23_RD_LEN0_PORT23_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT23_RD_LEN1 - Port 23 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT23_RD_LEN1_PORT23_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT23_RD_LEN1_PORT23_RD_LEN1_SHIFT (0U)\r\n/*! PORT23_RD_LEN1 - Port 23 read length [15:8] */\r\n#define SDU_FN_CARD_PORT23_RD_LEN1_PORT23_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT23_RD_LEN1_PORT23_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT23_RD_LEN1_PORT23_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT24_RD_LEN0 - Port 24 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT24_RD_LEN0_PORT24_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT24_RD_LEN0_PORT24_RD_LEN0_SHIFT (0U)\r\n/*! PORT24_RD_LEN0 - Port 24 read length [7:0] */\r\n#define SDU_FN_CARD_PORT24_RD_LEN0_PORT24_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT24_RD_LEN0_PORT24_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT24_RD_LEN0_PORT24_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT24_RD_LEN1 - Port 24 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT24_RD_LEN1_PORT24_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT24_RD_LEN1_PORT24_RD_LEN1_SHIFT (0U)\r\n/*! PORT24_RD_LEN1 - Port 24 read length [15:8] */\r\n#define SDU_FN_CARD_PORT24_RD_LEN1_PORT24_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT24_RD_LEN1_PORT24_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT24_RD_LEN1_PORT24_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT25_RD_LEN0 - Port 25 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT25_RD_LEN0_PORT25_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT25_RD_LEN0_PORT25_RD_LEN0_SHIFT (0U)\r\n/*! PORT25_RD_LEN0 - Port 25 read length [7:0] */\r\n#define SDU_FN_CARD_PORT25_RD_LEN0_PORT25_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT25_RD_LEN0_PORT25_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT25_RD_LEN0_PORT25_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT25_RD_LEN1 - Port 25 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT25_RD_LEN1_PORT25_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT25_RD_LEN1_PORT25_RD_LEN1_SHIFT (0U)\r\n/*! PORT25_RD_LEN1 - Port 25 read length [15:8] */\r\n#define SDU_FN_CARD_PORT25_RD_LEN1_PORT25_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT25_RD_LEN1_PORT25_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT25_RD_LEN1_PORT25_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT26_RD_LEN0 - Port 26 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT26_RD_LEN0_PORT26_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT26_RD_LEN0_PORT26_RD_LEN0_SHIFT (0U)\r\n/*! PORT26_RD_LEN0 - Port 26 read length [7:0] */\r\n#define SDU_FN_CARD_PORT26_RD_LEN0_PORT26_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT26_RD_LEN0_PORT26_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT26_RD_LEN0_PORT26_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT26_RD_LEN1 - Port 26 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT26_RD_LEN1_PORT26_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT26_RD_LEN1_PORT26_RD_LEN1_SHIFT (0U)\r\n/*! PORT26_RD_LEN1 - Port 26 read length [15:8] */\r\n#define SDU_FN_CARD_PORT26_RD_LEN1_PORT26_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT26_RD_LEN1_PORT26_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT26_RD_LEN1_PORT26_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT27_RD_LEN0 - Port 27 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT27_RD_LEN0_PORT27_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT27_RD_LEN0_PORT27_RD_LEN0_SHIFT (0U)\r\n/*! PORT27_RD_LEN0 - Port 27 read length [7:0] */\r\n#define SDU_FN_CARD_PORT27_RD_LEN0_PORT27_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT27_RD_LEN0_PORT27_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT27_RD_LEN0_PORT27_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT27_RD_LEN1 - Port 27 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT27_RD_LEN1_PORT27_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT27_RD_LEN1_PORT27_RD_LEN1_SHIFT (0U)\r\n/*! PORT27_RD_LEN1 - Port 27 read length [15:8] */\r\n#define SDU_FN_CARD_PORT27_RD_LEN1_PORT27_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT27_RD_LEN1_PORT27_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT27_RD_LEN1_PORT27_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT28_RD_LEN0 - Port 28 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT28_RD_LEN0_PORT28_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT28_RD_LEN0_PORT28_RD_LEN0_SHIFT (0U)\r\n/*! PORT28_RD_LEN0 - Port 28 read length [7:0] */\r\n#define SDU_FN_CARD_PORT28_RD_LEN0_PORT28_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT28_RD_LEN0_PORT28_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT28_RD_LEN0_PORT28_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT28_RD_LEN1 - Port 28 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT28_RD_LEN1_PORT28_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT28_RD_LEN1_PORT28_RD_LEN1_SHIFT (0U)\r\n/*! PORT28_RD_LEN1 - Port 28 read length [15:8] */\r\n#define SDU_FN_CARD_PORT28_RD_LEN1_PORT28_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT28_RD_LEN1_PORT28_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT28_RD_LEN1_PORT28_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT29_RD_LEN0 - Port 29 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT29_RD_LEN0_PORT29_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT29_RD_LEN0_PORT29_RD_LEN0_SHIFT (0U)\r\n/*! PORT29_RD_LEN0 - Port 29 read length [7:0] */\r\n#define SDU_FN_CARD_PORT29_RD_LEN0_PORT29_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT29_RD_LEN0_PORT29_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT29_RD_LEN0_PORT29_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT29_RD_LEN1 - Port 29 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT29_RD_LEN1_PORT29_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT29_RD_LEN1_PORT29_RD_LEN1_SHIFT (0U)\r\n/*! PORT29_RD_LEN1 - Port 29 read length [15:8] */\r\n#define SDU_FN_CARD_PORT29_RD_LEN1_PORT29_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT29_RD_LEN1_PORT29_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT29_RD_LEN1_PORT29_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT30_RD_LEN0 - Port 30 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT30_RD_LEN0_PORT30_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT30_RD_LEN0_PORT30_RD_LEN0_SHIFT (0U)\r\n/*! PORT30_RD_LEN0 - Port 30 read length [7:0] */\r\n#define SDU_FN_CARD_PORT30_RD_LEN0_PORT30_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT30_RD_LEN0_PORT30_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT30_RD_LEN0_PORT30_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT30_RD_LEN1 - Port 30 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT30_RD_LEN1_PORT30_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT30_RD_LEN1_PORT30_RD_LEN1_SHIFT (0U)\r\n/*! PORT30_RD_LEN1 - Port 30 read length [15:8] */\r\n#define SDU_FN_CARD_PORT30_RD_LEN1_PORT30_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT30_RD_LEN1_PORT30_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT30_RD_LEN1_PORT30_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT31_RD_LEN0 - Port 31 Packet Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT31_RD_LEN0_PORT31_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT31_RD_LEN0_PORT31_RD_LEN0_SHIFT (0U)\r\n/*! PORT31_RD_LEN0 - Port 31 read length [7:0] */\r\n#define SDU_FN_CARD_PORT31_RD_LEN0_PORT31_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT31_RD_LEN0_PORT31_RD_LEN0_SHIFT)) & SDU_FN_CARD_PORT31_RD_LEN0_PORT31_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORT31_RD_LEN1 - Port 31 Packet Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PORT31_RD_LEN1_PORT31_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PORT31_RD_LEN1_PORT31_RD_LEN1_SHIFT (0U)\r\n/*! PORT31_RD_LEN1 - Port 31 read length [15:8] */\r\n#define SDU_FN_CARD_PORT31_RD_LEN1_PORT31_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PORT31_RD_LEN1_PORT31_RD_LEN1_SHIFT)) & SDU_FN_CARD_PORT31_RD_LEN1_PORT31_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_RESTART - Host Transfer Status */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_RESTART_DNLD_RESTART_MASK (0x1U)\r\n#define SDU_FN_CARD_HOST_RESTART_DNLD_RESTART_SHIFT (0U)\r\n/*! DNLD_RESTART - Download Restart Host sets this bit for the card to retransmit packet. */\r\n#define SDU_FN_CARD_HOST_RESTART_DNLD_RESTART(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_RESTART_DNLD_RESTART_SHIFT)) & SDU_FN_CARD_HOST_RESTART_DNLD_RESTART_MASK)\r\n\r\n#define SDU_FN_CARD_HOST_RESTART_UPLD_RESTART_MASK (0x2U)\r\n#define SDU_FN_CARD_HOST_RESTART_UPLD_RESTART_SHIFT (1U)\r\n/*! UPLD_RESTART - Upload Restart Host sets this bit for the card to retransmit packet. */\r\n#define SDU_FN_CARD_HOST_RESTART_UPLD_RESTART(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_RESTART_UPLD_RESTART_SHIFT)) & SDU_FN_CARD_HOST_RESTART_UPLD_RESTART_MASK)\r\n\r\n#define SDU_FN_CARD_HOST_RESTART_DNLD_CRC_ERR_MASK (0x4U)\r\n#define SDU_FN_CARD_HOST_RESTART_DNLD_CRC_ERR_SHIFT (2U)\r\n/*! DNLD_CRC_ERR - Download Cyclic Redundancy Check Error This bit is set by HW if there is a data\r\n *    CRC error after a data block is downloaded.\r\n */\r\n#define SDU_FN_CARD_HOST_RESTART_DNLD_CRC_ERR(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_RESTART_DNLD_CRC_ERR_SHIFT)) & SDU_FN_CARD_HOST_RESTART_DNLD_CRC_ERR_MASK)\r\n/*! @} */\r\n\r\n/*! @name FN_CARD_INTMASK - Function Card Interrupt Mask */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_FN_CARD_INTMASK_FN_CARD_INT_MASK_MASK (0x7U)\r\n#define SDU_FN_CARD_FN_CARD_INTMASK_FN_CARD_INT_MASK_SHIFT (0U)\r\n/*! FN_CARD_INT_MASK - Function card interrupt masks. */\r\n#define SDU_FN_CARD_FN_CARD_INTMASK_FN_CARD_INT_MASK(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_FN_CARD_INTMASK_FN_CARD_INT_MASK_SHIFT)) & SDU_FN_CARD_FN_CARD_INTMASK_FN_CARD_INT_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name Q_PRT_RANGE0 - Queue Port Range 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_Q_PRT_RANGE0_Q0_PRT_RANGE_MASK (0x7U)\r\n#define SDU_FN_CARD_Q_PRT_RANGE0_Q0_PRT_RANGE_SHIFT (0U)\r\n/*! Q0_PRT_RANGE - Queue 0 Port Range Number of ports assigned per queue. */\r\n#define SDU_FN_CARD_Q_PRT_RANGE0_Q0_PRT_RANGE(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_Q_PRT_RANGE0_Q0_PRT_RANGE_SHIFT)) & SDU_FN_CARD_Q_PRT_RANGE0_Q0_PRT_RANGE_MASK)\r\n\r\n#define SDU_FN_CARD_Q_PRT_RANGE0_Q1_PRT_RANGE_MASK (0x70U)\r\n#define SDU_FN_CARD_Q_PRT_RANGE0_Q1_PRT_RANGE_SHIFT (4U)\r\n/*! Q1_PRT_RANGE - Queue 1 Port Range Number of ports assigned per queue. */\r\n#define SDU_FN_CARD_Q_PRT_RANGE0_Q1_PRT_RANGE(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_Q_PRT_RANGE0_Q1_PRT_RANGE_SHIFT)) & SDU_FN_CARD_Q_PRT_RANGE0_Q1_PRT_RANGE_MASK)\r\n/*! @} */\r\n\r\n/*! @name Q_PRT_RANGE1 - Queue Port Range 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_Q_PRT_RANGE1_Q2_PRT_RANGE_MASK (0x7U)\r\n#define SDU_FN_CARD_Q_PRT_RANGE1_Q2_PRT_RANGE_SHIFT (0U)\r\n/*! Q2_PRT_RANGE - Queue 2 Port Range Number of ports assigned per queue. */\r\n#define SDU_FN_CARD_Q_PRT_RANGE1_Q2_PRT_RANGE(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_Q_PRT_RANGE1_Q2_PRT_RANGE_SHIFT)) & SDU_FN_CARD_Q_PRT_RANGE1_Q2_PRT_RANGE_MASK)\r\n\r\n#define SDU_FN_CARD_Q_PRT_RANGE1_Q3_PRT_RANGE_MASK (0x70U)\r\n#define SDU_FN_CARD_Q_PRT_RANGE1_Q3_PRT_RANGE_SHIFT (4U)\r\n/*! Q3_PRT_RANGE - Queue 3 Port Range Number of ports assigned per queue. */\r\n#define SDU_FN_CARD_Q_PRT_RANGE1_Q3_PRT_RANGE(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_Q_PRT_RANGE1_Q3_PRT_RANGE_SHIFT)) & SDU_FN_CARD_Q_PRT_RANGE1_Q3_PRT_RANGE_MASK)\r\n/*! @} */\r\n\r\n/*! @name C2H_INTEVENT0 - Card to Host Event 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_C2H_INTEVENT0_Q0_DNLD_CARD_RDY_MASK (0x1U)\r\n#define SDU_FN_CARD_C2H_INTEVENT0_Q0_DNLD_CARD_RDY_SHIFT (0U)\r\n/*! Q0_DNLD_CARD_RDY - Queue 0 Download Card Ready Firmware sets this bit when one packet is ready. */\r\n#define SDU_FN_CARD_C2H_INTEVENT0_Q0_DNLD_CARD_RDY(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_C2H_INTEVENT0_Q0_DNLD_CARD_RDY_SHIFT)) & SDU_FN_CARD_C2H_INTEVENT0_Q0_DNLD_CARD_RDY_MASK)\r\n\r\n#define SDU_FN_CARD_C2H_INTEVENT0_Q0_UPLD_CARD_RDY_MASK (0x2U)\r\n#define SDU_FN_CARD_C2H_INTEVENT0_Q0_UPLD_CARD_RDY_SHIFT (1U)\r\n/*! Q0_UPLD_CARD_RDY - Queue 0 Upload Card Ready Firmware sets this bit when one packet is ready. */\r\n#define SDU_FN_CARD_C2H_INTEVENT0_Q0_UPLD_CARD_RDY(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_C2H_INTEVENT0_Q0_UPLD_CARD_RDY_SHIFT)) & SDU_FN_CARD_C2H_INTEVENT0_Q0_UPLD_CARD_RDY_MASK)\r\n\r\n#define SDU_FN_CARD_C2H_INTEVENT0_CIS_CARD_RDY_MASK (0x4U)\r\n#define SDU_FN_CARD_C2H_INTEVENT0_CIS_CARD_RDY_SHIFT (2U)\r\n/*! CIS_CARD_RDY - Card Information Structure Card Ready Firmware sets this bit after CIS table is initialized */\r\n#define SDU_FN_CARD_C2H_INTEVENT0_CIS_CARD_RDY(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_C2H_INTEVENT0_CIS_CARD_RDY_SHIFT)) & SDU_FN_CARD_C2H_INTEVENT0_CIS_CARD_RDY_MASK)\r\n\r\n#define SDU_FN_CARD_C2H_INTEVENT0_IO_READY_MASK  (0x8U)\r\n#define SDU_FN_CARD_C2H_INTEVENT0_IO_READY_SHIFT (3U)\r\n/*! IO_READY - I/O Ready Indicator SD target device accepts CMD53 only after the previous CMD53 has finished. */\r\n#define SDU_FN_CARD_C2H_INTEVENT0_IO_READY(x)    (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_C2H_INTEVENT0_IO_READY_SHIFT)) & SDU_FN_CARD_C2H_INTEVENT0_IO_READY_MASK)\r\n\r\n#define SDU_FN_CARD_C2H_INTEVENT0_CARD_TO_HOST_EVENT_MASK (0x30U)\r\n#define SDU_FN_CARD_C2H_INTEVENT0_CARD_TO_HOST_EVENT_SHIFT (4U)\r\n/*! CARD_TO_HOST_EVENT - Firmware controlled events to host. */\r\n#define SDU_FN_CARD_C2H_INTEVENT0_CARD_TO_HOST_EVENT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_C2H_INTEVENT0_CARD_TO_HOST_EVENT_SHIFT)) & SDU_FN_CARD_C2H_INTEVENT0_CARD_TO_HOST_EVENT_MASK)\r\n\r\n#define SDU_FN_CARD_C2H_INTEVENT0_CMD_PORT_UPLD_RDY_MASK (0x40U)\r\n#define SDU_FN_CARD_C2H_INTEVENT0_CMD_PORT_UPLD_RDY_SHIFT (6U)\r\n/*! CMD_PORT_UPLD_RDY - Command Port Upload Ready */\r\n#define SDU_FN_CARD_C2H_INTEVENT0_CMD_PORT_UPLD_RDY(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_C2H_INTEVENT0_CMD_PORT_UPLD_RDY_SHIFT)) & SDU_FN_CARD_C2H_INTEVENT0_CMD_PORT_UPLD_RDY_MASK)\r\n\r\n#define SDU_FN_CARD_C2H_INTEVENT0_CMD_PORT_DNLD_RDY_MASK (0x80U)\r\n#define SDU_FN_CARD_C2H_INTEVENT0_CMD_PORT_DNLD_RDY_SHIFT (7U)\r\n/*! CMD_PORT_DNLD_RDY - Command Port Download Ready */\r\n#define SDU_FN_CARD_C2H_INTEVENT0_CMD_PORT_DNLD_RDY(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_C2H_INTEVENT0_CMD_PORT_DNLD_RDY_SHIFT)) & SDU_FN_CARD_C2H_INTEVENT0_CMD_PORT_DNLD_RDY_MASK)\r\n/*! @} */\r\n\r\n/*! @name C2H_INTEVENT1 - Card to Host Event 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_C2H_INTEVENT1_Q1_DNLD_CARD_RDY_MASK (0x1U)\r\n#define SDU_FN_CARD_C2H_INTEVENT1_Q1_DNLD_CARD_RDY_SHIFT (0U)\r\n/*! Q1_DNLD_CARD_RDY - Queue 1 Download Card Ready */\r\n#define SDU_FN_CARD_C2H_INTEVENT1_Q1_DNLD_CARD_RDY(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_C2H_INTEVENT1_Q1_DNLD_CARD_RDY_SHIFT)) & SDU_FN_CARD_C2H_INTEVENT1_Q1_DNLD_CARD_RDY_MASK)\r\n\r\n#define SDU_FN_CARD_C2H_INTEVENT1_Q2_DNLD_CARD_RDY_MASK (0x2U)\r\n#define SDU_FN_CARD_C2H_INTEVENT1_Q2_DNLD_CARD_RDY_SHIFT (1U)\r\n/*! Q2_DNLD_CARD_RDY - Queue 2 Download Card Ready */\r\n#define SDU_FN_CARD_C2H_INTEVENT1_Q2_DNLD_CARD_RDY(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_C2H_INTEVENT1_Q2_DNLD_CARD_RDY_SHIFT)) & SDU_FN_CARD_C2H_INTEVENT1_Q2_DNLD_CARD_RDY_MASK)\r\n\r\n#define SDU_FN_CARD_C2H_INTEVENT1_Q3_DNLD_CARD_RDY_MASK (0x4U)\r\n#define SDU_FN_CARD_C2H_INTEVENT1_Q3_DNLD_CARD_RDY_SHIFT (2U)\r\n/*! Q3_DNLD_CARD_RDY - Queue 3 Download Card Ready */\r\n#define SDU_FN_CARD_C2H_INTEVENT1_Q3_DNLD_CARD_RDY(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_C2H_INTEVENT1_Q3_DNLD_CARD_RDY_SHIFT)) & SDU_FN_CARD_C2H_INTEVENT1_Q3_DNLD_CARD_RDY_MASK)\r\n\r\n#define SDU_FN_CARD_C2H_INTEVENT1_Q1_UPLD_CARD_RDY_MASK (0x8U)\r\n#define SDU_FN_CARD_C2H_INTEVENT1_Q1_UPLD_CARD_RDY_SHIFT (3U)\r\n/*! Q1_UPLD_CARD_RDY - Queue 1 Upload Card Ready */\r\n#define SDU_FN_CARD_C2H_INTEVENT1_Q1_UPLD_CARD_RDY(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_C2H_INTEVENT1_Q1_UPLD_CARD_RDY_SHIFT)) & SDU_FN_CARD_C2H_INTEVENT1_Q1_UPLD_CARD_RDY_MASK)\r\n\r\n#define SDU_FN_CARD_C2H_INTEVENT1_Q2_UPLD_CARD_RDY_MASK (0x10U)\r\n#define SDU_FN_CARD_C2H_INTEVENT1_Q2_UPLD_CARD_RDY_SHIFT (4U)\r\n/*! Q2_UPLD_CARD_RDY - Queue 2 Upload Card Ready */\r\n#define SDU_FN_CARD_C2H_INTEVENT1_Q2_UPLD_CARD_RDY(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_C2H_INTEVENT1_Q2_UPLD_CARD_RDY_SHIFT)) & SDU_FN_CARD_C2H_INTEVENT1_Q2_UPLD_CARD_RDY_MASK)\r\n\r\n#define SDU_FN_CARD_C2H_INTEVENT1_Q3_UPLD_CARD_RDY_MASK (0x20U)\r\n#define SDU_FN_CARD_C2H_INTEVENT1_Q3_UPLD_CARD_RDY_SHIFT (5U)\r\n/*! Q3_UPLD_CARD_RDY - Queue 3 Upload Card Ready */\r\n#define SDU_FN_CARD_C2H_INTEVENT1_Q3_UPLD_CARD_RDY(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_C2H_INTEVENT1_Q3_UPLD_CARD_RDY_SHIFT)) & SDU_FN_CARD_C2H_INTEVENT1_Q3_UPLD_CARD_RDY_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INTMASK0 - Card Interrupt Mask 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INTMASK0_CARD_INT_MASK0_MASK (0xFFU)\r\n#define SDU_FN_CARD_CARD_INTMASK0_CARD_INT_MASK0_SHIFT (0U)\r\n/*! CARD_INT_MASK0 - Host to Card Interrupt Mask[7:0] 0 = disable host to card interrupt 1 = enable host to card interrupt */\r\n#define SDU_FN_CARD_CARD_INTMASK0_CARD_INT_MASK0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTMASK0_CARD_INT_MASK0_SHIFT)) & SDU_FN_CARD_CARD_INTMASK0_CARD_INT_MASK0_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INTMASK1 - Card Interrupt Mask 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INTMASK1_CARD_INT_MASK1_MASK (0xFFU)\r\n#define SDU_FN_CARD_CARD_INTMASK1_CARD_INT_MASK1_SHIFT (0U)\r\n/*! CARD_INT_MASK1 - Host to Card Interrupt Mask[15:8] 0 = disable host to card interrupt 1 = enable host to card interrupt */\r\n#define SDU_FN_CARD_CARD_INTMASK1_CARD_INT_MASK1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTMASK1_CARD_INT_MASK1_SHIFT)) & SDU_FN_CARD_CARD_INTMASK1_CARD_INT_MASK1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INTMASK2 - Card Interrupt Mask 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INTMASK2_CARD_INT_MASK2_MASK (0xFFU)\r\n#define SDU_FN_CARD_CARD_INTMASK2_CARD_INT_MASK2_SHIFT (0U)\r\n/*! CARD_INT_MASK2 - Host to Card Interrupt Mask [23:16] 0 = disable host to card interrupt 1 = enable host to card interrupt */\r\n#define SDU_FN_CARD_CARD_INTMASK2_CARD_INT_MASK2(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTMASK2_CARD_INT_MASK2_SHIFT)) & SDU_FN_CARD_CARD_INTMASK2_CARD_INT_MASK2_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INTSTATUS0 - Card Interrupt Status 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_Q0_DNLD_CARD_INT_MASK (0x1U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_Q0_DNLD_CARD_INT_SHIFT (0U)\r\n/*! Q0_DNLD_CARD_INT - Queue 0 DnldCardInt event when (IO_Write) && DMA_Finish. */\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_Q0_DNLD_CARD_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS0_Q0_DNLD_CARD_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS0_Q0_DNLD_CARD_INT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_Q0_UPLD_CARD_INT_MASK (0x2U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_Q0_UPLD_CARD_INT_SHIFT (1U)\r\n/*! Q0_UPLD_CARD_INT - Queue 0 UpldCardInt event when (IO_Ready) && SD_Finish. */\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_Q0_UPLD_CARD_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS0_Q0_UPLD_CARD_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS0_Q0_UPLD_CARD_INT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_ABORT_CARD_INT_MASK (0x4U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_ABORT_CARD_INT_SHIFT (2U)\r\n/*! ABORT_CARD_INT - Abort CardInt event when abort pulse. */\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_ABORT_CARD_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS0_ABORT_CARD_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS0_ABORT_CARD_INT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_HOST_PWR_DOWN_INT_MASK (0x8U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_HOST_PWR_DOWN_INT_SHIFT (3U)\r\n/*! HOST_PWR_DOWN_INT - Power down interrupt */\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_HOST_PWR_DOWN_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS0_HOST_PWR_DOWN_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS0_HOST_PWR_DOWN_INT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_HOST_PWR_UP_INT_MASK (0x10U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_HOST_PWR_UP_INT_SHIFT (4U)\r\n/*! HOST_PWR_UP_INT - Power up interrupt */\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_HOST_PWR_UP_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS0_HOST_PWR_UP_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS0_HOST_PWR_UP_INT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_UNDERFLOW_CARD_INT_MASK (0x20U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_UNDERFLOW_CARD_INT_SHIFT (5U)\r\n/*! UNDERFLOW_CARD_INT - Fifo underflow */\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_UNDERFLOW_CARD_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS0_UNDERFLOW_CARD_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS0_UNDERFLOW_CARD_INT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_OVERFLOW_CARD_INT_MASK (0x40U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_OVERFLOW_CARD_INT_SHIFT (6U)\r\n/*! OVERFLOW_CARD_INT - Fifo overflow */\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_OVERFLOW_CARD_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS0_OVERFLOW_CARD_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS0_OVERFLOW_CARD_INT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_HOST_TO_CARD_EVENT_MASK (0x80U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_HOST_TO_CARD_EVENT_SHIFT (7U)\r\n/*! HOST_TO_CARD_EVENT - Host interrupt to card */\r\n#define SDU_FN_CARD_CARD_INTSTATUS0_HOST_TO_CARD_EVENT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS0_HOST_TO_CARD_EVENT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS0_HOST_TO_CARD_EVENT_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INTSTATUS1 - Card Interrupt Status 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_IO_ENABLE_INT_MASK (0x1U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_IO_ENABLE_INT_SHIFT (0U)\r\n/*! IO_ENABLE_INT - This event is set when IO_ENABLE[fn] at FN0 0x02 is transitioned from 0-to-1 that is written by host */\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_IO_ENABLE_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS1_IO_ENABLE_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS1_IO_ENABLE_INT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_IO_DISABLE_INT_MASK (0x2U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_IO_DISABLE_INT_SHIFT (1U)\r\n/*! IO_DISABLE_INT - This event is set when IO_ENABLE[fn] at FN0 0x02 is transitioned from 1-to-0 that is written by host */\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_IO_DISABLE_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS1_IO_DISABLE_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS1_IO_DISABLE_INT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_CMD_PORT_UPLD_CARD_INT_MASK (0x4U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_CMD_PORT_UPLD_CARD_INT_SHIFT (2U)\r\n/*! CMD_PORT_UPLD_CARD_INT - This event is set if current cmd53 upload/rx data transfer is completed. */\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_CMD_PORT_UPLD_CARD_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS1_CMD_PORT_UPLD_CARD_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS1_CMD_PORT_UPLD_CARD_INT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_CMD_PORT_DNLD_CARD_INT_MASK (0x8U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_CMD_PORT_DNLD_CARD_INT_SHIFT (3U)\r\n/*! CMD_PORT_DNLD_CARD_INT - This event is set if current cmd53 download/tx data transfer is completed. */\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_CMD_PORT_DNLD_CARD_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS1_CMD_PORT_DNLD_CARD_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS1_CMD_PORT_DNLD_CARD_INT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_CMD52_WR_ERR_INT_MASK (0x10U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_CMD52_WR_ERR_INT_SHIFT (4U)\r\n/*! CMD52_WR_ERR_INT - This event is set if host issues cmd52 write access to off-domain register during sleep mode. */\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_CMD52_WR_ERR_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS1_CMD52_WR_ERR_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS1_CMD52_WR_ERR_INT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_CMD52_RD_ERR_INT_MASK (0x20U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_CMD52_RD_ERR_INT_SHIFT (5U)\r\n/*! CMD52_RD_ERR_INT - This event is set if host issues cmd52 read access to off-domain register during sleep mode. */\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_CMD52_RD_ERR_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS1_CMD52_RD_ERR_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS1_CMD52_RD_ERR_INT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_CMD53_WR_ERR_INT_MASK (0x40U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_CMD53_WR_ERR_INT_SHIFT (6U)\r\n/*! CMD53_WR_ERR_INT - This event is set if host issues cmd53 write access to off-domain register during sleep mode. */\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_CMD53_WR_ERR_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS1_CMD53_WR_ERR_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS1_CMD53_WR_ERR_INT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_CMD53_RD_ERR_INT_MASK (0x80U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_CMD53_RD_ERR_INT_SHIFT (7U)\r\n/*! CMD53_RD_ERR_INT - This event is set if host issues cmd53 read access to off-domain register during sleep mode. */\r\n#define SDU_FN_CARD_CARD_INTSTATUS1_CMD53_RD_ERR_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS1_CMD53_RD_ERR_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS1_CMD53_RD_ERR_INT_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INTSTATUS2 - Card Interrupt Status 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_Q1_DNLD_CARD_INT_MASK (0x1U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_Q1_DNLD_CARD_INT_SHIFT (0U)\r\n/*! Q1_DNLD_CARD_INT - Queue 1 DnldCardInt event when (IO_Write) && DMA_Finish. */\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_Q1_DNLD_CARD_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS2_Q1_DNLD_CARD_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS2_Q1_DNLD_CARD_INT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_Q2_DNLD_CARD_INT_MASK (0x2U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_Q2_DNLD_CARD_INT_SHIFT (1U)\r\n/*! Q2_DNLD_CARD_INT - Queue 2 DnldCardInt event when (IO_Write) && DMA_Finish. */\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_Q2_DNLD_CARD_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS2_Q2_DNLD_CARD_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS2_Q2_DNLD_CARD_INT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_Q3_DNLD_CARD_INT_MASK (0x4U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_Q3_DNLD_CARD_INT_SHIFT (2U)\r\n/*! Q3_DNLD_CARD_INT - Queue 3 DnldCardInt event when (IO_Write) && DMA_Finish. */\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_Q3_DNLD_CARD_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS2_Q3_DNLD_CARD_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS2_Q3_DNLD_CARD_INT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_Q1_UPLD_CARD_INT_MASK (0x8U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_Q1_UPLD_CARD_INT_SHIFT (3U)\r\n/*! Q1_UPLD_CARD_INT - Queue 1 UpldCardInt event when (IO_Ready) && SD_Finish. */\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_Q1_UPLD_CARD_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS2_Q1_UPLD_CARD_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS2_Q1_UPLD_CARD_INT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_Q2_UPLD_CARD_INT_MASK (0x10U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_Q2_UPLD_CARD_INT_SHIFT (4U)\r\n/*! Q2_UPLD_CARD_INT - Queue 2 UpldCardInt event when (IO_Ready) && SD_Finish. */\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_Q2_UPLD_CARD_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS2_Q2_UPLD_CARD_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS2_Q2_UPLD_CARD_INT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_Q3_UPLD_CARD_INT_MASK (0x20U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_Q3_UPLD_CARD_INT_SHIFT (5U)\r\n/*! Q3_UPLD_CARD_INT - Queue 3 UpldCardInt event when (IO_Ready) && SD_Finish. */\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_Q3_UPLD_CARD_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS2_Q3_UPLD_CARD_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS2_Q3_UPLD_CARD_INT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_HOST_RST_INT_MASK (0x40U)\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_HOST_RST_INT_SHIFT (6U)\r\n/*! HOST_RST_INT - Host reset event. */\r\n#define SDU_FN_CARD_CARD_INTSTATUS2_HOST_RST_INT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTSTATUS2_HOST_RST_INT_SHIFT)) & SDU_FN_CARD_CARD_INTSTATUS2_HOST_RST_INT_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INTRSR0 - Card Interrupt Reset Select 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INTRSR0_CARD_INT_RSR0_MASK (0xFFU)\r\n#define SDU_FN_CARD_CARD_INTRSR0_CARD_INT_RSR0_SHIFT (0U)\r\n/*! CARD_INT_RSR0 - Card Interrupt Reset Select[7:0] 0 = ISR bit clears when 0 is written to it 1 = ISR bit clears when read */\r\n#define SDU_FN_CARD_CARD_INTRSR0_CARD_INT_RSR0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTRSR0_CARD_INT_RSR0_SHIFT)) & SDU_FN_CARD_CARD_INTRSR0_CARD_INT_RSR0_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INTRSR1 - Card Interrupt Reset Select 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INTRSR1_CARD_INT_RSR1_MASK (0xFFU)\r\n#define SDU_FN_CARD_CARD_INTRSR1_CARD_INT_RSR1_SHIFT (0U)\r\n/*! CARD_INT_RSR1 - Card Interrupt Reset Select[15:8] 0 = ISR bit clears when 0 is written to it 1 = ISR bit clears when read */\r\n#define SDU_FN_CARD_CARD_INTRSR1_CARD_INT_RSR1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTRSR1_CARD_INT_RSR1_SHIFT)) & SDU_FN_CARD_CARD_INTRSR1_CARD_INT_RSR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INTRSR2 - Card Interrupt Reset Select 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INTRSR2_CARD_INT_RSR2_MASK (0xFFU)\r\n#define SDU_FN_CARD_CARD_INTRSR2_CARD_INT_RSR2_SHIFT (0U)\r\n/*! CARD_INT_RSR2 - Card Interrupt Reset Select[23:16] 0 = ISR bit clears when 0 is written to it 1 = ISR bit clears when read */\r\n#define SDU_FN_CARD_CARD_INTRSR2_CARD_INT_RSR2(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INTRSR2_CARD_INT_RSR2_SHIFT)) & SDU_FN_CARD_CARD_INTRSR2_CARD_INT_RSR2_MASK)\r\n/*! @} */\r\n\r\n/*! @name RD_BASE0 - SQ Read Base Address 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_RD_BASE0_SQ_READ_ADDR0_MASK  (0xFFU)\r\n#define SDU_FN_CARD_RD_BASE0_SQ_READ_ADDR0_SHIFT (0U)\r\n/*! SQ_READ_ADDR0 - SQ read base address bit [7:0]. */\r\n#define SDU_FN_CARD_RD_BASE0_SQ_READ_ADDR0(x)    (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_RD_BASE0_SQ_READ_ADDR0_SHIFT)) & SDU_FN_CARD_RD_BASE0_SQ_READ_ADDR0_MASK)\r\n/*! @} */\r\n\r\n/*! @name RD_BASE1 - SQ Read Base Address 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_RD_BASE1_SQ_READ_ADDR1_MASK  (0xFFU)\r\n#define SDU_FN_CARD_RD_BASE1_SQ_READ_ADDR1_SHIFT (0U)\r\n/*! SQ_READ_ADDR1 - SQ read base address bit [15:8] */\r\n#define SDU_FN_CARD_RD_BASE1_SQ_READ_ADDR1(x)    (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_RD_BASE1_SQ_READ_ADDR1_SHIFT)) & SDU_FN_CARD_RD_BASE1_SQ_READ_ADDR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name RD_BASE2 - SQ Read Base Address 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_RD_BASE2_SQ_READ_ADDR2_MASK  (0xFFU)\r\n#define SDU_FN_CARD_RD_BASE2_SQ_READ_ADDR2_SHIFT (0U)\r\n/*! SQ_READ_ADDR2 - SQ read base address bit [23:16] */\r\n#define SDU_FN_CARD_RD_BASE2_SQ_READ_ADDR2(x)    (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_RD_BASE2_SQ_READ_ADDR2_SHIFT)) & SDU_FN_CARD_RD_BASE2_SQ_READ_ADDR2_MASK)\r\n/*! @} */\r\n\r\n/*! @name RD_BASE3 - SQ Read Base Address 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_RD_BASE3_SQ_READ_ADDR3_MASK  (0xFFU)\r\n#define SDU_FN_CARD_RD_BASE3_SQ_READ_ADDR3_SHIFT (0U)\r\n/*! SQ_READ_ADDR3 - SQ read base address bit [31:24] */\r\n#define SDU_FN_CARD_RD_BASE3_SQ_READ_ADDR3(x)    (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_RD_BASE3_SQ_READ_ADDR3_SHIFT)) & SDU_FN_CARD_RD_BASE3_SQ_READ_ADDR3_MASK)\r\n/*! @} */\r\n\r\n/*! @name WR_BASE0 - SQ Write Base Address 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_WR_BASE0_SQ_WRITE_ADDR0_MASK (0xFFU)\r\n#define SDU_FN_CARD_WR_BASE0_SQ_WRITE_ADDR0_SHIFT (0U)\r\n/*! SQ_WRITE_ADDR0 - SQ Write base address bit [7:0]. */\r\n#define SDU_FN_CARD_WR_BASE0_SQ_WRITE_ADDR0(x)   (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_WR_BASE0_SQ_WRITE_ADDR0_SHIFT)) & SDU_FN_CARD_WR_BASE0_SQ_WRITE_ADDR0_MASK)\r\n/*! @} */\r\n\r\n/*! @name WR_BASE1 - SQ Write Base Address 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_WR_BASE1_SQ_WRITE_ADDR1_MASK (0xFFU)\r\n#define SDU_FN_CARD_WR_BASE1_SQ_WRITE_ADDR1_SHIFT (0U)\r\n/*! SQ_WRITE_ADDR1 - SQ Write base address bit [15:8] */\r\n#define SDU_FN_CARD_WR_BASE1_SQ_WRITE_ADDR1(x)   (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_WR_BASE1_SQ_WRITE_ADDR1_SHIFT)) & SDU_FN_CARD_WR_BASE1_SQ_WRITE_ADDR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name WR_BASE2 - SQ Write Base Address 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_WR_BASE2_SQ_WRITE_ADDR2_MASK (0xFFU)\r\n#define SDU_FN_CARD_WR_BASE2_SQ_WRITE_ADDR2_SHIFT (0U)\r\n/*! SQ_WRITE_ADDR2 - SQ Write base address bit [23:16] */\r\n#define SDU_FN_CARD_WR_BASE2_SQ_WRITE_ADDR2(x)   (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_WR_BASE2_SQ_WRITE_ADDR2_SHIFT)) & SDU_FN_CARD_WR_BASE2_SQ_WRITE_ADDR2_MASK)\r\n/*! @} */\r\n\r\n/*! @name WR_BASE3 - SQ Write Base Address 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_WR_BASE3_SQ_WRITE_ADDR3_MASK (0xFFU)\r\n#define SDU_FN_CARD_WR_BASE3_SQ_WRITE_ADDR3_SHIFT (0U)\r\n/*! SQ_WRITE_ADDR3 - SQ Write base address bit [31:24] */\r\n#define SDU_FN_CARD_WR_BASE3_SQ_WRITE_ADDR3(x)   (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_WR_BASE3_SQ_WRITE_ADDR3_SHIFT)) & SDU_FN_CARD_WR_BASE3_SQ_WRITE_ADDR3_MASK)\r\n/*! @} */\r\n\r\n/*! @name RD_IDX - Read Base Address Index */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_RD_IDX_RD_INDEX_MASK         (0x1FU)\r\n#define SDU_FN_CARD_RD_IDX_RD_INDEX_SHIFT        (0U)\r\n/*! RD_INDEX - Index to current read base address [15:0] */\r\n#define SDU_FN_CARD_RD_IDX_RD_INDEX(x)           (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_RD_IDX_RD_INDEX_SHIFT)) & SDU_FN_CARD_RD_IDX_RD_INDEX_MASK)\r\n/*! @} */\r\n\r\n/*! @name WR_IDX - Write Base Address Index */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_WR_IDX_WR_INDEX_MASK         (0x1FU)\r\n#define SDU_FN_CARD_WR_IDX_WR_INDEX_SHIFT        (0U)\r\n/*! WR_INDEX - Index to current write base address [15:0] */\r\n#define SDU_FN_CARD_WR_IDX_WR_INDEX(x)           (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_WR_IDX_WR_INDEX_SHIFT)) & SDU_FN_CARD_WR_IDX_WR_INDEX_MASK)\r\n/*! @} */\r\n\r\n/*! @name APU_SLP_RDY_EN - APU Sleep Ready Enable */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_APU_SLP_RDY_EN_APU_SLP_RDY_EN_MASK (0x1U)\r\n#define SDU_FN_CARD_APU_SLP_RDY_EN_APU_SLP_RDY_EN_SHIFT (0U)\r\n/*! APU_SLP_RDY_EN - APU Sleep Ready Enable If this bit is enabled, any pending host interrupt\r\n *    status will deassert sdu_apu_slp_rdy to prevent APU from going into sleep mode.\r\n */\r\n#define SDU_FN_CARD_APU_SLP_RDY_EN_APU_SLP_RDY_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_APU_SLP_RDY_EN_APU_SLP_RDY_EN_SHIFT)) & SDU_FN_CARD_APU_SLP_RDY_EN_APU_SLP_RDY_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_ERR_WKUP_EN - Host Error Wakeup Enable */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_ERR_WKUP_EN_CMD52_WR_ERR_WKUP_EN_MASK (0x1U)\r\n#define SDU_FN_CARD_HOST_ERR_WKUP_EN_CMD52_WR_ERR_WKUP_EN_SHIFT (0U)\r\n/*! CMD52_WR_ERR_WKUP_EN - CMD52 Write Error Wakeup Enable If host issues CMD52 write access to any\r\n *    off-domain register during sleep mode, setting this bit will trigger wakeup event to the APU.\r\n */\r\n#define SDU_FN_CARD_HOST_ERR_WKUP_EN_CMD52_WR_ERR_WKUP_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_ERR_WKUP_EN_CMD52_WR_ERR_WKUP_EN_SHIFT)) & SDU_FN_CARD_HOST_ERR_WKUP_EN_CMD52_WR_ERR_WKUP_EN_MASK)\r\n\r\n#define SDU_FN_CARD_HOST_ERR_WKUP_EN_CMD52_RD_ERR_WKUP_EN_MASK (0x2U)\r\n#define SDU_FN_CARD_HOST_ERR_WKUP_EN_CMD52_RD_ERR_WKUP_EN_SHIFT (1U)\r\n/*! CMD52_RD_ERR_WKUP_EN - CMD52 Read Error Wakeup Enable If host issues CMD52 read access to any\r\n *    off-domain register during sleep mode, setting this bit will trigger wakeup event to the APU.\r\n */\r\n#define SDU_FN_CARD_HOST_ERR_WKUP_EN_CMD52_RD_ERR_WKUP_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_ERR_WKUP_EN_CMD52_RD_ERR_WKUP_EN_SHIFT)) & SDU_FN_CARD_HOST_ERR_WKUP_EN_CMD52_RD_ERR_WKUP_EN_MASK)\r\n\r\n#define SDU_FN_CARD_HOST_ERR_WKUP_EN_CMD53_WR_ERR_WKUP_EN_MASK (0x4U)\r\n#define SDU_FN_CARD_HOST_ERR_WKUP_EN_CMD53_WR_ERR_WKUP_EN_SHIFT (2U)\r\n/*! CMD53_WR_ERR_WKUP_EN - CMD53 Write Error Wakeup Enable If host issues CMD53 write access during\r\n *    sleep mode, setting this bit will trigger wakeup event to the APU.\r\n */\r\n#define SDU_FN_CARD_HOST_ERR_WKUP_EN_CMD53_WR_ERR_WKUP_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_ERR_WKUP_EN_CMD53_WR_ERR_WKUP_EN_SHIFT)) & SDU_FN_CARD_HOST_ERR_WKUP_EN_CMD53_WR_ERR_WKUP_EN_MASK)\r\n\r\n#define SDU_FN_CARD_HOST_ERR_WKUP_EN_CMD53_RD_ERR_WKUP_EN_MASK (0x8U)\r\n#define SDU_FN_CARD_HOST_ERR_WKUP_EN_CMD53_RD_ERR_WKUP_EN_SHIFT (3U)\r\n/*! CMD53_RD_ERR_WKUP_EN - CMD53 Read Error Wakeup Enable If host issues CMD53 read access during\r\n *    sleep mode, setting this bit will trigger wakeup event to the APU.\r\n */\r\n#define SDU_FN_CARD_HOST_ERR_WKUP_EN_CMD53_RD_ERR_WKUP_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_ERR_WKUP_EN_CMD53_RD_ERR_WKUP_EN_SHIFT)) & SDU_FN_CARD_HOST_ERR_WKUP_EN_CMD53_RD_ERR_WKUP_EN_MASK)\r\n\r\n#define SDU_FN_CARD_HOST_ERR_WKUP_EN_TESTBUS_BIT_SEL_EN_MASK (0x30U)\r\n#define SDU_FN_CARD_HOST_ERR_WKUP_EN_TESTBUS_BIT_SEL_EN_SHIFT (4U)\r\n/*! TESTBUS_BIT_SEL_EN - If bit 0 is 1, testbus_lo bits are individually selected by TESTBUS_BIT_SEL0 and TESTBUS_BIT_SEL1. */\r\n#define SDU_FN_CARD_HOST_ERR_WKUP_EN_TESTBUS_BIT_SEL_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_ERR_WKUP_EN_TESTBUS_BIT_SEL_EN_SHIFT)) & SDU_FN_CARD_HOST_ERR_WKUP_EN_TESTBUS_BIT_SEL_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_ERR_CMD0 - Host Error Command 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_ERR_CMD0_HOST_ERR_CMD0_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_ERR_CMD0_HOST_ERR_CMD0_SHIFT (0U)\r\n/*! HOST_ERR_CMD0 - Host Error Command[7:0] Capture 48-bit content of either CMD52 or CMD53\r\n *    depending on one of the four error conditions in CARD_INTSTATUS1[7:4].\r\n */\r\n#define SDU_FN_CARD_HOST_ERR_CMD0_HOST_ERR_CMD0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_ERR_CMD0_HOST_ERR_CMD0_SHIFT)) & SDU_FN_CARD_HOST_ERR_CMD0_HOST_ERR_CMD0_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_ERR_CMD1 - Host Error Command 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_ERR_CMD1_HOST_ERR_CMD1_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_ERR_CMD1_HOST_ERR_CMD1_SHIFT (0U)\r\n/*! HOST_ERR_CMD1 - Host Error Command[15:8] Capture 48-bit content of either CMD52 or CMD53\r\n *    depending on one of the four error conditions in CARD_INTSTATUS1[7:4].\r\n */\r\n#define SDU_FN_CARD_HOST_ERR_CMD1_HOST_ERR_CMD1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_ERR_CMD1_HOST_ERR_CMD1_SHIFT)) & SDU_FN_CARD_HOST_ERR_CMD1_HOST_ERR_CMD1_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_ERR_CMD2 - Host Error Command 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_ERR_CMD2_HOST_ERR_CMD2_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_ERR_CMD2_HOST_ERR_CMD2_SHIFT (0U)\r\n/*! HOST_ERR_CMD2 - Host Error Command[23:16] Capture 48-bit content of either CMD52 or CMD53\r\n *    depending on one of the four error conditions in CARD_INTSTATUS1[7:4].\r\n */\r\n#define SDU_FN_CARD_HOST_ERR_CMD2_HOST_ERR_CMD2(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_ERR_CMD2_HOST_ERR_CMD2_SHIFT)) & SDU_FN_CARD_HOST_ERR_CMD2_HOST_ERR_CMD2_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_ERR_CMD3 - Host Error Command 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_ERR_CMD3_HOST_ERR_CMD3_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_ERR_CMD3_HOST_ERR_CMD3_SHIFT (0U)\r\n/*! HOST_ERR_CMD3 - Host Error Command[31:24] Capture 48-bit content of either CMD52 or CMD53\r\n *    depending on one of the four error conditions in CARD_INTSTATUS1[7:4].\r\n */\r\n#define SDU_FN_CARD_HOST_ERR_CMD3_HOST_ERR_CMD3(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_ERR_CMD3_HOST_ERR_CMD3_SHIFT)) & SDU_FN_CARD_HOST_ERR_CMD3_HOST_ERR_CMD3_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_ERR_CMD4 - Host Error Command 4 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_ERR_CMD4_HOST_ERR_CMD4_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_ERR_CMD4_HOST_ERR_CMD4_SHIFT (0U)\r\n/*! HOST_ERR_CMD4 - Host Error Command[39:32] Capture 48-bit content of either CMD52 or CMD53\r\n *    depending on one of the four error conditions in CARD_INTSTATUS1[7:4].\r\n */\r\n#define SDU_FN_CARD_HOST_ERR_CMD4_HOST_ERR_CMD4(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_ERR_CMD4_HOST_ERR_CMD4_SHIFT)) & SDU_FN_CARD_HOST_ERR_CMD4_HOST_ERR_CMD4_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_ERR_CMD5 - Host Error Command 5 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_ERR_CMD5_HOST_ERR_CMD5_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_ERR_CMD5_HOST_ERR_CMD5_SHIFT (0U)\r\n/*! HOST_ERR_CMD5 - Host Error Command[47:40] Capture 48-bit content of either CMD52 or CMD53\r\n *    depending on one of the four error conditions in CARD_INTSTATUS1[7:4].\r\n */\r\n#define SDU_FN_CARD_HOST_ERR_CMD5_HOST_ERR_CMD5(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_ERR_CMD5_HOST_ERR_CMD5_SHIFT)) & SDU_FN_CARD_HOST_ERR_CMD5_HOST_ERR_CMD5_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_WR_BITMAP_CLR0 - Packet Write Bitmap Clear 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP_CLR0_PKT_WR_BITMAP_SW_CLR0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP_CLR0_PKT_WR_BITMAP_SW_CLR0_SHIFT (0U)\r\n/*! PKT_WR_BITMAP_SW_CLR0 - Setting 1 to each bit will clear the corresponding pkt_wr_bitmap bit. */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP_CLR0_PKT_WR_BITMAP_SW_CLR0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP_CLR0_PKT_WR_BITMAP_SW_CLR0_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP_CLR0_PKT_WR_BITMAP_SW_CLR0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_WR_BITMAP_CLR1 - Packet Write Bitmap Clear 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP_CLR1_PKT_WR_BITMAP_SW_CLR1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP_CLR1_PKT_WR_BITMAP_SW_CLR1_SHIFT (0U)\r\n/*! PKT_WR_BITMAP_SW_CLR1 - Setting 1 to each bit will clear the corresponding pkt_wr_bitmap bit. */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP_CLR1_PKT_WR_BITMAP_SW_CLR1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP_CLR1_PKT_WR_BITMAP_SW_CLR1_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP_CLR1_PKT_WR_BITMAP_SW_CLR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_WR_BITMAP_CLR2 - Packet Write Bitmap Clear 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP_CLR2_PKT_WR_BITMAP_SW_CLR2_MASK (0xFFU)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP_CLR2_PKT_WR_BITMAP_SW_CLR2_SHIFT (0U)\r\n/*! PKT_WR_BITMAP_SW_CLR2 - Setting 1 to each bit will clear the corresponding pkt_wr_bitmap bit. */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP_CLR2_PKT_WR_BITMAP_SW_CLR2(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP_CLR2_PKT_WR_BITMAP_SW_CLR2_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP_CLR2_PKT_WR_BITMAP_SW_CLR2_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_WR_BITMAP_CLR3 - Packet Write Bitmap Clear 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_WR_BITMAP_CLR3_PKT_WR_BITMAP_SW_CLR3_MASK (0xFFU)\r\n#define SDU_FN_CARD_PKT_WR_BITMAP_CLR3_PKT_WR_BITMAP_SW_CLR3_SHIFT (0U)\r\n/*! PKT_WR_BITMAP_SW_CLR3 - Setting 1 to each bit will clear the corresponding pkt_wr_bitmap bit. */\r\n#define SDU_FN_CARD_PKT_WR_BITMAP_CLR3_PKT_WR_BITMAP_SW_CLR3(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_WR_BITMAP_CLR3_PKT_WR_BITMAP_SW_CLR3_SHIFT)) & SDU_FN_CARD_PKT_WR_BITMAP_CLR3_PKT_WR_BITMAP_SW_CLR3_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_RD_BITMAP_CLR0 - Packet Read Bitmap Clear 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP_CLR0_PKT_RD_BITMAP_SW_CLR0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP_CLR0_PKT_RD_BITMAP_SW_CLR0_SHIFT (0U)\r\n/*! PKT_RD_BITMAP_SW_CLR0 - Setting 1 to each bit will clear the corresponding pkt_rd_bitmap bit. */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP_CLR0_PKT_RD_BITMAP_SW_CLR0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP_CLR0_PKT_RD_BITMAP_SW_CLR0_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP_CLR0_PKT_RD_BITMAP_SW_CLR0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_RD_BITMAP_CLR1 - Packet Read Bitmap Clear 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP_CLR1_PKT_RD_BITMAP_SW_CLR1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP_CLR1_PKT_RD_BITMAP_SW_CLR1_SHIFT (0U)\r\n/*! PKT_RD_BITMAP_SW_CLR1 - Setting 1 to each bit will clear the corresponding pkt_rd_bitmap bit. */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP_CLR1_PKT_RD_BITMAP_SW_CLR1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP_CLR1_PKT_RD_BITMAP_SW_CLR1_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP_CLR1_PKT_RD_BITMAP_SW_CLR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_RD_BITMAP_CLR2 - Packet Read Bitmap Clear 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP_CLR2_PKT_RD_BITMAP_SW_CLR2_MASK (0xFFU)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP_CLR2_PKT_RD_BITMAP_SW_CLR2_SHIFT (0U)\r\n/*! PKT_RD_BITMAP_SW_CLR2 - Setting 1 to each bit will clear the corresponding pkt_rd_bitmap bit. */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP_CLR2_PKT_RD_BITMAP_SW_CLR2(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP_CLR2_PKT_RD_BITMAP_SW_CLR2_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP_CLR2_PKT_RD_BITMAP_SW_CLR2_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_RD_BITMAP_CLR3 - Packet Read Bitmap Clear 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_RD_BITMAP_CLR3_PKT_RD_BITMAP_SW_CLR3_MASK (0xFFU)\r\n#define SDU_FN_CARD_PKT_RD_BITMAP_CLR3_PKT_RD_BITMAP_SW_CLR3_SHIFT (0U)\r\n/*! PKT_RD_BITMAP_SW_CLR3 - Setting 1 to each bit will clear the corresponding pkt_rd_bitmap bit. */\r\n#define SDU_FN_CARD_PKT_RD_BITMAP_CLR3_PKT_RD_BITMAP_SW_CLR3(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_RD_BITMAP_CLR3_PKT_RD_BITMAP_SW_CLR3_SHIFT)) & SDU_FN_CARD_PKT_RD_BITMAP_CLR3_PKT_RD_BITMAP_SW_CLR3_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_INT_ACT_MASK_EN0 - Host Interrupt Active Mask Enable 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_EN0_HOST_INT_ACT_MASK_EN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_EN0_HOST_INT_ACT_MASK_EN0_SHIFT (0U)\r\n/*! HOST_INT_ACT_MASK_EN0 - Enable host interrupt controller active mask [7:0] */\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_EN0_HOST_INT_ACT_MASK_EN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INT_ACT_MASK_EN0_HOST_INT_ACT_MASK_EN0_SHIFT)) & SDU_FN_CARD_HOST_INT_ACT_MASK_EN0_HOST_INT_ACT_MASK_EN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_INT_ACT_MASK_EN1 - Host Interrupt Active Mask Enable 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_EN1_HOST_INT_ACT_MASK_EN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_EN1_HOST_INT_ACT_MASK_EN1_SHIFT (0U)\r\n/*! HOST_INT_ACT_MASK_EN1 - Enable host interrupt controller active mask [15:8] */\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_EN1_HOST_INT_ACT_MASK_EN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INT_ACT_MASK_EN1_HOST_INT_ACT_MASK_EN1_SHIFT)) & SDU_FN_CARD_HOST_INT_ACT_MASK_EN1_HOST_INT_ACT_MASK_EN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_INT_ACT_MASK_EN2 - Host Interrupt Active Mask Enable 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_EN2_HOST_INT_ACT_MASK_EN2_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_EN2_HOST_INT_ACT_MASK_EN2_SHIFT (0U)\r\n/*! HOST_INT_ACT_MASK_EN2 - Enable host interrupt controller active mask [23:16] */\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_EN2_HOST_INT_ACT_MASK_EN2(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INT_ACT_MASK_EN2_HOST_INT_ACT_MASK_EN2_SHIFT)) & SDU_FN_CARD_HOST_INT_ACT_MASK_EN2_HOST_INT_ACT_MASK_EN2_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_INT_ACT_MASK_EN3 - Host Interrupt Active Mask Enable 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_EN3_HOST_INT_ACT_MASK_EN3_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_EN3_HOST_INT_ACT_MASK_EN3_SHIFT (0U)\r\n/*! HOST_INT_ACT_MASK_EN3 - Enable host interrupt controller active mask [31:24] */\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_EN3_HOST_INT_ACT_MASK_EN3(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INT_ACT_MASK_EN3_HOST_INT_ACT_MASK_EN3_SHIFT)) & SDU_FN_CARD_HOST_INT_ACT_MASK_EN3_HOST_INT_ACT_MASK_EN3_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_INT_ACT_MASK_CLR0 - Host Interrupt Active Mask Clear 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_CLR0_HOST_INT_ACT_MASK_CLR0_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_CLR0_HOST_INT_ACT_MASK_CLR0_SHIFT (0U)\r\n/*! HOST_INT_ACT_MASK_CLR0 - Host interrupt active mask write-1-to-clear Setting 1 to each bit will\r\n *    clear the corresponding host interrupt active mask bit.\r\n */\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_CLR0_HOST_INT_ACT_MASK_CLR0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INT_ACT_MASK_CLR0_HOST_INT_ACT_MASK_CLR0_SHIFT)) & SDU_FN_CARD_HOST_INT_ACT_MASK_CLR0_HOST_INT_ACT_MASK_CLR0_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_INT_ACT_MASK_CLR1 - Host Interrupt Active Mask Clear 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_CLR1_HOST_INT_ACT_MASK_CLR1_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_CLR1_HOST_INT_ACT_MASK_CLR1_SHIFT (0U)\r\n/*! HOST_INT_ACT_MASK_CLR1 - Host interrupt active mask write-1-to-clear Setting 1 to each bit will\r\n *    clear the corresponding host interrupt active mask bit.\r\n */\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_CLR1_HOST_INT_ACT_MASK_CLR1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INT_ACT_MASK_CLR1_HOST_INT_ACT_MASK_CLR1_SHIFT)) & SDU_FN_CARD_HOST_INT_ACT_MASK_CLR1_HOST_INT_ACT_MASK_CLR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_INT_ACT_MASK_CLR2 - Host Interrupt Active Mask Clear 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_CLR2_HOST_INT_ACT_MASK_CLR2_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_CLR2_HOST_INT_ACT_MASK_CLR2_SHIFT (0U)\r\n/*! HOST_INT_ACT_MASK_CLR2 - Host interrupt active mask write-1-to-clear Setting 1 to each bit will\r\n *    clear the corresponding host interrupt active mask bit.\r\n */\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_CLR2_HOST_INT_ACT_MASK_CLR2(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INT_ACT_MASK_CLR2_HOST_INT_ACT_MASK_CLR2_SHIFT)) & SDU_FN_CARD_HOST_INT_ACT_MASK_CLR2_HOST_INT_ACT_MASK_CLR2_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_INT_ACT_MASK_CLR3 - Host Interrupt Active Mask Clear 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_CLR3_HOST_INT_ACT_MASK_CLR3_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_CLR3_HOST_INT_ACT_MASK_CLR3_SHIFT (0U)\r\n/*! HOST_INT_ACT_MASK_CLR3 - Host interrupt active mask write-1-to-clear Setting 1 to each bit will\r\n *    clear the corresponding host interrupt active mask bit.\r\n */\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_CLR3_HOST_INT_ACT_MASK_CLR3(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INT_ACT_MASK_CLR3_HOST_INT_ACT_MASK_CLR3_SHIFT)) & SDU_FN_CARD_HOST_INT_ACT_MASK_CLR3_HOST_INT_ACT_MASK_CLR3_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_INT_ACT_MASK_STATUS0 - Host Interrupt Active Mask Status 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_STATUS0_HOST_INT_ACT_MASK_STATUS0_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_STATUS0_HOST_INT_ACT_MASK_STATUS0_SHIFT (0U)\r\n/*! HOST_INT_ACT_MASK_STATUS0 - Host interrupt active mask status */\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_STATUS0_HOST_INT_ACT_MASK_STATUS0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INT_ACT_MASK_STATUS0_HOST_INT_ACT_MASK_STATUS0_SHIFT)) & SDU_FN_CARD_HOST_INT_ACT_MASK_STATUS0_HOST_INT_ACT_MASK_STATUS0_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_INT_ACT_MASK_STATUS1 - Host Interrupt Active Mask Status 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_STATUS1_HOST_INT_ACT_MASK_STATUS1_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_STATUS1_HOST_INT_ACT_MASK_STATUS1_SHIFT (0U)\r\n/*! HOST_INT_ACT_MASK_STATUS1 - Host interrupt active mask status */\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_STATUS1_HOST_INT_ACT_MASK_STATUS1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INT_ACT_MASK_STATUS1_HOST_INT_ACT_MASK_STATUS1_SHIFT)) & SDU_FN_CARD_HOST_INT_ACT_MASK_STATUS1_HOST_INT_ACT_MASK_STATUS1_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_INT_ACT_MASK_STATUS2 - Host Interrupt Active Mask Status 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_STATUS2_HOST_INT_ACT_MASK_STATUS2_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_STATUS2_HOST_INT_ACT_MASK_STATUS2_SHIFT (0U)\r\n/*! HOST_INT_ACT_MASK_STATUS2 - Host interrupt active mask status */\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_STATUS2_HOST_INT_ACT_MASK_STATUS2(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INT_ACT_MASK_STATUS2_HOST_INT_ACT_MASK_STATUS2_SHIFT)) & SDU_FN_CARD_HOST_INT_ACT_MASK_STATUS2_HOST_INT_ACT_MASK_STATUS2_MASK)\r\n/*! @} */\r\n\r\n/*! @name HOST_INT_ACT_MASK_STATUS3 - Host Interrupt Active Mask Status 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_STATUS3_HOST_INT_ACT_MASK_STATUS3_MASK (0xFFU)\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_STATUS3_HOST_INT_ACT_MASK_STATUS3_SHIFT (0U)\r\n/*! HOST_INT_ACT_MASK_STATUS3 - Host interrupt active mask status */\r\n#define SDU_FN_CARD_HOST_INT_ACT_MASK_STATUS3_HOST_INT_ACT_MASK_STATUS3(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_HOST_INT_ACT_MASK_STATUS3_HOST_INT_ACT_MASK_STATUS3_SHIFT)) & SDU_FN_CARD_HOST_INT_ACT_MASK_STATUS3_HOST_INT_ACT_MASK_STATUS3_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INT_ACT_MASK_EN0 - Card Interrupt Active Mask Enable 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_EN0_CARD_INT_ACT_MASK_EN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_EN0_CARD_INT_ACT_MASK_EN0_SHIFT (0U)\r\n/*! CARD_INT_ACT_MASK_EN0 - Enable card interrupt controller active mask [7:0] */\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_EN0_CARD_INT_ACT_MASK_EN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INT_ACT_MASK_EN0_CARD_INT_ACT_MASK_EN0_SHIFT)) & SDU_FN_CARD_CARD_INT_ACT_MASK_EN0_CARD_INT_ACT_MASK_EN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INT_ACT_MASK_EN1 - Card Interrupt Active Mask Enable 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_EN1_CARD_INT_ACT_MASK_EN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_EN1_CARD_INT_ACT_MASK_EN1_SHIFT (0U)\r\n/*! CARD_INT_ACT_MASK_EN1 - Enable card interrupt controller active mask [15:8] */\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_EN1_CARD_INT_ACT_MASK_EN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INT_ACT_MASK_EN1_CARD_INT_ACT_MASK_EN1_SHIFT)) & SDU_FN_CARD_CARD_INT_ACT_MASK_EN1_CARD_INT_ACT_MASK_EN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INT_ACT_MASK_EN2 - Card Interrupt Active Mask Enable 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_EN2_CARD_INT_ACT_MASK_EN2_MASK (0xFFU)\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_EN2_CARD_INT_ACT_MASK_EN2_SHIFT (0U)\r\n/*! CARD_INT_ACT_MASK_EN2 - Enable card interrupt controller active mask [23:16] */\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_EN2_CARD_INT_ACT_MASK_EN2(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INT_ACT_MASK_EN2_CARD_INT_ACT_MASK_EN2_SHIFT)) & SDU_FN_CARD_CARD_INT_ACT_MASK_EN2_CARD_INT_ACT_MASK_EN2_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INT_ACT_MASK_EN3 - Card Interrupt Active Mask Enable 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_EN3_CARD_INT_ACT_MASK_EN3_MASK (0xFFU)\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_EN3_CARD_INT_ACT_MASK_EN3_SHIFT (0U)\r\n/*! CARD_INT_ACT_MASK_EN3 - Enable card interrupt controller active mask [31:24] */\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_EN3_CARD_INT_ACT_MASK_EN3(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INT_ACT_MASK_EN3_CARD_INT_ACT_MASK_EN3_SHIFT)) & SDU_FN_CARD_CARD_INT_ACT_MASK_EN3_CARD_INT_ACT_MASK_EN3_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INT_ACT_MASK_CLR0 - Card Interrupt Active Mask Clear 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_CLR0_CARD_INT_ACT_MASK_CLR0_MASK (0xFFU)\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_CLR0_CARD_INT_ACT_MASK_CLR0_SHIFT (0U)\r\n/*! CARD_INT_ACT_MASK_CLR0 - Card interrupt active mask write-1-to-clear Setting 1 to each bit will\r\n *    clear the corresponding card interrupt active mask bit.\r\n */\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_CLR0_CARD_INT_ACT_MASK_CLR0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INT_ACT_MASK_CLR0_CARD_INT_ACT_MASK_CLR0_SHIFT)) & SDU_FN_CARD_CARD_INT_ACT_MASK_CLR0_CARD_INT_ACT_MASK_CLR0_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INT_ACT_MASK_CLR1 - Card Interrupt Active Mask Clear 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_CLR1_CARD_INT_ACT_MASK_CLR1_MASK (0xFFU)\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_CLR1_CARD_INT_ACT_MASK_CLR1_SHIFT (0U)\r\n/*! CARD_INT_ACT_MASK_CLR1 - Card interrupt active mask write-1-to-clear Setting 1 to each bit will\r\n *    clear the corresponding card interrupt active mask bit.\r\n */\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_CLR1_CARD_INT_ACT_MASK_CLR1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INT_ACT_MASK_CLR1_CARD_INT_ACT_MASK_CLR1_SHIFT)) & SDU_FN_CARD_CARD_INT_ACT_MASK_CLR1_CARD_INT_ACT_MASK_CLR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INT_ACT_MASK_CLR2 - Card Interrupt Active Mask Clear 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_CLR2_CARD_INT_ACT_MASK_CLR2_MASK (0xFFU)\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_CLR2_CARD_INT_ACT_MASK_CLR2_SHIFT (0U)\r\n/*! CARD_INT_ACT_MASK_CLR2 - Card interrupt active mask write-1-to-clear Setting 1 to each bit will\r\n *    clear the corresponding card interrupt active mask bit.\r\n */\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_CLR2_CARD_INT_ACT_MASK_CLR2(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INT_ACT_MASK_CLR2_CARD_INT_ACT_MASK_CLR2_SHIFT)) & SDU_FN_CARD_CARD_INT_ACT_MASK_CLR2_CARD_INT_ACT_MASK_CLR2_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INT_ACT_MASK_CLR3 - Card Interrupt Active Mask Clear 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_CLR3_CARD_INT_ACT_MASK_CLR3_MASK (0xFFU)\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_CLR3_CARD_INT_ACT_MASK_CLR3_SHIFT (0U)\r\n/*! CARD_INT_ACT_MASK_CLR3 - Card interrupt active mask write-1-to-clear Setting 1 to each bit will\r\n *    clear the corresponding card interrupt active mask bit.\r\n */\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_CLR3_CARD_INT_ACT_MASK_CLR3(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INT_ACT_MASK_CLR3_CARD_INT_ACT_MASK_CLR3_SHIFT)) & SDU_FN_CARD_CARD_INT_ACT_MASK_CLR3_CARD_INT_ACT_MASK_CLR3_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INT_ACT_MASK_STATUS0 - Card Interrupt Active Mask Status 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_STATUS0_CARD_INT_ACT_MASK_STATUS0_MASK (0xFFU)\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_STATUS0_CARD_INT_ACT_MASK_STATUS0_SHIFT (0U)\r\n/*! CARD_INT_ACT_MASK_STATUS0 - Card interrupt active mask status */\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_STATUS0_CARD_INT_ACT_MASK_STATUS0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INT_ACT_MASK_STATUS0_CARD_INT_ACT_MASK_STATUS0_SHIFT)) & SDU_FN_CARD_CARD_INT_ACT_MASK_STATUS0_CARD_INT_ACT_MASK_STATUS0_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INT_ACT_MASK_STATUS1 - Card Interrupt Active Mask Status 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_STATUS1_CARD_INT_ACT_MASK_STATUS1_MASK (0xFFU)\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_STATUS1_CARD_INT_ACT_MASK_STATUS1_SHIFT (0U)\r\n/*! CARD_INT_ACT_MASK_STATUS1 - Card interrupt active mask status */\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_STATUS1_CARD_INT_ACT_MASK_STATUS1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INT_ACT_MASK_STATUS1_CARD_INT_ACT_MASK_STATUS1_SHIFT)) & SDU_FN_CARD_CARD_INT_ACT_MASK_STATUS1_CARD_INT_ACT_MASK_STATUS1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INT_ACT_MASK_STATUS2 - Card Interrupt Active Mask Status 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_STATUS2_CARD_INT_ACT_MASK_STATUS2_MASK (0xFFU)\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_STATUS2_CARD_INT_ACT_MASK_STATUS2_SHIFT (0U)\r\n/*! CARD_INT_ACT_MASK_STATUS2 - Card interrupt active mask status */\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_STATUS2_CARD_INT_ACT_MASK_STATUS2(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INT_ACT_MASK_STATUS2_CARD_INT_ACT_MASK_STATUS2_SHIFT)) & SDU_FN_CARD_CARD_INT_ACT_MASK_STATUS2_CARD_INT_ACT_MASK_STATUS2_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_INT_ACT_MASK_STATUS3 - Card Interrupt Active Mask Status 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_STATUS3_CARD_INT_ACT_MASK_STATUS3_MASK (0xFFU)\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_STATUS3_CARD_INT_ACT_MASK_STATUS3_SHIFT (0U)\r\n/*! CARD_INT_ACT_MASK_STATUS3 - Card interrupt active mask status */\r\n#define SDU_FN_CARD_CARD_INT_ACT_MASK_STATUS3_CARD_INT_ACT_MASK_STATUS3(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_INT_ACT_MASK_STATUS3_CARD_INT_ACT_MASK_STATUS3_SHIFT)) & SDU_FN_CARD_CARD_INT_ACT_MASK_STATUS3_CARD_INT_ACT_MASK_STATUS3_MASK)\r\n/*! @} */\r\n\r\n/*! @name CMD_PORT_WR_BASE_0 - Command Port SQ Write Base Address 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CMD_PORT_WR_BASE_0_CMD_SQ_WRITE_ADDR0_MASK (0xFFU)\r\n#define SDU_FN_CARD_CMD_PORT_WR_BASE_0_CMD_SQ_WRITE_ADDR0_SHIFT (0U)\r\n/*! CMD_SQ_WRITE_ADDR0 - Command Port SQ Write base address bit [7:0]. */\r\n#define SDU_FN_CARD_CMD_PORT_WR_BASE_0_CMD_SQ_WRITE_ADDR0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CMD_PORT_WR_BASE_0_CMD_SQ_WRITE_ADDR0_SHIFT)) & SDU_FN_CARD_CMD_PORT_WR_BASE_0_CMD_SQ_WRITE_ADDR0_MASK)\r\n/*! @} */\r\n\r\n/*! @name CMD_PORT_WR_BASE_1 - Command Port SQ Write Base Address 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CMD_PORT_WR_BASE_1_CMD_SQ_WRITE_ADDR1_MASK (0xFFU)\r\n#define SDU_FN_CARD_CMD_PORT_WR_BASE_1_CMD_SQ_WRITE_ADDR1_SHIFT (0U)\r\n/*! CMD_SQ_WRITE_ADDR1 - Command Port SQ Write base address bit [15:8]. */\r\n#define SDU_FN_CARD_CMD_PORT_WR_BASE_1_CMD_SQ_WRITE_ADDR1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CMD_PORT_WR_BASE_1_CMD_SQ_WRITE_ADDR1_SHIFT)) & SDU_FN_CARD_CMD_PORT_WR_BASE_1_CMD_SQ_WRITE_ADDR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CMD_PORT_WR_BASE_2 - Command Port SQ Write Base Address 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CMD_PORT_WR_BASE_2_CMD_SQ_WRITE_ADDR2_MASK (0xFFU)\r\n#define SDU_FN_CARD_CMD_PORT_WR_BASE_2_CMD_SQ_WRITE_ADDR2_SHIFT (0U)\r\n/*! CMD_SQ_WRITE_ADDR2 - Command Port SQ Write base address bit [23:16]. */\r\n#define SDU_FN_CARD_CMD_PORT_WR_BASE_2_CMD_SQ_WRITE_ADDR2(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CMD_PORT_WR_BASE_2_CMD_SQ_WRITE_ADDR2_SHIFT)) & SDU_FN_CARD_CMD_PORT_WR_BASE_2_CMD_SQ_WRITE_ADDR2_MASK)\r\n/*! @} */\r\n\r\n/*! @name CMD_PORT_WR_BASE_3 - Command Port SQ Write Base Address 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CMD_PORT_WR_BASE_3_CMD_SQ_WRITE_ADDR3_MASK (0xFFU)\r\n#define SDU_FN_CARD_CMD_PORT_WR_BASE_3_CMD_SQ_WRITE_ADDR3_SHIFT (0U)\r\n/*! CMD_SQ_WRITE_ADDR3 - Command Port SQ Write base address bit [31:24]. */\r\n#define SDU_FN_CARD_CMD_PORT_WR_BASE_3_CMD_SQ_WRITE_ADDR3(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CMD_PORT_WR_BASE_3_CMD_SQ_WRITE_ADDR3_SHIFT)) & SDU_FN_CARD_CMD_PORT_WR_BASE_3_CMD_SQ_WRITE_ADDR3_MASK)\r\n/*! @} */\r\n\r\n/*! @name CMD_PORT_RD_BASE_0 - Command Port SQ Read Base Address 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CMD_PORT_RD_BASE_0_CMD_SQ_READ_ADDR0_MASK (0xFFU)\r\n#define SDU_FN_CARD_CMD_PORT_RD_BASE_0_CMD_SQ_READ_ADDR0_SHIFT (0U)\r\n/*! CMD_SQ_READ_ADDR0 - Command Port SQ Read base address bit [7:0]. */\r\n#define SDU_FN_CARD_CMD_PORT_RD_BASE_0_CMD_SQ_READ_ADDR0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CMD_PORT_RD_BASE_0_CMD_SQ_READ_ADDR0_SHIFT)) & SDU_FN_CARD_CMD_PORT_RD_BASE_0_CMD_SQ_READ_ADDR0_MASK)\r\n/*! @} */\r\n\r\n/*! @name CMD_PORT_RD_BASE_1 - Command Port SQ Read Base Address 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CMD_PORT_RD_BASE_1_CMD_SQ_READ_ADDR1_MASK (0xFFU)\r\n#define SDU_FN_CARD_CMD_PORT_RD_BASE_1_CMD_SQ_READ_ADDR1_SHIFT (0U)\r\n/*! CMD_SQ_READ_ADDR1 - Command Port SQ Read base address bit [15:8]. */\r\n#define SDU_FN_CARD_CMD_PORT_RD_BASE_1_CMD_SQ_READ_ADDR1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CMD_PORT_RD_BASE_1_CMD_SQ_READ_ADDR1_SHIFT)) & SDU_FN_CARD_CMD_PORT_RD_BASE_1_CMD_SQ_READ_ADDR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CMD_PORT_RD_BASE_2 - Command Port SQ Read Base Address 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CMD_PORT_RD_BASE_2_CMD_SQ_READ_ADDR2_MASK (0xFFU)\r\n#define SDU_FN_CARD_CMD_PORT_RD_BASE_2_CMD_SQ_READ_ADDR2_SHIFT (0U)\r\n/*! CMD_SQ_READ_ADDR2 - Command Port SQ Read base address bit [23:16]. */\r\n#define SDU_FN_CARD_CMD_PORT_RD_BASE_2_CMD_SQ_READ_ADDR2(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CMD_PORT_RD_BASE_2_CMD_SQ_READ_ADDR2_SHIFT)) & SDU_FN_CARD_CMD_PORT_RD_BASE_2_CMD_SQ_READ_ADDR2_MASK)\r\n/*! @} */\r\n\r\n/*! @name CMD_PORT_RD_BASE_3 - Command Port SQ Read Base Address 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CMD_PORT_RD_BASE_3_CMD_SQ_READ_ADDR3_MASK (0xFFU)\r\n#define SDU_FN_CARD_CMD_PORT_RD_BASE_3_CMD_SQ_READ_ADDR3_SHIFT (0U)\r\n/*! CMD_SQ_READ_ADDR3 - Command Port SQ Read base address bit [31:24]. */\r\n#define SDU_FN_CARD_CMD_PORT_RD_BASE_3_CMD_SQ_READ_ADDR3(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CMD_PORT_RD_BASE_3_CMD_SQ_READ_ADDR3_SHIFT)) & SDU_FN_CARD_CMD_PORT_RD_BASE_3_CMD_SQ_READ_ADDR3_MASK)\r\n/*! @} */\r\n\r\n/*! @name CMD_PORT_RD_LEN_0 - Command Port Read Length 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CMD_PORT_RD_LEN_0_CMD_PORT_RD_LEN0_MASK (0xFFU)\r\n#define SDU_FN_CARD_CMD_PORT_RD_LEN_0_CMD_PORT_RD_LEN0_SHIFT (0U)\r\n/*! CMD_PORT_RD_LEN0 - Command Port Read Length [7:0] */\r\n#define SDU_FN_CARD_CMD_PORT_RD_LEN_0_CMD_PORT_RD_LEN0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CMD_PORT_RD_LEN_0_CMD_PORT_RD_LEN0_SHIFT)) & SDU_FN_CARD_CMD_PORT_RD_LEN_0_CMD_PORT_RD_LEN0_MASK)\r\n/*! @} */\r\n\r\n/*! @name CMD_PORT_RD_LEN_1 - Command Port Read Length 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CMD_PORT_RD_LEN_1_CMD_PORT_RD_LEN1_MASK (0xFFU)\r\n#define SDU_FN_CARD_CMD_PORT_RD_LEN_1_CMD_PORT_RD_LEN1_SHIFT (0U)\r\n/*! CMD_PORT_RD_LEN1 - Command Port Read Length [15:8] */\r\n#define SDU_FN_CARD_CMD_PORT_RD_LEN_1_CMD_PORT_RD_LEN1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CMD_PORT_RD_LEN_1_CMD_PORT_RD_LEN1_SHIFT)) & SDU_FN_CARD_CMD_PORT_RD_LEN_1_CMD_PORT_RD_LEN1_MASK)\r\n/*! @} */\r\n\r\n/*! @name CMD_PORT_CONFIG_0 - Command Port Config 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_0_CMD_PORT_TX_LEN_FORMAT_MASK (0x3U)\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_0_CMD_PORT_TX_LEN_FORMAT_SHIFT (0U)\r\n/*! CMD_PORT_TX_LEN_FORMAT - Define the cmd53 command port tx length (tx_len) header format attached\r\n *    in the beginning of data payload: 0 = no tx_len header info.\r\n */\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_0_CMD_PORT_TX_LEN_FORMAT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CMD_PORT_CONFIG_0_CMD_PORT_TX_LEN_FORMAT_SHIFT)) & SDU_FN_CARD_CMD_PORT_CONFIG_0_CMD_PORT_TX_LEN_FORMAT_MASK)\r\n\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_0_CMD_PORT_RD_LEN_EN_MASK (0x4U)\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_0_CMD_PORT_RD_LEN_EN_SHIFT (2U)\r\n/*! CMD_PORT_RD_LEN_EN - cmd_port_rd_len_en */\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_0_CMD_PORT_RD_LEN_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CMD_PORT_CONFIG_0_CMD_PORT_RD_LEN_EN_SHIFT)) & SDU_FN_CARD_CMD_PORT_CONFIG_0_CMD_PORT_RD_LEN_EN_MASK)\r\n\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_0_CMD_PORT_UPLD_AUTO_RESET_MASK (0x10U)\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_0_CMD_PORT_UPLD_AUTO_RESET_SHIFT (4U)\r\n/*! CMD_PORT_UPLD_AUTO_RESET - Reset control for cmd_port_upld_card_rdy event in C2H_INTEVENT 0 =\r\n *    upload ready event is reset to 0 after the current cmd53 is completed.\r\n */\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_0_CMD_PORT_UPLD_AUTO_RESET(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CMD_PORT_CONFIG_0_CMD_PORT_UPLD_AUTO_RESET_SHIFT)) & SDU_FN_CARD_CMD_PORT_CONFIG_0_CMD_PORT_UPLD_AUTO_RESET_MASK)\r\n\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_0_CMD_PORT_DNLD_AUTO_RESET_MASK (0x20U)\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_0_CMD_PORT_DNLD_AUTO_RESET_SHIFT (5U)\r\n/*! CMD_PORT_DNLD_AUTO_RESET - Reset control for cmd_port_dnld_card_rdy event in C2H_INTEVENT 0 =\r\n *    download ready event is reset to 0 after the current cmd53 is completed.\r\n */\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_0_CMD_PORT_DNLD_AUTO_RESET(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CMD_PORT_CONFIG_0_CMD_PORT_DNLD_AUTO_RESET_SHIFT)) & SDU_FN_CARD_CMD_PORT_CONFIG_0_CMD_PORT_DNLD_AUTO_RESET_MASK)\r\n\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_0_EXPLICIT_CMD_PORT_UPLD_OVER_MASK (0x40U)\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_0_EXPLICIT_CMD_PORT_UPLD_OVER_SHIFT (6U)\r\n/*! EXPLICIT_CMD_PORT_UPLD_OVER - Explicit Upload Update 0 = bitmap update is done on completion of\r\n *    CMD53 read 1 = bitmap update is done when host clears upload\r\n */\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_0_EXPLICIT_CMD_PORT_UPLD_OVER(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CMD_PORT_CONFIG_0_EXPLICIT_CMD_PORT_UPLD_OVER_SHIFT)) & SDU_FN_CARD_CMD_PORT_CONFIG_0_EXPLICIT_CMD_PORT_UPLD_OVER_MASK)\r\n\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_0_EXPLICIT_CMD_PORT_DNLD_OVER_MASK (0x80U)\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_0_EXPLICIT_CMD_PORT_DNLD_OVER_SHIFT (7U)\r\n/*! EXPLICIT_CMD_PORT_DNLD_OVER - Explicit Download Over 0 = download over is generated on\r\n *    completion of CMD53 write 1 = download over is generated when host clears download ready interrupt\r\n */\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_0_EXPLICIT_CMD_PORT_DNLD_OVER(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CMD_PORT_CONFIG_0_EXPLICIT_CMD_PORT_DNLD_OVER_SHIFT)) & SDU_FN_CARD_CMD_PORT_CONFIG_0_EXPLICIT_CMD_PORT_DNLD_OVER_MASK)\r\n/*! @} */\r\n\r\n/*! @name CMD_PORT_CONFIG_1 - Command Port Config 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_1_CMD_PORT_AUTO_ENABLE_MASK (0x1U)\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_1_CMD_PORT_AUTO_ENABLE_SHIFT (0U)\r\n/*! CMD_PORT_AUTO_ENABLE - If this is enabled, download and upload ready host interrupt is\r\n *    automatically cleared and re-enabled after the current cmd53 is completed.\r\n */\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_1_CMD_PORT_AUTO_ENABLE(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CMD_PORT_CONFIG_1_CMD_PORT_AUTO_ENABLE_SHIFT)) & SDU_FN_CARD_CMD_PORT_CONFIG_1_CMD_PORT_AUTO_ENABLE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CMD_PORT_CONFIG_2 - Command Port Config 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_2_RSVD_MASK  (0xFFU)\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_2_RSVD_SHIFT (0U)\r\n/*! RSVD - Reserved */\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_2_RSVD(x)    (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CMD_PORT_CONFIG_2_RSVD_SHIFT)) & SDU_FN_CARD_CMD_PORT_CONFIG_2_RSVD_MASK)\r\n/*! @} */\r\n\r\n/*! @name CMD_PORT_CONFIG_3 - Command Port Config 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_3_RSVD_MASK  (0xFFU)\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_3_RSVD_SHIFT (0U)\r\n/*! RSVD - Reserved */\r\n#define SDU_FN_CARD_CMD_PORT_CONFIG_3_RSVD(x)    (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CMD_PORT_CONFIG_3_RSVD_SHIFT)) & SDU_FN_CARD_CMD_PORT_CONFIG_3_RSVD_MASK)\r\n/*! @} */\r\n\r\n/*! @name CHIP_REV - Chip Revision */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CHIP_REV_CHIP_REV_MASK       (0xFFU)\r\n#define SDU_FN_CARD_CHIP_REV_CHIP_REV_SHIFT      (0U)\r\n/*! CHIP_REV - Chip Revision (same as CIU) */\r\n#define SDU_FN_CARD_CHIP_REV_CHIP_REV(x)         (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CHIP_REV_CHIP_REV_SHIFT)) & SDU_FN_CARD_CHIP_REV_CHIP_REV_MASK)\r\n/*! @} */\r\n\r\n/*! @name IP_REV0 - SDU Minor IP Revision */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_IP_REV0_SDU_MINOR_IP_REV_MASK (0xFFU)\r\n#define SDU_FN_CARD_IP_REV0_SDU_MINOR_IP_REV_SHIFT (0U)\r\n/*! SDU_MINOR_IP_REV - SDU minor IP revision */\r\n#define SDU_FN_CARD_IP_REV0_SDU_MINOR_IP_REV(x)  (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_IP_REV0_SDU_MINOR_IP_REV_SHIFT)) & SDU_FN_CARD_IP_REV0_SDU_MINOR_IP_REV_MASK)\r\n/*! @} */\r\n\r\n/*! @name IP_REV1 - SDU Major IP Revision */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_IP_REV1_SDU_MAJOR_IP_REV_MASK (0xFFU)\r\n#define SDU_FN_CARD_IP_REV1_SDU_MAJOR_IP_REV_SHIFT (0U)\r\n/*! SDU_MAJOR_IP_REV - SDU major IP revision */\r\n#define SDU_FN_CARD_IP_REV1_SDU_MAJOR_IP_REV(x)  (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_IP_REV1_SDU_MAJOR_IP_REV_SHIFT)) & SDU_FN_CARD_IP_REV1_SDU_MAJOR_IP_REV_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_END_RADDR0 - PKT_END_RADDR0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_END_RADDR0_PACKET_END_RADDR0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PKT_END_RADDR0_PACKET_END_RADDR0_SHIFT (0U)\r\n/*! PACKET_END_RADDR0 - For function 1, this is used as CMD53 DMA read packet end addr [7:0] For other functions, this is a scratch pad register */\r\n#define SDU_FN_CARD_PKT_END_RADDR0_PACKET_END_RADDR0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_END_RADDR0_PACKET_END_RADDR0_SHIFT)) & SDU_FN_CARD_PKT_END_RADDR0_PACKET_END_RADDR0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_END_RADDR1 - PKT_END_RADDR1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_END_RADDR1_PACKET_END_RADDR1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PKT_END_RADDR1_PACKET_END_RADDR1_SHIFT (0U)\r\n/*! PACKET_END_RADDR1 - For function 1, this is used as CMD53 DMA read packet end addr [15:8] For\r\n *    other functions, this is a scratch pad register\r\n */\r\n#define SDU_FN_CARD_PKT_END_RADDR1_PACKET_END_RADDR1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_END_RADDR1_PACKET_END_RADDR1_SHIFT)) & SDU_FN_CARD_PKT_END_RADDR1_PACKET_END_RADDR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_END_RADDR2 - PKT_END_RADDR2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_END_RADDR2_PACKET_END_RADDR2_MASK (0xFFU)\r\n#define SDU_FN_CARD_PKT_END_RADDR2_PACKET_END_RADDR2_SHIFT (0U)\r\n/*! PACKET_END_RADDR2 - For function 1, this is used as CMD53 DMA read packet end addr [23:16] For\r\n *    other functions, this is a scratch pad register\r\n */\r\n#define SDU_FN_CARD_PKT_END_RADDR2_PACKET_END_RADDR2(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_END_RADDR2_PACKET_END_RADDR2_SHIFT)) & SDU_FN_CARD_PKT_END_RADDR2_PACKET_END_RADDR2_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_END_RADDR3 - PKT_END_RADDR3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_END_RADDR3_PACKET_END_RADDR3_MASK (0xFFU)\r\n#define SDU_FN_CARD_PKT_END_RADDR3_PACKET_END_RADDR3_SHIFT (0U)\r\n/*! PACKET_END_RADDR3 - For function 1, this is used as CMD53 DMA read packet end addr [31:24] For\r\n *    other functions, this is a scratch pad register\r\n */\r\n#define SDU_FN_CARD_PKT_END_RADDR3_PACKET_END_RADDR3(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_END_RADDR3_PACKET_END_RADDR3_SHIFT)) & SDU_FN_CARD_PKT_END_RADDR3_PACKET_END_RADDR3_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_END_WADDR0 - PKT_END_WADDR0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_END_WADDR0_PACKET_END_WADDR0_MASK (0xFFU)\r\n#define SDU_FN_CARD_PKT_END_WADDR0_PACKET_END_WADDR0_SHIFT (0U)\r\n/*! PACKET_END_WADDR0 - For function 1, this is used as CMD53 DMA write packet end addr [7:0] For\r\n *    other functions, this is a scratch pad register\r\n */\r\n#define SDU_FN_CARD_PKT_END_WADDR0_PACKET_END_WADDR0(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_END_WADDR0_PACKET_END_WADDR0_SHIFT)) & SDU_FN_CARD_PKT_END_WADDR0_PACKET_END_WADDR0_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_END_WADDR1 - PKT_END_WADDR1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_END_WADDR1_PACKET_END_WADDR1_MASK (0xFFU)\r\n#define SDU_FN_CARD_PKT_END_WADDR1_PACKET_END_WADDR1_SHIFT (0U)\r\n/*! PACKET_END_WADDR1 - For function 1, this is used as CMD53 DMA write packet end addr [15:8] For\r\n *    other functions, this is a scratch pad register\r\n */\r\n#define SDU_FN_CARD_PKT_END_WADDR1_PACKET_END_WADDR1(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_END_WADDR1_PACKET_END_WADDR1_SHIFT)) & SDU_FN_CARD_PKT_END_WADDR1_PACKET_END_WADDR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_END_WADDR2 - PKT_END_WADDR2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_END_WADDR2_PACKET_END_WADDR2_MASK (0xFFU)\r\n#define SDU_FN_CARD_PKT_END_WADDR2_PACKET_END_WADDR2_SHIFT (0U)\r\n/*! PACKET_END_WADDR2 - For function 1, this is used as CMD53 DMA write packet end addr [23:16] For\r\n *    other functions, this is a scratch pad register\r\n */\r\n#define SDU_FN_CARD_PKT_END_WADDR2_PACKET_END_WADDR2(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_END_WADDR2_PACKET_END_WADDR2_SHIFT)) & SDU_FN_CARD_PKT_END_WADDR2_PACKET_END_WADDR2_MASK)\r\n/*! @} */\r\n\r\n/*! @name PKT_END_WADDR3 - PKT_END_WADDR3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_PKT_END_WADDR3_PACKET_END_WADDR3_MASK (0xFFU)\r\n#define SDU_FN_CARD_PKT_END_WADDR3_PACKET_END_WADDR3_SHIFT (0U)\r\n/*! PACKET_END_WADDR3 - For function 1, this is used as CMD53 DMA write packet end addr [31:24] For\r\n *    other functions, this is a scratch pad register\r\n */\r\n#define SDU_FN_CARD_PKT_END_WADDR3_PACKET_END_WADDR3(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_PKT_END_WADDR3_PACKET_END_WADDR3_SHIFT)) & SDU_FN_CARD_PKT_END_WADDR3_PACKET_END_WADDR3_MASK)\r\n/*! @} */\r\n\r\n/*! @name OCR_0 - Operation Conditions 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_OCR_0_OCR0_MASK              (0xFFU)\r\n#define SDU_FN_CARD_OCR_0_OCR0_SHIFT             (0U)\r\n/*! OCR0 - Operation Conditions 0 */\r\n#define SDU_FN_CARD_OCR_0_OCR0(x)                (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_OCR_0_OCR0_SHIFT)) & SDU_FN_CARD_OCR_0_OCR0_MASK)\r\n/*! @} */\r\n\r\n/*! @name OCR_1 - Operation Conditions 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_OCR_1_OCR1_MASK              (0xFFU)\r\n#define SDU_FN_CARD_OCR_1_OCR1_SHIFT             (0U)\r\n/*! OCR1 - Operation Conditions 1 */\r\n#define SDU_FN_CARD_OCR_1_OCR1(x)                (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_OCR_1_OCR1_SHIFT)) & SDU_FN_CARD_OCR_1_OCR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name OCR_2 - Operation Conditions 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_OCR_2_OCR2_MASK              (0xFFU)\r\n#define SDU_FN_CARD_OCR_2_OCR2_SHIFT             (0U)\r\n/*! OCR2 - Operation Conditions 2 */\r\n#define SDU_FN_CARD_OCR_2_OCR2(x)                (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_OCR_2_OCR2_SHIFT)) & SDU_FN_CARD_OCR_2_OCR2_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_CONFIG_1 - Card Config1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG_1_SD_NEG_EDGE_MASK (0x1U)\r\n#define SDU_FN_CARD_CARD_CONFIG_1_SD_NEG_EDGE_SHIFT (0U)\r\n/*! SD_NEG_EDGE - Sample Data Negative Edge SD interface data sampling edge. */\r\n#define SDU_FN_CARD_CARD_CONFIG_1_SD_NEG_EDGE(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG_1_SD_NEG_EDGE_SHIFT)) & SDU_FN_CARD_CARD_CONFIG_1_SD_NEG_EDGE_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG_1_CMD53_FINISH_GBUS_MASK (0x2U)\r\n#define SDU_FN_CARD_CARD_CONFIG_1_CMD53_FINISH_GBUS_SHIFT (1U)\r\n/*! CMD53_FINISH_GBUS - Command 53 Finish Ahb Data transfer termination. */\r\n#define SDU_FN_CARD_CARD_CONFIG_1_CMD53_FINISH_GBUS(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG_1_CMD53_FINISH_GBUS_SHIFT)) & SDU_FN_CARD_CARD_CONFIG_1_CMD53_FINISH_GBUS_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG_1_EXPLICIT_DNLD_OVER_MASK (0x4U)\r\n#define SDU_FN_CARD_CARD_CONFIG_1_EXPLICIT_DNLD_OVER_SHIFT (2U)\r\n/*! EXPLICIT_DNLD_OVER - Explicit Download Over 0 = download over is generated on completion of\r\n *    CMD53 write 1 = download over is generated when host clears download ready interrupt\r\n */\r\n#define SDU_FN_CARD_CARD_CONFIG_1_EXPLICIT_DNLD_OVER(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG_1_EXPLICIT_DNLD_OVER_SHIFT)) & SDU_FN_CARD_CARD_CONFIG_1_EXPLICIT_DNLD_OVER_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG_1_EXPLICIT_UPLD_OVER_MASK (0x8U)\r\n#define SDU_FN_CARD_CARD_CONFIG_1_EXPLICIT_UPLD_OVER_SHIFT (3U)\r\n/*! EXPLICIT_UPLD_OVER - Explicit Upload Over 0 = upload over is generated on completion of CMD53\r\n *    read 1 = upload over is generated when host clears upload ready interrupt\r\n */\r\n#define SDU_FN_CARD_CARD_CONFIG_1_EXPLICIT_UPLD_OVER(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG_1_EXPLICIT_UPLD_OVER_SHIFT)) & SDU_FN_CARD_CARD_CONFIG_1_EXPLICIT_UPLD_OVER_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG_1_AGGR_INTR_EN_MASK (0x10U)\r\n#define SDU_FN_CARD_CARD_CONFIG_1_AGGR_INTR_EN_SHIFT (4U)\r\n/*! AGGR_INTR_EN - Aggregation Interrupt Enable 0 = only one download/upload over interrupt per\r\n *    aggregate 1 = generate interrupt for each PDU in aggregate\r\n */\r\n#define SDU_FN_CARD_CARD_CONFIG_1_AGGR_INTR_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG_1_AGGR_INTR_EN_SHIFT)) & SDU_FN_CARD_CARD_CONFIG_1_AGGR_INTR_EN_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG_1_EXPLICIT_DNLD_UPDATE_MASK (0x20U)\r\n#define SDU_FN_CARD_CARD_CONFIG_1_EXPLICIT_DNLD_UPDATE_SHIFT (5U)\r\n/*! EXPLICIT_DNLD_UPDATE - Explicit Download Update 0 = bitmap update is done on completion of CMD53\r\n *    write 1 = bitmap update is done when host clears download ready interrupt\r\n */\r\n#define SDU_FN_CARD_CARD_CONFIG_1_EXPLICIT_DNLD_UPDATE(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG_1_EXPLICIT_DNLD_UPDATE_SHIFT)) & SDU_FN_CARD_CARD_CONFIG_1_EXPLICIT_DNLD_UPDATE_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG_1_EXPLICIT_UPLD_UPDATE_MASK (0x40U)\r\n#define SDU_FN_CARD_CARD_CONFIG_1_EXPLICIT_UPLD_UPDATE_SHIFT (6U)\r\n/*! EXPLICIT_UPLD_UPDATE - Explicit Upload Update 0 = bitmap update is done on completion of CMD53\r\n *    read 1 = bitmap update is done when host clears upload\r\n */\r\n#define SDU_FN_CARD_CARD_CONFIG_1_EXPLICIT_UPLD_UPDATE(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG_1_EXPLICIT_UPLD_UPDATE_SHIFT)) & SDU_FN_CARD_CARD_CONFIG_1_EXPLICIT_UPLD_UPDATE_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG_1_IOE_WAKEUP_EN_MASK (0x80U)\r\n#define SDU_FN_CARD_CARD_CONFIG_1_IOE_WAKEUP_EN_SHIFT (7U)\r\n/*! IOE_WAKEUP_EN - If this is enabled, the 0-to-1 transition of the IO_ENABLE register bit of each\r\n *    function that is written by host will generate a function-specific wakeup event to the APU.\r\n */\r\n#define SDU_FN_CARD_CARD_CONFIG_1_IOE_WAKEUP_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG_1_IOE_WAKEUP_EN_SHIFT)) & SDU_FN_CARD_CARD_CONFIG_1_IOE_WAKEUP_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_CONFIG2_0 - Card Config2 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_CMD53_WR_BUSY_FORCE_EN_MASK (0x1U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_CMD53_WR_BUSY_FORCE_EN_SHIFT (0U)\r\n/*! CMD53_WR_BUSY_FORCE_EN - If this is enabled, write busy signal can be forced to 1 or 0\r\n *    (specified by cmd53_wr_busy_force_val) and sent to host during cmd53 write operation.\r\n */\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_CMD53_WR_BUSY_FORCE_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_0_CMD53_WR_BUSY_FORCE_EN_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_0_CMD53_WR_BUSY_FORCE_EN_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_SQ_ADDR_WRAP_EN_MASK (0x2U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_SQ_ADDR_WRAP_EN_SHIFT (1U)\r\n/*! SQ_ADDR_WRAP_EN - If this is enabled, the DMA address of the current cmd53 access is wrapped\r\n *    back to its starting address once it reaches the end address.\r\n */\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_SQ_ADDR_WRAP_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_0_SQ_ADDR_WRAP_EN_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_0_SQ_ADDR_WRAP_EN_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_SD_POSEDGE_DRV_FORCE_EN_MASK (0x4U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_SD_POSEDGE_DRV_FORCE_EN_SHIFT (2U)\r\n/*! SD_POSEDGE_DRV_FORCE_EN - sd_posedge_drv_force_en */\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_SD_POSEDGE_DRV_FORCE_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_0_SD_POSEDGE_DRV_FORCE_EN_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_0_SD_POSEDGE_DRV_FORCE_EN_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_FORCE_ASYNC_4BIT_INT_EN_MASK (0x8U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_FORCE_ASYNC_4BIT_INT_EN_SHIFT (3U)\r\n/*! FORCE_ASYNC_4BIT_INT_EN - Force asynchronous interrupt in SD 4-bit mode enable. */\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_FORCE_ASYNC_4BIT_INT_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_0_FORCE_ASYNC_4BIT_INT_EN_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_0_FORCE_ASYNC_4BIT_INT_EN_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_HOST_INT_AUTO_ENABLE_MASK (0x10U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_HOST_INT_AUTO_ENABLE_SHIFT (4U)\r\n/*! HOST_INT_AUTO_ENABLE - If this is enabled, download and upload ready host interrupt is\r\n *    automatically cleared and re-enabled after the current cmd53 is completed.\r\n */\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_HOST_INT_AUTO_ENABLE(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_0_HOST_INT_AUTO_ENABLE_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_0_HOST_INT_AUTO_ENABLE_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_ONE_BLOCK_XFRD_SLCT_MASK (0x20U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_ONE_BLOCK_XFRD_SLCT_SHIFT (5U)\r\n/*! ONE_BLOCK_XFRD_SLCT - Firmware control to enable packet length issue fix for aggregation mode. */\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_ONE_BLOCK_XFRD_SLCT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_0_ONE_BLOCK_XFRD_SLCT_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_0_ONE_BLOCK_XFRD_SLCT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_CMD53_WR_BUSY_SIGNAL_MASK (0x40U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_CMD53_WR_BUSY_SIGNAL_SHIFT (6U)\r\n/*! CMD53_WR_BUSY_SIGNAL - Generate cmd53 write busy signal 0 = Write busy signal is not generated\r\n *    on SD_DAT[0] line after each block of cmd53 write.\r\n */\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_CMD53_WR_BUSY_SIGNAL(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_0_CMD53_WR_BUSY_SIGNAL_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_0_CMD53_WR_BUSY_SIGNAL_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_CMD53_WR_BUSY_WIDTH_MASK (0x80U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_CMD53_WR_BUSY_WIDTH_SHIFT (7U)\r\n/*! CMD53_WR_BUSY_WIDTH - cmd53_wr_busy_width */\r\n#define SDU_FN_CARD_CARD_CONFIG2_0_CMD53_WR_BUSY_WIDTH(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_0_CMD53_WR_BUSY_WIDTH_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_0_CMD53_WR_BUSY_WIDTH_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_CONFIG2_1 - Card Config2 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_1_CMD53_NEW_MODE_MASK (0x1U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_1_CMD53_NEW_MODE_SHIFT (0U)\r\n/*! CMD53_NEW_MODE - Enable new encoding scheme of the 17b register address field in CMD53. */\r\n#define SDU_FN_CARD_CARD_CONFIG2_1_CMD53_NEW_MODE(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_1_CMD53_NEW_MODE_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_1_CMD53_NEW_MODE_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_1_SD_POSEDGE_DRV_FORCE_VAL_MASK (0x2U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_1_SD_POSEDGE_DRV_FORCE_VAL_SHIFT (1U)\r\n/*! SD_POSEDGE_DRV_FORCE_VAL - If this is set to 1, SD output is driven at rising edge. */\r\n#define SDU_FN_CARD_CARD_CONFIG2_1_SD_POSEDGE_DRV_FORCE_VAL(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_1_SD_POSEDGE_DRV_FORCE_VAL_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_1_SD_POSEDGE_DRV_FORCE_VAL_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_1_DNLD_RDY_AUTO_RESET_MASK (0x4U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_1_DNLD_RDY_AUTO_RESET_SHIFT (2U)\r\n/*! DNLD_RDY_AUTO_RESET - Reset control for dnld_card_rdy event in C2H_INTEVENT 0 = download ready\r\n *    event is reset to 0 after the current cmd53 is completed.\r\n */\r\n#define SDU_FN_CARD_CARD_CONFIG2_1_DNLD_RDY_AUTO_RESET(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_1_DNLD_RDY_AUTO_RESET_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_1_DNLD_RDY_AUTO_RESET_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_1_UPLD_RDY_AUTO_RESET_MASK (0x8U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_1_UPLD_RDY_AUTO_RESET_SHIFT (3U)\r\n/*! UPLD_RDY_AUTO_RESET - Reset control for upld_card_rdy event in C2H_INTEVENT 0 = upload ready\r\n *    event is reset to 0 after the current cmd53 is completed.\r\n */\r\n#define SDU_FN_CARD_CARD_CONFIG2_1_UPLD_RDY_AUTO_RESET(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_1_UPLD_RDY_AUTO_RESET_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_1_UPLD_RDY_AUTO_RESET_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_1_CMD53_TX_LEN_FORMAT_MASK (0x30U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_1_CMD53_TX_LEN_FORMAT_SHIFT (4U)\r\n/*! CMD53_TX_LEN_FORMAT - Define the cmd53 transmit/download length (tx_len) header format attached\r\n *    in the beginning of data payload: 0 = no tx_len header info 1= first 2 bytes contain tx_len\r\n *    info 2 = first 3 bytes contain tx_len info This field is applicable for non-aggregation mode only\r\n */\r\n#define SDU_FN_CARD_CARD_CONFIG2_1_CMD53_TX_LEN_FORMAT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_1_CMD53_TX_LEN_FORMAT_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_1_CMD53_TX_LEN_FORMAT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_1_CMD53_RD_LEN_FORMAT_MASK (0xC0U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_1_CMD53_RD_LEN_FORMAT_SHIFT (6U)\r\n/*! CMD53_RD_LEN_FORMAT - cmd53_rd_len_format */\r\n#define SDU_FN_CARD_CARD_CONFIG2_1_CMD53_RD_LEN_FORMAT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_1_CMD53_RD_LEN_FORMAT_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_1_CMD53_RD_LEN_FORMAT_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_CONFIG2_2 - Card Config2 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_2_TEST_DATA_OUT_MASK (0xFU)\r\n#define SDU_FN_CARD_CARD_CONFIG2_2_TEST_DATA_OUT_SHIFT (0U)\r\n/*! TEST_DATA_OUT - Test output data for SD_DAT. */\r\n#define SDU_FN_CARD_CARD_CONFIG2_2_TEST_DATA_OUT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_2_TEST_DATA_OUT_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_2_TEST_DATA_OUT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_2_TEST_CMD_OUT_MASK (0x10U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_2_TEST_CMD_OUT_SHIFT (4U)\r\n/*! TEST_CMD_OUT - Test output data for SD_CMD. */\r\n#define SDU_FN_CARD_CARD_CONFIG2_2_TEST_CMD_OUT(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_2_TEST_CMD_OUT_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_2_TEST_CMD_OUT_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_2_CMD53_WR_BUSY_FORCE_VAL_MASK (0x20U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_2_CMD53_WR_BUSY_FORCE_VAL_SHIFT (5U)\r\n/*! CMD53_WR_BUSY_FORCE_VAL - If cmd53_wr_busy_force_en is enabled, this register bit is used to force write busy signal to host. */\r\n#define SDU_FN_CARD_CARD_CONFIG2_2_CMD53_WR_BUSY_FORCE_VAL(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_2_CMD53_WR_BUSY_FORCE_VAL_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_2_CMD53_WR_BUSY_FORCE_VAL_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_2_CMD53_WR_Q_EN_MASK (0x40U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_2_CMD53_WR_Q_EN_SHIFT (6U)\r\n/*! CMD53_WR_Q_EN - If this bit is 0, multiple queue feature is disabled for CMD53 write operation. */\r\n#define SDU_FN_CARD_CARD_CONFIG2_2_CMD53_WR_Q_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_2_CMD53_WR_Q_EN_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_2_CMD53_WR_Q_EN_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_2_CMD53_RD_Q_EN_MASK (0x80U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_2_CMD53_RD_Q_EN_SHIFT (7U)\r\n/*! CMD53_RD_Q_EN - If this bit is 0, multiple queue feature is disabled for CMD53 read operation. */\r\n#define SDU_FN_CARD_CARD_CONFIG2_2_CMD53_RD_Q_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_2_CMD53_RD_Q_EN_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_2_CMD53_RD_Q_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CARD_CONFIG2_3 - Card Config2 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_3_TEST_DATA_EN_MASK (0xFU)\r\n#define SDU_FN_CARD_CARD_CONFIG2_3_TEST_DATA_EN_SHIFT (0U)\r\n/*! TEST_DATA_EN - Test output enable for SD_DAT. */\r\n#define SDU_FN_CARD_CARD_CONFIG2_3_TEST_DATA_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_3_TEST_DATA_EN_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_3_TEST_DATA_EN_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_3_TEST_CMD_EN_MASK (0x10U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_3_TEST_CMD_EN_SHIFT (4U)\r\n/*! TEST_CMD_EN - Test output enable for SD_CMD. */\r\n#define SDU_FN_CARD_CARD_CONFIG2_3_TEST_CMD_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_3_TEST_CMD_EN_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_3_TEST_CMD_EN_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_3_PAD_TEST_MODE_MASK (0x20U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_3_PAD_TEST_MODE_SHIFT (5U)\r\n/*! PAD_TEST_MODE - Enable test mode to directly drive SD_DAT and SD_CMD with test data specified by\r\n *    test_data_out, test_cmd_out, test_data_en, and test_cmd_en fields.\r\n */\r\n#define SDU_FN_CARD_CARD_CONFIG2_3_PAD_TEST_MODE(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_3_PAD_TEST_MODE_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_3_PAD_TEST_MODE_MASK)\r\n\r\n#define SDU_FN_CARD_CARD_CONFIG2_3_CMD53_WR_BUSY_HW_CTRL_EN_MASK (0x40U)\r\n#define SDU_FN_CARD_CARD_CONFIG2_3_CMD53_WR_BUSY_HW_CTRL_EN_SHIFT (6U)\r\n/*! CMD53_WR_BUSY_HW_CTRL_EN - Enable cmd53_wr_busy_hw_ctrl feature for each function. */\r\n#define SDU_FN_CARD_CARD_CONFIG2_3_CMD53_WR_BUSY_HW_CTRL_EN(x) (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_CARD_CONFIG2_3_CMD53_WR_BUSY_HW_CTRL_EN_SHIFT)) & SDU_FN_CARD_CARD_CONFIG2_3_CMD53_WR_BUSY_HW_CTRL_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name TESTBUS0 - Testbus 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_TESTBUS0_TESTBUS0_MASK       (0xFFU)\r\n#define SDU_FN_CARD_TESTBUS0_TESTBUS0_SHIFT      (0U)\r\n/*! TESTBUS0 - SDU testbus0 */\r\n#define SDU_FN_CARD_TESTBUS0_TESTBUS0(x)         (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_TESTBUS0_TESTBUS0_SHIFT)) & SDU_FN_CARD_TESTBUS0_TESTBUS0_MASK)\r\n/*! @} */\r\n\r\n/*! @name TESTBUS1 - Testbus 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_TESTBUS1_TESTBUS1_MASK       (0xFFU)\r\n#define SDU_FN_CARD_TESTBUS1_TESTBUS1_SHIFT      (0U)\r\n/*! TESTBUS1 - SDU testbus1 */\r\n#define SDU_FN_CARD_TESTBUS1_TESTBUS1(x)         (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_TESTBUS1_TESTBUS1_SHIFT)) & SDU_FN_CARD_TESTBUS1_TESTBUS1_MASK)\r\n/*! @} */\r\n\r\n/*! @name RCA0 - RCA 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_RCA0_RCA0_MASK               (0xFFU)\r\n#define SDU_FN_CARD_RCA0_RCA0_SHIFT              (0U)\r\n/*! RCA0 - RCA[7:0] */\r\n#define SDU_FN_CARD_RCA0_RCA0(x)                 (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_RCA0_RCA0_SHIFT)) & SDU_FN_CARD_RCA0_RCA0_MASK)\r\n/*! @} */\r\n\r\n/*! @name RCA1 - RCA 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_RCA1_RCA1_MASK               (0xFFU)\r\n#define SDU_FN_CARD_RCA1_RCA1_SHIFT              (0U)\r\n/*! RCA1 - RCA[15:8] */\r\n#define SDU_FN_CARD_RCA1_RCA1(x)                 (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_RCA1_RCA1_SHIFT)) & SDU_FN_CARD_RCA1_RCA1_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMA_ADDR0 - DMA Address 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_DMA_ADDR0_DMA_ADDR0_MASK     (0xFFU)\r\n#define SDU_FN_CARD_DMA_ADDR0_DMA_ADDR0_SHIFT    (0U)\r\n/*! DMA_ADDR0 - DMA address [7:0] of last system bus transfer */\r\n#define SDU_FN_CARD_DMA_ADDR0_DMA_ADDR0(x)       (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_DMA_ADDR0_DMA_ADDR0_SHIFT)) & SDU_FN_CARD_DMA_ADDR0_DMA_ADDR0_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMA_ADDR1 - DMA Address 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_DMA_ADDR1_DMA_ADDR1_MASK     (0xFFU)\r\n#define SDU_FN_CARD_DMA_ADDR1_DMA_ADDR1_SHIFT    (0U)\r\n/*! DMA_ADDR1 - DMA address [15:8] of last system bus transfer */\r\n#define SDU_FN_CARD_DMA_ADDR1_DMA_ADDR1(x)       (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_DMA_ADDR1_DMA_ADDR1_SHIFT)) & SDU_FN_CARD_DMA_ADDR1_DMA_ADDR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMA_ADDR2 - DMA Address 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_DMA_ADDR2_DMA_ADDR2_MASK     (0xFFU)\r\n#define SDU_FN_CARD_DMA_ADDR2_DMA_ADDR2_SHIFT    (0U)\r\n/*! DMA_ADDR2 - DMA address [23:16] of last system bus transfer */\r\n#define SDU_FN_CARD_DMA_ADDR2_DMA_ADDR2(x)       (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_DMA_ADDR2_DMA_ADDR2_SHIFT)) & SDU_FN_CARD_DMA_ADDR2_DMA_ADDR2_MASK)\r\n/*! @} */\r\n\r\n/*! @name DMA_ADDR3 - DMA Address 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_DMA_ADDR3_DMA_ADDR3_MASK     (0xFFU)\r\n#define SDU_FN_CARD_DMA_ADDR3_DMA_ADDR3_SHIFT    (0U)\r\n/*! DMA_ADDR3 - DMA address [31:24] of last system bus transfer */\r\n#define SDU_FN_CARD_DMA_ADDR3_DMA_ADDR3(x)       (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_DMA_ADDR3_DMA_ADDR3_SHIFT)) & SDU_FN_CARD_DMA_ADDR3_DMA_ADDR3_MASK)\r\n/*! @} */\r\n\r\n/*! @name IO_PORT0 - I/O Port 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_IO_PORT0_IO_ADDR0_MASK       (0xFFU)\r\n#define SDU_FN_CARD_IO_PORT0_IO_ADDR0_SHIFT      (0U)\r\n/*! IO_ADDR0 - I/O port address [7:0] */\r\n#define SDU_FN_CARD_IO_PORT0_IO_ADDR0(x)         (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_IO_PORT0_IO_ADDR0_SHIFT)) & SDU_FN_CARD_IO_PORT0_IO_ADDR0_MASK)\r\n/*! @} */\r\n\r\n/*! @name IO_PORT1 - I/O Port 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_IO_PORT1_IO_ADDR1_MASK       (0xFFU)\r\n#define SDU_FN_CARD_IO_PORT1_IO_ADDR1_SHIFT      (0U)\r\n/*! IO_ADDR1 - I/O port address [15:8] */\r\n#define SDU_FN_CARD_IO_PORT1_IO_ADDR1(x)         (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_IO_PORT1_IO_ADDR1_SHIFT)) & SDU_FN_CARD_IO_PORT1_IO_ADDR1_MASK)\r\n/*! @} */\r\n\r\n/*! @name IO_PORT2 - I/O Port 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_IO_PORT2_IO_ADDR2_MASK       (0x1U)\r\n#define SDU_FN_CARD_IO_PORT2_IO_ADDR2_SHIFT      (0U)\r\n/*! IO_ADDR2 - I/O port address [16] */\r\n#define SDU_FN_CARD_IO_PORT2_IO_ADDR2(x)         (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_IO_PORT2_IO_ADDR2_SHIFT)) & SDU_FN_CARD_IO_PORT2_IO_ADDR2_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH2_0 - Scratch 2 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH2_0_SCRATCH2_0_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH2_0_SCRATCH2_0_SHIFT  (0U)\r\n/*! SCRATCH2_0 - Scratch register 2 [7:0] */\r\n#define SDU_FN_CARD_SCRATCH2_0_SCRATCH2_0(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH2_0_SCRATCH2_0_SHIFT)) & SDU_FN_CARD_SCRATCH2_0_SCRATCH2_0_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH2_1 - Scratch 2 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH2_1_SCRATCH2_1_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH2_1_SCRATCH2_1_SHIFT  (0U)\r\n/*! SCRATCH2_1 - Scratch register 2 [15:8] */\r\n#define SDU_FN_CARD_SCRATCH2_1_SCRATCH2_1(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH2_1_SCRATCH2_1_SHIFT)) & SDU_FN_CARD_SCRATCH2_1_SCRATCH2_1_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH2_2 - Scratch 2 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH2_2_SCRATCH2_2_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH2_2_SCRATCH2_2_SHIFT  (0U)\r\n/*! SCRATCH2_2 - Scratch register 2 [23:16] */\r\n#define SDU_FN_CARD_SCRATCH2_2_SCRATCH2_2(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH2_2_SCRATCH2_2_SHIFT)) & SDU_FN_CARD_SCRATCH2_2_SCRATCH2_2_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH2_3 - Scratch 2 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH2_3_SCRATCH2_3_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH2_3_SCRATCH2_3_SHIFT  (0U)\r\n/*! SCRATCH2_3 - Scratch register 2 [31:24] */\r\n#define SDU_FN_CARD_SCRATCH2_3_SCRATCH2_3(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH2_3_SCRATCH2_3_SHIFT)) & SDU_FN_CARD_SCRATCH2_3_SCRATCH2_3_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH3_0 - Scratch 3 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH3_0_SCRATCH3_0_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH3_0_SCRATCH3_0_SHIFT  (0U)\r\n/*! SCRATCH3_0 - Scratch register 3 [7:0] */\r\n#define SDU_FN_CARD_SCRATCH3_0_SCRATCH3_0(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH3_0_SCRATCH3_0_SHIFT)) & SDU_FN_CARD_SCRATCH3_0_SCRATCH3_0_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH3_1 - Scratch 3 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH3_1_SCRATCH3_1_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH3_1_SCRATCH3_1_SHIFT  (0U)\r\n/*! SCRATCH3_1 - Scratch register 3 [15:8] */\r\n#define SDU_FN_CARD_SCRATCH3_1_SCRATCH3_1(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH3_1_SCRATCH3_1_SHIFT)) & SDU_FN_CARD_SCRATCH3_1_SCRATCH3_1_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH3_2 - Scratch 3 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH3_2_SCRATCH3_2_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH3_2_SCRATCH3_2_SHIFT  (0U)\r\n/*! SCRATCH3_2 - Scratch register 3 [23:16] */\r\n#define SDU_FN_CARD_SCRATCH3_2_SCRATCH3_2(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH3_2_SCRATCH3_2_SHIFT)) & SDU_FN_CARD_SCRATCH3_2_SCRATCH3_2_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH3_3 - Scratch 3 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH3_3_SCRATCH3_3_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH3_3_SCRATCH3_3_SHIFT  (0U)\r\n/*! SCRATCH3_3 - Scratch register 3 [31:24] */\r\n#define SDU_FN_CARD_SCRATCH3_3_SCRATCH3_3(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH3_3_SCRATCH3_3_SHIFT)) & SDU_FN_CARD_SCRATCH3_3_SCRATCH3_3_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH4_0 - Scratch 4 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH4_0_SCRATCH4_0_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH4_0_SCRATCH4_0_SHIFT  (0U)\r\n/*! SCRATCH4_0 - Scratch register 4 [7:0] */\r\n#define SDU_FN_CARD_SCRATCH4_0_SCRATCH4_0(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH4_0_SCRATCH4_0_SHIFT)) & SDU_FN_CARD_SCRATCH4_0_SCRATCH4_0_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH4_1 - Scratch 4 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH4_1_SCRATCH4_1_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH4_1_SCRATCH4_1_SHIFT  (0U)\r\n/*! SCRATCH4_1 - Scratch register 4 [15:8] */\r\n#define SDU_FN_CARD_SCRATCH4_1_SCRATCH4_1(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH4_1_SCRATCH4_1_SHIFT)) & SDU_FN_CARD_SCRATCH4_1_SCRATCH4_1_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH4_2 - Scratch 4 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH4_2_SCRATCH4_2_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH4_2_SCRATCH4_2_SHIFT  (0U)\r\n/*! SCRATCH4_2 - Scratch register 4 [23:16] */\r\n#define SDU_FN_CARD_SCRATCH4_2_SCRATCH4_2(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH4_2_SCRATCH4_2_SHIFT)) & SDU_FN_CARD_SCRATCH4_2_SCRATCH4_2_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH4_3 - Scratch 4 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH4_3_SCRATCH4_3_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH4_3_SCRATCH4_3_SHIFT  (0U)\r\n/*! SCRATCH4_3 - Scratch register 4 [31:24] */\r\n#define SDU_FN_CARD_SCRATCH4_3_SCRATCH4_3(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH4_3_SCRATCH4_3_SHIFT)) & SDU_FN_CARD_SCRATCH4_3_SCRATCH4_3_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH5_0 - Scratch 5 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH5_0_SCRATCH5_0_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH5_0_SCRATCH5_0_SHIFT  (0U)\r\n/*! SCRATCH5_0 - Scratch register 5 [7:0] */\r\n#define SDU_FN_CARD_SCRATCH5_0_SCRATCH5_0(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH5_0_SCRATCH5_0_SHIFT)) & SDU_FN_CARD_SCRATCH5_0_SCRATCH5_0_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH5_1 - Scratch 5 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH5_1_SCRATCH5_1_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH5_1_SCRATCH5_1_SHIFT  (0U)\r\n/*! SCRATCH5_1 - Scratch register 5 [15:8] */\r\n#define SDU_FN_CARD_SCRATCH5_1_SCRATCH5_1(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH5_1_SCRATCH5_1_SHIFT)) & SDU_FN_CARD_SCRATCH5_1_SCRATCH5_1_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH5_2 - Scratch 5 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH5_2_SCRATCH5_2_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH5_2_SCRATCH5_2_SHIFT  (0U)\r\n/*! SCRATCH5_2 - Scratch register 5 [23:16] */\r\n#define SDU_FN_CARD_SCRATCH5_2_SCRATCH5_2(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH5_2_SCRATCH5_2_SHIFT)) & SDU_FN_CARD_SCRATCH5_2_SCRATCH5_2_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH5_3 - Scratch 5 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH5_3_SCRATCH5_3_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH5_3_SCRATCH5_3_SHIFT  (0U)\r\n/*! SCRATCH5_3 - Scratch register 5 [31:24] */\r\n#define SDU_FN_CARD_SCRATCH5_3_SCRATCH5_3(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH5_3_SCRATCH5_3_SHIFT)) & SDU_FN_CARD_SCRATCH5_3_SCRATCH5_3_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH6_0 - Scratch 6 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH6_0_SCRATCH6_0_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH6_0_SCRATCH6_0_SHIFT  (0U)\r\n/*! SCRATCH6_0 - Scratch register 6 [7:0] */\r\n#define SDU_FN_CARD_SCRATCH6_0_SCRATCH6_0(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH6_0_SCRATCH6_0_SHIFT)) & SDU_FN_CARD_SCRATCH6_0_SCRATCH6_0_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH6_1 - Scratch 6 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH6_1_SCRATCH6_1_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH6_1_SCRATCH6_1_SHIFT  (0U)\r\n/*! SCRATCH6_1 - Scratch register 6 [15:8] */\r\n#define SDU_FN_CARD_SCRATCH6_1_SCRATCH6_1(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH6_1_SCRATCH6_1_SHIFT)) & SDU_FN_CARD_SCRATCH6_1_SCRATCH6_1_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH6_2 - Scratch 6 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH6_2_SCRATCH6_2_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH6_2_SCRATCH6_2_SHIFT  (0U)\r\n/*! SCRATCH6_2 - Scratch register 6 [23:16] */\r\n#define SDU_FN_CARD_SCRATCH6_2_SCRATCH6_2(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH6_2_SCRATCH6_2_SHIFT)) & SDU_FN_CARD_SCRATCH6_2_SCRATCH6_2_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH6_3 - Scratch 6 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH6_3_SCRATCH6_3_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH6_3_SCRATCH6_3_SHIFT  (0U)\r\n/*! SCRATCH6_3 - Scratch register 6 [31:24] */\r\n#define SDU_FN_CARD_SCRATCH6_3_SCRATCH6_3(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH6_3_SCRATCH6_3_SHIFT)) & SDU_FN_CARD_SCRATCH6_3_SCRATCH6_3_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH7_0 - Scratch 7 0 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH7_0_SCRATCH7_0_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH7_0_SCRATCH7_0_SHIFT  (0U)\r\n/*! SCRATCH7_0 - Scratch register 7 [7:0] */\r\n#define SDU_FN_CARD_SCRATCH7_0_SCRATCH7_0(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH7_0_SCRATCH7_0_SHIFT)) & SDU_FN_CARD_SCRATCH7_0_SCRATCH7_0_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH7_1 - Scratch 7 1 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH7_1_SCRATCH7_1_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH7_1_SCRATCH7_1_SHIFT  (0U)\r\n/*! SCRATCH7_1 - Scratch register 7 [15:8] */\r\n#define SDU_FN_CARD_SCRATCH7_1_SCRATCH7_1(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH7_1_SCRATCH7_1_SHIFT)) & SDU_FN_CARD_SCRATCH7_1_SCRATCH7_1_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH7_2 - Scratch 7 2 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH7_2_SCRATCH7_2_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH7_2_SCRATCH7_2_SHIFT  (0U)\r\n/*! SCRATCH7_2 - Scratch register 7 [23:16] */\r\n#define SDU_FN_CARD_SCRATCH7_2_SCRATCH7_2(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH7_2_SCRATCH7_2_SHIFT)) & SDU_FN_CARD_SCRATCH7_2_SCRATCH7_2_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCRATCH7_3 - Scratch 7 3 */\r\n/*! @{ */\r\n\r\n#define SDU_FN_CARD_SCRATCH7_3_SCRATCH7_3_MASK   (0xFFU)\r\n#define SDU_FN_CARD_SCRATCH7_3_SCRATCH7_3_SHIFT  (0U)\r\n/*! SCRATCH7_3 - Scratch register 7 [31:24] */\r\n#define SDU_FN_CARD_SCRATCH7_3_SCRATCH7_3(x)     (((uint8_t)(((uint8_t)(x)) << SDU_FN_CARD_SCRATCH7_3_SCRATCH7_3_SHIFT)) & SDU_FN_CARD_SCRATCH7_3_SCRATCH7_3_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SDU_FN_CARD_Register_Masks */\r\n\r\n\r\n/* SDU_FN_CARD - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral SDU_FN_CARD base address */\r\n  #define SDU_FN_CARD_BASE                         (0x50158100u)\r\n  /** Peripheral SDU_FN_CARD base address */\r\n  #define SDU_FN_CARD_BASE_NS                      (0x40158100u)\r\n  /** Peripheral SDU_FN_CARD base pointer */\r\n  #define SDU_FN_CARD                              ((SDU_FN_CARD_Type *)SDU_FN_CARD_BASE)\r\n  /** Peripheral SDU_FN_CARD base pointer */\r\n  #define SDU_FN_CARD_NS                           ((SDU_FN_CARD_Type *)SDU_FN_CARD_BASE_NS)\r\n  /** Array initializer of SDU_FN_CARD peripheral base addresses */\r\n  #define SDU_FN_CARD_BASE_ADDRS                   { SDU_FN_CARD_BASE }\r\n  /** Array initializer of SDU_FN_CARD peripheral base pointers */\r\n  #define SDU_FN_CARD_BASE_PTRS                    { SDU_FN_CARD }\r\n  /** Array initializer of SDU_FN_CARD peripheral base addresses */\r\n  #define SDU_FN_CARD_BASE_ADDRS_NS                { SDU_FN_CARD_BASE_NS }\r\n  /** Array initializer of SDU_FN_CARD peripheral base pointers */\r\n  #define SDU_FN_CARD_BASE_PTRS_NS                 { SDU_FN_CARD_NS }\r\n#else\r\n  /** Peripheral SDU_FN_CARD base address */\r\n  #define SDU_FN_CARD_BASE                         (0x40158100u)\r\n  /** Peripheral SDU_FN_CARD base pointer */\r\n  #define SDU_FN_CARD                              ((SDU_FN_CARD_Type *)SDU_FN_CARD_BASE)\r\n  /** Array initializer of SDU_FN_CARD peripheral base addresses */\r\n  #define SDU_FN_CARD_BASE_ADDRS                   { SDU_FN_CARD_BASE }\r\n  /** Array initializer of SDU_FN_CARD peripheral base pointers */\r\n  #define SDU_FN_CARD_BASE_PTRS                    { SDU_FN_CARD }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SDU_FN_CARD_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SENSOR_CTRL Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SENSOR_CTRL_Peripheral_Access_Layer SENSOR_CTRL Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** SENSOR_CTRL - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t ADC_CTRL_REG_1;                    /**< General configuration of ADCC, offset: 0x0 */\r\n  __I  uint32_t ADC_STATUS_REG;                    /**< status of ADC and ADCC, offset: 0x4 */\r\n  __IO uint32_t TSEN_CTRL_1_REG_1;                 /**< TSEN Controller configuration, offset: 0x8 */\r\n  __I  uint32_t TSEN_CTRL_1_REG_2;                 /**< TSEN Controller Output status register, offset: 0xC */\r\n  __IO uint32_t TSEN_CTRL_2_REG_1;                 /**< TSEN Controller configuration, offset: 0x10 */\r\n  __I  uint32_t TSEN_CTRL_2_REG_2;                 /**< TSEN Controller Output status register, offset: 0x14 */\r\n  __IO uint32_t VSEN_CTRL_1_REG_1;                 /**< VSEN Controller configuration, offset: 0x18 */\r\n  __I  uint32_t VSEN_CTRL_1_REG_2;                 /**< VSEN Controller Output status register, offset: 0x1C */\r\n  __IO uint32_t VSEN_CTRL_2_REG_1;                 /**< VSEN2 Controller configuration, offset: 0x20 */\r\n  __I  uint32_t VSEN_CTRL_2_REG_2;                 /**< VSEN2 Controller Output status register, offset: 0x24 */\r\n  __IO uint32_t VSEN_CTRL_3_REG_1;                 /**< VSEN3 Controller configuration, offset: 0x28 */\r\n  __I  uint32_t VSEN_CTRL_3_REG_2;                 /**< VSEN3 Controller Output status register, offset: 0x2C */\r\n  __IO uint32_t VGLITCH_CTRL_REG_1;                /**< Voltage Glitch sensor controller configuration, offset: 0x30 */\r\n  __IO uint32_t MISC_CTRL_REG;                     /**< Miscellaneous controls, offset: 0x34 */\r\n  __IO uint32_t CFG_ERR_STATUS_REG;                /**< CFG ERROR Control, offset: 0x38 */\r\n  __IO uint32_t SEN_CLR_REG;                       /**< CFG ERROR Control, offset: 0x3C */\r\n  __IO uint32_t SEC_ECO_REG;                       /**< ECO Bits, offset: 0x40 */\r\n} SENSOR_CTRL_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SENSOR_CTRL Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SENSOR_CTRL_Register_Masks SENSOR_CTRL Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name ADC_CTRL_REG_1 - General configuration of ADCC */\r\n/*! @{ */\r\n\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_SW_RESET_MASK (0x1U)\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_SW_RESET_SHIFT (0U)\r\n/*! ADCC_SW_RESET - sw reset from CPU for sensor and controller */\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_SW_RESET(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_SW_RESET_SHIFT)) & SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_SW_RESET_MASK)\r\n\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_SW_CAL_ENABLE_MASK (0x2U)\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_SW_CAL_ENABLE_SHIFT (1U)\r\n/*! ADCC_SW_CAL_ENABLE - SW triggered calibration enable. */\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_SW_CAL_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_SW_CAL_ENABLE_SHIFT)) & SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_SW_CAL_ENABLE_MASK)\r\n\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_SW_ENABLE_MASK (0x4U)\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_SW_ENABLE_SHIFT (2U)\r\n/*! ADCC_SW_ENABLE - sw enable from CPU for sensor and controller */\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_SW_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_SW_ENABLE_SHIFT)) & SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_SW_ENABLE_MASK)\r\n\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_TEST_CAL_BYPASS_MASK (0x8U)\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_TEST_CAL_BYPASS_SHIFT (3U)\r\n/*! ADCC_TEST_CAL_BYPASS - bypass calibration for ATE or other test */\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_TEST_CAL_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_TEST_CAL_BYPASS_SHIFT)) & SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_TEST_CAL_BYPASS_MASK)\r\n\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_TB_SEL_MASK (0x30U)\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_TB_SEL_SHIFT (4U)\r\n/*! ADCC_TB_SEL - It selects one of the testbuses of ADCC. */\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_TB_SEL(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_TB_SEL_SHIFT)) & SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_TB_SEL_MASK)\r\n\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_ERR_GAIN_BYPASS_MASK (0x40U)\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_ERR_GAIN_BYPASS_SHIFT (6U)\r\n/*! ADCC_ERR_GAIN_BYPASS - Bypass error gain adjustment in ADCC data output */\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_ERR_GAIN_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_ERR_GAIN_BYPASS_SHIFT)) & SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_ERR_GAIN_BYPASS_MASK)\r\n\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_ERR_GAIN_MASK (0x780U)\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_ERR_GAIN_SHIFT (7U)\r\n/*! ADCC_ERR_GAIN - IT is 4 bIT signed integer value of error gain of SARADC. If\r\n *    adcc_err_gain_bypass is set as 1, then this value is not considered for error gain adjustment of ADCC data\r\n *    output. Example: If value of this field is 4'b1110, then IT is -2 in decimal.\r\n */\r\n#define SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_ERR_GAIN(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_ERR_GAIN_SHIFT)) & SENSOR_CTRL_ADC_CTRL_REG_1_ADCC_ERR_GAIN_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADC_STATUS_REG - status of ADC and ADCC */\r\n/*! @{ */\r\n\r\n#define SENSOR_CTRL_ADC_STATUS_REG_ADCC_OFFSET_CODE_MASK (0xFFFU)\r\n#define SENSOR_CTRL_ADC_STATUS_REG_ADCC_OFFSET_CODE_SHIFT (0U)\r\n/*! ADCC_OFFSET_CODE - OFFSET of ADC computed after calibration. It is a signed number (2's\r\n *    complement format) with 1 fractional bit. Example, If binary value of this field is 1111_1111_0011\r\n *    then it represents -6.5 in decimal. Note that, this field is valid only when adcc_cal_done bit is\r\n *    1.\r\n */\r\n#define SENSOR_CTRL_ADC_STATUS_REG_ADCC_OFFSET_CODE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_ADC_STATUS_REG_ADCC_OFFSET_CODE_SHIFT)) & SENSOR_CTRL_ADC_STATUS_REG_ADCC_OFFSET_CODE_MASK)\r\n\r\n#define SENSOR_CTRL_ADC_STATUS_REG_ADCC_CAL_DONE_MASK (0x1000U)\r\n#define SENSOR_CTRL_ADC_STATUS_REG_ADCC_CAL_DONE_SHIFT (12U)\r\n/*! ADCC_CAL_DONE - Valid value: */\r\n#define SENSOR_CTRL_ADC_STATUS_REG_ADCC_CAL_DONE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_ADC_STATUS_REG_ADCC_CAL_DONE_SHIFT)) & SENSOR_CTRL_ADC_STATUS_REG_ADCC_CAL_DONE_MASK)\r\n\r\n#define SENSOR_CTRL_ADC_STATUS_REG_PU_ADC_REG_MASK (0x2000U)\r\n#define SENSOR_CTRL_ADC_STATUS_REG_PU_ADC_REG_SHIFT (13U)\r\n/*! PU_ADC_REG - Powerup/ power down value: */\r\n#define SENSOR_CTRL_ADC_STATUS_REG_PU_ADC_REG(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_ADC_STATUS_REG_PU_ADC_REG_SHIFT)) & SENSOR_CTRL_ADC_STATUS_REG_PU_ADC_REG_MASK)\r\n\r\n#define SENSOR_CTRL_ADC_STATUS_REG_ADC_OUT_DFF_RSTB_MASK (0x4000U)\r\n#define SENSOR_CTRL_ADC_STATUS_REG_ADC_OUT_DFF_RSTB_SHIFT (14U)\r\n/*! ADC_OUT_DFF_RSTB - Reset value: */\r\n#define SENSOR_CTRL_ADC_STATUS_REG_ADC_OUT_DFF_RSTB(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_ADC_STATUS_REG_ADC_OUT_DFF_RSTB_SHIFT)) & SENSOR_CTRL_ADC_STATUS_REG_ADC_OUT_DFF_RSTB_MASK)\r\n/*! @} */\r\n\r\n/*! @name TSEN_CTRL_1_REG_1 - TSEN Controller configuration */\r\n/*! @{ */\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_SW_RESET_MASK (0x1U)\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_SW_RESET_SHIFT (0U)\r\n/*! TSEN_SW_RESET - sw reset from CPU for sensor and controller */\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_SW_RESET(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_SW_RESET_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_SW_RESET_MASK)\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_SW_ENABLE_MASK (0x2U)\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_SW_ENABLE_SHIFT (1U)\r\n/*! TSEN_SW_ENABLE - sw enable from CPU for sensor and controller */\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_SW_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_SW_ENABLE_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_SW_ENABLE_MASK)\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_TRIGGER_MODE_MASK (0xCU)\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_TRIGGER_MODE_SHIFT (2U)\r\n/*! TSEN_TRIGGER_MODE - Trigger mode for sensor => DEFAULT: periodic */\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_TRIGGER_MODE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_TRIGGER_MODE_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_TRIGGER_MODE_MASK)\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_TESTMODE_MASK (0x10U)\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_TESTMODE_SHIFT (4U)\r\n/*! TSEN_TESTMODE - This bit is used to test sensor controller. */\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_TESTMODE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_TESTMODE_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_TESTMODE_MASK)\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_SW_TEMP_READ_EN_MASK (0x20U)\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_SW_TEMP_READ_EN_SHIFT (5U)\r\n/*! TSEN_SW_TEMP_READ_EN - SW based temperature reading enable for tsen (corresponding to tsen_trigger_mode = 1) */\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_SW_TEMP_READ_EN(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_SW_TEMP_READ_EN_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_SW_TEMP_READ_EN_MASK)\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_MIN_TEMP_THR_MASK (0x3FF00U)\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_MIN_TEMP_THR_SHIFT (8U)\r\n/*! TSEN_MIN_TEMP_THR - SW programmed minimum threshold for sensor. Default is -37C. */\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_MIN_TEMP_THR(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_MIN_TEMP_THR_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_MIN_TEMP_THR_MASK)\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_MAX_TEMP_THR_MASK (0x3FF00000U)\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_MAX_TEMP_THR_SHIFT (20U)\r\n/*! TSEN_MAX_TEMP_THR - SW programmed maximum threshold for sensor. Default is 137C. */\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_MAX_TEMP_THR(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_MAX_TEMP_THR_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_1_REG_1_TSEN_MAX_TEMP_THR_MASK)\r\n/*! @} */\r\n\r\n/*! @name TSEN_CTRL_1_REG_2 - TSEN Controller Output status register */\r\n/*! @{ */\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_2_TSEN_ERR_TEMP_PVALUE_MASK (0x3FFU)\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_2_TSEN_ERR_TEMP_PVALUE_SHIFT (0U)\r\n/*! TSEN_ERR_TEMP_PVALUE - The sensor reading captured at the time of *sen_error event -> this is for SW */\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_2_TSEN_ERR_TEMP_PVALUE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_1_REG_2_TSEN_ERR_TEMP_PVALUE_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_1_REG_2_TSEN_ERR_TEMP_PVALUE_MASK)\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_2_TSEN_TEMP_VALUE_MASK (0xFFC00U)\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_2_TSEN_TEMP_VALUE_SHIFT (10U)\r\n/*! TSEN_TEMP_VALUE - reading from last sensor sampling available for SW to read out */\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_2_TSEN_TEMP_VALUE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_1_REG_2_TSEN_TEMP_VALUE_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_1_REG_2_TSEN_TEMP_VALUE_MASK)\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_2_TSEN_ERROR_MASK (0x100000U)\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_2_TSEN_ERROR_SHIFT (20U)\r\n/*! TSEN_ERROR - Error indication from sensor */\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_2_TSEN_ERROR(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_1_REG_2_TSEN_ERROR_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_1_REG_2_TSEN_ERROR_MASK)\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_2_SW_ON_DEMAND_TSEN_RD_DONE_STATUS_MASK (0x200000U)\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_2_SW_ON_DEMAND_TSEN_RD_DONE_STATUS_SHIFT (21U)\r\n/*! SW_ON_DEMAND_TSEN_RD_DONE_STATUS - Indicates sensor value[19:10] is valid for case of sw_on_demand trigger mode. */\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_2_SW_ON_DEMAND_TSEN_RD_DONE_STATUS(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_1_REG_2_SW_ON_DEMAND_TSEN_RD_DONE_STATUS_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_1_REG_2_SW_ON_DEMAND_TSEN_RD_DONE_STATUS_MASK)\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_2_TSENDC_DEBUG_MASK (0xFFC00000U)\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_2_TSENDC_DEBUG_SHIFT (22U)\r\n/*! TSENDC_DEBUG - Field description: */\r\n#define SENSOR_CTRL_TSEN_CTRL_1_REG_2_TSENDC_DEBUG(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_1_REG_2_TSENDC_DEBUG_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_1_REG_2_TSENDC_DEBUG_MASK)\r\n/*! @} */\r\n\r\n/*! @name TSEN_CTRL_2_REG_1 - TSEN Controller configuration */\r\n/*! @{ */\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_SW_RESET_MASK (0x1U)\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_SW_RESET_SHIFT (0U)\r\n/*! TSEN_SW_RESET - sw reset from CPU for sensor and controller */\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_SW_RESET(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_SW_RESET_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_SW_RESET_MASK)\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_SW_ENABLE_MASK (0x2U)\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_SW_ENABLE_SHIFT (1U)\r\n/*! TSEN_SW_ENABLE - sw enable from CPU for sensor and controller(TSEN_PMIP is disabled by default) */\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_SW_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_SW_ENABLE_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_SW_ENABLE_MASK)\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_TRIGGER_MODE_MASK (0xCU)\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_TRIGGER_MODE_SHIFT (2U)\r\n/*! TSEN_TRIGGER_MODE - Trigger mode for sensor => DEFAULT: periodic */\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_TRIGGER_MODE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_TRIGGER_MODE_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_TRIGGER_MODE_MASK)\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_TESTMODE_MASK (0x10U)\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_TESTMODE_SHIFT (4U)\r\n/*! TSEN_TESTMODE - This bit is used to test sensor controller. */\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_TESTMODE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_TESTMODE_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_TESTMODE_MASK)\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_SW_TEMP_READ_EN_MASK (0x20U)\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_SW_TEMP_READ_EN_SHIFT (5U)\r\n/*! TSEN_SW_TEMP_READ_EN - SW based temperature reading enable for tsen (corresponding to tsen_trigger_mode = 1) */\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_SW_TEMP_READ_EN(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_SW_TEMP_READ_EN_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_SW_TEMP_READ_EN_MASK)\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_MIN_TEMP_THR_MASK (0x3FF00U)\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_MIN_TEMP_THR_SHIFT (8U)\r\n/*! TSEN_MIN_TEMP_THR - SW programmed minimum threshold for sensor. Default is -37C. */\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_MIN_TEMP_THR(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_MIN_TEMP_THR_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_MIN_TEMP_THR_MASK)\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_MAX_TEMP_THR_MASK (0x3FF00000U)\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_MAX_TEMP_THR_SHIFT (20U)\r\n/*! TSEN_MAX_TEMP_THR - SW programmed maximum threshold for sensor. Default is 137C */\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_MAX_TEMP_THR(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_MAX_TEMP_THR_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_2_REG_1_TSEN_MAX_TEMP_THR_MASK)\r\n/*! @} */\r\n\r\n/*! @name TSEN_CTRL_2_REG_2 - TSEN Controller Output status register */\r\n/*! @{ */\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_2_TSEN_ERR_TEMP_PVALUE_MASK (0x3FFU)\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_2_TSEN_ERR_TEMP_PVALUE_SHIFT (0U)\r\n/*! TSEN_ERR_TEMP_PVALUE - The sensor reading captured at the time of *sen_error event -> this is for SW */\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_2_TSEN_ERR_TEMP_PVALUE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_2_REG_2_TSEN_ERR_TEMP_PVALUE_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_2_REG_2_TSEN_ERR_TEMP_PVALUE_MASK)\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_2_TSEN_TEMP_VALUE_MASK (0xFFC00U)\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_2_TSEN_TEMP_VALUE_SHIFT (10U)\r\n/*! TSEN_TEMP_VALUE - reading from last sensor sampling available for SW to read out */\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_2_TSEN_TEMP_VALUE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_2_REG_2_TSEN_TEMP_VALUE_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_2_REG_2_TSEN_TEMP_VALUE_MASK)\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_2_TSEN_ERROR_MASK (0x100000U)\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_2_TSEN_ERROR_SHIFT (20U)\r\n/*! TSEN_ERROR - Error indication from sensor */\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_2_TSEN_ERROR(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_2_REG_2_TSEN_ERROR_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_2_REG_2_TSEN_ERROR_MASK)\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_2_SW_ON_DEMAND_TSEN_RD_DONE_STATUS_MASK (0x200000U)\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_2_SW_ON_DEMAND_TSEN_RD_DONE_STATUS_SHIFT (21U)\r\n/*! SW_ON_DEMAND_TSEN_RD_DONE_STATUS - Indicates sensor value[19:10] is valid for case of sw_on_demand trigger mode. */\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_2_SW_ON_DEMAND_TSEN_RD_DONE_STATUS(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_2_REG_2_SW_ON_DEMAND_TSEN_RD_DONE_STATUS_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_2_REG_2_SW_ON_DEMAND_TSEN_RD_DONE_STATUS_MASK)\r\n\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_2_TSENDC_DEBUG_MASK (0xFFC00000U)\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_2_TSENDC_DEBUG_SHIFT (22U)\r\n/*! TSENDC_DEBUG - Field description: */\r\n#define SENSOR_CTRL_TSEN_CTRL_2_REG_2_TSENDC_DEBUG(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_TSEN_CTRL_2_REG_2_TSENDC_DEBUG_SHIFT)) & SENSOR_CTRL_TSEN_CTRL_2_REG_2_TSENDC_DEBUG_MASK)\r\n/*! @} */\r\n\r\n/*! @name VSEN_CTRL_1_REG_1 - VSEN Controller configuration */\r\n/*! @{ */\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_SW_RESET_MASK (0x1U)\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_SW_RESET_SHIFT (0U)\r\n/*! VSEN_SW_RESET - sw reset from CPU for sensor and controller */\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_SW_RESET(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_SW_RESET_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_SW_RESET_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_SW_ENABLE_MASK (0x2U)\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_SW_ENABLE_SHIFT (1U)\r\n/*! VSEN_SW_ENABLE - sw enable from CPU for sensor and controller */\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_SW_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_SW_ENABLE_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_SW_ENABLE_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_TRIGGER_MODE_MASK (0xCU)\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_TRIGGER_MODE_SHIFT (2U)\r\n/*! VSEN_TRIGGER_MODE - Trigger mode for sensor => DEFAULT: periodic */\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_TRIGGER_MODE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_TRIGGER_MODE_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_TRIGGER_MODE_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_TESTMODE_MASK (0x10U)\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_TESTMODE_SHIFT (4U)\r\n/*! VSEN_TESTMODE - This bit is used to test sensor controller. */\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_TESTMODE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_TESTMODE_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_TESTMODE_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_SW_VOLTAGE_READ_EN_MASK (0x20U)\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_SW_VOLTAGE_READ_EN_SHIFT (5U)\r\n/*! VSEN_SW_VOLTAGE_READ_EN - SW based reading enable for sensor (corresponding to *sen_trigger_mode = 1) */\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_SW_VOLTAGE_READ_EN(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_SW_VOLTAGE_READ_EN_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_SW_VOLTAGE_READ_EN_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_MIN_VOLTAGE_THR_MASK (0x3FF00U)\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_MIN_VOLTAGE_THR_SHIFT (8U)\r\n/*! VSEN_MIN_VOLTAGE_THR - SW programmed minimum threshold for sensor. Default value is 0.925v. */\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_MIN_VOLTAGE_THR(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_MIN_VOLTAGE_THR_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_MIN_VOLTAGE_THR_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_MAX_VOLTAGE_THR_MASK (0x3FF00000U)\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_MAX_VOLTAGE_THR_SHIFT (20U)\r\n/*! VSEN_MAX_VOLTAGE_THR - SW programmed maximum threshold for sensor. Default */\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_MAX_VOLTAGE_THR(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_MAX_VOLTAGE_THR_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_MAX_VOLTAGE_THR_MASK)\r\n/*! @} */\r\n\r\n/*! @name VSEN_CTRL_1_REG_2 - VSEN Controller Output status register */\r\n/*! @{ */\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_2_VSEN_ERR_VOLTAGE_PVALUE_MASK (0x3FFU)\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_2_VSEN_ERR_VOLTAGE_PVALUE_SHIFT (0U)\r\n/*! VSEN_ERR_VOLTAGE_PVALUE - The sensor reading captured at the time of *sen_error event -> this is for SW */\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_2_VSEN_ERR_VOLTAGE_PVALUE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_1_REG_2_VSEN_ERR_VOLTAGE_PVALUE_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_1_REG_2_VSEN_ERR_VOLTAGE_PVALUE_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_2_VSEN_VOLTAGE_VALUE_MASK (0xFFC00U)\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_2_VSEN_VOLTAGE_VALUE_SHIFT (10U)\r\n/*! VSEN_VOLTAGE_VALUE - reading from last sensor sampling available for SW to read out */\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_2_VSEN_VOLTAGE_VALUE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_1_REG_2_VSEN_VOLTAGE_VALUE_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_1_REG_2_VSEN_VOLTAGE_VALUE_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_2_VSEN_ERROR_MASK (0x100000U)\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_2_VSEN_ERROR_SHIFT (20U)\r\n/*! VSEN_ERROR - Error indication from sensor */\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_2_VSEN_ERROR(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_1_REG_2_VSEN_ERROR_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_1_REG_2_VSEN_ERROR_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_2_SW_ON_DEMAND_VSEN_RD_DONE_STATUS_MASK (0x200000U)\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_2_SW_ON_DEMAND_VSEN_RD_DONE_STATUS_SHIFT (21U)\r\n/*! SW_ON_DEMAND_VSEN_RD_DONE_STATUS - Indicates sensor value[19:10] is valid for case of sw_on_demand trigger mode. */\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_2_SW_ON_DEMAND_VSEN_RD_DONE_STATUS(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_1_REG_2_SW_ON_DEMAND_VSEN_RD_DONE_STATUS_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_1_REG_2_SW_ON_DEMAND_VSEN_RD_DONE_STATUS_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_2_VSENDC_DEBUG_MASK (0xFFC00000U)\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_2_VSENDC_DEBUG_SHIFT (22U)\r\n/*! VSENDC_DEBUG - Field description: */\r\n#define SENSOR_CTRL_VSEN_CTRL_1_REG_2_VSENDC_DEBUG(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_1_REG_2_VSENDC_DEBUG_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_1_REG_2_VSENDC_DEBUG_MASK)\r\n/*! @} */\r\n\r\n/*! @name VSEN_CTRL_2_REG_1 - VSEN2 Controller configuration */\r\n/*! @{ */\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_SW_RESET_MASK (0x1U)\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_SW_RESET_SHIFT (0U)\r\n/*! VSEN_SW_RESET - sw reset from CPU for sensor and controller */\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_SW_RESET(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_SW_RESET_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_SW_RESET_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_SW_ENABLE_MASK (0x2U)\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_SW_ENABLE_SHIFT (1U)\r\n/*! VSEN_SW_ENABLE - sw enable from CPU for sensor and controller */\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_SW_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_SW_ENABLE_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_SW_ENABLE_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_TRIGGER_MODE_MASK (0xCU)\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_TRIGGER_MODE_SHIFT (2U)\r\n/*! VSEN_TRIGGER_MODE - Trigger mode for sensor => DEFAULT: periodic */\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_TRIGGER_MODE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_TRIGGER_MODE_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_TRIGGER_MODE_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_TESTMODE_MASK (0x10U)\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_TESTMODE_SHIFT (4U)\r\n/*! VSEN_TESTMODE - This bit is used to test sensor controller. */\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_TESTMODE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_TESTMODE_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_TESTMODE_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_SW_VOLTAGE_READ_EN_MASK (0x20U)\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_SW_VOLTAGE_READ_EN_SHIFT (5U)\r\n/*! VSEN_SW_VOLTAGE_READ_EN - SW based reading enable for sensor (corresponding to *sen_trigger_mode = 1) */\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_SW_VOLTAGE_READ_EN(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_SW_VOLTAGE_READ_EN_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_SW_VOLTAGE_READ_EN_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_MIN_VOLTAGE_THR_MASK (0x3FF00U)\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_MIN_VOLTAGE_THR_SHIFT (8U)\r\n/*! VSEN_MIN_VOLTAGE_THR - SW programmed minimum threshold for sensor. Default */\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_MIN_VOLTAGE_THR(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_MIN_VOLTAGE_THR_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_MIN_VOLTAGE_THR_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_MAX_VOLTAGE_THR_MASK (0x3FF00000U)\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_MAX_VOLTAGE_THR_SHIFT (20U)\r\n/*! VSEN_MAX_VOLTAGE_THR - SW programmed maximum threshold for sensor. Default */\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_MAX_VOLTAGE_THR(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_MAX_VOLTAGE_THR_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_MAX_VOLTAGE_THR_MASK)\r\n/*! @} */\r\n\r\n/*! @name VSEN_CTRL_2_REG_2 - VSEN2 Controller Output status register */\r\n/*! @{ */\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_2_VSEN_ERR_VOLTAGE_PVALUE_MASK (0x3FFU)\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_2_VSEN_ERR_VOLTAGE_PVALUE_SHIFT (0U)\r\n/*! VSEN_ERR_VOLTAGE_PVALUE - The sensor reading captured at the time of *sen_error event -> this is for SW */\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_2_VSEN_ERR_VOLTAGE_PVALUE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_2_REG_2_VSEN_ERR_VOLTAGE_PVALUE_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_2_REG_2_VSEN_ERR_VOLTAGE_PVALUE_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_2_VSEN_VOLTAGE_VALUE_MASK (0xFFC00U)\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_2_VSEN_VOLTAGE_VALUE_SHIFT (10U)\r\n/*! VSEN_VOLTAGE_VALUE - reading from last sensor sampling available for SW to read out */\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_2_VSEN_VOLTAGE_VALUE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_2_REG_2_VSEN_VOLTAGE_VALUE_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_2_REG_2_VSEN_VOLTAGE_VALUE_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_2_VSEN_ERROR_MASK (0x100000U)\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_2_VSEN_ERROR_SHIFT (20U)\r\n/*! VSEN_ERROR - Error indication from sensor */\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_2_VSEN_ERROR(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_2_REG_2_VSEN_ERROR_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_2_REG_2_VSEN_ERROR_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_2_SW_ON_DEMAND_VSEN_RD_DONE_STATUS_MASK (0x200000U)\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_2_SW_ON_DEMAND_VSEN_RD_DONE_STATUS_SHIFT (21U)\r\n/*! SW_ON_DEMAND_VSEN_RD_DONE_STATUS - Indicates sensor value[19:10] is valid for case of sw_on_demand trigger mode. */\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_2_SW_ON_DEMAND_VSEN_RD_DONE_STATUS(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_2_REG_2_SW_ON_DEMAND_VSEN_RD_DONE_STATUS_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_2_REG_2_SW_ON_DEMAND_VSEN_RD_DONE_STATUS_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_2_VSENDC_DEBUG_MASK (0xFFC00000U)\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_2_VSENDC_DEBUG_SHIFT (22U)\r\n/*! VSENDC_DEBUG - Field description: */\r\n#define SENSOR_CTRL_VSEN_CTRL_2_REG_2_VSENDC_DEBUG(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_2_REG_2_VSENDC_DEBUG_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_2_REG_2_VSENDC_DEBUG_MASK)\r\n/*! @} */\r\n\r\n/*! @name VSEN_CTRL_3_REG_1 - VSEN3 Controller configuration */\r\n/*! @{ */\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_SW_RESET_MASK (0x1U)\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_SW_RESET_SHIFT (0U)\r\n/*! VSEN_SW_RESET - sw reset from CPU for sensor and controller */\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_SW_RESET(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_SW_RESET_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_SW_RESET_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_SW_ENABLE_MASK (0x2U)\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_SW_ENABLE_SHIFT (1U)\r\n/*! VSEN_SW_ENABLE - sw enable from CPU for sensor and controller */\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_SW_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_SW_ENABLE_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_SW_ENABLE_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_TRIGGER_MODE_MASK (0xCU)\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_TRIGGER_MODE_SHIFT (2U)\r\n/*! VSEN_TRIGGER_MODE - Trigger mode for sensor => DEFAULT: periodic */\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_TRIGGER_MODE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_TRIGGER_MODE_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_TRIGGER_MODE_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_TESTMODE_MASK (0x10U)\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_TESTMODE_SHIFT (4U)\r\n/*! VSEN_TESTMODE - This bit is used to test sensor controller. */\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_TESTMODE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_TESTMODE_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_TESTMODE_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_SW_VOLTAGE_READ_EN_MASK (0x20U)\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_SW_VOLTAGE_READ_EN_SHIFT (5U)\r\n/*! VSEN_SW_VOLTAGE_READ_EN - SW based reading enable for sensor (corresponding to *sen_trigger_mode = 1) */\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_SW_VOLTAGE_READ_EN(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_SW_VOLTAGE_READ_EN_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_SW_VOLTAGE_READ_EN_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_MIN_VOLTAGE_THR_MASK (0x3FF00U)\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_MIN_VOLTAGE_THR_SHIFT (8U)\r\n/*! VSEN_MIN_VOLTAGE_THR - SW programmed minimum threshold for sensor. Default */\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_MIN_VOLTAGE_THR(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_MIN_VOLTAGE_THR_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_MIN_VOLTAGE_THR_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_MAX_VOLTAGE_THR_MASK (0x3FF00000U)\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_MAX_VOLTAGE_THR_SHIFT (20U)\r\n/*! VSEN_MAX_VOLTAGE_THR - SW programmed maximum threshold for sensor. Default */\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_MAX_VOLTAGE_THR(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_MAX_VOLTAGE_THR_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_MAX_VOLTAGE_THR_MASK)\r\n/*! @} */\r\n\r\n/*! @name VSEN_CTRL_3_REG_2 - VSEN3 Controller Output status register */\r\n/*! @{ */\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_2_VSEN_ERR_VOLTAGE_PVALUE_MASK (0x3FFU)\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_2_VSEN_ERR_VOLTAGE_PVALUE_SHIFT (0U)\r\n/*! VSEN_ERR_VOLTAGE_PVALUE - The sensor reading captured at the time of *sen_error event -> this is for SW */\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_2_VSEN_ERR_VOLTAGE_PVALUE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_3_REG_2_VSEN_ERR_VOLTAGE_PVALUE_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_3_REG_2_VSEN_ERR_VOLTAGE_PVALUE_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_2_VSEN_VOLTAGE_VALUE_MASK (0xFFC00U)\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_2_VSEN_VOLTAGE_VALUE_SHIFT (10U)\r\n/*! VSEN_VOLTAGE_VALUE - reading from last sensor sampling available for SW to read out */\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_2_VSEN_VOLTAGE_VALUE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_3_REG_2_VSEN_VOLTAGE_VALUE_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_3_REG_2_VSEN_VOLTAGE_VALUE_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_2_VSEN_ERROR_MASK (0x100000U)\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_2_VSEN_ERROR_SHIFT (20U)\r\n/*! VSEN_ERROR - Error indication from sensor */\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_2_VSEN_ERROR(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_3_REG_2_VSEN_ERROR_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_3_REG_2_VSEN_ERROR_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_2_SW_ON_DEMAND_VSEN_RD_DONE_STATUS_MASK (0x200000U)\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_2_SW_ON_DEMAND_VSEN_RD_DONE_STATUS_SHIFT (21U)\r\n/*! SW_ON_DEMAND_VSEN_RD_DONE_STATUS - Indicates sensor value[19:10] is valid for case of sw_on_demand trigger mode. */\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_2_SW_ON_DEMAND_VSEN_RD_DONE_STATUS(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_3_REG_2_SW_ON_DEMAND_VSEN_RD_DONE_STATUS_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_3_REG_2_SW_ON_DEMAND_VSEN_RD_DONE_STATUS_MASK)\r\n\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_2_VSENDC_DEBUG_MASK (0xFFC00000U)\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_2_VSENDC_DEBUG_SHIFT (22U)\r\n/*! VSENDC_DEBUG - Field description: */\r\n#define SENSOR_CTRL_VSEN_CTRL_3_REG_2_VSENDC_DEBUG(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VSEN_CTRL_3_REG_2_VSENDC_DEBUG_SHIFT)) & SENSOR_CTRL_VSEN_CTRL_3_REG_2_VSENDC_DEBUG_MASK)\r\n/*! @} */\r\n\r\n/*! @name VGLITCH_CTRL_REG_1 - Voltage Glitch sensor controller configuration */\r\n/*! @{ */\r\n\r\n#define SENSOR_CTRL_VGLITCH_CTRL_REG_1_VGLITCH_SW_ENABLE_MASK (0x2U)\r\n#define SENSOR_CTRL_VGLITCH_CTRL_REG_1_VGLITCH_SW_ENABLE_SHIFT (1U)\r\n/*! VGLITCH_SW_ENABLE - sw enable from CPU for Glitch Sensor */\r\n#define SENSOR_CTRL_VGLITCH_CTRL_REG_1_VGLITCH_SW_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VGLITCH_CTRL_REG_1_VGLITCH_SW_ENABLE_SHIFT)) & SENSOR_CTRL_VGLITCH_CTRL_REG_1_VGLITCH_SW_ENABLE_MASK)\r\n\r\n#define SENSOR_CTRL_VGLITCH_CTRL_REG_1_VGLITCH_TESMODE_MASK (0x4U)\r\n#define SENSOR_CTRL_VGLITCH_CTRL_REG_1_VGLITCH_TESMODE_SHIFT (2U)\r\n/*! VGLITCH_TESMODE - Testmode enable from CPU for Glitch Sensor */\r\n#define SENSOR_CTRL_VGLITCH_CTRL_REG_1_VGLITCH_TESMODE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VGLITCH_CTRL_REG_1_VGLITCH_TESMODE_SHIFT)) & SENSOR_CTRL_VGLITCH_CTRL_REG_1_VGLITCH_TESMODE_MASK)\r\n\r\n#define SENSOR_CTRL_VGLITCH_CTRL_REG_1_VGLITCH_ERROR_MASK (0x10U)\r\n#define SENSOR_CTRL_VGLITCH_CTRL_REG_1_VGLITCH_ERROR_SHIFT (4U)\r\n/*! VGLITCH_ERROR - Error indication from Voltage glitch sensor */\r\n#define SENSOR_CTRL_VGLITCH_CTRL_REG_1_VGLITCH_ERROR(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_VGLITCH_CTRL_REG_1_VGLITCH_ERROR_SHIFT)) & SENSOR_CTRL_VGLITCH_CTRL_REG_1_VGLITCH_ERROR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MISC_CTRL_REG - Miscellaneous controls */\r\n/*! @{ */\r\n\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_1_ENABLE_MASK (0x1U)\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_1_ENABLE_SHIFT (0U)\r\n/*! TIMER_1_ENABLE - enables the timer for sensor to start counting */\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_1_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_MISC_CTRL_REG_TIMER_1_ENABLE_SHIFT)) & SENSOR_CTRL_MISC_CTRL_REG_TIMER_1_ENABLE_MASK)\r\n\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_1_PERIOD_MASK (0xEU)\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_1_PERIOD_SHIFT (1U)\r\n/*! TIMER_1_PERIOD - Pre defined sampling periods for this sensor */\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_1_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_MISC_CTRL_REG_TIMER_1_PERIOD_SHIFT)) & SENSOR_CTRL_MISC_CTRL_REG_TIMER_1_PERIOD_MASK)\r\n\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_2_ENABLE_MASK (0x10U)\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_2_ENABLE_SHIFT (4U)\r\n/*! TIMER_2_ENABLE - enables the timer for sensor to start counting */\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_2_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_MISC_CTRL_REG_TIMER_2_ENABLE_SHIFT)) & SENSOR_CTRL_MISC_CTRL_REG_TIMER_2_ENABLE_MASK)\r\n\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_2_PERIOD_MASK (0xE0U)\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_2_PERIOD_SHIFT (5U)\r\n/*! TIMER_2_PERIOD - Pre defined sampling periods for this sensor */\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_2_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_MISC_CTRL_REG_TIMER_2_PERIOD_SHIFT)) & SENSOR_CTRL_MISC_CTRL_REG_TIMER_2_PERIOD_MASK)\r\n\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_3_ENABLE_MASK (0x100U)\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_3_ENABLE_SHIFT (8U)\r\n/*! TIMER_3_ENABLE - enables the timer for sensor to start counting */\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_3_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_MISC_CTRL_REG_TIMER_3_ENABLE_SHIFT)) & SENSOR_CTRL_MISC_CTRL_REG_TIMER_3_ENABLE_MASK)\r\n\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_3_PERIOD_MASK (0xE00U)\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_3_PERIOD_SHIFT (9U)\r\n/*! TIMER_3_PERIOD - Pre defined sampling periods for this sensor */\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_3_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_MISC_CTRL_REG_TIMER_3_PERIOD_SHIFT)) & SENSOR_CTRL_MISC_CTRL_REG_TIMER_3_PERIOD_MASK)\r\n\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_4_ENABLE_MASK (0x1000U)\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_4_ENABLE_SHIFT (12U)\r\n/*! TIMER_4_ENABLE - enables the timer for sensor to start counting */\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_4_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_MISC_CTRL_REG_TIMER_4_ENABLE_SHIFT)) & SENSOR_CTRL_MISC_CTRL_REG_TIMER_4_ENABLE_MASK)\r\n\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_4_PERIOD_MASK (0xE000U)\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_4_PERIOD_SHIFT (13U)\r\n/*! TIMER_4_PERIOD - Pre defined sampling periods for this sensor */\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_4_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_MISC_CTRL_REG_TIMER_4_PERIOD_SHIFT)) & SENSOR_CTRL_MISC_CTRL_REG_TIMER_4_PERIOD_MASK)\r\n\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_5_ENABLE_MASK (0x10000U)\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_5_ENABLE_SHIFT (16U)\r\n/*! TIMER_5_ENABLE - enables the timer for sensor to start counting */\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_5_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_MISC_CTRL_REG_TIMER_5_ENABLE_SHIFT)) & SENSOR_CTRL_MISC_CTRL_REG_TIMER_5_ENABLE_MASK)\r\n\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_5_PERIOD_MASK (0xE0000U)\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_5_PERIOD_SHIFT (17U)\r\n/*! TIMER_5_PERIOD - Pre defined sampling periods for this sensor */\r\n#define SENSOR_CTRL_MISC_CTRL_REG_TIMER_5_PERIOD(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_MISC_CTRL_REG_TIMER_5_PERIOD_SHIFT)) & SENSOR_CTRL_MISC_CTRL_REG_TIMER_5_PERIOD_MASK)\r\n/*! @} */\r\n\r\n/*! @name CFG_ERR_STATUS_REG - CFG ERROR Control */\r\n/*! @{ */\r\n\r\n#define SENSOR_CTRL_CFG_ERR_STATUS_REG_TB_SEL_MASK (0x7U)\r\n#define SENSOR_CTRL_CFG_ERR_STATUS_REG_TB_SEL_SHIFT (0U)\r\n/*! TB_SEL - Select Testbus that can go to GPIO */\r\n#define SENSOR_CTRL_CFG_ERR_STATUS_REG_TB_SEL(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_CFG_ERR_STATUS_REG_TB_SEL_SHIFT)) & SENSOR_CTRL_CFG_ERR_STATUS_REG_TB_SEL_MASK)\r\n\r\n#define SENSOR_CTRL_CFG_ERR_STATUS_REG_SEC_CFG_ERR_MASK (0x100U)\r\n#define SENSOR_CTRL_CFG_ERR_STATUS_REG_SEC_CFG_ERR_SHIFT (8U)\r\n/*! SEC_CFG_ERR - Indication to SW that Sensor config Registers are has Errors. Original and shadow registers are not same */\r\n#define SENSOR_CTRL_CFG_ERR_STATUS_REG_SEC_CFG_ERR(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_CFG_ERR_STATUS_REG_SEC_CFG_ERR_SHIFT)) & SENSOR_CTRL_CFG_ERR_STATUS_REG_SEC_CFG_ERR_MASK)\r\n\r\n#define SENSOR_CTRL_CFG_ERR_STATUS_REG_SEC_SEN_ERR_MASK_MASK (0x7F0000U)\r\n#define SENSOR_CTRL_CFG_ERR_STATUS_REG_SEC_SEN_ERR_MASK_SHIFT (16U)\r\n/*! SEC_SEN_ERR_MASK - SW Mask control bit for sensor Error. */\r\n#define SENSOR_CTRL_CFG_ERR_STATUS_REG_SEC_SEN_ERR_MASK(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_CFG_ERR_STATUS_REG_SEC_SEN_ERR_MASK_SHIFT)) & SENSOR_CTRL_CFG_ERR_STATUS_REG_SEC_SEN_ERR_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name SEN_CLR_REG - CFG ERROR Control */\r\n/*! @{ */\r\n\r\n#define SENSOR_CTRL_SEN_CLR_REG_SEN_ERR_CLR_MASK (0x7FU)\r\n#define SENSOR_CTRL_SEN_CLR_REG_SEN_ERR_CLR_SHIFT (0U)\r\n/*! SEN_ERR_CLR - SW control to clear error status of Sensor. */\r\n#define SENSOR_CTRL_SEN_CLR_REG_SEN_ERR_CLR(x)   (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_SEN_CLR_REG_SEN_ERR_CLR_SHIFT)) & SENSOR_CTRL_SEN_CLR_REG_SEN_ERR_CLR_MASK)\r\n\r\n#define SENSOR_CTRL_SEN_CLR_REG_SEN_RD_DONE_CLR_MASK (0x1F00U)\r\n#define SENSOR_CTRL_SEN_CLR_REG_SEN_RD_DONE_CLR_SHIFT (8U)\r\n/*! SEN_RD_DONE_CLR - SW control to clear read done status bit of Sensor in case of trigger mode set to on demand. */\r\n#define SENSOR_CTRL_SEN_CLR_REG_SEN_RD_DONE_CLR(x) (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_SEN_CLR_REG_SEN_RD_DONE_CLR_SHIFT)) & SENSOR_CTRL_SEN_CLR_REG_SEN_RD_DONE_CLR_MASK)\r\n/*! @} */\r\n\r\n/*! @name SEC_ECO_REG - ECO Bits */\r\n/*! @{ */\r\n\r\n#define SENSOR_CTRL_SEC_ECO_REG_ECO_BITS_MASK    (0xFFFFFFFFU)\r\n#define SENSOR_CTRL_SEC_ECO_REG_ECO_BITS_SHIFT   (0U)\r\n/*! ECO_BITS - Reserved for ECOs */\r\n#define SENSOR_CTRL_SEC_ECO_REG_ECO_BITS(x)      (((uint32_t)(((uint32_t)(x)) << SENSOR_CTRL_SEC_ECO_REG_ECO_BITS_SHIFT)) & SENSOR_CTRL_SEC_ECO_REG_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SENSOR_CTRL_Register_Masks */\r\n\r\n\r\n/* SENSOR_CTRL - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral SENSOR_CTRL base address */\r\n  #define SENSOR_CTRL_BASE                         (0x55004000u)\r\n  /** Peripheral SENSOR_CTRL base address */\r\n  #define SENSOR_CTRL_BASE_NS                      (0x45004000u)\r\n  /** Peripheral SENSOR_CTRL base pointer */\r\n  #define SENSOR_CTRL                              ((SENSOR_CTRL_Type *)SENSOR_CTRL_BASE)\r\n  /** Peripheral SENSOR_CTRL base pointer */\r\n  #define SENSOR_CTRL_NS                           ((SENSOR_CTRL_Type *)SENSOR_CTRL_BASE_NS)\r\n  /** Array initializer of SENSOR_CTRL peripheral base addresses */\r\n  #define SENSOR_CTRL_BASE_ADDRS                   { SENSOR_CTRL_BASE }\r\n  /** Array initializer of SENSOR_CTRL peripheral base pointers */\r\n  #define SENSOR_CTRL_BASE_PTRS                    { SENSOR_CTRL }\r\n  /** Array initializer of SENSOR_CTRL peripheral base addresses */\r\n  #define SENSOR_CTRL_BASE_ADDRS_NS                { SENSOR_CTRL_BASE_NS }\r\n  /** Array initializer of SENSOR_CTRL peripheral base pointers */\r\n  #define SENSOR_CTRL_BASE_PTRS_NS                 { SENSOR_CTRL_NS }\r\n#else\r\n  /** Peripheral SENSOR_CTRL base address */\r\n  #define SENSOR_CTRL_BASE                         (0x45004000u)\r\n  /** Peripheral SENSOR_CTRL base pointer */\r\n  #define SENSOR_CTRL                              ((SENSOR_CTRL_Type *)SENSOR_CTRL_BASE)\r\n  /** Array initializer of SENSOR_CTRL peripheral base addresses */\r\n  #define SENSOR_CTRL_BASE_ADDRS                   { SENSOR_CTRL_BASE }\r\n  /** Array initializer of SENSOR_CTRL peripheral base pointers */\r\n  #define SENSOR_CTRL_BASE_PTRS                    { SENSOR_CTRL }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SENSOR_CTRL_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SOCCIU Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SOCCIU_Peripheral_Access_Layer SOCCIU Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** SOCCIU - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t PAD_CONFIG0;                       /**< \", offset: 0x0 */\r\n       uint8_t RESERVED_0[4];\r\n  __IO uint32_t PAD_PWRDOWN_CTRL0;                 /**< Pad Power-down Control 0, offset: 0x8 */\r\n  __IO uint32_t PAD_PWRDOWN_CTRL1;                 /**< Pad Power-down Control 1, offset: 0xC */\r\n  __IO uint32_t PAD_PWRDOWN_CTRL2;                 /**< Pad Power-down Control 2, offset: 0x10 */\r\n  __IO uint32_t PAD_PWRDOWN_CTRL3;                 /**< Pad Power-down Control 3, offset: 0x14 */\r\n  __IO uint32_t PAD_PWRDOWN_CTRL4;                 /**< Pad Power-down Control 4, offset: 0x18 */\r\n       uint8_t RESERVED_1[16];\r\n  __IO uint32_t PAD_PWRDOWN_CTRL5;                 /**< Pad Power-down Control 5, offset: 0x2C */\r\n  __IO uint32_t PAD_RF_SW_SLP_CONFIG;              /**< RF Switch Pad Sleep Mode Configuration, offset: 0x30 */\r\n  __IO uint32_t PAD_ATEST_SW_SLP_CONFIG;           /**< ATEST Pad Sleep Mode Configuration, offset: 0x34 */\r\n       uint8_t RESERVED_2[20];\r\n  __IO uint32_t SR_CONFIG0;                        /**< GPIO Slew Rate control, offset: 0x4C */\r\n  __IO uint32_t SR_CONFIG1;                        /**< GPIO Slew Rate control, offset: 0x50 */\r\n  __IO uint32_t SR_CONFIG2;                        /**< GPIO Slew Rate control, offset: 0x54 */\r\n  __IO uint32_t SR_CONFIG3;                        /**< GPIO Slew Rate control, offset: 0x58 */\r\n       uint8_t RESERVED_3[8];\r\n  __IO uint32_t SR_CONFIG4;                        /**< GPIO Slew Rate control, offset: 0x64 */\r\n  __IO uint32_t PAD_WKUP0;                         /**< Pad Wakeup Mode Enable, offset: 0x68 */\r\n       uint8_t RESERVED_4[4];\r\n  __IO uint32_t PAD_PU_PD_EN0;                     /**< Pad Pull-up Pull-down Enable1, offset: 0x70 */\r\n  __IO uint32_t PAD_PU_PD_EN1;                     /**< Pad Pull-up Pull-down Enable2, offset: 0x74 */\r\n  __IO uint32_t PAD_PU_PD_EN2;                     /**< Pad Pull-up Pull-down Enable2, offset: 0x78 */\r\n  __IO uint32_t PAD_PU_PD_EN3;                     /**< Pad Pull-up Pull-down Enable2, offset: 0x7C */\r\n       uint8_t RESERVED_5[8];\r\n  __IO uint32_t PAD_PU_PD_EN4;                     /**< Pad Pull-up Pull-down Enable2, offset: 0x88 */\r\n  __IO uint32_t PAD_SLP_EN0;                       /**< Pad Sleep Mode Enable, offset: 0x8C */\r\n  __IO uint32_t PAD_SLP_EN1;                       /**< Pad Sleep Mode Enable, offset: 0x90 */\r\n       uint8_t RESERVED_6[4];\r\n  __IO uint32_t PAD_SLP_VAL0;                      /**< Pad Sleep Mode Value, offset: 0x98 */\r\n  __IO uint32_t PAD_SLP_VAL1;                      /**< Pad Sleep Mode Value, offset: 0x9C */\r\n       uint8_t RESERVED_7[96];\r\n  __I  uint32_t PSW_VD2_RDY0;                      /**< Power Switch VD2_RDY Status, offset: 0x100 */\r\n  __IO uint32_t PSW_ECO_CTRL;                      /**< Power Switch ECO Control, offset: 0x104 */\r\n  __IO uint32_t CLK_SW;                            /**< Clock Controls for SOC_CLK_TOP, offset: 0x108 */\r\n  __IO uint32_t RST_SW;                            /**< Reset Controls for SOC_RESET_GEN, offset: 0x10C */\r\n       uint8_t RESERVED_8[4];\r\n  __I  uint32_t CHIP_INFO;                         /**< Chip Information, offset: 0x114 */\r\n       uint8_t RESERVED_9[28];\r\n  __IO uint32_t MCI_POWER_MODE_STATUS;             /**< MCI POWER MODE Status, offset: 0x134 */\r\n  __I  uint32_t PSW_VD2_RDY1;                      /**< Power Switch VD2_RDY Status, offset: 0x138 */\r\n       uint8_t RESERVED_10[4];\r\n  __IO uint32_t WLAN_POWER_STATUS;                 /**< WLAN POWER Status, offset: 0x140 */\r\n  __IO uint32_t BLE_POWER_STATUS;                  /**< BLE POWER Status, offset: 0x144 */\r\n       uint8_t RESERVED_11[184];\r\n  __IO uint32_t PAD_VREG_VSENSOR_CTRL;             /**< Vsensor and Vreg Pad Control, offset: 0x200 */\r\n       uint8_t RESERVED_12[4];\r\n  __IO uint32_t PAD_RF_VREG_VSENSOR_CTRL;          /**< RF Vsensor and Vreg Pad Control, offset: 0x208 */\r\n       uint8_t RESERVED_13[16];\r\n  __IO uint32_t PAD_SD_VREG_VSENSOR_CTRL;          /**< SD Vsensor and Vreg Pad Control, offset: 0x21C */\r\n       uint8_t RESERVED_14[348];\r\n  __IO uint32_t PAD_ECO_CTRL;                      /**< Pad ECO Control, offset: 0x37C */\r\n       uint8_t RESERVED_15[164];\r\n  __IO uint32_t TST_TSTBUS_CTRL1;                  /**< Testbus Mux Control1, offset: 0x424 */\r\n  __IO uint32_t TST_TSTBUS_CTRL2;                  /**< Testbus Mux Control2, offset: 0x428 */\r\n       uint8_t RESERVED_16[4];\r\n  __I  uint32_t TST_CTRL;                          /**< Test Control, offset: 0x430 */\r\n       uint8_t RESERVED_17[72];\r\n  __IO uint32_t TST_ECO_CTRL;                      /**< Test ECO Control, offset: 0x47C */\r\n       uint8_t RESERVED_18[8];\r\n  __IO uint32_t DRO_CTRL;                          /**< DRO Control, offset: 0x488 */\r\n  __I  uint32_t DRO_1_2_CNT;                       /**< DRO1 and DRO2 Counter Read back, offset: 0x48C */\r\n  __I  uint32_t DRO_3_CNT;                         /**< DRO3 Counter Read back, offset: 0x490 */\r\n       uint8_t RESERVED_19[4];\r\n  __IO uint32_t DRO_PAR_SEL;                       /**< DRO Parallel Counter Selection, offset: 0x498 */\r\n  __IO uint32_t CLK_SOCCLK_CTRL;                   /**< SOC Clock Control, offset: 0x49C */\r\n       uint8_t RESERVED_20[96];\r\n  __IO uint32_t PAD_SLP_PU_PD_DIS0;                /**< Pad Sleep Pullup and Pulldown Disable1, offset: 0x500 */\r\n  __IO uint32_t PAD_SLP_PU_PD_DIS1;                /**< Pad Sleep Pullup and Pulldown Disable2, offset: 0x504 */\r\n       uint8_t RESERVED_21[8];\r\n  __IO uint32_t PAD_SLP_PU_PD_DIS2;                /**< Pad Sleep Pullup and Pulldown Disable4, offset: 0x510 */\r\n  __IO uint32_t PAD_GPIO;                          /**< GPIO Enable, offset: 0x514 */\r\n       uint8_t RESERVED_22[32];\r\n  __IO uint32_t MCI_IOMUX_EN0;                     /**< mci_iomux_enable control for GPIO[31:28] and GPIO[21:0], offset: 0x538 */\r\n  __IO uint32_t MCI_IOMUX_EN1;                     /**< mci_iomux_enable control for GPIO[63:32], offset: 0x53C */\r\n       uint8_t RESERVED_23[840];\r\n  __IO uint32_t CAU_CTRL;                          /**< CAU Control, offset: 0x888 */\r\n       uint8_t RESERVED_24[24];\r\n  __I  uint32_t SYSPLL_CTRL;                       /**< SYSPLL Control, offset: 0x8A4 */\r\n} SOCCIU_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SOCCIU Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SOCCIU_Register_Masks SOCCIU Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name PAD_CONFIG0 - \" */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_CONFIG0_ALL_PADS_TRISTATE_EN_MASK (0x1U)\r\n#define SOCCIU_PAD_CONFIG0_ALL_PADS_TRISTATE_EN_SHIFT (0U)\r\n/*! ALL_PADS_TRISTATE_EN - Enable/disable Control for Pad Tristate */\r\n#define SOCCIU_PAD_CONFIG0_ALL_PADS_TRISTATE_EN(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_CONFIG0_ALL_PADS_TRISTATE_EN_SHIFT)) & SOCCIU_PAD_CONFIG0_ALL_PADS_TRISTATE_EN_MASK)\r\n\r\n#define SOCCIU_PAD_CONFIG0_PAD_PWRDOWN_LATCH_MASK (0x2U)\r\n#define SOCCIU_PAD_CONFIG0_PAD_PWRDOWN_LATCH_SHIFT (1U)\r\n/*! PAD_PWRDOWN_LATCH - Enables the pd_sel latching */\r\n#define SOCCIU_PAD_CONFIG0_PAD_PWRDOWN_LATCH(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_CONFIG0_PAD_PWRDOWN_LATCH_SHIFT)) & SOCCIU_PAD_CONFIG0_PAD_PWRDOWN_LATCH_MASK)\r\n\r\n#define SOCCIU_PAD_CONFIG0_RF_CNTL0_ATEST_EN_MASK (0x8U)\r\n#define SOCCIU_PAD_CONFIG0_RF_CNTL0_ATEST_EN_SHIFT (3U)\r\n/*! RF_CNTL0_ATEST_EN - RF_CNTL0 pad ATEST mode Enable */\r\n#define SOCCIU_PAD_CONFIG0_RF_CNTL0_ATEST_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_CONFIG0_RF_CNTL0_ATEST_EN_SHIFT)) & SOCCIU_PAD_CONFIG0_RF_CNTL0_ATEST_EN_MASK)\r\n\r\n#define SOCCIU_PAD_CONFIG0_RF_CNTL1_ATEST_EN_MASK (0x10U)\r\n#define SOCCIU_PAD_CONFIG0_RF_CNTL1_ATEST_EN_SHIFT (4U)\r\n/*! RF_CNTL1_ATEST_EN - RF_CNTL1 pad ATEST mode Enable */\r\n#define SOCCIU_PAD_CONFIG0_RF_CNTL1_ATEST_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_CONFIG0_RF_CNTL1_ATEST_EN_SHIFT)) & SOCCIU_PAD_CONFIG0_RF_CNTL1_ATEST_EN_MASK)\r\n\r\n#define SOCCIU_PAD_CONFIG0_RF_CNTL2_ATEST_EN_MASK (0x20U)\r\n#define SOCCIU_PAD_CONFIG0_RF_CNTL2_ATEST_EN_SHIFT (5U)\r\n/*! RF_CNTL2_ATEST_EN - RF_CNTL2 pad ATEST mode Enable */\r\n#define SOCCIU_PAD_CONFIG0_RF_CNTL2_ATEST_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_CONFIG0_RF_CNTL2_ATEST_EN_SHIFT)) & SOCCIU_PAD_CONFIG0_RF_CNTL2_ATEST_EN_MASK)\r\n\r\n#define SOCCIU_PAD_CONFIG0_RF_CNTL3_ATEST_EN_MASK (0x40U)\r\n#define SOCCIU_PAD_CONFIG0_RF_CNTL3_ATEST_EN_SHIFT (6U)\r\n/*! RF_CNTL3_ATEST_EN - RF_CNTL3 pad ATEST mode Enable */\r\n#define SOCCIU_PAD_CONFIG0_RF_CNTL3_ATEST_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_CONFIG0_RF_CNTL3_ATEST_EN_SHIFT)) & SOCCIU_PAD_CONFIG0_RF_CNTL3_ATEST_EN_MASK)\r\n\r\n#define SOCCIU_PAD_CONFIG0_ATEST_EN_3_0_MASK     (0x780U)\r\n#define SOCCIU_PAD_CONFIG0_ATEST_EN_3_0_SHIFT    (7U)\r\n/*! ATEST_EN_3_0 - ATEST Pin Force Bits */\r\n#define SOCCIU_PAD_CONFIG0_ATEST_EN_3_0(x)       (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_CONFIG0_ATEST_EN_3_0_SHIFT)) & SOCCIU_PAD_CONFIG0_ATEST_EN_3_0_MASK)\r\n\r\n#define SOCCIU_PAD_CONFIG0_PAD_XOSC_EN_SEL_MASK  (0x800U)\r\n#define SOCCIU_PAD_CONFIG0_PAD_XOSC_EN_SEL_SHIFT (11U)\r\n/*! PAD_XOSC_EN_SEL - PAD XOSC Enable Control */\r\n#define SOCCIU_PAD_CONFIG0_PAD_XOSC_EN_SEL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_CONFIG0_PAD_XOSC_EN_SEL_SHIFT)) & SOCCIU_PAD_CONFIG0_PAD_XOSC_EN_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_CONFIG0_ATEST_DIS_STDALONE_MODE_3_0_MASK (0xF000U)\r\n#define SOCCIU_PAD_CONFIG0_ATEST_DIS_STDALONE_MODE_3_0_SHIFT (12U)\r\n/*! ATEST_DIS_STDALONE_MODE_3_0 - ATEST Pin Force disable Bits in standalone mode */\r\n#define SOCCIU_PAD_CONFIG0_ATEST_DIS_STDALONE_MODE_3_0(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_CONFIG0_ATEST_DIS_STDALONE_MODE_3_0_SHIFT)) & SOCCIU_PAD_CONFIG0_ATEST_DIS_STDALONE_MODE_3_0_MASK)\r\n\r\n#define SOCCIU_PAD_CONFIG0_RFU_STDALONE_MASK     (0x40000U)\r\n#define SOCCIU_PAD_CONFIG0_RFU_STDALONE_SHIFT    (18U)\r\n/*! RFU_STDALONE - RFU Standalone */\r\n#define SOCCIU_PAD_CONFIG0_RFU_STDALONE(x)       (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_CONFIG0_RFU_STDALONE_SHIFT)) & SOCCIU_PAD_CONFIG0_RFU_STDALONE_MASK)\r\n\r\n#define SOCCIU_PAD_CONFIG0_CAU_STDALONE_MASK     (0x80000U)\r\n#define SOCCIU_PAD_CONFIG0_CAU_STDALONE_SHIFT    (19U)\r\n/*! CAU_STDALONE - CAU Standalone */\r\n#define SOCCIU_PAD_CONFIG0_CAU_STDALONE(x)       (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_CONFIG0_CAU_STDALONE_SHIFT)) & SOCCIU_PAD_CONFIG0_CAU_STDALONE_MASK)\r\n\r\n#define SOCCIU_PAD_CONFIG0_BRF_STDALONE_MASK     (0x100000U)\r\n#define SOCCIU_PAD_CONFIG0_BRF_STDALONE_SHIFT    (20U)\r\n/*! BRF_STDALONE - BRF Standalone */\r\n#define SOCCIU_PAD_CONFIG0_BRF_STDALONE(x)       (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_CONFIG0_BRF_STDALONE_SHIFT)) & SOCCIU_PAD_CONFIG0_BRF_STDALONE_MASK)\r\n\r\n#define SOCCIU_PAD_CONFIG0_BRF_W3_SOC_MASTER_SEL_MASK (0x400000U)\r\n#define SOCCIU_PAD_CONFIG0_BRF_W3_SOC_MASTER_SEL_SHIFT (22U)\r\n/*! BRF_W3_SOC_MASTER_SEL - BRF 3-Wire SoC Master Select */\r\n#define SOCCIU_PAD_CONFIG0_BRF_W3_SOC_MASTER_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_CONFIG0_BRF_W3_SOC_MASTER_SEL_SHIFT)) & SOCCIU_PAD_CONFIG0_BRF_W3_SOC_MASTER_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_CONFIG0_BT_DBG_UART_MODE_MASK (0x1000000U)\r\n#define SOCCIU_PAD_CONFIG0_BT_DBG_UART_MODE_SHIFT (24U)\r\n/*! BT_DBG_UART_MODE - BT Debug Uart Mode */\r\n#define SOCCIU_PAD_CONFIG0_BT_DBG_UART_MODE(x)   (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_CONFIG0_BT_DBG_UART_MODE_SHIFT)) & SOCCIU_PAD_CONFIG0_BT_DBG_UART_MODE_MASK)\r\n\r\n#define SOCCIU_PAD_CONFIG0_WLAN_DBG_UART_MODE_4PIN_MASK (0x2000000U)\r\n#define SOCCIU_PAD_CONFIG0_WLAN_DBG_UART_MODE_4PIN_SHIFT (25U)\r\n/*! WLAN_DBG_UART_MODE_4PIN - WLAN 4 Pin Debug Uart Mode */\r\n#define SOCCIU_PAD_CONFIG0_WLAN_DBG_UART_MODE_4PIN(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_CONFIG0_WLAN_DBG_UART_MODE_4PIN_SHIFT)) & SOCCIU_PAD_CONFIG0_WLAN_DBG_UART_MODE_4PIN_MASK)\r\n\r\n#define SOCCIU_PAD_CONFIG0_BT_DBG_UART_MODE_4PIN_MASK (0x4000000U)\r\n#define SOCCIU_PAD_CONFIG0_BT_DBG_UART_MODE_4PIN_SHIFT (26U)\r\n/*! BT_DBG_UART_MODE_4PIN - BT 4 pin Debug Uart Mode */\r\n#define SOCCIU_PAD_CONFIG0_BT_DBG_UART_MODE_4PIN(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_CONFIG0_BT_DBG_UART_MODE_4PIN_SHIFT)) & SOCCIU_PAD_CONFIG0_BT_DBG_UART_MODE_4PIN_MASK)\r\n\r\n#define SOCCIU_PAD_CONFIG0_TRACE_PORT_MODE_CPU_MASK (0x10000000U)\r\n#define SOCCIU_PAD_CONFIG0_TRACE_PORT_MODE_CPU_SHIFT (28U)\r\n/*! TRACE_PORT_MODE_CPU - Trace port mode enable */\r\n#define SOCCIU_PAD_CONFIG0_TRACE_PORT_MODE_CPU(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_CONFIG0_TRACE_PORT_MODE_CPU_SHIFT)) & SOCCIU_PAD_CONFIG0_TRACE_PORT_MODE_CPU_MASK)\r\n\r\n#define SOCCIU_PAD_CONFIG0_LED_MODE_MASK         (0x20000000U)\r\n#define SOCCIU_PAD_CONFIG0_LED_MODE_SHIFT        (29U)\r\n/*! LED_MODE - to enable disable led mode */\r\n#define SOCCIU_PAD_CONFIG0_LED_MODE(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_CONFIG0_LED_MODE_SHIFT)) & SOCCIU_PAD_CONFIG0_LED_MODE_MASK)\r\n\r\n#define SOCCIU_PAD_CONFIG0_SD_D3_PU_CTRL_MASK    (0x40000000U)\r\n#define SOCCIU_PAD_CONFIG0_SD_D3_PU_CTRL_SHIFT   (30U)\r\n/*! SD_D3_PU_CTRL - SD D3 PU Control function */\r\n#define SOCCIU_PAD_CONFIG0_SD_D3_PU_CTRL(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_CONFIG0_SD_D3_PU_CTRL_SHIFT)) & SOCCIU_PAD_CONFIG0_SD_D3_PU_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_PWRDOWN_CTRL0 - Pad Power-down Control 0 */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO0_PD_SEL_MASK (0x7U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO0_PD_SEL_SHIFT (0U)\r\n/*! GPIO0_PD_SEL - Power down output value for GPIO[0] pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO0_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL0_GPIO0_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL0_GPIO0_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO1_PD_SEL_MASK (0x70U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO1_PD_SEL_SHIFT (4U)\r\n/*! GPIO1_PD_SEL - Power Down Output Value for GPIO[1] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO1_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL0_GPIO1_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL0_GPIO1_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO2_PD_SEL_MASK (0x700U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO2_PD_SEL_SHIFT (8U)\r\n/*! GPIO2_PD_SEL - Power Down Output Value for GPIO[2] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO2_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL0_GPIO2_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL0_GPIO2_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO3_PD_SEL_MASK (0x7000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO3_PD_SEL_SHIFT (12U)\r\n/*! GPIO3_PD_SEL - Power Down Output Value for GPIO[3] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO3_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL0_GPIO3_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL0_GPIO3_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO4_PD_SEL_MASK (0x70000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO4_PD_SEL_SHIFT (16U)\r\n/*! GPIO4_PD_SEL - Power Down Output Value for GPIO[4] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO4_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL0_GPIO4_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL0_GPIO4_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO5_PD_SEL_MASK (0x700000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO5_PD_SEL_SHIFT (20U)\r\n/*! GPIO5_PD_SEL - Power Down Output Value for GPIO[5] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO5_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL0_GPIO5_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL0_GPIO5_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO6_PD_SEL_MASK (0x7000000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO6_PD_SEL_SHIFT (24U)\r\n/*! GPIO6_PD_SEL - Power Down Output Value for GPIO[6] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO6_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL0_GPIO6_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL0_GPIO6_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO7_PD_SEL_MASK (0x70000000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO7_PD_SEL_SHIFT (28U)\r\n/*! GPIO7_PD_SEL - Power Down Output Value for GPIO[7] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL0_GPIO7_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL0_GPIO7_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL0_GPIO7_PD_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_PWRDOWN_CTRL1 - Pad Power-down Control 1 */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO8_PD_SEL_MASK (0x7U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO8_PD_SEL_SHIFT (0U)\r\n/*! GPIO8_PD_SEL - Power Down Output Value for GPIO[8] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO8_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL1_GPIO8_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL1_GPIO8_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO9_PD_SEL_MASK (0x70U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO9_PD_SEL_SHIFT (4U)\r\n/*! GPIO9_PD_SEL - Power Down Output Value for GPIO[9] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO9_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL1_GPIO9_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL1_GPIO9_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO10_PD_SEL_MASK (0x700U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO10_PD_SEL_SHIFT (8U)\r\n/*! GPIO10_PD_SEL - Power Down Output Value for GPIO[10] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO10_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL1_GPIO10_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL1_GPIO10_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO11_PD_SEL_MASK (0x7000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO11_PD_SEL_SHIFT (12U)\r\n/*! GPIO11_PD_SEL - Power Down Output Value for GPIO[11] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO11_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL1_GPIO11_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL1_GPIO11_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO12_PD_SEL_MASK (0x70000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO12_PD_SEL_SHIFT (16U)\r\n/*! GPIO12_PD_SEL - Power Down Output Value for GPIO[12] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO12_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL1_GPIO12_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL1_GPIO12_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO13_PD_SEL_MASK (0x700000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO13_PD_SEL_SHIFT (20U)\r\n/*! GPIO13_PD_SEL - Power Down Output Value for GPIO[13] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO13_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL1_GPIO13_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL1_GPIO13_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO14_PD_SEL_MASK (0x7000000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO14_PD_SEL_SHIFT (24U)\r\n/*! GPIO14_PD_SEL - Power Down Output Value for GPIO[14] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO14_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL1_GPIO14_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL1_GPIO14_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO21_PD_SEL_MASK (0x70000000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO21_PD_SEL_SHIFT (28U)\r\n/*! GPIO21_PD_SEL - Power Down Output Value for GPIO[21] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL1_GPIO21_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL1_GPIO21_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL1_GPIO21_PD_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_PWRDOWN_CTRL2 - Pad Power-down Control 2 */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL2_GPIO42_PD_SEL_MASK (0x7000000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL2_GPIO42_PD_SEL_SHIFT (24U)\r\n/*! GPIO42_PD_SEL - Power Down Output Value for GPIO[42] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL2_GPIO42_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL2_GPIO42_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL2_GPIO42_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL2_GPIO43_PD_SEL_MASK (0x70000000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL2_GPIO43_PD_SEL_SHIFT (28U)\r\n/*! GPIO43_PD_SEL - Power Down Output Value for GPIO[43] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL2_GPIO43_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL2_GPIO43_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL2_GPIO43_PD_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_PWRDOWN_CTRL3 - Pad Power-down Control 3 */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO44_PD_SEL_MASK (0x7U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO44_PD_SEL_SHIFT (0U)\r\n/*! GPIO44_PD_SEL - Power Down Output Value for GPIO[44] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO44_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL3_GPIO44_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL3_GPIO44_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO45_PD_SEL_MASK (0x70U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO45_PD_SEL_SHIFT (4U)\r\n/*! GPIO45_PD_SEL - Power Down Output Value for GPIO[45] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO45_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL3_GPIO45_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL3_GPIO45_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO46_PD_SEL_MASK (0x700U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO46_PD_SEL_SHIFT (8U)\r\n/*! GPIO46_PD_SEL - Power Down Output Value for GPIO[46] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO46_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL3_GPIO46_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL3_GPIO46_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO47_PD_SEL_MASK (0x7000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO47_PD_SEL_SHIFT (12U)\r\n/*! GPIO47_PD_SEL - Power Down Output Value for GPIO[47] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO47_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL3_GPIO47_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL3_GPIO47_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO48_PD_SEL_MASK (0x70000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO48_PD_SEL_SHIFT (16U)\r\n/*! GPIO48_PD_SEL - Power Down Output Value for GPIO[48] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO48_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL3_GPIO48_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL3_GPIO48_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO49_PD_SEL_MASK (0x700000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO49_PD_SEL_SHIFT (20U)\r\n/*! GPIO49_PD_SEL - Power Down Output Value for GPIO[49] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO49_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL3_GPIO49_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL3_GPIO49_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO50_PD_SEL_MASK (0x7000000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO50_PD_SEL_SHIFT (24U)\r\n/*! GPIO50_PD_SEL - Power Down Output Value for GPIO[50] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO50_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL3_GPIO50_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL3_GPIO50_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO51_PD_SEL_MASK (0x70000000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO51_PD_SEL_SHIFT (28U)\r\n/*! GPIO51_PD_SEL - Power Down Output Value for GPIO[51] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL3_GPIO51_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL3_GPIO51_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL3_GPIO51_PD_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_PWRDOWN_CTRL4 - Pad Power-down Control 4 */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO52_PD_SEL_MASK (0x7U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO52_PD_SEL_SHIFT (0U)\r\n/*! GPIO52_PD_SEL - Power Down Output Value for GPIO[52] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO52_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL4_GPIO52_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL4_GPIO52_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO53_PD_SEL_MASK (0x70U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO53_PD_SEL_SHIFT (4U)\r\n/*! GPIO53_PD_SEL - Power Down Output Value for GPIO[53] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO53_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL4_GPIO53_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL4_GPIO53_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO54_PD_SEL_MASK (0x700U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO54_PD_SEL_SHIFT (8U)\r\n/*! GPIO54_PD_SEL - Power Down Output Value for GPIO[54] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO54_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL4_GPIO54_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL4_GPIO54_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO55_PD_SEL_MASK (0x7000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO55_PD_SEL_SHIFT (12U)\r\n/*! GPIO55_PD_SEL - Power Down Output Value for GPIO[55] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO55_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL4_GPIO55_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL4_GPIO55_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO56_PD_SEL_MASK (0x70000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO56_PD_SEL_SHIFT (16U)\r\n/*! GPIO56_PD_SEL - Power Down Output Value for GPIO[56] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO56_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL4_GPIO56_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL4_GPIO56_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO57_PD_SEL_MASK (0x700000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO57_PD_SEL_SHIFT (20U)\r\n/*! GPIO57_PD_SEL - Power Down Output Value for GPIO[57] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO57_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL4_GPIO57_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL4_GPIO57_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO58_PD_SEL_MASK (0x7000000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO58_PD_SEL_SHIFT (24U)\r\n/*! GPIO58_PD_SEL - Power Down Output Value for GPIO[58] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO58_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL4_GPIO58_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL4_GPIO58_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO59_PD_SEL_MASK (0x70000000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO59_PD_SEL_SHIFT (28U)\r\n/*! GPIO59_PD_SEL - Power Down Output Value for GPIO[59] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL4_GPIO59_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL4_GPIO59_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL4_GPIO59_PD_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_PWRDOWN_CTRL5 - Pad Power-down Control 5 */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_GPIO60_PD_SEL_MASK (0x7U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_GPIO60_PD_SEL_SHIFT (0U)\r\n/*! GPIO60_PD_SEL - Power Down Output Value for GPIO[60] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_GPIO60_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL5_GPIO60_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL5_GPIO60_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_GPIO61_PD_SEL_MASK (0x70U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_GPIO61_PD_SEL_SHIFT (4U)\r\n/*! GPIO61_PD_SEL - Power Down Output Value for GPIO[61] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_GPIO61_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL5_GPIO61_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL5_GPIO61_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_GPIO62_PD_SEL_MASK (0x700U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_GPIO62_PD_SEL_SHIFT (8U)\r\n/*! GPIO62_PD_SEL - Power Down Output Value for GPIO[62] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_GPIO62_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL5_GPIO62_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL5_GPIO62_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_GPIO63_PD_SEL_MASK (0x7000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_GPIO63_PD_SEL_SHIFT (12U)\r\n/*! GPIO63_PD_SEL - Power Down Output Value for GPIO[63] Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_GPIO63_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL5_GPIO63_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL5_GPIO63_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_RF_CNTL0_PD_SEL_MASK (0x70000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_RF_CNTL0_PD_SEL_SHIFT (16U)\r\n/*! RF_CNTL0_PD_SEL - Power Down Output Value for rf_cntl0 Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_RF_CNTL0_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL5_RF_CNTL0_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL5_RF_CNTL0_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_RF_CNTL1_PD_SEL_MASK (0x700000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_RF_CNTL1_PD_SEL_SHIFT (20U)\r\n/*! RF_CNTL1_PD_SEL - Power Down Output Value for rf_cntl1 Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_RF_CNTL1_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL5_RF_CNTL1_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL5_RF_CNTL1_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_RF_CNTL2_PD_SEL_MASK (0x7000000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_RF_CNTL2_PD_SEL_SHIFT (24U)\r\n/*! RF_CNTL2_PD_SEL - Power Down Output Value for rf_cntl2 Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_RF_CNTL2_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL5_RF_CNTL2_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL5_RF_CNTL2_PD_SEL_MASK)\r\n\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_RF_CNTL3_PD_SEL_MASK (0x70000000U)\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_RF_CNTL3_PD_SEL_SHIFT (28U)\r\n/*! RF_CNTL3_PD_SEL - Power Down Output Value for rf_cntl3 Pad */\r\n#define SOCCIU_PAD_PWRDOWN_CTRL5_RF_CNTL3_PD_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PWRDOWN_CTRL5_RF_CNTL3_PD_SEL_SHIFT)) & SOCCIU_PAD_PWRDOWN_CTRL5_RF_CNTL3_PD_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_RF_SW_SLP_CONFIG - RF Switch Pad Sleep Mode Configuration */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL0_SLP_EN_MASK (0x1U)\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL0_SLP_EN_SHIFT (0U)\r\n/*! RF_CNTL0_SLP_EN - RF_CNTL0 Sleep Force Enable */\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL0_SLP_EN(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL0_SLP_EN_SHIFT)) & SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL0_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL1_SLP_EN_MASK (0x2U)\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL1_SLP_EN_SHIFT (1U)\r\n/*! RF_CNTL1_SLP_EN - RF_CNTL1 Sleep Force Enable */\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL1_SLP_EN(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL1_SLP_EN_SHIFT)) & SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL1_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL2_SLP_EN_MASK (0x4U)\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL2_SLP_EN_SHIFT (2U)\r\n/*! RF_CNTL2_SLP_EN - RF_CNTL2 Sleep Force Enable */\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL2_SLP_EN(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL2_SLP_EN_SHIFT)) & SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL2_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL3_SLP_EN_MASK (0x8U)\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL3_SLP_EN_SHIFT (3U)\r\n/*! RF_CNTL3_SLP_EN - RF_CNTL3 Sleep Force Enable */\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL3_SLP_EN(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL3_SLP_EN_SHIFT)) & SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL3_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL0_SLP_VAL_MASK (0x10000U)\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL0_SLP_VAL_SHIFT (16U)\r\n/*! RF_CNTL0_SLP_VAL - RF_CTRL0 Sleep Value */\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL0_SLP_VAL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL0_SLP_VAL_SHIFT)) & SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL0_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL1_SLP_VAL_MASK (0x20000U)\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL1_SLP_VAL_SHIFT (17U)\r\n/*! RF_CNTL1_SLP_VAL - RF_CTRL1 Sleep Value */\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL1_SLP_VAL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL1_SLP_VAL_SHIFT)) & SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL1_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL2_SLP_VAL_MASK (0x40000U)\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL2_SLP_VAL_SHIFT (18U)\r\n/*! RF_CNTL2_SLP_VAL - RF_CTRL2 Sleep Value */\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL2_SLP_VAL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL2_SLP_VAL_SHIFT)) & SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL2_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL3_SLP_VAL_MASK (0x80000U)\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL3_SLP_VAL_SHIFT (19U)\r\n/*! RF_CNTL3_SLP_VAL - RF_CTRL3 Sleep Value */\r\n#define SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL3_SLP_VAL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL3_SLP_VAL_SHIFT)) & SOCCIU_PAD_RF_SW_SLP_CONFIG_RF_CNTL3_SLP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_ATEST_SW_SLP_CONFIG - ATEST Pad Sleep Mode Configuration */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST0_SLP_EN_MASK (0x1U)\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST0_SLP_EN_SHIFT (0U)\r\n/*! ATEST0_SLP_EN - ATEST0 Sleep Force Enable */\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST0_SLP_EN(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST0_SLP_EN_SHIFT)) & SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST0_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST1_SLP_EN_MASK (0x2U)\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST1_SLP_EN_SHIFT (1U)\r\n/*! ATEST1_SLP_EN - ATEST1 Sleep Force Enable */\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST1_SLP_EN(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST1_SLP_EN_SHIFT)) & SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST1_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST2_SLP_EN_MASK (0x4U)\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST2_SLP_EN_SHIFT (2U)\r\n/*! ATEST2_SLP_EN - ATEST2 Sleep Force Enable */\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST2_SLP_EN(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST2_SLP_EN_SHIFT)) & SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST2_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST3_SLP_EN_MASK (0x8U)\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST3_SLP_EN_SHIFT (3U)\r\n/*! ATEST3_SLP_EN - ATEST3 Sleep Force Enable */\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST3_SLP_EN(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST3_SLP_EN_SHIFT)) & SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST3_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST0_SLP_VAL_MASK (0x10000U)\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST0_SLP_VAL_SHIFT (16U)\r\n/*! ATEST0_SLP_VAL - ATEST0 Sleep Value */\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST0_SLP_VAL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST0_SLP_VAL_SHIFT)) & SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST0_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST1_SLP_VAL_MASK (0x20000U)\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST1_SLP_VAL_SHIFT (17U)\r\n/*! ATEST1_SLP_VAL - ATEST1 Sleep Value */\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST1_SLP_VAL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST1_SLP_VAL_SHIFT)) & SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST1_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST2_SLP_VAL_MASK (0x40000U)\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST2_SLP_VAL_SHIFT (18U)\r\n/*! ATEST2_SLP_VAL - ATEST2 Sleep Value */\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST2_SLP_VAL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST2_SLP_VAL_SHIFT)) & SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST2_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST3_SLP_VAL_MASK (0x80000U)\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST3_SLP_VAL_SHIFT (19U)\r\n/*! ATEST3_SLP_VAL - ATEST3 Sleep Value */\r\n#define SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST3_SLP_VAL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST3_SLP_VAL_SHIFT)) & SOCCIU_PAD_ATEST_SW_SLP_CONFIG_ATEST3_SLP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SR_CONFIG0 - GPIO Slew Rate control */\r\n/*! @{ */\r\n\r\n#define SOCCIU_SR_CONFIG0_GPIO0_SR_MASK          (0x3U)\r\n#define SOCCIU_SR_CONFIG0_GPIO0_SR_SHIFT         (0U)\r\n/*! GPIO0_SR - Slew Rate Control for GPIO[0] */\r\n#define SOCCIU_SR_CONFIG0_GPIO0_SR(x)            (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG0_GPIO0_SR_SHIFT)) & SOCCIU_SR_CONFIG0_GPIO0_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG0_GPIO1_SR_MASK          (0xCU)\r\n#define SOCCIU_SR_CONFIG0_GPIO1_SR_SHIFT         (2U)\r\n/*! GPIO1_SR - Slew Rate Control for GPIO[1] */\r\n#define SOCCIU_SR_CONFIG0_GPIO1_SR(x)            (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG0_GPIO1_SR_SHIFT)) & SOCCIU_SR_CONFIG0_GPIO1_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG0_GPIO2_SR_MASK          (0x30U)\r\n#define SOCCIU_SR_CONFIG0_GPIO2_SR_SHIFT         (4U)\r\n/*! GPIO2_SR - Slew Rate Control for GPIO[2] */\r\n#define SOCCIU_SR_CONFIG0_GPIO2_SR(x)            (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG0_GPIO2_SR_SHIFT)) & SOCCIU_SR_CONFIG0_GPIO2_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG0_GPIO3_SR_MASK          (0xC0U)\r\n#define SOCCIU_SR_CONFIG0_GPIO3_SR_SHIFT         (6U)\r\n/*! GPIO3_SR - Slew Rate Control for GPIO[3] */\r\n#define SOCCIU_SR_CONFIG0_GPIO3_SR(x)            (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG0_GPIO3_SR_SHIFT)) & SOCCIU_SR_CONFIG0_GPIO3_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG0_GPIO4_SR_MASK          (0x300U)\r\n#define SOCCIU_SR_CONFIG0_GPIO4_SR_SHIFT         (8U)\r\n/*! GPIO4_SR - Slew Rate Control for GPIO[4] */\r\n#define SOCCIU_SR_CONFIG0_GPIO4_SR(x)            (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG0_GPIO4_SR_SHIFT)) & SOCCIU_SR_CONFIG0_GPIO4_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG0_GPIO5_SR_MASK          (0xC00U)\r\n#define SOCCIU_SR_CONFIG0_GPIO5_SR_SHIFT         (10U)\r\n/*! GPIO5_SR - Slew Rate Control for GPIO[5] */\r\n#define SOCCIU_SR_CONFIG0_GPIO5_SR(x)            (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG0_GPIO5_SR_SHIFT)) & SOCCIU_SR_CONFIG0_GPIO5_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG0_GPIO6_SR_MASK          (0x3000U)\r\n#define SOCCIU_SR_CONFIG0_GPIO6_SR_SHIFT         (12U)\r\n/*! GPIO6_SR - Slew Rate Control for GPIO[6] */\r\n#define SOCCIU_SR_CONFIG0_GPIO6_SR(x)            (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG0_GPIO6_SR_SHIFT)) & SOCCIU_SR_CONFIG0_GPIO6_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG0_GPIO7_SR_MASK          (0xC000U)\r\n#define SOCCIU_SR_CONFIG0_GPIO7_SR_SHIFT         (14U)\r\n/*! GPIO7_SR - Slew Rate Control for GPIO[7] */\r\n#define SOCCIU_SR_CONFIG0_GPIO7_SR(x)            (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG0_GPIO7_SR_SHIFT)) & SOCCIU_SR_CONFIG0_GPIO7_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG0_GPIO8_SR_MASK          (0x30000U)\r\n#define SOCCIU_SR_CONFIG0_GPIO8_SR_SHIFT         (16U)\r\n/*! GPIO8_SR - Slew Rate Control for GPIO[8] */\r\n#define SOCCIU_SR_CONFIG0_GPIO8_SR(x)            (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG0_GPIO8_SR_SHIFT)) & SOCCIU_SR_CONFIG0_GPIO8_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG0_GPIO9_SR_MASK          (0xC0000U)\r\n#define SOCCIU_SR_CONFIG0_GPIO9_SR_SHIFT         (18U)\r\n/*! GPIO9_SR - Slew Rate Control for GPIO[9] */\r\n#define SOCCIU_SR_CONFIG0_GPIO9_SR(x)            (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG0_GPIO9_SR_SHIFT)) & SOCCIU_SR_CONFIG0_GPIO9_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG0_GPIO10_SR_MASK         (0x300000U)\r\n#define SOCCIU_SR_CONFIG0_GPIO10_SR_SHIFT        (20U)\r\n/*! GPIO10_SR - Slew Rate Control for GPIO[10] */\r\n#define SOCCIU_SR_CONFIG0_GPIO10_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG0_GPIO10_SR_SHIFT)) & SOCCIU_SR_CONFIG0_GPIO10_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG0_GPIO11_SR_MASK         (0xC00000U)\r\n#define SOCCIU_SR_CONFIG0_GPIO11_SR_SHIFT        (22U)\r\n/*! GPIO11_SR - Slew Rate Control for GPIO[11] */\r\n#define SOCCIU_SR_CONFIG0_GPIO11_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG0_GPIO11_SR_SHIFT)) & SOCCIU_SR_CONFIG0_GPIO11_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG0_GPIO12_SR_MASK         (0x3000000U)\r\n#define SOCCIU_SR_CONFIG0_GPIO12_SR_SHIFT        (24U)\r\n/*! GPIO12_SR - Slew Rate Control for GPIO[12] */\r\n#define SOCCIU_SR_CONFIG0_GPIO12_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG0_GPIO12_SR_SHIFT)) & SOCCIU_SR_CONFIG0_GPIO12_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG0_GPIO13_SR_MASK         (0xC000000U)\r\n#define SOCCIU_SR_CONFIG0_GPIO13_SR_SHIFT        (26U)\r\n/*! GPIO13_SR - Slew Rate Control for GPIO[13] */\r\n#define SOCCIU_SR_CONFIG0_GPIO13_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG0_GPIO13_SR_SHIFT)) & SOCCIU_SR_CONFIG0_GPIO13_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG0_GPIO14_SR_MASK         (0x30000000U)\r\n#define SOCCIU_SR_CONFIG0_GPIO14_SR_SHIFT        (28U)\r\n/*! GPIO14_SR - Slew Rate Control for GPIO[14] */\r\n#define SOCCIU_SR_CONFIG0_GPIO14_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG0_GPIO14_SR_SHIFT)) & SOCCIU_SR_CONFIG0_GPIO14_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG0_GPIO15_SR_MASK         (0xC0000000U)\r\n#define SOCCIU_SR_CONFIG0_GPIO15_SR_SHIFT        (30U)\r\n/*! GPIO15_SR - Slew Rate Control for GPIO[15] */\r\n#define SOCCIU_SR_CONFIG0_GPIO15_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG0_GPIO15_SR_SHIFT)) & SOCCIU_SR_CONFIG0_GPIO15_SR_MASK)\r\n/*! @} */\r\n\r\n/*! @name SR_CONFIG1 - GPIO Slew Rate control */\r\n/*! @{ */\r\n\r\n#define SOCCIU_SR_CONFIG1_GPIO16_SR_MASK         (0x3U)\r\n#define SOCCIU_SR_CONFIG1_GPIO16_SR_SHIFT        (0U)\r\n/*! GPIO16_SR - Slew Rate Control for GPIO[16] */\r\n#define SOCCIU_SR_CONFIG1_GPIO16_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG1_GPIO16_SR_SHIFT)) & SOCCIU_SR_CONFIG1_GPIO16_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG1_GPIO17_SR_MASK         (0xCU)\r\n#define SOCCIU_SR_CONFIG1_GPIO17_SR_SHIFT        (2U)\r\n/*! GPIO17_SR - Slew Rate Control for GPIO[17] */\r\n#define SOCCIU_SR_CONFIG1_GPIO17_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG1_GPIO17_SR_SHIFT)) & SOCCIU_SR_CONFIG1_GPIO17_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG1_GPIO18_SR_MASK         (0x30U)\r\n#define SOCCIU_SR_CONFIG1_GPIO18_SR_SHIFT        (4U)\r\n/*! GPIO18_SR - Slew Rate Control for GPIO[18] */\r\n#define SOCCIU_SR_CONFIG1_GPIO18_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG1_GPIO18_SR_SHIFT)) & SOCCIU_SR_CONFIG1_GPIO18_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG1_GPIO19_SR_MASK         (0xC0U)\r\n#define SOCCIU_SR_CONFIG1_GPIO19_SR_SHIFT        (6U)\r\n/*! GPIO19_SR - Slew Rate Control for GPIO[19] */\r\n#define SOCCIU_SR_CONFIG1_GPIO19_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG1_GPIO19_SR_SHIFT)) & SOCCIU_SR_CONFIG1_GPIO19_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG1_GPIO20_SR_MASK         (0x300U)\r\n#define SOCCIU_SR_CONFIG1_GPIO20_SR_SHIFT        (8U)\r\n/*! GPIO20_SR - Slew Rate Control for GPIO[20] */\r\n#define SOCCIU_SR_CONFIG1_GPIO20_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG1_GPIO20_SR_SHIFT)) & SOCCIU_SR_CONFIG1_GPIO20_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG1_GPIO21_SR_MASK         (0xC00U)\r\n#define SOCCIU_SR_CONFIG1_GPIO21_SR_SHIFT        (10U)\r\n/*! GPIO21_SR - Slew Rate Control for GPIO[21] */\r\n#define SOCCIU_SR_CONFIG1_GPIO21_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG1_GPIO21_SR_SHIFT)) & SOCCIU_SR_CONFIG1_GPIO21_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG1_GPIO28_SR_MASK         (0x3000000U)\r\n#define SOCCIU_SR_CONFIG1_GPIO28_SR_SHIFT        (24U)\r\n/*! GPIO28_SR - Slew Rate Control for GPIO[28] */\r\n#define SOCCIU_SR_CONFIG1_GPIO28_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG1_GPIO28_SR_SHIFT)) & SOCCIU_SR_CONFIG1_GPIO28_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG1_GPIO29_SR_MASK         (0xC000000U)\r\n#define SOCCIU_SR_CONFIG1_GPIO29_SR_SHIFT        (26U)\r\n/*! GPIO29_SR - Slew Rate Control for GPIO[29] */\r\n#define SOCCIU_SR_CONFIG1_GPIO29_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG1_GPIO29_SR_SHIFT)) & SOCCIU_SR_CONFIG1_GPIO29_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG1_GPIO30_SR_MASK         (0x30000000U)\r\n#define SOCCIU_SR_CONFIG1_GPIO30_SR_SHIFT        (28U)\r\n/*! GPIO30_SR - Slew Rate Control for GPIO[30] */\r\n#define SOCCIU_SR_CONFIG1_GPIO30_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG1_GPIO30_SR_SHIFT)) & SOCCIU_SR_CONFIG1_GPIO30_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG1_GPIO31_SR_MASK         (0xC0000000U)\r\n#define SOCCIU_SR_CONFIG1_GPIO31_SR_SHIFT        (30U)\r\n/*! GPIO31_SR - Slew Rate Control for GPIO[31] */\r\n#define SOCCIU_SR_CONFIG1_GPIO31_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG1_GPIO31_SR_SHIFT)) & SOCCIU_SR_CONFIG1_GPIO31_SR_MASK)\r\n/*! @} */\r\n\r\n/*! @name SR_CONFIG2 - GPIO Slew Rate control */\r\n/*! @{ */\r\n\r\n#define SOCCIU_SR_CONFIG2_GPIO32_SR_MASK         (0x3U)\r\n#define SOCCIU_SR_CONFIG2_GPIO32_SR_SHIFT        (0U)\r\n/*! GPIO32_SR - Slew Rate Control for GPIO[32] */\r\n#define SOCCIU_SR_CONFIG2_GPIO32_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG2_GPIO32_SR_SHIFT)) & SOCCIU_SR_CONFIG2_GPIO32_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG2_GPIO33_SR_MASK         (0xCU)\r\n#define SOCCIU_SR_CONFIG2_GPIO33_SR_SHIFT        (2U)\r\n/*! GPIO33_SR - Slew Rate Control for GPIO[33] */\r\n#define SOCCIU_SR_CONFIG2_GPIO33_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG2_GPIO33_SR_SHIFT)) & SOCCIU_SR_CONFIG2_GPIO33_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG2_GPIO34_SR_MASK         (0x30U)\r\n#define SOCCIU_SR_CONFIG2_GPIO34_SR_SHIFT        (4U)\r\n/*! GPIO34_SR - Slew Rate Control for GPIO[34] */\r\n#define SOCCIU_SR_CONFIG2_GPIO34_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG2_GPIO34_SR_SHIFT)) & SOCCIU_SR_CONFIG2_GPIO34_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG2_GPIO35_SR_MASK         (0xC0U)\r\n#define SOCCIU_SR_CONFIG2_GPIO35_SR_SHIFT        (6U)\r\n/*! GPIO35_SR - Slew Rate Control for GPIO[35] */\r\n#define SOCCIU_SR_CONFIG2_GPIO35_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG2_GPIO35_SR_SHIFT)) & SOCCIU_SR_CONFIG2_GPIO35_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG2_GPIO36_SR_MASK         (0x300U)\r\n#define SOCCIU_SR_CONFIG2_GPIO36_SR_SHIFT        (8U)\r\n/*! GPIO36_SR - Slew Rate Control for GPIO[36] */\r\n#define SOCCIU_SR_CONFIG2_GPIO36_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG2_GPIO36_SR_SHIFT)) & SOCCIU_SR_CONFIG2_GPIO36_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG2_GPIO37_SR_MASK         (0xC00U)\r\n#define SOCCIU_SR_CONFIG2_GPIO37_SR_SHIFT        (10U)\r\n/*! GPIO37_SR - Slew Rate Control for GPIO[37] */\r\n#define SOCCIU_SR_CONFIG2_GPIO37_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG2_GPIO37_SR_SHIFT)) & SOCCIU_SR_CONFIG2_GPIO37_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG2_GPIO38_SR_MASK         (0x3000U)\r\n#define SOCCIU_SR_CONFIG2_GPIO38_SR_SHIFT        (12U)\r\n/*! GPIO38_SR - Slew Rate Control for GPIO[38] */\r\n#define SOCCIU_SR_CONFIG2_GPIO38_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG2_GPIO38_SR_SHIFT)) & SOCCIU_SR_CONFIG2_GPIO38_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG2_GPIO39_SR_MASK         (0xC000U)\r\n#define SOCCIU_SR_CONFIG2_GPIO39_SR_SHIFT        (14U)\r\n/*! GPIO39_SR - Slew Rate Control for GPIO[39] */\r\n#define SOCCIU_SR_CONFIG2_GPIO39_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG2_GPIO39_SR_SHIFT)) & SOCCIU_SR_CONFIG2_GPIO39_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG2_GPIO40_SR_MASK         (0x30000U)\r\n#define SOCCIU_SR_CONFIG2_GPIO40_SR_SHIFT        (16U)\r\n/*! GPIO40_SR - Slew Rate Control for GPIO[40] */\r\n#define SOCCIU_SR_CONFIG2_GPIO40_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG2_GPIO40_SR_SHIFT)) & SOCCIU_SR_CONFIG2_GPIO40_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG2_GPIO41_SR_MASK         (0xC0000U)\r\n#define SOCCIU_SR_CONFIG2_GPIO41_SR_SHIFT        (18U)\r\n/*! GPIO41_SR - Slew Rate Control for GPIO[41] */\r\n#define SOCCIU_SR_CONFIG2_GPIO41_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG2_GPIO41_SR_SHIFT)) & SOCCIU_SR_CONFIG2_GPIO41_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG2_GPIO42_SR_MASK         (0x300000U)\r\n#define SOCCIU_SR_CONFIG2_GPIO42_SR_SHIFT        (20U)\r\n/*! GPIO42_SR - Slew Rate Control for GPIO[42] */\r\n#define SOCCIU_SR_CONFIG2_GPIO42_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG2_GPIO42_SR_SHIFT)) & SOCCIU_SR_CONFIG2_GPIO42_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG2_GPIO43_SR_MASK         (0xC00000U)\r\n#define SOCCIU_SR_CONFIG2_GPIO43_SR_SHIFT        (22U)\r\n/*! GPIO43_SR - Slew Rate Control for GPIO[43] */\r\n#define SOCCIU_SR_CONFIG2_GPIO43_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG2_GPIO43_SR_SHIFT)) & SOCCIU_SR_CONFIG2_GPIO43_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG2_GPIO44_SR_MASK         (0x3000000U)\r\n#define SOCCIU_SR_CONFIG2_GPIO44_SR_SHIFT        (24U)\r\n/*! GPIO44_SR - Slew Rate Control for GPIO[44] */\r\n#define SOCCIU_SR_CONFIG2_GPIO44_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG2_GPIO44_SR_SHIFT)) & SOCCIU_SR_CONFIG2_GPIO44_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG2_GPIO45_SR_MASK         (0xC000000U)\r\n#define SOCCIU_SR_CONFIG2_GPIO45_SR_SHIFT        (26U)\r\n/*! GPIO45_SR - Slew Rate Control for GPIO[45] */\r\n#define SOCCIU_SR_CONFIG2_GPIO45_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG2_GPIO45_SR_SHIFT)) & SOCCIU_SR_CONFIG2_GPIO45_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG2_GPIO46_SR_MASK         (0x30000000U)\r\n#define SOCCIU_SR_CONFIG2_GPIO46_SR_SHIFT        (28U)\r\n/*! GPIO46_SR - Slew Rate Control for GPIO[46] */\r\n#define SOCCIU_SR_CONFIG2_GPIO46_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG2_GPIO46_SR_SHIFT)) & SOCCIU_SR_CONFIG2_GPIO46_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG2_GPIO47_SR_MASK         (0xC0000000U)\r\n#define SOCCIU_SR_CONFIG2_GPIO47_SR_SHIFT        (30U)\r\n/*! GPIO47_SR - Slew Rate Control for GPIO[47] */\r\n#define SOCCIU_SR_CONFIG2_GPIO47_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG2_GPIO47_SR_SHIFT)) & SOCCIU_SR_CONFIG2_GPIO47_SR_MASK)\r\n/*! @} */\r\n\r\n/*! @name SR_CONFIG3 - GPIO Slew Rate control */\r\n/*! @{ */\r\n\r\n#define SOCCIU_SR_CONFIG3_GPIO48_SR_MASK         (0x3U)\r\n#define SOCCIU_SR_CONFIG3_GPIO48_SR_SHIFT        (0U)\r\n/*! GPIO48_SR - Slew Rate Control for GPIO[48] */\r\n#define SOCCIU_SR_CONFIG3_GPIO48_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG3_GPIO48_SR_SHIFT)) & SOCCIU_SR_CONFIG3_GPIO48_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG3_GPIO49_SR_MASK         (0xCU)\r\n#define SOCCIU_SR_CONFIG3_GPIO49_SR_SHIFT        (2U)\r\n/*! GPIO49_SR - Slew Rate Control for GPIO[49] */\r\n#define SOCCIU_SR_CONFIG3_GPIO49_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG3_GPIO49_SR_SHIFT)) & SOCCIU_SR_CONFIG3_GPIO49_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG3_GPIO50_SR_MASK         (0x30U)\r\n#define SOCCIU_SR_CONFIG3_GPIO50_SR_SHIFT        (4U)\r\n/*! GPIO50_SR - Slew Rate Control for GPIO[50] */\r\n#define SOCCIU_SR_CONFIG3_GPIO50_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG3_GPIO50_SR_SHIFT)) & SOCCIU_SR_CONFIG3_GPIO50_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG3_GPIO51_SR_MASK         (0xC0U)\r\n#define SOCCIU_SR_CONFIG3_GPIO51_SR_SHIFT        (6U)\r\n/*! GPIO51_SR - Slew Rate Control for GPIO[51] */\r\n#define SOCCIU_SR_CONFIG3_GPIO51_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG3_GPIO51_SR_SHIFT)) & SOCCIU_SR_CONFIG3_GPIO51_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG3_GPIO52_SR_MASK         (0x300U)\r\n#define SOCCIU_SR_CONFIG3_GPIO52_SR_SHIFT        (8U)\r\n/*! GPIO52_SR - Slew Rate Control for GPIO[52] */\r\n#define SOCCIU_SR_CONFIG3_GPIO52_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG3_GPIO52_SR_SHIFT)) & SOCCIU_SR_CONFIG3_GPIO52_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG3_GPIO53_SR_MASK         (0xC00U)\r\n#define SOCCIU_SR_CONFIG3_GPIO53_SR_SHIFT        (10U)\r\n/*! GPIO53_SR - Slew Rate Control for GPIO[53] */\r\n#define SOCCIU_SR_CONFIG3_GPIO53_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG3_GPIO53_SR_SHIFT)) & SOCCIU_SR_CONFIG3_GPIO53_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG3_GPIO54_SR_MASK         (0x3000U)\r\n#define SOCCIU_SR_CONFIG3_GPIO54_SR_SHIFT        (12U)\r\n/*! GPIO54_SR - Slew Rate Control for GPIO[54] */\r\n#define SOCCIU_SR_CONFIG3_GPIO54_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG3_GPIO54_SR_SHIFT)) & SOCCIU_SR_CONFIG3_GPIO54_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG3_GPIO55_SR_MASK         (0xC000U)\r\n#define SOCCIU_SR_CONFIG3_GPIO55_SR_SHIFT        (14U)\r\n/*! GPIO55_SR - Slew Rate Control for GPIO[55] */\r\n#define SOCCIU_SR_CONFIG3_GPIO55_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG3_GPIO55_SR_SHIFT)) & SOCCIU_SR_CONFIG3_GPIO55_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG3_GPIO56_SR_MASK         (0x30000U)\r\n#define SOCCIU_SR_CONFIG3_GPIO56_SR_SHIFT        (16U)\r\n/*! GPIO56_SR - Slew Rate Control for GPIO[56] */\r\n#define SOCCIU_SR_CONFIG3_GPIO56_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG3_GPIO56_SR_SHIFT)) & SOCCIU_SR_CONFIG3_GPIO56_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG3_GPIO57_SR_MASK         (0xC0000U)\r\n#define SOCCIU_SR_CONFIG3_GPIO57_SR_SHIFT        (18U)\r\n/*! GPIO57_SR - Slew Rate Control for GPIO[57] */\r\n#define SOCCIU_SR_CONFIG3_GPIO57_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG3_GPIO57_SR_SHIFT)) & SOCCIU_SR_CONFIG3_GPIO57_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG3_GPIO58_SR_MASK         (0x300000U)\r\n#define SOCCIU_SR_CONFIG3_GPIO58_SR_SHIFT        (20U)\r\n/*! GPIO58_SR - Slew Rate Control for GPIO[58] */\r\n#define SOCCIU_SR_CONFIG3_GPIO58_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG3_GPIO58_SR_SHIFT)) & SOCCIU_SR_CONFIG3_GPIO58_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG3_GPIO59_SR_MASK         (0xC00000U)\r\n#define SOCCIU_SR_CONFIG3_GPIO59_SR_SHIFT        (22U)\r\n/*! GPIO59_SR - Slew Rate Control for GPIO[59] */\r\n#define SOCCIU_SR_CONFIG3_GPIO59_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG3_GPIO59_SR_SHIFT)) & SOCCIU_SR_CONFIG3_GPIO59_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG3_GPIO60_SR_MASK         (0x3000000U)\r\n#define SOCCIU_SR_CONFIG3_GPIO60_SR_SHIFT        (24U)\r\n/*! GPIO60_SR - Slew Rate Control for GPIO[60] */\r\n#define SOCCIU_SR_CONFIG3_GPIO60_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG3_GPIO60_SR_SHIFT)) & SOCCIU_SR_CONFIG3_GPIO60_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG3_GPIO61_SR_MASK         (0xC000000U)\r\n#define SOCCIU_SR_CONFIG3_GPIO61_SR_SHIFT        (26U)\r\n/*! GPIO61_SR - Slew Rate Control for GPIO[61] */\r\n#define SOCCIU_SR_CONFIG3_GPIO61_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG3_GPIO61_SR_SHIFT)) & SOCCIU_SR_CONFIG3_GPIO61_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG3_GPIO62_SR_MASK         (0x30000000U)\r\n#define SOCCIU_SR_CONFIG3_GPIO62_SR_SHIFT        (28U)\r\n/*! GPIO62_SR - Slew Rate Control for GPIO[62] */\r\n#define SOCCIU_SR_CONFIG3_GPIO62_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG3_GPIO62_SR_SHIFT)) & SOCCIU_SR_CONFIG3_GPIO62_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG3_GPIO63_SR_MASK         (0xC0000000U)\r\n#define SOCCIU_SR_CONFIG3_GPIO63_SR_SHIFT        (30U)\r\n/*! GPIO63_SR - Slew Rate Control for GPIO[63] */\r\n#define SOCCIU_SR_CONFIG3_GPIO63_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG3_GPIO63_SR_SHIFT)) & SOCCIU_SR_CONFIG3_GPIO63_SR_MASK)\r\n/*! @} */\r\n\r\n/*! @name SR_CONFIG4 - GPIO Slew Rate control */\r\n/*! @{ */\r\n\r\n#define SOCCIU_SR_CONFIG4_ATEST0_SR_MASK         (0x3U)\r\n#define SOCCIU_SR_CONFIG4_ATEST0_SR_SHIFT        (0U)\r\n/*! ATEST0_SR - Slew Rate Control for atest0 */\r\n#define SOCCIU_SR_CONFIG4_ATEST0_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG4_ATEST0_SR_SHIFT)) & SOCCIU_SR_CONFIG4_ATEST0_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG4_ATEST1_SR_MASK         (0xCU)\r\n#define SOCCIU_SR_CONFIG4_ATEST1_SR_SHIFT        (2U)\r\n/*! ATEST1_SR - Slew Rate Control for atest1 */\r\n#define SOCCIU_SR_CONFIG4_ATEST1_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG4_ATEST1_SR_SHIFT)) & SOCCIU_SR_CONFIG4_ATEST1_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG4_ATEST2_SR_MASK         (0x30U)\r\n#define SOCCIU_SR_CONFIG4_ATEST2_SR_SHIFT        (4U)\r\n/*! ATEST2_SR - Slew Rate Control for atest2 */\r\n#define SOCCIU_SR_CONFIG4_ATEST2_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG4_ATEST2_SR_SHIFT)) & SOCCIU_SR_CONFIG4_ATEST2_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG4_ATEST3_SR_MASK         (0xC0U)\r\n#define SOCCIU_SR_CONFIG4_ATEST3_SR_SHIFT        (6U)\r\n/*! ATEST3_SR - Slew Rate Control for atest3 */\r\n#define SOCCIU_SR_CONFIG4_ATEST3_SR(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG4_ATEST3_SR_SHIFT)) & SOCCIU_SR_CONFIG4_ATEST3_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG4_RF_CNTL0_SR_MASK       (0x300U)\r\n#define SOCCIU_SR_CONFIG4_RF_CNTL0_SR_SHIFT      (8U)\r\n/*! RF_CNTL0_SR - Slew Rate Control for rf_cntl0 */\r\n#define SOCCIU_SR_CONFIG4_RF_CNTL0_SR(x)         (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG4_RF_CNTL0_SR_SHIFT)) & SOCCIU_SR_CONFIG4_RF_CNTL0_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG4_RF_CNTL1_SR_MASK       (0xC00U)\r\n#define SOCCIU_SR_CONFIG4_RF_CNTL1_SR_SHIFT      (10U)\r\n/*! RF_CNTL1_SR - Slew Rate Control for rf_cntl1 */\r\n#define SOCCIU_SR_CONFIG4_RF_CNTL1_SR(x)         (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG4_RF_CNTL1_SR_SHIFT)) & SOCCIU_SR_CONFIG4_RF_CNTL1_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG4_RF_CNTL2_SR_MASK       (0x3000U)\r\n#define SOCCIU_SR_CONFIG4_RF_CNTL2_SR_SHIFT      (12U)\r\n/*! RF_CNTL2_SR - Slew Rate Control for rf_cntl2 */\r\n#define SOCCIU_SR_CONFIG4_RF_CNTL2_SR(x)         (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG4_RF_CNTL2_SR_SHIFT)) & SOCCIU_SR_CONFIG4_RF_CNTL2_SR_MASK)\r\n\r\n#define SOCCIU_SR_CONFIG4_RF_CNTL3_SR_MASK       (0xC000U)\r\n#define SOCCIU_SR_CONFIG4_RF_CNTL3_SR_SHIFT      (14U)\r\n/*! RF_CNTL3_SR - Slew Rate Control for rf_cntl3 */\r\n#define SOCCIU_SR_CONFIG4_RF_CNTL3_SR(x)         (((uint32_t)(((uint32_t)(x)) << SOCCIU_SR_CONFIG4_RF_CNTL3_SR_SHIFT)) & SOCCIU_SR_CONFIG4_RF_CNTL3_SR_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_WKUP0 - Pad Wakeup Mode Enable */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_WKUP0_ENABLE_MASK             (0x3U)\r\n#define SOCCIU_PAD_WKUP0_ENABLE_SHIFT            (0U)\r\n/*! ENABLE - Pad Wakeup Mode Enable [1:0] */\r\n#define SOCCIU_PAD_WKUP0_ENABLE(x)               (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_WKUP0_ENABLE_SHIFT)) & SOCCIU_PAD_WKUP0_ENABLE_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_PU_PD_EN0 - Pad Pull-up Pull-down Enable1 */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO0_PU_PD_EN_MASK (0x3U)\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO0_PU_PD_EN_SHIFT (0U)\r\n/*! GPIO0_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[0] */\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO0_PU_PD_EN(x)   (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN0_GPIO0_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN0_GPIO0_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO1_PU_PD_EN_MASK (0xCU)\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO1_PU_PD_EN_SHIFT (2U)\r\n/*! GPIO1_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[1] */\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO1_PU_PD_EN(x)   (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN0_GPIO1_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN0_GPIO1_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO2_PU_PD_EN_MASK (0x30U)\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO2_PU_PD_EN_SHIFT (4U)\r\n/*! GPIO2_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[2] */\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO2_PU_PD_EN(x)   (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN0_GPIO2_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN0_GPIO2_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO3_PU_PD_EN_MASK (0xC0U)\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO3_PU_PD_EN_SHIFT (6U)\r\n/*! GPIO3_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[3] */\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO3_PU_PD_EN(x)   (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN0_GPIO3_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN0_GPIO3_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO4_PU_PD_EN_MASK (0x300U)\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO4_PU_PD_EN_SHIFT (8U)\r\n/*! GPIO4_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[4] */\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO4_PU_PD_EN(x)   (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN0_GPIO4_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN0_GPIO4_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO5_PU_PD_EN_MASK (0xC00U)\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO5_PU_PD_EN_SHIFT (10U)\r\n/*! GPIO5_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[5] */\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO5_PU_PD_EN(x)   (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN0_GPIO5_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN0_GPIO5_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO6_PU_PD_EN_MASK (0x3000U)\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO6_PU_PD_EN_SHIFT (12U)\r\n/*! GPIO6_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[6] */\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO6_PU_PD_EN(x)   (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN0_GPIO6_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN0_GPIO6_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO7_PU_PD_EN_MASK (0xC000U)\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO7_PU_PD_EN_SHIFT (14U)\r\n/*! GPIO7_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[7] */\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO7_PU_PD_EN(x)   (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN0_GPIO7_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN0_GPIO7_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO8_PU_PD_EN_MASK (0x30000U)\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO8_PU_PD_EN_SHIFT (16U)\r\n/*! GPIO8_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[8] */\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO8_PU_PD_EN(x)   (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN0_GPIO8_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN0_GPIO8_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO9_PU_PD_EN_MASK (0xC0000U)\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO9_PU_PD_EN_SHIFT (18U)\r\n/*! GPIO9_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[9] */\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO9_PU_PD_EN(x)   (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN0_GPIO9_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN0_GPIO9_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO10_PU_PD_EN_MASK (0x300000U)\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO10_PU_PD_EN_SHIFT (20U)\r\n/*! GPIO10_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[10] */\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO10_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN0_GPIO10_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN0_GPIO10_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO11_PU_PD_EN_MASK (0xC00000U)\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO11_PU_PD_EN_SHIFT (22U)\r\n/*! GPIO11_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[11] */\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO11_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN0_GPIO11_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN0_GPIO11_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO12_PU_PD_EN_MASK (0x3000000U)\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO12_PU_PD_EN_SHIFT (24U)\r\n/*! GPIO12_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[12] */\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO12_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN0_GPIO12_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN0_GPIO12_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO13_PU_PD_EN_MASK (0xC000000U)\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO13_PU_PD_EN_SHIFT (26U)\r\n/*! GPIO13_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[13] */\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO13_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN0_GPIO13_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN0_GPIO13_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO14_PU_PD_EN_MASK (0x30000000U)\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO14_PU_PD_EN_SHIFT (28U)\r\n/*! GPIO14_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[14] */\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO14_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN0_GPIO14_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN0_GPIO14_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO15_PU_PD_EN_MASK (0xC0000000U)\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO15_PU_PD_EN_SHIFT (30U)\r\n/*! GPIO15_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[15] */\r\n#define SOCCIU_PAD_PU_PD_EN0_GPIO15_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN0_GPIO15_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN0_GPIO15_PU_PD_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_PU_PD_EN1 - Pad Pull-up Pull-down Enable2 */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO16_PU_PD_EN_MASK (0x3U)\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO16_PU_PD_EN_SHIFT (0U)\r\n/*! GPIO16_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[16] */\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO16_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN1_GPIO16_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN1_GPIO16_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO17_PU_PD_EN_MASK (0xCU)\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO17_PU_PD_EN_SHIFT (2U)\r\n/*! GPIO17_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[17] */\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO17_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN1_GPIO17_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN1_GPIO17_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO18_PU_PD_EN_MASK (0x30U)\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO18_PU_PD_EN_SHIFT (4U)\r\n/*! GPIO18_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[18] */\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO18_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN1_GPIO18_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN1_GPIO18_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO19_PU_PD_EN_MASK (0xC0U)\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO19_PU_PD_EN_SHIFT (6U)\r\n/*! GPIO19_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[19] */\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO19_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN1_GPIO19_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN1_GPIO19_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO20_PU_PD_EN_MASK (0x300U)\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO20_PU_PD_EN_SHIFT (8U)\r\n/*! GPIO20_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[20] */\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO20_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN1_GPIO20_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN1_GPIO20_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO21_PU_PD_EN_MASK (0xC00U)\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO21_PU_PD_EN_SHIFT (10U)\r\n/*! GPIO21_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[21] */\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO21_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN1_GPIO21_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN1_GPIO21_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO28_PU_PD_EN_MASK (0x3000000U)\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO28_PU_PD_EN_SHIFT (24U)\r\n/*! GPIO28_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[28] */\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO28_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN1_GPIO28_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN1_GPIO28_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO29_PU_PD_EN_MASK (0xC000000U)\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO29_PU_PD_EN_SHIFT (26U)\r\n/*! GPIO29_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[29] */\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO29_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN1_GPIO29_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN1_GPIO29_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO30_PU_PD_EN_MASK (0x30000000U)\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO30_PU_PD_EN_SHIFT (28U)\r\n/*! GPIO30_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[30] */\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO30_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN1_GPIO30_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN1_GPIO30_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO31_PU_PD_EN_MASK (0xC0000000U)\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO31_PU_PD_EN_SHIFT (30U)\r\n/*! GPIO31_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[31] */\r\n#define SOCCIU_PAD_PU_PD_EN1_GPIO31_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN1_GPIO31_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN1_GPIO31_PU_PD_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_PU_PD_EN2 - Pad Pull-up Pull-down Enable2 */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO32_PU_PD_EN_MASK (0x3U)\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO32_PU_PD_EN_SHIFT (0U)\r\n/*! GPIO32_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[32] */\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO32_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN2_GPIO32_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN2_GPIO32_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO33_PU_PD_EN_MASK (0xCU)\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO33_PU_PD_EN_SHIFT (2U)\r\n/*! GPIO33_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[33] */\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO33_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN2_GPIO33_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN2_GPIO33_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO34_PU_PD_EN_MASK (0x30U)\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO34_PU_PD_EN_SHIFT (4U)\r\n/*! GPIO34_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[34] */\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO34_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN2_GPIO34_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN2_GPIO34_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO35_PU_PD_EN_MASK (0xC0U)\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO35_PU_PD_EN_SHIFT (6U)\r\n/*! GPIO35_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[35] */\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO35_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN2_GPIO35_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN2_GPIO35_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO36_PU_PD_EN_MASK (0x300U)\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO36_PU_PD_EN_SHIFT (8U)\r\n/*! GPIO36_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[36] */\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO36_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN2_GPIO36_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN2_GPIO36_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO37_PU_PD_EN_MASK (0xC00U)\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO37_PU_PD_EN_SHIFT (10U)\r\n/*! GPIO37_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[37] */\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO37_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN2_GPIO37_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN2_GPIO37_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO38_PU_PD_EN_MASK (0x3000U)\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO38_PU_PD_EN_SHIFT (12U)\r\n/*! GPIO38_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[38] */\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO38_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN2_GPIO38_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN2_GPIO38_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO39_PU_PD_EN_MASK (0xC000U)\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO39_PU_PD_EN_SHIFT (14U)\r\n/*! GPIO39_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[39] */\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO39_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN2_GPIO39_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN2_GPIO39_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO40_PU_PD_EN_MASK (0x30000U)\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO40_PU_PD_EN_SHIFT (16U)\r\n/*! GPIO40_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[40] */\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO40_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN2_GPIO40_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN2_GPIO40_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO41_PU_PD_EN_MASK (0xC0000U)\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO41_PU_PD_EN_SHIFT (18U)\r\n/*! GPIO41_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[41] */\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO41_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN2_GPIO41_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN2_GPIO41_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO42_PU_PD_EN_MASK (0x300000U)\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO42_PU_PD_EN_SHIFT (20U)\r\n/*! GPIO42_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[42] */\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO42_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN2_GPIO42_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN2_GPIO42_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO43_PU_PD_EN_MASK (0xC00000U)\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO43_PU_PD_EN_SHIFT (22U)\r\n/*! GPIO43_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[43] */\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO43_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN2_GPIO43_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN2_GPIO43_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO44_PU_PD_EN_MASK (0x3000000U)\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO44_PU_PD_EN_SHIFT (24U)\r\n/*! GPIO44_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[44] */\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO44_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN2_GPIO44_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN2_GPIO44_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO45_PU_PD_EN_MASK (0xC000000U)\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO45_PU_PD_EN_SHIFT (26U)\r\n/*! GPIO45_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[45] */\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO45_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN2_GPIO45_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN2_GPIO45_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO46_PU_PD_EN_MASK (0x30000000U)\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO46_PU_PD_EN_SHIFT (28U)\r\n/*! GPIO46_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[46] */\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO46_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN2_GPIO46_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN2_GPIO46_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO47_PU_PD_EN_MASK (0xC0000000U)\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO47_PU_PD_EN_SHIFT (30U)\r\n/*! GPIO47_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[47] */\r\n#define SOCCIU_PAD_PU_PD_EN2_GPIO47_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN2_GPIO47_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN2_GPIO47_PU_PD_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_PU_PD_EN3 - Pad Pull-up Pull-down Enable2 */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO48_PU_PD_EN_MASK (0x3U)\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO48_PU_PD_EN_SHIFT (0U)\r\n/*! GPIO48_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[48] */\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO48_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN3_GPIO48_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN3_GPIO48_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO49_PU_PD_EN_MASK (0xCU)\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO49_PU_PD_EN_SHIFT (2U)\r\n/*! GPIO49_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[49] */\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO49_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN3_GPIO49_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN3_GPIO49_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO50_PU_PD_EN_MASK (0x30U)\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO50_PU_PD_EN_SHIFT (4U)\r\n/*! GPIO50_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[50] */\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO50_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN3_GPIO50_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN3_GPIO50_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO51_PU_PD_EN_MASK (0xC0U)\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO51_PU_PD_EN_SHIFT (6U)\r\n/*! GPIO51_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[51] */\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO51_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN3_GPIO51_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN3_GPIO51_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO52_PU_PD_EN_MASK (0x300U)\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO52_PU_PD_EN_SHIFT (8U)\r\n/*! GPIO52_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[52] */\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO52_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN3_GPIO52_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN3_GPIO52_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO53_PU_PD_EN_MASK (0xC00U)\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO53_PU_PD_EN_SHIFT (10U)\r\n/*! GPIO53_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[53] */\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO53_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN3_GPIO53_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN3_GPIO53_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO54_PU_PD_EN_MASK (0x3000U)\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO54_PU_PD_EN_SHIFT (12U)\r\n/*! GPIO54_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[54] */\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO54_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN3_GPIO54_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN3_GPIO54_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO55_PU_PD_EN_MASK (0xC000U)\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO55_PU_PD_EN_SHIFT (14U)\r\n/*! GPIO55_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[55] */\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO55_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN3_GPIO55_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN3_GPIO55_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO56_PU_PD_EN_MASK (0x30000U)\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO56_PU_PD_EN_SHIFT (16U)\r\n/*! GPIO56_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[56] */\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO56_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN3_GPIO56_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN3_GPIO56_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO57_PU_PD_EN_MASK (0xC0000U)\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO57_PU_PD_EN_SHIFT (18U)\r\n/*! GPIO57_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[57] */\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO57_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN3_GPIO57_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN3_GPIO57_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO58_PU_PD_EN_MASK (0x300000U)\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO58_PU_PD_EN_SHIFT (20U)\r\n/*! GPIO58_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[58] */\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO58_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN3_GPIO58_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN3_GPIO58_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO59_PU_PD_EN_MASK (0xC00000U)\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO59_PU_PD_EN_SHIFT (22U)\r\n/*! GPIO59_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[59] */\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO59_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN3_GPIO59_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN3_GPIO59_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO60_PU_PD_EN_MASK (0x3000000U)\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO60_PU_PD_EN_SHIFT (24U)\r\n/*! GPIO60_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[60] */\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO60_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN3_GPIO60_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN3_GPIO60_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO61_PU_PD_EN_MASK (0xC000000U)\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO61_PU_PD_EN_SHIFT (26U)\r\n/*! GPIO61_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[61] */\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO61_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN3_GPIO61_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN3_GPIO61_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO62_PU_PD_EN_MASK (0x30000000U)\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO62_PU_PD_EN_SHIFT (28U)\r\n/*! GPIO62_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[62] */\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO62_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN3_GPIO62_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN3_GPIO62_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO63_PU_PD_EN_MASK (0xC0000000U)\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO63_PU_PD_EN_SHIFT (30U)\r\n/*! GPIO63_PU_PD_EN - Internal Pd and Internal Pu Config for GPIO[63] */\r\n#define SOCCIU_PAD_PU_PD_EN3_GPIO63_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN3_GPIO63_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN3_GPIO63_PU_PD_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_PU_PD_EN4 - Pad Pull-up Pull-down Enable2 */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_PU_PD_EN4_ATEST0_PU_PD_EN_MASK (0x3U)\r\n#define SOCCIU_PAD_PU_PD_EN4_ATEST0_PU_PD_EN_SHIFT (0U)\r\n/*! ATEST0_PU_PD_EN - Internal Pd and Internal Pu Config for ATEST0 */\r\n#define SOCCIU_PAD_PU_PD_EN4_ATEST0_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN4_ATEST0_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN4_ATEST0_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN4_ATEST1_PU_PD_EN_MASK (0xCU)\r\n#define SOCCIU_PAD_PU_PD_EN4_ATEST1_PU_PD_EN_SHIFT (2U)\r\n/*! ATEST1_PU_PD_EN - Internal Pd and Internal Pu Config for ATEST1 */\r\n#define SOCCIU_PAD_PU_PD_EN4_ATEST1_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN4_ATEST1_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN4_ATEST1_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN4_ATEST2_PU_PD_EN_MASK (0x30U)\r\n#define SOCCIU_PAD_PU_PD_EN4_ATEST2_PU_PD_EN_SHIFT (4U)\r\n/*! ATEST2_PU_PD_EN - Internal Pd and Internal Pu Config for ATEST2 */\r\n#define SOCCIU_PAD_PU_PD_EN4_ATEST2_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN4_ATEST2_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN4_ATEST2_PU_PD_EN_MASK)\r\n\r\n#define SOCCIU_PAD_PU_PD_EN4_ATEST3_PU_PD_EN_MASK (0xC0U)\r\n#define SOCCIU_PAD_PU_PD_EN4_ATEST3_PU_PD_EN_SHIFT (6U)\r\n/*! ATEST3_PU_PD_EN - Internal Pd and Internal Pu Config for ATEST3 */\r\n#define SOCCIU_PAD_PU_PD_EN4_ATEST3_PU_PD_EN(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_PU_PD_EN4_ATEST3_PU_PD_EN_SHIFT)) & SOCCIU_PAD_PU_PD_EN4_ATEST3_PU_PD_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_SLP_EN0 - Pad Sleep Mode Enable */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO0_SLP_EN_MASK     (0x1U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO0_SLP_EN_SHIFT    (0U)\r\n/*! GPIO0_SLP_EN - Enable Forcing GPIO[0] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO0_SLP_EN(x)       (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO0_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO0_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO1_SLP_EN_MASK     (0x2U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO1_SLP_EN_SHIFT    (1U)\r\n/*! GPIO1_SLP_EN - Enable Forcing GPIO[1] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO1_SLP_EN(x)       (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO1_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO1_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO2_SLP_EN_MASK     (0x4U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO2_SLP_EN_SHIFT    (2U)\r\n/*! GPIO2_SLP_EN - Enable Forcing GPIO[2] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO2_SLP_EN(x)       (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO2_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO2_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO3_SLP_EN_MASK     (0x8U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO3_SLP_EN_SHIFT    (3U)\r\n/*! GPIO3_SLP_EN - Enable Forcing GPIO[3] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO3_SLP_EN(x)       (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO3_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO3_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO4_SLP_EN_MASK     (0x10U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO4_SLP_EN_SHIFT    (4U)\r\n/*! GPIO4_SLP_EN - Enable Forcing GPIO[4] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO4_SLP_EN(x)       (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO4_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO4_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO5_SLP_EN_MASK     (0x20U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO5_SLP_EN_SHIFT    (5U)\r\n/*! GPIO5_SLP_EN - Enable Forcing GPIO[5] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO5_SLP_EN(x)       (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO5_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO5_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO6_SLP_EN_MASK     (0x40U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO6_SLP_EN_SHIFT    (6U)\r\n/*! GPIO6_SLP_EN - Enable Forcing GPIO[6] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO6_SLP_EN(x)       (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO6_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO6_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO7_SLP_EN_MASK     (0x80U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO7_SLP_EN_SHIFT    (7U)\r\n/*! GPIO7_SLP_EN - Enable Forcing GPIO[7] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO7_SLP_EN(x)       (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO7_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO7_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO8_SLP_EN_MASK     (0x100U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO8_SLP_EN_SHIFT    (8U)\r\n/*! GPIO8_SLP_EN - Enable Forcing GPIO[8] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO8_SLP_EN(x)       (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO8_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO8_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO9_SLP_EN_MASK     (0x200U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO9_SLP_EN_SHIFT    (9U)\r\n/*! GPIO9_SLP_EN - Enable Forcing GPIO[9] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO9_SLP_EN(x)       (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO9_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO9_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO10_SLP_EN_MASK    (0x400U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO10_SLP_EN_SHIFT   (10U)\r\n/*! GPIO10_SLP_EN - Enable Forcing GPIO[10] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO10_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO10_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO10_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO11_SLP_EN_MASK    (0x800U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO11_SLP_EN_SHIFT   (11U)\r\n/*! GPIO11_SLP_EN - Enable Forcing GPIO[11] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO11_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO11_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO11_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO12_SLP_EN_MASK    (0x1000U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO12_SLP_EN_SHIFT   (12U)\r\n/*! GPIO12_SLP_EN - Enable Forcing GPIO[12] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO12_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO12_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO12_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO13_SLP_EN_MASK    (0x2000U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO13_SLP_EN_SHIFT   (13U)\r\n/*! GPIO13_SLP_EN - Enable Forcing GPIO[13] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO13_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO13_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO13_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO14_SLP_EN_MASK    (0x4000U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO14_SLP_EN_SHIFT   (14U)\r\n/*! GPIO14_SLP_EN - Enable Forcing GPIO[14] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO14_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO14_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO14_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO15_SLP_EN_MASK    (0x8000U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO15_SLP_EN_SHIFT   (15U)\r\n/*! GPIO15_SLP_EN - Enable Forcing GPIO[15] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO15_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO15_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO15_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO16_SLP_EN_MASK    (0x10000U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO16_SLP_EN_SHIFT   (16U)\r\n/*! GPIO16_SLP_EN - Enable Forcing GPIO[16] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO16_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO16_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO16_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO17_SLP_EN_MASK    (0x20000U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO17_SLP_EN_SHIFT   (17U)\r\n/*! GPIO17_SLP_EN - Enable Forcing GPIO[17] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO17_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO17_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO17_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO18_SLP_EN_MASK    (0x40000U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO18_SLP_EN_SHIFT   (18U)\r\n/*! GPIO18_SLP_EN - Enable Forcing GPIO[18] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO18_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO18_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO18_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO19_SLP_EN_MASK    (0x80000U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO19_SLP_EN_SHIFT   (19U)\r\n/*! GPIO19_SLP_EN - Enable Forcing GPIO[19] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO19_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO19_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO19_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO20_SLP_EN_MASK    (0x100000U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO20_SLP_EN_SHIFT   (20U)\r\n/*! GPIO20_SLP_EN - Enable Forcing GPIO[20] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO20_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO20_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO20_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO21_SLP_EN_MASK    (0x200000U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO21_SLP_EN_SHIFT   (21U)\r\n/*! GPIO21_SLP_EN - Enable Forcing GPIO[21] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO21_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO21_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO21_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO28_SLP_EN_MASK    (0x10000000U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO28_SLP_EN_SHIFT   (28U)\r\n/*! GPIO28_SLP_EN - Enable Forcing GPIO[28] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO28_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO28_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO28_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO29_SLP_EN_MASK    (0x20000000U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO29_SLP_EN_SHIFT   (29U)\r\n/*! GPIO29_SLP_EN - Enable Forcing GPIO[29] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO29_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO29_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO29_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO30_SLP_EN_MASK    (0x40000000U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO30_SLP_EN_SHIFT   (30U)\r\n/*! GPIO30_SLP_EN - Enable Forcing GPIO[30] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO30_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO30_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO30_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN0_GPIO31_SLP_EN_MASK    (0x80000000U)\r\n#define SOCCIU_PAD_SLP_EN0_GPIO31_SLP_EN_SHIFT   (31U)\r\n/*! GPIO31_SLP_EN - Enable Forcing GPIO[31] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN0_GPIO31_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN0_GPIO31_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN0_GPIO31_SLP_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_SLP_EN1 - Pad Sleep Mode Enable */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO32_SLP_EN_MASK    (0x1U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO32_SLP_EN_SHIFT   (0U)\r\n/*! GPIO32_SLP_EN - Enable Forcing GPIO[32] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO32_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO32_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO32_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO33_SLP_EN_MASK    (0x2U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO33_SLP_EN_SHIFT   (1U)\r\n/*! GPIO33_SLP_EN - Enable Forcing GPIO[33] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO33_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO33_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO33_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO34_SLP_EN_MASK    (0x4U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO34_SLP_EN_SHIFT   (2U)\r\n/*! GPIO34_SLP_EN - Enable Forcing GPIO[34] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO34_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO34_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO34_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO35_SLP_EN_MASK    (0x8U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO35_SLP_EN_SHIFT   (3U)\r\n/*! GPIO35_SLP_EN - Enable Forcing GPIO[35] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO35_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO35_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO35_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO36_SLP_EN_MASK    (0x10U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO36_SLP_EN_SHIFT   (4U)\r\n/*! GPIO36_SLP_EN - Enable Forcing GPIO[36] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO36_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO36_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO36_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO37_SLP_EN_MASK    (0x20U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO37_SLP_EN_SHIFT   (5U)\r\n/*! GPIO37_SLP_EN - Enable Forcing GPIO[37] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO37_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO37_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO37_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO38_SLP_EN_MASK    (0x40U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO38_SLP_EN_SHIFT   (6U)\r\n/*! GPIO38_SLP_EN - Enable Forcing GPIO[38] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO38_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO38_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO38_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO39_SLP_EN_MASK    (0x80U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO39_SLP_EN_SHIFT   (7U)\r\n/*! GPIO39_SLP_EN - Enable Forcing GPIO[39] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO39_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO39_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO39_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO40_SLP_EN_MASK    (0x100U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO40_SLP_EN_SHIFT   (8U)\r\n/*! GPIO40_SLP_EN - Enable Forcing GPIO[40] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO40_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO40_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO40_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO41_SLP_EN_MASK    (0x200U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO41_SLP_EN_SHIFT   (9U)\r\n/*! GPIO41_SLP_EN - Enable Forcing GPIO[41] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO41_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO41_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO41_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO42_SLP_EN_MASK    (0x400U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO42_SLP_EN_SHIFT   (10U)\r\n/*! GPIO42_SLP_EN - Enable Forcing GPIO[42] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO42_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO42_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO42_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO43_SLP_EN_MASK    (0x800U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO43_SLP_EN_SHIFT   (11U)\r\n/*! GPIO43_SLP_EN - Enable Forcing GPIO[43] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO43_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO43_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO43_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO44_SLP_EN_MASK    (0x1000U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO44_SLP_EN_SHIFT   (12U)\r\n/*! GPIO44_SLP_EN - Enable Forcing GPIO[44] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO44_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO44_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO44_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO45_SLP_EN_MASK    (0x2000U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO45_SLP_EN_SHIFT   (13U)\r\n/*! GPIO45_SLP_EN - Enable Forcing GPIO[45] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO45_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO45_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO45_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO46_SLP_EN_MASK    (0x4000U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO46_SLP_EN_SHIFT   (14U)\r\n/*! GPIO46_SLP_EN - Enable Forcing GPIO[46] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO46_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO46_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO46_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO47_SLP_EN_MASK    (0x8000U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO47_SLP_EN_SHIFT   (15U)\r\n/*! GPIO47_SLP_EN - Enable Forcing GPIO[47] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO47_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO47_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO47_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO48_SLP_EN_MASK    (0x10000U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO48_SLP_EN_SHIFT   (16U)\r\n/*! GPIO48_SLP_EN - Enable Forcing GPIO[48] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO48_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO48_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO48_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO49_SLP_EN_MASK    (0x20000U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO49_SLP_EN_SHIFT   (17U)\r\n/*! GPIO49_SLP_EN - Enable Forcing GPIO[49] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO49_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO49_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO49_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO50_SLP_EN_MASK    (0x40000U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO50_SLP_EN_SHIFT   (18U)\r\n/*! GPIO50_SLP_EN - Enable Forcing GPIO[50] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO50_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO50_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO50_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO51_SLP_EN_MASK    (0x80000U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO51_SLP_EN_SHIFT   (19U)\r\n/*! GPIO51_SLP_EN - Enable Forcing GPIO[51] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO51_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO51_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO51_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO52_SLP_EN_MASK    (0x100000U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO52_SLP_EN_SHIFT   (20U)\r\n/*! GPIO52_SLP_EN - Enable Forcing GPIO[52] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO52_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO52_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO52_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO53_SLP_EN_MASK    (0x200000U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO53_SLP_EN_SHIFT   (21U)\r\n/*! GPIO53_SLP_EN - Enable Forcing GPIO[53] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO53_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO53_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO53_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO54_SLP_EN_MASK    (0x400000U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO54_SLP_EN_SHIFT   (22U)\r\n/*! GPIO54_SLP_EN - Enable Forcing GPIO[54] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO54_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO54_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO54_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO55_SLP_EN_MASK    (0x800000U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO55_SLP_EN_SHIFT   (23U)\r\n/*! GPIO55_SLP_EN - Enable Forcing GPIO[55] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO55_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO55_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO55_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO56_SLP_EN_MASK    (0x1000000U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO56_SLP_EN_SHIFT   (24U)\r\n/*! GPIO56_SLP_EN - Enable Forcing GPIO[56] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO56_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO56_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO56_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO57_SLP_EN_MASK    (0x2000000U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO57_SLP_EN_SHIFT   (25U)\r\n/*! GPIO57_SLP_EN - Enable Forcing GPIO[57] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO57_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO57_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO57_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO58_SLP_EN_MASK    (0x4000000U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO58_SLP_EN_SHIFT   (26U)\r\n/*! GPIO58_SLP_EN - Enable Forcing GPIO[58] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO58_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO58_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO58_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO59_SLP_EN_MASK    (0x8000000U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO59_SLP_EN_SHIFT   (27U)\r\n/*! GPIO59_SLP_EN - Enable Forcing GPIO[59] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO59_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO59_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO59_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO60_SLP_EN_MASK    (0x10000000U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO60_SLP_EN_SHIFT   (28U)\r\n/*! GPIO60_SLP_EN - Enable Forcing GPIO[60] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO60_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO60_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO60_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO61_SLP_EN_MASK    (0x20000000U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO61_SLP_EN_SHIFT   (29U)\r\n/*! GPIO61_SLP_EN - Enable Forcing GPIO[61] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO61_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO61_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO61_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO62_SLP_EN_MASK    (0x40000000U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO62_SLP_EN_SHIFT   (30U)\r\n/*! GPIO62_SLP_EN - Enable Forcing GPIO[62] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO62_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO62_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO62_SLP_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_EN1_GPIO63_SLP_EN_MASK    (0x80000000U)\r\n#define SOCCIU_PAD_SLP_EN1_GPIO63_SLP_EN_SHIFT   (31U)\r\n/*! GPIO63_SLP_EN - Enable Forcing GPIO[63] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_EN1_GPIO63_SLP_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_EN1_GPIO63_SLP_EN_SHIFT)) & SOCCIU_PAD_SLP_EN1_GPIO63_SLP_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_SLP_VAL0 - Pad Sleep Mode Value */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO0_SLP_VAL_MASK   (0x1U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO0_SLP_VAL_SHIFT  (0U)\r\n/*! GPIO0_SLP_VAL - Force GPIO[0] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO0_SLP_VAL(x)     (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO0_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO0_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO1_SLP_VAL_MASK   (0x2U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO1_SLP_VAL_SHIFT  (1U)\r\n/*! GPIO1_SLP_VAL - Force GPIO[1] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO1_SLP_VAL(x)     (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO1_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO1_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO2_SLP_VAL_MASK   (0x4U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO2_SLP_VAL_SHIFT  (2U)\r\n/*! GPIO2_SLP_VAL - Force GPIO[2] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO2_SLP_VAL(x)     (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO2_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO2_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO3_SLP_VAL_MASK   (0x8U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO3_SLP_VAL_SHIFT  (3U)\r\n/*! GPIO3_SLP_VAL - Force GPIO[3] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO3_SLP_VAL(x)     (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO3_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO3_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO4_SLP_VAL_MASK   (0x10U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO4_SLP_VAL_SHIFT  (4U)\r\n/*! GPIO4_SLP_VAL - Force GPIO[4] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO4_SLP_VAL(x)     (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO4_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO4_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO5_SLP_VAL_MASK   (0x20U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO5_SLP_VAL_SHIFT  (5U)\r\n/*! GPIO5_SLP_VAL - Force GPIO[5] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO5_SLP_VAL(x)     (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO5_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO5_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO6_SLP_VAL_MASK   (0x40U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO6_SLP_VAL_SHIFT  (6U)\r\n/*! GPIO6_SLP_VAL - Force GPIO[6] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO6_SLP_VAL(x)     (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO6_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO6_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO7_SLP_VAL_MASK   (0x80U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO7_SLP_VAL_SHIFT  (7U)\r\n/*! GPIO7_SLP_VAL - Force GPIO[7] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO7_SLP_VAL(x)     (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO7_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO7_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO8_SLP_VAL_MASK   (0x100U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO8_SLP_VAL_SHIFT  (8U)\r\n/*! GPIO8_SLP_VAL - Force GPIO[8] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO8_SLP_VAL(x)     (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO8_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO8_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO9_SLP_VAL_MASK   (0x200U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO9_SLP_VAL_SHIFT  (9U)\r\n/*! GPIO9_SLP_VAL - Force GPIO[9] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO9_SLP_VAL(x)     (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO9_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO9_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO10_SLP_VAL_MASK  (0x400U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO10_SLP_VAL_SHIFT (10U)\r\n/*! GPIO10_SLP_VAL - Force GPIO[10] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO10_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO10_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO10_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO11_SLP_VAL_MASK  (0x800U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO11_SLP_VAL_SHIFT (11U)\r\n/*! GPIO11_SLP_VAL - Force GPIO[11] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO11_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO11_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO11_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO12_SLP_VAL_MASK  (0x1000U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO12_SLP_VAL_SHIFT (12U)\r\n/*! GPIO12_SLP_VAL - Force GPIO[12] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO12_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO12_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO12_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO13_SLP_VAL_MASK  (0x2000U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO13_SLP_VAL_SHIFT (13U)\r\n/*! GPIO13_SLP_VAL - Force GPIO[13] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO13_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO13_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO13_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO14_SLP_VAL_MASK  (0x4000U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO14_SLP_VAL_SHIFT (14U)\r\n/*! GPIO14_SLP_VAL - Force GPIO[14] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO14_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO14_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO14_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO15_SLP_VAL_MASK  (0x8000U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO15_SLP_VAL_SHIFT (15U)\r\n/*! GPIO15_SLP_VAL - Force GPIO[15] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO15_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO15_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO15_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO16_SLP_VAL_MASK  (0x10000U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO16_SLP_VAL_SHIFT (16U)\r\n/*! GPIO16_SLP_VAL - Force GPIO[16] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO16_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO16_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO16_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO17_SLP_VAL_MASK  (0x20000U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO17_SLP_VAL_SHIFT (17U)\r\n/*! GPIO17_SLP_VAL - Force GPIO[17] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO17_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO17_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO17_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO18_SLP_VAL_MASK  (0x40000U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO18_SLP_VAL_SHIFT (18U)\r\n/*! GPIO18_SLP_VAL - Force GPIO[18] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO18_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO18_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO18_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO19_SLP_VAL_MASK  (0x80000U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO19_SLP_VAL_SHIFT (19U)\r\n/*! GPIO19_SLP_VAL - Force GPIO[19] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO19_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO19_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO19_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO20_SLP_VAL_MASK  (0x100000U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO20_SLP_VAL_SHIFT (20U)\r\n/*! GPIO20_SLP_VAL - Force GPIO[20] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO20_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO20_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO20_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO21_SLP_VAL_MASK  (0x200000U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO21_SLP_VAL_SHIFT (21U)\r\n/*! GPIO21_SLP_VAL - Force GPIO[21] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO21_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO21_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO21_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO28_SLP_VAL_MASK  (0x10000000U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO28_SLP_VAL_SHIFT (28U)\r\n/*! GPIO28_SLP_VAL - Force GPIO[28] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO28_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO28_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO28_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO29_SLP_VAL_MASK  (0x20000000U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO29_SLP_VAL_SHIFT (29U)\r\n/*! GPIO29_SLP_VAL - Force GPIO[29] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO29_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO29_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO29_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO30_SLP_VAL_MASK  (0x40000000U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO30_SLP_VAL_SHIFT (30U)\r\n/*! GPIO30_SLP_VAL - Force GPIO[30] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO30_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO30_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO30_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO31_SLP_VAL_MASK  (0x80000000U)\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO31_SLP_VAL_SHIFT (31U)\r\n/*! GPIO31_SLP_VAL - Force GPIO[31] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL0_GPIO31_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL0_GPIO31_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL0_GPIO31_SLP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_SLP_VAL1 - Pad Sleep Mode Value */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO32_SLP_VAL_MASK  (0x1U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO32_SLP_VAL_SHIFT (0U)\r\n/*! GPIO32_SLP_VAL - Force GPIO[32] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO32_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO32_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO32_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO33_SLP_VAL_MASK  (0x2U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO33_SLP_VAL_SHIFT (1U)\r\n/*! GPIO33_SLP_VAL - Force GPIO[33] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO33_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO33_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO33_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO34_SLP_VAL_MASK  (0x4U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO34_SLP_VAL_SHIFT (2U)\r\n/*! GPIO34_SLP_VAL - Force GPIO[34] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO34_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO34_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO34_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO35_SLP_VAL_MASK  (0x8U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO35_SLP_VAL_SHIFT (3U)\r\n/*! GPIO35_SLP_VAL - Force GPIO[35] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO35_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO35_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO35_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO36_SLP_VAL_MASK  (0x10U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO36_SLP_VAL_SHIFT (4U)\r\n/*! GPIO36_SLP_VAL - Force GPIO[36] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO36_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO36_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO36_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO37_SLP_VAL_MASK  (0x20U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO37_SLP_VAL_SHIFT (5U)\r\n/*! GPIO37_SLP_VAL - Force GPIO[37] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO37_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO37_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO37_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO38_SLP_VAL_MASK  (0x40U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO38_SLP_VAL_SHIFT (6U)\r\n/*! GPIO38_SLP_VAL - Force GPIO[38] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO38_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO38_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO38_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO39_SLP_VAL_MASK  (0x80U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO39_SLP_VAL_SHIFT (7U)\r\n/*! GPIO39_SLP_VAL - Force GPIO[39] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO39_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO39_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO39_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO40_SLP_VAL_MASK  (0x100U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO40_SLP_VAL_SHIFT (8U)\r\n/*! GPIO40_SLP_VAL - Force GPIO[40] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO40_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO40_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO40_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO41_SLP_VAL_MASK  (0x200U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO41_SLP_VAL_SHIFT (9U)\r\n/*! GPIO41_SLP_VAL - Force GPIO[41] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO41_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO41_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO41_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO42_SLP_VAL_MASK  (0x400U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO42_SLP_VAL_SHIFT (10U)\r\n/*! GPIO42_SLP_VAL - Force GPIO[42] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO42_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO42_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO42_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO43_SLP_VAL_MASK  (0x800U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO43_SLP_VAL_SHIFT (11U)\r\n/*! GPIO43_SLP_VAL - Force GPIO[43] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO43_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO43_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO43_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO44_SLP_VAL_MASK  (0x1000U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO44_SLP_VAL_SHIFT (12U)\r\n/*! GPIO44_SLP_VAL - Force GPIO[44] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO44_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO44_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO44_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO45_SLP_VAL_MASK  (0x2000U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO45_SLP_VAL_SHIFT (13U)\r\n/*! GPIO45_SLP_VAL - Force GPIO[45] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO45_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO45_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO45_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO46_SLP_VAL_MASK  (0x4000U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO46_SLP_VAL_SHIFT (14U)\r\n/*! GPIO46_SLP_VAL - Force GPIO[46] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO46_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO46_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO46_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO47_SLP_VAL_MASK  (0x8000U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO47_SLP_VAL_SHIFT (15U)\r\n/*! GPIO47_SLP_VAL - Force GPIO[47] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO47_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO47_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO47_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO48_SLP_VAL_MASK  (0x10000U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO48_SLP_VAL_SHIFT (16U)\r\n/*! GPIO48_SLP_VAL - Force GPIO[48] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO48_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO48_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO48_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO49_SLP_VAL_MASK  (0x20000U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO49_SLP_VAL_SHIFT (17U)\r\n/*! GPIO49_SLP_VAL - Force GPIO[49] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO49_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO49_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO49_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO50_SLP_VAL_MASK  (0x40000U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO50_SLP_VAL_SHIFT (18U)\r\n/*! GPIO50_SLP_VAL - Force GPIO[50] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO50_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO50_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO50_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO51_SLP_VAL_MASK  (0x80000U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO51_SLP_VAL_SHIFT (19U)\r\n/*! GPIO51_SLP_VAL - Force GPIO[51] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO51_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO51_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO51_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO52_SLP_VAL_MASK  (0x100000U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO52_SLP_VAL_SHIFT (20U)\r\n/*! GPIO52_SLP_VAL - Force GPIO[52] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO52_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO52_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO52_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO53_SLP_VAL_MASK  (0x200000U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO53_SLP_VAL_SHIFT (21U)\r\n/*! GPIO53_SLP_VAL - Force GPIO[53] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO53_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO53_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO53_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO54_SLP_VAL_MASK  (0x400000U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO54_SLP_VAL_SHIFT (22U)\r\n/*! GPIO54_SLP_VAL - Force GPIO[54] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO54_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO54_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO54_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO55_SLP_VAL_MASK  (0x800000U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO55_SLP_VAL_SHIFT (23U)\r\n/*! GPIO55_SLP_VAL - Force GPIO[55] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO55_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO55_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO55_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO56_SLP_VAL_MASK  (0x1000000U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO56_SLP_VAL_SHIFT (24U)\r\n/*! GPIO56_SLP_VAL - Force GPIO[56] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO56_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO56_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO56_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO57_SLP_VAL_MASK  (0x2000000U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO57_SLP_VAL_SHIFT (25U)\r\n/*! GPIO57_SLP_VAL - Force GPIO[57] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO57_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO57_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO57_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO58_SLP_VAL_MASK  (0x4000000U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO58_SLP_VAL_SHIFT (26U)\r\n/*! GPIO58_SLP_VAL - Force GPIO[58] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO58_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO58_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO58_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO59_SLP_VAL_MASK  (0x8000000U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO59_SLP_VAL_SHIFT (27U)\r\n/*! GPIO59_SLP_VAL - Force GPIO[59] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO59_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO59_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO59_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO60_SLP_VAL_MASK  (0x10000000U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO60_SLP_VAL_SHIFT (28U)\r\n/*! GPIO60_SLP_VAL - Force GPIO[60] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO60_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO60_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO60_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO61_SLP_VAL_MASK  (0x20000000U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO61_SLP_VAL_SHIFT (29U)\r\n/*! GPIO61_SLP_VAL - Force GPIO[61] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO61_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO61_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO61_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO62_SLP_VAL_MASK  (0x40000000U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO62_SLP_VAL_SHIFT (30U)\r\n/*! GPIO62_SLP_VAL - Force GPIO[62] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO62_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO62_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO62_SLP_VAL_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO63_SLP_VAL_MASK  (0x80000000U)\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO63_SLP_VAL_SHIFT (31U)\r\n/*! GPIO63_SLP_VAL - Force GPIO[63] Output During Sleep */\r\n#define SOCCIU_PAD_SLP_VAL1_GPIO63_SLP_VAL(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_VAL1_GPIO63_SLP_VAL_SHIFT)) & SOCCIU_PAD_SLP_VAL1_GPIO63_SLP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSW_VD2_RDY0 - Power Switch VD2_RDY Status */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PSW_VD2_RDY0_PSW_STATUS_MASK      (0xFFFFFFFFU)\r\n#define SOCCIU_PSW_VD2_RDY0_PSW_STATUS_SHIFT     (0U)\r\n/*! PSW_STATUS - VD2_RDY Status of following Power Switches: */\r\n#define SOCCIU_PSW_VD2_RDY0_PSW_STATUS(x)        (((uint32_t)(((uint32_t)(x)) << SOCCIU_PSW_VD2_RDY0_PSW_STATUS_SHIFT)) & SOCCIU_PSW_VD2_RDY0_PSW_STATUS_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSW_ECO_CTRL - Power Switch ECO Control */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PSW_ECO_CTRL_ECO_BITS_MASK        (0xFFFFFFFFU)\r\n#define SOCCIU_PSW_ECO_CTRL_ECO_BITS_SHIFT       (0U)\r\n/*! ECO_BITS - Reserved for ECOs */\r\n#define SOCCIU_PSW_ECO_CTRL_ECO_BITS(x)          (((uint32_t)(((uint32_t)(x)) << SOCCIU_PSW_ECO_CTRL_ECO_BITS_SHIFT)) & SOCCIU_PSW_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLK_SW - Clock Controls for SOC_CLK_TOP */\r\n/*! @{ */\r\n\r\n#define SOCCIU_CLK_SW_CAU_SIF_AHB_CLK_EN_MASK    (0x1U)\r\n#define SOCCIU_CLK_SW_CAU_SIF_AHB_CLK_EN_SHIFT   (0U)\r\n/*! CAU_SIF_AHB_CLK_EN - \" */\r\n#define SOCCIU_CLK_SW_CAU_SIF_AHB_CLK_EN(x)      (((uint32_t)(((uint32_t)(x)) << SOCCIU_CLK_SW_CAU_SIF_AHB_CLK_EN_SHIFT)) & SOCCIU_CLK_SW_CAU_SIF_AHB_CLK_EN_MASK)\r\n\r\n#define SOCCIU_CLK_SW_AHB2APB_CLK_EN_MASK        (0x2U)\r\n#define SOCCIU_CLK_SW_AHB2APB_CLK_EN_SHIFT       (1U)\r\n/*! AHB2APB_CLK_EN - \" */\r\n#define SOCCIU_CLK_SW_AHB2APB_CLK_EN(x)          (((uint32_t)(((uint32_t)(x)) << SOCCIU_CLK_SW_AHB2APB_CLK_EN_SHIFT)) & SOCCIU_CLK_SW_AHB2APB_CLK_EN_MASK)\r\n\r\n#define SOCCIU_CLK_SW_DAPCLKEN_MASK              (0x20U)\r\n#define SOCCIU_CLK_SW_DAPCLKEN_SHIFT             (5U)\r\n/*! DAPCLKEN - clk en for SOC DAP */\r\n#define SOCCIU_CLK_SW_DAPCLKEN(x)                (((uint32_t)(((uint32_t)(x)) << SOCCIU_CLK_SW_DAPCLKEN_SHIFT)) & SOCCIU_CLK_SW_DAPCLKEN_MASK)\r\n\r\n#define SOCCIU_CLK_SW_WL_CM3_DAPCLKEN_MASK       (0x40U)\r\n#define SOCCIU_CLK_SW_WL_CM3_DAPCLKEN_SHIFT      (6U)\r\n/*! WL_CM3_DAPCLKEN - clk en for CPU1 DAP interface */\r\n#define SOCCIU_CLK_SW_WL_CM3_DAPCLKEN(x)         (((uint32_t)(((uint32_t)(x)) << SOCCIU_CLK_SW_WL_CM3_DAPCLKEN_SHIFT)) & SOCCIU_CLK_SW_WL_CM3_DAPCLKEN_MASK)\r\n\r\n#define SOCCIU_CLK_SW_BT_CM3_DAPCLKEN_MASK       (0x80U)\r\n#define SOCCIU_CLK_SW_BT_CM3_DAPCLKEN_SHIFT      (7U)\r\n/*! BT_CM3_DAPCLKEN - clk en for CPU2 DAP interface */\r\n#define SOCCIU_CLK_SW_BT_CM3_DAPCLKEN(x)         (((uint32_t)(((uint32_t)(x)) << SOCCIU_CLK_SW_BT_CM3_DAPCLKEN_SHIFT)) & SOCCIU_CLK_SW_BT_CM3_DAPCLKEN_MASK)\r\n\r\n#define SOCCIU_CLK_SW_CSCLKEN_MASK               (0x200U)\r\n#define SOCCIU_CLK_SW_CSCLKEN_SHIFT              (9U)\r\n/*! CSCLKEN - clk en for SOC Coresight system (includes CTI, CTM, TPIU, ATB Funnel, ATB upsizer) */\r\n#define SOCCIU_CLK_SW_CSCLKEN(x)                 (((uint32_t)(((uint32_t)(x)) << SOCCIU_CLK_SW_CSCLKEN_SHIFT)) & SOCCIU_CLK_SW_CSCLKEN_MASK)\r\n\r\n#define SOCCIU_CLK_SW_WL_CM3_CSCLKEN_MASK        (0x400U)\r\n#define SOCCIU_CLK_SW_WL_CM3_CSCLKEN_SHIFT       (10U)\r\n/*! WL_CM3_CSCLKEN - clk en for CPU1 ATB (ETM and ITM) and CTI interface */\r\n#define SOCCIU_CLK_SW_WL_CM3_CSCLKEN(x)          (((uint32_t)(((uint32_t)(x)) << SOCCIU_CLK_SW_WL_CM3_CSCLKEN_SHIFT)) & SOCCIU_CLK_SW_WL_CM3_CSCLKEN_MASK)\r\n\r\n#define SOCCIU_CLK_SW_BT_CM3_CSCLKEN_MASK        (0x800U)\r\n#define SOCCIU_CLK_SW_BT_CM3_CSCLKEN_SHIFT       (11U)\r\n/*! BT_CM3_CSCLKEN - clk en for CPU2 ATB (ETM and ITM) and CTI interface */\r\n#define SOCCIU_CLK_SW_BT_CM3_CSCLKEN(x)          (((uint32_t)(((uint32_t)(x)) << SOCCIU_CLK_SW_BT_CM3_CSCLKEN_SHIFT)) & SOCCIU_CLK_SW_BT_CM3_CSCLKEN_MASK)\r\n\r\n#define SOCCIU_CLK_SW_CAU_SIF_CLK_SEL_MASK       (0x10000U)\r\n#define SOCCIU_CLK_SW_CAU_SIF_CLK_SEL_SHIFT      (16U)\r\n/*! CAU_SIF_CLK_SEL - CAU SIF Clock Frequency Select */\r\n#define SOCCIU_CLK_SW_CAU_SIF_CLK_SEL(x)         (((uint32_t)(((uint32_t)(x)) << SOCCIU_CLK_SW_CAU_SIF_CLK_SEL_SHIFT)) & SOCCIU_CLK_SW_CAU_SIF_CLK_SEL_MASK)\r\n\r\n#define SOCCIU_CLK_SW_SOC_AHB_CLK_SEL_MASK       (0x20000U)\r\n#define SOCCIU_CLK_SW_SOC_AHB_CLK_SEL_SHIFT      (17U)\r\n/*! SOC_AHB_CLK_SEL - SOC TOP AHB Clock Frequency Select */\r\n#define SOCCIU_CLK_SW_SOC_AHB_CLK_SEL(x)         (((uint32_t)(((uint32_t)(x)) << SOCCIU_CLK_SW_SOC_AHB_CLK_SEL_SHIFT)) & SOCCIU_CLK_SW_SOC_AHB_CLK_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name RST_SW - Reset Controls for SOC_RESET_GEN */\r\n/*! @{ */\r\n\r\n#define SOCCIU_RST_SW_CAU_SIF_RSTN_MASK          (0x1U)\r\n#define SOCCIU_RST_SW_CAU_SIF_RSTN_SHIFT         (0U)\r\n/*! CAU_SIF_RSTN - \" */\r\n#define SOCCIU_RST_SW_CAU_SIF_RSTN(x)            (((uint32_t)(((uint32_t)(x)) << SOCCIU_RST_SW_CAU_SIF_RSTN_SHIFT)) & SOCCIU_RST_SW_CAU_SIF_RSTN_MASK)\r\n\r\n#define SOCCIU_RST_SW_CAU_SIF_HRESETN_MASK       (0x2U)\r\n#define SOCCIU_RST_SW_CAU_SIF_HRESETN_SHIFT      (1U)\r\n/*! CAU_SIF_HRESETN - \" */\r\n#define SOCCIU_RST_SW_CAU_SIF_HRESETN(x)         (((uint32_t)(((uint32_t)(x)) << SOCCIU_RST_SW_CAU_SIF_HRESETN_SHIFT)) & SOCCIU_RST_SW_CAU_SIF_HRESETN_MASK)\r\n\r\n#define SOCCIU_RST_SW_SOC_PERI_HRESETN_MASK      (0x4U)\r\n#define SOCCIU_RST_SW_SOC_PERI_HRESETN_SHIFT     (2U)\r\n/*! SOC_PERI_HRESETN - Falling edge detected on this in RTL to reset the ahb bus */\r\n#define SOCCIU_RST_SW_SOC_PERI_HRESETN(x)        (((uint32_t)(((uint32_t)(x)) << SOCCIU_RST_SW_SOC_PERI_HRESETN_SHIFT)) & SOCCIU_RST_SW_SOC_PERI_HRESETN_MASK)\r\n\r\n#define SOCCIU_RST_SW_DRO_RSTN_MASK              (0x8U)\r\n#define SOCCIU_RST_SW_DRO_RSTN_SHIFT             (3U)\r\n/*! DRO_RSTN - DRO Clock Reset */\r\n#define SOCCIU_RST_SW_DRO_RSTN(x)                (((uint32_t)(((uint32_t)(x)) << SOCCIU_RST_SW_DRO_RSTN_SHIFT)) & SOCCIU_RST_SW_DRO_RSTN_MASK)\r\n\r\n#define SOCCIU_RST_SW_AHB2APB_HRESETN_MASK       (0x10U)\r\n#define SOCCIU_RST_SW_AHB2APB_HRESETN_SHIFT      (4U)\r\n/*! AHB2APB_HRESETN - \" */\r\n#define SOCCIU_RST_SW_AHB2APB_HRESETN(x)         (((uint32_t)(((uint32_t)(x)) << SOCCIU_RST_SW_AHB2APB_HRESETN_SHIFT)) & SOCCIU_RST_SW_AHB2APB_HRESETN_MASK)\r\n\r\n#define SOCCIU_RST_SW_HCLK__MASK                 (0x20U)\r\n#define SOCCIU_RST_SW_HCLK__SHIFT                (5U)\r\n/*! HCLK_ - Auto clear SW reset for socciu */\r\n#define SOCCIU_RST_SW_HCLK_(x)                   (((uint32_t)(((uint32_t)(x)) << SOCCIU_RST_SW_HCLK__SHIFT)) & SOCCIU_RST_SW_HCLK__MASK)\r\n\r\n#define SOCCIU_RST_SW_CSSYS_RESETN_MASK          (0x400U)\r\n#define SOCCIU_RST_SW_CSSYS_RESETN_SHIFT         (10U)\r\n/*! CSSYS_RESETN - SW reset for the cssys cs resetn */\r\n#define SOCCIU_RST_SW_CSSYS_RESETN(x)            (((uint32_t)(((uint32_t)(x)) << SOCCIU_RST_SW_CSSYS_RESETN_SHIFT)) & SOCCIU_RST_SW_CSSYS_RESETN_MASK)\r\n\r\n#define SOCCIU_RST_SW_DAP_RESETN_MASK            (0x800U)\r\n#define SOCCIU_RST_SW_DAP_RESETN_SHIFT           (11U)\r\n/*! DAP_RESETN - SW reset for the dap_resetn */\r\n#define SOCCIU_RST_SW_DAP_RESETN(x)              (((uint32_t)(((uint32_t)(x)) << SOCCIU_RST_SW_DAP_RESETN_SHIFT)) & SOCCIU_RST_SW_DAP_RESETN_MASK)\r\n\r\n#define SOCCIU_RST_SW_WLAN_N_BLE_PORB_DELAY_MASK (0xFF000U)\r\n#define SOCCIU_RST_SW_WLAN_N_BLE_PORB_DELAY_SHIFT (12U)\r\n/*! WLAN_N_BLE_PORB_DELAY - PORB delay for wlan and ble, bootrom can use this feature if needed */\r\n#define SOCCIU_RST_SW_WLAN_N_BLE_PORB_DELAY(x)   (((uint32_t)(((uint32_t)(x)) << SOCCIU_RST_SW_WLAN_N_BLE_PORB_DELAY_SHIFT)) & SOCCIU_RST_SW_WLAN_N_BLE_PORB_DELAY_MASK)\r\n\r\n#define SOCCIU_RST_SW_SOC_ITRC_CHIP_RSTB_EN_MASK (0x100000U)\r\n#define SOCCIU_RST_SW_SOC_ITRC_CHIP_RSTB_EN_SHIFT (20U)\r\n/*! SOC_ITRC_CHIP_RSTB_EN - Default the itrc chip reset can reset SOC, SW can disable this if not required */\r\n#define SOCCIU_RST_SW_SOC_ITRC_CHIP_RSTB_EN(x)   (((uint32_t)(((uint32_t)(x)) << SOCCIU_RST_SW_SOC_ITRC_CHIP_RSTB_EN_SHIFT)) & SOCCIU_RST_SW_SOC_ITRC_CHIP_RSTB_EN_MASK)\r\n\r\n#define SOCCIU_RST_SW_WL_ITRC_CHIP_RSTB_EN_MASK  (0x200000U)\r\n#define SOCCIU_RST_SW_WL_ITRC_CHIP_RSTB_EN_SHIFT (21U)\r\n/*! WL_ITRC_CHIP_RSTB_EN - Default the itrc chip reset can reset WLAN, SW can disable this if not required */\r\n#define SOCCIU_RST_SW_WL_ITRC_CHIP_RSTB_EN(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_RST_SW_WL_ITRC_CHIP_RSTB_EN_SHIFT)) & SOCCIU_RST_SW_WL_ITRC_CHIP_RSTB_EN_MASK)\r\n\r\n#define SOCCIU_RST_SW_BLE_ITRC_CHIP_RSTB_EN_MASK (0x400000U)\r\n#define SOCCIU_RST_SW_BLE_ITRC_CHIP_RSTB_EN_SHIFT (22U)\r\n/*! BLE_ITRC_CHIP_RSTB_EN - Default the itrc chip reset can reset BLE, SW can disable this if not required */\r\n#define SOCCIU_RST_SW_BLE_ITRC_CHIP_RSTB_EN(x)   (((uint32_t)(((uint32_t)(x)) << SOCCIU_RST_SW_BLE_ITRC_CHIP_RSTB_EN_SHIFT)) & SOCCIU_RST_SW_BLE_ITRC_CHIP_RSTB_EN_MASK)\r\n\r\n#define SOCCIU_RST_SW_MSC_ITRC_CHIP_RSTB_EN_MASK (0x800000U)\r\n#define SOCCIU_RST_SW_MSC_ITRC_CHIP_RSTB_EN_SHIFT (23U)\r\n/*! MSC_ITRC_CHIP_RSTB_EN - Default the itrc chip reset can reset MSC, SW can disable this if not required */\r\n#define SOCCIU_RST_SW_MSC_ITRC_CHIP_RSTB_EN(x)   (((uint32_t)(((uint32_t)(x)) << SOCCIU_RST_SW_MSC_ITRC_CHIP_RSTB_EN_SHIFT)) & SOCCIU_RST_SW_MSC_ITRC_CHIP_RSTB_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CHIP_INFO - Chip Information */\r\n/*! @{ */\r\n\r\n#define SOCCIU_CHIP_INFO_REV_NUM_MASK            (0xFFU)\r\n#define SOCCIU_CHIP_INFO_REV_NUM_SHIFT           (0U)\r\n/*! REV_NUM - Chip Revision Number */\r\n#define SOCCIU_CHIP_INFO_REV_NUM(x)              (((uint32_t)(((uint32_t)(x)) << SOCCIU_CHIP_INFO_REV_NUM_SHIFT)) & SOCCIU_CHIP_INFO_REV_NUM_MASK)\r\n\r\n#define SOCCIU_CHIP_INFO_ID_MASK                 (0xFF00U)\r\n#define SOCCIU_CHIP_INFO_ID_SHIFT                (8U)\r\n/*! ID - Chip ID */\r\n#define SOCCIU_CHIP_INFO_ID(x)                   (((uint32_t)(((uint32_t)(x)) << SOCCIU_CHIP_INFO_ID_SHIFT)) & SOCCIU_CHIP_INFO_ID_MASK)\r\n/*! @} */\r\n\r\n/*! @name MCI_POWER_MODE_STATUS - MCI POWER MODE Status */\r\n/*! @{ */\r\n\r\n#define SOCCIU_MCI_POWER_MODE_STATUS_MCI_SLP_STATE_MASK (0x7U)\r\n#define SOCCIU_MCI_POWER_MODE_STATUS_MCI_SLP_STATE_SHIFT (0U)\r\n/*! MCI_SLP_STATE - MCI Power Mode Status */\r\n#define SOCCIU_MCI_POWER_MODE_STATUS_MCI_SLP_STATE(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_MCI_POWER_MODE_STATUS_MCI_SLP_STATE_SHIFT)) & SOCCIU_MCI_POWER_MODE_STATUS_MCI_SLP_STATE_MASK)\r\n\r\n#define SOCCIU_MCI_POWER_MODE_STATUS_MCI_BIST_DONE_MASK (0x8U)\r\n#define SOCCIU_MCI_POWER_MODE_STATUS_MCI_BIST_DONE_SHIFT (3U)\r\n/*! MCI_BIST_DONE - MCI g2bist done status */\r\n#define SOCCIU_MCI_POWER_MODE_STATUS_MCI_BIST_DONE(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_MCI_POWER_MODE_STATUS_MCI_BIST_DONE_SHIFT)) & SOCCIU_MCI_POWER_MODE_STATUS_MCI_BIST_DONE_MASK)\r\n\r\n#define SOCCIU_MCI_POWER_MODE_STATUS_CM33_RESET_N_MASK (0x10U)\r\n#define SOCCIU_MCI_POWER_MODE_STATUS_CM33_RESET_N_SHIFT (4U)\r\n/*! CM33_RESET_N - CM33 Reset status. Active low. */\r\n#define SOCCIU_MCI_POWER_MODE_STATUS_CM33_RESET_N(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_MCI_POWER_MODE_STATUS_CM33_RESET_N_SHIFT)) & SOCCIU_MCI_POWER_MODE_STATUS_CM33_RESET_N_MASK)\r\n\r\n#define SOCCIU_MCI_POWER_MODE_STATUS_CPU3_FW_READY_MASK (0x20U)\r\n#define SOCCIU_MCI_POWER_MODE_STATUS_CPU3_FW_READY_SHIFT (5U)\r\n/*! CPU3_FW_READY - cpu3 FW sets this bit after cpu1 FW initialization is done. */\r\n#define SOCCIU_MCI_POWER_MODE_STATUS_CPU3_FW_READY(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_MCI_POWER_MODE_STATUS_CPU3_FW_READY_SHIFT)) & SOCCIU_MCI_POWER_MODE_STATUS_CPU3_FW_READY_MASK)\r\n/*! @} */\r\n\r\n/*! @name PSW_VD2_RDY1 - Power Switch VD2_RDY Status */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PSW_VD2_RDY1_PSW_STATUS_MASK      (0xFFFFFFFFU)\r\n#define SOCCIU_PSW_VD2_RDY1_PSW_STATUS_SHIFT     (0U)\r\n/*! PSW_STATUS - VD2_RDY Status of following Power Switches: */\r\n#define SOCCIU_PSW_VD2_RDY1_PSW_STATUS(x)        (((uint32_t)(((uint32_t)(x)) << SOCCIU_PSW_VD2_RDY1_PSW_STATUS_SHIFT)) & SOCCIU_PSW_VD2_RDY1_PSW_STATUS_MASK)\r\n/*! @} */\r\n\r\n/*! @name WLAN_POWER_STATUS - WLAN POWER Status */\r\n/*! @{ */\r\n\r\n#define SOCCIU_WLAN_POWER_STATUS_WLRET_PSW_PD_MASK (0x1U)\r\n#define SOCCIU_WLAN_POWER_STATUS_WLRET_PSW_PD_SHIFT (0U)\r\n/*! WLRET_PSW_PD - WLAN-RETENTION domain power-switch control status: */\r\n#define SOCCIU_WLAN_POWER_STATUS_WLRET_PSW_PD(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_WLAN_POWER_STATUS_WLRET_PSW_PD_SHIFT)) & SOCCIU_WLAN_POWER_STATUS_WLRET_PSW_PD_MASK)\r\n\r\n#define SOCCIU_WLAN_POWER_STATUS_WLGATED_PSW_PD_MASK (0x2U)\r\n#define SOCCIU_WLAN_POWER_STATUS_WLGATED_PSW_PD_SHIFT (1U)\r\n/*! WLGATED_PSW_PD - WLAN-GATED domain power-switch control status: */\r\n#define SOCCIU_WLAN_POWER_STATUS_WLGATED_PSW_PD(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_WLAN_POWER_STATUS_WLGATED_PSW_PD_SHIFT)) & SOCCIU_WLAN_POWER_STATUS_WLGATED_PSW_PD_MASK)\r\n\r\n#define SOCCIU_WLAN_POWER_STATUS_CPU1_SLEEP_MASK (0x4U)\r\n#define SOCCIU_WLAN_POWER_STATUS_CPU1_SLEEP_SHIFT (2U)\r\n/*! CPU1_SLEEP - CPU1 cp15 sleep status */\r\n#define SOCCIU_WLAN_POWER_STATUS_CPU1_SLEEP(x)   (((uint32_t)(((uint32_t)(x)) << SOCCIU_WLAN_POWER_STATUS_CPU1_SLEEP_SHIFT)) & SOCCIU_WLAN_POWER_STATUS_CPU1_SLEEP_MASK)\r\n\r\n#define SOCCIU_WLAN_POWER_STATUS_CPU1_BIST_DONE_MASK (0x8U)\r\n#define SOCCIU_WLAN_POWER_STATUS_CPU1_BIST_DONE_SHIFT (3U)\r\n/*! CPU1_BIST_DONE - CPU1 memories g2bist done status */\r\n#define SOCCIU_WLAN_POWER_STATUS_CPU1_BIST_DONE(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_WLAN_POWER_STATUS_CPU1_BIST_DONE_SHIFT)) & SOCCIU_WLAN_POWER_STATUS_CPU1_BIST_DONE_MASK)\r\n\r\n#define SOCCIU_WLAN_POWER_STATUS_CPU1_RESET_N_MASK (0x10U)\r\n#define SOCCIU_WLAN_POWER_STATUS_CPU1_RESET_N_SHIFT (4U)\r\n/*! CPU1_RESET_N - CPU1 Reset status. Active low. */\r\n#define SOCCIU_WLAN_POWER_STATUS_CPU1_RESET_N(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_WLAN_POWER_STATUS_CPU1_RESET_N_SHIFT)) & SOCCIU_WLAN_POWER_STATUS_CPU1_RESET_N_MASK)\r\n\r\n#define SOCCIU_WLAN_POWER_STATUS_CPU1_FW_READY_MASK (0x20U)\r\n#define SOCCIU_WLAN_POWER_STATUS_CPU1_FW_READY_SHIFT (5U)\r\n/*! CPU1_FW_READY - cpu1 FW sets this bit after cpu1 FW initialization is done. */\r\n#define SOCCIU_WLAN_POWER_STATUS_CPU1_FW_READY(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_WLAN_POWER_STATUS_CPU1_FW_READY_SHIFT)) & SOCCIU_WLAN_POWER_STATUS_CPU1_FW_READY_MASK)\r\n/*! @} */\r\n\r\n/*! @name BLE_POWER_STATUS - BLE POWER Status */\r\n/*! @{ */\r\n\r\n#define SOCCIU_BLE_POWER_STATUS_BLERET_PSW_PD_MASK (0x1U)\r\n#define SOCCIU_BLE_POWER_STATUS_BLERET_PSW_PD_SHIFT (0U)\r\n/*! BLERET_PSW_PD - BLE-RETENTION domain power-switch control status: */\r\n#define SOCCIU_BLE_POWER_STATUS_BLERET_PSW_PD(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_BLE_POWER_STATUS_BLERET_PSW_PD_SHIFT)) & SOCCIU_BLE_POWER_STATUS_BLERET_PSW_PD_MASK)\r\n\r\n#define SOCCIU_BLE_POWER_STATUS_BLEGATED_PSW_PD_MASK (0x2U)\r\n#define SOCCIU_BLE_POWER_STATUS_BLEGATED_PSW_PD_SHIFT (1U)\r\n/*! BLEGATED_PSW_PD - BLE-GATED domain power-switch control status: */\r\n#define SOCCIU_BLE_POWER_STATUS_BLEGATED_PSW_PD(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_BLE_POWER_STATUS_BLEGATED_PSW_PD_SHIFT)) & SOCCIU_BLE_POWER_STATUS_BLEGATED_PSW_PD_MASK)\r\n\r\n#define SOCCIU_BLE_POWER_STATUS_CPU2_SLEEP_MASK  (0x4U)\r\n#define SOCCIU_BLE_POWER_STATUS_CPU2_SLEEP_SHIFT (2U)\r\n/*! CPU2_SLEEP - CPU2 cp15 sleep status */\r\n#define SOCCIU_BLE_POWER_STATUS_CPU2_SLEEP(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_BLE_POWER_STATUS_CPU2_SLEEP_SHIFT)) & SOCCIU_BLE_POWER_STATUS_CPU2_SLEEP_MASK)\r\n\r\n#define SOCCIU_BLE_POWER_STATUS_CPU2_BIST_DONE_MASK (0x8U)\r\n#define SOCCIU_BLE_POWER_STATUS_CPU2_BIST_DONE_SHIFT (3U)\r\n/*! CPU2_BIST_DONE - CPU2 memories g2bist done status */\r\n#define SOCCIU_BLE_POWER_STATUS_CPU2_BIST_DONE(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_BLE_POWER_STATUS_CPU2_BIST_DONE_SHIFT)) & SOCCIU_BLE_POWER_STATUS_CPU2_BIST_DONE_MASK)\r\n\r\n#define SOCCIU_BLE_POWER_STATUS_CPU2_RESET_N_MASK (0x10U)\r\n#define SOCCIU_BLE_POWER_STATUS_CPU2_RESET_N_SHIFT (4U)\r\n/*! CPU2_RESET_N - CPU2 Reset status. Active low. */\r\n#define SOCCIU_BLE_POWER_STATUS_CPU2_RESET_N(x)  (((uint32_t)(((uint32_t)(x)) << SOCCIU_BLE_POWER_STATUS_CPU2_RESET_N_SHIFT)) & SOCCIU_BLE_POWER_STATUS_CPU2_RESET_N_MASK)\r\n\r\n#define SOCCIU_BLE_POWER_STATUS_CPU2_FW_READY_MASK (0x20U)\r\n#define SOCCIU_BLE_POWER_STATUS_CPU2_FW_READY_SHIFT (5U)\r\n/*! CPU2_FW_READY - cpu2 FW sets this bit after cpu2 FW initialization is done. */\r\n#define SOCCIU_BLE_POWER_STATUS_CPU2_FW_READY(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_BLE_POWER_STATUS_CPU2_FW_READY_SHIFT)) & SOCCIU_BLE_POWER_STATUS_CPU2_FW_READY_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_VREG_VSENSOR_CTRL - Vsensor and Vreg Pad Control */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG1_ENB_MASK (0x1U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG1_ENB_SHIFT (0U)\r\n/*! VIO_REG1_ENB - VIO_X1 Pad Regulator */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG1_ENB(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG1_ENB_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG1_ENB_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG1_CTRL_EN_MASK (0x2U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG1_CTRL_EN_SHIFT (1U)\r\n/*! VIO_REG1_CTRL_EN - VIO_X1 Pad Regulator control */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG1_CTRL_EN(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG1_CTRL_EN_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG1_CTRL_EN_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG4_ENB_MASK (0x4U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG4_ENB_SHIFT (2U)\r\n/*! VIO_REG4_ENB - VIO_4 Pad Regulator */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG4_ENB(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG4_ENB_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG4_ENB_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG4_CTRL_EN_MASK (0x8U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG4_CTRL_EN_SHIFT (3U)\r\n/*! VIO_REG4_CTRL_EN - VIO_X4 Pad Regulator control */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG4_CTRL_EN(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG4_CTRL_EN_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG4_CTRL_EN_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG5_ENB_MASK (0x10U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG5_ENB_SHIFT (4U)\r\n/*! VIO_REG5_ENB - VIO_5 Pad Regulator */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG5_ENB(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG5_ENB_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG5_ENB_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG5_CTRL_EN_MASK (0x20U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG5_CTRL_EN_SHIFT (5U)\r\n/*! VIO_REG5_CTRL_EN - VIO_X5 Pad Regulator control */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG5_CTRL_EN(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG5_CTRL_EN_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG5_CTRL_EN_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG6_ENB_MASK (0x40U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG6_ENB_SHIFT (6U)\r\n/*! VIO_REG6_ENB - VIO_6 Pad Regulator */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG6_ENB(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG6_ENB_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG6_ENB_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG6_CTRL_EN_MASK (0x80U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG6_CTRL_EN_SHIFT (7U)\r\n/*! VIO_REG6_CTRL_EN - VIO_X6 Pad Regulator control */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG6_CTRL_EN(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG6_CTRL_EN_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_REG6_CTRL_EN_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_BYPASS_MASK (0x1000U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_BYPASS_SHIFT (12U)\r\n/*! VSENSOR_BYPASS - Active High Enable Signal for Bypass Mode */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_BYPASS_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_BYPASS_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_V18EN_12_IN_MASK (0x2000U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_V18EN_12_IN_SHIFT (13U)\r\n/*! VSENSOR_V18EN_12_IN - Bypass Value when Vsensor_Bypass Bit Set */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_V18EN_12_IN(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_V18EN_12_IN_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_V18EN_12_IN_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_DISABLE_12_MASK (0x4000U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_DISABLE_12_SHIFT (14U)\r\n/*! VSENSOR_DISABLE_12 - Vsensor X1 disable */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_DISABLE_12(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_DISABLE_12_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_DISABLE_12_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_CLK_12_MASK (0x8000U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_CLK_12_SHIFT (15U)\r\n/*! VSENSOR_CLK_12 - Vsensor Clock */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_CLK_12(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_CLK_12_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_CLK_12_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_TE_MASK (0x10000U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_TE_SHIFT (16U)\r\n/*! VSENSOR_TE - Vsensor Test Enable */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_TE(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_TE_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_TE_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_TEST_MASK (0xE0000U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_TEST_SHIFT (17U)\r\n/*! VSENSOR_TEST - Vsensor Test Point Mux Selection */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_TEST(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_TEST_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_TEST_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_VTHRESH_MASK (0x100000U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_VTHRESH_SHIFT (20U)\r\n/*! VSENSOR_VTHRESH - Vsensor Detection Threshold */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_VTHRESH(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_VTHRESH_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VSENSOR_VTHRESH_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_V25EN_CORE_MASK (0x200000U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_V25EN_CORE_SHIFT (21U)\r\n/*! V25EN_CORE - V25EN_CORE */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_V25EN_CORE(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_V25EN_CORE_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_V25EN_CORE_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X0_VSENSOR_DETECT_MASK (0x400000U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X0_VSENSOR_DETECT_SHIFT (22U)\r\n/*! VIO_X0_VSENSOR_DETECT - VIO_X0_Vsensor_Detect_V18 Status */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X0_VSENSOR_DETECT(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X0_VSENSOR_DETECT_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X0_VSENSOR_DETECT_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X1_VSENSOR_DETECT_MASK (0x800000U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X1_VSENSOR_DETECT_SHIFT (23U)\r\n/*! VIO_X1_VSENSOR_DETECT - VIO_X1_Vsensor_Detect_V18 Status */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X1_VSENSOR_DETECT(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X1_VSENSOR_DETECT_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X1_VSENSOR_DETECT_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X2_VSENSOR_DETECT_MASK (0x1000000U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X2_VSENSOR_DETECT_SHIFT (24U)\r\n/*! VIO_X2_VSENSOR_DETECT - VIO_X2_Vsensor_Detect_V18 Status */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X2_VSENSOR_DETECT(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X2_VSENSOR_DETECT_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X2_VSENSOR_DETECT_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X3_VSENSOR_DETECT_MASK (0x2000000U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X3_VSENSOR_DETECT_SHIFT (25U)\r\n/*! VIO_X3_VSENSOR_DETECT - VIO_X3_Vsensor_Detect_V18 Status */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X3_VSENSOR_DETECT(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X3_VSENSOR_DETECT_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X3_VSENSOR_DETECT_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X4_VSENSOR_DETECT_MASK (0x4000000U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X4_VSENSOR_DETECT_SHIFT (26U)\r\n/*! VIO_X4_VSENSOR_DETECT - VIO_X4_Vsensor_Detect_V18 Status */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X4_VSENSOR_DETECT(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X4_VSENSOR_DETECT_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X4_VSENSOR_DETECT_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X5_VSENSOR_DETECT_MASK (0x8000000U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X5_VSENSOR_DETECT_SHIFT (27U)\r\n/*! VIO_X5_VSENSOR_DETECT - VIO_X5_Vsensor_Detect_V18 Status */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X5_VSENSOR_DETECT(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X5_VSENSOR_DETECT_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X5_VSENSOR_DETECT_MASK)\r\n\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X6_VSENSOR_DETECT_MASK (0x10000000U)\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X6_VSENSOR_DETECT_SHIFT (28U)\r\n/*! VIO_X6_VSENSOR_DETECT - VIO_X6_Vsensor_Detect_V18 Status */\r\n#define SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X6_VSENSOR_DETECT(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X6_VSENSOR_DETECT_SHIFT)) & SOCCIU_PAD_VREG_VSENSOR_CTRL_VIO_X6_VSENSOR_DETECT_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_RF_VREG_VSENSOR_CTRL - RF Vsensor and Vreg Pad Control */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VIO_REG_ENB_MASK (0x1U)\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VIO_REG_ENB_SHIFT (0U)\r\n/*! VIO_REG_ENB - VIO_RF Pad Regulator */\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VIO_REG_ENB(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VIO_REG_ENB_SHIFT)) & SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VIO_REG_ENB_MASK)\r\n\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VIO_REG0_CTRL_EN_MASK (0x2U)\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VIO_REG0_CTRL_EN_SHIFT (1U)\r\n/*! VIO_REG0_CTRL_EN - VIO reg0 control enable Function */\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VIO_REG0_CTRL_EN(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VIO_REG0_CTRL_EN_SHIFT)) & SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VIO_REG0_CTRL_EN_MASK)\r\n\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_BYPASS_MASK (0x10U)\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_BYPASS_SHIFT (4U)\r\n/*! VSENSOR_BYPASS - Active High Enable Signal for Bypass Mode */\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_BYPASS_SHIFT)) & SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_BYPASS_MASK)\r\n\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_V18EN_12_IN_MASK (0x20U)\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_V18EN_12_IN_SHIFT (5U)\r\n/*! VSENSOR_V18EN_12_IN - Bypass Value when Vsensor_Bypass Bit Set */\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_V18EN_12_IN(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_V18EN_12_IN_SHIFT)) & SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_V18EN_12_IN_MASK)\r\n\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_DISABLE_12_MASK (0x40U)\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_DISABLE_12_SHIFT (6U)\r\n/*! VSENSOR_DISABLE_12 - Vsensor RF disable */\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_DISABLE_12(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_DISABLE_12_SHIFT)) & SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_DISABLE_12_MASK)\r\n\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_CLK_12_MASK (0x80U)\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_CLK_12_SHIFT (7U)\r\n/*! VSENSOR_CLK_12 - Vsensor RF Clock */\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_CLK_12(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_CLK_12_SHIFT)) & SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_CLK_12_MASK)\r\n\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_TE_MASK (0x100U)\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_TE_SHIFT (8U)\r\n/*! VSENSOR_TE - Vsensor RF Test Enable */\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_TE(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_TE_SHIFT)) & SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_TE_MASK)\r\n\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_TEST_MASK (0xE00U)\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_TEST_SHIFT (9U)\r\n/*! VSENSOR_TEST - Vsensor RF Test Point Mux Selection */\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_TEST(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_TEST_SHIFT)) & SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_TEST_MASK)\r\n\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_VTHRESH_MASK (0x1000U)\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_VTHRESH_SHIFT (12U)\r\n/*! VSENSOR_VTHRESH - Vsensor RF Detection Threshold */\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_VTHRESH(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_VTHRESH_SHIFT)) & SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_VTHRESH_MASK)\r\n\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_V25EN_CORE_MASK (0x2000U)\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_V25EN_CORE_SHIFT (13U)\r\n/*! V25EN_CORE - V25EN_CORE */\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_V25EN_CORE(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_V25EN_CORE_SHIFT)) & SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_V25EN_CORE_MASK)\r\n\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_DETECT_MASK (0x4000U)\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_DETECT_SHIFT (14U)\r\n/*! VSENSOR_DETECT - VIO_RF_Vsensor_Detect_V18 Status */\r\n#define SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_DETECT(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_DETECT_SHIFT)) & SOCCIU_PAD_RF_VREG_VSENSOR_CTRL_VSENSOR_DETECT_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_SD_VREG_VSENSOR_CTRL - SD Vsensor and Vreg Pad Control */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VIO_REG_ENB_MASK (0x1U)\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VIO_REG_ENB_SHIFT (0U)\r\n/*! VIO_REG_ENB - VIO_SD Pad Regulator */\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VIO_REG_ENB(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VIO_REG_ENB_SHIFT)) & SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VIO_REG_ENB_MASK)\r\n\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VIO_REG_CTRL_EN_MASK (0x2U)\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VIO_REG_CTRL_EN_SHIFT (1U)\r\n/*! VIO_REG_CTRL_EN - VIO reg control enable function */\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VIO_REG_CTRL_EN(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VIO_REG_CTRL_EN_SHIFT)) & SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VIO_REG_CTRL_EN_MASK)\r\n\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_BYPASS_MASK (0x10U)\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_BYPASS_SHIFT (4U)\r\n/*! VSENSOR_BYPASS - Active High Enable Signal for Bypass Mode */\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_BYPASS_SHIFT)) & SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_BYPASS_MASK)\r\n\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_V18EN_12_IN_MASK (0x20U)\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_V18EN_12_IN_SHIFT (5U)\r\n/*! VSENSOR_V18EN_12_IN - Bypass Value when Vsensor_Bypass Bit Set */\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_V18EN_12_IN(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_V18EN_12_IN_SHIFT)) & SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_V18EN_12_IN_MASK)\r\n\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_DISABLE_12_MASK (0x40U)\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_DISABLE_12_SHIFT (6U)\r\n/*! VSENSOR_DISABLE_12 - Vsensor SD disable */\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_DISABLE_12(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_DISABLE_12_SHIFT)) & SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_DISABLE_12_MASK)\r\n\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_CLK_12_MASK (0x80U)\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_CLK_12_SHIFT (7U)\r\n/*! VSENSOR_CLK_12 - Vsensor SD Clock */\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_CLK_12(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_CLK_12_SHIFT)) & SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_CLK_12_MASK)\r\n\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_TE_MASK (0x100U)\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_TE_SHIFT (8U)\r\n/*! VSENSOR_TE - Vsensor SD Test Enable */\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_TE(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_TE_SHIFT)) & SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_TE_MASK)\r\n\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_TEST_MASK (0xE00U)\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_TEST_SHIFT (9U)\r\n/*! VSENSOR_TEST - Vsensor SD Test Point Mux Selection */\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_TEST(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_TEST_SHIFT)) & SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_TEST_MASK)\r\n\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_VTHRESH_MASK (0x1000U)\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_VTHRESH_SHIFT (12U)\r\n/*! VSENSOR_VTHRESH - Vsensor SD Detection Threshold */\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_VTHRESH(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_VTHRESH_SHIFT)) & SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_VTHRESH_MASK)\r\n\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_V25EN_CORE_MASK (0x2000U)\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_V25EN_CORE_SHIFT (13U)\r\n/*! V25EN_CORE - V25EN_CORE */\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_V25EN_CORE(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_V25EN_CORE_SHIFT)) & SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_V25EN_CORE_MASK)\r\n\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_DETECT_MASK (0x4000U)\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_DETECT_SHIFT (14U)\r\n/*! VSENSOR_DETECT - VIO_SD_Vsensor_Detect_V18 Status */\r\n#define SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_DETECT(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_DETECT_SHIFT)) & SOCCIU_PAD_SD_VREG_VSENSOR_CTRL_VSENSOR_DETECT_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_ECO_CTRL - Pad ECO Control */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_ECO_CTRL_ECO_BITS_MASK        (0xFFFFFFFFU)\r\n#define SOCCIU_PAD_ECO_CTRL_ECO_BITS_SHIFT       (0U)\r\n/*! ECO_BITS - Reserved for ECOs */\r\n#define SOCCIU_PAD_ECO_CTRL_ECO_BITS(x)          (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_ECO_CTRL_ECO_BITS_SHIFT)) & SOCCIU_PAD_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name TST_TSTBUS_CTRL1 - Testbus Mux Control1 */\r\n/*! @{ */\r\n\r\n#define SOCCIU_TST_TSTBUS_CTRL1_SOC_PERI_TB_SEL_MASK (0x70U)\r\n#define SOCCIU_TST_TSTBUS_CTRL1_SOC_PERI_TB_SEL_SHIFT (4U)\r\n/*! SOC_PERI_TB_SEL - Select for soc peri testbus: */\r\n#define SOCCIU_TST_TSTBUS_CTRL1_SOC_PERI_TB_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_TST_TSTBUS_CTRL1_SOC_PERI_TB_SEL_SHIFT)) & SOCCIU_TST_TSTBUS_CTRL1_SOC_PERI_TB_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name TST_TSTBUS_CTRL2 - Testbus Mux Control2 */\r\n/*! @{ */\r\n\r\n#define SOCCIU_TST_TSTBUS_CTRL2_CLK_OUT_SEL_MASK (0xF000U)\r\n#define SOCCIU_TST_TSTBUS_CTRL2_CLK_OUT_SEL_SHIFT (12U)\r\n/*! CLK_OUT_SEL - PAGE 0 */\r\n#define SOCCIU_TST_TSTBUS_CTRL2_CLK_OUT_SEL(x)   (((uint32_t)(((uint32_t)(x)) << SOCCIU_TST_TSTBUS_CTRL2_CLK_OUT_SEL_SHIFT)) & SOCCIU_TST_TSTBUS_CTRL2_CLK_OUT_SEL_MASK)\r\n\r\n#define SOCCIU_TST_TSTBUS_CTRL2_CLK_OUT_PAGE_SEL_MASK (0x30000U)\r\n#define SOCCIU_TST_TSTBUS_CTRL2_CLK_OUT_PAGE_SEL_SHIFT (16U)\r\n/*! CLK_OUT_PAGE_SEL - Clock out test page sel */\r\n#define SOCCIU_TST_TSTBUS_CTRL2_CLK_OUT_PAGE_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_TST_TSTBUS_CTRL2_CLK_OUT_PAGE_SEL_SHIFT)) & SOCCIU_TST_TSTBUS_CTRL2_CLK_OUT_PAGE_SEL_MASK)\r\n\r\n#define SOCCIU_TST_TSTBUS_CTRL2_CLK_OUT_EN_MASK  (0x40000U)\r\n#define SOCCIU_TST_TSTBUS_CTRL2_CLK_OUT_EN_SHIFT (18U)\r\n/*! CLK_OUT_EN - Clock Out Enable */\r\n#define SOCCIU_TST_TSTBUS_CTRL2_CLK_OUT_EN(x)    (((uint32_t)(((uint32_t)(x)) << SOCCIU_TST_TSTBUS_CTRL2_CLK_OUT_EN_SHIFT)) & SOCCIU_TST_TSTBUS_CTRL2_CLK_OUT_EN_MASK)\r\n\r\n#define SOCCIU_TST_TSTBUS_CTRL2_CLK_OUT_EN_ALT_MASK (0x80000U)\r\n#define SOCCIU_TST_TSTBUS_CTRL2_CLK_OUT_EN_ALT_SHIFT (19U)\r\n/*! CLK_OUT_EN_ALT - Clock Out Enable */\r\n#define SOCCIU_TST_TSTBUS_CTRL2_CLK_OUT_EN_ALT(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_TST_TSTBUS_CTRL2_CLK_OUT_EN_ALT_SHIFT)) & SOCCIU_TST_TSTBUS_CTRL2_CLK_OUT_EN_ALT_MASK)\r\n\r\n#define SOCCIU_TST_TSTBUS_CTRL2_POR_MON_SEL_MASK (0x100000U)\r\n#define SOCCIU_TST_TSTBUS_CTRL2_POR_MON_SEL_SHIFT (20U)\r\n/*! POR_MON_SEL - POR MON Testbus Select (to support more power domain busses) */\r\n#define SOCCIU_TST_TSTBUS_CTRL2_POR_MON_SEL(x)   (((uint32_t)(((uint32_t)(x)) << SOCCIU_TST_TSTBUS_CTRL2_POR_MON_SEL_SHIFT)) & SOCCIU_TST_TSTBUS_CTRL2_POR_MON_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name TST_CTRL - Test Control */\r\n/*! @{ */\r\n\r\n#define SOCCIU_TST_CTRL_RBIST_DONE_MASK          (0xFU)\r\n#define SOCCIU_TST_CTRL_RBIST_DONE_SHIFT         (0U)\r\n/*! RBIST_DONE - [3]: HMAC g2bist finish */\r\n#define SOCCIU_TST_CTRL_RBIST_DONE(x)            (((uint32_t)(((uint32_t)(x)) << SOCCIU_TST_CTRL_RBIST_DONE_SHIFT)) & SOCCIU_TST_CTRL_RBIST_DONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name TST_ECO_CTRL - Test ECO Control */\r\n/*! @{ */\r\n\r\n#define SOCCIU_TST_ECO_CTRL_ECO_BITS_MASK        (0xFFFFFFFFU)\r\n#define SOCCIU_TST_ECO_CTRL_ECO_BITS_SHIFT       (0U)\r\n/*! ECO_BITS - Reserved for ECOs */\r\n#define SOCCIU_TST_ECO_CTRL_ECO_BITS(x)          (((uint32_t)(((uint32_t)(x)) << SOCCIU_TST_ECO_CTRL_ECO_BITS_SHIFT)) & SOCCIU_TST_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name DRO_CTRL - DRO Control */\r\n/*! @{ */\r\n\r\n#define SOCCIU_DRO_CTRL_DRO_EN_MASK              (0x1U)\r\n#define SOCCIU_DRO_CTRL_DRO_EN_SHIFT             (0U)\r\n/*! DRO_EN - DRO Counter Enable */\r\n#define SOCCIU_DRO_CTRL_DRO_EN(x)                (((uint32_t)(((uint32_t)(x)) << SOCCIU_DRO_CTRL_DRO_EN_SHIFT)) & SOCCIU_DRO_CTRL_DRO_EN_MASK)\r\n\r\n#define SOCCIU_DRO_CTRL_DRO_CLK_GATE_EN_MASK     (0x2U)\r\n#define SOCCIU_DRO_CTRL_DRO_CLK_GATE_EN_SHIFT    (1U)\r\n/*! DRO_CLK_GATE_EN - DRO Clock Gate Enable */\r\n#define SOCCIU_DRO_CTRL_DRO_CLK_GATE_EN(x)       (((uint32_t)(((uint32_t)(x)) << SOCCIU_DRO_CTRL_DRO_CLK_GATE_EN_SHIFT)) & SOCCIU_DRO_CTRL_DRO_CLK_GATE_EN_MASK)\r\n\r\n#define SOCCIU_DRO_CTRL_DRO_CNT_STATUS_MASK      (0x4U)\r\n#define SOCCIU_DRO_CTRL_DRO_CNT_STATUS_SHIFT     (2U)\r\n/*! DRO_CNT_STATUS - 0: dro counter is stopped; 1: dro counter is in process */\r\n#define SOCCIU_DRO_CTRL_DRO_CNT_STATUS(x)        (((uint32_t)(((uint32_t)(x)) << SOCCIU_DRO_CTRL_DRO_CNT_STATUS_SHIFT)) & SOCCIU_DRO_CTRL_DRO_CNT_STATUS_MASK)\r\n\r\n#define SOCCIU_DRO_CTRL_DRO_COUNT_LIMIT_MASK     (0xFFFFFFF0U)\r\n#define SOCCIU_DRO_CTRL_DRO_COUNT_LIMIT_SHIFT    (4U)\r\n/*! DRO_COUNT_LIMIT - DRO Count Value */\r\n#define SOCCIU_DRO_CTRL_DRO_COUNT_LIMIT(x)       (((uint32_t)(((uint32_t)(x)) << SOCCIU_DRO_CTRL_DRO_COUNT_LIMIT_SHIFT)) & SOCCIU_DRO_CTRL_DRO_COUNT_LIMIT_MASK)\r\n/*! @} */\r\n\r\n/*! @name DRO_1_2_CNT - DRO1 and DRO2 Counter Read back */\r\n/*! @{ */\r\n\r\n#define SOCCIU_DRO_1_2_CNT_DRO2_CNT_MASK         (0xFFFFU)\r\n#define SOCCIU_DRO_1_2_CNT_DRO2_CNT_SHIFT        (0U)\r\n/*! DRO2_CNT - DRO2 Count */\r\n#define SOCCIU_DRO_1_2_CNT_DRO2_CNT(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_DRO_1_2_CNT_DRO2_CNT_SHIFT)) & SOCCIU_DRO_1_2_CNT_DRO2_CNT_MASK)\r\n\r\n#define SOCCIU_DRO_1_2_CNT_DRO1_CNT_MASK         (0xFFFF0000U)\r\n#define SOCCIU_DRO_1_2_CNT_DRO1_CNT_SHIFT        (16U)\r\n/*! DRO1_CNT - DRO1 Count */\r\n#define SOCCIU_DRO_1_2_CNT_DRO1_CNT(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_DRO_1_2_CNT_DRO1_CNT_SHIFT)) & SOCCIU_DRO_1_2_CNT_DRO1_CNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name DRO_3_CNT - DRO3 Counter Read back */\r\n/*! @{ */\r\n\r\n#define SOCCIU_DRO_3_CNT_DRO3_CNT_MASK           (0xFFFFU)\r\n#define SOCCIU_DRO_3_CNT_DRO3_CNT_SHIFT          (0U)\r\n/*! DRO3_CNT - DRO3 Count */\r\n#define SOCCIU_DRO_3_CNT_DRO3_CNT(x)             (((uint32_t)(((uint32_t)(x)) << SOCCIU_DRO_3_CNT_DRO3_CNT_SHIFT)) & SOCCIU_DRO_3_CNT_DRO3_CNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name DRO_PAR_SEL - DRO Parallel Counter Selection */\r\n/*! @{ */\r\n\r\n#define SOCCIU_DRO_PAR_SEL_DRO1_PAR_SEL_MASK     (0x3U)\r\n#define SOCCIU_DRO_PAR_SEL_DRO1_PAR_SEL_SHIFT    (0U)\r\n/*! DRO1_PAR_SEL - DRO1 counter selection */\r\n#define SOCCIU_DRO_PAR_SEL_DRO1_PAR_SEL(x)       (((uint32_t)(((uint32_t)(x)) << SOCCIU_DRO_PAR_SEL_DRO1_PAR_SEL_SHIFT)) & SOCCIU_DRO_PAR_SEL_DRO1_PAR_SEL_MASK)\r\n\r\n#define SOCCIU_DRO_PAR_SEL_DRO2_PAR_SEL_MASK     (0xCU)\r\n#define SOCCIU_DRO_PAR_SEL_DRO2_PAR_SEL_SHIFT    (2U)\r\n/*! DRO2_PAR_SEL - DRO2 counter selection */\r\n#define SOCCIU_DRO_PAR_SEL_DRO2_PAR_SEL(x)       (((uint32_t)(((uint32_t)(x)) << SOCCIU_DRO_PAR_SEL_DRO2_PAR_SEL_SHIFT)) & SOCCIU_DRO_PAR_SEL_DRO2_PAR_SEL_MASK)\r\n\r\n#define SOCCIU_DRO_PAR_SEL_DRO3_PAR_SEL_MASK     (0x30U)\r\n#define SOCCIU_DRO_PAR_SEL_DRO3_PAR_SEL_SHIFT    (4U)\r\n/*! DRO3_PAR_SEL - DRO3 counter selection */\r\n#define SOCCIU_DRO_PAR_SEL_DRO3_PAR_SEL(x)       (((uint32_t)(((uint32_t)(x)) << SOCCIU_DRO_PAR_SEL_DRO3_PAR_SEL_SHIFT)) & SOCCIU_DRO_PAR_SEL_DRO3_PAR_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLK_SOCCLK_CTRL - SOC Clock Control */\r\n/*! @{ */\r\n\r\n#define SOCCIU_CLK_SOCCLK_CTRL_SOC_TOP_AHB2APB_PCLK_DIV_SEL_MASK (0xFU)\r\n#define SOCCIU_CLK_SOCCLK_CTRL_SOC_TOP_AHB2APB_PCLK_DIV_SEL_SHIFT (0U)\r\n/*! SOC_TOP_AHB2APB_PCLK_DIV_SEL - SOC_TOP AHB2APB PCLK Divider Select */\r\n#define SOCCIU_CLK_SOCCLK_CTRL_SOC_TOP_AHB2APB_PCLK_DIV_SEL(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_CLK_SOCCLK_CTRL_SOC_TOP_AHB2APB_PCLK_DIV_SEL_SHIFT)) & SOCCIU_CLK_SOCCLK_CTRL_SOC_TOP_AHB2APB_PCLK_DIV_SEL_MASK)\r\n\r\n#define SOCCIU_CLK_SOCCLK_CTRL_SOC_TOP_AHB2APB_WAIT_CYCLES_MASK (0xF0U)\r\n#define SOCCIU_CLK_SOCCLK_CTRL_SOC_TOP_AHB2APB_WAIT_CYCLES_SHIFT (4U)\r\n/*! SOC_TOP_AHB2APB_WAIT_CYCLES - SOC_TOP AHB2APB Wait Cycles between each APB transaction */\r\n#define SOCCIU_CLK_SOCCLK_CTRL_SOC_TOP_AHB2APB_WAIT_CYCLES(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_CLK_SOCCLK_CTRL_SOC_TOP_AHB2APB_WAIT_CYCLES_SHIFT)) & SOCCIU_CLK_SOCCLK_CTRL_SOC_TOP_AHB2APB_WAIT_CYCLES_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_SLP_PU_PD_DIS0 - Pad Sleep Pullup and Pulldown Disable1 */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO0_PU_PD_DIS_MASK (0x1U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO0_PU_PD_DIS_SHIFT (0U)\r\n/*! GPIO0_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[0] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO0_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO0_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO0_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO1_PU_PD_DIS_MASK (0x2U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO1_PU_PD_DIS_SHIFT (1U)\r\n/*! GPIO1_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[1] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO1_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO1_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO1_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO2_PU_PD_DIS_MASK (0x4U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO2_PU_PD_DIS_SHIFT (2U)\r\n/*! GPIO2_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[2] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO2_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO2_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO2_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO3_PU_PD_DIS_MASK (0x8U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO3_PU_PD_DIS_SHIFT (3U)\r\n/*! GPIO3_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[3] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO3_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO3_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO3_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO4_PU_PD_DIS_MASK (0x10U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO4_PU_PD_DIS_SHIFT (4U)\r\n/*! GPIO4_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[4] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO4_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO4_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO4_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO5_PU_PD_DIS_MASK (0x20U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO5_PU_PD_DIS_SHIFT (5U)\r\n/*! GPIO5_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[5] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO5_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO5_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO5_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO6_PU_PD_DIS_MASK (0x40U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO6_PU_PD_DIS_SHIFT (6U)\r\n/*! GPIO6_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[6] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO6_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO6_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO6_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO7_PU_PD_DIS_MASK (0x80U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO7_PU_PD_DIS_SHIFT (7U)\r\n/*! GPIO7_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[7] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO7_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO7_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO7_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO8_PU_PD_DIS_MASK (0x100U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO8_PU_PD_DIS_SHIFT (8U)\r\n/*! GPIO8_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[8] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO8_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO8_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO8_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO9_PU_PD_DIS_MASK (0x200U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO9_PU_PD_DIS_SHIFT (9U)\r\n/*! GPIO9_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[9] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO9_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO9_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO9_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO10_PU_PD_DIS_MASK (0x400U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO10_PU_PD_DIS_SHIFT (10U)\r\n/*! GPIO10_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[10] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO10_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO10_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO10_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO11_PU_PD_DIS_MASK (0x800U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO11_PU_PD_DIS_SHIFT (11U)\r\n/*! GPIO11_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[11] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO11_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO11_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO11_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO12_PU_PD_DIS_MASK (0x1000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO12_PU_PD_DIS_SHIFT (12U)\r\n/*! GPIO12_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[12] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO12_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO12_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO12_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO13_PU_PD_DIS_MASK (0x2000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO13_PU_PD_DIS_SHIFT (13U)\r\n/*! GPIO13_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[13] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO13_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO13_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO13_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO14_PU_PD_DIS_MASK (0x4000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO14_PU_PD_DIS_SHIFT (14U)\r\n/*! GPIO14_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[14] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO14_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO14_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO14_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO15_PU_PD_DIS_MASK (0x8000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO15_PU_PD_DIS_SHIFT (15U)\r\n/*! GPIO15_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[15] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO15_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO15_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO15_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO16_PU_PD_DIS_MASK (0x10000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO16_PU_PD_DIS_SHIFT (16U)\r\n/*! GPIO16_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[16] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO16_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO16_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO16_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO17_PU_PD_DIS_MASK (0x20000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO17_PU_PD_DIS_SHIFT (17U)\r\n/*! GPIO17_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[17] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO17_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO17_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO17_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO18_PU_PD_DIS_MASK (0x40000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO18_PU_PD_DIS_SHIFT (18U)\r\n/*! GPIO18_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[18] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO18_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO18_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO18_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO19_PU_PD_DIS_MASK (0x80000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO19_PU_PD_DIS_SHIFT (19U)\r\n/*! GPIO19_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[19] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO19_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO19_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO19_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO20_PU_PD_DIS_MASK (0x100000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO20_PU_PD_DIS_SHIFT (20U)\r\n/*! GPIO20_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[20] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO20_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO20_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO20_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO21_PU_PD_DIS_MASK (0x200000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO21_PU_PD_DIS_SHIFT (21U)\r\n/*! GPIO21_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[21] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO21_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO21_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO21_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO28_PU_PD_DIS_MASK (0x10000000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO28_PU_PD_DIS_SHIFT (28U)\r\n/*! GPIO28_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[28] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO28_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO28_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO28_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO29_PU_PD_DIS_MASK (0x20000000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO29_PU_PD_DIS_SHIFT (29U)\r\n/*! GPIO29_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[29] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO29_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO29_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO29_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO30_PU_PD_DIS_MASK (0x40000000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO30_PU_PD_DIS_SHIFT (30U)\r\n/*! GPIO30_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[30] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO30_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO30_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO30_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO31_PU_PD_DIS_MASK (0x80000000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO31_PU_PD_DIS_SHIFT (31U)\r\n/*! GPIO31_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[31] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO31_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO31_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS0_GPIO31_PU_PD_DIS_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_SLP_PU_PD_DIS1 - Pad Sleep Pullup and Pulldown Disable2 */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO32_PU_PD_DIS_MASK (0x1U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO32_PU_PD_DIS_SHIFT (0U)\r\n/*! GPIO32_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[32] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO32_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO32_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO32_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO33_PU_PD_DIS_MASK (0x2U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO33_PU_PD_DIS_SHIFT (1U)\r\n/*! GPIO33_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[33] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO33_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO33_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO33_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO34_PU_PD_DIS_MASK (0x4U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO34_PU_PD_DIS_SHIFT (2U)\r\n/*! GPIO34_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[34] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO34_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO34_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO34_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO35_PU_PD_DIS_MASK (0x8U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO35_PU_PD_DIS_SHIFT (3U)\r\n/*! GPIO35_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[35] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO35_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO35_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO35_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO36_PU_PD_DIS_MASK (0x10U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO36_PU_PD_DIS_SHIFT (4U)\r\n/*! GPIO36_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[36] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO36_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO36_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO36_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO37_PU_PD_DIS_MASK (0x20U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO37_PU_PD_DIS_SHIFT (5U)\r\n/*! GPIO37_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[37] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO37_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO37_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO37_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO38_PU_PD_DIS_MASK (0x40U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO38_PU_PD_DIS_SHIFT (6U)\r\n/*! GPIO38_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[38] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO38_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO38_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO38_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO39_PU_PD_DIS_MASK (0x80U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO39_PU_PD_DIS_SHIFT (7U)\r\n/*! GPIO39_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[39] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO39_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO39_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO39_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO40_PU_PD_DIS_MASK (0x100U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO40_PU_PD_DIS_SHIFT (8U)\r\n/*! GPIO40_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[40] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO40_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO40_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO40_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO41_PU_PD_DIS_MASK (0x200U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO41_PU_PD_DIS_SHIFT (9U)\r\n/*! GPIO41_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[41] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO41_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO41_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO41_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO42_PU_PD_DIS_MASK (0x400U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO42_PU_PD_DIS_SHIFT (10U)\r\n/*! GPIO42_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[42] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO42_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO42_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO42_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO43_PU_PD_DIS_MASK (0x800U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO43_PU_PD_DIS_SHIFT (11U)\r\n/*! GPIO43_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[43] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO43_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO43_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO43_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO44_PU_PD_DIS_MASK (0x1000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO44_PU_PD_DIS_SHIFT (12U)\r\n/*! GPIO44_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[44] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO44_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO44_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO44_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO45_PU_PD_DIS_MASK (0x2000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO45_PU_PD_DIS_SHIFT (13U)\r\n/*! GPIO45_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[45] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO45_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO45_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO45_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO46_PU_PD_DIS_MASK (0x4000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO46_PU_PD_DIS_SHIFT (14U)\r\n/*! GPIO46_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[46] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO46_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO46_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO46_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO47_PU_PD_DIS_MASK (0x8000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO47_PU_PD_DIS_SHIFT (15U)\r\n/*! GPIO47_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[47] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO47_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO47_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO47_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO48_PU_PD_DIS_MASK (0x10000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO48_PU_PD_DIS_SHIFT (16U)\r\n/*! GPIO48_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[48] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO48_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO48_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO48_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO49_PU_PD_DIS_MASK (0x20000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO49_PU_PD_DIS_SHIFT (17U)\r\n/*! GPIO49_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[49] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO49_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO49_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO49_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO50_PU_PD_DIS_MASK (0x40000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO50_PU_PD_DIS_SHIFT (18U)\r\n/*! GPIO50_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[50] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO50_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO50_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO50_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO51_PU_PD_DIS_MASK (0x80000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO51_PU_PD_DIS_SHIFT (19U)\r\n/*! GPIO51_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[51] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO51_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO51_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO51_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO52_PU_PD_DIS_MASK (0x100000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO52_PU_PD_DIS_SHIFT (20U)\r\n/*! GPIO52_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[52] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO52_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO52_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO52_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO53_PU_PD_DIS_MASK (0x200000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO53_PU_PD_DIS_SHIFT (21U)\r\n/*! GPIO53_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[53] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO53_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO53_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO53_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO54_PU_PD_DIS_MASK (0x400000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO54_PU_PD_DIS_SHIFT (22U)\r\n/*! GPIO54_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[54] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO54_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO54_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO54_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO55_PU_PD_DIS_MASK (0x800000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO55_PU_PD_DIS_SHIFT (23U)\r\n/*! GPIO55_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[55] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO55_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO55_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO55_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO56_PU_PD_DIS_MASK (0x1000000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO56_PU_PD_DIS_SHIFT (24U)\r\n/*! GPIO56_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[56] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO56_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO56_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO56_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO57_PU_PD_DIS_MASK (0x2000000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO57_PU_PD_DIS_SHIFT (25U)\r\n/*! GPIO57_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[57] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO57_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO57_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO57_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO58_PU_PD_DIS_MASK (0x4000000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO58_PU_PD_DIS_SHIFT (26U)\r\n/*! GPIO58_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[58] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO58_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO58_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO58_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO59_PU_PD_DIS_MASK (0x8000000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO59_PU_PD_DIS_SHIFT (27U)\r\n/*! GPIO59_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[59] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO59_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO59_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO59_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO60_PU_PD_DIS_MASK (0x10000000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO60_PU_PD_DIS_SHIFT (28U)\r\n/*! GPIO60_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[60] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO60_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO60_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO60_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO61_PU_PD_DIS_MASK (0x20000000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO61_PU_PD_DIS_SHIFT (29U)\r\n/*! GPIO61_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[61] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO61_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO61_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO61_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO62_PU_PD_DIS_MASK (0x40000000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO62_PU_PD_DIS_SHIFT (30U)\r\n/*! GPIO62_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[62] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO62_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO62_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO62_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO63_PU_PD_DIS_MASK (0x80000000U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO63_PU_PD_DIS_SHIFT (31U)\r\n/*! GPIO63_PU_PD_DIS - Internal Pd and Internal Pu Disable for GPIO[63] During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO63_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO63_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS1_GPIO63_PU_PD_DIS_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_SLP_PU_PD_DIS2 - Pad Sleep Pullup and Pulldown Disable4 */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS2_ATEST0_PU_PD_DIS_MASK (0x1U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS2_ATEST0_PU_PD_DIS_SHIFT (0U)\r\n/*! ATEST0_PU_PD_DIS - Internal Pd and Internal Pu Disable for ATEST0 During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS2_ATEST0_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS2_ATEST0_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS2_ATEST0_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS2_ATEST1_PU_PD_DIS_MASK (0x2U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS2_ATEST1_PU_PD_DIS_SHIFT (1U)\r\n/*! ATEST1_PU_PD_DIS - Internal Pd and Internal Pu Disable for ATEST1 During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS2_ATEST1_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS2_ATEST1_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS2_ATEST1_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS2_ATEST2_PU_PD_DIS_MASK (0x4U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS2_ATEST2_PU_PD_DIS_SHIFT (2U)\r\n/*! ATEST2_PU_PD_DIS - Internal Pd and Internal Pu Disable for ATEST2 During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS2_ATEST2_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS2_ATEST2_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS2_ATEST2_PU_PD_DIS_MASK)\r\n\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS2_ATEST3_PU_PD_DIS_MASK (0x8U)\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS2_ATEST3_PU_PD_DIS_SHIFT (3U)\r\n/*! ATEST3_PU_PD_DIS - Internal Pd and Internal Pu Disable for ATEST3 During Sleep Mode */\r\n#define SOCCIU_PAD_SLP_PU_PD_DIS2_ATEST3_PU_PD_DIS(x) (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_SLP_PU_PD_DIS2_ATEST3_PU_PD_DIS_SHIFT)) & SOCCIU_PAD_SLP_PU_PD_DIS2_ATEST3_PU_PD_DIS_MASK)\r\n/*! @} */\r\n\r\n/*! @name PAD_GPIO - GPIO Enable */\r\n/*! @{ */\r\n\r\n#define SOCCIU_PAD_GPIO_ENABLE_MASK              (0xFFFFU)\r\n#define SOCCIU_PAD_GPIO_ENABLE_SHIFT             (0U)\r\n/*! ENABLE - GPIO Automatic Forcing for GPIO[15:0] */\r\n#define SOCCIU_PAD_GPIO_ENABLE(x)                (((uint32_t)(((uint32_t)(x)) << SOCCIU_PAD_GPIO_ENABLE_SHIFT)) & SOCCIU_PAD_GPIO_ENABLE_MASK)\r\n/*! @} */\r\n\r\n/*! @name MCI_IOMUX_EN0 - mci_iomux_enable control for GPIO[31:28] and GPIO[21:0] */\r\n/*! @{ */\r\n\r\n#define SOCCIU_MCI_IOMUX_EN0_EN_21_0_MASK        (0x3FFFFFU)\r\n#define SOCCIU_MCI_IOMUX_EN0_EN_21_0_SHIFT       (0U)\r\n/*! EN_21_0 - Bitwise enable control for mci_io_mux GPIO[21:0] */\r\n#define SOCCIU_MCI_IOMUX_EN0_EN_21_0(x)          (((uint32_t)(((uint32_t)(x)) << SOCCIU_MCI_IOMUX_EN0_EN_21_0_SHIFT)) & SOCCIU_MCI_IOMUX_EN0_EN_21_0_MASK)\r\n\r\n#define SOCCIU_MCI_IOMUX_EN0_EN_31_28_MASK       (0xF0000000U)\r\n#define SOCCIU_MCI_IOMUX_EN0_EN_31_28_SHIFT      (28U)\r\n/*! EN_31_28 - Bitwise enable control for mci_io_mux GPIO[31:28] */\r\n#define SOCCIU_MCI_IOMUX_EN0_EN_31_28(x)         (((uint32_t)(((uint32_t)(x)) << SOCCIU_MCI_IOMUX_EN0_EN_31_28_SHIFT)) & SOCCIU_MCI_IOMUX_EN0_EN_31_28_MASK)\r\n/*! @} */\r\n\r\n/*! @name MCI_IOMUX_EN1 - mci_iomux_enable control for GPIO[63:32] */\r\n/*! @{ */\r\n\r\n#define SOCCIU_MCI_IOMUX_EN1_EN_MASK             (0xFFFFFFFFU)\r\n#define SOCCIU_MCI_IOMUX_EN1_EN_SHIFT            (0U)\r\n/*! EN - Bitwise enable control for mci_io_mux GPIO[63:32] */\r\n#define SOCCIU_MCI_IOMUX_EN1_EN(x)               (((uint32_t)(((uint32_t)(x)) << SOCCIU_MCI_IOMUX_EN1_EN_SHIFT)) & SOCCIU_MCI_IOMUX_EN1_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CAU_CTRL - CAU Control */\r\n/*! @{ */\r\n\r\n#define SOCCIU_CAU_CTRL_CAU_REFCLK_SEL_MASK      (0x800U)\r\n#define SOCCIU_CAU_CTRL_CAU_REFCLK_SEL_SHIFT     (11U)\r\n/*! CAU_REFCLK_SEL - CAU Reference Clock Select */\r\n#define SOCCIU_CAU_CTRL_CAU_REFCLK_SEL(x)        (((uint32_t)(((uint32_t)(x)) << SOCCIU_CAU_CTRL_CAU_REFCLK_SEL_SHIFT)) & SOCCIU_CAU_CTRL_CAU_REFCLK_SEL_MASK)\r\n\r\n#define SOCCIU_CAU_CTRL_CAU_BG_RDY_MASK          (0x80000U)\r\n#define SOCCIU_CAU_CTRL_CAU_BG_RDY_SHIFT         (19U)\r\n/*! CAU_BG_RDY - CAU bandgap Status */\r\n#define SOCCIU_CAU_CTRL_CAU_BG_RDY(x)            (((uint32_t)(((uint32_t)(x)) << SOCCIU_CAU_CTRL_CAU_BG_RDY_SHIFT)) & SOCCIU_CAU_CTRL_CAU_BG_RDY_MASK)\r\n\r\n#define SOCCIU_CAU_CTRL_BUCK_VOUT_RDY_MASK       (0x100000U)\r\n#define SOCCIU_CAU_CTRL_BUCK_VOUT_RDY_SHIFT      (20U)\r\n/*! BUCK_VOUT_RDY - Buck power Status */\r\n#define SOCCIU_CAU_CTRL_BUCK_VOUT_RDY(x)         (((uint32_t)(((uint32_t)(x)) << SOCCIU_CAU_CTRL_BUCK_VOUT_RDY_SHIFT)) & SOCCIU_CAU_CTRL_BUCK_VOUT_RDY_MASK)\r\n\r\n#define SOCCIU_CAU_CTRL_REF_CLK_RDY_MASK         (0x200000U)\r\n#define SOCCIU_CAU_CTRL_REF_CLK_RDY_SHIFT        (21U)\r\n/*! REF_CLK_RDY - CAU Ref clock Ready Status */\r\n#define SOCCIU_CAU_CTRL_REF_CLK_RDY(x)           (((uint32_t)(((uint32_t)(x)) << SOCCIU_CAU_CTRL_REF_CLK_RDY_SHIFT)) & SOCCIU_CAU_CTRL_REF_CLK_RDY_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSPLL_CTRL - SYSPLL Control */\r\n/*! @{ */\r\n\r\n#define SOCCIU_SYSPLL_CTRL_T3_PLL_LOCK_MASK      (0x400U)\r\n#define SOCCIU_SYSPLL_CTRL_T3_PLL_LOCK_SHIFT     (10U)\r\n/*! T3_PLL_LOCK - PLL T3 Lock Status */\r\n#define SOCCIU_SYSPLL_CTRL_T3_PLL_LOCK(x)        (((uint32_t)(((uint32_t)(x)) << SOCCIU_SYSPLL_CTRL_T3_PLL_LOCK_SHIFT)) & SOCCIU_SYSPLL_CTRL_T3_PLL_LOCK_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SOCCIU_Register_Masks */\r\n\r\n\r\n/* SOCCIU - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral SOCCTRL base address */\r\n  #define SOCCTRL_BASE                             (0x55001000u)\r\n  /** Peripheral SOCCTRL base address */\r\n  #define SOCCTRL_BASE_NS                          (0x45001000u)\r\n  /** Peripheral SOCCTRL base pointer */\r\n  #define SOCCTRL                                  ((SOCCIU_Type *)SOCCTRL_BASE)\r\n  /** Peripheral SOCCTRL base pointer */\r\n  #define SOCCTRL_NS                               ((SOCCIU_Type *)SOCCTRL_BASE_NS)\r\n  /** Array initializer of SOCCIU peripheral base addresses */\r\n  #define SOCCIU_BASE_ADDRS                        { SOCCTRL_BASE }\r\n  /** Array initializer of SOCCIU peripheral base pointers */\r\n  #define SOCCIU_BASE_PTRS                         { SOCCTRL }\r\n  /** Array initializer of SOCCIU peripheral base addresses */\r\n  #define SOCCIU_BASE_ADDRS_NS                     { SOCCTRL_BASE_NS }\r\n  /** Array initializer of SOCCIU peripheral base pointers */\r\n  #define SOCCIU_BASE_PTRS_NS                      { SOCCTRL_NS }\r\n#else\r\n  /** Peripheral SOCCTRL base address */\r\n  #define SOCCTRL_BASE                             (0x45001000u)\r\n  /** Peripheral SOCCTRL base pointer */\r\n  #define SOCCTRL                                  ((SOCCIU_Type *)SOCCTRL_BASE)\r\n  /** Array initializer of SOCCIU peripheral base addresses */\r\n  #define SOCCIU_BASE_ADDRS                        { SOCCTRL_BASE }\r\n  /** Array initializer of SOCCIU peripheral base pointers */\r\n  #define SOCCIU_BASE_PTRS                         { SOCCTRL }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SOCCIU_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SOC_OTP_CTRL Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SOC_OTP_CTRL_Peripheral_Access_Layer SOC_OTP_CTRL Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** SOC_OTP_CTRL - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[512];\r\n  __IO uint16_t OTP_SPARE0;                        /**< OTP_SPARE0_REG, offset: 0x200 */\r\n       uint8_t RESERVED_1[2];\r\n  __IO uint16_t OTP_SPARE1;                        /**< OTP_SPARE1_REG, offset: 0x204 */\r\n       uint8_t RESERVED_2[2];\r\n  __O  uint16_t OTP_WDATA0;                        /**< OTP_WDATA0_REG, offset: 0x208 */\r\n       uint8_t RESERVED_3[2];\r\n  __IO uint16_t OTP_WDATA1;                        /**< OTP_WDATA1_REG, offset: 0x20C */\r\n       uint8_t RESERVED_4[2];\r\n  __IO uint16_t OTP_WDATA2;                        /**< OTP_WDATA2_REG, offset: 0x210 */\r\n       uint8_t RESERVED_5[2];\r\n  __IO uint16_t OTP_WDATA3;                        /**< OTP_WDATA3_REG, offset: 0x214 */\r\n       uint8_t RESERVED_6[2];\r\n  __I  uint16_t OTP_WDATA4;                        /**< OTP_WDATA4_REG, offset: 0x218 */\r\n       uint8_t RESERVED_7[2];\r\n  __IO uint16_t OTP_ADDR;                          /**< OTP_ADDR_REG, offset: 0x21C */\r\n       uint8_t RESERVED_8[2];\r\n  __IO uint16_t OTP_CTRL0;                         /**< OTP_CTRL0_REG, offset: 0x220 */\r\n       uint8_t RESERVED_9[2];\r\n  __IO uint16_t OTP_CTRL1;                         /**< OTP_CTRL1_REG, offset: 0x224 */\r\n       uint8_t RESERVED_10[2];\r\n  __IO uint16_t OTP_CMD_START;                     /**< OTP_CMD_START_REG, offset: 0x228 */\r\n       uint8_t RESERVED_11[2];\r\n  __IO uint16_t OTP_PARAM0;                        /**< OTP_PARAM0_REG, offset: 0x22C */\r\n       uint8_t RESERVED_12[2];\r\n  __IO uint16_t OTP_PARAM1;                        /**< OTP_PARAM1_REG, offset: 0x230 */\r\n       uint8_t RESERVED_13[2];\r\n  __IO uint16_t OTP_PARAM2;                        /**< OTP_PARAM2_REG, offset: 0x234 */\r\n       uint8_t RESERVED_14[2];\r\n  __IO uint16_t OTP_BYPASS_MODE0;                  /**< OTP_BYPASS_MODE0_REG, offset: 0x238 */\r\n       uint8_t RESERVED_15[2];\r\n  __IO uint16_t OTP_BYPASS_MODE1;                  /**< OTP_BYPASS_MODE1_REG, offset: 0x23C */\r\n       uint8_t RESERVED_16[2];\r\n  __IO uint16_t OTP_TESTBUS_SEL;                   /**< OTP_TESTBUS_SEL_REG, offset: 0x240 */\r\n       uint8_t RESERVED_17[2];\r\n  __I  uint16_t OTP_TESTBUS;                       /**< OTP_TESTBUS_REG, offset: 0x244 */\r\n       uint8_t RESERVED_18[2];\r\n  __IO uint16_t OTP_BYPASS_MODE2;                  /**< OTP_BYPASS_MODE2_REG, offset: 0x248 */\r\n       uint8_t RESERVED_19[2];\r\n  __IO uint16_t OTP_RST_B;                         /**< OTP_RST_B_REG, offset: 0x24C */\r\n       uint8_t RESERVED_20[2];\r\n  __IO uint16_t OTP_POR_B;                         /**< OTP_POR_B_REG, offset: 0x250 */\r\n       uint8_t RESERVED_21[10];\r\n  __IO uint16_t OTP_WRITE_LOCK_REG;                /**< OTP_WRITE_LOCK_REG (Firecrest), offset: 0x25C */\r\n       uint8_t RESERVED_22[2];\r\n  __IO uint16_t OTP_WRITE_DIS_REG_15_0;            /**< OTP_WRITE_DIS_REG[15:0] (Firecrest), offset: 0x260 */\r\n       uint8_t RESERVED_23[2];\r\n  __IO uint16_t OTP_WRITE_DIS_REG_31_16;           /**< OTP_WRITE_DIS_REG[31:16] (Firecrest), offset: 0x264 */\r\n       uint8_t RESERVED_24[2];\r\n  __IO uint16_t OTP_WRITE_DIS_REG_47_32;           /**< OTP_WRITE_DIS_REG[47:32] (Firecrest), offset: 0x268 */\r\n       uint8_t RESERVED_25[2];\r\n  __IO uint16_t OTP_WRITE_DIS_REG_63_48;           /**< OTP_WRITE_DIS_REG[63:48] (Firecrest), offset: 0x26C */\r\n       uint8_t RESERVED_26[2];\r\n  __IO uint16_t OTP_WRITE_DIS_REG_79_64;           /**< OTP_WRITE_DIS_REG[79:64] (Firecrest), offset: 0x270 */\r\n       uint8_t RESERVED_27[2];\r\n  __IO uint16_t OTP_WRITE_DIS_REG_95_80;           /**< OTP_WRITE_DIS_REG[95:80] (Firecrest), offset: 0x274 */\r\n       uint8_t RESERVED_28[2];\r\n  __IO uint16_t OTP_WRITE_DIS_REG_111_96;          /**< OTP_WRITE_DIS_REG[111:96] (Firecrest), offset: 0x278 */\r\n       uint8_t RESERVED_29[2];\r\n  __IO uint16_t OTP_WRITE_DIS_REG_127_112;         /**< OTP_WRITE_DIS_REG[127:112] (Firecrest), offset: 0x27C */\r\n} SOC_OTP_CTRL_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SOC_OTP_CTRL Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SOC_OTP_CTRL_Register_Masks SOC_OTP_CTRL Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name OTP_SPARE0 - OTP_SPARE0_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_SPARE0_OTP_SPARE0_MASK  (0xFFFFU)\r\n#define SOC_OTP_CTRL_OTP_SPARE0_OTP_SPARE0_SHIFT (0U)\r\n/*! OTP_SPARE0 - SPARE register for future ECO's, h/w default is 0x0000 */\r\n#define SOC_OTP_CTRL_OTP_SPARE0_OTP_SPARE0(x)    (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_SPARE0_OTP_SPARE0_SHIFT)) & SOC_OTP_CTRL_OTP_SPARE0_OTP_SPARE0_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_SPARE1 - OTP_SPARE1_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_SPARE1_OTP_SPARE1_MASK  (0xFFFFU)\r\n#define SOC_OTP_CTRL_OTP_SPARE1_OTP_SPARE1_SHIFT (0U)\r\n/*! OTP_SPARE1 - SPARE register for future ECO's, h/w default is 0xFFFF */\r\n#define SOC_OTP_CTRL_OTP_SPARE1_OTP_SPARE1(x)    (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_SPARE1_OTP_SPARE1_SHIFT)) & SOC_OTP_CTRL_OTP_SPARE1_OTP_SPARE1_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_WDATA0 - OTP_WDATA0_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_WDATA0_OTP_WDATA0_MASK  (0xFFFFU)\r\n#define SOC_OTP_CTRL_OTP_WDATA0_OTP_WDATA0_SHIFT (0U)\r\n/*! OTP_WDATA0 - Data[15:0] */\r\n#define SOC_OTP_CTRL_OTP_WDATA0_OTP_WDATA0(x)    (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_WDATA0_OTP_WDATA0_SHIFT)) & SOC_OTP_CTRL_OTP_WDATA0_OTP_WDATA0_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_WDATA1 - OTP_WDATA1_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_WDATA1_OTP_WDATA1_MASK  (0xFFFFU)\r\n#define SOC_OTP_CTRL_OTP_WDATA1_OTP_WDATA1_SHIFT (0U)\r\n/*! OTP_WDATA1 - Data[31:16] */\r\n#define SOC_OTP_CTRL_OTP_WDATA1_OTP_WDATA1(x)    (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_WDATA1_OTP_WDATA1_SHIFT)) & SOC_OTP_CTRL_OTP_WDATA1_OTP_WDATA1_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_WDATA2 - OTP_WDATA2_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_WDATA2_OTP_WDATA2_MASK  (0xFFFFU)\r\n#define SOC_OTP_CTRL_OTP_WDATA2_OTP_WDATA2_SHIFT (0U)\r\n/*! OTP_WDATA2 - Data[47:32] */\r\n#define SOC_OTP_CTRL_OTP_WDATA2_OTP_WDATA2(x)    (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_WDATA2_OTP_WDATA2_SHIFT)) & SOC_OTP_CTRL_OTP_WDATA2_OTP_WDATA2_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_WDATA3 - OTP_WDATA3_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_WDATA3_OTP_WDATA3_MASK  (0xFFFFU)\r\n#define SOC_OTP_CTRL_OTP_WDATA3_OTP_WDATA3_SHIFT (0U)\r\n/*! OTP_WDATA3 - Data[63:48] */\r\n#define SOC_OTP_CTRL_OTP_WDATA3_OTP_WDATA3(x)    (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_WDATA3_OTP_WDATA3_SHIFT)) & SOC_OTP_CTRL_OTP_WDATA3_OTP_WDATA3_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_WDATA4 - OTP_WDATA4_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_WDATA4_ATE_TEST_BIT_MASK (0x1U)\r\n#define SOC_OTP_CTRL_OTP_WDATA4_ATE_TEST_BIT_SHIFT (0U)\r\n/*! ATE_TEST_BIT - ATE test bit (READ ONLY) */\r\n#define SOC_OTP_CTRL_OTP_WDATA4_ATE_TEST_BIT(x)  (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_WDATA4_ATE_TEST_BIT_SHIFT)) & SOC_OTP_CTRL_OTP_WDATA4_ATE_TEST_BIT_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_WDATA4_DATA_LINE_VALID_BIT_MASK (0x2U)\r\n#define SOC_OTP_CTRL_OTP_WDATA4_DATA_LINE_VALID_BIT_SHIFT (1U)\r\n/*! DATA_LINE_VALID_BIT - Data line valid bit (READ ONLY) */\r\n#define SOC_OTP_CTRL_OTP_WDATA4_DATA_LINE_VALID_BIT(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_WDATA4_DATA_LINE_VALID_BIT_SHIFT)) & SOC_OTP_CTRL_OTP_WDATA4_DATA_LINE_VALID_BIT_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_WDATA4_SECURITY_BIT_MASK (0x4U)\r\n#define SOC_OTP_CTRL_OTP_WDATA4_SECURITY_BIT_SHIFT (2U)\r\n/*! SECURITY_BIT - Security Fuse bit (READ ONLY) */\r\n#define SOC_OTP_CTRL_OTP_WDATA4_SECURITY_BIT(x)  (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_WDATA4_SECURITY_BIT_SHIFT)) & SOC_OTP_CTRL_OTP_WDATA4_SECURITY_BIT_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_WDATA4_OTP_ALL_BITS_EQ_ZERO_MASK (0x8U)\r\n#define SOC_OTP_CTRL_OTP_WDATA4_OTP_ALL_BITS_EQ_ZERO_SHIFT (3U)\r\n/*! OTP_ALL_BITS_EQ_ZERO - All bits equal to zero (READ ONLY) */\r\n#define SOC_OTP_CTRL_OTP_WDATA4_OTP_ALL_BITS_EQ_ZERO(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_WDATA4_OTP_ALL_BITS_EQ_ZERO_SHIFT)) & SOC_OTP_CTRL_OTP_WDATA4_OTP_ALL_BITS_EQ_ZERO_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_ADDR - OTP_ADDR_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_ADDR_OTP_ADDR_MASK      (0x3FFU)\r\n#define SOC_OTP_CTRL_OTP_ADDR_OTP_ADDR_SHIFT     (0U)\r\n/*! OTP_ADDR - The otp_addr is composed of Bank select[16:13] and row address[12:7], the address\r\n *    will select a row or a data line of a bank that contains 64 bits of s/w usable data plus the ATE\r\n *    test bit and data line valid bit and the security bit.\r\n */\r\n#define SOC_OTP_CTRL_OTP_ADDR_OTP_ADDR(x)        (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_ADDR_OTP_ADDR_SHIFT)) & SOC_OTP_CTRL_OTP_ADDR_OTP_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_CTRL0 - OTP_CTRL0_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_CTRL0_REGULATOR_EN25_33B_MASK (0x2U)\r\n#define SOC_OTP_CTRL_OTP_CTRL0_REGULATOR_EN25_33B_SHIFT (1U)\r\n/*! REGULATOR_EN25_33B - Stepdown regulator input voltage select */\r\n#define SOC_OTP_CTRL_OTP_CTRL0_REGULATOR_EN25_33B(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_CTRL0_REGULATOR_EN25_33B_SHIFT)) & SOC_OTP_CTRL_OTP_CTRL0_REGULATOR_EN25_33B_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_CTRL0_REGULATOR_SV_MASK (0xCU)\r\n#define SOC_OTP_CTRL_OTP_CTRL0_REGULATOR_SV_SHIFT (2U)\r\n/*! REGULATOR_SV - Stepdown regulator Rate Control, default = 2'b10 (2'b10==2.6V for 40nm) */\r\n#define SOC_OTP_CTRL_OTP_CTRL0_REGULATOR_SV(x)   (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_CTRL0_REGULATOR_SV_SHIFT)) & SOC_OTP_CTRL_OTP_CTRL0_REGULATOR_SV_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_CTRL0_REG_SETULATOR_EN_BYPASS_MASK (0x10U)\r\n#define SOC_OTP_CTRL_OTP_CTRL0_REG_SETULATOR_EN_BYPASS_SHIFT (4U)\r\n/*! REG_SETULATOR_EN_BYPASS - Enable/ disable value: */\r\n#define SOC_OTP_CTRL_OTP_CTRL0_REG_SETULATOR_EN_BYPASS(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_CTRL0_REG_SETULATOR_EN_BYPASS_SHIFT)) & SOC_OTP_CTRL_OTP_CTRL0_REG_SETULATOR_EN_BYPASS_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_CTRL0_REGULATOR_EN_MASK (0x20U)\r\n#define SOC_OTP_CTRL_OTP_CTRL0_REGULATOR_EN_SHIFT (5U)\r\n/*! REGULATOR_EN - Stepdown regulator output enable, only valid if regulator_EN_bypass==1. */\r\n#define SOC_OTP_CTRL_OTP_CTRL0_REGULATOR_EN(x)   (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_CTRL0_REGULATOR_EN_SHIFT)) & SOC_OTP_CTRL_OTP_CTRL0_REGULATOR_EN_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_CTRL0_MACRO_RD_DONE_MASK (0x80U)\r\n#define SOC_OTP_CTRL_OTP_CTRL0_MACRO_RD_DONE_SHIFT (7U)\r\n/*! MACRO_RD_DONE - RD_DONE is from the OTP bank (selected by otp_addr_reg[9:6]). */\r\n#define SOC_OTP_CTRL_OTP_CTRL0_MACRO_RD_DONE(x)  (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_CTRL0_MACRO_RD_DONE_SHIFT)) & SOC_OTP_CTRL_OTP_CTRL0_MACRO_RD_DONE_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_CTRL0_MACRO_TEST_MASK   (0xF00U)\r\n#define SOC_OTP_CTRL_OTP_CTRL0_MACRO_TEST_SHIFT  (8U)\r\n/*! MACRO_TEST - S/W control bits to TEST[3:0] inputs. */\r\n#define SOC_OTP_CTRL_OTP_CTRL0_MACRO_TEST(x)     (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_CTRL0_MACRO_TEST_SHIFT)) & SOC_OTP_CTRL_OTP_CTRL0_MACRO_TEST_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_CTRL0_REG_CSTATE_RESET_MASK (0x4000U)\r\n#define SOC_OTP_CTRL_OTP_CTRL0_REG_CSTATE_RESET_SHIFT (14U)\r\n/*! REG_CSTATE_RESET - Reset OTP ctrl sm (for debugging purpose). */\r\n#define SOC_OTP_CTRL_OTP_CTRL0_REG_CSTATE_RESET(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_CTRL0_REG_CSTATE_RESET_SHIFT)) & SOC_OTP_CTRL_OTP_CTRL0_REG_CSTATE_RESET_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_CTRL0_CTRL_CMD_DONE_MASK (0x8000U)\r\n#define SOC_OTP_CTRL_OTP_CTRL0_CTRL_CMD_DONE_SHIFT (15U)\r\n/*! CTRL_CMD_DONE - otp access command done. */\r\n#define SOC_OTP_CTRL_OTP_CTRL0_CTRL_CMD_DONE(x)  (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_CTRL0_CTRL_CMD_DONE_SHIFT)) & SOC_OTP_CTRL_OTP_CTRL0_CTRL_CMD_DONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_CTRL1 - OTP_CTRL1_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_CLK_OTPMEM_MASK (0x1U)\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_CLK_OTPMEM_SHIFT (0U)\r\n/*! OTP_PROG_SEQ_CODE_CLK_OTPMEM - Clock input, used to program the match code into all the OTP memories */\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_CLK_OTPMEM(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_CLK_OTPMEM_SHIFT)) & SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_CLK_OTPMEM_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_OTPMEM_MASK (0x2U)\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_OTPMEM_SHIFT (1U)\r\n/*! OTP_PROG_SEQ_CODE_OTPMEM - Data input, used to program the match code into all the OTP memories. */\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_OTPMEM(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_OTPMEM_SHIFT)) & SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_OTPMEM_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_CLK_VTR_MASK (0x4U)\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_CLK_VTR_SHIFT (2U)\r\n/*! OTP_PROG_SEQ_CODE_CLK_VTR - Clock input, used to program the match code into all the VTR (Step Down regulator) */\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_CLK_VTR(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_CLK_VTR_SHIFT)) & SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_CLK_VTR_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_VTR_MASK (0x8U)\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_VTR_SHIFT (3U)\r\n/*! OTP_PROG_SEQ_CODE_VTR - Data input, used to program the match code into all the VTR (Step Down regulator) */\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_VTR(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_VTR_SHIFT)) & SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_VTR_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_MUX_SEL_MASK (0x10U)\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_MUX_SEL_SHIFT (4U)\r\n/*! OTP_PROG_SEQ_CODE_MUX_SEL - SELECT OTP register for the match Code programming. */\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_MUX_SEL(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_MUX_SEL_SHIFT)) & SOC_OTP_CTRL_OTP_CTRL1_OTP_PROG_SEQ_CODE_MUX_SEL_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_FORCE_SCLK_MEM_PROG_MASK (0x20U)\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_FORCE_SCLK_MEM_PROG_SHIFT (5U)\r\n/*! OTP_FORCE_SCLK_MEM_PROG - Only used for OTP memory programming: Set this bit to allow the match\r\n *    code programming, clear this bit after the match code programming before start otp memory\r\n *    programming.\r\n */\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_FORCE_SCLK_MEM_PROG(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_CTRL1_OTP_FORCE_SCLK_MEM_PROG_SHIFT)) & SOC_OTP_CTRL_OTP_CTRL1_OTP_FORCE_SCLK_MEM_PROG_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_FORCE_STEPDOWN_PROG_MASK (0x40U)\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_FORCE_STEPDOWN_PROG_SHIFT (6U)\r\n/*! OTP_FORCE_STEPDOWN_PROG - For OTP memory programming: This bit need to be set before the match\r\n *    code programming and clear this bit after the otp memory contents programming is done.\r\n */\r\n#define SOC_OTP_CTRL_OTP_CTRL1_OTP_FORCE_STEPDOWN_PROG(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_CTRL1_OTP_FORCE_STEPDOWN_PROG_SHIFT)) & SOC_OTP_CTRL_OTP_CTRL1_OTP_FORCE_STEPDOWN_PROG_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_CTRL1_STEPDOWN_MATCH_MASK (0x80U)\r\n#define SOC_OTP_CTRL_OTP_CTRL1_STEPDOWN_MATCH_SHIFT (7U)\r\n/*! STEPDOWN_MATCH - Match value: */\r\n#define SOC_OTP_CTRL_OTP_CTRL1_STEPDOWN_MATCH(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_CTRL1_STEPDOWN_MATCH_SHIFT)) & SOC_OTP_CTRL_OTP_CTRL1_STEPDOWN_MATCH_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_CTRL1_MACRO_MATCH_MASK  (0xFF00U)\r\n#define SOC_OTP_CTRL_OTP_CTRL1_MACRO_MATCH_SHIFT (8U)\r\n/*! MACRO_MATCH - 0: match code does not match. */\r\n#define SOC_OTP_CTRL_OTP_CTRL1_MACRO_MATCH(x)    (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_CTRL1_MACRO_MATCH_SHIFT)) & SOC_OTP_CTRL_OTP_CTRL1_MACRO_MATCH_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_CMD_START - OTP_CMD_START_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_CMD_START_OTP_CMD_START_MASK (0x1U)\r\n#define SOC_OTP_CTRL_OTP_CMD_START_OTP_CMD_START_SHIFT (0U)\r\n/*! OTP_CMD_START - Write 1 to start otp access command execution and it clears the ctrl_cmd_done bit. */\r\n#define SOC_OTP_CTRL_OTP_CMD_START_OTP_CMD_START(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_CMD_START_OTP_CMD_START_SHIFT)) & SOC_OTP_CTRL_OTP_CMD_START_OTP_CMD_START_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_CMD_START_OTP_CMD_MASK  (0xF0U)\r\n#define SOC_OTP_CTRL_OTP_CMD_START_OTP_CMD_SHIFT (4U)\r\n/*! OTP_CMD - OTP access commands (the command execution finishes when the ctrl_cmd_done bit is set): */\r\n#define SOC_OTP_CTRL_OTP_CMD_START_OTP_CMD(x)    (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_CMD_START_OTP_CMD_SHIFT)) & SOC_OTP_CTRL_OTP_CMD_START_OTP_CMD_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_PARAM0 - OTP_PARAM0_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_PARAM0_TPGM_2US_MASK    (0x3FFU)\r\n#define SOC_OTP_CTRL_OTP_PARAM0_TPGM_2US_SHIFT   (0U)\r\n/*! TPGM_2US - Specify the width of the programming pulse (in number of pclk cycle), the number\r\n *    depends on the pclk frequency and the pulse width requirement (OTP macro specifies between 2us up\r\n *    to 10us).\r\n */\r\n#define SOC_OTP_CTRL_OTP_PARAM0_TPGM_2US(x)      (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_PARAM0_TPGM_2US_SHIFT)) & SOC_OTP_CTRL_OTP_PARAM0_TPGM_2US_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_PARAM0_TSQ_MINUS_TRD_MASK (0x3C00U)\r\n#define SOC_OTP_CTRL_OTP_PARAM0_TSQ_MINUS_TRD_SHIFT (10U)\r\n/*! TSQ_MINUS_TRD - Read data access time, the value to enter is tSQ(70ns)-tRD. The default value is based on 32MHz LSB clock. */\r\n#define SOC_OTP_CTRL_OTP_PARAM0_TSQ_MINUS_TRD(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_PARAM0_TSQ_MINUS_TRD_SHIFT)) & SOC_OTP_CTRL_OTP_PARAM0_TSQ_MINUS_TRD_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_PARAM0_TRD_20NS_LOW_MASK (0xC000U)\r\n#define SOC_OTP_CTRL_OTP_PARAM0_TRD_20NS_LOW_SHIFT (14U)\r\n/*! TRD_20NS_LOW - For 28nm. Read pulse width lower two bits(higher two bits are in\r\n *    OTP_PARAM2_REG[12:11]). The default value is based on 32MHz LSB clock.\r\n */\r\n#define SOC_OTP_CTRL_OTP_PARAM0_TRD_20NS_LOW(x)  (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_PARAM0_TRD_20NS_LOW_SHIFT)) & SOC_OTP_CTRL_OTP_PARAM0_TRD_20NS_LOW_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_PARAM1 - OTP_PARAM1_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_PARAM1_TVHV_OFF_10US_MASK (0x7FFU)\r\n#define SOC_OTP_CTRL_OTP_PARAM1_TVHV_OFF_10US_SHIFT (0U)\r\n/*! TVHV_OFF_10US - Specify the VHV turn OFF time before the OTP read access. The default value is based on 32MHz */\r\n#define SOC_OTP_CTRL_OTP_PARAM1_TVHV_OFF_10US(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_PARAM1_TVHV_OFF_10US_SHIFT)) & SOC_OTP_CTRL_OTP_PARAM1_TVHV_OFF_10US_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_PARAM1_TSU_300NS_MASK   (0xF800U)\r\n#define SOC_OTP_CTRL_OTP_PARAM1_TSU_300NS_SHIFT  (11U)\r\n/*! TSU_300NS - Specify setup time for few of the OTP control signals. The default value is based on 32MHz LSB clock. */\r\n#define SOC_OTP_CTRL_OTP_PARAM1_TSU_300NS(x)     (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_PARAM1_TSU_300NS_SHIFT)) & SOC_OTP_CTRL_OTP_PARAM1_TSU_300NS_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_PARAM2 - OTP_PARAM2_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_PARAM2_TVHV_ON_10US_MASK (0x7FFU)\r\n#define SOC_OTP_CTRL_OTP_PARAM2_TVHV_ON_10US_SHIFT (0U)\r\n/*! TVHV_ON_10US - Specify the VHV turn ON time before the OTP programming access. The default value is based on 32MHz LSB clock. */\r\n#define SOC_OTP_CTRL_OTP_PARAM2_TVHV_ON_10US(x)  (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_PARAM2_TVHV_ON_10US_SHIFT)) & SOC_OTP_CTRL_OTP_PARAM2_TVHV_ON_10US_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_PARAM2_TRD_20NS_HIGH_MASK (0x1800U)\r\n#define SOC_OTP_CTRL_OTP_PARAM2_TRD_20NS_HIGH_SHIFT (11U)\r\n/*! TRD_20NS_HIGH - For 28nm, Read pulse width higher two bits (lower two bits are in\r\n *    OTP_PARAM0_REG[15:14]). The default value is based on 32MHz LSB clock.\r\n */\r\n#define SOC_OTP_CTRL_OTP_PARAM2_TRD_20NS_HIGH(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_PARAM2_TRD_20NS_HIGH_SHIFT)) & SOC_OTP_CTRL_OTP_PARAM2_TRD_20NS_HIGH_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_BYPASS_MODE0 - OTP_BYPASS_MODE0_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE0_SET_OTP_BYPASS_MASK (0x1U)\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE0_SET_OTP_BYPASS_SHIFT (0U)\r\n/*! SET_OTP_BYPASS - SET OTP bypass mode, all the OTP interface control signals are under register control by s/w. */\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE0_SET_OTP_BYPASS(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_BYPASS_MODE0_SET_OTP_BYPASS_SHIFT)) & SOC_OTP_CTRL_OTP_BYPASS_MODE0_SET_OTP_BYPASS_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE0_SCLK_MASK  (0x40U)\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE0_SCLK_SHIFT (6U)\r\n/*! SCLK - Note: Only valid in the OTP BYPASS mode (OTP_BYPASS_MODE_REG[0]=1). */\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE0_SCLK(x)    (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_BYPASS_MODE0_SCLK_SHIFT)) & SOC_OTP_CTRL_OTP_BYPASS_MODE0_SCLK_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE0_PGM_B_MASK (0x80U)\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE0_PGM_B_SHIFT (7U)\r\n/*! PGM_B - Note: Only valid in the OTP BYPASS mode (OTP_BYPASS_MODE_REG[0]=1). */\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE0_PGM_B(x)   (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_BYPASS_MODE0_PGM_B_SHIFT)) & SOC_OTP_CTRL_OTP_BYPASS_MODE0_PGM_B_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE0_LOAD_MASK  (0x100U)\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE0_LOAD_SHIFT (8U)\r\n/*! LOAD - Note: Only valid in the OTP BYPASS mode (OTP_BYPASS_MODE_REG[0]=1). */\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE0_LOAD(x)    (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_BYPASS_MODE0_LOAD_SHIFT)) & SOC_OTP_CTRL_OTP_BYPASS_MODE0_LOAD_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE0_MUX_DOUT_MASK (0x4000U)\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE0_MUX_DOUT_SHIFT (14U)\r\n/*! MUX_DOUT - Note: Only valid in the OTP BYPASS mode (OTP_BYPASS_MODE_REG[0]=1). */\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE0_MUX_DOUT(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_BYPASS_MODE0_MUX_DOUT_SHIFT)) & SOC_OTP_CTRL_OTP_BYPASS_MODE0_MUX_DOUT_MASK)\r\n\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE0_MUX_RD_DONE_MASK (0x8000U)\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE0_MUX_RD_DONE_SHIFT (15U)\r\n/*! MUX_RD_DONE - Note: Only valid in the OTP BYPASS mode (OTP_BYPASS_MODE_REG[0]=1). */\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE0_MUX_RD_DONE(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_BYPASS_MODE0_MUX_RD_DONE_SHIFT)) & SOC_OTP_CTRL_OTP_BYPASS_MODE0_MUX_RD_DONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_BYPASS_MODE1 - OTP_BYPASS_MODE1_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE1_BIT_ADDRESS_MASK (0x7FU)\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE1_BIT_ADDRESS_SHIFT (0U)\r\n/*! BIT_ADDRESS - Note: Only valid in the OTP BYPASS mode (OTP_BYPASS_MODE_REG[0]=1). */\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE1_BIT_ADDRESS(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_BYPASS_MODE1_BIT_ADDRESS_SHIFT)) & SOC_OTP_CTRL_OTP_BYPASS_MODE1_BIT_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_TESTBUS_SEL - OTP_TESTBUS_SEL_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_TESTBUS_SEL_TESTBUS_MASK (0xFU)\r\n#define SOC_OTP_CTRL_OTP_TESTBUS_SEL_TESTBUS_SHIFT (0U)\r\n/*! TESTBUS - OTP Test Bus */\r\n#define SOC_OTP_CTRL_OTP_TESTBUS_SEL_TESTBUS(x)  (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_TESTBUS_SEL_TESTBUS_SHIFT)) & SOC_OTP_CTRL_OTP_TESTBUS_SEL_TESTBUS_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_TESTBUS - OTP_TESTBUS_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_TESTBUS_TESTBUS_MASK    (0xFFFFU)\r\n#define SOC_OTP_CTRL_OTP_TESTBUS_TESTBUS_SHIFT   (0U)\r\n/*! TESTBUS - OTP Test Bus */\r\n#define SOC_OTP_CTRL_OTP_TESTBUS_TESTBUS(x)      (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_TESTBUS_TESTBUS_SHIFT)) & SOC_OTP_CTRL_OTP_TESTBUS_TESTBUS_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_BYPASS_MODE2 - OTP_BYPASS_MODE2_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE2_CSB_MASK   (0xFFFFU)\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE2_CSB_SHIFT  (0U)\r\n/*! CSB - Note: Only valid in the OTP BYPASS mode (OTP_BYPASS_MODE_REG[0]=1). */\r\n#define SOC_OTP_CTRL_OTP_BYPASS_MODE2_CSB(x)     (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_BYPASS_MODE2_CSB_SHIFT)) & SOC_OTP_CTRL_OTP_BYPASS_MODE2_CSB_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_RST_B - OTP_RST_B_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_RST_B_OTP_RST_B_MASK    (0xFFFFU)\r\n#define SOC_OTP_CTRL_OTP_RST_B_OTP_RST_B_SHIFT   (0U)\r\n/*! OTP_RST_B - S/W reset bit to RST_B input of each OTP macro */\r\n#define SOC_OTP_CTRL_OTP_RST_B_OTP_RST_B(x)      (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_RST_B_OTP_RST_B_SHIFT)) & SOC_OTP_CTRL_OTP_RST_B_OTP_RST_B_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_POR_B - OTP_POR_B_REG */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_POR_B_OTP_POR_B_MASK    (0xFFFFU)\r\n#define SOC_OTP_CTRL_OTP_POR_B_OTP_POR_B_SHIFT   (0U)\r\n/*! OTP_POR_B - S/W por bit to POR_B input of each OTP macro. */\r\n#define SOC_OTP_CTRL_OTP_POR_B_OTP_POR_B(x)      (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_POR_B_OTP_POR_B_SHIFT)) & SOC_OTP_CTRL_OTP_POR_B_OTP_POR_B_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_WRITE_LOCK_REG - OTP_WRITE_LOCK_REG (Firecrest) */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_WRITE_LOCK_REG_OTP_WRITE_LOCK_MASK (0x1U)\r\n#define SOC_OTP_CTRL_OTP_WRITE_LOCK_REG_OTP_WRITE_LOCK_SHIFT (0U)\r\n/*! OTP_WRITE_LOCK - \"1 sticky bit, once it is set it will stay at set state until POR_ONLY reset to 0. */\r\n#define SOC_OTP_CTRL_OTP_WRITE_LOCK_REG_OTP_WRITE_LOCK(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_WRITE_LOCK_REG_OTP_WRITE_LOCK_SHIFT)) & SOC_OTP_CTRL_OTP_WRITE_LOCK_REG_OTP_WRITE_LOCK_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_WRITE_DIS_REG_15_0 - OTP_WRITE_DIS_REG[15:0] (Firecrest) */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_15_0_OTP_WRITE_DIS_MASK (0xFFFFU)\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_15_0_OTP_WRITE_DIS_SHIFT (0U)\r\n/*! OTP_WRITE_DIS - OTP_Write_Disable bitmap for OTP Line[15:0]. */\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_15_0_OTP_WRITE_DIS(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_WRITE_DIS_REG_15_0_OTP_WRITE_DIS_SHIFT)) & SOC_OTP_CTRL_OTP_WRITE_DIS_REG_15_0_OTP_WRITE_DIS_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_WRITE_DIS_REG_31_16 - OTP_WRITE_DIS_REG[31:16] (Firecrest) */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_31_16_OTP_WRITE_DIS_MASK (0xFFFFU)\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_31_16_OTP_WRITE_DIS_SHIFT (0U)\r\n/*! OTP_WRITE_DIS - OTP_Write_Disable bitmap for OTP Line[31:16]. */\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_31_16_OTP_WRITE_DIS(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_WRITE_DIS_REG_31_16_OTP_WRITE_DIS_SHIFT)) & SOC_OTP_CTRL_OTP_WRITE_DIS_REG_31_16_OTP_WRITE_DIS_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_WRITE_DIS_REG_47_32 - OTP_WRITE_DIS_REG[47:32] (Firecrest) */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_47_32_OTP_WRITE_DIS_MASK (0xFFFFU)\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_47_32_OTP_WRITE_DIS_SHIFT (0U)\r\n/*! OTP_WRITE_DIS - OTP_Write_Disable bitmap for OTP Line[47:32]. */\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_47_32_OTP_WRITE_DIS(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_WRITE_DIS_REG_47_32_OTP_WRITE_DIS_SHIFT)) & SOC_OTP_CTRL_OTP_WRITE_DIS_REG_47_32_OTP_WRITE_DIS_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_WRITE_DIS_REG_63_48 - OTP_WRITE_DIS_REG[63:48] (Firecrest) */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_63_48_OTP_WRITE_DIS_MASK (0xFFFFU)\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_63_48_OTP_WRITE_DIS_SHIFT (0U)\r\n/*! OTP_WRITE_DIS - OTP_Write_Disable bitmap for OTP Line[63:48]. */\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_63_48_OTP_WRITE_DIS(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_WRITE_DIS_REG_63_48_OTP_WRITE_DIS_SHIFT)) & SOC_OTP_CTRL_OTP_WRITE_DIS_REG_63_48_OTP_WRITE_DIS_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_WRITE_DIS_REG_79_64 - OTP_WRITE_DIS_REG[79:64] (Firecrest) */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_79_64_OTP_WRITE_DIS_MASK (0xFFFFU)\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_79_64_OTP_WRITE_DIS_SHIFT (0U)\r\n/*! OTP_WRITE_DIS - OTP_Write_Disable bitmap for OTP Line[79:64]. */\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_79_64_OTP_WRITE_DIS(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_WRITE_DIS_REG_79_64_OTP_WRITE_DIS_SHIFT)) & SOC_OTP_CTRL_OTP_WRITE_DIS_REG_79_64_OTP_WRITE_DIS_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_WRITE_DIS_REG_95_80 - OTP_WRITE_DIS_REG[95:80] (Firecrest) */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_95_80_OTP_WRITE_DIS_MASK (0xFFFFU)\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_95_80_OTP_WRITE_DIS_SHIFT (0U)\r\n/*! OTP_WRITE_DIS - OTP_Write_Disable bitmap for OTP Line[95:80]. */\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_95_80_OTP_WRITE_DIS(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_WRITE_DIS_REG_95_80_OTP_WRITE_DIS_SHIFT)) & SOC_OTP_CTRL_OTP_WRITE_DIS_REG_95_80_OTP_WRITE_DIS_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_WRITE_DIS_REG_111_96 - OTP_WRITE_DIS_REG[111:96] (Firecrest) */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_111_96_OTP_WRITE_DIS_MASK (0xFFFFU)\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_111_96_OTP_WRITE_DIS_SHIFT (0U)\r\n/*! OTP_WRITE_DIS - OTP_Write_Disable bitmap for OTP Line[111:96]. */\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_111_96_OTP_WRITE_DIS(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_WRITE_DIS_REG_111_96_OTP_WRITE_DIS_SHIFT)) & SOC_OTP_CTRL_OTP_WRITE_DIS_REG_111_96_OTP_WRITE_DIS_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_WRITE_DIS_REG_127_112 - OTP_WRITE_DIS_REG[127:112] (Firecrest) */\r\n/*! @{ */\r\n\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_127_112_OTP_WRITE_DIS_MASK (0xFFFFU)\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_127_112_OTP_WRITE_DIS_SHIFT (0U)\r\n/*! OTP_WRITE_DIS - OTP_Write_Disable bitmap for OTP Line[127:112]. */\r\n#define SOC_OTP_CTRL_OTP_WRITE_DIS_REG_127_112_OTP_WRITE_DIS(x) (((uint16_t)(((uint16_t)(x)) << SOC_OTP_CTRL_OTP_WRITE_DIS_REG_127_112_OTP_WRITE_DIS_SHIFT)) & SOC_OTP_CTRL_OTP_WRITE_DIS_REG_127_112_OTP_WRITE_DIS_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SOC_OTP_CTRL_Register_Masks */\r\n\r\n\r\n/* SOC_OTP_CTRL - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral SOC_OTP_CTRL base address */\r\n  #define SOC_OTP_CTRL_BASE                        (0x55003400u)\r\n  /** Peripheral SOC_OTP_CTRL base address */\r\n  #define SOC_OTP_CTRL_BASE_NS                     (0x45003400u)\r\n  /** Peripheral SOC_OTP_CTRL base pointer */\r\n  #define SOC_OTP_CTRL                             ((SOC_OTP_CTRL_Type *)SOC_OTP_CTRL_BASE)\r\n  /** Peripheral SOC_OTP_CTRL base pointer */\r\n  #define SOC_OTP_CTRL_NS                          ((SOC_OTP_CTRL_Type *)SOC_OTP_CTRL_BASE_NS)\r\n  /** Array initializer of SOC_OTP_CTRL peripheral base addresses */\r\n  #define SOC_OTP_CTRL_BASE_ADDRS                  { SOC_OTP_CTRL_BASE }\r\n  /** Array initializer of SOC_OTP_CTRL peripheral base pointers */\r\n  #define SOC_OTP_CTRL_BASE_PTRS                   { SOC_OTP_CTRL }\r\n  /** Array initializer of SOC_OTP_CTRL peripheral base addresses */\r\n  #define SOC_OTP_CTRL_BASE_ADDRS_NS               { SOC_OTP_CTRL_BASE_NS }\r\n  /** Array initializer of SOC_OTP_CTRL peripheral base pointers */\r\n  #define SOC_OTP_CTRL_BASE_PTRS_NS                { SOC_OTP_CTRL_NS }\r\n#else\r\n  /** Peripheral SOC_OTP_CTRL base address */\r\n  #define SOC_OTP_CTRL_BASE                        (0x45003400u)\r\n  /** Peripheral SOC_OTP_CTRL base pointer */\r\n  #define SOC_OTP_CTRL                             ((SOC_OTP_CTRL_Type *)SOC_OTP_CTRL_BASE)\r\n  /** Array initializer of SOC_OTP_CTRL peripheral base addresses */\r\n  #define SOC_OTP_CTRL_BASE_ADDRS                  { SOC_OTP_CTRL_BASE }\r\n  /** Array initializer of SOC_OTP_CTRL peripheral base pointers */\r\n  #define SOC_OTP_CTRL_BASE_PTRS                   { SOC_OTP_CTRL }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SOC_OTP_CTRL_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SPI Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SPI_Peripheral_Access_Layer SPI Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** SPI - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[1024];\r\n  __IO uint32_t CFG;                               /**< Configuration Register, offset: 0x400 */\r\n  __IO uint32_t DLY;                               /**< Delay Register, offset: 0x404 */\r\n  __IO uint32_t STAT;                              /**< Status Register, offset: 0x408 */\r\n  __IO uint32_t INTENSET;                          /**< Interrupt Enable Register, offset: 0x40C */\r\n  __O  uint32_t INTENCLR;                          /**< Interrupt Enable Clear Register, offset: 0x410 */\r\n       uint8_t RESERVED_1[16];\r\n  __IO uint32_t DIV;                               /**< Clock Divider Register, offset: 0x424 */\r\n  __I  uint32_t INTSTAT;                           /**< Interrupt Status Register, offset: 0x428 */\r\n       uint8_t RESERVED_2[2516];\r\n  __IO uint32_t FIFOCFG;                           /**< FIFO Configuration Register, offset: 0xE00 */\r\n  __IO uint32_t FIFOSTAT;                          /**< FIFO Status Register, offset: 0xE04 */\r\n  __IO uint32_t FIFOTRIG;                          /**< FIFO Trigger Register, offset: 0xE08 */\r\n       uint8_t RESERVED_3[4];\r\n  __IO uint32_t FIFOINTENSET;                      /**< FIFO Interrupt Enable Register, offset: 0xE10 */\r\n  __IO uint32_t FIFOINTENCLR;                      /**< FIFO Interrupt Enable Clear Register, offset: 0xE14 */\r\n  __I  uint32_t FIFOINTSTAT;                       /**< FIFO Interrupt Status Register, offset: 0xE18 */\r\n       uint8_t RESERVED_4[4];\r\n  __O  uint32_t FIFOWR;                            /**< FIFO Write Data Register, offset: 0xE20 */\r\n       uint8_t RESERVED_5[12];\r\n  __I  uint32_t FIFORD;                            /**< FIFO Read Data Register, offset: 0xE30 */\r\n       uint8_t RESERVED_6[12];\r\n  __I  uint32_t FIFORDNOPOP;                       /**< FIFO Data Read with no FIFO Pop Register, offset: 0xE40 */\r\n       uint8_t RESERVED_7[4];\r\n  __I  uint32_t FIFOSIZE;                          /**< FIFO Size Register, offset: 0xE48 */\r\n  struct {                                         /* offset: 0xE4C */\r\n    __IO uint32_t FIFORXTIMEOUTCFG;                  /**< FIFO Receive Timeout Configuration, offset: 0xE4C */\r\n    __I  uint32_t FIFORXTIMEOUTCNT;                  /**< FIFO Receive Timeout Counter, offset: 0xE50 */\r\n  } FIFO_SPI;\r\n       uint8_t RESERVED_8[424];\r\n  __I  uint32_t ID;                                /**< Peripheral Identification Register, offset: 0xFFC */\r\n} SPI_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SPI Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SPI_Register_Masks SPI Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name CFG - Configuration Register */\r\n/*! @{ */\r\n\r\n#define SPI_CFG_ENABLE_MASK                      (0x1U)\r\n#define SPI_CFG_ENABLE_SHIFT                     (0U)\r\n/*! ENABLE - SPI Enable\r\n *  0b0..Disabled. The SPI is disabled and the internal state machine and counters are reset.\r\n *  0b1..Enabled. The SPI is enabled for operation.\r\n */\r\n#define SPI_CFG_ENABLE(x)                        (((uint32_t)(((uint32_t)(x)) << SPI_CFG_ENABLE_SHIFT)) & SPI_CFG_ENABLE_MASK)\r\n\r\n#define SPI_CFG_MASTER_MASK                      (0x4U)\r\n#define SPI_CFG_MASTER_SHIFT                     (2U)\r\n/*! MASTER - Master Mode Select\r\n *  0b0..Slave mode. The SPI will operate in slave mode. SCK, MOSI, and the SSEL signals are inputs; MISO is an output.\r\n *  0b1..Master mode. The SPI will operate in master mode. SCK, MOSI, and the SSEL signals are outputs; MISO is an input.\r\n */\r\n#define SPI_CFG_MASTER(x)                        (((uint32_t)(((uint32_t)(x)) << SPI_CFG_MASTER_SHIFT)) & SPI_CFG_MASTER_MASK)\r\n\r\n#define SPI_CFG_LSBF_MASK                        (0x8U)\r\n#define SPI_CFG_LSBF_SHIFT                       (3U)\r\n/*! LSBF - LSB First Mode Enable\r\n *  0b0..Standard. Data is transmitted and received in standard MSB-first order.\r\n *  0b1..Reverse. Data is transmitted and received in reverse order (LSB first).\r\n */\r\n#define SPI_CFG_LSBF(x)                          (((uint32_t)(((uint32_t)(x)) << SPI_CFG_LSBF_SHIFT)) & SPI_CFG_LSBF_MASK)\r\n\r\n#define SPI_CFG_CPHA_MASK                        (0x10U)\r\n#define SPI_CFG_CPHA_SHIFT                       (4U)\r\n/*! CPHA - Clock Phase Select\r\n *  0b0..Change\r\n *  0b1..Capture\r\n */\r\n#define SPI_CFG_CPHA(x)                          (((uint32_t)(((uint32_t)(x)) << SPI_CFG_CPHA_SHIFT)) & SPI_CFG_CPHA_MASK)\r\n\r\n#define SPI_CFG_CPOL_MASK                        (0x20U)\r\n#define SPI_CFG_CPOL_SHIFT                       (5U)\r\n/*! CPOL - Clock Polarity Select\r\n *  0b0..Low. The rest state of the clock (between transfers) is low.\r\n *  0b1..High. The rest state of the clock (between transfers) is high.\r\n */\r\n#define SPI_CFG_CPOL(x)                          (((uint32_t)(((uint32_t)(x)) << SPI_CFG_CPOL_SHIFT)) & SPI_CFG_CPOL_MASK)\r\n\r\n#define SPI_CFG_LOOP_MASK                        (0x80U)\r\n#define SPI_CFG_LOOP_SHIFT                       (7U)\r\n/*! LOOP - Loopback Mode Enable\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define SPI_CFG_LOOP(x)                          (((uint32_t)(((uint32_t)(x)) << SPI_CFG_LOOP_SHIFT)) & SPI_CFG_LOOP_MASK)\r\n\r\n#define SPI_CFG_SPOL0_MASK                       (0x100U)\r\n#define SPI_CFG_SPOL0_SHIFT                      (8U)\r\n/*! SPOL0 - SSEL0 Polarity Select\r\n *  0b0..Low. The SSEL0 pin is active low.\r\n *  0b1..High. The SSEL0 pin is active high.\r\n */\r\n#define SPI_CFG_SPOL0(x)                         (((uint32_t)(((uint32_t)(x)) << SPI_CFG_SPOL0_SHIFT)) & SPI_CFG_SPOL0_MASK)\r\n\r\n#define SPI_CFG_SPOL1_MASK                       (0x200U)\r\n#define SPI_CFG_SPOL1_SHIFT                      (9U)\r\n/*! SPOL1 - SSEL1 Polarity Select\r\n *  0b0..Low. The SSEL1 pin is active low.\r\n *  0b1..High. The SSEL1 pin is active high.\r\n */\r\n#define SPI_CFG_SPOL1(x)                         (((uint32_t)(((uint32_t)(x)) << SPI_CFG_SPOL1_SHIFT)) & SPI_CFG_SPOL1_MASK)\r\n\r\n#define SPI_CFG_SPOL2_MASK                       (0x400U)\r\n#define SPI_CFG_SPOL2_SHIFT                      (10U)\r\n/*! SPOL2 - SSEL2 Polarity Select\r\n *  0b0..Low. The SSEL2 pin is active low.\r\n *  0b1..High. The SSEL2 pin is active high.\r\n */\r\n#define SPI_CFG_SPOL2(x)                         (((uint32_t)(((uint32_t)(x)) << SPI_CFG_SPOL2_SHIFT)) & SPI_CFG_SPOL2_MASK)\r\n\r\n#define SPI_CFG_SPOL3_MASK                       (0x800U)\r\n#define SPI_CFG_SPOL3_SHIFT                      (11U)\r\n/*! SPOL3 - SSEL3 Polarity Select\r\n *  0b0..Low. The SSEL3 pin is active low.\r\n *  0b1..High. The SSEL3 pin is active high.\r\n */\r\n#define SPI_CFG_SPOL3(x)                         (((uint32_t)(((uint32_t)(x)) << SPI_CFG_SPOL3_SHIFT)) & SPI_CFG_SPOL3_MASK)\r\n/*! @} */\r\n\r\n/*! @name DLY - Delay Register */\r\n/*! @{ */\r\n\r\n#define SPI_DLY_PRE_DELAY_MASK                   (0xFU)\r\n#define SPI_DLY_PRE_DELAY_SHIFT                  (0U)\r\n/*! PRE_DELAY - Pre-Delay\r\n *  0b0000..No additional time is inserted\r\n *  0b0001..1 SPI clock time is inserted\r\n *  0b0010..2 SPI clock times are inserted\r\n *  0b1111..15 SPI clock times are inserted\r\n */\r\n#define SPI_DLY_PRE_DELAY(x)                     (((uint32_t)(((uint32_t)(x)) << SPI_DLY_PRE_DELAY_SHIFT)) & SPI_DLY_PRE_DELAY_MASK)\r\n\r\n#define SPI_DLY_POST_DELAY_MASK                  (0xF0U)\r\n#define SPI_DLY_POST_DELAY_SHIFT                 (4U)\r\n/*! POST_DELAY - Post-Delay\r\n *  0b0000..No additional time is inserted\r\n *  0b0001..1 SPI clock time is inserted\r\n *  0b0010..2 SPI clock times are inserted\r\n *  0b1111..15 SPI clock times are inserted\r\n */\r\n#define SPI_DLY_POST_DELAY(x)                    (((uint32_t)(((uint32_t)(x)) << SPI_DLY_POST_DELAY_SHIFT)) & SPI_DLY_POST_DELAY_MASK)\r\n\r\n#define SPI_DLY_FRAME_DELAY_MASK                 (0xF00U)\r\n#define SPI_DLY_FRAME_DELAY_SHIFT                (8U)\r\n/*! FRAME_DELAY - Frame Delay\r\n *  0b0000..No additional time is inserted\r\n *  0b0001..1 SPI clock time is inserted\r\n *  0b0010..2 SPI clock times are inserted\r\n *  0b1111..15 SPI clock times are inserted\r\n */\r\n#define SPI_DLY_FRAME_DELAY(x)                   (((uint32_t)(((uint32_t)(x)) << SPI_DLY_FRAME_DELAY_SHIFT)) & SPI_DLY_FRAME_DELAY_MASK)\r\n\r\n#define SPI_DLY_TRANSFER_DELAY_MASK              (0xF000U)\r\n#define SPI_DLY_TRANSFER_DELAY_SHIFT             (12U)\r\n/*! TRANSFER_DELAY - Transfer Delay\r\n *  0b0000..The minimum time that SSEL is deasserted is 1 SPI clock time (zero-added time)\r\n *  0b0001..The minimum time that SSEL is deasserted is 2 SPI clock times\r\n *  0b0010..The minimum time that SSEL is deasserted is 3 SPI clock times\r\n *  0b1111..The minimum time that SSEL is deasserted is 16 SPI clock times\r\n */\r\n#define SPI_DLY_TRANSFER_DELAY(x)                (((uint32_t)(((uint32_t)(x)) << SPI_DLY_TRANSFER_DELAY_SHIFT)) & SPI_DLY_TRANSFER_DELAY_MASK)\r\n/*! @} */\r\n\r\n/*! @name STAT - Status Register */\r\n/*! @{ */\r\n\r\n#define SPI_STAT_SSA_MASK                        (0x10U)\r\n#define SPI_STAT_SSA_SHIFT                       (4U)\r\n/*! SSA - Slave Select Assert */\r\n#define SPI_STAT_SSA(x)                          (((uint32_t)(((uint32_t)(x)) << SPI_STAT_SSA_SHIFT)) & SPI_STAT_SSA_MASK)\r\n\r\n#define SPI_STAT_SSD_MASK                        (0x20U)\r\n#define SPI_STAT_SSD_SHIFT                       (5U)\r\n/*! SSD - Slave Select Deassert */\r\n#define SPI_STAT_SSD(x)                          (((uint32_t)(((uint32_t)(x)) << SPI_STAT_SSD_SHIFT)) & SPI_STAT_SSD_MASK)\r\n\r\n#define SPI_STAT_STALLED_MASK                    (0x40U)\r\n#define SPI_STAT_STALLED_SHIFT                   (6U)\r\n/*! STALLED - Stalled Status Flag */\r\n#define SPI_STAT_STALLED(x)                      (((uint32_t)(((uint32_t)(x)) << SPI_STAT_STALLED_SHIFT)) & SPI_STAT_STALLED_MASK)\r\n\r\n#define SPI_STAT_ENDTRANSFER_MASK                (0x80U)\r\n#define SPI_STAT_ENDTRANSFER_SHIFT               (7U)\r\n/*! ENDTRANSFER - End Transfer Control */\r\n#define SPI_STAT_ENDTRANSFER(x)                  (((uint32_t)(((uint32_t)(x)) << SPI_STAT_ENDTRANSFER_SHIFT)) & SPI_STAT_ENDTRANSFER_MASK)\r\n\r\n#define SPI_STAT_MSTIDLE_MASK                    (0x100U)\r\n#define SPI_STAT_MSTIDLE_SHIFT                   (8U)\r\n/*! MSTIDLE - Master Idle Status Flag */\r\n#define SPI_STAT_MSTIDLE(x)                      (((uint32_t)(((uint32_t)(x)) << SPI_STAT_MSTIDLE_SHIFT)) & SPI_STAT_MSTIDLE_MASK)\r\n/*! @} */\r\n\r\n/*! @name INTENSET - Interrupt Enable Register */\r\n/*! @{ */\r\n\r\n#define SPI_INTENSET_SSAEN_MASK                  (0x10U)\r\n#define SPI_INTENSET_SSAEN_SHIFT                 (4U)\r\n/*! SSAEN - Slave Select Assert Interrupt Enable\r\n *  0b0..Disabled. No interrupt will be generated when any Slave Select transitions from deasserted to asserted.\r\n *  0b1..Enabled. An interrupt will be generated when any Slave Select transitions from deasserted to asserted.\r\n */\r\n#define SPI_INTENSET_SSAEN(x)                    (((uint32_t)(((uint32_t)(x)) << SPI_INTENSET_SSAEN_SHIFT)) & SPI_INTENSET_SSAEN_MASK)\r\n\r\n#define SPI_INTENSET_SSDEN_MASK                  (0x20U)\r\n#define SPI_INTENSET_SSDEN_SHIFT                 (5U)\r\n/*! SSDEN - Slave Select Deassert Interrupt Enable\r\n *  0b0..Disabled. No interrupt will be generated when all asserted Slave Selects transition to deasserted.\r\n *  0b1..Enabled. An interrupt will be generated when all asserted Slave Selects transition to deasserted.\r\n */\r\n#define SPI_INTENSET_SSDEN(x)                    (((uint32_t)(((uint32_t)(x)) << SPI_INTENSET_SSDEN_SHIFT)) & SPI_INTENSET_SSDEN_MASK)\r\n\r\n#define SPI_INTENSET_MSTIDLEEN_MASK              (0x100U)\r\n#define SPI_INTENSET_MSTIDLEEN_SHIFT             (8U)\r\n/*! MSTIDLEEN - Master Idle Interrupt Enable\r\n *  0b0..No interrupt will be generated when the SPI master function is idle.\r\n *  0b1..An interrupt will be generated when the SPI master function is fully idle.\r\n */\r\n#define SPI_INTENSET_MSTIDLEEN(x)                (((uint32_t)(((uint32_t)(x)) << SPI_INTENSET_MSTIDLEEN_SHIFT)) & SPI_INTENSET_MSTIDLEEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name INTENCLR - Interrupt Enable Clear Register */\r\n/*! @{ */\r\n\r\n#define SPI_INTENCLR_SSAEN_MASK                  (0x10U)\r\n#define SPI_INTENCLR_SSAEN_SHIFT                 (4U)\r\n/*! SSAEN - Slave Select Assert Interrupt Enable\r\n *  0b0..No effect\r\n *  0b1..Clear the Slave Select Assert Interrupt Enable bit (INTENSET[SSAEN])\r\n */\r\n#define SPI_INTENCLR_SSAEN(x)                    (((uint32_t)(((uint32_t)(x)) << SPI_INTENCLR_SSAEN_SHIFT)) & SPI_INTENCLR_SSAEN_MASK)\r\n\r\n#define SPI_INTENCLR_SSDEN_MASK                  (0x20U)\r\n#define SPI_INTENCLR_SSDEN_SHIFT                 (5U)\r\n/*! SSDEN - Slave Select Deassert Interrupt Enable\r\n *  0b0..No effect\r\n *  0b1..Clear the Slave Select Deassert Interrupt Enable bit (INTENSET[SSDEN])\r\n */\r\n#define SPI_INTENCLR_SSDEN(x)                    (((uint32_t)(((uint32_t)(x)) << SPI_INTENCLR_SSDEN_SHIFT)) & SPI_INTENCLR_SSDEN_MASK)\r\n\r\n#define SPI_INTENCLR_MSTIDLE_MASK                (0x100U)\r\n#define SPI_INTENCLR_MSTIDLE_SHIFT               (8U)\r\n/*! MSTIDLE - Master Idle Interrupt Enable\r\n *  0b0..No effect\r\n *  0b1..Clear the Master Idle Interrupt Enable bit (INTENSET[MSTIDLE])\r\n */\r\n#define SPI_INTENCLR_MSTIDLE(x)                  (((uint32_t)(((uint32_t)(x)) << SPI_INTENCLR_MSTIDLE_SHIFT)) & SPI_INTENCLR_MSTIDLE_MASK)\r\n/*! @} */\r\n\r\n/*! @name DIV - Clock Divider Register */\r\n/*! @{ */\r\n\r\n#define SPI_DIV_DIVVAL_MASK                      (0xFFFFU)\r\n#define SPI_DIV_DIVVAL_SHIFT                     (0U)\r\n/*! DIVVAL - Rate Divider Value */\r\n#define SPI_DIV_DIVVAL(x)                        (((uint32_t)(((uint32_t)(x)) << SPI_DIV_DIVVAL_SHIFT)) & SPI_DIV_DIVVAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name INTSTAT - Interrupt Status Register */\r\n/*! @{ */\r\n\r\n#define SPI_INTSTAT_SSA_MASK                     (0x10U)\r\n#define SPI_INTSTAT_SSA_SHIFT                    (4U)\r\n/*! SSA - Slave Select Assert Interrupt\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define SPI_INTSTAT_SSA(x)                       (((uint32_t)(((uint32_t)(x)) << SPI_INTSTAT_SSA_SHIFT)) & SPI_INTSTAT_SSA_MASK)\r\n\r\n#define SPI_INTSTAT_SSD_MASK                     (0x20U)\r\n#define SPI_INTSTAT_SSD_SHIFT                    (5U)\r\n/*! SSD - Slave Select Deassert Interrupt\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define SPI_INTSTAT_SSD(x)                       (((uint32_t)(((uint32_t)(x)) << SPI_INTSTAT_SSD_SHIFT)) & SPI_INTSTAT_SSD_MASK)\r\n\r\n#define SPI_INTSTAT_MSTIDLE_MASK                 (0x100U)\r\n#define SPI_INTSTAT_MSTIDLE_SHIFT                (8U)\r\n/*! MSTIDLE - Master Idle Status Flag Interrupt\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define SPI_INTSTAT_MSTIDLE(x)                   (((uint32_t)(((uint32_t)(x)) << SPI_INTSTAT_MSTIDLE_SHIFT)) & SPI_INTSTAT_MSTIDLE_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOCFG - FIFO Configuration Register */\r\n/*! @{ */\r\n\r\n#define SPI_FIFOCFG_ENABLETX_MASK                (0x1U)\r\n#define SPI_FIFOCFG_ENABLETX_SHIFT               (0U)\r\n/*! ENABLETX - Enable the Transmit FIFO\r\n *  0b0..The transmit FIFO is not enabled\r\n *  0b1..The transmit FIFO is enabled\r\n */\r\n#define SPI_FIFOCFG_ENABLETX(x)                  (((uint32_t)(((uint32_t)(x)) << SPI_FIFOCFG_ENABLETX_SHIFT)) & SPI_FIFOCFG_ENABLETX_MASK)\r\n\r\n#define SPI_FIFOCFG_ENABLERX_MASK                (0x2U)\r\n#define SPI_FIFOCFG_ENABLERX_SHIFT               (1U)\r\n/*! ENABLERX - Enable the Receive FIFO\r\n *  0b0..The receive FIFO is not enabled\r\n *  0b1..The receive FIFO is enabled\r\n */\r\n#define SPI_FIFOCFG_ENABLERX(x)                  (((uint32_t)(((uint32_t)(x)) << SPI_FIFOCFG_ENABLERX_SHIFT)) & SPI_FIFOCFG_ENABLERX_MASK)\r\n\r\n#define SPI_FIFOCFG_SIZE_MASK                    (0x30U)\r\n#define SPI_FIFOCFG_SIZE_SHIFT                   (4U)\r\n/*! SIZE - FIFO Size Configuration\r\n *  0b00..FIFO is configured as 16 entries of 8 bits.\r\n *  0b01..FIFO is configured as 8 entries of 16 bits.\r\n *  0b10..Not used\r\n *  0b11..Not used\r\n */\r\n#define SPI_FIFOCFG_SIZE(x)                      (((uint32_t)(((uint32_t)(x)) << SPI_FIFOCFG_SIZE_SHIFT)) & SPI_FIFOCFG_SIZE_MASK)\r\n\r\n#define SPI_FIFOCFG_DMATX_MASK                   (0x1000U)\r\n#define SPI_FIFOCFG_DMATX_SHIFT                  (12U)\r\n/*! DMATX - DMA Configuration for Transmit\r\n *  0b0..DMA is not used for the transmit function\r\n *  0b1..Issues DMA request for the transmit function if the FIFO is not full. Generally, data interrupts would be disabled if DMA is enabled.\r\n */\r\n#define SPI_FIFOCFG_DMATX(x)                     (((uint32_t)(((uint32_t)(x)) << SPI_FIFOCFG_DMATX_SHIFT)) & SPI_FIFOCFG_DMATX_MASK)\r\n\r\n#define SPI_FIFOCFG_DMARX_MASK                   (0x2000U)\r\n#define SPI_FIFOCFG_DMARX_SHIFT                  (13U)\r\n/*! DMARX - DMA Configuration for Receive\r\n *  0b0..DMA is not used for the receive function.\r\n *  0b1..Issues a DMA request for the receive function if the FIFO is not empty. Generally, data interrupts would be disabled if DMA is enabled.\r\n */\r\n#define SPI_FIFOCFG_DMARX(x)                     (((uint32_t)(((uint32_t)(x)) << SPI_FIFOCFG_DMARX_SHIFT)) & SPI_FIFOCFG_DMARX_MASK)\r\n\r\n#define SPI_FIFOCFG_WAKETX_MASK                  (0x4000U)\r\n#define SPI_FIFOCFG_WAKETX_SHIFT                 (14U)\r\n/*! WAKETX - Wake-up for Transmit FIFO Level\r\n *  0b0..Only enabled interrupts will wake up the device form reduced power modes\r\n *  0b1..A device wake-up for DMA will occur if the transmit FIFO level reaches the value specified by TXLVL in\r\n *       FIFOTRIG, even when the TXLVL interrupt is not enabled.\r\n */\r\n#define SPI_FIFOCFG_WAKETX(x)                    (((uint32_t)(((uint32_t)(x)) << SPI_FIFOCFG_WAKETX_SHIFT)) & SPI_FIFOCFG_WAKETX_MASK)\r\n\r\n#define SPI_FIFOCFG_WAKERX_MASK                  (0x8000U)\r\n#define SPI_FIFOCFG_WAKERX_SHIFT                 (15U)\r\n/*! WAKERX - Wake-up for Receive FIFO Level\r\n *  0b0..Only enabled interrupts will wake up the device form reduced power modes.\r\n *  0b1..A device wake-up for DMA will occur if the receive FIFO level reaches the value specified by\r\n *       FIFOTRIG[RXLVL], even when the RXLVL interrupt is not enabled.\r\n */\r\n#define SPI_FIFOCFG_WAKERX(x)                    (((uint32_t)(((uint32_t)(x)) << SPI_FIFOCFG_WAKERX_SHIFT)) & SPI_FIFOCFG_WAKERX_MASK)\r\n\r\n#define SPI_FIFOCFG_EMPTYTX_MASK                 (0x10000U)\r\n#define SPI_FIFOCFG_EMPTYTX_SHIFT                (16U)\r\n/*! EMPTYTX - Empty Command for the Transmit FIFO\r\n *  0b0..No effect\r\n *  0b1..The TX FIFO is emptied\r\n */\r\n#define SPI_FIFOCFG_EMPTYTX(x)                   (((uint32_t)(((uint32_t)(x)) << SPI_FIFOCFG_EMPTYTX_SHIFT)) & SPI_FIFOCFG_EMPTYTX_MASK)\r\n\r\n#define SPI_FIFOCFG_EMPTYRX_MASK                 (0x20000U)\r\n#define SPI_FIFOCFG_EMPTYRX_SHIFT                (17U)\r\n/*! EMPTYRX - Empty Command for the Receive FIFO\r\n *  0b0..No effect\r\n *  0b1..The RX FIFO is emptied\r\n */\r\n#define SPI_FIFOCFG_EMPTYRX(x)                   (((uint32_t)(((uint32_t)(x)) << SPI_FIFOCFG_EMPTYRX_SHIFT)) & SPI_FIFOCFG_EMPTYRX_MASK)\r\n\r\n#define SPI_FIFOCFG_POPDBG_MASK                  (0x40000U)\r\n#define SPI_FIFOCFG_POPDBG_SHIFT                 (18U)\r\n/*! POPDBG - Pop FIFO for Debug Reads\r\n *  0b0..Debug reads of the FIFO do not pop the FIFO\r\n *  0b1..A debug read will cause the FIFO to pop\r\n */\r\n#define SPI_FIFOCFG_POPDBG(x)                    (((uint32_t)(((uint32_t)(x)) << SPI_FIFOCFG_POPDBG_SHIFT)) & SPI_FIFOCFG_POPDBG_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOSTAT - FIFO Status Register */\r\n/*! @{ */\r\n\r\n#define SPI_FIFOSTAT_TXERR_MASK                  (0x1U)\r\n#define SPI_FIFOSTAT_TXERR_SHIFT                 (0U)\r\n/*! TXERR - TX FIFO Error\r\n *  0b0..A transmit FIFO error has not occurred.\r\n *  0b1..A transmit FIFO error has occurred. This error could be an overflow caused by pushing data into a full\r\n *       FIFO, or by an underflow if the FIFO is empty when data is needed.\r\n */\r\n#define SPI_FIFOSTAT_TXERR(x)                    (((uint32_t)(((uint32_t)(x)) << SPI_FIFOSTAT_TXERR_SHIFT)) & SPI_FIFOSTAT_TXERR_MASK)\r\n\r\n#define SPI_FIFOSTAT_RXERR_MASK                  (0x2U)\r\n#define SPI_FIFOSTAT_RXERR_SHIFT                 (1U)\r\n/*! RXERR - RX FIFO Error\r\n *  0b0..A receive FIFO overflow has not occurred\r\n *  0b1..A receive FIFO overflow has occurred, caused by software or DMA not emptying the FIFO fast enough\r\n */\r\n#define SPI_FIFOSTAT_RXERR(x)                    (((uint32_t)(((uint32_t)(x)) << SPI_FIFOSTAT_RXERR_SHIFT)) & SPI_FIFOSTAT_RXERR_MASK)\r\n\r\n#define SPI_FIFOSTAT_PERINT_MASK                 (0x8U)\r\n#define SPI_FIFOSTAT_PERINT_SHIFT                (3U)\r\n/*! PERINT - Peripheral Interrupt\r\n *  0b0..The peripheral function has not asserted an interrupt\r\n *  0b1..Indicates that the peripheral function has asserted an interrupt. More information can be found by\r\n *       reading the peripheral's status register (STAT).\r\n */\r\n#define SPI_FIFOSTAT_PERINT(x)                   (((uint32_t)(((uint32_t)(x)) << SPI_FIFOSTAT_PERINT_SHIFT)) & SPI_FIFOSTAT_PERINT_MASK)\r\n\r\n#define SPI_FIFOSTAT_TXEMPTY_MASK                (0x10U)\r\n#define SPI_FIFOSTAT_TXEMPTY_SHIFT               (4U)\r\n/*! TXEMPTY - Transmit FIFO Empty\r\n *  0b0..The transmit FIFO is not empty\r\n *  0b1..The transmit FIFO is empty, although the peripheral may still be processing the last piece of data.\r\n */\r\n#define SPI_FIFOSTAT_TXEMPTY(x)                  (((uint32_t)(((uint32_t)(x)) << SPI_FIFOSTAT_TXEMPTY_SHIFT)) & SPI_FIFOSTAT_TXEMPTY_MASK)\r\n\r\n#define SPI_FIFOSTAT_TXNOTFULL_MASK              (0x20U)\r\n#define SPI_FIFOSTAT_TXNOTFULL_SHIFT             (5U)\r\n/*! TXNOTFULL - Transmit FIFO is Not Full\r\n *  0b0..The transmit FIFO is full and another write would cause it to overflow\r\n *  0b1..The transmit FIFO is not full, so more data can be written\r\n */\r\n#define SPI_FIFOSTAT_TXNOTFULL(x)                (((uint32_t)(((uint32_t)(x)) << SPI_FIFOSTAT_TXNOTFULL_SHIFT)) & SPI_FIFOSTAT_TXNOTFULL_MASK)\r\n\r\n#define SPI_FIFOSTAT_RXNOTEMPTY_MASK             (0x40U)\r\n#define SPI_FIFOSTAT_RXNOTEMPTY_SHIFT            (6U)\r\n/*! RXNOTEMPTY - Receive FIFO is Not Empty\r\n *  0b0..When 0, the receive FIFO is empty\r\n *  0b1..When 1, the receive FIFO is not empty, so data can be read\r\n */\r\n#define SPI_FIFOSTAT_RXNOTEMPTY(x)               (((uint32_t)(((uint32_t)(x)) << SPI_FIFOSTAT_RXNOTEMPTY_SHIFT)) & SPI_FIFOSTAT_RXNOTEMPTY_MASK)\r\n\r\n#define SPI_FIFOSTAT_RXFULL_MASK                 (0x80U)\r\n#define SPI_FIFOSTAT_RXFULL_SHIFT                (7U)\r\n/*! RXFULL - Receive FIFO is Full\r\n *  0b0..The receive FIFO is not full\r\n *  0b1..The receive FIFO is full. To prevent the peripheral from causing an overflow, data should be read out.\r\n */\r\n#define SPI_FIFOSTAT_RXFULL(x)                   (((uint32_t)(((uint32_t)(x)) << SPI_FIFOSTAT_RXFULL_SHIFT)) & SPI_FIFOSTAT_RXFULL_MASK)\r\n\r\n#define SPI_FIFOSTAT_TXLVL_MASK                  (0x1F00U)\r\n#define SPI_FIFOSTAT_TXLVL_SHIFT                 (8U)\r\n/*! TXLVL - Transmit FIFO Current Level */\r\n#define SPI_FIFOSTAT_TXLVL(x)                    (((uint32_t)(((uint32_t)(x)) << SPI_FIFOSTAT_TXLVL_SHIFT)) & SPI_FIFOSTAT_TXLVL_MASK)\r\n\r\n#define SPI_FIFOSTAT_RXLVL_MASK                  (0x1F0000U)\r\n#define SPI_FIFOSTAT_RXLVL_SHIFT                 (16U)\r\n/*! RXLVL - Receive FIFO Current Level */\r\n#define SPI_FIFOSTAT_RXLVL(x)                    (((uint32_t)(((uint32_t)(x)) << SPI_FIFOSTAT_RXLVL_SHIFT)) & SPI_FIFOSTAT_RXLVL_MASK)\r\n\r\n#define SPI_FIFOSTAT_RXTIMEOUT_MASK              (0x1000000U)\r\n#define SPI_FIFOSTAT_RXTIMEOUT_SHIFT             (24U)\r\n/*! RXTIMEOUT - Receive FIFO Timeout\r\n *  0b0..RX FIFO on\r\n *  0b1..RX FIFO has timed out, based on the timeout configuration in the FIFORXTIMEOUTCFG register.\r\n */\r\n#define SPI_FIFOSTAT_RXTIMEOUT(x)                (((uint32_t)(((uint32_t)(x)) << SPI_FIFOSTAT_RXTIMEOUT_SHIFT)) & SPI_FIFOSTAT_RXTIMEOUT_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOTRIG - FIFO Trigger Register */\r\n/*! @{ */\r\n\r\n#define SPI_FIFOTRIG_TXLVLENA_MASK               (0x1U)\r\n#define SPI_FIFOTRIG_TXLVLENA_SHIFT              (0U)\r\n/*! TXLVLENA - Transmit FIFO Level Trigger Enable\r\n *  0b0..Transmit FIFO level does not generate a FIFO level trigger\r\n *  0b1..An trigger will be generated if the transmit FIFO level reaches the value specified by the FIFOTRIG[TXLVL] field.\r\n */\r\n#define SPI_FIFOTRIG_TXLVLENA(x)                 (((uint32_t)(((uint32_t)(x)) << SPI_FIFOTRIG_TXLVLENA_SHIFT)) & SPI_FIFOTRIG_TXLVLENA_MASK)\r\n\r\n#define SPI_FIFOTRIG_RXLVLENA_MASK               (0x2U)\r\n#define SPI_FIFOTRIG_RXLVLENA_SHIFT              (1U)\r\n/*! RXLVLENA - Receive FIFO Level Trigger Enable\r\n *  0b0..Receive FIFO level does not generate a FIFO level trigger\r\n *  0b1..An trigger will be generated if the receive FIFO level reaches the value specified by the FIFOTRIG[RXLVL] field.\r\n */\r\n#define SPI_FIFOTRIG_RXLVLENA(x)                 (((uint32_t)(((uint32_t)(x)) << SPI_FIFOTRIG_RXLVLENA_SHIFT)) & SPI_FIFOTRIG_RXLVLENA_MASK)\r\n\r\n#define SPI_FIFOTRIG_TXLVL_MASK                  (0xF00U)\r\n#define SPI_FIFOTRIG_TXLVL_SHIFT                 (8U)\r\n/*! TXLVL - Transmit FIFO Level Trigger Point\r\n *  0b0000..Trigger when the TX FIFO becomes empty\r\n *  0b0001..Trigger when the TX FIFO level decreases to 1 entry\r\n *  0b1111..Trigger when the TX FIFO level decreases to 15 entries (is no longer full)\r\n */\r\n#define SPI_FIFOTRIG_TXLVL(x)                    (((uint32_t)(((uint32_t)(x)) << SPI_FIFOTRIG_TXLVL_SHIFT)) & SPI_FIFOTRIG_TXLVL_MASK)\r\n\r\n#define SPI_FIFOTRIG_RXLVL_MASK                  (0xF0000U)\r\n#define SPI_FIFOTRIG_RXLVL_SHIFT                 (16U)\r\n/*! RXLVL - Receive FIFO Level Trigger Point\r\n *  0b0000..Trigger when the RX FIFO has received 1 entry (is no longer empty)\r\n *  0b0001..Trigger when the RX FIFO has received 2 entries\r\n *  0b1111..Trigger when the RX FIFO has received 16 entries (has become full)\r\n */\r\n#define SPI_FIFOTRIG_RXLVL(x)                    (((uint32_t)(((uint32_t)(x)) << SPI_FIFOTRIG_RXLVL_SHIFT)) & SPI_FIFOTRIG_RXLVL_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOINTENSET - FIFO Interrupt Enable Register */\r\n/*! @{ */\r\n\r\n#define SPI_FIFOINTENSET_TXERR_MASK              (0x1U)\r\n#define SPI_FIFOINTENSET_TXERR_SHIFT             (0U)\r\n/*! TXERR - TX Error Interrupt Enable\r\n *  0b0..No interrupt will be generated for a transmit error\r\n *  0b1..An interrupt will be generated when a transmit error occurs\r\n */\r\n#define SPI_FIFOINTENSET_TXERR(x)                (((uint32_t)(((uint32_t)(x)) << SPI_FIFOINTENSET_TXERR_SHIFT)) & SPI_FIFOINTENSET_TXERR_MASK)\r\n\r\n#define SPI_FIFOINTENSET_RXERR_MASK              (0x2U)\r\n#define SPI_FIFOINTENSET_RXERR_SHIFT             (1U)\r\n/*! RXERR - Receive Error Interrupt Enable\r\n *  0b0..No interrupt will be generated for a receive error\r\n *  0b1..An interrupt will be generated when a receive error occurs\r\n */\r\n#define SPI_FIFOINTENSET_RXERR(x)                (((uint32_t)(((uint32_t)(x)) << SPI_FIFOINTENSET_RXERR_SHIFT)) & SPI_FIFOINTENSET_RXERR_MASK)\r\n\r\n#define SPI_FIFOINTENSET_TXLVL_MASK              (0x4U)\r\n#define SPI_FIFOINTENSET_TXLVL_SHIFT             (2U)\r\n/*! TXLVL - Transmit FIFO Level Interrupt Enable\r\n *  0b0..No interrupt will be generated based on the TX FIFO level\r\n *  0b1..If FIFOTRIG[TXLVLENA]=1, then an interrupt will be generated when the TX FIFO level decreases to the level specified by FIFOTRIG[TXLVL]\r\n */\r\n#define SPI_FIFOINTENSET_TXLVL(x)                (((uint32_t)(((uint32_t)(x)) << SPI_FIFOINTENSET_TXLVL_SHIFT)) & SPI_FIFOINTENSET_TXLVL_MASK)\r\n\r\n#define SPI_FIFOINTENSET_RXLVL_MASK              (0x8U)\r\n#define SPI_FIFOINTENSET_RXLVL_SHIFT             (3U)\r\n/*! RXLVL - Receive FIFO Level Interrupt Enable\r\n *  0b0..No interrupt will be generated based on the RX FIFO level\r\n *  0b1..If FIFOTRIG[RXLVLENA]=1, then an interrupt will be generated when the RX FIFO level increases to the level specified by FIFOTRIG[RXLVL]\r\n */\r\n#define SPI_FIFOINTENSET_RXLVL(x)                (((uint32_t)(((uint32_t)(x)) << SPI_FIFOINTENSET_RXLVL_SHIFT)) & SPI_FIFOINTENSET_RXLVL_MASK)\r\n\r\n#define SPI_FIFOINTENSET_RXTIMEOUT_MASK          (0x1000000U)\r\n#define SPI_FIFOINTENSET_RXTIMEOUT_SHIFT         (24U)\r\n/*! RXTIMEOUT - Receive Timeout\r\n *  0b0..No RX interrupt will be generated.\r\n *  0b1..Asserts RX interrupt if RX FIFO Timeout event occurs.\r\n */\r\n#define SPI_FIFOINTENSET_RXTIMEOUT(x)            (((uint32_t)(((uint32_t)(x)) << SPI_FIFOINTENSET_RXTIMEOUT_SHIFT)) & SPI_FIFOINTENSET_RXTIMEOUT_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOINTENCLR - FIFO Interrupt Enable Clear Register */\r\n/*! @{ */\r\n\r\n#define SPI_FIFOINTENCLR_TXERR_MASK              (0x1U)\r\n#define SPI_FIFOINTENCLR_TXERR_SHIFT             (0U)\r\n/*! TXERR - TX Error Interrupt Enable\r\n *  0b0..No effect\r\n *  0b1..Clear the TX Error Interrupt Enable bit FIFOINTENSET[TXERR]\r\n */\r\n#define SPI_FIFOINTENCLR_TXERR(x)                (((uint32_t)(((uint32_t)(x)) << SPI_FIFOINTENCLR_TXERR_SHIFT)) & SPI_FIFOINTENCLR_TXERR_MASK)\r\n\r\n#define SPI_FIFOINTENCLR_RXERR_MASK              (0x2U)\r\n#define SPI_FIFOINTENCLR_RXERR_SHIFT             (1U)\r\n/*! RXERR - Receive Error Interrupt Enable\r\n *  0b0..No effect\r\n *  0b1..Clear the Receive Error Interrupt Enable bit FIFOINTENSET[RXERR]\r\n */\r\n#define SPI_FIFOINTENCLR_RXERR(x)                (((uint32_t)(((uint32_t)(x)) << SPI_FIFOINTENCLR_RXERR_SHIFT)) & SPI_FIFOINTENCLR_RXERR_MASK)\r\n\r\n#define SPI_FIFOINTENCLR_TXLVL_MASK              (0x4U)\r\n#define SPI_FIFOINTENCLR_TXLVL_SHIFT             (2U)\r\n/*! TXLVL - Transmit FIFO Level Interrupt Enable\r\n *  0b0..No effect\r\n *  0b1..Clear the Transmit FIFO Level Interrupt Enable bit FIFOINTENSET[TXLVL]\r\n */\r\n#define SPI_FIFOINTENCLR_TXLVL(x)                (((uint32_t)(((uint32_t)(x)) << SPI_FIFOINTENCLR_TXLVL_SHIFT)) & SPI_FIFOINTENCLR_TXLVL_MASK)\r\n\r\n#define SPI_FIFOINTENCLR_RXLVL_MASK              (0x8U)\r\n#define SPI_FIFOINTENCLR_RXLVL_SHIFT             (3U)\r\n/*! RXLVL - Receive FIFO Level Interrupt Enable\r\n *  0b0..No effect\r\n *  0b1..Clear the Receive FIFO Level Interrupt Enable bit FIFOINTENSET[RXLVL]\r\n */\r\n#define SPI_FIFOINTENCLR_RXLVL(x)                (((uint32_t)(((uint32_t)(x)) << SPI_FIFOINTENCLR_RXLVL_SHIFT)) & SPI_FIFOINTENCLR_RXLVL_MASK)\r\n\r\n#define SPI_FIFOINTENCLR_RXTIMEOUT_MASK          (0x1000000U)\r\n#define SPI_FIFOINTENCLR_RXTIMEOUT_SHIFT         (24U)\r\n/*! RXTIMEOUT - Receive Timeout\r\n *  0b0..No effect\r\n *  0b1..Clear the interrupt\r\n */\r\n#define SPI_FIFOINTENCLR_RXTIMEOUT(x)            (((uint32_t)(((uint32_t)(x)) << SPI_FIFOINTENCLR_RXTIMEOUT_SHIFT)) & SPI_FIFOINTENCLR_RXTIMEOUT_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOINTSTAT - FIFO Interrupt Status Register */\r\n/*! @{ */\r\n\r\n#define SPI_FIFOINTSTAT_TXERR_MASK               (0x1U)\r\n#define SPI_FIFOINTSTAT_TXERR_SHIFT              (0U)\r\n/*! TXERR - TX FIFO Error Interrupt Status\r\n *  0b0..Not pending\r\n *  0b1..Pending\r\n */\r\n#define SPI_FIFOINTSTAT_TXERR(x)                 (((uint32_t)(((uint32_t)(x)) << SPI_FIFOINTSTAT_TXERR_SHIFT)) & SPI_FIFOINTSTAT_TXERR_MASK)\r\n\r\n#define SPI_FIFOINTSTAT_RXERR_MASK               (0x2U)\r\n#define SPI_FIFOINTSTAT_RXERR_SHIFT              (1U)\r\n/*! RXERR - RX FIFO Error Interrupt Status\r\n *  0b0..Not pending\r\n *  0b1..Pending\r\n */\r\n#define SPI_FIFOINTSTAT_RXERR(x)                 (((uint32_t)(((uint32_t)(x)) << SPI_FIFOINTSTAT_RXERR_SHIFT)) & SPI_FIFOINTSTAT_RXERR_MASK)\r\n\r\n#define SPI_FIFOINTSTAT_TXLVL_MASK               (0x4U)\r\n#define SPI_FIFOINTSTAT_TXLVL_SHIFT              (2U)\r\n/*! TXLVL - Transmit FIFO Level Interrupt Status\r\n *  0b0..Not pending\r\n *  0b1..Pending\r\n */\r\n#define SPI_FIFOINTSTAT_TXLVL(x)                 (((uint32_t)(((uint32_t)(x)) << SPI_FIFOINTSTAT_TXLVL_SHIFT)) & SPI_FIFOINTSTAT_TXLVL_MASK)\r\n\r\n#define SPI_FIFOINTSTAT_RXLVL_MASK               (0x8U)\r\n#define SPI_FIFOINTSTAT_RXLVL_SHIFT              (3U)\r\n/*! RXLVL - Receive FIFO Level Interrupt Status\r\n *  0b0..Not pending\r\n *  0b1..Pending\r\n */\r\n#define SPI_FIFOINTSTAT_RXLVL(x)                 (((uint32_t)(((uint32_t)(x)) << SPI_FIFOINTSTAT_RXLVL_SHIFT)) & SPI_FIFOINTSTAT_RXLVL_MASK)\r\n\r\n#define SPI_FIFOINTSTAT_PERINT_MASK              (0x10U)\r\n#define SPI_FIFOINTSTAT_PERINT_SHIFT             (4U)\r\n/*! PERINT - Peripheral Interrupt Status\r\n *  0b0..Not pending\r\n *  0b1..Pending\r\n */\r\n#define SPI_FIFOINTSTAT_PERINT(x)                (((uint32_t)(((uint32_t)(x)) << SPI_FIFOINTSTAT_PERINT_SHIFT)) & SPI_FIFOINTSTAT_PERINT_MASK)\r\n\r\n#define SPI_FIFOINTSTAT_RXTIMEOUT_MASK           (0x1000000U)\r\n#define SPI_FIFOINTSTAT_RXTIMEOUT_SHIFT          (24U)\r\n/*! RXTIMEOUT - Receive Timeout Status\r\n *  0b0..Not pending\r\n *  0b1..Pending\r\n */\r\n#define SPI_FIFOINTSTAT_RXTIMEOUT(x)             (((uint32_t)(((uint32_t)(x)) << SPI_FIFOINTSTAT_RXTIMEOUT_SHIFT)) & SPI_FIFOINTSTAT_RXTIMEOUT_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOWR - FIFO Write Data Register */\r\n/*! @{ */\r\n\r\n#define SPI_FIFOWR_TXDATA_MASK                   (0xFFFFU)\r\n#define SPI_FIFOWR_TXDATA_SHIFT                  (0U)\r\n/*! TXDATA - Transmit Data to the FIFO */\r\n#define SPI_FIFOWR_TXDATA(x)                     (((uint32_t)(((uint32_t)(x)) << SPI_FIFOWR_TXDATA_SHIFT)) & SPI_FIFOWR_TXDATA_MASK)\r\n\r\n#define SPI_FIFOWR_TXSSEL0_N_MASK                (0x10000U)\r\n#define SPI_FIFOWR_TXSSEL0_N_SHIFT               (16U)\r\n/*! TXSSEL0_N - Transmit Slave Select 0\r\n *  0b0..SSEL0 is asserted\r\n *  0b1..SSEL0 is not asserted\r\n */\r\n#define SPI_FIFOWR_TXSSEL0_N(x)                  (((uint32_t)(((uint32_t)(x)) << SPI_FIFOWR_TXSSEL0_N_SHIFT)) & SPI_FIFOWR_TXSSEL0_N_MASK)\r\n\r\n#define SPI_FIFOWR_TXSSEL1_N_MASK                (0x20000U)\r\n#define SPI_FIFOWR_TXSSEL1_N_SHIFT               (17U)\r\n/*! TXSSEL1_N - Transmit Slave Select 1\r\n *  0b0..SSEL1 is asserted\r\n *  0b1..SSEL1 is not asserted\r\n */\r\n#define SPI_FIFOWR_TXSSEL1_N(x)                  (((uint32_t)(((uint32_t)(x)) << SPI_FIFOWR_TXSSEL1_N_SHIFT)) & SPI_FIFOWR_TXSSEL1_N_MASK)\r\n\r\n#define SPI_FIFOWR_TXSSEL2_N_MASK                (0x40000U)\r\n#define SPI_FIFOWR_TXSSEL2_N_SHIFT               (18U)\r\n/*! TXSSEL2_N - Transmit Slave Select 2\r\n *  0b0..SSEL2 is asserted\r\n *  0b1..SSEL2 is not asserted\r\n */\r\n#define SPI_FIFOWR_TXSSEL2_N(x)                  (((uint32_t)(((uint32_t)(x)) << SPI_FIFOWR_TXSSEL2_N_SHIFT)) & SPI_FIFOWR_TXSSEL2_N_MASK)\r\n\r\n#define SPI_FIFOWR_TXSSEL3_N_MASK                (0x80000U)\r\n#define SPI_FIFOWR_TXSSEL3_N_SHIFT               (19U)\r\n/*! TXSSEL3_N - Transmit Slave Select 3\r\n *  0b0..SSEL3 is asserted\r\n *  0b1..SSEL3 is not asserted\r\n */\r\n#define SPI_FIFOWR_TXSSEL3_N(x)                  (((uint32_t)(((uint32_t)(x)) << SPI_FIFOWR_TXSSEL3_N_SHIFT)) & SPI_FIFOWR_TXSSEL3_N_MASK)\r\n\r\n#define SPI_FIFOWR_EOT_MASK                      (0x100000U)\r\n#define SPI_FIFOWR_EOT_SHIFT                     (20U)\r\n/*! EOT - End of Transfer\r\n *  0b0..SSEL is not deasserted. This piece of data is not treated as the end of a transfer. SSEL will not be deasserted at the end of this data.\r\n *  0b1..SSEL is deasserted. This piece of data is treated as the end of a transfer. SSEL will be deasserted at the end of this piece of data.\r\n */\r\n#define SPI_FIFOWR_EOT(x)                        (((uint32_t)(((uint32_t)(x)) << SPI_FIFOWR_EOT_SHIFT)) & SPI_FIFOWR_EOT_MASK)\r\n\r\n#define SPI_FIFOWR_EOF_MASK                      (0x200000U)\r\n#define SPI_FIFOWR_EOF_SHIFT                     (21U)\r\n/*! EOF - End of Frame\r\n *  0b0..Data not EOF. This piece of data transmitted is not treated as the end of a frame.\r\n *  0b1..Data EOF. This piece of data is treated as the end of a frame, causing the Frame_delay time to be\r\n *       inserted before subsequent data is transmitted.\r\n */\r\n#define SPI_FIFOWR_EOF(x)                        (((uint32_t)(((uint32_t)(x)) << SPI_FIFOWR_EOF_SHIFT)) & SPI_FIFOWR_EOF_MASK)\r\n\r\n#define SPI_FIFOWR_RXIGNORE_MASK                 (0x400000U)\r\n#define SPI_FIFOWR_RXIGNORE_SHIFT                (22U)\r\n/*! RXIGNORE - Receive Ignore\r\n *  0b0..Read received data. Received data must be read, to allow transmission to proceed. SPI transmit will halt\r\n *       when the receive data FIFO is full. In slave mode, an overrun error will occur if received data is not\r\n *       read before new data is received.\r\n *  0b1..Ignore received data. Received data is ignored, allowing transmission without reading unneeded received\r\n *       data. No receiver flags are generated.\r\n */\r\n#define SPI_FIFOWR_RXIGNORE(x)                   (((uint32_t)(((uint32_t)(x)) << SPI_FIFOWR_RXIGNORE_SHIFT)) & SPI_FIFOWR_RXIGNORE_MASK)\r\n\r\n#define SPI_FIFOWR_TXIGNORE_MASK                 (0x800000U)\r\n#define SPI_FIFOWR_TXIGNORE_SHIFT                (23U)\r\n/*! TXIGNORE - Transmit Ignore\r\n *  0b0..Write transmit data\r\n *  0b1..Ignore transmit data\r\n */\r\n#define SPI_FIFOWR_TXIGNORE(x)                   (((uint32_t)(((uint32_t)(x)) << SPI_FIFOWR_TXIGNORE_SHIFT)) & SPI_FIFOWR_TXIGNORE_MASK)\r\n\r\n#define SPI_FIFOWR_LEN_MASK                      (0xF000000U)\r\n#define SPI_FIFOWR_LEN_SHIFT                     (24U)\r\n/*! LEN - Data Length\r\n *  0b0000..Reserved\r\n *  0b0001..Reserved\r\n *  0b0010..Reserved\r\n *  0b0011..Data transfer is 4 bits in length\r\n *  0b0100..Data transfer is 5 bits in length\r\n *  0b1111..Data transfer is 16 bits in length\r\n */\r\n#define SPI_FIFOWR_LEN(x)                        (((uint32_t)(((uint32_t)(x)) << SPI_FIFOWR_LEN_SHIFT)) & SPI_FIFOWR_LEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFORD - FIFO Read Data Register */\r\n/*! @{ */\r\n\r\n#define SPI_FIFORD_RXDATA_MASK                   (0xFFFFU)\r\n#define SPI_FIFORD_RXDATA_SHIFT                  (0U)\r\n/*! RXDATA - Received Data from the FIFO */\r\n#define SPI_FIFORD_RXDATA(x)                     (((uint32_t)(((uint32_t)(x)) << SPI_FIFORD_RXDATA_SHIFT)) & SPI_FIFORD_RXDATA_MASK)\r\n\r\n#define SPI_FIFORD_RXSSEL0_N_MASK                (0x10000U)\r\n#define SPI_FIFORD_RXSSEL0_N_SHIFT               (16U)\r\n/*! RXSSEL0_N - Slave Select 0 for Receive\r\n *  0b0..Slave Select 0 is active\r\n *  0b1..Slave Select 0 is not active\r\n */\r\n#define SPI_FIFORD_RXSSEL0_N(x)                  (((uint32_t)(((uint32_t)(x)) << SPI_FIFORD_RXSSEL0_N_SHIFT)) & SPI_FIFORD_RXSSEL0_N_MASK)\r\n\r\n#define SPI_FIFORD_RXSSEL1_N_MASK                (0x20000U)\r\n#define SPI_FIFORD_RXSSEL1_N_SHIFT               (17U)\r\n/*! RXSSEL1_N - Slave Select 1 for Receive\r\n *  0b0..Slave Select 1 is active\r\n *  0b1..Slave Select 1 is not active\r\n */\r\n#define SPI_FIFORD_RXSSEL1_N(x)                  (((uint32_t)(((uint32_t)(x)) << SPI_FIFORD_RXSSEL1_N_SHIFT)) & SPI_FIFORD_RXSSEL1_N_MASK)\r\n\r\n#define SPI_FIFORD_RXSSEL2_N_MASK                (0x40000U)\r\n#define SPI_FIFORD_RXSSEL2_N_SHIFT               (18U)\r\n/*! RXSSEL2_N - Slave Select 2 for Receive\r\n *  0b0..Slave Select 2 is active\r\n *  0b1..Slave Select 2 is not active\r\n */\r\n#define SPI_FIFORD_RXSSEL2_N(x)                  (((uint32_t)(((uint32_t)(x)) << SPI_FIFORD_RXSSEL2_N_SHIFT)) & SPI_FIFORD_RXSSEL2_N_MASK)\r\n\r\n#define SPI_FIFORD_RXSSEL3_N_MASK                (0x80000U)\r\n#define SPI_FIFORD_RXSSEL3_N_SHIFT               (19U)\r\n/*! RXSSEL3_N - Slave Select 3 for Receive\r\n *  0b0..Slave Select 3 is active\r\n *  0b1..Slave Select 3 is not active\r\n */\r\n#define SPI_FIFORD_RXSSEL3_N(x)                  (((uint32_t)(((uint32_t)(x)) << SPI_FIFORD_RXSSEL3_N_SHIFT)) & SPI_FIFORD_RXSSEL3_N_MASK)\r\n\r\n#define SPI_FIFORD_SOT_MASK                      (0x100000U)\r\n#define SPI_FIFORD_SOT_SHIFT                     (20U)\r\n/*! SOT - Start of Transfer Flag\r\n *  0b0..This is not the 1st data after the SSELs went from deasserted to asserted\r\n *  0b1..This is the 1st data after the SSELs went from deasserted to asserted (i.e., any previous transfer has\r\n *       ended). This information can be used to identify the 1st piece of data in cases where the transfer length is\r\n *       greater than 16 bits.\r\n */\r\n#define SPI_FIFORD_SOT(x)                        (((uint32_t)(((uint32_t)(x)) << SPI_FIFORD_SOT_SHIFT)) & SPI_FIFORD_SOT_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFORDNOPOP - FIFO Data Read with no FIFO Pop Register */\r\n/*! @{ */\r\n\r\n#define SPI_FIFORDNOPOP_RXDATA_MASK              (0xFFFFU)\r\n#define SPI_FIFORDNOPOP_RXDATA_SHIFT             (0U)\r\n/*! RXDATA - Received Data from the FIFO */\r\n#define SPI_FIFORDNOPOP_RXDATA(x)                (((uint32_t)(((uint32_t)(x)) << SPI_FIFORDNOPOP_RXDATA_SHIFT)) & SPI_FIFORDNOPOP_RXDATA_MASK)\r\n\r\n#define SPI_FIFORDNOPOP_RXSSEL0_N_MASK           (0x10000U)\r\n#define SPI_FIFORDNOPOP_RXSSEL0_N_SHIFT          (16U)\r\n/*! RXSSEL0_N - Slave Select 0 for Receive\r\n *  0b0..Not selected\r\n *  0b1..Selected\r\n */\r\n#define SPI_FIFORDNOPOP_RXSSEL0_N(x)             (((uint32_t)(((uint32_t)(x)) << SPI_FIFORDNOPOP_RXSSEL0_N_SHIFT)) & SPI_FIFORDNOPOP_RXSSEL0_N_MASK)\r\n\r\n#define SPI_FIFORDNOPOP_RXSSEL1_N_MASK           (0x20000U)\r\n#define SPI_FIFORDNOPOP_RXSSEL1_N_SHIFT          (17U)\r\n/*! RXSSEL1_N - Slave Select 1 for Receive\r\n *  0b0..Not selected\r\n *  0b1..Selected\r\n */\r\n#define SPI_FIFORDNOPOP_RXSSEL1_N(x)             (((uint32_t)(((uint32_t)(x)) << SPI_FIFORDNOPOP_RXSSEL1_N_SHIFT)) & SPI_FIFORDNOPOP_RXSSEL1_N_MASK)\r\n\r\n#define SPI_FIFORDNOPOP_RXSSEL2_N_MASK           (0x40000U)\r\n#define SPI_FIFORDNOPOP_RXSSEL2_N_SHIFT          (18U)\r\n/*! RXSSEL2_N - Slave Select 2 for Receive\r\n *  0b0..Not selected\r\n *  0b1..Selected\r\n */\r\n#define SPI_FIFORDNOPOP_RXSSEL2_N(x)             (((uint32_t)(((uint32_t)(x)) << SPI_FIFORDNOPOP_RXSSEL2_N_SHIFT)) & SPI_FIFORDNOPOP_RXSSEL2_N_MASK)\r\n\r\n#define SPI_FIFORDNOPOP_RXSSEL3_N_MASK           (0x80000U)\r\n#define SPI_FIFORDNOPOP_RXSSEL3_N_SHIFT          (19U)\r\n/*! RXSSEL3_N - Slave Select 3 for Receive\r\n *  0b0..Not selected\r\n *  0b1..Selected\r\n */\r\n#define SPI_FIFORDNOPOP_RXSSEL3_N(x)             (((uint32_t)(((uint32_t)(x)) << SPI_FIFORDNOPOP_RXSSEL3_N_SHIFT)) & SPI_FIFORDNOPOP_RXSSEL3_N_MASK)\r\n\r\n#define SPI_FIFORDNOPOP_SOT_MASK                 (0x100000U)\r\n#define SPI_FIFORDNOPOP_SOT_SHIFT                (20U)\r\n/*! SOT - Start of Transfer Flag\r\n *  0b0..Not active\r\n *  0b1..Active\r\n */\r\n#define SPI_FIFORDNOPOP_SOT(x)                   (((uint32_t)(((uint32_t)(x)) << SPI_FIFORDNOPOP_SOT_SHIFT)) & SPI_FIFORDNOPOP_SOT_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOSIZE - FIFO Size Register */\r\n/*! @{ */\r\n\r\n#define SPI_FIFOSIZE_FIFOSIZE_MASK               (0x1FU)\r\n#define SPI_FIFOSIZE_FIFOSIZE_SHIFT              (0U)\r\n/*! FIFOSIZE - FIFO Size */\r\n#define SPI_FIFOSIZE_FIFOSIZE(x)                 (((uint32_t)(((uint32_t)(x)) << SPI_FIFOSIZE_FIFOSIZE_SHIFT)) & SPI_FIFOSIZE_FIFOSIZE_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFORXTIMEOUTCFG - FIFO Receive Timeout Configuration */\r\n/*! @{ */\r\n\r\n#define SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_PRESCALER_MASK (0xFFU)\r\n#define SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_PRESCALER_SHIFT (0U)\r\n/*! RXTIMEOUT_PRESCALER - Receive Timeout Counter Clock Prescaler */\r\n#define SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_PRESCALER(x) (((uint32_t)(((uint32_t)(x)) << SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_PRESCALER_SHIFT)) & SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_PRESCALER_MASK)\r\n\r\n#define SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_VALUE_MASK (0xFFFF00U)\r\n#define SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_VALUE_SHIFT (8U)\r\n/*! RXTIMEOUT_VALUE - Receive Timeout Value */\r\n#define SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_VALUE(x)  (((uint32_t)(((uint32_t)(x)) << SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_VALUE_SHIFT)) & SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_VALUE_MASK)\r\n\r\n#define SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_EN_MASK   (0x1000000U)\r\n#define SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_EN_SHIFT  (24U)\r\n/*! RXTIMEOUT_EN - Receive Timeout Enable\r\n *  0b0..Disable RX FIFO timeout\r\n *  0b1..Enable RX FIFO timeout\r\n */\r\n#define SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_EN(x)     (((uint32_t)(((uint32_t)(x)) << SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_EN_SHIFT)) & SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_EN_MASK)\r\n\r\n#define SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_COW_MASK  (0x2000000U)\r\n#define SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_COW_SHIFT (25U)\r\n/*! RXTIMEOUT_COW - Receive Timeout Continue On Write\r\n *  0b0..RX FIFO timeout counter is reset every time data is transferred from the peripheral into the RX FIFO.\r\n *  0b1..RX FIFO timeout counter is not reset every time data is transferred from the peripheral into the RX FIFO.\r\n */\r\n#define SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_COW(x)    (((uint32_t)(((uint32_t)(x)) << SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_COW_SHIFT)) & SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_COW_MASK)\r\n\r\n#define SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_COE_MASK  (0x4000000U)\r\n#define SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_COE_SHIFT (26U)\r\n/*! RXTIMEOUT_COE - Receive Timeout Continue On Empty\r\n *  0b0..RX FIFO timeout counter is reset when the RX FIFO becomes empty.\r\n *  0b1..RX FIFO timeout counter is not reset when the RX FIFO becomes empty.\r\n */\r\n#define SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_COE(x)    (((uint32_t)(((uint32_t)(x)) << SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_COE_SHIFT)) & SPI_FIFORXTIMEOUTCFG_RXTIMEOUT_COE_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFORXTIMEOUTCNT - FIFO Receive Timeout Counter */\r\n/*! @{ */\r\n\r\n#define SPI_FIFORXTIMEOUTCNT_RXTIMEOUT_CNT_MASK  (0xFFFFU)\r\n#define SPI_FIFORXTIMEOUTCNT_RXTIMEOUT_CNT_SHIFT (0U)\r\n/*! RXTIMEOUT_CNT - Current RX FIFO timeout counter value */\r\n#define SPI_FIFORXTIMEOUTCNT_RXTIMEOUT_CNT(x)    (((uint32_t)(((uint32_t)(x)) << SPI_FIFORXTIMEOUTCNT_RXTIMEOUT_CNT_SHIFT)) & SPI_FIFORXTIMEOUTCNT_RXTIMEOUT_CNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ID - Peripheral Identification Register */\r\n/*! @{ */\r\n\r\n#define SPI_ID_APERTURE_MASK                     (0xFFU)\r\n#define SPI_ID_APERTURE_SHIFT                    (0U)\r\n/*! APERTURE - Aperture */\r\n#define SPI_ID_APERTURE(x)                       (((uint32_t)(((uint32_t)(x)) << SPI_ID_APERTURE_SHIFT)) & SPI_ID_APERTURE_MASK)\r\n\r\n#define SPI_ID_MINOR_REV_MASK                    (0xF00U)\r\n#define SPI_ID_MINOR_REV_SHIFT                   (8U)\r\n/*! MINOR_REV - Minor revision of module implementation */\r\n#define SPI_ID_MINOR_REV(x)                      (((uint32_t)(((uint32_t)(x)) << SPI_ID_MINOR_REV_SHIFT)) & SPI_ID_MINOR_REV_MASK)\r\n\r\n#define SPI_ID_MAJOR_REV_MASK                    (0xF000U)\r\n#define SPI_ID_MAJOR_REV_SHIFT                   (12U)\r\n/*! MAJOR_REV - Major revision of module implementation */\r\n#define SPI_ID_MAJOR_REV(x)                      (((uint32_t)(((uint32_t)(x)) << SPI_ID_MAJOR_REV_SHIFT)) & SPI_ID_MAJOR_REV_MASK)\r\n\r\n#define SPI_ID_ID_MASK                           (0xFFFF0000U)\r\n#define SPI_ID_ID_SHIFT                          (16U)\r\n/*! ID - Module identifier for the selected function */\r\n#define SPI_ID_ID(x)                             (((uint32_t)(((uint32_t)(x)) << SPI_ID_ID_SHIFT)) & SPI_ID_ID_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SPI_Register_Masks */\r\n\r\n\r\n/* SPI - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral SPI0 base address */\r\n  #define SPI0_BASE                                (0x50106000u)\r\n  /** Peripheral SPI0 base address */\r\n  #define SPI0_BASE_NS                             (0x40106000u)\r\n  /** Peripheral SPI0 base pointer */\r\n  #define SPI0                                     ((SPI_Type *)SPI0_BASE)\r\n  /** Peripheral SPI0 base pointer */\r\n  #define SPI0_NS                                  ((SPI_Type *)SPI0_BASE_NS)\r\n  /** Peripheral SPI1 base address */\r\n  #define SPI1_BASE                                (0x50107000u)\r\n  /** Peripheral SPI1 base address */\r\n  #define SPI1_BASE_NS                             (0x40107000u)\r\n  /** Peripheral SPI1 base pointer */\r\n  #define SPI1                                     ((SPI_Type *)SPI1_BASE)\r\n  /** Peripheral SPI1 base pointer */\r\n  #define SPI1_NS                                  ((SPI_Type *)SPI1_BASE_NS)\r\n  /** Peripheral SPI2 base address */\r\n  #define SPI2_BASE                                (0x50108000u)\r\n  /** Peripheral SPI2 base address */\r\n  #define SPI2_BASE_NS                             (0x40108000u)\r\n  /** Peripheral SPI2 base pointer */\r\n  #define SPI2                                     ((SPI_Type *)SPI2_BASE)\r\n  /** Peripheral SPI2 base pointer */\r\n  #define SPI2_NS                                  ((SPI_Type *)SPI2_BASE_NS)\r\n  /** Peripheral SPI3 base address */\r\n  #define SPI3_BASE                                (0x50109000u)\r\n  /** Peripheral SPI3 base address */\r\n  #define SPI3_BASE_NS                             (0x40109000u)\r\n  /** Peripheral SPI3 base pointer */\r\n  #define SPI3                                     ((SPI_Type *)SPI3_BASE)\r\n  /** Peripheral SPI3 base pointer */\r\n  #define SPI3_NS                                  ((SPI_Type *)SPI3_BASE_NS)\r\n  /** Peripheral SPI14 base address */\r\n  #define SPI14_BASE                               (0x50126000u)\r\n  /** Peripheral SPI14 base address */\r\n  #define SPI14_BASE_NS                            (0x40126000u)\r\n  /** Peripheral SPI14 base pointer */\r\n  #define SPI14                                    ((SPI_Type *)SPI14_BASE)\r\n  /** Peripheral SPI14 base pointer */\r\n  #define SPI14_NS                                 ((SPI_Type *)SPI14_BASE_NS)\r\n  /** Array initializer of SPI peripheral base addresses */\r\n  #define SPI_BASE_ADDRS                           { SPI0_BASE, SPI1_BASE, SPI2_BASE, SPI3_BASE, SPI14_BASE }\r\n  /** Array initializer of SPI peripheral base pointers */\r\n  #define SPI_BASE_PTRS                            { SPI0, SPI1, SPI2, SPI3, SPI14 }\r\n  /** Array initializer of SPI peripheral base addresses */\r\n  #define SPI_BASE_ADDRS_NS                        { SPI0_BASE_NS, SPI1_BASE_NS, SPI2_BASE_NS, SPI3_BASE_NS, SPI14_BASE_NS }\r\n  /** Array initializer of SPI peripheral base pointers */\r\n  #define SPI_BASE_PTRS_NS                         { SPI0_NS, SPI1_NS, SPI2_NS, SPI3_NS, SPI14_NS }\r\n#else\r\n  /** Peripheral SPI0 base address */\r\n  #define SPI0_BASE                                (0x40106000u)\r\n  /** Peripheral SPI0 base pointer */\r\n  #define SPI0                                     ((SPI_Type *)SPI0_BASE)\r\n  /** Peripheral SPI1 base address */\r\n  #define SPI1_BASE                                (0x40107000u)\r\n  /** Peripheral SPI1 base pointer */\r\n  #define SPI1                                     ((SPI_Type *)SPI1_BASE)\r\n  /** Peripheral SPI2 base address */\r\n  #define SPI2_BASE                                (0x40108000u)\r\n  /** Peripheral SPI2 base pointer */\r\n  #define SPI2                                     ((SPI_Type *)SPI2_BASE)\r\n  /** Peripheral SPI3 base address */\r\n  #define SPI3_BASE                                (0x40109000u)\r\n  /** Peripheral SPI3 base pointer */\r\n  #define SPI3                                     ((SPI_Type *)SPI3_BASE)\r\n  /** Peripheral SPI14 base address */\r\n  #define SPI14_BASE                               (0x40126000u)\r\n  /** Peripheral SPI14 base pointer */\r\n  #define SPI14                                    ((SPI_Type *)SPI14_BASE)\r\n  /** Array initializer of SPI peripheral base addresses */\r\n  #define SPI_BASE_ADDRS                           { SPI0_BASE, SPI1_BASE, SPI2_BASE, SPI3_BASE, SPI14_BASE }\r\n  /** Array initializer of SPI peripheral base pointers */\r\n  #define SPI_BASE_PTRS                            { SPI0, SPI1, SPI2, SPI3, SPI14 }\r\n#endif\r\n/** Interrupt vectors for the SPI peripheral type */\r\n#define SPI_IRQS                                 { FLEXCOMM0_IRQn, FLEXCOMM1_IRQn, FLEXCOMM2_IRQn, FLEXCOMM3_IRQn, FLEXCOMM14_IRQn }\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SPI_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SYSCTL0 Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SYSCTL0_Peripheral_Access_Layer SYSCTL0 Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** SYSCTL0 - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[16];\r\n  __IO uint32_t AHBMATRIXPRIOR;                    /**< AHB matrix priority, offset: 0x10 */\r\n       uint8_t RESERVED_1[28];\r\n  __IO uint32_t M33NMISRCSEL;                      /**< M33 nmi source selection, offset: 0x30 */\r\n  __IO uint32_t SYSTEM_STICK_CALIB;                /**< system stick calibration, offset: 0x34 */\r\n  __IO uint32_t SYSTEM_NSTICK_CALIB;               /**< system nstick calibration, offset: 0x38 */\r\n       uint8_t RESERVED_2[68];\r\n  __IO uint32_t AUTOCLKGATEOVERRIDE0;              /**< auto clock gating override 0, offset: 0x80 */\r\n  __IO uint32_t AUTOCLKGATEOVERRIDE1;              /**< auto clock gating override 1, offset: 0x84 */\r\n       uint8_t RESERVED_3[904];\r\n  __I  uint32_t USBCLKSTAT;                        /**< USB clock status, offset: 0x410 */\r\n       uint8_t RESERVED_4[876];\r\n  __IO uint32_t HWWAKE;                            /**< offset: 0x780 */\r\n       uint8_t RESERVED_5[1692];\r\n  __IO uint32_t ROM_HIDING_ADDR_OFFSET;            /**< rom_hiding_addr_offset, offset: 0xE20 */\r\n  __IO uint32_t ROM_HIDING_ADDR_OFFSET_DP;         /**< rom_hiding_addr_offset_dp, offset: 0xE24 */\r\n  __IO uint32_t ROM_HIDING_LOCK;                   /**< rom_hiding_lock, offset: 0xE28 */\r\n} SYSCTL0_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SYSCTL0 Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SYSCTL0_Register_Masks SYSCTL0 Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name AHBMATRIXPRIOR - AHB matrix priority */\r\n/*! @{ */\r\n\r\n#define SYSCTL0_AHBMATRIXPRIOR_M0_MASK           (0x3U)\r\n#define SYSCTL0_AHBMATRIXPRIOR_M0_SHIFT          (0U)\r\n/*! M0 - Master 0 Priority. . . 0: 0, 1: 1, 2: 2, 3: 3. (0 Low) */\r\n#define SYSCTL0_AHBMATRIXPRIOR_M0(x)             (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AHBMATRIXPRIOR_M0_SHIFT)) & SYSCTL0_AHBMATRIXPRIOR_M0_MASK)\r\n\r\n#define SYSCTL0_AHBMATRIXPRIOR_M1_MASK           (0xCU)\r\n#define SYSCTL0_AHBMATRIXPRIOR_M1_SHIFT          (2U)\r\n/*! M1 - Master 1 Priority. . . 0: 0, 1: 1, 2: 2, 3: 3. */\r\n#define SYSCTL0_AHBMATRIXPRIOR_M1(x)             (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AHBMATRIXPRIOR_M1_SHIFT)) & SYSCTL0_AHBMATRIXPRIOR_M1_MASK)\r\n\r\n#define SYSCTL0_AHBMATRIXPRIOR_M2_MASK           (0x30U)\r\n#define SYSCTL0_AHBMATRIXPRIOR_M2_SHIFT          (4U)\r\n/*! M2 - Master 2 Priority. . . 0: 0, 1: 1, 2: 2, 3: 3. */\r\n#define SYSCTL0_AHBMATRIXPRIOR_M2(x)             (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AHBMATRIXPRIOR_M2_SHIFT)) & SYSCTL0_AHBMATRIXPRIOR_M2_MASK)\r\n\r\n#define SYSCTL0_AHBMATRIXPRIOR_M3_MASK           (0xC0U)\r\n#define SYSCTL0_AHBMATRIXPRIOR_M3_SHIFT          (6U)\r\n/*! M3 - Master 3 Priority. . . 0: 0, 1: 1, 2: 2, 3: 3. */\r\n#define SYSCTL0_AHBMATRIXPRIOR_M3(x)             (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AHBMATRIXPRIOR_M3_SHIFT)) & SYSCTL0_AHBMATRIXPRIOR_M3_MASK)\r\n\r\n#define SYSCTL0_AHBMATRIXPRIOR_M4_MASK           (0x300U)\r\n#define SYSCTL0_AHBMATRIXPRIOR_M4_SHIFT          (8U)\r\n/*! M4 - Master 4 Priority. . . 0: 0, 1: 1, 2: 2, 3: 3. */\r\n#define SYSCTL0_AHBMATRIXPRIOR_M4(x)             (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AHBMATRIXPRIOR_M4_SHIFT)) & SYSCTL0_AHBMATRIXPRIOR_M4_MASK)\r\n\r\n#define SYSCTL0_AHBMATRIXPRIOR_M5_MASK           (0xC00U)\r\n#define SYSCTL0_AHBMATRIXPRIOR_M5_SHIFT          (10U)\r\n/*! M5 - Master 5 Priority. . . 0: 0, 1: 1, 2: 2, 3: 3. */\r\n#define SYSCTL0_AHBMATRIXPRIOR_M5(x)             (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AHBMATRIXPRIOR_M5_SHIFT)) & SYSCTL0_AHBMATRIXPRIOR_M5_MASK)\r\n\r\n#define SYSCTL0_AHBMATRIXPRIOR_M6_MASK           (0x3000U)\r\n#define SYSCTL0_AHBMATRIXPRIOR_M6_SHIFT          (12U)\r\n/*! M6 - Master 6 Priority. . . 0: 0, 1: 1, 2: 2, 3: 3. */\r\n#define SYSCTL0_AHBMATRIXPRIOR_M6(x)             (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AHBMATRIXPRIOR_M6_SHIFT)) & SYSCTL0_AHBMATRIXPRIOR_M6_MASK)\r\n\r\n#define SYSCTL0_AHBMATRIXPRIOR_M7_MASK           (0xC000U)\r\n#define SYSCTL0_AHBMATRIXPRIOR_M7_SHIFT          (14U)\r\n/*! M7 - Master 7 Priority. . . 0: 0, 1: 1, 2: 2, 3: 3. */\r\n#define SYSCTL0_AHBMATRIXPRIOR_M7(x)             (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AHBMATRIXPRIOR_M7_SHIFT)) & SYSCTL0_AHBMATRIXPRIOR_M7_MASK)\r\n\r\n#define SYSCTL0_AHBMATRIXPRIOR_M8_MASK           (0x30000U)\r\n#define SYSCTL0_AHBMATRIXPRIOR_M8_SHIFT          (16U)\r\n/*! M8 - Master 8 Priority. . . 0: 0, 1: 1, 2: 2, 3: 3. */\r\n#define SYSCTL0_AHBMATRIXPRIOR_M8(x)             (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AHBMATRIXPRIOR_M8_SHIFT)) & SYSCTL0_AHBMATRIXPRIOR_M8_MASK)\r\n\r\n#define SYSCTL0_AHBMATRIXPRIOR_M9_MASK           (0xC0000U)\r\n#define SYSCTL0_AHBMATRIXPRIOR_M9_SHIFT          (18U)\r\n/*! M9 - Master 9 Priority. . . 0: 0, 1: 1, 2: 2, 3: 3. */\r\n#define SYSCTL0_AHBMATRIXPRIOR_M9(x)             (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AHBMATRIXPRIOR_M9_SHIFT)) & SYSCTL0_AHBMATRIXPRIOR_M9_MASK)\r\n\r\n#define SYSCTL0_AHBMATRIXPRIOR_M10_MASK          (0x300000U)\r\n#define SYSCTL0_AHBMATRIXPRIOR_M10_SHIFT         (20U)\r\n/*! M10 - Master 10 Priority. . . 0: 0, 1: 1, 2: 2, 3: 3. */\r\n#define SYSCTL0_AHBMATRIXPRIOR_M10(x)            (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AHBMATRIXPRIOR_M10_SHIFT)) & SYSCTL0_AHBMATRIXPRIOR_M10_MASK)\r\n/*! @} */\r\n\r\n/*! @name M33NMISRCSEL - M33 nmi source selection */\r\n/*! @{ */\r\n\r\n#define SYSCTL0_M33NMISRCSEL_NMISRCSEL_MASK      (0x7FU)\r\n#define SYSCTL0_M33NMISRCSEL_NMISRCSEL_SHIFT     (0U)\r\n/*! NMISRCSEL - Selects one of the M33 interrupt sources as the NMI source. See M33 Interrupt Slot Table for Interrupt Slot Numers. */\r\n#define SYSCTL0_M33NMISRCSEL_NMISRCSEL(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL0_M33NMISRCSEL_NMISRCSEL_SHIFT)) & SYSCTL0_M33NMISRCSEL_NMISRCSEL_MASK)\r\n\r\n#define SYSCTL0_M33NMISRCSEL_NMIEN_MASK          (0x80000000U)\r\n#define SYSCTL0_M33NMISRCSEL_NMIEN_SHIFT         (31U)\r\n/*! NMIEN - NMI interrupt enable\r\n *  0b0..Disable NMI Interrupt\r\n *  0b1..Enable NMI Interrupt.\r\n */\r\n#define SYSCTL0_M33NMISRCSEL_NMIEN(x)            (((uint32_t)(((uint32_t)(x)) << SYSCTL0_M33NMISRCSEL_NMIEN_SHIFT)) & SYSCTL0_M33NMISRCSEL_NMIEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSTEM_STICK_CALIB - system stick calibration */\r\n/*! @{ */\r\n\r\n#define SYSCTL0_SYSTEM_STICK_CALIB_SYSTEM_STICK_CALIB_MASK (0x3FFFFFFU)\r\n#define SYSCTL0_SYSTEM_STICK_CALIB_SYSTEM_STICK_CALIB_SHIFT (0U)\r\n/*! SYSTEM_STICK_CALIB - Selects the system secure tick calibration value of the M33. */\r\n#define SYSCTL0_SYSTEM_STICK_CALIB_SYSTEM_STICK_CALIB(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_SYSTEM_STICK_CALIB_SYSTEM_STICK_CALIB_SHIFT)) & SYSCTL0_SYSTEM_STICK_CALIB_SYSTEM_STICK_CALIB_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSTEM_NSTICK_CALIB - system nstick calibration */\r\n/*! @{ */\r\n\r\n#define SYSCTL0_SYSTEM_NSTICK_CALIB_SYSTEM_NSTICK_CALIB_MASK (0x3FFFFFFU)\r\n#define SYSCTL0_SYSTEM_NSTICK_CALIB_SYSTEM_NSTICK_CALIB_SHIFT (0U)\r\n/*! SYSTEM_NSTICK_CALIB - Selects the system non-secure tick calibration value of the M33. */\r\n#define SYSCTL0_SYSTEM_NSTICK_CALIB_SYSTEM_NSTICK_CALIB(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_SYSTEM_NSTICK_CALIB_SYSTEM_NSTICK_CALIB_SHIFT)) & SYSCTL0_SYSTEM_NSTICK_CALIB_SYSTEM_NSTICK_CALIB_MASK)\r\n/*! @} */\r\n\r\n/*! @name AUTOCLKGATEOVERRIDE0 - auto clock gating override 0 */\r\n/*! @{ */\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE0_AHB2APB0_MASK (0x1U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE0_AHB2APB0_SHIFT (0U)\r\n/*! AHB2APB0 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE0_AHB2APB0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE0_AHB2APB0_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE0_AHB2APB0_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE0_AHB2APB1_MASK (0x2U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE0_AHB2APB1_SHIFT (1U)\r\n/*! AHB2APB1 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE0_AHB2APB1(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE0_AHB2APB1_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE0_AHB2APB1_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE0_CRC_ENGINER_MASK (0x4U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE0_CRC_ENGINER_SHIFT (2U)\r\n/*! CRC_ENGINER - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE0_CRC_ENGINER(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE0_CRC_ENGINER_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE0_CRC_ENGINER_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE0_DMAC0_MASK  (0x10U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE0_DMAC0_SHIFT (4U)\r\n/*! DMAC0 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE0_DMAC0(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE0_DMAC0_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE0_DMAC0_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE0_DMAC1_MASK  (0x20U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE0_DMAC1_SHIFT (5U)\r\n/*! DMAC1 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE0_DMAC1(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE0_DMAC1_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE0_DMAC1_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE0_SYSCTL_REGBANK_MASK (0x8000U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE0_SYSCTL_REGBANK_SHIFT (15U)\r\n/*! SYSCTL_REGBANK - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE0_SYSCTL_REGBANK(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE0_SYSCTL_REGBANK_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE0_SYSCTL_REGBANK_MASK)\r\n/*! @} */\r\n\r\n/*! @name AUTOCLKGATEOVERRIDE1 - auto clock gating override 1 */\r\n/*! @{ */\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF0_MASK (0x1U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF0_SHIFT (0U)\r\n/*! SRAM_IF0 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF0_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF0_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF1_MASK (0x2U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF1_SHIFT (1U)\r\n/*! SRAM_IF1 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF1(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF1_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF1_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF2_MASK (0x4U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF2_SHIFT (2U)\r\n/*! SRAM_IF2 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF2(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF2_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF2_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF3_MASK (0x8U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF3_SHIFT (3U)\r\n/*! SRAM_IF3 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF3(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF3_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF3_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF4_MASK (0x10U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF4_SHIFT (4U)\r\n/*! SRAM_IF4 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF4(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF4_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF4_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF5_MASK (0x20U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF5_SHIFT (5U)\r\n/*! SRAM_IF5 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF5(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF5_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF5_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF6_MASK (0x40U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF6_SHIFT (6U)\r\n/*! SRAM_IF6 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF6(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF6_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF6_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF7_MASK (0x80U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF7_SHIFT (7U)\r\n/*! SRAM_IF7 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF7(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF7_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF7_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF8_MASK (0x100U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF8_SHIFT (8U)\r\n/*! SRAM_IF8 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF8(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF8_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF8_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF9_MASK (0x200U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF9_SHIFT (9U)\r\n/*! SRAM_IF9 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF9(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF9_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF9_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF10_MASK (0x400U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF10_SHIFT (10U)\r\n/*! SRAM_IF10 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF10(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF10_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF10_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF11_MASK (0x800U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF11_SHIFT (11U)\r\n/*! SRAM_IF11 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF11(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF11_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF11_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF12_MASK (0x1000U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF12_SHIFT (12U)\r\n/*! SRAM_IF12 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF12(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF12_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF12_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF13_MASK (0x2000U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF13_SHIFT (13U)\r\n/*! SRAM_IF13 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF13(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF13_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF13_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF14_MASK (0x4000U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF14_SHIFT (14U)\r\n/*! SRAM_IF14 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF14(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF14_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF14_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF15_MASK (0x8000U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF15_SHIFT (15U)\r\n/*! SRAM_IF15 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF15(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF15_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF15_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF16_MASK (0x10000U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF16_SHIFT (16U)\r\n/*! SRAM_IF16 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF16(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF16_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF16_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF17_MASK (0x20000U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF17_SHIFT (17U)\r\n/*! SRAM_IF17 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF17(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF17_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF17_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF18_MASK (0x40000U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF18_SHIFT (18U)\r\n/*! SRAM_IF18 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF18(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF18_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_SRAM_IF18_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_AON_MEM0_MASK (0x40000000U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_AON_MEM0_SHIFT (30U)\r\n/*! AON_MEM0 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_AON_MEM0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_AON_MEM0_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_AON_MEM0_MASK)\r\n\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_AON_MEM1_MASK (0x80000000U)\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_AON_MEM1_SHIFT (31U)\r\n/*! AON_MEM1 - auto clock gating enable\r\n *  0b0..Enable Auto-Clk Gate\r\n *  0b1..Disable Auto-Clk Gate (clocks always running)\r\n */\r\n#define SYSCTL0_AUTOCLKGATEOVERRIDE1_AON_MEM1(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_AUTOCLKGATEOVERRIDE1_AON_MEM1_SHIFT)) & SYSCTL0_AUTOCLKGATEOVERRIDE1_AON_MEM1_MASK)\r\n/*! @} */\r\n\r\n/*! @name USBCLKSTAT - USB clock status */\r\n/*! @{ */\r\n\r\n#define SYSCTL0_USBCLKSTAT_DEV_NEED_CLKST_MASK   (0x1U)\r\n#define SYSCTL0_USBCLKSTAT_DEV_NEED_CLKST_SHIFT  (0U)\r\n/*! DEV_NEED_CLKST - USB0 Device USB0_NEEDCLK signal status:\r\n *  0b0..low\r\n *  0b1..high\r\n */\r\n#define SYSCTL0_USBCLKSTAT_DEV_NEED_CLKST(x)     (((uint32_t)(((uint32_t)(x)) << SYSCTL0_USBCLKSTAT_DEV_NEED_CLKST_SHIFT)) & SYSCTL0_USBCLKSTAT_DEV_NEED_CLKST_MASK)\r\n\r\n#define SYSCTL0_USBCLKSTAT_HOST_NEED_CLKST_MASK  (0x2U)\r\n#define SYSCTL0_USBCLKSTAT_HOST_NEED_CLKST_SHIFT (1U)\r\n/*! HOST_NEED_CLKST - USB0 Device Host USB0_NEEDCLK signal status:\r\n *  0b0..low\r\n *  0b1..high\r\n */\r\n#define SYSCTL0_USBCLKSTAT_HOST_NEED_CLKST(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL0_USBCLKSTAT_HOST_NEED_CLKST_SHIFT)) & SYSCTL0_USBCLKSTAT_HOST_NEED_CLKST_MASK)\r\n/*! @} */\r\n\r\n/*! @name HWWAKE -  */\r\n/*! @{ */\r\n\r\n#define SYSCTL0_HWWAKE_FORCEWAKE_MASK            (0x1U)\r\n#define SYSCTL0_HWWAKE_FORCEWAKE_SHIFT           (0U)\r\n/*! FORCEWAKE - Force peripheral clocking to stay on during deep-sleep mode. When 1, clocking to\r\n *    peripherals is prevented from being shut down when the CPU enters deep-sleep mode. This is\r\n *    intended to allow a coprocessor to continue operating while the main CPU(s) are shut down.\r\n */\r\n#define SYSCTL0_HWWAKE_FORCEWAKE(x)              (((uint32_t)(((uint32_t)(x)) << SYSCTL0_HWWAKE_FORCEWAKE_SHIFT)) & SYSCTL0_HWWAKE_FORCEWAKE_MASK)\r\n\r\n#define SYSCTL0_HWWAKE_FCWAKE_MASK               (0x2U)\r\n#define SYSCTL0_HWWAKE_FCWAKE_SHIFT              (1U)\r\n/*! FCWAKE - Wake for Flexcomm Interfaces. When 1, any Flexcomm Interface FIFO reaching the level\r\n *    specified by its own TXLVL will cause peripheral clocking to wake up temporarily while the\r\n *    related status is asserted.\r\n */\r\n#define SYSCTL0_HWWAKE_FCWAKE(x)                 (((uint32_t)(((uint32_t)(x)) << SYSCTL0_HWWAKE_FCWAKE_SHIFT)) & SYSCTL0_HWWAKE_FCWAKE_MASK)\r\n\r\n#define SYSCTL0_HWWAKE_DMICWAKE_MASK             (0x4U)\r\n#define SYSCTL0_HWWAKE_DMICWAKE_SHIFT            (2U)\r\n/*! DMICWAKE - Wake for Digital Microphone. When 1, the digital microphone input FIFO reaching the\r\n *    level specified by TRIGLVL of either channel will cause peripheral clocking to wake up\r\n *    temporarily while the related status is asserted.\r\n */\r\n#define SYSCTL0_HWWAKE_DMICWAKE(x)               (((uint32_t)(((uint32_t)(x)) << SYSCTL0_HWWAKE_DMICWAKE_SHIFT)) & SYSCTL0_HWWAKE_DMICWAKE_MASK)\r\n\r\n#define SYSCTL0_HWWAKE_DMAC0WAKE_MASK            (0x8U)\r\n#define SYSCTL0_HWWAKE_DMAC0WAKE_SHIFT           (3U)\r\n/*! DMAC0WAKE - Wake for DMAC0. When 1, DMAC0 being busy will cause peripheral clocking to remain\r\n *    running until DMAC0 completes. This is generally used in conjunction with bit 1 and/or 2 in\r\n *    order to prevent peripheral clocking from being shut down as soon as the cause of wake-up is\r\n *    cleared, but before DMAC0 has completed its related activity.\r\n */\r\n#define SYSCTL0_HWWAKE_DMAC0WAKE(x)              (((uint32_t)(((uint32_t)(x)) << SYSCTL0_HWWAKE_DMAC0WAKE_SHIFT)) & SYSCTL0_HWWAKE_DMAC0WAKE_MASK)\r\n\r\n#define SYSCTL0_HWWAKE_DMAC1WAKE_MASK            (0x10U)\r\n#define SYSCTL0_HWWAKE_DMAC1WAKE_SHIFT           (4U)\r\n/*! DMAC1WAKE - Wake for DMAC1. When 1, DMAC1 being busy will cause peripheral clocking to remain\r\n *    running until DMAC1 completes. This is generally used in conjunction with bit 1 and/or 2 in\r\n *    order to prevent peripheral clocking from being shut down as soon as the cause of wake-up is\r\n *    cleared, but before DMAC1 has completed its related activity.\r\n */\r\n#define SYSCTL0_HWWAKE_DMAC1WAKE(x)              (((uint32_t)(((uint32_t)(x)) << SYSCTL0_HWWAKE_DMAC1WAKE_SHIFT)) & SYSCTL0_HWWAKE_DMAC1WAKE_MASK)\r\n/*! @} */\r\n\r\n/*! @name ROM_HIDING_ADDR_OFFSET - rom_hiding_addr_offset */\r\n/*! @{ */\r\n\r\n#define SYSCTL0_ROM_HIDING_ADDR_OFFSET_ROM_HIDING_ADDR_OFFSET_MASK (0xFFFFU)\r\n#define SYSCTL0_ROM_HIDING_ADDR_OFFSET_ROM_HIDING_ADDR_OFFSET_SHIFT (0U)\r\n/*! ROM_HIDING_ADDR_OFFSET - rom_hiding_addr_offset */\r\n#define SYSCTL0_ROM_HIDING_ADDR_OFFSET_ROM_HIDING_ADDR_OFFSET(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_ROM_HIDING_ADDR_OFFSET_ROM_HIDING_ADDR_OFFSET_SHIFT)) & SYSCTL0_ROM_HIDING_ADDR_OFFSET_ROM_HIDING_ADDR_OFFSET_MASK)\r\n/*! @} */\r\n\r\n/*! @name ROM_HIDING_ADDR_OFFSET_DP - rom_hiding_addr_offset_dp */\r\n/*! @{ */\r\n\r\n#define SYSCTL0_ROM_HIDING_ADDR_OFFSET_DP_ROM_HIDING_ADDR_OFFSET_DP_MASK (0xFFFFU)\r\n#define SYSCTL0_ROM_HIDING_ADDR_OFFSET_DP_ROM_HIDING_ADDR_OFFSET_DP_SHIFT (0U)\r\n/*! ROM_HIDING_ADDR_OFFSET_DP - rom_hiding_addr_offset_dp */\r\n#define SYSCTL0_ROM_HIDING_ADDR_OFFSET_DP_ROM_HIDING_ADDR_OFFSET_DP(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_ROM_HIDING_ADDR_OFFSET_DP_ROM_HIDING_ADDR_OFFSET_DP_SHIFT)) & SYSCTL0_ROM_HIDING_ADDR_OFFSET_DP_ROM_HIDING_ADDR_OFFSET_DP_MASK)\r\n/*! @} */\r\n\r\n/*! @name ROM_HIDING_LOCK - rom_hiding_lock */\r\n/*! @{ */\r\n\r\n#define SYSCTL0_ROM_HIDING_LOCK_ROM_HIDING_LOCK_MASK (0xFFFFFFFFU)\r\n#define SYSCTL0_ROM_HIDING_LOCK_ROM_HIDING_LOCK_SHIFT (0U)\r\n/*! ROM_HIDING_LOCK - rom_hiding_addr_offset */\r\n#define SYSCTL0_ROM_HIDING_LOCK_ROM_HIDING_LOCK(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL0_ROM_HIDING_LOCK_ROM_HIDING_LOCK_SHIFT)) & SYSCTL0_ROM_HIDING_LOCK_ROM_HIDING_LOCK_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SYSCTL0_Register_Masks */\r\n\r\n\r\n/* SYSCTL0 - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral SYSCTL0 base address */\r\n  #define SYSCTL0_BASE                             (0x50002000u)\r\n  /** Peripheral SYSCTL0 base address */\r\n  #define SYSCTL0_BASE_NS                          (0x40002000u)\r\n  /** Peripheral SYSCTL0 base pointer */\r\n  #define SYSCTL0                                  ((SYSCTL0_Type *)SYSCTL0_BASE)\r\n  /** Peripheral SYSCTL0 base pointer */\r\n  #define SYSCTL0_NS                               ((SYSCTL0_Type *)SYSCTL0_BASE_NS)\r\n  /** Array initializer of SYSCTL0 peripheral base addresses */\r\n  #define SYSCTL0_BASE_ADDRS                       { SYSCTL0_BASE }\r\n  /** Array initializer of SYSCTL0 peripheral base pointers */\r\n  #define SYSCTL0_BASE_PTRS                        { SYSCTL0 }\r\n  /** Array initializer of SYSCTL0 peripheral base addresses */\r\n  #define SYSCTL0_BASE_ADDRS_NS                    { SYSCTL0_BASE_NS }\r\n  /** Array initializer of SYSCTL0 peripheral base pointers */\r\n  #define SYSCTL0_BASE_PTRS_NS                     { SYSCTL0_NS }\r\n#else\r\n  /** Peripheral SYSCTL0 base address */\r\n  #define SYSCTL0_BASE                             (0x40002000u)\r\n  /** Peripheral SYSCTL0 base pointer */\r\n  #define SYSCTL0                                  ((SYSCTL0_Type *)SYSCTL0_BASE)\r\n  /** Array initializer of SYSCTL0 peripheral base addresses */\r\n  #define SYSCTL0_BASE_ADDRS                       { SYSCTL0_BASE }\r\n  /** Array initializer of SYSCTL0 peripheral base pointers */\r\n  #define SYSCTL0_BASE_PTRS                        { SYSCTL0 }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SYSCTL0_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SYSCTL1 Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SYSCTL1_Peripheral_Access_Layer SYSCTL1 Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** SYSCTL1 - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[16];\r\n  __IO uint32_t MCLKPINDIR;                        /**< mclk direction control, offset: 0x10 */\r\n       uint8_t RESERVED_1[44];\r\n  __IO uint32_t FCCTRLSEL[4];                      /**< flexcomm control selection N, array offset: 0x40, array step: 0x4 */\r\n       uint8_t RESERVED_2[48];\r\n  __IO uint32_t SHAREDCTRLSET[2];                  /**< shared control set N, array offset: 0x80, array step: 0x4 */\r\n       uint8_t RESERVED_3[376];\r\n  __IO uint32_t RXEVPULSEGEN;                      /**< RX Event Pulse Generator, offset: 0x200 */\r\n} SYSCTL1_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SYSCTL1 Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SYSCTL1_Register_Masks SYSCTL1 Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name MCLKPINDIR - mclk direction control */\r\n/*! @{ */\r\n\r\n#define SYSCTL1_MCLKPINDIR_MCLKPINDIR_MASK       (0x1U)\r\n#define SYSCTL1_MCLKPINDIR_MCLKPINDIR_SHIFT      (0U)\r\n/*! MCLKPINDIR - mclk direction control\r\n *  0b0..MCLK is in input direction.\r\n *  0b1..MCLK is in the output direction.\r\n */\r\n#define SYSCTL1_MCLKPINDIR_MCLKPINDIR(x)         (((uint32_t)(((uint32_t)(x)) << SYSCTL1_MCLKPINDIR_MCLKPINDIR_SHIFT)) & SYSCTL1_MCLKPINDIR_MCLKPINDIR_MASK)\r\n/*! @} */\r\n\r\n/*! @name FCCTRLSEL - flexcomm control selection N */\r\n/*! @{ */\r\n\r\n#define SYSCTL1_FCCTRLSEL_SCKINSEL_MASK          (0x3U)\r\n#define SYSCTL1_FCCTRLSEL_SCKINSEL_SHIFT         (0U)\r\n/*! SCKINSEL - SCK IN Select. . .\r\n *  0b00..Original FLEXCOMM I2S signals\r\n *  0b01..Shared Set0 I2S signals.\r\n *  0b10..Shared Set1 I2S signals.\r\n *  0b11..Reserved.\r\n */\r\n#define SYSCTL1_FCCTRLSEL_SCKINSEL(x)            (((uint32_t)(((uint32_t)(x)) << SYSCTL1_FCCTRLSEL_SCKINSEL_SHIFT)) & SYSCTL1_FCCTRLSEL_SCKINSEL_MASK)\r\n\r\n#define SYSCTL1_FCCTRLSEL_WSINSEL_MASK           (0x300U)\r\n#define SYSCTL1_FCCTRLSEL_WSINSEL_SHIFT          (8U)\r\n/*! WSINSEL - WS IN Select. . .\r\n *  0b00..Original FLEXCOMM I2S signals\r\n *  0b01..Shared Set0 I2S signals.\r\n *  0b10..Shared Set1 I2S signals.\r\n *  0b11..Reserved.\r\n */\r\n#define SYSCTL1_FCCTRLSEL_WSINSEL(x)             (((uint32_t)(((uint32_t)(x)) << SYSCTL1_FCCTRLSEL_WSINSEL_SHIFT)) & SYSCTL1_FCCTRLSEL_WSINSEL_MASK)\r\n\r\n#define SYSCTL1_FCCTRLSEL_DATAINSEL_MASK         (0x30000U)\r\n#define SYSCTL1_FCCTRLSEL_DATAINSEL_SHIFT        (16U)\r\n/*! DATAINSEL - DATA IN Select. . .\r\n *  0b00..Original FLEXCOMM I2S signals\r\n *  0b01..Shared Set0 I2S signals.\r\n *  0b10..Shared Set1 I2S signals.\r\n *  0b11..Reserved.\r\n */\r\n#define SYSCTL1_FCCTRLSEL_DATAINSEL(x)           (((uint32_t)(((uint32_t)(x)) << SYSCTL1_FCCTRLSEL_DATAINSEL_SHIFT)) & SYSCTL1_FCCTRLSEL_DATAINSEL_MASK)\r\n\r\n#define SYSCTL1_FCCTRLSEL_DATAOUTSEL_MASK        (0x3000000U)\r\n#define SYSCTL1_FCCTRLSEL_DATAOUTSEL_SHIFT       (24U)\r\n/*! DATAOUTSEL - DATA OUT Select. . .\r\n *  0b00..Original FLEXCOMM I2S signals\r\n *  0b01..Shared Set0 I2S signals.\r\n *  0b10..Shared Set1 I2S signals.\r\n *  0b11..Reserved.\r\n */\r\n#define SYSCTL1_FCCTRLSEL_DATAOUTSEL(x)          (((uint32_t)(((uint32_t)(x)) << SYSCTL1_FCCTRLSEL_DATAOUTSEL_SHIFT)) & SYSCTL1_FCCTRLSEL_DATAOUTSEL_MASK)\r\n/*! @} */\r\n\r\n/* The count of SYSCTL1_FCCTRLSEL */\r\n#define SYSCTL1_FCCTRLSEL_COUNT                  (4U)\r\n\r\n/*! @name SHAREDCTRLSET - shared control set N */\r\n/*! @{ */\r\n\r\n#define SYSCTL1_SHAREDCTRLSET_SHAREDSCKSEL_MASK  (0x7U)\r\n#define SYSCTL1_SHAREDCTRLSET_SHAREDSCKSEL_SHIFT (0U)\r\n/*! SHAREDSCKSEL - Shared SCK Select. . .\r\n *  0b000..FLEXCOMM0\r\n *  0b001..FLEXCOMM1\r\n *  0b010..FLEXCOMM2\r\n *  0b011..FLEXCOMM3\r\n */\r\n#define SYSCTL1_SHAREDCTRLSET_SHAREDSCKSEL(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL1_SHAREDCTRLSET_SHAREDSCKSEL_SHIFT)) & SYSCTL1_SHAREDCTRLSET_SHAREDSCKSEL_MASK)\r\n\r\n#define SYSCTL1_SHAREDCTRLSET_SHAREDWSSEL_MASK   (0x70U)\r\n#define SYSCTL1_SHAREDCTRLSET_SHAREDWSSEL_SHIFT  (4U)\r\n/*! SHAREDWSSEL - Shared WS Select. . .\r\n *  0b000..FLEXCOMM0\r\n *  0b001..FLEXCOMM1\r\n *  0b010..FLEXCOMM2\r\n *  0b011..FLEXCOMM3\r\n */\r\n#define SYSCTL1_SHAREDCTRLSET_SHAREDWSSEL(x)     (((uint32_t)(((uint32_t)(x)) << SYSCTL1_SHAREDCTRLSET_SHAREDWSSEL_SHIFT)) & SYSCTL1_SHAREDCTRLSET_SHAREDWSSEL_MASK)\r\n\r\n#define SYSCTL1_SHAREDCTRLSET_SHAREDDATASEL_MASK (0x700U)\r\n#define SYSCTL1_SHAREDCTRLSET_SHAREDDATASEL_SHIFT (8U)\r\n/*! SHAREDDATASEL - Shared DATA Select. . .\r\n *  0b000..FLEXCOMM0\r\n *  0b001..FLEXCOMM1\r\n *  0b010..FLEXCOMM2\r\n *  0b011..FLEXCOMM3\r\n */\r\n#define SYSCTL1_SHAREDCTRLSET_SHAREDDATASEL(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL1_SHAREDCTRLSET_SHAREDDATASEL_SHIFT)) & SYSCTL1_SHAREDCTRLSET_SHAREDDATASEL_MASK)\r\n\r\n#define SYSCTL1_SHAREDCTRLSET_FC0DATAOUTEN_MASK  (0x10000U)\r\n#define SYSCTL1_SHAREDCTRLSET_FC0DATAOUTEN_SHIFT (16U)\r\n/*! FC0DATAOUTEN - FLEXCOMM0 DATAOUT OUTPUT ENABLE\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define SYSCTL1_SHAREDCTRLSET_FC0DATAOUTEN(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL1_SHAREDCTRLSET_FC0DATAOUTEN_SHIFT)) & SYSCTL1_SHAREDCTRLSET_FC0DATAOUTEN_MASK)\r\n\r\n#define SYSCTL1_SHAREDCTRLSET_FC1DATAOUTEN_MASK  (0x20000U)\r\n#define SYSCTL1_SHAREDCTRLSET_FC1DATAOUTEN_SHIFT (17U)\r\n/*! FC1DATAOUTEN - FLEXCOMM1 DATAOUT OUTPUT ENABLE\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define SYSCTL1_SHAREDCTRLSET_FC1DATAOUTEN(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL1_SHAREDCTRLSET_FC1DATAOUTEN_SHIFT)) & SYSCTL1_SHAREDCTRLSET_FC1DATAOUTEN_MASK)\r\n\r\n#define SYSCTL1_SHAREDCTRLSET_FC2DATAOUTEN_MASK  (0x40000U)\r\n#define SYSCTL1_SHAREDCTRLSET_FC2DATAOUTEN_SHIFT (18U)\r\n/*! FC2DATAOUTEN - FLEXCOMM2 DATAOUT OUTPUT ENABLE\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define SYSCTL1_SHAREDCTRLSET_FC2DATAOUTEN(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL1_SHAREDCTRLSET_FC2DATAOUTEN_SHIFT)) & SYSCTL1_SHAREDCTRLSET_FC2DATAOUTEN_MASK)\r\n\r\n#define SYSCTL1_SHAREDCTRLSET_FC3DATAOUTEN_MASK  (0x80000U)\r\n#define SYSCTL1_SHAREDCTRLSET_FC3DATAOUTEN_SHIFT (19U)\r\n/*! FC3DATAOUTEN - FLEXCOMM3 DATAOUT OUTPUT ENABLE\r\n *  0b0..Input\r\n *  0b1..Output\r\n */\r\n#define SYSCTL1_SHAREDCTRLSET_FC3DATAOUTEN(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL1_SHAREDCTRLSET_FC3DATAOUTEN_SHIFT)) & SYSCTL1_SHAREDCTRLSET_FC3DATAOUTEN_MASK)\r\n/*! @} */\r\n\r\n/* The count of SYSCTL1_SHAREDCTRLSET */\r\n#define SYSCTL1_SHAREDCTRLSET_COUNT              (2U)\r\n\r\n/*! @name RXEVPULSEGEN - RX Event Pulse Generator */\r\n/*! @{ */\r\n\r\n#define SYSCTL1_RXEVPULSEGEN_RXEVPULSEGEN_MASK   (0x1U)\r\n#define SYSCTL1_RXEVPULSEGEN_RXEVPULSEGEN_SHIFT  (0U)\r\n/*! RXEVPULSEGEN - RX Event Pulse Generator. Writing a '1' to this register will create a one PSCLK\r\n *    pulse width of logic '1'. It is automatically cleared.\r\n *  0b0..No effect.\r\n *  0b1..Pulse RXEV High for one PSCLK cycle.\r\n */\r\n#define SYSCTL1_RXEVPULSEGEN_RXEVPULSEGEN(x)     (((uint32_t)(((uint32_t)(x)) << SYSCTL1_RXEVPULSEGEN_RXEVPULSEGEN_SHIFT)) & SYSCTL1_RXEVPULSEGEN_RXEVPULSEGEN_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SYSCTL1_Register_Masks */\r\n\r\n\r\n/* SYSCTL1 - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral SYSCTL1 base address */\r\n  #define SYSCTL1_BASE                             (0x50022000u)\r\n  /** Peripheral SYSCTL1 base address */\r\n  #define SYSCTL1_BASE_NS                          (0x40022000u)\r\n  /** Peripheral SYSCTL1 base pointer */\r\n  #define SYSCTL1                                  ((SYSCTL1_Type *)SYSCTL1_BASE)\r\n  /** Peripheral SYSCTL1 base pointer */\r\n  #define SYSCTL1_NS                               ((SYSCTL1_Type *)SYSCTL1_BASE_NS)\r\n  /** Array initializer of SYSCTL1 peripheral base addresses */\r\n  #define SYSCTL1_BASE_ADDRS                       { SYSCTL1_BASE }\r\n  /** Array initializer of SYSCTL1 peripheral base pointers */\r\n  #define SYSCTL1_BASE_PTRS                        { SYSCTL1 }\r\n  /** Array initializer of SYSCTL1 peripheral base addresses */\r\n  #define SYSCTL1_BASE_ADDRS_NS                    { SYSCTL1_BASE_NS }\r\n  /** Array initializer of SYSCTL1 peripheral base pointers */\r\n  #define SYSCTL1_BASE_PTRS_NS                     { SYSCTL1_NS }\r\n#else\r\n  /** Peripheral SYSCTL1 base address */\r\n  #define SYSCTL1_BASE                             (0x40022000u)\r\n  /** Peripheral SYSCTL1 base pointer */\r\n  #define SYSCTL1                                  ((SYSCTL1_Type *)SYSCTL1_BASE)\r\n  /** Array initializer of SYSCTL1 peripheral base addresses */\r\n  #define SYSCTL1_BASE_ADDRS                       { SYSCTL1_BASE }\r\n  /** Array initializer of SYSCTL1 peripheral base pointers */\r\n  #define SYSCTL1_BASE_PTRS                        { SYSCTL1 }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SYSCTL1_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SYSCTL2 Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SYSCTL2_Peripheral_Access_Layer SYSCTL2 Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** SYSCTL2 - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t RAM_CTRL0;                         /**< RAM Memory Control Register 0, offset: 0x0 */\r\n  __IO uint32_t USB_CTRL;                          /**< USB Control Register, offset: 0x4 */\r\n  __IO uint32_t ANA_GRP_CTRL;                      /**< ANA GRP control register, offset: 0x8 */\r\n  __IO uint32_t AVPLL_CTRL0;                       /**< Audio PLL Control register0, offset: 0xC */\r\n  __IO uint32_t AVPLL_CTRL1;                       /**< Audio PLL Control register1, offset: 0x10 */\r\n  __IO uint32_t AVPLL_CTRL2;                       /**< Audio PLL Control register2, offset: 0x14 */\r\n  __IO uint32_t AVPLL_CTRL3;                       /**< Audio PLL Control register3, offset: 0x18 */\r\n  __IO uint32_t AVPLL_CTRL4;                       /**< Audio PLL Control register4, offset: 0x1C */\r\n  __IO uint32_t AVPLL_CTRL5;                       /**< Audio PLL Control register5, offset: 0x20 */\r\n  __IO uint32_t AVPLL_CTRL6;                       /**< Audio PLL Control register6, offset: 0x24 */\r\n  __I  uint32_t AVPLL_CTRL7;                       /**< Audio PLL Control register7, offset: 0x28 */\r\n  __IO uint32_t AVPLL_CTRL8;                       /**< Audio PLL Control register8, offset: 0x2C */\r\n  __IO uint32_t AVPLL_CTRL9;                       /**< Audio PLL Control register9, offset: 0x30 */\r\n  __IO uint32_t AVPLL_CTRL10;                      /**< Audio PLL Control register10, offset: 0x34 */\r\n  __IO uint32_t AVPLL_CTRL11;                      /**< Audio PLL Control register11, offset: 0x38 */\r\n  __IO uint32_t AVPLL_CTRL12;                      /**< Audio PLL Control register12, offset: 0x3C */\r\n  __IO uint32_t GAU_CTRL;                          /**< GAU Control register, offset: 0x40 */\r\n  __IO uint32_t CTIMER_CTRL;                       /**< CTIMER Control register, offset: 0x44 */\r\n  __IO uint32_t EXT_H2H_CTRL;                      /**< AHB async bridge Control register, offset: 0x48 */\r\n  __IO uint32_t RAM_CTRL1;                         /**< RAM Memory Control Register 1, offset: 0x4C */\r\n  __IO uint32_t ROM_CTRL;                          /**< ROM Control Register, offset: 0x50 */\r\n  __IO uint32_t MEM_PD_CTRL;                       /**< MEM PD Control enable register when PM2 mode, offset: 0x54 */\r\n  __IO uint32_t MEM_PD_CFG;                        /**< MEM PD Configure register when PM2 mode, offset: 0x58 */\r\n  __IO uint32_t ENET_IN_SEL_TIMER;                 /**< Select input source for enet pad0, offset: 0x5C */\r\n  __IO uint32_t ENET_IPG_STOP;                     /**< Configure ipg_stop, used by enet wakeup sequence, offset: 0x60 */\r\n  __I  uint32_t ENET_IPG_STOP_ACK;                 /**< Store ipg_stop_ack, used by enet wakeup sequence, offset: 0x64 */\r\n  __IO uint32_t ROM_BRU_ADDR_MASK_DIS;             /**< Disable dynamic address masking feature, offset: 0x68 */\r\n  __IO uint32_t ROM_BRU_DYN_CLK_DIS;               /**< Disable dynamic clock gating feature, offset: 0x6C */\r\n       uint8_t RESERVED_0[12];\r\n  __I  uint32_t OTP_EARLY_FUSE_VALID;              /**< Early fuse valid from OTP, offset: 0x7C */\r\n  __I  uint32_t OTP_MEDIUM_FUSE_VALID;             /**< Medium fuse valid from OTP, offset: 0x80 */\r\n  __I  uint32_t OTP_ALL_FUSE_VALID;                /**< All fuse valid from OTP, offset: 0x84 */\r\n  __IO uint32_t PLL_CTRL;                          /**< PLL control register, offset: 0x88 */\r\n  __IO uint32_t ANA_PDWN_PM2;                      /**< ana_pdwn control signal when PM2 mode, offset: 0x8C */\r\n  __IO uint32_t SOURCE_CLK_GATE;                   /**< source clock gate control, offset: 0x90 */\r\n  __IO uint32_t TRNG_PWR_MODE;                     /**< TRNG_PWR_MODE, offset: 0x94 */\r\n  __IO uint32_t TRNG_PIN_CTRL;                     /**< TRNG_PIN_CTRL, offset: 0x98 */\r\n  __IO uint32_t CAU_CTRL;                          /**< CAU control register, offset: 0x9C */\r\n  __IO uint32_t SOC_CIU_RDY_MASK;                  /**< SOC_CIU_RDY_MASK, offset: 0xA0 */\r\n  __IO uint32_t LE_AUDIO_TIMER_ENABLE;             /**< Enable bit for le audio timer, offset: 0xA4 */\r\n  __IO uint32_t LE_AUDIO_TIMER_CNT_CLR;            /**< Clear bit of internal counter, offset: 0xA8 */\r\n  __I  uint32_t LE_AUDIO_TIMER_CNT0;               /**< Counter value captured by trigger0, offset: 0xAC */\r\n  __I  uint32_t LE_AUDIO_TIMER_CNT1;               /**< Counter value captured by trigger1, offset: 0xB0 */\r\n  __I  uint32_t LE_AUDIO_TIMER_CNT2;               /**< Counter value captured by trigger2, offset: 0xB4 */\r\n       uint8_t RESERVED_1[8];\r\n  __IO uint32_t AVPLL_CTRL13;                      /**< Audio PLL Control register13, offset: 0xC0 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_STATUS;       /**< CPU Code Bus Access Sram Checker Violation Status, offset: 0xC4 */\r\n  __IO uint32_t MEM_ACC_CHK_CODE_VIO_CLR;          /**< CPU Code Bus Access Sram Checker Violation Status Clear, offset: 0xC8 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_STATUS;        /**< CPU SYS Bus Access Sram Checker Violation Status, offset: 0xCC */\r\n  __IO uint32_t MEM_ACC_CHK_SYS_VIO_CLR;           /**< CPU SYS Bus Access Sram Checker Violation Status Clear, offset: 0xD0 */\r\n       uint8_t RESERVED_2[4];\r\n  __I  uint32_t SOC_MCI_EXTRA;                     /**< Reserved register, offset: 0xD8 */\r\n  __IO uint32_t MCI_SOC_EXTRA;                     /**< Reserved register, offset: 0xDC */\r\n  __IO uint32_t ROM_DYN_CLK_EN;                    /**< To control dynamic clock gating of the rom clock, offset: 0xE0 */\r\n  __IO uint32_t RESERVED_REG1;                     /**< Reserved register, offset: 0xE4 */\r\n  __IO uint32_t RESERVED_REG2;                     /**< Reserved register, offset: 0xE8 */\r\n  __IO uint32_t RESERVED_REG3;                     /**< Reserved register, offset: 0xEC */\r\n  __IO uint32_t RESERVED_REG4;                     /**< Reserved register, offset: 0xF0 */\r\n  __IO uint32_t RESERVED_REG5;                     /**< Reserved register, offset: 0xF4 */\r\n  __IO uint32_t RESERVED_REG6;                     /**< Reserved register, offset: 0xF8 */\r\n  __IO uint32_t RESERVED_REG7;                     /**< Reserved register, offset: 0xFC */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_ADDR0;        /**< CPU CODE Bus Access Sram Checker: Address of Violated Transfer, offset: 0x100 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_MISC0;        /**< CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer, offset: 0x104 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_ADDR1;        /**< CPU CODE Bus Access Sram Checker: Address of Violated Transfer, offset: 0x108 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_MISC1;        /**< CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer, offset: 0x10C */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_ADDR2;        /**< CPU CODE Bus Access Sram Checker: Address of Violated Transfer, offset: 0x110 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_MISC2;        /**< CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer, offset: 0x114 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_ADDR3;        /**< CPU CODE Bus Access Sram Checker: Address of Violated Transfer, offset: 0x118 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_MISC3;        /**< CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer, offset: 0x11C */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_ADDR4;        /**< CPU CODE Bus Access Sram Checker: Address of Violated Transfer, offset: 0x120 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_MISC4;        /**< CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer, offset: 0x124 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_ADDR5;        /**< CPU CODE Bus Access Sram Checker: Address of Violated Transfer, offset: 0x128 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_MISC5;        /**< CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer, offset: 0x12C */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_ADDR6;        /**< CPU CODE Bus Access Sram Checker: Address of Violated Transfer, offset: 0x130 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_MISC6;        /**< CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer, offset: 0x134 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_ADDR7;        /**< CPU CODE Bus Access Sram Checker: Address of Violated Transfer, offset: 0x138 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_MISC7;        /**< CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer, offset: 0x13C */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_ADDR8;        /**< CPU CODE Bus Access Sram Checker: Address of Violated Transfer, offset: 0x140 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_MISC8;        /**< CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer, offset: 0x144 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_ADDR9;        /**< CPU CODE Bus Access Sram Checker: Address of Violated Transfer, offset: 0x148 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_MISC9;        /**< CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer, offset: 0x14C */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_ADDR10;       /**< CPU CODE Bus Access Sram Checker: Address of Violated Transfer, offset: 0x150 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_MISC10;       /**< CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer, offset: 0x154 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_ADDR11;       /**< CPU CODE Bus Access Sram Checker: Address of Violated Transfer, offset: 0x158 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_MISC11;       /**< CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer, offset: 0x15C */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_ADDR12;       /**< CPU CODE Bus Access Sram Checker: Address of Violated Transfer, offset: 0x160 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_MISC12;       /**< CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer, offset: 0x164 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_ADDR13;       /**< CPU CODE Bus Access Sram Checker: Address of Violated Transfer, offset: 0x168 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_MISC13;       /**< CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer, offset: 0x16C */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_ADDR14;       /**< CPU CODE Bus Access Sram Checker: Address of Violated Transfer, offset: 0x170 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_MISC14;       /**< CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer, offset: 0x174 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_ADDR15;       /**< CPU CODE Bus Access Sram Checker: Address of Violated Transfer, offset: 0x178 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_MISC15;       /**< CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer, offset: 0x17C */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_ADDR16;       /**< CPU CODE Bus Access Sram Checker: Address of Violated Transfer, offset: 0x180 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_MISC16;       /**< CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer, offset: 0x184 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_ADDR17;       /**< CPU CODE Bus Access Sram Checker: Address of Violated Transfer, offset: 0x188 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_MISC17;       /**< CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer, offset: 0x18C */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_ADDR18;       /**< CPU CODE Bus Access Sram Checker: Address of Violated Transfer, offset: 0x190 */\r\n  __I  uint32_t MEM_ACC_CHK_CODE_VIO_MISC18;       /**< CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer, offset: 0x194 */\r\n       uint8_t RESERVED_3[104];\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_ADDR0;         /**< CPU SYS Bus Access Sram Checker: Address of Violated Transfer, offset: 0x200 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_MISC0;         /**< CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer, offset: 0x204 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_ADDR1;         /**< CPU SYS Bus Access Sram Checker: Address of Violated Transfer, offset: 0x208 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_MISC1;         /**< CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer, offset: 0x20C */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_ADDR2;         /**< CPU SYS Bus Access Sram Checker: Address of Violated Transfer, offset: 0x210 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_MISC2;         /**< CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer, offset: 0x214 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_ADDR3;         /**< CPU SYS Bus Access Sram Checker: Address of Violated Transfer, offset: 0x218 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_MISC3;         /**< CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer, offset: 0x21C */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_ADDR4;         /**< CPU SYS Bus Access Sram Checker: Address of Violated Transfer, offset: 0x220 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_MISC4;         /**< CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer, offset: 0x224 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_ADDR5;         /**< CPU SYS Bus Access Sram Checker: Address of Violated Transfer, offset: 0x228 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_MISC5;         /**< CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer, offset: 0x22C */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_ADDR6;         /**< CPU SYS Bus Access Sram Checker: Address of Violated Transfer, offset: 0x230 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_MISC6;         /**< CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer, offset: 0x234 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_ADDR7;         /**< CPU SYS Bus Access Sram Checker: Address of Violated Transfer, offset: 0x238 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_MISC7;         /**< CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer, offset: 0x23C */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_ADDR8;         /**< CPU SYS Bus Access Sram Checker: Address of Violated Transfer, offset: 0x240 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_MISC8;         /**< CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer, offset: 0x244 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_ADDR9;         /**< CPU SYS Bus Access Sram Checker: Address of Violated Transfer, offset: 0x248 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_MISC9;         /**< CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer, offset: 0x24C */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_ADDR10;        /**< CPU SYS Bus Access Sram Checker: Address of Violated Transfer, offset: 0x250 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_MISC10;        /**< CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer, offset: 0x254 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_ADDR11;        /**< CPU SYS Bus Access Sram Checker: Address of Violated Transfer, offset: 0x258 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_MISC11;        /**< CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer, offset: 0x25C */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_ADDR12;        /**< CPU SYS Bus Access Sram Checker: Address of Violated Transfer, offset: 0x260 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_MISC12;        /**< CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer, offset: 0x264 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_ADDR13;        /**< CPU SYS Bus Access Sram Checker: Address of Violated Transfer, offset: 0x268 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_MISC13;        /**< CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer, offset: 0x26C */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_ADDR14;        /**< CPU SYS Bus Access Sram Checker: Address of Violated Transfer, offset: 0x270 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_MISC14;        /**< CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer, offset: 0x274 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_ADDR15;        /**< CPU SYS Bus Access Sram Checker: Address of Violated Transfer, offset: 0x278 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_MISC15;        /**< CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer, offset: 0x27C */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_ADDR16;        /**< CPU SYS Bus Access Sram Checker: Address of Violated Transfer, offset: 0x280 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_MISC16;        /**< CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer, offset: 0x284 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_ADDR17;        /**< CPU SYS Bus Access Sram Checker: Address of Violated Transfer, offset: 0x288 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_MISC17;        /**< CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer, offset: 0x28C */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_ADDR18;        /**< CPU SYS Bus Access Sram Checker: Address of Violated Transfer, offset: 0x290 */\r\n  __I  uint32_t MEM_ACC_CHK_SYS_VIO_MISC18;        /**< CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer, offset: 0x294 */\r\n} SYSCTL2_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SYSCTL2 Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SYSCTL2_Register_Masks SYSCTL2 Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name RAM_CTRL0 - RAM Memory Control Register 0 */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_RAM_CTRL0_AON_MEM_RTC1_MASK      (0x3U)\r\n#define SYSCTL2_RAM_CTRL0_AON_MEM_RTC1_SHIFT     (0U)\r\n/*! AON_MEM_RTC1 - aon_mem_rtc1 */\r\n#define SYSCTL2_RAM_CTRL0_AON_MEM_RTC1(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL0_AON_MEM_RTC1_SHIFT)) & SYSCTL2_RAM_CTRL0_AON_MEM_RTC1_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL0_AON_MEM_WTC1_MASK      (0xCU)\r\n#define SYSCTL2_RAM_CTRL0_AON_MEM_WTC1_SHIFT     (2U)\r\n/*! AON_MEM_WTC1 - aon_mem_wtc1 */\r\n#define SYSCTL2_RAM_CTRL0_AON_MEM_WTC1(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL0_AON_MEM_WTC1_SHIFT)) & SYSCTL2_RAM_CTRL0_AON_MEM_WTC1_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL0_AON_MEM_RTC0_MASK      (0x30U)\r\n#define SYSCTL2_RAM_CTRL0_AON_MEM_RTC0_SHIFT     (4U)\r\n/*! AON_MEM_RTC0 - aon_mem_rtc0 */\r\n#define SYSCTL2_RAM_CTRL0_AON_MEM_RTC0(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL0_AON_MEM_RTC0_SHIFT)) & SYSCTL2_RAM_CTRL0_AON_MEM_RTC0_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL0_AON_MEM_WTC0_MASK      (0xC0U)\r\n#define SYSCTL2_RAM_CTRL0_AON_MEM_WTC0_SHIFT     (6U)\r\n/*! AON_MEM_WTC0 - aon_mem_wtc0 */\r\n#define SYSCTL2_RAM_CTRL0_AON_MEM_WTC0(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL0_AON_MEM_WTC0_SHIFT)) & SYSCTL2_RAM_CTRL0_AON_MEM_WTC0_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL0_FLEXSPI_MEM_RTC_MASK   (0x300U)\r\n#define SYSCTL2_RAM_CTRL0_FLEXSPI_MEM_RTC_SHIFT  (8U)\r\n/*! FLEXSPI_MEM_RTC - flexspi_mem_rtc */\r\n#define SYSCTL2_RAM_CTRL0_FLEXSPI_MEM_RTC(x)     (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL0_FLEXSPI_MEM_RTC_SHIFT)) & SYSCTL2_RAM_CTRL0_FLEXSPI_MEM_RTC_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL0_FLEXSPI_MEM_WTC_MASK   (0xC00U)\r\n#define SYSCTL2_RAM_CTRL0_FLEXSPI_MEM_WTC_SHIFT  (10U)\r\n/*! FLEXSPI_MEM_WTC - flexspi_mem_wtc */\r\n#define SYSCTL2_RAM_CTRL0_FLEXSPI_MEM_WTC(x)     (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL0_FLEXSPI_MEM_WTC_SHIFT)) & SYSCTL2_RAM_CTRL0_FLEXSPI_MEM_WTC_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL0_FLEXSPI_CACHE_RTC_MASK (0x3000U)\r\n#define SYSCTL2_RAM_CTRL0_FLEXSPI_CACHE_RTC_SHIFT (12U)\r\n/*! FLEXSPI_CACHE_RTC - flexspi_cache_rtc */\r\n#define SYSCTL2_RAM_CTRL0_FLEXSPI_CACHE_RTC(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL0_FLEXSPI_CACHE_RTC_SHIFT)) & SYSCTL2_RAM_CTRL0_FLEXSPI_CACHE_RTC_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL0_FLEXSPI_CACHE_WTC_MASK (0xC000U)\r\n#define SYSCTL2_RAM_CTRL0_FLEXSPI_CACHE_WTC_SHIFT (14U)\r\n/*! FLEXSPI_CACHE_WTC - flexspi_cache_wtc */\r\n#define SYSCTL2_RAM_CTRL0_FLEXSPI_CACHE_WTC(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL0_FLEXSPI_CACHE_WTC_SHIFT)) & SYSCTL2_RAM_CTRL0_FLEXSPI_CACHE_WTC_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL0_FLEXSPI_CACHE_TAG_RTC_MASK (0x30000U)\r\n#define SYSCTL2_RAM_CTRL0_FLEXSPI_CACHE_TAG_RTC_SHIFT (16U)\r\n/*! FLEXSPI_CACHE_TAG_RTC - flexspi_cache_tag_rtc */\r\n#define SYSCTL2_RAM_CTRL0_FLEXSPI_CACHE_TAG_RTC(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL0_FLEXSPI_CACHE_TAG_RTC_SHIFT)) & SYSCTL2_RAM_CTRL0_FLEXSPI_CACHE_TAG_RTC_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL0_FLEXSPI_CACHE_TAG_WTC_MASK (0xC0000U)\r\n#define SYSCTL2_RAM_CTRL0_FLEXSPI_CACHE_TAG_WTC_SHIFT (18U)\r\n/*! FLEXSPI_CACHE_TAG_WTC - flexspi_cache_tag_wtc */\r\n#define SYSCTL2_RAM_CTRL0_FLEXSPI_CACHE_TAG_WTC(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL0_FLEXSPI_CACHE_TAG_WTC_SHIFT)) & SYSCTL2_RAM_CTRL0_FLEXSPI_CACHE_TAG_WTC_MASK)\r\n/*! @} */\r\n\r\n/*! @name USB_CTRL - USB Control Register */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_USB_CTRL_USB_PU_PLL_MASK         (0x1U)\r\n#define SYSCTL2_USB_CTRL_USB_PU_PLL_SHIFT        (0U)\r\n/*! USB_PU_PLL - USB PU PLL */\r\n#define SYSCTL2_USB_CTRL_USB_PU_PLL(x)           (((uint32_t)(((uint32_t)(x)) << SYSCTL2_USB_CTRL_USB_PU_PLL_SHIFT)) & SYSCTL2_USB_CTRL_USB_PU_PLL_MASK)\r\n\r\n#define SYSCTL2_USB_CTRL_USB_PU_OTG_MASK         (0x2U)\r\n#define SYSCTL2_USB_CTRL_USB_PU_OTG_SHIFT        (1U)\r\n/*! USB_PU_OTG - USB PU OTG */\r\n#define SYSCTL2_USB_CTRL_USB_PU_OTG(x)           (((uint32_t)(((uint32_t)(x)) << SYSCTL2_USB_CTRL_USB_PU_OTG_SHIFT)) & SYSCTL2_USB_CTRL_USB_PU_OTG_MASK)\r\n\r\n#define SYSCTL2_USB_CTRL_USB_PU_MASK             (0x4U)\r\n#define SYSCTL2_USB_CTRL_USB_PU_SHIFT            (2U)\r\n/*! USB_PU - USB PU */\r\n#define SYSCTL2_USB_CTRL_USB_PU(x)               (((uint32_t)(((uint32_t)(x)) << SYSCTL2_USB_CTRL_USB_PU_SHIFT)) & SYSCTL2_USB_CTRL_USB_PU_MASK)\r\n\r\n#define SYSCTL2_USB_CTRL_REG_RX_PDFVSSM_MASK     (0x8U)\r\n#define SYSCTL2_USB_CTRL_REG_RX_PDFVSSM_SHIFT    (3U)\r\n/*! REG_RX_PDFVSSM - reg_rx_pdfvssm */\r\n#define SYSCTL2_USB_CTRL_REG_RX_PDFVSSM(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_USB_CTRL_REG_RX_PDFVSSM_SHIFT)) & SYSCTL2_USB_CTRL_REG_RX_PDFVSSM_MASK)\r\n\r\n#define SYSCTL2_USB_CTRL_REG_RX_PDLVMC_MASK      (0x10U)\r\n#define SYSCTL2_USB_CTRL_REG_RX_PDLVMC_SHIFT     (4U)\r\n/*! REG_RX_PDLVMC - reg_rx_pdlvmc */\r\n#define SYSCTL2_USB_CTRL_REG_RX_PDLVMC(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_USB_CTRL_REG_RX_PDLVMC_SHIFT)) & SYSCTL2_USB_CTRL_REG_RX_PDLVMC_MASK)\r\n\r\n#define SYSCTL2_USB_CTRL_REG_TX_PDFVSSM_MASK     (0x20U)\r\n#define SYSCTL2_USB_CTRL_REG_TX_PDFVSSM_SHIFT    (5U)\r\n/*! REG_TX_PDFVSSM - reg_tx_pdfvssm */\r\n#define SYSCTL2_USB_CTRL_REG_TX_PDFVSSM(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_USB_CTRL_REG_TX_PDFVSSM_SHIFT)) & SYSCTL2_USB_CTRL_REG_TX_PDFVSSM_MASK)\r\n\r\n#define SYSCTL2_USB_CTRL_REG_TX_PDLVMC_MASK      (0x40U)\r\n#define SYSCTL2_USB_CTRL_REG_TX_PDLVMC_SHIFT     (6U)\r\n/*! REG_TX_PDLVMC - reg_tx_pdlvmc */\r\n#define SYSCTL2_USB_CTRL_REG_TX_PDLVMC(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_USB_CTRL_REG_TX_PDLVMC_SHIFT)) & SYSCTL2_USB_CTRL_REG_TX_PDLVMC_MASK)\r\n\r\n#define SYSCTL2_USB_CTRL_REG_RX_BUF_RTC_MASK     (0x180U)\r\n#define SYSCTL2_USB_CTRL_REG_RX_BUF_RTC_SHIFT    (7U)\r\n/*! REG_RX_BUF_RTC - reg_rx_buf_rtc */\r\n#define SYSCTL2_USB_CTRL_REG_RX_BUF_RTC(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_USB_CTRL_REG_RX_BUF_RTC_SHIFT)) & SYSCTL2_USB_CTRL_REG_RX_BUF_RTC_MASK)\r\n\r\n#define SYSCTL2_USB_CTRL_REG_RX_BUF_WTC_MASK     (0x600U)\r\n#define SYSCTL2_USB_CTRL_REG_RX_BUF_WTC_SHIFT    (9U)\r\n/*! REG_RX_BUF_WTC - reg_rx_buf_wtc */\r\n#define SYSCTL2_USB_CTRL_REG_RX_BUF_WTC(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_USB_CTRL_REG_RX_BUF_WTC_SHIFT)) & SYSCTL2_USB_CTRL_REG_RX_BUF_WTC_MASK)\r\n\r\n#define SYSCTL2_USB_CTRL_REG_TX_BUF_RTC_MASK     (0x1800U)\r\n#define SYSCTL2_USB_CTRL_REG_TX_BUF_RTC_SHIFT    (11U)\r\n/*! REG_TX_BUF_RTC - reg_tx_buf_rtc */\r\n#define SYSCTL2_USB_CTRL_REG_TX_BUF_RTC(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_USB_CTRL_REG_TX_BUF_RTC_SHIFT)) & SYSCTL2_USB_CTRL_REG_TX_BUF_RTC_MASK)\r\n\r\n#define SYSCTL2_USB_CTRL_REG_TX_BUF_WTC_MASK     (0x6000U)\r\n#define SYSCTL2_USB_CTRL_REG_TX_BUF_WTC_SHIFT    (13U)\r\n/*! REG_TX_BUF_WTC - reg_tx_buf_wtc */\r\n#define SYSCTL2_USB_CTRL_REG_TX_BUF_WTC(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_USB_CTRL_REG_TX_BUF_WTC_SHIFT)) & SYSCTL2_USB_CTRL_REG_TX_BUF_WTC_MASK)\r\n\r\n#define SYSCTL2_USB_CTRL_USB_RESUME_MASK         (0x8000U)\r\n#define SYSCTL2_USB_CTRL_USB_RESUME_SHIFT        (15U)\r\n/*! USB_RESUME - USB Resume */\r\n#define SYSCTL2_USB_CTRL_USB_RESUME(x)           (((uint32_t)(((uint32_t)(x)) << SYSCTL2_USB_CTRL_USB_RESUME_SHIFT)) & SYSCTL2_USB_CTRL_USB_RESUME_MASK)\r\n\r\n#define SYSCTL2_USB_CTRL_IDDQ_TEST_MASK          (0x10000U)\r\n#define SYSCTL2_USB_CTRL_IDDQ_TEST_SHIFT         (16U)\r\n/*! IDDQ_TEST - iddq Test */\r\n#define SYSCTL2_USB_CTRL_IDDQ_TEST(x)            (((uint32_t)(((uint32_t)(x)) << SYSCTL2_USB_CTRL_IDDQ_TEST_SHIFT)) & SYSCTL2_USB_CTRL_IDDQ_TEST_MASK)\r\n\r\n#define SYSCTL2_USB_CTRL_SOFT_PHY_RESET_MASK     (0x20000U)\r\n#define SYSCTL2_USB_CTRL_SOFT_PHY_RESET_SHIFT    (17U)\r\n/*! SOFT_PHY_RESET - Soft PHY Reset */\r\n#define SYSCTL2_USB_CTRL_SOFT_PHY_RESET(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_USB_CTRL_SOFT_PHY_RESET_SHIFT)) & SYSCTL2_USB_CTRL_SOFT_PHY_RESET_MASK)\r\n\r\n#define SYSCTL2_USB_CTRL_PHY_RESET_SEL_MASK      (0x40000U)\r\n#define SYSCTL2_USB_CTRL_PHY_RESET_SEL_SHIFT     (18U)\r\n/*! PHY_RESET_SEL - PHY Reset Select */\r\n#define SYSCTL2_USB_CTRL_PHY_RESET_SEL(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_USB_CTRL_PHY_RESET_SEL_SHIFT)) & SYSCTL2_USB_CTRL_PHY_RESET_SEL_MASK)\r\n\r\n#define SYSCTL2_USB_CTRL_SOFT_UTMI_SESSEND_MASK  (0x80000U)\r\n#define SYSCTL2_USB_CTRL_SOFT_UTMI_SESSEND_SHIFT (19U)\r\n/*! SOFT_UTMI_SESSEND - Soft UTMI sessend */\r\n#define SYSCTL2_USB_CTRL_SOFT_UTMI_SESSEND(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_USB_CTRL_SOFT_UTMI_SESSEND_SHIFT)) & SYSCTL2_USB_CTRL_SOFT_UTMI_SESSEND_MASK)\r\n\r\n#define SYSCTL2_USB_CTRL_SOFT_UTMI_XVALID_MASK   (0x100000U)\r\n#define SYSCTL2_USB_CTRL_SOFT_UTMI_XVALID_SHIFT  (20U)\r\n/*! SOFT_UTMI_XVALID - Soft UTMI xvalid */\r\n#define SYSCTL2_USB_CTRL_SOFT_UTMI_XVALID(x)     (((uint32_t)(((uint32_t)(x)) << SYSCTL2_USB_CTRL_SOFT_UTMI_XVALID_SHIFT)) & SYSCTL2_USB_CTRL_SOFT_UTMI_XVALID_MASK)\r\n\r\n#define SYSCTL2_USB_CTRL_SOFT_UTMI_IDDIG_MASK    (0x200000U)\r\n#define SYSCTL2_USB_CTRL_SOFT_UTMI_IDDIG_SHIFT   (21U)\r\n/*! SOFT_UTMI_IDDIG - Soft UTMI iddig */\r\n#define SYSCTL2_USB_CTRL_SOFT_UTMI_IDDIG(x)      (((uint32_t)(((uint32_t)(x)) << SYSCTL2_USB_CTRL_SOFT_UTMI_IDDIG_SHIFT)) & SYSCTL2_USB_CTRL_SOFT_UTMI_IDDIG_MASK)\r\n\r\n#define SYSCTL2_USB_CTRL_MAC_CTRL_SEL_MASK       (0x400000U)\r\n#define SYSCTL2_USB_CTRL_MAC_CTRL_SEL_SHIFT      (22U)\r\n/*! MAC_CTRL_SEL - MAC Control Select */\r\n#define SYSCTL2_USB_CTRL_MAC_CTRL_SEL(x)         (((uint32_t)(((uint32_t)(x)) << SYSCTL2_USB_CTRL_MAC_CTRL_SEL_SHIFT)) & SYSCTL2_USB_CTRL_MAC_CTRL_SEL_MASK)\r\n\r\n#define SYSCTL2_USB_CTRL_USB_TX_BITSTUFF_EN_MASK (0x800000U)\r\n#define SYSCTL2_USB_CTRL_USB_TX_BITSTUFF_EN_SHIFT (23U)\r\n/*! USB_TX_BITSTUFF_EN - USM TX BITSTUFF EN */\r\n#define SYSCTL2_USB_CTRL_USB_TX_BITSTUFF_EN(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_USB_CTRL_USB_TX_BITSTUFF_EN_SHIFT)) & SYSCTL2_USB_CTRL_USB_TX_BITSTUFF_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name ANA_GRP_CTRL - ANA GRP control register */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_ANA_GRP_CTRL_ICC_ADJ_MASK        (0x3U)\r\n#define SYSCTL2_ANA_GRP_CTRL_ICC_ADJ_SHIFT       (0U)\r\n/*! ICC_ADJ - ICC_ADJ Current Select */\r\n#define SYSCTL2_ANA_GRP_CTRL_ICC_ADJ(x)          (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ANA_GRP_CTRL_ICC_ADJ_SHIFT)) & SYSCTL2_ANA_GRP_CTRL_ICC_ADJ_MASK)\r\n\r\n#define SYSCTL2_ANA_GRP_CTRL_IPP_ADJ_MASK        (0xCU)\r\n#define SYSCTL2_ANA_GRP_CTRL_IPP_ADJ_SHIFT       (2U)\r\n/*! IPP_ADJ - IPP_ADJ Current Select */\r\n#define SYSCTL2_ANA_GRP_CTRL_IPP_ADJ(x)          (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ANA_GRP_CTRL_IPP_ADJ_SHIFT)) & SYSCTL2_ANA_GRP_CTRL_IPP_ADJ_MASK)\r\n\r\n#define SYSCTL2_ANA_GRP_CTRL_AVDD1815_SEL_MASK   (0x20U)\r\n#define SYSCTL2_ANA_GRP_CTRL_AVDD1815_SEL_SHIFT  (5U)\r\n/*! AVDD1815_SEL - AVDD Select */\r\n#define SYSCTL2_ANA_GRP_CTRL_AVDD1815_SEL(x)     (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ANA_GRP_CTRL_AVDD1815_SEL_SHIFT)) & SYSCTL2_ANA_GRP_CTRL_AVDD1815_SEL_MASK)\r\n\r\n#define SYSCTL2_ANA_GRP_CTRL_TEST_ANA_MASK       (0x3C0U)\r\n#define SYSCTL2_ANA_GRP_CTRL_TEST_ANA_SHIFT      (6U)\r\n/*! TEST_ANA - TEST ANA */\r\n#define SYSCTL2_ANA_GRP_CTRL_TEST_ANA(x)         (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ANA_GRP_CTRL_TEST_ANA_SHIFT)) & SYSCTL2_ANA_GRP_CTRL_TEST_ANA_MASK)\r\n\r\n#define SYSCTL2_ANA_GRP_CTRL_PU_XTL_MASK         (0x400U)\r\n#define SYSCTL2_ANA_GRP_CTRL_PU_XTL_SHIFT        (10U)\r\n/*! PU_XTL - PU_XTL power up . Provide the reference voltage , USB need it */\r\n#define SYSCTL2_ANA_GRP_CTRL_PU_XTL(x)           (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ANA_GRP_CTRL_PU_XTL_SHIFT)) & SYSCTL2_ANA_GRP_CTRL_PU_XTL_MASK)\r\n\r\n#define SYSCTL2_ANA_GRP_CTRL_PU_AG_MASK          (0x1000U)\r\n#define SYSCTL2_ANA_GRP_CTRL_PU_AG_SHIFT         (12U)\r\n/*! PU_AG - Analog Group Power Up.Provide the reference current , AVPLL and USB need it */\r\n#define SYSCTL2_ANA_GRP_CTRL_PU_AG(x)            (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ANA_GRP_CTRL_PU_AG_SHIFT)) & SYSCTL2_ANA_GRP_CTRL_PU_AG_MASK)\r\n/*! @} */\r\n\r\n/*! @name AVPLL_CTRL0 - Audio PLL Control register0 */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_AVPLL_CTRL0_EXT_SPEED_EN_MASK    (0x1U)\r\n#define SYSCTL2_AVPLL_CTRL0_EXT_SPEED_EN_SHIFT   (0U)\r\n/*! EXT_SPEED_EN - EXT_SPEED Enable */\r\n#define SYSCTL2_AVPLL_CTRL0_EXT_SPEED_EN(x)      (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL0_EXT_SPEED_EN_SHIFT)) & SYSCTL2_AVPLL_CTRL0_EXT_SPEED_EN_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL0_EXT_SPEED_MASK       (0x1EU)\r\n#define SYSCTL2_AVPLL_CTRL0_EXT_SPEED_SHIFT      (1U)\r\n/*! EXT_SPEED - External VCO Speed Control for Different VCO Frequencies. */\r\n#define SYSCTL2_AVPLL_CTRL0_EXT_SPEED(x)         (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL0_EXT_SPEED_SHIFT)) & SYSCTL2_AVPLL_CTRL0_EXT_SPEED_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL0_EXT_SP_FBRES_EN_MASK (0x20U)\r\n#define SYSCTL2_AVPLL_CTRL0_EXT_SP_FBRES_EN_SHIFT (5U)\r\n/*! EXT_SP_FBRES_EN - External Speed Enable Pin. */\r\n#define SYSCTL2_AVPLL_CTRL0_EXT_SP_FBRES_EN(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL0_EXT_SP_FBRES_EN_SHIFT)) & SYSCTL2_AVPLL_CTRL0_EXT_SP_FBRES_EN_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL0_EXT_SLLP_DAC_EN_MASK (0x40U)\r\n#define SYSCTL2_AVPLL_CTRL0_EXT_SLLP_DAC_EN_SHIFT (6U)\r\n/*! EXT_SLLP_DAC_EN - EXT_SLLP_DAC Enable */\r\n#define SYSCTL2_AVPLL_CTRL0_EXT_SLLP_DAC_EN(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL0_EXT_SLLP_DAC_EN_SHIFT)) & SYSCTL2_AVPLL_CTRL0_EXT_SLLP_DAC_EN_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL0_EXT_SLLP_DAC_MASK    (0x3F80U)\r\n#define SYSCTL2_AVPLL_CTRL0_EXT_SLLP_DAC_SHIFT   (7U)\r\n/*! EXT_SLLP_DAC - VCON Reference Value Set */\r\n#define SYSCTL2_AVPLL_CTRL0_EXT_SLLP_DAC(x)      (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL0_EXT_SLLP_DAC_SHIFT)) & SYSCTL2_AVPLL_CTRL0_EXT_SLLP_DAC_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL0_EN_LP_C1_MASK        (0xC000U)\r\n#define SYSCTL2_AVPLL_CTRL0_EN_LP_C1_SHIFT       (14U)\r\n/*! EN_LP_C1 - Channel CX LP Enable. */\r\n#define SYSCTL2_AVPLL_CTRL0_EN_LP_C1(x)          (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL0_EN_LP_C1_SHIFT)) & SYSCTL2_AVPLL_CTRL0_EN_LP_C1_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL0_EN_DPLL_C1_MASK      (0x10000U)\r\n#define SYSCTL2_AVPLL_CTRL0_EN_DPLL_C1_SHIFT     (16U)\r\n/*! EN_DPLL_C1 - Enable/ Disable Channel CX¡¯s DPLL */\r\n#define SYSCTL2_AVPLL_CTRL0_EN_DPLL_C1(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL0_EN_DPLL_C1_SHIFT)) & SYSCTL2_AVPLL_CTRL0_EN_DPLL_C1_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL0_DPHER_DLY_SEL_MASK   (0x60000U)\r\n#define SYSCTL2_AVPLL_CTRL0_DPHER_DLY_SEL_SHIFT  (17U)\r\n/*! DPHER_DLY_SEL - DPHERCK Delay Tune */\r\n#define SYSCTL2_AVPLL_CTRL0_DPHER_DLY_SEL(x)     (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL0_DPHER_DLY_SEL_SHIFT)) & SYSCTL2_AVPLL_CTRL0_DPHER_DLY_SEL_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL0_CLKOUT_TST_EN_MASK   (0x80000U)\r\n#define SYSCTL2_AVPLL_CTRL0_CLKOUT_TST_EN_SHIFT  (19U)\r\n/*! CLKOUT_TST_EN - Clock Out Test Output Enable */\r\n#define SYSCTL2_AVPLL_CTRL0_CLKOUT_TST_EN(x)     (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL0_CLKOUT_TST_EN_SHIFT)) & SYSCTL2_AVPLL_CTRL0_CLKOUT_TST_EN_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL0_CLK_DET_EN_MASK      (0x100000U)\r\n#define SYSCTL2_AVPLL_CTRL0_CLK_DET_EN_SHIFT     (20U)\r\n/*! CLK_DET_EN - PI Output Clock Enable for Internal Reset Circuit */\r\n#define SYSCTL2_AVPLL_CTRL0_CLK_DET_EN(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL0_CLK_DET_EN_SHIFT)) & SYSCTL2_AVPLL_CTRL0_CLK_DET_EN_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL0_CAL_FBDIV_MASK       (0x3FE00000U)\r\n#define SYSCTL2_AVPLL_CTRL0_CAL_FBDIV_SHIFT      (21U)\r\n/*! CAL_FBDIV - FBDIV Calibration */\r\n#define SYSCTL2_AVPLL_CTRL0_CAL_FBDIV(x)         (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL0_CAL_FBDIV_SHIFT)) & SYSCTL2_AVPLL_CTRL0_CAL_FBDIV_MASK)\r\n/*! @} */\r\n\r\n/*! @name AVPLL_CTRL1 - Audio PLL Control register1 */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_AVPLL_CTRL1_FREQ_OFFSET_READY_C1_MASK (0x1U)\r\n#define SYSCTL2_AVPLL_CTRL1_FREQ_OFFSET_READY_C1_SHIFT (0U)\r\n/*! FREQ_OFFSET_READY_C1 - Indicate Frequency Offset Value Readiness. */\r\n#define SYSCTL2_AVPLL_CTRL1_FREQ_OFFSET_READY_C1(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL1_FREQ_OFFSET_READY_C1_SHIFT)) & SYSCTL2_AVPLL_CTRL1_FREQ_OFFSET_READY_C1_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL1_FREQ_OFFSET_C1_MASK  (0xFFFFEU)\r\n#define SYSCTL2_AVPLL_CTRL1_FREQ_OFFSET_C1_SHIFT (1U)\r\n/*! FREQ_OFFSET_C1 - FREQ_OFFSET_CX[18:0] Set */\r\n#define SYSCTL2_AVPLL_CTRL1_FREQ_OFFSET_C1(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL1_FREQ_OFFSET_C1_SHIFT)) & SYSCTL2_AVPLL_CTRL1_FREQ_OFFSET_C1_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL1_FBDIV_MASK           (0x1FF00000U)\r\n#define SYSCTL2_AVPLL_CTRL1_FBDIV_SHIFT          (20U)\r\n/*! FBDIV - Feedback Clock Divider Select */\r\n#define SYSCTL2_AVPLL_CTRL1_FBDIV(x)             (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL1_FBDIV_SHIFT)) & SYSCTL2_AVPLL_CTRL1_FBDIV_MASK)\r\n/*! @} */\r\n\r\n/*! @name AVPLL_CTRL2 - Audio PLL Control register2 */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_AVPLL_CTRL2_PW_SLLP_MASK         (0x7U)\r\n#define SYSCTL2_AVPLL_CTRL2_PW_SLLP_SHIFT        (0U)\r\n/*! PW_SLLP - PLL in Slow Loop */\r\n#define SYSCTL2_AVPLL_CTRL2_PW_SLLP(x)           (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL2_PW_SLLP_SHIFT)) & SYSCTL2_AVPLL_CTRL2_PW_SLLP_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL2_PU_OFST_CTRL_C1_MASK (0x8U)\r\n#define SYSCTL2_AVPLL_CTRL2_PU_OFST_CTRL_C1_SHIFT (3U)\r\n/*! PU_OFST_CTRL_C1 - Power Up/Down FREQ_OFFSET Integrator of CX */\r\n#define SYSCTL2_AVPLL_CTRL2_PU_OFST_CTRL_C1(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL2_PU_OFST_CTRL_C1_SHIFT)) & SYSCTL2_AVPLL_CTRL2_PU_OFST_CTRL_C1_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL2_PU_C1_MASK           (0x10U)\r\n#define SYSCTL2_AVPLL_CTRL2_PU_C1_SHIFT          (4U)\r\n/*! PU_C1 - Power Up/Down Channel CX */\r\n#define SYSCTL2_AVPLL_CTRL2_PU_C1(x)             (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL2_PU_C1_SHIFT)) & SYSCTL2_AVPLL_CTRL2_PU_C1_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL2_PU_MASK              (0x20U)\r\n#define SYSCTL2_AVPLL_CTRL2_PU_SHIFT             (5U)\r\n/*! PU - PLL Power-up Signal */\r\n#define SYSCTL2_AVPLL_CTRL2_PU(x)                (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL2_PU_SHIFT)) & SYSCTL2_AVPLL_CTRL2_PU_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL2_POSTDIV_0P5_C1_MASK  (0x40U)\r\n#define SYSCTL2_AVPLL_CTRL2_POSTDIV_0P5_C1_SHIFT (6U)\r\n/*! POSTDIV_0P5_C1 - Audio Clock Divider Program Set */\r\n#define SYSCTL2_AVPLL_CTRL2_POSTDIV_0P5_C1(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL2_POSTDIV_0P5_C1_SHIFT)) & SYSCTL2_AVPLL_CTRL2_POSTDIV_0P5_C1_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL2_PLL_VDDRA_SEL_MASK   (0x380U)\r\n#define SYSCTL2_AVPLL_CTRL2_PLL_VDDRA_SEL_SHIFT  (7U)\r\n/*! PLL_VDDRA_SEL - Gate Voltage Select for VDDBUF */\r\n#define SYSCTL2_AVPLL_CTRL2_PLL_VDDRA_SEL(x)     (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL2_PLL_VDDRA_SEL_SHIFT)) & SYSCTL2_AVPLL_CTRL2_PLL_VDDRA_SEL_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL2_PLL_LPFC2_LESS_MASK  (0x400U)\r\n#define SYSCTL2_AVPLL_CTRL2_PLL_LPFC2_LESS_SHIFT (10U)\r\n/*! PLL_LPFC2_LESS - LPF C2 Capacitor Value Select */\r\n#define SYSCTL2_AVPLL_CTRL2_PLL_LPFC2_LESS(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL2_PLL_LPFC2_LESS_SHIFT)) & SYSCTL2_AVPLL_CTRL2_PLL_LPFC2_LESS_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL2_PLL_CALCLK_DIV_MASK  (0xF800U)\r\n#define SYSCTL2_AVPLL_CTRL2_PLL_CALCLK_DIV_SHIFT (11U)\r\n/*! PLL_CALCLK_DIV - Divider Settings to Generate Calibration Clock. */\r\n#define SYSCTL2_AVPLL_CTRL2_PLL_CALCLK_DIV(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL2_PLL_CALCLK_DIV_SHIFT)) & SYSCTL2_AVPLL_CTRL2_PLL_CALCLK_DIV_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL2_PLL_CAL_START_MASK   (0x10000U)\r\n#define SYSCTL2_AVPLL_CTRL2_PLL_CAL_START_SHIFT  (16U)\r\n/*! PLL_CAL_START - PLL Calibration Start. */\r\n#define SYSCTL2_AVPLL_CTRL2_PLL_CAL_START(x)     (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL2_PLL_CAL_START_SHIFT)) & SYSCTL2_AVPLL_CTRL2_PLL_CAL_START_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL2_MODE_MASK            (0x60000U)\r\n#define SYSCTL2_AVPLL_CTRL2_MODE_SHIFT           (17U)\r\n/*! MODE - Feedback Clock for PLL Select */\r\n#define SYSCTL2_AVPLL_CTRL2_MODE(x)              (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL2_MODE_SHIFT)) & SYSCTL2_AVPLL_CTRL2_MODE_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL2_MASTER_SLAVEB_MASK   (0x80000U)\r\n#define SYSCTL2_AVPLL_CTRL2_MASTER_SLAVEB_SHIFT  (19U)\r\n/*! MASTER_SLAVEB - This signal synchronizes frequencies of the two PLL¡¯s that are being used */\r\n#define SYSCTL2_AVPLL_CTRL2_MASTER_SLAVEB(x)     (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL2_MASTER_SLAVEB_SHIFT)) & SYSCTL2_AVPLL_CTRL2_MASTER_SLAVEB_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL2_INTPR_MASK           (0x700000U)\r\n#define SYSCTL2_AVPLL_CTRL2_INTPR_SHIFT          (20U)\r\n/*! INTPR - PI Rload Resistor Select */\r\n#define SYSCTL2_AVPLL_CTRL2_INTPR(x)             (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL2_INTPR_SHIFT)) & SYSCTL2_AVPLL_CTRL2_INTPR_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL2_INTPI_MASK           (0x7800000U)\r\n#define SYSCTL2_AVPLL_CTRL2_INTPI_SHIFT          (23U)\r\n/*! INTPI - PI Bias Current Select */\r\n#define SYSCTL2_AVPLL_CTRL2_INTPI(x)             (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL2_INTPI_SHIFT)) & SYSCTL2_AVPLL_CTRL2_INTPI_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL2_ICP_MASK             (0x78000000U)\r\n#define SYSCTL2_AVPLL_CTRL2_ICP_SHIFT            (27U)\r\n/*! ICP - Charge Pump Current Control Bits */\r\n#define SYSCTL2_AVPLL_CTRL2_ICP(x)               (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL2_ICP_SHIFT)) & SYSCTL2_AVPLL_CTRL2_ICP_MASK)\r\n/*! @} */\r\n\r\n/*! @name AVPLL_CTRL3 - Audio PLL Control register3 */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_AVPLL_CTRL3_REG_SETTLE_LIMIT_MASK (0xFU)\r\n#define SYSCTL2_AVPLL_CTRL3_REG_SETTLE_LIMIT_SHIFT (0U)\r\n/*! REG_SETTLE_LIMIT - Waiting Time Select Before Calibration Start.. */\r\n#define SYSCTL2_AVPLL_CTRL3_REG_SETTLE_LIMIT(x)  (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL3_REG_SETTLE_LIMIT_SHIFT)) & SYSCTL2_AVPLL_CTRL3_REG_SETTLE_LIMIT_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL3_REG_RING_EXTRA_I_EN_MASK (0x10U)\r\n#define SYSCTL2_AVPLL_CTRL3_REG_RING_EXTRA_I_EN_SHIFT (4U)\r\n/*! REG_RING_EXTRA_I_EN - Extra Current Turn On Select. */\r\n#define SYSCTL2_AVPLL_CTRL3_REG_RING_EXTRA_I_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL3_REG_RING_EXTRA_I_EN_SHIFT)) & SYSCTL2_AVPLL_CTRL3_REG_RING_EXTRA_I_EN_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL3_REFDIV_MASK          (0xFE0U)\r\n#define SYSCTL2_AVPLL_CTRL3_REFDIV_SHIFT         (5U)\r\n/*! REFDIV - Reference Clock Divider Select */\r\n#define SYSCTL2_AVPLL_CTRL3_REFDIV(x)            (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL3_REFDIV_SHIFT)) & SYSCTL2_AVPLL_CTRL3_REFDIV_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL3_P_SYNC1_C1_MASK      (0xFFFFF000U)\r\n#define SYSCTL2_AVPLL_CTRL3_P_SYNC1_C1_SHIFT     (12U)\r\n/*! P_SYNC1_C1 - Set DPLL¡¯s Reference Divider */\r\n#define SYSCTL2_AVPLL_CTRL3_P_SYNC1_C1(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL3_P_SYNC1_C1_SHIFT)) & SYSCTL2_AVPLL_CTRL3_P_SYNC1_C1_MASK)\r\n/*! @} */\r\n\r\n/*! @name AVPLL_CTRL4 - Audio PLL Control register4 */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_AVPLL_CTRL4_SLLP_EN_DIS_MASK     (0x1U)\r\n#define SYSCTL2_AVPLL_CTRL4_SLLP_EN_DIS_SHIFT    (0U)\r\n/*! SLLP_EN_DIS - Slow Loop Select. */\r\n#define SYSCTL2_AVPLL_CTRL4_SLLP_EN_DIS(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL4_SLLP_EN_DIS_SHIFT)) & SYSCTL2_AVPLL_CTRL4_SLLP_EN_DIS_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL4_SLLP_CLK_DIV5EN_MASK (0x2U)\r\n#define SYSCTL2_AVPLL_CTRL4_SLLP_CLK_DIV5EN_SHIFT (1U)\r\n/*! SLLP_CLK_DIV5EN - Slow Loop Clock Enable */\r\n#define SYSCTL2_AVPLL_CTRL4_SLLP_CLK_DIV5EN(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL4_SLLP_CLK_DIV5EN_SHIFT)) & SYSCTL2_AVPLL_CTRL4_SLLP_CLK_DIV5EN_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL4_SEL_VTHVCOCONT_MASK  (0x4U)\r\n#define SYSCTL2_AVPLL_CTRL4_SEL_VTHVCOCONT_SHIFT (2U)\r\n/*! SEL_VTHVCOCONT - Select Threshold Source for Calibrated VDDVCO Voltage */\r\n#define SYSCTL2_AVPLL_CTRL4_SEL_VTHVCOCONT(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL4_SEL_VTHVCOCONT_SHIFT)) & SYSCTL2_AVPLL_CTRL4_SEL_VTHVCOCONT_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL4_RESERVE_PLL_IN_MASK  (0x1F8U)\r\n#define SYSCTL2_AVPLL_CTRL4_RESERVE_PLL_IN_SHIFT (3U)\r\n/*! RESERVE_PLL_IN - Reserved pins */\r\n#define SYSCTL2_AVPLL_CTRL4_RESERVE_PLL_IN(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL4_RESERVE_PLL_IN_SHIFT)) & SYSCTL2_AVPLL_CTRL4_RESERVE_PLL_IN_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL4_RESERVE_IN_C1_MASK   (0x600U)\r\n#define SYSCTL2_AVPLL_CTRL4_RESERVE_IN_C1_SHIFT  (9U)\r\n/*! RESERVE_IN_C1 - Reserved pins */\r\n#define SYSCTL2_AVPLL_CTRL4_RESERVE_IN_C1(x)     (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL4_RESERVE_IN_C1_SHIFT)) & SYSCTL2_AVPLL_CTRL4_RESERVE_IN_C1_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL4_P_SYNC2_C1_MASK      (0x7FFFF800U)\r\n#define SYSCTL2_AVPLL_CTRL4_P_SYNC2_C1_SHIFT     (11U)\r\n/*! P_SYNC2_C1 - Set DPLL¡¯s Feedback Divider */\r\n#define SYSCTL2_AVPLL_CTRL4_P_SYNC2_C1(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL4_P_SYNC2_C1_SHIFT)) & SYSCTL2_AVPLL_CTRL4_P_SYNC2_C1_MASK)\r\n/*! @} */\r\n\r\n/*! @name AVPLL_CTRL5 - Audio PLL Control register5 */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_AVPLL_CTRL5_TEST_MON_MASK        (0x3FU)\r\n#define SYSCTL2_AVPLL_CTRL5_TEST_MON_SHIFT       (0U)\r\n/*! TEST_MON - DC Test Point Register. For Internal Use Only. */\r\n#define SYSCTL2_AVPLL_CTRL5_TEST_MON(x)          (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL5_TEST_MON_SHIFT)) & SYSCTL2_AVPLL_CTRL5_TEST_MON_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL5_SPEED_THRESH_MASK    (0xFC0U)\r\n#define SYSCTL2_AVPLL_CTRL5_SPEED_THRESH_SHIFT   (6U)\r\n/*! SPEED_THRESH - Threshold for VCO Speed Setting Calibration. */\r\n#define SYSCTL2_AVPLL_CTRL5_SPEED_THRESH(x)      (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL5_SPEED_THRESH_SHIFT)) & SYSCTL2_AVPLL_CTRL5_SPEED_THRESH_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL5_SPEED_FBRES_MASK     (0xF000U)\r\n#define SYSCTL2_AVPLL_CTRL5_SPEED_FBRES_SHIFT    (12U)\r\n/*! SPEED_FBRES - External feedback resistor (VCO ring) set up bits */\r\n#define SYSCTL2_AVPLL_CTRL5_SPEED_FBRES(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL5_SPEED_FBRES_SHIFT)) & SYSCTL2_AVPLL_CTRL5_SPEED_FBRES_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL5_SLLP_PSF_LEVEL_MASK  (0x70000U)\r\n#define SYSCTL2_AVPLL_CTRL5_SLLP_PSF_LEVEL_SHIFT (16U)\r\n/*! SLLP_PSF_LEVEL - Slow Loop Current Generate. */\r\n#define SYSCTL2_AVPLL_CTRL5_SLLP_PSF_LEVEL(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL5_SLLP_PSF_LEVEL_SHIFT)) & SYSCTL2_AVPLL_CTRL5_SLLP_PSF_LEVEL_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL5_POSTDIV_C1_MASK      (0xFFF80000U)\r\n#define SYSCTL2_AVPLL_CTRL5_POSTDIV_C1_SHIFT     (19U)\r\n/*! POSTDIV_C1 - Audio Clock Divider Program Set */\r\n#define SYSCTL2_AVPLL_CTRL5_POSTDIV_C1(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL5_POSTDIV_C1_SHIFT)) & SYSCTL2_AVPLL_CTRL5_POSTDIV_C1_MASK)\r\n/*! @} */\r\n\r\n/*! @name AVPLL_CTRL6 - Audio PLL Control register6 */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_AVPLL_CTRL6_VTH_VCO_PTAT_MASK    (0x3U)\r\n#define SYSCTL2_AVPLL_CTRL6_VTH_VCO_PTAT_SHIFT   (0U)\r\n/*! VTH_VCO_PTAT - IPTAT Current to Generate VDDVCO Voltage Select */\r\n#define SYSCTL2_AVPLL_CTRL6_VTH_VCO_PTAT(x)      (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL6_VTH_VCO_PTAT_SHIFT)) & SYSCTL2_AVPLL_CTRL6_VTH_VCO_PTAT_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL6_VTH_VCO_CAL_MASK     (0xCU)\r\n#define SYSCTL2_AVPLL_CTRL6_VTH_VCO_CAL_SHIFT    (2U)\r\n/*! VTH_VCO_CAL - VDDVCO Voltage Threshold Select */\r\n#define SYSCTL2_AVPLL_CTRL6_VTH_VCO_CAL(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL6_VTH_VCO_CAL_SHIFT)) & SYSCTL2_AVPLL_CTRL6_VTH_VCO_CAL_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL6_VDDL_MASK            (0xF0U)\r\n#define SYSCTL2_AVPLL_CTRL6_VDDL_SHIFT           (4U)\r\n/*! VDDL - Internal Regulated VDD Supply Voltage Control */\r\n#define SYSCTL2_AVPLL_CTRL6_VDDL(x)              (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL6_VDDL_SHIFT)) & SYSCTL2_AVPLL_CTRL6_VDDL_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL6_VDDBUF_ADJ_MASK      (0x700U)\r\n#define SYSCTL2_AVPLL_CTRL6_VDDBUF_ADJ_SHIFT     (8U)\r\n/*! VDDBUF_ADJ - VDDVDOFBUF Voltage Level Adjust */\r\n#define SYSCTL2_AVPLL_CTRL6_VDDBUF_ADJ(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL6_VDDBUF_ADJ_SHIFT)) & SYSCTL2_AVPLL_CTRL6_VDDBUF_ADJ_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL6_VDDA23_PUMP_SEL_MASK (0x1800U)\r\n#define SYSCTL2_AVPLL_CTRL6_VDDA23_PUMP_SEL_SHIFT (11U)\r\n/*! VDDA23_PUMP_SEL - VREF0P96_VDDA23 PUMP Select */\r\n#define SYSCTL2_AVPLL_CTRL6_VDDA23_PUMP_SEL(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL6_VDDA23_PUMP_SEL_SHIFT)) & SYSCTL2_AVPLL_CTRL6_VDDA23_PUMP_SEL_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL6_VCON_SEL_MASK        (0x6000U)\r\n#define SYSCTL2_AVPLL_CTRL6_VCON_SEL_SHIFT       (13U)\r\n/*! VCON_SEL - VCON Value Set. */\r\n#define SYSCTL2_AVPLL_CTRL6_VCON_SEL(x)          (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL6_VCON_SEL_SHIFT)) & SYSCTL2_AVPLL_CTRL6_VCON_SEL_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL6_VCO_REF1P45_SEL_MASK (0x18000U)\r\n#define SYSCTL2_AVPLL_CTRL6_VCO_REF1P45_SEL_SHIFT (15U)\r\n/*! VCO_REF1P45_SEL - VREF1P0V_VCO1P45 Value Select. */\r\n#define SYSCTL2_AVPLL_CTRL6_VCO_REF1P45_SEL(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL6_VCO_REF1P45_SEL_SHIFT)) & SYSCTL2_AVPLL_CTRL6_VCO_REF1P45_SEL_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL6_UPDATE_SEL_MASK      (0x20000U)\r\n#define SYSCTL2_AVPLL_CTRL6_UPDATE_SEL_SHIFT     (17U)\r\n/*! UPDATE_SEL - PLL Update Rate Select */\r\n#define SYSCTL2_AVPLL_CTRL6_UPDATE_SEL(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL6_UPDATE_SEL_SHIFT)) & SYSCTL2_AVPLL_CTRL6_UPDATE_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name AVPLL_CTRL7 - Audio PLL Control register7 */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_AVPLL_CTRL7_PLL_LOCK_MASK        (0x1000000U)\r\n#define SYSCTL2_AVPLL_CTRL7_PLL_LOCK_SHIFT       (24U)\r\n/*! PLL_LOCK - Lock Detect Output */\r\n#define SYSCTL2_AVPLL_CTRL7_PLL_LOCK(x)          (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL7_PLL_LOCK_SHIFT)) & SYSCTL2_AVPLL_CTRL7_PLL_LOCK_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL7_PLL_CAL_DONE_MASK    (0x2000000U)\r\n#define SYSCTL2_AVPLL_CTRL7_PLL_CAL_DONE_SHIFT   (25U)\r\n/*! PLL_CAL_DONE - Rising edge to indicate the end of PLL calibration */\r\n#define SYSCTL2_AVPLL_CTRL7_PLL_CAL_DONE(x)      (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL7_PLL_CAL_DONE_SHIFT)) & SYSCTL2_AVPLL_CTRL7_PLL_CAL_DONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name AVPLL_CTRL8 - Audio PLL Control register8 */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_AVPLL_CTRL8_AVPLL_RESET_C8_MASK  (0x1U)\r\n#define SYSCTL2_AVPLL_CTRL8_AVPLL_RESET_C8_SHIFT (0U)\r\n/*! AVPLL_RESET_C8 - C8 SW Reset . Active high */\r\n#define SYSCTL2_AVPLL_CTRL8_AVPLL_RESET_C8(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL8_AVPLL_RESET_C8_SHIFT)) & SYSCTL2_AVPLL_CTRL8_AVPLL_RESET_C8_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL8_AVPLL_RESET_C1_MASK  (0x2U)\r\n#define SYSCTL2_AVPLL_CTRL8_AVPLL_RESET_C1_SHIFT (1U)\r\n/*! AVPLL_RESET_C1 - C1 SW Reset . Active high */\r\n#define SYSCTL2_AVPLL_CTRL8_AVPLL_RESET_C1(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL8_AVPLL_RESET_C1_SHIFT)) & SYSCTL2_AVPLL_CTRL8_AVPLL_RESET_C1_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL8_AVPLL_RESET_MASK     (0x4U)\r\n#define SYSCTL2_AVPLL_CTRL8_AVPLL_RESET_SHIFT    (2U)\r\n/*! AVPLL_RESET - SW Reset . Active high */\r\n#define SYSCTL2_AVPLL_CTRL8_AVPLL_RESET(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL8_AVPLL_RESET_SHIFT)) & SYSCTL2_AVPLL_CTRL8_AVPLL_RESET_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL8_RESERVE_IN_C8_MASK   (0x18U)\r\n#define SYSCTL2_AVPLL_CTRL8_RESERVE_IN_C8_SHIFT  (3U)\r\n/*! RESERVE_IN_C8 - Reserved pins */\r\n#define SYSCTL2_AVPLL_CTRL8_RESERVE_IN_C8(x)     (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL8_RESERVE_IN_C8_SHIFT)) & SYSCTL2_AVPLL_CTRL8_RESERVE_IN_C8_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL8_PU_OFST_CTRL_C8_MASK (0x20U)\r\n#define SYSCTL2_AVPLL_CTRL8_PU_OFST_CTRL_C8_SHIFT (5U)\r\n/*! PU_OFST_CTRL_C8 - Power Up/Down FREQ_OFFSET Integrator of CX */\r\n#define SYSCTL2_AVPLL_CTRL8_PU_OFST_CTRL_C8(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL8_PU_OFST_CTRL_C8_SHIFT)) & SYSCTL2_AVPLL_CTRL8_PU_OFST_CTRL_C8_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL8_FREQ_OFFSET_READY_C8_MASK (0x40U)\r\n#define SYSCTL2_AVPLL_CTRL8_FREQ_OFFSET_READY_C8_SHIFT (6U)\r\n/*! FREQ_OFFSET_READY_C8 - Indicate Frequency Offset Value Readiness. */\r\n#define SYSCTL2_AVPLL_CTRL8_FREQ_OFFSET_READY_C8(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL8_FREQ_OFFSET_READY_C8_SHIFT)) & SYSCTL2_AVPLL_CTRL8_FREQ_OFFSET_READY_C8_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL8_FREQ_OFFSET_C8_MASK  (0x3FFFF80U)\r\n#define SYSCTL2_AVPLL_CTRL8_FREQ_OFFSET_C8_SHIFT (7U)\r\n/*! FREQ_OFFSET_C8 - FREQ_OFFSET_CX[18:0] Set */\r\n#define SYSCTL2_AVPLL_CTRL8_FREQ_OFFSET_C8(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL8_FREQ_OFFSET_C8_SHIFT)) & SYSCTL2_AVPLL_CTRL8_FREQ_OFFSET_C8_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL8_EN_LP_C8_MASK        (0xC000000U)\r\n#define SYSCTL2_AVPLL_CTRL8_EN_LP_C8_SHIFT       (26U)\r\n/*! EN_LP_C8 - Channel CX LP Enable. */\r\n#define SYSCTL2_AVPLL_CTRL8_EN_LP_C8(x)          (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL8_EN_LP_C8_SHIFT)) & SYSCTL2_AVPLL_CTRL8_EN_LP_C8_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL8_EN_DPLL_C8_MASK      (0x10000000U)\r\n#define SYSCTL2_AVPLL_CTRL8_EN_DPLL_C8_SHIFT     (28U)\r\n/*! EN_DPLL_C8 - Enable/ Disable Channel CX¡¯s DPLL */\r\n#define SYSCTL2_AVPLL_CTRL8_EN_DPLL_C8(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL8_EN_DPLL_C8_SHIFT)) & SYSCTL2_AVPLL_CTRL8_EN_DPLL_C8_MASK)\r\n/*! @} */\r\n\r\n/*! @name AVPLL_CTRL9 - Audio PLL Control register9 */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_AVPLL_CTRL9_P_SYNC1_C8_MASK      (0xFFFFFU)\r\n#define SYSCTL2_AVPLL_CTRL9_P_SYNC1_C8_SHIFT     (0U)\r\n/*! P_SYNC1_C8 - Set DPLL¡¯s Reference Divider */\r\n#define SYSCTL2_AVPLL_CTRL9_P_SYNC1_C8(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL9_P_SYNC1_C8_SHIFT)) & SYSCTL2_AVPLL_CTRL9_P_SYNC1_C8_MASK)\r\n/*! @} */\r\n\r\n/*! @name AVPLL_CTRL10 - Audio PLL Control register10 */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_AVPLL_CTRL10_P_SYNC2_C8_MASK     (0xFFFFFU)\r\n#define SYSCTL2_AVPLL_CTRL10_P_SYNC2_C8_SHIFT    (0U)\r\n/*! P_SYNC2_C8 - Set DPLL¡¯s Feedback Divider */\r\n#define SYSCTL2_AVPLL_CTRL10_P_SYNC2_C8(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL10_P_SYNC2_C8_SHIFT)) & SYSCTL2_AVPLL_CTRL10_P_SYNC2_C8_MASK)\r\n/*! @} */\r\n\r\n/*! @name AVPLL_CTRL11 - Audio PLL Control register11 */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_AVPLL_CTRL11_FREQ_OFFSET_C2_MASK (0x7FFFFU)\r\n#define SYSCTL2_AVPLL_CTRL11_FREQ_OFFSET_C2_SHIFT (0U)\r\n/*! FREQ_OFFSET_C2 - FREQ_OFFSET_CX[18:0] Set */\r\n#define SYSCTL2_AVPLL_CTRL11_FREQ_OFFSET_C2(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL11_FREQ_OFFSET_C2_SHIFT)) & SYSCTL2_AVPLL_CTRL11_FREQ_OFFSET_C2_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL11_POSTDIV_C2_MASK     (0xFFF80000U)\r\n#define SYSCTL2_AVPLL_CTRL11_POSTDIV_C2_SHIFT    (19U)\r\n/*! POSTDIV_C2 - Audio Clock Divider Program Set */\r\n#define SYSCTL2_AVPLL_CTRL11_POSTDIV_C2(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL11_POSTDIV_C2_SHIFT)) & SYSCTL2_AVPLL_CTRL11_POSTDIV_C2_MASK)\r\n/*! @} */\r\n\r\n/*! @name AVPLL_CTRL12 - Audio PLL Control register12 */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_AVPLL_CTRL12_P_SYNC1_C2_MASK     (0xFFFFFU)\r\n#define SYSCTL2_AVPLL_CTRL12_P_SYNC1_C2_SHIFT    (0U)\r\n/*! P_SYNC1_C2 - Set DPLL¡¯s Reference Divider */\r\n#define SYSCTL2_AVPLL_CTRL12_P_SYNC1_C2(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL12_P_SYNC1_C2_SHIFT)) & SYSCTL2_AVPLL_CTRL12_P_SYNC1_C2_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL12_EN_LP_C2_MASK       (0x300000U)\r\n#define SYSCTL2_AVPLL_CTRL12_EN_LP_C2_SHIFT      (20U)\r\n/*! EN_LP_C2 - Channel CX LP Enable. */\r\n#define SYSCTL2_AVPLL_CTRL12_EN_LP_C2(x)         (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL12_EN_LP_C2_SHIFT)) & SYSCTL2_AVPLL_CTRL12_EN_LP_C2_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL12_EN_DPLL_C2_MASK     (0x400000U)\r\n#define SYSCTL2_AVPLL_CTRL12_EN_DPLL_C2_SHIFT    (22U)\r\n/*! EN_DPLL_C2 - Enable/ Disable Channel CX¡¯s DPLL */\r\n#define SYSCTL2_AVPLL_CTRL12_EN_DPLL_C2(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL12_EN_DPLL_C2_SHIFT)) & SYSCTL2_AVPLL_CTRL12_EN_DPLL_C2_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL12_PU_OFST_CTRL_C2_MASK (0x800000U)\r\n#define SYSCTL2_AVPLL_CTRL12_PU_OFST_CTRL_C2_SHIFT (23U)\r\n/*! PU_OFST_CTRL_C2 - Power Up/Down FREQ_OFFSET Integrator of CX */\r\n#define SYSCTL2_AVPLL_CTRL12_PU_OFST_CTRL_C2(x)  (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL12_PU_OFST_CTRL_C2_SHIFT)) & SYSCTL2_AVPLL_CTRL12_PU_OFST_CTRL_C2_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL12_PU_C2_MASK          (0x1000000U)\r\n#define SYSCTL2_AVPLL_CTRL12_PU_C2_SHIFT         (24U)\r\n/*! PU_C2 - Power Up/Down Channel CX */\r\n#define SYSCTL2_AVPLL_CTRL12_PU_C2(x)            (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL12_PU_C2_SHIFT)) & SYSCTL2_AVPLL_CTRL12_PU_C2_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL12_POSTDIV_0P5_C2_MASK (0x2000000U)\r\n#define SYSCTL2_AVPLL_CTRL12_POSTDIV_0P5_C2_SHIFT (25U)\r\n/*! POSTDIV_0P5_C2 - Audio Clock Divider Program Set */\r\n#define SYSCTL2_AVPLL_CTRL12_POSTDIV_0P5_C2(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL12_POSTDIV_0P5_C2_SHIFT)) & SYSCTL2_AVPLL_CTRL12_POSTDIV_0P5_C2_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL12_FREQ_OFFSET_READY_C2_MASK (0x4000000U)\r\n#define SYSCTL2_AVPLL_CTRL12_FREQ_OFFSET_READY_C2_SHIFT (26U)\r\n/*! FREQ_OFFSET_READY_C2 - Indicate Frequency Offset Value Readiness. */\r\n#define SYSCTL2_AVPLL_CTRL12_FREQ_OFFSET_READY_C2(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL12_FREQ_OFFSET_READY_C2_SHIFT)) & SYSCTL2_AVPLL_CTRL12_FREQ_OFFSET_READY_C2_MASK)\r\n/*! @} */\r\n\r\n/*! @name GAU_CTRL - GAU Control register */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_GAU_CTRL_GAU_GPDAC_MCLK_EN_MASK  (0x1U)\r\n#define SYSCTL2_GAU_CTRL_GAU_GPDAC_MCLK_EN_SHIFT (0U)\r\n/*! GAU_GPDAC_MCLK_EN - gau gpdac mclk enable */\r\n#define SYSCTL2_GAU_CTRL_GAU_GPDAC_MCLK_EN(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_GAU_CTRL_GAU_GPDAC_MCLK_EN_SHIFT)) & SYSCTL2_GAU_CTRL_GAU_GPDAC_MCLK_EN_MASK)\r\n\r\n#define SYSCTL2_GAU_CTRL_GAU_BG_MCLK_EN_MASK     (0x2U)\r\n#define SYSCTL2_GAU_CTRL_GAU_BG_MCLK_EN_SHIFT    (1U)\r\n/*! GAU_BG_MCLK_EN - gau bg mclk enable */\r\n#define SYSCTL2_GAU_CTRL_GAU_BG_MCLK_EN(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_GAU_CTRL_GAU_BG_MCLK_EN_SHIFT)) & SYSCTL2_GAU_CTRL_GAU_BG_MCLK_EN_MASK)\r\n\r\n#define SYSCTL2_GAU_CTRL_GAU_GPADC1_MCLK_EN_MASK (0x4U)\r\n#define SYSCTL2_GAU_CTRL_GAU_GPADC1_MCLK_EN_SHIFT (2U)\r\n/*! GAU_GPADC1_MCLK_EN - gau gpadc1 mclk enable */\r\n#define SYSCTL2_GAU_CTRL_GAU_GPADC1_MCLK_EN(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_GAU_CTRL_GAU_GPADC1_MCLK_EN_SHIFT)) & SYSCTL2_GAU_CTRL_GAU_GPADC1_MCLK_EN_MASK)\r\n\r\n#define SYSCTL2_GAU_CTRL_GAU_GPADC0_MCLK_EN_MASK (0x8U)\r\n#define SYSCTL2_GAU_CTRL_GAU_GPADC0_MCLK_EN_SHIFT (3U)\r\n/*! GAU_GPADC0_MCLK_EN - gau gpadc0 mclk enable */\r\n#define SYSCTL2_GAU_CTRL_GAU_GPADC0_MCLK_EN(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_GAU_CTRL_GAU_GPADC0_MCLK_EN_SHIFT)) & SYSCTL2_GAU_CTRL_GAU_GPADC0_MCLK_EN_MASK)\r\n\r\n#define SYSCTL2_GAU_CTRL_GAU_ACOMP_MCLK_EN_MASK  (0x10U)\r\n#define SYSCTL2_GAU_CTRL_GAU_ACOMP_MCLK_EN_SHIFT (4U)\r\n/*! GAU_ACOMP_MCLK_EN - gau acomp mclk enable */\r\n#define SYSCTL2_GAU_CTRL_GAU_ACOMP_MCLK_EN(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_GAU_CTRL_GAU_ACOMP_MCLK_EN_SHIFT)) & SYSCTL2_GAU_CTRL_GAU_ACOMP_MCLK_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CTIMER_CTRL - CTIMER Control register */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_CTIMER_CTRL_CT0_GLOBAL_ENABLE_MASK (0x1U)\r\n#define SYSCTL2_CTIMER_CTRL_CT0_GLOBAL_ENABLE_SHIFT (0U)\r\n/*! CT0_GLOBAL_ENABLE - ctimer0 global_enable */\r\n#define SYSCTL2_CTIMER_CTRL_CT0_GLOBAL_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_CTIMER_CTRL_CT0_GLOBAL_ENABLE_SHIFT)) & SYSCTL2_CTIMER_CTRL_CT0_GLOBAL_ENABLE_MASK)\r\n\r\n#define SYSCTL2_CTIMER_CTRL_CT0_TRIGGER_ENABLE_MASK (0x2U)\r\n#define SYSCTL2_CTIMER_CTRL_CT0_TRIGGER_ENABLE_SHIFT (1U)\r\n/*! CT0_TRIGGER_ENABLE - ctimer0 trigger_enable */\r\n#define SYSCTL2_CTIMER_CTRL_CT0_TRIGGER_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_CTIMER_CTRL_CT0_TRIGGER_ENABLE_SHIFT)) & SYSCTL2_CTIMER_CTRL_CT0_TRIGGER_ENABLE_MASK)\r\n\r\n#define SYSCTL2_CTIMER_CTRL_CT1_GLOBAL_ENABLE_MASK (0x4U)\r\n#define SYSCTL2_CTIMER_CTRL_CT1_GLOBAL_ENABLE_SHIFT (2U)\r\n/*! CT1_GLOBAL_ENABLE - ctimer1 global_enable */\r\n#define SYSCTL2_CTIMER_CTRL_CT1_GLOBAL_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_CTIMER_CTRL_CT1_GLOBAL_ENABLE_SHIFT)) & SYSCTL2_CTIMER_CTRL_CT1_GLOBAL_ENABLE_MASK)\r\n\r\n#define SYSCTL2_CTIMER_CTRL_CT1_TRIGGER_ENABLE_MASK (0x8U)\r\n#define SYSCTL2_CTIMER_CTRL_CT1_TRIGGER_ENABLE_SHIFT (3U)\r\n/*! CT1_TRIGGER_ENABLE - ctimer1 trigger_enable */\r\n#define SYSCTL2_CTIMER_CTRL_CT1_TRIGGER_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_CTIMER_CTRL_CT1_TRIGGER_ENABLE_SHIFT)) & SYSCTL2_CTIMER_CTRL_CT1_TRIGGER_ENABLE_MASK)\r\n\r\n#define SYSCTL2_CTIMER_CTRL_CT2_GLOBAL_ENABLE_MASK (0x10U)\r\n#define SYSCTL2_CTIMER_CTRL_CT2_GLOBAL_ENABLE_SHIFT (4U)\r\n/*! CT2_GLOBAL_ENABLE - ctimer2 global_enable */\r\n#define SYSCTL2_CTIMER_CTRL_CT2_GLOBAL_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_CTIMER_CTRL_CT2_GLOBAL_ENABLE_SHIFT)) & SYSCTL2_CTIMER_CTRL_CT2_GLOBAL_ENABLE_MASK)\r\n\r\n#define SYSCTL2_CTIMER_CTRL_CT2_TRIGGER_ENABLE_MASK (0x20U)\r\n#define SYSCTL2_CTIMER_CTRL_CT2_TRIGGER_ENABLE_SHIFT (5U)\r\n/*! CT2_TRIGGER_ENABLE - ctimer2 trigger_enable */\r\n#define SYSCTL2_CTIMER_CTRL_CT2_TRIGGER_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_CTIMER_CTRL_CT2_TRIGGER_ENABLE_SHIFT)) & SYSCTL2_CTIMER_CTRL_CT2_TRIGGER_ENABLE_MASK)\r\n\r\n#define SYSCTL2_CTIMER_CTRL_CT3_GLOBAL_ENABLE_MASK (0x40U)\r\n#define SYSCTL2_CTIMER_CTRL_CT3_GLOBAL_ENABLE_SHIFT (6U)\r\n/*! CT3_GLOBAL_ENABLE - ctimer3 global_enable */\r\n#define SYSCTL2_CTIMER_CTRL_CT3_GLOBAL_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_CTIMER_CTRL_CT3_GLOBAL_ENABLE_SHIFT)) & SYSCTL2_CTIMER_CTRL_CT3_GLOBAL_ENABLE_MASK)\r\n\r\n#define SYSCTL2_CTIMER_CTRL_CT3_TRIGGER_ENABLE_MASK (0x80U)\r\n#define SYSCTL2_CTIMER_CTRL_CT3_TRIGGER_ENABLE_SHIFT (7U)\r\n/*! CT3_TRIGGER_ENABLE - ctimer3 trigger_enable */\r\n#define SYSCTL2_CTIMER_CTRL_CT3_TRIGGER_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_CTIMER_CTRL_CT3_TRIGGER_ENABLE_SHIFT)) & SYSCTL2_CTIMER_CTRL_CT3_TRIGGER_ENABLE_MASK)\r\n/*! @} */\r\n\r\n/*! @name EXT_H2H_CTRL - AHB async bridge Control register */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_EXT_H2H_CTRL_WLAN_H2H_PREFETCH_EN_MASK (0x1U)\r\n#define SYSCTL2_EXT_H2H_CTRL_WLAN_H2H_PREFETCH_EN_SHIFT (0U)\r\n/*! WLAN_H2H_PREFETCH_EN - wlan_h2h_prefetch_en */\r\n#define SYSCTL2_EXT_H2H_CTRL_WLAN_H2H_PREFETCH_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_EXT_H2H_CTRL_WLAN_H2H_PREFETCH_EN_SHIFT)) & SYSCTL2_EXT_H2H_CTRL_WLAN_H2H_PREFETCH_EN_MASK)\r\n\r\n#define SYSCTL2_EXT_H2H_CTRL_BLE_H2H_PREFETCH_EN_MASK (0x2U)\r\n#define SYSCTL2_EXT_H2H_CTRL_BLE_H2H_PREFETCH_EN_SHIFT (1U)\r\n/*! BLE_H2H_PREFETCH_EN - ble_h2h_prefetch_en */\r\n#define SYSCTL2_EXT_H2H_CTRL_BLE_H2H_PREFETCH_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_EXT_H2H_CTRL_BLE_H2H_PREFETCH_EN_SHIFT)) & SYSCTL2_EXT_H2H_CTRL_BLE_H2H_PREFETCH_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name RAM_CTRL1 - RAM Memory Control Register 1 */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_RAM_CTRL1_PKC_RTC_MASK           (0x3U)\r\n#define SYSCTL2_RAM_CTRL1_PKC_RTC_SHIFT          (0U)\r\n/*! PKC_RTC - pkc_rtc */\r\n#define SYSCTL2_RAM_CTRL1_PKC_RTC(x)             (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL1_PKC_RTC_SHIFT)) & SYSCTL2_RAM_CTRL1_PKC_RTC_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL1_PKC_WTC_MASK           (0xCU)\r\n#define SYSCTL2_RAM_CTRL1_PKC_WTC_SHIFT          (2U)\r\n/*! PKC_WTC - pkc_wtc */\r\n#define SYSCTL2_RAM_CTRL1_PKC_WTC(x)             (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL1_PKC_WTC_SHIFT)) & SYSCTL2_RAM_CTRL1_PKC_WTC_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL1_PQ_RTC_MASK            (0x30U)\r\n#define SYSCTL2_RAM_CTRL1_PQ_RTC_SHIFT           (4U)\r\n/*! PQ_RTC - pq_rtc */\r\n#define SYSCTL2_RAM_CTRL1_PQ_RTC(x)              (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL1_PQ_RTC_SHIFT)) & SYSCTL2_RAM_CTRL1_PQ_RTC_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL1_PQ_WTC_MASK            (0xC0U)\r\n#define SYSCTL2_RAM_CTRL1_PQ_WTC_SHIFT           (6U)\r\n/*! PQ_WTC - pq_wtc */\r\n#define SYSCTL2_RAM_CTRL1_PQ_WTC(x)              (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL1_PQ_WTC_SHIFT)) & SYSCTL2_RAM_CTRL1_PQ_WTC_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL1_S0_SRAM_RTC_MASK       (0x300U)\r\n#define SYSCTL2_RAM_CTRL1_S0_SRAM_RTC_SHIFT      (8U)\r\n/*! S0_SRAM_RTC - s0_sram_rtc */\r\n#define SYSCTL2_RAM_CTRL1_S0_SRAM_RTC(x)         (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL1_S0_SRAM_RTC_SHIFT)) & SYSCTL2_RAM_CTRL1_S0_SRAM_RTC_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL1_S0_SRAM_WTC_MASK       (0xC00U)\r\n#define SYSCTL2_RAM_CTRL1_S0_SRAM_WTC_SHIFT      (10U)\r\n/*! S0_SRAM_WTC - s0_sram_wtc */\r\n#define SYSCTL2_RAM_CTRL1_S0_SRAM_WTC(x)         (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL1_S0_SRAM_WTC_SHIFT)) & SYSCTL2_RAM_CTRL1_S0_SRAM_WTC_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL1_SDU_CIS_RTC_MASK       (0x3000U)\r\n#define SYSCTL2_RAM_CTRL1_SDU_CIS_RTC_SHIFT      (12U)\r\n/*! SDU_CIS_RTC - sdu_cis_rtc */\r\n#define SYSCTL2_RAM_CTRL1_SDU_CIS_RTC(x)         (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL1_SDU_CIS_RTC_SHIFT)) & SYSCTL2_RAM_CTRL1_SDU_CIS_RTC_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL1_SDU_CIS_WTC_MASK       (0xC000U)\r\n#define SYSCTL2_RAM_CTRL1_SDU_CIS_WTC_SHIFT      (14U)\r\n/*! SDU_CIS_WTC - sdu_cis_wtc */\r\n#define SYSCTL2_RAM_CTRL1_SDU_CIS_WTC(x)         (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL1_SDU_CIS_WTC_SHIFT)) & SYSCTL2_RAM_CTRL1_SDU_CIS_WTC_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL1_SDU_RX_RTC_MASK        (0x30000U)\r\n#define SYSCTL2_RAM_CTRL1_SDU_RX_RTC_SHIFT       (16U)\r\n/*! SDU_RX_RTC - sdu_rx_rtc */\r\n#define SYSCTL2_RAM_CTRL1_SDU_RX_RTC(x)          (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL1_SDU_RX_RTC_SHIFT)) & SYSCTL2_RAM_CTRL1_SDU_RX_RTC_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL1_SDU_RX_WTC_MASK        (0xC0000U)\r\n#define SYSCTL2_RAM_CTRL1_SDU_RX_WTC_SHIFT       (18U)\r\n/*! SDU_RX_WTC - sdu_rx_wtc */\r\n#define SYSCTL2_RAM_CTRL1_SDU_RX_WTC(x)          (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL1_SDU_RX_WTC_SHIFT)) & SYSCTL2_RAM_CTRL1_SDU_RX_WTC_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL1_SDU_TX_RTC_MASK        (0x300000U)\r\n#define SYSCTL2_RAM_CTRL1_SDU_TX_RTC_SHIFT       (20U)\r\n/*! SDU_TX_RTC - sdu_tx_rtc */\r\n#define SYSCTL2_RAM_CTRL1_SDU_TX_RTC(x)          (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL1_SDU_TX_RTC_SHIFT)) & SYSCTL2_RAM_CTRL1_SDU_TX_RTC_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL1_SDU_TX_WTC_MASK        (0xC00000U)\r\n#define SYSCTL2_RAM_CTRL1_SDU_TX_WTC_SHIFT       (22U)\r\n/*! SDU_TX_WTC - sdu_tx_wtc */\r\n#define SYSCTL2_RAM_CTRL1_SDU_TX_WTC(x)          (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL1_SDU_TX_WTC_SHIFT)) & SYSCTL2_RAM_CTRL1_SDU_TX_WTC_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL1_ENET_RTC_MASK          (0x3000000U)\r\n#define SYSCTL2_RAM_CTRL1_ENET_RTC_SHIFT         (24U)\r\n/*! ENET_RTC - enet_rtc */\r\n#define SYSCTL2_RAM_CTRL1_ENET_RTC(x)            (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL1_ENET_RTC_SHIFT)) & SYSCTL2_RAM_CTRL1_ENET_RTC_MASK)\r\n\r\n#define SYSCTL2_RAM_CTRL1_ENET_WTC_MASK          (0xC000000U)\r\n#define SYSCTL2_RAM_CTRL1_ENET_WTC_SHIFT         (26U)\r\n/*! ENET_WTC - enet_wtc */\r\n#define SYSCTL2_RAM_CTRL1_ENET_WTC(x)            (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RAM_CTRL1_ENET_WTC_SHIFT)) & SYSCTL2_RAM_CTRL1_ENET_WTC_MASK)\r\n/*! @} */\r\n\r\n/*! @name ROM_CTRL - ROM Control Register */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_ROM_CTRL_ELS_RTC_MASK            (0x7U)\r\n#define SYSCTL2_ROM_CTRL_ELS_RTC_SHIFT           (0U)\r\n/*! ELS_RTC - els_rtc */\r\n#define SYSCTL2_ROM_CTRL_ELS_RTC(x)              (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ROM_CTRL_ELS_RTC_SHIFT)) & SYSCTL2_ROM_CTRL_ELS_RTC_MASK)\r\n\r\n#define SYSCTL2_ROM_CTRL_ELS_RTC_REF_MASK        (0x18U)\r\n#define SYSCTL2_ROM_CTRL_ELS_RTC_REF_SHIFT       (3U)\r\n/*! ELS_RTC_REF - els_rtc_ref */\r\n#define SYSCTL2_ROM_CTRL_ELS_RTC_REF(x)          (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ROM_CTRL_ELS_RTC_REF_SHIFT)) & SYSCTL2_ROM_CTRL_ELS_RTC_REF_MASK)\r\n\r\n#define SYSCTL2_ROM_CTRL_S0_ROM_RTC_MASK         (0xE0U)\r\n#define SYSCTL2_ROM_CTRL_S0_ROM_RTC_SHIFT        (5U)\r\n/*! S0_ROM_RTC - s0_rom_rtc */\r\n#define SYSCTL2_ROM_CTRL_S0_ROM_RTC(x)           (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ROM_CTRL_S0_ROM_RTC_SHIFT)) & SYSCTL2_ROM_CTRL_S0_ROM_RTC_MASK)\r\n\r\n#define SYSCTL2_ROM_CTRL_S0_ROM_RTC_REF_MASK     (0x300U)\r\n#define SYSCTL2_ROM_CTRL_S0_ROM_RTC_REF_SHIFT    (8U)\r\n/*! S0_ROM_RTC_REF - s0_rom_rtc_ref */\r\n#define SYSCTL2_ROM_CTRL_S0_ROM_RTC_REF(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ROM_CTRL_S0_ROM_RTC_REF_SHIFT)) & SYSCTL2_ROM_CTRL_S0_ROM_RTC_REF_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_PD_CTRL - MEM PD Control enable register when PM2 mode */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM0_SW_CTRL_EN_MASK (0x1U)\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM0_SW_CTRL_EN_SHIFT (0U)\r\n/*! SRAM0_SW_CTRL_EN - SW control sram0 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM0_SW_CTRL_EN(x)  (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_SRAM0_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_SRAM0_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM1_SW_CTRL_EN_MASK (0x2U)\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM1_SW_CTRL_EN_SHIFT (1U)\r\n/*! SRAM1_SW_CTRL_EN - SW control sram1 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM1_SW_CTRL_EN(x)  (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_SRAM1_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_SRAM1_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM2_SW_CTRL_EN_MASK (0x4U)\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM2_SW_CTRL_EN_SHIFT (2U)\r\n/*! SRAM2_SW_CTRL_EN - SW control sram2 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM2_SW_CTRL_EN(x)  (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_SRAM2_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_SRAM2_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM3_SW_CTRL_EN_MASK (0x8U)\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM3_SW_CTRL_EN_SHIFT (3U)\r\n/*! SRAM3_SW_CTRL_EN - SW control sram3 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM3_SW_CTRL_EN(x)  (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_SRAM3_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_SRAM3_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM4_SW_CTRL_EN_MASK (0x10U)\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM4_SW_CTRL_EN_SHIFT (4U)\r\n/*! SRAM4_SW_CTRL_EN - SW control sram4 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM4_SW_CTRL_EN(x)  (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_SRAM4_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_SRAM4_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM5_SW_CTRL_EN_MASK (0x20U)\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM5_SW_CTRL_EN_SHIFT (5U)\r\n/*! SRAM5_SW_CTRL_EN - SW control sram5 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM5_SW_CTRL_EN(x)  (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_SRAM5_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_SRAM5_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM6_SW_CTRL_EN_MASK (0x40U)\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM6_SW_CTRL_EN_SHIFT (6U)\r\n/*! SRAM6_SW_CTRL_EN - SW control sram6 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM6_SW_CTRL_EN(x)  (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_SRAM6_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_SRAM6_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM7_SW_CTRL_EN_MASK (0x80U)\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM7_SW_CTRL_EN_SHIFT (7U)\r\n/*! SRAM7_SW_CTRL_EN - SW control sram7 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM7_SW_CTRL_EN(x)  (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_SRAM7_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_SRAM7_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM8_SW_CTRL_EN_MASK (0x100U)\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM8_SW_CTRL_EN_SHIFT (8U)\r\n/*! SRAM8_SW_CTRL_EN - SW control sram8 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM8_SW_CTRL_EN(x)  (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_SRAM8_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_SRAM8_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM9_SW_CTRL_EN_MASK (0x200U)\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM9_SW_CTRL_EN_SHIFT (9U)\r\n/*! SRAM9_SW_CTRL_EN - SW control sram9 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM9_SW_CTRL_EN(x)  (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_SRAM9_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_SRAM9_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM10_SW_CTRL_EN_MASK (0x400U)\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM10_SW_CTRL_EN_SHIFT (10U)\r\n/*! SRAM10_SW_CTRL_EN - SW control sram10 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM10_SW_CTRL_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_SRAM10_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_SRAM10_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM11_SW_CTRL_EN_MASK (0x800U)\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM11_SW_CTRL_EN_SHIFT (11U)\r\n/*! SRAM11_SW_CTRL_EN - SW control sram11 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM11_SW_CTRL_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_SRAM11_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_SRAM11_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM12_SW_CTRL_EN_MASK (0x1000U)\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM12_SW_CTRL_EN_SHIFT (12U)\r\n/*! SRAM12_SW_CTRL_EN - SW control sram12 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM12_SW_CTRL_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_SRAM12_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_SRAM12_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM13_SW_CTRL_EN_MASK (0x2000U)\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM13_SW_CTRL_EN_SHIFT (13U)\r\n/*! SRAM13_SW_CTRL_EN - SW control sram13 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM13_SW_CTRL_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_SRAM13_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_SRAM13_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM14_SW_CTRL_EN_MASK (0x4000U)\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM14_SW_CTRL_EN_SHIFT (14U)\r\n/*! SRAM14_SW_CTRL_EN - SW control sram14 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM14_SW_CTRL_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_SRAM14_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_SRAM14_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM15_SW_CTRL_EN_MASK (0x8000U)\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM15_SW_CTRL_EN_SHIFT (15U)\r\n/*! SRAM15_SW_CTRL_EN - SW control sram15 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM15_SW_CTRL_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_SRAM15_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_SRAM15_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM16_SW_CTRL_EN_MASK (0x10000U)\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM16_SW_CTRL_EN_SHIFT (16U)\r\n/*! SRAM16_SW_CTRL_EN - SW control sram16 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM16_SW_CTRL_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_SRAM16_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_SRAM16_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM17_SW_CTRL_EN_MASK (0x20000U)\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM17_SW_CTRL_EN_SHIFT (17U)\r\n/*! SRAM17_SW_CTRL_EN - SW control sram17 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM17_SW_CTRL_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_SRAM17_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_SRAM17_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM18_SW_CTRL_EN_MASK (0x40000U)\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM18_SW_CTRL_EN_SHIFT (18U)\r\n/*! SRAM18_SW_CTRL_EN - SW control sram18 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_SRAM18_SW_CTRL_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_SRAM18_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_SRAM18_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_AON0_SW_CTRL_EN_MASK (0x80000U)\r\n#define SYSCTL2_MEM_PD_CTRL_AON0_SW_CTRL_EN_SHIFT (19U)\r\n/*! AON0_SW_CTRL_EN - SW control aon0 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_AON0_SW_CTRL_EN(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_AON0_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_AON0_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_AON1_SW_CTRL_EN_MASK (0x100000U)\r\n#define SYSCTL2_MEM_PD_CTRL_AON1_SW_CTRL_EN_SHIFT (20U)\r\n/*! AON1_SW_CTRL_EN - SW control aon1 mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_AON1_SW_CTRL_EN(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_AON1_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_AON1_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_ELS_SW_CTRL_EN_MASK  (0x200000U)\r\n#define SYSCTL2_MEM_PD_CTRL_ELS_SW_CTRL_EN_SHIFT (21U)\r\n/*! ELS_SW_CTRL_EN - SW control els mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_ELS_SW_CTRL_EN(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_ELS_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_ELS_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_PKC_SW_CTRL_EN_MASK  (0x400000U)\r\n#define SYSCTL2_MEM_PD_CTRL_PKC_SW_CTRL_EN_SHIFT (22U)\r\n/*! PKC_SW_CTRL_EN - SW control pkc mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_PKC_SW_CTRL_EN(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_PKC_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_PKC_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_PQ_SW_CTRL_EN_MASK   (0x800000U)\r\n#define SYSCTL2_MEM_PD_CTRL_PQ_SW_CTRL_EN_SHIFT  (23U)\r\n/*! PQ_SW_CTRL_EN - SW control pq mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_PQ_SW_CTRL_EN(x)     (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_PQ_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_PQ_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_FLEXSPI_SW_CTRL_EN_MASK (0x1000000U)\r\n#define SYSCTL2_MEM_PD_CTRL_FLEXSPI_SW_CTRL_EN_SHIFT (24U)\r\n/*! FLEXSPI_SW_CTRL_EN - SW control flexspi mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_FLEXSPI_SW_CTRL_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_FLEXSPI_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_FLEXSPI_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_ROM_SW_CTRL_EN_MASK  (0x2000000U)\r\n#define SYSCTL2_MEM_PD_CTRL_ROM_SW_CTRL_EN_SHIFT (25U)\r\n/*! ROM_SW_CTRL_EN - SW control rom mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_ROM_SW_CTRL_EN(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_ROM_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_ROM_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_OTP_SW_CTRL_EN_MASK  (0x4000000U)\r\n#define SYSCTL2_MEM_PD_CTRL_OTP_SW_CTRL_EN_SHIFT (26U)\r\n/*! OTP_SW_CTRL_EN - SW control otp mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_OTP_SW_CTRL_EN(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_OTP_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_OTP_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_SDIO_SW_CTRL_EN_MASK (0x8000000U)\r\n#define SYSCTL2_MEM_PD_CTRL_SDIO_SW_CTRL_EN_SHIFT (27U)\r\n/*! SDIO_SW_CTRL_EN - SW control sdio mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_SDIO_SW_CTRL_EN(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_SDIO_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_SDIO_SW_CTRL_EN_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CTRL_ENET_SW_CTRL_EN_MASK (0x10000000U)\r\n#define SYSCTL2_MEM_PD_CTRL_ENET_SW_CTRL_EN_SHIFT (28U)\r\n/*! ENET_SW_CTRL_EN - SW control enet mem_pd signal enable when PM2 mode */\r\n#define SYSCTL2_MEM_PD_CTRL_ENET_SW_CTRL_EN(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CTRL_ENET_SW_CTRL_EN_SHIFT)) & SYSCTL2_MEM_PD_CTRL_ENET_SW_CTRL_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_PD_CFG - MEM PD Configure register when PM2 mode */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_PD_CFG_SRAM0_SW_CFG_MASK     (0x1U)\r\n#define SYSCTL2_MEM_PD_CFG_SRAM0_SW_CFG_SHIFT    (0U)\r\n/*! SRAM0_SW_CFG - sw cfg sram0 mem_pdwn signal when PM2 mode; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_SRAM0_SW_CFG(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_SRAM0_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_SRAM0_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_SRAM1_SW_CFG_MASK     (0x2U)\r\n#define SYSCTL2_MEM_PD_CFG_SRAM1_SW_CFG_SHIFT    (1U)\r\n/*! SRAM1_SW_CFG - sw cfg sram1 mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_SRAM1_SW_CFG(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_SRAM1_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_SRAM1_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_SRAM2_SW_CFG_MASK     (0x4U)\r\n#define SYSCTL2_MEM_PD_CFG_SRAM2_SW_CFG_SHIFT    (2U)\r\n/*! SRAM2_SW_CFG - sw cfg sram2 mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_SRAM2_SW_CFG(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_SRAM2_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_SRAM2_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_SRAM3_SW_CFG_MASK     (0x8U)\r\n#define SYSCTL2_MEM_PD_CFG_SRAM3_SW_CFG_SHIFT    (3U)\r\n/*! SRAM3_SW_CFG - sw cfg sram3 mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_SRAM3_SW_CFG(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_SRAM3_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_SRAM3_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_SRAM4_SW_CFG_MASK     (0x10U)\r\n#define SYSCTL2_MEM_PD_CFG_SRAM4_SW_CFG_SHIFT    (4U)\r\n/*! SRAM4_SW_CFG - sw cfg sram4 mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_SRAM4_SW_CFG(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_SRAM4_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_SRAM4_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_SRAM5_SW_CFG_MASK     (0x20U)\r\n#define SYSCTL2_MEM_PD_CFG_SRAM5_SW_CFG_SHIFT    (5U)\r\n/*! SRAM5_SW_CFG - sw cfg sram5 mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_SRAM5_SW_CFG(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_SRAM5_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_SRAM5_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_SRAM6_SW_CFG_MASK     (0x40U)\r\n#define SYSCTL2_MEM_PD_CFG_SRAM6_SW_CFG_SHIFT    (6U)\r\n/*! SRAM6_SW_CFG - sw cfg sram6 mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_SRAM6_SW_CFG(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_SRAM6_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_SRAM6_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_SRAM7_SW_CFG_MASK     (0x80U)\r\n#define SYSCTL2_MEM_PD_CFG_SRAM7_SW_CFG_SHIFT    (7U)\r\n/*! SRAM7_SW_CFG - sw cfg sram7 mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_SRAM7_SW_CFG(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_SRAM7_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_SRAM7_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_SRAM8_SW_CFG_MASK     (0x100U)\r\n#define SYSCTL2_MEM_PD_CFG_SRAM8_SW_CFG_SHIFT    (8U)\r\n/*! SRAM8_SW_CFG - sw cfg sram8 mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_SRAM8_SW_CFG(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_SRAM8_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_SRAM8_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_SRAM9_SW_CFG_MASK     (0x200U)\r\n#define SYSCTL2_MEM_PD_CFG_SRAM9_SW_CFG_SHIFT    (9U)\r\n/*! SRAM9_SW_CFG - sw cfg sram9 mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_SRAM9_SW_CFG(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_SRAM9_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_SRAM9_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_SRAM10_SW_CFG_MASK    (0x400U)\r\n#define SYSCTL2_MEM_PD_CFG_SRAM10_SW_CFG_SHIFT   (10U)\r\n/*! SRAM10_SW_CFG - sw cfg sram mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_SRAM10_SW_CFG(x)      (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_SRAM10_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_SRAM10_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_SRAM11_SW_CFG_MASK    (0x800U)\r\n#define SYSCTL2_MEM_PD_CFG_SRAM11_SW_CFG_SHIFT   (11U)\r\n/*! SRAM11_SW_CFG - sw cfg sram11 mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_SRAM11_SW_CFG(x)      (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_SRAM11_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_SRAM11_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_SRAM12_SW_CFG_MASK    (0x1000U)\r\n#define SYSCTL2_MEM_PD_CFG_SRAM12_SW_CFG_SHIFT   (12U)\r\n/*! SRAM12_SW_CFG - sw cfg sram12 mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_SRAM12_SW_CFG(x)      (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_SRAM12_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_SRAM12_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_SRAM13_SW_CFG_MASK    (0x2000U)\r\n#define SYSCTL2_MEM_PD_CFG_SRAM13_SW_CFG_SHIFT   (13U)\r\n/*! SRAM13_SW_CFG - sw cfg sram13 mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_SRAM13_SW_CFG(x)      (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_SRAM13_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_SRAM13_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_SRAM14_SW_CFG_MASK    (0x4000U)\r\n#define SYSCTL2_MEM_PD_CFG_SRAM14_SW_CFG_SHIFT   (14U)\r\n/*! SRAM14_SW_CFG - sw cfg sram14 mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_SRAM14_SW_CFG(x)      (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_SRAM14_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_SRAM14_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_SRAM15_SW_CFG_MASK    (0x8000U)\r\n#define SYSCTL2_MEM_PD_CFG_SRAM15_SW_CFG_SHIFT   (15U)\r\n/*! SRAM15_SW_CFG - sw cfg sram15 mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_SRAM15_SW_CFG(x)      (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_SRAM15_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_SRAM15_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_SRAM16_SW_CFG_MASK    (0x10000U)\r\n#define SYSCTL2_MEM_PD_CFG_SRAM16_SW_CFG_SHIFT   (16U)\r\n/*! SRAM16_SW_CFG - sw cfg sram16 mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_SRAM16_SW_CFG(x)      (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_SRAM16_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_SRAM16_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_SRAM17_SW_CFG_MASK    (0x20000U)\r\n#define SYSCTL2_MEM_PD_CFG_SRAM17_SW_CFG_SHIFT   (17U)\r\n/*! SRAM17_SW_CFG - sw cfg sram17 mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_SRAM17_SW_CFG(x)      (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_SRAM17_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_SRAM17_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_SRAM18_SW_CFG_MASK    (0x40000U)\r\n#define SYSCTL2_MEM_PD_CFG_SRAM18_SW_CFG_SHIFT   (18U)\r\n/*! SRAM18_SW_CFG - sw cfg sram18 mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_SRAM18_SW_CFG(x)      (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_SRAM18_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_SRAM18_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_AON0_SW_CFG_MASK      (0x80000U)\r\n#define SYSCTL2_MEM_PD_CFG_AON0_SW_CFG_SHIFT     (19U)\r\n/*! AON0_SW_CFG - sw cfg aon0 mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_AON0_SW_CFG(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_AON0_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_AON0_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_AON1_SW_CFG_MASK      (0x100000U)\r\n#define SYSCTL2_MEM_PD_CFG_AON1_SW_CFG_SHIFT     (20U)\r\n/*! AON1_SW_CFG - sw cfg aon1 mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_AON1_SW_CFG(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_AON1_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_AON1_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_ELS_SW_CFG_MASK       (0x200000U)\r\n#define SYSCTL2_MEM_PD_CFG_ELS_SW_CFG_SHIFT      (21U)\r\n/*! ELS_SW_CFG - sw cfg els mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_ELS_SW_CFG(x)         (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_ELS_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_ELS_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_PKC_SW_CFG_MASK       (0x400000U)\r\n#define SYSCTL2_MEM_PD_CFG_PKC_SW_CFG_SHIFT      (22U)\r\n/*! PKC_SW_CFG - sw cfg pkc mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_PKC_SW_CFG(x)         (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_PKC_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_PKC_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_PQ_SW_CFG_MASK        (0x800000U)\r\n#define SYSCTL2_MEM_PD_CFG_PQ_SW_CFG_SHIFT       (23U)\r\n/*! PQ_SW_CFG - sw cfg pq mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_PQ_SW_CFG(x)          (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_PQ_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_PQ_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_FLEXSPI_SW_CFG_MASK   (0x1000000U)\r\n#define SYSCTL2_MEM_PD_CFG_FLEXSPI_SW_CFG_SHIFT  (24U)\r\n/*! FLEXSPI_SW_CFG - sw cfg flexspi mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_FLEXSPI_SW_CFG(x)     (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_FLEXSPI_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_FLEXSPI_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_ROM_SW_CFG_MASK       (0x2000000U)\r\n#define SYSCTL2_MEM_PD_CFG_ROM_SW_CFG_SHIFT      (25U)\r\n/*! ROM_SW_CFG - sw cfg rom mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_ROM_SW_CFG(x)         (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_ROM_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_ROM_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_OTP_SW_CFG_MASK       (0x4000000U)\r\n#define SYSCTL2_MEM_PD_CFG_OTP_SW_CFG_SHIFT      (26U)\r\n/*! OTP_SW_CFG - sw cfg otp mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_OTP_SW_CFG(x)         (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_OTP_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_OTP_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_SDIO_SW_CFG_MASK      (0x8000000U)\r\n#define SYSCTL2_MEM_PD_CFG_SDIO_SW_CFG_SHIFT     (27U)\r\n/*! SDIO_SW_CFG - sw cfg sdio mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_SDIO_SW_CFG(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_SDIO_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_SDIO_SW_CFG_MASK)\r\n\r\n#define SYSCTL2_MEM_PD_CFG_ENET_SW_CFG_MASK      (0x10000000U)\r\n#define SYSCTL2_MEM_PD_CFG_ENET_SW_CFG_SHIFT     (28U)\r\n/*! ENET_SW_CFG - sw cfg enet mem_pdwn signal when PM2 mode ; 0: active; 1: power down */\r\n#define SYSCTL2_MEM_PD_CFG_ENET_SW_CFG(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_PD_CFG_ENET_SW_CFG_SHIFT)) & SYSCTL2_MEM_PD_CFG_ENET_SW_CFG_MASK)\r\n/*! @} */\r\n\r\n/*! @name ENET_IN_SEL_TIMER - Select input source for enet pad0 */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_ENET_IN_SEL_TIMER_ENET_IN_SEL_TIMER_MASK (0x1U)\r\n#define SYSCTL2_ENET_IN_SEL_TIMER_ENET_IN_SEL_TIMER_SHIFT (0U)\r\n/*! ENET_IN_SEL_TIMER - select input source as enet input */\r\n#define SYSCTL2_ENET_IN_SEL_TIMER_ENET_IN_SEL_TIMER(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ENET_IN_SEL_TIMER_ENET_IN_SEL_TIMER_SHIFT)) & SYSCTL2_ENET_IN_SEL_TIMER_ENET_IN_SEL_TIMER_MASK)\r\n/*! @} */\r\n\r\n/*! @name ENET_IPG_STOP - Configure ipg_stop, used by enet wakeup sequence */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_ENET_IPG_STOP_ENET_IPG_STOP_MASK (0x1U)\r\n#define SYSCTL2_ENET_IPG_STOP_ENET_IPG_STOP_SHIFT (0U)\r\n/*! ENET_IPG_STOP - Configure ipg_stop, used by enet wakeup sequence; 0: Drive enet input IPG_STOP low; 1: Drive enet input IPG_STOP high. */\r\n#define SYSCTL2_ENET_IPG_STOP_ENET_IPG_STOP(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ENET_IPG_STOP_ENET_IPG_STOP_SHIFT)) & SYSCTL2_ENET_IPG_STOP_ENET_IPG_STOP_MASK)\r\n/*! @} */\r\n\r\n/*! @name ENET_IPG_STOP_ACK - Store ipg_stop_ack, used by enet wakeup sequence */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_ENET_IPG_STOP_ACK_ENET_IPG_STOP_ACK_MASK (0x1U)\r\n#define SYSCTL2_ENET_IPG_STOP_ACK_ENET_IPG_STOP_ACK_SHIFT (0U)\r\n/*! ENET_IPG_STOP_ACK - Store ipg_stop_ack, used by enet wakeup sequence */\r\n#define SYSCTL2_ENET_IPG_STOP_ACK_ENET_IPG_STOP_ACK(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ENET_IPG_STOP_ACK_ENET_IPG_STOP_ACK_SHIFT)) & SYSCTL2_ENET_IPG_STOP_ACK_ENET_IPG_STOP_ACK_MASK)\r\n/*! @} */\r\n\r\n/*! @name ROM_BRU_ADDR_MASK_DIS - Disable dynamic address masking feature */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_ROM_BRU_ADDR_MASK_DIS_ROM_BRU_ADDR_MASK_DIS_MASK (0x1U)\r\n#define SYSCTL2_ROM_BRU_ADDR_MASK_DIS_ROM_BRU_ADDR_MASK_DIS_SHIFT (0U)\r\n/*! ROM_BRU_ADDR_MASK_DIS - Disable dynamic address masking feature */\r\n#define SYSCTL2_ROM_BRU_ADDR_MASK_DIS_ROM_BRU_ADDR_MASK_DIS(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ROM_BRU_ADDR_MASK_DIS_ROM_BRU_ADDR_MASK_DIS_SHIFT)) & SYSCTL2_ROM_BRU_ADDR_MASK_DIS_ROM_BRU_ADDR_MASK_DIS_MASK)\r\n/*! @} */\r\n\r\n/*! @name ROM_BRU_DYN_CLK_DIS - Disable dynamic clock gating feature */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_ROM_BRU_DYN_CLK_DIS_ROM_BRU_DYN_CLK_DIS_MASK (0x1U)\r\n#define SYSCTL2_ROM_BRU_DYN_CLK_DIS_ROM_BRU_DYN_CLK_DIS_SHIFT (0U)\r\n/*! ROM_BRU_DYN_CLK_DIS - Disable dynamic clock gating feature */\r\n#define SYSCTL2_ROM_BRU_DYN_CLK_DIS_ROM_BRU_DYN_CLK_DIS(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ROM_BRU_DYN_CLK_DIS_ROM_BRU_DYN_CLK_DIS_SHIFT)) & SYSCTL2_ROM_BRU_DYN_CLK_DIS_ROM_BRU_DYN_CLK_DIS_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_EARLY_FUSE_VALID - Early fuse valid from OTP */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_OTP_EARLY_FUSE_VALID_OTP_EARLY_FUSE_VALID_MASK (0x1U)\r\n#define SYSCTL2_OTP_EARLY_FUSE_VALID_OTP_EARLY_FUSE_VALID_SHIFT (0U)\r\n/*! OTP_EARLY_FUSE_VALID - Early fuse valid from OTP */\r\n#define SYSCTL2_OTP_EARLY_FUSE_VALID_OTP_EARLY_FUSE_VALID(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_OTP_EARLY_FUSE_VALID_OTP_EARLY_FUSE_VALID_SHIFT)) & SYSCTL2_OTP_EARLY_FUSE_VALID_OTP_EARLY_FUSE_VALID_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_MEDIUM_FUSE_VALID - Medium fuse valid from OTP */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_OTP_MEDIUM_FUSE_VALID_OTP_MEDIUM_FUSE_VALID_MASK (0x1U)\r\n#define SYSCTL2_OTP_MEDIUM_FUSE_VALID_OTP_MEDIUM_FUSE_VALID_SHIFT (0U)\r\n/*! OTP_MEDIUM_FUSE_VALID - Medium fuse valid from OTP */\r\n#define SYSCTL2_OTP_MEDIUM_FUSE_VALID_OTP_MEDIUM_FUSE_VALID(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_OTP_MEDIUM_FUSE_VALID_OTP_MEDIUM_FUSE_VALID_SHIFT)) & SYSCTL2_OTP_MEDIUM_FUSE_VALID_OTP_MEDIUM_FUSE_VALID_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTP_ALL_FUSE_VALID - All fuse valid from OTP */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_OTP_ALL_FUSE_VALID_OTP_ALL_FUSE_VALID_MASK (0x1U)\r\n#define SYSCTL2_OTP_ALL_FUSE_VALID_OTP_ALL_FUSE_VALID_SHIFT (0U)\r\n/*! OTP_ALL_FUSE_VALID - All fuse valid from OTP */\r\n#define SYSCTL2_OTP_ALL_FUSE_VALID_OTP_ALL_FUSE_VALID(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_OTP_ALL_FUSE_VALID_OTP_ALL_FUSE_VALID_SHIFT)) & SYSCTL2_OTP_ALL_FUSE_VALID_OTP_ALL_FUSE_VALID_MASK)\r\n/*! @} */\r\n\r\n/*! @name PLL_CTRL - PLL control register */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_PLL_CTRL_T3_PDB_MASK             (0x1U)\r\n#define SYSCTL2_PLL_CTRL_T3_PDB_SHIFT            (0U)\r\n/*! T3_PDB - T3 PLL enable signal from SOC */\r\n#define SYSCTL2_PLL_CTRL_T3_PDB(x)               (((uint32_t)(((uint32_t)(x)) << SYSCTL2_PLL_CTRL_T3_PDB_SHIFT)) & SYSCTL2_PLL_CTRL_T3_PDB_MASK)\r\n\r\n#define SYSCTL2_PLL_CTRL_T3_LOCK_MASK            (0x2U)\r\n#define SYSCTL2_PLL_CTRL_T3_LOCK_SHIFT           (1U)\r\n/*! T3_LOCK - T3 output clock lock signal */\r\n#define SYSCTL2_PLL_CTRL_T3_LOCK(x)              (((uint32_t)(((uint32_t)(x)) << SYSCTL2_PLL_CTRL_T3_LOCK_SHIFT)) & SYSCTL2_PLL_CTRL_T3_LOCK_MASK)\r\n\r\n#define SYSCTL2_PLL_CTRL_TDDR_PDB_MASK           (0x8U)\r\n#define SYSCTL2_PLL_CTRL_TDDR_PDB_SHIFT          (3U)\r\n/*! TDDR_PDB - TDDR PLL enable signal from SOC */\r\n#define SYSCTL2_PLL_CTRL_TDDR_PDB(x)             (((uint32_t)(((uint32_t)(x)) << SYSCTL2_PLL_CTRL_TDDR_PDB_SHIFT)) & SYSCTL2_PLL_CTRL_TDDR_PDB_MASK)\r\n\r\n#define SYSCTL2_PLL_CTRL_TDDR_LOCK_MASK          (0x10U)\r\n#define SYSCTL2_PLL_CTRL_TDDR_LOCK_SHIFT         (4U)\r\n/*! TDDR_LOCK - TDDR output clock lock signal */\r\n#define SYSCTL2_PLL_CTRL_TDDR_LOCK(x)            (((uint32_t)(((uint32_t)(x)) << SYSCTL2_PLL_CTRL_TDDR_LOCK_SHIFT)) & SYSCTL2_PLL_CTRL_TDDR_LOCK_MASK)\r\n\r\n#define SYSCTL2_PLL_CTRL_TCPU_PDB_MASK           (0x20U)\r\n#define SYSCTL2_PLL_CTRL_TCPU_PDB_SHIFT          (5U)\r\n/*! TCPU_PDB - TCPU PLL enable signal from SOC */\r\n#define SYSCTL2_PLL_CTRL_TCPU_PDB(x)             (((uint32_t)(((uint32_t)(x)) << SYSCTL2_PLL_CTRL_TCPU_PDB_SHIFT)) & SYSCTL2_PLL_CTRL_TCPU_PDB_MASK)\r\n\r\n#define SYSCTL2_PLL_CTRL_TCPU_LOCK_MASK          (0x40U)\r\n#define SYSCTL2_PLL_CTRL_TCPU_LOCK_SHIFT         (6U)\r\n/*! TCPU_LOCK - TCPU output clock lock signal */\r\n#define SYSCTL2_PLL_CTRL_TCPU_LOCK(x)            (((uint32_t)(((uint32_t)(x)) << SYSCTL2_PLL_CTRL_TCPU_LOCK_SHIFT)) & SYSCTL2_PLL_CTRL_TCPU_LOCK_MASK)\r\n\r\n#define SYSCTL2_PLL_CTRL_TCPU_FLEXSPI_CLK_SEL_MASK (0x180U)\r\n#define SYSCTL2_PLL_CTRL_TCPU_FLEXSPI_CLK_SEL_SHIFT (7U)\r\n/*! TCPU_FLEXSPI_CLK_SEL - TCPU_PLL DIV selection(00:3120/12; 01:3120/11; 10: 3120/10; 11:3120/9) */\r\n#define SYSCTL2_PLL_CTRL_TCPU_FLEXSPI_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_PLL_CTRL_TCPU_FLEXSPI_CLK_SEL_SHIFT)) & SYSCTL2_PLL_CTRL_TCPU_FLEXSPI_CLK_SEL_MASK)\r\n\r\n#define SYSCTL2_PLL_CTRL_TCPU_FBDIV_MASK         (0x1FE00U)\r\n#define SYSCTL2_PLL_CTRL_TCPU_FBDIV_SHIFT        (9U)\r\n/*! TCPU_FBDIV - TCPU_PLL Feedback Divider Value ( Fxtal 40MHZ: 75 to 96 (decimal); 38.4MHz 78 to 100 (decimal)) */\r\n#define SYSCTL2_PLL_CTRL_TCPU_FBDIV(x)           (((uint32_t)(((uint32_t)(x)) << SYSCTL2_PLL_CTRL_TCPU_FBDIV_SHIFT)) & SYSCTL2_PLL_CTRL_TCPU_FBDIV_MASK)\r\n\r\n#define SYSCTL2_PLL_CTRL_TDDR_FLEXSPI_CLK_SEL_MASK (0x60000U)\r\n#define SYSCTL2_PLL_CTRL_TDDR_FLEXSPI_CLK_SEL_SHIFT (17U)\r\n/*! TDDR_FLEXSPI_CLK_SEL - TDDR_PLL Clock selection from SOC for DDR CLOCK (00:3.2GHZ/11; 01: 3.2GHZ/10; 10: 3.2GHz/9;11: 3.2GHz/8) */\r\n#define SYSCTL2_PLL_CTRL_TDDR_FLEXSPI_CLK_SEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_PLL_CTRL_TDDR_FLEXSPI_CLK_SEL_SHIFT)) & SYSCTL2_PLL_CTRL_TDDR_FLEXSPI_CLK_SEL_MASK)\r\n\r\n#define SYSCTL2_PLL_CTRL_T3_ITRC_EN_MASK         (0x80000U)\r\n#define SYSCTL2_PLL_CTRL_T3_ITRC_EN_SHIFT        (19U)\r\n/*! T3_ITRC_EN - 0-disable the unlock event to ITRC; 1-enable the unlock event to ITRC */\r\n#define SYSCTL2_PLL_CTRL_T3_ITRC_EN(x)           (((uint32_t)(((uint32_t)(x)) << SYSCTL2_PLL_CTRL_T3_ITRC_EN_SHIFT)) & SYSCTL2_PLL_CTRL_T3_ITRC_EN_MASK)\r\n\r\n#define SYSCTL2_PLL_CTRL_TCPU_ITRC_EN_MASK       (0x100000U)\r\n#define SYSCTL2_PLL_CTRL_TCPU_ITRC_EN_SHIFT      (20U)\r\n/*! TCPU_ITRC_EN - 0-disable the unlock event to ITRC; 1-enable the unlock event to ITRC */\r\n#define SYSCTL2_PLL_CTRL_TCPU_ITRC_EN(x)         (((uint32_t)(((uint32_t)(x)) << SYSCTL2_PLL_CTRL_TCPU_ITRC_EN_SHIFT)) & SYSCTL2_PLL_CTRL_TCPU_ITRC_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name ANA_PDWN_PM2 - ana_pdwn control signal when PM2 mode */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_ANA_PDWN_PM2_AVPLL_ANA_PDWN_PM2_MASK (0x1U)\r\n#define SYSCTL2_ANA_PDWN_PM2_AVPLL_ANA_PDWN_PM2_SHIFT (0U)\r\n/*! AVPLL_ANA_PDWN_PM2 - AVPLL ana_pdwn control signal when PM2 mode, 1: AVPLL is low power mode when PM2 0: AVPLL is normal mode when PM2 */\r\n#define SYSCTL2_ANA_PDWN_PM2_AVPLL_ANA_PDWN_PM2(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ANA_PDWN_PM2_AVPLL_ANA_PDWN_PM2_SHIFT)) & SYSCTL2_ANA_PDWN_PM2_AVPLL_ANA_PDWN_PM2_MASK)\r\n\r\n#define SYSCTL2_ANA_PDWN_PM2_USB_ANA_PDWN_PM2_MASK (0x2U)\r\n#define SYSCTL2_ANA_PDWN_PM2_USB_ANA_PDWN_PM2_SHIFT (1U)\r\n/*! USB_ANA_PDWN_PM2 - USB ana_pdwn control signal when PM2 mode, 1: USB is low power mode when PM2 0: USB is normal mode when PM2 */\r\n#define SYSCTL2_ANA_PDWN_PM2_USB_ANA_PDWN_PM2(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ANA_PDWN_PM2_USB_ANA_PDWN_PM2_SHIFT)) & SYSCTL2_ANA_PDWN_PM2_USB_ANA_PDWN_PM2_MASK)\r\n\r\n#define SYSCTL2_ANA_PDWN_PM2_GAU_ANA_PDWN_PM2_MASK (0x4U)\r\n#define SYSCTL2_ANA_PDWN_PM2_GAU_ANA_PDWN_PM2_SHIFT (2U)\r\n/*! GAU_ANA_PDWN_PM2 - GAU ana_pdwn control signal when PM2 mode, 1: GAU is low power mode when PM2 0: GAU is normal mode when PM2 */\r\n#define SYSCTL2_ANA_PDWN_PM2_GAU_ANA_PDWN_PM2(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ANA_PDWN_PM2_GAU_ANA_PDWN_PM2_SHIFT)) & SYSCTL2_ANA_PDWN_PM2_GAU_ANA_PDWN_PM2_MASK)\r\n\r\n#define SYSCTL2_ANA_PDWN_PM2_ANA_TOP_ANA_PDWN_PM2_MASK (0x8U)\r\n#define SYSCTL2_ANA_PDWN_PM2_ANA_TOP_ANA_PDWN_PM2_SHIFT (3U)\r\n/*! ANA_TOP_ANA_PDWN_PM2 - ANA_TOP ana_pdwn control signal when PM2 mode, 1: ANA_TOP is low power mode when PM2 0: ANA_TOP is normal mode when PM2 */\r\n#define SYSCTL2_ANA_PDWN_PM2_ANA_TOP_ANA_PDWN_PM2(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ANA_PDWN_PM2_ANA_TOP_ANA_PDWN_PM2_SHIFT)) & SYSCTL2_ANA_PDWN_PM2_ANA_TOP_ANA_PDWN_PM2_MASK)\r\n\r\n#define SYSCTL2_ANA_PDWN_PM2_TDDR_TOP_ANA_PDWN_PM2_MASK (0x10U)\r\n#define SYSCTL2_ANA_PDWN_PM2_TDDR_TOP_ANA_PDWN_PM2_SHIFT (4U)\r\n/*! TDDR_TOP_ANA_PDWN_PM2 - TDDR_TOP ana_pdwn control signal when PM2 mode, 1: TDDR_TOP is low power\r\n *    mode when PM2 0: TDDR_TOP is normal mode when PM2\r\n */\r\n#define SYSCTL2_ANA_PDWN_PM2_TDDR_TOP_ANA_PDWN_PM2(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ANA_PDWN_PM2_TDDR_TOP_ANA_PDWN_PM2_SHIFT)) & SYSCTL2_ANA_PDWN_PM2_TDDR_TOP_ANA_PDWN_PM2_MASK)\r\n\r\n#define SYSCTL2_ANA_PDWN_PM2_TCPU_TOP_ANA_PDWN_PM2_MASK (0x20U)\r\n#define SYSCTL2_ANA_PDWN_PM2_TCPU_TOP_ANA_PDWN_PM2_SHIFT (5U)\r\n/*! TCPU_TOP_ANA_PDWN_PM2 - TCPU_TOP ana_pdwn control signal when PM2 mode, 1: TCPU_TOP is low power\r\n *    mode when PM2 0: TCPU_TOP is normal mode when PM2\r\n */\r\n#define SYSCTL2_ANA_PDWN_PM2_TCPU_TOP_ANA_PDWN_PM2(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ANA_PDWN_PM2_TCPU_TOP_ANA_PDWN_PM2_SHIFT)) & SYSCTL2_ANA_PDWN_PM2_TCPU_TOP_ANA_PDWN_PM2_MASK)\r\n\r\n#define SYSCTL2_ANA_PDWN_PM2_T3_ANA_PDWN_PM2_MASK (0x40U)\r\n#define SYSCTL2_ANA_PDWN_PM2_T3_ANA_PDWN_PM2_SHIFT (6U)\r\n/*! T3_ANA_PDWN_PM2 - T3 ana_pdwn control signal when PM2 mode, 1: T3 is low power mode when PM2 0: T3 is normal mode when PM2 */\r\n#define SYSCTL2_ANA_PDWN_PM2_T3_ANA_PDWN_PM2(x)  (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ANA_PDWN_PM2_T3_ANA_PDWN_PM2_SHIFT)) & SYSCTL2_ANA_PDWN_PM2_T3_ANA_PDWN_PM2_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOURCE_CLK_GATE - source clock gate control */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_SOURCE_CLK_GATE_TCPU_MCI_CLK_CG_MASK (0x1U)\r\n#define SYSCTL2_SOURCE_CLK_GATE_TCPU_MCI_CLK_CG_SHIFT (0U)\r\n/*! TCPU_MCI_CLK_CG - gate tcpu_mci_clk */\r\n#define SYSCTL2_SOURCE_CLK_GATE_TCPU_MCI_CLK_CG(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_SOURCE_CLK_GATE_TCPU_MCI_CLK_CG_SHIFT)) & SYSCTL2_SOURCE_CLK_GATE_TCPU_MCI_CLK_CG_MASK)\r\n\r\n#define SYSCTL2_SOURCE_CLK_GATE_TCPU_MCI_FLEXSPI_CLK_CG_MASK (0x2U)\r\n#define SYSCTL2_SOURCE_CLK_GATE_TCPU_MCI_FLEXSPI_CLK_CG_SHIFT (1U)\r\n/*! TCPU_MCI_FLEXSPI_CLK_CG - gate tcpu_mci_flexspi_clk */\r\n#define SYSCTL2_SOURCE_CLK_GATE_TCPU_MCI_FLEXSPI_CLK_CG(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_SOURCE_CLK_GATE_TCPU_MCI_FLEXSPI_CLK_CG_SHIFT)) & SYSCTL2_SOURCE_CLK_GATE_TCPU_MCI_FLEXSPI_CLK_CG_MASK)\r\n\r\n#define SYSCTL2_SOURCE_CLK_GATE_TDDR_MCI_ENET_CLK_CG_MASK (0x4U)\r\n#define SYSCTL2_SOURCE_CLK_GATE_TDDR_MCI_ENET_CLK_CG_SHIFT (2U)\r\n/*! TDDR_MCI_ENET_CLK_CG - gate tddr_mci_enet_clk */\r\n#define SYSCTL2_SOURCE_CLK_GATE_TDDR_MCI_ENET_CLK_CG(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_SOURCE_CLK_GATE_TDDR_MCI_ENET_CLK_CG_SHIFT)) & SYSCTL2_SOURCE_CLK_GATE_TDDR_MCI_ENET_CLK_CG_MASK)\r\n\r\n#define SYSCTL2_SOURCE_CLK_GATE_TDDR_MCI_FLEXSPI_CLK_CG_MASK (0x8U)\r\n#define SYSCTL2_SOURCE_CLK_GATE_TDDR_MCI_FLEXSPI_CLK_CG_SHIFT (3U)\r\n/*! TDDR_MCI_FLEXSPI_CLK_CG - gate tddr_mci_flexspi_clk */\r\n#define SYSCTL2_SOURCE_CLK_GATE_TDDR_MCI_FLEXSPI_CLK_CG(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_SOURCE_CLK_GATE_TDDR_MCI_FLEXSPI_CLK_CG_SHIFT)) & SYSCTL2_SOURCE_CLK_GATE_TDDR_MCI_FLEXSPI_CLK_CG_MASK)\r\n\r\n#define SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_48_60M_IRC_CG_MASK (0x10U)\r\n#define SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_48_60M_IRC_CG_SHIFT (4U)\r\n/*! T3PLL_MCI_48_60M_IRC_CG - gate t3pll_mci_48_60m_irc */\r\n#define SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_48_60M_IRC_CG(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_48_60M_IRC_CG_SHIFT)) & SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_48_60M_IRC_CG_MASK)\r\n\r\n#define SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_256M_CG_MASK (0x20U)\r\n#define SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_256M_CG_SHIFT (5U)\r\n/*! T3PLL_MCI_256M_CG - gate t3pll_mci_256m */\r\n#define SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_256M_CG(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_256M_CG_SHIFT)) & SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_256M_CG_MASK)\r\n\r\n#define SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_213P3M_CG_MASK (0x40U)\r\n#define SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_213P3M_CG_SHIFT (6U)\r\n/*! T3PLL_MCI_213P3M_CG - gate t3pll_mci_213p3m */\r\n#define SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_213P3M_CG(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_213P3M_CG_SHIFT)) & SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_213P3M_CG_MASK)\r\n\r\n#define SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_FLEXSPI_CLK_CG_MASK (0x80U)\r\n#define SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_FLEXSPI_CLK_CG_SHIFT (7U)\r\n/*! T3PLL_MCI_FLEXSPI_CLK_CG - gate t3pll_mci_flexspi_clk */\r\n#define SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_FLEXSPI_CLK_CG(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_FLEXSPI_CLK_CG_SHIFT)) & SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_FLEXSPI_CLK_CG_MASK)\r\n\r\n#define SYSCTL2_SOURCE_CLK_GATE_REFCLK_SYS_CG_MASK (0x200U)\r\n#define SYSCTL2_SOURCE_CLK_GATE_REFCLK_SYS_CG_SHIFT (9U)\r\n/*! REFCLK_SYS_CG - gate refclk_sys */\r\n#define SYSCTL2_SOURCE_CLK_GATE_REFCLK_SYS_CG(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_SOURCE_CLK_GATE_REFCLK_SYS_CG_SHIFT)) & SYSCTL2_SOURCE_CLK_GATE_REFCLK_SYS_CG_MASK)\r\n\r\n#define SYSCTL2_SOURCE_CLK_GATE_CPU_CLK_EN_MASK  (0x10000U)\r\n#define SYSCTL2_SOURCE_CLK_GATE_CPU_CLK_EN_SHIFT (16U)\r\n/*! CPU_CLK_EN - enable cpu clk(c0_fr_hclk) bypass PMU gate_cpu_clk control */\r\n#define SYSCTL2_SOURCE_CLK_GATE_CPU_CLK_EN(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_SOURCE_CLK_GATE_CPU_CLK_EN_SHIFT)) & SYSCTL2_SOURCE_CLK_GATE_CPU_CLK_EN_MASK)\r\n\r\n#define SYSCTL2_SOURCE_CLK_GATE_REFCLK_TCPU_CG_MASK (0x10000000U)\r\n#define SYSCTL2_SOURCE_CLK_GATE_REFCLK_TCPU_CG_SHIFT (28U)\r\n/*! REFCLK_TCPU_CG - gate CAU_PHY_RECLK_CPR_TCPU request when PM0; 1:request;0:no request */\r\n#define SYSCTL2_SOURCE_CLK_GATE_REFCLK_TCPU_CG(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_SOURCE_CLK_GATE_REFCLK_TCPU_CG_SHIFT)) & SYSCTL2_SOURCE_CLK_GATE_REFCLK_TCPU_CG_MASK)\r\n\r\n#define SYSCTL2_SOURCE_CLK_GATE_REFCLK_TDDR_CG_MASK (0x20000000U)\r\n#define SYSCTL2_SOURCE_CLK_GATE_REFCLK_TDDR_CG_SHIFT (29U)\r\n/*! REFCLK_TDDR_CG - gate CAU_PHY_RECLK_CPR_TDDR request when PM0; MCI request CAU gate reference\r\n *    clock for PHY in PM2 mode (when USB/AUD/TCPU/TDDR PLL are all power down); 1:request;0:no request\r\n */\r\n#define SYSCTL2_SOURCE_CLK_GATE_REFCLK_TDDR_CG(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_SOURCE_CLK_GATE_REFCLK_TDDR_CG_SHIFT)) & SYSCTL2_SOURCE_CLK_GATE_REFCLK_TDDR_CG_MASK)\r\n\r\n#define SYSCTL2_SOURCE_CLK_GATE_REFCLK_AUD_CG_MASK (0x40000000U)\r\n#define SYSCTL2_SOURCE_CLK_GATE_REFCLK_AUD_CG_SHIFT (30U)\r\n/*! REFCLK_AUD_CG - gate CAU_PHY_RECLK_CPR_AUD request when PM0; 1:request;0:no request */\r\n#define SYSCTL2_SOURCE_CLK_GATE_REFCLK_AUD_CG(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_SOURCE_CLK_GATE_REFCLK_AUD_CG_SHIFT)) & SYSCTL2_SOURCE_CLK_GATE_REFCLK_AUD_CG_MASK)\r\n\r\n#define SYSCTL2_SOURCE_CLK_GATE_REFCLK_USB_CG_MASK (0x80000000U)\r\n#define SYSCTL2_SOURCE_CLK_GATE_REFCLK_USB_CG_SHIFT (31U)\r\n/*! REFCLK_USB_CG - gate CAU_PHY_RECLK_CPR_USB request when PM0;1:request;0:no request */\r\n#define SYSCTL2_SOURCE_CLK_GATE_REFCLK_USB_CG(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_SOURCE_CLK_GATE_REFCLK_USB_CG_SHIFT)) & SYSCTL2_SOURCE_CLK_GATE_REFCLK_USB_CG_MASK)\r\n/*! @} */\r\n\r\n/*! @name TRNG_PWR_MODE - TRNG_PWR_MODE */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_TRNG_PWR_MODE_STOP_REQ_MASK      (0x1U)\r\n#define SYSCTL2_TRNG_PWR_MODE_STOP_REQ_SHIFT     (0U)\r\n/*! STOP_REQ - The bit is used as the SoC low-power request. It is generated to tell TRNG that the\r\n *    clock to TRNG is going to stop running. This signal will be asserted no less than two clocks\r\n *    before TRNG clock is stopped, to allow TRNG to prepare for stop mode.0: No request; 1:Request\r\n */\r\n#define SYSCTL2_TRNG_PWR_MODE_STOP_REQ(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_TRNG_PWR_MODE_STOP_REQ_SHIFT)) & SYSCTL2_TRNG_PWR_MODE_STOP_REQ_MASK)\r\n\r\n#define SYSCTL2_TRNG_PWR_MODE_STOP_ACK_MASK      (0x2U)\r\n#define SYSCTL2_TRNG_PWR_MODE_STOP_ACK_SHIFT     (1U)\r\n/*! STOP_ACK - The bit is used as the SoC low-power acknowledge. TRNG will generate this single\r\n *    clock cycle pulse one clock cycle after STOP_REQ has been asserted.0:No Acknowledge; 1:Acknowledge\r\n */\r\n#define SYSCTL2_TRNG_PWR_MODE_STOP_ACK(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_TRNG_PWR_MODE_STOP_ACK_SHIFT)) & SYSCTL2_TRNG_PWR_MODE_STOP_ACK_MASK)\r\n/*! @} */\r\n\r\n/*! @name TRNG_PIN_CTRL - TRNG_PIN_CTRL */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_TRNG_PIN_CTRL_ENABLE_MASK        (0x1U)\r\n#define SYSCTL2_TRNG_PIN_CTRL_ENABLE_SHIFT       (0U)\r\n/*! ENABLE - The bit is used to control the interface of TRNG. 0:Disable; 1: Enable */\r\n#define SYSCTL2_TRNG_PIN_CTRL_ENABLE(x)          (((uint32_t)(((uint32_t)(x)) << SYSCTL2_TRNG_PIN_CTRL_ENABLE_SHIFT)) & SYSCTL2_TRNG_PIN_CTRL_ENABLE_MASK)\r\n\r\n#define SYSCTL2_TRNG_PIN_CTRL_BUSY_MASK          (0x2U)\r\n#define SYSCTL2_TRNG_PIN_CTRL_BUSY_SHIFT         (1U)\r\n/*! BUSY - The bit indicate that the TRNG is busy. This happens when the TRNG is busy sampling the\r\n *    entropy bits and has not issued an entropy valid signal.0: Free; 1: Busy; this bit should be\r\n *    zero after ENABLE(bit0 in this register) is set\r\n */\r\n#define SYSCTL2_TRNG_PIN_CTRL_BUSY(x)            (((uint32_t)(((uint32_t)(x)) << SYSCTL2_TRNG_PIN_CTRL_BUSY_SHIFT)) & SYSCTL2_TRNG_PIN_CTRL_BUSY_MASK)\r\n\r\n#define SYSCTL2_TRNG_PIN_CTRL_HW_ERROR_MASK      (0x4U)\r\n#define SYSCTL2_TRNG_PIN_CTRL_HW_ERROR_SHIFT     (2U)\r\n/*! HW_ERROR - The bit indicate that the TRNG has generated a hardware error. This could be due to a\r\n *    Frequency Count Fail, a run time or power on reset parameter misconfiguration, and /or a\r\n *    failure of one or more of the built in internal entropy quality tests. The cause of the error can\r\n *    be decoded by checking the bits of the STATUS register of TRNG.0:No Error; 1: Error\r\n */\r\n#define SYSCTL2_TRNG_PIN_CTRL_HW_ERROR(x)        (((uint32_t)(((uint32_t)(x)) << SYSCTL2_TRNG_PIN_CTRL_HW_ERROR_SHIFT)) & SYSCTL2_TRNG_PIN_CTRL_HW_ERROR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CAU_CTRL - CAU control register */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_CAU_CTRL_SOC_REFCLK_RDY_MASK     (0x1U)\r\n#define SYSCTL2_CAU_CTRL_SOC_REFCLK_RDY_SHIFT    (0U)\r\n/*! SOC_REFCLK_RDY - REFCLK ready signal, if 1, can turn on PLL */\r\n#define SYSCTL2_CAU_CTRL_SOC_REFCLK_RDY(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_CAU_CTRL_SOC_REFCLK_RDY_SHIFT)) & SYSCTL2_CAU_CTRL_SOC_REFCLK_RDY_MASK)\r\n\r\n#define SYSCTL2_CAU_CTRL_MCI_XOSC_EN_MASK        (0x80000000U)\r\n#define SYSCTL2_CAU_CTRL_MCI_XOSC_EN_SHIFT       (31U)\r\n/*! MCI_XOSC_EN - mci request control different modes for CAU XTAL (1 for normal mode, 0 for sleep/full PD) */\r\n#define SYSCTL2_CAU_CTRL_MCI_XOSC_EN(x)          (((uint32_t)(((uint32_t)(x)) << SYSCTL2_CAU_CTRL_MCI_XOSC_EN_SHIFT)) & SYSCTL2_CAU_CTRL_MCI_XOSC_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOC_CIU_RDY_MASK - SOC_CIU_RDY_MASK */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_SOC_CIU_RDY_MASK_SOC_CIU_RDY_MASK_MASK (0x1U)\r\n#define SYSCTL2_SOC_CIU_RDY_MASK_SOC_CIU_RDY_MASK_SHIFT (0U)\r\n/*! SOC_CIU_RDY_MASK - 1'b1:mask SOC_CIU_RDY, think its value is 1; 1'b0:unmask SOC_CIU_RDY, see its real value */\r\n#define SYSCTL2_SOC_CIU_RDY_MASK_SOC_CIU_RDY_MASK(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_SOC_CIU_RDY_MASK_SOC_CIU_RDY_MASK_SHIFT)) & SYSCTL2_SOC_CIU_RDY_MASK_SOC_CIU_RDY_MASK_MASK)\r\n/*! @} */\r\n\r\n/*! @name LE_AUDIO_TIMER_ENABLE - Enable bit for le audio timer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_LE_AUDIO_TIMER_ENABLE_ENABLE_MASK (0x1U)\r\n#define SYSCTL2_LE_AUDIO_TIMER_ENABLE_ENABLE_SHIFT (0U)\r\n/*! ENABLE - 1'b1:Timer is enabled; 1'b0:Timer is disabled */\r\n#define SYSCTL2_LE_AUDIO_TIMER_ENABLE_ENABLE(x)  (((uint32_t)(((uint32_t)(x)) << SYSCTL2_LE_AUDIO_TIMER_ENABLE_ENABLE_SHIFT)) & SYSCTL2_LE_AUDIO_TIMER_ENABLE_ENABLE_MASK)\r\n/*! @} */\r\n\r\n/*! @name LE_AUDIO_TIMER_CNT_CLR - Clear bit of internal counter */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_LE_AUDIO_TIMER_CNT_CLR_CLR_MASK  (0x1U)\r\n#define SYSCTL2_LE_AUDIO_TIMER_CNT_CLR_CLR_SHIFT (0U)\r\n/*! CLR - When timer is enabled, write 1 to clear internal counter, write 0 has no effect */\r\n#define SYSCTL2_LE_AUDIO_TIMER_CNT_CLR_CLR(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_LE_AUDIO_TIMER_CNT_CLR_CLR_SHIFT)) & SYSCTL2_LE_AUDIO_TIMER_CNT_CLR_CLR_MASK)\r\n/*! @} */\r\n\r\n/*! @name LE_AUDIO_TIMER_CNT0 - Counter value captured by trigger0 */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_LE_AUDIO_TIMER_CNT0_CNT0_MASK    (0xFFFFFFFFU)\r\n#define SYSCTL2_LE_AUDIO_TIMER_CNT0_CNT0_SHIFT   (0U)\r\n/*! CNT0 - Counter value captured by trigger0 */\r\n#define SYSCTL2_LE_AUDIO_TIMER_CNT0_CNT0(x)      (((uint32_t)(((uint32_t)(x)) << SYSCTL2_LE_AUDIO_TIMER_CNT0_CNT0_SHIFT)) & SYSCTL2_LE_AUDIO_TIMER_CNT0_CNT0_MASK)\r\n/*! @} */\r\n\r\n/*! @name LE_AUDIO_TIMER_CNT1 - Counter value captured by trigger1 */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_LE_AUDIO_TIMER_CNT1_CNT1_MASK    (0xFFFFFFFFU)\r\n#define SYSCTL2_LE_AUDIO_TIMER_CNT1_CNT1_SHIFT   (0U)\r\n/*! CNT1 - Counter value captured by trigger1 */\r\n#define SYSCTL2_LE_AUDIO_TIMER_CNT1_CNT1(x)      (((uint32_t)(((uint32_t)(x)) << SYSCTL2_LE_AUDIO_TIMER_CNT1_CNT1_SHIFT)) & SYSCTL2_LE_AUDIO_TIMER_CNT1_CNT1_MASK)\r\n/*! @} */\r\n\r\n/*! @name LE_AUDIO_TIMER_CNT2 - Counter value captured by trigger2 */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_LE_AUDIO_TIMER_CNT2_CNT2_MASK    (0xFFFFFFFFU)\r\n#define SYSCTL2_LE_AUDIO_TIMER_CNT2_CNT2_SHIFT   (0U)\r\n/*! CNT2 - Counter value captured by trigger2 */\r\n#define SYSCTL2_LE_AUDIO_TIMER_CNT2_CNT2(x)      (((uint32_t)(((uint32_t)(x)) << SYSCTL2_LE_AUDIO_TIMER_CNT2_CNT2_SHIFT)) & SYSCTL2_LE_AUDIO_TIMER_CNT2_CNT2_MASK)\r\n/*! @} */\r\n\r\n/*! @name AVPLL_CTRL13 - Audio PLL Control register13 */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_AVPLL_CTRL13_AVPLL_RESET_C2_MASK (0x1U)\r\n#define SYSCTL2_AVPLL_CTRL13_AVPLL_RESET_C2_SHIFT (0U)\r\n/*! AVPLL_RESET_C2 - C2 SW Reset . Active high */\r\n#define SYSCTL2_AVPLL_CTRL13_AVPLL_RESET_C2(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL13_AVPLL_RESET_C2_SHIFT)) & SYSCTL2_AVPLL_CTRL13_AVPLL_RESET_C2_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL13_RESERVE_IN_C2_MASK  (0x600U)\r\n#define SYSCTL2_AVPLL_CTRL13_RESERVE_IN_C2_SHIFT (9U)\r\n/*! RESERVE_IN_C2 - Reserved pins */\r\n#define SYSCTL2_AVPLL_CTRL13_RESERVE_IN_C2(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL13_RESERVE_IN_C2_SHIFT)) & SYSCTL2_AVPLL_CTRL13_RESERVE_IN_C2_MASK)\r\n\r\n#define SYSCTL2_AVPLL_CTRL13_P_SYNC2_C2_MASK     (0x7FFFF800U)\r\n#define SYSCTL2_AVPLL_CTRL13_P_SYNC2_C2_SHIFT    (11U)\r\n/*! P_SYNC2_C2 - Set DPLL¡¯s Feedback Divider */\r\n#define SYSCTL2_AVPLL_CTRL13_P_SYNC2_C2(x)       (((uint32_t)(((uint32_t)(x)) << SYSCTL2_AVPLL_CTRL13_P_SYNC2_C2_SHIFT)) & SYSCTL2_AVPLL_CTRL13_P_SYNC2_C2_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_STATUS - CPU Code Bus Access Sram Checker Violation Status */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_STATUS_STATUS_MASK (0x7FFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_STATUS_STATUS_SHIFT (0U)\r\n/*! STATUS - for each of these 19 bits: 0- No violation; 1-violation happened */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_STATUS_STATUS(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_STATUS_STATUS_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_STATUS_STATUS_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_CLR - CPU Code Bus Access Sram Checker Violation Status Clear */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_CLR_STATUS_CLR_MASK (0x7FFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_CLR_STATUS_CLR_SHIFT (0U)\r\n/*! STATUS_CLR - Write '1' to clear Violation Status bit; These bits are self-clear */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_CLR_STATUS_CLR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_CLR_STATUS_CLR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_CLR_STATUS_CLR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_STATUS - CPU SYS Bus Access Sram Checker Violation Status */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_STATUS_STATUS_MASK (0x7FFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_STATUS_STATUS_SHIFT (0U)\r\n/*! STATUS - for each of these 19 bits: 0- No violation; 1-violation happened */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_STATUS_STATUS(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_STATUS_STATUS_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_STATUS_STATUS_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_CLR - CPU SYS Bus Access Sram Checker Violation Status Clear */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_CLR_STATUS_CLR_MASK (0x7FFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_CLR_STATUS_CLR_SHIFT (0U)\r\n/*! STATUS_CLR - Write '1' to clear Violation Status bit; These bits are self-clear */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_CLR_STATUS_CLR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_CLR_STATUS_CLR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_CLR_STATUS_CLR_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOC_MCI_EXTRA - Reserved register */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_SOC_MCI_EXTRA_SOC_MCI_EXTRA_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_SOC_MCI_EXTRA_SOC_MCI_EXTRA_SHIFT (0U)\r\n/*! SOC_MCI_EXTRA - Reserved register */\r\n#define SYSCTL2_SOC_MCI_EXTRA_SOC_MCI_EXTRA(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_SOC_MCI_EXTRA_SOC_MCI_EXTRA_SHIFT)) & SYSCTL2_SOC_MCI_EXTRA_SOC_MCI_EXTRA_MASK)\r\n/*! @} */\r\n\r\n/*! @name MCI_SOC_EXTRA - Reserved register */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MCI_SOC_EXTRA_MCI_SOC_EXTRA_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MCI_SOC_EXTRA_MCI_SOC_EXTRA_SHIFT (0U)\r\n/*! MCI_SOC_EXTRA - Reserved register */\r\n#define SYSCTL2_MCI_SOC_EXTRA_MCI_SOC_EXTRA(x)   (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MCI_SOC_EXTRA_MCI_SOC_EXTRA_SHIFT)) & SYSCTL2_MCI_SOC_EXTRA_MCI_SOC_EXTRA_MASK)\r\n/*! @} */\r\n\r\n/*! @name ROM_DYN_CLK_EN - To control dynamic clock gating of the rom clock */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_ROM_DYN_CLK_EN_ROM_DYN_CLK_EN_MASK (0x2U)\r\n#define SYSCTL2_ROM_DYN_CLK_EN_ROM_DYN_CLK_EN_SHIFT (1U)\r\n/*! ROM_DYN_CLK_EN - To control dynamic clock gating of the rom clock\r\n *  0b0..Disable the clock gating\r\n *  0b1..Enable the clock gating\r\n */\r\n#define SYSCTL2_ROM_DYN_CLK_EN_ROM_DYN_CLK_EN(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_ROM_DYN_CLK_EN_ROM_DYN_CLK_EN_SHIFT)) & SYSCTL2_ROM_DYN_CLK_EN_ROM_DYN_CLK_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVED_REG1 - Reserved register */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_RESERVED_REG1_RESERVED_REG_MASK  (0xFFFFFFFFU)\r\n#define SYSCTL2_RESERVED_REG1_RESERVED_REG_SHIFT (0U)\r\n/*! RESERVED_REG - Reserved register */\r\n#define SYSCTL2_RESERVED_REG1_RESERVED_REG(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RESERVED_REG1_RESERVED_REG_SHIFT)) & SYSCTL2_RESERVED_REG1_RESERVED_REG_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVED_REG2 - Reserved register */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_RESERVED_REG2_RESERVED_REG_MASK  (0xFFFFFFFFU)\r\n#define SYSCTL2_RESERVED_REG2_RESERVED_REG_SHIFT (0U)\r\n/*! RESERVED_REG - Reserved register */\r\n#define SYSCTL2_RESERVED_REG2_RESERVED_REG(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RESERVED_REG2_RESERVED_REG_SHIFT)) & SYSCTL2_RESERVED_REG2_RESERVED_REG_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVED_REG3 - Reserved register */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_RESERVED_REG3_RESERVED_REG_MASK  (0xFFFFFFFFU)\r\n#define SYSCTL2_RESERVED_REG3_RESERVED_REG_SHIFT (0U)\r\n/*! RESERVED_REG - Reserved register */\r\n#define SYSCTL2_RESERVED_REG3_RESERVED_REG(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RESERVED_REG3_RESERVED_REG_SHIFT)) & SYSCTL2_RESERVED_REG3_RESERVED_REG_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVED_REG4 - Reserved register */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_RESERVED_REG4_RESERVED_REG_MASK  (0xFFFFFFFFU)\r\n#define SYSCTL2_RESERVED_REG4_RESERVED_REG_SHIFT (0U)\r\n/*! RESERVED_REG - Reserved register */\r\n#define SYSCTL2_RESERVED_REG4_RESERVED_REG(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RESERVED_REG4_RESERVED_REG_SHIFT)) & SYSCTL2_RESERVED_REG4_RESERVED_REG_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVED_REG5 - Reserved register */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_RESERVED_REG5_RESERVED_REG_MASK  (0xFFFFFFFFU)\r\n#define SYSCTL2_RESERVED_REG5_RESERVED_REG_SHIFT (0U)\r\n/*! RESERVED_REG - Reserved register */\r\n#define SYSCTL2_RESERVED_REG5_RESERVED_REG(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RESERVED_REG5_RESERVED_REG_SHIFT)) & SYSCTL2_RESERVED_REG5_RESERVED_REG_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVED_REG6 - Reserved register */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_RESERVED_REG6_RESERVED_REG_MASK  (0xFFFFFFFFU)\r\n#define SYSCTL2_RESERVED_REG6_RESERVED_REG_SHIFT (0U)\r\n/*! RESERVED_REG - Reserved register */\r\n#define SYSCTL2_RESERVED_REG6_RESERVED_REG(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RESERVED_REG6_RESERVED_REG_SHIFT)) & SYSCTL2_RESERVED_REG6_RESERVED_REG_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVED_REG7 - Reserved register */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_RESERVED_REG7_RESERVED_REG_MASK  (0xFFFFFFFFU)\r\n#define SYSCTL2_RESERVED_REG7_RESERVED_REG_SHIFT (0U)\r\n/*! RESERVED_REG - Reserved register */\r\n#define SYSCTL2_RESERVED_REG7_RESERVED_REG(x)    (((uint32_t)(((uint32_t)(x)) << SYSCTL2_RESERVED_REG7_RESERVED_REG_SHIFT)) & SYSCTL2_RESERVED_REG7_RESERVED_REG_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_ADDR0 - CPU CODE Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR0_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR0_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR0_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR0_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR0_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_MISC0 - CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC0_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC0_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC0_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC0_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC0_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC0_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC0_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC0_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC0_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC0_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC0_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC0_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC0_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC0_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC0_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_ADDR1 - CPU CODE Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR1_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR1_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR1_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR1_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR1_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_MISC1 - CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC1_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC1_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC1_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC1_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC1_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC1_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC1_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC1_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC1_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC1_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC1_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC1_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC1_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC1_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC1_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_ADDR2 - CPU CODE Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR2_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR2_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR2_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR2_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR2_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_MISC2 - CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC2_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC2_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC2_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC2_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC2_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC2_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC2_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC2_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC2_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC2_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC2_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC2_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC2_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC2_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC2_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_ADDR3 - CPU CODE Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR3_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR3_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR3_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR3_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR3_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_MISC3 - CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC3_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC3_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC3_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC3_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC3_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC3_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC3_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC3_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC3_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC3_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC3_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC3_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC3_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC3_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC3_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_ADDR4 - CPU CODE Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR4_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR4_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR4_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR4_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR4_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_MISC4 - CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC4_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC4_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC4_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC4_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC4_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC4_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC4_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC4_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC4_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC4_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC4_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC4_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC4_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC4_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC4_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_ADDR5 - CPU CODE Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR5_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR5_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR5_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR5_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR5_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_MISC5 - CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC5_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC5_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC5_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC5_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC5_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC5_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC5_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC5_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC5_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC5_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC5_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC5_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC5_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC5_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC5_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_ADDR6 - CPU CODE Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR6_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR6_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR6_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR6_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR6_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_MISC6 - CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC6_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC6_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC6_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC6_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC6_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC6_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC6_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC6_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC6_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC6_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC6_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC6_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC6_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC6_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC6_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_ADDR7 - CPU CODE Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR7_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR7_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR7_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR7_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR7_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_MISC7 - CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC7_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC7_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC7_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC7_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC7_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC7_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC7_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC7_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC7_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC7_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC7_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC7_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC7_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC7_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC7_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_ADDR8 - CPU CODE Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR8_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR8_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR8_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR8_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR8_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_MISC8 - CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC8_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC8_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC8_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC8_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC8_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC8_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC8_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC8_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC8_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC8_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC8_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC8_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC8_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC8_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC8_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_ADDR9 - CPU CODE Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR9_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR9_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR9_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR9_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR9_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_MISC9 - CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC9_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC9_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC9_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC9_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC9_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC9_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC9_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC9_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC9_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC9_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC9_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC9_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC9_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC9_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC9_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_ADDR10 - CPU CODE Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR10_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR10_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR10_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR10_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR10_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_MISC10 - CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC10_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC10_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC10_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC10_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC10_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC10_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC10_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC10_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC10_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC10_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC10_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC10_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC10_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC10_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC10_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_ADDR11 - CPU CODE Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR11_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR11_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR11_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR11_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR11_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_MISC11 - CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC11_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC11_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC11_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC11_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC11_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC11_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC11_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC11_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC11_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC11_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC11_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC11_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC11_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC11_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC11_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_ADDR12 - CPU CODE Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR12_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR12_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR12_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR12_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR12_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_MISC12 - CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC12_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC12_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC12_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC12_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC12_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC12_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC12_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC12_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC12_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC12_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC12_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC12_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC12_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC12_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC12_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_ADDR13 - CPU CODE Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR13_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR13_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR13_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR13_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR13_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_MISC13 - CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC13_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC13_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC13_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC13_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC13_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC13_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC13_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC13_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC13_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC13_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC13_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC13_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC13_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC13_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC13_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_ADDR14 - CPU CODE Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR14_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR14_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR14_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR14_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR14_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_MISC14 - CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC14_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC14_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC14_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC14_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC14_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC14_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC14_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC14_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC14_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC14_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC14_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC14_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC14_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC14_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC14_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_ADDR15 - CPU CODE Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR15_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR15_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR15_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR15_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR15_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_MISC15 - CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC15_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC15_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC15_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC15_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC15_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC15_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC15_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC15_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC15_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC15_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC15_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC15_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC15_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC15_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC15_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_ADDR16 - CPU CODE Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR16_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR16_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR16_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR16_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR16_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_MISC16 - CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC16_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC16_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC16_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC16_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC16_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC16_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC16_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC16_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC16_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC16_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC16_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC16_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC16_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC16_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC16_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_ADDR17 - CPU CODE Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR17_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR17_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR17_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR17_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR17_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_MISC17 - CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC17_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC17_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC17_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC17_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC17_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC17_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC17_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC17_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC17_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC17_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC17_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC17_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC17_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC17_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC17_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_ADDR18 - CPU CODE Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR18_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR18_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR18_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR18_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_ADDR18_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_CODE_VIO_MISC18 - CPU CODE Bus Access Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC18_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC18_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC18_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC18_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC18_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC18_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC18_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC18_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC18_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC18_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC18_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC18_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC18_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC18_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_CODE_VIO_MISC18_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_ADDR0 - CPU SYS Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR0_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR0_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR0_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR0_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR0_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_MISC0 - CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC0_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC0_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC0_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC0_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC0_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC0_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC0_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC0_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC0_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC0_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC0_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC0_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC0_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC0_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC0_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_ADDR1 - CPU SYS Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR1_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR1_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR1_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR1_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR1_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_MISC1 - CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC1_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC1_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC1_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC1_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC1_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC1_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC1_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC1_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC1_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC1_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC1_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC1_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC1_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC1_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC1_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_ADDR2 - CPU SYS Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR2_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR2_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR2_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR2_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR2_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_MISC2 - CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC2_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC2_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC2_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC2_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC2_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC2_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC2_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC2_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC2_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC2_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC2_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC2_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC2_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC2_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC2_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_ADDR3 - CPU SYS Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR3_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR3_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR3_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR3_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR3_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_MISC3 - CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC3_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC3_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC3_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC3_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC3_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC3_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC3_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC3_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC3_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC3_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC3_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC3_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC3_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC3_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC3_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_ADDR4 - CPU SYS Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR4_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR4_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR4_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR4_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR4_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_MISC4 - CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC4_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC4_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC4_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC4_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC4_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC4_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC4_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC4_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC4_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC4_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC4_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC4_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC4_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC4_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC4_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_ADDR5 - CPU SYS Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR5_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR5_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR5_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR5_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR5_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_MISC5 - CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC5_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC5_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC5_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC5_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC5_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC5_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC5_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC5_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC5_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC5_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC5_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC5_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC5_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC5_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC5_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_ADDR6 - CPU SYS Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR6_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR6_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR6_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR6_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR6_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_MISC6 - CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC6_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC6_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC6_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC6_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC6_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC6_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC6_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC6_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC6_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC6_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC6_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC6_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC6_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC6_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC6_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_ADDR7 - CPU SYS Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR7_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR7_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR7_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR7_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR7_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_MISC7 - CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC7_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC7_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC7_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC7_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC7_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC7_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC7_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC7_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC7_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC7_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC7_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC7_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC7_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC7_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC7_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_ADDR8 - CPU SYS Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR8_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR8_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR8_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR8_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR8_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_MISC8 - CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC8_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC8_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC8_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC8_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC8_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC8_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC8_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC8_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC8_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC8_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC8_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC8_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC8_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC8_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC8_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_ADDR9 - CPU SYS Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR9_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR9_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR9_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR9_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR9_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_MISC9 - CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC9_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC9_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC9_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC9_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC9_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC9_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC9_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC9_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC9_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC9_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC9_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC9_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC9_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC9_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC9_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_ADDR10 - CPU SYS Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR10_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR10_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR10_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR10_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR10_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_MISC10 - CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC10_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC10_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC10_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC10_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC10_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC10_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC10_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC10_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC10_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC10_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC10_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC10_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC10_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC10_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC10_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_ADDR11 - CPU SYS Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR11_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR11_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR11_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR11_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR11_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_MISC11 - CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC11_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC11_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC11_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC11_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC11_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC11_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC11_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC11_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC11_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC11_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC11_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC11_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC11_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC11_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC11_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_ADDR12 - CPU SYS Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR12_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR12_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR12_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR12_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR12_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_MISC12 - CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC12_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC12_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC12_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC12_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC12_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC12_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC12_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC12_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC12_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC12_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC12_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC12_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC12_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC12_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC12_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_ADDR13 - CPU SYS Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR13_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR13_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR13_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR13_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR13_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_MISC13 - CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC13_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC13_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC13_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC13_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC13_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC13_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC13_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC13_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC13_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC13_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC13_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC13_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC13_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC13_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC13_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_ADDR14 - CPU SYS Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR14_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR14_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR14_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR14_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR14_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_MISC14 - CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC14_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC14_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC14_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC14_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC14_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC14_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC14_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC14_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC14_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC14_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC14_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC14_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC14_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC14_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC14_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_ADDR15 - CPU SYS Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR15_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR15_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR15_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR15_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR15_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_MISC15 - CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC15_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC15_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC15_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC15_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC15_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC15_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC15_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC15_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC15_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC15_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC15_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC15_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC15_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC15_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC15_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_ADDR16 - CPU SYS Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR16_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR16_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR16_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR16_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR16_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_MISC16 - CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC16_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC16_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC16_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC16_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC16_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC16_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC16_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC16_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC16_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC16_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC16_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC16_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC16_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC16_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC16_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_ADDR17 - CPU SYS Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR17_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR17_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR17_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR17_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR17_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_MISC17 - CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC17_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC17_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC17_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC17_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC17_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC17_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC17_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC17_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC17_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC17_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC17_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC17_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC17_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC17_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC17_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_ADDR18 - CPU SYS Bus Access Sram Checker: Address of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR18_ADDR_MASK (0xFFFFFFFFU)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR18_ADDR_SHIFT (0U)\r\n/*! ADDR - Address of Violated Transfer */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR18_ADDR(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR18_ADDR_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_ADDR18_ADDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name MEM_ACC_CHK_SYS_VIO_MISC18 - CPU SYS BusAccess Sram Checker: Misc information of Violated Transfer */\r\n/*! @{ */\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC18_WRITE_MASK (0x1U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC18_WRITE_SHIFT (0U)\r\n/*! WRITE - HWRITE of Violated Transfer. 1-Write; 0-Read */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC18_WRITE(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC18_WRITE_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC18_WRITE_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC18_HPROT0_MASK (0x2U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC18_HPROT0_SHIFT (1U)\r\n/*! HPROT0 - HPROT0 of Violated Transfer. 1-Data Access; 0-OPCODE */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC18_HPROT0(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC18_HPROT0_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC18_HPROT0_MASK)\r\n\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC18_HSEC_LEVEL_MASK (0xF0U)\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC18_HSEC_LEVEL_SHIFT (4U)\r\n/*! HSEC_LEVEL - HSEC_LEVEL of Violated Transfer. */\r\n#define SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC18_HSEC_LEVEL(x) (((uint32_t)(((uint32_t)(x)) << SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC18_HSEC_LEVEL_SHIFT)) & SYSCTL2_MEM_ACC_CHK_SYS_VIO_MISC18_HSEC_LEVEL_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SYSCTL2_Register_Masks */\r\n\r\n\r\n/* SYSCTL2 - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral SYSCTL2 base address */\r\n  #define SYSCTL2_BASE                             (0x50003000u)\r\n  /** Peripheral SYSCTL2 base address */\r\n  #define SYSCTL2_BASE_NS                          (0x40003000u)\r\n  /** Peripheral SYSCTL2 base pointer */\r\n  #define SYSCTL2                                  ((SYSCTL2_Type *)SYSCTL2_BASE)\r\n  /** Peripheral SYSCTL2 base pointer */\r\n  #define SYSCTL2_NS                               ((SYSCTL2_Type *)SYSCTL2_BASE_NS)\r\n  /** Array initializer of SYSCTL2 peripheral base addresses */\r\n  #define SYSCTL2_BASE_ADDRS                       { SYSCTL2_BASE }\r\n  /** Array initializer of SYSCTL2 peripheral base pointers */\r\n  #define SYSCTL2_BASE_PTRS                        { SYSCTL2 }\r\n  /** Array initializer of SYSCTL2 peripheral base addresses */\r\n  #define SYSCTL2_BASE_ADDRS_NS                    { SYSCTL2_BASE_NS }\r\n  /** Array initializer of SYSCTL2 peripheral base pointers */\r\n  #define SYSCTL2_BASE_PTRS_NS                     { SYSCTL2_NS }\r\n#else\r\n  /** Peripheral SYSCTL2 base address */\r\n  #define SYSCTL2_BASE                             (0x40003000u)\r\n  /** Peripheral SYSCTL2 base pointer */\r\n  #define SYSCTL2                                  ((SYSCTL2_Type *)SYSCTL2_BASE)\r\n  /** Array initializer of SYSCTL2 peripheral base addresses */\r\n  #define SYSCTL2_BASE_ADDRS                       { SYSCTL2_BASE }\r\n  /** Array initializer of SYSCTL2 peripheral base pointers */\r\n  #define SYSCTL2_BASE_PTRS                        { SYSCTL2 }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SYSCTL2_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SYSPLL_T3 Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SYSPLL_T3_Peripheral_Access_Layer SYSPLL_T3 Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** SYSPLL_T3 - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[192];\r\n  __I  uint8_t SYSBYPASS_SOC_CTRL_ONE_RO_REG;      /**< offset: 0xC0 */\r\n  __I  uint8_t SYSBYPASS_SOC_CTRL_TWO_RO_REG;      /**< offset: 0xC1 */\r\n  __I  uint8_t SYSBYPASS_SOC_CTRL_THREE_RO_REG;    /**< offset: 0xC2 */\r\n  __I  uint8_t SYSBYPASS_BBUD_CTRL_ONE_RO_REG;     /**< offset: 0xC3 */\r\n  __I  uint8_t REG_RO_REG;                         /**< offset: 0xC4 */\r\n  __IO uint8_t SYS_CTRL_REG;                       /**< offset: 0xC5 */\r\n  __IO uint8_t SYSBYPASS_SOC_CTRL_ONE_RW_REG;      /**< offset: 0xC6 */\r\n  __IO uint8_t SYSBYPASS_SOC_CTRL_TWO_RW_REG;      /**< offset: 0xC7 */\r\n  __IO uint8_t SYSBYPASS_SOC_CTRL_THREE_RW_REG;    /**< offset: 0xC8 */\r\n  __IO uint8_t SYSBYPASS_BBUD_CTRL_FOUR_RW_REG;    /**< offset: 0xC9 */\r\n  __IO uint8_t T3_CTRL_ONE_REG;                    /**< offset: 0xCA */\r\n  __IO uint8_t T3_CTRL_TWO_REG;                    /**< offset: 0xCB */\r\n  __IO uint8_t T3_CTRL_THREE_REG;                  /**< offset: 0xCC */\r\n  __IO uint8_t T3_CTRL_FOUR_REG;                   /**< offset: 0xCD */\r\n  __IO uint8_t T3_CTRL_FIVE_REG;                   /**< offset: 0xCE */\r\n  __IO uint8_t T3_CTRL_SIX_REG;                    /**< offset: 0xCF */\r\n  __IO uint8_t T3_CTRL_SEVEN_REG;                  /**< offset: 0xD0 */\r\n  __IO uint8_t T3_CTRL_EIGHT_REG;                  /**< offset: 0xD1 */\r\n  __IO uint8_t T3_CTRL_NINE_REG;                   /**< offset: 0xD2 */\r\n  __IO uint8_t T3_CTRL_TEN_REG;                    /**< offset: 0xD3 */\r\n  __IO uint8_t CLKTREE_CTRL_ONE_REG;               /**< offset: 0xD4 */\r\n  __IO uint8_t CLKTREE_CTRL_TWO_REG;               /**< offset: 0xD5 */\r\n  __IO uint8_t CLKTREE_CTRL_THREE_REG;             /**< offset: 0xD6 */\r\n  __IO uint8_t CLKTREE_CTRL_FOUR_REG;              /**< offset: 0xD7 */\r\n  __IO uint8_t CLKTREE_CTRL_FIVE_REG;              /**< offset: 0xD8 */\r\n  __IO uint8_t CLKTREE_CTRL_SIX_REG;               /**< offset: 0xD9 */\r\n  __IO uint8_t GPIO_CTRL_REG;                      /**< offset: 0xDA */\r\n  __IO uint8_t ATEST_CTRL_REG;                     /**< offset: 0xDB */\r\n  __IO uint8_t RESERVED_LO_ONE_REG;                /**< offset: 0xDC */\r\n  __IO uint8_t RESERVED_HI_ONE_REG;                /**< offset: 0xDD */\r\n  __IO uint8_t RESERVED_MIX_ONE_REG;               /**< offset: 0xDE */\r\n  __IO uint8_t RESERVED_MIX_TWO_REG;               /**< offset: 0xDF */\r\n} SYSPLL_T3_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SYSPLL_T3 Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SYSPLL_T3_Register_Masks SYSPLL_T3 Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name SYSBYPASS_SOC_CTRL_ONE_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_SYSBYPASS_SOC_CTRL_ONE_RO_REG_SYSBYPASS_SOC_CTRL_ONE_RO_MASK (0xFFU)\r\n#define SYSPLL_T3_SYSBYPASS_SOC_CTRL_ONE_RO_REG_SYSBYPASS_SOC_CTRL_ONE_RO_SHIFT (0U)\r\n/*! SYSBYPASS_SOC_CTRL_ONE_RO - SYSBYPASS_SOC_CTRL_ONE_RO */\r\n#define SYSPLL_T3_SYSBYPASS_SOC_CTRL_ONE_RO_REG_SYSBYPASS_SOC_CTRL_ONE_RO(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_SYSBYPASS_SOC_CTRL_ONE_RO_REG_SYSBYPASS_SOC_CTRL_ONE_RO_SHIFT)) & SYSPLL_T3_SYSBYPASS_SOC_CTRL_ONE_RO_REG_SYSBYPASS_SOC_CTRL_ONE_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSBYPASS_SOC_CTRL_TWO_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_SYSBYPASS_SOC_CTRL_TWO_RO_REG_SYSBYPASS_SOC_CTRL_TWO_RO_MASK (0xFFU)\r\n#define SYSPLL_T3_SYSBYPASS_SOC_CTRL_TWO_RO_REG_SYSBYPASS_SOC_CTRL_TWO_RO_SHIFT (0U)\r\n/*! SYSBYPASS_SOC_CTRL_TWO_RO - SYSBYPASS_SOC_CTRL_TWO_RO */\r\n#define SYSPLL_T3_SYSBYPASS_SOC_CTRL_TWO_RO_REG_SYSBYPASS_SOC_CTRL_TWO_RO(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_SYSBYPASS_SOC_CTRL_TWO_RO_REG_SYSBYPASS_SOC_CTRL_TWO_RO_SHIFT)) & SYSPLL_T3_SYSBYPASS_SOC_CTRL_TWO_RO_REG_SYSBYPASS_SOC_CTRL_TWO_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSBYPASS_SOC_CTRL_THREE_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_SYSBYPASS_SOC_CTRL_THREE_RO_REG_SYSBYPASS_SOC_CTRL_THREE_RO_MASK (0xFFU)\r\n#define SYSPLL_T3_SYSBYPASS_SOC_CTRL_THREE_RO_REG_SYSBYPASS_SOC_CTRL_THREE_RO_SHIFT (0U)\r\n/*! SYSBYPASS_SOC_CTRL_THREE_RO - SYSBYPASS_SOC_CTRL_THREE_RO */\r\n#define SYSPLL_T3_SYSBYPASS_SOC_CTRL_THREE_RO_REG_SYSBYPASS_SOC_CTRL_THREE_RO(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_SYSBYPASS_SOC_CTRL_THREE_RO_REG_SYSBYPASS_SOC_CTRL_THREE_RO_SHIFT)) & SYSPLL_T3_SYSBYPASS_SOC_CTRL_THREE_RO_REG_SYSBYPASS_SOC_CTRL_THREE_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSBYPASS_BBUD_CTRL_ONE_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_SYSBYPASS_BBUD_CTRL_ONE_RO_REG_SYSBYPASS_BBUD_CTRL_FOUR_RO_MASK (0xFFU)\r\n#define SYSPLL_T3_SYSBYPASS_BBUD_CTRL_ONE_RO_REG_SYSBYPASS_BBUD_CTRL_FOUR_RO_SHIFT (0U)\r\n/*! SYSBYPASS_BBUD_CTRL_FOUR_RO - SYSBYPASS_BBUD_CTRL_FOUR_RO */\r\n#define SYSPLL_T3_SYSBYPASS_BBUD_CTRL_ONE_RO_REG_SYSBYPASS_BBUD_CTRL_FOUR_RO(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_SYSBYPASS_BBUD_CTRL_ONE_RO_REG_SYSBYPASS_BBUD_CTRL_FOUR_RO_SHIFT)) & SYSPLL_T3_SYSBYPASS_BBUD_CTRL_ONE_RO_REG_SYSBYPASS_BBUD_CTRL_FOUR_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name REG_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_REG_RO_REG_REG_RO_MASK         (0xFFU)\r\n#define SYSPLL_T3_REG_RO_REG_REG_RO_SHIFT        (0U)\r\n/*! REG_RO - REG_RO */\r\n#define SYSPLL_T3_REG_RO_REG_REG_RO(x)           (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_REG_RO_REG_REG_RO_SHIFT)) & SYSPLL_T3_REG_RO_REG_REG_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYS_CTRL_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_SYS_CTRL_REG_SYS_CTRL_MASK     (0xFFU)\r\n#define SYSPLL_T3_SYS_CTRL_REG_SYS_CTRL_SHIFT    (0U)\r\n/*! SYS_CTRL - SYS_CTRL */\r\n#define SYSPLL_T3_SYS_CTRL_REG_SYS_CTRL(x)       (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_SYS_CTRL_REG_SYS_CTRL_SHIFT)) & SYSPLL_T3_SYS_CTRL_REG_SYS_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSBYPASS_SOC_CTRL_ONE_RW_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_SYSBYPASS_SOC_CTRL_ONE_RW_REG_SYSBYPASS_SOC_CTRL_ONE_RW_MASK (0xFFU)\r\n#define SYSPLL_T3_SYSBYPASS_SOC_CTRL_ONE_RW_REG_SYSBYPASS_SOC_CTRL_ONE_RW_SHIFT (0U)\r\n/*! SYSBYPASS_SOC_CTRL_ONE_RW - SYSBYPASS_SOC_CTRL_ONE_RW */\r\n#define SYSPLL_T3_SYSBYPASS_SOC_CTRL_ONE_RW_REG_SYSBYPASS_SOC_CTRL_ONE_RW(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_SYSBYPASS_SOC_CTRL_ONE_RW_REG_SYSBYPASS_SOC_CTRL_ONE_RW_SHIFT)) & SYSPLL_T3_SYSBYPASS_SOC_CTRL_ONE_RW_REG_SYSBYPASS_SOC_CTRL_ONE_RW_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSBYPASS_SOC_CTRL_TWO_RW_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_SYSBYPASS_SOC_CTRL_TWO_RW_REG_SYSBYPASS_SOC_CTRL_TWO_RW_MASK (0xFFU)\r\n#define SYSPLL_T3_SYSBYPASS_SOC_CTRL_TWO_RW_REG_SYSBYPASS_SOC_CTRL_TWO_RW_SHIFT (0U)\r\n/*! SYSBYPASS_SOC_CTRL_TWO_RW - SYSBYPASS_SOC_CTRL_TWO_RW */\r\n#define SYSPLL_T3_SYSBYPASS_SOC_CTRL_TWO_RW_REG_SYSBYPASS_SOC_CTRL_TWO_RW(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_SYSBYPASS_SOC_CTRL_TWO_RW_REG_SYSBYPASS_SOC_CTRL_TWO_RW_SHIFT)) & SYSPLL_T3_SYSBYPASS_SOC_CTRL_TWO_RW_REG_SYSBYPASS_SOC_CTRL_TWO_RW_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSBYPASS_SOC_CTRL_THREE_RW_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_SYSBYPASS_SOC_CTRL_THREE_RW_REG_SYSBYPASS_SOC_CTRL_THREE_RW_MASK (0xFFU)\r\n#define SYSPLL_T3_SYSBYPASS_SOC_CTRL_THREE_RW_REG_SYSBYPASS_SOC_CTRL_THREE_RW_SHIFT (0U)\r\n/*! SYSBYPASS_SOC_CTRL_THREE_RW - SYSBYPASS_SOC_CTRL_THREE_RW */\r\n#define SYSPLL_T3_SYSBYPASS_SOC_CTRL_THREE_RW_REG_SYSBYPASS_SOC_CTRL_THREE_RW(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_SYSBYPASS_SOC_CTRL_THREE_RW_REG_SYSBYPASS_SOC_CTRL_THREE_RW_SHIFT)) & SYSPLL_T3_SYSBYPASS_SOC_CTRL_THREE_RW_REG_SYSBYPASS_SOC_CTRL_THREE_RW_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSBYPASS_BBUD_CTRL_FOUR_RW_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_SYSBYPASS_BBUD_CTRL_FOUR_RW_REG_SYSBYPASS_BBUD_CTRL_FOUR_RW_MASK (0xFFU)\r\n#define SYSPLL_T3_SYSBYPASS_BBUD_CTRL_FOUR_RW_REG_SYSBYPASS_BBUD_CTRL_FOUR_RW_SHIFT (0U)\r\n/*! SYSBYPASS_BBUD_CTRL_FOUR_RW - SYSBYPASS_BBUD_CTRL_FOUR_RW */\r\n#define SYSPLL_T3_SYSBYPASS_BBUD_CTRL_FOUR_RW_REG_SYSBYPASS_BBUD_CTRL_FOUR_RW(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_SYSBYPASS_BBUD_CTRL_FOUR_RW_REG_SYSBYPASS_BBUD_CTRL_FOUR_RW_SHIFT)) & SYSPLL_T3_SYSBYPASS_BBUD_CTRL_FOUR_RW_REG_SYSBYPASS_BBUD_CTRL_FOUR_RW_MASK)\r\n/*! @} */\r\n\r\n/*! @name T3_CTRL_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_T3_CTRL_ONE_REG_T3_CTRL_ONE_MASK (0xFFU)\r\n#define SYSPLL_T3_T3_CTRL_ONE_REG_T3_CTRL_ONE_SHIFT (0U)\r\n/*! T3_CTRL_ONE - T3_CTRL_ONE */\r\n#define SYSPLL_T3_T3_CTRL_ONE_REG_T3_CTRL_ONE(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_T3_CTRL_ONE_REG_T3_CTRL_ONE_SHIFT)) & SYSPLL_T3_T3_CTRL_ONE_REG_T3_CTRL_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name T3_CTRL_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_T3_CTRL_TWO_REG_T3_CTRL_TWO_MASK (0xFFU)\r\n#define SYSPLL_T3_T3_CTRL_TWO_REG_T3_CTRL_TWO_SHIFT (0U)\r\n/*! T3_CTRL_TWO - T3_CTRL_TWO */\r\n#define SYSPLL_T3_T3_CTRL_TWO_REG_T3_CTRL_TWO(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_T3_CTRL_TWO_REG_T3_CTRL_TWO_SHIFT)) & SYSPLL_T3_T3_CTRL_TWO_REG_T3_CTRL_TWO_MASK)\r\n/*! @} */\r\n\r\n/*! @name T3_CTRL_THREE_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_T3_CTRL_THREE_REG_T3_CTRL_THREE_MASK (0xFFU)\r\n#define SYSPLL_T3_T3_CTRL_THREE_REG_T3_CTRL_THREE_SHIFT (0U)\r\n/*! T3_CTRL_THREE - T3_CTRL_THREE */\r\n#define SYSPLL_T3_T3_CTRL_THREE_REG_T3_CTRL_THREE(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_T3_CTRL_THREE_REG_T3_CTRL_THREE_SHIFT)) & SYSPLL_T3_T3_CTRL_THREE_REG_T3_CTRL_THREE_MASK)\r\n/*! @} */\r\n\r\n/*! @name T3_CTRL_FOUR_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_T3_CTRL_FOUR_REG_T3_CTRL_FOUR_MASK (0xFFU)\r\n#define SYSPLL_T3_T3_CTRL_FOUR_REG_T3_CTRL_FOUR_SHIFT (0U)\r\n/*! T3_CTRL_FOUR - T3_CTRL_FOUR */\r\n#define SYSPLL_T3_T3_CTRL_FOUR_REG_T3_CTRL_FOUR(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_T3_CTRL_FOUR_REG_T3_CTRL_FOUR_SHIFT)) & SYSPLL_T3_T3_CTRL_FOUR_REG_T3_CTRL_FOUR_MASK)\r\n/*! @} */\r\n\r\n/*! @name T3_CTRL_FIVE_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_T3_CTRL_FIVE_REG_T3_CTRL_FIVE_MASK (0xFFU)\r\n#define SYSPLL_T3_T3_CTRL_FIVE_REG_T3_CTRL_FIVE_SHIFT (0U)\r\n/*! T3_CTRL_FIVE - T3_CTRL_FIVE */\r\n#define SYSPLL_T3_T3_CTRL_FIVE_REG_T3_CTRL_FIVE(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_T3_CTRL_FIVE_REG_T3_CTRL_FIVE_SHIFT)) & SYSPLL_T3_T3_CTRL_FIVE_REG_T3_CTRL_FIVE_MASK)\r\n/*! @} */\r\n\r\n/*! @name T3_CTRL_SIX_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_T3_CTRL_SIX_REG_T3_CTRL_SIX_MASK (0xFFU)\r\n#define SYSPLL_T3_T3_CTRL_SIX_REG_T3_CTRL_SIX_SHIFT (0U)\r\n/*! T3_CTRL_SIX - T3_CTRL_SIX */\r\n#define SYSPLL_T3_T3_CTRL_SIX_REG_T3_CTRL_SIX(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_T3_CTRL_SIX_REG_T3_CTRL_SIX_SHIFT)) & SYSPLL_T3_T3_CTRL_SIX_REG_T3_CTRL_SIX_MASK)\r\n/*! @} */\r\n\r\n/*! @name T3_CTRL_SEVEN_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_T3_CTRL_SEVEN_REG_T3_CTRL_SEVEN_MASK (0xFFU)\r\n#define SYSPLL_T3_T3_CTRL_SEVEN_REG_T3_CTRL_SEVEN_SHIFT (0U)\r\n/*! T3_CTRL_SEVEN - T3_CTRL_SEVEN */\r\n#define SYSPLL_T3_T3_CTRL_SEVEN_REG_T3_CTRL_SEVEN(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_T3_CTRL_SEVEN_REG_T3_CTRL_SEVEN_SHIFT)) & SYSPLL_T3_T3_CTRL_SEVEN_REG_T3_CTRL_SEVEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name T3_CTRL_EIGHT_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_T3_CTRL_EIGHT_REG_T3_CTRL_EIGHT_MASK (0xFFU)\r\n#define SYSPLL_T3_T3_CTRL_EIGHT_REG_T3_CTRL_EIGHT_SHIFT (0U)\r\n/*! T3_CTRL_EIGHT - T3_CTRL_EIGHT */\r\n#define SYSPLL_T3_T3_CTRL_EIGHT_REG_T3_CTRL_EIGHT(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_T3_CTRL_EIGHT_REG_T3_CTRL_EIGHT_SHIFT)) & SYSPLL_T3_T3_CTRL_EIGHT_REG_T3_CTRL_EIGHT_MASK)\r\n/*! @} */\r\n\r\n/*! @name T3_CTRL_NINE_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_T3_CTRL_NINE_REG_T3_CTRL_NINE_MASK (0xFFU)\r\n#define SYSPLL_T3_T3_CTRL_NINE_REG_T3_CTRL_NINE_SHIFT (0U)\r\n/*! T3_CTRL_NINE - T3_CTRL_NINE */\r\n#define SYSPLL_T3_T3_CTRL_NINE_REG_T3_CTRL_NINE(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_T3_CTRL_NINE_REG_T3_CTRL_NINE_SHIFT)) & SYSPLL_T3_T3_CTRL_NINE_REG_T3_CTRL_NINE_MASK)\r\n/*! @} */\r\n\r\n/*! @name T3_CTRL_TEN_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_T3_CTRL_TEN_REG_T3_CTRL_TEN_MASK (0xFFU)\r\n#define SYSPLL_T3_T3_CTRL_TEN_REG_T3_CTRL_TEN_SHIFT (0U)\r\n/*! T3_CTRL_TEN - T3_CTRL_TEN */\r\n#define SYSPLL_T3_T3_CTRL_TEN_REG_T3_CTRL_TEN(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_T3_CTRL_TEN_REG_T3_CTRL_TEN_SHIFT)) & SYSPLL_T3_T3_CTRL_TEN_REG_T3_CTRL_TEN_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLKTREE_CTRL_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_CLKTREE_CTRL_ONE_REG_CLKTREE_CTRL_ONE_MASK (0xFFU)\r\n#define SYSPLL_T3_CLKTREE_CTRL_ONE_REG_CLKTREE_CTRL_ONE_SHIFT (0U)\r\n/*! CLKTREE_CTRL_ONE - CLKTREE_CTRL_ONE */\r\n#define SYSPLL_T3_CLKTREE_CTRL_ONE_REG_CLKTREE_CTRL_ONE(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_CLKTREE_CTRL_ONE_REG_CLKTREE_CTRL_ONE_SHIFT)) & SYSPLL_T3_CLKTREE_CTRL_ONE_REG_CLKTREE_CTRL_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLKTREE_CTRL_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_CLKTREE_CTRL_TWO_REG_CLKTREE_CTRL_TWO_MASK (0xFFU)\r\n#define SYSPLL_T3_CLKTREE_CTRL_TWO_REG_CLKTREE_CTRL_TWO_SHIFT (0U)\r\n/*! CLKTREE_CTRL_TWO - CLKTREE_CTRL_TWO */\r\n#define SYSPLL_T3_CLKTREE_CTRL_TWO_REG_CLKTREE_CTRL_TWO(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_CLKTREE_CTRL_TWO_REG_CLKTREE_CTRL_TWO_SHIFT)) & SYSPLL_T3_CLKTREE_CTRL_TWO_REG_CLKTREE_CTRL_TWO_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLKTREE_CTRL_THREE_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_CLKTREE_CTRL_THREE_REG_CLKTREE_CTRL_THREE_MASK (0xFFU)\r\n#define SYSPLL_T3_CLKTREE_CTRL_THREE_REG_CLKTREE_CTRL_THREE_SHIFT (0U)\r\n/*! CLKTREE_CTRL_THREE - CLKTREE_CTRL_THREE */\r\n#define SYSPLL_T3_CLKTREE_CTRL_THREE_REG_CLKTREE_CTRL_THREE(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_CLKTREE_CTRL_THREE_REG_CLKTREE_CTRL_THREE_SHIFT)) & SYSPLL_T3_CLKTREE_CTRL_THREE_REG_CLKTREE_CTRL_THREE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLKTREE_CTRL_FOUR_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_CLKTREE_CTRL_FOUR_REG_CLKTREE_CTRL_FOUR_MASK (0xFFU)\r\n#define SYSPLL_T3_CLKTREE_CTRL_FOUR_REG_CLKTREE_CTRL_FOUR_SHIFT (0U)\r\n/*! CLKTREE_CTRL_FOUR - CLKTREE_CTRL_FOUR */\r\n#define SYSPLL_T3_CLKTREE_CTRL_FOUR_REG_CLKTREE_CTRL_FOUR(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_CLKTREE_CTRL_FOUR_REG_CLKTREE_CTRL_FOUR_SHIFT)) & SYSPLL_T3_CLKTREE_CTRL_FOUR_REG_CLKTREE_CTRL_FOUR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLKTREE_CTRL_FIVE_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_CLKTREE_CTRL_FIVE_REG_CLKTREE_CTRL_FIVE_MASK (0xFFU)\r\n#define SYSPLL_T3_CLKTREE_CTRL_FIVE_REG_CLKTREE_CTRL_FIVE_SHIFT (0U)\r\n/*! CLKTREE_CTRL_FIVE - CLKTREE_CTRL_FIVE */\r\n#define SYSPLL_T3_CLKTREE_CTRL_FIVE_REG_CLKTREE_CTRL_FIVE(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_CLKTREE_CTRL_FIVE_REG_CLKTREE_CTRL_FIVE_SHIFT)) & SYSPLL_T3_CLKTREE_CTRL_FIVE_REG_CLKTREE_CTRL_FIVE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLKTREE_CTRL_SIX_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_CLKTREE_CTRL_SIX_REG_CLKTREE_CTRL_SIX_MASK (0xFFU)\r\n#define SYSPLL_T3_CLKTREE_CTRL_SIX_REG_CLKTREE_CTRL_SIX_SHIFT (0U)\r\n/*! CLKTREE_CTRL_SIX - CLKTREE_CTRL_SIX */\r\n#define SYSPLL_T3_CLKTREE_CTRL_SIX_REG_CLKTREE_CTRL_SIX(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_CLKTREE_CTRL_SIX_REG_CLKTREE_CTRL_SIX_SHIFT)) & SYSPLL_T3_CLKTREE_CTRL_SIX_REG_CLKTREE_CTRL_SIX_MASK)\r\n/*! @} */\r\n\r\n/*! @name GPIO_CTRL_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_GPIO_CTRL_REG_GPIO_CTRL_MASK   (0xFFU)\r\n#define SYSPLL_T3_GPIO_CTRL_REG_GPIO_CTRL_SHIFT  (0U)\r\n/*! GPIO_CTRL - GPIO_CTRL */\r\n#define SYSPLL_T3_GPIO_CTRL_REG_GPIO_CTRL(x)     (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_GPIO_CTRL_REG_GPIO_CTRL_SHIFT)) & SYSPLL_T3_GPIO_CTRL_REG_GPIO_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name ATEST_CTRL_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_ATEST_CTRL_REG_ATEST_CTRL_MASK (0xFFU)\r\n#define SYSPLL_T3_ATEST_CTRL_REG_ATEST_CTRL_SHIFT (0U)\r\n/*! ATEST_CTRL - ATEST_CTRL */\r\n#define SYSPLL_T3_ATEST_CTRL_REG_ATEST_CTRL(x)   (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_ATEST_CTRL_REG_ATEST_CTRL_SHIFT)) & SYSPLL_T3_ATEST_CTRL_REG_ATEST_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVED_LO_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_RESERVED_LO_ONE_REG_RESERVED_LO_ONE_MASK (0xFFU)\r\n#define SYSPLL_T3_RESERVED_LO_ONE_REG_RESERVED_LO_ONE_SHIFT (0U)\r\n/*! RESERVED_LO_ONE - RESERVED_LO_ONE */\r\n#define SYSPLL_T3_RESERVED_LO_ONE_REG_RESERVED_LO_ONE(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_RESERVED_LO_ONE_REG_RESERVED_LO_ONE_SHIFT)) & SYSPLL_T3_RESERVED_LO_ONE_REG_RESERVED_LO_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVED_HI_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_RESERVED_HI_ONE_REG_RESERVED_HI_ONE_MASK (0xFFU)\r\n#define SYSPLL_T3_RESERVED_HI_ONE_REG_RESERVED_HI_ONE_SHIFT (0U)\r\n/*! RESERVED_HI_ONE - RESERVED_HI_ONE */\r\n#define SYSPLL_T3_RESERVED_HI_ONE_REG_RESERVED_HI_ONE(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_RESERVED_HI_ONE_REG_RESERVED_HI_ONE_SHIFT)) & SYSPLL_T3_RESERVED_HI_ONE_REG_RESERVED_HI_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVED_MIX_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_RESERVED_MIX_ONE_REG_RESERVED_MIX_ONE_MASK (0xFFU)\r\n#define SYSPLL_T3_RESERVED_MIX_ONE_REG_RESERVED_MIX_ONE_SHIFT (0U)\r\n/*! RESERVED_MIX_ONE - RESERVED_MIX_ONE */\r\n#define SYSPLL_T3_RESERVED_MIX_ONE_REG_RESERVED_MIX_ONE(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_RESERVED_MIX_ONE_REG_RESERVED_MIX_ONE_SHIFT)) & SYSPLL_T3_RESERVED_MIX_ONE_REG_RESERVED_MIX_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVED_MIX_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_T3_RESERVED_MIX_TWO_REG_RESERVED_MIX_TWO_MASK (0xFFU)\r\n#define SYSPLL_T3_RESERVED_MIX_TWO_REG_RESERVED_MIX_TWO_SHIFT (0U)\r\n/*! RESERVED_MIX_TWO - RESERVED_MIX_TWO */\r\n#define SYSPLL_T3_RESERVED_MIX_TWO_REG_RESERVED_MIX_TWO(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_T3_RESERVED_MIX_TWO_REG_RESERVED_MIX_TWO_SHIFT)) & SYSPLL_T3_RESERVED_MIX_TWO_REG_RESERVED_MIX_TWO_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SYSPLL_T3_Register_Masks */\r\n\r\n\r\n/* SYSPLL_T3 - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral SYSPLL_T3 base address */\r\n  #define SYSPLL_T3_BASE                           (0x55002000u)\r\n  /** Peripheral SYSPLL_T3 base address */\r\n  #define SYSPLL_T3_BASE_NS                        (0x45002000u)\r\n  /** Peripheral SYSPLL_T3 base pointer */\r\n  #define SYSPLL_T3                                ((SYSPLL_T3_Type *)SYSPLL_T3_BASE)\r\n  /** Peripheral SYSPLL_T3 base pointer */\r\n  #define SYSPLL_T3_NS                             ((SYSPLL_T3_Type *)SYSPLL_T3_BASE_NS)\r\n  /** Array initializer of SYSPLL_T3 peripheral base addresses */\r\n  #define SYSPLL_T3_BASE_ADDRS                     { SYSPLL_T3_BASE }\r\n  /** Array initializer of SYSPLL_T3 peripheral base pointers */\r\n  #define SYSPLL_T3_BASE_PTRS                      { SYSPLL_T3 }\r\n  /** Array initializer of SYSPLL_T3 peripheral base addresses */\r\n  #define SYSPLL_T3_BASE_ADDRS_NS                  { SYSPLL_T3_BASE_NS }\r\n  /** Array initializer of SYSPLL_T3 peripheral base pointers */\r\n  #define SYSPLL_T3_BASE_PTRS_NS                   { SYSPLL_T3_NS }\r\n#else\r\n  /** Peripheral SYSPLL_T3 base address */\r\n  #define SYSPLL_T3_BASE                           (0x45002000u)\r\n  /** Peripheral SYSPLL_T3 base pointer */\r\n  #define SYSPLL_T3                                ((SYSPLL_T3_Type *)SYSPLL_T3_BASE)\r\n  /** Array initializer of SYSPLL_T3 peripheral base addresses */\r\n  #define SYSPLL_T3_BASE_ADDRS                     { SYSPLL_T3_BASE }\r\n  /** Array initializer of SYSPLL_T3 peripheral base pointers */\r\n  #define SYSPLL_T3_BASE_PTRS                      { SYSPLL_T3 }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SYSPLL_T3_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SYSPLL_TCPU Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SYSPLL_TCPU_Peripheral_Access_Layer SYSPLL_TCPU Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** SYSPLL_TCPU - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[224];\r\n  __I  uint8_t SYSBYPASS_SOC_CTRL_ONE_RO_REG;      /**< offset: 0xE0 */\r\n  __I  uint8_t SYSBYPASS_SOC_CTRL_TWO_RO_REG;      /**< offset: 0xE1 */\r\n  __I  uint8_t SYSBYPASS_SOC_CTRL_THREE_RO_REG;    /**< offset: 0xE2 */\r\n  __I  uint8_t REG_RO_REG;                         /**< offset: 0xE3 */\r\n  __IO uint8_t SYS_CTRL_REG;                       /**< offset: 0xE4 */\r\n  __IO uint8_t SYSBYPASS_SOC_CTRL_ONE_RW_REG;      /**< offset: 0xE5 */\r\n  __IO uint8_t SYSBYPASS_SOC_CTRL_TWO_RW_REG;      /**< offset: 0xE6 */\r\n  __IO uint8_t SYSBYPASS_SOC_CTRL_THREE_RW_REG;    /**< offset: 0xE7 */\r\n  __IO uint8_t TCPU_CTRL_ONE_REG;                  /**< offset: 0xE8 */\r\n  __IO uint8_t TCPU_CTRL_TWO_REG;                  /**< offset: 0xE9 */\r\n  __IO uint8_t TCPU_CTRL_THREE_REG;                /**< offset: 0xEA */\r\n  __IO uint8_t TCPU_CTRL_FOUR_REG;                 /**< offset: 0xEB */\r\n  __IO uint8_t TCPU_CTRL_FIVE_REG;                 /**< offset: 0xEC */\r\n  __IO uint8_t TCPU_CTRL_SIX_REG;                  /**< offset: 0xED */\r\n  __IO uint8_t CLKTREE_CTRL_ONE_REG;               /**< offset: 0xEE */\r\n  __IO uint8_t CLKTREE_CTRL_TWO_REG;               /**< offset: 0xEF */\r\n  __IO uint8_t GPIO_CTRL_REG;                      /**< offset: 0xF0 */\r\n  __IO uint8_t ATEST_CTRL_REG;                     /**< offset: 0xF1 */\r\n  __IO uint8_t RESERVED_LO_REG;                    /**< offset: 0xF2 */\r\n  __IO uint8_t RESERVED_HI_REG;                    /**< offset: 0xF3 */\r\n} SYSPLL_TCPU_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SYSPLL_TCPU Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SYSPLL_TCPU_Register_Masks SYSPLL_TCPU Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name SYSBYPASS_SOC_CTRL_ONE_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_ONE_RO_REG_SYSBYPASS_SOC_CTRL_ONE_RO_MASK (0xFFU)\r\n#define SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_ONE_RO_REG_SYSBYPASS_SOC_CTRL_ONE_RO_SHIFT (0U)\r\n/*! SYSBYPASS_SOC_CTRL_ONE_RO - SYSBYPASS_SOC_CTRL_ONE_RO */\r\n#define SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_ONE_RO_REG_SYSBYPASS_SOC_CTRL_ONE_RO(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_ONE_RO_REG_SYSBYPASS_SOC_CTRL_ONE_RO_SHIFT)) & SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_ONE_RO_REG_SYSBYPASS_SOC_CTRL_ONE_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSBYPASS_SOC_CTRL_TWO_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_TWO_RO_REG_SYSBYPASS_SOC_CTRL_TWO_RO_MASK (0xFFU)\r\n#define SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_TWO_RO_REG_SYSBYPASS_SOC_CTRL_TWO_RO_SHIFT (0U)\r\n/*! SYSBYPASS_SOC_CTRL_TWO_RO - SYSBYPASS_SOC_CTRL_TWO_RO */\r\n#define SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_TWO_RO_REG_SYSBYPASS_SOC_CTRL_TWO_RO(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_TWO_RO_REG_SYSBYPASS_SOC_CTRL_TWO_RO_SHIFT)) & SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_TWO_RO_REG_SYSBYPASS_SOC_CTRL_TWO_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSBYPASS_SOC_CTRL_THREE_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_THREE_RO_REG_SYSBYPASS_SOC_CTRL_THREE_RO_MASK (0xFFU)\r\n#define SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_THREE_RO_REG_SYSBYPASS_SOC_CTRL_THREE_RO_SHIFT (0U)\r\n/*! SYSBYPASS_SOC_CTRL_THREE_RO - SYSBYPASS_SOC_CTRL_THREE_RO */\r\n#define SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_THREE_RO_REG_SYSBYPASS_SOC_CTRL_THREE_RO(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_THREE_RO_REG_SYSBYPASS_SOC_CTRL_THREE_RO_SHIFT)) & SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_THREE_RO_REG_SYSBYPASS_SOC_CTRL_THREE_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name REG_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TCPU_REG_RO_REG_REG_RO_MASK       (0xFFU)\r\n#define SYSPLL_TCPU_REG_RO_REG_REG_RO_SHIFT      (0U)\r\n/*! REG_RO - REG_RO */\r\n#define SYSPLL_TCPU_REG_RO_REG_REG_RO(x)         (((uint8_t)(((uint8_t)(x)) << SYSPLL_TCPU_REG_RO_REG_REG_RO_SHIFT)) & SYSPLL_TCPU_REG_RO_REG_REG_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYS_CTRL_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TCPU_SYS_CTRL_REG_SYS_CTRL_MASK   (0xFFU)\r\n#define SYSPLL_TCPU_SYS_CTRL_REG_SYS_CTRL_SHIFT  (0U)\r\n/*! SYS_CTRL - SYS_CTRL */\r\n#define SYSPLL_TCPU_SYS_CTRL_REG_SYS_CTRL(x)     (((uint8_t)(((uint8_t)(x)) << SYSPLL_TCPU_SYS_CTRL_REG_SYS_CTRL_SHIFT)) & SYSPLL_TCPU_SYS_CTRL_REG_SYS_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSBYPASS_SOC_CTRL_ONE_RW_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_ONE_RW_REG_SYSBYPASS_SOC_CTRL_ONE_RW_MASK (0xFFU)\r\n#define SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_ONE_RW_REG_SYSBYPASS_SOC_CTRL_ONE_RW_SHIFT (0U)\r\n/*! SYSBYPASS_SOC_CTRL_ONE_RW - SYSBYPASS_SOC_CTRL_ONE_RW */\r\n#define SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_ONE_RW_REG_SYSBYPASS_SOC_CTRL_ONE_RW(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_ONE_RW_REG_SYSBYPASS_SOC_CTRL_ONE_RW_SHIFT)) & SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_ONE_RW_REG_SYSBYPASS_SOC_CTRL_ONE_RW_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSBYPASS_SOC_CTRL_TWO_RW_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_TWO_RW_REG_SYSBYPASS_SOC_CTRL_TWO_RW_MASK (0xFFU)\r\n#define SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_TWO_RW_REG_SYSBYPASS_SOC_CTRL_TWO_RW_SHIFT (0U)\r\n/*! SYSBYPASS_SOC_CTRL_TWO_RW - SYSBYPASS_SOC_CTRL_TWO_RW */\r\n#define SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_TWO_RW_REG_SYSBYPASS_SOC_CTRL_TWO_RW(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_TWO_RW_REG_SYSBYPASS_SOC_CTRL_TWO_RW_SHIFT)) & SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_TWO_RW_REG_SYSBYPASS_SOC_CTRL_TWO_RW_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSBYPASS_SOC_CTRL_THREE_RW_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_THREE_RW_REG_SYSBYPASS_SOC_CTRL_THREE_RW_MASK (0xFFU)\r\n#define SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_THREE_RW_REG_SYSBYPASS_SOC_CTRL_THREE_RW_SHIFT (0U)\r\n/*! SYSBYPASS_SOC_CTRL_THREE_RW - SYSBYPASS_SOC_CTRL_THREE_RW */\r\n#define SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_THREE_RW_REG_SYSBYPASS_SOC_CTRL_THREE_RW(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_THREE_RW_REG_SYSBYPASS_SOC_CTRL_THREE_RW_SHIFT)) & SYSPLL_TCPU_SYSBYPASS_SOC_CTRL_THREE_RW_REG_SYSBYPASS_SOC_CTRL_THREE_RW_MASK)\r\n/*! @} */\r\n\r\n/*! @name TCPU_CTRL_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TCPU_TCPU_CTRL_ONE_REG_TCPU_CTRL_ONE_MASK (0xFFU)\r\n#define SYSPLL_TCPU_TCPU_CTRL_ONE_REG_TCPU_CTRL_ONE_SHIFT (0U)\r\n/*! TCPU_CTRL_ONE - TCPU_CTRL_ONE */\r\n#define SYSPLL_TCPU_TCPU_CTRL_ONE_REG_TCPU_CTRL_ONE(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TCPU_TCPU_CTRL_ONE_REG_TCPU_CTRL_ONE_SHIFT)) & SYSPLL_TCPU_TCPU_CTRL_ONE_REG_TCPU_CTRL_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name TCPU_CTRL_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TCPU_TCPU_CTRL_TWO_REG_TCPU_CTRL_TWO_MASK (0xFFU)\r\n#define SYSPLL_TCPU_TCPU_CTRL_TWO_REG_TCPU_CTRL_TWO_SHIFT (0U)\r\n/*! TCPU_CTRL_TWO - TCPU_CTRL_TWO */\r\n#define SYSPLL_TCPU_TCPU_CTRL_TWO_REG_TCPU_CTRL_TWO(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TCPU_TCPU_CTRL_TWO_REG_TCPU_CTRL_TWO_SHIFT)) & SYSPLL_TCPU_TCPU_CTRL_TWO_REG_TCPU_CTRL_TWO_MASK)\r\n/*! @} */\r\n\r\n/*! @name TCPU_CTRL_THREE_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TCPU_TCPU_CTRL_THREE_REG_TCPU_CTRL_THREE_MASK (0xFFU)\r\n#define SYSPLL_TCPU_TCPU_CTRL_THREE_REG_TCPU_CTRL_THREE_SHIFT (0U)\r\n/*! TCPU_CTRL_THREE - TCPU_CTRL_THREE */\r\n#define SYSPLL_TCPU_TCPU_CTRL_THREE_REG_TCPU_CTRL_THREE(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TCPU_TCPU_CTRL_THREE_REG_TCPU_CTRL_THREE_SHIFT)) & SYSPLL_TCPU_TCPU_CTRL_THREE_REG_TCPU_CTRL_THREE_MASK)\r\n/*! @} */\r\n\r\n/*! @name TCPU_CTRL_FOUR_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TCPU_TCPU_CTRL_FOUR_REG_TCPU_CTRL_FOUR_MASK (0xFFU)\r\n#define SYSPLL_TCPU_TCPU_CTRL_FOUR_REG_TCPU_CTRL_FOUR_SHIFT (0U)\r\n/*! TCPU_CTRL_FOUR - TCPU_CTRL_FOUR */\r\n#define SYSPLL_TCPU_TCPU_CTRL_FOUR_REG_TCPU_CTRL_FOUR(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TCPU_TCPU_CTRL_FOUR_REG_TCPU_CTRL_FOUR_SHIFT)) & SYSPLL_TCPU_TCPU_CTRL_FOUR_REG_TCPU_CTRL_FOUR_MASK)\r\n/*! @} */\r\n\r\n/*! @name TCPU_CTRL_FIVE_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TCPU_TCPU_CTRL_FIVE_REG_TCPU_CTRL_FIVE_MASK (0xFFU)\r\n#define SYSPLL_TCPU_TCPU_CTRL_FIVE_REG_TCPU_CTRL_FIVE_SHIFT (0U)\r\n/*! TCPU_CTRL_FIVE - TCPU_CTRL_FIVE */\r\n#define SYSPLL_TCPU_TCPU_CTRL_FIVE_REG_TCPU_CTRL_FIVE(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TCPU_TCPU_CTRL_FIVE_REG_TCPU_CTRL_FIVE_SHIFT)) & SYSPLL_TCPU_TCPU_CTRL_FIVE_REG_TCPU_CTRL_FIVE_MASK)\r\n/*! @} */\r\n\r\n/*! @name TCPU_CTRL_SIX_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TCPU_TCPU_CTRL_SIX_REG_TCPU_CTRL_SIX_MASK (0xFFU)\r\n#define SYSPLL_TCPU_TCPU_CTRL_SIX_REG_TCPU_CTRL_SIX_SHIFT (0U)\r\n/*! TCPU_CTRL_SIX - TCPU_CTRL_SIX */\r\n#define SYSPLL_TCPU_TCPU_CTRL_SIX_REG_TCPU_CTRL_SIX(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TCPU_TCPU_CTRL_SIX_REG_TCPU_CTRL_SIX_SHIFT)) & SYSPLL_TCPU_TCPU_CTRL_SIX_REG_TCPU_CTRL_SIX_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLKTREE_CTRL_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TCPU_CLKTREE_CTRL_ONE_REG_CLKTREE_CTRL_ONE_MASK (0xFFU)\r\n#define SYSPLL_TCPU_CLKTREE_CTRL_ONE_REG_CLKTREE_CTRL_ONE_SHIFT (0U)\r\n/*! CLKTREE_CTRL_ONE - CLKTREE_CTRL_ONE */\r\n#define SYSPLL_TCPU_CLKTREE_CTRL_ONE_REG_CLKTREE_CTRL_ONE(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TCPU_CLKTREE_CTRL_ONE_REG_CLKTREE_CTRL_ONE_SHIFT)) & SYSPLL_TCPU_CLKTREE_CTRL_ONE_REG_CLKTREE_CTRL_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLKTREE_CTRL_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TCPU_CLKTREE_CTRL_TWO_REG_CLKTREE_CTRL_TWO_MASK (0xFFU)\r\n#define SYSPLL_TCPU_CLKTREE_CTRL_TWO_REG_CLKTREE_CTRL_TWO_SHIFT (0U)\r\n/*! CLKTREE_CTRL_TWO - CLKTREE_CTRL_TWO */\r\n#define SYSPLL_TCPU_CLKTREE_CTRL_TWO_REG_CLKTREE_CTRL_TWO(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TCPU_CLKTREE_CTRL_TWO_REG_CLKTREE_CTRL_TWO_SHIFT)) & SYSPLL_TCPU_CLKTREE_CTRL_TWO_REG_CLKTREE_CTRL_TWO_MASK)\r\n/*! @} */\r\n\r\n/*! @name GPIO_CTRL_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TCPU_GPIO_CTRL_REG_GPIO_CTRL_MASK (0xFFU)\r\n#define SYSPLL_TCPU_GPIO_CTRL_REG_GPIO_CTRL_SHIFT (0U)\r\n/*! GPIO_CTRL - GPIO_CTRL */\r\n#define SYSPLL_TCPU_GPIO_CTRL_REG_GPIO_CTRL(x)   (((uint8_t)(((uint8_t)(x)) << SYSPLL_TCPU_GPIO_CTRL_REG_GPIO_CTRL_SHIFT)) & SYSPLL_TCPU_GPIO_CTRL_REG_GPIO_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name ATEST_CTRL_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TCPU_ATEST_CTRL_REG_ATEST_CTRL_MASK (0xFFU)\r\n#define SYSPLL_TCPU_ATEST_CTRL_REG_ATEST_CTRL_SHIFT (0U)\r\n/*! ATEST_CTRL - ATEST_CTRL */\r\n#define SYSPLL_TCPU_ATEST_CTRL_REG_ATEST_CTRL(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TCPU_ATEST_CTRL_REG_ATEST_CTRL_SHIFT)) & SYSPLL_TCPU_ATEST_CTRL_REG_ATEST_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVED_LO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TCPU_RESERVED_LO_REG_RESERVED_LO_MASK (0xFFU)\r\n#define SYSPLL_TCPU_RESERVED_LO_REG_RESERVED_LO_SHIFT (0U)\r\n/*! RESERVED_LO - RESERVED_LO */\r\n#define SYSPLL_TCPU_RESERVED_LO_REG_RESERVED_LO(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TCPU_RESERVED_LO_REG_RESERVED_LO_SHIFT)) & SYSPLL_TCPU_RESERVED_LO_REG_RESERVED_LO_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVED_HI_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TCPU_RESERVED_HI_REG_RESERVED_HI_MASK (0xFFU)\r\n#define SYSPLL_TCPU_RESERVED_HI_REG_RESERVED_HI_SHIFT (0U)\r\n/*! RESERVED_HI - RESERVED_HI */\r\n#define SYSPLL_TCPU_RESERVED_HI_REG_RESERVED_HI(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TCPU_RESERVED_HI_REG_RESERVED_HI_SHIFT)) & SYSPLL_TCPU_RESERVED_HI_REG_RESERVED_HI_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SYSPLL_TCPU_Register_Masks */\r\n\r\n\r\n/* SYSPLL_TCPU - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral SYSPLL_TCPU base address */\r\n  #define SYSPLL_TCPU_BASE                         (0x55002000u)\r\n  /** Peripheral SYSPLL_TCPU base address */\r\n  #define SYSPLL_TCPU_BASE_NS                      (0x45002000u)\r\n  /** Peripheral SYSPLL_TCPU base pointer */\r\n  #define SYSPLL_TCPU                              ((SYSPLL_TCPU_Type *)SYSPLL_TCPU_BASE)\r\n  /** Peripheral SYSPLL_TCPU base pointer */\r\n  #define SYSPLL_TCPU_NS                           ((SYSPLL_TCPU_Type *)SYSPLL_TCPU_BASE_NS)\r\n  /** Array initializer of SYSPLL_TCPU peripheral base addresses */\r\n  #define SYSPLL_TCPU_BASE_ADDRS                   { SYSPLL_TCPU_BASE }\r\n  /** Array initializer of SYSPLL_TCPU peripheral base pointers */\r\n  #define SYSPLL_TCPU_BASE_PTRS                    { SYSPLL_TCPU }\r\n  /** Array initializer of SYSPLL_TCPU peripheral base addresses */\r\n  #define SYSPLL_TCPU_BASE_ADDRS_NS                { SYSPLL_TCPU_BASE_NS }\r\n  /** Array initializer of SYSPLL_TCPU peripheral base pointers */\r\n  #define SYSPLL_TCPU_BASE_PTRS_NS                 { SYSPLL_TCPU_NS }\r\n#else\r\n  /** Peripheral SYSPLL_TCPU base address */\r\n  #define SYSPLL_TCPU_BASE                         (0x45002000u)\r\n  /** Peripheral SYSPLL_TCPU base pointer */\r\n  #define SYSPLL_TCPU                              ((SYSPLL_TCPU_Type *)SYSPLL_TCPU_BASE)\r\n  /** Array initializer of SYSPLL_TCPU peripheral base addresses */\r\n  #define SYSPLL_TCPU_BASE_ADDRS                   { SYSPLL_TCPU_BASE }\r\n  /** Array initializer of SYSPLL_TCPU peripheral base pointers */\r\n  #define SYSPLL_TCPU_BASE_PTRS                    { SYSPLL_TCPU }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SYSPLL_TCPU_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SYSPLL_TDDR Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SYSPLL_TDDR_Peripheral_Access_Layer SYSPLL_TDDR Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** SYSPLL_TDDR - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[160];\r\n  __I  uint8_t SYSBYPASS_SOC_CTRL_ONE_RO_REG;      /**< offset: 0xA0 */\r\n  __I  uint8_t SYSBYPASS_SOC_CTRL_TWO_RO_REG;      /**< offset: 0xA1 */\r\n  __I  uint8_t SYSBYPASS_SOC_CTRL_THREE_RO_REG;    /**< offset: 0xA2 */\r\n  __I  uint8_t REG_RO_REG;                         /**< offset: 0xA3 */\r\n  __IO uint8_t SYS_CTRL_REG;                       /**< offset: 0xA4 */\r\n  __IO uint8_t SYSBYPASS_SOC_CTRL_ONE_RW_REG;      /**< offset: 0xA5 */\r\n  __IO uint8_t SYSBYPASS_SOC_CTRL_TWO_RW_REG;      /**< offset: 0xA6 */\r\n  __IO uint8_t SYSBYPASS_SOC_CTRL_THREE_RW_REG;    /**< offset: 0xA7 */\r\n  __IO uint8_t TDDR_CTRL_ONE_REG;                  /**< offset: 0xA8 */\r\n  __IO uint8_t TDDR_CTRL_TWO_REG;                  /**< offset: 0xA9 */\r\n  __IO uint8_t TDDR_CTRL_THREE_REG;                /**< offset: 0xAA */\r\n  __IO uint8_t TDDR_CTRL_FOUR_REG;                 /**< offset: 0xAB */\r\n  __IO uint8_t TDDR_CTRL_FIVE_REG;                 /**< offset: 0xAC */\r\n  __IO uint8_t TDDR_CTRL_SIX_REG;                  /**< offset: 0xAD */\r\n  __IO uint8_t CLKTREE_CTRL_ONE_REG;               /**< offset: 0xAE */\r\n  __IO uint8_t CLKTREE_CTRL_TWO_REG;               /**< offset: 0xAF */\r\n  __IO uint8_t GPIO_CTRL_REG;                      /**< offset: 0xB0 */\r\n  __IO uint8_t ATEST_CTRL_REG;                     /**< offset: 0xB1 */\r\n  __IO uint8_t RESERVED_LO_REG;                    /**< offset: 0xB2 */\r\n  __IO uint8_t RESERVED_HI_REG;                    /**< offset: 0xB3 */\r\n} SYSPLL_TDDR_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SYSPLL_TDDR Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SYSPLL_TDDR_Register_Masks SYSPLL_TDDR Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name SYSBYPASS_SOC_CTRL_ONE_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_ONE_RO_REG_SYSBYPASS_SOC_CTRL_ONE_RO_MASK (0xFFU)\r\n#define SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_ONE_RO_REG_SYSBYPASS_SOC_CTRL_ONE_RO_SHIFT (0U)\r\n/*! SYSBYPASS_SOC_CTRL_ONE_RO - SYSBYPASS_SOC_CTRL_ONE_RO */\r\n#define SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_ONE_RO_REG_SYSBYPASS_SOC_CTRL_ONE_RO(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_ONE_RO_REG_SYSBYPASS_SOC_CTRL_ONE_RO_SHIFT)) & SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_ONE_RO_REG_SYSBYPASS_SOC_CTRL_ONE_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSBYPASS_SOC_CTRL_TWO_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_TWO_RO_REG_SYSBYPASS_SOC_CTRL_TWO_RO_MASK (0xFFU)\r\n#define SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_TWO_RO_REG_SYSBYPASS_SOC_CTRL_TWO_RO_SHIFT (0U)\r\n/*! SYSBYPASS_SOC_CTRL_TWO_RO - SYSBYPASS_SOC_CTRL_TWO_RO */\r\n#define SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_TWO_RO_REG_SYSBYPASS_SOC_CTRL_TWO_RO(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_TWO_RO_REG_SYSBYPASS_SOC_CTRL_TWO_RO_SHIFT)) & SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_TWO_RO_REG_SYSBYPASS_SOC_CTRL_TWO_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSBYPASS_SOC_CTRL_THREE_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_THREE_RO_REG_SYSBYPASS_SOC_CTRL_THREE_RO_MASK (0xFFU)\r\n#define SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_THREE_RO_REG_SYSBYPASS_SOC_CTRL_THREE_RO_SHIFT (0U)\r\n/*! SYSBYPASS_SOC_CTRL_THREE_RO - SYSBYPASS_SOC_CTRL_THREE_RO */\r\n#define SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_THREE_RO_REG_SYSBYPASS_SOC_CTRL_THREE_RO(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_THREE_RO_REG_SYSBYPASS_SOC_CTRL_THREE_RO_SHIFT)) & SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_THREE_RO_REG_SYSBYPASS_SOC_CTRL_THREE_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name REG_RO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TDDR_REG_RO_REG_REG_RO_MASK       (0xFFU)\r\n#define SYSPLL_TDDR_REG_RO_REG_REG_RO_SHIFT      (0U)\r\n/*! REG_RO - REG_RO */\r\n#define SYSPLL_TDDR_REG_RO_REG_REG_RO(x)         (((uint8_t)(((uint8_t)(x)) << SYSPLL_TDDR_REG_RO_REG_REG_RO_SHIFT)) & SYSPLL_TDDR_REG_RO_REG_REG_RO_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYS_CTRL_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TDDR_SYS_CTRL_REG_REG_SYS_CTRL_MASK (0xFFU)\r\n#define SYSPLL_TDDR_SYS_CTRL_REG_REG_SYS_CTRL_SHIFT (0U)\r\n/*! REG_SYS_CTRL - REG_SYS_CTRL */\r\n#define SYSPLL_TDDR_SYS_CTRL_REG_REG_SYS_CTRL(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TDDR_SYS_CTRL_REG_REG_SYS_CTRL_SHIFT)) & SYSPLL_TDDR_SYS_CTRL_REG_REG_SYS_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSBYPASS_SOC_CTRL_ONE_RW_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_ONE_RW_REG_REG_SYSBYPASS_SOC_CTRL_ONE_RW_MASK (0xFFU)\r\n#define SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_ONE_RW_REG_REG_SYSBYPASS_SOC_CTRL_ONE_RW_SHIFT (0U)\r\n/*! REG_SYSBYPASS_SOC_CTRL_ONE_RW - REG_SYSBYPASS_SOC_CTRL_ONE_RW */\r\n#define SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_ONE_RW_REG_REG_SYSBYPASS_SOC_CTRL_ONE_RW(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_ONE_RW_REG_REG_SYSBYPASS_SOC_CTRL_ONE_RW_SHIFT)) & SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_ONE_RW_REG_REG_SYSBYPASS_SOC_CTRL_ONE_RW_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSBYPASS_SOC_CTRL_TWO_RW_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_TWO_RW_REG_REG_SYSBYPASS_SOC_CTRL_TWO_RW_MASK (0xFFU)\r\n#define SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_TWO_RW_REG_REG_SYSBYPASS_SOC_CTRL_TWO_RW_SHIFT (0U)\r\n/*! REG_SYSBYPASS_SOC_CTRL_TWO_RW - REG_SYSBYPASS_SOC_CTRL_TWO_RW */\r\n#define SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_TWO_RW_REG_REG_SYSBYPASS_SOC_CTRL_TWO_RW(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_TWO_RW_REG_REG_SYSBYPASS_SOC_CTRL_TWO_RW_SHIFT)) & SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_TWO_RW_REG_REG_SYSBYPASS_SOC_CTRL_TWO_RW_MASK)\r\n/*! @} */\r\n\r\n/*! @name SYSBYPASS_SOC_CTRL_THREE_RW_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_THREE_RW_REG_REG_SYSBYPASS_SOC_CTRL_THREE_RW_MASK (0xFFU)\r\n#define SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_THREE_RW_REG_REG_SYSBYPASS_SOC_CTRL_THREE_RW_SHIFT (0U)\r\n/*! REG_SYSBYPASS_SOC_CTRL_THREE_RW - REG_SYSBYPASS_SOC_CTRL_THREE_RW */\r\n#define SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_THREE_RW_REG_REG_SYSBYPASS_SOC_CTRL_THREE_RW(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_THREE_RW_REG_REG_SYSBYPASS_SOC_CTRL_THREE_RW_SHIFT)) & SYSPLL_TDDR_SYSBYPASS_SOC_CTRL_THREE_RW_REG_REG_SYSBYPASS_SOC_CTRL_THREE_RW_MASK)\r\n/*! @} */\r\n\r\n/*! @name TDDR_CTRL_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TDDR_TDDR_CTRL_ONE_REG_REG_TDDR_CTRL_ONE_MASK (0xFFU)\r\n#define SYSPLL_TDDR_TDDR_CTRL_ONE_REG_REG_TDDR_CTRL_ONE_SHIFT (0U)\r\n/*! REG_TDDR_CTRL_ONE - REG_TDDR_CTRL_ONE */\r\n#define SYSPLL_TDDR_TDDR_CTRL_ONE_REG_REG_TDDR_CTRL_ONE(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TDDR_TDDR_CTRL_ONE_REG_REG_TDDR_CTRL_ONE_SHIFT)) & SYSPLL_TDDR_TDDR_CTRL_ONE_REG_REG_TDDR_CTRL_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name TDDR_CTRL_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TDDR_TDDR_CTRL_TWO_REG_REG_TDDR_CTRL_TWO_MASK (0xFFU)\r\n#define SYSPLL_TDDR_TDDR_CTRL_TWO_REG_REG_TDDR_CTRL_TWO_SHIFT (0U)\r\n/*! REG_TDDR_CTRL_TWO - REG_TDDR_CTRL_TWO */\r\n#define SYSPLL_TDDR_TDDR_CTRL_TWO_REG_REG_TDDR_CTRL_TWO(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TDDR_TDDR_CTRL_TWO_REG_REG_TDDR_CTRL_TWO_SHIFT)) & SYSPLL_TDDR_TDDR_CTRL_TWO_REG_REG_TDDR_CTRL_TWO_MASK)\r\n/*! @} */\r\n\r\n/*! @name TDDR_CTRL_THREE_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TDDR_TDDR_CTRL_THREE_REG_REG_TDDR_CTRL_THREE_MASK (0xFFU)\r\n#define SYSPLL_TDDR_TDDR_CTRL_THREE_REG_REG_TDDR_CTRL_THREE_SHIFT (0U)\r\n/*! REG_TDDR_CTRL_THREE - REG_TDDR_CTRL_THREE */\r\n#define SYSPLL_TDDR_TDDR_CTRL_THREE_REG_REG_TDDR_CTRL_THREE(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TDDR_TDDR_CTRL_THREE_REG_REG_TDDR_CTRL_THREE_SHIFT)) & SYSPLL_TDDR_TDDR_CTRL_THREE_REG_REG_TDDR_CTRL_THREE_MASK)\r\n/*! @} */\r\n\r\n/*! @name TDDR_CTRL_FOUR_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TDDR_TDDR_CTRL_FOUR_REG_REG_TDDR_CTRL_FOUR_MASK (0xFFU)\r\n#define SYSPLL_TDDR_TDDR_CTRL_FOUR_REG_REG_TDDR_CTRL_FOUR_SHIFT (0U)\r\n/*! REG_TDDR_CTRL_FOUR - REG_TDDR_CTRL_FOUR */\r\n#define SYSPLL_TDDR_TDDR_CTRL_FOUR_REG_REG_TDDR_CTRL_FOUR(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TDDR_TDDR_CTRL_FOUR_REG_REG_TDDR_CTRL_FOUR_SHIFT)) & SYSPLL_TDDR_TDDR_CTRL_FOUR_REG_REG_TDDR_CTRL_FOUR_MASK)\r\n/*! @} */\r\n\r\n/*! @name TDDR_CTRL_FIVE_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TDDR_TDDR_CTRL_FIVE_REG_REG_TDDR_CTRL_FIVE_MASK (0xFFU)\r\n#define SYSPLL_TDDR_TDDR_CTRL_FIVE_REG_REG_TDDR_CTRL_FIVE_SHIFT (0U)\r\n/*! REG_TDDR_CTRL_FIVE - REG_TDDR_CTRL_FIVE */\r\n#define SYSPLL_TDDR_TDDR_CTRL_FIVE_REG_REG_TDDR_CTRL_FIVE(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TDDR_TDDR_CTRL_FIVE_REG_REG_TDDR_CTRL_FIVE_SHIFT)) & SYSPLL_TDDR_TDDR_CTRL_FIVE_REG_REG_TDDR_CTRL_FIVE_MASK)\r\n/*! @} */\r\n\r\n/*! @name TDDR_CTRL_SIX_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TDDR_TDDR_CTRL_SIX_REG_REG_TDDR_CTRL_SIX_MASK (0xFFU)\r\n#define SYSPLL_TDDR_TDDR_CTRL_SIX_REG_REG_TDDR_CTRL_SIX_SHIFT (0U)\r\n/*! REG_TDDR_CTRL_SIX - REG_TDDR_CTRL_SIX */\r\n#define SYSPLL_TDDR_TDDR_CTRL_SIX_REG_REG_TDDR_CTRL_SIX(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TDDR_TDDR_CTRL_SIX_REG_REG_TDDR_CTRL_SIX_SHIFT)) & SYSPLL_TDDR_TDDR_CTRL_SIX_REG_REG_TDDR_CTRL_SIX_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLKTREE_CTRL_ONE_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TDDR_CLKTREE_CTRL_ONE_REG_REG_CLKTREE_CTRL_ONE_MASK (0xFFU)\r\n#define SYSPLL_TDDR_CLKTREE_CTRL_ONE_REG_REG_CLKTREE_CTRL_ONE_SHIFT (0U)\r\n/*! REG_CLKTREE_CTRL_ONE - REG_CLKTREE_CTRL_ONE */\r\n#define SYSPLL_TDDR_CLKTREE_CTRL_ONE_REG_REG_CLKTREE_CTRL_ONE(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TDDR_CLKTREE_CTRL_ONE_REG_REG_CLKTREE_CTRL_ONE_SHIFT)) & SYSPLL_TDDR_CLKTREE_CTRL_ONE_REG_REG_CLKTREE_CTRL_ONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLKTREE_CTRL_TWO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TDDR_CLKTREE_CTRL_TWO_REG_REG_CLKTREE_CTRL_TWO_MASK (0xFFU)\r\n#define SYSPLL_TDDR_CLKTREE_CTRL_TWO_REG_REG_CLKTREE_CTRL_TWO_SHIFT (0U)\r\n/*! REG_CLKTREE_CTRL_TWO - REG_CLKTREE_CTRL_TWO */\r\n#define SYSPLL_TDDR_CLKTREE_CTRL_TWO_REG_REG_CLKTREE_CTRL_TWO(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TDDR_CLKTREE_CTRL_TWO_REG_REG_CLKTREE_CTRL_TWO_SHIFT)) & SYSPLL_TDDR_CLKTREE_CTRL_TWO_REG_REG_CLKTREE_CTRL_TWO_MASK)\r\n/*! @} */\r\n\r\n/*! @name GPIO_CTRL_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TDDR_GPIO_CTRL_REG_REG_GPIO_CTRL_MASK (0xFFU)\r\n#define SYSPLL_TDDR_GPIO_CTRL_REG_REG_GPIO_CTRL_SHIFT (0U)\r\n/*! REG_GPIO_CTRL - REG_GPIO_CTRL */\r\n#define SYSPLL_TDDR_GPIO_CTRL_REG_REG_GPIO_CTRL(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TDDR_GPIO_CTRL_REG_REG_GPIO_CTRL_SHIFT)) & SYSPLL_TDDR_GPIO_CTRL_REG_REG_GPIO_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name ATEST_CTRL_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TDDR_ATEST_CTRL_REG_REG_ATEST_CTRL_MASK (0xFFU)\r\n#define SYSPLL_TDDR_ATEST_CTRL_REG_REG_ATEST_CTRL_SHIFT (0U)\r\n/*! REG_ATEST_CTRL - REG_ATEST_CTRL */\r\n#define SYSPLL_TDDR_ATEST_CTRL_REG_REG_ATEST_CTRL(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TDDR_ATEST_CTRL_REG_REG_ATEST_CTRL_SHIFT)) & SYSPLL_TDDR_ATEST_CTRL_REG_REG_ATEST_CTRL_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVED_LO_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TDDR_RESERVED_LO_REG_REG_RESERVED_LO_MASK (0xFFU)\r\n#define SYSPLL_TDDR_RESERVED_LO_REG_REG_RESERVED_LO_SHIFT (0U)\r\n/*! REG_RESERVED_LO - REG_RESERVED_LO */\r\n#define SYSPLL_TDDR_RESERVED_LO_REG_REG_RESERVED_LO(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TDDR_RESERVED_LO_REG_REG_RESERVED_LO_SHIFT)) & SYSPLL_TDDR_RESERVED_LO_REG_REG_RESERVED_LO_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVED_HI_REG -  */\r\n/*! @{ */\r\n\r\n#define SYSPLL_TDDR_RESERVED_HI_REG_REG_RESERVED_HI_MASK (0xFFU)\r\n#define SYSPLL_TDDR_RESERVED_HI_REG_REG_RESERVED_HI_SHIFT (0U)\r\n/*! REG_RESERVED_HI - REG_RESERVED_HI */\r\n#define SYSPLL_TDDR_RESERVED_HI_REG_REG_RESERVED_HI(x) (((uint8_t)(((uint8_t)(x)) << SYSPLL_TDDR_RESERVED_HI_REG_REG_RESERVED_HI_SHIFT)) & SYSPLL_TDDR_RESERVED_HI_REG_REG_RESERVED_HI_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SYSPLL_TDDR_Register_Masks */\r\n\r\n\r\n/* SYSPLL_TDDR - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral REG_SYSPLL_TDDR base address */\r\n  #define REG_SYSPLL_TDDR_BASE                     (0x55002000u)\r\n  /** Peripheral REG_SYSPLL_TDDR base address */\r\n  #define REG_SYSPLL_TDDR_BASE_NS                  (0x45002000u)\r\n  /** Peripheral REG_SYSPLL_TDDR base pointer */\r\n  #define REG_SYSPLL_TDDR                          ((SYSPLL_TDDR_Type *)REG_SYSPLL_TDDR_BASE)\r\n  /** Peripheral REG_SYSPLL_TDDR base pointer */\r\n  #define REG_SYSPLL_TDDR_NS                       ((SYSPLL_TDDR_Type *)REG_SYSPLL_TDDR_BASE_NS)\r\n  /** Array initializer of SYSPLL_TDDR peripheral base addresses */\r\n  #define SYSPLL_TDDR_BASE_ADDRS                   { REG_SYSPLL_TDDR_BASE }\r\n  /** Array initializer of SYSPLL_TDDR peripheral base pointers */\r\n  #define SYSPLL_TDDR_BASE_PTRS                    { REG_SYSPLL_TDDR }\r\n  /** Array initializer of SYSPLL_TDDR peripheral base addresses */\r\n  #define SYSPLL_TDDR_BASE_ADDRS_NS                { REG_SYSPLL_TDDR_BASE_NS }\r\n  /** Array initializer of SYSPLL_TDDR peripheral base pointers */\r\n  #define SYSPLL_TDDR_BASE_PTRS_NS                 { REG_SYSPLL_TDDR_NS }\r\n#else\r\n  /** Peripheral REG_SYSPLL_TDDR base address */\r\n  #define REG_SYSPLL_TDDR_BASE                     (0x45002000u)\r\n  /** Peripheral REG_SYSPLL_TDDR base pointer */\r\n  #define REG_SYSPLL_TDDR                          ((SYSPLL_TDDR_Type *)REG_SYSPLL_TDDR_BASE)\r\n  /** Array initializer of SYSPLL_TDDR peripheral base addresses */\r\n  #define SYSPLL_TDDR_BASE_ADDRS                   { REG_SYSPLL_TDDR_BASE }\r\n  /** Array initializer of SYSPLL_TDDR peripheral base pointers */\r\n  #define SYSPLL_TDDR_BASE_PTRS                    { REG_SYSPLL_TDDR }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SYSPLL_TDDR_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- TRNG Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup TRNG_Peripheral_Access_Layer TRNG Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** TRNG - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t MCTL;                              /**< Miscellaneous Control Register, offset: 0x0 */\r\n  __IO uint32_t SCMISC;                            /**< Statistical Check Miscellaneous Register, offset: 0x4 */\r\n       uint8_t RESERVED_0[8];\r\n  __IO uint32_t SDCTL;                             /**< Seed Control Register, offset: 0x10 */\r\n  __I  uint32_t TOTSAM;                            /**< Total Samples Register, offset: 0x14 */\r\n  union {                                          /* offset: 0x18 */\r\n    __IO uint32_t FRQMIN;                            /**< Frequency Count Minimum Limit Register, offset: 0x18 */\r\n    __I  uint32_t OSC2_FRQCNT;                       /**< Oscillator-2 Frequency Count Register, offset: 0x18 */\r\n  };\r\n  union {                                          /* offset: 0x1C */\r\n    __I  uint32_t FRQCNT;                            /**< Frequency Count Register, offset: 0x1C */\r\n    __IO uint32_t FRQMAX;                            /**< Frequency Count Maximum Limit Register, offset: 0x1C */\r\n  };\r\n  union {                                          /* offset: 0x20 */\r\n    __I  uint32_t SCMC;                              /**< Statistical Check Monobit Count Register, offset: 0x20 */\r\n    __IO uint32_t SCML;                              /**< Statistical Check Monobit Limit Register, offset: 0x20 */\r\n  };\r\n  union {                                          /* offset: 0x24 */\r\n    __I  uint32_t SCR1C;                             /**< Statistical Check Run Length 1 Count Register, offset: 0x24 */\r\n    __IO uint32_t SCR1L;                             /**< Statistical Check Run Length 1 Limit Register, offset: 0x24 */\r\n  };\r\n  union {                                          /* offset: 0x28 */\r\n    __I  uint32_t SCR2C;                             /**< Statistical Check Run Length 2 Count Register, offset: 0x28 */\r\n    __IO uint32_t SCR2L;                             /**< Statistical Check Run Length 2 Limit Register, offset: 0x28 */\r\n  };\r\n  union {                                          /* offset: 0x2C */\r\n    __I  uint32_t SCR3C;                             /**< Statistical Check Run Length 3 Count Register, offset: 0x2C */\r\n    __IO uint32_t SCR3L;                             /**< Statistical Check Run Length 3 Limit Register, offset: 0x2C */\r\n  };\r\n       uint8_t RESERVED_1[12];\r\n  __I  uint32_t STATUS;                            /**< Status Register, offset: 0x3C */\r\n  __I  uint32_t ENT[8];                            /**< Entropy Read Register, array offset: 0x40, array step: 0x4 */\r\n       uint8_t RESERVED_2[64];\r\n  __IO uint32_t SEC_CFG;                           /**< Security Configuration Register, offset: 0xA0 */\r\n  __IO uint32_t INT_CTRL;                          /**< Interrupt Control Register, offset: 0xA4 */\r\n  __IO uint32_t INT_MASK;                          /**< Mask Register, offset: 0xA8 */\r\n  __I  uint32_t INT_STATUS;                        /**< Interrupt Status Register, offset: 0xAC */\r\n       uint8_t RESERVED_3[60];\r\n  __IO uint32_t OSC2_CTL;                          /**< RNG Oscillator 2 Control Register, offset: 0xEC */\r\n  __I  uint32_t VID1;                              /**< Version ID Register (MS), offset: 0xF0 */\r\n  __I  uint32_t VID2;                              /**< Version ID Register (LS), offset: 0xF4 */\r\n} TRNG_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- TRNG Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup TRNG_Register_Masks TRNG Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name MCTL - Miscellaneous Control Register */\r\n/*! @{ */\r\n\r\n#define TRNG_MCTL_OSC_DIV_MASK                   (0xCU)\r\n#define TRNG_MCTL_OSC_DIV_SHIFT                  (2U)\r\n/*! OSC_DIV\r\n *  0b00..use ring oscillator with no divide\r\n *  0b01..use ring oscillator divided-by-2\r\n *  0b10..use ring oscillator divided-by-4\r\n *  0b11..use ring oscillator divided-by-8\r\n */\r\n#define TRNG_MCTL_OSC_DIV(x)                     (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_OSC_DIV_SHIFT)) & TRNG_MCTL_OSC_DIV_MASK)\r\n\r\n#define TRNG_MCTL_UNUSED4_MASK                   (0x10U)\r\n#define TRNG_MCTL_UNUSED4_SHIFT                  (4U)\r\n#define TRNG_MCTL_UNUSED4(x)                     (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_UNUSED4_SHIFT)) & TRNG_MCTL_UNUSED4_MASK)\r\n\r\n#define TRNG_MCTL_UNUSED5_MASK                   (0x20U)\r\n#define TRNG_MCTL_UNUSED5_SHIFT                  (5U)\r\n#define TRNG_MCTL_UNUSED5(x)                     (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_UNUSED5_SHIFT)) & TRNG_MCTL_UNUSED5_MASK)\r\n\r\n#define TRNG_MCTL_RST_DEF_MASK                   (0x40U)\r\n#define TRNG_MCTL_RST_DEF_SHIFT                  (6U)\r\n#define TRNG_MCTL_RST_DEF(x)                     (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_RST_DEF_SHIFT)) & TRNG_MCTL_RST_DEF_MASK)\r\n\r\n#define TRNG_MCTL_FOR_SCLK_MASK                  (0x80U)\r\n#define TRNG_MCTL_FOR_SCLK_SHIFT                 (7U)\r\n#define TRNG_MCTL_FOR_SCLK(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_FOR_SCLK_SHIFT)) & TRNG_MCTL_FOR_SCLK_MASK)\r\n\r\n#define TRNG_MCTL_FCT_FAIL_MASK                  (0x100U)\r\n#define TRNG_MCTL_FCT_FAIL_SHIFT                 (8U)\r\n#define TRNG_MCTL_FCT_FAIL(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_FCT_FAIL_SHIFT)) & TRNG_MCTL_FCT_FAIL_MASK)\r\n\r\n#define TRNG_MCTL_FCT_VAL_MASK                   (0x200U)\r\n#define TRNG_MCTL_FCT_VAL_SHIFT                  (9U)\r\n#define TRNG_MCTL_FCT_VAL(x)                     (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_FCT_VAL_SHIFT)) & TRNG_MCTL_FCT_VAL_MASK)\r\n\r\n#define TRNG_MCTL_ENT_VAL_MASK                   (0x400U)\r\n#define TRNG_MCTL_ENT_VAL_SHIFT                  (10U)\r\n#define TRNG_MCTL_ENT_VAL(x)                     (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_ENT_VAL_SHIFT)) & TRNG_MCTL_ENT_VAL_MASK)\r\n\r\n#define TRNG_MCTL_TST_OUT_MASK                   (0x800U)\r\n#define TRNG_MCTL_TST_OUT_SHIFT                  (11U)\r\n#define TRNG_MCTL_TST_OUT(x)                     (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_TST_OUT_SHIFT)) & TRNG_MCTL_TST_OUT_MASK)\r\n\r\n#define TRNG_MCTL_ERR_MASK                       (0x1000U)\r\n#define TRNG_MCTL_ERR_SHIFT                      (12U)\r\n#define TRNG_MCTL_ERR(x)                         (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_ERR_SHIFT)) & TRNG_MCTL_ERR_MASK)\r\n\r\n#define TRNG_MCTL_TSTOP_OK_MASK                  (0x2000U)\r\n#define TRNG_MCTL_TSTOP_OK_SHIFT                 (13U)\r\n#define TRNG_MCTL_TSTOP_OK(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_TSTOP_OK_SHIFT)) & TRNG_MCTL_TSTOP_OK_MASK)\r\n\r\n#define TRNG_MCTL_LRUN_CONT_MASK                 (0x4000U)\r\n#define TRNG_MCTL_LRUN_CONT_SHIFT                (14U)\r\n#define TRNG_MCTL_LRUN_CONT(x)                   (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_LRUN_CONT_SHIFT)) & TRNG_MCTL_LRUN_CONT_MASK)\r\n\r\n#define TRNG_MCTL_OSC2_FAIL_MASK                 (0x8000U)\r\n#define TRNG_MCTL_OSC2_FAIL_SHIFT                (15U)\r\n/*! OSC2_FAIL - Oscillator 2 Failure */\r\n#define TRNG_MCTL_OSC2_FAIL(x)                   (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_OSC2_FAIL_SHIFT)) & TRNG_MCTL_OSC2_FAIL_MASK)\r\n\r\n#define TRNG_MCTL_PRGM_MASK                      (0x10000U)\r\n#define TRNG_MCTL_PRGM_SHIFT                     (16U)\r\n#define TRNG_MCTL_PRGM(x)                        (((uint32_t)(((uint32_t)(x)) << TRNG_MCTL_PRGM_SHIFT)) & TRNG_MCTL_PRGM_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCMISC - Statistical Check Miscellaneous Register */\r\n/*! @{ */\r\n\r\n#define TRNG_SCMISC_LRUN_MAX_MASK                (0xFFU)\r\n#define TRNG_SCMISC_LRUN_MAX_SHIFT               (0U)\r\n#define TRNG_SCMISC_LRUN_MAX(x)                  (((uint32_t)(((uint32_t)(x)) << TRNG_SCMISC_LRUN_MAX_SHIFT)) & TRNG_SCMISC_LRUN_MAX_MASK)\r\n\r\n#define TRNG_SCMISC_RTY_CT_MASK                  (0xF0000U)\r\n#define TRNG_SCMISC_RTY_CT_SHIFT                 (16U)\r\n#define TRNG_SCMISC_RTY_CT(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_SCMISC_RTY_CT_SHIFT)) & TRNG_SCMISC_RTY_CT_MASK)\r\n/*! @} */\r\n\r\n/*! @name SDCTL - Seed Control Register */\r\n/*! @{ */\r\n\r\n#define TRNG_SDCTL_SAMP_SIZE_MASK                (0xFFFFU)\r\n#define TRNG_SDCTL_SAMP_SIZE_SHIFT               (0U)\r\n#define TRNG_SDCTL_SAMP_SIZE(x)                  (((uint32_t)(((uint32_t)(x)) << TRNG_SDCTL_SAMP_SIZE_SHIFT)) & TRNG_SDCTL_SAMP_SIZE_MASK)\r\n\r\n#define TRNG_SDCTL_ENT_DLY_MASK                  (0xFFFF0000U)\r\n#define TRNG_SDCTL_ENT_DLY_SHIFT                 (16U)\r\n#define TRNG_SDCTL_ENT_DLY(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_SDCTL_ENT_DLY_SHIFT)) & TRNG_SDCTL_ENT_DLY_MASK)\r\n/*! @} */\r\n\r\n/*! @name TOTSAM - Total Samples Register */\r\n/*! @{ */\r\n\r\n#define TRNG_TOTSAM_TOT_SAM_MASK                 (0xFFFFFU)\r\n#define TRNG_TOTSAM_TOT_SAM_SHIFT                (0U)\r\n#define TRNG_TOTSAM_TOT_SAM(x)                   (((uint32_t)(((uint32_t)(x)) << TRNG_TOTSAM_TOT_SAM_SHIFT)) & TRNG_TOTSAM_TOT_SAM_MASK)\r\n/*! @} */\r\n\r\n/*! @name FRQMIN - Frequency Count Minimum Limit Register */\r\n/*! @{ */\r\n\r\n#define TRNG_FRQMIN_FRQ_MIN_MASK                 (0x3FFFFFU)\r\n#define TRNG_FRQMIN_FRQ_MIN_SHIFT                (0U)\r\n#define TRNG_FRQMIN_FRQ_MIN(x)                   (((uint32_t)(((uint32_t)(x)) << TRNG_FRQMIN_FRQ_MIN_SHIFT)) & TRNG_FRQMIN_FRQ_MIN_MASK)\r\n/*! @} */\r\n\r\n/*! @name OSC2_FRQCNT - Oscillator-2 Frequency Count Register */\r\n/*! @{ */\r\n\r\n#define TRNG_OSC2_FRQCNT_OSC2_FRQ_CT_MASK        (0x3FFFFFU)\r\n#define TRNG_OSC2_FRQCNT_OSC2_FRQ_CT_SHIFT       (0U)\r\n#define TRNG_OSC2_FRQCNT_OSC2_FRQ_CT(x)          (((uint32_t)(((uint32_t)(x)) << TRNG_OSC2_FRQCNT_OSC2_FRQ_CT_SHIFT)) & TRNG_OSC2_FRQCNT_OSC2_FRQ_CT_MASK)\r\n/*! @} */\r\n\r\n/*! @name FRQCNT - Frequency Count Register */\r\n/*! @{ */\r\n\r\n#define TRNG_FRQCNT_FRQ_CT_MASK                  (0x3FFFFFU)\r\n#define TRNG_FRQCNT_FRQ_CT_SHIFT                 (0U)\r\n#define TRNG_FRQCNT_FRQ_CT(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_FRQCNT_FRQ_CT_SHIFT)) & TRNG_FRQCNT_FRQ_CT_MASK)\r\n/*! @} */\r\n\r\n/*! @name FRQMAX - Frequency Count Maximum Limit Register */\r\n/*! @{ */\r\n\r\n#define TRNG_FRQMAX_FRQ_MAX_MASK                 (0x3FFFFFU)\r\n#define TRNG_FRQMAX_FRQ_MAX_SHIFT                (0U)\r\n#define TRNG_FRQMAX_FRQ_MAX(x)                   (((uint32_t)(((uint32_t)(x)) << TRNG_FRQMAX_FRQ_MAX_SHIFT)) & TRNG_FRQMAX_FRQ_MAX_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCMC - Statistical Check Monobit Count Register */\r\n/*! @{ */\r\n\r\n#define TRNG_SCMC_MONO_CT_MASK                   (0xFFFFU)\r\n#define TRNG_SCMC_MONO_CT_SHIFT                  (0U)\r\n#define TRNG_SCMC_MONO_CT(x)                     (((uint32_t)(((uint32_t)(x)) << TRNG_SCMC_MONO_CT_SHIFT)) & TRNG_SCMC_MONO_CT_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCML - Statistical Check Monobit Limit Register */\r\n/*! @{ */\r\n\r\n#define TRNG_SCML_MONO_MAX_MASK                  (0xFFFFU)\r\n#define TRNG_SCML_MONO_MAX_SHIFT                 (0U)\r\n#define TRNG_SCML_MONO_MAX(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_SCML_MONO_MAX_SHIFT)) & TRNG_SCML_MONO_MAX_MASK)\r\n\r\n#define TRNG_SCML_MONO_RNG_MASK                  (0xFFFF0000U)\r\n#define TRNG_SCML_MONO_RNG_SHIFT                 (16U)\r\n#define TRNG_SCML_MONO_RNG(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_SCML_MONO_RNG_SHIFT)) & TRNG_SCML_MONO_RNG_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCR1C - Statistical Check Run Length 1 Count Register */\r\n/*! @{ */\r\n\r\n#define TRNG_SCR1C_R1_0_CT_MASK                  (0x7FFFU)\r\n#define TRNG_SCR1C_R1_0_CT_SHIFT                 (0U)\r\n#define TRNG_SCR1C_R1_0_CT(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_SCR1C_R1_0_CT_SHIFT)) & TRNG_SCR1C_R1_0_CT_MASK)\r\n\r\n#define TRNG_SCR1C_R1_1_CT_MASK                  (0x7FFF0000U)\r\n#define TRNG_SCR1C_R1_1_CT_SHIFT                 (16U)\r\n#define TRNG_SCR1C_R1_1_CT(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_SCR1C_R1_1_CT_SHIFT)) & TRNG_SCR1C_R1_1_CT_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCR1L - Statistical Check Run Length 1 Limit Register */\r\n/*! @{ */\r\n\r\n#define TRNG_SCR1L_RUN1_MAX_MASK                 (0x7FFFU)\r\n#define TRNG_SCR1L_RUN1_MAX_SHIFT                (0U)\r\n#define TRNG_SCR1L_RUN1_MAX(x)                   (((uint32_t)(((uint32_t)(x)) << TRNG_SCR1L_RUN1_MAX_SHIFT)) & TRNG_SCR1L_RUN1_MAX_MASK)\r\n\r\n#define TRNG_SCR1L_RUN1_RNG_MASK                 (0x7FFF0000U)\r\n#define TRNG_SCR1L_RUN1_RNG_SHIFT                (16U)\r\n#define TRNG_SCR1L_RUN1_RNG(x)                   (((uint32_t)(((uint32_t)(x)) << TRNG_SCR1L_RUN1_RNG_SHIFT)) & TRNG_SCR1L_RUN1_RNG_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCR2C - Statistical Check Run Length 2 Count Register */\r\n/*! @{ */\r\n\r\n#define TRNG_SCR2C_R2_0_CT_MASK                  (0x3FFFU)\r\n#define TRNG_SCR2C_R2_0_CT_SHIFT                 (0U)\r\n#define TRNG_SCR2C_R2_0_CT(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_SCR2C_R2_0_CT_SHIFT)) & TRNG_SCR2C_R2_0_CT_MASK)\r\n\r\n#define TRNG_SCR2C_R2_1_CT_MASK                  (0x3FFF0000U)\r\n#define TRNG_SCR2C_R2_1_CT_SHIFT                 (16U)\r\n#define TRNG_SCR2C_R2_1_CT(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_SCR2C_R2_1_CT_SHIFT)) & TRNG_SCR2C_R2_1_CT_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCR2L - Statistical Check Run Length 2 Limit Register */\r\n/*! @{ */\r\n\r\n#define TRNG_SCR2L_RUN2_MAX_MASK                 (0x3FFFU)\r\n#define TRNG_SCR2L_RUN2_MAX_SHIFT                (0U)\r\n#define TRNG_SCR2L_RUN2_MAX(x)                   (((uint32_t)(((uint32_t)(x)) << TRNG_SCR2L_RUN2_MAX_SHIFT)) & TRNG_SCR2L_RUN2_MAX_MASK)\r\n\r\n#define TRNG_SCR2L_RUN2_RNG_MASK                 (0x3FFF0000U)\r\n#define TRNG_SCR2L_RUN2_RNG_SHIFT                (16U)\r\n#define TRNG_SCR2L_RUN2_RNG(x)                   (((uint32_t)(((uint32_t)(x)) << TRNG_SCR2L_RUN2_RNG_SHIFT)) & TRNG_SCR2L_RUN2_RNG_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCR3C - Statistical Check Run Length 3 Count Register */\r\n/*! @{ */\r\n\r\n#define TRNG_SCR3C_R3_0_CT_MASK                  (0x1FFFU)\r\n#define TRNG_SCR3C_R3_0_CT_SHIFT                 (0U)\r\n#define TRNG_SCR3C_R3_0_CT(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_SCR3C_R3_0_CT_SHIFT)) & TRNG_SCR3C_R3_0_CT_MASK)\r\n\r\n#define TRNG_SCR3C_R3_1_CT_MASK                  (0x1FFF0000U)\r\n#define TRNG_SCR3C_R3_1_CT_SHIFT                 (16U)\r\n#define TRNG_SCR3C_R3_1_CT(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_SCR3C_R3_1_CT_SHIFT)) & TRNG_SCR3C_R3_1_CT_MASK)\r\n/*! @} */\r\n\r\n/*! @name SCR3L - Statistical Check Run Length 3 Limit Register */\r\n/*! @{ */\r\n\r\n#define TRNG_SCR3L_RUN3_MAX_MASK                 (0x1FFFU)\r\n#define TRNG_SCR3L_RUN3_MAX_SHIFT                (0U)\r\n#define TRNG_SCR3L_RUN3_MAX(x)                   (((uint32_t)(((uint32_t)(x)) << TRNG_SCR3L_RUN3_MAX_SHIFT)) & TRNG_SCR3L_RUN3_MAX_MASK)\r\n\r\n#define TRNG_SCR3L_RUN3_RNG_MASK                 (0x1FFF0000U)\r\n#define TRNG_SCR3L_RUN3_RNG_SHIFT                (16U)\r\n#define TRNG_SCR3L_RUN3_RNG(x)                   (((uint32_t)(((uint32_t)(x)) << TRNG_SCR3L_RUN3_RNG_SHIFT)) & TRNG_SCR3L_RUN3_RNG_MASK)\r\n/*! @} */\r\n\r\n/*! @name STATUS - Status Register */\r\n/*! @{ */\r\n\r\n#define TRNG_STATUS_TF1BR0_MASK                  (0x1U)\r\n#define TRNG_STATUS_TF1BR0_SHIFT                 (0U)\r\n#define TRNG_STATUS_TF1BR0(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TF1BR0_SHIFT)) & TRNG_STATUS_TF1BR0_MASK)\r\n\r\n#define TRNG_STATUS_TF1BR1_MASK                  (0x2U)\r\n#define TRNG_STATUS_TF1BR1_SHIFT                 (1U)\r\n#define TRNG_STATUS_TF1BR1(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TF1BR1_SHIFT)) & TRNG_STATUS_TF1BR1_MASK)\r\n\r\n#define TRNG_STATUS_TF2BR0_MASK                  (0x4U)\r\n#define TRNG_STATUS_TF2BR0_SHIFT                 (2U)\r\n#define TRNG_STATUS_TF2BR0(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TF2BR0_SHIFT)) & TRNG_STATUS_TF2BR0_MASK)\r\n\r\n#define TRNG_STATUS_TF2BR1_MASK                  (0x8U)\r\n#define TRNG_STATUS_TF2BR1_SHIFT                 (3U)\r\n#define TRNG_STATUS_TF2BR1(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TF2BR1_SHIFT)) & TRNG_STATUS_TF2BR1_MASK)\r\n\r\n#define TRNG_STATUS_TF3BR0_MASK                  (0x10U)\r\n#define TRNG_STATUS_TF3BR0_SHIFT                 (4U)\r\n#define TRNG_STATUS_TF3BR0(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TF3BR0_SHIFT)) & TRNG_STATUS_TF3BR0_MASK)\r\n\r\n#define TRNG_STATUS_TF3BR1_MASK                  (0x20U)\r\n#define TRNG_STATUS_TF3BR1_SHIFT                 (5U)\r\n#define TRNG_STATUS_TF3BR1(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TF3BR1_SHIFT)) & TRNG_STATUS_TF3BR1_MASK)\r\n\r\n#define TRNG_STATUS_TFLR_MASK                    (0x2000U)\r\n#define TRNG_STATUS_TFLR_SHIFT                   (13U)\r\n#define TRNG_STATUS_TFLR(x)                      (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TFLR_SHIFT)) & TRNG_STATUS_TFLR_MASK)\r\n\r\n#define TRNG_STATUS_TFMB_MASK                    (0x8000U)\r\n#define TRNG_STATUS_TFMB_SHIFT                   (15U)\r\n#define TRNG_STATUS_TFMB(x)                      (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_TFMB_SHIFT)) & TRNG_STATUS_TFMB_MASK)\r\n\r\n#define TRNG_STATUS_RETRY_CT_MASK                (0xF0000U)\r\n#define TRNG_STATUS_RETRY_CT_SHIFT               (16U)\r\n#define TRNG_STATUS_RETRY_CT(x)                  (((uint32_t)(((uint32_t)(x)) << TRNG_STATUS_RETRY_CT_SHIFT)) & TRNG_STATUS_RETRY_CT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ENT - Entropy Read Register */\r\n/*! @{ */\r\n\r\n#define TRNG_ENT_ENT_MASK                        (0xFFFFFFFFU)\r\n#define TRNG_ENT_ENT_SHIFT                       (0U)\r\n#define TRNG_ENT_ENT(x)                          (((uint32_t)(((uint32_t)(x)) << TRNG_ENT_ENT_SHIFT)) & TRNG_ENT_ENT_MASK)\r\n/*! @} */\r\n\r\n/* The count of TRNG_ENT */\r\n#define TRNG_ENT_COUNT                           (8U)\r\n\r\n/*! @name SEC_CFG - Security Configuration Register */\r\n/*! @{ */\r\n\r\n#define TRNG_SEC_CFG_UNUSED0_MASK                (0x1U)\r\n#define TRNG_SEC_CFG_UNUSED0_SHIFT               (0U)\r\n#define TRNG_SEC_CFG_UNUSED0(x)                  (((uint32_t)(((uint32_t)(x)) << TRNG_SEC_CFG_UNUSED0_SHIFT)) & TRNG_SEC_CFG_UNUSED0_MASK)\r\n\r\n#define TRNG_SEC_CFG_NO_PRGM_MASK                (0x2U)\r\n#define TRNG_SEC_CFG_NO_PRGM_SHIFT               (1U)\r\n/*! NO_PRGM\r\n *  0b0..Programability of registers controlled only by the Miscellaneous Control Register's access mode bit.\r\n *  0b1..Overides Miscellaneous Control Register access mode and prevents TRNG register programming.\r\n */\r\n#define TRNG_SEC_CFG_NO_PRGM(x)                  (((uint32_t)(((uint32_t)(x)) << TRNG_SEC_CFG_NO_PRGM_SHIFT)) & TRNG_SEC_CFG_NO_PRGM_MASK)\r\n\r\n#define TRNG_SEC_CFG_UNUSED2_MASK                (0x4U)\r\n#define TRNG_SEC_CFG_UNUSED2_SHIFT               (2U)\r\n#define TRNG_SEC_CFG_UNUSED2(x)                  (((uint32_t)(((uint32_t)(x)) << TRNG_SEC_CFG_UNUSED2_SHIFT)) & TRNG_SEC_CFG_UNUSED2_MASK)\r\n/*! @} */\r\n\r\n/*! @name INT_CTRL - Interrupt Control Register */\r\n/*! @{ */\r\n\r\n#define TRNG_INT_CTRL_HW_ERR_MASK                (0x1U)\r\n#define TRNG_INT_CTRL_HW_ERR_SHIFT               (0U)\r\n/*! HW_ERR\r\n *  0b0..Corresponding bit of INT_STATUS register cleared.\r\n *  0b1..Corresponding bit of INT_STATUS register active.\r\n */\r\n#define TRNG_INT_CTRL_HW_ERR(x)                  (((uint32_t)(((uint32_t)(x)) << TRNG_INT_CTRL_HW_ERR_SHIFT)) & TRNG_INT_CTRL_HW_ERR_MASK)\r\n\r\n#define TRNG_INT_CTRL_ENT_VAL_MASK               (0x2U)\r\n#define TRNG_INT_CTRL_ENT_VAL_SHIFT              (1U)\r\n/*! ENT_VAL\r\n *  0b0..Same behavior as bit 0 of this register.\r\n *  0b1..Same behavior as bit 0 of this register.\r\n */\r\n#define TRNG_INT_CTRL_ENT_VAL(x)                 (((uint32_t)(((uint32_t)(x)) << TRNG_INT_CTRL_ENT_VAL_SHIFT)) & TRNG_INT_CTRL_ENT_VAL_MASK)\r\n\r\n#define TRNG_INT_CTRL_FRQ_CT_FAIL_MASK           (0x4U)\r\n#define TRNG_INT_CTRL_FRQ_CT_FAIL_SHIFT          (2U)\r\n/*! FRQ_CT_FAIL\r\n *  0b0..Same behavior as bit 0 of this register.\r\n *  0b1..Same behavior as bit 0 of this register.\r\n */\r\n#define TRNG_INT_CTRL_FRQ_CT_FAIL(x)             (((uint32_t)(((uint32_t)(x)) << TRNG_INT_CTRL_FRQ_CT_FAIL_SHIFT)) & TRNG_INT_CTRL_FRQ_CT_FAIL_MASK)\r\n\r\n#define TRNG_INT_CTRL_UNUSED_MASK                (0xFFFFFFF8U)\r\n#define TRNG_INT_CTRL_UNUSED_SHIFT               (3U)\r\n#define TRNG_INT_CTRL_UNUSED(x)                  (((uint32_t)(((uint32_t)(x)) << TRNG_INT_CTRL_UNUSED_SHIFT)) & TRNG_INT_CTRL_UNUSED_MASK)\r\n/*! @} */\r\n\r\n/*! @name INT_MASK - Mask Register */\r\n/*! @{ */\r\n\r\n#define TRNG_INT_MASK_HW_ERR_MASK                (0x1U)\r\n#define TRNG_INT_MASK_HW_ERR_SHIFT               (0U)\r\n/*! HW_ERR\r\n *  0b0..Corresponding interrupt of INT_STATUS is masked.\r\n *  0b1..Corresponding bit of INT_STATUS is active.\r\n */\r\n#define TRNG_INT_MASK_HW_ERR(x)                  (((uint32_t)(((uint32_t)(x)) << TRNG_INT_MASK_HW_ERR_SHIFT)) & TRNG_INT_MASK_HW_ERR_MASK)\r\n\r\n#define TRNG_INT_MASK_ENT_VAL_MASK               (0x2U)\r\n#define TRNG_INT_MASK_ENT_VAL_SHIFT              (1U)\r\n/*! ENT_VAL\r\n *  0b0..Same behavior as bit 0 of this register.\r\n *  0b1..Same behavior as bit 0 of this register.\r\n */\r\n#define TRNG_INT_MASK_ENT_VAL(x)                 (((uint32_t)(((uint32_t)(x)) << TRNG_INT_MASK_ENT_VAL_SHIFT)) & TRNG_INT_MASK_ENT_VAL_MASK)\r\n\r\n#define TRNG_INT_MASK_FRQ_CT_FAIL_MASK           (0x4U)\r\n#define TRNG_INT_MASK_FRQ_CT_FAIL_SHIFT          (2U)\r\n/*! FRQ_CT_FAIL\r\n *  0b0..Same behavior as bit 0 of this register.\r\n *  0b1..Same behavior as bit 0 of this register.\r\n */\r\n#define TRNG_INT_MASK_FRQ_CT_FAIL(x)             (((uint32_t)(((uint32_t)(x)) << TRNG_INT_MASK_FRQ_CT_FAIL_SHIFT)) & TRNG_INT_MASK_FRQ_CT_FAIL_MASK)\r\n/*! @} */\r\n\r\n/*! @name INT_STATUS - Interrupt Status Register */\r\n/*! @{ */\r\n\r\n#define TRNG_INT_STATUS_HW_ERR_MASK              (0x1U)\r\n#define TRNG_INT_STATUS_HW_ERR_SHIFT             (0U)\r\n/*! HW_ERR\r\n *  0b0..no error\r\n *  0b1..error detected.\r\n */\r\n#define TRNG_INT_STATUS_HW_ERR(x)                (((uint32_t)(((uint32_t)(x)) << TRNG_INT_STATUS_HW_ERR_SHIFT)) & TRNG_INT_STATUS_HW_ERR_MASK)\r\n\r\n#define TRNG_INT_STATUS_ENT_VAL_MASK             (0x2U)\r\n#define TRNG_INT_STATUS_ENT_VAL_SHIFT            (1U)\r\n/*! ENT_VAL\r\n *  0b0..Busy generation entropy. Any value read is invalid.\r\n *  0b1..TRNG can be stopped and entropy is valid if read.\r\n */\r\n#define TRNG_INT_STATUS_ENT_VAL(x)               (((uint32_t)(((uint32_t)(x)) << TRNG_INT_STATUS_ENT_VAL_SHIFT)) & TRNG_INT_STATUS_ENT_VAL_MASK)\r\n\r\n#define TRNG_INT_STATUS_FRQ_CT_FAIL_MASK         (0x4U)\r\n#define TRNG_INT_STATUS_FRQ_CT_FAIL_SHIFT        (2U)\r\n/*! FRQ_CT_FAIL\r\n *  0b0..No hardware nor self test frequency errors.\r\n *  0b1..The frequency counter has detected a failure.\r\n */\r\n#define TRNG_INT_STATUS_FRQ_CT_FAIL(x)           (((uint32_t)(((uint32_t)(x)) << TRNG_INT_STATUS_FRQ_CT_FAIL_SHIFT)) & TRNG_INT_STATUS_FRQ_CT_FAIL_MASK)\r\n/*! @} */\r\n\r\n/*! @name OSC2_CTL - RNG Oscillator 2 Control Register */\r\n/*! @{ */\r\n\r\n#define TRNG_OSC2_CTL_TRNG_ENT_CTL_MASK          (0x3U)\r\n#define TRNG_OSC2_CTL_TRNG_ENT_CTL_SHIFT         (0U)\r\n/*! TRNG_ENT_CTL - TRNG entropy generation control. */\r\n#define TRNG_OSC2_CTL_TRNG_ENT_CTL(x)            (((uint32_t)(((uint32_t)(x)) << TRNG_OSC2_CTL_TRNG_ENT_CTL_SHIFT)) & TRNG_OSC2_CTL_TRNG_ENT_CTL_MASK)\r\n\r\n#define TRNG_OSC2_CTL_OSC2_DIV_MASK              (0xCU)\r\n#define TRNG_OSC2_CTL_OSC2_DIV_SHIFT             (2U)\r\n/*! OSC2_DIV - Oscillator 2 divide control */\r\n#define TRNG_OSC2_CTL_OSC2_DIV(x)                (((uint32_t)(((uint32_t)(x)) << TRNG_OSC2_CTL_OSC2_DIV_SHIFT)) & TRNG_OSC2_CTL_OSC2_DIV_MASK)\r\n\r\n#define TRNG_OSC2_CTL_OSC2_OUT_EN_MASK           (0x10U)\r\n#define TRNG_OSC2_CTL_OSC2_OUT_EN_SHIFT          (4U)\r\n/*! OSC2_OUT_EN - Oscillator 2 Output Enable. */\r\n#define TRNG_OSC2_CTL_OSC2_OUT_EN(x)             (((uint32_t)(((uint32_t)(x)) << TRNG_OSC2_CTL_OSC2_OUT_EN_SHIFT)) & TRNG_OSC2_CTL_OSC2_OUT_EN_MASK)\r\n\r\n#define TRNG_OSC2_CTL_OSC2_FCT_VAL_MASK          (0x200U)\r\n#define TRNG_OSC2_CTL_OSC2_FCT_VAL_SHIFT         (9U)\r\n/*! OSC2_FCT_VAL - TRNG Oscillator 2 Frequency Count Valid */\r\n#define TRNG_OSC2_CTL_OSC2_FCT_VAL(x)            (((uint32_t)(((uint32_t)(x)) << TRNG_OSC2_CTL_OSC2_FCT_VAL_SHIFT)) & TRNG_OSC2_CTL_OSC2_FCT_VAL_MASK)\r\n\r\n#define TRNG_OSC2_CTL_OSC2_TST_OUT_MASK          (0x800U)\r\n#define TRNG_OSC2_CTL_OSC2_TST_OUT_SHIFT         (11U)\r\n/*! OSC2_TST_OUT - Test point inside ring oscillator 2. */\r\n#define TRNG_OSC2_CTL_OSC2_TST_OUT(x)            (((uint32_t)(((uint32_t)(x)) << TRNG_OSC2_CTL_OSC2_TST_OUT_SHIFT)) & TRNG_OSC2_CTL_OSC2_TST_OUT_MASK)\r\n\r\n#define TRNG_OSC2_CTL_OSC_FAILSAFE_LMT_MASK      (0x3000U)\r\n#define TRNG_OSC2_CTL_OSC_FAILSAFE_LMT_SHIFT     (12U)\r\n/*! OSC_FAILSAFE_LMT - Test point inside ring oscillator 2. */\r\n#define TRNG_OSC2_CTL_OSC_FAILSAFE_LMT(x)        (((uint32_t)(((uint32_t)(x)) << TRNG_OSC2_CTL_OSC_FAILSAFE_LMT_SHIFT)) & TRNG_OSC2_CTL_OSC_FAILSAFE_LMT_MASK)\r\n\r\n#define TRNG_OSC2_CTL_OSC_FAILSAFE_TEST_MASK     (0x4000U)\r\n#define TRNG_OSC2_CTL_OSC_FAILSAFE_TEST_SHIFT    (14U)\r\n/*! OSC_FAILSAFE_TEST - Test point inside ring oscillator 2. */\r\n#define TRNG_OSC2_CTL_OSC_FAILSAFE_TEST(x)       (((uint32_t)(((uint32_t)(x)) << TRNG_OSC2_CTL_OSC_FAILSAFE_TEST_SHIFT)) & TRNG_OSC2_CTL_OSC_FAILSAFE_TEST_MASK)\r\n/*! @} */\r\n\r\n/*! @name VID1 - Version ID Register (MS) */\r\n/*! @{ */\r\n\r\n#define TRNG_VID1_MIN_REV_MASK                   (0xFFU)\r\n#define TRNG_VID1_MIN_REV_SHIFT                  (0U)\r\n/*! MIN_REV\r\n *  0b00000100..Minor revision number for TRNG.\r\n */\r\n#define TRNG_VID1_MIN_REV(x)                     (((uint32_t)(((uint32_t)(x)) << TRNG_VID1_MIN_REV_SHIFT)) & TRNG_VID1_MIN_REV_MASK)\r\n\r\n#define TRNG_VID1_MAJ_REV_MASK                   (0xFF00U)\r\n#define TRNG_VID1_MAJ_REV_SHIFT                  (8U)\r\n/*! MAJ_REV\r\n *  0b00010100..Major revision number for TRNG.\r\n */\r\n#define TRNG_VID1_MAJ_REV(x)                     (((uint32_t)(((uint32_t)(x)) << TRNG_VID1_MAJ_REV_SHIFT)) & TRNG_VID1_MAJ_REV_MASK)\r\n\r\n#define TRNG_VID1_IP_ID_MASK                     (0xFFFF0000U)\r\n#define TRNG_VID1_IP_ID_SHIFT                    (16U)\r\n/*! IP_ID\r\n *  0b0000000000110000..ID for TRNG.\r\n */\r\n#define TRNG_VID1_IP_ID(x)                       (((uint32_t)(((uint32_t)(x)) << TRNG_VID1_IP_ID_SHIFT)) & TRNG_VID1_IP_ID_MASK)\r\n/*! @} */\r\n\r\n/*! @name VID2 - Version ID Register (LS) */\r\n/*! @{ */\r\n\r\n#define TRNG_VID2_CONFIG_OPT_MASK                (0xFFU)\r\n#define TRNG_VID2_CONFIG_OPT_SHIFT               (0U)\r\n/*! CONFIG_OPT\r\n *  0b00000000..TRNG_CONFIG_OPT for TRNG.\r\n */\r\n#define TRNG_VID2_CONFIG_OPT(x)                  (((uint32_t)(((uint32_t)(x)) << TRNG_VID2_CONFIG_OPT_SHIFT)) & TRNG_VID2_CONFIG_OPT_MASK)\r\n\r\n#define TRNG_VID2_ECO_REV_MASK                   (0xFF00U)\r\n#define TRNG_VID2_ECO_REV_SHIFT                  (8U)\r\n/*! ECO_REV\r\n *  0b00000001..TRNG_ECO_REV for TRNG.\r\n */\r\n#define TRNG_VID2_ECO_REV(x)                     (((uint32_t)(((uint32_t)(x)) << TRNG_VID2_ECO_REV_SHIFT)) & TRNG_VID2_ECO_REV_MASK)\r\n\r\n#define TRNG_VID2_INTG_OPT_MASK                  (0xFF0000U)\r\n#define TRNG_VID2_INTG_OPT_SHIFT                 (16U)\r\n/*! INTG_OPT\r\n *  0b00001010..INTG_OPT for TRNG.\r\n */\r\n#define TRNG_VID2_INTG_OPT(x)                    (((uint32_t)(((uint32_t)(x)) << TRNG_VID2_INTG_OPT_SHIFT)) & TRNG_VID2_INTG_OPT_MASK)\r\n\r\n#define TRNG_VID2_ERA_MASK                       (0xFF000000U)\r\n#define TRNG_VID2_ERA_SHIFT                      (24U)\r\n/*! ERA\r\n *  0b00001011..COMPILE_OPT for TRNG.\r\n */\r\n#define TRNG_VID2_ERA(x)                         (((uint32_t)(((uint32_t)(x)) << TRNG_VID2_ERA_SHIFT)) & TRNG_VID2_ERA_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group TRNG_Register_Masks */\r\n\r\n\r\n/* TRNG - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral TRNG base address */\r\n  #define TRNG_BASE                                (0x50014000u)\r\n  /** Peripheral TRNG base address */\r\n  #define TRNG_BASE_NS                             (0x40014000u)\r\n  /** Peripheral TRNG base pointer */\r\n  #define TRNG                                     ((TRNG_Type *)TRNG_BASE)\r\n  /** Peripheral TRNG base pointer */\r\n  #define TRNG_NS                                  ((TRNG_Type *)TRNG_BASE_NS)\r\n  /** Array initializer of TRNG peripheral base addresses */\r\n  #define TRNG_BASE_ADDRS                          { TRNG_BASE }\r\n  /** Array initializer of TRNG peripheral base pointers */\r\n  #define TRNG_BASE_PTRS                           { TRNG }\r\n  /** Array initializer of TRNG peripheral base addresses */\r\n  #define TRNG_BASE_ADDRS_NS                       { TRNG_BASE_NS }\r\n  /** Array initializer of TRNG peripheral base pointers */\r\n  #define TRNG_BASE_PTRS_NS                        { TRNG_NS }\r\n#else\r\n  /** Peripheral TRNG base address */\r\n  #define TRNG_BASE                                (0x40014000u)\r\n  /** Peripheral TRNG base pointer */\r\n  #define TRNG                                     ((TRNG_Type *)TRNG_BASE)\r\n  /** Array initializer of TRNG peripheral base addresses */\r\n  #define TRNG_BASE_ADDRS                          { TRNG_BASE }\r\n  /** Array initializer of TRNG peripheral base pointers */\r\n  #define TRNG_BASE_PTRS                           { TRNG }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group TRNG_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- USART Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup USART_Peripheral_Access_Layer USART Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** USART - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t CFG;                               /**< USART Configuration, offset: 0x0 */\r\n  __IO uint32_t CTL;                               /**< USART Control, offset: 0x4 */\r\n  __IO uint32_t STAT;                              /**< USART Status, offset: 0x8 */\r\n  __IO uint32_t INTENSET;                          /**< Interrupt Enable Read and Set for USART (not FIFO) Status, offset: 0xC */\r\n  __O  uint32_t INTENCLR;                          /**< Interrupt Enable Clear, offset: 0x10 */\r\n       uint8_t RESERVED_0[12];\r\n  __IO uint32_t BRG;                               /**< Baud Rate Generator, offset: 0x20 */\r\n  __I  uint32_t INTSTAT;                           /**< Interrupt Status, offset: 0x24 */\r\n  __IO uint32_t OSR;                               /**< Oversample Selection Register for Asynchronous Communication, offset: 0x28 */\r\n  __IO uint32_t ADDR;                              /**< Address Register for Automatic Address Matching, offset: 0x2C */\r\n       uint8_t RESERVED_1[3536];\r\n  __IO uint32_t FIFOCFG;                           /**< FIFO Configuration, offset: 0xE00 */\r\n  __IO uint32_t FIFOSTAT;                          /**< FIFO Status, offset: 0xE04 */\r\n  __IO uint32_t FIFOTRIG;                          /**< FIFO Trigger Settings for Interrupt and DMA Request, offset: 0xE08 */\r\n       uint8_t RESERVED_2[4];\r\n  __IO uint32_t FIFOINTENSET;                      /**< FIFO Interrupt Enable, offset: 0xE10 */\r\n  __IO uint32_t FIFOINTENCLR;                      /**< FIFO Interrupt Enable Clear, offset: 0xE14 */\r\n  __I  uint32_t FIFOINTSTAT;                       /**< FIFO Interrupt Status, offset: 0xE18 */\r\n       uint8_t RESERVED_3[4];\r\n  __O  uint32_t FIFOWR;                            /**< FIFO Write Data, offset: 0xE20 */\r\n       uint8_t RESERVED_4[12];\r\n  __I  uint32_t FIFORD;                            /**< FIFO Read Data, offset: 0xE30 */\r\n       uint8_t RESERVED_5[12];\r\n  __I  uint32_t FIFORDNOPOP;                       /**< FIFO Data Read with No FIFO Pop, offset: 0xE40 */\r\n       uint8_t RESERVED_6[4];\r\n  __I  uint32_t FIFOSIZE;                          /**< FIFO Size, offset: 0xE48 */\r\n  struct {                                         /* offset: 0xE4C */\r\n    __IO uint32_t FIFORXTIMEOUTCFG;                  /**< FIFO Receive Timeout Configuration, offset: 0xE4C */\r\n    __I  uint32_t FIFORXTIMEOUTCNT;                  /**< FIFO Receive Timeout Counter, offset: 0xE50 */\r\n  } FIFO_USART;\r\n       uint8_t RESERVED_7[424];\r\n  __I  uint32_t ID;                                /**< Peripheral Identification, offset: 0xFFC */\r\n} USART_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- USART Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup USART_Register_Masks USART Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name CFG - USART Configuration */\r\n/*! @{ */\r\n\r\n#define USART_CFG_ENABLE_MASK                    (0x1U)\r\n#define USART_CFG_ENABLE_SHIFT                   (0U)\r\n/*! ENABLE - USART Enable\r\n *  0b0..Disabled\r\n *  0b1..Enabled. The USART is enabled for operation.\r\n */\r\n#define USART_CFG_ENABLE(x)                      (((uint32_t)(((uint32_t)(x)) << USART_CFG_ENABLE_SHIFT)) & USART_CFG_ENABLE_MASK)\r\n\r\n#define USART_CFG_DATALEN_MASK                   (0xCU)\r\n#define USART_CFG_DATALEN_SHIFT                  (2U)\r\n/*! DATALEN - Data Length. Selects the data size for the USART.\r\n *  0b00..7 bit data length\r\n *  0b01..8 bit data length\r\n *  0b10..9 bit data length. The 9th bit is commonly used for addressing in multidrop mode. See the ADDRDET[CTL].\r\n *  0b11..Reserved\r\n */\r\n#define USART_CFG_DATALEN(x)                     (((uint32_t)(((uint32_t)(x)) << USART_CFG_DATALEN_SHIFT)) & USART_CFG_DATALEN_MASK)\r\n\r\n#define USART_CFG_PARITYSEL_MASK                 (0x30U)\r\n#define USART_CFG_PARITYSEL_SHIFT                (4U)\r\n/*! PARITYSEL - Parity Select. Selects what type of parity is used by the USART.\r\n *  0b00..No parity\r\n *  0b01..Reserved\r\n *  0b10..Even parity\r\n *  0b11..Odd parity\r\n */\r\n#define USART_CFG_PARITYSEL(x)                   (((uint32_t)(((uint32_t)(x)) << USART_CFG_PARITYSEL_SHIFT)) & USART_CFG_PARITYSEL_MASK)\r\n\r\n#define USART_CFG_STOPLEN_MASK                   (0x40U)\r\n#define USART_CFG_STOPLEN_SHIFT                  (6U)\r\n/*! STOPLEN - Stop Length\r\n *  0b0..1 stop bit\r\n *  0b1..2 stop bits. This setting should be used only for asynchronous communication.\r\n */\r\n#define USART_CFG_STOPLEN(x)                     (((uint32_t)(((uint32_t)(x)) << USART_CFG_STOPLEN_SHIFT)) & USART_CFG_STOPLEN_MASK)\r\n\r\n#define USART_CFG_MODE32K_MASK                   (0x80U)\r\n#define USART_CFG_MODE32K_SHIFT                  (7U)\r\n/*! MODE32K - Mode 32 kHz\r\n *  0b0..Disabled. USART uses standard clocking.\r\n *  0b1..Enabled\r\n */\r\n#define USART_CFG_MODE32K(x)                     (((uint32_t)(((uint32_t)(x)) << USART_CFG_MODE32K_SHIFT)) & USART_CFG_MODE32K_MASK)\r\n\r\n#define USART_CFG_LINMODE_MASK                   (0x100U)\r\n#define USART_CFG_LINMODE_SHIFT                  (8U)\r\n/*! LINMODE - LIN Break Mode Enable\r\n *  0b0..Disabled. Break detect and generate is configured for normal operation.\r\n *  0b1..Enabled. Break detect and generate is configured for LIN bus operation.\r\n */\r\n#define USART_CFG_LINMODE(x)                     (((uint32_t)(((uint32_t)(x)) << USART_CFG_LINMODE_SHIFT)) & USART_CFG_LINMODE_MASK)\r\n\r\n#define USART_CFG_CTSEN_MASK                     (0x200U)\r\n#define USART_CFG_CTSEN_SHIFT                    (9U)\r\n/*! CTSEN - CTS Enable\r\n *  0b0..No flow control. The transmitter does not receive any automatic flow control signal.\r\n *  0b1..Flow control enabled. The transmitter uses the CTS input (or RTS output in loopback mode) for flow control purposes.\r\n */\r\n#define USART_CFG_CTSEN(x)                       (((uint32_t)(((uint32_t)(x)) << USART_CFG_CTSEN_SHIFT)) & USART_CFG_CTSEN_MASK)\r\n\r\n#define USART_CFG_SYNCEN_MASK                    (0x800U)\r\n#define USART_CFG_SYNCEN_SHIFT                   (11U)\r\n/*! SYNCEN - Synchronous Enable. Selects synchronous or asynchronous operation.\r\n *  0b0..Asynchronous mode\r\n *  0b1..Synchronous mode\r\n */\r\n#define USART_CFG_SYNCEN(x)                      (((uint32_t)(((uint32_t)(x)) << USART_CFG_SYNCEN_SHIFT)) & USART_CFG_SYNCEN_MASK)\r\n\r\n#define USART_CFG_CLKPOL_MASK                    (0x1000U)\r\n#define USART_CFG_CLKPOL_SHIFT                   (12U)\r\n/*! CLKPOL - Clock Polarity\r\n *  0b0..Falling edge. RXD is sampled on the falling edge of SCLK.\r\n *  0b1..Rising edge. RXD is sampled on the rising edge of SCLK.\r\n */\r\n#define USART_CFG_CLKPOL(x)                      (((uint32_t)(((uint32_t)(x)) << USART_CFG_CLKPOL_SHIFT)) & USART_CFG_CLKPOL_MASK)\r\n\r\n#define USART_CFG_SYNCMST_MASK                   (0x4000U)\r\n#define USART_CFG_SYNCMST_SHIFT                  (14U)\r\n/*! SYNCMST - Synchronous mode Master Select\r\n *  0b0..Slave. When synchronous mode is enabled, the USART is a slave.\r\n *  0b1..Master. When synchronous mode is enabled, the USART is a master.\r\n */\r\n#define USART_CFG_SYNCMST(x)                     (((uint32_t)(((uint32_t)(x)) << USART_CFG_SYNCMST_SHIFT)) & USART_CFG_SYNCMST_MASK)\r\n\r\n#define USART_CFG_LOOP_MASK                      (0x8000U)\r\n#define USART_CFG_LOOP_SHIFT                     (15U)\r\n/*! LOOP - Loopback Mode\r\n *  0b0..Normal operation\r\n *  0b1..Loopback mode\r\n */\r\n#define USART_CFG_LOOP(x)                        (((uint32_t)(((uint32_t)(x)) << USART_CFG_LOOP_SHIFT)) & USART_CFG_LOOP_MASK)\r\n\r\n#define USART_CFG_OETA_MASK                      (0x40000U)\r\n#define USART_CFG_OETA_SHIFT                     (18U)\r\n/*! OETA - Output Enable Turnaround Time Enable for RS-485 Operation.\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define USART_CFG_OETA(x)                        (((uint32_t)(((uint32_t)(x)) << USART_CFG_OETA_SHIFT)) & USART_CFG_OETA_MASK)\r\n\r\n#define USART_CFG_AUTOADDR_MASK                  (0x80000U)\r\n#define USART_CFG_AUTOADDR_SHIFT                 (19U)\r\n/*! AUTOADDR - Automatic Address Matching Enable\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define USART_CFG_AUTOADDR(x)                    (((uint32_t)(((uint32_t)(x)) << USART_CFG_AUTOADDR_SHIFT)) & USART_CFG_AUTOADDR_MASK)\r\n\r\n#define USART_CFG_OESEL_MASK                     (0x100000U)\r\n#define USART_CFG_OESEL_SHIFT                    (20U)\r\n/*! OESEL - Output Enable Select\r\n *  0b0..Standard. The RTS signal is used as the standard flow control function.\r\n *  0b1..RS-485. The RTS signal is configured to provide an output enable signal to control an RS-485 transceiver.\r\n */\r\n#define USART_CFG_OESEL(x)                       (((uint32_t)(((uint32_t)(x)) << USART_CFG_OESEL_SHIFT)) & USART_CFG_OESEL_MASK)\r\n\r\n#define USART_CFG_OEPOL_MASK                     (0x200000U)\r\n#define USART_CFG_OEPOL_SHIFT                    (21U)\r\n/*! OEPOL - Output Enable Polarity\r\n *  0b0..Low. If selected by OESEL, the output enable is active low.\r\n *  0b1..High. If selected by OESEL, the output enable is active high.\r\n */\r\n#define USART_CFG_OEPOL(x)                       (((uint32_t)(((uint32_t)(x)) << USART_CFG_OEPOL_SHIFT)) & USART_CFG_OEPOL_MASK)\r\n\r\n#define USART_CFG_RXPOL_MASK                     (0x400000U)\r\n#define USART_CFG_RXPOL_SHIFT                    (22U)\r\n/*! RXPOL - Receive Data Polarity\r\n *  0b0..Standard\r\n *  0b1..Inverted\r\n */\r\n#define USART_CFG_RXPOL(x)                       (((uint32_t)(((uint32_t)(x)) << USART_CFG_RXPOL_SHIFT)) & USART_CFG_RXPOL_MASK)\r\n\r\n#define USART_CFG_TXPOL_MASK                     (0x800000U)\r\n#define USART_CFG_TXPOL_SHIFT                    (23U)\r\n/*! TXPOL - Transmit data polarity\r\n *  0b0..Standard\r\n *  0b1..Inverted\r\n */\r\n#define USART_CFG_TXPOL(x)                       (((uint32_t)(((uint32_t)(x)) << USART_CFG_TXPOL_SHIFT)) & USART_CFG_TXPOL_MASK)\r\n/*! @} */\r\n\r\n/*! @name CTL - USART Control */\r\n/*! @{ */\r\n\r\n#define USART_CTL_TXBRKEN_MASK                   (0x2U)\r\n#define USART_CTL_TXBRKEN_SHIFT                  (1U)\r\n/*! TXBRKEN - Break Enable\r\n *  0b0..Normal operation\r\n *  0b1..Continuous break\r\n */\r\n#define USART_CTL_TXBRKEN(x)                     (((uint32_t)(((uint32_t)(x)) << USART_CTL_TXBRKEN_SHIFT)) & USART_CTL_TXBRKEN_MASK)\r\n\r\n#define USART_CTL_ADDRDET_MASK                   (0x4U)\r\n#define USART_CTL_ADDRDET_SHIFT                  (2U)\r\n/*! ADDRDET - Enable Address Detect Mode\r\n *  0b0..Disabled. The USART presents all incoming data.\r\n *  0b1..Enabled\r\n */\r\n#define USART_CTL_ADDRDET(x)                     (((uint32_t)(((uint32_t)(x)) << USART_CTL_ADDRDET_SHIFT)) & USART_CTL_ADDRDET_MASK)\r\n\r\n#define USART_CTL_TXDIS_MASK                     (0x40U)\r\n#define USART_CTL_TXDIS_SHIFT                    (6U)\r\n/*! TXDIS - Transmit Disable\r\n *  0b0..Not disabled. USART transmitter is not disabled.\r\n *  0b1..Disabled. USART transmitter is disabled after any character currently being transmitted is complete. This\r\n *       feature can be used to facilitate software flow control.\r\n */\r\n#define USART_CTL_TXDIS(x)                       (((uint32_t)(((uint32_t)(x)) << USART_CTL_TXDIS_SHIFT)) & USART_CTL_TXDIS_MASK)\r\n\r\n#define USART_CTL_CC_MASK                        (0x100U)\r\n#define USART_CTL_CC_SHIFT                       (8U)\r\n/*! CC - Continuous Clock Generation\r\n *  0b0..Clock on character\r\n *  0b1..Continuous clock\r\n */\r\n#define USART_CTL_CC(x)                          (((uint32_t)(((uint32_t)(x)) << USART_CTL_CC_SHIFT)) & USART_CTL_CC_MASK)\r\n\r\n#define USART_CTL_CLRCCONRX_MASK                 (0x200U)\r\n#define USART_CTL_CLRCCONRX_SHIFT                (9U)\r\n/*! CLRCCONRX - Clear Continuous Clock\r\n *  0b0..No effect. No effect on the CC bit.\r\n *  0b1..Auto-clear\r\n */\r\n#define USART_CTL_CLRCCONRX(x)                   (((uint32_t)(((uint32_t)(x)) << USART_CTL_CLRCCONRX_SHIFT)) & USART_CTL_CLRCCONRX_MASK)\r\n\r\n#define USART_CTL_AUTOBAUD_MASK                  (0x10000U)\r\n#define USART_CTL_AUTOBAUD_SHIFT                 (16U)\r\n/*! AUTOBAUD - Autobaud Enable\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define USART_CTL_AUTOBAUD(x)                    (((uint32_t)(((uint32_t)(x)) << USART_CTL_AUTOBAUD_SHIFT)) & USART_CTL_AUTOBAUD_MASK)\r\n/*! @} */\r\n\r\n/*! @name STAT - USART Status */\r\n/*! @{ */\r\n\r\n#define USART_STAT_RXIDLE_MASK                   (0x2U)\r\n#define USART_STAT_RXIDLE_SHIFT                  (1U)\r\n/*! RXIDLE - Receiver Idle\r\n *  0b0..The receiver is currently receiving data.\r\n *  0b1..The receiver is not currently receiving data.\r\n */\r\n#define USART_STAT_RXIDLE(x)                     (((uint32_t)(((uint32_t)(x)) << USART_STAT_RXIDLE_SHIFT)) & USART_STAT_RXIDLE_MASK)\r\n\r\n#define USART_STAT_TXIDLE_MASK                   (0x8U)\r\n#define USART_STAT_TXIDLE_SHIFT                  (3U)\r\n/*! TXIDLE - Transmitter Idle\r\n *  0b0..The transmitter is currently sending data.\r\n *  0b1..The transmitter is not currently sending data.\r\n */\r\n#define USART_STAT_TXIDLE(x)                     (((uint32_t)(((uint32_t)(x)) << USART_STAT_TXIDLE_SHIFT)) & USART_STAT_TXIDLE_MASK)\r\n\r\n#define USART_STAT_CTS_MASK                      (0x10U)\r\n#define USART_STAT_CTS_SHIFT                     (4U)\r\n/*! CTS - CTS value */\r\n#define USART_STAT_CTS(x)                        (((uint32_t)(((uint32_t)(x)) << USART_STAT_CTS_SHIFT)) & USART_STAT_CTS_MASK)\r\n\r\n#define USART_STAT_DELTACTS_MASK                 (0x20U)\r\n#define USART_STAT_DELTACTS_SHIFT                (5U)\r\n/*! DELTACTS - Delta CTS */\r\n#define USART_STAT_DELTACTS(x)                   (((uint32_t)(((uint32_t)(x)) << USART_STAT_DELTACTS_SHIFT)) & USART_STAT_DELTACTS_MASK)\r\n\r\n#define USART_STAT_TXDISSTAT_MASK                (0x40U)\r\n#define USART_STAT_TXDISSTAT_SHIFT               (6U)\r\n/*! TXDISSTAT - Transmitter Disabled Status Flag\r\n *  0b0..Not Idle. Indicates that the USART transmitter is NOT fully idle after being disabled.\r\n *  0b1..Idle. Indicates that the USART transmitter is fully idle after being disabled (CTL[TXDIS] = 1).\r\n */\r\n#define USART_STAT_TXDISSTAT(x)                  (((uint32_t)(((uint32_t)(x)) << USART_STAT_TXDISSTAT_SHIFT)) & USART_STAT_TXDISSTAT_MASK)\r\n\r\n#define USART_STAT_RXBRK_MASK                    (0x400U)\r\n#define USART_STAT_RXBRK_SHIFT                   (10U)\r\n/*! RXBRK - Received Break */\r\n#define USART_STAT_RXBRK(x)                      (((uint32_t)(((uint32_t)(x)) << USART_STAT_RXBRK_SHIFT)) & USART_STAT_RXBRK_MASK)\r\n\r\n#define USART_STAT_DELTARXBRK_MASK               (0x800U)\r\n#define USART_STAT_DELTARXBRK_SHIFT              (11U)\r\n/*! DELTARXBRK - Delta Received Break */\r\n#define USART_STAT_DELTARXBRK(x)                 (((uint32_t)(((uint32_t)(x)) << USART_STAT_DELTARXBRK_SHIFT)) & USART_STAT_DELTARXBRK_MASK)\r\n\r\n#define USART_STAT_START_MASK                    (0x1000U)\r\n#define USART_STAT_START_SHIFT                   (12U)\r\n/*! START - Start */\r\n#define USART_STAT_START(x)                      (((uint32_t)(((uint32_t)(x)) << USART_STAT_START_SHIFT)) & USART_STAT_START_MASK)\r\n\r\n#define USART_STAT_FRAMERRINT_MASK               (0x2000U)\r\n#define USART_STAT_FRAMERRINT_SHIFT              (13U)\r\n/*! FRAMERRINT - Framing Error Interrupt Flag */\r\n#define USART_STAT_FRAMERRINT(x)                 (((uint32_t)(((uint32_t)(x)) << USART_STAT_FRAMERRINT_SHIFT)) & USART_STAT_FRAMERRINT_MASK)\r\n\r\n#define USART_STAT_PARITYERRINT_MASK             (0x4000U)\r\n#define USART_STAT_PARITYERRINT_SHIFT            (14U)\r\n/*! PARITYERRINT - Parity Error Interrupt Flag */\r\n#define USART_STAT_PARITYERRINT(x)               (((uint32_t)(((uint32_t)(x)) << USART_STAT_PARITYERRINT_SHIFT)) & USART_STAT_PARITYERRINT_MASK)\r\n\r\n#define USART_STAT_RXNOISEINT_MASK               (0x8000U)\r\n#define USART_STAT_RXNOISEINT_SHIFT              (15U)\r\n/*! RXNOISEINT - Received Noise Interrupt Flag */\r\n#define USART_STAT_RXNOISEINT(x)                 (((uint32_t)(((uint32_t)(x)) << USART_STAT_RXNOISEINT_SHIFT)) & USART_STAT_RXNOISEINT_MASK)\r\n\r\n#define USART_STAT_ABERR_MASK                    (0x10000U)\r\n#define USART_STAT_ABERR_SHIFT                   (16U)\r\n/*! ABERR - Auto Baud Error */\r\n#define USART_STAT_ABERR(x)                      (((uint32_t)(((uint32_t)(x)) << USART_STAT_ABERR_SHIFT)) & USART_STAT_ABERR_MASK)\r\n/*! @} */\r\n\r\n/*! @name INTENSET - Interrupt Enable Read and Set for USART (not FIFO) Status */\r\n/*! @{ */\r\n\r\n#define USART_INTENSET_TXIDLEEN_MASK             (0x8U)\r\n#define USART_INTENSET_TXIDLEEN_SHIFT            (3U)\r\n/*! TXIDLEEN - Transmit Idle Flag\r\n *  0b1..Enables an interrupt when the transmitter becomes idle (STAT[TXIDLE] = 1).\r\n */\r\n#define USART_INTENSET_TXIDLEEN(x)               (((uint32_t)(((uint32_t)(x)) << USART_INTENSET_TXIDLEEN_SHIFT)) & USART_INTENSET_TXIDLEEN_MASK)\r\n\r\n#define USART_INTENSET_DELTACTSEN_MASK           (0x20U)\r\n#define USART_INTENSET_DELTACTSEN_SHIFT          (5U)\r\n/*! DELTACTSEN - Delta CTS Input Flag\r\n *  0b1..Enables an interrupt when there is a change in the state of the CTS input.\r\n */\r\n#define USART_INTENSET_DELTACTSEN(x)             (((uint32_t)(((uint32_t)(x)) << USART_INTENSET_DELTACTSEN_SHIFT)) & USART_INTENSET_DELTACTSEN_MASK)\r\n\r\n#define USART_INTENSET_TXDISEN_MASK              (0x40U)\r\n#define USART_INTENSET_TXDISEN_SHIFT             (6U)\r\n/*! TXDISEN - Transmit Disabled Flag\r\n *  0b1..Enables an interrupt when the transmitter is fully disabled as indicated by the STAT[TXDISINT] flag. See\r\n *       the description of the STAT[TXDISINT] flag.\r\n */\r\n#define USART_INTENSET_TXDISEN(x)                (((uint32_t)(((uint32_t)(x)) << USART_INTENSET_TXDISEN_SHIFT)) & USART_INTENSET_TXDISEN_MASK)\r\n\r\n#define USART_INTENSET_DELTARXBRKEN_MASK         (0x800U)\r\n#define USART_INTENSET_DELTARXBRKEN_SHIFT        (11U)\r\n/*! DELTARXBRKEN - Delta Receive Break Enable\r\n *  0b1..Enable\r\n */\r\n#define USART_INTENSET_DELTARXBRKEN(x)           (((uint32_t)(((uint32_t)(x)) << USART_INTENSET_DELTARXBRKEN_SHIFT)) & USART_INTENSET_DELTARXBRKEN_MASK)\r\n\r\n#define USART_INTENSET_STARTEN_MASK              (0x1000U)\r\n#define USART_INTENSET_STARTEN_SHIFT             (12U)\r\n/*! STARTEN - Start Enable\r\n *  0b1..Enables an interrupt when a received start bit has been detected.\r\n */\r\n#define USART_INTENSET_STARTEN(x)                (((uint32_t)(((uint32_t)(x)) << USART_INTENSET_STARTEN_SHIFT)) & USART_INTENSET_STARTEN_MASK)\r\n\r\n#define USART_INTENSET_FRAMERREN_MASK            (0x2000U)\r\n#define USART_INTENSET_FRAMERREN_SHIFT           (13U)\r\n/*! FRAMERREN - Frame Error Enable\r\n *  0b1..Enables an interrupt when a framing error has been detected.\r\n */\r\n#define USART_INTENSET_FRAMERREN(x)              (((uint32_t)(((uint32_t)(x)) << USART_INTENSET_FRAMERREN_SHIFT)) & USART_INTENSET_FRAMERREN_MASK)\r\n\r\n#define USART_INTENSET_PARITYERREN_MASK          (0x4000U)\r\n#define USART_INTENSET_PARITYERREN_SHIFT         (14U)\r\n/*! PARITYERREN - Parity Error Enble\r\n *  0b1..Enables an interrupt when a parity error has been detected.\r\n */\r\n#define USART_INTENSET_PARITYERREN(x)            (((uint32_t)(((uint32_t)(x)) << USART_INTENSET_PARITYERREN_SHIFT)) & USART_INTENSET_PARITYERREN_MASK)\r\n\r\n#define USART_INTENSET_RXNOISEEN_MASK            (0x8000U)\r\n#define USART_INTENSET_RXNOISEEN_SHIFT           (15U)\r\n/*! RXNOISEEN - Receive Noise Enable\r\n *  0b1..Enables an interrupt when noise is detected. See the description of the CTL[RXNOISEINT] bit.\r\n */\r\n#define USART_INTENSET_RXNOISEEN(x)              (((uint32_t)(((uint32_t)(x)) << USART_INTENSET_RXNOISEEN_SHIFT)) & USART_INTENSET_RXNOISEEN_MASK)\r\n\r\n#define USART_INTENSET_ABERREN_MASK              (0x10000U)\r\n#define USART_INTENSET_ABERREN_SHIFT             (16U)\r\n/*! ABERREN - Auto Baud Error Enable\r\n *  0b1..Enables an interrupt when an auto baud error occurs.\r\n */\r\n#define USART_INTENSET_ABERREN(x)                (((uint32_t)(((uint32_t)(x)) << USART_INTENSET_ABERREN_SHIFT)) & USART_INTENSET_ABERREN_MASK)\r\n/*! @} */\r\n\r\n/*! @name INTENCLR - Interrupt Enable Clear */\r\n/*! @{ */\r\n\r\n#define USART_INTENCLR_TXIDLECLR_MASK            (0x8U)\r\n#define USART_INTENCLR_TXIDLECLR_SHIFT           (3U)\r\n/*! TXIDLECLR - Transmit Idle Clear */\r\n#define USART_INTENCLR_TXIDLECLR(x)              (((uint32_t)(((uint32_t)(x)) << USART_INTENCLR_TXIDLECLR_SHIFT)) & USART_INTENCLR_TXIDLECLR_MASK)\r\n\r\n#define USART_INTENCLR_DELTACTSCLR_MASK          (0x20U)\r\n#define USART_INTENCLR_DELTACTSCLR_SHIFT         (5U)\r\n/*! DELTACTSCLR - Delta CTS Clear */\r\n#define USART_INTENCLR_DELTACTSCLR(x)            (((uint32_t)(((uint32_t)(x)) << USART_INTENCLR_DELTACTSCLR_SHIFT)) & USART_INTENCLR_DELTACTSCLR_MASK)\r\n\r\n#define USART_INTENCLR_TXDISCLR_MASK             (0x40U)\r\n#define USART_INTENCLR_TXDISCLR_SHIFT            (6U)\r\n/*! TXDISCLR - Transmit Disable Clear */\r\n#define USART_INTENCLR_TXDISCLR(x)               (((uint32_t)(((uint32_t)(x)) << USART_INTENCLR_TXDISCLR_SHIFT)) & USART_INTENCLR_TXDISCLR_MASK)\r\n\r\n#define USART_INTENCLR_DELTARXBRKCLR_MASK        (0x800U)\r\n#define USART_INTENCLR_DELTARXBRKCLR_SHIFT       (11U)\r\n/*! DELTARXBRKCLR - Delta Receive Break Clear */\r\n#define USART_INTENCLR_DELTARXBRKCLR(x)          (((uint32_t)(((uint32_t)(x)) << USART_INTENCLR_DELTARXBRKCLR_SHIFT)) & USART_INTENCLR_DELTARXBRKCLR_MASK)\r\n\r\n#define USART_INTENCLR_STARTCLR_MASK             (0x1000U)\r\n#define USART_INTENCLR_STARTCLR_SHIFT            (12U)\r\n/*! STARTCLR - Start Clear */\r\n#define USART_INTENCLR_STARTCLR(x)               (((uint32_t)(((uint32_t)(x)) << USART_INTENCLR_STARTCLR_SHIFT)) & USART_INTENCLR_STARTCLR_MASK)\r\n\r\n#define USART_INTENCLR_FRAMERRCLR_MASK           (0x2000U)\r\n#define USART_INTENCLR_FRAMERRCLR_SHIFT          (13U)\r\n/*! FRAMERRCLR - Frame Error Clear */\r\n#define USART_INTENCLR_FRAMERRCLR(x)             (((uint32_t)(((uint32_t)(x)) << USART_INTENCLR_FRAMERRCLR_SHIFT)) & USART_INTENCLR_FRAMERRCLR_MASK)\r\n\r\n#define USART_INTENCLR_PARITYERRCLR_MASK         (0x4000U)\r\n#define USART_INTENCLR_PARITYERRCLR_SHIFT        (14U)\r\n/*! PARITYERRCLR - Parity Error Clear */\r\n#define USART_INTENCLR_PARITYERRCLR(x)           (((uint32_t)(((uint32_t)(x)) << USART_INTENCLR_PARITYERRCLR_SHIFT)) & USART_INTENCLR_PARITYERRCLR_MASK)\r\n\r\n#define USART_INTENCLR_RXNOISECLR_MASK           (0x8000U)\r\n#define USART_INTENCLR_RXNOISECLR_SHIFT          (15U)\r\n/*! RXNOISECLR - Receive Noise Clear */\r\n#define USART_INTENCLR_RXNOISECLR(x)             (((uint32_t)(((uint32_t)(x)) << USART_INTENCLR_RXNOISECLR_SHIFT)) & USART_INTENCLR_RXNOISECLR_MASK)\r\n\r\n#define USART_INTENCLR_ABERRCLR_MASK             (0x10000U)\r\n#define USART_INTENCLR_ABERRCLR_SHIFT            (16U)\r\n/*! ABERRCLR - Auto Baud Error Clear */\r\n#define USART_INTENCLR_ABERRCLR(x)               (((uint32_t)(((uint32_t)(x)) << USART_INTENCLR_ABERRCLR_SHIFT)) & USART_INTENCLR_ABERRCLR_MASK)\r\n/*! @} */\r\n\r\n/*! @name BRG - Baud Rate Generator */\r\n/*! @{ */\r\n\r\n#define USART_BRG_BRGVAL_MASK                    (0xFFFFU)\r\n#define USART_BRG_BRGVAL_SHIFT                   (0U)\r\n/*! BRGVAL - Baud Rate Generator Value\r\n *  0b0000000000000000..FCLK is used directly by the USART function.\r\n *  0b0000000000000001..FCLK is divided by 2 before use by the USART function.\r\n *  0b0000000000000010..FCLK is divided by 3 before use by the USART function.\r\n *  0b1111111111111111..FCLK is divided by 65,536 before use by the USART function.\r\n */\r\n#define USART_BRG_BRGVAL(x)                      (((uint32_t)(((uint32_t)(x)) << USART_BRG_BRGVAL_SHIFT)) & USART_BRG_BRGVAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name INTSTAT - Interrupt Status */\r\n/*! @{ */\r\n\r\n#define USART_INTSTAT_TXIDLE_MASK                (0x8U)\r\n#define USART_INTSTAT_TXIDLE_SHIFT               (3U)\r\n/*! TXIDLE - Transmitter Idle Flag */\r\n#define USART_INTSTAT_TXIDLE(x)                  (((uint32_t)(((uint32_t)(x)) << USART_INTSTAT_TXIDLE_SHIFT)) & USART_INTSTAT_TXIDLE_MASK)\r\n\r\n#define USART_INTSTAT_DELTACTS_MASK              (0x20U)\r\n#define USART_INTSTAT_DELTACTS_SHIFT             (5U)\r\n/*! DELTACTS - Delta CTS Change Flag */\r\n#define USART_INTSTAT_DELTACTS(x)                (((uint32_t)(((uint32_t)(x)) << USART_INTSTAT_DELTACTS_SHIFT)) & USART_INTSTAT_DELTACTS_MASK)\r\n\r\n#define USART_INTSTAT_TXDISINT_MASK              (0x40U)\r\n#define USART_INTSTAT_TXDISINT_SHIFT             (6U)\r\n/*! TXDISINT - Transmitter Disabled Interrupt Flag */\r\n#define USART_INTSTAT_TXDISINT(x)                (((uint32_t)(((uint32_t)(x)) << USART_INTSTAT_TXDISINT_SHIFT)) & USART_INTSTAT_TXDISINT_MASK)\r\n\r\n#define USART_INTSTAT_DELTARXBRK_MASK            (0x800U)\r\n#define USART_INTSTAT_DELTARXBRK_SHIFT           (11U)\r\n/*! DELTARXBRK - Delta Receiver Break Change Flag */\r\n#define USART_INTSTAT_DELTARXBRK(x)              (((uint32_t)(((uint32_t)(x)) << USART_INTSTAT_DELTARXBRK_SHIFT)) & USART_INTSTAT_DELTARXBRK_MASK)\r\n\r\n#define USART_INTSTAT_START_MASK                 (0x1000U)\r\n#define USART_INTSTAT_START_SHIFT                (12U)\r\n/*! START - Start Detected on Receiver Flag */\r\n#define USART_INTSTAT_START(x)                   (((uint32_t)(((uint32_t)(x)) << USART_INTSTAT_START_SHIFT)) & USART_INTSTAT_START_MASK)\r\n\r\n#define USART_INTSTAT_FRAMERRINT_MASK            (0x2000U)\r\n#define USART_INTSTAT_FRAMERRINT_SHIFT           (13U)\r\n/*! FRAMERRINT - Framing Error Interrupt Flag */\r\n#define USART_INTSTAT_FRAMERRINT(x)              (((uint32_t)(((uint32_t)(x)) << USART_INTSTAT_FRAMERRINT_SHIFT)) & USART_INTSTAT_FRAMERRINT_MASK)\r\n\r\n#define USART_INTSTAT_PARITYERRINT_MASK          (0x4000U)\r\n#define USART_INTSTAT_PARITYERRINT_SHIFT         (14U)\r\n/*! PARITYERRINT - Parity Error Interrupt Flag */\r\n#define USART_INTSTAT_PARITYERRINT(x)            (((uint32_t)(((uint32_t)(x)) << USART_INTSTAT_PARITYERRINT_SHIFT)) & USART_INTSTAT_PARITYERRINT_MASK)\r\n\r\n#define USART_INTSTAT_RXNOISEINT_MASK            (0x8000U)\r\n#define USART_INTSTAT_RXNOISEINT_SHIFT           (15U)\r\n/*! RXNOISEINT - Received Noise Interrupt Flag */\r\n#define USART_INTSTAT_RXNOISEINT(x)              (((uint32_t)(((uint32_t)(x)) << USART_INTSTAT_RXNOISEINT_SHIFT)) & USART_INTSTAT_RXNOISEINT_MASK)\r\n\r\n#define USART_INTSTAT_ABERRINT_MASK              (0x10000U)\r\n#define USART_INTSTAT_ABERRINT_SHIFT             (16U)\r\n/*! ABERRINT - Auto Baud Error Interrupt Flag */\r\n#define USART_INTSTAT_ABERRINT(x)                (((uint32_t)(((uint32_t)(x)) << USART_INTSTAT_ABERRINT_SHIFT)) & USART_INTSTAT_ABERRINT_MASK)\r\n/*! @} */\r\n\r\n/*! @name OSR - Oversample Selection Register for Asynchronous Communication */\r\n/*! @{ */\r\n\r\n#define USART_OSR_OSRVAL_MASK                    (0xFU)\r\n#define USART_OSR_OSRVAL_SHIFT                   (0U)\r\n/*! OSRVAL - Oversample Selection Value\r\n *  0b0000..Not supported\r\n *  0b0001..Not supported\r\n *  0b0010..Not supported\r\n *  0b0011..Not supported\r\n *  0b0100..5 function clocks are used to transmit and receive each data bit.\r\n *  0b0101..6 function clocks are used to transmit and receive each data bit.\r\n *  0b1111..16 function clocks are used to transmit and receive each data bit.\r\n */\r\n#define USART_OSR_OSRVAL(x)                      (((uint32_t)(((uint32_t)(x)) << USART_OSR_OSRVAL_SHIFT)) & USART_OSR_OSRVAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name ADDR - Address Register for Automatic Address Matching */\r\n/*! @{ */\r\n\r\n#define USART_ADDR_ADDRESS_MASK                  (0xFFU)\r\n#define USART_ADDR_ADDRESS_SHIFT                 (0U)\r\n/*! ADDRESS - Address */\r\n#define USART_ADDR_ADDRESS(x)                    (((uint32_t)(((uint32_t)(x)) << USART_ADDR_ADDRESS_SHIFT)) & USART_ADDR_ADDRESS_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOCFG - FIFO Configuration */\r\n/*! @{ */\r\n\r\n#define USART_FIFOCFG_ENABLETX_MASK              (0x1U)\r\n#define USART_FIFOCFG_ENABLETX_SHIFT             (0U)\r\n/*! ENABLETX - Enable the Transmit FIFO.\r\n *  0b0..The transmit FIFO is not enabled.\r\n *  0b1..The transmit FIFO is enabled.\r\n */\r\n#define USART_FIFOCFG_ENABLETX(x)                (((uint32_t)(((uint32_t)(x)) << USART_FIFOCFG_ENABLETX_SHIFT)) & USART_FIFOCFG_ENABLETX_MASK)\r\n\r\n#define USART_FIFOCFG_ENABLERX_MASK              (0x2U)\r\n#define USART_FIFOCFG_ENABLERX_SHIFT             (1U)\r\n/*! ENABLERX - Enable the Receive FIFO\r\n *  0b0..The receive FIFO is not enabled.\r\n *  0b1..The receive FIFO is enabled.\r\n */\r\n#define USART_FIFOCFG_ENABLERX(x)                (((uint32_t)(((uint32_t)(x)) << USART_FIFOCFG_ENABLERX_SHIFT)) & USART_FIFOCFG_ENABLERX_MASK)\r\n\r\n#define USART_FIFOCFG_SIZE_MASK                  (0x30U)\r\n#define USART_FIFOCFG_SIZE_SHIFT                 (4U)\r\n/*! SIZE - FIFO Size Configuration\r\n *  0b00..FIFO is configured as 16 entries of 8 bits.\r\n *  0b01..Not used\r\n *  0b10..Not used\r\n *  0b11..Not used\r\n */\r\n#define USART_FIFOCFG_SIZE(x)                    (((uint32_t)(((uint32_t)(x)) << USART_FIFOCFG_SIZE_SHIFT)) & USART_FIFOCFG_SIZE_MASK)\r\n\r\n#define USART_FIFOCFG_DMATX_MASK                 (0x1000U)\r\n#define USART_FIFOCFG_DMATX_SHIFT                (12U)\r\n/*! DMATX - DMA Configuration for Transmit\r\n *  0b0..DMA is not used for the transmit function.\r\n *  0b1..Triggers DMA for the transmit function if the FIFO is not full. Generally, data interrupts would be disabled if DMA is enabled.\r\n */\r\n#define USART_FIFOCFG_DMATX(x)                   (((uint32_t)(((uint32_t)(x)) << USART_FIFOCFG_DMATX_SHIFT)) & USART_FIFOCFG_DMATX_MASK)\r\n\r\n#define USART_FIFOCFG_DMARX_MASK                 (0x2000U)\r\n#define USART_FIFOCFG_DMARX_SHIFT                (13U)\r\n/*! DMARX - DMA Configuration for Receive\r\n *  0b0..DMA is not used for the receive function.\r\n *  0b1..Triggers DMA for the receive function if the FIFO is not empty. Generally, data interrupts would be disabled if DMA is enabled.\r\n */\r\n#define USART_FIFOCFG_DMARX(x)                   (((uint32_t)(((uint32_t)(x)) << USART_FIFOCFG_DMARX_SHIFT)) & USART_FIFOCFG_DMARX_MASK)\r\n\r\n#define USART_FIFOCFG_WAKETX_MASK                (0x4000U)\r\n#define USART_FIFOCFG_WAKETX_SHIFT               (14U)\r\n/*! WAKETX - Wake-up for Transmit FIFO Level\r\n *  0b0..Only enabled interrupts will wake up the device from low power modes.\r\n *  0b1..A device wake-up for DMA will occur if the transmit FIFO level reaches the value specified by\r\n *       FIFOTRIG[TXLVL], even when the TXLVL interrupt is not enabled.\r\n */\r\n#define USART_FIFOCFG_WAKETX(x)                  (((uint32_t)(((uint32_t)(x)) << USART_FIFOCFG_WAKETX_SHIFT)) & USART_FIFOCFG_WAKETX_MASK)\r\n\r\n#define USART_FIFOCFG_WAKERX_MASK                (0x8000U)\r\n#define USART_FIFOCFG_WAKERX_SHIFT               (15U)\r\n/*! WAKERX - Wake-up for Receive FIFO Level\r\n *  0b0..Only enabled interrupts will wake up the device from low power modes.\r\n *  0b1..A device wake-up for DMA will occur if the receive FIFO level reaches the value specified by\r\n *       FIFOTRIG[RXLVL], even when the RXLVL interrupt is not enabled.\r\n */\r\n#define USART_FIFOCFG_WAKERX(x)                  (((uint32_t)(((uint32_t)(x)) << USART_FIFOCFG_WAKERX_SHIFT)) & USART_FIFOCFG_WAKERX_MASK)\r\n\r\n#define USART_FIFOCFG_EMPTYTX_MASK               (0x10000U)\r\n#define USART_FIFOCFG_EMPTYTX_SHIFT              (16U)\r\n/*! EMPTYTX - Empty Command for the Transmit FIFO\r\n *  0b0..No effect\r\n *  0b1..The TX FIFO is emptied.\r\n */\r\n#define USART_FIFOCFG_EMPTYTX(x)                 (((uint32_t)(((uint32_t)(x)) << USART_FIFOCFG_EMPTYTX_SHIFT)) & USART_FIFOCFG_EMPTYTX_MASK)\r\n\r\n#define USART_FIFOCFG_EMPTYRX_MASK               (0x20000U)\r\n#define USART_FIFOCFG_EMPTYRX_SHIFT              (17U)\r\n/*! EMPTYRX - Empty Command for the Receive FIFO\r\n *  0b0..No effect\r\n *  0b1..The RX FIFO is emptied.\r\n */\r\n#define USART_FIFOCFG_EMPTYRX(x)                 (((uint32_t)(((uint32_t)(x)) << USART_FIFOCFG_EMPTYRX_SHIFT)) & USART_FIFOCFG_EMPTYRX_MASK)\r\n\r\n#define USART_FIFOCFG_POPDBG_MASK                (0x40000U)\r\n#define USART_FIFOCFG_POPDBG_SHIFT               (18U)\r\n/*! POPDBG - Pop FIFO for Debug Reads\r\n *  0b0..Debug reads of the FIFO do not pop the FIFO.\r\n *  0b1..A debug read will cause the FIFO to pop.\r\n */\r\n#define USART_FIFOCFG_POPDBG(x)                  (((uint32_t)(((uint32_t)(x)) << USART_FIFOCFG_POPDBG_SHIFT)) & USART_FIFOCFG_POPDBG_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOSTAT - FIFO Status */\r\n/*! @{ */\r\n\r\n#define USART_FIFOSTAT_TXERR_MASK                (0x1U)\r\n#define USART_FIFOSTAT_TXERR_SHIFT               (0U)\r\n/*! TXERR - TX FIFO Error\r\n *  0b0..A transmit FIFO error has not occurred.\r\n *  0b1..A transmit FIFO error has occurred. This error could be an overflow caused by pushing data into a full\r\n *       FIFO, or by an underflow if the FIFO is empty when data is needed.\r\n */\r\n#define USART_FIFOSTAT_TXERR(x)                  (((uint32_t)(((uint32_t)(x)) << USART_FIFOSTAT_TXERR_SHIFT)) & USART_FIFOSTAT_TXERR_MASK)\r\n\r\n#define USART_FIFOSTAT_RXERR_MASK                (0x2U)\r\n#define USART_FIFOSTAT_RXERR_SHIFT               (1U)\r\n/*! RXERR - RX FIFO Error\r\n *  0b0..A receive FIFO overflow has not occurred\r\n *  0b1..A receive FIFO overflow has occurred, caused by software or DMA not emptying the FIFO fast enough\r\n */\r\n#define USART_FIFOSTAT_RXERR(x)                  (((uint32_t)(((uint32_t)(x)) << USART_FIFOSTAT_RXERR_SHIFT)) & USART_FIFOSTAT_RXERR_MASK)\r\n\r\n#define USART_FIFOSTAT_PERINT_MASK               (0x8U)\r\n#define USART_FIFOSTAT_PERINT_SHIFT              (3U)\r\n/*! PERINT - Peripheral Interrupt\r\n *  0b0..No Peripheral Interrupt\r\n *  0b1..Peripheral Interrupt\r\n */\r\n#define USART_FIFOSTAT_PERINT(x)                 (((uint32_t)(((uint32_t)(x)) << USART_FIFOSTAT_PERINT_SHIFT)) & USART_FIFOSTAT_PERINT_MASK)\r\n\r\n#define USART_FIFOSTAT_TXEMPTY_MASK              (0x10U)\r\n#define USART_FIFOSTAT_TXEMPTY_SHIFT             (4U)\r\n/*! TXEMPTY - Transmit FIFO Empty\r\n *  0b0..The transmit FIFO is not empty.\r\n *  0b1..The transmit FIFO is empty, although the peripheral may still be processing the last piece of data.\r\n */\r\n#define USART_FIFOSTAT_TXEMPTY(x)                (((uint32_t)(((uint32_t)(x)) << USART_FIFOSTAT_TXEMPTY_SHIFT)) & USART_FIFOSTAT_TXEMPTY_MASK)\r\n\r\n#define USART_FIFOSTAT_TXNOTFULL_MASK            (0x20U)\r\n#define USART_FIFOSTAT_TXNOTFULL_SHIFT           (5U)\r\n/*! TXNOTFULL - Transmit FIFO is Not Full\r\n *  0b0..The transmit FIFO is full and another write would cause it to overflow.\r\n *  0b1..The transmit FIFO is not full, so more data can be written.\r\n */\r\n#define USART_FIFOSTAT_TXNOTFULL(x)              (((uint32_t)(((uint32_t)(x)) << USART_FIFOSTAT_TXNOTFULL_SHIFT)) & USART_FIFOSTAT_TXNOTFULL_MASK)\r\n\r\n#define USART_FIFOSTAT_RXNOTEMPTY_MASK           (0x40U)\r\n#define USART_FIFOSTAT_RXNOTEMPTY_SHIFT          (6U)\r\n/*! RXNOTEMPTY - Receive FIFO is Not Empty\r\n *  0b0..The receive FIFO is empty.\r\n *  0b1..The receive FIFO is not empty, so data can be read.\r\n */\r\n#define USART_FIFOSTAT_RXNOTEMPTY(x)             (((uint32_t)(((uint32_t)(x)) << USART_FIFOSTAT_RXNOTEMPTY_SHIFT)) & USART_FIFOSTAT_RXNOTEMPTY_MASK)\r\n\r\n#define USART_FIFOSTAT_RXFULL_MASK               (0x80U)\r\n#define USART_FIFOSTAT_RXFULL_SHIFT              (7U)\r\n/*! RXFULL - Receive FIFO is Full\r\n *  0b0..The receive FIFO is not full.\r\n *  0b1..The receive FIFO is full.\r\n */\r\n#define USART_FIFOSTAT_RXFULL(x)                 (((uint32_t)(((uint32_t)(x)) << USART_FIFOSTAT_RXFULL_SHIFT)) & USART_FIFOSTAT_RXFULL_MASK)\r\n\r\n#define USART_FIFOSTAT_TXLVL_MASK                (0x1F00U)\r\n#define USART_FIFOSTAT_TXLVL_SHIFT               (8U)\r\n/*! TXLVL - Transmit FIFO Current Level */\r\n#define USART_FIFOSTAT_TXLVL(x)                  (((uint32_t)(((uint32_t)(x)) << USART_FIFOSTAT_TXLVL_SHIFT)) & USART_FIFOSTAT_TXLVL_MASK)\r\n\r\n#define USART_FIFOSTAT_RXLVL_MASK                (0x1F0000U)\r\n#define USART_FIFOSTAT_RXLVL_SHIFT               (16U)\r\n/*! RXLVL - Receive FIFO Current Level */\r\n#define USART_FIFOSTAT_RXLVL(x)                  (((uint32_t)(((uint32_t)(x)) << USART_FIFOSTAT_RXLVL_SHIFT)) & USART_FIFOSTAT_RXLVL_MASK)\r\n\r\n#define USART_FIFOSTAT_RXTIMEOUT_MASK            (0x1000000U)\r\n#define USART_FIFOSTAT_RXTIMEOUT_SHIFT           (24U)\r\n/*! RXTIMEOUT - Receive FIFO Timeout\r\n *  0b0..RX FIFO on\r\n *  0b1..RX FIFO has timed out, based on the timeout configuration in the FIFORXTIMEOUTCFG register.\r\n */\r\n#define USART_FIFOSTAT_RXTIMEOUT(x)              (((uint32_t)(((uint32_t)(x)) << USART_FIFOSTAT_RXTIMEOUT_SHIFT)) & USART_FIFOSTAT_RXTIMEOUT_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOTRIG - FIFO Trigger Settings for Interrupt and DMA Request */\r\n/*! @{ */\r\n\r\n#define USART_FIFOTRIG_TXLVLENA_MASK             (0x1U)\r\n#define USART_FIFOTRIG_TXLVLENA_SHIFT            (0U)\r\n/*! TXLVLENA - Transmit FIFO Level Trigger Enable.\r\n *  0b0..Transmit FIFO level does not generate a FIFO level trigger.\r\n *  0b1..A trigger will be generated if the transmit FIFO level reaches the value specified by the TXLVL field.\r\n */\r\n#define USART_FIFOTRIG_TXLVLENA(x)               (((uint32_t)(((uint32_t)(x)) << USART_FIFOTRIG_TXLVLENA_SHIFT)) & USART_FIFOTRIG_TXLVLENA_MASK)\r\n\r\n#define USART_FIFOTRIG_RXLVLENA_MASK             (0x2U)\r\n#define USART_FIFOTRIG_RXLVLENA_SHIFT            (1U)\r\n/*! RXLVLENA - Receive FIFO Level Trigger Enable\r\n *  0b0..Receive FIFO level does not generate a FIFO level trigger.\r\n *  0b1..An trigger will be generated if the receive FIFO level reaches the value specified by the RXLVL field.\r\n */\r\n#define USART_FIFOTRIG_RXLVLENA(x)               (((uint32_t)(((uint32_t)(x)) << USART_FIFOTRIG_RXLVLENA_SHIFT)) & USART_FIFOTRIG_RXLVLENA_MASK)\r\n\r\n#define USART_FIFOTRIG_TXLVL_MASK                (0xF00U)\r\n#define USART_FIFOTRIG_TXLVL_SHIFT               (8U)\r\n/*! TXLVL - Transmit FIFO Level Trigger Point\r\n *  0b0000..Trigger when the TX FIFO becomes empty\r\n *  0b0001..Trigger when the TX FIFO level decreases to 1 entry\r\n *  0b1111..Trigger when the TX FIFO level decreases to 15 entries (is no longer full)\r\n */\r\n#define USART_FIFOTRIG_TXLVL(x)                  (((uint32_t)(((uint32_t)(x)) << USART_FIFOTRIG_TXLVL_SHIFT)) & USART_FIFOTRIG_TXLVL_MASK)\r\n\r\n#define USART_FIFOTRIG_RXLVL_MASK                (0xF0000U)\r\n#define USART_FIFOTRIG_RXLVL_SHIFT               (16U)\r\n/*! RXLVL - Receive FIFO Level Trigger Point\r\n *  0b0000..Trigger when the RX FIFO has received 1 entry (is no longer empty)\r\n *  0b0001..Trigger when the RX FIFO has received 2 entries\r\n *  0b1111..Trigger when the RX FIFO has received 16 entries (has become full)\r\n */\r\n#define USART_FIFOTRIG_RXLVL(x)                  (((uint32_t)(((uint32_t)(x)) << USART_FIFOTRIG_RXLVL_SHIFT)) & USART_FIFOTRIG_RXLVL_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOINTENSET - FIFO Interrupt Enable */\r\n/*! @{ */\r\n\r\n#define USART_FIFOINTENSET_TXERR_MASK            (0x1U)\r\n#define USART_FIFOINTENSET_TXERR_SHIFT           (0U)\r\n/*! TXERR - Transmit Error Interrupt Enable\r\n *  0b0..No interrupt will be generated for a transmit error.\r\n *  0b1..An interrupt will be generated when a transmit error occurs.\r\n */\r\n#define USART_FIFOINTENSET_TXERR(x)              (((uint32_t)(((uint32_t)(x)) << USART_FIFOINTENSET_TXERR_SHIFT)) & USART_FIFOINTENSET_TXERR_MASK)\r\n\r\n#define USART_FIFOINTENSET_RXERR_MASK            (0x2U)\r\n#define USART_FIFOINTENSET_RXERR_SHIFT           (1U)\r\n/*! RXERR - Receive Error Interrupt Enable\r\n *  0b0..No interrupt will be generated for a receive error.\r\n *  0b1..An interrupt will be generated when a receive error occurs.\r\n */\r\n#define USART_FIFOINTENSET_RXERR(x)              (((uint32_t)(((uint32_t)(x)) << USART_FIFOINTENSET_RXERR_SHIFT)) & USART_FIFOINTENSET_RXERR_MASK)\r\n\r\n#define USART_FIFOINTENSET_TXLVL_MASK            (0x4U)\r\n#define USART_FIFOINTENSET_TXLVL_SHIFT           (2U)\r\n/*! TXLVL - Transmit FIFO Level Interrupt Enable\r\n *  0b0..No interrupt will be generated based on the TX FIFO level.\r\n *  0b1..If FIFOTRIG[TXLVLENA] = 1, then an interrupt will be generated when the TX FIFO level decreases to the level specified by FIFOTRIG[TXLVL]\r\n */\r\n#define USART_FIFOINTENSET_TXLVL(x)              (((uint32_t)(((uint32_t)(x)) << USART_FIFOINTENSET_TXLVL_SHIFT)) & USART_FIFOINTENSET_TXLVL_MASK)\r\n\r\n#define USART_FIFOINTENSET_RXLVL_MASK            (0x8U)\r\n#define USART_FIFOINTENSET_RXLVL_SHIFT           (3U)\r\n/*! RXLVL - Receive FIFO Level Interrupt Enable\r\n *  0b0..No interrupt will be generated based on the RX FIFO level.\r\n *  0b1..If FIFOTRIG[RXLVLENA] = 1, an interrupt will be generated when the when the RX FIFO level increases to\r\n *       the level specified by FIFOTRIG[RXLVL].\r\n */\r\n#define USART_FIFOINTENSET_RXLVL(x)              (((uint32_t)(((uint32_t)(x)) << USART_FIFOINTENSET_RXLVL_SHIFT)) & USART_FIFOINTENSET_RXLVL_MASK)\r\n\r\n#define USART_FIFOINTENSET_RXTIMEOUT_MASK        (0x1000000U)\r\n#define USART_FIFOINTENSET_RXTIMEOUT_SHIFT       (24U)\r\n/*! RXTIMEOUT - Receive Timeout\r\n *  0b0..No RX interrupt will be generated.\r\n *  0b1..Asserts RX interrupt if RX FIFO Timeout event occurs.\r\n */\r\n#define USART_FIFOINTENSET_RXTIMEOUT(x)          (((uint32_t)(((uint32_t)(x)) << USART_FIFOINTENSET_RXTIMEOUT_SHIFT)) & USART_FIFOINTENSET_RXTIMEOUT_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOINTENCLR - FIFO Interrupt Enable Clear */\r\n/*! @{ */\r\n\r\n#define USART_FIFOINTENCLR_TXERR_MASK            (0x1U)\r\n#define USART_FIFOINTENCLR_TXERR_SHIFT           (0U)\r\n/*! TXERR - Transmit Error Interrupt Enable\r\n *  0b0..No effect\r\n *  0b1..Clear the interrupt\r\n */\r\n#define USART_FIFOINTENCLR_TXERR(x)              (((uint32_t)(((uint32_t)(x)) << USART_FIFOINTENCLR_TXERR_SHIFT)) & USART_FIFOINTENCLR_TXERR_MASK)\r\n\r\n#define USART_FIFOINTENCLR_RXERR_MASK            (0x2U)\r\n#define USART_FIFOINTENCLR_RXERR_SHIFT           (1U)\r\n/*! RXERR - Receive Error Interrupt Enable\r\n *  0b0..No effect\r\n *  0b1..Clear the interrupt\r\n */\r\n#define USART_FIFOINTENCLR_RXERR(x)              (((uint32_t)(((uint32_t)(x)) << USART_FIFOINTENCLR_RXERR_SHIFT)) & USART_FIFOINTENCLR_RXERR_MASK)\r\n\r\n#define USART_FIFOINTENCLR_TXLVL_MASK            (0x4U)\r\n#define USART_FIFOINTENCLR_TXLVL_SHIFT           (2U)\r\n/*! TXLVL - Transmit FIFO Level Interrupt Enable\r\n *  0b0..No effect\r\n *  0b1..Clear the interrupt\r\n */\r\n#define USART_FIFOINTENCLR_TXLVL(x)              (((uint32_t)(((uint32_t)(x)) << USART_FIFOINTENCLR_TXLVL_SHIFT)) & USART_FIFOINTENCLR_TXLVL_MASK)\r\n\r\n#define USART_FIFOINTENCLR_RXLVL_MASK            (0x8U)\r\n#define USART_FIFOINTENCLR_RXLVL_SHIFT           (3U)\r\n/*! RXLVL - Receive FIFO Level Interrupt Enable\r\n *  0b0..No effect\r\n *  0b1..Clear the interrupt\r\n */\r\n#define USART_FIFOINTENCLR_RXLVL(x)              (((uint32_t)(((uint32_t)(x)) << USART_FIFOINTENCLR_RXLVL_SHIFT)) & USART_FIFOINTENCLR_RXLVL_MASK)\r\n\r\n#define USART_FIFOINTENCLR_RXTIMEOUT_MASK        (0x1000000U)\r\n#define USART_FIFOINTENCLR_RXTIMEOUT_SHIFT       (24U)\r\n/*! RXTIMEOUT - Receive Timeout\r\n *  0b0..No effect\r\n *  0b1..Clear the interrupt\r\n */\r\n#define USART_FIFOINTENCLR_RXTIMEOUT(x)          (((uint32_t)(((uint32_t)(x)) << USART_FIFOINTENCLR_RXTIMEOUT_SHIFT)) & USART_FIFOINTENCLR_RXTIMEOUT_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOINTSTAT - FIFO Interrupt Status */\r\n/*! @{ */\r\n\r\n#define USART_FIFOINTSTAT_TXERR_MASK             (0x1U)\r\n#define USART_FIFOINTSTAT_TXERR_SHIFT            (0U)\r\n/*! TXERR - TX FIFO Error Interrupt Status\r\n *  0b0..Not pending\r\n *  0b1..Pending\r\n */\r\n#define USART_FIFOINTSTAT_TXERR(x)               (((uint32_t)(((uint32_t)(x)) << USART_FIFOINTSTAT_TXERR_SHIFT)) & USART_FIFOINTSTAT_TXERR_MASK)\r\n\r\n#define USART_FIFOINTSTAT_RXERR_MASK             (0x2U)\r\n#define USART_FIFOINTSTAT_RXERR_SHIFT            (1U)\r\n/*! RXERR - RX FIFO Error Interrupt Status\r\n *  0b0..Not pending\r\n *  0b1..Pending\r\n */\r\n#define USART_FIFOINTSTAT_RXERR(x)               (((uint32_t)(((uint32_t)(x)) << USART_FIFOINTSTAT_RXERR_SHIFT)) & USART_FIFOINTSTAT_RXERR_MASK)\r\n\r\n#define USART_FIFOINTSTAT_TXLVL_MASK             (0x4U)\r\n#define USART_FIFOINTSTAT_TXLVL_SHIFT            (2U)\r\n/*! TXLVL - Transmit FIFO Level Interrupt Status\r\n *  0b0..Not pending\r\n *  0b1..Pending\r\n */\r\n#define USART_FIFOINTSTAT_TXLVL(x)               (((uint32_t)(((uint32_t)(x)) << USART_FIFOINTSTAT_TXLVL_SHIFT)) & USART_FIFOINTSTAT_TXLVL_MASK)\r\n\r\n#define USART_FIFOINTSTAT_RXLVL_MASK             (0x8U)\r\n#define USART_FIFOINTSTAT_RXLVL_SHIFT            (3U)\r\n/*! RXLVL - Receive FIFO Level Interrupt Status\r\n *  0b0..Not pending\r\n *  0b1..Pending\r\n */\r\n#define USART_FIFOINTSTAT_RXLVL(x)               (((uint32_t)(((uint32_t)(x)) << USART_FIFOINTSTAT_RXLVL_SHIFT)) & USART_FIFOINTSTAT_RXLVL_MASK)\r\n\r\n#define USART_FIFOINTSTAT_PERINT_MASK            (0x10U)\r\n#define USART_FIFOINTSTAT_PERINT_SHIFT           (4U)\r\n/*! PERINT - Peripheral Interrupt Status\r\n *  0b0..Not pending\r\n *  0b1..Pending\r\n */\r\n#define USART_FIFOINTSTAT_PERINT(x)              (((uint32_t)(((uint32_t)(x)) << USART_FIFOINTSTAT_PERINT_SHIFT)) & USART_FIFOINTSTAT_PERINT_MASK)\r\n\r\n#define USART_FIFOINTSTAT_RXTIMEOUT_MASK         (0x1000000U)\r\n#define USART_FIFOINTSTAT_RXTIMEOUT_SHIFT        (24U)\r\n/*! RXTIMEOUT - Receive Timeout Status\r\n *  0b0..Not pending\r\n *  0b1..Pending\r\n */\r\n#define USART_FIFOINTSTAT_RXTIMEOUT(x)           (((uint32_t)(((uint32_t)(x)) << USART_FIFOINTSTAT_RXTIMEOUT_SHIFT)) & USART_FIFOINTSTAT_RXTIMEOUT_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOWR - FIFO Write Data */\r\n/*! @{ */\r\n\r\n#define USART_FIFOWR_TXDATA_MASK                 (0x1FFU)\r\n#define USART_FIFOWR_TXDATA_SHIFT                (0U)\r\n/*! TXDATA - Transmit data to the FIFO */\r\n#define USART_FIFOWR_TXDATA(x)                   (((uint32_t)(((uint32_t)(x)) << USART_FIFOWR_TXDATA_SHIFT)) & USART_FIFOWR_TXDATA_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFORD - FIFO Read Data */\r\n/*! @{ */\r\n\r\n#define USART_FIFORD_RXDATA_MASK                 (0x1FFU)\r\n#define USART_FIFORD_RXDATA_SHIFT                (0U)\r\n/*! RXDATA - Received Data from the FIFO */\r\n#define USART_FIFORD_RXDATA(x)                   (((uint32_t)(((uint32_t)(x)) << USART_FIFORD_RXDATA_SHIFT)) & USART_FIFORD_RXDATA_MASK)\r\n\r\n#define USART_FIFORD_FRAMERR_MASK                (0x2000U)\r\n#define USART_FIFORD_FRAMERR_SHIFT               (13U)\r\n/*! FRAMERR - Framing Error Status Flag */\r\n#define USART_FIFORD_FRAMERR(x)                  (((uint32_t)(((uint32_t)(x)) << USART_FIFORD_FRAMERR_SHIFT)) & USART_FIFORD_FRAMERR_MASK)\r\n\r\n#define USART_FIFORD_PARITYERR_MASK              (0x4000U)\r\n#define USART_FIFORD_PARITYERR_SHIFT             (14U)\r\n/*! PARITYERR - Parity Error Status Flag */\r\n#define USART_FIFORD_PARITYERR(x)                (((uint32_t)(((uint32_t)(x)) << USART_FIFORD_PARITYERR_SHIFT)) & USART_FIFORD_PARITYERR_MASK)\r\n\r\n#define USART_FIFORD_RXNOISE_MASK                (0x8000U)\r\n#define USART_FIFORD_RXNOISE_SHIFT               (15U)\r\n/*! RXNOISE - Received Noise Flag */\r\n#define USART_FIFORD_RXNOISE(x)                  (((uint32_t)(((uint32_t)(x)) << USART_FIFORD_RXNOISE_SHIFT)) & USART_FIFORD_RXNOISE_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFORDNOPOP - FIFO Data Read with No FIFO Pop */\r\n/*! @{ */\r\n\r\n#define USART_FIFORDNOPOP_RXDATA_MASK            (0x1FFU)\r\n#define USART_FIFORDNOPOP_RXDATA_SHIFT           (0U)\r\n/*! RXDATA - Received Data from the FIFO */\r\n#define USART_FIFORDNOPOP_RXDATA(x)              (((uint32_t)(((uint32_t)(x)) << USART_FIFORDNOPOP_RXDATA_SHIFT)) & USART_FIFORDNOPOP_RXDATA_MASK)\r\n\r\n#define USART_FIFORDNOPOP_FRAMERR_MASK           (0x2000U)\r\n#define USART_FIFORDNOPOP_FRAMERR_SHIFT          (13U)\r\n/*! FRAMERR - Framing Error Status Flag */\r\n#define USART_FIFORDNOPOP_FRAMERR(x)             (((uint32_t)(((uint32_t)(x)) << USART_FIFORDNOPOP_FRAMERR_SHIFT)) & USART_FIFORDNOPOP_FRAMERR_MASK)\r\n\r\n#define USART_FIFORDNOPOP_PARITYERR_MASK         (0x4000U)\r\n#define USART_FIFORDNOPOP_PARITYERR_SHIFT        (14U)\r\n/*! PARITYERR - Parity Error Status Flag */\r\n#define USART_FIFORDNOPOP_PARITYERR(x)           (((uint32_t)(((uint32_t)(x)) << USART_FIFORDNOPOP_PARITYERR_SHIFT)) & USART_FIFORDNOPOP_PARITYERR_MASK)\r\n\r\n#define USART_FIFORDNOPOP_RXNOISE_MASK           (0x8000U)\r\n#define USART_FIFORDNOPOP_RXNOISE_SHIFT          (15U)\r\n/*! RXNOISE - Received Noise Flag */\r\n#define USART_FIFORDNOPOP_RXNOISE(x)             (((uint32_t)(((uint32_t)(x)) << USART_FIFORDNOPOP_RXNOISE_SHIFT)) & USART_FIFORDNOPOP_RXNOISE_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFOSIZE - FIFO Size */\r\n/*! @{ */\r\n\r\n#define USART_FIFOSIZE_FIFOSIZE_MASK             (0x1FU)\r\n#define USART_FIFOSIZE_FIFOSIZE_SHIFT            (0U)\r\n/*! FIFOSIZE - FIFO Size */\r\n#define USART_FIFOSIZE_FIFOSIZE(x)               (((uint32_t)(((uint32_t)(x)) << USART_FIFOSIZE_FIFOSIZE_SHIFT)) & USART_FIFOSIZE_FIFOSIZE_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFORXTIMEOUTCFG - FIFO Receive Timeout Configuration */\r\n/*! @{ */\r\n\r\n#define USART_FIFORXTIMEOUTCFG_RXTIMEOUT_PRESCALER_MASK (0xFFU)\r\n#define USART_FIFORXTIMEOUTCFG_RXTIMEOUT_PRESCALER_SHIFT (0U)\r\n/*! RXTIMEOUT_PRESCALER - Receive Timeout Counter Clock Prescaler */\r\n#define USART_FIFORXTIMEOUTCFG_RXTIMEOUT_PRESCALER(x) (((uint32_t)(((uint32_t)(x)) << USART_FIFORXTIMEOUTCFG_RXTIMEOUT_PRESCALER_SHIFT)) & USART_FIFORXTIMEOUTCFG_RXTIMEOUT_PRESCALER_MASK)\r\n\r\n#define USART_FIFORXTIMEOUTCFG_RXTIMEOUT_VALUE_MASK (0xFFFF00U)\r\n#define USART_FIFORXTIMEOUTCFG_RXTIMEOUT_VALUE_SHIFT (8U)\r\n/*! RXTIMEOUT_VALUE - Receive Timeout Value */\r\n#define USART_FIFORXTIMEOUTCFG_RXTIMEOUT_VALUE(x) (((uint32_t)(((uint32_t)(x)) << USART_FIFORXTIMEOUTCFG_RXTIMEOUT_VALUE_SHIFT)) & USART_FIFORXTIMEOUTCFG_RXTIMEOUT_VALUE_MASK)\r\n\r\n#define USART_FIFORXTIMEOUTCFG_RXTIMEOUT_EN_MASK (0x1000000U)\r\n#define USART_FIFORXTIMEOUTCFG_RXTIMEOUT_EN_SHIFT (24U)\r\n/*! RXTIMEOUT_EN - Receive Timeout Enable\r\n *  0b0..Disable RX FIFO timeout\r\n *  0b1..Enable RX FIFO timeout\r\n */\r\n#define USART_FIFORXTIMEOUTCFG_RXTIMEOUT_EN(x)   (((uint32_t)(((uint32_t)(x)) << USART_FIFORXTIMEOUTCFG_RXTIMEOUT_EN_SHIFT)) & USART_FIFORXTIMEOUTCFG_RXTIMEOUT_EN_MASK)\r\n\r\n#define USART_FIFORXTIMEOUTCFG_RXTIMEOUT_COW_MASK (0x2000000U)\r\n#define USART_FIFORXTIMEOUTCFG_RXTIMEOUT_COW_SHIFT (25U)\r\n/*! RXTIMEOUT_COW - Receive Timeout Continue On Write\r\n *  0b0..RX FIFO timeout counter is reset every time data is transferred from the peripheral into the RX FIFO.\r\n *  0b1..RX FIFO timeout counter is not reset every time data is transferred from the peripheral into the RX FIFO.\r\n */\r\n#define USART_FIFORXTIMEOUTCFG_RXTIMEOUT_COW(x)  (((uint32_t)(((uint32_t)(x)) << USART_FIFORXTIMEOUTCFG_RXTIMEOUT_COW_SHIFT)) & USART_FIFORXTIMEOUTCFG_RXTIMEOUT_COW_MASK)\r\n\r\n#define USART_FIFORXTIMEOUTCFG_RXTIMEOUT_COE_MASK (0x4000000U)\r\n#define USART_FIFORXTIMEOUTCFG_RXTIMEOUT_COE_SHIFT (26U)\r\n/*! RXTIMEOUT_COE - Receive Timeout Continue On Empty\r\n *  0b0..RX FIFO timeout counter is reset when the RX FIFO becomes empty.\r\n *  0b1..RX FIFO timeout counter is not reset when the RX FIFO becomes empty.\r\n */\r\n#define USART_FIFORXTIMEOUTCFG_RXTIMEOUT_COE(x)  (((uint32_t)(((uint32_t)(x)) << USART_FIFORXTIMEOUTCFG_RXTIMEOUT_COE_SHIFT)) & USART_FIFORXTIMEOUTCFG_RXTIMEOUT_COE_MASK)\r\n/*! @} */\r\n\r\n/*! @name FIFORXTIMEOUTCNT - FIFO Receive Timeout Counter */\r\n/*! @{ */\r\n\r\n#define USART_FIFORXTIMEOUTCNT_RXTIMEOUT_CNT_MASK (0xFFFFU)\r\n#define USART_FIFORXTIMEOUTCNT_RXTIMEOUT_CNT_SHIFT (0U)\r\n/*! RXTIMEOUT_CNT - Current RX FIFO timeout counter value */\r\n#define USART_FIFORXTIMEOUTCNT_RXTIMEOUT_CNT(x)  (((uint32_t)(((uint32_t)(x)) << USART_FIFORXTIMEOUTCNT_RXTIMEOUT_CNT_SHIFT)) & USART_FIFORXTIMEOUTCNT_RXTIMEOUT_CNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name ID - Peripheral Identification */\r\n/*! @{ */\r\n\r\n#define USART_ID_APERTURE_MASK                   (0xFFU)\r\n#define USART_ID_APERTURE_SHIFT                  (0U)\r\n/*! APERTURE - Aperture */\r\n#define USART_ID_APERTURE(x)                     (((uint32_t)(((uint32_t)(x)) << USART_ID_APERTURE_SHIFT)) & USART_ID_APERTURE_MASK)\r\n\r\n#define USART_ID_MINOR_REV_MASK                  (0xF00U)\r\n#define USART_ID_MINOR_REV_SHIFT                 (8U)\r\n/*! MINOR_REV - Minor revision of module implementation */\r\n#define USART_ID_MINOR_REV(x)                    (((uint32_t)(((uint32_t)(x)) << USART_ID_MINOR_REV_SHIFT)) & USART_ID_MINOR_REV_MASK)\r\n\r\n#define USART_ID_MAJOR_REV_MASK                  (0xF000U)\r\n#define USART_ID_MAJOR_REV_SHIFT                 (12U)\r\n/*! MAJOR_REV - Major revision of module implementation */\r\n#define USART_ID_MAJOR_REV(x)                    (((uint32_t)(((uint32_t)(x)) << USART_ID_MAJOR_REV_SHIFT)) & USART_ID_MAJOR_REV_MASK)\r\n\r\n#define USART_ID_ID_MASK                         (0xFFFF0000U)\r\n#define USART_ID_ID_SHIFT                        (16U)\r\n/*! ID - Module identifier for the selected function */\r\n#define USART_ID_ID(x)                           (((uint32_t)(((uint32_t)(x)) << USART_ID_ID_SHIFT)) & USART_ID_ID_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group USART_Register_Masks */\r\n\r\n\r\n/* USART - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral USART0 base address */\r\n  #define USART0_BASE                              (0x50106000u)\r\n  /** Peripheral USART0 base address */\r\n  #define USART0_BASE_NS                           (0x40106000u)\r\n  /** Peripheral USART0 base pointer */\r\n  #define USART0                                   ((USART_Type *)USART0_BASE)\r\n  /** Peripheral USART0 base pointer */\r\n  #define USART0_NS                                ((USART_Type *)USART0_BASE_NS)\r\n  /** Peripheral USART1 base address */\r\n  #define USART1_BASE                              (0x50107000u)\r\n  /** Peripheral USART1 base address */\r\n  #define USART1_BASE_NS                           (0x40107000u)\r\n  /** Peripheral USART1 base pointer */\r\n  #define USART1                                   ((USART_Type *)USART1_BASE)\r\n  /** Peripheral USART1 base pointer */\r\n  #define USART1_NS                                ((USART_Type *)USART1_BASE_NS)\r\n  /** Peripheral USART2 base address */\r\n  #define USART2_BASE                              (0x50108000u)\r\n  /** Peripheral USART2 base address */\r\n  #define USART2_BASE_NS                           (0x40108000u)\r\n  /** Peripheral USART2 base pointer */\r\n  #define USART2                                   ((USART_Type *)USART2_BASE)\r\n  /** Peripheral USART2 base pointer */\r\n  #define USART2_NS                                ((USART_Type *)USART2_BASE_NS)\r\n  /** Peripheral USART3 base address */\r\n  #define USART3_BASE                              (0x50109000u)\r\n  /** Peripheral USART3 base address */\r\n  #define USART3_BASE_NS                           (0x40109000u)\r\n  /** Peripheral USART3 base pointer */\r\n  #define USART3                                   ((USART_Type *)USART3_BASE)\r\n  /** Peripheral USART3 base pointer */\r\n  #define USART3_NS                                ((USART_Type *)USART3_BASE_NS)\r\n  /** Peripheral USART14 base address */\r\n  #define USART14_BASE                             (0x50126000u)\r\n  /** Peripheral USART14 base address */\r\n  #define USART14_BASE_NS                          (0x40126000u)\r\n  /** Peripheral USART14 base pointer */\r\n  #define USART14                                  ((USART_Type *)USART14_BASE)\r\n  /** Peripheral USART14 base pointer */\r\n  #define USART14_NS                               ((USART_Type *)USART14_BASE_NS)\r\n  /** Array initializer of USART peripheral base addresses */\r\n  #define USART_BASE_ADDRS                         { USART0_BASE, USART1_BASE, USART2_BASE, USART3_BASE, USART14_BASE }\r\n  /** Array initializer of USART peripheral base pointers */\r\n  #define USART_BASE_PTRS                          { USART0, USART1, USART2, USART3, USART14 }\r\n  /** Array initializer of USART peripheral base addresses */\r\n  #define USART_BASE_ADDRS_NS                      { USART0_BASE_NS, USART1_BASE_NS, USART2_BASE_NS, USART3_BASE_NS, USART14_BASE_NS }\r\n  /** Array initializer of USART peripheral base pointers */\r\n  #define USART_BASE_PTRS_NS                       { USART0_NS, USART1_NS, USART2_NS, USART3_NS, USART14_NS }\r\n#else\r\n  /** Peripheral USART0 base address */\r\n  #define USART0_BASE                              (0x40106000u)\r\n  /** Peripheral USART0 base pointer */\r\n  #define USART0                                   ((USART_Type *)USART0_BASE)\r\n  /** Peripheral USART1 base address */\r\n  #define USART1_BASE                              (0x40107000u)\r\n  /** Peripheral USART1 base pointer */\r\n  #define USART1                                   ((USART_Type *)USART1_BASE)\r\n  /** Peripheral USART2 base address */\r\n  #define USART2_BASE                              (0x40108000u)\r\n  /** Peripheral USART2 base pointer */\r\n  #define USART2                                   ((USART_Type *)USART2_BASE)\r\n  /** Peripheral USART3 base address */\r\n  #define USART3_BASE                              (0x40109000u)\r\n  /** Peripheral USART3 base pointer */\r\n  #define USART3                                   ((USART_Type *)USART3_BASE)\r\n  /** Peripheral USART14 base address */\r\n  #define USART14_BASE                             (0x40126000u)\r\n  /** Peripheral USART14 base pointer */\r\n  #define USART14                                  ((USART_Type *)USART14_BASE)\r\n  /** Array initializer of USART peripheral base addresses */\r\n  #define USART_BASE_ADDRS                         { USART0_BASE, USART1_BASE, USART2_BASE, USART3_BASE, USART14_BASE }\r\n  /** Array initializer of USART peripheral base pointers */\r\n  #define USART_BASE_PTRS                          { USART0, USART1, USART2, USART3, USART14 }\r\n#endif\r\n/** Interrupt vectors for the USART peripheral type */\r\n#define USART_IRQS                               { FLEXCOMM0_IRQn, FLEXCOMM1_IRQn, FLEXCOMM2_IRQn, FLEXCOMM3_IRQn, FLEXCOMM14_IRQn }\r\n\r\n/*!\r\n * @}\r\n */ /* end of group USART_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- USBC Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup USBC_Peripheral_Access_Layer USBC Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** USBC - Register Layout Typedef */\r\ntypedef struct {\r\n  __I  uint32_t ID;                                /**< ID, offset: 0x0 */\r\n  __I  uint32_t HWGENERAL;                         /**< HWGENERAL, offset: 0x4 */\r\n  __I  uint32_t HWHOST;                            /**< HWHOST, offset: 0x8 */\r\n  __I  uint32_t HWDEVICE;                          /**< HWDEVICE, offset: 0xC */\r\n  __I  uint32_t HWTXBUF;                           /**< HWTXBUF, offset: 0x10 */\r\n  __I  uint32_t HWRXBUF;                           /**< HWRXBUF, offset: 0x14 */\r\n  __IO uint32_t HWTXBUF0;                          /**< HWTXBUF0, offset: 0x18 */\r\n  __IO uint32_t HWTXBUF1;                          /**< HWTXBUF1, offset: 0x1C */\r\n       uint8_t RESERVED_0[96];\r\n  __IO uint32_t GPTIMER0LD;                        /**< GPTIMER0LD, offset: 0x80 */\r\n  __IO uint32_t GPTIMER0CTRL;                      /**< GPTIMER0CTRL, offset: 0x84 */\r\n  __IO uint32_t GPTIMER1LD;                        /**< GPTIMER1LD, offset: 0x88 */\r\n  __IO uint32_t GPTIMER1CTRL;                      /**< GPTIMER1CTRL, offset: 0x8C */\r\n  __IO uint32_t SBUSCFG;                           /**< SBUSCFG, offset: 0x90 */\r\n       uint8_t RESERVED_1[108];\r\n  __I  uint32_t CAPLENGTH;                         /**< CAPLENGTH, offset: 0x100 */\r\n  __I  uint32_t HCSPARAMS;                         /**< HCSPARAMS, offset: 0x104 */\r\n  __I  uint32_t HCCPARAMS;                         /**< HCCPARAMS, offset: 0x108 */\r\n       uint8_t RESERVED_2[20];\r\n  __I  uint32_t DCIVERSION;                        /**< DCIVERSION, offset: 0x120 */\r\n  __I  uint32_t DCCPARAMS;                         /**< DCCPARAMS, offset: 0x124 */\r\n  __IO uint32_t DEVLPMCSR;                         /**< DevLPMCSR, offset: 0x128 */\r\n       uint8_t RESERVED_3[20];\r\n  __IO uint32_t USBCMD;                            /**< USBCMD, offset: 0x140 */\r\n  __IO uint32_t USBSTS;                            /**< USBSTS, offset: 0x144 */\r\n  __IO uint32_t USBINTR;                           /**< USBINTR, offset: 0x148 */\r\n  __IO uint32_t FRINDEX;                           /**< FRINDEX, offset: 0x14C */\r\n       uint8_t RESERVED_4[4];\r\n  union {                                          /* offset: 0x154 */\r\n    __IO uint32_t DEVICEADDR;                        /**< DEVICEADDR, offset: 0x154 */\r\n    __IO uint32_t PERIODICLISTBASE;                  /**< PERIODICLISTBASE, offset: 0x154 */\r\n  };\r\n  union {                                          /* offset: 0x158 */\r\n    __IO uint32_t ASYNCLISTADDR;                     /**< ASYNCLISTADDR, offset: 0x158 */\r\n    __IO uint32_t ENDPOINTLISTADDR;                  /**< ENDPOINTLISTADDR, offset: 0x158 */\r\n  };\r\n  __IO uint32_t TTCTRL;                            /**< TTCTRL, offset: 0x15C */\r\n  __IO uint32_t BURSTSIZE;                         /**< BURSTSIZE, offset: 0x160 */\r\n  __IO uint32_t TXFILLTUNING;                      /**< TXFILLTUNING, offset: 0x164 */\r\n  __IO uint32_t TXTTFILLTUNING;                    /**< TXTTFILLTUNING, offset: 0x168 */\r\n  __IO uint32_t IC_USB;                            /**< IC_USB, offset: 0x16C */\r\n  __I  uint32_t ULPI_VIEWPORT;                     /**< ULPI_VIEWPORT, offset: 0x170 */\r\n       uint8_t RESERVED_5[4];\r\n  __IO uint32_t ENDPTNAK;                          /**< ENDPTNAK, offset: 0x178 */\r\n  __IO uint32_t ENDPTNAKEN;                        /**< ENDPTNAKEN, offset: 0x17C */\r\n       uint8_t RESERVED_6[4];\r\n  __IO uint32_t PORTSC1;                           /**< PORTSC1, offset: 0x184 */\r\n  __IO uint32_t PORTSC2;                           /**< PORTSC2, offset: 0x188 */\r\n  __IO uint32_t PORTSC3;                           /**< PORTSC3, offset: 0x18C */\r\n  __IO uint32_t PORTSC4;                           /**< PORTSC4, offset: 0x190 */\r\n  __IO uint32_t PORTSC5;                           /**< PORTSC5, offset: 0x194 */\r\n  __IO uint32_t PORTSC6;                           /**< PORTSC6, offset: 0x198 */\r\n  __IO uint32_t PORTSC7;                           /**< PORTSC7, offset: 0x19C */\r\n  __IO uint32_t PORTSC8;                           /**< PORTSC8, offset: 0x1A0 */\r\n  __IO uint32_t OTGSC;                             /**< OTGSC, offset: 0x1A4 */\r\n  __IO uint32_t USBMODE;                           /**< USBMODE, offset: 0x1A8 */\r\n  __IO uint32_t ENDPTSETUPSTAT;                    /**< ENDPTSETUPSTAT, offset: 0x1AC */\r\n  __IO uint32_t ENDPTPRIME;                        /**< ENDPTPRIME, offset: 0x1B0 */\r\n  __IO uint32_t ENDPTFLUSH;                        /**< ENDPTFLUSH, offset: 0x1B4 */\r\n  __I  uint32_t ENDPTSTAT;                         /**< ENDPTSTAT, offset: 0x1B8 */\r\n  __IO uint32_t ENDPTCOMPLETE;                     /**< ENDPTCOMPLETE, offset: 0x1BC */\r\n  __IO uint32_t ENDPTCTRL0;                        /**< ENDPTCTRL0, offset: 0x1C0 */\r\n  __IO uint32_t ENDPTCTRL[15];                     /**< ENDPTCTRL1..ENDPTCTRL15, array offset: 0x1C4, array step: 0x4 */\r\n  __IO uint32_t PLL_CONTROL_0;                     /**< PLL_Control_0, offset: 0x200 */\r\n  __IO uint32_t PLL_CONTROL_1;                     /**< PLL_Control_1, offset: 0x204 */\r\n  __IO uint32_t CALIBRATION_CONTROL;               /**< CALIBRATION_Control, offset: 0x208 */\r\n  __IO uint32_t TX_CHANNEL_CONTRL_0;               /**< Tx_Channel_Contrl_0, offset: 0x20C */\r\n  __I  uint32_t TX_CHANNEL_CONTRL_1;               /**< Tx_Channel_Contrl_1, offset: 0x210 */\r\n  __IO uint32_t RX_CHANNEL_CONTRL_0;               /**< Rx_Channel_Contrl_0, offset: 0x214 */\r\n  __IO uint32_t RX_CHANNEL_CONTRL_1;               /**< Rx_Channel_Contrl_1, offset: 0x218 */\r\n  __IO uint32_t DIGITAL_CONTRL_0;                  /**< Digital_Contrl_0, offset: 0x21C */\r\n  __IO uint32_t DIGITAL_CONTRL_1;                  /**< Digital_Contrl_1, offset: 0x220 */\r\n  __IO uint32_t TEST_CONTRL_AND_STATUS_0;          /**< Test_Contrl_and_Status_0, offset: 0x224 */\r\n  __IO uint32_t TEST_CONTRL_AND_STATUS_1;          /**< Test_Contrl_and_Status_1, offset: 0x228 */\r\n  __IO uint32_t MONITOR;                           /**< MONITOR, offset: 0x22C */\r\n  __IO uint32_t RESERVE_ANA;                       /**< PHY_RESERVE, offset: 0x230 */\r\n  __IO uint32_t PHY_REG_OTG_CONTROL;               /**< PHY_REG_OTG_CONTROL, offset: 0x234 */\r\n  __IO uint32_t PHY_REG_CHGDTC_CONTRL_1;           /**< PHY_REG_CHGDTC_CONTRL_1, offset: 0x238 */\r\n       uint8_t RESERVED_7[16];\r\n  __I  uint32_t RESERVED;                          /**< RESERVED, offset: 0x24C */\r\n} USBC_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- USBC Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup USBC_Register_Masks USBC Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name ID - ID */\r\n/*! @{ */\r\n\r\n#define USBC_ID_ID_MASK                          (0x3FU)\r\n#define USBC_ID_ID_SHIFT                         (0U)\r\n/*! ID - ID */\r\n#define USBC_ID_ID(x)                            (((uint32_t)(((uint32_t)(x)) << USBC_ID_ID_SHIFT)) & USBC_ID_ID_MASK)\r\n\r\n#define USBC_ID_UNUSED_6_MASK                    (0xC0U)\r\n#define USBC_ID_UNUSED_6_SHIFT                   (6U)\r\n/*! UNUSED_6 - UNUSED_6 */\r\n#define USBC_ID_UNUSED_6(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_ID_UNUSED_6_SHIFT)) & USBC_ID_UNUSED_6_MASK)\r\n\r\n#define USBC_ID_NID_MASK                         (0x3F00U)\r\n#define USBC_ID_NID_SHIFT                        (8U)\r\n/*! NID - NID */\r\n#define USBC_ID_NID(x)                           (((uint32_t)(((uint32_t)(x)) << USBC_ID_NID_SHIFT)) & USBC_ID_NID_MASK)\r\n\r\n#define USBC_ID_UNUSED_14_MASK                   (0xC000U)\r\n#define USBC_ID_UNUSED_14_SHIFT                  (14U)\r\n/*! UNUSED_14 - UNUSED_14 */\r\n#define USBC_ID_UNUSED_14(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_ID_UNUSED_14_SHIFT)) & USBC_ID_UNUSED_14_MASK)\r\n\r\n#define USBC_ID_TAG_MASK                         (0x1F0000U)\r\n#define USBC_ID_TAG_SHIFT                        (16U)\r\n/*! TAG - TAG */\r\n#define USBC_ID_TAG(x)                           (((uint32_t)(((uint32_t)(x)) << USBC_ID_TAG_SHIFT)) & USBC_ID_TAG_MASK)\r\n\r\n#define USBC_ID_REVISION_MASK                    (0x1E00000U)\r\n#define USBC_ID_REVISION_SHIFT                   (21U)\r\n/*! REVISION - REVISION */\r\n#define USBC_ID_REVISION(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_ID_REVISION_SHIFT)) & USBC_ID_REVISION_MASK)\r\n\r\n#define USBC_ID_VERSION_MASK                     (0x1E000000U)\r\n#define USBC_ID_VERSION_SHIFT                    (25U)\r\n/*! VERSION - VERSION */\r\n#define USBC_ID_VERSION(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_ID_VERSION_SHIFT)) & USBC_ID_VERSION_MASK)\r\n\r\n#define USBC_ID_CIVERSION_MASK                   (0xE0000000U)\r\n#define USBC_ID_CIVERSION_SHIFT                  (29U)\r\n/*! CIVERSION - CIVERSION */\r\n#define USBC_ID_CIVERSION(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_ID_CIVERSION_SHIFT)) & USBC_ID_CIVERSION_MASK)\r\n/*! @} */\r\n\r\n/*! @name HWGENERAL - HWGENERAL */\r\n/*! @{ */\r\n\r\n#define USBC_HWGENERAL_RT_MASK                   (0x1U)\r\n#define USBC_HWGENERAL_RT_SHIFT                  (0U)\r\n/*! RT - RT */\r\n#define USBC_HWGENERAL_RT(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_HWGENERAL_RT_SHIFT)) & USBC_HWGENERAL_RT_MASK)\r\n\r\n#define USBC_HWGENERAL_CLKC_MASK                 (0x6U)\r\n#define USBC_HWGENERAL_CLKC_SHIFT                (1U)\r\n/*! CLKC - CLKC */\r\n#define USBC_HWGENERAL_CLKC(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_HWGENERAL_CLKC_SHIFT)) & USBC_HWGENERAL_CLKC_MASK)\r\n\r\n#define USBC_HWGENERAL_BWT_MASK                  (0x8U)\r\n#define USBC_HWGENERAL_BWT_SHIFT                 (3U)\r\n/*! BWT - BWT */\r\n#define USBC_HWGENERAL_BWT(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_HWGENERAL_BWT_SHIFT)) & USBC_HWGENERAL_BWT_MASK)\r\n\r\n#define USBC_HWGENERAL_PHYW_MASK                 (0x30U)\r\n#define USBC_HWGENERAL_PHYW_SHIFT                (4U)\r\n/*! PHYW - PHYW */\r\n#define USBC_HWGENERAL_PHYW(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_HWGENERAL_PHYW_SHIFT)) & USBC_HWGENERAL_PHYW_MASK)\r\n\r\n#define USBC_HWGENERAL_PHYM_MASK                 (0x3C0U)\r\n#define USBC_HWGENERAL_PHYM_SHIFT                (6U)\r\n/*! PHYM - PHYM */\r\n#define USBC_HWGENERAL_PHYM(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_HWGENERAL_PHYM_SHIFT)) & USBC_HWGENERAL_PHYM_MASK)\r\n\r\n#define USBC_HWGENERAL_SM_MASK                   (0xC00U)\r\n#define USBC_HWGENERAL_SM_SHIFT                  (10U)\r\n/*! SM - SM */\r\n#define USBC_HWGENERAL_SM(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_HWGENERAL_SM_SHIFT)) & USBC_HWGENERAL_SM_MASK)\r\n\r\n#define USBC_HWGENERAL_UNUSED_12_MASK            (0xFFFFF000U)\r\n#define USBC_HWGENERAL_UNUSED_12_SHIFT           (12U)\r\n/*! UNUSED_12 - UNUSED_12 */\r\n#define USBC_HWGENERAL_UNUSED_12(x)              (((uint32_t)(((uint32_t)(x)) << USBC_HWGENERAL_UNUSED_12_SHIFT)) & USBC_HWGENERAL_UNUSED_12_MASK)\r\n/*! @} */\r\n\r\n/*! @name HWHOST - HWHOST */\r\n/*! @{ */\r\n\r\n#define USBC_HWHOST_HC_MASK                      (0x1U)\r\n#define USBC_HWHOST_HC_SHIFT                     (0U)\r\n/*! HC - HC */\r\n#define USBC_HWHOST_HC(x)                        (((uint32_t)(((uint32_t)(x)) << USBC_HWHOST_HC_SHIFT)) & USBC_HWHOST_HC_MASK)\r\n\r\n#define USBC_HWHOST_NPORT_MASK                   (0xEU)\r\n#define USBC_HWHOST_NPORT_SHIFT                  (1U)\r\n/*! NPORT - NPORT */\r\n#define USBC_HWHOST_NPORT(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_HWHOST_NPORT_SHIFT)) & USBC_HWHOST_NPORT_MASK)\r\n\r\n#define USBC_HWHOST_UNUSED_4_MASK                (0xFFF0U)\r\n#define USBC_HWHOST_UNUSED_4_SHIFT               (4U)\r\n/*! UNUSED_4 - UNUSED_4 */\r\n#define USBC_HWHOST_UNUSED_4(x)                  (((uint32_t)(((uint32_t)(x)) << USBC_HWHOST_UNUSED_4_SHIFT)) & USBC_HWHOST_UNUSED_4_MASK)\r\n\r\n#define USBC_HWHOST_TTASY_MASK                   (0xFF0000U)\r\n#define USBC_HWHOST_TTASY_SHIFT                  (16U)\r\n/*! TTASY - TTASY */\r\n#define USBC_HWHOST_TTASY(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_HWHOST_TTASY_SHIFT)) & USBC_HWHOST_TTASY_MASK)\r\n\r\n#define USBC_HWHOST_TTPER_MASK                   (0xFF000000U)\r\n#define USBC_HWHOST_TTPER_SHIFT                  (24U)\r\n/*! TTPER - TTPER */\r\n#define USBC_HWHOST_TTPER(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_HWHOST_TTPER_SHIFT)) & USBC_HWHOST_TTPER_MASK)\r\n/*! @} */\r\n\r\n/*! @name HWDEVICE - HWDEVICE */\r\n/*! @{ */\r\n\r\n#define USBC_HWDEVICE_DC_MASK                    (0x1U)\r\n#define USBC_HWDEVICE_DC_SHIFT                   (0U)\r\n/*! DC - DC */\r\n#define USBC_HWDEVICE_DC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_HWDEVICE_DC_SHIFT)) & USBC_HWDEVICE_DC_MASK)\r\n\r\n#define USBC_HWDEVICE_DEVEP_MASK                 (0x3EU)\r\n#define USBC_HWDEVICE_DEVEP_SHIFT                (1U)\r\n/*! DEVEP - DEVEP */\r\n#define USBC_HWDEVICE_DEVEP(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_HWDEVICE_DEVEP_SHIFT)) & USBC_HWDEVICE_DEVEP_MASK)\r\n\r\n#define USBC_HWDEVICE_UNUSED_6_MASK              (0xFFFFFFC0U)\r\n#define USBC_HWDEVICE_UNUSED_6_SHIFT             (6U)\r\n/*! UNUSED_6 - UNUSED_6 */\r\n#define USBC_HWDEVICE_UNUSED_6(x)                (((uint32_t)(((uint32_t)(x)) << USBC_HWDEVICE_UNUSED_6_SHIFT)) & USBC_HWDEVICE_UNUSED_6_MASK)\r\n/*! @} */\r\n\r\n/*! @name HWTXBUF - HWTXBUF */\r\n/*! @{ */\r\n\r\n#define USBC_HWTXBUF_TXBURST_MASK                (0xFFU)\r\n#define USBC_HWTXBUF_TXBURST_SHIFT               (0U)\r\n/*! TXBURST - TXBURST */\r\n#define USBC_HWTXBUF_TXBURST(x)                  (((uint32_t)(((uint32_t)(x)) << USBC_HWTXBUF_TXBURST_SHIFT)) & USBC_HWTXBUF_TXBURST_MASK)\r\n\r\n#define USBC_HWTXBUF_TXADD_MASK                  (0xFF00U)\r\n#define USBC_HWTXBUF_TXADD_SHIFT                 (8U)\r\n/*! TXADD - TXADD */\r\n#define USBC_HWTXBUF_TXADD(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_HWTXBUF_TXADD_SHIFT)) & USBC_HWTXBUF_TXADD_MASK)\r\n\r\n#define USBC_HWTXBUF_TXCHANADD_MASK              (0xFF0000U)\r\n#define USBC_HWTXBUF_TXCHANADD_SHIFT             (16U)\r\n/*! TXCHANADD - TXCHANADD */\r\n#define USBC_HWTXBUF_TXCHANADD(x)                (((uint32_t)(((uint32_t)(x)) << USBC_HWTXBUF_TXCHANADD_SHIFT)) & USBC_HWTXBUF_TXCHANADD_MASK)\r\n\r\n#define USBC_HWTXBUF_UNUSED_24_MASK              (0x7F000000U)\r\n#define USBC_HWTXBUF_UNUSED_24_SHIFT             (24U)\r\n/*! UNUSED_24 - UNUSED_24 */\r\n#define USBC_HWTXBUF_UNUSED_24(x)                (((uint32_t)(((uint32_t)(x)) << USBC_HWTXBUF_UNUSED_24_SHIFT)) & USBC_HWTXBUF_UNUSED_24_MASK)\r\n\r\n#define USBC_HWTXBUF_UNUSED_31_MASK              (0x80000000U)\r\n#define USBC_HWTXBUF_UNUSED_31_SHIFT             (31U)\r\n/*! UNUSED_31 - UNUSED_31 */\r\n#define USBC_HWTXBUF_UNUSED_31(x)                (((uint32_t)(((uint32_t)(x)) << USBC_HWTXBUF_UNUSED_31_SHIFT)) & USBC_HWTXBUF_UNUSED_31_MASK)\r\n/*! @} */\r\n\r\n/*! @name HWRXBUF - HWRXBUF */\r\n/*! @{ */\r\n\r\n#define USBC_HWRXBUF_RXBURST_MASK                (0xFFU)\r\n#define USBC_HWRXBUF_RXBURST_SHIFT               (0U)\r\n/*! RXBURST - RXBURST */\r\n#define USBC_HWRXBUF_RXBURST(x)                  (((uint32_t)(((uint32_t)(x)) << USBC_HWRXBUF_RXBURST_SHIFT)) & USBC_HWRXBUF_RXBURST_MASK)\r\n\r\n#define USBC_HWRXBUF_RXADD_MASK                  (0xFF00U)\r\n#define USBC_HWRXBUF_RXADD_SHIFT                 (8U)\r\n/*! RXADD - RXADD */\r\n#define USBC_HWRXBUF_RXADD(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_HWRXBUF_RXADD_SHIFT)) & USBC_HWRXBUF_RXADD_MASK)\r\n\r\n#define USBC_HWRXBUF_UNUSED_16_MASK              (0xFFFF0000U)\r\n#define USBC_HWRXBUF_UNUSED_16_SHIFT             (16U)\r\n/*! UNUSED_16 - UNUSED_16 */\r\n#define USBC_HWRXBUF_UNUSED_16(x)                (((uint32_t)(((uint32_t)(x)) << USBC_HWRXBUF_UNUSED_16_SHIFT)) & USBC_HWRXBUF_UNUSED_16_MASK)\r\n/*! @} */\r\n\r\n/*! @name HWTXBUF0 - HWTXBUF0 */\r\n/*! @{ */\r\n\r\n#define USBC_HWTXBUF0_TXBURST_MASK               (0xFFFFFFFFU)\r\n#define USBC_HWTXBUF0_TXBURST_SHIFT              (0U)\r\n/*! TXBURST - TXBURST */\r\n#define USBC_HWTXBUF0_TXBURST(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_HWTXBUF0_TXBURST_SHIFT)) & USBC_HWTXBUF0_TXBURST_MASK)\r\n/*! @} */\r\n\r\n/*! @name HWTXBUF1 - HWTXBUF1 */\r\n/*! @{ */\r\n\r\n#define USBC_HWTXBUF1_TXBURST_MASK               (0xFFFFFFFFU)\r\n#define USBC_HWTXBUF1_TXBURST_SHIFT              (0U)\r\n/*! TXBURST - TXBURST */\r\n#define USBC_HWTXBUF1_TXBURST(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_HWTXBUF1_TXBURST_SHIFT)) & USBC_HWTXBUF1_TXBURST_MASK)\r\n/*! @} */\r\n\r\n/*! @name GPTIMER0LD - GPTIMER0LD */\r\n/*! @{ */\r\n\r\n#define USBC_GPTIMER0LD_GPTLD_MASK               (0xFFFFFFU)\r\n#define USBC_GPTIMER0LD_GPTLD_SHIFT              (0U)\r\n/*! GPTLD - GPTLD */\r\n#define USBC_GPTIMER0LD_GPTLD(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_GPTIMER0LD_GPTLD_SHIFT)) & USBC_GPTIMER0LD_GPTLD_MASK)\r\n\r\n#define USBC_GPTIMER0LD_UNUSED_24_MASK           (0xFF000000U)\r\n#define USBC_GPTIMER0LD_UNUSED_24_SHIFT          (24U)\r\n/*! UNUSED_24 - UNUSED_24 */\r\n#define USBC_GPTIMER0LD_UNUSED_24(x)             (((uint32_t)(((uint32_t)(x)) << USBC_GPTIMER0LD_UNUSED_24_SHIFT)) & USBC_GPTIMER0LD_UNUSED_24_MASK)\r\n/*! @} */\r\n\r\n/*! @name GPTIMER0CTRL - GPTIMER0CTRL */\r\n/*! @{ */\r\n\r\n#define USBC_GPTIMER0CTRL_GPTCNT_MASK            (0xFFFFFFU)\r\n#define USBC_GPTIMER0CTRL_GPTCNT_SHIFT           (0U)\r\n/*! GPTCNT - GPTCNT */\r\n#define USBC_GPTIMER0CTRL_GPTCNT(x)              (((uint32_t)(((uint32_t)(x)) << USBC_GPTIMER0CTRL_GPTCNT_SHIFT)) & USBC_GPTIMER0CTRL_GPTCNT_MASK)\r\n\r\n#define USBC_GPTIMER0CTRL_GPTMODE_MASK           (0x1000000U)\r\n#define USBC_GPTIMER0CTRL_GPTMODE_SHIFT          (24U)\r\n/*! GPTMODE - GPTMODE */\r\n#define USBC_GPTIMER0CTRL_GPTMODE(x)             (((uint32_t)(((uint32_t)(x)) << USBC_GPTIMER0CTRL_GPTMODE_SHIFT)) & USBC_GPTIMER0CTRL_GPTMODE_MASK)\r\n\r\n#define USBC_GPTIMER0CTRL_UNUSED_25_MASK         (0x3E000000U)\r\n#define USBC_GPTIMER0CTRL_UNUSED_25_SHIFT        (25U)\r\n/*! UNUSED_25 - UNUSED_25 */\r\n#define USBC_GPTIMER0CTRL_UNUSED_25(x)           (((uint32_t)(((uint32_t)(x)) << USBC_GPTIMER0CTRL_UNUSED_25_SHIFT)) & USBC_GPTIMER0CTRL_UNUSED_25_MASK)\r\n\r\n#define USBC_GPTIMER0CTRL_GPTRST_MASK            (0x40000000U)\r\n#define USBC_GPTIMER0CTRL_GPTRST_SHIFT           (30U)\r\n/*! GPTRST - GPTRST */\r\n#define USBC_GPTIMER0CTRL_GPTRST(x)              (((uint32_t)(((uint32_t)(x)) << USBC_GPTIMER0CTRL_GPTRST_SHIFT)) & USBC_GPTIMER0CTRL_GPTRST_MASK)\r\n\r\n#define USBC_GPTIMER0CTRL_GPTRUN_MASK            (0x80000000U)\r\n#define USBC_GPTIMER0CTRL_GPTRUN_SHIFT           (31U)\r\n/*! GPTRUN - GPTRUN */\r\n#define USBC_GPTIMER0CTRL_GPTRUN(x)              (((uint32_t)(((uint32_t)(x)) << USBC_GPTIMER0CTRL_GPTRUN_SHIFT)) & USBC_GPTIMER0CTRL_GPTRUN_MASK)\r\n/*! @} */\r\n\r\n/*! @name GPTIMER1LD - GPTIMER1LD */\r\n/*! @{ */\r\n\r\n#define USBC_GPTIMER1LD_GPTLD_MASK               (0xFFFFFFU)\r\n#define USBC_GPTIMER1LD_GPTLD_SHIFT              (0U)\r\n/*! GPTLD - GPTLD */\r\n#define USBC_GPTIMER1LD_GPTLD(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_GPTIMER1LD_GPTLD_SHIFT)) & USBC_GPTIMER1LD_GPTLD_MASK)\r\n\r\n#define USBC_GPTIMER1LD_UNUSED_24_MASK           (0xFF000000U)\r\n#define USBC_GPTIMER1LD_UNUSED_24_SHIFT          (24U)\r\n/*! UNUSED_24 - UNUSED_24 */\r\n#define USBC_GPTIMER1LD_UNUSED_24(x)             (((uint32_t)(((uint32_t)(x)) << USBC_GPTIMER1LD_UNUSED_24_SHIFT)) & USBC_GPTIMER1LD_UNUSED_24_MASK)\r\n/*! @} */\r\n\r\n/*! @name GPTIMER1CTRL - GPTIMER1CTRL */\r\n/*! @{ */\r\n\r\n#define USBC_GPTIMER1CTRL_GPTCNT_MASK            (0xFFFFFFU)\r\n#define USBC_GPTIMER1CTRL_GPTCNT_SHIFT           (0U)\r\n/*! GPTCNT - GPTCNT */\r\n#define USBC_GPTIMER1CTRL_GPTCNT(x)              (((uint32_t)(((uint32_t)(x)) << USBC_GPTIMER1CTRL_GPTCNT_SHIFT)) & USBC_GPTIMER1CTRL_GPTCNT_MASK)\r\n\r\n#define USBC_GPTIMER1CTRL_GPTMODE_MASK           (0x1000000U)\r\n#define USBC_GPTIMER1CTRL_GPTMODE_SHIFT          (24U)\r\n/*! GPTMODE - GPTMODE */\r\n#define USBC_GPTIMER1CTRL_GPTMODE(x)             (((uint32_t)(((uint32_t)(x)) << USBC_GPTIMER1CTRL_GPTMODE_SHIFT)) & USBC_GPTIMER1CTRL_GPTMODE_MASK)\r\n\r\n#define USBC_GPTIMER1CTRL_UNUSED_25_MASK         (0x3E000000U)\r\n#define USBC_GPTIMER1CTRL_UNUSED_25_SHIFT        (25U)\r\n/*! UNUSED_25 - UNUSED_25 */\r\n#define USBC_GPTIMER1CTRL_UNUSED_25(x)           (((uint32_t)(((uint32_t)(x)) << USBC_GPTIMER1CTRL_UNUSED_25_SHIFT)) & USBC_GPTIMER1CTRL_UNUSED_25_MASK)\r\n\r\n#define USBC_GPTIMER1CTRL_GPTRST_MASK            (0x40000000U)\r\n#define USBC_GPTIMER1CTRL_GPTRST_SHIFT           (30U)\r\n/*! GPTRST - GPTRST */\r\n#define USBC_GPTIMER1CTRL_GPTRST(x)              (((uint32_t)(((uint32_t)(x)) << USBC_GPTIMER1CTRL_GPTRST_SHIFT)) & USBC_GPTIMER1CTRL_GPTRST_MASK)\r\n\r\n#define USBC_GPTIMER1CTRL_GPTRUN_MASK            (0x80000000U)\r\n#define USBC_GPTIMER1CTRL_GPTRUN_SHIFT           (31U)\r\n/*! GPTRUN - GPTRUN */\r\n#define USBC_GPTIMER1CTRL_GPTRUN(x)              (((uint32_t)(((uint32_t)(x)) << USBC_GPTIMER1CTRL_GPTRUN_SHIFT)) & USBC_GPTIMER1CTRL_GPTRUN_MASK)\r\n/*! @} */\r\n\r\n/*! @name SBUSCFG - SBUSCFG */\r\n/*! @{ */\r\n\r\n#define USBC_SBUSCFG_AHBBRST_MASK                (0x7U)\r\n#define USBC_SBUSCFG_AHBBRST_SHIFT               (0U)\r\n/*! AHBBRST - AHBBRST */\r\n#define USBC_SBUSCFG_AHBBRST(x)                  (((uint32_t)(((uint32_t)(x)) << USBC_SBUSCFG_AHBBRST_SHIFT)) & USBC_SBUSCFG_AHBBRST_MASK)\r\n\r\n#define USBC_SBUSCFG_BARD_MASK                   (0x38U)\r\n#define USBC_SBUSCFG_BARD_SHIFT                  (3U)\r\n/*! BARD - BARD */\r\n#define USBC_SBUSCFG_BARD(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_SBUSCFG_BARD_SHIFT)) & USBC_SBUSCFG_BARD_MASK)\r\n\r\n#define USBC_SBUSCFG_BAWR_MASK                   (0x1C0U)\r\n#define USBC_SBUSCFG_BAWR_SHIFT                  (6U)\r\n/*! BAWR - BAWR */\r\n#define USBC_SBUSCFG_BAWR(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_SBUSCFG_BAWR_SHIFT)) & USBC_SBUSCFG_BAWR_MASK)\r\n\r\n#define USBC_SBUSCFG_UNUSED_9_MASK               (0xFFFFFE00U)\r\n#define USBC_SBUSCFG_UNUSED_9_SHIFT              (9U)\r\n/*! UNUSED_9 - UNUSED_9 */\r\n#define USBC_SBUSCFG_UNUSED_9(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_SBUSCFG_UNUSED_9_SHIFT)) & USBC_SBUSCFG_UNUSED_9_MASK)\r\n/*! @} */\r\n\r\n/*! @name CAPLENGTH - CAPLENGTH */\r\n/*! @{ */\r\n\r\n#define USBC_CAPLENGTH_CAPLENGTH_MASK            (0xFFU)\r\n#define USBC_CAPLENGTH_CAPLENGTH_SHIFT           (0U)\r\n/*! CAPLENGTH - CAPLENGTH */\r\n#define USBC_CAPLENGTH_CAPLENGTH(x)              (((uint32_t)(((uint32_t)(x)) << USBC_CAPLENGTH_CAPLENGTH_SHIFT)) & USBC_CAPLENGTH_CAPLENGTH_MASK)\r\n\r\n#define USBC_CAPLENGTH_UNUSED_8_MASK             (0xFF00U)\r\n#define USBC_CAPLENGTH_UNUSED_8_SHIFT            (8U)\r\n/*! UNUSED_8 - UNUSED_8 */\r\n#define USBC_CAPLENGTH_UNUSED_8(x)               (((uint32_t)(((uint32_t)(x)) << USBC_CAPLENGTH_UNUSED_8_SHIFT)) & USBC_CAPLENGTH_UNUSED_8_MASK)\r\n\r\n#define USBC_CAPLENGTH_HCIVERSION_MASK           (0xFFFF0000U)\r\n#define USBC_CAPLENGTH_HCIVERSION_SHIFT          (16U)\r\n/*! HCIVERSION - HCIVERSION */\r\n#define USBC_CAPLENGTH_HCIVERSION(x)             (((uint32_t)(((uint32_t)(x)) << USBC_CAPLENGTH_HCIVERSION_SHIFT)) & USBC_CAPLENGTH_HCIVERSION_MASK)\r\n/*! @} */\r\n\r\n/*! @name HCSPARAMS - HCSPARAMS */\r\n/*! @{ */\r\n\r\n#define USBC_HCSPARAMS_N_PORTS_MASK              (0xFU)\r\n#define USBC_HCSPARAMS_N_PORTS_SHIFT             (0U)\r\n/*! N_PORTS - N_PORTS */\r\n#define USBC_HCSPARAMS_N_PORTS(x)                (((uint32_t)(((uint32_t)(x)) << USBC_HCSPARAMS_N_PORTS_SHIFT)) & USBC_HCSPARAMS_N_PORTS_MASK)\r\n\r\n#define USBC_HCSPARAMS_PPC_MASK                  (0x10U)\r\n#define USBC_HCSPARAMS_PPC_SHIFT                 (4U)\r\n/*! PPC - PPC */\r\n#define USBC_HCSPARAMS_PPC(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_HCSPARAMS_PPC_SHIFT)) & USBC_HCSPARAMS_PPC_MASK)\r\n\r\n#define USBC_HCSPARAMS_UNUSED_5_MASK             (0xE0U)\r\n#define USBC_HCSPARAMS_UNUSED_5_SHIFT            (5U)\r\n/*! UNUSED_5 - UNUSED_5 */\r\n#define USBC_HCSPARAMS_UNUSED_5(x)               (((uint32_t)(((uint32_t)(x)) << USBC_HCSPARAMS_UNUSED_5_SHIFT)) & USBC_HCSPARAMS_UNUSED_5_MASK)\r\n\r\n#define USBC_HCSPARAMS_N_PCC_MASK                (0xF00U)\r\n#define USBC_HCSPARAMS_N_PCC_SHIFT               (8U)\r\n/*! N_PCC - N_PCC */\r\n#define USBC_HCSPARAMS_N_PCC(x)                  (((uint32_t)(((uint32_t)(x)) << USBC_HCSPARAMS_N_PCC_SHIFT)) & USBC_HCSPARAMS_N_PCC_MASK)\r\n\r\n#define USBC_HCSPARAMS_N_CC_MASK                 (0xF000U)\r\n#define USBC_HCSPARAMS_N_CC_SHIFT                (12U)\r\n/*! N_CC - N_CC */\r\n#define USBC_HCSPARAMS_N_CC(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_HCSPARAMS_N_CC_SHIFT)) & USBC_HCSPARAMS_N_CC_MASK)\r\n\r\n#define USBC_HCSPARAMS_PI_MASK                   (0x10000U)\r\n#define USBC_HCSPARAMS_PI_SHIFT                  (16U)\r\n/*! PI - PI */\r\n#define USBC_HCSPARAMS_PI(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_HCSPARAMS_PI_SHIFT)) & USBC_HCSPARAMS_PI_MASK)\r\n\r\n#define USBC_HCSPARAMS_UNUSED_17_MASK            (0xE0000U)\r\n#define USBC_HCSPARAMS_UNUSED_17_SHIFT           (17U)\r\n/*! UNUSED_17 - UNUSED_17 */\r\n#define USBC_HCSPARAMS_UNUSED_17(x)              (((uint32_t)(((uint32_t)(x)) << USBC_HCSPARAMS_UNUSED_17_SHIFT)) & USBC_HCSPARAMS_UNUSED_17_MASK)\r\n\r\n#define USBC_HCSPARAMS_N_PTT_MASK                (0xF00000U)\r\n#define USBC_HCSPARAMS_N_PTT_SHIFT               (20U)\r\n/*! N_PTT - N_PTT */\r\n#define USBC_HCSPARAMS_N_PTT(x)                  (((uint32_t)(((uint32_t)(x)) << USBC_HCSPARAMS_N_PTT_SHIFT)) & USBC_HCSPARAMS_N_PTT_MASK)\r\n\r\n#define USBC_HCSPARAMS_N_TT_MASK                 (0xF000000U)\r\n#define USBC_HCSPARAMS_N_TT_SHIFT                (24U)\r\n/*! N_TT - N_TT */\r\n#define USBC_HCSPARAMS_N_TT(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_HCSPARAMS_N_TT_SHIFT)) & USBC_HCSPARAMS_N_TT_MASK)\r\n\r\n#define USBC_HCSPARAMS_UNUSED_28_MASK            (0xF0000000U)\r\n#define USBC_HCSPARAMS_UNUSED_28_SHIFT           (28U)\r\n/*! UNUSED_28 - UNUSED_28 */\r\n#define USBC_HCSPARAMS_UNUSED_28(x)              (((uint32_t)(((uint32_t)(x)) << USBC_HCSPARAMS_UNUSED_28_SHIFT)) & USBC_HCSPARAMS_UNUSED_28_MASK)\r\n/*! @} */\r\n\r\n/*! @name HCCPARAMS - HCCPARAMS */\r\n/*! @{ */\r\n\r\n#define USBC_HCCPARAMS_ADC_MASK                  (0x1U)\r\n#define USBC_HCCPARAMS_ADC_SHIFT                 (0U)\r\n/*! ADC - ADC */\r\n#define USBC_HCCPARAMS_ADC(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_HCCPARAMS_ADC_SHIFT)) & USBC_HCCPARAMS_ADC_MASK)\r\n\r\n#define USBC_HCCPARAMS_PFL_MASK                  (0x2U)\r\n#define USBC_HCCPARAMS_PFL_SHIFT                 (1U)\r\n/*! PFL - PFL */\r\n#define USBC_HCCPARAMS_PFL(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_HCCPARAMS_PFL_SHIFT)) & USBC_HCCPARAMS_PFL_MASK)\r\n\r\n#define USBC_HCCPARAMS_ASP_MASK                  (0x4U)\r\n#define USBC_HCCPARAMS_ASP_SHIFT                 (2U)\r\n/*! ASP - ASP */\r\n#define USBC_HCCPARAMS_ASP(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_HCCPARAMS_ASP_SHIFT)) & USBC_HCCPARAMS_ASP_MASK)\r\n\r\n#define USBC_HCCPARAMS_UNUSED_3_MASK             (0x8U)\r\n#define USBC_HCCPARAMS_UNUSED_3_SHIFT            (3U)\r\n/*! UNUSED_3 - UNUSED_3 */\r\n#define USBC_HCCPARAMS_UNUSED_3(x)               (((uint32_t)(((uint32_t)(x)) << USBC_HCCPARAMS_UNUSED_3_SHIFT)) & USBC_HCCPARAMS_UNUSED_3_MASK)\r\n\r\n#define USBC_HCCPARAMS_IST_MASK                  (0xF0U)\r\n#define USBC_HCCPARAMS_IST_SHIFT                 (4U)\r\n/*! IST - IST */\r\n#define USBC_HCCPARAMS_IST(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_HCCPARAMS_IST_SHIFT)) & USBC_HCCPARAMS_IST_MASK)\r\n\r\n#define USBC_HCCPARAMS_EECP_MASK                 (0xFF00U)\r\n#define USBC_HCCPARAMS_EECP_SHIFT                (8U)\r\n/*! EECP - EECP */\r\n#define USBC_HCCPARAMS_EECP(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_HCCPARAMS_EECP_SHIFT)) & USBC_HCCPARAMS_EECP_MASK)\r\n\r\n#define USBC_HCCPARAMS_UNUSED_16_MASK            (0xFFFF0000U)\r\n#define USBC_HCCPARAMS_UNUSED_16_SHIFT           (16U)\r\n/*! UNUSED_16 - UNUSED_16 */\r\n#define USBC_HCCPARAMS_UNUSED_16(x)              (((uint32_t)(((uint32_t)(x)) << USBC_HCCPARAMS_UNUSED_16_SHIFT)) & USBC_HCCPARAMS_UNUSED_16_MASK)\r\n/*! @} */\r\n\r\n/*! @name DCIVERSION - DCIVERSION */\r\n/*! @{ */\r\n\r\n#define USBC_DCIVERSION_DCIVERSION_MASK          (0xFFFFU)\r\n#define USBC_DCIVERSION_DCIVERSION_SHIFT         (0U)\r\n/*! DCIVERSION - DCIVERSION */\r\n#define USBC_DCIVERSION_DCIVERSION(x)            (((uint32_t)(((uint32_t)(x)) << USBC_DCIVERSION_DCIVERSION_SHIFT)) & USBC_DCIVERSION_DCIVERSION_MASK)\r\n\r\n#define USBC_DCIVERSION_UNUSED_16_MASK           (0xFFFF0000U)\r\n#define USBC_DCIVERSION_UNUSED_16_SHIFT          (16U)\r\n/*! UNUSED_16 - UNUSED_16 */\r\n#define USBC_DCIVERSION_UNUSED_16(x)             (((uint32_t)(((uint32_t)(x)) << USBC_DCIVERSION_UNUSED_16_SHIFT)) & USBC_DCIVERSION_UNUSED_16_MASK)\r\n/*! @} */\r\n\r\n/*! @name DCCPARAMS - DCCPARAMS */\r\n/*! @{ */\r\n\r\n#define USBC_DCCPARAMS_DEN_MASK                  (0x1FU)\r\n#define USBC_DCCPARAMS_DEN_SHIFT                 (0U)\r\n/*! DEN - DEN */\r\n#define USBC_DCCPARAMS_DEN(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_DCCPARAMS_DEN_SHIFT)) & USBC_DCCPARAMS_DEN_MASK)\r\n\r\n#define USBC_DCCPARAMS_UNUSED_5_MASK             (0x60U)\r\n#define USBC_DCCPARAMS_UNUSED_5_SHIFT            (5U)\r\n/*! UNUSED_5 - UNUSED_5 */\r\n#define USBC_DCCPARAMS_UNUSED_5(x)               (((uint32_t)(((uint32_t)(x)) << USBC_DCCPARAMS_UNUSED_5_SHIFT)) & USBC_DCCPARAMS_UNUSED_5_MASK)\r\n\r\n#define USBC_DCCPARAMS_DC_MASK                   (0x80U)\r\n#define USBC_DCCPARAMS_DC_SHIFT                  (7U)\r\n/*! DC - DC */\r\n#define USBC_DCCPARAMS_DC(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_DCCPARAMS_DC_SHIFT)) & USBC_DCCPARAMS_DC_MASK)\r\n\r\n#define USBC_DCCPARAMS_HC_MASK                   (0x100U)\r\n#define USBC_DCCPARAMS_HC_SHIFT                  (8U)\r\n/*! HC - HC */\r\n#define USBC_DCCPARAMS_HC(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_DCCPARAMS_HC_SHIFT)) & USBC_DCCPARAMS_HC_MASK)\r\n\r\n#define USBC_DCCPARAMS_UNUSED_9_MASK             (0x7FFFFE00U)\r\n#define USBC_DCCPARAMS_UNUSED_9_SHIFT            (9U)\r\n/*! UNUSED_9 - UNUSED_9 */\r\n#define USBC_DCCPARAMS_UNUSED_9(x)               (((uint32_t)(((uint32_t)(x)) << USBC_DCCPARAMS_UNUSED_9_SHIFT)) & USBC_DCCPARAMS_UNUSED_9_MASK)\r\n\r\n#define USBC_DCCPARAMS_LPM_EN_MASK               (0x80000000U)\r\n#define USBC_DCCPARAMS_LPM_EN_SHIFT              (31U)\r\n/*! LPM_EN - LPM_EN */\r\n#define USBC_DCCPARAMS_LPM_EN(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_DCCPARAMS_LPM_EN_SHIFT)) & USBC_DCCPARAMS_LPM_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name DEVLPMCSR - DevLPMCSR */\r\n/*! @{ */\r\n\r\n#define USBC_DEVLPMCSR_INT_L1RSM_MASK            (0x1U)\r\n#define USBC_DEVLPMCSR_INT_L1RSM_SHIFT           (0U)\r\n/*! INT_L1RSM - INT_L1RSM */\r\n#define USBC_DEVLPMCSR_INT_L1RSM(x)              (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_INT_L1RSM_SHIFT)) & USBC_DEVLPMCSR_INT_L1RSM_MASK)\r\n\r\n#define USBC_DEVLPMCSR_INT_LPMPKT_MASK           (0x2U)\r\n#define USBC_DEVLPMCSR_INT_LPMPKT_SHIFT          (1U)\r\n/*! INT_LPMPKT - INT_LPMPKT */\r\n#define USBC_DEVLPMCSR_INT_LPMPKT(x)             (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_INT_LPMPKT_SHIFT)) & USBC_DEVLPMCSR_INT_LPMPKT_MASK)\r\n\r\n#define USBC_DEVLPMCSR_INT_LPMACK_MASK           (0x4U)\r\n#define USBC_DEVLPMCSR_INT_LPMACK_SHIFT          (2U)\r\n/*! INT_LPMACK - INT_LPMACK */\r\n#define USBC_DEVLPMCSR_INT_LPMACK(x)             (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_INT_LPMACK_SHIFT)) & USBC_DEVLPMCSR_INT_LPMACK_MASK)\r\n\r\n#define USBC_DEVLPMCSR_INT_LPMERR_MASK           (0x8U)\r\n#define USBC_DEVLPMCSR_INT_LPMERR_SHIFT          (3U)\r\n/*! INT_LPMERR - INT_LPMERR */\r\n#define USBC_DEVLPMCSR_INT_LPMERR(x)             (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_INT_LPMERR_SHIFT)) & USBC_DEVLPMCSR_INT_LPMERR_MASK)\r\n\r\n#define USBC_DEVLPMCSR_IE_L1RSM_MASK             (0x10U)\r\n#define USBC_DEVLPMCSR_IE_L1RSM_SHIFT            (4U)\r\n/*! IE_L1RSM - IE_L1RSM */\r\n#define USBC_DEVLPMCSR_IE_L1RSM(x)               (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_IE_L1RSM_SHIFT)) & USBC_DEVLPMCSR_IE_L1RSM_MASK)\r\n\r\n#define USBC_DEVLPMCSR_IE_LPMPKT_MASK            (0x20U)\r\n#define USBC_DEVLPMCSR_IE_LPMPKT_SHIFT           (5U)\r\n/*! IE_LPMPKT - IE_LPMPKT */\r\n#define USBC_DEVLPMCSR_IE_LPMPKT(x)              (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_IE_LPMPKT_SHIFT)) & USBC_DEVLPMCSR_IE_LPMPKT_MASK)\r\n\r\n#define USBC_DEVLPMCSR_IE_LPMACK_MASK            (0x40U)\r\n#define USBC_DEVLPMCSR_IE_LPMACK_SHIFT           (6U)\r\n/*! IE_LPMACK - IE_LPMACK */\r\n#define USBC_DEVLPMCSR_IE_LPMACK(x)              (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_IE_LPMACK_SHIFT)) & USBC_DEVLPMCSR_IE_LPMACK_MASK)\r\n\r\n#define USBC_DEVLPMCSR_IE_LPMERR_MASK            (0x80U)\r\n#define USBC_DEVLPMCSR_IE_LPMERR_SHIFT           (7U)\r\n/*! IE_LPMERR - IE_LPMERR */\r\n#define USBC_DEVLPMCSR_IE_LPMERR(x)              (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_IE_LPMERR_SHIFT)) & USBC_DEVLPMCSR_IE_LPMERR_MASK)\r\n\r\n#define USBC_DEVLPMCSR_RWAKE_EN_MASK             (0x100U)\r\n#define USBC_DEVLPMCSR_RWAKE_EN_SHIFT            (8U)\r\n/*! RWAKE_EN - RWAKE_EN */\r\n#define USBC_DEVLPMCSR_RWAKE_EN(x)               (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_RWAKE_EN_SHIFT)) & USBC_DEVLPMCSR_RWAKE_EN_MASK)\r\n\r\n#define USBC_DEVLPMCSR_L1STATE_MASK              (0x200U)\r\n#define USBC_DEVLPMCSR_L1STATE_SHIFT             (9U)\r\n/*! L1STATE - L1STATE */\r\n#define USBC_DEVLPMCSR_L1STATE(x)                (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_L1STATE_SHIFT)) & USBC_DEVLPMCSR_L1STATE_MASK)\r\n\r\n#define USBC_DEVLPMCSR_IE_L1STATE_MASK           (0x400U)\r\n#define USBC_DEVLPMCSR_IE_L1STATE_SHIFT          (10U)\r\n/*! IE_L1STATE - IE_L1STATE */\r\n#define USBC_DEVLPMCSR_IE_L1STATE(x)             (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_IE_L1STATE_SHIFT)) & USBC_DEVLPMCSR_IE_L1STATE_MASK)\r\n\r\n#define USBC_DEVLPMCSR_ACK_OK_MASK               (0x800U)\r\n#define USBC_DEVLPMCSR_ACK_OK_SHIFT              (11U)\r\n/*! ACK_OK - ACK_OK */\r\n#define USBC_DEVLPMCSR_ACK_OK(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_ACK_OK_SHIFT)) & USBC_DEVLPMCSR_ACK_OK_MASK)\r\n\r\n#define USBC_DEVLPMCSR_STALL_OK_MASK             (0x1000U)\r\n#define USBC_DEVLPMCSR_STALL_OK_SHIFT            (12U)\r\n/*! STALL_OK - STALL_OK */\r\n#define USBC_DEVLPMCSR_STALL_OK(x)               (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_STALL_OK_SHIFT)) & USBC_DEVLPMCSR_STALL_OK_MASK)\r\n\r\n#define USBC_DEVLPMCSR_MIN_SLP_EN_MASK           (0x2000U)\r\n#define USBC_DEVLPMCSR_MIN_SLP_EN_SHIFT          (13U)\r\n/*! MIN_SLP_EN - MIN_SLP_EN */\r\n#define USBC_DEVLPMCSR_MIN_SLP_EN(x)             (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_MIN_SLP_EN_SHIFT)) & USBC_DEVLPMCSR_MIN_SLP_EN_MASK)\r\n\r\n#define USBC_DEVLPMCSR_ALWAYS_LOG_MASK           (0x4000U)\r\n#define USBC_DEVLPMCSR_ALWAYS_LOG_SHIFT          (14U)\r\n/*! ALWAYS_LOG - ALWAYS_LOG */\r\n#define USBC_DEVLPMCSR_ALWAYS_LOG(x)             (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_ALWAYS_LOG_SHIFT)) & USBC_DEVLPMCSR_ALWAYS_LOG_MASK)\r\n\r\n#define USBC_DEVLPMCSR_LPM_ON_MASK               (0x8000U)\r\n#define USBC_DEVLPMCSR_LPM_ON_SHIFT              (15U)\r\n/*! LPM_ON - LPM_ON */\r\n#define USBC_DEVLPMCSR_LPM_ON(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_LPM_ON_SHIFT)) & USBC_DEVLPMCSR_LPM_ON_MASK)\r\n\r\n#define USBC_DEVLPMCSR_HST_RSM_EN_MASK           (0x10000U)\r\n#define USBC_DEVLPMCSR_HST_RSM_EN_SHIFT          (16U)\r\n/*! HST_RSM_EN - HST_RSM_EN */\r\n#define USBC_DEVLPMCSR_HST_RSM_EN(x)             (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_HST_RSM_EN_SHIFT)) & USBC_DEVLPMCSR_HST_RSM_EN_MASK)\r\n\r\n#define USBC_DEVLPMCSR_LPM_ANY_EP_MASK           (0x20000U)\r\n#define USBC_DEVLPMCSR_LPM_ANY_EP_SHIFT          (17U)\r\n/*! LPM_ANY_EP - LPM_ANY_EP */\r\n#define USBC_DEVLPMCSR_LPM_ANY_EP(x)             (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_LPM_ANY_EP_SHIFT)) & USBC_DEVLPMCSR_LPM_ANY_EP_MASK)\r\n\r\n#define USBC_DEVLPMCSR_UNUSED_18_MASK            (0xC0000U)\r\n#define USBC_DEVLPMCSR_UNUSED_18_SHIFT           (18U)\r\n/*! UNUSED_18 - UNUSED_18 */\r\n#define USBC_DEVLPMCSR_UNUSED_18(x)              (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_UNUSED_18_SHIFT)) & USBC_DEVLPMCSR_UNUSED_18_MASK)\r\n\r\n#define USBC_DEVLPMCSR_HIRD_MASK                 (0xF00000U)\r\n#define USBC_DEVLPMCSR_HIRD_SHIFT                (20U)\r\n/*! HIRD - HIRD */\r\n#define USBC_DEVLPMCSR_HIRD(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_HIRD_SHIFT)) & USBC_DEVLPMCSR_HIRD_MASK)\r\n\r\n#define USBC_DEVLPMCSR_LINKSTATE_MASK            (0xF000000U)\r\n#define USBC_DEVLPMCSR_LINKSTATE_SHIFT           (24U)\r\n/*! LINKSTATE - LINKSTATE */\r\n#define USBC_DEVLPMCSR_LINKSTATE(x)              (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_LINKSTATE_SHIFT)) & USBC_DEVLPMCSR_LINKSTATE_MASK)\r\n\r\n#define USBC_DEVLPMCSR_BRMTWAKE_MASK             (0x10000000U)\r\n#define USBC_DEVLPMCSR_BRMTWAKE_SHIFT            (28U)\r\n/*! BRMTWAKE - BRMTWAKE */\r\n#define USBC_DEVLPMCSR_BRMTWAKE(x)               (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_BRMTWAKE_SHIFT)) & USBC_DEVLPMCSR_BRMTWAKE_MASK)\r\n\r\n#define USBC_DEVLPMCSR_LPM_PHCD_ONLY_MASK        (0x20000000U)\r\n#define USBC_DEVLPMCSR_LPM_PHCD_ONLY_SHIFT       (29U)\r\n/*! LPM_PHCD_ONLY - LPM_PHCD_only */\r\n#define USBC_DEVLPMCSR_LPM_PHCD_ONLY(x)          (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_LPM_PHCD_ONLY_SHIFT)) & USBC_DEVLPMCSR_LPM_PHCD_ONLY_MASK)\r\n\r\n#define USBC_DEVLPMCSR_LPM_RSP_MASK              (0xC0000000U)\r\n#define USBC_DEVLPMCSR_LPM_RSP_SHIFT             (30U)\r\n/*! LPM_RSP - LPM_RSP */\r\n#define USBC_DEVLPMCSR_LPM_RSP(x)                (((uint32_t)(((uint32_t)(x)) << USBC_DEVLPMCSR_LPM_RSP_SHIFT)) & USBC_DEVLPMCSR_LPM_RSP_MASK)\r\n/*! @} */\r\n\r\n/*! @name USBCMD - USBCMD */\r\n/*! @{ */\r\n\r\n#define USBC_USBCMD_RS_MASK                      (0x1U)\r\n#define USBC_USBCMD_RS_SHIFT                     (0U)\r\n/*! RS - RS */\r\n#define USBC_USBCMD_RS(x)                        (((uint32_t)(((uint32_t)(x)) << USBC_USBCMD_RS_SHIFT)) & USBC_USBCMD_RS_MASK)\r\n\r\n#define USBC_USBCMD_RST_MASK                     (0x2U)\r\n#define USBC_USBCMD_RST_SHIFT                    (1U)\r\n/*! RST - RST */\r\n#define USBC_USBCMD_RST(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBCMD_RST_SHIFT)) & USBC_USBCMD_RST_MASK)\r\n\r\n#define USBC_USBCMD_FS0_MASK                     (0x4U)\r\n#define USBC_USBCMD_FS0_SHIFT                    (2U)\r\n/*! FS0 - HOST only */\r\n#define USBC_USBCMD_FS0(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBCMD_FS0_SHIFT)) & USBC_USBCMD_FS0_MASK)\r\n\r\n#define USBC_USBCMD_FS1_MASK                     (0x8U)\r\n#define USBC_USBCMD_FS1_SHIFT                    (3U)\r\n/*! FS1 - HOST only */\r\n#define USBC_USBCMD_FS1(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBCMD_FS1_SHIFT)) & USBC_USBCMD_FS1_MASK)\r\n\r\n#define USBC_USBCMD_PSE_MASK                     (0x10U)\r\n#define USBC_USBCMD_PSE_SHIFT                    (4U)\r\n/*! PSE - HOST only */\r\n#define USBC_USBCMD_PSE(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBCMD_PSE_SHIFT)) & USBC_USBCMD_PSE_MASK)\r\n\r\n#define USBC_USBCMD_ASE_MASK                     (0x20U)\r\n#define USBC_USBCMD_ASE_SHIFT                    (5U)\r\n/*! ASE - HOST only */\r\n#define USBC_USBCMD_ASE(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBCMD_ASE_SHIFT)) & USBC_USBCMD_ASE_MASK)\r\n\r\n#define USBC_USBCMD_IAA_MASK                     (0x40U)\r\n#define USBC_USBCMD_IAA_SHIFT                    (6U)\r\n/*! IAA - HOST only */\r\n#define USBC_USBCMD_IAA(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBCMD_IAA_SHIFT)) & USBC_USBCMD_IAA_MASK)\r\n\r\n#define USBC_USBCMD_LR_MASK                      (0x80U)\r\n#define USBC_USBCMD_LR_SHIFT                     (7U)\r\n/*! LR - LR */\r\n#define USBC_USBCMD_LR(x)                        (((uint32_t)(((uint32_t)(x)) << USBC_USBCMD_LR_SHIFT)) & USBC_USBCMD_LR_MASK)\r\n\r\n#define USBC_USBCMD_ASP0_MASK                    (0x100U)\r\n#define USBC_USBCMD_ASP0_SHIFT                   (8U)\r\n/*! ASP0 - HOST only */\r\n#define USBC_USBCMD_ASP0(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_USBCMD_ASP0_SHIFT)) & USBC_USBCMD_ASP0_MASK)\r\n\r\n#define USBC_USBCMD_ASP1_MASK                    (0x200U)\r\n#define USBC_USBCMD_ASP1_SHIFT                   (9U)\r\n/*! ASP1 - HOST only */\r\n#define USBC_USBCMD_ASP1(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_USBCMD_ASP1_SHIFT)) & USBC_USBCMD_ASP1_MASK)\r\n\r\n#define USBC_USBCMD_UNUSED_10_MASK               (0x400U)\r\n#define USBC_USBCMD_UNUSED_10_SHIFT              (10U)\r\n/*! UNUSED_10 - UNUSED_10 */\r\n#define USBC_USBCMD_UNUSED_10(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_USBCMD_UNUSED_10_SHIFT)) & USBC_USBCMD_UNUSED_10_MASK)\r\n\r\n#define USBC_USBCMD_ASPE_MASK                    (0x800U)\r\n#define USBC_USBCMD_ASPE_SHIFT                   (11U)\r\n/*! ASPE - HOST only */\r\n#define USBC_USBCMD_ASPE(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_USBCMD_ASPE_SHIFT)) & USBC_USBCMD_ASPE_MASK)\r\n\r\n#define USBC_USBCMD_UNUSED_12_MASK               (0x1000U)\r\n#define USBC_USBCMD_UNUSED_12_SHIFT              (12U)\r\n/*! UNUSED_12 - UNUSED_12 */\r\n#define USBC_USBCMD_UNUSED_12(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_USBCMD_UNUSED_12_SHIFT)) & USBC_USBCMD_UNUSED_12_MASK)\r\n\r\n#define USBC_USBCMD_SUTW_MASK                    (0x2000U)\r\n#define USBC_USBCMD_SUTW_SHIFT                   (13U)\r\n/*! SUTW - SUTW */\r\n#define USBC_USBCMD_SUTW(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_USBCMD_SUTW_SHIFT)) & USBC_USBCMD_SUTW_MASK)\r\n\r\n#define USBC_USBCMD_ATDTW_MASK                   (0x4000U)\r\n#define USBC_USBCMD_ATDTW_SHIFT                  (14U)\r\n/*! ATDTW - ATDTW */\r\n#define USBC_USBCMD_ATDTW(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_USBCMD_ATDTW_SHIFT)) & USBC_USBCMD_ATDTW_MASK)\r\n\r\n#define USBC_USBCMD_FS2_MASK                     (0x8000U)\r\n#define USBC_USBCMD_FS2_SHIFT                    (15U)\r\n/*! FS2 - HOST only */\r\n#define USBC_USBCMD_FS2(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBCMD_FS2_SHIFT)) & USBC_USBCMD_FS2_MASK)\r\n\r\n#define USBC_USBCMD_ITC_MASK                     (0xFF0000U)\r\n#define USBC_USBCMD_ITC_SHIFT                    (16U)\r\n/*! ITC - ITC */\r\n#define USBC_USBCMD_ITC(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBCMD_ITC_SHIFT)) & USBC_USBCMD_ITC_MASK)\r\n\r\n#define USBC_USBCMD_UNUSED_24_MASK               (0xFF000000U)\r\n#define USBC_USBCMD_UNUSED_24_SHIFT              (24U)\r\n/*! UNUSED_24 - UNUSED_24 */\r\n#define USBC_USBCMD_UNUSED_24(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_USBCMD_UNUSED_24_SHIFT)) & USBC_USBCMD_UNUSED_24_MASK)\r\n/*! @} */\r\n\r\n/*! @name USBSTS - USBSTS */\r\n/*! @{ */\r\n\r\n#define USBC_USBSTS_UI_MASK                      (0x1U)\r\n#define USBC_USBSTS_UI_SHIFT                     (0U)\r\n/*! UI - rwc */\r\n#define USBC_USBSTS_UI(x)                        (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_UI_SHIFT)) & USBC_USBSTS_UI_MASK)\r\n\r\n#define USBC_USBSTS_UEI_MASK                     (0x2U)\r\n#define USBC_USBSTS_UEI_SHIFT                    (1U)\r\n/*! UEI - rwc */\r\n#define USBC_USBSTS_UEI(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_UEI_SHIFT)) & USBC_USBSTS_UEI_MASK)\r\n\r\n#define USBC_USBSTS_PCI_MASK                     (0x4U)\r\n#define USBC_USBSTS_PCI_SHIFT                    (2U)\r\n/*! PCI - rwc */\r\n#define USBC_USBSTS_PCI(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_PCI_SHIFT)) & USBC_USBSTS_PCI_MASK)\r\n\r\n#define USBC_USBSTS_FRI_MASK                     (0x8U)\r\n#define USBC_USBSTS_FRI_SHIFT                    (3U)\r\n/*! FRI - rwc */\r\n#define USBC_USBSTS_FRI(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_FRI_SHIFT)) & USBC_USBSTS_FRI_MASK)\r\n\r\n#define USBC_USBSTS_SEI_MASK                     (0x10U)\r\n#define USBC_USBSTS_SEI_SHIFT                    (4U)\r\n/*! SEI - rwc */\r\n#define USBC_USBSTS_SEI(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_SEI_SHIFT)) & USBC_USBSTS_SEI_MASK)\r\n\r\n#define USBC_USBSTS_AAI_MASK                     (0x20U)\r\n#define USBC_USBSTS_AAI_SHIFT                    (5U)\r\n/*! AAI - rwc */\r\n#define USBC_USBSTS_AAI(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_AAI_SHIFT)) & USBC_USBSTS_AAI_MASK)\r\n\r\n#define USBC_USBSTS_URI_MASK                     (0x40U)\r\n#define USBC_USBSTS_URI_SHIFT                    (6U)\r\n/*! URI - rwc */\r\n#define USBC_USBSTS_URI(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_URI_SHIFT)) & USBC_USBSTS_URI_MASK)\r\n\r\n#define USBC_USBSTS_SRI_MASK                     (0x80U)\r\n#define USBC_USBSTS_SRI_SHIFT                    (7U)\r\n/*! SRI - rwc */\r\n#define USBC_USBSTS_SRI(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_SRI_SHIFT)) & USBC_USBSTS_SRI_MASK)\r\n\r\n#define USBC_USBSTS_SLI_MASK                     (0x100U)\r\n#define USBC_USBSTS_SLI_SHIFT                    (8U)\r\n/*! SLI - rwc */\r\n#define USBC_USBSTS_SLI(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_SLI_SHIFT)) & USBC_USBSTS_SLI_MASK)\r\n\r\n#define USBC_USBSTS_UNUSED_9_MASK                (0x200U)\r\n#define USBC_USBSTS_UNUSED_9_SHIFT               (9U)\r\n/*! UNUSED_9 - UNUSED_9 */\r\n#define USBC_USBSTS_UNUSED_9(x)                  (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_UNUSED_9_SHIFT)) & USBC_USBSTS_UNUSED_9_MASK)\r\n\r\n#define USBC_USBSTS_ULPII_MASK                   (0x400U)\r\n#define USBC_USBSTS_ULPII_SHIFT                  (10U)\r\n/*! ULPII - rwc */\r\n#define USBC_USBSTS_ULPII(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_ULPII_SHIFT)) & USBC_USBSTS_ULPII_MASK)\r\n\r\n#define USBC_USBSTS_UNUSED_11_MASK               (0x800U)\r\n#define USBC_USBSTS_UNUSED_11_SHIFT              (11U)\r\n/*! UNUSED_11 - UNUSED_11 */\r\n#define USBC_USBSTS_UNUSED_11(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_UNUSED_11_SHIFT)) & USBC_USBSTS_UNUSED_11_MASK)\r\n\r\n#define USBC_USBSTS_HCH_MASK                     (0x1000U)\r\n#define USBC_USBSTS_HCH_SHIFT                    (12U)\r\n/*! HCH - HOST only */\r\n#define USBC_USBSTS_HCH(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_HCH_SHIFT)) & USBC_USBSTS_HCH_MASK)\r\n\r\n#define USBC_USBSTS_RCL_MASK                     (0x2000U)\r\n#define USBC_USBSTS_RCL_SHIFT                    (13U)\r\n/*! RCL - RCL */\r\n#define USBC_USBSTS_RCL(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_RCL_SHIFT)) & USBC_USBSTS_RCL_MASK)\r\n\r\n#define USBC_USBSTS_PS_MASK                      (0x4000U)\r\n#define USBC_USBSTS_PS_SHIFT                     (14U)\r\n/*! PS - PS */\r\n#define USBC_USBSTS_PS(x)                        (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_PS_SHIFT)) & USBC_USBSTS_PS_MASK)\r\n\r\n#define USBC_USBSTS_AS_MASK                      (0x8000U)\r\n#define USBC_USBSTS_AS_SHIFT                     (15U)\r\n/*! AS - AS */\r\n#define USBC_USBSTS_AS(x)                        (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_AS_SHIFT)) & USBC_USBSTS_AS_MASK)\r\n\r\n#define USBC_USBSTS_NAKI_MASK                    (0x10000U)\r\n#define USBC_USBSTS_NAKI_SHIFT                   (16U)\r\n/*! NAKI - NAKI */\r\n#define USBC_USBSTS_NAKI(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_NAKI_SHIFT)) & USBC_USBSTS_NAKI_MASK)\r\n\r\n#define USBC_USBSTS_UNUSED_17_MASK               (0x20000U)\r\n#define USBC_USBSTS_UNUSED_17_SHIFT              (17U)\r\n/*! UNUSED_17 - UNUSED_17 */\r\n#define USBC_USBSTS_UNUSED_17(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_UNUSED_17_SHIFT)) & USBC_USBSTS_UNUSED_17_MASK)\r\n\r\n#define USBC_USBSTS_UAI_MASK                     (0x40000U)\r\n#define USBC_USBSTS_UAI_SHIFT                    (18U)\r\n/*! UAI - rwc */\r\n#define USBC_USBSTS_UAI(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_UAI_SHIFT)) & USBC_USBSTS_UAI_MASK)\r\n\r\n#define USBC_USBSTS_UPI_MASK                     (0x80000U)\r\n#define USBC_USBSTS_UPI_SHIFT                    (19U)\r\n/*! UPI - rwc */\r\n#define USBC_USBSTS_UPI(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_UPI_SHIFT)) & USBC_USBSTS_UPI_MASK)\r\n\r\n#define USBC_USBSTS_UNUSED_20_MASK               (0xF00000U)\r\n#define USBC_USBSTS_UNUSED_20_SHIFT              (20U)\r\n/*! UNUSED_20 - UNUSED_20 */\r\n#define USBC_USBSTS_UNUSED_20(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_UNUSED_20_SHIFT)) & USBC_USBSTS_UNUSED_20_MASK)\r\n\r\n#define USBC_USBSTS_TI0_MASK                     (0x1000000U)\r\n#define USBC_USBSTS_TI0_SHIFT                    (24U)\r\n/*! TI0 - rwc */\r\n#define USBC_USBSTS_TI0(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_TI0_SHIFT)) & USBC_USBSTS_TI0_MASK)\r\n\r\n#define USBC_USBSTS_TI1_MASK                     (0x2000000U)\r\n#define USBC_USBSTS_TI1_SHIFT                    (25U)\r\n/*! TI1 - rwc */\r\n#define USBC_USBSTS_TI1(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_TI1_SHIFT)) & USBC_USBSTS_TI1_MASK)\r\n\r\n#define USBC_USBSTS_UNUSED_26_MASK               (0xFC000000U)\r\n#define USBC_USBSTS_UNUSED_26_SHIFT              (26U)\r\n/*! UNUSED_26 - UNUSED_26 */\r\n#define USBC_USBSTS_UNUSED_26(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_USBSTS_UNUSED_26_SHIFT)) & USBC_USBSTS_UNUSED_26_MASK)\r\n/*! @} */\r\n\r\n/*! @name USBINTR - USBINTR */\r\n/*! @{ */\r\n\r\n#define USBC_USBINTR_UE_MASK                     (0x1U)\r\n#define USBC_USBINTR_UE_SHIFT                    (0U)\r\n/*! UE - UE */\r\n#define USBC_USBINTR_UE(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_UE_SHIFT)) & USBC_USBINTR_UE_MASK)\r\n\r\n#define USBC_USBINTR_UEE_MASK                    (0x2U)\r\n#define USBC_USBINTR_UEE_SHIFT                   (1U)\r\n/*! UEE - rwc */\r\n#define USBC_USBINTR_UEE(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_UEE_SHIFT)) & USBC_USBINTR_UEE_MASK)\r\n\r\n#define USBC_USBINTR_PCE_MASK                    (0x4U)\r\n#define USBC_USBINTR_PCE_SHIFT                   (2U)\r\n/*! PCE - PCE */\r\n#define USBC_USBINTR_PCE(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_PCE_SHIFT)) & USBC_USBINTR_PCE_MASK)\r\n\r\n#define USBC_USBINTR_FRE_MASK                    (0x8U)\r\n#define USBC_USBINTR_FRE_SHIFT                   (3U)\r\n/*! FRE - HOST only */\r\n#define USBC_USBINTR_FRE(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_FRE_SHIFT)) & USBC_USBINTR_FRE_MASK)\r\n\r\n#define USBC_USBINTR_SEE_MASK                    (0x10U)\r\n#define USBC_USBINTR_SEE_SHIFT                   (4U)\r\n/*! SEE - SEE */\r\n#define USBC_USBINTR_SEE(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_SEE_SHIFT)) & USBC_USBINTR_SEE_MASK)\r\n\r\n#define USBC_USBINTR_AAE_MASK                    (0x20U)\r\n#define USBC_USBINTR_AAE_SHIFT                   (5U)\r\n/*! AAE - HOST only */\r\n#define USBC_USBINTR_AAE(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_AAE_SHIFT)) & USBC_USBINTR_AAE_MASK)\r\n\r\n#define USBC_USBINTR_URE_MASK                    (0x40U)\r\n#define USBC_USBINTR_URE_SHIFT                   (6U)\r\n/*! URE - URE */\r\n#define USBC_USBINTR_URE(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_URE_SHIFT)) & USBC_USBINTR_URE_MASK)\r\n\r\n#define USBC_USBINTR_SRE_MASK                    (0x80U)\r\n#define USBC_USBINTR_SRE_SHIFT                   (7U)\r\n/*! SRE - SRE */\r\n#define USBC_USBINTR_SRE(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_SRE_SHIFT)) & USBC_USBINTR_SRE_MASK)\r\n\r\n#define USBC_USBINTR_SLE_MASK                    (0x100U)\r\n#define USBC_USBINTR_SLE_SHIFT                   (8U)\r\n/*! SLE - SLE */\r\n#define USBC_USBINTR_SLE(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_SLE_SHIFT)) & USBC_USBINTR_SLE_MASK)\r\n\r\n#define USBC_USBINTR_UNUSED_9_MASK               (0x200U)\r\n#define USBC_USBINTR_UNUSED_9_SHIFT              (9U)\r\n/*! UNUSED_9 - UNUSED_9 */\r\n#define USBC_USBINTR_UNUSED_9(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_UNUSED_9_SHIFT)) & USBC_USBINTR_UNUSED_9_MASK)\r\n\r\n#define USBC_USBINTR_ULPE_MASK                   (0x400U)\r\n#define USBC_USBINTR_ULPE_SHIFT                  (10U)\r\n/*! ULPE - ONLY used VUSB_HS_PHY_ULPI =1 */\r\n#define USBC_USBINTR_ULPE(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_ULPE_SHIFT)) & USBC_USBINTR_ULPE_MASK)\r\n\r\n#define USBC_USBINTR_UNUSED_11_MASK              (0x800U)\r\n#define USBC_USBINTR_UNUSED_11_SHIFT             (11U)\r\n/*! UNUSED_11 - UNUSED_11 */\r\n#define USBC_USBINTR_UNUSED_11(x)                (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_UNUSED_11_SHIFT)) & USBC_USBINTR_UNUSED_11_MASK)\r\n\r\n#define USBC_USBINTR_UNUSED_12_MASK              (0x1000U)\r\n#define USBC_USBINTR_UNUSED_12_SHIFT             (12U)\r\n/*! UNUSED_12 - UNUSED_12 */\r\n#define USBC_USBINTR_UNUSED_12(x)                (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_UNUSED_12_SHIFT)) & USBC_USBINTR_UNUSED_12_MASK)\r\n\r\n#define USBC_USBINTR_UNUSED_13_MASK              (0x2000U)\r\n#define USBC_USBINTR_UNUSED_13_SHIFT             (13U)\r\n/*! UNUSED_13 - Not define in DUT,RCL */\r\n#define USBC_USBINTR_UNUSED_13(x)                (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_UNUSED_13_SHIFT)) & USBC_USBINTR_UNUSED_13_MASK)\r\n\r\n#define USBC_USBINTR_UNUSED_14_MASK              (0x4000U)\r\n#define USBC_USBINTR_UNUSED_14_SHIFT             (14U)\r\n/*! UNUSED_14 - Not define in DUT, PS */\r\n#define USBC_USBINTR_UNUSED_14(x)                (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_UNUSED_14_SHIFT)) & USBC_USBINTR_UNUSED_14_MASK)\r\n\r\n#define USBC_USBINTR_UNUSED_15_MASK              (0x8000U)\r\n#define USBC_USBINTR_UNUSED_15_SHIFT             (15U)\r\n/*! UNUSED_15 - Not define in DUT, AS */\r\n#define USBC_USBINTR_UNUSED_15(x)                (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_UNUSED_15_SHIFT)) & USBC_USBINTR_UNUSED_15_MASK)\r\n\r\n#define USBC_USBINTR_NAKE_MASK                   (0x10000U)\r\n#define USBC_USBINTR_NAKE_SHIFT                  (16U)\r\n/*! NAKE - NAKE */\r\n#define USBC_USBINTR_NAKE(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_NAKE_SHIFT)) & USBC_USBINTR_NAKE_MASK)\r\n\r\n#define USBC_USBINTR_UNUSED_17_MASK              (0x20000U)\r\n#define USBC_USBINTR_UNUSED_17_SHIFT             (17U)\r\n/*! UNUSED_17 - UNUSED_17 */\r\n#define USBC_USBINTR_UNUSED_17(x)                (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_UNUSED_17_SHIFT)) & USBC_USBINTR_UNUSED_17_MASK)\r\n\r\n#define USBC_USBINTR_UAE_MASK                    (0x40000U)\r\n#define USBC_USBINTR_UAE_SHIFT                   (18U)\r\n/*! UAE - Not use in Device mode */\r\n#define USBC_USBINTR_UAE(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_UAE_SHIFT)) & USBC_USBINTR_UAE_MASK)\r\n\r\n#define USBC_USBINTR_UPE_MASK                    (0x80000U)\r\n#define USBC_USBINTR_UPE_SHIFT                   (19U)\r\n/*! UPE - Not use in Device mode */\r\n#define USBC_USBINTR_UPE(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_UPE_SHIFT)) & USBC_USBINTR_UPE_MASK)\r\n\r\n#define USBC_USBINTR_UNUSED_20_MASK              (0xF00000U)\r\n#define USBC_USBINTR_UNUSED_20_SHIFT             (20U)\r\n/*! UNUSED_20 - UNUSED_20 */\r\n#define USBC_USBINTR_UNUSED_20(x)                (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_UNUSED_20_SHIFT)) & USBC_USBINTR_UNUSED_20_MASK)\r\n\r\n#define USBC_USBINTR_TIE0_MASK                   (0x1000000U)\r\n#define USBC_USBINTR_TIE0_SHIFT                  (24U)\r\n/*! TIE0 - TIE0 */\r\n#define USBC_USBINTR_TIE0(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_TIE0_SHIFT)) & USBC_USBINTR_TIE0_MASK)\r\n\r\n#define USBC_USBINTR_TIE1_MASK                   (0x2000000U)\r\n#define USBC_USBINTR_TIE1_SHIFT                  (25U)\r\n/*! TIE1 - TIE1 */\r\n#define USBC_USBINTR_TIE1(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_TIE1_SHIFT)) & USBC_USBINTR_TIE1_MASK)\r\n\r\n#define USBC_USBINTR_UNUSED_26_MASK              (0xFC000000U)\r\n#define USBC_USBINTR_UNUSED_26_SHIFT             (26U)\r\n/*! UNUSED_26 - UNUSED_26 */\r\n#define USBC_USBINTR_UNUSED_26(x)                (((uint32_t)(((uint32_t)(x)) << USBC_USBINTR_UNUSED_26_SHIFT)) & USBC_USBINTR_UNUSED_26_MASK)\r\n/*! @} */\r\n\r\n/*! @name FRINDEX - FRINDEX */\r\n/*! @{ */\r\n\r\n#define USBC_FRINDEX_FRINDEX_MASK                (0x3FFFU)\r\n#define USBC_FRINDEX_FRINDEX_SHIFT               (0U)\r\n/*! FRINDEX - device RO, Host RW */\r\n#define USBC_FRINDEX_FRINDEX(x)                  (((uint32_t)(((uint32_t)(x)) << USBC_FRINDEX_FRINDEX_SHIFT)) & USBC_FRINDEX_FRINDEX_MASK)\r\n\r\n#define USBC_FRINDEX_UNUSED_14_MASK              (0xFFFFC000U)\r\n#define USBC_FRINDEX_UNUSED_14_SHIFT             (14U)\r\n/*! UNUSED_14 - UNUSED_14 */\r\n#define USBC_FRINDEX_UNUSED_14(x)                (((uint32_t)(((uint32_t)(x)) << USBC_FRINDEX_UNUSED_14_SHIFT)) & USBC_FRINDEX_UNUSED_14_MASK)\r\n/*! @} */\r\n\r\n/*! @name DEVICEADDR - DEVICEADDR */\r\n/*! @{ */\r\n\r\n#define USBC_DEVICEADDR_UNUSED_0_MASK            (0xFFFFFFU)\r\n#define USBC_DEVICEADDR_UNUSED_0_SHIFT           (0U)\r\n/*! UNUSED_0 - UNUSED_0 */\r\n#define USBC_DEVICEADDR_UNUSED_0(x)              (((uint32_t)(((uint32_t)(x)) << USBC_DEVICEADDR_UNUSED_0_SHIFT)) & USBC_DEVICEADDR_UNUSED_0_MASK)\r\n\r\n#define USBC_DEVICEADDR_USBADRA_MASK             (0x1000000U)\r\n#define USBC_DEVICEADDR_USBADRA_SHIFT            (24U)\r\n/*! USBADRA - USBADRA */\r\n#define USBC_DEVICEADDR_USBADRA(x)               (((uint32_t)(((uint32_t)(x)) << USBC_DEVICEADDR_USBADRA_SHIFT)) & USBC_DEVICEADDR_USBADRA_MASK)\r\n\r\n#define USBC_DEVICEADDR_USBADR_MASK              (0xFE000000U)\r\n#define USBC_DEVICEADDR_USBADR_SHIFT             (25U)\r\n/*! USBADR - USBADR */\r\n#define USBC_DEVICEADDR_USBADR(x)                (((uint32_t)(((uint32_t)(x)) << USBC_DEVICEADDR_USBADR_SHIFT)) & USBC_DEVICEADDR_USBADR_MASK)\r\n/*! @} */\r\n\r\n/*! @name PERIODICLISTBASE - PERIODICLISTBASE */\r\n/*! @{ */\r\n\r\n#define USBC_PERIODICLISTBASE_UNUSED_0_MASK      (0xFFFU)\r\n#define USBC_PERIODICLISTBASE_UNUSED_0_SHIFT     (0U)\r\n/*! UNUSED_0 - UNUSED_0 */\r\n#define USBC_PERIODICLISTBASE_UNUSED_0(x)        (((uint32_t)(((uint32_t)(x)) << USBC_PERIODICLISTBASE_UNUSED_0_SHIFT)) & USBC_PERIODICLISTBASE_UNUSED_0_MASK)\r\n\r\n#define USBC_PERIODICLISTBASE_PERBASE_MASK       (0xFFFFF000U)\r\n#define USBC_PERIODICLISTBASE_PERBASE_SHIFT      (12U)\r\n/*! PERBASE - PERBASE */\r\n#define USBC_PERIODICLISTBASE_PERBASE(x)         (((uint32_t)(((uint32_t)(x)) << USBC_PERIODICLISTBASE_PERBASE_SHIFT)) & USBC_PERIODICLISTBASE_PERBASE_MASK)\r\n/*! @} */\r\n\r\n/*! @name ASYNCLISTADDR - ASYNCLISTADDR */\r\n/*! @{ */\r\n\r\n#define USBC_ASYNCLISTADDR_UNUSED_0_MASK         (0x1FU)\r\n#define USBC_ASYNCLISTADDR_UNUSED_0_SHIFT        (0U)\r\n/*! UNUSED_0 - UNUSED_0 */\r\n#define USBC_ASYNCLISTADDR_UNUSED_0(x)           (((uint32_t)(((uint32_t)(x)) << USBC_ASYNCLISTADDR_UNUSED_0_SHIFT)) & USBC_ASYNCLISTADDR_UNUSED_0_MASK)\r\n\r\n#define USBC_ASYNCLISTADDR_ASYBASE_MASK          (0xFFFFFFE0U)\r\n#define USBC_ASYNCLISTADDR_ASYBASE_SHIFT         (5U)\r\n/*! ASYBASE - ASYBASE */\r\n#define USBC_ASYNCLISTADDR_ASYBASE(x)            (((uint32_t)(((uint32_t)(x)) << USBC_ASYNCLISTADDR_ASYBASE_SHIFT)) & USBC_ASYNCLISTADDR_ASYBASE_MASK)\r\n/*! @} */\r\n\r\n/*! @name ENDPOINTLISTADDR - ENDPOINTLISTADDR */\r\n/*! @{ */\r\n\r\n#define USBC_ENDPOINTLISTADDR_UNUSED_0_MASK      (0x7FFU)\r\n#define USBC_ENDPOINTLISTADDR_UNUSED_0_SHIFT     (0U)\r\n/*! UNUSED_0 - UNUSED_0 */\r\n#define USBC_ENDPOINTLISTADDR_UNUSED_0(x)        (((uint32_t)(((uint32_t)(x)) << USBC_ENDPOINTLISTADDR_UNUSED_0_SHIFT)) & USBC_ENDPOINTLISTADDR_UNUSED_0_MASK)\r\n\r\n#define USBC_ENDPOINTLISTADDR_EPBASE_MASK        (0xFFFFF800U)\r\n#define USBC_ENDPOINTLISTADDR_EPBASE_SHIFT       (11U)\r\n/*! EPBASE - EPBASE */\r\n#define USBC_ENDPOINTLISTADDR_EPBASE(x)          (((uint32_t)(((uint32_t)(x)) << USBC_ENDPOINTLISTADDR_EPBASE_SHIFT)) & USBC_ENDPOINTLISTADDR_EPBASE_MASK)\r\n/*! @} */\r\n\r\n/*! @name TTCTRL - TTCTRL */\r\n/*! @{ */\r\n\r\n#define USBC_TTCTRL_TTAS_MASK                    (0x1U)\r\n#define USBC_TTCTRL_TTAS_SHIFT                   (0U)\r\n/*! TTAS - TTAS */\r\n#define USBC_TTCTRL_TTAS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_TTCTRL_TTAS_SHIFT)) & USBC_TTCTRL_TTAS_MASK)\r\n\r\n#define USBC_TTCTRL_TTAC_MASK                    (0x2U)\r\n#define USBC_TTCTRL_TTAC_SHIFT                   (1U)\r\n/*! TTAC - TTAC */\r\n#define USBC_TTCTRL_TTAC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_TTCTRL_TTAC_SHIFT)) & USBC_TTCTRL_TTAC_MASK)\r\n\r\n#define USBC_TTCTRL_UNUSED_2_MASK                (0xFFFFFCU)\r\n#define USBC_TTCTRL_UNUSED_2_SHIFT               (2U)\r\n/*! UNUSED_2 - UNUSED_2 */\r\n#define USBC_TTCTRL_UNUSED_2(x)                  (((uint32_t)(((uint32_t)(x)) << USBC_TTCTRL_UNUSED_2_SHIFT)) & USBC_TTCTRL_UNUSED_2_MASK)\r\n\r\n#define USBC_TTCTRL_TTHA_MASK                    (0x7F000000U)\r\n#define USBC_TTCTRL_TTHA_SHIFT                   (24U)\r\n/*! TTHA - TTHA */\r\n#define USBC_TTCTRL_TTHA(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_TTCTRL_TTHA_SHIFT)) & USBC_TTCTRL_TTHA_MASK)\r\n\r\n#define USBC_TTCTRL_UNUSED_31_MASK               (0x80000000U)\r\n#define USBC_TTCTRL_UNUSED_31_SHIFT              (31U)\r\n/*! UNUSED_31 - UNUSED_31 */\r\n#define USBC_TTCTRL_UNUSED_31(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_TTCTRL_UNUSED_31_SHIFT)) & USBC_TTCTRL_UNUSED_31_MASK)\r\n/*! @} */\r\n\r\n/*! @name BURSTSIZE - BURSTSIZE */\r\n/*! @{ */\r\n\r\n#define USBC_BURSTSIZE_RXPBURST_MASK             (0xFFU)\r\n#define USBC_BURSTSIZE_RXPBURST_SHIFT            (0U)\r\n/*! RXPBURST - RXPBURST */\r\n#define USBC_BURSTSIZE_RXPBURST(x)               (((uint32_t)(((uint32_t)(x)) << USBC_BURSTSIZE_RXPBURST_SHIFT)) & USBC_BURSTSIZE_RXPBURST_MASK)\r\n\r\n#define USBC_BURSTSIZE_TXPBURST_MASK             (0xFF00U)\r\n#define USBC_BURSTSIZE_TXPBURST_SHIFT            (8U)\r\n/*! TXPBURST - TXPBURST */\r\n#define USBC_BURSTSIZE_TXPBURST(x)               (((uint32_t)(((uint32_t)(x)) << USBC_BURSTSIZE_TXPBURST_SHIFT)) & USBC_BURSTSIZE_TXPBURST_MASK)\r\n\r\n#define USBC_BURSTSIZE_UNUSED_16_MASK            (0xFFFF0000U)\r\n#define USBC_BURSTSIZE_UNUSED_16_SHIFT           (16U)\r\n/*! UNUSED_16 - UNUSED_16 */\r\n#define USBC_BURSTSIZE_UNUSED_16(x)              (((uint32_t)(((uint32_t)(x)) << USBC_BURSTSIZE_UNUSED_16_SHIFT)) & USBC_BURSTSIZE_UNUSED_16_MASK)\r\n/*! @} */\r\n\r\n/*! @name TXFILLTUNING - TXFILLTUNING */\r\n/*! @{ */\r\n\r\n#define USBC_TXFILLTUNING_TXSCHOH_MASK           (0x7FU)\r\n#define USBC_TXFILLTUNING_TXSCHOH_SHIFT          (0U)\r\n/*! TXSCHOH - Only use in HOST & MPH mode */\r\n#define USBC_TXFILLTUNING_TXSCHOH(x)             (((uint32_t)(((uint32_t)(x)) << USBC_TXFILLTUNING_TXSCHOH_SHIFT)) & USBC_TXFILLTUNING_TXSCHOH_MASK)\r\n\r\n#define USBC_TXFILLTUNING_UNUSED_7_MASK          (0x80U)\r\n#define USBC_TXFILLTUNING_UNUSED_7_SHIFT         (7U)\r\n/*! UNUSED_7 - UNUSED_7 */\r\n#define USBC_TXFILLTUNING_UNUSED_7(x)            (((uint32_t)(((uint32_t)(x)) << USBC_TXFILLTUNING_UNUSED_7_SHIFT)) & USBC_TXFILLTUNING_UNUSED_7_MASK)\r\n\r\n#define USBC_TXFILLTUNING_TXSCHHEALTH_MASK       (0x1F00U)\r\n#define USBC_TXFILLTUNING_TXSCHHEALTH_SHIFT      (8U)\r\n/*! TXSCHHEALTH - Only use in HOST & MPH mode, rwc */\r\n#define USBC_TXFILLTUNING_TXSCHHEALTH(x)         (((uint32_t)(((uint32_t)(x)) << USBC_TXFILLTUNING_TXSCHHEALTH_SHIFT)) & USBC_TXFILLTUNING_TXSCHHEALTH_MASK)\r\n\r\n#define USBC_TXFILLTUNING_UNUSED_13_MASK         (0xE000U)\r\n#define USBC_TXFILLTUNING_UNUSED_13_SHIFT        (13U)\r\n/*! UNUSED_13 - UNUSED_13 */\r\n#define USBC_TXFILLTUNING_UNUSED_13(x)           (((uint32_t)(((uint32_t)(x)) << USBC_TXFILLTUNING_UNUSED_13_SHIFT)) & USBC_TXFILLTUNING_UNUSED_13_MASK)\r\n\r\n#define USBC_TXFILLTUNING_TXFIFOTHRES_MASK       (0x3F0000U)\r\n#define USBC_TXFILLTUNING_TXFIFOTHRES_SHIFT      (16U)\r\n/*! TXFIFOTHRES - Only use in HOST & MPH mode */\r\n#define USBC_TXFILLTUNING_TXFIFOTHRES(x)         (((uint32_t)(((uint32_t)(x)) << USBC_TXFILLTUNING_TXFIFOTHRES_SHIFT)) & USBC_TXFILLTUNING_TXFIFOTHRES_MASK)\r\n\r\n#define USBC_TXFILLTUNING_UNUSED_22_MASK         (0xFFC00000U)\r\n#define USBC_TXFILLTUNING_UNUSED_22_SHIFT        (22U)\r\n/*! UNUSED_22 - UNUSED_22 */\r\n#define USBC_TXFILLTUNING_UNUSED_22(x)           (((uint32_t)(((uint32_t)(x)) << USBC_TXFILLTUNING_UNUSED_22_SHIFT)) & USBC_TXFILLTUNING_UNUSED_22_MASK)\r\n/*! @} */\r\n\r\n/*! @name TXTTFILLTUNING - TXTTFILLTUNING */\r\n/*! @{ */\r\n\r\n#define USBC_TXTTFILLTUNING_TXTTSCHOH_MASK       (0x1FU)\r\n#define USBC_TXTTFILLTUNING_TXTTSCHOH_SHIFT      (0U)\r\n/*! TXTTSCHOH - Only use in HOST & MPH mode */\r\n#define USBC_TXTTFILLTUNING_TXTTSCHOH(x)         (((uint32_t)(((uint32_t)(x)) << USBC_TXTTFILLTUNING_TXTTSCHOH_SHIFT)) & USBC_TXTTFILLTUNING_TXTTSCHOH_MASK)\r\n\r\n#define USBC_TXTTFILLTUNING_UNUSED_5_MASK        (0xE0U)\r\n#define USBC_TXTTFILLTUNING_UNUSED_5_SHIFT       (5U)\r\n/*! UNUSED_5 - UNUSED_5 */\r\n#define USBC_TXTTFILLTUNING_UNUSED_5(x)          (((uint32_t)(((uint32_t)(x)) << USBC_TXTTFILLTUNING_UNUSED_5_SHIFT)) & USBC_TXTTFILLTUNING_UNUSED_5_MASK)\r\n\r\n#define USBC_TXTTFILLTUNING_TXTTSCHHEALTJ_MASK   (0x1F00U)\r\n#define USBC_TXTTFILLTUNING_TXTTSCHHEALTJ_SHIFT  (8U)\r\n/*! TXTTSCHHEALTJ - Only use in HOST & MPH mode, rwc */\r\n#define USBC_TXTTFILLTUNING_TXTTSCHHEALTJ(x)     (((uint32_t)(((uint32_t)(x)) << USBC_TXTTFILLTUNING_TXTTSCHHEALTJ_SHIFT)) & USBC_TXTTFILLTUNING_TXTTSCHHEALTJ_MASK)\r\n\r\n#define USBC_TXTTFILLTUNING_UNUSED_13_MASK       (0xFFFFE000U)\r\n#define USBC_TXTTFILLTUNING_UNUSED_13_SHIFT      (13U)\r\n/*! UNUSED_13 - UNUSED_13 */\r\n#define USBC_TXTTFILLTUNING_UNUSED_13(x)         (((uint32_t)(((uint32_t)(x)) << USBC_TXTTFILLTUNING_UNUSED_13_SHIFT)) & USBC_TXTTFILLTUNING_UNUSED_13_MASK)\r\n/*! @} */\r\n\r\n/*! @name IC_USB - IC_USB */\r\n/*! @{ */\r\n\r\n#define USBC_IC_USB_IC_VDD1_MASK                 (0x7U)\r\n#define USBC_IC_USB_IC_VDD1_SHIFT                (0U)\r\n/*! IC_VDD1 - available in MPH & VUSB_HS_PHY_IC_USB =1 */\r\n#define USBC_IC_USB_IC_VDD1(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_IC_USB_IC_VDD1_SHIFT)) & USBC_IC_USB_IC_VDD1_MASK)\r\n\r\n#define USBC_IC_USB_IC1_MASK                     (0x8U)\r\n#define USBC_IC_USB_IC1_SHIFT                    (3U)\r\n/*! IC1 - available in MPH & VUSB_HS_PHY_IC_USB =1 */\r\n#define USBC_IC_USB_IC1(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_IC_USB_IC1_SHIFT)) & USBC_IC_USB_IC1_MASK)\r\n\r\n#define USBC_IC_USB_IC_VDD2_MASK                 (0x70U)\r\n#define USBC_IC_USB_IC_VDD2_SHIFT                (4U)\r\n/*! IC_VDD2 - available in MPH & VUSB_HS_PHY_IC_USB =1 */\r\n#define USBC_IC_USB_IC_VDD2(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_IC_USB_IC_VDD2_SHIFT)) & USBC_IC_USB_IC_VDD2_MASK)\r\n\r\n#define USBC_IC_USB_IC2_MASK                     (0x80U)\r\n#define USBC_IC_USB_IC2_SHIFT                    (7U)\r\n/*! IC2 - available in MPH & VUSB_HS_PHY_IC_USB =1 */\r\n#define USBC_IC_USB_IC2(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_IC_USB_IC2_SHIFT)) & USBC_IC_USB_IC2_MASK)\r\n\r\n#define USBC_IC_USB_IC_VDD3_MASK                 (0x700U)\r\n#define USBC_IC_USB_IC_VDD3_SHIFT                (8U)\r\n/*! IC_VDD3 - available in MPH & VUSB_HS_PHY_IC_USB =1 */\r\n#define USBC_IC_USB_IC_VDD3(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_IC_USB_IC_VDD3_SHIFT)) & USBC_IC_USB_IC_VDD3_MASK)\r\n\r\n#define USBC_IC_USB_IC3_MASK                     (0x800U)\r\n#define USBC_IC_USB_IC3_SHIFT                    (11U)\r\n/*! IC3 - available in MPH & VUSB_HS_PHY_IC_USB =1 */\r\n#define USBC_IC_USB_IC3(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_IC_USB_IC3_SHIFT)) & USBC_IC_USB_IC3_MASK)\r\n\r\n#define USBC_IC_USB_IC_VDD4_MASK                 (0x7000U)\r\n#define USBC_IC_USB_IC_VDD4_SHIFT                (12U)\r\n/*! IC_VDD4 - available in MPH & VUSB_HS_PHY_IC_USB =1 */\r\n#define USBC_IC_USB_IC_VDD4(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_IC_USB_IC_VDD4_SHIFT)) & USBC_IC_USB_IC_VDD4_MASK)\r\n\r\n#define USBC_IC_USB_IC4_MASK                     (0x8000U)\r\n#define USBC_IC_USB_IC4_SHIFT                    (15U)\r\n/*! IC4 - available in MPH & VUSB_HS_PHY_IC_USB =1 */\r\n#define USBC_IC_USB_IC4(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_IC_USB_IC4_SHIFT)) & USBC_IC_USB_IC4_MASK)\r\n\r\n#define USBC_IC_USB_IC_VDD5_MASK                 (0x70000U)\r\n#define USBC_IC_USB_IC_VDD5_SHIFT                (16U)\r\n/*! IC_VDD5 - available in MPH & VUSB_HS_PHY_IC_USB =1 */\r\n#define USBC_IC_USB_IC_VDD5(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_IC_USB_IC_VDD5_SHIFT)) & USBC_IC_USB_IC_VDD5_MASK)\r\n\r\n#define USBC_IC_USB_IC5_MASK                     (0x80000U)\r\n#define USBC_IC_USB_IC5_SHIFT                    (19U)\r\n/*! IC5 - available in MPH & VUSB_HS_PHY_IC_USB =1 */\r\n#define USBC_IC_USB_IC5(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_IC_USB_IC5_SHIFT)) & USBC_IC_USB_IC5_MASK)\r\n\r\n#define USBC_IC_USB_IC_VDD6_MASK                 (0x700000U)\r\n#define USBC_IC_USB_IC_VDD6_SHIFT                (20U)\r\n/*! IC_VDD6 - available in MPH & VUSB_HS_PHY_IC_USB =1 */\r\n#define USBC_IC_USB_IC_VDD6(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_IC_USB_IC_VDD6_SHIFT)) & USBC_IC_USB_IC_VDD6_MASK)\r\n\r\n#define USBC_IC_USB_IC6_MASK                     (0x800000U)\r\n#define USBC_IC_USB_IC6_SHIFT                    (23U)\r\n/*! IC6 - available in MPH & VUSB_HS_PHY_IC_USB =1 */\r\n#define USBC_IC_USB_IC6(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_IC_USB_IC6_SHIFT)) & USBC_IC_USB_IC6_MASK)\r\n\r\n#define USBC_IC_USB_IC_VDD7_MASK                 (0x7000000U)\r\n#define USBC_IC_USB_IC_VDD7_SHIFT                (24U)\r\n/*! IC_VDD7 - available in MPH & VUSB_HS_PHY_IC_USB =1 */\r\n#define USBC_IC_USB_IC_VDD7(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_IC_USB_IC_VDD7_SHIFT)) & USBC_IC_USB_IC_VDD7_MASK)\r\n\r\n#define USBC_IC_USB_IC7_MASK                     (0x8000000U)\r\n#define USBC_IC_USB_IC7_SHIFT                    (27U)\r\n/*! IC7 - available in MPH & VUSB_HS_PHY_IC_USB =1 */\r\n#define USBC_IC_USB_IC7(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_IC_USB_IC7_SHIFT)) & USBC_IC_USB_IC7_MASK)\r\n\r\n#define USBC_IC_USB_IC_VDD8_MASK                 (0x70000000U)\r\n#define USBC_IC_USB_IC_VDD8_SHIFT                (28U)\r\n/*! IC_VDD8 - available in MPH & VUSB_HS_PHY_IC_USB =1 */\r\n#define USBC_IC_USB_IC_VDD8(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_IC_USB_IC_VDD8_SHIFT)) & USBC_IC_USB_IC_VDD8_MASK)\r\n\r\n#define USBC_IC_USB_IC8_MASK                     (0x80000000U)\r\n#define USBC_IC_USB_IC8_SHIFT                    (31U)\r\n/*! IC8 - available in MPH & VUSB_HS_PHY_IC_USB =1 */\r\n#define USBC_IC_USB_IC8(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_IC_USB_IC8_SHIFT)) & USBC_IC_USB_IC8_MASK)\r\n/*! @} */\r\n\r\n/*! @name ULPI_VIEWPORT - ULPI_VIEWPORT */\r\n/*! @{ */\r\n\r\n#define USBC_ULPI_VIEWPORT_ULPIDATWR_MASK        (0xFFU)\r\n#define USBC_ULPI_VIEWPORT_ULPIDATWR_SHIFT       (0U)\r\n/*! ULPIDATWR - Not available */\r\n#define USBC_ULPI_VIEWPORT_ULPIDATWR(x)          (((uint32_t)(((uint32_t)(x)) << USBC_ULPI_VIEWPORT_ULPIDATWR_SHIFT)) & USBC_ULPI_VIEWPORT_ULPIDATWR_MASK)\r\n\r\n#define USBC_ULPI_VIEWPORT_ULPIDATRD_MASK        (0xFF00U)\r\n#define USBC_ULPI_VIEWPORT_ULPIDATRD_SHIFT       (8U)\r\n/*! ULPIDATRD - Not available */\r\n#define USBC_ULPI_VIEWPORT_ULPIDATRD(x)          (((uint32_t)(((uint32_t)(x)) << USBC_ULPI_VIEWPORT_ULPIDATRD_SHIFT)) & USBC_ULPI_VIEWPORT_ULPIDATRD_MASK)\r\n\r\n#define USBC_ULPI_VIEWPORT_ULPIADDR_MASK         (0xFF0000U)\r\n#define USBC_ULPI_VIEWPORT_ULPIADDR_SHIFT        (16U)\r\n/*! ULPIADDR - Not available */\r\n#define USBC_ULPI_VIEWPORT_ULPIADDR(x)           (((uint32_t)(((uint32_t)(x)) << USBC_ULPI_VIEWPORT_ULPIADDR_SHIFT)) & USBC_ULPI_VIEWPORT_ULPIADDR_MASK)\r\n\r\n#define USBC_ULPI_VIEWPORT_ULPIPORT_MASK         (0x7000000U)\r\n#define USBC_ULPI_VIEWPORT_ULPIPORT_SHIFT        (24U)\r\n/*! ULPIPORT - Not available */\r\n#define USBC_ULPI_VIEWPORT_ULPIPORT(x)           (((uint32_t)(((uint32_t)(x)) << USBC_ULPI_VIEWPORT_ULPIPORT_SHIFT)) & USBC_ULPI_VIEWPORT_ULPIPORT_MASK)\r\n\r\n#define USBC_ULPI_VIEWPORT_ULPISS_MASK           (0x8000000U)\r\n#define USBC_ULPI_VIEWPORT_ULPISS_SHIFT          (27U)\r\n/*! ULPISS - Not available */\r\n#define USBC_ULPI_VIEWPORT_ULPISS(x)             (((uint32_t)(((uint32_t)(x)) << USBC_ULPI_VIEWPORT_ULPISS_SHIFT)) & USBC_ULPI_VIEWPORT_ULPISS_MASK)\r\n\r\n#define USBC_ULPI_VIEWPORT_UNUSED_28_MASK        (0x10000000U)\r\n#define USBC_ULPI_VIEWPORT_UNUSED_28_SHIFT       (28U)\r\n/*! UNUSED_28 - Not available */\r\n#define USBC_ULPI_VIEWPORT_UNUSED_28(x)          (((uint32_t)(((uint32_t)(x)) << USBC_ULPI_VIEWPORT_UNUSED_28_SHIFT)) & USBC_ULPI_VIEWPORT_UNUSED_28_MASK)\r\n\r\n#define USBC_ULPI_VIEWPORT_ULPIRW_MASK           (0x20000000U)\r\n#define USBC_ULPI_VIEWPORT_ULPIRW_SHIFT          (29U)\r\n/*! ULPIRW - Not available */\r\n#define USBC_ULPI_VIEWPORT_ULPIRW(x)             (((uint32_t)(((uint32_t)(x)) << USBC_ULPI_VIEWPORT_ULPIRW_SHIFT)) & USBC_ULPI_VIEWPORT_ULPIRW_MASK)\r\n\r\n#define USBC_ULPI_VIEWPORT_ULPIRUN_MASK          (0x40000000U)\r\n#define USBC_ULPI_VIEWPORT_ULPIRUN_SHIFT         (30U)\r\n/*! ULPIRUN - Not available */\r\n#define USBC_ULPI_VIEWPORT_ULPIRUN(x)            (((uint32_t)(((uint32_t)(x)) << USBC_ULPI_VIEWPORT_ULPIRUN_SHIFT)) & USBC_ULPI_VIEWPORT_ULPIRUN_MASK)\r\n\r\n#define USBC_ULPI_VIEWPORT_ULPIWU_MASK           (0x80000000U)\r\n#define USBC_ULPI_VIEWPORT_ULPIWU_SHIFT          (31U)\r\n/*! ULPIWU - Not available */\r\n#define USBC_ULPI_VIEWPORT_ULPIWU(x)             (((uint32_t)(((uint32_t)(x)) << USBC_ULPI_VIEWPORT_ULPIWU_SHIFT)) & USBC_ULPI_VIEWPORT_ULPIWU_MASK)\r\n/*! @} */\r\n\r\n/*! @name ENDPTNAK - ENDPTNAK */\r\n/*! @{ */\r\n\r\n#define USBC_ENDPTNAK_EPRN_MASK                  (0xFFFFU)\r\n#define USBC_ENDPTNAK_EPRN_SHIFT                 (0U)\r\n/*! EPRN - rwc */\r\n#define USBC_ENDPTNAK_EPRN(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTNAK_EPRN_SHIFT)) & USBC_ENDPTNAK_EPRN_MASK)\r\n\r\n#define USBC_ENDPTNAK_EPTN_MASK                  (0xFFFF0000U)\r\n#define USBC_ENDPTNAK_EPTN_SHIFT                 (16U)\r\n/*! EPTN - rwc */\r\n#define USBC_ENDPTNAK_EPTN(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTNAK_EPTN_SHIFT)) & USBC_ENDPTNAK_EPTN_MASK)\r\n/*! @} */\r\n\r\n/*! @name ENDPTNAKEN - ENDPTNAKEN */\r\n/*! @{ */\r\n\r\n#define USBC_ENDPTNAKEN_EPRNE_MASK               (0xFFFFU)\r\n#define USBC_ENDPTNAKEN_EPRNE_SHIFT              (0U)\r\n/*! EPRNE - Only 3 PHY max */\r\n#define USBC_ENDPTNAKEN_EPRNE(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTNAKEN_EPRNE_SHIFT)) & USBC_ENDPTNAKEN_EPRNE_MASK)\r\n\r\n#define USBC_ENDPTNAKEN_EPTNE_MASK               (0xFFFF0000U)\r\n#define USBC_ENDPTNAKEN_EPTNE_SHIFT              (16U)\r\n/*! EPTNE - Only 3 PHY max */\r\n#define USBC_ENDPTNAKEN_EPTNE(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTNAKEN_EPTNE_SHIFT)) & USBC_ENDPTNAKEN_EPTNE_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORTSC1 - PORTSC1 */\r\n/*! @{ */\r\n\r\n#define USBC_PORTSC1_CCS_MASK                    (0x1U)\r\n#define USBC_PORTSC1_CCS_SHIFT                   (0U)\r\n/*! CCS - CCS */\r\n#define USBC_PORTSC1_CCS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_CCS_SHIFT)) & USBC_PORTSC1_CCS_MASK)\r\n\r\n#define USBC_PORTSC1_CSC_MASK                    (0x2U)\r\n#define USBC_PORTSC1_CSC_SHIFT                   (1U)\r\n/*! CSC - rwc */\r\n#define USBC_PORTSC1_CSC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_CSC_SHIFT)) & USBC_PORTSC1_CSC_MASK)\r\n\r\n#define USBC_PORTSC1_PE_MASK                     (0x4U)\r\n#define USBC_PORTSC1_PE_SHIFT                    (2U)\r\n/*! PE - rwc */\r\n#define USBC_PORTSC1_PE(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_PE_SHIFT)) & USBC_PORTSC1_PE_MASK)\r\n\r\n#define USBC_PORTSC1_PEC_MASK                    (0x8U)\r\n#define USBC_PORTSC1_PEC_SHIFT                   (3U)\r\n/*! PEC - rwc */\r\n#define USBC_PORTSC1_PEC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_PEC_SHIFT)) & USBC_PORTSC1_PEC_MASK)\r\n\r\n#define USBC_PORTSC1_OCA_MASK                    (0x10U)\r\n#define USBC_PORTSC1_OCA_SHIFT                   (4U)\r\n/*! OCA - OCA */\r\n#define USBC_PORTSC1_OCA(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_OCA_SHIFT)) & USBC_PORTSC1_OCA_MASK)\r\n\r\n#define USBC_PORTSC1_OCC_MASK                    (0x20U)\r\n#define USBC_PORTSC1_OCC_SHIFT                   (5U)\r\n/*! OCC - OCC */\r\n#define USBC_PORTSC1_OCC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_OCC_SHIFT)) & USBC_PORTSC1_OCC_MASK)\r\n\r\n#define USBC_PORTSC1_FPR_MASK                    (0x40U)\r\n#define USBC_PORTSC1_FPR_SHIFT                   (6U)\r\n/*! FPR - FPR */\r\n#define USBC_PORTSC1_FPR(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_FPR_SHIFT)) & USBC_PORTSC1_FPR_MASK)\r\n\r\n#define USBC_PORTSC1_SUSP_MASK                   (0x80U)\r\n#define USBC_PORTSC1_SUSP_SHIFT                  (7U)\r\n/*! SUSP - SUSP */\r\n#define USBC_PORTSC1_SUSP(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_SUSP_SHIFT)) & USBC_PORTSC1_SUSP_MASK)\r\n\r\n#define USBC_PORTSC1_PR_MASK                     (0x100U)\r\n#define USBC_PORTSC1_PR_SHIFT                    (8U)\r\n/*! PR - PR */\r\n#define USBC_PORTSC1_PR(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_PR_SHIFT)) & USBC_PORTSC1_PR_MASK)\r\n\r\n#define USBC_PORTSC1_HSP_MASK                    (0x200U)\r\n#define USBC_PORTSC1_HSP_SHIFT                   (9U)\r\n/*! HSP - HSP */\r\n#define USBC_PORTSC1_HSP(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_HSP_SHIFT)) & USBC_PORTSC1_HSP_MASK)\r\n\r\n#define USBC_PORTSC1_LS_MASK                     (0xC00U)\r\n#define USBC_PORTSC1_LS_SHIFT                    (10U)\r\n/*! LS - LS */\r\n#define USBC_PORTSC1_LS(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_LS_SHIFT)) & USBC_PORTSC1_LS_MASK)\r\n\r\n#define USBC_PORTSC1_PP_MASK                     (0x1000U)\r\n#define USBC_PORTSC1_PP_SHIFT                    (12U)\r\n/*! PP - PP */\r\n#define USBC_PORTSC1_PP(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_PP_SHIFT)) & USBC_PORTSC1_PP_MASK)\r\n\r\n#define USBC_PORTSC1_PO_MASK                     (0x2000U)\r\n#define USBC_PORTSC1_PO_SHIFT                    (13U)\r\n/*! PO - PO */\r\n#define USBC_PORTSC1_PO(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_PO_SHIFT)) & USBC_PORTSC1_PO_MASK)\r\n\r\n#define USBC_PORTSC1_PIC_MASK                    (0xC000U)\r\n#define USBC_PORTSC1_PIC_SHIFT                   (14U)\r\n/*! PIC - PIC */\r\n#define USBC_PORTSC1_PIC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_PIC_SHIFT)) & USBC_PORTSC1_PIC_MASK)\r\n\r\n#define USBC_PORTSC1_PTC_MASK                    (0xF0000U)\r\n#define USBC_PORTSC1_PTC_SHIFT                   (16U)\r\n/*! PTC - PTC */\r\n#define USBC_PORTSC1_PTC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_PTC_SHIFT)) & USBC_PORTSC1_PTC_MASK)\r\n\r\n#define USBC_PORTSC1_WKCN_MASK                   (0x100000U)\r\n#define USBC_PORTSC1_WKCN_SHIFT                  (20U)\r\n/*! WKCN - WKCN */\r\n#define USBC_PORTSC1_WKCN(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_WKCN_SHIFT)) & USBC_PORTSC1_WKCN_MASK)\r\n\r\n#define USBC_PORTSC1_WKDS_MASK                   (0x200000U)\r\n#define USBC_PORTSC1_WKDS_SHIFT                  (21U)\r\n/*! WKDS - WKDS */\r\n#define USBC_PORTSC1_WKDS(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_WKDS_SHIFT)) & USBC_PORTSC1_WKDS_MASK)\r\n\r\n#define USBC_PORTSC1_WKOC_MASK                   (0x400000U)\r\n#define USBC_PORTSC1_WKOC_SHIFT                  (22U)\r\n/*! WKOC - WKOC */\r\n#define USBC_PORTSC1_WKOC(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_WKOC_SHIFT)) & USBC_PORTSC1_WKOC_MASK)\r\n\r\n#define USBC_PORTSC1_PHCD_MASK                   (0x800000U)\r\n#define USBC_PORTSC1_PHCD_SHIFT                  (23U)\r\n/*! PHCD - PHCD */\r\n#define USBC_PORTSC1_PHCD(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_PHCD_SHIFT)) & USBC_PORTSC1_PHCD_MASK)\r\n\r\n#define USBC_PORTSC1_PFSC_MASK                   (0x1000000U)\r\n#define USBC_PORTSC1_PFSC_SHIFT                  (24U)\r\n/*! PFSC - PFSC */\r\n#define USBC_PORTSC1_PFSC(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_PFSC_SHIFT)) & USBC_PORTSC1_PFSC_MASK)\r\n\r\n#define USBC_PORTSC1_PTS2_MASK                   (0x2000000U)\r\n#define USBC_PORTSC1_PTS2_SHIFT                  (25U)\r\n/*! PTS2 - PTS2 */\r\n#define USBC_PORTSC1_PTS2(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_PTS2_SHIFT)) & USBC_PORTSC1_PTS2_MASK)\r\n\r\n#define USBC_PORTSC1_PSPD_MASK                   (0xC000000U)\r\n#define USBC_PORTSC1_PSPD_SHIFT                  (26U)\r\n/*! PSPD - PSPD */\r\n#define USBC_PORTSC1_PSPD(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_PSPD_SHIFT)) & USBC_PORTSC1_PSPD_MASK)\r\n\r\n#define USBC_PORTSC1_PTW_MASK                    (0x10000000U)\r\n#define USBC_PORTSC1_PTW_SHIFT                   (28U)\r\n/*! PTW - PTW */\r\n#define USBC_PORTSC1_PTW(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_PTW_SHIFT)) & USBC_PORTSC1_PTW_MASK)\r\n\r\n#define USBC_PORTSC1_STS_MASK                    (0x20000000U)\r\n#define USBC_PORTSC1_STS_SHIFT                   (29U)\r\n/*! STS - STS */\r\n#define USBC_PORTSC1_STS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_STS_SHIFT)) & USBC_PORTSC1_STS_MASK)\r\n\r\n#define USBC_PORTSC1_PTS_MASK                    (0xC0000000U)\r\n#define USBC_PORTSC1_PTS_SHIFT                   (30U)\r\n/*! PTS - PTS */\r\n#define USBC_PORTSC1_PTS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC1_PTS_SHIFT)) & USBC_PORTSC1_PTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORTSC2 - PORTSC2 */\r\n/*! @{ */\r\n\r\n#define USBC_PORTSC2_CCS_MASK                    (0x1U)\r\n#define USBC_PORTSC2_CCS_SHIFT                   (0U)\r\n/*! CCS - CCS */\r\n#define USBC_PORTSC2_CCS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_CCS_SHIFT)) & USBC_PORTSC2_CCS_MASK)\r\n\r\n#define USBC_PORTSC2_CSC_MASK                    (0x2U)\r\n#define USBC_PORTSC2_CSC_SHIFT                   (1U)\r\n/*! CSC - rwc */\r\n#define USBC_PORTSC2_CSC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_CSC_SHIFT)) & USBC_PORTSC2_CSC_MASK)\r\n\r\n#define USBC_PORTSC2_PE_MASK                     (0x4U)\r\n#define USBC_PORTSC2_PE_SHIFT                    (2U)\r\n/*! PE - rwc */\r\n#define USBC_PORTSC2_PE(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_PE_SHIFT)) & USBC_PORTSC2_PE_MASK)\r\n\r\n#define USBC_PORTSC2_PEC_MASK                    (0x8U)\r\n#define USBC_PORTSC2_PEC_SHIFT                   (3U)\r\n/*! PEC - rwc */\r\n#define USBC_PORTSC2_PEC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_PEC_SHIFT)) & USBC_PORTSC2_PEC_MASK)\r\n\r\n#define USBC_PORTSC2_OCA_MASK                    (0x10U)\r\n#define USBC_PORTSC2_OCA_SHIFT                   (4U)\r\n/*! OCA - OCA */\r\n#define USBC_PORTSC2_OCA(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_OCA_SHIFT)) & USBC_PORTSC2_OCA_MASK)\r\n\r\n#define USBC_PORTSC2_OCC_MASK                    (0x20U)\r\n#define USBC_PORTSC2_OCC_SHIFT                   (5U)\r\n/*! OCC - OCC */\r\n#define USBC_PORTSC2_OCC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_OCC_SHIFT)) & USBC_PORTSC2_OCC_MASK)\r\n\r\n#define USBC_PORTSC2_FPR_MASK                    (0x40U)\r\n#define USBC_PORTSC2_FPR_SHIFT                   (6U)\r\n/*! FPR - FPR */\r\n#define USBC_PORTSC2_FPR(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_FPR_SHIFT)) & USBC_PORTSC2_FPR_MASK)\r\n\r\n#define USBC_PORTSC2_SUSP_MASK                   (0x80U)\r\n#define USBC_PORTSC2_SUSP_SHIFT                  (7U)\r\n/*! SUSP - SUSP */\r\n#define USBC_PORTSC2_SUSP(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_SUSP_SHIFT)) & USBC_PORTSC2_SUSP_MASK)\r\n\r\n#define USBC_PORTSC2_PR_MASK                     (0x100U)\r\n#define USBC_PORTSC2_PR_SHIFT                    (8U)\r\n/*! PR - PR */\r\n#define USBC_PORTSC2_PR(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_PR_SHIFT)) & USBC_PORTSC2_PR_MASK)\r\n\r\n#define USBC_PORTSC2_HSP_MASK                    (0x200U)\r\n#define USBC_PORTSC2_HSP_SHIFT                   (9U)\r\n/*! HSP - HSP */\r\n#define USBC_PORTSC2_HSP(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_HSP_SHIFT)) & USBC_PORTSC2_HSP_MASK)\r\n\r\n#define USBC_PORTSC2_LS_MASK                     (0xC00U)\r\n#define USBC_PORTSC2_LS_SHIFT                    (10U)\r\n/*! LS - LS */\r\n#define USBC_PORTSC2_LS(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_LS_SHIFT)) & USBC_PORTSC2_LS_MASK)\r\n\r\n#define USBC_PORTSC2_PP_MASK                     (0x1000U)\r\n#define USBC_PORTSC2_PP_SHIFT                    (12U)\r\n/*! PP - PP */\r\n#define USBC_PORTSC2_PP(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_PP_SHIFT)) & USBC_PORTSC2_PP_MASK)\r\n\r\n#define USBC_PORTSC2_PO_MASK                     (0x2000U)\r\n#define USBC_PORTSC2_PO_SHIFT                    (13U)\r\n/*! PO - PO */\r\n#define USBC_PORTSC2_PO(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_PO_SHIFT)) & USBC_PORTSC2_PO_MASK)\r\n\r\n#define USBC_PORTSC2_PIC_MASK                    (0xC000U)\r\n#define USBC_PORTSC2_PIC_SHIFT                   (14U)\r\n/*! PIC - PIC */\r\n#define USBC_PORTSC2_PIC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_PIC_SHIFT)) & USBC_PORTSC2_PIC_MASK)\r\n\r\n#define USBC_PORTSC2_PTC_MASK                    (0xF0000U)\r\n#define USBC_PORTSC2_PTC_SHIFT                   (16U)\r\n/*! PTC - PTC */\r\n#define USBC_PORTSC2_PTC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_PTC_SHIFT)) & USBC_PORTSC2_PTC_MASK)\r\n\r\n#define USBC_PORTSC2_WKCN_MASK                   (0x100000U)\r\n#define USBC_PORTSC2_WKCN_SHIFT                  (20U)\r\n/*! WKCN - WKCN */\r\n#define USBC_PORTSC2_WKCN(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_WKCN_SHIFT)) & USBC_PORTSC2_WKCN_MASK)\r\n\r\n#define USBC_PORTSC2_WKDS_MASK                   (0x200000U)\r\n#define USBC_PORTSC2_WKDS_SHIFT                  (21U)\r\n/*! WKDS - WKDS */\r\n#define USBC_PORTSC2_WKDS(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_WKDS_SHIFT)) & USBC_PORTSC2_WKDS_MASK)\r\n\r\n#define USBC_PORTSC2_WKOC_MASK                   (0x400000U)\r\n#define USBC_PORTSC2_WKOC_SHIFT                  (22U)\r\n/*! WKOC - WKOC */\r\n#define USBC_PORTSC2_WKOC(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_WKOC_SHIFT)) & USBC_PORTSC2_WKOC_MASK)\r\n\r\n#define USBC_PORTSC2_PHCD_MASK                   (0x800000U)\r\n#define USBC_PORTSC2_PHCD_SHIFT                  (23U)\r\n/*! PHCD - PHCD */\r\n#define USBC_PORTSC2_PHCD(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_PHCD_SHIFT)) & USBC_PORTSC2_PHCD_MASK)\r\n\r\n#define USBC_PORTSC2_PFSC_MASK                   (0x1000000U)\r\n#define USBC_PORTSC2_PFSC_SHIFT                  (24U)\r\n/*! PFSC - PFSC */\r\n#define USBC_PORTSC2_PFSC(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_PFSC_SHIFT)) & USBC_PORTSC2_PFSC_MASK)\r\n\r\n#define USBC_PORTSC2_PTS2_MASK                   (0x2000000U)\r\n#define USBC_PORTSC2_PTS2_SHIFT                  (25U)\r\n/*! PTS2 - PTS2 */\r\n#define USBC_PORTSC2_PTS2(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_PTS2_SHIFT)) & USBC_PORTSC2_PTS2_MASK)\r\n\r\n#define USBC_PORTSC2_PSPD_MASK                   (0xC000000U)\r\n#define USBC_PORTSC2_PSPD_SHIFT                  (26U)\r\n/*! PSPD - PSPD */\r\n#define USBC_PORTSC2_PSPD(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_PSPD_SHIFT)) & USBC_PORTSC2_PSPD_MASK)\r\n\r\n#define USBC_PORTSC2_PTW_MASK                    (0x10000000U)\r\n#define USBC_PORTSC2_PTW_SHIFT                   (28U)\r\n/*! PTW - PTW */\r\n#define USBC_PORTSC2_PTW(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_PTW_SHIFT)) & USBC_PORTSC2_PTW_MASK)\r\n\r\n#define USBC_PORTSC2_STS_MASK                    (0x20000000U)\r\n#define USBC_PORTSC2_STS_SHIFT                   (29U)\r\n/*! STS - STS */\r\n#define USBC_PORTSC2_STS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_STS_SHIFT)) & USBC_PORTSC2_STS_MASK)\r\n\r\n#define USBC_PORTSC2_PTS_MASK                    (0xC0000000U)\r\n#define USBC_PORTSC2_PTS_SHIFT                   (30U)\r\n/*! PTS - PTS */\r\n#define USBC_PORTSC2_PTS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC2_PTS_SHIFT)) & USBC_PORTSC2_PTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORTSC3 - PORTSC3 */\r\n/*! @{ */\r\n\r\n#define USBC_PORTSC3_CCS_MASK                    (0x1U)\r\n#define USBC_PORTSC3_CCS_SHIFT                   (0U)\r\n/*! CCS - CCS */\r\n#define USBC_PORTSC3_CCS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_CCS_SHIFT)) & USBC_PORTSC3_CCS_MASK)\r\n\r\n#define USBC_PORTSC3_CSC_MASK                    (0x2U)\r\n#define USBC_PORTSC3_CSC_SHIFT                   (1U)\r\n/*! CSC - rwc */\r\n#define USBC_PORTSC3_CSC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_CSC_SHIFT)) & USBC_PORTSC3_CSC_MASK)\r\n\r\n#define USBC_PORTSC3_PE_MASK                     (0x4U)\r\n#define USBC_PORTSC3_PE_SHIFT                    (2U)\r\n/*! PE - rwc */\r\n#define USBC_PORTSC3_PE(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_PE_SHIFT)) & USBC_PORTSC3_PE_MASK)\r\n\r\n#define USBC_PORTSC3_PEC_MASK                    (0x8U)\r\n#define USBC_PORTSC3_PEC_SHIFT                   (3U)\r\n/*! PEC - rwc */\r\n#define USBC_PORTSC3_PEC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_PEC_SHIFT)) & USBC_PORTSC3_PEC_MASK)\r\n\r\n#define USBC_PORTSC3_OCA_MASK                    (0x10U)\r\n#define USBC_PORTSC3_OCA_SHIFT                   (4U)\r\n/*! OCA - OCA */\r\n#define USBC_PORTSC3_OCA(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_OCA_SHIFT)) & USBC_PORTSC3_OCA_MASK)\r\n\r\n#define USBC_PORTSC3_OCC_MASK                    (0x20U)\r\n#define USBC_PORTSC3_OCC_SHIFT                   (5U)\r\n/*! OCC - OCC */\r\n#define USBC_PORTSC3_OCC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_OCC_SHIFT)) & USBC_PORTSC3_OCC_MASK)\r\n\r\n#define USBC_PORTSC3_FPR_MASK                    (0x40U)\r\n#define USBC_PORTSC3_FPR_SHIFT                   (6U)\r\n/*! FPR - FPR */\r\n#define USBC_PORTSC3_FPR(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_FPR_SHIFT)) & USBC_PORTSC3_FPR_MASK)\r\n\r\n#define USBC_PORTSC3_SUSP_MASK                   (0x80U)\r\n#define USBC_PORTSC3_SUSP_SHIFT                  (7U)\r\n/*! SUSP - SUSP */\r\n#define USBC_PORTSC3_SUSP(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_SUSP_SHIFT)) & USBC_PORTSC3_SUSP_MASK)\r\n\r\n#define USBC_PORTSC3_PR_MASK                     (0x100U)\r\n#define USBC_PORTSC3_PR_SHIFT                    (8U)\r\n/*! PR - PR */\r\n#define USBC_PORTSC3_PR(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_PR_SHIFT)) & USBC_PORTSC3_PR_MASK)\r\n\r\n#define USBC_PORTSC3_HSP_MASK                    (0x200U)\r\n#define USBC_PORTSC3_HSP_SHIFT                   (9U)\r\n/*! HSP - HSP */\r\n#define USBC_PORTSC3_HSP(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_HSP_SHIFT)) & USBC_PORTSC3_HSP_MASK)\r\n\r\n#define USBC_PORTSC3_LS_MASK                     (0xC00U)\r\n#define USBC_PORTSC3_LS_SHIFT                    (10U)\r\n/*! LS - LS */\r\n#define USBC_PORTSC3_LS(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_LS_SHIFT)) & USBC_PORTSC3_LS_MASK)\r\n\r\n#define USBC_PORTSC3_PP_MASK                     (0x1000U)\r\n#define USBC_PORTSC3_PP_SHIFT                    (12U)\r\n/*! PP - PP */\r\n#define USBC_PORTSC3_PP(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_PP_SHIFT)) & USBC_PORTSC3_PP_MASK)\r\n\r\n#define USBC_PORTSC3_PO_MASK                     (0x2000U)\r\n#define USBC_PORTSC3_PO_SHIFT                    (13U)\r\n/*! PO - PO */\r\n#define USBC_PORTSC3_PO(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_PO_SHIFT)) & USBC_PORTSC3_PO_MASK)\r\n\r\n#define USBC_PORTSC3_PIC_MASK                    (0xC000U)\r\n#define USBC_PORTSC3_PIC_SHIFT                   (14U)\r\n/*! PIC - PIC */\r\n#define USBC_PORTSC3_PIC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_PIC_SHIFT)) & USBC_PORTSC3_PIC_MASK)\r\n\r\n#define USBC_PORTSC3_PTC_MASK                    (0xF0000U)\r\n#define USBC_PORTSC3_PTC_SHIFT                   (16U)\r\n/*! PTC - PTC */\r\n#define USBC_PORTSC3_PTC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_PTC_SHIFT)) & USBC_PORTSC3_PTC_MASK)\r\n\r\n#define USBC_PORTSC3_WKCN_MASK                   (0x100000U)\r\n#define USBC_PORTSC3_WKCN_SHIFT                  (20U)\r\n/*! WKCN - WKCN */\r\n#define USBC_PORTSC3_WKCN(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_WKCN_SHIFT)) & USBC_PORTSC3_WKCN_MASK)\r\n\r\n#define USBC_PORTSC3_WKDS_MASK                   (0x200000U)\r\n#define USBC_PORTSC3_WKDS_SHIFT                  (21U)\r\n/*! WKDS - WKDS */\r\n#define USBC_PORTSC3_WKDS(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_WKDS_SHIFT)) & USBC_PORTSC3_WKDS_MASK)\r\n\r\n#define USBC_PORTSC3_WKOC_MASK                   (0x400000U)\r\n#define USBC_PORTSC3_WKOC_SHIFT                  (22U)\r\n/*! WKOC - WKOC */\r\n#define USBC_PORTSC3_WKOC(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_WKOC_SHIFT)) & USBC_PORTSC3_WKOC_MASK)\r\n\r\n#define USBC_PORTSC3_PHCD_MASK                   (0x800000U)\r\n#define USBC_PORTSC3_PHCD_SHIFT                  (23U)\r\n/*! PHCD - PHCD */\r\n#define USBC_PORTSC3_PHCD(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_PHCD_SHIFT)) & USBC_PORTSC3_PHCD_MASK)\r\n\r\n#define USBC_PORTSC3_PFSC_MASK                   (0x1000000U)\r\n#define USBC_PORTSC3_PFSC_SHIFT                  (24U)\r\n/*! PFSC - PFSC */\r\n#define USBC_PORTSC3_PFSC(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_PFSC_SHIFT)) & USBC_PORTSC3_PFSC_MASK)\r\n\r\n#define USBC_PORTSC3_PTS2_MASK                   (0x2000000U)\r\n#define USBC_PORTSC3_PTS2_SHIFT                  (25U)\r\n/*! PTS2 - PTS2 */\r\n#define USBC_PORTSC3_PTS2(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_PTS2_SHIFT)) & USBC_PORTSC3_PTS2_MASK)\r\n\r\n#define USBC_PORTSC3_PSPD_MASK                   (0xC000000U)\r\n#define USBC_PORTSC3_PSPD_SHIFT                  (26U)\r\n/*! PSPD - PSPD */\r\n#define USBC_PORTSC3_PSPD(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_PSPD_SHIFT)) & USBC_PORTSC3_PSPD_MASK)\r\n\r\n#define USBC_PORTSC3_PTW_MASK                    (0x10000000U)\r\n#define USBC_PORTSC3_PTW_SHIFT                   (28U)\r\n/*! PTW - PTW */\r\n#define USBC_PORTSC3_PTW(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_PTW_SHIFT)) & USBC_PORTSC3_PTW_MASK)\r\n\r\n#define USBC_PORTSC3_STS_MASK                    (0x20000000U)\r\n#define USBC_PORTSC3_STS_SHIFT                   (29U)\r\n/*! STS - STS */\r\n#define USBC_PORTSC3_STS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_STS_SHIFT)) & USBC_PORTSC3_STS_MASK)\r\n\r\n#define USBC_PORTSC3_PTS_MASK                    (0xC0000000U)\r\n#define USBC_PORTSC3_PTS_SHIFT                   (30U)\r\n/*! PTS - PTS */\r\n#define USBC_PORTSC3_PTS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC3_PTS_SHIFT)) & USBC_PORTSC3_PTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORTSC4 - PORTSC4 */\r\n/*! @{ */\r\n\r\n#define USBC_PORTSC4_CCS_MASK                    (0x1U)\r\n#define USBC_PORTSC4_CCS_SHIFT                   (0U)\r\n/*! CCS - CCS */\r\n#define USBC_PORTSC4_CCS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_CCS_SHIFT)) & USBC_PORTSC4_CCS_MASK)\r\n\r\n#define USBC_PORTSC4_CSC_MASK                    (0x2U)\r\n#define USBC_PORTSC4_CSC_SHIFT                   (1U)\r\n/*! CSC - rwc */\r\n#define USBC_PORTSC4_CSC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_CSC_SHIFT)) & USBC_PORTSC4_CSC_MASK)\r\n\r\n#define USBC_PORTSC4_PE_MASK                     (0x4U)\r\n#define USBC_PORTSC4_PE_SHIFT                    (2U)\r\n/*! PE - rwc */\r\n#define USBC_PORTSC4_PE(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_PE_SHIFT)) & USBC_PORTSC4_PE_MASK)\r\n\r\n#define USBC_PORTSC4_PEC_MASK                    (0x8U)\r\n#define USBC_PORTSC4_PEC_SHIFT                   (3U)\r\n/*! PEC - rwc */\r\n#define USBC_PORTSC4_PEC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_PEC_SHIFT)) & USBC_PORTSC4_PEC_MASK)\r\n\r\n#define USBC_PORTSC4_OCA_MASK                    (0x10U)\r\n#define USBC_PORTSC4_OCA_SHIFT                   (4U)\r\n/*! OCA - OCA */\r\n#define USBC_PORTSC4_OCA(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_OCA_SHIFT)) & USBC_PORTSC4_OCA_MASK)\r\n\r\n#define USBC_PORTSC4_OCC_MASK                    (0x20U)\r\n#define USBC_PORTSC4_OCC_SHIFT                   (5U)\r\n/*! OCC - OCC */\r\n#define USBC_PORTSC4_OCC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_OCC_SHIFT)) & USBC_PORTSC4_OCC_MASK)\r\n\r\n#define USBC_PORTSC4_FPR_MASK                    (0x40U)\r\n#define USBC_PORTSC4_FPR_SHIFT                   (6U)\r\n/*! FPR - FPR */\r\n#define USBC_PORTSC4_FPR(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_FPR_SHIFT)) & USBC_PORTSC4_FPR_MASK)\r\n\r\n#define USBC_PORTSC4_SUSP_MASK                   (0x80U)\r\n#define USBC_PORTSC4_SUSP_SHIFT                  (7U)\r\n/*! SUSP - SUSP */\r\n#define USBC_PORTSC4_SUSP(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_SUSP_SHIFT)) & USBC_PORTSC4_SUSP_MASK)\r\n\r\n#define USBC_PORTSC4_PR_MASK                     (0x100U)\r\n#define USBC_PORTSC4_PR_SHIFT                    (8U)\r\n/*! PR - PR */\r\n#define USBC_PORTSC4_PR(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_PR_SHIFT)) & USBC_PORTSC4_PR_MASK)\r\n\r\n#define USBC_PORTSC4_HSP_MASK                    (0x200U)\r\n#define USBC_PORTSC4_HSP_SHIFT                   (9U)\r\n/*! HSP - HSP */\r\n#define USBC_PORTSC4_HSP(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_HSP_SHIFT)) & USBC_PORTSC4_HSP_MASK)\r\n\r\n#define USBC_PORTSC4_LS_MASK                     (0xC00U)\r\n#define USBC_PORTSC4_LS_SHIFT                    (10U)\r\n/*! LS - LS */\r\n#define USBC_PORTSC4_LS(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_LS_SHIFT)) & USBC_PORTSC4_LS_MASK)\r\n\r\n#define USBC_PORTSC4_PP_MASK                     (0x1000U)\r\n#define USBC_PORTSC4_PP_SHIFT                    (12U)\r\n/*! PP - PP */\r\n#define USBC_PORTSC4_PP(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_PP_SHIFT)) & USBC_PORTSC4_PP_MASK)\r\n\r\n#define USBC_PORTSC4_PO_MASK                     (0x2000U)\r\n#define USBC_PORTSC4_PO_SHIFT                    (13U)\r\n/*! PO - PO */\r\n#define USBC_PORTSC4_PO(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_PO_SHIFT)) & USBC_PORTSC4_PO_MASK)\r\n\r\n#define USBC_PORTSC4_PIC_MASK                    (0xC000U)\r\n#define USBC_PORTSC4_PIC_SHIFT                   (14U)\r\n/*! PIC - PIC */\r\n#define USBC_PORTSC4_PIC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_PIC_SHIFT)) & USBC_PORTSC4_PIC_MASK)\r\n\r\n#define USBC_PORTSC4_PTC_MASK                    (0xF0000U)\r\n#define USBC_PORTSC4_PTC_SHIFT                   (16U)\r\n/*! PTC - PTC */\r\n#define USBC_PORTSC4_PTC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_PTC_SHIFT)) & USBC_PORTSC4_PTC_MASK)\r\n\r\n#define USBC_PORTSC4_WKCN_MASK                   (0x100000U)\r\n#define USBC_PORTSC4_WKCN_SHIFT                  (20U)\r\n/*! WKCN - WKCN */\r\n#define USBC_PORTSC4_WKCN(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_WKCN_SHIFT)) & USBC_PORTSC4_WKCN_MASK)\r\n\r\n#define USBC_PORTSC4_WKDS_MASK                   (0x200000U)\r\n#define USBC_PORTSC4_WKDS_SHIFT                  (21U)\r\n/*! WKDS - WKDS */\r\n#define USBC_PORTSC4_WKDS(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_WKDS_SHIFT)) & USBC_PORTSC4_WKDS_MASK)\r\n\r\n#define USBC_PORTSC4_WKOC_MASK                   (0x400000U)\r\n#define USBC_PORTSC4_WKOC_SHIFT                  (22U)\r\n/*! WKOC - WKOC */\r\n#define USBC_PORTSC4_WKOC(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_WKOC_SHIFT)) & USBC_PORTSC4_WKOC_MASK)\r\n\r\n#define USBC_PORTSC4_PHCD_MASK                   (0x800000U)\r\n#define USBC_PORTSC4_PHCD_SHIFT                  (23U)\r\n/*! PHCD - PHCD */\r\n#define USBC_PORTSC4_PHCD(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_PHCD_SHIFT)) & USBC_PORTSC4_PHCD_MASK)\r\n\r\n#define USBC_PORTSC4_PFSC_MASK                   (0x1000000U)\r\n#define USBC_PORTSC4_PFSC_SHIFT                  (24U)\r\n/*! PFSC - PFSC */\r\n#define USBC_PORTSC4_PFSC(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_PFSC_SHIFT)) & USBC_PORTSC4_PFSC_MASK)\r\n\r\n#define USBC_PORTSC4_PTS2_MASK                   (0x2000000U)\r\n#define USBC_PORTSC4_PTS2_SHIFT                  (25U)\r\n/*! PTS2 - PTS2 */\r\n#define USBC_PORTSC4_PTS2(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_PTS2_SHIFT)) & USBC_PORTSC4_PTS2_MASK)\r\n\r\n#define USBC_PORTSC4_PSPD_MASK                   (0xC000000U)\r\n#define USBC_PORTSC4_PSPD_SHIFT                  (26U)\r\n/*! PSPD - PSPD */\r\n#define USBC_PORTSC4_PSPD(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_PSPD_SHIFT)) & USBC_PORTSC4_PSPD_MASK)\r\n\r\n#define USBC_PORTSC4_PTW_MASK                    (0x10000000U)\r\n#define USBC_PORTSC4_PTW_SHIFT                   (28U)\r\n/*! PTW - PTW */\r\n#define USBC_PORTSC4_PTW(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_PTW_SHIFT)) & USBC_PORTSC4_PTW_MASK)\r\n\r\n#define USBC_PORTSC4_STS_MASK                    (0x20000000U)\r\n#define USBC_PORTSC4_STS_SHIFT                   (29U)\r\n/*! STS - STS */\r\n#define USBC_PORTSC4_STS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_STS_SHIFT)) & USBC_PORTSC4_STS_MASK)\r\n\r\n#define USBC_PORTSC4_PTS_MASK                    (0xC0000000U)\r\n#define USBC_PORTSC4_PTS_SHIFT                   (30U)\r\n/*! PTS - PTS */\r\n#define USBC_PORTSC4_PTS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC4_PTS_SHIFT)) & USBC_PORTSC4_PTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORTSC5 - PORTSC5 */\r\n/*! @{ */\r\n\r\n#define USBC_PORTSC5_CCS_MASK                    (0x1U)\r\n#define USBC_PORTSC5_CCS_SHIFT                   (0U)\r\n/*! CCS - CCS */\r\n#define USBC_PORTSC5_CCS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_CCS_SHIFT)) & USBC_PORTSC5_CCS_MASK)\r\n\r\n#define USBC_PORTSC5_CSC_MASK                    (0x2U)\r\n#define USBC_PORTSC5_CSC_SHIFT                   (1U)\r\n/*! CSC - rwc */\r\n#define USBC_PORTSC5_CSC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_CSC_SHIFT)) & USBC_PORTSC5_CSC_MASK)\r\n\r\n#define USBC_PORTSC5_PE_MASK                     (0x4U)\r\n#define USBC_PORTSC5_PE_SHIFT                    (2U)\r\n/*! PE - rwc */\r\n#define USBC_PORTSC5_PE(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_PE_SHIFT)) & USBC_PORTSC5_PE_MASK)\r\n\r\n#define USBC_PORTSC5_PEC_MASK                    (0x8U)\r\n#define USBC_PORTSC5_PEC_SHIFT                   (3U)\r\n/*! PEC - rwc */\r\n#define USBC_PORTSC5_PEC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_PEC_SHIFT)) & USBC_PORTSC5_PEC_MASK)\r\n\r\n#define USBC_PORTSC5_OCA_MASK                    (0x10U)\r\n#define USBC_PORTSC5_OCA_SHIFT                   (4U)\r\n/*! OCA - OCA */\r\n#define USBC_PORTSC5_OCA(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_OCA_SHIFT)) & USBC_PORTSC5_OCA_MASK)\r\n\r\n#define USBC_PORTSC5_OCC_MASK                    (0x20U)\r\n#define USBC_PORTSC5_OCC_SHIFT                   (5U)\r\n/*! OCC - OCC */\r\n#define USBC_PORTSC5_OCC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_OCC_SHIFT)) & USBC_PORTSC5_OCC_MASK)\r\n\r\n#define USBC_PORTSC5_FPR_MASK                    (0x40U)\r\n#define USBC_PORTSC5_FPR_SHIFT                   (6U)\r\n/*! FPR - FPR */\r\n#define USBC_PORTSC5_FPR(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_FPR_SHIFT)) & USBC_PORTSC5_FPR_MASK)\r\n\r\n#define USBC_PORTSC5_SUSP_MASK                   (0x80U)\r\n#define USBC_PORTSC5_SUSP_SHIFT                  (7U)\r\n/*! SUSP - SUSP */\r\n#define USBC_PORTSC5_SUSP(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_SUSP_SHIFT)) & USBC_PORTSC5_SUSP_MASK)\r\n\r\n#define USBC_PORTSC5_PR_MASK                     (0x100U)\r\n#define USBC_PORTSC5_PR_SHIFT                    (8U)\r\n/*! PR - PR */\r\n#define USBC_PORTSC5_PR(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_PR_SHIFT)) & USBC_PORTSC5_PR_MASK)\r\n\r\n#define USBC_PORTSC5_HSP_MASK                    (0x200U)\r\n#define USBC_PORTSC5_HSP_SHIFT                   (9U)\r\n/*! HSP - HSP */\r\n#define USBC_PORTSC5_HSP(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_HSP_SHIFT)) & USBC_PORTSC5_HSP_MASK)\r\n\r\n#define USBC_PORTSC5_LS_MASK                     (0xC00U)\r\n#define USBC_PORTSC5_LS_SHIFT                    (10U)\r\n/*! LS - LS */\r\n#define USBC_PORTSC5_LS(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_LS_SHIFT)) & USBC_PORTSC5_LS_MASK)\r\n\r\n#define USBC_PORTSC5_PP_MASK                     (0x1000U)\r\n#define USBC_PORTSC5_PP_SHIFT                    (12U)\r\n/*! PP - PP */\r\n#define USBC_PORTSC5_PP(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_PP_SHIFT)) & USBC_PORTSC5_PP_MASK)\r\n\r\n#define USBC_PORTSC5_PO_MASK                     (0x2000U)\r\n#define USBC_PORTSC5_PO_SHIFT                    (13U)\r\n/*! PO - PO */\r\n#define USBC_PORTSC5_PO(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_PO_SHIFT)) & USBC_PORTSC5_PO_MASK)\r\n\r\n#define USBC_PORTSC5_PIC_MASK                    (0xC000U)\r\n#define USBC_PORTSC5_PIC_SHIFT                   (14U)\r\n/*! PIC - PIC */\r\n#define USBC_PORTSC5_PIC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_PIC_SHIFT)) & USBC_PORTSC5_PIC_MASK)\r\n\r\n#define USBC_PORTSC5_PTC_MASK                    (0xF0000U)\r\n#define USBC_PORTSC5_PTC_SHIFT                   (16U)\r\n/*! PTC - PTC */\r\n#define USBC_PORTSC5_PTC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_PTC_SHIFT)) & USBC_PORTSC5_PTC_MASK)\r\n\r\n#define USBC_PORTSC5_WKCN_MASK                   (0x100000U)\r\n#define USBC_PORTSC5_WKCN_SHIFT                  (20U)\r\n/*! WKCN - WKCN */\r\n#define USBC_PORTSC5_WKCN(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_WKCN_SHIFT)) & USBC_PORTSC5_WKCN_MASK)\r\n\r\n#define USBC_PORTSC5_WKDS_MASK                   (0x200000U)\r\n#define USBC_PORTSC5_WKDS_SHIFT                  (21U)\r\n/*! WKDS - WKDS */\r\n#define USBC_PORTSC5_WKDS(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_WKDS_SHIFT)) & USBC_PORTSC5_WKDS_MASK)\r\n\r\n#define USBC_PORTSC5_WKOC_MASK                   (0x400000U)\r\n#define USBC_PORTSC5_WKOC_SHIFT                  (22U)\r\n/*! WKOC - WKOC */\r\n#define USBC_PORTSC5_WKOC(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_WKOC_SHIFT)) & USBC_PORTSC5_WKOC_MASK)\r\n\r\n#define USBC_PORTSC5_PHCD_MASK                   (0x800000U)\r\n#define USBC_PORTSC5_PHCD_SHIFT                  (23U)\r\n/*! PHCD - PHCD */\r\n#define USBC_PORTSC5_PHCD(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_PHCD_SHIFT)) & USBC_PORTSC5_PHCD_MASK)\r\n\r\n#define USBC_PORTSC5_PFSC_MASK                   (0x1000000U)\r\n#define USBC_PORTSC5_PFSC_SHIFT                  (24U)\r\n/*! PFSC - PFSC */\r\n#define USBC_PORTSC5_PFSC(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_PFSC_SHIFT)) & USBC_PORTSC5_PFSC_MASK)\r\n\r\n#define USBC_PORTSC5_PTS2_MASK                   (0x2000000U)\r\n#define USBC_PORTSC5_PTS2_SHIFT                  (25U)\r\n/*! PTS2 - PTS2 */\r\n#define USBC_PORTSC5_PTS2(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_PTS2_SHIFT)) & USBC_PORTSC5_PTS2_MASK)\r\n\r\n#define USBC_PORTSC5_PSPD_MASK                   (0xC000000U)\r\n#define USBC_PORTSC5_PSPD_SHIFT                  (26U)\r\n/*! PSPD - PSPD */\r\n#define USBC_PORTSC5_PSPD(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_PSPD_SHIFT)) & USBC_PORTSC5_PSPD_MASK)\r\n\r\n#define USBC_PORTSC5_PTW_MASK                    (0x10000000U)\r\n#define USBC_PORTSC5_PTW_SHIFT                   (28U)\r\n/*! PTW - PTW */\r\n#define USBC_PORTSC5_PTW(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_PTW_SHIFT)) & USBC_PORTSC5_PTW_MASK)\r\n\r\n#define USBC_PORTSC5_STS_MASK                    (0x20000000U)\r\n#define USBC_PORTSC5_STS_SHIFT                   (29U)\r\n/*! STS - STS */\r\n#define USBC_PORTSC5_STS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_STS_SHIFT)) & USBC_PORTSC5_STS_MASK)\r\n\r\n#define USBC_PORTSC5_PTS_MASK                    (0xC0000000U)\r\n#define USBC_PORTSC5_PTS_SHIFT                   (30U)\r\n/*! PTS - PTS */\r\n#define USBC_PORTSC5_PTS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC5_PTS_SHIFT)) & USBC_PORTSC5_PTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORTSC6 - PORTSC6 */\r\n/*! @{ */\r\n\r\n#define USBC_PORTSC6_CCS_MASK                    (0x1U)\r\n#define USBC_PORTSC6_CCS_SHIFT                   (0U)\r\n/*! CCS - CCS */\r\n#define USBC_PORTSC6_CCS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_CCS_SHIFT)) & USBC_PORTSC6_CCS_MASK)\r\n\r\n#define USBC_PORTSC6_CSC_MASK                    (0x2U)\r\n#define USBC_PORTSC6_CSC_SHIFT                   (1U)\r\n/*! CSC - rwc */\r\n#define USBC_PORTSC6_CSC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_CSC_SHIFT)) & USBC_PORTSC6_CSC_MASK)\r\n\r\n#define USBC_PORTSC6_PE_MASK                     (0x4U)\r\n#define USBC_PORTSC6_PE_SHIFT                    (2U)\r\n/*! PE - rwc */\r\n#define USBC_PORTSC6_PE(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_PE_SHIFT)) & USBC_PORTSC6_PE_MASK)\r\n\r\n#define USBC_PORTSC6_PEC_MASK                    (0x8U)\r\n#define USBC_PORTSC6_PEC_SHIFT                   (3U)\r\n/*! PEC - rwc */\r\n#define USBC_PORTSC6_PEC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_PEC_SHIFT)) & USBC_PORTSC6_PEC_MASK)\r\n\r\n#define USBC_PORTSC6_OCA_MASK                    (0x10U)\r\n#define USBC_PORTSC6_OCA_SHIFT                   (4U)\r\n/*! OCA - OCA */\r\n#define USBC_PORTSC6_OCA(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_OCA_SHIFT)) & USBC_PORTSC6_OCA_MASK)\r\n\r\n#define USBC_PORTSC6_OCC_MASK                    (0x20U)\r\n#define USBC_PORTSC6_OCC_SHIFT                   (5U)\r\n/*! OCC - OCC */\r\n#define USBC_PORTSC6_OCC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_OCC_SHIFT)) & USBC_PORTSC6_OCC_MASK)\r\n\r\n#define USBC_PORTSC6_FPR_MASK                    (0x40U)\r\n#define USBC_PORTSC6_FPR_SHIFT                   (6U)\r\n/*! FPR - FPR */\r\n#define USBC_PORTSC6_FPR(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_FPR_SHIFT)) & USBC_PORTSC6_FPR_MASK)\r\n\r\n#define USBC_PORTSC6_SUSP_MASK                   (0x80U)\r\n#define USBC_PORTSC6_SUSP_SHIFT                  (7U)\r\n/*! SUSP - SUSP */\r\n#define USBC_PORTSC6_SUSP(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_SUSP_SHIFT)) & USBC_PORTSC6_SUSP_MASK)\r\n\r\n#define USBC_PORTSC6_PR_MASK                     (0x100U)\r\n#define USBC_PORTSC6_PR_SHIFT                    (8U)\r\n/*! PR - PR */\r\n#define USBC_PORTSC6_PR(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_PR_SHIFT)) & USBC_PORTSC6_PR_MASK)\r\n\r\n#define USBC_PORTSC6_HSP_MASK                    (0x200U)\r\n#define USBC_PORTSC6_HSP_SHIFT                   (9U)\r\n/*! HSP - HSP */\r\n#define USBC_PORTSC6_HSP(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_HSP_SHIFT)) & USBC_PORTSC6_HSP_MASK)\r\n\r\n#define USBC_PORTSC6_LS_MASK                     (0xC00U)\r\n#define USBC_PORTSC6_LS_SHIFT                    (10U)\r\n/*! LS - LS */\r\n#define USBC_PORTSC6_LS(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_LS_SHIFT)) & USBC_PORTSC6_LS_MASK)\r\n\r\n#define USBC_PORTSC6_PP_MASK                     (0x1000U)\r\n#define USBC_PORTSC6_PP_SHIFT                    (12U)\r\n/*! PP - PP */\r\n#define USBC_PORTSC6_PP(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_PP_SHIFT)) & USBC_PORTSC6_PP_MASK)\r\n\r\n#define USBC_PORTSC6_PO_MASK                     (0x2000U)\r\n#define USBC_PORTSC6_PO_SHIFT                    (13U)\r\n/*! PO - PO */\r\n#define USBC_PORTSC6_PO(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_PO_SHIFT)) & USBC_PORTSC6_PO_MASK)\r\n\r\n#define USBC_PORTSC6_PIC_MASK                    (0xC000U)\r\n#define USBC_PORTSC6_PIC_SHIFT                   (14U)\r\n/*! PIC - PIC */\r\n#define USBC_PORTSC6_PIC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_PIC_SHIFT)) & USBC_PORTSC6_PIC_MASK)\r\n\r\n#define USBC_PORTSC6_PTC_MASK                    (0xF0000U)\r\n#define USBC_PORTSC6_PTC_SHIFT                   (16U)\r\n/*! PTC - PTC */\r\n#define USBC_PORTSC6_PTC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_PTC_SHIFT)) & USBC_PORTSC6_PTC_MASK)\r\n\r\n#define USBC_PORTSC6_WKCN_MASK                   (0x100000U)\r\n#define USBC_PORTSC6_WKCN_SHIFT                  (20U)\r\n/*! WKCN - WKCN */\r\n#define USBC_PORTSC6_WKCN(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_WKCN_SHIFT)) & USBC_PORTSC6_WKCN_MASK)\r\n\r\n#define USBC_PORTSC6_WKDS_MASK                   (0x200000U)\r\n#define USBC_PORTSC6_WKDS_SHIFT                  (21U)\r\n/*! WKDS - WKDS */\r\n#define USBC_PORTSC6_WKDS(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_WKDS_SHIFT)) & USBC_PORTSC6_WKDS_MASK)\r\n\r\n#define USBC_PORTSC6_WKOC_MASK                   (0x400000U)\r\n#define USBC_PORTSC6_WKOC_SHIFT                  (22U)\r\n/*! WKOC - WKOC */\r\n#define USBC_PORTSC6_WKOC(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_WKOC_SHIFT)) & USBC_PORTSC6_WKOC_MASK)\r\n\r\n#define USBC_PORTSC6_PHCD_MASK                   (0x800000U)\r\n#define USBC_PORTSC6_PHCD_SHIFT                  (23U)\r\n/*! PHCD - PHCD */\r\n#define USBC_PORTSC6_PHCD(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_PHCD_SHIFT)) & USBC_PORTSC6_PHCD_MASK)\r\n\r\n#define USBC_PORTSC6_PFSC_MASK                   (0x1000000U)\r\n#define USBC_PORTSC6_PFSC_SHIFT                  (24U)\r\n/*! PFSC - PFSC */\r\n#define USBC_PORTSC6_PFSC(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_PFSC_SHIFT)) & USBC_PORTSC6_PFSC_MASK)\r\n\r\n#define USBC_PORTSC6_PTS2_MASK                   (0x2000000U)\r\n#define USBC_PORTSC6_PTS2_SHIFT                  (25U)\r\n/*! PTS2 - PTS2 */\r\n#define USBC_PORTSC6_PTS2(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_PTS2_SHIFT)) & USBC_PORTSC6_PTS2_MASK)\r\n\r\n#define USBC_PORTSC6_PSPD_MASK                   (0xC000000U)\r\n#define USBC_PORTSC6_PSPD_SHIFT                  (26U)\r\n/*! PSPD - PSPD */\r\n#define USBC_PORTSC6_PSPD(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_PSPD_SHIFT)) & USBC_PORTSC6_PSPD_MASK)\r\n\r\n#define USBC_PORTSC6_PTW_MASK                    (0x10000000U)\r\n#define USBC_PORTSC6_PTW_SHIFT                   (28U)\r\n/*! PTW - PTW */\r\n#define USBC_PORTSC6_PTW(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_PTW_SHIFT)) & USBC_PORTSC6_PTW_MASK)\r\n\r\n#define USBC_PORTSC6_STS_MASK                    (0x20000000U)\r\n#define USBC_PORTSC6_STS_SHIFT                   (29U)\r\n/*! STS - STS */\r\n#define USBC_PORTSC6_STS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_STS_SHIFT)) & USBC_PORTSC6_STS_MASK)\r\n\r\n#define USBC_PORTSC6_PTS_MASK                    (0xC0000000U)\r\n#define USBC_PORTSC6_PTS_SHIFT                   (30U)\r\n/*! PTS - PTS */\r\n#define USBC_PORTSC6_PTS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC6_PTS_SHIFT)) & USBC_PORTSC6_PTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORTSC7 - PORTSC7 */\r\n/*! @{ */\r\n\r\n#define USBC_PORTSC7_CCS_MASK                    (0x1U)\r\n#define USBC_PORTSC7_CCS_SHIFT                   (0U)\r\n/*! CCS - CCS */\r\n#define USBC_PORTSC7_CCS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_CCS_SHIFT)) & USBC_PORTSC7_CCS_MASK)\r\n\r\n#define USBC_PORTSC7_CSC_MASK                    (0x2U)\r\n#define USBC_PORTSC7_CSC_SHIFT                   (1U)\r\n/*! CSC - rwc */\r\n#define USBC_PORTSC7_CSC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_CSC_SHIFT)) & USBC_PORTSC7_CSC_MASK)\r\n\r\n#define USBC_PORTSC7_PE_MASK                     (0x4U)\r\n#define USBC_PORTSC7_PE_SHIFT                    (2U)\r\n/*! PE - rwc */\r\n#define USBC_PORTSC7_PE(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_PE_SHIFT)) & USBC_PORTSC7_PE_MASK)\r\n\r\n#define USBC_PORTSC7_PEC_MASK                    (0x8U)\r\n#define USBC_PORTSC7_PEC_SHIFT                   (3U)\r\n/*! PEC - rwc */\r\n#define USBC_PORTSC7_PEC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_PEC_SHIFT)) & USBC_PORTSC7_PEC_MASK)\r\n\r\n#define USBC_PORTSC7_OCA_MASK                    (0x10U)\r\n#define USBC_PORTSC7_OCA_SHIFT                   (4U)\r\n/*! OCA - OCA */\r\n#define USBC_PORTSC7_OCA(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_OCA_SHIFT)) & USBC_PORTSC7_OCA_MASK)\r\n\r\n#define USBC_PORTSC7_OCC_MASK                    (0x20U)\r\n#define USBC_PORTSC7_OCC_SHIFT                   (5U)\r\n/*! OCC - OCC */\r\n#define USBC_PORTSC7_OCC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_OCC_SHIFT)) & USBC_PORTSC7_OCC_MASK)\r\n\r\n#define USBC_PORTSC7_FPR_MASK                    (0x40U)\r\n#define USBC_PORTSC7_FPR_SHIFT                   (6U)\r\n/*! FPR - FPR */\r\n#define USBC_PORTSC7_FPR(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_FPR_SHIFT)) & USBC_PORTSC7_FPR_MASK)\r\n\r\n#define USBC_PORTSC7_SUSP_MASK                   (0x80U)\r\n#define USBC_PORTSC7_SUSP_SHIFT                  (7U)\r\n/*! SUSP - SUSP */\r\n#define USBC_PORTSC7_SUSP(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_SUSP_SHIFT)) & USBC_PORTSC7_SUSP_MASK)\r\n\r\n#define USBC_PORTSC7_PR_MASK                     (0x100U)\r\n#define USBC_PORTSC7_PR_SHIFT                    (8U)\r\n/*! PR - PR */\r\n#define USBC_PORTSC7_PR(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_PR_SHIFT)) & USBC_PORTSC7_PR_MASK)\r\n\r\n#define USBC_PORTSC7_HSP_MASK                    (0x200U)\r\n#define USBC_PORTSC7_HSP_SHIFT                   (9U)\r\n/*! HSP - HSP */\r\n#define USBC_PORTSC7_HSP(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_HSP_SHIFT)) & USBC_PORTSC7_HSP_MASK)\r\n\r\n#define USBC_PORTSC7_LS_MASK                     (0xC00U)\r\n#define USBC_PORTSC7_LS_SHIFT                    (10U)\r\n/*! LS - LS */\r\n#define USBC_PORTSC7_LS(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_LS_SHIFT)) & USBC_PORTSC7_LS_MASK)\r\n\r\n#define USBC_PORTSC7_PP_MASK                     (0x1000U)\r\n#define USBC_PORTSC7_PP_SHIFT                    (12U)\r\n/*! PP - PP */\r\n#define USBC_PORTSC7_PP(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_PP_SHIFT)) & USBC_PORTSC7_PP_MASK)\r\n\r\n#define USBC_PORTSC7_PO_MASK                     (0x2000U)\r\n#define USBC_PORTSC7_PO_SHIFT                    (13U)\r\n/*! PO - PO */\r\n#define USBC_PORTSC7_PO(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_PO_SHIFT)) & USBC_PORTSC7_PO_MASK)\r\n\r\n#define USBC_PORTSC7_PIC_MASK                    (0xC000U)\r\n#define USBC_PORTSC7_PIC_SHIFT                   (14U)\r\n/*! PIC - PIC */\r\n#define USBC_PORTSC7_PIC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_PIC_SHIFT)) & USBC_PORTSC7_PIC_MASK)\r\n\r\n#define USBC_PORTSC7_PTC_MASK                    (0xF0000U)\r\n#define USBC_PORTSC7_PTC_SHIFT                   (16U)\r\n/*! PTC - PTC */\r\n#define USBC_PORTSC7_PTC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_PTC_SHIFT)) & USBC_PORTSC7_PTC_MASK)\r\n\r\n#define USBC_PORTSC7_WKCN_MASK                   (0x100000U)\r\n#define USBC_PORTSC7_WKCN_SHIFT                  (20U)\r\n/*! WKCN - WKCN */\r\n#define USBC_PORTSC7_WKCN(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_WKCN_SHIFT)) & USBC_PORTSC7_WKCN_MASK)\r\n\r\n#define USBC_PORTSC7_WKDS_MASK                   (0x200000U)\r\n#define USBC_PORTSC7_WKDS_SHIFT                  (21U)\r\n/*! WKDS - WKDS */\r\n#define USBC_PORTSC7_WKDS(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_WKDS_SHIFT)) & USBC_PORTSC7_WKDS_MASK)\r\n\r\n#define USBC_PORTSC7_WKOC_MASK                   (0x400000U)\r\n#define USBC_PORTSC7_WKOC_SHIFT                  (22U)\r\n/*! WKOC - WKOC */\r\n#define USBC_PORTSC7_WKOC(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_WKOC_SHIFT)) & USBC_PORTSC7_WKOC_MASK)\r\n\r\n#define USBC_PORTSC7_PHCD_MASK                   (0x800000U)\r\n#define USBC_PORTSC7_PHCD_SHIFT                  (23U)\r\n/*! PHCD - PHCD */\r\n#define USBC_PORTSC7_PHCD(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_PHCD_SHIFT)) & USBC_PORTSC7_PHCD_MASK)\r\n\r\n#define USBC_PORTSC7_PFSC_MASK                   (0x1000000U)\r\n#define USBC_PORTSC7_PFSC_SHIFT                  (24U)\r\n/*! PFSC - PFSC */\r\n#define USBC_PORTSC7_PFSC(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_PFSC_SHIFT)) & USBC_PORTSC7_PFSC_MASK)\r\n\r\n#define USBC_PORTSC7_PTS2_MASK                   (0x2000000U)\r\n#define USBC_PORTSC7_PTS2_SHIFT                  (25U)\r\n/*! PTS2 - PTS2 */\r\n#define USBC_PORTSC7_PTS2(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_PTS2_SHIFT)) & USBC_PORTSC7_PTS2_MASK)\r\n\r\n#define USBC_PORTSC7_PSPD_MASK                   (0xC000000U)\r\n#define USBC_PORTSC7_PSPD_SHIFT                  (26U)\r\n/*! PSPD - PSPD */\r\n#define USBC_PORTSC7_PSPD(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_PSPD_SHIFT)) & USBC_PORTSC7_PSPD_MASK)\r\n\r\n#define USBC_PORTSC7_PTW_MASK                    (0x10000000U)\r\n#define USBC_PORTSC7_PTW_SHIFT                   (28U)\r\n/*! PTW - PTW */\r\n#define USBC_PORTSC7_PTW(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_PTW_SHIFT)) & USBC_PORTSC7_PTW_MASK)\r\n\r\n#define USBC_PORTSC7_STS_MASK                    (0x20000000U)\r\n#define USBC_PORTSC7_STS_SHIFT                   (29U)\r\n/*! STS - STS */\r\n#define USBC_PORTSC7_STS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_STS_SHIFT)) & USBC_PORTSC7_STS_MASK)\r\n\r\n#define USBC_PORTSC7_PTS_MASK                    (0xC0000000U)\r\n#define USBC_PORTSC7_PTS_SHIFT                   (30U)\r\n/*! PTS - PTS */\r\n#define USBC_PORTSC7_PTS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC7_PTS_SHIFT)) & USBC_PORTSC7_PTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name PORTSC8 - PORTSC8 */\r\n/*! @{ */\r\n\r\n#define USBC_PORTSC8_CCS_MASK                    (0x1U)\r\n#define USBC_PORTSC8_CCS_SHIFT                   (0U)\r\n/*! CCS - CCS */\r\n#define USBC_PORTSC8_CCS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_CCS_SHIFT)) & USBC_PORTSC8_CCS_MASK)\r\n\r\n#define USBC_PORTSC8_CSC_MASK                    (0x2U)\r\n#define USBC_PORTSC8_CSC_SHIFT                   (1U)\r\n/*! CSC - rwc */\r\n#define USBC_PORTSC8_CSC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_CSC_SHIFT)) & USBC_PORTSC8_CSC_MASK)\r\n\r\n#define USBC_PORTSC8_PE_MASK                     (0x4U)\r\n#define USBC_PORTSC8_PE_SHIFT                    (2U)\r\n/*! PE - rwc */\r\n#define USBC_PORTSC8_PE(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_PE_SHIFT)) & USBC_PORTSC8_PE_MASK)\r\n\r\n#define USBC_PORTSC8_PEC_MASK                    (0x8U)\r\n#define USBC_PORTSC8_PEC_SHIFT                   (3U)\r\n/*! PEC - rwc */\r\n#define USBC_PORTSC8_PEC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_PEC_SHIFT)) & USBC_PORTSC8_PEC_MASK)\r\n\r\n#define USBC_PORTSC8_OCA_MASK                    (0x10U)\r\n#define USBC_PORTSC8_OCA_SHIFT                   (4U)\r\n/*! OCA - OCA */\r\n#define USBC_PORTSC8_OCA(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_OCA_SHIFT)) & USBC_PORTSC8_OCA_MASK)\r\n\r\n#define USBC_PORTSC8_OCC_MASK                    (0x20U)\r\n#define USBC_PORTSC8_OCC_SHIFT                   (5U)\r\n/*! OCC - OCC */\r\n#define USBC_PORTSC8_OCC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_OCC_SHIFT)) & USBC_PORTSC8_OCC_MASK)\r\n\r\n#define USBC_PORTSC8_FPR_MASK                    (0x40U)\r\n#define USBC_PORTSC8_FPR_SHIFT                   (6U)\r\n/*! FPR - FPR */\r\n#define USBC_PORTSC8_FPR(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_FPR_SHIFT)) & USBC_PORTSC8_FPR_MASK)\r\n\r\n#define USBC_PORTSC8_SUSP_MASK                   (0x80U)\r\n#define USBC_PORTSC8_SUSP_SHIFT                  (7U)\r\n/*! SUSP - SUSP */\r\n#define USBC_PORTSC8_SUSP(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_SUSP_SHIFT)) & USBC_PORTSC8_SUSP_MASK)\r\n\r\n#define USBC_PORTSC8_PR_MASK                     (0x100U)\r\n#define USBC_PORTSC8_PR_SHIFT                    (8U)\r\n/*! PR - PR */\r\n#define USBC_PORTSC8_PR(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_PR_SHIFT)) & USBC_PORTSC8_PR_MASK)\r\n\r\n#define USBC_PORTSC8_HSP_MASK                    (0x200U)\r\n#define USBC_PORTSC8_HSP_SHIFT                   (9U)\r\n/*! HSP - HSP */\r\n#define USBC_PORTSC8_HSP(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_HSP_SHIFT)) & USBC_PORTSC8_HSP_MASK)\r\n\r\n#define USBC_PORTSC8_LS_MASK                     (0xC00U)\r\n#define USBC_PORTSC8_LS_SHIFT                    (10U)\r\n/*! LS - LS */\r\n#define USBC_PORTSC8_LS(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_LS_SHIFT)) & USBC_PORTSC8_LS_MASK)\r\n\r\n#define USBC_PORTSC8_PP_MASK                     (0x1000U)\r\n#define USBC_PORTSC8_PP_SHIFT                    (12U)\r\n/*! PP - PP */\r\n#define USBC_PORTSC8_PP(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_PP_SHIFT)) & USBC_PORTSC8_PP_MASK)\r\n\r\n#define USBC_PORTSC8_PO_MASK                     (0x2000U)\r\n#define USBC_PORTSC8_PO_SHIFT                    (13U)\r\n/*! PO - PO */\r\n#define USBC_PORTSC8_PO(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_PO_SHIFT)) & USBC_PORTSC8_PO_MASK)\r\n\r\n#define USBC_PORTSC8_PIC_MASK                    (0xC000U)\r\n#define USBC_PORTSC8_PIC_SHIFT                   (14U)\r\n/*! PIC - PIC */\r\n#define USBC_PORTSC8_PIC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_PIC_SHIFT)) & USBC_PORTSC8_PIC_MASK)\r\n\r\n#define USBC_PORTSC8_PTC_MASK                    (0xF0000U)\r\n#define USBC_PORTSC8_PTC_SHIFT                   (16U)\r\n/*! PTC - PTC */\r\n#define USBC_PORTSC8_PTC(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_PTC_SHIFT)) & USBC_PORTSC8_PTC_MASK)\r\n\r\n#define USBC_PORTSC8_WKCN_MASK                   (0x100000U)\r\n#define USBC_PORTSC8_WKCN_SHIFT                  (20U)\r\n/*! WKCN - WKCN */\r\n#define USBC_PORTSC8_WKCN(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_WKCN_SHIFT)) & USBC_PORTSC8_WKCN_MASK)\r\n\r\n#define USBC_PORTSC8_WKDS_MASK                   (0x200000U)\r\n#define USBC_PORTSC8_WKDS_SHIFT                  (21U)\r\n/*! WKDS - WKDS */\r\n#define USBC_PORTSC8_WKDS(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_WKDS_SHIFT)) & USBC_PORTSC8_WKDS_MASK)\r\n\r\n#define USBC_PORTSC8_WKOC_MASK                   (0x400000U)\r\n#define USBC_PORTSC8_WKOC_SHIFT                  (22U)\r\n/*! WKOC - WKOC */\r\n#define USBC_PORTSC8_WKOC(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_WKOC_SHIFT)) & USBC_PORTSC8_WKOC_MASK)\r\n\r\n#define USBC_PORTSC8_PHCD_MASK                   (0x800000U)\r\n#define USBC_PORTSC8_PHCD_SHIFT                  (23U)\r\n/*! PHCD - PHCD */\r\n#define USBC_PORTSC8_PHCD(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_PHCD_SHIFT)) & USBC_PORTSC8_PHCD_MASK)\r\n\r\n#define USBC_PORTSC8_PFSC_MASK                   (0x1000000U)\r\n#define USBC_PORTSC8_PFSC_SHIFT                  (24U)\r\n/*! PFSC - PFSC */\r\n#define USBC_PORTSC8_PFSC(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_PFSC_SHIFT)) & USBC_PORTSC8_PFSC_MASK)\r\n\r\n#define USBC_PORTSC8_PTS2_MASK                   (0x2000000U)\r\n#define USBC_PORTSC8_PTS2_SHIFT                  (25U)\r\n/*! PTS2 - PTS2 */\r\n#define USBC_PORTSC8_PTS2(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_PTS2_SHIFT)) & USBC_PORTSC8_PTS2_MASK)\r\n\r\n#define USBC_PORTSC8_PSPD_MASK                   (0xC000000U)\r\n#define USBC_PORTSC8_PSPD_SHIFT                  (26U)\r\n/*! PSPD - PSPD */\r\n#define USBC_PORTSC8_PSPD(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_PSPD_SHIFT)) & USBC_PORTSC8_PSPD_MASK)\r\n\r\n#define USBC_PORTSC8_PTW_MASK                    (0x10000000U)\r\n#define USBC_PORTSC8_PTW_SHIFT                   (28U)\r\n/*! PTW - PTW */\r\n#define USBC_PORTSC8_PTW(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_PTW_SHIFT)) & USBC_PORTSC8_PTW_MASK)\r\n\r\n#define USBC_PORTSC8_STS_MASK                    (0x20000000U)\r\n#define USBC_PORTSC8_STS_SHIFT                   (29U)\r\n/*! STS - STS */\r\n#define USBC_PORTSC8_STS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_STS_SHIFT)) & USBC_PORTSC8_STS_MASK)\r\n\r\n#define USBC_PORTSC8_PTS_MASK                    (0xC0000000U)\r\n#define USBC_PORTSC8_PTS_SHIFT                   (30U)\r\n/*! PTS - PTS */\r\n#define USBC_PORTSC8_PTS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_PORTSC8_PTS_SHIFT)) & USBC_PORTSC8_PTS_MASK)\r\n/*! @} */\r\n\r\n/*! @name OTGSC - OTGSC */\r\n/*! @{ */\r\n\r\n#define USBC_OTGSC_VD_MASK                       (0x1U)\r\n#define USBC_OTGSC_VD_SHIFT                      (0U)\r\n/*! VD - OTG not enable */\r\n#define USBC_OTGSC_VD(x)                         (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_VD_SHIFT)) & USBC_OTGSC_VD_MASK)\r\n\r\n#define USBC_OTGSC_VC_MASK                       (0x2U)\r\n#define USBC_OTGSC_VC_SHIFT                      (1U)\r\n/*! VC - OTG not enable */\r\n#define USBC_OTGSC_VC(x)                         (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_VC_SHIFT)) & USBC_OTGSC_VC_MASK)\r\n\r\n#define USBC_OTGSC_HAAR_MASK                     (0x4U)\r\n#define USBC_OTGSC_HAAR_SHIFT                    (2U)\r\n/*! HAAR - OTG not enable */\r\n#define USBC_OTGSC_HAAR(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_HAAR_SHIFT)) & USBC_OTGSC_HAAR_MASK)\r\n\r\n#define USBC_OTGSC_OT_MASK                       (0x8U)\r\n#define USBC_OTGSC_OT_SHIFT                      (3U)\r\n/*! OT - OTG not enable */\r\n#define USBC_OTGSC_OT(x)                         (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_OT_SHIFT)) & USBC_OTGSC_OT_MASK)\r\n\r\n#define USBC_OTGSC_DP_MASK                       (0x10U)\r\n#define USBC_OTGSC_DP_SHIFT                      (4U)\r\n/*! DP - OTG not enable */\r\n#define USBC_OTGSC_DP(x)                         (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_DP_SHIFT)) & USBC_OTGSC_DP_MASK)\r\n\r\n#define USBC_OTGSC_IDPU_MASK                     (0x20U)\r\n#define USBC_OTGSC_IDPU_SHIFT                    (5U)\r\n/*! IDPU - OTG not enable */\r\n#define USBC_OTGSC_IDPU(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_IDPU_SHIFT)) & USBC_OTGSC_IDPU_MASK)\r\n\r\n#define USBC_OTGSC_HADP_MASK                     (0x40U)\r\n#define USBC_OTGSC_HADP_SHIFT                    (6U)\r\n/*! HADP - OTG not enable */\r\n#define USBC_OTGSC_HADP(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_HADP_SHIFT)) & USBC_OTGSC_HADP_MASK)\r\n\r\n#define USBC_OTGSC_HABA_MASK                     (0x80U)\r\n#define USBC_OTGSC_HABA_SHIFT                    (7U)\r\n/*! HABA - OTG not enable */\r\n#define USBC_OTGSC_HABA(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_HABA_SHIFT)) & USBC_OTGSC_HABA_MASK)\r\n\r\n#define USBC_OTGSC_ID_MASK                       (0x100U)\r\n#define USBC_OTGSC_ID_SHIFT                      (8U)\r\n/*! ID - OTG not enable */\r\n#define USBC_OTGSC_ID(x)                         (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_ID_SHIFT)) & USBC_OTGSC_ID_MASK)\r\n\r\n#define USBC_OTGSC_AVV_MASK                      (0x200U)\r\n#define USBC_OTGSC_AVV_SHIFT                     (9U)\r\n/*! AVV - OTG not enable */\r\n#define USBC_OTGSC_AVV(x)                        (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_AVV_SHIFT)) & USBC_OTGSC_AVV_MASK)\r\n\r\n#define USBC_OTGSC_ASV_MASK                      (0x400U)\r\n#define USBC_OTGSC_ASV_SHIFT                     (10U)\r\n/*! ASV - OTG not enable */\r\n#define USBC_OTGSC_ASV(x)                        (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_ASV_SHIFT)) & USBC_OTGSC_ASV_MASK)\r\n\r\n#define USBC_OTGSC_BSV_MASK                      (0x800U)\r\n#define USBC_OTGSC_BSV_SHIFT                     (11U)\r\n/*! BSV - OTG not enable */\r\n#define USBC_OTGSC_BSV(x)                        (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_BSV_SHIFT)) & USBC_OTGSC_BSV_MASK)\r\n\r\n#define USBC_OTGSC_BSE_MASK                      (0x1000U)\r\n#define USBC_OTGSC_BSE_SHIFT                     (12U)\r\n/*! BSE - OTG not enable */\r\n#define USBC_OTGSC_BSE(x)                        (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_BSE_SHIFT)) & USBC_OTGSC_BSE_MASK)\r\n\r\n#define USBC_OTGSC_OTGSC_1MST_MASK               (0x2000U)\r\n#define USBC_OTGSC_OTGSC_1MST_SHIFT              (13U)\r\n/*! OTGSC_1MST - OTG not enable */\r\n#define USBC_OTGSC_OTGSC_1MST(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_OTGSC_1MST_SHIFT)) & USBC_OTGSC_OTGSC_1MST_MASK)\r\n\r\n#define USBC_OTGSC_DPS_MASK                      (0x4000U)\r\n#define USBC_OTGSC_DPS_SHIFT                     (14U)\r\n/*! DPS - OTG not enable */\r\n#define USBC_OTGSC_DPS(x)                        (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_DPS_SHIFT)) & USBC_OTGSC_DPS_MASK)\r\n\r\n#define USBC_OTGSC_UNUSED_15_MASK                (0x8000U)\r\n#define USBC_OTGSC_UNUSED_15_SHIFT               (15U)\r\n/*! UNUSED_15 - OTG not enable */\r\n#define USBC_OTGSC_UNUSED_15(x)                  (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_UNUSED_15_SHIFT)) & USBC_OTGSC_UNUSED_15_MASK)\r\n\r\n#define USBC_OTGSC_IDIS_MASK                     (0x10000U)\r\n#define USBC_OTGSC_IDIS_SHIFT                    (16U)\r\n/*! IDIS - rwc */\r\n#define USBC_OTGSC_IDIS(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_IDIS_SHIFT)) & USBC_OTGSC_IDIS_MASK)\r\n\r\n#define USBC_OTGSC_AVVIS_MASK                    (0x20000U)\r\n#define USBC_OTGSC_AVVIS_SHIFT                   (17U)\r\n/*! AVVIS - rwc */\r\n#define USBC_OTGSC_AVVIS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_AVVIS_SHIFT)) & USBC_OTGSC_AVVIS_MASK)\r\n\r\n#define USBC_OTGSC_ASVIS_MASK                    (0x40000U)\r\n#define USBC_OTGSC_ASVIS_SHIFT                   (18U)\r\n/*! ASVIS - rwc */\r\n#define USBC_OTGSC_ASVIS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_ASVIS_SHIFT)) & USBC_OTGSC_ASVIS_MASK)\r\n\r\n#define USBC_OTGSC_BSVIS_MASK                    (0x80000U)\r\n#define USBC_OTGSC_BSVIS_SHIFT                   (19U)\r\n/*! BSVIS - rwc */\r\n#define USBC_OTGSC_BSVIS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_BSVIS_SHIFT)) & USBC_OTGSC_BSVIS_MASK)\r\n\r\n#define USBC_OTGSC_BSEIS_MASK                    (0x100000U)\r\n#define USBC_OTGSC_BSEIS_SHIFT                   (20U)\r\n/*! BSEIS - rwc */\r\n#define USBC_OTGSC_BSEIS(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_BSEIS_SHIFT)) & USBC_OTGSC_BSEIS_MASK)\r\n\r\n#define USBC_OTGSC_OTGSC_1MSS_MASK               (0x200000U)\r\n#define USBC_OTGSC_OTGSC_1MSS_SHIFT              (21U)\r\n/*! OTGSC_1MSS - rwc */\r\n#define USBC_OTGSC_OTGSC_1MSS(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_OTGSC_1MSS_SHIFT)) & USBC_OTGSC_OTGSC_1MSS_MASK)\r\n\r\n#define USBC_OTGSC_DPIS_MASK                     (0x400000U)\r\n#define USBC_OTGSC_DPIS_SHIFT                    (22U)\r\n/*! DPIS - rwc */\r\n#define USBC_OTGSC_DPIS(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_DPIS_SHIFT)) & USBC_OTGSC_DPIS_MASK)\r\n\r\n#define USBC_OTGSC_UNUSED_23_MASK                (0x800000U)\r\n#define USBC_OTGSC_UNUSED_23_SHIFT               (23U)\r\n/*! UNUSED_23 - OTG not enable */\r\n#define USBC_OTGSC_UNUSED_23(x)                  (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_UNUSED_23_SHIFT)) & USBC_OTGSC_UNUSED_23_MASK)\r\n\r\n#define USBC_OTGSC_IDIE_MASK                     (0x1000000U)\r\n#define USBC_OTGSC_IDIE_SHIFT                    (24U)\r\n/*! IDIE - OTG not enable */\r\n#define USBC_OTGSC_IDIE(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_IDIE_SHIFT)) & USBC_OTGSC_IDIE_MASK)\r\n\r\n#define USBC_OTGSC_AVVIE_MASK                    (0x2000000U)\r\n#define USBC_OTGSC_AVVIE_SHIFT                   (25U)\r\n/*! AVVIE - OTG not enable */\r\n#define USBC_OTGSC_AVVIE(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_AVVIE_SHIFT)) & USBC_OTGSC_AVVIE_MASK)\r\n\r\n#define USBC_OTGSC_ASVIE_MASK                    (0x4000000U)\r\n#define USBC_OTGSC_ASVIE_SHIFT                   (26U)\r\n/*! ASVIE - OTG not enable */\r\n#define USBC_OTGSC_ASVIE(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_ASVIE_SHIFT)) & USBC_OTGSC_ASVIE_MASK)\r\n\r\n#define USBC_OTGSC_BSVIE_MASK                    (0x8000000U)\r\n#define USBC_OTGSC_BSVIE_SHIFT                   (27U)\r\n/*! BSVIE - OTG not enable */\r\n#define USBC_OTGSC_BSVIE(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_BSVIE_SHIFT)) & USBC_OTGSC_BSVIE_MASK)\r\n\r\n#define USBC_OTGSC_BSEIE_MASK                    (0x10000000U)\r\n#define USBC_OTGSC_BSEIE_SHIFT                   (28U)\r\n/*! BSEIE - OTG not enable */\r\n#define USBC_OTGSC_BSEIE(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_BSEIE_SHIFT)) & USBC_OTGSC_BSEIE_MASK)\r\n\r\n#define USBC_OTGSC_OTGSC_1MSE_MASK               (0x20000000U)\r\n#define USBC_OTGSC_OTGSC_1MSE_SHIFT              (29U)\r\n/*! OTGSC_1MSE - OTG not enable */\r\n#define USBC_OTGSC_OTGSC_1MSE(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_OTGSC_1MSE_SHIFT)) & USBC_OTGSC_OTGSC_1MSE_MASK)\r\n\r\n#define USBC_OTGSC_DPIE_MASK                     (0x40000000U)\r\n#define USBC_OTGSC_DPIE_SHIFT                    (30U)\r\n/*! DPIE - OTG not enable */\r\n#define USBC_OTGSC_DPIE(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_DPIE_SHIFT)) & USBC_OTGSC_DPIE_MASK)\r\n\r\n#define USBC_OTGSC_UNUSED_31_MASK                (0x80000000U)\r\n#define USBC_OTGSC_UNUSED_31_SHIFT               (31U)\r\n/*! UNUSED_31 - OTG not enable */\r\n#define USBC_OTGSC_UNUSED_31(x)                  (((uint32_t)(((uint32_t)(x)) << USBC_OTGSC_UNUSED_31_SHIFT)) & USBC_OTGSC_UNUSED_31_MASK)\r\n/*! @} */\r\n\r\n/*! @name USBMODE - USBMODE */\r\n/*! @{ */\r\n\r\n#define USBC_USBMODE_CM_MASK                     (0x3U)\r\n#define USBC_USBMODE_CM_SHIFT                    (0U)\r\n/*! CM - fix device mode */\r\n#define USBC_USBMODE_CM(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBMODE_CM_SHIFT)) & USBC_USBMODE_CM_MASK)\r\n\r\n#define USBC_USBMODE_ES_MASK                     (0x4U)\r\n#define USBC_USBMODE_ES_SHIFT                    (2U)\r\n/*! ES - ES */\r\n#define USBC_USBMODE_ES(x)                       (((uint32_t)(((uint32_t)(x)) << USBC_USBMODE_ES_SHIFT)) & USBC_USBMODE_ES_MASK)\r\n\r\n#define USBC_USBMODE_SLOM_MASK                   (0x8U)\r\n#define USBC_USBMODE_SLOM_SHIFT                  (3U)\r\n/*! SLOM - SLOM */\r\n#define USBC_USBMODE_SLOM(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_USBMODE_SLOM_SHIFT)) & USBC_USBMODE_SLOM_MASK)\r\n\r\n#define USBC_USBMODE_SDIS_MASK                   (0x10U)\r\n#define USBC_USBMODE_SDIS_SHIFT                  (4U)\r\n/*! SDIS - SDIS */\r\n#define USBC_USBMODE_SDIS(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_USBMODE_SDIS_SHIFT)) & USBC_USBMODE_SDIS_MASK)\r\n\r\n#define USBC_USBMODE_VBPS_MASK                   (0x20U)\r\n#define USBC_USBMODE_VBPS_SHIFT                  (5U)\r\n/*! VBPS - Only used in Host */\r\n#define USBC_USBMODE_VBPS(x)                     (((uint32_t)(((uint32_t)(x)) << USBC_USBMODE_VBPS_SHIFT)) & USBC_USBMODE_VBPS_MASK)\r\n\r\n#define USBC_USBMODE_UNUSED_6_MASK               (0xFC0U)\r\n#define USBC_USBMODE_UNUSED_6_SHIFT              (6U)\r\n/*! UNUSED_6 - UNUSED_6 */\r\n#define USBC_USBMODE_UNUSED_6(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_USBMODE_UNUSED_6_SHIFT)) & USBC_USBMODE_UNUSED_6_MASK)\r\n\r\n#define USBC_USBMODE_TXHSD_MASK                  (0x7000U)\r\n#define USBC_USBMODE_TXHSD_SHIFT                 (12U)\r\n/*! TXHSD - TXHSD */\r\n#define USBC_USBMODE_TXHSD(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_USBMODE_TXHSD_SHIFT)) & USBC_USBMODE_TXHSD_MASK)\r\n\r\n#define USBC_USBMODE_SRT_MASK                    (0x8000U)\r\n#define USBC_USBMODE_SRT_SHIFT                   (15U)\r\n/*! SRT - SRT */\r\n#define USBC_USBMODE_SRT(x)                      (((uint32_t)(((uint32_t)(x)) << USBC_USBMODE_SRT_SHIFT)) & USBC_USBMODE_SRT_MASK)\r\n\r\n#define USBC_USBMODE_UNUSED_16_MASK              (0xFFFF0000U)\r\n#define USBC_USBMODE_UNUSED_16_SHIFT             (16U)\r\n/*! UNUSED_16 - UNUSED_16 */\r\n#define USBC_USBMODE_UNUSED_16(x)                (((uint32_t)(((uint32_t)(x)) << USBC_USBMODE_UNUSED_16_SHIFT)) & USBC_USBMODE_UNUSED_16_MASK)\r\n/*! @} */\r\n\r\n/*! @name ENDPTSETUPSTAT - ENDPTSETUPSTAT */\r\n/*! @{ */\r\n\r\n#define USBC_ENDPTSETUPSTAT_ENDPTSETUPSTAT_MASK  (0xFFFFU)\r\n#define USBC_ENDPTSETUPSTAT_ENDPTSETUPSTAT_SHIFT (0U)\r\n/*! ENDPTSETUPSTAT - rwc */\r\n#define USBC_ENDPTSETUPSTAT_ENDPTSETUPSTAT(x)    (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTSETUPSTAT_ENDPTSETUPSTAT_SHIFT)) & USBC_ENDPTSETUPSTAT_ENDPTSETUPSTAT_MASK)\r\n\r\n#define USBC_ENDPTSETUPSTAT_UNUSED_16_MASK       (0xFFFF0000U)\r\n#define USBC_ENDPTSETUPSTAT_UNUSED_16_SHIFT      (16U)\r\n/*! UNUSED_16 - UNUSED_16 */\r\n#define USBC_ENDPTSETUPSTAT_UNUSED_16(x)         (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTSETUPSTAT_UNUSED_16_SHIFT)) & USBC_ENDPTSETUPSTAT_UNUSED_16_MASK)\r\n/*! @} */\r\n\r\n/*! @name ENDPTPRIME - ENDPTPRIME */\r\n/*! @{ */\r\n\r\n#define USBC_ENDPTPRIME_PERB_MASK                (0xFFFFU)\r\n#define USBC_ENDPTPRIME_PERB_SHIFT               (0U)\r\n/*! PERB - rws */\r\n#define USBC_ENDPTPRIME_PERB(x)                  (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTPRIME_PERB_SHIFT)) & USBC_ENDPTPRIME_PERB_MASK)\r\n\r\n#define USBC_ENDPTPRIME_PETB_MASK                (0xFFFF0000U)\r\n#define USBC_ENDPTPRIME_PETB_SHIFT               (16U)\r\n/*! PETB - rws */\r\n#define USBC_ENDPTPRIME_PETB(x)                  (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTPRIME_PETB_SHIFT)) & USBC_ENDPTPRIME_PETB_MASK)\r\n/*! @} */\r\n\r\n/*! @name ENDPTFLUSH - ENDPTFLUSH */\r\n/*! @{ */\r\n\r\n#define USBC_ENDPTFLUSH_FERB_MASK                (0xFFFFU)\r\n#define USBC_ENDPTFLUSH_FERB_SHIFT               (0U)\r\n/*! FERB - rws */\r\n#define USBC_ENDPTFLUSH_FERB(x)                  (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTFLUSH_FERB_SHIFT)) & USBC_ENDPTFLUSH_FERB_MASK)\r\n\r\n#define USBC_ENDPTFLUSH_FETB_MASK                (0xFFFF0000U)\r\n#define USBC_ENDPTFLUSH_FETB_SHIFT               (16U)\r\n/*! FETB - rws */\r\n#define USBC_ENDPTFLUSH_FETB(x)                  (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTFLUSH_FETB_SHIFT)) & USBC_ENDPTFLUSH_FETB_MASK)\r\n/*! @} */\r\n\r\n/*! @name ENDPTSTAT - ENDPTSTAT */\r\n/*! @{ */\r\n\r\n#define USBC_ENDPTSTAT_ERBR_MASK                 (0xFFFFU)\r\n#define USBC_ENDPTSTAT_ERBR_SHIFT                (0U)\r\n/*! ERBR - ERBR */\r\n#define USBC_ENDPTSTAT_ERBR(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTSTAT_ERBR_SHIFT)) & USBC_ENDPTSTAT_ERBR_MASK)\r\n\r\n#define USBC_ENDPTSTAT_ETBR_MASK                 (0xFFFF0000U)\r\n#define USBC_ENDPTSTAT_ETBR_SHIFT                (16U)\r\n/*! ETBR - ETBR */\r\n#define USBC_ENDPTSTAT_ETBR(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTSTAT_ETBR_SHIFT)) & USBC_ENDPTSTAT_ETBR_MASK)\r\n/*! @} */\r\n\r\n/*! @name ENDPTCOMPLETE - ENDPTCOMPLETE */\r\n/*! @{ */\r\n\r\n#define USBC_ENDPTCOMPLETE_ERCE_MASK             (0xFFFFU)\r\n#define USBC_ENDPTCOMPLETE_ERCE_SHIFT            (0U)\r\n/*! ERCE - rwc */\r\n#define USBC_ENDPTCOMPLETE_ERCE(x)               (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCOMPLETE_ERCE_SHIFT)) & USBC_ENDPTCOMPLETE_ERCE_MASK)\r\n\r\n#define USBC_ENDPTCOMPLETE_ETCE_MASK             (0xFFFF0000U)\r\n#define USBC_ENDPTCOMPLETE_ETCE_SHIFT            (16U)\r\n/*! ETCE - rwc */\r\n#define USBC_ENDPTCOMPLETE_ETCE(x)               (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCOMPLETE_ETCE_SHIFT)) & USBC_ENDPTCOMPLETE_ETCE_MASK)\r\n/*! @} */\r\n\r\n/*! @name ENDPTCTRL0 - ENDPTCTRL0 */\r\n/*! @{ */\r\n\r\n#define USBC_ENDPTCTRL0_RXS_MASK                 (0x1U)\r\n#define USBC_ENDPTCTRL0_RXS_SHIFT                (0U)\r\n/*! RXS - RXS */\r\n#define USBC_ENDPTCTRL0_RXS(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL0_RXS_SHIFT)) & USBC_ENDPTCTRL0_RXS_MASK)\r\n\r\n#define USBC_ENDPTCTRL0_UNUSED_1_MASK            (0x2U)\r\n#define USBC_ENDPTCTRL0_UNUSED_1_SHIFT           (1U)\r\n/*! UNUSED_1 - UNUSED_1 */\r\n#define USBC_ENDPTCTRL0_UNUSED_1(x)              (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL0_UNUSED_1_SHIFT)) & USBC_ENDPTCTRL0_UNUSED_1_MASK)\r\n\r\n#define USBC_ENDPTCTRL0_RXT_MASK                 (0xCU)\r\n#define USBC_ENDPTCTRL0_RXT_SHIFT                (2U)\r\n/*! RXT - RXT */\r\n#define USBC_ENDPTCTRL0_RXT(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL0_RXT_SHIFT)) & USBC_ENDPTCTRL0_RXT_MASK)\r\n\r\n#define USBC_ENDPTCTRL0_UNUSED_4_MASK            (0x70U)\r\n#define USBC_ENDPTCTRL0_UNUSED_4_SHIFT           (4U)\r\n/*! UNUSED_4 - UNUSED_4 */\r\n#define USBC_ENDPTCTRL0_UNUSED_4(x)              (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL0_UNUSED_4_SHIFT)) & USBC_ENDPTCTRL0_UNUSED_4_MASK)\r\n\r\n#define USBC_ENDPTCTRL0_RXE_MASK                 (0x80U)\r\n#define USBC_ENDPTCTRL0_RXE_SHIFT                (7U)\r\n/*! RXE - RXE */\r\n#define USBC_ENDPTCTRL0_RXE(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL0_RXE_SHIFT)) & USBC_ENDPTCTRL0_RXE_MASK)\r\n\r\n#define USBC_ENDPTCTRL0_UNUSED_8_MASK            (0xFF00U)\r\n#define USBC_ENDPTCTRL0_UNUSED_8_SHIFT           (8U)\r\n/*! UNUSED_8 - UNUSED_8 */\r\n#define USBC_ENDPTCTRL0_UNUSED_8(x)              (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL0_UNUSED_8_SHIFT)) & USBC_ENDPTCTRL0_UNUSED_8_MASK)\r\n\r\n#define USBC_ENDPTCTRL0_TXS_MASK                 (0x10000U)\r\n#define USBC_ENDPTCTRL0_TXS_SHIFT                (16U)\r\n/*! TXS - TXS */\r\n#define USBC_ENDPTCTRL0_TXS(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL0_TXS_SHIFT)) & USBC_ENDPTCTRL0_TXS_MASK)\r\n\r\n#define USBC_ENDPTCTRL0_UNUSED_17_MASK           (0x20000U)\r\n#define USBC_ENDPTCTRL0_UNUSED_17_SHIFT          (17U)\r\n/*! UNUSED_17 - UNUSED_17 */\r\n#define USBC_ENDPTCTRL0_UNUSED_17(x)             (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL0_UNUSED_17_SHIFT)) & USBC_ENDPTCTRL0_UNUSED_17_MASK)\r\n\r\n#define USBC_ENDPTCTRL0_TXT_MASK                 (0xC0000U)\r\n#define USBC_ENDPTCTRL0_TXT_SHIFT                (18U)\r\n/*! TXT - TXT */\r\n#define USBC_ENDPTCTRL0_TXT(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL0_TXT_SHIFT)) & USBC_ENDPTCTRL0_TXT_MASK)\r\n\r\n#define USBC_ENDPTCTRL0_UNUSED_20_MASK           (0x700000U)\r\n#define USBC_ENDPTCTRL0_UNUSED_20_SHIFT          (20U)\r\n/*! UNUSED_20 - UNUSED_20 */\r\n#define USBC_ENDPTCTRL0_UNUSED_20(x)             (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL0_UNUSED_20_SHIFT)) & USBC_ENDPTCTRL0_UNUSED_20_MASK)\r\n\r\n#define USBC_ENDPTCTRL0_TXE_MASK                 (0x800000U)\r\n#define USBC_ENDPTCTRL0_TXE_SHIFT                (23U)\r\n/*! TXE - TXE */\r\n#define USBC_ENDPTCTRL0_TXE(x)                   (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL0_TXE_SHIFT)) & USBC_ENDPTCTRL0_TXE_MASK)\r\n\r\n#define USBC_ENDPTCTRL0_UNUSED_24_MASK           (0xFF000000U)\r\n#define USBC_ENDPTCTRL0_UNUSED_24_SHIFT          (24U)\r\n/*! UNUSED_24 - UNUSED_24 */\r\n#define USBC_ENDPTCTRL0_UNUSED_24(x)             (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL0_UNUSED_24_SHIFT)) & USBC_ENDPTCTRL0_UNUSED_24_MASK)\r\n/*! @} */\r\n\r\n/*! @name ENDPTCTRL - ENDPTCTRL1..ENDPTCTRL15 */\r\n/*! @{ */\r\n\r\n#define USBC_ENDPTCTRL_RXS_MASK                  (0x1U)\r\n#define USBC_ENDPTCTRL_RXS_SHIFT                 (0U)\r\n/*! RXS - RXS */\r\n#define USBC_ENDPTCTRL_RXS(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL_RXS_SHIFT)) & USBC_ENDPTCTRL_RXS_MASK)\r\n\r\n#define USBC_ENDPTCTRL_RXD_MASK                  (0x2U)\r\n#define USBC_ENDPTCTRL_RXD_SHIFT                 (1U)\r\n/*! RXD - RXD */\r\n#define USBC_ENDPTCTRL_RXD(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL_RXD_SHIFT)) & USBC_ENDPTCTRL_RXD_MASK)\r\n\r\n#define USBC_ENDPTCTRL_RXT_MASK                  (0xCU)\r\n#define USBC_ENDPTCTRL_RXT_SHIFT                 (2U)\r\n/*! RXT - RXT */\r\n#define USBC_ENDPTCTRL_RXT(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL_RXT_SHIFT)) & USBC_ENDPTCTRL_RXT_MASK)\r\n\r\n#define USBC_ENDPTCTRL_UNUSED_4_MASK             (0x10U)\r\n#define USBC_ENDPTCTRL_UNUSED_4_SHIFT            (4U)\r\n/*! UNUSED_4 - UNUSED_4 */\r\n#define USBC_ENDPTCTRL_UNUSED_4(x)               (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL_UNUSED_4_SHIFT)) & USBC_ENDPTCTRL_UNUSED_4_MASK)\r\n\r\n#define USBC_ENDPTCTRL_RXI_MASK                  (0x20U)\r\n#define USBC_ENDPTCTRL_RXI_SHIFT                 (5U)\r\n/*! RXI - RXI */\r\n#define USBC_ENDPTCTRL_RXI(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL_RXI_SHIFT)) & USBC_ENDPTCTRL_RXI_MASK)\r\n\r\n#define USBC_ENDPTCTRL_RXR_MASK                  (0x40U)\r\n#define USBC_ENDPTCTRL_RXR_SHIFT                 (6U)\r\n/*! RXR - ws */\r\n#define USBC_ENDPTCTRL_RXR(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL_RXR_SHIFT)) & USBC_ENDPTCTRL_RXR_MASK)\r\n\r\n#define USBC_ENDPTCTRL_RXE_MASK                  (0x80U)\r\n#define USBC_ENDPTCTRL_RXE_SHIFT                 (7U)\r\n/*! RXE - RXE */\r\n#define USBC_ENDPTCTRL_RXE(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL_RXE_SHIFT)) & USBC_ENDPTCTRL_RXE_MASK)\r\n\r\n#define USBC_ENDPTCTRL_UNUSED_8_MASK             (0xFF00U)\r\n#define USBC_ENDPTCTRL_UNUSED_8_SHIFT            (8U)\r\n/*! UNUSED_8 - UNUSED_8 */\r\n#define USBC_ENDPTCTRL_UNUSED_8(x)               (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL_UNUSED_8_SHIFT)) & USBC_ENDPTCTRL_UNUSED_8_MASK)\r\n\r\n#define USBC_ENDPTCTRL_TXS_MASK                  (0x10000U)\r\n#define USBC_ENDPTCTRL_TXS_SHIFT                 (16U)\r\n/*! TXS - TXS */\r\n#define USBC_ENDPTCTRL_TXS(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL_TXS_SHIFT)) & USBC_ENDPTCTRL_TXS_MASK)\r\n\r\n#define USBC_ENDPTCTRL_TXD_MASK                  (0x20000U)\r\n#define USBC_ENDPTCTRL_TXD_SHIFT                 (17U)\r\n/*! TXD - TXD */\r\n#define USBC_ENDPTCTRL_TXD(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL_TXD_SHIFT)) & USBC_ENDPTCTRL_TXD_MASK)\r\n\r\n#define USBC_ENDPTCTRL_TXT_MASK                  (0xC0000U)\r\n#define USBC_ENDPTCTRL_TXT_SHIFT                 (18U)\r\n/*! TXT - TXT */\r\n#define USBC_ENDPTCTRL_TXT(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL_TXT_SHIFT)) & USBC_ENDPTCTRL_TXT_MASK)\r\n\r\n#define USBC_ENDPTCTRL_UNUSED_20_MASK            (0x100000U)\r\n#define USBC_ENDPTCTRL_UNUSED_20_SHIFT           (20U)\r\n/*! UNUSED_20 - UNUSED_20 */\r\n#define USBC_ENDPTCTRL_UNUSED_20(x)              (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL_UNUSED_20_SHIFT)) & USBC_ENDPTCTRL_UNUSED_20_MASK)\r\n\r\n#define USBC_ENDPTCTRL_TXI_MASK                  (0x200000U)\r\n#define USBC_ENDPTCTRL_TXI_SHIFT                 (21U)\r\n/*! TXI - TXI */\r\n#define USBC_ENDPTCTRL_TXI(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL_TXI_SHIFT)) & USBC_ENDPTCTRL_TXI_MASK)\r\n\r\n#define USBC_ENDPTCTRL_TXR_MASK                  (0x400000U)\r\n#define USBC_ENDPTCTRL_TXR_SHIFT                 (22U)\r\n/*! TXR - ws */\r\n#define USBC_ENDPTCTRL_TXR(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL_TXR_SHIFT)) & USBC_ENDPTCTRL_TXR_MASK)\r\n\r\n#define USBC_ENDPTCTRL_TXE_MASK                  (0x800000U)\r\n#define USBC_ENDPTCTRL_TXE_SHIFT                 (23U)\r\n/*! TXE - TXE */\r\n#define USBC_ENDPTCTRL_TXE(x)                    (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL_TXE_SHIFT)) & USBC_ENDPTCTRL_TXE_MASK)\r\n\r\n#define USBC_ENDPTCTRL_UNUSED_24_MASK            (0xFF000000U)\r\n#define USBC_ENDPTCTRL_UNUSED_24_SHIFT           (24U)\r\n/*! UNUSED_24 - UNUSED_24 */\r\n#define USBC_ENDPTCTRL_UNUSED_24(x)              (((uint32_t)(((uint32_t)(x)) << USBC_ENDPTCTRL_UNUSED_24_SHIFT)) & USBC_ENDPTCTRL_UNUSED_24_MASK)\r\n/*! @} */\r\n\r\n/* The count of USBC_ENDPTCTRL */\r\n#define USBC_ENDPTCTRL_COUNT                     (15U)\r\n\r\n/*! @name PLL_CONTROL_0 - PLL_Control_0 */\r\n/*! @{ */\r\n\r\n#define USBC_PLL_CONTROL_0_REFDIV_MASK           (0x7FU)\r\n#define USBC_PLL_CONTROL_0_REFDIV_SHIFT          (0U)\r\n/*! REFDIV - REFDIV */\r\n#define USBC_PLL_CONTROL_0_REFDIV(x)             (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_0_REFDIV_SHIFT)) & USBC_PLL_CONTROL_0_REFDIV_MASK)\r\n\r\n#define USBC_PLL_CONTROL_0_UNUSED_7_MASK         (0x80U)\r\n#define USBC_PLL_CONTROL_0_UNUSED_7_SHIFT        (7U)\r\n/*! UNUSED_7 - Reserved */\r\n#define USBC_PLL_CONTROL_0_UNUSED_7(x)           (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_0_UNUSED_7_SHIFT)) & USBC_PLL_CONTROL_0_UNUSED_7_MASK)\r\n\r\n#define USBC_PLL_CONTROL_0_ICP_MASK              (0xF00U)\r\n#define USBC_PLL_CONTROL_0_ICP_SHIFT             (8U)\r\n/*! ICP - ICP */\r\n#define USBC_PLL_CONTROL_0_ICP(x)                (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_0_ICP_SHIFT)) & USBC_PLL_CONTROL_0_ICP_MASK)\r\n\r\n#define USBC_PLL_CONTROL_0_VDDM_MASK             (0x3000U)\r\n#define USBC_PLL_CONTROL_0_VDDM_SHIFT            (12U)\r\n/*! VDDM - VDDM */\r\n#define USBC_PLL_CONTROL_0_VDDM(x)               (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_0_VDDM_SHIFT)) & USBC_PLL_CONTROL_0_VDDM_MASK)\r\n\r\n#define USBC_PLL_CONTROL_0_VDDL_MASK             (0xC000U)\r\n#define USBC_PLL_CONTROL_0_VDDL_SHIFT            (14U)\r\n/*! VDDL - VDDL */\r\n#define USBC_PLL_CONTROL_0_VDDL(x)               (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_0_VDDL_SHIFT)) & USBC_PLL_CONTROL_0_VDDL_MASK)\r\n\r\n#define USBC_PLL_CONTROL_0_FBDIV_MASK            (0x1FF0000U)\r\n#define USBC_PLL_CONTROL_0_FBDIV_SHIFT           (16U)\r\n/*! FBDIV - FBDIV */\r\n#define USBC_PLL_CONTROL_0_FBDIV(x)              (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_0_FBDIV_SHIFT)) & USBC_PLL_CONTROL_0_FBDIV_MASK)\r\n\r\n#define USBC_PLL_CONTROL_0_UNUSED_25_MASK        (0xE000000U)\r\n#define USBC_PLL_CONTROL_0_UNUSED_25_SHIFT       (25U)\r\n/*! UNUSED_25 - Reserved */\r\n#define USBC_PLL_CONTROL_0_UNUSED_25(x)          (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_0_UNUSED_25_SHIFT)) & USBC_PLL_CONTROL_0_UNUSED_25_MASK)\r\n\r\n#define USBC_PLL_CONTROL_0_SEL_LPFR_MASK         (0x30000000U)\r\n#define USBC_PLL_CONTROL_0_SEL_LPFR_SHIFT        (28U)\r\n/*! SEL_LPFR - SEL_LPFR */\r\n#define USBC_PLL_CONTROL_0_SEL_LPFR(x)           (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_0_SEL_LPFR_SHIFT)) & USBC_PLL_CONTROL_0_SEL_LPFR_MASK)\r\n\r\n#define USBC_PLL_CONTROL_0_R_ROTATE_MASK         (0x40000000U)\r\n#define USBC_PLL_CONTROL_0_R_ROTATE_SHIFT        (30U)\r\n/*! R_ROTATE - R_ROTATE */\r\n#define USBC_PLL_CONTROL_0_R_ROTATE(x)           (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_0_R_ROTATE_SHIFT)) & USBC_PLL_CONTROL_0_R_ROTATE_MASK)\r\n\r\n#define USBC_PLL_CONTROL_0_PLL_READY_MASK        (0x80000000U)\r\n#define USBC_PLL_CONTROL_0_PLL_READY_SHIFT       (31U)\r\n/*! PLL_READY - PLL_READY */\r\n#define USBC_PLL_CONTROL_0_PLL_READY(x)          (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_0_PLL_READY_SHIFT)) & USBC_PLL_CONTROL_0_PLL_READY_MASK)\r\n/*! @} */\r\n\r\n/*! @name PLL_CONTROL_1 - PLL_Control_1 */\r\n/*! @{ */\r\n\r\n#define USBC_PLL_CONTROL_1_PU_PLL_MASK           (0x1U)\r\n#define USBC_PLL_CONTROL_1_PU_PLL_SHIFT          (0U)\r\n/*! PU_PLL - PU_PLL */\r\n#define USBC_PLL_CONTROL_1_PU_PLL(x)             (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_1_PU_PLL_SHIFT)) & USBC_PLL_CONTROL_1_PU_PLL_MASK)\r\n\r\n#define USBC_PLL_CONTROL_1_PU_PLL_BY_REG_MASK    (0x2U)\r\n#define USBC_PLL_CONTROL_1_PU_PLL_BY_REG_SHIFT   (1U)\r\n/*! PU_PLL_BY_REG - PU_PLL_BY_REG */\r\n#define USBC_PLL_CONTROL_1_PU_PLL_BY_REG(x)      (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_1_PU_PLL_BY_REG_SHIFT)) & USBC_PLL_CONTROL_1_PU_PLL_BY_REG_MASK)\r\n\r\n#define USBC_PLL_CONTROL_1_PLL_RESET_MASK        (0x4U)\r\n#define USBC_PLL_CONTROL_1_PLL_RESET_SHIFT       (2U)\r\n/*! PLL_RESET - PLL_RESET */\r\n#define USBC_PLL_CONTROL_1_PLL_RESET(x)          (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_1_PLL_RESET_SHIFT)) & USBC_PLL_CONTROL_1_PLL_RESET_MASK)\r\n\r\n#define USBC_PLL_CONTROL_1_PLL_SUSPEND_EN_MASK   (0x8U)\r\n#define USBC_PLL_CONTROL_1_PLL_SUSPEND_EN_SHIFT  (3U)\r\n/*! PLL_SUSPEND_EN - PLL_SUSPEND_EN */\r\n#define USBC_PLL_CONTROL_1_PLL_SUSPEND_EN(x)     (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_1_PLL_SUSPEND_EN_SHIFT)) & USBC_PLL_CONTROL_1_PLL_SUSPEND_EN_MASK)\r\n\r\n#define USBC_PLL_CONTROL_1_TESTMON_PLL_MASK      (0xF0U)\r\n#define USBC_PLL_CONTROL_1_TESTMON_PLL_SHIFT     (4U)\r\n/*! TESTMON_PLL - TESTMON_PLL */\r\n#define USBC_PLL_CONTROL_1_TESTMON_PLL(x)        (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_1_TESTMON_PLL_SHIFT)) & USBC_PLL_CONTROL_1_TESTMON_PLL_MASK)\r\n\r\n#define USBC_PLL_CONTROL_1_UNUSED_8_MASK         (0x300U)\r\n#define USBC_PLL_CONTROL_1_UNUSED_8_SHIFT        (8U)\r\n/*! UNUSED_8 - Reserved */\r\n#define USBC_PLL_CONTROL_1_UNUSED_8(x)           (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_1_UNUSED_8_SHIFT)) & USBC_PLL_CONTROL_1_UNUSED_8_MASK)\r\n\r\n#define USBC_PLL_CONTROL_1_TXCLK_EN_MASK         (0x400U)\r\n#define USBC_PLL_CONTROL_1_TXCLK_EN_SHIFT        (10U)\r\n/*! TXCLK_EN - TXCLK_EN */\r\n#define USBC_PLL_CONTROL_1_TXCLK_EN(x)           (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_1_TXCLK_EN_SHIFT)) & USBC_PLL_CONTROL_1_TXCLK_EN_MASK)\r\n\r\n#define USBC_PLL_CONTROL_1_CLK160M_EN_MASK       (0x800U)\r\n#define USBC_PLL_CONTROL_1_CLK160M_EN_SHIFT      (11U)\r\n/*! CLK160M_EN - CLK160M_EN */\r\n#define USBC_PLL_CONTROL_1_CLK160M_EN(x)         (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_1_CLK160M_EN_SHIFT)) & USBC_PLL_CONTROL_1_CLK160M_EN_MASK)\r\n\r\n#define USBC_PLL_CONTROL_1_REFCLK_SEL_MASK       (0x1000U)\r\n#define USBC_PLL_CONTROL_1_REFCLK_SEL_SHIFT      (12U)\r\n/*! REFCLK_SEL - REFCLK_SEL */\r\n#define USBC_PLL_CONTROL_1_REFCLK_SEL(x)         (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_1_REFCLK_SEL_SHIFT)) & USBC_PLL_CONTROL_1_REFCLK_SEL_MASK)\r\n\r\n#define USBC_PLL_CONTROL_1_CLK_BLK_EN_MASK       (0x2000U)\r\n#define USBC_PLL_CONTROL_1_CLK_BLK_EN_SHIFT      (13U)\r\n/*! CLK_BLK_EN - CLK_BLK_EN */\r\n#define USBC_PLL_CONTROL_1_CLK_BLK_EN(x)         (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_1_CLK_BLK_EN_SHIFT)) & USBC_PLL_CONTROL_1_CLK_BLK_EN_MASK)\r\n\r\n#define USBC_PLL_CONTROL_1_PLL_STRESS_TEST_MASK  (0x4000U)\r\n#define USBC_PLL_CONTROL_1_PLL_STRESS_TEST_SHIFT (14U)\r\n/*! PLL_STRESS_TEST - PLL_STRESS_TEST */\r\n#define USBC_PLL_CONTROL_1_PLL_STRESS_TEST(x)    (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_1_PLL_STRESS_TEST_SHIFT)) & USBC_PLL_CONTROL_1_PLL_STRESS_TEST_MASK)\r\n\r\n#define USBC_PLL_CONTROL_1_UNUSED_15_MASK        (0xFFFF8000U)\r\n#define USBC_PLL_CONTROL_1_UNUSED_15_SHIFT       (15U)\r\n/*! UNUSED_15 - Reserved */\r\n#define USBC_PLL_CONTROL_1_UNUSED_15(x)          (((uint32_t)(((uint32_t)(x)) << USBC_PLL_CONTROL_1_UNUSED_15_SHIFT)) & USBC_PLL_CONTROL_1_UNUSED_15_MASK)\r\n/*! @} */\r\n\r\n/*! @name CALIBRATION_CONTROL - CALIBRATION_Control */\r\n/*! @{ */\r\n\r\n#define USBC_CALIBRATION_CONTROL_EXT_FS_IMP_MASK (0xFU)\r\n#define USBC_CALIBRATION_CONTROL_EXT_FS_IMP_SHIFT (0U)\r\n/*! EXT_FS_IMP - EXT_FS_IMP */\r\n#define USBC_CALIBRATION_CONTROL_EXT_FS_IMP(x)   (((uint32_t)(((uint32_t)(x)) << USBC_CALIBRATION_CONTROL_EXT_FS_IMP_SHIFT)) & USBC_CALIBRATION_CONTROL_EXT_FS_IMP_MASK)\r\n\r\n#define USBC_CALIBRATION_CONTROL_EXT_RCAL_MASK   (0xF0U)\r\n#define USBC_CALIBRATION_CONTROL_EXT_RCAL_SHIFT  (4U)\r\n/*! EXT_RCAL - EXT_RCAL */\r\n#define USBC_CALIBRATION_CONTROL_EXT_RCAL(x)     (((uint32_t)(((uint32_t)(x)) << USBC_CALIBRATION_CONTROL_EXT_RCAL_SHIFT)) & USBC_CALIBRATION_CONTROL_EXT_RCAL_MASK)\r\n\r\n#define USBC_CALIBRATION_CONTROL_IMPCAL_VTH_MASK (0x700U)\r\n#define USBC_CALIBRATION_CONTROL_IMPCAL_VTH_SHIFT (8U)\r\n/*! IMPCAL_VTH - IMPCAL_VTH */\r\n#define USBC_CALIBRATION_CONTROL_IMPCAL_VTH(x)   (((uint32_t)(((uint32_t)(x)) << USBC_CALIBRATION_CONTROL_IMPCAL_VTH_SHIFT)) & USBC_CALIBRATION_CONTROL_IMPCAL_VTH_MASK)\r\n\r\n#define USBC_CALIBRATION_CONTROL_EXT_FS_IMP_EN_MASK (0x800U)\r\n#define USBC_CALIBRATION_CONTROL_EXT_FS_IMP_EN_SHIFT (11U)\r\n/*! EXT_FS_IMP_EN - EXT_FS_IMP_EN */\r\n#define USBC_CALIBRATION_CONTROL_EXT_FS_IMP_EN(x) (((uint32_t)(((uint32_t)(x)) << USBC_CALIBRATION_CONTROL_EXT_FS_IMP_EN_SHIFT)) & USBC_CALIBRATION_CONTROL_EXT_FS_IMP_EN_MASK)\r\n\r\n#define USBC_CALIBRATION_CONTROL_EXT_RCAL_EN_MASK (0x1000U)\r\n#define USBC_CALIBRATION_CONTROL_EXT_RCAL_EN_SHIFT (12U)\r\n/*! EXT_RCAL_EN - EXT_RCAL_EN */\r\n#define USBC_CALIBRATION_CONTROL_EXT_RCAL_EN(x)  (((uint32_t)(((uint32_t)(x)) << USBC_CALIBRATION_CONTROL_EXT_RCAL_EN_SHIFT)) & USBC_CALIBRATION_CONTROL_EXT_RCAL_EN_MASK)\r\n\r\n#define USBC_CALIBRATION_CONTROL_IMPCAL_START_MASK (0x2000U)\r\n#define USBC_CALIBRATION_CONTROL_IMPCAL_START_SHIFT (13U)\r\n/*! IMPCAL_START - IMPCAL_START */\r\n#define USBC_CALIBRATION_CONTROL_IMPCAL_START(x) (((uint32_t)(((uint32_t)(x)) << USBC_CALIBRATION_CONTROL_IMPCAL_START_SHIFT)) & USBC_CALIBRATION_CONTROL_IMPCAL_START_MASK)\r\n\r\n#define USBC_CALIBRATION_CONTROL_IMPCAL_POL_MASK (0x4000U)\r\n#define USBC_CALIBRATION_CONTROL_IMPCAL_POL_SHIFT (14U)\r\n/*! IMPCAL_POL - IMPCAL_POL */\r\n#define USBC_CALIBRATION_CONTROL_IMPCAL_POL(x)   (((uint32_t)(((uint32_t)(x)) << USBC_CALIBRATION_CONTROL_IMPCAL_POL_SHIFT)) & USBC_CALIBRATION_CONTROL_IMPCAL_POL_MASK)\r\n\r\n#define USBC_CALIBRATION_CONTROL_VCOCAL_POL_MASK (0x8000U)\r\n#define USBC_CALIBRATION_CONTROL_VCOCAL_POL_SHIFT (15U)\r\n/*! VCOCAL_POL - VCOCAL_POL */\r\n#define USBC_CALIBRATION_CONTROL_VCOCAL_POL(x)   (((uint32_t)(((uint32_t)(x)) << USBC_CALIBRATION_CONTROL_VCOCAL_POL_SHIFT)) & USBC_CALIBRATION_CONTROL_VCOCAL_POL_MASK)\r\n\r\n#define USBC_CALIBRATION_CONTROL_KVCO_MASK       (0x70000U)\r\n#define USBC_CALIBRATION_CONTROL_KVCO_SHIFT      (16U)\r\n/*! KVCO - KVCO */\r\n#define USBC_CALIBRATION_CONTROL_KVCO(x)         (((uint32_t)(((uint32_t)(x)) << USBC_CALIBRATION_CONTROL_KVCO_SHIFT)) & USBC_CALIBRATION_CONTROL_KVCO_MASK)\r\n\r\n#define USBC_CALIBRATION_CONTROL_KVCO_EXT_MASK   (0x80000U)\r\n#define USBC_CALIBRATION_CONTROL_KVCO_EXT_SHIFT  (19U)\r\n/*! KVCO_EXT - KVCO_EXT */\r\n#define USBC_CALIBRATION_CONTROL_KVCO_EXT(x)     (((uint32_t)(((uint32_t)(x)) << USBC_CALIBRATION_CONTROL_KVCO_EXT_SHIFT)) & USBC_CALIBRATION_CONTROL_KVCO_EXT_MASK)\r\n\r\n#define USBC_CALIBRATION_CONTROL_PLLCAL_MASK     (0x300000U)\r\n#define USBC_CALIBRATION_CONTROL_PLLCAL_SHIFT    (20U)\r\n/*! PLLCAL - PLLCAL */\r\n#define USBC_CALIBRATION_CONTROL_PLLCAL(x)       (((uint32_t)(((uint32_t)(x)) << USBC_CALIBRATION_CONTROL_PLLCAL_SHIFT)) & USBC_CALIBRATION_CONTROL_PLLCAL_MASK)\r\n\r\n#define USBC_CALIBRATION_CONTROL_PLLCAL_START_MASK (0x400000U)\r\n#define USBC_CALIBRATION_CONTROL_PLLCAL_START_SHIFT (22U)\r\n/*! PLLCAL_START - PLLCAL_START */\r\n#define USBC_CALIBRATION_CONTROL_PLLCAL_START(x) (((uint32_t)(((uint32_t)(x)) << USBC_CALIBRATION_CONTROL_PLLCAL_START_SHIFT)) & USBC_CALIBRATION_CONTROL_PLLCAL_START_MASK)\r\n\r\n#define USBC_CALIBRATION_CONTROL_IMPCAL_DONE_MASK (0x800000U)\r\n#define USBC_CALIBRATION_CONTROL_IMPCAL_DONE_SHIFT (23U)\r\n/*! IMPCAL_DONE - IMPCAL_DONE */\r\n#define USBC_CALIBRATION_CONTROL_IMPCAL_DONE(x)  (((uint32_t)(((uint32_t)(x)) << USBC_CALIBRATION_CONTROL_IMPCAL_DONE_SHIFT)) & USBC_CALIBRATION_CONTROL_IMPCAL_DONE_MASK)\r\n\r\n#define USBC_CALIBRATION_CONTROL_CURRENT_IMP_MASK (0xF000000U)\r\n#define USBC_CALIBRATION_CONTROL_CURRENT_IMP_SHIFT (24U)\r\n/*! CURRENT_IMP - CURRENT_IMP */\r\n#define USBC_CALIBRATION_CONTROL_CURRENT_IMP(x)  (((uint32_t)(((uint32_t)(x)) << USBC_CALIBRATION_CONTROL_CURRENT_IMP_SHIFT)) & USBC_CALIBRATION_CONTROL_CURRENT_IMP_MASK)\r\n\r\n#define USBC_CALIBRATION_CONTROL_CURRENT_KVCO_MASK (0x70000000U)\r\n#define USBC_CALIBRATION_CONTROL_CURRENT_KVCO_SHIFT (28U)\r\n/*! CURRENT_KVCO - CURRENT_KVCO */\r\n#define USBC_CALIBRATION_CONTROL_CURRENT_KVCO(x) (((uint32_t)(((uint32_t)(x)) << USBC_CALIBRATION_CONTROL_CURRENT_KVCO_SHIFT)) & USBC_CALIBRATION_CONTROL_CURRENT_KVCO_MASK)\r\n\r\n#define USBC_CALIBRATION_CONTROL_PLLCAL_DONE_MASK (0x80000000U)\r\n#define USBC_CALIBRATION_CONTROL_PLLCAL_DONE_SHIFT (31U)\r\n/*! PLLCAL_DONE - PLLCAL_DONE */\r\n#define USBC_CALIBRATION_CONTROL_PLLCAL_DONE(x)  (((uint32_t)(((uint32_t)(x)) << USBC_CALIBRATION_CONTROL_PLLCAL_DONE_SHIFT)) & USBC_CALIBRATION_CONTROL_PLLCAL_DONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name TX_CHANNEL_CONTRL_0 - Tx_Channel_Contrl_0 */\r\n/*! @{ */\r\n\r\n#define USBC_TX_CHANNEL_CONTRL_0_HSDRV_EN_MASK   (0xFU)\r\n#define USBC_TX_CHANNEL_CONTRL_0_HSDRV_EN_SHIFT  (0U)\r\n/*! HSDRV_EN - HSDRV_EN */\r\n#define USBC_TX_CHANNEL_CONTRL_0_HSDRV_EN(x)     (((uint32_t)(((uint32_t)(x)) << USBC_TX_CHANNEL_CONTRL_0_HSDRV_EN_SHIFT)) & USBC_TX_CHANNEL_CONTRL_0_HSDRV_EN_MASK)\r\n\r\n#define USBC_TX_CHANNEL_CONTRL_0_HS_SR_SEL_MASK  (0x30U)\r\n#define USBC_TX_CHANNEL_CONTRL_0_HS_SR_SEL_SHIFT (4U)\r\n/*! HS_SR_SEL - HS_SR_SEL */\r\n#define USBC_TX_CHANNEL_CONTRL_0_HS_SR_SEL(x)    (((uint32_t)(((uint32_t)(x)) << USBC_TX_CHANNEL_CONTRL_0_HS_SR_SEL_SHIFT)) & USBC_TX_CHANNEL_CONTRL_0_HS_SR_SEL_MASK)\r\n\r\n#define USBC_TX_CHANNEL_CONTRL_0_LOWVDD_EN_MASK  (0x40U)\r\n#define USBC_TX_CHANNEL_CONTRL_0_LOWVDD_EN_SHIFT (6U)\r\n/*! LOWVDD_EN - LOWVDD_EN */\r\n#define USBC_TX_CHANNEL_CONTRL_0_LOWVDD_EN(x)    (((uint32_t)(((uint32_t)(x)) << USBC_TX_CHANNEL_CONTRL_0_LOWVDD_EN_SHIFT)) & USBC_TX_CHANNEL_CONTRL_0_LOWVDD_EN_MASK)\r\n\r\n#define USBC_TX_CHANNEL_CONTRL_0_UNUSED_7_MASK   (0x80U)\r\n#define USBC_TX_CHANNEL_CONTRL_0_UNUSED_7_SHIFT  (7U)\r\n/*! UNUSED_7 - Reserved */\r\n#define USBC_TX_CHANNEL_CONTRL_0_UNUSED_7(x)     (((uint32_t)(((uint32_t)(x)) << USBC_TX_CHANNEL_CONTRL_0_UNUSED_7_SHIFT)) & USBC_TX_CHANNEL_CONTRL_0_UNUSED_7_MASK)\r\n\r\n#define USBC_TX_CHANNEL_CONTRL_0_FSDRV_EN_MASK   (0xF00U)\r\n#define USBC_TX_CHANNEL_CONTRL_0_FSDRV_EN_SHIFT  (8U)\r\n/*! FSDRV_EN - FSDRV_EN */\r\n#define USBC_TX_CHANNEL_CONTRL_0_FSDRV_EN(x)     (((uint32_t)(((uint32_t)(x)) << USBC_TX_CHANNEL_CONTRL_0_FSDRV_EN_SHIFT)) & USBC_TX_CHANNEL_CONTRL_0_FSDRV_EN_MASK)\r\n\r\n#define USBC_TX_CHANNEL_CONTRL_0_DRV_EN_LS_MASK  (0xF000U)\r\n#define USBC_TX_CHANNEL_CONTRL_0_DRV_EN_LS_SHIFT (12U)\r\n/*! DRV_EN_LS - DRV_EN_LS */\r\n#define USBC_TX_CHANNEL_CONTRL_0_DRV_EN_LS(x)    (((uint32_t)(((uint32_t)(x)) << USBC_TX_CHANNEL_CONTRL_0_DRV_EN_LS_SHIFT)) & USBC_TX_CHANNEL_CONTRL_0_DRV_EN_LS_MASK)\r\n\r\n#define USBC_TX_CHANNEL_CONTRL_0_IMP_SEL_LS_MASK (0xF0000U)\r\n#define USBC_TX_CHANNEL_CONTRL_0_IMP_SEL_LS_SHIFT (16U)\r\n/*! IMP_SEL_LS - IMP_SEL_LS */\r\n#define USBC_TX_CHANNEL_CONTRL_0_IMP_SEL_LS(x)   (((uint32_t)(((uint32_t)(x)) << USBC_TX_CHANNEL_CONTRL_0_IMP_SEL_LS_SHIFT)) & USBC_TX_CHANNEL_CONTRL_0_IMP_SEL_LS_MASK)\r\n\r\n#define USBC_TX_CHANNEL_CONTRL_0_AMP_MASK        (0x700000U)\r\n#define USBC_TX_CHANNEL_CONTRL_0_AMP_SHIFT       (20U)\r\n/*! AMP - AMP */\r\n#define USBC_TX_CHANNEL_CONTRL_0_AMP(x)          (((uint32_t)(((uint32_t)(x)) << USBC_TX_CHANNEL_CONTRL_0_AMP_SHIFT)) & USBC_TX_CHANNEL_CONTRL_0_AMP_MASK)\r\n\r\n#define USBC_TX_CHANNEL_CONTRL_0_PU_VDDR18_MASK  (0x800000U)\r\n#define USBC_TX_CHANNEL_CONTRL_0_PU_VDDR18_SHIFT (23U)\r\n/*! PU_VDDR18 - PU_VDDR18 */\r\n#define USBC_TX_CHANNEL_CONTRL_0_PU_VDDR18(x)    (((uint32_t)(((uint32_t)(x)) << USBC_TX_CHANNEL_CONTRL_0_PU_VDDR18_SHIFT)) & USBC_TX_CHANNEL_CONTRL_0_PU_VDDR18_MASK)\r\n\r\n#define USBC_TX_CHANNEL_CONTRL_0_PU_ANA_MASK     (0x1000000U)\r\n#define USBC_TX_CHANNEL_CONTRL_0_PU_ANA_SHIFT    (24U)\r\n/*! PU_ANA - PU_ANA */\r\n#define USBC_TX_CHANNEL_CONTRL_0_PU_ANA(x)       (((uint32_t)(((uint32_t)(x)) << USBC_TX_CHANNEL_CONTRL_0_PU_ANA_SHIFT)) & USBC_TX_CHANNEL_CONTRL_0_PU_ANA_MASK)\r\n\r\n#define USBC_TX_CHANNEL_CONTRL_0_PU_BY_REG_MASK  (0x2000000U)\r\n#define USBC_TX_CHANNEL_CONTRL_0_PU_BY_REG_SHIFT (25U)\r\n/*! PU_BY_REG - PU_BY_REG */\r\n#define USBC_TX_CHANNEL_CONTRL_0_PU_BY_REG(x)    (((uint32_t)(((uint32_t)(x)) << USBC_TX_CHANNEL_CONTRL_0_PU_BY_REG_SHIFT)) & USBC_TX_CHANNEL_CONTRL_0_PU_BY_REG_MASK)\r\n\r\n#define USBC_TX_CHANNEL_CONTRL_0_UNUSED_26_MASK  (0xFC000000U)\r\n#define USBC_TX_CHANNEL_CONTRL_0_UNUSED_26_SHIFT (26U)\r\n/*! UNUSED_26 - Reserved */\r\n#define USBC_TX_CHANNEL_CONTRL_0_UNUSED_26(x)    (((uint32_t)(((uint32_t)(x)) << USBC_TX_CHANNEL_CONTRL_0_UNUSED_26_SHIFT)) & USBC_TX_CHANNEL_CONTRL_0_UNUSED_26_MASK)\r\n/*! @} */\r\n\r\n/*! @name TX_CHANNEL_CONTRL_1 - Tx_Channel_Contrl_1 */\r\n/*! @{ */\r\n\r\n#define USBC_TX_CHANNEL_CONTRL_1_UNUSED_0_MASK   (0xFFFFFFFFU)\r\n#define USBC_TX_CHANNEL_CONTRL_1_UNUSED_0_SHIFT  (0U)\r\n/*! UNUSED_0 - Reserved */\r\n#define USBC_TX_CHANNEL_CONTRL_1_UNUSED_0(x)     (((uint32_t)(((uint32_t)(x)) << USBC_TX_CHANNEL_CONTRL_1_UNUSED_0_SHIFT)) & USBC_TX_CHANNEL_CONTRL_1_UNUSED_0_MASK)\r\n/*! @} */\r\n\r\n/*! @name RX_CHANNEL_CONTRL_0 - Rx_Channel_Contrl_0 */\r\n/*! @{ */\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_THRESH_MASK  (0xFU)\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_THRESH_SHIFT (0U)\r\n/*! SQ_THRESH - SQ_THRESH */\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_THRESH(x)    (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_0_SQ_THRESH_SHIFT)) & USBC_RX_CHANNEL_CONTRL_0_SQ_THRESH_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_0_RXVDD18_MASK    (0x30U)\r\n#define USBC_RX_CHANNEL_CONTRL_0_RXVDD18_SHIFT   (4U)\r\n/*! RXVDD18 - RXVDD18 */\r\n#define USBC_RX_CHANNEL_CONTRL_0_RXVDD18(x)      (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_0_RXVDD18_SHIFT)) & USBC_RX_CHANNEL_CONTRL_0_RXVDD18_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_0_RXVDDL_MASK     (0xC0U)\r\n#define USBC_RX_CHANNEL_CONTRL_0_RXVDDL_SHIFT    (6U)\r\n/*! RXVDDL - RXVDDL */\r\n#define USBC_RX_CHANNEL_CONTRL_0_RXVDDL(x)       (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_0_RXVDDL_SHIFT)) & USBC_RX_CHANNEL_CONTRL_0_RXVDDL_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_0_DISCON_THRESH_MASK (0x300U)\r\n#define USBC_RX_CHANNEL_CONTRL_0_DISCON_THRESH_SHIFT (8U)\r\n/*! DISCON_THRESH - DISCON_THRESH */\r\n#define USBC_RX_CHANNEL_CONTRL_0_DISCON_THRESH(x) (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_0_DISCON_THRESH_SHIFT)) & USBC_RX_CHANNEL_CONTRL_0_DISCON_THRESH_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_0_LINESTATE_EN_MASK (0x400U)\r\n#define USBC_RX_CHANNEL_CONTRL_0_LINESTATE_EN_SHIFT (10U)\r\n/*! LINESTATE_EN - LINESTATE_EN */\r\n#define USBC_RX_CHANNEL_CONTRL_0_LINESTATE_EN(x) (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_0_LINESTATE_EN_SHIFT)) & USBC_RX_CHANNEL_CONTRL_0_LINESTATE_EN_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_0_UNUSED_11_MASK  (0x800U)\r\n#define USBC_RX_CHANNEL_CONTRL_0_UNUSED_11_SHIFT (11U)\r\n/*! UNUSED_11 - Reserved */\r\n#define USBC_RX_CHANNEL_CONTRL_0_UNUSED_11(x)    (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_0_UNUSED_11_SHIFT)) & USBC_RX_CHANNEL_CONTRL_0_UNUSED_11_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_DLY_SEL_MASK (0x3000U)\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_DLY_SEL_SHIFT (12U)\r\n/*! SQ_DLY_SEL - SQ_DLY_SEL */\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_DLY_SEL(x)   (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_0_SQ_DLY_SEL_SHIFT)) & USBC_RX_CHANNEL_CONTRL_0_SQ_DLY_SEL_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_CM_SEL_MASK  (0x4000U)\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_CM_SEL_SHIFT (14U)\r\n/*! SQ_CM_SEL - SQ_CM_SEL */\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_CM_SEL(x)    (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_0_SQ_CM_SEL_SHIFT)) & USBC_RX_CHANNEL_CONTRL_0_SQ_CM_SEL_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_DET_EN_MASK  (0x8000U)\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_DET_EN_SHIFT (15U)\r\n/*! SQ_DET_EN - SQ_DET_EN */\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_DET_EN(x)    (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_0_SQ_DET_EN_SHIFT)) & USBC_RX_CHANNEL_CONTRL_0_SQ_DET_EN_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_VHL_SEL_MASK (0x10000U)\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_VHL_SEL_SHIFT (16U)\r\n/*! SQ_VHL_SEL - SQ_VHL_SEL */\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_VHL_SEL(x)   (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_0_SQ_VHL_SEL_SHIFT)) & USBC_RX_CHANNEL_CONTRL_0_SQ_VHL_SEL_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_0_UNUSED_17_MASK  (0x60000U)\r\n#define USBC_RX_CHANNEL_CONTRL_0_UNUSED_17_SHIFT (17U)\r\n/*! UNUSED_17 - Reserved */\r\n#define USBC_RX_CHANNEL_CONTRL_0_UNUSED_17(x)    (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_0_UNUSED_17_SHIFT)) & USBC_RX_CHANNEL_CONTRL_0_UNUSED_17_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_0_STRESS_TEST_MODE_MASK (0x80000U)\r\n#define USBC_RX_CHANNEL_CONTRL_0_STRESS_TEST_MODE_SHIFT (19U)\r\n/*! STRESS_TEST_MODE - STRESS_TEST_MODE */\r\n#define USBC_RX_CHANNEL_CONTRL_0_STRESS_TEST_MODE(x) (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_0_STRESS_TEST_MODE_SHIFT)) & USBC_RX_CHANNEL_CONTRL_0_STRESS_TEST_MODE_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_0_TESTMON_MASK    (0xF00000U)\r\n#define USBC_RX_CHANNEL_CONTRL_0_TESTMON_SHIFT   (20U)\r\n/*! TESTMON - TESTMON */\r\n#define USBC_RX_CHANNEL_CONTRL_0_TESTMON(x)      (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_0_TESTMON_SHIFT)) & USBC_RX_CHANNEL_CONTRL_0_TESTMON_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_0_RESET_EXT_EN_MASK (0x1000000U)\r\n#define USBC_RX_CHANNEL_CONTRL_0_RESET_EXT_EN_SHIFT (24U)\r\n/*! RESET_EXT_EN - RESET_EXT_EN */\r\n#define USBC_RX_CHANNEL_CONTRL_0_RESET_EXT_EN(x) (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_0_RESET_EXT_EN_SHIFT)) & USBC_RX_CHANNEL_CONTRL_0_RESET_EXT_EN_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_0_RESET_EXT_MASK  (0x2000000U)\r\n#define USBC_RX_CHANNEL_CONTRL_0_RESET_EXT_SHIFT (25U)\r\n/*! RESET_EXT - RESET_EXT */\r\n#define USBC_RX_CHANNEL_CONTRL_0_RESET_EXT(x)    (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_0_RESET_EXT_SHIFT)) & USBC_RX_CHANNEL_CONTRL_0_RESET_EXT_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_ANA_VREF_MASK (0xC000000U)\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_ANA_VREF_SHIFT (26U)\r\n/*! SQ_ANA_VREF - SQ_ANA_VREF */\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_ANA_VREF(x)  (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_0_SQ_ANA_VREF_SHIFT)) & USBC_RX_CHANNEL_CONTRL_0_SQ_ANA_VREF_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_ANA_DTC_SEL_MASK (0x10000000U)\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_ANA_DTC_SEL_SHIFT (28U)\r\n/*! SQ_ANA_DTC_SEL - SQ_ANA_DTC_SEL */\r\n#define USBC_RX_CHANNEL_CONTRL_0_SQ_ANA_DTC_SEL(x) (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_0_SQ_ANA_DTC_SEL_SHIFT)) & USBC_RX_CHANNEL_CONTRL_0_SQ_ANA_DTC_SEL_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_0_CHIRPMODE_SEL_MASK (0x20000000U)\r\n#define USBC_RX_CHANNEL_CONTRL_0_CHIRPMODE_SEL_SHIFT (29U)\r\n/*! CHIRPMODE_SEL - CHIRPMODE_SEL */\r\n#define USBC_RX_CHANNEL_CONTRL_0_CHIRPMODE_SEL(x) (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_0_CHIRPMODE_SEL_SHIFT)) & USBC_RX_CHANNEL_CONTRL_0_CHIRPMODE_SEL_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_0_UNUSED_30_MASK  (0xC0000000U)\r\n#define USBC_RX_CHANNEL_CONTRL_0_UNUSED_30_SHIFT (30U)\r\n/*! UNUSED_30 - Reserved */\r\n#define USBC_RX_CHANNEL_CONTRL_0_UNUSED_30(x)    (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_0_UNUSED_30_SHIFT)) & USBC_RX_CHANNEL_CONTRL_0_UNUSED_30_MASK)\r\n/*! @} */\r\n\r\n/*! @name RX_CHANNEL_CONTRL_1 - Rx_Channel_Contrl_1 */\r\n/*! @{ */\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_1_EXT_SQ_AMP_CAL_MASK (0x7U)\r\n#define USBC_RX_CHANNEL_CONTRL_1_EXT_SQ_AMP_CAL_SHIFT (0U)\r\n/*! EXT_SQ_AMP_CAL - EXT_SQ_AMP_CAL */\r\n#define USBC_RX_CHANNEL_CONTRL_1_EXT_SQ_AMP_CAL(x) (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_1_EXT_SQ_AMP_CAL_SHIFT)) & USBC_RX_CHANNEL_CONTRL_1_EXT_SQ_AMP_CAL_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_1_EXT_SQ_AMP_CAL_EN_MASK (0x8U)\r\n#define USBC_RX_CHANNEL_CONTRL_1_EXT_SQ_AMP_CAL_EN_SHIFT (3U)\r\n/*! EXT_SQ_AMP_CAL_EN - EXT_SQ_AMP_CAL_EN */\r\n#define USBC_RX_CHANNEL_CONTRL_1_EXT_SQ_AMP_CAL_EN(x) (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_1_EXT_SQ_AMP_CAL_EN_SHIFT)) & USBC_RX_CHANNEL_CONTRL_1_EXT_SQ_AMP_CAL_EN_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_1_REQ_SQCAL_START_MASK (0x10U)\r\n#define USBC_RX_CHANNEL_CONTRL_1_REQ_SQCAL_START_SHIFT (4U)\r\n/*! REQ_SQCAL_START - REQ_SQCAL_START */\r\n#define USBC_RX_CHANNEL_CONTRL_1_REQ_SQCAL_START(x) (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_1_REQ_SQCAL_START_SHIFT)) & USBC_RX_CHANNEL_CONTRL_1_REQ_SQCAL_START_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_1_REG_SQ_UD_SWAP_MASK (0x20U)\r\n#define USBC_RX_CHANNEL_CONTRL_1_REG_SQ_UD_SWAP_SHIFT (5U)\r\n/*! REG_SQ_UD_SWAP - REG_SQ_UD_SWAP */\r\n#define USBC_RX_CHANNEL_CONTRL_1_REG_SQ_UD_SWAP(x) (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_1_REG_SQ_UD_SWAP_SHIFT)) & USBC_RX_CHANNEL_CONTRL_1_REG_SQ_UD_SWAP_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_1_SQ_DPDM_AMP_SEL_MASK (0xC0U)\r\n#define USBC_RX_CHANNEL_CONTRL_1_SQ_DPDM_AMP_SEL_SHIFT (6U)\r\n/*! SQ_DPDM_AMP_SEL - SQ_DPDM_AMP_SEL */\r\n#define USBC_RX_CHANNEL_CONTRL_1_SQ_DPDM_AMP_SEL(x) (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_1_SQ_DPDM_AMP_SEL_SHIFT)) & USBC_RX_CHANNEL_CONTRL_1_SQ_DPDM_AMP_SEL_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_1_UNUSED_8_MASK   (0x7FFFFF00U)\r\n#define USBC_RX_CHANNEL_CONTRL_1_UNUSED_8_SHIFT  (8U)\r\n/*! UNUSED_8 - Reserved */\r\n#define USBC_RX_CHANNEL_CONTRL_1_UNUSED_8(x)     (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_1_UNUSED_8_SHIFT)) & USBC_RX_CHANNEL_CONTRL_1_UNUSED_8_MASK)\r\n\r\n#define USBC_RX_CHANNEL_CONTRL_1_REG_SQCAL_DONE_MASK (0x80000000U)\r\n#define USBC_RX_CHANNEL_CONTRL_1_REG_SQCAL_DONE_SHIFT (31U)\r\n/*! REG_SQCAL_DONE - REG_SQCAL_DONE */\r\n#define USBC_RX_CHANNEL_CONTRL_1_REG_SQCAL_DONE(x) (((uint32_t)(((uint32_t)(x)) << USBC_RX_CHANNEL_CONTRL_1_REG_SQCAL_DONE_SHIFT)) & USBC_RX_CHANNEL_CONTRL_1_REG_SQCAL_DONE_MASK)\r\n/*! @} */\r\n\r\n/*! @name DIGITAL_CONTRL_0 - Digital_Contrl_0 */\r\n/*! @{ */\r\n\r\n#define USBC_DIGITAL_CONTRL_0_SYNC_NUM_MASK      (0x3U)\r\n#define USBC_DIGITAL_CONTRL_0_SYNC_NUM_SHIFT     (0U)\r\n/*! SYNC_NUM - SYNC_NUM */\r\n#define USBC_DIGITAL_CONTRL_0_SYNC_NUM(x)        (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_SYNC_NUM_SHIFT)) & USBC_DIGITAL_CONTRL_0_SYNC_NUM_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_SYNCDET_WIN32_MASK (0x4U)\r\n#define USBC_DIGITAL_CONTRL_0_SYNCDET_WIN32_SHIFT (2U)\r\n/*! SYNCDET_WIN32 - SYNCDET_WIN32 */\r\n#define USBC_DIGITAL_CONTRL_0_SYNCDET_WIN32(x)   (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_SYNCDET_WIN32_SHIFT)) & USBC_DIGITAL_CONTRL_0_SYNCDET_WIN32_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_SYNCDET_WINDOW_EN_MASK (0x8U)\r\n#define USBC_DIGITAL_CONTRL_0_SYNCDET_WINDOW_EN_SHIFT (3U)\r\n/*! SYNCDET_WINDOW_EN - SYNCDET_WINDOW_EN */\r\n#define USBC_DIGITAL_CONTRL_0_SYNCDET_WINDOW_EN(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_SYNCDET_WINDOW_EN_SHIFT)) & USBC_DIGITAL_CONTRL_0_SYNCDET_WINDOW_EN_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_HOST_DISCON_SEL0_MASK (0x10U)\r\n#define USBC_DIGITAL_CONTRL_0_HOST_DISCON_SEL0_SHIFT (4U)\r\n/*! HOST_DISCON_SEL0 - HOST_DISCON_SEL0 */\r\n#define USBC_DIGITAL_CONTRL_0_HOST_DISCON_SEL0(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_HOST_DISCON_SEL0_SHIFT)) & USBC_DIGITAL_CONTRL_0_HOST_DISCON_SEL0_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_HOST_DISCON_SEL1_MASK (0x20U)\r\n#define USBC_DIGITAL_CONTRL_0_HOST_DISCON_SEL1_SHIFT (5U)\r\n/*! HOST_DISCON_SEL1 - HOST_DISCON_SEL1 */\r\n#define USBC_DIGITAL_CONTRL_0_HOST_DISCON_SEL1(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_HOST_DISCON_SEL1_SHIFT)) & USBC_DIGITAL_CONTRL_0_HOST_DISCON_SEL1_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_UNUSED_6_MASK      (0x40U)\r\n#define USBC_DIGITAL_CONTRL_0_UNUSED_6_SHIFT     (6U)\r\n/*! UNUSED_6 - Reserved */\r\n#define USBC_DIGITAL_CONTRL_0_UNUSED_6(x)        (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_UNUSED_6_SHIFT)) & USBC_DIGITAL_CONTRL_0_UNUSED_6_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_PLL_LOCK_BYPASS_MASK (0x80U)\r\n#define USBC_DIGITAL_CONTRL_0_PLL_LOCK_BYPASS_SHIFT (7U)\r\n/*! PLL_LOCK_BYPASS - PLL_LOCK_BYPASS */\r\n#define USBC_DIGITAL_CONTRL_0_PLL_LOCK_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_PLL_LOCK_BYPASS_SHIFT)) & USBC_DIGITAL_CONTRL_0_PLL_LOCK_BYPASS_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_LONG_EOP_MASK      (0x100U)\r\n#define USBC_DIGITAL_CONTRL_0_LONG_EOP_SHIFT     (8U)\r\n/*! LONG_EOP - LONG_EOP */\r\n#define USBC_DIGITAL_CONTRL_0_LONG_EOP(x)        (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_LONG_EOP_SHIFT)) & USBC_DIGITAL_CONTRL_0_LONG_EOP_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_RXFILT1_EN_MASK    (0x200U)\r\n#define USBC_DIGITAL_CONTRL_0_RXFILT1_EN_SHIFT   (9U)\r\n/*! RXFILT1_EN - RXFILT1_EN */\r\n#define USBC_DIGITAL_CONTRL_0_RXFILT1_EN(x)      (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_RXFILT1_EN_SHIFT)) & USBC_DIGITAL_CONTRL_0_RXFILT1_EN_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_RXFILT2_EN_MASK    (0x400U)\r\n#define USBC_DIGITAL_CONTRL_0_RXFILT2_EN_SHIFT   (10U)\r\n/*! RXFILT2_EN - RXFILT2_EN */\r\n#define USBC_DIGITAL_CONTRL_0_RXFILT2_EN(x)      (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_RXFILT2_EN_SHIFT)) & USBC_DIGITAL_CONTRL_0_RXFILT2_EN_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_EARLY_TX_ENABLE_MASK (0x800U)\r\n#define USBC_DIGITAL_CONTRL_0_EARLY_TX_ENABLE_SHIFT (11U)\r\n/*! EARLY_TX_ENABLE - EARLY_TX_ENABLE */\r\n#define USBC_DIGITAL_CONTRL_0_EARLY_TX_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_EARLY_TX_ENABLE_SHIFT)) & USBC_DIGITAL_CONTRL_0_EARLY_TX_ENABLE_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_SQ_BLK_MASK        (0x7000U)\r\n#define USBC_DIGITAL_CONTRL_0_SQ_BLK_SHIFT       (12U)\r\n/*! SQ_BLK - SQ_BLK */\r\n#define USBC_DIGITAL_CONTRL_0_SQ_BLK(x)          (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_SQ_BLK_SHIFT)) & USBC_DIGITAL_CONTRL_0_SQ_BLK_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_RXFILT3_EN_MASK    (0x8000U)\r\n#define USBC_DIGITAL_CONTRL_0_RXFILT3_EN_SHIFT   (15U)\r\n/*! RXFILT3_EN - RXFILT3_EN */\r\n#define USBC_DIGITAL_CONTRL_0_RXFILT3_EN(x)      (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_RXFILT3_EN_SHIFT)) & USBC_DIGITAL_CONTRL_0_RXFILT3_EN_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_SQ_FILT_MASK       (0x70000U)\r\n#define USBC_DIGITAL_CONTRL_0_SQ_FILT_SHIFT      (16U)\r\n/*! SQ_FILT - SQ_FILT */\r\n#define USBC_DIGITAL_CONTRL_0_SQ_FILT(x)         (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_SQ_FILT_SHIFT)) & USBC_DIGITAL_CONTRL_0_SQ_FILT_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_FIFOOVF_EN_MASK    (0x80000U)\r\n#define USBC_DIGITAL_CONTRL_0_FIFOOVF_EN_SHIFT   (19U)\r\n/*! FIFOOVF_EN - FIFOOVF_EN */\r\n#define USBC_DIGITAL_CONTRL_0_FIFOOVF_EN(x)      (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_FIFOOVF_EN_SHIFT)) & USBC_DIGITAL_CONTRL_0_FIFOOVF_EN_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_LOSSOFSYNC_EN_MASK (0x100000U)\r\n#define USBC_DIGITAL_CONTRL_0_LOSSOFSYNC_EN_SHIFT (20U)\r\n/*! LOSSOFSYNC_EN - LOSSOFSYNC_EN */\r\n#define USBC_DIGITAL_CONTRL_0_LOSSOFSYNC_EN(x)   (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_LOSSOFSYNC_EN_SHIFT)) & USBC_DIGITAL_CONTRL_0_LOSSOFSYNC_EN_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_RX_RUNAWAY_EN_MASK (0x200000U)\r\n#define USBC_DIGITAL_CONTRL_0_RX_RUNAWAY_EN_SHIFT (21U)\r\n/*! RX_RUNAWAY_EN - RX_RUNAWAY_EN */\r\n#define USBC_DIGITAL_CONTRL_0_RX_RUNAWAY_EN(x)   (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_RX_RUNAWAY_EN_SHIFT)) & USBC_DIGITAL_CONTRL_0_RX_RUNAWAY_EN_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_STOP_AT_RXERR_MASK (0x400000U)\r\n#define USBC_DIGITAL_CONTRL_0_STOP_AT_RXERR_SHIFT (22U)\r\n/*! STOP_AT_RXERR - STOP_AT_RXERR */\r\n#define USBC_DIGITAL_CONTRL_0_STOP_AT_RXERR(x)   (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_STOP_AT_RXERR_SHIFT)) & USBC_DIGITAL_CONTRL_0_STOP_AT_RXERR_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_EDGE_OPT_EN_MASK   (0x800000U)\r\n#define USBC_DIGITAL_CONTRL_0_EDGE_OPT_EN_SHIFT  (23U)\r\n/*! EDGE_OPT_EN - EDGE_OPT_EN */\r\n#define USBC_DIGITAL_CONTRL_0_EDGE_OPT_EN(x)     (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_EDGE_OPT_EN_SHIFT)) & USBC_DIGITAL_CONTRL_0_EDGE_OPT_EN_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_SE0_FILT_SEL_MASK  (0x1000000U)\r\n#define USBC_DIGITAL_CONTRL_0_SE0_FILT_SEL_SHIFT (24U)\r\n/*! SE0_FILT_SEL - SE0_FILT_SEL */\r\n#define USBC_DIGITAL_CONTRL_0_SE0_FILT_SEL(x)    (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_SE0_FILT_SEL_SHIFT)) & USBC_DIGITAL_CONTRL_0_SE0_FILT_SEL_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_SE1_FILT_SEL_MASK  (0x2000000U)\r\n#define USBC_DIGITAL_CONTRL_0_SE1_FILT_SEL_SHIFT (25U)\r\n/*! SE1_FILT_SEL - SE1_FILT_SEL */\r\n#define USBC_DIGITAL_CONTRL_0_SE1_FILT_SEL(x)    (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_SE1_FILT_SEL_SHIFT)) & USBC_DIGITAL_CONTRL_0_SE1_FILT_SEL_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_CORE_UTMI_SEL_MASK (0x4000000U)\r\n#define USBC_DIGITAL_CONTRL_0_CORE_UTMI_SEL_SHIFT (26U)\r\n/*! CORE_UTMI_SEL - CORE_UTMI_SEL */\r\n#define USBC_DIGITAL_CONTRL_0_CORE_UTMI_SEL(x)   (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_CORE_UTMI_SEL_SHIFT)) & USBC_DIGITAL_CONTRL_0_CORE_UTMI_SEL_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_PLL_LOCK_FORCE_VAL_MASK (0x8000000U)\r\n#define USBC_DIGITAL_CONTRL_0_PLL_LOCK_FORCE_VAL_SHIFT (27U)\r\n/*! PLL_LOCK_FORCE_VAL - PLL_LOCK_FORCE_VAL */\r\n#define USBC_DIGITAL_CONTRL_0_PLL_LOCK_FORCE_VAL(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_PLL_LOCK_FORCE_VAL_SHIFT)) & USBC_DIGITAL_CONTRL_0_PLL_LOCK_FORCE_VAL_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_PLL_LOCK_FORCE_EN_MASK (0x10000000U)\r\n#define USBC_DIGITAL_CONTRL_0_PLL_LOCK_FORCE_EN_SHIFT (28U)\r\n/*! PLL_LOCK_FORCE_EN - PLL_LOCK_FORCE_EN */\r\n#define USBC_DIGITAL_CONTRL_0_PLL_LOCK_FORCE_EN(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_PLL_LOCK_FORCE_EN_SHIFT)) & USBC_DIGITAL_CONTRL_0_PLL_LOCK_FORCE_EN_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_FIFO_OVF_ERROR_MASK (0x20000000U)\r\n#define USBC_DIGITAL_CONTRL_0_FIFO_OVF_ERROR_SHIFT (29U)\r\n/*! FIFO_OVF_ERROR - FIFO_OVF_ERROR */\r\n#define USBC_DIGITAL_CONTRL_0_FIFO_OVF_ERROR(x)  (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_FIFO_OVF_ERROR_SHIFT)) & USBC_DIGITAL_CONTRL_0_FIFO_OVF_ERROR_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_LOSS_OF_SYNC_ERROR_MASK (0x40000000U)\r\n#define USBC_DIGITAL_CONTRL_0_LOSS_OF_SYNC_ERROR_SHIFT (30U)\r\n/*! LOSS_OF_SYNC_ERROR - LOSS_OF_SYNC_ERROR */\r\n#define USBC_DIGITAL_CONTRL_0_LOSS_OF_SYNC_ERROR(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_LOSS_OF_SYNC_ERROR_SHIFT)) & USBC_DIGITAL_CONTRL_0_LOSS_OF_SYNC_ERROR_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_0_BITSTUFFING_ERROR_MASK (0x80000000U)\r\n#define USBC_DIGITAL_CONTRL_0_BITSTUFFING_ERROR_SHIFT (31U)\r\n/*! BITSTUFFING_ERROR - BITSTUFFING_ERROR */\r\n#define USBC_DIGITAL_CONTRL_0_BITSTUFFING_ERROR(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_0_BITSTUFFING_ERROR_SHIFT)) & USBC_DIGITAL_CONTRL_0_BITSTUFFING_ERROR_MASK)\r\n/*! @} */\r\n\r\n/*! @name DIGITAL_CONTRL_1 - Digital_Contrl_1 */\r\n/*! @{ */\r\n\r\n#define USBC_DIGITAL_CONTRL_1_REG_FORCE_END_EN_MASK (0x1U)\r\n#define USBC_DIGITAL_CONTRL_1_REG_FORCE_END_EN_SHIFT (0U)\r\n/*! REG_FORCE_END_EN - REG_FORCE_END_EN */\r\n#define USBC_DIGITAL_CONTRL_1_REG_FORCE_END_EN(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_REG_FORCE_END_EN_SHIFT)) & USBC_DIGITAL_CONTRL_1_REG_FORCE_END_EN_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_1_REG_FS_RX_ERROR_MODE_MASK (0x2U)\r\n#define USBC_DIGITAL_CONTRL_1_REG_FS_RX_ERROR_MODE_SHIFT (1U)\r\n/*! REG_FS_RX_ERROR_MODE - REG_FS_RX_ERROR_MODE */\r\n#define USBC_DIGITAL_CONTRL_1_REG_FS_RX_ERROR_MODE(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_REG_FS_RX_ERROR_MODE_SHIFT)) & USBC_DIGITAL_CONTRL_1_REG_FS_RX_ERROR_MODE_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_1_REG_FS_RX_ERROR_MODE1_MASK (0x4U)\r\n#define USBC_DIGITAL_CONTRL_1_REG_FS_RX_ERROR_MODE1_SHIFT (2U)\r\n/*! REG_FS_RX_ERROR_MODE1 - REG_FS_RX_ERROR_MODE1 */\r\n#define USBC_DIGITAL_CONTRL_1_REG_FS_RX_ERROR_MODE1(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_REG_FS_RX_ERROR_MODE1_SHIFT)) & USBC_DIGITAL_CONTRL_1_REG_FS_RX_ERROR_MODE1_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_1_REG_FS_RX_ERROR_MODE2_MASK (0x8U)\r\n#define USBC_DIGITAL_CONTRL_1_REG_FS_RX_ERROR_MODE2_SHIFT (3U)\r\n/*! REG_FS_RX_ERROR_MODE2 - REG_FS_RX_ERROR_MODE2 */\r\n#define USBC_DIGITAL_CONTRL_1_REG_FS_RX_ERROR_MODE2(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_REG_FS_RX_ERROR_MODE2_SHIFT)) & USBC_DIGITAL_CONTRL_1_REG_FS_RX_ERROR_MODE2_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_1_REG_ARC_DPDM_MODE_MASK (0x10U)\r\n#define USBC_DIGITAL_CONTRL_1_REG_ARC_DPDM_MODE_SHIFT (4U)\r\n/*! REG_ARC_DPDM_MODE - REG_ARC_DPDM_MODE */\r\n#define USBC_DIGITAL_CONTRL_1_REG_ARC_DPDM_MODE(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_REG_ARC_DPDM_MODE_SHIFT)) & USBC_DIGITAL_CONTRL_1_REG_ARC_DPDM_MODE_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_1_REG_DM_PULLDOWN_MASK (0x20U)\r\n#define USBC_DIGITAL_CONTRL_1_REG_DM_PULLDOWN_SHIFT (5U)\r\n/*! REG_DM_PULLDOWN - REG_DM_PULLDOWN */\r\n#define USBC_DIGITAL_CONTRL_1_REG_DM_PULLDOWN(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_REG_DM_PULLDOWN_SHIFT)) & USBC_DIGITAL_CONTRL_1_REG_DM_PULLDOWN_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_1_REG_DP_PULLDOWN_MASK (0x40U)\r\n#define USBC_DIGITAL_CONTRL_1_REG_DP_PULLDOWN_SHIFT (6U)\r\n/*! REG_DP_PULLDOWN - REG_DP_PULLDOWN */\r\n#define USBC_DIGITAL_CONTRL_1_REG_DP_PULLDOWN(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_REG_DP_PULLDOWN_SHIFT)) & USBC_DIGITAL_CONTRL_1_REG_DP_PULLDOWN_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_1_REG_FS_EOP_MODE_MASK (0x80U)\r\n#define USBC_DIGITAL_CONTRL_1_REG_FS_EOP_MODE_SHIFT (7U)\r\n/*! REG_FS_EOP_MODE - REG_FS_EOP_MODE */\r\n#define USBC_DIGITAL_CONTRL_1_REG_FS_EOP_MODE(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_REG_FS_EOP_MODE_SHIFT)) & USBC_DIGITAL_CONTRL_1_REG_FS_EOP_MODE_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_1_UNUSED_8_MASK      (0x300U)\r\n#define USBC_DIGITAL_CONTRL_1_UNUSED_8_SHIFT     (8U)\r\n/*! UNUSED_8 - Reserved */\r\n#define USBC_DIGITAL_CONTRL_1_UNUSED_8(x)        (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_UNUSED_8_SHIFT)) & USBC_DIGITAL_CONTRL_1_UNUSED_8_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_1_REG_NOVBUS_DPDM00_MASK (0x400U)\r\n#define USBC_DIGITAL_CONTRL_1_REG_NOVBUS_DPDM00_SHIFT (10U)\r\n/*! REG_NOVBUS_DPDM00 - REG_NOVBUS_DPDM00 */\r\n#define USBC_DIGITAL_CONTRL_1_REG_NOVBUS_DPDM00(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_REG_NOVBUS_DPDM00_SHIFT)) & USBC_DIGITAL_CONTRL_1_REG_NOVBUS_DPDM00_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_1_REG_FREERUNCLK_EN_MASK (0x800U)\r\n#define USBC_DIGITAL_CONTRL_1_REG_FREERUNCLK_EN_SHIFT (11U)\r\n/*! REG_FREERUNCLK_EN - REG_FREERUNCLK_EN */\r\n#define USBC_DIGITAL_CONTRL_1_REG_FREERUNCLK_EN(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_REG_FREERUNCLK_EN_SHIFT)) & USBC_DIGITAL_CONTRL_1_REG_FREERUNCLK_EN_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_1_REG_FLSMODELP_EN_MASK (0x1000U)\r\n#define USBC_DIGITAL_CONTRL_1_REG_FLSMODELP_EN_SHIFT (12U)\r\n/*! REG_FLSMODELP_EN - REG_FLSMODELP_EN */\r\n#define USBC_DIGITAL_CONTRL_1_REG_FLSMODELP_EN(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_REG_FLSMODELP_EN_SHIFT)) & USBC_DIGITAL_CONTRL_1_REG_FLSMODELP_EN_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_1_REG_OPMODE_SEL_MASK (0x2000U)\r\n#define USBC_DIGITAL_CONTRL_1_REG_OPMODE_SEL_SHIFT (13U)\r\n/*! REG_OPMODE_SEL - REG_OPMODE_SEL */\r\n#define USBC_DIGITAL_CONTRL_1_REG_OPMODE_SEL(x)  (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_REG_OPMODE_SEL_SHIFT)) & USBC_DIGITAL_CONTRL_1_REG_OPMODE_SEL_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_1_REG_LAT_UTMI_MASK  (0x4000U)\r\n#define USBC_DIGITAL_CONTRL_1_REG_LAT_UTMI_SHIFT (14U)\r\n/*! REG_LAT_UTMI - REG_LAT_UTMI */\r\n#define USBC_DIGITAL_CONTRL_1_REG_LAT_UTMI(x)    (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_REG_LAT_UTMI_SHIFT)) & USBC_DIGITAL_CONTRL_1_REG_LAT_UTMI_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_1_REG_SWAP_DPDM_MASK (0x8000U)\r\n#define USBC_DIGITAL_CONTRL_1_REG_SWAP_DPDM_SHIFT (15U)\r\n/*! REG_SWAP_DPDM - REG_SWAP_DPDM */\r\n#define USBC_DIGITAL_CONTRL_1_REG_SWAP_DPDM(x)   (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_REG_SWAP_DPDM_SHIFT)) & USBC_DIGITAL_CONTRL_1_REG_SWAP_DPDM_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_1_REG_SAMPLEROFF_DLY_MASK (0xF0000U)\r\n#define USBC_DIGITAL_CONTRL_1_REG_SAMPLEROFF_DLY_SHIFT (16U)\r\n/*! REG_SAMPLEROFF_DLY - REG_SAMPLEROFF_DLY */\r\n#define USBC_DIGITAL_CONTRL_1_REG_SAMPLEROFF_DLY(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_REG_SAMPLEROFF_DLY_SHIFT)) & USBC_DIGITAL_CONTRL_1_REG_SAMPLEROFF_DLY_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_1_REG_SAMPLER_ON_MASK (0x100000U)\r\n#define USBC_DIGITAL_CONTRL_1_REG_SAMPLER_ON_SHIFT (20U)\r\n/*! REG_SAMPLER_ON - REG_SAMPLER_ON */\r\n#define USBC_DIGITAL_CONTRL_1_REG_SAMPLER_ON(x)  (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_REG_SAMPLER_ON_SHIFT)) & USBC_DIGITAL_CONTRL_1_REG_SAMPLER_ON_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_1_REG_SAMPLER_PREOFF_MASK (0x200000U)\r\n#define USBC_DIGITAL_CONTRL_1_REG_SAMPLER_PREOFF_SHIFT (21U)\r\n/*! REG_SAMPLER_PREOFF - REG_SAMPLER_PREOFF */\r\n#define USBC_DIGITAL_CONTRL_1_REG_SAMPLER_PREOFF(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_REG_SAMPLER_PREOFF_SHIFT)) & USBC_DIGITAL_CONTRL_1_REG_SAMPLER_PREOFF_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_1_REG_CLK_OUT_DLY_MASK (0x3FC00000U)\r\n#define USBC_DIGITAL_CONTRL_1_REG_CLK_OUT_DLY_SHIFT (22U)\r\n/*! REG_CLK_OUT_DLY - REG_CLK_OUT_DLY */\r\n#define USBC_DIGITAL_CONTRL_1_REG_CLK_OUT_DLY(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_REG_CLK_OUT_DLY_SHIFT)) & USBC_DIGITAL_CONTRL_1_REG_CLK_OUT_DLY_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_1_REG_LSIDLE_PRE_MASK (0x40000000U)\r\n#define USBC_DIGITAL_CONTRL_1_REG_LSIDLE_PRE_SHIFT (30U)\r\n/*! REG_LSIDLE_PRE - REG_LSIDLE_PRE */\r\n#define USBC_DIGITAL_CONTRL_1_REG_LSIDLE_PRE(x)  (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_REG_LSIDLE_PRE_SHIFT)) & USBC_DIGITAL_CONTRL_1_REG_LSIDLE_PRE_MASK)\r\n\r\n#define USBC_DIGITAL_CONTRL_1_REG_VBUSON_SEL_HIGH_MASK (0x80000000U)\r\n#define USBC_DIGITAL_CONTRL_1_REG_VBUSON_SEL_HIGH_SHIFT (31U)\r\n/*! REG_VBUSON_SEL_HIGH - REG_VBUSON_SEL_HIGH */\r\n#define USBC_DIGITAL_CONTRL_1_REG_VBUSON_SEL_HIGH(x) (((uint32_t)(((uint32_t)(x)) << USBC_DIGITAL_CONTRL_1_REG_VBUSON_SEL_HIGH_SHIFT)) & USBC_DIGITAL_CONTRL_1_REG_VBUSON_SEL_HIGH_MASK)\r\n/*! @} */\r\n\r\n/*! @name TEST_CONTRL_AND_STATUS_0 - Test_Contrl_and_Status_0 */\r\n/*! @{ */\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_TX_PATTERN_MASK (0xFFU)\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_TX_PATTERN_SHIFT (0U)\r\n/*! REG_TEST_TX_PATTERN - REG_TEST_TX_PATTERN */\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_TX_PATTERN(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_TX_PATTERN_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_TX_PATTERN_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_MODE_MASK (0x300U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_MODE_SHIFT (8U)\r\n/*! REG_TEST_MODE - REG_TEST_MODE */\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_MODE(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_MODE_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_MODE_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_UNUSED_10_MASK (0xC00U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_UNUSED_10_SHIFT (10U)\r\n/*! UNUSED_10 - Reserved */\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_UNUSED_10(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_0_UNUSED_10_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_0_UNUSED_10_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_SKIP_MASK (0x7000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_SKIP_SHIFT (12U)\r\n/*! REG_TEST_SKIP - REG_TEST_SKIP */\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_SKIP(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_SKIP_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_SKIP_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_UNUSED_15_MASK (0x8000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_UNUSED_15_SHIFT (15U)\r\n/*! UNUSED_15 - Reserved */\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_UNUSED_15(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_0_UNUSED_15_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_0_UNUSED_15_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_OP_MODE_MASK (0x30000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_OP_MODE_SHIFT (16U)\r\n/*! REG_TEST_OP_MODE - REG_TEST_OP_MODE */\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_OP_MODE(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_OP_MODE_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_OP_MODE_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_XVCR_SELECT_MASK (0xC0000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_XVCR_SELECT_SHIFT (18U)\r\n/*! REG_TEST_XVCR_SELECT - REG_TEST_XVCR_SELECT */\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_XVCR_SELECT(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_XVCR_SELECT_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_XVCR_SELECT_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_TERM_SELECT_MASK (0x100000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_TERM_SELECT_SHIFT (20U)\r\n/*! REG_TEST_TERM_SELECT - REG_TEST_TERM_SELECT */\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_TERM_SELECT(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_TERM_SELECT_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_TERM_SELECT_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_RESET_MASK (0x200000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_RESET_SHIFT (21U)\r\n/*! REG_TEST_RESET - REG_TEST_RESET */\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_RESET(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_RESET_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_RESET_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_SUSPENDM_MASK (0x400000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_SUSPENDM_SHIFT (22U)\r\n/*! REG_TEST_SUSPENDM - REG_TEST_SUSPENDM */\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_SUSPENDM(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_SUSPENDM_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_SUSPENDM_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_TX_BITSTUFF_EN_MASK (0x800000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_TX_BITSTUFF_EN_SHIFT (23U)\r\n/*! REG_TEST_TX_BITSTUFF_EN - REG_TEST_TX_BITSTUFF_EN */\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_TX_BITSTUFF_EN(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_TX_BITSTUFF_EN_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_TX_BITSTUFF_EN_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_UNUSED_24_MASK (0x1000000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_UNUSED_24_SHIFT (24U)\r\n/*! UNUSED_24 - Reserved */\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_UNUSED_24(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_0_UNUSED_24_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_0_UNUSED_24_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_UTMI_SEL_MASK (0x2000000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_UTMI_SEL_SHIFT (25U)\r\n/*! REG_TEST_UTMI_SEL - REG_TEST_UTMI_SEL */\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_UTMI_SEL(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_UTMI_SEL_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_UTMI_SEL_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_BYPASS_MASK (0x4000000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_BYPASS_SHIFT (26U)\r\n/*! REG_TEST_BYPASS - REG_TEST_BYPASS */\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_BYPASS_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_BYPASS_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_ANA_LPBK_MASK (0x8000000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_ANA_LPBK_SHIFT (27U)\r\n/*! REG_TEST_ANA_LPBK - REG_TEST_ANA_LPBK */\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_ANA_LPBK(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_ANA_LPBK_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_ANA_LPBK_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_DIG_LPBK_MASK (0x10000000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_DIG_LPBK_SHIFT (28U)\r\n/*! REG_TEST_DIG_LPBK - REG_TEST_DIG_LPBK */\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_DIG_LPBK(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_DIG_LPBK_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_DIG_LPBK_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_EN_MASK (0x20000000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_EN_SHIFT (29U)\r\n/*! REG_TEST_EN - REG_TEST_EN */\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_EN(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_EN_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_0_REG_TEST_EN_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_TEST_DONE_MASK (0x40000000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_TEST_DONE_SHIFT (30U)\r\n/*! TEST_DONE - TEST_DONE */\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_TEST_DONE(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_0_TEST_DONE_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_0_TEST_DONE_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_TEST_FAIL_MASK (0x80000000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_TEST_FAIL_SHIFT (31U)\r\n/*! TEST_FAIL - TEST_FAIL */\r\n#define USBC_TEST_CONTRL_AND_STATUS_0_TEST_FAIL(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_0_TEST_FAIL_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_0_TEST_FAIL_MASK)\r\n/*! @} */\r\n\r\n/*! @name TEST_CONTRL_AND_STATUS_1 - Test_Contrl_and_Status_1 */\r\n/*! @{ */\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_TEST_LEN_MASK (0x7FFU)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_TEST_LEN_SHIFT (0U)\r\n/*! TEST_LEN - TEST_LEN */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_TEST_LEN(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_TEST_LEN_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_TEST_LEN_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_UNUSED_11_MASK (0x800U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_UNUSED_11_SHIFT (11U)\r\n/*! UNUSED_11 - Reserved */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_UNUSED_11(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_UNUSED_11_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_UNUSED_11_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_RX_N_MASK (0x1000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_RX_N_SHIFT (12U)\r\n/*! FLS_RX_N - fls_rx_n */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_RX_N(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_FLS_RX_N_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_FLS_RX_N_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_RX_P_MASK (0x2000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_RX_P_SHIFT (13U)\r\n/*! FLS_RX_P - fls_rx_p */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_RX_P(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_FLS_RX_P_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_FLS_RX_P_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_DOUT_FS_LS_MASK (0x4000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_DOUT_FS_LS_SHIFT (14U)\r\n/*! DOUT_FS_LS - dout_fs_ls */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_DOUT_FS_LS(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_DOUT_FS_LS_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_DOUT_FS_LS_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_RX_FORCE_EN_MASK (0x8000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_RX_FORCE_EN_SHIFT (15U)\r\n/*! FLS_RX_FORCE_EN - fls_rx_force_en */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_RX_FORCE_EN(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_FLS_RX_FORCE_EN_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_FLS_RX_FORCE_EN_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_LINESTATE_FORCE_VAL_MASK (0x30000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_LINESTATE_FORCE_VAL_SHIFT (16U)\r\n/*! LINESTATE_FORCE_VAL - linestate_force_val */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_LINESTATE_FORCE_VAL(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_LINESTATE_FORCE_VAL_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_LINESTATE_FORCE_VAL_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_LINESTATE_FORCE_EN_MASK (0x40000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_LINESTATE_FORCE_EN_SHIFT (18U)\r\n/*! LINESTATE_FORCE_EN - linestate_force_en */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_LINESTATE_FORCE_EN(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_LINESTATE_FORCE_EN_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_LINESTATE_FORCE_EN_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_DISCON_FORCE_VAL_MASK (0x80000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_DISCON_FORCE_VAL_SHIFT (19U)\r\n/*! DISCON_FORCE_VAL - discon_force_val */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_DISCON_FORCE_VAL(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_DISCON_FORCE_VAL_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_DISCON_FORCE_VAL_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_DISCON_FORCE_EN_MASK (0x100000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_DISCON_FORCE_EN_SHIFT (20U)\r\n/*! DISCON_FORCE_EN - discon_force_en */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_DISCON_FORCE_EN(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_DISCON_FORCE_EN_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_DISCON_FORCE_EN_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_SQ_FORCE_VAL_MASK (0x200000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_SQ_FORCE_VAL_SHIFT (21U)\r\n/*! SQ_FORCE_VAL - sq_force_val */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_SQ_FORCE_VAL(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_SQ_FORCE_VAL_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_SQ_FORCE_VAL_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_SQ_FORCE_EN_MASK (0x400000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_SQ_FORCE_EN_SHIFT (22U)\r\n/*! SQ_FORCE_EN - sq_force_en */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_SQ_FORCE_EN(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_SQ_FORCE_EN_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_SQ_FORCE_EN_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_DOUT_HS_FORCE_VAL_MASK (0x800000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_DOUT_HS_FORCE_VAL_SHIFT (23U)\r\n/*! DOUT_HS_FORCE_VAL - dout_hs_force_val */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_DOUT_HS_FORCE_VAL(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_DOUT_HS_FORCE_VAL_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_DOUT_HS_FORCE_VAL_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_DOUT_HS_FORCE_EN_MASK (0x1000000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_DOUT_HS_FORCE_EN_SHIFT (24U)\r\n/*! DOUT_HS_FORCE_EN - dout_hs_force_en */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_DOUT_HS_FORCE_EN(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_DOUT_HS_FORCE_EN_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_DOUT_HS_FORCE_EN_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_HS_TX_DATA_MASK (0x2000000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_HS_TX_DATA_SHIFT (25U)\r\n/*! HS_TX_DATA - hs_tx_data */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_HS_TX_DATA(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_HS_TX_DATA_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_HS_TX_DATA_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_HS_TX_ENABLE_MASK (0x4000000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_HS_TX_ENABLE_SHIFT (26U)\r\n/*! HS_TX_ENABLE - hs_tx_enable */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_HS_TX_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_HS_TX_ENABLE_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_HS_TX_ENABLE_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_HS_TX_FORCE_EN_MASK (0x8000000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_HS_TX_FORCE_EN_SHIFT (27U)\r\n/*! HS_TX_FORCE_EN - hs_tx_force_en */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_HS_TX_FORCE_EN(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_HS_TX_FORCE_EN_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_HS_TX_FORCE_EN_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_TX_DAT_MASK (0x10000000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_TX_DAT_SHIFT (28U)\r\n/*! FLS_TX_DAT - fls_tx_dat */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_TX_DAT(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_FLS_TX_DAT_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_FLS_TX_DAT_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_TX_SE0_MASK (0x20000000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_TX_SE0_SHIFT (29U)\r\n/*! FLS_TX_SE0 - fls_tx_se0 */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_TX_SE0(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_FLS_TX_SE0_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_FLS_TX_SE0_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_TX_ENABLE_MASK (0x40000000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_TX_ENABLE_SHIFT (30U)\r\n/*! FLS_TX_ENABLE - fls_tx_enable */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_TX_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_FLS_TX_ENABLE_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_FLS_TX_ENABLE_MASK)\r\n\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_TX_FORCE_EN_MASK (0x80000000U)\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_TX_FORCE_EN_SHIFT (31U)\r\n/*! FLS_TX_FORCE_EN - fls_tx_force_en */\r\n#define USBC_TEST_CONTRL_AND_STATUS_1_FLS_TX_FORCE_EN(x) (((uint32_t)(((uint32_t)(x)) << USBC_TEST_CONTRL_AND_STATUS_1_FLS_TX_FORCE_EN_SHIFT)) & USBC_TEST_CONTRL_AND_STATUS_1_FLS_TX_FORCE_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name MONITOR - MONITOR */\r\n/*! @{ */\r\n\r\n#define USBC_MONITOR_REG_MON_SEL_MASK            (0x3FU)\r\n#define USBC_MONITOR_REG_MON_SEL_SHIFT           (0U)\r\n/*! REG_MON_SEL - REG_MON_SEL */\r\n#define USBC_MONITOR_REG_MON_SEL(x)              (((uint32_t)(((uint32_t)(x)) << USBC_MONITOR_REG_MON_SEL_SHIFT)) & USBC_MONITOR_REG_MON_SEL_MASK)\r\n\r\n#define USBC_MONITOR_UNUSED_6_MASK               (0xFFC0U)\r\n#define USBC_MONITOR_UNUSED_6_SHIFT              (6U)\r\n/*! UNUSED_6 - Reserved */\r\n#define USBC_MONITOR_UNUSED_6(x)                 (((uint32_t)(((uint32_t)(x)) << USBC_MONITOR_UNUSED_6_SHIFT)) & USBC_MONITOR_UNUSED_6_MASK)\r\n\r\n#define USBC_MONITOR_USB_MON_MASK                (0xFFFF0000U)\r\n#define USBC_MONITOR_USB_MON_SHIFT               (16U)\r\n/*! USB_MON - USB_MON */\r\n#define USBC_MONITOR_USB_MON(x)                  (((uint32_t)(((uint32_t)(x)) << USBC_MONITOR_USB_MON_SHIFT)) & USBC_MONITOR_USB_MON_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVE_ANA - PHY_RESERVE */\r\n/*! @{ */\r\n\r\n#define USBC_RESERVE_ANA_PHY_RESERVE_MASK        (0xFFFFFFFFU)\r\n#define USBC_RESERVE_ANA_PHY_RESERVE_SHIFT       (0U)\r\n/*! PHY_RESERVE - PHY_RESERVE */\r\n#define USBC_RESERVE_ANA_PHY_RESERVE(x)          (((uint32_t)(((uint32_t)(x)) << USBC_RESERVE_ANA_PHY_RESERVE_SHIFT)) & USBC_RESERVE_ANA_PHY_RESERVE_MASK)\r\n/*! @} */\r\n\r\n/*! @name PHY_REG_OTG_CONTROL - PHY_REG_OTG_CONTROL */\r\n/*! @{ */\r\n\r\n#define USBC_PHY_REG_OTG_CONTROL_TESTMON_OTG_MASK (0x7U)\r\n#define USBC_PHY_REG_OTG_CONTROL_TESTMON_OTG_SHIFT (0U)\r\n/*! TESTMON_OTG - TESTMON_OTG */\r\n#define USBC_PHY_REG_OTG_CONTROL_TESTMON_OTG(x)  (((uint32_t)(((uint32_t)(x)) << USBC_PHY_REG_OTG_CONTROL_TESTMON_OTG_SHIFT)) & USBC_PHY_REG_OTG_CONTROL_TESTMON_OTG_MASK)\r\n\r\n#define USBC_PHY_REG_OTG_CONTROL_UNUSED_3_MASK   (0x8U)\r\n#define USBC_PHY_REG_OTG_CONTROL_UNUSED_3_SHIFT  (3U)\r\n/*! UNUSED_3 - Reserved */\r\n#define USBC_PHY_REG_OTG_CONTROL_UNUSED_3(x)     (((uint32_t)(((uint32_t)(x)) << USBC_PHY_REG_OTG_CONTROL_UNUSED_3_SHIFT)) & USBC_PHY_REG_OTG_CONTROL_UNUSED_3_MASK)\r\n\r\n#define USBC_PHY_REG_OTG_CONTROL_PU_OTG_MASK     (0x10U)\r\n#define USBC_PHY_REG_OTG_CONTROL_PU_OTG_SHIFT    (4U)\r\n/*! PU_OTG - PU_OTG */\r\n#define USBC_PHY_REG_OTG_CONTROL_PU_OTG(x)       (((uint32_t)(((uint32_t)(x)) << USBC_PHY_REG_OTG_CONTROL_PU_OTG_SHIFT)) & USBC_PHY_REG_OTG_CONTROL_PU_OTG_MASK)\r\n\r\n#define USBC_PHY_REG_OTG_CONTROL_OTG_CONTROL_BY_PIN_MASK (0x20U)\r\n#define USBC_PHY_REG_OTG_CONTROL_OTG_CONTROL_BY_PIN_SHIFT (5U)\r\n/*! OTG_CONTROL_BY_PIN - OTG_CONTROL_BY_PIN */\r\n#define USBC_PHY_REG_OTG_CONTROL_OTG_CONTROL_BY_PIN(x) (((uint32_t)(((uint32_t)(x)) << USBC_PHY_REG_OTG_CONTROL_OTG_CONTROL_BY_PIN_SHIFT)) & USBC_PHY_REG_OTG_CONTROL_OTG_CONTROL_BY_PIN_MASK)\r\n\r\n#define USBC_PHY_REG_OTG_CONTROL_UNUSED_7_MASK   (0xFFFFFF80U)\r\n#define USBC_PHY_REG_OTG_CONTROL_UNUSED_7_SHIFT  (7U)\r\n/*! UNUSED_7 - Reserved */\r\n#define USBC_PHY_REG_OTG_CONTROL_UNUSED_7(x)     (((uint32_t)(((uint32_t)(x)) << USBC_PHY_REG_OTG_CONTROL_UNUSED_7_SHIFT)) & USBC_PHY_REG_OTG_CONTROL_UNUSED_7_MASK)\r\n/*! @} */\r\n\r\n/*! @name PHY_REG_CHGDTC_CONTRL_1 - PHY_REG_CHGDTC_CONTRL_1 */\r\n/*! @{ */\r\n\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_TESTMON_CHRGDTC_MASK (0x3U)\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_TESTMON_CHRGDTC_SHIFT (0U)\r\n/*! TESTMON_CHRGDTC - TESTMON_CHRGDTC */\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_TESTMON_CHRGDTC(x) (((uint32_t)(((uint32_t)(x)) << USBC_PHY_REG_CHGDTC_CONTRL_1_TESTMON_CHRGDTC_SHIFT)) & USBC_PHY_REG_CHGDTC_CONTRL_1_TESTMON_CHRGDTC_MASK)\r\n\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_CDP_EN_MASK (0x4U)\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_CDP_EN_SHIFT (2U)\r\n/*! CDP_EN - CDP_EN */\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_CDP_EN(x)   (((uint32_t)(((uint32_t)(x)) << USBC_PHY_REG_CHGDTC_CONTRL_1_CDP_EN_SHIFT)) & USBC_PHY_REG_CHGDTC_CONTRL_1_CDP_EN_MASK)\r\n\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_DCP_EN_MASK (0x8U)\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_DCP_EN_SHIFT (3U)\r\n/*! DCP_EN - DCP_EN */\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_DCP_EN(x)   (((uint32_t)(((uint32_t)(x)) << USBC_PHY_REG_CHGDTC_CONTRL_1_DCP_EN_SHIFT)) & USBC_PHY_REG_CHGDTC_CONTRL_1_DCP_EN_MASK)\r\n\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_PD_EN_MASK  (0x10U)\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_PD_EN_SHIFT (4U)\r\n/*! PD_EN - PD_EN */\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_PD_EN(x)    (((uint32_t)(((uint32_t)(x)) << USBC_PHY_REG_CHGDTC_CONTRL_1_PD_EN_SHIFT)) & USBC_PHY_REG_CHGDTC_CONTRL_1_PD_EN_MASK)\r\n\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_PU_CHRG_DTC_MASK (0x20U)\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_PU_CHRG_DTC_SHIFT (5U)\r\n/*! PU_CHRG_DTC - PU_CHRG_DTC */\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_PU_CHRG_DTC(x) (((uint32_t)(((uint32_t)(x)) << USBC_PHY_REG_CHGDTC_CONTRL_1_PU_CHRG_DTC_SHIFT)) & USBC_PHY_REG_CHGDTC_CONTRL_1_PU_CHRG_DTC_MASK)\r\n\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_DP_DM_SWAP_CTRL_MASK (0x40U)\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_DP_DM_SWAP_CTRL_SHIFT (6U)\r\n/*! DP_DM_SWAP_CTRL - DP_DM_SWAP_CTRL */\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_DP_DM_SWAP_CTRL(x) (((uint32_t)(((uint32_t)(x)) << USBC_PHY_REG_CHGDTC_CONTRL_1_DP_DM_SWAP_CTRL_SHIFT)) & USBC_PHY_REG_CHGDTC_CONTRL_1_DP_DM_SWAP_CTRL_MASK)\r\n\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_CDP_DM_AUTO_SWITCH_MASK (0x80U)\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_CDP_DM_AUTO_SWITCH_SHIFT (7U)\r\n/*! CDP_DM_AUTO_SWITCH - CDP_DM_AUTO_SWITCH */\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_CDP_DM_AUTO_SWITCH(x) (((uint32_t)(((uint32_t)(x)) << USBC_PHY_REG_CHGDTC_CONTRL_1_CDP_DM_AUTO_SWITCH_SHIFT)) & USBC_PHY_REG_CHGDTC_CONTRL_1_CDP_DM_AUTO_SWITCH_MASK)\r\n\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_VDAT_CHARGE_MASK (0x300U)\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_VDAT_CHARGE_SHIFT (8U)\r\n/*! VDAT_CHARGE - VDAT_CHARGE */\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_VDAT_CHARGE(x) (((uint32_t)(((uint32_t)(x)) << USBC_PHY_REG_CHGDTC_CONTRL_1_VDAT_CHARGE_SHIFT)) & USBC_PHY_REG_CHGDTC_CONTRL_1_VDAT_CHARGE_MASK)\r\n\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_VSRC_CHARGE_MASK (0xC00U)\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_VSRC_CHARGE_SHIFT (10U)\r\n/*! VSRC_CHARGE - VSRC_CHARGE */\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_VSRC_CHARGE(x) (((uint32_t)(((uint32_t)(x)) << USBC_PHY_REG_CHGDTC_CONTRL_1_VSRC_CHARGE_SHIFT)) & USBC_PHY_REG_CHGDTC_CONTRL_1_VSRC_CHARGE_MASK)\r\n\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_ENABLE_SWITCH_DP_MASK (0x1000U)\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_ENABLE_SWITCH_DP_SHIFT (12U)\r\n/*! ENABLE_SWITCH_DP - ENABLE_SWITCH_DP */\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_ENABLE_SWITCH_DP(x) (((uint32_t)(((uint32_t)(x)) << USBC_PHY_REG_CHGDTC_CONTRL_1_ENABLE_SWITCH_DP_SHIFT)) & USBC_PHY_REG_CHGDTC_CONTRL_1_ENABLE_SWITCH_DP_MASK)\r\n\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_ENABLE_SWITCH_DM_MASK (0x2000U)\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_ENABLE_SWITCH_DM_SHIFT (13U)\r\n/*! ENABLE_SWITCH_DM - ENABLE_SWITCH_DM */\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_ENABLE_SWITCH_DM(x) (((uint32_t)(((uint32_t)(x)) << USBC_PHY_REG_CHGDTC_CONTRL_1_ENABLE_SWITCH_DM_SHIFT)) & USBC_PHY_REG_CHGDTC_CONTRL_1_ENABLE_SWITCH_DM_MASK)\r\n\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_UNUSED_14_MASK (0xFFFFC000U)\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_UNUSED_14_SHIFT (14U)\r\n/*! UNUSED_14 - Reserved */\r\n#define USBC_PHY_REG_CHGDTC_CONTRL_1_UNUSED_14(x) (((uint32_t)(((uint32_t)(x)) << USBC_PHY_REG_CHGDTC_CONTRL_1_UNUSED_14_SHIFT)) & USBC_PHY_REG_CHGDTC_CONTRL_1_UNUSED_14_MASK)\r\n/*! @} */\r\n\r\n/*! @name RESERVED - RESERVED */\r\n/*! @{ */\r\n\r\n#define USBC_RESERVED_RESERVED_MASK              (0xFFFFFFFFU)\r\n#define USBC_RESERVED_RESERVED_SHIFT             (0U)\r\n/*! RESERVED - RESERVED */\r\n#define USBC_RESERVED_RESERVED(x)                (((uint32_t)(((uint32_t)(x)) << USBC_RESERVED_RESERVED_SHIFT)) & USBC_RESERVED_RESERVED_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group USBC_Register_Masks */\r\n\r\n\r\n/* USBC - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral USBOTG base address */\r\n  #define USBOTG_BASE                              (0x50145000u)\r\n  /** Peripheral USBOTG base address */\r\n  #define USBOTG_BASE_NS                           (0x40145000u)\r\n  /** Peripheral USBOTG base pointer */\r\n  #define USBOTG                                   ((USBC_Type *)USBOTG_BASE)\r\n  /** Peripheral USBOTG base pointer */\r\n  #define USBOTG_NS                                ((USBC_Type *)USBOTG_BASE_NS)\r\n  /** Array initializer of USBC peripheral base addresses */\r\n  #define USBC_BASE_ADDRS                          { USBOTG_BASE }\r\n  /** Array initializer of USBC peripheral base pointers */\r\n  #define USBC_BASE_PTRS                           { USBOTG }\r\n  /** Array initializer of USBC peripheral base addresses */\r\n  #define USBC_BASE_ADDRS_NS                       { USBOTG_BASE_NS }\r\n  /** Array initializer of USBC peripheral base pointers */\r\n  #define USBC_BASE_PTRS_NS                        { USBOTG_NS }\r\n#else\r\n  /** Peripheral USBOTG base address */\r\n  #define USBOTG_BASE                              (0x40145000u)\r\n  /** Peripheral USBOTG base pointer */\r\n  #define USBOTG                                   ((USBC_Type *)USBOTG_BASE)\r\n  /** Array initializer of USBC peripheral base addresses */\r\n  #define USBC_BASE_ADDRS                          { USBOTG_BASE }\r\n  /** Array initializer of USBC peripheral base pointers */\r\n  #define USBC_BASE_PTRS                           { USBOTG }\r\n#endif\r\n/* Backward compatibility */\r\n#define GPTIMER0CTL                              GPTIMER0CTRL\r\n#define GPTIMER1CTL                              GPTIMER1CTRL\r\n#define USBC_SBUSCFG                             SBUSCFG\r\n#define EPLISTADDR                               ENDPOINTLISTADDR\r\n#define EPSETUPSR                                ENDPTSETUPSTAT\r\n#define EPPRIME                                  ENDPTPRIME\r\n#define EPFLUSH                                  ENDPTFLUSH\r\n#define EPSR                                     ENDPTSTAT\r\n#define EPCOMPLETE                               ENDPTCOMPLETE\r\n#define EPCR                                     ENDPTCTRL\r\n#define EPCR0                                    ENDPTCTRL0\r\n#define USBHS_ID_ID_MASK                         USBC_ID_ID_MASK\r\n#define USBHS_ID_ID_SHIFT                        USBC_ID_ID_SHIFT\r\n#define USBHS_ID_ID(x)                           USBC_ID_ID(x)\r\n#define USBHS_ID_NID_MASK                        USBC_ID_NID_MASK\r\n#define USBHS_ID_NID_SHIFT                       USBC_ID_NID_SHIFT\r\n#define USBHS_ID_NID(x)                          USBC_ID_NID(x)\r\n#define USBHS_ID_REVISION_MASK                   USBC_ID_REVISION_MASK\r\n#define USBHS_ID_REVISION_SHIFT                  USBC_ID_REVISION_SHIFT\r\n#define USBHS_ID_REVISION(x)                     USBC_ID_REVISION(x)\r\n#define USBHS_HWGENERAL_PHYW_MASK                USBC_HWGENERAL_PHYW_MASK\r\n#define USBHS_HWGENERAL_PHYW_SHIFT               USBC_HWGENERAL_PHYW_SHIFT\r\n#define USBHS_HWGENERAL_PHYW(x)                  USBC_HWGENERAL_PHYW(x)\r\n#define USBHS_HWGENERAL_PHYM_MASK                USBC_HWGENERAL_PHYM_MASK\r\n#define USBHS_HWGENERAL_PHYM_SHIFT               USBC_HWGENERAL_PHYM_SHIFT\r\n#define USBHS_HWGENERAL_PHYM(x)                  USBC_HWGENERAL_PHYM(x)\r\n#define USBHS_HWGENERAL_SM_MASK                  USBC_HWGENERAL_SM_MASK\r\n#define USBHS_HWGENERAL_SM_SHIFT                 USBC_HWGENERAL_SM_SHIFT\r\n#define USBHS_HWGENERAL_SM(x)                    USBC_HWGENERAL_SM(x)\r\n#define USBHS_HWHOST_HC_MASK                     USBC_HWHOST_HC_MASK\r\n#define USBHS_HWHOST_HC_SHIFT                    USBC_HWHOST_HC_SHIFT\r\n#define USBHS_HWHOST_HC(x)                       USBC_HWHOST_HC(x)\r\n#define USBHS_HWHOST_NPORT_MASK                  USBC_HWHOST_NPORT_MASK\r\n#define USBHS_HWHOST_NPORT_SHIFT                 USBC_HWHOST_NPORT_SHIFT\r\n#define USBHS_HWHOST_NPORT(x)                    USBC_HWHOST_NPORT(x)\r\n#define USBHS_HWDEVICE_DC_MASK                   USBC_HWDEVICE_DC_MASK\r\n#define USBHS_HWDEVICE_DC_SHIFT                  USBC_HWDEVICE_DC_SHIFT\r\n#define USBHS_HWDEVICE_DC(x)                     USBC_HWDEVICE_DC(x)\r\n#define USBHS_HWDEVICE_DEVEP_MASK                USBC_HWDEVICE_DEVEP_MASK\r\n#define USBHS_HWDEVICE_DEVEP_SHIFT               USBC_HWDEVICE_DEVEP_SHIFT\r\n#define USBHS_HWDEVICE_DEVEP(x)                  USBC_HWDEVICE_DEVEP(x)\r\n#define USBHS_HWTXBUF_TXBURST_MASK               USBC_HWTXBUF_TXBURST_MASK\r\n#define USBHS_HWTXBUF_TXBURST_SHIFT              USBC_HWTXBUF_TXBURST_SHIFT\r\n#define USBHS_HWTXBUF_TXBURST(x)                 USBC_HWTXBUF_TXBURST(x)\r\n#define USBHS_HWTXBUF_TXCHANADD_MASK             USBC_HWTXBUF_TXCHANADD_MASK\r\n#define USBHS_HWTXBUF_TXCHANADD_SHIFT            USBC_HWTXBUF_TXCHANADD_SHIFT\r\n#define USBHS_HWTXBUF_TXCHANADD(x)               USBC_HWTXBUF_TXCHANADD(x)\r\n#define USBHS_HWRXBUF_RXBURST_MASK               USBC_HWRXBUF_RXBURST_MASK\r\n#define USBHS_HWRXBUF_RXBURST_SHIFT              USBC_HWRXBUF_RXBURST_SHIFT\r\n#define USBHS_HWRXBUF_RXBURST(x)                 USBC_HWRXBUF_RXBURST(x)\r\n#define USBHS_HWRXBUF_RXADD_MASK                 USBC_HWRXBUF_RXADD_MASK\r\n#define USBHS_HWRXBUF_RXADD_SHIFT                USBC_HWRXBUF_RXADD_SHIFT\r\n#define USBHS_HWRXBUF_RXADD(x)                   USBC_HWRXBUF_RXADD(x)\r\n#define USBHS_GPTIMER0LD_GPTLD_MASK              USBC_GPTIMER0LD_GPTLD_MASK\r\n#define USBHS_GPTIMER0LD_GPTLD_SHIFT             USBC_GPTIMER0LD_GPTLD_SHIFT\r\n#define USBHS_GPTIMER0LD_GPTLD(x)                USBC_GPTIMER0LD_GPTLD(x)\r\n#define USBHS_GPTIMER0CTL_GPTCNT_MASK            USBC_GPTIMER0CTRL_GPTCNT_MASK\r\n#define USBHS_GPTIMER0CTL_GPTCNT_SHIFT           USBC_GPTIMER0CTRL_GPTCNT_SHIFT\r\n#define USBHS_GPTIMER0CTL_GPTCNT(x)              USBC_GPTIMER0CTRL_GPTCNT(x)\r\n#define USBHS_GPTIMER0CTL_MODE_MASK              USBC_GPTIMER0CTRL_GPTMODE_MASK\r\n#define USBHS_GPTIMER0CTL_MODE_SHIFT             USBC_GPTIMER0CTRL_GPTMODE_SHIFT\r\n#define USBHS_GPTIMER0CTL_MODE(x)                USBC_GPTIMER0CTRL_GPTMODE(x)\r\n#define USBHS_GPTIMER0CTL_RST_MASK               USBC_GPTIMER0CTRL_GPTRST_MASK\r\n#define USBHS_GPTIMER0CTL_RST_SHIFT              USBC_GPTIMER0CTRL_GPTRST_SHIFT\r\n#define USBHS_GPTIMER0CTL_RST(x)                 USBC_GPTIMER0CTRL_GPTRST(x)\r\n#define USBHS_GPTIMER0CTL_RUN_MASK               USBC_GPTIMER0CTRL_GPTRUN_MASK\r\n#define USBHS_GPTIMER0CTL_RUN_SHIFT              USBC_GPTIMER0CTRL_GPTRUN_SHIFT\r\n#define USBHS_GPTIMER0CTL_RUN(x)                 USBC_GPTIMER0CTRL_GPTRUN(x)\r\n#define USBHS_GPTIMER1LD_GPTLD_MASK              USBC_GPTIMER1LD_GPTLD_MASK\r\n#define USBHS_GPTIMER1LD_GPTLD_SHIFT             USBC_GPTIMER1LD_GPTLD_SHIFT\r\n#define USBHS_GPTIMER1LD_GPTLD(x)                USBC_GPTIMER1LD_GPTLD(x)\r\n#define USBHS_GPTIMER1CTL_GPTCNT_MASK            USBC_GPTIMER1CTRL_GPTCNT_MASK\r\n#define USBHS_GPTIMER1CTL_GPTCNT_SHIFT           USBC_GPTIMER1CTRL_GPTCNT_SHIFT\r\n#define USBHS_GPTIMER1CTL_GPTCNT(x)              USBC_GPTIMER1CTRL_GPTCNT(x)\r\n#define USBHS_GPTIMER1CTL_MODE_MASK              USBC_GPTIMER1CTRL_GPTMODE_MASK\r\n#define USBHS_GPTIMER1CTL_MODE_SHIFT             USBC_GPTIMER1CTRL_GPTMODE_SHIFT\r\n#define USBHS_GPTIMER1CTL_MODE(x)                USBC_GPTIMER1CTRL_GPTMODE(x)\r\n#define USBHS_GPTIMER1CTL_RST_MASK               USBC_GPTIMER1CTRL_GPTRST_MASK\r\n#define USBHS_GPTIMER1CTL_RST_SHIFT              USBC_GPTIMER1CTRL_GPTRST_SHIFT\r\n#define USBHS_GPTIMER1CTL_RST(x)                 USBC_GPTIMER1CTRL_GPTRST(x)\r\n#define USBHS_GPTIMER1CTL_RUN_MASK               USBC_GPTIMER1CTRL_GPTRUN_MASK\r\n#define USBHS_GPTIMER1CTL_RUN_SHIFT              USBC_GPTIMER1CTRL_GPTRUN_SHIFT\r\n#define USBHS_GPTIMER1CTL_RUN(x)                 USBC_GPTIMER1CTRL_GPTRUN(x)\r\n#define USBHS_USBC_SBUSCFG_BURSTMODE_MASK        USBC_SBUSCFG_AHBBRST_MASK\r\n#define USBHS_USBC_SBUSCFG_BURSTMODE_SHIFT       USBC_SBUSCFG_AHBBRST_SHIFT\r\n#define USBHS_USBC_SBUSCFG_BURSTMODE(x)          USBC_SBUSCFG_AHBBRST(x)\r\n#define USBHS_CAPLENGTH_CAPLENGTH_MASK           USBC_CAPLENGTH_CAPLENGTH_MASK\r\n#define USBHS_CAPLENGTH_CAPLENGTH_SHIFT          USBC_CAPLENGTH_CAPLENGTH_SHIFT\r\n#define USBHS_CAPLENGTH_CAPLENGTH(x)             USBC_CAPLENGTH_CAPLENGTH(x)\r\n#define USBHS_CAPLENGTH_HCIVERSION_MASK          USBC_CAPLENGTH_HCIVERSION_MASK\r\n#define USBHS_CAPLENGTH_HCIVERSION_SHIFT         USBC_CAPLENGTH_HCIVERSION_SHIFT\r\n#define USBHS_CAPLENGTH_HCIVERSION(x)            USBC_CAPLENGTH_HCIVERSION(x)\r\n#define USBHS_HCSPARAMS_N_PORTS_MASK             USBC_HCSPARAMS_N_PORTS_MASK\r\n#define USBHS_HCSPARAMS_N_PORTS_SHIFT            USBC_HCSPARAMS_N_PORTS_SHIFT\r\n#define USBHS_HCSPARAMS_N_PORTS(x)               USBC_HCSPARAMS_N_PORTS(x)\r\n#define USBHS_HCSPARAMS_PPC_MASK                 USBC_HCSPARAMS_PPC_MASK\r\n#define USBHS_HCSPARAMS_PPC_SHIFT                USBC_HCSPARAMS_PPC_SHIFT\r\n#define USBHS_HCSPARAMS_PPC(x)                   USBC_HCSPARAMS_PPC(x)\r\n#define USBHS_HCSPARAMS_N_PCC_MASK               USBC_HCSPARAMS_N_PCC_MASK\r\n#define USBHS_HCSPARAMS_N_PCC_SHIFT              USBC_HCSPARAMS_N_PCC_SHIFT\r\n#define USBHS_HCSPARAMS_N_PCC(x)                 USBC_HCSPARAMS_N_PCC(x)\r\n#define USBHS_HCSPARAMS_N_CC_MASK                USBC_HCSPARAMS_N_CC_MASK\r\n#define USBHS_HCSPARAMS_N_CC_SHIFT               USBC_HCSPARAMS_N_CC_SHIFT\r\n#define USBHS_HCSPARAMS_N_CC(x)                  USBC_HCSPARAMS_N_CC(x)\r\n#define USBHS_HCSPARAMS_PI_MASK                  USBC_HCSPARAMS_PI_MASK\r\n#define USBHS_HCSPARAMS_PI_SHIFT                 USBC_HCSPARAMS_PI_SHIFT\r\n#define USBHS_HCSPARAMS_PI(x)                    USBC_HCSPARAMS_PI(x)\r\n#define USBHS_HCSPARAMS_N_PTT_MASK               USBC_HCSPARAMS_N_PTT_MASK\r\n#define USBHS_HCSPARAMS_N_PTT_SHIFT              USBC_HCSPARAMS_N_PTT_SHIFT\r\n#define USBHS_HCSPARAMS_N_PTT(x)                 USBC_HCSPARAMS_N_PTT(x)\r\n#define USBHS_HCSPARAMS_N_TT_MASK                USBC_HCSPARAMS_N_TT_MASK\r\n#define USBHS_HCSPARAMS_N_TT_SHIFT               USBC_HCSPARAMS_N_TT_SHIFT\r\n#define USBHS_HCSPARAMS_N_TT(x)                  USBC_HCSPARAMS_N_TT(x)\r\n#define USBHS_HCCPARAMS_ADC_MASK                 USBC_HCCPARAMS_ADC_MASK\r\n#define USBHS_HCCPARAMS_ADC_SHIFT                USBC_HCCPARAMS_ADC_SHIFT\r\n#define USBHS_HCCPARAMS_ADC(x)                   USBC_HCCPARAMS_ADC(x)\r\n#define USBHS_HCCPARAMS_PFL_MASK                 USBC_HCCPARAMS_PFL_MASK\r\n#define USBHS_HCCPARAMS_PFL_SHIFT                USBC_HCCPARAMS_PFL_SHIFT\r\n#define USBHS_HCCPARAMS_PFL(x)                   USBC_HCCPARAMS_PFL(x)\r\n#define USBHS_HCCPARAMS_ASP_MASK                 USBC_HCCPARAMS_ASP_MASK\r\n#define USBHS_HCCPARAMS_ASP_SHIFT                USBC_HCCPARAMS_ASP_SHIFT\r\n#define USBHS_HCCPARAMS_ASP(x)                   USBC_HCCPARAMS_ASP(x)\r\n#define USBHS_HCCPARAMS_IST_MASK                 USBC_HCCPARAMS_IST_MASK\r\n#define USBHS_HCCPARAMS_IST_SHIFT                USBC_HCCPARAMS_IST_SHIFT\r\n#define USBHS_HCCPARAMS_IST(x)                   USBC_HCCPARAMS_IST(x)\r\n#define USBHS_HCCPARAMS_EECP_MASK                USBC_HCCPARAMS_EECP_MASK\r\n#define USBHS_HCCPARAMS_EECP_SHIFT               USBC_HCCPARAMS_EECP_SHIFT\r\n#define USBHS_HCCPARAMS_EECP(x)                  USBC_HCCPARAMS_EECP(x)\r\n#define USBHS_DCIVERSION_DCIVERSION_MASK         USBC_DCIVERSION_DCIVERSION_MASK\r\n#define USBHS_DCIVERSION_DCIVERSION_SHIFT        USBC_DCIVERSION_DCIVERSION_SHIFT\r\n#define USBHS_DCIVERSION_DCIVERSION(x)           USBC_DCIVERSION_DCIVERSION(x)\r\n#define USBHS_DCCPARAMS_DEN_MASK                 USBC_DCCPARAMS_DEN_MASK\r\n#define USBHS_DCCPARAMS_DEN_SHIFT                USBC_DCCPARAMS_DEN_SHIFT\r\n#define USBHS_DCCPARAMS_DEN(x)                   USBC_DCCPARAMS_DEN(x)\r\n#define USBHS_DCCPARAMS_DC_MASK                  USBC_DCCPARAMS_DC_MASK\r\n#define USBHS_DCCPARAMS_DC_SHIFT                 USBC_DCCPARAMS_DC_SHIFT\r\n#define USBHS_DCCPARAMS_DC(x)                    USBC_DCCPARAMS_DC(x)\r\n#define USBHS_DCCPARAMS_HC_MASK                  USBC_DCCPARAMS_HC_MASK\r\n#define USBHS_DCCPARAMS_HC_SHIFT                 USBC_DCCPARAMS_HC_SHIFT\r\n#define USBHS_DCCPARAMS_HC(x)                    USBC_DCCPARAMS_HC(x)\r\n#define USBHS_USBCMD_RS_MASK                     USBC_USBCMD_RS_MASK\r\n#define USBHS_USBCMD_RS_SHIFT                    USBC_USBCMD_RS_SHIFT\r\n#define USBHS_USBCMD_RS(x)                       USBC_USBCMD_RS(x)\r\n#define USBHS_USBCMD_RST_MASK                    USBC_USBCMD_RST_MASK\r\n#define USBHS_USBCMD_RST_SHIFT                   USBC_USBCMD_RST_SHIFT\r\n#define USBHS_USBCMD_RST(x)                      USBC_USBCMD_RST(x)\r\n#define USBHS_USBCMD_FS_MASK                     USBC_USBCMD_FS1_MASK\r\n#define USBHS_USBCMD_FS_SHIFT                    USBC_USBCMD_FS1_SHIFT\r\n#define USBHS_USBCMD_FS(x)                       USBC_USBCMD_FS1(x)\r\n#define USBHS_USBCMD_PSE_MASK                    USBC_USBCMD_PSE_MASK\r\n#define USBHS_USBCMD_PSE_SHIFT                   USBC_USBCMD_PSE_SHIFT\r\n#define USBHS_USBCMD_PSE(x)                      USBC_USBCMD_PSE(x)\r\n#define USBHS_USBCMD_ASE_MASK                    USBC_USBCMD_ASE_MASK\r\n#define USBHS_USBCMD_ASE_SHIFT                   USBC_USBCMD_ASE_SHIFT\r\n#define USBHS_USBCMD_ASE(x)                      USBC_USBCMD_ASE(x)\r\n#define USBHS_USBCMD_IAA_MASK                    USBC_USBCMD_IAA_MASK\r\n#define USBHS_USBCMD_IAA_SHIFT                   USBC_USBCMD_IAA_SHIFT\r\n#define USBHS_USBCMD_IAA(x)                      USBC_USBCMD_IAA(x)\r\n#define USBHS_USBCMD_ASP_MASK                    USBC_USBCMD_ASP_MASK\r\n#define USBHS_USBCMD_ASP_SHIFT                   USBC_USBCMD_ASP_SHIFT\r\n#define USBHS_USBCMD_ASP(x)                      USBC_USBCMD_ASP(x)\r\n#define USBHS_USBCMD_ASPE_MASK                   USBC_USBCMD_ASPE_MASK\r\n#define USBHS_USBCMD_ASPE_SHIFT                  USBC_USBCMD_ASPE_SHIFT\r\n#define USBHS_USBCMD_ASPE(x)                     USBC_USBCMD_ASPE(x)\r\n#define USBHS_USBCMD_ATDTW_MASK                  USBC_USBCMD_ATDTW_MASK\r\n#define USBHS_USBCMD_ATDTW_SHIFT                 USBC_USBCMD_ATDTW_SHIFT\r\n#define USBHS_USBCMD_ATDTW(x)                    USBC_USBCMD_ATDTW(x)\r\n#define USBHS_USBCMD_SUTW_MASK                   USBC_USBCMD_SUTW_MASK\r\n#define USBHS_USBCMD_SUTW_SHIFT                  USBC_USBCMD_SUTW_SHIFT\r\n#define USBHS_USBCMD_SUTW(x)                     USBC_USBCMD_SUTW(x)\r\n#define USBHS_USBCMD_FS2_MASK                    USBC_USBCMD_FS2_MASK\r\n#define USBHS_USBCMD_FS2_SHIFT                   USBC_USBCMD_FS2_SHIFT\r\n#define USBHS_USBCMD_FS2(x)                      USBC_USBCMD_FS2(x)\r\n#define USBHS_USBCMD_ITC_MASK                    USBC_USBCMD_ITC_MASK\r\n#define USBHS_USBCMD_ITC_SHIFT                   USBC_USBCMD_ITC_SHIFT\r\n#define USBHS_USBCMD_ITC(x)                      USBC_USBCMD_ITC(x)\r\n#define USBHS_USBSTS_UI_MASK                     USBC_USBSTS_UI_MASK\r\n#define USBHS_USBSTS_UI_SHIFT                    USBC_USBSTS_UI_SHIFT\r\n#define USBHS_USBSTS_UI(x)                       USBC_USBSTS_UI(x)\r\n#define USBHS_USBSTS_UEI_MASK                    USBC_USBSTS_UEI_MASK\r\n#define USBHS_USBSTS_UEI_SHIFT                   USBC_USBSTS_UEI_SHIFT\r\n#define USBHS_USBSTS_UEI(x)                      USBC_USBSTS_UEI(x)\r\n#define USBHS_USBSTS_PCI_MASK                    USBC_USBSTS_PCI_MASK\r\n#define USBHS_USBSTS_PCI_SHIFT                   USBC_USBSTS_PCI_SHIFT\r\n#define USBHS_USBSTS_PCI(x)                      USBC_USBSTS_PCI(x)\r\n#define USBHS_USBSTS_FRI_MASK                    USBC_USBSTS_FRI_MASK\r\n#define USBHS_USBSTS_FRI_SHIFT                   USBC_USBSTS_FRI_SHIFT\r\n#define USBHS_USBSTS_FRI(x)                      USBC_USBSTS_FRI(x)\r\n#define USBHS_USBSTS_SEI_MASK                    USBC_USBSTS_SEI_MASK\r\n#define USBHS_USBSTS_SEI_SHIFT                   USBC_USBSTS_SEI_SHIFT\r\n#define USBHS_USBSTS_SEI(x)                      USBC_USBSTS_SEI(x)\r\n#define USBHS_USBSTS_AAI_MASK                    USBC_USBSTS_AAI_MASK\r\n#define USBHS_USBSTS_AAI_SHIFT                   USBC_USBSTS_AAI_SHIFT\r\n#define USBHS_USBSTS_AAI(x)                      USBC_USBSTS_AAI(x)\r\n#define USBHS_USBSTS_URI_MASK                    USBC_USBSTS_URI_MASK\r\n#define USBHS_USBSTS_URI_SHIFT                   USBC_USBSTS_URI_SHIFT\r\n#define USBHS_USBSTS_URI(x)                      USBC_USBSTS_URI(x)\r\n#define USBHS_USBSTS_SRI_MASK                    USBC_USBSTS_SRI_MASK\r\n#define USBHS_USBSTS_SRI_SHIFT                   USBC_USBSTS_SRI_SHIFT\r\n#define USBHS_USBSTS_SRI(x)                      USBC_USBSTS_SRI(x)\r\n#define USBHS_USBSTS_SLI_MASK                    USBC_USBSTS_SLI_MASK\r\n#define USBHS_USBSTS_SLI_SHIFT                   USBC_USBSTS_SLI_SHIFT\r\n#define USBHS_USBSTS_SLI(x)                      USBC_USBSTS_SLI(x)\r\n#define USBHS_USBSTS_ULPII_MASK                  USBC_USBSTS_ULPII_MASK\r\n#define USBHS_USBSTS_ULPII_SHIFT                 USBC_USBSTS_ULPII_SHIFT\r\n#define USBHS_USBSTS_ULPII(x)                    USBC_USBSTS_ULPII(x)\r\n#define USBHS_USBSTS_HCH_MASK                    USBC_USBSTS_HCH_MASK\r\n#define USBHS_USBSTS_HCH_SHIFT                   USBC_USBSTS_HCH_SHIFT\r\n#define USBHS_USBSTS_HCH(x)                      USBC_USBSTS_HCH(x)\r\n#define USBHS_USBSTS_RCL_MASK                    USBC_USBSTS_RCL_MASK\r\n#define USBHS_USBSTS_RCL_SHIFT                   USBC_USBSTS_RCL_SHIFT\r\n#define USBHS_USBSTS_RCL(x)                      USBC_USBSTS_RCL(x)\r\n#define USBHS_USBSTS_PS_MASK                     USBC_USBSTS_PS_MASK\r\n#define USBHS_USBSTS_PS_SHIFT                    USBC_USBSTS_PS_SHIFT\r\n#define USBHS_USBSTS_PS(x)                       USBC_USBSTS_PS(x)\r\n#define USBHS_USBSTS_AS_MASK                     USBC_USBSTS_AS_MASK\r\n#define USBHS_USBSTS_AS_SHIFT                    USBC_USBSTS_AS_SHIFT\r\n#define USBHS_USBSTS_AS(x)                       USBC_USBSTS_AS(x)\r\n#define USBHS_USBSTS_NAKI_MASK                   USBC_USBSTS_NAKI_MASK\r\n#define USBHS_USBSTS_NAKI_SHIFT                  USBC_USBSTS_NAKI_SHIFT\r\n#define USBHS_USBSTS_NAKI(x)                     USBC_USBSTS_NAKI(x)\r\n#define USBHS_USBSTS_TI0_MASK                    USBC_USBSTS_TI0_MASK\r\n#define USBHS_USBSTS_TI0_SHIFT                   USBC_USBSTS_TI0_SHIFT\r\n#define USBHS_USBSTS_TI0(x)                      USBC_USBSTS_TI0(x)\r\n#define USBHS_USBSTS_TI1_MASK                    USBC_USBSTS_TI1_MASK\r\n#define USBHS_USBSTS_TI1_SHIFT                   USBC_USBSTS_TI1_SHIFT\r\n#define USBHS_USBSTS_TI1(x)                      USBC_USBSTS_TI1(x)\r\n#define USBHS_USBINTR_UE_MASK                    USBC_USBINTR_UE_MASK\r\n#define USBHS_USBINTR_UE_SHIFT                   USBC_USBINTR_UE_SHIFT\r\n#define USBHS_USBINTR_UE(x)                      USBC_USBINTR_UE(x)\r\n#define USBHS_USBINTR_UEE_MASK                   USBC_USBINTR_UEE_MASK\r\n#define USBHS_USBINTR_UEE_SHIFT                  USBC_USBINTR_UEE_SHIFT\r\n#define USBHS_USBINTR_UEE(x)                     USBC_USBINTR_UEE(x)\r\n#define USBHS_USBINTR_PCE_MASK                   USBC_USBINTR_PCE_MASK\r\n#define USBHS_USBINTR_PCE_SHIFT                  USBC_USBINTR_PCE_SHIFT\r\n#define USBHS_USBINTR_PCE(x)                     USBC_USBINTR_PCE(x)\r\n#define USBHS_USBINTR_FRE_MASK                   USBC_USBINTR_FRE_MASK\r\n#define USBHS_USBINTR_FRE_SHIFT                  USBC_USBINTR_FRE_SHIFT\r\n#define USBHS_USBINTR_FRE(x)                     USBC_USBINTR_FRE(x)\r\n#define USBHS_USBINTR_SEE_MASK                   USBC_USBINTR_SEE_MASK\r\n#define USBHS_USBINTR_SEE_SHIFT                  USBC_USBINTR_SEE_SHIFT\r\n#define USBHS_USBINTR_SEE(x)                     USBC_USBINTR_SEE(x)\r\n#define USBHS_USBINTR_AAE_MASK                   USBC_USBINTR_AAE_MASK\r\n#define USBHS_USBINTR_AAE_SHIFT                  USBC_USBINTR_AAE_SHIFT\r\n#define USBHS_USBINTR_AAE(x)                     USBC_USBINTR_AAE(x)\r\n#define USBHS_USBINTR_URE_MASK                   USBC_USBINTR_URE_MASK\r\n#define USBHS_USBINTR_URE_SHIFT                  USBC_USBINTR_URE_SHIFT\r\n#define USBHS_USBINTR_URE(x)                     USBC_USBINTR_URE(x)\r\n#define USBHS_USBINTR_SRE_MASK                   USBC_USBINTR_SRE_MASK\r\n#define USBHS_USBINTR_SRE_SHIFT                  USBC_USBINTR_SRE_SHIFT\r\n#define USBHS_USBINTR_SRE(x)                     USBC_USBINTR_SRE(x)\r\n#define USBHS_USBINTR_SLE_MASK                   USBC_USBINTR_SLE_MASK\r\n#define USBHS_USBINTR_SLE_SHIFT                  USBC_USBINTR_SLE_SHIFT\r\n#define USBHS_USBINTR_SLE(x)                     USBC_USBINTR_SLE(x)\r\n#define USBHS_USBINTR_ULPIE_MASK                 USBC_USBINTR_ULPIE_MASK\r\n#define USBHS_USBINTR_ULPIE_SHIFT                USBC_USBINTR_ULPIE_SHIFT\r\n#define USBHS_USBINTR_ULPIE(x)                   USBC_USBINTR_ULPIE(x)\r\n#define USBHS_USBINTR_NAKE_MASK                  USBC_USBINTR_NAKE_MASK\r\n#define USBHS_USBINTR_NAKE_SHIFT                 USBC_USBINTR_NAKE_SHIFT\r\n#define USBHS_USBINTR_NAKE(x)                    USBC_USBINTR_NAKE(x)\r\n#define USBHS_USBINTR_UAIE_MASK                  USBC_USBINTR_UAIE_MASK\r\n#define USBHS_USBINTR_UAIE_SHIFT                 USBC_USBINTR_UAIE_SHIFT\r\n#define USBHS_USBINTR_UAIE(x)                    USBC_USBINTR_UAIE(x)\r\n#define USBHS_USBINTR_UPIE_MASK                  USBC_USBINTR_UPIE_MASK\r\n#define USBHS_USBINTR_UPIE_SHIFT                 USBC_USBINTR_UPIE_SHIFT\r\n#define USBHS_USBINTR_UPIE(x)                    USBC_USBINTR_UPIE(x)\r\n#define USBHS_USBINTR_TIE0_MASK                  USBC_USBINTR_TIE0_MASK\r\n#define USBHS_USBINTR_TIE0_SHIFT                 USBC_USBINTR_TIE0_SHIFT\r\n#define USBHS_USBINTR_TIE0(x)                    USBC_USBINTR_TIE0(x)\r\n#define USBHS_USBINTR_TIE1_MASK                  USBC_USBINTR_TIE1_MASK\r\n#define USBHS_USBINTR_TIE1_SHIFT                 USBC_USBINTR_TIE1_SHIFT\r\n#define USBHS_USBINTR_TIE1(x)                    USBC_USBINTR_TIE1(x)\r\n#define USBHS_FRINDEX_FRINDEX_MASK               USBC_FRINDEX_FRINDEX_MASK\r\n#define USBHS_FRINDEX_FRINDEX_SHIFT              USBC_FRINDEX_FRINDEX_SHIFT\r\n#define USBHS_FRINDEX_FRINDEX(x)                 USBC_FRINDEX_FRINDEX(x)\r\n#define USBHS_DEVICEADDR_USBADRA_MASK            USBC_DEVICEADDR_USBADRA_MASK\r\n#define USBHS_DEVICEADDR_USBADRA_SHIFT           USBC_DEVICEADDR_USBADRA_SHIFT\r\n#define USBHS_DEVICEADDR_USBADRA(x)              USBC_DEVICEADDR_USBADRA(x)\r\n#define USBHS_DEVICEADDR_USBADR_MASK             USBC_DEVICEADDR_USBADR_MASK\r\n#define USBHS_DEVICEADDR_USBADR_SHIFT            USBC_DEVICEADDR_USBADR_SHIFT\r\n#define USBHS_DEVICEADDR_USBADR(x)               USBC_DEVICEADDR_USBADR(x)\r\n#define USBHS_PERIODICLISTBASE_PERBASE_MASK      USBC_PERIODICLISTBASE_PERBASE_MASK\r\n#define USBHS_PERIODICLISTBASE_PERBASE_SHIFT     USBC_PERIODICLISTBASE_PERBASE_SHIFT\r\n#define USBHS_PERIODICLISTBASE_PERBASE(x)        USBC_PERIODICLISTBASE_PERBASE(x)\r\n#define USBHS_ASYNCLISTADDR_ASYBASE_MASK         USBC_ASYNCLISTADDR_ASYBASE_MASK\r\n#define USBHS_ASYNCLISTADDR_ASYBASE_SHIFT        USBC_ASYNCLISTADDR_ASYBASE_SHIFT\r\n#define USBHS_ASYNCLISTADDR_ASYBASE(x)           USBC_ASYNCLISTADDR_ASYBASE(x)\r\n#define USBHS_EPLISTADDR_EPBASE_MASK             USBC_ENDPOINTLISTADDR_EPBASE_MASK\r\n#define USBHS_EPLISTADDR_EPBASE_SHIFT            USBC_ENDPOINTLISTADDR_EPBASE_SHIFT\r\n#define USBHS_EPLISTADDR_EPBASE(x)               USBC_ENDPOINTLISTADDR_EPBASE(x)\r\n#define USBHS_BURSTSIZE_RXPBURST_MASK            USBC_BURSTSIZE_RXPBURST_MASK\r\n#define USBHS_BURSTSIZE_RXPBURST_SHIFT           USBC_BURSTSIZE_RXPBURST_SHIFT\r\n#define USBHS_BURSTSIZE_RXPBURST(x)              USBC_BURSTSIZE_RXPBURST(x)\r\n#define USBHS_BURSTSIZE_TXPBURST_MASK            USBC_BURSTSIZE_TXPBURST_MASK\r\n#define USBHS_BURSTSIZE_TXPBURST_SHIFT           USBC_BURSTSIZE_TXPBURST_SHIFT\r\n#define USBHS_BURSTSIZE_TXPBURST(x)              USBC_BURSTSIZE_TXPBURST(x)\r\n#define USBHS_TXFILLTUNING_TXSCHOH_MASK          USBC_TXFILLTUNING_TXSCHOH_MASK\r\n#define USBHS_TXFILLTUNING_TXSCHOH_SHIFT         USBC_TXFILLTUNING_TXSCHOH_SHIFT\r\n#define USBHS_TXFILLTUNING_TXSCHOH(x)            USBC_TXFILLTUNING_TXSCHOH(x)\r\n#define USBHS_TXFILLTUNING_TXSCHHEALTH_MASK      USBC_TXFILLTUNING_TXSCHHEALTH_MASK\r\n#define USBHS_TXFILLTUNING_TXSCHHEALTH_SHIFT     USBC_TXFILLTUNING_TXSCHHEALTH_SHIFT\r\n#define USBHS_TXFILLTUNING_TXSCHHEALTH(x)        USBC_TXFILLTUNING_TXSCHHEALTH(x)\r\n#define USBHS_TXFILLTUNING_TXFIFOTHRES_MASK      USBC_TXFILLTUNING_TXFIFOTHRES_MASK\r\n#define USBHS_TXFILLTUNING_TXFIFOTHRES_SHIFT     USBC_TXFILLTUNING_TXFIFOTHRES_SHIFT\r\n#define USBHS_TXFILLTUNING_TXFIFOTHRES(x)        USBC_TXFILLTUNING_TXFIFOTHRES(x)\r\n#define USBHS_ENDPTNAK_EPRN_MASK                 USBC_ENDPTNAK_EPRN_MASK\r\n#define USBHS_ENDPTNAK_EPRN_SHIFT                USBC_ENDPTNAK_EPRN_SHIFT\r\n#define USBHS_ENDPTNAK_EPRN(x)                   USBC_ENDPTNAK_EPRN(x)\r\n#define USBHS_ENDPTNAK_EPTN_MASK                 USBC_ENDPTNAK_EPTN_MASK\r\n#define USBHS_ENDPTNAK_EPTN_SHIFT                USBC_ENDPTNAK_EPTN_SHIFT\r\n#define USBHS_ENDPTNAK_EPTN(x)                   USBC_ENDPTNAK_EPTN(x)\r\n#define USBHS_ENDPTNAKEN_EPRNE_MASK              USBC_ENDPTNAKEN_EPRNE_MASK\r\n#define USBHS_ENDPTNAKEN_EPRNE_SHIFT             USBC_ENDPTNAKEN_EPRNE_SHIFT\r\n#define USBHS_ENDPTNAKEN_EPRNE(x)                USBC_ENDPTNAKEN_EPRNE(x)\r\n#define USBHS_ENDPTNAKEN_EPTNE_MASK              USBC_ENDPTNAKEN_EPTNE_MASK\r\n#define USBHS_ENDPTNAKEN_EPTNE_SHIFT             USBC_ENDPTNAKEN_EPTNE_SHIFT\r\n#define USBHS_ENDPTNAKEN_EPTNE(x)                USBC_ENDPTNAKEN_EPTNE(x)\r\n#define USBHS_CONFIGFLAG_CF_MASK                 USBC_CONFIGFLAG_CF_MASK\r\n#define USBHS_CONFIGFLAG_CF_SHIFT                USBC_CONFIGFLAG_CF_SHIFT\r\n#define USBHS_CONFIGFLAG_CF(x)                   USBC_CONFIGFLAG_CF(x)\r\n#define USBHS_PORTSC1_CCS_MASK                   USBC_PORTSC1_CCS_MASK\r\n#define USBHS_PORTSC1_CCS_SHIFT                  USBC_PORTSC1_CCS_SHIFT\r\n#define USBHS_PORTSC1_CCS(x)                     USBC_PORTSC1_CCS(x)\r\n#define USBHS_PORTSC1_CSC_MASK                   USBC_PORTSC1_CSC_MASK\r\n#define USBHS_PORTSC1_CSC_SHIFT                  USBC_PORTSC1_CSC_SHIFT\r\n#define USBHS_PORTSC1_CSC(x)                     USBC_PORTSC1_CSC(x)\r\n#define USBHS_PORTSC1_PE_MASK                    USBC_PORTSC1_PE_MASK\r\n#define USBHS_PORTSC1_PE_SHIFT                   USBC_PORTSC1_PE_SHIFT\r\n#define USBHS_PORTSC1_PE(x)                      USBC_PORTSC1_PE(x)\r\n#define USBHS_PORTSC1_PEC_MASK                   USBC_PORTSC1_PEC_MASK\r\n#define USBHS_PORTSC1_PEC_SHIFT                  USBC_PORTSC1_PEC_SHIFT\r\n#define USBHS_PORTSC1_PEC(x)                     USBC_PORTSC1_PEC(x)\r\n#define USBHS_PORTSC1_OCA_MASK                   USBC_PORTSC1_OCA_MASK\r\n#define USBHS_PORTSC1_OCA_SHIFT                  USBC_PORTSC1_OCA_SHIFT\r\n#define USBHS_PORTSC1_OCA(x)                     USBC_PORTSC1_OCA(x)\r\n#define USBHS_PORTSC1_OCC_MASK                   USBC_PORTSC1_OCC_MASK\r\n#define USBHS_PORTSC1_OCC_SHIFT                  USBC_PORTSC1_OCC_SHIFT\r\n#define USBHS_PORTSC1_OCC(x)                     USBC_PORTSC1_OCC(x)\r\n#define USBHS_PORTSC1_FPR_MASK                   USBC_PORTSC1_FPR_MASK\r\n#define USBHS_PORTSC1_FPR_SHIFT                  USBC_PORTSC1_FPR_SHIFT\r\n#define USBHS_PORTSC1_FPR(x)                     USBC_PORTSC1_FPR(x)\r\n#define USBHS_PORTSC1_SUSP_MASK                  USBC_PORTSC1_SUSP_MASK\r\n#define USBHS_PORTSC1_SUSP_SHIFT                 USBC_PORTSC1_SUSP_SHIFT\r\n#define USBHS_PORTSC1_SUSP(x)                    USBC_PORTSC1_SUSP(x)\r\n#define USBHS_PORTSC1_PR_MASK                    USBC_PORTSC1_PR_MASK\r\n#define USBHS_PORTSC1_PR_SHIFT                   USBC_PORTSC1_PR_SHIFT\r\n#define USBHS_PORTSC1_PR(x)                      USBC_PORTSC1_PR(x)\r\n#define USBHS_PORTSC1_HSP_MASK                   USBC_PORTSC1_HSP_MASK\r\n#define USBHS_PORTSC1_HSP_SHIFT                  USBC_PORTSC1_HSP_SHIFT\r\n#define USBHS_PORTSC1_HSP(x)                     USBC_PORTSC1_HSP(x)\r\n#define USBHS_PORTSC1_LS_MASK                    USBC_PORTSC1_LS_MASK\r\n#define USBHS_PORTSC1_LS_SHIFT                   USBC_PORTSC1_LS_SHIFT\r\n#define USBHS_PORTSC1_LS(x)                      USBC_PORTSC1_LS(x)\r\n#define USBHS_PORTSC1_PP_MASK                    USBC_PORTSC1_PP_MASK\r\n#define USBHS_PORTSC1_PP_SHIFT                   USBC_PORTSC1_PP_SHIFT\r\n#define USBHS_PORTSC1_PP(x)                      USBC_PORTSC1_PP(x)\r\n#define USBHS_PORTSC1_PO_MASK                    USBC_PORTSC1_PO_MASK\r\n#define USBHS_PORTSC1_PO_SHIFT                   USBC_PORTSC1_PO_SHIFT\r\n#define USBHS_PORTSC1_PO(x)                      USBC_PORTSC1_PO(x)\r\n#define USBHS_PORTSC1_PIC_MASK                   USBC_PORTSC1_PIC_MASK\r\n#define USBHS_PORTSC1_PIC_SHIFT                  USBC_PORTSC1_PIC_SHIFT\r\n#define USBHS_PORTSC1_PIC(x)                     USBC_PORTSC1_PIC(x)\r\n#define USBHS_PORTSC1_PTC_MASK                   USBC_PORTSC1_PTC_MASK\r\n#define USBHS_PORTSC1_PTC_SHIFT                  USBC_PORTSC1_PTC_SHIFT\r\n#define USBHS_PORTSC1_PTC(x)                     USBC_PORTSC1_PTC(x)\r\n#define USBHS_PORTSC1_WKCN_MASK                  USBC_PORTSC1_WKCN_MASK\r\n#define USBHS_PORTSC1_WKCN_SHIFT                 USBC_PORTSC1_WKCN_SHIFT\r\n#define USBHS_PORTSC1_WKCN(x)                    USBC_PORTSC1_WKCN(x)\r\n#define USBHS_PORTSC1_WKDS_MASK                  USBC_PORTSC1_WKDS_MASK\r\n#define USBHS_PORTSC1_WKDS_SHIFT                 USBC_PORTSC1_WKDS_SHIFT\r\n#define USBHS_PORTSC1_WKDS(x)                    USBC_PORTSC1_WKDS(x)\r\n#define USBHS_PORTSC1_WKOC_MASK                  USBC_PORTSC1_WKOC_MASK\r\n#define USBHS_PORTSC1_WKOC_SHIFT                 USBC_PORTSC1_WKOC_SHIFT\r\n#define USBHS_PORTSC1_WKOC(x)                    USBC_PORTSC1_WKOC(x)\r\n#define USBHS_PORTSC1_PHCD_MASK                  USBC_PORTSC1_PHCD_MASK\r\n#define USBHS_PORTSC1_PHCD_SHIFT                 USBC_PORTSC1_PHCD_SHIFT\r\n#define USBHS_PORTSC1_PHCD(x)                    USBC_PORTSC1_PHCD(x)\r\n#define USBHS_PORTSC1_PFSC_MASK                  USBC_PORTSC1_PFSC_MASK\r\n#define USBHS_PORTSC1_PFSC_SHIFT                 USBC_PORTSC1_PFSC_SHIFT\r\n#define USBHS_PORTSC1_PFSC(x)                    USBC_PORTSC1_PFSC(x)\r\n#define USBHS_PORTSC1_PTS2_MASK                  USBC_PORTSC1_PTS_2_MASK\r\n#define USBHS_PORTSC1_PTS2_SHIFT                 USBC_PORTSC1_PTS_2_SHIFT\r\n#define USBHS_PORTSC1_PTS2(x)                    USBC_PORTSC1_PTS_2(x)\r\n#define USBHS_PORTSC1_PSPD_MASK                  USBC_PORTSC1_PSPD_MASK\r\n#define USBHS_PORTSC1_PSPD_SHIFT                 USBC_PORTSC1_PSPD_SHIFT\r\n#define USBHS_PORTSC1_PSPD(x)                    USBC_PORTSC1_PSPD(x)\r\n#define USBHS_PORTSC1_PTW_MASK                   USBC_PORTSC1_PTW_MASK\r\n#define USBHS_PORTSC1_PTW_SHIFT                  USBC_PORTSC1_PTW_SHIFT\r\n#define USBHS_PORTSC1_PTW(x)                     USBC_PORTSC1_PTW(x)\r\n#define USBHS_PORTSC1_STS_MASK                   USBC_PORTSC1_STS_MASK\r\n#define USBHS_PORTSC1_STS_SHIFT                  USBC_PORTSC1_STS_SHIFT\r\n#define USBHS_PORTSC1_STS(x)                     USBC_PORTSC1_STS(x)\r\n#define USBHS_PORTSC1_PTS_MASK                   USBC_PORTSC1_PTS_1_MASK\r\n#define USBHS_PORTSC1_PTS_SHIFT                  USBC_PORTSC1_PTS_1_SHIFT\r\n#define USBHS_PORTSC1_PTS(x)                     USBC_PORTSC1_PTS_1(x)\r\n#define USBHS_OTGSC_VD_MASK                      USBC_OTGSC_VD_MASK\r\n#define USBHS_OTGSC_VD_SHIFT                     USBC_OTGSC_VD_SHIFT\r\n#define USBHS_OTGSC_VD(x)                        USBC_OTGSC_VD(x)\r\n#define USBHS_OTGSC_VC_MASK                      USBC_OTGSC_VC_MASK\r\n#define USBHS_OTGSC_VC_SHIFT                     USBC_OTGSC_VC_SHIFT\r\n#define USBHS_OTGSC_VC(x)                        USBC_OTGSC_VC(x)\r\n#define USBHS_OTGSC_OT_MASK                      USBC_OTGSC_OT_MASK\r\n#define USBHS_OTGSC_OT_SHIFT                     USBC_OTGSC_OT_SHIFT\r\n#define USBHS_OTGSC_OT(x)                        USBC_OTGSC_OT(x)\r\n#define USBHS_OTGSC_DP_MASK                      USBC_OTGSC_DP_MASK\r\n#define USBHS_OTGSC_DP_SHIFT                     USBC_OTGSC_DP_SHIFT\r\n#define USBHS_OTGSC_DP(x)                        USBC_OTGSC_DP(x)\r\n#define USBHS_OTGSC_IDPU_MASK                    USBC_OTGSC_IDPU_MASK\r\n#define USBHS_OTGSC_IDPU_SHIFT                   USBC_OTGSC_IDPU_SHIFT\r\n#define USBHS_OTGSC_IDPU(x)                      USBC_OTGSC_IDPU(x)\r\n#define USBHS_OTGSC_ID_MASK                      USBC_OTGSC_ID_MASK\r\n#define USBHS_OTGSC_ID_SHIFT                     USBC_OTGSC_ID_SHIFT\r\n#define USBHS_OTGSC_ID(x)                        USBC_OTGSC_ID(x)\r\n#define USBHS_OTGSC_AVV_MASK                     USBC_OTGSC_AVV_MASK\r\n#define USBHS_OTGSC_AVV_SHIFT                    USBC_OTGSC_AVV_SHIFT\r\n#define USBHS_OTGSC_AVV(x)                       USBC_OTGSC_AVV(x)\r\n#define USBHS_OTGSC_ASV_MASK                     USBC_OTGSC_ASV_MASK\r\n#define USBHS_OTGSC_ASV_SHIFT                    USBC_OTGSC_ASV_SHIFT\r\n#define USBHS_OTGSC_ASV(x)                       USBC_OTGSC_ASV(x)\r\n#define USBHS_OTGSC_BSV_MASK                     USBC_OTGSC_BSV_MASK\r\n#define USBHS_OTGSC_BSV_SHIFT                    USBC_OTGSC_BSV_SHIFT\r\n#define USBHS_OTGSC_BSV(x)                       USBC_OTGSC_BSV(x)\r\n#define USBHS_OTGSC_BSE_MASK                     USBC_OTGSC_BSE_MASK\r\n#define USBHS_OTGSC_BSE_SHIFT                    USBC_OTGSC_BSE_SHIFT\r\n#define USBHS_OTGSC_BSE(x)                       USBC_OTGSC_BSE(x)\r\n#define USBHS_OTGSC_MST_MASK                     USBC_OTGSC_TOG_1MS_MASK\r\n#define USBHS_OTGSC_MST_SHIFT                    USBC_OTGSC_TOG_1MS_SHIFT\r\n#define USBHS_OTGSC_MST(x)                       USBC_OTGSC_TOG_1MS(x)\r\n#define USBHS_OTGSC_DPS_MASK                     USBC_OTGSC_DPS_MASK\r\n#define USBHS_OTGSC_DPS_SHIFT                    USBC_OTGSC_DPS_SHIFT\r\n#define USBHS_OTGSC_DPS(x)                       USBC_OTGSC_DPS(x)\r\n#define USBHS_OTGSC_IDIS_MASK                    USBC_OTGSC_IDIS_MASK\r\n#define USBHS_OTGSC_IDIS_SHIFT                   USBC_OTGSC_IDIS_SHIFT\r\n#define USBHS_OTGSC_IDIS(x)                      USBC_OTGSC_IDIS(x)\r\n#define USBHS_OTGSC_AVVIS_MASK                   USBC_OTGSC_AVVIS_MASK\r\n#define USBHS_OTGSC_AVVIS_SHIFT                  USBC_OTGSC_AVVIS_SHIFT\r\n#define USBHS_OTGSC_AVVIS(x)                     USBC_OTGSC_AVVIS(x)\r\n#define USBHS_OTGSC_ASVIS_MASK                   USBC_OTGSC_ASVIS_MASK\r\n#define USBHS_OTGSC_ASVIS_SHIFT                  USBC_OTGSC_ASVIS_SHIFT\r\n#define USBHS_OTGSC_ASVIS(x)                     USBC_OTGSC_ASVIS(x)\r\n#define USBHS_OTGSC_BSVIS_MASK                   USBC_OTGSC_BSVIS_MASK\r\n#define USBHS_OTGSC_BSVIS_SHIFT                  USBC_OTGSC_BSVIS_SHIFT\r\n#define USBHS_OTGSC_BSVIS(x)                     USBC_OTGSC_BSVIS(x)\r\n#define USBHS_OTGSC_BSEIS_MASK                   USBC_OTGSC_BSEIS_MASK\r\n#define USBHS_OTGSC_BSEIS_SHIFT                  USBC_OTGSC_BSEIS_SHIFT\r\n#define USBHS_OTGSC_BSEIS(x)                     USBC_OTGSC_BSEIS(x)\r\n#define USBHS_OTGSC_MSS_MASK                     USBC_OTGSC_STATUS_1MS_MASK\r\n#define USBHS_OTGSC_MSS_SHIFT                    USBC_OTGSC_STATUS_1MS_SHIFT\r\n#define USBHS_OTGSC_MSS(x)                       USBC_OTGSC_STATUS_1MS(x)\r\n#define USBHS_OTGSC_DPIS_MASK                    USBC_OTGSC_DPIS_MASK\r\n#define USBHS_OTGSC_DPIS_SHIFT                   USBC_OTGSC_DPIS_SHIFT\r\n#define USBHS_OTGSC_DPIS(x)                      USBC_OTGSC_DPIS(x)\r\n#define USBHS_OTGSC_IDIE_MASK                    USBC_OTGSC_IDIE_MASK\r\n#define USBHS_OTGSC_IDIE_SHIFT                   USBC_OTGSC_IDIE_SHIFT\r\n#define USBHS_OTGSC_IDIE(x)                      USBC_OTGSC_IDIE(x)\r\n#define USBHS_OTGSC_AVVIE_MASK                   USBC_OTGSC_AVVIE_MASK\r\n#define USBHS_OTGSC_AVVIE_SHIFT                  USBC_OTGSC_AVVIE_SHIFT\r\n#define USBHS_OTGSC_AVVIE(x)                     USBC_OTGSC_AVVIE(x)\r\n#define USBHS_OTGSC_ASVIE_MASK                   USBC_OTGSC_ASVIE_MASK\r\n#define USBHS_OTGSC_ASVIE_SHIFT                  USBC_OTGSC_ASVIE_SHIFT\r\n#define USBHS_OTGSC_ASVIE(x)                     USBC_OTGSC_ASVIE(x)\r\n#define USBHS_OTGSC_BSVIE_MASK                   USBC_OTGSC_BSVIE_MASK\r\n#define USBHS_OTGSC_BSVIE_SHIFT                  USBC_OTGSC_BSVIE_SHIFT\r\n#define USBHS_OTGSC_BSVIE(x)                     USBC_OTGSC_BSVIE(x)\r\n#define USBHS_OTGSC_BSEIE_MASK                   USBC_OTGSC_BSEIE_MASK\r\n#define USBHS_OTGSC_BSEIE_SHIFT                  USBC_OTGSC_BSEIE_SHIFT\r\n#define USBHS_OTGSC_BSEIE(x)                     USBC_OTGSC_BSEIE(x)\r\n#define USBHS_OTGSC_MSE_MASK                     USBC_OTGSC_EN_1MS_MASK\r\n#define USBHS_OTGSC_MSE_SHIFT                    USBC_OTGSC_EN_1MS_SHIFT\r\n#define USBHS_OTGSC_MSE(x)                       USBC_OTGSC_EN_1MS(x)\r\n#define USBHS_OTGSC_DPIE_MASK                    USBC_OTGSC_DPIE_MASK\r\n#define USBHS_OTGSC_DPIE_SHIFT                   USBC_OTGSC_DPIE_SHIFT\r\n#define USBHS_OTGSC_DPIE(x)                      USBC_OTGSC_DPIE(x)\r\n#define USBHS_USBMODE_CM_MASK                    USBC_USBMODE_CM_MASK\r\n#define USBHS_USBMODE_CM_SHIFT                   USBC_USBMODE_CM_SHIFT\r\n#define USBHS_USBMODE_CM(x)                      USBC_USBMODE_CM(x)\r\n#define USBHS_USBMODE_ES_MASK                    USBC_USBMODE_ES_MASK\r\n#define USBHS_USBMODE_ES_SHIFT                   USBC_USBMODE_ES_SHIFT\r\n#define USBHS_USBMODE_ES(x)                      USBC_USBMODE_ES(x)\r\n#define USBHS_USBMODE_SLOM_MASK                  USBC_USBMODE_SLOM_MASK\r\n#define USBHS_USBMODE_SLOM_SHIFT                 USBC_USBMODE_SLOM_SHIFT\r\n#define USBHS_USBMODE_SLOM(x)                    USBC_USBMODE_SLOM(x)\r\n#define USBHS_USBMODE_SDIS_MASK                  USBC_USBMODE_SDIS_MASK\r\n#define USBHS_USBMODE_SDIS_SHIFT                 USBC_USBMODE_SDIS_SHIFT\r\n#define USBHS_USBMODE_SDIS(x)                    USBC_USBMODE_SDIS(x)\r\n#define USBHS_EPSETUPSR_EPSETUPSTAT_MASK         USBC_ENDPTSETUPSTAT_ENDPTSETUPSTAT_MASK\r\n#define USBHS_EPSETUPSR_EPSETUPSTAT_SHIFT        USBC_ENDPTSETUPSTAT_ENDPTSETUPSTAT_SHIFT\r\n#define USBHS_EPSETUPSR_EPSETUPSTAT(x)           USBC_ENDPTSETUPSTAT_ENDPTSETUPSTAT(x)\r\n#define USBHS_EPPRIME_PERB_MASK                  USBC_ENDPTPRIME_PERB_MASK\r\n#define USBHS_EPPRIME_PERB_SHIFT                 USBC_ENDPTPRIME_PERB_SHIFT\r\n#define USBHS_EPPRIME_PERB(x)                    USBC_ENDPTPRIME_PERB(x)\r\n#define USBHS_EPPRIME_PETB_MASK                  USBC_ENDPTPRIME_PETB_MASK\r\n#define USBHS_EPPRIME_PETB_SHIFT                 USBC_ENDPTPRIME_PETB_SHIFT\r\n#define USBHS_EPPRIME_PETB(x)                    USBC_ENDPTPRIME_PETB(x)\r\n#define USBHS_EPFLUSH_FERB_MASK                  USBC_ENDPTFLUSH_FERB_MASK\r\n#define USBHS_EPFLUSH_FERB_SHIFT                 USBC_ENDPTFLUSH_FERB_SHIFT\r\n#define USBHS_EPFLUSH_FERB(x)                    USBC_ENDPTFLUSH_FERB(x)\r\n#define USBHS_EPFLUSH_FETB_MASK                  USBC_ENDPTFLUSH_FETB_MASK\r\n#define USBHS_EPFLUSH_FETB_SHIFT                 USBC_ENDPTFLUSH_FETB_SHIFT\r\n#define USBHS_EPFLUSH_FETB(x)                    USBC_ENDPTFLUSH_FETB(x)\r\n#define USBHS_EPSR_ERBR_MASK                     USBC_ENDPTSTAT_ERBR_MASK\r\n#define USBHS_EPSR_ERBR_SHIFT                    USBC_ENDPTSTAT_ERBR_SHIFT\r\n#define USBHS_EPSR_ERBR(x)                       USBC_ENDPTSTAT_ERBR(x)\r\n#define USBHS_EPSR_ETBR_MASK                     USBC_ENDPTSTAT_ETBR_MASK\r\n#define USBHS_EPSR_ETBR_SHIFT                    USBC_ENDPTSTAT_ETBR_SHIFT\r\n#define USBHS_EPSR_ETBR(x)                       USBC_ENDPTSTAT_ETBR(x)\r\n#define USBHS_EPCOMPLETE_ERCE_MASK               USBC_ENDPTCOMPLETE_ERCE_MASK\r\n#define USBHS_EPCOMPLETE_ERCE_SHIFT              USBC_ENDPTCOMPLETE_ERCE_SHIFT\r\n#define USBHS_EPCOMPLETE_ERCE(x)                 USBC_ENDPTCOMPLETE_ERCE(x)\r\n#define USBHS_EPCOMPLETE_ETCE_MASK               USBC_ENDPTCOMPLETE_ETCE_MASK\r\n#define USBHS_EPCOMPLETE_ETCE_SHIFT              USBC_ENDPTCOMPLETE_ETCE_SHIFT\r\n#define USBHS_EPCOMPLETE_ETCE(x)                 USBC_ENDPTCOMPLETE_ETCE(x)\r\n#define USBHS_EPCR0_RXS_MASK                     USBC_ENDPTCTRL0_RXS_MASK\r\n#define USBHS_EPCR0_RXS_SHIFT                    USBC_ENDPTCTRL0_RXS_SHIFT\r\n#define USBHS_EPCR0_RXS(x)                       USBC_ENDPTCTRL0_RXS(x)\r\n#define USBHS_EPCR0_RXT_MASK                     USBC_ENDPTCTRL0_RXT_MASK\r\n#define USBHS_EPCR0_RXT_SHIFT                    USBC_ENDPTCTRL0_RXT_SHIFT\r\n#define USBHS_EPCR0_RXT(x)                       USBC_ENDPTCTRL0_RXT(x)\r\n#define USBHS_EPCR0_RXE_MASK                     USBC_ENDPTCTRL0_RXE_MASK\r\n#define USBHS_EPCR0_RXE_SHIFT                    USBC_ENDPTCTRL0_RXE_SHIFT\r\n#define USBHS_EPCR0_RXE(x)                       USBC_ENDPTCTRL0_RXE(x)\r\n#define USBHS_EPCR0_TXS_MASK                     USBC_ENDPTCTRL0_TXS_MASK\r\n#define USBHS_EPCR0_TXS_SHIFT                    USBC_ENDPTCTRL0_TXS_SHIFT\r\n#define USBHS_EPCR0_TXS(x)                       USBC_ENDPTCTRL0_TXS(x)\r\n#define USBHS_EPCR0_TXT_MASK                     USBC_ENDPTCTRL0_TXT_MASK\r\n#define USBHS_EPCR0_TXT_SHIFT                    USBC_ENDPTCTRL0_TXT_SHIFT\r\n#define USBHS_EPCR0_TXT(x)                       USBC_ENDPTCTRL0_TXT(x)\r\n#define USBHS_EPCR0_TXE_MASK                     USBC_ENDPTCTRL0_TXE_MASK\r\n#define USBHS_EPCR0_TXE_SHIFT                    USBC_ENDPTCTRL0_TXE_SHIFT\r\n#define USBHS_EPCR0_TXE(x)                       USBC_ENDPTCTRL0_TXE(x)\r\n#define USBHS_EPCR_RXS_MASK                      USBC_ENDPTCTRL_RXS_MASK\r\n#define USBHS_EPCR_RXS_SHIFT                     USBC_ENDPTCTRL_RXS_SHIFT\r\n#define USBHS_EPCR_RXS(x)                        USBC_ENDPTCTRL_RXS(x)\r\n#define USBHS_EPCR_RXD_MASK                      USBC_ENDPTCTRL_RXD_MASK\r\n#define USBHS_EPCR_RXD_SHIFT                     USBC_ENDPTCTRL_RXD_SHIFT\r\n#define USBHS_EPCR_RXD(x)                        USBC_ENDPTCTRL_RXD(x)\r\n#define USBHS_EPCR_RXT_MASK                      USBC_ENDPTCTRL_RXT_MASK\r\n#define USBHS_EPCR_RXT_SHIFT                     USBC_ENDPTCTRL_RXT_SHIFT\r\n#define USBHS_EPCR_RXT(x)                        USBC_ENDPTCTRL_RXT(x)\r\n#define USBHS_EPCR_RXI_MASK                      USBC_ENDPTCTRL_RXI_MASK\r\n#define USBHS_EPCR_RXI_SHIFT                     USBC_ENDPTCTRL_RXI_SHIFT\r\n#define USBHS_EPCR_RXI(x)                        USBC_ENDPTCTRL_RXI(x)\r\n#define USBHS_EPCR_RXR_MASK                      USBC_ENDPTCTRL_RXR_MASK\r\n#define USBHS_EPCR_RXR_SHIFT                     USBC_ENDPTCTRL_RXR_SHIFT\r\n#define USBHS_EPCR_RXR(x)                        USBC_ENDPTCTRL_RXR(x)\r\n#define USBHS_EPCR_RXE_MASK                      USBC_ENDPTCTRL_RXE_MASK\r\n#define USBHS_EPCR_RXE_SHIFT                     USBC_ENDPTCTRL_RXE_SHIFT\r\n#define USBHS_EPCR_RXE(x)                        USBC_ENDPTCTRL_RXE(x)\r\n#define USBHS_EPCR_TXS_MASK                      USBC_ENDPTCTRL_TXS_MASK\r\n#define USBHS_EPCR_TXS_SHIFT                     USBC_ENDPTCTRL_TXS_SHIFT\r\n#define USBHS_EPCR_TXS(x)                        USBC_ENDPTCTRL_TXS(x)\r\n#define USBHS_EPCR_TXD_MASK                      USBC_ENDPTCTRL_TXD_MASK\r\n#define USBHS_EPCR_TXD_SHIFT                     USBC_ENDPTCTRL_TXD_SHIFT\r\n#define USBHS_EPCR_TXD(x)                        USBC_ENDPTCTRL_TXD(x)\r\n#define USBHS_EPCR_TXT_MASK                      USBC_ENDPTCTRL_TXT_MASK\r\n#define USBHS_EPCR_TXT_SHIFT                     USBC_ENDPTCTRL_TXT_SHIFT\r\n#define USBHS_EPCR_TXT(x)                        USBC_ENDPTCTRL_TXT(x)\r\n#define USBHS_EPCR_TXI_MASK                      USBC_ENDPTCTRL_TXI_MASK\r\n#define USBHS_EPCR_TXI_SHIFT                     USBC_ENDPTCTRL_TXI_SHIFT\r\n#define USBHS_EPCR_TXI(x)                        USBC_ENDPTCTRL_TXI(x)\r\n#define USBHS_EPCR_TXR_MASK                      USBC_ENDPTCTRL_TXR_MASK\r\n#define USBHS_EPCR_TXR_SHIFT                     USBC_ENDPTCTRL_TXR_SHIFT\r\n#define USBHS_EPCR_TXR(x)                        USBC_ENDPTCTRL_TXR(x)\r\n#define USBHS_EPCR_TXE_MASK                      USBC_ENDPTCTRL_TXE_MASK\r\n#define USBHS_EPCR_TXE_SHIFT                     USBC_ENDPTCTRL_TXE_SHIFT\r\n#define USBHS_EPCR_TXE(x)                        USBC_ENDPTCTRL_TXE(x)\r\n#define USBHS_EPCR_COUNT                         USBC_ENDPTCTRL_COUNT\r\n#define USBHS_Type                               USBC_Type\r\n#define USBHS_BASE_ADDRS                         { USBOTG_BASE }\r\n#define USBHS_IRQS                               { USB_IRQn }\r\n#define USBHS_IRQHandler                         USB_IRQHandler\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group USBC_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- USIM Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup USIM_Peripheral_Access_Layer USIM Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** USIM - Register Layout Typedef */\r\ntypedef struct {\r\n  __I  uint32_t RBR;                               /**< Receive Buffer Register, offset: 0x0 */\r\n  __O  uint32_t THR;                               /**< Transmit Holding Register, offset: 0x4 */\r\n  __IO uint32_t IER;                               /**< Interrupt Enable Register, offset: 0x8 */\r\n  __IO uint32_t IIR;                               /**< Interrupt Identification Register, offset: 0xC */\r\n  __IO uint32_t FCR;                               /**< FIFO Control Register, offset: 0x10 */\r\n  __I  uint32_t FSR;                               /**< FIFO Status Register, offset: 0x14 */\r\n  __IO uint32_t ECR;                               /**< Error Control Register, offset: 0x18 */\r\n  __IO uint32_t LCR;                               /**< Line Control Register, offset: 0x1C */\r\n  __IO uint32_t USCCR;                             /**< Card Control Register, offset: 0x20 */\r\n  __I  uint32_t LSR;                               /**< Line Status Register, offset: 0x24 */\r\n  __IO uint32_t EGTR;                              /**< Extra Guard Time Register, offset: 0x28 */\r\n  __IO uint32_t BGTR;                              /**< Block Guard Time Register, offset: 0x2C */\r\n  __IO uint32_t TOR;                               /**< Time Out Register, offset: 0x30 */\r\n  __IO uint32_t CLKR;                              /**< Clock Register, offset: 0x34 */\r\n  __IO uint32_t DLR;                               /**< Divisor Latch Register, offset: 0x38 */\r\n  __IO uint32_t FLR;                               /**< Factor Latch Register, offset: 0x3C */\r\n  __IO uint32_t CWTR;                              /**< Character Waiting Time Register, offset: 0x40 */\r\n  __IO uint32_t BWTR;                              /**< Block Waiting Time Register, offset: 0x44 */\r\n} USIM_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- USIM Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup USIM_Register_Masks USIM Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name RBR - Receive Buffer Register */\r\n/*! @{ */\r\n\r\n#define USIM_RBR_RB_MASK                         (0xFFU)\r\n#define USIM_RBR_RB_SHIFT                        (0U)\r\n/*! RB - Data byte received */\r\n#define USIM_RBR_RB(x)                           (((uint32_t)(((uint32_t)(x)) << USIM_RBR_RB_SHIFT)) & USIM_RBR_RB_MASK)\r\n\r\n#define USIM_RBR_PERR_MASK                       (0x100U)\r\n#define USIM_RBR_PERR_SHIFT                      (8U)\r\n/*! PERR - parity error bit -When not masked by the PEM bit in the FCR register, the parity error\r\n *    indicator will appear in this bit.\r\n */\r\n#define USIM_RBR_PERR(x)                         (((uint32_t)(((uint32_t)(x)) << USIM_RBR_PERR_SHIFT)) & USIM_RBR_PERR_MASK)\r\n/*! @} */\r\n\r\n/*! @name THR - Transmit Holding Register */\r\n/*! @{ */\r\n\r\n#define USIM_THR_TB_MASK                         (0xFFU)\r\n#define USIM_THR_TB_SHIFT                        (0U)\r\n/*! TB - Data byte transmitted, leaset significant bit first */\r\n#define USIM_THR_TB(x)                           (((uint32_t)(((uint32_t)(x)) << USIM_THR_TB_SHIFT)) & USIM_THR_TB_MASK)\r\n/*! @} */\r\n\r\n/*! @name IER - Interrupt Enable Register */\r\n/*! @{ */\r\n\r\n#define USIM_IER_OVRN_MASK                       (0x1U)\r\n#define USIM_IER_OVRN_SHIFT                      (0U)\r\n/*! OVRN - Receiver Dta Overrun Interrupt */\r\n#define USIM_IER_OVRN(x)                         (((uint32_t)(((uint32_t)(x)) << USIM_IER_OVRN_SHIFT)) & USIM_IER_OVRN_MASK)\r\n\r\n#define USIM_IER_PERR_MASK                       (0x2U)\r\n#define USIM_IER_PERR_SHIFT                      (1U)\r\n/*! PERR - Parity Error Interrupt */\r\n#define USIM_IER_PERR(x)                         (((uint32_t)(((uint32_t)(x)) << USIM_IER_PERR_SHIFT)) & USIM_IER_PERR_MASK)\r\n\r\n#define USIM_IER_T0ERR_MASK                      (0x4U)\r\n#define USIM_IER_T0ERR_SHIFT                     (2U)\r\n/*! T0ERR - T=0 Error Interrupt */\r\n#define USIM_IER_T0ERR(x)                        (((uint32_t)(((uint32_t)(x)) << USIM_IER_T0ERR_SHIFT)) & USIM_IER_T0ERR_MASK)\r\n\r\n#define USIM_IER_FRAMERR_MASK                    (0x8U)\r\n#define USIM_IER_FRAMERR_SHIFT                   (3U)\r\n/*! FRAMERR - Framing Error Interrupt */\r\n#define USIM_IER_FRAMERR(x)                      (((uint32_t)(((uint32_t)(x)) << USIM_IER_FRAMERR_SHIFT)) & USIM_IER_FRAMERR_MASK)\r\n\r\n#define USIM_IER_TIMEO_MASK                      (0x10U)\r\n#define USIM_IER_TIMEO_SHIFT                     (4U)\r\n/*! TIMEO - Receiver Time Out Interrupt */\r\n#define USIM_IER_TIMEO(x)                        (((uint32_t)(((uint32_t)(x)) << USIM_IER_TIMEO_SHIFT)) & USIM_IER_TIMEO_MASK)\r\n\r\n#define USIM_IER_CWT_MASK                        (0x20U)\r\n#define USIM_IER_CWT_SHIFT                       (5U)\r\n/*! CWT - Character Waiting Time Interrupt */\r\n#define USIM_IER_CWT(x)                          (((uint32_t)(((uint32_t)(x)) << USIM_IER_CWT_SHIFT)) & USIM_IER_CWT_MASK)\r\n\r\n#define USIM_IER_BWT_MASK                        (0x40U)\r\n#define USIM_IER_BWT_SHIFT                       (6U)\r\n/*! BWT - Block Waiting Time Interrupt */\r\n#define USIM_IER_BWT(x)                          (((uint32_t)(((uint32_t)(x)) << USIM_IER_BWT_SHIFT)) & USIM_IER_BWT_MASK)\r\n\r\n#define USIM_IER_RDR_MASK                        (0x100U)\r\n#define USIM_IER_RDR_SHIFT                       (8U)\r\n/*! RDR - Receiver Data Ready Interrupt */\r\n#define USIM_IER_RDR(x)                          (((uint32_t)(((uint32_t)(x)) << USIM_IER_RDR_SHIFT)) & USIM_IER_RDR_MASK)\r\n\r\n#define USIM_IER_TDR_MASK                        (0x200U)\r\n#define USIM_IER_TDR_SHIFT                       (9U)\r\n/*! TDR - Transmitter Data Refill Interrupt */\r\n#define USIM_IER_TDR(x)                          (((uint32_t)(((uint32_t)(x)) << USIM_IER_TDR_SHIFT)) & USIM_IER_TDR_MASK)\r\n\r\n#define USIM_IER_DMA_TIME_MASK                   (0x2000U)\r\n#define USIM_IER_DMA_TIME_SHIFT                  (13U)\r\n/*! DMA_TIME - DMA Receive Request in event of a Time Out situation */\r\n#define USIM_IER_DMA_TIME(x)                     (((uint32_t)(((uint32_t)(x)) << USIM_IER_DMA_TIME_SHIFT)) & USIM_IER_DMA_TIME_MASK)\r\n\r\n#define USIM_IER_DMA_RX_MASK                     (0x4000U)\r\n#define USIM_IER_DMA_RX_SHIFT                    (14U)\r\n/*! DMA_RX - DMA Receive Request */\r\n#define USIM_IER_DMA_RX(x)                       (((uint32_t)(((uint32_t)(x)) << USIM_IER_DMA_RX_SHIFT)) & USIM_IER_DMA_RX_MASK)\r\n\r\n#define USIM_IER_DMA_TX_MASK                     (0x8000U)\r\n#define USIM_IER_DMA_TX_SHIFT                    (15U)\r\n/*! DMA_TX - DMA Transmit Request */\r\n#define USIM_IER_DMA_TX(x)                       (((uint32_t)(((uint32_t)(x)) << USIM_IER_DMA_TX_SHIFT)) & USIM_IER_DMA_TX_MASK)\r\n/*! @} */\r\n\r\n/*! @name IIR - Interrupt Identification Register */\r\n/*! @{ */\r\n\r\n#define USIM_IIR_OVRN_MASK                       (0x1U)\r\n#define USIM_IIR_OVRN_SHIFT                      (0U)\r\n/*! OVRN - Receiver Data Overrun Interrupt */\r\n#define USIM_IIR_OVRN(x)                         (((uint32_t)(((uint32_t)(x)) << USIM_IIR_OVRN_SHIFT)) & USIM_IIR_OVRN_MASK)\r\n\r\n#define USIM_IIR_PERR_MASK                       (0x2U)\r\n#define USIM_IIR_PERR_SHIFT                      (1U)\r\n/*! PERR - Parity Error Interrupt */\r\n#define USIM_IIR_PERR(x)                         (((uint32_t)(((uint32_t)(x)) << USIM_IIR_PERR_SHIFT)) & USIM_IIR_PERR_MASK)\r\n\r\n#define USIM_IIR_T0ERR_MASK                      (0x4U)\r\n#define USIM_IIR_T0ERR_SHIFT                     (2U)\r\n/*! T0ERR - T=0 Error Interrupt */\r\n#define USIM_IIR_T0ERR(x)                        (((uint32_t)(((uint32_t)(x)) << USIM_IIR_T0ERR_SHIFT)) & USIM_IIR_T0ERR_MASK)\r\n\r\n#define USIM_IIR_FRAMERR_MASK                    (0x8U)\r\n#define USIM_IIR_FRAMERR_SHIFT                   (3U)\r\n/*! FRAMERR - Framing Error Interrupt */\r\n#define USIM_IIR_FRAMERR(x)                      (((uint32_t)(((uint32_t)(x)) << USIM_IIR_FRAMERR_SHIFT)) & USIM_IIR_FRAMERR_MASK)\r\n\r\n#define USIM_IIR_TIMEO_MASK                      (0x10U)\r\n#define USIM_IIR_TIMEO_SHIFT                     (4U)\r\n/*! TIMEO - Receiver Time Out Interrupt */\r\n#define USIM_IIR_TIMEO(x)                        (((uint32_t)(((uint32_t)(x)) << USIM_IIR_TIMEO_SHIFT)) & USIM_IIR_TIMEO_MASK)\r\n\r\n#define USIM_IIR_CWT_MASK                        (0x20U)\r\n#define USIM_IIR_CWT_SHIFT                       (5U)\r\n/*! CWT - Character Waiting Time Interrupt */\r\n#define USIM_IIR_CWT(x)                          (((uint32_t)(((uint32_t)(x)) << USIM_IIR_CWT_SHIFT)) & USIM_IIR_CWT_MASK)\r\n\r\n#define USIM_IIR_BWT_MASK                        (0x40U)\r\n#define USIM_IIR_BWT_SHIFT                       (6U)\r\n/*! BWT - Block Waiting Time Interrupt */\r\n#define USIM_IIR_BWT(x)                          (((uint32_t)(((uint32_t)(x)) << USIM_IIR_BWT_SHIFT)) & USIM_IIR_BWT_MASK)\r\n\r\n#define USIM_IIR_RDR_MASK                        (0x100U)\r\n#define USIM_IIR_RDR_SHIFT                       (8U)\r\n/*! RDR - Receive Data Ready Interrupt */\r\n#define USIM_IIR_RDR(x)                          (((uint32_t)(((uint32_t)(x)) << USIM_IIR_RDR_SHIFT)) & USIM_IIR_RDR_MASK)\r\n\r\n#define USIM_IIR_TDR_MASK                        (0x200U)\r\n#define USIM_IIR_TDR_SHIFT                       (9U)\r\n/*! TDR - Transmitter Data Refill Interrupt */\r\n#define USIM_IIR_TDR(x)                          (((uint32_t)(((uint32_t)(x)) << USIM_IIR_TDR_SHIFT)) & USIM_IIR_TDR_MASK)\r\n/*! @} */\r\n\r\n/*! @name FCR - FIFO Control Register */\r\n/*! @{ */\r\n\r\n#define USIM_FCR_RESETRF_MASK                    (0x1U)\r\n#define USIM_FCR_RESETRF_SHIFT                   (0U)\r\n/*! RESETRF - Reset Receive FIFO */\r\n#define USIM_FCR_RESETRF(x)                      (((uint32_t)(((uint32_t)(x)) << USIM_FCR_RESETRF_SHIFT)) & USIM_FCR_RESETRF_MASK)\r\n\r\n#define USIM_FCR_RESETTF_MASK                    (0x2U)\r\n#define USIM_FCR_RESETTF_SHIFT                   (1U)\r\n/*! RESETTF - Reset Transmit FIFO */\r\n#define USIM_FCR_RESETTF(x)                      (((uint32_t)(((uint32_t)(x)) << USIM_FCR_RESETTF_SHIFT)) & USIM_FCR_RESETTF_MASK)\r\n\r\n#define USIM_FCR_TX_HOLD_MASK                    (0x4U)\r\n#define USIM_FCR_TX_HOLD_SHIFT                   (2U)\r\n/*! TX_HOLD - Transmission Hold */\r\n#define USIM_FCR_TX_HOLD(x)                      (((uint32_t)(((uint32_t)(x)) << USIM_FCR_TX_HOLD_SHIFT)) & USIM_FCR_TX_HOLD_MASK)\r\n\r\n#define USIM_FCR_PEM_MASK                        (0x8U)\r\n#define USIM_FCR_PEM_SHIFT                       (3U)\r\n/*! PEM - Parity Error Mask */\r\n#define USIM_FCR_PEM(x)                          (((uint32_t)(((uint32_t)(x)) << USIM_FCR_PEM_SHIFT)) & USIM_FCR_PEM_MASK)\r\n\r\n#define USIM_FCR_RX_TL_MASK                      (0xC0U)\r\n#define USIM_FCR_RX_TL_SHIFT                     (6U)\r\n/*! RX_TL - Receiver Trigger Level */\r\n#define USIM_FCR_RX_TL(x)                        (((uint32_t)(((uint32_t)(x)) << USIM_FCR_RX_TL_SHIFT)) & USIM_FCR_RX_TL_MASK)\r\n\r\n#define USIM_FCR_TX_TL_MASK                      (0x100U)\r\n#define USIM_FCR_TX_TL_SHIFT                     (8U)\r\n/*! TX_TL - Transmitter Trigger Level */\r\n#define USIM_FCR_TX_TL(x)                        (((uint32_t)(((uint32_t)(x)) << USIM_FCR_TX_TL_SHIFT)) & USIM_FCR_TX_TL_MASK)\r\n/*! @} */\r\n\r\n/*! @name FSR - FIFO Status Register */\r\n/*! @{ */\r\n\r\n#define USIM_FSR_RX_LENGTH_MASK                  (0x1FU)\r\n#define USIM_FSR_RX_LENGTH_SHIFT                 (0U)\r\n/*! RX_LENGTH - Receive FIFO length */\r\n#define USIM_FSR_RX_LENGTH(x)                    (((uint32_t)(((uint32_t)(x)) << USIM_FSR_RX_LENGTH_SHIFT)) & USIM_FSR_RX_LENGTH_MASK)\r\n\r\n#define USIM_FSR_TX_LENGTH_MASK                  (0x3E0U)\r\n#define USIM_FSR_TX_LENGTH_SHIFT                 (5U)\r\n/*! TX_LENGTH - Transmit FIFO length */\r\n#define USIM_FSR_TX_LENGTH(x)                    (((uint32_t)(((uint32_t)(x)) << USIM_FSR_TX_LENGTH_SHIFT)) & USIM_FSR_TX_LENGTH_MASK)\r\n\r\n#define USIM_FSR_PERR_NUM_MASK                   (0x7C00U)\r\n#define USIM_FSR_PERR_NUM_SHIFT                  (10U)\r\n/*! PERR_NUM - Parity Error Number */\r\n#define USIM_FSR_PERR_NUM(x)                     (((uint32_t)(((uint32_t)(x)) << USIM_FSR_PERR_NUM_SHIFT)) & USIM_FSR_PERR_NUM_MASK)\r\n/*! @} */\r\n\r\n/*! @name ECR - Error Control Register */\r\n/*! @{ */\r\n\r\n#define USIM_ECR_T0ERR_TL_MASK                   (0x3U)\r\n#define USIM_ECR_T0ERR_TL_SHIFT                  (0U)\r\n/*! T0ERR_TL - T=0 Error Trigger Level */\r\n#define USIM_ECR_T0ERR_TL(x)                     (((uint32_t)(((uint32_t)(x)) << USIM_ECR_T0ERR_TL_SHIFT)) & USIM_ECR_T0ERR_TL_MASK)\r\n\r\n#define USIM_ECR_PE_TL_MASK                      (0x18U)\r\n#define USIM_ECR_PE_TL_SHIFT                     (3U)\r\n/*! PE_TL - Parity Error Trigger Level */\r\n#define USIM_ECR_PE_TL(x)                        (((uint32_t)(((uint32_t)(x)) << USIM_ECR_PE_TL_SHIFT)) & USIM_ECR_PE_TL_MASK)\r\n\r\n#define USIM_ECR_T0_CLR_MASK                     (0x40U)\r\n#define USIM_ECR_T0_CLR_SHIFT                    (6U)\r\n/*! T0_CLR - Clear T=0 Error */\r\n#define USIM_ECR_T0_CLR(x)                       (((uint32_t)(((uint32_t)(x)) << USIM_ECR_T0_CLR_SHIFT)) & USIM_ECR_T0_CLR_MASK)\r\n\r\n#define USIM_ECR_T0_REPEAT_MASK                  (0x80U)\r\n#define USIM_ECR_T0_REPEAT_SHIFT                 (7U)\r\n/*! T0_REPEAT - Repeat Character Transmission */\r\n#define USIM_ECR_T0_REPEAT(x)                    (((uint32_t)(((uint32_t)(x)) << USIM_ECR_T0_REPEAT_SHIFT)) & USIM_ECR_T0_REPEAT_MASK)\r\n/*! @} */\r\n\r\n/*! @name LCR - Line Control Register */\r\n/*! @{ */\r\n\r\n#define USIM_LCR_INVERSE_MASK                    (0x1U)\r\n#define USIM_LCR_INVERSE_SHIFT                   (0U)\r\n/*! INVERSE - Bit inversion */\r\n#define USIM_LCR_INVERSE(x)                      (((uint32_t)(((uint32_t)(x)) << USIM_LCR_INVERSE_SHIFT)) & USIM_LCR_INVERSE_MASK)\r\n\r\n#define USIM_LCR_ORDER_MASK                      (0x2U)\r\n#define USIM_LCR_ORDER_SHIFT                     (1U)\r\n/*! ORDER - Transmit/Receive Bit Order */\r\n#define USIM_LCR_ORDER(x)                        (((uint32_t)(((uint32_t)(x)) << USIM_LCR_ORDER_SHIFT)) & USIM_LCR_ORDER_MASK)\r\n\r\n#define USIM_LCR_EPS_MASK                        (0x4U)\r\n#define USIM_LCR_EPS_SHIFT                       (2U)\r\n/*! EPS - Even Parity Select(EPS) - This bit is the even parity select bit. When EPS is a logic 0,\r\n *    an odd number of logic ones is transmitted or checked in the data word bits and the parity bit.\r\n *    When EPS is a logic 1, an even number of logic ones is transmitted or checked in the data\r\n *    word bits and parity bit\r\n */\r\n#define USIM_LCR_EPS(x)                          (((uint32_t)(((uint32_t)(x)) << USIM_LCR_EPS_SHIFT)) & USIM_LCR_EPS_MASK)\r\n\r\n#define USIM_LCR_RX_T1_MASK                      (0x8U)\r\n#define USIM_LCR_RX_T1_SHIFT                     (3U)\r\n/*! RX_T1 - Receiver Protocol */\r\n#define USIM_LCR_RX_T1(x)                        (((uint32_t)(((uint32_t)(x)) << USIM_LCR_RX_T1_SHIFT)) & USIM_LCR_RX_T1_MASK)\r\n\r\n#define USIM_LCR_TX_T1_MASK                      (0x10U)\r\n#define USIM_LCR_TX_T1_SHIFT                     (4U)\r\n/*! TX_T1 - Transmitter Protocol */\r\n#define USIM_LCR_TX_T1(x)                        (((uint32_t)(((uint32_t)(x)) << USIM_LCR_TX_T1_SHIFT)) & USIM_LCR_TX_T1_MASK)\r\n/*! @} */\r\n\r\n/*! @name USCCR - Card Control Register */\r\n/*! @{ */\r\n\r\n#define USIM_USCCR_RST_CARD_N_MASK               (0x1U)\r\n#define USIM_USCCR_RST_CARD_N_SHIFT              (0U)\r\n/*! RST_CARD_N - Card Reset */\r\n#define USIM_USCCR_RST_CARD_N(x)                 (((uint32_t)(((uint32_t)(x)) << USIM_USCCR_RST_CARD_N_SHIFT)) & USIM_USCCR_RST_CARD_N_MASK)\r\n\r\n#define USIM_USCCR_VCC_MASK                      (0x2U)\r\n#define USIM_USCCR_VCC_SHIFT                     (1U)\r\n/*! VCC - Card Voltage */\r\n#define USIM_USCCR_VCC(x)                        (((uint32_t)(((uint32_t)(x)) << USIM_USCCR_VCC_SHIFT)) & USIM_USCCR_VCC_MASK)\r\n\r\n#define USIM_USCCR_TXD_FORCE_MASK                (0x10U)\r\n#define USIM_USCCR_TXD_FORCE_SHIFT               (4U)\r\n/*! TXD_FORCE - Force TXD - This bit should always remain non-active unless running a deactivation\r\n *    process. In deactivation the I/O must be turned low before turning down the card's voltage\r\n */\r\n#define USIM_USCCR_TXD_FORCE(x)                  (((uint32_t)(((uint32_t)(x)) << USIM_USCCR_TXD_FORCE_SHIFT)) & USIM_USCCR_TXD_FORCE_MASK)\r\n/*! @} */\r\n\r\n/*! @name LSR - Line Status Register */\r\n/*! @{ */\r\n\r\n#define USIM_LSR_OVRN_MASK                       (0x1U)\r\n#define USIM_LSR_OVRN_SHIFT                      (0U)\r\n/*! OVRN - Receiver Data Overrun Error */\r\n#define USIM_LSR_OVRN(x)                         (((uint32_t)(((uint32_t)(x)) << USIM_LSR_OVRN_SHIFT)) & USIM_LSR_OVRN_MASK)\r\n\r\n#define USIM_LSR_PERR_MASK                       (0x2U)\r\n#define USIM_LSR_PERR_SHIFT                      (1U)\r\n/*! PERR - Parity Error */\r\n#define USIM_LSR_PERR(x)                         (((uint32_t)(((uint32_t)(x)) << USIM_LSR_PERR_SHIFT)) & USIM_LSR_PERR_MASK)\r\n\r\n#define USIM_LSR_T0ERR_MASK                      (0x4U)\r\n#define USIM_LSR_T0ERR_SHIFT                     (2U)\r\n/*! T0ERR - T=0 Error */\r\n#define USIM_LSR_T0ERR(x)                        (((uint32_t)(((uint32_t)(x)) << USIM_LSR_T0ERR_SHIFT)) & USIM_LSR_T0ERR_MASK)\r\n\r\n#define USIM_LSR_FRAMERR_MASK                    (0x8U)\r\n#define USIM_LSR_FRAMERR_SHIFT                   (3U)\r\n/*! FRAMERR - Framing Error */\r\n#define USIM_LSR_FRAMERR(x)                      (((uint32_t)(((uint32_t)(x)) << USIM_LSR_FRAMERR_SHIFT)) & USIM_LSR_FRAMERR_MASK)\r\n\r\n#define USIM_LSR_TIMEO_MASK                      (0x10U)\r\n#define USIM_LSR_TIMEO_SHIFT                     (4U)\r\n/*! TIMEO - Receiver Time Out */\r\n#define USIM_LSR_TIMEO(x)                        (((uint32_t)(((uint32_t)(x)) << USIM_LSR_TIMEO_SHIFT)) & USIM_LSR_TIMEO_MASK)\r\n\r\n#define USIM_LSR_CWT_MASK                        (0x20U)\r\n#define USIM_LSR_CWT_SHIFT                       (5U)\r\n/*! CWT - Character Waiting Time */\r\n#define USIM_LSR_CWT(x)                          (((uint32_t)(((uint32_t)(x)) << USIM_LSR_CWT_SHIFT)) & USIM_LSR_CWT_MASK)\r\n\r\n#define USIM_LSR_BWT_MASK                        (0x40U)\r\n#define USIM_LSR_BWT_SHIFT                       (6U)\r\n/*! BWT - Block Waiting Time */\r\n#define USIM_LSR_BWT(x)                          (((uint32_t)(((uint32_t)(x)) << USIM_LSR_BWT_SHIFT)) & USIM_LSR_BWT_MASK)\r\n\r\n#define USIM_LSR_TDR_MASK                        (0x800U)\r\n#define USIM_LSR_TDR_SHIFT                       (11U)\r\n/*! TDR - Transmitter Data Refill */\r\n#define USIM_LSR_TDR(x)                          (((uint32_t)(((uint32_t)(x)) << USIM_LSR_TDR_SHIFT)) & USIM_LSR_TDR_MASK)\r\n\r\n#define USIM_LSR_RX_EMPTY_N_MASK                 (0x1000U)\r\n#define USIM_LSR_RX_EMPTY_N_SHIFT                (12U)\r\n/*! RX_EMPTY_N - Receive FIFO Empty */\r\n#define USIM_LSR_RX_EMPTY_N(x)                   (((uint32_t)(((uint32_t)(x)) << USIM_LSR_RX_EMPTY_N_SHIFT)) & USIM_LSR_RX_EMPTY_N_MASK)\r\n\r\n#define USIM_LSR_TX_WORKING_MASK                 (0x2000U)\r\n#define USIM_LSR_TX_WORKING_SHIFT                (13U)\r\n/*! TX_WORKING - Transmitter Working */\r\n#define USIM_LSR_TX_WORKING(x)                   (((uint32_t)(((uint32_t)(x)) << USIM_LSR_TX_WORKING_SHIFT)) & USIM_LSR_TX_WORKING_MASK)\r\n\r\n#define USIM_LSR_RX_WORKING_MASK                 (0x4000U)\r\n#define USIM_LSR_RX_WORKING_SHIFT                (14U)\r\n/*! RX_WORKING - Receiver Working */\r\n#define USIM_LSR_RX_WORKING(x)                   (((uint32_t)(((uint32_t)(x)) << USIM_LSR_RX_WORKING_SHIFT)) & USIM_LSR_RX_WORKING_MASK)\r\n\r\n#define USIM_LSR_RXD_MASK                        (0x8000U)\r\n#define USIM_LSR_RXD_SHIFT                       (15U)\r\n/*! RXD - Reflects serail data from the I/O pad */\r\n#define USIM_LSR_RXD(x)                          (((uint32_t)(((uint32_t)(x)) << USIM_LSR_RXD_SHIFT)) & USIM_LSR_RXD_MASK)\r\n/*! @} */\r\n\r\n/*! @name EGTR - Extra Guard Time Register */\r\n/*! @{ */\r\n\r\n#define USIM_EGTR_EGTM_MASK                      (0xFFU)\r\n#define USIM_EGTR_EGTM_SHIFT                     (0U)\r\n/*! EGTM - Extra Guard Time Moments: Number of total Guard Time moments */\r\n#define USIM_EGTR_EGTM(x)                        (((uint32_t)(((uint32_t)(x)) << USIM_EGTR_EGTM_SHIFT)) & USIM_EGTR_EGTM_MASK)\r\n/*! @} */\r\n\r\n/*! @name BGTR - Block Guard Time Register */\r\n/*! @{ */\r\n\r\n#define USIM_BGTR_BGT_MASK                       (0xFFU)\r\n#define USIM_BGTR_BGT_SHIFT                      (0U)\r\n/*! BGT - Block Guard TIME: Number of total Block Guard Time moments */\r\n#define USIM_BGTR_BGT(x)                         (((uint32_t)(((uint32_t)(x)) << USIM_BGTR_BGT_SHIFT)) & USIM_BGTR_BGT_MASK)\r\n/*! @} */\r\n\r\n/*! @name TOR - Time Out Register */\r\n/*! @{ */\r\n\r\n#define USIM_TOR_TO_MASK                         (0xFFU)\r\n#define USIM_TOR_TO_SHIFT                        (0U)\r\n/*! TO - Time Out: Number of total Time Out moments */\r\n#define USIM_TOR_TO(x)                           (((uint32_t)(((uint32_t)(x)) << USIM_TOR_TO_SHIFT)) & USIM_TOR_TO_MASK)\r\n/*! @} */\r\n\r\n/*! @name CLKR - Clock Register */\r\n/*! @{ */\r\n\r\n#define USIM_CLKR_DIVISOR_MASK                   (0xFFU)\r\n#define USIM_CLKR_DIVISOR_SHIFT                  (0U)\r\n/*! DIVISOR - Clock Divisor */\r\n#define USIM_CLKR_DIVISOR(x)                     (((uint32_t)(((uint32_t)(x)) << USIM_CLKR_DIVISOR_SHIFT)) & USIM_CLKR_DIVISOR_MASK)\r\n\r\n#define USIM_CLKR_RQST_MASK                      (0x1000U)\r\n#define USIM_CLKR_RQST_SHIFT                     (12U)\r\n/*! RQST - Clock Change Request */\r\n#define USIM_CLKR_RQST(x)                        (((uint32_t)(((uint32_t)(x)) << USIM_CLKR_RQST_SHIFT)) & USIM_CLKR_RQST_MASK)\r\n\r\n#define USIM_CLKR_STOP_UCLK_MASK                 (0x2000U)\r\n#define USIM_CLKR_STOP_UCLK_SHIFT                (13U)\r\n/*! STOP_UCLK - Stop Card Clock */\r\n#define USIM_CLKR_STOP_UCLK(x)                   (((uint32_t)(((uint32_t)(x)) << USIM_CLKR_STOP_UCLK_SHIFT)) & USIM_CLKR_STOP_UCLK_MASK)\r\n\r\n#define USIM_CLKR_STOP_LEVEL_MASK                (0x4000U)\r\n#define USIM_CLKR_STOP_LEVEL_SHIFT               (14U)\r\n/*! STOP_LEVEL - Stop Level */\r\n#define USIM_CLKR_STOP_LEVEL(x)                  (((uint32_t)(((uint32_t)(x)) << USIM_CLKR_STOP_LEVEL_SHIFT)) & USIM_CLKR_STOP_LEVEL_MASK)\r\n\r\n#define USIM_CLKR_STOP_CLK_USIM_MASK             (0x8000U)\r\n#define USIM_CLKR_STOP_CLK_USIM_SHIFT            (15U)\r\n/*! STOP_CLK_USIM - Stop USIM_IF Clock */\r\n#define USIM_CLKR_STOP_CLK_USIM(x)               (((uint32_t)(((uint32_t)(x)) << USIM_CLKR_STOP_CLK_USIM_SHIFT)) & USIM_CLKR_STOP_CLK_USIM_MASK)\r\n/*! @} */\r\n\r\n/*! @name DLR - Divisor Latch Register */\r\n/*! @{ */\r\n\r\n#define USIM_DLR_DIVISOR_MASK                    (0xFFFFU)\r\n#define USIM_DLR_DIVISOR_SHIFT                   (0U)\r\n/*! DIVISOR - Baud Divisor - Determines the number of USIM clock in between samples, forcing the\r\n *    total length of a bit to be DIVISOR*(FACTOR+1)*(USIM_CYCLE). The value zero if forbidden for\r\n *    DIVISOR.\r\n */\r\n#define USIM_DLR_DIVISOR(x)                      (((uint32_t)(((uint32_t)(x)) << USIM_DLR_DIVISOR_SHIFT)) & USIM_DLR_DIVISOR_MASK)\r\n/*! @} */\r\n\r\n/*! @name FLR - Factor Latch Register */\r\n/*! @{ */\r\n\r\n#define USIM_FLR_FACTOR_MASK                     (0xFFU)\r\n#define USIM_FLR_FACTOR_SHIFT                    (0U)\r\n/*! FACTOR - Baud Factor - Determines the number of samples per bit. Number of samples would be\r\n *    (FACTOR+1). ISO standard demands minimum of 6 samples; therefore 5 is the minimum value of FACTOR\r\n *    bits\r\n */\r\n#define USIM_FLR_FACTOR(x)                       (((uint32_t)(((uint32_t)(x)) << USIM_FLR_FACTOR_SHIFT)) & USIM_FLR_FACTOR_MASK)\r\n/*! @} */\r\n\r\n/*! @name CWTR - Character Waiting Time Register */\r\n/*! @{ */\r\n\r\n#define USIM_CWTR_CWT_MASK                       (0xFFFFU)\r\n#define USIM_CWTR_CWT_SHIFT                      (0U)\r\n/*! CWT - Character Waiting Time - Number of total Character Waiting Time moments */\r\n#define USIM_CWTR_CWT(x)                         (((uint32_t)(((uint32_t)(x)) << USIM_CWTR_CWT_SHIFT)) & USIM_CWTR_CWT_MASK)\r\n/*! @} */\r\n\r\n/*! @name BWTR - Block Waiting Time Register */\r\n/*! @{ */\r\n\r\n#define USIM_BWTR_BWT_MASK                       (0xFFFFU)\r\n#define USIM_BWTR_BWT_SHIFT                      (0U)\r\n/*! BWT - Block Waiting Time - Number of total Block Waiting Time moments */\r\n#define USIM_BWTR_BWT(x)                         (((uint32_t)(((uint32_t)(x)) << USIM_BWTR_BWT_SHIFT)) & USIM_BWTR_BWT_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group USIM_Register_Masks */\r\n\r\n\r\n/* USIM - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral USIM base address */\r\n  #define USIM_BASE                                (0x50008000u)\r\n  /** Peripheral USIM base address */\r\n  #define USIM_BASE_NS                             (0x40008000u)\r\n  /** Peripheral USIM base pointer */\r\n  #define USIM                                     ((USIM_Type *)USIM_BASE)\r\n  /** Peripheral USIM base pointer */\r\n  #define USIM_NS                                  ((USIM_Type *)USIM_BASE_NS)\r\n  /** Array initializer of USIM peripheral base addresses */\r\n  #define USIM_BASE_ADDRS                          { USIM_BASE }\r\n  /** Array initializer of USIM peripheral base pointers */\r\n  #define USIM_BASE_PTRS                           { USIM }\r\n  /** Array initializer of USIM peripheral base addresses */\r\n  #define USIM_BASE_ADDRS_NS                       { USIM_BASE_NS }\r\n  /** Array initializer of USIM peripheral base pointers */\r\n  #define USIM_BASE_PTRS_NS                        { USIM_NS }\r\n#else\r\n  /** Peripheral USIM base address */\r\n  #define USIM_BASE                                (0x40008000u)\r\n  /** Peripheral USIM base pointer */\r\n  #define USIM                                     ((USIM_Type *)USIM_BASE)\r\n  /** Array initializer of USIM peripheral base addresses */\r\n  #define USIM_BASE_ADDRS                          { USIM_BASE }\r\n  /** Array initializer of USIM peripheral base pointers */\r\n  #define USIM_BASE_PTRS                           { USIM }\r\n#endif\r\n/** Interrupt vectors for the USIM peripheral type */\r\n#define USIM_IRQS                                { USIM_IRQn }\r\n\r\n/*!\r\n * @}\r\n */ /* end of group USIM_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- UTICK Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup UTICK_Peripheral_Access_Layer UTICK Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** UTICK - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t CTRL;                              /**< Control, offset: 0x0 */\r\n  __IO uint32_t STAT;                              /**< Status, offset: 0x4 */\r\n  __IO uint32_t CFG;                               /**< Capture Configuration, offset: 0x8 */\r\n  __O  uint32_t CAPCLR;                            /**< Capture Clear, offset: 0xC */\r\n  __I  uint32_t CAP[4];                            /**< Capture, array offset: 0x10, array step: 0x4 */\r\n} UTICK_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- UTICK Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup UTICK_Register_Masks UTICK Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name CTRL - Control */\r\n/*! @{ */\r\n\r\n#define UTICK_CTRL_DELAYVAL_MASK                 (0x7FFFFFFFU)\r\n#define UTICK_CTRL_DELAYVAL_SHIFT                (0U)\r\n/*! DELAYVAL - Tick interval */\r\n#define UTICK_CTRL_DELAYVAL(x)                   (((uint32_t)(((uint32_t)(x)) << UTICK_CTRL_DELAYVAL_SHIFT)) & UTICK_CTRL_DELAYVAL_MASK)\r\n\r\n#define UTICK_CTRL_REPEAT_MASK                   (0x80000000U)\r\n#define UTICK_CTRL_REPEAT_SHIFT                  (31U)\r\n/*! REPEAT - Repeat delay\r\n *  0b0..One-time delay\r\n *  0b1..Delay repeats continuously\r\n */\r\n#define UTICK_CTRL_REPEAT(x)                     (((uint32_t)(((uint32_t)(x)) << UTICK_CTRL_REPEAT_SHIFT)) & UTICK_CTRL_REPEAT_MASK)\r\n/*! @} */\r\n\r\n/*! @name STAT - Status */\r\n/*! @{ */\r\n\r\n#define UTICK_STAT_INTR_MASK                     (0x1U)\r\n#define UTICK_STAT_INTR_SHIFT                    (0U)\r\n/*! INTR - Interrupt flag\r\n *  0b0..No interrupt is pending\r\n *  0b1..An interrupt is pending\r\n */\r\n#define UTICK_STAT_INTR(x)                       (((uint32_t)(((uint32_t)(x)) << UTICK_STAT_INTR_SHIFT)) & UTICK_STAT_INTR_MASK)\r\n\r\n#define UTICK_STAT_ACTIVE_MASK                   (0x2U)\r\n#define UTICK_STAT_ACTIVE_SHIFT                  (1U)\r\n/*! ACTIVE - Timer active flag\r\n *  0b0..The Micro-Tick Timer is not active (stopped)\r\n *  0b1..The Micro-Tick Timer is currently active\r\n */\r\n#define UTICK_STAT_ACTIVE(x)                     (((uint32_t)(((uint32_t)(x)) << UTICK_STAT_ACTIVE_SHIFT)) & UTICK_STAT_ACTIVE_MASK)\r\n/*! @} */\r\n\r\n/*! @name CFG - Capture Configuration */\r\n/*! @{ */\r\n\r\n#define UTICK_CFG_CAPEN0_MASK                    (0x1U)\r\n#define UTICK_CFG_CAPEN0_SHIFT                   (0U)\r\n/*! CAPEN0 - Enable Capture 0\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define UTICK_CFG_CAPEN0(x)                      (((uint32_t)(((uint32_t)(x)) << UTICK_CFG_CAPEN0_SHIFT)) & UTICK_CFG_CAPEN0_MASK)\r\n\r\n#define UTICK_CFG_CAPEN1_MASK                    (0x2U)\r\n#define UTICK_CFG_CAPEN1_SHIFT                   (1U)\r\n/*! CAPEN1 - Enable Capture 1\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define UTICK_CFG_CAPEN1(x)                      (((uint32_t)(((uint32_t)(x)) << UTICK_CFG_CAPEN1_SHIFT)) & UTICK_CFG_CAPEN1_MASK)\r\n\r\n#define UTICK_CFG_CAPEN2_MASK                    (0x4U)\r\n#define UTICK_CFG_CAPEN2_SHIFT                   (2U)\r\n/*! CAPEN2 - Enable Capture 2\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define UTICK_CFG_CAPEN2(x)                      (((uint32_t)(((uint32_t)(x)) << UTICK_CFG_CAPEN2_SHIFT)) & UTICK_CFG_CAPEN2_MASK)\r\n\r\n#define UTICK_CFG_CAPEN3_MASK                    (0x8U)\r\n#define UTICK_CFG_CAPEN3_SHIFT                   (3U)\r\n/*! CAPEN3 - Enable Capture 3\r\n *  0b0..Disabled\r\n *  0b1..Enabled\r\n */\r\n#define UTICK_CFG_CAPEN3(x)                      (((uint32_t)(((uint32_t)(x)) << UTICK_CFG_CAPEN3_SHIFT)) & UTICK_CFG_CAPEN3_MASK)\r\n\r\n#define UTICK_CFG_CAPPOL0_MASK                   (0x100U)\r\n#define UTICK_CFG_CAPPOL0_SHIFT                  (8U)\r\n/*! CAPPOL0 - Capture Polarity 0\r\n *  0b0..Positive edge capture\r\n *  0b1..Negative edge capture\r\n */\r\n#define UTICK_CFG_CAPPOL0(x)                     (((uint32_t)(((uint32_t)(x)) << UTICK_CFG_CAPPOL0_SHIFT)) & UTICK_CFG_CAPPOL0_MASK)\r\n\r\n#define UTICK_CFG_CAPPOL1_MASK                   (0x200U)\r\n#define UTICK_CFG_CAPPOL1_SHIFT                  (9U)\r\n/*! CAPPOL1 - Capture Polarity 1\r\n *  0b0..Positive edge capture\r\n *  0b1..Negative edge capture\r\n */\r\n#define UTICK_CFG_CAPPOL1(x)                     (((uint32_t)(((uint32_t)(x)) << UTICK_CFG_CAPPOL1_SHIFT)) & UTICK_CFG_CAPPOL1_MASK)\r\n\r\n#define UTICK_CFG_CAPPOL2_MASK                   (0x400U)\r\n#define UTICK_CFG_CAPPOL2_SHIFT                  (10U)\r\n/*! CAPPOL2 - Capture Polarity 2\r\n *  0b0..Positive edge capture\r\n *  0b1..Negative edge capture\r\n */\r\n#define UTICK_CFG_CAPPOL2(x)                     (((uint32_t)(((uint32_t)(x)) << UTICK_CFG_CAPPOL2_SHIFT)) & UTICK_CFG_CAPPOL2_MASK)\r\n\r\n#define UTICK_CFG_CAPPOL3_MASK                   (0x800U)\r\n#define UTICK_CFG_CAPPOL3_SHIFT                  (11U)\r\n/*! CAPPOL3 - Capture Polarity 3\r\n *  0b0..Positive edge capture\r\n *  0b1..Negative edge capture\r\n */\r\n#define UTICK_CFG_CAPPOL3(x)                     (((uint32_t)(((uint32_t)(x)) << UTICK_CFG_CAPPOL3_SHIFT)) & UTICK_CFG_CAPPOL3_MASK)\r\n/*! @} */\r\n\r\n/*! @name CAPCLR - Capture Clear */\r\n/*! @{ */\r\n\r\n#define UTICK_CAPCLR_CAPCLR0_MASK                (0x1U)\r\n#define UTICK_CAPCLR_CAPCLR0_SHIFT               (0U)\r\n/*! CAPCLR0 - Clear capture 0\r\n *  0b0..Does nothing\r\n *  0b1..Write 1 to clear the CAP0 register value\r\n */\r\n#define UTICK_CAPCLR_CAPCLR0(x)                  (((uint32_t)(((uint32_t)(x)) << UTICK_CAPCLR_CAPCLR0_SHIFT)) & UTICK_CAPCLR_CAPCLR0_MASK)\r\n\r\n#define UTICK_CAPCLR_CAPCLR1_MASK                (0x2U)\r\n#define UTICK_CAPCLR_CAPCLR1_SHIFT               (1U)\r\n/*! CAPCLR1 - Clear capture 1\r\n *  0b0..Does nothing\r\n *  0b1..Write 1 to clear the CAP1 register value\r\n */\r\n#define UTICK_CAPCLR_CAPCLR1(x)                  (((uint32_t)(((uint32_t)(x)) << UTICK_CAPCLR_CAPCLR1_SHIFT)) & UTICK_CAPCLR_CAPCLR1_MASK)\r\n\r\n#define UTICK_CAPCLR_CAPCLR2_MASK                (0x4U)\r\n#define UTICK_CAPCLR_CAPCLR2_SHIFT               (2U)\r\n/*! CAPCLR2 - Clear capture 2\r\n *  0b0..Does nothing\r\n *  0b1..Write 1 to clear the CAP2 register value\r\n */\r\n#define UTICK_CAPCLR_CAPCLR2(x)                  (((uint32_t)(((uint32_t)(x)) << UTICK_CAPCLR_CAPCLR2_SHIFT)) & UTICK_CAPCLR_CAPCLR2_MASK)\r\n\r\n#define UTICK_CAPCLR_CAPCLR3_MASK                (0x8U)\r\n#define UTICK_CAPCLR_CAPCLR3_SHIFT               (3U)\r\n/*! CAPCLR3 - Clear capture 3\r\n *  0b0..Does nothing\r\n *  0b1..Write 1 to clear the CAP3 register value\r\n */\r\n#define UTICK_CAPCLR_CAPCLR3(x)                  (((uint32_t)(((uint32_t)(x)) << UTICK_CAPCLR_CAPCLR3_SHIFT)) & UTICK_CAPCLR_CAPCLR3_MASK)\r\n/*! @} */\r\n\r\n/*! @name CAP - Capture */\r\n/*! @{ */\r\n\r\n#define UTICK_CAP_CAP_VALUE_MASK                 (0x7FFFFFFFU)\r\n#define UTICK_CAP_CAP_VALUE_SHIFT                (0U)\r\n/*! CAP_VALUE - Captured value for the related capture event */\r\n#define UTICK_CAP_CAP_VALUE(x)                   (((uint32_t)(((uint32_t)(x)) << UTICK_CAP_CAP_VALUE_SHIFT)) & UTICK_CAP_CAP_VALUE_MASK)\r\n\r\n#define UTICK_CAP_VALID_MASK                     (0x80000000U)\r\n#define UTICK_CAP_VALID_SHIFT                    (31U)\r\n/*! VALID - Captured value is valid\r\n *  0b0..A valid value has been not been captured\r\n *  0b1..A valid value has been captured, based on a transition of the related UTICK_CAPn pin\r\n */\r\n#define UTICK_CAP_VALID(x)                       (((uint32_t)(((uint32_t)(x)) << UTICK_CAP_VALID_SHIFT)) & UTICK_CAP_VALID_MASK)\r\n/*! @} */\r\n\r\n/* The count of UTICK_CAP */\r\n#define UTICK_CAP_COUNT                          (4U)\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group UTICK_Register_Masks */\r\n\r\n\r\n/* UTICK - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral UTICK base address */\r\n  #define UTICK_BASE                               (0x5000F000u)\r\n  /** Peripheral UTICK base address */\r\n  #define UTICK_BASE_NS                            (0x4000F000u)\r\n  /** Peripheral UTICK base pointer */\r\n  #define UTICK                                    ((UTICK_Type *)UTICK_BASE)\r\n  /** Peripheral UTICK base pointer */\r\n  #define UTICK_NS                                 ((UTICK_Type *)UTICK_BASE_NS)\r\n  /** Array initializer of UTICK peripheral base addresses */\r\n  #define UTICK_BASE_ADDRS                         { UTICK_BASE }\r\n  /** Array initializer of UTICK peripheral base pointers */\r\n  #define UTICK_BASE_PTRS                          { UTICK }\r\n  /** Array initializer of UTICK peripheral base addresses */\r\n  #define UTICK_BASE_ADDRS_NS                      { UTICK_BASE_NS }\r\n  /** Array initializer of UTICK peripheral base pointers */\r\n  #define UTICK_BASE_PTRS_NS                       { UTICK_NS }\r\n#else\r\n  /** Peripheral UTICK base address */\r\n  #define UTICK_BASE                               (0x4000F000u)\r\n  /** Peripheral UTICK base pointer */\r\n  #define UTICK                                    ((UTICK_Type *)UTICK_BASE)\r\n  /** Array initializer of UTICK peripheral base addresses */\r\n  #define UTICK_BASE_ADDRS                         { UTICK_BASE }\r\n  /** Array initializer of UTICK peripheral base pointers */\r\n  #define UTICK_BASE_PTRS                          { UTICK }\r\n#endif\r\n/** Interrupt vectors for the UTICK peripheral type */\r\n#define UTICK_IRQS                               { UTICK_IRQn }\r\n\r\n/*!\r\n * @}\r\n */ /* end of group UTICK_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- WLAPU Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup WLAPU_Peripheral_Access_Layer WLAPU Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** WLAPU - Register Layout Typedef */\r\ntypedef struct {\r\n       uint8_t RESERVED_0[8];\r\n  __IO uint32_t SOCWLAPU_APU_BYPASS0;              /**< APU Bypass0, offset: 0x8 */\r\n  __IO uint32_t SOCWLAPU_APU_PWR_CTRL_BYPASS0;     /**< APU power control Bypass Register 0, offset: 0xC */\r\n  __IO uint32_t SOCWLAPU_APU_PWR_CTRL_BYPASS1;     /**< APU power control Bypass Register 1, offset: 0x10 */\r\n  __IO uint32_t SOCWLAPU_APU_PWR_CTRL_BYPASS2;     /**< APU power control Bypass Register 2, offset: 0x14 */\r\n       uint8_t RESERVED_1[4];\r\n  __IO uint32_t SOCWLAPU_APU_BYPASS1;              /**< APU Bypass Register 1, offset: 0x1C */\r\n  __IO uint32_t SOCWLAPU_APU_BYPASS2;              /**< APU Bypass Register 2, offset: 0x20 */\r\n  __IO uint32_t SOCWLAPU_APU_BYPASS3;              /**< APU Bypass Register 3, offset: 0x24 */\r\n  __IO uint32_t SOCWLAPU_APU_CTRL;                 /**< APU Control, offset: 0x28 */\r\n  __I  uint32_t SOCWLAPU_APU_STATUS;               /**< APU Status Register, offset: 0x2C */\r\n  __IO uint32_t SOCWLAPU_CPU1_LMU_STA_BYPASS0;     /**< LMU static bank control byapss0 Register, offset: 0x30 */\r\n  __IO uint32_t SOCWLAPU_CPU1_LMU_STA_BYPASS1;     /**< LMU static bank control byapss1 Register, offset: 0x34 */\r\n  __IO uint32_t SOCWLAPU_CPU1_LMU_STA_BYPASS2;     /**< LMU static bank byapss2 Register, offset: 0x38 */\r\n  __IO uint32_t SOCWLAPU_LMU_DYN_BYPASS0;          /**< LMU dynamic bank control byapss0 Register, offset: 0x3C */\r\n  __IO uint32_t SOCWLAPU_LMU_G2BIST_CTRL_BYPASS;   /**< LMU G2Bist control bypass Register, offset: 0x40 */\r\n       uint8_t RESERVED_2[12];\r\n  __IO uint32_t SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS; /**< LMU G2Bist control bypass Register for CPU1, offset: 0x50 */\r\n       uint8_t RESERVED_3[4];\r\n  __IO uint32_t SOCWLAPU_APU_PWR_CTRL_BYPASS4;     /**< \", offset: 0x58 */\r\n  __IO uint32_t SOCWLAPU_APU_PWR_CTRL_BYPASS5;     /**< \", offset: 0x5C */\r\n  __IO uint32_t SOCWLAPU_APU_PWR_CTRL_BYPASS6;     /**< APU power control Bypass Register 6, offset: 0x60 */\r\n  __IO uint32_t SOCWLAPU_APU_PWR_CTRL_BYPASS7;     /**< APU power control Bypass Register 7, offset: 0x64 */\r\n  __IO uint32_t SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0;  /**< LMU static bank control byapss0 Register for smu1 hybrid banks mem, offset: 0x68 */\r\n  __IO uint32_t SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1;  /**< LMU static bank control byapss1 Register for smu1 hybrid banks mem, offset: 0x6C */\r\n  __IO uint32_t SOCWLAPU_SMU1_HYBRID_LMU_BYPASS2;  /**< LMU static bank control byapss2 Register for smu1 hybrid banks mem, offset: 0x70 */\r\n       uint8_t RESERVED_4[8];\r\n  __IO uint32_t SOCWLAPU_APU_ECO_CTRL;             /**< APU ECO Control, offset: 0x7C */\r\n  __IO uint32_t SOCWLAPU_GPIO_WKUP_CTRL0;          /**< \", offset: 0x80 */\r\n  __IO uint32_t SOCWLAPU_GPIO_WKUP_CTRL1;          /**< \", offset: 0x84 */\r\n  __IO uint32_t SOCWLAPU_GPIO_WKUP_CTRL2;          /**< \", offset: 0x88 */\r\n  __IO uint32_t SOCWLAPU_GPIO_WKUP_CTRL3;          /**< \", offset: 0x8C */\r\n  __IO uint32_t SOCWLAPU_HOST_WKUP_MODE;           /**< \", offset: 0x90 */\r\n  __IO uint32_t SOCWLAPU_T3_CLK_DIV_EN_BYPASS;     /**< \", offset: 0x94 */\r\n  __IO uint32_t SOCWLAPU_LDO_LV_CTRL2;             /**< LV LDO Control 2, offset: 0x98 */\r\n  __IO uint32_t SOCWLAPU_CAU_BYPASS;               /**< CAU Bypass, offset: 0x9C */\r\n  __IO uint32_t SOCWLAPU_MEM_PWDN1;                /**< Memory Powerdown Control, offset: 0xA0 */\r\n  __IO uint32_t SOCWLAPU_MEM_PWDN2;                /**< Memory Powerdown Control, offset: 0xA4 */\r\n       uint8_t RESERVED_5[8];\r\n  __IO uint32_t SOCWLAPU_HOST_WKUP_SOURCE;         /**< Host Wakeup Source Control, offset: 0xB0 */\r\n       uint8_t RESERVED_6[12];\r\n  __IO uint32_t SOCWLAPU_APU_IPS_PWR_CTRL_BYPASS0; /**< APU IPS power control Bypass Register 0, offset: 0xC0 */\r\n} WLAPU_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- WLAPU Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup WLAPU_Register_Masks WLAPU Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name SOCWLAPU_APU_BYPASS0 - APU Bypass0 */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_C2P_XOSC_EN_BYPASS_EN_MASK (0x1U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_C2P_XOSC_EN_BYPASS_EN_SHIFT (0U)\r\n/*! C2P_XOSC_EN_BYPASS_EN - C2p_Xosc_En_Bypass */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_C2P_XOSC_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_C2P_XOSC_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_C2P_XOSC_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_TCPU_PDB_BYPASS_EN_MASK (0x2U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_TCPU_PDB_BYPASS_EN_SHIFT (1U)\r\n/*! TBG_TCPU_PDB_BYPASS_EN - TCPU_Pdb_Bypass */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_TCPU_PDB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_TBG_TCPU_PDB_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_TBG_TCPU_PDB_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_BBU1_CLK_EN_BYPASS_EN_MASK (0x4U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_BBU1_CLK_EN_BYPASS_EN_SHIFT (2U)\r\n/*! TBG_BBU1_CLK_EN_BYPASS_EN - TBG512_320_176_BBU1_Clk_En_Bypass */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_BBU1_CLK_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_TBG_BBU1_CLK_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_TBG_BBU1_CLK_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_T2_PDB_BYPASS_EN_MASK (0x8U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_T2_PDB_BYPASS_EN_SHIFT (3U)\r\n/*! TBG_T2_PDB_BYPASS_EN - tbg t2_Pdb_Bypass */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_T2_PDB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_TBG_T2_PDB_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_TBG_T2_PDB_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_MAC1_CLK_EN_BYPASS_EN_MASK (0x10U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_MAC1_CLK_EN_BYPASS_EN_SHIFT (4U)\r\n/*! TBG_MAC1_CLK_EN_BYPASS_EN - TBG512_320_176_MAC1_Clk_En_Bypass */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_MAC1_CLK_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_TBG_MAC1_CLK_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_TBG_MAC1_CLK_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_SOC_CLK_EN_BYPASS_EN_MASK (0x20U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_SOC_CLK_EN_BYPASS_EN_SHIFT (5U)\r\n/*! TBG_SOC_CLK_EN_BYPASS_EN - TBG512_320_176_SoC_Clk_En_Bypass */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_SOC_CLK_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_TBG_SOC_CLK_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_TBG_SOC_CLK_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_BBU2_CLK_EN_BYPASS_EN_MASK (0x40U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_BBU2_CLK_EN_BYPASS_EN_SHIFT (6U)\r\n/*! TBG_BBU2_CLK_EN_BYPASS_EN - TBG512_320_176_BBU2_Clk_En_Bypass */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_BBU2_CLK_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_TBG_BBU2_CLK_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_TBG_BBU2_CLK_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_MAC2_CLK_EN_BYPASS_EN_MASK (0x80U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_MAC2_CLK_EN_BYPASS_EN_SHIFT (7U)\r\n/*! TBG_MAC2_CLK_EN_BYPASS_EN - TBG512_320_176_MAC2_Clk_En_Bypass */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_MAC2_CLK_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_TBG_MAC2_CLK_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_TBG_MAC2_CLK_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TX_PE_BYPASS_EN_MASK (0x400U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TX_PE_BYPASS_EN_SHIFT (10U)\r\n/*! TX_PE_BYPASS_EN - BBU_Rx_Pe_Bypass Enable */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TX_PE_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_TX_PE_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_TX_PE_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RX_PE_BYPASS_EN_MASK (0x800U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RX_PE_BYPASS_EN_SHIFT (11U)\r\n/*! RX_PE_BYPASS_EN - BBU_Rx_Pe_Bypass Enable */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RX_PE_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_RX_PE_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_RX_PE_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PE1_BYPASS_EN_MASK (0x1000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PE1_BYPASS_EN_SHIFT (12U)\r\n/*! RFU_PE1_BYPASS_EN - RFU_PE1_Bypass Enable */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PE1_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PE1_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PE1_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PE2_BYPASS_EN_MASK (0x2000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PE2_BYPASS_EN_SHIFT (13U)\r\n/*! RFU_PE2_BYPASS_EN - RFU_PE2_Bypass Enable */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PE2_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PE2_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PE2_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PA_PE_A_BYPASS_EN_MASK (0x4000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PA_PE_A_BYPASS_EN_SHIFT (14U)\r\n/*! RFU_PA_PE_A_BYPASS_EN - RFU_PA_PE_A_Bypass Enable */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PA_PE_A_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PA_PE_A_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PA_PE_A_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PA_PE_G_BYPASS_EN_MASK (0x8000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PA_PE_G_BYPASS_EN_SHIFT (15U)\r\n/*! RFU_PA_PE_G_BYPASS_EN - RFU_PA_PE_G_Bypass Enable */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PA_PE_G_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PA_PE_G_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PA_PE_G_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_C2P_XOSC_EN_BYPASS_VAL_MASK (0x10000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_C2P_XOSC_EN_BYPASS_VAL_SHIFT (16U)\r\n/*! C2P_XOSC_EN_BYPASS_VAL - C2p_Xosc_En Bypass Value */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_C2P_XOSC_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_C2P_XOSC_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_C2P_XOSC_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_TCPU_PDB_BYPASS_VAL_MASK (0x20000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_TCPU_PDB_BYPASS_VAL_SHIFT (17U)\r\n/*! TBG_TCPU_PDB_BYPASS_VAL - TCPU_Pdb Bypass Value */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_TCPU_PDB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_TBG_TCPU_PDB_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_TBG_TCPU_PDB_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_BBU1_CLK_EN_BYPASS_VAL_MASK (0x40000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_BBU1_CLK_EN_BYPASS_VAL_SHIFT (18U)\r\n/*! TBG_BBU1_CLK_EN_BYPASS_VAL - TBG512_320_176_BBU1_Clk_En Bypass Value */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_BBU1_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_TBG_BBU1_CLK_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_TBG_BBU1_CLK_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_T2_PDB_BYPASS_VAL_MASK (0x80000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_T2_PDB_BYPASS_VAL_SHIFT (19U)\r\n/*! TBG_T2_PDB_BYPASS_VAL - TBF176_Pdb Bypass Value */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_T2_PDB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_TBG_T2_PDB_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_TBG_T2_PDB_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_MAC1_CLK_EN_BYPASS_VAL_MASK (0x100000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_MAC1_CLK_EN_BYPASS_VAL_SHIFT (20U)\r\n/*! TBG_MAC1_CLK_EN_BYPASS_VAL - TBG512_320_176_MAC1_Clk_En Bypass Value */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_MAC1_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_TBG_MAC1_CLK_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_TBG_MAC1_CLK_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_SOC_CLK_EN_BYPASS_VAL_MASK (0x200000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_SOC_CLK_EN_BYPASS_VAL_SHIFT (21U)\r\n/*! TBG_SOC_CLK_EN_BYPASS_VAL - TBG512_320_176_SoC_Clk_En Bypass Value */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_SOC_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_TBG_SOC_CLK_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_TBG_SOC_CLK_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_BBU2_CLK_EN_BYPASS_VAL_MASK (0x400000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_BBU2_CLK_EN_BYPASS_VAL_SHIFT (22U)\r\n/*! TBG_BBU2_CLK_EN_BYPASS_VAL - TBG512_320_176_BBU2_Clk_En Bypass Value */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_BBU2_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_TBG_BBU2_CLK_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_TBG_BBU2_CLK_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_MAC2_CLK_EN_BYPASS_VAL_MASK (0x800000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_MAC2_CLK_EN_BYPASS_VAL_SHIFT (23U)\r\n/*! TBG_MAC2_CLK_EN_BYPASS_VAL - TBG512_320_176_MAC2_Clk_En Bypass Value */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TBG_MAC2_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_TBG_MAC2_CLK_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_TBG_MAC2_CLK_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TX_PE_BYPASS_VAL_MASK (0x4000000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TX_PE_BYPASS_VAL_SHIFT (26U)\r\n/*! TX_PE_BYPASS_VAL - Tx_Pe Bypass Value */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_TX_PE_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_TX_PE_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_TX_PE_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RX_PE_BYPASS_VAL_MASK (0x8000000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RX_PE_BYPASS_VAL_SHIFT (27U)\r\n/*! RX_PE_BYPASS_VAL - Rx_Pe Bypass Value */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RX_PE_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_RX_PE_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_RX_PE_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PE1_BYPASS_VAL_MASK (0x10000000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PE1_BYPASS_VAL_SHIFT (28U)\r\n/*! RFU_PE1_BYPASS_VAL - RFU PE1 Bypass Value */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PE1_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PE1_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PE1_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PE2_BYPASS_VAL_MASK (0x20000000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PE2_BYPASS_VAL_SHIFT (29U)\r\n/*! RFU_PE2_BYPASS_VAL - RFU PE2 Bypass Value */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PE2_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PE2_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PE2_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PA_PE_A_BYPASS_VAL_MASK (0x40000000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PA_PE_A_BYPASS_VAL_SHIFT (30U)\r\n/*! RFU_PA_PE_A_BYPASS_VAL - RFU PA_PE_A Bypass Value */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PA_PE_A_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PA_PE_A_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PA_PE_A_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PA_PE_G_BYPASS_VAL_MASK (0x80000000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PA_PE_G_BYPASS_VAL_SHIFT (31U)\r\n/*! RFU_PA_PE_G_BYPASS_VAL - RFU PA_PE_G Bypass Value */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PA_PE_G_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PA_PE_G_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS0_RFU_PA_PE_G_BYPASS_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_APU_PWR_CTRL_BYPASS0 - APU power control Bypass Register 0 */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_PSW_BYPASS_VAL_MASK (0x1U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_PSW_BYPASS_VAL_SHIFT (0U)\r\n/*! SOC_PSW_BYPASS_VAL - SoC Power Switch Control */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_PSW_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_PSW_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_PSW_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_PSW_BYPASS_EN_MASK (0x2U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_PSW_BYPASS_EN_SHIFT (1U)\r\n/*! SOC_PSW_BYPASS_EN - SoC Power Switch Control Enable */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_PSW_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_PSW_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_PSW_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_FWBAR_BYPASS_VAL_MASK (0x4U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_FWBAR_BYPASS_VAL_SHIFT (2U)\r\n/*! SOC_FWBAR_BYPASS_VAL - SoC Firewallbar Control */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_FWBAR_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_FWBAR_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_FWBAR_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_FWBAR_BYPASS_EN_MASK (0x8U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_FWBAR_BYPASS_EN_SHIFT (3U)\r\n/*! SOC_FWBAR_BYPASS_EN - SoC Firewallbar Control Enable */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_FWBAR_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_FWBAR_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_FWBAR_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_ISO_EN_BYPASS_VAL_MASK (0x10U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_ISO_EN_BYPASS_VAL_SHIFT (4U)\r\n/*! SOC_ISO_EN_BYPASS_VAL - SoC Isolation Cell Control */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_ISO_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_ISO_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_ISO_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_ISO_EN_BYPASS_EN_MASK (0x20U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_ISO_EN_BYPASS_EN_SHIFT (5U)\r\n/*! SOC_ISO_EN_BYPASS_EN - SoC Isolation Cell Control Enable */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_ISO_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_ISO_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_ISO_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_CLK_DIV_RSTB_BYPASS_VAL_MASK (0x40U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_CLK_DIV_RSTB_BYPASS_VAL_SHIFT (6U)\r\n/*! SOC_CLK_DIV_RSTB_BYPASS_VAL - Firmware Bypass Value for SoC Dlk_Div_Rstb (active low signal) */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_CLK_DIV_RSTB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_CLK_DIV_RSTB_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_CLK_DIV_RSTB_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_CLK_DIV_RSTB_BYPASS_EN_MASK (0x80U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_CLK_DIV_RSTB_BYPASS_EN_SHIFT (7U)\r\n/*! SOC_CLK_DIV_RSTB_BYPASS_EN - Firmware Bypass SoC Clk_Div_Rstb from APU */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_CLK_DIV_RSTB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_CLK_DIV_RSTB_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_CLK_DIV_RSTB_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_NON_UDR_RST_BYPASS_VAL_MASK (0x100U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_NON_UDR_RST_BYPASS_VAL_SHIFT (8U)\r\n/*! SOC_NON_UDR_RST_BYPASS_VAL - Firmware Bypass Value for SoC non udr rst (active low signal) */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_NON_UDR_RST_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_NON_UDR_RST_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_NON_UDR_RST_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_NON_UDR_RST_BYPASS_EN_MASK (0x200U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_NON_UDR_RST_BYPASS_EN_SHIFT (9U)\r\n/*! SOC_NON_UDR_RST_BYPASS_EN - Firmware Bypass SoC non udr rst from APU (used for brf sif only in KF2) */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_NON_UDR_RST_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_NON_UDR_RST_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_NON_UDR_RST_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_APU_WLAN_NON_UDR_RSTB_BYPASS_EN_MASK (0x1000U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_APU_WLAN_NON_UDR_RSTB_BYPASS_EN_SHIFT (12U)\r\n/*! APU_WLAN_NON_UDR_RSTB_BYPASS_EN - Firmware Bypass Value for apu_wlan_non_udr_rstb */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_APU_WLAN_NON_UDR_RSTB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_APU_WLAN_NON_UDR_RSTB_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_APU_WLAN_NON_UDR_RSTB_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_APU_WLAN_NON_UDR_RSTB_BYPASS_VAL_MASK (0x2000U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_APU_WLAN_NON_UDR_RSTB_BYPASS_VAL_SHIFT (13U)\r\n/*! APU_WLAN_NON_UDR_RSTB_BYPASS_VAL - Firmware Bypass apu_wlan_non_udr_rstb */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_APU_WLAN_NON_UDR_RSTB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_APU_WLAN_NON_UDR_RSTB_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_APU_WLAN_NON_UDR_RSTB_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_PSW_BYPASS_VAL_MASK (0x10000U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_PSW_BYPASS_VAL_SHIFT (16U)\r\n/*! BBUD_PSW_BYPASS_VAL - BBUD Power Switch Control */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_PSW_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_PSW_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_PSW_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_PSW_BYPASS_EN_MASK (0x20000U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_PSW_BYPASS_EN_SHIFT (17U)\r\n/*! BBUD_PSW_BYPASS_EN - BBUD Power Switch Control Enable */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_PSW_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_PSW_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_PSW_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_FWBAR_BYPASS_VAL_MASK (0x40000U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_FWBAR_BYPASS_VAL_SHIFT (18U)\r\n/*! BBUD_FWBAR_BYPASS_VAL - BBUD Firewallbar Control */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_FWBAR_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_FWBAR_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_FWBAR_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_FWBAR_BYPASS_EN_MASK (0x80000U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_FWBAR_BYPASS_EN_SHIFT (19U)\r\n/*! BBUD_FWBAR_BYPASS_EN - BBUD Firewallbar Control Enable */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_FWBAR_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_FWBAR_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_FWBAR_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_ISO_EN_BYPASS_VAL_MASK (0x100000U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_ISO_EN_BYPASS_VAL_SHIFT (20U)\r\n/*! BBUD_ISO_EN_BYPASS_VAL - BBUD Isolation Cell Control */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_ISO_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_ISO_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_ISO_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_ISO_EN_BYPASS_EN_MASK (0x200000U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_ISO_EN_BYPASS_EN_SHIFT (21U)\r\n/*! BBUD_ISO_EN_BYPASS_EN - BBUD Isolation Cell Control Enable */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_ISO_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_ISO_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_ISO_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_BBUD_NON_UDR_RSTB_BYPASS_VAL_MASK (0x400000U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_BBUD_NON_UDR_RSTB_BYPASS_VAL_SHIFT (22U)\r\n/*! SOC_BBUD_NON_UDR_RSTB_BYPASS_VAL - Firmware Bypass Value for SoC_BBUD_Non_Udr_Rstb (active low signal) */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_BBUD_NON_UDR_RSTB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_BBUD_NON_UDR_RSTB_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_BBUD_NON_UDR_RSTB_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_BBUD_NON_UDR_RSTB_BYPASS_EN_MASK (0x800000U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_BBUD_NON_UDR_RSTB_BYPASS_EN_SHIFT (23U)\r\n/*! SOC_BBUD_NON_UDR_RSTB_BYPASS_EN - Firmware Bypass SoC_BBUD_Non_Udr_Rstb from APU */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_BBUD_NON_UDR_RSTB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_BBUD_NON_UDR_RSTB_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_SOC_BBUD_NON_UDR_RSTB_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_SRAM_PD_BYPASS_VAL_MASK (0x1000000U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_SRAM_PD_BYPASS_VAL_SHIFT (24U)\r\n/*! BBUD_SRAM_PD_BYPASS_VAL - Firmware Bypass Value for SRAM_PD (active high signal) */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_SRAM_PD_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_SRAM_PD_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_SRAM_PD_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_SRAM_PD_BYPASS_EN_MASK (0x2000000U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_SRAM_PD_BYPASS_EN_SHIFT (25U)\r\n/*! BBUD_SRAM_PD_BYPASS_EN - Firmware Bypass SRAM_PD from APU */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_SRAM_PD_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_SRAM_PD_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_BBUD_SRAM_PD_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_APU_WLAN1_NON_UDR_RSTB_BYPASS_VAL_MASK (0x10000000U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_APU_WLAN1_NON_UDR_RSTB_BYPASS_VAL_SHIFT (28U)\r\n/*! APU_WLAN1_NON_UDR_RSTB_BYPASS_VAL - Firmware Bypass Value for apu_wlan1_non_udr_rst */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_APU_WLAN1_NON_UDR_RSTB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_APU_WLAN1_NON_UDR_RSTB_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_APU_WLAN1_NON_UDR_RSTB_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_APU_WLAN1_NON_UDR_RSTB_BYPASS_EN_MASK (0x20000000U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_APU_WLAN1_NON_UDR_RSTB_BYPASS_EN_SHIFT (29U)\r\n/*! APU_WLAN1_NON_UDR_RSTB_BYPASS_EN - Firmware Bypass apu_wlan1_non_udr_rst */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_APU_WLAN1_NON_UDR_RSTB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_APU_WLAN1_NON_UDR_RSTB_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS0_APU_WLAN1_NON_UDR_RSTB_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_APU_PWR_CTRL_BYPASS1 - APU power control Bypass Register 1 */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_PSW_BYPASS_VAL_MASK (0x1U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_PSW_BYPASS_VAL_SHIFT (0U)\r\n/*! RFU_2G_PSW_BYPASS_VAL - RFU 2G Power Switch Control */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_PSW_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_PSW_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_PSW_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_PSW_BYPASS_EN_MASK (0x2U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_PSW_BYPASS_EN_SHIFT (1U)\r\n/*! RFU_2G_PSW_BYPASS_EN - RFU 2G Power Switch Control Enable */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_PSW_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_PSW_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_PSW_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_FWBAR_BYPASS_VAL_MASK (0x4U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_FWBAR_BYPASS_VAL_SHIFT (2U)\r\n/*! RFU_2G_FWBAR_BYPASS_VAL - RFU Firewallbar Control */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_FWBAR_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_FWBAR_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_FWBAR_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_FWBAR_BYPASS_EN_MASK (0x8U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_FWBAR_BYPASS_EN_SHIFT (3U)\r\n/*! RFU_2G_FWBAR_BYPASS_EN - RFU 2G Firewallbar Control Enable */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_FWBAR_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_FWBAR_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_FWBAR_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_ISO_EN_BYPASS_VAL_MASK (0x10U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_ISO_EN_BYPASS_VAL_SHIFT (4U)\r\n/*! RFU_2G_ISO_EN_BYPASS_VAL - RFU 2G Isolation Cell Control */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_ISO_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_ISO_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_ISO_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_ISO_EN_BYPASS_EN_MASK (0x20U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_ISO_EN_BYPASS_EN_SHIFT (5U)\r\n/*! RFU_2G_ISO_EN_BYPASS_EN - RFU 2G Isolation Cell Control Enable */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_ISO_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_ISO_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_ISO_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_CLK_DIV_RSTB_BYPASS_VAL_MASK (0x40U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_CLK_DIV_RSTB_BYPASS_VAL_SHIFT (6U)\r\n/*! RFU_2G_CLK_DIV_RSTB_BYPASS_VAL - Firmware Bypass Value for RFU 2G Clk_Div_Rstb (active low signal) */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_CLK_DIV_RSTB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_CLK_DIV_RSTB_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_CLK_DIV_RSTB_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_CLK_DIV_RSTB_BYPASS_EN_MASK (0x80U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_CLK_DIV_RSTB_BYPASS_EN_SHIFT (7U)\r\n/*! RFU_2G_CLK_DIV_RSTB_BYPASS_EN - Firmware Bypass RFU 2G Clk_Div_Rstb from APU */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_CLK_DIV_RSTB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_CLK_DIV_RSTB_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_CLK_DIV_RSTB_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_SRAM_PD_BYPASS_VAL_MASK (0x100U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_SRAM_PD_BYPASS_VAL_SHIFT (8U)\r\n/*! RFU_2G_SRAM_PD_BYPASS_VAL - Firmware Bypass Value for RFU 2G SRAM_PD (active high signal) */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_SRAM_PD_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_SRAM_PD_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_SRAM_PD_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_SRAM_PD_BYPASS_EN_MASK (0x200U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_SRAM_PD_BYPASS_EN_SHIFT (9U)\r\n/*! RFU_2G_SRAM_PD_BYPASS_EN - Firmware Bypass RFU 2G SRAM_PD from APU */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_SRAM_PD_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_SRAM_PD_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS1_RFU_2G_SRAM_PD_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_APU_PWR_CTRL_BYPASS2 - APU power control Bypass Register 2 */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_PSW_BYPASS_VAL_MASK (0x1U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_PSW_BYPASS_VAL_SHIFT (0U)\r\n/*! WLAN_PD_PSW_BYPASS_VAL - wlan_pd Power Switch Control */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_PSW_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_PSW_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_PSW_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_PSW_BYPASS_EN_MASK (0x2U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_PSW_BYPASS_EN_SHIFT (1U)\r\n/*! WLAN_PD_PSW_BYPASS_EN - wlan_pd Power Switch Control Enable */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_PSW_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_PSW_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_PSW_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_FWBAR_BYPASS_VAL_MASK (0x4U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_FWBAR_BYPASS_VAL_SHIFT (2U)\r\n/*! WLAN_PD_FWBAR_BYPASS_VAL - wlan_pd Firewallbar Control */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_FWBAR_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_FWBAR_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_FWBAR_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_FWBAR_BYPASS_EN_MASK (0x8U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_FWBAR_BYPASS_EN_SHIFT (3U)\r\n/*! WLAN_PD_FWBAR_BYPASS_EN - wlan_pd Firewallbar Control Enable */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_FWBAR_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_FWBAR_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_FWBAR_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_ISO_EN_BYPASS_VAL_MASK (0x10U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_ISO_EN_BYPASS_VAL_SHIFT (4U)\r\n/*! WLAN_PD_ISO_EN_BYPASS_VAL - wlan_pd Isolation Cell Control */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_ISO_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_ISO_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_ISO_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_ISO_EN_BYPASS_EN_MASK (0x20U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_ISO_EN_BYPASS_EN_SHIFT (5U)\r\n/*! WLAN_PD_ISO_EN_BYPASS_EN - wlan_pd Isolation Cell Control Enable */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_ISO_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_ISO_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_ISO_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_CLK_DIV_RSTB_BYPASS_VAL_MASK (0x40U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_CLK_DIV_RSTB_BYPASS_VAL_SHIFT (6U)\r\n/*! WLAN_PD_CLK_DIV_RSTB_BYPASS_VAL - Firmware Bypass Value for wlan_pd Clk_Div_Rstb (active low signal) */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_CLK_DIV_RSTB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_CLK_DIV_RSTB_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_CLK_DIV_RSTB_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_CLK_DIV_RSTB_BYPASS_EN_MASK (0x80U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_CLK_DIV_RSTB_BYPASS_EN_SHIFT (7U)\r\n/*! WLAN_PD_CLK_DIV_RSTB_BYPASS_EN - Firmware Bypass wlan_pd Clk_Div_Rstb from APU */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_CLK_DIV_RSTB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_CLK_DIV_RSTB_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_CLK_DIV_RSTB_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_SRAM_PD_BYPASS_VAL_MASK (0x100U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_SRAM_PD_BYPASS_VAL_SHIFT (8U)\r\n/*! WLAN_PD_SRAM_PD_BYPASS_VAL - Firmware Bypass Value for SRAM_PD (active high signal) */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_SRAM_PD_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_SRAM_PD_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_SRAM_PD_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_SRAM_PD_BYPASS_EN_MASK (0x200U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_SRAM_PD_BYPASS_EN_SHIFT (9U)\r\n/*! WLAN_PD_SRAM_PD_BYPASS_EN - Firmware Bypass SRAM_PD from APU */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_SRAM_PD_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_SRAM_PD_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_PD_SRAM_PD_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_RET_PD_PSW_BYPASS_VAL_MASK (0x400U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_RET_PD_PSW_BYPASS_VAL_SHIFT (10U)\r\n/*! WLAN_RET_PD_PSW_BYPASS_VAL - wlan_ret_pd_psw_bypass_val */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_RET_PD_PSW_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_RET_PD_PSW_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_RET_PD_PSW_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_RET_PD_PSW_BYPASS_EN_MASK (0x800U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_RET_PD_PSW_BYPASS_EN_SHIFT (11U)\r\n/*! WLAN_RET_PD_PSW_BYPASS_EN - wlan_ret_pd Power Switch Control Enable */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_RET_PD_PSW_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_RET_PD_PSW_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS2_WLAN_RET_PD_PSW_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_APU_BYPASS1 - APU Bypass Register 1 */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_SOC_CAU_XOSC_EN_BP_EN_MASK (0x40U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_SOC_CAU_XOSC_EN_BP_EN_SHIFT (6U)\r\n/*! SOC_CAU_XOSC_EN_BP_EN - Firmware Bypass Xosc_En to CAU and other parts of the chip including pads */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_SOC_CAU_XOSC_EN_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS1_SOC_CAU_XOSC_EN_BP_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS1_SOC_CAU_XOSC_EN_BP_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_SOC_CAU_XOSC_EN_BP_VAL_MASK (0x80U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_SOC_CAU_XOSC_EN_BP_VAL_SHIFT (7U)\r\n/*! SOC_CAU_XOSC_EN_BP_VAL - Firmware Bypass Xosc_En Value for SoC_CAU_Xosc_En_Bp_En */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_SOC_CAU_XOSC_EN_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS1_SOC_CAU_XOSC_EN_BP_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS1_SOC_CAU_XOSC_EN_BP_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_RXPE_DYN_BYPASS_MASK (0x100U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_RXPE_DYN_BYPASS_SHIFT (8U)\r\n/*! RXPE_DYN_BYPASS - Rxpe_Dyn_Bypass */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_RXPE_DYN_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS1_RXPE_DYN_BYPASS_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS1_RXPE_DYN_BYPASS_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_PE1_DYN_BYPASS_MASK (0x200U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_PE1_DYN_BYPASS_SHIFT (9U)\r\n/*! PE1_DYN_BYPASS - PE1_Dyn_Bypass */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_PE1_DYN_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS1_PE1_DYN_BYPASS_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS1_PE1_DYN_BYPASS_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_PLL_OVERRIDE_BYPASS_MASK (0x400U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_PLL_OVERRIDE_BYPASS_SHIFT (10U)\r\n/*! PLL_OVERRIDE_BYPASS - PLL Override Bypass */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_PLL_OVERRIDE_BYPASS(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS1_PLL_OVERRIDE_BYPASS_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS1_PLL_OVERRIDE_BYPASS_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_BCA_CLK_EN_BYPASS_EN_MASK (0x40000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_BCA_CLK_EN_BYPASS_EN_SHIFT (18U)\r\n/*! BCA_CLK_EN_BYPASS_EN - Firmware Bypass BCA_Clk_En */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_BCA_CLK_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS1_BCA_CLK_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS1_BCA_CLK_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_BCA_CLK_EN_BYPASS_VAL_MASK (0x80000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_BCA_CLK_EN_BYPASS_VAL_SHIFT (19U)\r\n/*! BCA_CLK_EN_BYPASS_VAL - Firmware Bypass Value for BCA_Clk_En (active high signal) */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_BCA_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS1_BCA_CLK_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS1_BCA_CLK_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_SLNA_CLK_EN_BYPASS_EN_MASK (0x4000000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_SLNA_CLK_EN_BYPASS_EN_SHIFT (26U)\r\n/*! SLNA_CLK_EN_BYPASS_EN - Firmware Bypass for SLNA_Clk_En */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_SLNA_CLK_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS1_SLNA_CLK_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS1_SLNA_CLK_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_SLNA_CLK_EN_BYPASS_VAL_MASK (0x8000000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_SLNA_CLK_EN_BYPASS_VAL_SHIFT (27U)\r\n/*! SLNA_CLK_EN_BYPASS_VAL - Firmware Bypass Value for SLNA_Clk_En (active high signal) */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_SLNA_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS1_SLNA_CLK_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS1_SLNA_CLK_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_APU_WL_RF_CLK_EN_BYPASS_EN_MASK (0x10000000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_APU_WL_RF_CLK_EN_BYPASS_EN_SHIFT (28U)\r\n/*! APU_WL_RF_CLK_EN_BYPASS_EN - Firmware Bypass for APU_WL_RF_Clk_En */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_APU_WL_RF_CLK_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS1_APU_WL_RF_CLK_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS1_APU_WL_RF_CLK_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_APU_WL_RF_CLK_EN_BYPASS_VAL_MASK (0x20000000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_APU_WL_RF_CLK_EN_BYPASS_VAL_SHIFT (29U)\r\n/*! APU_WL_RF_CLK_EN_BYPASS_VAL - Firmware Bypass Value for APU_WL_RF_Clk_En (active high signal) */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS1_APU_WL_RF_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS1_APU_WL_RF_CLK_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS1_APU_WL_RF_CLK_EN_BYPASS_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_APU_BYPASS2 - APU Bypass Register 2 */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_TBG_T3_PDB_BYPASS_EN_MASK (0x100U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_TBG_T3_PDB_BYPASS_EN_SHIFT (8U)\r\n/*! TBG_T3_PDB_BYPASS_EN - Firmware Bypass for T3_pdb pll */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_TBG_T3_PDB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS2_TBG_T3_PDB_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS2_TBG_T3_PDB_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_TBG_T3_PDB_BYPASS_VAL_MASK (0x200U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_TBG_T3_PDB_BYPASS_VAL_SHIFT (9U)\r\n/*! TBG_T3_PDB_BYPASS_VAL - T3_Pdb Bypass Value */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_TBG_T3_PDB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS2_TBG_T3_PDB_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS2_TBG_T3_PDB_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_T3_PI1_PDB_BYPASS_EN_MASK (0x400U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_T3_PI1_PDB_BYPASS_EN_SHIFT (10U)\r\n/*! T3_PI1_PDB_BYPASS_EN - Firmware Bypass for TBG256 aiu_pi1 */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_T3_PI1_PDB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS2_T3_PI1_PDB_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS2_T3_PI1_PDB_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_T3_PI1_PDB_BYPASS_VAL_MASK (0x800U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_T3_PI1_PDB_BYPASS_VAL_SHIFT (11U)\r\n/*! T3_PI1_PDB_BYPASS_VAL - Firmware Bypass Value for TBG256 aiu pi1 */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_T3_PI1_PDB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS2_T3_PI1_PDB_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS2_T3_PI1_PDB_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_T3_PI2_PDB_BYPASS_EN_MASK (0x1000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_T3_PI2_PDB_BYPASS_EN_SHIFT (12U)\r\n/*! T3_PI2_PDB_BYPASS_EN - Firmware Bypass for TBG256 aiu_pi2 */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_T3_PI2_PDB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS2_T3_PI2_PDB_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS2_T3_PI2_PDB_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_T3_PI2_PDB_BYPASS_VAL_MASK (0x2000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_T3_PI2_PDB_BYPASS_VAL_SHIFT (13U)\r\n/*! T3_PI2_PDB_BYPASS_VAL - Firmware Bypass Value for TBG256 aiu_pi2 */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_T3_PI2_PDB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS2_T3_PI2_PDB_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS2_T3_PI2_PDB_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_TBG_T1_STABLE_BYPASS_EN_MASK (0x2000000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_TBG_T1_STABLE_BYPASS_EN_SHIFT (25U)\r\n/*! TBG_T1_STABLE_BYPASS_EN - Firmware Bypass enable for T1 pll_stable signal from APU */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_TBG_T1_STABLE_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS2_TBG_T1_STABLE_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS2_TBG_T1_STABLE_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_TBG_T1_STABLE_BYPASS_VAL_MASK (0x4000000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_TBG_T1_STABLE_BYPASS_VAL_SHIFT (26U)\r\n/*! TBG_T1_STABLE_BYPASS_VAL - Firmware Bypass value for T1 pll_stable signal from APU */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_TBG_T1_STABLE_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS2_TBG_T1_STABLE_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS2_TBG_T1_STABLE_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_PMIC_DVSC_CTRL_BYPASS_EN_MASK (0x8000000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_PMIC_DVSC_CTRL_BYPASS_EN_SHIFT (27U)\r\n/*! PMIC_DVSC_CTRL_BYPASS_EN - Firmware Bypass enable for pmic dvsc ctrl from APU */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_PMIC_DVSC_CTRL_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS2_PMIC_DVSC_CTRL_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS2_PMIC_DVSC_CTRL_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_PMIC_DVSC_CTRL_BYPASS_VAL_MASK (0x30000000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_PMIC_DVSC_CTRL_BYPASS_VAL_SHIFT (28U)\r\n/*! PMIC_DVSC_CTRL_BYPASS_VAL - Firmware Bypass value for pmic dvsc ctrl from APU (default high power WLAN ode) */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS2_PMIC_DVSC_CTRL_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS2_PMIC_DVSC_CTRL_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS2_PMIC_DVSC_CTRL_BYPASS_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_APU_BYPASS3 - APU Bypass Register 3 */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_SYS_CLK_EN_BYPASS_EN_MASK (0x10U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_SYS_CLK_EN_BYPASS_EN_SHIFT (4U)\r\n/*! SYS_CLK_EN_BYPASS_EN - Firmware Bypass for sys clock domain clock enable */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_SYS_CLK_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS3_SYS_CLK_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS3_SYS_CLK_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_SYS_CLK_EN_BYPASS_VAL_MASK (0x20U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_SYS_CLK_EN_BYPASS_VAL_SHIFT (5U)\r\n/*! SYS_CLK_EN_BYPASS_VAL - Firmware Bypass Value for sys clock domain clock enable(active high signal) */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_SYS_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS3_SYS_CLK_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS3_SYS_CLK_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_WLAN1_PD_CLK_EN_BYPASS_EN_MASK (0x400U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_WLAN1_PD_CLK_EN_BYPASS_EN_SHIFT (10U)\r\n/*! WLAN1_PD_CLK_EN_BYPASS_EN - Firmware Bypass for WLAN1 PD domain clock enable */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_WLAN1_PD_CLK_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS3_WLAN1_PD_CLK_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS3_WLAN1_PD_CLK_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_WLAN1_PD_CLK_EN_BYPASS_VAL_MASK (0x800U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_WLAN1_PD_CLK_EN_BYPASS_VAL_SHIFT (11U)\r\n/*! WLAN1_PD_CLK_EN_BYPASS_VAL - Firmware Bypass Value for WLAN1 PD domain clock enable(active high signal) */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_WLAN1_PD_CLK_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS3_WLAN1_PD_CLK_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS3_WLAN1_PD_CLK_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_WLAN1_CLK_DIV_EN_BYPASS_EN_MASK (0x1000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_WLAN1_CLK_DIV_EN_BYPASS_EN_SHIFT (12U)\r\n/*! WLAN1_CLK_DIV_EN_BYPASS_EN - Firmware Bypass for WLAN1 clocks divider clock enable */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_WLAN1_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS3_WLAN1_CLK_DIV_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS3_WLAN1_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_WLAN1_CLK_DIV_EN_BYPASS_VAL_MASK (0x2000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_WLAN1_CLK_DIV_EN_BYPASS_VAL_SHIFT (13U)\r\n/*! WLAN1_CLK_DIV_EN_BYPASS_VAL - Firmware Bypass Value for WLAN1 clocks divider enable(active high signal) */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_WLAN1_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS3_WLAN1_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS3_WLAN1_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_SPSRAM_RST_BYPASS_EN_MASK (0x4000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_SPSRAM_RST_BYPASS_EN_SHIFT (14U)\r\n/*! SPSRAM_RST_BYPASS_EN - Firmware Bypass for Single power SRAM reset enable */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_SPSRAM_RST_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS3_SPSRAM_RST_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS3_SPSRAM_RST_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_SPSRAM_RST_BYPASS_VAL_MASK (0x8000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_SPSRAM_RST_BYPASS_VAL_SHIFT (15U)\r\n/*! SPSRAM_RST_BYPASS_VAL - Firmware Bypass Value for single power sram reset(active low signal) */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_SPSRAM_RST_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS3_SPSRAM_RST_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS3_SPSRAM_RST_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_SLNA_BBUD_BRF_BYPASS_EN_MASK (0x10000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_SLNA_BBUD_BRF_BYPASS_EN_SHIFT (16U)\r\n/*! SLNA_BBUD_BRF_BYPASS_EN - Firmware Bypass for apu mux control of SLNA gain from bbud/brf */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_SLNA_BBUD_BRF_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS3_SLNA_BBUD_BRF_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS3_SLNA_BBUD_BRF_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_SLNA_BBUD_BRF_BYPASS_VAL_MASK (0x20000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_SLNA_BBUD_BRF_BYPASS_VAL_SHIFT (17U)\r\n/*! SLNA_BBUD_BRF_BYPASS_VAL - Firmware Bypass Value for apu mux control of SLNA gain from bbud/brf */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_SLNA_BBUD_BRF_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS3_SLNA_BBUD_BRF_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS3_SLNA_BBUD_BRF_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_RFU_REF_CLK_EN1_BYPASS_EN_MASK (0x1000000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_RFU_REF_CLK_EN1_BYPASS_EN_SHIFT (24U)\r\n/*! RFU_REF_CLK_EN1_BYPASS_EN - Firmware Bypass Enable for RFU5G reference clk enable */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_RFU_REF_CLK_EN1_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS3_RFU_REF_CLK_EN1_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS3_RFU_REF_CLK_EN1_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_RFU_REF_CLK_EN1_BYPASS_VAL_MASK (0x2000000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_RFU_REF_CLK_EN1_BYPASS_VAL_SHIFT (25U)\r\n/*! RFU_REF_CLK_EN1_BYPASS_VAL - Firmware Bypass Value for RFU5G reference clk enable */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_RFU_REF_CLK_EN1_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS3_RFU_REF_CLK_EN1_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS3_RFU_REF_CLK_EN1_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_RFU_REF_CLK_EN2_BYPASS_EN_MASK (0x4000000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_RFU_REF_CLK_EN2_BYPASS_EN_SHIFT (26U)\r\n/*! RFU_REF_CLK_EN2_BYPASS_EN - Firmware Bypass Enable for RFU2G reference clk enable */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_RFU_REF_CLK_EN2_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS3_RFU_REF_CLK_EN2_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS3_RFU_REF_CLK_EN2_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_RFU_REF_CLK_EN2_BYPASS_VAL_MASK (0x8000000U)\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_RFU_REF_CLK_EN2_BYPASS_VAL_SHIFT (27U)\r\n/*! RFU_REF_CLK_EN2_BYPASS_VAL - Firmware Bypass Value for RFU2G reference clk enable */\r\n#define WLAPU_SOCWLAPU_APU_BYPASS3_RFU_REF_CLK_EN2_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_BYPASS3_RFU_REF_CLK_EN2_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_BYPASS3_RFU_REF_CLK_EN2_BYPASS_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_APU_CTRL - APU Control */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_APU_CTRL_APU_REFCLK_DIV_SEL_MASK (0xFU)\r\n#define WLAPU_SOCWLAPU_APU_CTRL_APU_REFCLK_DIV_SEL_SHIFT (0U)\r\n/*! APU_REFCLK_DIV_SEL - APU Reference Clock Divider Select */\r\n#define WLAPU_SOCWLAPU_APU_CTRL_APU_REFCLK_DIV_SEL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_CTRL_APU_REFCLK_DIV_SEL_SHIFT)) & WLAPU_SOCWLAPU_APU_CTRL_APU_REFCLK_DIV_SEL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_CTRL_FORCE_BTU_WAKEUP_MASK (0x10U)\r\n#define WLAPU_SOCWLAPU_APU_CTRL_FORCE_BTU_WAKEUP_SHIFT (4U)\r\n/*! FORCE_BTU_WAKEUP - Force BTU Wakeup */\r\n#define WLAPU_SOCWLAPU_APU_CTRL_FORCE_BTU_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_CTRL_FORCE_BTU_WAKEUP_SHIFT)) & WLAPU_SOCWLAPU_APU_CTRL_FORCE_BTU_WAKEUP_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_CTRL_ISU_WKUP_IN_USE_MASK (0x40U)\r\n#define WLAPU_SOCWLAPU_APU_CTRL_ISU_WKUP_IN_USE_SHIFT (6U)\r\n/*! ISU_WKUP_IN_USE - APU Wakeup */\r\n#define WLAPU_SOCWLAPU_APU_CTRL_ISU_WKUP_IN_USE(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_CTRL_ISU_WKUP_IN_USE_SHIFT)) & WLAPU_SOCWLAPU_APU_CTRL_ISU_WKUP_IN_USE_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_CTRL_APU_HOST_WKUP_MASK (0x80U)\r\n#define WLAPU_SOCWLAPU_APU_CTRL_APU_HOST_WKUP_SHIFT (7U)\r\n/*! APU_HOST_WKUP - APU Wakeup triggered by CPU2 */\r\n#define WLAPU_SOCWLAPU_APU_CTRL_APU_HOST_WKUP(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_CTRL_APU_HOST_WKUP_SHIFT)) & WLAPU_SOCWLAPU_APU_CTRL_APU_HOST_WKUP_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_CTRL_BRF_INT_WAKEUP_MASK (0x100U)\r\n#define WLAPU_SOCWLAPU_APU_CTRL_BRF_INT_WAKEUP_SHIFT (8U)\r\n/*! BRF_INT_WAKEUP - APU Wakeup */\r\n#define WLAPU_SOCWLAPU_APU_CTRL_BRF_INT_WAKEUP(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_CTRL_BRF_INT_WAKEUP_SHIFT)) & WLAPU_SOCWLAPU_APU_CTRL_BRF_INT_WAKEUP_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_CTRL_SOC_PA_PE_EN_MASK (0x200U)\r\n#define WLAPU_SOCWLAPU_APU_CTRL_SOC_PA_PE_EN_SHIFT (9U)\r\n/*! SOC_PA_PE_EN - PA_PE control from SoC to RFU SoC_PA_PE Input */\r\n#define WLAPU_SOCWLAPU_APU_CTRL_SOC_PA_PE_EN(x)  (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_CTRL_SOC_PA_PE_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_CTRL_SOC_PA_PE_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_CTRL_SOC_PA_PE_A_EN_MASK (0x400U)\r\n#define WLAPU_SOCWLAPU_APU_CTRL_SOC_PA_PE_A_EN_SHIFT (10U)\r\n/*! SOC_PA_PE_A_EN - PA_PE_A control from SoC to Pad */\r\n#define WLAPU_SOCWLAPU_APU_CTRL_SOC_PA_PE_A_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_CTRL_SOC_PA_PE_A_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_CTRL_SOC_PA_PE_A_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_CTRL_SOC_PA_PE_G_EN_MASK (0x800U)\r\n#define WLAPU_SOCWLAPU_APU_CTRL_SOC_PA_PE_G_EN_SHIFT (11U)\r\n/*! SOC_PA_PE_G_EN - PA_PE_G control from SoC to Pad */\r\n#define WLAPU_SOCWLAPU_APU_CTRL_SOC_PA_PE_G_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_CTRL_SOC_PA_PE_G_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_CTRL_SOC_PA_PE_G_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_CTRL_RFU_2G_SRAM_PD_METHOD_SEL_MASK (0x1000U)\r\n#define WLAPU_SOCWLAPU_APU_CTRL_RFU_2G_SRAM_PD_METHOD_SEL_SHIFT (12U)\r\n/*! RFU_2G_SRAM_PD_METHOD_SEL - Choose apu signal to use for SRAM PD of RFU 2G memories */\r\n#define WLAPU_SOCWLAPU_APU_CTRL_RFU_2G_SRAM_PD_METHOD_SEL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_CTRL_RFU_2G_SRAM_PD_METHOD_SEL_SHIFT)) & WLAPU_SOCWLAPU_APU_CTRL_RFU_2G_SRAM_PD_METHOD_SEL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_CTRL_LMU_BYPASS_MASK  (0x8000U)\r\n#define WLAPU_SOCWLAPU_APU_CTRL_LMU_BYPASS_SHIFT (15U)\r\n/*! LMU_BYPASS - LMU global bypass bit */\r\n#define WLAPU_SOCWLAPU_APU_CTRL_LMU_BYPASS(x)    (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_CTRL_LMU_BYPASS_SHIFT)) & WLAPU_SOCWLAPU_APU_CTRL_LMU_BYPASS_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_CTRL_SOC_PA_PE_EN_MAC2_MASK (0x10000U)\r\n#define WLAPU_SOCWLAPU_APU_CTRL_SOC_PA_PE_EN_MAC2_SHIFT (16U)\r\n/*! SOC_PA_PE_EN_MAC2 - PA_PE control from MAC2 to RFU SoC_PA_PE Input */\r\n#define WLAPU_SOCWLAPU_APU_CTRL_SOC_PA_PE_EN_MAC2(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_CTRL_SOC_PA_PE_EN_MAC2_SHIFT)) & WLAPU_SOCWLAPU_APU_CTRL_SOC_PA_PE_EN_MAC2_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_CTRL_APU_HOST_WKUP_CPU1_MASK (0x40000U)\r\n#define WLAPU_SOCWLAPU_APU_CTRL_APU_HOST_WKUP_CPU1_SHIFT (18U)\r\n/*! APU_HOST_WKUP_CPU1 - APU Wakeup triggered by CPU1 */\r\n#define WLAPU_SOCWLAPU_APU_CTRL_APU_HOST_WKUP_CPU1(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_CTRL_APU_HOST_WKUP_CPU1_SHIFT)) & WLAPU_SOCWLAPU_APU_CTRL_APU_HOST_WKUP_CPU1_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_CTRL_APU_HOST_WKUP_CPU3_MASK (0x80000U)\r\n#define WLAPU_SOCWLAPU_APU_CTRL_APU_HOST_WKUP_CPU3_SHIFT (19U)\r\n/*! APU_HOST_WKUP_CPU3 - APU Wakeup triggered by CPU3 */\r\n#define WLAPU_SOCWLAPU_APU_CTRL_APU_HOST_WKUP_CPU3(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_CTRL_APU_HOST_WKUP_CPU3_SHIFT)) & WLAPU_SOCWLAPU_APU_CTRL_APU_HOST_WKUP_CPU3_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_APU_STATUS - APU Status Register */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_APU_STATUS_BRF_CLK_TBG_SEL_MASK (0x1U)\r\n#define WLAPU_SOCWLAPU_APU_STATUS_BRF_CLK_TBG_SEL_SHIFT (0U)\r\n/*! BRF_CLK_TBG_SEL - Monitor BRF_Clk_TBG_Sel */\r\n#define WLAPU_SOCWLAPU_APU_STATUS_BRF_CLK_TBG_SEL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_STATUS_BRF_CLK_TBG_SEL_SHIFT)) & WLAPU_SOCWLAPU_APU_STATUS_BRF_CLK_TBG_SEL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_STATUS_BTU_CLK_TBG_SEL_MASK (0x2U)\r\n#define WLAPU_SOCWLAPU_APU_STATUS_BTU_CLK_TBG_SEL_SHIFT (1U)\r\n/*! BTU_CLK_TBG_SEL - Monitor BTU_Clk_TBG_Sel */\r\n#define WLAPU_SOCWLAPU_APU_STATUS_BTU_CLK_TBG_SEL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_STATUS_BTU_CLK_TBG_SEL_SHIFT)) & WLAPU_SOCWLAPU_APU_STATUS_BTU_CLK_TBG_SEL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_STATUS_SOC_CLK_T3_REF_SEL_MASK (0x4U)\r\n#define WLAPU_SOCWLAPU_APU_STATUS_SOC_CLK_T3_REF_SEL_SHIFT (2U)\r\n/*! SOC_CLK_T3_REF_SEL - Monitor SoC_Clk_T3_Ref_Sel */\r\n#define WLAPU_SOCWLAPU_APU_STATUS_SOC_CLK_T3_REF_SEL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_STATUS_SOC_CLK_T3_REF_SEL_SHIFT)) & WLAPU_SOCWLAPU_APU_STATUS_SOC_CLK_T3_REF_SEL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_STATUS_SOC_CLK_TBG_SEL_MASK (0x8U)\r\n#define WLAPU_SOCWLAPU_APU_STATUS_SOC_CLK_TBG_SEL_SHIFT (3U)\r\n/*! SOC_CLK_TBG_SEL - Monitor SoC_Clk_TBG_Sel */\r\n#define WLAPU_SOCWLAPU_APU_STATUS_SOC_CLK_TBG_SEL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_STATUS_SOC_CLK_TBG_SEL_SHIFT)) & WLAPU_SOCWLAPU_APU_STATUS_SOC_CLK_TBG_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_CPU1_LMU_STA_BYPASS0 - LMU static bank control byapss0 Register */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_EN_MASK (0xFFU)\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_EN_SHIFT (0U)\r\n/*! LMU_STA_BANKS_ISO_EN_BP_EN - Firmware Bypass enable for lmu static banks iso_en */\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_EN_SHIFT)) & WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_VAL_MASK (0xFF00U)\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_VAL_SHIFT (8U)\r\n/*! LMU_STA_BANKS_ISO_EN_BP_VAL - Firmware Bypass value for lmu static banks iso_en */\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_VAL_SHIFT)) & WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_ISO_EN_BP_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_EN_MASK (0xFF0000U)\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_EN_SHIFT (16U)\r\n/*! LMU_STA_BANKS_PSW_EN_BP_EN - Firmware Bypass enable for lmu static banks psw_en */\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_EN_SHIFT)) & WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_VAL_MASK (0xFF000000U)\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_VAL_SHIFT (24U)\r\n/*! LMU_STA_BANKS_PSW_EN_BP_VAL - Firmware Bypass value for lmu static banks psw_en */\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_VAL_SHIFT)) & WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS0_LMU_STA_BANKS_PSW_EN_BP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_CPU1_LMU_STA_BYPASS1 - LMU static bank control byapss1 Register */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_EN_MASK (0xFFU)\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_EN_SHIFT (0U)\r\n/*! LMU_STA_BANKS_SRAM_PD_BP_EN - Firmware Bypass enable for lmu static banks sram_pd */\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_EN_SHIFT)) & WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_VAL_MASK (0xFF00U)\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_VAL_SHIFT (8U)\r\n/*! LMU_STA_BANKS_SRAM_PD_BP_VAL - Firmware Bypass value for lmu static banks sram_pd */\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_VAL_SHIFT)) & WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_SRAM_PD_BP_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_EN_MASK (0xFF0000U)\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_EN_SHIFT (16U)\r\n/*! LMU_STA_BANKS_FNRST_BP_EN - Firmware Bypass enable for lmu static banks fnrst */\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_EN_SHIFT)) & WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_VAL_MASK (0xFF000000U)\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_VAL_SHIFT (24U)\r\n/*! LMU_STA_BANKS_FNRST_BP_VAL - Firmware Bypass value for lmu static banks fnrst */\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_VAL_SHIFT)) & WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS1_LMU_STA_BANKS_FNRST_BP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_CPU1_LMU_STA_BYPASS2 - LMU static bank byapss2 Register */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_EN_MASK (0xFFU)\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_EN_SHIFT (0U)\r\n/*! LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_EN - Firmware Bypass enable for lmu static banks vddmc_sw_pd_ctrl */\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_EN_SHIFT)) & WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_MASK (0xFF00U)\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_SHIFT (8U)\r\n/*! LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_VAL - Firmware Bypass value for lmu static banks vddmc_sw_pd_ctrl */\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_SHIFT)) & WLAPU_SOCWLAPU_CPU1_LMU_STA_BYPASS2_LMU_STA_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_LMU_DYN_BYPASS0 - LMU dynamic bank control byapss0 Register */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_EN_MASK (0x7U)\r\n#define WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_EN_SHIFT (0U)\r\n/*! LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_EN - Firmware Bypass enable for lmu dynamic banks vddmc_sw_pd_ctrl */\r\n#define WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_EN_SHIFT)) & WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_MASK (0x700U)\r\n#define WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_SHIFT (8U)\r\n/*! LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_VAL - Firmware Bypass value for lmu dynamic banks vddmc_sw_pd_ctrl */\r\n#define WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_SHIFT)) & WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_FNRST_BP_EN_MASK (0x70000U)\r\n#define WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_FNRST_BP_EN_SHIFT (16U)\r\n/*! LMU_DYN_BANKS_FNRST_BP_EN - Firmware Bypass enable for lmu dynamic banks fnrst */\r\n#define WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_FNRST_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_FNRST_BP_EN_SHIFT)) & WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_FNRST_BP_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_FNRST_BP_VAL_MASK (0x7000000U)\r\n#define WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_FNRST_BP_VAL_SHIFT (24U)\r\n/*! LMU_DYN_BANKS_FNRST_BP_VAL - Firmware Bypass value for lmu dynamic banks fnrst */\r\n#define WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_FNRST_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_FNRST_BP_VAL_SHIFT)) & WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_FNRST_BP_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_SRAM_FNRST_USE_WLAN_FNRST_MASK (0x80000000U)\r\n#define WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_SRAM_FNRST_USE_WLAN_FNRST_SHIFT (31U)\r\n/*! LMU_DYN_BANKS_SRAM_FNRST_USE_WLAN_FNRST - 1: By default WLAN_SRAM_FNRST is used for SMU off domain banks */\r\n#define WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_SRAM_FNRST_USE_WLAN_FNRST(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_SRAM_FNRST_USE_WLAN_FNRST_SHIFT)) & WLAPU_SOCWLAPU_LMU_DYN_BYPASS0_LMU_DYN_BANKS_SRAM_FNRST_USE_WLAN_FNRST_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_LMU_G2BIST_CTRL_BYPASS - LMU G2Bist control bypass Register */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_MODE_BYPASS_EN_MASK (0x1U)\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_MODE_BYPASS_EN_SHIFT (0U)\r\n/*! LMU_G2BIST_MODE_BYPASS_EN - Firmware Bypass enable for lmu g2bist mode */\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_MODE_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_MODE_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_MODE_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_MODE_BYPASS_VAL_MASK (0x3EU)\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_MODE_BYPASS_VAL_SHIFT (1U)\r\n/*! LMU_G2BIST_MODE_BYPASS_VAL - Firmware Bypass value for lmu g2bist mode */\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_MODE_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_MODE_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_MODE_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_START_BP_EN_MASK (0x1000000U)\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_START_BP_EN_SHIFT (24U)\r\n/*! LMU_G2BIST_START_BP_EN - Firmware Bypass enable for lmu g2bist start */\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_START_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_START_BP_EN_SHIFT)) & WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_START_BP_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_START_BP_VAL_MASK (0x2000000U)\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_START_BP_VAL_SHIFT (25U)\r\n/*! LMU_G2BIST_START_BP_VAL - Firmware Bypass value for lmu g2bist start */\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_START_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_START_BP_VAL_SHIFT)) & WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_START_BP_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_CLK_EN_BP_EN_MASK (0x4000000U)\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_CLK_EN_BP_EN_SHIFT (26U)\r\n/*! LMU_G2BIST_CLK_EN_BP_EN - Firmware Bypass enable for lmu g2bist clock en */\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_CLK_EN_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_CLK_EN_BP_EN_SHIFT)) & WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_CLK_EN_BP_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_CLK_EN_BP_VAL_MASK (0x8000000U)\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_CLK_EN_BP_VAL_SHIFT (27U)\r\n/*! LMU_G2BIST_CLK_EN_BP_VAL - Firmware Bypass value for lmu g2bist clock en */\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_CLK_EN_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_CLK_EN_BP_VAL_SHIFT)) & WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_LMU_G2BIST_CLK_EN_BP_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_G2BIST_STATUS_MASK (0xF0000000U)\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_G2BIST_STATUS_SHIFT (28U)\r\n/*! G2BIST_STATUS - g2bist status */\r\n#define WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_G2BIST_STATUS(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_G2BIST_STATUS_SHIFT)) & WLAPU_SOCWLAPU_LMU_G2BIST_CTRL_BYPASS_G2BIST_STATUS_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS - LMU G2Bist control bypass Register for CPU1 */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_EN_MASK (0x1U)\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_EN_SHIFT (0U)\r\n/*! LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_EN - Firmware Bypass enable for CPU1 static banks lmu powerdomain repair request */\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_EN_SHIFT)) & WLAPU_SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_VAL_MASK (0xFFF0U)\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_VAL_SHIFT (4U)\r\n/*! LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_VAL - Firmware Bypass value for CPU1 static banks lmu powerdomain repair request */\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_VAL_SHIFT)) & WLAPU_SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_CPU1_STA_PWRDMN_RPR_REQ_BP_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_EN_MASK (0x100000U)\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_EN_SHIFT (20U)\r\n/*! LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_EN - Firmware Bypass enable for SMU1 dynamic banks lmu powerdomain repair request */\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_EN_SHIFT)) & WLAPU_SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_VAL_MASK (0xF000000U)\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_VAL_SHIFT (24U)\r\n/*! LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_VAL - Firmware Bypass value for SMU1 dynamic banks lmu powerdomain repair request */\r\n#define WLAPU_SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_VAL_SHIFT)) & WLAPU_SOCWLAPU_CPU1_LMU_G2BIST_CTRL_BYPASS_LMU_SMU1_DYN_PWRDMN_RPR_REQ_BP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_APU_PWR_CTRL_BYPASS4 - \" */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS4_RFU_RTDP_WU_RSTB_BYPASS_VAL_MASK (0x400U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS4_RFU_RTDP_WU_RSTB_BYPASS_VAL_SHIFT (10U)\r\n/*! RFU_RTDP_WU_RSTB_BYPASS_VAL - Firmware Bypass Value for RFU /RTDP Wakeup reset (active low signal) */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS4_RFU_RTDP_WU_RSTB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS4_RFU_RTDP_WU_RSTB_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS4_RFU_RTDP_WU_RSTB_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS4_RFU_RTDP_WU_RSTB_BYPASS_EN_MASK (0x800U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS4_RFU_RTDP_WU_RSTB_BYPASS_EN_SHIFT (11U)\r\n/*! RFU_RTDP_WU_RSTB_BYPASS_EN - Firmware Bypass RFU /RTDP wakeup reset from APU */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS4_RFU_RTDP_WU_RSTB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS4_RFU_RTDP_WU_RSTB_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS4_RFU_RTDP_WU_RSTB_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_APU_PWR_CTRL_BYPASS5 - \" */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS5_CPU1_VINITHI_BYPASS_VAL_MASK (0x1000U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS5_CPU1_VINITHI_BYPASS_VAL_SHIFT (12U)\r\n/*! CPU1_VINITHI_BYPASS_VAL - Firmware Bypass Value for CPU1 Vinithi (default boot from ROM) */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS5_CPU1_VINITHI_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS5_CPU1_VINITHI_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS5_CPU1_VINITHI_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS5_CPU1_VINITHI_BYPASS_EN_MASK (0x2000U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS5_CPU1_VINITHI_BYPASS_EN_SHIFT (13U)\r\n/*! CPU1_VINITHI_BYPASS_EN - Firmware Bypass enable for CPU1 Vinithi */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS5_CPU1_VINITHI_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS5_CPU1_VINITHI_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS5_CPU1_VINITHI_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_APU_PWR_CTRL_BYPASS6 - APU power control Bypass Register 6 */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_PSW_BYPASS_VAL_MASK (0x1U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_PSW_BYPASS_VAL_SHIFT (0U)\r\n/*! WLAN1_PD_PSW_BYPASS_VAL - wlan1_pd Power Switch Control */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_PSW_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_PSW_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_PSW_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_PSW_BYPASS_EN_MASK (0x2U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_PSW_BYPASS_EN_SHIFT (1U)\r\n/*! WLAN1_PD_PSW_BYPASS_EN - wlan1_pd Power Switch Control Enable */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_PSW_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_PSW_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_PSW_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_FWBAR_BYPASS_VAL_MASK (0x4U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_FWBAR_BYPASS_VAL_SHIFT (2U)\r\n/*! WLAN1_PD_FWBAR_BYPASS_VAL - wlan1_pd Firewallbar Control */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_FWBAR_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_FWBAR_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_FWBAR_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_FWBAR_BYPASS_EN_MASK (0x8U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_FWBAR_BYPASS_EN_SHIFT (3U)\r\n/*! WLAN1_PD_FWBAR_BYPASS_EN - wlan1_pd Firewallbar Control Enable */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_FWBAR_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_FWBAR_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_FWBAR_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_ISO_EN_BYPASS_VAL_MASK (0x10U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_ISO_EN_BYPASS_VAL_SHIFT (4U)\r\n/*! WLAN1_PD_ISO_EN_BYPASS_VAL - wlan1_pd Isolation Cell Control */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_ISO_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_ISO_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_ISO_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_ISO_EN_BYPASS_EN_MASK (0x20U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_ISO_EN_BYPASS_EN_SHIFT (5U)\r\n/*! WLAN1_PD_ISO_EN_BYPASS_EN - wlan1_pd Isolation Cell Control Enable */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_ISO_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_ISO_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_ISO_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_CLK_DIV_RSTB_BYPASS_VAL_MASK (0x40U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_CLK_DIV_RSTB_BYPASS_VAL_SHIFT (6U)\r\n/*! WLAN1_PD_CLK_DIV_RSTB_BYPASS_VAL - Firmware Bypass Value for wlan1_pd Clk_Div_Rstb (active low signal) */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_CLK_DIV_RSTB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_CLK_DIV_RSTB_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_CLK_DIV_RSTB_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_CLK_DIV_RSTB_BYPASS_EN_MASK (0x80U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_CLK_DIV_RSTB_BYPASS_EN_SHIFT (7U)\r\n/*! WLAN1_PD_CLK_DIV_RSTB_BYPASS_EN - Firmware Bypass wlan1_pd Clk_Div_Rstb from APU */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_CLK_DIV_RSTB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_CLK_DIV_RSTB_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_CLK_DIV_RSTB_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_SRAM_PD_BYPASS_VAL_MASK (0x100U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_SRAM_PD_BYPASS_VAL_SHIFT (8U)\r\n/*! WLAN1_PD_SRAM_PD_BYPASS_VAL - Firmware Bypass Value for SRAM_PD (active high signal) */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_SRAM_PD_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_SRAM_PD_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_SRAM_PD_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_SRAM_PD_BYPASS_EN_MASK (0x200U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_SRAM_PD_BYPASS_EN_SHIFT (9U)\r\n/*! WLAN1_PD_SRAM_PD_BYPASS_EN - Firmware Bypass SRAM_PD from APU */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_SRAM_PD_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_SRAM_PD_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS6_WLAN1_PD_SRAM_PD_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_APU_PWR_CTRL_BYPASS7 - APU power control Bypass Register 7 */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS7_RFU_RTDP2_WU_RSTB_BYPASS_VAL_MASK (0x400U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS7_RFU_RTDP2_WU_RSTB_BYPASS_VAL_SHIFT (10U)\r\n/*! RFU_RTDP2_WU_RSTB_BYPASS_VAL - Firmware Bypass Value for RFU /rtdp2 Wakeup reset (active low signal) */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS7_RFU_RTDP2_WU_RSTB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS7_RFU_RTDP2_WU_RSTB_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS7_RFU_RTDP2_WU_RSTB_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS7_RFU_RTDP2_WU_RSTB_BYPASS_EN_MASK (0x800U)\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS7_RFU_RTDP2_WU_RSTB_BYPASS_EN_SHIFT (11U)\r\n/*! RFU_RTDP2_WU_RSTB_BYPASS_EN - Firmware Bypass RFU /rtdp2 wakeup reset from APU */\r\n#define WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS7_RFU_RTDP2_WU_RSTB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS7_RFU_RTDP2_WU_RSTB_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_PWR_CTRL_BYPASS7_RFU_RTDP2_WU_RSTB_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0 - LMU static bank control byapss0 Register for smu1 hybrid banks mem */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_ISO_EN_BP_EN_MASK (0xFFU)\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_ISO_EN_BP_EN_SHIFT (0U)\r\n/*! LMU_HYBRID_BANKS_ISO_EN_BP_EN - Firmware Bypass enable for lmu static banks iso_en */\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_ISO_EN_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_ISO_EN_BP_EN_SHIFT)) & WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_ISO_EN_BP_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_ISO_EN_BP_VAL_MASK (0xFF00U)\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_ISO_EN_BP_VAL_SHIFT (8U)\r\n/*! LMU_HYBRID_BANKS_ISO_EN_BP_VAL - Firmware Bypass value for lmu static banks iso_en */\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_ISO_EN_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_ISO_EN_BP_VAL_SHIFT)) & WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_ISO_EN_BP_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_PSW_EN_BP_EN_MASK (0xFF0000U)\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_PSW_EN_BP_EN_SHIFT (16U)\r\n/*! LMU_HYBRID_BANKS_PSW_EN_BP_EN - Firmware Bypass enable for lmu static banks psw_en */\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_PSW_EN_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_PSW_EN_BP_EN_SHIFT)) & WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_PSW_EN_BP_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_PSW_EN_BP_VAL_MASK (0xFF000000U)\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_PSW_EN_BP_VAL_SHIFT (24U)\r\n/*! LMU_HYBRID_BANKS_PSW_EN_BP_VAL - Firmware Bypass value for lmu static banks psw_en */\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_PSW_EN_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_PSW_EN_BP_VAL_SHIFT)) & WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS0_LMU_HYBRID_BANKS_PSW_EN_BP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1 - LMU static bank control byapss1 Register for smu1 hybrid banks mem */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_SRAM_PD_BP_EN_MASK (0xFFU)\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_SRAM_PD_BP_EN_SHIFT (0U)\r\n/*! LMU_HYBRID_BANKS_SRAM_PD_BP_EN - Firmware Bypass enable for lmu static banks sram_pd */\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_SRAM_PD_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_SRAM_PD_BP_EN_SHIFT)) & WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_SRAM_PD_BP_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_SRAM_PD_BP_VAL_MASK (0xFF00U)\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_SRAM_PD_BP_VAL_SHIFT (8U)\r\n/*! LMU_HYBRID_BANKS_SRAM_PD_BP_VAL - Firmware Bypass value for lmu static banks sram_pd */\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_SRAM_PD_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_SRAM_PD_BP_VAL_SHIFT)) & WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_SRAM_PD_BP_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_FNRST_BP_EN_MASK (0xFF0000U)\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_FNRST_BP_EN_SHIFT (16U)\r\n/*! LMU_HYBRID_BANKS_FNRST_BP_EN - Firmware Bypass enable for lmu static banks fnrst */\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_FNRST_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_FNRST_BP_EN_SHIFT)) & WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_FNRST_BP_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_FNRST_BP_VAL_MASK (0xFF000000U)\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_FNRST_BP_VAL_SHIFT (24U)\r\n/*! LMU_HYBRID_BANKS_FNRST_BP_VAL - Firmware Bypass value for lmu static banks fnrst */\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_FNRST_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_FNRST_BP_VAL_SHIFT)) & WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS1_LMU_HYBRID_BANKS_FNRST_BP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_SMU1_HYBRID_LMU_BYPASS2 - LMU static bank control byapss2 Register for smu1 hybrid banks mem */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS2_LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_EN_MASK (0xFFU)\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS2_LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_EN_SHIFT (0U)\r\n/*! LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_EN - Firmware Bypass enable for lmu static banks vddmc_sw_pd_ctrl */\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS2_LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS2_LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_EN_SHIFT)) & WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS2_LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS2_LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_MASK (0xFF00U)\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS2_LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_SHIFT (8U)\r\n/*! LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_VAL - Firmware Bypass value for lmu static banks vddmc_sw_pd_ctrl */\r\n#define WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS2_LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS2_LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_SHIFT)) & WLAPU_SOCWLAPU_SMU1_HYBRID_LMU_BYPASS2_LMU_HYBRID_BANKS_VDDMC_SW_PD_CTRL_BP_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_APU_ECO_CTRL - APU ECO Control */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_APU_ECO_CTRL_ECO_BITS_MASK (0xFFFFFFFFU)\r\n#define WLAPU_SOCWLAPU_APU_ECO_CTRL_ECO_BITS_SHIFT (0U)\r\n/*! ECO_BITS - Reserved for ECOs */\r\n#define WLAPU_SOCWLAPU_APU_ECO_CTRL_ECO_BITS(x)  (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_ECO_CTRL_ECO_BITS_SHIFT)) & WLAPU_SOCWLAPU_APU_ECO_CTRL_ECO_BITS_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_GPIO_WKUP_CTRL0 - \" */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_GPIO_WKUP_CTRL0_P2C_WKUP_SELECT_MASK (0xFFFFFFFFU)\r\n#define WLAPU_SOCWLAPU_GPIO_WKUP_CTRL0_P2C_WKUP_SELECT_SHIFT (0U)\r\n/*! P2C_WKUP_SELECT - [07:00]: Mux 1 of 32 p2c_pad_wkup input pins to APU wakeup input [0] */\r\n#define WLAPU_SOCWLAPU_GPIO_WKUP_CTRL0_P2C_WKUP_SELECT(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_GPIO_WKUP_CTRL0_P2C_WKUP_SELECT_SHIFT)) & WLAPU_SOCWLAPU_GPIO_WKUP_CTRL0_P2C_WKUP_SELECT_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_GPIO_WKUP_CTRL1 - \" */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_GPIO_WKUP_CTRL1_P2C_WKUP_SELECT_MASK (0xFFFFFFFFU)\r\n#define WLAPU_SOCWLAPU_GPIO_WKUP_CTRL1_P2C_WKUP_SELECT_SHIFT (0U)\r\n/*! P2C_WKUP_SELECT - [07:00]: Mux 1 of 32 p2c_pad_wkup input pins to APU wakeup input [4] */\r\n#define WLAPU_SOCWLAPU_GPIO_WKUP_CTRL1_P2C_WKUP_SELECT(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_GPIO_WKUP_CTRL1_P2C_WKUP_SELECT_SHIFT)) & WLAPU_SOCWLAPU_GPIO_WKUP_CTRL1_P2C_WKUP_SELECT_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_GPIO_WKUP_CTRL2 - \" */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_GPIO_WKUP_CTRL2_P2C_WKUP_SELECT_MASK (0xFFFFFFFFU)\r\n#define WLAPU_SOCWLAPU_GPIO_WKUP_CTRL2_P2C_WKUP_SELECT_SHIFT (0U)\r\n/*! P2C_WKUP_SELECT - [07:00]: Mux 1 of 32 p2c_pad_wkup input pins to APU wakeup input [8] */\r\n#define WLAPU_SOCWLAPU_GPIO_WKUP_CTRL2_P2C_WKUP_SELECT(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_GPIO_WKUP_CTRL2_P2C_WKUP_SELECT_SHIFT)) & WLAPU_SOCWLAPU_GPIO_WKUP_CTRL2_P2C_WKUP_SELECT_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_GPIO_WKUP_CTRL3 - \" */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_GPIO_WKUP_CTRL3_P2C_WKUP_SELECT_MASK (0xFFFFFFFFU)\r\n#define WLAPU_SOCWLAPU_GPIO_WKUP_CTRL3_P2C_WKUP_SELECT_SHIFT (0U)\r\n/*! P2C_WKUP_SELECT - [07:00]: Mux 1 of 32 p2c_pad_wkup input pins to APU wakeup input [12] */\r\n#define WLAPU_SOCWLAPU_GPIO_WKUP_CTRL3_P2C_WKUP_SELECT(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_GPIO_WKUP_CTRL3_P2C_WKUP_SELECT_SHIFT)) & WLAPU_SOCWLAPU_GPIO_WKUP_CTRL3_P2C_WKUP_SELECT_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_HOST_WKUP_MODE - \" */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_HOST_WKUP_MODE_GPIO_SEL_MASK (0xFFFFU)\r\n#define WLAPU_SOCWLAPU_HOST_WKUP_MODE_GPIO_SEL_SHIFT (0U)\r\n/*! GPIO_SEL - gpio_sel */\r\n#define WLAPU_SOCWLAPU_HOST_WKUP_MODE_GPIO_SEL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_HOST_WKUP_MODE_GPIO_SEL_SHIFT)) & WLAPU_SOCWLAPU_HOST_WKUP_MODE_GPIO_SEL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_T3_CLK_DIV_EN_BYPASS - \" */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_256_CLK_DIV_EN_BYPASS_EN_MASK (0x1U)\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_256_CLK_DIV_EN_BYPASS_EN_SHIFT (0U)\r\n/*! T3_SOC_256_CLK_DIV_EN_BYPASS_EN - Enable/ disable value: */\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_256_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_256_CLK_DIV_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_256_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_256_CLK_DIV_EN_BYPASS_VAL_MASK (0x2U)\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_256_CLK_DIV_EN_BYPASS_VAL_SHIFT (1U)\r\n/*! T3_SOC_256_CLK_DIV_EN_BYPASS_VAL - bypass value */\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_256_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_256_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_256_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_320_CLK_DIV_EN_BYPASS_EN_MASK (0x4U)\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_320_CLK_DIV_EN_BYPASS_EN_SHIFT (2U)\r\n/*! T3_SOC_320_CLK_DIV_EN_BYPASS_EN - Enable/ disable value: */\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_320_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_320_CLK_DIV_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_320_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_320_CLK_DIV_EN_BYPASS_VAL_MASK (0x8U)\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_320_CLK_DIV_EN_BYPASS_VAL_SHIFT (3U)\r\n/*! T3_SOC_320_CLK_DIV_EN_BYPASS_VAL - bypass value */\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_320_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_320_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_320_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_365P7_CLK_DIV_EN_BYPASS_EN_MASK (0x10U)\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_365P7_CLK_DIV_EN_BYPASS_EN_SHIFT (4U)\r\n/*! T3_SOC_365P7_CLK_DIV_EN_BYPASS_EN - Enable/ disable value: */\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_365P7_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_365P7_CLK_DIV_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_365P7_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_365P7_CLK_DIV_EN_BYPASS_VAL_MASK (0x20U)\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_365P7_CLK_DIV_EN_BYPASS_VAL_SHIFT (5U)\r\n/*! T3_SOC_365P7_CLK_DIV_EN_BYPASS_VAL - bypass value */\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_365P7_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_365P7_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_365P7_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_426_CLK_DIV_EN_BYPASS_EN_MASK (0x40U)\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_426_CLK_DIV_EN_BYPASS_EN_SHIFT (6U)\r\n/*! T3_SOC_426_CLK_DIV_EN_BYPASS_EN - Enable/ disable value: */\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_426_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_426_CLK_DIV_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_426_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_426_CLK_DIV_EN_BYPASS_VAL_MASK (0x80U)\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_426_CLK_DIV_EN_BYPASS_VAL_SHIFT (7U)\r\n/*! T3_SOC_426_CLK_DIV_EN_BYPASS_VAL - bypass value */\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_426_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_426_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_426_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_512_CLK_DIV_EN_BYPASS_EN_MASK (0x100U)\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_512_CLK_DIV_EN_BYPASS_EN_SHIFT (8U)\r\n/*! T3_SOC_512_CLK_DIV_EN_BYPASS_EN - Enable/ disable value: */\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_512_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_512_CLK_DIV_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_512_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_512_CLK_DIV_EN_BYPASS_VAL_MASK (0x200U)\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_512_CLK_DIV_EN_BYPASS_VAL_SHIFT (9U)\r\n/*! T3_SOC_512_CLK_DIV_EN_BYPASS_VAL - bypass value */\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_512_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_512_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_SOC_512_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_213P3_CLK_DIV_EN_BYPASS_EN_MASK (0x400U)\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_213P3_CLK_DIV_EN_BYPASS_EN_SHIFT (10U)\r\n/*! T3_213P3_CLK_DIV_EN_BYPASS_EN - Enable/ disable value: */\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_213P3_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_213P3_CLK_DIV_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_213P3_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_213P3_CLK_DIV_EN_BYPASS_VAL_MASK (0x800U)\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_213P3_CLK_DIV_EN_BYPASS_VAL_SHIFT (11U)\r\n/*! T3_213P3_CLK_DIV_EN_BYPASS_VAL - bypass value */\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_213P3_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_213P3_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_213P3_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC1_CLK_DIV_EN_BYPASS_EN_MASK (0x1000U)\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC1_CLK_DIV_EN_BYPASS_EN_SHIFT (12U)\r\n/*! T3_MAC1_CLK_DIV_EN_BYPASS_EN - Enable/ disable value: */\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC1_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC1_CLK_DIV_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC1_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC1_CLK_DIV_EN_BYPASS_VAL_MASK (0x2000U)\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC1_CLK_DIV_EN_BYPASS_VAL_SHIFT (13U)\r\n/*! T3_MAC1_CLK_DIV_EN_BYPASS_VAL - bypass value */\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC1_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC1_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC1_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC2_CLK_DIV_EN_BYPASS_EN_MASK (0x4000U)\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC2_CLK_DIV_EN_BYPASS_EN_SHIFT (14U)\r\n/*! T3_MAC2_CLK_DIV_EN_BYPASS_EN - Enable/ disable value: */\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC2_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC2_CLK_DIV_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC2_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC2_CLK_DIV_EN_BYPASS_VAL_MASK (0x8000U)\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC2_CLK_DIV_EN_BYPASS_VAL_SHIFT (15U)\r\n/*! T3_MAC2_CLK_DIV_EN_BYPASS_VAL - bypass value */\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC2_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC2_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_MAC2_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_BBUD_CLK_DIV_EN_BYPASS_EN_MASK (0x10000U)\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_BBUD_CLK_DIV_EN_BYPASS_EN_SHIFT (16U)\r\n/*! T3_BBUD_CLK_DIV_EN_BYPASS_EN - Enable/ disable value: */\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_BBUD_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_BBUD_CLK_DIV_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_BBUD_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_BBUD_CLK_DIV_EN_BYPASS_VAL_MASK (0x20000U)\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_BBUD_CLK_DIV_EN_BYPASS_VAL_SHIFT (17U)\r\n/*! T3_BBUD_CLK_DIV_EN_BYPASS_VAL - bypass value */\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_BBUD_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_BBUD_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_T3_BBUD_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_TCPU_CPU_CLK_DIV_EN_BYPASS_EN_MASK (0x40000U)\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_TCPU_CPU_CLK_DIV_EN_BYPASS_EN_SHIFT (18U)\r\n/*! TCPU_CPU_CLK_DIV_EN_BYPASS_EN - Enable/ disable value: */\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_TCPU_CPU_CLK_DIV_EN_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_TCPU_CPU_CLK_DIV_EN_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_TCPU_CPU_CLK_DIV_EN_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_TCPU_CPU_CLK_DIV_EN_BYPASS_VAL_MASK (0x80000U)\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_TCPU_CPU_CLK_DIV_EN_BYPASS_VAL_SHIFT (19U)\r\n/*! TCPU_CPU_CLK_DIV_EN_BYPASS_VAL - bypass value for tcpu cpu_clk_en */\r\n#define WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_TCPU_CPU_CLK_DIV_EN_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_TCPU_CPU_CLK_DIV_EN_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_T3_CLK_DIV_EN_BYPASS_TCPU_CPU_CLK_DIV_EN_BYPASS_VAL_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_LDO_LV_CTRL2 - LV LDO Control 2 */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_LDO_LV_CTRL2_LDO_GLU_XOSC_VAL_MASK (0x10U)\r\n#define WLAPU_SOCWLAPU_LDO_LV_CTRL2_LDO_GLU_XOSC_VAL_SHIFT (4U)\r\n/*! LDO_GLU_XOSC_VAL - XOSC_EN value for ldo control logic set by FW */\r\n#define WLAPU_SOCWLAPU_LDO_LV_CTRL2_LDO_GLU_XOSC_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_LDO_LV_CTRL2_LDO_GLU_XOSC_VAL_SHIFT)) & WLAPU_SOCWLAPU_LDO_LV_CTRL2_LDO_GLU_XOSC_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_LDO_LV_CTRL2_LDO_GLU_XOSC_BYPASS_EN_MASK (0x20U)\r\n#define WLAPU_SOCWLAPU_LDO_LV_CTRL2_LDO_GLU_XOSC_BYPASS_EN_SHIFT (5U)\r\n/*! LDO_GLU_XOSC_BYPASS_EN - XOSC_EN control bypass for ldo control logic */\r\n#define WLAPU_SOCWLAPU_LDO_LV_CTRL2_LDO_GLU_XOSC_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_LDO_LV_CTRL2_LDO_GLU_XOSC_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_LDO_LV_CTRL2_LDO_GLU_XOSC_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_CAU_BYPASS - CAU Bypass */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_CAU_BYPASS_PHY_REF_CLK_BYPASS_VAL_MASK (0x1U)\r\n#define WLAPU_SOCWLAPU_CAU_BYPASS_PHY_REF_CLK_BYPASS_VAL_SHIFT (0U)\r\n/*! PHY_REF_CLK_BYPASS_VAL - bypass value for phy ref clk enable */\r\n#define WLAPU_SOCWLAPU_CAU_BYPASS_PHY_REF_CLK_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_CAU_BYPASS_PHY_REF_CLK_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_CAU_BYPASS_PHY_REF_CLK_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_CAU_BYPASS_PHY_REF_CLK_BYPASS_EN_MASK (0x2U)\r\n#define WLAPU_SOCWLAPU_CAU_BYPASS_PHY_REF_CLK_BYPASS_EN_SHIFT (1U)\r\n/*! PHY_REF_CLK_BYPASS_EN - bypass enable for phy ref clk enable */\r\n#define WLAPU_SOCWLAPU_CAU_BYPASS_PHY_REF_CLK_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_CAU_BYPASS_PHY_REF_CLK_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_CAU_BYPASS_PHY_REF_CLK_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_CAU_BYPASS_WL_CLK_BYPASS_VAL_MASK (0x10U)\r\n#define WLAPU_SOCWLAPU_CAU_BYPASS_WL_CLK_BYPASS_VAL_SHIFT (4U)\r\n/*! WL_CLK_BYPASS_VAL - bypass value for wl clk enable */\r\n#define WLAPU_SOCWLAPU_CAU_BYPASS_WL_CLK_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_CAU_BYPASS_WL_CLK_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_CAU_BYPASS_WL_CLK_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_CAU_BYPASS_WL_CLK_BYPASS_EN_MASK (0x20U)\r\n#define WLAPU_SOCWLAPU_CAU_BYPASS_WL_CLK_BYPASS_EN_SHIFT (5U)\r\n/*! WL_CLK_BYPASS_EN - bypass enable for wl clk enable */\r\n#define WLAPU_SOCWLAPU_CAU_BYPASS_WL_CLK_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_CAU_BYPASS_WL_CLK_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_CAU_BYPASS_WL_CLK_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_MEM_PWDN1 - Memory Powerdown Control */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_DTCM_BYPASS_VAL_MASK (0x1U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_DTCM_BYPASS_VAL_SHIFT (0U)\r\n/*! CPU1_DTCM_BYPASS_VAL - Firmware Bypass value for cpu1 DTCM Memories Power Down. Not used for KF2 */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_DTCM_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_DTCM_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_DTCM_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_TCM_BYPASS_VAL_MASK (0x2U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_TCM_BYPASS_VAL_SHIFT (1U)\r\n/*! CPU1_TCM_BYPASS_VAL - Firmware Bypass value for cpu1 ATCM/BTCM0/BTCM1 Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_TCM_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_TCM_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_TCM_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_BPM_BYPASS_VAL_MASK (0x80U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_BPM_BYPASS_VAL_SHIFT (7U)\r\n/*! CPU1_BPM_BYPASS_VAL - Firmware Bypass value for cpu1 bpm Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_BPM_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_BPM_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_BPM_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_SMU1_BYPASS_VAL_MASK (0x200U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_SMU1_BYPASS_VAL_SHIFT (9U)\r\n/*! SMU1_BYPASS_VAL - Firmware Bypass value for amu1 Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_SMU1_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN1_SMU1_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN1_SMU1_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_BCM_BYPASS_VAL_MASK (0x400U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_BCM_BYPASS_VAL_SHIFT (10U)\r\n/*! BCM_BYPASS_VAL - Firmware Bypass value for BCM Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_BCM_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN1_BCM_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN1_BCM_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_WEU_BYPASS_VAL_MASK (0x800U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_WEU_BYPASS_VAL_SHIFT (11U)\r\n/*! WEU_BYPASS_VAL - Firmware Bypass value for WEU Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_WEU_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN1_WEU_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN1_WEU_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_SDU_BYPASS_VAL_MASK (0x1000U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_SDU_BYPASS_VAL_SHIFT (12U)\r\n/*! SDU_BYPASS_VAL - Firmware Bypass value for cisRAM (SDU) Memory Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_SDU_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN1_SDU_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN1_SDU_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_MCU1_BYPASS_VAL_MASK (0x2000U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_MCU1_BYPASS_VAL_SHIFT (13U)\r\n/*! MCU1_BYPASS_VAL - Firmware Bypass value for MCU1 Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_MCU1_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN1_MCU1_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN1_MCU1_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_SIU_DBG_BYPASS_VAL_MASK (0x4000U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_SIU_DBG_BYPASS_VAL_SHIFT (14U)\r\n/*! SIU_DBG_BYPASS_VAL - Firmware Bypass value for WLAN DBG UART Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_SIU_DBG_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN1_SIU_DBG_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN1_SIU_DBG_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_ADMA1_BYPASS_VAL_MASK (0x8000U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_ADMA1_BYPASS_VAL_SHIFT (15U)\r\n/*! ADMA1_BYPASS_VAL - Firmware Bypass value for ADMA1 Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_ADMA1_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN1_ADMA1_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN1_ADMA1_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_DTCM_BYPASS_EN_MASK (0x10000U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_DTCM_BYPASS_EN_SHIFT (16U)\r\n/*! CPU1_DTCM_BYPASS_EN - Firmware Bypass Enable for cpu1 DTCM Memories Power Down. */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_DTCM_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_DTCM_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_DTCM_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_TCM_BYPASS_EN_MASK (0x20000U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_TCM_BYPASS_EN_SHIFT (17U)\r\n/*! CPU1_TCM_BYPASS_EN - Firmware Bypass Enable for cpu1 ATCM/BTCM0/BTCM1 Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_TCM_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_TCM_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_TCM_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_BPM_BYPASS_EN_MASK (0x800000U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_BPM_BYPASS_EN_SHIFT (23U)\r\n/*! CPU1_BPM_BYPASS_EN - Firmware Bypass Enable for cpu1 bpm Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_BPM_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_BPM_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN1_CPU1_BPM_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_SMU1_BYPASS_EN_MASK (0x2000000U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_SMU1_BYPASS_EN_SHIFT (25U)\r\n/*! SMU1_BYPASS_EN - Firmware Bypass Enable for amu1 Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_SMU1_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN1_SMU1_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN1_SMU1_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_BCM_BYPASS_EN_MASK (0x4000000U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_BCM_BYPASS_EN_SHIFT (26U)\r\n/*! BCM_BYPASS_EN - Firmware Bypass Enable for BCM Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_BCM_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN1_BCM_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN1_BCM_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_WEU_BYPASS_EN_MASK (0x8000000U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_WEU_BYPASS_EN_SHIFT (27U)\r\n/*! WEU_BYPASS_EN - Firmware Bypass Enable for WEU Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_WEU_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN1_WEU_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN1_WEU_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_SDU_BYPASS_EN_MASK (0x10000000U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_SDU_BYPASS_EN_SHIFT (28U)\r\n/*! SDU_BYPASS_EN - Firmware Bypass Enable for cisRAM (SDU) Memory Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_SDU_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN1_SDU_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN1_SDU_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_MCU1_BYPASS_EN_MASK (0x20000000U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_MCU1_BYPASS_EN_SHIFT (29U)\r\n/*! MCU1_BYPASS_EN - Firmware Bypass Enable for MCU1 Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_MCU1_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN1_MCU1_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN1_MCU1_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_SIU_DBG_BYPASS_EN_MASK (0x40000000U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_SIU_DBG_BYPASS_EN_SHIFT (30U)\r\n/*! SIU_DBG_BYPASS_EN - Firmware Bypass Enable for WLAN DBG UART Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_SIU_DBG_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN1_SIU_DBG_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN1_SIU_DBG_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_ADMA1_BYPASS_EN_MASK (0x80000000U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_ADMA1_BYPASS_EN_SHIFT (31U)\r\n/*! ADMA1_BYPASS_EN - Firmware Bypass Enable for ADMA1 Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN1_ADMA1_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN1_ADMA1_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN1_ADMA1_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_MEM_PWDN2 - Memory Powerdown Control */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_OTP_BYPASS_VAL_MASK (0x2U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_OTP_BYPASS_VAL_SHIFT (1U)\r\n/*! OTP_BYPASS_VAL - Firmware Bypass Value for OTP Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_OTP_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN2_OTP_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN2_OTP_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_SMU0_BYPASS_VAL_MASK (0x8U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_SMU0_BYPASS_VAL_SHIFT (3U)\r\n/*! SMU0_BYPASS_VAL - Firmware Bypass value for SMU0 Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_SMU0_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN2_SMU0_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN2_SMU0_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_CACHE_BYPASS_VAL_MASK (0x10U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_CACHE_BYPASS_VAL_SHIFT (4U)\r\n/*! CPU1_CACHE_BYPASS_VAL - Firmware Bypass value for cpu1 cache Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_CACHE_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_CACHE_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_CACHE_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_ETB_BYPASS_VAL_MASK (0x20U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_ETB_BYPASS_VAL_SHIFT (5U)\r\n/*! CPU1_ETB_BYPASS_VAL - Firmware Bypass value for cpu1 ETB Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_ETB_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_ETB_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_ETB_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_ROM_BYPASS_VAL_MASK (0x40U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_ROM_BYPASS_VAL_SHIFT (6U)\r\n/*! CPU1_ROM_BYPASS_VAL - Firmware Bypass value for cpu1 ROM Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_ROM_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_ROM_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_ROM_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_SSU_BYPASS_VAL_MASK (0x80U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_SSU_BYPASS_VAL_SHIFT (7U)\r\n/*! SSU_BYPASS_VAL - Firmware Bypass Value for SSU Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_SSU_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN2_SSU_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN2_SSU_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_OTP_BYPASS_EN_MASK (0x20000U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_OTP_BYPASS_EN_SHIFT (17U)\r\n/*! OTP_BYPASS_EN - Firmware Bypass Enable for OTP Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_OTP_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN2_OTP_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN2_OTP_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_SMU0_BYPASS_EN_MASK (0x80000U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_SMU0_BYPASS_EN_SHIFT (19U)\r\n/*! SMU0_BYPASS_EN - Firmware Bypass Enable for SMU0 Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_SMU0_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN2_SMU0_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN2_SMU0_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_CACHE_BYPASS_EN_MASK (0x100000U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_CACHE_BYPASS_EN_SHIFT (20U)\r\n/*! CPU1_CACHE_BYPASS_EN - Firmware Bypass Enable for cpu1 cache Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_CACHE_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_CACHE_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_CACHE_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_ETB_BYPASS_EN_MASK (0x200000U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_ETB_BYPASS_EN_SHIFT (21U)\r\n/*! CPU1_ETB_BYPASS_EN - Firmware Bypass Enable for cpu1 ETB Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_ETB_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_ETB_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_ETB_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_ROM_BYPASS_EN_MASK (0x400000U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_ROM_BYPASS_EN_SHIFT (22U)\r\n/*! CPU1_ROM_BYPASS_EN - Firmware Bypass Enable for cpu1 ROM Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_ROM_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_ROM_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN2_CPU1_ROM_BYPASS_EN_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_SSU_BYPASS_EN_MASK (0x800000U)\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_SSU_BYPASS_EN_SHIFT (23U)\r\n/*! SSU_BYPASS_EN - Firmware Bypass Enable for SSU Memories Power Down */\r\n#define WLAPU_SOCWLAPU_MEM_PWDN2_SSU_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_MEM_PWDN2_SSU_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_MEM_PWDN2_SSU_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_HOST_WKUP_SOURCE - Host Wakeup Source Control */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_HOST_WKUP_SOURCE_ENABLE_MASK (0xFFFFU)\r\n#define WLAPU_SOCWLAPU_HOST_WKUP_SOURCE_ENABLE_SHIFT (0U)\r\n/*! ENABLE - Enable/ disable value: */\r\n#define WLAPU_SOCWLAPU_HOST_WKUP_SOURCE_ENABLE(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_HOST_WKUP_SOURCE_ENABLE_SHIFT)) & WLAPU_SOCWLAPU_HOST_WKUP_SOURCE_ENABLE_MASK)\r\n/*! @} */\r\n\r\n/*! @name SOCWLAPU_APU_IPS_PWR_CTRL_BYPASS0 - APU IPS power control Bypass Register 0 */\r\n/*! @{ */\r\n\r\n#define WLAPU_SOCWLAPU_APU_IPS_PWR_CTRL_BYPASS0_IPS_RAM_ROM_PD_BYPASS_VAL_MASK (0x1U)\r\n#define WLAPU_SOCWLAPU_APU_IPS_PWR_CTRL_BYPASS0_IPS_RAM_ROM_PD_BYPASS_VAL_SHIFT (0U)\r\n/*! IPS_RAM_ROM_PD_BYPASS_VAL - Firmware Bypass value for IPS RAM/ROM PD from APU */\r\n#define WLAPU_SOCWLAPU_APU_IPS_PWR_CTRL_BYPASS0_IPS_RAM_ROM_PD_BYPASS_VAL(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_IPS_PWR_CTRL_BYPASS0_IPS_RAM_ROM_PD_BYPASS_VAL_SHIFT)) & WLAPU_SOCWLAPU_APU_IPS_PWR_CTRL_BYPASS0_IPS_RAM_ROM_PD_BYPASS_VAL_MASK)\r\n\r\n#define WLAPU_SOCWLAPU_APU_IPS_PWR_CTRL_BYPASS0_IPS_RAM_ROM_PD_BYPASS_EN_MASK (0x2U)\r\n#define WLAPU_SOCWLAPU_APU_IPS_PWR_CTRL_BYPASS0_IPS_RAM_ROM_PD_BYPASS_EN_SHIFT (1U)\r\n/*! IPS_RAM_ROM_PD_BYPASS_EN - Firmware Bypass enable for IPS RAM/ROM PD from APU */\r\n#define WLAPU_SOCWLAPU_APU_IPS_PWR_CTRL_BYPASS0_IPS_RAM_ROM_PD_BYPASS_EN(x) (((uint32_t)(((uint32_t)(x)) << WLAPU_SOCWLAPU_APU_IPS_PWR_CTRL_BYPASS0_IPS_RAM_ROM_PD_BYPASS_EN_SHIFT)) & WLAPU_SOCWLAPU_APU_IPS_PWR_CTRL_BYPASS0_IPS_RAM_ROM_PD_BYPASS_EN_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group WLAPU_Register_Masks */\r\n\r\n\r\n/* WLAPU - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral WLAPU base address */\r\n  #define WLAPU_BASE                               (0x51258000u)\r\n  /** Peripheral WLAPU base address */\r\n  #define WLAPU_BASE_NS                            (0x41258000u)\r\n  /** Peripheral WLAPU base pointer */\r\n  #define WLAPU                                    ((WLAPU_Type *)WLAPU_BASE)\r\n  /** Peripheral WLAPU base pointer */\r\n  #define WLAPU_NS                                 ((WLAPU_Type *)WLAPU_BASE_NS)\r\n  /** Array initializer of WLAPU peripheral base addresses */\r\n  #define WLAPU_BASE_ADDRS                         { WLAPU_BASE }\r\n  /** Array initializer of WLAPU peripheral base pointers */\r\n  #define WLAPU_BASE_PTRS                          { WLAPU }\r\n  /** Array initializer of WLAPU peripheral base addresses */\r\n  #define WLAPU_BASE_ADDRS_NS                      { WLAPU_BASE_NS }\r\n  /** Array initializer of WLAPU peripheral base pointers */\r\n  #define WLAPU_BASE_PTRS_NS                       { WLAPU_NS }\r\n#else\r\n  /** Peripheral WLAPU base address */\r\n  #define WLAPU_BASE                               (0x41258000u)\r\n  /** Peripheral WLAPU base pointer */\r\n  #define WLAPU                                    ((WLAPU_Type *)WLAPU_BASE)\r\n  /** Array initializer of WLAPU peripheral base addresses */\r\n  #define WLAPU_BASE_ADDRS                         { WLAPU_BASE }\r\n  /** Array initializer of WLAPU peripheral base pointers */\r\n  #define WLAPU_BASE_PTRS                          { WLAPU }\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group WLAPU_Peripheral_Access_Layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- WWDT Peripheral Access Layer\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup WWDT_Peripheral_Access_Layer WWDT Peripheral Access Layer\r\n * @{\r\n */\r\n\r\n/** WWDT - Register Layout Typedef */\r\ntypedef struct {\r\n  __IO uint32_t MOD;                               /**< Mode, offset: 0x0 */\r\n  __IO uint32_t TC;                                /**< Timer Constant, offset: 0x4 */\r\n  __O  uint32_t FEED;                              /**< Feed Sequence, offset: 0x8 */\r\n  __I  uint32_t TV;                                /**< Timer Value, offset: 0xC */\r\n       uint8_t RESERVED_0[4];\r\n  __IO uint32_t WARNINT;                           /**< Warning Interrupt Compare Value, offset: 0x14 */\r\n  __IO uint32_t WINDOW;                            /**< Window Compare Value, offset: 0x18 */\r\n} WWDT_Type;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- WWDT Register Masks\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup WWDT_Register_Masks WWDT Register Masks\r\n * @{\r\n */\r\n\r\n/*! @name MOD - Mode */\r\n/*! @{ */\r\n\r\n#define WWDT_MOD_WDEN_MASK                       (0x1U)\r\n#define WWDT_MOD_WDEN_SHIFT                      (0U)\r\n/*! WDEN - Watchdog Enable\r\n *  0b0..Stop. The Watchdog timer is stopped.\r\n *  0b1..Run. The Watchdog timer is running.\r\n */\r\n#define WWDT_MOD_WDEN(x)                         (((uint32_t)(((uint32_t)(x)) << WWDT_MOD_WDEN_SHIFT)) & WWDT_MOD_WDEN_MASK)\r\n\r\n#define WWDT_MOD_WDRESET_MASK                    (0x2U)\r\n#define WWDT_MOD_WDRESET_SHIFT                   (1U)\r\n/*! WDRESET - Watchdog Reset Enable\r\n *  0b0..Interrupt. A Watchdog timeout will not cause a chip reset.\r\n *  0b1..Reset. A Watchdog timeout will cause a chip reset.\r\n */\r\n#define WWDT_MOD_WDRESET(x)                      (((uint32_t)(((uint32_t)(x)) << WWDT_MOD_WDRESET_SHIFT)) & WWDT_MOD_WDRESET_MASK)\r\n\r\n#define WWDT_MOD_WDTOF_MASK                      (0x4U)\r\n#define WWDT_MOD_WDTOF_SHIFT                     (2U)\r\n/*! WDTOF - Watchdog Timeout Flag\r\n *  0b0..Clear.\r\n *  0b1..Reset. Causes a chip reset if WDRESET = 1.\r\n */\r\n#define WWDT_MOD_WDTOF(x)                        (((uint32_t)(((uint32_t)(x)) << WWDT_MOD_WDTOF_SHIFT)) & WWDT_MOD_WDTOF_MASK)\r\n\r\n#define WWDT_MOD_WDINT_MASK                      (0x8U)\r\n#define WWDT_MOD_WDINT_SHIFT                     (3U)\r\n/*! WDINT - Warning Interrupt Flag\r\n *  0b0..No flag.\r\n *  0b1..Flag. The Watchdog interrupt flag is set when the Watchdog counter is no longer greater than the value specified by WARNINT.\r\n */\r\n#define WWDT_MOD_WDINT(x)                        (((uint32_t)(((uint32_t)(x)) << WWDT_MOD_WDINT_SHIFT)) & WWDT_MOD_WDINT_MASK)\r\n\r\n#define WWDT_MOD_WDPROTECT_MASK                  (0x10U)\r\n#define WWDT_MOD_WDPROTECT_SHIFT                 (4U)\r\n/*! WDPROTECT - Watchdog Update Mode\r\n *  0b0..Flexible\r\n *  0b1..Threshold\r\n */\r\n#define WWDT_MOD_WDPROTECT(x)                    (((uint32_t)(((uint32_t)(x)) << WWDT_MOD_WDPROTECT_SHIFT)) & WWDT_MOD_WDPROTECT_MASK)\r\n\r\n#define WWDT_MOD_LOCK_MASK                       (0x20U)\r\n#define WWDT_MOD_LOCK_SHIFT                      (5U)\r\n/*! LOCK - Lock\r\n *  0b0..No Lock\r\n *  0b1..Lock\r\n */\r\n#define WWDT_MOD_LOCK(x)                         (((uint32_t)(((uint32_t)(x)) << WWDT_MOD_LOCK_SHIFT)) & WWDT_MOD_LOCK_MASK)\r\n/*! @} */\r\n\r\n/*! @name TC - Timer Constant */\r\n/*! @{ */\r\n\r\n#define WWDT_TC_COUNT_MASK                       (0xFFFFFFU)\r\n#define WWDT_TC_COUNT_SHIFT                      (0U)\r\n/*! COUNT - Watchdog Timeout Value */\r\n#define WWDT_TC_COUNT(x)                         (((uint32_t)(((uint32_t)(x)) << WWDT_TC_COUNT_SHIFT)) & WWDT_TC_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name FEED - Feed Sequence */\r\n/*! @{ */\r\n\r\n#define WWDT_FEED_FEED_MASK                      (0xFFU)\r\n#define WWDT_FEED_FEED_SHIFT                     (0U)\r\n/*! FEED - Feed Value */\r\n#define WWDT_FEED_FEED(x)                        (((uint32_t)(((uint32_t)(x)) << WWDT_FEED_FEED_SHIFT)) & WWDT_FEED_FEED_MASK)\r\n/*! @} */\r\n\r\n/*! @name TV - Timer Value */\r\n/*! @{ */\r\n\r\n#define WWDT_TV_COUNT_MASK                       (0xFFFFFFU)\r\n#define WWDT_TV_COUNT_SHIFT                      (0U)\r\n/*! COUNT - Counter Timer Value */\r\n#define WWDT_TV_COUNT(x)                         (((uint32_t)(((uint32_t)(x)) << WWDT_TV_COUNT_SHIFT)) & WWDT_TV_COUNT_MASK)\r\n/*! @} */\r\n\r\n/*! @name WARNINT - Warning Interrupt Compare Value */\r\n/*! @{ */\r\n\r\n#define WWDT_WARNINT_WARNINT_MASK                (0x3FFU)\r\n#define WWDT_WARNINT_WARNINT_SHIFT               (0U)\r\n/*! WARNINT - Watchdog Warning Interrupt Compare Value */\r\n#define WWDT_WARNINT_WARNINT(x)                  (((uint32_t)(((uint32_t)(x)) << WWDT_WARNINT_WARNINT_SHIFT)) & WWDT_WARNINT_WARNINT_MASK)\r\n/*! @} */\r\n\r\n/*! @name WINDOW - Window Compare Value */\r\n/*! @{ */\r\n\r\n#define WWDT_WINDOW_WINDOW_MASK                  (0xFFFFFFU)\r\n#define WWDT_WINDOW_WINDOW_SHIFT                 (0U)\r\n/*! WINDOW - Watchdog Window Value. */\r\n#define WWDT_WINDOW_WINDOW(x)                    (((uint32_t)(((uint32_t)(x)) << WWDT_WINDOW_WINDOW_SHIFT)) & WWDT_WINDOW_WINDOW_MASK)\r\n/*! @} */\r\n\r\n\r\n/*!\r\n * @}\r\n */ /* end of group WWDT_Register_Masks */\r\n\r\n\r\n/* WWDT - Peripheral instance base addresses */\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n  /** Peripheral WWDT0 base address */\r\n  #define WWDT0_BASE                               (0x5000E000u)\r\n  /** Peripheral WWDT0 base address */\r\n  #define WWDT0_BASE_NS                            (0x4000E000u)\r\n  /** Peripheral WWDT0 base pointer */\r\n  #define WWDT0                                    ((WWDT_Type *)WWDT0_BASE)\r\n  /** Peripheral WWDT0 base pointer */\r\n  #define WWDT0_NS                                 ((WWDT_Type *)WWDT0_BASE_NS)\r\n  /** Array initializer of WWDT peripheral base addresses */\r\n  #define WWDT_BASE_ADDRS                          { WWDT0_BASE }\r\n  /** Array initializer of WWDT peripheral base pointers */\r\n  #define WWDT_BASE_PTRS                           { WWDT0 }\r\n  /** Array initializer of WWDT peripheral base addresses */\r\n  #define WWDT_BASE_ADDRS_NS                       { WWDT0_BASE_NS }\r\n  /** Array initializer of WWDT peripheral base pointers */\r\n  #define WWDT_BASE_PTRS_NS                        { WWDT0_NS }\r\n#else\r\n  /** Peripheral WWDT0 base address */\r\n  #define WWDT0_BASE                               (0x4000E000u)\r\n  /** Peripheral WWDT0 base pointer */\r\n  #define WWDT0                                    ((WWDT_Type *)WWDT0_BASE)\r\n  /** Array initializer of WWDT peripheral base addresses */\r\n  #define WWDT_BASE_ADDRS                          { WWDT0_BASE }\r\n  /** Array initializer of WWDT peripheral base pointers */\r\n  #define WWDT_BASE_PTRS                           { WWDT0 }\r\n#endif\r\n/** Interrupt vectors for the WWDT peripheral type */\r\n#define WWDT_IRQS                                { WDT0_IRQn }\r\n\r\n/*!\r\n * @}\r\n */ /* end of group WWDT_Peripheral_Access_Layer */\r\n\r\n\r\n/*\r\n** End of section using anonymous unions\r\n*/\r\n\r\n#if defined(__ARMCC_VERSION)\r\n  #if (__ARMCC_VERSION >= 6010050)\r\n    #pragma clang diagnostic pop\r\n  #else\r\n    #pragma pop\r\n  #endif\r\n#elif defined(__GNUC__)\r\n  /* leave anonymous unions enabled */\r\n#elif defined(__IAR_SYSTEMS_ICC__)\r\n  #pragma language=default\r\n#else\r\n  #error Not supported compiler type\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */ /* end of group Peripheral_access_layer */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- Macros for use with bit field definitions (xxx_SHIFT, xxx_MASK).\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup Bit_Field_Generic_Macros Macros for use with bit field definitions (xxx_SHIFT, xxx_MASK).\r\n * @{\r\n */\r\n\r\n#if defined(__ARMCC_VERSION)\r\n  #if (__ARMCC_VERSION >= 6010050)\r\n    #pragma clang system_header\r\n  #endif\r\n#elif defined(__IAR_SYSTEMS_ICC__)\r\n  #pragma system_include\r\n#endif\r\n\r\n/**\r\n * @brief Mask and left-shift a bit field value for use in a register bit range.\r\n * @param field Name of the register bit field.\r\n * @param value Value of the bit field.\r\n * @return Masked and shifted value.\r\n */\r\n#define NXP_VAL2FLD(field, value)    (((value) << (field ## _SHIFT)) & (field ## _MASK))\r\n/**\r\n * @brief Mask and right-shift a register value to extract a bit field value.\r\n * @param field Name of the register bit field.\r\n * @param value Value of the register.\r\n * @return Masked and shifted bit field value.\r\n */\r\n#define NXP_FLD2VAL(field, value)    (((value) & (field ## _MASK)) >> (field ## _SHIFT))\r\n\r\n/*!\r\n * @}\r\n */ /* end of group Bit_Field_Generic_Macros */\r\n\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SDK Compatibility\r\n   ---------------------------------------------------------------------------- */\r\n\r\n/*!\r\n * @addtogroup SDK_Compatibility_Symbols SDK Compatibility\r\n * @{\r\n */\r\n\r\n/** Used for get the base address of ROM API */\r\n#define FSL_ROM_API_BASE_ADDR 0x1303f000U\r\n/** Used for get the address of OTP INIT API in ROM */\r\n#define FSL_ROM_OTP_INIT_ADDR 0x13009FF9U\r\n/** Used for get the address of OTP DEINIT API in ROM */\r\n#define FSL_ROM_OTP_DEINIT_ADDR 0x1300a047U\r\n/** Used for get the address of OTP FUSE READ API in ROM */\r\n#define FSL_ROM_OTP_FUSE_READ_ADDR 0x1300a057U\r\n\r\n/*! @brief IMU message link between current CPU and remote peer CPU. */\r\ntypedef enum\r\n{\r\n    kIMU_LinkCpu1Cpu3 = 0, /*! Message link between CPU1 and CPU3. */\r\n    kIMU_LinkCpu2Cpu3,     /*! Message link between CPU2 and CPU3. */\r\n    kIMU_LinkMax           /*! Message link count used for boundary check. */\r\n} imu_link_t;\r\n\r\n/*! @brief IMU base register for current CPU. */\r\n#define IMU_CUR_CPU_BASE(link) (((link) == kIMU_LinkCpu1Cpu3) ? (&(WLCTRL->CIU1_IMU_CPU3_WR_MSG_TO_CPU1)) : (&(BLECTRL->CIU2_IMU_CPU3_WR_MSG_TO_CPU2)))\r\n/*! @brief IMU base register for peer CPU. */\r\n#define IMU_PEER_CPU_BASE(link) (((link) == kIMU_LinkCpu1Cpu3) ? (&(WLCTRL->CIU1_IMU_CPU1_WR_MSG_TO_CPU3)) : (&(BLECTRL->CIU2_IMU_CPU2_WR_MSG_TO_CPU3)))\r\n\r\n/*! @brief IMU CPU index for current CPU. */\r\n#define IMU_CPU_INDEX (3U)\r\n\r\n/*!\r\n * @}\r\n */ /* end of group SDK_Compatibility_Symbols */\r\n\r\n\r\n#endif  /* RW612_H_ */\r\n\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/device/RW612_features.h",
    "content": "/*\r\n** ###################################################################\r\n**     Version:             rev. 1.0, 2021-03-16\r\n**     Build:               b240723\r\n**\r\n**     Abstract:\r\n**         Chip specific module features.\r\n**\r\n**     Copyright 2016 Freescale Semiconductor, Inc.\r\n**     Copyright 2016-2024 NXP\r\n**     SPDX-License-Identifier: BSD-3-Clause\r\n**\r\n**     http:                 www.nxp.com\r\n**     mail:                 support@nxp.com\r\n**\r\n**     Revisions:\r\n**     - rev. 1.0 (2021-03-16)\r\n**         Initial version.\r\n**\r\n** ###################################################################\r\n*/\r\n\r\n#ifndef _RW612_FEATURES_H_\r\n#define _RW612_FEATURES_H_\r\n\r\n/* SOC module features */\r\n\r\n/* @brief ACOMP availability on the SoC. */\r\n#define FSL_FEATURE_SOC_ACOMP_COUNT (1)\r\n/* @brief ADC availability on the SoC. */\r\n#define FSL_FEATURE_SOC_ADC_COUNT (2)\r\n/* @brief AON_SOC_CIU availability on the SoC. */\r\n#define FSL_FEATURE_SOC_AON_SOC_CIU_COUNT (1)\r\n/* @brief APU availability on the SoC. */\r\n#define FSL_FEATURE_SOC_APU_COUNT (2)\r\n/* @brief BG availability on the SoC. */\r\n#define FSL_FEATURE_SOC_BG_COUNT (1)\r\n/* @brief BLEAPU availability on the SoC. */\r\n#define FSL_FEATURE_SOC_BLEAPU_COUNT (1)\r\n/* @brief BUCK11 availability on the SoC. */\r\n#define FSL_FEATURE_SOC_BUCK11_COUNT (1)\r\n/* @brief BUCK18 availability on the SoC. */\r\n#define FSL_FEATURE_SOC_BUCK18_COUNT (1)\r\n/* @brief CACHE64_CTRL availability on the SoC. */\r\n#define FSL_FEATURE_SOC_CACHE64_CTRL_COUNT (2)\r\n/* @brief CACHE64_POLSEL availability on the SoC. */\r\n#define FSL_FEATURE_SOC_CACHE64_POLSEL_COUNT (2)\r\n/* @brief CAU availability on the SoC. */\r\n#define FSL_FEATURE_SOC_CAU_COUNT (1)\r\n/* @brief CDOG availability on the SoC. */\r\n#define FSL_FEATURE_SOC_CDOG_COUNT (1)\r\n/* @brief CIU1 availability on the SoC. */\r\n#define FSL_FEATURE_SOC_CIU1_COUNT (1)\r\n/* @brief CIU2 availability on the SoC. */\r\n#define FSL_FEATURE_SOC_CIU2_COUNT (1)\r\n/* @brief CLKCTL0 availability on the SoC. */\r\n#define FSL_FEATURE_SOC_CLKCTL0_COUNT (1)\r\n/* @brief CLKCTL1 availability on the SoC. */\r\n#define FSL_FEATURE_SOC_CLKCTL1_COUNT (1)\r\n/* @brief CRC availability on the SoC. */\r\n#define FSL_FEATURE_SOC_CRC_COUNT (1)\r\n/* @brief CTIMER availability on the SoC. */\r\n#define FSL_FEATURE_SOC_CTIMER_COUNT (4)\r\n/* @brief DAC availability on the SoC. */\r\n#define FSL_FEATURE_SOC_DAC_COUNT (1)\r\n/* @brief DMA availability on the SoC. */\r\n#define FSL_FEATURE_SOC_DMA_COUNT (2)\r\n/* @brief DMIC availability on the SoC. */\r\n#define FSL_FEATURE_SOC_DMIC_COUNT (1)\r\n/* @brief ELS availability on the SoC. */\r\n#define FSL_FEATURE_SOC_ELS_COUNT (1)\r\n/* @brief ENET availability on the SoC. */\r\n#define FSL_FEATURE_SOC_ENET_COUNT (1)\r\n/* @brief FLEXCOMM availability on the SoC. */\r\n#define FSL_FEATURE_SOC_FLEXCOMM_COUNT (5)\r\n/* @brief FLEXSPI availability on the SoC. */\r\n#define FSL_FEATURE_SOC_FLEXSPI_COUNT (1)\r\n/* @brief FREQME availability on the SoC. */\r\n#define FSL_FEATURE_SOC_FREQME_COUNT (1)\r\n/* @brief GDMA availability on the SoC. */\r\n#define FSL_FEATURE_SOC_GDMA_COUNT (1)\r\n/* @brief GPIO availability on the SoC. */\r\n#define FSL_FEATURE_SOC_GPIO_COUNT (2)\r\n/* @brief I2C availability on the SoC. */\r\n#define FSL_FEATURE_SOC_I2C_COUNT (5)\r\n/* @brief I2S availability on the SoC. */\r\n#define FSL_FEATURE_SOC_I2S_COUNT (5)\r\n/* @brief INPUTMUX availability on the SoC. */\r\n#define FSL_FEATURE_SOC_INPUTMUX_COUNT (1)\r\n/* @brief ITRC availability on the SoC. */\r\n#define FSL_FEATURE_SOC_ITRC_COUNT (1)\r\n/* @brief LCDIC availability on the SoC. */\r\n#define FSL_FEATURE_SOC_LCDIC_COUNT (1)\r\n/* @brief MCI_IO_MUX availability on the SoC. */\r\n#define FSL_FEATURE_SOC_MCI_IO_MUX_COUNT (1)\r\n/* @brief MRT availability on the SoC. */\r\n#define FSL_FEATURE_SOC_MRT_COUNT (2)\r\n/* @brief OCOTP availability on the SoC. */\r\n#define FSL_FEATURE_SOC_OCOTP_COUNT (1)\r\n/* @brief OSTIMER availability on the SoC. */\r\n#define FSL_FEATURE_SOC_OSTIMER_COUNT (1)\r\n/* @brief PINT availability on the SoC. */\r\n#define FSL_FEATURE_SOC_PINT_COUNT (1)\r\n/* @brief PKC availability on the SoC. */\r\n#define FSL_FEATURE_SOC_PKC_COUNT (1)\r\n/* @brief POWERQUAD availability on the SoC. */\r\n#define FSL_FEATURE_SOC_POWERQUAD_COUNT (1)\r\n/* @brief PUF availability on the SoC. */\r\n#define FSL_FEATURE_SOC_PUF_COUNT (1)\r\n/* @brief RF_SYSCON availability on the SoC. */\r\n#define FSL_FEATURE_SOC_RF_SYSCON_COUNT (1)\r\n/* @brief ROMC availability on the SoC. */\r\n#define FSL_FEATURE_SOC_ROMC_COUNT (1)\r\n/* @brief RSTCTL0 availability on the SoC. */\r\n#define FSL_FEATURE_SOC_RSTCTL0_COUNT (1)\r\n/* @brief RSTCTL1 availability on the SoC. */\r\n#define FSL_FEATURE_SOC_RSTCTL1_COUNT (1)\r\n/* @brief RTC availability on the SoC. */\r\n#define FSL_FEATURE_SOC_RTC_COUNT (1)\r\n/* @brief SCT availability on the SoC. */\r\n#define FSL_FEATURE_SOC_SCT_COUNT (1)\r\n/* @brief SPI availability on the SoC. */\r\n#define FSL_FEATURE_SOC_SPI_COUNT (5)\r\n/* @brief SYSCTL0 availability on the SoC. */\r\n#define FSL_FEATURE_SOC_SYSCTL0_COUNT (1)\r\n/* @brief SYSCTL1 availability on the SoC. */\r\n#define FSL_FEATURE_SOC_SYSCTL1_COUNT (1)\r\n/* @brief SYSCTL2 availability on the SoC. */\r\n#define FSL_FEATURE_SOC_SYSCTL2_COUNT (1)\r\n/* @brief SYSPLL_T3 availability on the SoC. */\r\n#define FSL_FEATURE_SOC_SYSPLL_T3_COUNT (1)\r\n/* @brief SYSPLL_TCPU availability on the SoC. */\r\n#define FSL_FEATURE_SOC_SYSPLL_TCPU_COUNT (1)\r\n/* @brief SOC_OTP_CTRL availability on the SoC. */\r\n#define FSL_FEATURE_SOC_SOC_OTP_CTRL_COUNT (1)\r\n/* @brief SENSOR_CTRL availability on the SoC. */\r\n#define FSL_FEATURE_SOC_SENSOR_CTRL_COUNT (1)\r\n/* @brief SDU_FN0_CARD availability on the SoC. */\r\n#define FSL_FEATURE_SOC_SDU_FN0_CARD_COUNT (1)\r\n/* @brief SDU_FBR_CARD availability on the SoC. */\r\n#define FSL_FEATURE_SOC_SDU_FBR_CARD_COUNT (1)\r\n/* @brief SDU_FN_CARD availability on the SoC. */\r\n#define FSL_FEATURE_SOC_SDU_FN_CARD_COUNT (1)\r\n/* @brief TRNG availability on the SoC. */\r\n#define FSL_FEATURE_SOC_TRNG_COUNT (1)\r\n/* @brief USART availability on the SoC. */\r\n#define FSL_FEATURE_SOC_USART_COUNT (5)\r\n/* @brief USB availability on the SoC. */\r\n#define FSL_FEATURE_SOC_USB_COUNT (1)\r\n/* @brief USIM availability on the SoC. */\r\n#define FSL_FEATURE_SOC_USIM_COUNT (1)\r\n/* @brief UTICK availability on the SoC. */\r\n#define FSL_FEATURE_SOC_UTICK_COUNT (1)\r\n/* @brief WLAPU availability on the SoC. */\r\n#define FSL_FEATURE_SOC_WLAPU_COUNT (1)\r\n/* @brief WWDT availability on the SoC. */\r\n#define FSL_FEATURE_SOC_WWDT_COUNT (1)\r\n\r\n/* CACHE64_CTRL module features */\r\n\r\n/* @brief Cache Line size in byte. */\r\n#define FSL_FEATURE_CACHE64_CTRL_LINESIZE_BYTE (32)\r\n\r\n/* CACHE64_POLSEL module features */\r\n\r\n/* No feature definitions */\r\n\r\n/* CDOG module features */\r\n\r\n/* @brief CDOG Has No Reset */\r\n#define FSL_FEATURE_CDOG_HAS_NO_RESET (1)\r\n/* @brief CDOG Load default configurations during init function */\r\n#define FSL_FEATURE_CDOG_NEED_LOAD_DEFAULT_CONF (1)\r\n\r\n/* CRC module features */\r\n\r\n/* @brief Has data register with name CRC */\r\n#define FSL_FEATURE_CRC_HAS_CRC_REG (0)\r\n\r\n/* CTIMER module features */\r\n\r\n/* @brief CTIMER has no capture channel. */\r\n#define FSL_FEATURE_CTIMER_HAS_NO_INPUT_CAPTURE (0)\r\n/* @brief CTIMER has no capture 2 interrupt. */\r\n#define FSL_FEATURE_CTIMER_HAS_NO_IR_CR2INT (0)\r\n/* @brief CTIMER capture 3 interrupt. */\r\n#define FSL_FEATURE_CTIMER_HAS_IR_CR3INT (1)\r\n/* @brief Has CTIMER CCR_CAP2 (register bits CCR[CAP2RE][CAP2FE][CAP2I]. */\r\n#define FSL_FEATURE_CTIMER_HAS_NO_CCR_CAP2 (0)\r\n/* @brief Has CTIMER CCR_CAP3 (register bits CCR[CAP3RE][CAP3FE][CAP3I]). */\r\n#define FSL_FEATURE_CTIMER_HAS_CCR_CAP3 (1)\r\n/* @brief CTIMER Has register MSR */\r\n#define FSL_FEATURE_CTIMER_HAS_MSR (1)\r\n\r\n/* DMA module features */\r\n\r\n/* @brief Number of channels */\r\n#define FSL_FEATURE_DMA_NUMBER_OF_CHANNELSn(x) (33)\r\n/* @brief Number of all DMA channels */\r\n#define FSL_FEATURE_DMA_ALL_CHANNELS (66)\r\n/* @brief Max Number of DMA channels */\r\n#define FSL_FEATURE_DMA_MAX_CHANNELS (33)\r\n/* @brief Align size of DMA descriptor */\r\n#define FSL_FEATURE_DMA_DESCRIPTOR_ALIGN_SIZE (1024)\r\n/* @brief DMA head link descriptor table align size */\r\n#define FSL_FEATURE_DMA_LINK_DESCRIPTOR_ALIGN_SIZE (16U)\r\n\r\n/* DMIC module features */\r\n\r\n/* @brief Number of channels */\r\n#define FSL_FEATURE_DMIC_CHANNEL_NUM (4)\r\n/* @brief DMIC channel support stereo data */\r\n#define FSL_FEATURE_DMIC_IO_HAS_STEREO_2_4_6 (1)\r\n/* @brief DMIC does not support bypass channel clock */\r\n#define FSL_FEATURE_DMIC_IO_HAS_NO_BYPASS (1)\r\n/* @brief DMIC channel FIFO register support sign extended */\r\n#define FSL_FEATURE_DMIC_CHANNEL_HAS_SIGNEXTEND (1)\r\n/* @brief DMIC has no IOCFG register */\r\n#define FSL_FEATURE_DMIC_HAS_NO_IOCFG (1)\r\n/* @brief DMIC has decimator reset function */\r\n#define FSL_FEATURE_DMIC_HAS_DECIMATOR_RESET_FUNC (1)\r\n/* @brief DMIC has global channel synchronization function */\r\n#define FSL_FEATURE_DMIC_HAS_GLOBAL_SYNC_FUNC (0)\r\n\r\n/* ENET module features */\r\n\r\n/* @brief Support Interrupt Coalesce */\r\n#define FSL_FEATURE_ENET_HAS_INTERRUPT_COALESCE (1)\r\n/* @brief Queue Size. */\r\n#define FSL_FEATURE_ENET_QUEUE (1)\r\n/* @brief Has AVB Support. */\r\n#define FSL_FEATURE_ENET_HAS_AVB (0)\r\n/* @brief Has Timer Pulse Width control. */\r\n#define FSL_FEATURE_ENET_HAS_TIMER_PWCONTROL (1)\r\n/* @brief Has Extend MDIO Support. */\r\n#define FSL_FEATURE_ENET_HAS_EXTEND_MDIO (1)\r\n/* @brief Has Additional 1588 Timer Channel Interrupt. */\r\n#define FSL_FEATURE_ENET_HAS_ADD_1588_TIMER_CHN_INT (0)\r\n/* @brief Support Interrupt Coalesce for each instance */\r\n#define FSL_FEATURE_ENET_INSTANCE_HAS_INTERRUPT_COALESCEn(x) (0)\r\n/* @brief Queue Size for each instance. */\r\n#define FSL_FEATURE_ENET_INSTANCE_QUEUEn(x) (1)\r\n/* @brief Has AVB Support for each instance. */\r\n#define FSL_FEATURE_ENET_INSTANCE_HAS_AVBn(x) (0)\r\n/* @brief Has Timer Pulse Width control for each instance. */\r\n#define FSL_FEATURE_ENET_INSTANCE_HAS_TIMER_PWCONTROLn(x) (1)\r\n/* @brief Has Extend MDIO Support for each instance. */\r\n#define FSL_FEATURE_ENET_INSTANCE_HAS_EXTEND_MDIOn(x) (1)\r\n/* @brief Has Additional 1588 Timer Channel Interrupt for each instance. */\r\n#define FSL_FEATURE_ENET_INSTANCE_HAS_ADD_1588_TIMER_CHN_INTn(x) (0)\r\n/* @brief Has threshold for the number of frames in the receive FIFO (register bit field RSEM[STAT_SECTION_EMPTY]). */\r\n#define FSL_FEATURE_ENET_HAS_RECEIVE_STATUS_THRESHOLD (1)\r\n/* @brief Has trasfer clock delay (register bit field ECR[TXC_DLY]). */\r\n#define FSL_FEATURE_ENET_HAS_RGMII_TXC_DELAY (0)\r\n/* @brief Has receive clock delay (register bit field ECR[RXC_DLY]). */\r\n#define FSL_FEATURE_ENET_HAS_RGMII_RXC_DELAY (0)\r\n/* @brief ENET Has Extra Clock Gate.(RW610). */\r\n#define FSL_FEATURE_ENET_HAS_EXTRA_CLOCK_GATE (1)\r\n/* @brief ENET support reset. */\r\n#define FSL_FEATURE_ENET_HAS_RSTCTL (1)\r\n\r\n/* FLEXCOMM module features */\r\n\r\n/* @brief FLEXCOMM0 USART INDEX 0 */\r\n#define FSL_FEATURE_FLEXCOMM0_USART_INDEX (0)\r\n/* @brief FLEXCOMM0 SPI INDEX 0 */\r\n#define FSL_FEATURE_FLEXCOMM0_SPI_INDEX (0)\r\n/* @brief FLEXCOMM0 I2C INDEX 0 */\r\n#define FSL_FEATURE_FLEXCOMM0_I2C_INDEX (0)\r\n/* @brief FLEXCOMM0 I2S INDEX 0 */\r\n#define FSL_FEATURE_FLEXCOMM0_I2S_INDEX (0)\r\n/* @brief FLEXCOMM1 USART INDEX 1 */\r\n#define FSL_FEATURE_FLEXCOMM1_USART_INDEX (1)\r\n/* @brief FLEXCOMM1 SPI INDEX 1 */\r\n#define FSL_FEATURE_FLEXCOMM1_SPI_INDEX (1)\r\n/* @brief FLEXCOMM1 I2C INDEX 1 */\r\n#define FSL_FEATURE_FLEXCOMM1_I2C_INDEX (1)\r\n/* @brief FLEXCOMM1 I2S INDEX 1 */\r\n#define FSL_FEATURE_FLEXCOMM1_I2S_INDEX (1)\r\n/* @brief FLEXCOMM2 USART INDEX 2 */\r\n#define FSL_FEATURE_FLEXCOMM2_USART_INDEX (2)\r\n/* @brief FLEXCOMM2 SPI INDEX 2 */\r\n#define FSL_FEATURE_FLEXCOMM2_SPI_INDEX (2)\r\n/* @brief FLEXCOMM2 I2C INDEX 2 */\r\n#define FSL_FEATURE_FLEXCOMM2_I2C_INDEX (2)\r\n/* @brief FLEXCOMM2 I2S INDEX 2 */\r\n#define FSL_FEATURE_FLEXCOMM2_I2S_INDEX (2)\r\n/* @brief FLEXCOMM3 USART INDEX 3 */\r\n#define FSL_FEATURE_FLEXCOMM3_USART_INDEX (3)\r\n/* @brief FLEXCOMM3 SPI INDEX 3 */\r\n#define FSL_FEATURE_FLEXCOMM3_SPI_INDEX (3)\r\n/* @brief FLEXCOMM3 I2C INDEX 3 */\r\n#define FSL_FEATURE_FLEXCOMM3_I2C_INDEX (3)\r\n/* @brief FLEXCOMM3 I2S INDEX 3 */\r\n#define FSL_FEATURE_FLEXCOMM3_I2S_INDEX (3)\r\n/* @brief FLEXCOMM14 USART INDEX 14 */\r\n#define FSL_FEATURE_FLEXCOMM14_USART_INDEX (14)\r\n/* @brief FLEXCOMM14 SPI(HS_SPI) INDEX 14 */\r\n#define FSL_FEATURE_FLEXCOMM14_SPI_INDEX (14)\r\n/* @brief FLEXCOMM14 I2C INDEX 14 */\r\n#define FSL_FEATURE_FLEXCOMM14_I2C_INDEX (14)\r\n/* @brief FLEXCOMM14 I2S INDEX 14 */\r\n#define FSL_FEATURE_FLEXCOMM14_I2S_INDEX (14)\r\n/* @brief I2S has DMIC interconnection */\r\n#define FSL_FEATURE_FLEXCOMM_INSTANCE_I2S_HAS_DMIC_INTERCONNECTIONn(x) \\\r\n    (((x) == FLEXCOMM0) ? (1) : \\\r\n    (((x) == FLEXCOMM1) ? (0) : \\\r\n    (((x) == FLEXCOMM2) ? (0) : \\\r\n    (((x) == FLEXCOMM3) ? (0) : \\\r\n    (((x) == FLEXCOMM14) ? (0) : (-1))))))\r\n\r\n/* FLEXSPI module features */\r\n\r\n/* @brief FlexSPI AHB buffer count */\r\n#define FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNTn(x) (8)\r\n/* @brief FlexSPI has no MCR0 ARDFEN bit */\r\n#define FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ARDFEN (0)\r\n/* @brief FlexSPI has no MCR0 ATDFEN bit */\r\n#define FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ATDFEN (0)\r\n/* @brief FlexSPI has no IP parallel mode */\r\n#define FSL_FEATURE_FLEXSPI_HAS_NO_IP_PARALLEL_MODE (1)\r\n/* @brief FlexSPI has no AHB parallel mode */\r\n#define FSL_FEATURE_FLEXSPI_HAS_NO_AHB_PARALLEL_MODE (1)\r\n/* @brief FlexSPI support address shift */\r\n#define FSL_FEATURE_FLEXSPI_SUPPORT_ADDRESS_SHIFT (1)\r\n/* @brief FlexSPI support sample clock source selection */\r\n#define FSL_FEATURE_FLEXSPI_SUPPORT_SEPERATE_RXCLKSRC_PORTB (1)\r\n/* @brief FlexSPI support sample clock source or source_b selection */\r\n#define FSL_FEATURE_FLEXSPI_SUPPORT_RXCLKSRC_DIFF (1)\r\n/* @brief FlexSPI AHB RX buffer size (byte) */\r\n#define FSL_FEATURE_FLEXSPI_AHB_RX_BUFFER_SIZEn(x) (2048)\r\n/* @brief FlexSPI IPED REGION COUNT */\r\n#define FSL_FEATURE_FLEXSPI_IPED_REGION_COUNT (15)\r\n\r\n/* ADC module features */\r\n\r\n/* @brief Whether ADC has the single-end mode temp channel */\r\n#define FSL_FEATURE_ADC_HAS_NO_SINGLEEND_TEMP_CHANNEL (1)\r\n/* @brief Whether ADC has the differential mode voice channel */\r\n#define FSL_FEATURE_ADC_HAS_NO_DIFFERENTIAL_VOICE_CHANNEL (1)\r\n/* @brief Whether ADC has the differential mode temp channel */\r\n#define FSL_FEATURE_ADC_HAS_NO_DIFFERENTIAL_TEMP_CHANNEL (1)\r\n\r\n/* GDMA module features */\r\n\r\n/* @brief GDMA Channel Number */\r\n#define FSL_FEATURE_GDMA_CHANNEL_NUM (4)\r\n\r\n/* GPIO module features */\r\n\r\n/* @brief GPIO has interrupts */\r\n#define FSL_FEATURE_GPIO_HAS_INTERRUPT (1)\r\n\r\n/* I2S module features */\r\n\r\n/* @brief I2S support dual channel transfer. */\r\n#define FSL_FEATURE_I2S_SUPPORT_SECONDARY_CHANNEL (1)\r\n/* @brief I2S has DMIC interconnection. */\r\n#define FSL_FEATURE_FLEXCOMM_I2S_HAS_DMIC_INTERCONNECTION (1)\r\n\r\n/* INPUTMUX module features */\r\n\r\n/* @brief Inputmux has DMA Request Enable */\r\n#define FSL_FEATURE_INPUTMUX_HAS_SIGNAL_ENA (1)\r\n/* @brief Inputmux has channel mux control */\r\n#define FSL_FEATURE_INPUTMUX_HAS_CHANNEL_MUX (0)\r\n\r\n/* MEMORY module features */\r\n\r\n/* @brief Memory map has offset between subsystems. */\r\n#define FSL_FEATURE_MEMORY_HAS_ADDRESS_OFFSET (1)\r\n\r\n/* MRT module features */\r\n\r\n/* @brief number of channels. */\r\n#define FSL_FEATURE_MRT_NUMBER_OF_CHANNELS (4)\r\n\r\n/* OSTIMER module features */\r\n\r\n/* @brief Has no OS Timer control register in PMC */\r\n#define FSL_FEATURE_PMC_HAS_NO_OSTIMER_REG (1)\r\n\r\n/* PINT module features */\r\n\r\n/* @brief Number of connected outputs */\r\n#define FSL_FEATURE_PINT_NUMBER_OF_CONNECTED_OUTPUTS (8)\r\n\r\n/* POWERLIB module features */\r\n\r\n/* @brief Powerlib API is different with other LPC series devices. */\r\n#define FSL_FEATURE_POWERLIB_EXTEND (1)\r\n\r\n/* RTC module features */\r\n\r\n/* @brief RTC has no reset control */\r\n#define FSL_FEATURE_RTC_HAS_NO_RESET (1)\r\n/* @brief Has SUBSEC Register (register SUBSEC) */\r\n#define FSL_FEATURE_RTC_HAS_SUBSEC (1)\r\n\r\n/* SCT module features */\r\n\r\n/* @brief Number of events */\r\n#define FSL_FEATURE_SCT_NUMBER_OF_EVENTS (16)\r\n/* @brief Number of states */\r\n#define FSL_FEATURE_SCT_NUMBER_OF_STATES (32)\r\n/* @brief Number of match capture */\r\n#define FSL_FEATURE_SCT_NUMBER_OF_MATCH_CAPTURE (16)\r\n/* @brief Number of outputs */\r\n#define FSL_FEATURE_SCT_NUMBER_OF_OUTPUTS (10)\r\n\r\n/* SPI module features */\r\n\r\n/* @brief SSEL pin count. */\r\n#define FSL_FEATURE_SPI_SSEL_COUNT (4)\r\n\r\n/* TRNG module features */\r\n\r\n/* @brief TRNG does not support SCR4L. */\r\n#define FSL_FEATURE_TRNG_HAS_NO_TRNG_SCR4L (1)\r\n/* @brief TRNG does not support SCR5L. */\r\n#define FSL_FEATURE_TRNG_HAS_NO_TRNG_SCR5L (1)\r\n/* @brief TRNG does not support SCR6L. */\r\n#define FSL_FEATURE_TRNG_HAS_NO_TRNG_SCR6L (1)\r\n/* @brief TRNG does not support PKRMAX. */\r\n#define FSL_FEATURE_TRNG_HAS_NO_TRNG_PKRMAX (1)\r\n/* @brief TRNG does not support SAMP mode. */\r\n#define FSL_FEATURE_TRNG_HAS_NO_TRNG_MCTL_SAMP_MODE (1)\r\n/* @brief TRNG does not support ACC. */\r\n#define FSL_FEATURE_TRNG_HAS_NO_TRNG_ACC (1)\r\n/* @brief TRNG does not support SBLIM. */\r\n#define FSL_FEATURE_TRNG_HAS_NO_TRNG_SBLIM (1)\r\n/* @brief TRNG supports reset control. */\r\n#define FSL_FEATURE_TRNG_HAS_RSTCTL (1)\r\n/* @brief TRNG supports dual oscillator mode. */\r\n#define FSL_FEATURE_TRNG_HAS_DUAL_OSCILATORS (1)\r\n/* @brief TRNG supports control pin. */\r\n#define FSL_FEATURE_TRNG_HAS_CTRL_PIN (1)\r\n\r\n/* USB module features */\r\n\r\n/* @brief USBC Atlantic Controller support on the SoC. */\r\n#define FSL_FEATURE_USB_ATLANTIC_EHCI_SUPPORT (1)\r\n\r\n/* USIM module features */\r\n\r\n/* @brief USIM Tx/Rx FIFO size in byte. */\r\n#define FSL_FEATURE_USIM_FIFO_DEPTH (16)\r\n\r\n/* UTICK module features */\r\n\r\n/* @brief UTICK does not support power down configure. */\r\n#define FSL_FEATURE_UTICK_HAS_NO_PDCFG (1)\r\n\r\n/* WWDT module features */\r\n\r\n/* @brief WWDT does not support oscillator lock. */\r\n#define FSL_FEATURE_WWDT_HAS_NO_OSCILLATOR_LOCK (0)\r\n/* @brief WWDT does not support power down configure. */\r\n#define FSL_FEATURE_WWDT_HAS_NO_PDCFG (1)\r\n\r\n#endif /* _RW612_FEATURES_H_ */\r\n\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/device/fsl_device_registers.h",
    "content": "/*\r\n * Copyright 2014-2016 Freescale Semiconductor, Inc.\r\n * Copyright 2016-2023 NXP\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n *\r\n */\r\n\r\n#ifndef __FSL_DEVICE_REGISTERS_H__\r\n#define __FSL_DEVICE_REGISTERS_H__\r\n\r\n/*\r\n * Include the cpu specific register header files.\r\n *\r\n * The CPU macro should be declared in the project or makefile.\r\n */\r\n#if (defined(CPU_RW612ETA2I) || defined(CPU_RW612HNA2I) || defined(CPU_RW612UKA2I))\r\n\r\n#define RW612_SERIES\r\n\r\n/* CMSIS-style register definitions */\r\n#include \"RW612.h\"\r\n/* CPU specific feature definitions */\r\n#include \"RW612_features.h\"\r\n\r\n#else\r\n    #error \"No valid CPU defined!\"\r\n#endif\r\n\r\n#endif /* __FSL_DEVICE_REGISTERS_H__ */\r\n\r\n/*******************************************************************************\r\n * EOF\r\n ******************************************************************************/\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/device/system_RW612.c",
    "content": "/*\r\n** ###################################################################\r\n**     Processors:          RW612ETA2I\r\n**                          RW612HNA2I\r\n**                          RW612UKA2I\r\n**\r\n**     Compilers:           GNU C Compiler\r\n**                          IAR ANSI C/C++ Compiler for ARM\r\n**                          Keil ARM C/C++ Compiler\r\n**                          MCUXpresso Compiler\r\n**\r\n**     Reference manual:    RW61X User manual Rev. 0.95, June 2022\r\n**     Version:             rev. 1.0, 2021-03-16\r\n**     Build:               b231201\r\n**\r\n**     Abstract:\r\n**         Provides a system configuration function and a global variable that\r\n**         contains the system frequency. It configures the device and initializes\r\n**         the oscillator (PLL) that is part of the microcontroller device.\r\n**\r\n**     Copyright 2016 Freescale Semiconductor, Inc.\r\n**     Copyright 2016-2023 NXP\r\n**     SPDX-License-Identifier: BSD-3-Clause\r\n**\r\n**     http:                 www.nxp.com\r\n**     mail:                 support@nxp.com\r\n**\r\n**     Revisions:\r\n**     - rev. 1.0 (2021-03-16)\r\n**         Initial version.\r\n**\r\n** ###################################################################\r\n*/\r\n\r\n/*!\r\n * @file RW612\r\n * @version 1.0\r\n * @date 2023-12-01\r\n * @brief Device specific configuration file for RW612 (implementation file)\r\n *\r\n * Provides a system configuration function and a global variable that contains\r\n * the system frequency. It configures the device and initializes the oscillator\r\n * (PLL) that is part of the microcontroller device.\r\n */\r\n\r\n#include <stdint.h>\r\n#include \"fsl_device_registers.h\"\r\n\r\n#define SYSTEM_IS_XIP_FLEXSPI()                                                                               \\\r\n    ((((uint32_t)SystemCoreClockUpdate >= 0x08000000U) && ((uint32_t)SystemCoreClockUpdate < 0x10000000U)) || \\\r\n     (((uint32_t)SystemCoreClockUpdate >= 0x18000000U) && ((uint32_t)SystemCoreClockUpdate < 0x20000000U)))\r\n\r\n#define CLOCK_KHZ(freq) ((freq)*1000UL)\r\n#define CLOCK_MHZ(freq) (CLOCK_KHZ(freq) * 1000UL)\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- Core clock\r\n   ---------------------------------------------------------------------------- */\r\n\r\nuint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK;\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SystemInit()\r\n   ---------------------------------------------------------------------------- */\r\n\r\n__attribute__((weak)) void SystemInit(void)\r\n{\r\n#if ((__FPU_PRESENT == 1) && (__FPU_USED == 1))\r\n    SCB->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); /* set CP10, CP11 Full Access in Secure mode */\r\n#if defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\r\n    SCB_NS->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); /* set CP10, CP11 Full Access in Non-secure mode */\r\n#endif                                                    /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\r\n#endif                                                    /* ((__FPU_PRESENT == 1) && (__FPU_USED == 1)) */\r\n\r\n    SCB->CPACR |= ((3UL << 0 * 2) | (3UL << 1 * 2)); /* set CP0, CP1 Full Access in Secure mode (enable PowerQuad) */\r\n\r\n#if defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)\r\n    SCB_NS->CPACR |=\r\n        ((3UL << 0 * 2) | (3UL << 1 * 2)); /* set CP0, CP1 Full Access in Non-secure mode (enable PowerQuad) */\r\n#endif                                     /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */\r\n\r\n    SCB->NSACR |= ((3UL << 0) | (3UL << 10)); /* enable CP0, CP1, CP10, CP11 Non-secure Access */\r\n\r\n    if (SYSTEM_IS_XIP_FLEXSPI() && (CACHE64_POLSEL0->POLSEL == 0U)) /* Enable cache to accelerate boot. */\r\n    {\r\n        /* set command to invalidate all ways and write GO bit to initiate command */\r\n        CACHE64_CTRL0->CCR = CACHE64_CTRL_CCR_INVW1_MASK | CACHE64_CTRL_CCR_INVW0_MASK;\r\n        CACHE64_CTRL0->CCR |= CACHE64_CTRL_CCR_GO_MASK;\r\n        /* Wait until the command completes */\r\n        while ((CACHE64_CTRL0->CCR & CACHE64_CTRL_CCR_GO_MASK) != 0U)\r\n        {\r\n        }\r\n        /* Enable cache, enable write buffer */\r\n        CACHE64_CTRL0->CCR = (CACHE64_CTRL_CCR_ENWRBUF_MASK | CACHE64_CTRL_CCR_ENCACHE_MASK);\r\n\r\n        /* Set whole FlexSPI0 space to write through. */\r\n        CACHE64_POLSEL0->REG0_TOP = 0x07FFFC00U;\r\n        CACHE64_POLSEL0->REG1_TOP = 0x0U;\r\n        CACHE64_POLSEL0->POLSEL   = 0x1U;\r\n\r\n        __ISB();\r\n        __DSB();\r\n    }\r\n\r\n    SystemInitHook();\r\n}\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SystemCoreClockUpdate()\r\n   ---------------------------------------------------------------------------- */\r\n\r\nstatic uint32_t getT3PllMciIrcClkFreq(void)\r\n{\r\n    uint32_t freq = 0U;\r\n\r\n    if ((SYSPLL_T3->CLKTREE_CTRL_SIX_REG & 0xFU) == 0x5U)\r\n    {\r\n        freq = CLOCK_MHZ(2560UL) / 43UL;\r\n    }\r\n    else if ((SYSPLL_T3->CLKTREE_CTRL_SIX_REG & 0xFU) == 0xAU)\r\n    {\r\n        freq = CLOCK_MHZ(2560UL) / 53UL;\r\n    }\r\n    else\r\n    {\r\n        /* Only 48MHz and 60MHz is allowed */\r\n    }\r\n\r\n    return freq;\r\n}\r\n\r\nstatic uint32_t getTcpuFvcoFreq(void)\r\n{\r\n    uint32_t freq = 0UL;\r\n    uint32_t steps;\r\n\r\n    steps = (SYSCTL2->PLL_CTRL & SYSCTL2_PLL_CTRL_TCPU_FBDIV_MASK) >> SYSCTL2_PLL_CTRL_TCPU_FBDIV_SHIFT;\r\n\r\n    if ((CLK_XTAL_OSC_CLK == CLK_XTAL_OSC_CLK_40000KHZ) && (steps >= 75UL) && (steps <= 96UL))\r\n    {\r\n        /* Fbdiv from 75 to 96, step 40MHz */\r\n        steps -= 75UL;\r\n        freq = CLOCK_MHZ(3000UL) + steps * CLOCK_MHZ(40UL);\r\n    }\r\n    else if ((CLK_XTAL_OSC_CLK == CLK_XTAL_OSC_CLK_38400KHZ) && (steps >= 78UL) && (steps <= 100UL))\r\n    {\r\n        /* Fbdiv from 78 to 100, step 38.4MHz */\r\n        steps -= 78UL;\r\n        freq = CLOCK_KHZ(2995200UL) + steps * CLOCK_KHZ(38400UL);\r\n    }\r\n    else\r\n    {\r\n        /* Not valid path */\r\n    }\r\n\r\n    return freq;\r\n}\r\n\r\nstatic uint32_t getT3PllMci256mClkFreq(void)\r\n{\r\n    uint32_t freq = CLOCK_MHZ(256UL);\r\n    return freq;\r\n}\r\n\r\nstatic uint32_t getTcpuMciClkFreq(void)\r\n{\r\n    uint32_t freq = getTcpuFvcoFreq() / 12UL;\r\n    return freq;\r\n}\r\n\r\nstatic uint32_t getSysOscFreq(void)\r\n{\r\n    return (CLKCTL0->SYSOSCBYPASS == 0U) ? CLK_XTAL_OSC_CLK : ((CLKCTL0->SYSOSCBYPASS == 1U) ? CLK_EXT_CLKIN : 0U);\r\n}\r\n\r\nstatic uint32_t getFFroFreq(void)\r\n{\r\n    return getT3PllMciIrcClkFreq();\r\n}\r\n\r\nstatic uint32_t getLpOscFreq(void)\r\n{\r\n    return CLK_XTAL_OSC_CLK / 40U;\r\n}\r\n\r\nstatic uint32_t getSFroFreq(void)\r\n{\r\n    return getT3PllMci256mClkFreq() / 16U;\r\n}\r\n\r\nstatic uint32_t getMainPllClkFreq(void)\r\n{\r\n    return getTcpuMciClkFreq() / ((CLKCTL0->MAINPLLCLKDIV & CLKCTL0_MAINPLLCLKDIV_DIV_MASK) + 1U);\r\n}\r\n\r\nvoid SystemCoreClockUpdate(void)\r\n{\r\n    uint32_t freq = 0U;\r\n\r\n    switch ((CLKCTL0->MAINCLKSELB) & CLKCTL0_MAINCLKSELB_SEL_MASK)\r\n    {\r\n        case CLKCTL0_MAINCLKSELB_SEL(0):\r\n            switch ((CLKCTL0->MAINCLKSELA) & CLKCTL0_MAINCLKSELA_SEL_MASK)\r\n            {\r\n                case CLKCTL0_MAINCLKSELA_SEL(0):\r\n                    freq = getSysOscFreq();\r\n                    break;\r\n                case CLKCTL0_MAINCLKSELA_SEL(1):\r\n                    freq = getFFroFreq() / 4U;\r\n                    break;\r\n                case CLKCTL0_MAINCLKSELA_SEL(2):\r\n                    freq = getLpOscFreq();\r\n                    break;\r\n                case CLKCTL0_MAINCLKSELA_SEL(3):\r\n                    freq = getFFroFreq();\r\n                    break;\r\n                default:\r\n                    freq = 0U;\r\n                    break;\r\n            }\r\n            break;\r\n\r\n        case CLKCTL0_MAINCLKSELB_SEL(1):\r\n            freq = getSFroFreq();\r\n            break;\r\n\r\n        case CLKCTL0_MAINCLKSELB_SEL(2):\r\n            freq = getMainPllClkFreq();\r\n            break;\r\n\r\n        case CLKCTL0_MAINCLKSELB_SEL(3):\r\n            freq = CLK_RTC_32K_CLK;\r\n            break;\r\n\r\n        default:\r\n            freq = 0U;\r\n            break;\r\n    }\r\n\r\n    SystemCoreClock = freq / ((CLKCTL0->SYSCPUAHBCLKDIV & CLKCTL0_SYSCPUAHBCLKDIV_DIV_MASK) + 1U);\r\n}\r\n\r\n/* ----------------------------------------------------------------------------\r\n   -- SystemInitHook()\r\n   ---------------------------------------------------------------------------- */\r\n\r\n__attribute__((weak)) void SystemInitHook(void)\r\n{\r\n    /* Void implementation of the weak function. */\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/device/system_RW612.h",
    "content": "/*\r\n** ###################################################################\r\n**     Processors:          RW612ETA2I\r\n**                          RW612HNA2I\r\n**                          RW612UKA2I\r\n**\r\n**     Compilers:           GNU C Compiler\r\n**                          IAR ANSI C/C++ Compiler for ARM\r\n**                          Keil ARM C/C++ Compiler\r\n**                          MCUXpresso Compiler\r\n**\r\n**     Reference manual:    RW61X User manual Rev. 0.95, June 2022\r\n**     Version:             rev. 1.0, 2021-03-16\r\n**     Build:               b231201\r\n**\r\n**     Abstract:\r\n**         Provides a system configuration function and a global variable that\r\n**         contains the system frequency. It configures the device and initializes\r\n**         the oscillator (PLL) that is part of the microcontroller device.\r\n**\r\n**     Copyright 2016 Freescale Semiconductor, Inc.\r\n**     Copyright 2016-2023 NXP\r\n**     SPDX-License-Identifier: BSD-3-Clause\r\n**\r\n**     http:                 www.nxp.com\r\n**     mail:                 support@nxp.com\r\n**\r\n**     Revisions:\r\n**     - rev. 1.0 (2021-03-16)\r\n**         Initial version.\r\n**\r\n** ###################################################################\r\n*/\r\n\r\n/*!\r\n * @file RW612\r\n * @version 1.0\r\n * @date 2023-12-01\r\n * @brief Device specific configuration file for RW612 (header file)\r\n *\r\n * Provides a system configuration function and a global variable that contains\r\n * the system frequency. It configures the device and initializes the oscillator\r\n * (PLL) that is part of the microcontroller device.\r\n */\r\n#ifndef _SYSTEM_RW612_H_\r\n#define _SYSTEM_RW612_H_                    /**< Symbol preventing repeated inclusion */\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n#include <stdint.h>\r\n\r\n#define CLK_XTAL_OSC_CLK_38400KHZ 38400000u /* XTAL OSC frequency 38.4MHz */\r\n#define CLK_XTAL_OSC_CLK_40000KHZ 40000000u /* XTAL OSC frequency 40MHz */\r\n\r\n#ifndef CLK_XTAL_OSC_CLK\r\n#define CLK_XTAL_OSC_CLK \\\r\n    (((AON_SOC_CIU->STRAP_RDBK & 0x20U) == 0U) ? CLK_XTAL_OSC_CLK_38400KHZ : CLK_XTAL_OSC_CLK_40000KHZ)\r\n#endif\r\n#define CLK_RTC_32K_CLK 32768u /* RTC oscillator 32 kHz (32k_clk) */\r\n#ifndef CLK_EXT_CLKIN\r\n#define CLK_EXT_CLKIN 0u /* Default external CLKIN pin clock */\r\n#endif\r\n#define DEFAULT_SYSTEM_CLOCK 260000000u /* Default System clock value */\r\n\r\n/**\r\n * @brief System clock frequency (core clock)\r\n *\r\n * The system clock frequency supplied to the SysTick timer and the processor\r\n * core clock. This variable can be used by the user application to setup the\r\n * SysTick timer or configure other parameters. It may also be used by debugger to\r\n * query the frequency of the debug timer or configure the trace clock speed\r\n * SystemCoreClock is initialized with a correct predefined value.\r\n */\r\nextern uint32_t SystemCoreClock;\r\n\r\n/**\r\n * @brief Setup the microcontroller system.\r\n *\r\n * Typically this function configures the oscillator (PLL) that is part of the\r\n * microcontroller device. For systems with variable clock speed it also updates\r\n * the variable SystemCoreClock. SystemInit is called from startup_device file.\r\n */\r\nvoid SystemInit(void);\r\n\r\n/**\r\n * @brief Updates the SystemCoreClock variable.\r\n *\r\n * It must be called whenever the core clock is changed during program\r\n * execution. SystemCoreClockUpdate() evaluates the clock register settings and calculates\r\n * the current core clock.\r\n */\r\nvoid SystemCoreClockUpdate(void);\r\n\r\n/**\r\n * @brief SystemInit function hook.\r\n *\r\n * This weak function allows to call specific initialization code during the\r\n * SystemInit() execution.This can be used when an application specific code needs\r\n * to be called as close to the reset entry as possible (for example the Multicore\r\n * Manager MCMGR_EarlyInit() function call).\r\n * NOTE: No global r/w variables can be used in this hook function because the\r\n * initialization of these variables happens after this function.\r\n */\r\nvoid SystemInitHook(void);\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* _SYSTEM_RW612_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/freertos/fsl_usart_freertos.c",
    "content": "/*\r\n * Copyright (c) 2016, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2024 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include \"fsl_usart_freertos.h\"\r\n#include <FreeRTOS.h>\r\n#include <event_groups.h>\r\n#include <semphr.h>\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/* Component ID definition, used by tools. */\r\n#ifndef FSL_COMPONENT_ID\r\n#define FSL_COMPONENT_ID \"platform.drivers.flexcomm_usart_freertos\"\r\n#endif\r\n\r\n/*******************************************************************************\r\n * Prototypes\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n * Variables\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n * Code\r\n ******************************************************************************/\r\n\r\nstatic void USART_RTOS_Callback(USART_Type *base, usart_handle_t *state, status_t status, void *param)\r\n{\r\n    usart_rtos_handle_t *handle = (usart_rtos_handle_t *)param;\r\n    BaseType_t xHigherPriorityTaskWoken, xResult;\r\n\r\n    xHigherPriorityTaskWoken = pdFALSE;\r\n    xResult                  = pdFAIL;\r\n\r\n    if (status == kStatus_USART_RxIdle)\r\n    {\r\n        xResult = xEventGroupSetBitsFromISR(handle->rxEvent, RTOS_USART_COMPLETE, &xHigherPriorityTaskWoken);\r\n    }\r\n    else if (status == kStatus_USART_TxIdle)\r\n    {\r\n        xResult = xEventGroupSetBitsFromISR(handle->txEvent, RTOS_USART_COMPLETE, &xHigherPriorityTaskWoken);\r\n    }\r\n    else if (status == kStatus_USART_RxRingBufferOverrun)\r\n    {\r\n        xResult = xEventGroupSetBitsFromISR(handle->rxEvent, RTOS_USART_RING_BUFFER_OVERRUN, &xHigherPriorityTaskWoken);\r\n    }\r\n    else\r\n    {\r\n        xResult = pdFAIL;\r\n    }\r\n\r\n    if (xResult != pdFAIL)\r\n    {\r\n        portYIELD_FROM_ISR(xHigherPriorityTaskWoken);\r\n    }\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : USART_RTOS_Init\r\n * Description   : Initializes the USART instance for application\r\n *\r\n *END**************************************************************************/\r\n/*!\r\n * brief Initializes a USART instance for operation in RTOS.\r\n *\r\n * param handle The RTOS USART handle, the pointer to allocated space for RTOS context.\r\n * param t_handle The pointer to allocated space where to store transactional layer internal state.\r\n * param cfg The pointer to the parameters required to configure the USART after initialization.\r\n * return kStatus_Success, others fail.\r\n */\r\nint USART_RTOS_Init(usart_rtos_handle_t *handle, usart_handle_t *t_handle, const struct rtos_usart_config *cfg)\r\n{\r\n    status_t status;\r\n    usart_config_t defcfg;\r\n\r\n    if (NULL == handle)\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n    if (NULL == t_handle)\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n    if (NULL == cfg)\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n    if (NULL == cfg->base)\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n    if (0U == cfg->srcclk)\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n    if (0U == cfg->baudrate)\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n\r\n    handle->base    = cfg->base;\r\n    handle->t_state = t_handle;\r\n\r\n#if (configSUPPORT_STATIC_ALLOCATION == 1)\r\n    handle->txSemaphore = xSemaphoreCreateMutexStatic(&handle->txSemaphoreBuffer);\r\n#else\r\n    handle->txSemaphore = xSemaphoreCreateMutex();\r\n#endif\r\n    if (NULL == handle->txSemaphore)\r\n    {\r\n        return kStatus_Fail;\r\n    }\r\n#if (configSUPPORT_STATIC_ALLOCATION == 1)\r\n    handle->rxSemaphore = xSemaphoreCreateMutexStatic(&handle->rxSemaphoreBuffer);\r\n#else\r\n    handle->rxSemaphore = xSemaphoreCreateMutex();\r\n#endif\r\n    if (NULL == handle->rxSemaphore)\r\n    {\r\n        vSemaphoreDelete(handle->txSemaphore);\r\n        return kStatus_Fail;\r\n    }\r\n\r\n#if (configSUPPORT_STATIC_ALLOCATION == 1)\r\n    handle->txEvent = xEventGroupCreateStatic(&handle->txEventBuffer);\r\n#else\r\n    handle->txEvent = xEventGroupCreate();\r\n#endif\r\n    if (NULL == handle->txEvent)\r\n    {\r\n        vSemaphoreDelete(handle->rxSemaphore);\r\n        vSemaphoreDelete(handle->txSemaphore);\r\n        return kStatus_Fail;\r\n    }\r\n#if (configSUPPORT_STATIC_ALLOCATION == 1)\r\n    handle->rxEvent = xEventGroupCreateStatic(&handle->rxEventBuffer);\r\n#else\r\n    handle->rxEvent = xEventGroupCreate();\r\n#endif\r\n    if (NULL == handle->rxEvent)\r\n    {\r\n        vEventGroupDelete(handle->txEvent);\r\n        vSemaphoreDelete(handle->rxSemaphore);\r\n        vSemaphoreDelete(handle->txSemaphore);\r\n        return kStatus_Fail;\r\n    }\r\n    USART_GetDefaultConfig(&defcfg);\r\n\r\n    defcfg.baudRate_Bps = cfg->baudrate;\r\n    defcfg.parityMode   = cfg->parity;\r\n    defcfg.enableTx     = true;\r\n    defcfg.enableRx     = true;\r\n    defcfg.enableHardwareFlowControl = cfg->enableHardwareFlowControl;\r\n\r\n    status = USART_Init(handle->base, &defcfg, cfg->srcclk);\r\n    if (status != kStatus_Success)\r\n    {\r\n        vEventGroupDelete(handle->rxEvent);\r\n        vEventGroupDelete(handle->txEvent);\r\n        vSemaphoreDelete(handle->rxSemaphore);\r\n        vSemaphoreDelete(handle->txSemaphore);\r\n        return kStatus_Fail;\r\n    }\r\n    status = USART_TransferCreateHandle(handle->base, handle->t_state, USART_RTOS_Callback, handle);\r\n    if (status != kStatus_Success)\r\n    {\r\n        vEventGroupDelete(handle->rxEvent);\r\n        vEventGroupDelete(handle->txEvent);\r\n        vSemaphoreDelete(handle->rxSemaphore);\r\n        vSemaphoreDelete(handle->txSemaphore);\r\n        return kStatus_Fail;\r\n    }\r\n    USART_TransferStartRingBuffer(handle->base, handle->t_state, cfg->buffer, cfg->buffer_size);\r\n    return kStatus_Success;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : USART_RTOS_Deinit\r\n * Description   : Deinitializes the USART instance and frees resources\r\n *\r\n *END**************************************************************************/\r\n/*!\r\n * brief Deinitializes a USART instance for operation.\r\n *\r\n * This function deinitializes the USART module, sets all register values to reset value,\r\n * and releases the resources.\r\n *\r\n * param handle The RTOS USART handle.\r\n */\r\nint USART_RTOS_Deinit(usart_rtos_handle_t *handle)\r\n{\r\n    USART_Deinit(handle->base);\r\n\r\n    vEventGroupDelete(handle->txEvent);\r\n    vEventGroupDelete(handle->rxEvent);\r\n\r\n    /* Give the semaphore. This is for functional safety */\r\n    (void)xSemaphoreGive(handle->txSemaphore);\r\n    (void)xSemaphoreGive(handle->rxSemaphore);\r\n\r\n    vSemaphoreDelete(handle->txSemaphore);\r\n    vSemaphoreDelete(handle->rxSemaphore);\r\n\r\n    /* Invalidate the handle */\r\n    handle->base    = NULL;\r\n    handle->t_state = NULL;\r\n\r\n    return kStatus_Success;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : USART_RTOS_Send\r\n * Description   : Initializes the USART instance for application\r\n *\r\n *END**************************************************************************/\r\n/*!\r\n * brief Sends data in the background.\r\n *\r\n * This function sends data. It is a synchronous API.\r\n * If the hardware buffer is full, the task is in the blocked state.\r\n *\r\n * param handle The RTOS USART handle.\r\n * param buffer The pointer to buffer to send.\r\n * param length The number of bytes to send.\r\n */\r\nint USART_RTOS_Send(usart_rtos_handle_t *handle, uint8_t *buffer, uint32_t length)\r\n{\r\n    EventBits_t ev;\r\n    int retval = kStatus_Success;\r\n    status_t status;\r\n\r\n    if (NULL == handle->base)\r\n    {\r\n        /* Invalid handle. */\r\n        return kStatus_Fail;\r\n    }\r\n    if (0U == length)\r\n    {\r\n        return kStatus_Success;\r\n    }\r\n    if (NULL == buffer)\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n\r\n    if (pdFALSE == xSemaphoreTake(handle->txSemaphore, 0))\r\n    {\r\n        /* We could not take the semaphore, exit with 0 data received */\r\n        return kStatus_Fail;\r\n    }\r\n\r\n    handle->txTransfer.data     = (uint8_t *)buffer;\r\n    handle->txTransfer.dataSize = (uint32_t)length;\r\n\r\n    /* Non-blocking call */\r\n    status = USART_TransferSendNonBlocking(handle->base, handle->t_state, &handle->txTransfer);\r\n    if (status != kStatus_Success)\r\n    {\r\n        (void)xSemaphoreGive(handle->txSemaphore);\r\n        return kStatus_Fail;\r\n    }\r\n\r\n    ev = xEventGroupWaitBits(handle->txEvent, RTOS_USART_COMPLETE, pdTRUE, pdFALSE, portMAX_DELAY);\r\n    if ((ev & RTOS_USART_COMPLETE) == 0U)\r\n    {\r\n        retval = kStatus_Fail;\r\n    }\r\n\r\n    if (pdFALSE == xSemaphoreGive(handle->txSemaphore))\r\n    {\r\n        /* We could not post the semaphore, exit with error */\r\n        retval = kStatus_Fail;\r\n    }\r\n\r\n    return retval;\r\n}\r\n\r\n/*FUNCTION**********************************************************************\r\n *\r\n * Function Name : USART_RTOS_Recv\r\n * Description   : Receives chars for the application\r\n *\r\n *END**************************************************************************/\r\n/*!\r\n * brief Receives data.\r\n *\r\n * This function receives data from USART. It is a synchronous API. If data is immediately available,\r\n * it is returned immediately and the number of bytes received.\r\n *\r\n * param handle The RTOS USART handle.\r\n * param buffer The pointer to buffer where to write received data.\r\n * param length The number of bytes to receive.\r\n * param received The pointer to a variable of size_t where the number of received data is filled.\r\n */\r\nint USART_RTOS_Receive(usart_rtos_handle_t *handle, uint8_t *buffer, uint32_t length, size_t *received)\r\n{\r\n    EventBits_t ev;\r\n    size_t n              = 0;\r\n    int retval            = kStatus_Fail;\r\n    size_t local_received = 0;\r\n    status_t status;\r\n\r\n    if (NULL == handle->base)\r\n    {\r\n        /* Invalid handle. */\r\n        return kStatus_Fail;\r\n    }\r\n    if (0U == length)\r\n    {\r\n        if (received != NULL)\r\n        {\r\n            *received = n;\r\n        }\r\n        return kStatus_Success;\r\n    }\r\n    if (NULL == buffer)\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n\r\n    /* New transfer can be performed only after current one is finished */\r\n    if (pdFALSE == xSemaphoreTake(handle->rxSemaphore, portMAX_DELAY))\r\n    {\r\n        /* We could not take the semaphore, exit with 0 data received */\r\n        return kStatus_Fail;\r\n    }\r\n\r\n    handle->rxTransfer.data     = buffer;\r\n    handle->rxTransfer.dataSize = (uint32_t)length;\r\n\r\n    /* Non-blocking call */\r\n    status = USART_TransferReceiveNonBlocking(handle->base, handle->t_state, &handle->rxTransfer, &n);\r\n    if (status != kStatus_Success)\r\n    {\r\n        (void)xSemaphoreGive(handle->rxSemaphore);\r\n        return kStatus_Fail;\r\n    }\r\n\r\n    ev = xEventGroupWaitBits(handle->rxEvent, RTOS_USART_COMPLETE | RTOS_USART_RING_BUFFER_OVERRUN, pdTRUE, pdFALSE,\r\n                             portMAX_DELAY);\r\n    if ((ev & RTOS_USART_RING_BUFFER_OVERRUN) != 0U)\r\n    {\r\n        /* Stop data transfer to application buffer, ring buffer is still active */\r\n        USART_TransferAbortReceive(handle->base, handle->t_state);\r\n        /* Prevent false indication of successful transfer in next call of USART_RTOS_Receive.\r\n           RTOS_USART_COMPLETE flag could be set meanwhile overrun is handled */\r\n        (void)xEventGroupClearBits(handle->rxEvent, RTOS_USART_COMPLETE);\r\n        retval         = kStatus_USART_RxRingBufferOverrun;\r\n        local_received = 0;\r\n    }\r\n    else if ((ev & RTOS_USART_COMPLETE) != 0U)\r\n    {\r\n        retval         = kStatus_Success;\r\n        local_received = length;\r\n    }\r\n    else\r\n    {\r\n        retval         = kStatus_USART_RxError;\r\n        local_received = 0;\r\n    }\r\n\r\n    /* Prevent repetitive NULL check */\r\n    if (received != NULL)\r\n    {\r\n        *received = local_received;\r\n    }\r\n\r\n    /* Enable next transfer. Current one is finished */\r\n    if (pdFALSE == xSemaphoreGive(handle->rxSemaphore))\r\n    {\r\n        /* We could not post the semaphore, exit with error */\r\n        retval = kStatus_Fail;\r\n    }\r\n    return retval;\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/freertos/fsl_usart_freertos.h",
    "content": "/*\r\n * Copyright (c) 2016, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2020 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n#ifndef __FSL_USART_FREERTOS_H__\r\n#define __FSL_USART_FREERTOS_H__\r\n\r\n#include \"fsl_usart.h\"\r\n#include <FreeRTOS.h>\r\n#include <event_groups.h>\r\n#include <semphr.h>\r\n\r\n/*!\r\n * @addtogroup usart_freertos_driver\r\n * @{\r\n */\r\n\r\n/*! @file*/\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*! @name Driver version */\r\n/*@{*/\r\n/*! @brief USART FreeRTOS driver version. */\r\n#define FSL_USART_FREERTOS_DRIVER_VERSION (MAKE_VERSION(2, 7, 0))\r\n/*@}*/\r\n\r\n/*! @brief FLEX USART configuration structure */\r\nstruct rtos_usart_config\r\n{\r\n    USART_Type *base;                /*!< USART base address */\r\n    uint32_t srcclk;                 /*!< USART source clock in Hz*/\r\n    uint32_t baudrate;               /*!< Desired communication speed */\r\n    usart_parity_mode_t parity;      /*!< Parity setting */\r\n    usart_stop_bit_count_t stopbits; /*!< Number of stop bits to use */\r\n    uint8_t *buffer;                 /*!< Buffer for background reception */\r\n    uint32_t buffer_size;            /*!< Size of buffer for background reception */\r\n    bool enableHardwareFlowControl;  /*!< Enable hardware control RTS/CTS */\r\n};\r\n\r\n/*! @brief FLEX USART FreeRTOS handle */\r\ntypedef struct _usart_rtos_handle\r\n{\r\n    USART_Type *base;              /*!< USART base address */\r\n    usart_transfer_t txTransfer;   /*!< TX transfer structure */\r\n    usart_transfer_t rxTransfer;   /*!< RX transfer structure */\r\n    SemaphoreHandle_t rxSemaphore; /*!< RX semaphore for resource sharing */\r\n    SemaphoreHandle_t txSemaphore; /*!< TX semaphore for resource sharing */\r\n#define RTOS_USART_COMPLETE                0x1U\r\n#define RTOS_USART_RING_BUFFER_OVERRUN     0x2U\r\n#define RTOS_USART_HARDWARE_BUFFER_OVERRUN 0x4U\r\n    EventGroupHandle_t rxEvent; /*!< RX completion event */\r\n    EventGroupHandle_t txEvent; /*!< TX completion event */\r\n    void *t_state;              /*!< Transactional state of the underlying driver */\r\n#if (configSUPPORT_STATIC_ALLOCATION == 1)\r\n    StaticSemaphore_t txSemaphoreBuffer; /*!< Statically allocated memory for txSemaphore */\r\n    StaticSemaphore_t rxSemaphoreBuffer; /*!< Statically allocated memory for rxSemaphore */\r\n    StaticEventGroup_t txEventBuffer;    /*!< Statically allocated memory for txEvent */\r\n    StaticEventGroup_t rxEventBuffer;    /*!< Statically allocated memory for rxEvent */\r\n#endif\r\n} usart_rtos_handle_t;\r\n\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif\r\n\r\n/*!\r\n * @name USART RTOS Operation\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief Initializes a USART instance for operation in RTOS.\r\n *\r\n * @param handle The RTOS USART handle, the pointer to allocated space for RTOS context.\r\n * @param t_handle The pointer to allocated space where to store transactional layer internal state.\r\n * @param cfg The pointer to the parameters required to configure the USART after initialization.\r\n * @return 0 succeed, others fail.\r\n */\r\nint USART_RTOS_Init(usart_rtos_handle_t *handle, usart_handle_t *t_handle, const struct rtos_usart_config *cfg);\r\n\r\n/*!\r\n * @brief Deinitializes a USART instance for operation.\r\n *\r\n * This function deinitializes the USART module, sets all register values to reset value,\r\n * and releases the resources.\r\n *\r\n * @param handle The RTOS USART handle.\r\n */\r\nint USART_RTOS_Deinit(usart_rtos_handle_t *handle);\r\n\r\n/*!\r\n * @name USART transactional Operation\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief Sends data in the background.\r\n *\r\n * This function sends data. It is a synchronous API.\r\n * If the hardware buffer is full, the task is in the blocked state.\r\n *\r\n * @param handle The RTOS USART handle.\r\n * @param buffer The pointer to buffer to send.\r\n * @param length The number of bytes to send.\r\n */\r\nint USART_RTOS_Send(usart_rtos_handle_t *handle, uint8_t *buffer, uint32_t length);\r\n\r\n/*!\r\n * @brief Receives data.\r\n *\r\n * This function receives data from USART. It is a synchronous API. If data is immediately available,\r\n * it is returned immediately and the number of bytes received.\r\n *\r\n * @param handle The RTOS USART handle.\r\n * @param buffer The pointer to buffer where to write received data.\r\n * @param length The number of bytes to receive.\r\n * @param received The pointer to a variable of size_t where the number of received data is filled.\r\n */\r\nint USART_RTOS_Receive(usart_rtos_handle_t *handle, uint8_t *buffer, uint32_t length, size_t *received);\r\n\r\n/* @} */\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n/*! @}*/\r\n\r\n#endif /* __FSL_USART_FREERTOS_H__ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_cache.c",
    "content": "/*\r\n * Copyright 2016-2021, 2023-2024 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include \"fsl_cache.h\"\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/* Component ID definition, used by tools. */\r\n#ifndef FSL_COMPONENT_ID\r\n#define FSL_COMPONENT_ID \"platform.drivers.cache_cache64\"\r\n#endif\r\n\r\n#if (FSL_FEATURE_SOC_CACHE64_CTRL_COUNT > 0)\r\n/*******************************************************************************\r\n * Variables\r\n ******************************************************************************/\r\n/* Array of CACHE64_CTRL peripheral base address. */\r\nstatic CACHE64_CTRL_Type *const s_cache64ctrlBases[] = CACHE64_CTRL_BASE_PTRS;\r\n\r\n#if (defined(FSL_FEATURE_SOC_CACHE64_POLSEL_COUNT) && (FSL_FEATURE_SOC_CACHE64_POLSEL_COUNT > 0))\r\n/* Array of CACHE64_POLSEL peripheral base address. */\r\nstatic CACHE64_POLSEL_Type *const s_cache64polselBases[] = CACHE64_POLSEL_BASE_PTRS;\r\n#endif\r\n\r\n#if (defined(CACHE64_CTRL_PHYMEM_BASE_ALIAS_COUNT))\r\n#define CACHE64_PHYMEM_COLUM_COUNT CACHE64_CTRL_PHYMEM_BASE_ALIAS_COUNT\r\n/* Array of CACHE64 physical memory base address, \r\n  it is a 2D array, the row indicate cache instance,\r\n  the column indicate the alias of one instance.  */\r\nstatic uint32_t const s_cache64PhymemBases[FSL_FEATURE_SOC_CACHE64_CTRL_COUNT][CACHE64_PHYMEM_COLUM_COUNT] = CACHE64_CTRL_PHYMEM_BASES;\r\n/* Array of CACHE64 physical size base address, \r\n  it is a 2D array, the row indicate cache instance,\r\n  the column indicate the alias of one instance.  */\r\nstatic uint32_t const s_cache64PhymemSizes[FSL_FEATURE_SOC_CACHE64_CTRL_COUNT][CACHE64_PHYMEM_COLUM_COUNT] = CACHE64_CTRL_PHYMEM_SIZES;\r\n#else\r\n#define CACHE64_PHYMEM_COLUM_COUNT 1\r\nstatic uint32_t const s_cache64PhymemBases[] = CACHE64_CTRL_PHYMEM_BASES;\r\nstatic uint32_t const s_cache64PhymemSizes[] = CACHE64_CTRL_PHYMEM_SIZES;\r\n#endif\r\n\r\n#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)\r\n#ifdef CACHE64_CLOCKS\r\n/* Array of CACHE64_CTRL clock name. */\r\nstatic const clock_ip_name_t s_cache64Clocks[] = CACHE64_CLOCKS;\r\n#endif\r\n#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */\r\n\r\nvolatile uint8_t g_cache64MemPhyAliasId = 0U;\r\n\r\n/*******************************************************************************\r\n * Code\r\n ******************************************************************************/\r\n#if (defined(FSL_FEATURE_SOC_CACHE64_POLSEL_COUNT) && (FSL_FEATURE_SOC_CACHE64_POLSEL_COUNT > 0))\r\n/*!\r\n * brief Returns an instance number given periphearl base address.\r\n *\r\n * param base The peripheral base address.\r\n * return CACHE64_POLSEL instance number starting from 0.\r\n */\r\nuint32_t CACHE64_GetInstance(CACHE64_POLSEL_Type *base)\r\n{\r\n    uint32_t i;\r\n\r\n    for (i = 0; i < ARRAY_SIZE(s_cache64polselBases); i++)\r\n    {\r\n        if (MSDK_REG_SECURE_ADDR(base) == MSDK_REG_SECURE_ADDR(s_cache64polselBases[i]))\r\n        {\r\n            break;\r\n        }\r\n    }\r\n\r\n    assert(i < ARRAY_SIZE(s_cache64polselBases));\r\n\r\n    return i;\r\n}\r\n#endif\r\n\r\n/*!\r\n * brief Returns an instance number given physical memory address.\r\n *\r\n * param address The physical memory address.\r\n * return CACHE64_CTRL instance number starting from 0.\r\n */\r\nuint32_t CACHE64_GetInstanceByAddr(uint32_t address)\r\n{\r\n    uint32_t i = 0UL;\r\n    uint32_t phyMemBase[FSL_FEATURE_SOC_CACHE64_CTRL_COUNT][CACHE64_PHYMEM_COLUM_COUNT];\r\n    uint32_t phyMemSize[FSL_FEATURE_SOC_CACHE64_CTRL_COUNT][CACHE64_PHYMEM_COLUM_COUNT];\r\n    memcpy(phyMemBase, s_cache64PhymemBases, sizeof(s_cache64PhymemBases));\r\n    memcpy(phyMemSize, s_cache64PhymemSizes, sizeof(s_cache64PhymemSizes));\r\n\r\n    while(i < ARRAY_SIZE(s_cache64ctrlBases))\r\n    {\r\n        g_cache64MemPhyAliasId = 0U;\r\n        while(g_cache64MemPhyAliasId < CACHE64_PHYMEM_COLUM_COUNT)\r\n        {\r\n            if ((MSDK_REG_SECURE_ADDR(address) >= MSDK_REG_SECURE_ADDR(phyMemBase[i][g_cache64MemPhyAliasId])) && (MSDK_REG_SECURE_ADDR(address) < MSDK_REG_SECURE_ADDR(phyMemBase[i][g_cache64MemPhyAliasId] + phyMemSize[i][g_cache64MemPhyAliasId] - 0x01U)))\r\n            {\r\n                return i;\r\n            }\r\n            g_cache64MemPhyAliasId++;\r\n        }\r\n        i++;\r\n    }\r\n\t\t\r\n    assert(false);\r\n    return 0xFFFFFFFFUL;\r\n}\r\n\r\n#if (defined(FSL_FEATURE_SOC_CACHE64_POLSEL_COUNT) && (FSL_FEATURE_SOC_CACHE64_POLSEL_COUNT > 0))\r\n/*!\r\n * @brief Initializes an CACHE64 instance with the user configuration structure.\r\n *\r\n * This function configures the CACHE64 module with user-defined settings. Call the CACHE64_GetDefaultConfig() function\r\n * to configure the configuration structure and get the default configuration.\r\n *\r\n * @param base CACHE64_POLSEL peripheral base address.\r\n * @param config Pointer to a user-defined configuration structure.\r\n * @retval kStatus_Success CACHE64 initialize succeed\r\n */\r\nstatus_t CACHE64_Init(CACHE64_POLSEL_Type *base, const cache64_config_t *config)\r\n{\r\n    volatile uint32_t *topReg = &base->REG0_TOP;\r\n    uint32_t i;\r\n    uint32_t polsel = 0;\r\n\r\n#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)\r\n#ifdef CACHE64_CLOCKS\r\n    uint32_t instance = CACHE64_GetInstance(base);\r\n\r\n    /* Enable CACHE64 clock */\r\n    CLOCK_EnableClock(s_cache64Clocks[instance]);\r\n#endif\r\n#endif\r\n\r\n    for (i = 0; i < CACHE64_REGION_NUM - 1U; i++)\r\n    {\r\n        assert((config->boundaryAddr[i] & (CACHE64_REGION_ALIGNMENT - 1U)) == 0U);\r\n        ((volatile uint32_t *)topReg)[i] = config->boundaryAddr[i] >= CACHE64_REGION_ALIGNMENT ?\r\n                                               config->boundaryAddr[i] - CACHE64_REGION_ALIGNMENT :\r\n                                               0U;\r\n    }\r\n\r\n    for (i = 0; i < CACHE64_REGION_NUM; i++)\r\n    {\r\n        polsel |= (((uint32_t)config->policy[i]) << (2U * i));\r\n    }\r\n    base->POLSEL = polsel;\r\n\r\n    return kStatus_Success;\r\n}\r\n\r\n/*!\r\n * @brief Gets the default configuration structure.\r\n *\r\n * This function initializes the CACHE64 configuration structure to a default value. The default\r\n * values are first region covers whole cacheable area, and policy set to write back.\r\n *\r\n * @param config Pointer to a configuration structure.\r\n */\r\nvoid CACHE64_GetDefaultConfig(cache64_config_t *config)\r\n{\r\n    uint32_t phyMemSize[FSL_FEATURE_SOC_CACHE64_CTRL_COUNT][CACHE64_PHYMEM_COLUM_COUNT];\r\n    memcpy(phyMemSize, s_cache64PhymemSizes, sizeof(s_cache64PhymemSizes));\r\n    (void)memset(config, 0, sizeof(cache64_config_t));\r\n\r\n    config->boundaryAddr[0] = phyMemSize[0][g_cache64MemPhyAliasId];\r\n    config->policy[0]       = kCACHE64_PolicyWriteBack;\r\n}\r\n#endif\r\n\r\n/*!\r\n * brief Enables the cache.\r\n *\r\n */\r\nvoid CACHE64_EnableCache(CACHE64_CTRL_Type *base)\r\n{\r\n    /* if CACHE is not enabled */\r\n    if ((base->CCR & CACHE64_CTRL_CCR_ENCACHE_MASK) == 0x00U)\r\n    {\r\n        /* First, invalidate the entire cache. */\r\n        CACHE64_InvalidateCache(base);\r\n\r\n        /* Now enable the cache. */\r\n        base->CCR |= CACHE64_CTRL_CCR_ENCACHE_MASK;\r\n    }\r\n}\r\n\r\n/*!\r\n * brief Disables the cache.\r\n *\r\n */\r\nvoid CACHE64_DisableCache(CACHE64_CTRL_Type *base)\r\n{\r\n    /* if CACHE is enabled */\r\n    if ((base->CCR & CACHE64_CTRL_CCR_ENCACHE_MASK) != 0x00U)\r\n    {\r\n        /* First, push any modified contents. */\r\n        CACHE64_CleanCache(base);\r\n\r\n        /* Now disable the cache. */\r\n        base->CCR &= ~CACHE64_CTRL_CCR_ENCACHE_MASK;\r\n    }\r\n}\r\n\r\n/*!\r\n * brief Invalidates the cache.\r\n *\r\n */\r\nvoid CACHE64_InvalidateCache(CACHE64_CTRL_Type *base)\r\n{\r\n    /* Invalidate all lines in both ways and initiate the cache command. */\r\n    base->CCR |= CACHE64_CTRL_CCR_INVW0_MASK | CACHE64_CTRL_CCR_INVW1_MASK | CACHE64_CTRL_CCR_GO_MASK;\r\n\r\n    /* Wait until the cache command completes. */\r\n    while ((base->CCR & CACHE64_CTRL_CCR_GO_MASK) != 0x00U)\r\n    {\r\n    }\r\n\r\n    /* As a precaution clear the bits to avoid inadvertently re-running this command. */\r\n    base->CCR &= ~(CACHE64_CTRL_CCR_INVW0_MASK | CACHE64_CTRL_CCR_INVW1_MASK);\r\n}\r\n\r\n/*!\r\n * brief Invalidates cache by range.\r\n *\r\n * param address The physical address of cache.\r\n * param size_byte size of the memory to be invalidated, should be larger than 0.\r\n * note Address and size should be aligned to \"L1CODCACHE_LINESIZE_BYTE\".\r\n * The startAddr here will be forced to align to CACHE64_LINESIZE_BYTE if\r\n * startAddr is not aligned. For the size_byte, application should make sure the\r\n * alignment or make sure the right operation order if the size_byte is not aligned.\r\n */\r\nvoid CACHE64_InvalidateCacheByRange(uint32_t address, uint32_t size_byte)\r\n{\r\n    if (size_byte > 0UL)\r\n    {\r\n        uint32_t endAddr = MSDK_REG_SECURE_ADDR(address + size_byte - 0x01U);\r\n        uint32_t pccReg  = 0;\r\n        /* Align address to cache line size. */\r\n        uint32_t startAddr = MSDK_REG_SECURE_ADDR(address & ~((uint32_t)CACHE64_LINESIZE_BYTE - 1U));\r\n        uint32_t instance  = CACHE64_GetInstanceByAddr(address);\r\n        uint32_t endLim;\r\n        CACHE64_CTRL_Type *base;\r\n        uint32_t phyMemBase[FSL_FEATURE_SOC_CACHE64_CTRL_COUNT][CACHE64_PHYMEM_COLUM_COUNT];\r\n        uint32_t phyMemSize[FSL_FEATURE_SOC_CACHE64_CTRL_COUNT][CACHE64_PHYMEM_COLUM_COUNT];\r\n        memcpy(phyMemBase, s_cache64PhymemBases, sizeof(s_cache64PhymemBases));\r\n        memcpy(phyMemSize, s_cache64PhymemSizes, sizeof(s_cache64PhymemSizes));\r\n\r\n        if (instance >= ARRAY_SIZE(s_cache64ctrlBases))\r\n        {\r\n            return;\r\n        }\r\n        base    = s_cache64ctrlBases[instance];\r\n        endLim  = MSDK_REG_SECURE_ADDR(phyMemBase[instance][g_cache64MemPhyAliasId] + phyMemSize[instance][g_cache64MemPhyAliasId] - 0x01U);\r\n        endAddr = endAddr > endLim ? endLim : endAddr;\r\n\r\n        /* Set the invalidate by line command and use the physical address. */\r\n        pccReg = (base->CLCR & ~CACHE64_CTRL_CLCR_LCMD_MASK) | CACHE64_CTRL_CLCR_LCMD(1) | CACHE64_CTRL_CLCR_LADSEL_MASK;\r\n        base->CLCR = pccReg;\r\n\r\n        while (startAddr < endAddr)\r\n        {\r\n            /* Set the address and initiate the command. */\r\n            base->CSAR = (startAddr & CACHE64_CTRL_CSAR_PHYADDR_MASK) | CACHE64_CTRL_CSAR_LGO_MASK;\r\n\r\n            /* Wait until the cache command completes. */\r\n            while ((base->CSAR & CACHE64_CTRL_CSAR_LGO_MASK) != 0x00U)\r\n            {\r\n            }\r\n            startAddr += (uint32_t)CACHE64_LINESIZE_BYTE;\r\n        }\r\n    }\r\n}\r\n\r\n/*!\r\n * brief Cleans the cache.\r\n *\r\n */\r\nvoid CACHE64_CleanCache(CACHE64_CTRL_Type *base)\r\n{\r\n    /* Enable the to push all modified lines. */\r\n    base->CCR |= CACHE64_CTRL_CCR_PUSHW0_MASK | CACHE64_CTRL_CCR_PUSHW1_MASK | CACHE64_CTRL_CCR_GO_MASK;\r\n\r\n    /* Wait until the cache command completes. */\r\n    while ((base->CCR & CACHE64_CTRL_CCR_GO_MASK) != 0x00U)\r\n    {\r\n    }\r\n\r\n    /* As a precaution clear the bits to avoid inadvertently re-running this command. */\r\n    base->CCR &= ~(CACHE64_CTRL_CCR_PUSHW0_MASK | CACHE64_CTRL_CCR_PUSHW1_MASK);\r\n}\r\n\r\n/*!\r\n * brief Cleans cache by range.\r\n *\r\n * param address The physical address of cache.\r\n * param size_byte size of the memory to be cleaned, should be larger than 0.\r\n * note Address and size should be aligned to \"CACHE64_LINESIZE_BYTE\".\r\n * The startAddr here will be forced to align to CACHE64_LINESIZE_BYTE if\r\n * startAddr is not aligned. For the size_byte, application should make sure the\r\n * alignment or make sure the right operation order if the size_byte is not aligned.\r\n */\r\nvoid CACHE64_CleanCacheByRange(uint32_t address, uint32_t size_byte)\r\n{\r\n    if (size_byte > 0UL)\r\n    {\r\n        uint32_t endAddr = MSDK_REG_SECURE_ADDR(address + size_byte - 0x01U);\r\n        uint32_t pccReg  = 0;\r\n        /* Align address to cache line size. */\r\n        uint32_t startAddr = MSDK_REG_SECURE_ADDR(address & ~((uint32_t)CACHE64_LINESIZE_BYTE - 1U));\r\n        uint32_t instance  = CACHE64_GetInstanceByAddr(address);\r\n        uint32_t endLim;\r\n        CACHE64_CTRL_Type *base;\r\n        uint32_t phyMemBase[FSL_FEATURE_SOC_CACHE64_CTRL_COUNT][CACHE64_PHYMEM_COLUM_COUNT];\r\n        uint32_t phyMemSize[FSL_FEATURE_SOC_CACHE64_CTRL_COUNT][CACHE64_PHYMEM_COLUM_COUNT];\r\n        memcpy(phyMemBase, s_cache64PhymemBases, sizeof(s_cache64PhymemBases));\r\n        memcpy(phyMemSize, s_cache64PhymemSizes, sizeof(s_cache64PhymemSizes));\r\n\r\n        if (instance >= ARRAY_SIZE(s_cache64ctrlBases))\r\n        {\r\n            return;\r\n        }\r\n        base    = s_cache64ctrlBases[instance];\r\n        endLim  = MSDK_REG_SECURE_ADDR(phyMemBase[instance][g_cache64MemPhyAliasId] + phyMemSize[instance][g_cache64MemPhyAliasId] - 0x01U);\r\n        endAddr = endAddr > endLim ? endLim : endAddr;\r\n\r\n        /* Set the push by line command. */\r\n        pccReg = (base->CLCR & ~CACHE64_CTRL_CLCR_LCMD_MASK) | CACHE64_CTRL_CLCR_LCMD(2) | CACHE64_CTRL_CLCR_LADSEL_MASK;\r\n        base->CLCR = pccReg;\r\n\r\n        while (startAddr < endAddr)\r\n        {\r\n            /* Set the address and initiate the command. */\r\n            base->CSAR = (startAddr & CACHE64_CTRL_CSAR_PHYADDR_MASK) | CACHE64_CTRL_CSAR_LGO_MASK;\r\n\r\n            /* Wait until the cache command completes. */\r\n            while ((base->CSAR & CACHE64_CTRL_CSAR_LGO_MASK) != 0x00U)\r\n            {\r\n            }\r\n            startAddr += (uint32_t)CACHE64_LINESIZE_BYTE;\r\n        }\r\n    }\r\n}\r\n\r\n/*!\r\n * brief Cleans and invalidates the cache.\r\n *\r\n */\r\nvoid CACHE64_CleanInvalidateCache(CACHE64_CTRL_Type *base)\r\n{\r\n    /* Push and invalidate all. */\r\n    base->CCR |= CACHE64_CTRL_CCR_PUSHW0_MASK | CACHE64_CTRL_CCR_PUSHW1_MASK | CACHE64_CTRL_CCR_INVW0_MASK |\r\n                 CACHE64_CTRL_CCR_INVW1_MASK | CACHE64_CTRL_CCR_GO_MASK;\r\n\r\n    /* Wait until the cache command completes. */\r\n    while ((base->CCR & CACHE64_CTRL_CCR_GO_MASK) != 0x00U)\r\n    {\r\n    }\r\n\r\n    /* As a precaution clear the bits to avoid inadvertently re-running this command. */\r\n    base->CCR &= ~(CACHE64_CTRL_CCR_PUSHW0_MASK | CACHE64_CTRL_CCR_PUSHW1_MASK | CACHE64_CTRL_CCR_INVW0_MASK |\r\n                   CACHE64_CTRL_CCR_INVW1_MASK);\r\n}\r\n\r\n/*!\r\n * brief Cleans and invalidate cache by range.\r\n *\r\n * param address The physical address of cache.\r\n * param size_byte size of the memory to be Cleaned and Invalidated, should be larger than 0.\r\n * note Address and size should be aligned to \"CACHE64_LINESIZE_BYTE\".\r\n * The startAddr here will be forced to align to CACHE64_LINESIZE_BYTE if\r\n * startAddr is not aligned. For the size_byte, application should make sure the\r\n * alignment or make sure the right operation order if the size_byte is not aligned.\r\n */\r\nvoid CACHE64_CleanInvalidateCacheByRange(uint32_t address, uint32_t size_byte)\r\n{\r\n    if (size_byte > 0UL)\r\n    {\r\n        uint32_t endAddr = MSDK_REG_SECURE_ADDR(address + size_byte - 0x01U);\r\n        uint32_t pccReg  = 0;\r\n        /* Align address to cache line size. */\r\n        uint32_t startAddr = MSDK_REG_SECURE_ADDR(address & ~((uint32_t)CACHE64_LINESIZE_BYTE - 1U));\r\n        uint32_t instance  = CACHE64_GetInstanceByAddr(address);\r\n        uint32_t endLim;\r\n        CACHE64_CTRL_Type *base;\r\n        uint32_t phyMemBase[FSL_FEATURE_SOC_CACHE64_CTRL_COUNT][CACHE64_PHYMEM_COLUM_COUNT];\r\n        uint32_t phyMemSize[FSL_FEATURE_SOC_CACHE64_CTRL_COUNT][CACHE64_PHYMEM_COLUM_COUNT];\r\n        memcpy(phyMemBase, s_cache64PhymemBases, sizeof(s_cache64PhymemBases));\r\n        memcpy(phyMemSize, s_cache64PhymemSizes, sizeof(s_cache64PhymemSizes));\r\n\r\n        if (instance >= ARRAY_SIZE(s_cache64ctrlBases))\r\n        {\r\n            return;\r\n        }\r\n        base    = s_cache64ctrlBases[instance];\r\n        endLim  = MSDK_REG_SECURE_ADDR(phyMemBase[instance][g_cache64MemPhyAliasId] + phyMemSize[instance][g_cache64MemPhyAliasId] - 0x01U);\r\n        endAddr = endAddr > endLim ? endLim : endAddr;\r\n\r\n        /* Set the push by line command. */\r\n        pccReg = (base->CLCR & ~CACHE64_CTRL_CLCR_LCMD_MASK) | CACHE64_CTRL_CLCR_LCMD(3) | CACHE64_CTRL_CLCR_LADSEL_MASK;\r\n        base->CLCR = pccReg;\r\n\r\n        while (startAddr < endAddr)\r\n        {\r\n            /* Set the address and initiate the command. */\r\n            base->CSAR = (startAddr & CACHE64_CTRL_CSAR_PHYADDR_MASK) | CACHE64_CTRL_CSAR_LGO_MASK;\r\n\r\n            /* Wait until the cache command completes. */\r\n            while ((base->CSAR & CACHE64_CTRL_CSAR_LGO_MASK) != 0x00U)\r\n            {\r\n            }\r\n            startAddr += (uint32_t)CACHE64_LINESIZE_BYTE;\r\n        }\r\n    }\r\n}\r\n\r\n#if !(defined(FSL_FEATURE_CACHE64_CTRL_HAS_NO_WRITE_BUF) && FSL_FEATURE_CACHE64_CTRL_HAS_NO_WRITE_BUF)\r\n/*!\r\n * brief Enable the cache write buffer.\r\n *\r\n */\r\nvoid CACHE64_EnableWriteBuffer(CACHE64_CTRL_Type *base, bool enable)\r\n{\r\n    if (enable)\r\n    {\r\n        base->CCR |= CACHE64_CTRL_CCR_ENWRBUF_MASK;\r\n    }\r\n    else\r\n    {\r\n        base->CCR &= ~CACHE64_CTRL_CCR_ENWRBUF_MASK;\r\n    }\r\n}\r\n\r\n#endif\r\n\r\n#endif /* FSL_FEATURE_SOC_CACHE64_CTRL_COUNT > 0 */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_cache.h",
    "content": "/*\r\n * Copyright 2016-2021, 2023-2024 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef FSL_CACHE_H_\r\n#define FSL_CACHE_H_\r\n\r\n#include \"fsl_common.h\"\r\n\r\n/*!\r\n * @addtogroup cache64\r\n * @{\r\n */\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*! @name Driver version */\r\n/*! @{ */\r\n/*! @brief cache driver version. */\r\n#define FSL_CACHE_DRIVER_VERSION (MAKE_VERSION(2, 0, 8))\r\n/*! @} */\r\n\r\n/*! @brief cache line size. */\r\n#define CACHE64_LINESIZE_BYTE (FSL_FEATURE_CACHE64_CTRL_LINESIZE_BYTE)\r\n\r\n#if (defined(FSL_FEATURE_SOC_CACHE64_POLSEL_COUNT) && (FSL_FEATURE_SOC_CACHE64_POLSEL_COUNT > 0))\r\n/*! @brief cache region number. */\r\n#define CACHE64_REGION_NUM (3U)\r\n/*! @brief cache region alignment. */\r\n#define CACHE64_REGION_ALIGNMENT (0x400U)\r\n\r\n/*! @brief Level 2 cache controller way size. */\r\ntypedef enum _cache64_policy\r\n{\r\n    kCACHE64_PolicyNonCacheable = 0, /*!< Non-cacheable */\r\n    kCACHE64_PolicyWriteThrough = 1, /*!< Write through */\r\n    kCACHE64_PolicyWriteBack    = 2, /*!< Write back */\r\n} cache64_policy_t;\r\n\r\n/*! @brief CACHE64 configuration structure. */\r\ntypedef struct _cache64_config\r\n{\r\n    /*!< The cache controller can divide whole memory into 3 regions.\r\n     * Boundary address is the FlexSPI internal address (start from 0) instead of system\r\n     * address (start from FlexSPI AMBA base) to split adjacent regions and must be 1KB\r\n     * aligned. The boundary address itself locates in upper region. */\r\n    uint32_t boundaryAddr[CACHE64_REGION_NUM - 1];\r\n    /*!< Cacheable policy for each region. */\r\n    cache64_policy_t policy[CACHE64_REGION_NUM];\r\n} cache64_config_t;\r\n#endif\r\n\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif\r\n\r\n/*!\r\n * @name cache control for cache64\r\n *@{\r\n */\r\n\r\n#if (defined(FSL_FEATURE_SOC_CACHE64_POLSEL_COUNT) && (FSL_FEATURE_SOC_CACHE64_POLSEL_COUNT > 0))\r\n/*!\r\n * @brief Returns an instance number given periphearl base address.\r\n *\r\n * @param base The peripheral base address.\r\n * @return CACHE64_POLSEL instance number starting from 0.\r\n */\r\nuint32_t CACHE64_GetInstance(CACHE64_POLSEL_Type *base);\r\n#endif\r\n\r\n/*!\r\n * brief Returns an instance number given physical memory address.\r\n *\r\n * param address The physical memory address.\r\n * @return CACHE64_CTRL instance number starting from 0.\r\n */\r\nuint32_t CACHE64_GetInstanceByAddr(uint32_t address);\r\n\r\n#if (defined(FSL_FEATURE_SOC_CACHE64_POLSEL_COUNT) && (FSL_FEATURE_SOC_CACHE64_POLSEL_COUNT > 0))\r\n/*!\r\n * @brief Initializes an CACHE64 instance with the user configuration structure.\r\n *\r\n * This function configures the CACHE64 module with user-defined settings. Call the CACHE64_GetDefaultConfig() function\r\n * to configure the configuration structure and get the default configuration.\r\n *\r\n * @param base CACHE64_POLSEL peripheral base address.\r\n * @param config Pointer to a user-defined configuration structure.\r\n * @retval kStatus_Success CACHE64 initialize succeed\r\n */\r\nstatus_t CACHE64_Init(CACHE64_POLSEL_Type *base, const cache64_config_t *config);\r\n\r\n/*!\r\n * @brief Gets the default configuration structure.\r\n *\r\n * This function initializes the CACHE64 configuration structure to a default value. The default\r\n * values are first region covers whole cacheable area, and policy set to write back.\r\n *\r\n * @param config Pointer to a configuration structure.\r\n */\r\nvoid CACHE64_GetDefaultConfig(cache64_config_t *config);\r\n#endif\r\n\r\n/*!\r\n * @brief Enables the cache.\r\n *\r\n * @param base CACHE64_CTRL peripheral base address.\r\n *\r\n */\r\nvoid CACHE64_EnableCache(CACHE64_CTRL_Type *base);\r\n\r\n/*!\r\n * @brief Disables the cache.\r\n *\r\n * @param base CACHE64_CTRL peripheral base address.\r\n *\r\n */\r\nvoid CACHE64_DisableCache(CACHE64_CTRL_Type *base);\r\n\r\n/*!\r\n * @brief Invalidates the cache.\r\n *\r\n * @param base CACHE64_CTRL peripheral base address.\r\n *\r\n */\r\nvoid CACHE64_InvalidateCache(CACHE64_CTRL_Type *base);\r\n\r\n/*!\r\n * @brief Invalidates cache by range.\r\n *\r\n * @param address The physical address of cache.\r\n * @param size_byte size of the memory to be invalidated, should be larger than 0.\r\n * @note Address and size should be aligned to \"CACHE64_LINESIZE_BYTE\".\r\n * The startAddr here will be forced to align to CACHE64_LINESIZE_BYTE if\r\n * startAddr is not aligned. For the size_byte, application should make sure the\r\n * alignment or make sure the right operation order if the size_byte is not aligned.\r\n */\r\nvoid CACHE64_InvalidateCacheByRange(uint32_t address, uint32_t size_byte);\r\n\r\n/*!\r\n * @brief Cleans the cache.\r\n *\r\n * @param base CACHE64_CTRL peripheral base address.\r\n *\r\n */\r\nvoid CACHE64_CleanCache(CACHE64_CTRL_Type *base);\r\n\r\n/*!\r\n * @brief Cleans cache by range.\r\n *\r\n * @param address The physical address of cache.\r\n * @param size_byte size of the memory to be cleaned, should be larger than 0.\r\n * @note Address and size should be aligned to \"CACHE64_LINESIZE_BYTE\".\r\n * The startAddr here will be forced to align to CACHE64_LINESIZE_BYTE if\r\n * startAddr is not aligned. For the size_byte, application should make sure the\r\n * alignment or make sure the right operation order if the size_byte is not aligned.\r\n */\r\nvoid CACHE64_CleanCacheByRange(uint32_t address, uint32_t size_byte);\r\n\r\n/*!\r\n * @brief Cleans and invalidates the cache.\r\n *\r\n * @param base CACHE64_CTRL peripheral base address.\r\n *\r\n */\r\nvoid CACHE64_CleanInvalidateCache(CACHE64_CTRL_Type *base);\r\n\r\n/*!\r\n * @brief Cleans and invalidate cache by range.\r\n *\r\n * @param address The physical address of cache.\r\n * @param size_byte size of the memory to be Cleaned and Invalidated, should be larger than 0.\r\n * @note Address and size should be aligned to \"CACHE64_LINESIZE_BYTE\".\r\n * The startAddr here will be forced to align to CACHE64_LINESIZE_BYTE if\r\n * startAddr is not aligned. For the size_byte, application should make sure the\r\n * alignment or make sure the right operation order if the size_byte is not aligned.\r\n */\r\nvoid CACHE64_CleanInvalidateCacheByRange(uint32_t address, uint32_t size_byte);\r\n\r\n#if !(defined(FSL_FEATURE_CACHE64_CTRL_HAS_NO_WRITE_BUF) && FSL_FEATURE_CACHE64_CTRL_HAS_NO_WRITE_BUF)\r\n/*!\r\n * @brief Enables/disables the write buffer.\r\n *\r\n * @param base CACHE64_CTRL peripheral base address.\r\n * @param enable The enable or disable flag.\r\n *       true  - enable the write buffer.\r\n *       false - disable the write buffer.\r\n */\r\nvoid CACHE64_EnableWriteBuffer(CACHE64_CTRL_Type *base, bool enable);\r\n#endif\r\n\r\n/*! @} */\r\n\r\n/*!\r\n * @name Unified Cache Control for all caches\r\n *@{\r\n */\r\n\r\n/*!\r\n * @brief Invalidates instruction cache by range.\r\n *\r\n * @param address The physical address.\r\n * @param size_byte size of the memory to be invalidated, should be larger than 0.\r\n * @note Address and size should be aligned to CACHE64_LINESIZE_BYTE due to the cache operation unit\r\n * FSL_FEATURE_CACHE64_CTRL_LINESIZE_BYTE. The startAddr here will be forced to align to the cache line\r\n * size if startAddr is not aligned. For the size_byte, application should make sure the\r\n * alignment or make sure the right operation order if the size_byte is not aligned.\r\n */\r\nstatic inline void ICACHE_InvalidateByRange(uint32_t address, uint32_t size_byte)\r\n{\r\n    CACHE64_InvalidateCacheByRange(address, size_byte);\r\n}\r\n\r\n/*!\r\n * @brief Invalidates data cache by range.\r\n *\r\n * @param address The physical address.\r\n * @param size_byte size of the memory to be invalidated, should be larger than 0.\r\n * @note Address and size should be aligned to CACHE64_LINESIZE_BYTE due to the cache operation unit\r\n * FSL_FEATURE_CACHE64_CTRL_LINESIZE_BYTE. The startAddr here will be forced to align to the cache line\r\n * size if startAddr is not aligned. For the size_byte, application should make sure the\r\n * alignment or make sure the right operation order if the size_byte is not aligned.\r\n */\r\nstatic inline void DCACHE_InvalidateByRange(uint32_t address, uint32_t size_byte)\r\n{\r\n    CACHE64_InvalidateCacheByRange(address, size_byte);\r\n}\r\n\r\n/*!\r\n * @brief Clean data cache by range.\r\n *\r\n * @param address The physical address.\r\n * @param size_byte size of the memory to be cleaned, should be larger than 0.\r\n * @note Address and size should be aligned to CACHE64_LINESIZE_BYTE due to the cache operation unit\r\n * FSL_FEATURE_CACHE64_CTRL_LINESIZE_BYTE. The startAddr here will be forced to align to the cache line\r\n * size if startAddr is not aligned. For the size_byte, application should make sure the\r\n * alignment or make sure the right operation order if the size_byte is not aligned.\r\n */\r\nstatic inline void DCACHE_CleanByRange(uint32_t address, uint32_t size_byte)\r\n{\r\n    CACHE64_CleanCacheByRange(address, size_byte);\r\n}\r\n\r\n/*!\r\n * @brief Cleans and Invalidates data cache by range.\r\n *\r\n * @param address The physical address.\r\n * @param size_byte size of the memory to be Cleaned and Invalidated, should be larger than 0.\r\n * @note Address and size should be aligned to CACHE64_LINESIZE_BYTE due to the cache operation unit\r\n * FSL_FEATURE_CACHE64_CTRL_LINESIZE_BYTE. The startAddr here will be forced to align to the cache line\r\n * size if startAddr is not aligned. For the size_byte, application should make sure the\r\n * alignment or make sure the right operation order if the size_byte is not aligned.\r\n */\r\nstatic inline void DCACHE_CleanInvalidateByRange(uint32_t address, uint32_t size_byte)\r\n{\r\n    CACHE64_CleanInvalidateCacheByRange(address, size_byte);\r\n}\r\n\r\n/*! @} */\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n/*! @}*/\r\n\r\n#endif /* FSL_CACHE_H_*/\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_clock.c",
    "content": "/*\r\n * Copyright 2020-2024, NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include \"fsl_clock.h\"\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/* Component ID definition, used by tools. */\r\n#ifndef FSL_COMPONENT_ID\r\n#define FSL_COMPONENT_ID \"platform.drivers.clock\"\r\n#endif\r\n\r\n/* Each loop costs 3 cpu cycles */\r\n#define CLOCK_DELAY_LOOPS(cpuFreq, delayFreq, delayCycles) \\\r\n    ((((cpuFreq) + (delayFreq)-1U) / (delayFreq)) * (delayCycles) / 3U)\r\n\r\n#define CLOCK_KHZ(freq) ((freq)*1000UL)\r\n#define CLOCK_MHZ(freq) (CLOCK_KHZ(freq) * 1000UL)\r\n\r\n/*******************************************************************************\r\n * Variables\r\n ******************************************************************************/\r\n/* External CLK_IN pin clock frequency. */\r\nvolatile uint32_t g_clkinFreq = 0U;\r\n/* External MCLK in (mclk_in) clock frequency. If not used,\r\n   set this to 0. Otherwise, set it to the exact rate in Hz this pin is\r\n   being driven at.*/\r\nvolatile uint32_t g_mclkinFreq = 0U;\r\n\r\nstatic const uint32_t s_avpllFreq[] = {\r\n    0U,\r\n    CLOCK_KHZ(2048UL),  /*!< AVPLL channel frequency 2.048MHz */\r\n    CLOCK_KHZ(4096UL),  /*!< AVPLL channel frequency 4.096MHz */\r\n    CLOCK_KHZ(6144UL),  /*!< AVPLL channel frequency 6.144MHz */\r\n    CLOCK_KHZ(8192UL),  /*!< AVPLL channel frequency 8.192MHz */\r\n    11289600UL,         /*!< AVPLL channel frequency 11.2896MHz */\r\n    CLOCK_MHZ(12UL),    /*!< AVPLL channel frequency 12MHz */\r\n    CLOCK_KHZ(12288UL), /*!< AVPLL channel frequency 12.288MHz */\r\n    CLOCK_KHZ(24576UL), /*!< AVPLL channel frequency 24.576MHz */\r\n    CLOCK_MHZ(64UL),    /*!< AVPLL channel frequency 64MHz */\r\n    CLOCK_KHZ(98304UL), /*!< AVPLL channel frequency 98.304MHz */\r\n};\r\n\r\nstatic const uint32_t s_avpllFreqOff[] = {\r\n    0U,       /*!< AVPLL channel unchanged */\r\n    0x53U,    /*!< AVPLL channel frequency 2.048MHz */\r\n    0x1050U,  /*!< AVPLL channel frequency 4.096MHz */\r\n    0x4145DU, /*!< AVPLL channel frequency 6.144MHz */\r\n    0x4145DU, /*!< AVPLL channel frequency 8.192MHz */\r\n    0x38B3U,  /*!< AVPLL channel frequency 11.2896MHz */\r\n    0U,       /*!< AVPLL channel frequency 12MHz */\r\n    0x4145DU, /*!< AVPLL channel frequency 12.288MHz */\r\n    0x4145DU, /*!< AVPLL channel frequency 24.576MHz */\r\n    0xCCCDU,  /*!< AVPLL channel frequency 64MHz */\r\n    0x4145DU, /*!< AVPLL channel frequency 98.304MHz */\r\n};\r\n\r\nstatic const uint32_t s_avpllPostDiv[] = {\r\n    0U,   /*!< AVPLL channel unchanged */\r\n    791U, /*!< AVPLL channel frequency 2.048MHz */\r\n    395U, /*!< AVPLL channel frequency 4.096MHz */\r\n    264U, /*!< AVPLL channel frequency 6.144MHz */\r\n    198U, /*!< AVPLL channel frequency 8.192MHz */\r\n    143U, /*!< AVPLL channel frequency 11.2896MHz */\r\n    135U, /*!< AVPLL channel frequency 12MHz */\r\n    132U, /*!< AVPLL channel frequency 12.288MHz */\r\n    66U,  /*!< AVPLL channel frequency 24.576MHz */\r\n    25U,  /*!< AVPLL channel frequency 64MHz */\r\n    16U,  /*!< AVPLL channel frequency 98.304MHz */\r\n};\r\n\r\nstatic const uint32_t s_avpllPostDiv0p5[] = {\r\n    0U, /*!< AVPLL channel unchanged */\r\n    0U, /*!< AVPLL channel frequency 2.048MHz */\r\n    0U, /*!< AVPLL channel frequency 4.096MHz */\r\n    0U, /*!< AVPLL channel frequency 6.144MHz */\r\n    0U, /*!< AVPLL channel frequency 8.192MHz */\r\n    0U, /*!< AVPLL channel frequency 11.2896MHz */\r\n    0U, /*!< AVPLL channel frequency 12MHz */\r\n    0U, /*!< AVPLL channel frequency 12.288MHz */\r\n    0U, /*!< AVPLL channel frequency 24.576MHz */\r\n    0U, /*!< AVPLL channel frequency 64MHz */\r\n    1U, /*!< AVPLL channel frequency 98.304MHz */\r\n};\r\n\r\n/*******************************************************************************\r\n * Prototypes\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n * Code\r\n ******************************************************************************/\r\n/* Workaround iar/armgcc optimization issue */\r\n__attribute__((__noinline__))\r\nstatic void CLOCK_Delay(uint32_t loop)\r\n{\r\n    if (loop > 0U)\r\n    {\r\n        __ASM volatile(\r\n            \"1:                             \\n\"\r\n            \"    SUBS   %0, %0, #1          \\n\"\r\n            \"    CMP    %0, #0              \\n\"\r\n            \"    BNE    1b                  \\n\"\r\n            :\r\n            : \"r\"(loop));\r\n    }\r\n}\r\n\r\nstatic void CLOCK_DelayUs(uint32_t us)\r\n{\r\n    uint32_t instNum;\r\n\r\n    instNum = ((SystemCoreClock + 999999UL) / 1000000UL) * us;\r\n    CLOCK_Delay((instNum + 2U) / 3U);\r\n}\r\n\r\n/*! @brief  Return Frequency of t3pll_mci_48_60m_irc\r\n *  @return Frequency of t3pll_mci_48_60m_irc\r\n */\r\nuint32_t CLOCK_GetT3PllMciIrcClkFreq(void)\r\n{\r\n    uint32_t freq = 0U;\r\n\r\n    if ((SYSPLL_T3->CLKTREE_CTRL_SIX_REG & 0xFU) == 0x5U)\r\n    {\r\n        freq = CLOCK_MHZ(2560UL) / 43UL;\r\n    }\r\n    else if ((SYSPLL_T3->CLKTREE_CTRL_SIX_REG & 0xFU) == 0xAU)\r\n    {\r\n        freq = CLOCK_MHZ(2560UL) / 53UL;\r\n    }\r\n    else\r\n    {\r\n        /* Only 48MHz and 60MHz is allowed */\r\n        assert(false);\r\n    }\r\n\r\n    return freq;\r\n}\r\n\r\n/*! @brief  Return Frequency of t3pll_mci_213p3m\r\n *  @return Frequency of t3pll_mci_213p3m\r\n */\r\nuint32_t CLOCK_GetT3PllMci213mClkFreq(void)\r\n{\r\n    uint32_t freq = CLOCK_KHZ(213300UL);\r\n    return freq;\r\n}\r\n\r\n/*! @brief  Return Frequency of t3pll_mci_256m\r\n *  @return Frequency of t3pll_mci_256m\r\n */\r\nuint32_t CLOCK_GetT3PllMci256mClkFreq(void)\r\n{\r\n    uint32_t freq = CLOCK_MHZ(256UL);\r\n    return freq;\r\n}\r\n\r\n/*! @brief  Return Frequency of t3pll_mci_flexspi_clk\r\n *  @return Frequency of t3pll_mci_flexspi_clk\r\n */\r\nuint32_t CLOCK_GetT3PllMciFlexspiClkFreq(void)\r\n{\r\n    uint32_t freq = CLOCK_MHZ(365UL);\r\n    ;\r\n    return freq;\r\n}\r\n\r\nstatic uint32_t CLOCK_GetTcpuFvcoFreq(void)\r\n{\r\n    uint32_t freq = 0UL;\r\n    uint32_t steps;\r\n\r\n    steps = (SYSCTL2->PLL_CTRL & SYSCTL2_PLL_CTRL_TCPU_FBDIV_MASK) >> SYSCTL2_PLL_CTRL_TCPU_FBDIV_SHIFT;\r\n\r\n    if ((CLK_XTAL_OSC_CLK == CLK_XTAL_OSC_CLK_40000KHZ) && (steps >= 75UL) && (steps <= 96UL))\r\n    {\r\n        /* Fbdiv from 75 to 96, step 40MHz */\r\n        steps -= 75UL;\r\n        freq = CLOCK_MHZ(3000UL) + steps * CLOCK_MHZ(40UL);\r\n    }\r\n    else if ((CLK_XTAL_OSC_CLK == CLK_XTAL_OSC_CLK_38400KHZ) && (steps >= 78UL) && (steps <= 100UL))\r\n    {\r\n        /* Fbdiv from 78 to 100, step 38.4MHz */\r\n        steps -= 78UL;\r\n        freq = CLOCK_KHZ(2995200UL) + steps * CLOCK_KHZ(38400UL);\r\n    }\r\n    else\r\n    {\r\n        assert(false);\r\n    }\r\n\r\n    return freq;\r\n}\r\n\r\n/*! @brief  Return Frequency of tcpu_mci_clk\r\n *  return Frequency of tcpu_mci_clk\r\n */\r\nuint32_t CLOCK_GetTcpuMciClkFreq(void)\r\n{\r\n    uint32_t freq = CLOCK_GetTcpuFvcoFreq() / 12UL;\r\n    return freq;\r\n}\r\n\r\n/*! @brief  Return Frequency of tcpu_mci_flexspi_clk\r\n *  @return Frequency of tcpu_mci_flexspi_clk\r\n */\r\nuint32_t CLOCK_GetTcpuMciFlexspiClkFreq(void)\r\n{\r\n    uint32_t div =\r\n        (SYSCTL2->PLL_CTRL & SYSCTL2_PLL_CTRL_TCPU_FLEXSPI_CLK_SEL_MASK) >> SYSCTL2_PLL_CTRL_TCPU_FLEXSPI_CLK_SEL_SHIFT;\r\n\r\n    return CLOCK_GetTcpuFvcoFreq() / (12UL - div);\r\n}\r\n\r\n/*! @brief  Return Frequency of tddr_mci_flexspi_clk\r\n *  @return Frequency of tddr_mci_flexspi_clk\r\n */\r\nuint32_t CLOCK_GetTddrMciFlexspiClkFreq(void)\r\n{\r\n    uint32_t div =\r\n        (SYSCTL2->PLL_CTRL & SYSCTL2_PLL_CTRL_TDDR_FLEXSPI_CLK_SEL_MASK) >> SYSCTL2_PLL_CTRL_TDDR_FLEXSPI_CLK_SEL_SHIFT;\r\n    /* TDDR FVCO fixed to 3.2GHz */\r\n    return CLOCK_MHZ(3200UL) / (11UL - div);\r\n}\r\n\r\n/*! @brief  Return Frequency of tddr_mci_enet_clk\r\n *  @return Frequency of tddr_mci_enet_clk\r\n */\r\nuint32_t CLOCK_GetTddrMciEnetClkFreq(void)\r\n{\r\n    uint32_t freq = CLOCK_MHZ(50UL);\r\n    return freq;\r\n}\r\n\r\n/*!\r\n * @brief Enable the clock for specific IP.\r\n *\r\n * @param clk  Which clock to enable, see @ref clock_ip_name_t.\r\n */\r\nvoid CLOCK_EnableClock(clock_ip_name_t clk)\r\n{\r\n    uint32_t index;\r\n\r\n    if (clk == kCLOCK_RefClkCauSlp)\r\n    {\r\n        PMU->CAU_SLP_CTRL &= ~PMU_CAU_SLP_CTRL_CAU_SOC_SLP_CG_MASK;\r\n        while ((PMU->CAU_SLP_CTRL & PMU_CAU_SLP_CTRL_SOC_SLP_RDY_MASK) == 0U)\r\n        {\r\n        }\r\n    }\r\n    else if (((uint32_t)clk & SYS_CLK_GATE_FLAG_MASK) != 0U)\r\n    {\r\n        SYSCTL2->SOURCE_CLK_GATE &= ~SYS_CLK_GATE_BIT_MASK(clk);\r\n        /* Delay 2 40MHz cycles to make it ready. */\r\n        CLOCK_Delay(CLOCK_DELAY_LOOPS(SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY, 40000000UL, 2U));\r\n    }\r\n    else\r\n    {\r\n        index = CLK_GATE_ABSTRACT_REG_OFFSET(clk);\r\n\r\n        switch (index)\r\n        {\r\n            case CLK_CTL0_PSCCTL0:\r\n                CLKCTL0->PSCCTL0_SET = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));\r\n                break;\r\n            case CLK_CTL0_PSCCTL1:\r\n                CLKCTL0->PSCCTL1_SET = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));\r\n                break;\r\n            case CLK_CTL0_PSCCTL2:\r\n                CLKCTL0->PSCCTL2_SET = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));\r\n                break;\r\n            case CLK_CTL1_PSCCTL0:\r\n                CLKCTL1->PSCCTL0_SET = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));\r\n                break;\r\n            case CLK_CTL1_PSCCTL1:\r\n                CLKCTL1->PSCCTL1_SET = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));\r\n                break;\r\n            case CLK_CTL1_PSCCTL2:\r\n                CLKCTL1->PSCCTL2_SET = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));\r\n                break;\r\n            default:\r\n                assert(false);\r\n                break;\r\n        }\r\n\r\n        if (clk == kCLOCK_Gau)\r\n        {\r\n            SYSCTL2->GAU_CTRL = SYSCTL2_GAU_CTRL_GAU_GPDAC_MCLK_EN_MASK | SYSCTL2_GAU_CTRL_GAU_BG_MCLK_EN_MASK |\r\n                                SYSCTL2_GAU_CTRL_GAU_GPADC1_MCLK_EN_MASK | SYSCTL2_GAU_CTRL_GAU_GPADC0_MCLK_EN_MASK |\r\n                                SYSCTL2_GAU_CTRL_GAU_ACOMP_MCLK_EN_MASK;\r\n        }\r\n    }\r\n}\r\n\r\n/*!\r\n * @brief Disable the clock for specific IP.\r\n *\r\n * @param clk  Which clock to disable, see @ref clock_ip_name_t.\r\n */\r\nvoid CLOCK_DisableClock(clock_ip_name_t clk)\r\n{\r\n    uint32_t index;\r\n\r\n    if (clk == kCLOCK_RefClkCauSlp)\r\n    {\r\n        PMU->CAU_SLP_CTRL |= PMU_CAU_SLP_CTRL_CAU_SOC_SLP_CG_MASK;\r\n    }\r\n    else if (((uint32_t)clk & SYS_CLK_GATE_FLAG_MASK) != 0U)\r\n    {\r\n        SYSCTL2->SOURCE_CLK_GATE |= SYS_CLK_GATE_BIT_MASK(clk);\r\n    }\r\n    else\r\n    {\r\n        index = CLK_GATE_ABSTRACT_REG_OFFSET(clk);\r\n        switch (index)\r\n        {\r\n            case CLK_CTL0_PSCCTL0:\r\n                CLKCTL0->PSCCTL0_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));\r\n                break;\r\n            case CLK_CTL0_PSCCTL1:\r\n                CLKCTL0->PSCCTL1_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));\r\n                break;\r\n            case CLK_CTL0_PSCCTL2:\r\n                CLKCTL0->PSCCTL2_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));\r\n                break;\r\n            case CLK_CTL1_PSCCTL0:\r\n                CLKCTL1->PSCCTL0_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));\r\n                break;\r\n            case CLK_CTL1_PSCCTL1:\r\n                CLKCTL1->PSCCTL1_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));\r\n                break;\r\n            case CLK_CTL1_PSCCTL2:\r\n                CLKCTL1->PSCCTL2_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));\r\n                break;\r\n            default:\r\n                assert(false);\r\n                break;\r\n        }\r\n\r\n        if (clk == kCLOCK_Gau)\r\n        {\r\n            SYSCTL2->GAU_CTRL = 0U;\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * @brief   Configure the clock selection muxes.\r\n * @param   connection  : Clock to be configured.\r\n */\r\nvoid CLOCK_AttachClk(clock_attach_id_t connection)\r\n{\r\n    bool final_descriptor = false;\r\n    uint32_t i;\r\n    volatile uint32_t *pClkSel;\r\n\r\n    if (((uint32_t)connection & PMU_TUPLE_MUX_AVAIL) != 0U)\r\n    {\r\n        *PMU_TUPLE_REG(PMU, connection) = PMU_TUPLE_SEL(connection);\r\n    }\r\n    else if (((uint32_t)connection & CLKOUT_TUPLE_MUX_AVAIL) != 0U)\r\n    {\r\n        CLKCTL1->CLKOUTSEL0 = CLKCTL1_CLKOUTSEL0_SEL(((uint32_t)connection >> 4U) & 0x7U);\r\n        CLKCTL1->CLKOUTSEL1 = CLKCTL1_CLKOUTSEL1_SEL(((uint32_t)connection >> 8U) & 0x7U);\r\n        CLKCTL1->CLKOUTSEL2 = CLKCTL1_CLKOUTSEL2_SEL(((uint32_t)connection >> 12U) & 0x7U);\r\n    }\r\n    else\r\n    {\r\n        for (i = 0U; (i < 2U) && (!final_descriptor); i++)\r\n        {\r\n            connection =\r\n                (clock_attach_id_t)(uint32_t)(((uint32_t)connection) >> (i * 16U)); /*!<  pick up next descriptor */\r\n\r\n            if ((((uint32_t)connection) & CLKCTL1_TUPLE_FLAG_MASK) != 0UL)\r\n            {\r\n                pClkSel = CLKCTL_TUPLE_REG(CLKCTL1, connection);\r\n            }\r\n            else\r\n            {\r\n                pClkSel = CLKCTL_TUPLE_REG(CLKCTL0, connection);\r\n            }\r\n\r\n            if ((((uint32_t)connection) & 0xFFCU) != 0UL)\r\n            {\r\n                *pClkSel = CLKCTL_TUPLE_SEL(connection);\r\n            }\r\n            else\r\n            {\r\n                final_descriptor = true;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * @brief   Setup clock dividers.\r\n * @param   name        : Clock divider name\r\n * @param   divider     : Value to be divided.\r\n */\r\nvoid CLOCK_SetClkDiv(clock_div_name_t name, uint32_t divider)\r\n{\r\n    volatile uint32_t *pClkDiv;\r\n\r\n    if ((((uint32_t)name) & CLKCTL1_TUPLE_FLAG_MASK) != 0UL)\r\n    {\r\n        pClkDiv = CLKCTL_TUPLE_REG(CLKCTL1, name);\r\n    }\r\n    else\r\n    {\r\n        pClkDiv = CLKCTL_TUPLE_REG(CLKCTL0, name);\r\n    }\r\n    /* Reset the divider counter */\r\n    *pClkDiv |= 1UL << 29U;\r\n\r\n    if (divider == 0U) /*!<  halt */\r\n    {\r\n        *pClkDiv |= 1UL << 30U;\r\n    }\r\n    else\r\n    {\r\n        *pClkDiv = divider - 1U;\r\n\r\n        while (((*pClkDiv) & 0x80000000U) != 0UL)\r\n        {\r\n        }\r\n    }\r\n}\r\n\r\n/*! brief  Return Frequency of selected clock\r\n *  return Frequency of selected clock\r\n */\r\nuint32_t CLOCK_GetFreq(clock_name_t clockName)\r\n{\r\n    uint32_t freq;\r\n    switch (clockName)\r\n    {\r\n        case kCLOCK_CoreSysClk:\r\n        case kCLOCK_BusClk:\r\n            freq = CLOCK_GetCoreSysClkFreq();\r\n            break;\r\n        case kCLOCK_MclkClk:\r\n            freq = CLOCK_GetMclkClkFreq();\r\n            break;\r\n        default:\r\n            freq = 0U;\r\n            break;\r\n    }\r\n    return freq;\r\n}\r\n\r\n/*! @brief  Return Frequency of High-Freq output of FRO\r\n *  @return Frequency of High-Freq output of FRO\r\n */\r\nuint32_t CLOCK_GetFFroFreq(void)\r\n{\r\n    return CLOCK_GetT3PllMciIrcClkFreq();\r\n}\r\n\r\n/*! @brief  Return Frequency of SFRO\r\n *  @return Frequency of SFRO\r\n */\r\nuint32_t CLOCK_GetSFroFreq(void)\r\n{\r\n    return CLOCK_GetT3PllMci256mClkFreq() / 16U;\r\n}\r\n\r\n/*! @brief  Return Frequency of AUDIO PLL (AVPLL CH1)\r\n *  @return Frequency of AUDIO PLL\r\n */\r\nuint32_t CLOCK_GetAvPllCh1Freq(void)\r\n{\r\n    uint32_t postdiv =\r\n        (SYSCTL2->AVPLL_CTRL5 & SYSCTL2_AVPLL_CTRL5_POSTDIV_C1_MASK) >> SYSCTL2_AVPLL_CTRL5_POSTDIV_C1_SHIFT;\r\n    uint32_t i;\r\n    uint32_t freq = 0U;\r\n\r\n    for (i = 1U; i < ARRAY_SIZE(s_avpllPostDiv); i++)\r\n    {\r\n        if (s_avpllPostDiv[i] == postdiv)\r\n        {\r\n            freq = s_avpllFreq[i];\r\n            break;\r\n        }\r\n    }\r\n\r\n    return freq;\r\n}\r\n\r\n/*! @brief  Return Frequency of AVPLL CH2\r\n *  @return Frequency of AVPLL CH2\r\n */\r\nuint32_t CLOCK_GetAvPllCh2Freq(void)\r\n{\r\n    uint32_t postdiv =\r\n        (SYSCTL2->AVPLL_CTRL11 & SYSCTL2_AVPLL_CTRL11_POSTDIV_C2_MASK) >> SYSCTL2_AVPLL_CTRL11_POSTDIV_C2_SHIFT;\r\n    uint32_t i;\r\n    uint32_t freq = 0U;\r\n\r\n    for (i = 1U; i < ARRAY_SIZE(s_avpllPostDiv); i++)\r\n    {\r\n        if (s_avpllPostDiv[i] == postdiv)\r\n        {\r\n            freq = s_avpllFreq[i];\r\n            break;\r\n        }\r\n    }\r\n\r\n    return freq;\r\n}\r\n\r\nstatic uint32_t CLOCK_GetMainPllClkFreq(void)\r\n{\r\n    return CLOCK_GetTcpuMciClkFreq() / ((CLKCTL0->MAINPLLCLKDIV & CLKCTL0_MAINPLLCLKDIV_DIV_MASK) + 1U);\r\n}\r\n\r\nstatic uint32_t CLOCK_GetAux0PllClkFreq(void)\r\n{\r\n    return CLOCK_GetTcpuMciClkFreq() / ((CLKCTL0->AUX0PLLCLKDIV & CLKCTL0_AUX0PLLCLKDIV_DIV_MASK) + 1U);\r\n}\r\n\r\nstatic uint32_t CLOCK_GetAux1PllClkFreq(void)\r\n{\r\n    return CLOCK_GetT3PllMci213mClkFreq() / ((CLKCTL0->AUX1PLLCLKDIV & CLKCTL0_AUX1PLLCLKDIV_DIV_MASK) + 1U);\r\n}\r\n\r\nstatic uint32_t CLOCK_GetAudioPllClkFreq(void)\r\n{\r\n    return CLOCK_GetAvPllCh1Freq() / ((CLKCTL1->AUDIOPLLCLKDIV & CLKCTL1_AUDIOPLLCLKDIV_DIV_MASK) + 1U);\r\n}\r\n\r\n/* Get MAIN Clk */\r\n/*! @brief  Return Frequency of main clk\r\n *  @return Frequency of main clk\r\n */\r\nuint32_t CLOCK_GetMainClkFreq(void)\r\n{\r\n    uint32_t freq = 0U;\r\n\r\n    switch ((CLKCTL0->MAINCLKSELB) & CLKCTL0_MAINCLKSELB_SEL_MASK)\r\n    {\r\n        case CLKCTL0_MAINCLKSELB_SEL(0):\r\n            switch ((CLKCTL0->MAINCLKSELA) & CLKCTL0_MAINCLKSELA_SEL_MASK)\r\n            {\r\n                case CLKCTL0_MAINCLKSELA_SEL(0):\r\n                    freq = CLOCK_GetSysOscFreq();\r\n                    break;\r\n                case CLKCTL0_MAINCLKSELA_SEL(1):\r\n                    freq = CLOCK_GetFFroFreq() / 4U;\r\n                    break;\r\n                case CLKCTL0_MAINCLKSELA_SEL(2):\r\n                    freq = CLOCK_GetLpOscFreq();\r\n                    break;\r\n                case CLKCTL0_MAINCLKSELA_SEL(3):\r\n                    freq = CLOCK_GetFFroFreq();\r\n                    break;\r\n                default:\r\n                    freq = 0U;\r\n                    break;\r\n            }\r\n            break;\r\n\r\n        case CLKCTL0_MAINCLKSELB_SEL(1):\r\n            freq = CLOCK_GetSFroFreq();\r\n            break;\r\n\r\n        case CLKCTL0_MAINCLKSELB_SEL(2):\r\n            freq = CLOCK_GetMainPllClkFreq();\r\n            break;\r\n\r\n        case CLKCTL0_MAINCLKSELB_SEL(3):\r\n            freq = CLOCK_GetClk32KFreq();\r\n            break;\r\n\r\n        default:\r\n            freq = 0U;\r\n            break;\r\n    }\r\n\r\n    return freq;\r\n}\r\n\r\n/* Get Core/Bus Clk */\r\n/*! @brief  Return Frequency of core/bus clk\r\n *  @return Frequency of core/bus clk\r\n */\r\nuint32_t CLOCK_GetCoreSysClkFreq(void)\r\n{\r\n    return CLOCK_GetMainClkFreq() / ((CLKCTL0->SYSCPUAHBCLKDIV & CLKCTL0_SYSCPUAHBCLKDIV_DIV_MASK) + 1U);\r\n}\r\n\r\n/*! @brief  Return Frequency of systick clk\r\n *  @return Frequency of systick clk\r\n */\r\nuint32_t CLOCK_GetSystickClkFreq(void)\r\n{\r\n    uint32_t freq = 0U;\r\n\r\n    switch (CLKCTL0->SYSTICKFCLKSEL)\r\n    {\r\n        case CLKCTL0_SYSTICKFCLKSEL_SEL(0):\r\n            freq = CLOCK_GetMainClkFreq() / ((CLKCTL0->SYSTICKFCLKDIV & CLKCTL0_SYSTICKFCLKDIV_DIV_MASK) + 1U);\r\n            break;\r\n\r\n        case CLKCTL0_SYSTICKFCLKSEL_SEL(1):\r\n            freq = CLOCK_GetLpOscFreq();\r\n            break;\r\n\r\n        case CLKCTL0_SYSTICKFCLKSEL_SEL(2):\r\n            freq = CLOCK_GetClk32KFreq();\r\n            break;\r\n\r\n        case CLKCTL0_SYSTICKFCLKSEL_SEL(3):\r\n            freq = CLOCK_GetSFroFreq();\r\n            break;\r\n\r\n        default:\r\n            freq = 0U;\r\n            break;\r\n    }\r\n\r\n    return freq;\r\n}\r\n\r\n/* Get FRG Clk */\r\n/*! @brief  Return Input frequency for the Fractional baud rate generator\r\n *  @return Input Frequency for FRG\r\n */\r\nuint32_t CLOCK_GetFRGClock(uint32_t id)\r\n{\r\n    uint32_t freq      = 0U;\r\n    uint32_t frgPllDiv = 1U;\r\n    uint32_t clkSel    = 0U;\r\n    uint32_t frgDiv    = 0U;\r\n    uint32_t frgMul    = 0U;\r\n\r\n    if (id <= 3UL)\r\n    {\r\n        clkSel = CLKCTL1->FLEXCOMM[id].FRGCLKSEL & CLKCTL1_FRGCLKSEL_SEL_MASK;\r\n        frgMul = ((CLKCTL1->FLEXCOMM[id].FRGCTL) & CLKCTL1_FRGCTL_MULT_MASK) >> CLKCTL1_FRGCTL_MULT_SHIFT;\r\n        frgDiv = ((CLKCTL1->FLEXCOMM[id].FRGCTL) & CLKCTL1_FRGCTL_DIV_MASK) >> CLKCTL1_FRGCTL_DIV_SHIFT;\r\n    }\r\n    else if (id == 14UL)\r\n    {\r\n        clkSel = CLKCTL1->FRG14CLKSEL & CLKCTL1_FRG14CLKSEL_SEL_MASK;\r\n        frgMul = ((CLKCTL1->FRG14CTL) & CLKCTL1_FRGCTL_MULT_MASK) >> CLKCTL1_FRGCTL_MULT_SHIFT;\r\n        frgDiv = ((CLKCTL1->FRG14CTL) & CLKCTL1_FRGCTL_DIV_MASK) >> CLKCTL1_FRGCTL_DIV_SHIFT;\r\n    }\r\n    else\r\n    {\r\n        assert(false);\r\n    }\r\n\r\n    switch (clkSel)\r\n    {\r\n        case CLKCTL1_FRGCLKSEL_SEL(0):\r\n            freq = CLOCK_GetMainClkFreq();\r\n            break;\r\n\r\n        case CLKCTL1_FRGCLKSEL_SEL(1):\r\n            frgPllDiv = (CLKCTL1->FRGPLLCLKDIV & CLKCTL1_FRGPLLCLKDIV_DIV_MASK) + 1U;\r\n            freq      = CLOCK_GetMainPllClkFreq() / frgPllDiv;\r\n            break;\r\n\r\n        case CLKCTL1_FRGCLKSEL_SEL(2):\r\n            freq = CLOCK_GetSFroFreq();\r\n            break;\r\n\r\n        case CLKCTL1_FRGCLKSEL_SEL(3):\r\n            freq = CLOCK_GetFFroFreq();\r\n            break;\r\n\r\n        default:\r\n            freq = 0U;\r\n            break;\r\n    }\r\n\r\n    return (uint32_t)(((uint64_t)freq * ((uint64_t)frgDiv + 1ULL)) / (frgMul + frgDiv + 1UL));\r\n}\r\n\r\n/* Set FRG Clk */\r\n/*! @brief  Set output of the Fractional baud rate generator\r\n * @param   config    : Configuration to set to FRGn clock.\r\n */\r\nvoid CLOCK_SetFRGClock(const clock_frg_clk_config_t *config)\r\n{\r\n    uint32_t i = config->num;\r\n\r\n    assert(i <= 14U);\r\n    assert(config->divider == 255U); /* Always set to 0xFF to use with the fractional baudrate generator.*/\r\n\r\n    if (i <= 3UL)\r\n    {\r\n        CLKCTL1->FLEXCOMM[i].FRGCLKSEL = (uint32_t)config->sfg_clock_src;\r\n        CLKCTL1->FLEXCOMM[i].FRGCTL    = (CLKCTL1_FRGCTL_MULT(config->mult) | CLKCTL1_FRGCTL_DIV(config->divider));\r\n    }\r\n    else if (i == 14UL)\r\n    {\r\n        CLKCTL1->FRG14CLKSEL = (uint32_t)config->sfg_clock_src;\r\n        CLKCTL1->FRG14CTL    = (CLKCTL1_FRGCTL_MULT(config->mult) | CLKCTL1_FRGCTL_DIV(config->divider));\r\n    }\r\n    else\r\n    {\r\n        assert(false);\r\n    }\r\n}\r\n\r\n/*! @brief  Return Frequency of DMIC clk\r\n *  @return Frequency of DMIC clk\r\n */\r\nuint32_t CLOCK_GetDmicClkFreq(void)\r\n{\r\n    uint32_t freq = 0U;\r\n\r\n    switch ((CLKCTL1->DMIC0FCLKSEL) & CLKCTL1_DMIC0FCLKSEL_SEL_MASK)\r\n    {\r\n        case CLKCTL1_DMIC0FCLKSEL_SEL(0):\r\n            freq = CLOCK_GetSFroFreq();\r\n            break;\r\n\r\n        case CLKCTL1_DMIC0FCLKSEL_SEL(1):\r\n            freq = CLOCK_GetFFroFreq();\r\n            break;\r\n\r\n        case CLKCTL1_DMIC0FCLKSEL_SEL(2):\r\n            freq = CLOCK_GetAudioPllClkFreq();\r\n            break;\r\n\r\n        case CLKCTL1_DMIC0FCLKSEL_SEL(3):\r\n            freq = CLOCK_GetMclkInClkFreq();\r\n            break;\r\n\r\n        case CLKCTL1_DMIC0FCLKSEL_SEL(4):\r\n            freq = CLOCK_GetLpOscFreq();\r\n            break;\r\n\r\n        case CLKCTL1_DMIC0FCLKSEL_SEL(5):\r\n            freq = CLOCK_GetClk32KFreq();\r\n            break;\r\n\r\n        case CLKCTL1_DMIC0FCLKSEL_SEL(6):\r\n            freq = CLOCK_GetMainClkFreq();\r\n            break;\r\n\r\n        default:\r\n            freq = 0U;\r\n            break;\r\n    }\r\n\r\n    return freq / ((CLKCTL1->DMIC0CLKDIV & CLKCTL1_DMIC0CLKDIV_DIV_MASK) + 1U);\r\n}\r\n\r\n/*! @brief  Return Frequency of LCD clk\r\n *  @return Frequency of LCD clk\r\n */\r\nuint32_t CLOCK_GetLcdClkFreq(void)\r\n{\r\n    uint32_t freq = 0U;\r\n\r\n    switch ((CLKCTL0->LCDFCLKSEL) & CLKCTL0_LCDFCLKSEL_SEL_MASK)\r\n    {\r\n        case CLKCTL0_LCDFCLKSEL_SEL(0):\r\n            freq = CLOCK_GetMainClkFreq();\r\n            break;\r\n\r\n        case CLKCTL0_LCDFCLKSEL_SEL(1):\r\n            freq = CLOCK_GetT3PllMciFlexspiClkFreq();\r\n            break;\r\n\r\n        case CLKCTL0_LCDFCLKSEL_SEL(2):\r\n            freq = CLOCK_GetTcpuMciFlexspiClkFreq();\r\n            break;\r\n\r\n        case CLKCTL0_LCDFCLKSEL_SEL(3):\r\n            freq = CLOCK_GetTddrMciFlexspiClkFreq();\r\n            break;\r\n\r\n        default:\r\n            freq = 0U;\r\n            break;\r\n    }\r\n\r\n    return freq / ((CLKCTL0->LCDFCLKDIV & CLKCTL0_LCDFCLKDIV_DIV_MASK) + 1U);\r\n}\r\n\r\n/*! @brief  Return Frequency of WDT clk\r\n *  @return Frequency of WDT clk\r\n */\r\nuint32_t CLOCK_GetWdtClkFreq(void)\r\n{\r\n    uint32_t freq = 0U;\r\n\r\n    switch ((CLKCTL0->WDT0FCLKSEL) & CLKCTL0_WDT0FCLKSEL_SEL_MASK)\r\n    {\r\n        case CLKCTL0_WDT0FCLKSEL_SEL(0):\r\n            freq = CLOCK_GetLpOscFreq();\r\n            break;\r\n\r\n        case CLKCTL0_WDT0FCLKSEL_SEL(1):\r\n            freq = CLOCK_GetMainClkFreq();\r\n            break;\r\n\r\n        default:\r\n            freq = 0U;\r\n            break;\r\n    }\r\n\r\n    return freq;\r\n}\r\n\r\n/*! @brief  Return Frequency of mclk\r\n *  @return Frequency of mclk clk\r\n */\r\nuint32_t CLOCK_GetMclkClkFreq(void)\r\n{\r\n    uint32_t freq = 0U;\r\n\r\n    switch ((CLKCTL1->AUDIOMCLKSEL) & CLKCTL1_AUDIOMCLKSEL_SEL_MASK)\r\n    {\r\n        case CLKCTL1_AUDIOMCLKSEL_SEL(0):\r\n            freq = CLOCK_GetFFroFreq();\r\n            break;\r\n        case CLKCTL1_AUDIOMCLKSEL_SEL(1):\r\n            freq = CLOCK_GetAudioPllClkFreq();\r\n            break;\r\n        case CLKCTL1_AUDIOMCLKSEL_SEL(2):\r\n            freq = CLOCK_GetMainClkFreq();\r\n            break;\r\n        default:\r\n            freq = 0U;\r\n            break;\r\n    }\r\n    return freq / ((CLKCTL1->AUDIOMCLKDIV & CLKCTL1_AUDIOMCLKDIV_DIV_MASK) + 1U);\r\n}\r\n\r\n/*! @brief  Return Frequency of sct\r\n *  @return Frequency of sct clk\r\n */\r\nuint32_t CLOCK_GetSctClkFreq(void)\r\n{\r\n    uint32_t freq = 0U;\r\n\r\n    switch ((CLKCTL0->SCTFCLKSEL) & CLKCTL0_SCTFCLKSEL_SEL_MASK)\r\n    {\r\n        case CLKCTL0_SCTFCLKSEL_SEL(0):\r\n            freq = CLOCK_GetMainClkFreq();\r\n            break;\r\n\r\n        case CLKCTL0_SCTFCLKSEL_SEL(1):\r\n            freq = CLOCK_GetMainPllClkFreq();\r\n            break;\r\n\r\n        case CLKCTL0_SCTFCLKSEL_SEL(2):\r\n            freq = CLOCK_GetAux0PllClkFreq();\r\n            break;\r\n\r\n        case CLKCTL0_SCTFCLKSEL_SEL(3):\r\n            freq = CLOCK_GetFFroFreq();\r\n            break;\r\n\r\n        case CLKCTL0_SCTFCLKSEL_SEL(4):\r\n            freq = CLOCK_GetAux1PllClkFreq();\r\n            break;\r\n\r\n        case CLKCTL0_SCTFCLKSEL_SEL(5):\r\n            freq = CLOCK_GetAudioPllClkFreq();\r\n            break;\r\n\r\n        default:\r\n            freq = 0U;\r\n            break;\r\n    }\r\n\r\n    return freq / ((CLKCTL0->SCTFCLKDIV & CLKCTL0_SCTFCLKDIV_DIV_MASK) + 1U);\r\n}\r\n\r\n/*! @brief  Return Frequency of Flexcomm functional Clock\r\n *  @param   id    : flexcomm index to get frequency.\r\n *  @return Frequency of Flexcomm functional Clock\r\n */\r\nuint32_t CLOCK_GetFlexCommClkFreq(uint32_t id)\r\n{\r\n    uint32_t freq   = 0U;\r\n    uint32_t clkSel = 0U;\r\n\r\n    if (id <= 3UL)\r\n    {\r\n        clkSel = CLKCTL1->FLEXCOMM[id].FCFCLKSEL;\r\n    }\r\n    else if (id == 14UL)\r\n    {\r\n        clkSel = CLKCTL1->FC14FCLKSEL;\r\n    }\r\n    else\r\n    {\r\n        assert(false);\r\n    }\r\n\r\n    switch (clkSel)\r\n    {\r\n        case CLKCTL1_FCFCLKSEL_SEL(0):\r\n            freq = CLOCK_GetSFroFreq();\r\n            break;\r\n\r\n        case CLKCTL1_FCFCLKSEL_SEL(1):\r\n            freq = CLOCK_GetFFroFreq();\r\n            break;\r\n\r\n        case CLKCTL1_FCFCLKSEL_SEL(2):\r\n            freq = CLOCK_GetAudioPllClkFreq();\r\n            break;\r\n\r\n        case CLKCTL1_FCFCLKSEL_SEL(3):\r\n            freq = CLOCK_GetMclkInClkFreq();\r\n            break;\r\n\r\n        case CLKCTL1_FCFCLKSEL_SEL(4):\r\n            freq = CLOCK_GetFRGClock(id);\r\n            break;\r\n\r\n        default:\r\n            freq = 0U;\r\n            break;\r\n    }\r\n\r\n    return freq;\r\n}\r\n\r\n/*! @brief  Return Frequency of CTimer Clock\r\n *  @param   id    : ctimer index to get frequency.\r\n *  @return Frequency of CTimer Clock\r\n */\r\nuint32_t CLOCK_GetCTimerClkFreq(uint32_t id)\r\n{\r\n    uint32_t freq = 0U;\r\n\r\n    assert(id < 4U);\r\n\r\n    switch ((CLKCTL1->CT32BITFCLKSEL[id]) & CLKCTL1_CT32BITFCLKSEL_SEL_MASK)\r\n    {\r\n        case CLKCTL1_CT32BITFCLKSEL_SEL(0):\r\n            freq = CLOCK_GetMainClkFreq();\r\n            break;\r\n\r\n        case CLKCTL1_CT32BITFCLKSEL_SEL(1):\r\n            freq = CLOCK_GetSFroFreq();\r\n            break;\r\n\r\n        case CLKCTL1_CT32BITFCLKSEL_SEL(2):\r\n            freq = CLOCK_GetFFroFreq();\r\n            break;\r\n\r\n        case CLKCTL1_CT32BITFCLKSEL_SEL(3):\r\n            freq = CLOCK_GetAudioPllClkFreq();\r\n            break;\r\n\r\n        case CLKCTL1_CT32BITFCLKSEL_SEL(4):\r\n            freq = CLOCK_GetMclkInClkFreq();\r\n            break;\r\n\r\n        case CLKCTL1_CT32BITFCLKSEL_SEL(5):\r\n            freq = CLOCK_GetLpOscFreq();\r\n            break;\r\n\r\n        default:\r\n            freq = 0U;\r\n            break;\r\n    }\r\n\r\n    return freq;\r\n}\r\n\r\n/*! @brief  Return Frequency of Utick Clock\r\n *  @return Frequency of Utick Clock\r\n */\r\nuint32_t CLOCK_GetUtickClkFreq(void)\r\n{\r\n    uint32_t freq = 0U;\r\n\r\n    switch ((CLKCTL0->UTICKFCLKSEL) & CLKCTL0_UTICKFCLKSEL_SEL_MASK)\r\n    {\r\n        case CLKCTL0_UTICKFCLKSEL_SEL(0):\r\n            freq = CLOCK_GetLpOscFreq();\r\n            break;\r\n\r\n        case CLKCTL1_CT32BITFCLKSEL_SEL(1):\r\n            freq = CLOCK_GetMainClkFreq();\r\n            break;\r\n\r\n        default:\r\n            freq = 0U;\r\n            break;\r\n    }\r\n\r\n    return freq;\r\n}\r\n\r\n/*! @brief  Return Frequency of FLEXSPI Clock\r\n *  @return Frequency of FLEXSPI.\r\n */\r\nuint32_t CLOCK_GetFlexspiClkFreq(void)\r\n{\r\n    uint32_t freq = 0U;\r\n\r\n    switch ((CLKCTL0->FLEXSPIFCLKSEL) & CLKCTL0_FLEXSPIFCLKSEL_SEL_MASK)\r\n    {\r\n        case CLKCTL0_FLEXSPIFCLKSEL_SEL(0):\r\n            freq = CLOCK_GetMainClkFreq();\r\n            break;\r\n\r\n        case CLKCTL0_FLEXSPIFCLKSEL_SEL(1):\r\n            freq = CLOCK_GetT3PllMciFlexspiClkFreq();\r\n            break;\r\n\r\n        case CLKCTL0_FLEXSPIFCLKSEL_SEL(2):\r\n            freq = CLOCK_GetAux0PllClkFreq();\r\n            break;\r\n\r\n        case CLKCTL0_FLEXSPIFCLKSEL_SEL(3):\r\n            freq = CLOCK_GetFFroFreq();\r\n            break;\r\n\r\n        case CLKCTL0_FLEXSPIFCLKSEL_SEL(4):\r\n            freq = CLOCK_GetAux1PllClkFreq();\r\n            break;\r\n\r\n        case CLKCTL0_FLEXSPIFCLKSEL_SEL(5):\r\n            freq = CLOCK_GetTddrMciFlexspiClkFreq();\r\n            break;\r\n\r\n        case CLKCTL0_FLEXSPIFCLKSEL_SEL(6):\r\n            freq = CLOCK_GetT3PllMci256mClkFreq();\r\n            break;\r\n\r\n        default:\r\n            freq = 0U;\r\n            break;\r\n    }\r\n\r\n    return freq / ((CLKCTL0->FLEXSPIFCLKDIV & CLKCTL0_FLEXSPIFCLKDIV_DIV_MASK) + 1U);\r\n}\r\n\r\n/*! @brief  Return Frequency of USIM Clock\r\n *  @return Frequency of USIM.\r\n */\r\nuint32_t CLOCK_GetUsimClkFreq(void)\r\n{\r\n    uint32_t freq = 0U;\r\n\r\n    switch ((CLKCTL0->USIMFCLKSEL) & CLKCTL0_USIMFCLKSEL_SEL_MASK)\r\n    {\r\n        case CLKCTL0_USIMFCLKSEL_SEL(0):\r\n            freq = CLOCK_GetMainClkFreq();\r\n            break;\r\n\r\n        case CLKCTL0_USIMFCLKSEL_SEL(1):\r\n            freq = CLOCK_GetAudioPllClkFreq();\r\n            break;\r\n\r\n        case CLKCTL0_USIMFCLKSEL_SEL(2):\r\n            freq = CLOCK_GetFFroFreq();\r\n            break;\r\n\r\n        default:\r\n            freq = 0U;\r\n            break;\r\n    }\r\n\r\n    return freq / ((CLKCTL0->USIMFCLKDIV & CLKCTL0_USIMFCLKDIV_DIV_MASK) + 1U);\r\n}\r\n\r\n/*! @brief  Return Frequency of GAU Clock\r\n *  @return Frequency of GAU.\r\n */\r\nuint32_t CLOCK_GetGauClkFreq(void)\r\n{\r\n    uint32_t freq = 0U;\r\n\r\n    switch ((CLKCTL0->GAUFCLKSEL) & CLKCTL0_GAUFCLKSEL_SEL_MASK)\r\n    {\r\n        case CLKCTL0_GAUFCLKSEL_SEL(0):\r\n            freq = CLOCK_GetMainClkFreq();\r\n            break;\r\n\r\n        case CLKCTL0_GAUFCLKSEL_SEL(1):\r\n            freq = CLOCK_GetT3PllMci256mClkFreq();\r\n            break;\r\n\r\n        case CLKCTL0_GAUFCLKSEL_SEL(2):\r\n            freq = CLOCK_GetAvPllCh2Freq();\r\n            break;\r\n\r\n        default:\r\n            freq = 0U;\r\n            break;\r\n    }\r\n\r\n    return freq / ((CLKCTL0->GAUFCLKDIV & CLKCTL0_GAUFCLKDIV_DIV_MASK) + 1U);\r\n}\r\n\r\n/*! @brief  Return Frequency of OSTimer Clock\r\n *  @return Frequency of OSTimer.\r\n */\r\nuint32_t CLOCK_GetOSTimerClkFreq(void)\r\n{\r\n    uint32_t freq = 0U;\r\n\r\n    switch ((CLKCTL1->OSEVENTFCLKSEL) & CLKCTL1_OSEVENTFCLKSEL_SEL_MASK)\r\n    {\r\n        case CLKCTL1_OSEVENTFCLKSEL_SEL(0):\r\n            freq = CLOCK_GetLpOscFreq();\r\n            break;\r\n\r\n        case CLKCTL1_OSEVENTFCLKSEL_SEL(1):\r\n            freq = CLOCK_GetClk32KFreq();\r\n            break;\r\n\r\n        case CLKCTL1_OSEVENTFCLKSEL_SEL(2):\r\n            freq = CLOCK_GetCoreSysClkFreq();\r\n            break;\r\n\r\n        case CLKCTL1_OSEVENTFCLKSEL_SEL(3):\r\n            freq = CLOCK_GetMainClkFreq();\r\n            break;\r\n\r\n        default:\r\n            freq = 0U;\r\n            break;\r\n    }\r\n\r\n    return freq;\r\n}\r\n\r\n/*! @brief  Enables and disables 32kHz XTAL\r\n *  @param  enable : true to enable 32k XTAL clock, false to disable clock\r\n */\r\nvoid CLOCK_EnableXtal32K(bool enable)\r\n{\r\n    if (enable)\r\n    {\r\n        AON_SOC_CIU->PAD_PU_PD_EN1 &=\r\n            ~(AON_SOC_CIU_PAD_PU_PD_EN1_GPIO22_PU_PD_EN_MASK | AON_SOC_CIU_PAD_PU_PD_EN1_GPIO23_PU_PD_EN_MASK);\r\n        AON_SOC_CIU->MCI_IOMUX_EN0 |= (3UL << 22);\r\n        PMU->XTAL32K_CTRL |= PMU_XTAL32K_CTRL_X32K_EN_MASK;\r\n        while ((PMU->XTAL32K_CTRL & PMU_XTAL32K_CTRL_X32K_RDY_MASK) == 0U)\r\n        {\r\n        }\r\n    }\r\n    else\r\n    {\r\n        PMU->XTAL32K_CTRL &= ~PMU_XTAL32K_CTRL_X32K_EN_MASK;\r\n    }\r\n}\r\n\r\n/*! @brief  Enables and disables RTC 32KHz\r\n *  @param  enable : true to enable 32k RTC clock, false to disable clock\r\n */\r\nvoid CLOCK_EnableRtc32K(bool enable)\r\n{\r\n    if (enable)\r\n    {\r\n        CLKCTL0->CLK32KHZCTL0 |= CLKCTL0_CLK32KHZCTL0_ENA_32KHZ_MASK;\r\n    }\r\n    else\r\n    {\r\n        CLKCTL0->CLK32KHZCTL0 &= ~CLKCTL0_CLK32KHZCTL0_ENA_32KHZ_MASK;\r\n    }\r\n}\r\n\r\nstatic uint32_t CLOCK_CfgTcpuRefClk(uint32_t targetHz, clock_tcpu_flexspi_div_t div)\r\n{\r\n    uint32_t freq  = 0UL;\r\n    uint32_t steps = 0UL;\r\n\r\n    if (CLK_XTAL_OSC_CLK == CLK_XTAL_OSC_CLK_40000KHZ)\r\n    {\r\n        /* Fbdiv from 75 to 96, step 40MHz */\r\n        freq = MAX(targetHz, CLOCK_MHZ(3000UL));\r\n        freq = MIN(freq, CLOCK_MHZ(3840UL));\r\n        /* Find the closest freq to target */\r\n        steps = (freq + CLOCK_MHZ(20UL) - CLOCK_MHZ(3000UL)) / CLOCK_MHZ(40UL);\r\n        freq  = CLOCK_MHZ(3000UL) + steps * CLOCK_MHZ(40UL);\r\n        /* Get step register value */\r\n        steps += 75UL;\r\n    }\r\n    else if (CLK_XTAL_OSC_CLK == CLK_XTAL_OSC_CLK_38400KHZ)\r\n    {\r\n        /* Fbdiv from 78 to 100, step 38.4MHz */\r\n        freq = MAX(targetHz, CLOCK_KHZ(2995200UL));\r\n        freq = MIN(freq, CLOCK_MHZ(3840UL));\r\n        /* Find the closest freq to target */\r\n        steps = (freq + CLOCK_KHZ(19200UL) - CLOCK_KHZ(2995200UL)) / CLOCK_KHZ(38400UL);\r\n        freq  = CLOCK_KHZ(2995200UL) + steps * CLOCK_KHZ(38400UL);\r\n        /* Get step register value */\r\n        steps += 78UL;\r\n    }\r\n    else\r\n    {\r\n        assert(false);\r\n    }\r\n\r\n    SYSCTL2->PLL_CTRL =\r\n        (SYSCTL2->PLL_CTRL & ~(SYSCTL2_PLL_CTRL_TCPU_FBDIV_MASK | SYSCTL2_PLL_CTRL_TCPU_FLEXSPI_CLK_SEL_MASK)) |\r\n        SYSCTL2_PLL_CTRL_TCPU_FBDIV(steps) | SYSCTL2_PLL_CTRL_TCPU_FLEXSPI_CLK_SEL(div);\r\n\r\n    return freq;\r\n}\r\n\r\n/*! @brief  Initialize TCPU FVCO to target frequency.\r\n *          For 40MHz XTAL, FVCO ranges from 3000MHz to 3840MHz.\r\n            For 38.4MHz XTAL, FVCO ranges from 2995.2MHz to 3840MHz\r\n *  @param  targetHz  : Target FVCO frequency in Hz.\r\n *  @param  div       : Divider for tcpu_mci_flexspi_clk.\r\n *  @return Actual FVCO frequency in Hz.\r\n */\r\nuint32_t CLOCK_InitTcpuRefClk(uint32_t targetHz, clock_tcpu_flexspi_div_t div)\r\n{\r\n    uint32_t freq;\r\n\r\n    if ((SYSCTL2->PLL_CTRL & SYSCTL2_PLL_CTRL_TCPU_PDB_MASK) != 0U)\r\n    {\r\n        CLOCK_DeinitTcpuRefClk();\r\n    }\r\n\r\n    SYSPLL_TCPU->TCPU_CTRL_ONE_REG = 0x74U;\r\n    freq                           = CLOCK_CfgTcpuRefClk(targetHz, div);\r\n\r\n    /* Set PDB */\r\n    SYSCTL2->PLL_CTRL |= SYSCTL2_PLL_CTRL_TCPU_PDB_MASK;\r\n    /* Wait PLL lock */\r\n    while ((SYSCTL2->PLL_CTRL & SYSCTL2_PLL_CTRL_TCPU_LOCK_MASK) == 0U)\r\n    {\r\n    }\r\n\r\n    return freq;\r\n}\r\n\r\n/*! brief  Deinit the TCPU reference clock.\r\n *  param  none.\r\n */\r\nvoid CLOCK_DeinitTcpuRefClk(void)\r\n{\r\n    /* Gate all TCPU output clocks */\r\n    SYSCTL2->SOURCE_CLK_GATE |=\r\n        SYSCTL2_SOURCE_CLK_GATE_TCPU_MCI_CLK_CG_MASK | SYSCTL2_SOURCE_CLK_GATE_TCPU_MCI_FLEXSPI_CLK_CG_MASK;\r\n    /* Clear PDB */\r\n    SYSCTL2->PLL_CTRL &= ~SYSCTL2_PLL_CTRL_TCPU_PDB_MASK;\r\n    /* Wait PLL lock */\r\n    /* Ensure SystemCoreClock is up to date for accurate CLOCK_DelayUs() */\r\n    SystemCoreClockUpdate();\r\n    CLOCK_DelayUs(1U);\r\n\r\n    CLOCK_DisableClock(kCLOCK_RefClkTcpu);\r\n}\r\n\r\n/*! @brief  Initialize the TDDR reference clock.\r\n *  @param  div       : Divider for tddr_mci_flexspi_clk.\r\n */\r\nvoid CLOCK_InitTddrRefClk(clock_tddr_flexspi_div_t div)\r\n{\r\n    if ((SYSCTL2->PLL_CTRL & SYSCTL2_PLL_CTRL_TDDR_PDB_MASK) != 0U)\r\n    {\r\n        CLOCK_DeinitTddrRefClk();\r\n    }\r\n\r\n    REG_SYSPLL_TDDR->TDDR_CTRL_ONE_REG = 0x74U;\r\n    SYSCTL2->PLL_CTRL =\r\n        (SYSCTL2->PLL_CTRL & ~SYSCTL2_PLL_CTRL_TDDR_FLEXSPI_CLK_SEL_MASK) | SYSCTL2_PLL_CTRL_TDDR_FLEXSPI_CLK_SEL(div);\r\n\r\n    /* Set PDB */\r\n    SYSCTL2->PLL_CTRL |= SYSCTL2_PLL_CTRL_TDDR_PDB_MASK;\r\n    /* Wait PLL lock */\r\n    while ((SYSCTL2->PLL_CTRL & SYSCTL2_PLL_CTRL_TDDR_LOCK_MASK) == 0U)\r\n    {\r\n    }\r\n}\r\n\r\n/*! brief  Deinit the TDDR reference clock.\r\n *  param  none.\r\n */\r\nvoid CLOCK_DeinitTddrRefClk(void)\r\n{\r\n    /* Gate all TDDR output clocks */\r\n    SYSCTL2->SOURCE_CLK_GATE |=\r\n        SYSCTL2_SOURCE_CLK_GATE_TDDR_MCI_ENET_CLK_CG_MASK | SYSCTL2_SOURCE_CLK_GATE_TDDR_MCI_FLEXSPI_CLK_CG_MASK;\r\n    /* Clear PDB */\r\n    SYSCTL2->PLL_CTRL &= ~SYSCTL2_PLL_CTRL_TDDR_PDB_MASK;\r\n    /* Wait PLL lock */\r\n    /* Ensure SystemCoreClock is up to date for accurate CLOCK_DelayUs() */\r\n    SystemCoreClockUpdate();\r\n    CLOCK_DelayUs(1U);\r\n\r\n    CLOCK_DisableClock(kCLOCK_RefClkTddr);\r\n}\r\n\r\n/*! @brief  Initialize the T3 reference clock.\r\n *  @param  cnfg       : t3pll_mci_48_60m_irc clock configuration\r\n */\r\nvoid CLOCK_InitT3RefClk(clock_t3_mci_irc_config_t cnfg)\r\n{\r\n    if ((SYSCTL2->PLL_CTRL & SYSCTL2_PLL_CTRL_T3_PDB_MASK) != 0U)\r\n    {\r\n        CLOCK_DeinitT3RefClk();\r\n    }\r\n\r\n    if (cnfg == kCLOCK_T3MciIrc60m)\r\n    {\r\n        SYSPLL_T3->CLKTREE_CTRL_SIX_REG = 0x5U;\r\n    }\r\n    else\r\n    {\r\n        SYSPLL_T3->CLKTREE_CTRL_SIX_REG = 0xAU;\r\n    }\r\n    /* Set PDB */\r\n    SYSCTL2->PLL_CTRL |= SYSCTL2_PLL_CTRL_T3_PDB_MASK;\r\n    /* Wait PLL lock */\r\n    while ((SYSCTL2->PLL_CTRL & SYSCTL2_PLL_CTRL_T3_LOCK_MASK) == 0U)\r\n    {\r\n    }\r\n}\r\n\r\n/*! brief  Deinit the T3 reference clock.\r\n *  param  none.\r\n */\r\nvoid CLOCK_DeinitT3RefClk(void)\r\n{\r\n    /* Ensure SystemCoreClock is up to date for accurate CLOCK_DelayUs() */\r\n    SystemCoreClockUpdate();\r\n    /* Gate all T3 output clocks */\r\n    SYSCTL2->SOURCE_CLK_GATE |=\r\n        SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_48_60M_IRC_CG_MASK | SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_256M_CG_MASK |\r\n        SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_213P3M_CG_MASK | SYSCTL2_SOURCE_CLK_GATE_T3PLL_MCI_FLEXSPI_CLK_CG_MASK;\r\n    /* Clear PDB */\r\n    SYSCTL2->PLL_CTRL &= ~SYSCTL2_PLL_CTRL_T3_PDB_MASK;\r\n\r\n    /* Wait PLL lock */\r\n    CLOCK_DelayUs(1U);\r\n}\r\n\r\nstatic void CLOCK_ConfigAvPll(void)\r\n{\r\n    uint32_t fbdiv          = 0x51U;\r\n    uint32_t freq_offset_c8 = 0x0U;\r\n    uint32_t pll_calclk_div = 0x14U;\r\n    uint32_t refdiv         = 0x2U;\r\n    uint32_t ext_speed      = 0x2U;\r\n    uint32_t intpi          = 0x3U;\r\n    uint32_t intpr          = 0x4U;\r\n    uint32_t icp            = 0x5U;\r\n\r\n    if (CLK_XTAL_OSC_CLK == CLK_XTAL_OSC_CLK_38400KHZ)\r\n    {\r\n        fbdiv          = 0x54U;\r\n        freq_offset_c8 = 0x4924U;\r\n        pll_calclk_div = 0x13U;\r\n    }\r\n\r\n    SYSCTL2->AVPLL_CTRL2 =\r\n        (SYSCTL2->AVPLL_CTRL2 & ~(SYSCTL2_AVPLL_CTRL2_ICP_MASK | SYSCTL2_AVPLL_CTRL2_INTPI_MASK |\r\n                                  SYSCTL2_AVPLL_CTRL2_INTPR_MASK | SYSCTL2_AVPLL_CTRL2_PLL_CALCLK_DIV_MASK)) |\r\n        SYSCTL2_AVPLL_CTRL2_ICP(icp) | SYSCTL2_AVPLL_CTRL2_INTPI(intpi) | SYSCTL2_AVPLL_CTRL2_INTPR(intpr) |\r\n        SYSCTL2_AVPLL_CTRL2_PLL_CALCLK_DIV(pll_calclk_div);\r\n\r\n    SYSCTL2->AVPLL_CTRL3 =\r\n        (SYSCTL2->AVPLL_CTRL3 & ~SYSCTL2_AVPLL_CTRL3_REFDIV_MASK) | SYSCTL2_AVPLL_CTRL3_REFDIV(refdiv);\r\n\r\n    SYSCTL2->AVPLL_CTRL0 =\r\n        (SYSCTL2->AVPLL_CTRL0 & ~SYSCTL2_AVPLL_CTRL0_EXT_SPEED_MASK) | SYSCTL2_AVPLL_CTRL0_EXT_SPEED(ext_speed);\r\n\r\n    SYSCTL2->AVPLL_CTRL1 = (SYSCTL2->AVPLL_CTRL1 & ~SYSCTL2_AVPLL_CTRL1_FBDIV_MASK) | SYSCTL2_AVPLL_CTRL1_FBDIV(fbdiv);\r\n\r\n    SYSCTL2->AVPLL_CTRL8 =\r\n        (SYSCTL2->AVPLL_CTRL8 & ~(SYSCTL2_AVPLL_CTRL8_EN_LP_C8_MASK | SYSCTL2_AVPLL_CTRL8_FREQ_OFFSET_C8_MASK)) |\r\n        SYSCTL2_AVPLL_CTRL8_FREQ_OFFSET_C8(freq_offset_c8);\r\n}\r\n\r\nstatic void CLOCK_ConfigAvPllCh1(clock_avpll_ch_freq_t ch1Freq)\r\n{\r\n    if (ch1Freq != kCLOCK_AvPllChUnchanged)\r\n    {\r\n        SYSCTL2->AVPLL_CTRL2 = (SYSCTL2->AVPLL_CTRL2 & ~SYSCTL2_AVPLL_CTRL2_POSTDIV_0P5_C1_MASK) |\r\n                               SYSCTL2_AVPLL_CTRL2_POSTDIV_0P5_C1(s_avpllPostDiv0p5[(uint32_t)ch1Freq]);\r\n\r\n        SYSCTL2->AVPLL_CTRL1 = (SYSCTL2->AVPLL_CTRL1 & ~SYSCTL2_AVPLL_CTRL1_FREQ_OFFSET_C1_MASK) |\r\n                               SYSCTL2_AVPLL_CTRL1_FREQ_OFFSET_C1(s_avpllFreqOff[(uint32_t)ch1Freq]);\r\n\r\n        SYSCTL2->AVPLL_CTRL5 = (SYSCTL2->AVPLL_CTRL5 & ~SYSCTL2_AVPLL_CTRL5_POSTDIV_C1_MASK) |\r\n                               SYSCTL2_AVPLL_CTRL5_POSTDIV_C1(s_avpllPostDiv[(uint32_t)ch1Freq]);\r\n    }\r\n}\r\n\r\nstatic void CLOCK_ConfigAvPllCh2(clock_avpll_ch_freq_t ch2Freq)\r\n{\r\n    if (ch2Freq != kCLOCK_AvPllChUnchanged)\r\n    {\r\n        SYSCTL2->AVPLL_CTRL12 = (SYSCTL2->AVPLL_CTRL12 & ~SYSCTL2_AVPLL_CTRL12_POSTDIV_0P5_C2_MASK) |\r\n                                SYSCTL2_AVPLL_CTRL12_POSTDIV_0P5_C2(s_avpllPostDiv0p5[(uint32_t)ch2Freq]);\r\n\r\n        SYSCTL2->AVPLL_CTRL11 = SYSCTL2_AVPLL_CTRL11_FREQ_OFFSET_C2(s_avpllFreqOff[(uint32_t)ch2Freq]) |\r\n                                SYSCTL2_AVPLL_CTRL11_POSTDIV_C2(s_avpllPostDiv[(uint32_t)ch2Freq]);\r\n    }\r\n}\r\n\r\nstatic void CLOCK_PowerUpAnaGrp(void)\r\n{\r\n    uint32_t anaGrpPu = SYSCTL2->ANA_GRP_CTRL;\r\n\r\n    if ((anaGrpPu & SYSCTL2_ANA_GRP_CTRL_PU_AG_MASK) == 0U)\r\n    {\r\n        SYSCTL2->ANA_GRP_CTRL = anaGrpPu | SYSCTL2_ANA_GRP_CTRL_PU_AG_MASK;\r\n        CLOCK_DelayUs(50U); /* Delay 50us */\r\n    }\r\n}\r\n\r\nstatic void CLOCK_PowerDownAnaGrp(void)\r\n{\r\n    uint32_t anaGrpPu = SYSCTL2->ANA_GRP_CTRL;\r\n\r\n    if ((anaGrpPu & SYSCTL2_ANA_GRP_CTRL_PU_AG_MASK) != 0U)\r\n    {\r\n        SYSCTL2->ANA_GRP_CTRL = anaGrpPu & ~SYSCTL2_ANA_GRP_CTRL_PU_AG_MASK;\r\n    }\r\n}\r\n\r\n/*! @brief  Initialize the AVPLL.\r\n *  @param  enableCh1  : Enable AVPLL channel1\r\n *  @param  enableCh2  : Enable AVPLL channel2\r\n *  @param  enableCali : Enable AVPLL calibration\r\n */\r\nvoid CLOCK_EnableAvPllCh(bool enableCh1, bool enableCh2, bool enableCali)\r\n{\r\n    uint32_t calDoneDelay;\r\n\r\n    /* Step 3: Pull up PU_C1 PU_C2 */\r\n    if (enableCh1)\r\n    {\r\n        SYSCTL2->AVPLL_CTRL2 |= SYSCTL2_AVPLL_CTRL2_PU_C1_MASK;\r\n    }\r\n    if (enableCh2)\r\n    {\r\n        SYSCTL2->AVPLL_CTRL12 |= SYSCTL2_AVPLL_CTRL12_PU_C2_MASK;\r\n    }\r\n\r\n    /* Pull up freq_offset_c8_ready */\r\n    SYSCTL2->AVPLL_CTRL8 |= SYSCTL2_AVPLL_CTRL8_FREQ_OFFSET_READY_C8_MASK;\r\n    CLOCK_DelayUs(3U); /* Delay 516*FVCO*4, about 3us */\r\n\r\n    /* Step 4: Pull low freq_offset_c8_ready */\r\n    SYSCTL2->AVPLL_CTRL8 &= ~SYSCTL2_AVPLL_CTRL8_FREQ_OFFSET_READY_C8_MASK;\r\n    CLOCK_DelayUs(2U); /* Delay more than 1us, recommended to delay 2us */\r\n\r\n    /* Step 5: Pull low RESET_C8 */\r\n    SYSCTL2->AVPLL_CTRL8 &= ~SYSCTL2_AVPLL_CTRL8_AVPLL_RESET_C8_MASK;\r\n    CLOCK_DelayUs(5U); /* Delay 5us. */\r\n\r\n    if (enableCali)\r\n    {\r\n        /* Step 6: Cali start */\r\n        SYSCTL2->AVPLL_CTRL2 |= SYSCTL2_AVPLL_CTRL2_PLL_CAL_START_MASK;\r\n    }\r\n    CLOCK_DelayUs(5U); /* Delay 5us */\r\n\r\n    /* Step 7: Pull low RESET_C1 RESET_C2 */\r\n    if (enableCh1)\r\n    {\r\n        SYSCTL2->AVPLL_CTRL8 &= ~SYSCTL2_AVPLL_CTRL8_AVPLL_RESET_C1_MASK;\r\n    }\r\n    if (enableCh2)\r\n    {\r\n        SYSCTL2->AVPLL_CTRL13 &= ~SYSCTL2_AVPLL_CTRL13_AVPLL_RESET_C2_MASK;\r\n    }\r\n    CLOCK_DelayUs(2U); /* Delay 516*FVCO , about 2us */\r\n\r\n    /* Step 8: Pull high freq_offset_ready_c1/c2 */\r\n    if (enableCh1)\r\n    {\r\n        SYSCTL2->AVPLL_CTRL1 |= SYSCTL2_AVPLL_CTRL1_FREQ_OFFSET_READY_C1_MASK;\r\n    }\r\n    if (enableCh2)\r\n    {\r\n        SYSCTL2->AVPLL_CTRL12 |= SYSCTL2_AVPLL_CTRL12_FREQ_OFFSET_READY_C2_MASK;\r\n    }\r\n    CLOCK_DelayUs(2U); /* Delay 516*FVCO , about 2us */\r\n\r\n    /* Step 9: pull low freq_offset_ready_c1/2 */\r\n    if (enableCh1)\r\n    {\r\n        SYSCTL2->AVPLL_CTRL1 &= ~SYSCTL2_AVPLL_CTRL1_FREQ_OFFSET_READY_C1_MASK;\r\n    }\r\n    if (enableCh2)\r\n    {\r\n        SYSCTL2->AVPLL_CTRL12 &= ~SYSCTL2_AVPLL_CTRL12_FREQ_OFFSET_READY_C2_MASK;\r\n    }\r\n    CLOCK_DelayUs(12U); /* Delay more than 10us, recommended 12 us */\r\n\r\n    if (enableCali)\r\n    {\r\n        /* Step 10: wait cali done */\r\n        calDoneDelay = 0U;\r\n        while (\r\n            ((SYSCTL2->AVPLL_CTRL7 & SYSCTL2_AVPLL_CTRL7_PLL_CAL_DONE_MASK) != SYSCTL2_AVPLL_CTRL7_PLL_CAL_DONE_MASK) &&\r\n            (calDoneDelay < 600U)) /* Wait cali done or 600us */\r\n        {\r\n            calDoneDelay += 10U;\r\n            CLOCK_DelayUs(10U);\r\n        }\r\n        CLOCK_DelayUs(10U);\r\n\r\n        /* Step 11: clear cali start */\r\n        SYSCTL2->AVPLL_CTRL2 &= ~SYSCTL2_AVPLL_CTRL2_PLL_CAL_START_MASK;\r\n    }\r\n}\r\n\r\n/*! @brief  Disable the AVPLL.\r\n *  @param  disableCh1  : Disable AVPLL channel1, channel unchanged on false.\r\n *  @param  disableCh2  : Disable AVPLL channel2, channel unchanged on false.\r\n */\r\nvoid CLOCK_DisableAvPllCh(bool disableCh1, bool disableCh2)\r\n{\r\n    if (disableCh1)\r\n    {\r\n        /* Pull up RESET_C1 */\r\n        SYSCTL2->AVPLL_CTRL8 |= SYSCTL2_AVPLL_CTRL8_AVPLL_RESET_C1_MASK;\r\n        /* Pull low PU_C1 */\r\n        SYSCTL2->AVPLL_CTRL2 &= ~SYSCTL2_AVPLL_CTRL2_PU_C1_MASK;\r\n    }\r\n\r\n    if (disableCh2)\r\n    {\r\n        /* Pull up RESET_C2 */\r\n        SYSCTL2->AVPLL_CTRL13 |= SYSCTL2_AVPLL_CTRL13_AVPLL_RESET_C2_MASK;\r\n        /* Pull low PU_C2 */\r\n        SYSCTL2->AVPLL_CTRL12 &= ~SYSCTL2_AVPLL_CTRL12_PU_C2_MASK;\r\n    }\r\n}\r\n\r\n/*! @brief  Initialize the AVPLL.\r\n *  @param  cnfg       : AVPLL clock configuration\r\n */\r\nvoid CLOCK_InitAvPll(const clock_avpll_config_t *cnfg)\r\n{\r\n    assert(cnfg);\r\n\r\n    if ((SYSCTL2->AVPLL_CTRL2 & SYSCTL2_AVPLL_CTRL2_PU_MASK) != 0U)\r\n    {\r\n        /* Pull down AVPLL power for initialization. */\r\n        CLOCK_DeinitAvPll();\r\n    }\r\n\r\n    /* Ensure SystemCoreClock is up to date for accurate CLOCK_DelayUs() */\r\n    SystemCoreClockUpdate();\r\n\r\n    /* Ensure ANA_GRP is powered up */\r\n    CLOCK_PowerUpAnaGrp();\r\n\r\n    /* Configure CH1/CH2 frequency */\r\n    CLOCK_ConfigAvPll();\r\n    CLOCK_ConfigAvPllCh1(cnfg->ch1Freq);\r\n    CLOCK_ConfigAvPllCh2(cnfg->ch2Freq);\r\n\r\n    /* Step 1: Pull up PU */\r\n    SYSCTL2->AVPLL_CTRL2 |= SYSCTL2_AVPLL_CTRL2_PU_MASK;\r\n    CLOCK_DelayUs(15U); /* Wait more than 10us, recommended to delay 15us */\r\n\r\n    /* Step 2: Pull low RESET */\r\n    SYSCTL2->AVPLL_CTRL8 &= ~SYSCTL2_AVPLL_CTRL8_AVPLL_RESET_MASK;\r\n    CLOCK_DelayUs(15U); /* Wait more than 10us, recommended to delay 15us */\r\n\r\n    /* Enable channels */\r\n    CLOCK_EnableAvPllCh(true, true, cnfg->enableCali);\r\n}\r\n\r\n/*! @brief  Deinit the AVPLL.\r\n */\r\nvoid CLOCK_DeinitAvPll(void)\r\n{\r\n    CLOCK_DisableAvPllCh(true, true);\r\n\r\n    /* Pull up RESET */\r\n    SYSCTL2->AVPLL_CTRL8 |= SYSCTL2_AVPLL_CTRL8_AVPLL_RESET_MASK;\r\n    /* Pull up RESET_C8 */\r\n    SYSCTL2->AVPLL_CTRL8 |= SYSCTL2_AVPLL_CTRL8_AVPLL_RESET_C8_MASK;\r\n    /* Pull low PU */\r\n    SYSCTL2->AVPLL_CTRL2 &= ~SYSCTL2_AVPLL_CTRL2_PU_MASK;\r\n\r\n    /* Disable REFCLK AUD. */\r\n    CLOCK_DisableClock(kCLOCK_RefClkAud);\r\n\r\n    if ((SYSCTL2->USB_CTRL & SYSCTL2_USB_CTRL_USB_PU_MASK) == 0U)\r\n    {\r\n        /* USB also not used, ANA_GRP can be powered down. */\r\n        CLOCK_PowerDownAnaGrp();\r\n    }\r\n}\r\n\r\n/*! @brief  Update the AVPLL channel configuration. Enable/Disable state keeps unchanged.\r\n *  @param  ch1Freq  : Channel 1 frequency to set.\r\n *  @param  ch2Freq  : Channel 2 frequency to set.\r\n *  @param  enableCali : Enable AVPLL calibration.\r\n */\r\nvoid CLOCK_ConfigAvPllCh(clock_avpll_ch_freq_t ch1Freq, clock_avpll_ch_freq_t ch2Freq, bool enableCali)\r\n{\r\n    bool needRenableCh1, needRenableCh2;\r\n\r\n    if ((ch1Freq == kCLOCK_AvPllChUnchanged) && (ch2Freq == kCLOCK_AvPllChUnchanged))\r\n    {\r\n        /* Nothing to change. */\r\n        return;\r\n    }\r\n\r\n    /* If channel enabled and need to update configuration, need to reenable. */\r\n    needRenableCh1 =\r\n        ((SYSCTL2->AVPLL_CTRL2 & SYSCTL2_AVPLL_CTRL2_PU_C1_MASK) != 0U) && (ch1Freq != kCLOCK_AvPllChUnchanged);\r\n    needRenableCh2 =\r\n        ((SYSCTL2->AVPLL_CTRL12 & SYSCTL2_AVPLL_CTRL12_PU_C2_MASK) != 0U) && (ch2Freq != kCLOCK_AvPllChUnchanged);\r\n\r\n    /* Disable channel before update configuration. */\r\n    CLOCK_DisableAvPllCh(needRenableCh1, needRenableCh2);\r\n\r\n    CLOCK_ConfigAvPll();\r\n\r\n    if (ch1Freq != kCLOCK_AvPllChUnchanged)\r\n    {\r\n        CLOCK_ConfigAvPllCh1(ch1Freq);\r\n    }\r\n    if (ch2Freq != kCLOCK_AvPllChUnchanged)\r\n    {\r\n        CLOCK_ConfigAvPllCh2(ch2Freq);\r\n    }\r\n\r\n    /* Reenable channel if needed. */\r\n    CLOCK_EnableAvPllCh(needRenableCh1, needRenableCh2, enableCali);\r\n}\r\n\r\n/*! @brief Enable USB HS PHY PLL clock.\r\n *\r\n * This function enables USB HS PHY PLL clock.\r\n */\r\nvoid CLOCK_EnableUsbhsPhyClock(void)\r\n{\r\n    uint32_t value;\r\n    value          = SYSCTL2->USB_CTRL;\r\n    uint32_t delay = 100000;\r\n\r\n    /* Ensure SystemCoreClock is up to date for accurate CLOCK_DelayUs() */\r\n    SystemCoreClockUpdate();\r\n\r\n    /* Ensure ANA_GRP is powered on */\r\n    SYSCTL2->ANA_GRP_CTRL |= SYSCTL2_ANA_GRP_CTRL_PU_XTL_MASK;\r\n    CLOCK_PowerUpAnaGrp();\r\n\r\n    /* Reset USB PHY */\r\n    value |=\r\n        SYSCTL2_USB_CTRL_SOFT_PHY_RESET_MASK | SYSCTL2_USB_CTRL_PHY_RESET_SEL_MASK; /* Use soft reset to reset PHY */\r\n    SYSCTL2->USB_CTRL =\r\n        value & ~(SYSCTL2_USB_CTRL_USB_PU_PLL_MASK | SYSCTL2_USB_CTRL_USB_PU_MASK | SYSCTL2_USB_CTRL_USB_PU_OTG_MASK);\r\n    __NOP();\r\n    value &= ~(SYSCTL2_USB_CTRL_SOFT_PHY_RESET_MASK |\r\n               SYSCTL2_USB_CTRL_PHY_RESET_SEL_MASK); /* It is an active high reset; this bit is inverted */\r\n    SYSCTL2->USB_CTRL = value;\r\n    /* Power up PHY OTG detection circuit */\r\n    USBOTG->PHY_REG_OTG_CONTROL |= USBC_PHY_REG_CHGDTC_CONTRL_1_PD_EN_MASK;\r\n    /* Analog power up through pin */\r\n    value |= SYSCTL2_USB_CTRL_USB_PU_MASK | SYSCTL2_USB_CTRL_USB_PU_OTG_MASK;\r\n    SYSCTL2->USB_CTRL = value;\r\n    /* Power up PLL via pin; raising edge will auto trigger calibration */\r\n    value |= SYSCTL2_USB_CTRL_USB_PU_PLL_MASK;\r\n    SYSCTL2->USB_CTRL = value;\r\n    while ((delay-- > 0U) && ((USBOTG->PLL_CONTROL_0 & USBC_PLL_CONTROL_0_PLL_READY_MASK) == 0U))\r\n    {\r\n    }\r\n}\r\n\r\n/*! @brief Disable USB HS PHY PLL clock.\r\n *\r\n * This function disables USB HS PHY PLL clock.\r\n */\r\nvoid CLOCK_DisableUsbhsPhyClock(void)\r\n{\r\n    uint32_t value;\r\n    value = SYSCTL2->USB_CTRL;\r\n    /* Power down PHY OTG detection circuit */\r\n    USBOTG->PHY_REG_OTG_CONTROL |= USBC_PHY_REG_CHGDTC_CONTRL_1_PD_EN_MASK;\r\n    /* Analog power down through pin */\r\n    value &= ~SYSCTL2_USB_CTRL_USB_PU_MASK & ~SYSCTL2_USB_CTRL_USB_PU_OTG_MASK;\r\n    SYSCTL2->USB_CTRL = value;\r\n    /* Power down PLL via pin */\r\n    value &= ~SYSCTL2_USB_CTRL_USB_PU_PLL_MASK;\r\n    SYSCTL2->USB_CTRL = value;\r\n    if ((SYSCTL2->AVPLL_CTRL2 & SYSCTL2_AVPLL_CTRL2_PU_MASK) == 0U)\r\n    {\r\n        /* AVPLL also not used, ANA_GRP can be powered down. */\r\n        CLOCK_PowerDownAnaGrp();\r\n    }\r\n    SYSCTL2->ANA_GRP_CTRL &= ~SYSCTL2_ANA_GRP_CTRL_PU_XTL_MASK;\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_clock.h",
    "content": "/*\r\n * Copyright 2020-2024, NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef _FSL_CLOCK_H_\r\n#define _FSL_CLOCK_H_\r\n\r\n#include \"fsl_common.h\"\r\n#include \"fsl_reset.h\"\r\n\r\n/*! @addtogroup clock */\r\n/*! @{ */\r\n\r\n/*! @file */\r\n\r\n/*******************************************************************************\r\n * Configurations\r\n ******************************************************************************/\r\n\r\n/*! @brief Configure whether driver controls clock\r\n *\r\n * When set to 0, peripheral drivers will enable clock in initialize function\r\n * and disable clock in de-initialize function. When set to 1, peripheral\r\n * driver will not control the clock, application could control the clock out of\r\n * the driver.\r\n *\r\n * @note All drivers share this feature switcher. If it is set to 1, application\r\n * should handle clock enable and disable for all drivers.\r\n */\r\n#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL))\r\n#define FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL 0\r\n#endif\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*! @name Driver version */\r\n/*@{*/\r\n/*! @brief CLOCK driver version 2.3.0. */\r\n#define FSL_CLOCK_DRIVER_VERSION (MAKE_VERSION(2, 3, 0))\r\n/*@}*/\r\n\r\n/* Definition for delay API in clock driver, users can redefine it to the real application. */\r\n#ifndef SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY\r\n#define SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY (260000000UL)\r\n#endif\r\n\r\n/*! @brief Clock ip name array for GPIO. */\r\n#define GPIO_CLOCKS                    \\\r\n    {                                  \\\r\n        kCLOCK_HsGpio0, kCLOCK_HsGpio1 \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for CACHE64. */\r\n#define CACHE64_CLOCKS                 \\\r\n    {                                  \\\r\n        kCLOCK_Flexspi, kCLOCK_Flexspi \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for FLEXSPI. */\r\n#define FLEXSPI_CLOCKS \\\r\n    {                  \\\r\n        kCLOCK_Flexspi \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for FLEXCOMM. */\r\n#define FLEXCOMM_CLOCKS                                                                           \\\r\n    {                                                                                             \\\r\n        kCLOCK_Flexcomm0, kCLOCK_Flexcomm1, kCLOCK_Flexcomm2, kCLOCK_Flexcomm3, kCLOCK_Flexcomm14 \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for LPUART. */\r\n#define USART_CLOCKS                                                           \\\r\n    {                                                                          \\\r\n        kCLOCK_Flexcomm0, kCLOCK_Flexcomm1, kCLOCK_Flexcomm2, kCLOCK_Flexcomm3 \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for I2C. */\r\n#define I2C_CLOCKS                                                             \\\r\n    {                                                                          \\\r\n        kCLOCK_Flexcomm0, kCLOCK_Flexcomm1, kCLOCK_Flexcomm2, kCLOCK_Flexcomm3 \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for SPI. */\r\n#define SPI_CLOCKS                                                                                \\\r\n    {                                                                                             \\\r\n        kCLOCK_Flexcomm0, kCLOCK_Flexcomm1, kCLOCK_Flexcomm2, kCLOCK_Flexcomm3, kCLOCK_Flexcomm14 \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for ACOMP. */\r\n#define ACOMP_CLOCKS \\\r\n    {                \\\r\n        kCLOCK_Gau   \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for ADC. */\r\n#define ADC_CLOCKS             \\\r\n    {                          \\\r\n        kCLOCK_Gau, kCLOCK_Gau \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for DAC. */\r\n#define DAC_CLOCKS \\\r\n    {              \\\r\n        kCLOCK_Gau \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for LCDIC. */\r\n#define LCDIC_CLOCKS \\\r\n    {                \\\r\n        kCLOCK_Lcdic \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for DMA. */\r\n#define DMA_CLOCKS               \\\r\n    {                            \\\r\n        kCLOCK_Dma0, kCLOCK_Dma1 \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for DMIC. */\r\n#define DMIC_CLOCKS  \\\r\n    {                \\\r\n        kCLOCK_Dmic0 \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for ENET. */\r\n#define ENET_CLOCKS    \\\r\n    {                  \\\r\n        kCLOCK_EnetIpg \\\r\n    }\r\n\r\n/*! @brief Extra clock ip name array for ENET. */\r\n#define ENET_EXTRA_CLOCKS \\\r\n    {                     \\\r\n        kCLOCK_EnetIpgS   \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for Powerquad */\r\n#define POWERQUAD_CLOCKS \\\r\n    {                    \\\r\n        kCLOCK_PowerQuad \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for OSTimer */\r\n#define OSTIMER_CLOCKS      \\\r\n    {                       \\\r\n        kCLOCK_OsEventTimer \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for CT32B. */\r\n#define CTIMER_CLOCKS                                                             \\\r\n    {                                                                             \\\r\n        kCLOCK_Ct32b0, kCLOCK_Ct32b1, kCLOCK_Ct32b2, kCLOCK_Ct32b3, kCLOCK_Ct32b4 \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for UTICK. */\r\n#define UTICK_CLOCKS \\\r\n    {                \\\r\n        kCLOCK_Utick \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for MRT. */\r\n#define MRT_CLOCKS                 \\\r\n    {                              \\\r\n        kCLOCK_Mrt, kCLOCK_FreeMrt \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for SCT. */\r\n#define SCT_CLOCKS \\\r\n    {              \\\r\n        kCLOCK_Sct \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for RTC. */\r\n#define RTC_CLOCKS \\\r\n    {              \\\r\n        kCLOCK_Rtc \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for WWDT. */\r\n#define WWDT_CLOCKS  \\\r\n    {                \\\r\n        kCLOCK_Wwdt0 \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for TRNG. */\r\n#define TRNG_CLOCKS \\\r\n    {               \\\r\n        kCLOCK_Trng \\\r\n    }\r\n\r\n/*! @brief Clock ip name array for USIM. */\r\n#define USIM_CLOCKS \\\r\n    {               \\\r\n        kCLOCK_Usim \\\r\n    }\r\n\r\n/*! @brief Clock gate name used for CLOCK_EnableClock/CLOCK_DisableClock. */\r\n/*------------------------------------------------------------------------------\r\n clock_ip_name_t definition:\r\n------------------------------------------------------------------------------*/\r\n\r\n#define CLK_GATE_REG_OFFSET_SHIFT 8U\r\n#define CLK_GATE_REG_OFFSET_MASK  0xFF00U\r\n#define CLK_GATE_BIT_SHIFT_SHIFT  0U\r\n#define CLK_GATE_BIT_SHIFT_MASK   0x000000FFU\r\n\r\n#define CLK_GATE_DEFINE(reg_offset, bit_shift)                                  \\\r\n    ((((reg_offset) << CLK_GATE_REG_OFFSET_SHIFT) & CLK_GATE_REG_OFFSET_MASK) | \\\r\n     (((bit_shift) << CLK_GATE_BIT_SHIFT_SHIFT) & CLK_GATE_BIT_SHIFT_MASK))\r\n\r\n#define CLK_GATE_ABSTRACT_REG_OFFSET(x) (((uint32_t)(x)&CLK_GATE_REG_OFFSET_MASK) >> CLK_GATE_REG_OFFSET_SHIFT)\r\n#define CLK_GATE_ABSTRACT_BITS_SHIFT(x) (((uint32_t)(x)&CLK_GATE_BIT_SHIFT_MASK) >> CLK_GATE_BIT_SHIFT_SHIFT)\r\n\r\n#define CLK_CTL0_PSCCTL0 0\r\n#define CLK_CTL0_PSCCTL1 1\r\n#define CLK_CTL0_PSCCTL2 2\r\n#define CLK_CTL1_PSCCTL0 3\r\n#define CLK_CTL1_PSCCTL1 4\r\n#define CLK_CTL1_PSCCTL2 5\r\n\r\n#define SYS_CLK_GATE_FLAG_MASK         (0x10000UL)\r\n#define SYS_CLK_GATE_DEFINE(bit_shift) (((bit_shift)&CLK_GATE_BIT_SHIFT_MASK) | SYS_CLK_GATE_FLAG_MASK)\r\n#define SYS_CLK_GATE_BIT_MASK(x)       (1UL << (((uint32_t)(x)&CLK_GATE_BIT_SHIFT_MASK) >> CLK_GATE_BIT_SHIFT_SHIFT))\r\n\r\n#define CLKCTL0_TUPLE_MUXA(reg, choice) (((reg)&0xFFCU) | ((choice) << 12U))\r\n#define CLKCTL0_TUPLE_MUXB(reg, choice) ((((reg)&0xFFCU) << 16) | ((choice) << 28U))\r\n#define CLKCTL1_TUPLE_FLAG_MASK         (0x8000U)\r\n#define CLKCTL1_TUPLE_MUXA(reg, choice) (((reg)&0xFFCU) | CLKCTL1_TUPLE_FLAG_MASK | ((choice) << 12U))\r\n#define CLKCTL1_TUPLE_MUXB(reg, choice) ((((reg)&0xFFCU) | CLKCTL1_TUPLE_FLAG_MASK | ((choice) << 28U)) << 16)\r\n#define CLKCTL_TUPLE_REG(base, tuple)   ((volatile uint32_t *)(((uint32_t)(base)) + ((uint32_t)(tuple)&0xFFCU)))\r\n#define CLKCTL_TUPLE_SEL(tuple)         (((uint32_t)(tuple) >> 12U) & 0x7U)\r\n\r\n#define CLKOUT_TUPLE_MUX_AVAIL          (0x2U)\r\n#define CLKOUT_TUPLE_MUX(ch0, ch1, ch2) (CLKOUT_TUPLE_MUX_AVAIL | ((ch0) << 4U) | ((ch1) << 8) | ((ch2) << 12))\r\n\r\n#define PMU_TUPLE_MUX_AVAIL        (0x1U)\r\n#define PMU_TUPLE_MUX(reg, choice) (((reg)&0xFFCU) | ((choice) << 12U) | PMU_TUPLE_MUX_AVAIL)\r\n#define PMU_TUPLE_REG(base, tuple) ((volatile uint32_t *)(((uint32_t)(base)) + ((uint32_t)(tuple)&0xFFCU)))\r\n#define PMU_TUPLE_SEL(tuple)       (((uint32_t)(tuple) >> 12U) & 0x3U)\r\n\r\n/*! @brief Clock name used to get clock frequency. */\r\ntypedef enum _clock_name\r\n{\r\n    kCLOCK_CoreSysClk,       /*!< Core clock  (aka HCLK)                                 */\r\n    kCLOCK_BusClk,           /*!< Bus clock (AHB/APB clock, aka HCLK)                    */\r\n    kCLOCK_MclkClk,          /*!< MCLK, to MCLK pin                                      */\r\n} clock_name_t;\r\n\r\n/*!\r\n * @brief Peripheral clock name difinition used for\r\n * clock gate.\r\n */\r\ntypedef enum _clock_ip_name\r\n{\r\n    kCLOCK_IpInvalid = 0U,\r\n\r\n    kCLOCK_TcpuMciClk         = SYS_CLK_GATE_DEFINE(0),\r\n    kCLOCK_TcpuMciFlexspiClk  = SYS_CLK_GATE_DEFINE(1),\r\n    kCLOCK_TddrMciEnetClk     = SYS_CLK_GATE_DEFINE(2),\r\n    kCLOCK_TddrMciFlexspiClk  = SYS_CLK_GATE_DEFINE(3),\r\n    kCLOCK_T3PllMciIrcClk     = SYS_CLK_GATE_DEFINE(4),\r\n    kCLOCK_T3PllMci256mClk    = SYS_CLK_GATE_DEFINE(5),\r\n    kCLOCK_T3PllMci213mClk    = SYS_CLK_GATE_DEFINE(6),\r\n    kCLOCK_T3PllMciFlexspiClk = SYS_CLK_GATE_DEFINE(7),\r\n    kCLOCK_RefClkSys          = SYS_CLK_GATE_DEFINE(9),\r\n    kCLOCK_RefClkTcpu         = SYS_CLK_GATE_DEFINE(28),\r\n    kCLOCK_RefClkTddr         = SYS_CLK_GATE_DEFINE(29),\r\n    kCLOCK_RefClkAud          = SYS_CLK_GATE_DEFINE(30),\r\n    kCLOCK_RefClkUsb          = SYS_CLK_GATE_DEFINE(31),\r\n    kCLOCK_RefClkCauSlp       = SYS_CLK_GATE_DEFINE(32),\r\n\r\n    kCLOCK_Cpu       = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 0),\r\n    kCLOCK_Matrix    = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 1),\r\n    kCLOCK_Romcp     = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 2),\r\n    kCLOCK_PowerQuad = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 8),\r\n    kCLOCK_Pkc       = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 9),\r\n    kCLOCK_Els       = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 10),\r\n    kCLOCK_Puf       = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 11),\r\n    kCLOCK_Flexspi   = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 16),\r\n    kCLOCK_Hpu       = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 20),\r\n    kCLOCK_Usb       = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 22),\r\n    kCLOCK_Sct       = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 24),\r\n    kCLOCK_AonMem    = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 25),\r\n    kCLOCK_Gdma      = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 28),\r\n    kCLOCK_Dma0      = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 29),\r\n    kCLOCK_Dma1      = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 30),\r\n    kCLOCK_Sdio      = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL0, 31),\r\n\r\n    kCLOCK_ElsApb     = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL1, 0),\r\n    kCLOCK_SdioSlv    = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL1, 2),\r\n    kCLOCK_Gau        = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL1, 16),\r\n    kCLOCK_Otp        = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL1, 17),\r\n    kCLOCK_SecureGpio = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL1, 24),\r\n    kCLOCK_EnetIpg    = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL1, 25),\r\n    kCLOCK_EnetIpgS   = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL1, 26),\r\n    kCLOCK_Trng       = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL1, 27),\r\n\r\n    kCLOCK_Utick   = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL2, 0),\r\n    kCLOCK_Wwdt0   = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL2, 1),\r\n    kCLOCK_Usim    = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL2, 2),\r\n    kCLOCK_Itrc    = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL2, 3),\r\n    kCLOCK_FreeMrt = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL2, 26),\r\n    kCLOCK_Lcdic   = CLK_GATE_DEFINE(CLK_CTL0_PSCCTL2, 27),\r\n\r\n    kCLOCK_Flexcomm0    = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL0, 8),\r\n    kCLOCK_Flexcomm1    = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL0, 9),\r\n    kCLOCK_Flexcomm2    = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL0, 10),\r\n    kCLOCK_Flexcomm3    = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL0, 11),\r\n    kCLOCK_Flexcomm14   = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL0, 22),\r\n    kCLOCK_Dmic0        = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL0, 24),\r\n    kCLOCK_OsEventTimer = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL0, 27),\r\n\r\n    kCLOCK_HsGpio0 = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL1, 0),\r\n    kCLOCK_HsGpio1 = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL1, 1),\r\n    kCLOCK_Crc     = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL1, 16),\r\n    kCLOCK_Freqme  = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL1, 31),\r\n\r\n    kCLOCK_Ct32b0   = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL2, 0),\r\n    kCLOCK_Ct32b1   = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL2, 1),\r\n    kCLOCK_Ct32b2   = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL2, 2),\r\n    kCLOCK_Ct32b3   = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL2, 3),\r\n    kCLOCK_Ct32b4   = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL2, 4),\r\n    kCLOCK_Pmu      = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL2, 6),\r\n    kCLOCK_Rtc      = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL2, 7),\r\n    kCLOCK_Mrt      = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL2, 8),\r\n    kCLOCK_Pint     = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL2, 30),\r\n    kCLOCK_InputMux = CLK_GATE_DEFINE(CLK_CTL1_PSCCTL2, 31),\r\n} clock_ip_name_t;\r\n\r\n/*!\r\n * @brief Peripheral clock source selection definition.\r\n */\r\ntypedef enum _clock_attach_id\r\n{\r\n    kXTAL_to_SYSOSC_CLK  = CLKCTL0_TUPLE_MUXA(0x168U, 0),\r\n    kCLKIN_to_SYSOSC_CLK = CLKCTL0_TUPLE_MUXA(0x168U, 1),\r\n    kNONE_to_SYSOSC_CLK  = CLKCTL0_TUPLE_MUXA(0x168U, 7),\r\n\r\n    kSYSOSC_to_MAIN_CLK    = CLKCTL0_TUPLE_MUXA(0x430U, 0) | CLKCTL0_TUPLE_MUXB(0x434U, 0),\r\n    kFFRO_DIV4_to_MAIN_CLK = CLKCTL0_TUPLE_MUXA(0x430U, 1) | CLKCTL0_TUPLE_MUXB(0x434U, 0),\r\n    kLPOSC_to_MAIN_CLK     = CLKCTL0_TUPLE_MUXA(0x430U, 2) | CLKCTL0_TUPLE_MUXB(0x434U, 0),\r\n    kFFRO_to_MAIN_CLK      = CLKCTL0_TUPLE_MUXA(0x430U, 3) | CLKCTL0_TUPLE_MUXB(0x434U, 0),\r\n    kSFRO_to_MAIN_CLK      = CLKCTL0_TUPLE_MUXA(0x434U, 1),\r\n    kMAIN_PLL_to_MAIN_CLK  = CLKCTL0_TUPLE_MUXA(0x434U, 2),\r\n    kCLK32K_to_MAIN_CLK    = CLKCTL0_TUPLE_MUXA(0x434U, 3),\r\n\r\n    kMAIN_CLK_to_FLEXSPI_CLK          = CLKCTL0_TUPLE_MUXA(0x620U, 0),\r\n    kT3PLL_MCI_FLEXSPI_to_FLEXSPI_CLK = CLKCTL0_TUPLE_MUXA(0x620U, 1),\r\n    kAUX0_PLL_to_FLEXSPI_CLK          = CLKCTL0_TUPLE_MUXA(0x620U, 2),\r\n    kTCPU_MCI_FLEXSPI_to_FLEXSPI_CLK  = CLKCTL0_TUPLE_MUXA(0x620U, 3),\r\n    kAUX1_PLL_to_FLEXSPI_CLK          = CLKCTL0_TUPLE_MUXA(0x620U, 4),\r\n    kTDDR_MCI_FLEXSPI_to_FLEXSPI_CLK  = CLKCTL0_TUPLE_MUXA(0x620U, 5),\r\n    kT3PLL_MCI_256M_to_FLEXSPI_CLK    = CLKCTL0_TUPLE_MUXA(0x620U, 6),\r\n    kNONE_to_FLEXSPI_CLK              = CLKCTL0_TUPLE_MUXA(0x620U, 7),\r\n\r\n    kMAIN_CLK_to_SCT_CLK  = CLKCTL0_TUPLE_MUXA(0x640U, 0),\r\n    kMAIN_PLL_to_SCT_CLK  = CLKCTL0_TUPLE_MUXA(0x640U, 1),\r\n    kAUX0_PLL_to_SCT_CLK  = CLKCTL0_TUPLE_MUXA(0x640U, 2),\r\n    kFFRO_to_SCT_CLK      = CLKCTL0_TUPLE_MUXA(0x640U, 3),\r\n    kAUX1_PLL_to_SCT_CLK  = CLKCTL0_TUPLE_MUXA(0x640U, 4),\r\n    kAUDIO_PLL_to_SCT_CLK = CLKCTL0_TUPLE_MUXA(0x640U, 5),\r\n    kNONE_to_SCT_CLK      = CLKCTL0_TUPLE_MUXA(0x640U, 7),\r\n\r\n    kLPOSC_to_UTICK_CLK    = CLKCTL0_TUPLE_MUXA(0x700U, 0),\r\n    kMAIN_CLK_to_UTICK_CLK = CLKCTL0_TUPLE_MUXA(0x700U, 1),\r\n    kNONE_to_UTICK_CLK     = CLKCTL0_TUPLE_MUXA(0x700U, 3),\r\n\r\n    kLPOSC_to_WDT0_CLK    = CLKCTL0_TUPLE_MUXA(0x720U, 0),\r\n    kMAIN_CLK_to_WDT0_CLK = CLKCTL0_TUPLE_MUXA(0x720U, 1),\r\n    kNONE_to_WDT0_CLK     = CLKCTL0_TUPLE_MUXA(0x720U, 3),\r\n\r\n    kSYSTICK_DIV_to_SYSTICK_CLK = CLKCTL0_TUPLE_MUXA(0x760U, 0),\r\n    kLPOSC_to_SYSTICK_CLK       = CLKCTL0_TUPLE_MUXA(0x760U, 1),\r\n    kCLK32K_to_SYSTICK_CLK      = CLKCTL0_TUPLE_MUXA(0x760U, 2),\r\n    kSFRO_to_SYSTICK_CLK        = CLKCTL0_TUPLE_MUXA(0x760U, 3),\r\n    kNONE_to_SYSTICK_CLK        = CLKCTL0_TUPLE_MUXA(0x760U, 7),\r\n\r\n    kMAIN_CLK_to_USIM_CLK  = CLKCTL0_TUPLE_MUXA(0x774U, 0),\r\n    kAUDIO_PLL_to_USIM_CLK = CLKCTL0_TUPLE_MUXA(0x774U, 1),\r\n    kFFRO_to_USIM_CLK      = CLKCTL0_TUPLE_MUXA(0x774U, 2),\r\n    kNONE_to_USIM_CLK      = CLKCTL0_TUPLE_MUXA(0x774U, 3),\r\n\r\n    kMAIN_CLK_to_LCD_CLK          = CLKCTL0_TUPLE_MUXA(0x778U, 0),\r\n    kT3PLL_MCI_FLEXSPI_to_LCD_CLK = CLKCTL0_TUPLE_MUXA(0x778U, 1),\r\n    kTCPU_MCI_FLEXSPI_to_LCD_CLK  = CLKCTL0_TUPLE_MUXA(0x778U, 2),\r\n    kTDDR_MCI_FLEXSPI_to_LCD_CLK  = CLKCTL0_TUPLE_MUXA(0x778U, 3),\r\n    kNONE_to_LCD_CLK              = CLKCTL0_TUPLE_MUXA(0x778U, 7),\r\n\r\n    kMAIN_CLK_to_GAU_CLK       = CLKCTL0_TUPLE_MUXA(0x77CU, 0),\r\n    kT3PLL_MCI_256M_to_GAU_CLK = CLKCTL0_TUPLE_MUXA(0x77CU, 1),\r\n    kAVPLL_CH2_to_GAU_CLK      = CLKCTL0_TUPLE_MUXA(0x77CU, 2),\r\n    kNONE_to_GAU_CLK           = CLKCTL0_TUPLE_MUXA(0x77CU, 3),\r\n\r\n    kT3PLL_MCI_256M_to_ELS_GDET = CLKCTL0_TUPLE_MUXA(0x7A8U, 0),\r\n    kELS_128M_to_ELS_GDET       = CLKCTL0_TUPLE_MUXA(0x7A8U, 1),\r\n    kELS_64M_to_ELS_GDET        = CLKCTL0_TUPLE_MUXA(0x7A8U, 2),\r\n    kOTP_FUSE_32M_to_ELS_GDET   = CLKCTL0_TUPLE_MUXA(0x7A8U, 3),\r\n    kNONE_to_ELS_GDET           = CLKCTL0_TUPLE_MUXA(0x7A8U, 7),\r\n\r\n    kLPOSC_to_OSTIMER_CLK    = CLKCTL1_TUPLE_MUXA(0x480U, 0),\r\n    kCLK32K_to_OSTIMER_CLK   = CLKCTL1_TUPLE_MUXA(0x480U, 1),\r\n    kHCLK_to_OSTIMER_CLK     = CLKCTL1_TUPLE_MUXA(0x480U, 2),\r\n    kMAIN_CLK_to_OSTIMER_CLK = CLKCTL1_TUPLE_MUXA(0x480U, 3),\r\n    kNONE_to_OSTIMER_CLK     = CLKCTL1_TUPLE_MUXA(0x480U, 7),\r\n\r\n    kSFRO_to_FLEXCOMM0      = CLKCTL1_TUPLE_MUXA(0x508U, 0),\r\n    kFFRO_to_FLEXCOMM0      = CLKCTL1_TUPLE_MUXA(0x508U, 1),\r\n    kAUDIO_PLL_to_FLEXCOMM0 = CLKCTL1_TUPLE_MUXA(0x508U, 2),\r\n    kMCLK_IN_to_FLEXCOMM0   = CLKCTL1_TUPLE_MUXA(0x508U, 3),\r\n    kFRG_to_FLEXCOMM0       = CLKCTL1_TUPLE_MUXA(0x508U, 4),\r\n    kNONE_to_FLEXCOMM0      = CLKCTL1_TUPLE_MUXA(0x508U, 7),\r\n\r\n    kSFRO_to_FLEXCOMM1      = CLKCTL1_TUPLE_MUXA(0x528U, 0),\r\n    kFFRO_to_FLEXCOMM1      = CLKCTL1_TUPLE_MUXA(0x528U, 1),\r\n    kAUDIO_PLL_to_FLEXCOMM1 = CLKCTL1_TUPLE_MUXA(0x528U, 2),\r\n    kMCLK_IN_to_FLEXCOMM1   = CLKCTL1_TUPLE_MUXA(0x528U, 3),\r\n    kFRG_to_FLEXCOMM1       = CLKCTL1_TUPLE_MUXA(0x528U, 4),\r\n    kNONE_to_FLEXCOMM1      = CLKCTL1_TUPLE_MUXA(0x528U, 7),\r\n\r\n    kSFRO_to_FLEXCOMM2      = CLKCTL1_TUPLE_MUXA(0x548U, 0),\r\n    kFFRO_to_FLEXCOMM2      = CLKCTL1_TUPLE_MUXA(0x548U, 1),\r\n    kAUDIO_PLL_to_FLEXCOMM2 = CLKCTL1_TUPLE_MUXA(0x548U, 2),\r\n    kMCLK_IN_to_FLEXCOMM2   = CLKCTL1_TUPLE_MUXA(0x548U, 3),\r\n    kFRG_to_FLEXCOMM2       = CLKCTL1_TUPLE_MUXA(0x548U, 4),\r\n    kNONE_to_FLEXCOMM2      = CLKCTL1_TUPLE_MUXA(0x548U, 7),\r\n\r\n    kSFRO_to_FLEXCOMM3      = CLKCTL1_TUPLE_MUXA(0x568U, 0),\r\n    kFFRO_to_FLEXCOMM3      = CLKCTL1_TUPLE_MUXA(0x568U, 1),\r\n    kAUDIO_PLL_to_FLEXCOMM3 = CLKCTL1_TUPLE_MUXA(0x568U, 2),\r\n    kMCLK_IN_to_FLEXCOMM3   = CLKCTL1_TUPLE_MUXA(0x568U, 3),\r\n    kFRG_to_FLEXCOMM3       = CLKCTL1_TUPLE_MUXA(0x568U, 4),\r\n    kNONE_to_FLEXCOMM3      = CLKCTL1_TUPLE_MUXA(0x568U, 7),\r\n\r\n    kSFRO_to_FLEXCOMM14      = CLKCTL1_TUPLE_MUXA(0x6C8U, 0),\r\n    kFFRO_to_FLEXCOMM14      = CLKCTL1_TUPLE_MUXA(0x6C8U, 1),\r\n    kAUDIO_PLL_to_FLEXCOMM14 = CLKCTL1_TUPLE_MUXA(0x6C8U, 2),\r\n    kMCLK_IN_to_FLEXCOMM14   = CLKCTL1_TUPLE_MUXA(0x6C8U, 3),\r\n    kFRG_to_FLEXCOMM14       = CLKCTL1_TUPLE_MUXA(0x6C8U, 4),\r\n    kNONE_to_FLEXCOMM14      = CLKCTL1_TUPLE_MUXA(0x6C8U, 7),\r\n\r\n    kSFRO_to_DMIC_CLK      = CLKCTL1_TUPLE_MUXA(0x700U, 0),\r\n    kFFRO_to_DMIC_CLK      = CLKCTL1_TUPLE_MUXA(0x700U, 1),\r\n    kAUDIO_PLL_to_DMIC_CLK = CLKCTL1_TUPLE_MUXA(0x700U, 2),\r\n    kMCLK_IN_to_DMIC_CLK   = CLKCTL1_TUPLE_MUXA(0x700U, 3),\r\n    kLPOSC_to_DMIC_CLK     = CLKCTL1_TUPLE_MUXA(0x700U, 4),\r\n    kCLK32K_to_DMIC_CLK    = CLKCTL1_TUPLE_MUXA(0x700U, 5),\r\n    kMAIN_CLK_to_DMIC_CLK  = CLKCTL1_TUPLE_MUXA(0x700U, 6),\r\n    kNONE_to_DMIC_CLK      = CLKCTL1_TUPLE_MUXA(0x700U, 7),\r\n\r\n    kMAIN_CLK_to_CTIMER0  = CLKCTL1_TUPLE_MUXA(0x720U, 0),\r\n    kSFRO_to_CTIMER0      = CLKCTL1_TUPLE_MUXA(0x720U, 1),\r\n    kFFRO_to_CTIMER0      = CLKCTL1_TUPLE_MUXA(0x720U, 2),\r\n    kAUDIO_PLL_to_CTIMER0 = CLKCTL1_TUPLE_MUXA(0x720U, 3),\r\n    kMCLK_IN_to_CTIMER0   = CLKCTL1_TUPLE_MUXA(0x720U, 4),\r\n    kLPOSC_to_CTIMER0     = CLKCTL1_TUPLE_MUXA(0x720U, 5),\r\n    kNONE_to_CTIMER0      = CLKCTL1_TUPLE_MUXA(0x720U, 7),\r\n\r\n    kMAIN_CLK_to_CTIMER1  = CLKCTL1_TUPLE_MUXA(0x724U, 0),\r\n    kSFRO_to_CTIMER1      = CLKCTL1_TUPLE_MUXA(0x724U, 1),\r\n    kFFRO_to_CTIMER1      = CLKCTL1_TUPLE_MUXA(0x724U, 2),\r\n    kAUDIO_PLL_to_CTIMER1 = CLKCTL1_TUPLE_MUXA(0x724U, 3),\r\n    kMCLK_IN_to_CTIMER1   = CLKCTL1_TUPLE_MUXA(0x724U, 4),\r\n    kLPOSC_to_CTIMER1     = CLKCTL1_TUPLE_MUXA(0x724U, 5),\r\n    kNONE_to_CTIMER1      = CLKCTL1_TUPLE_MUXA(0x724U, 7),\r\n\r\n    kMAIN_CLK_to_CTIMER2  = CLKCTL1_TUPLE_MUXA(0x728U, 0),\r\n    kSFRO_to_CTIMER2      = CLKCTL1_TUPLE_MUXA(0x728U, 1),\r\n    kFFRO_to_CTIMER2      = CLKCTL1_TUPLE_MUXA(0x728U, 2),\r\n    kAUDIO_PLL_to_CTIMER2 = CLKCTL1_TUPLE_MUXA(0x728U, 3),\r\n    kMCLK_IN_to_CTIMER2   = CLKCTL1_TUPLE_MUXA(0x728U, 4),\r\n    kLPOSC_to_CTIMER2     = CLKCTL1_TUPLE_MUXA(0x728U, 5),\r\n    kNONE_to_CTIMER2      = CLKCTL1_TUPLE_MUXA(0x728U, 7),\r\n\r\n    kMAIN_CLK_to_CTIMER3  = CLKCTL1_TUPLE_MUXA(0x72CU, 0),\r\n    kSFRO_to_CTIMER3      = CLKCTL1_TUPLE_MUXA(0x72CU, 1),\r\n    kFFRO_to_CTIMER3      = CLKCTL1_TUPLE_MUXA(0x72CU, 2),\r\n    kAUDIO_PLL_to_CTIMER3 = CLKCTL1_TUPLE_MUXA(0x72CU, 3),\r\n    kMCLK_IN_to_CTIMER3   = CLKCTL1_TUPLE_MUXA(0x72CU, 4),\r\n    kLPOSC_to_CTIMER3     = CLKCTL1_TUPLE_MUXA(0x72CU, 5),\r\n    kNONE_to_CTIMER3      = CLKCTL1_TUPLE_MUXA(0x72CU, 7),\r\n\r\n    kFFRO_to_MCLK_CLK      = CLKCTL1_TUPLE_MUXA(0x740U, 0),\r\n    kAUDIO_PLL_to_MCLK_CLK = CLKCTL1_TUPLE_MUXA(0x740U, 1),\r\n    kMAIN_CLK_to_MCLK_CLK  = CLKCTL1_TUPLE_MUXA(0x740U, 2),\r\n    kNONE_to_MCLK_CLK      = CLKCTL1_TUPLE_MUXA(0x740U, 3),\r\n\r\n    kSFRO_to_CLKOUT              = CLKOUT_TUPLE_MUX(0U, 0U, 0U),\r\n    kSYSOSC_to_CLKOUT            = CLKOUT_TUPLE_MUX(1U, 0U, 0U),\r\n    kLPOSC_to_CLKOUT             = CLKOUT_TUPLE_MUX(2U, 0U, 0U),\r\n    kFFRO_to_CLKOUT              = CLKOUT_TUPLE_MUX(3U, 0U, 0U),\r\n    kMAIN_CLK_to_CLKOUT          = CLKOUT_TUPLE_MUX(4U, 0U, 0U),\r\n    kREFCLK_SYS_to_CLKOUT        = CLKOUT_TUPLE_MUX(5U, 0U, 0U),\r\n    kAVPLL_CH2_to_CLKOUT         = CLKOUT_TUPLE_MUX(6U, 0U, 0U),\r\n    kMAIN_PLL_to_CLKOUT          = CLKOUT_TUPLE_MUX(7U, 1U, 0U),\r\n    kAUX0_PLL_to_CLKOUT          = CLKOUT_TUPLE_MUX(7U, 2U, 0U),\r\n    kAUX1_PLL_to_CLKOUT          = CLKOUT_TUPLE_MUX(7U, 4U, 0U),\r\n    kAUDIO_PLL_to_CLKOUT         = CLKOUT_TUPLE_MUX(7U, 5U, 0U),\r\n    kCLK32K_to_CLKOUT            = CLKOUT_TUPLE_MUX(7U, 6U, 0U),\r\n    kTCPU_MCI_FLEXSPI_to_CLKOUT  = CLKOUT_TUPLE_MUX(7U, 7U, 1U),\r\n    kTDDR_MCI_FLEXSPI_to_CLKOUT  = CLKOUT_TUPLE_MUX(7U, 7U, 2U),\r\n    kT3PLL_MCI_FLEXSPI_to_CLKOUT = CLKOUT_TUPLE_MUX(7U, 7U, 3U),\r\n    kT3PLL_MCI_256M_to_CLKOUT    = CLKOUT_TUPLE_MUX(7U, 7U, 4U),\r\n    kCAU_SLP_REF_CLK_to_CLKOUT   = CLKOUT_TUPLE_MUX(7U, 7U, 5U),\r\n    kTDDR_MCI_ENET_to_CLKOUT     = CLKOUT_TUPLE_MUX(7U, 7U, 6U),\r\n    kNONE_to_CLKOUT              = CLKOUT_TUPLE_MUX(7U, 7U, 7U),\r\n\r\n    kRC32K_to_CLK32K   = PMU_TUPLE_MUX(0x70U, 0),\r\n    kXTAL32K_to_CLK32K = PMU_TUPLE_MUX(0x70U, 1),\r\n    kNCO32K_to_CLK32K  = PMU_TUPLE_MUX(0x70U, 2),\r\n} clock_attach_id_t;\r\n\r\n/*!\r\n * @brief Clock divider definition.\r\n */\r\ntypedef enum _clock_div_name\r\n{\r\n    kCLOCK_DivMainPllClk   = CLKCTL0_TUPLE_MUXA(0x240U, 0),\r\n    kCLOCK_DivAux0PllClk   = CLKCTL0_TUPLE_MUXA(0x248U, 0),\r\n    kCLOCK_DivAux1PllClk   = CLKCTL0_TUPLE_MUXA(0x24CU, 0),\r\n    kCLOCK_DivSysCpuAhbClk = CLKCTL0_TUPLE_MUXA(0x400U, 0),\r\n    kCLOCK_DivPfc1Clk      = CLKCTL0_TUPLE_MUXA(0x504U, 0),\r\n    kCLOCK_DivFlexspiClk   = CLKCTL0_TUPLE_MUXA(0x624U, 0),\r\n    kCLOCK_DivSctClk       = CLKCTL0_TUPLE_MUXA(0x644U, 0),\r\n    kCLOCK_DivUsbHsFclk    = CLKCTL0_TUPLE_MUXA(0x664U, 0),\r\n    kCLOCK_DivSystickClk   = CLKCTL0_TUPLE_MUXA(0x764U, 0),\r\n    kCLOCK_DivLcdClk       = CLKCTL0_TUPLE_MUXA(0x768U, 0),\r\n    kCLOCK_DivGauClk       = CLKCTL0_TUPLE_MUXA(0x76CU, 0),\r\n    kCLOCK_DivUsimClk      = CLKCTL0_TUPLE_MUXA(0x770U, 0),\r\n    kCLOCK_DivPmuFclk      = CLKCTL0_TUPLE_MUXA(0x780U, 0),\r\n\r\n    kCLOCK_DivAudioPllClk = CLKCTL1_TUPLE_MUXA(0x240U, 0),\r\n    kCLOCK_DivPllFrgClk   = CLKCTL1_TUPLE_MUXA(0x6FCU, 0),\r\n    kCLOCK_DivDmicClk     = CLKCTL1_TUPLE_MUXA(0x704U, 0),\r\n    kCLOCK_DivMclkClk     = CLKCTL1_TUPLE_MUXA(0x744U, 0),\r\n    kCLOCK_DivClockOut    = CLKCTL1_TUPLE_MUXA(0x768U, 0),\r\n} clock_div_name_t;\r\n\r\n/*! @brief PLL configuration for FRG */\r\ntypedef struct _clock_frg_clk_config\r\n{\r\n    uint8_t num; /*!< FRG clock */\r\n    enum\r\n    {\r\n        kCLOCK_FrgMainClk = 0, /*!< Main System clock */\r\n        kCLOCK_FrgPllDiv,      /*!< Main pll clock divider*/\r\n        kCLOCK_FrgSFro,        /*!< 16MHz FRO */\r\n        kCLOCK_FrgFFro,        /*!< FRO48/60 */\r\n    } sfg_clock_src;\r\n    uint8_t divider; /*!< Denominator of the fractional divider. */\r\n    uint8_t mult;    /*!< Numerator of the fractional divider. */\r\n} clock_frg_clk_config_t;\r\n\r\n/*! @brief TCPU PLL divider for tcpu_mci_flexspi_clk */\r\ntypedef enum\r\n{\r\n    kCLOCK_TcpuFlexspiDiv12 = 0, /*!< Divided by 12 */\r\n    kCLOCK_TcpuFlexspiDiv11,     /*!< Divided by 11 */\r\n    kCLOCK_TcpuFlexspiDiv10,     /*!< Divided by 10 */\r\n    kCLOCK_TcpuFlexspiDiv9,      /*!< Divided by 9  */\r\n} clock_tcpu_flexspi_div_t;\r\n\r\n/*! @brief TDDR PLL divider for tddr_mci_flexspi_clk */\r\ntypedef enum\r\n{\r\n    kCLOCK_TddrFlexspiDiv11 = 0, /*!< Divided by 11 */\r\n    kCLOCK_TddrFlexspiDiv10,     /*!< Divided by 10 */\r\n    kCLOCK_TddrFlexspiDiv9,      /*!< Divided by 9 */\r\n    kCLOCK_TddrFlexspiDiv8,      /*!< Divided by 8  */\r\n} clock_tddr_flexspi_div_t;\r\n\r\n/*! @brief T3 PLL IRC configuration */\r\ntypedef enum\r\n{\r\n    kCLOCK_T3MciIrc60m = 0, /*!< T3 MCI IRC 59.53MHz */\r\n    kCLOCK_T3MciIrc48m,     /*!< T3 MCI IRC 48.30MHz */\r\n} clock_t3_mci_irc_config_t;\r\n\r\n/*! @brief AVPLL channel1 frequency configuration */\r\ntypedef enum\r\n{\r\n    kCLOCK_AvPllChUnchanged = 0, /*!< AVPLL channel frequency unchanged. */\r\n    kCLOCK_AvPllChFreq2p048m,    /*!< AVPLL channel frequency 2.048MHz */\r\n    kCLOCK_AvPllChFreq4p096m,    /*!< AVPLL channel frequency 4.096MHz */\r\n    kCLOCK_AvPllChFreq6p144m,    /*!< AVPLL channel frequency 6.144MHz */\r\n    kCLOCK_AvPllChFreq8p192m,    /*!< AVPLL channel frequency 8.192MHz */\r\n    kCLOCK_AvPllChFreq11p2896m,  /*!< AVPLL channel frequency 11.2896MHz */\r\n    kCLOCK_AvPllChFreq12m,       /*!< AVPLL channel frequency 12MHz */\r\n    kCLOCK_AvPllChFreq12p288m,   /*!< AVPLL channel frequency 12.288MHz */\r\n    kCLOCK_AvPllChFreq24p576m,   /*!< AVPLL channel frequency 24.576MHz */\r\n    kCLOCK_AvPllChFreq64m,       /*!< AVPLL channel frequency 64MHz */\r\n    kCLOCK_AvPllChFreq98p304m,   /*!< AVPLL channel frequency 98.304MHz */\r\n} clock_avpll_ch_freq_t;\r\n\r\n/*! @brief AVPLL configuration */\r\ntypedef struct\r\n{\r\n    clock_avpll_ch_freq_t ch1Freq; /*!< AVPLL channel 1 frequency configuration */\r\n    clock_avpll_ch_freq_t ch2Freq; /*!< AVPLL channel 2 frequency configuration */\r\n    bool enableCali;               /*!< Enable calibration */\r\n} clock_avpll_config_t;\r\n\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif /* __cplusplus */\r\n\r\n/*! @brief External CLK_IN pin clock frequency (clkin) clock frequency.\r\n *\r\n * The CLK_IN pin (clkin) clock frequency in Hz, when the clock is setup, use the\r\n * function CLOCK_SetClkinFreq to set the value in to clock driver. For example,\r\n * if CLK_IN is 16MHz,\r\n * @code\r\n * CLOCK_SetClkinFreq(16000000);\r\n * @endcode\r\n */\r\nextern volatile uint32_t g_clkinFreq;\r\n/*! @brief External MCLK IN clock frequency.\r\n *\r\n * The MCLK in (mclk_in) PIN clock frequency in Hz, when the clock is setup, use the\r\n * function CLOCK_SetMclkInFreq to set the value in to clock driver. For example,\r\n * if mclk_In is 16MHz,\r\n * @code\r\n * CLOCK_SetMclkInFreq(16000000);\r\n * @endcode\r\n */\r\nextern volatile uint32_t g_mclkinFreq;\r\n\r\n/*! @brief  Return Frequency of t3pll_mci_48_60m_irc\r\n *  @return Frequency of t3pll_mci_48_60m_irc\r\n */\r\nuint32_t CLOCK_GetT3PllMciIrcClkFreq(void);\r\n\r\n/*! @brief  Return Frequency of t3pll_mci_213p3m\r\n *  @return Frequency of t3pll_mci_213p3m\r\n */\r\nuint32_t CLOCK_GetT3PllMci213mClkFreq(void);\r\n\r\n/*! @brief  Return Frequency of t3pll_mci_256m\r\n *  @return Frequency of t3pll_mci_256m\r\n */\r\nuint32_t CLOCK_GetT3PllMci256mClkFreq(void);\r\n\r\n/*! @brief  Return Frequency of t3pll_mci_flexspi_clk\r\n *  @return Frequency of t3pll_mci_flexspi_clk\r\n */\r\nuint32_t CLOCK_GetT3PllMciFlexspiClkFreq(void);\r\n\r\n/*! @brief  Return Frequency of tcpu_mci_clk\r\n *  @return Frequency of tcpu_mci_clk\r\n */\r\nuint32_t CLOCK_GetTcpuMciClkFreq(void);\r\n\r\n/*! @brief  Return Frequency of tcpu_mci_flexspi_clk\r\n *  @return Frequency of tcpu_mci_flexspi_clk\r\n */\r\nuint32_t CLOCK_GetTcpuMciFlexspiClkFreq(void);\r\n\r\n/*! @brief  Return Frequency of tddr_mci_flexspi_clk\r\n *  @return Frequency of tddr_mci_flexspi_clk\r\n */\r\nuint32_t CLOCK_GetTddrMciFlexspiClkFreq(void);\r\n\r\n/*! @brief  Return Frequency of tddr_mci_enet_clk\r\n *  @return Frequency of tddr_mci_enet_clk\r\n */\r\nuint32_t CLOCK_GetTddrMciEnetClkFreq(void);\r\n\r\n/*!\r\n * @brief Enable the clock for specific IP.\r\n *\r\n * @param clk  Which clock to enable, see @ref clock_ip_name_t.\r\n */\r\nvoid CLOCK_EnableClock(clock_ip_name_t clk);\r\n\r\n/*!\r\n * @brief Disable the clock for specific IP.\r\n *\r\n * @param clk  Which clock to disable, see @ref clock_ip_name_t.\r\n */\r\nvoid CLOCK_DisableClock(clock_ip_name_t clk);\r\n\r\n/**\r\n * @brief   Configure the clock selection muxes.\r\n * @param   connection  : Clock to be configured.\r\n */\r\nvoid CLOCK_AttachClk(clock_attach_id_t connection);\r\n\r\n/**\r\n * @brief   Setup clock dividers.\r\n * @param   name        : Clock divider name\r\n * @param   divider     : Value to be divided.\r\n */\r\nvoid CLOCK_SetClkDiv(clock_div_name_t name, uint32_t divider);\r\n\r\n/*! @brief  Return Frequency of selected clock\r\n *  @return Frequency of selected clock\r\n */\r\nuint32_t CLOCK_GetFreq(clock_name_t clockName);\r\n\r\n/*! @brief  Return Input frequency for the Fractional baud rate generator\r\n *  @return Input Frequency for FRG\r\n */\r\nuint32_t CLOCK_GetFRGClock(uint32_t id);\r\n\r\n/*! @brief  Set output of the Fractional baud rate generator\r\n *  @param  config    : Configuration to set to FRGn clock.\r\n */\r\nvoid CLOCK_SetFRGClock(const clock_frg_clk_config_t *config);\r\n\r\n/*! @brief  Return Frequency of FFRO\r\n *  @return Frequency of FFRO\r\n */\r\nuint32_t CLOCK_GetFFroFreq(void);\r\n\r\n/*! @brief  Return Frequency of SFRO\r\n *  @return Frequency of SFRO\r\n */\r\nuint32_t CLOCK_GetSFroFreq(void);\r\n\r\n/*! @brief  Return Frequency of AUDIO PLL (AVPLL CH1)\r\n *  @return Frequency of AUDIO PLL\r\n */\r\nuint32_t CLOCK_GetAvPllCh1Freq(void);\r\n\r\n/*! @brief  Return Frequency of AVPLL CH2\r\n *  @return Frequency of AVPLL CH2\r\n */\r\nuint32_t CLOCK_GetAvPllCh2Freq(void);\r\n\r\n/*! @brief  Return Frequency of main clk\r\n *  @return Frequency of main clk\r\n */\r\nuint32_t CLOCK_GetMainClkFreq(void);\r\n\r\n/*! @brief  Return Frequency of core/bus clk\r\n *  @return Frequency of core/bus clk\r\n */\r\nuint32_t CLOCK_GetCoreSysClkFreq(void);\r\n\r\n/*! @brief  Return Frequency of systick clk\r\n *  @return Frequency of systick clk\r\n */\r\nuint32_t CLOCK_GetSystickClkFreq(void);\r\n\r\n/*! @brief  Return Frequency of sys osc Clock\r\n *  @return Frequency of sys osc Clock. Or CLK_IN pin frequency.\r\n */\r\nstatic inline uint32_t CLOCK_GetSysOscFreq(void)\r\n{\r\n    return (CLKCTL0->SYSOSCBYPASS == 0U) ? CLK_XTAL_OSC_CLK : ((CLKCTL0->SYSOSCBYPASS == 1U) ? g_clkinFreq : 0U);\r\n}\r\n\r\n/*! @brief  Return Frequency of MCLK Input Clock\r\n *  @return Frequency of MCLK input Clock.\r\n */\r\nstatic inline uint32_t CLOCK_GetMclkInClkFreq(void)\r\n{\r\n    return g_mclkinFreq;\r\n}\r\n\r\n/*! @brief  Return Frequency of LPOSC\r\n *  @return Frequency of LPOSC\r\n */\r\nstatic inline uint32_t CLOCK_GetLpOscFreq(void)\r\n{\r\n    return CLK_XTAL_OSC_CLK / 40U;\r\n}\r\n\r\n/*! @brief  Return Frequency of CLK_32K\r\n *  @return Frequency of 32KHz osc\r\n */\r\nstatic inline uint32_t CLOCK_GetClk32KFreq(void)\r\n{\r\n    return CLK_RTC_32K_CLK;\r\n}\r\n\r\n/*! @brief  Enables and disables 32KHz XTAL\r\n *  @param  enable : true to enable 32k XTAL clock, false to disable clock\r\n */\r\nvoid CLOCK_EnableXtal32K(bool enable);\r\n\r\n/*! @brief  Enables and disables RTC 32KHz\r\n *  @param  enable : true to enable 32k RTC clock, false to disable clock\r\n */\r\nvoid CLOCK_EnableRtc32K(bool enable);\r\n\r\n/*!\r\n * @brief Set the CLKIN (CLKIN pin) frequency based on GPIO4 input.\r\n *\r\n * @param freq : The CLK_IN pin input clock frequency in Hz.\r\n */\r\nstatic inline void CLOCK_SetClkinFreq(uint32_t freq)\r\n{\r\n    g_clkinFreq = freq;\r\n}\r\n/*!\r\n * @brief Set the MCLK in (mclk_in) clock frequency based on board setting.\r\n *\r\n * @param freq : The MCLK input clock frequency in Hz.\r\n */\r\nstatic inline void CLOCK_SetMclkinFreq(uint32_t freq)\r\n{\r\n    g_mclkinFreq = freq;\r\n}\r\n\r\n/*! @brief  Return Frequency of DMIC clk\r\n *  @return Frequency of DMIC clk\r\n */\r\nuint32_t CLOCK_GetDmicClkFreq(void);\r\n\r\n/*! @brief  Return Frequency of LCD clk\r\n *  @return Frequency of LCD clk\r\n */\r\nuint32_t CLOCK_GetLcdClkFreq(void);\r\n\r\n/*! @brief  Return Frequency of WDT clk\r\n *  @return Frequency of WDT clk\r\n */\r\nuint32_t CLOCK_GetWdtClkFreq(void);\r\n\r\n/*! @brief  Return Frequency of mclk\r\n *  @return Frequency of mclk clk\r\n */\r\nuint32_t CLOCK_GetMclkClkFreq(void);\r\n\r\n/*! @brief  Return Frequency of sct\r\n *  @return Frequency of sct clk\r\n */\r\nuint32_t CLOCK_GetSctClkFreq(void);\r\n\r\n/*! @brief  Return Frequency of Flexcomm functional Clock\r\n *  @param   id    : flexcomm index to get frequency.\r\n *  @return Frequency of Flexcomm functional Clock\r\n */\r\nuint32_t CLOCK_GetFlexCommClkFreq(uint32_t id);\r\n\r\n/*! @brief  Return Frequency of CTimer Clock\r\n *  @param   id    : ctimer index to get frequency.\r\n *  @return Frequency of CTimer Clock\r\n */\r\nuint32_t CLOCK_GetCTimerClkFreq(uint32_t id);\r\n\r\n/*! @brief  Return Frequency of Utick Clock\r\n *  @return Frequency of Utick Clock\r\n */\r\nuint32_t CLOCK_GetUtickClkFreq(void);\r\n\r\n/*! @brief  Return Frequency of Flexspi Clock\r\n *  @return Frequency of Flexspi.\r\n */\r\nuint32_t CLOCK_GetFlexspiClkFreq(void);\r\n\r\n/*! @brief  Return Frequency of USIM Clock\r\n *  @return Frequency of USIM.\r\n */\r\nuint32_t CLOCK_GetUsimClkFreq(void);\r\n\r\n/*! @brief  Return Frequency of GAU Clock\r\n *  @return Frequency of GAU.\r\n */\r\nuint32_t CLOCK_GetGauClkFreq(void);\r\n\r\n/*! @brief  Return Frequency of OSTimer Clock\r\n *  @return Frequency of OSTimer.\r\n */\r\nuint32_t CLOCK_GetOSTimerClkFreq(void);\r\n\r\n/*! @brief  Initialize TCPU FVCO to target frequency.\r\n *          For 40MHz XTAL, FVCO ranges from 3000MHz to 3840MHz.\r\n            For 38.4MHz XTAL, FVCO ranges from 2995.2MHz to 3840MHz\r\n *  @param  targetHz  : Target FVCO frequency in Hz.\r\n *  @param  div       : Divider for tcpu_mci_flexspi_clk.\r\n *  @return Actual FVCO frequency in Hz.\r\n */\r\nuint32_t CLOCK_InitTcpuRefClk(uint32_t targetHz, clock_tcpu_flexspi_div_t div);\r\n\r\n/*! @brief  Deinit the TCPU reference clock.\r\n */\r\nvoid CLOCK_DeinitTcpuRefClk(void);\r\n\r\n/*! @brief  Initialize the TDDR reference clock.\r\n *  @param  div       : Divider for tddr_mci_flexspi_clk.\r\n */\r\nvoid CLOCK_InitTddrRefClk(clock_tddr_flexspi_div_t div);\r\n\r\n/*! @brief  Deinit the TDDR reference clock.\r\n */\r\nvoid CLOCK_DeinitTddrRefClk(void);\r\n\r\n/*! @brief  Initialize the T3 reference clock.\r\n *  @param  cnfg       : t3pll_mci_48_60m_irc clock configuration\r\n */\r\nvoid CLOCK_InitT3RefClk(clock_t3_mci_irc_config_t cnfg);\r\n\r\n/*! @brief  Deinit the T3 reference clock. */\r\nvoid CLOCK_DeinitT3RefClk(void);\r\n\r\n/*! @brief  Initialize the AVPLL. Both channel 1 and 2 are enabled.\r\n *  @param  cnfg       : AVPLL clock configuration\r\n */\r\nvoid CLOCK_InitAvPll(const clock_avpll_config_t *cnfg);\r\n\r\n/*! @brief  Deinit the AVPLL. All channels are disabled.\r\n */\r\nvoid CLOCK_DeinitAvPll(void);\r\n\r\n/*! @brief  Update the AVPLL channel configuration. Enable/Disable state keeps unchanged.\r\n *  @param  ch1Freq  : Channel 1 frequency to set.\r\n *  @param  ch2Freq  : Channel 2 frequency to set.\r\n *  @param  enableCali : Enable AVPLL calibration.\r\n */\r\nvoid CLOCK_ConfigAvPllCh(clock_avpll_ch_freq_t ch1Freq, clock_avpll_ch_freq_t ch2Freq, bool enableCali);\r\n\r\n/*! @brief  Enable the AVPLL channel.\r\n *  @param  enableCh1  : Enable AVPLL channel1, channel unchanged on false.\r\n *  @param  enableCh2  : Enable AVPLL channel2, channel unchanged on false.\r\n *  @param  enableCali : Enable AVPLL calibration.\r\n */\r\nvoid CLOCK_EnableAvPllCh(bool enableCh1, bool enableCh2, bool enableCali);\r\n\r\n/*! @brief  Disable the AVPLL.\r\n *  @param  disableCh1  : Disable AVPLL channel1, channel unchanged on false.\r\n *  @param  disableCh2  : Disable AVPLL channel2, channel unchanged on false.\r\n */\r\nvoid CLOCK_DisableAvPllCh(bool disableCh1, bool disableCh2);\r\n\r\n/*! @brief Enable USB HS PHY PLL clock.\r\n *\r\n * This function enables USB HS PHY PLL clock.\r\n */\r\nvoid CLOCK_EnableUsbhsPhyClock(void);\r\n\r\n/*! @brief Disable USB HS PHY PLL clock.\r\n *\r\n * This function disables USB HS PHY PLL clock.\r\n */\r\nvoid CLOCK_DisableUsbhsPhyClock(void);\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif /* __cplusplus */\r\n\r\n/*! @} */\r\n\r\n#endif /* _FSL_CLOCK_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_common.c",
    "content": "/*\r\n * Copyright (c) 2015-2016, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2021 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include \"fsl_common.h\"\r\n\r\n#define SDK_MEM_MAGIC_NUMBER 12345U\r\n\r\ntypedef struct _mem_align_control_block\r\n{\r\n    uint16_t identifier; /*!< Identifier for the memory control block. */\r\n    uint16_t offset;     /*!< offset from aligned address to real address */\r\n} mem_align_cb_t;\r\n\r\n/* Component ID definition, used by tools. */\r\n#ifndef FSL_COMPONENT_ID\r\n#define FSL_COMPONENT_ID \"platform.drivers.common\"\r\n#endif\r\n\r\n#if !((defined(__DSC__) && defined(__CW__)))\r\nvoid *SDK_Malloc(size_t size, size_t alignbytes)\r\n{\r\n    mem_align_cb_t *p_cb = NULL;\r\n    uint32_t alignedsize;\r\n\r\n    /* Check overflow. */\r\n    alignedsize = (uint32_t)(unsigned int)SDK_SIZEALIGN(size, alignbytes);\r\n    if (alignedsize < size)\r\n    {\r\n        return NULL;\r\n    }\r\n\r\n    if (alignedsize > SIZE_MAX - alignbytes - sizeof(mem_align_cb_t))\r\n    {\r\n        return NULL;\r\n    }\r\n\r\n    alignedsize += alignbytes + (uint32_t)sizeof(mem_align_cb_t);\r\n\r\n    union\r\n    {\r\n        void *pointer_value;\r\n        uintptr_t unsigned_value;\r\n    } p_align_addr, p_addr;\r\n\r\n    p_addr.pointer_value = malloc((size_t)alignedsize);\r\n\r\n    if (p_addr.pointer_value == NULL)\r\n    {\r\n        return NULL;\r\n    }\r\n\r\n    p_align_addr.unsigned_value = SDK_SIZEALIGN(p_addr.unsigned_value + sizeof(mem_align_cb_t), alignbytes);\r\n\r\n    p_cb             = (mem_align_cb_t *)(p_align_addr.unsigned_value - 4U);\r\n    p_cb->identifier = SDK_MEM_MAGIC_NUMBER;\r\n    p_cb->offset     = (uint16_t)(p_align_addr.unsigned_value - p_addr.unsigned_value);\r\n\r\n    return p_align_addr.pointer_value;\r\n}\r\n\r\nvoid SDK_Free(void *ptr)\r\n{\r\n    union\r\n    {\r\n        void *pointer_value;\r\n        uintptr_t unsigned_value;\r\n    } p_free;\r\n    p_free.pointer_value = ptr;\r\n    mem_align_cb_t *p_cb = (mem_align_cb_t *)(p_free.unsigned_value - 4U);\r\n\r\n    if (p_cb->identifier != SDK_MEM_MAGIC_NUMBER)\r\n    {\r\n        return;\r\n    }\r\n\r\n    p_free.unsigned_value = p_free.unsigned_value - p_cb->offset;\r\n\r\n    free(p_free.pointer_value);\r\n}\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_common.h",
    "content": "/*\r\n * Copyright (c) 2015-2016, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2022 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef FSL_COMMON_H_\r\n#define FSL_COMMON_H_\r\n\r\n#include <assert.h>\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include <string.h>\r\n#include <stdlib.h>\r\n\r\n#if defined(__ICCARM__) || (defined(__CC_ARM) || defined(__ARMCC_VERSION)) || defined(__GNUC__)\r\n#include <stddef.h>\r\n#endif\r\n\r\n#include \"fsl_device_registers.h\"\r\n\r\n/*!\r\n * @addtogroup ksdk_common\r\n * @{\r\n */\r\n\r\n/*******************************************************************************\r\n * Configurations\r\n ******************************************************************************/\r\n\r\n/*! @brief Macro to use the default weak IRQ handler in drivers. */\r\n#ifndef FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ\r\n#define FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ 1\r\n#endif\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*! @brief Construct a status code value from a group and code number. */\r\n#define MAKE_STATUS(group, code) ((((group)*100L) + (code)))\r\n\r\n/*! @brief Construct the version number for drivers.\r\n *\r\n * The driver version is a 32-bit number, for both 32-bit platforms(such as Cortex M)\r\n * and 16-bit platforms(such as DSC).\r\n *\r\n * @verbatim\r\n\r\n   | Unused    || Major Version || Minor Version ||  Bug Fix    |\r\n   31        25  24           17  16            9  8            0\r\n\r\n   @endverbatim\r\n */\r\n#define MAKE_VERSION(major, minor, bugfix) (((major)*65536L) + ((minor)*256L) + (bugfix))\r\n\r\n/*! @name Driver version */\r\n/*! @{ */\r\n/*! @brief common driver version. */\r\n#define FSL_COMMON_DRIVER_VERSION (MAKE_VERSION(2, 4, 2))\r\n/*! @} */\r\n\r\n/*! @name Debug console type definition. */\r\n/*! @{ */\r\n#define DEBUG_CONSOLE_DEVICE_TYPE_NONE       0U  /*!< No debug console.             */\r\n#define DEBUG_CONSOLE_DEVICE_TYPE_UART       1U  /*!< Debug console based on UART.   */\r\n#define DEBUG_CONSOLE_DEVICE_TYPE_LPUART     2U  /*!< Debug console based on LPUART. */\r\n#define DEBUG_CONSOLE_DEVICE_TYPE_LPSCI      3U  /*!< Debug console based on LPSCI.  */\r\n#define DEBUG_CONSOLE_DEVICE_TYPE_USBCDC     4U  /*!< Debug console based on USBCDC. */\r\n#define DEBUG_CONSOLE_DEVICE_TYPE_FLEXCOMM   5U  /*!< Debug console based on FLEXCOMM. */\r\n#define DEBUG_CONSOLE_DEVICE_TYPE_IUART      6U  /*!< Debug console based on i.MX UART. */\r\n#define DEBUG_CONSOLE_DEVICE_TYPE_VUSART     7U  /*!< Debug console based on LPC_VUSART. */\r\n#define DEBUG_CONSOLE_DEVICE_TYPE_MINI_USART 8U  /*!< Debug console based on LPC_USART. */\r\n#define DEBUG_CONSOLE_DEVICE_TYPE_SWO        9U  /*!< Debug console based on SWO. */\r\n#define DEBUG_CONSOLE_DEVICE_TYPE_QSCI       10U /*!< Debug console based on QSCI. */\r\n/*! @} */\r\n\r\n/*! @brief Status group numbers. */\r\nenum _status_groups\r\n{\r\n    kStatusGroup_Generic               = 0,   /*!< Group number for generic status codes. */\r\n    kStatusGroup_FLASH                 = 1,   /*!< Group number for FLASH status codes. */\r\n    kStatusGroup_LPSPI                 = 4,   /*!< Group number for LPSPI status codes. */\r\n    kStatusGroup_FLEXIO_SPI            = 5,   /*!< Group number for FLEXIO SPI status codes. */\r\n    kStatusGroup_DSPI                  = 6,   /*!< Group number for DSPI status codes. */\r\n    kStatusGroup_FLEXIO_UART           = 7,   /*!< Group number for FLEXIO UART status codes. */\r\n    kStatusGroup_FLEXIO_I2C            = 8,   /*!< Group number for FLEXIO I2C status codes. */\r\n    kStatusGroup_LPI2C                 = 9,   /*!< Group number for LPI2C status codes. */\r\n    kStatusGroup_UART                  = 10,  /*!< Group number for UART status codes. */\r\n    kStatusGroup_I2C                   = 11,  /*!< Group number for UART status codes. */\r\n    kStatusGroup_LPSCI                 = 12,  /*!< Group number for LPSCI status codes. */\r\n    kStatusGroup_LPUART                = 13,  /*!< Group number for LPUART status codes. */\r\n    kStatusGroup_SPI                   = 14,  /*!< Group number for SPI status code.*/\r\n    kStatusGroup_XRDC                  = 15,  /*!< Group number for XRDC status code.*/\r\n    kStatusGroup_SEMA42                = 16,  /*!< Group number for SEMA42 status code.*/\r\n    kStatusGroup_SDHC                  = 17,  /*!< Group number for SDHC status code */\r\n    kStatusGroup_SDMMC                 = 18,  /*!< Group number for SDMMC status code */\r\n    kStatusGroup_SAI                   = 19,  /*!< Group number for SAI status code */\r\n    kStatusGroup_MCG                   = 20,  /*!< Group number for MCG status codes. */\r\n    kStatusGroup_SCG                   = 21,  /*!< Group number for SCG status codes. */\r\n    kStatusGroup_SDSPI                 = 22,  /*!< Group number for SDSPI status codes. */\r\n    kStatusGroup_FLEXIO_I2S            = 23,  /*!< Group number for FLEXIO I2S status codes */\r\n    kStatusGroup_FLEXIO_MCULCD         = 24,  /*!< Group number for FLEXIO LCD status codes */\r\n    kStatusGroup_FLASHIAP              = 25,  /*!< Group number for FLASHIAP status codes */\r\n    kStatusGroup_FLEXCOMM_I2C          = 26,  /*!< Group number for FLEXCOMM I2C status codes */\r\n    kStatusGroup_I2S                   = 27,  /*!< Group number for I2S status codes */\r\n    kStatusGroup_IUART                 = 28,  /*!< Group number for IUART status codes */\r\n    kStatusGroup_CSI                   = 29,  /*!< Group number for CSI status codes */\r\n    kStatusGroup_MIPI_DSI              = 30,  /*!< Group number for MIPI DSI status codes */\r\n    kStatusGroup_SDRAMC                = 35,  /*!< Group number for SDRAMC status codes. */\r\n    kStatusGroup_POWER                 = 39,  /*!< Group number for POWER status codes. */\r\n    kStatusGroup_ENET                  = 40,  /*!< Group number for ENET status codes. */\r\n    kStatusGroup_PHY                   = 41,  /*!< Group number for PHY status codes. */\r\n    kStatusGroup_TRGMUX                = 42,  /*!< Group number for TRGMUX status codes. */\r\n    kStatusGroup_SMARTCARD             = 43,  /*!< Group number for SMARTCARD status codes. */\r\n    kStatusGroup_LMEM                  = 44,  /*!< Group number for LMEM status codes. */\r\n    kStatusGroup_QSPI                  = 45,  /*!< Group number for QSPI status codes. */\r\n    kStatusGroup_DMA                   = 50,  /*!< Group number for DMA status codes. */\r\n    kStatusGroup_EDMA                  = 51,  /*!< Group number for EDMA status codes. */\r\n    kStatusGroup_DMAMGR                = 52,  /*!< Group number for DMAMGR status codes. */\r\n    kStatusGroup_FLEXCAN               = 53,  /*!< Group number for FlexCAN status codes. */\r\n    kStatusGroup_LTC                   = 54,  /*!< Group number for LTC status codes. */\r\n    kStatusGroup_FLEXIO_CAMERA         = 55,  /*!< Group number for FLEXIO CAMERA status codes. */\r\n    kStatusGroup_LPC_SPI               = 56,  /*!< Group number for LPC_SPI status codes. */\r\n    kStatusGroup_LPC_USART             = 57,  /*!< Group number for LPC_USART status codes. */\r\n    kStatusGroup_DMIC                  = 58,  /*!< Group number for DMIC status codes. */\r\n    kStatusGroup_SDIF                  = 59,  /*!< Group number for SDIF status codes.*/\r\n    kStatusGroup_SPIFI                 = 60,  /*!< Group number for SPIFI status codes. */\r\n    kStatusGroup_OTP                   = 61,  /*!< Group number for OTP status codes. */\r\n    kStatusGroup_MCAN                  = 62,  /*!< Group number for MCAN status codes. */\r\n    kStatusGroup_CAAM                  = 63,  /*!< Group number for CAAM status codes. */\r\n    kStatusGroup_ECSPI                 = 64,  /*!< Group number for ECSPI status codes. */\r\n    kStatusGroup_USDHC                 = 65,  /*!< Group number for USDHC status codes.*/\r\n    kStatusGroup_LPC_I2C               = 66,  /*!< Group number for LPC_I2C status codes.*/\r\n    kStatusGroup_DCP                   = 67,  /*!< Group number for DCP status codes.*/\r\n    kStatusGroup_MSCAN                 = 68,  /*!< Group number for MSCAN status codes.*/\r\n    kStatusGroup_ESAI                  = 69,  /*!< Group number for ESAI status codes. */\r\n    kStatusGroup_FLEXSPI               = 70,  /*!< Group number for FLEXSPI status codes. */\r\n    kStatusGroup_MMDC                  = 71,  /*!< Group number for MMDC status codes. */\r\n    kStatusGroup_PDM                   = 72,  /*!< Group number for MIC status codes. */\r\n    kStatusGroup_SDMA                  = 73,  /*!< Group number for SDMA status codes. */\r\n    kStatusGroup_ICS                   = 74,  /*!< Group number for ICS status codes. */\r\n    kStatusGroup_SPDIF                 = 75,  /*!< Group number for SPDIF status codes. */\r\n    kStatusGroup_LPC_MINISPI           = 76,  /*!< Group number for LPC_MINISPI status codes. */\r\n    kStatusGroup_HASHCRYPT             = 77,  /*!< Group number for Hashcrypt status codes */\r\n    kStatusGroup_LPC_SPI_SSP           = 78,  /*!< Group number for LPC_SPI_SSP status codes. */\r\n    kStatusGroup_I3C                   = 79,  /*!< Group number for I3C status codes */\r\n    kStatusGroup_LPC_I2C_1             = 97,  /*!< Group number for LPC_I2C_1 status codes. */\r\n    kStatusGroup_NOTIFIER              = 98,  /*!< Group number for NOTIFIER status codes. */\r\n    kStatusGroup_DebugConsole          = 99,  /*!< Group number for debug console status codes. */\r\n    kStatusGroup_SEMC                  = 100, /*!< Group number for SEMC status codes. */\r\n    kStatusGroup_ApplicationRangeStart = 101, /*!< Starting number for application groups. */\r\n    kStatusGroup_IAP                   = 102, /*!< Group number for IAP status codes */\r\n    kStatusGroup_SFA                   = 103, /*!< Group number for SFA status codes*/\r\n    kStatusGroup_SPC                   = 104, /*!< Group number for SPC status codes. */\r\n    kStatusGroup_PUF                   = 105, /*!< Group number for PUF status codes. */\r\n    kStatusGroup_TOUCH_PANEL           = 106, /*!< Group number for touch panel status codes */\r\n    kStatusGroup_VBAT                  = 107, /*!< Group number for VBAT status codes */\r\n    kStatusGroup_XSPI                  = 108, /*!< Group number for XSPI status codes */\r\n    kStatusGroup_PNGDEC                = 109, /*!< Group number for PNGDEC status codes */\r\n    kStatusGroup_JPEGDEC               = 110, /*!< Group number for JPEGDEC status codes */\r\n\r\n    kStatusGroup_HAL_GPIO       = 121, /*!< Group number for HAL GPIO status codes. */\r\n    kStatusGroup_HAL_UART       = 122, /*!< Group number for HAL UART status codes. */\r\n    kStatusGroup_HAL_TIMER      = 123, /*!< Group number for HAL TIMER status codes. */\r\n    kStatusGroup_HAL_SPI        = 124, /*!< Group number for HAL SPI status codes. */\r\n    kStatusGroup_HAL_I2C        = 125, /*!< Group number for HAL I2C status codes. */\r\n    kStatusGroup_HAL_FLASH      = 126, /*!< Group number for HAL FLASH status codes. */\r\n    kStatusGroup_HAL_PWM        = 127, /*!< Group number for HAL PWM status codes. */\r\n    kStatusGroup_HAL_RNG        = 128, /*!< Group number for HAL RNG status codes. */\r\n    kStatusGroup_HAL_I2S        = 129, /*!< Group number for HAL I2S status codes. */\r\n    kStatusGroup_HAL_ADC_SENSOR = 130, /*!< Group number for HAL ADC SENSOR status codes. */\r\n    kStatusGroup_TIMERMANAGER   = 135, /*!< Group number for TiMER MANAGER status codes. */\r\n    kStatusGroup_SERIALMANAGER  = 136, /*!< Group number for SERIAL MANAGER status codes. */\r\n    kStatusGroup_LED            = 137, /*!< Group number for LED status codes. */\r\n    kStatusGroup_BUTTON         = 138, /*!< Group number for BUTTON status codes. */\r\n    kStatusGroup_EXTERN_EEPROM  = 139, /*!< Group number for EXTERN EEPROM status codes. */\r\n    kStatusGroup_SHELL          = 140, /*!< Group number for SHELL status codes. */\r\n    kStatusGroup_MEM_MANAGER    = 141, /*!< Group number for MEM MANAGER status codes. */\r\n    kStatusGroup_LIST           = 142, /*!< Group number for List status codes. */\r\n    kStatusGroup_OSA            = 143, /*!< Group number for OSA status codes. */\r\n    kStatusGroup_COMMON_TASK    = 144, /*!< Group number for Common task status codes. */\r\n    kStatusGroup_MSG            = 145, /*!< Group number for messaging status codes. */\r\n    kStatusGroup_SDK_OCOTP      = 146, /*!< Group number for OCOTP status codes. */\r\n    kStatusGroup_SDK_FLEXSPINOR = 147, /*!< Group number for FLEXSPINOR status codes.*/\r\n    kStatusGroup_CODEC          = 148, /*!< Group number for codec status codes. */\r\n    kStatusGroup_ASRC           = 149, /*!< Group number for codec status ASRC. */\r\n    kStatusGroup_OTFAD          = 150, /*!< Group number for codec status codes. */\r\n    kStatusGroup_SDIOSLV        = 151, /*!< Group number for SDIOSLV status codes. */\r\n    kStatusGroup_MECC           = 152, /*!< Group number for MECC status codes. */\r\n    kStatusGroup_ENET_QOS       = 153, /*!< Group number for ENET_QOS status codes. */\r\n    kStatusGroup_LOG            = 154, /*!< Group number for LOG status codes. */\r\n    kStatusGroup_I3CBUS         = 155, /*!< Group number for I3CBUS status codes. */\r\n    kStatusGroup_QSCI           = 156, /*!< Group number for QSCI status codes. */\r\n    kStatusGroup_ELEMU          = 157, /*!< Group number for ELEMU status codes. */\r\n    kStatusGroup_QUEUEDSPI      = 158, /*!< Group number for QSPI status codes. */\r\n    kStatusGroup_POWER_MANAGER  = 159, /*!< Group number for POWER_MANAGER status codes. */\r\n    kStatusGroup_IPED           = 160, /*!< Group number for IPED status codes. */\r\n    kStatusGroup_ELS_PKC        = 161, /*!< Group number for ELS PKC status codes. */\r\n    kStatusGroup_CSS_PKC        = 162, /*!< Group number for CSS PKC status codes. */\r\n    kStatusGroup_HOSTIF         = 163, /*!< Group number for HOSTIF status codes. */\r\n    kStatusGroup_CLIF           = 164, /*!< Group number for CLIF status codes. */\r\n    kStatusGroup_BMA            = 165, /*!< Group number for BMA status codes. */\r\n    kStatusGroup_NETC           = 166, /*!< Group number for NETC status codes. */\r\n    kStatusGroup_ELE            = 167, /*!< Group number for ELE status codes. */\r\n    kStatusGroup_GLIKEY         = 168, /*!< Group number for GLIKEY status codes. */\r\n};\r\n\r\n/*! \\public\r\n * @brief Generic status return codes.\r\n */\r\nenum\r\n{\r\n    kStatus_Success         = MAKE_STATUS(kStatusGroup_Generic, 0), /*!< Generic status for Success. */\r\n    kStatus_Fail            = MAKE_STATUS(kStatusGroup_Generic, 1), /*!< Generic status for Fail. */\r\n    kStatus_ReadOnly        = MAKE_STATUS(kStatusGroup_Generic, 2), /*!< Generic status for read only failure. */\r\n    kStatus_OutOfRange      = MAKE_STATUS(kStatusGroup_Generic, 3), /*!< Generic status for out of range access. */\r\n    kStatus_InvalidArgument = MAKE_STATUS(kStatusGroup_Generic, 4), /*!< Generic status for invalid argument check. */\r\n    kStatus_Timeout         = MAKE_STATUS(kStatusGroup_Generic, 5), /*!< Generic status for timeout. */\r\n    kStatus_NoTransferInProgress =\r\n        MAKE_STATUS(kStatusGroup_Generic, 6),            /*!< Generic status for no transfer in progress. */\r\n    kStatus_Busy = MAKE_STATUS(kStatusGroup_Generic, 7), /*!< Generic status for module is busy. */\r\n    kStatus_NoData =\r\n        MAKE_STATUS(kStatusGroup_Generic, 8), /*!< Generic status for no data is found for the operation. */\r\n};\r\n\r\n/*! @brief Type used for all status and error return values. */\r\ntypedef int32_t status_t;\r\n\r\n#ifdef __ZEPHYR__\r\n#include <zephyr/sys/util.h>\r\n#else\r\n/*!\r\n * @name Min/max macros\r\n * @{\r\n */\r\n#if !defined(MIN)\r\n/*! Computes the minimum of \\a a and \\a b. */\r\n#define MIN(a, b) (((a) < (b)) ? (a) : (b))\r\n#endif\r\n\r\n#if !defined(MAX)\r\n/*! Computes the maximum of \\a a and \\a b. */\r\n#define MAX(a, b) (((a) > (b)) ? (a) : (b))\r\n#endif\r\n/*! @} */\r\n\r\n/*! @brief Computes the number of elements in an array. */\r\n#if !defined(ARRAY_SIZE)\r\n#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))\r\n#endif\r\n#endif /* __ZEPHYR__ */\r\n\r\n/*! @name UINT16_MAX/UINT32_MAX value */\r\n/*! @{ */\r\n#if !defined(UINT16_MAX)\r\n/*! Max value of uint16_t type. */\r\n#define UINT16_MAX ((uint16_t)-1)\r\n#endif\r\n\r\n#if !defined(UINT32_MAX)\r\n/*! Max value of uint32_t type. */\r\n#define UINT32_MAX ((uint32_t)-1)\r\n#endif\r\n/*! @} */\r\n\r\n/*! Macro to get upper 32 bits of a 64-bit value */\r\n#if !defined(UINT64_H)\r\n#define UINT64_H(X)        ((uint32_t)((((uint64_t) (X)) >> 32U) & 0x0FFFFFFFFULL))\r\n#endif\r\n\r\n/*! Macro to get lower 32 bits of a 64-bit value */\r\n#if !defined(UINT64_L)\r\n#define UINT64_L(X)        ((uint32_t)(((uint64_t) (X)) & 0x0FFFFFFFFULL))\r\n#endif\r\n\r\n/*!\r\n * @def SUPPRESS_FALL_THROUGH_WARNING()\r\n *\r\n * For switch case code block, if case section ends without \"break;\" statement, there wil be\r\n * fallthrough warning with compiler flag -Wextra or -Wimplicit-fallthrough=n when using armgcc.\r\n * To suppress this warning, \"SUPPRESS_FALL_THROUGH_WARNING();\" need to be added at the end of each\r\n * case section which misses \"break;\"statement.\r\n */\r\n#if defined(__GNUC__) && !defined(__ARMCC_VERSION)\r\n#define SUPPRESS_FALL_THROUGH_WARNING() __attribute__((fallthrough))\r\n#else\r\n#define SUPPRESS_FALL_THROUGH_WARNING()\r\n#endif\r\n\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif\r\n\r\n#if !((defined(__DSC__) && defined(__CW__)))\r\n/*!\r\n * @brief Allocate memory with given alignment and aligned size.\r\n *\r\n * This is provided to support the dynamically allocated memory\r\n * used in cache-able region.\r\n * @param size The length required to malloc.\r\n * @param alignbytes The alignment size.\r\n * @retval The allocated memory.\r\n */\r\nvoid *SDK_Malloc(size_t size, size_t alignbytes);\r\n\r\n/*!\r\n * @brief Free memory.\r\n *\r\n * @param ptr The memory to be release.\r\n */\r\nvoid SDK_Free(void *ptr);\r\n#endif\r\n\r\n/*!\r\n * @brief Delay at least for some time.\r\n *  Please note that, this API uses while loop for delay, different run-time environments make the time not precise,\r\n *  if precise delay count was needed, please implement a new delay function with hardware timer.\r\n *\r\n * @param delayTime_us  Delay time in unit of microsecond.\r\n * @param coreClock_Hz  Core clock frequency with Hz.\r\n */\r\nvoid SDK_DelayAtLeastUs(uint32_t delayTime_us, uint32_t coreClock_Hz);\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n/*! @} */\r\n\r\n#if (defined(__DSC__) && defined(__CW__))\r\n#include \"fsl_common_dsc.h\"\r\n#elif defined(__XTENSA__)\r\n#include \"fsl_common_dsp.h\"\r\n#else\r\n#include \"fsl_common_arm.h\"\r\n#endif\r\n\r\n#endif /* FSL_COMMON_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_common_arm.c",
    "content": "/*\r\n * Copyright (c) 2015-2016, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2021, 2023 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include \"fsl_common.h\"\r\n\r\n/* Component ID definition, used by tools. */\r\n#ifndef FSL_COMPONENT_ID\r\n#define FSL_COMPONENT_ID \"platform.drivers.common_arm\"\r\n#endif\r\n\r\n#ifndef __GIC_PRIO_BITS\r\n#if defined(ENABLE_RAM_VECTOR_TABLE)\r\nuint32_t InstallIRQHandler(IRQn_Type irq, uint32_t irqHandler)\r\n{\r\n#ifdef __VECTOR_TABLE\r\n#undef __VECTOR_TABLE\r\n#endif\r\n\r\n/* Addresses for VECTOR_TABLE and VECTOR_RAM come from the linker file */\r\n#if defined(__CC_ARM) || defined(__ARMCC_VERSION)\r\n    extern uint32_t Image$$VECTOR_ROM$$Base[];\r\n    extern uint32_t Image$$VECTOR_RAM$$Base[];\r\n    extern uint32_t Image$$VECTOR_RAM$$ZI$$Limit[];\r\n\r\n#define __VECTOR_TABLE          Image$$VECTOR_ROM$$Base\r\n#define __VECTOR_RAM            Image$$VECTOR_RAM$$Base\r\n#define __RAM_VECTOR_TABLE_SIZE (((uint32_t)Image$$VECTOR_RAM$$ZI$$Limit - (uint32_t)Image$$VECTOR_RAM$$Base))\r\n#elif defined(__ICCARM__)\r\n    extern uint32_t __RAM_VECTOR_TABLE_SIZE[];\r\n    extern uint32_t __VECTOR_TABLE[];\r\n    extern uint32_t __VECTOR_RAM[];\r\n#elif defined(__GNUC__)\r\n    extern uint32_t __VECTOR_TABLE[];\r\n    extern uint32_t __VECTOR_RAM[];\r\n    extern uint32_t __RAM_VECTOR_TABLE_SIZE_BYTES[];\r\n    uint32_t __RAM_VECTOR_TABLE_SIZE = (uint32_t)(__RAM_VECTOR_TABLE_SIZE_BYTES);\r\n#endif /* defined(__CC_ARM) || defined(__ARMCC_VERSION) */\r\n    uint32_t n;\r\n    uint32_t ret;\r\n    uint32_t irqMaskValue;\r\n\r\n    irqMaskValue = DisableGlobalIRQ();\r\n    if (SCB->VTOR != (uint32_t)__VECTOR_RAM)\r\n    {\r\n        /* Copy the vector table from ROM to RAM */\r\n        for (n = 0; n < ((uint32_t)__RAM_VECTOR_TABLE_SIZE) / sizeof(uint32_t); n++)\r\n        {\r\n            __VECTOR_RAM[n] = __VECTOR_TABLE[n];\r\n        }\r\n        /* Point the VTOR to the position of vector table */\r\n        SCB->VTOR = (uint32_t)__VECTOR_RAM;\r\n    }\r\n\r\n    ret = __VECTOR_RAM[(int32_t)irq + 16];\r\n    /* make sure the __VECTOR_RAM is noncachable */\r\n    __VECTOR_RAM[(int32_t)irq + 16] = irqHandler;\r\n\r\n    EnableGlobalIRQ(irqMaskValue);\r\n\r\n    return ret;\r\n}\r\n#endif /* ENABLE_RAM_VECTOR_TABLE. */\r\n#endif /* __GIC_PRIO_BITS. */\r\n\r\n#if (defined(FSL_FEATURE_SOC_SYSCON_COUNT) && (FSL_FEATURE_SOC_SYSCON_COUNT > 0))\r\n\r\n/*\r\n * When FSL_FEATURE_POWERLIB_EXTEND is defined to non-zero value,\r\n * powerlib should be used instead of these functions.\r\n */\r\n#if !(defined(FSL_FEATURE_POWERLIB_EXTEND) && (FSL_FEATURE_POWERLIB_EXTEND != 0))\r\n\r\n/*\r\n * When the SYSCON STARTER registers are discontinuous, these functions are\r\n * implemented in fsl_power.c.\r\n */\r\n#if !(defined(FSL_FEATURE_SYSCON_STARTER_DISCONTINUOUS) && FSL_FEATURE_SYSCON_STARTER_DISCONTINUOUS)\r\n\r\nvoid EnableDeepSleepIRQ(IRQn_Type interrupt)\r\n{\r\n    uint32_t intNumber = (uint32_t)interrupt;\r\n\r\n    uint32_t index = 0;\r\n\r\n    while (intNumber >= 32u)\r\n    {\r\n        index++;\r\n        intNumber -= 32u;\r\n    }\r\n\r\n    SYSCON->STARTERSET[index] = 1UL << intNumber;\r\n    (void)EnableIRQ(interrupt); /* also enable interrupt at NVIC */\r\n}\r\n\r\nvoid DisableDeepSleepIRQ(IRQn_Type interrupt)\r\n{\r\n    uint32_t intNumber = (uint32_t)interrupt;\r\n\r\n    (void)DisableIRQ(interrupt); /* also disable interrupt at NVIC */\r\n    uint32_t index = 0;\r\n\r\n    while (intNumber >= 32u)\r\n    {\r\n        index++;\r\n        intNumber -= 32u;\r\n    }\r\n\r\n    SYSCON->STARTERCLR[index] = 1UL << intNumber;\r\n}\r\n#endif /* FSL_FEATURE_SYSCON_STARTER_DISCONTINUOUS */\r\n#endif /* FSL_FEATURE_POWERLIB_EXTEND */\r\n#endif /* FSL_FEATURE_SOC_SYSCON_COUNT */\r\n\r\n#if defined(DWT)\r\n/* Use WDT. */\r\nvoid MSDK_EnableCpuCycleCounter(void)\r\n{\r\n    /* Make sure the DWT trace fucntion is enabled. */\r\n    if (CoreDebug_DEMCR_TRCENA_Msk != (CoreDebug_DEMCR_TRCENA_Msk & CoreDebug->DEMCR))\r\n    {\r\n        CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;\r\n    }\r\n\r\n    /* CYCCNT not supported on this device. */\r\n    assert(DWT_CTRL_NOCYCCNT_Msk != (DWT->CTRL & DWT_CTRL_NOCYCCNT_Msk));\r\n\r\n    /* Read CYCCNT directly if CYCCENT has already been enabled, otherwise enable CYCCENT first. */\r\n    if (DWT_CTRL_CYCCNTENA_Msk != (DWT_CTRL_CYCCNTENA_Msk & DWT->CTRL))\r\n    {\r\n        DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;\r\n    }\r\n}\r\n\r\nuint32_t MSDK_GetCpuCycleCount(void)\r\n{\r\n    return DWT->CYCCNT;\r\n}\r\n#endif /* defined(DWT) */\r\n\r\n#if !(defined(SDK_DELAY_USE_DWT) && defined(DWT))\r\n/* Use software loop. */\r\n#if defined(__CC_ARM) /* This macro is arm v5 specific */\r\n/* clang-format off */\r\n__ASM static void DelayLoop(uint32_t count)\r\n{\r\nloop\r\n    SUBS R0, R0, #1\r\n    CMP  R0, #0\r\n    BNE  loop\r\n    BX   LR\r\n}\r\n#elif defined(__ARM_ARCH_8A__) /* This macro is ARMv8-A specific */\r\nstatic void DelayLoop(uint32_t count)\r\n{\r\n    __ASM volatile(\"    MOV    X0, %0\" : : \"r\"(count));\r\n    __ASM volatile(\r\n        \"loop%=:                        \\n\"\r\n        \"    SUB    X0, X0, #1          \\n\"\r\n        \"    CMP    X0, #0              \\n\"\r\n\r\n        \"    BNE    loop%=              \\n\"\r\n        :\r\n        :\r\n        : \"r0\");\r\n}\r\n/* clang-format on */\r\n#elif defined(__ARMCC_VERSION) || defined(__ICCARM__) || defined(__GNUC__)\r\n/* Cortex-M0 has a smaller instruction set, SUBS isn't supported in thumb-16 mode reported from __GNUC__ compiler,\r\n * use SUB and CMP here for compatibility */\r\nstatic void DelayLoop(uint32_t count)\r\n{\r\n    __ASM volatile(\"    MOV    R0, %0\" : : \"r\"(count));\r\n    __ASM volatile(\r\n        \"loop%=:                        \\n\"\r\n#if defined(__GNUC__) && !defined(__ARMCC_VERSION)\r\n        \"    SUB    R0, R0, #1          \\n\"\r\n#else\r\n        \"    SUBS   R0, R0, #1          \\n\"\r\n#endif\r\n        \"    CMP    R0, #0              \\n\"\r\n\r\n        \"    BNE    loop%=              \\n\"\r\n        :\r\n        :\r\n        : \"r0\");\r\n}\r\n#endif /* defined(__CC_ARM) */\r\n#endif /* defined(SDK_DELAY_USE_DWT) && defined(DWT) */\r\n\r\n/*!\r\n * @brief Delay at least for some time.\r\n *  Please note that, if not uses DWT, this API will use while loop for delay, different run-time environments have\r\n *  effect on the delay time. If precise delay is needed, please enable DWT delay. The two parmeters delayTime_us and\r\n *  coreClock_Hz have limitation. For example, in the platform with 1GHz coreClock_Hz, the delayTime_us only supports\r\n *  up to 4294967 in current code. If long time delay is needed, please implement a new delay function.\r\n *\r\n * @param delayTime_us  Delay time in unit of microsecond.\r\n * @param coreClock_Hz  Core clock frequency with Hz.\r\n */\r\nvoid SDK_DelayAtLeastUs(uint32_t delayTime_us, uint32_t coreClock_Hz)\r\n{\r\n    uint64_t count;\r\n\r\n    if (delayTime_us > 0U)\r\n    {\r\n        count = USEC_TO_COUNT(delayTime_us, coreClock_Hz);\r\n\r\n        assert(count <= UINT32_MAX);\r\n\r\n#if defined(SDK_DELAY_USE_DWT) && defined(DWT) /* Use DWT for better accuracy */\r\n\r\n        MSDK_EnableCpuCycleCounter();\r\n        /* Calculate the count ticks. */\r\n        count += MSDK_GetCpuCycleCount();\r\n\r\n        if (count > UINT32_MAX)\r\n        {\r\n            count -= UINT32_MAX;\r\n            /* Wait for cyccnt overflow. */\r\n            while (count < MSDK_GetCpuCycleCount())\r\n            {\r\n            }\r\n        }\r\n\r\n        /* Wait for cyccnt reach count value. */\r\n        while (count > MSDK_GetCpuCycleCount())\r\n        {\r\n        }\r\n#else\r\n#if defined(__CORTEX_Axx) && ((__CORTEX_Axx == 53) || (__CORTEX_Axx == 55))\r\n        /*\r\n         * Cortex-A53/A55 execution throughput:\r\n         *  - SUB/CMP: 2 instructions per cycle\r\n         *  - BNE:     1 instruction per cycle\r\n         * So, each loop takes 2 CPU cycles.\r\n         */\r\n        count = count / 2U;\r\n#elif (__CORTEX_M == 7)\r\n        /* Divide value may be different in various environment to ensure delay is precise.\r\n         * Every loop count includes three instructions, due to Cortex-M7 sometimes executes\r\n         * two instructions in one period, through test here set divide 1.5. Other M cores use\r\n         * divide 4. By the way, divide 1.5 or 4 could let the count lose precision, but it does\r\n         * not matter because other instructions outside while loop is enough to fill the time.\r\n         */\r\n        count = count / 3U * 2U;\r\n#else\r\n        count = count / 4U;\r\n#endif\r\n        DelayLoop((uint32_t)count);\r\n#endif /* defined(SDK_DELAY_USE_DWT) && defined(DWT) */\r\n    }\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_common_arm.h",
    "content": "/*\r\n * Copyright (c) 2015-2016, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2022, 2024 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef FSL_COMMON_ARM_H_\r\n#define FSL_COMMON_ARM_H_\r\n\r\n/*\r\n * For CMSIS pack RTE.\r\n * CMSIS pack RTE generates \"RTC_Components.h\" which contains the statements\r\n * of the related <RTE_Components_h> element for all selected software components.\r\n */\r\n#ifdef _RTE_\r\n#include \"RTE_Components.h\"\r\n#endif\r\n\r\n/*!\r\n * @addtogroup ksdk_common\r\n * @{\r\n */\r\n\r\n/*! @name Atomic modification\r\n *\r\n * These macros are used for atomic access, such as read-modify-write\r\n * to the peripheral registers.\r\n *\r\n * Take @ref SDK_ATOMIC_LOCAL_CLEAR_AND_SET as an example: the parameter @c addr\r\n * means the address of the peripheral register or variable you want to modify\r\n * atomically, the parameter @c clearBits is the bits to clear, the parameter\r\n * @c setBits it the bits to set.\r\n * For example, to set a 32-bit register bit1:bit0 to 0b10, use like this:\r\n *\r\n * @code\r\n   volatile uint32_t * reg = (volatile uint32_t *)REG_ADDR;\r\n\r\n   SDK_ATOMIC_LOCAL_CLEAR_AND_SET(reg, 0x03, 0x02);\r\n   @endcode\r\n *\r\n * In this example, the register bit1:bit0 are cleared and bit1 is set, as a result,\r\n * register bit1:bit0 = 0b10.\r\n *\r\n * @note For the platforms don't support exclusive load and store, these macros\r\n * disable the global interrupt to pretect the modification.\r\n *\r\n * @note These macros only guarantee the local processor atomic operations. For\r\n * the multi-processor devices, use hardware semaphore such as SEMA42 to\r\n * guarantee exclusive access if necessary.\r\n *\r\n * @{\r\n */\r\n\r\n/*!\r\n * @def SDK_ATOMIC_LOCAL_ADD(addr, val)\r\n * Add value \\a val from the variable at address \\a address.\r\n *\r\n * @def SDK_ATOMIC_LOCAL_SUB(addr, val)\r\n * Subtract value \\a val to the variable at address \\a address.\r\n *\r\n * @def SDK_ATOMIC_LOCAL_SET(addr, bits)\r\n * Set the bits specifiled by \\a bits to the variable at address \\a address.\r\n *\r\n * @def SDK_ATOMIC_LOCAL_CLEAR(addr, bits)\r\n * Clear the bits specifiled by \\a bits to the variable at address \\a address.\r\n *\r\n * @def SDK_ATOMIC_LOCAL_TOGGLE(addr, bits)\r\n * Toggle the bits specifiled by \\a bits to the variable at address \\a address.\r\n *\r\n * @def SDK_ATOMIC_LOCAL_CLEAR_AND_SET(addr, clearBits, setBits)\r\n * For the variable at address \\a address, clear the bits specifiled by \\a clearBits\r\n * and set the bits specifiled by \\a setBits.\r\n */\r\n\r\n/* clang-format off */\r\n#if ((defined(__ARM_ARCH_7M__     ) && (__ARM_ARCH_7M__      == 1)) || \\\r\n     (defined(__ARM_ARCH_7EM__    ) && (__ARM_ARCH_7EM__     == 1)) || \\\r\n     (defined(__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) || \\\r\n     (defined(__ARM_ARCH_8M_BASE__) && (__ARM_ARCH_8M_BASE__ == 1)))\r\n/* clang-format on */\r\n\r\n/* If the LDREX and STREX are supported, use them. */\r\n#define _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, val, ops) \\\r\n    do                                              \\\r\n    {                                               \\\r\n        (val) = __LDREXB(addr);                     \\\r\n        (ops);                                      \\\r\n    } while (0UL != __STREXB((val), (addr)))\r\n\r\n#define _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, val, ops) \\\r\n    do                                              \\\r\n    {                                               \\\r\n        (val) = __LDREXH(addr);                     \\\r\n        (ops);                                      \\\r\n    } while (0UL != __STREXH((val), (addr)))\r\n\r\n#define _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, val, ops) \\\r\n    do                                              \\\r\n    {                                               \\\r\n        (val) = __LDREXW(addr);                     \\\r\n        (ops);                                      \\\r\n    } while (0UL != __STREXW((val), (addr)))\r\n\r\nstatic inline void _SDK_AtomicLocalAdd1Byte(volatile uint8_t *addr, uint8_t val)\r\n{\r\n    uint8_t s_val;\r\n\r\n    _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val += val);\r\n}\r\n\r\nstatic inline void _SDK_AtomicLocalAdd2Byte(volatile uint16_t *addr, uint16_t val)\r\n{\r\n    uint16_t s_val;\r\n\r\n    _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val += val);\r\n}\r\n\r\nstatic inline void _SDK_AtomicLocalAdd4Byte(volatile uint32_t *addr, uint32_t val)\r\n{\r\n    uint32_t s_val;\r\n\r\n    _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val += val);\r\n}\r\n\r\nstatic inline void _SDK_AtomicLocalSub1Byte(volatile uint8_t *addr, uint8_t val)\r\n{\r\n    uint8_t s_val;\r\n\r\n    _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val -= val);\r\n}\r\n\r\nstatic inline void _SDK_AtomicLocalSub2Byte(volatile uint16_t *addr, uint16_t val)\r\n{\r\n    uint16_t s_val;\r\n\r\n    _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val -= val);\r\n}\r\n\r\nstatic inline void _SDK_AtomicLocalSub4Byte(volatile uint32_t *addr, uint32_t val)\r\n{\r\n    uint32_t s_val;\r\n\r\n    _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val -= val);\r\n}\r\n\r\nstatic inline void _SDK_AtomicLocalSet1Byte(volatile uint8_t *addr, uint8_t bits)\r\n{\r\n    uint8_t s_val;\r\n\r\n    _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val |= bits);\r\n}\r\n\r\nstatic inline void _SDK_AtomicLocalSet2Byte(volatile uint16_t *addr, uint16_t bits)\r\n{\r\n    uint16_t s_val;\r\n\r\n    _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val |= bits);\r\n}\r\n\r\nstatic inline void _SDK_AtomicLocalSet4Byte(volatile uint32_t *addr, uint32_t bits)\r\n{\r\n    uint32_t s_val;\r\n\r\n    _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val |= bits);\r\n}\r\n\r\nstatic inline void _SDK_AtomicLocalClear1Byte(volatile uint8_t *addr, uint8_t bits)\r\n{\r\n    uint8_t s_val;\r\n\r\n    _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val &= ~bits);\r\n}\r\n\r\nstatic inline void _SDK_AtomicLocalClear2Byte(volatile uint16_t *addr, uint16_t bits)\r\n{\r\n    uint16_t s_val;\r\n\r\n    _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val &= ~bits);\r\n}\r\n\r\nstatic inline void _SDK_AtomicLocalClear4Byte(volatile uint32_t *addr, uint32_t bits)\r\n{\r\n    uint32_t s_val;\r\n\r\n    _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val &= ~bits);\r\n}\r\n\r\nstatic inline void _SDK_AtomicLocalToggle1Byte(volatile uint8_t *addr, uint8_t bits)\r\n{\r\n    uint8_t s_val;\r\n\r\n    _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val ^= bits);\r\n}\r\n\r\nstatic inline void _SDK_AtomicLocalToggle2Byte(volatile uint16_t *addr, uint16_t bits)\r\n{\r\n    uint16_t s_val;\r\n\r\n    _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val ^= bits);\r\n}\r\n\r\nstatic inline void _SDK_AtomicLocalToggle4Byte(volatile uint32_t *addr, uint32_t bits)\r\n{\r\n    uint32_t s_val;\r\n\r\n    _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val ^= bits);\r\n}\r\n\r\nstatic inline void _SDK_AtomicLocalClearAndSet1Byte(volatile uint8_t *addr, uint8_t clearBits, uint8_t setBits)\r\n{\r\n    uint8_t s_val;\r\n\r\n    _SDK_ATOMIC_LOCAL_OPS_1BYTE(addr, s_val, s_val = (s_val & ~clearBits) | setBits);\r\n}\r\n\r\nstatic inline void _SDK_AtomicLocalClearAndSet2Byte(volatile uint16_t *addr, uint16_t clearBits, uint16_t setBits)\r\n{\r\n    uint16_t s_val;\r\n\r\n    _SDK_ATOMIC_LOCAL_OPS_2BYTE(addr, s_val, s_val = (s_val & ~clearBits) | setBits);\r\n}\r\n\r\nstatic inline void _SDK_AtomicLocalClearAndSet4Byte(volatile uint32_t *addr, uint32_t clearBits, uint32_t setBits)\r\n{\r\n    uint32_t s_val;\r\n\r\n    _SDK_ATOMIC_LOCAL_OPS_4BYTE(addr, s_val, s_val = (s_val & ~clearBits) | setBits);\r\n}\r\n\r\n#define SDK_ATOMIC_LOCAL_ADD(addr, val)                                                                                        \\\r\n    ((1UL == sizeof(*(addr))) ?                                                                                                \\\r\n         _SDK_AtomicLocalAdd1Byte((volatile uint8_t *)(volatile void *)(addr), (uint8_t)(val)) :                               \\\r\n         ((2UL == sizeof(*(addr))) ? _SDK_AtomicLocalAdd2Byte((volatile uint16_t *)(volatile void *)(addr), (uint16_t)(val)) : \\\r\n                                     _SDK_AtomicLocalAdd4Byte((volatile uint32_t *)(volatile void *)(addr), (uint32_t)(val))))\r\n\r\n#define SDK_ATOMIC_LOCAL_SUB(addr, val)                                                                                        \\\r\n    ((1UL == sizeof(*(addr))) ?                                                                                                \\\r\n         _SDK_AtomicLocalSub1Byte((volatile uint8_t *)(volatile void *)(addr), (uint8_t)(val)) :                               \\\r\n         ((2UL == sizeof(*(addr))) ? _SDK_AtomicLocalSub2Byte((volatile uint16_t *)(volatile void *)(addr), (uint16_t)(val)) : \\\r\n                                     _SDK_AtomicLocalSub4Byte((volatile uint32_t *)(volatile void *)(addr), (uint32_t)(val))))\r\n\r\n#define SDK_ATOMIC_LOCAL_SET(addr, bits)                                                                                        \\\r\n    ((1UL == sizeof(*(addr))) ?                                                                                                 \\\r\n         _SDK_AtomicLocalSet1Byte((volatile uint8_t *)(volatile void *)(addr), (uint8_t)(bits)) :                               \\\r\n         ((2UL == sizeof(*(addr))) ? _SDK_AtomicLocalSet2Byte((volatile uint16_t *)(volatile void *)(addr), (uint16_t)(bits)) : \\\r\n                                     _SDK_AtomicLocalSet4Byte((volatile uint32_t *)(volatile void *)(addr), (uint32_t)(bits))))\r\n\r\n#define SDK_ATOMIC_LOCAL_CLEAR(addr, bits)                                                                 \\\r\n    ((1UL == sizeof(*(addr))) ?                                                                            \\\r\n         _SDK_AtomicLocalClear1Byte((volatile uint8_t *)(volatile void *)(addr), (uint8_t)(bits)) :        \\\r\n         ((2UL == sizeof(*(addr))) ?                                                                       \\\r\n              _SDK_AtomicLocalClear2Byte((volatile uint16_t *)(volatile void *)(addr), (uint16_t)(bits)) : \\\r\n              _SDK_AtomicLocalClear4Byte((volatile uint32_t *)(volatile void *)(addr), (uint32_t)(bits))))\r\n\r\n#define SDK_ATOMIC_LOCAL_TOGGLE(addr, bits)                                                                 \\\r\n    ((1UL == sizeof(*(addr))) ?                                                                             \\\r\n         _SDK_AtomicLocalToggle1Byte((volatile uint8_t *)(volatile void *)(addr), (uint8_t)(bits)) :        \\\r\n         ((2UL == sizeof(*(addr))) ?                                                                        \\\r\n              _SDK_AtomicLocalToggle2Byte((volatile uint16_t *)(volatile void *)(addr), (uint16_t)(bits)) : \\\r\n              _SDK_AtomicLocalToggle4Byte((volatile uint32_t *)(volatile void *)(addr), (uint32_t)(bits))))\r\n\r\n#define SDK_ATOMIC_LOCAL_CLEAR_AND_SET(addr, clearBits, setBits)                                                                           \\\r\n    ((1UL == sizeof(*(addr))) ?                                                                                                            \\\r\n         _SDK_AtomicLocalClearAndSet1Byte((volatile uint8_t *)(volatile void *)(addr), (uint8_t)(clearBits), (uint8_t)(setBits)) :         \\\r\n         ((2UL == sizeof(*(addr))) ?                                                                                                       \\\r\n              _SDK_AtomicLocalClearAndSet2Byte((volatile uint16_t *)(volatile void *)(addr), (uint16_t)(clearBits), (uint16_t)(setBits)) : \\\r\n              _SDK_AtomicLocalClearAndSet4Byte((volatile uint32_t *)(volatile void *)(addr), (uint32_t)(clearBits), (uint32_t)(setBits))))\r\n#else\r\n\r\n#define SDK_ATOMIC_LOCAL_ADD(addr, val)      \\\r\n    do                                       \\\r\n    {                                        \\\r\n        uint32_t s_atomicOldInt;             \\\r\n        s_atomicOldInt = DisableGlobalIRQ(); \\\r\n        *(addr) += (val);                    \\\r\n        EnableGlobalIRQ(s_atomicOldInt);     \\\r\n    } while (false)\r\n\r\n#define SDK_ATOMIC_LOCAL_SUB(addr, val)      \\\r\n    do                                       \\\r\n    {                                        \\\r\n        uint32_t s_atomicOldInt;             \\\r\n        s_atomicOldInt = DisableGlobalIRQ(); \\\r\n        *(addr) -= (val);                    \\\r\n        EnableGlobalIRQ(s_atomicOldInt);     \\\r\n    } while (false)\r\n\r\n#define SDK_ATOMIC_LOCAL_SET(addr, bits)     \\\r\n    do                                       \\\r\n    {                                        \\\r\n        uint32_t s_atomicOldInt;             \\\r\n        s_atomicOldInt = DisableGlobalIRQ(); \\\r\n        *(addr) |= (bits);                   \\\r\n        EnableGlobalIRQ(s_atomicOldInt);     \\\r\n    } while (false)\r\n\r\n#define SDK_ATOMIC_LOCAL_CLEAR(addr, bits)   \\\r\n    do                                       \\\r\n    {                                        \\\r\n        uint32_t s_atomicOldInt;             \\\r\n        s_atomicOldInt = DisableGlobalIRQ(); \\\r\n        *(addr) &= ~(bits);                  \\\r\n        EnableGlobalIRQ(s_atomicOldInt);     \\\r\n    } while (false)\r\n\r\n#define SDK_ATOMIC_LOCAL_TOGGLE(addr, bits)  \\\r\n    do                                       \\\r\n    {                                        \\\r\n        uint32_t s_atomicOldInt;             \\\r\n        s_atomicOldInt = DisableGlobalIRQ(); \\\r\n        *(addr) ^= (bits);                   \\\r\n        EnableGlobalIRQ(s_atomicOldInt);     \\\r\n    } while (false)\r\n\r\n#define SDK_ATOMIC_LOCAL_CLEAR_AND_SET(addr, clearBits, setBits) \\\r\n    do                                                           \\\r\n    {                                                            \\\r\n        uint32_t s_atomicOldInt;                                 \\\r\n        s_atomicOldInt = DisableGlobalIRQ();                     \\\r\n        *(addr)        = (*(addr) & ~(clearBits)) | (setBits);   \\\r\n        EnableGlobalIRQ(s_atomicOldInt);                         \\\r\n    } while (false)\r\n\r\n#endif\r\n/*! @} */\r\n\r\n/*! @name Timer utilities */\r\n/*! @{ */\r\n/*! Macro to convert a microsecond period to raw count value */\r\n#define USEC_TO_COUNT(us, clockFreqInHz) (uint64_t)(((uint64_t)(us) * (clockFreqInHz)) / 1000000U)\r\n/*! Macro to convert a raw count value to microsecond */\r\n#define COUNT_TO_USEC(count, clockFreqInHz) (uint64_t)((uint64_t)(count)*1000000U / (clockFreqInHz))\r\n\r\n/*! Macro to convert a millisecond period to raw count value */\r\n#define MSEC_TO_COUNT(ms, clockFreqInHz) (uint64_t)((uint64_t)(ms) * (clockFreqInHz) / 1000U)\r\n/*! Macro to convert a raw count value to millisecond */\r\n#define COUNT_TO_MSEC(count, clockFreqInHz) (uint64_t)((uint64_t)(count)*1000U / (clockFreqInHz))\r\n/*! @} */\r\n\r\n/*! @name ISR exit barrier\r\n * @{\r\n *\r\n * ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping\r\n * exception return operation might vector to incorrect interrupt.\r\n * For Cortex-M7, if core speed much faster than peripheral register write speed,\r\n * the peripheral interrupt flags may be still set after exiting ISR, this results to\r\n * the same error similar with errata 83869.\r\n */\r\n#if (defined __CORTEX_M) && ((__CORTEX_M == 4U) || (__CORTEX_M == 7U))\r\n#define SDK_ISR_EXIT_BARRIER __DSB()\r\n#else\r\n#define SDK_ISR_EXIT_BARRIER\r\n#endif\r\n\r\n/*! @} */\r\n\r\n/*! @name Alignment variable definition macros */\r\n/*! @{ */\r\n#if (defined(__ICCARM__))\r\n/*\r\n * Workaround to disable MISRA C message suppress warnings for IAR compiler.\r\n * http:/ /supp.iar.com/Support/?note=24725\r\n */\r\n_Pragma(\"diag_suppress=Pm120\")\r\n#define SDK_PRAGMA(x) _Pragma(#x)\r\n    _Pragma(\"diag_error=Pm120\")\r\n/*! Macro to define a variable with alignbytes alignment */\r\n#define SDK_ALIGN(var, alignbytes) SDK_PRAGMA(data_alignment = alignbytes) var\r\n#elif defined(__CC_ARM) || defined(__ARMCC_VERSION)\r\n/*! Macro to define a variable with alignbytes alignment */\r\n#define SDK_ALIGN(var, alignbytes) __attribute__((aligned(alignbytes))) var\r\n#elif defined(__GNUC__) || defined(DOXYGEN_OUTPUT)\r\n/*! Macro to define a variable with alignbytes alignment */\r\n#define SDK_ALIGN(var, alignbytes) var __attribute__((aligned(alignbytes)))\r\n#else\r\n#error Toolchain not supported\r\n#endif\r\n\r\n/*! Macro to define a variable with L1 d-cache line size alignment */\r\n#if defined(FSL_FEATURE_L1DCACHE_LINESIZE_BYTE)\r\n#define SDK_L1DCACHE_ALIGN(var) SDK_ALIGN(var, FSL_FEATURE_L1DCACHE_LINESIZE_BYTE)\r\n#endif\r\n/*! Macro to define a variable with L2 cache line size alignment */\r\n#if defined(FSL_FEATURE_L2CACHE_LINESIZE_BYTE)\r\n#define SDK_L2CACHE_ALIGN(var) SDK_ALIGN(var, FSL_FEATURE_L2CACHE_LINESIZE_BYTE)\r\n#endif\r\n\r\n/*! Macro to change a value to a given size aligned value */\r\n#define SDK_SIZEALIGN(var, alignbytes) \\\r\n    ((unsigned int)((var) + ((alignbytes)-1U)) & (unsigned int)(~(unsigned int)((alignbytes)-1U)))\r\n/*! @} */\r\n\r\n/*!\r\n * @name Non-cacheable region definition macros\r\n *\r\n * For initialized non-zero non-cacheable variables, please use \"AT_NONCACHEABLE_SECTION_INIT(var) ={xx};\" or\r\n * \"AT_NONCACHEABLE_SECTION_ALIGN_INIT(var) ={xx};\" in your projects to define them. For zero-inited non-cacheable\r\n * variables, please use \"AT_NONCACHEABLE_SECTION(var);\" or \"AT_NONCACHEABLE_SECTION_ALIGN(var);\" to define them,\r\n * these zero-inited variables will be initialized to zero in system startup.\r\n *\r\n * @note For GCC, when the non-cacheable section is required, please define \"__STARTUP_INITIALIZE_NONCACHEDATA\"\r\n * in your projects to make sure the non-cacheable section variables will be initialized in system startup.\r\n *\r\n * @{\r\n */\r\n\r\n/*!\r\n * @def AT_NONCACHEABLE_SECTION(var)\r\n * Define a variable \\a var, and place it in non-cacheable section.\r\n *\r\n * @def AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes)\r\n * Define a variable \\a var, and place it in non-cacheable section, the start address\r\n * of the variable is aligned to \\a alignbytes.\r\n *\r\n * @def AT_NONCACHEABLE_SECTION_INIT(var)\r\n * Define a variable \\a var with initial value, and place it in non-cacheable section.\r\n *\r\n * @def AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes)\r\n * Define a variable \\a var with initial value, and place it in non-cacheable section,\r\n * the start address of the variable is aligned to \\a alignbytes.\r\n */\r\n\r\n#if ((!(defined(FSL_FEATURE_HAS_NO_NONCACHEABLE_SECTION) && FSL_FEATURE_HAS_NO_NONCACHEABLE_SECTION)) && \\\r\n     defined(FSL_FEATURE_L1ICACHE_LINESIZE_BYTE))\r\n\r\n#if (defined(__ICCARM__))\r\n#define AT_NONCACHEABLE_SECTION(var)                   var @\"NonCacheable\"\r\n#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) SDK_PRAGMA(data_alignment = alignbytes) var @\"NonCacheable\"\r\n#define AT_NONCACHEABLE_SECTION_INIT(var)              var @\"NonCacheable.init\"\r\n#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) \\\r\n    SDK_PRAGMA(data_alignment = alignbytes) var @\"NonCacheable.init\"\r\n\r\n#elif (defined(__CC_ARM) || defined(__ARMCC_VERSION))\r\n#define AT_NONCACHEABLE_SECTION_INIT(var) __attribute__((section(\"NonCacheable.init\"))) var\r\n#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) \\\r\n    __attribute__((section(\"NonCacheable.init\"))) __attribute__((aligned(alignbytes))) var\r\n#if (defined(__CC_ARM))\r\n#define AT_NONCACHEABLE_SECTION(var) __attribute__((section(\"NonCacheable\"), zero_init)) var\r\n#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) \\\r\n    __attribute__((section(\"NonCacheable\"), zero_init)) __attribute__((aligned(alignbytes))) var\r\n#else\r\n#define AT_NONCACHEABLE_SECTION(var) __attribute__((section(\".bss.NonCacheable\"))) var\r\n#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) \\\r\n    __attribute__((section(\".bss.NonCacheable\"))) __attribute__((aligned(alignbytes))) var\r\n#endif\r\n\r\n#elif (defined(__GNUC__)) || defined(DOXYGEN_OUTPUT)\r\n/* For GCC, when the non-cacheable section is required, please define \"__STARTUP_INITIALIZE_NONCACHEDATA\"\r\n * in your projects to make sure the non-cacheable section variables will be initialized in system startup.\r\n */\r\n#define AT_NONCACHEABLE_SECTION_INIT(var) __attribute__((section(\"NonCacheable.init\"))) var\r\n#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) \\\r\n    __attribute__((section(\"NonCacheable.init\"))) var __attribute__((aligned(alignbytes)))\r\n#define AT_NONCACHEABLE_SECTION(var) __attribute__((section(\"NonCacheable,\\\"aw\\\",%nobits @\"))) var\r\n#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes) \\\r\n    __attribute__((section(\"NonCacheable,\\\"aw\\\",%nobits @\"))) var __attribute__((aligned(alignbytes)))\r\n#else\r\n#error Toolchain not supported.\r\n#endif\r\n\r\n#else\r\n\r\n#define AT_NONCACHEABLE_SECTION(var)                        var\r\n#define AT_NONCACHEABLE_SECTION_ALIGN(var, alignbytes)      SDK_ALIGN(var, alignbytes)\r\n#define AT_NONCACHEABLE_SECTION_INIT(var)                   var\r\n#define AT_NONCACHEABLE_SECTION_ALIGN_INIT(var, alignbytes) SDK_ALIGN(var, alignbytes)\r\n\r\n#endif\r\n\r\n/*! @} */\r\n\r\n/*!\r\n * @name Time sensitive region\r\n * @{\r\n */\r\n\r\n/*!\r\n * @def AT_QUICKACCESS_SECTION_CODE(func)\r\n * Place function in a section which can be accessed quickly by core.\r\n *\r\n * @def AT_QUICKACCESS_SECTION_DATA(var)\r\n * Place data in a section which can be accessed quickly by core.\r\n *\r\n * @def AT_QUICKACCESS_SECTION_DATA_ALIGN(var, alignbytes)\r\n * Place data in a section which can be accessed quickly by core, and the variable\r\n * address is set to align with \\a alignbytes.\r\n */\r\n#if (defined(__ICCARM__))\r\n#define AT_QUICKACCESS_SECTION_CODE(func) func @\"CodeQuickAccess\"\r\n#define AT_QUICKACCESS_SECTION_DATA(var)  var @\"DataQuickAccess\"\r\n#define AT_QUICKACCESS_SECTION_DATA_ALIGN(var, alignbytes) \\\r\n    SDK_PRAGMA(data_alignment = alignbytes) var @\"DataQuickAccess\"\r\n#elif (defined(__CC_ARM) || defined(__ARMCC_VERSION))\r\n#define AT_QUICKACCESS_SECTION_CODE(func) __attribute__((section(\"CodeQuickAccess\"), __noinline__)) func\r\n#define AT_QUICKACCESS_SECTION_DATA(var)  __attribute__((section(\"DataQuickAccess\"))) var\r\n#define AT_QUICKACCESS_SECTION_DATA_ALIGN(var, alignbytes) \\\r\n    __attribute__((section(\"DataQuickAccess\"))) __attribute__((aligned(alignbytes))) var\r\n#elif (defined(__GNUC__)) || defined(DOXYGEN_OUTPUT)\r\n#define AT_QUICKACCESS_SECTION_CODE(func) __attribute__((section(\"CodeQuickAccess\"), __noinline__)) func\r\n#define AT_QUICKACCESS_SECTION_DATA(var)  __attribute__((section(\"DataQuickAccess\"))) var\r\n#define AT_QUICKACCESS_SECTION_DATA_ALIGN(var, alignbytes) \\\r\n    __attribute__((section(\"DataQuickAccess\"))) var __attribute__((aligned(alignbytes)))\r\n#else\r\n#error Toolchain not supported.\r\n#endif /* defined(__ICCARM__) */\r\n/*! @} */\r\n\r\n/*!\r\n * @name Ram Function\r\n * @{\r\n *\r\n * @def RAMFUNCTION_SECTION_CODE(func)\r\n * Place function in ram.\r\n */\r\n#if (defined(__ICCARM__))\r\n#define RAMFUNCTION_SECTION_CODE(func) func @\"RamFunction\"\r\n#elif (defined(__CC_ARM) || defined(__ARMCC_VERSION))\r\n#define RAMFUNCTION_SECTION_CODE(func) __attribute__((section(\"RamFunction\"))) func\r\n#elif (defined(__GNUC__)) || defined(DOXYGEN_OUTPUT)\r\n#define RAMFUNCTION_SECTION_CODE(func) __attribute__((section(\"RamFunction\"))) func\r\n#else\r\n#error Toolchain not supported.\r\n#endif /* defined(__ICCARM__) */\r\n/*! @} */\r\n\r\n/*!\r\n * @def MSDK_REG_SECURE_ADDR(x)\r\n * Convert the register address to the one used in secure mode.\r\n *\r\n * @def MSDK_REG_NONSECURE_ADDR(x)\r\n * Convert the register address to the one used in non-secure mode.\r\n */\r\n\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n#define MSDK_REG_SECURE_ADDR(x) ((uintptr_t)(x) | (0x1UL << 28))\r\n#define MSDK_REG_NONSECURE_ADDR(x) ((uintptr_t)(x) & ~(0x1UL << 28))\r\n#else\r\n#define MSDK_REG_SECURE_ADDR(x) (x)\r\n#define MSDK_REG_NONSECURE_ADDR(x) (x)\r\n#endif\r\n\r\n#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\r\n        void DefaultISR(void);\r\n#endif\r\n\r\n/*\r\n * The fsl_clock.h is included here because it needs MAKE_VERSION/MAKE_STATUS/status_t\r\n * defined in previous of this file.\r\n */\r\n#include \"fsl_clock.h\"\r\n\r\n/*\r\n * Chip level peripheral reset API, for MCUs that implement peripheral reset control external to a peripheral\r\n */\r\n#if ((defined(FSL_FEATURE_SOC_SYSCON_COUNT) && (FSL_FEATURE_SOC_SYSCON_COUNT > 0)) || \\\r\n     (defined(FSL_FEATURE_SOC_ASYNC_SYSCON_COUNT) && (FSL_FEATURE_SOC_ASYNC_SYSCON_COUNT > 0)))\r\n#include \"fsl_reset.h\"\r\n#endif\r\n\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif /* __cplusplus*/\r\n\r\n/*!\r\n * @brief Enable specific interrupt.\r\n *\r\n * Enable LEVEL1 interrupt. For some devices, there might be multiple interrupt\r\n * levels. For example, there are NVIC and intmux. Here the interrupts connected\r\n * to NVIC are the LEVEL1 interrupts, because they are routed to the core directly.\r\n * The interrupts connected to intmux are the LEVEL2 interrupts, they are routed\r\n * to NVIC first then routed to core.\r\n *\r\n * This function only enables the LEVEL1 interrupts. The number of LEVEL1 interrupts\r\n * is indicated by the feature macro FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS.\r\n *\r\n * @param interrupt The IRQ number.\r\n * @retval kStatus_Success Interrupt enabled successfully\r\n * @retval kStatus_Fail Failed to enable the interrupt\r\n */\r\nstatic inline status_t EnableIRQ(IRQn_Type interrupt)\r\n{\r\n    status_t status = kStatus_Success;\r\n\r\n    if (NotAvail_IRQn == interrupt)\r\n    {\r\n        status = kStatus_Fail;\r\n    }\r\n\r\n#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0)\r\n    else if ((int32_t)interrupt >= (int32_t)FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS)\r\n    {\r\n        status = kStatus_Fail;\r\n    }\r\n#endif\r\n\r\n    else\r\n    {\r\n#if defined(__GIC_PRIO_BITS)\r\n        GIC_EnableIRQ(interrupt);\r\n#else\r\n        NVIC_EnableIRQ(interrupt);\r\n#endif\r\n    }\r\n\r\n    return status;\r\n}\r\n\r\n/*!\r\n * @brief Disable specific interrupt.\r\n *\r\n * Disable LEVEL1 interrupt. For some devices, there might be multiple interrupt\r\n * levels. For example, there are NVIC and intmux. Here the interrupts connected\r\n * to NVIC are the LEVEL1 interrupts, because they are routed to the core directly.\r\n * The interrupts connected to intmux are the LEVEL2 interrupts, they are routed\r\n * to NVIC first then routed to core.\r\n *\r\n * This function only disables the LEVEL1 interrupts. The number of LEVEL1 interrupts\r\n * is indicated by the feature macro FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS.\r\n *\r\n * @param interrupt The IRQ number.\r\n * @retval kStatus_Success Interrupt disabled successfully\r\n * @retval kStatus_Fail Failed to disable the interrupt\r\n */\r\nstatic inline status_t DisableIRQ(IRQn_Type interrupt)\r\n{\r\n    status_t status = kStatus_Success;\r\n\r\n    if (NotAvail_IRQn == interrupt)\r\n    {\r\n        status = kStatus_Fail;\r\n    }\r\n\r\n#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0)\r\n    else if ((int32_t)interrupt >= (int32_t)FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS)\r\n    {\r\n        status = kStatus_Fail;\r\n    }\r\n#endif\r\n\r\n    else\r\n    {\r\n#if defined(__GIC_PRIO_BITS)\r\n        GIC_DisableIRQ(interrupt);\r\n#else\r\n        NVIC_DisableIRQ(interrupt);\r\n#endif\r\n    }\r\n\r\n    return status;\r\n}\r\n\r\n/*!\r\n * @brief Enable the IRQ, and also set the interrupt priority.\r\n *\r\n * Only handle LEVEL1 interrupt. For some devices, there might be multiple interrupt\r\n * levels. For example, there are NVIC and intmux. Here the interrupts connected\r\n * to NVIC are the LEVEL1 interrupts, because they are routed to the core directly.\r\n * The interrupts connected to intmux are the LEVEL2 interrupts, they are routed\r\n * to NVIC first then routed to core.\r\n *\r\n * This function only handles the LEVEL1 interrupts. The number of LEVEL1 interrupts\r\n * is indicated by the feature macro FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS.\r\n *\r\n * @param interrupt The IRQ to Enable.\r\n * @param priNum Priority number set to interrupt controller register.\r\n * @retval kStatus_Success Interrupt priority set successfully\r\n * @retval kStatus_Fail Failed to set the interrupt priority.\r\n */\r\nstatic inline status_t EnableIRQWithPriority(IRQn_Type interrupt, uint8_t priNum)\r\n{\r\n    status_t status = kStatus_Success;\r\n\r\n    if (NotAvail_IRQn == interrupt)\r\n    {\r\n        status = kStatus_Fail;\r\n    }\r\n\r\n#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0)\r\n    else if ((int32_t)interrupt >= (int32_t)FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS)\r\n    {\r\n        status = kStatus_Fail;\r\n    }\r\n#endif\r\n\r\n    else\r\n    {\r\n#if defined(__GIC_PRIO_BITS)\r\n        GIC_SetPriority(interrupt, priNum);\r\n        GIC_EnableIRQ(interrupt);\r\n#else\r\n        NVIC_SetPriority(interrupt, priNum);\r\n        NVIC_EnableIRQ(interrupt);\r\n#endif\r\n    }\r\n\r\n    return status;\r\n}\r\n\r\n/*!\r\n * @brief Set the IRQ priority.\r\n *\r\n * Only handle LEVEL1 interrupt. For some devices, there might be multiple interrupt\r\n * levels. For example, there are NVIC and intmux. Here the interrupts connected\r\n * to NVIC are the LEVEL1 interrupts, because they are routed to the core directly.\r\n * The interrupts connected to intmux are the LEVEL2 interrupts, they are routed\r\n * to NVIC first then routed to core.\r\n *\r\n * This function only handles the LEVEL1 interrupts. The number of LEVEL1 interrupts\r\n * is indicated by the feature macro FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS.\r\n *\r\n * @param interrupt The IRQ to set.\r\n * @param priNum Priority number set to interrupt controller register.\r\n *\r\n * @retval kStatus_Success Interrupt priority set successfully\r\n * @retval kStatus_Fail Failed to set the interrupt priority.\r\n */\r\nstatic inline status_t IRQ_SetPriority(IRQn_Type interrupt, uint8_t priNum)\r\n{\r\n    status_t status = kStatus_Success;\r\n\r\n    if (NotAvail_IRQn == interrupt)\r\n    {\r\n        status = kStatus_Fail;\r\n    }\r\n\r\n#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0)\r\n    else if ((int32_t)interrupt >= (int32_t)FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS)\r\n    {\r\n        status = kStatus_Fail;\r\n    }\r\n#endif\r\n\r\n    else\r\n    {\r\n#if defined(__GIC_PRIO_BITS)\r\n        GIC_SetPriority(interrupt, priNum);\r\n#else\r\n        NVIC_SetPriority(interrupt, priNum);\r\n#endif\r\n    }\r\n\r\n    return status;\r\n}\r\n\r\n/*!\r\n * @brief Clear the pending IRQ flag.\r\n *\r\n * Only handle LEVEL1 interrupt. For some devices, there might be multiple interrupt\r\n * levels. For example, there are NVIC and intmux. Here the interrupts connected\r\n * to NVIC are the LEVEL1 interrupts, because they are routed to the core directly.\r\n * The interrupts connected to intmux are the LEVEL2 interrupts, they are routed\r\n * to NVIC first then routed to core.\r\n *\r\n * This function only handles the LEVEL1 interrupts. The number of LEVEL1 interrupts\r\n * is indicated by the feature macro FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS.\r\n *\r\n * @param interrupt The flag which IRQ to clear.\r\n *\r\n * @retval kStatus_Success Interrupt priority set successfully\r\n * @retval kStatus_Fail Failed to set the interrupt priority.\r\n */\r\nstatic inline status_t IRQ_ClearPendingIRQ(IRQn_Type interrupt)\r\n{\r\n    status_t status = kStatus_Success;\r\n\r\n    if (NotAvail_IRQn == interrupt)\r\n    {\r\n        status = kStatus_Fail;\r\n    }\r\n\r\n#if defined(FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS) && (FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS > 0)\r\n    else if ((int32_t)interrupt >= (int32_t)FSL_FEATURE_NUMBER_OF_LEVEL1_INT_VECTORS)\r\n    {\r\n        status = kStatus_Fail;\r\n    }\r\n#endif\r\n\r\n    else\r\n    {\r\n#if defined(__GIC_PRIO_BITS)\r\n        GIC_ClearPendingIRQ(interrupt);\r\n#else\r\n        NVIC_ClearPendingIRQ(interrupt);\r\n#endif\r\n    }\r\n\r\n    return status;\r\n}\r\n\r\n/*!\r\n * @brief Disable the global IRQ\r\n *\r\n * Disable the global interrupt and return the current primask register. User is required to provided the primask\r\n * register for the EnableGlobalIRQ().\r\n *\r\n * @return Current primask value.\r\n */\r\nstatic inline uint32_t DisableGlobalIRQ(void)\r\n{\r\n    uint32_t mask;\r\n\r\n#if defined(CPSR_I_Msk)\r\n    mask = __get_CPSR() & CPSR_I_Msk;\r\n#elif defined(DAIF_I_BIT)\r\n    mask = __get_DAIF() & DAIF_I_BIT;\r\n#else\r\n    mask = __get_PRIMASK();\r\n#endif\r\n    __disable_irq();\r\n\r\n    return mask;\r\n}\r\n\r\n/*!\r\n * @brief Enable the global IRQ\r\n *\r\n * Set the primask register with the provided primask value but not just enable the primask. The idea is for the\r\n * convenience of integration of RTOS. some RTOS get its own management mechanism of primask. User is required to\r\n * use the EnableGlobalIRQ() and DisableGlobalIRQ() in pair.\r\n *\r\n * @param primask value of primask register to be restored. The primask value is supposed to be provided by the\r\n * DisableGlobalIRQ().\r\n */\r\nstatic inline void EnableGlobalIRQ(uint32_t primask)\r\n{\r\n#if defined(CPSR_I_Msk)\r\n    __set_CPSR((__get_CPSR() & ~CPSR_I_Msk) | primask);\r\n#elif defined(DAIF_I_BIT)\r\n    if (0UL == primask)\r\n    {\r\n        __enable_irq();\r\n    }\r\n#else\r\n    __set_PRIMASK(primask);\r\n#endif\r\n}\r\n\r\n#if defined(ENABLE_RAM_VECTOR_TABLE)\r\n/*!\r\n * @brief install IRQ handler\r\n *\r\n * @param irq IRQ number\r\n * @param irqHandler IRQ handler address\r\n * @return The old IRQ handler address\r\n */\r\nuint32_t InstallIRQHandler(IRQn_Type irq, uint32_t irqHandler);\r\n#endif /* ENABLE_RAM_VECTOR_TABLE. */\r\n\r\n#if (defined(FSL_FEATURE_SOC_SYSCON_COUNT) && (FSL_FEATURE_SOC_SYSCON_COUNT > 0))\r\n\r\n/*\r\n * When FSL_FEATURE_POWERLIB_EXTEND is defined to non-zero value,\r\n * powerlib should be used instead of these functions.\r\n */\r\n#if !(defined(FSL_FEATURE_POWERLIB_EXTEND) && (FSL_FEATURE_POWERLIB_EXTEND != 0))\r\n/*!\r\n * @brief Enable specific interrupt for wake-up from deep-sleep mode.\r\n *\r\n * Enable the interrupt for wake-up from deep sleep mode.\r\n * Some interrupts are typically used in sleep mode only and will not occur during\r\n * deep-sleep mode because relevant clocks are stopped. However, it is possible to enable\r\n * those clocks (significantly increasing power consumption in the reduced power mode),\r\n * making these wake-ups possible.\r\n *\r\n * @note This function also enables the interrupt in the NVIC (EnableIRQ() is called internaly).\r\n *\r\n * @param interrupt The IRQ number.\r\n */\r\nvoid EnableDeepSleepIRQ(IRQn_Type interrupt);\r\n\r\n/*!\r\n * @brief Disable specific interrupt for wake-up from deep-sleep mode.\r\n *\r\n * Disable the interrupt for wake-up from deep sleep mode.\r\n * Some interrupts are typically used in sleep mode only and will not occur during\r\n * deep-sleep mode because relevant clocks are stopped. However, it is possible to enable\r\n * those clocks (significantly increasing power consumption in the reduced power mode),\r\n * making these wake-ups possible.\r\n *\r\n * @note This function also disables the interrupt in the NVIC (DisableIRQ() is called internaly).\r\n *\r\n * @param interrupt The IRQ number.\r\n */\r\nvoid DisableDeepSleepIRQ(IRQn_Type interrupt);\r\n#endif /* FSL_FEATURE_POWERLIB_EXTEND */\r\n#endif /* FSL_FEATURE_SOC_SYSCON_COUNT */\r\n\r\n#if defined(DWT)\r\n/*!\r\n * @brief Enable the counter to get CPU cycles.\r\n */\r\nvoid MSDK_EnableCpuCycleCounter(void);\r\n\r\n/*!\r\n * @brief Get the current CPU cycle count.\r\n *\r\n * @return Current CPU cycle count.\r\n */\r\nuint32_t MSDK_GetCpuCycleCount(void);\r\n#endif\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif /* __cplusplus*/\r\n\r\n/*! @} */\r\n\r\n#endif /* FSL_COMMON_ARM_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_flexcomm.c",
    "content": "/*\r\n * Copyright (c) 2016, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2019 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include \"fsl_common.h\"\r\n#include \"fsl_flexcomm.h\"\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/* Component ID definition, used by tools. */\r\n#ifndef FSL_COMPONENT_ID\r\n#define FSL_COMPONENT_ID \"platform.drivers.flexcomm\"\r\n#endif\r\n\r\n/*******************************************************************************\r\n * Prototypes\r\n ******************************************************************************/\r\n/*! @brief Set the FLEXCOMM mode . */\r\nstatic status_t FLEXCOMM_SetPeriph(FLEXCOMM_Type *base, FLEXCOMM_PERIPH_T periph, int lock);\r\n\r\n/*! @brief check whether flexcomm supports peripheral type */\r\nstatic bool FLEXCOMM_PeripheralIsPresent(FLEXCOMM_Type *base, FLEXCOMM_PERIPH_T periph);\r\n\r\n/*******************************************************************************\r\n * Variables\r\n ******************************************************************************/\r\n\r\n/*! @brief Array to map FLEXCOMM instance number to base address. */\r\nstatic const uint32_t s_flexcommBaseAddrs[] = FLEXCOMM_BASE_ADDRS;\r\n\r\n/*! @brief Pointers to real IRQ handlers installed by drivers for each instance. */\r\nstatic flexcomm_irq_handler_t s_flexcommIrqHandler[ARRAY_SIZE(s_flexcommBaseAddrs)];\r\n\r\n/*! @brief Pointers to handles for each instance to provide context to interrupt routines */\r\nstatic void *s_flexcommHandle[ARRAY_SIZE(s_flexcommBaseAddrs)];\r\n\r\n/*! @brief Array to map FLEXCOMM instance number to IRQ number. */\r\nIRQn_Type const kFlexcommIrqs[] = FLEXCOMM_IRQS;\r\n\r\n#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)\r\n/*! @brief IDs of clock for each FLEXCOMM module */\r\nstatic const clock_ip_name_t s_flexcommClocks[] = FLEXCOMM_CLOCKS;\r\n#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */\r\n\r\n#if !(defined(FSL_FEATURE_FLEXCOMM_HAS_NO_RESET) && FSL_FEATURE_FLEXCOMM_HAS_NO_RESET)\r\n/*! @brief Pointers to FLEXCOMM resets for each instance. */\r\nstatic const reset_ip_name_t s_flexcommResets[] = FLEXCOMM_RSTS;\r\n#endif\r\n\r\n/*******************************************************************************\r\n * Code\r\n ******************************************************************************/\r\n\r\n/* check whether flexcomm supports peripheral type */\r\nstatic bool FLEXCOMM_PeripheralIsPresent(FLEXCOMM_Type *base, FLEXCOMM_PERIPH_T periph)\r\n{\r\n    if (periph == FLEXCOMM_PERIPH_NONE)\r\n    {\r\n        return true;\r\n    }\r\n    else if (periph <= FLEXCOMM_PERIPH_I2S_TX)\r\n    {\r\n        return (base->PSELID & (1UL << ((uint32_t)periph + 3U))) > 0UL ? true : false;\r\n    }\r\n    else if (periph == FLEXCOMM_PERIPH_I2S_RX)\r\n    {\r\n        return (base->PSELID & (1U << 7U)) > (uint32_t)0U ? true : false;\r\n    }\r\n    else\r\n    {\r\n        return false;\r\n    }\r\n}\r\n\r\n/* Get the index corresponding to the FLEXCOMM */\r\n/*! brief Returns instance number for FLEXCOMM module with given base address. */\r\nuint32_t FLEXCOMM_GetInstance(void *base)\r\n{\r\n    uint32_t i;\r\n\r\n    for (i = 0U; i < (uint32_t)FSL_FEATURE_SOC_FLEXCOMM_COUNT; i++)\r\n    {\r\n        if (MSDK_REG_SECURE_ADDR((uintptr_t)(uint8_t*)base) == MSDK_REG_SECURE_ADDR(s_flexcommBaseAddrs[i]))\r\n        {\r\n            break;\r\n        }\r\n    }\r\n\r\n    assert(i < (uint32_t)FSL_FEATURE_SOC_FLEXCOMM_COUNT);\r\n    return i;\r\n}\r\n\r\n/* Changes FLEXCOMM mode */\r\nstatic status_t FLEXCOMM_SetPeriph(FLEXCOMM_Type *base, FLEXCOMM_PERIPH_T periph, int lock)\r\n{\r\n    /* Check whether peripheral type is present */\r\n    if (!FLEXCOMM_PeripheralIsPresent(base, periph))\r\n    {\r\n        return kStatus_OutOfRange;\r\n    }\r\n\r\n    /* Flexcomm is locked to different peripheral type than expected  */\r\n    if (((base->PSELID & FLEXCOMM_PSELID_LOCK_MASK) != 0U) &&\r\n        ((base->PSELID & FLEXCOMM_PSELID_PERSEL_MASK) != (uint32_t)periph))\r\n    {\r\n        return kStatus_Fail;\r\n    }\r\n\r\n    /* Check if we are asked to lock */\r\n    if (lock != 0)\r\n    {\r\n        base->PSELID = (uint32_t)periph | FLEXCOMM_PSELID_LOCK_MASK;\r\n    }\r\n    else\r\n    {\r\n        base->PSELID = (uint32_t)periph;\r\n    }\r\n\r\n    return kStatus_Success;\r\n}\r\n\r\n/*! brief Initializes FLEXCOMM and selects peripheral mode according to the second parameter. */\r\nstatus_t FLEXCOMM_Init(void *base, FLEXCOMM_PERIPH_T periph)\r\n{\r\n    uint32_t idx = FLEXCOMM_GetInstance(base);\r\n\r\n#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)\r\n    /* Enable the peripheral clock */\r\n    CLOCK_EnableClock(s_flexcommClocks[idx]);\r\n#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */\r\n\r\n#if !(defined(FSL_FEATURE_FLEXCOMM_HAS_NO_RESET) && FSL_FEATURE_FLEXCOMM_HAS_NO_RESET)\r\n    /* Reset the FLEXCOMM module */\r\n    RESET_PeripheralReset(s_flexcommResets[idx]);\r\n#endif\r\n\r\n    /* Set the FLEXCOMM to given peripheral */\r\n    return FLEXCOMM_SetPeriph((FLEXCOMM_Type *)base, periph, 0);\r\n}\r\n\r\n/*! brief Sets IRQ handler for given FLEXCOMM module. It is used by drivers register IRQ handler according to FLEXCOMM\r\n * mode */\r\nvoid FLEXCOMM_SetIRQHandler(void *base, flexcomm_irq_handler_t handler, void *flexcommHandle)\r\n{\r\n    uint32_t instance;\r\n\r\n    /* Look up instance number */\r\n    instance = FLEXCOMM_GetInstance(base);\r\n\r\n    /* Clear handler first to avoid execution of the handler with wrong handle */\r\n    s_flexcommIrqHandler[instance] = NULL;\r\n    s_flexcommHandle[instance]     = flexcommHandle;\r\n    s_flexcommIrqHandler[instance] = handler;\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n\r\n/* IRQ handler functions overloading weak symbols in the startup */\r\n#if defined(FLEXCOMM0)\r\nvoid FLEXCOMM0_DriverIRQHandler(void);\r\nvoid FLEXCOMM0_DriverIRQHandler(void)\r\n{\r\n    uint32_t instance;\r\n\r\n    /* Look up instance number */\r\n    instance = FLEXCOMM_GetInstance(FLEXCOMM0);\r\n    assert(s_flexcommIrqHandler[instance] != NULL);\r\n    s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n\r\n#if defined(FLEXCOMM1)\r\nvoid FLEXCOMM1_DriverIRQHandler(void);\r\nvoid FLEXCOMM1_DriverIRQHandler(void)\r\n{\r\n    uint32_t instance;\r\n\r\n    /* Look up instance number */\r\n    instance = FLEXCOMM_GetInstance(FLEXCOMM1);\r\n    assert(s_flexcommIrqHandler[instance] != NULL);\r\n    s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n\r\n#if defined(FLEXCOMM2)\r\nvoid FLEXCOMM2_DriverIRQHandler(void);\r\nvoid FLEXCOMM2_DriverIRQHandler(void)\r\n{\r\n    uint32_t instance;\r\n\r\n    /* Look up instance number */\r\n    instance = FLEXCOMM_GetInstance(FLEXCOMM2);\r\n    assert(s_flexcommIrqHandler[instance] != NULL);\r\n    s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n\r\n#if defined(FLEXCOMM3)\r\nvoid FLEXCOMM3_DriverIRQHandler(void);\r\nvoid FLEXCOMM3_DriverIRQHandler(void)\r\n{\r\n    uint32_t instance;\r\n\r\n    /* Look up instance number */\r\n    instance = FLEXCOMM_GetInstance(FLEXCOMM3);\r\n    assert(s_flexcommIrqHandler[instance] != NULL);\r\n    s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n\r\n#if defined(FLEXCOMM4)\r\nvoid FLEXCOMM4_DriverIRQHandler(void);\r\nvoid FLEXCOMM4_DriverIRQHandler(void)\r\n{\r\n    uint32_t instance;\r\n\r\n    /* Look up instance number */\r\n    instance = FLEXCOMM_GetInstance(FLEXCOMM4);\r\n    assert(s_flexcommIrqHandler[instance] != NULL);\r\n    s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n\r\n#endif\r\n\r\n#if defined(FLEXCOMM5)\r\nvoid FLEXCOMM5_DriverIRQHandler(void);\r\nvoid FLEXCOMM5_DriverIRQHandler(void)\r\n{\r\n    uint32_t instance;\r\n\r\n    /* Look up instance number */\r\n    instance = FLEXCOMM_GetInstance(FLEXCOMM5);\r\n    assert(s_flexcommIrqHandler[instance] != NULL);\r\n    s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n\r\n#if defined(FLEXCOMM6)\r\nvoid FLEXCOMM6_DriverIRQHandler(void);\r\nvoid FLEXCOMM6_DriverIRQHandler(void)\r\n{\r\n    uint32_t instance;\r\n\r\n    /* Look up instance number */\r\n    instance = FLEXCOMM_GetInstance(FLEXCOMM6);\r\n    assert(s_flexcommIrqHandler[instance] != NULL);\r\n    s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n\r\n#if defined(FLEXCOMM7)\r\nvoid FLEXCOMM7_DriverIRQHandler(void);\r\nvoid FLEXCOMM7_DriverIRQHandler(void)\r\n{\r\n    uint32_t instance;\r\n\r\n    /* Look up instance number */\r\n    instance = FLEXCOMM_GetInstance(FLEXCOMM7);\r\n    assert(s_flexcommIrqHandler[instance] != NULL);\r\n    s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n\r\n#if defined(FLEXCOMM8)\r\nvoid FLEXCOMM8_DriverIRQHandler(void);\r\nvoid FLEXCOMM8_DriverIRQHandler(void)\r\n{\r\n    uint32_t instance;\r\n\r\n    /* Look up instance number */\r\n    instance = FLEXCOMM_GetInstance(FLEXCOMM8);\r\n    assert(s_flexcommIrqHandler[instance] != NULL);\r\n    s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n\r\n#if defined(FLEXCOMM9)\r\nvoid FLEXCOMM9_DriverIRQHandler(void);\r\nvoid FLEXCOMM9_DriverIRQHandler(void)\r\n{\r\n    uint32_t instance;\r\n\r\n    /* Look up instance number */\r\n    instance = FLEXCOMM_GetInstance(FLEXCOMM9);\r\n    assert(s_flexcommIrqHandler[instance] != NULL);\r\n    s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n\r\n#if defined(FLEXCOMM10)\r\nvoid FLEXCOMM10_DriverIRQHandler(void);\r\nvoid FLEXCOMM10_DriverIRQHandler(void)\r\n{\r\n    uint32_t instance;\r\n\r\n    /* Look up instance number */\r\n    instance = FLEXCOMM_GetInstance(FLEXCOMM10);\r\n    assert(s_flexcommIrqHandler[instance] != NULL);\r\n    s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n\r\n#if defined(FLEXCOMM11)\r\nvoid FLEXCOMM11_DriverIRQHandler(void);\r\nvoid FLEXCOMM11_DriverIRQHandler(void)\r\n{\r\n    uint32_t instance;\r\n\r\n    /* Look up instance number */\r\n    instance = FLEXCOMM_GetInstance(FLEXCOMM11);\r\n    assert(s_flexcommIrqHandler[instance] != NULL);\r\n    s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n\r\n#if defined(FLEXCOMM12)\r\nvoid FLEXCOMM12_DriverIRQHandler(void);\r\nvoid FLEXCOMM12_DriverIRQHandler(void)\r\n{\r\n    uint32_t instance;\r\n\r\n    /* Look up instance number */\r\n    instance = FLEXCOMM_GetInstance(FLEXCOMM12);\r\n    assert(s_flexcommIrqHandler[instance] != NULL);\r\n    s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n\r\n#if defined(FLEXCOMM13)\r\nvoid FLEXCOMM13_DriverIRQHandler(void);\r\nvoid FLEXCOMM13_DriverIRQHandler(void)\r\n{\r\n    uint32_t instance;\r\n\r\n    /* Look up instance number */\r\n    instance = FLEXCOMM_GetInstance(FLEXCOMM13);\r\n    assert(s_flexcommIrqHandler[instance] != NULL);\r\n    s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n\r\n#if defined(FLEXCOMM14)\r\nvoid FLEXCOMM14_DriverIRQHandler(void);\r\nvoid FLEXCOMM14_DriverIRQHandler(void)\r\n{\r\n    uint32_t instance;\r\n\r\n    /* Look up instance number */\r\n    instance = FLEXCOMM_GetInstance(FLEXCOMM14);\r\n    assert(s_flexcommIrqHandler[instance] != NULL);\r\n    s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n\r\n#if defined(FLEXCOMM15)\r\nvoid FLEXCOMM15_DriverIRQHandler(void);\r\nvoid FLEXCOMM15_DriverIRQHandler(void)\r\n{\r\n    uint32_t instance;\r\n\r\n    /* Look up instance number */\r\n    instance = FLEXCOMM_GetInstance(FLEXCOMM15);\r\n    assert(s_flexcommIrqHandler[instance] != NULL);\r\n    s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n\r\n#if defined(FLEXCOMM16)\r\nvoid FLEXCOMM16_DriverIRQHandler(void);\r\nvoid FLEXCOMM16_DriverIRQHandler(void)\r\n{\r\n    uint32_t instance;\r\n\r\n    /* Look up instance number */\r\n    instance = FLEXCOMM_GetInstance(FLEXCOMM16);\r\n    assert(s_flexcommIrqHandler[instance] != NULL);\r\n    s_flexcommIrqHandler[instance]((uint32_t *)s_flexcommBaseAddrs[instance], s_flexcommHandle[instance]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_flexcomm.h",
    "content": "/*\r\n * Copyright (c) 2016, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2019 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n#ifndef FSL_FLEXCOMM_H_\r\n#define FSL_FLEXCOMM_H_\r\n\r\n#include \"fsl_common.h\"\r\n\r\n/*!\r\n * @addtogroup flexcomm_driver\r\n * @{\r\n */\r\n\r\n/*! @name Driver version */\r\n/*! @{ */\r\n/*! @brief FlexCOMM driver version 2.0.2. */\r\n#define FSL_FLEXCOMM_DRIVER_VERSION (MAKE_VERSION(2, 0, 2))\r\n/*! @} */\r\n\r\n/*! @brief FLEXCOMM peripheral modes. */\r\ntypedef enum\r\n{\r\n    FLEXCOMM_PERIPH_NONE,   /*!< No peripheral */\r\n    FLEXCOMM_PERIPH_USART,  /*!< USART peripheral */\r\n    FLEXCOMM_PERIPH_SPI,    /*!< SPI Peripheral */\r\n    FLEXCOMM_PERIPH_I2C,    /*!< I2C Peripheral */\r\n    FLEXCOMM_PERIPH_I2S_TX, /*!< I2S TX Peripheral */\r\n    FLEXCOMM_PERIPH_I2S_RX, /*!< I2S RX Peripheral */\r\n} FLEXCOMM_PERIPH_T;\r\n\r\n/*! @brief Typedef for interrupt handler. */\r\ntypedef void (*flexcomm_irq_handler_t)(void *base, void *handle);\r\n\r\n/*! @brief Array with IRQ number for each FLEXCOMM module. */\r\nextern IRQn_Type const kFlexcommIrqs[];\r\n\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif\r\n\r\n/*! @brief Returns instance number for FLEXCOMM module with given base address. */\r\nuint32_t FLEXCOMM_GetInstance(void *base);\r\n\r\n/*! @brief Initializes FLEXCOMM and selects peripheral mode according to the second parameter. */\r\nstatus_t FLEXCOMM_Init(void *base, FLEXCOMM_PERIPH_T periph);\r\n\r\n/*! @brief Sets IRQ handler for given FLEXCOMM module. It is used by drivers register IRQ handler according to FLEXCOMM\r\n * mode */\r\nvoid FLEXCOMM_SetIRQHandler(void *base, flexcomm_irq_handler_t handler, void *flexcommHandle);\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n/*! @} */\r\n\r\n#endif /* FSL_FLEXCOMM_H_*/\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_flexspi.c",
    "content": "/*\r\n * Copyright (c) 2016, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2022, 2023 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include \"fsl_flexspi.h\"\r\n\r\n/* Component ID definition, used by tools. */\r\n#ifndef FSL_COMPONENT_ID\r\n#define FSL_COMPONENT_ID \"platform.drivers.flexspi\"\r\n#endif\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n#define FREQ_1MHz             (1000000UL)\r\n#define FLEXSPI_DLLCR_DEFAULT (0x100UL)\r\n#define FLEXSPI_LUT_KEY_VAL   (0x5AF05AF0UL)\r\n\r\nenum\r\n{\r\n    kFLEXSPI_DelayCellUnitMin = 75,  /* 75ps. */\r\n    kFLEXSPI_DelayCellUnitMax = 225, /* 225ps. */\r\n};\r\n\r\nenum\r\n{\r\n    kFLEXSPI_FlashASampleClockSlaveDelayLocked =\r\n        FLEXSPI_STS2_ASLVLOCK_MASK, /* Flash A sample clock slave delay line locked. */\r\n    kFLEXSPI_FlashASampleClockRefDelayLocked =\r\n        FLEXSPI_STS2_AREFLOCK_MASK, /* Flash A sample clock reference delay line locked. */\r\n#if !((defined(FSL_FEATURE_FLEXSPI_HAS_NO_STS2_BSLVLOCK)) && (FSL_FEATURE_FLEXSPI_HAS_NO_STS2_BSLVLOCK))\r\n    kFLEXSPI_FlashBSampleClockSlaveDelayLocked =\r\n        FLEXSPI_STS2_BSLVLOCK_MASK, /* Flash B sample clock slave delay line locked. */\r\n#endif\r\n#if !((defined(FSL_FEATURE_FLEXSPI_HAS_NO_STS2_BREFLOCK)) && (FSL_FEATURE_FLEXSPI_HAS_NO_STS2_BREFLOCK))\r\n    kFLEXSPI_FlashBSampleClockRefDelayLocked =\r\n        FLEXSPI_STS2_BREFLOCK_MASK, /* Flash B sample clock reference delay line locked. */\r\n#endif\r\n};\r\n\r\n/*! @brief Common sets of flags used by the driver, _flexspi_flag_constants. */\r\nenum\r\n{\r\n    /*! IRQ sources enabled by the non-blocking transactional API. */\r\n    kIrqFlags = kFLEXSPI_IpTxFifoWatermarkEmptyFlag | kFLEXSPI_IpRxFifoWatermarkAvailableFlag |\r\n                kFLEXSPI_SequenceExecutionTimeoutFlag | kFLEXSPI_IpCommandSequenceErrorFlag |\r\n                kFLEXSPI_IpCommandGrantTimeoutFlag | kFLEXSPI_IpCommandExecutionDoneFlag,\r\n\r\n    /*! Errors to check for. */\r\n    kErrorFlags = kFLEXSPI_SequenceExecutionTimeoutFlag | kFLEXSPI_IpCommandSequenceErrorFlag |\r\n                  kFLEXSPI_IpCommandGrantTimeoutFlag,\r\n};\r\n\r\n/* FLEXSPI transfer state, _flexspi_transfer_state. */\r\nenum\r\n{\r\n    kFLEXSPI_Idle      = 0x0U, /*!< Transfer is done. */\r\n    kFLEXSPI_BusyWrite = 0x1U, /*!< FLEXSPI is busy write transfer. */\r\n    kFLEXSPI_BusyRead  = 0x2U, /*!< FLEXSPI is busy write transfer. */\r\n};\r\n\r\n/*! @brief Typedef for interrupt handler. */\r\ntypedef void (*flexspi_isr_t)(FLEXSPI_Type *base, flexspi_handle_t *handle);\r\n\r\n/*******************************************************************************\r\n * Prototypes\r\n ******************************************************************************/\r\nstatic void FLEXSPI_Memset(void *src, uint8_t value, size_t length);\r\n\r\n/*!\r\n * @brief Calculate flash A/B sample clock DLL.\r\n *\r\n * @param base FLEXSPI base pointer.\r\n * @param config Flash configuration parameters.\r\n */\r\nstatic uint32_t FLEXSPI_CalculateDll(FLEXSPI_Type *base, flexspi_device_config_t *config);\r\n\r\n/*******************************************************************************\r\n * Variables\r\n ******************************************************************************/\r\n/*! @brief Pointers to flexspi bases for each instance. */\r\nstatic FLEXSPI_Type *const s_flexspiBases[] = FLEXSPI_BASE_PTRS;\r\n\r\n/*! @brief Pointers to flexspi IRQ number for each instance. */\r\nstatic const IRQn_Type s_flexspiIrqs[] = FLEXSPI_IRQS;\r\n\r\n#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)\r\n/* Clock name array */\r\nstatic const clock_ip_name_t s_flexspiClock[] = FLEXSPI_CLOCKS;\r\n#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */\r\n\r\n#if defined(FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ) && FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ\r\n/*! @brief Pointers to flexspi handles for each instance. */\r\nstatic flexspi_handle_t *s_flexspiHandle[ARRAY_SIZE(s_flexspiBases)];\r\n#endif\r\n\r\n#if defined(FSL_FEATURE_FLEXSPI_HAS_RESET) && FSL_FEATURE_FLEXSPI_HAS_RESET\r\n/*! @brief Pointers to FLEXSPI resets for each instance. */\r\nstatic const reset_ip_name_t s_flexspiResets[] = FLEXSPI_RSTS;\r\n#endif\r\n\r\n#if defined(FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ) && FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ\r\n/*! @brief Pointer to flexspi IRQ handler. */\r\nstatic flexspi_isr_t s_flexspiIsr;\r\n#endif\r\n/*******************************************************************************\r\n * Code\r\n ******************************************************************************/\r\n/* To avoid compiler opitimizing this API into memset() in library. */\r\n#if defined(__ICCARM__)\r\n#pragma optimize = none\r\n#endif /* defined(__ICCARM__) */\r\nstatic void FLEXSPI_Memset(void *src, uint8_t value, size_t length)\r\n{\r\n    assert(src != NULL);\r\n    uint8_t *p = (uint8_t *)src;\r\n\r\n    for (uint32_t i = 0U; i < length; i++)\r\n    {\r\n        *p = value;\r\n        p++;\r\n    }\r\n}\r\n\r\nuint32_t FLEXSPI_GetInstance(FLEXSPI_Type *base)\r\n{\r\n    uint32_t instance;\r\n\r\n    /* Find the instance index from base address mappings. */\r\n    for (instance = 0; instance < ARRAY_SIZE(s_flexspiBases); instance++)\r\n    {\r\n        if (MSDK_REG_SECURE_ADDR(s_flexspiBases[instance]) == MSDK_REG_SECURE_ADDR(base))\r\n        {\r\n            break;\r\n        }\r\n    }\r\n\r\n    assert(instance < ARRAY_SIZE(s_flexspiBases));\r\n\r\n    return instance;\r\n}\r\n\r\nstatic uint32_t FLEXSPI_CalculateDll(FLEXSPI_Type *base, flexspi_device_config_t *config)\r\n{\r\n    bool isUnifiedConfig = true;\r\n    uint32_t flexspiDllValue;\r\n    uint32_t dllValue;\r\n    uint32_t temp;\r\n#if defined(FSL_FEATURE_FLEXSPI_DQS_DELAY_PS) && FSL_FEATURE_FLEXSPI_DQS_DELAY_PS\r\n    uint32_t internalDqsDelayPs = FSL_FEATURE_FLEXSPI_DQS_DELAY_PS;\r\n#endif\r\n    uint32_t rxSampleClock = (base->MCR0 & FLEXSPI_MCR0_RXCLKSRC_MASK) >> FLEXSPI_MCR0_RXCLKSRC_SHIFT;\r\n    switch (rxSampleClock)\r\n    {\r\n        case (uint32_t)kFLEXSPI_ReadSampleClkLoopbackInternally:\r\n        case (uint32_t)kFLEXSPI_ReadSampleClkLoopbackFromDqsPad:\r\n        case (uint32_t)kFLEXSPI_ReadSampleClkLoopbackFromSckPad:\r\n            isUnifiedConfig = true;\r\n            break;\r\n        case (uint32_t)kFLEXSPI_ReadSampleClkExternalInputFromDqsPad:\r\n            if (config->isSck2Enabled)\r\n            {\r\n                isUnifiedConfig = true;\r\n            }\r\n            else\r\n            {\r\n                isUnifiedConfig = false;\r\n            }\r\n            break;\r\n        default:\r\n            assert(false);\r\n            break;\r\n    }\r\n\r\n    if (isUnifiedConfig)\r\n    {\r\n        flexspiDllValue = FLEXSPI_DLLCR_DEFAULT; /* 1 fixed delay cells in DLL delay chain) */\r\n    }\r\n    else\r\n    {\r\n        if (config->flexspiRootClk >= 100U * FREQ_1MHz)\r\n        {\r\n#if defined(FSL_FEATURE_FLEXSPI_DQS_DELAY_MIN) && FSL_FEATURE_FLEXSPI_DQS_DELAY_MIN\r\n            /* DLLEN = 1, SLVDLYTARGET = 0x0, */\r\n            flexspiDllValue = FLEXSPI_DLLCR_DLLEN(1) | FLEXSPI_DLLCR_SLVDLYTARGET(0x00);\r\n#else\r\n            /* DLLEN = 1, SLVDLYTARGET = 0xF, */\r\n            flexspiDllValue = FLEXSPI_DLLCR_DLLEN(1) | FLEXSPI_DLLCR_SLVDLYTARGET(0x0F);\r\n#endif\r\n#if (defined(FSL_FEATURE_FLEXSPI_HAS_REFPHASEGAP) && FSL_FEATURE_FLEXSPI_HAS_REFPHASEGAP)\r\n            flexspiDllValue |= FLEXSPI_DLLCR_REFPHASEGAP(2U);\r\n#endif /* FSL_FEATURE_FLEXSPI_HAS_REFPHASEGAP */\r\n        }\r\n        else\r\n        {\r\n            temp     = (uint32_t)config->dataValidTime * 1000U; /* Convert data valid time in ns to ps. */\r\n            dllValue = temp / (uint32_t)kFLEXSPI_DelayCellUnitMin;\r\n            if (dllValue * (uint32_t)kFLEXSPI_DelayCellUnitMin < temp)\r\n            {\r\n                dllValue++;\r\n            }\r\n            flexspiDllValue = FLEXSPI_DLLCR_OVRDEN(1) | FLEXSPI_DLLCR_OVRDVAL(dllValue);\r\n        }\r\n    }\r\n    return flexspiDllValue;\r\n}\r\n\r\nstatus_t FLEXSPI_CheckAndClearError(FLEXSPI_Type *base, uint32_t status)\r\n{\r\n    status_t result = kStatus_Success;\r\n\r\n    /* Check for error. */\r\n    status &= (uint32_t)kErrorFlags;\r\n    if (0U != status)\r\n    {\r\n        /* Select the correct error code.. */\r\n        if (0U != (status & (uint32_t)kFLEXSPI_SequenceExecutionTimeoutFlag))\r\n        {\r\n            result = kStatus_FLEXSPI_SequenceExecutionTimeout;\r\n        }\r\n        else if (0U != (status & (uint32_t)kFLEXSPI_IpCommandSequenceErrorFlag))\r\n        {\r\n            result = kStatus_FLEXSPI_IpCommandSequenceError;\r\n        }\r\n        else if (0U != (status & (uint32_t)kFLEXSPI_IpCommandGrantTimeoutFlag))\r\n        {\r\n            result = kStatus_FLEXSPI_IpCommandGrantTimeout;\r\n        }\r\n        else\r\n        {\r\n            assert(false);\r\n        }\r\n\r\n        /* Clear the flags. */\r\n        FLEXSPI_ClearInterruptStatusFlags(base, status);\r\n    }\r\n\r\n    return result;\r\n}\r\n\r\n/*!\r\n * brief Initializes the FLEXSPI module and internal state.\r\n *\r\n * This function enables the clock for FLEXSPI and also configures the FLEXSPI with the\r\n * input configure parameters. Users should call this function before any FLEXSPI operations.\r\n *\r\n * param base FLEXSPI peripheral base address.\r\n * param config FLEXSPI configure structure.\r\n */\r\nvoid FLEXSPI_Init(FLEXSPI_Type *base, const flexspi_config_t *config)\r\n{\r\n    uint32_t configValue = 0;\r\n    uint8_t i            = 0;\r\n\r\n#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)\r\n    /* Enable the flexspi clock */\r\n    (void)CLOCK_EnableClock(s_flexspiClock[FLEXSPI_GetInstance(base)]);\r\n#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */\r\n\r\n#if defined(FSL_FEATURE_FLEXSPI_HAS_RESET) && FSL_FEATURE_FLEXSPI_HAS_RESET\r\n    /* Reset the FLEXSPI module */\r\n    RESET_PeripheralReset(s_flexspiResets[FLEXSPI_GetInstance(base)]);\r\n#endif\r\n\r\n    /* Reset peripheral before configuring it. */\r\n    base->MCR0 &= ~FLEXSPI_MCR0_MDIS_MASK;\r\n    FLEXSPI_SoftwareReset(base);\r\n\r\n    /* Configure MCR0 configuration items. */\r\n    configValue = FLEXSPI_MCR0_RXCLKSRC(config->rxSampleClock) | FLEXSPI_MCR0_DOZEEN(config->enableDoze) |\r\n                  FLEXSPI_MCR0_IPGRANTWAIT(config->ipGrantTimeoutCycle) |\r\n                  FLEXSPI_MCR0_AHBGRANTWAIT(config->ahbConfig.ahbGrantTimeoutCycle) |\r\n                  FLEXSPI_MCR0_SCKFREERUNEN(config->enableSckFreeRunning) |\r\n                  FLEXSPI_MCR0_HSEN(config->enableHalfSpeedAccess) |\r\n#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_COMBINATIONEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_COMBINATIONEN)\r\n                  FLEXSPI_MCR0_COMBINATIONEN(config->enableCombination) |\r\n#endif\r\n#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ATDFEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ATDFEN)\r\n                  FLEXSPI_MCR0_ATDFEN(config->ahbConfig.enableAHBWriteIpTxFifo) |\r\n#endif\r\n#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ARDFEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ARDFEN)\r\n                  FLEXSPI_MCR0_ARDFEN(config->ahbConfig.enableAHBWriteIpRxFifo) |\r\n#endif\r\n                  FLEXSPI_MCR0_MDIS_MASK;\r\n    base->MCR0 = configValue;\r\n\r\n    /* Configure MCR1 configurations. */\r\n    configValue =\r\n        FLEXSPI_MCR1_SEQWAIT(config->seqTimeoutCycle) | FLEXSPI_MCR1_AHBBUSWAIT(config->ahbConfig.ahbBusTimeoutCycle);\r\n    base->MCR1 = configValue;\r\n\r\n    /* Configure MCR2 configurations. */\r\n    configValue = base->MCR2;\r\n    configValue &= ~(FLEXSPI_MCR2_RESUMEWAIT_MASK |\r\n#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR2_SCKBDIFFOPT) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR2_SCKBDIFFOPT)\r\n                     FLEXSPI_MCR2_SCKBDIFFOPT_MASK |\r\n#endif\r\n                     FLEXSPI_MCR2_SAMEDEVICEEN_MASK | FLEXSPI_MCR2_CLRAHBBUFOPT_MASK);\r\n    configValue |= FLEXSPI_MCR2_RESUMEWAIT(config->ahbConfig.resumeWaitCycle) |\r\n#if defined(FSL_FEATURE_FLEXSPI_SUPPORT_SEPERATE_RXCLKSRC_PORTB) && FSL_FEATURE_FLEXSPI_SUPPORT_SEPERATE_RXCLKSRC_PORTB\r\n                   FLEXSPI_MCR2_RXCLKSRC_B(config->rxSampleClockPortB) |\r\n#endif\r\n#if defined(FSL_FEATURE_FLEXSPI_SUPPORT_RXCLKSRC_DIFF) && FSL_FEATURE_FLEXSPI_SUPPORT_RXCLKSRC_DIFF\r\n                   FLEXSPI_MCR2_RX_CLK_SRC_DIFF(config->rxSampleClockDiff) |\r\n#endif\r\n#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR2_SCKBDIFFOPT) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR2_SCKBDIFFOPT)\r\n                   FLEXSPI_MCR2_SCKBDIFFOPT(config->enableSckBDiffOpt) |\r\n#endif\r\n                   FLEXSPI_MCR2_SAMEDEVICEEN(config->enableSameConfigForAll) |\r\n                   FLEXSPI_MCR2_CLRAHBBUFOPT(config->ahbConfig.enableClearAHBBufferOpt);\r\n\r\n    base->MCR2 = configValue;\r\n\r\n    /* Configure AHB control items. */\r\n    configValue = base->AHBCR;\r\n    configValue &= ~(FLEXSPI_AHBCR_READADDROPT_MASK | FLEXSPI_AHBCR_PREFETCHEN_MASK | FLEXSPI_AHBCR_BUFFERABLEEN_MASK |\r\n                     FLEXSPI_AHBCR_CACHABLEEN_MASK);\r\n    configValue |= FLEXSPI_AHBCR_READADDROPT(config->ahbConfig.enableReadAddressOpt) |\r\n                   FLEXSPI_AHBCR_PREFETCHEN(config->ahbConfig.enableAHBPrefetch) |\r\n                   FLEXSPI_AHBCR_BUFFERABLEEN(config->ahbConfig.enableAHBBufferable) |\r\n                   FLEXSPI_AHBCR_CACHABLEEN(config->ahbConfig.enableAHBCachable);\r\n    base->AHBCR = configValue;\r\n\r\n    /* Configure AHB rx buffers. */\r\n    for (i = 0; i < (uint32_t)FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT; i++)\r\n    {\r\n        configValue = base->AHBRXBUFCR0[i];\r\n\r\n        configValue &= ~(FLEXSPI_AHBRXBUFCR0_PREFETCHEN_MASK | FLEXSPI_AHBRXBUFCR0_PRIORITY_MASK |\r\n                         FLEXSPI_AHBRXBUFCR0_MSTRID_MASK | FLEXSPI_AHBRXBUFCR0_BUFSZ_MASK);\r\n        configValue |= FLEXSPI_AHBRXBUFCR0_PREFETCHEN(config->ahbConfig.buffer[i].enablePrefetch) |\r\n                       FLEXSPI_AHBRXBUFCR0_PRIORITY(config->ahbConfig.buffer[i].priority) |\r\n                       FLEXSPI_AHBRXBUFCR0_MSTRID(config->ahbConfig.buffer[i].masterIndex) |\r\n                       FLEXSPI_AHBRXBUFCR0_BUFSZ((uint32_t)config->ahbConfig.buffer[i].bufferSize / 8U);\r\n        base->AHBRXBUFCR0[i] = configValue;\r\n    }\r\n\r\n    /* Configure IP Fifo watermarks. */\r\n    base->IPRXFCR &= ~FLEXSPI_IPRXFCR_RXWMRK_MASK;\r\n    base->IPRXFCR |= FLEXSPI_IPRXFCR_RXWMRK((uint32_t)config->rxWatermark / 8U - 1U);\r\n    base->IPTXFCR &= ~FLEXSPI_IPTXFCR_TXWMRK_MASK;\r\n    base->IPTXFCR |= FLEXSPI_IPTXFCR_TXWMRK((uint32_t)config->txWatermark / 8U - 1U);\r\n\r\n    /* Reset flash size on all ports */\r\n    for (i = 0; i < (uint32_t)kFLEXSPI_PortCount; i++)\r\n    {\r\n        base->FLSHCR0[i] = 0;\r\n    }\r\n}\r\n\r\n/*!\r\n * brief Gets default settings for FLEXSPI.\r\n *\r\n * param config FLEXSPI configuration structure.\r\n */\r\nvoid FLEXSPI_GetDefaultConfig(flexspi_config_t *config)\r\n{\r\n    /* Initializes the configure structure to zero. */\r\n    FLEXSPI_Memset(config, 0, sizeof(*config));\r\n\r\n    config->rxSampleClock        = kFLEXSPI_ReadSampleClkLoopbackInternally;\r\n    config->enableSckFreeRunning = false;\r\n#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_COMBINATIONEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_COMBINATIONEN)\r\n    config->enableCombination = false;\r\n#endif\r\n    config->enableDoze            = true;\r\n    config->enableHalfSpeedAccess = false;\r\n#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR2_SCKBDIFFOPT) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR2_SCKBDIFFOPT)\r\n    config->enableSckBDiffOpt = false;\r\n#endif\r\n    config->enableSameConfigForAll = false;\r\n    config->seqTimeoutCycle        = 0xFFFFU;\r\n    config->ipGrantTimeoutCycle    = 0xFFU;\r\n    config->txWatermark            = 8;\r\n    config->rxWatermark            = 8;\r\n#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ATDFEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ATDFEN)\r\n    config->ahbConfig.enableAHBWriteIpTxFifo = false;\r\n#endif\r\n#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ARDFEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ARDFEN)\r\n    config->ahbConfig.enableAHBWriteIpRxFifo = false;\r\n#endif\r\n    config->ahbConfig.ahbGrantTimeoutCycle = 0xFFU;\r\n    config->ahbConfig.ahbBusTimeoutCycle   = 0xFFFFU;\r\n    config->ahbConfig.resumeWaitCycle      = 0x20U;\r\n    FLEXSPI_Memset(config->ahbConfig.buffer, 0, sizeof(config->ahbConfig.buffer));\r\n    /* Use invalid master ID 0xF and buffer size 0 for the first several buffers. */\r\n    for (uint8_t i = 0; i < ((uint8_t)FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT - 2U); i++)\r\n    {\r\n        config->ahbConfig.buffer[i].enablePrefetch = true; /* Default enable AHB prefetch. */\r\n        config->ahbConfig.buffer[i].masterIndex = 0xFU; /* Invalid master index which is not used, so will never hit. */\r\n        config->ahbConfig.buffer[i].bufferSize =\r\n            0; /* Default buffer size 0 for buffer0 to buffer(FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT - 3U)*/\r\n    }\r\n\r\n    for (uint8_t i = ((uint8_t)FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT - 2U);\r\n         i < (uint8_t)FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT; i++)\r\n    {\r\n        config->ahbConfig.buffer[i].enablePrefetch = true; /* Default enable AHB prefetch. */\r\n        config->ahbConfig.buffer[i].bufferSize     = 256U; /* Default buffer size 256 bytes. */\r\n    }\r\n    config->ahbConfig.enableClearAHBBufferOpt = false;\r\n    config->ahbConfig.enableReadAddressOpt    = false;\r\n    config->ahbConfig.enableAHBPrefetch       = false;\r\n    config->ahbConfig.enableAHBBufferable     = false;\r\n    config->ahbConfig.enableAHBCachable       = false;\r\n}\r\n\r\n/*!\r\n * brief Deinitializes the FLEXSPI module.\r\n *\r\n * Clears the FLEXSPI state and  FLEXSPI module registers.\r\n * param base FLEXSPI peripheral base address.\r\n */\r\nvoid FLEXSPI_Deinit(FLEXSPI_Type *base)\r\n{\r\n    /* Reset peripheral. */\r\n    FLEXSPI_SoftwareReset(base);\r\n}\r\n\r\n/*!\r\n * brief Update FLEXSPI DLL value depending on currently flexspi root clock.\r\n *\r\n * param base FLEXSPI peripheral base address.\r\n * param config Flash configuration parameters.\r\n * param port FLEXSPI Operation port.\r\n */\r\nvoid FLEXSPI_UpdateDllValue(FLEXSPI_Type *base, flexspi_device_config_t *config, flexspi_port_t port)\r\n{\r\n    uint32_t configValue = 0;\r\n    uint32_t statusValue = 0;\r\n    uint8_t index        = (uint8_t)port >> 1U; /* PortA with index 0, PortB with index 1. */\r\n\r\n    /* Wait for bus to be idle before changing flash configuration. */\r\n    while (!FLEXSPI_GetBusIdleStatus(base))\r\n    {\r\n    }\r\n\r\n    /* Configure DLL. */\r\n    configValue        = FLEXSPI_CalculateDll(base, config);\r\n    base->DLLCR[index] = configValue;\r\n\r\n    /* Exit stop mode. */\r\n    base->MCR0 &= ~FLEXSPI_MCR0_MDIS_MASK;\r\n\r\n    /* According to ERR011377, need to delay at least 100 NOPs to ensure the DLL is locked. */\r\n    if (index == 0U)\r\n    {\r\n        statusValue =\r\n            ((uint32_t)kFLEXSPI_FlashASampleClockSlaveDelayLocked | (uint32_t)kFLEXSPI_FlashASampleClockRefDelayLocked);\r\n    }\r\n#if !((defined(FSL_FEATURE_FLEXSPI_HAS_NO_STS2_BSLVLOCK)) && (FSL_FEATURE_FLEXSPI_HAS_NO_STS2_BSLVLOCK))\r\n    else\r\n    {\r\n        statusValue =\r\n            ((uint32_t)kFLEXSPI_FlashBSampleClockSlaveDelayLocked | (uint32_t)kFLEXSPI_FlashBSampleClockRefDelayLocked);\r\n    }\r\n#endif\r\n    if (0U != (configValue & FLEXSPI_DLLCR_DLLEN_MASK))\r\n    {\r\n#if defined(FSL_FEATURE_FLEXSPI_HAS_ERRATA_051426) && (FSL_FEATURE_FLEXSPI_HAS_ERRATA_051426)\r\n        if (config->isFroClockSource == false)\r\n#endif\r\n        {\r\n            /* Wait slave delay line locked and slave reference delay line locked. */\r\n            while ((base->STS2 & statusValue) != statusValue)\r\n            {\r\n            }\r\n        }\r\n\r\n        /* Wait at least 100 NOPs*/\r\n        for (uint8_t delay = 100U; delay > 0U; delay--)\r\n        {\r\n            __NOP();\r\n        }\r\n    }\r\n}\r\n\r\n/*!\r\n * brief Configures the connected device parameter.\r\n *\r\n * This function configures the connected device relevant parameters, such as the size, command, and so on.\r\n * The flash configuration value cannot have a default value. The user needs to configure it according to the\r\n * connected device.\r\n *\r\n * param base FLEXSPI peripheral base address.\r\n * param config Flash configuration parameters.\r\n * param port FLEXSPI Operation port.\r\n */\r\nvoid FLEXSPI_SetFlashConfig(FLEXSPI_Type *base, flexspi_device_config_t *config, flexspi_port_t port)\r\n{\r\n    uint32_t configValue = 0;\r\n    uint8_t index        = (uint8_t)port >> 1U; /* PortA with index 0, PortB with index 1. */\r\n\r\n    /* Wait for bus to be idle before changing flash configuration. */\r\n    while (!FLEXSPI_GetBusIdleStatus(base))\r\n    {\r\n    }\r\n\r\n    /* Configure flash size and address shift. */\r\n#if defined(FSL_FEATURE_FLEXSPI_SUPPORT_ADDRESS_SHIFT) && (FSL_FEATURE_FLEXSPI_SUPPORT_ADDRESS_SHIFT)\r\n    base->FLSHCR0[port] = config->flashSize | FLEXSPI_FLSHCR0_ADDRSHIFT(config->addressShift);\r\n#else\r\n    base->FLSHCR0[port] = config->flashSize;\r\n#endif /* FSL_FEATURE_FLEXSPI_SUPPORT_ADDRESS_SHIFT */\r\n\r\n    /* Configure flash parameters. */\r\n    base->FLSHCR1[port] = FLEXSPI_FLSHCR1_CSINTERVAL(config->CSInterval) |\r\n                          FLEXSPI_FLSHCR1_CSINTERVALUNIT(config->CSIntervalUnit) |\r\n                          FLEXSPI_FLSHCR1_TCSH(config->CSHoldTime) | FLEXSPI_FLSHCR1_TCSS(config->CSSetupTime) |\r\n                          FLEXSPI_FLSHCR1_CAS(config->columnspace) | FLEXSPI_FLSHCR1_WA(config->enableWordAddress);\r\n\r\n    /* Configure AHB operation items. */\r\n    configValue = base->FLSHCR2[port];\r\n\r\n    configValue &= ~(FLEXSPI_FLSHCR2_AWRWAITUNIT_MASK | FLEXSPI_FLSHCR2_AWRWAIT_MASK | FLEXSPI_FLSHCR2_AWRSEQNUM_MASK |\r\n                     FLEXSPI_FLSHCR2_AWRSEQID_MASK | FLEXSPI_FLSHCR2_ARDSEQNUM_MASK | FLEXSPI_FLSHCR2_ARDSEQID_MASK);\r\n\r\n    configValue |=\r\n        FLEXSPI_FLSHCR2_AWRWAITUNIT(config->AHBWriteWaitUnit) | FLEXSPI_FLSHCR2_AWRWAIT(config->AHBWriteWaitInterval);\r\n\r\n    if (config->AWRSeqNumber > 0U)\r\n    {\r\n        configValue |= FLEXSPI_FLSHCR2_AWRSEQID((uint32_t)config->AWRSeqIndex) |\r\n                       FLEXSPI_FLSHCR2_AWRSEQNUM((uint32_t)config->AWRSeqNumber - 1U);\r\n    }\r\n\r\n    if (config->ARDSeqNumber > 0U)\r\n    {\r\n        configValue |= FLEXSPI_FLSHCR2_ARDSEQID((uint32_t)config->ARDSeqIndex) |\r\n                       FLEXSPI_FLSHCR2_ARDSEQNUM((uint32_t)config->ARDSeqNumber - 1U);\r\n    }\r\n\r\n    base->FLSHCR2[port] = configValue;\r\n\r\n    /* Configure DLL. */\r\n    FLEXSPI_UpdateDllValue(base, config, port);\r\n\r\n    /* Step into stop mode. */\r\n    base->MCR0 |= FLEXSPI_MCR0_MDIS_MASK;\r\n\r\n    /* Configure write mask. */\r\n    if (config->enableWriteMask)\r\n    {\r\n        base->FLSHCR4 &= ~FLEXSPI_FLSHCR4_WMOPT1_MASK;\r\n    }\r\n    else\r\n    {\r\n        base->FLSHCR4 |= FLEXSPI_FLSHCR4_WMOPT1_MASK;\r\n    }\r\n\r\n    if (index == 0U) /*PortA*/\r\n    {\r\n        base->FLSHCR4 &= ~FLEXSPI_FLSHCR4_WMENA_MASK;\r\n        base->FLSHCR4 |= FLEXSPI_FLSHCR4_WMENA(config->enableWriteMask);\r\n    }\r\n#if !((defined(FSL_FEATURE_FLEXSPI_HAS_NO_FLSHCR4_WMENB)) && (FSL_FEATURE_FLEXSPI_HAS_NO_FLSHCR4_WMENB))\r\n    else\r\n    {\r\n        base->FLSHCR4 &= ~FLEXSPI_FLSHCR4_WMENB_MASK;\r\n        base->FLSHCR4 |= FLEXSPI_FLSHCR4_WMENB(config->enableWriteMask);\r\n    }\r\n#endif\r\n\r\n    /* Exit stop mode. */\r\n    base->MCR0 &= ~FLEXSPI_MCR0_MDIS_MASK;\r\n\r\n    /* Wait for bus to be idle before use it access to external flash. */\r\n    while (!FLEXSPI_GetBusIdleStatus(base))\r\n    {\r\n    }\r\n}\r\n\r\n/*! brief Updates the LUT table.\r\n *\r\n * param base FLEXSPI peripheral base address.\r\n * param index From which index start to update. It could be any index of the LUT table, which\r\n * also allows user to update command content inside a command. Each command consists of up to\r\n * 8 instructions and occupy 4*32-bit memory.\r\n * param cmd Command sequence array.\r\n * param count Number of sequences.\r\n */\r\nvoid FLEXSPI_UpdateLUT(FLEXSPI_Type *base, uint32_t index, const uint32_t *cmd, uint32_t count)\r\n{\r\n    assert(index < 64U);\r\n\r\n    uint32_t i = 0;\r\n    volatile uint32_t *lutBase;\r\n\r\n    /* Wait for bus to be idle before changing flash configuration. */\r\n    while (!FLEXSPI_GetBusIdleStatus(base))\r\n    {\r\n    }\r\n\r\n    /* Unlock LUT for update. */\r\n#if !((defined(FSL_FEATURE_FLEXSPI_LUTKEY_IS_RO)) && (FSL_FEATURE_FLEXSPI_LUTKEY_IS_RO))\r\n    base->LUTKEY = FLEXSPI_LUT_KEY_VAL;\r\n#endif\r\n    base->LUTCR = 0x02;\r\n\r\n    lutBase = &base->LUT[index];\r\n    for (i = 0; i < count; i++)\r\n    {\r\n        *lutBase++ = *cmd++;\r\n    }\r\n\r\n    /* Lock LUT. */\r\n#if !((defined(FSL_FEATURE_FLEXSPI_LUTKEY_IS_RO)) && (FSL_FEATURE_FLEXSPI_LUTKEY_IS_RO))\r\n    base->LUTKEY = FLEXSPI_LUT_KEY_VAL;\r\n#endif\r\n    base->LUTCR = 0x01;\r\n}\r\n\r\n/*! brief Update read sample clock source\r\n *\r\n * param base FLEXSPI peripheral base address.\r\n * param clockSource clockSource of type #flexspi_read_sample_clock_t\r\n */\r\nvoid FLEXSPI_UpdateRxSampleClock(FLEXSPI_Type *base, flexspi_read_sample_clock_t clockSource)\r\n{\r\n    uint32_t mcr0Val;\r\n\r\n    /* Wait for bus to be idle before changing flash configuration. */\r\n    while (!FLEXSPI_GetBusIdleStatus(base))\r\n    {\r\n    }\r\n\r\n    mcr0Val = base->MCR0;\r\n    mcr0Val &= ~FLEXSPI_MCR0_RXCLKSRC_MASK;\r\n    mcr0Val |= FLEXSPI_MCR0_RXCLKSRC(clockSource);\r\n    base->MCR0 = mcr0Val;\r\n\r\n    /* Reset peripheral. */\r\n    FLEXSPI_SoftwareReset(base);\r\n}\r\n\r\n/*!\r\n * brief Sends a buffer of data bytes using blocking method.\r\n * note This function blocks via polling until all bytes have been sent.\r\n * param base FLEXSPI peripheral base address\r\n * param buffer The data bytes to send\r\n * param size The number of data bytes to send\r\n * retval kStatus_Success write success without error\r\n * retval kStatus_FLEXSPI_SequenceExecutionTimeout sequence execution timeout\r\n * retval kStatus_FLEXSPI_IpCommandSequenceError IP command sequence error detected\r\n * retval kStatus_FLEXSPI_IpCommandGrantTimeout IP command grant timeout detected\r\n */\r\nstatus_t FLEXSPI_WriteBlocking(FLEXSPI_Type *base, uint8_t *buffer, size_t size)\r\n{\r\n    uint32_t txWatermark = ((base->IPTXFCR & FLEXSPI_IPTXFCR_TXWMRK_MASK) >> FLEXSPI_IPTXFCR_TXWMRK_SHIFT) + 1U;\r\n    uint32_t status;\r\n    status_t result = kStatus_Success;\r\n    uint32_t i      = 0;\r\n\r\n    /* Send data buffer */\r\n    while (0U != size)\r\n    {\r\n        /* Wait until there is room in the fifo. This also checks for errors. */\r\n        while (0U == ((status = base->INTR) & (uint32_t)kFLEXSPI_IpTxFifoWatermarkEmptyFlag))\r\n        {\r\n        }\r\n\r\n        result = FLEXSPI_CheckAndClearError(base, status);\r\n\r\n        if (kStatus_Success != result)\r\n        {\r\n            return result;\r\n        }\r\n\r\n        /* Write watermark level data into tx fifo . */\r\n        if (size >= 8U * txWatermark)\r\n        {\r\n            for (i = 0U; i < 2U * txWatermark; i++)\r\n            {\r\n                base->TFDR[i] = *(uint32_t *)(void *)buffer;\r\n                buffer += 4U;\r\n            }\r\n\r\n            size = size - 8U * txWatermark;\r\n        }\r\n        else\r\n        {\r\n            /* Write word aligned data into tx fifo. */\r\n            for (i = 0U; i < (size / 4U); i++)\r\n            {\r\n                base->TFDR[i] = *(uint32_t *)(void *)buffer;\r\n                buffer += 4U;\r\n            }\r\n\r\n            /* Adjust size by the amount processed. */\r\n            size -= 4U * i;\r\n\r\n            /* Write word un-aligned data into tx fifo. */\r\n            if (0x00U != size)\r\n            {\r\n                uint32_t tempVal = 0x00U;\r\n\r\n                for (uint32_t j = 0U; j < size; j++)\r\n                {\r\n                    tempVal |= ((uint32_t)*buffer++ << (8U * j));\r\n                }\r\n\r\n                base->TFDR[i] = tempVal;\r\n            }\r\n\r\n            size = 0U;\r\n        }\r\n\r\n        /* Push a watermark level data into IP TX FIFO. */\r\n        base->INTR = (uint32_t)kFLEXSPI_IpTxFifoWatermarkEmptyFlag;\r\n    }\r\n\r\n    return result;\r\n}\r\n\r\n/*!\r\n * brief Receives a buffer of data bytes using a blocking method.\r\n * note This function blocks via polling until all bytes have been sent.\r\n * param base FLEXSPI peripheral base address\r\n * param buffer The data bytes to send\r\n * param size The number of data bytes to receive\r\n * retval kStatus_Success read success without error\r\n * retval kStatus_FLEXSPI_SequenceExecutionTimeout sequence execution timeout\r\n * retval kStatus_FLEXSPI_IpCommandSequenceError IP command sequence error detected\r\n * retval kStatus_FLEXSPI_IpCommandGrantTimeout IP command grant timeout detected\r\n */\r\nstatus_t FLEXSPI_ReadBlocking(FLEXSPI_Type *base, uint8_t *buffer, size_t size)\r\n{\r\n    uint32_t rxWatermark = ((base->IPRXFCR & FLEXSPI_IPRXFCR_RXWMRK_MASK) >> FLEXSPI_IPRXFCR_RXWMRK_SHIFT) + 1U;\r\n    uint32_t status;\r\n    status_t result = kStatus_Success;\r\n    uint32_t i      = 0;\r\n    bool isReturn   = false;\r\n\r\n    /* Send data buffer */\r\n    while (0U != size)\r\n    {\r\n        if (size >= 8U * rxWatermark)\r\n        {\r\n            /* Wait until there is room in the fifo. This also checks for errors. */\r\n            while (0U == ((status = base->INTR) & (uint32_t)kFLEXSPI_IpRxFifoWatermarkAvailableFlag))\r\n            {\r\n                result = FLEXSPI_CheckAndClearError(base, status);\r\n\r\n                if (kStatus_Success != result)\r\n                {\r\n                    isReturn = true;\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        else\r\n        {\r\n            /* Wait fill level. This also checks for errors. */\r\n            while (size > ((((base->IPRXFSTS) & FLEXSPI_IPRXFSTS_FILL_MASK) >> FLEXSPI_IPRXFSTS_FILL_SHIFT) * 8U))\r\n            {\r\n                result = FLEXSPI_CheckAndClearError(base, base->INTR);\r\n\r\n                if (kStatus_Success != result)\r\n                {\r\n                    isReturn = true;\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        if (isReturn)\r\n        {\r\n            break;\r\n        }\r\n\r\n        result = FLEXSPI_CheckAndClearError(base, base->INTR);\r\n\r\n        if (kStatus_Success != result)\r\n        {\r\n            break;\r\n        }\r\n\r\n        /* Read watermark level data from rx fifo. */\r\n        if (size >= 8U * rxWatermark)\r\n        {\r\n            for (i = 0U; i < 2U * rxWatermark; i++)\r\n            {\r\n                *(uint32_t *)(void *)buffer = base->RFDR[i];\r\n                buffer += 4U;\r\n            }\r\n\r\n            size = size - 8U * rxWatermark;\r\n        }\r\n        else\r\n        {\r\n            /* Read word aligned data from rx fifo. */\r\n            for (i = 0U; i < (size / 4U); i++)\r\n            {\r\n                *(uint32_t *)(void *)buffer = base->RFDR[i];\r\n                buffer += 4U;\r\n            }\r\n\r\n            /* Adjust size by the amount processed. */\r\n            size -= 4U * i;\r\n\r\n            /* Read word un-aligned data from rx fifo. */\r\n            if (0x00U != size)\r\n            {\r\n                uint32_t tempVal = base->RFDR[i];\r\n\r\n                for (i = 0U; i < size; i++)\r\n                {\r\n                    *buffer++ = ((uint8_t)(tempVal >> (8U * i)) & 0xFFU);\r\n                }\r\n            }\r\n\r\n            size = 0;\r\n        }\r\n\r\n        /* Pop out a watermark level datas from IP RX FIFO. */\r\n        base->INTR = (uint32_t)kFLEXSPI_IpRxFifoWatermarkAvailableFlag;\r\n    }\r\n\r\n    return result;\r\n}\r\n\r\n/*!\r\n * brief Execute command to transfer a buffer data bytes using a blocking method.\r\n * param base FLEXSPI peripheral base address\r\n * param xfer pointer to the transfer structure.\r\n * retval kStatus_Success command transfer success without error\r\n * retval kStatus_FLEXSPI_SequenceExecutionTimeout sequence execution timeout\r\n * retval kStatus_FLEXSPI_IpCommandSequenceError IP command sequence error detected\r\n * retval kStatus_FLEXSPI_IpCommandGrantTimeout IP command grant timeout detected\r\n */\r\nstatus_t FLEXSPI_TransferBlocking(FLEXSPI_Type *base, flexspi_transfer_t *xfer)\r\n{\r\n    uint32_t configValue = 0;\r\n    status_t result      = kStatus_Success;\r\n\r\n    /* Clear sequence pointer before sending data to external devices. */\r\n    base->FLSHCR2[xfer->port] |= FLEXSPI_FLSHCR2_CLRINSTRPTR_MASK;\r\n\r\n    /* Clear former pending status before start this transfer. */\r\n    base->INTR = FLEXSPI_INTR_AHBCMDERR_MASK | FLEXSPI_INTR_IPCMDERR_MASK | FLEXSPI_INTR_AHBCMDGE_MASK |\r\n                 FLEXSPI_INTR_IPCMDGE_MASK | FLEXSPI_INTR_IPCMDDONE_MASK;\r\n\r\n    /* Configure base address. */\r\n    base->IPCR0 = xfer->deviceAddress;\r\n\r\n    /* Reset fifos. */\r\n    base->IPTXFCR |= FLEXSPI_IPTXFCR_CLRIPTXF_MASK;\r\n    base->IPRXFCR |= FLEXSPI_IPRXFCR_CLRIPRXF_MASK;\r\n\r\n    /* Configure data size. */\r\n    if ((xfer->cmdType == kFLEXSPI_Read) || (xfer->cmdType == kFLEXSPI_Write) || (xfer->cmdType == kFLEXSPI_Config))\r\n    {\r\n        configValue = FLEXSPI_IPCR1_IDATSZ(xfer->dataSize);\r\n    }\r\n\r\n    /* Configure sequence ID. */\r\n    configValue |=\r\n        FLEXSPI_IPCR1_ISEQID((uint32_t)xfer->seqIndex) | FLEXSPI_IPCR1_ISEQNUM((uint32_t)xfer->SeqNumber - 1U);\r\n    base->IPCR1 = configValue;\r\n\r\n    /* Start Transfer. */\r\n    base->IPCMD |= FLEXSPI_IPCMD_TRG_MASK;\r\n\r\n    if ((xfer->cmdType == kFLEXSPI_Write) || (xfer->cmdType == kFLEXSPI_Config))\r\n    {\r\n        result = FLEXSPI_WriteBlocking(base, (uint8_t *)xfer->data, xfer->dataSize);\r\n    }\r\n    else if (xfer->cmdType == kFLEXSPI_Read)\r\n    {\r\n        result = FLEXSPI_ReadBlocking(base, (uint8_t *)xfer->data, xfer->dataSize);\r\n    }\r\n    else\r\n    {\r\n        /* Empty else. */\r\n    }\r\n\r\n    /* Wait until the IP command execution finishes */\r\n    while (0UL == (base->INTR & FLEXSPI_INTR_IPCMDDONE_MASK))\r\n    {\r\n    }\r\n\r\n    /* Unless there is an error status already set, capture the latest one */\r\n    if (result == kStatus_Success)\r\n    {\r\n        result = FLEXSPI_CheckAndClearError(base, base->INTR);\r\n    }\r\n\r\n    return result;\r\n}\r\n\r\n/*!\r\n * brief Initializes the FLEXSPI handle which is used in transactional functions.\r\n *\r\n * param base FLEXSPI peripheral base address.\r\n * param handle pointer to flexspi_handle_t structure to store the transfer state.\r\n * param callback pointer to user callback function.\r\n * param userData user parameter passed to the callback function.\r\n */\r\nvoid FLEXSPI_TransferCreateHandle(FLEXSPI_Type *base,\r\n                                  flexspi_handle_t *handle,\r\n                                  flexspi_transfer_callback_t callback,\r\n                                  void *userData)\r\n{\r\n    assert(NULL != handle);\r\n\r\n    uint32_t instance = FLEXSPI_GetInstance(base);\r\n\r\n    /* Zero handle. */\r\n    (void)memset(handle, 0, sizeof(*handle));\r\n\r\n    /* Set callback and userData. */\r\n    handle->completionCallback = callback;\r\n    handle->userData           = userData;\r\n\r\n#if defined(FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ) && FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ\r\n    /* Save the context in global variables to support the double weak mechanism. */\r\n    s_flexspiHandle[instance] = handle;\r\n    s_flexspiIsr              = FLEXSPI_TransferHandleIRQ;\r\n#endif\r\n\r\n    /* Enable NVIC interrupt. */\r\n    (void)EnableIRQ(s_flexspiIrqs[instance]);\r\n}\r\n\r\n/*!\r\n * brief Performs a interrupt non-blocking transfer on the FLEXSPI bus.\r\n *\r\n * note Calling the API returns immediately after transfer initiates. The user needs\r\n * to call FLEXSPI_GetTransferCount to poll the transfer status to check whether\r\n * the transfer is finished. If the return status is not kStatus_FLEXSPI_Busy, the transfer\r\n * is finished. For FLEXSPI_Read, the dataSize should be multiple of rx watermark level, or\r\n * FLEXSPI could not read data properly.\r\n *\r\n * param base FLEXSPI peripheral base address.\r\n * param handle pointer to flexspi_handle_t structure which stores the transfer state.\r\n * param xfer pointer to flexspi_transfer_t structure.\r\n * retval kStatus_Success Successfully start the data transmission.\r\n * retval kStatus_FLEXSPI_Busy Previous transmission still not finished.\r\n */\r\nstatus_t FLEXSPI_TransferNonBlocking(FLEXSPI_Type *base, flexspi_handle_t *handle, flexspi_transfer_t *xfer)\r\n{\r\n    uint32_t configValue = 0;\r\n    status_t result      = kStatus_Success;\r\n\r\n    assert(NULL != handle);\r\n    assert(NULL != xfer);\r\n\r\n    /* Check if the I2C bus is idle - if not return busy status. */\r\n    if (handle->state != (uint32_t)kFLEXSPI_Idle)\r\n    {\r\n        result = kStatus_FLEXSPI_Busy;\r\n    }\r\n    else\r\n    {\r\n        handle->data              = (uint8_t *)xfer->data;\r\n        handle->dataSize          = xfer->dataSize;\r\n        handle->transferTotalSize = xfer->dataSize;\r\n        handle->state = (xfer->cmdType == kFLEXSPI_Read) ? (uint32_t)kFLEXSPI_BusyRead : (uint32_t)kFLEXSPI_BusyWrite;\r\n\r\n        /* Clear sequence pointer before sending data to external devices. */\r\n        base->FLSHCR2[xfer->port] |= FLEXSPI_FLSHCR2_CLRINSTRPTR_MASK;\r\n\r\n        /* Clear former pending status before start this transfer. */\r\n        base->INTR = FLEXSPI_INTR_AHBCMDERR_MASK | FLEXSPI_INTR_IPCMDERR_MASK | FLEXSPI_INTR_AHBCMDGE_MASK |\r\n                     FLEXSPI_INTR_IPCMDGE_MASK | FLEXSPI_INTR_IPCMDDONE_MASK;\r\n\r\n        /* Configure base address. */\r\n        base->IPCR0 = xfer->deviceAddress;\r\n\r\n        /* Reset fifos. */\r\n        base->IPTXFCR |= FLEXSPI_IPTXFCR_CLRIPTXF_MASK;\r\n        base->IPRXFCR |= FLEXSPI_IPRXFCR_CLRIPRXF_MASK;\r\n\r\n        /* Configure data size. */\r\n        if ((xfer->cmdType == kFLEXSPI_Read) || (xfer->cmdType == kFLEXSPI_Write))\r\n        {\r\n            configValue = FLEXSPI_IPCR1_IDATSZ(xfer->dataSize);\r\n        }\r\n\r\n        /* Configure sequence ID. */\r\n        configValue |=\r\n            FLEXSPI_IPCR1_ISEQID((uint32_t)xfer->seqIndex) | FLEXSPI_IPCR1_ISEQNUM((uint32_t)xfer->SeqNumber - 1U);\r\n        base->IPCR1 = configValue;\r\n\r\n        /* Start Transfer. */\r\n        base->IPCMD |= FLEXSPI_IPCMD_TRG_MASK;\r\n\r\n        if (handle->state == (uint32_t)kFLEXSPI_BusyRead)\r\n        {\r\n            FLEXSPI_EnableInterrupts(base, (uint32_t)kFLEXSPI_IpRxFifoWatermarkAvailableFlag |\r\n                                               (uint32_t)kFLEXSPI_SequenceExecutionTimeoutFlag |\r\n                                               (uint32_t)kFLEXSPI_IpCommandSequenceErrorFlag |\r\n                                               (uint32_t)kFLEXSPI_IpCommandGrantTimeoutFlag |\r\n                                               (uint32_t)kFLEXSPI_IpCommandExecutionDoneFlag);\r\n        }\r\n        else\r\n        {\r\n            FLEXSPI_EnableInterrupts(\r\n                base, (uint32_t)kFLEXSPI_IpTxFifoWatermarkEmptyFlag | (uint32_t)kFLEXSPI_SequenceExecutionTimeoutFlag |\r\n                          (uint32_t)kFLEXSPI_IpCommandSequenceErrorFlag | (uint32_t)kFLEXSPI_IpCommandGrantTimeoutFlag |\r\n                          (uint32_t)kFLEXSPI_IpCommandExecutionDoneFlag);\r\n        }\r\n    }\r\n\r\n    return result;\r\n}\r\n\r\n/*!\r\n * brief Gets the master transfer status during a interrupt non-blocking transfer.\r\n *\r\n * param base FLEXSPI peripheral base address.\r\n * param handle pointer to flexspi_handle_t structure which stores the transfer state.\r\n * param count Number of bytes transferred so far by the non-blocking transaction.\r\n * retval kStatus_InvalidArgument count is Invalid.\r\n * retval kStatus_Success Successfully return the count.\r\n */\r\nstatus_t FLEXSPI_TransferGetCount(FLEXSPI_Type *base, flexspi_handle_t *handle, size_t *count)\r\n{\r\n    assert(NULL != handle);\r\n\r\n    status_t result = kStatus_Success;\r\n\r\n    if (handle->state == (uint32_t)kFLEXSPI_Idle)\r\n    {\r\n        result = kStatus_NoTransferInProgress;\r\n    }\r\n    else\r\n    {\r\n        *count = handle->transferTotalSize - handle->dataSize;\r\n    }\r\n\r\n    return result;\r\n}\r\n\r\n/*!\r\n * brief Aborts an interrupt non-blocking transfer early.\r\n *\r\n * note This API can be called at any time when an interrupt non-blocking transfer initiates\r\n * to abort the transfer early.\r\n *\r\n * param base FLEXSPI peripheral base address.\r\n * param handle pointer to flexspi_handle_t structure which stores the transfer state\r\n */\r\nvoid FLEXSPI_TransferAbort(FLEXSPI_Type *base, flexspi_handle_t *handle)\r\n{\r\n    assert(NULL != handle);\r\n\r\n    FLEXSPI_DisableInterrupts(base, (uint32_t)kIrqFlags);\r\n    handle->state = (uint32_t)kFLEXSPI_Idle;\r\n}\r\n\r\n/*!\r\n * brief Master interrupt handler.\r\n *\r\n * param base FLEXSPI peripheral base address.\r\n * param handle pointer to flexspi_handle_t structure.\r\n */\r\nvoid FLEXSPI_TransferHandleIRQ(FLEXSPI_Type *base, flexspi_handle_t *handle)\r\n{\r\n    uint32_t status;\r\n    status_t result;\r\n    uint32_t intEnableStatus;\r\n    uint32_t txWatermark;\r\n    uint32_t rxWatermark;\r\n    uint32_t i = 0;\r\n\r\n    status          = base->INTR;\r\n    intEnableStatus = base->INTEN;\r\n\r\n    /* Check if interrupt is enabled and status is alerted. */\r\n    if ((status & intEnableStatus) != 0U)\r\n    {\r\n        result = FLEXSPI_CheckAndClearError(base, status);\r\n\r\n        if ((result != kStatus_Success) && (handle->completionCallback != NULL))\r\n        {\r\n            FLEXSPI_TransferAbort(base, handle);\r\n            if (NULL != handle->completionCallback)\r\n            {\r\n                handle->completionCallback(base, handle, result, handle->userData);\r\n            }\r\n        }\r\n        else\r\n        {\r\n            if ((0U != (status & (uint32_t)kFLEXSPI_IpRxFifoWatermarkAvailableFlag)) &&\r\n                (handle->state == (uint32_t)kFLEXSPI_BusyRead))\r\n            {\r\n                rxWatermark = ((base->IPRXFCR & FLEXSPI_IPRXFCR_RXWMRK_MASK) >> FLEXSPI_IPRXFCR_RXWMRK_SHIFT) + 1U;\r\n\r\n                /* Read watermark level data from rx fifo . */\r\n                if (handle->dataSize >= 8U * rxWatermark)\r\n                {\r\n                    /* Read watermark level data from rx fifo . */\r\n                    for (i = 0U; i < 2U * rxWatermark; i++)\r\n                    {\r\n                        *(uint32_t *)(void *)handle->data = base->RFDR[i];\r\n                        handle->data += 4U;\r\n                    }\r\n\r\n                    handle->dataSize = handle->dataSize - 8U * rxWatermark;\r\n                }\r\n                else\r\n                {\r\n                    /* Read word aligned data from rx fifo. */\r\n                    for (i = 0U; i < (handle->dataSize / 4U); i++)\r\n                    {\r\n                        *(uint32_t *)(void *)handle->data = base->RFDR[i];\r\n                        handle->data += 4U;\r\n                    }\r\n\r\n                    /* Adjust size by the amount processed. */\r\n                    handle->dataSize -= (size_t)4U * i;\r\n\r\n                    /* Read word un-aligned data from rx fifo. */\r\n                    if (0x00U != handle->dataSize)\r\n                    {\r\n                        uint32_t tempVal = base->RFDR[i];\r\n\r\n                        for (i = 0U; i < handle->dataSize; i++)\r\n                        {\r\n                            *handle->data++ = ((uint8_t)(tempVal >> (8U * i)) & 0xFFU);\r\n                        }\r\n                    }\r\n\r\n                    handle->dataSize = 0;\r\n                }\r\n                /* Pop out a watermark level data from IP RX FIFO. */\r\n                base->INTR = (uint32_t)kFLEXSPI_IpRxFifoWatermarkAvailableFlag;\r\n            }\r\n\r\n            if (0U != (status & (uint32_t)kFLEXSPI_IpCommandExecutionDoneFlag))\r\n            {\r\n                base->INTR = (uint32_t)kFLEXSPI_IpCommandExecutionDoneFlag;\r\n\r\n                FLEXSPI_TransferAbort(base, handle);\r\n\r\n                if (NULL != handle->completionCallback)\r\n                {\r\n                    handle->completionCallback(base, handle, kStatus_Success, handle->userData);\r\n                }\r\n            }\r\n\r\n            /* TX FIFO empty interrupt, push watermark level data into tx FIFO. */\r\n            if ((0U != (status & (uint32_t)kFLEXSPI_IpTxFifoWatermarkEmptyFlag)) &&\r\n                (handle->state == (uint32_t)kFLEXSPI_BusyWrite))\r\n            {\r\n                if (0U != handle->dataSize)\r\n                {\r\n                    txWatermark = ((base->IPTXFCR & FLEXSPI_IPTXFCR_TXWMRK_MASK) >> FLEXSPI_IPTXFCR_TXWMRK_SHIFT) + 1U;\r\n                    /* Write watermark level data into tx fifo . */\r\n                    if (handle->dataSize >= 8U * txWatermark)\r\n                    {\r\n                        for (i = 0; i < 2U * txWatermark; i++)\r\n                        {\r\n                            base->TFDR[i] = *(uint32_t *)(void *)handle->data;\r\n                            handle->data += 4U;\r\n                        }\r\n\r\n                        handle->dataSize = handle->dataSize - 8U * txWatermark;\r\n                    }\r\n                    else\r\n                    {\r\n                        /* Write word aligned data into tx fifo. */\r\n                        for (i = 0U; i < (handle->dataSize / 4U); i++)\r\n                        {\r\n                            base->TFDR[i] = *(uint32_t *)(void *)handle->data;\r\n                            handle->data += 4U;\r\n                        }\r\n\r\n                        /* Adjust size by the amount processed. */\r\n                        handle->dataSize -= (size_t)4U * i;\r\n\r\n                        /* Write word un-aligned data into tx fifo. */\r\n                        if (0x00U != handle->dataSize)\r\n                        {\r\n                            uint32_t tempVal = 0x00U;\r\n\r\n                            for (uint32_t j = 0U; j < handle->dataSize; j++)\r\n                            {\r\n                                tempVal |= ((uint32_t)*handle->data++ << (8U * j));\r\n                            }\r\n\r\n                            base->TFDR[i] = tempVal;\r\n                        }\r\n\r\n                        handle->dataSize = 0;\r\n                    }\r\n\r\n                    /* Push a watermark level data into IP TX FIFO. */\r\n                    base->INTR = (uint32_t)kFLEXSPI_IpTxFifoWatermarkEmptyFlag;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                /* Empty else */\r\n            }\r\n        }\r\n    }\r\n    else\r\n    {\r\n        /* Empty else */\r\n    }\r\n}\r\n\r\n#if defined(FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ) && FSL_DRIVER_TRANSFER_DOUBLE_WEAK_IRQ\r\n#if defined(FLEXSPI)\r\nvoid FLEXSPI_DriverIRQHandler(void);\r\nvoid FLEXSPI_DriverIRQHandler(void)\r\n{\r\n    s_flexspiIsr(FLEXSPI, s_flexspiHandle[0]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n\r\n#if defined(FLEXSPI0)\r\nvoid FLEXSPI0_DriverIRQHandler(void);\r\nvoid FLEXSPI0_DriverIRQHandler(void)\r\n{\r\n    s_flexspiIsr(FLEXSPI0, s_flexspiHandle[0]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n#if defined(FLEXSPI1)\r\nvoid FLEXSPI1_DriverIRQHandler(void);\r\nvoid FLEXSPI1_DriverIRQHandler(void)\r\n{\r\n    s_flexspiIsr(FLEXSPI1, s_flexspiHandle[1]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n#if defined(FLEXSPI2)\r\nvoid FLEXSPI2_DriverIRQHandler(void);\r\nvoid FLEXSPI2_DriverIRQHandler(void)\r\n{\r\n    s_flexspiIsr(FLEXSPI2, s_flexspiHandle[2]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n\r\n#if defined(LSIO__FLEXSPI0)\r\nvoid LSIO_OCTASPI0_INT_DriverIRQHandler(void);\r\nvoid LSIO_OCTASPI0_INT_DriverIRQHandler(void)\r\n{\r\n    s_flexspiIsr(LSIO__FLEXSPI0, s_flexspiHandle[0]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n#if defined(LSIO__FLEXSPI1)\r\nvoid LSIO_OCTASPI1_INT_DriverIRQHandler(void);\r\nvoid LSIO_OCTASPI1_INT_DriverIRQHandler(void)\r\n{\r\n    s_flexspiIsr(LSIO__FLEXSPI1, s_flexspiHandle[1]);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n#endif\r\n\r\n#if defined(FSL_FEATURE_FLEXSPI_HAS_SHARED_IRQ0_IRQ1) && FSL_FEATURE_FLEXSPI_HAS_SHARED_IRQ0_IRQ1\r\n\r\nvoid FLEXSPI0_FLEXSPI1_DriverIRQHandler(void);\r\nvoid FLEXSPI0_FLEXSPI1_DriverIRQHandler(void)\r\n{\r\n    /* If handle is registered, treat the transfer function is enabled. */\r\n    if (NULL != s_flexspiHandle[0])\r\n    {\r\n        s_flexspiIsr(FLEXSPI0, s_flexspiHandle[0]);\r\n    }\r\n    if (NULL != s_flexspiHandle[1])\r\n    {\r\n        s_flexspiIsr(FLEXSPI1, s_flexspiHandle[1]);\r\n    }\r\n}\r\n#endif\r\n\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_flexspi.h",
    "content": "/*\r\n * Copyright (c) 2016, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2023 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef FSL_FLEXSPI_H_\r\n#define FSL_FLEXSPI_H_\r\n\r\n#include <stddef.h>\r\n#include \"fsl_device_registers.h\"\r\n#include \"fsl_common.h\"\r\n\r\n/*!\r\n * @addtogroup flexspi\r\n * @{\r\n */\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*! @name Driver version */\r\n/*! @{ */\r\n/*! @brief FLEXSPI driver version. */\r\n#define FSL_FLEXSPI_DRIVER_VERSION (MAKE_VERSION(2, 6, 0))\r\n/*! @} */\r\n\r\n#define FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNTn(0)\r\n\r\n/*! @brief Formula to form FLEXSPI instructions in LUT table. */\r\n#define FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)                                                              \\\r\n    (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \\\r\n     FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))\r\n\r\n/*! @brief Status structure of FLEXSPI.*/\r\nenum\r\n{\r\n    kStatus_FLEXSPI_Busy                     = MAKE_STATUS(kStatusGroup_FLEXSPI, 0), /*!< FLEXSPI is busy */\r\n    kStatus_FLEXSPI_SequenceExecutionTimeout = MAKE_STATUS(kStatusGroup_FLEXSPI, 1), /*!< Sequence execution timeout\r\n                                                                            error occurred during FLEXSPI transfer. */\r\n    kStatus_FLEXSPI_IpCommandSequenceError = MAKE_STATUS(kStatusGroup_FLEXSPI, 2),   /*!< IP command Sequence execution\r\n                                                                     timeout error occurred during FLEXSPI transfer. */\r\n    kStatus_FLEXSPI_IpCommandGrantTimeout = MAKE_STATUS(kStatusGroup_FLEXSPI, 3),    /*!< IP command grant timeout error\r\n                                                                                    occurred during FLEXSPI transfer. */\r\n};\r\n\r\n/*! @brief CMD definition of FLEXSPI, use to form LUT instruction, _flexspi_command. */\r\nenum\r\n{\r\n    kFLEXSPI_Command_STOP           = 0x00U, /*!< Stop execution, deassert CS. */\r\n    kFLEXSPI_Command_SDR            = 0x01U, /*!< Transmit Command code to Flash, using SDR mode. */\r\n    kFLEXSPI_Command_RADDR_SDR      = 0x02U, /*!< Transmit Row Address to Flash, using SDR mode. */\r\n    kFLEXSPI_Command_CADDR_SDR      = 0x03U, /*!< Transmit Column Address to Flash, using SDR mode. */\r\n    kFLEXSPI_Command_MODE1_SDR      = 0x04U, /*!< Transmit 1-bit Mode bits to Flash, using SDR mode. */\r\n    kFLEXSPI_Command_MODE2_SDR      = 0x05U, /*!< Transmit 2-bit Mode bits to Flash, using SDR mode. */\r\n    kFLEXSPI_Command_MODE4_SDR      = 0x06U, /*!< Transmit 4-bit Mode bits to Flash, using SDR mode. */\r\n    kFLEXSPI_Command_MODE8_SDR      = 0x07U, /*!< Transmit 8-bit Mode bits to Flash, using SDR mode. */\r\n    kFLEXSPI_Command_WRITE_SDR      = 0x08U, /*!< Transmit Programming Data to Flash, using SDR mode. */\r\n    kFLEXSPI_Command_READ_SDR       = 0x09U, /*!< Receive Read Data from Flash, using SDR mode. */\r\n    kFLEXSPI_Command_LEARN_SDR      = 0x0AU, /*!< Receive Read Data or Preamble bit from Flash, SDR mode. */\r\n    kFLEXSPI_Command_DATSZ_SDR      = 0x0BU, /*!< Transmit Read/Program Data size (byte) to Flash, SDR mode. */\r\n    kFLEXSPI_Command_DUMMY_SDR      = 0x0CU, /*!< Leave data lines undriven by FlexSPI controller.*/\r\n    kFLEXSPI_Command_DUMMY_RWDS_SDR = 0x0DU, /*!< Leave data lines undriven by FlexSPI controller,\r\n                                                  dummy cycles decided by RWDS. */\r\n    kFLEXSPI_Command_DDR            = 0x21U, /*!< Transmit Command code to Flash, using DDR mode. */\r\n    kFLEXSPI_Command_RADDR_DDR      = 0x22U, /*!< Transmit Row Address to Flash, using DDR mode. */\r\n    kFLEXSPI_Command_CADDR_DDR      = 0x23U, /*!< Transmit Column Address to Flash, using DDR mode. */\r\n    kFLEXSPI_Command_MODE1_DDR      = 0x24U, /*!< Transmit 1-bit Mode bits to Flash, using DDR mode. */\r\n    kFLEXSPI_Command_MODE2_DDR      = 0x25U, /*!< Transmit 2-bit Mode bits to Flash, using DDR mode. */\r\n    kFLEXSPI_Command_MODE4_DDR      = 0x26U, /*!< Transmit 4-bit Mode bits to Flash, using DDR mode. */\r\n    kFLEXSPI_Command_MODE8_DDR      = 0x27U, /*!< Transmit 8-bit Mode bits to Flash, using DDR mode. */\r\n    kFLEXSPI_Command_WRITE_DDR      = 0x28U, /*!< Transmit Programming Data to Flash, using DDR mode. */\r\n    kFLEXSPI_Command_READ_DDR       = 0x29U, /*!< Receive Read Data from Flash, using DDR mode. */\r\n    kFLEXSPI_Command_LEARN_DDR      = 0x2AU, /*!< Receive Read Data or Preamble bit from Flash, DDR mode. */\r\n    kFLEXSPI_Command_DATSZ_DDR      = 0x2BU, /*!< Transmit Read/Program Data size (byte) to Flash, DDR mode. */\r\n    kFLEXSPI_Command_DUMMY_DDR      = 0x2CU, /*!< Leave data lines undriven by FlexSPI controller.*/\r\n    kFLEXSPI_Command_DUMMY_RWDS_DDR = 0x2DU, /*!< Leave data lines undriven by FlexSPI controller,\r\n                                               dummy cycles decided by RWDS. */\r\n    kFLEXSPI_Command_JUMP_ON_CS = 0x1FU,     /*!< Stop execution, deassert CS and save operand[7:0] as the\r\n                                               instruction start pointer for next sequence */\r\n};\r\n\r\n/*! @brief pad definition of FLEXSPI, use to form LUT instruction. */\r\ntypedef enum _flexspi_pad\r\n{\r\n    kFLEXSPI_1PAD = 0x00U, /*!< Transmit command/address and transmit/receive data only through DATA0/DATA1. */\r\n    kFLEXSPI_2PAD = 0x01U, /*!< Transmit command/address and transmit/receive data only through DATA[1:0]. */\r\n    kFLEXSPI_4PAD = 0x02U, /*!< Transmit command/address and transmit/receive data only through DATA[3:0]. */\r\n    kFLEXSPI_8PAD = 0x03U, /*!< Transmit command/address and transmit/receive data only through DATA[7:0]. */\r\n} flexspi_pad_t;\r\n\r\n/*! @brief FLEXSPI interrupt status flags.*/\r\ntypedef enum _flexspi_flags\r\n{\r\n    kFLEXSPI_SequenceExecutionTimeoutFlag = FLEXSPI_INTEN_SEQTIMEOUTEN_MASK, /*!< Sequence execution timeout. */\r\n#if defined(FSL_FEATURE_FLEXSPI_HAS_INTEN_AHBBUSERROREN) && FSL_FEATURE_FLEXSPI_HAS_INTEN_AHBBUSERROREN\r\n    kFLEXSPI_AhbBusErrorFlag = FLEXSPI_INTEN_AHBBUSERROREN_MASK, /*!< AHB Bus error flag. */\r\n#else\r\n    kFLEXSPI_AhbBusTimeoutFlag = FLEXSPI_INTEN_AHBBUSTIMEOUTEN_MASK, /*!< AHB Bus timeout. */\r\n#endif\r\n    kFLEXSPI_SckStoppedBecauseTxEmptyFlag =\r\n        FLEXSPI_INTEN_SCKSTOPBYWREN_MASK, /*!< SCK is stopped during command\r\n                                               sequence because Async TX FIFO empty. */\r\n    kFLEXSPI_SckStoppedBecauseRxFullFlag =\r\n        FLEXSPI_INTEN_SCKSTOPBYRDEN_MASK, /*!< SCK is stopped during command\r\n                                               sequence because Async RX FIFO full. */\r\n#if !((defined(FSL_FEATURE_FLEXSPI_HAS_NO_DATA_LEARN)) && (FSL_FEATURE_FLEXSPI_HAS_NO_DATA_LEARN))\r\n    kFLEXSPI_DataLearningFailedFlag = FLEXSPI_INTEN_DATALEARNFAILEN_MASK, /*!< Data learning failed. */\r\n#endif\r\n    kFLEXSPI_IpTxFifoWatermarkEmptyFlag     = FLEXSPI_INTEN_IPTXWEEN_MASK, /*!< IP TX FIFO WaterMark empty. */\r\n    kFLEXSPI_IpRxFifoWatermarkAvailableFlag = FLEXSPI_INTEN_IPRXWAEN_MASK, /*!< IP RX FIFO WaterMark available. */\r\n    kFLEXSPI_AhbCommandSequenceErrorFlag =\r\n        FLEXSPI_INTEN_AHBCMDERREN_MASK,                                  /*!< AHB triggered Command Sequences Error. */\r\n    kFLEXSPI_IpCommandSequenceErrorFlag = FLEXSPI_INTEN_IPCMDERREN_MASK, /*!< IP triggered Command Sequences Error. */\r\n    kFLEXSPI_AhbCommandGrantTimeoutFlag =\r\n        FLEXSPI_INTEN_AHBCMDGEEN_MASK, /*!< AHB triggered Command Sequences Grant Timeout. */\r\n    kFLEXSPI_IpCommandGrantTimeoutFlag =\r\n        FLEXSPI_INTEN_IPCMDGEEN_MASK, /*!< IP triggered Command Sequences Grant Timeout. */\r\n    kFLEXSPI_IpCommandExecutionDoneFlag =\r\n        FLEXSPI_INTEN_IPCMDDONEEN_MASK,  /*!< IP triggered Command Sequences Execution finished. */\r\n    kFLEXSPI_AllInterruptFlags = 0xFFFU, /*!< All flags. */\r\n} flexspi_flags_t;\r\n\r\n/*! @brief FLEXSPI sample clock source selection for Flash Reading.*/\r\ntypedef enum _flexspi_read_sample_clock\r\n{\r\n    kFLEXSPI_ReadSampleClkLoopbackInternally = 0x0U,      /*!< Dummy Read strobe generated by FlexSPI Controller\r\n                                                               and loopback internally. */\r\n    kFLEXSPI_ReadSampleClkLoopbackFromDqsPad = 0x1U,      /*!< Dummy Read strobe generated by FlexSPI Controller\r\n                                                               and loopback from DQS pad. */\r\n    kFLEXSPI_ReadSampleClkLoopbackFromSckPad      = 0x2U, /*!< SCK output clock and loopback from SCK pad. */\r\n    kFLEXSPI_ReadSampleClkExternalInputFromDqsPad = 0x3U, /*!< Flash provided Read strobe and input from DQS pad. */\r\n} flexspi_read_sample_clock_t;\r\n\r\n/*! @brief FLEXSPI interval unit for flash device select.*/\r\ntypedef enum _flexspi_cs_interval_cycle_unit\r\n{\r\n    kFLEXSPI_CsIntervalUnit1SckCycle   = 0x0U, /*!< Chip selection interval: CSINTERVAL * 1 serial clock cycle. */\r\n    kFLEXSPI_CsIntervalUnit256SckCycle = 0x1U, /*!< Chip selection interval: CSINTERVAL * 256 serial clock cycle. */\r\n} flexspi_cs_interval_cycle_unit_t;\r\n\r\n/*! @brief FLEXSPI AHB wait interval unit for writing.*/\r\ntypedef enum _flexspi_ahb_write_wait_unit\r\n{\r\n    kFLEXSPI_AhbWriteWaitUnit2AhbCycle     = 0x0U, /*!< AWRWAIT unit is 2 ahb clock cycle. */\r\n    kFLEXSPI_AhbWriteWaitUnit8AhbCycle     = 0x1U, /*!< AWRWAIT unit is 8 ahb clock cycle. */\r\n    kFLEXSPI_AhbWriteWaitUnit32AhbCycle    = 0x2U, /*!< AWRWAIT unit is 32 ahb clock cycle. */\r\n    kFLEXSPI_AhbWriteWaitUnit128AhbCycle   = 0x3U, /*!< AWRWAIT unit is 128 ahb clock cycle. */\r\n    kFLEXSPI_AhbWriteWaitUnit512AhbCycle   = 0x4U, /*!< AWRWAIT unit is 512 ahb clock cycle. */\r\n    kFLEXSPI_AhbWriteWaitUnit2048AhbCycle  = 0x5U, /*!< AWRWAIT unit is 2048 ahb clock cycle. */\r\n    kFLEXSPI_AhbWriteWaitUnit8192AhbCycle  = 0x6U, /*!< AWRWAIT unit is 8192 ahb clock cycle. */\r\n    kFLEXSPI_AhbWriteWaitUnit32768AhbCycle = 0x7U, /*!< AWRWAIT unit is 32768 ahb clock cycle. */\r\n} flexspi_ahb_write_wait_unit_t;\r\n\r\n/*! @brief Error Code when IP command Error detected.*/\r\ntypedef enum _flexspi_ip_error_code\r\n{\r\n    kFLEXSPI_IpCmdErrorNoError               = 0x0U,    /*!< No error. */\r\n    kFLEXSPI_IpCmdErrorJumpOnCsInIpCmd       = 0x2U,    /*!< IP command with JMP_ON_CS instruction used. */\r\n    kFLEXSPI_IpCmdErrorUnknownOpCode         = 0x3U,    /*!< Unknown instruction opcode in the sequence. */\r\n    kFLEXSPI_IpCmdErrorSdrDummyInDdrSequence = 0x4U,    /*!< Instruction DUMMY_SDR/DUMMY_RWDS_SDR\r\n                                                             used in DDR sequence. */\r\n    kFLEXSPI_IpCmdErrorDdrDummyInSdrSequence = 0x5U,    /*!< Instruction DUMMY_DDR/DUMMY_RWDS_DDR\r\n                                                             used in SDR sequence. */\r\n    kFLEXSPI_IpCmdErrorInvalidAddress = 0x6U,           /*!< Flash access start address exceed the whole\r\n                                                            flash address range (A1/A2/B1/B2). */\r\n    kFLEXSPI_IpCmdErrorSequenceExecutionTimeout = 0xEU, /*!< Sequence execution timeout. */\r\n    kFLEXSPI_IpCmdErrorFlashBoundaryAcrosss     = 0xFU, /*!< Flash boundary crossed. */\r\n} flexspi_ip_error_code_t;\r\n\r\n/*! @brief Error Code when AHB command Error detected.*/\r\ntypedef enum _flexspi_ahb_error_code\r\n{\r\n    kFLEXSPI_AhbCmdErrorNoError            = 0x0U,    /*!< No error. */\r\n    kFLEXSPI_AhbCmdErrorJumpOnCsInWriteCmd = 0x2U,    /*!< AHB Write command with JMP_ON_CS instruction\r\n                                                           used in the sequence. */\r\n    kFLEXSPI_AhbCmdErrorUnknownOpCode         = 0x3U, /*!< Unknown instruction opcode in the sequence. */\r\n    kFLEXSPI_AhbCmdErrorSdrDummyInDdrSequence = 0x4U, /*!< Instruction DUMMY_SDR/DUMMY_RWDS_SDR used\r\n                                                           in DDR sequence. */\r\n    kFLEXSPI_AhbCmdErrorDdrDummyInSdrSequence = 0x5U, /*!< Instruction DUMMY_DDR/DUMMY_RWDS_DDR\r\n                                                           used in SDR sequence. */\r\n    kFLEXSPI_AhbCmdSequenceExecutionTimeout = 0x6U,   /*!< Sequence execution timeout. */\r\n} flexspi_ahb_error_code_t;\r\n\r\n/*! @brief FLEXSPI operation port select.*/\r\ntypedef enum _flexspi_port\r\n{\r\n    kFLEXSPI_PortA1 = 0x0U, /*!< Access flash on A1 port. */\r\n    kFLEXSPI_PortA2,        /*!< Access flash on A2 port. */\r\n#if !((defined(FSL_FEATURE_FLEXSPI_NO_SUPPORT_PORTB)) && (FSL_FEATURE_FLEXSPI_NO_SUPPORT_PORTB))\r\n    kFLEXSPI_PortB1, /*!< Access flash on B1 port. */\r\n    kFLEXSPI_PortB2, /*!< Access flash on B2 port. */\r\n#endif\r\n    kFLEXSPI_PortCount\r\n} flexspi_port_t;\r\n\r\n/*! @brief Trigger source of current command sequence granted by arbitrator.*/\r\ntypedef enum _flexspi_arb_command_source\r\n{\r\n    kFLEXSPI_AhbReadCommand   = 0x0U,\r\n    kFLEXSPI_AhbWriteCommand  = 0x1U,\r\n    kFLEXSPI_IpCommand        = 0x2U,\r\n    kFLEXSPI_SuspendedCommand = 0x3U,\r\n} flexspi_arb_command_source_t;\r\n\r\n/*! @brief Command type. */\r\ntypedef enum _flexspi_command_type\r\n{\r\n    kFLEXSPI_Command, /*!< FlexSPI operation: Only command, both TX and Rx buffer are ignored. */\r\n    kFLEXSPI_Config,  /*!< FlexSPI operation: Configure device mode, the TX fifo size is fixed in LUT. */\r\n    kFLEXSPI_Read,    /* /!< FlexSPI operation: Read, only Rx Buffer is effective. */\r\n    kFLEXSPI_Write,   /* /!< FlexSPI operation: Read, only Tx Buffer is effective. */\r\n} flexspi_command_type_t;\r\n\r\ntypedef struct _flexspi_ahbBuffer_config\r\n{\r\n    uint8_t priority;    /*!< This priority for AHB Master Read which this AHB RX Buffer is assigned. */\r\n    uint8_t masterIndex; /*!< AHB Master ID the AHB RX Buffer is assigned. */\r\n    uint16_t bufferSize; /*!< AHB buffer size in byte. */\r\n    bool enablePrefetch; /*!< AHB Read Prefetch Enable for current AHB RX Buffer corresponding Master, allows\r\n                          prefetch disable/enable separately for each master. */\r\n} flexspi_ahbBuffer_config_t;\r\n\r\n/*! @brief FLEXSPI configuration structure. */\r\ntypedef struct _flexspi_config\r\n{\r\n    flexspi_read_sample_clock_t rxSampleClock; /*!< Sample Clock source selection for Flash Reading. */\r\n    bool enableSckFreeRunning;                 /*!< Enable/disable SCK output free-running. */\r\n#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_COMBINATIONEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_COMBINATIONEN)\r\n    bool enableCombination; /*!< Enable/disable combining PORT A and B Data Pins\r\n                            (SIOA[3:0] and SIOB[3:0]) to support Flash Octal mode. */\r\n#endif\r\n    bool enableDoze;            /*!< Enable/disable doze mode support. */\r\n    bool enableHalfSpeedAccess; /*!< Enable/disable divide by 2 of the clock for half\r\n                                 speed commands. */\r\n#if defined(FSL_FEATURE_FLEXSPI_SUPPORT_SEPERATE_RXCLKSRC_PORTB) && FSL_FEATURE_FLEXSPI_SUPPORT_SEPERATE_RXCLKSRC_PORTB\r\n    flexspi_read_sample_clock_t rxSampleClockPortB; /*!< Sample Clock source_b selection for Flash Reading. */\r\n#endif\r\n#if defined(FSL_FEATURE_FLEXSPI_SUPPORT_RXCLKSRC_DIFF) && FSL_FEATURE_FLEXSPI_SUPPORT_RXCLKSRC_DIFF\r\n    bool rxSampleClockDiff; /*!< Sample Clock source or source_b selection for Flash Reading. */\r\n#endif\r\n#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR2_SCKBDIFFOPT) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR2_SCKBDIFFOPT)\r\n    bool enableSckBDiffOpt; /*!< Enable/disable SCKB pad use as SCKA differential clock\r\n                             output, when enable, Port B flash access is not available. */\r\n#endif\r\n    bool enableSameConfigForAll; /*!< Enable/disable same configuration for all connected devices\r\n                                  when enabled, same configuration in FLASHA1CRx is applied to all. */\r\n    uint16_t seqTimeoutCycle;    /*!< Timeout wait cycle for command sequence execution,\r\n                                 timeout after ahbGrantTimeoutCyle*1024 serial root clock cycles. */\r\n    uint8_t ipGrantTimeoutCycle; /*!< Timeout wait cycle for IP command grant, timeout after\r\n                                  ipGrantTimeoutCycle*1024 AHB clock cycles. */\r\n    uint8_t txWatermark;         /*!< FLEXSPI IP transmit watermark value. */\r\n    uint8_t rxWatermark;         /*!< FLEXSPI receive watermark value. */\r\n    struct\r\n    {\r\n#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ATDFEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ATDFEN)\r\n        bool enableAHBWriteIpTxFifo; /*!< Enable AHB bus write access to IP TX FIFO. */\r\n#endif\r\n#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ARDFEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_ARDFEN)\r\n        bool enableAHBWriteIpRxFifo; /*!< Enable AHB bus write access to IP RX FIFO. */\r\n#endif\r\n        uint8_t ahbGrantTimeoutCycle; /*!< Timeout wait cycle for AHB command grant,\r\n                                       timeout after ahbGrantTimeoutCyle*1024 AHB clock cycles. */\r\n        uint16_t ahbBusTimeoutCycle;  /*!< Timeout wait cycle for AHB read/write access,\r\n                                      timeout after ahbBusTimeoutCycle*1024 AHB clock cycles. */\r\n        uint8_t resumeWaitCycle;      /*!< Wait cycle for idle state before suspended command sequence\r\n                                       resume, timeout after ahbBusTimeoutCycle AHB clock cycles. */\r\n        flexspi_ahbBuffer_config_t buffer[FSL_FEATURE_FLEXSPI_AHB_BUFFER_COUNT]; /*!< AHB buffer size. */\r\n        bool enableClearAHBBufferOpt; /*!< Enable/disable automatically clean AHB RX Buffer and TX Buffer\r\n                                       when FLEXSPI returns STOP mode ACK. */\r\n        bool enableReadAddressOpt;    /*!< Enable/disable remove AHB read burst start address alignment limitation.\r\n                                       when enable, there is no AHB read burst start address alignment limitation. */\r\n        bool enableAHBPrefetch;       /*!< Enable/disable AHB read prefetch feature, when enabled, FLEXSPI\r\n                                       will fetch more data than current AHB burst. */\r\n        bool enableAHBBufferable;     /*!< Enable/disable AHB bufferable write access support, when enabled,\r\n                                       FLEXSPI return before waiting for command execution finished. */\r\n        bool enableAHBCachable;       /*!< Enable AHB bus cachable read access support. */\r\n    } ahbConfig;\r\n} flexspi_config_t;\r\n\r\n/*! @brief External device configuration items. */\r\ntypedef struct _flexspi_device_config\r\n{\r\n    uint32_t flexspiRootClk; /*!< FLEXSPI serial root clock. */\r\n    bool isSck2Enabled;      /*!< FLEXSPI use SCK2. */\r\n    uint32_t flashSize;      /*!< Flash size in KByte. */\r\n#if defined(FSL_FEATURE_FLEXSPI_SUPPORT_ADDRESS_SHIFT) && (FSL_FEATURE_FLEXSPI_SUPPORT_ADDRESS_SHIFT)\r\n    bool addressShift;                               /*!< Address shift. */\r\n#endif                                               /* FSL_FEATURE_FLEXSPI_SUPPORT_ADDRESS_SHIFT */\r\n    flexspi_cs_interval_cycle_unit_t CSIntervalUnit; /*!< CS interval unit, 1 or 256 cycle. */\r\n    uint16_t CSInterval;                             /*!< CS line assert interval, multiply CS interval unit to\r\n                                                      get the CS line assert interval cycles. */\r\n    uint8_t CSHoldTime;                              /*!< CS line hold time. */\r\n    uint8_t CSSetupTime;                             /*!< CS line setup time. */\r\n    uint8_t dataValidTime;                           /*!< Data valid time for external device. */\r\n    uint8_t columnspace;                             /*!< Column space size. */\r\n    bool enableWordAddress;                          /*!< If enable word address.*/\r\n    uint8_t AWRSeqIndex;                             /*!< Sequence ID for AHB write command. */\r\n    uint8_t AWRSeqNumber;                            /*!< Sequence number for AHB write command. */\r\n    uint8_t ARDSeqIndex;                             /*!< Sequence ID for AHB read command. */\r\n    uint8_t ARDSeqNumber;                            /*!< Sequence number for AHB read command. */\r\n    flexspi_ahb_write_wait_unit_t AHBWriteWaitUnit;  /*!< AHB write wait unit. */\r\n    uint16_t AHBWriteWaitInterval;                   /*!< AHB write wait interval, multiply AHB write interval\r\n                                                      unit to get the AHB write wait cycles. */\r\n    bool enableWriteMask;                            /*!< Enable/Disable FLEXSPI drive DQS pin as write mask\r\n                                                      when writing to external device. */\r\n#if defined(FSL_FEATURE_FLEXSPI_HAS_ERRATA_051426) && (FSL_FEATURE_FLEXSPI_HAS_ERRATA_051426)\r\n    bool isFroClockSource; /*!< Is FRO clock source or not. */\r\n#endif\r\n} flexspi_device_config_t;\r\n\r\n/*! @brief Transfer structure for FLEXSPI. */\r\ntypedef struct _flexspi_transfer\r\n{\r\n    uint32_t deviceAddress;         /*!< Operation device address. */\r\n    flexspi_port_t port;            /*!< Operation port. */\r\n    flexspi_command_type_t cmdType; /*!< Execution command type. */\r\n    uint8_t seqIndex;               /*!< Sequence ID for command. */\r\n    uint8_t SeqNumber;              /*!< Sequence number for command. */\r\n    uint32_t *data;                 /*!< Data buffer. */\r\n    size_t dataSize;                /*!< Data size in bytes. */\r\n} flexspi_transfer_t;\r\n\r\n/* Forward declaration of the handle typedef. */\r\ntypedef struct _flexspi_handle flexspi_handle_t;\r\n\r\n/*! @brief FLEXSPI transfer callback function. */\r\ntypedef void (*flexspi_transfer_callback_t)(FLEXSPI_Type *base,\r\n                                            flexspi_handle_t *handle,\r\n                                            status_t status,\r\n                                            void *userData);\r\n\r\n/*! @brief Transfer handle structure for FLEXSPI. */\r\nstruct _flexspi_handle\r\n{\r\n    uint32_t state;                                 /*!< Internal state for FLEXSPI transfer */\r\n    uint8_t *data;                                  /*!< Data buffer. */\r\n    size_t dataSize;                                /*!< Remaining Data size in bytes. */\r\n    size_t transferTotalSize;                       /*!< Total Data size in bytes. */\r\n    flexspi_transfer_callback_t completionCallback; /*!< Callback for users while transfer finish or error occurred */\r\n    void *userData;                                 /*!< FLEXSPI callback function parameter.*/\r\n};\r\n\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif /*_cplusplus. */\r\n\r\n/*!\r\n * @name Initialization and deinitialization\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief Get the instance number for FLEXSPI.\r\n *\r\n * @param base FLEXSPI base pointer.\r\n */\r\nuint32_t FLEXSPI_GetInstance(FLEXSPI_Type *base);\r\n\r\n/*!\r\n * @brief Check and clear IP command execution errors.\r\n *\r\n * @param base FLEXSPI base pointer.\r\n * @param status interrupt status.\r\n */\r\nstatus_t FLEXSPI_CheckAndClearError(FLEXSPI_Type *base, uint32_t status);\r\n\r\n/*!\r\n * @brief Initializes the FLEXSPI module and internal state.\r\n *\r\n * This function enables the clock for FLEXSPI and also configures the FLEXSPI with the\r\n * input configure parameters. Users should call this function before any FLEXSPI operations.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param config FLEXSPI configure structure.\r\n */\r\nvoid FLEXSPI_Init(FLEXSPI_Type *base, const flexspi_config_t *config);\r\n\r\n/*!\r\n * @brief Gets default settings for FLEXSPI.\r\n *\r\n * @param config FLEXSPI configuration structure.\r\n */\r\nvoid FLEXSPI_GetDefaultConfig(flexspi_config_t *config);\r\n\r\n/*!\r\n * @brief Deinitializes the FLEXSPI module.\r\n *\r\n * Clears the FLEXSPI state and  FLEXSPI module registers.\r\n * @param base FLEXSPI peripheral base address.\r\n */\r\nvoid FLEXSPI_Deinit(FLEXSPI_Type *base);\r\n\r\n/*!\r\n * @brief Update FLEXSPI DLL value depending on currently flexspi root clock.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param config Flash configuration parameters.\r\n * @param port FLEXSPI Operation port.\r\n */\r\nvoid FLEXSPI_UpdateDllValue(FLEXSPI_Type *base, flexspi_device_config_t *config, flexspi_port_t port);\r\n\r\n/*!\r\n * @brief Configures the connected device parameter.\r\n *\r\n * This function configures the connected device relevant parameters, such as the size, command, and so on.\r\n * The flash configuration value cannot have a default value. The user needs to configure it according to the\r\n * connected device.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param config Flash configuration parameters.\r\n * @param port FLEXSPI Operation port.\r\n */\r\nvoid FLEXSPI_SetFlashConfig(FLEXSPI_Type *base, flexspi_device_config_t *config, flexspi_port_t port);\r\n\r\n/*!\r\n * @brief Software reset for the FLEXSPI logic.\r\n *\r\n * This function sets the software reset flags for both AHB and buffer domain and\r\n * resets both AHB buffer and also IP FIFOs.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n */\r\nstatic inline void FLEXSPI_SoftwareReset(FLEXSPI_Type *base)\r\n{\r\n    base->MCR0 |= FLEXSPI_MCR0_SWRESET_MASK;\r\n    while (0U != (base->MCR0 & FLEXSPI_MCR0_SWRESET_MASK))\r\n    {\r\n    }\r\n}\r\n\r\n/*!\r\n * @brief Enables or disables the FLEXSPI module.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param enable True means enable FLEXSPI, false means disable.\r\n */\r\nstatic inline void FLEXSPI_Enable(FLEXSPI_Type *base, bool enable)\r\n{\r\n    if (enable)\r\n    {\r\n        base->MCR0 &= ~FLEXSPI_MCR0_MDIS_MASK;\r\n    }\r\n    else\r\n    {\r\n        base->MCR0 |= FLEXSPI_MCR0_MDIS_MASK;\r\n    }\r\n}\r\n\r\n/*! @} */\r\n\r\n/*!\r\n * @name Interrupts\r\n * @{\r\n */\r\n/*!\r\n * @brief Enables the FLEXSPI interrupts.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param mask FLEXSPI interrupt source.\r\n */\r\nstatic inline void FLEXSPI_EnableInterrupts(FLEXSPI_Type *base, uint32_t mask)\r\n{\r\n    base->INTEN |= mask;\r\n}\r\n\r\n/*!\r\n * @brief Disable the FLEXSPI interrupts.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param mask FLEXSPI interrupt source.\r\n */\r\nstatic inline void FLEXSPI_DisableInterrupts(FLEXSPI_Type *base, uint32_t mask)\r\n{\r\n    base->INTEN &= ~mask;\r\n}\r\n\r\n/*! @} */\r\n\r\n/*! @name DMA control */\r\n/*! @{ */\r\n\r\n/*!\r\n * @brief Enables or disables FLEXSPI IP Tx FIFO DMA requests.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param enable Enable flag for transmit DMA request. Pass true for enable, false for disable.\r\n */\r\nstatic inline void FLEXSPI_EnableTxDMA(FLEXSPI_Type *base, bool enable)\r\n{\r\n    if (enable)\r\n    {\r\n        base->IPTXFCR |= FLEXSPI_IPTXFCR_TXDMAEN_MASK;\r\n    }\r\n    else\r\n    {\r\n        base->IPTXFCR &= ~FLEXSPI_IPTXFCR_TXDMAEN_MASK;\r\n    }\r\n}\r\n\r\n/*!\r\n * @brief Enables or disables FLEXSPI IP Rx FIFO DMA requests.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param enable Enable flag for receive DMA request. Pass true for enable, false for disable.\r\n */\r\nstatic inline void FLEXSPI_EnableRxDMA(FLEXSPI_Type *base, bool enable)\r\n{\r\n    if (enable)\r\n    {\r\n        base->IPRXFCR |= FLEXSPI_IPRXFCR_RXDMAEN_MASK;\r\n    }\r\n    else\r\n    {\r\n        base->IPRXFCR &= ~FLEXSPI_IPRXFCR_RXDMAEN_MASK;\r\n    }\r\n}\r\n\r\n/*!\r\n * @brief Gets FLEXSPI IP tx fifo address for DMA transfer.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @retval The tx fifo address.\r\n */\r\nstatic inline uint32_t FLEXSPI_GetTxFifoAddress(FLEXSPI_Type *base)\r\n{\r\n    return (uint32_t)&base->TFDR[0];\r\n}\r\n\r\n/*!\r\n * @brief Gets FLEXSPI IP rx fifo address for DMA transfer.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @retval The rx fifo address.\r\n */\r\nstatic inline uint32_t FLEXSPI_GetRxFifoAddress(FLEXSPI_Type *base)\r\n{\r\n    return (uint32_t)&base->RFDR[0];\r\n}\r\n\r\n/*! @} */\r\n\r\n/*! @name FIFO control */\r\n/*! @{ */\r\n\r\n/*! @brief Clears the FLEXSPI IP FIFO logic.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param txFifo Pass true to reset TX FIFO.\r\n * @param rxFifo Pass true to reset RX FIFO.\r\n */\r\nstatic inline void FLEXSPI_ResetFifos(FLEXSPI_Type *base, bool txFifo, bool rxFifo)\r\n{\r\n    if (txFifo)\r\n    {\r\n        base->IPTXFCR |= FLEXSPI_IPTXFCR_CLRIPTXF_MASK;\r\n    }\r\n    if (rxFifo)\r\n    {\r\n        base->IPRXFCR |= FLEXSPI_IPRXFCR_CLRIPRXF_MASK;\r\n    }\r\n}\r\n\r\n/*!\r\n * @brief Gets the valid data entries in the FLEXSPI FIFOs.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param[out] txCount Pointer through which the current number of bytes in the transmit FIFO is returned.\r\n *      Pass NULL if this value is not required.\r\n * @param[out] rxCount Pointer through which the current number of bytes in the receive FIFO is returned.\r\n *      Pass NULL if this value is not required.\r\n */\r\nstatic inline void FLEXSPI_GetFifoCounts(FLEXSPI_Type *base, size_t *txCount, size_t *rxCount)\r\n{\r\n    if (NULL != txCount)\r\n    {\r\n        *txCount = (((base->IPTXFSTS) & FLEXSPI_IPTXFSTS_FILL_MASK) >> FLEXSPI_IPTXFSTS_FILL_SHIFT) * 8U;\r\n    }\r\n    if (NULL != rxCount)\r\n    {\r\n        *rxCount = (((base->IPRXFSTS) & FLEXSPI_IPRXFSTS_FILL_MASK) >> FLEXSPI_IPRXFSTS_FILL_SHIFT) * 8U;\r\n    }\r\n}\r\n\r\n/*! @} */\r\n\r\n/*!\r\n * @name Status\r\n * @{\r\n */\r\n/*!\r\n * @brief Get the FLEXSPI interrupt status flags.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @retval interrupt status flag, use status flag to AND #flexspi_flags_t could get the related status.\r\n */\r\nstatic inline uint32_t FLEXSPI_GetInterruptStatusFlags(FLEXSPI_Type *base)\r\n{\r\n    return base->INTR;\r\n}\r\n\r\n/*!\r\n * @brief Get the FLEXSPI interrupt status flags.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param mask FLEXSPI interrupt source.\r\n */\r\nstatic inline void FLEXSPI_ClearInterruptStatusFlags(FLEXSPI_Type *base, uint32_t mask)\r\n{\r\n    base->INTR = mask;\r\n}\r\n\r\n#if !((defined(FSL_FEATURE_FLEXSPI_HAS_NO_DATA_LEARN)) && (FSL_FEATURE_FLEXSPI_HAS_NO_DATA_LEARN))\r\n/*! @brief Gets the sampling clock phase selection after Data Learning.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param portAPhase Pointer to a uint8_t type variable to receive the selected clock phase on PORTA.\r\n * @param portBPhase Pointer to a uint8_t type variable to receive the selected clock phase on PORTB.\r\n */\r\nstatic inline void FLEXSPI_GetDataLearningPhase(FLEXSPI_Type *base, uint8_t *portAPhase, uint8_t *portBPhase)\r\n{\r\n    if (portAPhase != NULL)\r\n    {\r\n        *portAPhase = (uint8_t)((base->STS0 & FLEXSPI_STS0_DATALEARNPHASEA_MASK) >> FLEXSPI_STS0_DATALEARNPHASEA_SHIFT);\r\n    }\r\n\r\n#if !((defined(FSL_FEATURE_FLEXSPI_HAS_NO_STS0_DATALEARNPHASEB)) && (FSL_FEATURE_FLEXSPI_HAS_NO_STS0_DATALEARNPHASEB))\r\n    if (portBPhase != NULL)\r\n    {\r\n        *portBPhase = (uint8_t)((base->STS0 & FLEXSPI_STS0_DATALEARNPHASEB_MASK) >> FLEXSPI_STS0_DATALEARNPHASEB_SHIFT);\r\n    }\r\n#endif\r\n}\r\n#endif\r\n\r\n/*! @brief Gets the trigger source of current command sequence granted by arbitrator.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @retval trigger source of current command sequence.\r\n */\r\nstatic inline flexspi_arb_command_source_t FLEXSPI_GetArbitratorCommandSource(FLEXSPI_Type *base)\r\n{\r\n    return (flexspi_arb_command_source_t)(\r\n        (uint32_t)((base->STS0 & FLEXSPI_STS0_ARBCMDSRC_MASK) >> FLEXSPI_STS0_ARBCMDSRC_SHIFT));\r\n}\r\n\r\n/*! @brief Gets the error code when IP command error detected.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param index Pointer to a uint8_t type variable to receive the sequence index when error detected.\r\n * @retval error code when IP command error detected.\r\n */\r\nstatic inline flexspi_ip_error_code_t FLEXSPI_GetIPCommandErrorCode(FLEXSPI_Type *base, uint8_t *index)\r\n{\r\n    *index = (uint8_t)((base->STS1 & FLEXSPI_STS1_IPCMDERRID_MASK) >> FLEXSPI_STS1_IPCMDERRID_SHIFT);\r\n    return (flexspi_ip_error_code_t)(\r\n        (uint32_t)((base->STS1 & FLEXSPI_STS1_IPCMDERRCODE_MASK) >> FLEXSPI_STS1_IPCMDERRCODE_SHIFT));\r\n}\r\n\r\n/*! @brief Gets the error code when AHB command error detected.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param index Pointer to a uint8_t type variable to receive the sequence index when error detected.\r\n * @retval error code when AHB command error detected.\r\n */\r\nstatic inline flexspi_ahb_error_code_t FLEXSPI_GetAHBCommandErrorCode(FLEXSPI_Type *base, uint8_t *index)\r\n{\r\n    *index = (uint8_t)(base->STS1 & FLEXSPI_STS1_AHBCMDERRID_MASK) >> FLEXSPI_STS1_AHBCMDERRID_SHIFT;\r\n    return (flexspi_ahb_error_code_t)(\r\n        (uint32_t)((base->STS1 & FLEXSPI_STS1_AHBCMDERRCODE_MASK) >> FLEXSPI_STS1_AHBCMDERRCODE_SHIFT));\r\n}\r\n\r\n/*! @brief Returns whether the bus is idle.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @retval true Bus is idle.\r\n * @retval false Bus is busy.\r\n */\r\nstatic inline bool FLEXSPI_GetBusIdleStatus(FLEXSPI_Type *base)\r\n{\r\n    return (0U != (base->STS0 & FLEXSPI_STS0_ARBIDLE_MASK)) && (0U != (base->STS0 & FLEXSPI_STS0_SEQIDLE_MASK));\r\n}\r\n/*! @} */\r\n\r\n/*!\r\n * @name Bus Operations\r\n * @{\r\n */\r\n\r\n/*! @brief Update read sample clock source\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param clockSource clockSource of type #flexspi_read_sample_clock_t\r\n */\r\nvoid FLEXSPI_UpdateRxSampleClock(FLEXSPI_Type *base, flexspi_read_sample_clock_t clockSource);\r\n\r\n#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_IP_PARALLEL_MODE) && FSL_FEATURE_FLEXSPI_HAS_NO_IP_PARALLEL_MODE)\r\n/*! @brief Enables/disables the FLEXSPI IP command parallel mode.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param enable True means enable parallel mode, false means disable parallel mode.\r\n */\r\nstatic inline void FLEXSPI_EnableIPParallelMode(FLEXSPI_Type *base, bool enable)\r\n{\r\n    if (enable)\r\n    {\r\n        base->IPCR1 |= FLEXSPI_IPCR1_IPAREN_MASK;\r\n    }\r\n    else\r\n    {\r\n        base->IPCR1 &= ~FLEXSPI_IPCR1_IPAREN_MASK;\r\n    }\r\n}\r\n#endif\r\n\r\n#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_AHB_PARALLEL_MODE) && FSL_FEATURE_FLEXSPI_HAS_NO_AHB_PARALLEL_MODE)\r\n/*! @brief Enables/disables the FLEXSPI AHB command parallel mode.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param enable True means enable parallel mode, false means disable parallel mode.\r\n */\r\nstatic inline void FLEXSPI_EnableAHBParallelMode(FLEXSPI_Type *base, bool enable)\r\n{\r\n    if (enable)\r\n    {\r\n        base->AHBCR |= FLEXSPI_AHBCR_APAREN_MASK;\r\n    }\r\n    else\r\n    {\r\n        base->AHBCR &= ~FLEXSPI_AHBCR_APAREN_MASK;\r\n    }\r\n}\r\n#endif\r\n\r\n#if (defined(FSL_FEATURE_FLEXSPI_HAS_AHBCR_AFLASHBASE_BIT) && FSL_FEATURE_FLEXSPI_HAS_AHBCR_AFLASHBASE_BIT)\r\n/*!\r\n * @brief Set AHB Memory-Mapped Flash base address.\r\n * \r\n * @note The length of base address may be different for differnt instance, please refer to the reference manual.\r\n * @note This function should be called when FLEXSPI is in stop mode.\r\n * \r\n * @param base FLEXSPI peripheral base address.\r\n * @param address AHB Memory-Mapped Flash base address.\r\n */\r\nstatic inline void FLEXSPI_SetAHBFlashBaseAddress(FLEXSPI_Type *base, uint8_t address)\r\n{\r\n    base->AHBCR = (base->AHBCR & (~FLEXSPI_AHBCR_AFLASHBASE_MASK)) | FLEXSPI_AHBCR_AFLASHBASE(address);\r\n}\r\n#endif /* (defined(FSL_FEATURE_FLEXSPI_HAS_AHBCR_AFLASHBASE_BIT) && FSL_FEATURE_FLEXSPI_HAS_AHBCR_AFLASHBASE_BIT) */\r\n\r\n/*! @brief Updates the LUT table.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param index From which index start to update. It could be any index of the LUT table, which\r\n * also allows user to update command content inside a command. Each command consists of up to\r\n * 8 instructions and occupy 4*32-bit memory.\r\n * @param cmd Command sequence array.\r\n * @param count Number of sequences.\r\n */\r\nvoid FLEXSPI_UpdateLUT(FLEXSPI_Type *base, uint32_t index, const uint32_t *cmd, uint32_t count);\r\n\r\n/*!\r\n * @brief Writes data into FIFO.\r\n *\r\n * @param base FLEXSPI peripheral base address\r\n * @param data The data bytes to send\r\n * @param fifoIndex Destination fifo index.\r\n */\r\nstatic inline void FLEXSPI_WriteData(FLEXSPI_Type *base, uint32_t data, uint8_t fifoIndex)\r\n{\r\n    base->TFDR[fifoIndex] = data;\r\n}\r\n\r\n/*!\r\n * @brief Receives data from data FIFO.\r\n *\r\n * @param base FLEXSPI peripheral base address\r\n * @param fifoIndex Source fifo index.\r\n * @return The data in the FIFO.\r\n */\r\nstatic inline uint32_t FLEXSPI_ReadData(FLEXSPI_Type *base, uint8_t fifoIndex)\r\n{\r\n    return base->RFDR[fifoIndex];\r\n}\r\n\r\n/*!\r\n * @brief Sends a buffer of data bytes using blocking method.\r\n * @note This function blocks via polling until all bytes have been sent.\r\n * @param base FLEXSPI peripheral base address\r\n * @param buffer The data bytes to send\r\n * @param size The number of data bytes to send\r\n * @retval kStatus_Success write success without error\r\n * @retval kStatus_FLEXSPI_SequenceExecutionTimeout sequence execution timeout\r\n * @retval kStatus_FLEXSPI_IpCommandSequenceError IP command sequence error detected\r\n * @retval kStatus_FLEXSPI_IpCommandGrantTimeout IP command grant timeout detected\r\n */\r\nstatus_t FLEXSPI_WriteBlocking(FLEXSPI_Type *base, uint8_t *buffer, size_t size);\r\n\r\n/*!\r\n * @brief Receives a buffer of data bytes using a blocking method.\r\n * @note This function blocks via polling until all bytes have been sent.\r\n * @param base FLEXSPI peripheral base address\r\n * @param buffer The data bytes to send\r\n * @param size The number of data bytes to receive\r\n * @retval kStatus_Success read success without error\r\n * @retval kStatus_FLEXSPI_SequenceExecutionTimeout sequence execution timeout\r\n * @retval kStatus_FLEXSPI_IpCommandSequenceError IP command sequencen error detected\r\n * @retval kStatus_FLEXSPI_IpCommandGrantTimeout IP command grant timeout detected\r\n */\r\nstatus_t FLEXSPI_ReadBlocking(FLEXSPI_Type *base, uint8_t *buffer, size_t size);\r\n\r\n/*!\r\n * @brief Execute command to transfer a buffer data bytes using a blocking method.\r\n * @param base FLEXSPI peripheral base address\r\n * @param xfer pointer to the transfer structure.\r\n * @retval kStatus_Success command transfer success without error\r\n * @retval kStatus_FLEXSPI_SequenceExecutionTimeout sequence execution timeout\r\n * @retval kStatus_FLEXSPI_IpCommandSequenceError IP command sequence error detected\r\n * @retval kStatus_FLEXSPI_IpCommandGrantTimeout IP command grant timeout detected\r\n */\r\nstatus_t FLEXSPI_TransferBlocking(FLEXSPI_Type *base, flexspi_transfer_t *xfer);\r\n/*! @} */\r\n\r\n/*!\r\n * @name Transactional\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief Initializes the FLEXSPI handle which is used in transactional functions.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param handle pointer to flexspi_handle_t structure to store the transfer state.\r\n * @param callback pointer to user callback function.\r\n * @param userData user parameter passed to the callback function.\r\n */\r\nvoid FLEXSPI_TransferCreateHandle(FLEXSPI_Type *base,\r\n                                  flexspi_handle_t *handle,\r\n                                  flexspi_transfer_callback_t callback,\r\n                                  void *userData);\r\n\r\n/*!\r\n * @brief Performs a interrupt non-blocking transfer on the FLEXSPI bus.\r\n *\r\n * @note Calling the API returns immediately after transfer initiates. The user needs\r\n * to call FLEXSPI_GetTransferCount to poll the transfer status to check whether\r\n * the transfer is finished. If the return status is not kStatus_FLEXSPI_Busy, the transfer\r\n * is finished. For FLEXSPI_Read, the dataSize should be multiple of rx watermark level, or\r\n * FLEXSPI could not read data properly.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param handle pointer to flexspi_handle_t structure which stores the transfer state.\r\n * @param xfer pointer to flexspi_transfer_t structure.\r\n * @retval kStatus_Success Successfully start the data transmission.\r\n * @retval kStatus_FLEXSPI_Busy Previous transmission still not finished.\r\n */\r\nstatus_t FLEXSPI_TransferNonBlocking(FLEXSPI_Type *base, flexspi_handle_t *handle, flexspi_transfer_t *xfer);\r\n\r\n/*!\r\n * @brief Gets the master transfer status during a interrupt non-blocking transfer.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param handle pointer to flexspi_handle_t structure which stores the transfer state.\r\n * @param count Number of bytes transferred so far by the non-blocking transaction.\r\n * @retval kStatus_InvalidArgument count is Invalid.\r\n * @retval kStatus_Success Successfully return the count.\r\n */\r\nstatus_t FLEXSPI_TransferGetCount(FLEXSPI_Type *base, flexspi_handle_t *handle, size_t *count);\r\n\r\n/*!\r\n * @brief Aborts an interrupt non-blocking transfer early.\r\n *\r\n * @note This API can be called at any time when an interrupt non-blocking transfer initiates\r\n * to abort the transfer early.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param handle pointer to flexspi_handle_t structure which stores the transfer state\r\n */\r\nvoid FLEXSPI_TransferAbort(FLEXSPI_Type *base, flexspi_handle_t *handle);\r\n\r\n/*!\r\n * @brief Master interrupt handler.\r\n *\r\n * @param base FLEXSPI peripheral base address.\r\n * @param handle pointer to flexspi_handle_t structure.\r\n */\r\nvoid FLEXSPI_TransferHandleIRQ(FLEXSPI_Type *base, flexspi_handle_t *handle);\r\n/*! @} */\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif /*_cplusplus. */\r\n/*! @} */\r\n\r\n#endif /* FSL_FLEXSPI_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_gdma.c",
    "content": "/*\r\n * Copyright 2021-2023 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include \"fsl_gdma.h\"\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/* Component ID definition, used by tools. */\r\n#ifndef FSL_COMPONENT_ID\r\n#define FSL_COMPONENT_ID \"platform.drivers.gdma\"\r\n#endif\r\n\r\n/* Is address aligned? */\r\n#define GDMA_IS_ADDR_ALIGNED(addr, aligned_size) (((uint32_t)(addr) & ((aligned_size)-1UL)) == 0U)\r\n/* Is the wrap used? */\r\n#define GDMA_IS_WRAP_BURST(burstsize) (((uint8_t)(burstsize)&0x04U) != 0U)\r\n/* Get real width from enum gdma_transfer_width_t. */\r\n#define GDMA_REAL_XFER_WIDTH(width) (s_gdmaRealWidth[(uint8_t)(width)&0x03U])\r\n/* Get real burst size from gdma_burst_size_t. */\r\n#define GDMA_REAL_XFER_BUSTSIZE(burstsize) (s_gdmaRealBurstSize[(uint8_t)(burstsize)&0x03U])\r\n\r\n/*******************************************************************************\r\n * Prototypes\r\n ******************************************************************************/\r\n/* Typedef for interrupt handler. */\r\ntypedef void (*gdma_isr_t)(GDMA_Type *base);\r\n\r\n/*!\r\n * @brief Verify the configuration.\r\n *\r\n * Verify the configuration, to make sure the parameters are valid.\r\n *\r\n * @param config Pointer to the transfer configuration.\r\n * @return Return true if the configuration is valid, otherwise return false.\r\n */\r\nstatic bool GDMA_VerifyTransferConfig(const gdma_channel_xfer_config_t *config);\r\n\r\n/*******************************************************************************\r\n * Variables\r\n ******************************************************************************/\r\n\r\n/* @brief Pointers to transfer handle for each GDMA channel. */\r\nstatic gdma_handle_t *s_gdmaHandles[FSL_FEATURE_GDMA_CHANNEL_NUM];\r\n\r\nstatic const uint8_t s_gdmaRealBurstSize[] = {1U, 4U, 8U, 16U};\r\nstatic const uint8_t s_gdmaRealWidth[]     = {1U, 1U, 2U, 4U};\r\n\r\n/* ISR for transactional APIs. */\r\n#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)\r\nstatic gdma_isr_t s_gdmaIsr = (gdma_isr_t)DefaultISR;\r\n#else\r\nstatic gdma_isr_t s_gdmaIsr;\r\n#endif\r\n\r\n/*******************************************************************************\r\n * Code\r\n ******************************************************************************/\r\n\r\n/*\r\n * brief Verify the configuration.\r\n *\r\n * Verify the configuration, to make sure the parameters are valid.\r\n *\r\n * param config Pointer to the transfer configuration.\r\n * return Return true if the configuration is valid, otherwise return false.\r\n */\r\nstatic bool GDMA_VerifyTransferConfig(const gdma_channel_xfer_config_t *config)\r\n{\r\n    bool ret              = false;\r\n    uint8_t srcWidth      = GDMA_REAL_XFER_WIDTH(config->srcWidth);\r\n    uint8_t destWidth     = GDMA_REAL_XFER_WIDTH(config->destWidth);\r\n    uint8_t srcBurstSize  = GDMA_REAL_XFER_BUSTSIZE(config->srcBurstSize);\r\n    uint8_t destBurstSize = GDMA_REAL_XFER_BUSTSIZE(config->destBurstSize);\r\n    uint8_t srcAddrAlignSize;\r\n    uint8_t destAddrAlignSize;\r\n\r\n    do\r\n    {\r\n        /*  SRCBSIZE * SRCWIDTH == DESTBSIZE * DESTWIDTH */\r\n        if ((srcWidth * srcBurstSize) != (destWidth * destBurstSize))\r\n        {\r\n            break;\r\n        }\r\n\r\n        /*\r\n         * Address alignment:\r\n         *\r\n         * From GDMA's view, the address only need to be aligned with the WIDTH (no matter wrap used or not).\r\n         * When integrating with AHB and wrap is used, the address should be aligned to WIDTH * BURST_SIZE.\r\n         */\r\n        srcAddrAlignSize  = (GDMA_IS_WRAP_BURST(config->srcBurstSize)) ? (srcWidth * srcBurstSize) : srcWidth;\r\n        destAddrAlignSize = (GDMA_IS_WRAP_BURST(config->destBurstSize)) ? (destWidth * destBurstSize) : destWidth;\r\n\r\n        if (!((GDMA_IS_ADDR_ALIGNED(config->srcAddr, srcAddrAlignSize)) &&\r\n              (GDMA_IS_ADDR_ALIGNED(config->destAddr, destAddrAlignSize))))\r\n        {\r\n            break;\r\n        }\r\n\r\n        ret = true;\r\n\r\n    } while (false);\r\n\r\n    return ret;\r\n}\r\n\r\n/*\r\n * brief Initializes GDMA peripheral.\r\n *\r\n * This function enable the GDMA clock, set descriptor table and\r\n * enable GDMA peripheral.\r\n *\r\n * param base GDMA peripheral base address.\r\n */\r\nvoid GDMA_Init(GDMA_Type *base)\r\n{\r\n#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)\r\n    CLOCK_EnableClock(kCLOCK_Gdma);\r\n#endif\r\n}\r\n\r\n/*\r\n * brief Deinitializes GDMA peripheral.\r\n *\r\n * This function gates the GDMA clock.\r\n *\r\n * param base GDMA peripheral base address.\r\n */\r\nvoid GDMA_Deinit(GDMA_Type *base)\r\n{\r\n#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)\r\n    CLOCK_DisableClock(kCLOCK_Gdma);\r\n#endif\r\n}\r\n\r\n/*\r\n * brief Set channel transfer configuration..\r\n *\r\n * This function configures the channel transfer, after configured, GDMA_StartChannel\r\n * could be called to start the transfer.\r\n *\r\n * This function must be called when previous transfer finished. Application can use\r\n * GDMA_IsChannelBusy to check whether the channel has finished the previous work.\r\n *\r\n * param base GDMA base address.\r\n * param channel GDMA channel number.\r\n * config Pointer to the transfer configuration.\r\n * retval kStatus_Fail GDMA is busy with previous transfer.\r\n * retval kStatus_Success Configuration set successfully.\r\n * retval kStatus_InvalidArgument Configuration wrong.\r\n */\r\nstatus_t GDMA_SetChannelTransferConfig(GDMA_Type *base, uint8_t channel, const gdma_channel_xfer_config_t *config)\r\n{\r\n    assert(NULL != config);\r\n\r\n    if (!GDMA_VerifyTransferConfig(config))\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n\r\n    if (GDMA_IsChannelBusy(base, channel))\r\n    {\r\n        return kStatus_Fail;\r\n    }\r\n\r\n    GDMA_ClearChannelInterruptFlags(base, channel, (uint32_t)kGDMA_AllInterruptFlag);\r\n\r\n    base->CH[channel].SADR = config->srcAddr;\r\n    base->CH[channel].DADR = config->destAddr;\r\n\r\n    base->CH[channel].CTRL =\r\n        GDMA_CTRL_PROT(config->ahbProt)                            /* Protection info for AHB master bus */\r\n        | (config->srcAddrInc ? GDMA_CTRL_SRCADDRINC_MASK : 0UL)   /* Source address increment. */\r\n        | (config->destAddrInc ? GDMA_CTRL_DESTADDRINC_MASK : 0UL) /* Destination address increment. */\r\n        | GDMA_CTRL_SRCWIDTH(config->srcWidth)                     /* Source peripheral/memory transfer width. */\r\n        | GDMA_CTRL_DESTWIDTH(config->destWidth)                   /* Destination peripheral/memory transfer width. */\r\n        | GDMA_CTRL_SRCBSIZE(config->srcBurstSize)                 /* Source peripheral/memory transfer burst size */\r\n        | GDMA_CTRL_DESTBSIZE(config->destBurstSize) /* Destination peripheral/memory transfer burst size */\r\n        | GDMA_CTRL_LEN(config->transferLen);        /* Length of the transfer in bytes */\r\n\r\n    if (config->enableLinkList)\r\n    {\r\n        base->CH[channel].LLI =\r\n            (config->linkListAddr & GDMA_LLI_LLI_MASK)                        /* LLI address. */\r\n            | (config->enableDescInterrupt ? GDMA_LLI_DESC_INT_EN_MASK : 0UL) /* Enable descriptor interrupt. */\r\n            | (config->stopAfterDescFinished ? GDMA_LLI_STOP_MASK : 0UL);     /* Stop after descriptor finished. */\r\n        base->CH[channel].CONFIG |= GDMA_CONFIG_LLE_MASK;\r\n    }\r\n    else\r\n    {\r\n        base->CH[channel].LLI = GDMA_LLI_STOP_MASK;\r\n        base->CH[channel].CONFIG &= ~GDMA_CONFIG_LLE_MASK;\r\n    }\r\n\r\n    return kStatus_Success;\r\n}\r\n\r\n/*\r\n * brief Creates the GDMA handle.\r\n *\r\n * This function is called if using transaction API for GDMA. This function\r\n * initializes the internal state of GDMA handle.\r\n *\r\n * param handle GDMA handle pointer. It stores callback function and parameters.\r\n * param base GDMA peripheral base address.\r\n * param channel GDMA channel number.\r\n */\r\nvoid GDMA_CreateHandle(gdma_handle_t *handle, GDMA_Type *base, uint8_t channel)\r\n{\r\n    assert(NULL != handle);\r\n\r\n    (void)memset(handle, 0, sizeof(*handle));\r\n\r\n    handle->gdma    = base;\r\n    handle->channel = channel;\r\n\r\n    s_gdmaHandles[channel] = handle;\r\n    s_gdmaIsr              = GDMA_IRQHandle;\r\n\r\n    (void)EnableIRQ(GDMA_IRQn);\r\n}\r\n\r\n/*\r\n * brief Installs a callback function for the GDMA transfer.\r\n *\r\n * This callback is called in GDMA IRQ handler to inform user the interrupt status.\r\n *\r\n * param handle GDMA handle pointer.\r\n * param callback GDMA callback function pointer.\r\n * param userData Parameter for callback function.\r\n */\r\nvoid GDMA_SetCallback(gdma_handle_t *handle, gdma_callback_t callback, void *userData)\r\n{\r\n    assert(handle != NULL);\r\n\r\n    handle->callback = callback;\r\n    handle->userData = userData;\r\n}\r\n\r\n/*\r\n * brief Submits the GDMA channel transfer request.\r\n *\r\n * After this function, user could call GDMA_StartTransfer to start GDMA transfer.\r\n *\r\n * This function must be called when previous transfer finished. Application can use\r\n * GDMA_IsChannelBusy to check whether the channel has finished the previous work.\r\n *\r\n * param handle GDMA handle pointer.\r\n * param config Pointer to GDMA transfer configuration structure.\r\n * retval kStatus_Fail GDMA is busy with previous transfer.\r\n * retval kStatus_Success Configuration set successfully.\r\n * retval kStatus_InvalidArgument Configuration wrong.\r\n */\r\nstatus_t GDMA_SubmitTransfer(gdma_handle_t *handle, gdma_channel_xfer_config_t *config)\r\n{\r\n    status_t status;\r\n\r\n    assert(NULL != handle);\r\n\r\n    status = GDMA_SetChannelTransferConfig(handle->gdma, handle->channel, config);\r\n\r\n    if (status == kStatus_Success)\r\n    {\r\n        GDMA_EnableChannelInterrupts(\r\n            handle->gdma, handle->channel,\r\n            (uint32_t)kGDMA_DescriptorTransferDoneInterruptEnable | (uint32_t)kGDMA_AddressErrorInterruptEnable |\r\n                (uint32_t)kGDMA_BusErrorInterruptEnable | (uint32_t)kGDMA_TransferDoneInterruptEnable);\r\n    }\r\n\r\n    return status;\r\n}\r\n\r\n/*\r\n * brief GDMA start transfer.\r\n *\r\n * User can call this function after GDMA_SubmitTransfer.\r\n *\r\n * param handle GDMA handle pointer.\r\n */\r\nvoid GDMA_StartTransfer(gdma_handle_t *handle)\r\n{\r\n    assert(NULL != handle);\r\n\r\n    GDMA_StartChannel(handle->gdma, handle->channel);\r\n}\r\n\r\n/*\r\n * brief Abort running transfer by handle.\r\n *\r\n * This function aborts GDMA transfer specified by handle.\r\n *\r\n * param handle GDMA handle pointer.\r\n */\r\nvoid GDMA_AbortTransfer(gdma_handle_t *handle)\r\n{\r\n    assert(NULL != handle);\r\n\r\n    GDMA_StopChannel(handle->gdma, handle->channel);\r\n\r\n    GDMA_DisableChannelInterrupts(handle->gdma, handle->channel, (uint32_t)kGDMA_AllInterruptEnable);\r\n}\r\n\r\n/*\r\n * brief GDMA IRQ handler.\r\n *\r\n * This function checks all GDMA channel interrupts and inform application\r\n * the interrupt flags through user registered callback.\r\n *\r\n * param base GDMA peripheral.\r\n */\r\nvoid GDMA_IRQHandle(GDMA_Type *base)\r\n{\r\n    uint8_t channel;\r\n    uint32_t interrupts;\r\n    gdma_handle_t *handle;\r\n\r\n    for (channel = 0U; channel < (uint8_t)FSL_FEATURE_GDMA_CHANNEL_NUM; channel++)\r\n    {\r\n        interrupts = GDMA_GetChannelInterruptFlags(base, channel);\r\n\r\n        /*\r\n         * If channels unmasked interrupt happened. This flag is only assert\r\n         * only when any unmasked interrupt happened.\r\n         */\r\n        if (0U != (interrupts & (uint32_t)kGDMA_ChannelInterruptFlag))\r\n        {\r\n            GDMA_ClearChannelInterruptFlags(base, channel, interrupts);\r\n\r\n            handle = s_gdmaHandles[channel];\r\n\r\n            if (NULL != handle)\r\n            {\r\n                /* If error happened or transfer finished successfully. */\r\n                if (0U != (interrupts & ((uint32_t)kGDMA_AddressErrorFlag | (uint32_t)kGDMA_BusErrorFlag |\r\n                                         (uint32_t)kGDMA_TransferDoneFlag)))\r\n                {\r\n                    GDMA_DisableChannelInterrupts(base, channel, (uint32_t)kGDMA_AllInterruptEnable);\r\n                }\r\n\r\n                if (NULL != handle->callback)\r\n                {\r\n                    handle->callback(handle, handle->userData, interrupts);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                /*\r\n                 * If interrupt occurs but handle not created, then disable the interrupts,\r\n                 * because to use the transactional APIs, user must create handle, then\r\n                 * setup configuration and enable interrupts for data transfer.\r\n                 *\r\n                 * Generally will not reach here.\r\n                 */\r\n                GDMA_DisableChannelInterrupts(base, channel, (uint32_t)kGDMA_AllInterruptEnable);\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nvoid GDMA_DriverIRQHandler(void);\r\nvoid GDMA_DriverIRQHandler(void)\r\n{\r\n    s_gdmaIsr(GDMA);\r\n    SDK_ISR_EXIT_BARRIER;\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_gdma.h",
    "content": "/*\r\n * Copyright 2021-2023 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef FSL_GDMA_H_\r\n#define FSL_GDMA_H_\r\n\r\n#include \"fsl_common.h\"\r\n\r\n/*!\r\n * @addtogroup gdma\r\n * @{\r\n */\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*! @name Driver version */\r\n/*! @{ */\r\n#define FSL_GDMA_DRIVER_VERSION (MAKE_VERSION(2, 0, 3))\r\n/*! @} */\r\n\r\n/*!\r\n * @brief Macro for GDMA link list descriptor LLI.\r\n *\r\n * This macro constructs @ref gdma_descriptor_t::lli.\r\n *\r\n * @param linkListAddr Address of next link list descriptor item.\r\n * @param stopAfterDescFinished Stop or not after this descriptor transfer done.\r\n * @param enableDescInterrupt Generate interrupt after this descriptor transfer done.\r\n */\r\n#define GDMA_DESC_LLI(linkListAddr, stopAfterDescFinished, enableDescInterrupt)                                 \\\r\n    (((uint32_t)(linkListAddr)&GDMA_LLI_LLI_MASK) | ((enableDescInterrupt) ? GDMA_LLI_DESC_INT_EN_MASK : 0UL) | \\\r\n     ((stopAfterDescFinished) ? GDMA_LLI_STOP_MASK : 0UL))\r\n/*\r\n * @brief Macro for GDMA link list descriptor CTRL.\r\n *\r\n * This macro constructs @ref gdma_descriptor_t::ctrl.\r\n *\r\n * @param ahbProt GDMA AHB HPROT flags, it could be OR'ed value of @ref _gdma_ahb_prot.\r\n * @param srcAddrInc Increase source address on each successive access, use true or false.\r\n * @param destAddrInc Increase destination address on each successive access, use true or false.\r\n * @param srcWidth  Source transfer width, see @ref gdma_transfer_width_t.\r\n * @param destWidth Destination transfer width, see @ref gdma_transfer_width_t.\r\n * @param srcBurstSize  Source address burst size, see @ref gdma_burst_size_t.\r\n * @param destBurstSize Destination address burst size, see @ref gdma_burst_size_t.\r\n * @param len Transfer length in bytes, max value is 8 * 1024 - 1.\r\n */\r\n#define GDMA_DESC_CTRL(ahbProt, srcAddrInc, destAddrInc, srcWidth, destWidth, srcBurstSize, destBurstSize, length) \\\r\n    (GDMA_CTRL_PROT(ahbProt) | ((srcAddrInc) ? GDMA_CTRL_SRCADDRINC_MASK : 0UL) |                                  \\\r\n     ((destAddrInc) ? GDMA_CTRL_DESTADDRINC_MASK : 0UL) | GDMA_CTRL_SRCWIDTH(srcWidth) |                           \\\r\n     GDMA_CTRL_DESTWIDTH(destWidth) | GDMA_CTRL_SRCBSIZE(srcBurstSize) | GDMA_CTRL_DESTBSIZE(destBurstSize) |      \\\r\n     GDMA_CTRL_LEN(length))\r\n\r\n/*! @brief GDMA transfer width */\r\ntypedef enum _gdma_transfer_width\r\n{\r\n    kGDMA_TransferWidth1Byte = 1U, /*!< 1 byte.  */\r\n    kGDMA_TransferWidth2Byte = 2U, /*!< 2 bytes. */\r\n    kGDMA_TransferWidth4Byte = 3U, /*!< 4 bytes. */\r\n} gdma_transfer_width_t;\r\n\r\n/*! @brief GDMA burst size*/\r\ntypedef enum _gdma_burst_size\r\n{\r\n    kGDMA_BurstSize1      = 0U, /*!< Burst 1.  */\r\n    kGDMA_BurstSize4      = 1U, /*!< Burst 4.  */\r\n    kGDMA_BurstSize8      = 2U, /*!< Burst 8.  */\r\n    kGDMA_BurstSize16     = 3U, /*!< Burst 16. */\r\n    kGDMA_BurstSizeWrap4  = 5U, /*!< Wrap 4.   */\r\n    kGDMA_BurstSizeWrap8  = 6U, /*!< Wrap 8.   */\r\n    kGDMA_BurstSizeWrap16 = 7U, /*!< Wrap 16.  */\r\n} gdma_burst_size_t;\r\n\r\n/*!\r\n * @brief GDMA AHB HPROT flags.\r\n * @anchor _gdma_ahb_prot\r\n */\r\nenum _gdma_ahb_prot\r\n{\r\n    kGDMA_ProtUserMode       = (0U << 0U), /*!< The access is in user mode. */\r\n    kGDMA_ProtPrevilegedMode = (1U << 0U), /*!< The access is in previleged mode. */\r\n    kGDMA_ProtUnbufferable   = (0U << 1U), /*!< The access is not bufferable. */\r\n    kGDMA_ProtBufferable     = (1U << 1U), /*!< The access is bufferable. */\r\n    kGDMA_ProtUncacheable    = (0U << 2U), /*!< The access is not cacheable. */\r\n    kGDMA_ProtCacheable      = (1U << 2U), /*!< The access is cacheable. */\r\n};\r\n\r\n/*! @brief GDMA channel link list descriptor structure */\r\ntypedef struct __ALIGNED(16) _gdma_descriptor\r\n{\r\n    uint32_t srcAddr; /*!< Source address. */\r\n    uint32_t dstAddr; /*!< Destination address. */\r\n    uint32_t lli;     /*!< Link list item. */\r\n    uint32_t ctrl;    /*!< Transfer control. */\r\n} gdma_descriptor_t;\r\n\r\n/*! @brief GDMA channel priority */\r\ntypedef enum _gdma_priority\r\n{\r\n    kGDMA_ChannelPriority0 = 0, /*!< Lowest channel priority - priority 0   */\r\n    kGDMA_ChannelPriority1,     /*!< Channel priority 1                     */\r\n    kGDMA_ChannelPriority2,     /*!< Channel priority 2                     */\r\n    kGDMA_ChannelPriority3,     /*!< Channel priority 3                     */\r\n    kGDMA_ChannelPriority4,     /*!< Channel priority 4                     */\r\n    kGDMA_ChannelPriority5,     /*!< Channel priority 5                     */\r\n    kGDMA_ChannelPriority6,     /*!< Channel priority 6                     */\r\n    kGDMA_ChannelPriority7,     /*!< Channel priority 7                     */\r\n    kGDMA_ChannelPriority8,     /*!< Channel priority 8                     */\r\n    kGDMA_ChannelPriority9,     /*!< Channel priority 9                     */\r\n    kGDMA_ChannelPriority10,    /*!< Channel priority 10                    */\r\n    kGDMA_ChannelPriority11,    /*!< Channel priority 11                    */\r\n    kGDMA_ChannelPriority12,    /*!< Channel priority 12                    */\r\n    kGDMA_ChannelPriority13,    /*!< Channel priority 13                    */\r\n    kGDMA_ChannelPriority14,    /*!< Channel priority 14                    */\r\n    kGDMA_ChannelPriority15,    /*!< Highest channel priority - priority 15 */\r\n} gdma_priority_t;\r\n\r\n/*!\r\n * @brief GDMA interrupts to enable\r\n * @anchor _gdma_interrupt_enable\r\n */\r\nenum _gdma_interrupt_enable\r\n{\r\n    /*!\r\n     * Descriptor transfer done interrupt. This happens when the descriptor\r\n     * is configured to generate interrupt when transfer done.\r\n     */\r\n    kGDMA_DescriptorTransferDoneInterruptEnable = GDMA_CHNL_INT_MASK_DESC_TFRINT_MASK,\r\n\r\n    /*! Channel source or destination address is not aligned to corresponding transfer width. */\r\n    kGDMA_AddressErrorInterruptEnable = GDMA_CHNL_INT_MASK_ADDRERRINT_MASK,\r\n\r\n    /*! AHB bus interrupt. */\r\n    kGDMA_BusErrorInterruptEnable = GDMA_CHNL_INT_MASK_BUSERRINT_MASK,\r\n\r\n    /*! DMA transfer done interrupt. */\r\n    kGDMA_TransferDoneInterruptEnable = GDMA_CHNL_INT_MASK_TFRINT_MASK,\r\n\r\n    /*! DMA block single/burst transfer done interrupt. */\r\n    kGDMA_BlockTransferDoneInterruptEnable = GDMA_CHNL_INT_MASK_BLOCKINT_MASK,\r\n\r\n    /*! All interrupt enable. */\r\n    kGDMA_AllInterruptEnable = kGDMA_DescriptorTransferDoneInterruptEnable | kGDMA_AddressErrorInterruptEnable |\r\n                               kGDMA_BusErrorInterruptEnable | kGDMA_TransferDoneInterruptEnable |\r\n                               kGDMA_BlockTransferDoneInterruptEnable,\r\n};\r\n\r\n/*!\r\n * @brief GDMA interrupt status flags.\r\n * @anchor _gdma_interrupt_flags\r\n */\r\nenum _gdma_interrupt_flags\r\n{\r\n    /*!\r\n     * Descriptor transfer done interrupt. This happens when the descriptor\r\n     * is configured to generate interrupt when transfer done.\r\n     */\r\n    kGDMA_DescriptorTransferDoneFlag = GDMA_CHNL_INT_DESC_STATUS_TFRINT_MASK,\r\n\r\n    /*! OR of the content of the respective unmasked interrupt of channel. */\r\n    kGDMA_ChannelInterruptFlag = GDMA_CHNL_INT_STATUS_CHLINT_MASK,\r\n\r\n    /*! Channel source or destination address is not aligned to corresponding transfer width. */\r\n    kGDMA_AddressErrorFlag = GDMA_CHNL_INT_STATUS_ADDRERRINT_MASK,\r\n\r\n    /*! AHB bus interrupt. */\r\n    kGDMA_BusErrorFlag = GDMA_CHNL_INT_STATUS_BUSERRINT_MASK,\r\n\r\n    /*! DMA transfer done interrupt. */\r\n    kGDMA_TransferDoneFlag = GDMA_CHNL_INT_STATUS_TFRINT_MASK,\r\n\r\n    /*! DMA block single/burst transfer done interrupt. */\r\n    kGDMA_BlockTransferDoneFlag = GDMA_CHNL_INT_STATUS_BLOCKINT_MASK,\r\n\r\n    /*! All interrupt flags. */\r\n    kGDMA_AllInterruptFlag = kGDMA_DescriptorTransferDoneFlag | kGDMA_ChannelInterruptFlag | kGDMA_AddressErrorFlag |\r\n                             kGDMA_BusErrorFlag | kGDMA_TransferDoneFlag | kGDMA_BlockTransferDoneFlag,\r\n};\r\n\r\n/*!\r\n * @brief GDMA channel transfer configuration.\r\n *\r\n * @note The transfer configuration must follow the requirements:\r\n *   - SRCBSIZE * SRCWIDTH == DESTBSIZE * DESTWIDTH\r\n *   - If wrap not used, the address should align with WIDTH\r\n *   - If wrap used, the address should align with WIDTH * BURST_SIZE.\r\n */\r\ntypedef struct _gdma_channel_xfer_config\r\n{\r\n    uint32_t srcAddr;                /*!< Source data address */\r\n    uint32_t destAddr;               /*!< Destination data address */\r\n    uint8_t ahbProt;                 /*!< GDMA AHB HPROT flags, it could be OR'ed value of @ref _gdma_ahb_prot. */\r\n    gdma_burst_size_t srcBurstSize;  /*!< Source address burst size. */\r\n    gdma_burst_size_t destBurstSize; /*!< Destination address burst size. */\r\n    gdma_transfer_width_t srcWidth;  /*!< Source transfer width. */\r\n    gdma_transfer_width_t destWidth; /*!< Destination transfer width. */\r\n    bool srcAddrInc;                 /*!< Increase source address on each successive access. */\r\n    bool destAddrInc;                /*!< Increase destination address on each successive access. */\r\n    uint16_t transferLen; /*!< Transfer length in bytes, max value is 8 * 1024 - 1, should align with transfer size. */\r\n    bool enableLinkList;  /*!< Enable link list or not. */\r\n\r\n    /*! Generate interrupt when descriptor transfer finished, only used when @ref enableLinkList is true. */\r\n    bool enableDescInterrupt;\r\n\r\n    /*! Stop channel when descriptor transfer finished, only used when @ref enableLinkList is true. */\r\n    bool stopAfterDescFinished;\r\n\r\n    uint32_t linkListAddr; /*!< Link list address, only used when @ref enableLinkList is true. */\r\n} gdma_channel_xfer_config_t;\r\n\r\n/*! @brief Driver handle for GDMA */\r\nstruct _gdma_handle;\r\n\r\n/*! @brief Define Callback function for GDMA.\r\n *\r\n * handle: Pointer to the GDMA driver handle.\r\n * userData: The userData registered using @ref GDMA_SetCallback.\r\n * interrupts: The interrupts flags of the specific channel.\r\n */\r\ntypedef void (*gdma_callback_t)(struct _gdma_handle *handle, void *userData, uint32_t interrupts);\r\n\r\n/*! @brief GDMA transfer handle structure */\r\ntypedef struct _gdma_handle\r\n{\r\n    GDMA_Type *gdma;          /*!< GDMA peripheral base address */\r\n    uint8_t channel;          /*!< GDMA channel number */\r\n    gdma_callback_t callback; /*!< Callback function. Invoked interrupt happens. */\r\n    void *userData;           /*!< Callback function parameter */\r\n} gdma_handle_t;\r\n\r\n/*******************************************************************************\r\n * APIs\r\n ******************************************************************************/\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif /* __cplusplus */\r\n\r\n/*!\r\n * @name GDMA initialization and De-initialization\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief Initializes GDMA peripheral.\r\n *\r\n * It ungates the GDMA access clock, after this function, the GDMA module is\r\n * ready to be used.\r\n *\r\n * @param base GDMA peripheral base address.\r\n */\r\nvoid GDMA_Init(GDMA_Type *base);\r\n\r\n/*!\r\n * @brief Deinitializes GDMA peripheral.\r\n *\r\n * @param base GDMA peripheral base address.\r\n */\r\nvoid GDMA_Deinit(GDMA_Type *base);\r\n\r\n/*! @} */\r\n\r\n/*!\r\n * @name GDMA Channel Operation\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief Set GDMA channel source address.\r\n *\r\n * @param base GDMA peripheral base address.\r\n * @param channel GDMA channel number.\r\n * @param addr Source address.\r\n */\r\nstatic inline void GDMA_SetChannelSourceAddress(GDMA_Type *base, uint8_t channel, uint32_t addr)\r\n{\r\n    base->CH[channel].SADR = addr;\r\n}\r\n\r\n/*!\r\n * @brief Set GDMA channel destination address.\r\n *\r\n * @param base GDMA peripheral base address.\r\n * @param channel GDMA channel number.\r\n * @param addr Destination address.\r\n */\r\nstatic inline void GDMA_SetChannelDestAddress(GDMA_Type *base, uint8_t channel, uint32_t addr)\r\n{\r\n    base->CH[channel].DADR = addr;\r\n}\r\n\r\n/*!\r\n * @brief Start GDMA channel to work.\r\n *\r\n * @param base GDMA peripheral base address.\r\n * @param channel GDMA channel number.\r\n */\r\nstatic inline void GDMA_StartChannel(GDMA_Type *base, uint8_t channel)\r\n{\r\n    base->CH[channel].CHL_EN |= GDMA_CHL_EN_CHL_EN_MASK;\r\n}\r\n\r\n/*!\r\n * @brief Stop GDMA channel.\r\n *\r\n * @param base GDMA peripheral base address.\r\n * @param channel GDMA channel number.\r\n */\r\nstatic inline void GDMA_StopChannel(GDMA_Type *base, uint8_t channel)\r\n{\r\n    base->CH[channel].CHL_STOP = GDMA_CHL_STOP_CHL_STOP_MASK;\r\n}\r\n\r\n/*!\r\n * @brief Return whether GDMA channel is processing transfer\r\n *\r\n * When @ref GDMA_StopChannel is called, if the channel is on service,\r\n * it does not stop immediately, application could call this API to check\r\n * whether the channel is stopped.\r\n *\r\n * @param base GDMA peripheral base address.\r\n * @param channel GDMA channel number.\r\n * @return True if the channel is busy, false if not.\r\n */\r\nstatic inline bool GDMA_IsChannelBusy(GDMA_Type *base, uint8_t channel)\r\n{\r\n    return ((base->CH[channel].CHL_EN & GDMA_CHL_EN_CHL_EN_MASK) != 0UL);\r\n}\r\n\r\n/*!\r\n * @brief Enables the interrupt for the GDMA transfer.\r\n *\r\n * @param base GDMA peripheral base address.\r\n * @param channel GDMA channel number.\r\n * @param interrupts The interrupts to enable, it is OR'ed value of @ref _gdma_interrupt_enable.\r\n */\r\nstatic inline void GDMA_EnableChannelInterrupts(GDMA_Type *base, uint8_t channel, uint32_t interrupts)\r\n{\r\n    base->CH[channel].CHNL_INT |= interrupts;\r\n}\r\n\r\n/*!\r\n * @brief Disables the interrupt for the GDMA transfer.\r\n *\r\n * @param base GDMA peripheral base address.\r\n * @param channel GDMA channel number.\r\n * @param interrupts The interrupts to disable, it is OR'ed value of @ref _gdma_interrupt_enable.\r\n */\r\nstatic inline void GDMA_DisableChannelInterrupts(GDMA_Type *base, uint8_t channel, uint32_t interrupts)\r\n{\r\n    base->CH[channel].CHNL_INT &= ~interrupts;\r\n}\r\n\r\n/*!\r\n * @brief Get the GDMA channel interrupt flags.\r\n *\r\n * @param base GDMA peripheral base address.\r\n * @param channel GDMA channel number.\r\n * @return The interrupt flags, it is OR'ed value of @ref _gdma_interrupt_flags.\r\n */\r\nstatic inline uint32_t GDMA_GetChannelInterruptFlags(GDMA_Type *base, uint8_t channel)\r\n{\r\n    return base->CH[channel].CHNL_INT & (uint32_t)kGDMA_AllInterruptFlag;\r\n}\r\n\r\n/*!\r\n * @brief Clear the GDMA channel interrupt flags.\r\n *\r\n * The @ref kGDMA_ChannelInterruptFlag is OR'ed status of all other unmasked interrupt flags,\r\n * it could not be clear directly, it should be cleared by clear all other flags.\r\n *\r\n * @param base GDMA peripheral base address.\r\n * @param channel GDMA channel number.\r\n * @param flags The interrupt flags to clear, it is OR'ed value of @ref _gdma_interrupt_flags.\r\n */\r\nstatic inline void GDMA_ClearChannelInterruptFlags(GDMA_Type *base, uint8_t channel, uint32_t flags)\r\n{\r\n    base->CH[channel].CHNL_INT = (base->CH[channel].CHNL_INT & ~(uint32_t)kGDMA_AllInterruptFlag) | flags;\r\n}\r\n\r\n/*!\r\n * @brief Get the number of finished descriptor.\r\n *\r\n * The counter increases when an item of descriptor is done in linklist mode.\r\n *\r\n * @param base GDMA peripheral base address.\r\n * @param channel GDMA channel number.\r\n * @return Number of finished descriptor.\r\n */\r\nstatic inline uint32_t GDMA_GetChannelFinishedDescriptorNumber(GDMA_Type *base, uint8_t channel)\r\n{\r\n    return base->CH[channel].NUM_OF_DESCRIPTOR;\r\n}\r\n\r\n/*!\r\n * @brief Clear the number of finished descriptor.\r\n *\r\n * @param base GDMA peripheral base address.\r\n * @param channel GDMA channel number.\r\n */\r\nstatic inline void GDMA_ClearChannelFinishedDescriptorNumber(GDMA_Type *base, uint8_t channel)\r\n{\r\n    base->CH[channel].NUM_OF_DESCRIPTOR = 0UL;\r\n}\r\n\r\n/*!\r\n * @brief Set priority of channel.\r\n *\r\n * @param base GDMA peripheral base address.\r\n * @param channel GDMA channel number.\r\n * @param priority Channel priority value.\r\n */\r\nstatic inline void GDMA_SetChannelPriority(GDMA_Type *base, uint8_t channel, gdma_priority_t priority)\r\n{\r\n    base->CH[channel].CHL_EN =\r\n        (base->CH[channel].CHL_EN & ~(GDMA_CHL_EN_CHL_PRIORITY_WEIGHT_MASK | GDMA_CHL_EN_CHL_EN_MASK)) |\r\n        (uint32_t)priority;\r\n}\r\n\r\n/*!\r\n * @brief Set channel transfer configuration..\r\n *\r\n * This function configures the channel transfer, after configured, @ref GDMA_StartChannel\r\n * could be called to start the transfer.\r\n *\r\n * This function must be called when previous transfer finished. Application can use\r\n * @ref GDMA_IsChannelBusy to check whether the channel has finished the previous work.\r\n *\r\n * @note The transfer configuration must follow the requirements:\r\n *   - SRCBSIZE * SRCWIDTH == DESTBSIZE * DESTWIDTH\r\n *   - If wrap not used, the address should align with WIDTH\r\n *   - If wrap used, the address should align with WIDTH * BURST_SIZE.\r\n *\r\n * @param base GDMA base address.\r\n * @param channel GDMA channel number.\r\n * @config Pointer to the transfer configuration.\r\n * @retval kStatus_Fail GDMA is busy with previous transfer.\r\n * @retval kStatus_Success Configuration set successfully.\r\n * @retval kStatus_InvalidArgument Configuration wrong.\r\n */\r\nstatus_t GDMA_SetChannelTransferConfig(GDMA_Type *base, uint8_t channel, const gdma_channel_xfer_config_t *config);\r\n\r\n/*! @} */\r\n\r\n/*!\r\n * @name GDMA Transactional Operation\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief Creates the GDMA handle.\r\n *\r\n * This function is called if using transaction API for GDMA. This function\r\n * initializes the internal state of GDMA handle.\r\n *\r\n * @param handle GDMA handle pointer. It stores callback function and parameters.\r\n * @param base GDMA peripheral base address.\r\n * @param channel GDMA channel number.\r\n */\r\nvoid GDMA_CreateHandle(gdma_handle_t *handle, GDMA_Type *base, uint8_t channel);\r\n\r\n/*!\r\n * @brief Installs a callback function for the GDMA transfer.\r\n *\r\n * This callback is called in GDMA IRQ handler to inform user the interrupt status.\r\n *\r\n * @param handle GDMA handle pointer.\r\n * @param callback GDMA callback function pointer.\r\n * @param userData Parameter for callback function.\r\n */\r\nvoid GDMA_SetCallback(gdma_handle_t *handle, gdma_callback_t callback, void *userData);\r\n\r\n/*!\r\n * @brief Submits the GDMA channel transfer request.\r\n *\r\n * After this function, user could call @ref GDMA_StartTransfer to start GDMA transfer.\r\n *\r\n * This function must be called when previous transfer finished. Application can use\r\n * @ref GDMA_IsChannelBusy to check whether the channel has finished the previous work.\r\n *\r\n * @note The transfer configuration must follow the requirements:\r\n *   - SRCBSIZE * SRCWIDTH == DESTBSIZE * DESTWIDTH\r\n *   - If wrap not used, the address should align with WIDTH\r\n *   - If wrap used, the address should align with WIDTH * BURST_SIZE.\r\n *\r\n * @param handle GDMA handle pointer.\r\n * @param config Pointer to GDMA transfer configuration structure.\r\n * @retval kStatus_Fail GDMA is busy with previous transfer.\r\n * @retval kStatus_Success Configuration set successfully.\r\n * @retval kStatus_InvalidArgument Configuration wrong.\r\n */\r\nstatus_t GDMA_SubmitTransfer(gdma_handle_t *handle, gdma_channel_xfer_config_t *config);\r\n\r\n/*!\r\n * @brief GDMA start transfer.\r\n *\r\n * User can call this function after @ref GDMA_SubmitTransfer.\r\n *\r\n * @param handle GDMA handle pointer.\r\n */\r\nvoid GDMA_StartTransfer(gdma_handle_t *handle);\r\n\r\n/*!\r\n * @brief Abort running transfer by handle.\r\n *\r\n * When this function is called, if the channel is on service, it only\r\n * stops when service finished.\r\n *\r\n * @param handle GDMA handle pointer.\r\n */\r\nvoid GDMA_AbortTransfer(gdma_handle_t *handle);\r\n\r\n/*!\r\n * @brief GDMA IRQ handler.\r\n *\r\n * This function checks all GDMA channel interrupts and inform application\r\n * the interrupt flags through user registered callback.\r\n *\r\n * @param base GDMA peripheral.\r\n */\r\nvoid GDMA_IRQHandle(GDMA_Type *base);\r\n\r\n/*! @} */\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif /* __cplusplus */\r\n\r\n/*! @} */\r\n\r\n#endif /*FSL_GDMA_H_*/\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_gpio.c",
    "content": "/*\r\n * Copyright (c) 2016, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2020 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include \"fsl_gpio.h\"\r\n\r\n/* Component ID definition, used by tools. */\r\n#ifndef FSL_COMPONENT_ID\r\n#define FSL_COMPONENT_ID \"platform.drivers.lpc_gpio\"\r\n#endif\r\n\r\n/*******************************************************************************\r\n * Variables\r\n ******************************************************************************/\r\n#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)\r\n/*! @brief Array to map FGPIO instance number to clock name. */\r\nstatic const clock_ip_name_t s_gpioClockName[] = GPIO_CLOCKS;\r\n#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */\r\n\r\n#if !(defined(FSL_FEATURE_GPIO_HAS_NO_RESET) && FSL_FEATURE_GPIO_HAS_NO_RESET)\r\n/*! @brief Pointers to GPIO resets for each instance. */\r\nstatic const reset_ip_name_t s_gpioResets[] = GPIO_RSTS_N;\r\n#endif\r\n/*******************************************************************************\r\n * Prototypes\r\n ************ ******************************************************************/\r\n/*!\r\n * @brief Enable GPIO port clock.\r\n *\r\n * @param base   GPIO peripheral base pointer.\r\n * @param port   GPIO port number.\r\n */\r\nstatic void GPIO_EnablePortClock(GPIO_Type *base, uint32_t port);\r\n\r\n/*******************************************************************************\r\n * Code\r\n ******************************************************************************/\r\nstatic void GPIO_EnablePortClock(GPIO_Type *base, uint32_t port)\r\n{\r\n#if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)\r\n    assert(port < ARRAY_SIZE(s_gpioClockName));\r\n\r\n    /* Upgate the GPIO clock */\r\n    CLOCK_EnableClock(s_gpioClockName[port]);\r\n#endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */\r\n}\r\n\r\n/*!\r\n * brief Initializes the GPIO peripheral.\r\n *\r\n * This function ungates the GPIO clock.\r\n *\r\n * param base   GPIO peripheral base pointer.\r\n * param port   GPIO port number.\r\n */\r\nvoid GPIO_PortInit(GPIO_Type *base, uint32_t port)\r\n{\r\n    GPIO_EnablePortClock(base, port);\r\n\r\n#if !(defined(FSL_FEATURE_GPIO_HAS_NO_RESET) && FSL_FEATURE_GPIO_HAS_NO_RESET)\r\n    /* Reset the GPIO module */\r\n    RESET_PeripheralReset(s_gpioResets[port]);\r\n#endif\r\n}\r\n\r\n/*!\r\n * brief Initializes a GPIO pin used by the board.\r\n *\r\n * To initialize the GPIO, define a pin configuration, either input or output, in the user file.\r\n * Then, call the GPIO_PinInit() function.\r\n *\r\n * This is an example to define an input pin or output pin configuration:\r\n * code\r\n * Define a digital input pin configuration,\r\n * gpio_pin_config_t config =\r\n * {\r\n *   kGPIO_DigitalInput,\r\n *   0,\r\n * }\r\n * Define a digital output pin configuration,\r\n * gpio_pin_config_t config =\r\n * {\r\n *   kGPIO_DigitalOutput,\r\n *   0,\r\n * }\r\n * endcode\r\n *\r\n * param base   GPIO peripheral base pointer(Typically GPIO)\r\n * param port   GPIO port number\r\n * param pin    GPIO pin number\r\n * param config GPIO pin configuration pointer\r\n */\r\nvoid GPIO_PinInit(GPIO_Type *base, uint32_t port, uint32_t pin, const gpio_pin_config_t *config)\r\n{\r\n    GPIO_EnablePortClock(base, port);\r\n\r\n    if (config->pinDirection == kGPIO_DigitalInput)\r\n    {\r\n#if defined(FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR) && (FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR)\r\n        base->DIRCLR[port] = 1UL << pin;\r\n#else\r\n        base->DIR[port] &= ~(1UL << pin);\r\n#endif /*FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR*/\r\n    }\r\n    else\r\n    {\r\n        /* Set default output value */\r\n        if (config->outputLogic == 0U)\r\n        {\r\n            base->CLR[port] = (1UL << pin);\r\n        }\r\n        else\r\n        {\r\n            base->SET[port] = (1UL << pin);\r\n        }\r\n/* Set pin direction */\r\n#if defined(FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR) && (FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR)\r\n        base->DIRSET[port] = 1UL << pin;\r\n#else\r\n        base->DIR[port] |= 1UL << pin;\r\n#endif /*FSL_FEATURE_GPIO_DIRSET_AND_DIRCLR*/\r\n    }\r\n}\r\n\r\n#if defined(FSL_FEATURE_GPIO_HAS_INTERRUPT) && FSL_FEATURE_GPIO_HAS_INTERRUPT\r\n/*!\r\n * @brief Set the configuration of pin interrupt.\r\n *\r\n * @param base GPIO base pointer.\r\n * @param port GPIO port number\r\n * @param pin GPIO pin number.\r\n * @param config GPIO pin interrupt configuration..\r\n */\r\nvoid GPIO_SetPinInterruptConfig(GPIO_Type *base, uint32_t port, uint32_t pin, gpio_interrupt_config_t *config)\r\n{\r\n    base->INTEDG[port] = (base->INTEDG[port] & ~(1UL << pin)) | ((uint32_t)config->mode << pin);\r\n\r\n    base->INTPOL[port] = (base->INTPOL[port] & ~(1UL << pin)) | ((uint32_t)config->polarity << pin);\r\n}\r\n\r\n/*!\r\n * @brief Enables multiple pins interrupt.\r\n *\r\n * @param base GPIO base pointer.\r\n * @param port   GPIO port number.\r\n * @param index GPIO interrupt number.\r\n * @param mask GPIO pin number macro.\r\n */\r\nvoid GPIO_PortEnableInterrupts(GPIO_Type *base, uint32_t port, uint32_t index, uint32_t mask)\r\n{\r\n    if ((uint32_t)kGPIO_InterruptA == index)\r\n    {\r\n        base->INTENA[port] = base->INTENA[port] | mask;\r\n    }\r\n    else if ((uint32_t)kGPIO_InterruptB == index)\r\n    {\r\n        base->INTENB[port] = base->INTENB[port] | mask;\r\n    }\r\n    else\r\n    {\r\n        /*Should not enter here*/\r\n    }\r\n}\r\n\r\n/*!\r\n * @brief Disables multiple pins interrupt.\r\n *\r\n * @param base GPIO base pointer.\r\n * @param port   GPIO port number.\r\n * @param index GPIO interrupt number.\r\n * @param mask GPIO pin number macro.\r\n */\r\nvoid GPIO_PortDisableInterrupts(GPIO_Type *base, uint32_t port, uint32_t index, uint32_t mask)\r\n{\r\n    if ((uint32_t)kGPIO_InterruptA == index)\r\n    {\r\n        base->INTENA[port] = base->INTENA[port] & ~mask;\r\n    }\r\n    else if ((uint32_t)kGPIO_InterruptB == index)\r\n    {\r\n        base->INTENB[port] = base->INTENB[port] & ~mask;\r\n    }\r\n    else\r\n    {\r\n        /*Should not enter here*/\r\n    }\r\n}\r\n\r\n/*!\r\n * @brief Clears multiple pins interrupt flag. Status flags are cleared by\r\n *        writing a 1 to the corresponding bit position.\r\n *\r\n * @param base GPIO base pointer.\r\n * @param port GPIO port number.\r\n * @param index GPIO interrupt number.\r\n * @param mask GPIO pin number macro.\r\n */\r\nvoid GPIO_PortClearInterruptFlags(GPIO_Type *base, uint32_t port, uint32_t index, uint32_t mask)\r\n{\r\n    if ((uint32_t)kGPIO_InterruptA == index)\r\n    {\r\n        base->INTSTATA[port] = mask;\r\n    }\r\n    else if ((uint32_t)kGPIO_InterruptB == index)\r\n    {\r\n        base->INTSTATB[port] = mask;\r\n    }\r\n    else\r\n    {\r\n        /*Should not enter here*/\r\n    }\r\n}\r\n\r\n/*!\r\n * @ Read port interrupt status.\r\n *\r\n * @param base GPIO base pointer.\r\n * @param port GPIO port number\r\n * @param index GPIO interrupt number.\r\n * @retval masked GPIO status value\r\n */\r\nuint32_t GPIO_PortGetInterruptStatus(GPIO_Type *base, uint32_t port, uint32_t index)\r\n{\r\n    uint32_t status = 0U;\r\n\r\n    if ((uint32_t)kGPIO_InterruptA == index)\r\n    {\r\n        status = base->INTSTATA[port];\r\n    }\r\n    else if ((uint32_t)kGPIO_InterruptB == index)\r\n    {\r\n        status = base->INTSTATB[port];\r\n    }\r\n    else\r\n    {\r\n        /*Should not enter here*/\r\n    }\r\n    return status;\r\n}\r\n\r\n/*!\r\n * @brief Enables the specific pin interrupt.\r\n *\r\n * @param base GPIO base pointer.\r\n * @param port   GPIO port number.\r\n * @param pin GPIO pin number.\r\n * @param index GPIO interrupt number.\r\n */\r\nvoid GPIO_PinEnableInterrupt(GPIO_Type *base, uint32_t port, uint32_t pin, uint32_t index)\r\n{\r\n    if ((uint32_t)kGPIO_InterruptA == index)\r\n    {\r\n        base->INTENA[port] = base->INTENA[port] | (1UL << pin);\r\n    }\r\n    else if ((uint32_t)kGPIO_InterruptB == index)\r\n    {\r\n        base->INTENB[port] = base->INTENB[port] | (1UL << pin);\r\n    }\r\n    else\r\n    {\r\n        /*Should not enter here*/\r\n    }\r\n}\r\n\r\n/*!\r\n * @brief Disables the specific pin interrupt.\r\n *\r\n * @param base GPIO base pointer.\r\n * @param port   GPIO port number.\r\n * @param pin GPIO pin number.\r\n * @param index GPIO interrupt number.\r\n */\r\nvoid GPIO_PinDisableInterrupt(GPIO_Type *base, uint32_t port, uint32_t pin, uint32_t index)\r\n{\r\n    if ((uint32_t)kGPIO_InterruptA == index)\r\n    {\r\n        base->INTENA[port] = base->INTENA[port] & ~(1UL << pin);\r\n    }\r\n    else if ((uint32_t)kGPIO_InterruptB == index)\r\n    {\r\n        base->INTENB[port] = base->INTENB[port] & ~(1UL << pin);\r\n    }\r\n    else\r\n    {\r\n        /*Should not enter here*/\r\n    }\r\n}\r\n\r\n/*!\r\n * @brief Clears the specific pin interrupt flag. Status flags are cleared by\r\n *        writing a 1 to the corresponding bit position.\r\n *\r\n * @param base GPIO base pointer.\r\n * @param port GPIO port number.\r\n * @param index GPIO interrupt number.\r\n * @param mask GPIO pin number macro.\r\n */\r\nvoid GPIO_PinClearInterruptFlag(GPIO_Type *base, uint32_t port, uint32_t pin, uint32_t index)\r\n{\r\n    if ((uint32_t)kGPIO_InterruptA == index)\r\n    {\r\n        base->INTSTATA[port] = 1UL << pin;\r\n    }\r\n    else if ((uint32_t)kGPIO_InterruptB == index)\r\n    {\r\n        base->INTSTATB[port] = 1UL << pin;\r\n    }\r\n    else\r\n    {\r\n        /*Should not enter here*/\r\n    }\r\n}\r\n#endif /* FSL_FEATURE_GPIO_HAS_INTERRUPT */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_gpio.h",
    "content": "/*\r\n * Copyright (c) 2016, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2020 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef _LPC_GPIO_H_\r\n#define _LPC_GPIO_H_\r\n\r\n#include \"fsl_common.h\"\r\n\r\n/*!\r\n * @addtogroup lpc_gpio\r\n * @{\r\n */\r\n\r\n/*! @file */\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*! @name Driver version */\r\n/*! @{ */\r\n/*! @brief LPC GPIO driver version. */\r\n#define FSL_GPIO_DRIVER_VERSION (MAKE_VERSION(2, 1, 7))\r\n/*! @} */\r\n\r\n/*! @brief LPC GPIO direction definition */\r\ntypedef enum _gpio_pin_direction\r\n{\r\n    kGPIO_DigitalInput  = 0U, /*!< Set current pin as digital input*/\r\n    kGPIO_DigitalOutput = 1U, /*!< Set current pin as digital output*/\r\n} gpio_pin_direction_t;\r\n\r\n/*!\r\n * @brief The GPIO pin configuration structure.\r\n *\r\n * Every pin can only be configured as either output pin or input pin at a time.\r\n * If configured as a input pin, then leave the outputConfig unused.\r\n */\r\ntypedef struct _gpio_pin_config\r\n{\r\n    gpio_pin_direction_t pinDirection; /*!< GPIO direction, input or output */\r\n    /* Output configurations, please ignore if configured as a input one */\r\n    uint8_t outputLogic; /*!< Set default output logic, no use in input */\r\n} gpio_pin_config_t;\r\n\r\n#if (defined(FSL_FEATURE_GPIO_HAS_INTERRUPT) && FSL_FEATURE_GPIO_HAS_INTERRUPT)\r\n#define GPIO_PIN_INT_LEVEL 0x00U\r\n#define GPIO_PIN_INT_EDGE  0x01U\r\n\r\n#define PINT_PIN_INT_HIGH_OR_RISE_TRIGGER 0x00U\r\n#define PINT_PIN_INT_LOW_OR_FALL_TRIGGER  0x01U\r\n\r\n/*! @brief GPIO Pin Interrupt enable mode */\r\ntypedef enum _gpio_pin_enable_mode\r\n{\r\n    kGPIO_PinIntEnableLevel = GPIO_PIN_INT_LEVEL, /*!< Generate Pin Interrupt on level mode */\r\n    kGPIO_PinIntEnableEdge  = GPIO_PIN_INT_EDGE   /*!< Generate Pin Interrupt on edge mode */\r\n} gpio_pin_enable_mode_t;\r\n\r\n/*! @brief GPIO Pin Interrupt enable polarity */\r\ntypedef enum _gpio_pin_enable_polarity\r\n{\r\n    kGPIO_PinIntEnableHighOrRise =\r\n        PINT_PIN_INT_HIGH_OR_RISE_TRIGGER, /*!< Generate Pin Interrupt on high level or rising edge */\r\n    kGPIO_PinIntEnableLowOrFall =\r\n        PINT_PIN_INT_LOW_OR_FALL_TRIGGER /*!< Generate Pin Interrupt on low level or falling edge */\r\n} gpio_pin_enable_polarity_t;\r\n\r\n/*! @brief LPC GPIO interrupt index definition */\r\ntypedef enum _gpio_interrupt_index\r\n{\r\n    kGPIO_InterruptA = 0U, /*!< Set current pin as interrupt A*/\r\n    kGPIO_InterruptB = 1U, /*!< Set current pin as interrupt B*/\r\n} gpio_interrupt_index_t;\r\n\r\n/*! @brief Configures the interrupt generation condition. */\r\ntypedef struct _gpio_interrupt_config\r\n{\r\n    uint8_t mode;     /* The trigger mode of GPIO interrupts */\r\n    uint8_t polarity; /* The polarity of GPIO interrupts */\r\n} gpio_interrupt_config_t;\r\n#endif\r\n\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif\r\n\r\n/*! @name GPIO Configuration */\r\n/*! @{ */\r\n\r\n/*!\r\n * @brief Initializes the GPIO peripheral.\r\n *\r\n * This function ungates the GPIO clock.\r\n *\r\n * @param base   GPIO peripheral base pointer.\r\n * @param port   GPIO port number.\r\n */\r\nvoid GPIO_PortInit(GPIO_Type *base, uint32_t port);\r\n\r\n/*!\r\n * @brief Initializes a GPIO pin used by the board.\r\n *\r\n * To initialize the GPIO, define a pin configuration, either input or output, in the user file.\r\n * Then, call the GPIO_PinInit() function.\r\n *\r\n * This is an example to define an input pin or output pin configuration:\r\n * @code\r\n * Define a digital input pin configuration,\r\n * gpio_pin_config_t config =\r\n * {\r\n *   kGPIO_DigitalInput,\r\n *   0,\r\n * }\r\n * Define a digital output pin configuration,\r\n * gpio_pin_config_t config =\r\n * {\r\n *   kGPIO_DigitalOutput,\r\n *   0,\r\n * }\r\n * @endcode\r\n *\r\n * @param base   GPIO peripheral base pointer(Typically GPIO)\r\n * @param port   GPIO port number\r\n * @param pin    GPIO pin number\r\n * @param config GPIO pin configuration pointer\r\n */\r\nvoid GPIO_PinInit(GPIO_Type *base, uint32_t port, uint32_t pin, const gpio_pin_config_t *config);\r\n\r\n/*! @} */\r\n\r\n/*! @name GPIO Output Operations */\r\n/*! @{ */\r\n\r\n/*!\r\n * @brief Sets the output level of the one GPIO pin to the logic 1 or 0.\r\n *\r\n * @param base    GPIO peripheral base pointer(Typically GPIO)\r\n * @param port   GPIO port number\r\n * @param pin    GPIO pin number\r\n * @param output  GPIO pin output logic level.\r\n *        - 0: corresponding pin output low-logic level.\r\n *        - 1: corresponding pin output high-logic level.\r\n */\r\nstatic inline void GPIO_PinWrite(GPIO_Type *base, uint32_t port, uint32_t pin, uint8_t output)\r\n{\r\n    base->B[port][pin] = output;\r\n}\r\n\r\n/*! @} */\r\n/*! @name GPIO Input Operations */\r\n/*! @{ */\r\n\r\n/*!\r\n * @brief Reads the current input value of the GPIO PIN.\r\n *\r\n * @param base GPIO peripheral base pointer(Typically GPIO)\r\n * @param port   GPIO port number\r\n * @param pin    GPIO pin number\r\n * @retval GPIO port input value\r\n *        - 0: corresponding pin input low-logic level.\r\n *        - 1: corresponding pin input high-logic level.\r\n */\r\nstatic inline uint32_t GPIO_PinRead(GPIO_Type *base, uint32_t port, uint32_t pin)\r\n{\r\n    return (uint32_t)base->B[port][pin];\r\n}\r\n\r\n/*! @} */\r\n\r\n/*!\r\n * @brief Sets the output level of the multiple GPIO pins to the logic 1.\r\n *\r\n * @param base GPIO peripheral base pointer(Typically GPIO)\r\n * @param port GPIO port number\r\n * @param mask GPIO pin number macro\r\n */\r\nstatic inline void GPIO_PortSet(GPIO_Type *base, uint32_t port, uint32_t mask)\r\n{\r\n    base->SET[port] = mask;\r\n}\r\n\r\n/*!\r\n * @brief Sets the output level of the multiple GPIO pins to the logic 0.\r\n *\r\n * @param base GPIO peripheral base pointer(Typically GPIO)\r\n * @param port GPIO port number\r\n * @param mask GPIO pin number macro\r\n */\r\nstatic inline void GPIO_PortClear(GPIO_Type *base, uint32_t port, uint32_t mask)\r\n{\r\n    base->CLR[port] = mask;\r\n}\r\n\r\n/*!\r\n * @brief Reverses current output logic of the multiple GPIO pins.\r\n *\r\n * @param base GPIO peripheral base pointer(Typically GPIO)\r\n * @param port GPIO port number\r\n * @param mask GPIO pin number macro\r\n */\r\nstatic inline void GPIO_PortToggle(GPIO_Type *base, uint32_t port, uint32_t mask)\r\n{\r\n    base->NOT[port] = mask;\r\n}\r\n\r\n/*! @} */\r\n\r\n/*!\r\n * @brief Reads the current input value of the whole GPIO port.\r\n *\r\n * @param base GPIO peripheral base pointer(Typically GPIO)\r\n * @param port GPIO port number\r\n */\r\nstatic inline uint32_t GPIO_PortRead(GPIO_Type *base, uint32_t port)\r\n{\r\n    return (uint32_t)base->PIN[port];\r\n}\r\n\r\n/*! @} */\r\n/*! @name GPIO Mask Operations */\r\n/*! @{ */\r\n\r\n/*!\r\n * @brief Sets port mask, 0 - enable pin, 1 - disable pin.\r\n *\r\n * @param base GPIO peripheral base pointer(Typically GPIO)\r\n * @param port GPIO port number\r\n * @param mask GPIO pin number macro\r\n */\r\nstatic inline void GPIO_PortMaskedSet(GPIO_Type *base, uint32_t port, uint32_t mask)\r\n{\r\n    base->MASK[port] = mask;\r\n}\r\n\r\n/*!\r\n * @brief Sets the output level of the masked GPIO port. Only pins enabled by GPIO_SetPortMask() will be affected.\r\n *\r\n * @param base    GPIO peripheral base pointer(Typically GPIO)\r\n * @param port   GPIO port number\r\n * @param output  GPIO port output value.\r\n */\r\nstatic inline void GPIO_PortMaskedWrite(GPIO_Type *base, uint32_t port, uint32_t output)\r\n{\r\n    base->MPIN[port] = output;\r\n}\r\n\r\n/*!\r\n * @brief Reads the current input value of the masked GPIO port. Only pins enabled by GPIO_SetPortMask() will be\r\n * affected.\r\n *\r\n * @param base   GPIO peripheral base pointer(Typically GPIO)\r\n * @param port   GPIO port number\r\n * @retval       masked GPIO port value\r\n */\r\nstatic inline uint32_t GPIO_PortMaskedRead(GPIO_Type *base, uint32_t port)\r\n{\r\n    return (uint32_t)base->MPIN[port];\r\n}\r\n\r\n#if defined(FSL_FEATURE_GPIO_HAS_INTERRUPT) && FSL_FEATURE_GPIO_HAS_INTERRUPT\r\n/*!\r\n * @brief Set the configuration of pin interrupt.\r\n *\r\n * @param base GPIO base pointer.\r\n * @param port GPIO port number\r\n * @param pin GPIO pin number.\r\n * @param config GPIO pin interrupt configuration..\r\n */\r\nvoid GPIO_SetPinInterruptConfig(GPIO_Type *base, uint32_t port, uint32_t pin, gpio_interrupt_config_t *config);\r\n\r\n/*!\r\n * @brief Enables multiple pins interrupt.\r\n *\r\n * @param base GPIO base pointer.\r\n * @param port GPIO port number.\r\n * @param index GPIO interrupt number.\r\n * @param mask GPIO pin number macro.\r\n */\r\nvoid GPIO_PortEnableInterrupts(GPIO_Type *base, uint32_t port, uint32_t index, uint32_t mask);\r\n\r\n/*!\r\n * @brief Disables multiple pins interrupt.\r\n *\r\n * @param base GPIO base pointer.\r\n * @param port GPIO port number.\r\n * @param index GPIO interrupt number.\r\n * @param mask GPIO pin number macro.\r\n */\r\nvoid GPIO_PortDisableInterrupts(GPIO_Type *base, uint32_t port, uint32_t index, uint32_t mask);\r\n\r\n/*!\r\n * @brief Clears pin interrupt flag. Status flags are cleared by\r\n *        writing a 1 to the corresponding bit position.\r\n *\r\n * @param base GPIO base pointer.\r\n * @param port   GPIO port number.\r\n * @param index GPIO interrupt number.\r\n * @param mask GPIO pin number macro.\r\n */\r\nvoid GPIO_PortClearInterruptFlags(GPIO_Type *base, uint32_t port, uint32_t index, uint32_t mask);\r\n\r\n/*!\r\n * @ Read port interrupt status.\r\n *\r\n * @param base GPIO base pointer.\r\n * @param port GPIO port number\r\n * @param index GPIO interrupt number.\r\n * @retval masked GPIO status value\r\n */\r\nuint32_t GPIO_PortGetInterruptStatus(GPIO_Type *base, uint32_t port, uint32_t index);\r\n\r\n/*!\r\n * @brief Enables the specific pin interrupt.\r\n *\r\n * @param base GPIO base pointer.\r\n * @param port GPIO port number.\r\n * @param pin GPIO pin number.\r\n * @param index GPIO interrupt number.\r\n */\r\nvoid GPIO_PinEnableInterrupt(GPIO_Type *base, uint32_t port, uint32_t pin, uint32_t index);\r\n\r\n/*!\r\n * @brief Disables the specific pin interrupt.\r\n *\r\n * @param base GPIO base pointer.\r\n * @param port GPIO port number.\r\n * @param pin GPIO pin number.\r\n * @param index GPIO interrupt number.\r\n */\r\nvoid GPIO_PinDisableInterrupt(GPIO_Type *base, uint32_t port, uint32_t pin, uint32_t index);\r\n\r\n/*!\r\n * @brief Clears the specific pin interrupt flag. Status flags are cleared by\r\n *        writing a 1 to the corresponding bit position.\r\n *\r\n * @param base GPIO base pointer.\r\n * @param port GPIO port number.\r\n * @param pin GPIO pin number.\r\n * @param index GPIO interrupt number.\r\n */\r\nvoid GPIO_PinClearInterruptFlag(GPIO_Type *base, uint32_t port, uint32_t pin, uint32_t index);\r\n\r\n#endif /* FSL_FEATURE_GPIO_HAS_INTERRUPT */\r\n\r\n/*! @} */\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n/*!\r\n * @}\r\n */\r\n\r\n#endif /* _LPC_GPIO_H_*/\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_imu.c",
    "content": "/*\r\n * Copyright 2020-2022 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include \"fsl_imu.h\"\r\n\r\n/* Component ID definition, used by tools. */\r\n#ifndef FSL_COMPONENT_ID\r\n#define FSL_COMPONENT_ID \"platform.drivers.imu\"\r\n#endif\r\n\r\n/*******************************************************************************\r\n * Variables\r\n ******************************************************************************/\r\n\r\n/******************************************************************************\r\n * Code\r\n *****************************************************************************/\r\n\r\n/*\r\n * Initializes the IMU module.\r\n *\r\n * This function sets IMU to initialized state, including:\r\n *\r\n *   - Flush the send FIFO.\r\n *   - Unlock the send FIFO.\r\n *   - Set the water mark to (IMU_MAX_MSG_FIFO_WATER_MARK)\r\n *\r\n */\r\nstatus_t IMU_Init(imu_link_t link)\r\n{\r\n    status_t status;\r\n\r\n    if (link >= kIMU_LinkMax)\r\n    {\r\n        status = kStatus_InvalidArgument;\r\n    }\r\n    else\r\n    {\r\n        IMU_FlushSendFifo(link);\r\n        IMU_LockSendFifo(link, false);\r\n        IMU_SetSendFifoWaterMark(link, IMU_MAX_MSG_FIFO_WATER_MARK);\r\n\r\n        /* Flush RX FIFO. */\r\n        while (!IMU_RX_FIFO_EMPTY(link))\r\n        {\r\n            (void)IMU_RD_MSG(link);\r\n        }\r\n\r\n        status = kStatus_Success;\r\n    }\r\n\r\n    return status;\r\n}\r\n\r\n/*\r\n * De-initializes the IMU module.\r\n *\r\n */\r\nvoid IMU_Deinit(imu_link_t link)\r\n{\r\n}\r\n\r\n/*\r\n * Blocking to send messages.\r\n *\r\n * This function blocks until all messages have been filled to TX FIFO.\r\n *\r\n * - If the TX FIFO is locked, this function returns IMU_ERR_TX_FIFO_LOCKED.\r\n * - If TX FIFO not locked, this function waits the available empty slot in TX FIFO,\r\n *   and fills the message to TX FIFO.\r\n * - To lock TX FIFO after filling all messages, set  lockSendFifo to true.\r\n *\r\n * param link IMU link.\r\n * param msgs The messages to send.\r\n * param msgCount Message count, one message is a 32-bit word.\r\n * param lockSendFifo If set to true, the TX FIFO is locked after all messages filled to TX FIFO.\r\n * return If TX FIFO is locked, this function returns IMU_ERR_TX_FIFO_LOCKED,\r\n * otherwise, this function returns the actual message count sent out, it equals  msgCount\r\n * because this function is blocking function, it returns until all messages have been\r\n * filled into TX FIFO.\r\n */\r\nint32_t IMU_SendMsgsBlocking(imu_link_t link, const uint32_t *msgs, int32_t msgCount, bool lockSendFifo)\r\n{\r\n    int32_t ret;\r\n    int32_t curSent;\r\n    int32_t fifoEmptySpace;\r\n\r\n    if (msgCount <= 0)\r\n    {\r\n        ret = 0;\r\n    }\r\n    else if (IMU_TX_FIFO_LOCKED(link))\r\n    {\r\n        ret = IMU_ERR_TX_FIFO_LOCKED;\r\n    }\r\n    else\r\n    {\r\n        ret = msgCount;\r\n\r\n        /* Send the first (msgCount - 1), the last message should\r\n         * be sent with the lock configuration.\r\n         */\r\n        msgCount--;\r\n\r\n        while (msgCount > 0)\r\n        {\r\n            fifoEmptySpace = (int32_t)IMU_GetSendFifoEmptySpace(link);\r\n            curSent        = MIN(msgCount, fifoEmptySpace);\r\n\r\n            msgCount -= curSent;\r\n\r\n            while (0 != (curSent--))\r\n            {\r\n                IMU_WR_MSG(link, *msgs);\r\n                msgs++;\r\n            }\r\n        }\r\n\r\n        /* To lock TX FIFO, set the lock bit before last message write. */\r\n        if (lockSendFifo)\r\n        {\r\n            IMU_LOCK_TX_FIFO(link);\r\n        }\r\n\r\n        /* Send the last. */\r\n        while (0UL == IMU_GetSendFifoEmptySpace(link))\r\n        {\r\n        }\r\n        IMU_WR_MSG(link, *msgs);\r\n    }\r\n\r\n    return ret;\r\n}\r\n\r\n/*\r\n * Try to send messages.\r\n *\r\n * This function is similar with @ref IMU_SendMsgsBlocking, the difference is,\r\n * this function tries to send as many as possible, if there is not enough\r\n * empty slot in TX FIFO, this function fills messages to available empty slots\r\n * and returns how many messages have been filled.\r\n *\r\n * - If the TX FIFO is locked, this function returns IMU_ERR_TX_FIFO_LOCKED.\r\n * - If TX FIFO not locked, this function fills messages to TX FIFO empty slot,\r\n *   and returns how many messages have been filled.\r\n * - If  lockSendFifo is set to true, TX FIFO is locked after all messages have\r\n *   been filled to TX FIFO. In other word, TX FIFO is locked if the function\r\n *   return value equals  msgCount, when  lockSendFifo set to true.\r\n *\r\n * param link IMU link.\r\n * param msgs The messages to send.\r\n * param msgCount Message count, one message is a 32-bit word.\r\n * param lockSendFifo If set to true, the TX FIFO is locked after all messages filled to TX FIFO.\r\n * return If TX FIFO is locked, this function returns IMU_ERR_TX_FIFO_LOCKED,\r\n * otherwise, this function returns the actual message count sent out.\r\n */\r\nint32_t IMU_TrySendMsgs(imu_link_t link, const uint32_t *msgs, int32_t msgCount, bool lockSendFifo)\r\n{\r\n    int32_t ret;\r\n    int32_t curSent;\r\n    int32_t fifoEmptySpace;\r\n\r\n    if (msgCount <= 0)\r\n    {\r\n        ret = 0;\r\n    }\r\n    else if (IMU_TX_FIFO_LOCKED(link))\r\n    {\r\n        ret = IMU_ERR_TX_FIFO_LOCKED;\r\n    }\r\n    else\r\n    {\r\n        ret = 0;\r\n\r\n        /* Send the first (msgCount - 1), the last message should\r\n         * be sent with the lock configuration.\r\n         */\r\n        msgCount--;\r\n\r\n        while (true)\r\n        {\r\n            fifoEmptySpace = (int32_t)IMU_GetSendFifoEmptySpace(link);\r\n\r\n            if (fifoEmptySpace == 0)\r\n            {\r\n                break;\r\n            }\r\n            /* If this is the last and have FIFO space to send. */\r\n            else if (0 == msgCount)\r\n            {\r\n                if (lockSendFifo)\r\n                {\r\n                    IMU_LOCK_TX_FIFO(link);\r\n                }\r\n\r\n                /* Send the last. */\r\n                IMU_WR_MSG(link, *msgs);\r\n                ret++;\r\n                break;\r\n            }\r\n            else\r\n            {\r\n                curSent = MIN(msgCount, fifoEmptySpace);\r\n\r\n                /* Send the data. */\r\n                msgCount -= curSent;\r\n                ret += curSent;\r\n                while (0 != (curSent--))\r\n                {\r\n                    IMU_WR_MSG(link, *msgs);\r\n                    msgs++;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    return ret;\r\n}\r\n\r\n/*\r\n * Try to receive messages.\r\n *\r\n * This function tries to read messages from RX FIFO. It reads the messages already\r\n * exists in RX FIFO and returns the actual read count.\r\n *\r\n * - If the RX FIFO has enough messages, this function reads the messages and returns.\r\n * - If the RX FIFO does not have enough messages, this function the messages in RX FIFO\r\n *   and returns the actual read count.\r\n * - During message reading, if RX FIFO is empty and locked, in this case peer CPU will not\r\n *   send message until current CPU send lock ack message. Then this function\r\n *   returns the message count actually received, and sets  needAckLock to true\r\n *   to inform upper layer.\r\n *\r\n * param link IMU link.\r\n * param msgs The buffer to read messages.\r\n * param desiredMsgCount Desired read count, one message is a 32-bit word.\r\n * param needAckLock Upper layer should always check this value. When this is\r\n * set to true by this function, upper layer should send lock ack message to peer CPU.\r\n * return Count of messages actually received.\r\n */\r\nint32_t IMU_TryReceiveMsgs(imu_link_t link, uint32_t *msgs, int32_t desiredMsgCount, bool *needAckLock)\r\n{\r\n    int32_t receivedCount = 0;\r\n    int32_t rxFifoMsgCount;\r\n    int32_t countToRead;\r\n    uint32_t rxFifoStatus;\r\n    bool localNeedAckLock = false;\r\n\r\n    while (true)\r\n    {\r\n        rxFifoStatus = IMU_RX_FIFO_STATUS(link);\r\n\r\n        rxFifoMsgCount = (int32_t)(uint32_t)IMU_RX_FIFO_MSG_COUNT_FROM_STATUS(rxFifoStatus);\r\n\r\n        if (0 == rxFifoMsgCount)\r\n        {\r\n            if (IMU_RX_FIFO_LOCKED_FROM_STATUS(rxFifoStatus))\r\n            {\r\n                localNeedAckLock = true;\r\n            }\r\n            break;\r\n        }\r\n\r\n        /*\r\n         * Dont need to check RX FIFO lock status, only notify upper layer\r\n         * when last message read out.\r\n         */\r\n        if (0 == desiredMsgCount)\r\n        {\r\n            break;\r\n        }\r\n\r\n        countToRead = MIN(desiredMsgCount, rxFifoMsgCount);\r\n        receivedCount += countToRead;\r\n        desiredMsgCount -= countToRead;\r\n\r\n        while (0 != (countToRead--))\r\n        {\r\n            *msgs++ = IMU_RD_MSG(link);\r\n        }\r\n    }\r\n\r\n    if (needAckLock != NULL)\r\n    {\r\n        *needAckLock = localNeedAckLock;\r\n    }\r\n\r\n    return receivedCount;\r\n}\r\n\r\n/*\r\n * Blocking to receive messages.\r\n *\r\n * This function blocks until all desired messages have been received or the RX FIFO\r\n * is locked.\r\n *\r\n * - If the RX FIFO has enough messages, this function reads the messages and returns.\r\n * - If the RX FIFO does not have enough messages, this function waits for the new\r\n *   messages.\r\n * - During message reading, if RX FIFO is empty and locked, in this case peer CPU will not\r\n *   send message until current CPU send lock ack message. Then this function\r\n *   returns the message count actually received, and sets  needAckLock to true\r\n *   to inform upper layer.\r\n *\r\n * param link IMU link.\r\n * param msgs The buffer to read messages.\r\n * param desiredMsgCount Desired read count, one message is a 32-bit word.\r\n * param needAckLock Upper layer should always check this value. When this is\r\n * set to true by this function, upper layer should send lock ack message to peer CPU.\r\n * return Count of messages actually received.\r\n */\r\nint32_t IMU_ReceiveMsgsBlocking(imu_link_t link, uint32_t *msgs, int32_t desiredMsgCount, bool *needAckLock)\r\n{\r\n    int32_t receivedCount = 0;\r\n    int32_t rxFifoMsgCount;\r\n    int32_t countToRead;\r\n    uint32_t rxFifoStatus;\r\n    bool localNeedAckLock;\r\n\r\n    while (true)\r\n    {\r\n        rxFifoStatus = IMU_RX_FIFO_STATUS(link);\r\n\r\n        rxFifoMsgCount = (int32_t)(uint32_t)IMU_RX_FIFO_MSG_COUNT_FROM_STATUS(rxFifoStatus);\r\n\r\n        if ((0 == rxFifoMsgCount) && (IMU_RX_FIFO_LOCKED_FROM_STATUS(rxFifoStatus)))\r\n        {\r\n            localNeedAckLock = true;\r\n            break;\r\n        }\r\n\r\n        if (0 == desiredMsgCount)\r\n        {\r\n            localNeedAckLock = false;\r\n            break;\r\n        }\r\n\r\n        countToRead = MIN(desiredMsgCount, rxFifoMsgCount);\r\n        receivedCount += countToRead;\r\n        desiredMsgCount -= countToRead;\r\n\r\n        while (0 != (countToRead--))\r\n        {\r\n            *msgs++ = IMU_RD_MSG(link);\r\n        }\r\n    }\r\n\r\n    if (NULL != needAckLock)\r\n    {\r\n        *needAckLock = localNeedAckLock;\r\n    }\r\n\r\n    return receivedCount;\r\n}\r\n\r\n/*\r\n * brief Blocking to send messages pointer.\r\n *\r\n * Compared with @ref IMU_SendMsgsBlocking, this function fills message pointer\r\n * to TX FIFO, but not the message content.\r\n *\r\n * This function blocks until the message pointer is filled to TX FIFO.\r\n *\r\n * - If the TX FIFO is locked, this function returns IMU_ERR_TX_FIFO_LOCKED.\r\n * - If TX FIFO not locked, this function waits the available empty slot in TX FIFO,\r\n *   and fills the message pointer to TX FIFO.\r\n * - To lock TX FIFO after filling the message pointer, set lockSendFifo to true.\r\n *\r\n * param link IMU link.\r\n * param msgPtr The buffer pointer to message to send.\r\n * param needAckLock Upper layer should always check this value. When this is\r\n * set to true by this function, upper layer should send lock ack message to peer CPU.\r\n * retval 0 The message pointer set successfully.\r\n * retval IMU_ERR_TX_FIFO_LOCKED The TX FIFO is locked, send failed.\r\n */\r\nint32_t IMU_SendMsgPtrBlocking(imu_link_t link, uint32_t msgPtr, bool lockSendFifo)\r\n{\r\n    int32_t ret = 0;\r\n\r\n    if (IMU_TX_FIFO_LOCKED(link))\r\n    {\r\n        ret = IMU_ERR_TX_FIFO_LOCKED;\r\n    }\r\n    else\r\n    {\r\n        while (IMU_TX_FIFO_ALMOST_FULL(link))\r\n        {\r\n        }\r\n\r\n        if (lockSendFifo)\r\n        {\r\n            IMU_LOCK_TX_FIFO(link);\r\n        }\r\n\r\n        IMU_WR_MSG(link, msgPtr);\r\n    }\r\n\r\n    return ret;\r\n}\r\n\r\n/*\r\n * brief Flush the send FIFO.\r\n *\r\n * Flush all messages in send FIFO.\r\n *\r\n * param link IMU link.\r\n */\r\nvoid IMU_FlushSendFifo(imu_link_t link)\r\n{\r\n    IMU_TX_FIFO_CNTL(link) |= IMU_MSG_FIFO_CNTL_FIFO_FLUSH_MASK;\r\n    IMU_TX_FIFO_CNTL(link) &= ~IMU_MSG_FIFO_CNTL_FIFO_FLUSH_MASK;\r\n}\r\n\r\n/*\r\n * Gets the IMU status flags.\r\n *\r\n * param link IMU link.\r\n * return Bit mask of the IMU status flags, see _imu_status_flags.\r\n */\r\nuint32_t IMU_GetStatusFlags(imu_link_t link)\r\n{\r\n    uint32_t txFifoStatus = IMU_TX_FIFO_STATUS(link);\r\n    uint32_t rxFifoStatus = IMU_RX_FIFO_STATUS(link);\r\n\r\n    return txFifoStatus | (rxFifoStatus << 8U);\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_imu.h",
    "content": "/*\r\n * Copyright 2020-2022 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n#ifndef FSL_IMU_H_\r\n#define FSL_IMU_H_\r\n\r\n#include \"fsl_common.h\"\r\n\r\n/*!\r\n * @addtogroup imu\r\n * @{\r\n */\r\n\r\n/******************************************************************************\r\n * Definitions\r\n *****************************************************************************/\r\n\r\n/*! @name Driver version */\r\n/*! @{ */\r\n/*! @brief IMU driver version. */\r\n#define FSL_IMU_DRIVER_VERSION (MAKE_VERSION(2, 1, 1))\r\n/*! @} */\r\n\r\n#define IMU_MSG_FIFO_STATUS_MSG_FIFO_LOCKED_MASK      (1UL)\r\n#define IMU_MSG_FIFO_STATUS_MSG_FIFO_ALMOST_FULL_MASK (1UL << 1U)\r\n#define IMU_MSG_FIFO_STATUS_MSG_FIFO_FULL_MASK        (1UL << 2U)\r\n#define IMU_MSG_FIFO_STATUS_MSG_FIFO_EMPTY_MASK       (1UL << 3U)\r\n#define IMU_MSG_FIFO_STATUS_MSG_COUNT_MASK            (0x1FUL << 4U)\r\n#define IMU_MSG_FIFO_STATUS_MSG_COUNT_SHIFT           (4U)\r\n#define IMU_MSG_FIFO_STATUS_WR_PTR_MASK               (0xFUL << 16U)\r\n#define IMU_MSG_FIFO_STATUS_WR_PTR_SHIFT              (16U)\r\n#define IMU_MSG_FIFO_STATUS_RD_PTR_MASK               (0xFUL << 20U)\r\n#define IMU_MSG_FIFO_STATUS_RD_PTR_SHIFT              (20U)\r\n\r\n#define IMU_MSG_FIFO_CNTL_MSG_RDY_INT_CLR_MASK      (1UL << 0U)\r\n#define IMU_MSG_FIFO_CNTL_SP_AV_INT_CLR_MASK        (1UL << 1U)\r\n#define IMU_MSG_FIFO_CNTL_FIFO_FLUSH_MASK           (1UL << 16U)\r\n#define IMU_MSG_FIFO_CNTL_WAIT_FOR_ACK_MASK         (1UL << 17U)\r\n#define IMU_MSG_FIFO_CNTL_FIFO_FULL_WATERMARK_MASK  (0x0FUL << 20U)\r\n#define IMU_MSG_FIFO_CNTL_FIFO_FULL_WATERMARK_SHIFT (20U)\r\n#define IMU_MSG_FIFO_CNTL_FIFO_FULL_WATERMARK(x)    (((uint32_t)(x)) << 20U)\r\n\r\n/* Write message directly. */\r\n#define IMU_WR_MSG(link, msg) (((IMU_Type *)(uintptr_t)IMU_CUR_CPU_BASE(link))->WR_MSG = (msg))\r\n\r\n/* Read message directly. */\r\n#define IMU_RD_MSG(link) (((IMU_Type *)(uintptr_t)IMU_CUR_CPU_BASE(link))->RD_MSG)\r\n\r\n/* Check whether RX FIFO is locked. */\r\n#define IMU_RX_FIFO_LOCKED(link) \\\r\n    (0UL !=                      \\\r\n     (((IMU_Type *)(uintptr_t)IMU_PEER_CPU_BASE(link))->MSG_FIFO_STATUS & IMU_MSG_FIFO_STATUS_MSG_FIFO_LOCKED_MASK))\r\n\r\n/* Check whether TX FIFO is locked. */\r\n#define IMU_TX_FIFO_LOCKED(link) \\\r\n    (0UL !=                      \\\r\n     (((IMU_Type *)(uintptr_t)IMU_CUR_CPU_BASE(link))->MSG_FIFO_STATUS & IMU_MSG_FIFO_STATUS_MSG_FIFO_LOCKED_MASK))\r\n\r\n/* Check whether TX FIFO is almost full. */\r\n#define IMU_TX_FIFO_ALMOST_FULL(link)                                           \\\r\n    (0UL != (((IMU_Type *)(uintptr_t)IMU_CUR_CPU_BASE(link))->MSG_FIFO_STATUS & \\\r\n             IMU_MSG_FIFO_STATUS_MSG_FIFO_ALMOST_FULL_MASK))\r\n\r\n/*! @brief Get Rx FIFO empty status. */\r\n#define IMU_RX_FIFO_EMPTY(link) \\\r\n    (0UL !=                     \\\r\n     (((IMU_Type *)(uintptr_t)IMU_PEER_CPU_BASE(link))->MSG_FIFO_STATUS & IMU_MSG_FIFO_STATUS_MSG_FIFO_EMPTY_MASK))\r\n\r\n/* Lock the TX FIFO. */\r\n#define IMU_LOCK_TX_FIFO(link) \\\r\n    (((IMU_Type *)(uintptr_t)IMU_CUR_CPU_BASE(link))->MSG_FIFO_CNTL |= IMU_MSG_FIFO_CNTL_WAIT_FOR_ACK_MASK)\r\n\r\n/* Unlock the TX FIFO. */\r\n#define IMU_UNLOCK_TX_FIFO(link) \\\r\n    (((IMU_Type *)(uintptr_t)IMU_CUR_CPU_BASE(link))->MSG_FIFO_CNTL &= ~IMU_MSG_FIFO_CNTL_WAIT_FOR_ACK_MASK)\r\n\r\n/* Get message count in RX FIFO. */\r\n#define IMU_RX_FIFO_MSG_COUNT(link)                                                                              \\\r\n    ((((IMU_Type *)(uintptr_t)IMU_PEER_CPU_BASE(link))->MSG_FIFO_STATUS & IMU_MSG_FIFO_STATUS_MSG_COUNT_MASK) >> \\\r\n     IMU_MSG_FIFO_STATUS_MSG_COUNT_SHIFT)\r\n\r\n/* Get message count in TX FIFO. */\r\n#define IMU_TX_FIFO_MSG_COUNT(link)                                                                             \\\r\n    ((((IMU_Type *)(uintptr_t)IMU_CUR_CPU_BASE(link))->MSG_FIFO_STATUS & IMU_MSG_FIFO_STATUS_MSG_COUNT_MASK) >> \\\r\n     IMU_MSG_FIFO_STATUS_MSG_COUNT_SHIFT)\r\n\r\n/* Get message count from RX FIFO status register value. */\r\n#define IMU_RX_FIFO_MSG_COUNT_FROM_STATUS(rxFifoStatus) \\\r\n    (((rxFifoStatus)&IMU_MSG_FIFO_STATUS_MSG_COUNT_MASK) >> IMU_MSG_FIFO_STATUS_MSG_COUNT_SHIFT)\r\n\r\n/* Get RX FIFO lock status from RX FIFO status register value. */\r\n#define IMU_RX_FIFO_LOCKED_FROM_STATUS(rxFifoStatus) (0UL != ((rxFifoStatus)&IMU_MSG_FIFO_STATUS_MSG_FIFO_LOCKED_MASK))\r\n\r\n/* TX FIFO status register. */\r\n#define IMU_TX_FIFO_STATUS(link) (((IMU_Type *)(uintptr_t)IMU_CUR_CPU_BASE(link))->MSG_FIFO_STATUS)\r\n\r\n/* RX FIFO status register. */\r\n#define IMU_RX_FIFO_STATUS(link) (((IMU_Type *)(uintptr_t)IMU_PEER_CPU_BASE(link))->MSG_FIFO_STATUS)\r\n\r\n/* RX FIFO control register. */\r\n#define IMU_TX_FIFO_CNTL(link) (((IMU_Type *)(uintptr_t)IMU_CUR_CPU_BASE(link))->MSG_FIFO_CNTL)\r\n\r\n/*! @brief IMU driver returned error value. */\r\n#define IMU_ERR_TX_FIFO_LOCKED (-1L)\r\n\r\n/*! @brief Maximum message numbers in FIFO. */\r\n#define IMU_MSG_FIFO_MAX_COUNT 16U\r\n\r\n/*! @brief Maximum message FIFO warter mark. */\r\n#define IMU_MAX_MSG_FIFO_WATER_MARK (IMU_MSG_FIFO_MAX_COUNT - 1U)\r\n\r\n/* IMP: ICC_MAX_MSG_CNT should be power of 2 */\r\n#define IMU_FIFO_SW_WRAPAROUND(ptr) ((ptr) & (IMU_MSG_FIFO_MAX_COUNT - 1U))\r\n\r\n#define IMU_WR_PTR(link)                                                                   \\\r\n    IMU_FIFO_SW_WRAPAROUND((IMU_TX_FIFO_STATUS(link) & IMU_MSG_FIFO_STATUS_WR_PTR_MASK) >> \\\r\n                           IMU_MSG_FIFO_STATUS_WR_PTR_SHIFT)\r\n\r\n#define IMU_RD_PTR(link)                                                                   \\\r\n    IMU_FIFO_SW_WRAPAROUND((IMU_RX_FIFO_STATUS(link) & IMU_MSG_FIFO_STATUS_RD_PTR_MASK) >> \\\r\n                           IMU_MSG_FIFO_STATUS_RD_PTR_SHIFT)\r\n\r\n/*!\r\n * @brief IMU status flags.\r\n * @anchor _imu_status_flags\r\n */\r\nenum _imu_status_flags\r\n{\r\n    kIMU_TxFifoEmpty      = IMU_MSG_FIFO_STATUS_MSG_FIFO_EMPTY_MASK,\r\n    kIMU_TxFifoFull       = IMU_MSG_FIFO_STATUS_MSG_FIFO_FULL_MASK,\r\n    kIMU_TxFifoAlmostFull = IMU_MSG_FIFO_STATUS_MSG_FIFO_ALMOST_FULL_MASK,\r\n    kIMU_TxFifoLocked     = IMU_MSG_FIFO_STATUS_MSG_FIFO_LOCKED_MASK,\r\n    kIMU_RxFifoEmpty      = IMU_MSG_FIFO_STATUS_MSG_FIFO_EMPTY_MASK << 8U,\r\n    kIMU_RxFifoFull       = IMU_MSG_FIFO_STATUS_MSG_FIFO_FULL_MASK << 8U,\r\n    kIMU_RxFifoAlmostFull = IMU_MSG_FIFO_STATUS_MSG_FIFO_ALMOST_FULL_MASK << 8U,\r\n    kIMU_RxFifoLocked     = IMU_MSG_FIFO_STATUS_MSG_FIFO_LOCKED_MASK << 8U,\r\n};\r\n\r\n/*!\r\n * @brief IMU interrupt.\r\n * @anchor _imu_interrupts\r\n */\r\nenum _imu_interrupts\r\n{\r\n    kIMU_RxMsgReadyInterrupt           = IMU_MSG_FIFO_CNTL_MSG_RDY_INT_CLR_MASK,\r\n    kIMU_TxFifoSpaceAvailableInterrupt = IMU_MSG_FIFO_CNTL_SP_AV_INT_CLR_MASK,\r\n};\r\n\r\n/*! @brief IMU register structure. */\r\ntypedef struct\r\n{\r\n    volatile uint32_t WR_MSG;\r\n    const volatile uint32_t RD_MSG;\r\n    const volatile uint32_t MSG_FIFO_STATUS;\r\n    volatile uint32_t MSG_FIFO_CNTL;\r\n    const volatile uint32_t RD_MSG_DBG;\r\n} IMU_Type;\r\n\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif\r\n\r\n/*!\r\n * @name IMU initialization.\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief Initializes the IMU module.\r\n *\r\n * This function sets IMU to initialized state, including:\r\n *\r\n *   - Flush the send FIFO.\r\n *   - Unlock the send FIFO.\r\n *   - Set the water mark to (IMU_MAX_MSG_FIFO_WATER_MARK)\r\n *   - Flush the read FIFO.\r\n *\r\n * @param link IMU link.\r\n * @retval kStatus_InvalidArgument The link is invalid.\r\n * @retval kStatus_Success Initialized successfully.\r\n */\r\nstatus_t IMU_Init(imu_link_t link);\r\n\r\n/*!\r\n * @brief De-initializes the IMU module.\r\n *\r\n * @param link IMU link.\r\n */\r\nvoid IMU_Deinit(imu_link_t link);\r\n\r\n/*! @} */\r\n\r\n/*!\r\n * @name IMU Message\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief Write one message to TX FIFO.\r\n *\r\n * This function writes message to the TX FIFO, user need to make sure\r\n * there is empty space in the TX FIFO, and TX FIFO not locked before\r\n * calling this function.\r\n *\r\n * @param link IMU link.\r\n * @param msg The message to send.\r\n */\r\nstatic inline void IMU_WriteMsg(imu_link_t link, uint32_t msg)\r\n{\r\n    IMU_WR_MSG(link, msg);\r\n}\r\n\r\n/*!\r\n * @brief Read one message from RX FIFO.\r\n *\r\n * User need to make sure there is available message in the RX FIFO.\r\n *\r\n * @param link IMU link.\r\n * @return The message.\r\n */\r\nstatic inline uint32_t IMU_ReadMsg(imu_link_t link)\r\n{\r\n    return IMU_RD_MSG(link);\r\n}\r\n\r\n/*!\r\n * @brief Blocking to send messages.\r\n *\r\n * This function blocks until all messages have been filled to TX FIFO.\r\n *\r\n * - If the TX FIFO is locked, this function returns IMU_ERR_TX_FIFO_LOCKED.\r\n * - If TX FIFO not locked, this function waits the available empty slot in TX FIFO,\r\n *   and fills the message to TX FIFO.\r\n * - To lock TX FIFO after filling all messages, set @p lockSendFifo to true.\r\n *\r\n * @param link IMU link.\r\n * @param msgs The messages to send.\r\n * @param msgCount Message count, one message is a 32-bit word.\r\n * @param lockSendFifo If set to true, the TX FIFO is locked after all messages filled to TX FIFO.\r\n * @return If TX FIFO is locked, this function returns IMU_ERR_TX_FIFO_LOCKED,\r\n * otherwise, this function returns the actual message count sent out, it equals @p msgCount\r\n * because this function is blocking function, it returns until all messages have been\r\n * filled into TX FIFO.\r\n */\r\nint32_t IMU_SendMsgsBlocking(imu_link_t link, const uint32_t *msgs, int32_t msgCount, bool lockSendFifo);\r\n\r\n/*!\r\n * @brief Try to send messages.\r\n *\r\n * This function is similar with @ref IMU_SendMsgsBlocking, the difference is,\r\n * this function tries to send as many as possible, if there is not enough\r\n * empty slot in TX FIFO, this function fills messages to available empty slots\r\n * and returns how many messages have been filled.\r\n *\r\n * - If the TX FIFO is locked, this function returns IMU_ERR_TX_FIFO_LOCKED.\r\n * - If TX FIFO not locked, this function fills messages to TX FIFO empty slot,\r\n *   and returns how many messages have been filled.\r\n * - If @p lockSendFifo is set to true, TX FIFO is locked after all messages have\r\n *   been filled to TX FIFO. In other word, TX FIFO is locked if the function\r\n *   return value equals @p msgCount, when @p lockSendFifo set to true.\r\n *\r\n * @param link IMU link.\r\n * @param msgs The messages to send.\r\n * @param msgCount Message count, one message is a 32-bit word.\r\n * @param lockSendFifo If set to true, the TX FIFO is locked after all messages filled to TX FIFO.\r\n * @return If TX FIFO is locked, this function returns IMU_ERR_TX_FIFO_LOCKED,\r\n * otherwise, this function returns the actual message count sent out.\r\n */\r\nint32_t IMU_TrySendMsgs(imu_link_t link, const uint32_t *msgs, int32_t msgCount, bool lockSendFifo);\r\n\r\n/*!\r\n * @brief Try to receive messages.\r\n *\r\n * This function tries to read messages from RX FIFO. It reads the messages already\r\n * exists in RX FIFO and returns the actual read count.\r\n *\r\n * - If the RX FIFO has enough messages, this function reads the messages and returns.\r\n * - If the RX FIFO does not have enough messages, this function the messages in RX FIFO\r\n *   and returns the actual read count.\r\n * - During message reading, if RX FIFO is empty and locked, in this case peer CPU will not\r\n *   send message until current CPU send lock ack message. Then this function\r\n *   returns the message count actually received, and sets @p needAckLock to true\r\n *   to inform upper layer.\r\n *\r\n * @param link IMU link.\r\n * @param msgs The buffer to read messages.\r\n * @param desiredMsgCount Desired read count, one message is a 32-bit word.\r\n * @param needAckLock Upper layer should always check this value. When this is\r\n * set to true by this function, upper layer should send lock ack message to peer CPU.\r\n * @return Count of messages actually received.\r\n */\r\nint32_t IMU_TryReceiveMsgs(imu_link_t link, uint32_t *msgs, int32_t desiredMsgCount, bool *needAckLock);\r\n\r\n/*!\r\n * @brief Blocking to receive messages.\r\n *\r\n * This function blocks until all desired messages have been received or the RX FIFO\r\n * is locked.\r\n *\r\n * - If the RX FIFO has enough messages, this function reads the messages and returns.\r\n * - If the RX FIFO does not have enough messages, this function waits for the new\r\n *   messages.\r\n * - During message reading, if RX FIFO is empty and locked, in this case peer CPU will not\r\n *   send message until current CPU send lock ack message. Then this function\r\n *   returns the message count actually received, and sets @p needAckLock to true\r\n *   to inform upper layer.\r\n *\r\n * @param link IMU link.\r\n * @param msgs The buffer to read messages.\r\n * @param desiredMsgCount Desired read count, one message is a 32-bit word.\r\n * @param needAckLock Upper layer should always check this value. When this is\r\n * set to true by this function, upper layer should send lock ack message to peer CPU.\r\n * @return Count of messages actually received.\r\n */\r\nint32_t IMU_ReceiveMsgsBlocking(imu_link_t link, uint32_t *msgs, int32_t desiredMsgCount, bool *needAckLock);\r\n\r\n/*!\r\n * @brief Blocking to send messages pointer.\r\n *\r\n * Compared with @ref IMU_SendMsgsBlocking, this function fills message pointer\r\n * to TX FIFO, but not the message content.\r\n *\r\n * This function blocks until the message pointer is filled to TX FIFO.\r\n *\r\n * - If the TX FIFO is locked, this function returns IMU_ERR_TX_FIFO_LOCKED.\r\n * - If TX FIFO not locked, this function waits the available empty slot in TX FIFO,\r\n *   and fills the message pointer to TX FIFO.\r\n * - To lock TX FIFO after filling the message pointer, set @p lockSendFifo to true.\r\n *\r\n * @param link IMU link.\r\n * @param msgPtr The buffer pointer to message to send.\r\n * @param needAckLock Upper layer should always check this value. When this is\r\n * set to true by this function, upper layer should send lock ack message to peer CPU.\r\n * @retval 0 The message pointer set successfully.\r\n * @retval IMU_ERR_TX_FIFO_LOCKED The TX FIFO is locked, send failed.\r\n */\r\nint32_t IMU_SendMsgPtrBlocking(imu_link_t link, uint32_t msgPtr, bool lockSendFifo);\r\n\r\n/*!\r\n * @brief Lock or unlock the TX FIFO.\r\n *\r\n * @param link IMU link.\r\n * @param lock Use true to lock the FIFO, use false to unlock.\r\n */\r\nstatic inline void IMU_LockSendFifo(imu_link_t link, bool lock)\r\n{\r\n    if (lock)\r\n    {\r\n        ((IMU_Type *)(uintptr_t)IMU_CUR_CPU_BASE(link))->MSG_FIFO_CNTL |= IMU_MSG_FIFO_CNTL_WAIT_FOR_ACK_MASK;\r\n    }\r\n    else\r\n    {\r\n        ((IMU_Type *)(uintptr_t)IMU_CUR_CPU_BASE(link))->MSG_FIFO_CNTL &= ~IMU_MSG_FIFO_CNTL_WAIT_FOR_ACK_MASK;\r\n    }\r\n}\r\n\r\n/*!\r\n * @brief Flush the send FIFO.\r\n *\r\n * Flush all messages in send FIFO.\r\n *\r\n * @param link IMU link.\r\n */\r\nvoid IMU_FlushSendFifo(imu_link_t link);\r\n\r\n/*!\r\n * @brief Set send FIFO warter mark.\r\n *\r\n * The warter mark must be less than IMU_MAX_MSG_FIFO_WATER_MARK,\r\n * i.e. 0 < waterMark <= IMU_MAX_MSG_FIFO_WATER_MARK.\r\n *\r\n * @param link IMU link.\r\n * @param waterMark Send FIFO warter mark.\r\n */\r\nstatic inline void IMU_SetSendFifoWaterMark(imu_link_t link, uint8_t waterMark)\r\n{\r\n    uint32_t reg = ((IMU_Type *)(uintptr_t)IMU_CUR_CPU_BASE(link))->MSG_FIFO_CNTL;\r\n\r\n    reg &= ~IMU_MSG_FIFO_CNTL_FIFO_FULL_WATERMARK_MASK;\r\n    reg |= IMU_MSG_FIFO_CNTL_FIFO_FULL_WATERMARK(waterMark);\r\n\r\n    ((IMU_Type *)(uintptr_t)IMU_CUR_CPU_BASE(link))->MSG_FIFO_CNTL = reg;\r\n}\r\n\r\n/*!\r\n * @brief Get the message count in receive FIFO.\r\n *\r\n * @param link IMU link.\r\n * @return The message count in receive FIFO.\r\n */\r\nstatic inline uint32_t IMU_GetReceivedMsgCount(imu_link_t link)\r\n{\r\n    return IMU_RX_FIFO_MSG_COUNT(link);\r\n}\r\n\r\n/*!\r\n * @brief Get the empty slot in send FIFO.\r\n *\r\n * @param link IMU link.\r\n * @return The empty slot count in send FIFO.\r\n */\r\nstatic inline uint32_t IMU_GetSendFifoEmptySpace(imu_link_t link)\r\n{\r\n    return IMU_MSG_FIFO_MAX_COUNT - IMU_TX_FIFO_MSG_COUNT(link) - 1U;\r\n}\r\n\r\n/*! @} */\r\n\r\n/*!\r\n * @name Status and Interrupt.\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief Gets the IMU status flags.\r\n *\r\n * @param link IMU link.\r\n * @return Bit mask of the IMU status flags, see @ref _imu_status_flags.\r\n */\r\nuint32_t IMU_GetStatusFlags(imu_link_t link);\r\n\r\n/*!\r\n * @brief Clear the IMU IRQ\r\n *\r\n * @param link IMU link.\r\n * @param mask Bit mask of the interrupts to clear, see @ref _imu_interrupts.\r\n */\r\nstatic inline void IMU_ClearPendingInterrupts(imu_link_t link, uint32_t mask)\r\n{\r\n    ((IMU_Type *)(uintptr_t)IMU_CUR_CPU_BASE(link))->MSG_FIFO_CNTL |= mask;\r\n}\r\n\r\n/*! @} */\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif /*_cplusplus*/\r\n/*! @} */\r\n\r\n#endif /* FSL_IMU_H_*/\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_io_mux.h",
    "content": "/*\r\n * Copyright 2022-2024 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef _FSL_IO_MUX_H_\r\n#define _FSL_IO_MUX_H_\r\n\r\n#include \"fsl_common.h\"\r\n\r\n/*!\r\n * @addtogroup io_mux\r\n * @{\r\n */\r\n\r\n/*! @file */\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n/* Component ID definition, used by tools. */\r\n#ifndef FSL_COMPONENT_ID\r\n#define FSL_COMPONENT_ID \"platform.drivers.cns_io_mux\"\r\n#endif\r\n\r\n/*! @name Driver version */\r\n/*@{*/\r\n/*! @brief IO_MUX driver version 2.2.0. */\r\n#define FSL_IO_MUX_DRIVER_VERSION (MAKE_VERSION(2, 2, 0))\r\n/*@}*/\r\n\r\n/*!\r\n * @name Pin function ID\r\n * The pin function ID is a tuple of \\<GPIO_0_31_Mask GPIO_32_63_Mask GPIO_FC_SetMask GPIO_FC_ClearMask FSEL_SetMask\r\n * FSEL_ClearMask CTimer_SetMask CTimer_ClearMask SCTimerSetMask SCTimerClearMask\\>\r\n *\r\n * GPIO_FC_xxxMask:   bit[0:10] maps to FCn[0:10];\r\n *                    bit[15:12] is the register offset from FC0;\r\n *                    bit[16] indicates GPIO should be operated;\r\n *                    bit[17] indicates SGPIO need to be operated.\r\n * CTimer_xxxMask:    bit[0:14] maps to C_TIMER_IN[0:14];\r\n *                    bit[16:30] maps to C_TIMER_OUT[0:14].\r\n * @{\r\n */\r\n#define IO_MUX_GPIO_FC_MASK(gpio, fcIdx, fcMsk) \\\r\n    (((uint32_t)(gpio) << 16) | (((uint32_t)(fcIdx)&0xFUL) << 12) | ((uint32_t)(fcMsk)&0xFFFUL))\r\n#define IO_MUX_SGPIO_FLAG(mask) (((uint32_t)(mask) >> 17) & 1UL)\r\n#define IO_MUX_GPIO_FLAG(mask)  (((uint32_t)(mask) >> 16) & 1UL)\r\n#define IO_MUX_FC_OFFSET(mask)  (((uint32_t)(mask) >> 12) & 0xFUL)\r\n#define IO_MUX_FC_MASK(mask)    ((uint32_t)(mask)&0x7FFUL)\r\n\r\n#define IO_MUX_CTIMER_MASK(inMsk, outMsk) (((uint32_t)(outMsk) << 16) | ((uint32_t)(inMsk)&0xFFFFUL))\r\n#define IO_MUX_CTIMER_IN_MASK(mask)       ((uint32_t)(mask)&0x7FFFUL)\r\n#define IO_MUX_CTIMER_OUT_MASK(mask)      (((uint32_t)(mask) >> 16) & 0x7FFFUL)\r\n\r\n#define IO_MUX_SCTIMER_MASK(inMsk, outMsk) ((((uint32_t)(outMsk)&0x3FFUL) << 16) | ((uint32_t)(inMsk)&0xFFUL))\r\n\r\n#define IO_MUX_FC0_USART_SCK                                                                   \\\r\n    0x00000010U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0x001), IO_MUX_GPIO_FC_MASK(1, 0, 0x02C), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00800000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),                 /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x2, 0x2)            /* SCTimer mask */\r\n\r\n#define IO_MUX_FC0_USART_DATA                                                                  \\\r\n    0x0000000CU, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0x200), IO_MUX_GPIO_FC_MASK(1, 0, 0x12E), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),                 /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x1, 0x1)            /* SCTimer mask */\r\n\r\n#define IO_MUX_FC0_USART_CMD                                                                   \\\r\n    0x00000021U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0x400), IO_MUX_GPIO_FC_MASK(1, 0, 0x038), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000040U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x1, 0x1),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC0_I2C_2_3                                                                     \\\r\n    0x0000000CU, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0x002), IO_MUX_GPIO_FC_MASK(1, 0, 0x32C), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),                 /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x1, 0x1)            /* SCTimer mask */\r\n\r\n#define IO_MUX_FC0_I2S                                                                         \\\r\n    0x0000001CU, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0x004), IO_MUX_GPIO_FC_MASK(1, 0, 0x32B), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00800000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),                 /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x3, 0x3)            /* SCTimer mask */\r\n\r\n#define IO_MUX_FC0_I2S_DATA                                                                    \\\r\n    0x00000004U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0x100), IO_MUX_GPIO_FC_MASK(1, 0, 0x22E), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),                 /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC0_SPI_SS0                                                                     \\\r\n    0x0000001DU, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0x008), IO_MUX_GPIO_FC_MASK(1, 0, 0x737), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00800000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x1, 0x1),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x3, 0x3)            /* SCTimer mask */\r\n\r\n#define IO_MUX_FC1_USART_SCK                                                                   \\\r\n    0x00000080U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 1, 0x001), IO_MUX_GPIO_FC_MASK(1, 1, 0x0EC), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),                 /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC1_USART_DATA                                                                  \\\r\n    0x00000300U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 1, 0x200), IO_MUX_GPIO_FC_MASK(1, 1, 0x1EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),                 /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC1_USART_CMD                                                                   \\\r\n    0x00000440U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 1, 0x400), IO_MUX_GPIO_FC_MASK(1, 1, 0x038), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x01000000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),                 /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC1_I2C_8_9                                                                     \\\r\n    0x00000300U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 1, 0x002), IO_MUX_GPIO_FC_MASK(1, 1, 0x3EC), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),                 /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC1_I2S                                                                         \\\r\n    0x00000380U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 1, 0x004), IO_MUX_GPIO_FC_MASK(1, 1, 0x3EB), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),                 /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC1_I2S_DATA                                                                    \\\r\n    0x00000200U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 1, 0x100), IO_MUX_GPIO_FC_MASK(1, 1, 0x2EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),                 /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC1_SPI_SS0                                                                     \\\r\n    0x000003C0U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 1, 0x008), IO_MUX_GPIO_FC_MASK(1, 1, 0x7F7), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x01000000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),                 /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC2_USART_SCK                                                                   \\\r\n    0x00008000U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 2, 0x001), IO_MUX_GPIO_FC_MASK(1, 2, 0x0EC), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00008400U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),                 /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC2_USART_DATA                                                                  \\\r\n    0x00006000U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 2, 0x200), IO_MUX_GPIO_FC_MASK(1, 2, 0x1EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x18, 0x18),           /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC2_USART_CMD                                                                   \\\r\n    0x00030000U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 2, 0x400), IO_MUX_GPIO_FC_MASK(1, 2, 0x038), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00008400U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),                 /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC2_I2C_13_14                                                                   \\\r\n    0x00006000U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 2, 0x002), IO_MUX_GPIO_FC_MASK(1, 2, 0x3EC), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x18, 0x18),           /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC2_I2C_16_17                                                                   \\\r\n    0x00030000U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 2, 0x010), IO_MUX_GPIO_FC_MASK(1, 2, 0x428), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00008400U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),                 /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC2_I2S                                                                         \\\r\n    0x0000E000U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 2, 0x004), IO_MUX_GPIO_FC_MASK(1, 2, 0x3EB), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00008400U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x18, 0x18),           /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC2_I2S_DATA                                                                    \\\r\n    0x00002000U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 2, 0x100), IO_MUX_GPIO_FC_MASK(1, 2, 0x2EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x18, 0x18),           /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC2_SPI_SS0                                                                     \\\r\n    0x0001E000U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 2, 0x008), IO_MUX_GPIO_FC_MASK(1, 2, 0x7F7), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00008400U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x18, 0x18),           /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC3_USART_SCK                                                                   \\\r\n    0x02000000U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 3, 0x001), IO_MUX_GPIO_FC_MASK(1, 3, 0x0EC), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00010000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x80, 0x80),           /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC3_USART_DATA                                                                  \\\r\n    0x05000000U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 3, 0x200), IO_MUX_GPIO_FC_MASK(1, 3, 0x1EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0xC0000000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x40, 0x40),           /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x10, 0x10)          /* SCTimer mask */\r\n\r\n#define IO_MUX_FC3_USART_CMD                                                                   \\\r\n    0x00180000U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 3, 0x400), IO_MUX_GPIO_FC_MASK(1, 3, 0x038), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00008000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),                 /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC3_I2C_24_26                                                                   \\\r\n    0x05000000U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 3, 0x002), IO_MUX_GPIO_FC_MASK(1, 3, 0x3EC), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0xC0000000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x40, 0x40),           /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x10, 0x10)          /* SCTimer mask */\r\n\r\n#define IO_MUX_FC3_I2C_19_20                                                                   \\\r\n    0x00180000U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 3, 0x010), IO_MUX_GPIO_FC_MASK(1, 3, 0x428), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00008000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),                 /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC3_I2S                                                                         \\\r\n    0x07000000U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 3, 0x004), IO_MUX_GPIO_FC_MASK(1, 3, 0x3EB), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0xC0010000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0xC0, 0xC0),           /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x10, 0x10)          /* SCTimer mask */\r\n\r\n#define IO_MUX_FC3_I2S_DATA                                                                    \\\r\n    0x01000000U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 3, 0x100), IO_MUX_GPIO_FC_MASK(1, 3, 0x2EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x40000000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x40, 0x40),           /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC3_SPI_SS0                                                                     \\\r\n    0x07100000U, 0x00000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 3, 0x008), IO_MUX_GPIO_FC_MASK(1, 3, 0x7F7), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0xC0018000U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0xC0, 0xC0),           /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x10, 0x10)          /* SCTimer mask */\r\n\r\n#define IO_MUX_FC14_USART_SCK                                                                  \\\r\n    0x00000000U, 0x00400000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 6, 0x001), IO_MUX_GPIO_FC_MASK(3, 6, 0x0EC), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00200810U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x4000, 0x4000),       /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC14_USART_DATA                                                                 \\\r\n    0x00000000U, 0x03000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 6, 0x200), IO_MUX_GPIO_FC_MASK(3, 6, 0x1EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x08000800U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),                 /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC14_USART_CMD                                                                  \\\r\n    0x00000000U, 0x00A00000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 6, 0x400), IO_MUX_GPIO_FC_MASK(3, 6, 0x038), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00500810U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x2000, 0x2000),       /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0x200)            /* SCTimer mask */\r\n\r\n#define IO_MUX_FC14_I2C_56_57                                                                  \\\r\n    0x00000000U, 0x03000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 6, 0x002), IO_MUX_GPIO_FC_MASK(3, 6, 0x3EC), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x08000800U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),                 /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC14_I2S                                                                        \\\r\n    0x00000000U, 0x03400000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 6, 0x004), IO_MUX_GPIO_FC_MASK(3, 6, 0x3EB), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x08200810U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x4000, 0x4000),       /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC14_I2S_DATA                                                                   \\\r\n    0x00000000U, 0x02000000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 6, 0x100), IO_MUX_GPIO_FC_MASK(3, 6, 0x2EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x08000800U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),                 /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_FC14_SPI_SS0                                                                    \\\r\n    0x00000000U, 0x03600000U,                                               /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 6, 0x008), IO_MUX_GPIO_FC_MASK(3, 6, 0x7F7), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x08300810U,                                           /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x6000, 0x6000),       /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)                /* SCTimer mask */\r\n\r\n#define IO_MUX_QUAD_SPI_FLASH                                                          \\\r\n    0xF0000000U, 0x00000007U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000002U, 0x00000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_QUAD_SPI_PSRAM                                                          \\\r\n    0x00000000U, 0x000003F8U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000008U, 0x00000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x700, 0x700), /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0xC0, 0xC0)  /* SCTimer mask */\r\n\r\n#define IO_MUX_PDM                                                                         \\\r\n    0x00000000U, 0x00780000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 6, 0x4FD), /* GPIO&FC mask */ \\\r\n        0x00000010U, 0x003C0800U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x7800, 0x7800),   /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_USB                                                                         \\\r\n    0x00001000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 1, 0x080), /* GPIO&FC mask */ \\\r\n        0x00000020U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x4, 0x4),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_SCT_OUT_0                                                                   \\\r\n    0x00000008U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0x22E), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0x1), IO_MUX_SCTIMER_MASK(0x1, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SCT_OUT_1                                                                   \\\r\n    0x00000010U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0x02D), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00800000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0x2), IO_MUX_SCTIMER_MASK(0x2, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SCT_OUT_8                                                                   \\\r\n    0x00000800U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 1, 0x040), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0x100), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SCT_OUT_4                                                                   \\\r\n    0x04000000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 3, 0x2EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x80000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0x10), IO_MUX_SCTIMER_MASK(0x10, 0)      /* SCTimer mask */\r\n\r\n#define IO_MUX_SCT_OUT_5                                                               \\\r\n    0x08000000U, 0x00000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x10000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0x20), IO_MUX_SCTIMER_MASK(0x20, 0)  /* SCTimer mask */\r\n\r\n#define IO_MUX_SCT_OUT_6                                                               \\\r\n    0x00000000U, 0x00000008U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0x40), IO_MUX_SCTIMER_MASK(0x40, 0)  /* SCTimer mask */\r\n\r\n#define IO_MUX_SCT_OUT_7                                                               \\\r\n    0x00000000U, 0x00000010U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0x80), IO_MUX_SCTIMER_MASK(0x80, 0)  /* SCTimer mask */\r\n\r\n#define IO_MUX_SCT_OUT_9                                                                   \\\r\n    0x00000000U, 0x00800000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 6, 0x430), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00400000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0x200), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SCT_IN_0                                                                    \\\r\n    0x00000008U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0x22E), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0x1, 0), IO_MUX_SCTIMER_MASK(0, 0x1)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SCT_IN_1                                                                    \\\r\n    0x00000010U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0x02D), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00800000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0x2, 0), IO_MUX_SCTIMER_MASK(0, 0x2)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SCT_IN_2                                                                    \\\r\n    0x00400000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 3, 0x040), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x04000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0x4, 0), IO_MUX_SCTIMER_MASK(0, 0)          /* SCTimer mask */\r\n\r\n#define IO_MUX_SCT_IN_3                                                                    \\\r\n    0x00800000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 3, 0x080), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x04000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0x8, 0), IO_MUX_SCTIMER_MASK(0, 0)          /* SCTimer mask */\r\n\r\n#define IO_MUX_SCT_IN_4                                                                    \\\r\n    0x04000000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 3, 0x2EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x80000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0x10, 0), IO_MUX_SCTIMER_MASK(0, 0x10)      /* SCTimer mask */\r\n\r\n#define IO_MUX_SCT_IN_5                                                                \\\r\n    0x08000000U, 0x00000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x10000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0x20, 0), IO_MUX_SCTIMER_MASK(0, 0x20)  /* SCTimer mask */\r\n\r\n#define IO_MUX_SCT_IN_6                                                                \\\r\n    0x00000000U, 0x00000008U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0x40, 0), IO_MUX_SCTIMER_MASK(0, 0x40)  /* SCTimer mask */\r\n\r\n#define IO_MUX_SCT_IN_7                                                                \\\r\n    0x00000000U, 0x00000010U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0x80, 0), IO_MUX_SCTIMER_MASK(0, 0x80)  /* SCTimer mask */\r\n\r\n#define IO_MUX_CT0_MAT0_OUT                                                                \\\r\n    0x00000001U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0x418), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0x1), IO_MUX_CTIMER_MASK(0x1, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_CT0_MAT1_OUT                                                            \\\r\n    0x00000002U, 0x00000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0x2), IO_MUX_CTIMER_MASK(0x2, 0),     /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_CT0_MAT2_OUT                                                                \\\r\n    0x00001000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 1, 0x080), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000020U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0x4), IO_MUX_CTIMER_MASK(0x4, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_CT0_MAT3_OUT                                                                \\\r\n    0x00002000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 2, 0x3EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0x8), IO_MUX_CTIMER_MASK(0x8, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_CT1_MAT0_OUT                                                                \\\r\n    0x00004000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 2, 0x2EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0x10), IO_MUX_CTIMER_MASK(0x10, 0),       /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_CT1_MAT1_OUT                                                                \\\r\n    0x00200000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 2, 0x040), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0x20), IO_MUX_CTIMER_MASK(0x20, 0),       /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_CT1_MAT2_OUT                                                                \\\r\n    0x01000000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 3, 0x3EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x40000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0x40), IO_MUX_CTIMER_MASK(0x40, 0),       /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_CT1_MAT3_OUT                                                                \\\r\n    0x02000000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 3, 0x0ED), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00010000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0x80), IO_MUX_CTIMER_MASK(0x80, 0),       /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_CT2_MAT0_OUT                                                            \\\r\n    0x00000000U, 0x00000020U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0x100), IO_MUX_CTIMER_MASK(0x100, 0), /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_CT2_MAT1_OUT                                                            \\\r\n    0x00000000U, 0x00000040U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0x200), IO_MUX_CTIMER_MASK(0x200, 0), /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_CT2_MAT2_OUT                                                            \\\r\n    0x00000000U, 0x00000080U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0x400), IO_MUX_CTIMER_MASK(0x400, 0), /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_CT2_MAT3_OUT                                                                \\\r\n    0x00000000U, 0x00080000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 6, 0x040), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00040810U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0x800), IO_MUX_CTIMER_MASK(0x800, 0),     /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_CT3_MAT0_OUT                                                                \\\r\n    0x00000000U, 0x00100000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 6, 0x080), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00080810U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0x1000), IO_MUX_CTIMER_MASK(0x1000, 0),   /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_CT3_MAT1_OUT                                                                \\\r\n    0x00000000U, 0x00200000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 6, 0x418), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00100810U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0x2000), IO_MUX_CTIMER_MASK(0x2000, 0),   /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_CT3_MAT2_OUT                                                               \\\r\n    0x00000000U, 0x00400000U,                                          /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 6, 0xED), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00200810U,                                      /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0x4000), IO_MUX_CTIMER_MASK(0x4000, 0),  /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)           /* SCTimer mask */\r\n\r\n#define IO_MUX_CT_INP0                                                                     \\\r\n    0x00000001U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0x418), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0x1, 0), IO_MUX_CTIMER_MASK(0, 0x1),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_CT_INP1                                                                 \\\r\n    0x00000002U, 0x00000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0x2, 0), IO_MUX_CTIMER_MASK(0, 0x2),     /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_CT_INP2                                                                     \\\r\n    0x00001000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 1, 0x080), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000020U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0x4, 0), IO_MUX_CTIMER_MASK(0, 0x4),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_CT_INP3                                                                     \\\r\n    0x00002000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 2, 0x3EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0x8, 0), IO_MUX_CTIMER_MASK(0, 0x8),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_CT_INP4                                                                     \\\r\n    0x00004000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 2, 0x2EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0x10, 0), IO_MUX_CTIMER_MASK(0, 0x10),       /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_CT_INP5                                                                     \\\r\n    0x00200000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 2, 0x040), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0x20, 0), IO_MUX_CTIMER_MASK(0, 0x20),       /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_CT_INP6                                                                     \\\r\n    0x01000000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 3, 0x3EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x40000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0x40, 0), IO_MUX_CTIMER_MASK(0, 0x40),       /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_CT_INP7                                                                     \\\r\n    0x02000000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 3, 0x0ED), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00010000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0x80, 0), IO_MUX_CTIMER_MASK(0, 0x80),       /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_CT_INP8                                                                 \\\r\n    0x00000000U, 0x00000020U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0x100, 0), IO_MUX_CTIMER_MASK(0, 0x100), /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_CT_INP9                                                                 \\\r\n    0x00000000U, 0x00000040U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0x200, 0), IO_MUX_CTIMER_MASK(0, 0x200), /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_CT_INP10                                                                \\\r\n    0x00000000U, 0x00000080U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0x400, 0), IO_MUX_CTIMER_MASK(0, 0x400), /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_CT_INP11                                                                    \\\r\n    0x00000000U, 0x00080000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 6, 0x040), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00040810U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0x800, 0), IO_MUX_CTIMER_MASK(0, 0x800),     /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_CT_INP12                                                                    \\\r\n    0x00000000U, 0x00100000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 6, 0x080), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00080810U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0x1000, 0), IO_MUX_CTIMER_MASK(0, 0x1000),   /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_CT_INP13                                                                    \\\r\n    0x00000000U, 0x00200000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 6, 0x418), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00100810U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0x2000, 0), IO_MUX_CTIMER_MASK(0, 0x2000),   /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_CT_INP14                                                                   \\\r\n    0x00000000U, 0x00400000U,                                          /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 6, 0xED), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00200810U,                                      /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0x4000, 0), IO_MUX_CTIMER_MASK(0, 0x4000),  /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)           /* SCTimer mask */\r\n\r\n#define IO_MUX_MCLK                                                                        \\\r\n    0x00000020U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0x430), /* GPIO&FC mask */ \\\r\n        0x00000040U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_UTICK                                                                       \\\r\n    0x00078000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 2, 0x4FD), /* GPIO&FC mask */ \\\r\n        0x00000200U, 0x0000C400U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_USIM                                                                        \\\r\n    0x00078000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 2, 0x4FD), /* GPIO&FC mask */ \\\r\n        0x00000400U, 0x0000C200U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_LCD_8080                                                                    \\\r\n    0x00000000U, 0x037BFC00U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 6, 0x7FF), /* GPIO&FC mask */ \\\r\n        0x00000800U, 0x083C1010U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x7800, 0x7800),   /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_LCD_SPI                                                                 \\\r\n    0x00000000U, 0x0003F000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00001000U, 0x00000800U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_FREQ_GPIO_CLK                                                           \\\r\n    0x00000000U, 0x00040000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00002000U, 0x00020000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO_INT_BMATCH                                                             \\\r\n    0x00040000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 2, 0x080), /* GPIO&FC mask */ \\\r\n        0x00004000U, 0x00008600U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GAU_TRIGGER0                                                            \\\r\n    0x00000000U, 0x00040000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00020000U, 0x00002000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_ACOMP0_GPIO_OUT                                                             \\\r\n    0x00000000U, 0x00080000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 6, 0x040), /* GPIO&FC mask */ \\\r\n        0x00040000U, 0x00000810U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x800, 0x800),     /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_ACOMP0_EDGE_PULSE                                                           \\\r\n    0x00000000U, 0x00100000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 6, 0x080), /* GPIO&FC mask */ \\\r\n        0x00080000U, 0x00000810U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x1000, 0x1000),   /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_ACOMP1_GPIO_OUT                                                             \\\r\n    0x00000000U, 0x00200000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 6, 0x418), /* GPIO&FC mask */ \\\r\n        0x00100000U, 0x00000810U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x2000, 0x2000),   /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_ACOMP1_EDGE_PULSE                                                           \\\r\n    0x00000000U, 0x00400000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 6, 0x0ED), /* GPIO&FC mask */ \\\r\n        0x00200000U, 0x00000810U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x4000, 0x4000),   /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GAU_TRIGGER1                                                                \\\r\n    0x00000000U, 0x00800000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 6, 0x430), /* GPIO&FC mask */ \\\r\n        0x00400000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0x200)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SDIO                                                                      \\\r\n    0x001F9000U, 0x00000000U,                                         /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0xF, 0), /* GPIO&FC mask */ \\\r\n        0x00008000U, 0x00004620U,                                     /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x4, 0x4),       /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)          /* SCTimer mask */\r\n\r\n#define IO_MUX_ENET_CLK                                                                    \\\r\n    0x02000000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 3, 0x0ED), /* GPIO&FC mask */ \\\r\n        0x00010000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x80, 0x80),       /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_ENET_RX                                                                     \\\r\n    0x00C00000U, 0xC0000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 3, 0x0C0), /* GPIO&FC mask */ \\\r\n        0x04000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0xC, 0)          /* SCTimer mask */\r\n\r\n#define IO_MUX_ENET_TX                                                                 \\\r\n    0x00000000U, 0x1C000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 0, 0), /* GPIO&FC mask */ \\\r\n        0x02000000U, 0x00000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_ENET_MDIO                                                                   \\\r\n    0x00000000U, 0x03000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 6, 0x3EE), /* GPIO&FC mask */ \\\r\n        0x08000000U, 0x00000800U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_ENET_TIMER0                                                             \\\r\n    0x08000000U, 0x00000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x10000000U, 0x00000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x20, 0x20)  /* SCTimer mask */\r\n\r\n#define IO_MUX_ENET_TIMER1                                                             \\\r\n    0x00000000U, 0x20000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(3, 0, 0), /* GPIO&FC mask */ \\\r\n        0x20000000U, 0x00000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_ENET_TIMER2                                                                 \\\r\n    0x01000000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 3, 0x3EE), /* GPIO&FC mask */ \\\r\n        0x40000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x40, 0x40),       /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_ENET_TIMER3                                                                 \\\r\n    0x04000000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 3, 0x2EE), /* GPIO&FC mask */ \\\r\n        0x80000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x10, 0x10)      /* SCTimer mask */\r\n\r\n#define IO_MUX_CLKIN_FRM_PD                                                                \\\r\n    0x00000010U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0x02D), /* GPIO&FC mask */ \\\r\n        0x00800000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x2, 0x2)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO0                                                                       \\\r\n    0x00000001U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 0, 0x418), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x1, 0x1),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO1                                                                   \\\r\n    0x00000002U, 0x00000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x2, 0x2),     /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO2                                                                       \\\r\n    0x00000004U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 0, 0x32E), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO3                                                                       \\\r\n    0x00000008U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 0, 0x22E), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x1, 0x1)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO4                                                                       \\\r\n    0x00000010U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 0, 0x02D), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00800000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x2, 0x2)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO5                                                                       \\\r\n    0x00000020U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 0, 0x430), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO6                                                                       \\\r\n    0x00000040U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 1, 0x418), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x01000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO7                                                                       \\\r\n    0x00000080U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 1, 0x0ED), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO8                                                                       \\\r\n    0x00000100U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 1, 0x2EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO9                                                                       \\\r\n    0x00000200U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 1, 0x3EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO10                                                                      \\\r\n    0x00000400U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 1, 0x430), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO11                                                                      \\\r\n    0x00000800U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 1, 0x040), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0x100)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO12                                                                      \\\r\n    0x00001000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 1, 0x080), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00008020U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x4, 0x4),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO13                                                                      \\\r\n    0x00002000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 2, 0x3EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x8, 0x8),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO14                                                                      \\\r\n    0x00004000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 2, 0x2EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x10, 0x10),       /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO15                                                                      \\\r\n    0x00008000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 2, 0x0ED), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00008600U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO16                                                                      \\\r\n    0x00010000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 2, 0x418), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00008600U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO17                                                                      \\\r\n    0x00020000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 2, 0x430), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00008600U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO18                                                                      \\\r\n    0x00040000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 2, 0x080), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x0000C600U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO19                                                                      \\\r\n    0x00080000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 3, 0x430), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00008000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO20                                                                      \\\r\n    0x00100000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 3, 0x418), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00008000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO21                                                                      \\\r\n    0x00200000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 2, 0x040), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x20, 0x20),       /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO22                                                                      \\\r\n    0x00400000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 3, 0x040), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x04000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x4, 0)          /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO23                                                                      \\\r\n    0x00800000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 3, 0x080), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x04000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x8, 0)          /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO24                                                                      \\\r\n    0x01000000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 3, 0x3EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x40000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x40, 0x40),       /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO25                                                                      \\\r\n    0x02000000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 3, 0x0ED), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00010000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x80, 0x80),       /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO26                                                                      \\\r\n    0x04000000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 3, 0x2EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x80000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x10, 0x10)      /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO27                                                                  \\\r\n    0x08000000U, 0x00000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x10000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x20, 0x20)  /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO28                                                                  \\\r\n    0x10000000U, 0x00000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000002U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO29                                                                  \\\r\n    0x20000000U, 0x00000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000002U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO30                                                                  \\\r\n    0x40000000U, 0x00000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000002U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO31                                                                  \\\r\n    0x80000000U, 0x00000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(0, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000002U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO32                                                                  \\\r\n    0x00000000U, 0x00000001U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000002U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO33                                                                  \\\r\n    0x00000000U, 0x00000002U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000002U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO34                                                                  \\\r\n    0x00000000U, 0x00000004U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000002U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO35                                                                  \\\r\n    0x00000000U, 0x00000008U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x40, 0x40)  /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO36                                                                  \\\r\n    0x00000000U, 0x00000010U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x80, 0x80)  /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO37                                                                  \\\r\n    0x00000000U, 0x00000020U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x100, 0x100), /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO38                                                                  \\\r\n    0x00000000U, 0x00000040U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x200, 0x200), /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO39                                                                  \\\r\n    0x00000000U, 0x00000080U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x400, 0x400), /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO40                                                                  \\\r\n    0x00000000U, 0x00000100U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO41                                                                  \\\r\n    0x00000000U, 0x00000200U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO42                                                                  \\\r\n    0x00000000U, 0x00000400U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000800U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO43                                                                  \\\r\n    0x00000000U, 0x00000800U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000800U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO44                                                                  \\\r\n    0x00000000U, 0x00001000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00001800U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO45                                                                  \\\r\n    0x00000000U, 0x00002000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00001800U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO46                                                                  \\\r\n    0x00000000U, 0x00004000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00001800U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO47                                                                  \\\r\n    0x00000000U, 0x00008000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00001800U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO48                                                                  \\\r\n    0x00000000U, 0x00010000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00001800U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO49                                                                  \\\r\n    0x00000000U, 0x00020000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00001800U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO50                                                                  \\\r\n    0x00000000U, 0x00040000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00022000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO51                                                                      \\\r\n    0x00000000U, 0x00080000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 6, 0x040), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00040810U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x800, 0x800),     /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO52                                                                      \\\r\n    0x00000000U, 0x00100000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 6, 0x080), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00080810U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x1000, 0x1000),   /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO53                                                                      \\\r\n    0x00000000U, 0x00200000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 6, 0x418), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00100810U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x2000, 0x2000),   /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO54                                                                     \\\r\n    0x00000000U, 0x00400000U,                                          /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 6, 0xED), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00200810U,                                      /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x4000, 0x4000),  /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)           /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO55                                                                      \\\r\n    0x00000000U, 0x00800000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 6, 0x430), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00400000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0x200)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO56                                                                      \\\r\n    0x00000000U, 0x01000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 6, 0x2EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x08000800U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO57                                                                      \\\r\n    0x00000000U, 0x02000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 6, 0x3EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x08000800U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO58                                                                  \\\r\n    0x00000000U, 0x04000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x02000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO59                                                                  \\\r\n    0x00000000U, 0x08000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x02000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO60                                                                  \\\r\n    0x00000000U, 0x10000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x02000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO61                                                                  \\\r\n    0x00000000U, 0x20000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x20000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO62                                                                  \\\r\n    0x00000000U, 0x40000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x04000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_GPIO63                                                                  \\\r\n    0x00000000U, 0x80000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(1, 0, 0), IO_MUX_GPIO_FC_MASK(2, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x04000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO0                                                                  \\\r\n    0x00000000U, 0x00000001U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000002U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO1                                                                  \\\r\n    0x00000000U, 0x00000002U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000002U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO2                                                                  \\\r\n    0x00000000U, 0x00000004U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000002U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO3                                                                  \\\r\n    0x00000000U, 0x00000008U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x40, 0x40)  /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO4                                                                  \\\r\n    0x00000000U, 0x00000010U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x80, 0x80)  /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO5                                                                  \\\r\n    0x00000000U, 0x00000020U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x100, 0x100), /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO6                                                                  \\\r\n    0x00000000U, 0x00000040U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x200, 0x200), /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO7                                                                  \\\r\n    0x00000000U, 0x00000080U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x400, 0x400), /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO8                                                                  \\\r\n    0x00000000U, 0x00000100U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO9                                                                  \\\r\n    0x00000000U, 0x00000200U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000008U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO10                                                                 \\\r\n    0x00000000U, 0x00000400U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000800U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO11                                                                 \\\r\n    0x00000000U, 0x00000800U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00000800U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO12                                                                 \\\r\n    0x00000000U, 0x00001000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00001800U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO13                                                                 \\\r\n    0x00000000U, 0x00002000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00001800U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO14                                                                 \\\r\n    0x00000000U, 0x00004000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00001800U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO15                                                                 \\\r\n    0x00000000U, 0x00008000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00001800U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO16                                                                 \\\r\n    0x00000000U, 0x00010000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00001800U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO17                                                                 \\\r\n    0x00000000U, 0x00020000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00001800U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO18                                                                 \\\r\n    0x00000000U, 0x00040000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00022000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO19                                                                     \\\r\n    0x00000000U, 0x00080000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 6, 0x040), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00040810U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x800, 0x800),     /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO20                                                                     \\\r\n    0x00000000U, 0x00100000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 6, 0x080), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00080810U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x1000, 0x1000),   /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO21                                                                     \\\r\n    0x00000000U, 0x00200000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 6, 0x418), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00100810U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x2000, 0x2000),   /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO22                                                                    \\\r\n    0x00000000U, 0x00400000U,                                          /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 6, 0xED), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00200810U,                                      /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0x4000, 0x4000),  /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)           /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO23                                                                     \\\r\n    0x00000000U, 0x00800000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 6, 0x430), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x00400000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0x200)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO24                                                                     \\\r\n    0x00000000U, 0x01000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 6, 0x2EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x08000800U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO25                                                                     \\\r\n    0x00000000U, 0x02000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 6, 0x3EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x08000800U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)            /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO26                                                                 \\\r\n    0x00000000U, 0x04000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x02000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO27                                                                 \\\r\n    0x00000000U, 0x08000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x02000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO28                                                                 \\\r\n    0x00000000U, 0x10000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x02000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO29                                                                 \\\r\n    0x00000000U, 0x20000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x20000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO30                                                                 \\\r\n    0x00000000U, 0x40000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x04000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_SGPIO31                                                                 \\\r\n    0x00000000U, 0x80000000U,                                       /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(2, 0, 0), IO_MUX_GPIO_FC_MASK(1, 0, 0), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x04000000U,                                   /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),         /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0, 0)        /* SCTimer mask */\r\n\r\n#define IO_MUX_AON_CAPTURE                                                                 \\\r\n    0x04000000U, 0x00000000U,                                           /* Pin mask */     \\\r\n        IO_MUX_GPIO_FC_MASK(0, 0, 0), IO_MUX_GPIO_FC_MASK(1, 3, 0x2EE), /* GPIO&FC mask */ \\\r\n        0x00000000U, 0x80000000U,                                       /* FSEL mask */    \\\r\n        IO_MUX_CTIMER_MASK(0, 0), IO_MUX_CTIMER_MASK(0, 0),             /* CTimer mask */  \\\r\n        IO_MUX_SCTIMER_MASK(0, 0), IO_MUX_SCTIMER_MASK(0x10, 0x10)      /* SCTimer mask */\r\n\r\n/*! @brief IO MUX pin configuration.\r\n      Bit [1:0] for pull configuration\r\n      Bit [3:2] for drive strength configuration\r\n */\r\ntypedef enum\r\n{\r\n    IO_MUX_PinConfigNoPullDriveWeakest   = 0x0U,\r\n    IO_MUX_PinConfigNoPullDriveWeak      = 0x4U,\r\n    IO_MUX_PinConfigNoPullDriveStrong    = 0x8U,\r\n    IO_MUX_PinConfigNoPullDriveStrongest = 0xCU,\r\n\r\n    IO_MUX_PinConfigPullUpDriveWeakest   = 0x1U,\r\n    IO_MUX_PinConfigPullUpDriveWeak      = 0x5U,\r\n    IO_MUX_PinConfigPullUpDriveStrong    = 0x9U,\r\n    IO_MUX_PinConfigPullUpDriveStrongest = 0xDU,\r\n\r\n    IO_MUX_PinConfigPullDownDriveWeakest   = 0x2U,\r\n    IO_MUX_PinConfigPullDownDriveWeak      = 0x6U,\r\n    IO_MUX_PinConfigPullDownDriveStrong    = 0xAU,\r\n    IO_MUX_PinConfigPullDownDriveStrongest = 0xEU,\r\n\r\n    IO_MUX_PinConfigNoPull   = IO_MUX_PinConfigNoPullDriveStrongest,\r\n    IO_MUX_PinConfigPullUp   = IO_MUX_PinConfigPullUpDriveStrongest,\r\n    IO_MUX_PinConfigPullDown = IO_MUX_PinConfigPullDownDriveStrongest,\r\n} io_mux_pin_config_t;\r\n\r\n/*! @brief IO MUX sleep pin level */\r\ntypedef enum\r\n{\r\n    IO_MUX_SleepPinLevelLow       = 0U,\r\n    IO_MUX_SleepPinLevelHigh      = 1U,\r\n    IO_MUX_SleepPinLevelUnchanged = 2U,\r\n} io_mux_sleep_pin_level_t;\r\n\r\n/*@}*/\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif /*__cplusplus */\r\n\r\n/*! @name Configuration */\r\n/*@{*/\r\n\r\n/*!\r\n * @brief Sets the IO_MUX pin mux mode.\r\n * @note The parameters can be filled with the pin function ID macros.\r\n *\r\n * This is an example to set the GPIO2/GPIO3 as the Flexcomm0 UART RX/TX:\r\n * @code\r\n * IO_MUX_SetPinMux(IO_MUX_FC0_USART_DATA);\r\n * @endcode\r\n *\r\n * This is an example to set the GPIO6/GPIO10 as Flexcomm1 I2C SDA/SCL:\r\n * @code\r\n * IO_MUX_SetPinMux(IO_MUX_FC1_I2C_6_10);\r\n * @endcode\r\n *\r\n * @param pinLowMask     The GPIO0-31 pins mask.\r\n * @param pinHighMask    The GPIO32-63 pins mask.\r\n * @param gpioFcSetMask  The GPIO and Flexcomm registers mask to set, defined by IO_MUX_GPIO_FC_MASK()\r\n * @param gpioFcClrMask  The GPIO and Flexcomm registers mask to clear, defined by IO_MUX_GPIO_FC_MASK()\r\n * @param fselSetMask    The FSEL register mask to set\r\n * @param fselClrMask    The FSEL register mask to clear\r\n * @param ctimerSetMask  The C_TIMER_IN/C_TIMER_OUT register mask to set, defined by IO_MUX_CTIMER_MASK()\r\n * @param ctimerClrMask  The C_TIMER_IN/C_TIMER_OUT register mask to clear, defined by IO_MUX_CTIMER_MASK()\r\n * @param sctimerSetMask The SC_TIMER register mask to set\r\n * @param sctimerClrMask The SC_TIMER register mask to clear\r\n */\r\nstatic inline void IO_MUX_SetPinMux(uint32_t pinLowMask,\r\n                                    uint32_t pinHighMask,\r\n                                    uint32_t gpioFcSetMask,\r\n                                    uint32_t gpioFcClrMask,\r\n                                    uint32_t fselSetMask,\r\n                                    uint32_t fselClrMask,\r\n                                    uint32_t ctimerSetMask,\r\n                                    uint32_t ctimerClrMask,\r\n                                    uint32_t sctimerSetMask,\r\n                                    uint32_t sctimerClrMask)\r\n{\r\n    volatile uint32_t *fcBase = (volatile uint32_t *)&MCI_IO_MUX->FC0;\r\n    uint32_t aonMask;\r\n\r\n    /* Fist clear all conflicted io_mux function. */\r\n    if (IO_MUX_SGPIO_FLAG(gpioFcClrMask) != 0U)\r\n    {\r\n        MCI_IO_MUX->S_GPIO &= ~pinHighMask;\r\n    }\r\n    if (IO_MUX_GPIO_FLAG(gpioFcClrMask) != 0U)\r\n    {\r\n        MCI_IO_MUX->GPIO_GRP0 &= ~pinLowMask;\r\n        MCI_IO_MUX->GPIO_GRP1 &= ~pinHighMask;\r\n    }\r\n\r\n    if (IO_MUX_FC_OFFSET(gpioFcClrMask) == 0xFU) /* Special case for SDIO */\r\n    {\r\n        assert(fselSetMask == MCI_IO_MUX_FSEL_SEL_SDIO_MASK);\r\n        MCI_IO_MUX->FC1 &= ~0x080UL;\r\n        MCI_IO_MUX->FC2 &= ~0x4FDUL;\r\n        MCI_IO_MUX->FC3 &= ~0x438UL;\r\n    }\r\n    else if (IO_MUX_FC_MASK(gpioFcClrMask) != 0U)\r\n    {\r\n        *(fcBase + IO_MUX_FC_OFFSET(gpioFcClrMask)) &= ~IO_MUX_FC_MASK(gpioFcClrMask);\r\n    }\r\n    else\r\n    {\r\n        /* FC register change not needed. */\r\n    }\r\n\r\n    if (fselClrMask != 0U)\r\n    {\r\n        MCI_IO_MUX->FSEL &= ~fselClrMask;\r\n    }\r\n    if (IO_MUX_CTIMER_IN_MASK(ctimerClrMask) != 0U)\r\n    {\r\n        MCI_IO_MUX->C_TIMER_IN &= ~IO_MUX_CTIMER_IN_MASK(ctimerClrMask);\r\n    }\r\n    if (IO_MUX_CTIMER_OUT_MASK(ctimerClrMask) != 0U)\r\n    {\r\n        MCI_IO_MUX->C_TIMER_OUT &= ~IO_MUX_CTIMER_OUT_MASK(ctimerClrMask);\r\n    }\r\n    if (sctimerClrMask != 0U)\r\n    {\r\n        MCI_IO_MUX->SC_TIMER &= ~sctimerClrMask;\r\n    }\r\n\r\n    /* Now set the IO_MUX for the function. */\r\n    if (IO_MUX_SGPIO_FLAG(gpioFcSetMask) != 0U)\r\n    {\r\n        MCI_IO_MUX->S_GPIO |= pinHighMask;\r\n    }\r\n    if (IO_MUX_GPIO_FLAG(gpioFcSetMask) != 0U)\r\n    {\r\n        MCI_IO_MUX->GPIO_GRP0 |= pinLowMask;\r\n        MCI_IO_MUX->GPIO_GRP1 |= pinHighMask;\r\n    }\r\n\r\n    if (IO_MUX_FC_MASK(gpioFcSetMask) != 0U)\r\n    {\r\n        *(fcBase + IO_MUX_FC_OFFSET(gpioFcSetMask)) |= IO_MUX_FC_MASK(gpioFcSetMask);\r\n    }\r\n\r\n    if (fselSetMask != 0U)\r\n    {\r\n        MCI_IO_MUX->FSEL |= fselSetMask;\r\n    }\r\n    if (IO_MUX_CTIMER_IN_MASK(ctimerSetMask) != 0U)\r\n    {\r\n        MCI_IO_MUX->C_TIMER_IN |= IO_MUX_CTIMER_IN_MASK(ctimerSetMask);\r\n    }\r\n    if (IO_MUX_CTIMER_OUT_MASK(ctimerSetMask) != 0U)\r\n    {\r\n        MCI_IO_MUX->C_TIMER_OUT |= IO_MUX_CTIMER_OUT_MASK(ctimerSetMask);\r\n    }\r\n    if (sctimerSetMask != 0U)\r\n    {\r\n        MCI_IO_MUX->SC_TIMER |= sctimerSetMask;\r\n    }\r\n\r\n    /* Last, enable IO function */\r\n    aonMask = pinLowMask & AON_SOC_CIU_MCI_IOMUX_EN0_EN_27_22_MASK;\r\n    SOCCTRL->MCI_IOMUX_EN0 |= (pinLowMask & ~aonMask);\r\n    SOCCTRL->MCI_IOMUX_EN1 |= pinHighMask;\r\n    AON_SOC_CIU->MCI_IOMUX_EN0 |= aonMask;\r\n}\r\n\r\n/*!\r\n * @brief Sets the IO_MUX pin mux pull up/down configuartion.\r\n *\r\n * This is an example to set the GPIO2 pin to pull down:\r\n * @code\r\n * IO_MUX_SetPinConfig(2U, IO_MUX_PinConfigPullDown);\r\n * @endcode\r\n *\r\n * @param pin The GPIO pin index to config.\r\n * @param config The pull up/down setting for the pin.\r\n */\r\nstatic inline void IO_MUX_SetPinConfig(uint32_t pin, io_mux_pin_config_t config)\r\n{\r\n    __IO uint32_t *pullReg, *driveReg;\r\n    uint32_t shift;\r\n    uint32_t pullVal, driveVal;\r\n\r\n    assert(pin < 64U);\r\n\r\n    shift    = (pin % 16U) * 2U;\r\n    pullVal  = (uint32_t)config & 0x3U;\r\n    driveVal = ((uint32_t)config >> 2) & 0x3U;\r\n    if (pin < 22U || pin > 27U)\r\n    {\r\n        pullReg  = &SOCCTRL->PAD_PU_PD_EN0 + pin / 16U;\r\n        driveReg = &SOCCTRL->SR_CONFIG0 + pin / 16U;\r\n    }\r\n    else\r\n    {\r\n        pullReg  = &AON_SOC_CIU->PAD_PU_PD_EN1;\r\n        driveReg = &AON_SOC_CIU->SR_CONFIG1;\r\n    }\r\n\r\n    *pullReg  = (*pullReg & ~(3UL << shift)) | (pullVal << shift);\r\n    *driveReg = (*driveReg & ~(3UL << shift)) | (driveVal << shift);\r\n}\r\n\r\n/*!\r\n * @brief Sets IO output level in sleep mode. If level set to IO_MUX_SleepPinLevelUnchanged,\r\n *        the IO configuration is same as the active mode.\r\n *\r\n * This is an example to set the GPIO2 pin to output high during sleep:\r\n * @code\r\n * IO_MUX_SetPinOutLevelInSleep(2U, IO_MUX_SleepPinLevelHigh);\r\n * @endcode\r\n *\r\n * @param pin The GPIO pin index to config.\r\n * @param level Output level in sleep.\r\n */\r\nstatic inline void IO_MUX_SetPinOutLevelInSleep(uint32_t pin, io_mux_sleep_pin_level_t level)\r\n{\r\n    __IO uint32_t *regEn, *regVal;\r\n    uint32_t mask, shift;\r\n\r\n    assert(pin < 64U);\r\n\r\n    shift = pin % 32U;\r\n    mask  = 1UL << shift;\r\n\r\n    if (pin < 22U || pin > 27U)\r\n    {\r\n        if (pin < 32U)\r\n        {\r\n            regEn  = &SOCCTRL->PAD_SLP_EN0;\r\n            regVal = &SOCCTRL->PAD_SLP_VAL0;\r\n        }\r\n        else\r\n        {\r\n            regEn  = &SOCCTRL->PAD_SLP_EN1;\r\n            regVal = &SOCCTRL->PAD_SLP_VAL1;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        regEn  = &AON_SOC_CIU->PAD_SLP_EN0;\r\n        regVal = &AON_SOC_CIU->PAD_SLP_VAL0;\r\n    }\r\n\r\n    if (level == IO_MUX_SleepPinLevelUnchanged)\r\n    {\r\n        *regEn &= ~mask;\r\n    }\r\n    else\r\n    {\r\n        *regEn |= mask;\r\n        *regVal = ((*regVal) & ~mask) | (((uint32_t)level) << shift);\r\n    }\r\n}\r\n\r\n/*!\r\n * @brief Sets RF Switch Pin 0-3 output level in sleep mode. If level set to\r\n *        IO_MUX_SleepPinLevelUnchanged, the IO configuration is same as the active mode.\r\n *\r\n * This is an example to set the RF_CNTL0 pin to output low during sleep:\r\n * @code\r\n * IO_MUX_SetRfPinOutLevelInSleep(0U, IO_MUX_SleepPinLevelLow);\r\n * @endcode\r\n *\r\n * @param pin The RF Switch pin index to config.\r\n * @param level Output level in sleep.\r\n */\r\nstatic inline void IO_MUX_SetRfPinOutLevelInSleep(uint32_t pin, io_mux_sleep_pin_level_t level)\r\n{\r\n    uint32_t mask;\r\n\r\n    assert(pin < 4U);\r\n\r\n    mask = 0x10001UL << pin;\r\n\r\n    if (level == IO_MUX_SleepPinLevelUnchanged)\r\n    {\r\n        SOCCTRL->PAD_RF_SW_SLP_CONFIG &= ~mask;\r\n    }\r\n    else\r\n    {\r\n        SOCCTRL->PAD_RF_SW_SLP_CONFIG =\r\n            (SOCCTRL->PAD_RF_SW_SLP_CONFIG & ~mask) | (1UL << pin) | (((uint32_t)level) << (pin + 16U));\r\n    }\r\n}\r\n\r\n/*@}*/\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif /*__cplusplus */\r\n\r\n/*! @}*/\r\n\r\n#endif /* _FSL_IO_MUX_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_ocotp.c",
    "content": "/*\r\n * Copyright 2021-2023 NXP\r\n *\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include \"fsl_device_registers.h\"\r\n#include \"fsl_ocotp.h\"\r\n#include \"fsl_reset.h\"\r\n#include \"fsl_clock.h\"\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n/* Component ID definition, used by tools. */\r\n#ifndef FSL_COMPONENT_ID\r\n#define FSL_COMPONENT_ID \"platform.drivers.ocotp\"\r\n#endif\r\n\r\n/* All error masks in STATUS1 register except for SEC (Single error correction)\r\n   When new error masks are added this macro needs to be updated */\r\n#define OTP_STATUS1_ERRORS_MASK                                                                                       \\\r\n    (OCOTP_OTP_NONMASK_STATUS1_NONMASK_PBRICK_ERR_MASK | OCOTP_OTP_NONMASK_STATUS1_NONMASK_OTP_STATE_ERR_MASK |       \\\r\n     OCOTP_OTP_NONMASK_STATUS1_NONMASK_DED_RELOAD_MASK | OCOTP_OTP_NONMASK_STATUS1_NONMASK_DED_MASK |                 \\\r\n     OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_LUT_SEL_ERR_MASK |                                                         \\\r\n     OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_ADDRESS_RANGE_ERR_MASK |                                                   \\\r\n     OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_WRITE_PROTECT_ERR_MASK |                                                   \\\r\n     OCOTP_OTP_NONMASK_STATUS1_NONMASK_CRC_SECURTY_PROTECT_ERR_MASK |                                                 \\\r\n     OCOTP_OTP_NONMASK_STATUS1_NONMASK_WRITE_ERR_MASK | OCOTP_OTP_NONMASK_STATUS1_NONMASK_LOAD_ERR_MASK |             \\\r\n     OCOTP_OTP_NONMASK_STATUS1_NONMASK_COUNTER_ERR_MASK | OCOTP_OTP_NONMASK_STATUS1_NONMASK_BITPROTECT_ERR_MASK |     \\\r\n     OCOTP_OTP_NONMASK_STATUS1_NONMASK_PRNG_O_FAULT_MASK | OCOTP_OTP_NONMASK_STATUS1_NONMASK_ECC_ZEROIZED_ERR_MASK |  \\\r\n     OCOTP_OTP_NONMASK_STATUS1_NONMASK_FUSE_ACCESS_ERR_MASK | OCOTP_OTP_NONMASK_STATUS1_NONMASK_RELOAD_REQ_ERR_MASK | \\\r\n     OCOTP_OTP_NONMASK_STATUS1_NONMASK_WRITE_DURING_RELOAD_ERR_MASK |                                                 \\\r\n     OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_HVF_READ_ERR_MASK |                                                     \\\r\n     OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_HVF_WRITE_ERR_MASK |                                                    \\\r\n     OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_SRAM_READ_ERR_MASK |                                                    \\\r\n     OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_SRAM_WRITE_ERR_MASK |                                                   \\\r\n     OCOTP_OTP_NONMASK_STATUS1_NONMASK_FUSE_READ_ERR_MASK | OCOTP_OTP_NONMASK_STATUS1_NONMASK_FUSE_PROG_ERR_MASK |    \\\r\n     OCOTP_OTP_NONMASK_STATUS1_NONMASK_SHADOW_NO_ACCESS_MASK)\r\n\r\n#define OTP_SEC_NLINES           64U             /* Max. SoC OTP lines */\r\n#define OTP_SVC_TAG              0x24EU          /* SVC words tag */\r\n#define OTP_PKG_TAG              0x15DU          /* Package words tag */\r\n#define SOC_OTP_READ_DELAY_COUNT (0x2AU * 1000U) /* Give 1ms to read the value */\r\n#define SOC_OTP_CMD_READ         0x00U\r\n\r\n/*******************************************************************************\r\n * Prototypes\r\n *******************************************************************************/\r\n/* @brief Wait until OTP controller is idle */\r\nstatic status_t otp_wait_busy(void);\r\n\r\n/* @brief Clear all error status */\r\nstatic void otp_clear_status(void);\r\n\r\n/* @brief Read nonmask_status1 register and returns precise result*/\r\nstatic status_t otp_get_nonmask_status_result(void);\r\n\r\n/*******************************************************************************\r\n * Code\r\n ******************************************************************************/\r\nstatic status_t otp_get_nonmask_status_result(void)\r\n{\r\n    uint32_t status_register = OCOTP->OTP_NONMASK_STATUS1;\r\n    status_t status;\r\n    int32_t i;\r\n\r\n    do\r\n    {\r\n        if ((status_register & OTP_STATUS1_ERRORS_MASK) != 0U)\r\n        {\r\n            for (i = 0; i < 32; i++)\r\n            {\r\n                if (((1UL << (uint32_t)i) & status_register) != 0U)\r\n                {\r\n                    status = MAKE_STATUS(kStatusGroup_OtpGroup, i);\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n        status = kStatus_Success;\r\n    } while (false);\r\n\r\n    return status;\r\n}\r\n\r\nstatic status_t otp_wait_busy(void)\r\n{\r\n    /*\r\n     * Assume core clock is 300MHz, the general fuse operation should not exceed 100ms\r\n     * Maximum allowed ticks is 300MHz / 10\r\n     * The below loop needs at least 4 CPU cycles, so the timeout rounds for below loop is 300MHz / 10 / 4\r\n     */\r\n    uint32_t timeout = 300U * 1000U * 1000U / 10U / 4U;\r\n    status_t status;\r\n\r\n    while (((OCOTP->OTP_STATUS & OCOTP_OTP_STATUS_BUSY_MASK) != 0U) && (timeout > 0U))\r\n    {\r\n        timeout--;\r\n    }\r\n\r\n    if (timeout < 1U)\r\n    {\r\n        status = kStatus_OTP_Timeout;\r\n    }\r\n    else\r\n    {\r\n        status = kStatus_Success;\r\n    }\r\n\r\n    return status;\r\n}\r\n\r\nstatic void otp_clear_status(void)\r\n{\r\n    /* Write 1s to clear all error status */\r\n    OCOTP->OTP_STATUS          = OCOTP_OTP_STATUS_PROGFAIL_MASK;\r\n    OCOTP->OTP_NONMASK_STATUS1 = OTP_STATUS1_ERRORS_MASK;\r\n}\r\n\r\nstatus_t OCOTP_OtpInit(void)\r\n{\r\n    CLOCK_EnableClock(kCLOCK_Otp);\r\n    RESET_ClearPeripheralReset(kOTP_RST_SHIFT_RSTn);\r\n\r\n    /* Bring SOC OTP out of reset */\r\n    SOC_OTP_CTRL->OTP_POR_B = SOC_OTP_CTRL_OTP_POR_B_OTP_POR_B_MASK;\r\n    SOC_OTP_CTRL->OTP_RST_B = SOC_OTP_CTRL_OTP_RST_B_OTP_RST_B_MASK;\r\n\r\n    return kStatus_Success;\r\n}\r\n\r\nstatus_t OCOTP_OtpDeinit(void)\r\n{\r\n    status_t status;\r\n\r\n    status = otp_wait_busy();\r\n    if (status == kStatus_Success)\r\n    {\r\n        OCOTP->OTP_PDN = OCOTP_OTP_PDN_PDN_MASK;\r\n        CLOCK_DisableClock(kCLOCK_Otp);\r\n    }\r\n\r\n    SOC_OTP_CTRL->OTP_POR_B = 0U;\r\n    SOC_OTP_CTRL->OTP_RST_B = 0U;\r\n\r\n    return status;\r\n}\r\n\r\nstatus_t OCOTP_OtpFuseRead(uint32_t addr, uint32_t *data)\r\n{\r\n    status_t status = kStatus_InvalidArgument;\r\n\r\n    do\r\n    {\r\n        if (data == NULL)\r\n        {\r\n            break;\r\n        }\r\n\r\n        status = otp_wait_busy();\r\n        if (status != kStatus_Success)\r\n        {\r\n            break;\r\n        }\r\n\r\n        otp_clear_status();\r\n\r\n        /* Start reading */\r\n        OCOTP->OTP_CTRL      = OCOTP_OTP_CTRL_ADDR(addr);\r\n        OCOTP->OTP_READ_CTRL = OCOTP_OTP_READ_CTRL_READ(1);\r\n\r\n        /* Wait until read completes */\r\n        status = otp_wait_busy();\r\n        if (status != kStatus_Success)\r\n        {\r\n            break;\r\n        }\r\n\r\n        /* Check whether errors happened or not. */\r\n        status = otp_get_nonmask_status_result();\r\n        if (status == kStatus_Success)\r\n        {\r\n            *data = OCOTP->OTP_READ_DATA;\r\n        }\r\n    } while (false);\r\n\r\n    return status;\r\n}\r\n\r\nstatus_t OCOTP_ReadUniqueID(uint8_t *uid, uint32_t *idLen)\r\n{\r\n    status_t status = kStatus_InvalidArgument;\r\n    uint32_t offset = 0U;\r\n    uint32_t leftByte;\r\n    uint32_t cpyByte;\r\n    uint32_t data;\r\n\r\n    do\r\n    {\r\n        if ((uid == NULL) || (idLen == NULL))\r\n        {\r\n            break;\r\n        }\r\n\r\n        (void)OCOTP_OtpInit();\r\n\r\n        if ((*idLen) != 0U)\r\n        {\r\n            leftByte = *idLen;\r\n            do\r\n            {\r\n                status = OCOTP_OtpFuseRead((offset / 4U) + 46U, &data);\r\n                if (status != kStatus_Success)\r\n                {\r\n                    break;\r\n                }\r\n                cpyByte = (leftByte > 4U) ? 4U : leftByte;\r\n                (void)memcpy((void *)&uid[offset], (void *)(uint8_t *)&data, cpyByte);\r\n                leftByte -= cpyByte;\r\n                offset += cpyByte;\r\n            } while ((leftByte > 0U) && (offset < FSL_OCOTP_UID_LENGTH));\r\n            *idLen -= leftByte;\r\n        }\r\n    } while (false);\r\n\r\n    return status;\r\n}\r\n\r\nstatic uint32_t soc_otp_read(uint32_t addr_line, uint64_t *value)\r\n{\r\n    uint32_t dly                   = SOC_OTP_READ_DELAY_COUNT;\r\n    SOC_OTP_CTRL->OTP_ADDR         = (uint16_t)addr_line;\r\n    SOC_OTP_CTRL->OTP_BYPASS_MODE1 = 0;\r\n    SOC_OTP_CTRL->OTP_CMD_START    = SOC_OTP_CMD_READ;\r\n    SOC_OTP_CTRL->OTP_CMD_START |= SOC_OTP_CTRL_OTP_CMD_START_OTP_CMD_START_MASK;\r\n    while ((dly > 0U) && ((SOC_OTP_CTRL->OTP_CTRL0 & SOC_OTP_CTRL_OTP_CTRL0_CTRL_CMD_DONE_MASK) == 0U))\r\n    {\r\n        dly--; /* If something horrible happens, bail out after a delay */\r\n    }\r\n\r\n    if ((dly > 0U) && ((SOC_OTP_CTRL->OTP_WDATA4 & SOC_OTP_CTRL_OTP_WDATA4_DATA_LINE_VALID_BIT_MASK) != 0U))\r\n    {\r\n        *value = ((uint64_t)SOC_OTP_CTRL->OTP_WDATA3 << 48) | ((uint64_t)SOC_OTP_CTRL->OTP_WDATA2 << 32) |\r\n                 ((uint64_t)SOC_OTP_CTRL->OTP_WDATA1 << 16) | ((uint64_t)SOC_OTP_CTRL->OTP_WDATA0);\r\n        return 1;\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nstatus_t OCOTP_ReadSocOtp(uint64_t *data, uint32_t tag)\r\n{\r\n    status_t status = kStatus_Fail;\r\n    uint32_t i;\r\n\r\n    if (data == NULL)\r\n    {\r\n        status = kStatus_InvalidArgument;\r\n    }\r\n    else\r\n    {\r\n        /* Read SOC_OTP values */\r\n        for (i = 0U; i < OTP_SEC_NLINES; i++)\r\n        {\r\n            if (soc_otp_read(i, data) == 0U)\r\n            {\r\n                continue;\r\n            }\r\n\r\n            if ((*data & 0xFFFFU) == tag)\r\n            {\r\n                status = kStatus_Success;\r\n                break;\r\n            }\r\n        }\r\n    }\r\n\r\n    return status;\r\n}\r\n\r\nstatus_t OCOTP_ReadSVC(uint64_t *svc)\r\n{\r\n    status_t status = kStatus_Fail;\r\n\r\n    assert(svc != NULL);\r\n\r\n    status = OCOTP_ReadSocOtp(svc, OTP_SVC_TAG);\r\n\r\n    return status;\r\n}\r\n\r\nstatus_t OCOTP_ReadPackage(uint32_t *pack)\r\n{\r\n    status_t status = kStatus_Fail;\r\n    uint64_t data   = 0ULL;\r\n\r\n    assert(pack != NULL);\r\n\r\n    status = OCOTP_ReadSocOtp(&data, OTP_PKG_TAG);\r\n    if (status == kStatus_Success)\r\n    {\r\n        *pack = ((uint32_t)data >> 16U) & 0xFFU;\r\n    }\r\n\r\n    return status;\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_ocotp.h",
    "content": "/*\r\n * Copyright 2021-2023 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef __FSL_OCOTP_H_\r\n#define __FSL_OCOTP_H_\r\n\r\n#include \"fsl_common.h\"\r\n/*!\r\n * @addtogroup ocotp\r\n * @{\r\n */\r\n\r\n/*! @file */\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*! @name Driver version */\r\n/*@{*/\r\n/*! @brief OCOTP driver version 2.2.1. */\r\n#define FSL_OCOTP_DRIVER_VERSION (MAKE_VERSION(2, 2, 1))\r\n/*@}*/\r\n\r\n/*! @brief OCOTP unique ID length. */\r\n#define FSL_OCOTP_UID_LENGTH 16U\r\n\r\n/*! @brief OTP Status Group */\r\nenum\r\n{\r\n    kStatusGroup_OtpGroup = 0x210,\r\n};\r\n\r\n/*! @brief OTP Error Status definitions */\r\nenum\r\n{\r\n    kStatus_OTP_InvalidAddress = MAKE_STATUS(kStatusGroup_OtpGroup, 1), /*!< Invalid OTP address */\r\n    kStatus_OTP_Timeout        = MAKE_STATUS(kStatusGroup_OtpGroup, 7), /*!< OTP operation time out */\r\n};\r\n\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif\r\n\r\n/*!\r\n * @brief Initialize OTP controller\r\n *\r\n * This function enables OTP Controller clock.\r\n *\r\n * @return kStatus_Success\r\n */\r\nstatus_t OCOTP_OtpInit(void);\r\n\r\n/*!\r\n * @brief De-Initialize OTP controller\r\n *\r\n * This functin disables OTP Controller Clock.\r\n * @return kStatus_Success\r\n */\r\nstatus_t OCOTP_OtpDeinit(void);\r\n\r\n/*!\r\n * @brief Read Fuse value from OTP Fuse Block\r\n *\r\n * This function read fuse data from OTP Fuse block to specified data buffer.\r\n *\r\n * @param addr Fuse address\r\n * @param data Buffer to hold the data read from OTP Fuse block\r\n * @return kStatus_Success - Data read from OTP Fuse block successfully\r\n *         kStatus_OTP_Timeout - OTP read timeout\r\n *         kStatus_InvalidArgument - data pointer is invalid\r\n */\r\nstatus_t OCOTP_OtpFuseRead(uint32_t addr, uint32_t *data);\r\n\r\n/*!\r\n * @brief Read Fuse line with specific tag value from SoC OTP\r\n *\r\n * This function read Fuse line with specific tag value from SoC OTP to specified data buffer.\r\n *\r\n * @param data Buffer to hold the data read from SoC OTP\r\n * @param tag  Tag value to match\r\n * @return kStatus_Success - Data read from SoC OTP successfully\r\n *         kStatus_Fail    - Data read from SoC OTP failed, or cannot find the tag\r\n *         kStatus_InvalidArgument - data pointer is invalid\r\n */\r\nstatus_t OCOTP_ReadSocOtp(uint64_t *data, uint32_t tag);\r\n\r\n/*!\r\n * @brief Read unique ID from OTP Fuse Block\r\n *\r\n * This function read unique ID from OTP Fuse block to specified data buffer.\r\n *\r\n * @param uid The buffer to store unique ID, buffer byte length is FSL_OCOTP_UID_LENGTH.\r\n * @param idLen[in/out] The unique ID byte length. Set the length to read, return the length read out.\r\n * @return kStatus_Success - Data read from OTP Fuse block successfully\r\n *         kStatus_OTP_Timeout - OTP read timeout\r\n *         kStatus_InvalidArgument - data pointer is invalid\r\n */\r\nstatus_t OCOTP_ReadUniqueID(uint8_t *uid, uint32_t *idLen);\r\n\r\n/*!\r\n * @brief Read Static Voltage Compansation from SOC OTP\r\n *\r\n * This function read SVC from OTP Fuse block to specified data buffer.\r\n *\r\n * @param svc The buffer to store SVC.\r\n * @return kStatus_Success - Data read from SOC OTP successfully\r\n *         kStatus_Fail    - SOC OTP read failure\r\n */\r\nstatus_t OCOTP_ReadSVC(uint64_t *svc);\r\n\r\n/*!\r\n * @brief Read package type from SOC OTP\r\n *\r\n * @param pack The buffer to store package type.\r\n * @return kStatus_Success - Data read from SOC OTP successfully\r\n *         kStatus_Fail    - SOC OTP read failure\r\n */\r\nstatus_t OCOTP_ReadPackage(uint32_t *pack);\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n/*! @}*/\r\n\r\n#endif /* __FSL_OCOTP_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_power.c",
    "content": "/*\r\n * Copyright 2020-2023 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include \"fsl_power.h\"\r\n#include <string.h>\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n/* Component ID definition, used by tools. */\r\n#ifndef FSL_COMPONENT_ID\r\n#define FSL_COMPONENT_ID \"platform.drivers.power\"\r\n#endif\r\n\r\n#define IS_XIP_FLEXSPI()                                                                                \\\r\n    ((((uint32_t)POWER_EnableWakeup >= 0x08000000U) && ((uint32_t)POWER_EnableWakeup < 0x10000000U)) || \\\r\n     (((uint32_t)POWER_EnableWakeup >= 0x18000000U) && ((uint32_t)POWER_EnableWakeup < 0x20000000U)))\r\n\r\n#define FLEXSPI_DLL_LOCK_RETRY (10U)\r\n\r\n/* Wait some PMU cycles */\r\n#define POWER_WAIT_PMU()              \\\r\n    do                                \\\r\n    {                                 \\\r\n        volatile uint32_t dummy;      \\\r\n        dummy = PMU->PWR_MODE_STATUS; \\\r\n        dummy = PMU->PWR_MODE_STATUS; \\\r\n        dummy = PMU->PWR_MODE_STATUS; \\\r\n        dummy = PMU->PWR_MODE_STATUS; \\\r\n        dummy = PMU->PWR_MODE_STATUS; \\\r\n        (void)dummy;                  \\\r\n    } while (false)\r\n\r\n#define POWER_WLAN_POWER_STATUS() (SOCCTRL->WLAN_POWER_STATUS & 0x3U)\r\n#define POWER_BLE_POWER_STATUS()  (SOCCTRL->BLE_POWER_STATUS & 0x3U)\r\n#define POWER_WLAN_BLE_POWER_ON   (0U)\r\n#define POWER_WLAN_BLE_POWER_SLP  (2U)\r\n#define POWER_WLAN_BLE_POWER_OFF  (3U)\r\n\r\n#define ITRC_OUT_SEL_MASK          (0x0C000FF0U)\r\n#define ITRC_OUT_SEL_DISABLE       (0x08000AA0U)\r\n#define ITRC_OUT_SEL_EVENT_MASK    (0xFU)\r\n#define ITRC_OUT_SEL_EVENT_DISABLE (0xAU)\r\n\r\n#define POWER_WRITE_MEM32(addr, val)            \\\r\n    do                                          \\\r\n    {                                           \\\r\n        *((volatile uint32_t *)(addr)) = (val); \\\r\n    } while (false)\r\n\r\ntypedef struct _power_nvic_context\r\n{\r\n    uint32_t PriorityGroup;\r\n    uint32_t ISER[5];\r\n    uint8_t IPR[160];\r\n    uint8_t SHPR[12];\r\n    uint32_t ICSR;\r\n    uint32_t VTOR;\r\n    uint32_t AIRCR;\r\n    uint32_t SCR;\r\n    uint32_t CCR;\r\n    uint32_t SHCSR;\r\n    uint32_t MMFAR;\r\n    uint32_t BFAR;\r\n    uint32_t CPACR;\r\n    uint32_t NSACR;\r\n} power_nvic_context_t;\r\n\r\ntypedef struct _power_systick_context\r\n{\r\n    uint32_t CTRL;\r\n    uint32_t LOAD;\r\n} power_systick_context_t;\r\n\r\ntypedef struct _power_clock_context\r\n{\r\n    uint32_t SOURCE_CLK_GATE;\r\n} power_clock_context_t;\r\n\r\ntypedef struct _power_gdet_sensor_context\r\n{\r\n    int32_t disableCount;\r\n    uint32_t VSEN_CTRL_1_REG_1;\r\n    uint32_t VSEN_CTRL_2_REG_1;\r\n    uint32_t VSEN_CTRL_3_REG_1;\r\n    uint32_t ITRC_OUT0_SEL0;\r\n    uint32_t ITRC_OUT1_SEL0;\r\n    uint32_t ITRC_OUT0_SEL0_EVENT16_31;\r\n    uint32_t ITRC_OUT1_SEL0_EVENT16_31;\r\n    uint32_t ELS_INT_ENABLE;\r\n    uint32_t ELS_EN;\r\n} power_gdet_sensor_context_t;\r\n\r\ntypedef struct _power_threshold_params\r\n{\r\n    uint32_t param1;\r\n    uint32_t param2;\r\n    uint32_t margin;\r\n} power_threshold_params_t;\r\n\r\n/*******************************************************************************\r\n * Variables\r\n ******************************************************************************/\r\nstatic power_nvic_context_t s_nvicContext;\r\nstatic power_systick_context_t s_systickContext;\r\nstatic power_clock_context_t s_clockContext;\r\nstatic power_gdet_sensor_context_t s_gdetSensorContext;\r\nstatic capt_pulse_timer_callback_t s_captPulseCb;\r\nstatic void *s_captPulseCbParam;\r\nstatic power_switch_callback_t s_preSwitch;\r\nstatic void *s_preSwitchParam;\r\nstatic power_switch_callback_t s_postSwitch;\r\nstatic void *s_postSwitchParam;\r\nstatic const uint8_t s_droTable[19] = {0x40U, 0x43U, 0x46U, 0x48U, 0x4CU, 0x4FU, 0x52U, 0x54U, 0x57U, 0x5AU,\r\n                                       0x5DU, 0x5FU, 0x62U, 0x65U, 0x67U, 0x69U, 0x69U, 0x69U, 0x69U};\r\nstatic power_load_gdet_cfg s_gdetCfgloadFunc;\r\nstatic power_gdet_data_t s_gdetCfgData;\r\n\r\n/*******************************************************************************\r\n * Prototypes\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n * Code\r\n ******************************************************************************/\r\nAT_QUICKACCESS_SECTION_CODE(static void POWER_Delay(uint32_t loop))\r\n{\r\n    if (loop > 0U)\r\n    {\r\n        __ASM volatile(\r\n            \"1:                             \\n\"\r\n            \"    SUBS   %0, %0, #1          \\n\"\r\n            \"    CMP    %0, #0              \\n\"\r\n            \"    BNE    1b                  \\n\"\r\n            :\r\n            : \"r\"(loop));\r\n    }\r\n}\r\n\r\nAT_QUICKACCESS_SECTION_CODE(static void POWER_DelayUs(uint32_t us))\r\n{\r\n    uint32_t instNum;\r\n\r\n    instNum = ((SystemCoreClock + 999999UL) / 1000000UL) * us;\r\n    POWER_Delay((instNum + 2U) / 3U);\r\n}\r\n\r\nstatic void POWER_GetThresholdParams(uint32_t pack,\r\n                                     power_threshold_params_t *v11,\r\n                                     power_threshold_params_t *v18,\r\n                                     power_threshold_params_t *v33)\r\n{\r\n    assert(v11);\r\n    assert(v18);\r\n    assert(v33);\r\n\r\n    v11->param1 = 38307U;\r\n    v11->param2 = 514850000U;\r\n    v11->margin = 750;\r\n    switch (pack)\r\n    {\r\n        case 0: /* QFN */\r\n            v18->param1 = 22034U;\r\n            v18->param2 = 507580000U;\r\n            v18->margin = 500U + 380U;\r\n            v33->param1 = 12924U;\r\n            v33->param2 = 503960000U;\r\n            v33->margin = 1000U + 200U;\r\n            break;\r\n        case 1: /* CSP */\r\n            v18->param1 = 21903U;\r\n            v18->param2 = 514170000U;\r\n            v18->margin = 500U + 305U;\r\n            v33->param1 = 12924U;\r\n            v33->param2 = 503960000U;\r\n            v33->margin = 1000U + 200U;\r\n            break;\r\n        case 2: /* BGA */\r\n            v18->param1 = 22156U;\r\n            v18->param2 = 512500000U;\r\n            v18->margin = 500U + 305U;\r\n            v33->param1 = 12917U;\r\n            v33->param2 = 513300000U;\r\n            v33->margin = 1000U + 200U;\r\n            break;\r\n        default:\r\n            assert(false);\r\n            break;\r\n    }\r\n}\r\n\r\nstatic void POWER_SaveNvicState(void)\r\n{\r\n    uint32_t i;\r\n    uint32_t irqRegs;\r\n    uint32_t irqNum;\r\n\r\n    irqRegs = (SCnSCB->ICTR & SCnSCB_ICTR_INTLINESNUM_Msk) + 1U;\r\n    irqNum  = irqRegs * 32U;\r\n\r\n    assert(irqRegs <= ARRAY_SIZE(s_nvicContext.ISER));\r\n    assert(irqNum <= ARRAY_SIZE(s_nvicContext.IPR));\r\n\r\n    s_nvicContext.PriorityGroup = NVIC_GetPriorityGrouping();\r\n\r\n    for (i = 0U; i < irqRegs; i++)\r\n    {\r\n        s_nvicContext.ISER[i] = NVIC->ISER[i];\r\n    }\r\n\r\n    for (i = 0U; i < irqNum; i++)\r\n    {\r\n        s_nvicContext.IPR[i] = NVIC->IPR[i];\r\n    }\r\n\r\n    /* Save SCB configuration */\r\n    s_nvicContext.ICSR  = SCB->ICSR;\r\n    s_nvicContext.VTOR  = SCB->VTOR;\r\n    s_nvicContext.AIRCR = SCB->AIRCR;\r\n    s_nvicContext.SCR   = SCB->SCR;\r\n    s_nvicContext.CCR   = SCB->CCR;\r\n\r\n    s_nvicContext.SHCSR = SCB->SHCSR;\r\n    s_nvicContext.MMFAR = SCB->MMFAR;\r\n    s_nvicContext.BFAR  = SCB->BFAR;\r\n    s_nvicContext.CPACR = SCB->CPACR;\r\n    s_nvicContext.NSACR = SCB->NSACR;\r\n\r\n    for (i = 0U; i < ARRAY_SIZE(s_nvicContext.SHPR); i++)\r\n    {\r\n        s_nvicContext.SHPR[i] = SCB->SHPR[i];\r\n    }\r\n}\r\n\r\nstatic void POWER_RestoreNvicState(void)\r\n{\r\n    uint32_t i;\r\n    uint32_t irqRegs;\r\n    uint32_t irqNum;\r\n\r\n    irqRegs = (SCnSCB->ICTR & SCnSCB_ICTR_INTLINESNUM_Msk) + 1U;\r\n    irqNum  = irqRegs * 32U;\r\n\r\n    NVIC_SetPriorityGrouping(s_nvicContext.PriorityGroup);\r\n\r\n    for (i = 0U; i < irqRegs; i++)\r\n    {\r\n        NVIC->ISER[i] = s_nvicContext.ISER[i];\r\n    }\r\n\r\n    for (i = 0U; i < irqNum; i++)\r\n    {\r\n        NVIC->IPR[i] = s_nvicContext.IPR[i];\r\n    }\r\n\r\n    /* Restore SCB configuration */\r\n    SCB->ICSR  = s_nvicContext.ICSR;\r\n    SCB->VTOR  = s_nvicContext.VTOR;\r\n    SCB->AIRCR = s_nvicContext.AIRCR;\r\n    SCB->SCR   = s_nvicContext.SCR;\r\n    SCB->CCR   = s_nvicContext.CCR;\r\n\r\n    SCB->SHCSR = s_nvicContext.SHCSR;\r\n    SCB->MMFAR = s_nvicContext.MMFAR;\r\n    SCB->BFAR  = s_nvicContext.BFAR;\r\n    SCB->CPACR = s_nvicContext.CPACR;\r\n    SCB->NSACR = s_nvicContext.NSACR;\r\n\r\n    for (i = 0U; i < ARRAY_SIZE(s_nvicContext.SHPR); i++)\r\n    {\r\n        SCB->SHPR[i] = s_nvicContext.SHPR[i];\r\n    }\r\n}\r\n\r\nAT_QUICKACCESS_SECTION_CODE(static void POWER_SaveGdetVSensorConfig(void))\r\n{\r\n    s_gdetSensorContext.VSEN_CTRL_1_REG_1 =\r\n        SENSOR_CTRL->VSEN_CTRL_1_REG_1 & SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_SW_ENABLE_MASK;\r\n    s_gdetSensorContext.VSEN_CTRL_2_REG_1 =\r\n        SENSOR_CTRL->VSEN_CTRL_2_REG_1 & SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_SW_ENABLE_MASK;\r\n    s_gdetSensorContext.VSEN_CTRL_3_REG_1 =\r\n        SENSOR_CTRL->VSEN_CTRL_3_REG_1 & SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_SW_ENABLE_MASK;\r\n    s_gdetSensorContext.ITRC_OUT0_SEL0            = ITRC->OUT0_SEL0;\r\n    s_gdetSensorContext.ITRC_OUT1_SEL0            = ITRC->OUT1_SEL0;\r\n    s_gdetSensorContext.ITRC_OUT0_SEL0_EVENT16_31 = ITRC->OUT0_SEL0_EVENT16_31;\r\n    s_gdetSensorContext.ITRC_OUT1_SEL0_EVENT16_31 = ITRC->OUT1_SEL0_EVENT16_31;\r\n}\r\n\r\nAT_QUICKACCESS_SECTION_CODE(static void POWER_RestoreGdetVSensorConfig(void))\r\n{\r\n    SENSOR_CTRL->VSEN_CTRL_1_REG_1 =\r\n        (SENSOR_CTRL->VSEN_CTRL_1_REG_1 & ~SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_SW_ENABLE_MASK) |\r\n        s_gdetSensorContext.VSEN_CTRL_1_REG_1;\r\n    SENSOR_CTRL->VSEN_CTRL_2_REG_1 =\r\n        (SENSOR_CTRL->VSEN_CTRL_2_REG_1 & ~SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_SW_ENABLE_MASK) |\r\n        s_gdetSensorContext.VSEN_CTRL_2_REG_1;\r\n    SENSOR_CTRL->VSEN_CTRL_3_REG_1 =\r\n        (SENSOR_CTRL->VSEN_CTRL_3_REG_1 & ~SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_SW_ENABLE_MASK) |\r\n        s_gdetSensorContext.VSEN_CTRL_3_REG_1;\r\n    ITRC->OUT0_SEL0            = s_gdetSensorContext.ITRC_OUT0_SEL0;\r\n    ITRC->OUT1_SEL0            = s_gdetSensorContext.ITRC_OUT1_SEL0;\r\n    ITRC->OUT0_SEL0_EVENT16_31 = s_gdetSensorContext.ITRC_OUT0_SEL0_EVENT16_31;\r\n    ITRC->OUT1_SEL0_EVENT16_31 = s_gdetSensorContext.ITRC_OUT1_SEL0_EVENT16_31;\r\n}\r\n\r\nvoid CAPT_PULSE_DriverIRQHandler(void);\r\nvoid CAPT_PULSE_DriverIRQHandler(void)\r\n{\r\n    /* Clear IRQ status */\r\n    PMU->CAPT_PULSE |= PMU_CAPT_PULSE_IRQ_CLR_MASK;\r\n    /* Call user callback */\r\n    if (s_captPulseCb != NULL)\r\n    {\r\n        s_captPulseCb(s_captPulseCbParam);\r\n    }\r\n}\r\n\r\n/**\r\n * @brief   Check if IRQ is the wakeup source\r\n * @param   irq   : IRQ number\r\n * @return  true if IRQ is the wakeup source, false otherwise.\r\n */\r\nbool POWER_GetWakeupStatus(IRQn_Type irq)\r\n{\r\n    uint32_t status;\r\n    uint32_t irqNum = (uint32_t)irq;\r\n\r\n    assert((int32_t)irq >= 0);\r\n\r\n    if (irq <= HWVAD0_IRQn)\r\n    {\r\n        status = PMU->WAKEUP_PM2_STATUS0 & (1UL << irqNum);\r\n    }\r\n    else if (irq <= POWERQUAD_IRQn)\r\n    {\r\n        status = PMU->WAKEUP_PM2_STATUS1 & (1UL << (irqNum - 32U));\r\n    }\r\n    else if ((irq <= ITRC_IRQn) && (irq >= GAU_GPDAC_INT_FUNC11_IRQn))\r\n    {\r\n        status = PMU->WAKEUP_PM2_STATUS3 & (1UL << (irqNum - 96U));\r\n    }\r\n    else\r\n    {\r\n        status = 0U;\r\n    }\r\n\r\n    switch (irq)\r\n    {\r\n        case PIN0_INT_IRQn:\r\n            status = PMU->WAKEUP_STATUS & PMU_WAKEUP_STATUS_PIN0_MASK;\r\n            break;\r\n        case PIN1_INT_IRQn:\r\n            status = PMU->WAKEUP_STATUS & PMU_WAKEUP_STATUS_PIN1_MASK;\r\n            break;\r\n        case RTC_IRQn:\r\n            /* PM2 wakeup status is at WAKEUP_PM2_STATUS1, PM3/PM4 wakeup status is at WAKEUP_STATUS */\r\n            status |= PMU->WAKEUP_STATUS & PMU_WAKEUP_STATUS_RTC_MASK;\r\n            break;\r\n        case CAPT_PULSE_IRQn:\r\n            status = PMU->WAKEUP_STATUS & PMU_WAKEUP_STATUS_CAPT_MASK;\r\n            break;\r\n        case WL_MCI_WAKEUP0_IRQn:\r\n            status = PMU->WAKEUP_STATUS & (1UL << PMU_WAKEUP_STATUS_WL_SHIFT);\r\n            break;\r\n        case WL_MCI_WAKEUP1_IRQn:\r\n            status = PMU->WAKEUP_STATUS & (2UL << PMU_WAKEUP_STATUS_WL_SHIFT);\r\n            break;\r\n        case BLE_MCI_WAKEUP0_IRQn:\r\n            status = PMU->WAKEUP_STATUS & (1UL << PMU_WAKEUP_STATUS_BLE_SHIFT);\r\n            break;\r\n        case BLE_MCI_WAKEUP1_IRQn:\r\n            status = PMU->WAKEUP_STATUS & (2UL << PMU_WAKEUP_STATUS_BLE_SHIFT);\r\n            break;\r\n        default:\r\n            /* Do nothing */\r\n            break;\r\n    }\r\n\r\n    return (status != 0U);\r\n}\r\n\r\n/**\r\n * @brief   Clear wakeup status\r\n * @param   irq   : IRQ number\r\n */\r\nvoid POWER_ClearWakeupStatus(IRQn_Type irq)\r\n{\r\n    uint32_t irqNum = (uint32_t)irq;\r\n\r\n    assert((int32_t)irq >= 0);\r\n\r\n    if (irq <= HWVAD0_IRQn)\r\n    {\r\n        PMU->WAKEUP_PM2_SRC_CLR0 = (1UL << irqNum);\r\n    }\r\n    else if (irq <= POWERQUAD_IRQn)\r\n    {\r\n        PMU->WAKEUP_PM2_SRC_CLR1 = (1UL << (irqNum - 32U));\r\n    }\r\n    else if ((irq <= ITRC_IRQn) && (irq >= GAU_GPDAC_INT_FUNC11_IRQn))\r\n    {\r\n        PMU->WAKEUP_PM2_SRC_CLR3 = (1UL << (irqNum - 96U));\r\n    }\r\n    else\r\n    {\r\n        /* Do nothing */\r\n    }\r\n\r\n    switch (irq)\r\n    {\r\n        case PIN0_INT_IRQn:\r\n            PMU->WAKE_SRC_CLR = PMU_WAKE_SRC_CLR_PIN0_CLR_MASK;\r\n            break;\r\n        case PIN1_INT_IRQn:\r\n            PMU->WAKE_SRC_CLR = PMU_WAKE_SRC_CLR_PIN1_CLR_MASK;\r\n            break;\r\n        case RTC_IRQn:\r\n            PMU->WAKE_SRC_CLR = PMU_WAKE_SRC_CLR_RTC_CLR_MASK;\r\n            break;\r\n        case CAPT_PULSE_IRQn:\r\n            PMU->WAKE_SRC_CLR = PMU_WAKE_SRC_CLR_CAPT_CLR_MASK;\r\n            break;\r\n        case WL_MCI_WAKEUP0_IRQn:\r\n            PMU->WAKE_SRC_CLR = (1UL << PMU_WAKE_SRC_CLR_WL_CLR_SHIFT);\r\n            break;\r\n        case WL_MCI_WAKEUP1_IRQn:\r\n            PMU->WAKE_SRC_CLR = (2UL << PMU_WAKE_SRC_CLR_WL_CLR_SHIFT);\r\n            break;\r\n        case BLE_MCI_WAKEUP0_IRQn:\r\n            PMU->WAKE_SRC_CLR = (1UL << PMU_WAKE_SRC_CLR_BLE_CLR_SHIFT);\r\n            break;\r\n        case BLE_MCI_WAKEUP1_IRQn:\r\n            PMU->WAKE_SRC_CLR = (2UL << PMU_WAKE_SRC_CLR_BLE_CLR_SHIFT);\r\n            break;\r\n        default:\r\n            /* Do nothing */\r\n            break;\r\n    }\r\n}\r\n\r\n/**\r\n * @brief   Enable the Wakeup interrupt.\r\n * @param   irq   : IRQ number\r\n */\r\nvoid POWER_EnableWakeup(IRQn_Type irq)\r\n{\r\n    uint32_t irqNum = (uint32_t)irq;\r\n\r\n    assert((int32_t)irq >= 0);\r\n\r\n    if (irq <= HWVAD0_IRQn)\r\n    {\r\n        PMU->WAKEUP_PM2_MASK0 |= (1UL << irqNum);\r\n    }\r\n    else if (irq <= POWERQUAD_IRQn)\r\n    {\r\n        PMU->WAKEUP_PM2_MASK1 |= (1UL << (irqNum - 32U));\r\n    }\r\n    else if ((irq <= ITRC_IRQn) && (irq >= GAU_GPDAC_INT_FUNC11_IRQn))\r\n    {\r\n        PMU->WAKEUP_PM2_MASK3 |= (1UL << (irqNum - 96U));\r\n    }\r\n    else\r\n    {\r\n        /* Do nothing */\r\n    }\r\n\r\n    switch (irq)\r\n    {\r\n        case PIN0_INT_IRQn:\r\n            PMU->WAKEUP_MASK |= PMU_WAKEUP_MASK_PIN0_MASK_MASK;\r\n            break;\r\n        case PIN1_INT_IRQn:\r\n            PMU->WAKEUP_MASK |= PMU_WAKEUP_MASK_PIN1_MASK_MASK;\r\n            break;\r\n        case RTC_IRQn:\r\n            PMU->WAKEUP_MASK |= PMU_WAKEUP_MASK_RTC_MASK_MASK;\r\n            break;\r\n        case CAPT_PULSE_IRQn:\r\n            PMU->WAKEUP_MASK |= PMU_WAKEUP_MASK_CAPT_MASK_MASK;\r\n            break;\r\n        case WL_MCI_WAKEUP0_IRQn:\r\n            PMU->WAKEUP_MASK |= (1UL << PMU_WAKEUP_MASK_WL_MASK_SHIFT);\r\n            break;\r\n        case WL_MCI_WAKEUP1_IRQn:\r\n            PMU->WAKEUP_MASK |= (2UL << PMU_WAKEUP_MASK_WL_MASK_SHIFT);\r\n            break;\r\n        case BLE_MCI_WAKEUP0_IRQn:\r\n            PMU->WAKEUP_MASK |= (1UL << PMU_WAKEUP_MASK_BLE_MASK_SHIFT);\r\n            break;\r\n        case BLE_MCI_WAKEUP1_IRQn:\r\n            PMU->WAKEUP_MASK |= (2UL << PMU_WAKEUP_MASK_BLE_MASK_SHIFT);\r\n            break;\r\n        default:\r\n            /* Do nothing */\r\n            break;\r\n    }\r\n}\r\n\r\n/**\r\n * @brief   Disable the Wakeup interrupts.\r\n * @param   irq   : IRQ number\r\n */\r\nvoid POWER_DisableWakeup(IRQn_Type irq)\r\n{\r\n    uint32_t irqNum = (uint32_t)irq;\r\n\r\n    assert((int32_t)irq >= 0);\r\n\r\n    if (irq <= HWVAD0_IRQn)\r\n    {\r\n        PMU->WAKEUP_PM2_MASK0 &= ~(1UL << irqNum);\r\n    }\r\n    else if (irq <= POWERQUAD_IRQn)\r\n    {\r\n        PMU->WAKEUP_PM2_MASK1 &= ~(1UL << (irqNum - 32U));\r\n    }\r\n    else if ((irq <= ITRC_IRQn) && (irq >= GAU_GPDAC_INT_FUNC11_IRQn))\r\n    {\r\n        PMU->WAKEUP_PM2_MASK3 &= ~(1UL << (irqNum - 96U));\r\n    }\r\n    else\r\n    {\r\n        /* Do nothing */\r\n    }\r\n\r\n    switch (irq)\r\n    {\r\n        case PIN0_INT_IRQn:\r\n            PMU->WAKEUP_MASK &= ~PMU_WAKEUP_MASK_PIN0_MASK_MASK;\r\n            break;\r\n        case PIN1_INT_IRQn:\r\n            PMU->WAKEUP_MASK &= ~PMU_WAKEUP_MASK_PIN1_MASK_MASK;\r\n            break;\r\n        case RTC_IRQn:\r\n            PMU->WAKEUP_MASK &= ~PMU_WAKEUP_MASK_RTC_MASK_MASK;\r\n            break;\r\n        case CAPT_PULSE_IRQn:\r\n            PMU->WAKEUP_MASK &= ~PMU_WAKEUP_MASK_CAPT_MASK_MASK;\r\n            break;\r\n        case WL_MCI_WAKEUP0_IRQn:\r\n            PMU->WAKEUP_MASK &= ~(1UL << PMU_WAKEUP_MASK_WL_MASK_SHIFT);\r\n            break;\r\n        case WL_MCI_WAKEUP1_IRQn:\r\n            PMU->WAKEUP_MASK &= ~(2UL << PMU_WAKEUP_MASK_WL_MASK_SHIFT);\r\n            break;\r\n        case BLE_MCI_WAKEUP0_IRQn:\r\n            PMU->WAKEUP_MASK &= ~(1UL << PMU_WAKEUP_MASK_BLE_MASK_SHIFT);\r\n            break;\r\n        case BLE_MCI_WAKEUP1_IRQn:\r\n            PMU->WAKEUP_MASK &= ~(2UL << PMU_WAKEUP_MASK_BLE_MASK_SHIFT);\r\n            break;\r\n        default:\r\n            /* Do nothing */\r\n            break;\r\n    }\r\n}\r\n\r\n/**\r\n * @brief   Set sleep mode on idle.\r\n * @param   mode : 0 ~ 4 stands for PM0 ~ PM4.\r\n */\r\nvoid POWER_SetSleepMode(uint32_t mode)\r\n{\r\n    assert(mode <= 4U);\r\n\r\n    if (mode == 0U)\r\n    {\r\n        mode = 1U; /* PM0/PM1 is same */\r\n    }\r\n    /* set PMU basic mode */\r\n    PMU->PWR_MODE = PMU_PWR_MODE_PWR_MODE(mode - 1U);\r\n\r\n    /* select deepsleep or not */\r\n    if (mode == 1U)\r\n    {\r\n        SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;\r\n    }\r\n    else\r\n    {\r\n        SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;\r\n    }\r\n}\r\n\r\nAT_QUICKACCESS_SECTION_CODE(static void Power_ConfigClkGate(const power_sleep_config_t *config))\r\n{\r\n    uint32_t pm2AnaPdCfg = (config->pm2AnaPuCfg ^ (uint32_t)kPOWER_Pm2AnaPuAll) & (uint32_t)kPOWER_Pm2AnaPuAll;\r\n    uint32_t clkGate     = config->clkGate & (uint32_t)kPOWER_ClkGateAll;\r\n\r\n    /* If ENET clock is enabled, TDDR power must be on. */\r\n    if ((clkGate & SYSCTL2_SOURCE_CLK_GATE_TDDR_MCI_ENET_CLK_CG_MASK) == 0U)\r\n    {\r\n        pm2AnaPdCfg &= ~SYSCTL2_ANA_PDWN_PM2_TDDR_TOP_ANA_PDWN_PM2_MASK;\r\n    }\r\n\r\n    SYSCTL2->SOURCE_CLK_GATE = (SYSCTL2->SOURCE_CLK_GATE & (~((uint32_t)kPOWER_ClkGateAll))) | clkGate;\r\n    SYSCTL2->ANA_PDWN_PM2    = pm2AnaPdCfg;\r\n}\r\n\r\nAT_QUICKACCESS_SECTION_CODE(static void deinitXip(void))\r\n{\r\n    if (IS_XIP_FLEXSPI())\r\n    { /* FlexSPI */\r\n        /* Wait until FLEXSPI is not busy */\r\n        while (!(((FLEXSPI->STS0 & FLEXSPI_STS0_ARBIDLE_MASK) != 0U) &&\r\n                 ((FLEXSPI->STS0 & FLEXSPI_STS0_SEQIDLE_MASK) != 0U)))\r\n        {\r\n        }\r\n        /* Disable module. */\r\n        FLEXSPI->MCR0 |= FLEXSPI_MCR0_MDIS_MASK;\r\n        /* Disable clock. */\r\n        CLKCTL0->PSCCTL0_CLR = CLKCTL0_PSCCTL0_CLR_FLEXSPI0_MASK;\r\n    }\r\n}\r\n\r\nAT_QUICKACCESS_SECTION_CODE(static void initFlexSPI(FLEXSPI_Type *base))\r\n{\r\n    uint32_t status;\r\n    uint32_t lastStatus;\r\n    uint32_t retry;\r\n    uint32_t mask = 0;\r\n\r\n    /* Enable FLEXSPI module */\r\n    base->MCR0 &= ~FLEXSPI_MCR0_MDIS_MASK;\r\n\r\n    base->MCR0 |= FLEXSPI_MCR0_SWRESET_MASK;\r\n    while ((base->MCR0 & FLEXSPI_MCR0_SWRESET_MASK) != 0U)\r\n    {\r\n    }\r\n\r\n    /* Need to wait DLL locked if DLL enabled */\r\n    if (0U != (base->DLLCR[0] & FLEXSPI_DLLCR_DLLEN_MASK))\r\n    {\r\n        lastStatus = base->STS2;\r\n        retry      = FLEXSPI_DLL_LOCK_RETRY;\r\n        /* Flash on port A */\r\n        if (((base->FLSHCR0[0] & FLEXSPI_FLSHCR0_FLSHSZ_MASK) > 0U) ||\r\n            ((base->FLSHCR0[1] & FLEXSPI_FLSHCR0_FLSHSZ_MASK) > 0U))\r\n        {\r\n            mask |= FLEXSPI_STS2_AREFLOCK_MASK | FLEXSPI_STS2_ASLVLOCK_MASK;\r\n        }\r\n        /* Flash on port B */\r\n        if (((base->FLSHCR0[2] & FLEXSPI_FLSHCR0_FLSHSZ_MASK) > 0U) ||\r\n            ((base->FLSHCR0[3] & FLEXSPI_FLSHCR0_FLSHSZ_MASK) > 0U))\r\n        {\r\n            mask |= FLEXSPI_STS2_BREFLOCK_MASK | FLEXSPI_STS2_BSLVLOCK_MASK;\r\n        }\r\n        /* Wait slave delay line locked and slave reference delay line locked. */\r\n        do\r\n        {\r\n            status = base->STS2;\r\n            if ((status & mask) == mask)\r\n            {\r\n                /* Locked */\r\n                retry = 100;\r\n                break;\r\n            }\r\n            else if (status == lastStatus)\r\n            {\r\n                /* Same delay cell number in calibration */\r\n                retry--;\r\n            }\r\n            else\r\n            {\r\n                retry      = FLEXSPI_DLL_LOCK_RETRY;\r\n                lastStatus = status;\r\n            }\r\n        } while (retry > 0U);\r\n        /* According to ERR011377, need to delay at least 100 NOPs to ensure the DLL is locked. */\r\n        for (; retry > 0U; retry--)\r\n        {\r\n            __NOP();\r\n        }\r\n    }\r\n}\r\n\r\nAT_QUICKACCESS_SECTION_CODE(static void initXip(void))\r\n{\r\n    if (IS_XIP_FLEXSPI())\r\n    { /* FlexSPI */\r\n        /* Enable FLEXSPI clock again */\r\n        CLKCTL0->PSCCTL0_SET = CLKCTL0_PSCCTL0_SET_FLEXSPI0_MASK;\r\n        /* Re-enable FLEXSPI module */\r\n        initFlexSPI(FLEXSPI);\r\n    }\r\n}\r\n\r\nvoid POWER_ConfigCauInSleep(bool pdCau)\r\n{\r\n    if (pdCau) /* xtal / cau full pd */\r\n    {\r\n        CAU->PD_CTRL_ONE_REG |= 0x4U;\r\n        CAU->SLP_CTRL_ONE_REG = 0xCU;\r\n    }\r\n    else\r\n    {\r\n        CAU->PD_CTRL_ONE_REG &= 0xFBU;\r\n        CAU->SLP_CTRL_ONE_REG = 0x9EU;\r\n        CAU->SLP_CTRL_TWO_REG = 0x6AU;\r\n    }\r\n}\r\n\r\n/* Prepare to go to low power\r\n *  Change clock source to RC32M\r\n *   Switch off PLLs, XTAL\r\n *  Set Deep sleep bit in SRC register\r\n *  Initiate state change\r\n */\r\nAT_QUICKACCESS_SECTION_CODE(static void POWER_PrePowerMode(uint32_t mode, const power_sleep_config_t *config))\r\n{\r\n    uint32_t wlanPowerStatus, blePowerStatus;\r\n\r\n    assert((mode >= 1U) && (mode <= 4U));\r\n    /* Turn off Systick to avoid interrupt\r\n     *  when entering low power state\r\n     */\r\n    s_systickContext.CTRL = SysTick->CTRL;\r\n    s_systickContext.LOAD = SysTick->LOAD;\r\n    SysTick->CTRL         = 0;\r\n    SysTick->LOAD         = 0;\r\n\r\n    POWER_SetSleepMode(mode);\r\n\r\n    if ((mode == 2U) || (mode == 3U) || (mode == 4U))\r\n    {\r\n        /* To enter PM2/PM3/PM4, GDET sensor must be disabled */\r\n        assert(s_gdetSensorContext.disableCount > 0);\r\n    }\r\n\r\n    s_clockContext.SOURCE_CLK_GATE = SYSCTL2->SOURCE_CLK_GATE;\r\n\r\n    if (mode == 2U)\r\n    {\r\n        /* Deinit FlexSPI in case XIP */\r\n        deinitXip();\r\n        /* Keep all modules power on in SW controlled CFG */\r\n        SYSCTL2->MEM_PD_CFG = 0U;\r\n        /* Enable SW control for modules need be powered on, the others are powered down by HW */\r\n        SYSCTL2->MEM_PD_CTRL = config->pm2MemPuCfg & (uint32_t)kPOWER_Pm2MemPuAll;\r\n        Power_ConfigClkGate(config);\r\n    }\r\n    else if (mode >= 3U)\r\n    {\r\n        /* Turn off the short switch between C18/C11 and V18/V11.\r\n           In sleep mode, V11 drops to 0.8V */\r\n        BUCK18->BUCK_CTRL_TWENTY_REG = 0x75U;\r\n        if (mode == 3U)\r\n        {\r\n            POWER_SaveNvicState();\r\n\r\n            PMU->MEM_CFG = (PMU->MEM_CFG & ~PMU_MEM_CFG_MEM_RET_MASK) | (config->memPdCfg & PMU_MEM_CFG_MEM_RET_MASK);\r\n            PMU->PMIP_BUCK_CTRL = (PMU->PMIP_BUCK_CTRL & ~((uint32_t)kPOWER_Pm3BuckAll)) |\r\n                                  (config->pm3BuckCfg & (uint32_t)kPOWER_Pm3BuckAll);\r\n            /* Clear reset status */\r\n            PMU->SYS_RST_CLR = 0x7FU;\r\n        }\r\n        else if (mode == 4U)\r\n        {\r\n            wlanPowerStatus = POWER_WLAN_POWER_STATUS();\r\n            blePowerStatus  = POWER_BLE_POWER_STATUS();\r\n\r\n            PMU->MEM_CFG =\r\n                (PMU->MEM_CFG & ~PMU_MEM_CFG_AON_MEM_RET_MASK) | (config->memPdCfg & PMU_MEM_CFG_AON_MEM_RET_MASK);\r\n            if ((wlanPowerStatus == POWER_WLAN_BLE_POWER_OFF) && (blePowerStatus == POWER_WLAN_BLE_POWER_OFF))\r\n            {\r\n                /* pm422, LDO 0.8V, 1.8V */\r\n                PMU->PMIP_LDO_LVL = PMU_PMIP_LDO_LVL_LDO18_SEL(4) | PMU_PMIP_LDO_LVL_LDO11_SEL(1);\r\n            }\r\n            /* Clear reset status */\r\n            PMU->SYS_RST_CLR = 0x7FU;\r\n        }\r\n        else\r\n        {\r\n            assert(false);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        /* PM1: Do nothing */\r\n    }\r\n\r\n    if (s_preSwitch != NULL)\r\n    {\r\n        s_preSwitch(mode, s_preSwitchParam);\r\n    }\r\n}\r\n\r\nAT_QUICKACCESS_SECTION_CODE(static bool POWER_PostPowerMode(uint32_t mode))\r\n{\r\n    assert((mode >= 1U) && (mode <= 4U));\r\n\r\n    if (s_postSwitch != NULL)\r\n    {\r\n        s_postSwitch(mode, s_postSwitchParam);\r\n    }\r\n\r\n    POWER_SetSleepMode(1U);\r\n\r\n    SYSCTL2->SOURCE_CLK_GATE = s_clockContext.SOURCE_CLK_GATE;\r\n\r\n    if (mode == 2U)\r\n    {\r\n        initXip();\r\n    }\r\n    else if (mode == 3U)\r\n    {\r\n        SystemInit();\r\n        POWER_RestoreNvicState();\r\n        initXip();\r\n    }\r\n    else\r\n    {\r\n        /* PM1: Do nothing */\r\n    }\r\n\r\n    if ((mode == 3U) && (PMU->PWR_MODE_STATUS == 2U))\r\n    {\r\n        /* Successfully resumed from PM3, GDET is enabled by ROM. */\r\n        assert(s_gdetSensorContext.disableCount > 0);\r\n        s_gdetSensorContext.disableCount--;\r\n    }\r\n\r\n    SysTick->CTRL = s_systickContext.CTRL;\r\n    SysTick->LOAD = s_systickContext.LOAD;\r\n\r\n    return (mode == 1U) || (PMU->PWR_MODE_STATUS == (mode - 1U)); /* PM1 doesn't update PWR_MODE_STATUS */\r\n}\r\n\r\nAT_QUICKACCESS_SECTION_CODE(static void POWER_EnterPm3Asm(void))\r\n{\r\n    uint32_t clk    = CLKCTL0->PSCCTL0;\r\n    uint32_t rst    = RSTCTL0->PRSTCTL0;\r\n    uint32_t rtcClk = CLKCTL1->PSCCTL2 & CLKCTL1_PSCCTL2_RTC_LITE_MASK;\r\n\r\n    /* Enable AON MEM clock/reset. */\r\n    CLKCTL0->PSCCTL0_SET  = CLKCTL0_PSCCTL0_SET_AON_MEM_MASK;\r\n    RSTCTL0->PRSTCTL0_CLR = RSTCTL0_PRSTCTL0_CLR_AON_MEM_MASK;\r\n\r\n    /* Address: 0x4015C000 is the address in NVRAM which holds address\r\n     * where control returns after exit from PM3.\r\n     * All general purpose registers and special registers\r\n     * are saved by pushing them on current thread's stack\r\n     * and finally SP is saved in NVRAM address 0x4015C004. */\r\n    __ASM volatile(\r\n        \"push {r0-r12, lr}\\n\"\r\n        \"mrs r1, basepri\\n\"\r\n        \"push {r1}\\n\"\r\n        \"mrs r1, primask\\n\"\r\n        \"push {r1}\\n\"\r\n        \"mrs r1, faultmask\\n\"\r\n        \"push {r1}\\n\"\r\n        \"mrs r1, control\\n\"\r\n        \"bic r2, r1, #2\\n\"\r\n        \"msr control, r2\\n\" /* Use MSP */\r\n        \"push {r1}\\n\"       /* CONTROL */\r\n        \"mrs r1, psp\\n\"\r\n        \"push {r1}\\n\" /* PSP */\r\n        \"mrs r1, psplim\\n\"\r\n        \"push {r1}\\n\" /* PSPLIM */\r\n        \"mrs r1, msplim\\n\"\r\n        \"push {r1}\\n\" /* MSPLIM */\r\n        \"ldr r0, =0x4015C004\\n\"\r\n        \"str sp, [r0]\\n\" /* MSP */\r\n        \"ldr r0, =0x4015C000\\n\"\r\n        \"mov r1, pc\\n\"\r\n        \"add r1, r1 , #21\\n\"\r\n        \"str r1, [r0]\\n\");\r\n    /*\r\n     * Execute WFI to generate a state change\r\n     * and system is in an unresponsive state\r\n     * press wakeup key to get it out of standby\r\n     * If time_to_standby is set to valid value\r\n     * RTC is programmed and RTC generates\r\n     * a wakeup signal.\r\n     */\r\n    __DSB();\r\n    __WFI();\r\n    __ISB();\r\n\r\n    __NOP();\r\n    __NOP();\r\n    __NOP();\r\n    __NOP();\r\n    __NOP();\r\n    __NOP();\r\n    __NOP();\r\n\r\n    /* When system exits PM3 all registers need to be\r\n     * restored as they are lost. */\r\n\r\n    /*\r\n     * When MCU enters PM3 all Core registers\r\n     * r0-r12\r\n     * lr\r\n     * basepri\r\n     * primask\r\n     * faultmask\r\n     * control\r\n     * psp\r\n     * psplim\r\n     * msplim\r\n     * are lost (ZERO) as MCU power is tuned off\r\n     * On wakeup from PM3, this piece of code restores\r\n     * these registers which were saved before entry.\r\n     * The location of saving this register was on stack\r\n     */\r\n    __ASM volatile(\r\n        \"ldr r0, =0x4015C004\\n\"\r\n        \"ldr sp, [r0]\\n\"\r\n        \"pop {r4}\\n\"   /* MSPLIM */\r\n        \"pop {r5}\\n\"   /* PSPLIM */\r\n        \"pop {r1}\\n\"   /* PSP */\r\n        \"pop {r2}\\n\"   /* CONTROL */\r\n        \"mov r3, sp\\n\" /* MSP */\r\n        \"msr msplim, r4\\n\"\r\n        \"msr psplim, r5\\n\"\r\n        \"msr msp, r3\\n\"\r\n        \"msr psp, r1\\n\"\r\n        \"msr control, r2\\n\"\r\n        \"pop {r1}\\n\"\r\n        \"msr faultmask, r1\\n\"\r\n        \"pop {r1}\\n\"\r\n        \"msr primask, r1\\n\"\r\n        \"pop {r1}\\n\"\r\n        \"msr basepri, r1\\n\"\r\n        \"pop {r0-r12, lr}\\n\");\r\n    /* Restore AON MEM clock/reset */\r\n    CLKCTL0->PSCCTL0     = clk;\r\n    RSTCTL0->PRSTCTL0    = rst;\r\n    CLKCTL1->PSCCTL2_SET = rtcClk;\r\n}\r\n\r\nstatic void POWER_InitVSensorThreshold(uint8_t volt11, uint32_t pack)\r\n{\r\n    uint32_t val;\r\n    uint32_t svcMv;\r\n    power_threshold_params_t v11 = {0};\r\n    power_threshold_params_t v18 = {0};\r\n    power_threshold_params_t v33 = {0};\r\n\r\n    POWER_GetThresholdParams(pack, &v11, &v18, &v33);\r\n\r\n    /* Disable V11 sensor */\r\n    val                            = SENSOR_CTRL->VSEN_CTRL_1_REG_1;\r\n    SENSOR_CTRL->VSEN_CTRL_1_REG_1 = val & ~SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_SW_ENABLE_MASK;\r\n    /* Configure threshold */\r\n    svcMv = (uint32_t)(volt11)*5U + 630U;\r\n    val   = val & ~(SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_MAX_VOLTAGE_THR_MASK |\r\n                  SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_MIN_VOLTAGE_THR_MASK);\r\n    val |= SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_MAX_VOLTAGE_THR(\r\n        (v11.param1 * (svcMv * 10U + v11.margin) + v11.param2 + 999999U) / 1000000U);\r\n    val |= SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_MIN_VOLTAGE_THR((v11.param1 * (svcMv * 10U - v11.margin) + v11.param2) /\r\n                                                              1000000U);\r\n    SENSOR_CTRL->VSEN_CTRL_1_REG_1 = val & ~SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_SW_ENABLE_MASK;\r\n    /* Restore V11 sensor */\r\n    SENSOR_CTRL->VSEN_CTRL_1_REG_1 = val;\r\n\r\n    /* Disable V18 sensor */\r\n    val                            = SENSOR_CTRL->VSEN_CTRL_2_REG_1;\r\n    SENSOR_CTRL->VSEN_CTRL_2_REG_1 = val & ~SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_SW_ENABLE_MASK;\r\n    /* Configure threshold */\r\n    val = val & ~(SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_MAX_VOLTAGE_THR_MASK |\r\n                  SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_MIN_VOLTAGE_THR_MASK);\r\n    val |= SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_MAX_VOLTAGE_THR(\r\n        (v18.param1 * (1890U * 10U + v18.margin) + v18.param2 + 999999U) / 1000000U);\r\n    val |= SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_MIN_VOLTAGE_THR((v18.param1 * (1710U * 10U - v18.margin) + v18.param2) /\r\n                                                              1000000U);\r\n    SENSOR_CTRL->VSEN_CTRL_2_REG_1 = val & ~SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_SW_ENABLE_MASK;\r\n    /* Restore V18 sensor */\r\n    SENSOR_CTRL->VSEN_CTRL_2_REG_1 = val;\r\n\r\n    /* Disable V33 sensor */\r\n    val                            = SENSOR_CTRL->VSEN_CTRL_3_REG_1;\r\n    SENSOR_CTRL->VSEN_CTRL_3_REG_1 = val & ~SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_SW_ENABLE_MASK;\r\n    /* Configure threshold */\r\n    val = val & ~(SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_MAX_VOLTAGE_THR_MASK |\r\n                  SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_MIN_VOLTAGE_THR_MASK);\r\n    val |= SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_MAX_VOLTAGE_THR(\r\n        (v33.param1 * (3630U * 10U + v33.margin) + v33.param2 + 999999U) / 1000000U);\r\n    val |= SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_MIN_VOLTAGE_THR((v33.param1 * (1850U * 10U - v33.margin) + v33.param2) /\r\n                                                              1000000U);\r\n    SENSOR_CTRL->VSEN_CTRL_3_REG_1 = val & ~SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_SW_ENABLE_MASK;\r\n    /* Restore V33 sensor */\r\n    SENSOR_CTRL->VSEN_CTRL_3_REG_1 = val;\r\n}\r\n\r\nvoid POWER_GetCurrentSleepConfig(power_sleep_config_t *config)\r\n{\r\n    assert(config != NULL);\r\n\r\n    config->pm2MemPuCfg = (~SYSCTL2->MEM_PD_CFG) & (SYSCTL2->MEM_PD_CTRL);\r\n    config->pm2AnaPuCfg = (~SYSCTL2->ANA_PDWN_PM2) & (uint32_t)kPOWER_Pm2AnaPuAll;\r\n    config->clkGate     = SYSCTL2->SOURCE_CLK_GATE;\r\n    config->memPdCfg    = PMU->MEM_CFG;\r\n    config->pm3BuckCfg  = PMU->PMIP_BUCK_CTRL & (uint32_t)kPOWER_Pm3BuckAll;\r\n}\r\n\r\nvoid POWER_InitPowerConfig(const power_init_config_t *config)\r\n{\r\n    uint32_t reg;\r\n    bool iBuck, gateCauRefClk;\r\n\r\n    assert(config != NULL);\r\n\r\n    iBuck         = config->iBuck;\r\n    gateCauRefClk = config->gateCauRefClk;\r\n\r\n    BUCK11->BUCK_CTRL_THREE_REG  = 0x10U;\r\n    BUCK18->BUCK_CTRL_THREE_REG  = 0x10U;\r\n    BUCK18->BUCK_CTRL_TWENTY_REG = 0x55U;\r\n\r\n    SYSCTL0->AUTOCLKGATEOVERRIDE0 = 0U;\r\n    /* Enable RAM dynamic clk gate */\r\n    SYSCTL0->AUTOCLKGATEOVERRIDE1 = 0U;\r\n    /* Enable ROM dynamic clk gate */\r\n    SYSCTL2->ROM_DYN_CLK_EN = SYSCTL2_ROM_DYN_CLK_EN_ROM_DYN_CLK_EN_MASK;\r\n\r\n    PMU->PMIP_LDO_LVL = 0U;\r\n    if (iBuck)\r\n    {\r\n        /* No timeout with internal supply. */\r\n        PMU->TIME_OUT_CTRL = PMU_TIME_OUT_CTRL_V11_RDY_NO_TMT_MASK | PMU_TIME_OUT_CTRL_V18_RDY_NO_TMT_MASK |\r\n                             PMU_TIME_OUT_CTRL_PSW_MCI_RDY_NO_TMT_MASK;\r\n    }\r\n    else\r\n    {\r\n        /* Use timeout mode with external supply for VCORE and AVDD18. */\r\n        PMU->TIME_OUT_CTRL      = PMU_TIME_OUT_CTRL_PSW_MCI_RDY_NO_TMT_MASK;\r\n        PMU->TIME_OUT_CFG_VALUE = 0x3FFFFFFFU;\r\n    }\r\n\r\n    PMU->SOC_MEM_PDWN &= ~(PMU_SOC_MEM_PDWN_MSC_MEM_PDWN_CTRL_MASK | PMU_SOC_MEM_PDWN_SOCTOP_OTP_PDWN_CTRL_MASK);\r\n    PMU->CAU_SLP_CTRL = gateCauRefClk ? PMU_CAU_SLP_CTRL_CAU_SOC_SLP_CG_MASK : 0U;\r\n\r\n    /* Open usb clock and release reset */\r\n    reg                   = CLKCTL0->PSCCTL0;\r\n    CLKCTL0->PSCCTL0_SET  = CLKCTL0_PSCCTL0_SET_USB_MASK;\r\n    RSTCTL0->PRSTCTL0_CLR = RSTCTL0_PRSTCTL0_CLR_USB_MASK;\r\n    POWER_DelayUs(1U);\r\n    /* Restore usb clk. */\r\n    CLKCTL0->PSCCTL0 = reg;\r\n\r\n    /* Disable G2BIST CLK */\r\n    CLKCTL0->G2BIST_CLK_EN = 0U;\r\n}\r\n\r\nvoid POWER_SetPowerSwitchCallback(power_switch_callback_t pre,\r\n                                  void *preParam,\r\n                                  power_switch_callback_t post,\r\n                                  void *postParam)\r\n{\r\n    s_preSwitch       = pre;\r\n    s_preSwitchParam  = preParam;\r\n    s_postSwitch      = post;\r\n    s_postSwitchParam = postParam;\r\n}\r\n\r\nbool POWER_EnterPowerMode(uint32_t mode, const power_sleep_config_t *config)\r\n{\r\n    uint32_t primask;\r\n    bool ret = true;\r\n\r\n    assert(mode <= 4U);\r\n\r\n    /* Needed to make POWER_DelayUs() accurate. */\r\n    SystemCoreClockUpdate();\r\n\r\n    if (mode >= 1U)\r\n    {\r\n        primask = DisableGlobalIRQ();\r\n        POWER_PrePowerMode(mode, config);\r\n        if (mode == 3U)\r\n        {\r\n            POWER_EnterPm3Asm();\r\n        }\r\n        else\r\n        {\r\n            __DSB();\r\n            __WFI();\r\n            __ISB();\r\n        }\r\n        ret = POWER_PostPowerMode(mode);\r\n        EnableGlobalIRQ(primask);\r\n    }\r\n\r\n    return ret;\r\n}\r\n\r\nvoid POWER_PowerOnWlan(void)\r\n{\r\n    if (POWER_WLAN_POWER_STATUS() == POWER_WLAN_BLE_POWER_OFF)\r\n    {\r\n        /* Enable SW control */\r\n        PMU->SW_CTRL_WL |= PMU_SW_CTRL_WL_WL_EN_MASK;\r\n        /* WLan request buck on, then need wait 5 fast clk_pmu cycles, do psw on, then iso release */\r\n        PMU->SW_CTRL_WL |= PMU_SW_CTRL_WL_WL_BUCK_ON_REQ_MASK;\r\n        /* Wait buck on */\r\n        POWER_WAIT_PMU();\r\n\r\n        PMU->SW_CTRL_WL &= ~PMU_SW_CTRL_WL_PSW_WL_PD_MASK;\r\n        /* Wait PSW ready */\r\n        SystemCoreClockUpdate();\r\n        POWER_DelayUs(50U);\r\n        /* Disable ISO */\r\n        PMU->SW_CTRL_WL |= PMU_SW_CTRL_WL_MCI_ISO_WL_N_MASK;\r\n        /* Wait about 125us */\r\n        POWER_DelayUs(125U);\r\n        /* Release WLan */\r\n        PMU->SW_CTRL_WL &= ~PMU_SW_CTRL_WL_MCI_WL_PU_RST_MASK;\r\n    }\r\n}\r\n\r\nvoid POWER_PowerOffWlan(void)\r\n{\r\n    if (POWER_WLAN_POWER_STATUS() != POWER_WLAN_BLE_POWER_OFF)\r\n    {\r\n        /* Enable SW control */\r\n        PMU->SW_CTRL_WL |= PMU_SW_CTRL_WL_WL_EN_MASK;\r\n        /* Enable ISO before PSW off */\r\n        PMU->SW_CTRL_WL &= ~PMU_SW_CTRL_WL_MCI_ISO_WL_N_MASK;\r\n        POWER_WAIT_PMU();\r\n        PMU->SW_CTRL_WL |= PMU_SW_CTRL_WL_PSW_WL_PD_MASK;\r\n        /* Wait PSW off */\r\n        while ((SOCCTRL->PSW_VD2_RDY0 & (1UL << 1)) == 0U)\r\n        {\r\n        }\r\n        /* Reset WLan */\r\n        PMU->SW_CTRL_WL |= PMU_SW_CTRL_WL_MCI_WL_PU_RST_MASK;\r\n        /* Request buck off */\r\n        PMU->SW_CTRL_WL |= PMU_SW_CTRL_WL_WL_BUCK_OFF_REQ_MASK;\r\n    }\r\n}\r\n\r\nvoid POWER_PowerOnBle(void)\r\n{\r\n    if (POWER_BLE_POWER_STATUS() == POWER_WLAN_BLE_POWER_OFF)\r\n    {\r\n        /* Enable SW control */\r\n        PMU->SW_CTRL_BLE |= PMU_SW_CTRL_BLE_BLE_EN_MASK;\r\n        /* BLE request buck on, then need wait 5 fast clk_pmu cycles(about 96ns),do psw on, then iso release */\r\n        PMU->SW_CTRL_BLE |= PMU_SW_CTRL_BLE_BLE_BUCK_ON_REQ_MASK;\r\n        /* Wait buck on */\r\n        POWER_WAIT_PMU();\r\n        PMU->SW_CTRL_BLE &= ~PMU_SW_CTRL_BLE_PSW_BLE_PD_MASK;\r\n        /* Wait PSW ready */\r\n        SystemCoreClockUpdate();\r\n        POWER_DelayUs(50U);\r\n        /* Disable ISO */\r\n        PMU->SW_CTRL_BLE |= PMU_SW_CTRL_BLE_MCI_ISO_BLE_N_MASK;\r\n        /* Wait about 125us */\r\n        POWER_DelayUs(125U);\r\n        /* Release BLE */\r\n        PMU->SW_CTRL_BLE &= ~PMU_SW_CTRL_BLE_MCI_BLE_PU_RST_MASK;\r\n    }\r\n}\r\n\r\nvoid POWER_PowerOffBle(void)\r\n{\r\n    if (POWER_BLE_POWER_STATUS() != POWER_WLAN_BLE_POWER_OFF)\r\n    {\r\n        /* Enable SW control */\r\n        PMU->SW_CTRL_BLE |= PMU_SW_CTRL_BLE_BLE_EN_MASK;\r\n        /* Enable ISO before PSW off */\r\n        PMU->SW_CTRL_BLE &= ~PMU_SW_CTRL_BLE_MCI_ISO_BLE_N_MASK;\r\n        POWER_WAIT_PMU();\r\n        PMU->SW_CTRL_BLE |= PMU_SW_CTRL_BLE_PSW_BLE_PD_MASK;\r\n        /* Wait PSW off */\r\n        while ((SOCCTRL->PSW_VD2_RDY0 & (1UL << 9)) == 0U)\r\n        {\r\n        }\r\n        /* Reset BLE */\r\n        PMU->SW_CTRL_BLE |= PMU_SW_CTRL_BLE_MCI_BLE_PU_RST_MASK;\r\n        /* Request buck off */\r\n        PMU->SW_CTRL_BLE |= PMU_SW_CTRL_BLE_BLE_BUCK_OFF_REQ_MASK;\r\n    }\r\n}\r\n\r\nvoid POWER_PowerOnGau(void)\r\n{\r\n    GAU_BG->CTRL &= ~BG_CTRL_PD_MASK;\r\n    while ((GAU_BG->STATUS & BG_STATUS_RDY_MASK) == 0U)\r\n    {\r\n    }\r\n}\r\n\r\nvoid POWER_PowerOffGau(void)\r\n{\r\n    GAU_BG->CTRL |= BG_CTRL_PD_MASK;\r\n}\r\n\r\nvoid POWER_EnableCaptSlowPulseTimer(capt_slow_pulse_width_t width,\r\n                                    capt_slow_pulse_edge_t edge,\r\n                                    uint32_t timeout,\r\n                                    capt_pulse_timer_callback_t cb,\r\n                                    void *param)\r\n{\r\n    s_captPulseCb            = cb;\r\n    s_captPulseCbParam       = param;\r\n    PMU->CAPT_PULSE          = PMU_CAPT_PULSE_IRQ_CLR_MASK | PMU_CAPT_PULSE_IRQ_MSK_MASK;\r\n    PMU->CAPT_PULSE_BASE_VAL = timeout;\r\n    PMU->CAPT_PULSE          = PMU_CAPT_PULSE_IC_WIDTH_CLK_CNT(width) | PMU_CAPT_PULSE_IC_EDGE_CLK_CNT(edge);\r\n    PMU->CAPT_PULSE |= PMU_CAPT_PULSE_CAPTURE_SLOW_PULSE_CNT_EN_MASK;\r\n}\r\n\r\nvoid POWER_EnableCaptFastPulseTimer(uint32_t timeout, capt_pulse_timer_callback_t cb, void *param)\r\n{\r\n    s_captPulseCb            = cb;\r\n    s_captPulseCbParam       = param;\r\n    PMU->CAPT_PULSE          = PMU_CAPT_PULSE_IRQ_CLR_MASK | PMU_CAPT_PULSE_IRQ_MSK_MASK;\r\n    PMU->CAPT_PULSE_BASE_VAL = timeout;\r\n    PMU->CAPT_PULSE          = PMU_CAPT_PULSE_CLK_SEL_MASK;\r\n    PMU->CAPT_PULSE |= PMU_CAPT_PULSE_CAPTURE_FAST_PULSE_CNT_EN_MASK;\r\n}\r\n\r\nvoid POWER_DisableCaptPulseTimer(void)\r\n{\r\n    PMU->CAPT_PULSE = PMU_CAPT_PULSE_IRQ_CLR_MASK | PMU_CAPT_PULSE_IRQ_MSK_MASK;\r\n}\r\n\r\nvoid Power_InitLoadGdetCfg(power_load_gdet_cfg loadFunc, const power_gdet_data_t *data, uint32_t pack)\r\n{\r\n    assert(loadFunc != NULL);\r\n    assert(data != NULL);\r\n    assert(pack <= 2U);\r\n\r\n    s_gdetCfgloadFunc = loadFunc;\r\n    (void)memcpy(&s_gdetCfgData, data, sizeof(power_gdet_data_t));\r\n    s_gdetCfgData.CFG[3] = POWER_TrimSvc(data->CFG[3], pack);\r\n}\r\n\r\n/* Configure voltage threshold */\r\nvoid POWER_InitVoltage(uint32_t dro, uint32_t pack)\r\n{\r\n    int32_t i;\r\n    uint8_t val;\r\n\r\n    SystemCoreClockUpdate();\r\n\r\n    /* LPBG trim */\r\n    BUCK11->BUCK_CTRL_EIGHTEEN_REG = 0x6U;\r\n\r\n    if (dro == 0U)\r\n    { /* Boot voltage 1.11V */\r\n        val = 0x60U;\r\n    }\r\n    else\r\n    {\r\n        /* Change buck level */\r\n        dro /= 1000U;\r\n        i = 36 - (int32_t)dro;\r\n        assert((i >= 0) && ((uint32_t)i < ARRAY_SIZE(s_droTable)));\r\n        val = s_droTable[i];\r\n    }\r\n    PMU->PMIP_BUCK_LVL = PMU_PMIP_BUCK_LVL_SLEEP_BUCK18_SEL(0x60U) |  /* 1.8V */\r\n                         PMU_PMIP_BUCK_LVL_SLEEP_BUCK11_SEL(0x22U) |  /* 0.8V */\r\n                         PMU_PMIP_BUCK_LVL_NORMAL_BUCK18_SEL(0x60U) | /* 1.8V */\r\n                         PMU_PMIP_BUCK_LVL_NORMAL_BUCK11_SEL(val);\r\n    /* Delay 600us */\r\n    POWER_DelayUs(600U);\r\n\r\n    POWER_InitVSensorThreshold(val, pack);\r\n}\r\n\r\nvoid POWER_DisableGDetVSensors(void)\r\n{\r\n    uint32_t val;\r\n    uint32_t pscctl0, pscctl1, pscctl2;\r\n    uint32_t rstctl0, rstctl1;\r\n\r\n    if (s_gdetSensorContext.disableCount == 0)\r\n    {\r\n        pscctl0 = CLKCTL0->PSCCTL0;\r\n        pscctl1 = CLKCTL0->PSCCTL1;\r\n        pscctl2 = CLKCTL0->PSCCTL2;\r\n        rstctl0 = RSTCTL0->PRSTCTL0;\r\n        rstctl1 = RSTCTL0->PRSTCTL1;\r\n\r\n        /* Enable ELS/ITRC clock */\r\n        CLKCTL0->PSCCTL0_SET = CLKCTL0_PSCCTL0_ELS_MASK;\r\n        CLKCTL0->PSCCTL1_SET = CLKCTL0_PSCCTL1_ELS_APB_MASK;\r\n        CLKCTL0->PSCCTL2_SET = CLKCTL0_PSCCTL2_ITRC_MASK;\r\n        /* Clear ELS reset */\r\n        RSTCTL0->PRSTCTL0_CLR = RSTCTL0_PRSTCTL0_ELS_MASK;\r\n        RSTCTL0->PRSTCTL1_CLR = RSTCTL0_PRSTCTL1_ELS_APB_MASK;\r\n\r\n        s_gdetSensorContext.ELS_EN = ELS->ELS_CTRL & ELS_ELS_CTRL_ELS_EN_MASK;\r\n\r\n        /* Save GDET VSEN config */\r\n        POWER_SaveGdetVSensorConfig();\r\n        if (s_gdetSensorContext.ELS_EN != 0U)\r\n        {\r\n            s_gdetSensorContext.ELS_INT_ENABLE = ELS->ELS_INT_ENABLE;\r\n        }\r\n\r\n        /* Disable ITRC interrupts, especially security sensors */\r\n        /* Disable V11 sensor */\r\n        val = SENSOR_CTRL->VSEN_CTRL_1_REG_1 & ~SENSOR_CTRL_VSEN_CTRL_1_REG_1_VSEN_SW_ENABLE_MASK;\r\n        SENSOR_CTRL->VSEN_CTRL_1_REG_1 = val;\r\n\r\n        /* Disable V18 sensor */\r\n        val = SENSOR_CTRL->VSEN_CTRL_2_REG_1 & ~SENSOR_CTRL_VSEN_CTRL_2_REG_1_VSEN_SW_ENABLE_MASK;\r\n        SENSOR_CTRL->VSEN_CTRL_2_REG_1 = val;\r\n\r\n        /* Disable V33 sensor */\r\n        val = SENSOR_CTRL->VSEN_CTRL_3_REG_1 & ~SENSOR_CTRL_VSEN_CTRL_3_REG_1_VSEN_SW_ENABLE_MASK;\r\n        SENSOR_CTRL->VSEN_CTRL_3_REG_1 = val;\r\n\r\n        if (s_gdetSensorContext.ELS_EN != 0U)\r\n        {\r\n            /* Disable CSS_INT_ENABLE[GDET_INT_EN] bit field */\r\n            ELS->ELS_INT_ENABLE &= ~ELS_ELS_INT_ENABLE_GDET_INT_EN_MASK;\r\n        }\r\n\r\n        /* Disable aGDET/LVD/HVD interrupts in ITRC */\r\n        val             = ITRC->OUT0_SEL0 & ~ITRC_OUT_SEL_MASK;\r\n        ITRC->OUT0_SEL0 = val | ITRC_OUT_SEL_DISABLE;\r\n        val             = ITRC->OUT1_SEL0 & ~ITRC_OUT_SEL_MASK;\r\n        ITRC->OUT1_SEL0 = val | ITRC_OUT_SEL_DISABLE;\r\n\r\n        val                        = ITRC->OUT0_SEL0_EVENT16_31 & ~ITRC_OUT_SEL_EVENT_MASK;\r\n        ITRC->OUT0_SEL0_EVENT16_31 = val | ITRC_OUT_SEL_EVENT_DISABLE;\r\n        val                        = ITRC->OUT1_SEL0_EVENT16_31 & ~ITRC_OUT_SEL_EVENT_MASK;\r\n        ITRC->OUT1_SEL0_EVENT16_31 = val | ITRC_OUT_SEL_EVENT_DISABLE;\r\n\r\n        /* Restore ELS/ITRC clock */\r\n        CLKCTL0->PSCCTL0 = pscctl0;\r\n        CLKCTL0->PSCCTL1 = pscctl1;\r\n        CLKCTL0->PSCCTL2 = pscctl2;\r\n        /* Restore ELS reset */\r\n        RSTCTL0->PRSTCTL0 = rstctl0;\r\n        RSTCTL0->PRSTCTL1 = rstctl1;\r\n    }\r\n\r\n    s_gdetSensorContext.disableCount++;\r\n}\r\n\r\nbool POWER_EnableGDetVSensors(void)\r\n{\r\n    uint32_t pscctl0, pscctl1, pscctl2;\r\n    uint32_t rstctl0, rstctl1;\r\n    bool retval = true;\r\n\r\n    s_gdetSensorContext.disableCount--;\r\n\r\n    if (s_gdetSensorContext.disableCount == 0)\r\n    {\r\n        pscctl0 = CLKCTL0->PSCCTL0;\r\n        pscctl1 = CLKCTL0->PSCCTL1;\r\n        pscctl2 = CLKCTL0->PSCCTL2;\r\n        rstctl0 = RSTCTL0->PRSTCTL0;\r\n        rstctl1 = RSTCTL0->PRSTCTL1;\r\n\r\n        /* Enable ELS/ITRC clock */\r\n        CLKCTL0->PSCCTL0_SET = CLKCTL0_PSCCTL0_ELS_MASK;\r\n        CLKCTL0->PSCCTL1_SET = CLKCTL0_PSCCTL1_ELS_APB_MASK;\r\n        CLKCTL0->PSCCTL2_SET = CLKCTL0_PSCCTL2_ITRC_MASK;\r\n        /* Clear ELS reset */\r\n        RSTCTL0->PRSTCTL0_CLR = RSTCTL0_PRSTCTL0_ELS_MASK;\r\n        RSTCTL0->PRSTCTL1_CLR = RSTCTL0_PRSTCTL1_ELS_APB_MASK;\r\n\r\n        /* Only in the normal flow that GDET_INT_EN is disabled, we will restore GDET config here.\r\n         * An exception is that we call POWER_DisableGDetVSensors() before PM3 and then wake up\r\n         * from ROM. In that case, ELS_INT_ENABLE will be set by ROM again and we shouldn't config\r\n         * GDET here. */\r\n        if (((ELS->ELS_CTRL & ELS_ELS_CTRL_ELS_EN_MASK) != 0U) &&\r\n            (ELS->ELS_INT_ENABLE & ELS_ELS_INT_ENABLE_GDET_INT_EN_MASK) == 0U)\r\n        {\r\n            POWER_RestoreGdetVSensorConfig();\r\n            if ((s_gdetSensorContext.ELS_EN != 0U) && (s_gdetSensorContext.ELS_INT_ENABLE != 0U))\r\n            {\r\n                /* To enable GDET, load function must be configured. */\r\n                if (s_gdetCfgloadFunc == NULL)\r\n                {\r\n                    retval = false;\r\n                }\r\n                else\r\n                {\r\n                    /* GDET config must be loaded correctly for GDET working. */\r\n                    retval = s_gdetCfgloadFunc(&s_gdetCfgData);\r\n                }\r\n\r\n                /* Clear GDET errors */\r\n                ELS->ELS_INT_STATUS_CLR =\r\n                    ELS_ELS_INT_STATUS_CLR_INT_CLR_MASK | ELS_ELS_INT_STATUS_CLR_GDET_INT_CLR_MASK;\r\n                ELS->ELS_ERR_STATUS_CLR  = ELS_ELS_ERR_STATUS_CLR_ERR_CLR_MASK;\r\n                ELS->ELS_GDET_EVTCNT_CLR = ELS_ELS_GDET_EVTCNT_CLR_GDET_EVTCNT_CLR_MASK;\r\n                /* Clear Sensor errors */\r\n                SENSOR_CTRL->SEN_CLR_REG = 0x3CU;\r\n                /* Clear ITRC status */\r\n                ITRC->STATUS0 = ITRC->STATUS0;\r\n                ITRC->STATUS1 = ITRC->STATUS1;\r\n                if (retval)\r\n                {\r\n                    ELS->ELS_INT_ENABLE = s_gdetSensorContext.ELS_INT_ENABLE;\r\n                }\r\n            }\r\n        }\r\n\r\n        /* Restore ELS/ITRC clock */\r\n        CLKCTL0->PSCCTL0 = pscctl0;\r\n        CLKCTL0->PSCCTL1 = pscctl1;\r\n        CLKCTL0->PSCCTL2 = pscctl2;\r\n        /* Restore ELS reset */\r\n        RSTCTL0->PRSTCTL0 = rstctl0;\r\n        RSTCTL0->PRSTCTL1 = rstctl1;\r\n    }\r\n\r\n    return retval;\r\n}\r\n\r\nuint32_t POWER_TrimSvc(uint32_t gdetTrim, uint32_t pack)\r\n{\r\n    int32_t x;\r\n    int32_t y1, y3;\r\n    uint32_t trimSvc = gdetTrim;\r\n    uint32_t clk;\r\n    uint32_t rst;\r\n    uint32_t revision = SOCCTRL->CHIP_INFO & SOCCIU_CHIP_INFO_REV_NUM_MASK;\r\n\r\n    if (revision == 2U)\r\n    {\r\n        /* A2 */\r\n        /* Autotrim value at [7:0] */\r\n        x = (int32_t)(uint32_t)(gdetTrim & 0xFFUL);\r\n        if (pack == 0U)\r\n        {\r\n            /* QFN */\r\n            y1 = (18 * x * x) + (801 * x) + 437290;\r\n            y3 = y1 / 10000;\r\n        }\r\n        else if (pack == 1U)\r\n        {\r\n            /* CSP */\r\n            y1 = (82 * x * x) - (5171 * x) + 559320;\r\n            y3 = y1 / 10000;\r\n        }\r\n        else\r\n        {\r\n            /* BGA */\r\n            assert(pack == 2U);\r\n            y1 = (25 * x * x) + (1337 * x) + 381140;\r\n            y3 = y1 / 10000;\r\n        }\r\n\r\n        trimSvc = ((uint32_t)y3) << 24;\r\n\r\n        clk = CLKCTL0->PSCCTL0;\r\n        rst = RSTCTL0->PRSTCTL0;\r\n        /* Enable AON MEM clock/reset. */\r\n        CLKCTL0->PSCCTL0_SET  = CLKCTL0_PSCCTL0_SET_AON_MEM_MASK;\r\n        RSTCTL0->PRSTCTL0_CLR = RSTCTL0_PRSTCTL0_CLR_AON_MEM_MASK;\r\n        POWER_WRITE_MEM32(0x4015C00CU, trimSvc);\r\n        /* Restore AON MEM clock/reset */\r\n        CLKCTL0->PSCCTL0  = clk;\r\n        RSTCTL0->PRSTCTL0 = rst;\r\n    }\r\n\r\n    return trimSvc;\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_power.h",
    "content": "/*\r\n * Copyright 2020-2023 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef _FSL_POWER_H_\r\n#define _FSL_POWER_H_\r\n\r\n#include \"fsl_common.h\"\r\n\r\n/*!\r\n * @addtogroup power\r\n * @{\r\n */\r\n\r\n/*! @file */\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*! @name Driver version */\r\n/*@{*/\r\n/*! @brief POWER driver version 2.5.0. */\r\n#define FSL_POWER_DRIVER_VERSION (MAKE_VERSION(2, 5, 0))\r\n/*@}*/\r\n\r\n/*!\r\n * @brief Pin edge for wakeup.\r\n */\r\ntypedef enum _power_wakeup_edge\r\n{\r\n    kPOWER_WakeupEdgeLow  = 0U, /*!< Wakeup on pin low level. */\r\n    kPOWER_WakeupEdgeHigh = 1U, /*!< Wakeup on pin high level. */\r\n} power_wakeup_edge_t;\r\n\r\n/*!\r\n * @brief Wakeup pin.\r\n */\r\ntypedef enum _power_wakeup_pin\r\n{\r\n    kPOWER_WakeupPin0 = 0U, /*!< Wakeup0 pin. */\r\n    kPOWER_WakeupPin1 = 1U, /*!< Wakeup1 pin. */\r\n} power_wakeup_pin_t;\r\n\r\n/*!\r\n * @brief Reset cause.\r\n */\r\ntypedef enum _power_reset_cause\r\n{\r\n    kPOWER_ResetCauseSysResetReq = 1U << 0U, /*!< CM33 system soft reset request. */\r\n    kPOWER_ResetCauseLockup      = 1U << 1U, /*!< CM33 locked up. */\r\n    kPOWER_ResetCauseWdt         = 1U << 2U, /*!< Watchdog timer. */\r\n    kPOWER_ResetCauseApResetReq  = 1U << 3U, /*!< Debug mailbox reset. */\r\n    kPOWER_ResetCauseCodeWdt     = 1U << 4U, /*!< Code watchdog timer. */\r\n    kPOWER_ResetCauseItrc        = 1U << 5U, /*!< ITRC_CHIP reset. */\r\n    kPOWER_ResetCauseResetB      = 1U << 6U, /*!< sw_resetb_scantest reset. */\r\n    kPOWER_ResetCauseAll         = 0x7FU,    /*!< All reset causes. Used in POWER_ClearResetCause(). */\r\n} power_reset_cause_t;\r\n\r\n/*!\r\n * @brief Reset source.\r\n */\r\ntypedef enum _power_reset_source\r\n{\r\n    kPOWER_ResetSourceSysResetReq = 1U << 0U, /*!< CM33 system soft reset request. */\r\n    kPOWER_ResetSourceLockup      = 1U << 1U, /*!< CM33 locked up. */\r\n    kPOWER_ResetSourceWdt         = 1U << 2U, /*!< Watchdog timer. */\r\n    kPOWER_ResetSourceApResetReq  = 1U << 3U, /*!< Debug mailbox reset. */\r\n    kPOWER_ResetSourceCodeWdt     = 1U << 4U, /*!< Code watchdog timer. */\r\n    kPOWER_ResetSourceItrc        = 1U << 5U, /*!< ITRC_CHIP reset. */\r\n    kPOWER_ResetSourceAll         = 0x3FU,    /*!< All reset sources. */\r\n} power_reset_source_t;\r\n\r\n/*!\r\n * @brief PM2 mem power up bits definition\r\n */\r\nenum _pm2_mem_pu_bits\r\n{\r\n    kPOWER_Pm2MemPuEnet    = (1UL << 28),\r\n    kPOWER_Pm2MemPuSdio    = (1UL << 27),\r\n    kPOWER_Pm2MemPuOtp     = (1UL << 26),\r\n    kPOWER_Pm2MemPuRom     = (1UL << 25),\r\n    kPOWER_Pm2MemPuFlexspi = (1UL << 24),\r\n    kPOWER_Pm2MemPuPq      = (1UL << 23),\r\n    kPOWER_Pm2MemPuPkc     = (1UL << 22),\r\n    kPOWER_Pm2MemPuEls     = (1UL << 21),\r\n    kPOWER_Pm2MemPuAon1    = (1UL << 20),\r\n    kPOWER_Pm2MemPuAon0    = (1UL << 19),\r\n    kPOWER_Pm2MemPuSram18  = (1UL << 18),\r\n    kPOWER_Pm2MemPuSram17  = (1UL << 17),\r\n    kPOWER_Pm2MemPuSram16  = (1UL << 16),\r\n    kPOWER_Pm2MemPuSram15  = (1UL << 15),\r\n    kPOWER_Pm2MemPuSram14  = (1UL << 14),\r\n    kPOWER_Pm2MemPuSram13  = (1UL << 13),\r\n    kPOWER_Pm2MemPuSram12  = (1UL << 12),\r\n    kPOWER_Pm2MemPuSram11  = (1UL << 11),\r\n    kPOWER_Pm2MemPuSram10  = (1UL << 10),\r\n    kPOWER_Pm2MemPuSram9   = (1UL << 9),\r\n    kPOWER_Pm2MemPuSram8   = (1UL << 8),\r\n    kPOWER_Pm2MemPuSram7   = (1UL << 7),\r\n    kPOWER_Pm2MemPuSram6   = (1UL << 6),\r\n    kPOWER_Pm2MemPuSram5   = (1UL << 5),\r\n    kPOWER_Pm2MemPuSram4   = (1UL << 4),\r\n    kPOWER_Pm2MemPuSram3   = (1UL << 3),\r\n    kPOWER_Pm2MemPuSram2   = (1UL << 2),\r\n    kPOWER_Pm2MemPuSram1   = (1UL << 1),\r\n    kPOWER_Pm2MemPuSram0   = (1UL << 0),\r\n    kPOWER_Pm2MemPuAll     = (0x1FFFFFFFUL),\r\n};\r\n\r\n/*!\r\n * @brief PM2 ana power up bits definition\r\n */\r\nenum _pm2_ana_pu_bits\r\n{\r\n    kPOWER_Pm2AnaPuT3      = (1UL << 6),\r\n    kPOWER_Pm2AnaPuTcpuTop = (1UL << 5),\r\n    kPOWER_Pm2AnaPuTddrTop = (1UL << 4),\r\n    kPOWER_Pm2AnaPuAnaTop  = (1UL << 3),\r\n    kPOWER_Pm2AnaPuGau     = (1UL << 2),\r\n    kPOWER_Pm2AnaPuUsb     = (1UL << 1),\r\n    kPOWER_Pm2AnaPuAvpll   = (1UL << 0),\r\n    kPOWER_Pm2AnaPuAll     = (0x7FUL),\r\n};\r\n\r\n/*!\r\n * @brief clock gate bits definition\r\n */\r\nenum _clk_gate_bits\r\n{\r\n    /* Only bit 2 is configuable, others contrlled by HW */\r\n    kPOWER_ClkGateTddrMciEnet = (1UL << 2),\r\n    kPOWER_ClkGateAll         = (1UL << 2),\r\n};\r\n\r\n/*!\r\n * @brief PM3 buck control bits definition\r\n */\r\nenum _clk_pm3_buck_bits\r\n{\r\n    kPOWER_Pm3Buck18  = (1UL << 7), /*!< 1: Use normal buck18 level in PM3. 0: Use sleep buck18 level in PM3 */\r\n    kPOWER_Pm3Buck11  = (1UL << 6), /*!< 1: Use normal buck11 level in PM3. 0: Use sleep buck11 level in PM3 */\r\n    kPOWER_Pm3BuckAll = (0xC0UL),\r\n};\r\n\r\n/*!\r\n * @brief Capture slow pulse width\r\n */\r\ntypedef enum _capt_slow_pulse_width\r\n{\r\n    kPOWER_CaptSlowPulseWidth1 = 0U,\r\n    kPOWER_CaptSlowPulseWidth2 = 1U,\r\n    kPOWER_CaptSlowPulseWidth3 = 2U,\r\n    kPOWER_CaptSlowPulseWidth4 = 3U,\r\n    kPOWER_CaptSlowPulseWidth5 = 4U,\r\n    kPOWER_CaptSlowPulseWidth6 = 5U,\r\n    kPOWER_CaptSlowPulseWidth7 = 6U,\r\n} capt_slow_pulse_width_t;\r\n\r\n/*!\r\n * @brief Capture slow pulse edge\r\n */\r\ntypedef enum _capt_slow_pulse_edge\r\n{\r\n    kPOWER_CaptSlowPulseEdgeRising  = 0U,\r\n    kPOWER_CaptSlowPulseEdgeFalling = 1U,\r\n    kPOWER_CaptSlowPulseEdgeAny     = 2U,\r\n} capt_slow_pulse_edge_t;\r\n\r\n/*!\r\n * @brief Capture timer callback function\r\n * @param param : User parameter for callback.\r\n */\r\ntypedef void (*capt_pulse_timer_callback_t)(void *param);\r\n\r\n/*!\r\n * @brief Power mode switch callback function\r\n * @param mode : Power mode to switch.\r\n * @param param : User parameter for callback.\r\n */\r\ntypedef void (*power_switch_callback_t)(uint32_t mode, void *param);\r\n\r\n/*!\r\n * @brief Init configuration.\r\n */\r\ntypedef struct _power_init_config\r\n{\r\n    bool iBuck;         /*!< true: VCORE and AVDD18 supplied from iBuck; false: supplied from external DCDC. */\r\n    bool gateCauRefClk; /*!< true: CAU_SOC_SLP_REF_GEN_CLK gated; false: CAU_SOC_SLP_REF_GEN_CLK on. */\r\n} power_init_config_t;\r\n\r\n/*!\r\n * @brief Sleep configuration.\r\n */\r\ntypedef struct _power_sleep_config\r\n{\r\n    uint32_t\r\n        pm2MemPuCfg; /*!< Modules to keep powered on in PM2 mode. Logical OR of the enums in @ref _pm2_mem_pu_bits. */\r\n    uint32_t pm2AnaPuCfg; /*!< Ana to keep powered on in PM2 mode. Logical OR of the enums in @ref _pm2_ana_pu_bits. */\r\n    uint32_t clkGate;     /*!< Source clock gate control. Logical OR of the enums in @ref _clk_gate_bits. */\r\n    uint32_t memPdCfg;    /*!< PMU MEM_CFG: Power Down memory configuration. Bit0-5 for PM3, bit8 for PM4.\r\n                                            bit0: ram0-5 384KB\r\n                                            bit1: ram6 64KB\r\n                                            bit2: ram7 64KB\r\n                                            bit3: ram8-9 128KB\r\n                                            bit4: ram10-13 256KB\r\n                                            bit5: ram14-18 320KB.\r\n                                            bit8: aon mem higher 8KB */\r\n    uint32_t pm3BuckCfg;  /*!< PMIP BUCK control in PM3 mode. Logical OR of the enums in @ref _clk_pm3_buck_bits. */\r\n} power_sleep_config_t;\r\n\r\n/*!\r\n * @brief Glitch detector configuration.\r\n */\r\ntypedef struct _power_gdet_data\r\n{\r\n    uint32_t CFG[6];\r\n    uint32_t TRIM0;\r\n} power_gdet_data_t;\r\n\r\n/*!\r\n * @brief Glitch detector configuration load function.\r\n */\r\ntypedef bool (*power_load_gdet_cfg)(power_gdet_data_t *data);\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif\r\n\r\n/**\r\n * @brief   Enable system reset source\r\n * @param   source   : A bitmask of of @ref power_reset_source_t\r\n */\r\n__STATIC_INLINE void POWER_EnableResetSource(uint32_t source)\r\n{\r\n    assert((source & ~(uint32_t)kPOWER_ResetSourceAll) == 0U);\r\n\r\n    PMU->SYS_RST_EN |= source;\r\n}\r\n\r\n/**\r\n * @brief   Disable system reset source\r\n * @param   source   : A bitmask of of @ref power_reset_source_t\r\n */\r\n__STATIC_INLINE void POWER_DisableResetSource(uint32_t source)\r\n{\r\n    assert((source & ~(uint32_t)kPOWER_ResetSourceAll) == 0U);\r\n\r\n    PMU->SYS_RST_EN &= ~source;\r\n}\r\n\r\n/**\r\n * @brief   Get last reset cause\r\n * @return  Or'ed cause of @ref power_reset_cause_t\r\n */\r\n__STATIC_INLINE uint32_t POWER_GetResetCause(void)\r\n{\r\n    /* On reset, PMU->SYS_RST_STATUS is backed up in RF_SYSCON->WO_SCRATCH_REG[3]\r\n       and cleared by ROM */\r\n    return RF_SYSCON->WO_SCRATCH_REG[3] & (uint32_t)kPOWER_ResetCauseAll;\r\n}\r\n\r\n/**\r\n * @brief   Clear last reset cause\r\n * @param   cause   : A bitmask of of @ref power_reset_cause_t\r\n */\r\n__STATIC_INLINE void POWER_ClearResetCause(uint32_t cause)\r\n{\r\n    assert((cause & ~(uint32_t)kPOWER_ResetCauseAll) == 0U);\r\n\r\n    PMU->SYS_RST_CLR = cause;\r\n}\r\n\r\n/**\r\n * @brief   Configure pin edge for wakeup\r\n * @param   pin     : Wakeup pin\r\n * @param   edge    : Pin level for wakeup\r\n */\r\n__STATIC_INLINE void POWER_ConfigWakeupPin(power_wakeup_pin_t pin, power_wakeup_edge_t edge)\r\n{\r\n    PMU->WAKEUP_LEVEL = (PMU->WAKEUP_LEVEL & ~(1UL << (uint8_t)pin)) | ((uint32_t)edge << (uint8_t)pin);\r\n}\r\n\r\n/**\r\n * @brief   Check if IRQ is the wakeup source\r\n * @param   irq   : IRQ number\r\n * @return  true if IRQ is the wakeup source, false otherwise.\r\n */\r\nbool POWER_GetWakeupStatus(IRQn_Type irq);\r\n\r\n/**\r\n * @brief   Clear wakeup status\r\n * @param   irq   : IRQ number\r\n */\r\nvoid POWER_ClearWakeupStatus(IRQn_Type irq);\r\n\r\n/**\r\n * @brief   Enable the Wakeup interrupt.\r\n * @param   irq   : IRQ number\r\n */\r\nvoid POWER_EnableWakeup(IRQn_Type irq);\r\n\r\n/**\r\n * @brief   Disable the Wakeup interrupts.\r\n * @param   irq   : IRQ number\r\n */\r\nvoid POWER_DisableWakeup(IRQn_Type irq);\r\n\r\n/**\r\n * @brief   Set power mode on idle.\r\n * @param   mode : 0 ~ 4 stands for PM0 ~ PM4.\r\n */\r\nAT_QUICKACCESS_SECTION_CODE(void POWER_SetSleepMode(uint32_t mode));\r\n\r\n/**\r\n * @brief   Get power mode waken up from.\r\n * @return  Power mode.\r\n */\r\n__STATIC_INLINE uint32_t POWER_GetWakenMode(void)\r\n{\r\n    return (PMU->PWR_MODE_STATUS & PMU_PWR_MODE_STATUS_PWR_MODE_STATUS_MASK) + 1U;\r\n}\r\n\r\n/**\r\n * @brief   Get current sleep configuration.\r\n * @param   config : Pointer to config structure to save current config.\r\n */\r\nvoid POWER_GetCurrentSleepConfig(power_sleep_config_t *config);\r\n\r\n/**\r\n * @brief   Initialize power configuration.\r\n * @param   config : Pointer to init config structure.\r\n */\r\nvoid POWER_InitPowerConfig(const power_init_config_t *config);\r\n\r\n/**\r\n * @brief   Configure CAU_SOC_SLP_REF_GEN_CLK on/off status in SoC sleep mode.\r\n * @param   pdCau : true for clock off; false for clock on.\r\n */\r\nvoid POWER_ConfigCauInSleep(bool pdCau);\r\n\r\n/**\r\n * @brief   Set power mode switch callback. The callbacks are called with interrupt disabled.\r\n * @param   pre : Function called before power mode switch\r\n * @param   preParam : User parameter for pre callback\r\n * @param   post : Function called after power mode switch\r\n * @param   postParam : User parameter for post callback\r\n */\r\nvoid POWER_SetPowerSwitchCallback(power_switch_callback_t pre,\r\n                                  void *preParam,\r\n                                  power_switch_callback_t post,\r\n                                  void *postParam);\r\n\r\n/**\r\n * @brief   Switch system into certain power mode.\r\n * @param   mode : 0 ~ 4 stands for PM0 ~ PM4.\r\n * @param   config : Sleep configuration on PM2-PM4.\r\n * @return  True for success, else failure.\r\n */\r\nAT_QUICKACCESS_SECTION_CODE(bool POWER_EnterPowerMode(uint32_t mode, const power_sleep_config_t *config));\r\n\r\n/**\r\n * @brief   Power on WLAN.\r\n */\r\nvoid POWER_PowerOnWlan(void);\r\n\r\n/**\r\n * @brief   Power off WLAN.\r\n */\r\nvoid POWER_PowerOffWlan(void);\r\n\r\n/**\r\n * @brief   Enable MCI wakeup WLAN\r\n * @param   wlWakeup : 8 bits wakeup mask\r\n */\r\n__STATIC_INLINE void PMU_EnableWlanWakeup(uint8_t wlWakeup)\r\n{\r\n    PMU->WLAN_CTRL |= PMU_WLAN_CTRL_WL_WAKEUP(wlWakeup);\r\n}\r\n\r\n/**\r\n * @brief   Disable MCI wakeup WLAN\r\n * @param   wlWakeup : 8 bits wakeup mask\r\n */\r\n__STATIC_INLINE void PMU_DisableWlanWakeup(uint8_t wlWakeup)\r\n{\r\n    PMU->WLAN_CTRL &= ~PMU_WLAN_CTRL_WL_WAKEUP(wlWakeup);\r\n}\r\n\r\n/**\r\n * @brief   Power on BLE.\r\n */\r\nvoid POWER_PowerOnBle(void);\r\n\r\n/**\r\n * @brief   Power off BLE.\r\n */\r\nvoid POWER_PowerOffBle(void);\r\n\r\n/**\r\n * @brief   Enable MCI wakeup BLE\r\n * @param   bleWakeup : 8 bits wakeup mask\r\n */\r\n__STATIC_INLINE void PMU_EnableBleWakeup(uint8_t bleWakeup)\r\n{\r\n    PMU->BLE_CTRL |= PMU_BLE_CTRL_BLE_WAKEUP(bleWakeup);\r\n}\r\n\r\n/**\r\n * @brief   Disable MCI wakeup BLE\r\n * @param   bleWakeup : 8 bits wakeup mask\r\n */\r\n__STATIC_INLINE void PMU_DisableBleWakeup(uint8_t bleWakeup)\r\n{\r\n    PMU->BLE_CTRL &= ~PMU_BLE_CTRL_BLE_WAKEUP(bleWakeup);\r\n}\r\n\r\n/**\r\n * @brief   Power on GAU.\r\n */\r\nvoid POWER_PowerOnGau(void);\r\n\r\n/**\r\n * @brief   Power off GAU.\r\n */\r\nvoid POWER_PowerOffGau(void);\r\n\r\n/**\r\n * @brief   Enable capture slow pulse timer with 32768Hz clock source\r\n * @param   width    : input capture filter width in cycles\r\n * @param   edge     : trigger condition of counter\r\n * @param   timeout  : timer expire counter which will trigger callback\r\n * @param   callback : callback function on timer expire\r\n * @param   param    : callback parameter\r\n */\r\nvoid POWER_EnableCaptSlowPulseTimer(capt_slow_pulse_width_t width,\r\n                                    capt_slow_pulse_edge_t edge,\r\n                                    uint32_t timeout,\r\n                                    capt_pulse_timer_callback_t cb,\r\n                                    void *param);\r\n\r\n/**\r\n * @brief   Enable capture fast pulse timer with 3.84/4MHz clock source\r\n * @param   timeout  : timer expire counter which will trigger callback\r\n * @param   callback : callback function on timer expire\r\n * @param   param    : callback parameter\r\n */\r\nvoid POWER_EnableCaptFastPulseTimer(uint32_t timeout, capt_pulse_timer_callback_t cb, void *param);\r\n\r\n/**\r\n * @brief   Disable capture pulse timer\r\n */\r\nvoid POWER_DisableCaptPulseTimer(void);\r\n\r\n/**\r\n * @brief   Configure power rail voltage and LVD/HVD threshold.\r\n * @param   dro  : trim value from fuse.\r\n * @param   pack : Device package type: 0 - QFN, 1 - CSP, 2 - BGA\r\n */\r\nvoid POWER_InitVoltage(uint32_t dro, uint32_t pack);\r\n\r\n/**\r\n * @brief   Initialize glitch detector configuration.\r\n * @param   loadFunc : function pointer to the GDET load configuration.\r\n * @param   data     : GDET config data loaded from fuse.\r\n * @param   pack     : Device package type: 0 - QFN, 1 - CSP, 2 - BGA\r\n */\r\nvoid Power_InitLoadGdetCfg(power_load_gdet_cfg loadFunc, const power_gdet_data_t *data, uint32_t pack);\r\n\r\n/**\r\n * @brief   Disable GDET and VSensors\r\n */\r\nAT_QUICKACCESS_SECTION_CODE(void POWER_DisableGDetVSensors(void));\r\n\r\n/**\r\n * @brief   Enable GDET and VSensors\r\n * @return  True for success, else failure.\r\n */\r\nAT_QUICKACCESS_SECTION_CODE(bool POWER_EnableGDetVSensors(void));\r\n\r\n/**\r\n * @brief   Apply SVC GDC equation and get the SVC trim configuration\r\n * @param   gdetTrim : GDET trim value from fuse.\r\n * @param   pack     : Device package type: 0 - QFN, 1 - CSP, 2 - BGA\r\n */\r\nuint32_t POWER_TrimSvc(uint32_t gdetTrim, uint32_t pack);\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif /*_cplusplus */\r\n\r\n/*! @}*/\r\n\r\n#endif /* _FSL_POWER_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_reset.c",
    "content": "/*\r\n * Copyright 2021, NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include \"fsl_common.h\"\r\n#include \"fsl_reset.h\"\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n/* Component ID definition, used by tools. */\r\n#ifndef FSL_COMPONENT_ID\r\n#define FSL_COMPONENT_ID \"platform.drivers.reset\"\r\n#endif\r\n\r\n/*******************************************************************************\r\n * Variables\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n * Prototypes\r\n ******************************************************************************/\r\n\r\n/*******************************************************************************\r\n * Code\r\n ******************************************************************************/\r\n\r\n/*!\r\n * brief Assert reset to peripheral.\r\n *\r\n * Asserts reset signal to specified peripheral module.\r\n *\r\n * param peripheral Assert reset to this peripheral. The enum argument contains encoding of reset register\r\n *                   and reset bit position in the reset register.\r\n */\r\nvoid RESET_SetPeripheralReset(reset_ip_name_t peripheral)\r\n{\r\n    const uint32_t regIndex = ((uint32_t)peripheral & 0x0000FF00u) >> 8;\r\n    const uint32_t bitPos   = ((uint32_t)peripheral & 0x000000FFu);\r\n    const uint32_t bitMask  = 1UL << bitPos;\r\n\r\n    assert(bitPos < 32u);\r\n\r\n    switch (regIndex)\r\n    {\r\n        case RST_CTL0_PSCCTL0:\r\n            RSTCTL0->PRSTCTL0_SET = bitMask;\r\n            while (0u == (RSTCTL0->PRSTCTL0 & bitMask))\r\n            {\r\n            }\r\n            break;\r\n        case RST_CTL0_PSCCTL1:\r\n            RSTCTL0->PRSTCTL1_SET = bitMask;\r\n            while (0u == (RSTCTL0->PRSTCTL1 & bitMask))\r\n            {\r\n            }\r\n            break;\r\n        case RST_CTL0_PSCCTL2:\r\n            RSTCTL0->PRSTCTL2_SET = bitMask;\r\n            while (0u == (RSTCTL0->PRSTCTL2 & bitMask))\r\n            {\r\n            }\r\n            break;\r\n        case RST_CTL1_PSCCTL0:\r\n            RSTCTL1->PRSTCTL0_SET = bitMask;\r\n            while (0u == (RSTCTL1->PRSTCTL0 & bitMask))\r\n            {\r\n            }\r\n            break;\r\n        case RST_CTL1_PSCCTL1:\r\n            RSTCTL1->PRSTCTL1_SET = bitMask;\r\n            while (0u == (RSTCTL1->PRSTCTL1 & bitMask))\r\n            {\r\n            }\r\n            break;\r\n        case RST_CTL1_PSCCTL2:\r\n            RSTCTL1->PRSTCTL2_SET = bitMask;\r\n            while (0u == (RSTCTL1->PRSTCTL2 & bitMask))\r\n            {\r\n            }\r\n            break;\r\n        default:\r\n            /* Added comments to prevent the violation of MISRA C-2012 rule. */\r\n            break;\r\n    }\r\n}\r\n\r\n/*!\r\n * brief Clear reset to peripheral.\r\n *\r\n * Clears reset signal to specified peripheral module, allows it to operate.\r\n *\r\n * param peripheral Clear reset to this peripheral. The enum argument contains encoding of reset register\r\n *                   and reset bit position in the reset register.\r\n */\r\nvoid RESET_ClearPeripheralReset(reset_ip_name_t peripheral)\r\n{\r\n    const uint32_t regIndex = ((uint32_t)peripheral & 0x0000FF00u) >> 8;\r\n    const uint32_t bitPos   = ((uint32_t)peripheral & 0x000000FFu);\r\n    const uint32_t bitMask  = 1UL << bitPos;\r\n\r\n    assert(bitPos < 32u);\r\n\r\n    switch (regIndex)\r\n    {\r\n        case RST_CTL0_PSCCTL0:\r\n            RSTCTL0->PRSTCTL0_CLR = bitMask;\r\n            while (bitMask == (RSTCTL0->PRSTCTL0 & bitMask))\r\n            {\r\n            }\r\n            break;\r\n        case RST_CTL0_PSCCTL1:\r\n            RSTCTL0->PRSTCTL1_CLR = bitMask;\r\n            while (bitMask == (RSTCTL0->PRSTCTL1 & bitMask))\r\n            {\r\n            }\r\n            break;\r\n        case RST_CTL0_PSCCTL2:\r\n            RSTCTL0->PRSTCTL2_CLR = bitMask;\r\n            while (bitMask == (RSTCTL0->PRSTCTL2 & bitMask))\r\n            {\r\n            }\r\n            break;\r\n        case RST_CTL1_PSCCTL0:\r\n            RSTCTL1->PRSTCTL0_CLR = bitMask;\r\n            while (bitMask == (RSTCTL1->PRSTCTL0 & bitMask))\r\n            {\r\n            }\r\n            break;\r\n        case RST_CTL1_PSCCTL1:\r\n            RSTCTL1->PRSTCTL1_CLR = bitMask;\r\n            while (bitMask == (RSTCTL1->PRSTCTL1 & bitMask))\r\n            {\r\n            }\r\n            break;\r\n        case RST_CTL1_PSCCTL2:\r\n            RSTCTL1->PRSTCTL2_CLR = bitMask;\r\n            while (bitMask == (RSTCTL1->PRSTCTL2 & bitMask))\r\n            {\r\n            }\r\n            break;\r\n        default:\r\n            /* Added comments to prevent the violation of MISRA C-2012 rule. */\r\n            break;\r\n    }\r\n}\r\n\r\n/*!\r\n * brief Reset peripheral module.\r\n *\r\n * Reset peripheral module.\r\n *\r\n * param peripheral Peripheral to reset. The enum argument contains encoding of reset register\r\n *                   and reset bit position in the reset register.\r\n */\r\nvoid RESET_PeripheralReset(reset_ip_name_t peripheral)\r\n{\r\n    RESET_SetPeripheralReset(peripheral);\r\n    RESET_ClearPeripheralReset(peripheral);\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_reset.h",
    "content": "/*\r\n * Copyright 2021, 2023-2024 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef _FSL_RESET_H_\r\n#define _FSL_RESET_H_\r\n\r\n#include <assert.h>\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include <string.h>\r\n#include \"fsl_device_registers.h\"\r\n\r\n/*!\r\n * @addtogroup reset\r\n * @{\r\n */\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*! @name Driver version */\r\n/*@{*/\r\n/*! @brief reset driver version 2.1.1. */\r\n#define FSL_RESET_DRIVER_VERSION (MAKE_VERSION(2, 1, 1))\r\n/*@}*/\r\n\r\n/*!\r\n * @brief Reset control registers index\r\n */\r\n#define RST_CTL0_PSCCTL0 0\r\n#define RST_CTL0_PSCCTL1 1\r\n#define RST_CTL0_PSCCTL2 2\r\n#define RST_CTL1_PSCCTL0 3\r\n#define RST_CTL1_PSCCTL1 4\r\n#define RST_CTL1_PSCCTL2 5\r\n/*!\r\n * @brief Enumeration for peripheral reset control bits\r\n *\r\n * Defines the enumeration for peripheral reset control bits in RSTCLTx registers\r\n */\r\ntypedef enum _RSTCTL_RSTn\r\n{\r\n    kPOWERQUAD_RST_SHIFT_RSTn = (RST_CTL0_PSCCTL0 << 8) | 8U,      /**< POWERQUAD reset control */\r\n    kPKC_RST_SHIFT_RSTn       = (RST_CTL0_PSCCTL0 << 8) | 9U,      /**< PKC reset control */\r\n    kELS_RST_SHIFT_RSTn       = (RST_CTL0_PSCCTL0 << 8) | 10U,     /**< ELS reset control */\r\n    kPUF_RST_SHIFT_RSTn       = (RST_CTL0_PSCCTL0 << 8) | 11U,     /**< Physical unclonable function reset control */\r\n    kFLEXSPI_RST_SHIFT_RSTn   = (RST_CTL0_PSCCTL0 << 8) | 16U,     /**< FLEXSPI reset control */\r\n    kHPU_RST_SHIFT_RSTn       = (RST_CTL0_PSCCTL0 << 8) | 20U,     /**< HPU reset control */\r\n    kUSB_RST_SHIFT_RSTn       = (RST_CTL0_PSCCTL0 << 8) | 22U,     /**< USB reset control */\r\n    kSCT_RST_SHIFT_RSTn       = (RST_CTL0_PSCCTL0 << 8) | 24U,     /**< Standard ctimers reset control */\r\n    kAON_MEM_RST_SHIFT_RSTn   = (RST_CTL0_PSCCTL0 << 8) | 25U,     /**< AON MEM reset control */\r\n    kGDMA_RST_SHIFT_RSTn      = (RST_CTL0_PSCCTL0 << 8) | 28U,     /**< GDMA reset control */\r\n    kDMA0_RST_SHIFT_RSTn      = (RST_CTL0_PSCCTL0 << 8) | 29U,     /**< DMA0 reset control */\r\n    kDMA1_RST_SHIFT_RSTn      = (RST_CTL0_PSCCTL0 << 8) | 30U,     /**< DMA1 reset control */\r\n    kSDIO_RST_SHIFT_RSTn      = (RST_CTL0_PSCCTL0 << 8) | 31U,     /**< SDIO reset control */\r\n\r\n    kELS_APB_RST_SHIFT_RSTn      = (RST_CTL0_PSCCTL1 << 8) | 0U,   /**< ELS_APB reset control */\r\n    kELS_GDET_REF_RST_SHIFT_RSTn = (RST_CTL0_PSCCTL1 << 8) | 1U,   /**< ELS_GDET_REF_RST reset control */\r\n    kSDIO_SLV_SHIFT_RSTn         = (RST_CTL0_PSCCTL1 << 8) | 2U,   /**< SDIO_SLV reset control */\r\n    kGAU_RST_SHIFT_RSTn          = (RST_CTL0_PSCCTL1 << 8) | 16U,  /**< GAU reset control */\r\n    kOTP_RST_SHIFT_RSTn          = (RST_CTL0_PSCCTL1 << 8) | 17U,  /**< OTP reset control */\r\n    kSECURE_GPIO_RST_SHIFT_RSTn  = (RST_CTL0_PSCCTL1 << 8) | 24U,  /**< Security GPIO reset control */\r\n    kENET_IPG_RST_SHIFT_RSTn     = (RST_CTL0_PSCCTL1 << 8) | 25U,  /**< ENET_IPG reset control */\r\n    kENET_IPG_S_RST_SHIFT_RSTn   = (RST_CTL0_PSCCTL1 << 8) | 26U,  /**< ENET_IPG_S reset control */\r\n    kTRNG_RST_SHIFT_RSTn         = (RST_CTL0_PSCCTL1 << 8) | 27U,  /**< TRNG reset control */\r\n\r\n    kUTICK_RST_SHIFT_RSTn   = (RST_CTL0_PSCCTL2 << 8) | 0U,        /**< Micro-tick timer reset control */\r\n    kWWDT_RST_SHIFT_RSTn    = (RST_CTL0_PSCCTL2 << 8) | 1U,        /**< Windowed Watchdog timer reset control */\r\n    kUSIM_RST_SHIFT_RSTn    = (RST_CTL0_PSCCTL2 << 8) | 2U,        /**< USIM reset control */\r\n    kFREEMRT_RST_SHIFT_RSTn = (RST_CTL0_PSCCTL2 << 8) | 26U,       /**< FREEMRT reset control */\r\n    kLCDIC_RST_SHIFT_RSTn   = (RST_CTL0_PSCCTL2 << 8) | 27U,       /**< LCDIC reset control */\r\n\r\n    kFC0_RST_SHIFT_RSTn           = (RST_CTL1_PSCCTL0 << 8) | 8U,  /**< Flexcomm Interface 0 reset control */\r\n    kFC1_RST_SHIFT_RSTn           = (RST_CTL1_PSCCTL0 << 8) | 9U,  /**< Flexcomm Interface 1 reset control */\r\n    kFC2_RST_SHIFT_RSTn           = (RST_CTL1_PSCCTL0 << 8) | 10U, /**< Flexcomm Interface 2 reset control */\r\n    kFC3_RST_SHIFT_RSTn           = (RST_CTL1_PSCCTL0 << 8) | 11U, /**< Flexcomm Interface 3 reset control */\r\n    kFC14_RST_SHIFT_RSTn          = (RST_CTL1_PSCCTL0 << 8) | 22U, /**< Flexcomm Interface 14 reset control */\r\n    kDMIC_RST_SHIFT_RSTn          = (RST_CTL1_PSCCTL0 << 8) | 24U, /**< Digital microphone interface reset control */\r\n    kOSEVENT_TIMER_RST_SHIFT_RSTn = (RST_CTL1_PSCCTL0 << 8) | 27U, /**< Osevent Timer reset control */\r\n\r\n    kHSGPIO0_RST_SHIFT_RSTn = (RST_CTL1_PSCCTL1 << 8) | 0U,        /**< HSGPIO 0 reset control */\r\n    kHSGPIO1_RST_SHIFT_RSTn = (RST_CTL1_PSCCTL1 << 8) | 1U,        /**< HSGPIO 1 reset control */\r\n    kCRC_RST_SHIFT_RSTn     = (RST_CTL1_PSCCTL1 << 8) | 16U,       /**< CRC reset control */\r\n    kFREQME_RST_SHIFT_RSTn  = (RST_CTL1_PSCCTL1 << 8) | 31U,       /**< Frequency Measure reset control */\r\n\r\n    kCT32B0_RST_SHIFT_RSTn   = (RST_CTL1_PSCCTL2 << 8) | 0U,       /**< CT32B0 reset control */\r\n    kCT32B1_RST_SHIFT_RSTn   = (RST_CTL1_PSCCTL2 << 8) | 1U,       /**< CT32B1 reset control */\r\n    kCT32B2_RST_SHIFT_RSTn   = (RST_CTL1_PSCCTL2 << 8) | 2U,       /**< CT32B3 reset control */\r\n    kCT32B3_RST_SHIFT_RSTn   = (RST_CTL1_PSCCTL2 << 8) | 3U,       /**< CT32B4 reset control */\r\n    kCT32B4_RST_SHIFT_RSTn   = (RST_CTL1_PSCCTL2 << 8) | 4U,       /**< CT32B4 reset control */\r\n    kMRT_RST_SHIFT_RSTn      = (RST_CTL1_PSCCTL2 << 8) | 8U,       /**< Multi-rate timer (MRT) reset control */\r\n    kPINT_RST_SHIFT_RSTn     = (RST_CTL1_PSCCTL2 << 8) | 30U,      /**< GPIO_INT reset control */\r\n    kINPUTMUX_RST_SHIFT_RSTn = (RST_CTL1_PSCCTL2 << 8) | 31U,      /**< PMUX reset control */\r\n} RSTCTL_RSTn_t;\r\n\r\n/** Array initializers with peripheral reset bits **/\r\n#define CRC_RSTS            \\\r\n    {                       \\\r\n        kCRC_RST_SHIFT_RSTn \\\r\n    } /* Reset bits for CRC peripheral */\r\n#define DMA_RSTS_N                                 \\\r\n    {                                              \\\r\n        kDMA0_RST_SHIFT_RSTn, kDMA1_RST_SHIFT_RSTn \\\r\n    } /* Reset bits for DMA peripheral */\r\n#define DMIC_RSTS            \\\r\n    {                        \\\r\n        kDMIC_RST_SHIFT_RSTn \\\r\n    } /* Reset bits for ADC peripheral */\r\n#define FLEXCOMM_RSTS                                                                                            \\\r\n    {                                                                                                            \\\r\n        kFC0_RST_SHIFT_RSTn, kFC1_RST_SHIFT_RSTn, kFC2_RST_SHIFT_RSTn, kFC3_RST_SHIFT_RSTn, kFC14_RST_SHIFT_RSTn \\\r\n    } /* Reset bits for FLEXCOMM peripheral */\r\n#define GPIO_RSTS_N                                      \\\r\n    {                                                    \\\r\n        kHSGPIO0_RST_SHIFT_RSTn, kHSGPIO1_RST_SHIFT_RSTn \\\r\n    } /* Reset bits for GPIO peripheral */\r\n#define MRT_RSTS                                     \\\r\n    {                                                \\\r\n        kMRT_RST_SHIFT_RSTn, kFREEMRT_RST_SHIFT_RSTn \\\r\n    } /* Reset bits for MRT peripheral */\r\n#define PINT_RSTS            \\\r\n    {                        \\\r\n        kPINT_RST_SHIFT_RSTn \\\r\n    } /* Reset bits for PINT peripheral */\r\n#define SCT_RSTS            \\\r\n    {                       \\\r\n        kSCT_RST_SHIFT_RSTn \\\r\n    } /* Reset bits for SCT peripheral */\r\n#define CTIMER_RSTS                                                                                     \\\r\n    {                                                                                                   \\\r\n        kCT32B0_RST_SHIFT_RSTn, kCT32B1_RST_SHIFT_RSTn, kCT32B2_RST_SHIFT_RSTn, kCT32B3_RST_SHIFT_RSTn, \\\r\n            kCT32B4_RST_SHIFT_RSTn                                                                      \\\r\n    } /* Reset bits for TIMER peripheral */\r\n#define USB_RSTS            \\\r\n    {                       \\\r\n        kUSB_RST_SHIFT_RSTn \\\r\n    } /* Reset bits for USB peripheral */\r\n#define UTICK_RSTS            \\\r\n    {                         \\\r\n        kUTICK_RST_SHIFT_RSTn \\\r\n    } /* Reset bits for UTICK peripheral */\r\n#define WWDT_RSTS            \\\r\n    {                        \\\r\n        kWWDT_RST_SHIFT_RSTn \\\r\n    } /* Reset bits for WWDT peripheral */\r\n#define OSTIMER_RSTS                  \\\r\n    {                                 \\\r\n        kOSEVENT_TIMER_RST_SHIFT_RSTn \\\r\n    } /* Reset bits for OSTIMER peripheral */\r\n#define POWERQUAD_RSTS            \\\r\n    {                             \\\r\n        kPOWERQUAD_RST_SHIFT_RSTn \\\r\n    } /* Reset bits for Powerquad peripheral */\r\n#define PUF_RSTS            \\\r\n    {                       \\\r\n        kPUF_RST_SHIFT_RSTn \\\r\n    } /* Reset bits for PUF peripheral */\r\n#define TRNG_RSTS            \\\r\n    {                        \\\r\n        kTRNG_RST_SHIFT_RSTn \\\r\n    } /* Reset bits for TRNG peripheral */\r\n#define USIM_RSTS            \\\r\n    {                        \\\r\n        kUSIM_RST_SHIFT_RSTn \\\r\n    } /* Reset bits for USIM peripheral */\r\n#define ENET_RSTS                                            \\\r\n    {                                                        \\\r\n        kENET_IPG_RST_SHIFT_RSTn, kENET_IPG_S_RST_SHIFT_RSTn \\\r\n    } /* Reset bits for ENET peripheral */\r\n\r\n/*!\r\n * @brief IP reset handle\r\n */\r\ntypedef RSTCTL_RSTn_t reset_ip_name_t;\r\n\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif\r\n\r\n/*!\r\n * @brief Assert reset to peripheral.\r\n *\r\n * Asserts reset signal to specified peripheral module.\r\n *\r\n * @param peripheral Assert reset to this peripheral. The enum argument contains encoding of reset register\r\n *                   and reset bit position in the reset register.\r\n */\r\nvoid RESET_SetPeripheralReset(reset_ip_name_t peripheral);\r\n\r\n/*!\r\n * @brief Clear reset to peripheral.\r\n *\r\n * Clears reset signal to specified peripheral module, allows it to operate.\r\n *\r\n * @param peripheral Clear reset to this peripheral. The enum argument contains encoding of reset register\r\n *                   and reset bit position in the reset register.\r\n */\r\nvoid RESET_ClearPeripheralReset(reset_ip_name_t peripheral);\r\n\r\n/*!\r\n * @brief Reset peripheral module.\r\n *\r\n * Reset peripheral module.\r\n *\r\n * @param peripheral Peripheral to reset. The enum argument contains encoding of reset register\r\n *                   and reset bit position in the reset register.\r\n */\r\nvoid RESET_PeripheralReset(reset_ip_name_t peripheral);\r\n\r\n/*!\r\n * @brief Release peripheral module.\r\n *\r\n * Release peripheral module.\r\n *\r\n * @param peripheral Peripheral to release. The enum argument contains encoding of reset register\r\n *                   and reset bit position in the reset register.\r\n */\r\nstatic inline void RESET_ReleasePeripheralReset(reset_ip_name_t peripheral)\r\n{\r\n    RESET_ClearPeripheralReset(peripheral);\r\n}\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n/*! @} */\r\n\r\n#endif /* _FSL_RESET_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_usart.c",
    "content": "/*\r\n * Copyright (c) 2016, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2023 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include \"fsl_usart.h\"\r\n#include \"fsl_device_registers.h\"\r\n#include \"fsl_flexcomm.h\"\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/* Component ID definition, used by tools. */\r\n#ifndef FSL_COMPONENT_ID\r\n#define FSL_COMPONENT_ID \"platform.drivers.flexcomm_usart\"\r\n#endif\r\n\r\n/*!\r\n * @brief Used for conversion from `flexcomm_usart_irq_handler_t` to `flexcomm_irq_handler_t`\r\n */\r\ntypedef union usart_to_flexcomm\r\n{\r\n    flexcomm_usart_irq_handler_t usart_master_handler;\r\n    flexcomm_irq_handler_t flexcomm_handler;\r\n} usart_to_flexcomm_t;\r\n\r\nenum\r\n{\r\n    kUSART_TxIdle, /* TX idle. */\r\n    kUSART_TxBusy, /* TX busy. */\r\n    kUSART_RxIdle, /* RX idle. */\r\n    kUSART_RxBusy  /* RX busy. */\r\n};\r\n\r\n/*******************************************************************************\r\n * Variables\r\n ******************************************************************************/\r\n\r\n/*! @brief IRQ name array */\r\nstatic const IRQn_Type s_usartIRQ[] = USART_IRQS;\r\n\r\n/*! @brief Array to map USART instance number to base address. */\r\nstatic const uint32_t s_usartBaseAddrs[FSL_FEATURE_SOC_USART_COUNT] = USART_BASE_ADDRS;\r\n\r\n/*******************************************************************************\r\n * Code\r\n ******************************************************************************/\r\n\r\n/* Get the index corresponding to the USART */\r\n/*! brief Returns instance number for USART peripheral base address. */\r\nuint32_t USART_GetInstance(USART_Type *base)\r\n{\r\n    uint32_t i;\r\n\r\n    for (i = 0; i < (uint32_t)FSL_FEATURE_SOC_USART_COUNT; i++)\r\n    {\r\n        if (MSDK_REG_SECURE_ADDR((uint32_t)base) == MSDK_REG_SECURE_ADDR(s_usartBaseAddrs[i]))\r\n        {\r\n            break;\r\n        }\r\n    }\r\n\r\n    assert(i < (uint32_t)FSL_FEATURE_SOC_USART_COUNT);\r\n    return i;\r\n}\r\n\r\n/*!\r\n * brief Get the length of received data in RX ring buffer.\r\n *\r\n * param handle USART handle pointer.\r\n * return Length of received data in RX ring buffer.\r\n */\r\nsize_t USART_TransferGetRxRingBufferLength(usart_handle_t *handle)\r\n{\r\n    size_t size;\r\n\r\n    /* Check arguments */\r\n    assert(NULL != handle);\r\n    uint16_t rxRingBufferHead = handle->rxRingBufferHead;\r\n    uint16_t rxRingBufferTail = handle->rxRingBufferTail;\r\n\r\n    if (rxRingBufferTail > rxRingBufferHead)\r\n    {\r\n        size = (size_t)rxRingBufferHead + handle->rxRingBufferSize - (size_t)rxRingBufferTail;\r\n    }\r\n    else\r\n    {\r\n        size = (size_t)rxRingBufferHead - (size_t)rxRingBufferTail;\r\n    }\r\n    return size;\r\n}\r\n\r\nstatic bool USART_TransferIsRxRingBufferFull(usart_handle_t *handle)\r\n{\r\n    bool full;\r\n\r\n    /* Check arguments */\r\n    assert(NULL != handle);\r\n\r\n    if (USART_TransferGetRxRingBufferLength(handle) == (handle->rxRingBufferSize - 1U))\r\n    {\r\n        full = true;\r\n    }\r\n    else\r\n    {\r\n        full = false;\r\n    }\r\n    return full;\r\n}\r\n\r\n/*!\r\n * brief Sets up the RX ring buffer.\r\n *\r\n * This function sets up the RX ring buffer to a specific USART handle.\r\n *\r\n * When the RX ring buffer is used, data received are stored into the ring buffer even when the\r\n * user doesn't call the USART_TransferReceiveNonBlocking() API. If there is already data received\r\n * in the ring buffer, the user can get the received data from the ring buffer directly.\r\n *\r\n * note When using the RX ring buffer, one byte is reserved for internal use. In other\r\n * words, if p ringBufferSize is 32, then only 31 bytes are used for saving data.\r\n *\r\n * param base USART peripheral base address.\r\n * param handle USART handle pointer.\r\n * param ringBuffer Start address of the ring buffer for background receiving. Pass NULL to disable the ring buffer.\r\n * param ringBufferSize size of the ring buffer.\r\n */\r\nvoid USART_TransferStartRingBuffer(USART_Type *base, usart_handle_t *handle, uint8_t *ringBuffer, size_t ringBufferSize)\r\n{\r\n    /* Check arguments */\r\n    assert(NULL != base);\r\n    assert(NULL != handle);\r\n    assert(NULL != ringBuffer);\r\n\r\n    /* Setup the ringbuffer address */\r\n    handle->rxRingBuffer     = ringBuffer;\r\n    handle->rxRingBufferSize = ringBufferSize;\r\n    handle->rxRingBufferHead = 0U;\r\n    handle->rxRingBufferTail = 0U;\r\n    /* ring buffer is ready we can start receiving data */\r\n    base->FIFOINTENSET = USART_FIFOINTENSET_RXLVL_MASK | USART_FIFOINTENSET_RXERR_MASK;\r\n}\r\n\r\n/*!\r\n * brief Aborts the background transfer and uninstalls the ring buffer.\r\n *\r\n * This function aborts the background transfer and uninstalls the ring buffer.\r\n *\r\n * param base USART peripheral base address.\r\n * param handle USART handle pointer.\r\n */\r\nvoid USART_TransferStopRingBuffer(USART_Type *base, usart_handle_t *handle)\r\n{\r\n    /* Check arguments */\r\n    assert(NULL != base);\r\n    assert(NULL != handle);\r\n\r\n    if (handle->rxState == (uint8_t)kUSART_RxIdle)\r\n    {\r\n        base->FIFOINTENCLR = USART_FIFOINTENCLR_RXLVL_MASK | USART_FIFOINTENCLR_RXERR_MASK;\r\n    }\r\n    handle->rxRingBuffer     = NULL;\r\n    handle->rxRingBufferSize = 0U;\r\n    handle->rxRingBufferHead = 0U;\r\n    handle->rxRingBufferTail = 0U;\r\n}\r\n\r\n/*!\r\n * brief Initializes a USART instance with user configuration structure and peripheral clock.\r\n *\r\n * This function configures the USART module with the user-defined settings. The user can configure the configuration\r\n * structure and also get the default configuration by using the USART_GetDefaultConfig() function.\r\n * Example below shows how to use this API to configure USART.\r\n * code\r\n *  usart_config_t usartConfig;\r\n *  usartConfig.baudRate_Bps = 115200U;\r\n *  usartConfig.parityMode = kUSART_ParityDisabled;\r\n *  usartConfig.stopBitCount = kUSART_OneStopBit;\r\n *  USART_Init(USART1, &usartConfig, 20000000U);\r\n * endcode\r\n *\r\n * param base USART peripheral base address.\r\n * param config Pointer to user-defined configuration structure.\r\n * param srcClock_Hz USART clock source frequency in HZ.\r\n * retval kStatus_USART_BaudrateNotSupport Baudrate is not support in current clock source.\r\n * retval kStatus_InvalidArgument USART base address is not valid\r\n * retval kStatus_Success Status USART initialize succeed\r\n */\r\nstatus_t USART_Init(USART_Type *base, const usart_config_t *config, uint32_t srcClock_Hz)\r\n{\r\n    int result;\r\n\r\n    /* check arguments */\r\n    assert(!((NULL == base) || (NULL == config) || (0U == srcClock_Hz)));\r\n    if ((NULL == base) || (NULL == config) || (0U == srcClock_Hz))\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n\r\n    /* initialize flexcomm to USART mode */\r\n    result = FLEXCOMM_Init(base, FLEXCOMM_PERIPH_USART);\r\n    if (kStatus_Success != result)\r\n    {\r\n        return result;\r\n    }\r\n\r\n    if (config->enableTx)\r\n    {\r\n        /* empty and enable txFIFO */\r\n        base->FIFOCFG |= USART_FIFOCFG_EMPTYTX_MASK | USART_FIFOCFG_ENABLETX_MASK;\r\n        /* setup trigger level */\r\n        base->FIFOTRIG &= ~(USART_FIFOTRIG_TXLVL_MASK);\r\n        base->FIFOTRIG |= USART_FIFOTRIG_TXLVL(config->txWatermark);\r\n        /* enable trigger interrupt */\r\n        base->FIFOTRIG |= USART_FIFOTRIG_TXLVLENA_MASK;\r\n    }\r\n\r\n    /* empty and enable rxFIFO */\r\n    if (config->enableRx)\r\n    {\r\n        base->FIFOCFG |= USART_FIFOCFG_EMPTYRX_MASK | USART_FIFOCFG_ENABLERX_MASK;\r\n        /* setup trigger level */\r\n        base->FIFOTRIG &= ~(USART_FIFOTRIG_RXLVL_MASK);\r\n        base->FIFOTRIG |= USART_FIFOTRIG_RXLVL(config->rxWatermark);\r\n        /* enable trigger interrupt */\r\n        base->FIFOTRIG |= USART_FIFOTRIG_RXLVLENA_MASK;\r\n    }\r\n#if defined(FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG) && FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG\r\n    USART_SetRxTimeoutConfig(base, &(config->rxTimeout));\r\n#endif\r\n    /* setup configuration and enable USART */\r\n    base->CFG = USART_CFG_PARITYSEL(config->parityMode) | USART_CFG_STOPLEN(config->stopBitCount) |\r\n                USART_CFG_DATALEN(config->bitCountPerChar) | USART_CFG_LOOP(config->loopback) |\r\n                USART_CFG_SYNCEN((uint32_t)config->syncMode >> 1) | USART_CFG_SYNCMST((uint8_t)config->syncMode) |\r\n                USART_CFG_CLKPOL(config->clockPolarity) | USART_CFG_MODE32K(config->enableMode32k) |\r\n                USART_CFG_CTSEN(config->enableHardwareFlowControl) | USART_CFG_ENABLE_MASK;\r\n\r\n    /* Setup baudrate */\r\n    if (config->enableMode32k)\r\n    {\r\n        if ((9600U % config->baudRate_Bps) == 0U)\r\n        {\r\n            base->BRG = 9600U / config->baudRate_Bps - 1U;\r\n        }\r\n        else\r\n        {\r\n            return kStatus_USART_BaudrateNotSupport;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        result = USART_SetBaudRate(base, config->baudRate_Bps, srcClock_Hz);\r\n        if (kStatus_Success != result)\r\n        {\r\n            return result;\r\n        }\r\n    }\r\n    /* Setting continuous Clock configuration. used for synchronous mode. */\r\n    USART_EnableContinuousSCLK(base, config->enableContinuousSCLK);\r\n\r\n    return kStatus_Success;\r\n}\r\n\r\n/*!\r\n * brief Deinitializes a USART instance.\r\n *\r\n * This function waits for TX complete, disables TX and RX, and disables the USART clock.\r\n *\r\n * param base USART peripheral base address.\r\n */\r\nvoid USART_Deinit(USART_Type *base)\r\n{\r\n    /* Check arguments */\r\n    assert(NULL != base);\r\n\r\n    /* Don't wait for TX idle when peripheral is disabled. */\r\n    if ((base->CFG & (USART_CFG_ENABLE_MASK)) != 0U)\r\n    {\r\n#if UART_RETRY_TIMES\r\n        uint32_t waitTimes = UART_RETRY_TIMES;\r\n        while ((0U == (base->STAT & USART_STAT_TXIDLE_MASK)) && (--waitTimes != 0U))\r\n#else\r\n        while (0U == (base->STAT & USART_STAT_TXIDLE_MASK))\r\n#endif\r\n        {\r\n        }\r\n    }\r\n    /* Disable interrupts, disable dma requests, disable peripheral */\r\n    base->FIFOINTENCLR = USART_FIFOINTENCLR_TXERR_MASK | USART_FIFOINTENCLR_RXERR_MASK | USART_FIFOINTENCLR_TXLVL_MASK |\r\n                         USART_FIFOINTENCLR_RXLVL_MASK;\r\n    base->FIFOCFG &= ~(USART_FIFOCFG_DMATX_MASK | USART_FIFOCFG_DMARX_MASK);\r\n    base->CFG &= ~(USART_CFG_ENABLE_MASK);\r\n#if defined(FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG) && FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG\r\n    base->FIFORXTIMEOUTCFG = 0U;\r\n#endif\r\n}\r\n\r\n/*!\r\n * brief Gets the default configuration structure.\r\n *\r\n * This function initializes the USART configuration structure to a default value. The default\r\n * values are:\r\n *   usartConfig->baudRate_Bps = 115200U;\r\n *   usartConfig->parityMode = kUSART_ParityDisabled;\r\n *   usartConfig->stopBitCount = kUSART_OneStopBit;\r\n *   usartConfig->bitCountPerChar = kUSART_8BitsPerChar;\r\n *   usartConfig->loopback = false;\r\n *   usartConfig->enableTx = false;\r\n *   usartConfig->enableRx = false;\r\n *\r\n * param config Pointer to configuration structure.\r\n */\r\nvoid USART_GetDefaultConfig(usart_config_t *config)\r\n{\r\n    /* Check arguments */\r\n    assert(NULL != config);\r\n\r\n    /* Initializes the configure structure to zero. */\r\n    (void)memset(config, 0, sizeof(*config));\r\n\r\n    /* Set always all members ! */\r\n    config->baudRate_Bps              = 115200U;\r\n    config->parityMode                = kUSART_ParityDisabled;\r\n    config->stopBitCount              = kUSART_OneStopBit;\r\n    config->bitCountPerChar           = kUSART_8BitsPerChar;\r\n    config->loopback                  = false;\r\n    config->enableRx                  = false;\r\n    config->enableTx                  = false;\r\n    config->enableMode32k             = false;\r\n    config->txWatermark               = kUSART_TxFifo0;\r\n    config->rxWatermark               = kUSART_RxFifo1;\r\n    config->syncMode                  = kUSART_SyncModeDisabled;\r\n    config->enableContinuousSCLK      = false;\r\n    config->clockPolarity             = kUSART_RxSampleOnFallingEdge;\r\n    config->enableHardwareFlowControl = false;\r\n#if defined(FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG) && FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG\r\n    config->rxTimeout.enable                = false;\r\n    config->rxTimeout.resetCounterOnEmpty   = true;\r\n    config->rxTimeout.resetCounterOnReceive = true;\r\n    config->rxTimeout.counter               = 0U;\r\n    config->rxTimeout.prescaler             = 0U;\r\n#endif\r\n}\r\n#if defined(FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG) && FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG\r\n/*!\r\n * brief Calculate the USART instance RX timeout prescaler and counter.\r\n *\r\n * This function for calculate the USART RXFIFO timeout config. This function is used to calculate\r\n * suitable prescaler and counter for target_us.\r\n * Example below shows how to use this API to configure USART.\r\n * code\r\n *   usart_config_t config;\r\n *   config.rxWatermark                     = kUSART_RxFifo2;\r\n *   config.rxTimeout.enable                = true;\r\n *   config.rxTimeout.resetCounterOnEmpty   = true;\r\n *   config.rxTimeout.resetCounterOnReceive = true;\r\n *   USART_CalcTimeoutConfig(200, &config.rxTimeout.prescaler, &config.rxTimeout.counter,\r\n *                                    CLOCK_GetFreq(kCLOCK_BusClk));\r\n * endcode\r\n * param target_us  Time for rx timeout unit us.\r\n * param rxTimeoutPrescaler The prescaler to be setted after function.\r\n * param rxTimeoutcounter The counter to be setted after function.\r\n * param srcClock_Hz The clockSrc for rx timeout.\r\n */\r\nvoid USART_CalcTimeoutConfig(uint32_t target_us,\r\n                             uint8_t *rxTimeoutPrescaler,\r\n                             uint32_t *rxTimeoutcounter,\r\n                             uint32_t srcClock_Hz)\r\n{\r\n    uint32_t counter   = 0U;\r\n    uint32_t perscalar = 0U, calculate_us = 0U, us_diff = 0U, min_diff = 0xffffffffUL;\r\n    /* find the suitable value */\r\n    for (perscalar = 0U; perscalar < 256U; perscalar++)\r\n    {\r\n        counter      =  target_us * (srcClock_Hz / 1000000UL) / (16U * (perscalar + 1U));\r\n        calculate_us = 16U * (perscalar + 1U) * counter / (srcClock_Hz / 1000000UL);\r\n        us_diff      = (calculate_us > target_us) ? (calculate_us - target_us) : (target_us - calculate_us);\r\n        if (us_diff == 0U)\r\n        {\r\n            *rxTimeoutPrescaler = (uint8_t)perscalar;\r\n            *rxTimeoutcounter   = counter;\r\n            break;\r\n        }\r\n        else\r\n        {\r\n            if (min_diff > us_diff)\r\n            {\r\n                min_diff            = us_diff;\r\n                *rxTimeoutPrescaler = (uint8_t)perscalar;\r\n                *rxTimeoutcounter   = counter;\r\n            }\r\n        }\r\n    }\r\n}\r\n/*!\r\n * brief Sets the USART instance RX timeout config.\r\n *\r\n * This function configures the USART RXFIFO timeout config. This function is used to config\r\n * the USART RXFIFO timeout config after the USART module is initialized by the USART_Init.\r\n *\r\n * param base USART peripheral base address.\r\n * param config pointer to receive timeout configuration structure.\r\n */\r\nvoid USART_SetRxTimeoutConfig(USART_Type *base, const usart_rx_timeout_config *config)\r\n{\r\n    base->FIFORXTIMEOUTCFG = 0U;\r\n    base->FIFORXTIMEOUTCFG = USART_FIFORXTIMEOUTCFG_RXTIMEOUT_COW((config->resetCounterOnReceive) ? 0U : 1U) |\r\n                             USART_FIFORXTIMEOUTCFG_RXTIMEOUT_COE((config->resetCounterOnEmpty) ? 0U : 1U) |\r\n                             USART_FIFORXTIMEOUTCFG_RXTIMEOUT_EN(config->enable) |\r\n                             USART_FIFORXTIMEOUTCFG_RXTIMEOUT_VALUE(config->counter) |\r\n                             USART_FIFORXTIMEOUTCFG_RXTIMEOUT_PRESCALER(config->prescaler);\r\n}\r\n#endif\r\n\r\n/*!\r\n * brief Sets the USART instance baud rate.\r\n *\r\n * This function configures the USART module baud rate. This function is used to update\r\n * the USART module baud rate after the USART module is initialized by the USART_Init.\r\n * code\r\n *  USART_SetBaudRate(USART1, 115200U, 20000000U);\r\n * endcode\r\n *\r\n * param base USART peripheral base address.\r\n * param baudrate_Bps USART baudrate to be set.\r\n * param srcClock_Hz USART clock source frequency in HZ.\r\n * retval kStatus_USART_BaudrateNotSupport Baudrate is not support in current clock source.\r\n * retval kStatus_Success Set baudrate succeed.\r\n * retval kStatus_InvalidArgument One or more arguments are invalid.\r\n */\r\nstatus_t USART_SetBaudRate(USART_Type *base, uint32_t baudrate_Bps, uint32_t srcClock_Hz)\r\n{\r\n    uint32_t best_diff = (uint32_t)-1, best_osrval = 0xf, best_brgval = (uint32_t)-1;\r\n    uint32_t osrval, brgval, diff, baudrate, allowed_error;\r\n\r\n    /* check arguments */\r\n    assert(!((NULL == base) || (0U == baudrate_Bps) || (0U == srcClock_Hz)));\r\n    if ((NULL == base) || (0U == baudrate_Bps) || (0U == srcClock_Hz))\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n\r\n    /* If synchronous master mode is enabled, only configure the BRG value. */\r\n    if ((base->CFG & USART_CFG_SYNCEN_MASK) != 0U)\r\n    {\r\n        if ((base->CFG & USART_CFG_SYNCMST_MASK) != 0U)\r\n        {\r\n            brgval    = srcClock_Hz / baudrate_Bps;\r\n            base->BRG = brgval - 1U;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        /* Actual baud rate must be within 3% of desired baud rate based on the calculated OSR and BRG value */\r\n        allowed_error = ((baudrate_Bps / 100U) * 3U);\r\n\r\n        for (osrval = best_osrval; osrval >= 4U; osrval--)\r\n        {\r\n            /* \r\n             * Smaller values of OSR can make the sampling position within a data bit less accurate and may\r\n             * potentially cause more noise errors or incorrect data.\r\n             * Break if the best baudrate's diff is in the allowed error range and the osrval is below 8,\r\n             * only use lower osrval if the baudrate cannot be obtained with an osrval of 8 or above. */\r\n            if ((osrval <= 8U) && (best_diff <= allowed_error))\r\n            {\r\n                break;\r\n            }\r\n\r\n            brgval = (((srcClock_Hz * 10U) / ((osrval + 1U) * baudrate_Bps)) - 5U) / 10U;\r\n            if (brgval > 0xFFFFU)\r\n            {\r\n                continue;\r\n            }\r\n            baudrate = srcClock_Hz / ((osrval + 1U) * (brgval + 1U));\r\n            diff     = (baudrate_Bps < baudrate) ? (baudrate - baudrate_Bps) : (baudrate_Bps - baudrate);\r\n            if (diff < best_diff)\r\n            {\r\n                best_diff   = diff;\r\n                best_osrval = osrval;\r\n                best_brgval = brgval;\r\n            }\r\n        }\r\n\r\n        /* Check to see if actual baud rate is within 3% of desired baud rate\r\n         * based on the best calculated OSR and BRG value */\r\n        baudrate = srcClock_Hz / ((best_osrval + 1U) * (best_brgval + 1U));\r\n        diff     = (baudrate_Bps < baudrate) ? (baudrate - baudrate_Bps) : (baudrate_Bps - baudrate);\r\n        if (diff > allowed_error)\r\n        {\r\n            return kStatus_USART_BaudrateNotSupport;\r\n        }\r\n\r\n        /* value over range */\r\n        if (best_brgval > 0xFFFFU)\r\n        {\r\n            return kStatus_USART_BaudrateNotSupport;\r\n        }\r\n\r\n        base->OSR = best_osrval;\r\n        base->BRG = best_brgval;\r\n    }\r\n\r\n    return kStatus_Success;\r\n}\r\n\r\n/*!\r\n * brief Enable 32 kHz mode which USART uses clock from the RTC oscillator as the clock source.\r\n *\r\n * Please note that in order to use a 32 kHz clock to operate USART properly, the RTC oscillator\r\n * and its 32 kHz output must be manully enabled by user, by calling RTC_Init and setting\r\n * SYSCON_RTCOSCCTRL_EN bit to 1.\r\n * And in 32kHz clocking mode the USART can only work at 9600 baudrate or at the baudrate that\r\n * 9600 can evenly divide, eg: 4800, 3200.\r\n *\r\n * param base USART peripheral base address.\r\n * param baudRate_Bps USART baudrate to be set..\r\n * param enableMode32k true is 32k mode, false is normal mode.\r\n * param srcClock_Hz USART clock source frequency in HZ.\r\n * retval kStatus_USART_BaudrateNotSupport Baudrate is not support in current clock source.\r\n * retval kStatus_Success Set baudrate succeed.\r\n * retval kStatus_InvalidArgument One or more arguments are invalid.\r\n */\r\nstatus_t USART_Enable32kMode(USART_Type *base, uint32_t baudRate_Bps, bool enableMode32k, uint32_t srcClock_Hz)\r\n{\r\n    status_t result = kStatus_Success;\r\n    base->CFG &= ~(USART_CFG_ENABLE_MASK);\r\n    if (enableMode32k)\r\n    {\r\n        base->CFG |= USART_CFG_MODE32K_MASK;\r\n        if ((9600U % baudRate_Bps) == 0U)\r\n        {\r\n            base->BRG = 9600U / baudRate_Bps - 1U;\r\n        }\r\n        else\r\n        {\r\n            return kStatus_USART_BaudrateNotSupport;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        base->CFG &= ~(USART_CFG_MODE32K_MASK);\r\n        result = USART_SetBaudRate(base, baudRate_Bps, srcClock_Hz);\r\n        if (kStatus_Success != result)\r\n        {\r\n            return result;\r\n        }\r\n    }\r\n    base->CFG |= USART_CFG_ENABLE_MASK;\r\n    return result;\r\n}\r\n\r\n/*!\r\n * brief Enable 9-bit data mode for USART.\r\n *\r\n * This function set the 9-bit mode for USART module. The 9th bit is not used for parity thus can be modified by user.\r\n *\r\n * param base USART peripheral base address.\r\n * param enable true to enable, false to disable.\r\n */\r\nvoid USART_Enable9bitMode(USART_Type *base, bool enable)\r\n{\r\n    assert(base != NULL);\r\n\r\n    uint32_t temp = 0U;\r\n\r\n    if (enable)\r\n    {\r\n        /* Set USART 9-bit mode, disable parity. */\r\n        temp = base->CFG & ~((uint32_t)USART_CFG_DATALEN_MASK | (uint32_t)USART_CFG_PARITYSEL_MASK);\r\n        temp |= (uint32_t)USART_CFG_DATALEN(0x2U);\r\n        base->CFG = temp;\r\n    }\r\n    else\r\n    {\r\n        /* Set USART to 8-bit mode. */\r\n        base->CFG &= ~((uint32_t)USART_CFG_DATALEN_MASK);\r\n        base->CFG |= (uint32_t)USART_CFG_DATALEN(0x1U);\r\n    }\r\n}\r\n\r\n/*!\r\n * brief Transmit an address frame in 9-bit data mode.\r\n *\r\n * param base USART peripheral base address.\r\n * param address USART slave address.\r\n */\r\nvoid USART_SendAddress(USART_Type *base, uint8_t address)\r\n{\r\n    assert(base != NULL);\r\n    base->FIFOWR = ((uint32_t)address | 0x100UL);\r\n}\r\n\r\n/*!\r\n * brief Writes to the TX register using a blocking method.\r\n *\r\n * This function polls the TX register, waits for the TX register to be empty or for the TX FIFO\r\n * to have room and writes data to the TX buffer.\r\n *\r\n * param base USART peripheral base address.\r\n * param data Start address of the data to write.\r\n * param length Size of the data to write.\r\n * retval kStatus_USART_Timeout Transmission timed out and was aborted.\r\n * retval kStatus_InvalidArgument Invalid argument.\r\n * retval kStatus_Success Successfully wrote all data.\r\n */\r\nstatus_t USART_WriteBlocking(USART_Type *base, const uint8_t *data, size_t length)\r\n{\r\n    /* Check arguments */\r\n    assert(!((NULL == base) || (NULL == data)));\r\n#if UART_RETRY_TIMES\r\n    uint32_t waitTimes;\r\n#endif\r\n    if ((NULL == base) || (NULL == data))\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n    /* Check whether txFIFO is enabled */\r\n    if (0U == (base->FIFOCFG & USART_FIFOCFG_ENABLETX_MASK))\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n    for (; length > 0U; length--)\r\n    {\r\n        /* Loop until txFIFO get some space for new data */\r\n#if UART_RETRY_TIMES\r\n        waitTimes = UART_RETRY_TIMES;\r\n        while ((0U == (base->FIFOSTAT & USART_FIFOSTAT_TXNOTFULL_MASK)) && (--waitTimes != 0U))\r\n#else\r\n        while (0U == (base->FIFOSTAT & USART_FIFOSTAT_TXNOTFULL_MASK))\r\n#endif\r\n        {\r\n        }\r\n#if UART_RETRY_TIMES\r\n        if (0U == waitTimes)\r\n        {\r\n            return kStatus_USART_Timeout;\r\n        }\r\n#endif\r\n        base->FIFOWR = *data;\r\n        data++;\r\n    }\r\n    /* Wait to finish transfer */\r\n#if UART_RETRY_TIMES\r\n    waitTimes = UART_RETRY_TIMES;\r\n    while ((0U == (base->STAT & USART_STAT_TXIDLE_MASK)) && (--waitTimes != 0U))\r\n#else\r\n    while (0U == (base->STAT & USART_STAT_TXIDLE_MASK))\r\n#endif\r\n    {\r\n    }\r\n#if UART_RETRY_TIMES\r\n    if (0U == waitTimes)\r\n    {\r\n        return kStatus_USART_Timeout;\r\n    }\r\n#endif\r\n    return kStatus_Success;\r\n}\r\n\r\n/*!\r\n * brief Read RX data register using a blocking method.\r\n *\r\n * This function polls the RX register, waits for the RX register to be full or for RX FIFO to\r\n * have data and read data from the TX register.\r\n *\r\n * param base USART peripheral base address.\r\n * param data Start address of the buffer to store the received data.\r\n * param length Size of the buffer.\r\n * retval kStatus_USART_FramingError Receiver overrun happened while receiving data.\r\n * retval kStatus_USART_ParityError Noise error happened while receiving data.\r\n * retval kStatus_USART_NoiseError Framing error happened while receiving data.\r\n * retval kStatus_USART_RxError Overflow or underflow rxFIFO happened.\r\n * retval kStatus_USART_Timeout Transmission timed out and was aborted.\r\n * retval kStatus_Success Successfully received all data.\r\n */\r\nstatus_t USART_ReadBlocking(USART_Type *base, uint8_t *data, size_t length)\r\n{\r\n    uint32_t statusFlag;\r\n    status_t status = kStatus_Success;\r\n#if UART_RETRY_TIMES\r\n    uint32_t waitTimes;\r\n#endif\r\n\r\n    /* check arguments */\r\n    assert(!((NULL == base) || (NULL == data)));\r\n    if ((NULL == base) || (NULL == data))\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n\r\n    /* Check whether rxFIFO is enabled */\r\n    if ((base->FIFOCFG & USART_FIFOCFG_ENABLERX_MASK) == 0U)\r\n    {\r\n        return kStatus_Fail;\r\n    }\r\n    for (; length > 0U; length--)\r\n    {\r\n        /* loop until rxFIFO have some data to read */\r\n#if UART_RETRY_TIMES\r\n        waitTimes = UART_RETRY_TIMES;\r\n        while (((base->FIFOSTAT & USART_FIFOSTAT_RXNOTEMPTY_MASK) == 0U) && (--waitTimes != 0U))\r\n#else\r\n        while ((base->FIFOSTAT & USART_FIFOSTAT_RXNOTEMPTY_MASK) == 0U)\r\n#endif\r\n        {\r\n        }\r\n#if UART_RETRY_TIMES\r\n        if (waitTimes == 0U)\r\n        {\r\n            status = kStatus_USART_Timeout;\r\n            break;\r\n        }\r\n#endif\r\n        /* check rxFIFO statusFlag */\r\n        if ((base->FIFOSTAT & USART_FIFOSTAT_RXERR_MASK) != 0U)\r\n        {\r\n            base->FIFOCFG |= USART_FIFOCFG_EMPTYRX_MASK;\r\n            base->FIFOSTAT |= USART_FIFOSTAT_RXERR_MASK;\r\n            status = kStatus_USART_RxError;\r\n            break;\r\n        }\r\n        /* check receive statusFlag */\r\n        statusFlag = base->STAT;\r\n        /* Clear all status flags */\r\n        base->STAT |= statusFlag;\r\n        if ((statusFlag & USART_STAT_PARITYERRINT_MASK) != 0U)\r\n        {\r\n            status = kStatus_USART_ParityError;\r\n        }\r\n        if ((statusFlag & USART_STAT_FRAMERRINT_MASK) != 0U)\r\n        {\r\n            status = kStatus_USART_FramingError;\r\n        }\r\n        if ((statusFlag & USART_STAT_RXNOISEINT_MASK) != 0U)\r\n        {\r\n            status = kStatus_USART_NoiseError;\r\n        }\r\n\r\n        if (kStatus_Success == status)\r\n        {\r\n            *data = (uint8_t)base->FIFORD;\r\n            data++;\r\n        }\r\n        else\r\n        {\r\n            break;\r\n        }\r\n    }\r\n    return status;\r\n}\r\n\r\n/*!\r\n * brief Initializes the USART handle.\r\n *\r\n * This function initializes the USART handle which can be used for other USART\r\n * transactional APIs. Usually, for a specified USART instance,\r\n * call this API once to get the initialized handle.\r\n *\r\n * param base USART peripheral base address.\r\n * param handle USART handle pointer.\r\n * param callback The callback function.\r\n * param userData The parameter of the callback function.\r\n */\r\nstatus_t USART_TransferCreateHandle(USART_Type *base,\r\n                                    usart_handle_t *handle,\r\n                                    usart_transfer_callback_t callback,\r\n                                    void *userData)\r\n{\r\n    /* Check 'base' */\r\n    assert(!((NULL == base) || (NULL == handle)));\r\n\r\n    uint32_t instance = 0;\r\n    usart_to_flexcomm_t handler;\r\n    handler.usart_master_handler = USART_TransferHandleIRQ;\r\n\r\n    if ((NULL == base) || (NULL == handle))\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n\r\n    instance = USART_GetInstance(base);\r\n\r\n    (void)memset(handle, 0, sizeof(*handle));\r\n    /* Set the TX/RX state. */\r\n    handle->rxState = (uint8_t)kUSART_RxIdle;\r\n    handle->txState = (uint8_t)kUSART_TxIdle;\r\n    /* Set the callback and user data. */\r\n    handle->callback    = callback;\r\n    handle->userData    = userData;\r\n    handle->rxWatermark = (uint8_t)USART_FIFOTRIG_RXLVL_GET(base);\r\n    handle->txWatermark = (uint8_t)USART_FIFOTRIG_TXLVL_GET(base);\r\n\r\n    FLEXCOMM_SetIRQHandler(base, handler.flexcomm_handler, handle);\r\n\r\n    /* Enable interrupt in NVIC. */\r\n    (void)EnableIRQ(s_usartIRQ[instance]);\r\n\r\n    return kStatus_Success;\r\n}\r\n\r\n/*!\r\n * brief Transmits a buffer of data using the interrupt method.\r\n *\r\n * This function sends data using an interrupt method. This is a non-blocking function, which\r\n * returns directly without waiting for all data to be written to the TX register. When\r\n * all data is written to the TX register in the IRQ handler, the USART driver calls the callback\r\n * function and passes the ref kStatus_USART_TxIdle as status parameter.\r\n *\r\n * param base USART peripheral base address.\r\n * param handle USART handle pointer.\r\n * param xfer USART transfer structure. See #usart_transfer_t.\r\n * retval kStatus_Success Successfully start the data transmission.\r\n * retval kStatus_USART_TxBusy Previous transmission still not finished, data not all written to TX register yet.\r\n * retval kStatus_InvalidArgument Invalid argument.\r\n */\r\nstatus_t USART_TransferSendNonBlocking(USART_Type *base, usart_handle_t *handle, usart_transfer_t *xfer)\r\n{\r\n    /* Check arguments */\r\n    assert(!((NULL == base) || (NULL == handle) || (NULL == xfer)));\r\n    if ((NULL == base) || (NULL == handle) || (NULL == xfer))\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n    /* Check xfer members */\r\n    assert(!((0U == xfer->dataSize) || (NULL == xfer->txData)));\r\n    if ((0U == xfer->dataSize) || (NULL == xfer->txData))\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n\r\n    uint32_t globalMask = DisableGlobalIRQ();\r\n\r\n    /* Return error if current TX busy. */\r\n    if ((uint8_t)kUSART_TxBusy == handle->txState)\r\n    {\r\n        EnableGlobalIRQ(globalMask);\r\n        return kStatus_USART_TxBusy;\r\n    }\r\n    else\r\n    {\r\n        handle->txState       = (uint8_t)kUSART_TxBusy;\r\n        uint32_t usartMask = USART_GetEnabledInterrupts(base);\r\n        USART_DisableInterrupts(base, usartMask);\r\n        EnableGlobalIRQ(globalMask);\r\n\r\n        handle->txData        = xfer->txData;\r\n        handle->txDataSize    = xfer->dataSize;\r\n        handle->txDataSizeAll = xfer->dataSize;\r\n        USART_EnableInterrupts(base, usartMask | (uint32_t)kUSART_TxLevelInterruptEnable);\r\n    }\r\n\r\n    return kStatus_Success;\r\n}\r\n\r\n/*!\r\n * brief Aborts the interrupt-driven data transmit.\r\n *\r\n * This function aborts the interrupt driven data sending. The user can get the remainBtyes to find out\r\n * how many bytes are still not sent out.\r\n *\r\n * param base USART peripheral base address.\r\n * param handle USART handle pointer.\r\n */\r\nvoid USART_TransferAbortSend(USART_Type *base, usart_handle_t *handle)\r\n{\r\n    assert(NULL != handle);\r\n\r\n    /* Disable interrupts */\r\n    USART_DisableInterrupts(base, (uint32_t)kUSART_TxLevelInterruptEnable);\r\n    /* Empty txFIFO */\r\n    base->FIFOCFG |= USART_FIFOCFG_EMPTYTX_MASK;\r\n\r\n    handle->txDataSize = 0U;\r\n    handle->txState    = (uint8_t)kUSART_TxIdle;\r\n}\r\n\r\n/*!\r\n * brief Get the number of bytes that have been sent out to bus.\r\n *\r\n * This function gets the number of bytes that have been sent out to bus by interrupt method.\r\n *\r\n * param base USART peripheral base address.\r\n * param handle USART handle pointer.\r\n * param count Send bytes count.\r\n * retval kStatus_NoTransferInProgress No send in progress.\r\n * retval kStatus_InvalidArgument Parameter is invalid.\r\n * retval kStatus_Success Get successfully through the parameter \\p count;\r\n */\r\nstatus_t USART_TransferGetSendCount(USART_Type *base, usart_handle_t *handle, uint32_t *count)\r\n{\r\n    assert(NULL != handle);\r\n    assert(NULL != count);\r\n\r\n    if ((uint8_t)kUSART_TxIdle == handle->txState)\r\n    {\r\n        return kStatus_NoTransferInProgress;\r\n    }\r\n\r\n    *count = handle->txDataSizeAll - handle->txDataSize -\r\n             ((base->FIFOSTAT & USART_FIFOSTAT_TXLVL_MASK) >> USART_FIFOSTAT_TXLVL_SHIFT);\r\n\r\n    return kStatus_Success;\r\n}\r\n\r\n/*!\r\n * brief Receives a buffer of data using an interrupt method.\r\n *\r\n * This function receives data using an interrupt method. This is a non-blocking function, which\r\n *  returns without waiting for all data to be received.\r\n * If the RX ring buffer is used and not empty, the data in the ring buffer is copied and\r\n * the parameter p receivedBytes shows how many bytes are copied from the ring buffer.\r\n * After copying, if the data in the ring buffer is not enough to read, the receive\r\n * request is saved by the USART driver. When the new data arrives, the receive request\r\n * is serviced first. When all data is received, the USART driver notifies the upper layer\r\n * through a callback function and passes the status parameter ref kStatus_USART_RxIdle.\r\n * For example, the upper layer needs 10 bytes but there are only 5 bytes in the ring buffer.\r\n * The 5 bytes are copied to the xfer->data and this function returns with the\r\n * parameter p receivedBytes set to 5. For the left 5 bytes, newly arrived data is\r\n * saved from the xfer->data[5]. When 5 bytes are received, the USART driver notifies the upper layer.\r\n * If the RX ring buffer is not enabled, this function enables the RX and RX interrupt\r\n * to receive data to the xfer->data. When all data is received, the upper layer is notified.\r\n *\r\n * param base USART peripheral base address.\r\n * param handle USART handle pointer.\r\n * param xfer USART transfer structure, see #usart_transfer_t.\r\n * param receivedBytes Bytes received from the ring buffer directly.\r\n * retval kStatus_Success Successfully queue the transfer into transmit queue.\r\n * retval kStatus_USART_RxBusy Previous receive request is not finished.\r\n * retval kStatus_InvalidArgument Invalid argument.\r\n */\r\nstatus_t USART_TransferReceiveNonBlocking(USART_Type *base,\r\n                                          usart_handle_t *handle,\r\n                                          usart_transfer_t *xfer,\r\n                                          size_t *receivedBytes)\r\n{\r\n    uint32_t i;\r\n    /* How many bytes to copy from ring buffer to user memory. */\r\n    size_t bytesToCopy = 0U;\r\n    /* How many bytes to receive. */\r\n    size_t bytesToReceive;\r\n    /* How many bytes currently have received. */\r\n    size_t bytesCurrentReceived;\r\n\r\n    /* Check arguments */\r\n    assert(!((NULL == base) || (NULL == handle) || (NULL == xfer)));\r\n    if ((NULL == base) || (NULL == handle) || (NULL == xfer))\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n    /* Check xfer members */\r\n    assert(!((0U == xfer->dataSize) || (NULL == xfer->rxData)));\r\n    if ((0U == xfer->dataSize) || (NULL == xfer->rxData))\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n\r\n    /* Enable address detect when address match is enabled. */\r\n    if ((base->CFG & (uint32_t)USART_CFG_AUTOADDR_MASK) != 0U)\r\n    {\r\n        base->CTL |= (uint32_t)USART_CTL_ADDRDET_MASK;\r\n    }\r\n\r\n    uint32_t globalMask = DisableGlobalIRQ();\r\n\r\n    /* How to get data:\r\n       1. If RX ring buffer is not enabled, then save xfer->data and xfer->dataSize\r\n          to uart handle, enable interrupt to store received data to xfer->data. When\r\n          all data received, trigger callback.\r\n       2. If RX ring buffer is enabled and not empty, get data from ring buffer first.\r\n          If there are enough data in ring buffer, copy them to xfer->data and return.\r\n          If there are not enough data in ring buffer, copy all of them to xfer->data,\r\n          save the xfer->data remained empty space to uart handle, receive data\r\n          to this empty space and trigger callback when finished. */\r\n    if ((uint8_t)kUSART_RxBusy == handle->rxState)\r\n    {\r\n        EnableGlobalIRQ(globalMask);\r\n        return kStatus_USART_RxBusy;\r\n    }\r\n    else\r\n    {\r\n        handle->rxState       = (uint8_t)kUSART_RxBusy;\r\n        uint32_t usartMask = USART_GetEnabledInterrupts(base);\r\n        USART_DisableInterrupts(base, usartMask);\r\n        EnableGlobalIRQ(globalMask);\r\n\r\n        bytesToReceive       = xfer->dataSize;\r\n        bytesCurrentReceived = 0U;\r\n        /* If RX ring buffer is used. */\r\n        if (handle->rxRingBuffer != NULL)\r\n        {\r\n            /* How many bytes in RX ring buffer currently. */\r\n            bytesToCopy = USART_TransferGetRxRingBufferLength(handle);\r\n            if (bytesToCopy != 0U)\r\n            {\r\n                bytesToCopy = MIN(bytesToReceive, bytesToCopy);\r\n                bytesToReceive -= bytesToCopy;\r\n                /* Copy data from ring buffer to user memory. */\r\n                for (i = 0U; i < bytesToCopy; i++)\r\n                {\r\n                    xfer->rxData[bytesCurrentReceived++] = handle->rxRingBuffer[handle->rxRingBufferTail];\r\n                    /* Wrap to 0. Not use modulo (%) because it might be large and slow. */\r\n                    if ((size_t)handle->rxRingBufferTail + 1U == handle->rxRingBufferSize)\r\n                    {\r\n                        handle->rxRingBufferTail = 0U;\r\n                    }\r\n                    else\r\n                    {\r\n                        handle->rxRingBufferTail++;\r\n                    }\r\n                }\r\n            }\r\n            /* If ring buffer does not have enough data, still need to read more data. */\r\n            if (bytesToReceive != 0U)\r\n            {\r\n                /* No data in ring buffer, save the request to UART handle. */\r\n                handle->rxData        = xfer->rxData + bytesCurrentReceived;\r\n                handle->rxDataSize    = bytesToReceive;\r\n                handle->rxDataSizeAll = xfer->dataSize;\r\n            }\r\n            else\r\n            {\r\n                handle->rxState = (uint8_t)kUSART_RxIdle;\r\n            }\r\n        }\r\n        /* Ring buffer not used. */\r\n        else\r\n        {\r\n            handle->rxData        = xfer->rxData + bytesCurrentReceived;\r\n            handle->rxDataSize    = bytesToReceive;\r\n            handle->rxDataSizeAll = bytesToReceive;\r\n\r\n            /* Enable RX interrupt. */\r\n            base->FIFOINTENSET = USART_FIFOINTENSET_RXLVL_MASK;\r\n        }\r\n\r\n        /* Re-enable USART IRQ. */\r\n        USART_EnableInterrupts(base, usartMask);\r\n\r\n        /* Return the how many bytes have read. */\r\n        if (receivedBytes != NULL)\r\n        {\r\n            *receivedBytes = bytesCurrentReceived;\r\n        }\r\n\r\n        /* When using ring buffer and we received everything, call user callback. */\r\n        if (handle->rxRingBuffer != NULL && bytesToReceive == 0U)\r\n        {\r\n            if (handle->callback != NULL)\r\n            {\r\n                handle->callback(base, handle, kStatus_USART_RxIdle, handle->userData);\r\n            }\r\n        }\r\n    }\r\n\r\n    return kStatus_Success;\r\n}\r\n\r\n/*!\r\n * brief Aborts the interrupt-driven data receiving.\r\n *\r\n * This function aborts the interrupt-driven data receiving. The user can get the remainBytes to find out\r\n * how many bytes not received yet.\r\n *\r\n * param base USART peripheral base address.\r\n * param handle USART handle pointer.\r\n */\r\nvoid USART_TransferAbortReceive(USART_Type *base, usart_handle_t *handle)\r\n{\r\n    assert(NULL != handle);\r\n\r\n    /* Only abort the receive to handle->rxData, the RX ring buffer is still working. */\r\n    if (NULL == handle->rxRingBuffer)\r\n    {\r\n        /* Disable interrupts */\r\n        USART_DisableInterrupts(base, (uint32_t)kUSART_RxLevelInterruptEnable);\r\n        /* Empty rxFIFO */\r\n        base->FIFOCFG |= USART_FIFOCFG_EMPTYRX_MASK;\r\n    }\r\n\r\n    handle->rxDataSize = 0U;\r\n    handle->rxState    = (uint8_t)kUSART_RxIdle;\r\n}\r\n\r\n/*!\r\n * brief Get the number of bytes that have been received.\r\n *\r\n * This function gets the number of bytes that have been received.\r\n *\r\n * param base USART peripheral base address.\r\n * param handle USART handle pointer.\r\n * param count Receive bytes count.\r\n * retval kStatus_NoTransferInProgress No receive in progress.\r\n * retval kStatus_InvalidArgument Parameter is invalid.\r\n * retval kStatus_Success Get successfully through the parameter \\p count;\r\n */\r\nstatus_t USART_TransferGetReceiveCount(USART_Type *base, usart_handle_t *handle, uint32_t *count)\r\n{\r\n    assert(NULL != handle);\r\n    assert(NULL != count);\r\n\r\n    if ((uint8_t)kUSART_RxIdle == handle->rxState)\r\n    {\r\n        return kStatus_NoTransferInProgress;\r\n    }\r\n\r\n    *count = handle->rxDataSizeAll - handle->rxDataSize;\r\n\r\n    return kStatus_Success;\r\n}\r\n\r\n/*!\r\n * brief USART IRQ handle function.\r\n *\r\n * This function handles the USART transmit and receive IRQ request.\r\n *\r\n * param base USART peripheral base address.\r\n * param handle USART handle pointer.\r\n */\r\nvoid USART_TransferHandleIRQ(USART_Type *base, usart_handle_t *handle)\r\n{\r\n    /* Check arguments */\r\n    assert((NULL != base) && (NULL != handle));\r\n\r\n    bool receiveEnabled = ((handle->rxDataSize != 0U) || (handle->rxRingBuffer != NULL));\r\n    bool sendEnabled    = (handle->txDataSize != 0U);\r\n    uint8_t rxdata;\r\n    size_t tmpsize;\r\n\r\n    /* If RX overrun. */\r\n    if ((base->FIFOSTAT & USART_FIFOSTAT_RXERR_MASK) != 0U)\r\n    {\r\n        /* Clear rx error state. */\r\n        base->FIFOSTAT |= USART_FIFOSTAT_RXERR_MASK;\r\n        /* clear rxFIFO */\r\n        base->FIFOCFG |= USART_FIFOCFG_EMPTYRX_MASK;\r\n        /* Trigger callback. */\r\n        if (handle->callback != NULL)\r\n        {\r\n            handle->callback(base, handle, kStatus_USART_RxError, handle->userData);\r\n        }\r\n    }\r\n    /* TX under run, happens when slave is in synchronous mode and the data is not written in tx register in time. */\r\n    if ((base->FIFOSTAT & USART_FIFOSTAT_TXERR_MASK) != 0U)\r\n    {\r\n        /* Clear tx error state. */\r\n        base->FIFOSTAT |= USART_FIFOSTAT_TXERR_MASK;\r\n        /* Trigger callback. */\r\n        if (handle->callback != NULL)\r\n        {\r\n            handle->callback(base, handle, kStatus_USART_TxError, handle->userData);\r\n        }\r\n    }\r\n    /* If noise error. */\r\n    if ((base->STAT & USART_STAT_RXNOISEINT_MASK) != 0U)\r\n    {\r\n        /* Clear rx error state. */\r\n        base->STAT |= USART_STAT_RXNOISEINT_MASK;\r\n        /* clear rxFIFO */\r\n        base->FIFOCFG |= USART_FIFOCFG_EMPTYRX_MASK;\r\n        /* Trigger callback. */\r\n        if (handle->callback != NULL)\r\n        {\r\n            handle->callback(base, handle, kStatus_USART_NoiseError, handle->userData);\r\n        }\r\n    }\r\n    /* If framing error. */\r\n    if ((base->STAT & USART_STAT_FRAMERRINT_MASK) != 0U)\r\n    {\r\n        /* Clear rx error state. */\r\n        base->STAT |= USART_STAT_FRAMERRINT_MASK;\r\n        /* clear rxFIFO */\r\n        base->FIFOCFG |= USART_FIFOCFG_EMPTYRX_MASK;\r\n        /* Trigger callback. */\r\n        if (handle->callback != NULL)\r\n        {\r\n            handle->callback(base, handle, kStatus_USART_FramingError, handle->userData);\r\n        }\r\n    }\r\n    /* If parity error. */\r\n    if ((base->STAT & USART_STAT_PARITYERRINT_MASK) != 0U)\r\n    {\r\n        /* Clear rx error state. */\r\n        base->STAT |= USART_STAT_PARITYERRINT_MASK;\r\n        /* clear rxFIFO */\r\n        base->FIFOCFG |= USART_FIFOCFG_EMPTYRX_MASK;\r\n        /* Trigger callback. */\r\n        if (handle->callback != NULL)\r\n        {\r\n            handle->callback(base, handle, kStatus_USART_ParityError, handle->userData);\r\n        }\r\n    }\r\n    while ((receiveEnabled && ((base->FIFOSTAT & USART_FIFOSTAT_RXNOTEMPTY_MASK) != 0U)) ||\r\n           (sendEnabled && ((base->FIFOSTAT & USART_FIFOSTAT_TXNOTFULL_MASK) != 0U)))\r\n    {\r\n        /* Receive data */\r\n        if (receiveEnabled && ((base->FIFOSTAT & USART_FIFOSTAT_RXNOTEMPTY_MASK) != 0U))\r\n        {\r\n            /* Clear address detect when RXFIFO has data. */\r\n            base->CTL &= ~(uint32_t)USART_CTL_ADDRDET_MASK;\r\n            /* Receive to app bufffer if app buffer is present */\r\n            if (handle->rxDataSize != 0U)\r\n            {\r\n                rxdata          = (uint8_t)base->FIFORD;\r\n                *handle->rxData = rxdata;\r\n                handle->rxDataSize--;\r\n                handle->rxData++;\r\n                receiveEnabled = ((handle->rxDataSize != 0U) || (handle->rxRingBuffer != NULL));\r\n                if (0U == handle->rxDataSize)\r\n                {\r\n                    if (NULL == handle->rxRingBuffer)\r\n                    {\r\n                        base->FIFOINTENCLR = USART_FIFOINTENCLR_RXLVL_MASK | USART_FIFOINTENSET_RXERR_MASK;\r\n                    }\r\n                    handle->rxState = (uint8_t)kUSART_RxIdle;\r\n                    if (handle->callback != NULL)\r\n                    {\r\n                        handle->callback(base, handle, kStatus_USART_RxIdle, handle->userData);\r\n                    }\r\n                }\r\n            }\r\n            /* Otherwise receive to ring buffer if ring buffer is present */\r\n            else\r\n            {\r\n                if (handle->rxRingBuffer != NULL)\r\n                {\r\n                    /* If RX ring buffer is full, trigger callback to notify over run. */\r\n                    if (USART_TransferIsRxRingBufferFull(handle))\r\n                    {\r\n                        if (handle->callback != NULL)\r\n                        {\r\n                            handle->callback(base, handle, kStatus_USART_RxRingBufferOverrun, handle->userData);\r\n                        }\r\n                    }\r\n                    /* If ring buffer is still full after callback function, the oldest data is overridden. */\r\n                    if (USART_TransferIsRxRingBufferFull(handle))\r\n                    {\r\n                        /* Increase handle->rxRingBufferTail to make room for new data. */\r\n                        if ((size_t)handle->rxRingBufferTail + 1U == handle->rxRingBufferSize)\r\n                        {\r\n                            handle->rxRingBufferTail = 0U;\r\n                        }\r\n                        else\r\n                        {\r\n                            handle->rxRingBufferTail++;\r\n                        }\r\n                    }\r\n                    /* Read data. */\r\n                    rxdata                                         = (uint8_t)base->FIFORD;\r\n                    handle->rxRingBuffer[handle->rxRingBufferHead] = rxdata;\r\n                    /* Increase handle->rxRingBufferHead. */\r\n                    if ((size_t)handle->rxRingBufferHead + 1U == handle->rxRingBufferSize)\r\n                    {\r\n                        handle->rxRingBufferHead = 0U;\r\n                    }\r\n                    else\r\n                    {\r\n                        handle->rxRingBufferHead++;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        /* Send data */\r\n        if (sendEnabled && ((base->FIFOSTAT & USART_FIFOSTAT_TXNOTFULL_MASK) != 0U))\r\n        {\r\n            base->FIFOWR = *handle->txData;\r\n            handle->txDataSize--;\r\n            handle->txData++;\r\n            sendEnabled = handle->txDataSize != 0U;\r\n            if (!sendEnabled)\r\n            {\r\n                base->FIFOINTENCLR = USART_FIFOINTENCLR_TXLVL_MASK;\r\n\r\n                base->INTENSET = USART_INTENSET_TXIDLEEN_MASK;\r\n            }\r\n        }\r\n    }\r\n\r\n    /* Tx idle and the interrupt is enabled. */\r\n    if ((0U != (base->INTENSET & USART_INTENSET_TXIDLEEN_MASK)) && (0U != (base->INTSTAT & USART_INTSTAT_TXIDLE_MASK)))\r\n    {\r\n        /* Set txState to idle only when all data has been sent out to bus. */\r\n        handle->txState = (uint8_t)kUSART_TxIdle;\r\n        /* Disable tx idle interrupt */\r\n        base->INTENCLR = USART_INTENCLR_TXIDLECLR_MASK;\r\n\r\n        /* Trigger callback. */\r\n        if (handle->callback != NULL)\r\n        {\r\n            handle->callback(base, handle, kStatus_USART_TxIdle, handle->userData);\r\n        }\r\n    }\r\n\r\n    /* ring buffer is not used */\r\n    if (NULL == handle->rxRingBuffer)\r\n    {\r\n        tmpsize = handle->rxDataSize;\r\n\r\n        /* restore if rx transfer ends and rxLevel is different from default value */\r\n        if ((tmpsize == 0U) && (USART_FIFOTRIG_RXLVL_GET(base) != handle->rxWatermark))\r\n        {\r\n            base->FIFOTRIG =\r\n                (base->FIFOTRIG & (~USART_FIFOTRIG_RXLVL_MASK)) | USART_FIFOTRIG_RXLVL(handle->rxWatermark);\r\n        }\r\n        /* decrease level if rx transfer is bellow */\r\n        if ((tmpsize != 0U) && (tmpsize < (USART_FIFOTRIG_RXLVL_GET(base) + 1U)))\r\n        {\r\n            base->FIFOTRIG = (base->FIFOTRIG & (~USART_FIFOTRIG_RXLVL_MASK)) | (USART_FIFOTRIG_RXLVL(tmpsize - 1U));\r\n        }\r\n    }\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/drivers/fsl_usart.h",
    "content": "/*\r\n * Copyright (c) 2016, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2023 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n#ifndef FSL_USART_H_\r\n#define FSL_USART_H_\r\n\r\n#include \"fsl_common.h\"\r\n\r\n/*!\r\n * @addtogroup usart_driver\r\n * @{\r\n */\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*! @name Driver version */\r\n/*! @{ */\r\n/*! @brief USART driver version. */\r\n#define FSL_USART_DRIVER_VERSION (MAKE_VERSION(2, 8, 4))\r\n/*! @} */\r\n\r\n#define USART_FIFOTRIG_TXLVL_GET(base) (((base)->FIFOTRIG & USART_FIFOTRIG_TXLVL_MASK) >> USART_FIFOTRIG_TXLVL_SHIFT)\r\n#define USART_FIFOTRIG_RXLVL_GET(base) (((base)->FIFOTRIG & USART_FIFOTRIG_RXLVL_MASK) >> USART_FIFOTRIG_RXLVL_SHIFT)\r\n\r\n/*! @brief Retry times for waiting flag.\r\n *\r\n * Defining to zero means to keep waiting for the flag until it is assert/deassert in blocking transfer,\r\n * otherwise the program will wait until the UART_RETRY_TIMES counts down to 0,\r\n * if the flag still remains unchanged then program will return kStatus_USART_Timeout.\r\n * It is not advised to use this macro in formal application to prevent any hardware error\r\n * because the actual wait period is affected by the compiler and optimization.\r\n */\r\n#ifndef UART_RETRY_TIMES\r\n#define UART_RETRY_TIMES 0U\r\n#endif\r\n\r\n/*! @brief Error codes for the USART driver. */\r\nenum\r\n{\r\n    kStatus_USART_TxBusy              = MAKE_STATUS(kStatusGroup_LPC_USART, 0),  /*!< Transmitter is busy. */\r\n    kStatus_USART_RxBusy              = MAKE_STATUS(kStatusGroup_LPC_USART, 1),  /*!< Receiver is busy. */\r\n    kStatus_USART_TxIdle              = MAKE_STATUS(kStatusGroup_LPC_USART, 2),  /*!< USART transmitter is idle. */\r\n    kStatus_USART_RxIdle              = MAKE_STATUS(kStatusGroup_LPC_USART, 3),  /*!< USART receiver is idle. */\r\n    kStatus_USART_TxError             = MAKE_STATUS(kStatusGroup_LPC_USART, 7),  /*!< Error happens on txFIFO. */\r\n    kStatus_USART_RxError             = MAKE_STATUS(kStatusGroup_LPC_USART, 9),  /*!< Error happens on rxFIFO. */\r\n    kStatus_USART_RxRingBufferOverrun = MAKE_STATUS(kStatusGroup_LPC_USART, 8),  /*!< Error happens on rx ring buffer */\r\n    kStatus_USART_NoiseError          = MAKE_STATUS(kStatusGroup_LPC_USART, 10), /*!< USART noise error. */\r\n    kStatus_USART_FramingError        = MAKE_STATUS(kStatusGroup_LPC_USART, 11), /*!< USART framing error. */\r\n    kStatus_USART_ParityError         = MAKE_STATUS(kStatusGroup_LPC_USART, 12), /*!< USART parity error. */\r\n    kStatus_USART_BaudrateNotSupport =\r\n        MAKE_STATUS(kStatusGroup_LPC_USART, 13), /*!< Baudrate is not support in current clock source */\r\n#if UART_RETRY_TIMES\r\n    kStatus_USART_Timeout = MAKE_STATUS(kStatusGroup_LPC_USART, 14), /*!< USART time out. */\r\n#endif\r\n};\r\n\r\n/*! @brief USART synchronous mode. */\r\ntypedef enum _usart_sync_mode\r\n{\r\n    kUSART_SyncModeDisabled = 0x0U, /*!< Asynchronous mode.       */\r\n    kUSART_SyncModeSlave    = 0x2U, /*!< Synchronous slave mode.  */\r\n    kUSART_SyncModeMaster   = 0x3U, /*!< Synchronous master mode. */\r\n} usart_sync_mode_t;\r\n\r\n/*! @brief USART parity mode. */\r\ntypedef enum _usart_parity_mode\r\n{\r\n    kUSART_ParityDisabled = 0x0U, /*!< Parity disabled */\r\n    kUSART_ParityEven     = 0x2U, /*!< Parity enabled, type even, bit setting: PE|PT = 10 */\r\n    kUSART_ParityOdd      = 0x3U, /*!< Parity enabled, type odd,  bit setting: PE|PT = 11 */\r\n} usart_parity_mode_t;\r\n\r\n/*! @brief USART stop bit count. */\r\ntypedef enum _usart_stop_bit_count\r\n{\r\n    kUSART_OneStopBit = 0U, /*!< One stop bit */\r\n    kUSART_TwoStopBit = 1U, /*!< Two stop bits */\r\n} usart_stop_bit_count_t;\r\n\r\n/*! @brief USART data size. */\r\ntypedef enum _usart_data_len\r\n{\r\n    kUSART_7BitsPerChar = 0U, /*!< Seven bit mode */\r\n    kUSART_8BitsPerChar = 1U, /*!< Eight bit mode */\r\n} usart_data_len_t;\r\n\r\n/*! @brief USART clock polarity configuration, used in sync mode.*/\r\ntypedef enum _usart_clock_polarity\r\n{\r\n    kUSART_RxSampleOnFallingEdge = 0x0U, /*!< Un_RXD is sampled on the falling edge of SCLK. */\r\n    kUSART_RxSampleOnRisingEdge  = 0x1U, /*!< Un_RXD is sampled on the rising edge of SCLK. */\r\n} usart_clock_polarity_t;\r\n\r\n/*! @brief txFIFO watermark values */\r\ntypedef enum _usart_txfifo_watermark\r\n{\r\n    kUSART_TxFifo0 = 0, /*!< USART tx watermark is empty */\r\n    kUSART_TxFifo1 = 1, /*!< USART tx watermark at 1 item */\r\n    kUSART_TxFifo2 = 2, /*!< USART tx watermark at 2 items */\r\n    kUSART_TxFifo3 = 3, /*!< USART tx watermark at 3 items */\r\n    kUSART_TxFifo4 = 4, /*!< USART tx watermark at 4 items */\r\n    kUSART_TxFifo5 = 5, /*!< USART tx watermark at 5 items */\r\n    kUSART_TxFifo6 = 6, /*!< USART tx watermark at 6 items */\r\n    kUSART_TxFifo7 = 7, /*!< USART tx watermark at 7 items */\r\n} usart_txfifo_watermark_t;\r\n\r\n/*! @brief rxFIFO watermark values */\r\ntypedef enum _usart_rxfifo_watermark\r\n{\r\n    kUSART_RxFifo1 = 0, /*!< USART rx watermark at 1 item */\r\n    kUSART_RxFifo2 = 1, /*!< USART rx watermark at 2 items */\r\n    kUSART_RxFifo3 = 2, /*!< USART rx watermark at 3 items */\r\n    kUSART_RxFifo4 = 3, /*!< USART rx watermark at 4 items */\r\n    kUSART_RxFifo5 = 4, /*!< USART rx watermark at 5 items */\r\n    kUSART_RxFifo6 = 5, /*!< USART rx watermark at 6 items */\r\n    kUSART_RxFifo7 = 6, /*!< USART rx watermark at 7 items */\r\n    kUSART_RxFifo8 = 7, /*!< USART rx watermark at 8 items */\r\n} usart_rxfifo_watermark_t;\r\n\r\n/*!\r\n * @brief USART interrupt configuration structure, default settings all disabled.\r\n */\r\nenum _usart_interrupt_enable\r\n{\r\n    kUSART_TxErrorInterruptEnable = (USART_FIFOINTENSET_TXERR_MASK),\r\n    kUSART_RxErrorInterruptEnable = (USART_FIFOINTENSET_RXERR_MASK),\r\n    kUSART_TxLevelInterruptEnable = (USART_FIFOINTENSET_TXLVL_MASK),\r\n    kUSART_RxLevelInterruptEnable = (USART_FIFOINTENSET_RXLVL_MASK),\r\n    kUSART_TxIdleInterruptEnable  = (USART_INTENSET_TXIDLEEN_MASK << 16U), /*!< Transmitter idle. */\r\n    kUSART_CtsChangeInterruptEnable =\r\n        (USART_INTENSET_DELTACTSEN_MASK << 16U), /*!< Change in the state of the CTS input. */\r\n    kUSART_RxBreakChangeInterruptEnable =\r\n        (USART_INTENSET_DELTARXBRKEN_MASK),                              /*!< Break condition asserted or deasserted. */\r\n    kUSART_RxStartInterruptEnable       = (USART_INTENSET_STARTEN_MASK), /*!< Rx start bit detected. */\r\n    kUSART_FramingErrorInterruptEnable  = (USART_INTENSET_FRAMERREN_MASK),   /*!< Framing error detected. */\r\n    kUSART_ParityErrorInterruptEnable   = (USART_INTENSET_PARITYERREN_MASK), /*!< Parity error detected. */\r\n    kUSART_NoiseErrorInterruptEnable    = (USART_INTENSET_RXNOISEEN_MASK),   /*!< Noise error detected. */\r\n    kUSART_AutoBaudErrorInterruptEnable = (USART_INTENSET_ABERREN_MASK),     /*!< Auto baudrate error detected. */\r\n#if defined(FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG) && FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG\r\n    kUSART_RxTimeoutInterruptEnable = (USART_FIFOINTENSET_RXTIMEOUT_MASK), /*!< Receive timeout detected. */\r\n#endif\r\n    kUSART_AllInterruptEnables =\r\n        kUSART_TxErrorInterruptEnable | kUSART_RxErrorInterruptEnable | kUSART_TxLevelInterruptEnable |\r\n        kUSART_RxLevelInterruptEnable | kUSART_TxIdleInterruptEnable | kUSART_CtsChangeInterruptEnable |\r\n        kUSART_RxBreakChangeInterruptEnable | kUSART_RxStartInterruptEnable | kUSART_FramingErrorInterruptEnable |\r\n        kUSART_ParityErrorInterruptEnable | kUSART_NoiseErrorInterruptEnable |\r\n#if defined(FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG) && FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG\r\n        kUSART_RxTimeoutInterruptEnable |\r\n#endif\r\n        kUSART_AutoBaudErrorInterruptEnable,\r\n};\r\n\r\n/*!\r\n * @brief USART status flags.\r\n *\r\n * This provides constants for the USART status flags for use in the USART functions.\r\n */\r\nenum _usart_flags\r\n{\r\n    kUSART_TxError            = (USART_FIFOSTAT_TXERR_MASK),       /*!< TEERR bit, sets if TX buffer is error */\r\n    kUSART_RxError            = (USART_FIFOSTAT_RXERR_MASK),       /*!< RXERR bit, sets if RX buffer is error */\r\n    kUSART_TxFifoEmptyFlag    = (USART_FIFOSTAT_TXEMPTY_MASK),     /*!< TXEMPTY bit, sets if TX buffer is empty */\r\n    kUSART_TxFifoNotFullFlag  = (USART_FIFOSTAT_TXNOTFULL_MASK),   /*!< TXNOTFULL bit, sets if TX buffer is not full */\r\n    kUSART_RxFifoNotEmptyFlag = (USART_FIFOSTAT_RXNOTEMPTY_MASK),  /*!< RXNOEMPTY bit, sets if RX buffer is not empty */\r\n    kUSART_RxFifoFullFlag     = (USART_FIFOSTAT_RXFULL_MASK),      /*!< RXFULL bit, sets if RX buffer is full */\r\n    kUSART_RxIdleFlag         = (USART_STAT_RXIDLE_MASK << 16U),   /*!< Receiver idle. */\r\n    kUSART_TxIdleFlag         = (USART_STAT_TXIDLE_MASK << 16U),   /*!< Transmitter idle. */\r\n    kUSART_CtsAssertFlag      = (USART_STAT_CTS_MASK << 16U),      /*!< CTS signal high. */\r\n    kUSART_CtsChangeFlag      = (USART_STAT_DELTACTS_MASK << 16U), /*!< CTS signal changed interrupt status. */\r\n    kUSART_BreakDetectFlag = (USART_STAT_RXBRK_MASK), /*!< Break detected. Self cleared when rx pin goes high again. */\r\n    kUSART_BreakDetectChangeFlag = (USART_STAT_DELTARXBRK_MASK), /*!< Break detect change interrupt flag. A change in\r\n                                                                    the state of receiver break detection. */\r\n    kUSART_RxStartFlag       = (USART_STAT_START_MASK),          /*!< Rx start bit detected interrupt flag. */\r\n    kUSART_FramingErrorFlag  = (USART_STAT_FRAMERRINT_MASK),     /*!< Framing error interrupt flag. */\r\n    kUSART_ParityErrorFlag   = (USART_STAT_PARITYERRINT_MASK),   /*!< parity error interrupt flag. */\r\n    kUSART_NoiseErrorFlag    = (USART_STAT_RXNOISEINT_MASK),     /*!< Noise error interrupt flag. */\r\n    kUSART_AutobaudErrorFlag = (USART_STAT_ABERR_MASK), /*!< Auto baudrate error interrupt flag, caused by the baudrate\r\n                                                           counter timeout before the end of start bit. */\r\n#if defined(FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG) && FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG\r\n    kUSART_RxTimeoutFlag = (USART_FIFOSTAT_RXTIMEOUT_MASK), /*!< RXTIMEOUT bit, sets if RX FIFO Timeout. */\r\n#endif\r\n    kUSART_AllClearFlags = kUSART_TxError | kUSART_RxError | kUSART_CtsChangeFlag | kUSART_BreakDetectChangeFlag |\r\n                           kUSART_RxStartFlag | kUSART_FramingErrorFlag | kUSART_ParityErrorFlag |\r\n#if defined(FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG) && FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG\r\n                           kUSART_RxTimeoutFlag |\r\n#endif\r\n                           kUSART_NoiseErrorFlag | kUSART_AutobaudErrorFlag,\r\n};\r\n\r\n#if defined(FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG) && FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG\r\n/*! @brief USART receive timeout configuration structure. */\r\ntypedef struct _usart_rx_timeout_config\r\n{\r\n    bool enable;                /*!< Enable RX timeout */\r\n    bool resetCounterOnEmpty;   /*!< Enable RX timeout counter reset when RX FIFO becames empty. */\r\n    bool resetCounterOnReceive; /*!< Enable RX timeout counter reset when RX FIFO receives data from the transmitter\r\n                                   side. */\r\n    uint32_t counter;           /*!< RX timeout counter*/\r\n    uint8_t prescaler;          /*!< RX timeout prescaler*/\r\n} usart_rx_timeout_config;\r\n#endif\r\n\r\n/*! @brief USART configuration structure. */\r\ntypedef struct _usart_config\r\n{\r\n    uint32_t baudRate_Bps;                /*!< USART baud rate  */\r\n    usart_parity_mode_t parityMode;       /*!< Parity mode, disabled (default), even, odd */\r\n    usart_stop_bit_count_t stopBitCount;  /*!< Number of stop bits, 1 stop bit (default) or 2 stop bits  */\r\n    usart_data_len_t bitCountPerChar;     /*!< Data length - 7 bit, 8 bit  */\r\n    bool loopback;                        /*!< Enable peripheral loopback */\r\n    bool enableRx;                        /*!< Enable RX */\r\n    bool enableTx;                        /*!< Enable TX */\r\n    bool enableContinuousSCLK;            /*!< USART continuous Clock generation enable in synchronous master mode. */\r\n    bool enableMode32k;                   /*!< USART uses 32 kHz clock from the RTC oscillator as the clock source. */\r\n    bool enableHardwareFlowControl;       /*!< Enable hardware control RTS/CTS */\r\n    usart_txfifo_watermark_t txWatermark; /*!< txFIFO watermark */\r\n    usart_rxfifo_watermark_t rxWatermark; /*!< rxFIFO watermark */\r\n    usart_sync_mode_t syncMode; /*!< Transfer mode select - asynchronous, synchronous master, synchronous slave. */\r\n    usart_clock_polarity_t clockPolarity; /*!< Selects the clock polarity and sampling edge in synchronous mode. */\r\n#if defined(FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG) && FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG\r\n    usart_rx_timeout_config rxTimeout; /*!< rx timeout configuration */\r\n#endif\r\n} usart_config_t;\r\n\r\n/*! @brief USART transfer structure. */\r\ntypedef struct _usart_transfer\r\n{\r\n    /*\r\n     * Use separate TX and RX data pointer, because TX data is const data.\r\n     * The member data is kept for backward compatibility.\r\n     */\r\n    union\r\n    {\r\n        uint8_t *data;         /*!< The buffer of data to be transfer.*/\r\n        uint8_t *rxData;       /*!< The buffer to receive data. */\r\n        const uint8_t *txData; /*!< The buffer of data to be sent. */\r\n    };\r\n    size_t dataSize; /*!< The byte count to be transfer. */\r\n} usart_transfer_t;\r\n\r\n/* Forward declaration of the handle typedef. */\r\ntypedef struct _usart_handle usart_handle_t;\r\n\r\n/*! @brief USART transfer callback function. */\r\ntypedef void (*usart_transfer_callback_t)(USART_Type *base, usart_handle_t *handle, status_t status, void *userData);\r\n\r\n/*! @brief USART handle structure. */\r\nstruct _usart_handle\r\n{\r\n    const uint8_t *volatile txData; /*!< Address of remaining data to send. */\r\n    volatile size_t txDataSize;     /*!< Size of the remaining data to send. */\r\n    size_t txDataSizeAll;           /*!< Size of the data to send out. */\r\n    uint8_t *volatile rxData;       /*!< Address of remaining data to receive. */\r\n    volatile size_t rxDataSize;     /*!< Size of the remaining data to receive. */\r\n    size_t rxDataSizeAll;           /*!< Size of the data to receive. */\r\n\r\n    uint8_t *rxRingBuffer;              /*!< Start address of the receiver ring buffer. */\r\n    size_t rxRingBufferSize;            /*!< Size of the ring buffer. */\r\n    volatile uint16_t rxRingBufferHead; /*!< Index for the driver to store received data into ring buffer. */\r\n    volatile uint16_t rxRingBufferTail; /*!< Index for the user to get data from the ring buffer. */\r\n\r\n    usart_transfer_callback_t callback; /*!< Callback function. */\r\n    void *userData;                     /*!< USART callback function parameter.*/\r\n\r\n    volatile uint8_t txState; /*!< TX transfer state. */\r\n    volatile uint8_t rxState; /*!< RX transfer state */\r\n\r\n    uint8_t txWatermark; /*!< txFIFO watermark */\r\n    uint8_t rxWatermark; /*!< rxFIFO watermark */\r\n};\r\n\r\n/*! @brief Typedef for usart interrupt handler. */\r\ntypedef void (*flexcomm_usart_irq_handler_t)(USART_Type *base, usart_handle_t *handle);\r\n\r\n/*******************************************************************************\r\n * API\r\n ******************************************************************************/\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif /* _cplusplus */\r\n\r\n/*! @brief Returns instance number for USART peripheral base address. */\r\nuint32_t USART_GetInstance(USART_Type *base);\r\n\r\n/*!\r\n * @name Initialization and deinitialization\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief Initializes a USART instance with user configuration structure and peripheral clock.\r\n *\r\n * This function configures the USART module with the user-defined settings. The user can configure the configuration\r\n * structure and also get the default configuration by using the USART_GetDefaultConfig() function.\r\n * Example below shows how to use this API to configure USART.\r\n * @code\r\n *  usart_config_t usartConfig;\r\n *  usartConfig.baudRate_Bps = 115200U;\r\n *  usartConfig.parityMode = kUSART_ParityDisabled;\r\n *  usartConfig.stopBitCount = kUSART_OneStopBit;\r\n *  USART_Init(USART1, &usartConfig, 20000000U);\r\n * @endcode\r\n *\r\n * @param base USART peripheral base address.\r\n * @param config Pointer to user-defined configuration structure.\r\n * @param srcClock_Hz USART clock source frequency in HZ.\r\n * @retval kStatus_USART_BaudrateNotSupport Baudrate is not support in current clock source.\r\n * @retval kStatus_InvalidArgument USART base address is not valid\r\n * @retval kStatus_Success Status USART initialize succeed\r\n */\r\nstatus_t USART_Init(USART_Type *base, const usart_config_t *config, uint32_t srcClock_Hz);\r\n#if defined(FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG) && FSL_FEATURE_USART_HAS_FIFORXTIMEOUTCFG\r\n/*!\r\n * @brief Calculate the USART instance RX timeout prescaler and counter.\r\n *\r\n * This function for calculate the USART RXFIFO timeout config. This function is used to calculate\r\n * suitable prescaler and counter for target_us.\r\n * @code\r\n *   usart_config_t config;\r\n *   config.rxWatermark                     = kUSART_RxFifo2;\r\n *   config.rxTimeout.enable                = true;\r\n *   config.rxTimeout.resetCounterOnEmpty   = true;\r\n *   config.rxTimeout.resetCounterOnReceive = true;\r\n *   USART_CalcTimeoutConfig(200U, &config.rxTimeout.prescaler, &config.rxTimeout.counter,\r\n *                                    CLOCK_GetFreq(kCLOCK_BusClk));\r\n * @endcode\r\n * @param target_us  Time for rx timeout unit us.\r\n * @param rxTimeoutPrescaler The prescaler to be setted after function.\r\n * @param rxTimeoutcounter The counter to be setted after function.\r\n * @param srcClock_Hz The clockSrc for rx timeout.\r\n */\r\nvoid USART_CalcTimeoutConfig(uint32_t target_us,\r\n                             uint8_t *rxTimeoutPrescaler,\r\n                             uint32_t *rxTimeoutcounter,\r\n                             uint32_t srcClock_Hz);\r\n/*!\r\n * @brief Sets the USART instance RX timeout config.\r\n *\r\n * This function configures the USART RXFIFO timeout config. This function is used to config\r\n * the USART RXFIFO timeout config after the USART module is initialized by the USART_Init.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param config pointer to receive timeout configuration structure.\r\n */\r\nvoid USART_SetRxTimeoutConfig(USART_Type *base, const usart_rx_timeout_config *config);\r\n#endif\r\n/*!\r\n * @brief Deinitializes a USART instance.\r\n *\r\n * This function waits for TX complete, disables TX and RX, and disables the USART clock.\r\n *\r\n * @param base USART peripheral base address.\r\n */\r\nvoid USART_Deinit(USART_Type *base);\r\n\r\n/*!\r\n * @brief Gets the default configuration structure.\r\n *\r\n * This function initializes the USART configuration structure to a default value. The default\r\n * values are:\r\n *   usartConfig->baudRate_Bps = 115200U;\r\n *   usartConfig->parityMode = kUSART_ParityDisabled;\r\n *   usartConfig->stopBitCount = kUSART_OneStopBit;\r\n *   usartConfig->bitCountPerChar = kUSART_8BitsPerChar;\r\n *   usartConfig->loopback = false;\r\n *   usartConfig->enableTx = false;\r\n *   usartConfig->enableRx = false;\r\n *\r\n * @param config Pointer to configuration structure.\r\n */\r\nvoid USART_GetDefaultConfig(usart_config_t *config);\r\n\r\n/*!\r\n * @brief Sets the USART instance baud rate.\r\n *\r\n * This function configures the USART module baud rate. This function is used to update\r\n * the USART module baud rate after the USART module is initialized by the USART_Init.\r\n * @code\r\n *  USART_SetBaudRate(USART1, 115200U, 20000000U);\r\n * @endcode\r\n *\r\n * @param base USART peripheral base address.\r\n * @param baudrate_Bps USART baudrate to be set.\r\n * @param srcClock_Hz USART clock source frequency in HZ.\r\n * @retval kStatus_USART_BaudrateNotSupport Baudrate is not support in current clock source.\r\n * @retval kStatus_Success Set baudrate succeed.\r\n * @retval kStatus_InvalidArgument One or more arguments are invalid.\r\n */\r\nstatus_t USART_SetBaudRate(USART_Type *base, uint32_t baudrate_Bps, uint32_t srcClock_Hz);\r\n\r\n/*!\r\n * @brief Enable 32 kHz mode which USART uses clock from the RTC oscillator as the clock source\r\n *\r\n * Please note that in order to use a 32 kHz clock to operate USART properly, the RTC oscillator\r\n * and its 32 kHz output must be manully enabled by user, by calling RTC_Init and setting\r\n * SYSCON_RTCOSCCTRL_EN bit to 1.\r\n * And in 32kHz clocking mode the USART can only work at 9600 baudrate or at the baudrate that\r\n * 9600 can evenly divide, eg: 4800, 3200.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param baudRate_Bps USART baudrate to be set..\r\n * @param enableMode32k true is 32k mode, false is normal mode.\r\n * @param srcClock_Hz USART clock source frequency in HZ.\r\n * @retval kStatus_USART_BaudrateNotSupport Baudrate is not support in current clock source.\r\n * @retval kStatus_Success Set baudrate succeed.\r\n * @retval kStatus_InvalidArgument One or more arguments are invalid.\r\n */\r\nstatus_t USART_Enable32kMode(USART_Type *base, uint32_t baudRate_Bps, bool enableMode32k, uint32_t srcClock_Hz);\r\n\r\n/*!\r\n * @brief Enable 9-bit data mode for USART.\r\n *\r\n * This function set the 9-bit mode for USART module. The 9th bit is not used for parity thus can be modified by user.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param enable true to enable, false to disable.\r\n */\r\nvoid USART_Enable9bitMode(USART_Type *base, bool enable);\r\n\r\n/*!\r\n * @brief Set the USART slave address.\r\n *\r\n * This function configures the address for USART module that works as slave in 9-bit data mode. When the address\r\n * detection is enabled, the frame it receices with MSB being 1 is considered as an address frame, otherwise it is\r\n * considered as data frame. Once the address frame matches slave's own addresses, this slave is addressed. This\r\n * address frame and its following data frames are stored in the receive buffer, otherwise the frames will be discarded.\r\n * To un-address a slave, just send an address frame with unmatched address.\r\n *\r\n * @note Any USART instance joined in the multi-slave system can work as slave. The position of the address mark is the\r\n * same as the parity bit when parity is enabled for 8 bit and 9 bit data formats.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param address USART slave address.\r\n */\r\nstatic inline void USART_SetMatchAddress(USART_Type *base, uint8_t address)\r\n{\r\n    /* Configure match address. */\r\n    base->ADDR = (uint32_t)address;\r\n}\r\n\r\n/*!\r\n * @brief Enable the USART match address feature.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param match true to enable match address, false to disable.\r\n */\r\nstatic inline void USART_EnableMatchAddress(USART_Type *base, bool match)\r\n{\r\n    /* Configure match address enable bit. */\r\n    if (match)\r\n    {\r\n        base->CFG |= (uint32_t)USART_CFG_AUTOADDR_MASK;\r\n        base->CTL |= (uint32_t)USART_CTL_ADDRDET_MASK;\r\n    }\r\n    else\r\n    {\r\n        base->CFG &= ~(uint32_t)USART_CFG_AUTOADDR_MASK;\r\n        base->CTL &= ~(uint32_t)USART_CTL_ADDRDET_MASK;\r\n    }\r\n}\r\n\r\n/*! @} */\r\n\r\n/*!\r\n * @name Status\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief Get USART status flags.\r\n *\r\n * This function get all USART status flags, the flags are returned as the logical\r\n * OR value of the enumerators @ref _usart_flags. To check a specific status,\r\n * compare the return value with enumerators in @ref _usart_flags.\r\n * For example, to check whether the TX is empty:\r\n * @code\r\n *     if (kUSART_TxFifoNotFullFlag & USART_GetStatusFlags(USART1))\r\n *     {\r\n *         ...\r\n *     }\r\n * @endcode\r\n *\r\n * @param base USART peripheral base address.\r\n * @return USART status flags which are ORed by the enumerators in the _usart_flags.\r\n */\r\nstatic inline uint32_t USART_GetStatusFlags(USART_Type *base)\r\n{\r\n    return (base->FIFOSTAT & 0xFF0000FFUL) | (base->STAT & 0xFFUL) << 16U | (base->STAT & 0xFFFF00UL);\r\n}\r\n\r\n/*!\r\n * @brief Clear USART status flags.\r\n *\r\n * This function clear supported USART status flags\r\n * Flags that can be cleared or set are:\r\n *      kUSART_TxError\r\n *      kUSART_RxError\r\n * For example:\r\n * @code\r\n *     USART_ClearStatusFlags(USART1, kUSART_TxError | kUSART_RxError)\r\n * @endcode\r\n *\r\n * @param base USART peripheral base address.\r\n * @param mask status flags to be cleared.\r\n */\r\nstatic inline void USART_ClearStatusFlags(USART_Type *base, uint32_t mask)\r\n{\r\n    mask &= (uint32_t)kUSART_AllClearFlags;\r\n    /* Clear the clearable status in STAT register. */\r\n    base->STAT = (mask & 0xFFFF00UL) | ((mask & 0xFF0000UL) >> 16U);\r\n    /* Only TXERR, RXERR fields support write. Remaining fields should be set to zero */\r\n    base->FIFOSTAT = mask & (USART_FIFOSTAT_TXERR_MASK | USART_FIFOSTAT_RXERR_MASK);\r\n}\r\n\r\n/*! @} */\r\n\r\n/*!\r\n * @name Interrupts\r\n * @{\r\n */\r\n/*!\r\n * @brief Enables USART interrupts according to the provided mask.\r\n *\r\n * This function enables the USART interrupts according to the provided mask. The mask\r\n * is a logical OR of enumeration members. See @ref _usart_interrupt_enable.\r\n * For example, to enable TX empty interrupt and RX full interrupt:\r\n * @code\r\n *     USART_EnableInterrupts(USART1, kUSART_TxLevelInterruptEnable | kUSART_RxLevelInterruptEnable);\r\n * @endcode\r\n *\r\n * @param base USART peripheral base address.\r\n * @param mask The interrupts to enable. Logical OR of @ref _usart_interrupt_enable.\r\n */\r\nstatic inline void USART_EnableInterrupts(USART_Type *base, uint32_t mask)\r\n{\r\n    mask &= (uint32_t)kUSART_AllInterruptEnables;\r\n    base->INTENSET     = (mask & 0x1FF00UL) | ((mask & 0xFF0000UL) >> 16U);\r\n    base->FIFOINTENSET = mask & 0xF00000FUL;\r\n}\r\n\r\n/*!\r\n * @brief Disables USART interrupts according to a provided mask.\r\n *\r\n * This function disables the USART interrupts according to a provided mask. The mask\r\n * is a logical OR of enumeration members. See @ref _usart_interrupt_enable.\r\n * This example shows how to disable the TX empty interrupt and RX full interrupt:\r\n * @code\r\n *     USART_DisableInterrupts(USART1, kUSART_TxLevelInterruptEnable | kUSART_RxLevelInterruptEnable);\r\n * @endcode\r\n *\r\n * @param base USART peripheral base address.\r\n * @param mask The interrupts to disable. Logical OR of @ref _usart_interrupt_enable.\r\n */\r\nstatic inline void USART_DisableInterrupts(USART_Type *base, uint32_t mask)\r\n{\r\n    mask &= (uint32_t)kUSART_AllInterruptEnables;\r\n    base->INTENCLR     = (mask & 0x1FF00UL) | ((mask & 0xFF0000UL) >> 16U);\r\n    base->FIFOINTENCLR = mask & 0xFUL;\r\n}\r\n\r\n/*!\r\n * @brief Returns enabled USART interrupts.\r\n *\r\n * This function returns the enabled USART interrupts.\r\n *\r\n * @param base USART peripheral base address.\r\n */\r\nstatic inline uint32_t USART_GetEnabledInterrupts(USART_Type *base)\r\n{\r\n    return (base->INTENSET & 0x1FF00UL) | ((base->INTENSET & 0xFFUL) << 16UL) | (base->FIFOINTENSET & 0xFUL);\r\n}\r\n\r\n/*!\r\n * @brief Enable DMA for Tx\r\n */\r\nstatic inline void USART_EnableTxDMA(USART_Type *base, bool enable)\r\n{\r\n    if (enable)\r\n    {\r\n        base->FIFOCFG |= USART_FIFOCFG_DMATX_MASK;\r\n    }\r\n    else\r\n    {\r\n        base->FIFOCFG &= ~(USART_FIFOCFG_DMATX_MASK);\r\n    }\r\n}\r\n\r\n/*!\r\n * @brief Enable DMA for Rx\r\n */\r\nstatic inline void USART_EnableRxDMA(USART_Type *base, bool enable)\r\n{\r\n    if (enable)\r\n    {\r\n        base->FIFOCFG |= USART_FIFOCFG_DMARX_MASK;\r\n    }\r\n    else\r\n    {\r\n        base->FIFOCFG &= ~(USART_FIFOCFG_DMARX_MASK);\r\n    }\r\n}\r\n\r\n/*!\r\n * @brief Enable CTS.\r\n * This function will determine whether CTS is used for flow control.\r\n *\r\n * @param base    USART peripheral base address.\r\n * @param enable  Enable CTS or not, true for enable and false for disable.\r\n */\r\nstatic inline void USART_EnableCTS(USART_Type *base, bool enable)\r\n{\r\n    if (enable)\r\n    {\r\n        base->CFG |= USART_CFG_CTSEN_MASK;\r\n    }\r\n    else\r\n    {\r\n        base->CFG &= ~USART_CFG_CTSEN_MASK;\r\n    }\r\n}\r\n\r\n/*!\r\n * @brief Continuous Clock generation.\r\n * By default, SCLK is only output while data is being transmitted in synchronous mode.\r\n * Enable this funciton, SCLK will run continuously in synchronous mode, allowing\r\n * characters to be received on Un_RxD independently from transmission on Un_TXD).\r\n *\r\n * @param base    USART peripheral base address.\r\n * @param enable  Enable Continuous Clock generation mode or not, true for enable and false for disable.\r\n */\r\nstatic inline void USART_EnableContinuousSCLK(USART_Type *base, bool enable)\r\n{\r\n    if (enable)\r\n    {\r\n        base->CTL |= USART_CTL_CC_MASK;\r\n    }\r\n    else\r\n    {\r\n        base->CTL &= ~USART_CTL_CC_MASK;\r\n    }\r\n}\r\n\r\n/*!\r\n * @brief Enable Continuous Clock generation bit auto clear.\r\n * While enable this cuntion, the Continuous Clock bit is automatically cleared when a complete\r\n * character has been received. This bit is cleared at the same time.\r\n *\r\n * @param base    USART peripheral base address.\r\n * @param enable  Enable auto clear or not, true for enable and false for disable.\r\n */\r\nstatic inline void USART_EnableAutoClearSCLK(USART_Type *base, bool enable)\r\n{\r\n    if (enable)\r\n    {\r\n        base->CTL |= USART_CTL_CLRCCONRX_MASK;\r\n    }\r\n    else\r\n    {\r\n        base->CTL &= ~USART_CTL_CLRCCONRX_MASK;\r\n    }\r\n}\r\n\r\n/*!\r\n * @brief Sets the rx FIFO watermark.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param water Rx FIFO watermark.\r\n */\r\nstatic inline void USART_SetRxFifoWatermark(USART_Type *base, uint8_t water)\r\n{\r\n    assert(water <= (USART_FIFOTRIG_RXLVL_MASK >> USART_FIFOTRIG_RXLVL_SHIFT));\r\n    base->FIFOTRIG = (base->FIFOTRIG & ~USART_FIFOTRIG_RXLVL_MASK) | USART_FIFOTRIG_RXLVL(water);\r\n}\r\n\r\n/*!\r\n * @brief Sets the tx FIFO watermark.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param water Tx FIFO watermark.\r\n */\r\nstatic inline void USART_SetTxFifoWatermark(USART_Type *base, uint8_t water)\r\n{\r\n    assert(water <= (USART_FIFOTRIG_TXLVL_MASK >> USART_FIFOTRIG_TXLVL_SHIFT));\r\n    base->FIFOTRIG = (base->FIFOTRIG & ~USART_FIFOTRIG_TXLVL_MASK) | USART_FIFOTRIG_TXLVL(water);\r\n}\r\n/*! @} */\r\n\r\n/*!\r\n * @name Bus Operations\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief Writes to the FIFOWR register.\r\n *\r\n * This function writes data to the txFIFO directly. The upper layer must ensure\r\n * that txFIFO has space for data to write before calling this function.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param data The byte to write.\r\n */\r\nstatic inline void USART_WriteByte(USART_Type *base, uint8_t data)\r\n{\r\n    base->FIFOWR = data;\r\n}\r\n\r\n/*!\r\n * @brief Reads the FIFORD register directly.\r\n *\r\n * This function reads data from the rxFIFO directly. The upper layer must\r\n * ensure that the rxFIFO is not empty before calling this function.\r\n *\r\n * @param base USART peripheral base address.\r\n * @return The byte read from USART data register.\r\n */\r\nstatic inline uint8_t USART_ReadByte(USART_Type *base)\r\n{\r\n    return (uint8_t)base->FIFORD;\r\n}\r\n\r\n/*!\r\n * @brief Gets the rx FIFO data count.\r\n *\r\n * @param base USART peripheral base address.\r\n * @return rx FIFO data count.\r\n */\r\nstatic inline uint8_t USART_GetRxFifoCount(USART_Type *base)\r\n{\r\n    return (uint8_t)((base->FIFOSTAT & USART_FIFOSTAT_RXLVL_MASK) >> USART_FIFOSTAT_RXLVL_SHIFT);\r\n}\r\n\r\n/*!\r\n * @brief Gets the tx FIFO data count.\r\n *\r\n * @param base USART peripheral base address.\r\n * @return tx FIFO data count.\r\n */\r\nstatic inline uint8_t USART_GetTxFifoCount(USART_Type *base)\r\n{\r\n    return (uint8_t)((base->FIFOSTAT & USART_FIFOSTAT_TXLVL_MASK) >> USART_FIFOSTAT_TXLVL_SHIFT);\r\n}\r\n\r\n/*!\r\n * @brief Transmit an address frame in 9-bit data mode.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param address USART slave address.\r\n */\r\nvoid USART_SendAddress(USART_Type *base, uint8_t address);\r\n\r\n/*!\r\n * @brief Writes to the TX register using a blocking method.\r\n *\r\n * This function polls the TX register, waits for the TX register to be empty or for the TX FIFO\r\n * to have room and writes data to the TX buffer.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param data Start address of the data to write.\r\n * @param length Size of the data to write.\r\n * @retval kStatus_USART_Timeout Transmission timed out and was aborted.\r\n * @retval kStatus_InvalidArgument Invalid argument.\r\n * @retval kStatus_Success Successfully wrote all data.\r\n */\r\nstatus_t USART_WriteBlocking(USART_Type *base, const uint8_t *data, size_t length);\r\n\r\n/*!\r\n * @brief Read RX data register using a blocking method.\r\n *\r\n * This function polls the RX register, waits for the RX register to be full or for RX FIFO to\r\n * have data and read data from the TX register.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param data Start address of the buffer to store the received data.\r\n * @param length Size of the buffer.\r\n * @retval kStatus_USART_FramingError Receiver overrun happened while receiving data.\r\n * @retval kStatus_USART_ParityError Noise error happened while receiving data.\r\n * @retval kStatus_USART_NoiseError Framing error happened while receiving data.\r\n * @retval kStatus_USART_RxError Overflow or underflow rxFIFO happened.\r\n * @retval kStatus_USART_Timeout Transmission timed out and was aborted.\r\n * @retval kStatus_Success Successfully received all data.\r\n */\r\nstatus_t USART_ReadBlocking(USART_Type *base, uint8_t *data, size_t length);\r\n\r\n/*! @} */\r\n\r\n/*!\r\n * @name Transactional\r\n * @{\r\n */\r\n\r\n/*!\r\n * @brief Initializes the USART handle.\r\n *\r\n * This function initializes the USART handle which can be used for other USART\r\n * transactional APIs. Usually, for a specified USART instance,\r\n * call this API once to get the initialized handle.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param handle USART handle pointer.\r\n * @param callback The callback function.\r\n * @param userData The parameter of the callback function.\r\n */\r\nstatus_t USART_TransferCreateHandle(USART_Type *base,\r\n                                    usart_handle_t *handle,\r\n                                    usart_transfer_callback_t callback,\r\n                                    void *userData);\r\n\r\n/*!\r\n * @brief Transmits a buffer of data using the interrupt method.\r\n *\r\n * This function sends data using an interrupt method. This is a non-blocking function, which\r\n * returns directly without waiting for all data to be written to the TX register. When\r\n * all data is written to the TX register in the IRQ handler, the USART driver calls the callback\r\n * function and passes the @ref kStatus_USART_TxIdle as status parameter.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param handle USART handle pointer.\r\n * @param xfer USART transfer structure. See  #usart_transfer_t.\r\n * @retval kStatus_Success Successfully start the data transmission.\r\n * @retval kStatus_USART_TxBusy Previous transmission still not finished, data not all written to TX register yet.\r\n * @retval kStatus_InvalidArgument Invalid argument.\r\n */\r\nstatus_t USART_TransferSendNonBlocking(USART_Type *base, usart_handle_t *handle, usart_transfer_t *xfer);\r\n\r\n/*!\r\n * @brief Sets up the RX ring buffer.\r\n *\r\n * This function sets up the RX ring buffer to a specific USART handle.\r\n *\r\n * When the RX ring buffer is used, data received are stored into the ring buffer even when the\r\n * user doesn't call the USART_TransferReceiveNonBlocking() API. If there is already data received\r\n * in the ring buffer, the user can get the received data from the ring buffer directly.\r\n *\r\n * @note When using the RX ring buffer, one byte is reserved for internal use. In other\r\n * words, if @p ringBufferSize is 32, then only 31 bytes are used for saving data.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param handle USART handle pointer.\r\n * @param ringBuffer Start address of the ring buffer for background receiving. Pass NULL to disable the ring buffer.\r\n * @param ringBufferSize size of the ring buffer.\r\n */\r\nvoid USART_TransferStartRingBuffer(USART_Type *base,\r\n                                   usart_handle_t *handle,\r\n                                   uint8_t *ringBuffer,\r\n                                   size_t ringBufferSize);\r\n\r\n/*!\r\n * @brief Aborts the background transfer and uninstalls the ring buffer.\r\n *\r\n * This function aborts the background transfer and uninstalls the ring buffer.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param handle USART handle pointer.\r\n */\r\nvoid USART_TransferStopRingBuffer(USART_Type *base, usart_handle_t *handle);\r\n\r\n/*!\r\n * @brief Get the length of received data in RX ring buffer.\r\n *\r\n * @param handle USART handle pointer.\r\n * @return Length of received data in RX ring buffer.\r\n */\r\nsize_t USART_TransferGetRxRingBufferLength(usart_handle_t *handle);\r\n\r\n/*!\r\n * @brief Aborts the interrupt-driven data transmit.\r\n *\r\n * This function aborts the interrupt driven data sending. The user can get the remainBtyes to find out\r\n * how many bytes are still not sent out.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param handle USART handle pointer.\r\n */\r\nvoid USART_TransferAbortSend(USART_Type *base, usart_handle_t *handle);\r\n\r\n/*!\r\n * @brief Get the number of bytes that have been sent out to bus.\r\n *\r\n * This function gets the number of bytes that have been sent out to bus by interrupt method.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param handle USART handle pointer.\r\n * @param count Send bytes count.\r\n * @retval kStatus_NoTransferInProgress No send in progress.\r\n * @retval kStatus_InvalidArgument Parameter is invalid.\r\n * @retval kStatus_Success Get successfully through the parameter \\p count;\r\n */\r\nstatus_t USART_TransferGetSendCount(USART_Type *base, usart_handle_t *handle, uint32_t *count);\r\n\r\n/*!\r\n * @brief Receives a buffer of data using an interrupt method.\r\n *\r\n * This function receives data using an interrupt method. This is a non-blocking function, which\r\n *  returns without waiting for all data to be received.\r\n * If the RX ring buffer is used and not empty, the data in the ring buffer is copied and\r\n * the parameter @p receivedBytes shows how many bytes are copied from the ring buffer.\r\n * After copying, if the data in the ring buffer is not enough to read, the receive\r\n * request is saved by the USART driver. When the new data arrives, the receive request\r\n * is serviced first. When all data is received, the USART driver notifies the upper layer\r\n * through a callback function and passes the status parameter @ref kStatus_USART_RxIdle.\r\n * For example, the upper layer needs 10 bytes but there are only 5 bytes in the ring buffer.\r\n * The 5 bytes are copied to the xfer->data and this function returns with the\r\n * parameter @p receivedBytes set to 5. For the left 5 bytes, newly arrived data is\r\n * saved from the xfer->data[5]. When 5 bytes are received, the USART driver notifies the upper layer.\r\n * If the RX ring buffer is not enabled, this function enables the RX and RX interrupt\r\n * to receive data to the xfer->data. When all data is received, the upper layer is notified.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param handle USART handle pointer.\r\n * @param xfer USART transfer structure, see #usart_transfer_t.\r\n * @param receivedBytes Bytes received from the ring buffer directly.\r\n * @retval kStatus_Success Successfully queue the transfer into transmit queue.\r\n * @retval kStatus_USART_RxBusy Previous receive request is not finished.\r\n * @retval kStatus_InvalidArgument Invalid argument.\r\n */\r\nstatus_t USART_TransferReceiveNonBlocking(USART_Type *base,\r\n                                          usart_handle_t *handle,\r\n                                          usart_transfer_t *xfer,\r\n                                          size_t *receivedBytes);\r\n\r\n/*!\r\n * @brief Aborts the interrupt-driven data receiving.\r\n *\r\n * This function aborts the interrupt-driven data receiving. The user can get the remainBytes to find out\r\n * how many bytes not received yet.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param handle USART handle pointer.\r\n */\r\nvoid USART_TransferAbortReceive(USART_Type *base, usart_handle_t *handle);\r\n\r\n/*!\r\n * @brief Get the number of bytes that have been received.\r\n *\r\n * This function gets the number of bytes that have been received.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param handle USART handle pointer.\r\n * @param count Receive bytes count.\r\n * @retval kStatus_NoTransferInProgress No receive in progress.\r\n * @retval kStatus_InvalidArgument Parameter is invalid.\r\n * @retval kStatus_Success Get successfully through the parameter \\p count;\r\n */\r\nstatus_t USART_TransferGetReceiveCount(USART_Type *base, usart_handle_t *handle, uint32_t *count);\r\n\r\n/*!\r\n * @brief USART IRQ handle function.\r\n *\r\n * This function handles the USART transmit and receive IRQ request.\r\n *\r\n * @param base USART peripheral base address.\r\n * @param handle USART handle pointer.\r\n */\r\nvoid USART_TransferHandleIRQ(USART_Type *base, usart_handle_t *handle);\r\n\r\n/*! @} */\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n/*! @}*/\r\n\r\n#endif /* FSL_USART_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/flash/mflash/frdmrw612/mflash_drv.c",
    "content": "/*\r\n * Copyright 2017-2022, 2024 NXP\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include <stdbool.h>\r\n\r\n#include \"mflash_drv.h\"\r\n#include \"fsl_flexspi.h\"\r\n#include \"fsl_cache.h\"\r\n\r\n#define FLASH_PORT kFLEXSPI_PortA1\r\n\r\n#define NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD     0\r\n#define NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG     1\r\n#define NOR_CMD_LUT_SEQ_IDX_WRITEENABLE        2\r\n#define NOR_CMD_LUT_SEQ_IDX_ERASESECTOR        3\r\n#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD   4\r\n#define NOR_CMD_LUT_SEQ_IDX_ERASECHIP          5\r\n#define NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_SINGLE 6\r\n#define NOR_CMD_LUT_SEQ_IDX_READ_NORMAL        7\r\n#define NOR_CMD_LUT_SEQ_IDX_READID             8\r\n#define NOR_CMD_LUT_SEQ_IDX_WRITE              9\r\n#define NOR_CMD_LUT_SEQ_IDX_ENTERQPI           10\r\n#define NOR_CMD_LUT_SEQ_IDX_EXITQPI            11\r\n#define NOR_CMD_LUT_SEQ_IDX_READSTATUSREG      12\r\n#define NOR_CMD_LUT_SEQ_IDX_READ_FAST          13\r\n\r\n#define CUSTOM_LUT_LENGTH        60\r\n#define FLASH_QUAD_ENABLE        0x2\r\n#define FLASH_BUSY_STATUS_POL    1\r\n#define FLASH_BUSY_STATUS_OFFSET 0\r\n\r\nstatic flexspi_device_config_t deviceconfig = {\r\n    .flexspiRootClk       = 130000000U,\r\n    .flashSize            = FLASH_SIZE / 1024, /* flash size in KB */\r\n    .CSIntervalUnit       = kFLEXSPI_CsIntervalUnit1SckCycle,\r\n    .CSInterval           = 2,\r\n    .CSHoldTime           = 3,\r\n    .CSSetupTime          = 3,\r\n    .dataValidTime        = 0,\r\n    .columnspace          = 0,\r\n    .enableWordAddress    = 0,\r\n    .AWRSeqIndex          = NOR_CMD_LUT_SEQ_IDX_WRITE,\r\n    .AWRSeqNumber         = 1,\r\n    .ARDSeqIndex          = NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD,\r\n    .ARDSeqNumber         = 1,\r\n    .AHBWriteWaitUnit     = kFLEXSPI_AhbWriteWaitUnit2AhbCycle,\r\n    .AHBWriteWaitInterval = 0,\r\n};\r\n\r\nstatic uint32_t customLUT[CUSTOM_LUT_LENGTH] = {\r\n    /* Normal read mode -SDR */\r\n    [4 * NOR_CMD_LUT_SEQ_IDX_READ_NORMAL] =\r\n        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x13, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x20),\r\n    [4 * NOR_CMD_LUT_SEQ_IDX_READ_NORMAL + 1] =\r\n        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),\r\n\r\n    /* Fast read mode - SDR */\r\n    [4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST] =\r\n        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x0C, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x20),\r\n    [4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST + 1] = FLEXSPI_LUT_SEQ(\r\n        kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_1PAD, 0x08, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04),\r\n\r\n    /* Fast read quad mode - SDR */\r\n    [4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD] =\r\n        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xEC, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 0x20),\r\n    [4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD + 1] = FLEXSPI_LUT_SEQ(\r\n        kFLEXSPI_Command_MODE8_SDR, kFLEXSPI_4PAD, 0xF0, kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_4PAD, 0x04),\r\n    [4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD + 2] =\r\n        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_SDR, kFLEXSPI_4PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x00),\r\n\r\n    /* Write Enable */\r\n    [4 * NOR_CMD_LUT_SEQ_IDX_WRITEENABLE] =\r\n        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x06, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),\r\n\r\n    /* Erase Sector  */\r\n    [4 * NOR_CMD_LUT_SEQ_IDX_ERASESECTOR] =\r\n        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x21, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x20),\r\n\r\n    /* Page Program - single mode */\r\n    [4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_SINGLE] =\r\n        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x12, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x20),\r\n    [4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_SINGLE + 1] =\r\n        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),\r\n\r\n    /* Page Program - quad mode */\r\n    [4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD] =\r\n        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x34, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x20),\r\n    [4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD + 1] =\r\n        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_4PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),\r\n\r\n    /* Read ID */\r\n    [4 * NOR_CMD_LUT_SEQ_IDX_READID] =\r\n        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x9F, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04),\r\n\r\n    /* Enable Quad mode */\r\n    [4 * NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG] =\r\n        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x31, kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x01),\r\n\r\n    /*  Dummy write, do nothing when AHB write command is triggered. */\r\n    [4 * NOR_CMD_LUT_SEQ_IDX_WRITE] =\r\n        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0x0),\r\n\r\n    /* Read status register */\r\n    [4 * NOR_CMD_LUT_SEQ_IDX_READSTATUSREG] =\r\n        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x05, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04),\r\n\r\n    /* Erase whole chip */\r\n    [4 * NOR_CMD_LUT_SEQ_IDX_ERASECHIP] =\r\n        FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xC7, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),\r\n};\r\n\r\nstatic status_t flexspi_nor_wait_bus_busy(FLEXSPI_Type *base)\r\n{\r\n    /* Wait status ready. */\r\n    bool isBusy;\r\n    uint32_t readValue;\r\n    status_t status;\r\n    flexspi_transfer_t flashXfer;\r\n    bool busyStatus = (bool)FLASH_BUSY_STATUS_POL;\r\n\r\n    flashXfer.deviceAddress = 0;\r\n    flashXfer.port          = FLASH_PORT;\r\n    flashXfer.cmdType       = kFLEXSPI_Read;\r\n    flashXfer.SeqNumber     = 1;\r\n    flashXfer.seqIndex      = NOR_CMD_LUT_SEQ_IDX_READSTATUSREG;\r\n    flashXfer.data          = &readValue;\r\n    flashXfer.dataSize      = 1;\r\n\r\n    do\r\n    {\r\n        status = FLEXSPI_TransferBlocking(base, &flashXfer);\r\n\r\n        if (status != kStatus_Success)\r\n        {\r\n            return status;\r\n        }\r\n        if (busyStatus)\r\n        {\r\n            if ((readValue & (1U << FLASH_BUSY_STATUS_OFFSET)) > 0U)\r\n            {\r\n                isBusy = true;\r\n            }\r\n            else\r\n            {\r\n                isBusy = false;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            if ((readValue & (1U << FLASH_BUSY_STATUS_OFFSET)) > 0U)\r\n            {\r\n                isBusy = false;\r\n            }\r\n            else\r\n            {\r\n                isBusy = true;\r\n            }\r\n        }\r\n\r\n    } while (isBusy);\r\n\r\n    return status;\r\n}\r\n\r\nstatic status_t flexspi_nor_write_enable(FLEXSPI_Type *base, uint32_t baseAddr)\r\n{\r\n    flexspi_transfer_t flashXfer;\r\n    status_t status;\r\n\r\n    /* Write enable */\r\n    flashXfer.deviceAddress = baseAddr;\r\n    flashXfer.port          = FLASH_PORT;\r\n    flashXfer.cmdType       = kFLEXSPI_Command;\r\n    flashXfer.SeqNumber     = 1;\r\n    flashXfer.seqIndex      = NOR_CMD_LUT_SEQ_IDX_WRITEENABLE;\r\n\r\n    status = FLEXSPI_TransferBlocking(base, &flashXfer);\r\n\r\n    return status;\r\n}\r\n\r\nstatic status_t flexspi_nor_enable_quad_mode(FLEXSPI_Type *base)\r\n{\r\n    flexspi_transfer_t flashXfer;\r\n    status_t status;\r\n    uint32_t writeValue = FLASH_QUAD_ENABLE;\r\n\r\n    /* Write enable */\r\n    status = flexspi_nor_write_enable(base, 0);\r\n\r\n    if (status != kStatus_Success)\r\n    {\r\n        return status;\r\n    }\r\n\r\n    /* Enable quad mode. */\r\n    flashXfer.deviceAddress = 0;\r\n    flashXfer.port          = FLASH_PORT;\r\n    flashXfer.cmdType       = kFLEXSPI_Write;\r\n    flashXfer.SeqNumber     = 1;\r\n    flashXfer.seqIndex      = NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG;\r\n    flashXfer.data          = &writeValue;\r\n    flashXfer.dataSize      = 1;\r\n\r\n    status = FLEXSPI_TransferBlocking(base, &flashXfer);\r\n    if (status != kStatus_Success)\r\n    {\r\n        return status;\r\n    }\r\n\r\n    status = flexspi_nor_wait_bus_busy(base);\r\n\r\n    /* Do software reset. */\r\n    FLEXSPI_SoftwareReset(base);\r\n\r\n    return status;\r\n}\r\n\r\n/* Internal - erase single sector */\r\nstatic status_t flexspi_nor_flash_sector_erase(FLEXSPI_Type *base, uint32_t address)\r\n{\r\n    status_t status;\r\n    flexspi_transfer_t flashXfer;\r\n\r\n    /* Write enable */\r\n    flashXfer.deviceAddress = address;\r\n    flashXfer.port          = FLASH_PORT;\r\n    flashXfer.cmdType       = kFLEXSPI_Command;\r\n    flashXfer.SeqNumber     = 1;\r\n    flashXfer.seqIndex      = NOR_CMD_LUT_SEQ_IDX_WRITEENABLE;\r\n\r\n    status = FLEXSPI_TransferBlocking(base, &flashXfer);\r\n\r\n    if (status != kStatus_Success)\r\n    {\r\n        return status;\r\n    }\r\n\r\n    flashXfer.deviceAddress = address;\r\n    flashXfer.port          = FLASH_PORT;\r\n    flashXfer.cmdType       = kFLEXSPI_Command;\r\n    flashXfer.SeqNumber     = 1;\r\n    flashXfer.seqIndex      = NOR_CMD_LUT_SEQ_IDX_ERASESECTOR;\r\n    status                  = FLEXSPI_TransferBlocking(base, &flashXfer);\r\n\r\n    if (status != kStatus_Success)\r\n    {\r\n        return status;\r\n    }\r\n\r\n    status = flexspi_nor_wait_bus_busy(base);\r\n\r\n    /* Do software reset. */\r\n    FLEXSPI_SoftwareReset(base);\r\n\r\n    return status;\r\n}\r\n\r\nstatic status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t dstAddr, const uint32_t *src)\r\n{\r\n    status_t status;\r\n    flexspi_transfer_t flashXfer;\r\n\r\n    /* To make sure external flash be in idle status, added wait for busy before program data for\r\n        an external flash without RWW(read while write) attribute.*/\r\n    status = flexspi_nor_wait_bus_busy(base);\r\n\r\n    if (kStatus_Success != status)\r\n    {\r\n        return status;\r\n    }\r\n\r\n    /* Write enable. */\r\n    status = flexspi_nor_write_enable(base, dstAddr);\r\n\r\n    if (status != kStatus_Success)\r\n    {\r\n        return status;\r\n    }\r\n\r\n    /* Prepare page program command */\r\n    flashXfer.deviceAddress = dstAddr;\r\n    flashXfer.port          = FLASH_PORT;\r\n    flashXfer.cmdType       = kFLEXSPI_Write;\r\n    flashXfer.SeqNumber     = 1;\r\n    flashXfer.seqIndex      = NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD;\r\n    flashXfer.data          = (uint32_t *)(uintptr_t)src;\r\n    flashXfer.dataSize      = MFLASH_PAGE_SIZE;\r\n    status                  = FLEXSPI_TransferBlocking(base, &flashXfer);\r\n\r\n    if (status != kStatus_Success)\r\n    {\r\n        return status;\r\n    }\r\n\r\n    status = flexspi_nor_wait_bus_busy(base);\r\n\r\n    /* Do software reset or clear AHB buffer directly. */\r\n#if defined(FSL_FEATURE_SOC_OTFAD_COUNT) && defined(FLEXSPI_AHBCR_CLRAHBRXBUF_MASK) && \\\r\n    defined(FLEXSPI_AHBCR_CLRAHBTXBUF_MASK)\r\n    base->AHBCR |= FLEXSPI_AHBCR_CLRAHBRXBUF_MASK | FLEXSPI_AHBCR_CLRAHBTXBUF_MASK;\r\n    base->AHBCR &= ~(FLEXSPI_AHBCR_CLRAHBRXBUF_MASK | FLEXSPI_AHBCR_CLRAHBTXBUF_MASK);\r\n#else\r\n    FLEXSPI_SoftwareReset(base);\r\n#endif\r\n\r\n    return status;\r\n}\r\n\r\nstatic status_t flexspi_nor_read_data(FLEXSPI_Type *base, uint32_t startAddress, uint32_t *buffer, uint32_t length)\r\n{\r\n    status_t status;\r\n    flexspi_transfer_t flashXfer;\r\n    uint32_t readAddress = startAddress;\r\n\r\n    /* Read page. */\r\n    flashXfer.deviceAddress = readAddress;\r\n    flashXfer.port          = FLASH_PORT;\r\n    flashXfer.cmdType       = kFLEXSPI_Read;\r\n    flashXfer.SeqNumber     = 1;\r\n    flashXfer.seqIndex      = NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD;\r\n    flashXfer.data          = buffer;\r\n    flashXfer.dataSize      = length;\r\n\r\n    status = FLEXSPI_TransferBlocking(base, &flashXfer);\r\n    \r\n    if(status == kStatus_Success)\r\n    {\r\n      status = flexspi_nor_wait_bus_busy(base);\r\n    }\r\n\r\n    return status;\r\n}\r\n\r\nstatic int32_t mflash_drv_init_internal(void)\r\n{\r\n    uint32_t primask = __get_PRIMASK();\r\n    flexspi_config_t config;\r\n\r\n    __asm(\"cpsid i\");\r\n\r\n    /*Get FLEXSPI default settings and configure the flexspi. */\r\n    FLEXSPI_GetDefaultConfig(&config);\r\n\r\n    /*Set AHB buffer size for reading data through AHB bus. */\r\n    config.ahbConfig.enableAHBPrefetch = true;\r\n    config.rxSampleClock               = kFLEXSPI_ReadSampleClkLoopbackFromDqsPad;\r\n#if !(defined(FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_COMBINATIONEN) && FSL_FEATURE_FLEXSPI_HAS_NO_MCR0_COMBINATIONEN)\r\n    config.enableCombination = true;\r\n#endif\r\n    config.ahbConfig.enableAHBBufferable = true;\r\n    config.ahbConfig.enableAHBCachable   = true;\r\n    FLEXSPI_Init(MFLASH_FLEXSPI, &config);\r\n\r\n    /* Configure flash settings according to serial flash feature. */\r\n    FLEXSPI_SetFlashConfig(MFLASH_FLEXSPI, &deviceconfig, FLASH_PORT);\r\n\r\n    /* Update LUT table. */\r\n    FLEXSPI_UpdateLUT(MFLASH_FLEXSPI, 0, customLUT, CUSTOM_LUT_LENGTH);\r\n\r\n    (void)flexspi_nor_enable_quad_mode(MFLASH_FLEXSPI);\r\n\r\n    /* Invalidate cache. */\r\n    do\r\n    {\r\n        CACHE64_CTRL0->CCR |= CACHE64_CTRL_CCR_INVW0_MASK | CACHE64_CTRL_CCR_INVW1_MASK | CACHE64_CTRL_CCR_GO_MASK;\r\n        while ((CACHE64_CTRL0->CCR & CACHE64_CTRL_CCR_GO_MASK) != 0U)\r\n        {\r\n        }\r\n        CACHE64_CTRL0->CCR &= ~(CACHE64_CTRL_CCR_INVW0_MASK | CACHE64_CTRL_CCR_INVW1_MASK);\r\n    } while (false);\r\n\r\n    if (primask == 0U)\r\n    {\r\n        __asm(\"cpsie i\");\r\n    }\r\n\r\n    return kStatus_Success;\r\n}\r\n\r\n/* API - initialize 'mflash' */\r\nint32_t mflash_drv_init(void)\r\n{\r\n    /* Necessary to have double wrapper call in non_xip memory */\r\n    return mflash_drv_init_internal();\r\n}\r\n\r\n/* Internal - erase single sector */\r\nstatic int32_t mflash_drv_sector_erase_internal(uint32_t sector_addr)\r\n{\r\n    status_t status;\r\n    uint32_t primask = __get_PRIMASK();\r\n\r\n    __asm(\"cpsid i\");\r\n\r\n    status = flexspi_nor_flash_sector_erase(MFLASH_FLEXSPI, sector_addr);\r\n\r\n    DCACHE_InvalidateByRange(MFLASH_BASE_ADDRESS + sector_addr, MFLASH_SECTOR_SIZE);\r\n\r\n    if (primask == 0U)\r\n    {\r\n        __asm(\"cpsie i\");\r\n    }\r\n\r\n    /* Flush pipeline to allow pending interrupts take place\r\n     * before starting next loop */\r\n    __ISB();\r\n\r\n    return status;\r\n}\r\n\r\n/* Calling wrapper for 'mflash_drv_sector_erase_internal'.\r\n * Erase one sector starting at 'sector_addr' - must be sector aligned.\r\n */\r\nint32_t mflash_drv_sector_erase(uint32_t sector_addr)\r\n{\r\n    if (0 == mflash_drv_is_sector_aligned(sector_addr))\r\n        return kStatus_InvalidArgument;\r\n\r\n    return mflash_drv_sector_erase_internal(sector_addr);\r\n}\r\n\r\n/* Internal - write single page */\r\nstatic int32_t mflash_drv_page_program_internal(uint32_t page_addr, uint32_t *data)\r\n{\r\n    uint32_t primask = __get_PRIMASK();\r\n\r\n    __asm(\"cpsid i\");\r\n\r\n    status_t status;\r\n    status = flexspi_nor_flash_page_program(MFLASH_FLEXSPI, page_addr, data);\r\n\r\n    /* Do software reset. */\r\n    // FLEXSPI_SoftwareReset(MFLASH_FLEXSPI);\r\n\r\n    DCACHE_InvalidateByRange(MFLASH_BASE_ADDRESS + page_addr, MFLASH_PAGE_SIZE);\r\n\r\n    if (primask == 0U)\r\n    {\r\n        __asm(\"cpsie i\");\r\n    }\r\n\r\n    /* Flush pipeline to allow pending interrupts take place\r\n     * before starting next loop */\r\n    __ISB();\r\n\r\n    return status;\r\n}\r\n\r\n/* Internal - read data */\r\nstatic int32_t mflash_drv_read_internal(uint32_t addr, uint32_t *buffer, uint32_t len)\r\n{\r\n    uint32_t primask = __get_PRIMASK();\r\n\r\n    __asm(\"cpsid i\");\r\n\r\n    status_t status;\r\n    status = flexspi_nor_read_data(MFLASH_FLEXSPI, addr, buffer, len);\r\n\r\n    /* Do software reset. */\r\n    FLEXSPI_SoftwareReset(MFLASH_FLEXSPI);\r\n\r\n    if (primask == 0)\r\n    {\r\n        __asm(\"cpsie i\");\r\n    }\r\n\r\n    /* Flush pipeline to allow pending interrupts take place\r\n     * before starting next loop */\r\n    __ISB();\r\n\r\n    return status;\r\n}\r\n\r\n/* Calling wrapper for 'mflash_drv_page_program_internal'.\r\n * Write 'data' to 'page_addr' - must be page aligned.\r\n * NOTE: Don't try to store constant data that are located in XIP !!\r\n */\r\nint32_t mflash_drv_page_program(uint32_t page_addr, uint32_t *data)\r\n{\r\n    if (0 == mflash_drv_is_page_aligned(page_addr))\r\n        return kStatus_InvalidArgument;\r\n\r\n    return mflash_drv_page_program_internal(page_addr, data);\r\n}\r\n\r\n/* API - Read data */\r\nint32_t mflash_drv_read(uint32_t addr, uint32_t *buffer, uint32_t len)\r\n{\r\n    /* Check alignment */\r\n    if (((uint32_t)buffer % 4) || (len % 4))\r\n        return kStatus_InvalidArgument;\r\n\r\n    return mflash_drv_read_internal(addr, buffer, len);\r\n}\r\n\r\n/* API - Get pointer to FLASH region */\r\nvoid *mflash_drv_phys2log(uint32_t addr, uint32_t len)\r\n{\r\n    /* FLASH starts at MFLASH_BASE_ADDRESS */\r\n    return (void *)(addr + MFLASH_BASE_ADDRESS);\r\n}\r\n\r\n/* API - Get pointer to FLASH region */\r\nuint32_t mflash_drv_log2phys(void *ptr, uint32_t len)\r\n{\r\n    if ((uint32_t)ptr < MFLASH_BASE_ADDRESS)\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n\r\n    /* FLASH starts at MFLASH_BASE_ADDRESS */\r\n    return ((uint32_t)ptr - MFLASH_BASE_ADDRESS);\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/flash/mflash/frdmrw612/mflash_drv.h",
    "content": "/*\r\n * Copyright 2017-2021 NXP\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef __MFLASH_DRV_H__\r\n#define __MFLASH_DRV_H__\r\n\r\n#include \"mflash_common.h\"\r\n\r\n/* Flash constants */\r\n#ifndef MFLASH_SECTOR_SIZE\r\n#define MFLASH_SECTOR_SIZE (4096U)\r\n#endif\r\n\r\n#ifndef MFLASH_PAGE_SIZE\r\n#define MFLASH_PAGE_SIZE (256U)\r\n#endif\r\n\r\n/* Device specific settings */\r\n#ifndef MFLASH_FLEXSPI\r\n#define MFLASH_FLEXSPI FLEXSPI\r\n#endif\r\n\r\n#ifndef MFLASH_BASE_ADDRESS\r\n#define MFLASH_BASE_ADDRESS (FlexSPI_AMBA_PC_CACHE_BASE)\r\n#endif\r\n\r\n#define FLASH_SIZE 0x04000000U\r\n\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/flash/mflash/mflash_common.h",
    "content": "/*\r\n * Copyright 2018-2020 NXP\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef __MFLASH_COMMON_H__\r\n#define __MFLASH_COMMON_H__\r\n\r\n#include <stdint.h>\r\n#include <stdbool.h>\r\n\r\n#include \"fsl_common.h\"\r\n\r\n/*******************************************************************************\r\n * Common definitions\r\n ******************************************************************************/\r\n\r\n#define MFLASH_INVALID_ADDRESS (UINT32_MAX)\r\n\r\n#define mflash_drv_is_page_aligned(x)   (((x) % (MFLASH_PAGE_SIZE)) == 0U)\r\n#define mflash_drv_is_sector_aligned(x) (((x) % (MFLASH_SECTOR_SIZE)) == 0U)\r\n\r\n/*\r\n * The addresses of FLASH locations used by APIs below may not correspond with the addresses space, especially when\r\n * FLASH remapping is being used. Use mflash_drv_phys2log/log2phys API to obtain actual pointer or physical address.\r\n */\r\n\r\n/*******************************************************************************\r\n * APIs provided by low level driver\r\n ******************************************************************************/\r\n\r\n/*! @brief Initializes mflash driver */\r\nint32_t mflash_drv_init(void);\r\n\r\n/*! @brief Erases single sector */\r\nint32_t mflash_drv_sector_erase(uint32_t sector_addr);\r\n\r\n/*! @brief Writes single page */\r\nint32_t mflash_drv_page_program(uint32_t page_addr, uint32_t *data);\r\n\r\n/*! @brief Reads data of arbitrary length */\r\nint32_t mflash_drv_read(uint32_t addr, uint32_t *buffer, uint32_t len);\r\n\r\n/*! @brief Returns pointer to memory area where the specified region of FLASH is mapped, NULL on failure (could not map\r\n * continuous block) */\r\nvoid *mflash_drv_phys2log(uint32_t addr, uint32_t len);\r\n\r\n/*! @brief Returns address of physical memory where the area accessible by given pointer is actually stored, UINT32_MAX\r\n * on failure (could not map as continuous block) */\r\nuint32_t mflash_drv_log2phys(void *ptr, uint32_t len);\r\n\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/flash/mflash/mflash_file.c",
    "content": "/*\r\n * Copyright 2017-2020 NXP\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include <stddef.h>\r\n#include <stdbool.h>\r\n#include <stdint.h>\r\n#include <string.h>\r\n\r\n#ifdef SDK_OS_FREE_RTOS\r\n#include \"FreeRTOS.h\"\r\n#endif\r\n\r\n#include \"mflash_file.h\"\r\n#include \"mflash_drv.h\"\r\n#include \"fsl_common.h\"\r\n\r\n/* Magic numbers to check for presence of the structures below */\r\n#define MFLASH_DIR_MAGIC_NO  (0xF17E07ABu)\r\n#define MFLASH_META_MAGIC_NO (0xABECEDA8u)\r\n#define MFLASH_FS_VERSION    (0x00010000u)\r\n#define MFLASH_BLANK_PATTERN (0xFFu)\r\n\r\n#if defined(__CC_ARM) || defined(__ARMCC_VERSION)\r\n// linker symbols imported as described in https://www.keil.com/support/man/docs/armlink/armlink_pge1362065952432.htm\r\nextern char Image$$mflash_fs$$Base[];\r\n#define MFLASH_FS_START ((void *)Image$$mflash_fs$$Base)\r\n#else\r\nextern char __MFLASH_FS_START[];\r\n#define MFLASH_FS_START ((void *)__MFLASH_FS_START)\r\n#endif\r\n\r\n/*\r\n * The table header and table record structures have to be aligned\r\n * with pages/sectors that are expected to be of 2**n size, hence there is some padding\r\n */\r\ntypedef struct\r\n{\r\n    uint32_t file_offset;\r\n    uint32_t alloc_size;\r\n    uint8_t path[MFLASH_MAX_PATH_LEN];\r\n} mflash_dir_record_t;\r\n\r\ntypedef struct\r\n{\r\n    uint32_t magic_no;\r\n    uint32_t version;\r\n    uint32_t page_size;\r\n    uint32_t sector_size;\r\n    uint32_t file_count;\r\n    uint32_t total_size;\r\n    uint8_t padding[sizeof(mflash_dir_record_t) - 6 * sizeof(uint32_t)];\r\n} mflash_fs_header_t;\r\n\r\ntypedef struct\r\n{\r\n    mflash_fs_header_t header;\r\n    mflash_dir_record_t records[];\r\n} mflash_fs_t;\r\n\r\n/* Metadata prepended to the file itself to identify valid (already written) file and keep actual length of the file */\r\ntypedef struct\r\n{\r\n    uint32_t file_size;\r\n    uint32_t magic_no;\r\n} mflash_file_meta_t;\r\n\r\n/* Pointer to the filesystem */\r\nstatic mflash_fs_t *g_mflash_fs = NULL;\r\n\r\n/* API - True if mflash is already initialized */\r\nbool mflash_is_initialized(void)\r\n{\r\n    return (g_mflash_fs != NULL);\r\n}\r\n\r\n/* Store path string to directory record structure */\r\nstatic bool dir_path_store(mflash_dir_record_t *dr, char *path)\r\n{\r\n    assert(dr);\r\n    assert(path);\r\n\r\n    for (int i = 0; i < MFLASH_MAX_PATH_LEN; i++)\r\n    {\r\n        dr->path[i] = (uint8_t)(*path);\r\n\r\n        /* End of string, exit the loop */\r\n        if (*path == '\\0')\r\n        {\r\n            break;\r\n        }\r\n\r\n        path++;\r\n    }\r\n\r\n    /* Check whether the whole given path string was processed */\r\n    if (*path != '\\0')\r\n    {\r\n        return false;\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n/* Match path string against directory record */\r\nstatic bool dir_path_match(mflash_dir_record_t *dr, char *path)\r\n{\r\n    assert(dr);\r\n    assert(path);\r\n\r\n    for (int i = 0; i < MFLASH_MAX_PATH_LEN; i++)\r\n    {\r\n        if (dr->path[i] != (uint8_t)(*path))\r\n        {\r\n            return false;\r\n        }\r\n\r\n        /* End of string, there is match */\r\n        if (*path == '\\0')\r\n        {\r\n            return true;\r\n        }\r\n\r\n        path++;\r\n    }\r\n\r\n    /* Check whether the whole given path string was processed */\r\n    if (*path != '\\0')\r\n    {\r\n        return false;\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n/* Buffer allocation wrapper */\r\nstatic void *mflash_page_buf_get(void)\r\n{\r\n    void *page_buf;\r\n#ifdef SDK_OS_FREE_RTOS\r\n    page_buf = pvPortMalloc(MFLASH_PAGE_SIZE);\r\n#else\r\n    page_buf = malloc(MFLASH_PAGE_SIZE);\r\n#endif\r\n    return page_buf;\r\n}\r\n\r\n/* Buffer allocation wrapper */\r\nstatic void mflash_page_buf_release(void *page_buf)\r\n{\r\n#ifdef SDK_OS_FREE_RTOS\r\n    vPortFree(page_buf);\r\n#else\r\n    free(page_buf);\r\n#endif\r\n}\r\n\r\n/* Low level abstraction - erase sector of the filesystem */\r\nstatic status_t mflash_fs_sector_erase(mflash_fs_t *fs, uint32_t sector_offset)\r\n{\r\n    uint32_t phys_addr;\r\n\r\n    /* Translate filesystem offset to physical address in FLASH */\r\n    phys_addr = mflash_drv_log2phys((uint8_t *)fs + sector_offset, MFLASH_SECTOR_SIZE);\r\n    if (phys_addr == MFLASH_INVALID_ADDRESS)\r\n    {\r\n        return kStatus_Fail;\r\n    }\r\n\r\n    return mflash_drv_sector_erase(phys_addr);\r\n}\r\n\r\n/* Low level abstraction - program page of the filesystem */\r\nstatic status_t mflash_fs_page_program(mflash_fs_t *fs, uint32_t page_offset, uint32_t *data)\r\n{\r\n    uint32_t phys_addr;\r\n\r\n    /* Translate filesystem offset to physical address in FLASH */\r\n    phys_addr = mflash_drv_log2phys((uint8_t *)fs + page_offset, MFLASH_PAGE_SIZE);\r\n    if (phys_addr == MFLASH_INVALID_ADDRESS)\r\n    {\r\n        return kStatus_Fail;\r\n    }\r\n\r\n    return mflash_drv_page_program(phys_addr, data);\r\n}\r\n\r\n/* Low level abstraction - get pointer to filesystem location specified by offset */\r\nstatic inline void *mflash_fs_get_ptr(mflash_fs_t *fs, uint32_t offset)\r\n{\r\n    return (void *)((uint8_t *)fs + offset);\r\n}\r\n\r\n/*\r\n * Check whether give area of FLASH is readable by direct pointer access.\r\n * This is necessary on plaforms featuring page checksums as access to page containing invalid data may result in a\r\n * hardfault.\r\n */\r\nstatic status_t mflash_readable_check(void *ptr, uint32_t size)\r\n{\r\n#if defined(MFLASH_PAGE_INTEGRITY_CHECKS) && MFLASH_PAGE_INTEGRITY_CHECKS\r\n    status_t status;\r\n\r\n    uintptr_t start_addr = (uintptr_t)ptr - (uintptr_t)ptr % MFLASH_PAGE_SIZE;\r\n    uintptr_t end_addr   = (uintptr_t)ptr + size;\r\n\r\n    for (uintptr_t check_addr = start_addr; check_addr < end_addr; check_addr += MFLASH_PAGE_SIZE)\r\n    {\r\n        status = mflash_drv_is_readable(check_addr);\r\n        if (status != kStatus_Success)\r\n        {\r\n            return status;\r\n        }\r\n    }\r\n\r\n    return kStatus_Success;\r\n#else\r\n    return kStatus_Success;\r\n#endif\r\n}\r\n\r\n/* Check for filesystem presence and validity */\r\nstatic status_t mflash_fs_check(mflash_fs_t *fs)\r\n{\r\n    status_t status;\r\n\r\n    /* Check params */\r\n    if (fs == NULL)\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n\r\n    /* Check readability before accessing filesystem structure by pointer */\r\n    status = mflash_readable_check(fs, sizeof(mflash_fs_header_t));\r\n    if (status != kStatus_Success)\r\n    {\r\n        return status;\r\n    }\r\n\r\n    /* Check magic */\r\n    if (fs->header.magic_no != MFLASH_DIR_MAGIC_NO)\r\n    {\r\n        return kStatus_Fail;\r\n    }\r\n\r\n    /* Check major version */\r\n    if ((fs->header.version & 0xFFFF0000u) != (MFLASH_FS_VERSION & 0xFFFF0000u))\r\n    {\r\n        return kStatus_Fail;\r\n    }\r\n\r\n    /* Check FLASH memory characteristics */\r\n    if (fs->header.page_size != MFLASH_PAGE_SIZE || fs->header.sector_size != MFLASH_SECTOR_SIZE)\r\n    {\r\n        return kStatus_Fail;\r\n    }\r\n\r\n    /* Check readability of the whole directory */\r\n    status =\r\n        mflash_readable_check(fs, sizeof(mflash_fs_header_t) + fs->header.file_count * sizeof(mflash_dir_record_t));\r\n\r\n    return status;\r\n}\r\n\r\n/* Check for presence of a file data */\r\nstatic status_t mflash_file_check(mflash_fs_t *fs, mflash_dir_record_t *dr)\r\n{\r\n    status_t status;\r\n    mflash_file_meta_t *meta;\r\n\r\n    /* Check params */\r\n    if (fs == NULL)\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n\r\n    if (dr == NULL)\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n\r\n    /* Get pointer to file meta structure */\r\n    meta = mflash_fs_get_ptr(fs, dr->file_offset);\r\n\r\n    /* Check readability before accessing file meta structure */\r\n    status = mflash_readable_check(meta, sizeof(mflash_file_meta_t));\r\n    if (status != kStatus_Success)\r\n    {\r\n        return status;\r\n    }\r\n\r\n    /* Check magic signature */\r\n    if (meta->magic_no != MFLASH_META_MAGIC_NO)\r\n    {\r\n        return kStatus_Fail;\r\n    }\r\n\r\n    /* Check wheter actual file size in meta fits the pre-allocated area */\r\n    if (meta->file_size + sizeof(mflash_file_meta_t) > dr->alloc_size)\r\n    {\r\n        return kStatus_Fail;\r\n    }\r\n\r\n    /* Check readability of the whole file */\r\n    status = mflash_readable_check(meta, sizeof(mflash_file_meta_t) + meta->file_size);\r\n\r\n    return kStatus_Success;\r\n}\r\n\r\n/* Searches for directory record with given path and retrieves a copy of it */\r\nstatic status_t mflash_dir_lookup(mflash_fs_t *fs, char *path, mflash_dir_record_t *dr_ptr)\r\n{\r\n    uint32_t file_count     = fs->header.file_count;\r\n    mflash_dir_record_t *dr = fs->records;\r\n\r\n    for (uint32_t i = 0u; i < file_count; i++)\r\n    {\r\n        if (dir_path_match(dr, path))\r\n        {\r\n            if (NULL != dr_ptr)\r\n            {\r\n                *dr_ptr = *dr;\r\n            }\r\n            return kStatus_Success;\r\n        }\r\n        dr++;\r\n    }\r\n\r\n    return kStatus_Fail;\r\n}\r\n\r\n/* Create filesystem structure in FLASH according to given directory template */\r\nstatic status_t mflash_format_internal(mflash_fs_t *fs,\r\n                                       void *page_buf,\r\n                                       uint32_t fs_size_limit,\r\n                                       const mflash_file_t *dir_template)\r\n{\r\n    status_t status;\r\n\r\n    uint32_t file_count;\r\n    uint32_t total_sectors;\r\n\r\n    uint32_t dir_size;\r\n    uint32_t dir_sectors;\r\n\r\n    uint32_t file_offset;\r\n    uint32_t dir_offset;\r\n\r\n    mflash_fs_header_t *fsh;\r\n\r\n    /* The directory records shall be aligned to page size */\r\n    assert((MFLASH_PAGE_SIZE % sizeof(mflash_dir_record_t)) == 0u);\r\n\r\n    /* Count the files and calculate number of FLASH sectors to be occupied by the filesystem */\r\n    file_count    = 0;\r\n    total_sectors = 0;\r\n    for (const mflash_file_t *dt = dir_template; (NULL != dt->path) && ('\\0' != dt->path[0]) && (0 != dt->max_size);\r\n         dt++)\r\n    {\r\n        /* Calculate number of sectors to be occupied by the file */\r\n        uint32_t file_sectors = (dt->max_size + MFLASH_SECTOR_SIZE - 1) / MFLASH_SECTOR_SIZE;\r\n        total_sectors += file_sectors;\r\n        file_count++;\r\n    }\r\n\r\n    dir_size    = file_count * sizeof(mflash_dir_record_t) + sizeof(mflash_fs_header_t);\r\n    dir_sectors = (dir_size + MFLASH_SECTOR_SIZE - 1) / MFLASH_SECTOR_SIZE;\r\n    total_sectors += dir_sectors;\r\n\r\n    /* Check whether the filestytem fits into the given FLASH area */\r\n    if ((0u != fs_size_limit) && (fs_size_limit < total_sectors * MFLASH_SECTOR_SIZE))\r\n    {\r\n        return kStatus_OutOfRange;\r\n    }\r\n\r\n    /* Erase the whole FLASH area to be occupied by the filesystem */\r\n    for (uint32_t i = 0u; i < total_sectors; i++)\r\n    {\r\n        status = mflash_fs_sector_erase(fs, i * MFLASH_SECTOR_SIZE);\r\n        if (status != kStatus_Success)\r\n        {\r\n            return status;\r\n        }\r\n    }\r\n\r\n    /* Clear the page buffer and set inital values for offsets */\r\n    (void)memset(page_buf, (int)MFLASH_BLANK_PATTERN, MFLASH_PAGE_SIZE);\r\n    dir_offset  = file_count * sizeof(mflash_dir_record_t) + sizeof(mflash_fs_header_t);\r\n    file_offset = total_sectors * MFLASH_SECTOR_SIZE;\r\n\r\n    /* Create directory entries in reverse order so that programming of the page containing the dir header is the last\r\n     * step */\r\n    for (uint32_t fi = file_count; 0u != fi--;)\r\n    {\r\n        /* Check for enough space for the directory record */\r\n        assert(dir_offset >= sizeof(mflash_dir_record_t));\r\n\r\n        dir_offset -= sizeof(mflash_dir_record_t);\r\n\r\n        mflash_dir_record_t *dr = (mflash_dir_record_t *)((uint8_t *)page_buf + (dir_offset % MFLASH_PAGE_SIZE));\r\n        const mflash_file_t *dt = &dir_template[fi];\r\n\r\n        /* Calculate number of sectors to be occupied by the file */\r\n        uint32_t file_sectors = (dt->max_size + MFLASH_SECTOR_SIZE - 1) / MFLASH_SECTOR_SIZE;\r\n\r\n        /* Fill in directory record */\r\n        dr->alloc_size  = file_sectors * MFLASH_SECTOR_SIZE;\r\n        dr->file_offset = (file_offset -= dr->alloc_size);\r\n        dir_path_store(dr, dt->path);\r\n\r\n        if (dir_offset % MFLASH_PAGE_SIZE == 0u)\r\n        {\r\n            /* We reached the beginning of a page, program it and start over */\r\n            status = mflash_fs_page_program(fs, dir_offset, page_buf);\r\n            if (status != kStatus_Success)\r\n            {\r\n                return status;\r\n            }\r\n\r\n            /* Clear the page buffer */\r\n            (void)memset(page_buf, (int)MFLASH_BLANK_PATTERN, MFLASH_PAGE_SIZE);\r\n        }\r\n    }\r\n\r\n    /* There should be space left exactly for the filesystem header */\r\n    assert(dir_offset == sizeof(mflash_fs_header_t));\r\n\r\n    /* Create filesystem header at the very beginning of the first page */\r\n    fsh              = (mflash_fs_header_t *)page_buf;\r\n    fsh->magic_no    = MFLASH_DIR_MAGIC_NO;\r\n    fsh->version     = MFLASH_FS_VERSION;\r\n    fsh->page_size   = MFLASH_PAGE_SIZE;\r\n    fsh->sector_size = MFLASH_SECTOR_SIZE;\r\n    fsh->total_size  = total_sectors * MFLASH_SECTOR_SIZE;\r\n    fsh->file_count  = file_count;\r\n\r\n    /* Programming of the first page puts header into place marking the filesystem as valid */\r\n    status = mflash_fs_page_program(fs, 0, page_buf);\r\n\r\n    return status;\r\n}\r\n\r\n/* Create filesystem structure in FLASH according to given directory template */\r\nstatic status_t mflash_format(mflash_fs_t *fs, uint32_t fs_size_limit, const mflash_file_t *dir_template)\r\n{\r\n    status_t status;\r\n    void *page_buf;\r\n\r\n    /* Check parameters */\r\n    if (dir_template == NULL)\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n\r\n    /* Get page buffer for FLASH writes */\r\n    page_buf = mflash_page_buf_get();\r\n    if (page_buf == NULL)\r\n    {\r\n        return kStatus_Fail;\r\n    }\r\n\r\n    /* Actual formatting of the filesystem */\r\n    status = mflash_format_internal(fs, page_buf, fs_size_limit, dir_template);\r\n\r\n    /* Release page buffer */\r\n    mflash_page_buf_release(page_buf);\r\n\r\n    return status;\r\n}\r\n\r\n/* Match dir against given template. Checks whether all files defined in the template are pre-allocsated in the fs\r\n * directory */\r\nstatic status_t mflash_template_match(mflash_fs_t *fs, const mflash_file_t *dir_template)\r\n{\r\n    status_t status;\r\n\r\n    for (const mflash_file_t *dt = dir_template; (NULL != dt->path) && ('\\0' != dt->path[0]) && (0u != dt->max_size);\r\n         dt++)\r\n    {\r\n        mflash_dir_record_t dr;\r\n\r\n        /* Lookup directory record */\r\n        status = mflash_dir_lookup(fs, dt->path, &dr);\r\n        if (status != kStatus_Success)\r\n        {\r\n            return status;\r\n        }\r\n\r\n        /* Check whether pre-allocated size is sufficient */\r\n        if (dr.alloc_size < dt->max_size)\r\n        {\r\n            return kStatus_Fail;\r\n        }\r\n    }\r\n\r\n    return kStatus_Success;\r\n}\r\n\r\n/* Initialize mflash filesystem */\r\nstatic status_t mflash_fs_init(mflash_fs_t *fs, uint32_t fs_size_limit, const mflash_file_t *dir_template)\r\n{\r\n    status_t status;\r\n\r\n    /* Check whether there is a filesystem header and directory already in place */\r\n    status = mflash_fs_check(fs);\r\n\r\n    /* Filesystem is valid, check whether its directory provides records for all required files */\r\n    if (status == kStatus_Success)\r\n    {\r\n        status = mflash_template_match(fs, dir_template);\r\n    }\r\n\r\n    /* The filesystem not present or does not fit the template, create a new one */\r\n    if (status == kStatus_Fail) /* Error codes other then 'Fail' are not captured here but rather intentinally passed to\r\n                                   the caller */\r\n    {\r\n        status = mflash_format(fs, fs_size_limit, dir_template); /* Format the filestem */\r\n    }\r\n\r\n    if (status == kStatus_Success)\r\n    {\r\n        g_mflash_fs = fs; /* If all went ok, keep pointer to the filesytem */\r\n    }\r\n\r\n    return status;\r\n}\r\n\r\n/* API - Initialize mflash driver and filesystem at default address specified by linker symbol */\r\nstatus_t mflash_init(const mflash_file_t *dir_template, bool init_drv)\r\n{\r\n    status_t status;\r\n    mflash_fs_t *fs;\r\n\r\n    /* Initialize the driver */\r\n    if (init_drv)\r\n    {\r\n        status = mflash_drv_init();\r\n        if (status == kStatus_Fail)\r\n        {\r\n            return status;\r\n        }\r\n    }\r\n\r\n#ifdef MFLASH_FILE_BASEADDR\r\n    /* Convert physical address in FLASH to memory pointer */\r\n    fs = (mflash_fs_t *)mflash_drv_phys2log(MFLASH_FILE_BASEADDR, 0);\r\n#else\r\n    /* Otherwise take address from linker file */\r\n    fs = (mflash_fs_t *)MFLASH_FS_START;\r\n#endif\r\n\r\n    if (fs == NULL)\r\n    {\r\n        return kStatus_Fail;\r\n    }\r\n\r\n    return mflash_fs_init(fs, 0, dir_template);\r\n}\r\n\r\n/* Save file */\r\nstatic status_t mflash_file_save_internal(\r\n    mflash_fs_t *fs, void *page_buf, mflash_dir_record_t *dr, uint8_t *data, uint32_t size)\r\n{\r\n    status_t status;\r\n\r\n    /* Check whether the data + meta fits into the pre-allocated file area */\r\n    if (size + sizeof(mflash_file_meta_t) > dr->alloc_size)\r\n    {\r\n        return kStatus_OutOfRange;\r\n    }\r\n\r\n    /* Erase the whole file area sector by sector */\r\n    for (uint32_t sector_offset = 0; sector_offset < dr->alloc_size; sector_offset += MFLASH_SECTOR_SIZE)\r\n    {\r\n        /* Erase the sector */\r\n        status = mflash_fs_sector_erase(fs, dr->file_offset + sector_offset);\r\n        if (status != kStatus_Success)\r\n        {\r\n            return status;\r\n        }\r\n    }\r\n\r\n    /* Program the file data page by page, skipping the first page containing meta that is going to be programmed in the\r\n     * last step */\r\n    for (uint32_t data_offset = MFLASH_PAGE_SIZE - sizeof(mflash_file_meta_t); data_offset < size;\r\n         data_offset += MFLASH_PAGE_SIZE)\r\n    {\r\n        /* Pointer and size of the data portion to be programmed */\r\n        void *copy_ptr     = data + data_offset;\r\n        uint32_t copy_size = size - data_offset;\r\n        if (copy_size > MFLASH_PAGE_SIZE)\r\n        {\r\n            copy_size = MFLASH_PAGE_SIZE;\r\n        }\r\n\r\n        (void)memset(page_buf, (int)MFLASH_BLANK_PATTERN, MFLASH_PAGE_SIZE);\r\n        (void)memcpy(page_buf, copy_ptr, copy_size);\r\n\r\n        /* Data offset is off by sizeof(mflash_file_meta_t) as this structure occupies the very beginning of the first\r\n         * page */\r\n        status = mflash_fs_page_program(fs, dr->file_offset + data_offset + sizeof(mflash_file_meta_t), page_buf);\r\n        if (status != kStatus_Success)\r\n        {\r\n            return status;\r\n        }\r\n    }\r\n\r\n    /* Prepare the missing portion of data to be programme to the first page */\r\n    uint32_t copy_size = size;\r\n    if (copy_size > MFLASH_PAGE_SIZE - sizeof(mflash_file_meta_t))\r\n    {\r\n        copy_size = MFLASH_PAGE_SIZE - sizeof(mflash_file_meta_t);\r\n    }\r\n\r\n    (void)memset(page_buf, (int)MFLASH_BLANK_PATTERN, MFLASH_PAGE_SIZE);\r\n    (void)memcpy((uint8_t *)page_buf + sizeof(mflash_file_meta_t), data, copy_size);\r\n\r\n    /* Set file metadata */\r\n    mflash_file_meta_t *meta = (mflash_file_meta_t *)page_buf;\r\n    meta->file_size          = size;\r\n    meta->magic_no           = MFLASH_META_MAGIC_NO;\r\n\r\n    /* Program the first page putting the metadata in place which marks the file as valid */\r\n    status = mflash_fs_page_program(fs, dr->file_offset, page_buf);\r\n\r\n    return status;\r\n}\r\n\r\n/* API, save data to file with given path */\r\nstatus_t mflash_file_save(char *path, uint8_t *data, uint32_t size)\r\n{\r\n    status_t status;\r\n    mflash_dir_record_t dr;\r\n    mflash_fs_t *fs = g_mflash_fs;\r\n    void *page_buf;\r\n\r\n    if (path == NULL)\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n\r\n    if ((data == NULL) && (size != 0u))\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n\r\n    /* Lookup directory record */\r\n    status = mflash_dir_lookup(fs, path, &dr);\r\n    if (status != kStatus_Success)\r\n    {\r\n        return status;\r\n    }\r\n\r\n    /* Get page buffer for FLASH writes */\r\n    page_buf = mflash_page_buf_get();\r\n    if (page_buf == NULL)\r\n    {\r\n        return kStatus_Fail;\r\n    }\r\n\r\n    /* Save the file */\r\n    status = mflash_file_save_internal(fs, page_buf, &dr, data, size);\r\n\r\n    /* Release page buffer */\r\n    mflash_page_buf_release(page_buf);\r\n\r\n    return status;\r\n}\r\n\r\n/* Get direct pointer to file data */\r\nstatic status_t mflash_file_mmap_internal(mflash_fs_t *fs, mflash_dir_record_t *dr, uint8_t **pdata, uint32_t *psize)\r\n{\r\n    status_t status;\r\n    mflash_file_meta_t *meta;\r\n\r\n    status = mflash_file_check(fs, dr);\r\n    if (status != kStatus_Success)\r\n    {\r\n        return status;\r\n    }\r\n\r\n    meta = mflash_fs_get_ptr(fs, dr->file_offset);\r\n\r\n    *pdata = (uint8_t *)meta + sizeof(*meta);\r\n    *psize = meta->file_size;\r\n\r\n    return kStatus_Success;\r\n}\r\n\r\n/* API, get direct pointer to data of file with given path */\r\nstatus_t mflash_file_mmap(char *path, uint8_t **pdata, uint32_t *psize)\r\n{\r\n    status_t status;\r\n    mflash_dir_record_t dr;\r\n    mflash_fs_t *fs = g_mflash_fs;\r\n\r\n    if (path == NULL)\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n\r\n    if (pdata == NULL || psize == NULL)\r\n    {\r\n        return kStatus_InvalidArgument;\r\n    }\r\n\r\n    /* Lookup directory record */\r\n    status = mflash_dir_lookup(fs, path, &dr);\r\n    if (status != kStatus_Success)\r\n    {\r\n        return status;\r\n    }\r\n\r\n    status = mflash_file_mmap_internal(fs, &dr, pdata, psize);\r\n\r\n    return status;\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/flash/mflash/mflash_file.h",
    "content": "/*\r\n * Copyright 2017-2020 NXP\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef __MFLASH_FILE__\r\n#define __MFLASH_FILE__\r\n\r\n#include \"fsl_common.h\"\r\n\r\n#include \"mflash_drv.h\"\r\n\r\n#define MFLASH_MAX_PATH_LEN 56\r\n\r\n/*\r\n * Template for file record defines file path and size to be pre-allocated for that file.\r\n * The actual size of the file shall not exceed the size defined in the template.\r\n */\r\ntypedef struct\r\n{\r\n    char *path;\r\n    uint32_t max_size;\r\n} mflash_file_t;\r\n\r\n/*! @brief Initialization status of mflash subsystem */\r\nbool mflash_is_initialized(void);\r\n\r\n/*! @brief Initializes mflash filesystem and driver. Creates new filesystem unless already in place. */\r\nstatus_t mflash_init(const mflash_file_t *dir_template, bool init_drv);\r\n\r\n/*! @brief Saves data to file with given path. */\r\nstatus_t mflash_file_save(char *path, uint8_t *data, uint32_t size);\r\n\r\n/*! @brief Returns pointer for direct memory mapped access to file data. */\r\nstatus_t mflash_file_mmap(char *path, uint8_t **pdata, uint32_t *psize);\r\n\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/flash/mflash/readme.txt",
    "content": "Overview\r\n========\r\n\r\nmflash_file is a simple statically allocated flat filesytem for FLASH memories.\r\nThe storage consists of predefined set of named files with fixed maximal lenght.\r\nIts main purpose is to provide non-volatile storage for small data like device configuration and provisioning.\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/flash_config/flash_config.c",
    "content": "/*\r\n * Copyright 2021-2024 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n#include \"flash_config.h\"\r\n\r\n/* Component ID definition, used by tools. */\r\n#ifndef FSL_COMPONENT_ID\r\n#define FSL_COMPONENT_ID \"platform.drivers.flash_config\"\r\n#endif\r\n\r\n/*******************************************************************************\r\n * Code\r\n ******************************************************************************/\r\n#if defined(BOOT_HEADER_ENABLE) && (BOOT_HEADER_ENABLE == 1)\r\n#if defined(__ARMCC_VERSION) || defined(__GNUC__)\r\n__attribute__((section(\".flash_conf\"), used))\r\n#elif defined(__ICCARM__)\r\n#pragma location = \".flash_conf\"\r\n#endif\r\nconst fc_flexspi_nor_config_t flexspi_config = {\r\n    .memConfig =\r\n        {\r\n            .tag                 = FC_BLOCK_TAG,\r\n            .version             = FC_BLOCK_VERSION,\r\n            .readSampleClkSrc    = 1,\r\n            .csHoldTime          = 3,\r\n            .csSetupTime         = 3,\r\n            .deviceModeCfgEnable = 1,\r\n            .deviceModeSeq       = {.seqNum = 1, .seqId = 2},\r\n            .deviceModeArg       = 0x02,\r\n            .configCmdEnable     = 0,\r\n            .deviceType          = 0x1,\r\n            .sflashPadType       = kSerialFlash_4Pads,\r\n            .serialClkFreq       = 5,\r\n            .sflashA1Size        = 0x4000000U,\r\n            .sflashA2Size        = 0,\r\n            .sflashB1Size        = 0,\r\n            .sflashB2Size        = 0,\r\n            .lookupTable =\r\n                {\r\n                    /* Read */\r\n                    [0] = FC_FLEXSPI_LUT_SEQ(FC_CMD_SDR, FC_FLEXSPI_1PAD, 0xEC, FC_RADDR_SDR, FC_FLEXSPI_4PAD, 0x20),\r\n                    [1] = FC_FLEXSPI_LUT_SEQ(FC_MODE8_SDR, FC_FLEXSPI_4PAD, 0xF0, FC_DUMMY_SDR, FC_FLEXSPI_4PAD, 0x04),\r\n                    [2] = FC_FLEXSPI_LUT_SEQ(FC_READ_SDR, FC_FLEXSPI_4PAD, 0x04, FC_STOP_EXE, FC_FLEXSPI_1PAD, 0x00),\r\n\r\n                    /* Read Status */\r\n                    [4 * 1 + 0] =\r\n                        FC_FLEXSPI_LUT_SEQ(FC_CMD_SDR, FC_FLEXSPI_1PAD, 0x05, FC_READ_SDR, FC_FLEXSPI_1PAD, 0x04),\r\n\r\n                    /* Write Status */\r\n                    [4 * 2 + 0] =\r\n                        FC_FLEXSPI_LUT_SEQ(FC_CMD_SDR, FC_FLEXSPI_1PAD, 0x31, FC_WRITE_SDR, FC_FLEXSPI_1PAD, 0x01),\r\n\r\n                    /* Write Enable */\r\n                    [4 * 3 + 0] =\r\n                        FC_FLEXSPI_LUT_SEQ(FC_CMD_SDR, FC_FLEXSPI_1PAD, 0x06, FC_STOP_EXE, FC_FLEXSPI_1PAD, 0x00),\r\n\r\n                    /* Sector erase */\r\n                    [4 * 5 + 0] =\r\n                        FC_FLEXSPI_LUT_SEQ(FC_CMD_SDR, FC_FLEXSPI_1PAD, 0x21, FC_RADDR_SDR, FC_FLEXSPI_1PAD, 0x20),\r\n\r\n                    /* Block erase */\r\n                    [4 * 8 + 0] =\r\n                        FC_FLEXSPI_LUT_SEQ(FC_CMD_SDR, FC_FLEXSPI_1PAD, 0xDC, FC_RADDR_SDR, FC_FLEXSPI_1PAD, 0x20),\r\n\r\n                    /* Page program */\r\n                    [4 * 9 + 0] =\r\n                        FC_FLEXSPI_LUT_SEQ(FC_CMD_SDR, FC_FLEXSPI_1PAD, 0x34, FC_RADDR_SDR, FC_FLEXSPI_1PAD, 0x20),\r\n                    [4 * 9 + 1] =\r\n                        FC_FLEXSPI_LUT_SEQ(FC_WRITE_SDR, FC_FLEXSPI_4PAD, 0x00, FC_STOP_EXE, FC_FLEXSPI_1PAD, 0x00),\r\n\r\n                    /* chip erase */\r\n                    [4 * 11 + 0] =\r\n                        FC_FLEXSPI_LUT_SEQ(FC_CMD_SDR, FC_FLEXSPI_1PAD, 0xC7, FC_STOP_EXE, FC_FLEXSPI_1PAD, 0x00),\r\n                },\r\n        },\r\n    .pageSize           = 0x100,\r\n    .sectorSize         = 0x1000,\r\n    .ipcmdSerialClkFreq = 0,\r\n    .blockSize          = 0x10000,\r\n    .fcb_fill[0]        = 0xFFFFFFFF,\r\n};\r\n#endif /* BOOT_HEADER_ENABLE */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/flash_config/flash_config.h",
    "content": "/*\r\n * Copyright 2021-2023 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef __FLASH_CONFIG__\r\n#define __FLASH_CONFIG__\r\n\r\n#include <stdint.h>\r\n#include <stdbool.h>\r\n#include \"fsl_common.h\"\r\n\r\n/*! @name Driver version */\r\n/*@{*/\r\n/*! @brief FLASH_CONFIG driver version 2.0.0. */\r\n#define FSL_FLASH_CONFIG_DRIVER_VERSION (MAKE_VERSION(2, 0, 0))\r\n/*@}*/\r\n\r\n/*******************************************************************************\r\n * Definition\r\n ******************************************************************************/\r\n\r\n/* FLEXSPI memory config block related defintions */\r\n#define FC_BLOCK_TAG     (0x42464346)\r\n#define FC_BLOCK_VERSION (0x00000000)\r\n\r\n#define FC_CMD_SDR        0x01\r\n#define FC_CMD_DDR        0x21\r\n#define FC_RADDR_SDR      0x02\r\n#define FC_RADDR_DDR      0x22\r\n#define FC_CADDR_SDR      0x03\r\n#define FC_CADDR_DDR      0x23\r\n#define FC_MODE1_SDR      0x04\r\n#define FC_MODE1_DDR      0x24\r\n#define FC_MODE2_SDR      0x05\r\n#define FC_MODE2_DDR      0x25\r\n#define FC_MODE4_SDR      0x06\r\n#define FC_MODE4_DDR      0x26\r\n#define FC_MODE8_SDR      0x07\r\n#define FC_MODE8_DDR      0x27\r\n#define FC_WRITE_SDR      0x08\r\n#define FC_WRITE_DDR      0x28\r\n#define FC_READ_SDR       0x09\r\n#define FC_READ_DDR       0x29\r\n#define FC_LEARN_SDR      0x0A\r\n#define FC_LEARN_DDR      0x2A\r\n#define FC_DATSZ_SDR      0x0B\r\n#define FC_DATSZ_DDR      0x2B\r\n#define FC_DUMMY_SDR      0x0C\r\n#define FC_DUMMY_DDR      0x2C\r\n#define FC_DUMMY_RWDS_SDR 0x0D\r\n#define FC_DUMMY_RWDS_DDR 0x2D\r\n#define FC_JMP_ON_CS      0x1F\r\n#define FC_STOP_EXE       0\r\n\r\n#define FC_FLEXSPI_1PAD 0\r\n#define FC_FLEXSPI_2PAD 1\r\n#define FC_FLEXSPI_4PAD 2\r\n#define FC_FLEXSPI_8PAD 3\r\n\r\n#define FC_FLEXSPI_LUT_SEQ(cmd0, pad0, op0, cmd1, pad1, op1)                                                           \\\r\n    (FLEXSPI_LUT_OPERAND0(op0) | FLEXSPI_LUT_NUM_PADS0(pad0) | FLEXSPI_LUT_OPCODE0(cmd0) | FLEXSPI_LUT_OPERAND1(op1) | \\\r\n     FLEXSPI_LUT_NUM_PADS1(pad1) | FLEXSPI_LUT_OPCODE1(cmd1))\r\n\r\n/* !@brief Data pad used in Read command */\r\nenum\r\n{\r\n    kSerialFlash_1Pads = 1,\r\n    kSerialFlash_2Pads = 2,\r\n    kSerialFlash_4Pads = 4,\r\n    kSerialFlash_8Pads = 8,\r\n};\r\n\r\n/* !@brief FLEXSPI clock configuration - In High speed boot mode mode */\r\nenum\r\n{\r\n    kFlexSpiSerialClk_30MHz  = 1,\r\n    kFlexSpiSerialClk_50MHz  = 2,\r\n    kFlexSpiSerialClk_60MHz  = 3,\r\n    kFlexSpiSerialClk_80MHz  = 4,\r\n    kFlexSpiSerialClk_100MHz = 5,\r\n    kFlexSpiSerialClk_120MHz = 6,\r\n    kFlexSpiSerialClk_133MHz = 7,\r\n    kFlexSpiSerialClk_166MHz = 8,\r\n    kFlexSpiSerialClk_200MHz = 9,\r\n};\r\n\r\n/* !@brief FLEXSPI clock configuration - In Normal boot SDR mode */\r\nenum\r\n{\r\n    kFlexSpiSerialClk_SDR_24MHz = 1,\r\n    kFlexSpiSerialClk_SDR_48MHz = 2,\r\n};\r\n\r\n/* !@brief FLEXSPI clock configuration - In Normal boot DDR mode */\r\nenum\r\n{\r\n    kFlexSpiSerialClk_DDR_48MHz = 1,\r\n};\r\n\r\n/* !@brief Misc feature bit definitions */\r\nenum\r\n{\r\n    kFlexSpiMiscOffset_DiffClkEnable         = 0, /* !< Bit for Differential clock enable */\r\n    kFlexSpiMiscOffset_WordAddressableEnable = 3, /* !< Bit for Word Addressable enable */\r\n    kFlexSpiMiscOffset_SafeConfigFreqEnable  = 4, /* !< Bit for Safe Configuration Frequency enable */\r\n    kFlexSpiMiscOffset_DdrModeEnable         = 6, /* !< Bit for DDR clock confiuration indication. */\r\n};\r\n\r\n/* !@brief Flash Configuration Command Type */\r\nenum\r\n{\r\n    kDeviceConfigCmdType_Generic,    /* !< Generic command, for example: configure dummy cycles, drive strength, etc */\r\n    kDeviceConfigCmdType_QuadEnable, /* !< Quad Enable command */\r\n    kDeviceConfigCmdType_Spi2Xpi,    /* !< Switch from SPI to DPI/QPI/OPI mode */\r\n    kDeviceConfigCmdType_Xpi2Spi,    /* !< Switch from DPI/QPI/OPI to SPI mode */\r\n    kDeviceConfigCmdType_Spi2NoCmd,  /* !< Switch to 0-4-4/0-8-8 mode */\r\n    kDeviceConfigCmdType_Reset,      /* !< Reset device command */\r\n};\r\n\r\ntypedef struct _fc_flexspi_dll_time\r\n{\r\n    uint8_t time_100ps;  /* !< Data valid time, in terms of 100ps */\r\n    uint8_t delay_cells; /* !< Data valid time, in terms of delay cells */\r\n} fc_flexspi_dll_time_t;\r\n\r\n/* !@brief FlexSPI LUT Sequence structure */\r\ntypedef struct _fc_flexspi_lut_seq\r\n{\r\n    uint8_t seqNum; /* !< Sequence Number, valid number: 1-16 */\r\n    uint8_t seqId;  /* !< Sequence Index, valid number: 0-15 */\r\n    uint16_t reserved;\r\n} fc_flexspi_lut_seq_t;\r\n\r\n/* !@brief FlexSPI Memory Configuration Block */\r\ntypedef struct _fc_flexspi_mem_config\r\n{\r\n    uint32_t tag;       /* !< [0x000-0x003] Tag, fixed value 0x42464346UL */\r\n    uint32_t version;   /* !< [0x004-0x007] Version,[31:24] -'V', [23:16] - Major, [15:8] - Minor, [7:0] - bugfix */\r\n    uint32_t reserved0; /* !< [0x008-0x00b] Reserved for future use */\r\n    uint8_t readSampleClkSrc;    /* !< [0x00c-0x00c] Read Sample Clock Source, valid value: 0/1/3 */\r\n    uint8_t csHoldTime;          /* !< [0x00d-0x00d] CS hold time, default value: 3 */\r\n    uint8_t csSetupTime;         /* !< [0x00e-0x00e] CS setup time, default value: 3 */\r\n    uint8_t columnAddressWidth;  /* !< [0x00f-0x00f] Column Address with, for HyperBus protocol, it is fixed to 3, For\r\n       Serial NAND, need to refer to datasheet */\r\n    uint8_t deviceModeCfgEnable; /* !< [0x010-0x010] Device Mode Configure enable flag, 1 - Enable, 0 - Disable */\r\n    uint8_t deviceModeType; /* !< [0x011-0x011] Specify the configuration command type:Quad Enable, DPI/QPI/OPI switch,\r\n     Generic configuration, etc. */\r\n    uint16_t waitTimeCfgCommands; /* !< [0x012-0x013] Wait time for all configuration commands, unit: 100us, Used for\r\n     DPI/QPI/OPI switch or reset command */\r\n    fc_flexspi_lut_seq_t deviceModeSeq; /* !< [0x014-0x017] Device mode sequence info, [7:0] - LUT sequence id, [15:8] -\r\n     LUt sequence number, [31:16] Reserved */\r\n    uint32_t deviceModeArg;             /* !< [0x018-0x01b] Argument/Parameter for device configuration */\r\n    uint8_t configCmdEnable;            /* !< [0x01c-0x01c] Configure command Enable Flag, 1 - Enable, 0 - Disable */\r\n    uint8_t configModeType[3];          /* !< [0x01d-0x01f] Configure Mode Type, similar as deviceModeTpe */\r\n    fc_flexspi_lut_seq_t configCmdSeqs[3]; /* !< [0x020-0x02b] Sequence info for Device Configuration command, similar\r\n                                           as deviceModeSeq */\r\n    uint32_t reserved1;                    /* !< [0x02c-0x02f] Reserved for future use */\r\n    uint32_t configCmdArgs[3];             /* !< [0x030-0x03b] Arguments/Parameters for device Configuration commands */\r\n    uint32_t reserved2;                    /* !< [0x03c-0x03f] Reserved for future use */\r\n    uint32_t controllerMiscOption; /* !< [0x040-0x043] Controller Misc Options, see Misc feature bit definitions for\r\n      more details */\r\n    uint8_t deviceType;            /* !< [0x044-0x044] Device Type:  See Flash Type Definition for more details */\r\n    uint8_t sflashPadType; /* !< [0x045-0x045] Serial Flash Pad Type: 1 - Single, 2 - Dual, 4 - Quad, 8 - Octal */\r\n    uint8_t serialClkFreq; /* !< [0x046-0x046] Serial Flash Frequencey, device specific definitions, See System Boot\r\n     Chapter for more details */\r\n    uint8_t lutCustomSeqEnable; /* !< [0x047-0x047] LUT customization Enable, it is required if the program/erase cannot\r\n     be done using 1 LUT sequence, currently, only applicable to HyperFLASH */\r\n    uint32_t reserved3[2];      /* !< [0x048-0x04f] Reserved for future use */\r\n    uint32_t sflashA1Size;      /* !< [0x050-0x053] Size of Flash connected to A1 */\r\n    uint32_t sflashA2Size;      /* !< [0x054-0x057] Size of Flash connected to A2 */\r\n    uint32_t sflashB1Size;      /* !< [0x058-0x05b] Size of Flash connected to B1 */\r\n    uint32_t sflashB2Size;      /* !< [0x05c-0x05f] Size of Flash connected to B2 */\r\n    uint32_t csPadSettingOverride;          /* !< [0x060-0x063] CS pad setting override value */\r\n    uint32_t sclkPadSettingOverride;        /* !< [0x064-0x067] SCK pad setting override value */\r\n    uint32_t dataPadSettingOverride;        /* !< [0x068-0x06b] data pad setting override value */\r\n    uint32_t dqsPadSettingOverride;         /* !< [0x06c-0x06f] DQS pad setting override value */\r\n    uint32_t timeoutInMs;                   /* !< [0x070-0x073] Timeout threshold for read status command */\r\n    uint32_t commandInterval;               /* !< [0x074-0x077] CS deselect interval between two commands */\r\n    fc_flexspi_dll_time_t dataValidTime[2]; /* !< [0x078-0x07b] CLK edge to data valid time for PORT A and PORT B */\r\n    uint16_t busyOffset;                    /* !< [0x07c-0x07d] Busy offset, valid value: 0-31 */\r\n    uint16_t busyBitPolarity; /* !< [0x07e-0x07f] Busy flag polarity, 0 - busy flag is 1 when flash device is busy, 1 -\r\n     busy flag is 0 when flash device is busy */\r\n    uint32_t lookupTable[64]; /* !< [0x080-0x17f] Lookup table holds Flash command sequences */\r\n    fc_flexspi_lut_seq_t lutCustomSeq[12]; /* !< [0x180-0x1af] Customizable LUT Sequences */\r\n    uint32_t reserved4[4];                 /* !< [0x1b0-0x1bf] Reserved for future use */\r\n} fc_flexspi_mem_config_t;\r\n/*\r\n *  Serial NOR configuration block\r\n */\r\ntypedef struct _fc_flexspi_nor_config\r\n{\r\n#if defined(__ARMCC_VERSION) || defined(__ICCARM__)\r\n    uint8_t padding[0x400];            /* !< Padding for MDK and IAR */\r\n#endif\r\n    fc_flexspi_mem_config_t memConfig; /* !< Common memory configuration info via FlexSPI */\r\n    uint32_t pageSize;                 /* !< Page size of Serial NOR */\r\n    uint32_t sectorSize;               /* !< Sector size of Serial NOR */\r\n    uint8_t ipcmdSerialClkFreq;        /* !< Clock frequency for IP command */\r\n    uint8_t isUniformBlockSize;        /* !< Sector/Block size is the same */\r\n    uint8_t isDataOrderSwapped;        /* !< Data order (D0, D1, D2, D3) is swapped (D1,D0, D3, D2) */\r\n    uint8_t reserved0[1];              /* !< Reserved for future use */\r\n    uint8_t serialNorType;             /* !< Serial NOR Flash type: 0/1/2/3 */\r\n    uint8_t needExitNoCmdMode;         /* !< Need to exit NoCmd mode before other IP command */\r\n    uint8_t halfClkForNonReadCmd;      /* !< Half the Serial Clock for non-read command: true/false */\r\n    uint8_t needRestoreNoCmdMode;      /* !< Need to Restore NoCmd mode after IP commmand execution */\r\n    uint32_t blockSize;                /* !< Block size */\r\n    uint32_t flashStateCtx;            /* !< Flash State Context */\r\n    uint32_t reserve2[10];             /* !< Reserved for future use */\r\n    uint32_t fcb_fill[0x280];          /* !< Fill */\r\n} fc_flexspi_nor_config_t;\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n#endif /* __FLASH_CONFIG__ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/frdm-rw612-xpresso-freertos-builtin JLink Debug.launch",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<launchConfiguration type=\"com.nxp.mcuxpresso.core.debug.support.segger.launchConfigurationType\">\n    <stringAttribute key=\"com.crt.ctrlcenter.OFSemuDetails\" value=\"JLink1067289795\"/>\n    <booleanAttribute key=\"com.crt.ctrlcenter.mainBreakIsHardware\" value=\"true\"/>\n    <stringAttribute key=\"com.crt.ctrlcenter.serialNumber\" value=\"USB 1067289795\"/>\n    <listAttribute key=\"com.crt.ctrlcenter.symbolsAndImagesGroupSettings\"/>\n    <intAttribute key=\"com.nxp.mcuxpresso.core.debug.support.segger.launches.JLinkLaunchConfigHandler.version\" value=\"2\"/>\n    <booleanAttribute key=\"com.nxp.mcuxpresso.flash.clear.console\" value=\"true\"/>\n    <booleanAttribute key=\"com.nxp.mcuxpresso.flash.confirm\" value=\"false\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.ide.probe.manufacturer\" value=\"SEGGER\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.ide.probe.name\" value=\"J-Link MCU-Link\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.ide.probe.nickname\" value=\"\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.ide.probe.type\" value=\"USB\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.jlink.flash.base.address\" value=\"0x8000000\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.jlink.flash.executable\" value=\"hex\"/>\n    <booleanAttribute key=\"com.nxp.mcuxpresso.jlink.flash.halt.target\" value=\"true\"/>\n    <booleanAttribute key=\"com.nxp.mcuxpresso.jlink.flash.reset.target\" value=\"true\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.segger.SettingsFile\" value=\"${ProjDirPath}/${ConfigName}/${LaunchConfigName} SettingsFile.jlink\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.segger.auto.startup\" value=\"auto\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.segger.device\" value=\"RW612\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.segger.endian\" value=\"little\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.segger.halt.target\" value=\"-halt\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.segger.if\" value=\"SWD\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.segger.init.register\" value=\"-noir\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.segger.jlinkscriptfile\" value=\"\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.segger.options\" value=\"\"/>\n    <intAttribute key=\"com.nxp.mcuxpresso.segger.port\" value=\"2331\"/>\n    <booleanAttribute key=\"com.nxp.mcuxpresso.segger.powertarget 50\" value=\"false\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.segger.reset\" value=\"true;\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.segger.rtos\" value=\"true;GDBServer/RTOSPlugin_FreeRTOS\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.segger.select\" value=\"USB=1067289795\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.segger.silent\" value=\"-nosilent\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.segger.singlerun\" value=\"-singlerun\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.segger.speed\" value=\"fixed 4000\"/>\n    <intAttribute key=\"com.nxp.mcuxpresso.segger.swoport\" value=\"2332\"/>\n    <intAttribute key=\"com.nxp.mcuxpresso.segger.telnetport\" value=\"2333\"/>\n    <stringAttribute key=\"com.nxp.mcuxpresso.segger.verify\" value=\"-vd\"/>\n    <stringAttribute key=\"disconnect\" value=\"Run\"/>\n    <stringAttribute key=\"launch.config.handler\" value=\"com.nxp.mcuxpresso.core.debug.support.segger.launches.JLinkLaunchConfigHandler\"/>\n    <intAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.delay\" value=\"0\"/>\n    <booleanAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.doHalt\" value=\"false\"/>\n    <booleanAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.doReset\" value=\"false\"/>\n    <stringAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.imageFileName\" value=\"\"/>\n    <stringAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.imageOffset\" value=\"\"/>\n    <stringAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.initCommands\" value=\"monitor reset\"/>\n    <stringAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.ipAddress\" value=\"localhost\"/>\n    <stringAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.jtagDeviceId\" value=\"org.eclipse.cdt.debug.gdbjtag.core.jtagdevice.genericDevice\"/>\n    <booleanAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.loadImage\" value=\"true\"/>\n    <booleanAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.loadSymbols\" value=\"true\"/>\n    <stringAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.pcRegister\" value=\"\"/>\n    <intAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.portNumber\" value=\"2331\"/>\n    <stringAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.runCommands\" value=\"\"/>\n    <booleanAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.setPcRegister\" value=\"false\"/>\n    <booleanAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.setResume\" value=\"false\"/>\n    <booleanAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.setStopAt\" value=\"true\"/>\n    <stringAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.stopAt\" value=\"main\"/>\n    <stringAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName\" value=\"\"/>\n    <stringAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset\" value=\"\"/>\n    <booleanAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.useFileForImage\" value=\"false\"/>\n    <booleanAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols\" value=\"false\"/>\n    <booleanAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage\" value=\"true\"/>\n    <booleanAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols\" value=\"true\"/>\n    <booleanAttribute key=\"org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget\" value=\"true\"/>\n    <stringAttribute key=\"org.eclipse.cdt.dsf.gdb.DEBUG_NAME\" value=\"arm-none-eabi-gdb\"/>\n    <booleanAttribute key=\"org.eclipse.cdt.dsf.gdb.DEBUG_ON_FORK\" value=\"false\"/>\n    <booleanAttribute key=\"org.eclipse.cdt.dsf.gdb.EXTERNAL_CONSOLE\" value=\"false\"/>\n    <stringAttribute key=\"org.eclipse.cdt.dsf.gdb.GDB_INIT\" value=\"\"/>\n    <booleanAttribute key=\"org.eclipse.cdt.dsf.gdb.NON_STOP\" value=\"false\"/>\n    <booleanAttribute key=\"org.eclipse.cdt.dsf.gdb.REVERSE\" value=\"false\"/>\n    <stringAttribute key=\"org.eclipse.cdt.dsf.gdb.REVERSE_MODE\" value=\"UseSoftTrace\"/>\n    <stringAttribute key=\"org.eclipse.cdt.dsf.gdb.TRACEPOINT_MODE\" value=\"TP_NORMAL_ONLY\"/>\n    <booleanAttribute key=\"org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND\" value=\"false\"/>\n    <intAttribute key=\"org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR\" value=\"2\"/>\n    <stringAttribute key=\"org.eclipse.cdt.launch.DEBUGGER_ID\" value=\"gdb\"/>\n    <stringAttribute key=\"org.eclipse.cdt.launch.DEBUGGER_START_MODE\" value=\"remote\"/>\n    <stringAttribute key=\"org.eclipse.cdt.launch.PROGRAM_NAME\" value=\"Debug/frdm-rw612-xpresso-freertos-builtin.axf\"/>\n    <stringAttribute key=\"org.eclipse.cdt.launch.PROJECT_ATTR\" value=\"frdm-rw612-xpresso-freertos-builtin\"/>\n    <booleanAttribute key=\"org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR\" value=\"false\"/>\n    <stringAttribute key=\"org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR\" value=\"com.crt.advproject.config.exe.debug.252552941\"/>\n    <booleanAttribute key=\"org.eclipse.debug.core.ATTR_FORCE_SYSTEM_CONSOLE_ENCODING\" value=\"false\"/>\n    <listAttribute key=\"org.eclipse.debug.core.MAPPED_RESOURCE_PATHS\">\n        <listEntry value=\"/frdm-rw612-xpresso-freertos-builtin\"/>\n    </listAttribute>\n    <listAttribute key=\"org.eclipse.debug.core.MAPPED_RESOURCE_TYPES\">\n        <listEntry value=\"4\"/>\n    </listAttribute>\n    <mapAttribute key=\"org.eclipse.debug.core.preferred_launchers\">\n        <mapEntry key=\"[debug]\" value=\"com.nxp.mcuxpresso.core.debug.support.segger.dsfLaunchDelegate\"/>\n    </mapAttribute>\n    <stringAttribute key=\"org.eclipse.dsf.launch.MEMORY_BLOCKS\" value=\"&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&lt;memoryBlockExpressionList context=&quot;reserved-for-future-use&quot;/&gt;\"/>\n    <stringAttribute key=\"process_factory_id\" value=\"com.nxp.mcuxpresso.core.debug.override.MCXProcessFactory\"/>\n    <booleanAttribute key=\"semihost\" value=\"true\"/>\n    <stringAttribute key=\"start.server\" value=\"true\"/>\n</launchConfiguration>\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/frdm-rw612-xpresso-freertos-builtin.mex",
    "content": "<?xml version=\"1.0\" encoding= \"UTF-8\" ?>\n<configuration name=\"RW612\" xsi:schemaLocation=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_17 http://mcuxpresso.nxp.com/XSD/mex_configuration_17.xsd\" uuid=\"97025c7c-9d28-4956-b425-25e2a6e4a00a\" version=\"17\" xmlns=\"http://mcuxpresso.nxp.com/XSD/mex_configuration_17\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n   <common>\n      <processor>RW612</processor>\n      <package>RW612ETA2I</package>\n      <mcu_data>ksdk2_0</mcu_data>\n      <cores selected=\"cm33\">\n         <core name=\"Cortex-M33\" id=\"cm33\" description=\"\"/>\n      </cores>\n      <description>Configuration imported from frdm-rw612-xpresso-freertos-builtin</description>\n   </common>\n   <preferences>\n      <validate_boot_init_only>true</validate_boot_init_only>\n      <generate_code_modified_registers_only>false</generate_code_modified_registers_only>\n      <update_include_paths>true</update_include_paths>\n      <generate_registers_defines>false</generate_registers_defines>\n   </preferences>\n   <tools>\n      <pins name=\"Pins\" version=\"17.0\" enabled=\"false\" update_project_code=\"true\">\n         <pins_profile>\n            <processor_version>N/A</processor_version>\n         </pins_profile>\n         <functions_list/>\n      </pins>\n      <clocks name=\"Clocks\" version=\"15.0\" enabled=\"true\" update_project_code=\"true\">\n         <clocks_profile>\n            <processor_version>24.12.10</processor_version>\n         </clocks_profile>\n         <clock_configurations>\n            <clock_configuration name=\"BOARD_BootClockRUN\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"CAU.xtal_in\" description=\"&apos;XTALIN&apos; (Pins tool id: CAU.xtal_in, Clocks tool id: CAU.XTALIN) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"CAU.xtal_out\" description=\"&apos;XTALOUT&apos; (Pins tool id: CAU.xtal_out, Clocks tool id: CAU.XTALOUT) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"PMU.xtal32k_in\" description=\"&apos;AON_XTAL32K_IN&apos; (Pins tool id: PMU.xtal32k_in, Clocks tool id: PMU.AON_XTAL32K_IN) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"PMU.xtal32k_out\" description=\"&apos;AON_XTAL32K_OUT&apos; (Pins tool id: PMU.xtal32k_out, Clocks tool id: PMU.AON_XTAL32K_OUT) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Clocks initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.power\" description=\"Clocks initialization requires the POWER Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.clock\" description=\"Clocks initialization requires the CLOCK Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockRUN\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"CAU.XTAL_OSC.outFreq\" value=\"40 MHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"audio_pll_clk.outFreq\" value=\"4246732800/345600007 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"aux0_pll_clk.outFreq\" value=\"260 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"avpll_ch1_clkout.outFreq\" value=\"4246732800/345600007 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"avpll_ch2_clkout.outFreq\" value=\"1415577600/22118401 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"cau_slp_clk.outFreq\" value=\"4 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"clk_32k.outFreq\" value=\"32 kHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"clk_pmu_sys.outFreq\" value=\"52 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"els_128m_clk.outFreq\" value=\"128 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"els_256m_clk.outFreq\" value=\"256 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"els_64m_clk.outFreq\" value=\"64 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"ffro_clk_div4.outFreq\" value=\"640/53 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"hclk.outFreq\" value=\"260 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"lposc_clk_i.outFreq\" value=\"1 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"main_clk.outFreq\" value=\"260 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"main_pll_clk.outFreq\" value=\"260 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"otp_fuse_32m_clk.outFreq\" value=\"32 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"refclk_phy.outFreq\" value=\"40 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"sfro_clk_i.outFreq\" value=\"16 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"systick_fclk.outFreq\" value=\"260 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"t3pll_mci_256m.outFreq\" value=\"256 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"t3pll_mci_48_60m_irc.outFreq\" value=\"2560/53 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"tcpu_mci_clk.outFreq\" value=\"260 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"tddr_mci_flexspi_clk.outFreq\" value=\"320 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"CLKCTL0.MAINCLKSELB.sel\" value=\"CLKCTL0.MAINPLLCLKDIV\" locked=\"false\"/>\n                  <setting id=\"CLKCTL0.MAINPLLCLKDIV.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CLKCTL0.PMUFCLKDIV.scale\" value=\"5\" locked=\"true\"/>\n                  <setting id=\"CLKCTL0.SYSCPUAHBCLKDIV.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CLKCTL0.SYSTICKFCLKSEL.sel\" value=\"CLKCTL0.SYSTICKFCLKDIV\" locked=\"false\"/>\n                  <setting id=\"CLKCTL0.WDT0FCLKSEL.sel\" value=\"NO_CLOCK\" locked=\"false\"/>\n                  <setting id=\"CLKCTL1.FRGPLLCLKDIV.scale\" value=\"13\" locked=\"true\"/>\n                  <setting id=\"CLKCTL1.OSEVENTFCLKSEL.sel\" value=\"NO_CLOCK\" locked=\"false\"/>\n                  <setting id=\"REFCLK_SYS_Config\" value=\"Disabled\" locked=\"false\"/>\n                  <setting id=\"SYSCTL2.CH1_M.scale\" value=\"2621440\" locked=\"true\"/>\n                  <setting id=\"SYSCTL2.CH1_OFFSET_DIV.scale\" value=\"345600007\" locked=\"true\"/>\n                  <setting id=\"SYSCTL2.CH2_M.scale\" value=\"2621440\" locked=\"true\"/>\n                  <setting id=\"SYSCTL2.CH2_OFFSET_DIV.scale\" value=\"66355203\" locked=\"true\"/>\n                  <setting id=\"SYSCTL2.T3_FBDIV.scale\" value=\"64\" locked=\"true\"/>\n                  <setting id=\"SYSCTL2.T3_REFDIV.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"T3PLL_MCI_213P3M_Config\" value=\"Disabled\" locked=\"false\"/>\n                  <setting id=\"T3PLL_MCI_FLEXSPI_Config\" value=\"Disabled\" locked=\"false\"/>\n                  <setting id=\"TCPU_MCI_FLEXSPI_CLK_Config\" value=\"Disabled\" locked=\"false\"/>\n                  <setting id=\"TDDR_MCI_ENET_CLK_Config\" value=\"Disabled\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>true</called_from_default_init>\n            </clock_configuration>\n            <clock_configuration name=\"BOARD_BootClockLPR\" id_prefix=\"\" prefix_user_defined=\"false\">\n               <description></description>\n               <options/>\n               <dependencies>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"CAU.xtal_in\" description=\"&apos;XTALIN&apos; (Pins tool id: CAU.xtal_in, Clocks tool id: CAU.XTALIN) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockLPR\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"CAU.xtal_out\" description=\"&apos;XTALOUT&apos; (Pins tool id: CAU.xtal_out, Clocks tool id: CAU.XTALOUT) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockLPR\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"PMU.xtal32k_in\" description=\"&apos;AON_XTAL32K_IN&apos; (Pins tool id: PMU.xtal32k_in, Clocks tool id: PMU.AON_XTAL32K_IN) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockLPR\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"PeripheralUnifiedSignal\" resourceId=\"PMU.xtal32k_out\" description=\"&apos;AON_XTAL32K_OUT&apos; (Pins tool id: PMU.xtal32k_out, Clocks tool id: PMU.AON_XTAL32K_OUT) needs to be routed\" problem_level=\"1\" source=\"Clocks:BOARD_BootClockLPR\">\n                     <feature name=\"routed\" evaluation=\"\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.common\" description=\"Clocks initialization requires the COMMON Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockLPR\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.power\" description=\"Clocks initialization requires the POWER Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockLPR\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n                  <dependency resourceType=\"SWComponent\" resourceId=\"platform.drivers.clock\" description=\"Clocks initialization requires the CLOCK Driver in the project.\" problem_level=\"2\" source=\"Clocks:BOARD_BootClockLPR\">\n                     <feature name=\"enabled\" evaluation=\"equal\" configuration=\"cm33\">\n                        <data>true</data>\n                     </feature>\n                  </dependency>\n               </dependencies>\n               <clock_sources>\n                  <clock_source id=\"CAU.XTAL_OSC.outFreq\" value=\"40 MHz\" locked=\"false\" enabled=\"true\"/>\n               </clock_sources>\n               <clock_outputs>\n                  <clock_output id=\"aux0_pll_clk.outFreq\" value=\"260 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"clk_32k.outFreq\" value=\"32 kHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"clk_pmu_sys.outFreq\" value=\"52 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"els_128m_clk.outFreq\" value=\"128 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"els_256m_clk.outFreq\" value=\"256 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"els_64m_clk.outFreq\" value=\"64 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"hclk.outFreq\" value=\"260 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"main_clk.outFreq\" value=\"260 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"main_pll_clk.outFreq\" value=\"260 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"otp_fuse_32m_clk.outFreq\" value=\"32 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"refclk_phy.outFreq\" value=\"40 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"refclk_sys.outFreq\" value=\"40 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"sfro_clk_i.outFreq\" value=\"16 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"systick_fclk.outFreq\" value=\"260 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"t3pll_mci_256m.outFreq\" value=\"256 MHz\" locked=\"false\" accuracy=\"\"/>\n                  <clock_output id=\"tcpu_mci_clk.outFreq\" value=\"260 MHz\" locked=\"false\" accuracy=\"\"/>\n               </clock_outputs>\n               <clock_settings>\n                  <setting id=\"AVPLL_Init_Config\" value=\"Disabled\" locked=\"false\"/>\n                  <setting id=\"CAU_SLP_CLK_Config\" value=\"Disabled\" locked=\"false\"/>\n                  <setting id=\"CLKCTL0.MAINCLKSELB.sel\" value=\"CLKCTL0.MAINPLLCLKDIV\" locked=\"false\"/>\n                  <setting id=\"CLKCTL0.MAINPLLCLKDIV.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"CLKCTL0.SYSOSCBYPASS_SEL.sel\" value=\"NO_CLOCK\" locked=\"false\"/>\n                  <setting id=\"CLKCTL0.SYSTICKFCLKSEL.sel\" value=\"CLKCTL0.SYSTICKFCLKDIV\" locked=\"false\"/>\n                  <setting id=\"CLKCTL1.CLKOUTSEL1.sel\" value=\"CLKCTL1.CLKOUTSEL0\" locked=\"false\"/>\n                  <setting id=\"CLKCTL1.CLKOUTSEL2.sel\" value=\"CLKCTL1.CLKOUTSEL1\" locked=\"false\"/>\n                  <setting id=\"CLKCTL1.FRGPLLCLKDIV.scale\" value=\"13\" locked=\"true\"/>\n                  <setting id=\"SYSCTL2.T3_FBDIV.scale\" value=\"64\" locked=\"false\"/>\n                  <setting id=\"SYSCTL2.TCPU_FBDIV.scale\" value=\"78\" locked=\"true\"/>\n                  <setting id=\"SYSCTL2.TCPU_MCI_FLEXSPI_CLK_DIV.scale\" value=\"10\" locked=\"true\"/>\n                  <setting id=\"SYSCTL2.TCPU_REFDIV.scale\" value=\"1\" locked=\"true\"/>\n                  <setting id=\"T3PLL_MCI_213P3M_Config\" value=\"Disabled\" locked=\"false\"/>\n                  <setting id=\"T3PLL_MCI_48_60M_IRC_Config\" value=\"Disabled\" locked=\"false\"/>\n                  <setting id=\"T3PLL_MCI_FLEXSPI_Config\" value=\"Disabled\" locked=\"false\"/>\n                  <setting id=\"TCPU_MCI_FLEXSPI_CLK_Config\" value=\"Disabled\" locked=\"false\"/>\n                  <setting id=\"TDDR_MCI_ENET_CLK_Config\" value=\"Disabled\" locked=\"false\"/>\n                  <setting id=\"TDDR_MCI_FLEXSPI_CLK_Config\" value=\"Disabled\" locked=\"false\"/>\n                  <setting id=\"TDDR_PLL_Init_Config\" value=\"Disabled\" locked=\"false\"/>\n               </clock_settings>\n               <called_from_default_init>false</called_from_default_init>\n            </clock_configuration>\n         </clock_configurations>\n      </clocks>\n      <dcdx name=\"DCDx\" version=\"4.0\" enabled=\"false\" update_project_code=\"true\">\n         <dcdx_profile>\n            <processor_version>N/A</processor_version>\n         </dcdx_profile>\n         <dcdx_configurations/>\n      </dcdx>\n      <periphs name=\"Peripherals\" version=\"15.0\" enabled=\"false\" update_project_code=\"true\">\n         <peripherals_profile>\n            <processor_version>N/A</processor_version>\n         </peripherals_profile>\n         <functional_groups/>\n         <components/>\n      </periphs>\n      <tee name=\"TEE\" version=\"8.0\" enabled=\"false\" update_project_code=\"true\">\n         <tee_profile>\n            <processor_version>N/A</processor_version>\n         </tee_profile>\n      </tee>\n   </tools>\n</configuration>"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/croutine.c",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n#include \"FreeRTOS.h\"\r\n#include \"task.h\"\r\n#include \"croutine.h\"\r\n\r\n/* Remove the whole file is co-routines are not being used. */\r\n#if ( configUSE_CO_ROUTINES != 0 )\r\n\r\n/*\r\n * Some kernel aware debuggers require data to be viewed to be global, rather\r\n * than file scope.\r\n */\r\n    #ifdef portREMOVE_STATIC_QUALIFIER\r\n        #define static\r\n    #endif\r\n\r\n\r\n/* Lists for ready and blocked co-routines. --------------------*/\r\n    static List_t pxReadyCoRoutineLists[ configMAX_CO_ROUTINE_PRIORITIES ]; /**< Prioritised ready co-routines. */\r\n    static List_t xDelayedCoRoutineList1;                                   /**< Delayed co-routines. */\r\n    static List_t xDelayedCoRoutineList2;                                   /**< Delayed co-routines (two lists are used - one for delays that have overflowed the current tick count. */\r\n    static List_t * pxDelayedCoRoutineList = NULL;                          /**< Points to the delayed co-routine list currently being used. */\r\n    static List_t * pxOverflowDelayedCoRoutineList = NULL;                  /**< Points to the delayed co-routine list currently being used to hold co-routines that have overflowed the current tick count. */\r\n    static List_t xPendingReadyCoRoutineList;                               /**< Holds co-routines that have been readied by an external event.  They cannot be added directly to the ready lists as the ready lists cannot be accessed by interrupts. */\r\n\r\n/* Other file private variables. --------------------------------*/\r\n    CRCB_t * pxCurrentCoRoutine = NULL;\r\n    static UBaseType_t uxTopCoRoutineReadyPriority = 0;\r\n    static TickType_t xCoRoutineTickCount = 0, xLastTickCount = 0, xPassedTicks = 0;\r\n\r\n/* The initial state of the co-routine when it is created. */\r\n    #define corINITIAL_STATE    ( 0 )\r\n\r\n/*\r\n * Place the co-routine represented by pxCRCB into the appropriate ready queue\r\n * for the priority.  It is inserted at the end of the list.\r\n *\r\n * This macro accesses the co-routine ready lists and therefore must not be\r\n * used from within an ISR.\r\n */\r\n    #define prvAddCoRoutineToReadyQueue( pxCRCB )                                                                               \\\r\n    do {                                                                                                                        \\\r\n        if( ( pxCRCB )->uxPriority > uxTopCoRoutineReadyPriority )                                                              \\\r\n        {                                                                                                                       \\\r\n            uxTopCoRoutineReadyPriority = ( pxCRCB )->uxPriority;                                                               \\\r\n        }                                                                                                                       \\\r\n        vListInsertEnd( ( List_t * ) &( pxReadyCoRoutineLists[ ( pxCRCB )->uxPriority ] ), &( ( pxCRCB )->xGenericListItem ) ); \\\r\n    } while( 0 )\r\n\r\n/*\r\n * Utility to ready all the lists used by the scheduler.  This is called\r\n * automatically upon the creation of the first co-routine.\r\n */\r\n    static void prvInitialiseCoRoutineLists( void );\r\n\r\n/*\r\n * Co-routines that are readied by an interrupt cannot be placed directly into\r\n * the ready lists (there is no mutual exclusion).  Instead they are placed in\r\n * in the pending ready list in order that they can later be moved to the ready\r\n * list by the co-routine scheduler.\r\n */\r\n    static void prvCheckPendingReadyList( void );\r\n\r\n/*\r\n * Macro that looks at the list of co-routines that are currently delayed to\r\n * see if any require waking.\r\n *\r\n * Co-routines are stored in the queue in the order of their wake time -\r\n * meaning once one co-routine has been found whose timer has not expired\r\n * we need not look any further down the list.\r\n */\r\n    static void prvCheckDelayedList( void );\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n    BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode,\r\n                                 UBaseType_t uxPriority,\r\n                                 UBaseType_t uxIndex )\r\n    {\r\n        BaseType_t xReturn;\r\n        CRCB_t * pxCoRoutine;\r\n\r\n        traceENTER_xCoRoutineCreate( pxCoRoutineCode, uxPriority, uxIndex );\r\n\r\n        /* Allocate the memory that will store the co-routine control block. */\r\n        /* MISRA Ref 11.5.1 [Malloc memory assignment] */\r\n        /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n        /* coverity[misra_c_2012_rule_11_5_violation] */\r\n        pxCoRoutine = ( CRCB_t * ) pvPortMalloc( sizeof( CRCB_t ) );\r\n\r\n        if( pxCoRoutine )\r\n        {\r\n            /* If pxCurrentCoRoutine is NULL then this is the first co-routine to\r\n            * be created and the co-routine data structures need initialising. */\r\n            if( pxCurrentCoRoutine == NULL )\r\n            {\r\n                pxCurrentCoRoutine = pxCoRoutine;\r\n                prvInitialiseCoRoutineLists();\r\n            }\r\n\r\n            /* Check the priority is within limits. */\r\n            if( uxPriority >= configMAX_CO_ROUTINE_PRIORITIES )\r\n            {\r\n                uxPriority = configMAX_CO_ROUTINE_PRIORITIES - 1;\r\n            }\r\n\r\n            /* Fill out the co-routine control block from the function parameters. */\r\n            pxCoRoutine->uxState = corINITIAL_STATE;\r\n            pxCoRoutine->uxPriority = uxPriority;\r\n            pxCoRoutine->uxIndex = uxIndex;\r\n            pxCoRoutine->pxCoRoutineFunction = pxCoRoutineCode;\r\n\r\n            /* Initialise all the other co-routine control block parameters. */\r\n            vListInitialiseItem( &( pxCoRoutine->xGenericListItem ) );\r\n            vListInitialiseItem( &( pxCoRoutine->xEventListItem ) );\r\n\r\n            /* Set the co-routine control block as a link back from the ListItem_t.\r\n             * This is so we can get back to the containing CRCB from a generic item\r\n             * in a list. */\r\n            listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xGenericListItem ), pxCoRoutine );\r\n            listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xEventListItem ), pxCoRoutine );\r\n\r\n            /* Event lists are always in priority order. */\r\n            listSET_LIST_ITEM_VALUE( &( pxCoRoutine->xEventListItem ), ( ( TickType_t ) configMAX_CO_ROUTINE_PRIORITIES - ( TickType_t ) uxPriority ) );\r\n\r\n            /* Now the co-routine has been initialised it can be added to the ready\r\n             * list at the correct priority. */\r\n            prvAddCoRoutineToReadyQueue( pxCoRoutine );\r\n\r\n            xReturn = pdPASS;\r\n        }\r\n        else\r\n        {\r\n            xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;\r\n        }\r\n\r\n        traceRETURN_xCoRoutineCreate( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay,\r\n                                     List_t * pxEventList )\r\n    {\r\n        TickType_t xTimeToWake;\r\n\r\n        traceENTER_vCoRoutineAddToDelayedList( xTicksToDelay, pxEventList );\r\n\r\n        /* Calculate the time to wake - this may overflow but this is\r\n         * not a problem. */\r\n        xTimeToWake = xCoRoutineTickCount + xTicksToDelay;\r\n\r\n        /* We must remove ourselves from the ready list before adding\r\n         * ourselves to the blocked list as the same list item is used for\r\n         * both lists. */\r\n        ( void ) uxListRemove( ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) );\r\n\r\n        /* The list item will be inserted in wake time order. */\r\n        listSET_LIST_ITEM_VALUE( &( pxCurrentCoRoutine->xGenericListItem ), xTimeToWake );\r\n\r\n        if( xTimeToWake < xCoRoutineTickCount )\r\n        {\r\n            /* Wake time has overflowed.  Place this item in the\r\n             * overflow list. */\r\n            vListInsert( ( List_t * ) pxOverflowDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) );\r\n        }\r\n        else\r\n        {\r\n            /* The wake time has not overflowed, so we can use the\r\n             * current block list. */\r\n            vListInsert( ( List_t * ) pxDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) );\r\n        }\r\n\r\n        if( pxEventList )\r\n        {\r\n            /* Also add the co-routine to an event list.  If this is done then the\r\n             * function must be called with interrupts disabled. */\r\n            vListInsert( pxEventList, &( pxCurrentCoRoutine->xEventListItem ) );\r\n        }\r\n\r\n        traceRETURN_vCoRoutineAddToDelayedList();\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    static void prvCheckPendingReadyList( void )\r\n    {\r\n        /* Are there any co-routines waiting to get moved to the ready list?  These\r\n         * are co-routines that have been readied by an ISR.  The ISR cannot access\r\n         * the ready lists itself. */\r\n        while( listLIST_IS_EMPTY( &xPendingReadyCoRoutineList ) == pdFALSE )\r\n        {\r\n            CRCB_t * pxUnblockedCRCB;\r\n\r\n            /* The pending ready list can be accessed by an ISR. */\r\n            portDISABLE_INTERRUPTS();\r\n            {\r\n                pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyCoRoutineList ) );\r\n                ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) );\r\n            }\r\n            portENABLE_INTERRUPTS();\r\n\r\n            ( void ) uxListRemove( &( pxUnblockedCRCB->xGenericListItem ) );\r\n            prvAddCoRoutineToReadyQueue( pxUnblockedCRCB );\r\n        }\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    static void prvCheckDelayedList( void )\r\n    {\r\n        CRCB_t * pxCRCB;\r\n\r\n        xPassedTicks = xTaskGetTickCount() - xLastTickCount;\r\n\r\n        while( xPassedTicks )\r\n        {\r\n            xCoRoutineTickCount++;\r\n            xPassedTicks--;\r\n\r\n            /* If the tick count has overflowed we need to swap the ready lists. */\r\n            if( xCoRoutineTickCount == 0 )\r\n            {\r\n                List_t * pxTemp;\r\n\r\n                /* Tick count has overflowed so we need to swap the delay lists.  If there are\r\n                 * any items in pxDelayedCoRoutineList here then there is an error! */\r\n                pxTemp = pxDelayedCoRoutineList;\r\n                pxDelayedCoRoutineList = pxOverflowDelayedCoRoutineList;\r\n                pxOverflowDelayedCoRoutineList = pxTemp;\r\n            }\r\n\r\n            /* See if this tick has made a timeout expire. */\r\n            while( listLIST_IS_EMPTY( pxDelayedCoRoutineList ) == pdFALSE )\r\n            {\r\n                pxCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedCoRoutineList );\r\n\r\n                if( xCoRoutineTickCount < listGET_LIST_ITEM_VALUE( &( pxCRCB->xGenericListItem ) ) )\r\n                {\r\n                    /* Timeout not yet expired. */\r\n                    break;\r\n                }\r\n\r\n                portDISABLE_INTERRUPTS();\r\n                {\r\n                    /* The event could have occurred just before this critical\r\n                     *  section.  If this is the case then the generic list item will\r\n                     *  have been moved to the pending ready list and the following\r\n                     *  line is still valid.  Also the pvContainer parameter will have\r\n                     *  been set to NULL so the following lines are also valid. */\r\n                    ( void ) uxListRemove( &( pxCRCB->xGenericListItem ) );\r\n\r\n                    /* Is the co-routine waiting on an event also? */\r\n                    if( pxCRCB->xEventListItem.pxContainer )\r\n                    {\r\n                        ( void ) uxListRemove( &( pxCRCB->xEventListItem ) );\r\n                    }\r\n                }\r\n                portENABLE_INTERRUPTS();\r\n\r\n                prvAddCoRoutineToReadyQueue( pxCRCB );\r\n            }\r\n        }\r\n\r\n        xLastTickCount = xCoRoutineTickCount;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    void vCoRoutineSchedule( void )\r\n    {\r\n        traceENTER_vCoRoutineSchedule();\r\n\r\n        /* Only run a co-routine after prvInitialiseCoRoutineLists() has been\r\n         * called.  prvInitialiseCoRoutineLists() is called automatically when a\r\n         * co-routine is created. */\r\n        if( pxDelayedCoRoutineList != NULL )\r\n        {\r\n            /* See if any co-routines readied by events need moving to the ready lists. */\r\n            prvCheckPendingReadyList();\r\n\r\n            /* See if any delayed co-routines have timed out. */\r\n            prvCheckDelayedList();\r\n\r\n            /* Find the highest priority queue that contains ready co-routines. */\r\n            while( listLIST_IS_EMPTY( &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ) )\r\n            {\r\n                if( uxTopCoRoutineReadyPriority == 0 )\r\n                {\r\n                    /* No more co-routines to check. */\r\n                    return;\r\n                }\r\n\r\n                --uxTopCoRoutineReadyPriority;\r\n            }\r\n\r\n            /* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the co-routines\r\n             * of the same priority get an equal share of the processor time. */\r\n            listGET_OWNER_OF_NEXT_ENTRY( pxCurrentCoRoutine, &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) );\r\n\r\n            /* Call the co-routine. */\r\n            ( pxCurrentCoRoutine->pxCoRoutineFunction )( pxCurrentCoRoutine, pxCurrentCoRoutine->uxIndex );\r\n        }\r\n\r\n        traceRETURN_vCoRoutineSchedule();\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    static void prvInitialiseCoRoutineLists( void )\r\n    {\r\n        UBaseType_t uxPriority;\r\n\r\n        for( uxPriority = 0; uxPriority < configMAX_CO_ROUTINE_PRIORITIES; uxPriority++ )\r\n        {\r\n            vListInitialise( ( List_t * ) &( pxReadyCoRoutineLists[ uxPriority ] ) );\r\n        }\r\n\r\n        vListInitialise( ( List_t * ) &xDelayedCoRoutineList1 );\r\n        vListInitialise( ( List_t * ) &xDelayedCoRoutineList2 );\r\n        vListInitialise( ( List_t * ) &xPendingReadyCoRoutineList );\r\n\r\n        /* Start with pxDelayedCoRoutineList using list1 and the\r\n         * pxOverflowDelayedCoRoutineList using list2. */\r\n        pxDelayedCoRoutineList = &xDelayedCoRoutineList1;\r\n        pxOverflowDelayedCoRoutineList = &xDelayedCoRoutineList2;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    BaseType_t xCoRoutineRemoveFromEventList( const List_t * pxEventList )\r\n    {\r\n        CRCB_t * pxUnblockedCRCB;\r\n        BaseType_t xReturn;\r\n\r\n        traceENTER_xCoRoutineRemoveFromEventList( pxEventList );\r\n\r\n        /* This function is called from within an interrupt.  It can only access\r\n         * event lists and the pending ready list.  This function assumes that a\r\n         * check has already been made to ensure pxEventList is not empty. */\r\n        pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList );\r\n        ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) );\r\n        vListInsertEnd( ( List_t * ) &( xPendingReadyCoRoutineList ), &( pxUnblockedCRCB->xEventListItem ) );\r\n\r\n        if( pxUnblockedCRCB->uxPriority >= pxCurrentCoRoutine->uxPriority )\r\n        {\r\n            xReturn = pdTRUE;\r\n        }\r\n        else\r\n        {\r\n            xReturn = pdFALSE;\r\n        }\r\n\r\n        traceRETURN_xCoRoutineRemoveFromEventList( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_CO_ROUTINES == 0 */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/event_groups.c",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n/* Standard includes. */\r\n#include <stdlib.h>\r\n\r\n/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining\r\n * all the API functions to use the MPU wrappers.  That should only be done when\r\n * task.h is included from an application file. */\r\n#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n/* FreeRTOS includes. */\r\n#include \"FreeRTOS.h\"\r\n#include \"task.h\"\r\n#include \"timers.h\"\r\n#include \"event_groups.h\"\r\n\r\n/* The MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined\r\n * for the header files above, but not in this file, in order to generate the\r\n * correct privileged Vs unprivileged linkage and placement. */\r\n#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\ntypedef struct EventGroupDef_t\r\n{\r\n    EventBits_t uxEventBits;\r\n    List_t xTasksWaitingForBits; /**< List of tasks waiting for a bit to be set. */\r\n\r\n    #if ( configUSE_TRACE_FACILITY == 1 )\r\n        UBaseType_t uxEventGroupNumber;\r\n    #endif\r\n\r\n    #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )\r\n        uint8_t ucStaticallyAllocated; /**< Set to pdTRUE if the event group is statically allocated to ensure no attempt is made to free the memory. */\r\n    #endif\r\n} EventGroup_t;\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n/*\r\n * Test the bits set in uxCurrentEventBits to see if the wait condition is met.\r\n * The wait condition is defined by xWaitForAllBits.  If xWaitForAllBits is\r\n * pdTRUE then the wait condition is met if all the bits set in uxBitsToWaitFor\r\n * are also set in uxCurrentEventBits.  If xWaitForAllBits is pdFALSE then the\r\n * wait condition is met if any of the bits set in uxBitsToWait for are also set\r\n * in uxCurrentEventBits.\r\n */\r\nstatic BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits,\r\n                                        const EventBits_t uxBitsToWaitFor,\r\n                                        const BaseType_t xWaitForAllBits ) PRIVILEGED_FUNCTION;\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n\r\n    EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer )\r\n    {\r\n        EventGroup_t * pxEventBits;\r\n\r\n        traceENTER_xEventGroupCreateStatic( pxEventGroupBuffer );\r\n\r\n        /* A StaticEventGroup_t object must be provided. */\r\n        configASSERT( pxEventGroupBuffer );\r\n\r\n        #if ( configASSERT_DEFINED == 1 )\r\n        {\r\n            /* Sanity check that the size of the structure used to declare a\r\n             * variable of type StaticEventGroup_t equals the size of the real\r\n             * event group structure. */\r\n            volatile size_t xSize = sizeof( StaticEventGroup_t );\r\n            configASSERT( xSize == sizeof( EventGroup_t ) );\r\n        }\r\n        #endif /* configASSERT_DEFINED */\r\n\r\n        /* The user has provided a statically allocated event group - use it. */\r\n        /* MISRA Ref 11.3.1 [Misaligned access] */\r\n        /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */\r\n        /* coverity[misra_c_2012_rule_11_3_violation] */\r\n        pxEventBits = ( EventGroup_t * ) pxEventGroupBuffer;\r\n\r\n        if( pxEventBits != NULL )\r\n        {\r\n            pxEventBits->uxEventBits = 0;\r\n            vListInitialise( &( pxEventBits->xTasksWaitingForBits ) );\r\n\r\n            #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r\n            {\r\n                /* Both static and dynamic allocation can be used, so note that\r\n                 * this event group was created statically in case the event group\r\n                 * is later deleted. */\r\n                pxEventBits->ucStaticallyAllocated = pdTRUE;\r\n            }\r\n            #endif /* configSUPPORT_DYNAMIC_ALLOCATION */\r\n\r\n            traceEVENT_GROUP_CREATE( pxEventBits );\r\n        }\r\n        else\r\n        {\r\n            /* xEventGroupCreateStatic should only ever be called with\r\n             * pxEventGroupBuffer pointing to a pre-allocated (compile time\r\n             * allocated) StaticEventGroup_t variable. */\r\n            traceEVENT_GROUP_CREATE_FAILED();\r\n        }\r\n\r\n        traceRETURN_xEventGroupCreateStatic( pxEventBits );\r\n\r\n        return pxEventBits;\r\n    }\r\n\r\n#endif /* configSUPPORT_STATIC_ALLOCATION */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r\n\r\n    EventGroupHandle_t xEventGroupCreate( void )\r\n    {\r\n        EventGroup_t * pxEventBits;\r\n\r\n        traceENTER_xEventGroupCreate();\r\n\r\n        /* MISRA Ref 11.5.1 [Malloc memory assignment] */\r\n        /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n        /* coverity[misra_c_2012_rule_11_5_violation] */\r\n        pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) );\r\n\r\n        if( pxEventBits != NULL )\r\n        {\r\n            pxEventBits->uxEventBits = 0;\r\n            vListInitialise( &( pxEventBits->xTasksWaitingForBits ) );\r\n\r\n            #if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n            {\r\n                /* Both static and dynamic allocation can be used, so note this\r\n                 * event group was allocated statically in case the event group is\r\n                 * later deleted. */\r\n                pxEventBits->ucStaticallyAllocated = pdFALSE;\r\n            }\r\n            #endif /* configSUPPORT_STATIC_ALLOCATION */\r\n\r\n            traceEVENT_GROUP_CREATE( pxEventBits );\r\n        }\r\n        else\r\n        {\r\n            traceEVENT_GROUP_CREATE_FAILED();\r\n        }\r\n\r\n        traceRETURN_xEventGroupCreate( pxEventBits );\r\n\r\n        return pxEventBits;\r\n    }\r\n\r\n#endif /* configSUPPORT_DYNAMIC_ALLOCATION */\r\n/*-----------------------------------------------------------*/\r\n\r\nEventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup,\r\n                             const EventBits_t uxBitsToSet,\r\n                             const EventBits_t uxBitsToWaitFor,\r\n                             TickType_t xTicksToWait )\r\n{\r\n    EventBits_t uxOriginalBitValue, uxReturn;\r\n    EventGroup_t * pxEventBits = xEventGroup;\r\n    BaseType_t xAlreadyYielded;\r\n    BaseType_t xTimeoutOccurred = pdFALSE;\r\n\r\n    traceENTER_xEventGroupSync( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTicksToWait );\r\n\r\n    configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 );\r\n    configASSERT( uxBitsToWaitFor != 0 );\r\n    #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )\r\n    {\r\n        configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );\r\n    }\r\n    #endif\r\n\r\n    vTaskSuspendAll();\r\n    {\r\n        uxOriginalBitValue = pxEventBits->uxEventBits;\r\n\r\n        ( void ) xEventGroupSetBits( xEventGroup, uxBitsToSet );\r\n\r\n        if( ( ( uxOriginalBitValue | uxBitsToSet ) & uxBitsToWaitFor ) == uxBitsToWaitFor )\r\n        {\r\n            /* All the rendezvous bits are now set - no need to block. */\r\n            uxReturn = ( uxOriginalBitValue | uxBitsToSet );\r\n\r\n            /* Rendezvous always clear the bits.  They will have been cleared\r\n             * already unless this is the only task in the rendezvous. */\r\n            pxEventBits->uxEventBits &= ~uxBitsToWaitFor;\r\n\r\n            xTicksToWait = 0;\r\n        }\r\n        else\r\n        {\r\n            if( xTicksToWait != ( TickType_t ) 0 )\r\n            {\r\n                traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor );\r\n\r\n                /* Store the bits that the calling task is waiting for in the\r\n                 * task's event list item so the kernel knows when a match is\r\n                 * found.  Then enter the blocked state. */\r\n                vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | eventCLEAR_EVENTS_ON_EXIT_BIT | eventWAIT_FOR_ALL_BITS ), xTicksToWait );\r\n\r\n                /* This assignment is obsolete as uxReturn will get set after\r\n                 * the task unblocks, but some compilers mistakenly generate a\r\n                 * warning about uxReturn being returned without being set if the\r\n                 * assignment is omitted. */\r\n                uxReturn = 0;\r\n            }\r\n            else\r\n            {\r\n                /* The rendezvous bits were not set, but no block time was\r\n                 * specified - just return the current event bit value. */\r\n                uxReturn = pxEventBits->uxEventBits;\r\n                xTimeoutOccurred = pdTRUE;\r\n            }\r\n        }\r\n    }\r\n    xAlreadyYielded = xTaskResumeAll();\r\n\r\n    if( xTicksToWait != ( TickType_t ) 0 )\r\n    {\r\n        if( xAlreadyYielded == pdFALSE )\r\n        {\r\n            taskYIELD_WITHIN_API();\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        /* The task blocked to wait for its required bits to be set - at this\r\n         * point either the required bits were set or the block time expired.  If\r\n         * the required bits were set they will have been stored in the task's\r\n         * event list item, and they should now be retrieved then cleared. */\r\n        uxReturn = uxTaskResetEventItemValue();\r\n\r\n        if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 )\r\n        {\r\n            /* The task timed out, just return the current event bit value. */\r\n            taskENTER_CRITICAL();\r\n            {\r\n                uxReturn = pxEventBits->uxEventBits;\r\n\r\n                /* Although the task got here because it timed out before the\r\n                 * bits it was waiting for were set, it is possible that since it\r\n                 * unblocked another task has set the bits.  If this is the case\r\n                 * then it needs to clear the bits before exiting. */\r\n                if( ( uxReturn & uxBitsToWaitFor ) == uxBitsToWaitFor )\r\n                {\r\n                    pxEventBits->uxEventBits &= ~uxBitsToWaitFor;\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            taskEXIT_CRITICAL();\r\n\r\n            xTimeoutOccurred = pdTRUE;\r\n        }\r\n        else\r\n        {\r\n            /* The task unblocked because the bits were set. */\r\n        }\r\n\r\n        /* Control bits might be set as the task had blocked should not be\r\n         * returned. */\r\n        uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES;\r\n    }\r\n\r\n    traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred );\r\n\r\n    /* Prevent compiler warnings when trace macros are not used. */\r\n    ( void ) xTimeoutOccurred;\r\n\r\n    traceRETURN_xEventGroupSync( uxReturn );\r\n\r\n    return uxReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nEventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,\r\n                                 const EventBits_t uxBitsToWaitFor,\r\n                                 const BaseType_t xClearOnExit,\r\n                                 const BaseType_t xWaitForAllBits,\r\n                                 TickType_t xTicksToWait )\r\n{\r\n    EventGroup_t * pxEventBits = xEventGroup;\r\n    EventBits_t uxReturn, uxControlBits = 0;\r\n    BaseType_t xWaitConditionMet, xAlreadyYielded;\r\n    BaseType_t xTimeoutOccurred = pdFALSE;\r\n\r\n    traceENTER_xEventGroupWaitBits( xEventGroup, uxBitsToWaitFor, xClearOnExit, xWaitForAllBits, xTicksToWait );\r\n\r\n    /* Check the user is not attempting to wait on the bits used by the kernel\r\n     * itself, and that at least one bit is being requested. */\r\n    configASSERT( xEventGroup );\r\n    configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 );\r\n    configASSERT( uxBitsToWaitFor != 0 );\r\n    #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )\r\n    {\r\n        configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );\r\n    }\r\n    #endif\r\n\r\n    vTaskSuspendAll();\r\n    {\r\n        const EventBits_t uxCurrentEventBits = pxEventBits->uxEventBits;\r\n\r\n        /* Check to see if the wait condition is already met or not. */\r\n        xWaitConditionMet = prvTestWaitCondition( uxCurrentEventBits, uxBitsToWaitFor, xWaitForAllBits );\r\n\r\n        if( xWaitConditionMet != pdFALSE )\r\n        {\r\n            /* The wait condition has already been met so there is no need to\r\n             * block. */\r\n            uxReturn = uxCurrentEventBits;\r\n            xTicksToWait = ( TickType_t ) 0;\r\n\r\n            /* Clear the wait bits if requested to do so. */\r\n            if( xClearOnExit != pdFALSE )\r\n            {\r\n                pxEventBits->uxEventBits &= ~uxBitsToWaitFor;\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        else if( xTicksToWait == ( TickType_t ) 0 )\r\n        {\r\n            /* The wait condition has not been met, but no block time was\r\n             * specified, so just return the current value. */\r\n            uxReturn = uxCurrentEventBits;\r\n            xTimeoutOccurred = pdTRUE;\r\n        }\r\n        else\r\n        {\r\n            /* The task is going to block to wait for its required bits to be\r\n             * set.  uxControlBits are used to remember the specified behaviour of\r\n             * this call to xEventGroupWaitBits() - for use when the event bits\r\n             * unblock the task. */\r\n            if( xClearOnExit != pdFALSE )\r\n            {\r\n                uxControlBits |= eventCLEAR_EVENTS_ON_EXIT_BIT;\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n\r\n            if( xWaitForAllBits != pdFALSE )\r\n            {\r\n                uxControlBits |= eventWAIT_FOR_ALL_BITS;\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n\r\n            /* Store the bits that the calling task is waiting for in the\r\n             * task's event list item so the kernel knows when a match is\r\n             * found.  Then enter the blocked state. */\r\n            vTaskPlaceOnUnorderedEventList( &( pxEventBits->xTasksWaitingForBits ), ( uxBitsToWaitFor | uxControlBits ), xTicksToWait );\r\n\r\n            /* This is obsolete as it will get set after the task unblocks, but\r\n             * some compilers mistakenly generate a warning about the variable\r\n             * being returned without being set if it is not done. */\r\n            uxReturn = 0;\r\n\r\n            traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor );\r\n        }\r\n    }\r\n    xAlreadyYielded = xTaskResumeAll();\r\n\r\n    if( xTicksToWait != ( TickType_t ) 0 )\r\n    {\r\n        if( xAlreadyYielded == pdFALSE )\r\n        {\r\n            taskYIELD_WITHIN_API();\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        /* The task blocked to wait for its required bits to be set - at this\r\n         * point either the required bits were set or the block time expired.  If\r\n         * the required bits were set they will have been stored in the task's\r\n         * event list item, and they should now be retrieved then cleared. */\r\n        uxReturn = uxTaskResetEventItemValue();\r\n\r\n        if( ( uxReturn & eventUNBLOCKED_DUE_TO_BIT_SET ) == ( EventBits_t ) 0 )\r\n        {\r\n            taskENTER_CRITICAL();\r\n            {\r\n                /* The task timed out, just return the current event bit value. */\r\n                uxReturn = pxEventBits->uxEventBits;\r\n\r\n                /* It is possible that the event bits were updated between this\r\n                 * task leaving the Blocked state and running again. */\r\n                if( prvTestWaitCondition( uxReturn, uxBitsToWaitFor, xWaitForAllBits ) != pdFALSE )\r\n                {\r\n                    if( xClearOnExit != pdFALSE )\r\n                    {\r\n                        pxEventBits->uxEventBits &= ~uxBitsToWaitFor;\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n\r\n                xTimeoutOccurred = pdTRUE;\r\n            }\r\n            taskEXIT_CRITICAL();\r\n        }\r\n        else\r\n        {\r\n            /* The task unblocked because the bits were set. */\r\n        }\r\n\r\n        /* The task blocked so control bits may have been set. */\r\n        uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES;\r\n    }\r\n\r\n    traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred );\r\n\r\n    /* Prevent compiler warnings when trace macros are not used. */\r\n    ( void ) xTimeoutOccurred;\r\n\r\n    traceRETURN_xEventGroupWaitBits( uxReturn );\r\n\r\n    return uxReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nEventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup,\r\n                                  const EventBits_t uxBitsToClear )\r\n{\r\n    EventGroup_t * pxEventBits = xEventGroup;\r\n    EventBits_t uxReturn;\r\n\r\n    traceENTER_xEventGroupClearBits( xEventGroup, uxBitsToClear );\r\n\r\n    /* Check the user is not attempting to clear the bits used by the kernel\r\n     * itself. */\r\n    configASSERT( xEventGroup );\r\n    configASSERT( ( uxBitsToClear & eventEVENT_BITS_CONTROL_BYTES ) == 0 );\r\n\r\n    taskENTER_CRITICAL();\r\n    {\r\n        traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear );\r\n\r\n        /* The value returned is the event group value prior to the bits being\r\n         * cleared. */\r\n        uxReturn = pxEventBits->uxEventBits;\r\n\r\n        /* Clear the bits. */\r\n        pxEventBits->uxEventBits &= ~uxBitsToClear;\r\n    }\r\n    taskEXIT_CRITICAL();\r\n\r\n    traceRETURN_xEventGroupClearBits( uxReturn );\r\n\r\n    return uxReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) )\r\n\r\n    BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup,\r\n                                            const EventBits_t uxBitsToClear )\r\n    {\r\n        BaseType_t xReturn;\r\n\r\n        traceENTER_xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear );\r\n\r\n        traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear );\r\n        xReturn = xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL );\r\n\r\n        traceRETURN_xEventGroupClearBitsFromISR( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\nEventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup )\r\n{\r\n    UBaseType_t uxSavedInterruptStatus;\r\n    EventGroup_t const * const pxEventBits = xEventGroup;\r\n    EventBits_t uxReturn;\r\n\r\n    traceENTER_xEventGroupGetBitsFromISR( xEventGroup );\r\n\r\n    uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();\r\n    {\r\n        uxReturn = pxEventBits->uxEventBits;\r\n    }\r\n    taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );\r\n\r\n    traceRETURN_xEventGroupGetBitsFromISR( uxReturn );\r\n\r\n    return uxReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nEventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,\r\n                                const EventBits_t uxBitsToSet )\r\n{\r\n    ListItem_t * pxListItem;\r\n    ListItem_t * pxNext;\r\n    ListItem_t const * pxListEnd;\r\n    List_t const * pxList;\r\n    EventBits_t uxBitsToClear = 0, uxBitsWaitedFor, uxControlBits;\r\n    EventGroup_t * pxEventBits = xEventGroup;\r\n    BaseType_t xMatchFound = pdFALSE;\r\n\r\n    traceENTER_xEventGroupSetBits( xEventGroup, uxBitsToSet );\r\n\r\n    /* Check the user is not attempting to set the bits used by the kernel\r\n     * itself. */\r\n    configASSERT( xEventGroup );\r\n    configASSERT( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 );\r\n\r\n    pxList = &( pxEventBits->xTasksWaitingForBits );\r\n    pxListEnd = listGET_END_MARKER( pxList );\r\n    vTaskSuspendAll();\r\n    {\r\n        traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet );\r\n\r\n        pxListItem = listGET_HEAD_ENTRY( pxList );\r\n\r\n        /* Set the bits. */\r\n        pxEventBits->uxEventBits |= uxBitsToSet;\r\n\r\n        /* See if the new bit value should unblock any tasks. */\r\n        while( pxListItem != pxListEnd )\r\n        {\r\n            pxNext = listGET_NEXT( pxListItem );\r\n            uxBitsWaitedFor = listGET_LIST_ITEM_VALUE( pxListItem );\r\n            xMatchFound = pdFALSE;\r\n\r\n            /* Split the bits waited for from the control bits. */\r\n            uxControlBits = uxBitsWaitedFor & eventEVENT_BITS_CONTROL_BYTES;\r\n            uxBitsWaitedFor &= ~eventEVENT_BITS_CONTROL_BYTES;\r\n\r\n            if( ( uxControlBits & eventWAIT_FOR_ALL_BITS ) == ( EventBits_t ) 0 )\r\n            {\r\n                /* Just looking for single bit being set. */\r\n                if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) != ( EventBits_t ) 0 )\r\n                {\r\n                    xMatchFound = pdTRUE;\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else if( ( uxBitsWaitedFor & pxEventBits->uxEventBits ) == uxBitsWaitedFor )\r\n            {\r\n                /* All bits are set. */\r\n                xMatchFound = pdTRUE;\r\n            }\r\n            else\r\n            {\r\n                /* Need all bits to be set, but not all the bits were set. */\r\n            }\r\n\r\n            if( xMatchFound != pdFALSE )\r\n            {\r\n                /* The bits match.  Should the bits be cleared on exit? */\r\n                if( ( uxControlBits & eventCLEAR_EVENTS_ON_EXIT_BIT ) != ( EventBits_t ) 0 )\r\n                {\r\n                    uxBitsToClear |= uxBitsWaitedFor;\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n\r\n                /* Store the actual event flag value in the task's event list\r\n                 * item before removing the task from the event list.  The\r\n                 * eventUNBLOCKED_DUE_TO_BIT_SET bit is set so the task knows\r\n                 * that is was unblocked due to its required bits matching, rather\r\n                 * than because it timed out. */\r\n                vTaskRemoveFromUnorderedEventList( pxListItem, pxEventBits->uxEventBits | eventUNBLOCKED_DUE_TO_BIT_SET );\r\n            }\r\n\r\n            /* Move onto the next list item.  Note pxListItem->pxNext is not\r\n             * used here as the list item may have been removed from the event list\r\n             * and inserted into the ready/pending reading list. */\r\n            pxListItem = pxNext;\r\n        }\r\n\r\n        /* Clear any bits that matched when the eventCLEAR_EVENTS_ON_EXIT_BIT\r\n         * bit was set in the control word. */\r\n        pxEventBits->uxEventBits &= ~uxBitsToClear;\r\n    }\r\n    ( void ) xTaskResumeAll();\r\n\r\n    traceRETURN_xEventGroupSetBits( pxEventBits->uxEventBits );\r\n\r\n    return pxEventBits->uxEventBits;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vEventGroupDelete( EventGroupHandle_t xEventGroup )\r\n{\r\n    EventGroup_t * pxEventBits = xEventGroup;\r\n    const List_t * pxTasksWaitingForBits;\r\n\r\n    traceENTER_vEventGroupDelete( xEventGroup );\r\n\r\n    configASSERT( pxEventBits );\r\n\r\n    pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits );\r\n\r\n    vTaskSuspendAll();\r\n    {\r\n        traceEVENT_GROUP_DELETE( xEventGroup );\r\n\r\n        while( listCURRENT_LIST_LENGTH( pxTasksWaitingForBits ) > ( UBaseType_t ) 0 )\r\n        {\r\n            /* Unblock the task, returning 0 as the event list is being deleted\r\n             * and cannot therefore have any bits set. */\r\n            configASSERT( pxTasksWaitingForBits->xListEnd.pxNext != ( const ListItem_t * ) &( pxTasksWaitingForBits->xListEnd ) );\r\n            vTaskRemoveFromUnorderedEventList( pxTasksWaitingForBits->xListEnd.pxNext, eventUNBLOCKED_DUE_TO_BIT_SET );\r\n        }\r\n    }\r\n    ( void ) xTaskResumeAll();\r\n\r\n    #if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) )\r\n    {\r\n        /* The event group can only have been allocated dynamically - free\r\n         * it again. */\r\n        vPortFree( pxEventBits );\r\n    }\r\n    #elif ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )\r\n    {\r\n        /* The event group could have been allocated statically or\r\n         * dynamically, so check before attempting to free the memory. */\r\n        if( pxEventBits->ucStaticallyAllocated == ( uint8_t ) pdFALSE )\r\n        {\r\n            vPortFree( pxEventBits );\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n    #endif /* configSUPPORT_DYNAMIC_ALLOCATION */\r\n\r\n    traceRETURN_vEventGroupDelete();\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n    BaseType_t xEventGroupGetStaticBuffer( EventGroupHandle_t xEventGroup,\r\n                                           StaticEventGroup_t ** ppxEventGroupBuffer )\r\n    {\r\n        BaseType_t xReturn;\r\n        EventGroup_t * pxEventBits = xEventGroup;\r\n\r\n        traceENTER_xEventGroupGetStaticBuffer( xEventGroup, ppxEventGroupBuffer );\r\n\r\n        configASSERT( pxEventBits );\r\n        configASSERT( ppxEventGroupBuffer );\r\n\r\n        #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r\n        {\r\n            /* Check if the event group was statically allocated. */\r\n            if( pxEventBits->ucStaticallyAllocated == ( uint8_t ) pdTRUE )\r\n            {\r\n                /* MISRA Ref 11.3.1 [Misaligned access] */\r\n                /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */\r\n                /* coverity[misra_c_2012_rule_11_3_violation] */\r\n                *ppxEventGroupBuffer = ( StaticEventGroup_t * ) pxEventBits;\r\n                xReturn = pdTRUE;\r\n            }\r\n            else\r\n            {\r\n                xReturn = pdFALSE;\r\n            }\r\n        }\r\n        #else /* configSUPPORT_DYNAMIC_ALLOCATION */\r\n        {\r\n            /* Event group must have been statically allocated. */\r\n            /* MISRA Ref 11.3.1 [Misaligned access] */\r\n            /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */\r\n            /* coverity[misra_c_2012_rule_11_3_violation] */\r\n            *ppxEventGroupBuffer = ( StaticEventGroup_t * ) pxEventBits;\r\n            xReturn = pdTRUE;\r\n        }\r\n        #endif /* configSUPPORT_DYNAMIC_ALLOCATION */\r\n\r\n        traceRETURN_xEventGroupGetStaticBuffer( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n#endif /* configSUPPORT_STATIC_ALLOCATION */\r\n/*-----------------------------------------------------------*/\r\n\r\n/* For internal use only - execute a 'set bits' command that was pended from\r\n * an interrupt. */\r\nvoid vEventGroupSetBitsCallback( void * pvEventGroup,\r\n                                 uint32_t ulBitsToSet )\r\n{\r\n    traceENTER_vEventGroupSetBitsCallback( pvEventGroup, ulBitsToSet );\r\n\r\n    /* MISRA Ref 11.5.4 [Callback function parameter] */\r\n    /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n    /* coverity[misra_c_2012_rule_11_5_violation] */\r\n    ( void ) xEventGroupSetBits( pvEventGroup, ( EventBits_t ) ulBitsToSet );\r\n\r\n    traceRETURN_vEventGroupSetBitsCallback();\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n/* For internal use only - execute a 'clear bits' command that was pended from\r\n * an interrupt. */\r\nvoid vEventGroupClearBitsCallback( void * pvEventGroup,\r\n                                   uint32_t ulBitsToClear )\r\n{\r\n    traceENTER_vEventGroupClearBitsCallback( pvEventGroup, ulBitsToClear );\r\n\r\n    /* MISRA Ref 11.5.4 [Callback function parameter] */\r\n    /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n    /* coverity[misra_c_2012_rule_11_5_violation] */\r\n    ( void ) xEventGroupClearBits( pvEventGroup, ( EventBits_t ) ulBitsToClear );\r\n\r\n    traceRETURN_vEventGroupClearBitsCallback();\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits,\r\n                                        const EventBits_t uxBitsToWaitFor,\r\n                                        const BaseType_t xWaitForAllBits )\r\n{\r\n    BaseType_t xWaitConditionMet = pdFALSE;\r\n\r\n    if( xWaitForAllBits == pdFALSE )\r\n    {\r\n        /* Task only has to wait for one bit within uxBitsToWaitFor to be\r\n         * set.  Is one already set? */\r\n        if( ( uxCurrentEventBits & uxBitsToWaitFor ) != ( EventBits_t ) 0 )\r\n        {\r\n            xWaitConditionMet = pdTRUE;\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n    else\r\n    {\r\n        /* Task has to wait for all the bits in uxBitsToWaitFor to be set.\r\n         * Are they set already? */\r\n        if( ( uxCurrentEventBits & uxBitsToWaitFor ) == uxBitsToWaitFor )\r\n        {\r\n            xWaitConditionMet = pdTRUE;\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n\r\n    return xWaitConditionMet;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) )\r\n\r\n    BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup,\r\n                                          const EventBits_t uxBitsToSet,\r\n                                          BaseType_t * pxHigherPriorityTaskWoken )\r\n    {\r\n        BaseType_t xReturn;\r\n\r\n        traceENTER_xEventGroupSetBitsFromISR( xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken );\r\n\r\n        traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet );\r\n        xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken );\r\n\r\n        traceRETURN_xEventGroupSetBitsFromISR( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* if ( ( configUSE_TRACE_FACILITY == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n\r\n    UBaseType_t uxEventGroupGetNumber( void * xEventGroup )\r\n    {\r\n        UBaseType_t xReturn;\r\n\r\n        /* MISRA Ref 11.5.2 [Opaque pointer] */\r\n        /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n        /* coverity[misra_c_2012_rule_11_5_violation] */\r\n        EventGroup_t const * pxEventBits = ( EventGroup_t * ) xEventGroup;\r\n\r\n        traceENTER_uxEventGroupGetNumber( xEventGroup );\r\n\r\n        if( xEventGroup == NULL )\r\n        {\r\n            xReturn = 0;\r\n        }\r\n        else\r\n        {\r\n            xReturn = pxEventBits->uxEventGroupNumber;\r\n        }\r\n\r\n        traceRETURN_uxEventGroupGetNumber( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_TRACE_FACILITY */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n\r\n    void vEventGroupSetNumber( void * xEventGroup,\r\n                               UBaseType_t uxEventGroupNumber )\r\n    {\r\n        traceENTER_vEventGroupSetNumber( xEventGroup, uxEventGroupNumber );\r\n\r\n        /* MISRA Ref 11.5.2 [Opaque pointer] */\r\n        /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n        /* coverity[misra_c_2012_rule_11_5_violation] */\r\n        ( ( EventGroup_t * ) xEventGroup )->uxEventGroupNumber = uxEventGroupNumber;\r\n\r\n        traceRETURN_vEventGroupSetNumber();\r\n    }\r\n\r\n#endif /* configUSE_TRACE_FACILITY */\r\n/*-----------------------------------------------------------*/\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/FreeRTOS.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n#ifndef INC_FREERTOS_H\r\n#define INC_FREERTOS_H\r\n\r\n/*\r\n * Include the generic headers required for the FreeRTOS port being used.\r\n */\r\n#include <stddef.h>\r\n\r\n/*\r\n * If stdint.h cannot be located then:\r\n *   + If using GCC ensure the -nostdint options is *not* being used.\r\n *   + Ensure the project's include path includes the directory in which your\r\n *     compiler stores stdint.h.\r\n *   + Set any compiler options necessary for it to support C99, as technically\r\n *     stdint.h is only mandatory with C99 (FreeRTOS does not require C99 in any\r\n *     other way).\r\n *   + The FreeRTOS download includes a simple stdint.h definition that can be\r\n *     used in cases where none is provided by the compiler.  The files only\r\n *     contains the typedefs required to build FreeRTOS.  Read the instructions\r\n *     in FreeRTOS/source/stdint.readme for more information.\r\n */\r\n#include <stdint.h> /* READ COMMENT ABOVE. */\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    extern \"C\" {\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n/* Acceptable values for configTICK_TYPE_WIDTH_IN_BITS. */\r\n#define TICK_TYPE_WIDTH_16_BITS    0\r\n#define TICK_TYPE_WIDTH_32_BITS    1\r\n#define TICK_TYPE_WIDTH_64_BITS    2\r\n\r\n/* Application specific configuration options. */\r\n#include \"FreeRTOSConfig.h\"\r\n\r\n#if !defined( configUSE_16_BIT_TICKS ) && !defined( configTICK_TYPE_WIDTH_IN_BITS )\r\n    #error Missing definition:  One of configUSE_16_BIT_TICKS and configTICK_TYPE_WIDTH_IN_BITS must be defined in FreeRTOSConfig.h.  See the Configuration section of the FreeRTOS API documentation for details.\r\n#endif\r\n\r\n#if defined( configUSE_16_BIT_TICKS ) && defined( configTICK_TYPE_WIDTH_IN_BITS )\r\n    #error Only one of configUSE_16_BIT_TICKS and configTICK_TYPE_WIDTH_IN_BITS must be defined in FreeRTOSConfig.h.  See the Configuration section of the FreeRTOS API documentation for details.\r\n#endif\r\n\r\n/* Define configTICK_TYPE_WIDTH_IN_BITS according to the\r\n * value of configUSE_16_BIT_TICKS for backward compatibility. */\r\n#ifndef configTICK_TYPE_WIDTH_IN_BITS\r\n    #if ( configUSE_16_BIT_TICKS == 1 )\r\n        #define configTICK_TYPE_WIDTH_IN_BITS    TICK_TYPE_WIDTH_16_BITS\r\n    #else\r\n        #define configTICK_TYPE_WIDTH_IN_BITS    TICK_TYPE_WIDTH_32_BITS\r\n    #endif\r\n#endif\r\n\r\n/* Set configUSE_MPU_WRAPPERS_V1 to 1 to use MPU wrappers v1. */\r\n#ifndef configUSE_MPU_WRAPPERS_V1\r\n    #define configUSE_MPU_WRAPPERS_V1    0\r\n#endif\r\n\r\n/* Set configENABLE_ACCESS_CONTROL_LIST to 1 to enable access control list support. */\r\n#ifndef configENABLE_ACCESS_CONTROL_LIST\r\n    #define configENABLE_ACCESS_CONTROL_LIST    0\r\n#endif\r\n\r\n/* Set default value of configNUMBER_OF_CORES to 1 to use single core FreeRTOS. */\r\n#ifndef configNUMBER_OF_CORES\r\n    #define configNUMBER_OF_CORES    1\r\n#endif\r\n\r\n/* Basic FreeRTOS definitions. */\r\n#include \"projdefs.h\"\r\n\r\n/* Definitions specific to the port being used. */\r\n#include \"portable.h\"\r\n\r\n/* Must be defaulted before configUSE_NEWLIB_REENTRANT is used below. */\r\n#ifndef configUSE_NEWLIB_REENTRANT\r\n    #define configUSE_NEWLIB_REENTRANT    0\r\n#endif\r\n\r\n/* Required if struct _reent is used. */\r\n#if ( configUSE_NEWLIB_REENTRANT == 1 )\r\n\r\n    #include \"newlib-freertos.h\"\r\n\r\n#endif /* if ( configUSE_NEWLIB_REENTRANT == 1 ) */\r\n\r\n/* Must be defaulted before configUSE_PICOLIBC_TLS is used below. */\r\n#ifndef configUSE_PICOLIBC_TLS\r\n    #define configUSE_PICOLIBC_TLS    0\r\n#endif\r\n\r\n#if ( configUSE_PICOLIBC_TLS == 1 )\r\n\r\n    #include \"picolibc-freertos.h\"\r\n\r\n#endif /* if ( configUSE_PICOLIBC_TLS == 1 ) */\r\n\r\n#ifndef configUSE_C_RUNTIME_TLS_SUPPORT\r\n    #define configUSE_C_RUNTIME_TLS_SUPPORT    0\r\n#endif\r\n\r\n#if ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 )\r\n\r\n    #ifndef configTLS_BLOCK_TYPE\r\n        #error Missing definition:  configTLS_BLOCK_TYPE must be defined in FreeRTOSConfig.h when configUSE_C_RUNTIME_TLS_SUPPORT is set to 1.\r\n    #endif\r\n\r\n    #ifndef configINIT_TLS_BLOCK\r\n        #error Missing definition:  configINIT_TLS_BLOCK must be defined in FreeRTOSConfig.h when configUSE_C_RUNTIME_TLS_SUPPORT is set to 1.\r\n    #endif\r\n\r\n    #ifndef configSET_TLS_BLOCK\r\n        #error Missing definition:  configSET_TLS_BLOCK must be defined in FreeRTOSConfig.h when configUSE_C_RUNTIME_TLS_SUPPORT is set to 1.\r\n    #endif\r\n\r\n    #ifndef configDEINIT_TLS_BLOCK\r\n        #error Missing definition:  configDEINIT_TLS_BLOCK must be defined in FreeRTOSConfig.h when configUSE_C_RUNTIME_TLS_SUPPORT is set to 1.\r\n    #endif\r\n#endif /* if ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 ) */\r\n\r\n/*\r\n * Check all the required application specific macros have been defined.\r\n * These macros are application specific and (as downloaded) are defined\r\n * within FreeRTOSConfig.h.\r\n */\r\n\r\n#ifndef configMINIMAL_STACK_SIZE\r\n    #error Missing definition:  configMINIMAL_STACK_SIZE must be defined in FreeRTOSConfig.h.  configMINIMAL_STACK_SIZE defines the size (in words) of the stack allocated to the idle task.  Refer to the demo project provided for your port for a suitable value.\r\n#endif\r\n\r\n#ifndef configMAX_PRIORITIES\r\n    #error Missing definition:  configMAX_PRIORITIES must be defined in FreeRTOSConfig.h.  See the Configuration section of the FreeRTOS API documentation for details.\r\n#endif\r\n\r\n#if configMAX_PRIORITIES < 1\r\n    #error configMAX_PRIORITIES must be defined to be greater than or equal to 1.\r\n#endif\r\n\r\n#ifndef configUSE_PREEMPTION\r\n    #error Missing definition:  configUSE_PREEMPTION must be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.\r\n#endif\r\n\r\n#ifndef configUSE_IDLE_HOOK\r\n    #error Missing definition:  configUSE_IDLE_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.\r\n#endif\r\n\r\n#if ( configNUMBER_OF_CORES > 1 )\r\n    #ifndef configUSE_PASSIVE_IDLE_HOOK\r\n        #error Missing definition:  configUSE_PASSIVE_IDLE_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.\r\n    #endif\r\n#endif\r\n\r\n#ifndef configUSE_TICK_HOOK\r\n    #error Missing definition:  configUSE_TICK_HOOK must be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.\r\n#endif\r\n\r\n#if ( ( configTICK_TYPE_WIDTH_IN_BITS != TICK_TYPE_WIDTH_16_BITS ) && \\\r\n    ( configTICK_TYPE_WIDTH_IN_BITS != TICK_TYPE_WIDTH_32_BITS ) &&   \\\r\n    ( configTICK_TYPE_WIDTH_IN_BITS != TICK_TYPE_WIDTH_64_BITS ) )\r\n    #error Macro configTICK_TYPE_WIDTH_IN_BITS is defined to incorrect value.  See the Configuration section of the FreeRTOS API documentation for details.\r\n#endif\r\n\r\n#ifndef configUSE_CO_ROUTINES\r\n    #define configUSE_CO_ROUTINES    0\r\n#endif\r\n\r\n#ifndef INCLUDE_vTaskPrioritySet\r\n    #define INCLUDE_vTaskPrioritySet    0\r\n#endif\r\n\r\n#ifndef INCLUDE_uxTaskPriorityGet\r\n    #define INCLUDE_uxTaskPriorityGet    0\r\n#endif\r\n\r\n#ifndef INCLUDE_vTaskDelete\r\n    #define INCLUDE_vTaskDelete    0\r\n#endif\r\n\r\n#ifndef INCLUDE_vTaskSuspend\r\n    #define INCLUDE_vTaskSuspend    0\r\n#endif\r\n\r\n#ifdef INCLUDE_xTaskDelayUntil\r\n    #ifdef INCLUDE_vTaskDelayUntil\r\n\r\n/* INCLUDE_vTaskDelayUntil was replaced by INCLUDE_xTaskDelayUntil.  Backward\r\n * compatibility is maintained if only one or the other is defined, but\r\n * there is a conflict if both are defined. */\r\n        #error INCLUDE_vTaskDelayUntil and INCLUDE_xTaskDelayUntil are both defined.  INCLUDE_vTaskDelayUntil is no longer required and should be removed\r\n    #endif\r\n#endif\r\n\r\n#ifndef INCLUDE_xTaskDelayUntil\r\n    #ifdef INCLUDE_vTaskDelayUntil\r\n\r\n/* If INCLUDE_vTaskDelayUntil is set but INCLUDE_xTaskDelayUntil is not then\r\n * the project's FreeRTOSConfig.h probably pre-dates the introduction of\r\n * xTaskDelayUntil and setting INCLUDE_xTaskDelayUntil to whatever\r\n * INCLUDE_vTaskDelayUntil is set to will ensure backward compatibility.\r\n */\r\n        #define INCLUDE_xTaskDelayUntil    INCLUDE_vTaskDelayUntil\r\n    #endif\r\n#endif\r\n\r\n#ifndef INCLUDE_xTaskDelayUntil\r\n    #define INCLUDE_xTaskDelayUntil    0\r\n#endif\r\n\r\n#ifndef INCLUDE_vTaskDelay\r\n    #define INCLUDE_vTaskDelay    0\r\n#endif\r\n\r\n#ifndef INCLUDE_xTaskGetIdleTaskHandle\r\n    #define INCLUDE_xTaskGetIdleTaskHandle    0\r\n#endif\r\n\r\n#ifndef INCLUDE_xTaskAbortDelay\r\n    #define INCLUDE_xTaskAbortDelay    0\r\n#endif\r\n\r\n#ifndef INCLUDE_xQueueGetMutexHolder\r\n    #define INCLUDE_xQueueGetMutexHolder    0\r\n#endif\r\n\r\n#ifndef INCLUDE_xSemaphoreGetMutexHolder\r\n    #define INCLUDE_xSemaphoreGetMutexHolder    INCLUDE_xQueueGetMutexHolder\r\n#endif\r\n\r\n#ifndef INCLUDE_xTaskGetHandle\r\n    #define INCLUDE_xTaskGetHandle    0\r\n#endif\r\n\r\n#ifndef INCLUDE_uxTaskGetStackHighWaterMark\r\n    #define INCLUDE_uxTaskGetStackHighWaterMark    0\r\n#endif\r\n\r\n#ifndef INCLUDE_uxTaskGetStackHighWaterMark2\r\n    #define INCLUDE_uxTaskGetStackHighWaterMark2    0\r\n#endif\r\n\r\n#ifndef INCLUDE_eTaskGetState\r\n    #define INCLUDE_eTaskGetState    0\r\n#endif\r\n\r\n#ifndef INCLUDE_xTaskResumeFromISR\r\n    #define INCLUDE_xTaskResumeFromISR    1\r\n#endif\r\n\r\n#ifndef INCLUDE_xTimerPendFunctionCall\r\n    #define INCLUDE_xTimerPendFunctionCall    0\r\n#endif\r\n\r\n#ifndef INCLUDE_xTaskGetSchedulerState\r\n    #define INCLUDE_xTaskGetSchedulerState    0\r\n#endif\r\n\r\n#ifndef INCLUDE_xTaskGetCurrentTaskHandle\r\n    #define INCLUDE_xTaskGetCurrentTaskHandle    1\r\n#endif\r\n\r\n#if configUSE_CO_ROUTINES != 0\r\n    #ifndef configMAX_CO_ROUTINE_PRIORITIES\r\n        #error configMAX_CO_ROUTINE_PRIORITIES must be greater than or equal to 1.\r\n    #endif\r\n#endif\r\n\r\n#ifndef configUSE_DAEMON_TASK_STARTUP_HOOK\r\n    #define configUSE_DAEMON_TASK_STARTUP_HOOK    0\r\n#endif\r\n\r\n#ifndef configUSE_APPLICATION_TASK_TAG\r\n    #define configUSE_APPLICATION_TASK_TAG    0\r\n#endif\r\n\r\n#ifndef configNUM_THREAD_LOCAL_STORAGE_POINTERS\r\n    #define configNUM_THREAD_LOCAL_STORAGE_POINTERS    0\r\n#endif\r\n\r\n#ifndef configUSE_RECURSIVE_MUTEXES\r\n    #define configUSE_RECURSIVE_MUTEXES    0\r\n#endif\r\n\r\n#ifndef configUSE_MUTEXES\r\n    #define configUSE_MUTEXES    0\r\n#endif\r\n\r\n#ifndef configUSE_TIMERS\r\n    #define configUSE_TIMERS    0\r\n#endif\r\n\r\n#ifndef configUSE_COUNTING_SEMAPHORES\r\n    #define configUSE_COUNTING_SEMAPHORES    0\r\n#endif\r\n\r\n#ifndef configUSE_TASK_PREEMPTION_DISABLE\r\n    #define configUSE_TASK_PREEMPTION_DISABLE    0\r\n#endif\r\n\r\n#ifndef configUSE_ALTERNATIVE_API\r\n    #define configUSE_ALTERNATIVE_API    0\r\n#endif\r\n\r\n#ifndef portCRITICAL_NESTING_IN_TCB\r\n    #define portCRITICAL_NESTING_IN_TCB    0\r\n#endif\r\n\r\n#ifndef configMAX_TASK_NAME_LEN\r\n    #define configMAX_TASK_NAME_LEN    16\r\n#endif\r\n\r\n#ifndef configIDLE_SHOULD_YIELD\r\n    #define configIDLE_SHOULD_YIELD    1\r\n#endif\r\n\r\n#if configMAX_TASK_NAME_LEN < 1\r\n    #error configMAX_TASK_NAME_LEN must be set to a minimum of 1 in FreeRTOSConfig.h\r\n#endif\r\n\r\n#ifndef configASSERT\r\n    #define configASSERT( x )\r\n    #define configASSERT_DEFINED    0\r\n#else\r\n    #define configASSERT_DEFINED    1\r\n#endif\r\n\r\n/* configPRECONDITION should be defined as configASSERT.\r\n * The CBMC proofs need a way to track assumptions and assertions.\r\n * A configPRECONDITION statement should express an implicit invariant or\r\n * assumption made.  A configASSERT statement should express an invariant that must\r\n * hold explicit before calling the code. */\r\n#ifndef configPRECONDITION\r\n    #define configPRECONDITION( X )    configASSERT( X )\r\n    #define configPRECONDITION_DEFINED    0\r\n#else\r\n    #define configPRECONDITION_DEFINED    1\r\n#endif\r\n\r\n#ifndef configCHECK_HANDLER_INSTALLATION\r\n    #define configCHECK_HANDLER_INSTALLATION    1\r\n#else\r\n\r\n/* The application has explicitly defined configCHECK_HANDLER_INSTALLATION\r\n * to 1. The checks requires configASSERT() to be defined. */\r\n    #if ( ( configCHECK_HANDLER_INSTALLATION == 1 ) && ( configASSERT_DEFINED == 0 ) )\r\n        #error You must define configASSERT() when configCHECK_HANDLER_INSTALLATION is 1.\r\n    #endif\r\n#endif\r\n\r\n#ifndef portMEMORY_BARRIER\r\n    #define portMEMORY_BARRIER()\r\n#endif\r\n\r\n#ifndef portSOFTWARE_BARRIER\r\n    #define portSOFTWARE_BARRIER()\r\n#endif\r\n\r\n#ifndef configRUN_MULTIPLE_PRIORITIES\r\n    #define configRUN_MULTIPLE_PRIORITIES    0\r\n#endif\r\n\r\n#ifndef portGET_CORE_ID\r\n\r\n    #if ( configNUMBER_OF_CORES == 1 )\r\n        #define portGET_CORE_ID()    0\r\n    #else\r\n        #error configNUMBER_OF_CORES is set to more than 1 then portGET_CORE_ID must also be defined.\r\n    #endif /* configNUMBER_OF_CORES */\r\n\r\n#endif /* portGET_CORE_ID */\r\n\r\n#ifndef portYIELD_CORE\r\n\r\n    #if ( configNUMBER_OF_CORES == 1 )\r\n        #define portYIELD_CORE( x )    portYIELD()\r\n    #else\r\n        #error configNUMBER_OF_CORES is set to more than 1 then portYIELD_CORE must also be defined.\r\n    #endif /* configNUMBER_OF_CORES */\r\n\r\n#endif /* portYIELD_CORE */\r\n\r\n#ifndef portSET_INTERRUPT_MASK\r\n\r\n    #if ( configNUMBER_OF_CORES > 1 )\r\n        #error portSET_INTERRUPT_MASK is required in SMP\r\n    #endif\r\n\r\n#endif /* portSET_INTERRUPT_MASK */\r\n\r\n#ifndef portCLEAR_INTERRUPT_MASK\r\n\r\n    #if ( configNUMBER_OF_CORES > 1 )\r\n        #error portCLEAR_INTERRUPT_MASK is required in SMP\r\n    #endif\r\n\r\n#endif /* portCLEAR_INTERRUPT_MASK */\r\n\r\n#ifndef portRELEASE_TASK_LOCK\r\n\r\n    #if ( configNUMBER_OF_CORES == 1 )\r\n        #define portRELEASE_TASK_LOCK()\r\n    #else\r\n        #error portRELEASE_TASK_LOCK is required in SMP\r\n    #endif\r\n\r\n#endif /* portRELEASE_TASK_LOCK */\r\n\r\n#ifndef portGET_TASK_LOCK\r\n\r\n    #if ( configNUMBER_OF_CORES == 1 )\r\n        #define portGET_TASK_LOCK()\r\n    #else\r\n        #error portGET_TASK_LOCK is required in SMP\r\n    #endif\r\n\r\n#endif /* portGET_TASK_LOCK */\r\n\r\n#ifndef portRELEASE_ISR_LOCK\r\n\r\n    #if ( configNUMBER_OF_CORES == 1 )\r\n        #define portRELEASE_ISR_LOCK()\r\n    #else\r\n        #error portRELEASE_ISR_LOCK is required in SMP\r\n    #endif\r\n\r\n#endif /* portRELEASE_ISR_LOCK */\r\n\r\n#ifndef portGET_ISR_LOCK\r\n\r\n    #if ( configNUMBER_OF_CORES == 1 )\r\n        #define portGET_ISR_LOCK()\r\n    #else\r\n        #error portGET_ISR_LOCK is required in SMP\r\n    #endif\r\n\r\n#endif /* portGET_ISR_LOCK */\r\n\r\n#ifndef portENTER_CRITICAL_FROM_ISR\r\n\r\n    #if ( configNUMBER_OF_CORES > 1 )\r\n        #error portENTER_CRITICAL_FROM_ISR is required in SMP\r\n    #endif\r\n\r\n#endif\r\n\r\n#ifndef portEXIT_CRITICAL_FROM_ISR\r\n\r\n    #if ( configNUMBER_OF_CORES > 1 )\r\n        #error portEXIT_CRITICAL_FROM_ISR is required in SMP\r\n    #endif\r\n\r\n#endif\r\n\r\n#ifndef configUSE_CORE_AFFINITY\r\n    #define configUSE_CORE_AFFINITY    0\r\n#endif /* configUSE_CORE_AFFINITY */\r\n\r\n#ifndef configUSE_PASSIVE_IDLE_HOOK\r\n    #define configUSE_PASSIVE_IDLE_HOOK    0\r\n#endif /* configUSE_PASSIVE_IDLE_HOOK */\r\n\r\n/* The timers module relies on xTaskGetSchedulerState(). */\r\n#if configUSE_TIMERS == 1\r\n\r\n    #ifndef configTIMER_TASK_PRIORITY\r\n        #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_PRIORITY must also be defined.\r\n    #endif /* configTIMER_TASK_PRIORITY */\r\n\r\n    #ifndef configTIMER_QUEUE_LENGTH\r\n        #error If configUSE_TIMERS is set to 1 then configTIMER_QUEUE_LENGTH must also be defined.\r\n    #endif /* configTIMER_QUEUE_LENGTH */\r\n\r\n    #ifndef configTIMER_TASK_STACK_DEPTH\r\n        #error If configUSE_TIMERS is set to 1 then configTIMER_TASK_STACK_DEPTH must also be defined.\r\n    #endif /* configTIMER_TASK_STACK_DEPTH */\r\n\r\n    #ifndef portTIMER_CALLBACK_ATTRIBUTE\r\n        #define portTIMER_CALLBACK_ATTRIBUTE\r\n    #endif /* portTIMER_CALLBACK_ATTRIBUTE */\r\n\r\n#endif /* configUSE_TIMERS */\r\n\r\n#ifndef portSET_INTERRUPT_MASK_FROM_ISR\r\n    #define portSET_INTERRUPT_MASK_FROM_ISR()    0\r\n#endif\r\n\r\n#ifndef portCLEAR_INTERRUPT_MASK_FROM_ISR\r\n    #define portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedStatusValue )    ( void ) ( uxSavedStatusValue )\r\n#endif\r\n\r\n#ifndef portCLEAN_UP_TCB\r\n    #define portCLEAN_UP_TCB( pxTCB )    ( void ) ( pxTCB )\r\n#endif\r\n\r\n#ifndef portPRE_TASK_DELETE_HOOK\r\n    #define portPRE_TASK_DELETE_HOOK( pvTaskToDelete, pxYieldPending )\r\n#endif\r\n\r\n#ifndef portSETUP_TCB\r\n    #define portSETUP_TCB( pxTCB )    ( void ) ( pxTCB )\r\n#endif\r\n\r\n#ifndef portTASK_SWITCH_HOOK\r\n    #define portTASK_SWITCH_HOOK( pxTCB )    ( void ) ( pxTCB )\r\n#endif\r\n\r\n#ifndef configQUEUE_REGISTRY_SIZE\r\n    #define configQUEUE_REGISTRY_SIZE    0U\r\n#endif\r\n\r\n#if ( configQUEUE_REGISTRY_SIZE < 1 )\r\n    #define vQueueAddToRegistry( xQueue, pcName )\r\n    #define vQueueUnregisterQueue( xQueue )\r\n    #define pcQueueGetName( xQueue )\r\n#endif\r\n\r\n#ifndef configUSE_MINI_LIST_ITEM\r\n    #define configUSE_MINI_LIST_ITEM    1\r\n#endif\r\n\r\n#ifndef portPOINTER_SIZE_TYPE\r\n    #define portPOINTER_SIZE_TYPE    uint32_t\r\n#endif\r\n\r\n/* Remove any unused trace macros. */\r\n#ifndef traceSTART\r\n\r\n/* Used to perform any necessary initialisation - for example, open a file\r\n * into which trace is to be written. */\r\n    #define traceSTART()\r\n#endif\r\n\r\n#ifndef traceEND\r\n\r\n/* Use to close a trace, for example close a file into which trace has been\r\n * written. */\r\n    #define traceEND()\r\n#endif\r\n\r\n#ifndef traceTASK_SWITCHED_IN\r\n\r\n/* Called after a task has been selected to run.  pxCurrentTCB holds a pointer\r\n * to the task control block of the selected task. */\r\n    #define traceTASK_SWITCHED_IN()\r\n#endif\r\n\r\n#ifndef traceINCREASE_TICK_COUNT\r\n\r\n/* Called before stepping the tick count after waking from tickless idle\r\n * sleep. */\r\n    #define traceINCREASE_TICK_COUNT( x )\r\n#endif\r\n\r\n#ifndef traceLOW_POWER_IDLE_BEGIN\r\n    /* Called immediately before entering tickless idle. */\r\n    #define traceLOW_POWER_IDLE_BEGIN()\r\n#endif\r\n\r\n#ifndef traceLOW_POWER_IDLE_END\r\n    /* Called when returning to the Idle task after a tickless idle. */\r\n    #define traceLOW_POWER_IDLE_END()\r\n#endif\r\n\r\n#ifndef traceTASK_SWITCHED_OUT\r\n\r\n/* Called before a task has been selected to run.  pxCurrentTCB holds a pointer\r\n * to the task control block of the task being switched out. */\r\n    #define traceTASK_SWITCHED_OUT()\r\n#endif\r\n\r\n#ifndef traceTASK_PRIORITY_INHERIT\r\n\r\n/* Called when a task attempts to take a mutex that is already held by a\r\n * lower priority task.  pxTCBOfMutexHolder is a pointer to the TCB of the task\r\n * that holds the mutex.  uxInheritedPriority is the priority the mutex holder\r\n * will inherit (the priority of the task that is attempting to obtain the\r\n * muted. */\r\n    #define traceTASK_PRIORITY_INHERIT( pxTCBOfMutexHolder, uxInheritedPriority )\r\n#endif\r\n\r\n#ifndef traceTASK_PRIORITY_DISINHERIT\r\n\r\n/* Called when a task releases a mutex, the holding of which had resulted in\r\n * the task inheriting the priority of a higher priority task.\r\n * pxTCBOfMutexHolder is a pointer to the TCB of the task that is releasing the\r\n * mutex.  uxOriginalPriority is the task's configured (base) priority. */\r\n    #define traceTASK_PRIORITY_DISINHERIT( pxTCBOfMutexHolder, uxOriginalPriority )\r\n#endif\r\n\r\n#ifndef traceBLOCKING_ON_QUEUE_RECEIVE\r\n\r\n/* Task is about to block because it cannot read from a\r\n * queue/mutex/semaphore.  pxQueue is a pointer to the queue/mutex/semaphore\r\n * upon which the read was attempted.  pxCurrentTCB points to the TCB of the\r\n * task that attempted the read. */\r\n    #define traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue )\r\n#endif\r\n\r\n#ifndef traceBLOCKING_ON_QUEUE_PEEK\r\n\r\n/* Task is about to block because it cannot read from a\r\n * queue/mutex/semaphore.  pxQueue is a pointer to the queue/mutex/semaphore\r\n * upon which the read was attempted.  pxCurrentTCB points to the TCB of the\r\n * task that attempted the read. */\r\n    #define traceBLOCKING_ON_QUEUE_PEEK( pxQueue )\r\n#endif\r\n\r\n#ifndef traceBLOCKING_ON_QUEUE_SEND\r\n\r\n/* Task is about to block because it cannot write to a\r\n * queue/mutex/semaphore.  pxQueue is a pointer to the queue/mutex/semaphore\r\n * upon which the write was attempted.  pxCurrentTCB points to the TCB of the\r\n * task that attempted the write. */\r\n    #define traceBLOCKING_ON_QUEUE_SEND( pxQueue )\r\n#endif\r\n\r\n#ifndef configCHECK_FOR_STACK_OVERFLOW\r\n    #define configCHECK_FOR_STACK_OVERFLOW    0\r\n#endif\r\n\r\n#ifndef configRECORD_STACK_HIGH_ADDRESS\r\n    #define configRECORD_STACK_HIGH_ADDRESS    0\r\n#endif\r\n\r\n#ifndef configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H\r\n    #define configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H    0\r\n#endif\r\n\r\n/* The following event macros are embedded in the kernel API calls. */\r\n\r\n#ifndef traceMOVED_TASK_TO_READY_STATE\r\n    #define traceMOVED_TASK_TO_READY_STATE( pxTCB )\r\n#endif\r\n\r\n#ifndef tracePOST_MOVED_TASK_TO_READY_STATE\r\n    #define tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB )\r\n#endif\r\n\r\n#ifndef traceMOVED_TASK_TO_DELAYED_LIST\r\n    #define traceMOVED_TASK_TO_DELAYED_LIST()\r\n#endif\r\n\r\n#ifndef traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST\r\n    #define traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST()\r\n#endif\r\n\r\n#ifndef traceQUEUE_CREATE\r\n    #define traceQUEUE_CREATE( pxNewQueue )\r\n#endif\r\n\r\n#ifndef traceQUEUE_CREATE_FAILED\r\n    #define traceQUEUE_CREATE_FAILED( ucQueueType )\r\n#endif\r\n\r\n#ifndef traceCREATE_MUTEX\r\n    #define traceCREATE_MUTEX( pxNewQueue )\r\n#endif\r\n\r\n#ifndef traceCREATE_MUTEX_FAILED\r\n    #define traceCREATE_MUTEX_FAILED()\r\n#endif\r\n\r\n#ifndef traceGIVE_MUTEX_RECURSIVE\r\n    #define traceGIVE_MUTEX_RECURSIVE( pxMutex )\r\n#endif\r\n\r\n#ifndef traceGIVE_MUTEX_RECURSIVE_FAILED\r\n    #define traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex )\r\n#endif\r\n\r\n#ifndef traceTAKE_MUTEX_RECURSIVE\r\n    #define traceTAKE_MUTEX_RECURSIVE( pxMutex )\r\n#endif\r\n\r\n#ifndef traceTAKE_MUTEX_RECURSIVE_FAILED\r\n    #define traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex )\r\n#endif\r\n\r\n#ifndef traceCREATE_COUNTING_SEMAPHORE\r\n    #define traceCREATE_COUNTING_SEMAPHORE()\r\n#endif\r\n\r\n#ifndef traceCREATE_COUNTING_SEMAPHORE_FAILED\r\n    #define traceCREATE_COUNTING_SEMAPHORE_FAILED()\r\n#endif\r\n\r\n#ifndef traceQUEUE_SET_SEND\r\n    #define traceQUEUE_SET_SEND    traceQUEUE_SEND\r\n#endif\r\n\r\n#ifndef traceQUEUE_SEND\r\n    #define traceQUEUE_SEND( pxQueue )\r\n#endif\r\n\r\n#ifndef traceQUEUE_SEND_FAILED\r\n    #define traceQUEUE_SEND_FAILED( pxQueue )\r\n#endif\r\n\r\n#ifndef traceQUEUE_RECEIVE\r\n    #define traceQUEUE_RECEIVE( pxQueue )\r\n#endif\r\n\r\n#ifndef traceQUEUE_PEEK\r\n    #define traceQUEUE_PEEK( pxQueue )\r\n#endif\r\n\r\n#ifndef traceQUEUE_PEEK_FAILED\r\n    #define traceQUEUE_PEEK_FAILED( pxQueue )\r\n#endif\r\n\r\n#ifndef traceQUEUE_PEEK_FROM_ISR\r\n    #define traceQUEUE_PEEK_FROM_ISR( pxQueue )\r\n#endif\r\n\r\n#ifndef traceQUEUE_RECEIVE_FAILED\r\n    #define traceQUEUE_RECEIVE_FAILED( pxQueue )\r\n#endif\r\n\r\n#ifndef traceQUEUE_SEND_FROM_ISR\r\n    #define traceQUEUE_SEND_FROM_ISR( pxQueue )\r\n#endif\r\n\r\n#ifndef traceQUEUE_SEND_FROM_ISR_FAILED\r\n    #define traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue )\r\n#endif\r\n\r\n#ifndef traceQUEUE_RECEIVE_FROM_ISR\r\n    #define traceQUEUE_RECEIVE_FROM_ISR( pxQueue )\r\n#endif\r\n\r\n#ifndef traceQUEUE_RECEIVE_FROM_ISR_FAILED\r\n    #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue )\r\n#endif\r\n\r\n#ifndef traceQUEUE_PEEK_FROM_ISR_FAILED\r\n    #define traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue )\r\n#endif\r\n\r\n#ifndef traceQUEUE_DELETE\r\n    #define traceQUEUE_DELETE( pxQueue )\r\n#endif\r\n\r\n#ifndef traceTASK_CREATE\r\n    #define traceTASK_CREATE( pxNewTCB )\r\n#endif\r\n\r\n#ifndef traceTASK_CREATE_FAILED\r\n    #define traceTASK_CREATE_FAILED()\r\n#endif\r\n\r\n#ifndef traceTASK_DELETE\r\n    #define traceTASK_DELETE( pxTaskToDelete )\r\n#endif\r\n\r\n#ifndef traceTASK_DELAY_UNTIL\r\n    #define traceTASK_DELAY_UNTIL( x )\r\n#endif\r\n\r\n#ifndef traceTASK_DELAY\r\n    #define traceTASK_DELAY()\r\n#endif\r\n\r\n#ifndef traceTASK_PRIORITY_SET\r\n    #define traceTASK_PRIORITY_SET( pxTask, uxNewPriority )\r\n#endif\r\n\r\n#ifndef traceTASK_SUSPEND\r\n    #define traceTASK_SUSPEND( pxTaskToSuspend )\r\n#endif\r\n\r\n#ifndef traceTASK_RESUME\r\n    #define traceTASK_RESUME( pxTaskToResume )\r\n#endif\r\n\r\n#ifndef traceTASK_RESUME_FROM_ISR\r\n    #define traceTASK_RESUME_FROM_ISR( pxTaskToResume )\r\n#endif\r\n\r\n#ifndef traceTASK_INCREMENT_TICK\r\n    #define traceTASK_INCREMENT_TICK( xTickCount )\r\n#endif\r\n\r\n#ifndef traceTIMER_CREATE\r\n    #define traceTIMER_CREATE( pxNewTimer )\r\n#endif\r\n\r\n#ifndef traceTIMER_CREATE_FAILED\r\n    #define traceTIMER_CREATE_FAILED()\r\n#endif\r\n\r\n#ifndef traceTIMER_COMMAND_SEND\r\n    #define traceTIMER_COMMAND_SEND( xTimer, xMessageID, xMessageValueValue, xReturn )\r\n#endif\r\n\r\n#ifndef traceTIMER_EXPIRED\r\n    #define traceTIMER_EXPIRED( pxTimer )\r\n#endif\r\n\r\n#ifndef traceTIMER_COMMAND_RECEIVED\r\n    #define traceTIMER_COMMAND_RECEIVED( pxTimer, xMessageID, xMessageValue )\r\n#endif\r\n\r\n#ifndef traceMALLOC\r\n    #define traceMALLOC( pvAddress, uiSize )\r\n#endif\r\n\r\n#ifndef traceFREE\r\n    #define traceFREE( pvAddress, uiSize )\r\n#endif\r\n\r\n#ifndef traceEVENT_GROUP_CREATE\r\n    #define traceEVENT_GROUP_CREATE( xEventGroup )\r\n#endif\r\n\r\n#ifndef traceEVENT_GROUP_CREATE_FAILED\r\n    #define traceEVENT_GROUP_CREATE_FAILED()\r\n#endif\r\n\r\n#ifndef traceEVENT_GROUP_SYNC_BLOCK\r\n    #define traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor )\r\n#endif\r\n\r\n#ifndef traceEVENT_GROUP_SYNC_END\r\n    #define traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred )    ( void ) ( xTimeoutOccurred )\r\n#endif\r\n\r\n#ifndef traceEVENT_GROUP_WAIT_BITS_BLOCK\r\n    #define traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor )\r\n#endif\r\n\r\n#ifndef traceEVENT_GROUP_WAIT_BITS_END\r\n    #define traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred )    ( void ) ( xTimeoutOccurred )\r\n#endif\r\n\r\n#ifndef traceEVENT_GROUP_CLEAR_BITS\r\n    #define traceEVENT_GROUP_CLEAR_BITS( xEventGroup, uxBitsToClear )\r\n#endif\r\n\r\n#ifndef traceEVENT_GROUP_CLEAR_BITS_FROM_ISR\r\n    #define traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear )\r\n#endif\r\n\r\n#ifndef traceEVENT_GROUP_SET_BITS\r\n    #define traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet )\r\n#endif\r\n\r\n#ifndef traceEVENT_GROUP_SET_BITS_FROM_ISR\r\n    #define traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet )\r\n#endif\r\n\r\n#ifndef traceEVENT_GROUP_DELETE\r\n    #define traceEVENT_GROUP_DELETE( xEventGroup )\r\n#endif\r\n\r\n#ifndef tracePEND_FUNC_CALL\r\n    #define tracePEND_FUNC_CALL( xFunctionToPend, pvParameter1, ulParameter2, ret )\r\n#endif\r\n\r\n#ifndef tracePEND_FUNC_CALL_FROM_ISR\r\n    #define tracePEND_FUNC_CALL_FROM_ISR( xFunctionToPend, pvParameter1, ulParameter2, ret )\r\n#endif\r\n\r\n#ifndef traceQUEUE_REGISTRY_ADD\r\n    #define traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName )\r\n#endif\r\n\r\n#ifndef traceTASK_NOTIFY_TAKE_BLOCK\r\n    #define traceTASK_NOTIFY_TAKE_BLOCK( uxIndexToWait )\r\n#endif\r\n\r\n#ifndef traceTASK_NOTIFY_TAKE\r\n    #define traceTASK_NOTIFY_TAKE( uxIndexToWait )\r\n#endif\r\n\r\n#ifndef traceTASK_NOTIFY_WAIT_BLOCK\r\n    #define traceTASK_NOTIFY_WAIT_BLOCK( uxIndexToWait )\r\n#endif\r\n\r\n#ifndef traceTASK_NOTIFY_WAIT\r\n    #define traceTASK_NOTIFY_WAIT( uxIndexToWait )\r\n#endif\r\n\r\n#ifndef traceTASK_NOTIFY\r\n    #define traceTASK_NOTIFY( uxIndexToNotify )\r\n#endif\r\n\r\n#ifndef traceTASK_NOTIFY_FROM_ISR\r\n    #define traceTASK_NOTIFY_FROM_ISR( uxIndexToNotify )\r\n#endif\r\n\r\n#ifndef traceTASK_NOTIFY_GIVE_FROM_ISR\r\n    #define traceTASK_NOTIFY_GIVE_FROM_ISR( uxIndexToNotify )\r\n#endif\r\n\r\n#ifndef traceISR_EXIT_TO_SCHEDULER\r\n    #define traceISR_EXIT_TO_SCHEDULER()\r\n#endif\r\n\r\n#ifndef traceISR_EXIT\r\n    #define traceISR_EXIT()\r\n#endif\r\n\r\n#ifndef traceISR_ENTER\r\n    #define traceISR_ENTER()\r\n#endif\r\n\r\n#ifndef traceSTREAM_BUFFER_CREATE_FAILED\r\n    #define traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer )\r\n#endif\r\n\r\n#ifndef traceSTREAM_BUFFER_CREATE_STATIC_FAILED\r\n    #define traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer )\r\n#endif\r\n\r\n#ifndef traceSTREAM_BUFFER_CREATE\r\n    #define traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer )\r\n#endif\r\n\r\n#ifndef traceSTREAM_BUFFER_DELETE\r\n    #define traceSTREAM_BUFFER_DELETE( xStreamBuffer )\r\n#endif\r\n\r\n#ifndef traceSTREAM_BUFFER_RESET\r\n    #define traceSTREAM_BUFFER_RESET( xStreamBuffer )\r\n#endif\r\n\r\n#ifndef traceBLOCKING_ON_STREAM_BUFFER_SEND\r\n    #define traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer )\r\n#endif\r\n\r\n#ifndef traceSTREAM_BUFFER_SEND\r\n    #define traceSTREAM_BUFFER_SEND( xStreamBuffer, xBytesSent )\r\n#endif\r\n\r\n#ifndef traceSTREAM_BUFFER_SEND_FAILED\r\n    #define traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer )\r\n#endif\r\n\r\n#ifndef traceSTREAM_BUFFER_SEND_FROM_ISR\r\n    #define traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xBytesSent )\r\n#endif\r\n\r\n#ifndef traceBLOCKING_ON_STREAM_BUFFER_RECEIVE\r\n    #define traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer )\r\n#endif\r\n\r\n#ifndef traceSTREAM_BUFFER_RECEIVE\r\n    #define traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength )\r\n#endif\r\n\r\n#ifndef traceSTREAM_BUFFER_RECEIVE_FAILED\r\n    #define traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer )\r\n#endif\r\n\r\n#ifndef traceSTREAM_BUFFER_RECEIVE_FROM_ISR\r\n    #define traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength )\r\n#endif\r\n\r\n#ifndef traceENTER_xEventGroupCreateStatic\r\n    #define traceENTER_xEventGroupCreateStatic( pxEventGroupBuffer )\r\n#endif\r\n\r\n#ifndef traceRETURN_xEventGroupCreateStatic\r\n    #define traceRETURN_xEventGroupCreateStatic( pxEventBits )\r\n#endif\r\n\r\n#ifndef traceENTER_xEventGroupCreate\r\n    #define traceENTER_xEventGroupCreate()\r\n#endif\r\n\r\n#ifndef traceRETURN_xEventGroupCreate\r\n    #define traceRETURN_xEventGroupCreate( pxEventBits )\r\n#endif\r\n\r\n#ifndef traceENTER_xEventGroupSync\r\n    #define traceENTER_xEventGroupSync( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTicksToWait )\r\n#endif\r\n\r\n#ifndef traceRETURN_xEventGroupSync\r\n    #define traceRETURN_xEventGroupSync( uxReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xEventGroupWaitBits\r\n    #define traceENTER_xEventGroupWaitBits( xEventGroup, uxBitsToWaitFor, xClearOnExit, xWaitForAllBits, xTicksToWait )\r\n#endif\r\n\r\n#ifndef traceRETURN_xEventGroupWaitBits\r\n    #define traceRETURN_xEventGroupWaitBits( uxReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xEventGroupClearBits\r\n    #define traceENTER_xEventGroupClearBits( xEventGroup, uxBitsToClear )\r\n#endif\r\n\r\n#ifndef traceRETURN_xEventGroupClearBits\r\n    #define traceRETURN_xEventGroupClearBits( uxReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xEventGroupClearBitsFromISR\r\n    #define traceENTER_xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear )\r\n#endif\r\n\r\n#ifndef traceRETURN_xEventGroupClearBitsFromISR\r\n    #define traceRETURN_xEventGroupClearBitsFromISR( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xEventGroupGetBitsFromISR\r\n    #define traceENTER_xEventGroupGetBitsFromISR( xEventGroup )\r\n#endif\r\n\r\n#ifndef traceRETURN_xEventGroupGetBitsFromISR\r\n    #define traceRETURN_xEventGroupGetBitsFromISR( uxReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xEventGroupSetBits\r\n    #define traceENTER_xEventGroupSetBits( xEventGroup, uxBitsToSet )\r\n#endif\r\n\r\n#ifndef traceRETURN_xEventGroupSetBits\r\n    #define traceRETURN_xEventGroupSetBits( uxEventBits )\r\n#endif\r\n\r\n#ifndef traceENTER_vEventGroupDelete\r\n    #define traceENTER_vEventGroupDelete( xEventGroup )\r\n#endif\r\n\r\n#ifndef traceRETURN_vEventGroupDelete\r\n    #define traceRETURN_vEventGroupDelete()\r\n#endif\r\n\r\n#ifndef traceENTER_xEventGroupGetStaticBuffer\r\n    #define traceENTER_xEventGroupGetStaticBuffer( xEventGroup, ppxEventGroupBuffer )\r\n#endif\r\n\r\n#ifndef traceRETURN_xEventGroupGetStaticBuffer\r\n    #define traceRETURN_xEventGroupGetStaticBuffer( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_vEventGroupSetBitsCallback\r\n    #define traceENTER_vEventGroupSetBitsCallback( pvEventGroup, ulBitsToSet )\r\n#endif\r\n\r\n#ifndef traceRETURN_vEventGroupSetBitsCallback\r\n    #define traceRETURN_vEventGroupSetBitsCallback()\r\n#endif\r\n\r\n#ifndef traceENTER_vEventGroupClearBitsCallback\r\n    #define traceENTER_vEventGroupClearBitsCallback( pvEventGroup, ulBitsToClear )\r\n#endif\r\n\r\n#ifndef traceRETURN_vEventGroupClearBitsCallback\r\n    #define traceRETURN_vEventGroupClearBitsCallback()\r\n#endif\r\n\r\n#ifndef traceENTER_xEventGroupSetBitsFromISR\r\n    #define traceENTER_xEventGroupSetBitsFromISR( xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken )\r\n#endif\r\n\r\n#ifndef traceRETURN_xEventGroupSetBitsFromISR\r\n    #define traceRETURN_xEventGroupSetBitsFromISR( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_uxEventGroupGetNumber\r\n    #define traceENTER_uxEventGroupGetNumber( xEventGroup )\r\n#endif\r\n\r\n#ifndef traceRETURN_uxEventGroupGetNumber\r\n    #define traceRETURN_uxEventGroupGetNumber( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_vEventGroupSetNumber\r\n    #define traceENTER_vEventGroupSetNumber( xEventGroup, uxEventGroupNumber )\r\n#endif\r\n\r\n#ifndef traceRETURN_vEventGroupSetNumber\r\n    #define traceRETURN_vEventGroupSetNumber()\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueGenericReset\r\n    #define traceENTER_xQueueGenericReset( xQueue, xNewQueue )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueGenericReset\r\n    #define traceRETURN_xQueueGenericReset( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueGenericCreateStatic\r\n    #define traceENTER_xQueueGenericCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxStaticQueue, ucQueueType )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueGenericCreateStatic\r\n    #define traceRETURN_xQueueGenericCreateStatic( pxNewQueue )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueGenericGetStaticBuffers\r\n    #define traceENTER_xQueueGenericGetStaticBuffers( xQueue, ppucQueueStorage, ppxStaticQueue )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueGenericGetStaticBuffers\r\n    #define traceRETURN_xQueueGenericGetStaticBuffers( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueGenericCreate\r\n    #define traceENTER_xQueueGenericCreate( uxQueueLength, uxItemSize, ucQueueType )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueGenericCreate\r\n    #define traceRETURN_xQueueGenericCreate( pxNewQueue )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueCreateMutex\r\n    #define traceENTER_xQueueCreateMutex( ucQueueType )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueCreateMutex\r\n    #define traceRETURN_xQueueCreateMutex( xNewQueue )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueCreateMutexStatic\r\n    #define traceENTER_xQueueCreateMutexStatic( ucQueueType, pxStaticQueue )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueCreateMutexStatic\r\n    #define traceRETURN_xQueueCreateMutexStatic( xNewQueue )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueGetMutexHolder\r\n    #define traceENTER_xQueueGetMutexHolder( xSemaphore )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueGetMutexHolder\r\n    #define traceRETURN_xQueueGetMutexHolder( pxReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueGetMutexHolderFromISR\r\n    #define traceENTER_xQueueGetMutexHolderFromISR( xSemaphore )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueGetMutexHolderFromISR\r\n    #define traceRETURN_xQueueGetMutexHolderFromISR( pxReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueGiveMutexRecursive\r\n    #define traceENTER_xQueueGiveMutexRecursive( xMutex )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueGiveMutexRecursive\r\n    #define traceRETURN_xQueueGiveMutexRecursive( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueTakeMutexRecursive\r\n    #define traceENTER_xQueueTakeMutexRecursive( xMutex, xTicksToWait )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueTakeMutexRecursive\r\n    #define traceRETURN_xQueueTakeMutexRecursive( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueCreateCountingSemaphoreStatic\r\n    #define traceENTER_xQueueCreateCountingSemaphoreStatic( uxMaxCount, uxInitialCount, pxStaticQueue )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueCreateCountingSemaphoreStatic\r\n    #define traceRETURN_xQueueCreateCountingSemaphoreStatic( xHandle )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueCreateCountingSemaphore\r\n    #define traceENTER_xQueueCreateCountingSemaphore( uxMaxCount, uxInitialCount )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueCreateCountingSemaphore\r\n    #define traceRETURN_xQueueCreateCountingSemaphore( xHandle )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueGenericSend\r\n    #define traceENTER_xQueueGenericSend( xQueue, pvItemToQueue, xTicksToWait, xCopyPosition )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueGenericSend\r\n    #define traceRETURN_xQueueGenericSend( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueGenericSendFromISR\r\n    #define traceENTER_xQueueGenericSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken, xCopyPosition )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueGenericSendFromISR\r\n    #define traceRETURN_xQueueGenericSendFromISR( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueGiveFromISR\r\n    #define traceENTER_xQueueGiveFromISR( xQueue, pxHigherPriorityTaskWoken )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueGiveFromISR\r\n    #define traceRETURN_xQueueGiveFromISR( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueReceive\r\n    #define traceENTER_xQueueReceive( xQueue, pvBuffer, xTicksToWait )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueReceive\r\n    #define traceRETURN_xQueueReceive( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueSemaphoreTake\r\n    #define traceENTER_xQueueSemaphoreTake( xQueue, xTicksToWait )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueSemaphoreTake\r\n    #define traceRETURN_xQueueSemaphoreTake( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueuePeek\r\n    #define traceENTER_xQueuePeek( xQueue, pvBuffer, xTicksToWait )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueuePeek\r\n    #define traceRETURN_xQueuePeek( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueReceiveFromISR\r\n    #define traceENTER_xQueueReceiveFromISR( xQueue, pvBuffer, pxHigherPriorityTaskWoken )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueReceiveFromISR\r\n    #define traceRETURN_xQueueReceiveFromISR( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueuePeekFromISR\r\n    #define traceENTER_xQueuePeekFromISR( xQueue, pvBuffer )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueuePeekFromISR\r\n    #define traceRETURN_xQueuePeekFromISR( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_uxQueueMessagesWaiting\r\n    #define traceENTER_uxQueueMessagesWaiting( xQueue )\r\n#endif\r\n\r\n#ifndef traceRETURN_uxQueueMessagesWaiting\r\n    #define traceRETURN_uxQueueMessagesWaiting( uxReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_uxQueueSpacesAvailable\r\n    #define traceENTER_uxQueueSpacesAvailable( xQueue )\r\n#endif\r\n\r\n#ifndef traceRETURN_uxQueueSpacesAvailable\r\n    #define traceRETURN_uxQueueSpacesAvailable( uxReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_uxQueueMessagesWaitingFromISR\r\n    #define traceENTER_uxQueueMessagesWaitingFromISR( xQueue )\r\n#endif\r\n\r\n#ifndef traceRETURN_uxQueueMessagesWaitingFromISR\r\n    #define traceRETURN_uxQueueMessagesWaitingFromISR( uxReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_vQueueDelete\r\n    #define traceENTER_vQueueDelete( xQueue )\r\n#endif\r\n\r\n#ifndef traceRETURN_vQueueDelete\r\n    #define traceRETURN_vQueueDelete()\r\n#endif\r\n\r\n#ifndef traceENTER_uxQueueGetQueueNumber\r\n    #define traceENTER_uxQueueGetQueueNumber( xQueue )\r\n#endif\r\n\r\n#ifndef traceRETURN_uxQueueGetQueueNumber\r\n    #define traceRETURN_uxQueueGetQueueNumber( uxQueueNumber )\r\n#endif\r\n\r\n#ifndef traceENTER_vQueueSetQueueNumber\r\n    #define traceENTER_vQueueSetQueueNumber( xQueue, uxQueueNumber )\r\n#endif\r\n\r\n#ifndef traceRETURN_vQueueSetQueueNumber\r\n    #define traceRETURN_vQueueSetQueueNumber()\r\n#endif\r\n\r\n#ifndef traceENTER_ucQueueGetQueueType\r\n    #define traceENTER_ucQueueGetQueueType( xQueue )\r\n#endif\r\n\r\n#ifndef traceRETURN_ucQueueGetQueueType\r\n    #define traceRETURN_ucQueueGetQueueType( ucQueueType )\r\n#endif\r\n\r\n#ifndef traceENTER_uxQueueGetQueueItemSize\r\n    #define traceENTER_uxQueueGetQueueItemSize( xQueue )\r\n#endif\r\n\r\n#ifndef traceRETURN_uxQueueGetQueueItemSize\r\n    #define traceRETURN_uxQueueGetQueueItemSize( uxItemSize )\r\n#endif\r\n\r\n#ifndef traceENTER_uxQueueGetQueueLength\r\n    #define traceENTER_uxQueueGetQueueLength( xQueue )\r\n#endif\r\n\r\n#ifndef traceRETURN_uxQueueGetQueueLength\r\n    #define traceRETURN_uxQueueGetQueueLength( uxLength )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueIsQueueEmptyFromISR\r\n    #define traceENTER_xQueueIsQueueEmptyFromISR( xQueue )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueIsQueueEmptyFromISR\r\n    #define traceRETURN_xQueueIsQueueEmptyFromISR( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueIsQueueFullFromISR\r\n    #define traceENTER_xQueueIsQueueFullFromISR( xQueue )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueIsQueueFullFromISR\r\n    #define traceRETURN_xQueueIsQueueFullFromISR( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueCRSend\r\n    #define traceENTER_xQueueCRSend( xQueue, pvItemToQueue, xTicksToWait )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueCRSend\r\n    #define traceRETURN_xQueueCRSend( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueCRReceive\r\n    #define traceENTER_xQueueCRReceive( xQueue, pvBuffer, xTicksToWait )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueCRReceive\r\n    #define traceRETURN_xQueueCRReceive( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueCRSendFromISR\r\n    #define traceENTER_xQueueCRSendFromISR( xQueue, pvItemToQueue, xCoRoutinePreviouslyWoken )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueCRSendFromISR\r\n    #define traceRETURN_xQueueCRSendFromISR( xCoRoutinePreviouslyWoken )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueCRReceiveFromISR\r\n    #define traceENTER_xQueueCRReceiveFromISR( xQueue, pvBuffer, pxCoRoutineWoken )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueCRReceiveFromISR\r\n    #define traceRETURN_xQueueCRReceiveFromISR( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_vQueueAddToRegistry\r\n    #define traceENTER_vQueueAddToRegistry( xQueue, pcQueueName )\r\n#endif\r\n\r\n#ifndef traceRETURN_vQueueAddToRegistry\r\n    #define traceRETURN_vQueueAddToRegistry()\r\n#endif\r\n\r\n#ifndef traceENTER_pcQueueGetName\r\n    #define traceENTER_pcQueueGetName( xQueue )\r\n#endif\r\n\r\n#ifndef traceRETURN_pcQueueGetName\r\n    #define traceRETURN_pcQueueGetName( pcReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_vQueueUnregisterQueue\r\n    #define traceENTER_vQueueUnregisterQueue( xQueue )\r\n#endif\r\n\r\n#ifndef traceRETURN_vQueueUnregisterQueue\r\n    #define traceRETURN_vQueueUnregisterQueue()\r\n#endif\r\n\r\n#ifndef traceENTER_vQueueWaitForMessageRestricted\r\n    #define traceENTER_vQueueWaitForMessageRestricted( xQueue, xTicksToWait, xWaitIndefinitely )\r\n#endif\r\n\r\n#ifndef traceRETURN_vQueueWaitForMessageRestricted\r\n    #define traceRETURN_vQueueWaitForMessageRestricted()\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueCreateSet\r\n    #define traceENTER_xQueueCreateSet( uxEventQueueLength )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueCreateSet\r\n    #define traceRETURN_xQueueCreateSet( pxQueue )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueAddToSet\r\n    #define traceENTER_xQueueAddToSet( xQueueOrSemaphore, xQueueSet )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueAddToSet\r\n    #define traceRETURN_xQueueAddToSet( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueRemoveFromSet\r\n    #define traceENTER_xQueueRemoveFromSet( xQueueOrSemaphore, xQueueSet )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueRemoveFromSet\r\n    #define traceRETURN_xQueueRemoveFromSet( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueSelectFromSet\r\n    #define traceENTER_xQueueSelectFromSet( xQueueSet, xTicksToWait )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueSelectFromSet\r\n    #define traceRETURN_xQueueSelectFromSet( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xQueueSelectFromSetFromISR\r\n    #define traceENTER_xQueueSelectFromSetFromISR( xQueueSet )\r\n#endif\r\n\r\n#ifndef traceRETURN_xQueueSelectFromSetFromISR\r\n    #define traceRETURN_xQueueSelectFromSetFromISR( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTimerCreateTimerTask\r\n    #define traceENTER_xTimerCreateTimerTask()\r\n#endif\r\n\r\n#ifndef traceRETURN_xTimerCreateTimerTask\r\n    #define traceRETURN_xTimerCreateTimerTask( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTimerCreate\r\n    #define traceENTER_xTimerCreate( pcTimerName, xTimerPeriodInTicks, xAutoReload, pvTimerID, pxCallbackFunction )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTimerCreate\r\n    #define traceRETURN_xTimerCreate( pxNewTimer )\r\n#endif\r\n\r\n#ifndef traceENTER_xTimerCreateStatic\r\n    #define traceENTER_xTimerCreateStatic( pcTimerName, xTimerPeriodInTicks, xAutoReload, pvTimerID, pxCallbackFunction, pxTimerBuffer )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTimerCreateStatic\r\n    #define traceRETURN_xTimerCreateStatic( pxNewTimer )\r\n#endif\r\n\r\n#ifndef traceENTER_xTimerGenericCommandFromTask\r\n    #define traceENTER_xTimerGenericCommandFromTask( xTimer, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTimerGenericCommandFromTask\r\n    #define traceRETURN_xTimerGenericCommandFromTask( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTimerGenericCommandFromISR\r\n    #define traceENTER_xTimerGenericCommandFromISR( xTimer, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTimerGenericCommandFromISR\r\n    #define traceRETURN_xTimerGenericCommandFromISR( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTimerGetTimerDaemonTaskHandle\r\n    #define traceENTER_xTimerGetTimerDaemonTaskHandle()\r\n#endif\r\n\r\n#ifndef traceRETURN_xTimerGetTimerDaemonTaskHandle\r\n    #define traceRETURN_xTimerGetTimerDaemonTaskHandle( xTimerTaskHandle )\r\n#endif\r\n\r\n#ifndef traceENTER_xTimerGetPeriod\r\n    #define traceENTER_xTimerGetPeriod( xTimer )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTimerGetPeriod\r\n    #define traceRETURN_xTimerGetPeriod( xTimerPeriodInTicks )\r\n#endif\r\n\r\n#ifndef traceENTER_vTimerSetReloadMode\r\n    #define traceENTER_vTimerSetReloadMode( xTimer, xAutoReload )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTimerSetReloadMode\r\n    #define traceRETURN_vTimerSetReloadMode()\r\n#endif\r\n\r\n#ifndef traceENTER_xTimerGetReloadMode\r\n    #define traceENTER_xTimerGetReloadMode( xTimer )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTimerGetReloadMode\r\n    #define traceRETURN_xTimerGetReloadMode( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_uxTimerGetReloadMode\r\n    #define traceENTER_uxTimerGetReloadMode( xTimer )\r\n#endif\r\n\r\n#ifndef traceRETURN_uxTimerGetReloadMode\r\n    #define traceRETURN_uxTimerGetReloadMode( uxReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTimerGetExpiryTime\r\n    #define traceENTER_xTimerGetExpiryTime( xTimer )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTimerGetExpiryTime\r\n    #define traceRETURN_xTimerGetExpiryTime( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTimerGetStaticBuffer\r\n    #define traceENTER_xTimerGetStaticBuffer( xTimer, ppxTimerBuffer )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTimerGetStaticBuffer\r\n    #define traceRETURN_xTimerGetStaticBuffer( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_pcTimerGetName\r\n    #define traceENTER_pcTimerGetName( xTimer )\r\n#endif\r\n\r\n#ifndef traceRETURN_pcTimerGetName\r\n    #define traceRETURN_pcTimerGetName( pcTimerName )\r\n#endif\r\n\r\n#ifndef traceENTER_xTimerIsTimerActive\r\n    #define traceENTER_xTimerIsTimerActive( xTimer )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTimerIsTimerActive\r\n    #define traceRETURN_xTimerIsTimerActive( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_pvTimerGetTimerID\r\n    #define traceENTER_pvTimerGetTimerID( xTimer )\r\n#endif\r\n\r\n#ifndef traceRETURN_pvTimerGetTimerID\r\n    #define traceRETURN_pvTimerGetTimerID( pvReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_vTimerSetTimerID\r\n    #define traceENTER_vTimerSetTimerID( xTimer, pvNewID )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTimerSetTimerID\r\n    #define traceRETURN_vTimerSetTimerID()\r\n#endif\r\n\r\n#ifndef traceENTER_xTimerPendFunctionCallFromISR\r\n    #define traceENTER_xTimerPendFunctionCallFromISR( xFunctionToPend, pvParameter1, ulParameter2, pxHigherPriorityTaskWoken )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTimerPendFunctionCallFromISR\r\n    #define traceRETURN_xTimerPendFunctionCallFromISR( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTimerPendFunctionCall\r\n    #define traceENTER_xTimerPendFunctionCall( xFunctionToPend, pvParameter1, ulParameter2, xTicksToWait )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTimerPendFunctionCall\r\n    #define traceRETURN_xTimerPendFunctionCall( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_uxTimerGetTimerNumber\r\n    #define traceENTER_uxTimerGetTimerNumber( xTimer )\r\n#endif\r\n\r\n#ifndef traceRETURN_uxTimerGetTimerNumber\r\n    #define traceRETURN_uxTimerGetTimerNumber( uxTimerNumber )\r\n#endif\r\n\r\n#ifndef traceENTER_vTimerSetTimerNumber\r\n    #define traceENTER_vTimerSetTimerNumber( xTimer, uxTimerNumber )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTimerSetTimerNumber\r\n    #define traceRETURN_vTimerSetTimerNumber()\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskCreateStatic\r\n    #define traceENTER_xTaskCreateStatic( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskCreateStatic\r\n    #define traceRETURN_xTaskCreateStatic( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskCreateStaticAffinitySet\r\n    #define traceENTER_xTaskCreateStaticAffinitySet( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer, uxCoreAffinityMask )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskCreateStaticAffinitySet\r\n    #define traceRETURN_xTaskCreateStaticAffinitySet( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskCreateRestrictedStatic\r\n    #define traceENTER_xTaskCreateRestrictedStatic( pxTaskDefinition, pxCreatedTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskCreateRestrictedStatic\r\n    #define traceRETURN_xTaskCreateRestrictedStatic( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskCreateRestrictedStaticAffinitySet\r\n    #define traceENTER_xTaskCreateRestrictedStaticAffinitySet( pxTaskDefinition, uxCoreAffinityMask, pxCreatedTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskCreateRestrictedStaticAffinitySet\r\n    #define traceRETURN_xTaskCreateRestrictedStaticAffinitySet( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskCreateRestricted\r\n    #define traceENTER_xTaskCreateRestricted( pxTaskDefinition, pxCreatedTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskCreateRestricted\r\n    #define traceRETURN_xTaskCreateRestricted( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskCreateRestrictedAffinitySet\r\n    #define traceENTER_xTaskCreateRestrictedAffinitySet( pxTaskDefinition, uxCoreAffinityMask, pxCreatedTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskCreateRestrictedAffinitySet\r\n    #define traceRETURN_xTaskCreateRestrictedAffinitySet( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskCreate\r\n    #define traceENTER_xTaskCreate( pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskCreate\r\n    #define traceRETURN_xTaskCreate( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskCreateAffinitySet\r\n    #define traceENTER_xTaskCreateAffinitySet( pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, uxCoreAffinityMask, pxCreatedTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskCreateAffinitySet\r\n    #define traceRETURN_xTaskCreateAffinitySet( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskDelete\r\n    #define traceENTER_vTaskDelete( xTaskToDelete )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskDelete\r\n    #define traceRETURN_vTaskDelete()\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskDelayUntil\r\n    #define traceENTER_xTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskDelayUntil\r\n    #define traceRETURN_xTaskDelayUntil( xShouldDelay )\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskDelay\r\n    #define traceENTER_vTaskDelay( xTicksToDelay )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskDelay\r\n    #define traceRETURN_vTaskDelay()\r\n#endif\r\n\r\n#ifndef traceENTER_eTaskGetState\r\n    #define traceENTER_eTaskGetState( xTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_eTaskGetState\r\n    #define traceRETURN_eTaskGetState( eReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_uxTaskPriorityGet\r\n    #define traceENTER_uxTaskPriorityGet( xTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_uxTaskPriorityGet\r\n    #define traceRETURN_uxTaskPriorityGet( uxReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_uxTaskPriorityGetFromISR\r\n    #define traceENTER_uxTaskPriorityGetFromISR( xTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_uxTaskPriorityGetFromISR\r\n    #define traceRETURN_uxTaskPriorityGetFromISR( uxReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_uxTaskBasePriorityGet\r\n    #define traceENTER_uxTaskBasePriorityGet( xTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_uxTaskBasePriorityGet\r\n    #define traceRETURN_uxTaskBasePriorityGet( uxReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_uxTaskBasePriorityGetFromISR\r\n    #define traceENTER_uxTaskBasePriorityGetFromISR( xTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_uxTaskBasePriorityGetFromISR\r\n    #define traceRETURN_uxTaskBasePriorityGetFromISR( uxReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskPrioritySet\r\n    #define traceENTER_vTaskPrioritySet( xTask, uxNewPriority )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskPrioritySet\r\n    #define traceRETURN_vTaskPrioritySet()\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskCoreAffinitySet\r\n    #define traceENTER_vTaskCoreAffinitySet( xTask, uxCoreAffinityMask )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskCoreAffinitySet\r\n    #define traceRETURN_vTaskCoreAffinitySet()\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskCoreAffinityGet\r\n    #define traceENTER_vTaskCoreAffinityGet( xTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskCoreAffinityGet\r\n    #define traceRETURN_vTaskCoreAffinityGet( uxCoreAffinityMask )\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskPreemptionDisable\r\n    #define traceENTER_vTaskPreemptionDisable( xTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskPreemptionDisable\r\n    #define traceRETURN_vTaskPreemptionDisable()\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskPreemptionEnable\r\n    #define traceENTER_vTaskPreemptionEnable( xTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskPreemptionEnable\r\n    #define traceRETURN_vTaskPreemptionEnable()\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskSuspend\r\n    #define traceENTER_vTaskSuspend( xTaskToSuspend )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskSuspend\r\n    #define traceRETURN_vTaskSuspend()\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskResume\r\n    #define traceENTER_vTaskResume( xTaskToResume )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskResume\r\n    #define traceRETURN_vTaskResume()\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskResumeFromISR\r\n    #define traceENTER_xTaskResumeFromISR( xTaskToResume )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskResumeFromISR\r\n    #define traceRETURN_xTaskResumeFromISR( xYieldRequired )\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskStartScheduler\r\n    #define traceENTER_vTaskStartScheduler()\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskStartScheduler\r\n    #define traceRETURN_vTaskStartScheduler()\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskEndScheduler\r\n    #define traceENTER_vTaskEndScheduler()\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskEndScheduler\r\n    #define traceRETURN_vTaskEndScheduler()\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskSuspendAll\r\n    #define traceENTER_vTaskSuspendAll()\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskSuspendAll\r\n    #define traceRETURN_vTaskSuspendAll()\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskResumeAll\r\n    #define traceENTER_xTaskResumeAll()\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskResumeAll\r\n    #define traceRETURN_xTaskResumeAll( xAlreadyYielded )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskGetTickCount\r\n    #define traceENTER_xTaskGetTickCount()\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskGetTickCount\r\n    #define traceRETURN_xTaskGetTickCount( xTicks )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskGetTickCountFromISR\r\n    #define traceENTER_xTaskGetTickCountFromISR()\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskGetTickCountFromISR\r\n    #define traceRETURN_xTaskGetTickCountFromISR( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_uxTaskGetNumberOfTasks\r\n    #define traceENTER_uxTaskGetNumberOfTasks()\r\n#endif\r\n\r\n#ifndef traceRETURN_uxTaskGetNumberOfTasks\r\n    #define traceRETURN_uxTaskGetNumberOfTasks( uxCurrentNumberOfTasks )\r\n#endif\r\n\r\n#ifndef traceENTER_pcTaskGetName\r\n    #define traceENTER_pcTaskGetName( xTaskToQuery )\r\n#endif\r\n\r\n#ifndef traceRETURN_pcTaskGetName\r\n    #define traceRETURN_pcTaskGetName( pcTaskName )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskGetHandle\r\n    #define traceENTER_xTaskGetHandle( pcNameToQuery )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskGetHandle\r\n    #define traceRETURN_xTaskGetHandle( pxTCB )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskGetStaticBuffers\r\n    #define traceENTER_xTaskGetStaticBuffers( xTask, ppuxStackBuffer, ppxTaskBuffer )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskGetStaticBuffers\r\n    #define traceRETURN_xTaskGetStaticBuffers( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_uxTaskGetSystemState\r\n    #define traceENTER_uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, pulTotalRunTime )\r\n#endif\r\n\r\n#ifndef traceRETURN_uxTaskGetSystemState\r\n    #define traceRETURN_uxTaskGetSystemState( uxTask )\r\n#endif\r\n\r\n#if ( configNUMBER_OF_CORES == 1 )\r\n    #ifndef traceENTER_xTaskGetIdleTaskHandle\r\n        #define traceENTER_xTaskGetIdleTaskHandle()\r\n    #endif\r\n#endif\r\n\r\n#if ( configNUMBER_OF_CORES == 1 )\r\n    #ifndef traceRETURN_xTaskGetIdleTaskHandle\r\n        #define traceRETURN_xTaskGetIdleTaskHandle( xIdleTaskHandle )\r\n    #endif\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskGetIdleTaskHandleForCore\r\n    #define traceENTER_xTaskGetIdleTaskHandleForCore( xCoreID )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskGetIdleTaskHandleForCore\r\n    #define traceRETURN_xTaskGetIdleTaskHandleForCore( xIdleTaskHandle )\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskStepTick\r\n    #define traceENTER_vTaskStepTick( xTicksToJump )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskStepTick\r\n    #define traceRETURN_vTaskStepTick()\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskCatchUpTicks\r\n    #define traceENTER_xTaskCatchUpTicks( xTicksToCatchUp )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskCatchUpTicks\r\n    #define traceRETURN_xTaskCatchUpTicks( xYieldOccurred )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskAbortDelay\r\n    #define traceENTER_xTaskAbortDelay( xTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskAbortDelay\r\n    #define traceRETURN_xTaskAbortDelay( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskIncrementTick\r\n    #define traceENTER_xTaskIncrementTick()\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskIncrementTick\r\n    #define traceRETURN_xTaskIncrementTick( xSwitchRequired )\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskSetApplicationTaskTag\r\n    #define traceENTER_vTaskSetApplicationTaskTag( xTask, pxHookFunction )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskSetApplicationTaskTag\r\n    #define traceRETURN_vTaskSetApplicationTaskTag()\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskGetApplicationTaskTag\r\n    #define traceENTER_xTaskGetApplicationTaskTag( xTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskGetApplicationTaskTag\r\n    #define traceRETURN_xTaskGetApplicationTaskTag( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskGetApplicationTaskTagFromISR\r\n    #define traceENTER_xTaskGetApplicationTaskTagFromISR( xTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskGetApplicationTaskTagFromISR\r\n    #define traceRETURN_xTaskGetApplicationTaskTagFromISR( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskCallApplicationTaskHook\r\n    #define traceENTER_xTaskCallApplicationTaskHook( xTask, pvParameter )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskCallApplicationTaskHook\r\n    #define traceRETURN_xTaskCallApplicationTaskHook( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskSwitchContext\r\n    #define traceENTER_vTaskSwitchContext()\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskSwitchContext\r\n    #define traceRETURN_vTaskSwitchContext()\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskPlaceOnEventList\r\n    #define traceENTER_vTaskPlaceOnEventList( pxEventList, xTicksToWait )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskPlaceOnEventList\r\n    #define traceRETURN_vTaskPlaceOnEventList()\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskPlaceOnUnorderedEventList\r\n    #define traceENTER_vTaskPlaceOnUnorderedEventList( pxEventList, xItemValue, xTicksToWait )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskPlaceOnUnorderedEventList\r\n    #define traceRETURN_vTaskPlaceOnUnorderedEventList()\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskPlaceOnEventListRestricted\r\n    #define traceENTER_vTaskPlaceOnEventListRestricted( pxEventList, xTicksToWait, xWaitIndefinitely )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskPlaceOnEventListRestricted\r\n    #define traceRETURN_vTaskPlaceOnEventListRestricted()\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskRemoveFromEventList\r\n    #define traceENTER_xTaskRemoveFromEventList( pxEventList )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskRemoveFromEventList\r\n    #define traceRETURN_xTaskRemoveFromEventList( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskRemoveFromUnorderedEventList\r\n    #define traceENTER_vTaskRemoveFromUnorderedEventList( pxEventListItem, xItemValue )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskRemoveFromUnorderedEventList\r\n    #define traceRETURN_vTaskRemoveFromUnorderedEventList()\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskSetTimeOutState\r\n    #define traceENTER_vTaskSetTimeOutState( pxTimeOut )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskSetTimeOutState\r\n    #define traceRETURN_vTaskSetTimeOutState()\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskInternalSetTimeOutState\r\n    #define traceENTER_vTaskInternalSetTimeOutState( pxTimeOut )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskInternalSetTimeOutState\r\n    #define traceRETURN_vTaskInternalSetTimeOutState()\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskCheckForTimeOut\r\n    #define traceENTER_xTaskCheckForTimeOut( pxTimeOut, pxTicksToWait )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskCheckForTimeOut\r\n    #define traceRETURN_xTaskCheckForTimeOut( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskMissedYield\r\n    #define traceENTER_vTaskMissedYield()\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskMissedYield\r\n    #define traceRETURN_vTaskMissedYield()\r\n#endif\r\n\r\n#ifndef traceENTER_uxTaskGetTaskNumber\r\n    #define traceENTER_uxTaskGetTaskNumber( xTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_uxTaskGetTaskNumber\r\n    #define traceRETURN_uxTaskGetTaskNumber( uxReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskSetTaskNumber\r\n    #define traceENTER_vTaskSetTaskNumber( xTask, uxHandle )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskSetTaskNumber\r\n    #define traceRETURN_vTaskSetTaskNumber()\r\n#endif\r\n\r\n#ifndef traceENTER_eTaskConfirmSleepModeStatus\r\n    #define traceENTER_eTaskConfirmSleepModeStatus()\r\n#endif\r\n\r\n#ifndef traceRETURN_eTaskConfirmSleepModeStatus\r\n    #define traceRETURN_eTaskConfirmSleepModeStatus( eReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskSetThreadLocalStoragePointer\r\n    #define traceENTER_vTaskSetThreadLocalStoragePointer( xTaskToSet, xIndex, pvValue )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskSetThreadLocalStoragePointer\r\n    #define traceRETURN_vTaskSetThreadLocalStoragePointer()\r\n#endif\r\n\r\n#ifndef traceENTER_pvTaskGetThreadLocalStoragePointer\r\n    #define traceENTER_pvTaskGetThreadLocalStoragePointer( xTaskToQuery, xIndex )\r\n#endif\r\n\r\n#ifndef traceRETURN_pvTaskGetThreadLocalStoragePointer\r\n    #define traceRETURN_pvTaskGetThreadLocalStoragePointer( pvReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskAllocateMPURegions\r\n    #define traceENTER_vTaskAllocateMPURegions( xTaskToModify, pxRegions )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskAllocateMPURegions\r\n    #define traceRETURN_vTaskAllocateMPURegions()\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskGetInfo\r\n    #define traceENTER_vTaskGetInfo( xTask, pxTaskStatus, xGetFreeStackSpace, eState )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskGetInfo\r\n    #define traceRETURN_vTaskGetInfo()\r\n#endif\r\n\r\n#ifndef traceENTER_uxTaskGetStackHighWaterMark2\r\n    #define traceENTER_uxTaskGetStackHighWaterMark2( xTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_uxTaskGetStackHighWaterMark2\r\n    #define traceRETURN_uxTaskGetStackHighWaterMark2( uxReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_uxTaskGetStackHighWaterMark\r\n    #define traceENTER_uxTaskGetStackHighWaterMark( xTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_uxTaskGetStackHighWaterMark\r\n    #define traceRETURN_uxTaskGetStackHighWaterMark( uxReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskGetCurrentTaskHandle\r\n    #define traceENTER_xTaskGetCurrentTaskHandle()\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskGetCurrentTaskHandle\r\n    #define traceRETURN_xTaskGetCurrentTaskHandle( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskGetCurrentTaskHandleForCore\r\n    #define traceENTER_xTaskGetCurrentTaskHandleForCore( xCoreID )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskGetCurrentTaskHandleForCore\r\n    #define traceRETURN_xTaskGetCurrentTaskHandleForCore( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskGetSchedulerState\r\n    #define traceENTER_xTaskGetSchedulerState()\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskGetSchedulerState\r\n    #define traceRETURN_xTaskGetSchedulerState( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskPriorityInherit\r\n    #define traceENTER_xTaskPriorityInherit( pxMutexHolder )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskPriorityInherit\r\n    #define traceRETURN_xTaskPriorityInherit( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskPriorityDisinherit\r\n    #define traceENTER_xTaskPriorityDisinherit( pxMutexHolder )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskPriorityDisinherit\r\n    #define traceRETURN_xTaskPriorityDisinherit( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskPriorityDisinheritAfterTimeout\r\n    #define traceENTER_vTaskPriorityDisinheritAfterTimeout( pxMutexHolder, uxHighestPriorityWaitingTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskPriorityDisinheritAfterTimeout\r\n    #define traceRETURN_vTaskPriorityDisinheritAfterTimeout()\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskYieldWithinAPI\r\n    #define traceENTER_vTaskYieldWithinAPI()\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskYieldWithinAPI\r\n    #define traceRETURN_vTaskYieldWithinAPI()\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskEnterCritical\r\n    #define traceENTER_vTaskEnterCritical()\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskEnterCritical\r\n    #define traceRETURN_vTaskEnterCritical()\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskEnterCriticalFromISR\r\n    #define traceENTER_vTaskEnterCriticalFromISR()\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskEnterCriticalFromISR\r\n    #define traceRETURN_vTaskEnterCriticalFromISR( uxSavedInterruptStatus )\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskExitCritical\r\n    #define traceENTER_vTaskExitCritical()\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskExitCritical\r\n    #define traceRETURN_vTaskExitCritical()\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskExitCriticalFromISR\r\n    #define traceENTER_vTaskExitCriticalFromISR( uxSavedInterruptStatus )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskExitCriticalFromISR\r\n    #define traceRETURN_vTaskExitCriticalFromISR()\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskListTasks\r\n    #define traceENTER_vTaskListTasks( pcWriteBuffer, uxBufferLength )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskListTasks\r\n    #define traceRETURN_vTaskListTasks()\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskGetRunTimeStatistics\r\n    #define traceENTER_vTaskGetRunTimeStatistics( pcWriteBuffer, uxBufferLength )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskGetRunTimeStatistics\r\n    #define traceRETURN_vTaskGetRunTimeStatistics()\r\n#endif\r\n\r\n#ifndef traceENTER_uxTaskResetEventItemValue\r\n    #define traceENTER_uxTaskResetEventItemValue()\r\n#endif\r\n\r\n#ifndef traceRETURN_uxTaskResetEventItemValue\r\n    #define traceRETURN_uxTaskResetEventItemValue( uxReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_pvTaskIncrementMutexHeldCount\r\n    #define traceENTER_pvTaskIncrementMutexHeldCount()\r\n#endif\r\n\r\n#ifndef traceRETURN_pvTaskIncrementMutexHeldCount\r\n    #define traceRETURN_pvTaskIncrementMutexHeldCount( pxTCB )\r\n#endif\r\n\r\n#ifndef traceENTER_ulTaskGenericNotifyTake\r\n    #define traceENTER_ulTaskGenericNotifyTake( uxIndexToWaitOn, xClearCountOnExit, xTicksToWait )\r\n#endif\r\n\r\n#ifndef traceRETURN_ulTaskGenericNotifyTake\r\n    #define traceRETURN_ulTaskGenericNotifyTake( ulReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskGenericNotifyWait\r\n    #define traceENTER_xTaskGenericNotifyWait( uxIndexToWaitOn, ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskGenericNotifyWait\r\n    #define traceRETURN_xTaskGenericNotifyWait( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskGenericNotify\r\n    #define traceENTER_xTaskGenericNotify( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskGenericNotify\r\n    #define traceRETURN_xTaskGenericNotify( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskGenericNotifyFromISR\r\n    #define traceENTER_xTaskGenericNotifyFromISR( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskGenericNotifyFromISR\r\n    #define traceRETURN_xTaskGenericNotifyFromISR( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_vTaskGenericNotifyGiveFromISR\r\n    #define traceENTER_vTaskGenericNotifyGiveFromISR( xTaskToNotify, uxIndexToNotify, pxHigherPriorityTaskWoken )\r\n#endif\r\n\r\n#ifndef traceRETURN_vTaskGenericNotifyGiveFromISR\r\n    #define traceRETURN_vTaskGenericNotifyGiveFromISR()\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskGenericNotifyStateClear\r\n    #define traceENTER_xTaskGenericNotifyStateClear( xTask, uxIndexToClear )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskGenericNotifyStateClear\r\n    #define traceRETURN_xTaskGenericNotifyStateClear( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_ulTaskGenericNotifyValueClear\r\n    #define traceENTER_ulTaskGenericNotifyValueClear( xTask, uxIndexToClear, ulBitsToClear )\r\n#endif\r\n\r\n#ifndef traceRETURN_ulTaskGenericNotifyValueClear\r\n    #define traceRETURN_ulTaskGenericNotifyValueClear( ulReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_ulTaskGetRunTimeCounter\r\n    #define traceENTER_ulTaskGetRunTimeCounter( xTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_ulTaskGetRunTimeCounter\r\n    #define traceRETURN_ulTaskGetRunTimeCounter( ulRunTimeCounter )\r\n#endif\r\n\r\n#ifndef traceENTER_ulTaskGetRunTimePercent\r\n    #define traceENTER_ulTaskGetRunTimePercent( xTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_ulTaskGetRunTimePercent\r\n    #define traceRETURN_ulTaskGetRunTimePercent( ulReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_ulTaskGetIdleRunTimeCounter\r\n    #define traceENTER_ulTaskGetIdleRunTimeCounter()\r\n#endif\r\n\r\n#ifndef traceRETURN_ulTaskGetIdleRunTimeCounter\r\n    #define traceRETURN_ulTaskGetIdleRunTimeCounter( ulReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_ulTaskGetIdleRunTimePercent\r\n    #define traceENTER_ulTaskGetIdleRunTimePercent()\r\n#endif\r\n\r\n#ifndef traceRETURN_ulTaskGetIdleRunTimePercent\r\n    #define traceRETURN_ulTaskGetIdleRunTimePercent( ulReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xTaskGetMPUSettings\r\n    #define traceENTER_xTaskGetMPUSettings( xTask )\r\n#endif\r\n\r\n#ifndef traceRETURN_xTaskGetMPUSettings\r\n    #define traceRETURN_xTaskGetMPUSettings( xMPUSettings )\r\n#endif\r\n\r\n#ifndef traceENTER_xStreamBufferGenericCreate\r\n    #define traceENTER_xStreamBufferGenericCreate( xBufferSizeBytes, xTriggerLevelBytes, xIsMessageBuffer, pxSendCompletedCallback, pxReceiveCompletedCallback )\r\n#endif\r\n\r\n#ifndef traceRETURN_xStreamBufferGenericCreate\r\n    #define traceRETURN_xStreamBufferGenericCreate( pvAllocatedMemory )\r\n#endif\r\n\r\n#ifndef traceENTER_xStreamBufferGenericCreateStatic\r\n    #define traceENTER_xStreamBufferGenericCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, xIsMessageBuffer, pucStreamBufferStorageArea, pxStaticStreamBuffer, pxSendCompletedCallback, pxReceiveCompletedCallback )\r\n#endif\r\n\r\n#ifndef traceRETURN_xStreamBufferGenericCreateStatic\r\n    #define traceRETURN_xStreamBufferGenericCreateStatic( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xStreamBufferGetStaticBuffers\r\n    #define traceENTER_xStreamBufferGetStaticBuffers( xStreamBuffer, ppucStreamBufferStorageArea, ppxStaticStreamBuffer )\r\n#endif\r\n\r\n#ifndef traceRETURN_xStreamBufferGetStaticBuffers\r\n    #define traceRETURN_xStreamBufferGetStaticBuffers( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_vStreamBufferDelete\r\n    #define traceENTER_vStreamBufferDelete( xStreamBuffer )\r\n#endif\r\n\r\n#ifndef traceRETURN_vStreamBufferDelete\r\n    #define traceRETURN_vStreamBufferDelete()\r\n#endif\r\n\r\n#ifndef traceENTER_xStreamBufferReset\r\n    #define traceENTER_xStreamBufferReset( xStreamBuffer )\r\n#endif\r\n\r\n#ifndef traceRETURN_xStreamBufferReset\r\n    #define traceRETURN_xStreamBufferReset( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xStreamBufferSetTriggerLevel\r\n    #define traceENTER_xStreamBufferSetTriggerLevel( xStreamBuffer, xTriggerLevel )\r\n#endif\r\n\r\n#ifndef traceRETURN_xStreamBufferSetTriggerLevel\r\n    #define traceRETURN_xStreamBufferSetTriggerLevel( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xStreamBufferSpacesAvailable\r\n    #define traceENTER_xStreamBufferSpacesAvailable( xStreamBuffer )\r\n#endif\r\n\r\n#ifndef traceRETURN_xStreamBufferSpacesAvailable\r\n    #define traceRETURN_xStreamBufferSpacesAvailable( xSpace )\r\n#endif\r\n\r\n#ifndef traceENTER_xStreamBufferBytesAvailable\r\n    #define traceENTER_xStreamBufferBytesAvailable( xStreamBuffer )\r\n#endif\r\n\r\n#ifndef traceRETURN_xStreamBufferBytesAvailable\r\n    #define traceRETURN_xStreamBufferBytesAvailable( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xStreamBufferSend\r\n    #define traceENTER_xStreamBufferSend( xStreamBuffer, pvTxData, xDataLengthBytes, xTicksToWait )\r\n#endif\r\n\r\n#ifndef traceRETURN_xStreamBufferSend\r\n    #define traceRETURN_xStreamBufferSend( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xStreamBufferSendFromISR\r\n    #define traceENTER_xStreamBufferSendFromISR( xStreamBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken )\r\n#endif\r\n\r\n#ifndef traceRETURN_xStreamBufferSendFromISR\r\n    #define traceRETURN_xStreamBufferSendFromISR( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xStreamBufferReceive\r\n    #define traceENTER_xStreamBufferReceive( xStreamBuffer, pvRxData, xBufferLengthBytes, xTicksToWait )\r\n#endif\r\n\r\n#ifndef traceRETURN_xStreamBufferReceive\r\n    #define traceRETURN_xStreamBufferReceive( xReceivedLength )\r\n#endif\r\n\r\n#ifndef traceENTER_xStreamBufferNextMessageLengthBytes\r\n    #define traceENTER_xStreamBufferNextMessageLengthBytes( xStreamBuffer )\r\n#endif\r\n\r\n#ifndef traceRETURN_xStreamBufferNextMessageLengthBytes\r\n    #define traceRETURN_xStreamBufferNextMessageLengthBytes( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xStreamBufferReceiveFromISR\r\n    #define traceENTER_xStreamBufferReceiveFromISR( xStreamBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken )\r\n#endif\r\n\r\n#ifndef traceRETURN_xStreamBufferReceiveFromISR\r\n    #define traceRETURN_xStreamBufferReceiveFromISR( xReceivedLength )\r\n#endif\r\n\r\n#ifndef traceENTER_xStreamBufferIsEmpty\r\n    #define traceENTER_xStreamBufferIsEmpty( xStreamBuffer )\r\n#endif\r\n\r\n#ifndef traceRETURN_xStreamBufferIsEmpty\r\n    #define traceRETURN_xStreamBufferIsEmpty( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xStreamBufferIsFull\r\n    #define traceENTER_xStreamBufferIsFull( xStreamBuffer )\r\n#endif\r\n\r\n#ifndef traceRETURN_xStreamBufferIsFull\r\n    #define traceRETURN_xStreamBufferIsFull( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xStreamBufferSendCompletedFromISR\r\n    #define traceENTER_xStreamBufferSendCompletedFromISR( xStreamBuffer, pxHigherPriorityTaskWoken )\r\n#endif\r\n\r\n#ifndef traceRETURN_xStreamBufferSendCompletedFromISR\r\n    #define traceRETURN_xStreamBufferSendCompletedFromISR( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_xStreamBufferReceiveCompletedFromISR\r\n    #define traceENTER_xStreamBufferReceiveCompletedFromISR( xStreamBuffer, pxHigherPriorityTaskWoken )\r\n#endif\r\n\r\n#ifndef traceRETURN_xStreamBufferReceiveCompletedFromISR\r\n    #define traceRETURN_xStreamBufferReceiveCompletedFromISR( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_uxStreamBufferGetStreamBufferNumber\r\n    #define traceENTER_uxStreamBufferGetStreamBufferNumber( xStreamBuffer )\r\n#endif\r\n\r\n#ifndef traceRETURN_uxStreamBufferGetStreamBufferNumber\r\n    #define traceRETURN_uxStreamBufferGetStreamBufferNumber( uxStreamBufferNumber )\r\n#endif\r\n\r\n#ifndef traceENTER_vStreamBufferSetStreamBufferNumber\r\n    #define traceENTER_vStreamBufferSetStreamBufferNumber( xStreamBuffer, uxStreamBufferNumber )\r\n#endif\r\n\r\n#ifndef traceRETURN_vStreamBufferSetStreamBufferNumber\r\n    #define traceRETURN_vStreamBufferSetStreamBufferNumber()\r\n#endif\r\n\r\n#ifndef traceENTER_ucStreamBufferGetStreamBufferType\r\n    #define traceENTER_ucStreamBufferGetStreamBufferType( xStreamBuffer )\r\n#endif\r\n\r\n#ifndef traceRETURN_ucStreamBufferGetStreamBufferType\r\n    #define traceRETURN_ucStreamBufferGetStreamBufferType( ucStreamBufferType )\r\n#endif\r\n\r\n#ifndef traceENTER_vListInitialise\r\n    #define traceENTER_vListInitialise( pxList )\r\n#endif\r\n\r\n#ifndef traceRETURN_vListInitialise\r\n    #define traceRETURN_vListInitialise()\r\n#endif\r\n\r\n#ifndef traceENTER_vListInitialiseItem\r\n    #define traceENTER_vListInitialiseItem( pxItem )\r\n#endif\r\n\r\n#ifndef traceRETURN_vListInitialiseItem\r\n    #define traceRETURN_vListInitialiseItem()\r\n#endif\r\n\r\n#ifndef traceENTER_vListInsertEnd\r\n    #define traceENTER_vListInsertEnd( pxList, pxNewListItem )\r\n#endif\r\n\r\n#ifndef traceRETURN_vListInsertEnd\r\n    #define traceRETURN_vListInsertEnd()\r\n#endif\r\n\r\n#ifndef traceENTER_vListInsert\r\n    #define traceENTER_vListInsert( pxList, pxNewListItem )\r\n#endif\r\n\r\n#ifndef traceRETURN_vListInsert\r\n    #define traceRETURN_vListInsert()\r\n#endif\r\n\r\n#ifndef traceENTER_uxListRemove\r\n    #define traceENTER_uxListRemove( pxItemToRemove )\r\n#endif\r\n\r\n#ifndef traceRETURN_uxListRemove\r\n    #define traceRETURN_uxListRemove( uxNumberOfItems )\r\n#endif\r\n\r\n#ifndef traceENTER_xCoRoutineCreate\r\n    #define traceENTER_xCoRoutineCreate( pxCoRoutineCode, uxPriority, uxIndex )\r\n#endif\r\n\r\n#ifndef traceRETURN_xCoRoutineCreate\r\n    #define traceRETURN_xCoRoutineCreate( xReturn )\r\n#endif\r\n\r\n#ifndef traceENTER_vCoRoutineAddToDelayedList\r\n    #define traceENTER_vCoRoutineAddToDelayedList( xTicksToDelay, pxEventList )\r\n#endif\r\n\r\n#ifndef traceRETURN_vCoRoutineAddToDelayedList\r\n    #define traceRETURN_vCoRoutineAddToDelayedList()\r\n#endif\r\n\r\n#ifndef traceENTER_vCoRoutineSchedule\r\n    #define traceENTER_vCoRoutineSchedule()\r\n#endif\r\n\r\n#ifndef traceRETURN_vCoRoutineSchedule\r\n    #define traceRETURN_vCoRoutineSchedule()\r\n#endif\r\n\r\n#ifndef traceENTER_xCoRoutineRemoveFromEventList\r\n    #define traceENTER_xCoRoutineRemoveFromEventList( pxEventList )\r\n#endif\r\n\r\n#ifndef traceRETURN_xCoRoutineRemoveFromEventList\r\n    #define traceRETURN_xCoRoutineRemoveFromEventList( xReturn )\r\n#endif\r\n\r\n#ifndef configGENERATE_RUN_TIME_STATS\r\n    #define configGENERATE_RUN_TIME_STATS    0\r\n#endif\r\n\r\n#if ( configGENERATE_RUN_TIME_STATS == 1 )\r\n\r\n    #ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS\r\n        #error If configGENERATE_RUN_TIME_STATS is defined then portCONFIGURE_TIMER_FOR_RUN_TIME_STATS must also be defined.  portCONFIGURE_TIMER_FOR_RUN_TIME_STATS should call a port layer function to setup a peripheral timer/counter that can then be used as the run time counter time base.\r\n    #endif /* portCONFIGURE_TIMER_FOR_RUN_TIME_STATS */\r\n\r\n    #ifndef portGET_RUN_TIME_COUNTER_VALUE\r\n        #ifndef portALT_GET_RUN_TIME_COUNTER_VALUE\r\n            #error If configGENERATE_RUN_TIME_STATS is defined then either portGET_RUN_TIME_COUNTER_VALUE or portALT_GET_RUN_TIME_COUNTER_VALUE must also be defined.  See the examples provided and the FreeRTOS web site for more information.\r\n        #endif /* portALT_GET_RUN_TIME_COUNTER_VALUE */\r\n    #endif /* portGET_RUN_TIME_COUNTER_VALUE */\r\n\r\n#endif /* configGENERATE_RUN_TIME_STATS */\r\n\r\n#ifndef portCONFIGURE_TIMER_FOR_RUN_TIME_STATS\r\n    #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()\r\n#endif\r\n\r\n#ifndef configUSE_MALLOC_FAILED_HOOK\r\n    #define configUSE_MALLOC_FAILED_HOOK    0\r\n#endif\r\n\r\n#ifndef portPRIVILEGE_BIT\r\n    #define portPRIVILEGE_BIT    ( ( UBaseType_t ) 0x00 )\r\n#endif\r\n\r\n#ifndef portYIELD_WITHIN_API\r\n    #define portYIELD_WITHIN_API    portYIELD\r\n#endif\r\n\r\n#ifndef portSUPPRESS_TICKS_AND_SLEEP\r\n    #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime )\r\n#endif\r\n\r\n#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP\r\n    #define configEXPECTED_IDLE_TIME_BEFORE_SLEEP    2\r\n#endif\r\n\r\n#if configEXPECTED_IDLE_TIME_BEFORE_SLEEP < 2\r\n    #error configEXPECTED_IDLE_TIME_BEFORE_SLEEP must not be less than 2\r\n#endif\r\n\r\n#ifndef configUSE_TICKLESS_IDLE\r\n    #define configUSE_TICKLESS_IDLE    0\r\n#endif\r\n\r\n#ifndef configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING\r\n    #define configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( x )\r\n#endif\r\n\r\n#ifndef configPRE_SLEEP_PROCESSING\r\n    #define configPRE_SLEEP_PROCESSING( x )\r\n#endif\r\n\r\n#ifndef configPOST_SLEEP_PROCESSING\r\n    #define configPOST_SLEEP_PROCESSING( x )\r\n#endif\r\n\r\n#ifndef configUSE_QUEUE_SETS\r\n    #define configUSE_QUEUE_SETS    0\r\n#endif\r\n\r\n#ifndef portTASK_USES_FLOATING_POINT\r\n    #define portTASK_USES_FLOATING_POINT()\r\n#endif\r\n\r\n#ifndef portALLOCATE_SECURE_CONTEXT\r\n    #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize )\r\n#endif\r\n\r\n#ifndef portDONT_DISCARD\r\n    #define portDONT_DISCARD\r\n#endif\r\n\r\n#ifndef configUSE_TIME_SLICING\r\n    #define configUSE_TIME_SLICING    1\r\n#endif\r\n\r\n#ifndef configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS\r\n    #define configINCLUDE_APPLICATION_DEFINED_PRIVILEGED_FUNCTIONS    0\r\n#endif\r\n\r\n#ifndef configUSE_STATS_FORMATTING_FUNCTIONS\r\n    #define configUSE_STATS_FORMATTING_FUNCTIONS    0\r\n#endif\r\n\r\n#ifndef portASSERT_IF_INTERRUPT_PRIORITY_INVALID\r\n    #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID()\r\n#endif\r\n\r\n#ifndef configUSE_TRACE_FACILITY\r\n    #define configUSE_TRACE_FACILITY    0\r\n#endif\r\n\r\n#ifndef mtCOVERAGE_TEST_MARKER\r\n    #define mtCOVERAGE_TEST_MARKER()\r\n#endif\r\n\r\n#ifndef mtCOVERAGE_TEST_DELAY\r\n    #define mtCOVERAGE_TEST_DELAY()\r\n#endif\r\n\r\n#ifndef portASSERT_IF_IN_ISR\r\n    #define portASSERT_IF_IN_ISR()\r\n#endif\r\n\r\n#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION\r\n    #define configUSE_PORT_OPTIMISED_TASK_SELECTION    0\r\n#endif\r\n\r\n#ifndef configAPPLICATION_ALLOCATED_HEAP\r\n    #define configAPPLICATION_ALLOCATED_HEAP    0\r\n#endif\r\n\r\n#ifndef configENABLE_HEAP_PROTECTOR\r\n    #define configENABLE_HEAP_PROTECTOR    0\r\n#endif\r\n\r\n#ifndef configUSE_TASK_NOTIFICATIONS\r\n    #define configUSE_TASK_NOTIFICATIONS    1\r\n#endif\r\n\r\n#ifndef configTASK_NOTIFICATION_ARRAY_ENTRIES\r\n    #define configTASK_NOTIFICATION_ARRAY_ENTRIES    1\r\n#endif\r\n\r\n#if configTASK_NOTIFICATION_ARRAY_ENTRIES < 1\r\n    #error configTASK_NOTIFICATION_ARRAY_ENTRIES must be at least 1\r\n#endif\r\n\r\n#ifndef configUSE_POSIX_ERRNO\r\n    #define configUSE_POSIX_ERRNO    0\r\n#endif\r\n\r\n#ifndef configUSE_SB_COMPLETED_CALLBACK\r\n\r\n/* By default per-instance callbacks are not enabled for stream buffer or message buffer. */\r\n    #define configUSE_SB_COMPLETED_CALLBACK    0\r\n#endif\r\n\r\n#ifndef portTICK_TYPE_IS_ATOMIC\r\n    #define portTICK_TYPE_IS_ATOMIC    0\r\n#endif\r\n\r\n#ifndef configSUPPORT_STATIC_ALLOCATION\r\n    /* Defaults to 0 for backward compatibility. */\r\n    #define configSUPPORT_STATIC_ALLOCATION    0\r\n#endif\r\n\r\n#ifndef configKERNEL_PROVIDED_STATIC_MEMORY\r\n    #define configKERNEL_PROVIDED_STATIC_MEMORY    0\r\n#endif\r\n\r\n#ifndef configSUPPORT_DYNAMIC_ALLOCATION\r\n    /* Defaults to 1 for backward compatibility. */\r\n    #define configSUPPORT_DYNAMIC_ALLOCATION    1\r\n#endif\r\n\r\n#if ( ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION != 1 ) )\r\n    #error configUSE_STATS_FORMATTING_FUNCTIONS cannot be used without dynamic allocation, but configSUPPORT_DYNAMIC_ALLOCATION is not set to 1.\r\n#endif\r\n\r\n#if ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 )\r\n    #if ( ( configUSE_TRACE_FACILITY != 1 ) && ( configGENERATE_RUN_TIME_STATS != 1 ) )\r\n        #error configUSE_STATS_FORMATTING_FUNCTIONS is 1 but the functions it enables are not used because neither configUSE_TRACE_FACILITY or configGENERATE_RUN_TIME_STATS are 1.  Set configUSE_STATS_FORMATTING_FUNCTIONS to 0 in FreeRTOSConfig.h.\r\n    #endif\r\n#endif\r\n\r\n#ifndef configSTATS_BUFFER_MAX_LENGTH\r\n    #define configSTATS_BUFFER_MAX_LENGTH    0xFFFF\r\n#endif\r\n\r\n#ifndef configSTACK_DEPTH_TYPE\r\n\r\n/* Defaults to uint16_t for backward compatibility, but can be overridden\r\n * in FreeRTOSConfig.h if uint16_t is too restrictive. */\r\n    #define configSTACK_DEPTH_TYPE    uint16_t\r\n#endif\r\n\r\n#ifndef configRUN_TIME_COUNTER_TYPE\r\n\r\n/* Defaults to uint32_t for backward compatibility, but can be overridden in\r\n * FreeRTOSConfig.h if uint32_t is too restrictive. */\r\n\r\n    #define configRUN_TIME_COUNTER_TYPE    uint32_t\r\n#endif\r\n\r\n#ifndef configMESSAGE_BUFFER_LENGTH_TYPE\r\n\r\n/* Defaults to size_t for backward compatibility, but can be overridden\r\n * in FreeRTOSConfig.h if lengths will always be less than the number of bytes\r\n * in a size_t. */\r\n    #define configMESSAGE_BUFFER_LENGTH_TYPE    size_t\r\n#endif\r\n\r\n/* Sanity check the configuration. */\r\n#if ( ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 0 ) )\r\n    #error configSUPPORT_STATIC_ALLOCATION and configSUPPORT_DYNAMIC_ALLOCATION cannot both be 0, but can both be 1.\r\n#endif\r\n\r\n#if ( ( configUSE_RECURSIVE_MUTEXES == 1 ) && ( configUSE_MUTEXES != 1 ) )\r\n    #error configUSE_MUTEXES must be set to 1 to use recursive mutexes\r\n#endif\r\n\r\n#if ( ( configRUN_MULTIPLE_PRIORITIES == 0 ) && ( configUSE_TASK_PREEMPTION_DISABLE != 0 ) )\r\n    #error configRUN_MULTIPLE_PRIORITIES must be set to 1 to use task preemption disable\r\n#endif\r\n\r\n#if ( ( configUSE_PREEMPTION == 0 ) && ( configUSE_TASK_PREEMPTION_DISABLE != 0 ) )\r\n    #error configUSE_PREEMPTION must be set to 1 to use task preemption disable\r\n#endif\r\n\r\n#if ( ( configNUMBER_OF_CORES == 1 ) && ( configUSE_TASK_PREEMPTION_DISABLE != 0 ) )\r\n    #error configUSE_TASK_PREEMPTION_DISABLE is not supported in single core FreeRTOS\r\n#endif\r\n\r\n#if ( ( configNUMBER_OF_CORES == 1 ) && ( configUSE_CORE_AFFINITY != 0 ) )\r\n    #error configUSE_CORE_AFFINITY is not supported in single core FreeRTOS\r\n#endif\r\n\r\n#if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_PORT_OPTIMISED_TASK_SELECTION != 0 ) )\r\n    #error configUSE_PORT_OPTIMISED_TASK_SELECTION is not supported in SMP FreeRTOS\r\n#endif\r\n\r\n#ifndef configINITIAL_TICK_COUNT\r\n    #define configINITIAL_TICK_COUNT    0\r\n#endif\r\n\r\n#if ( portTICK_TYPE_IS_ATOMIC == 0 )\r\n\r\n/* Either variables of tick type cannot be read atomically, or\r\n * portTICK_TYPE_IS_ATOMIC was not set - map the critical sections used when\r\n * the tick count is returned to the standard critical section macros. */\r\n    #define portTICK_TYPE_ENTER_CRITICAL()                      portENTER_CRITICAL()\r\n    #define portTICK_TYPE_EXIT_CRITICAL()                       portEXIT_CRITICAL()\r\n    #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR()         portSET_INTERRUPT_MASK_FROM_ISR()\r\n    #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x )    portCLEAR_INTERRUPT_MASK_FROM_ISR( ( x ) )\r\n#else\r\n\r\n/* The tick type can be read atomically, so critical sections used when the\r\n * tick count is returned can be defined away. */\r\n    #define portTICK_TYPE_ENTER_CRITICAL()\r\n    #define portTICK_TYPE_EXIT_CRITICAL()\r\n    #define portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR()         0\r\n    #define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( x )    ( void ) ( x )\r\n#endif /* if ( portTICK_TYPE_IS_ATOMIC == 0 ) */\r\n\r\n/* Definitions to allow backward compatibility with FreeRTOS versions prior to\r\n * V8 if desired. */\r\n#ifndef configENABLE_BACKWARD_COMPATIBILITY\r\n    #define configENABLE_BACKWARD_COMPATIBILITY    1\r\n#endif\r\n\r\n#ifndef configPRINTF\r\n\r\n/* configPRINTF() was not defined, so define it away to nothing.  To use\r\n * configPRINTF() then define it as follows (where MyPrintFunction() is\r\n * provided by the application writer):\r\n *\r\n * void MyPrintFunction(const char *pcFormat, ... );\r\n #define configPRINTF( X )   MyPrintFunction X\r\n *\r\n * Then call like a standard printf() function, but placing brackets around\r\n * all parameters so they are passed as a single parameter.  For example:\r\n * configPRINTF( (\"Value = %d\", MyVariable) ); */\r\n    #define configPRINTF( X )\r\n#endif\r\n\r\n#ifndef configMAX\r\n\r\n/* The application writer has not provided their own MAX macro, so define\r\n * the following generic implementation. */\r\n    #define configMAX( a, b )    ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) )\r\n#endif\r\n\r\n#ifndef configMIN\r\n\r\n/* The application writer has not provided their own MIN macro, so define\r\n * the following generic implementation. */\r\n    #define configMIN( a, b )    ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) )\r\n#endif\r\n\r\n#if configENABLE_BACKWARD_COMPATIBILITY == 1\r\n    #define eTaskStateGet                 eTaskGetState\r\n    #define portTickType                  TickType_t\r\n    #define xTaskHandle                   TaskHandle_t\r\n    #define xQueueHandle                  QueueHandle_t\r\n    #define xSemaphoreHandle              SemaphoreHandle_t\r\n    #define xQueueSetHandle               QueueSetHandle_t\r\n    #define xQueueSetMemberHandle         QueueSetMemberHandle_t\r\n    #define xTimeOutType                  TimeOut_t\r\n    #define xMemoryRegion                 MemoryRegion_t\r\n    #define xTaskParameters               TaskParameters_t\r\n    #define xTaskStatusType               TaskStatus_t\r\n    #define xTimerHandle                  TimerHandle_t\r\n    #define xCoRoutineHandle              CoRoutineHandle_t\r\n    #define pdTASK_HOOK_CODE              TaskHookFunction_t\r\n    #define portTICK_RATE_MS              portTICK_PERIOD_MS\r\n    #define pcTaskGetTaskName             pcTaskGetName\r\n    #define pcTimerGetTimerName           pcTimerGetName\r\n    #define pcQueueGetQueueName           pcQueueGetName\r\n    #define vTaskGetTaskInfo              vTaskGetInfo\r\n    #define xTaskGetIdleRunTimeCounter    ulTaskGetIdleRunTimeCounter\r\n\r\n/* Backward compatibility within the scheduler code only - these definitions\r\n * are not really required but are included for completeness. */\r\n    #define tmrTIMER_CALLBACK             TimerCallbackFunction_t\r\n    #define pdTASK_CODE                   TaskFunction_t\r\n    #define xListItem                     ListItem_t\r\n    #define xList                         List_t\r\n\r\n/* For libraries that break the list data hiding, and access list structure\r\n * members directly (which is not supposed to be done). */\r\n    #define pxContainer                   pvContainer\r\n#endif /* configENABLE_BACKWARD_COMPATIBILITY */\r\n\r\n#if ( configUSE_ALTERNATIVE_API != 0 )\r\n    #error The alternative API was deprecated some time ago, and was removed in FreeRTOS V9.0 0\r\n#endif\r\n\r\n/* Set configUSE_TASK_FPU_SUPPORT to 0 to omit floating point support even\r\n * if floating point hardware is otherwise supported by the FreeRTOS port in use.\r\n * This constant is not supported by all FreeRTOS ports that include floating\r\n * point support. */\r\n#ifndef configUSE_TASK_FPU_SUPPORT\r\n    #define configUSE_TASK_FPU_SUPPORT    1\r\n#endif\r\n\r\n/* Set configENABLE_MPU to 1 to enable MPU support and 0 to disable it. This is\r\n * currently used in ARMv8M ports. */\r\n#ifndef configENABLE_MPU\r\n    #define configENABLE_MPU    0\r\n#endif\r\n\r\n/* Set configENABLE_FPU to 1 to enable FPU support and 0 to disable it. This is\r\n * currently used in ARMv8M ports. */\r\n#ifndef configENABLE_FPU\r\n    #define configENABLE_FPU    1\r\n#endif\r\n\r\n/* Set configENABLE_MVE to 1 to enable MVE support and 0 to disable it. This is\r\n * currently used in ARMv8M ports. */\r\n#ifndef configENABLE_MVE\r\n    #define configENABLE_MVE    0\r\n#endif\r\n\r\n/* Set configENABLE_TRUSTZONE to 1 enable TrustZone support and 0 to disable it.\r\n * This is currently used in ARMv8M ports. */\r\n#ifndef configENABLE_TRUSTZONE\r\n    #define configENABLE_TRUSTZONE    1\r\n#endif\r\n\r\n/* Set configRUN_FREERTOS_SECURE_ONLY to 1 to run the FreeRTOS ARMv8M port on\r\n * the Secure Side only. */\r\n#ifndef configRUN_FREERTOS_SECURE_ONLY\r\n    #define configRUN_FREERTOS_SECURE_ONLY    0\r\n#endif\r\n\r\n#ifndef configRUN_ADDITIONAL_TESTS\r\n    #define configRUN_ADDITIONAL_TESTS    0\r\n#endif\r\n\r\n/* The following config allows infinite loop control. For example, control the\r\n * infinite loop in idle task function when performing unit tests. */\r\n#ifndef configCONTROL_INFINITE_LOOP\r\n    #define configCONTROL_INFINITE_LOOP()\r\n#endif\r\n\r\n/* Sometimes the FreeRTOSConfig.h settings only allow a task to be created using\r\n * dynamically allocated RAM, in which case when any task is deleted it is known\r\n * that both the task's stack and TCB need to be freed.  Sometimes the\r\n * FreeRTOSConfig.h settings only allow a task to be created using statically\r\n * allocated RAM, in which case when any task is deleted it is known that neither\r\n * the task's stack or TCB should be freed.  Sometimes the FreeRTOSConfig.h\r\n * settings allow a task to be created using either statically or dynamically\r\n * allocated RAM, in which case a member of the TCB is used to record whether the\r\n * stack and/or TCB were allocated statically or dynamically, so when a task is\r\n * deleted the RAM that was allocated dynamically is freed again and no attempt is\r\n * made to free the RAM that was allocated statically.\r\n * tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE is only true if it is possible for a\r\n * task to be created using either statically or dynamically allocated RAM.  Note\r\n * that if portUSING_MPU_WRAPPERS is 1 then a protected task can be created with\r\n * a statically allocated stack and a dynamically allocated TCB.\r\n *\r\n * The following table lists various combinations of portUSING_MPU_WRAPPERS,\r\n * configSUPPORT_DYNAMIC_ALLOCATION and configSUPPORT_STATIC_ALLOCATION and\r\n * when it is possible to have both static and dynamic allocation:\r\n *  +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+\r\n * | MPU | Dynamic | Static |     Available Functions     |       Possible Allocations        | Both Dynamic and | Need Free |\r\n * |     |         |        |                             |                                   | Static Possible  |           |\r\n * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+\r\n * | 0   | 0       | 1      | xTaskCreateStatic           | TCB - Static, Stack - Static      | No               | No        |\r\n * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------|\r\n * | 0   | 1       | 0      | xTaskCreate                 | TCB - Dynamic, Stack - Dynamic    | No               | Yes       |\r\n * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------|\r\n * | 0   | 1       | 1      | xTaskCreate,                | 1. TCB - Dynamic, Stack - Dynamic | Yes              | Yes       |\r\n * |     |         |        | xTaskCreateStatic           | 2. TCB - Static, Stack - Static   |                  |           |\r\n * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------|\r\n * | 1   | 0       | 1      | xTaskCreateStatic,          | TCB - Static, Stack - Static      | No               | No        |\r\n * |     |         |        | xTaskCreateRestrictedStatic |                                   |                  |           |\r\n * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------|\r\n * | 1   | 1       | 0      | xTaskCreate,                | 1. TCB - Dynamic, Stack - Dynamic | Yes              | Yes       |\r\n * |     |         |        | xTaskCreateRestricted       | 2. TCB - Dynamic, Stack - Static  |                  |           |\r\n * +-----|---------|--------|-----------------------------|-----------------------------------|------------------|-----------|\r\n * | 1   | 1       | 1      | xTaskCreate,                | 1. TCB - Dynamic, Stack - Dynamic | Yes              | Yes       |\r\n * |     |         |        | xTaskCreateStatic,          | 2. TCB - Dynamic, Stack - Static  |                  |           |\r\n * |     |         |        | xTaskCreateRestricted,      | 3. TCB - Static, Stack - Static   |                  |           |\r\n * |     |         |        | xTaskCreateRestrictedStatic |                                   |                  |           |\r\n * +-----+---------+--------+-----------------------------+-----------------------------------+------------------+-----------+\r\n */\r\n#define tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE                                                                                     \\\r\n    ( ( ( portUSING_MPU_WRAPPERS == 0 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) || \\\r\n      ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) )\r\n\r\n/*\r\n * In line with software engineering best practice, FreeRTOS implements a strict\r\n * data hiding policy, so the real structures used by FreeRTOS to maintain the\r\n * state of tasks, queues, semaphores, etc. are not accessible to the application\r\n * code.  However, if the application writer wants to statically allocate such\r\n * an object then the size of the object needs to be known.  Dummy structures\r\n * that are guaranteed to have the same size and alignment requirements of the\r\n * real objects are used for this purpose.  The dummy list and list item\r\n * structures below are used for inclusion in such a dummy structure.\r\n */\r\nstruct xSTATIC_LIST_ITEM\r\n{\r\n    #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )\r\n        TickType_t xDummy1;\r\n    #endif\r\n    TickType_t xDummy2;\r\n    void * pvDummy3[ 4 ];\r\n    #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )\r\n        TickType_t xDummy4;\r\n    #endif\r\n};\r\ntypedef struct xSTATIC_LIST_ITEM StaticListItem_t;\r\n\r\n#if ( configUSE_MINI_LIST_ITEM == 1 )\r\n    /* See the comments above the struct xSTATIC_LIST_ITEM definition. */\r\n    struct xSTATIC_MINI_LIST_ITEM\r\n    {\r\n        #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )\r\n            TickType_t xDummy1;\r\n        #endif\r\n        TickType_t xDummy2;\r\n        void * pvDummy3[ 2 ];\r\n    };\r\n    typedef struct xSTATIC_MINI_LIST_ITEM StaticMiniListItem_t;\r\n#else /* if ( configUSE_MINI_LIST_ITEM == 1 ) */\r\n    typedef struct xSTATIC_LIST_ITEM      StaticMiniListItem_t;\r\n#endif /* if ( configUSE_MINI_LIST_ITEM == 1 ) */\r\n\r\n/* See the comments above the struct xSTATIC_LIST_ITEM definition. */\r\ntypedef struct xSTATIC_LIST\r\n{\r\n    #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )\r\n        TickType_t xDummy1;\r\n    #endif\r\n    UBaseType_t uxDummy2;\r\n    void * pvDummy3;\r\n    StaticMiniListItem_t xDummy4;\r\n    #if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 1 )\r\n        TickType_t xDummy5;\r\n    #endif\r\n} StaticList_t;\r\n\r\n/*\r\n * In line with software engineering best practice, especially when supplying a\r\n * library that is likely to change in future versions, FreeRTOS implements a\r\n * strict data hiding policy.  This means the Task structure used internally by\r\n * FreeRTOS is not accessible to application code.  However, if the application\r\n * writer wants to statically allocate the memory required to create a task then\r\n * the size of the task object needs to be known.  The StaticTask_t structure\r\n * below is provided for this purpose.  Its sizes and alignment requirements are\r\n * guaranteed to match those of the genuine structure, no matter which\r\n * architecture is being used, and no matter how the values in FreeRTOSConfig.h\r\n * are set.  Its contents are somewhat obfuscated in the hope users will\r\n * recognise that it would be unwise to make direct use of the structure members.\r\n */\r\ntypedef struct xSTATIC_TCB\r\n{\r\n    void * pxDummy1;\r\n    #if ( portUSING_MPU_WRAPPERS == 1 )\r\n        xMPU_SETTINGS xDummy2;\r\n    #endif\r\n    #if ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 )\r\n        UBaseType_t uxDummy26;\r\n    #endif\r\n    StaticListItem_t xDummy3[ 2 ];\r\n    UBaseType_t uxDummy5;\r\n    void * pxDummy6;\r\n    #if ( configNUMBER_OF_CORES > 1 )\r\n        BaseType_t xDummy23;\r\n        UBaseType_t uxDummy24;\r\n    #endif\r\n    uint8_t ucDummy7[ configMAX_TASK_NAME_LEN ];\r\n    #if ( configUSE_TASK_PREEMPTION_DISABLE == 1 )\r\n        BaseType_t xDummy25;\r\n    #endif\r\n    #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) )\r\n        void * pxDummy8;\r\n    #endif\r\n    #if ( portCRITICAL_NESTING_IN_TCB == 1 )\r\n        UBaseType_t uxDummy9;\r\n    #endif\r\n    #if ( configUSE_TRACE_FACILITY == 1 )\r\n        UBaseType_t uxDummy10[ 2 ];\r\n    #endif\r\n    #if ( configUSE_MUTEXES == 1 )\r\n        UBaseType_t uxDummy12[ 2 ];\r\n    #endif\r\n    #if ( configUSE_APPLICATION_TASK_TAG == 1 )\r\n        void * pxDummy14;\r\n    #endif\r\n    #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 )\r\n        void * pvDummy15[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ];\r\n    #endif\r\n    #if ( configGENERATE_RUN_TIME_STATS == 1 )\r\n        configRUN_TIME_COUNTER_TYPE ulDummy16;\r\n    #endif\r\n    #if ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 )\r\n        configTLS_BLOCK_TYPE xDummy17;\r\n    #endif\r\n    #if ( configUSE_TASK_NOTIFICATIONS == 1 )\r\n        uint32_t ulDummy18[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];\r\n        uint8_t ucDummy19[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];\r\n    #endif\r\n    #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )\r\n        uint8_t uxDummy20;\r\n    #endif\r\n\r\n    #if ( INCLUDE_xTaskAbortDelay == 1 )\r\n        uint8_t ucDummy21;\r\n    #endif\r\n    #if ( configUSE_POSIX_ERRNO == 1 )\r\n        int iDummy22;\r\n    #endif\r\n} StaticTask_t;\r\n\r\n/*\r\n * In line with software engineering best practice, especially when supplying a\r\n * library that is likely to change in future versions, FreeRTOS implements a\r\n * strict data hiding policy.  This means the Queue structure used internally by\r\n * FreeRTOS is not accessible to application code.  However, if the application\r\n * writer wants to statically allocate the memory required to create a queue\r\n * then the size of the queue object needs to be known.  The StaticQueue_t\r\n * structure below is provided for this purpose.  Its sizes and alignment\r\n * requirements are guaranteed to match those of the genuine structure, no\r\n * matter which architecture is being used, and no matter how the values in\r\n * FreeRTOSConfig.h are set.  Its contents are somewhat obfuscated in the hope\r\n * users will recognise that it would be unwise to make direct use of the\r\n * structure members.\r\n */\r\ntypedef struct xSTATIC_QUEUE\r\n{\r\n    void * pvDummy1[ 3 ];\r\n\r\n    union\r\n    {\r\n        void * pvDummy2;\r\n        UBaseType_t uxDummy2;\r\n    } u;\r\n\r\n    StaticList_t xDummy3[ 2 ];\r\n    UBaseType_t uxDummy4[ 3 ];\r\n    uint8_t ucDummy5[ 2 ];\r\n\r\n    #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )\r\n        uint8_t ucDummy6;\r\n    #endif\r\n\r\n    #if ( configUSE_QUEUE_SETS == 1 )\r\n        void * pvDummy7;\r\n    #endif\r\n\r\n    #if ( configUSE_TRACE_FACILITY == 1 )\r\n        UBaseType_t uxDummy8;\r\n        uint8_t ucDummy9;\r\n    #endif\r\n} StaticQueue_t;\r\ntypedef StaticQueue_t StaticSemaphore_t;\r\n\r\n/*\r\n * In line with software engineering best practice, especially when supplying a\r\n * library that is likely to change in future versions, FreeRTOS implements a\r\n * strict data hiding policy.  This means the event group structure used\r\n * internally by FreeRTOS is not accessible to application code.  However, if\r\n * the application writer wants to statically allocate the memory required to\r\n * create an event group then the size of the event group object needs to be\r\n * know.  The StaticEventGroup_t structure below is provided for this purpose.\r\n * Its sizes and alignment requirements are guaranteed to match those of the\r\n * genuine structure, no matter which architecture is being used, and no matter\r\n * how the values in FreeRTOSConfig.h are set.  Its contents are somewhat\r\n * obfuscated in the hope users will recognise that it would be unwise to make\r\n * direct use of the structure members.\r\n */\r\ntypedef struct xSTATIC_EVENT_GROUP\r\n{\r\n    TickType_t xDummy1;\r\n    StaticList_t xDummy2;\r\n\r\n    #if ( configUSE_TRACE_FACILITY == 1 )\r\n        UBaseType_t uxDummy3;\r\n    #endif\r\n\r\n    #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )\r\n        uint8_t ucDummy4;\r\n    #endif\r\n} StaticEventGroup_t;\r\n\r\n/*\r\n * In line with software engineering best practice, especially when supplying a\r\n * library that is likely to change in future versions, FreeRTOS implements a\r\n * strict data hiding policy.  This means the software timer structure used\r\n * internally by FreeRTOS is not accessible to application code.  However, if\r\n * the application writer wants to statically allocate the memory required to\r\n * create a software timer then the size of the queue object needs to be known.\r\n * The StaticTimer_t structure below is provided for this purpose.  Its sizes\r\n * and alignment requirements are guaranteed to match those of the genuine\r\n * structure, no matter which architecture is being used, and no matter how the\r\n * values in FreeRTOSConfig.h are set.  Its contents are somewhat obfuscated in\r\n * the hope users will recognise that it would be unwise to make direct use of\r\n * the structure members.\r\n */\r\ntypedef struct xSTATIC_TIMER\r\n{\r\n    void * pvDummy1;\r\n    StaticListItem_t xDummy2;\r\n    TickType_t xDummy3;\r\n    void * pvDummy5;\r\n    TaskFunction_t pvDummy6;\r\n    #if ( configUSE_TRACE_FACILITY == 1 )\r\n        UBaseType_t uxDummy7;\r\n    #endif\r\n    uint8_t ucDummy8;\r\n} StaticTimer_t;\r\n\r\n/*\r\n * In line with software engineering best practice, especially when supplying a\r\n * library that is likely to change in future versions, FreeRTOS implements a\r\n * strict data hiding policy.  This means the stream buffer structure used\r\n * internally by FreeRTOS is not accessible to application code.  However, if\r\n * the application writer wants to statically allocate the memory required to\r\n * create a stream buffer then the size of the stream buffer object needs to be\r\n * known.  The StaticStreamBuffer_t structure below is provided for this\r\n * purpose.  Its size and alignment requirements are guaranteed to match those\r\n * of the genuine structure, no matter which architecture is being used, and\r\n * no matter how the values in FreeRTOSConfig.h are set.  Its contents are\r\n * somewhat obfuscated in the hope users will recognise that it would be unwise\r\n * to make direct use of the structure members.\r\n */\r\ntypedef struct xSTATIC_STREAM_BUFFER\r\n{\r\n    size_t uxDummy1[ 4 ];\r\n    void * pvDummy2[ 3 ];\r\n    uint8_t ucDummy3;\r\n    #if ( configUSE_TRACE_FACILITY == 1 )\r\n        UBaseType_t uxDummy4;\r\n    #endif\r\n    #if ( configUSE_SB_COMPLETED_CALLBACK == 1 )\r\n        void * pvDummy5[ 2 ];\r\n    #endif\r\n} StaticStreamBuffer_t;\r\n\r\n/* Message buffers are built on stream buffers. */\r\ntypedef StaticStreamBuffer_t StaticMessageBuffer_t;\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    }\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n#endif /* INC_FREERTOS_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/StackMacros.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n\r\n#ifndef _MSC_VER /* Visual Studio doesn't support #warning. */\r\n    #warning The name of this file has changed to stack_macros.h.  Please update your code accordingly.  This source file (which has the original name) will be removed in a future release.\r\n#endif\r\n\r\n#include \"stack_macros.h\"\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/atomic.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n/**\r\n * @file atomic.h\r\n * @brief FreeRTOS atomic operation support.\r\n *\r\n * This file implements atomic functions by disabling interrupts globally.\r\n * Implementations with architecture specific atomic instructions can be\r\n * provided under each compiler directory.\r\n */\r\n\r\n#ifndef ATOMIC_H\r\n#define ATOMIC_H\r\n\r\n#ifndef INC_FREERTOS_H\r\n    #error \"include FreeRTOS.h must appear in source files before include atomic.h\"\r\n#endif\r\n\r\n/* Standard includes. */\r\n#include <stdint.h>\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    extern \"C\" {\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n/*\r\n * Port specific definitions -- entering/exiting critical section.\r\n * Refer template -- ./lib/FreeRTOS/portable/Compiler/Arch/portmacro.h\r\n *\r\n * Every call to ATOMIC_EXIT_CRITICAL() must be closely paired with\r\n * ATOMIC_ENTER_CRITICAL().\r\n *\r\n */\r\n#if defined( portSET_INTERRUPT_MASK_FROM_ISR )\r\n\r\n/* Nested interrupt scheme is supported in this port. */\r\n    #define ATOMIC_ENTER_CRITICAL() \\\r\n    UBaseType_t uxCriticalSectionType = portSET_INTERRUPT_MASK_FROM_ISR()\r\n\r\n    #define ATOMIC_EXIT_CRITICAL() \\\r\n    portCLEAR_INTERRUPT_MASK_FROM_ISR( uxCriticalSectionType )\r\n\r\n#else\r\n\r\n/* Nested interrupt scheme is NOT supported in this port. */\r\n    #define ATOMIC_ENTER_CRITICAL()    portENTER_CRITICAL()\r\n    #define ATOMIC_EXIT_CRITICAL()     portEXIT_CRITICAL()\r\n\r\n#endif /* portSET_INTERRUPT_MASK_FROM_ISR() */\r\n\r\n/*\r\n * Port specific definition -- \"always inline\".\r\n * Inline is compiler specific, and may not always get inlined depending on your\r\n * optimization level.  Also, inline is considered as performance optimization\r\n * for atomic.  Thus, if portFORCE_INLINE is not provided by portmacro.h,\r\n * instead of resulting error, simply define it away.\r\n */\r\n#ifndef portFORCE_INLINE\r\n    #define portFORCE_INLINE\r\n#endif\r\n\r\n#define ATOMIC_COMPARE_AND_SWAP_SUCCESS    0x1U     /**< Compare and swap succeeded, swapped. */\r\n#define ATOMIC_COMPARE_AND_SWAP_FAILURE    0x0U     /**< Compare and swap failed, did not swap. */\r\n\r\n/*----------------------------- Swap && CAS ------------------------------*/\r\n\r\n/**\r\n * Atomic compare-and-swap\r\n *\r\n * @brief Performs an atomic compare-and-swap operation on the specified values.\r\n *\r\n * @param[in, out] pulDestination  Pointer to memory location from where value is\r\n *                               to be loaded and checked.\r\n * @param[in] ulExchange         If condition meets, write this value to memory.\r\n * @param[in] ulComparand        Swap condition.\r\n *\r\n * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped.\r\n *\r\n * @note This function only swaps *pulDestination with ulExchange, if previous\r\n *       *pulDestination value equals ulComparand.\r\n */\r\nstatic portFORCE_INLINE uint32_t Atomic_CompareAndSwap_u32( uint32_t volatile * pulDestination,\r\n                                                            uint32_t ulExchange,\r\n                                                            uint32_t ulComparand )\r\n{\r\n    uint32_t ulReturnValue;\r\n\r\n    ATOMIC_ENTER_CRITICAL();\r\n    {\r\n        if( *pulDestination == ulComparand )\r\n        {\r\n            *pulDestination = ulExchange;\r\n            ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS;\r\n        }\r\n        else\r\n        {\r\n            ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE;\r\n        }\r\n    }\r\n    ATOMIC_EXIT_CRITICAL();\r\n\r\n    return ulReturnValue;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * Atomic swap (pointers)\r\n *\r\n * @brief Atomically sets the address pointed to by *ppvDestination to the value\r\n *        of *pvExchange.\r\n *\r\n * @param[in, out] ppvDestination  Pointer to memory location from where a pointer\r\n *                                 value is to be loaded and written back to.\r\n * @param[in] pvExchange           Pointer value to be written to *ppvDestination.\r\n *\r\n * @return The initial value of *ppvDestination.\r\n */\r\nstatic portFORCE_INLINE void * Atomic_SwapPointers_p32( void * volatile * ppvDestination,\r\n                                                        void * pvExchange )\r\n{\r\n    void * pReturnValue;\r\n\r\n    ATOMIC_ENTER_CRITICAL();\r\n    {\r\n        pReturnValue = *ppvDestination;\r\n        *ppvDestination = pvExchange;\r\n    }\r\n    ATOMIC_EXIT_CRITICAL();\r\n\r\n    return pReturnValue;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * Atomic compare-and-swap (pointers)\r\n *\r\n * @brief Performs an atomic compare-and-swap operation on the specified pointer\r\n *        values.\r\n *\r\n * @param[in, out] ppvDestination  Pointer to memory location from where a pointer\r\n *                                 value is to be loaded and checked.\r\n * @param[in] pvExchange           If condition meets, write this value to memory.\r\n * @param[in] pvComparand          Swap condition.\r\n *\r\n * @return Unsigned integer of value 1 or 0. 1 for swapped, 0 for not swapped.\r\n *\r\n * @note This function only swaps *ppvDestination with pvExchange, if previous\r\n *       *ppvDestination value equals pvComparand.\r\n */\r\nstatic portFORCE_INLINE uint32_t Atomic_CompareAndSwapPointers_p32( void * volatile * ppvDestination,\r\n                                                                    void * pvExchange,\r\n                                                                    void * pvComparand )\r\n{\r\n    uint32_t ulReturnValue = ATOMIC_COMPARE_AND_SWAP_FAILURE;\r\n\r\n    ATOMIC_ENTER_CRITICAL();\r\n    {\r\n        if( *ppvDestination == pvComparand )\r\n        {\r\n            *ppvDestination = pvExchange;\r\n            ulReturnValue = ATOMIC_COMPARE_AND_SWAP_SUCCESS;\r\n        }\r\n    }\r\n    ATOMIC_EXIT_CRITICAL();\r\n\r\n    return ulReturnValue;\r\n}\r\n\r\n\r\n/*----------------------------- Arithmetic ------------------------------*/\r\n\r\n/**\r\n * Atomic add\r\n *\r\n * @brief Atomically adds count to the value of the specified pointer points to.\r\n *\r\n * @param[in,out] pulAddend  Pointer to memory location from where value is to be\r\n *                         loaded and written back to.\r\n * @param[in] ulCount      Value to be added to *pulAddend.\r\n *\r\n * @return previous *pulAddend value.\r\n */\r\nstatic portFORCE_INLINE uint32_t Atomic_Add_u32( uint32_t volatile * pulAddend,\r\n                                                 uint32_t ulCount )\r\n{\r\n    uint32_t ulCurrent;\r\n\r\n    ATOMIC_ENTER_CRITICAL();\r\n    {\r\n        ulCurrent = *pulAddend;\r\n        *pulAddend += ulCount;\r\n    }\r\n    ATOMIC_EXIT_CRITICAL();\r\n\r\n    return ulCurrent;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * Atomic subtract\r\n *\r\n * @brief Atomically subtracts count from the value of the specified pointer\r\n *        pointers to.\r\n *\r\n * @param[in,out] pulAddend  Pointer to memory location from where value is to be\r\n *                         loaded and written back to.\r\n * @param[in] ulCount      Value to be subtract from *pulAddend.\r\n *\r\n * @return previous *pulAddend value.\r\n */\r\nstatic portFORCE_INLINE uint32_t Atomic_Subtract_u32( uint32_t volatile * pulAddend,\r\n                                                      uint32_t ulCount )\r\n{\r\n    uint32_t ulCurrent;\r\n\r\n    ATOMIC_ENTER_CRITICAL();\r\n    {\r\n        ulCurrent = *pulAddend;\r\n        *pulAddend -= ulCount;\r\n    }\r\n    ATOMIC_EXIT_CRITICAL();\r\n\r\n    return ulCurrent;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * Atomic increment\r\n *\r\n * @brief Atomically increments the value of the specified pointer points to.\r\n *\r\n * @param[in,out] pulAddend  Pointer to memory location from where value is to be\r\n *                         loaded and written back to.\r\n *\r\n * @return *pulAddend value before increment.\r\n */\r\nstatic portFORCE_INLINE uint32_t Atomic_Increment_u32( uint32_t volatile * pulAddend )\r\n{\r\n    uint32_t ulCurrent;\r\n\r\n    ATOMIC_ENTER_CRITICAL();\r\n    {\r\n        ulCurrent = *pulAddend;\r\n        *pulAddend += 1;\r\n    }\r\n    ATOMIC_EXIT_CRITICAL();\r\n\r\n    return ulCurrent;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * Atomic decrement\r\n *\r\n * @brief Atomically decrements the value of the specified pointer points to\r\n *\r\n * @param[in,out] pulAddend  Pointer to memory location from where value is to be\r\n *                         loaded and written back to.\r\n *\r\n * @return *pulAddend value before decrement.\r\n */\r\nstatic portFORCE_INLINE uint32_t Atomic_Decrement_u32( uint32_t volatile * pulAddend )\r\n{\r\n    uint32_t ulCurrent;\r\n\r\n    ATOMIC_ENTER_CRITICAL();\r\n    {\r\n        ulCurrent = *pulAddend;\r\n        *pulAddend -= 1;\r\n    }\r\n    ATOMIC_EXIT_CRITICAL();\r\n\r\n    return ulCurrent;\r\n}\r\n\r\n/*----------------------------- Bitwise Logical ------------------------------*/\r\n\r\n/**\r\n * Atomic OR\r\n *\r\n * @brief Performs an atomic OR operation on the specified values.\r\n *\r\n * @param [in, out] pulDestination  Pointer to memory location from where value is\r\n *                                to be loaded and written back to.\r\n * @param [in] ulValue            Value to be ORed with *pulDestination.\r\n *\r\n * @return The original value of *pulDestination.\r\n */\r\nstatic portFORCE_INLINE uint32_t Atomic_OR_u32( uint32_t volatile * pulDestination,\r\n                                                uint32_t ulValue )\r\n{\r\n    uint32_t ulCurrent;\r\n\r\n    ATOMIC_ENTER_CRITICAL();\r\n    {\r\n        ulCurrent = *pulDestination;\r\n        *pulDestination |= ulValue;\r\n    }\r\n    ATOMIC_EXIT_CRITICAL();\r\n\r\n    return ulCurrent;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * Atomic AND\r\n *\r\n * @brief Performs an atomic AND operation on the specified values.\r\n *\r\n * @param [in, out] pulDestination  Pointer to memory location from where value is\r\n *                                to be loaded and written back to.\r\n * @param [in] ulValue            Value to be ANDed with *pulDestination.\r\n *\r\n * @return The original value of *pulDestination.\r\n */\r\nstatic portFORCE_INLINE uint32_t Atomic_AND_u32( uint32_t volatile * pulDestination,\r\n                                                 uint32_t ulValue )\r\n{\r\n    uint32_t ulCurrent;\r\n\r\n    ATOMIC_ENTER_CRITICAL();\r\n    {\r\n        ulCurrent = *pulDestination;\r\n        *pulDestination &= ulValue;\r\n    }\r\n    ATOMIC_EXIT_CRITICAL();\r\n\r\n    return ulCurrent;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * Atomic NAND\r\n *\r\n * @brief Performs an atomic NAND operation on the specified values.\r\n *\r\n * @param [in, out] pulDestination  Pointer to memory location from where value is\r\n *                                to be loaded and written back to.\r\n * @param [in] ulValue            Value to be NANDed with *pulDestination.\r\n *\r\n * @return The original value of *pulDestination.\r\n */\r\nstatic portFORCE_INLINE uint32_t Atomic_NAND_u32( uint32_t volatile * pulDestination,\r\n                                                  uint32_t ulValue )\r\n{\r\n    uint32_t ulCurrent;\r\n\r\n    ATOMIC_ENTER_CRITICAL();\r\n    {\r\n        ulCurrent = *pulDestination;\r\n        *pulDestination = ~( ulCurrent & ulValue );\r\n    }\r\n    ATOMIC_EXIT_CRITICAL();\r\n\r\n    return ulCurrent;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * Atomic XOR\r\n *\r\n * @brief Performs an atomic XOR operation on the specified values.\r\n *\r\n * @param [in, out] pulDestination  Pointer to memory location from where value is\r\n *                                to be loaded and written back to.\r\n * @param [in] ulValue            Value to be XORed with *pulDestination.\r\n *\r\n * @return The original value of *pulDestination.\r\n */\r\nstatic portFORCE_INLINE uint32_t Atomic_XOR_u32( uint32_t volatile * pulDestination,\r\n                                                 uint32_t ulValue )\r\n{\r\n    uint32_t ulCurrent;\r\n\r\n    ATOMIC_ENTER_CRITICAL();\r\n    {\r\n        ulCurrent = *pulDestination;\r\n        *pulDestination ^= ulValue;\r\n    }\r\n    ATOMIC_EXIT_CRITICAL();\r\n\r\n    return ulCurrent;\r\n}\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    }\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n#endif /* ATOMIC_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/croutine.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n#ifndef CO_ROUTINE_H\r\n#define CO_ROUTINE_H\r\n\r\n#ifndef INC_FREERTOS_H\r\n    #error \"include FreeRTOS.h must appear in source files before include croutine.h\"\r\n#endif\r\n\r\n#include \"list.h\"\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    extern \"C\" {\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n/* Used to hide the implementation of the co-routine control block.  The\r\n * control block structure however has to be included in the header due to\r\n * the macro implementation of the co-routine functionality. */\r\ntypedef void * CoRoutineHandle_t;\r\n\r\n/* Defines the prototype to which co-routine functions must conform. */\r\ntypedef void (* crCOROUTINE_CODE)( CoRoutineHandle_t xHandle,\r\n                                   UBaseType_t uxIndex );\r\n\r\ntypedef struct corCoRoutineControlBlock\r\n{\r\n    crCOROUTINE_CODE pxCoRoutineFunction;\r\n    ListItem_t xGenericListItem; /**< List item used to place the CRCB in ready and blocked queues. */\r\n    ListItem_t xEventListItem;   /**< List item used to place the CRCB in event lists. */\r\n    UBaseType_t uxPriority;      /**< The priority of the co-routine in relation to other co-routines. */\r\n    UBaseType_t uxIndex;         /**< Used to distinguish between co-routines when multiple co-routines use the same co-routine function. */\r\n    uint16_t uxState;            /**< Used internally by the co-routine implementation. */\r\n} CRCB_t;                        /* Co-routine control block.  Note must be identical in size down to uxPriority with TCB_t. */\r\n\r\n/**\r\n * croutine. h\r\n * @code{c}\r\n * BaseType_t xCoRoutineCreate(\r\n *                               crCOROUTINE_CODE pxCoRoutineCode,\r\n *                               UBaseType_t uxPriority,\r\n *                               UBaseType_t uxIndex\r\n *                             );\r\n * @endcode\r\n *\r\n * Create a new co-routine and add it to the list of co-routines that are\r\n * ready to run.\r\n *\r\n * @param pxCoRoutineCode Pointer to the co-routine function.  Co-routine\r\n * functions require special syntax - see the co-routine section of the WEB\r\n * documentation for more information.\r\n *\r\n * @param uxPriority The priority with respect to other co-routines at which\r\n *  the co-routine will run.\r\n *\r\n * @param uxIndex Used to distinguish between different co-routines that\r\n * execute the same function.  See the example below and the co-routine section\r\n * of the WEB documentation for further information.\r\n *\r\n * @return pdPASS if the co-routine was successfully created and added to a ready\r\n * list, otherwise an error code defined with ProjDefs.h.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * // Co-routine to be created.\r\n * void vFlashCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )\r\n * {\r\n * // Variables in co-routines must be declared static if they must maintain value across a blocking call.\r\n * // This may not be necessary for const variables.\r\n * static const char cLedToFlash[ 2 ] = { 5, 6 };\r\n * static const TickType_t uxFlashRates[ 2 ] = { 200, 400 };\r\n *\r\n *   // Must start every co-routine with a call to crSTART();\r\n *   crSTART( xHandle );\r\n *\r\n *   for( ;; )\r\n *   {\r\n *       // This co-routine just delays for a fixed period, then toggles\r\n *       // an LED.  Two co-routines are created using this function, so\r\n *       // the uxIndex parameter is used to tell the co-routine which\r\n *       // LED to flash and how int32_t to delay.  This assumes xQueue has\r\n *       // already been created.\r\n *       vParTestToggleLED( cLedToFlash[ uxIndex ] );\r\n *       crDELAY( xHandle, uxFlashRates[ uxIndex ] );\r\n *   }\r\n *\r\n *   // Must end every co-routine with a call to crEND();\r\n *   crEND();\r\n * }\r\n *\r\n * // Function that creates two co-routines.\r\n * void vOtherFunction( void )\r\n * {\r\n * uint8_t ucParameterToPass;\r\n * TaskHandle_t xHandle;\r\n *\r\n *   // Create two co-routines at priority 0.  The first is given index 0\r\n *   // so (from the code above) toggles LED 5 every 200 ticks.  The second\r\n *   // is given index 1 so toggles LED 6 every 400 ticks.\r\n *   for( uxIndex = 0; uxIndex < 2; uxIndex++ )\r\n *   {\r\n *       xCoRoutineCreate( vFlashCoRoutine, 0, uxIndex );\r\n *   }\r\n * }\r\n * @endcode\r\n * \\defgroup xCoRoutineCreate xCoRoutineCreate\r\n * \\ingroup Tasks\r\n */\r\nBaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode,\r\n                             UBaseType_t uxPriority,\r\n                             UBaseType_t uxIndex );\r\n\r\n\r\n/**\r\n * croutine. h\r\n * @code{c}\r\n * void vCoRoutineSchedule( void );\r\n * @endcode\r\n *\r\n * Run a co-routine.\r\n *\r\n * vCoRoutineSchedule() executes the highest priority co-routine that is able\r\n * to run.  The co-routine will execute until it either blocks, yields or is\r\n * preempted by a task.  Co-routines execute cooperatively so one\r\n * co-routine cannot be preempted by another, but can be preempted by a task.\r\n *\r\n * If an application comprises of both tasks and co-routines then\r\n * vCoRoutineSchedule should be called from the idle task (in an idle task\r\n * hook).\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * // This idle task hook will schedule a co-routine each time it is called.\r\n * // The rest of the idle task will execute between co-routine calls.\r\n * void vApplicationIdleHook( void )\r\n * {\r\n *  vCoRoutineSchedule();\r\n * }\r\n *\r\n * // Alternatively, if you do not require any other part of the idle task to\r\n * // execute, the idle task hook can call vCoRoutineSchedule() within an\r\n * // infinite loop.\r\n * void vApplicationIdleHook( void )\r\n * {\r\n *  for( ;; )\r\n *  {\r\n *      vCoRoutineSchedule();\r\n *  }\r\n * }\r\n * @endcode\r\n * \\defgroup vCoRoutineSchedule vCoRoutineSchedule\r\n * \\ingroup Tasks\r\n */\r\nvoid vCoRoutineSchedule( void );\r\n\r\n/**\r\n * croutine. h\r\n * @code{c}\r\n * crSTART( CoRoutineHandle_t xHandle );\r\n * @endcode\r\n *\r\n * This macro MUST always be called at the start of a co-routine function.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * // Co-routine to be created.\r\n * void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )\r\n * {\r\n * // Variables in co-routines must be declared static if they must maintain value across a blocking call.\r\n * static int32_t ulAVariable;\r\n *\r\n *   // Must start every co-routine with a call to crSTART();\r\n *   crSTART( xHandle );\r\n *\r\n *   for( ;; )\r\n *   {\r\n *        // Co-routine functionality goes here.\r\n *   }\r\n *\r\n *   // Must end every co-routine with a call to crEND();\r\n *   crEND();\r\n * }\r\n * @endcode\r\n * \\defgroup crSTART crSTART\r\n * \\ingroup Tasks\r\n */\r\n#define crSTART( pxCRCB )                            \\\r\n    switch( ( ( CRCB_t * ) ( pxCRCB ) )->uxState ) { \\\r\n        case 0:\r\n\r\n/**\r\n * croutine. h\r\n * @code{c}\r\n * crEND();\r\n * @endcode\r\n *\r\n * This macro MUST always be called at the end of a co-routine function.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * // Co-routine to be created.\r\n * void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )\r\n * {\r\n * // Variables in co-routines must be declared static if they must maintain value across a blocking call.\r\n * static int32_t ulAVariable;\r\n *\r\n *   // Must start every co-routine with a call to crSTART();\r\n *   crSTART( xHandle );\r\n *\r\n *   for( ;; )\r\n *   {\r\n *        // Co-routine functionality goes here.\r\n *   }\r\n *\r\n *   // Must end every co-routine with a call to crEND();\r\n *   crEND();\r\n * }\r\n * @endcode\r\n * \\defgroup crSTART crSTART\r\n * \\ingroup Tasks\r\n */\r\n#define crEND()    }\r\n\r\n/*\r\n * These macros are intended for internal use by the co-routine implementation\r\n * only.  The macros should not be used directly by application writers.\r\n */\r\n#define crSET_STATE0( xHandle )                                       \\\r\n    ( ( CRCB_t * ) ( xHandle ) )->uxState = ( __LINE__ * 2 ); return; \\\r\n    case ( __LINE__ * 2 ):\r\n#define crSET_STATE1( xHandle )                                               \\\r\n    ( ( CRCB_t * ) ( xHandle ) )->uxState = ( ( __LINE__ * 2 ) + 1 ); return; \\\r\n    case ( ( __LINE__ * 2 ) + 1 ):\r\n\r\n/**\r\n * croutine. h\r\n * @code{c}\r\n * crDELAY( CoRoutineHandle_t xHandle, TickType_t xTicksToDelay );\r\n * @endcode\r\n *\r\n * Delay a co-routine for a fixed period of time.\r\n *\r\n * crDELAY can only be called from the co-routine function itself - not\r\n * from within a function called by the co-routine function.  This is because\r\n * co-routines do not maintain their own stack.\r\n *\r\n * @param xHandle The handle of the co-routine to delay.  This is the xHandle\r\n * parameter of the co-routine function.\r\n *\r\n * @param xTickToDelay The number of ticks that the co-routine should delay\r\n * for.  The actual amount of time this equates to is defined by\r\n * configTICK_RATE_HZ (set in FreeRTOSConfig.h).  The constant portTICK_PERIOD_MS\r\n * can be used to convert ticks to milliseconds.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * // Co-routine to be created.\r\n * void vACoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )\r\n * {\r\n * // Variables in co-routines must be declared static if they must maintain value across a blocking call.\r\n * // This may not be necessary for const variables.\r\n * // We are to delay for 200ms.\r\n * static const xTickType xDelayTime = 200 / portTICK_PERIOD_MS;\r\n *\r\n *   // Must start every co-routine with a call to crSTART();\r\n *   crSTART( xHandle );\r\n *\r\n *   for( ;; )\r\n *   {\r\n *      // Delay for 200ms.\r\n *      crDELAY( xHandle, xDelayTime );\r\n *\r\n *      // Do something here.\r\n *   }\r\n *\r\n *   // Must end every co-routine with a call to crEND();\r\n *   crEND();\r\n * }\r\n * @endcode\r\n * \\defgroup crDELAY crDELAY\r\n * \\ingroup Tasks\r\n */\r\n#define crDELAY( xHandle, xTicksToDelay )                          \\\r\n    do {                                                           \\\r\n        if( ( xTicksToDelay ) > 0 )                                \\\r\n        {                                                          \\\r\n            vCoRoutineAddToDelayedList( ( xTicksToDelay ), NULL ); \\\r\n        }                                                          \\\r\n        crSET_STATE0( ( xHandle ) );                               \\\r\n    } while( 0 )\r\n\r\n/**\r\n * @code{c}\r\n * crQUEUE_SEND(\r\n *                CoRoutineHandle_t xHandle,\r\n *                QueueHandle_t pxQueue,\r\n *                void *pvItemToQueue,\r\n *                TickType_t xTicksToWait,\r\n *                BaseType_t *pxResult\r\n *           )\r\n * @endcode\r\n *\r\n * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine\r\n * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks.\r\n *\r\n * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas\r\n * xQueueSend() and xQueueReceive() can only be used from tasks.\r\n *\r\n * crQUEUE_SEND can only be called from the co-routine function itself - not\r\n * from within a function called by the co-routine function.  This is because\r\n * co-routines do not maintain their own stack.\r\n *\r\n * See the co-routine section of the WEB documentation for information on\r\n * passing data between tasks and co-routines and between ISR's and\r\n * co-routines.\r\n *\r\n * @param xHandle The handle of the calling co-routine.  This is the xHandle\r\n * parameter of the co-routine function.\r\n *\r\n * @param pxQueue The handle of the queue on which the data will be posted.\r\n * The handle is obtained as the return value when the queue is created using\r\n * the xQueueCreate() API function.\r\n *\r\n * @param pvItemToQueue A pointer to the data being posted onto the queue.\r\n * The number of bytes of each queued item is specified when the queue is\r\n * created.  This number of bytes is copied from pvItemToQueue into the queue\r\n * itself.\r\n *\r\n * @param xTickToDelay The number of ticks that the co-routine should block\r\n * to wait for space to become available on the queue, should space not be\r\n * available immediately. The actual amount of time this equates to is defined\r\n * by configTICK_RATE_HZ (set in FreeRTOSConfig.h).  The constant\r\n * portTICK_PERIOD_MS can be used to convert ticks to milliseconds (see example\r\n * below).\r\n *\r\n * @param pxResult The variable pointed to by pxResult will be set to pdPASS if\r\n * data was successfully posted onto the queue, otherwise it will be set to an\r\n * error defined within ProjDefs.h.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * // Co-routine function that blocks for a fixed period then posts a number onto\r\n * // a queue.\r\n * static void prvCoRoutineFlashTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )\r\n * {\r\n * // Variables in co-routines must be declared static if they must maintain value across a blocking call.\r\n * static BaseType_t xNumberToPost = 0;\r\n * static BaseType_t xResult;\r\n *\r\n *  // Co-routines must begin with a call to crSTART().\r\n *  crSTART( xHandle );\r\n *\r\n *  for( ;; )\r\n *  {\r\n *      // This assumes the queue has already been created.\r\n *      crQUEUE_SEND( xHandle, xCoRoutineQueue, &xNumberToPost, NO_DELAY, &xResult );\r\n *\r\n *      if( xResult != pdPASS )\r\n *      {\r\n *          // The message was not posted!\r\n *      }\r\n *\r\n *      // Increment the number to be posted onto the queue.\r\n *      xNumberToPost++;\r\n *\r\n *      // Delay for 100 ticks.\r\n *      crDELAY( xHandle, 100 );\r\n *  }\r\n *\r\n *  // Co-routines must end with a call to crEND().\r\n *  crEND();\r\n * }\r\n * @endcode\r\n * \\defgroup crQUEUE_SEND crQUEUE_SEND\r\n * \\ingroup Tasks\r\n */\r\n#define crQUEUE_SEND( xHandle, pxQueue, pvItemToQueue, xTicksToWait, pxResult )           \\\r\n    do {                                                                                  \\\r\n        *( pxResult ) = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), ( xTicksToWait ) ); \\\r\n        if( *( pxResult ) == errQUEUE_BLOCKED )                                           \\\r\n        {                                                                                 \\\r\n            crSET_STATE0( ( xHandle ) );                                                  \\\r\n            *pxResult = xQueueCRSend( ( pxQueue ), ( pvItemToQueue ), 0 );                \\\r\n        }                                                                                 \\\r\n        if( *pxResult == errQUEUE_YIELD )                                                 \\\r\n        {                                                                                 \\\r\n            crSET_STATE1( ( xHandle ) );                                                  \\\r\n            *pxResult = pdPASS;                                                           \\\r\n        }                                                                                 \\\r\n    } while( 0 )\r\n\r\n/**\r\n * croutine. h\r\n * @code{c}\r\n * crQUEUE_RECEIVE(\r\n *                   CoRoutineHandle_t xHandle,\r\n *                   QueueHandle_t pxQueue,\r\n *                   void *pvBuffer,\r\n *                   TickType_t xTicksToWait,\r\n *                   BaseType_t *pxResult\r\n *               )\r\n * @endcode\r\n *\r\n * The macro's crQUEUE_SEND() and crQUEUE_RECEIVE() are the co-routine\r\n * equivalent to the xQueueSend() and xQueueReceive() functions used by tasks.\r\n *\r\n * crQUEUE_SEND and crQUEUE_RECEIVE can only be used from a co-routine whereas\r\n * xQueueSend() and xQueueReceive() can only be used from tasks.\r\n *\r\n * crQUEUE_RECEIVE can only be called from the co-routine function itself - not\r\n * from within a function called by the co-routine function.  This is because\r\n * co-routines do not maintain their own stack.\r\n *\r\n * See the co-routine section of the WEB documentation for information on\r\n * passing data between tasks and co-routines and between ISR's and\r\n * co-routines.\r\n *\r\n * @param xHandle The handle of the calling co-routine.  This is the xHandle\r\n * parameter of the co-routine function.\r\n *\r\n * @param pxQueue The handle of the queue from which the data will be received.\r\n * The handle is obtained as the return value when the queue is created using\r\n * the xQueueCreate() API function.\r\n *\r\n * @param pvBuffer The buffer into which the received item is to be copied.\r\n * The number of bytes of each queued item is specified when the queue is\r\n * created.  This number of bytes is copied into pvBuffer.\r\n *\r\n * @param xTickToDelay The number of ticks that the co-routine should block\r\n * to wait for data to become available from the queue, should data not be\r\n * available immediately. The actual amount of time this equates to is defined\r\n * by configTICK_RATE_HZ (set in FreeRTOSConfig.h).  The constant\r\n * portTICK_PERIOD_MS can be used to convert ticks to milliseconds (see the\r\n * crQUEUE_SEND example).\r\n *\r\n * @param pxResult The variable pointed to by pxResult will be set to pdPASS if\r\n * data was successfully retrieved from the queue, otherwise it will be set to\r\n * an error code as defined within ProjDefs.h.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * // A co-routine receives the number of an LED to flash from a queue.  It\r\n * // blocks on the queue until the number is received.\r\n * static void prvCoRoutineFlashWorkTask( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )\r\n * {\r\n * // Variables in co-routines must be declared static if they must maintain value across a blocking call.\r\n * static BaseType_t xResult;\r\n * static UBaseType_t uxLEDToFlash;\r\n *\r\n *  // All co-routines must start with a call to crSTART().\r\n *  crSTART( xHandle );\r\n *\r\n *  for( ;; )\r\n *  {\r\n *      // Wait for data to become available on the queue.\r\n *      crQUEUE_RECEIVE( xHandle, xCoRoutineQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );\r\n *\r\n *      if( xResult == pdPASS )\r\n *      {\r\n *          // We received the LED to flash - flash it!\r\n *          vParTestToggleLED( uxLEDToFlash );\r\n *      }\r\n *  }\r\n *\r\n *  crEND();\r\n * }\r\n * @endcode\r\n * \\defgroup crQUEUE_RECEIVE crQUEUE_RECEIVE\r\n * \\ingroup Tasks\r\n */\r\n#define crQUEUE_RECEIVE( xHandle, pxQueue, pvBuffer, xTicksToWait, pxResult )           \\\r\n    do {                                                                                \\\r\n        *( pxResult ) = xQueueCRReceive( ( pxQueue ), ( pvBuffer ), ( xTicksToWait ) ); \\\r\n        if( *( pxResult ) == errQUEUE_BLOCKED )                                         \\\r\n        {                                                                               \\\r\n            crSET_STATE0( ( xHandle ) );                                                \\\r\n            *( pxResult ) = xQueueCRReceive( ( pxQueue ), ( pvBuffer ), 0 );            \\\r\n        }                                                                               \\\r\n        if( *( pxResult ) == errQUEUE_YIELD )                                           \\\r\n        {                                                                               \\\r\n            crSET_STATE1( ( xHandle ) );                                                \\\r\n            *( pxResult ) = pdPASS;                                                     \\\r\n        }                                                                               \\\r\n    } while( 0 )\r\n\r\n/**\r\n * croutine. h\r\n * @code{c}\r\n * crQUEUE_SEND_FROM_ISR(\r\n *                          QueueHandle_t pxQueue,\r\n *                          void *pvItemToQueue,\r\n *                          BaseType_t xCoRoutinePreviouslyWoken\r\n *                     )\r\n * @endcode\r\n *\r\n * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the\r\n * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR()\r\n * functions used by tasks.\r\n *\r\n * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to\r\n * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and\r\n * xQueueReceiveFromISR() can only be used to pass data between a task and and\r\n * ISR.\r\n *\r\n * crQUEUE_SEND_FROM_ISR can only be called from an ISR to send data to a queue\r\n * that is being used from within a co-routine.\r\n *\r\n * See the co-routine section of the WEB documentation for information on\r\n * passing data between tasks and co-routines and between ISR's and\r\n * co-routines.\r\n *\r\n * @param xQueue The handle to the queue on which the item is to be posted.\r\n *\r\n * @param pvItemToQueue A pointer to the item that is to be placed on the\r\n * queue.  The size of the items the queue will hold was defined when the\r\n * queue was created, so this many bytes will be copied from pvItemToQueue\r\n * into the queue storage area.\r\n *\r\n * @param xCoRoutinePreviouslyWoken This is included so an ISR can post onto\r\n * the same queue multiple times from a single interrupt.  The first call\r\n * should always pass in pdFALSE.  Subsequent calls should pass in\r\n * the value returned from the previous call.\r\n *\r\n * @return pdTRUE if a co-routine was woken by posting onto the queue.  This is\r\n * used by the ISR to determine if a context switch may be required following\r\n * the ISR.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * // A co-routine that blocks on a queue waiting for characters to be received.\r\n * static void vReceivingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )\r\n * {\r\n * char cRxedChar;\r\n * BaseType_t xResult;\r\n *\r\n *   // All co-routines must start with a call to crSTART().\r\n *   crSTART( xHandle );\r\n *\r\n *   for( ;; )\r\n *   {\r\n *       // Wait for data to become available on the queue.  This assumes the\r\n *       // queue xCommsRxQueue has already been created!\r\n *       crQUEUE_RECEIVE( xHandle, xCommsRxQueue, &uxLEDToFlash, portMAX_DELAY, &xResult );\r\n *\r\n *       // Was a character received?\r\n *       if( xResult == pdPASS )\r\n *       {\r\n *           // Process the character here.\r\n *       }\r\n *   }\r\n *\r\n *   // All co-routines must end with a call to crEND().\r\n *   crEND();\r\n * }\r\n *\r\n * // An ISR that uses a queue to send characters received on a serial port to\r\n * // a co-routine.\r\n * void vUART_ISR( void )\r\n * {\r\n * char cRxedChar;\r\n * BaseType_t xCRWokenByPost = pdFALSE;\r\n *\r\n *   // We loop around reading characters until there are none left in the UART.\r\n *   while( UART_RX_REG_NOT_EMPTY() )\r\n *   {\r\n *       // Obtain the character from the UART.\r\n *       cRxedChar = UART_RX_REG;\r\n *\r\n *       // Post the character onto a queue.  xCRWokenByPost will be pdFALSE\r\n *       // the first time around the loop.  If the post causes a co-routine\r\n *       // to be woken (unblocked) then xCRWokenByPost will be set to pdTRUE.\r\n *       // In this manner we can ensure that if more than one co-routine is\r\n *       // blocked on the queue only one is woken by this ISR no matter how\r\n *       // many characters are posted to the queue.\r\n *       xCRWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsRxQueue, &cRxedChar, xCRWokenByPost );\r\n *   }\r\n * }\r\n * @endcode\r\n * \\defgroup crQUEUE_SEND_FROM_ISR crQUEUE_SEND_FROM_ISR\r\n * \\ingroup Tasks\r\n */\r\n#define crQUEUE_SEND_FROM_ISR( pxQueue, pvItemToQueue, xCoRoutinePreviouslyWoken ) \\\r\n    xQueueCRSendFromISR( ( pxQueue ), ( pvItemToQueue ), ( xCoRoutinePreviouslyWoken ) )\r\n\r\n\r\n/**\r\n * croutine. h\r\n * @code{c}\r\n * crQUEUE_SEND_FROM_ISR(\r\n *                          QueueHandle_t pxQueue,\r\n *                          void *pvBuffer,\r\n *                          BaseType_t * pxCoRoutineWoken\r\n *                     )\r\n * @endcode\r\n *\r\n * The macro's crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() are the\r\n * co-routine equivalent to the xQueueSendFromISR() and xQueueReceiveFromISR()\r\n * functions used by tasks.\r\n *\r\n * crQUEUE_SEND_FROM_ISR() and crQUEUE_RECEIVE_FROM_ISR() can only be used to\r\n * pass data between a co-routine and and ISR, whereas xQueueSendFromISR() and\r\n * xQueueReceiveFromISR() can only be used to pass data between a task and and\r\n * ISR.\r\n *\r\n * crQUEUE_RECEIVE_FROM_ISR can only be called from an ISR to receive data\r\n * from a queue that is being used from within a co-routine (a co-routine\r\n * posted to the queue).\r\n *\r\n * See the co-routine section of the WEB documentation for information on\r\n * passing data between tasks and co-routines and between ISR's and\r\n * co-routines.\r\n *\r\n * @param xQueue The handle to the queue on which the item is to be posted.\r\n *\r\n * @param pvBuffer A pointer to a buffer into which the received item will be\r\n * placed.  The size of the items the queue will hold was defined when the\r\n * queue was created, so this many bytes will be copied from the queue into\r\n * pvBuffer.\r\n *\r\n * @param pxCoRoutineWoken A co-routine may be blocked waiting for space to become\r\n * available on the queue.  If crQUEUE_RECEIVE_FROM_ISR causes such a\r\n * co-routine to unblock *pxCoRoutineWoken will get set to pdTRUE, otherwise\r\n * *pxCoRoutineWoken will remain unchanged.\r\n *\r\n * @return pdTRUE an item was successfully received from the queue, otherwise\r\n * pdFALSE.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * // A co-routine that posts a character to a queue then blocks for a fixed\r\n * // period.  The character is incremented each time.\r\n * static void vSendingCoRoutine( CoRoutineHandle_t xHandle, UBaseType_t uxIndex )\r\n * {\r\n * // cChar holds its value while this co-routine is blocked and must therefore\r\n * // be declared static.\r\n * static char cCharToTx = 'a';\r\n * BaseType_t xResult;\r\n *\r\n *   // All co-routines must start with a call to crSTART().\r\n *   crSTART( xHandle );\r\n *\r\n *   for( ;; )\r\n *   {\r\n *       // Send the next character to the queue.\r\n *       crQUEUE_SEND( xHandle, xCoRoutineQueue, &cCharToTx, NO_DELAY, &xResult );\r\n *\r\n *       if( xResult == pdPASS )\r\n *       {\r\n *           // The character was successfully posted to the queue.\r\n *       }\r\n *       else\r\n *       {\r\n *          // Could not post the character to the queue.\r\n *       }\r\n *\r\n *       // Enable the UART Tx interrupt to cause an interrupt in this\r\n *       // hypothetical UART.  The interrupt will obtain the character\r\n *       // from the queue and send it.\r\n *       ENABLE_RX_INTERRUPT();\r\n *\r\n *       // Increment to the next character then block for a fixed period.\r\n *       // cCharToTx will maintain its value across the delay as it is\r\n *       // declared static.\r\n *       cCharToTx++;\r\n *       if( cCharToTx > 'x' )\r\n *       {\r\n *          cCharToTx = 'a';\r\n *       }\r\n *       crDELAY( 100 );\r\n *   }\r\n *\r\n *   // All co-routines must end with a call to crEND().\r\n *   crEND();\r\n * }\r\n *\r\n * // An ISR that uses a queue to receive characters to send on a UART.\r\n * void vUART_ISR( void )\r\n * {\r\n * char cCharToTx;\r\n * BaseType_t xCRWokenByPost = pdFALSE;\r\n *\r\n *   while( UART_TX_REG_EMPTY() )\r\n *   {\r\n *       // Are there any characters in the queue waiting to be sent?\r\n *       // xCRWokenByPost will automatically be set to pdTRUE if a co-routine\r\n *       // is woken by the post - ensuring that only a single co-routine is\r\n *       // woken no matter how many times we go around this loop.\r\n *       if( crQUEUE_RECEIVE_FROM_ISR( pxQueue, &cCharToTx, &xCRWokenByPost ) )\r\n *       {\r\n *           SEND_CHARACTER( cCharToTx );\r\n *       }\r\n *   }\r\n * }\r\n * @endcode\r\n * \\defgroup crQUEUE_RECEIVE_FROM_ISR crQUEUE_RECEIVE_FROM_ISR\r\n * \\ingroup Tasks\r\n */\r\n#define crQUEUE_RECEIVE_FROM_ISR( pxQueue, pvBuffer, pxCoRoutineWoken ) \\\r\n    xQueueCRReceiveFromISR( ( pxQueue ), ( pvBuffer ), ( pxCoRoutineWoken ) )\r\n\r\n/*\r\n * This function is intended for internal use by the co-routine macros only.\r\n * The macro nature of the co-routine implementation requires that the\r\n * prototype appears here.  The function should not be used by application\r\n * writers.\r\n *\r\n * Removes the current co-routine from its ready list and places it in the\r\n * appropriate delayed list.\r\n */\r\nvoid vCoRoutineAddToDelayedList( TickType_t xTicksToDelay,\r\n                                 List_t * pxEventList );\r\n\r\n/*\r\n * This function is intended for internal use by the queue implementation only.\r\n * The function should not be used by application writers.\r\n *\r\n * Removes the highest priority co-routine from the event list and places it in\r\n * the pending ready list.\r\n */\r\nBaseType_t xCoRoutineRemoveFromEventList( const List_t * pxEventList );\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    }\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n#endif /* CO_ROUTINE_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/deprecated_definitions.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n#ifndef DEPRECATED_DEFINITIONS_H\r\n#define DEPRECATED_DEFINITIONS_H\r\n\r\n\r\n/* Each FreeRTOS port has a unique portmacro.h header file.  Originally a\r\n * pre-processor definition was used to ensure the pre-processor found the correct\r\n * portmacro.h file for the port being used.  That scheme was deprecated in favour\r\n * of setting the compiler's include path such that it found the correct\r\n * portmacro.h file - removing the need for the constant and allowing the\r\n * portmacro.h file to be located anywhere in relation to the port being used.  The\r\n * definitions below remain in the code for backward compatibility only.  New\r\n * projects should not use them. */\r\n\r\n#ifdef OPEN_WATCOM_INDUSTRIAL_PC_PORT\r\n    #include \"..\\..\\Source\\portable\\owatcom\\16bitdos\\pc\\portmacro.h\"\r\n    typedef void ( __interrupt __far * pxISR )();\r\n#endif\r\n\r\n#ifdef OPEN_WATCOM_FLASH_LITE_186_PORT\r\n    #include \"..\\..\\Source\\portable\\owatcom\\16bitdos\\flsh186\\portmacro.h\"\r\n    typedef void ( __interrupt __far * pxISR )();\r\n#endif\r\n\r\n#ifdef GCC_MEGA_AVR\r\n    #include \"../portable/GCC/ATMega323/portmacro.h\"\r\n#endif\r\n\r\n#ifdef IAR_MEGA_AVR\r\n    #include \"../portable/IAR/ATMega323/portmacro.h\"\r\n#endif\r\n\r\n#ifdef MPLAB_PIC24_PORT\r\n    #include \"../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h\"\r\n#endif\r\n\r\n#ifdef MPLAB_DSPIC_PORT\r\n    #include \"../../Source/portable/MPLAB/PIC24_dsPIC/portmacro.h\"\r\n#endif\r\n\r\n#ifdef MPLAB_PIC18F_PORT\r\n    #include \"../../Source/portable/MPLAB/PIC18F/portmacro.h\"\r\n#endif\r\n\r\n#ifdef MPLAB_PIC32MX_PORT\r\n    #include \"../../Source/portable/MPLAB/PIC32MX/portmacro.h\"\r\n#endif\r\n\r\n#ifdef _FEDPICC\r\n    #include \"libFreeRTOS/Include/portmacro.h\"\r\n#endif\r\n\r\n#ifdef SDCC_CYGNAL\r\n    #include \"../../Source/portable/SDCC/Cygnal/portmacro.h\"\r\n#endif\r\n\r\n#ifdef GCC_ARM7\r\n    #include \"../../Source/portable/GCC/ARM7_LPC2000/portmacro.h\"\r\n#endif\r\n\r\n#ifdef GCC_ARM7_ECLIPSE\r\n    #include \"portmacro.h\"\r\n#endif\r\n\r\n#ifdef ROWLEY_LPC23xx\r\n    #include \"../../Source/portable/GCC/ARM7_LPC23xx/portmacro.h\"\r\n#endif\r\n\r\n#ifdef IAR_MSP430\r\n    #include \"..\\..\\Source\\portable\\IAR\\MSP430\\portmacro.h\"\r\n#endif\r\n\r\n#ifdef GCC_MSP430\r\n    #include \"../../Source/portable/GCC/MSP430F449/portmacro.h\"\r\n#endif\r\n\r\n#ifdef ROWLEY_MSP430\r\n    #include \"../../Source/portable/Rowley/MSP430F449/portmacro.h\"\r\n#endif\r\n\r\n#ifdef ARM7_LPC21xx_KEIL_RVDS\r\n    #include \"..\\..\\Source\\portable\\RVDS\\ARM7_LPC21xx\\portmacro.h\"\r\n#endif\r\n\r\n#ifdef SAM7_GCC\r\n    #include \"../../Source/portable/GCC/ARM7_AT91SAM7S/portmacro.h\"\r\n#endif\r\n\r\n#ifdef SAM7_IAR\r\n    #include \"..\\..\\Source\\portable\\IAR\\AtmelSAM7S64\\portmacro.h\"\r\n#endif\r\n\r\n#ifdef SAM9XE_IAR\r\n    #include \"..\\..\\Source\\portable\\IAR\\AtmelSAM9XE\\portmacro.h\"\r\n#endif\r\n\r\n#ifdef LPC2000_IAR\r\n    #include \"..\\..\\Source\\portable\\IAR\\LPC2000\\portmacro.h\"\r\n#endif\r\n\r\n#ifdef STR71X_IAR\r\n    #include \"..\\..\\Source\\portable\\IAR\\STR71x\\portmacro.h\"\r\n#endif\r\n\r\n#ifdef STR75X_IAR\r\n    #include \"..\\..\\Source\\portable\\IAR\\STR75x\\portmacro.h\"\r\n#endif\r\n\r\n#ifdef STR75X_GCC\r\n    #include \"..\\..\\Source\\portable\\GCC\\STR75x\\portmacro.h\"\r\n#endif\r\n\r\n#ifdef STR91X_IAR\r\n    #include \"..\\..\\Source\\portable\\IAR\\STR91x\\portmacro.h\"\r\n#endif\r\n\r\n#ifdef GCC_H8S\r\n    #include \"../../Source/portable/GCC/H8S2329/portmacro.h\"\r\n#endif\r\n\r\n#ifdef GCC_AT91FR40008\r\n    #include \"../../Source/portable/GCC/ARM7_AT91FR40008/portmacro.h\"\r\n#endif\r\n\r\n#ifdef RVDS_ARMCM3_LM3S102\r\n    #include \"../../Source/portable/RVDS/ARM_CM3/portmacro.h\"\r\n#endif\r\n\r\n#ifdef GCC_ARMCM3_LM3S102\r\n    #include \"../../Source/portable/GCC/ARM_CM3/portmacro.h\"\r\n#endif\r\n\r\n#ifdef GCC_ARMCM3\r\n    #include \"../../Source/portable/GCC/ARM_CM3/portmacro.h\"\r\n#endif\r\n\r\n#ifdef IAR_ARM_CM3\r\n    #include \"../../Source/portable/IAR/ARM_CM3/portmacro.h\"\r\n#endif\r\n\r\n#ifdef IAR_ARMCM3_LM\r\n    #include \"../../Source/portable/IAR/ARM_CM3/portmacro.h\"\r\n#endif\r\n\r\n#ifdef HCS12_CODE_WARRIOR\r\n    #include \"../../Source/portable/CodeWarrior/HCS12/portmacro.h\"\r\n#endif\r\n\r\n#ifdef MICROBLAZE_GCC\r\n    #include \"../../Source/portable/GCC/MicroBlaze/portmacro.h\"\r\n#endif\r\n\r\n#ifdef TERN_EE\r\n    #include \"..\\..\\Source\\portable\\Paradigm\\Tern_EE\\small\\portmacro.h\"\r\n#endif\r\n\r\n#ifdef GCC_HCS12\r\n    #include \"../../Source/portable/GCC/HCS12/portmacro.h\"\r\n#endif\r\n\r\n#ifdef GCC_MCF5235\r\n    #include \"../../Source/portable/GCC/MCF5235/portmacro.h\"\r\n#endif\r\n\r\n#ifdef COLDFIRE_V2_GCC\r\n    #include \"../../../Source/portable/GCC/ColdFire_V2/portmacro.h\"\r\n#endif\r\n\r\n#ifdef COLDFIRE_V2_CODEWARRIOR\r\n    #include \"../../Source/portable/CodeWarrior/ColdFire_V2/portmacro.h\"\r\n#endif\r\n\r\n#ifdef GCC_PPC405\r\n    #include \"../../Source/portable/GCC/PPC405_Xilinx/portmacro.h\"\r\n#endif\r\n\r\n#ifdef GCC_PPC440\r\n    #include \"../../Source/portable/GCC/PPC440_Xilinx/portmacro.h\"\r\n#endif\r\n\r\n#ifdef _16FX_SOFTUNE\r\n    #include \"..\\..\\Source\\portable\\Softune\\MB96340\\portmacro.h\"\r\n#endif\r\n\r\n#ifdef BCC_INDUSTRIAL_PC_PORT\r\n\r\n/* A short file name has to be used in place of the normal\r\n * FreeRTOSConfig.h when using the Borland compiler. */\r\n    #include \"frconfig.h\"\r\n    #include \"..\\portable\\BCC\\16BitDOS\\PC\\prtmacro.h\"\r\n    typedef void ( __interrupt __far * pxISR )();\r\n#endif\r\n\r\n#ifdef BCC_FLASH_LITE_186_PORT\r\n\r\n/* A short file name has to be used in place of the normal\r\n * FreeRTOSConfig.h when using the Borland compiler. */\r\n    #include \"frconfig.h\"\r\n    #include \"..\\portable\\BCC\\16BitDOS\\flsh186\\prtmacro.h\"\r\n    typedef void ( __interrupt __far * pxISR )();\r\n#endif\r\n\r\n#ifdef __GNUC__\r\n    #ifdef __AVR32_AVR32A__\r\n        #include \"portmacro.h\"\r\n    #endif\r\n#endif\r\n\r\n#ifdef __ICCAVR32__\r\n    #ifdef __CORE__\r\n        #if __CORE__ == __AVR32A__\r\n            #include \"portmacro.h\"\r\n        #endif\r\n    #endif\r\n#endif\r\n\r\n#ifdef __91467D\r\n    #include \"portmacro.h\"\r\n#endif\r\n\r\n#ifdef __96340\r\n    #include \"portmacro.h\"\r\n#endif\r\n\r\n\r\n#ifdef __IAR_V850ES_Fx3__\r\n    #include \"../../Source/portable/IAR/V850ES/portmacro.h\"\r\n#endif\r\n\r\n#ifdef __IAR_V850ES_Jx3__\r\n    #include \"../../Source/portable/IAR/V850ES/portmacro.h\"\r\n#endif\r\n\r\n#ifdef __IAR_V850ES_Jx3_L__\r\n    #include \"../../Source/portable/IAR/V850ES/portmacro.h\"\r\n#endif\r\n\r\n#ifdef __IAR_V850ES_Jx2__\r\n    #include \"../../Source/portable/IAR/V850ES/portmacro.h\"\r\n#endif\r\n\r\n#ifdef __IAR_V850ES_Hx2__\r\n    #include \"../../Source/portable/IAR/V850ES/portmacro.h\"\r\n#endif\r\n\r\n#ifdef __IAR_78K0R_Kx3__\r\n    #include \"../../Source/portable/IAR/78K0R/portmacro.h\"\r\n#endif\r\n\r\n#ifdef __IAR_78K0R_Kx3L__\r\n    #include \"../../Source/portable/IAR/78K0R/portmacro.h\"\r\n#endif\r\n\r\n#endif /* DEPRECATED_DEFINITIONS_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/event_groups.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n#ifndef EVENT_GROUPS_H\r\n#define EVENT_GROUPS_H\r\n\r\n#ifndef INC_FREERTOS_H\r\n    #error \"include FreeRTOS.h\" must appear in source files before \"include event_groups.h\"\r\n#endif\r\n\r\n/* FreeRTOS includes. */\r\n#include \"timers.h\"\r\n\r\n/* The following bit fields convey control information in a task's event list\r\n * item value.  It is important they don't clash with the\r\n * taskEVENT_LIST_ITEM_VALUE_IN_USE definition. */\r\n#if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS )\r\n    #define eventCLEAR_EVENTS_ON_EXIT_BIT    ( ( uint16_t ) 0x0100U )\r\n    #define eventUNBLOCKED_DUE_TO_BIT_SET    ( ( uint16_t ) 0x0200U )\r\n    #define eventWAIT_FOR_ALL_BITS           ( ( uint16_t ) 0x0400U )\r\n    #define eventEVENT_BITS_CONTROL_BYTES    ( ( uint16_t ) 0xff00U )\r\n#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_32_BITS )\r\n    #define eventCLEAR_EVENTS_ON_EXIT_BIT    ( ( uint32_t ) 0x01000000UL )\r\n    #define eventUNBLOCKED_DUE_TO_BIT_SET    ( ( uint32_t ) 0x02000000UL )\r\n    #define eventWAIT_FOR_ALL_BITS           ( ( uint32_t ) 0x04000000UL )\r\n    #define eventEVENT_BITS_CONTROL_BYTES    ( ( uint32_t ) 0xff000000UL )\r\n#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_64_BITS )\r\n    #define eventCLEAR_EVENTS_ON_EXIT_BIT    ( ( uint64_t ) 0x0100000000000000ULL )\r\n    #define eventUNBLOCKED_DUE_TO_BIT_SET    ( ( uint64_t ) 0x0200000000000000ULL )\r\n    #define eventWAIT_FOR_ALL_BITS           ( ( uint64_t ) 0x0400000000000000ULL )\r\n    #define eventEVENT_BITS_CONTROL_BYTES    ( ( uint64_t ) 0xff00000000000000ULL )\r\n#endif /* if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS ) */\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    extern \"C\" {\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n/**\r\n * An event group is a collection of bits to which an application can assign a\r\n * meaning.  For example, an application may create an event group to convey\r\n * the status of various CAN bus related events in which bit 0 might mean \"A CAN\r\n * message has been received and is ready for processing\", bit 1 might mean \"The\r\n * application has queued a message that is ready for sending onto the CAN\r\n * network\", and bit 2 might mean \"It is time to send a SYNC message onto the\r\n * CAN network\" etc.  A task can then test the bit values to see which events\r\n * are active, and optionally enter the Blocked state to wait for a specified\r\n * bit or a group of specified bits to be active.  To continue the CAN bus\r\n * example, a CAN controlling task can enter the Blocked state (and therefore\r\n * not consume any processing time) until either bit 0, bit 1 or bit 2 are\r\n * active, at which time the bit that was actually active would inform the task\r\n * which action it had to take (process a received message, send a message, or\r\n * send a SYNC).\r\n *\r\n * The event groups implementation contains intelligence to avoid race\r\n * conditions that would otherwise occur were an application to use a simple\r\n * variable for the same purpose.  This is particularly important with respect\r\n * to when a bit within an event group is to be cleared, and when bits have to\r\n * be set and then tested atomically - as is the case where event groups are\r\n * used to create a synchronisation point between multiple tasks (a\r\n * 'rendezvous').\r\n */\r\n\r\n\r\n\r\n/**\r\n * event_groups.h\r\n *\r\n * Type by which event groups are referenced.  For example, a call to\r\n * xEventGroupCreate() returns an EventGroupHandle_t variable that can then\r\n * be used as a parameter to other event group functions.\r\n *\r\n * \\defgroup EventGroupHandle_t EventGroupHandle_t\r\n * \\ingroup EventGroup\r\n */\r\nstruct EventGroupDef_t;\r\ntypedef struct EventGroupDef_t   * EventGroupHandle_t;\r\n\r\n/*\r\n * The type that holds event bits always matches TickType_t - therefore the\r\n * number of bits it holds is set by configTICK_TYPE_WIDTH_IN_BITS (16 bits if set to 0,\r\n * 32 bits if set to 1, 64 bits if set to 2.\r\n *\r\n * \\defgroup EventBits_t EventBits_t\r\n * \\ingroup EventGroup\r\n */\r\ntypedef TickType_t               EventBits_t;\r\n\r\n/**\r\n * event_groups.h\r\n * @code{c}\r\n * EventGroupHandle_t xEventGroupCreate( void );\r\n * @endcode\r\n *\r\n * Create a new event group.\r\n *\r\n * Internally, within the FreeRTOS implementation, event groups use a [small]\r\n * block of memory, in which the event group's structure is stored.  If an event\r\n * groups is created using xEventGroupCreate() then the required memory is\r\n * automatically dynamically allocated inside the xEventGroupCreate() function.\r\n * (see https://www.FreeRTOS.org/a00111.html).  If an event group is created\r\n * using xEventGroupCreateStatic() then the application writer must instead\r\n * provide the memory that will get used by the event group.\r\n * xEventGroupCreateStatic() therefore allows an event group to be created\r\n * without using any dynamic memory allocation.\r\n *\r\n * Although event groups are not related to ticks, for internal implementation\r\n * reasons the number of bits available for use in an event group is dependent\r\n * on the configTICK_TYPE_WIDTH_IN_BITS setting in FreeRTOSConfig.h.  If\r\n * configTICK_TYPE_WIDTH_IN_BITS is 0 then each event group contains 8 usable bits (bit\r\n * 0 to bit 7).  If configTICK_TYPE_WIDTH_IN_BITS is set to 1 then each event group has\r\n * 24 usable bits (bit 0 to bit 23).  If configTICK_TYPE_WIDTH_IN_BITS is set to 2 then\r\n * each event group has 56 usable bits (bit 0 to bit 53). The EventBits_t type\r\n * is used to store event bits within an event group.\r\n *\r\n * @return If the event group was created then a handle to the event group is\r\n * returned.  If there was insufficient FreeRTOS heap available to create the\r\n * event group then NULL is returned.  See https://www.FreeRTOS.org/a00111.html\r\n *\r\n * Example usage:\r\n * @code{c}\r\n *  // Declare a variable to hold the created event group.\r\n *  EventGroupHandle_t xCreatedEventGroup;\r\n *\r\n *  // Attempt to create the event group.\r\n *  xCreatedEventGroup = xEventGroupCreate();\r\n *\r\n *  // Was the event group created successfully?\r\n *  if( xCreatedEventGroup == NULL )\r\n *  {\r\n *      // The event group was not created because there was insufficient\r\n *      // FreeRTOS heap available.\r\n *  }\r\n *  else\r\n *  {\r\n *      // The event group was created.\r\n *  }\r\n * @endcode\r\n * \\defgroup xEventGroupCreate xEventGroupCreate\r\n * \\ingroup EventGroup\r\n */\r\n#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r\n    EventGroupHandle_t xEventGroupCreate( void ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * event_groups.h\r\n * @code{c}\r\n * EventGroupHandle_t xEventGroupCreateStatic( EventGroupHandle_t * pxEventGroupBuffer );\r\n * @endcode\r\n *\r\n * Create a new event group.\r\n *\r\n * Internally, within the FreeRTOS implementation, event groups use a [small]\r\n * block of memory, in which the event group's structure is stored.  If an event\r\n * groups is created using xEventGroupCreate() then the required memory is\r\n * automatically dynamically allocated inside the xEventGroupCreate() function.\r\n * (see https://www.FreeRTOS.org/a00111.html).  If an event group is created\r\n * using xEventGroupCreateStatic() then the application writer must instead\r\n * provide the memory that will get used by the event group.\r\n * xEventGroupCreateStatic() therefore allows an event group to be created\r\n * without using any dynamic memory allocation.\r\n *\r\n * Although event groups are not related to ticks, for internal implementation\r\n * reasons the number of bits available for use in an event group is dependent\r\n * on the configTICK_TYPE_WIDTH_IN_BITS setting in FreeRTOSConfig.h.  If\r\n * configTICK_TYPE_WIDTH_IN_BITS is 0 then each event group contains 8 usable bits (bit\r\n * 0 to bit 7).  If configTICK_TYPE_WIDTH_IN_BITS is set to 1 then each event group has\r\n * 24 usable bits (bit 0 to bit 23).  If configTICK_TYPE_WIDTH_IN_BITS is set to 2 then\r\n * each event group has 56 usable bits (bit 0 to bit 53).  The EventBits_t type\r\n * is used to store event bits within an event group.\r\n *\r\n * @param pxEventGroupBuffer pxEventGroupBuffer must point to a variable of type\r\n * StaticEventGroup_t, which will be then be used to hold the event group's data\r\n * structures, removing the need for the memory to be allocated dynamically.\r\n *\r\n * @return If the event group was created then a handle to the event group is\r\n * returned.  If pxEventGroupBuffer was NULL then NULL is returned.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n *  // StaticEventGroup_t is a publicly accessible structure that has the same\r\n *  // size and alignment requirements as the real event group structure.  It is\r\n *  // provided as a mechanism for applications to know the size of the event\r\n *  // group (which is dependent on the architecture and configuration file\r\n *  // settings) without breaking the strict data hiding policy by exposing the\r\n *  // real event group internals.  This StaticEventGroup_t variable is passed\r\n *  // into the xSemaphoreCreateEventGroupStatic() function and is used to store\r\n *  // the event group's data structures\r\n *  StaticEventGroup_t xEventGroupBuffer;\r\n *\r\n *  // Create the event group without dynamically allocating any memory.\r\n *  xEventGroup = xEventGroupCreateStatic( &xEventGroupBuffer );\r\n * @endcode\r\n */\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n    EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * event_groups.h\r\n * @code{c}\r\n *  EventBits_t xEventGroupWaitBits(    EventGroupHandle_t xEventGroup,\r\n *                                      const EventBits_t uxBitsToWaitFor,\r\n *                                      const BaseType_t xClearOnExit,\r\n *                                      const BaseType_t xWaitForAllBits,\r\n *                                      const TickType_t xTicksToWait );\r\n * @endcode\r\n *\r\n * [Potentially] block to wait for one or more bits to be set within a\r\n * previously created event group.\r\n *\r\n * This function cannot be called from an interrupt.\r\n *\r\n * @param xEventGroup The event group in which the bits are being tested.  The\r\n * event group must have previously been created using a call to\r\n * xEventGroupCreate().\r\n *\r\n * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test\r\n * inside the event group.  For example, to wait for bit 0 and/or bit 2 set\r\n * uxBitsToWaitFor to 0x05.  To wait for bits 0 and/or bit 1 and/or bit 2 set\r\n * uxBitsToWaitFor to 0x07.  Etc.\r\n *\r\n * @param xClearOnExit If xClearOnExit is set to pdTRUE then any bits within\r\n * uxBitsToWaitFor that are set within the event group will be cleared before\r\n * xEventGroupWaitBits() returns if the wait condition was met (if the function\r\n * returns for a reason other than a timeout).  If xClearOnExit is set to\r\n * pdFALSE then the bits set in the event group are not altered when the call to\r\n * xEventGroupWaitBits() returns.\r\n *\r\n * @param xWaitForAllBits If xWaitForAllBits is set to pdTRUE then\r\n * xEventGroupWaitBits() will return when either all the bits in uxBitsToWaitFor\r\n * are set or the specified block time expires.  If xWaitForAllBits is set to\r\n * pdFALSE then xEventGroupWaitBits() will return when any one of the bits set\r\n * in uxBitsToWaitFor is set or the specified block time expires.  The block\r\n * time is specified by the xTicksToWait parameter.\r\n *\r\n * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait\r\n * for one/all (depending on the xWaitForAllBits value) of the bits specified by\r\n * uxBitsToWaitFor to become set. A value of portMAX_DELAY can be used to block\r\n * indefinitely (provided INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h).\r\n *\r\n * @return The value of the event group at the time either the bits being waited\r\n * for became set, or the block time expired.  Test the return value to know\r\n * which bits were set.  If xEventGroupWaitBits() returned because its timeout\r\n * expired then not all the bits being waited for will be set.  If\r\n * xEventGroupWaitBits() returned because the bits it was waiting for were set\r\n * then the returned value is the event group value before any bits were\r\n * automatically cleared in the case that xClearOnExit parameter was set to\r\n * pdTRUE.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * #define BIT_0 ( 1 << 0 )\r\n * #define BIT_4 ( 1 << 4 )\r\n *\r\n * void aFunction( EventGroupHandle_t xEventGroup )\r\n * {\r\n * EventBits_t uxBits;\r\n * const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;\r\n *\r\n *      // Wait a maximum of 100ms for either bit 0 or bit 4 to be set within\r\n *      // the event group.  Clear the bits before exiting.\r\n *      uxBits = xEventGroupWaitBits(\r\n *                  xEventGroup,    // The event group being tested.\r\n *                  BIT_0 | BIT_4,  // The bits within the event group to wait for.\r\n *                  pdTRUE,         // BIT_0 and BIT_4 should be cleared before returning.\r\n *                  pdFALSE,        // Don't wait for both bits, either bit will do.\r\n *                  xTicksToWait ); // Wait a maximum of 100ms for either bit to be set.\r\n *\r\n *      if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )\r\n *      {\r\n *          // xEventGroupWaitBits() returned because both bits were set.\r\n *      }\r\n *      else if( ( uxBits & BIT_0 ) != 0 )\r\n *      {\r\n *          // xEventGroupWaitBits() returned because just BIT_0 was set.\r\n *      }\r\n *      else if( ( uxBits & BIT_4 ) != 0 )\r\n *      {\r\n *          // xEventGroupWaitBits() returned because just BIT_4 was set.\r\n *      }\r\n *      else\r\n *      {\r\n *          // xEventGroupWaitBits() returned because xTicksToWait ticks passed\r\n *          // without either BIT_0 or BIT_4 becoming set.\r\n *      }\r\n * }\r\n * @endcode\r\n * \\defgroup xEventGroupWaitBits xEventGroupWaitBits\r\n * \\ingroup EventGroup\r\n */\r\nEventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,\r\n                                 const EventBits_t uxBitsToWaitFor,\r\n                                 const BaseType_t xClearOnExit,\r\n                                 const BaseType_t xWaitForAllBits,\r\n                                 TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * event_groups.h\r\n * @code{c}\r\n *  EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear );\r\n * @endcode\r\n *\r\n * Clear bits within an event group.  This function cannot be called from an\r\n * interrupt.\r\n *\r\n * @param xEventGroup The event group in which the bits are to be cleared.\r\n *\r\n * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear\r\n * in the event group.  For example, to clear bit 3 only, set uxBitsToClear to\r\n * 0x08.  To clear bit 3 and bit 0 set uxBitsToClear to 0x09.\r\n *\r\n * @return The value of the event group before the specified bits were cleared.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * #define BIT_0 ( 1 << 0 )\r\n * #define BIT_4 ( 1 << 4 )\r\n *\r\n * void aFunction( EventGroupHandle_t xEventGroup )\r\n * {\r\n * EventBits_t uxBits;\r\n *\r\n *      // Clear bit 0 and bit 4 in xEventGroup.\r\n *      uxBits = xEventGroupClearBits(\r\n *                              xEventGroup,    // The event group being updated.\r\n *                              BIT_0 | BIT_4 );// The bits being cleared.\r\n *\r\n *      if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )\r\n *      {\r\n *          // Both bit 0 and bit 4 were set before xEventGroupClearBits() was\r\n *          // called.  Both will now be clear (not set).\r\n *      }\r\n *      else if( ( uxBits & BIT_0 ) != 0 )\r\n *      {\r\n *          // Bit 0 was set before xEventGroupClearBits() was called.  It will\r\n *          // now be clear.\r\n *      }\r\n *      else if( ( uxBits & BIT_4 ) != 0 )\r\n *      {\r\n *          // Bit 4 was set before xEventGroupClearBits() was called.  It will\r\n *          // now be clear.\r\n *      }\r\n *      else\r\n *      {\r\n *          // Neither bit 0 nor bit 4 were set in the first place.\r\n *      }\r\n * }\r\n * @endcode\r\n * \\defgroup xEventGroupClearBits xEventGroupClearBits\r\n * \\ingroup EventGroup\r\n */\r\nEventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup,\r\n                                  const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * event_groups.h\r\n * @code{c}\r\n *  BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );\r\n * @endcode\r\n *\r\n * A version of xEventGroupClearBits() that can be called from an interrupt.\r\n *\r\n * Setting bits in an event group is not a deterministic operation because there\r\n * are an unknown number of tasks that may be waiting for the bit or bits being\r\n * set.  FreeRTOS does not allow nondeterministic operations to be performed\r\n * while interrupts are disabled, so protects event groups that are accessed\r\n * from tasks by suspending the scheduler rather than disabling interrupts.  As\r\n * a result event groups cannot be accessed directly from an interrupt service\r\n * routine.  Therefore xEventGroupClearBitsFromISR() sends a message to the\r\n * timer task to have the clear operation performed in the context of the timer\r\n * task.\r\n *\r\n * @note If this function returns pdPASS then the timer task is ready to run\r\n * and a portYIELD_FROM_ISR(pdTRUE) should be executed to perform the needed\r\n * clear on the event group.  This behavior is different from\r\n * xEventGroupSetBitsFromISR because the parameter xHigherPriorityTaskWoken is\r\n * not present.\r\n *\r\n * @param xEventGroup The event group in which the bits are to be cleared.\r\n *\r\n * @param uxBitsToClear A bitwise value that indicates the bit or bits to clear.\r\n * For example, to clear bit 3 only, set uxBitsToClear to 0x08.  To clear bit 3\r\n * and bit 0 set uxBitsToClear to 0x09.\r\n *\r\n * @return If the request to execute the function was posted successfully then\r\n * pdPASS is returned, otherwise pdFALSE is returned.  pdFALSE will be returned\r\n * if the timer service queue was full.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * #define BIT_0 ( 1 << 0 )\r\n * #define BIT_4 ( 1 << 4 )\r\n *\r\n * // An event group which it is assumed has already been created by a call to\r\n * // xEventGroupCreate().\r\n * EventGroupHandle_t xEventGroup;\r\n *\r\n * void anInterruptHandler( void )\r\n * {\r\n *      // Clear bit 0 and bit 4 in xEventGroup.\r\n *      xResult = xEventGroupClearBitsFromISR(\r\n *                          xEventGroup,     // The event group being updated.\r\n *                          BIT_0 | BIT_4 ); // The bits being set.\r\n *\r\n *      if( xResult == pdPASS )\r\n *      {\r\n *          // The message was posted successfully.\r\n *          portYIELD_FROM_ISR(pdTRUE);\r\n *      }\r\n * }\r\n * @endcode\r\n * \\defgroup xEventGroupClearBitsFromISR xEventGroupClearBitsFromISR\r\n * \\ingroup EventGroup\r\n */\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n    BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup,\r\n                                            const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION;\r\n#else\r\n    #define xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ) \\\r\n    xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) ( xEventGroup ), ( uint32_t ) ( uxBitsToClear ), NULL )\r\n#endif\r\n\r\n/**\r\n * event_groups.h\r\n * @code{c}\r\n *  EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );\r\n * @endcode\r\n *\r\n * Set bits within an event group.\r\n * This function cannot be called from an interrupt.  xEventGroupSetBitsFromISR()\r\n * is a version that can be called from an interrupt.\r\n *\r\n * Setting bits in an event group will automatically unblock tasks that are\r\n * blocked waiting for the bits.\r\n *\r\n * @param xEventGroup The event group in which the bits are to be set.\r\n *\r\n * @param uxBitsToSet A bitwise value that indicates the bit or bits to set.\r\n * For example, to set bit 3 only, set uxBitsToSet to 0x08.  To set bit 3\r\n * and bit 0 set uxBitsToSet to 0x09.\r\n *\r\n * @return The value of the event group at the time the call to\r\n * xEventGroupSetBits() returns.  There are two reasons why the returned value\r\n * might have the bits specified by the uxBitsToSet parameter cleared.  First,\r\n * if setting a bit results in a task that was waiting for the bit leaving the\r\n * blocked state then it is possible the bit will be cleared automatically\r\n * (see the xClearBitOnExit parameter of xEventGroupWaitBits()).  Second, any\r\n * unblocked (or otherwise Ready state) task that has a priority above that of\r\n * the task that called xEventGroupSetBits() will execute and may change the\r\n * event group value before the call to xEventGroupSetBits() returns.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * #define BIT_0 ( 1 << 0 )\r\n * #define BIT_4 ( 1 << 4 )\r\n *\r\n * void aFunction( EventGroupHandle_t xEventGroup )\r\n * {\r\n * EventBits_t uxBits;\r\n *\r\n *      // Set bit 0 and bit 4 in xEventGroup.\r\n *      uxBits = xEventGroupSetBits(\r\n *                          xEventGroup,    // The event group being updated.\r\n *                          BIT_0 | BIT_4 );// The bits being set.\r\n *\r\n *      if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )\r\n *      {\r\n *          // Both bit 0 and bit 4 remained set when the function returned.\r\n *      }\r\n *      else if( ( uxBits & BIT_0 ) != 0 )\r\n *      {\r\n *          // Bit 0 remained set when the function returned, but bit 4 was\r\n *          // cleared.  It might be that bit 4 was cleared automatically as a\r\n *          // task that was waiting for bit 4 was removed from the Blocked\r\n *          // state.\r\n *      }\r\n *      else if( ( uxBits & BIT_4 ) != 0 )\r\n *      {\r\n *          // Bit 4 remained set when the function returned, but bit 0 was\r\n *          // cleared.  It might be that bit 0 was cleared automatically as a\r\n *          // task that was waiting for bit 0 was removed from the Blocked\r\n *          // state.\r\n *      }\r\n *      else\r\n *      {\r\n *          // Neither bit 0 nor bit 4 remained set.  It might be that a task\r\n *          // was waiting for both of the bits to be set, and the bits were\r\n *          // cleared as the task left the Blocked state.\r\n *      }\r\n * }\r\n * @endcode\r\n * \\defgroup xEventGroupSetBits xEventGroupSetBits\r\n * \\ingroup EventGroup\r\n */\r\nEventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,\r\n                                const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * event_groups.h\r\n * @code{c}\r\n *  BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken );\r\n * @endcode\r\n *\r\n * A version of xEventGroupSetBits() that can be called from an interrupt.\r\n *\r\n * Setting bits in an event group is not a deterministic operation because there\r\n * are an unknown number of tasks that may be waiting for the bit or bits being\r\n * set.  FreeRTOS does not allow nondeterministic operations to be performed in\r\n * interrupts or from critical sections.  Therefore xEventGroupSetBitsFromISR()\r\n * sends a message to the timer task to have the set operation performed in the\r\n * context of the timer task - where a scheduler lock is used in place of a\r\n * critical section.\r\n *\r\n * @param xEventGroup The event group in which the bits are to be set.\r\n *\r\n * @param uxBitsToSet A bitwise value that indicates the bit or bits to set.\r\n * For example, to set bit 3 only, set uxBitsToSet to 0x08.  To set bit 3\r\n * and bit 0 set uxBitsToSet to 0x09.\r\n *\r\n * @param pxHigherPriorityTaskWoken As mentioned above, calling this function\r\n * will result in a message being sent to the timer daemon task.  If the\r\n * priority of the timer daemon task is higher than the priority of the\r\n * currently running task (the task the interrupt interrupted) then\r\n * *pxHigherPriorityTaskWoken will be set to pdTRUE by\r\n * xEventGroupSetBitsFromISR(), indicating that a context switch should be\r\n * requested before the interrupt exits.  For that reason\r\n * *pxHigherPriorityTaskWoken must be initialised to pdFALSE.  See the\r\n * example code below.\r\n *\r\n * @return If the request to execute the function was posted successfully then\r\n * pdPASS is returned, otherwise pdFALSE is returned.  pdFALSE will be returned\r\n * if the timer service queue was full.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * #define BIT_0 ( 1 << 0 )\r\n * #define BIT_4 ( 1 << 4 )\r\n *\r\n * // An event group which it is assumed has already been created by a call to\r\n * // xEventGroupCreate().\r\n * EventGroupHandle_t xEventGroup;\r\n *\r\n * void anInterruptHandler( void )\r\n * {\r\n * BaseType_t xHigherPriorityTaskWoken, xResult;\r\n *\r\n *      // xHigherPriorityTaskWoken must be initialised to pdFALSE.\r\n *      xHigherPriorityTaskWoken = pdFALSE;\r\n *\r\n *      // Set bit 0 and bit 4 in xEventGroup.\r\n *      xResult = xEventGroupSetBitsFromISR(\r\n *                          xEventGroup,    // The event group being updated.\r\n *                          BIT_0 | BIT_4   // The bits being set.\r\n *                          &xHigherPriorityTaskWoken );\r\n *\r\n *      // Was the message posted successfully?\r\n *      if( xResult == pdPASS )\r\n *      {\r\n *          // If xHigherPriorityTaskWoken is now set to pdTRUE then a context\r\n *          // switch should be requested.  The macro used is port specific and\r\n *          // will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() -\r\n *          // refer to the documentation page for the port being used.\r\n *          portYIELD_FROM_ISR( xHigherPriorityTaskWoken );\r\n *      }\r\n * }\r\n * @endcode\r\n * \\defgroup xEventGroupSetBitsFromISR xEventGroupSetBitsFromISR\r\n * \\ingroup EventGroup\r\n */\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n    BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup,\r\n                                          const EventBits_t uxBitsToSet,\r\n                                          BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r\n#else\r\n    #define xEventGroupSetBitsFromISR( xEventGroup, uxBitsToSet, pxHigherPriorityTaskWoken ) \\\r\n    xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) ( xEventGroup ), ( uint32_t ) ( uxBitsToSet ), ( pxHigherPriorityTaskWoken ) )\r\n#endif\r\n\r\n/**\r\n * event_groups.h\r\n * @code{c}\r\n *  EventBits_t xEventGroupSync(    EventGroupHandle_t xEventGroup,\r\n *                                  const EventBits_t uxBitsToSet,\r\n *                                  const EventBits_t uxBitsToWaitFor,\r\n *                                  TickType_t xTicksToWait );\r\n * @endcode\r\n *\r\n * Atomically set bits within an event group, then wait for a combination of\r\n * bits to be set within the same event group.  This functionality is typically\r\n * used to synchronise multiple tasks, where each task has to wait for the other\r\n * tasks to reach a synchronisation point before proceeding.\r\n *\r\n * This function cannot be used from an interrupt.\r\n *\r\n * The function will return before its block time expires if the bits specified\r\n * by the uxBitsToWait parameter are set, or become set within that time.  In\r\n * this case all the bits specified by uxBitsToWait will be automatically\r\n * cleared before the function returns.\r\n *\r\n * @param xEventGroup The event group in which the bits are being tested.  The\r\n * event group must have previously been created using a call to\r\n * xEventGroupCreate().\r\n *\r\n * @param uxBitsToSet The bits to set in the event group before determining\r\n * if, and possibly waiting for, all the bits specified by the uxBitsToWait\r\n * parameter are set.\r\n *\r\n * @param uxBitsToWaitFor A bitwise value that indicates the bit or bits to test\r\n * inside the event group.  For example, to wait for bit 0 and bit 2 set\r\n * uxBitsToWaitFor to 0x05.  To wait for bits 0 and bit 1 and bit 2 set\r\n * uxBitsToWaitFor to 0x07.  Etc.\r\n *\r\n * @param xTicksToWait The maximum amount of time (specified in 'ticks') to wait\r\n * for all of the bits specified by uxBitsToWaitFor to become set.\r\n *\r\n * @return The value of the event group at the time either the bits being waited\r\n * for became set, or the block time expired.  Test the return value to know\r\n * which bits were set.  If xEventGroupSync() returned because its timeout\r\n * expired then not all the bits being waited for will be set.  If\r\n * xEventGroupSync() returned because all the bits it was waiting for were\r\n * set then the returned value is the event group value before any bits were\r\n * automatically cleared.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * // Bits used by the three tasks.\r\n * #define TASK_0_BIT     ( 1 << 0 )\r\n * #define TASK_1_BIT     ( 1 << 1 )\r\n * #define TASK_2_BIT     ( 1 << 2 )\r\n *\r\n * #define ALL_SYNC_BITS ( TASK_0_BIT | TASK_1_BIT | TASK_2_BIT )\r\n *\r\n * // Use an event group to synchronise three tasks.  It is assumed this event\r\n * // group has already been created elsewhere.\r\n * EventGroupHandle_t xEventBits;\r\n *\r\n * void vTask0( void *pvParameters )\r\n * {\r\n * EventBits_t uxReturn;\r\n * TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;\r\n *\r\n *   for( ;; )\r\n *   {\r\n *      // Perform task functionality here.\r\n *\r\n *      // Set bit 0 in the event flag to note this task has reached the\r\n *      // sync point.  The other two tasks will set the other two bits defined\r\n *      // by ALL_SYNC_BITS.  All three tasks have reached the synchronisation\r\n *      // point when all the ALL_SYNC_BITS are set.  Wait a maximum of 100ms\r\n *      // for this to happen.\r\n *      uxReturn = xEventGroupSync( xEventBits, TASK_0_BIT, ALL_SYNC_BITS, xTicksToWait );\r\n *\r\n *      if( ( uxReturn & ALL_SYNC_BITS ) == ALL_SYNC_BITS )\r\n *      {\r\n *          // All three tasks reached the synchronisation point before the call\r\n *          // to xEventGroupSync() timed out.\r\n *      }\r\n *  }\r\n * }\r\n *\r\n * void vTask1( void *pvParameters )\r\n * {\r\n *   for( ;; )\r\n *   {\r\n *      // Perform task functionality here.\r\n *\r\n *      // Set bit 1 in the event flag to note this task has reached the\r\n *      // synchronisation point.  The other two tasks will set the other two\r\n *      // bits defined by ALL_SYNC_BITS.  All three tasks have reached the\r\n *      // synchronisation point when all the ALL_SYNC_BITS are set.  Wait\r\n *      // indefinitely for this to happen.\r\n *      xEventGroupSync( xEventBits, TASK_1_BIT, ALL_SYNC_BITS, portMAX_DELAY );\r\n *\r\n *      // xEventGroupSync() was called with an indefinite block time, so\r\n *      // this task will only reach here if the synchronisation was made by all\r\n *      // three tasks, so there is no need to test the return value.\r\n *   }\r\n * }\r\n *\r\n * void vTask2( void *pvParameters )\r\n * {\r\n *   for( ;; )\r\n *   {\r\n *      // Perform task functionality here.\r\n *\r\n *      // Set bit 2 in the event flag to note this task has reached the\r\n *      // synchronisation point.  The other two tasks will set the other two\r\n *      // bits defined by ALL_SYNC_BITS.  All three tasks have reached the\r\n *      // synchronisation point when all the ALL_SYNC_BITS are set.  Wait\r\n *      // indefinitely for this to happen.\r\n *      xEventGroupSync( xEventBits, TASK_2_BIT, ALL_SYNC_BITS, portMAX_DELAY );\r\n *\r\n *      // xEventGroupSync() was called with an indefinite block time, so\r\n *      // this task will only reach here if the synchronisation was made by all\r\n *      // three tasks, so there is no need to test the return value.\r\n *  }\r\n * }\r\n *\r\n * @endcode\r\n * \\defgroup xEventGroupSync xEventGroupSync\r\n * \\ingroup EventGroup\r\n */\r\nEventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup,\r\n                             const EventBits_t uxBitsToSet,\r\n                             const EventBits_t uxBitsToWaitFor,\r\n                             TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r\n\r\n\r\n/**\r\n * event_groups.h\r\n * @code{c}\r\n *  EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup );\r\n * @endcode\r\n *\r\n * Returns the current value of the bits in an event group.  This function\r\n * cannot be used from an interrupt.\r\n *\r\n * @param xEventGroup The event group being queried.\r\n *\r\n * @return The event group bits at the time xEventGroupGetBits() was called.\r\n *\r\n * \\defgroup xEventGroupGetBits xEventGroupGetBits\r\n * \\ingroup EventGroup\r\n */\r\n#define xEventGroupGetBits( xEventGroup )    xEventGroupClearBits( ( xEventGroup ), 0 )\r\n\r\n/**\r\n * event_groups.h\r\n * @code{c}\r\n *  EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup );\r\n * @endcode\r\n *\r\n * A version of xEventGroupGetBits() that can be called from an ISR.\r\n *\r\n * @param xEventGroup The event group being queried.\r\n *\r\n * @return The event group bits at the time xEventGroupGetBitsFromISR() was called.\r\n *\r\n * \\defgroup xEventGroupGetBitsFromISR xEventGroupGetBitsFromISR\r\n * \\ingroup EventGroup\r\n */\r\nEventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * event_groups.h\r\n * @code{c}\r\n *  void xEventGroupDelete( EventGroupHandle_t xEventGroup );\r\n * @endcode\r\n *\r\n * Delete an event group that was previously created by a call to\r\n * xEventGroupCreate().  Tasks that are blocked on the event group will be\r\n * unblocked and obtain 0 as the event group's value.\r\n *\r\n * @param xEventGroup The event group being deleted.\r\n */\r\nvoid vEventGroupDelete( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * event_groups.h\r\n * @code{c}\r\n *  BaseType_t xEventGroupGetStaticBuffer( EventGroupHandle_t xEventGroup,\r\n *                                         StaticEventGroup_t ** ppxEventGroupBuffer );\r\n * @endcode\r\n *\r\n * Retrieve a pointer to a statically created event groups's data structure\r\n * buffer. It is the same buffer that is supplied at the time of creation.\r\n *\r\n * @param xEventGroup The event group for which to retrieve the buffer.\r\n *\r\n * @param ppxEventGroupBuffer Used to return a pointer to the event groups's\r\n * data structure buffer.\r\n *\r\n * @return pdTRUE if the buffer was retrieved, pdFALSE otherwise.\r\n */\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n    BaseType_t xEventGroupGetStaticBuffer( EventGroupHandle_t xEventGroup,\r\n                                           StaticEventGroup_t ** ppxEventGroupBuffer ) PRIVILEGED_FUNCTION;\r\n#endif /* configSUPPORT_STATIC_ALLOCATION */\r\n\r\n/* For internal use only. */\r\nvoid vEventGroupSetBitsCallback( void * pvEventGroup,\r\n                                 uint32_t ulBitsToSet ) PRIVILEGED_FUNCTION;\r\nvoid vEventGroupClearBitsCallback( void * pvEventGroup,\r\n                                   uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION;\r\n\r\n\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n    UBaseType_t uxEventGroupGetNumber( void * xEventGroup ) PRIVILEGED_FUNCTION;\r\n    void vEventGroupSetNumber( void * xEventGroup,\r\n                               UBaseType_t uxEventGroupNumber ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    }\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n#endif /* EVENT_GROUPS_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/freertos_tasks_c_additions.h",
    "content": "/*\r\n * Copyright 2017-2019, 2024 NXP\r\n * All rights reserved.\r\n *\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n/* freertos_tasks_c_additions.h Rev. 1.4 */\r\n#ifndef FREERTOS_TASKS_C_ADDITIONS_H\r\n#define FREERTOS_TASKS_C_ADDITIONS_H\r\n\r\n#include <stdint.h>\r\n\r\n#if (configUSE_TRACE_FACILITY == 0)\r\n#error \"configUSE_TRACE_FACILITY must be enabled\"\r\n#endif\r\n\r\n#define FREERTOS_DEBUG_CONFIG_MAJOR_VERSION 1\r\n#define FREERTOS_DEBUG_CONFIG_MINOR_VERSION 4\r\n\r\n/* NOTE!!\r\n * Default to a FreeRTOS version which didn't include these macros. FreeRTOS\r\n * v7.5.3 is used here.\r\n */\r\n#ifndef tskKERNEL_VERSION_BUILD\r\n#define tskKERNEL_VERSION_BUILD 3\r\n#endif\r\n#ifndef tskKERNEL_VERSION_MINOR\r\n#define tskKERNEL_VERSION_MINOR 5\r\n#endif\r\n#ifndef tskKERNEL_VERSION_MAJOR\r\n#define tskKERNEL_VERSION_MAJOR 7\r\n#endif\r\n\r\n/* NOTE!!\r\n * The configFRTOS_MEMORY_SCHEME macro describes the heap scheme using a value\r\n * 1 - 5 which corresponds to the following schemes:\r\n *\r\n * heap_1 - the very simplest, does not permit memory to be freed\r\n * heap_2 - permits memory to be freed, but not does coalescence adjacent free\r\n *          blocks.\r\n * heap_3 - simply wraps the standard malloc() and free() for thread safety\r\n * heap_4 - coalesces adjacent free blocks to avoid fragmentation. Includes\r\n *          absolute address placement option\r\n * heap_5 - as per heap_4, with the ability to span the heap across\r\n *          multiple nonOadjacent memory areas\r\n */\r\n#ifndef configFRTOS_MEMORY_SCHEME\r\n#define configFRTOS_MEMORY_SCHEME 3 /* thread safe malloc */\r\n#endif\r\n\r\n#if ((configFRTOS_MEMORY_SCHEME > 5) || (configFRTOS_MEMORY_SCHEME < 1))\r\n#error \"Invalid configFRTOS_MEMORY_SCHEME setting!\"\r\n#endif\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\nextern const uint8_t FreeRTOSDebugConfig[];\r\n\r\n/* NOTES!!\r\n * IAR documentation is confusing. It suggests the data must be statically\r\n * linked, and the #pragma placed immediately before the symbol definition.\r\n * The IAR supplied examples violate both \"rules\", so this is a best guess.\r\n */\r\n\r\n#if (tskKERNEL_VERSION_MAJOR >= 11) || ((tskKERNEL_VERSION_MAJOR >= 10) && (tskKERNEL_VERSION_MINOR >= 2))\r\n#if defined(__GNUC__)\r\nchar *const portArch_Name __attribute__((section(\".rodata\"))) = portARCH_NAME;\r\n#elif defined(__CC_ARM) || defined(__ARMCC_VERSION)\r\nchar *const portArch_Name __attribute__((used)) = portARCH_NAME;\r\n#elif defined(__IAR_SYSTEMS_ICC__)\r\nchar *const portArch_Name = portARCH_NAME;\r\n#pragma required=portArch_Name\r\n#endif\r\n#else\r\nchar *const portArch_Name = NULL;\r\n#endif\t// tskKERNEL_VERSION_MAJOR\r\n\r\n#if defined(__GNUC__)\r\nconst uint8_t FreeRTOSDebugConfig[] __attribute__((section(\".rodata\"))) =\r\n#elif defined(__CC_ARM) || defined(__ARMCC_VERSION)\r\nconst uint8_t FreeRTOSDebugConfig[] __attribute__((used)) =\r\n#elif defined(__IAR_SYSTEMS_ICC__)\r\n#pragma required=FreeRTOSDebugConfig\r\nconst uint8_t FreeRTOSDebugConfig[] =\r\n#endif\r\n{\r\n    FREERTOS_DEBUG_CONFIG_MAJOR_VERSION,\r\n    FREERTOS_DEBUG_CONFIG_MINOR_VERSION,\r\n    tskKERNEL_VERSION_MAJOR,\r\n    tskKERNEL_VERSION_MINOR,\r\n    tskKERNEL_VERSION_BUILD,\r\n    configFRTOS_MEMORY_SCHEME,\r\n    (uint8_t)offsetof(struct tskTaskControlBlock, pxTopOfStack),\r\n#if (tskKERNEL_VERSION_MAJOR > 8)\r\n    (uint8_t)offsetof(struct tskTaskControlBlock, xStateListItem),\r\n#else\r\n    (uint8_t)offsetof(struct tskTaskControlBlock, xGenericListItem),\r\n#endif\r\n    (uint8_t)offsetof(struct tskTaskControlBlock, xEventListItem),\r\n    (uint8_t)offsetof(struct tskTaskControlBlock, pxStack),\r\n    (uint8_t)offsetof(struct tskTaskControlBlock, pcTaskName),\r\n    (uint8_t)offsetof(struct tskTaskControlBlock, uxTCBNumber),\r\n    (uint8_t)offsetof(struct tskTaskControlBlock, uxTaskNumber),\r\n    configMAX_TASK_NAME_LEN,\r\n    configMAX_PRIORITIES,\r\n    configENABLE_MPU,\r\n    configENABLE_FPU,\r\n    configENABLE_TRUSTZONE,\r\n    configRUN_FREERTOS_SECURE_ONLY,\r\n    configNUMBER_OF_CORES,\r\n#if (configNUMBER_OF_CORES > 1)\r\n    (uint8_t)sizeof(struct tskTaskControlBlock),\r\n    (uint8_t)offsetof(struct tskTaskControlBlock, xTaskRunState),\r\n    0, 0,       // Padding\r\n#else\r\n    0, 0, 0, 0, // Padding\r\n#endif // configNUMBER_OF_CORES > 1\r\n};\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif // FREERTOS_TASKS_C_ADDITIONS_H\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/list.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n/*\r\n * This is the list implementation used by the scheduler.  While it is tailored\r\n * heavily for the schedulers needs, it is also available for use by\r\n * application code.\r\n *\r\n * list_ts can only store pointers to list_item_ts.  Each ListItem_t contains a\r\n * numeric value (xItemValue).  Most of the time the lists are sorted in\r\n * ascending item value order.\r\n *\r\n * Lists are created already containing one list item.  The value of this\r\n * item is the maximum possible that can be stored, it is therefore always at\r\n * the end of the list and acts as a marker.  The list member pxHead always\r\n * points to this marker - even though it is at the tail of the list.  This\r\n * is because the tail contains a wrap back pointer to the true head of\r\n * the list.\r\n *\r\n * In addition to it's value, each list item contains a pointer to the next\r\n * item in the list (pxNext), a pointer to the list it is in (pxContainer)\r\n * and a pointer to back to the object that contains it.  These later two\r\n * pointers are included for efficiency of list manipulation.  There is\r\n * effectively a two way link between the object containing the list item and\r\n * the list item itself.\r\n *\r\n *\r\n * \\page ListIntroduction List Implementation\r\n * \\ingroup FreeRTOSIntro\r\n */\r\n\r\n\r\n#ifndef LIST_H\r\n#define LIST_H\r\n\r\n#ifndef INC_FREERTOS_H\r\n    #error \"FreeRTOS.h must be included before list.h\"\r\n#endif\r\n\r\n/*\r\n * The list structure members are modified from within interrupts, and therefore\r\n * by rights should be declared volatile.  However, they are only modified in a\r\n * functionally atomic way (within critical sections of with the scheduler\r\n * suspended) and are either passed by reference into a function or indexed via\r\n * a volatile variable.  Therefore, in all use cases tested so far, the volatile\r\n * qualifier can be omitted in order to provide a moderate performance\r\n * improvement without adversely affecting functional behaviour.  The assembly\r\n * instructions generated by the IAR, ARM and GCC compilers when the respective\r\n * compiler's options were set for maximum optimisation has been inspected and\r\n * deemed to be as intended.  That said, as compiler technology advances, and\r\n * especially if aggressive cross module optimisation is used (a use case that\r\n * has not been exercised to any great extend) then it is feasible that the\r\n * volatile qualifier will be needed for correct optimisation.  It is expected\r\n * that a compiler removing essential code because, without the volatile\r\n * qualifier on the list structure members and with aggressive cross module\r\n * optimisation, the compiler deemed the code unnecessary will result in\r\n * complete and obvious failure of the scheduler.  If this is ever experienced\r\n * then the volatile qualifier can be inserted in the relevant places within the\r\n * list structures by simply defining configLIST_VOLATILE to volatile in\r\n * FreeRTOSConfig.h (as per the example at the bottom of this comment block).\r\n * If configLIST_VOLATILE is not defined then the preprocessor directives below\r\n * will simply #define configLIST_VOLATILE away completely.\r\n *\r\n * To use volatile list structure members then add the following line to\r\n * FreeRTOSConfig.h (without the quotes):\r\n * \"#define configLIST_VOLATILE volatile\"\r\n */\r\n#ifndef configLIST_VOLATILE\r\n    #define configLIST_VOLATILE\r\n#endif /* configSUPPORT_CROSS_MODULE_OPTIMISATION */\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    extern \"C\" {\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n/* Macros that can be used to place known values within the list structures,\r\n * then check that the known values do not get corrupted during the execution of\r\n * the application.   These may catch the list data structures being overwritten in\r\n * memory.  They will not catch data errors caused by incorrect configuration or\r\n * use of FreeRTOS.*/\r\n#if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 )\r\n    /* Define the macros to do nothing. */\r\n    #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE\r\n    #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE\r\n    #define listFIRST_LIST_INTEGRITY_CHECK_VALUE\r\n    #define listSECOND_LIST_INTEGRITY_CHECK_VALUE\r\n    #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem )\r\n    #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem )\r\n    #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList )\r\n    #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList )\r\n    #define listTEST_LIST_ITEM_INTEGRITY( pxItem )\r\n    #define listTEST_LIST_INTEGRITY( pxList )\r\n#else /* if ( configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES == 0 ) */\r\n    /* Define macros that add new members into the list structures. */\r\n    #define listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE     TickType_t xListItemIntegrityValue1;\r\n    #define listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE    TickType_t xListItemIntegrityValue2;\r\n    #define listFIRST_LIST_INTEGRITY_CHECK_VALUE          TickType_t xListIntegrityValue1;\r\n    #define listSECOND_LIST_INTEGRITY_CHECK_VALUE         TickType_t xListIntegrityValue2;\r\n\r\n/* Define macros that set the new structure members to known values. */\r\n    #define listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem )     ( pxItem )->xListItemIntegrityValue1 = pdINTEGRITY_CHECK_VALUE\r\n    #define listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem )    ( pxItem )->xListItemIntegrityValue2 = pdINTEGRITY_CHECK_VALUE\r\n    #define listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList )              ( pxList )->xListIntegrityValue1 = pdINTEGRITY_CHECK_VALUE\r\n    #define listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList )              ( pxList )->xListIntegrityValue2 = pdINTEGRITY_CHECK_VALUE\r\n\r\n/* Define macros that will assert if one of the structure members does not\r\n * contain its expected value. */\r\n    #define listTEST_LIST_ITEM_INTEGRITY( pxItem )                      configASSERT( ( ( pxItem )->xListItemIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxItem )->xListItemIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) )\r\n    #define listTEST_LIST_INTEGRITY( pxList )                           configASSERT( ( ( pxList )->xListIntegrityValue1 == pdINTEGRITY_CHECK_VALUE ) && ( ( pxList )->xListIntegrityValue2 == pdINTEGRITY_CHECK_VALUE ) )\r\n#endif /* configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES */\r\n\r\n\r\n/*\r\n * Definition of the only type of object that a list can contain.\r\n */\r\nstruct xLIST;\r\nstruct xLIST_ITEM\r\n{\r\n    listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE           /**< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */\r\n    configLIST_VOLATILE TickType_t xItemValue;          /**< The value being listed.  In most cases this is used to sort the list in ascending order. */\r\n    struct xLIST_ITEM * configLIST_VOLATILE pxNext;     /**< Pointer to the next ListItem_t in the list. */\r\n    struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; /**< Pointer to the previous ListItem_t in the list. */\r\n    void * pvOwner;                                     /**< Pointer to the object (normally a TCB) that contains the list item.  There is therefore a two way link between the object containing the list item and the list item itself. */\r\n    struct xLIST * configLIST_VOLATILE pxContainer;     /**< Pointer to the list in which this list item is placed (if any). */\r\n    listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE          /**< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */\r\n};\r\ntypedef struct xLIST_ITEM ListItem_t;\r\n\r\n#if ( configUSE_MINI_LIST_ITEM == 1 )\r\n    struct xMINI_LIST_ITEM\r\n    {\r\n        listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /**< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */\r\n        configLIST_VOLATILE TickType_t xItemValue;\r\n        struct xLIST_ITEM * configLIST_VOLATILE pxNext;\r\n        struct xLIST_ITEM * configLIST_VOLATILE pxPrevious;\r\n    };\r\n    typedef struct xMINI_LIST_ITEM MiniListItem_t;\r\n#else\r\n    typedef struct xLIST_ITEM      MiniListItem_t;\r\n#endif\r\n\r\n/*\r\n * Definition of the type of queue used by the scheduler.\r\n */\r\ntypedef struct xLIST\r\n{\r\n    listFIRST_LIST_INTEGRITY_CHECK_VALUE      /**< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */\r\n    volatile UBaseType_t uxNumberOfItems;\r\n    ListItem_t * configLIST_VOLATILE pxIndex; /**< Used to walk through the list.  Points to the last item returned by a call to listGET_OWNER_OF_NEXT_ENTRY (). */\r\n    MiniListItem_t xListEnd;                  /**< List item that contains the maximum possible item value meaning it is always at the end of the list and is therefore used as a marker. */\r\n    listSECOND_LIST_INTEGRITY_CHECK_VALUE     /**< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */\r\n} List_t;\r\n\r\n/*\r\n * Access macro to set the owner of a list item.  The owner of a list item\r\n * is the object (usually a TCB) that contains the list item.\r\n *\r\n * \\page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER\r\n * \\ingroup LinkedList\r\n */\r\n#define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner )    ( ( pxListItem )->pvOwner = ( void * ) ( pxOwner ) )\r\n\r\n/*\r\n * Access macro to get the owner of a list item.  The owner of a list item\r\n * is the object (usually a TCB) that contains the list item.\r\n *\r\n * \\page listGET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER\r\n * \\ingroup LinkedList\r\n */\r\n#define listGET_LIST_ITEM_OWNER( pxListItem )             ( ( pxListItem )->pvOwner )\r\n\r\n/*\r\n * Access macro to set the value of the list item.  In most cases the value is\r\n * used to sort the list in ascending order.\r\n *\r\n * \\page listSET_LIST_ITEM_VALUE listSET_LIST_ITEM_VALUE\r\n * \\ingroup LinkedList\r\n */\r\n#define listSET_LIST_ITEM_VALUE( pxListItem, xValue )     ( ( pxListItem )->xItemValue = ( xValue ) )\r\n\r\n/*\r\n * Access macro to retrieve the value of the list item.  The value can\r\n * represent anything - for example the priority of a task, or the time at\r\n * which a task should be unblocked.\r\n *\r\n * \\page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE\r\n * \\ingroup LinkedList\r\n */\r\n#define listGET_LIST_ITEM_VALUE( pxListItem )             ( ( pxListItem )->xItemValue )\r\n\r\n/*\r\n * Access macro to retrieve the value of the list item at the head of a given\r\n * list.\r\n *\r\n * \\page listGET_LIST_ITEM_VALUE listGET_LIST_ITEM_VALUE\r\n * \\ingroup LinkedList\r\n */\r\n#define listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxList )        ( ( ( pxList )->xListEnd ).pxNext->xItemValue )\r\n\r\n/*\r\n * Return the list item at the head of the list.\r\n *\r\n * \\page listGET_HEAD_ENTRY listGET_HEAD_ENTRY\r\n * \\ingroup LinkedList\r\n */\r\n#define listGET_HEAD_ENTRY( pxList )                      ( ( ( pxList )->xListEnd ).pxNext )\r\n\r\n/*\r\n * Return the next list item.\r\n *\r\n * \\page listGET_NEXT listGET_NEXT\r\n * \\ingroup LinkedList\r\n */\r\n#define listGET_NEXT( pxListItem )                        ( ( pxListItem )->pxNext )\r\n\r\n/*\r\n * Return the list item that marks the end of the list\r\n *\r\n * \\page listGET_END_MARKER listGET_END_MARKER\r\n * \\ingroup LinkedList\r\n */\r\n#define listGET_END_MARKER( pxList )                      ( ( ListItem_t const * ) ( &( ( pxList )->xListEnd ) ) )\r\n\r\n/*\r\n * Access macro to determine if a list contains any items.  The macro will\r\n * only have the value true if the list is empty.\r\n *\r\n * \\page listLIST_IS_EMPTY listLIST_IS_EMPTY\r\n * \\ingroup LinkedList\r\n */\r\n#define listLIST_IS_EMPTY( pxList )                       ( ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) ? pdTRUE : pdFALSE )\r\n\r\n/*\r\n * Access macro to return the number of items in the list.\r\n */\r\n#define listCURRENT_LIST_LENGTH( pxList )                 ( ( pxList )->uxNumberOfItems )\r\n\r\n/*\r\n * Access function to obtain the owner of the next entry in a list.\r\n *\r\n * The list member pxIndex is used to walk through a list.  Calling\r\n * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list\r\n * and returns that entry's pxOwner parameter.  Using multiple calls to this\r\n * function it is therefore possible to move through every item contained in\r\n * a list.\r\n *\r\n * The pxOwner parameter of a list item is a pointer to the object that owns\r\n * the list item.  In the scheduler this is normally a task control block.\r\n * The pxOwner parameter effectively creates a two way link between the list\r\n * item and its owner.\r\n *\r\n * @param pxTCB pxTCB is set to the address of the owner of the next list item.\r\n * @param pxList The list from which the next item owner is to be returned.\r\n *\r\n * \\page listGET_OWNER_OF_NEXT_ENTRY listGET_OWNER_OF_NEXT_ENTRY\r\n * \\ingroup LinkedList\r\n */\r\n#define listGET_OWNER_OF_NEXT_ENTRY( pxTCB, pxList )                                           \\\r\n    do {                                                                                       \\\r\n        List_t * const pxConstList = ( pxList );                                               \\\r\n        /* Increment the index to the next item and return the item, ensuring */               \\\r\n        /* we don't return the marker used at the end of the list.  */                         \\\r\n        ( pxConstList )->pxIndex = ( pxConstList )->pxIndex->pxNext;                           \\\r\n        if( ( void * ) ( pxConstList )->pxIndex == ( void * ) &( ( pxConstList )->xListEnd ) ) \\\r\n        {                                                                                      \\\r\n            ( pxConstList )->pxIndex = ( pxConstList )->xListEnd.pxNext;                       \\\r\n        }                                                                                      \\\r\n        ( pxTCB ) = ( pxConstList )->pxIndex->pvOwner;                                         \\\r\n    } while( 0 )\r\n\r\n/*\r\n * Version of uxListRemove() that does not return a value.  Provided as a slight\r\n * optimisation for xTaskIncrementTick() by being inline.\r\n *\r\n * Remove an item from a list.  The list item has a pointer to the list that\r\n * it is in, so only the list item need be passed into the function.\r\n *\r\n * @param uxListRemove The item to be removed.  The item will remove itself from\r\n * the list pointed to by it's pxContainer parameter.\r\n *\r\n * @return The number of items that remain in the list after the list item has\r\n * been removed.\r\n *\r\n * \\page listREMOVE_ITEM listREMOVE_ITEM\r\n * \\ingroup LinkedList\r\n */\r\n#define listREMOVE_ITEM( pxItemToRemove ) \\\r\n    do {                                  \\\r\n        /* The list item knows which list it is in.  Obtain the list from the list \\\r\n         * item. */                                                              \\\r\n        List_t * const pxList = ( pxItemToRemove )->pxContainer;                 \\\r\n                                                                                 \\\r\n        ( pxItemToRemove )->pxNext->pxPrevious = ( pxItemToRemove )->pxPrevious; \\\r\n        ( pxItemToRemove )->pxPrevious->pxNext = ( pxItemToRemove )->pxNext;     \\\r\n        /* Make sure the index is left pointing to a valid item. */              \\\r\n        if( pxList->pxIndex == ( pxItemToRemove ) )                              \\\r\n        {                                                                        \\\r\n            pxList->pxIndex = ( pxItemToRemove )->pxPrevious;                    \\\r\n        }                                                                        \\\r\n                                                                                 \\\r\n        ( pxItemToRemove )->pxContainer = NULL;                                  \\\r\n        ( pxList->uxNumberOfItems )--;                                           \\\r\n    } while( 0 )\r\n\r\n/*\r\n * Inline version of vListInsertEnd() to provide slight optimisation for\r\n * xTaskIncrementTick().\r\n *\r\n * Insert a list item into a list.  The item will be inserted in a position\r\n * such that it will be the last item within the list returned by multiple\r\n * calls to listGET_OWNER_OF_NEXT_ENTRY.\r\n *\r\n * The list member pxIndex is used to walk through a list.  Calling\r\n * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list.\r\n * Placing an item in a list using vListInsertEnd effectively places the item\r\n * in the list position pointed to by pxIndex.  This means that every other\r\n * item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before\r\n * the pxIndex parameter again points to the item being inserted.\r\n *\r\n * @param pxList The list into which the item is to be inserted.\r\n *\r\n * @param pxNewListItem The list item to be inserted into the list.\r\n *\r\n * \\page listINSERT_END listINSERT_END\r\n * \\ingroup LinkedList\r\n */\r\n#define listINSERT_END( pxList, pxNewListItem )           \\\r\n    do {                                                  \\\r\n        ListItem_t * const pxIndex = ( pxList )->pxIndex; \\\r\n                                                          \\\r\n        /* Only effective when configASSERT() is also defined, these tests may catch \\\r\n         * the list data structures being overwritten in memory.  They will not catch \\\r\n         * data errors caused by incorrect configuration or use of FreeRTOS. */ \\\r\n        listTEST_LIST_INTEGRITY( ( pxList ) );                                  \\\r\n        listTEST_LIST_ITEM_INTEGRITY( ( pxNewListItem ) );                      \\\r\n                                                                                \\\r\n        /* Insert a new list item into ( pxList ), but rather than sort the list, \\\r\n         * makes the new list item the last item to be removed by a call to \\\r\n         * listGET_OWNER_OF_NEXT_ENTRY(). */                 \\\r\n        ( pxNewListItem )->pxNext = pxIndex;                 \\\r\n        ( pxNewListItem )->pxPrevious = pxIndex->pxPrevious; \\\r\n                                                             \\\r\n        pxIndex->pxPrevious->pxNext = ( pxNewListItem );     \\\r\n        pxIndex->pxPrevious = ( pxNewListItem );             \\\r\n                                                             \\\r\n        /* Remember which list the item is in. */            \\\r\n        ( pxNewListItem )->pxContainer = ( pxList );         \\\r\n                                                             \\\r\n        ( ( pxList )->uxNumberOfItems )++;                   \\\r\n    } while( 0 )\r\n\r\n/*\r\n * Access function to obtain the owner of the first entry in a list.  Lists\r\n * are normally sorted in ascending item value order.\r\n *\r\n * This function returns the pxOwner member of the first item in the list.\r\n * The pxOwner parameter of a list item is a pointer to the object that owns\r\n * the list item.  In the scheduler this is normally a task control block.\r\n * The pxOwner parameter effectively creates a two way link between the list\r\n * item and its owner.\r\n *\r\n * @param pxList The list from which the owner of the head item is to be\r\n * returned.\r\n *\r\n * \\page listGET_OWNER_OF_HEAD_ENTRY listGET_OWNER_OF_HEAD_ENTRY\r\n * \\ingroup LinkedList\r\n */\r\n#define listGET_OWNER_OF_HEAD_ENTRY( pxList )            ( ( &( ( pxList )->xListEnd ) )->pxNext->pvOwner )\r\n\r\n/*\r\n * Check to see if a list item is within a list.  The list item maintains a\r\n * \"container\" pointer that points to the list it is in.  All this macro does\r\n * is check to see if the container and the list match.\r\n *\r\n * @param pxList The list we want to know if the list item is within.\r\n * @param pxListItem The list item we want to know if is in the list.\r\n * @return pdTRUE if the list item is in the list, otherwise pdFALSE.\r\n */\r\n#define listIS_CONTAINED_WITHIN( pxList, pxListItem )    ( ( ( pxListItem )->pxContainer == ( pxList ) ) ? ( pdTRUE ) : ( pdFALSE ) )\r\n\r\n/*\r\n * Return the list a list item is contained within (referenced from).\r\n *\r\n * @param pxListItem The list item being queried.\r\n * @return A pointer to the List_t object that references the pxListItem\r\n */\r\n#define listLIST_ITEM_CONTAINER( pxListItem )            ( ( pxListItem )->pxContainer )\r\n\r\n/*\r\n * This provides a crude means of knowing if a list has been initialised, as\r\n * pxList->xListEnd.xItemValue is set to portMAX_DELAY by the vListInitialise()\r\n * function.\r\n */\r\n#define listLIST_IS_INITIALISED( pxList )                ( ( pxList )->xListEnd.xItemValue == portMAX_DELAY )\r\n\r\n/*\r\n * Must be called before a list is used!  This initialises all the members\r\n * of the list structure and inserts the xListEnd item into the list as a\r\n * marker to the back of the list.\r\n *\r\n * @param pxList Pointer to the list being initialised.\r\n *\r\n * \\page vListInitialise vListInitialise\r\n * \\ingroup LinkedList\r\n */\r\nvoid vListInitialise( List_t * const pxList ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Must be called before a list item is used.  This sets the list container to\r\n * null so the item does not think that it is already contained in a list.\r\n *\r\n * @param pxItem Pointer to the list item being initialised.\r\n *\r\n * \\page vListInitialiseItem vListInitialiseItem\r\n * \\ingroup LinkedList\r\n */\r\nvoid vListInitialiseItem( ListItem_t * const pxItem ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Insert a list item into a list.  The item will be inserted into the list in\r\n * a position determined by its item value (ascending item value order).\r\n *\r\n * @param pxList The list into which the item is to be inserted.\r\n *\r\n * @param pxNewListItem The item that is to be placed in the list.\r\n *\r\n * \\page vListInsert vListInsert\r\n * \\ingroup LinkedList\r\n */\r\nvoid vListInsert( List_t * const pxList,\r\n                  ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Insert a list item into a list.  The item will be inserted in a position\r\n * such that it will be the last item within the list returned by multiple\r\n * calls to listGET_OWNER_OF_NEXT_ENTRY.\r\n *\r\n * The list member pxIndex is used to walk through a list.  Calling\r\n * listGET_OWNER_OF_NEXT_ENTRY increments pxIndex to the next item in the list.\r\n * Placing an item in a list using vListInsertEnd effectively places the item\r\n * in the list position pointed to by pxIndex.  This means that every other\r\n * item within the list will be returned by listGET_OWNER_OF_NEXT_ENTRY before\r\n * the pxIndex parameter again points to the item being inserted.\r\n *\r\n * @param pxList The list into which the item is to be inserted.\r\n *\r\n * @param pxNewListItem The list item to be inserted into the list.\r\n *\r\n * \\page vListInsertEnd vListInsertEnd\r\n * \\ingroup LinkedList\r\n */\r\nvoid vListInsertEnd( List_t * const pxList,\r\n                     ListItem_t * const pxNewListItem ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Remove an item from a list.  The list item has a pointer to the list that\r\n * it is in, so only the list item need be passed into the function.\r\n *\r\n * @param uxListRemove The item to be removed.  The item will remove itself from\r\n * the list pointed to by it's pxContainer parameter.\r\n *\r\n * @return The number of items that remain in the list after the list item has\r\n * been removed.\r\n *\r\n * \\page uxListRemove uxListRemove\r\n * \\ingroup LinkedList\r\n */\r\nUBaseType_t uxListRemove( ListItem_t * const pxItemToRemove ) PRIVILEGED_FUNCTION;\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    }\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n#endif /* ifndef LIST_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/message_buffer.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n\r\n/*\r\n * Message buffers build functionality on top of FreeRTOS stream buffers.\r\n * Whereas stream buffers are used to send a continuous stream of data from one\r\n * task or interrupt to another, message buffers are used to send variable\r\n * length discrete messages from one task or interrupt to another.  Their\r\n * implementation is light weight, making them particularly suited for interrupt\r\n * to task and core to core communication scenarios.\r\n *\r\n * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer\r\n * implementation (so also the message buffer implementation, as message buffers\r\n * are built on top of stream buffers) assumes there is only one task or\r\n * interrupt that will write to the buffer (the writer), and only one task or\r\n * interrupt that will read from the buffer (the reader).  It is safe for the\r\n * writer and reader to be different tasks or interrupts, but, unlike other\r\n * FreeRTOS objects, it is not safe to have multiple different writers or\r\n * multiple different readers.  If there are to be multiple different writers\r\n * then the application writer must place each call to a writing API function\r\n * (such as xMessageBufferSend()) inside a critical section and set the send\r\n * block time to 0.  Likewise, if there are to be multiple different readers\r\n * then the application writer must place each call to a reading API function\r\n * (such as xMessageBufferRead()) inside a critical section and set the receive\r\n * timeout to 0.\r\n *\r\n * Message buffers hold variable length messages.  To enable that, when a\r\n * message is written to the message buffer an additional sizeof( size_t ) bytes\r\n * are also written to store the message's length (that happens internally, with\r\n * the API function).  sizeof( size_t ) is typically 4 bytes on a 32-bit\r\n * architecture, so writing a 10 byte message to a message buffer on a 32-bit\r\n * architecture will actually reduce the available space in the message buffer\r\n * by 14 bytes (10 byte are used by the message, and 4 bytes to hold the length\r\n * of the message).\r\n */\r\n\r\n#ifndef FREERTOS_MESSAGE_BUFFER_H\r\n#define FREERTOS_MESSAGE_BUFFER_H\r\n\r\n#ifndef INC_FREERTOS_H\r\n    #error \"include FreeRTOS.h must appear in source files before include message_buffer.h\"\r\n#endif\r\n\r\n/* Message buffers are built onto of stream buffers. */\r\n#include \"stream_buffer.h\"\r\n\r\n/* *INDENT-OFF* */\r\n#if defined( __cplusplus )\r\n    extern \"C\" {\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n/**\r\n * Type by which message buffers are referenced.  For example, a call to\r\n * xMessageBufferCreate() returns an MessageBufferHandle_t variable that can\r\n * then be used as a parameter to xMessageBufferSend(), xMessageBufferReceive(),\r\n * etc. Message buffer is essentially built as a stream buffer hence its handle\r\n * is also set to same type as a stream buffer handle.\r\n */\r\ntypedef StreamBufferHandle_t MessageBufferHandle_t;\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * message_buffer.h\r\n *\r\n * @code{c}\r\n * MessageBufferHandle_t xMessageBufferCreate( size_t xBufferSizeBytes );\r\n * @endcode\r\n *\r\n * Creates a new message buffer using dynamically allocated memory.  See\r\n * xMessageBufferCreateStatic() for a version that uses statically allocated\r\n * memory (memory that is allocated at compile time).\r\n *\r\n * configSUPPORT_DYNAMIC_ALLOCATION must be set to 1 or left undefined in\r\n * FreeRTOSConfig.h for xMessageBufferCreate() to be available.\r\n *\r\n * @param xBufferSizeBytes The total number of bytes (not messages) the message\r\n * buffer will be able to hold at any one time.  When a message is written to\r\n * the message buffer an additional sizeof( size_t ) bytes are also written to\r\n * store the message's length.  sizeof( size_t ) is typically 4 bytes on a\r\n * 32-bit architecture, so on most 32-bit architectures a 10 byte message will\r\n * take up 14 bytes of message buffer space.\r\n *\r\n * @param pxSendCompletedCallback Callback invoked when a send operation to the\r\n * message buffer is complete. If the parameter is NULL or xMessageBufferCreate()\r\n * is called without the parameter, then it will use the default implementation\r\n * provided by sbSEND_COMPLETED macro. To enable the callback,\r\n * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.\r\n *\r\n * @param pxReceiveCompletedCallback Callback invoked when a receive operation from\r\n * the message buffer is complete. If the parameter is NULL or xMessageBufferCreate()\r\n * is called without the parameter, it will use the default implementation provided\r\n * by sbRECEIVE_COMPLETED macro. To enable the callback,\r\n * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.\r\n *\r\n * @return If NULL is returned, then the message buffer cannot be created\r\n * because there is insufficient heap memory available for FreeRTOS to allocate\r\n * the message buffer data structures and storage area.  A non-NULL value being\r\n * returned indicates that the message buffer has been created successfully -\r\n * the returned value should be stored as the handle to the created message\r\n * buffer.\r\n *\r\n * Example use:\r\n * @code{c}\r\n *\r\n * void vAFunction( void )\r\n * {\r\n * MessageBufferHandle_t xMessageBuffer;\r\n * const size_t xMessageBufferSizeBytes = 100;\r\n *\r\n *  // Create a message buffer that can hold 100 bytes.  The memory used to hold\r\n *  // both the message buffer structure and the messages themselves is allocated\r\n *  // dynamically.  Each message added to the buffer consumes an additional 4\r\n *  // bytes which are used to hold the length of the message.\r\n *  xMessageBuffer = xMessageBufferCreate( xMessageBufferSizeBytes );\r\n *\r\n *  if( xMessageBuffer == NULL )\r\n *  {\r\n *      // There was not enough heap memory space available to create the\r\n *      // message buffer.\r\n *  }\r\n *  else\r\n *  {\r\n *      // The message buffer was created successfully and can now be used.\r\n *  }\r\n *\r\n * @endcode\r\n * \\defgroup xMessageBufferCreate xMessageBufferCreate\r\n * \\ingroup MessageBufferManagement\r\n */\r\n#define xMessageBufferCreate( xBufferSizeBytes ) \\\r\n    xStreamBufferGenericCreate( ( xBufferSizeBytes ), ( size_t ) 0, pdTRUE, NULL, NULL )\r\n\r\n#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )\r\n    #define xMessageBufferCreateWithCallback( xBufferSizeBytes, pxSendCompletedCallback, pxReceiveCompletedCallback ) \\\r\n    xStreamBufferGenericCreate( ( xBufferSizeBytes ), ( size_t ) 0, pdTRUE, ( pxSendCompletedCallback ), ( pxReceiveCompletedCallback ) )\r\n#endif\r\n\r\n/**\r\n * message_buffer.h\r\n *\r\n * @code{c}\r\n * MessageBufferHandle_t xMessageBufferCreateStatic( size_t xBufferSizeBytes,\r\n *                                                uint8_t *pucMessageBufferStorageArea,\r\n *                                                StaticMessageBuffer_t *pxStaticMessageBuffer );\r\n * @endcode\r\n * Creates a new message buffer using statically allocated memory.  See\r\n * xMessageBufferCreate() for a version that uses dynamically allocated memory.\r\n *\r\n * @param xBufferSizeBytes The size, in bytes, of the buffer pointed to by the\r\n * pucMessageBufferStorageArea parameter.  When a message is written to the\r\n * message buffer an additional sizeof( size_t ) bytes are also written to store\r\n * the message's length.  sizeof( size_t ) is typically 4 bytes on a 32-bit\r\n * architecture, so on most 32-bit architecture a 10 byte message will take up\r\n * 14 bytes of message buffer space.  The maximum number of bytes that can be\r\n * stored in the message buffer is actually (xBufferSizeBytes - 1).\r\n *\r\n * @param pucMessageBufferStorageArea Must point to a uint8_t array that is at\r\n * least xBufferSizeBytes big.  This is the array to which messages are\r\n * copied when they are written to the message buffer.\r\n *\r\n * @param pxStaticMessageBuffer Must point to a variable of type\r\n * StaticMessageBuffer_t, which will be used to hold the message buffer's data\r\n * structure.\r\n *\r\n * @param pxSendCompletedCallback Callback invoked when a new message is sent to the message buffer.\r\n * If the parameter is NULL or xMessageBufferCreate() is called without the parameter, then it will use the default\r\n * implementation provided by sbSEND_COMPLETED macro. To enable the callback,\r\n * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.\r\n *\r\n * @param pxReceiveCompletedCallback Callback invoked when a message is read from a\r\n * message buffer. If the parameter is NULL or xMessageBufferCreate() is called without the parameter, it will\r\n * use the default implementation provided by sbRECEIVE_COMPLETED macro. To enable the callback,\r\n * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.\r\n *\r\n * @return If the message buffer is created successfully then a handle to the\r\n * created message buffer is returned. If either pucMessageBufferStorageArea or\r\n * pxStaticmessageBuffer are NULL then NULL is returned.\r\n *\r\n * Example use:\r\n * @code{c}\r\n *\r\n * // Used to dimension the array used to hold the messages.  The available space\r\n * // will actually be one less than this, so 999.\r\n #define STORAGE_SIZE_BYTES 1000\r\n *\r\n * // Defines the memory that will actually hold the messages within the message\r\n * // buffer.\r\n * static uint8_t ucStorageBuffer[ STORAGE_SIZE_BYTES ];\r\n *\r\n * // The variable used to hold the message buffer structure.\r\n * StaticMessageBuffer_t xMessageBufferStruct;\r\n *\r\n * void MyFunction( void )\r\n * {\r\n * MessageBufferHandle_t xMessageBuffer;\r\n *\r\n *  xMessageBuffer = xMessageBufferCreateStatic( sizeof( ucStorageBuffer ),\r\n *                                               ucStorageBuffer,\r\n *                                               &xMessageBufferStruct );\r\n *\r\n *  // As neither the pucMessageBufferStorageArea or pxStaticMessageBuffer\r\n *  // parameters were NULL, xMessageBuffer will not be NULL, and can be used to\r\n *  // reference the created message buffer in other message buffer API calls.\r\n *\r\n *  // Other code that uses the message buffer can go here.\r\n * }\r\n *\r\n * @endcode\r\n * \\defgroup xMessageBufferCreateStatic xMessageBufferCreateStatic\r\n * \\ingroup MessageBufferManagement\r\n */\r\n#define xMessageBufferCreateStatic( xBufferSizeBytes, pucMessageBufferStorageArea, pxStaticMessageBuffer ) \\\r\n    xStreamBufferGenericCreateStatic( ( xBufferSizeBytes ), 0, pdTRUE, ( pucMessageBufferStorageArea ), ( pxStaticMessageBuffer ), NULL, NULL )\r\n\r\n#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )\r\n    #define xMessageBufferCreateStaticWithCallback( xBufferSizeBytes, pucMessageBufferStorageArea, pxStaticMessageBuffer, pxSendCompletedCallback, pxReceiveCompletedCallback ) \\\r\n    xStreamBufferGenericCreateStatic( ( xBufferSizeBytes ), 0, pdTRUE, ( pucMessageBufferStorageArea ), ( pxStaticMessageBuffer ), ( pxSendCompletedCallback ), ( pxReceiveCompletedCallback ) )\r\n#endif\r\n\r\n/**\r\n * message_buffer.h\r\n *\r\n * @code{c}\r\n * BaseType_t xMessageBufferGetStaticBuffers( MessageBufferHandle_t xMessageBuffer,\r\n *                                            uint8_t ** ppucMessageBufferStorageArea,\r\n *                                            StaticMessageBuffer_t ** ppxStaticMessageBuffer );\r\n * @endcode\r\n *\r\n * Retrieve pointers to a statically created message buffer's data structure\r\n * buffer and storage area buffer. These are the same buffers that are supplied\r\n * at the time of creation.\r\n *\r\n * @param xMessageBuffer The message buffer for which to retrieve the buffers.\r\n *\r\n * @param ppucMessageBufferStorageArea Used to return a pointer to the\r\n * message buffer's storage area buffer.\r\n *\r\n * @param ppxStaticMessageBuffer Used to return a pointer to the message\r\n * buffer's data structure buffer.\r\n *\r\n * @return pdTRUE if buffers were retrieved, pdFALSE otherwise..\r\n *\r\n * \\defgroup xMessageBufferGetStaticBuffers xMessageBufferGetStaticBuffers\r\n * \\ingroup MessageBufferManagement\r\n */\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n    #define xMessageBufferGetStaticBuffers( xMessageBuffer, ppucMessageBufferStorageArea, ppxStaticMessageBuffer ) \\\r\n    xStreamBufferGetStaticBuffers( ( xMessageBuffer ), ( ppucMessageBufferStorageArea ), ( ppxStaticMessageBuffer ) )\r\n#endif /* configSUPPORT_STATIC_ALLOCATION */\r\n\r\n/**\r\n * message_buffer.h\r\n *\r\n * @code{c}\r\n * size_t xMessageBufferSend( MessageBufferHandle_t xMessageBuffer,\r\n *                         const void *pvTxData,\r\n *                         size_t xDataLengthBytes,\r\n *                         TickType_t xTicksToWait );\r\n * @endcode\r\n *\r\n * Sends a discrete message to the message buffer.  The message can be any\r\n * length that fits within the buffer's free space, and is copied into the\r\n * buffer.\r\n *\r\n * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer\r\n * implementation (so also the message buffer implementation, as message buffers\r\n * are built on top of stream buffers) assumes there is only one task or\r\n * interrupt that will write to the buffer (the writer), and only one task or\r\n * interrupt that will read from the buffer (the reader).  It is safe for the\r\n * writer and reader to be different tasks or interrupts, but, unlike other\r\n * FreeRTOS objects, it is not safe to have multiple different writers or\r\n * multiple different readers.  If there are to be multiple different writers\r\n * then the application writer must place each call to a writing API function\r\n * (such as xMessageBufferSend()) inside a critical section and set the send\r\n * block time to 0.  Likewise, if there are to be multiple different readers\r\n * then the application writer must place each call to a reading API function\r\n * (such as xMessageBufferRead()) inside a critical section and set the receive\r\n * block time to 0.\r\n *\r\n * Use xMessageBufferSend() to write to a message buffer from a task.  Use\r\n * xMessageBufferSendFromISR() to write to a message buffer from an interrupt\r\n * service routine (ISR).\r\n *\r\n * @param xMessageBuffer The handle of the message buffer to which a message is\r\n * being sent.\r\n *\r\n * @param pvTxData A pointer to the message that is to be copied into the\r\n * message buffer.\r\n *\r\n * @param xDataLengthBytes The length of the message.  That is, the number of\r\n * bytes to copy from pvTxData into the message buffer.  When a message is\r\n * written to the message buffer an additional sizeof( size_t ) bytes are also\r\n * written to store the message's length.  sizeof( size_t ) is typically 4 bytes\r\n * on a 32-bit architecture, so on most 32-bit architecture setting\r\n * xDataLengthBytes to 20 will reduce the free space in the message buffer by 24\r\n * bytes (20 bytes of message data and 4 bytes to hold the message length).\r\n *\r\n * @param xTicksToWait The maximum amount of time the calling task should remain\r\n * in the Blocked state to wait for enough space to become available in the\r\n * message buffer, should the message buffer have insufficient space when\r\n * xMessageBufferSend() is called.  The calling task will never block if\r\n * xTicksToWait is zero.  The block time is specified in tick periods, so the\r\n * absolute time it represents is dependent on the tick frequency.  The macro\r\n * pdMS_TO_TICKS() can be used to convert a time specified in milliseconds into\r\n * a time specified in ticks.  Setting xTicksToWait to portMAX_DELAY will cause\r\n * the task to wait indefinitely (without timing out), provided\r\n * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h.  Tasks do not use any\r\n * CPU time when they are in the Blocked state.\r\n *\r\n * @return The number of bytes written to the message buffer.  If the call to\r\n * xMessageBufferSend() times out before there was enough space to write the\r\n * message into the message buffer then zero is returned.  If the call did not\r\n * time out then xDataLengthBytes is returned.\r\n *\r\n * Example use:\r\n * @code{c}\r\n * void vAFunction( MessageBufferHandle_t xMessageBuffer )\r\n * {\r\n * size_t xBytesSent;\r\n * uint8_t ucArrayToSend[] = { 0, 1, 2, 3 };\r\n * char *pcStringToSend = \"String to send\";\r\n * const TickType_t x100ms = pdMS_TO_TICKS( 100 );\r\n *\r\n *  // Send an array to the message buffer, blocking for a maximum of 100ms to\r\n *  // wait for enough space to be available in the message buffer.\r\n *  xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms );\r\n *\r\n *  if( xBytesSent != sizeof( ucArrayToSend ) )\r\n *  {\r\n *      // The call to xMessageBufferSend() times out before there was enough\r\n *      // space in the buffer for the data to be written.\r\n *  }\r\n *\r\n *  // Send the string to the message buffer.  Return immediately if there is\r\n *  // not enough space in the buffer.\r\n *  xBytesSent = xMessageBufferSend( xMessageBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 );\r\n *\r\n *  if( xBytesSent != strlen( pcStringToSend ) )\r\n *  {\r\n *      // The string could not be added to the message buffer because there was\r\n *      // not enough free space in the buffer.\r\n *  }\r\n * }\r\n * @endcode\r\n * \\defgroup xMessageBufferSend xMessageBufferSend\r\n * \\ingroup MessageBufferManagement\r\n */\r\n#define xMessageBufferSend( xMessageBuffer, pvTxData, xDataLengthBytes, xTicksToWait ) \\\r\n    xStreamBufferSend( ( xMessageBuffer ), ( pvTxData ), ( xDataLengthBytes ), ( xTicksToWait ) )\r\n\r\n/**\r\n * message_buffer.h\r\n *\r\n * @code{c}\r\n * size_t xMessageBufferSendFromISR( MessageBufferHandle_t xMessageBuffer,\r\n *                                const void *pvTxData,\r\n *                                size_t xDataLengthBytes,\r\n *                                BaseType_t *pxHigherPriorityTaskWoken );\r\n * @endcode\r\n *\r\n * Interrupt safe version of the API function that sends a discrete message to\r\n * the message buffer.  The message can be any length that fits within the\r\n * buffer's free space, and is copied into the buffer.\r\n *\r\n * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer\r\n * implementation (so also the message buffer implementation, as message buffers\r\n * are built on top of stream buffers) assumes there is only one task or\r\n * interrupt that will write to the buffer (the writer), and only one task or\r\n * interrupt that will read from the buffer (the reader).  It is safe for the\r\n * writer and reader to be different tasks or interrupts, but, unlike other\r\n * FreeRTOS objects, it is not safe to have multiple different writers or\r\n * multiple different readers.  If there are to be multiple different writers\r\n * then the application writer must place each call to a writing API function\r\n * (such as xMessageBufferSend()) inside a critical section and set the send\r\n * block time to 0.  Likewise, if there are to be multiple different readers\r\n * then the application writer must place each call to a reading API function\r\n * (such as xMessageBufferRead()) inside a critical section and set the receive\r\n * block time to 0.\r\n *\r\n * Use xMessageBufferSend() to write to a message buffer from a task.  Use\r\n * xMessageBufferSendFromISR() to write to a message buffer from an interrupt\r\n * service routine (ISR).\r\n *\r\n * @param xMessageBuffer The handle of the message buffer to which a message is\r\n * being sent.\r\n *\r\n * @param pvTxData A pointer to the message that is to be copied into the\r\n * message buffer.\r\n *\r\n * @param xDataLengthBytes The length of the message.  That is, the number of\r\n * bytes to copy from pvTxData into the message buffer.  When a message is\r\n * written to the message buffer an additional sizeof( size_t ) bytes are also\r\n * written to store the message's length.  sizeof( size_t ) is typically 4 bytes\r\n * on a 32-bit architecture, so on most 32-bit architecture setting\r\n * xDataLengthBytes to 20 will reduce the free space in the message buffer by 24\r\n * bytes (20 bytes of message data and 4 bytes to hold the message length).\r\n *\r\n * @param pxHigherPriorityTaskWoken  It is possible that a message buffer will\r\n * have a task blocked on it waiting for data.  Calling\r\n * xMessageBufferSendFromISR() can make data available, and so cause a task that\r\n * was waiting for data to leave the Blocked state.  If calling\r\n * xMessageBufferSendFromISR() causes a task to leave the Blocked state, and the\r\n * unblocked task has a priority higher than the currently executing task (the\r\n * task that was interrupted), then, internally, xMessageBufferSendFromISR()\r\n * will set *pxHigherPriorityTaskWoken to pdTRUE.  If\r\n * xMessageBufferSendFromISR() sets this value to pdTRUE, then normally a\r\n * context switch should be performed before the interrupt is exited.  This will\r\n * ensure that the interrupt returns directly to the highest priority Ready\r\n * state task.  *pxHigherPriorityTaskWoken should be set to pdFALSE before it\r\n * is passed into the function.  See the code example below for an example.\r\n *\r\n * @return The number of bytes actually written to the message buffer.  If the\r\n * message buffer didn't have enough free space for the message to be stored\r\n * then 0 is returned, otherwise xDataLengthBytes is returned.\r\n *\r\n * Example use:\r\n * @code{c}\r\n * // A message buffer that has already been created.\r\n * MessageBufferHandle_t xMessageBuffer;\r\n *\r\n * void vAnInterruptServiceRoutine( void )\r\n * {\r\n * size_t xBytesSent;\r\n * char *pcStringToSend = \"String to send\";\r\n * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE.\r\n *\r\n *  // Attempt to send the string to the message buffer.\r\n *  xBytesSent = xMessageBufferSendFromISR( xMessageBuffer,\r\n *                                          ( void * ) pcStringToSend,\r\n *                                          strlen( pcStringToSend ),\r\n *                                          &xHigherPriorityTaskWoken );\r\n *\r\n *  if( xBytesSent != strlen( pcStringToSend ) )\r\n *  {\r\n *      // The string could not be added to the message buffer because there was\r\n *      // not enough free space in the buffer.\r\n *  }\r\n *\r\n *  // If xHigherPriorityTaskWoken was set to pdTRUE inside\r\n *  // xMessageBufferSendFromISR() then a task that has a priority above the\r\n *  // priority of the currently executing task was unblocked and a context\r\n *  // switch should be performed to ensure the ISR returns to the unblocked\r\n *  // task.  In most FreeRTOS ports this is done by simply passing\r\n *  // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the\r\n *  // variables value, and perform the context switch if necessary.  Check the\r\n *  // documentation for the port in use for port specific instructions.\r\n *  portYIELD_FROM_ISR( xHigherPriorityTaskWoken );\r\n * }\r\n * @endcode\r\n * \\defgroup xMessageBufferSendFromISR xMessageBufferSendFromISR\r\n * \\ingroup MessageBufferManagement\r\n */\r\n#define xMessageBufferSendFromISR( xMessageBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken ) \\\r\n    xStreamBufferSendFromISR( ( xMessageBuffer ), ( pvTxData ), ( xDataLengthBytes ), ( pxHigherPriorityTaskWoken ) )\r\n\r\n/**\r\n * message_buffer.h\r\n *\r\n * @code{c}\r\n * size_t xMessageBufferReceive( MessageBufferHandle_t xMessageBuffer,\r\n *                            void *pvRxData,\r\n *                            size_t xBufferLengthBytes,\r\n *                            TickType_t xTicksToWait );\r\n * @endcode\r\n *\r\n * Receives a discrete message from a message buffer.  Messages can be of\r\n * variable length and are copied out of the buffer.\r\n *\r\n * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer\r\n * implementation (so also the message buffer implementation, as message buffers\r\n * are built on top of stream buffers) assumes there is only one task or\r\n * interrupt that will write to the buffer (the writer), and only one task or\r\n * interrupt that will read from the buffer (the reader).  It is safe for the\r\n * writer and reader to be different tasks or interrupts, but, unlike other\r\n * FreeRTOS objects, it is not safe to have multiple different writers or\r\n * multiple different readers.  If there are to be multiple different writers\r\n * then the application writer must place each call to a writing API function\r\n * (such as xMessageBufferSend()) inside a critical section and set the send\r\n * block time to 0.  Likewise, if there are to be multiple different readers\r\n * then the application writer must place each call to a reading API function\r\n * (such as xMessageBufferRead()) inside a critical section and set the receive\r\n * block time to 0.\r\n *\r\n * Use xMessageBufferReceive() to read from a message buffer from a task.  Use\r\n * xMessageBufferReceiveFromISR() to read from a message buffer from an\r\n * interrupt service routine (ISR).\r\n *\r\n * @param xMessageBuffer The handle of the message buffer from which a message\r\n * is being received.\r\n *\r\n * @param pvRxData A pointer to the buffer into which the received message is\r\n * to be copied.\r\n *\r\n * @param xBufferLengthBytes The length of the buffer pointed to by the pvRxData\r\n * parameter.  This sets the maximum length of the message that can be received.\r\n * If xBufferLengthBytes is too small to hold the next message then the message\r\n * will be left in the message buffer and 0 will be returned.\r\n *\r\n * @param xTicksToWait The maximum amount of time the task should remain in the\r\n * Blocked state to wait for a message, should the message buffer be empty.\r\n * xMessageBufferReceive() will return immediately if xTicksToWait is zero and\r\n * the message buffer is empty.  The block time is specified in tick periods, so\r\n * the absolute time it represents is dependent on the tick frequency.  The\r\n * macro pdMS_TO_TICKS() can be used to convert a time specified in milliseconds\r\n * into a time specified in ticks.  Setting xTicksToWait to portMAX_DELAY will\r\n * cause the task to wait indefinitely (without timing out), provided\r\n * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h.  Tasks do not use any\r\n * CPU time when they are in the Blocked state.\r\n *\r\n * @return The length, in bytes, of the message read from the message buffer, if\r\n * any.  If xMessageBufferReceive() times out before a message became available\r\n * then zero is returned.  If the length of the message is greater than\r\n * xBufferLengthBytes then the message will be left in the message buffer and\r\n * zero is returned.\r\n *\r\n * Example use:\r\n * @code{c}\r\n * void vAFunction( MessageBuffer_t xMessageBuffer )\r\n * {\r\n * uint8_t ucRxData[ 20 ];\r\n * size_t xReceivedBytes;\r\n * const TickType_t xBlockTime = pdMS_TO_TICKS( 20 );\r\n *\r\n *  // Receive the next message from the message buffer.  Wait in the Blocked\r\n *  // state (so not using any CPU processing time) for a maximum of 100ms for\r\n *  // a message to become available.\r\n *  xReceivedBytes = xMessageBufferReceive( xMessageBuffer,\r\n *                                          ( void * ) ucRxData,\r\n *                                          sizeof( ucRxData ),\r\n *                                          xBlockTime );\r\n *\r\n *  if( xReceivedBytes > 0 )\r\n *  {\r\n *      // A ucRxData contains a message that is xReceivedBytes long.  Process\r\n *      // the message here....\r\n *  }\r\n * }\r\n * @endcode\r\n * \\defgroup xMessageBufferReceive xMessageBufferReceive\r\n * \\ingroup MessageBufferManagement\r\n */\r\n#define xMessageBufferReceive( xMessageBuffer, pvRxData, xBufferLengthBytes, xTicksToWait ) \\\r\n    xStreamBufferReceive( ( xMessageBuffer ), ( pvRxData ), ( xBufferLengthBytes ), ( xTicksToWait ) )\r\n\r\n\r\n/**\r\n * message_buffer.h\r\n *\r\n * @code{c}\r\n * size_t xMessageBufferReceiveFromISR( MessageBufferHandle_t xMessageBuffer,\r\n *                                   void *pvRxData,\r\n *                                   size_t xBufferLengthBytes,\r\n *                                   BaseType_t *pxHigherPriorityTaskWoken );\r\n * @endcode\r\n *\r\n * An interrupt safe version of the API function that receives a discrete\r\n * message from a message buffer.  Messages can be of variable length and are\r\n * copied out of the buffer.\r\n *\r\n * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer\r\n * implementation (so also the message buffer implementation, as message buffers\r\n * are built on top of stream buffers) assumes there is only one task or\r\n * interrupt that will write to the buffer (the writer), and only one task or\r\n * interrupt that will read from the buffer (the reader).  It is safe for the\r\n * writer and reader to be different tasks or interrupts, but, unlike other\r\n * FreeRTOS objects, it is not safe to have multiple different writers or\r\n * multiple different readers.  If there are to be multiple different writers\r\n * then the application writer must place each call to a writing API function\r\n * (such as xMessageBufferSend()) inside a critical section and set the send\r\n * block time to 0.  Likewise, if there are to be multiple different readers\r\n * then the application writer must place each call to a reading API function\r\n * (such as xMessageBufferRead()) inside a critical section and set the receive\r\n * block time to 0.\r\n *\r\n * Use xMessageBufferReceive() to read from a message buffer from a task.  Use\r\n * xMessageBufferReceiveFromISR() to read from a message buffer from an\r\n * interrupt service routine (ISR).\r\n *\r\n * @param xMessageBuffer The handle of the message buffer from which a message\r\n * is being received.\r\n *\r\n * @param pvRxData A pointer to the buffer into which the received message is\r\n * to be copied.\r\n *\r\n * @param xBufferLengthBytes The length of the buffer pointed to by the pvRxData\r\n * parameter.  This sets the maximum length of the message that can be received.\r\n * If xBufferLengthBytes is too small to hold the next message then the message\r\n * will be left in the message buffer and 0 will be returned.\r\n *\r\n * @param pxHigherPriorityTaskWoken  It is possible that a message buffer will\r\n * have a task blocked on it waiting for space to become available.  Calling\r\n * xMessageBufferReceiveFromISR() can make space available, and so cause a task\r\n * that is waiting for space to leave the Blocked state.  If calling\r\n * xMessageBufferReceiveFromISR() causes a task to leave the Blocked state, and\r\n * the unblocked task has a priority higher than the currently executing task\r\n * (the task that was interrupted), then, internally,\r\n * xMessageBufferReceiveFromISR() will set *pxHigherPriorityTaskWoken to pdTRUE.\r\n * If xMessageBufferReceiveFromISR() sets this value to pdTRUE, then normally a\r\n * context switch should be performed before the interrupt is exited.  That will\r\n * ensure the interrupt returns directly to the highest priority Ready state\r\n * task.  *pxHigherPriorityTaskWoken should be set to pdFALSE before it is\r\n * passed into the function.  See the code example below for an example.\r\n *\r\n * @return The length, in bytes, of the message read from the message buffer, if\r\n * any.\r\n *\r\n * Example use:\r\n * @code{c}\r\n * // A message buffer that has already been created.\r\n * MessageBuffer_t xMessageBuffer;\r\n *\r\n * void vAnInterruptServiceRoutine( void )\r\n * {\r\n * uint8_t ucRxData[ 20 ];\r\n * size_t xReceivedBytes;\r\n * BaseType_t xHigherPriorityTaskWoken = pdFALSE;  // Initialised to pdFALSE.\r\n *\r\n *  // Receive the next message from the message buffer.\r\n *  xReceivedBytes = xMessageBufferReceiveFromISR( xMessageBuffer,\r\n *                                                ( void * ) ucRxData,\r\n *                                                sizeof( ucRxData ),\r\n *                                                &xHigherPriorityTaskWoken );\r\n *\r\n *  if( xReceivedBytes > 0 )\r\n *  {\r\n *      // A ucRxData contains a message that is xReceivedBytes long.  Process\r\n *      // the message here....\r\n *  }\r\n *\r\n *  // If xHigherPriorityTaskWoken was set to pdTRUE inside\r\n *  // xMessageBufferReceiveFromISR() then a task that has a priority above the\r\n *  // priority of the currently executing task was unblocked and a context\r\n *  // switch should be performed to ensure the ISR returns to the unblocked\r\n *  // task.  In most FreeRTOS ports this is done by simply passing\r\n *  // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the\r\n *  // variables value, and perform the context switch if necessary.  Check the\r\n *  // documentation for the port in use for port specific instructions.\r\n *  portYIELD_FROM_ISR( xHigherPriorityTaskWoken );\r\n * }\r\n * @endcode\r\n * \\defgroup xMessageBufferReceiveFromISR xMessageBufferReceiveFromISR\r\n * \\ingroup MessageBufferManagement\r\n */\r\n#define xMessageBufferReceiveFromISR( xMessageBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken ) \\\r\n    xStreamBufferReceiveFromISR( ( xMessageBuffer ), ( pvRxData ), ( xBufferLengthBytes ), ( pxHigherPriorityTaskWoken ) )\r\n\r\n/**\r\n * message_buffer.h\r\n *\r\n * @code{c}\r\n * void vMessageBufferDelete( MessageBufferHandle_t xMessageBuffer );\r\n * @endcode\r\n *\r\n * Deletes a message buffer that was previously created using a call to\r\n * xMessageBufferCreate() or xMessageBufferCreateStatic().  If the message\r\n * buffer was created using dynamic memory (that is, by xMessageBufferCreate()),\r\n * then the allocated memory is freed.\r\n *\r\n * A message buffer handle must not be used after the message buffer has been\r\n * deleted.\r\n *\r\n * @param xMessageBuffer The handle of the message buffer to be deleted.\r\n *\r\n */\r\n#define vMessageBufferDelete( xMessageBuffer ) \\\r\n    vStreamBufferDelete( xMessageBuffer )\r\n\r\n/**\r\n * message_buffer.h\r\n * @code{c}\r\n * BaseType_t xMessageBufferIsFull( MessageBufferHandle_t xMessageBuffer );\r\n * @endcode\r\n *\r\n * Tests to see if a message buffer is full.  A message buffer is full if it\r\n * cannot accept any more messages, of any size, until space is made available\r\n * by a message being removed from the message buffer.\r\n *\r\n * @param xMessageBuffer The handle of the message buffer being queried.\r\n *\r\n * @return If the message buffer referenced by xMessageBuffer is full then\r\n * pdTRUE is returned.  Otherwise pdFALSE is returned.\r\n */\r\n#define xMessageBufferIsFull( xMessageBuffer ) \\\r\n    xStreamBufferIsFull( xMessageBuffer )\r\n\r\n/**\r\n * message_buffer.h\r\n * @code{c}\r\n * BaseType_t xMessageBufferIsEmpty( MessageBufferHandle_t xMessageBuffer );\r\n * @endcode\r\n *\r\n * Tests to see if a message buffer is empty (does not contain any messages).\r\n *\r\n * @param xMessageBuffer The handle of the message buffer being queried.\r\n *\r\n * @return If the message buffer referenced by xMessageBuffer is empty then\r\n * pdTRUE is returned.  Otherwise pdFALSE is returned.\r\n *\r\n */\r\n#define xMessageBufferIsEmpty( xMessageBuffer ) \\\r\n    xStreamBufferIsEmpty( xMessageBuffer )\r\n\r\n/**\r\n * message_buffer.h\r\n * @code{c}\r\n * BaseType_t xMessageBufferReset( MessageBufferHandle_t xMessageBuffer );\r\n * @endcode\r\n *\r\n * Resets a message buffer to its initial empty state, discarding any message it\r\n * contained.\r\n *\r\n * A message buffer can only be reset if there are no tasks blocked on it.\r\n *\r\n * @param xMessageBuffer The handle of the message buffer being reset.\r\n *\r\n * @return If the message buffer was reset then pdPASS is returned.  If the\r\n * message buffer could not be reset because either there was a task blocked on\r\n * the message queue to wait for space to become available, or to wait for a\r\n * a message to be available, then pdFAIL is returned.\r\n *\r\n * \\defgroup xMessageBufferReset xMessageBufferReset\r\n * \\ingroup MessageBufferManagement\r\n */\r\n#define xMessageBufferReset( xMessageBuffer ) \\\r\n    xStreamBufferReset( xMessageBuffer )\r\n\r\n\r\n/**\r\n * message_buffer.h\r\n * @code{c}\r\n * size_t xMessageBufferSpaceAvailable( MessageBufferHandle_t xMessageBuffer );\r\n * @endcode\r\n * Returns the number of bytes of free space in the message buffer.\r\n *\r\n * @param xMessageBuffer The handle of the message buffer being queried.\r\n *\r\n * @return The number of bytes that can be written to the message buffer before\r\n * the message buffer would be full.  When a message is written to the message\r\n * buffer an additional sizeof( size_t ) bytes are also written to store the\r\n * message's length.  sizeof( size_t ) is typically 4 bytes on a 32-bit\r\n * architecture, so if xMessageBufferSpacesAvailable() returns 10, then the size\r\n * of the largest message that can be written to the message buffer is 6 bytes.\r\n *\r\n * \\defgroup xMessageBufferSpaceAvailable xMessageBufferSpaceAvailable\r\n * \\ingroup MessageBufferManagement\r\n */\r\n#define xMessageBufferSpaceAvailable( xMessageBuffer ) \\\r\n    xStreamBufferSpacesAvailable( xMessageBuffer )\r\n#define xMessageBufferSpacesAvailable( xMessageBuffer ) \\\r\n    xStreamBufferSpacesAvailable( xMessageBuffer ) /* Corrects typo in original macro name. */\r\n\r\n/**\r\n * message_buffer.h\r\n * @code{c}\r\n * size_t xMessageBufferNextLengthBytes( MessageBufferHandle_t xMessageBuffer );\r\n * @endcode\r\n * Returns the length (in bytes) of the next message in a message buffer.\r\n * Useful if xMessageBufferReceive() returned 0 because the size of the buffer\r\n * passed into xMessageBufferReceive() was too small to hold the next message.\r\n *\r\n * @param xMessageBuffer The handle of the message buffer being queried.\r\n *\r\n * @return The length (in bytes) of the next message in the message buffer, or 0\r\n * if the message buffer is empty.\r\n *\r\n * \\defgroup xMessageBufferNextLengthBytes xMessageBufferNextLengthBytes\r\n * \\ingroup MessageBufferManagement\r\n */\r\n#define xMessageBufferNextLengthBytes( xMessageBuffer ) \\\r\n    xStreamBufferNextMessageLengthBytes( xMessageBuffer ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * message_buffer.h\r\n *\r\n * @code{c}\r\n * BaseType_t xMessageBufferSendCompletedFromISR( MessageBufferHandle_t xMessageBuffer, BaseType_t *pxHigherPriorityTaskWoken );\r\n * @endcode\r\n *\r\n * For advanced users only.\r\n *\r\n * The sbSEND_COMPLETED() macro is called from within the FreeRTOS APIs when\r\n * data is sent to a message buffer or stream buffer.  If there was a task that\r\n * was blocked on the message or stream buffer waiting for data to arrive then\r\n * the sbSEND_COMPLETED() macro sends a notification to the task to remove it\r\n * from the Blocked state.  xMessageBufferSendCompletedFromISR() does the same\r\n * thing.  It is provided to enable application writers to implement their own\r\n * version of sbSEND_COMPLETED(), and MUST NOT BE USED AT ANY OTHER TIME.\r\n *\r\n * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for\r\n * additional information.\r\n *\r\n * @param xMessageBuffer The handle of the stream buffer to which data was\r\n * written.\r\n *\r\n * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be\r\n * initialised to pdFALSE before it is passed into\r\n * xMessageBufferSendCompletedFromISR().  If calling\r\n * xMessageBufferSendCompletedFromISR() removes a task from the Blocked state,\r\n * and the task has a priority above the priority of the currently running task,\r\n * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a\r\n * context switch should be performed before exiting the ISR.\r\n *\r\n * @return If a task was removed from the Blocked state then pdTRUE is returned.\r\n * Otherwise pdFALSE is returned.\r\n *\r\n * \\defgroup xMessageBufferSendCompletedFromISR xMessageBufferSendCompletedFromISR\r\n * \\ingroup StreamBufferManagement\r\n */\r\n#define xMessageBufferSendCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) \\\r\n    xStreamBufferSendCompletedFromISR( ( xMessageBuffer ), ( pxHigherPriorityTaskWoken ) )\r\n\r\n/**\r\n * message_buffer.h\r\n *\r\n * @code{c}\r\n * BaseType_t xMessageBufferReceiveCompletedFromISR( MessageBufferHandle_t xMessageBuffer, BaseType_t *pxHigherPriorityTaskWoken );\r\n * @endcode\r\n *\r\n * For advanced users only.\r\n *\r\n * The sbRECEIVE_COMPLETED() macro is called from within the FreeRTOS APIs when\r\n * data is read out of a message buffer or stream buffer.  If there was a task\r\n * that was blocked on the message or stream buffer waiting for data to arrive\r\n * then the sbRECEIVE_COMPLETED() macro sends a notification to the task to\r\n * remove it from the Blocked state.  xMessageBufferReceiveCompletedFromISR()\r\n * does the same thing.  It is provided to enable application writers to\r\n * implement their own version of sbRECEIVE_COMPLETED(), and MUST NOT BE USED AT\r\n * ANY OTHER TIME.\r\n *\r\n * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for\r\n * additional information.\r\n *\r\n * @param xMessageBuffer The handle of the stream buffer from which data was\r\n * read.\r\n *\r\n * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be\r\n * initialised to pdFALSE before it is passed into\r\n * xMessageBufferReceiveCompletedFromISR().  If calling\r\n * xMessageBufferReceiveCompletedFromISR() removes a task from the Blocked state,\r\n * and the task has a priority above the priority of the currently running task,\r\n * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a\r\n * context switch should be performed before exiting the ISR.\r\n *\r\n * @return If a task was removed from the Blocked state then pdTRUE is returned.\r\n * Otherwise pdFALSE is returned.\r\n *\r\n * \\defgroup xMessageBufferReceiveCompletedFromISR xMessageBufferReceiveCompletedFromISR\r\n * \\ingroup StreamBufferManagement\r\n */\r\n#define xMessageBufferReceiveCompletedFromISR( xMessageBuffer, pxHigherPriorityTaskWoken ) \\\r\n    xStreamBufferReceiveCompletedFromISR( ( xMessageBuffer ), ( pxHigherPriorityTaskWoken ) )\r\n\r\n/* *INDENT-OFF* */\r\n#if defined( __cplusplus )\r\n    } /* extern \"C\" */\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n#endif /* !defined( FREERTOS_MESSAGE_BUFFER_H ) */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/mpu_prototypes.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n/*\r\n * When the MPU is used the standard (non MPU) API functions are mapped to\r\n * equivalents that start \"MPU_\", the prototypes for which are defined in this\r\n * header files.  This will cause the application code to call the MPU_ version\r\n * which wraps the non-MPU version with privilege promoting then demoting code,\r\n * so the kernel code always runs will full privileges.\r\n */\r\n\r\n\r\n#ifndef MPU_PROTOTYPES_H\r\n#define MPU_PROTOTYPES_H\r\n\r\ntypedef struct xTaskGenericNotifyParams\r\n{\r\n    TaskHandle_t xTaskToNotify;\r\n    UBaseType_t uxIndexToNotify;\r\n    uint32_t ulValue;\r\n    eNotifyAction eAction;\r\n    uint32_t * pulPreviousNotificationValue;\r\n} xTaskGenericNotifyParams_t;\r\n\r\ntypedef struct xTaskGenericNotifyWaitParams\r\n{\r\n    UBaseType_t uxIndexToWaitOn;\r\n    uint32_t ulBitsToClearOnEntry;\r\n    uint32_t ulBitsToClearOnExit;\r\n    uint32_t * pulNotificationValue;\r\n    TickType_t xTicksToWait;\r\n} xTaskGenericNotifyWaitParams_t;\r\n\r\ntypedef struct xTimerGenericCommandFromTaskParams\r\n{\r\n    TimerHandle_t xTimer;\r\n    BaseType_t xCommandID;\r\n    TickType_t xOptionalValue;\r\n    BaseType_t * pxHigherPriorityTaskWoken;\r\n    TickType_t xTicksToWait;\r\n} xTimerGenericCommandFromTaskParams_t;\r\n\r\ntypedef struct xEventGroupWaitBitsParams\r\n{\r\n    EventGroupHandle_t xEventGroup;\r\n    EventBits_t uxBitsToWaitFor;\r\n    BaseType_t xClearOnExit;\r\n    BaseType_t xWaitForAllBits;\r\n    TickType_t xTicksToWait;\r\n} xEventGroupWaitBitsParams_t;\r\n\r\n/* MPU versions of task.h API functions. */\r\nvoid MPU_vTaskDelay( const TickType_t xTicksToDelay ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xTaskDelayUntil( TickType_t * const pxPreviousWakeTime,\r\n                                const TickType_t xTimeIncrement ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;\r\nUBaseType_t MPU_uxTaskPriorityGet( const TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;\r\neTaskState MPU_eTaskGetState( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;\r\nvoid MPU_vTaskGetInfo( TaskHandle_t xTask,\r\n                       TaskStatus_t * pxTaskStatus,\r\n                       BaseType_t xGetFreeStackSpace,\r\n                       eTaskState eState ) FREERTOS_SYSTEM_CALL;\r\nvoid MPU_vTaskSuspend( TaskHandle_t xTaskToSuspend ) FREERTOS_SYSTEM_CALL;\r\nvoid MPU_vTaskResume( TaskHandle_t xTaskToResume ) FREERTOS_SYSTEM_CALL;\r\nTickType_t MPU_xTaskGetTickCount( void ) FREERTOS_SYSTEM_CALL;\r\nUBaseType_t MPU_uxTaskGetNumberOfTasks( void ) FREERTOS_SYSTEM_CALL;\r\nUBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;\r\nconfigSTACK_DEPTH_TYPE MPU_uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;\r\nvoid MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask,\r\n                                     TaskHookFunction_t pxHookFunction ) FREERTOS_SYSTEM_CALL;\r\nTaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;\r\nvoid MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet,\r\n                                            BaseType_t xIndex,\r\n                                            void * pvValue ) FREERTOS_SYSTEM_CALL;\r\nvoid * MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery,\r\n                                               BaseType_t xIndex ) FREERTOS_SYSTEM_CALL;\r\nTaskHandle_t MPU_xTaskGetIdleTaskHandle( void ) FREERTOS_SYSTEM_CALL;\r\nUBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray,\r\n                                      const UBaseType_t uxArraySize,\r\n                                      configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime ) FREERTOS_SYSTEM_CALL;\r\nconfigRUN_TIME_COUNTER_TYPE MPU_ulTaskGetRunTimeCounter( const TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;\r\nconfigRUN_TIME_COUNTER_TYPE MPU_ulTaskGetRunTimePercent( const TaskHandle_t xTask ) FREERTOS_SYSTEM_CALL;\r\nconfigRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimeCounter( void ) FREERTOS_SYSTEM_CALL;\r\nconfigRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimePercent( void ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xTaskGenericNotify( TaskHandle_t xTaskToNotify,\r\n                                   UBaseType_t uxIndexToNotify,\r\n                                   uint32_t ulValue,\r\n                                   eNotifyAction eAction,\r\n                                   uint32_t * pulPreviousNotificationValue ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xTaskGenericNotifyEntry( const xTaskGenericNotifyParams_t * pxParams ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xTaskGenericNotifyWait( UBaseType_t uxIndexToWaitOn,\r\n                                       uint32_t ulBitsToClearOnEntry,\r\n                                       uint32_t ulBitsToClearOnExit,\r\n                                       uint32_t * pulNotificationValue,\r\n                                       TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xTaskGenericNotifyWaitEntry( const xTaskGenericNotifyWaitParams_t * pxParams ) FREERTOS_SYSTEM_CALL;\r\nuint32_t MPU_ulTaskGenericNotifyTake( UBaseType_t uxIndexToWaitOn,\r\n                                      BaseType_t xClearCountOnExit,\r\n                                      TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xTaskGenericNotifyStateClear( TaskHandle_t xTask,\r\n                                             UBaseType_t uxIndexToClear ) FREERTOS_SYSTEM_CALL;\r\nuint32_t MPU_ulTaskGenericNotifyValueClear( TaskHandle_t xTask,\r\n                                            UBaseType_t uxIndexToClear,\r\n                                            uint32_t ulBitsToClear ) FREERTOS_SYSTEM_CALL;\r\nvoid MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut,\r\n                                     TickType_t * const pxTicksToWait ) FREERTOS_SYSTEM_CALL;\r\nTaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xTaskGetSchedulerState( void ) FREERTOS_SYSTEM_CALL;\r\n\r\n/* Privileged only wrappers for Task APIs. These are needed so that\r\n * the application can use opaque handles maintained in mpu_wrappers.c\r\n * with all the APIs. */\r\nBaseType_t MPU_xTaskCreate( TaskFunction_t pxTaskCode,\r\n                            const char * const pcName,\r\n                            const uint16_t usStackDepth,\r\n                            void * const pvParameters,\r\n                            UBaseType_t uxPriority,\r\n                            TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION;\r\nTaskHandle_t MPU_xTaskCreateStatic( TaskFunction_t pxTaskCode,\r\n                                    const char * const pcName,\r\n                                    const uint32_t ulStackDepth,\r\n                                    void * const pvParameters,\r\n                                    UBaseType_t uxPriority,\r\n                                    StackType_t * const puxStackBuffer,\r\n                                    StaticTask_t * const pxTaskBuffer ) PRIVILEGED_FUNCTION;\r\nvoid MPU_vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION;\r\nvoid MPU_vTaskPrioritySet( TaskHandle_t xTask,\r\n                           UBaseType_t uxNewPriority ) PRIVILEGED_FUNCTION;\r\nTaskHandle_t MPU_xTaskGetHandle( const char * pcNameToQuery ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xTaskCallApplicationTaskHook( TaskHandle_t xTask,\r\n                                             void * pvParameter ) PRIVILEGED_FUNCTION;\r\nchar * MPU_pcTaskGetName( TaskHandle_t xTaskToQuery ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition,\r\n                                      TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition,\r\n                                            TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION;\r\nvoid MPU_vTaskAllocateMPURegions( TaskHandle_t xTaskToModify,\r\n                                  const MemoryRegion_t * const xRegions ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xTaskGetStaticBuffers( TaskHandle_t xTask,\r\n                                      StackType_t ** ppuxStackBuffer,\r\n                                      StaticTask_t ** ppxTaskBuffer ) PRIVILEGED_FUNCTION;\r\nUBaseType_t MPU_uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r\nUBaseType_t MPU_uxTaskBasePriorityGet( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r\nUBaseType_t MPU_uxTaskBasePriorityGetFromISR( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION;\r\nTaskHookFunction_t MPU_xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify,\r\n                                          UBaseType_t uxIndexToNotify,\r\n                                          uint32_t ulValue,\r\n                                          eNotifyAction eAction,\r\n                                          uint32_t * pulPreviousNotificationValue,\r\n                                          BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r\nvoid MPU_vTaskGenericNotifyGiveFromISR( TaskHandle_t xTaskToNotify,\r\n                                        UBaseType_t uxIndexToNotify,\r\n                                        BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r\n\r\n/* MPU versions of queue.h API functions. */\r\nBaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue,\r\n                                  const void * const pvItemToQueue,\r\n                                  TickType_t xTicksToWait,\r\n                                  const BaseType_t xCopyPosition ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xQueueReceive( QueueHandle_t xQueue,\r\n                              void * const pvBuffer,\r\n                              TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xQueuePeek( QueueHandle_t xQueue,\r\n                           void * const pvBuffer,\r\n                           TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xQueueSemaphoreTake( QueueHandle_t xQueue,\r\n                                    TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;\r\nUBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;\r\nUBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;\r\nTaskHandle_t MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex,\r\n                                         TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) FREERTOS_SYSTEM_CALL;\r\nvoid MPU_vQueueAddToRegistry( QueueHandle_t xQueue,\r\n                              const char * pcName ) FREERTOS_SYSTEM_CALL;\r\nvoid MPU_vQueueUnregisterQueue( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;\r\nconst char * MPU_pcQueueGetName( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore,\r\n                               QueueSetHandle_t xQueueSet ) FREERTOS_SYSTEM_CALL;\r\nQueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet,\r\n                                                const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;\r\nvoid MPU_vQueueSetQueueNumber( QueueHandle_t xQueue,\r\n                               UBaseType_t uxQueueNumber ) FREERTOS_SYSTEM_CALL;\r\nUBaseType_t MPU_uxQueueGetQueueNumber( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;\r\nuint8_t MPU_ucQueueGetQueueType( QueueHandle_t xQueue ) FREERTOS_SYSTEM_CALL;\r\n\r\n/* Privileged only wrappers for Queue APIs. These are needed so that\r\n * the application can use opaque handles maintained in mpu_wrappers.c\r\n * with all the APIs. */\r\nvoid MPU_vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;\r\nQueueHandle_t MPU_xQueueCreateMutex( const uint8_t ucQueueType ) PRIVILEGED_FUNCTION;\r\nQueueHandle_t MPU_xQueueCreateMutexStatic( const uint8_t ucQueueType,\r\n                                           StaticQueue_t * pxStaticQueue ) PRIVILEGED_FUNCTION;\r\nQueueHandle_t MPU_xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount,\r\n                                                 const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION;\r\nQueueHandle_t MPU_xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount,\r\n                                                       const UBaseType_t uxInitialCount,\r\n                                                       StaticQueue_t * pxStaticQueue ) PRIVILEGED_FUNCTION;\r\nQueueHandle_t MPU_xQueueGenericCreate( const UBaseType_t uxQueueLength,\r\n                                       const UBaseType_t uxItemSize,\r\n                                       const uint8_t ucQueueType ) PRIVILEGED_FUNCTION;\r\nQueueHandle_t MPU_xQueueGenericCreateStatic( const UBaseType_t uxQueueLength,\r\n                                             const UBaseType_t uxItemSize,\r\n                                             uint8_t * pucQueueStorage,\r\n                                             StaticQueue_t * pxStaticQueue,\r\n                                             const uint8_t ucQueueType ) PRIVILEGED_FUNCTION;\r\nQueueSetHandle_t MPU_xQueueCreateSet( const UBaseType_t uxEventQueueLength ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore,\r\n                                    QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xQueueGenericReset( QueueHandle_t xQueue,\r\n                                   BaseType_t xNewQueue ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xQueueGenericGetStaticBuffers( QueueHandle_t xQueue,\r\n                                              uint8_t ** ppucQueueStorage,\r\n                                              StaticQueue_t ** ppxStaticQueue ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xQueueGenericSendFromISR( QueueHandle_t xQueue,\r\n                                         const void * const pvItemToQueue,\r\n                                         BaseType_t * const pxHigherPriorityTaskWoken,\r\n                                         const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xQueueGiveFromISR( QueueHandle_t xQueue,\r\n                                  BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xQueuePeekFromISR( QueueHandle_t xQueue,\r\n                                  void * const pvBuffer ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xQueueReceiveFromISR( QueueHandle_t xQueue,\r\n                                     void * const pvBuffer,\r\n                                     BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;\r\nUBaseType_t MPU_uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;\r\nTaskHandle_t MPU_xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION;\r\nQueueSetMemberHandle_t MPU_xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION;\r\n\r\n/* MPU versions of timers.h API functions. */\r\nvoid * MPU_pvTimerGetTimerID( const TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;\r\nvoid MPU_vTimerSetTimerID( TimerHandle_t xTimer,\r\n                           void * pvNewID ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;\r\nTaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xTimerGenericCommandFromTask( TimerHandle_t xTimer,\r\n                                             const BaseType_t xCommandID,\r\n                                             const TickType_t xOptionalValue,\r\n                                             BaseType_t * const pxHigherPriorityTaskWoken,\r\n                                             const TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xTimerGenericCommandFromTaskEntry( const xTimerGenericCommandFromTaskParams_t * pxParams ) FREERTOS_SYSTEM_CALL;\r\nconst char * MPU_pcTimerGetName( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;\r\nvoid MPU_vTimerSetReloadMode( TimerHandle_t xTimer,\r\n                              const BaseType_t uxAutoReload ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xTimerGetReloadMode( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;\r\nUBaseType_t MPU_uxTimerGetReloadMode( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;\r\nTickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;\r\nTickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ) FREERTOS_SYSTEM_CALL;\r\n\r\n/* Privileged only wrappers for Timer APIs. These are needed so that\r\n * the application can use opaque handles maintained in mpu_wrappers.c\r\n * with all the APIs. */\r\nTimerHandle_t MPU_xTimerCreate( const char * const pcTimerName,\r\n                                const TickType_t xTimerPeriodInTicks,\r\n                                const UBaseType_t uxAutoReload,\r\n                                void * const pvTimerID,\r\n                                TimerCallbackFunction_t pxCallbackFunction ) PRIVILEGED_FUNCTION;\r\nTimerHandle_t MPU_xTimerCreateStatic( const char * const pcTimerName,\r\n                                      const TickType_t xTimerPeriodInTicks,\r\n                                      const UBaseType_t uxAutoReload,\r\n                                      void * const pvTimerID,\r\n                                      TimerCallbackFunction_t pxCallbackFunction,\r\n                                      StaticTimer_t * pxTimerBuffer ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xTimerGetStaticBuffer( TimerHandle_t xTimer,\r\n                                      StaticTimer_t ** ppxTimerBuffer ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xTimerGenericCommandFromISR( TimerHandle_t xTimer,\r\n                                            const BaseType_t xCommandID,\r\n                                            const TickType_t xOptionalValue,\r\n                                            BaseType_t * const pxHigherPriorityTaskWoken,\r\n                                            const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r\n\r\n/* MPU versions of event_group.h API functions. */\r\nEventBits_t MPU_xEventGroupWaitBits( EventGroupHandle_t xEventGroup,\r\n                                     const EventBits_t uxBitsToWaitFor,\r\n                                     const BaseType_t xClearOnExit,\r\n                                     const BaseType_t xWaitForAllBits,\r\n                                     TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;\r\nEventBits_t MPU_xEventGroupWaitBitsEntry( const xEventGroupWaitBitsParams_t * pxParams ) FREERTOS_SYSTEM_CALL;\r\nEventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup,\r\n                                      const EventBits_t uxBitsToClear ) FREERTOS_SYSTEM_CALL;\r\nEventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup,\r\n                                    const EventBits_t uxBitsToSet ) FREERTOS_SYSTEM_CALL;\r\nEventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup,\r\n                                 const EventBits_t uxBitsToSet,\r\n                                 const EventBits_t uxBitsToWaitFor,\r\n                                 TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n    UBaseType_t MPU_uxEventGroupGetNumber( void * xEventGroup ) FREERTOS_SYSTEM_CALL;\r\n    void MPU_vEventGroupSetNumber( void * xEventGroup,\r\n                                   UBaseType_t uxEventGroupNumber ) FREERTOS_SYSTEM_CALL;\r\n#endif /* ( configUSE_TRACE_FACILITY == 1 )*/\r\n\r\n/* Privileged only wrappers for Event Group APIs. These are needed so that\r\n * the application can use opaque handles maintained in mpu_wrappers.c\r\n * with all the APIs. */\r\nEventGroupHandle_t MPU_xEventGroupCreate( void ) PRIVILEGED_FUNCTION;\r\nEventGroupHandle_t MPU_xEventGroupCreateStatic( StaticEventGroup_t * pxEventGroupBuffer ) PRIVILEGED_FUNCTION;\r\nvoid MPU_vEventGroupDelete( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xEventGroupGetStaticBuffer( EventGroupHandle_t xEventGroup,\r\n                                           StaticEventGroup_t ** ppxEventGroupBuffer ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup,\r\n                                            const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup,\r\n                                          const EventBits_t uxBitsToSet,\r\n                                          BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r\nEventBits_t MPU_xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup ) PRIVILEGED_FUNCTION;\r\n\r\n/* MPU versions of message/stream_buffer.h API functions. */\r\nsize_t MPU_xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,\r\n                              const void * pvTxData,\r\n                              size_t xDataLengthBytes,\r\n                              TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;\r\nsize_t MPU_xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,\r\n                                 void * pvRxData,\r\n                                 size_t xBufferLengthBytes,\r\n                                 TickType_t xTicksToWait ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;\r\nsize_t MPU_xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;\r\nsize_t MPU_xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;\r\nBaseType_t MPU_xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer,\r\n                                             size_t xTriggerLevel ) FREERTOS_SYSTEM_CALL;\r\nsize_t MPU_xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) FREERTOS_SYSTEM_CALL;\r\n\r\n/* Privileged only wrappers for Stream Buffer APIs. These are needed so that\r\n * the application can use opaque handles maintained in mpu_wrappers.c\r\n * with all the APIs. */\r\nStreamBufferHandle_t MPU_xStreamBufferGenericCreate( size_t xBufferSizeBytes,\r\n                                                     size_t xTriggerLevelBytes,\r\n                                                     BaseType_t xIsMessageBuffer,\r\n                                                     StreamBufferCallbackFunction_t pxSendCompletedCallback,\r\n                                                     StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) PRIVILEGED_FUNCTION;\r\nStreamBufferHandle_t MPU_xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes,\r\n                                                           size_t xTriggerLevelBytes,\r\n                                                           BaseType_t xIsMessageBuffer,\r\n                                                           uint8_t * const pucStreamBufferStorageArea,\r\n                                                           StaticStreamBuffer_t * const pxStaticStreamBuffer,\r\n                                                           StreamBufferCallbackFunction_t pxSendCompletedCallback,\r\n                                                           StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) PRIVILEGED_FUNCTION;\r\nvoid MPU_vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xStreamBufferGetStaticBuffers( StreamBufferHandle_t xStreamBuffers,\r\n                                              uint8_t * ppucStreamBufferStorageArea,\r\n                                              StaticStreamBuffer_t * ppxStaticStreamBuffer ) PRIVILEGED_FUNCTION;\r\nsize_t MPU_xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer,\r\n                                     const void * pvTxData,\r\n                                     size_t xDataLengthBytes,\r\n                                     BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r\nsize_t MPU_xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer,\r\n                                        void * pvRxData,\r\n                                        size_t xBufferLengthBytes,\r\n                                        BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer,\r\n                                                  BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r\nBaseType_t MPU_xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer,\r\n                                                     BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r\n\r\n#endif /* MPU_PROTOTYPES_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/mpu_syscall_numbers.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n#ifndef MPU_SYSCALL_NUMBERS_H\r\n#define MPU_SYSCALL_NUMBERS_H\r\n\r\n/* Numbers assigned to various system calls. */\r\n#define SYSTEM_CALL_xTaskGenericNotify                     0\r\n#define SYSTEM_CALL_xTaskGenericNotifyWait                 1\r\n#define SYSTEM_CALL_xTimerGenericCommandFromTask           2\r\n#define SYSTEM_CALL_xEventGroupWaitBits                    3\r\n#define SYSTEM_CALL_xTaskDelayUntil                        4\r\n#define SYSTEM_CALL_xTaskAbortDelay                        5\r\n#define SYSTEM_CALL_vTaskDelay                             6\r\n#define SYSTEM_CALL_uxTaskPriorityGet                      7\r\n#define SYSTEM_CALL_eTaskGetState                          8\r\n#define SYSTEM_CALL_vTaskGetInfo                           9\r\n#define SYSTEM_CALL_xTaskGetIdleTaskHandle                 10\r\n#define SYSTEM_CALL_vTaskSuspend                           11\r\n#define SYSTEM_CALL_vTaskResume                            12\r\n#define SYSTEM_CALL_xTaskGetTickCount                      13\r\n#define SYSTEM_CALL_uxTaskGetNumberOfTasks                 14\r\n#define SYSTEM_CALL_ulTaskGetRunTimeCounter                15\r\n#define SYSTEM_CALL_ulTaskGetRunTimePercent                16\r\n#define SYSTEM_CALL_ulTaskGetIdleRunTimePercent            17\r\n#define SYSTEM_CALL_ulTaskGetIdleRunTimeCounter            18\r\n#define SYSTEM_CALL_vTaskSetApplicationTaskTag             19\r\n#define SYSTEM_CALL_xTaskGetApplicationTaskTag             20\r\n#define SYSTEM_CALL_vTaskSetThreadLocalStoragePointer      21\r\n#define SYSTEM_CALL_pvTaskGetThreadLocalStoragePointer     22\r\n#define SYSTEM_CALL_uxTaskGetSystemState                   23\r\n#define SYSTEM_CALL_uxTaskGetStackHighWaterMark            24\r\n#define SYSTEM_CALL_uxTaskGetStackHighWaterMark2           25\r\n#define SYSTEM_CALL_xTaskGetCurrentTaskHandle              26\r\n#define SYSTEM_CALL_xTaskGetSchedulerState                 27\r\n#define SYSTEM_CALL_vTaskSetTimeOutState                   28\r\n#define SYSTEM_CALL_xTaskCheckForTimeOut                   29\r\n#define SYSTEM_CALL_ulTaskGenericNotifyTake                30\r\n#define SYSTEM_CALL_xTaskGenericNotifyStateClear           31\r\n#define SYSTEM_CALL_ulTaskGenericNotifyValueClear          32\r\n#define SYSTEM_CALL_xQueueGenericSend                      33\r\n#define SYSTEM_CALL_uxQueueMessagesWaiting                 34\r\n#define SYSTEM_CALL_uxQueueSpacesAvailable                 35\r\n#define SYSTEM_CALL_xQueueReceive                          36\r\n#define SYSTEM_CALL_xQueuePeek                             37\r\n#define SYSTEM_CALL_xQueueSemaphoreTake                    38\r\n#define SYSTEM_CALL_xQueueGetMutexHolder                   39\r\n#define SYSTEM_CALL_xQueueTakeMutexRecursive               40\r\n#define SYSTEM_CALL_xQueueGiveMutexRecursive               41\r\n#define SYSTEM_CALL_xQueueSelectFromSet                    42\r\n#define SYSTEM_CALL_xQueueAddToSet                         43\r\n#define SYSTEM_CALL_vQueueAddToRegistry                    44\r\n#define SYSTEM_CALL_vQueueUnregisterQueue                  45\r\n#define SYSTEM_CALL_pcQueueGetName                         46\r\n#define SYSTEM_CALL_pvTimerGetTimerID                      47\r\n#define SYSTEM_CALL_vTimerSetTimerID                       48\r\n#define SYSTEM_CALL_xTimerIsTimerActive                    49\r\n#define SYSTEM_CALL_xTimerGetTimerDaemonTaskHandle         50\r\n#define SYSTEM_CALL_pcTimerGetName                         51\r\n#define SYSTEM_CALL_vTimerSetReloadMode                    52\r\n#define SYSTEM_CALL_xTimerGetReloadMode                    53\r\n#define SYSTEM_CALL_uxTimerGetReloadMode                   54\r\n#define SYSTEM_CALL_xTimerGetPeriod                        55\r\n#define SYSTEM_CALL_xTimerGetExpiryTime                    56\r\n#define SYSTEM_CALL_xEventGroupClearBits                   57\r\n#define SYSTEM_CALL_xEventGroupSetBits                     58\r\n#define SYSTEM_CALL_xEventGroupSync                        59\r\n#define SYSTEM_CALL_uxEventGroupGetNumber                  60\r\n#define SYSTEM_CALL_vEventGroupSetNumber                   61\r\n#define SYSTEM_CALL_xStreamBufferSend                      62\r\n#define SYSTEM_CALL_xStreamBufferReceive                   63\r\n#define SYSTEM_CALL_xStreamBufferIsFull                    64\r\n#define SYSTEM_CALL_xStreamBufferIsEmpty                   65\r\n#define SYSTEM_CALL_xStreamBufferSpacesAvailable           66\r\n#define SYSTEM_CALL_xStreamBufferBytesAvailable            67\r\n#define SYSTEM_CALL_xStreamBufferSetTriggerLevel           68\r\n#define SYSTEM_CALL_xStreamBufferNextMessageLengthBytes    69\r\n#define NUM_SYSTEM_CALLS                                   70  /* Total number of system calls. */\r\n\r\n#endif /* MPU_SYSCALL_NUMBERS_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/mpu_wrappers.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n#ifndef MPU_WRAPPERS_H\r\n#define MPU_WRAPPERS_H\r\n\r\n/* This file redefines API functions to be called through a wrapper macro, but\r\n * only for ports that are using the MPU. */\r\n#if ( portUSING_MPU_WRAPPERS == 1 )\r\n\r\n/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE will be defined when this file is\r\n * included from queue.c or task.c to prevent it from having an effect within\r\n * those files. */\r\n    #ifndef MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n/*\r\n * Map standard (non MPU) API functions to equivalents that start\r\n * \"MPU_\".  This will cause the application code to call the MPU_\r\n * version, which wraps the non-MPU version with privilege promoting\r\n * then demoting code, so the kernel code always runs will full\r\n * privileges.\r\n */\r\n\r\n/* Map standard task.h API functions to the MPU equivalents. */\r\n        #define vTaskDelay                            MPU_vTaskDelay\r\n        #define xTaskDelayUntil                       MPU_xTaskDelayUntil\r\n        #define xTaskAbortDelay                       MPU_xTaskAbortDelay\r\n        #define uxTaskPriorityGet                     MPU_uxTaskPriorityGet\r\n        #define eTaskGetState                         MPU_eTaskGetState\r\n        #define vTaskGetInfo                          MPU_vTaskGetInfo\r\n        #define vTaskSuspend                          MPU_vTaskSuspend\r\n        #define vTaskResume                           MPU_vTaskResume\r\n        #define xTaskGetTickCount                     MPU_xTaskGetTickCount\r\n        #define uxTaskGetNumberOfTasks                MPU_uxTaskGetNumberOfTasks\r\n        #define uxTaskGetStackHighWaterMark           MPU_uxTaskGetStackHighWaterMark\r\n        #define uxTaskGetStackHighWaterMark2          MPU_uxTaskGetStackHighWaterMark2\r\n        #define vTaskSetApplicationTaskTag            MPU_vTaskSetApplicationTaskTag\r\n        #define xTaskGetApplicationTaskTag            MPU_xTaskGetApplicationTaskTag\r\n        #define vTaskSetThreadLocalStoragePointer     MPU_vTaskSetThreadLocalStoragePointer\r\n        #define pvTaskGetThreadLocalStoragePointer    MPU_pvTaskGetThreadLocalStoragePointer\r\n        #define xTaskGetIdleTaskHandle                MPU_xTaskGetIdleTaskHandle\r\n        #define uxTaskGetSystemState                  MPU_uxTaskGetSystemState\r\n        #define ulTaskGetIdleRunTimeCounter           MPU_ulTaskGetIdleRunTimeCounter\r\n        #define ulTaskGetIdleRunTimePercent           MPU_ulTaskGetIdleRunTimePercent\r\n        #define xTaskGenericNotify                    MPU_xTaskGenericNotify\r\n        #define xTaskGenericNotifyWait                MPU_xTaskGenericNotifyWait\r\n        #define ulTaskGenericNotifyTake               MPU_ulTaskGenericNotifyTake\r\n        #define xTaskGenericNotifyStateClear          MPU_xTaskGenericNotifyStateClear\r\n        #define ulTaskGenericNotifyValueClear         MPU_ulTaskGenericNotifyValueClear\r\n        #define vTaskSetTimeOutState                  MPU_vTaskSetTimeOutState\r\n        #define xTaskCheckForTimeOut                  MPU_xTaskCheckForTimeOut\r\n        #define xTaskGetCurrentTaskHandle             MPU_xTaskGetCurrentTaskHandle\r\n        #define xTaskGetSchedulerState                MPU_xTaskGetSchedulerState\r\n\r\n        #if ( configUSE_MPU_WRAPPERS_V1 == 0 )\r\n            #define ulTaskGetRunTimeCounter           MPU_ulTaskGetRunTimeCounter\r\n            #define ulTaskGetRunTimePercent           MPU_ulTaskGetRunTimePercent\r\n        #endif /* #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */\r\n\r\n/* Privileged only wrappers for Task APIs. These are needed so that\r\n * the application can use opaque handles maintained in mpu_wrappers.c\r\n * with all the APIs. */\r\n        #define xTaskCreate                              MPU_xTaskCreate\r\n        #define xTaskCreateStatic                        MPU_xTaskCreateStatic\r\n        #define vTaskDelete                              MPU_vTaskDelete\r\n        #define vTaskPrioritySet                         MPU_vTaskPrioritySet\r\n        #define xTaskGetHandle                           MPU_xTaskGetHandle\r\n        #define xTaskCallApplicationTaskHook             MPU_xTaskCallApplicationTaskHook\r\n\r\n        #if ( configUSE_MPU_WRAPPERS_V1 == 0 )\r\n            #define pcTaskGetName                        MPU_pcTaskGetName\r\n            #define xTaskCreateRestricted                MPU_xTaskCreateRestricted\r\n            #define xTaskCreateRestrictedStatic          MPU_xTaskCreateRestrictedStatic\r\n            #define vTaskAllocateMPURegions              MPU_vTaskAllocateMPURegions\r\n            #define xTaskGetStaticBuffers                MPU_xTaskGetStaticBuffers\r\n            #define uxTaskPriorityGetFromISR             MPU_uxTaskPriorityGetFromISR\r\n            #define uxTaskBasePriorityGet                MPU_uxTaskBasePriorityGet\r\n            #define uxTaskBasePriorityGetFromISR         MPU_uxTaskBasePriorityGetFromISR\r\n            #define xTaskResumeFromISR                   MPU_xTaskResumeFromISR\r\n            #define xTaskGetApplicationTaskTagFromISR    MPU_xTaskGetApplicationTaskTagFromISR\r\n            #define xTaskGenericNotifyFromISR            MPU_xTaskGenericNotifyFromISR\r\n            #define vTaskGenericNotifyGiveFromISR        MPU_vTaskGenericNotifyGiveFromISR\r\n        #endif /* #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */\r\n\r\n/* Map standard queue.h API functions to the MPU equivalents. */\r\n        #define xQueueGenericSend            MPU_xQueueGenericSend\r\n        #define xQueueReceive                MPU_xQueueReceive\r\n        #define xQueuePeek                   MPU_xQueuePeek\r\n        #define xQueueSemaphoreTake          MPU_xQueueSemaphoreTake\r\n        #define uxQueueMessagesWaiting       MPU_uxQueueMessagesWaiting\r\n        #define uxQueueSpacesAvailable       MPU_uxQueueSpacesAvailable\r\n        #define xQueueGetMutexHolder         MPU_xQueueGetMutexHolder\r\n        #define xQueueTakeMutexRecursive     MPU_xQueueTakeMutexRecursive\r\n        #define xQueueGiveMutexRecursive     MPU_xQueueGiveMutexRecursive\r\n        #define xQueueAddToSet               MPU_xQueueAddToSet\r\n        #define xQueueSelectFromSet          MPU_xQueueSelectFromSet\r\n\r\n        #if ( configQUEUE_REGISTRY_SIZE > 0 )\r\n            #define vQueueAddToRegistry      MPU_vQueueAddToRegistry\r\n            #define vQueueUnregisterQueue    MPU_vQueueUnregisterQueue\r\n            #define pcQueueGetName           MPU_pcQueueGetName\r\n        #endif /* #if ( configQUEUE_REGISTRY_SIZE > 0 ) */\r\n\r\n/* Privileged only wrappers for Queue APIs. These are needed so that\r\n * the application can use opaque handles maintained in mpu_wrappers.c\r\n * with all the APIs. */\r\n        #define vQueueDelete                           MPU_vQueueDelete\r\n        #define xQueueCreateMutex                      MPU_xQueueCreateMutex\r\n        #define xQueueCreateMutexStatic                MPU_xQueueCreateMutexStatic\r\n        #define xQueueCreateCountingSemaphore          MPU_xQueueCreateCountingSemaphore\r\n        #define xQueueCreateCountingSemaphoreStatic    MPU_xQueueCreateCountingSemaphoreStatic\r\n        #define xQueueGenericCreate                    MPU_xQueueGenericCreate\r\n        #define xQueueGenericCreateStatic              MPU_xQueueGenericCreateStatic\r\n        #define xQueueGenericReset                     MPU_xQueueGenericReset\r\n        #define xQueueCreateSet                        MPU_xQueueCreateSet\r\n        #define xQueueRemoveFromSet                    MPU_xQueueRemoveFromSet\r\n\r\n        #if ( configUSE_MPU_WRAPPERS_V1 == 0 )\r\n            #define xQueueGenericGetStaticBuffers      MPU_xQueueGenericGetStaticBuffers\r\n            #define xQueueGenericSendFromISR           MPU_xQueueGenericSendFromISR\r\n            #define xQueueGiveFromISR                  MPU_xQueueGiveFromISR\r\n            #define xQueuePeekFromISR                  MPU_xQueuePeekFromISR\r\n            #define xQueueReceiveFromISR               MPU_xQueueReceiveFromISR\r\n            #define xQueueIsQueueEmptyFromISR          MPU_xQueueIsQueueEmptyFromISR\r\n            #define xQueueIsQueueFullFromISR           MPU_xQueueIsQueueFullFromISR\r\n            #define uxQueueMessagesWaitingFromISR      MPU_uxQueueMessagesWaitingFromISR\r\n            #define xQueueGetMutexHolderFromISR        MPU_xQueueGetMutexHolderFromISR\r\n            #define xQueueSelectFromSetFromISR         MPU_xQueueSelectFromSetFromISR\r\n        #endif /* if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */\r\n\r\n/* Map standard timer.h API functions to the MPU equivalents. */\r\n        #define pvTimerGetTimerID                 MPU_pvTimerGetTimerID\r\n        #define vTimerSetTimerID                  MPU_vTimerSetTimerID\r\n        #define xTimerIsTimerActive               MPU_xTimerIsTimerActive\r\n        #define xTimerGetTimerDaemonTaskHandle    MPU_xTimerGetTimerDaemonTaskHandle\r\n        #define xTimerGenericCommandFromTask      MPU_xTimerGenericCommandFromTask\r\n        #define pcTimerGetName                    MPU_pcTimerGetName\r\n        #define vTimerSetReloadMode               MPU_vTimerSetReloadMode\r\n        #define uxTimerGetReloadMode              MPU_uxTimerGetReloadMode\r\n        #define xTimerGetPeriod                   MPU_xTimerGetPeriod\r\n        #define xTimerGetExpiryTime               MPU_xTimerGetExpiryTime\r\n\r\n/* Privileged only wrappers for Timer APIs. These are needed so that\r\n * the application can use opaque handles maintained in mpu_wrappers.c\r\n * with all the APIs. */\r\n        #if ( configUSE_MPU_WRAPPERS_V1 == 0 )\r\n            #define xTimerGetReloadMode            MPU_xTimerGetReloadMode\r\n            #define xTimerCreate                   MPU_xTimerCreate\r\n            #define xTimerCreateStatic             MPU_xTimerCreateStatic\r\n            #define xTimerGetStaticBuffer          MPU_xTimerGetStaticBuffer\r\n            #define xTimerGenericCommandFromISR    MPU_xTimerGenericCommandFromISR\r\n        #endif /* #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */\r\n\r\n/* Map standard event_group.h API functions to the MPU equivalents. */\r\n        #define xEventGroupWaitBits          MPU_xEventGroupWaitBits\r\n        #define xEventGroupClearBits         MPU_xEventGroupClearBits\r\n        #define xEventGroupSetBits           MPU_xEventGroupSetBits\r\n        #define xEventGroupSync              MPU_xEventGroupSync\r\n\r\n        #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) )\r\n            #define uxEventGroupGetNumber    MPU_uxEventGroupGetNumber\r\n            #define vEventGroupSetNumber     MPU_vEventGroupSetNumber\r\n        #endif /* #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */\r\n\r\n/* Privileged only wrappers for Event Group APIs. These are needed so that\r\n * the application can use opaque handles maintained in mpu_wrappers.c\r\n * with all the APIs. */\r\n        #define xEventGroupCreate                  MPU_xEventGroupCreate\r\n        #define xEventGroupCreateStatic            MPU_xEventGroupCreateStatic\r\n        #define vEventGroupDelete                  MPU_vEventGroupDelete\r\n\r\n        #if ( configUSE_MPU_WRAPPERS_V1 == 0 )\r\n            #define xEventGroupGetStaticBuffer     MPU_xEventGroupGetStaticBuffer\r\n            #define xEventGroupClearBitsFromISR    MPU_xEventGroupClearBitsFromISR\r\n            #define xEventGroupSetBitsFromISR      MPU_xEventGroupSetBitsFromISR\r\n            #define xEventGroupGetBitsFromISR      MPU_xEventGroupGetBitsFromISR\r\n        #endif /* #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */\r\n\r\n/* Map standard message/stream_buffer.h API functions to the MPU\r\n * equivalents. */\r\n        #define xStreamBufferSend                      MPU_xStreamBufferSend\r\n        #define xStreamBufferReceive                   MPU_xStreamBufferReceive\r\n        #define xStreamBufferIsFull                    MPU_xStreamBufferIsFull\r\n        #define xStreamBufferIsEmpty                   MPU_xStreamBufferIsEmpty\r\n        #define xStreamBufferSpacesAvailable           MPU_xStreamBufferSpacesAvailable\r\n        #define xStreamBufferBytesAvailable            MPU_xStreamBufferBytesAvailable\r\n        #define xStreamBufferSetTriggerLevel           MPU_xStreamBufferSetTriggerLevel\r\n        #define xStreamBufferNextMessageLengthBytes    MPU_xStreamBufferNextMessageLengthBytes\r\n\r\n/* Privileged only wrappers for Stream Buffer APIs. These are needed so that\r\n * the application can use opaque handles maintained in mpu_wrappers.c\r\n * with all the APIs. */\r\n\r\n        #define xStreamBufferGenericCreate                  MPU_xStreamBufferGenericCreate\r\n        #define xStreamBufferGenericCreateStatic            MPU_xStreamBufferGenericCreateStatic\r\n        #define vStreamBufferDelete                         MPU_vStreamBufferDelete\r\n        #define xStreamBufferReset                          MPU_xStreamBufferReset\r\n\r\n        #if ( configUSE_MPU_WRAPPERS_V1 == 0 )\r\n            #define xStreamBufferGetStaticBuffers           MPU_xStreamBufferGetStaticBuffers\r\n            #define xStreamBufferSendFromISR                MPU_xStreamBufferSendFromISR\r\n            #define xStreamBufferReceiveFromISR             MPU_xStreamBufferReceiveFromISR\r\n            #define xStreamBufferSendCompletedFromISR       MPU_xStreamBufferSendCompletedFromISR\r\n            #define xStreamBufferReceiveCompletedFromISR    MPU_xStreamBufferReceiveCompletedFromISR\r\n        #endif /* #if ( configUSE_MPU_WRAPPERS_V1 == 0 ) */\r\n\r\n/* Remove the privileged function macro, but keep the PRIVILEGED_DATA\r\n * macro so applications can place data in privileged access sections\r\n * (useful when using statically allocated objects). */\r\n        #define PRIVILEGED_FUNCTION\r\n        #define PRIVILEGED_DATA    __attribute__( ( section( \"privileged_data\" ) ) )\r\n        #define FREERTOS_SYSTEM_CALL\r\n\r\n\r\n        #if ( ( configUSE_MPU_WRAPPERS_V1 == 0 ) && ( configENABLE_ACCESS_CONTROL_LIST == 1 ) )\r\n\r\n            #define vGrantAccessToTask( xTask, xTaskToGrantAccess )                        vGrantAccessToKernelObject( ( xTask ), ( int32_t ) ( xTaskToGrantAccess ) )\r\n            #define vRevokeAccessToTask( xTask, xTaskToRevokeAccess )                      vRevokeAccessToKernelObject( ( xTask ), ( int32_t ) ( xTaskToRevokeAccess ) )\r\n\r\n            #define vGrantAccessToSemaphore( xTask, xSemaphoreToGrantAccess )              vGrantAccessToKernelObject( ( xTask ), ( int32_t ) ( xSemaphoreToGrantAccess ) )\r\n            #define vRevokeAccessToSemaphore( xTask, xSemaphoreToRevokeAccess )            vRevokeAccessToKernelObject( ( xTask ), ( int32_t ) ( xSemaphoreToRevokeAccess ) )\r\n\r\n            #define vGrantAccessToQueue( xTask, xQueueToGrantAccess )                      vGrantAccessToKernelObject( ( xTask ), ( int32_t ) ( xQueueToGrantAccess ) )\r\n            #define vRevokeAccessToQueue( xTask, xQueueToRevokeAccess )                    vRevokeAccessToKernelObject( ( xTask ), ( int32_t ) ( xQueueToRevokeAccess ) )\r\n\r\n            #define vGrantAccessToQueueSet( xTask, xQueueSetToGrantAccess )                vGrantAccessToKernelObject( ( xTask ), ( int32_t ) ( xQueueSetToGrantAccess ) )\r\n            #define vRevokeAccessToQueueSet( xTask, xQueueSetToRevokeAccess )              vRevokeAccessToKernelObject( ( xTask ), ( int32_t ) ( xQueueSetToRevokeAccess ) )\r\n\r\n            #define vGrantAccessToEventGroup( xTask, xEventGroupToGrantAccess )            vGrantAccessToKernelObject( ( xTask ), ( int32_t ) ( xEventGroupToGrantAccess ) )\r\n            #define vRevokeAccessToEventGroup( xTask, xEventGroupToRevokeAccess )          vRevokeAccessToKernelObject( ( xTask ), ( int32_t ) ( xEventGroupToRevokeAccess ) )\r\n\r\n            #define vGrantAccessToStreamBuffer( xTask, xStreamBufferToGrantAccess )        vGrantAccessToKernelObject( ( xTask ), ( int32_t ) ( xStreamBufferToGrantAccess ) )\r\n            #define vRevokeAccessToStreamBuffer( xTask, xStreamBufferToRevokeAccess )      vRevokeAccessToKernelObject( ( xTask ), ( int32_t ) ( xStreamBufferToRevokeAccess ) )\r\n\r\n            #define vGrantAccessToMessageBuffer( xTask, xMessageBufferToGrantAccess )      vGrantAccessToKernelObject( ( xTask ), ( int32_t ) ( xMessageBufferToGrantAccess ) )\r\n            #define vRevokeAccessToMessageBuffer( xTask, xMessageBufferToRevokeAccess )    vRevokeAccessToKernelObject( ( xTask ), ( int32_t ) ( xMessageBufferToRevokeAccess ) )\r\n\r\n            #define vGrantAccessToTimer( xTask, xTimerToGrantAccess )                      vGrantAccessToKernelObject( ( xTask ), ( int32_t ) ( xTimerToGrantAccess ) )\r\n            #define vRevokeAccessToTimer( xTask, xTimerToRevokeAccess )                    vRevokeAccessToKernelObject( ( xTask ), ( int32_t ) ( xTimerToRevokeAccess ) )\r\n\r\n        #endif /* #if ( ( configUSE_MPU_WRAPPERS_V1 == 0 ) && ( configENABLE_ACCESS_CONTROL_LIST == 1 ) ) */\r\n\r\n    #else /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */\r\n\r\n/* Ensure API functions go in the privileged execution section. */\r\n        #define PRIVILEGED_FUNCTION     __attribute__( ( section( \"privileged_functions\" ) ) )\r\n        #define PRIVILEGED_DATA         __attribute__( ( section( \"privileged_data\" ) ) )\r\n        #define FREERTOS_SYSTEM_CALL    __attribute__( ( section( \"freertos_system_calls\" ) ) )\r\n\r\n    #endif /* MPU_WRAPPERS_INCLUDED_FROM_API_FILE */\r\n\r\n#else /* portUSING_MPU_WRAPPERS */\r\n\r\n    #define PRIVILEGED_FUNCTION\r\n    #define PRIVILEGED_DATA\r\n    #define FREERTOS_SYSTEM_CALL\r\n\r\n#endif /* portUSING_MPU_WRAPPERS */\r\n\r\n\r\n#endif /* MPU_WRAPPERS_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/newlib-freertos.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n#ifndef INC_NEWLIB_FREERTOS_H\r\n#define INC_NEWLIB_FREERTOS_H\r\n\r\n/* Note Newlib support has been included by popular demand, but is not\r\n * used by the FreeRTOS maintainers themselves.  FreeRTOS is not\r\n * responsible for resulting newlib operation.  User must be familiar with\r\n * newlib and must provide system-wide implementations of the necessary\r\n * stubs. Be warned that (at the time of writing) the current newlib design\r\n * implements a system-wide malloc() that must be provided with locks.\r\n *\r\n * See the third party link http://www.nadler.com/embedded/newlibAndFreeRTOS.html\r\n * for additional information. */\r\n\r\n#include <reent.h>\r\n\r\n#define configUSE_C_RUNTIME_TLS_SUPPORT    1\r\n\r\n#ifndef configTLS_BLOCK_TYPE\r\n    #define configTLS_BLOCK_TYPE           struct _reent\r\n#endif\r\n\r\n#ifndef configINIT_TLS_BLOCK\r\n    #define configINIT_TLS_BLOCK( xTLSBlock, pxTopOfStack )    _REENT_INIT_PTR( &( xTLSBlock ) )\r\n#endif\r\n\r\n#ifndef configSET_TLS_BLOCK\r\n    #define configSET_TLS_BLOCK( xTLSBlock )    ( _impure_ptr = &( xTLSBlock ) )\r\n#endif\r\n\r\n#ifndef configDEINIT_TLS_BLOCK\r\n    #define configDEINIT_TLS_BLOCK( xTLSBlock )    _reclaim_reent( &( xTLSBlock ) )\r\n#endif\r\n\r\n#endif /* INC_NEWLIB_FREERTOS_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/picolibc-freertos.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n#ifndef INC_PICOLIBC_FREERTOS_H\r\n#define INC_PICOLIBC_FREERTOS_H\r\n\r\n/* Use picolibc TLS support to allocate space for __thread variables,\r\n * initialize them at thread creation and set the TLS context at\r\n * thread switch time.\r\n *\r\n * See the picolibc TLS docs:\r\n * https://github.com/picolibc/picolibc/blob/main/doc/tls.md\r\n * for additional information. */\r\n\r\n#include <picotls.h>\r\n\r\n#define configUSE_C_RUNTIME_TLS_SUPPORT    1\r\n\r\n#define configTLS_BLOCK_TYPE               void *\r\n\r\n#define picolibcTLS_SIZE                   ( ( portPOINTER_SIZE_TYPE ) _tls_size() )\r\n#define picolibcSTACK_ALIGNMENT_MASK       ( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK )\r\n\r\n#if __PICOLIBC_MAJOR__ > 1 || __PICOLIBC_MINOR__ >= 8\r\n\r\n/* Picolibc 1.8 and newer have explicit alignment values provided\r\n * by the _tls_align() inline */\r\n    #define picolibcTLS_ALIGNMENT_MASK    ( ( portPOINTER_SIZE_TYPE ) ( _tls_align() - 1 ) )\r\n#else\r\n\r\n/* For older Picolibc versions, use the general port alignment value */\r\n    #define picolibcTLS_ALIGNMENT_MASK    ( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK )\r\n#endif\r\n\r\n/* Allocate thread local storage block off the end of the\r\n * stack. The picolibcTLS_SIZE macro returns the size (in\r\n * bytes) of the total TLS area used by the application.\r\n * Calculate the top of stack address. */\r\n#if ( portSTACK_GROWTH < 0 )\r\n\r\n    #define configINIT_TLS_BLOCK( xTLSBlock, pxTopOfStack )                                  \\\r\n    do {                                                                                     \\\r\n        xTLSBlock = ( void * ) ( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) -              \\\r\n                                   picolibcTLS_SIZE ) &                                      \\\r\n                                 ~picolibcTLS_ALIGNMENT_MASK );                              \\\r\n        pxTopOfStack = ( StackType_t * ) ( ( ( ( portPOINTER_SIZE_TYPE ) xTLSBlock ) - 1 ) & \\\r\n                                           ~picolibcSTACK_ALIGNMENT_MASK );                  \\\r\n        _init_tls( xTLSBlock );                                                              \\\r\n    } while( 0 )\r\n#else /* portSTACK_GROWTH */\r\n    #define configINIT_TLS_BLOCK( xTLSBlock, pxTopOfStack )                                          \\\r\n    do {                                                                                             \\\r\n        xTLSBlock = ( void * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack +                          \\\r\n                                   picolibcTLS_ALIGNMENT_MASK ) & ~picolibcTLS_ALIGNMENT_MASK );     \\\r\n        pxTopOfStack = ( StackType_t * ) ( ( ( ( ( portPOINTER_SIZE_TYPE ) xTLSBlock ) +             \\\r\n                                               picolibcTLS_SIZE ) + picolibcSTACK_ALIGNMENT_MASK ) & \\\r\n                                           ~picolibcSTACK_ALIGNMENT_MASK );                          \\\r\n        _init_tls( xTLSBlock );                                                                      \\\r\n    } while( 0 )\r\n#endif /* portSTACK_GROWTH */\r\n\r\n#define configSET_TLS_BLOCK( xTLSBlock )    _set_tls( xTLSBlock )\r\n\r\n#define configDEINIT_TLS_BLOCK( xTLSBlock )\r\n\r\n#endif /* INC_PICOLIBC_FREERTOS_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/portable.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n/*-----------------------------------------------------------\r\n* Portable layer API.  Each function must be defined for each port.\r\n*----------------------------------------------------------*/\r\n\r\n#ifndef PORTABLE_H\r\n#define PORTABLE_H\r\n\r\n/* Each FreeRTOS port has a unique portmacro.h header file.  Originally a\r\n * pre-processor definition was used to ensure the pre-processor found the correct\r\n * portmacro.h file for the port being used.  That scheme was deprecated in favour\r\n * of setting the compiler's include path such that it found the correct\r\n * portmacro.h file - removing the need for the constant and allowing the\r\n * portmacro.h file to be located anywhere in relation to the port being used.\r\n * Purely for reasons of backward compatibility the old method is still valid, but\r\n * to make it clear that new projects should not use it, support for the port\r\n * specific constants has been moved into the deprecated_definitions.h header\r\n * file. */\r\n#include \"deprecated_definitions.h\"\r\n\r\n/* If portENTER_CRITICAL is not defined then including deprecated_definitions.h\r\n * did not result in a portmacro.h header file being included - and it should be\r\n * included here.  In this case the path to the correct portmacro.h header file\r\n * must be set in the compiler's include path. */\r\n#ifndef portENTER_CRITICAL\r\n    #include \"portmacro.h\"\r\n#endif\r\n\r\n#if portBYTE_ALIGNMENT == 32\r\n    #define portBYTE_ALIGNMENT_MASK    ( 0x001f )\r\n#elif portBYTE_ALIGNMENT == 16\r\n    #define portBYTE_ALIGNMENT_MASK    ( 0x000f )\r\n#elif portBYTE_ALIGNMENT == 8\r\n    #define portBYTE_ALIGNMENT_MASK    ( 0x0007 )\r\n#elif portBYTE_ALIGNMENT == 4\r\n    #define portBYTE_ALIGNMENT_MASK    ( 0x0003 )\r\n#elif portBYTE_ALIGNMENT == 2\r\n    #define portBYTE_ALIGNMENT_MASK    ( 0x0001 )\r\n#elif portBYTE_ALIGNMENT == 1\r\n    #define portBYTE_ALIGNMENT_MASK    ( 0x0000 )\r\n#else /* if portBYTE_ALIGNMENT == 32 */\r\n    #error \"Invalid portBYTE_ALIGNMENT definition\"\r\n#endif /* if portBYTE_ALIGNMENT == 32 */\r\n\r\n#ifndef portUSING_MPU_WRAPPERS\r\n    #define portUSING_MPU_WRAPPERS    0\r\n#endif\r\n\r\n#ifndef portNUM_CONFIGURABLE_REGIONS\r\n    #define portNUM_CONFIGURABLE_REGIONS    1\r\n#endif\r\n\r\n#ifndef portHAS_STACK_OVERFLOW_CHECKING\r\n    #define portHAS_STACK_OVERFLOW_CHECKING    0\r\n#endif\r\n\r\n#ifndef portARCH_NAME\r\n    #define portARCH_NAME    NULL\r\n#endif\r\n\r\n#ifndef configSTACK_ALLOCATION_FROM_SEPARATE_HEAP\r\n    /* Defaults to 0 for backward compatibility. */\r\n    #define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP    0\r\n#endif\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    extern \"C\" {\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n#include \"mpu_wrappers.h\"\r\n\r\n/*\r\n * Setup the stack of a new task so it is ready to be placed under the\r\n * scheduler control.  The registers have to be placed on the stack in\r\n * the order that the port expects to find them.\r\n *\r\n */\r\n#if ( portUSING_MPU_WRAPPERS == 1 )\r\n    #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 )\r\n        StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,\r\n                                             StackType_t * pxEndOfStack,\r\n                                             TaskFunction_t pxCode,\r\n                                             void * pvParameters,\r\n                                             BaseType_t xRunPrivileged,\r\n                                             xMPU_SETTINGS * xMPUSettings ) PRIVILEGED_FUNCTION;\r\n    #else\r\n        StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,\r\n                                             TaskFunction_t pxCode,\r\n                                             void * pvParameters,\r\n                                             BaseType_t xRunPrivileged,\r\n                                             xMPU_SETTINGS * xMPUSettings ) PRIVILEGED_FUNCTION;\r\n    #endif /* if ( portHAS_STACK_OVERFLOW_CHECKING == 1 ) */\r\n#else /* if ( portUSING_MPU_WRAPPERS == 1 ) */\r\n    #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 )\r\n        StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,\r\n                                             StackType_t * pxEndOfStack,\r\n                                             TaskFunction_t pxCode,\r\n                                             void * pvParameters ) PRIVILEGED_FUNCTION;\r\n    #else\r\n        StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,\r\n                                             TaskFunction_t pxCode,\r\n                                             void * pvParameters ) PRIVILEGED_FUNCTION;\r\n    #endif\r\n#endif /* if ( portUSING_MPU_WRAPPERS == 1 ) */\r\n\r\n/* Used by heap_5.c to define the start address and size of each memory region\r\n * that together comprise the total FreeRTOS heap space. */\r\ntypedef struct HeapRegion\r\n{\r\n    uint8_t * pucStartAddress;\r\n    size_t xSizeInBytes;\r\n} HeapRegion_t;\r\n\r\n/* Used to pass information about the heap out of vPortGetHeapStats(). */\r\ntypedef struct xHeapStats\r\n{\r\n    size_t xAvailableHeapSpaceInBytes;      /* The total heap size currently available - this is the sum of all the free blocks, not the largest block that can be allocated. */\r\n    size_t xSizeOfLargestFreeBlockInBytes;  /* The maximum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */\r\n    size_t xSizeOfSmallestFreeBlockInBytes; /* The minimum size, in bytes, of all the free blocks within the heap at the time vPortGetHeapStats() is called. */\r\n    size_t xNumberOfFreeBlocks;             /* The number of free memory blocks within the heap at the time vPortGetHeapStats() is called. */\r\n    size_t xMinimumEverFreeBytesRemaining;  /* The minimum amount of total free memory (sum of all free blocks) there has been in the heap since the system booted. */\r\n    size_t xNumberOfSuccessfulAllocations;  /* The number of calls to pvPortMalloc() that have returned a valid memory block. */\r\n    size_t xNumberOfSuccessfulFrees;        /* The number of calls to vPortFree() that has successfully freed a block of memory. */\r\n} HeapStats_t;\r\n\r\n/*\r\n * Used to define multiple heap regions for use by heap_5.c.  This function\r\n * must be called before any calls to pvPortMalloc() - not creating a task,\r\n * queue, semaphore, mutex, software timer, event group, etc. will result in\r\n * pvPortMalloc being called.\r\n *\r\n * pxHeapRegions passes in an array of HeapRegion_t structures - each of which\r\n * defines a region of memory that can be used as the heap.  The array is\r\n * terminated by a HeapRegions_t structure that has a size of 0.  The region\r\n * with the lowest start address must appear first in the array.\r\n */\r\nvoid vPortDefineHeapRegions( const HeapRegion_t * const pxHeapRegions ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Returns a HeapStats_t structure filled with information about the current\r\n * heap state.\r\n */\r\nvoid vPortGetHeapStats( HeapStats_t * pxHeapStats );\r\n\r\n/*\r\n * Map to the memory management routines required for the port.\r\n */\r\nvoid * pvPortMalloc( size_t xSize ) PRIVILEGED_FUNCTION;\r\nvoid * pvPortCalloc( size_t xNum,\r\n                     size_t xSize ) PRIVILEGED_FUNCTION;\r\nvoid vPortFree( void * pv ) PRIVILEGED_FUNCTION;\r\nvoid vPortInitialiseBlocks( void ) PRIVILEGED_FUNCTION;\r\nsize_t xPortGetFreeHeapSize( void ) PRIVILEGED_FUNCTION;\r\nsize_t xPortGetMinimumEverFreeHeapSize( void ) PRIVILEGED_FUNCTION;\r\n\r\n#if ( configSTACK_ALLOCATION_FROM_SEPARATE_HEAP == 1 )\r\n    void * pvPortMallocStack( size_t xSize ) PRIVILEGED_FUNCTION;\r\n    void vPortFreeStack( void * pv ) PRIVILEGED_FUNCTION;\r\n#else\r\n    #define pvPortMallocStack    pvPortMalloc\r\n    #define vPortFreeStack       vPortFree\r\n#endif\r\n\r\n#if ( configUSE_MALLOC_FAILED_HOOK == 1 )\r\n\r\n/**\r\n * task.h\r\n * @code{c}\r\n * void vApplicationMallocFailedHook( void )\r\n * @endcode\r\n *\r\n * This hook function is called when allocation failed.\r\n */\r\n    void vApplicationMallocFailedHook( void );\r\n#endif\r\n\r\n/*\r\n * Setup the hardware ready for the scheduler to take control.  This generally\r\n * sets up a tick interrupt and sets timers for the correct tick frequency.\r\n */\r\nBaseType_t xPortStartScheduler( void ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Undo any hardware/ISR setup that was performed by xPortStartScheduler() so\r\n * the hardware is left in its original condition after the scheduler stops\r\n * executing.\r\n */\r\nvoid vPortEndScheduler( void ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * The structures and methods of manipulating the MPU are contained within the\r\n * port layer.\r\n *\r\n * Fills the xMPUSettings structure with the memory region information\r\n * contained in xRegions.\r\n */\r\n#if ( portUSING_MPU_WRAPPERS == 1 )\r\n    struct xMEMORY_REGION;\r\n    void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings,\r\n                                    const struct xMEMORY_REGION * const xRegions,\r\n                                    StackType_t * pxBottomOfStack,\r\n                                    uint32_t ulStackDepth ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * @brief Checks if the calling task is authorized to access the given buffer.\r\n *\r\n * @param pvBuffer The buffer which the calling task wants to access.\r\n * @param ulBufferLength The length of the pvBuffer.\r\n * @param ulAccessRequested The permissions that the calling task wants.\r\n *\r\n * @return pdTRUE if the calling task is authorized to access the buffer,\r\n *         pdFALSE otherwise.\r\n */\r\n#if ( portUSING_MPU_WRAPPERS == 1 )\r\n    BaseType_t xPortIsAuthorizedToAccessBuffer( const void * pvBuffer,\r\n                                                uint32_t ulBufferLength,\r\n                                                uint32_t ulAccessRequested ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * @brief Checks if the calling task is authorized to access the given kernel object.\r\n *\r\n * @param lInternalIndexOfKernelObject The index of the kernel object in the kernel\r\n *                                     object handle pool.\r\n *\r\n * @return pdTRUE if the calling task is authorized to access the kernel object,\r\n *         pdFALSE otherwise.\r\n */\r\n#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) )\r\n\r\n    BaseType_t xPortIsAuthorizedToAccessKernelObject( int32_t lInternalIndexOfKernelObject ) PRIVILEGED_FUNCTION;\r\n\r\n#endif\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    }\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n#endif /* PORTABLE_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/projdefs.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n#ifndef PROJDEFS_H\r\n#define PROJDEFS_H\r\n\r\n/*\r\n * Defines the prototype to which task functions must conform.  Defined in this\r\n * file to ensure the type is known before portable.h is included.\r\n */\r\ntypedef void (* TaskFunction_t)( void * arg );\r\n\r\n/* Converts a time in milliseconds to a time in ticks.  This macro can be\r\n * overridden by a macro of the same name defined in FreeRTOSConfig.h in case the\r\n * definition here is not suitable for your application. */\r\n#ifndef pdMS_TO_TICKS\r\n    #define pdMS_TO_TICKS( xTimeInMs )    ( ( TickType_t ) ( ( ( uint64_t ) ( xTimeInMs ) * ( uint64_t ) configTICK_RATE_HZ ) / ( uint64_t ) 1000U ) )\r\n#endif\r\n\r\n/* Converts a time in ticks to a time in milliseconds.  This macro can be\r\n * overridden by a macro of the same name defined in FreeRTOSConfig.h in case the\r\n * definition here is not suitable for your application. */\r\n#ifndef pdTICKS_TO_MS\r\n    #define pdTICKS_TO_MS( xTimeInTicks )    ( ( TickType_t ) ( ( ( uint64_t ) ( xTimeInTicks ) * ( uint64_t ) 1000U ) / ( uint64_t ) configTICK_RATE_HZ ) )\r\n#endif\r\n\r\n#define pdFALSE                                  ( ( BaseType_t ) 0 )\r\n#define pdTRUE                                   ( ( BaseType_t ) 1 )\r\n#define pdFALSE_SIGNED                           ( ( BaseType_t ) 0 )\r\n#define pdTRUE_SIGNED                            ( ( BaseType_t ) 1 )\r\n#define pdFALSE_UNSIGNED                         ( ( UBaseType_t ) 0 )\r\n#define pdTRUE_UNSIGNED                          ( ( UBaseType_t ) 1 )\r\n\r\n#define pdPASS                                   ( pdTRUE )\r\n#define pdFAIL                                   ( pdFALSE )\r\n#define errQUEUE_EMPTY                           ( ( BaseType_t ) 0 )\r\n#define errQUEUE_FULL                            ( ( BaseType_t ) 0 )\r\n\r\n/* FreeRTOS error definitions. */\r\n#define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY    ( -1 )\r\n#define errQUEUE_BLOCKED                         ( -4 )\r\n#define errQUEUE_YIELD                           ( -5 )\r\n\r\n/* Macros used for basic data corruption checks. */\r\n#ifndef configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES\r\n    #define configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES    0\r\n#endif\r\n\r\n#if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS )\r\n    #define pdINTEGRITY_CHECK_VALUE    0x5a5a\r\n#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_32_BITS )\r\n    #define pdINTEGRITY_CHECK_VALUE    0x5a5a5a5aUL\r\n#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_64_BITS )\r\n    #define pdINTEGRITY_CHECK_VALUE    0x5a5a5a5a5a5a5a5aULL\r\n#else\r\n    #error configTICK_TYPE_WIDTH_IN_BITS set to unsupported tick type width.\r\n#endif\r\n\r\n/* The following errno values are used by FreeRTOS+ components, not FreeRTOS\r\n * itself. */\r\n#define pdFREERTOS_ERRNO_NONE             0   /* No errors */\r\n#define pdFREERTOS_ERRNO_ENOENT           2   /* No such file or directory */\r\n#define pdFREERTOS_ERRNO_EINTR            4   /* Interrupted system call */\r\n#define pdFREERTOS_ERRNO_EIO              5   /* I/O error */\r\n#define pdFREERTOS_ERRNO_ENXIO            6   /* No such device or address */\r\n#define pdFREERTOS_ERRNO_EBADF            9   /* Bad file number */\r\n#define pdFREERTOS_ERRNO_EAGAIN           11  /* No more processes */\r\n#define pdFREERTOS_ERRNO_EWOULDBLOCK      11  /* Operation would block */\r\n#define pdFREERTOS_ERRNO_ENOMEM           12  /* Not enough memory */\r\n#define pdFREERTOS_ERRNO_EACCES           13  /* Permission denied */\r\n#define pdFREERTOS_ERRNO_EFAULT           14  /* Bad address */\r\n#define pdFREERTOS_ERRNO_EBUSY            16  /* Mount device busy */\r\n#define pdFREERTOS_ERRNO_EEXIST           17  /* File exists */\r\n#define pdFREERTOS_ERRNO_EXDEV            18  /* Cross-device link */\r\n#define pdFREERTOS_ERRNO_ENODEV           19  /* No such device */\r\n#define pdFREERTOS_ERRNO_ENOTDIR          20  /* Not a directory */\r\n#define pdFREERTOS_ERRNO_EISDIR           21  /* Is a directory */\r\n#define pdFREERTOS_ERRNO_EINVAL           22  /* Invalid argument */\r\n#define pdFREERTOS_ERRNO_ENOSPC           28  /* No space left on device */\r\n#define pdFREERTOS_ERRNO_ESPIPE           29  /* Illegal seek */\r\n#define pdFREERTOS_ERRNO_EROFS            30  /* Read only file system */\r\n#define pdFREERTOS_ERRNO_EUNATCH          42  /* Protocol driver not attached */\r\n#define pdFREERTOS_ERRNO_EBADE            50  /* Invalid exchange */\r\n#define pdFREERTOS_ERRNO_EFTYPE           79  /* Inappropriate file type or format */\r\n#define pdFREERTOS_ERRNO_ENMFILE          89  /* No more files */\r\n#define pdFREERTOS_ERRNO_ENOTEMPTY        90  /* Directory not empty */\r\n#define pdFREERTOS_ERRNO_ENAMETOOLONG     91  /* File or path name too long */\r\n#define pdFREERTOS_ERRNO_EOPNOTSUPP       95  /* Operation not supported on transport endpoint */\r\n#define pdFREERTOS_ERRNO_EAFNOSUPPORT     97  /* Address family not supported by protocol */\r\n#define pdFREERTOS_ERRNO_ENOBUFS          105 /* No buffer space available */\r\n#define pdFREERTOS_ERRNO_ENOPROTOOPT      109 /* Protocol not available */\r\n#define pdFREERTOS_ERRNO_EADDRINUSE       112 /* Address already in use */\r\n#define pdFREERTOS_ERRNO_ETIMEDOUT        116 /* Connection timed out */\r\n#define pdFREERTOS_ERRNO_EINPROGRESS      119 /* Connection already in progress */\r\n#define pdFREERTOS_ERRNO_EALREADY         120 /* Socket already connected */\r\n#define pdFREERTOS_ERRNO_EADDRNOTAVAIL    125 /* Address not available */\r\n#define pdFREERTOS_ERRNO_EISCONN          127 /* Socket is already connected */\r\n#define pdFREERTOS_ERRNO_ENOTCONN         128 /* Socket is not connected */\r\n#define pdFREERTOS_ERRNO_ENOMEDIUM        135 /* No medium inserted */\r\n#define pdFREERTOS_ERRNO_EILSEQ           138 /* An invalid UTF-16 sequence was encountered. */\r\n#define pdFREERTOS_ERRNO_ECANCELED        140 /* Operation canceled. */\r\n\r\n/* The following endian values are used by FreeRTOS+ components, not FreeRTOS\r\n * itself. */\r\n#define pdFREERTOS_LITTLE_ENDIAN          0\r\n#define pdFREERTOS_BIG_ENDIAN             1\r\n\r\n/* Re-defining endian values for generic naming. */\r\n#define pdLITTLE_ENDIAN                   pdFREERTOS_LITTLE_ENDIAN\r\n#define pdBIG_ENDIAN                      pdFREERTOS_BIG_ENDIAN\r\n\r\n\r\n#endif /* PROJDEFS_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/queue.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n\r\n#ifndef QUEUE_H\r\n#define QUEUE_H\r\n\r\n#ifndef INC_FREERTOS_H\r\n    #error \"include FreeRTOS.h\" must appear in source files before \"include queue.h\"\r\n#endif\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    extern \"C\" {\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n#include \"task.h\"\r\n\r\n/**\r\n * Type by which queues are referenced.  For example, a call to xQueueCreate()\r\n * returns an QueueHandle_t variable that can then be used as a parameter to\r\n * xQueueSend(), xQueueReceive(), etc.\r\n */\r\nstruct QueueDefinition; /* Using old naming convention so as not to break kernel aware debuggers. */\r\ntypedef struct QueueDefinition   * QueueHandle_t;\r\n\r\n/**\r\n * Type by which queue sets are referenced.  For example, a call to\r\n * xQueueCreateSet() returns an xQueueSet variable that can then be used as a\r\n * parameter to xQueueSelectFromSet(), xQueueAddToSet(), etc.\r\n */\r\ntypedef struct QueueDefinition   * QueueSetHandle_t;\r\n\r\n/**\r\n * Queue sets can contain both queues and semaphores, so the\r\n * QueueSetMemberHandle_t is defined as a type to be used where a parameter or\r\n * return value can be either an QueueHandle_t or an SemaphoreHandle_t.\r\n */\r\ntypedef struct QueueDefinition   * QueueSetMemberHandle_t;\r\n\r\n/* For internal use only. */\r\n#define queueSEND_TO_BACK                     ( ( BaseType_t ) 0 )\r\n#define queueSEND_TO_FRONT                    ( ( BaseType_t ) 1 )\r\n#define queueOVERWRITE                        ( ( BaseType_t ) 2 )\r\n\r\n/* For internal use only.  These definitions *must* match those in queue.c. */\r\n#define queueQUEUE_TYPE_BASE                  ( ( uint8_t ) 0U )\r\n#define queueQUEUE_TYPE_SET                   ( ( uint8_t ) 0U )\r\n#define queueQUEUE_TYPE_MUTEX                 ( ( uint8_t ) 1U )\r\n#define queueQUEUE_TYPE_COUNTING_SEMAPHORE    ( ( uint8_t ) 2U )\r\n#define queueQUEUE_TYPE_BINARY_SEMAPHORE      ( ( uint8_t ) 3U )\r\n#define queueQUEUE_TYPE_RECURSIVE_MUTEX       ( ( uint8_t ) 4U )\r\n\r\n/**\r\n * queue. h\r\n * @code{c}\r\n * QueueHandle_t xQueueCreate(\r\n *                            UBaseType_t uxQueueLength,\r\n *                            UBaseType_t uxItemSize\r\n *                        );\r\n * @endcode\r\n *\r\n * Creates a new queue instance, and returns a handle by which the new queue\r\n * can be referenced.\r\n *\r\n * Internally, within the FreeRTOS implementation, queues use two blocks of\r\n * memory.  The first block is used to hold the queue's data structures.  The\r\n * second block is used to hold items placed into the queue.  If a queue is\r\n * created using xQueueCreate() then both blocks of memory are automatically\r\n * dynamically allocated inside the xQueueCreate() function.  (see\r\n * https://www.FreeRTOS.org/a00111.html).  If a queue is created using\r\n * xQueueCreateStatic() then the application writer must provide the memory that\r\n * will get used by the queue.  xQueueCreateStatic() therefore allows a queue to\r\n * be created without using any dynamic memory allocation.\r\n *\r\n * https://www.FreeRTOS.org/Embedded-RTOS-Queues.html\r\n *\r\n * @param uxQueueLength The maximum number of items that the queue can contain.\r\n *\r\n * @param uxItemSize The number of bytes each item in the queue will require.\r\n * Items are queued by copy, not by reference, so this is the number of bytes\r\n * that will be copied for each posted item.  Each item on the queue must be\r\n * the same size.\r\n *\r\n * @return If the queue is successfully create then a handle to the newly\r\n * created queue is returned.  If the queue cannot be created then 0 is\r\n * returned.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * struct AMessage\r\n * {\r\n *  char ucMessageID;\r\n *  char ucData[ 20 ];\r\n * };\r\n *\r\n * void vATask( void *pvParameters )\r\n * {\r\n * QueueHandle_t xQueue1, xQueue2;\r\n *\r\n *  // Create a queue capable of containing 10 uint32_t values.\r\n *  xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );\r\n *  if( xQueue1 == 0 )\r\n *  {\r\n *      // Queue was not created and must not be used.\r\n *  }\r\n *\r\n *  // Create a queue capable of containing 10 pointers to AMessage structures.\r\n *  // These should be passed by pointer as they contain a lot of data.\r\n *  xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );\r\n *  if( xQueue2 == 0 )\r\n *  {\r\n *      // Queue was not created and must not be used.\r\n *  }\r\n *\r\n *  // ... Rest of task code.\r\n * }\r\n * @endcode\r\n * \\defgroup xQueueCreate xQueueCreate\r\n * \\ingroup QueueManagement\r\n */\r\n#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r\n    #define xQueueCreate( uxQueueLength, uxItemSize )    xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) )\r\n#endif\r\n\r\n/**\r\n * queue. h\r\n * @code{c}\r\n * QueueHandle_t xQueueCreateStatic(\r\n *                            UBaseType_t uxQueueLength,\r\n *                            UBaseType_t uxItemSize,\r\n *                            uint8_t *pucQueueStorage,\r\n *                            StaticQueue_t *pxQueueBuffer\r\n *                        );\r\n * @endcode\r\n *\r\n * Creates a new queue instance, and returns a handle by which the new queue\r\n * can be referenced.\r\n *\r\n * Internally, within the FreeRTOS implementation, queues use two blocks of\r\n * memory.  The first block is used to hold the queue's data structures.  The\r\n * second block is used to hold items placed into the queue.  If a queue is\r\n * created using xQueueCreate() then both blocks of memory are automatically\r\n * dynamically allocated inside the xQueueCreate() function.  (see\r\n * https://www.FreeRTOS.org/a00111.html).  If a queue is created using\r\n * xQueueCreateStatic() then the application writer must provide the memory that\r\n * will get used by the queue.  xQueueCreateStatic() therefore allows a queue to\r\n * be created without using any dynamic memory allocation.\r\n *\r\n * https://www.FreeRTOS.org/Embedded-RTOS-Queues.html\r\n *\r\n * @param uxQueueLength The maximum number of items that the queue can contain.\r\n *\r\n * @param uxItemSize The number of bytes each item in the queue will require.\r\n * Items are queued by copy, not by reference, so this is the number of bytes\r\n * that will be copied for each posted item.  Each item on the queue must be\r\n * the same size.\r\n *\r\n * @param pucQueueStorage If uxItemSize is not zero then\r\n * pucQueueStorage must point to a uint8_t array that is at least large\r\n * enough to hold the maximum number of items that can be in the queue at any\r\n * one time - which is ( uxQueueLength * uxItemsSize ) bytes.  If uxItemSize is\r\n * zero then pucQueueStorage can be NULL.\r\n *\r\n * @param pxQueueBuffer Must point to a variable of type StaticQueue_t, which\r\n * will be used to hold the queue's data structure.\r\n *\r\n * @return If the queue is created then a handle to the created queue is\r\n * returned.  If pxQueueBuffer is NULL then NULL is returned.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * struct AMessage\r\n * {\r\n *  char ucMessageID;\r\n *  char ucData[ 20 ];\r\n * };\r\n *\r\n #define QUEUE_LENGTH 10\r\n #define ITEM_SIZE sizeof( uint32_t )\r\n *\r\n * // xQueueBuffer will hold the queue structure.\r\n * StaticQueue_t xQueueBuffer;\r\n *\r\n * // ucQueueStorage will hold the items posted to the queue.  Must be at least\r\n * // [(queue length) * ( queue item size)] bytes long.\r\n * uint8_t ucQueueStorage[ QUEUE_LENGTH * ITEM_SIZE ];\r\n *\r\n * void vATask( void *pvParameters )\r\n * {\r\n *  QueueHandle_t xQueue1;\r\n *\r\n *  // Create a queue capable of containing 10 uint32_t values.\r\n *  xQueue1 = xQueueCreate( QUEUE_LENGTH, // The number of items the queue can hold.\r\n *                          ITEM_SIZE     // The size of each item in the queue\r\n *                          &( ucQueueStorage[ 0 ] ), // The buffer that will hold the items in the queue.\r\n *                          &xQueueBuffer ); // The buffer that will hold the queue structure.\r\n *\r\n *  // The queue is guaranteed to be created successfully as no dynamic memory\r\n *  // allocation is used.  Therefore xQueue1 is now a handle to a valid queue.\r\n *\r\n *  // ... Rest of task code.\r\n * }\r\n * @endcode\r\n * \\defgroup xQueueCreateStatic xQueueCreateStatic\r\n * \\ingroup QueueManagement\r\n */\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n    #define xQueueCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxQueueBuffer )    xQueueGenericCreateStatic( ( uxQueueLength ), ( uxItemSize ), ( pucQueueStorage ), ( pxQueueBuffer ), ( queueQUEUE_TYPE_BASE ) )\r\n#endif /* configSUPPORT_STATIC_ALLOCATION */\r\n\r\n/**\r\n * queue. h\r\n * @code{c}\r\n * BaseType_t xQueueGetStaticBuffers( QueueHandle_t xQueue,\r\n *                                    uint8_t ** ppucQueueStorage,\r\n *                                    StaticQueue_t ** ppxStaticQueue );\r\n * @endcode\r\n *\r\n * Retrieve pointers to a statically created queue's data structure buffer\r\n * and storage area buffer. These are the same buffers that are supplied\r\n * at the time of creation.\r\n *\r\n * @param xQueue The queue for which to retrieve the buffers.\r\n *\r\n * @param ppucQueueStorage Used to return a pointer to the queue's storage\r\n * area buffer.\r\n *\r\n * @param ppxStaticQueue Used to return a pointer to the queue's data\r\n * structure buffer.\r\n *\r\n * @return pdTRUE if buffers were retrieved, pdFALSE otherwise.\r\n *\r\n * \\defgroup xQueueGetStaticBuffers xQueueGetStaticBuffers\r\n * \\ingroup QueueManagement\r\n */\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n    #define xQueueGetStaticBuffers( xQueue, ppucQueueStorage, ppxStaticQueue )    xQueueGenericGetStaticBuffers( ( xQueue ), ( ppucQueueStorage ), ( ppxStaticQueue ) )\r\n#endif /* configSUPPORT_STATIC_ALLOCATION */\r\n\r\n/**\r\n * queue. h\r\n * @code{c}\r\n * BaseType_t xQueueSendToFront(\r\n *                                 QueueHandle_t    xQueue,\r\n *                                 const void       *pvItemToQueue,\r\n *                                 TickType_t       xTicksToWait\r\n *                             );\r\n * @endcode\r\n *\r\n * Post an item to the front of a queue.  The item is queued by copy, not by\r\n * reference.  This function must not be called from an interrupt service\r\n * routine.  See xQueueSendFromISR () for an alternative which may be used\r\n * in an ISR.\r\n *\r\n * @param xQueue The handle to the queue on which the item is to be posted.\r\n *\r\n * @param pvItemToQueue A pointer to the item that is to be placed on the\r\n * queue.  The size of the items the queue will hold was defined when the\r\n * queue was created, so this many bytes will be copied from pvItemToQueue\r\n * into the queue storage area.\r\n *\r\n * @param xTicksToWait The maximum amount of time the task should block\r\n * waiting for space to become available on the queue, should it already\r\n * be full.  The call will return immediately if this is set to 0 and the\r\n * queue is full.  The time is defined in tick periods so the constant\r\n * portTICK_PERIOD_MS should be used to convert to real time if this is required.\r\n *\r\n * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * struct AMessage\r\n * {\r\n *  char ucMessageID;\r\n *  char ucData[ 20 ];\r\n * } xMessage;\r\n *\r\n * uint32_t ulVar = 10UL;\r\n *\r\n * void vATask( void *pvParameters )\r\n * {\r\n * QueueHandle_t xQueue1, xQueue2;\r\n * struct AMessage *pxMessage;\r\n *\r\n *  // Create a queue capable of containing 10 uint32_t values.\r\n *  xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );\r\n *\r\n *  // Create a queue capable of containing 10 pointers to AMessage structures.\r\n *  // These should be passed by pointer as they contain a lot of data.\r\n *  xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );\r\n *\r\n *  // ...\r\n *\r\n *  if( xQueue1 != 0 )\r\n *  {\r\n *      // Send an uint32_t.  Wait for 10 ticks for space to become\r\n *      // available if necessary.\r\n *      if( xQueueSendToFront( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )\r\n *      {\r\n *          // Failed to post the message, even after 10 ticks.\r\n *      }\r\n *  }\r\n *\r\n *  if( xQueue2 != 0 )\r\n *  {\r\n *      // Send a pointer to a struct AMessage object.  Don't block if the\r\n *      // queue is already full.\r\n *      pxMessage = & xMessage;\r\n *      xQueueSendToFront( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );\r\n *  }\r\n *\r\n *  // ... Rest of task code.\r\n * }\r\n * @endcode\r\n * \\defgroup xQueueSend xQueueSend\r\n * \\ingroup QueueManagement\r\n */\r\n#define xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) \\\r\n    xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_FRONT )\r\n\r\n/**\r\n * queue. h\r\n * @code{c}\r\n * BaseType_t xQueueSendToBack(\r\n *                                 QueueHandle_t    xQueue,\r\n *                                 const void       *pvItemToQueue,\r\n *                                 TickType_t       xTicksToWait\r\n *                             );\r\n * @endcode\r\n *\r\n * This is a macro that calls xQueueGenericSend().\r\n *\r\n * Post an item to the back of a queue.  The item is queued by copy, not by\r\n * reference.  This function must not be called from an interrupt service\r\n * routine.  See xQueueSendFromISR () for an alternative which may be used\r\n * in an ISR.\r\n *\r\n * @param xQueue The handle to the queue on which the item is to be posted.\r\n *\r\n * @param pvItemToQueue A pointer to the item that is to be placed on the\r\n * queue.  The size of the items the queue will hold was defined when the\r\n * queue was created, so this many bytes will be copied from pvItemToQueue\r\n * into the queue storage area.\r\n *\r\n * @param xTicksToWait The maximum amount of time the task should block\r\n * waiting for space to become available on the queue, should it already\r\n * be full.  The call will return immediately if this is set to 0 and the queue\r\n * is full.  The  time is defined in tick periods so the constant\r\n * portTICK_PERIOD_MS should be used to convert to real time if this is required.\r\n *\r\n * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * struct AMessage\r\n * {\r\n *  char ucMessageID;\r\n *  char ucData[ 20 ];\r\n * } xMessage;\r\n *\r\n * uint32_t ulVar = 10UL;\r\n *\r\n * void vATask( void *pvParameters )\r\n * {\r\n * QueueHandle_t xQueue1, xQueue2;\r\n * struct AMessage *pxMessage;\r\n *\r\n *  // Create a queue capable of containing 10 uint32_t values.\r\n *  xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );\r\n *\r\n *  // Create a queue capable of containing 10 pointers to AMessage structures.\r\n *  // These should be passed by pointer as they contain a lot of data.\r\n *  xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );\r\n *\r\n *  // ...\r\n *\r\n *  if( xQueue1 != 0 )\r\n *  {\r\n *      // Send an uint32_t.  Wait for 10 ticks for space to become\r\n *      // available if necessary.\r\n *      if( xQueueSendToBack( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )\r\n *      {\r\n *          // Failed to post the message, even after 10 ticks.\r\n *      }\r\n *  }\r\n *\r\n *  if( xQueue2 != 0 )\r\n *  {\r\n *      // Send a pointer to a struct AMessage object.  Don't block if the\r\n *      // queue is already full.\r\n *      pxMessage = & xMessage;\r\n *      xQueueSendToBack( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );\r\n *  }\r\n *\r\n *  // ... Rest of task code.\r\n * }\r\n * @endcode\r\n * \\defgroup xQueueSend xQueueSend\r\n * \\ingroup QueueManagement\r\n */\r\n#define xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) \\\r\n    xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK )\r\n\r\n/**\r\n * queue. h\r\n * @code{c}\r\n * BaseType_t xQueueSend(\r\n *                            QueueHandle_t xQueue,\r\n *                            const void * pvItemToQueue,\r\n *                            TickType_t xTicksToWait\r\n *                       );\r\n * @endcode\r\n *\r\n * This is a macro that calls xQueueGenericSend().  It is included for\r\n * backward compatibility with versions of FreeRTOS.org that did not\r\n * include the xQueueSendToFront() and xQueueSendToBack() macros.  It is\r\n * equivalent to xQueueSendToBack().\r\n *\r\n * Post an item on a queue.  The item is queued by copy, not by reference.\r\n * This function must not be called from an interrupt service routine.\r\n * See xQueueSendFromISR () for an alternative which may be used in an ISR.\r\n *\r\n * @param xQueue The handle to the queue on which the item is to be posted.\r\n *\r\n * @param pvItemToQueue A pointer to the item that is to be placed on the\r\n * queue.  The size of the items the queue will hold was defined when the\r\n * queue was created, so this many bytes will be copied from pvItemToQueue\r\n * into the queue storage area.\r\n *\r\n * @param xTicksToWait The maximum amount of time the task should block\r\n * waiting for space to become available on the queue, should it already\r\n * be full.  The call will return immediately if this is set to 0 and the\r\n * queue is full.  The time is defined in tick periods so the constant\r\n * portTICK_PERIOD_MS should be used to convert to real time if this is required.\r\n *\r\n * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * struct AMessage\r\n * {\r\n *  char ucMessageID;\r\n *  char ucData[ 20 ];\r\n * } xMessage;\r\n *\r\n * uint32_t ulVar = 10UL;\r\n *\r\n * void vATask( void *pvParameters )\r\n * {\r\n * QueueHandle_t xQueue1, xQueue2;\r\n * struct AMessage *pxMessage;\r\n *\r\n *  // Create a queue capable of containing 10 uint32_t values.\r\n *  xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );\r\n *\r\n *  // Create a queue capable of containing 10 pointers to AMessage structures.\r\n *  // These should be passed by pointer as they contain a lot of data.\r\n *  xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );\r\n *\r\n *  // ...\r\n *\r\n *  if( xQueue1 != 0 )\r\n *  {\r\n *      // Send an uint32_t.  Wait for 10 ticks for space to become\r\n *      // available if necessary.\r\n *      if( xQueueSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10 ) != pdPASS )\r\n *      {\r\n *          // Failed to post the message, even after 10 ticks.\r\n *      }\r\n *  }\r\n *\r\n *  if( xQueue2 != 0 )\r\n *  {\r\n *      // Send a pointer to a struct AMessage object.  Don't block if the\r\n *      // queue is already full.\r\n *      pxMessage = & xMessage;\r\n *      xQueueSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0 );\r\n *  }\r\n *\r\n *  // ... Rest of task code.\r\n * }\r\n * @endcode\r\n * \\defgroup xQueueSend xQueueSend\r\n * \\ingroup QueueManagement\r\n */\r\n#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) \\\r\n    xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK )\r\n\r\n/**\r\n * queue. h\r\n * @code{c}\r\n * BaseType_t xQueueOverwrite(\r\n *                            QueueHandle_t xQueue,\r\n *                            const void * pvItemToQueue\r\n *                       );\r\n * @endcode\r\n *\r\n * Only for use with queues that have a length of one - so the queue is either\r\n * empty or full.\r\n *\r\n * Post an item on a queue.  If the queue is already full then overwrite the\r\n * value held in the queue.  The item is queued by copy, not by reference.\r\n *\r\n * This function must not be called from an interrupt service routine.\r\n * See xQueueOverwriteFromISR () for an alternative which may be used in an ISR.\r\n *\r\n * @param xQueue The handle of the queue to which the data is being sent.\r\n *\r\n * @param pvItemToQueue A pointer to the item that is to be placed on the\r\n * queue.  The size of the items the queue will hold was defined when the\r\n * queue was created, so this many bytes will be copied from pvItemToQueue\r\n * into the queue storage area.\r\n *\r\n * @return xQueueOverwrite() is a macro that calls xQueueGenericSend(), and\r\n * therefore has the same return values as xQueueSendToFront().  However, pdPASS\r\n * is the only value that can be returned because xQueueOverwrite() will write\r\n * to the queue even when the queue is already full.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n *\r\n * void vFunction( void *pvParameters )\r\n * {\r\n * QueueHandle_t xQueue;\r\n * uint32_t ulVarToSend, ulValReceived;\r\n *\r\n *  // Create a queue to hold one uint32_t value.  It is strongly\r\n *  // recommended *not* to use xQueueOverwrite() on queues that can\r\n *  // contain more than one value, and doing so will trigger an assertion\r\n *  // if configASSERT() is defined.\r\n *  xQueue = xQueueCreate( 1, sizeof( uint32_t ) );\r\n *\r\n *  // Write the value 10 to the queue using xQueueOverwrite().\r\n *  ulVarToSend = 10;\r\n *  xQueueOverwrite( xQueue, &ulVarToSend );\r\n *\r\n *  // Peeking the queue should now return 10, but leave the value 10 in\r\n *  // the queue.  A block time of zero is used as it is known that the\r\n *  // queue holds a value.\r\n *  ulValReceived = 0;\r\n *  xQueuePeek( xQueue, &ulValReceived, 0 );\r\n *\r\n *  if( ulValReceived != 10 )\r\n *  {\r\n *      // Error unless the item was removed by a different task.\r\n *  }\r\n *\r\n *  // The queue is still full.  Use xQueueOverwrite() to overwrite the\r\n *  // value held in the queue with 100.\r\n *  ulVarToSend = 100;\r\n *  xQueueOverwrite( xQueue, &ulVarToSend );\r\n *\r\n *  // This time read from the queue, leaving the queue empty once more.\r\n *  // A block time of 0 is used again.\r\n *  xQueueReceive( xQueue, &ulValReceived, 0 );\r\n *\r\n *  // The value read should be the last value written, even though the\r\n *  // queue was already full when the value was written.\r\n *  if( ulValReceived != 100 )\r\n *  {\r\n *      // Error!\r\n *  }\r\n *\r\n *  // ...\r\n * }\r\n * @endcode\r\n * \\defgroup xQueueOverwrite xQueueOverwrite\r\n * \\ingroup QueueManagement\r\n */\r\n#define xQueueOverwrite( xQueue, pvItemToQueue ) \\\r\n    xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), 0, queueOVERWRITE )\r\n\r\n\r\n/**\r\n * queue. h\r\n * @code{c}\r\n * BaseType_t xQueueGenericSend(\r\n *                                  QueueHandle_t xQueue,\r\n *                                  const void * pvItemToQueue,\r\n *                                  TickType_t xTicksToWait\r\n *                                  BaseType_t xCopyPosition\r\n *                              );\r\n * @endcode\r\n *\r\n * It is preferred that the macros xQueueSend(), xQueueSendToFront() and\r\n * xQueueSendToBack() are used in place of calling this function directly.\r\n *\r\n * Post an item on a queue.  The item is queued by copy, not by reference.\r\n * This function must not be called from an interrupt service routine.\r\n * See xQueueSendFromISR () for an alternative which may be used in an ISR.\r\n *\r\n * @param xQueue The handle to the queue on which the item is to be posted.\r\n *\r\n * @param pvItemToQueue A pointer to the item that is to be placed on the\r\n * queue.  The size of the items the queue will hold was defined when the\r\n * queue was created, so this many bytes will be copied from pvItemToQueue\r\n * into the queue storage area.\r\n *\r\n * @param xTicksToWait The maximum amount of time the task should block\r\n * waiting for space to become available on the queue, should it already\r\n * be full.  The call will return immediately if this is set to 0 and the\r\n * queue is full.  The time is defined in tick periods so the constant\r\n * portTICK_PERIOD_MS should be used to convert to real time if this is required.\r\n *\r\n * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the\r\n * item at the back of the queue, or queueSEND_TO_FRONT to place the item\r\n * at the front of the queue (for high priority messages).\r\n *\r\n * @return pdTRUE if the item was successfully posted, otherwise errQUEUE_FULL.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * struct AMessage\r\n * {\r\n *  char ucMessageID;\r\n *  char ucData[ 20 ];\r\n * } xMessage;\r\n *\r\n * uint32_t ulVar = 10UL;\r\n *\r\n * void vATask( void *pvParameters )\r\n * {\r\n * QueueHandle_t xQueue1, xQueue2;\r\n * struct AMessage *pxMessage;\r\n *\r\n *  // Create a queue capable of containing 10 uint32_t values.\r\n *  xQueue1 = xQueueCreate( 10, sizeof( uint32_t ) );\r\n *\r\n *  // Create a queue capable of containing 10 pointers to AMessage structures.\r\n *  // These should be passed by pointer as they contain a lot of data.\r\n *  xQueue2 = xQueueCreate( 10, sizeof( struct AMessage * ) );\r\n *\r\n *  // ...\r\n *\r\n *  if( xQueue1 != 0 )\r\n *  {\r\n *      // Send an uint32_t.  Wait for 10 ticks for space to become\r\n *      // available if necessary.\r\n *      if( xQueueGenericSend( xQueue1, ( void * ) &ulVar, ( TickType_t ) 10, queueSEND_TO_BACK ) != pdPASS )\r\n *      {\r\n *          // Failed to post the message, even after 10 ticks.\r\n *      }\r\n *  }\r\n *\r\n *  if( xQueue2 != 0 )\r\n *  {\r\n *      // Send a pointer to a struct AMessage object.  Don't block if the\r\n *      // queue is already full.\r\n *      pxMessage = & xMessage;\r\n *      xQueueGenericSend( xQueue2, ( void * ) &pxMessage, ( TickType_t ) 0, queueSEND_TO_BACK );\r\n *  }\r\n *\r\n *  // ... Rest of task code.\r\n * }\r\n * @endcode\r\n * \\defgroup xQueueSend xQueueSend\r\n * \\ingroup QueueManagement\r\n */\r\nBaseType_t xQueueGenericSend( QueueHandle_t xQueue,\r\n                              const void * const pvItemToQueue,\r\n                              TickType_t xTicksToWait,\r\n                              const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * queue. h\r\n * @code{c}\r\n * BaseType_t xQueuePeek(\r\n *                           QueueHandle_t xQueue,\r\n *                           void * const pvBuffer,\r\n *                           TickType_t xTicksToWait\r\n *                       );\r\n * @endcode\r\n *\r\n * Receive an item from a queue without removing the item from the queue.\r\n * The item is received by copy so a buffer of adequate size must be\r\n * provided.  The number of bytes copied into the buffer was defined when\r\n * the queue was created.\r\n *\r\n * Successfully received items remain on the queue so will be returned again\r\n * by the next call, or a call to xQueueReceive().\r\n *\r\n * This macro must not be used in an interrupt service routine.  See\r\n * xQueuePeekFromISR() for an alternative that can be called from an interrupt\r\n * service routine.\r\n *\r\n * @param xQueue The handle to the queue from which the item is to be\r\n * received.\r\n *\r\n * @param pvBuffer Pointer to the buffer into which the received item will\r\n * be copied.\r\n *\r\n * @param xTicksToWait The maximum amount of time the task should block\r\n * waiting for an item to receive should the queue be empty at the time\r\n * of the call. The time is defined in tick periods so the constant\r\n * portTICK_PERIOD_MS should be used to convert to real time if this is required.\r\n * xQueuePeek() will return immediately if xTicksToWait is 0 and the queue\r\n * is empty.\r\n *\r\n * @return pdTRUE if an item was successfully received from the queue,\r\n * otherwise pdFALSE.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * struct AMessage\r\n * {\r\n *  char ucMessageID;\r\n *  char ucData[ 20 ];\r\n * } xMessage;\r\n *\r\n * QueueHandle_t xQueue;\r\n *\r\n * // Task to create a queue and post a value.\r\n * void vATask( void *pvParameters )\r\n * {\r\n * struct AMessage *pxMessage;\r\n *\r\n *  // Create a queue capable of containing 10 pointers to AMessage structures.\r\n *  // These should be passed by pointer as they contain a lot of data.\r\n *  xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );\r\n *  if( xQueue == 0 )\r\n *  {\r\n *      // Failed to create the queue.\r\n *  }\r\n *\r\n *  // ...\r\n *\r\n *  // Send a pointer to a struct AMessage object.  Don't block if the\r\n *  // queue is already full.\r\n *  pxMessage = & xMessage;\r\n *  xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 );\r\n *\r\n *  // ... Rest of task code.\r\n * }\r\n *\r\n * // Task to peek the data from the queue.\r\n * void vADifferentTask( void *pvParameters )\r\n * {\r\n * struct AMessage *pxRxedMessage;\r\n *\r\n *  if( xQueue != 0 )\r\n *  {\r\n *      // Peek a message on the created queue.  Block for 10 ticks if a\r\n *      // message is not immediately available.\r\n *      if( xQueuePeek( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) )\r\n *      {\r\n *          // pcRxedMessage now points to the struct AMessage variable posted\r\n *          // by vATask, but the item still remains on the queue.\r\n *      }\r\n *  }\r\n *\r\n *  // ... Rest of task code.\r\n * }\r\n * @endcode\r\n * \\defgroup xQueuePeek xQueuePeek\r\n * \\ingroup QueueManagement\r\n */\r\nBaseType_t xQueuePeek( QueueHandle_t xQueue,\r\n                       void * const pvBuffer,\r\n                       TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * queue. h\r\n * @code{c}\r\n * BaseType_t xQueuePeekFromISR(\r\n *                                  QueueHandle_t xQueue,\r\n *                                  void *pvBuffer,\r\n *                              );\r\n * @endcode\r\n *\r\n * A version of xQueuePeek() that can be called from an interrupt service\r\n * routine (ISR).\r\n *\r\n * Receive an item from a queue without removing the item from the queue.\r\n * The item is received by copy so a buffer of adequate size must be\r\n * provided.  The number of bytes copied into the buffer was defined when\r\n * the queue was created.\r\n *\r\n * Successfully received items remain on the queue so will be returned again\r\n * by the next call, or a call to xQueueReceive().\r\n *\r\n * @param xQueue The handle to the queue from which the item is to be\r\n * received.\r\n *\r\n * @param pvBuffer Pointer to the buffer into which the received item will\r\n * be copied.\r\n *\r\n * @return pdTRUE if an item was successfully received from the queue,\r\n * otherwise pdFALSE.\r\n *\r\n * \\defgroup xQueuePeekFromISR xQueuePeekFromISR\r\n * \\ingroup QueueManagement\r\n */\r\nBaseType_t xQueuePeekFromISR( QueueHandle_t xQueue,\r\n                              void * const pvBuffer ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * queue. h\r\n * @code{c}\r\n * BaseType_t xQueueReceive(\r\n *                               QueueHandle_t xQueue,\r\n *                               void *pvBuffer,\r\n *                               TickType_t xTicksToWait\r\n *                          );\r\n * @endcode\r\n *\r\n * Receive an item from a queue.  The item is received by copy so a buffer of\r\n * adequate size must be provided.  The number of bytes copied into the buffer\r\n * was defined when the queue was created.\r\n *\r\n * Successfully received items are removed from the queue.\r\n *\r\n * This function must not be used in an interrupt service routine.  See\r\n * xQueueReceiveFromISR for an alternative that can.\r\n *\r\n * @param xQueue The handle to the queue from which the item is to be\r\n * received.\r\n *\r\n * @param pvBuffer Pointer to the buffer into which the received item will\r\n * be copied.\r\n *\r\n * @param xTicksToWait The maximum amount of time the task should block\r\n * waiting for an item to receive should the queue be empty at the time\r\n * of the call. xQueueReceive() will return immediately if xTicksToWait\r\n * is zero and the queue is empty.  The time is defined in tick periods so the\r\n * constant portTICK_PERIOD_MS should be used to convert to real time if this is\r\n * required.\r\n *\r\n * @return pdTRUE if an item was successfully received from the queue,\r\n * otherwise pdFALSE.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * struct AMessage\r\n * {\r\n *  char ucMessageID;\r\n *  char ucData[ 20 ];\r\n * } xMessage;\r\n *\r\n * QueueHandle_t xQueue;\r\n *\r\n * // Task to create a queue and post a value.\r\n * void vATask( void *pvParameters )\r\n * {\r\n * struct AMessage *pxMessage;\r\n *\r\n *  // Create a queue capable of containing 10 pointers to AMessage structures.\r\n *  // These should be passed by pointer as they contain a lot of data.\r\n *  xQueue = xQueueCreate( 10, sizeof( struct AMessage * ) );\r\n *  if( xQueue == 0 )\r\n *  {\r\n *      // Failed to create the queue.\r\n *  }\r\n *\r\n *  // ...\r\n *\r\n *  // Send a pointer to a struct AMessage object.  Don't block if the\r\n *  // queue is already full.\r\n *  pxMessage = & xMessage;\r\n *  xQueueSend( xQueue, ( void * ) &pxMessage, ( TickType_t ) 0 );\r\n *\r\n *  // ... Rest of task code.\r\n * }\r\n *\r\n * // Task to receive from the queue.\r\n * void vADifferentTask( void *pvParameters )\r\n * {\r\n * struct AMessage *pxRxedMessage;\r\n *\r\n *  if( xQueue != 0 )\r\n *  {\r\n *      // Receive a message on the created queue.  Block for 10 ticks if a\r\n *      // message is not immediately available.\r\n *      if( xQueueReceive( xQueue, &( pxRxedMessage ), ( TickType_t ) 10 ) )\r\n *      {\r\n *          // pcRxedMessage now points to the struct AMessage variable posted\r\n *          // by vATask.\r\n *      }\r\n *  }\r\n *\r\n *  // ... Rest of task code.\r\n * }\r\n * @endcode\r\n * \\defgroup xQueueReceive xQueueReceive\r\n * \\ingroup QueueManagement\r\n */\r\nBaseType_t xQueueReceive( QueueHandle_t xQueue,\r\n                          void * const pvBuffer,\r\n                          TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * queue. h\r\n * @code{c}\r\n * UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue );\r\n * @endcode\r\n *\r\n * Return the number of messages stored in a queue.\r\n *\r\n * @param xQueue A handle to the queue being queried.\r\n *\r\n * @return The number of messages available in the queue.\r\n *\r\n * \\defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting\r\n * \\ingroup QueueManagement\r\n */\r\nUBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * queue. h\r\n * @code{c}\r\n * UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue );\r\n * @endcode\r\n *\r\n * Return the number of free spaces available in a queue.  This is equal to the\r\n * number of items that can be sent to the queue before the queue becomes full\r\n * if no items are removed.\r\n *\r\n * @param xQueue A handle to the queue being queried.\r\n *\r\n * @return The number of spaces available in the queue.\r\n *\r\n * \\defgroup uxQueueMessagesWaiting uxQueueMessagesWaiting\r\n * \\ingroup QueueManagement\r\n */\r\nUBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * queue. h\r\n * @code{c}\r\n * void vQueueDelete( QueueHandle_t xQueue );\r\n * @endcode\r\n *\r\n * Delete a queue - freeing all the memory allocated for storing of items\r\n * placed on the queue.\r\n *\r\n * @param xQueue A handle to the queue to be deleted.\r\n *\r\n * \\defgroup vQueueDelete vQueueDelete\r\n * \\ingroup QueueManagement\r\n */\r\nvoid vQueueDelete( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * queue. h\r\n * @code{c}\r\n * BaseType_t xQueueSendToFrontFromISR(\r\n *                                       QueueHandle_t xQueue,\r\n *                                       const void *pvItemToQueue,\r\n *                                       BaseType_t *pxHigherPriorityTaskWoken\r\n *                                    );\r\n * @endcode\r\n *\r\n * This is a macro that calls xQueueGenericSendFromISR().\r\n *\r\n * Post an item to the front of a queue.  It is safe to use this macro from\r\n * within an interrupt service routine.\r\n *\r\n * Items are queued by copy not reference so it is preferable to only\r\n * queue small items, especially when called from an ISR.  In most cases\r\n * it would be preferable to store a pointer to the item being queued.\r\n *\r\n * @param xQueue The handle to the queue on which the item is to be posted.\r\n *\r\n * @param pvItemToQueue A pointer to the item that is to be placed on the\r\n * queue.  The size of the items the queue will hold was defined when the\r\n * queue was created, so this many bytes will be copied from pvItemToQueue\r\n * into the queue storage area.\r\n *\r\n * @param pxHigherPriorityTaskWoken xQueueSendToFrontFromISR() will set\r\n * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task\r\n * to unblock, and the unblocked task has a priority higher than the currently\r\n * running task.  If xQueueSendToFrontFromISR() sets this value to pdTRUE then\r\n * a context switch should be requested before the interrupt is exited.\r\n *\r\n * @return pdTRUE if the data was successfully sent to the queue, otherwise\r\n * errQUEUE_FULL.\r\n *\r\n * Example usage for buffered IO (where the ISR can obtain more than one value\r\n * per call):\r\n * @code{c}\r\n * void vBufferISR( void )\r\n * {\r\n * char cIn;\r\n * BaseType_t xHigherPriorityTaskWoken;\r\n *\r\n *  // We have not woken a task at the start of the ISR.\r\n *  xHigherPriorityTaskWoken = pdFALSE;\r\n *\r\n *  // Loop until the buffer is empty.\r\n *  do\r\n *  {\r\n *      // Obtain a byte from the buffer.\r\n *      cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );\r\n *\r\n *      // Post the byte.\r\n *      xQueueSendToFrontFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );\r\n *\r\n *  } while( portINPUT_BYTE( BUFFER_COUNT ) );\r\n *\r\n *  // Now the buffer is empty we can switch context if necessary.\r\n *  if( xHigherPriorityTaskWoken )\r\n *  {\r\n *      taskYIELD ();\r\n *  }\r\n * }\r\n * @endcode\r\n *\r\n * \\defgroup xQueueSendFromISR xQueueSendFromISR\r\n * \\ingroup QueueManagement\r\n */\r\n#define xQueueSendToFrontFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \\\r\n    xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_FRONT )\r\n\r\n\r\n/**\r\n * queue. h\r\n * @code{c}\r\n * BaseType_t xQueueSendToBackFromISR(\r\n *                                       QueueHandle_t xQueue,\r\n *                                       const void *pvItemToQueue,\r\n *                                       BaseType_t *pxHigherPriorityTaskWoken\r\n *                                    );\r\n * @endcode\r\n *\r\n * This is a macro that calls xQueueGenericSendFromISR().\r\n *\r\n * Post an item to the back of a queue.  It is safe to use this macro from\r\n * within an interrupt service routine.\r\n *\r\n * Items are queued by copy not reference so it is preferable to only\r\n * queue small items, especially when called from an ISR.  In most cases\r\n * it would be preferable to store a pointer to the item being queued.\r\n *\r\n * @param xQueue The handle to the queue on which the item is to be posted.\r\n *\r\n * @param pvItemToQueue A pointer to the item that is to be placed on the\r\n * queue.  The size of the items the queue will hold was defined when the\r\n * queue was created, so this many bytes will be copied from pvItemToQueue\r\n * into the queue storage area.\r\n *\r\n * @param pxHigherPriorityTaskWoken xQueueSendToBackFromISR() will set\r\n * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task\r\n * to unblock, and the unblocked task has a priority higher than the currently\r\n * running task.  If xQueueSendToBackFromISR() sets this value to pdTRUE then\r\n * a context switch should be requested before the interrupt is exited.\r\n *\r\n * @return pdTRUE if the data was successfully sent to the queue, otherwise\r\n * errQUEUE_FULL.\r\n *\r\n * Example usage for buffered IO (where the ISR can obtain more than one value\r\n * per call):\r\n * @code{c}\r\n * void vBufferISR( void )\r\n * {\r\n * char cIn;\r\n * BaseType_t xHigherPriorityTaskWoken;\r\n *\r\n *  // We have not woken a task at the start of the ISR.\r\n *  xHigherPriorityTaskWoken = pdFALSE;\r\n *\r\n *  // Loop until the buffer is empty.\r\n *  do\r\n *  {\r\n *      // Obtain a byte from the buffer.\r\n *      cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );\r\n *\r\n *      // Post the byte.\r\n *      xQueueSendToBackFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );\r\n *\r\n *  } while( portINPUT_BYTE( BUFFER_COUNT ) );\r\n *\r\n *  // Now the buffer is empty we can switch context if necessary.\r\n *  if( xHigherPriorityTaskWoken )\r\n *  {\r\n *      taskYIELD ();\r\n *  }\r\n * }\r\n * @endcode\r\n *\r\n * \\defgroup xQueueSendFromISR xQueueSendFromISR\r\n * \\ingroup QueueManagement\r\n */\r\n#define xQueueSendToBackFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \\\r\n    xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK )\r\n\r\n/**\r\n * queue. h\r\n * @code{c}\r\n * BaseType_t xQueueOverwriteFromISR(\r\n *                            QueueHandle_t xQueue,\r\n *                            const void * pvItemToQueue,\r\n *                            BaseType_t *pxHigherPriorityTaskWoken\r\n *                       );\r\n * @endcode\r\n *\r\n * A version of xQueueOverwrite() that can be used in an interrupt service\r\n * routine (ISR).\r\n *\r\n * Only for use with queues that can hold a single item - so the queue is either\r\n * empty or full.\r\n *\r\n * Post an item on a queue.  If the queue is already full then overwrite the\r\n * value held in the queue.  The item is queued by copy, not by reference.\r\n *\r\n * @param xQueue The handle to the queue on which the item is to be posted.\r\n *\r\n * @param pvItemToQueue A pointer to the item that is to be placed on the\r\n * queue.  The size of the items the queue will hold was defined when the\r\n * queue was created, so this many bytes will be copied from pvItemToQueue\r\n * into the queue storage area.\r\n *\r\n * @param pxHigherPriorityTaskWoken xQueueOverwriteFromISR() will set\r\n * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task\r\n * to unblock, and the unblocked task has a priority higher than the currently\r\n * running task.  If xQueueOverwriteFromISR() sets this value to pdTRUE then\r\n * a context switch should be requested before the interrupt is exited.\r\n *\r\n * @return xQueueOverwriteFromISR() is a macro that calls\r\n * xQueueGenericSendFromISR(), and therefore has the same return values as\r\n * xQueueSendToFrontFromISR().  However, pdPASS is the only value that can be\r\n * returned because xQueueOverwriteFromISR() will write to the queue even when\r\n * the queue is already full.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n *\r\n * QueueHandle_t xQueue;\r\n *\r\n * void vFunction( void *pvParameters )\r\n * {\r\n *  // Create a queue to hold one uint32_t value.  It is strongly\r\n *  // recommended *not* to use xQueueOverwriteFromISR() on queues that can\r\n *  // contain more than one value, and doing so will trigger an assertion\r\n *  // if configASSERT() is defined.\r\n *  xQueue = xQueueCreate( 1, sizeof( uint32_t ) );\r\n * }\r\n *\r\n * void vAnInterruptHandler( void )\r\n * {\r\n * // xHigherPriorityTaskWoken must be set to pdFALSE before it is used.\r\n * BaseType_t xHigherPriorityTaskWoken = pdFALSE;\r\n * uint32_t ulVarToSend, ulValReceived;\r\n *\r\n *  // Write the value 10 to the queue using xQueueOverwriteFromISR().\r\n *  ulVarToSend = 10;\r\n *  xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken );\r\n *\r\n *  // The queue is full, but calling xQueueOverwriteFromISR() again will still\r\n *  // pass because the value held in the queue will be overwritten with the\r\n *  // new value.\r\n *  ulVarToSend = 100;\r\n *  xQueueOverwriteFromISR( xQueue, &ulVarToSend, &xHigherPriorityTaskWoken );\r\n *\r\n *  // Reading from the queue will now return 100.\r\n *\r\n *  // ...\r\n *\r\n *  if( xHigherPrioritytaskWoken == pdTRUE )\r\n *  {\r\n *      // Writing to the queue caused a task to unblock and the unblocked task\r\n *      // has a priority higher than or equal to the priority of the currently\r\n *      // executing task (the task this interrupt interrupted). Perform a context\r\n *      // switch so this interrupt returns directly to the unblocked task.\r\n *      // The macro used is port specific and will be either\r\n *      // portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - refer to the documentation\r\n *      // page for the port being used.\r\n *      portYIELD_FROM_ISR( xHigherPriorityTaskWoken );\r\n *  }\r\n * }\r\n * @endcode\r\n * \\defgroup xQueueOverwriteFromISR xQueueOverwriteFromISR\r\n * \\ingroup QueueManagement\r\n */\r\n#define xQueueOverwriteFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \\\r\n    xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueOVERWRITE )\r\n\r\n/**\r\n * queue. h\r\n * @code{c}\r\n * BaseType_t xQueueSendFromISR(\r\n *                                   QueueHandle_t xQueue,\r\n *                                   const void *pvItemToQueue,\r\n *                                   BaseType_t *pxHigherPriorityTaskWoken\r\n *                              );\r\n * @endcode\r\n *\r\n * This is a macro that calls xQueueGenericSendFromISR().  It is included\r\n * for backward compatibility with versions of FreeRTOS.org that did not\r\n * include the xQueueSendToBackFromISR() and xQueueSendToFrontFromISR()\r\n * macros.\r\n *\r\n * Post an item to the back of a queue.  It is safe to use this function from\r\n * within an interrupt service routine.\r\n *\r\n * Items are queued by copy not reference so it is preferable to only\r\n * queue small items, especially when called from an ISR.  In most cases\r\n * it would be preferable to store a pointer to the item being queued.\r\n *\r\n * @param xQueue The handle to the queue on which the item is to be posted.\r\n *\r\n * @param pvItemToQueue A pointer to the item that is to be placed on the\r\n * queue.  The size of the items the queue will hold was defined when the\r\n * queue was created, so this many bytes will be copied from pvItemToQueue\r\n * into the queue storage area.\r\n *\r\n * @param pxHigherPriorityTaskWoken xQueueSendFromISR() will set\r\n * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task\r\n * to unblock, and the unblocked task has a priority higher than the currently\r\n * running task.  If xQueueSendFromISR() sets this value to pdTRUE then\r\n * a context switch should be requested before the interrupt is exited.\r\n *\r\n * @return pdTRUE if the data was successfully sent to the queue, otherwise\r\n * errQUEUE_FULL.\r\n *\r\n * Example usage for buffered IO (where the ISR can obtain more than one value\r\n * per call):\r\n * @code{c}\r\n * void vBufferISR( void )\r\n * {\r\n * char cIn;\r\n * BaseType_t xHigherPriorityTaskWoken;\r\n *\r\n *  // We have not woken a task at the start of the ISR.\r\n *  xHigherPriorityTaskWoken = pdFALSE;\r\n *\r\n *  // Loop until the buffer is empty.\r\n *  do\r\n *  {\r\n *      // Obtain a byte from the buffer.\r\n *      cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );\r\n *\r\n *      // Post the byte.\r\n *      xQueueSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWoken );\r\n *\r\n *  } while( portINPUT_BYTE( BUFFER_COUNT ) );\r\n *\r\n *  // Now the buffer is empty we can switch context if necessary.\r\n *  if( xHigherPriorityTaskWoken )\r\n *  {\r\n *       // As xHigherPriorityTaskWoken is now set to pdTRUE then a context\r\n *       // switch should be requested. The macro used is port specific and\r\n *       // will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() -\r\n *       // refer to the documentation page for the port being used.\r\n *       portYIELD_FROM_ISR( xHigherPriorityTaskWoken );\r\n *  }\r\n * }\r\n * @endcode\r\n *\r\n * \\defgroup xQueueSendFromISR xQueueSendFromISR\r\n * \\ingroup QueueManagement\r\n */\r\n#define xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \\\r\n    xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK )\r\n\r\n/**\r\n * queue. h\r\n * @code{c}\r\n * BaseType_t xQueueGenericSendFromISR(\r\n *                                         QueueHandle_t    xQueue,\r\n *                                         const    void    *pvItemToQueue,\r\n *                                         BaseType_t  *pxHigherPriorityTaskWoken,\r\n *                                         BaseType_t  xCopyPosition\r\n *                                     );\r\n * @endcode\r\n *\r\n * It is preferred that the macros xQueueSendFromISR(),\r\n * xQueueSendToFrontFromISR() and xQueueSendToBackFromISR() be used in place\r\n * of calling this function directly.  xQueueGiveFromISR() is an\r\n * equivalent for use by semaphores that don't actually copy any data.\r\n *\r\n * Post an item on a queue.  It is safe to use this function from within an\r\n * interrupt service routine.\r\n *\r\n * Items are queued by copy not reference so it is preferable to only\r\n * queue small items, especially when called from an ISR.  In most cases\r\n * it would be preferable to store a pointer to the item being queued.\r\n *\r\n * @param xQueue The handle to the queue on which the item is to be posted.\r\n *\r\n * @param pvItemToQueue A pointer to the item that is to be placed on the\r\n * queue.  The size of the items the queue will hold was defined when the\r\n * queue was created, so this many bytes will be copied from pvItemToQueue\r\n * into the queue storage area.\r\n *\r\n * @param pxHigherPriorityTaskWoken xQueueGenericSendFromISR() will set\r\n * *pxHigherPriorityTaskWoken to pdTRUE if sending to the queue caused a task\r\n * to unblock, and the unblocked task has a priority higher than the currently\r\n * running task.  If xQueueGenericSendFromISR() sets this value to pdTRUE then\r\n * a context switch should be requested before the interrupt is exited.\r\n *\r\n * @param xCopyPosition Can take the value queueSEND_TO_BACK to place the\r\n * item at the back of the queue, or queueSEND_TO_FRONT to place the item\r\n * at the front of the queue (for high priority messages).\r\n *\r\n * @return pdTRUE if the data was successfully sent to the queue, otherwise\r\n * errQUEUE_FULL.\r\n *\r\n * Example usage for buffered IO (where the ISR can obtain more than one value\r\n * per call):\r\n * @code{c}\r\n * void vBufferISR( void )\r\n * {\r\n * char cIn;\r\n * BaseType_t xHigherPriorityTaskWokenByPost;\r\n *\r\n *  // We have not woken a task at the start of the ISR.\r\n *  xHigherPriorityTaskWokenByPost = pdFALSE;\r\n *\r\n *  // Loop until the buffer is empty.\r\n *  do\r\n *  {\r\n *      // Obtain a byte from the buffer.\r\n *      cIn = portINPUT_BYTE( RX_REGISTER_ADDRESS );\r\n *\r\n *      // Post each byte.\r\n *      xQueueGenericSendFromISR( xRxQueue, &cIn, &xHigherPriorityTaskWokenByPost, queueSEND_TO_BACK );\r\n *\r\n *  } while( portINPUT_BYTE( BUFFER_COUNT ) );\r\n *\r\n *  // Now the buffer is empty we can switch context if necessary.\r\n *  if( xHigherPriorityTaskWokenByPost )\r\n *  {\r\n *       // As xHigherPriorityTaskWokenByPost is now set to pdTRUE then a context\r\n *       // switch should be requested. The macro used is port specific and\r\n *       // will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() -\r\n *       // refer to the documentation page for the port being used.\r\n *       portYIELD_FROM_ISR( xHigherPriorityTaskWokenByPost );\r\n *  }\r\n * }\r\n * @endcode\r\n *\r\n * \\defgroup xQueueSendFromISR xQueueSendFromISR\r\n * \\ingroup QueueManagement\r\n */\r\nBaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue,\r\n                                     const void * const pvItemToQueue,\r\n                                     BaseType_t * const pxHigherPriorityTaskWoken,\r\n                                     const BaseType_t xCopyPosition ) PRIVILEGED_FUNCTION;\r\nBaseType_t xQueueGiveFromISR( QueueHandle_t xQueue,\r\n                              BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * queue. h\r\n * @code{c}\r\n * BaseType_t xQueueReceiveFromISR(\r\n *                                     QueueHandle_t    xQueue,\r\n *                                     void             *pvBuffer,\r\n *                                     BaseType_t       *pxTaskWoken\r\n *                                 );\r\n * @endcode\r\n *\r\n * Receive an item from a queue.  It is safe to use this function from within an\r\n * interrupt service routine.\r\n *\r\n * @param xQueue The handle to the queue from which the item is to be\r\n * received.\r\n *\r\n * @param pvBuffer Pointer to the buffer into which the received item will\r\n * be copied.\r\n *\r\n * @param pxHigherPriorityTaskWoken A task may be blocked waiting for space to\r\n * become available on the queue.  If xQueueReceiveFromISR causes such a task\r\n * to unblock *pxTaskWoken will get set to pdTRUE, otherwise *pxTaskWoken will\r\n * remain unchanged.\r\n *\r\n * @return pdTRUE if an item was successfully received from the queue,\r\n * otherwise pdFALSE.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n *\r\n * QueueHandle_t xQueue;\r\n *\r\n * // Function to create a queue and post some values.\r\n * void vAFunction( void *pvParameters )\r\n * {\r\n * char cValueToPost;\r\n * const TickType_t xTicksToWait = ( TickType_t )0xff;\r\n *\r\n *  // Create a queue capable of containing 10 characters.\r\n *  xQueue = xQueueCreate( 10, sizeof( char ) );\r\n *  if( xQueue == 0 )\r\n *  {\r\n *      // Failed to create the queue.\r\n *  }\r\n *\r\n *  // ...\r\n *\r\n *  // Post some characters that will be used within an ISR.  If the queue\r\n *  // is full then this task will block for xTicksToWait ticks.\r\n *  cValueToPost = 'a';\r\n *  xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );\r\n *  cValueToPost = 'b';\r\n *  xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );\r\n *\r\n *  // ... keep posting characters ... this task may block when the queue\r\n *  // becomes full.\r\n *\r\n *  cValueToPost = 'c';\r\n *  xQueueSend( xQueue, ( void * ) &cValueToPost, xTicksToWait );\r\n * }\r\n *\r\n * // ISR that outputs all the characters received on the queue.\r\n * void vISR_Routine( void )\r\n * {\r\n * BaseType_t xTaskWokenByReceive = pdFALSE;\r\n * char cRxedChar;\r\n *\r\n *  while( xQueueReceiveFromISR( xQueue, ( void * ) &cRxedChar, &xTaskWokenByReceive) )\r\n *  {\r\n *      // A character was received.  Output the character now.\r\n *      vOutputCharacter( cRxedChar );\r\n *\r\n *      // If removing the character from the queue woke the task that was\r\n *      // posting onto the queue xTaskWokenByReceive will have been set to\r\n *      // pdTRUE.  No matter how many times this loop iterates only one\r\n *      // task will be woken.\r\n *  }\r\n *\r\n *  if( xTaskWokenByReceive != ( char ) pdFALSE;\r\n *  {\r\n *      taskYIELD ();\r\n *  }\r\n * }\r\n * @endcode\r\n * \\defgroup xQueueReceiveFromISR xQueueReceiveFromISR\r\n * \\ingroup QueueManagement\r\n */\r\nBaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue,\r\n                                 void * const pvBuffer,\r\n                                 BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Utilities to query queues that are safe to use from an ISR.  These utilities\r\n * should be used only from within an ISR, or within a critical section.\r\n */\r\nBaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;\r\nBaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;\r\nUBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;\r\n\r\n#if ( configUSE_CO_ROUTINES == 1 )\r\n\r\n/*\r\n * The functions defined above are for passing data to and from tasks.  The\r\n * functions below are the equivalents for passing data to and from\r\n * co-routines.\r\n *\r\n * These functions are called from the co-routine macro implementation and\r\n * should not be called directly from application code.  Instead use the macro\r\n * wrappers defined within croutine.h.\r\n */\r\n    BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue,\r\n                                    const void * pvItemToQueue,\r\n                                    BaseType_t xCoRoutinePreviouslyWoken );\r\n    BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue,\r\n                                       void * pvBuffer,\r\n                                       BaseType_t * pxTaskWoken );\r\n    BaseType_t xQueueCRSend( QueueHandle_t xQueue,\r\n                             const void * pvItemToQueue,\r\n                             TickType_t xTicksToWait );\r\n    BaseType_t xQueueCRReceive( QueueHandle_t xQueue,\r\n                                void * pvBuffer,\r\n                                TickType_t xTicksToWait );\r\n\r\n#endif /* if ( configUSE_CO_ROUTINES == 1 ) */\r\n\r\n/*\r\n * For internal use only.  Use xSemaphoreCreateMutex(),\r\n * xSemaphoreCreateCounting() or xSemaphoreGetMutexHolder() instead of calling\r\n * these functions directly.\r\n */\r\nQueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType ) PRIVILEGED_FUNCTION;\r\n\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n    QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType,\r\n                                           StaticQueue_t * pxStaticQueue ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n#if ( configUSE_COUNTING_SEMAPHORES == 1 )\r\n    QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount,\r\n                                                 const UBaseType_t uxInitialCount ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n#if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )\r\n    QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount,\r\n                                                       const UBaseType_t uxInitialCount,\r\n                                                       StaticQueue_t * pxStaticQueue ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\nBaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue,\r\n                                TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r\n\r\n#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) )\r\n    TaskHandle_t xQueueGetMutexHolder( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION;\r\n    TaskHandle_t xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/*\r\n * For internal use only.  Use xSemaphoreTakeMutexRecursive() or\r\n * xSemaphoreGiveMutexRecursive() instead of calling these functions directly.\r\n */\r\nBaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex,\r\n                                     TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r\nBaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Reset a queue back to its original empty state.  The return value is now\r\n * obsolete and is always set to pdPASS.\r\n */\r\n#define xQueueReset( xQueue )    xQueueGenericReset( ( xQueue ), pdFALSE )\r\n\r\n/*\r\n * The registry is provided as a means for kernel aware debuggers to\r\n * locate queues, semaphores and mutexes.  Call vQueueAddToRegistry() add\r\n * a queue, semaphore or mutex handle to the registry if you want the handle\r\n * to be available to a kernel aware debugger.  If you are not using a kernel\r\n * aware debugger then this function can be ignored.\r\n *\r\n * configQUEUE_REGISTRY_SIZE defines the maximum number of handles the\r\n * registry can hold.  configQUEUE_REGISTRY_SIZE must be greater than 0\r\n * within FreeRTOSConfig.h for the registry to be available.  Its value\r\n * does not affect the number of queues, semaphores and mutexes that can be\r\n * created - just the number that the registry can hold.\r\n *\r\n * If vQueueAddToRegistry is called more than once with the same xQueue\r\n * parameter, the registry will store the pcQueueName parameter from the\r\n * most recent call to vQueueAddToRegistry.\r\n *\r\n * @param xQueue The handle of the queue being added to the registry.  This\r\n * is the handle returned by a call to xQueueCreate().  Semaphore and mutex\r\n * handles can also be passed in here.\r\n *\r\n * @param pcQueueName The name to be associated with the handle.  This is the\r\n * name that the kernel aware debugger will display.  The queue registry only\r\n * stores a pointer to the string - so the string must be persistent (global or\r\n * preferably in ROM/Flash), not on the stack.\r\n */\r\n#if ( configQUEUE_REGISTRY_SIZE > 0 )\r\n    void vQueueAddToRegistry( QueueHandle_t xQueue,\r\n                              const char * pcQueueName ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/*\r\n * The registry is provided as a means for kernel aware debuggers to\r\n * locate queues, semaphores and mutexes.  Call vQueueAddToRegistry() add\r\n * a queue, semaphore or mutex handle to the registry if you want the handle\r\n * to be available to a kernel aware debugger, and vQueueUnregisterQueue() to\r\n * remove the queue, semaphore or mutex from the register.  If you are not using\r\n * a kernel aware debugger then this function can be ignored.\r\n *\r\n * @param xQueue The handle of the queue being removed from the registry.\r\n */\r\n#if ( configQUEUE_REGISTRY_SIZE > 0 )\r\n    void vQueueUnregisterQueue( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/*\r\n * The queue registry is provided as a means for kernel aware debuggers to\r\n * locate queues, semaphores and mutexes.  Call pcQueueGetName() to look\r\n * up and return the name of a queue in the queue registry from the queue's\r\n * handle.\r\n *\r\n * @param xQueue The handle of the queue the name of which will be returned.\r\n * @return If the queue is in the registry then a pointer to the name of the\r\n * queue is returned.  If the queue is not in the registry then NULL is\r\n * returned.\r\n */\r\n#if ( configQUEUE_REGISTRY_SIZE > 0 )\r\n    const char * pcQueueGetName( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/*\r\n * Generic version of the function used to create a queue using dynamic memory\r\n * allocation.  This is called by other functions and macros that create other\r\n * RTOS objects that use the queue structure as their base.\r\n */\r\n#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r\n    QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength,\r\n                                       const UBaseType_t uxItemSize,\r\n                                       const uint8_t ucQueueType ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/*\r\n * Generic version of the function used to create a queue using dynamic memory\r\n * allocation.  This is called by other functions and macros that create other\r\n * RTOS objects that use the queue structure as their base.\r\n */\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n    QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength,\r\n                                             const UBaseType_t uxItemSize,\r\n                                             uint8_t * pucQueueStorage,\r\n                                             StaticQueue_t * pxStaticQueue,\r\n                                             const uint8_t ucQueueType ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/*\r\n * Generic version of the function used to retrieve the buffers of statically\r\n * created queues. This is called by other functions and macros that retrieve\r\n * the buffers of other statically created RTOS objects that use the queue\r\n * structure as their base.\r\n */\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n    BaseType_t xQueueGenericGetStaticBuffers( QueueHandle_t xQueue,\r\n                                              uint8_t ** ppucQueueStorage,\r\n                                              StaticQueue_t ** ppxStaticQueue ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/*\r\n * Queue sets provide a mechanism to allow a task to block (pend) on a read\r\n * operation from multiple queues or semaphores simultaneously.\r\n *\r\n * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this\r\n * function.\r\n *\r\n * A queue set must be explicitly created using a call to xQueueCreateSet()\r\n * before it can be used.  Once created, standard FreeRTOS queues and semaphores\r\n * can be added to the set using calls to xQueueAddToSet().\r\n * xQueueSelectFromSet() is then used to determine which, if any, of the queues\r\n * or semaphores contained in the set is in a state where a queue read or\r\n * semaphore take operation would be successful.\r\n *\r\n * Note 1:  See the documentation on https://www.FreeRTOS.org/RTOS-queue-sets.html\r\n * for reasons why queue sets are very rarely needed in practice as there are\r\n * simpler methods of blocking on multiple objects.\r\n *\r\n * Note 2:  Blocking on a queue set that contains a mutex will not cause the\r\n * mutex holder to inherit the priority of the blocked task.\r\n *\r\n * Note 3:  An additional 4 bytes of RAM is required for each space in a every\r\n * queue added to a queue set.  Therefore counting semaphores that have a high\r\n * maximum count value should not be added to a queue set.\r\n *\r\n * Note 4:  A receive (in the case of a queue) or take (in the case of a\r\n * semaphore) operation must not be performed on a member of a queue set unless\r\n * a call to xQueueSelectFromSet() has first returned a handle to that set member.\r\n *\r\n * @param uxEventQueueLength Queue sets store events that occur on\r\n * the queues and semaphores contained in the set.  uxEventQueueLength specifies\r\n * the maximum number of events that can be queued at once.  To be absolutely\r\n * certain that events are not lost uxEventQueueLength should be set to the\r\n * total sum of the length of the queues added to the set, where binary\r\n * semaphores and mutexes have a length of 1, and counting semaphores have a\r\n * length set by their maximum count value.  Examples:\r\n *  + If a queue set is to hold a queue of length 5, another queue of length 12,\r\n *    and a binary semaphore, then uxEventQueueLength should be set to\r\n *    (5 + 12 + 1), or 18.\r\n *  + If a queue set is to hold three binary semaphores then uxEventQueueLength\r\n *    should be set to (1 + 1 + 1 ), or 3.\r\n *  + If a queue set is to hold a counting semaphore that has a maximum count of\r\n *    5, and a counting semaphore that has a maximum count of 3, then\r\n *    uxEventQueueLength should be set to (5 + 3), or 8.\r\n *\r\n * @return If the queue set is created successfully then a handle to the created\r\n * queue set is returned.  Otherwise NULL is returned.\r\n */\r\n#if ( ( configUSE_QUEUE_SETS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )\r\n    QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/*\r\n * Adds a queue or semaphore to a queue set that was previously created by a\r\n * call to xQueueCreateSet().\r\n *\r\n * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this\r\n * function.\r\n *\r\n * Note 1:  A receive (in the case of a queue) or take (in the case of a\r\n * semaphore) operation must not be performed on a member of a queue set unless\r\n * a call to xQueueSelectFromSet() has first returned a handle to that set member.\r\n *\r\n * @param xQueueOrSemaphore The handle of the queue or semaphore being added to\r\n * the queue set (cast to an QueueSetMemberHandle_t type).\r\n *\r\n * @param xQueueSet The handle of the queue set to which the queue or semaphore\r\n * is being added.\r\n *\r\n * @return If the queue or semaphore was successfully added to the queue set\r\n * then pdPASS is returned.  If the queue could not be successfully added to the\r\n * queue set because it is already a member of a different queue set then pdFAIL\r\n * is returned.\r\n */\r\n#if ( configUSE_QUEUE_SETS == 1 )\r\n    BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore,\r\n                               QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/*\r\n * Removes a queue or semaphore from a queue set.  A queue or semaphore can only\r\n * be removed from a set if the queue or semaphore is empty.\r\n *\r\n * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this\r\n * function.\r\n *\r\n * @param xQueueOrSemaphore The handle of the queue or semaphore being removed\r\n * from the queue set (cast to an QueueSetMemberHandle_t type).\r\n *\r\n * @param xQueueSet The handle of the queue set in which the queue or semaphore\r\n * is included.\r\n *\r\n * @return If the queue or semaphore was successfully removed from the queue set\r\n * then pdPASS is returned.  If the queue was not in the queue set, or the\r\n * queue (or semaphore) was not empty, then pdFAIL is returned.\r\n */\r\n#if ( configUSE_QUEUE_SETS == 1 )\r\n    BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore,\r\n                                    QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/*\r\n * xQueueSelectFromSet() selects from the members of a queue set a queue or\r\n * semaphore that either contains data (in the case of a queue) or is available\r\n * to take (in the case of a semaphore).  xQueueSelectFromSet() effectively\r\n * allows a task to block (pend) on a read operation on all the queues and\r\n * semaphores in a queue set simultaneously.\r\n *\r\n * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this\r\n * function.\r\n *\r\n * Note 1:  See the documentation on https://www.FreeRTOS.org/RTOS-queue-sets.html\r\n * for reasons why queue sets are very rarely needed in practice as there are\r\n * simpler methods of blocking on multiple objects.\r\n *\r\n * Note 2:  Blocking on a queue set that contains a mutex will not cause the\r\n * mutex holder to inherit the priority of the blocked task.\r\n *\r\n * Note 3:  A receive (in the case of a queue) or take (in the case of a\r\n * semaphore) operation must not be performed on a member of a queue set unless\r\n * a call to xQueueSelectFromSet() has first returned a handle to that set member.\r\n *\r\n * @param xQueueSet The queue set on which the task will (potentially) block.\r\n *\r\n * @param xTicksToWait The maximum time, in ticks, that the calling task will\r\n * remain in the Blocked state (with other tasks executing) to wait for a member\r\n * of the queue set to be ready for a successful queue read or semaphore take\r\n * operation.\r\n *\r\n * @return xQueueSelectFromSet() will return the handle of a queue (cast to\r\n * a QueueSetMemberHandle_t type) contained in the queue set that contains data,\r\n * or the handle of a semaphore (cast to a QueueSetMemberHandle_t type) contained\r\n * in the queue set that is available, or NULL if no such queue or semaphore\r\n * exists before before the specified block time expires.\r\n */\r\n#if ( configUSE_QUEUE_SETS == 1 )\r\n    QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet,\r\n                                                const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/*\r\n * A version of xQueueSelectFromSet() that can be used from an ISR.\r\n */\r\n#if ( configUSE_QUEUE_SETS == 1 )\r\n    QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/* Not public API functions. */\r\nvoid vQueueWaitForMessageRestricted( QueueHandle_t xQueue,\r\n                                     TickType_t xTicksToWait,\r\n                                     const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION;\r\nBaseType_t xQueueGenericReset( QueueHandle_t xQueue,\r\n                               BaseType_t xNewQueue ) PRIVILEGED_FUNCTION;\r\n\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n    void vQueueSetQueueNumber( QueueHandle_t xQueue,\r\n                               UBaseType_t uxQueueNumber ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n    UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n    uint8_t ucQueueGetQueueType( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\nUBaseType_t uxQueueGetQueueItemSize( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;\r\nUBaseType_t uxQueueGetQueueLength( QueueHandle_t xQueue ) PRIVILEGED_FUNCTION;\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    }\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n#endif /* QUEUE_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/semphr.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n#ifndef SEMAPHORE_H\r\n#define SEMAPHORE_H\r\n\r\n#ifndef INC_FREERTOS_H\r\n    #error \"include FreeRTOS.h\" must appear in source files before \"include semphr.h\"\r\n#endif\r\n\r\n#include \"queue.h\"\r\n\r\ntypedef QueueHandle_t SemaphoreHandle_t;\r\n\r\n#define semBINARY_SEMAPHORE_QUEUE_LENGTH    ( ( uint8_t ) 1U )\r\n#define semSEMAPHORE_QUEUE_ITEM_LENGTH      ( ( uint8_t ) 0U )\r\n#define semGIVE_BLOCK_TIME                  ( ( TickType_t ) 0U )\r\n\r\n\r\n/**\r\n * semphr. h\r\n * @code{c}\r\n * vSemaphoreCreateBinary( SemaphoreHandle_t xSemaphore );\r\n * @endcode\r\n *\r\n * In many usage scenarios it is faster and more memory efficient to use a\r\n * direct to task notification in place of a binary semaphore!\r\n * https://www.FreeRTOS.org/RTOS-task-notifications.html\r\n *\r\n * This old vSemaphoreCreateBinary() macro is now deprecated in favour of the\r\n * xSemaphoreCreateBinary() function.  Note that binary semaphores created using\r\n * the vSemaphoreCreateBinary() macro are created in a state such that the\r\n * first call to 'take' the semaphore would pass, whereas binary semaphores\r\n * created using xSemaphoreCreateBinary() are created in a state such that the\r\n * the semaphore must first be 'given' before it can be 'taken'.\r\n *\r\n * <i>Macro</i> that implements a semaphore by using the existing queue mechanism.\r\n * The queue length is 1 as this is a binary semaphore.  The data size is 0\r\n * as we don't want to actually store any data - we just want to know if the\r\n * queue is empty or full.\r\n *\r\n * This type of semaphore can be used for pure synchronisation between tasks or\r\n * between an interrupt and a task.  The semaphore need not be given back once\r\n * obtained, so one task/interrupt can continuously 'give' the semaphore while\r\n * another continuously 'takes' the semaphore.  For this reason this type of\r\n * semaphore does not use a priority inheritance mechanism.  For an alternative\r\n * that does use priority inheritance see xSemaphoreCreateMutex().\r\n *\r\n * @param xSemaphore Handle to the created semaphore.  Should be of type SemaphoreHandle_t.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * SemaphoreHandle_t xSemaphore = NULL;\r\n *\r\n * void vATask( void * pvParameters )\r\n * {\r\n *  // Semaphore cannot be used before a call to vSemaphoreCreateBinary ().\r\n *  // This is a macro so pass the variable in directly.\r\n *  vSemaphoreCreateBinary( xSemaphore );\r\n *\r\n *  if( xSemaphore != NULL )\r\n *  {\r\n *      // The semaphore was created successfully.\r\n *      // The semaphore can now be used.\r\n *  }\r\n * }\r\n * @endcode\r\n * \\defgroup vSemaphoreCreateBinary vSemaphoreCreateBinary\r\n * \\ingroup Semaphores\r\n */\r\n#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r\n    #define vSemaphoreCreateBinary( xSemaphore )                                                                                     \\\r\n    do {                                                                                                                             \\\r\n        ( xSemaphore ) = xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE ); \\\r\n        if( ( xSemaphore ) != NULL )                                                                                                 \\\r\n        {                                                                                                                            \\\r\n            ( void ) xSemaphoreGive( ( xSemaphore ) );                                                                               \\\r\n        }                                                                                                                            \\\r\n    } while( 0 )\r\n#endif\r\n\r\n/**\r\n * semphr. h\r\n * @code{c}\r\n * SemaphoreHandle_t xSemaphoreCreateBinary( void );\r\n * @endcode\r\n *\r\n * Creates a new binary semaphore instance, and returns a handle by which the\r\n * new semaphore can be referenced.\r\n *\r\n * In many usage scenarios it is faster and more memory efficient to use a\r\n * direct to task notification in place of a binary semaphore!\r\n * https://www.FreeRTOS.org/RTOS-task-notifications.html\r\n *\r\n * Internally, within the FreeRTOS implementation, binary semaphores use a block\r\n * of memory, in which the semaphore structure is stored.  If a binary semaphore\r\n * is created using xSemaphoreCreateBinary() then the required memory is\r\n * automatically dynamically allocated inside the xSemaphoreCreateBinary()\r\n * function.  (see https://www.FreeRTOS.org/a00111.html).  If a binary semaphore\r\n * is created using xSemaphoreCreateBinaryStatic() then the application writer\r\n * must provide the memory.  xSemaphoreCreateBinaryStatic() therefore allows a\r\n * binary semaphore to be created without using any dynamic memory allocation.\r\n *\r\n * The old vSemaphoreCreateBinary() macro is now deprecated in favour of this\r\n * xSemaphoreCreateBinary() function.  Note that binary semaphores created using\r\n * the vSemaphoreCreateBinary() macro are created in a state such that the\r\n * first call to 'take' the semaphore would pass, whereas binary semaphores\r\n * created using xSemaphoreCreateBinary() are created in a state such that the\r\n * the semaphore must first be 'given' before it can be 'taken'.\r\n *\r\n * This type of semaphore can be used for pure synchronisation between tasks or\r\n * between an interrupt and a task.  The semaphore need not be given back once\r\n * obtained, so one task/interrupt can continuously 'give' the semaphore while\r\n * another continuously 'takes' the semaphore.  For this reason this type of\r\n * semaphore does not use a priority inheritance mechanism.  For an alternative\r\n * that does use priority inheritance see xSemaphoreCreateMutex().\r\n *\r\n * @return Handle to the created semaphore, or NULL if the memory required to\r\n * hold the semaphore's data structures could not be allocated.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * SemaphoreHandle_t xSemaphore = NULL;\r\n *\r\n * void vATask( void * pvParameters )\r\n * {\r\n *  // Semaphore cannot be used before a call to xSemaphoreCreateBinary().\r\n *  // This is a macro so pass the variable in directly.\r\n *  xSemaphore = xSemaphoreCreateBinary();\r\n *\r\n *  if( xSemaphore != NULL )\r\n *  {\r\n *      // The semaphore was created successfully.\r\n *      // The semaphore can now be used.\r\n *  }\r\n * }\r\n * @endcode\r\n * \\defgroup xSemaphoreCreateBinary xSemaphoreCreateBinary\r\n * \\ingroup Semaphores\r\n */\r\n#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r\n    #define xSemaphoreCreateBinary()    xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE )\r\n#endif\r\n\r\n/**\r\n * semphr. h\r\n * @code{c}\r\n * SemaphoreHandle_t xSemaphoreCreateBinaryStatic( StaticSemaphore_t *pxSemaphoreBuffer );\r\n * @endcode\r\n *\r\n * Creates a new binary semaphore instance, and returns a handle by which the\r\n * new semaphore can be referenced.\r\n *\r\n * NOTE: In many usage scenarios it is faster and more memory efficient to use a\r\n * direct to task notification in place of a binary semaphore!\r\n * https://www.FreeRTOS.org/RTOS-task-notifications.html\r\n *\r\n * Internally, within the FreeRTOS implementation, binary semaphores use a block\r\n * of memory, in which the semaphore structure is stored.  If a binary semaphore\r\n * is created using xSemaphoreCreateBinary() then the required memory is\r\n * automatically dynamically allocated inside the xSemaphoreCreateBinary()\r\n * function.  (see https://www.FreeRTOS.org/a00111.html).  If a binary semaphore\r\n * is created using xSemaphoreCreateBinaryStatic() then the application writer\r\n * must provide the memory.  xSemaphoreCreateBinaryStatic() therefore allows a\r\n * binary semaphore to be created without using any dynamic memory allocation.\r\n *\r\n * This type of semaphore can be used for pure synchronisation between tasks or\r\n * between an interrupt and a task.  The semaphore need not be given back once\r\n * obtained, so one task/interrupt can continuously 'give' the semaphore while\r\n * another continuously 'takes' the semaphore.  For this reason this type of\r\n * semaphore does not use a priority inheritance mechanism.  For an alternative\r\n * that does use priority inheritance see xSemaphoreCreateMutex().\r\n *\r\n * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t,\r\n * which will then be used to hold the semaphore's data structure, removing the\r\n * need for the memory to be allocated dynamically.\r\n *\r\n * @return If the semaphore is created then a handle to the created semaphore is\r\n * returned.  If pxSemaphoreBuffer is NULL then NULL is returned.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * SemaphoreHandle_t xSemaphore = NULL;\r\n * StaticSemaphore_t xSemaphoreBuffer;\r\n *\r\n * void vATask( void * pvParameters )\r\n * {\r\n *  // Semaphore cannot be used before a call to xSemaphoreCreateBinary().\r\n *  // The semaphore's data structures will be placed in the xSemaphoreBuffer\r\n *  // variable, the address of which is passed into the function.  The\r\n *  // function's parameter is not NULL, so the function will not attempt any\r\n *  // dynamic memory allocation, and therefore the function will not return\r\n *  // return NULL.\r\n *  xSemaphore = xSemaphoreCreateBinary( &xSemaphoreBuffer );\r\n *\r\n *  // Rest of task code goes here.\r\n * }\r\n * @endcode\r\n * \\defgroup xSemaphoreCreateBinaryStatic xSemaphoreCreateBinaryStatic\r\n * \\ingroup Semaphores\r\n */\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n    #define xSemaphoreCreateBinaryStatic( pxStaticSemaphore )    xQueueGenericCreateStatic( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, ( pxStaticSemaphore ), queueQUEUE_TYPE_BINARY_SEMAPHORE )\r\n#endif /* configSUPPORT_STATIC_ALLOCATION */\r\n\r\n/**\r\n * semphr. h\r\n * @code{c}\r\n * xSemaphoreTake(\r\n *                   SemaphoreHandle_t xSemaphore,\r\n *                   TickType_t xBlockTime\r\n *               );\r\n * @endcode\r\n *\r\n * <i>Macro</i> to obtain a semaphore.  The semaphore must have previously been\r\n * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or\r\n * xSemaphoreCreateCounting().\r\n *\r\n * @param xSemaphore A handle to the semaphore being taken - obtained when\r\n * the semaphore was created.\r\n *\r\n * @param xBlockTime The time in ticks to wait for the semaphore to become\r\n * available.  The macro portTICK_PERIOD_MS can be used to convert this to a\r\n * real time.  A block time of zero can be used to poll the semaphore.  A block\r\n * time of portMAX_DELAY can be used to block indefinitely (provided\r\n * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h).\r\n *\r\n * @return pdTRUE if the semaphore was obtained.  pdFALSE\r\n * if xBlockTime expired without the semaphore becoming available.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * SemaphoreHandle_t xSemaphore = NULL;\r\n *\r\n * // A task that creates a semaphore.\r\n * void vATask( void * pvParameters )\r\n * {\r\n *  // Create the semaphore to guard a shared resource.\r\n *  xSemaphore = xSemaphoreCreateBinary();\r\n * }\r\n *\r\n * // A task that uses the semaphore.\r\n * void vAnotherTask( void * pvParameters )\r\n * {\r\n *  // ... Do other things.\r\n *\r\n *  if( xSemaphore != NULL )\r\n *  {\r\n *      // See if we can obtain the semaphore.  If the semaphore is not available\r\n *      // wait 10 ticks to see if it becomes free.\r\n *      if( xSemaphoreTake( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )\r\n *      {\r\n *          // We were able to obtain the semaphore and can now access the\r\n *          // shared resource.\r\n *\r\n *          // ...\r\n *\r\n *          // We have finished accessing the shared resource.  Release the\r\n *          // semaphore.\r\n *          xSemaphoreGive( xSemaphore );\r\n *      }\r\n *      else\r\n *      {\r\n *          // We could not obtain the semaphore and can therefore not access\r\n *          // the shared resource safely.\r\n *      }\r\n *  }\r\n * }\r\n * @endcode\r\n * \\defgroup xSemaphoreTake xSemaphoreTake\r\n * \\ingroup Semaphores\r\n */\r\n#define xSemaphoreTake( xSemaphore, xBlockTime )    xQueueSemaphoreTake( ( xSemaphore ), ( xBlockTime ) )\r\n\r\n/**\r\n * semphr. h\r\n * @code{c}\r\n * xSemaphoreTakeRecursive(\r\n *                          SemaphoreHandle_t xMutex,\r\n *                          TickType_t xBlockTime\r\n *                        );\r\n * @endcode\r\n *\r\n * <i>Macro</i> to recursively obtain, or 'take', a mutex type semaphore.\r\n * The mutex must have previously been created using a call to\r\n * xSemaphoreCreateRecursiveMutex();\r\n *\r\n * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this\r\n * macro to be available.\r\n *\r\n * This macro must not be used on mutexes created using xSemaphoreCreateMutex().\r\n *\r\n * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex\r\n * doesn't become available again until the owner has called\r\n * xSemaphoreGiveRecursive() for each successful 'take' request.  For example,\r\n * if a task successfully 'takes' the same mutex 5 times then the mutex will\r\n * not be available to any other task until it has also  'given' the mutex back\r\n * exactly five times.\r\n *\r\n * @param xMutex A handle to the mutex being obtained.  This is the\r\n * handle returned by xSemaphoreCreateRecursiveMutex();\r\n *\r\n * @param xBlockTime The time in ticks to wait for the semaphore to become\r\n * available.  The macro portTICK_PERIOD_MS can be used to convert this to a\r\n * real time.  A block time of zero can be used to poll the semaphore.  If\r\n * the task already owns the semaphore then xSemaphoreTakeRecursive() will\r\n * return immediately no matter what the value of xBlockTime.\r\n *\r\n * @return pdTRUE if the semaphore was obtained.  pdFALSE if xBlockTime\r\n * expired without the semaphore becoming available.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * SemaphoreHandle_t xMutex = NULL;\r\n *\r\n * // A task that creates a mutex.\r\n * void vATask( void * pvParameters )\r\n * {\r\n *  // Create the mutex to guard a shared resource.\r\n *  xMutex = xSemaphoreCreateRecursiveMutex();\r\n * }\r\n *\r\n * // A task that uses the mutex.\r\n * void vAnotherTask( void * pvParameters )\r\n * {\r\n *  // ... Do other things.\r\n *\r\n *  if( xMutex != NULL )\r\n *  {\r\n *      // See if we can obtain the mutex.  If the mutex is not available\r\n *      // wait 10 ticks to see if it becomes free.\r\n *      if( xSemaphoreTakeRecursive( xSemaphore, ( TickType_t ) 10 ) == pdTRUE )\r\n *      {\r\n *          // We were able to obtain the mutex and can now access the\r\n *          // shared resource.\r\n *\r\n *          // ...\r\n *          // For some reason due to the nature of the code further calls to\r\n *          // xSemaphoreTakeRecursive() are made on the same mutex.  In real\r\n *          // code these would not be just sequential calls as this would make\r\n *          // no sense.  Instead the calls are likely to be buried inside\r\n *          // a more complex call structure.\r\n *          xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );\r\n *          xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );\r\n *\r\n *          // The mutex has now been 'taken' three times, so will not be\r\n *          // available to another task until it has also been given back\r\n *          // three times.  Again it is unlikely that real code would have\r\n *          // these calls sequentially, but instead buried in a more complex\r\n *          // call structure.  This is just for illustrative purposes.\r\n *          xSemaphoreGiveRecursive( xMutex );\r\n *          xSemaphoreGiveRecursive( xMutex );\r\n *          xSemaphoreGiveRecursive( xMutex );\r\n *\r\n *          // Now the mutex can be taken by other tasks.\r\n *      }\r\n *      else\r\n *      {\r\n *          // We could not obtain the mutex and can therefore not access\r\n *          // the shared resource safely.\r\n *      }\r\n *  }\r\n * }\r\n * @endcode\r\n * \\defgroup xSemaphoreTakeRecursive xSemaphoreTakeRecursive\r\n * \\ingroup Semaphores\r\n */\r\n#if ( configUSE_RECURSIVE_MUTEXES == 1 )\r\n    #define xSemaphoreTakeRecursive( xMutex, xBlockTime )    xQueueTakeMutexRecursive( ( xMutex ), ( xBlockTime ) )\r\n#endif\r\n\r\n/**\r\n * semphr. h\r\n * @code{c}\r\n * xSemaphoreGive( SemaphoreHandle_t xSemaphore );\r\n * @endcode\r\n *\r\n * <i>Macro</i> to release a semaphore.  The semaphore must have previously been\r\n * created with a call to xSemaphoreCreateBinary(), xSemaphoreCreateMutex() or\r\n * xSemaphoreCreateCounting(). and obtained using sSemaphoreTake().\r\n *\r\n * This macro must not be used from an ISR.  See xSemaphoreGiveFromISR () for\r\n * an alternative which can be used from an ISR.\r\n *\r\n * This macro must also not be used on semaphores created using\r\n * xSemaphoreCreateRecursiveMutex().\r\n *\r\n * @param xSemaphore A handle to the semaphore being released.  This is the\r\n * handle returned when the semaphore was created.\r\n *\r\n * @return pdTRUE if the semaphore was released.  pdFALSE if an error occurred.\r\n * Semaphores are implemented using queues.  An error can occur if there is\r\n * no space on the queue to post a message - indicating that the\r\n * semaphore was not first obtained correctly.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * SemaphoreHandle_t xSemaphore = NULL;\r\n *\r\n * void vATask( void * pvParameters )\r\n * {\r\n *  // Create the semaphore to guard a shared resource.\r\n *  xSemaphore = vSemaphoreCreateBinary();\r\n *\r\n *  if( xSemaphore != NULL )\r\n *  {\r\n *      if( xSemaphoreGive( xSemaphore ) != pdTRUE )\r\n *      {\r\n *          // We would expect this call to fail because we cannot give\r\n *          // a semaphore without first \"taking\" it!\r\n *      }\r\n *\r\n *      // Obtain the semaphore - don't block if the semaphore is not\r\n *      // immediately available.\r\n *      if( xSemaphoreTake( xSemaphore, ( TickType_t ) 0 ) )\r\n *      {\r\n *          // We now have the semaphore and can access the shared resource.\r\n *\r\n *          // ...\r\n *\r\n *          // We have finished accessing the shared resource so can free the\r\n *          // semaphore.\r\n *          if( xSemaphoreGive( xSemaphore ) != pdTRUE )\r\n *          {\r\n *              // We would not expect this call to fail because we must have\r\n *              // obtained the semaphore to get here.\r\n *          }\r\n *      }\r\n *  }\r\n * }\r\n * @endcode\r\n * \\defgroup xSemaphoreGive xSemaphoreGive\r\n * \\ingroup Semaphores\r\n */\r\n#define xSemaphoreGive( xSemaphore )    xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK )\r\n\r\n/**\r\n * semphr. h\r\n * @code{c}\r\n * xSemaphoreGiveRecursive( SemaphoreHandle_t xMutex );\r\n * @endcode\r\n *\r\n * <i>Macro</i> to recursively release, or 'give', a mutex type semaphore.\r\n * The mutex must have previously been created using a call to\r\n * xSemaphoreCreateRecursiveMutex();\r\n *\r\n * configUSE_RECURSIVE_MUTEXES must be set to 1 in FreeRTOSConfig.h for this\r\n * macro to be available.\r\n *\r\n * This macro must not be used on mutexes created using xSemaphoreCreateMutex().\r\n *\r\n * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex\r\n * doesn't become available again until the owner has called\r\n * xSemaphoreGiveRecursive() for each successful 'take' request.  For example,\r\n * if a task successfully 'takes' the same mutex 5 times then the mutex will\r\n * not be available to any other task until it has also  'given' the mutex back\r\n * exactly five times.\r\n *\r\n * @param xMutex A handle to the mutex being released, or 'given'.  This is the\r\n * handle returned by xSemaphoreCreateMutex();\r\n *\r\n * @return pdTRUE if the semaphore was given.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * SemaphoreHandle_t xMutex = NULL;\r\n *\r\n * // A task that creates a mutex.\r\n * void vATask( void * pvParameters )\r\n * {\r\n *  // Create the mutex to guard a shared resource.\r\n *  xMutex = xSemaphoreCreateRecursiveMutex();\r\n * }\r\n *\r\n * // A task that uses the mutex.\r\n * void vAnotherTask( void * pvParameters )\r\n * {\r\n *  // ... Do other things.\r\n *\r\n *  if( xMutex != NULL )\r\n *  {\r\n *      // See if we can obtain the mutex.  If the mutex is not available\r\n *      // wait 10 ticks to see if it becomes free.\r\n *      if( xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 ) == pdTRUE )\r\n *      {\r\n *          // We were able to obtain the mutex and can now access the\r\n *          // shared resource.\r\n *\r\n *          // ...\r\n *          // For some reason due to the nature of the code further calls to\r\n *          // xSemaphoreTakeRecursive() are made on the same mutex.  In real\r\n *          // code these would not be just sequential calls as this would make\r\n *          // no sense.  Instead the calls are likely to be buried inside\r\n *          // a more complex call structure.\r\n *          xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );\r\n *          xSemaphoreTakeRecursive( xMutex, ( TickType_t ) 10 );\r\n *\r\n *          // The mutex has now been 'taken' three times, so will not be\r\n *          // available to another task until it has also been given back\r\n *          // three times.  Again it is unlikely that real code would have\r\n *          // these calls sequentially, it would be more likely that the calls\r\n *          // to xSemaphoreGiveRecursive() would be called as a call stack\r\n *          // unwound.  This is just for demonstrative purposes.\r\n *          xSemaphoreGiveRecursive( xMutex );\r\n *          xSemaphoreGiveRecursive( xMutex );\r\n *          xSemaphoreGiveRecursive( xMutex );\r\n *\r\n *          // Now the mutex can be taken by other tasks.\r\n *      }\r\n *      else\r\n *      {\r\n *          // We could not obtain the mutex and can therefore not access\r\n *          // the shared resource safely.\r\n *      }\r\n *  }\r\n * }\r\n * @endcode\r\n * \\defgroup xSemaphoreGiveRecursive xSemaphoreGiveRecursive\r\n * \\ingroup Semaphores\r\n */\r\n#if ( configUSE_RECURSIVE_MUTEXES == 1 )\r\n    #define xSemaphoreGiveRecursive( xMutex )    xQueueGiveMutexRecursive( ( xMutex ) )\r\n#endif\r\n\r\n/**\r\n * semphr. h\r\n * @code{c}\r\n * xSemaphoreGiveFromISR(\r\n *                        SemaphoreHandle_t xSemaphore,\r\n *                        BaseType_t *pxHigherPriorityTaskWoken\r\n *                    );\r\n * @endcode\r\n *\r\n * <i>Macro</i> to  release a semaphore.  The semaphore must have previously been\r\n * created with a call to xSemaphoreCreateBinary() or xSemaphoreCreateCounting().\r\n *\r\n * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex())\r\n * must not be used with this macro.\r\n *\r\n * This macro can be used from an ISR.\r\n *\r\n * @param xSemaphore A handle to the semaphore being released.  This is the\r\n * handle returned when the semaphore was created.\r\n *\r\n * @param pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set\r\n * *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task\r\n * to unblock, and the unblocked task has a priority higher than the currently\r\n * running task.  If xSemaphoreGiveFromISR() sets this value to pdTRUE then\r\n * a context switch should be requested before the interrupt is exited.\r\n *\r\n * @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n \\#define LONG_TIME 0xffff\r\n \\#define TICKS_TO_WAIT 10\r\n * SemaphoreHandle_t xSemaphore = NULL;\r\n *\r\n * // Repetitive task.\r\n * void vATask( void * pvParameters )\r\n * {\r\n *  for( ;; )\r\n *  {\r\n *      // We want this task to run every 10 ticks of a timer.  The semaphore\r\n *      // was created before this task was started.\r\n *\r\n *      // Block waiting for the semaphore to become available.\r\n *      if( xSemaphoreTake( xSemaphore, LONG_TIME ) == pdTRUE )\r\n *      {\r\n *          // It is time to execute.\r\n *\r\n *          // ...\r\n *\r\n *          // We have finished our task.  Return to the top of the loop where\r\n *          // we will block on the semaphore until it is time to execute\r\n *          // again.  Note when using the semaphore for synchronisation with an\r\n *          // ISR in this manner there is no need to 'give' the semaphore back.\r\n *      }\r\n *  }\r\n * }\r\n *\r\n * // Timer ISR\r\n * void vTimerISR( void * pvParameters )\r\n * {\r\n * static uint8_t ucLocalTickCount = 0;\r\n * static BaseType_t xHigherPriorityTaskWoken;\r\n *\r\n *  // A timer tick has occurred.\r\n *\r\n *  // ... Do other time functions.\r\n *\r\n *  // Is it time for vATask () to run?\r\n *  xHigherPriorityTaskWoken = pdFALSE;\r\n *  ucLocalTickCount++;\r\n *  if( ucLocalTickCount >= TICKS_TO_WAIT )\r\n *  {\r\n *      // Unblock the task by releasing the semaphore.\r\n *      xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken );\r\n *\r\n *      // Reset the count so we release the semaphore again in 10 ticks time.\r\n *      ucLocalTickCount = 0;\r\n *  }\r\n *\r\n *  if( xHigherPriorityTaskWoken != pdFALSE )\r\n *  {\r\n *      // We can force a context switch here.  Context switching from an\r\n *      // ISR uses port specific syntax.  Check the demo task for your port\r\n *      // to find the syntax required.\r\n *  }\r\n * }\r\n * @endcode\r\n * \\defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR\r\n * \\ingroup Semaphores\r\n */\r\n#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken )    xQueueGiveFromISR( ( QueueHandle_t ) ( xSemaphore ), ( pxHigherPriorityTaskWoken ) )\r\n\r\n/**\r\n * semphr. h\r\n * @code{c}\r\n * xSemaphoreTakeFromISR(\r\n *                        SemaphoreHandle_t xSemaphore,\r\n *                        BaseType_t *pxHigherPriorityTaskWoken\r\n *                    );\r\n * @endcode\r\n *\r\n * <i>Macro</i> to  take a semaphore from an ISR.  The semaphore must have\r\n * previously been created with a call to xSemaphoreCreateBinary() or\r\n * xSemaphoreCreateCounting().\r\n *\r\n * Mutex type semaphores (those created using a call to xSemaphoreCreateMutex())\r\n * must not be used with this macro.\r\n *\r\n * This macro can be used from an ISR, however taking a semaphore from an ISR\r\n * is not a common operation.  It is likely to only be useful when taking a\r\n * counting semaphore when an interrupt is obtaining an object from a resource\r\n * pool (when the semaphore count indicates the number of resources available).\r\n *\r\n * @param xSemaphore A handle to the semaphore being taken.  This is the\r\n * handle returned when the semaphore was created.\r\n *\r\n * @param pxHigherPriorityTaskWoken xSemaphoreTakeFromISR() will set\r\n * *pxHigherPriorityTaskWoken to pdTRUE if taking the semaphore caused a task\r\n * to unblock, and the unblocked task has a priority higher than the currently\r\n * running task.  If xSemaphoreTakeFromISR() sets this value to pdTRUE then\r\n * a context switch should be requested before the interrupt is exited.\r\n *\r\n * @return pdTRUE if the semaphore was successfully taken, otherwise\r\n * pdFALSE\r\n */\r\n#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken )    xQueueReceiveFromISR( ( QueueHandle_t ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) )\r\n\r\n/**\r\n * semphr. h\r\n * @code{c}\r\n * SemaphoreHandle_t xSemaphoreCreateMutex( void );\r\n * @endcode\r\n *\r\n * Creates a new mutex type semaphore instance, and returns a handle by which\r\n * the new mutex can be referenced.\r\n *\r\n * Internally, within the FreeRTOS implementation, mutex semaphores use a block\r\n * of memory, in which the mutex structure is stored.  If a mutex is created\r\n * using xSemaphoreCreateMutex() then the required memory is automatically\r\n * dynamically allocated inside the xSemaphoreCreateMutex() function.  (see\r\n * https://www.FreeRTOS.org/a00111.html).  If a mutex is created using\r\n * xSemaphoreCreateMutexStatic() then the application writer must provided the\r\n * memory.  xSemaphoreCreateMutexStatic() therefore allows a mutex to be created\r\n * without using any dynamic memory allocation.\r\n *\r\n * Mutexes created using this function can be accessed using the xSemaphoreTake()\r\n * and xSemaphoreGive() macros.  The xSemaphoreTakeRecursive() and\r\n * xSemaphoreGiveRecursive() macros must not be used.\r\n *\r\n * This type of semaphore uses a priority inheritance mechanism so a task\r\n * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the\r\n * semaphore it is no longer required.\r\n *\r\n * Mutex type semaphores cannot be used from within interrupt service routines.\r\n *\r\n * See xSemaphoreCreateBinary() for an alternative implementation that can be\r\n * used for pure synchronisation (where one task or interrupt always 'gives' the\r\n * semaphore and another always 'takes' the semaphore) and from within interrupt\r\n * service routines.\r\n *\r\n * @return If the mutex was successfully created then a handle to the created\r\n * semaphore is returned.  If there was not enough heap to allocate the mutex\r\n * data structures then NULL is returned.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * SemaphoreHandle_t xSemaphore;\r\n *\r\n * void vATask( void * pvParameters )\r\n * {\r\n *  // Semaphore cannot be used before a call to xSemaphoreCreateMutex().\r\n *  // This is a macro so pass the variable in directly.\r\n *  xSemaphore = xSemaphoreCreateMutex();\r\n *\r\n *  if( xSemaphore != NULL )\r\n *  {\r\n *      // The semaphore was created successfully.\r\n *      // The semaphore can now be used.\r\n *  }\r\n * }\r\n * @endcode\r\n * \\defgroup xSemaphoreCreateMutex xSemaphoreCreateMutex\r\n * \\ingroup Semaphores\r\n */\r\n#if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_MUTEXES == 1 ) )\r\n    #define xSemaphoreCreateMutex()    xQueueCreateMutex( queueQUEUE_TYPE_MUTEX )\r\n#endif\r\n\r\n/**\r\n * semphr. h\r\n * @code{c}\r\n * SemaphoreHandle_t xSemaphoreCreateMutexStatic( StaticSemaphore_t *pxMutexBuffer );\r\n * @endcode\r\n *\r\n * Creates a new mutex type semaphore instance, and returns a handle by which\r\n * the new mutex can be referenced.\r\n *\r\n * Internally, within the FreeRTOS implementation, mutex semaphores use a block\r\n * of memory, in which the mutex structure is stored.  If a mutex is created\r\n * using xSemaphoreCreateMutex() then the required memory is automatically\r\n * dynamically allocated inside the xSemaphoreCreateMutex() function.  (see\r\n * https://www.FreeRTOS.org/a00111.html).  If a mutex is created using\r\n * xSemaphoreCreateMutexStatic() then the application writer must provided the\r\n * memory.  xSemaphoreCreateMutexStatic() therefore allows a mutex to be created\r\n * without using any dynamic memory allocation.\r\n *\r\n * Mutexes created using this function can be accessed using the xSemaphoreTake()\r\n * and xSemaphoreGive() macros.  The xSemaphoreTakeRecursive() and\r\n * xSemaphoreGiveRecursive() macros must not be used.\r\n *\r\n * This type of semaphore uses a priority inheritance mechanism so a task\r\n * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the\r\n * semaphore it is no longer required.\r\n *\r\n * Mutex type semaphores cannot be used from within interrupt service routines.\r\n *\r\n * See xSemaphoreCreateBinary() for an alternative implementation that can be\r\n * used for pure synchronisation (where one task or interrupt always 'gives' the\r\n * semaphore and another always 'takes' the semaphore) and from within interrupt\r\n * service routines.\r\n *\r\n * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t,\r\n * which will be used to hold the mutex's data structure, removing the need for\r\n * the memory to be allocated dynamically.\r\n *\r\n * @return If the mutex was successfully created then a handle to the created\r\n * mutex is returned.  If pxMutexBuffer was NULL then NULL is returned.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * SemaphoreHandle_t xSemaphore;\r\n * StaticSemaphore_t xMutexBuffer;\r\n *\r\n * void vATask( void * pvParameters )\r\n * {\r\n *  // A mutex cannot be used before it has been created.  xMutexBuffer is\r\n *  // into xSemaphoreCreateMutexStatic() so no dynamic memory allocation is\r\n *  // attempted.\r\n *  xSemaphore = xSemaphoreCreateMutexStatic( &xMutexBuffer );\r\n *\r\n *  // As no dynamic memory allocation was performed, xSemaphore cannot be NULL,\r\n *  // so there is no need to check it.\r\n * }\r\n * @endcode\r\n * \\defgroup xSemaphoreCreateMutexStatic xSemaphoreCreateMutexStatic\r\n * \\ingroup Semaphores\r\n */\r\n#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_MUTEXES == 1 ) )\r\n    #define xSemaphoreCreateMutexStatic( pxMutexBuffer )    xQueueCreateMutexStatic( queueQUEUE_TYPE_MUTEX, ( pxMutexBuffer ) )\r\n#endif\r\n\r\n\r\n/**\r\n * semphr. h\r\n * @code{c}\r\n * SemaphoreHandle_t xSemaphoreCreateRecursiveMutex( void );\r\n * @endcode\r\n *\r\n * Creates a new recursive mutex type semaphore instance, and returns a handle\r\n * by which the new recursive mutex can be referenced.\r\n *\r\n * Internally, within the FreeRTOS implementation, recursive mutexes use a block\r\n * of memory, in which the mutex structure is stored.  If a recursive mutex is\r\n * created using xSemaphoreCreateRecursiveMutex() then the required memory is\r\n * automatically dynamically allocated inside the\r\n * xSemaphoreCreateRecursiveMutex() function.  (see\r\n * https://www.FreeRTOS.org/a00111.html).  If a recursive mutex is created using\r\n * xSemaphoreCreateRecursiveMutexStatic() then the application writer must\r\n * provide the memory that will get used by the mutex.\r\n * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to\r\n * be created without using any dynamic memory allocation.\r\n *\r\n * Mutexes created using this macro can be accessed using the\r\n * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros.  The\r\n * xSemaphoreTake() and xSemaphoreGive() macros must not be used.\r\n *\r\n * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex\r\n * doesn't become available again until the owner has called\r\n * xSemaphoreGiveRecursive() for each successful 'take' request.  For example,\r\n * if a task successfully 'takes' the same mutex 5 times then the mutex will\r\n * not be available to any other task until it has also  'given' the mutex back\r\n * exactly five times.\r\n *\r\n * This type of semaphore uses a priority inheritance mechanism so a task\r\n * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the\r\n * semaphore it is no longer required.\r\n *\r\n * Mutex type semaphores cannot be used from within interrupt service routines.\r\n *\r\n * See xSemaphoreCreateBinary() for an alternative implementation that can be\r\n * used for pure synchronisation (where one task or interrupt always 'gives' the\r\n * semaphore and another always 'takes' the semaphore) and from within interrupt\r\n * service routines.\r\n *\r\n * @return xSemaphore Handle to the created mutex semaphore.  Should be of type\r\n * SemaphoreHandle_t.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * SemaphoreHandle_t xSemaphore;\r\n *\r\n * void vATask( void * pvParameters )\r\n * {\r\n *  // Semaphore cannot be used before a call to xSemaphoreCreateMutex().\r\n *  // This is a macro so pass the variable in directly.\r\n *  xSemaphore = xSemaphoreCreateRecursiveMutex();\r\n *\r\n *  if( xSemaphore != NULL )\r\n *  {\r\n *      // The semaphore was created successfully.\r\n *      // The semaphore can now be used.\r\n *  }\r\n * }\r\n * @endcode\r\n * \\defgroup xSemaphoreCreateRecursiveMutex xSemaphoreCreateRecursiveMutex\r\n * \\ingroup Semaphores\r\n */\r\n#if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) )\r\n    #define xSemaphoreCreateRecursiveMutex()    xQueueCreateMutex( queueQUEUE_TYPE_RECURSIVE_MUTEX )\r\n#endif\r\n\r\n/**\r\n * semphr. h\r\n * @code{c}\r\n * SemaphoreHandle_t xSemaphoreCreateRecursiveMutexStatic( StaticSemaphore_t *pxMutexBuffer );\r\n * @endcode\r\n *\r\n * Creates a new recursive mutex type semaphore instance, and returns a handle\r\n * by which the new recursive mutex can be referenced.\r\n *\r\n * Internally, within the FreeRTOS implementation, recursive mutexes use a block\r\n * of memory, in which the mutex structure is stored.  If a recursive mutex is\r\n * created using xSemaphoreCreateRecursiveMutex() then the required memory is\r\n * automatically dynamically allocated inside the\r\n * xSemaphoreCreateRecursiveMutex() function.  (see\r\n * https://www.FreeRTOS.org/a00111.html).  If a recursive mutex is created using\r\n * xSemaphoreCreateRecursiveMutexStatic() then the application writer must\r\n * provide the memory that will get used by the mutex.\r\n * xSemaphoreCreateRecursiveMutexStatic() therefore allows a recursive mutex to\r\n * be created without using any dynamic memory allocation.\r\n *\r\n * Mutexes created using this macro can be accessed using the\r\n * xSemaphoreTakeRecursive() and xSemaphoreGiveRecursive() macros.  The\r\n * xSemaphoreTake() and xSemaphoreGive() macros must not be used.\r\n *\r\n * A mutex used recursively can be 'taken' repeatedly by the owner. The mutex\r\n * doesn't become available again until the owner has called\r\n * xSemaphoreGiveRecursive() for each successful 'take' request.  For example,\r\n * if a task successfully 'takes' the same mutex 5 times then the mutex will\r\n * not be available to any other task until it has also  'given' the mutex back\r\n * exactly five times.\r\n *\r\n * This type of semaphore uses a priority inheritance mechanism so a task\r\n * 'taking' a semaphore MUST ALWAYS 'give' the semaphore back once the\r\n * semaphore it is no longer required.\r\n *\r\n * Mutex type semaphores cannot be used from within interrupt service routines.\r\n *\r\n * See xSemaphoreCreateBinary() for an alternative implementation that can be\r\n * used for pure synchronisation (where one task or interrupt always 'gives' the\r\n * semaphore and another always 'takes' the semaphore) and from within interrupt\r\n * service routines.\r\n *\r\n * @param pxMutexBuffer Must point to a variable of type StaticSemaphore_t,\r\n * which will then be used to hold the recursive mutex's data structure,\r\n * removing the need for the memory to be allocated dynamically.\r\n *\r\n * @return If the recursive mutex was successfully created then a handle to the\r\n * created recursive mutex is returned.  If pxMutexBuffer was NULL then NULL is\r\n * returned.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * SemaphoreHandle_t xSemaphore;\r\n * StaticSemaphore_t xMutexBuffer;\r\n *\r\n * void vATask( void * pvParameters )\r\n * {\r\n *  // A recursive semaphore cannot be used before it is created.  Here a\r\n *  // recursive mutex is created using xSemaphoreCreateRecursiveMutexStatic().\r\n *  // The address of xMutexBuffer is passed into the function, and will hold\r\n *  // the mutexes data structures - so no dynamic memory allocation will be\r\n *  // attempted.\r\n *  xSemaphore = xSemaphoreCreateRecursiveMutexStatic( &xMutexBuffer );\r\n *\r\n *  // As no dynamic memory allocation was performed, xSemaphore cannot be NULL,\r\n *  // so there is no need to check it.\r\n * }\r\n * @endcode\r\n * \\defgroup xSemaphoreCreateRecursiveMutexStatic xSemaphoreCreateRecursiveMutexStatic\r\n * \\ingroup Semaphores\r\n */\r\n#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configUSE_RECURSIVE_MUTEXES == 1 ) )\r\n    #define xSemaphoreCreateRecursiveMutexStatic( pxStaticSemaphore )    xQueueCreateMutexStatic( queueQUEUE_TYPE_RECURSIVE_MUTEX, ( pxStaticSemaphore ) )\r\n#endif /* configSUPPORT_STATIC_ALLOCATION */\r\n\r\n/**\r\n * semphr. h\r\n * @code{c}\r\n * SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount );\r\n * @endcode\r\n *\r\n * Creates a new counting semaphore instance, and returns a handle by which the\r\n * new counting semaphore can be referenced.\r\n *\r\n * In many usage scenarios it is faster and more memory efficient to use a\r\n * direct to task notification in place of a counting semaphore!\r\n * https://www.FreeRTOS.org/RTOS-task-notifications.html\r\n *\r\n * Internally, within the FreeRTOS implementation, counting semaphores use a\r\n * block of memory, in which the counting semaphore structure is stored.  If a\r\n * counting semaphore is created using xSemaphoreCreateCounting() then the\r\n * required memory is automatically dynamically allocated inside the\r\n * xSemaphoreCreateCounting() function.  (see\r\n * https://www.FreeRTOS.org/a00111.html).  If a counting semaphore is created\r\n * using xSemaphoreCreateCountingStatic() then the application writer can\r\n * instead optionally provide the memory that will get used by the counting\r\n * semaphore.  xSemaphoreCreateCountingStatic() therefore allows a counting\r\n * semaphore to be created without using any dynamic memory allocation.\r\n *\r\n * Counting semaphores are typically used for two things:\r\n *\r\n * 1) Counting events.\r\n *\r\n *    In this usage scenario an event handler will 'give' a semaphore each time\r\n *    an event occurs (incrementing the semaphore count value), and a handler\r\n *    task will 'take' a semaphore each time it processes an event\r\n *    (decrementing the semaphore count value).  The count value is therefore\r\n *    the difference between the number of events that have occurred and the\r\n *    number that have been processed.  In this case it is desirable for the\r\n *    initial count value to be zero.\r\n *\r\n * 2) Resource management.\r\n *\r\n *    In this usage scenario the count value indicates the number of resources\r\n *    available.  To obtain control of a resource a task must first obtain a\r\n *    semaphore - decrementing the semaphore count value.  When the count value\r\n *    reaches zero there are no free resources.  When a task finishes with the\r\n *    resource it 'gives' the semaphore back - incrementing the semaphore count\r\n *    value.  In this case it is desirable for the initial count value to be\r\n *    equal to the maximum count value, indicating that all resources are free.\r\n *\r\n * @param uxMaxCount The maximum count value that can be reached.  When the\r\n *        semaphore reaches this value it can no longer be 'given'.\r\n *\r\n * @param uxInitialCount The count value assigned to the semaphore when it is\r\n *        created.\r\n *\r\n * @return Handle to the created semaphore.  Null if the semaphore could not be\r\n *         created.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * SemaphoreHandle_t xSemaphore;\r\n *\r\n * void vATask( void * pvParameters )\r\n * {\r\n * SemaphoreHandle_t xSemaphore = NULL;\r\n *\r\n *  // Semaphore cannot be used before a call to xSemaphoreCreateCounting().\r\n *  // The max value to which the semaphore can count should be 10, and the\r\n *  // initial value assigned to the count should be 0.\r\n *  xSemaphore = xSemaphoreCreateCounting( 10, 0 );\r\n *\r\n *  if( xSemaphore != NULL )\r\n *  {\r\n *      // The semaphore was created successfully.\r\n *      // The semaphore can now be used.\r\n *  }\r\n * }\r\n * @endcode\r\n * \\defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting\r\n * \\ingroup Semaphores\r\n */\r\n#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r\n    #define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount )    xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) )\r\n#endif\r\n\r\n/**\r\n * semphr. h\r\n * @code{c}\r\n * SemaphoreHandle_t xSemaphoreCreateCountingStatic( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount, StaticSemaphore_t *pxSemaphoreBuffer );\r\n * @endcode\r\n *\r\n * Creates a new counting semaphore instance, and returns a handle by which the\r\n * new counting semaphore can be referenced.\r\n *\r\n * In many usage scenarios it is faster and more memory efficient to use a\r\n * direct to task notification in place of a counting semaphore!\r\n * https://www.FreeRTOS.org/RTOS-task-notifications.html\r\n *\r\n * Internally, within the FreeRTOS implementation, counting semaphores use a\r\n * block of memory, in which the counting semaphore structure is stored.  If a\r\n * counting semaphore is created using xSemaphoreCreateCounting() then the\r\n * required memory is automatically dynamically allocated inside the\r\n * xSemaphoreCreateCounting() function.  (see\r\n * https://www.FreeRTOS.org/a00111.html).  If a counting semaphore is created\r\n * using xSemaphoreCreateCountingStatic() then the application writer must\r\n * provide the memory.  xSemaphoreCreateCountingStatic() therefore allows a\r\n * counting semaphore to be created without using any dynamic memory allocation.\r\n *\r\n * Counting semaphores are typically used for two things:\r\n *\r\n * 1) Counting events.\r\n *\r\n *    In this usage scenario an event handler will 'give' a semaphore each time\r\n *    an event occurs (incrementing the semaphore count value), and a handler\r\n *    task will 'take' a semaphore each time it processes an event\r\n *    (decrementing the semaphore count value).  The count value is therefore\r\n *    the difference between the number of events that have occurred and the\r\n *    number that have been processed.  In this case it is desirable for the\r\n *    initial count value to be zero.\r\n *\r\n * 2) Resource management.\r\n *\r\n *    In this usage scenario the count value indicates the number of resources\r\n *    available.  To obtain control of a resource a task must first obtain a\r\n *    semaphore - decrementing the semaphore count value.  When the count value\r\n *    reaches zero there are no free resources.  When a task finishes with the\r\n *    resource it 'gives' the semaphore back - incrementing the semaphore count\r\n *    value.  In this case it is desirable for the initial count value to be\r\n *    equal to the maximum count value, indicating that all resources are free.\r\n *\r\n * @param uxMaxCount The maximum count value that can be reached.  When the\r\n *        semaphore reaches this value it can no longer be 'given'.\r\n *\r\n * @param uxInitialCount The count value assigned to the semaphore when it is\r\n *        created.\r\n *\r\n * @param pxSemaphoreBuffer Must point to a variable of type StaticSemaphore_t,\r\n * which will then be used to hold the semaphore's data structure, removing the\r\n * need for the memory to be allocated dynamically.\r\n *\r\n * @return If the counting semaphore was successfully created then a handle to\r\n * the created counting semaphore is returned.  If pxSemaphoreBuffer was NULL\r\n * then NULL is returned.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * SemaphoreHandle_t xSemaphore;\r\n * StaticSemaphore_t xSemaphoreBuffer;\r\n *\r\n * void vATask( void * pvParameters )\r\n * {\r\n * SemaphoreHandle_t xSemaphore = NULL;\r\n *\r\n *  // Counting semaphore cannot be used before they have been created.  Create\r\n *  // a counting semaphore using xSemaphoreCreateCountingStatic().  The max\r\n *  // value to which the semaphore can count is 10, and the initial value\r\n *  // assigned to the count will be 0.  The address of xSemaphoreBuffer is\r\n *  // passed in and will be used to hold the semaphore structure, so no dynamic\r\n *  // memory allocation will be used.\r\n *  xSemaphore = xSemaphoreCreateCounting( 10, 0, &xSemaphoreBuffer );\r\n *\r\n *  // No memory allocation was attempted so xSemaphore cannot be NULL, so there\r\n *  // is no need to check its value.\r\n * }\r\n * @endcode\r\n * \\defgroup xSemaphoreCreateCountingStatic xSemaphoreCreateCountingStatic\r\n * \\ingroup Semaphores\r\n */\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n    #define xSemaphoreCreateCountingStatic( uxMaxCount, uxInitialCount, pxSemaphoreBuffer )    xQueueCreateCountingSemaphoreStatic( ( uxMaxCount ), ( uxInitialCount ), ( pxSemaphoreBuffer ) )\r\n#endif /* configSUPPORT_STATIC_ALLOCATION */\r\n\r\n/**\r\n * semphr. h\r\n * @code{c}\r\n * void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );\r\n * @endcode\r\n *\r\n * Delete a semaphore.  This function must be used with care.  For example,\r\n * do not delete a mutex type semaphore if the mutex is held by a task.\r\n *\r\n * @param xSemaphore A handle to the semaphore to be deleted.\r\n *\r\n * \\defgroup vSemaphoreDelete vSemaphoreDelete\r\n * \\ingroup Semaphores\r\n */\r\n#define vSemaphoreDelete( xSemaphore )    vQueueDelete( ( QueueHandle_t ) ( xSemaphore ) )\r\n\r\n/**\r\n * semphr.h\r\n * @code{c}\r\n * TaskHandle_t xSemaphoreGetMutexHolder( SemaphoreHandle_t xMutex );\r\n * @endcode\r\n *\r\n * If xMutex is indeed a mutex type semaphore, return the current mutex holder.\r\n * If xMutex is not a mutex type semaphore, or the mutex is available (not held\r\n * by a task), return NULL.\r\n *\r\n * Note: This is a good way of determining if the calling task is the mutex\r\n * holder, but not a good way of determining the identity of the mutex holder as\r\n * the holder may change between the function exiting and the returned value\r\n * being tested.\r\n */\r\n#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) )\r\n    #define xSemaphoreGetMutexHolder( xSemaphore )    xQueueGetMutexHolder( ( xSemaphore ) )\r\n#endif\r\n\r\n/**\r\n * semphr.h\r\n * @code{c}\r\n * TaskHandle_t xSemaphoreGetMutexHolderFromISR( SemaphoreHandle_t xMutex );\r\n * @endcode\r\n *\r\n * If xMutex is indeed a mutex type semaphore, return the current mutex holder.\r\n * If xMutex is not a mutex type semaphore, or the mutex is available (not held\r\n * by a task), return NULL.\r\n *\r\n */\r\n#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) )\r\n    #define xSemaphoreGetMutexHolderFromISR( xSemaphore )    xQueueGetMutexHolderFromISR( ( xSemaphore ) )\r\n#endif\r\n\r\n/**\r\n * semphr.h\r\n * @code{c}\r\n * UBaseType_t uxSemaphoreGetCount( SemaphoreHandle_t xSemaphore );\r\n * @endcode\r\n *\r\n * If the semaphore is a counting semaphore then uxSemaphoreGetCount() returns\r\n * its current count value.  If the semaphore is a binary semaphore then\r\n * uxSemaphoreGetCount() returns 1 if the semaphore is available, and 0 if the\r\n * semaphore is not available.\r\n *\r\n */\r\n#define uxSemaphoreGetCount( xSemaphore )           uxQueueMessagesWaiting( ( QueueHandle_t ) ( xSemaphore ) )\r\n\r\n/**\r\n * semphr.h\r\n * @code{c}\r\n * UBaseType_t uxSemaphoreGetCountFromISR( SemaphoreHandle_t xSemaphore );\r\n * @endcode\r\n *\r\n * If the semaphore is a counting semaphore then uxSemaphoreGetCountFromISR() returns\r\n * its current count value.  If the semaphore is a binary semaphore then\r\n * uxSemaphoreGetCountFromISR() returns 1 if the semaphore is available, and 0 if the\r\n * semaphore is not available.\r\n *\r\n */\r\n#define uxSemaphoreGetCountFromISR( xSemaphore )    uxQueueMessagesWaitingFromISR( ( QueueHandle_t ) ( xSemaphore ) )\r\n\r\n/**\r\n * semphr.h\r\n * @code{c}\r\n * BaseType_t xSemaphoreGetStaticBuffer( SemaphoreHandle_t xSemaphore,\r\n *                                       StaticSemaphore_t ** ppxSemaphoreBuffer );\r\n * @endcode\r\n *\r\n * Retrieve pointer to a statically created binary semaphore, counting semaphore,\r\n * or mutex semaphore's data structure buffer. This is the same buffer that is\r\n * supplied at the time of creation.\r\n *\r\n * @param xSemaphore The semaphore for which to retrieve the buffer.\r\n *\r\n * @param ppxSemaphoreBuffer Used to return a pointer to the semaphore's\r\n * data structure buffer.\r\n *\r\n * @return pdTRUE if buffer was retrieved, pdFALSE otherwise.\r\n */\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n    #define xSemaphoreGetStaticBuffer( xSemaphore, ppxSemaphoreBuffer )    xQueueGenericGetStaticBuffers( ( QueueHandle_t ) ( xSemaphore ), NULL, ( ppxSemaphoreBuffer ) )\r\n#endif /* configSUPPORT_STATIC_ALLOCATION */\r\n\r\n#endif /* SEMAPHORE_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/stack_macros.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n#ifndef STACK_MACROS_H\r\n#define STACK_MACROS_H\r\n\r\n/*\r\n * Call the stack overflow hook function if the stack of the task being swapped\r\n * out is currently overflowed, or looks like it might have overflowed in the\r\n * past.\r\n *\r\n * Setting configCHECK_FOR_STACK_OVERFLOW to 1 will cause the macro to check\r\n * the current stack state only - comparing the current top of stack value to\r\n * the stack limit.  Setting configCHECK_FOR_STACK_OVERFLOW to greater than 1\r\n * will also cause the last few stack bytes to be checked to ensure the value\r\n * to which the bytes were set when the task was created have not been\r\n * overwritten.  Note this second test does not guarantee that an overflowed\r\n * stack will always be recognised.\r\n */\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n/*\r\n * portSTACK_LIMIT_PADDING is a number of extra words to consider to be in\r\n * use on the stack.\r\n */\r\n#ifndef portSTACK_LIMIT_PADDING\r\n    #define portSTACK_LIMIT_PADDING    0\r\n#endif\r\n\r\n#if ( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH < 0 ) )\r\n\r\n/* Only the current stack state is to be checked. */\r\n    #define taskCHECK_FOR_STACK_OVERFLOW()                                                      \\\r\n    do {                                                                                        \\\r\n        /* Is the currently saved stack pointer within the stack limit? */                      \\\r\n        if( pxCurrentTCB->pxTopOfStack <= pxCurrentTCB->pxStack + portSTACK_LIMIT_PADDING )     \\\r\n        {                                                                                       \\\r\n            char * pcOverflowTaskName = pxCurrentTCB->pcTaskName;                               \\\r\n            vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pcOverflowTaskName ); \\\r\n        }                                                                                       \\\r\n    } while( 0 )\r\n\r\n#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configCHECK_FOR_STACK_OVERFLOW == 1 ) && ( portSTACK_GROWTH > 0 ) )\r\n\r\n/* Only the current stack state is to be checked. */\r\n    #define taskCHECK_FOR_STACK_OVERFLOW()                                                       \\\r\n    do {                                                                                         \\\r\n                                                                                                 \\\r\n        /* Is the currently saved stack pointer within the stack limit? */                       \\\r\n        if( pxCurrentTCB->pxTopOfStack >= pxCurrentTCB->pxEndOfStack - portSTACK_LIMIT_PADDING ) \\\r\n        {                                                                                        \\\r\n            char * pcOverflowTaskName = pxCurrentTCB->pcTaskName;                                \\\r\n            vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pcOverflowTaskName );  \\\r\n        }                                                                                        \\\r\n    } while( 0 )\r\n\r\n#endif /* configCHECK_FOR_STACK_OVERFLOW == 1 */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH < 0 ) )\r\n\r\n    #define taskCHECK_FOR_STACK_OVERFLOW()                                                      \\\r\n    do {                                                                                        \\\r\n        const uint32_t * const pulStack = ( uint32_t * ) pxCurrentTCB->pxStack;                 \\\r\n        const uint32_t ulCheckValue = ( uint32_t ) 0xa5a5a5a5U;                                 \\\r\n                                                                                                \\\r\n        if( ( pulStack[ 0 ] != ulCheckValue ) ||                                                \\\r\n            ( pulStack[ 1 ] != ulCheckValue ) ||                                                \\\r\n            ( pulStack[ 2 ] != ulCheckValue ) ||                                                \\\r\n            ( pulStack[ 3 ] != ulCheckValue ) )                                                 \\\r\n        {                                                                                       \\\r\n            char * pcOverflowTaskName = pxCurrentTCB->pcTaskName;                               \\\r\n            vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pcOverflowTaskName ); \\\r\n        }                                                                                       \\\r\n    } while( 0 )\r\n\r\n#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) && ( portSTACK_GROWTH > 0 ) )\r\n\r\n    #define taskCHECK_FOR_STACK_OVERFLOW()                                                                                                \\\r\n    do {                                                                                                                                  \\\r\n        int8_t * pcEndOfStack = ( int8_t * ) pxCurrentTCB->pxEndOfStack;                                                                  \\\r\n        static const uint8_t ucExpectedStackBytes[] = { tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE,   \\\r\n                                                        tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE,   \\\r\n                                                        tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE,   \\\r\n                                                        tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE,   \\\r\n                                                        tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE, tskSTACK_FILL_BYTE }; \\\r\n                                                                                                                                          \\\r\n                                                                                                                                          \\\r\n        pcEndOfStack -= sizeof( ucExpectedStackBytes );                                                                                   \\\r\n                                                                                                                                          \\\r\n        /* Has the extremity of the task stack ever been written over? */                                                                 \\\r\n        if( memcmp( ( void * ) pcEndOfStack, ( void * ) ucExpectedStackBytes, sizeof( ucExpectedStackBytes ) ) != 0 )                     \\\r\n        {                                                                                                                                 \\\r\n            char * pcOverflowTaskName = pxCurrentTCB->pcTaskName;                                                                         \\\r\n            vApplicationStackOverflowHook( ( TaskHandle_t ) pxCurrentTCB, pcOverflowTaskName );                                           \\\r\n        }                                                                                                                                 \\\r\n    } while( 0 )\r\n\r\n#endif /* #if( configCHECK_FOR_STACK_OVERFLOW > 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n/* Remove stack overflow macro if not being used. */\r\n#ifndef taskCHECK_FOR_STACK_OVERFLOW\r\n    #define taskCHECK_FOR_STACK_OVERFLOW()\r\n#endif\r\n\r\n\r\n\r\n#endif /* STACK_MACROS_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/stdint.readme",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n#ifndef FREERTOS_STDINT\r\n#define FREERTOS_STDINT\r\n\r\n/*******************************************************************************\r\n * THIS IS NOT A FULL stdint.h IMPLEMENTATION - It only contains the definitions\r\n * necessary to build the FreeRTOS code.  It is provided to allow FreeRTOS to be\r\n * built using compilers that do not provide their own stdint.h definition.\r\n *\r\n * To use this file:\r\n *\r\n *    1) Copy this file into the directory that contains your FreeRTOSConfig.h\r\n *       header file, as that directory will already be in the compiler's include\r\n *       path.\r\n *\r\n *    2) Rename the copied file stdint.h.\r\n *\r\n */\r\n\r\ntypedef signed char int8_t;\r\ntypedef unsigned char uint8_t;\r\ntypedef short int16_t;\r\ntypedef unsigned short uint16_t;\r\ntypedef long int32_t;\r\ntypedef unsigned long uint32_t;\r\n\r\n#ifndef SIZE_MAX\r\n    #define SIZE_MAX    ( ( size_t ) -1 )\r\n#endif\r\n\r\n#endif /* FREERTOS_STDINT */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/stream_buffer.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n/*\r\n * Stream buffers are used to send a continuous stream of data from one task or\r\n * interrupt to another.  Their implementation is light weight, making them\r\n * particularly suited for interrupt to task and core to core communication\r\n * scenarios.\r\n *\r\n * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer\r\n * implementation (so also the message buffer implementation, as message buffers\r\n * are built on top of stream buffers) assumes there is only one task or\r\n * interrupt that will write to the buffer (the writer), and only one task or\r\n * interrupt that will read from the buffer (the reader).  It is safe for the\r\n * writer and reader to be different tasks or interrupts, but, unlike other\r\n * FreeRTOS objects, it is not safe to have multiple different writers or\r\n * multiple different readers.  If there are to be multiple different writers\r\n * then the application writer must place each call to a writing API function\r\n * (such as xStreamBufferSend()) inside a critical section and set the send\r\n * block time to 0.  Likewise, if there are to be multiple different readers\r\n * then the application writer must place each call to a reading API function\r\n * (such as xStreamBufferReceive()) inside a critical section section and set the\r\n * receive block time to 0.\r\n *\r\n */\r\n\r\n#ifndef STREAM_BUFFER_H\r\n#define STREAM_BUFFER_H\r\n\r\n#ifndef INC_FREERTOS_H\r\n    #error \"include FreeRTOS.h must appear in source files before include stream_buffer.h\"\r\n#endif\r\n\r\n/* *INDENT-OFF* */\r\n#if defined( __cplusplus )\r\n    extern \"C\" {\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n/**\r\n * Type by which stream buffers are referenced.  For example, a call to\r\n * xStreamBufferCreate() returns an StreamBufferHandle_t variable that can\r\n * then be used as a parameter to xStreamBufferSend(), xStreamBufferReceive(),\r\n * etc.\r\n */\r\nstruct StreamBufferDef_t;\r\ntypedef struct StreamBufferDef_t * StreamBufferHandle_t;\r\n\r\n/**\r\n *  Type used as a stream buffer's optional callback.\r\n */\r\ntypedef void (* StreamBufferCallbackFunction_t)( StreamBufferHandle_t xStreamBuffer,\r\n                                                 BaseType_t xIsInsideISR,\r\n                                                 BaseType_t * const pxHigherPriorityTaskWoken );\r\n\r\n/**\r\n * stream_buffer.h\r\n *\r\n * @code{c}\r\n * StreamBufferHandle_t xStreamBufferCreate( size_t xBufferSizeBytes, size_t xTriggerLevelBytes );\r\n * @endcode\r\n *\r\n * Creates a new stream buffer using dynamically allocated memory.  See\r\n * xStreamBufferCreateStatic() for a version that uses statically allocated\r\n * memory (memory that is allocated at compile time).\r\n *\r\n * configSUPPORT_DYNAMIC_ALLOCATION must be set to 1 or left undefined in\r\n * FreeRTOSConfig.h for xStreamBufferCreate() to be available.\r\n *\r\n * @param xBufferSizeBytes The total number of bytes the stream buffer will be\r\n * able to hold at any one time.\r\n *\r\n * @param xTriggerLevelBytes The number of bytes that must be in the stream\r\n * buffer before a task that is blocked on the stream buffer to wait for data is\r\n * moved out of the blocked state.  For example, if a task is blocked on a read\r\n * of an empty stream buffer that has a trigger level of 1 then the task will be\r\n * unblocked when a single byte is written to the buffer or the task's block\r\n * time expires.  As another example, if a task is blocked on a read of an empty\r\n * stream buffer that has a trigger level of 10 then the task will not be\r\n * unblocked until the stream buffer contains at least 10 bytes or the task's\r\n * block time expires.  If a reading task's block time expires before the\r\n * trigger level is reached then the task will still receive however many bytes\r\n * are actually available.  Setting a trigger level of 0 will result in a\r\n * trigger level of 1 being used.  It is not valid to specify a trigger level\r\n * that is greater than the buffer size.\r\n *\r\n * @param pxSendCompletedCallback Callback invoked when number of bytes at least equal to\r\n * trigger level is sent to the stream buffer. If the parameter is NULL, it will use the default\r\n * implementation provided by sbSEND_COMPLETED macro. To enable the callback,\r\n * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.\r\n *\r\n * @param pxReceiveCompletedCallback Callback invoked when more than zero bytes are read from a\r\n * stream buffer. If the parameter is NULL, it will use the default\r\n * implementation provided by sbRECEIVE_COMPLETED macro. To enable the callback,\r\n * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.\r\n *\r\n * @return If NULL is returned, then the stream buffer cannot be created\r\n * because there is insufficient heap memory available for FreeRTOS to allocate\r\n * the stream buffer data structures and storage area.  A non-NULL value being\r\n * returned indicates that the stream buffer has been created successfully -\r\n * the returned value should be stored as the handle to the created stream\r\n * buffer.\r\n *\r\n * Example use:\r\n * @code{c}\r\n *\r\n * void vAFunction( void )\r\n * {\r\n * StreamBufferHandle_t xStreamBuffer;\r\n * const size_t xStreamBufferSizeBytes = 100, xTriggerLevel = 10;\r\n *\r\n *  // Create a stream buffer that can hold 100 bytes.  The memory used to hold\r\n *  // both the stream buffer structure and the data in the stream buffer is\r\n *  // allocated dynamically.\r\n *  xStreamBuffer = xStreamBufferCreate( xStreamBufferSizeBytes, xTriggerLevel );\r\n *\r\n *  if( xStreamBuffer == NULL )\r\n *  {\r\n *      // There was not enough heap memory space available to create the\r\n *      // stream buffer.\r\n *  }\r\n *  else\r\n *  {\r\n *      // The stream buffer was created successfully and can now be used.\r\n *  }\r\n * }\r\n * @endcode\r\n * \\defgroup xStreamBufferCreate xStreamBufferCreate\r\n * \\ingroup StreamBufferManagement\r\n */\r\n\r\n#define xStreamBufferCreate( xBufferSizeBytes, xTriggerLevelBytes ) \\\r\n    xStreamBufferGenericCreate( ( xBufferSizeBytes ), ( xTriggerLevelBytes ), pdFALSE, NULL, NULL )\r\n\r\n#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )\r\n    #define xStreamBufferCreateWithCallback( xBufferSizeBytes, xTriggerLevelBytes, pxSendCompletedCallback, pxReceiveCompletedCallback ) \\\r\n    xStreamBufferGenericCreate( ( xBufferSizeBytes ), ( xTriggerLevelBytes ), pdFALSE, ( pxSendCompletedCallback ), ( pxReceiveCompletedCallback ) )\r\n#endif\r\n\r\n/**\r\n * stream_buffer.h\r\n *\r\n * @code{c}\r\n * StreamBufferHandle_t xStreamBufferCreateStatic( size_t xBufferSizeBytes,\r\n *                                              size_t xTriggerLevelBytes,\r\n *                                              uint8_t *pucStreamBufferStorageArea,\r\n *                                              StaticStreamBuffer_t *pxStaticStreamBuffer );\r\n * @endcode\r\n * Creates a new stream buffer using statically allocated memory.  See\r\n * xStreamBufferCreate() for a version that uses dynamically allocated memory.\r\n *\r\n * configSUPPORT_STATIC_ALLOCATION must be set to 1 in FreeRTOSConfig.h for\r\n * xStreamBufferCreateStatic() to be available.\r\n *\r\n * @param xBufferSizeBytes The size, in bytes, of the buffer pointed to by the\r\n * pucStreamBufferStorageArea parameter.\r\n *\r\n * @param xTriggerLevelBytes The number of bytes that must be in the stream\r\n * buffer before a task that is blocked on the stream buffer to wait for data is\r\n * moved out of the blocked state.  For example, if a task is blocked on a read\r\n * of an empty stream buffer that has a trigger level of 1 then the task will be\r\n * unblocked when a single byte is written to the buffer or the task's block\r\n * time expires.  As another example, if a task is blocked on a read of an empty\r\n * stream buffer that has a trigger level of 10 then the task will not be\r\n * unblocked until the stream buffer contains at least 10 bytes or the task's\r\n * block time expires.  If a reading task's block time expires before the\r\n * trigger level is reached then the task will still receive however many bytes\r\n * are actually available.  Setting a trigger level of 0 will result in a\r\n * trigger level of 1 being used.  It is not valid to specify a trigger level\r\n * that is greater than the buffer size.\r\n *\r\n * @param pucStreamBufferStorageArea Must point to a uint8_t array that is at\r\n * least xBufferSizeBytes big.  This is the array to which streams are\r\n * copied when they are written to the stream buffer.\r\n *\r\n * @param pxStaticStreamBuffer Must point to a variable of type\r\n * StaticStreamBuffer_t, which will be used to hold the stream buffer's data\r\n * structure.\r\n *\r\n * @param pxSendCompletedCallback Callback invoked when number of bytes at least equal to\r\n * trigger level is sent to the stream buffer. If the parameter is NULL, it will use the default\r\n * implementation provided by sbSEND_COMPLETED macro. To enable the callback,\r\n * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.\r\n *\r\n * @param pxReceiveCompletedCallback Callback invoked when more than zero bytes are read from a\r\n * stream buffer. If the parameter is NULL, it will use the default\r\n * implementation provided by sbRECEIVE_COMPLETED macro. To enable the callback,\r\n * configUSE_SB_COMPLETED_CALLBACK must be set to 1 in FreeRTOSConfig.h.\r\n *\r\n * @return If the stream buffer is created successfully then a handle to the\r\n * created stream buffer is returned. If either pucStreamBufferStorageArea or\r\n * pxStaticstreamBuffer are NULL then NULL is returned.\r\n *\r\n * Example use:\r\n * @code{c}\r\n *\r\n * // Used to dimension the array used to hold the streams.  The available space\r\n * // will actually be one less than this, so 999.\r\n #define STORAGE_SIZE_BYTES 1000\r\n *\r\n * // Defines the memory that will actually hold the streams within the stream\r\n * // buffer.\r\n * static uint8_t ucStorageBuffer[ STORAGE_SIZE_BYTES ];\r\n *\r\n * // The variable used to hold the stream buffer structure.\r\n * StaticStreamBuffer_t xStreamBufferStruct;\r\n *\r\n * void MyFunction( void )\r\n * {\r\n * StreamBufferHandle_t xStreamBuffer;\r\n * const size_t xTriggerLevel = 1;\r\n *\r\n *  xStreamBuffer = xStreamBufferCreateStatic( sizeof( ucStorageBuffer ),\r\n *                                             xTriggerLevel,\r\n *                                             ucStorageBuffer,\r\n *                                             &xStreamBufferStruct );\r\n *\r\n *  // As neither the pucStreamBufferStorageArea or pxStaticStreamBuffer\r\n *  // parameters were NULL, xStreamBuffer will not be NULL, and can be used to\r\n *  // reference the created stream buffer in other stream buffer API calls.\r\n *\r\n *  // Other code that uses the stream buffer can go here.\r\n * }\r\n *\r\n * @endcode\r\n * \\defgroup xStreamBufferCreateStatic xStreamBufferCreateStatic\r\n * \\ingroup StreamBufferManagement\r\n */\r\n\r\n#define xStreamBufferCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pucStreamBufferStorageArea, pxStaticStreamBuffer ) \\\r\n    xStreamBufferGenericCreateStatic( ( xBufferSizeBytes ), ( xTriggerLevelBytes ), pdFALSE, ( pucStreamBufferStorageArea ), ( pxStaticStreamBuffer ), NULL, NULL )\r\n\r\n#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )\r\n    #define xStreamBufferCreateStaticWithCallback( xBufferSizeBytes, xTriggerLevelBytes, pucStreamBufferStorageArea, pxStaticStreamBuffer, pxSendCompletedCallback, pxReceiveCompletedCallback ) \\\r\n    xStreamBufferGenericCreateStatic( ( xBufferSizeBytes ), ( xTriggerLevelBytes ), pdFALSE, ( pucStreamBufferStorageArea ), ( pxStaticStreamBuffer ), ( pxSendCompletedCallback ), ( pxReceiveCompletedCallback ) )\r\n#endif\r\n\r\n/**\r\n * stream_buffer.h\r\n *\r\n * @code{c}\r\n * BaseType_t xStreamBufferGetStaticBuffers( StreamBufferHandle_t xStreamBuffer,\r\n *                                           uint8_t ** ppucStreamBufferStorageArea,\r\n *                                           StaticStreamBuffer_t ** ppxStaticStreamBuffer );\r\n * @endcode\r\n *\r\n * Retrieve pointers to a statically created stream buffer's data structure\r\n * buffer and storage area buffer. These are the same buffers that are supplied\r\n * at the time of creation.\r\n *\r\n * @param xStreamBuffer The stream buffer for which to retrieve the buffers.\r\n *\r\n * @param ppucStreamBufferStorageArea Used to return a pointer to the stream\r\n * buffer's storage area buffer.\r\n *\r\n * @param ppxStaticStreamBuffer Used to return a pointer to the stream\r\n * buffer's data structure buffer.\r\n *\r\n * @return pdTRUE if buffers were retrieved, pdFALSE otherwise.\r\n *\r\n * \\defgroup xStreamBufferGetStaticBuffers xStreamBufferGetStaticBuffers\r\n * \\ingroup StreamBufferManagement\r\n */\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n    BaseType_t xStreamBufferGetStaticBuffers( StreamBufferHandle_t xStreamBuffer,\r\n                                              uint8_t ** ppucStreamBufferStorageArea,\r\n                                              StaticStreamBuffer_t ** ppxStaticStreamBuffer ) PRIVILEGED_FUNCTION;\r\n#endif /* configSUPPORT_STATIC_ALLOCATION */\r\n\r\n/**\r\n * stream_buffer.h\r\n *\r\n * @code{c}\r\n * size_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,\r\n *                        const void *pvTxData,\r\n *                        size_t xDataLengthBytes,\r\n *                        TickType_t xTicksToWait );\r\n * @endcode\r\n *\r\n * Sends bytes to a stream buffer.  The bytes are copied into the stream buffer.\r\n *\r\n * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer\r\n * implementation (so also the message buffer implementation, as message buffers\r\n * are built on top of stream buffers) assumes there is only one task or\r\n * interrupt that will write to the buffer (the writer), and only one task or\r\n * interrupt that will read from the buffer (the reader).  It is safe for the\r\n * writer and reader to be different tasks or interrupts, but, unlike other\r\n * FreeRTOS objects, it is not safe to have multiple different writers or\r\n * multiple different readers.  If there are to be multiple different writers\r\n * then the application writer must place each call to a writing API function\r\n * (such as xStreamBufferSend()) inside a critical section and set the send\r\n * block time to 0.  Likewise, if there are to be multiple different readers\r\n * then the application writer must place each call to a reading API function\r\n * (such as xStreamBufferReceive()) inside a critical section and set the receive\r\n * block time to 0.\r\n *\r\n * Use xStreamBufferSend() to write to a stream buffer from a task.  Use\r\n * xStreamBufferSendFromISR() to write to a stream buffer from an interrupt\r\n * service routine (ISR).\r\n *\r\n * @param xStreamBuffer The handle of the stream buffer to which a stream is\r\n * being sent.\r\n *\r\n * @param pvTxData A pointer to the buffer that holds the bytes to be copied\r\n * into the stream buffer.\r\n *\r\n * @param xDataLengthBytes   The maximum number of bytes to copy from pvTxData\r\n * into the stream buffer.\r\n *\r\n * @param xTicksToWait The maximum amount of time the task should remain in the\r\n * Blocked state to wait for enough space to become available in the stream\r\n * buffer, should the stream buffer contain too little space to hold the\r\n * another xDataLengthBytes bytes.  The block time is specified in tick periods,\r\n * so the absolute time it represents is dependent on the tick frequency.  The\r\n * macro pdMS_TO_TICKS() can be used to convert a time specified in milliseconds\r\n * into a time specified in ticks.  Setting xTicksToWait to portMAX_DELAY will\r\n * cause the task to wait indefinitely (without timing out), provided\r\n * INCLUDE_vTaskSuspend is set to 1 in FreeRTOSConfig.h.  If a task times out\r\n * before it can write all xDataLengthBytes into the buffer it will still write\r\n * as many bytes as possible.  A task does not use any CPU time when it is in\r\n * the blocked state.\r\n *\r\n * @return The number of bytes written to the stream buffer.  If a task times\r\n * out before it can write all xDataLengthBytes into the buffer it will still\r\n * write as many bytes as possible.\r\n *\r\n * Example use:\r\n * @code{c}\r\n * void vAFunction( StreamBufferHandle_t xStreamBuffer )\r\n * {\r\n * size_t xBytesSent;\r\n * uint8_t ucArrayToSend[] = { 0, 1, 2, 3 };\r\n * char *pcStringToSend = \"String to send\";\r\n * const TickType_t x100ms = pdMS_TO_TICKS( 100 );\r\n *\r\n *  // Send an array to the stream buffer, blocking for a maximum of 100ms to\r\n *  // wait for enough space to be available in the stream buffer.\r\n *  xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) ucArrayToSend, sizeof( ucArrayToSend ), x100ms );\r\n *\r\n *  if( xBytesSent != sizeof( ucArrayToSend ) )\r\n *  {\r\n *      // The call to xStreamBufferSend() times out before there was enough\r\n *      // space in the buffer for the data to be written, but it did\r\n *      // successfully write xBytesSent bytes.\r\n *  }\r\n *\r\n *  // Send the string to the stream buffer.  Return immediately if there is not\r\n *  // enough space in the buffer.\r\n *  xBytesSent = xStreamBufferSend( xStreamBuffer, ( void * ) pcStringToSend, strlen( pcStringToSend ), 0 );\r\n *\r\n *  if( xBytesSent != strlen( pcStringToSend ) )\r\n *  {\r\n *      // The entire string could not be added to the stream buffer because\r\n *      // there was not enough free space in the buffer, but xBytesSent bytes\r\n *      // were sent.  Could try again to send the remaining bytes.\r\n *  }\r\n * }\r\n * @endcode\r\n * \\defgroup xStreamBufferSend xStreamBufferSend\r\n * \\ingroup StreamBufferManagement\r\n */\r\nsize_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,\r\n                          const void * pvTxData,\r\n                          size_t xDataLengthBytes,\r\n                          TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * stream_buffer.h\r\n *\r\n * @code{c}\r\n * size_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer,\r\n *                               const void *pvTxData,\r\n *                               size_t xDataLengthBytes,\r\n *                               BaseType_t *pxHigherPriorityTaskWoken );\r\n * @endcode\r\n *\r\n * Interrupt safe version of the API function that sends a stream of bytes to\r\n * the stream buffer.\r\n *\r\n * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer\r\n * implementation (so also the message buffer implementation, as message buffers\r\n * are built on top of stream buffers) assumes there is only one task or\r\n * interrupt that will write to the buffer (the writer), and only one task or\r\n * interrupt that will read from the buffer (the reader).  It is safe for the\r\n * writer and reader to be different tasks or interrupts, but, unlike other\r\n * FreeRTOS objects, it is not safe to have multiple different writers or\r\n * multiple different readers.  If there are to be multiple different writers\r\n * then the application writer must place each call to a writing API function\r\n * (such as xStreamBufferSend()) inside a critical section and set the send\r\n * block time to 0.  Likewise, if there are to be multiple different readers\r\n * then the application writer must place each call to a reading API function\r\n * (such as xStreamBufferReceive()) inside a critical section and set the receive\r\n * block time to 0.\r\n *\r\n * Use xStreamBufferSend() to write to a stream buffer from a task.  Use\r\n * xStreamBufferSendFromISR() to write to a stream buffer from an interrupt\r\n * service routine (ISR).\r\n *\r\n * @param xStreamBuffer The handle of the stream buffer to which a stream is\r\n * being sent.\r\n *\r\n * @param pvTxData A pointer to the data that is to be copied into the stream\r\n * buffer.\r\n *\r\n * @param xDataLengthBytes The maximum number of bytes to copy from pvTxData\r\n * into the stream buffer.\r\n *\r\n * @param pxHigherPriorityTaskWoken  It is possible that a stream buffer will\r\n * have a task blocked on it waiting for data.  Calling\r\n * xStreamBufferSendFromISR() can make data available, and so cause a task that\r\n * was waiting for data to leave the Blocked state.  If calling\r\n * xStreamBufferSendFromISR() causes a task to leave the Blocked state, and the\r\n * unblocked task has a priority higher than the currently executing task (the\r\n * task that was interrupted), then, internally, xStreamBufferSendFromISR()\r\n * will set *pxHigherPriorityTaskWoken to pdTRUE.  If\r\n * xStreamBufferSendFromISR() sets this value to pdTRUE, then normally a\r\n * context switch should be performed before the interrupt is exited.  This will\r\n * ensure that the interrupt returns directly to the highest priority Ready\r\n * state task.  *pxHigherPriorityTaskWoken should be set to pdFALSE before it\r\n * is passed into the function.  See the example code below for an example.\r\n *\r\n * @return The number of bytes actually written to the stream buffer, which will\r\n * be less than xDataLengthBytes if the stream buffer didn't have enough free\r\n * space for all the bytes to be written.\r\n *\r\n * Example use:\r\n * @code{c}\r\n * // A stream buffer that has already been created.\r\n * StreamBufferHandle_t xStreamBuffer;\r\n *\r\n * void vAnInterruptServiceRoutine( void )\r\n * {\r\n * size_t xBytesSent;\r\n * char *pcStringToSend = \"String to send\";\r\n * BaseType_t xHigherPriorityTaskWoken = pdFALSE; // Initialised to pdFALSE.\r\n *\r\n *  // Attempt to send the string to the stream buffer.\r\n *  xBytesSent = xStreamBufferSendFromISR( xStreamBuffer,\r\n *                                         ( void * ) pcStringToSend,\r\n *                                         strlen( pcStringToSend ),\r\n *                                         &xHigherPriorityTaskWoken );\r\n *\r\n *  if( xBytesSent != strlen( pcStringToSend ) )\r\n *  {\r\n *      // There was not enough free space in the stream buffer for the entire\r\n *      // string to be written, ut xBytesSent bytes were written.\r\n *  }\r\n *\r\n *  // If xHigherPriorityTaskWoken was set to pdTRUE inside\r\n *  // xStreamBufferSendFromISR() then a task that has a priority above the\r\n *  // priority of the currently executing task was unblocked and a context\r\n *  // switch should be performed to ensure the ISR returns to the unblocked\r\n *  // task.  In most FreeRTOS ports this is done by simply passing\r\n *  // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the\r\n *  // variables value, and perform the context switch if necessary.  Check the\r\n *  // documentation for the port in use for port specific instructions.\r\n *  portYIELD_FROM_ISR( xHigherPriorityTaskWoken );\r\n * }\r\n * @endcode\r\n * \\defgroup xStreamBufferSendFromISR xStreamBufferSendFromISR\r\n * \\ingroup StreamBufferManagement\r\n */\r\nsize_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer,\r\n                                 const void * pvTxData,\r\n                                 size_t xDataLengthBytes,\r\n                                 BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * stream_buffer.h\r\n *\r\n * @code{c}\r\n * size_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,\r\n *                           void *pvRxData,\r\n *                           size_t xBufferLengthBytes,\r\n *                           TickType_t xTicksToWait );\r\n * @endcode\r\n *\r\n * Receives bytes from a stream buffer.\r\n *\r\n * ***NOTE***:  Uniquely among FreeRTOS objects, the stream buffer\r\n * implementation (so also the message buffer implementation, as message buffers\r\n * are built on top of stream buffers) assumes there is only one task or\r\n * interrupt that will write to the buffer (the writer), and only one task or\r\n * interrupt that will read from the buffer (the reader).  It is safe for the\r\n * writer and reader to be different tasks or interrupts, but, unlike other\r\n * FreeRTOS objects, it is not safe to have multiple different writers or\r\n * multiple different readers.  If there are to be multiple different writers\r\n * then the application writer must place each call to a writing API function\r\n * (such as xStreamBufferSend()) inside a critical section and set the send\r\n * block time to 0.  Likewise, if there are to be multiple different readers\r\n * then the application writer must place each call to a reading API function\r\n * (such as xStreamBufferReceive()) inside a critical section and set the receive\r\n * block time to 0.\r\n *\r\n * Use xStreamBufferReceive() to read from a stream buffer from a task.  Use\r\n * xStreamBufferReceiveFromISR() to read from a stream buffer from an\r\n * interrupt service routine (ISR).\r\n *\r\n * @param xStreamBuffer The handle of the stream buffer from which bytes are to\r\n * be received.\r\n *\r\n * @param pvRxData A pointer to the buffer into which the received bytes will be\r\n * copied.\r\n *\r\n * @param xBufferLengthBytes The length of the buffer pointed to by the\r\n * pvRxData parameter.  This sets the maximum number of bytes to receive in one\r\n * call.  xStreamBufferReceive will return as many bytes as possible up to a\r\n * maximum set by xBufferLengthBytes.\r\n *\r\n * @param xTicksToWait The maximum amount of time the task should remain in the\r\n * Blocked state to wait for data to become available if the stream buffer is\r\n * empty.  xStreamBufferReceive() will return immediately if xTicksToWait is\r\n * zero.  The block time is specified in tick periods, so the absolute time it\r\n * represents is dependent on the tick frequency.  The macro pdMS_TO_TICKS() can\r\n * be used to convert a time specified in milliseconds into a time specified in\r\n * ticks.  Setting xTicksToWait to portMAX_DELAY will cause the task to wait\r\n * indefinitely (without timing out), provided INCLUDE_vTaskSuspend is set to 1\r\n * in FreeRTOSConfig.h.  A task does not use any CPU time when it is in the\r\n * Blocked state.\r\n *\r\n * @return The number of bytes actually read from the stream buffer, which will\r\n * be less than xBufferLengthBytes if the call to xStreamBufferReceive() timed\r\n * out before xBufferLengthBytes were available.\r\n *\r\n * Example use:\r\n * @code{c}\r\n * void vAFunction( StreamBuffer_t xStreamBuffer )\r\n * {\r\n * uint8_t ucRxData[ 20 ];\r\n * size_t xReceivedBytes;\r\n * const TickType_t xBlockTime = pdMS_TO_TICKS( 20 );\r\n *\r\n *  // Receive up to another sizeof( ucRxData ) bytes from the stream buffer.\r\n *  // Wait in the Blocked state (so not using any CPU processing time) for a\r\n *  // maximum of 100ms for the full sizeof( ucRxData ) number of bytes to be\r\n *  // available.\r\n *  xReceivedBytes = xStreamBufferReceive( xStreamBuffer,\r\n *                                         ( void * ) ucRxData,\r\n *                                         sizeof( ucRxData ),\r\n *                                         xBlockTime );\r\n *\r\n *  if( xReceivedBytes > 0 )\r\n *  {\r\n *      // A ucRxData contains another xReceivedBytes bytes of data, which can\r\n *      // be processed here....\r\n *  }\r\n * }\r\n * @endcode\r\n * \\defgroup xStreamBufferReceive xStreamBufferReceive\r\n * \\ingroup StreamBufferManagement\r\n */\r\nsize_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,\r\n                             void * pvRxData,\r\n                             size_t xBufferLengthBytes,\r\n                             TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * stream_buffer.h\r\n *\r\n * @code{c}\r\n * size_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer,\r\n *                                  void *pvRxData,\r\n *                                  size_t xBufferLengthBytes,\r\n *                                  BaseType_t *pxHigherPriorityTaskWoken );\r\n * @endcode\r\n *\r\n * An interrupt safe version of the API function that receives bytes from a\r\n * stream buffer.\r\n *\r\n * Use xStreamBufferReceive() to read bytes from a stream buffer from a task.\r\n * Use xStreamBufferReceiveFromISR() to read bytes from a stream buffer from an\r\n * interrupt service routine (ISR).\r\n *\r\n * @param xStreamBuffer The handle of the stream buffer from which a stream\r\n * is being received.\r\n *\r\n * @param pvRxData A pointer to the buffer into which the received bytes are\r\n * copied.\r\n *\r\n * @param xBufferLengthBytes The length of the buffer pointed to by the\r\n * pvRxData parameter.  This sets the maximum number of bytes to receive in one\r\n * call.  xStreamBufferReceive will return as many bytes as possible up to a\r\n * maximum set by xBufferLengthBytes.\r\n *\r\n * @param pxHigherPriorityTaskWoken  It is possible that a stream buffer will\r\n * have a task blocked on it waiting for space to become available.  Calling\r\n * xStreamBufferReceiveFromISR() can make space available, and so cause a task\r\n * that is waiting for space to leave the Blocked state.  If calling\r\n * xStreamBufferReceiveFromISR() causes a task to leave the Blocked state, and\r\n * the unblocked task has a priority higher than the currently executing task\r\n * (the task that was interrupted), then, internally,\r\n * xStreamBufferReceiveFromISR() will set *pxHigherPriorityTaskWoken to pdTRUE.\r\n * If xStreamBufferReceiveFromISR() sets this value to pdTRUE, then normally a\r\n * context switch should be performed before the interrupt is exited.  That will\r\n * ensure the interrupt returns directly to the highest priority Ready state\r\n * task.  *pxHigherPriorityTaskWoken should be set to pdFALSE before it is\r\n * passed into the function.  See the code example below for an example.\r\n *\r\n * @return The number of bytes read from the stream buffer, if any.\r\n *\r\n * Example use:\r\n * @code{c}\r\n * // A stream buffer that has already been created.\r\n * StreamBuffer_t xStreamBuffer;\r\n *\r\n * void vAnInterruptServiceRoutine( void )\r\n * {\r\n * uint8_t ucRxData[ 20 ];\r\n * size_t xReceivedBytes;\r\n * BaseType_t xHigherPriorityTaskWoken = pdFALSE;  // Initialised to pdFALSE.\r\n *\r\n *  // Receive the next stream from the stream buffer.\r\n *  xReceivedBytes = xStreamBufferReceiveFromISR( xStreamBuffer,\r\n *                                                ( void * ) ucRxData,\r\n *                                                sizeof( ucRxData ),\r\n *                                                &xHigherPriorityTaskWoken );\r\n *\r\n *  if( xReceivedBytes > 0 )\r\n *  {\r\n *      // ucRxData contains xReceivedBytes read from the stream buffer.\r\n *      // Process the stream here....\r\n *  }\r\n *\r\n *  // If xHigherPriorityTaskWoken was set to pdTRUE inside\r\n *  // xStreamBufferReceiveFromISR() then a task that has a priority above the\r\n *  // priority of the currently executing task was unblocked and a context\r\n *  // switch should be performed to ensure the ISR returns to the unblocked\r\n *  // task.  In most FreeRTOS ports this is done by simply passing\r\n *  // xHigherPriorityTaskWoken into portYIELD_FROM_ISR(), which will test the\r\n *  // variables value, and perform the context switch if necessary.  Check the\r\n *  // documentation for the port in use for port specific instructions.\r\n *  portYIELD_FROM_ISR( xHigherPriorityTaskWoken );\r\n * }\r\n * @endcode\r\n * \\defgroup xStreamBufferReceiveFromISR xStreamBufferReceiveFromISR\r\n * \\ingroup StreamBufferManagement\r\n */\r\nsize_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer,\r\n                                    void * pvRxData,\r\n                                    size_t xBufferLengthBytes,\r\n                                    BaseType_t * const pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * stream_buffer.h\r\n *\r\n * @code{c}\r\n * void vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer );\r\n * @endcode\r\n *\r\n * Deletes a stream buffer that was previously created using a call to\r\n * xStreamBufferCreate() or xStreamBufferCreateStatic().  If the stream\r\n * buffer was created using dynamic memory (that is, by xStreamBufferCreate()),\r\n * then the allocated memory is freed.\r\n *\r\n * A stream buffer handle must not be used after the stream buffer has been\r\n * deleted.\r\n *\r\n * @param xStreamBuffer The handle of the stream buffer to be deleted.\r\n *\r\n * \\defgroup vStreamBufferDelete vStreamBufferDelete\r\n * \\ingroup StreamBufferManagement\r\n */\r\nvoid vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * stream_buffer.h\r\n *\r\n * @code{c}\r\n * BaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer );\r\n * @endcode\r\n *\r\n * Queries a stream buffer to see if it is full.  A stream buffer is full if it\r\n * does not have any free space, and therefore cannot accept any more data.\r\n *\r\n * @param xStreamBuffer The handle of the stream buffer being queried.\r\n *\r\n * @return If the stream buffer is full then pdTRUE is returned.  Otherwise\r\n * pdFALSE is returned.\r\n *\r\n * \\defgroup xStreamBufferIsFull xStreamBufferIsFull\r\n * \\ingroup StreamBufferManagement\r\n */\r\nBaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * stream_buffer.h\r\n *\r\n * @code{c}\r\n * BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer );\r\n * @endcode\r\n *\r\n * Queries a stream buffer to see if it is empty.  A stream buffer is empty if\r\n * it does not contain any data.\r\n *\r\n * @param xStreamBuffer The handle of the stream buffer being queried.\r\n *\r\n * @return If the stream buffer is empty then pdTRUE is returned.  Otherwise\r\n * pdFALSE is returned.\r\n *\r\n * \\defgroup xStreamBufferIsEmpty xStreamBufferIsEmpty\r\n * \\ingroup StreamBufferManagement\r\n */\r\nBaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * stream_buffer.h\r\n *\r\n * @code{c}\r\n * BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer );\r\n * @endcode\r\n *\r\n * Resets a stream buffer to its initial, empty, state.  Any data that was in\r\n * the stream buffer is discarded.  A stream buffer can only be reset if there\r\n * are no tasks blocked waiting to either send to or receive from the stream\r\n * buffer.\r\n *\r\n * @param xStreamBuffer The handle of the stream buffer being reset.\r\n *\r\n * @return If the stream buffer is reset then pdPASS is returned.  If there was\r\n * a task blocked waiting to send to or read from the stream buffer then the\r\n * stream buffer is not reset and pdFAIL is returned.\r\n *\r\n * \\defgroup xStreamBufferReset xStreamBufferReset\r\n * \\ingroup StreamBufferManagement\r\n */\r\nBaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * stream_buffer.h\r\n *\r\n * @code{c}\r\n * size_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer );\r\n * @endcode\r\n *\r\n * Queries a stream buffer to see how much free space it contains, which is\r\n * equal to the amount of data that can be sent to the stream buffer before it\r\n * is full.\r\n *\r\n * @param xStreamBuffer The handle of the stream buffer being queried.\r\n *\r\n * @return The number of bytes that can be written to the stream buffer before\r\n * the stream buffer would be full.\r\n *\r\n * \\defgroup xStreamBufferSpacesAvailable xStreamBufferSpacesAvailable\r\n * \\ingroup StreamBufferManagement\r\n */\r\nsize_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * stream_buffer.h\r\n *\r\n * @code{c}\r\n * size_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer );\r\n * @endcode\r\n *\r\n * Queries a stream buffer to see how much data it contains, which is equal to\r\n * the number of bytes that can be read from the stream buffer before the stream\r\n * buffer would be empty.\r\n *\r\n * @param xStreamBuffer The handle of the stream buffer being queried.\r\n *\r\n * @return The number of bytes that can be read from the stream buffer before\r\n * the stream buffer would be empty.\r\n *\r\n * \\defgroup xStreamBufferBytesAvailable xStreamBufferBytesAvailable\r\n * \\ingroup StreamBufferManagement\r\n */\r\nsize_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * stream_buffer.h\r\n *\r\n * @code{c}\r\n * BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel );\r\n * @endcode\r\n *\r\n * A stream buffer's trigger level is the number of bytes that must be in the\r\n * stream buffer before a task that is blocked on the stream buffer to\r\n * wait for data is moved out of the blocked state.  For example, if a task is\r\n * blocked on a read of an empty stream buffer that has a trigger level of 1\r\n * then the task will be unblocked when a single byte is written to the buffer\r\n * or the task's block time expires.  As another example, if a task is blocked\r\n * on a read of an empty stream buffer that has a trigger level of 10 then the\r\n * task will not be unblocked until the stream buffer contains at least 10 bytes\r\n * or the task's block time expires.  If a reading task's block time expires\r\n * before the trigger level is reached then the task will still receive however\r\n * many bytes are actually available.  Setting a trigger level of 0 will result\r\n * in a trigger level of 1 being used.  It is not valid to specify a trigger\r\n * level that is greater than the buffer size.\r\n *\r\n * A trigger level is set when the stream buffer is created, and can be modified\r\n * using xStreamBufferSetTriggerLevel().\r\n *\r\n * @param xStreamBuffer The handle of the stream buffer being updated.\r\n *\r\n * @param xTriggerLevel The new trigger level for the stream buffer.\r\n *\r\n * @return If xTriggerLevel was less than or equal to the stream buffer's length\r\n * then the trigger level will be updated and pdTRUE is returned.  Otherwise\r\n * pdFALSE is returned.\r\n *\r\n * \\defgroup xStreamBufferSetTriggerLevel xStreamBufferSetTriggerLevel\r\n * \\ingroup StreamBufferManagement\r\n */\r\nBaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer,\r\n                                         size_t xTriggerLevel ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * stream_buffer.h\r\n *\r\n * @code{c}\r\n * BaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );\r\n * @endcode\r\n *\r\n * For advanced users only.\r\n *\r\n * The sbSEND_COMPLETED() macro is called from within the FreeRTOS APIs when\r\n * data is sent to a message buffer or stream buffer.  If there was a task that\r\n * was blocked on the message or stream buffer waiting for data to arrive then\r\n * the sbSEND_COMPLETED() macro sends a notification to the task to remove it\r\n * from the Blocked state.  xStreamBufferSendCompletedFromISR() does the same\r\n * thing.  It is provided to enable application writers to implement their own\r\n * version of sbSEND_COMPLETED(), and MUST NOT BE USED AT ANY OTHER TIME.\r\n *\r\n * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for\r\n * additional information.\r\n *\r\n * @param xStreamBuffer The handle of the stream buffer to which data was\r\n * written.\r\n *\r\n * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be\r\n * initialised to pdFALSE before it is passed into\r\n * xStreamBufferSendCompletedFromISR().  If calling\r\n * xStreamBufferSendCompletedFromISR() removes a task from the Blocked state,\r\n * and the task has a priority above the priority of the currently running task,\r\n * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a\r\n * context switch should be performed before exiting the ISR.\r\n *\r\n * @return If a task was removed from the Blocked state then pdTRUE is returned.\r\n * Otherwise pdFALSE is returned.\r\n *\r\n * \\defgroup xStreamBufferSendCompletedFromISR xStreamBufferSendCompletedFromISR\r\n * \\ingroup StreamBufferManagement\r\n */\r\nBaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer,\r\n                                              BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * stream_buffer.h\r\n *\r\n * @code{c}\r\n * BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken );\r\n * @endcode\r\n *\r\n * For advanced users only.\r\n *\r\n * The sbRECEIVE_COMPLETED() macro is called from within the FreeRTOS APIs when\r\n * data is read out of a message buffer or stream buffer.  If there was a task\r\n * that was blocked on the message or stream buffer waiting for data to arrive\r\n * then the sbRECEIVE_COMPLETED() macro sends a notification to the task to\r\n * remove it from the Blocked state.  xStreamBufferReceiveCompletedFromISR()\r\n * does the same thing.  It is provided to enable application writers to\r\n * implement their own version of sbRECEIVE_COMPLETED(), and MUST NOT BE USED AT\r\n * ANY OTHER TIME.\r\n *\r\n * See the example implemented in FreeRTOS/Demo/Minimal/MessageBufferAMP.c for\r\n * additional information.\r\n *\r\n * @param xStreamBuffer The handle of the stream buffer from which data was\r\n * read.\r\n *\r\n * @param pxHigherPriorityTaskWoken *pxHigherPriorityTaskWoken should be\r\n * initialised to pdFALSE before it is passed into\r\n * xStreamBufferReceiveCompletedFromISR().  If calling\r\n * xStreamBufferReceiveCompletedFromISR() removes a task from the Blocked state,\r\n * and the task has a priority above the priority of the currently running task,\r\n * then *pxHigherPriorityTaskWoken will get set to pdTRUE indicating that a\r\n * context switch should be performed before exiting the ISR.\r\n *\r\n * @return If a task was removed from the Blocked state then pdTRUE is returned.\r\n * Otherwise pdFALSE is returned.\r\n *\r\n * \\defgroup xStreamBufferReceiveCompletedFromISR xStreamBufferReceiveCompletedFromISR\r\n * \\ingroup StreamBufferManagement\r\n */\r\nBaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer,\r\n                                                 BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r\n\r\n/* Functions below here are not part of the public API. */\r\nStreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes,\r\n                                                 size_t xTriggerLevelBytes,\r\n                                                 BaseType_t xIsMessageBuffer,\r\n                                                 StreamBufferCallbackFunction_t pxSendCompletedCallback,\r\n                                                 StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) PRIVILEGED_FUNCTION;\r\n\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n    StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes,\r\n                                                           size_t xTriggerLevelBytes,\r\n                                                           BaseType_t xIsMessageBuffer,\r\n                                                           uint8_t * const pucStreamBufferStorageArea,\r\n                                                           StaticStreamBuffer_t * const pxStaticStreamBuffer,\r\n                                                           StreamBufferCallbackFunction_t pxSendCompletedCallback,\r\n                                                           StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\nsize_t xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;\r\n\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n    void vStreamBufferSetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer,\r\n                                             UBaseType_t uxStreamBufferNumber ) PRIVILEGED_FUNCTION;\r\n    UBaseType_t uxStreamBufferGetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;\r\n    uint8_t ucStreamBufferGetStreamBufferType( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/* *INDENT-OFF* */\r\n#if defined( __cplusplus )\r\n    }\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n#endif /* !defined( STREAM_BUFFER_H ) */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/task.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n\r\n#ifndef INC_TASK_H\r\n#define INC_TASK_H\r\n\r\n#ifndef INC_FREERTOS_H\r\n    #error \"include FreeRTOS.h must appear in source files before include task.h\"\r\n#endif\r\n\r\n#include \"list.h\"\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    extern \"C\" {\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n/*-----------------------------------------------------------\r\n* MACROS AND DEFINITIONS\r\n*----------------------------------------------------------*/\r\n\r\n/*\r\n * If tskKERNEL_VERSION_NUMBER ends with + it represents the version in development\r\n * after the numbered release.\r\n *\r\n * The tskKERNEL_VERSION_MAJOR, tskKERNEL_VERSION_MINOR, tskKERNEL_VERSION_BUILD\r\n * values will reflect the last released version number.\r\n */\r\n#define tskKERNEL_VERSION_NUMBER       \"V11.0.1\"\r\n#define tskKERNEL_VERSION_MAJOR        11\r\n#define tskKERNEL_VERSION_MINOR        0\r\n#define tskKERNEL_VERSION_BUILD        1\r\n\r\n/* MPU region parameters passed in ulParameters\r\n * of MemoryRegion_t struct. */\r\n#define tskMPU_REGION_READ_ONLY        ( 1UL << 0UL )\r\n#define tskMPU_REGION_READ_WRITE       ( 1UL << 1UL )\r\n#define tskMPU_REGION_EXECUTE_NEVER    ( 1UL << 2UL )\r\n#define tskMPU_REGION_NORMAL_MEMORY    ( 1UL << 3UL )\r\n#define tskMPU_REGION_DEVICE_MEMORY    ( 1UL << 4UL )\r\n\r\n/* MPU region permissions stored in MPU settings to\r\n * authorize access requests. */\r\n#define tskMPU_READ_PERMISSION         ( 1UL << 0UL )\r\n#define tskMPU_WRITE_PERMISSION        ( 1UL << 1UL )\r\n\r\n/* The direct to task notification feature used to have only a single notification\r\n * per task.  Now there is an array of notifications per task that is dimensioned by\r\n * configTASK_NOTIFICATION_ARRAY_ENTRIES.  For backward compatibility, any use of the\r\n * original direct to task notification defaults to using the first index in the\r\n * array. */\r\n#define tskDEFAULT_INDEX_TO_NOTIFY     ( 0 )\r\n\r\n/**\r\n * task. h\r\n *\r\n * Type by which tasks are referenced.  For example, a call to xTaskCreate\r\n * returns (via a pointer parameter) an TaskHandle_t variable that can then\r\n * be used as a parameter to vTaskDelete to delete the task.\r\n *\r\n * \\defgroup TaskHandle_t TaskHandle_t\r\n * \\ingroup Tasks\r\n */\r\nstruct tskTaskControlBlock; /* The old naming convention is used to prevent breaking kernel aware debuggers. */\r\ntypedef struct tskTaskControlBlock         * TaskHandle_t;\r\ntypedef const struct tskTaskControlBlock   * ConstTaskHandle_t;\r\n\r\n/*\r\n * Defines the prototype to which the application task hook function must\r\n * conform.\r\n */\r\ntypedef BaseType_t (* TaskHookFunction_t)( void * arg );\r\n\r\n/* Task states returned by eTaskGetState. */\r\ntypedef enum\r\n{\r\n    eRunning = 0, /* A task is querying the state of itself, so must be running. */\r\n    eReady,       /* The task being queried is in a ready or pending ready list. */\r\n    eBlocked,     /* The task being queried is in the Blocked state. */\r\n    eSuspended,   /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */\r\n    eDeleted,     /* The task being queried has been deleted, but its TCB has not yet been freed. */\r\n    eInvalid      /* Used as an 'invalid state' value. */\r\n} eTaskState;\r\n\r\n/* Actions that can be performed when vTaskNotify() is called. */\r\ntypedef enum\r\n{\r\n    eNoAction = 0,            /* Notify the task without updating its notify value. */\r\n    eSetBits,                 /* Set bits in the task's notification value. */\r\n    eIncrement,               /* Increment the task's notification value. */\r\n    eSetValueWithOverwrite,   /* Set the task's notification value to a specific value even if the previous value has not yet been read by the task. */\r\n    eSetValueWithoutOverwrite /* Set the task's notification value if the previous value has been read by the task. */\r\n} eNotifyAction;\r\n\r\n/*\r\n * Used internally only.\r\n */\r\ntypedef struct xTIME_OUT\r\n{\r\n    BaseType_t xOverflowCount;\r\n    TickType_t xTimeOnEntering;\r\n} TimeOut_t;\r\n\r\n/*\r\n * Defines the memory ranges allocated to the task when an MPU is used.\r\n */\r\ntypedef struct xMEMORY_REGION\r\n{\r\n    void * pvBaseAddress;\r\n    uint32_t ulLengthInBytes;\r\n    uint32_t ulParameters;\r\n} MemoryRegion_t;\r\n\r\n/*\r\n * Parameters required to create an MPU protected task.\r\n */\r\ntypedef struct xTASK_PARAMETERS\r\n{\r\n    TaskFunction_t pvTaskCode;\r\n    const char * pcName;\r\n    configSTACK_DEPTH_TYPE usStackDepth;\r\n    void * pvParameters;\r\n    UBaseType_t uxPriority;\r\n    StackType_t * puxStackBuffer;\r\n    MemoryRegion_t xRegions[ portNUM_CONFIGURABLE_REGIONS ];\r\n    #if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )\r\n        StaticTask_t * const pxTaskBuffer;\r\n    #endif\r\n} TaskParameters_t;\r\n\r\n/* Used with the uxTaskGetSystemState() function to return the state of each task\r\n * in the system. */\r\ntypedef struct xTASK_STATUS\r\n{\r\n    TaskHandle_t xHandle;                         /* The handle of the task to which the rest of the information in the structure relates. */\r\n    const char * pcTaskName;                      /* A pointer to the task's name.  This value will be invalid if the task was deleted since the structure was populated! */\r\n    UBaseType_t xTaskNumber;                      /* A number unique to the task. */\r\n    eTaskState eCurrentState;                     /* The state in which the task existed when the structure was populated. */\r\n    UBaseType_t uxCurrentPriority;                /* The priority at which the task was running (may be inherited) when the structure was populated. */\r\n    UBaseType_t uxBasePriority;                   /* The priority to which the task will return if the task's current priority has been inherited to avoid unbounded priority inversion when obtaining a mutex.  Only valid if configUSE_MUTEXES is defined as 1 in FreeRTOSConfig.h. */\r\n    configRUN_TIME_COUNTER_TYPE ulRunTimeCounter; /* The total run time allocated to the task so far, as defined by the run time stats clock.  See https://www.FreeRTOS.org/rtos-run-time-stats.html.  Only valid when configGENERATE_RUN_TIME_STATS is defined as 1 in FreeRTOSConfig.h. */\r\n    StackType_t * pxStackBase;                    /* Points to the lowest address of the task's stack area. */\r\n    #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) )\r\n        StackType_t * pxTopOfStack;               /* Points to the top address of the task's stack area. */\r\n        StackType_t * pxEndOfStack;               /* Points to the end address of the task's stack area. */\r\n    #endif\r\n    configSTACK_DEPTH_TYPE usStackHighWaterMark;  /* The minimum amount of stack space that has remained for the task since the task was created.  The closer this value is to zero the closer the task has come to overflowing its stack. */\r\n    #if ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 ) )\r\n        UBaseType_t uxCoreAffinityMask;           /* The core affinity mask for the task */\r\n    #endif\r\n} TaskStatus_t;\r\n\r\n/* Possible return values for eTaskConfirmSleepModeStatus(). */\r\ntypedef enum\r\n{\r\n    eAbortSleep = 0,           /* A task has been made ready or a context switch pended since portSUPPRESS_TICKS_AND_SLEEP() was called - abort entering a sleep mode. */\r\n    eStandardSleep,            /* Enter a sleep mode that will not last any longer than the expected idle time. */\r\n    #if ( INCLUDE_vTaskSuspend == 1 )\r\n        eNoTasksWaitingTimeout /* No tasks are waiting for a timeout so it is safe to enter a sleep mode that can only be exited by an external interrupt. */\r\n    #endif /* INCLUDE_vTaskSuspend */\r\n} eSleepModeStatus;\r\n\r\n/**\r\n * Defines the priority used by the idle task.  This must not be modified.\r\n *\r\n * \\ingroup TaskUtils\r\n */\r\n#define tskIDLE_PRIORITY    ( ( UBaseType_t ) 0U )\r\n\r\n/**\r\n * Defines affinity to all available cores.\r\n *\r\n * \\ingroup TaskUtils\r\n */\r\n#define tskNO_AFFINITY      ( ( UBaseType_t ) -1 )\r\n\r\n/**\r\n * task. h\r\n *\r\n * Macro for forcing a context switch.\r\n *\r\n * \\defgroup taskYIELD taskYIELD\r\n * \\ingroup SchedulerControl\r\n */\r\n#define taskYIELD()                          portYIELD()\r\n\r\n/**\r\n * task. h\r\n *\r\n * Macro to mark the start of a critical code region.  Preemptive context\r\n * switches cannot occur when in a critical region.\r\n *\r\n * NOTE: This may alter the stack (depending on the portable implementation)\r\n * so must be used with care!\r\n *\r\n * \\defgroup taskENTER_CRITICAL taskENTER_CRITICAL\r\n * \\ingroup SchedulerControl\r\n */\r\n#define taskENTER_CRITICAL()                 portENTER_CRITICAL()\r\n#if ( configNUMBER_OF_CORES == 1 )\r\n    #define taskENTER_CRITICAL_FROM_ISR()    portSET_INTERRUPT_MASK_FROM_ISR()\r\n#else\r\n    #define taskENTER_CRITICAL_FROM_ISR()    portENTER_CRITICAL_FROM_ISR()\r\n#endif\r\n\r\n/**\r\n * task. h\r\n *\r\n * Macro to mark the end of a critical code region.  Preemptive context\r\n * switches cannot occur when in a critical region.\r\n *\r\n * NOTE: This may alter the stack (depending on the portable implementation)\r\n * so must be used with care!\r\n *\r\n * \\defgroup taskEXIT_CRITICAL taskEXIT_CRITICAL\r\n * \\ingroup SchedulerControl\r\n */\r\n#define taskEXIT_CRITICAL()                    portEXIT_CRITICAL()\r\n#if ( configNUMBER_OF_CORES == 1 )\r\n    #define taskEXIT_CRITICAL_FROM_ISR( x )    portCLEAR_INTERRUPT_MASK_FROM_ISR( x )\r\n#else\r\n    #define taskEXIT_CRITICAL_FROM_ISR( x )    portEXIT_CRITICAL_FROM_ISR( x )\r\n#endif\r\n\r\n/**\r\n * task. h\r\n *\r\n * Macro to disable all maskable interrupts.\r\n *\r\n * \\defgroup taskDISABLE_INTERRUPTS taskDISABLE_INTERRUPTS\r\n * \\ingroup SchedulerControl\r\n */\r\n#define taskDISABLE_INTERRUPTS()    portDISABLE_INTERRUPTS()\r\n\r\n/**\r\n * task. h\r\n *\r\n * Macro to enable microcontroller interrupts.\r\n *\r\n * \\defgroup taskENABLE_INTERRUPTS taskENABLE_INTERRUPTS\r\n * \\ingroup SchedulerControl\r\n */\r\n#define taskENABLE_INTERRUPTS()     portENABLE_INTERRUPTS()\r\n\r\n/* Definitions returned by xTaskGetSchedulerState().  taskSCHEDULER_SUSPENDED is\r\n * 0 to generate more optimal code when configASSERT() is defined as the constant\r\n * is used in assert() statements. */\r\n#define taskSCHEDULER_SUSPENDED      ( ( BaseType_t ) 0 )\r\n#define taskSCHEDULER_NOT_STARTED    ( ( BaseType_t ) 1 )\r\n#define taskSCHEDULER_RUNNING        ( ( BaseType_t ) 2 )\r\n\r\n/* Checks if core ID is valid. */\r\n#define taskVALID_CORE_ID( xCoreID )    ( ( ( ( ( BaseType_t ) 0 <= ( xCoreID ) ) && ( ( xCoreID ) < ( BaseType_t ) configNUMBER_OF_CORES ) ) ) ? ( pdTRUE ) : ( pdFALSE ) )\r\n\r\n/*-----------------------------------------------------------\r\n* TASK CREATION API\r\n*----------------------------------------------------------*/\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * BaseType_t xTaskCreate(\r\n *                            TaskFunction_t pxTaskCode,\r\n *                            const char *pcName,\r\n *                            configSTACK_DEPTH_TYPE usStackDepth,\r\n *                            void *pvParameters,\r\n *                            UBaseType_t uxPriority,\r\n *                            TaskHandle_t *pxCreatedTask\r\n *                        );\r\n * @endcode\r\n *\r\n * Create a new task and add it to the list of tasks that are ready to run.\r\n *\r\n * Internally, within the FreeRTOS implementation, tasks use two blocks of\r\n * memory.  The first block is used to hold the task's data structures.  The\r\n * second block is used by the task as its stack.  If a task is created using\r\n * xTaskCreate() then both blocks of memory are automatically dynamically\r\n * allocated inside the xTaskCreate() function.  (see\r\n * https://www.FreeRTOS.org/a00111.html).  If a task is created using\r\n * xTaskCreateStatic() then the application writer must provide the required\r\n * memory.  xTaskCreateStatic() therefore allows a task to be created without\r\n * using any dynamic memory allocation.\r\n *\r\n * See xTaskCreateStatic() for a version that does not use any dynamic memory\r\n * allocation.\r\n *\r\n * xTaskCreate() can only be used to create a task that has unrestricted\r\n * access to the entire microcontroller memory map.  Systems that include MPU\r\n * support can alternatively create an MPU constrained task using\r\n * xTaskCreateRestricted().\r\n *\r\n * @param pxTaskCode Pointer to the task entry function.  Tasks\r\n * must be implemented to never return (i.e. continuous loop).\r\n *\r\n * @param pcName A descriptive name for the task.  This is mainly used to\r\n * facilitate debugging.  Max length defined by configMAX_TASK_NAME_LEN - default\r\n * is 16.\r\n *\r\n * @param usStackDepth The size of the task stack specified as the number of\r\n * variables the stack can hold - not the number of bytes.  For example, if\r\n * the stack is 16 bits wide and usStackDepth is defined as 100, 200 bytes\r\n * will be allocated for stack storage.\r\n *\r\n * @param pvParameters Pointer that will be used as the parameter for the task\r\n * being created.\r\n *\r\n * @param uxPriority The priority at which the task should run.  Systems that\r\n * include MPU support can optionally create tasks in a privileged (system)\r\n * mode by setting bit portPRIVILEGE_BIT of the priority parameter.  For\r\n * example, to create a privileged task at priority 2 the uxPriority parameter\r\n * should be set to ( 2 | portPRIVILEGE_BIT ).\r\n *\r\n * @param pxCreatedTask Used to pass back a handle by which the created task\r\n * can be referenced.\r\n *\r\n * @return pdPASS if the task was successfully created and added to a ready\r\n * list, otherwise an error code defined in the file projdefs.h\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * // Task to be created.\r\n * void vTaskCode( void * pvParameters )\r\n * {\r\n *   for( ;; )\r\n *   {\r\n *       // Task code goes here.\r\n *   }\r\n * }\r\n *\r\n * // Function that creates a task.\r\n * void vOtherFunction( void )\r\n * {\r\n * static uint8_t ucParameterToPass;\r\n * TaskHandle_t xHandle = NULL;\r\n *\r\n *   // Create the task, storing the handle.  Note that the passed parameter ucParameterToPass\r\n *   // must exist for the lifetime of the task, so in this case is declared static.  If it was just an\r\n *   // an automatic stack variable it might no longer exist, or at least have been corrupted, by the time\r\n *   // the new task attempts to access it.\r\n *   xTaskCreate( vTaskCode, \"NAME\", STACK_SIZE, &ucParameterToPass, tskIDLE_PRIORITY, &xHandle );\r\n *   configASSERT( xHandle );\r\n *\r\n *   // Use the handle to delete the task.\r\n *   if( xHandle != NULL )\r\n *   {\r\n *      vTaskDelete( xHandle );\r\n *   }\r\n * }\r\n * @endcode\r\n * \\defgroup xTaskCreate xTaskCreate\r\n * \\ingroup Tasks\r\n */\r\n#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r\n    BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,\r\n                            const char * const pcName,\r\n                            const configSTACK_DEPTH_TYPE usStackDepth,\r\n                            void * const pvParameters,\r\n                            UBaseType_t uxPriority,\r\n                            TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n#if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) )\r\n    BaseType_t xTaskCreateAffinitySet( TaskFunction_t pxTaskCode,\r\n                                       const char * const pcName,\r\n                                       const configSTACK_DEPTH_TYPE usStackDepth,\r\n                                       void * const pvParameters,\r\n                                       UBaseType_t uxPriority,\r\n                                       UBaseType_t uxCoreAffinityMask,\r\n                                       TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,\r\n *                               const char *pcName,\r\n *                               uint32_t ulStackDepth,\r\n *                               void *pvParameters,\r\n *                               UBaseType_t uxPriority,\r\n *                               StackType_t *puxStackBuffer,\r\n *                               StaticTask_t *pxTaskBuffer );\r\n * @endcode\r\n *\r\n * Create a new task and add it to the list of tasks that are ready to run.\r\n *\r\n * Internally, within the FreeRTOS implementation, tasks use two blocks of\r\n * memory.  The first block is used to hold the task's data structures.  The\r\n * second block is used by the task as its stack.  If a task is created using\r\n * xTaskCreate() then both blocks of memory are automatically dynamically\r\n * allocated inside the xTaskCreate() function.  (see\r\n * https://www.FreeRTOS.org/a00111.html).  If a task is created using\r\n * xTaskCreateStatic() then the application writer must provide the required\r\n * memory.  xTaskCreateStatic() therefore allows a task to be created without\r\n * using any dynamic memory allocation.\r\n *\r\n * @param pxTaskCode Pointer to the task entry function.  Tasks\r\n * must be implemented to never return (i.e. continuous loop).\r\n *\r\n * @param pcName A descriptive name for the task.  This is mainly used to\r\n * facilitate debugging.  The maximum length of the string is defined by\r\n * configMAX_TASK_NAME_LEN in FreeRTOSConfig.h.\r\n *\r\n * @param ulStackDepth The size of the task stack specified as the number of\r\n * variables the stack can hold - not the number of bytes.  For example, if\r\n * the stack is 32-bits wide and ulStackDepth is defined as 100 then 400 bytes\r\n * will be allocated for stack storage.\r\n *\r\n * @param pvParameters Pointer that will be used as the parameter for the task\r\n * being created.\r\n *\r\n * @param uxPriority The priority at which the task will run.\r\n *\r\n * @param puxStackBuffer Must point to a StackType_t array that has at least\r\n * ulStackDepth indexes - the array will then be used as the task's stack,\r\n * removing the need for the stack to be allocated dynamically.\r\n *\r\n * @param pxTaskBuffer Must point to a variable of type StaticTask_t, which will\r\n * then be used to hold the task's data structures, removing the need for the\r\n * memory to be allocated dynamically.\r\n *\r\n * @return If neither puxStackBuffer nor pxTaskBuffer are NULL, then the task\r\n * will be created and a handle to the created task is returned.  If either\r\n * puxStackBuffer or pxTaskBuffer are NULL then the task will not be created and\r\n * NULL is returned.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n *\r\n *  // Dimensions of the buffer that the task being created will use as its stack.\r\n *  // NOTE:  This is the number of words the stack will hold, not the number of\r\n *  // bytes.  For example, if each stack item is 32-bits, and this is set to 100,\r\n *  // then 400 bytes (100 * 32-bits) will be allocated.\r\n #define STACK_SIZE 200\r\n *\r\n *  // Structure that will hold the TCB of the task being created.\r\n *  StaticTask_t xTaskBuffer;\r\n *\r\n *  // Buffer that the task being created will use as its stack.  Note this is\r\n *  // an array of StackType_t variables.  The size of StackType_t is dependent on\r\n *  // the RTOS port.\r\n *  StackType_t xStack[ STACK_SIZE ];\r\n *\r\n *  // Function that implements the task being created.\r\n *  void vTaskCode( void * pvParameters )\r\n *  {\r\n *      // The parameter value is expected to be 1 as 1 is passed in the\r\n *      // pvParameters value in the call to xTaskCreateStatic().\r\n *      configASSERT( ( uint32_t ) pvParameters == 1UL );\r\n *\r\n *      for( ;; )\r\n *      {\r\n *          // Task code goes here.\r\n *      }\r\n *  }\r\n *\r\n *  // Function that creates a task.\r\n *  void vOtherFunction( void )\r\n *  {\r\n *      TaskHandle_t xHandle = NULL;\r\n *\r\n *      // Create the task without using any dynamic memory allocation.\r\n *      xHandle = xTaskCreateStatic(\r\n *                    vTaskCode,       // Function that implements the task.\r\n *                    \"NAME\",          // Text name for the task.\r\n *                    STACK_SIZE,      // Stack size in words, not bytes.\r\n *                    ( void * ) 1,    // Parameter passed into the task.\r\n *                    tskIDLE_PRIORITY,// Priority at which the task is created.\r\n *                    xStack,          // Array to use as the task's stack.\r\n *                    &xTaskBuffer );  // Variable to hold the task's data structure.\r\n *\r\n *      // puxStackBuffer and pxTaskBuffer were not NULL, so the task will have\r\n *      // been created, and xHandle will be the task's handle.  Use the handle\r\n *      // to suspend the task.\r\n *      vTaskSuspend( xHandle );\r\n *  }\r\n * @endcode\r\n * \\defgroup xTaskCreateStatic xTaskCreateStatic\r\n * \\ingroup Tasks\r\n */\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n    TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,\r\n                                    const char * const pcName,\r\n                                    const uint32_t ulStackDepth,\r\n                                    void * const pvParameters,\r\n                                    UBaseType_t uxPriority,\r\n                                    StackType_t * const puxStackBuffer,\r\n                                    StaticTask_t * const pxTaskBuffer ) PRIVILEGED_FUNCTION;\r\n#endif /* configSUPPORT_STATIC_ALLOCATION */\r\n\r\n#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) )\r\n    TaskHandle_t xTaskCreateStaticAffinitySet( TaskFunction_t pxTaskCode,\r\n                                               const char * const pcName,\r\n                                               const uint32_t ulStackDepth,\r\n                                               void * const pvParameters,\r\n                                               UBaseType_t uxPriority,\r\n                                               StackType_t * const puxStackBuffer,\r\n                                               StaticTask_t * const pxTaskBuffer,\r\n                                               UBaseType_t uxCoreAffinityMask ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * BaseType_t xTaskCreateRestricted( TaskParameters_t *pxTaskDefinition, TaskHandle_t *pxCreatedTask );\r\n * @endcode\r\n *\r\n * Only available when configSUPPORT_DYNAMIC_ALLOCATION is set to 1.\r\n *\r\n * xTaskCreateRestricted() should only be used in systems that include an MPU\r\n * implementation.\r\n *\r\n * Create a new task and add it to the list of tasks that are ready to run.\r\n * The function parameters define the memory regions and associated access\r\n * permissions allocated to the task.\r\n *\r\n * See xTaskCreateRestrictedStatic() for a version that does not use any\r\n * dynamic memory allocation.\r\n *\r\n * @param pxTaskDefinition Pointer to a structure that contains a member\r\n * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API\r\n * documentation) plus an optional stack buffer and the memory region\r\n * definitions.\r\n *\r\n * @param pxCreatedTask Used to pass back a handle by which the created task\r\n * can be referenced.\r\n *\r\n * @return pdPASS if the task was successfully created and added to a ready\r\n * list, otherwise an error code defined in the file projdefs.h\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * // Create an TaskParameters_t structure that defines the task to be created.\r\n * static const TaskParameters_t xCheckTaskParameters =\r\n * {\r\n *  vATask,     // pvTaskCode - the function that implements the task.\r\n *  \"ATask\",    // pcName - just a text name for the task to assist debugging.\r\n *  100,        // usStackDepth - the stack size DEFINED IN WORDS.\r\n *  NULL,       // pvParameters - passed into the task function as the function parameters.\r\n *  ( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state.\r\n *  cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack.\r\n *\r\n *  // xRegions - Allocate up to three separate memory regions for access by\r\n *  // the task, with appropriate access permissions.  Different processors have\r\n *  // different memory alignment requirements - refer to the FreeRTOS documentation\r\n *  // for full information.\r\n *  {\r\n *      // Base address                 Length  Parameters\r\n *      { cReadWriteArray,              32,     portMPU_REGION_READ_WRITE },\r\n *      { cReadOnlyArray,               32,     portMPU_REGION_READ_ONLY },\r\n *      { cPrivilegedOnlyAccessArray,   128,    portMPU_REGION_PRIVILEGED_READ_WRITE }\r\n *  }\r\n * };\r\n *\r\n * int main( void )\r\n * {\r\n * TaskHandle_t xHandle;\r\n *\r\n *  // Create a task from the const structure defined above.  The task handle\r\n *  // is requested (the second parameter is not NULL) but in this case just for\r\n *  // demonstration purposes as its not actually used.\r\n *  xTaskCreateRestricted( &xRegTest1Parameters, &xHandle );\r\n *\r\n *  // Start the scheduler.\r\n *  vTaskStartScheduler();\r\n *\r\n *  // Will only get here if there was insufficient memory to create the idle\r\n *  // and/or timer task.\r\n *  for( ;; );\r\n * }\r\n * @endcode\r\n * \\defgroup xTaskCreateRestricted xTaskCreateRestricted\r\n * \\ingroup Tasks\r\n */\r\n#if ( portUSING_MPU_WRAPPERS == 1 )\r\n    BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition,\r\n                                      TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) )\r\n    BaseType_t xTaskCreateRestrictedAffinitySet( const TaskParameters_t * const pxTaskDefinition,\r\n                                                 UBaseType_t uxCoreAffinityMask,\r\n                                                 TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * BaseType_t xTaskCreateRestrictedStatic( TaskParameters_t *pxTaskDefinition, TaskHandle_t *pxCreatedTask );\r\n * @endcode\r\n *\r\n * Only available when configSUPPORT_STATIC_ALLOCATION is set to 1.\r\n *\r\n * xTaskCreateRestrictedStatic() should only be used in systems that include an\r\n * MPU implementation.\r\n *\r\n * Internally, within the FreeRTOS implementation, tasks use two blocks of\r\n * memory.  The first block is used to hold the task's data structures.  The\r\n * second block is used by the task as its stack.  If a task is created using\r\n * xTaskCreateRestricted() then the stack is provided by the application writer,\r\n * and the memory used to hold the task's data structure is automatically\r\n * dynamically allocated inside the xTaskCreateRestricted() function.  If a task\r\n * is created using xTaskCreateRestrictedStatic() then the application writer\r\n * must provide the memory used to hold the task's data structures too.\r\n * xTaskCreateRestrictedStatic() therefore allows a memory protected task to be\r\n * created without using any dynamic memory allocation.\r\n *\r\n * @param pxTaskDefinition Pointer to a structure that contains a member\r\n * for each of the normal xTaskCreate() parameters (see the xTaskCreate() API\r\n * documentation) plus an optional stack buffer and the memory region\r\n * definitions.  If configSUPPORT_STATIC_ALLOCATION is set to 1 the structure\r\n * contains an additional member, which is used to point to a variable of type\r\n * StaticTask_t - which is then used to hold the task's data structure.\r\n *\r\n * @param pxCreatedTask Used to pass back a handle by which the created task\r\n * can be referenced.\r\n *\r\n * @return pdPASS if the task was successfully created and added to a ready\r\n * list, otherwise an error code defined in the file projdefs.h\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * // Create an TaskParameters_t structure that defines the task to be created.\r\n * // The StaticTask_t variable is only included in the structure when\r\n * // configSUPPORT_STATIC_ALLOCATION is set to 1.  The PRIVILEGED_DATA macro can\r\n * // be used to force the variable into the RTOS kernel's privileged data area.\r\n * static PRIVILEGED_DATA StaticTask_t xTaskBuffer;\r\n * static const TaskParameters_t xCheckTaskParameters =\r\n * {\r\n *  vATask,     // pvTaskCode - the function that implements the task.\r\n *  \"ATask\",    // pcName - just a text name for the task to assist debugging.\r\n *  100,        // usStackDepth - the stack size DEFINED IN WORDS.\r\n *  NULL,       // pvParameters - passed into the task function as the function parameters.\r\n *  ( 1UL | portPRIVILEGE_BIT ),// uxPriority - task priority, set the portPRIVILEGE_BIT if the task should run in a privileged state.\r\n *  cStackBuffer,// puxStackBuffer - the buffer to be used as the task stack.\r\n *\r\n *  // xRegions - Allocate up to three separate memory regions for access by\r\n *  // the task, with appropriate access permissions.  Different processors have\r\n *  // different memory alignment requirements - refer to the FreeRTOS documentation\r\n *  // for full information.\r\n *  {\r\n *      // Base address                 Length  Parameters\r\n *      { cReadWriteArray,              32,     portMPU_REGION_READ_WRITE },\r\n *      { cReadOnlyArray,               32,     portMPU_REGION_READ_ONLY },\r\n *      { cPrivilegedOnlyAccessArray,   128,    portMPU_REGION_PRIVILEGED_READ_WRITE }\r\n *  }\r\n *\r\n *  &xTaskBuffer; // Holds the task's data structure.\r\n * };\r\n *\r\n * int main( void )\r\n * {\r\n * TaskHandle_t xHandle;\r\n *\r\n *  // Create a task from the const structure defined above.  The task handle\r\n *  // is requested (the second parameter is not NULL) but in this case just for\r\n *  // demonstration purposes as its not actually used.\r\n *  xTaskCreateRestrictedStatic( &xRegTest1Parameters, &xHandle );\r\n *\r\n *  // Start the scheduler.\r\n *  vTaskStartScheduler();\r\n *\r\n *  // Will only get here if there was insufficient memory to create the idle\r\n *  // and/or timer task.\r\n *  for( ;; );\r\n * }\r\n * @endcode\r\n * \\defgroup xTaskCreateRestrictedStatic xTaskCreateRestrictedStatic\r\n * \\ingroup Tasks\r\n */\r\n#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )\r\n    BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition,\r\n                                            TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) )\r\n    BaseType_t xTaskCreateRestrictedStaticAffinitySet( const TaskParameters_t * const pxTaskDefinition,\r\n                                                       UBaseType_t uxCoreAffinityMask,\r\n                                                       TaskHandle_t * pxCreatedTask ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * void vTaskAllocateMPURegions( TaskHandle_t xTask, const MemoryRegion_t * const pxRegions );\r\n * @endcode\r\n *\r\n * Memory regions are assigned to a restricted task when the task is created by\r\n * a call to xTaskCreateRestricted().  These regions can be redefined using\r\n * vTaskAllocateMPURegions().\r\n *\r\n * @param xTaskToModify The handle of the task being updated.\r\n *\r\n * @param[in] pxRegions A pointer to a MemoryRegion_t structure that contains the\r\n * new memory region definitions.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * // Define an array of MemoryRegion_t structures that configures an MPU region\r\n * // allowing read/write access for 1024 bytes starting at the beginning of the\r\n * // ucOneKByte array.  The other two of the maximum 3 definable regions are\r\n * // unused so set to zero.\r\n * static const MemoryRegion_t xAltRegions[ portNUM_CONFIGURABLE_REGIONS ] =\r\n * {\r\n *  // Base address     Length      Parameters\r\n *  { ucOneKByte,       1024,       portMPU_REGION_READ_WRITE },\r\n *  { 0,                0,          0 },\r\n *  { 0,                0,          0 }\r\n * };\r\n *\r\n * void vATask( void *pvParameters )\r\n * {\r\n *  // This task was created such that it has access to certain regions of\r\n *  // memory as defined by the MPU configuration.  At some point it is\r\n *  // desired that these MPU regions are replaced with that defined in the\r\n *  // xAltRegions const struct above.  Use a call to vTaskAllocateMPURegions()\r\n *  // for this purpose.  NULL is used as the task handle to indicate that this\r\n *  // function should modify the MPU regions of the calling task.\r\n *  vTaskAllocateMPURegions( NULL, xAltRegions );\r\n *\r\n *  // Now the task can continue its function, but from this point on can only\r\n *  // access its stack and the ucOneKByte array (unless any other statically\r\n *  // defined or shared regions have been declared elsewhere).\r\n * }\r\n * @endcode\r\n * \\defgroup vTaskAllocateMPURegions vTaskAllocateMPURegions\r\n * \\ingroup Tasks\r\n */\r\n#if ( portUSING_MPU_WRAPPERS == 1 )\r\n    void vTaskAllocateMPURegions( TaskHandle_t xTaskToModify,\r\n                                  const MemoryRegion_t * const pxRegions ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * void vTaskDelete( TaskHandle_t xTaskToDelete );\r\n * @endcode\r\n *\r\n * INCLUDE_vTaskDelete must be defined as 1 for this function to be available.\r\n * See the configuration section for more information.\r\n *\r\n * Remove a task from the RTOS real time kernel's management.  The task being\r\n * deleted will be removed from all ready, blocked, suspended and event lists.\r\n *\r\n * NOTE:  The idle task is responsible for freeing the kernel allocated\r\n * memory from tasks that have been deleted.  It is therefore important that\r\n * the idle task is not starved of microcontroller processing time if your\r\n * application makes any calls to vTaskDelete ().  Memory allocated by the\r\n * task code is not automatically freed, and should be freed before the task\r\n * is deleted.\r\n *\r\n * See the demo application file death.c for sample code that utilises\r\n * vTaskDelete ().\r\n *\r\n * @param xTaskToDelete The handle of the task to be deleted.  Passing NULL will\r\n * cause the calling task to be deleted.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * void vOtherFunction( void )\r\n * {\r\n * TaskHandle_t xHandle;\r\n *\r\n *   // Create the task, storing the handle.\r\n *   xTaskCreate( vTaskCode, \"NAME\", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );\r\n *\r\n *   // Use the handle to delete the task.\r\n *   vTaskDelete( xHandle );\r\n * }\r\n * @endcode\r\n * \\defgroup vTaskDelete vTaskDelete\r\n * \\ingroup Tasks\r\n */\r\nvoid vTaskDelete( TaskHandle_t xTaskToDelete ) PRIVILEGED_FUNCTION;\r\n\r\n/*-----------------------------------------------------------\r\n* TASK CONTROL API\r\n*----------------------------------------------------------*/\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * void vTaskDelay( const TickType_t xTicksToDelay );\r\n * @endcode\r\n *\r\n * Delay a task for a given number of ticks.  The actual time that the\r\n * task remains blocked depends on the tick rate.  The constant\r\n * portTICK_PERIOD_MS can be used to calculate real time from the tick\r\n * rate - with the resolution of one tick period.\r\n *\r\n * INCLUDE_vTaskDelay must be defined as 1 for this function to be available.\r\n * See the configuration section for more information.\r\n *\r\n *\r\n * vTaskDelay() specifies a time at which the task wishes to unblock relative to\r\n * the time at which vTaskDelay() is called.  For example, specifying a block\r\n * period of 100 ticks will cause the task to unblock 100 ticks after\r\n * vTaskDelay() is called.  vTaskDelay() does not therefore provide a good method\r\n * of controlling the frequency of a periodic task as the path taken through the\r\n * code, as well as other task and interrupt activity, will affect the frequency\r\n * at which vTaskDelay() gets called and therefore the time at which the task\r\n * next executes.  See xTaskDelayUntil() for an alternative API function designed\r\n * to facilitate fixed frequency execution.  It does this by specifying an\r\n * absolute time (rather than a relative time) at which the calling task should\r\n * unblock.\r\n *\r\n * @param xTicksToDelay The amount of time, in tick periods, that\r\n * the calling task should block.\r\n *\r\n * Example usage:\r\n *\r\n * void vTaskFunction( void * pvParameters )\r\n * {\r\n * // Block for 500ms.\r\n * const TickType_t xDelay = 500 / portTICK_PERIOD_MS;\r\n *\r\n *   for( ;; )\r\n *   {\r\n *       // Simply toggle the LED every 500ms, blocking between each toggle.\r\n *       vToggleLED();\r\n *       vTaskDelay( xDelay );\r\n *   }\r\n * }\r\n *\r\n * \\defgroup vTaskDelay vTaskDelay\r\n * \\ingroup TaskCtrl\r\n */\r\nvoid vTaskDelay( const TickType_t xTicksToDelay ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * BaseType_t xTaskDelayUntil( TickType_t *pxPreviousWakeTime, const TickType_t xTimeIncrement );\r\n * @endcode\r\n *\r\n * INCLUDE_xTaskDelayUntil must be defined as 1 for this function to be available.\r\n * See the configuration section for more information.\r\n *\r\n * Delay a task until a specified time.  This function can be used by periodic\r\n * tasks to ensure a constant execution frequency.\r\n *\r\n * This function differs from vTaskDelay () in one important aspect:  vTaskDelay () will\r\n * cause a task to block for the specified number of ticks from the time vTaskDelay () is\r\n * called.  It is therefore difficult to use vTaskDelay () by itself to generate a fixed\r\n * execution frequency as the time between a task starting to execute and that task\r\n * calling vTaskDelay () may not be fixed [the task may take a different path though the\r\n * code between calls, or may get interrupted or preempted a different number of times\r\n * each time it executes].\r\n *\r\n * Whereas vTaskDelay () specifies a wake time relative to the time at which the function\r\n * is called, xTaskDelayUntil () specifies the absolute (exact) time at which it wishes to\r\n * unblock.\r\n *\r\n * The macro pdMS_TO_TICKS() can be used to calculate the number of ticks from a\r\n * time specified in milliseconds with a resolution of one tick period.\r\n *\r\n * @param pxPreviousWakeTime Pointer to a variable that holds the time at which the\r\n * task was last unblocked.  The variable must be initialised with the current time\r\n * prior to its first use (see the example below).  Following this the variable is\r\n * automatically updated within xTaskDelayUntil ().\r\n *\r\n * @param xTimeIncrement The cycle time period.  The task will be unblocked at\r\n * time *pxPreviousWakeTime + xTimeIncrement.  Calling xTaskDelayUntil with the\r\n * same xTimeIncrement parameter value will cause the task to execute with\r\n * a fixed interface period.\r\n *\r\n * @return Value which can be used to check whether the task was actually delayed.\r\n * Will be pdTRUE if the task way delayed and pdFALSE otherwise.  A task will not\r\n * be delayed if the next expected wake time is in the past.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * // Perform an action every 10 ticks.\r\n * void vTaskFunction( void * pvParameters )\r\n * {\r\n * TickType_t xLastWakeTime;\r\n * const TickType_t xFrequency = 10;\r\n * BaseType_t xWasDelayed;\r\n *\r\n *     // Initialise the xLastWakeTime variable with the current time.\r\n *     xLastWakeTime = xTaskGetTickCount ();\r\n *     for( ;; )\r\n *     {\r\n *         // Wait for the next cycle.\r\n *         xWasDelayed = xTaskDelayUntil( &xLastWakeTime, xFrequency );\r\n *\r\n *         // Perform action here. xWasDelayed value can be used to determine\r\n *         // whether a deadline was missed if the code here took too long.\r\n *     }\r\n * }\r\n * @endcode\r\n * \\defgroup xTaskDelayUntil xTaskDelayUntil\r\n * \\ingroup TaskCtrl\r\n */\r\nBaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime,\r\n                            const TickType_t xTimeIncrement ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * vTaskDelayUntil() is the older version of xTaskDelayUntil() and does not\r\n * return a value.\r\n */\r\n#define vTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement )                   \\\r\n    do {                                                                        \\\r\n        ( void ) xTaskDelayUntil( ( pxPreviousWakeTime ), ( xTimeIncrement ) ); \\\r\n    } while( 0 )\r\n\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * BaseType_t xTaskAbortDelay( TaskHandle_t xTask );\r\n * @endcode\r\n *\r\n * INCLUDE_xTaskAbortDelay must be defined as 1 in FreeRTOSConfig.h for this\r\n * function to be available.\r\n *\r\n * A task will enter the Blocked state when it is waiting for an event.  The\r\n * event it is waiting for can be a temporal event (waiting for a time), such\r\n * as when vTaskDelay() is called, or an event on an object, such as when\r\n * xQueueReceive() or ulTaskNotifyTake() is called.  If the handle of a task\r\n * that is in the Blocked state is used in a call to xTaskAbortDelay() then the\r\n * task will leave the Blocked state, and return from whichever function call\r\n * placed the task into the Blocked state.\r\n *\r\n * There is no 'FromISR' version of this function as an interrupt would need to\r\n * know which object a task was blocked on in order to know which actions to\r\n * take.  For example, if the task was blocked on a queue the interrupt handler\r\n * would then need to know if the queue was locked.\r\n *\r\n * @param xTask The handle of the task to remove from the Blocked state.\r\n *\r\n * @return If the task referenced by xTask was not in the Blocked state then\r\n * pdFAIL is returned.  Otherwise pdPASS is returned.\r\n *\r\n * \\defgroup xTaskAbortDelay xTaskAbortDelay\r\n * \\ingroup TaskCtrl\r\n */\r\n#if ( INCLUDE_xTaskAbortDelay == 1 )\r\n    BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask );\r\n * @endcode\r\n *\r\n * INCLUDE_uxTaskPriorityGet must be defined as 1 for this function to be available.\r\n * See the configuration section for more information.\r\n *\r\n * Obtain the priority of any task.\r\n *\r\n * @param xTask Handle of the task to be queried.  Passing a NULL\r\n * handle results in the priority of the calling task being returned.\r\n *\r\n * @return The priority of xTask.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * void vAFunction( void )\r\n * {\r\n * TaskHandle_t xHandle;\r\n *\r\n *   // Create a task, storing the handle.\r\n *   xTaskCreate( vTaskCode, \"NAME\", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );\r\n *\r\n *   // ...\r\n *\r\n *   // Use the handle to obtain the priority of the created task.\r\n *   // It was created with tskIDLE_PRIORITY, but may have changed\r\n *   // it itself.\r\n *   if( uxTaskPriorityGet( xHandle ) != tskIDLE_PRIORITY )\r\n *   {\r\n *       // The task has changed it's priority.\r\n *   }\r\n *\r\n *   // ...\r\n *\r\n *   // Is our priority higher than the created task?\r\n *   if( uxTaskPriorityGet( xHandle ) < uxTaskPriorityGet( NULL ) )\r\n *   {\r\n *       // Our priority (obtained using NULL handle) is higher.\r\n *   }\r\n * }\r\n * @endcode\r\n * \\defgroup uxTaskPriorityGet uxTaskPriorityGet\r\n * \\ingroup TaskCtrl\r\n */\r\nUBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask );\r\n * @endcode\r\n *\r\n * A version of uxTaskPriorityGet() that can be used from an ISR.\r\n */\r\nUBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * UBaseType_t uxTaskBasePriorityGet( const TaskHandle_t xTask );\r\n * @endcode\r\n *\r\n * INCLUDE_uxTaskPriorityGet and configUSE_MUTEXES must be defined as 1 for this\r\n * function to be available. See the configuration section for more information.\r\n *\r\n * Obtain the base priority of any task.\r\n *\r\n * @param xTask Handle of the task to be queried.  Passing a NULL\r\n * handle results in the base priority of the calling task being returned.\r\n *\r\n * @return The base priority of xTask.\r\n *\r\n * \\defgroup uxTaskPriorityGet uxTaskBasePriorityGet\r\n * \\ingroup TaskCtrl\r\n */\r\nUBaseType_t uxTaskBasePriorityGet( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * UBaseType_t uxTaskBasePriorityGetFromISR( const TaskHandle_t xTask );\r\n * @endcode\r\n *\r\n * A version of uxTaskBasePriorityGet() that can be used from an ISR.\r\n */\r\nUBaseType_t uxTaskBasePriorityGetFromISR( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * eTaskState eTaskGetState( TaskHandle_t xTask );\r\n * @endcode\r\n *\r\n * INCLUDE_eTaskGetState must be defined as 1 for this function to be available.\r\n * See the configuration section for more information.\r\n *\r\n * Obtain the state of any task.  States are encoded by the eTaskState\r\n * enumerated type.\r\n *\r\n * @param xTask Handle of the task to be queried.\r\n *\r\n * @return The state of xTask at the time the function was called.  Note the\r\n * state of the task might change between the function being called, and the\r\n * functions return value being tested by the calling task.\r\n */\r\n#if ( ( INCLUDE_eTaskGetState == 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_xTaskAbortDelay == 1 ) )\r\n    eTaskState eTaskGetState( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * void vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState );\r\n * @endcode\r\n *\r\n * configUSE_TRACE_FACILITY must be defined as 1 for this function to be\r\n * available.  See the configuration section for more information.\r\n *\r\n * Populates a TaskStatus_t structure with information about a task.\r\n *\r\n * @param xTask Handle of the task being queried.  If xTask is NULL then\r\n * information will be returned about the calling task.\r\n *\r\n * @param pxTaskStatus A pointer to the TaskStatus_t structure that will be\r\n * filled with information about the task referenced by the handle passed using\r\n * the xTask parameter.\r\n *\r\n * @param xGetFreeStackSpace The TaskStatus_t structure contains a member to report\r\n * the stack high water mark of the task being queried.  Calculating the stack\r\n * high water mark takes a relatively long time, and can make the system\r\n * temporarily unresponsive - so the xGetFreeStackSpace parameter is provided to\r\n * allow the high water mark checking to be skipped.  The high watermark value\r\n * will only be written to the TaskStatus_t structure if xGetFreeStackSpace is\r\n * not set to pdFALSE;\r\n *\r\n * @param eState The TaskStatus_t structure contains a member to report the\r\n * state of the task being queried.  Obtaining the task state is not as fast as\r\n * a simple assignment - so the eState parameter is provided to allow the state\r\n * information to be omitted from the TaskStatus_t structure.  To obtain state\r\n * information then set eState to eInvalid - otherwise the value passed in\r\n * eState will be reported as the task state in the TaskStatus_t structure.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * void vAFunction( void )\r\n * {\r\n * TaskHandle_t xHandle;\r\n * TaskStatus_t xTaskDetails;\r\n *\r\n *  // Obtain the handle of a task from its name.\r\n *  xHandle = xTaskGetHandle( \"Task_Name\" );\r\n *\r\n *  // Check the handle is not NULL.\r\n *  configASSERT( xHandle );\r\n *\r\n *  // Use the handle to obtain further information about the task.\r\n *  vTaskGetInfo( xHandle,\r\n *                &xTaskDetails,\r\n *                pdTRUE, // Include the high water mark in xTaskDetails.\r\n *                eInvalid ); // Include the task state in xTaskDetails.\r\n * }\r\n * @endcode\r\n * \\defgroup vTaskGetInfo vTaskGetInfo\r\n * \\ingroup TaskCtrl\r\n */\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n    void vTaskGetInfo( TaskHandle_t xTask,\r\n                       TaskStatus_t * pxTaskStatus,\r\n                       BaseType_t xGetFreeStackSpace,\r\n                       eTaskState eState ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority );\r\n * @endcode\r\n *\r\n * INCLUDE_vTaskPrioritySet must be defined as 1 for this function to be available.\r\n * See the configuration section for more information.\r\n *\r\n * Set the priority of any task.\r\n *\r\n * A context switch will occur before the function returns if the priority\r\n * being set is higher than the currently executing task.\r\n *\r\n * @param xTask Handle to the task for which the priority is being set.\r\n * Passing a NULL handle results in the priority of the calling task being set.\r\n *\r\n * @param uxNewPriority The priority to which the task will be set.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * void vAFunction( void )\r\n * {\r\n * TaskHandle_t xHandle;\r\n *\r\n *   // Create a task, storing the handle.\r\n *   xTaskCreate( vTaskCode, \"NAME\", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );\r\n *\r\n *   // ...\r\n *\r\n *   // Use the handle to raise the priority of the created task.\r\n *   vTaskPrioritySet( xHandle, tskIDLE_PRIORITY + 1 );\r\n *\r\n *   // ...\r\n *\r\n *   // Use a NULL handle to raise our priority to the same value.\r\n *   vTaskPrioritySet( NULL, tskIDLE_PRIORITY + 1 );\r\n * }\r\n * @endcode\r\n * \\defgroup vTaskPrioritySet vTaskPrioritySet\r\n * \\ingroup TaskCtrl\r\n */\r\nvoid vTaskPrioritySet( TaskHandle_t xTask,\r\n                       UBaseType_t uxNewPriority ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * void vTaskSuspend( TaskHandle_t xTaskToSuspend );\r\n * @endcode\r\n *\r\n * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available.\r\n * See the configuration section for more information.\r\n *\r\n * Suspend any task.  When suspended a task will never get any microcontroller\r\n * processing time, no matter what its priority.\r\n *\r\n * Calls to vTaskSuspend are not accumulative -\r\n * i.e. calling vTaskSuspend () twice on the same task still only requires one\r\n * call to vTaskResume () to ready the suspended task.\r\n *\r\n * @param xTaskToSuspend Handle to the task being suspended.  Passing a NULL\r\n * handle will cause the calling task to be suspended.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * void vAFunction( void )\r\n * {\r\n * TaskHandle_t xHandle;\r\n *\r\n *   // Create a task, storing the handle.\r\n *   xTaskCreate( vTaskCode, \"NAME\", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );\r\n *\r\n *   // ...\r\n *\r\n *   // Use the handle to suspend the created task.\r\n *   vTaskSuspend( xHandle );\r\n *\r\n *   // ...\r\n *\r\n *   // The created task will not run during this period, unless\r\n *   // another task calls vTaskResume( xHandle ).\r\n *\r\n *   //...\r\n *\r\n *\r\n *   // Suspend ourselves.\r\n *   vTaskSuspend( NULL );\r\n *\r\n *   // We cannot get here unless another task calls vTaskResume\r\n *   // with our handle as the parameter.\r\n * }\r\n * @endcode\r\n * \\defgroup vTaskSuspend vTaskSuspend\r\n * \\ingroup TaskCtrl\r\n */\r\nvoid vTaskSuspend( TaskHandle_t xTaskToSuspend ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * void vTaskResume( TaskHandle_t xTaskToResume );\r\n * @endcode\r\n *\r\n * INCLUDE_vTaskSuspend must be defined as 1 for this function to be available.\r\n * See the configuration section for more information.\r\n *\r\n * Resumes a suspended task.\r\n *\r\n * A task that has been suspended by one or more calls to vTaskSuspend ()\r\n * will be made available for running again by a single call to\r\n * vTaskResume ().\r\n *\r\n * @param xTaskToResume Handle to the task being readied.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * void vAFunction( void )\r\n * {\r\n * TaskHandle_t xHandle;\r\n *\r\n *   // Create a task, storing the handle.\r\n *   xTaskCreate( vTaskCode, \"NAME\", STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );\r\n *\r\n *   // ...\r\n *\r\n *   // Use the handle to suspend the created task.\r\n *   vTaskSuspend( xHandle );\r\n *\r\n *   // ...\r\n *\r\n *   // The created task will not run during this period, unless\r\n *   // another task calls vTaskResume( xHandle ).\r\n *\r\n *   //...\r\n *\r\n *\r\n *   // Resume the suspended task ourselves.\r\n *   vTaskResume( xHandle );\r\n *\r\n *   // The created task will once again get microcontroller processing\r\n *   // time in accordance with its priority within the system.\r\n * }\r\n * @endcode\r\n * \\defgroup vTaskResume vTaskResume\r\n * \\ingroup TaskCtrl\r\n */\r\nvoid vTaskResume( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * void xTaskResumeFromISR( TaskHandle_t xTaskToResume );\r\n * @endcode\r\n *\r\n * INCLUDE_xTaskResumeFromISR must be defined as 1 for this function to be\r\n * available.  See the configuration section for more information.\r\n *\r\n * An implementation of vTaskResume() that can be called from within an ISR.\r\n *\r\n * A task that has been suspended by one or more calls to vTaskSuspend ()\r\n * will be made available for running again by a single call to\r\n * xTaskResumeFromISR ().\r\n *\r\n * xTaskResumeFromISR() should not be used to synchronise a task with an\r\n * interrupt if there is a chance that the interrupt could arrive prior to the\r\n * task being suspended - as this can lead to interrupts being missed. Use of a\r\n * semaphore as a synchronisation mechanism would avoid this eventuality.\r\n *\r\n * @param xTaskToResume Handle to the task being readied.\r\n *\r\n * @return pdTRUE if resuming the task should result in a context switch,\r\n * otherwise pdFALSE. This is used by the ISR to determine if a context switch\r\n * may be required following the ISR.\r\n *\r\n * \\defgroup vTaskResumeFromISR vTaskResumeFromISR\r\n * \\ingroup TaskCtrl\r\n */\r\nBaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume ) PRIVILEGED_FUNCTION;\r\n\r\n#if ( configUSE_CORE_AFFINITY == 1 )\r\n\r\n/**\r\n * @brief Sets the core affinity mask for a task.\r\n *\r\n * It sets the cores on which a task can run. configUSE_CORE_AFFINITY must\r\n * be defined as 1 for this function to be available.\r\n *\r\n * @param xTask The handle of the task to set the core affinity mask for.\r\n * Passing NULL will set the core affinity mask for the calling task.\r\n *\r\n * @param uxCoreAffinityMask A bitwise value that indicates the cores on\r\n * which the task can run. Cores are numbered from 0 to configNUMBER_OF_CORES - 1.\r\n * For example, to ensure that a task can run on core 0 and core 1, set\r\n * uxCoreAffinityMask to 0x03.\r\n *\r\n * Example usage:\r\n *\r\n * // The function that creates task.\r\n * void vAFunction( void )\r\n * {\r\n * TaskHandle_t xHandle;\r\n * UBaseType_t uxCoreAffinityMask;\r\n *\r\n *      // Create a task, storing the handle.\r\n *      xTaskCreate( vTaskCode, \"NAME\", STACK_SIZE, NULL, tskIDLE_PRIORITY, &( xHandle ) );\r\n *\r\n *      // Define the core affinity mask such that this task can only run\r\n *      // on core 0 and core 2.\r\n *      uxCoreAffinityMask = ( ( 1 << 0 ) | ( 1 << 2 ) );\r\n *\r\n *      //Set the core affinity mask for the task.\r\n *      vTaskCoreAffinitySet( xHandle, uxCoreAffinityMask );\r\n * }\r\n */\r\n    void vTaskCoreAffinitySet( const TaskHandle_t xTask,\r\n                               UBaseType_t uxCoreAffinityMask );\r\n#endif\r\n\r\n#if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) )\r\n\r\n/**\r\n * @brief Gets the core affinity mask for a task.\r\n *\r\n * configUSE_CORE_AFFINITY must be defined as 1 for this function to be\r\n * available.\r\n *\r\n * @param xTask The handle of the task to get the core affinity mask for.\r\n * Passing NULL will get the core affinity mask for the calling task.\r\n *\r\n * @return The core affinity mask which is a bitwise value that indicates\r\n * the cores on which a task can run. Cores are numbered from 0 to\r\n * configNUMBER_OF_CORES - 1. For example, if a task can run on core 0 and core 1,\r\n * the core affinity mask is 0x03.\r\n *\r\n * Example usage:\r\n *\r\n * // Task handle of the networking task - it is populated elsewhere.\r\n * TaskHandle_t xNetworkingTaskHandle;\r\n *\r\n * void vAFunction( void )\r\n * {\r\n * TaskHandle_t xHandle;\r\n * UBaseType_t uxNetworkingCoreAffinityMask;\r\n *\r\n *     // Create a task, storing the handle.\r\n *     xTaskCreate( vTaskCode, \"NAME\", STACK_SIZE, NULL, tskIDLE_PRIORITY, &( xHandle ) );\r\n *\r\n *     //Get the core affinity mask for the networking task.\r\n *     uxNetworkingCoreAffinityMask = vTaskCoreAffinityGet( xNetworkingTaskHandle );\r\n *\r\n *     // Here is a hypothetical scenario, just for the example. Assume that we\r\n *     // have 2 cores - Core 0 and core 1. We want to pin the application task to\r\n *     // the core different than the networking task to ensure that the\r\n *     // application task does not interfere with networking.\r\n *     if( ( uxNetworkingCoreAffinityMask & ( 1 << 0 ) ) != 0 )\r\n *     {\r\n *         // The networking task can run on core 0, pin our task to core 1.\r\n *         vTaskCoreAffinitySet( xHandle, ( 1 << 1 ) );\r\n *     }\r\n *     else\r\n *     {\r\n *         // Otherwise, pin our task to core 0.\r\n *         vTaskCoreAffinitySet( xHandle, ( 1 << 0 ) );\r\n *     }\r\n * }\r\n */\r\n    UBaseType_t vTaskCoreAffinityGet( ConstTaskHandle_t xTask );\r\n#endif\r\n\r\n#if ( configUSE_TASK_PREEMPTION_DISABLE == 1 )\r\n\r\n/**\r\n * @brief Disables preemption for a task.\r\n *\r\n * @param xTask The handle of the task to disable preemption. Passing NULL\r\n * disables preemption for the calling task.\r\n *\r\n * Example usage:\r\n *\r\n * void vTaskCode( void *pvParameters )\r\n * {\r\n *     // Silence warnings about unused parameters.\r\n *     ( void ) pvParameters;\r\n *\r\n *     for( ;; )\r\n *     {\r\n *         // ... Perform some function here.\r\n *\r\n *         // Disable preemption for this task.\r\n *         vTaskPreemptionDisable( NULL );\r\n *\r\n *         // The task will not be preempted when it is executing in this portion ...\r\n *\r\n *         // ... until the preemption is enabled again.\r\n *         vTaskPreemptionEnable( NULL );\r\n *\r\n *         // The task can be preempted when it is executing in this portion.\r\n *     }\r\n * }\r\n */\r\n    void vTaskPreemptionDisable( const TaskHandle_t xTask );\r\n#endif\r\n\r\n#if ( configUSE_TASK_PREEMPTION_DISABLE == 1 )\r\n\r\n/**\r\n * @brief Enables preemption for a task.\r\n *\r\n * @param xTask The handle of the task to enable preemption. Passing NULL\r\n * enables preemption for the calling task.\r\n *\r\n * Example usage:\r\n *\r\n * void vTaskCode( void *pvParameters )\r\n * {\r\n *     // Silence warnings about unused parameters.\r\n *     ( void ) pvParameters;\r\n *\r\n *     for( ;; )\r\n *     {\r\n *         // ... Perform some function here.\r\n *\r\n *         // Disable preemption for this task.\r\n *         vTaskPreemptionDisable( NULL );\r\n *\r\n *         // The task will not be preempted when it is executing in this portion ...\r\n *\r\n *         // ... until the preemption is enabled again.\r\n *         vTaskPreemptionEnable( NULL );\r\n *\r\n *         // The task can be preempted when it is executing in this portion.\r\n *     }\r\n * }\r\n */\r\n    void vTaskPreemptionEnable( const TaskHandle_t xTask );\r\n#endif\r\n\r\n/*-----------------------------------------------------------\r\n* SCHEDULER CONTROL\r\n*----------------------------------------------------------*/\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * void vTaskStartScheduler( void );\r\n * @endcode\r\n *\r\n * Starts the real time kernel tick processing.  After calling the kernel\r\n * has control over which tasks are executed and when.\r\n *\r\n * See the demo application file main.c for an example of creating\r\n * tasks and starting the kernel.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * void vAFunction( void )\r\n * {\r\n *   // Create at least one task before starting the kernel.\r\n *   xTaskCreate( vTaskCode, \"NAME\", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );\r\n *\r\n *   // Start the real time kernel with preemption.\r\n *   vTaskStartScheduler ();\r\n *\r\n *   // Will not get here unless a task calls vTaskEndScheduler ()\r\n * }\r\n * @endcode\r\n *\r\n * \\defgroup vTaskStartScheduler vTaskStartScheduler\r\n * \\ingroup SchedulerControl\r\n */\r\nvoid vTaskStartScheduler( void ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * void vTaskEndScheduler( void );\r\n * @endcode\r\n *\r\n * NOTE:  At the time of writing only the x86 real mode port, which runs on a PC\r\n * in place of DOS, implements this function.\r\n *\r\n * Stops the real time kernel tick.  All created tasks will be automatically\r\n * deleted and multitasking (either preemptive or cooperative) will\r\n * stop.  Execution then resumes from the point where vTaskStartScheduler ()\r\n * was called, as if vTaskStartScheduler () had just returned.\r\n *\r\n * See the demo application file main. c in the demo/PC directory for an\r\n * example that uses vTaskEndScheduler ().\r\n *\r\n * vTaskEndScheduler () requires an exit function to be defined within the\r\n * portable layer (see vPortEndScheduler () in port. c for the PC port).  This\r\n * performs hardware specific operations such as stopping the kernel tick.\r\n *\r\n * vTaskEndScheduler () will cause all of the resources allocated by the\r\n * kernel to be freed - but will not free resources allocated by application\r\n * tasks.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * void vTaskCode( void * pvParameters )\r\n * {\r\n *   for( ;; )\r\n *   {\r\n *       // Task code goes here.\r\n *\r\n *       // At some point we want to end the real time kernel processing\r\n *       // so call ...\r\n *       vTaskEndScheduler ();\r\n *   }\r\n * }\r\n *\r\n * void vAFunction( void )\r\n * {\r\n *   // Create at least one task before starting the kernel.\r\n *   xTaskCreate( vTaskCode, \"NAME\", STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );\r\n *\r\n *   // Start the real time kernel with preemption.\r\n *   vTaskStartScheduler ();\r\n *\r\n *   // Will only get here when the vTaskCode () task has called\r\n *   // vTaskEndScheduler ().  When we get here we are back to single task\r\n *   // execution.\r\n * }\r\n * @endcode\r\n *\r\n * \\defgroup vTaskEndScheduler vTaskEndScheduler\r\n * \\ingroup SchedulerControl\r\n */\r\nvoid vTaskEndScheduler( void ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * void vTaskSuspendAll( void );\r\n * @endcode\r\n *\r\n * Suspends the scheduler without disabling interrupts.  Context switches will\r\n * not occur while the scheduler is suspended.\r\n *\r\n * After calling vTaskSuspendAll () the calling task will continue to execute\r\n * without risk of being swapped out until a call to xTaskResumeAll () has been\r\n * made.\r\n *\r\n * API functions that have the potential to cause a context switch (for example,\r\n * xTaskDelayUntil(), xQueueSend(), etc.) must not be called while the scheduler\r\n * is suspended.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * void vTask1( void * pvParameters )\r\n * {\r\n *   for( ;; )\r\n *   {\r\n *       // Task code goes here.\r\n *\r\n *       // ...\r\n *\r\n *       // At some point the task wants to perform a long operation during\r\n *       // which it does not want to get swapped out.  It cannot use\r\n *       // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the\r\n *       // operation may cause interrupts to be missed - including the\r\n *       // ticks.\r\n *\r\n *       // Prevent the real time kernel swapping out the task.\r\n *       vTaskSuspendAll ();\r\n *\r\n *       // Perform the operation here.  There is no need to use critical\r\n *       // sections as we have all the microcontroller processing time.\r\n *       // During this time interrupts will still operate and the kernel\r\n *       // tick count will be maintained.\r\n *\r\n *       // ...\r\n *\r\n *       // The operation is complete.  Restart the kernel.\r\n *       xTaskResumeAll ();\r\n *   }\r\n * }\r\n * @endcode\r\n * \\defgroup vTaskSuspendAll vTaskSuspendAll\r\n * \\ingroup SchedulerControl\r\n */\r\nvoid vTaskSuspendAll( void ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * BaseType_t xTaskResumeAll( void );\r\n * @endcode\r\n *\r\n * Resumes scheduler activity after it was suspended by a call to\r\n * vTaskSuspendAll().\r\n *\r\n * xTaskResumeAll() only resumes the scheduler.  It does not unsuspend tasks\r\n * that were previously suspended by a call to vTaskSuspend().\r\n *\r\n * @return If resuming the scheduler caused a context switch then pdTRUE is\r\n *         returned, otherwise pdFALSE is returned.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n * void vTask1( void * pvParameters )\r\n * {\r\n *   for( ;; )\r\n *   {\r\n *       // Task code goes here.\r\n *\r\n *       // ...\r\n *\r\n *       // At some point the task wants to perform a long operation during\r\n *       // which it does not want to get swapped out.  It cannot use\r\n *       // taskENTER_CRITICAL ()/taskEXIT_CRITICAL () as the length of the\r\n *       // operation may cause interrupts to be missed - including the\r\n *       // ticks.\r\n *\r\n *       // Prevent the real time kernel swapping out the task.\r\n *       vTaskSuspendAll ();\r\n *\r\n *       // Perform the operation here.  There is no need to use critical\r\n *       // sections as we have all the microcontroller processing time.\r\n *       // During this time interrupts will still operate and the real\r\n *       // time kernel tick count will be maintained.\r\n *\r\n *       // ...\r\n *\r\n *       // The operation is complete.  Restart the kernel.  We want to force\r\n *       // a context switch - but there is no point if resuming the scheduler\r\n *       // caused a context switch already.\r\n *       if( !xTaskResumeAll () )\r\n *       {\r\n *            taskYIELD ();\r\n *       }\r\n *   }\r\n * }\r\n * @endcode\r\n * \\defgroup xTaskResumeAll xTaskResumeAll\r\n * \\ingroup SchedulerControl\r\n */\r\nBaseType_t xTaskResumeAll( void ) PRIVILEGED_FUNCTION;\r\n\r\n/*-----------------------------------------------------------\r\n* TASK UTILITIES\r\n*----------------------------------------------------------*/\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * TickType_t xTaskGetTickCount( void );\r\n * @endcode\r\n *\r\n * @return The count of ticks since vTaskStartScheduler was called.\r\n *\r\n * \\defgroup xTaskGetTickCount xTaskGetTickCount\r\n * \\ingroup TaskUtils\r\n */\r\nTickType_t xTaskGetTickCount( void ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * TickType_t xTaskGetTickCountFromISR( void );\r\n * @endcode\r\n *\r\n * @return The count of ticks since vTaskStartScheduler was called.\r\n *\r\n * This is a version of xTaskGetTickCount() that is safe to be called from an\r\n * ISR - provided that TickType_t is the natural word size of the\r\n * microcontroller being used or interrupt nesting is either not supported or\r\n * not being used.\r\n *\r\n * \\defgroup xTaskGetTickCountFromISR xTaskGetTickCountFromISR\r\n * \\ingroup TaskUtils\r\n */\r\nTickType_t xTaskGetTickCountFromISR( void ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * uint16_t uxTaskGetNumberOfTasks( void );\r\n * @endcode\r\n *\r\n * @return The number of tasks that the real time kernel is currently managing.\r\n * This includes all ready, blocked and suspended tasks.  A task that\r\n * has been deleted but not yet freed by the idle task will also be\r\n * included in the count.\r\n *\r\n * \\defgroup uxTaskGetNumberOfTasks uxTaskGetNumberOfTasks\r\n * \\ingroup TaskUtils\r\n */\r\nUBaseType_t uxTaskGetNumberOfTasks( void ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * char *pcTaskGetName( TaskHandle_t xTaskToQuery );\r\n * @endcode\r\n *\r\n * @return The text (human readable) name of the task referenced by the handle\r\n * xTaskToQuery.  A task can query its own name by either passing in its own\r\n * handle, or by setting xTaskToQuery to NULL.\r\n *\r\n * \\defgroup pcTaskGetName pcTaskGetName\r\n * \\ingroup TaskUtils\r\n */\r\nchar * pcTaskGetName( TaskHandle_t xTaskToQuery ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * TaskHandle_t xTaskGetHandle( const char *pcNameToQuery );\r\n * @endcode\r\n *\r\n * NOTE:  This function takes a relatively long time to complete and should be\r\n * used sparingly.\r\n *\r\n * @return The handle of the task that has the human readable name pcNameToQuery.\r\n * NULL is returned if no matching name is found.  INCLUDE_xTaskGetHandle\r\n * must be set to 1 in FreeRTOSConfig.h for pcTaskGetHandle() to be available.\r\n *\r\n * \\defgroup pcTaskGetHandle pcTaskGetHandle\r\n * \\ingroup TaskUtils\r\n */\r\n#if ( INCLUDE_xTaskGetHandle == 1 )\r\n    TaskHandle_t xTaskGetHandle( const char * pcNameToQuery ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * BaseType_t xTaskGetStaticBuffers( TaskHandle_t xTask,\r\n *                                   StackType_t ** ppuxStackBuffer,\r\n *                                   StaticTask_t ** ppxTaskBuffer );\r\n * @endcode\r\n *\r\n * Retrieve pointers to a statically created task's data structure\r\n * buffer and stack buffer. These are the same buffers that are supplied\r\n * at the time of creation.\r\n *\r\n * @param xTask The task for which to retrieve the buffers.\r\n *\r\n * @param ppuxStackBuffer Used to return a pointer to the task's stack buffer.\r\n *\r\n * @param ppxTaskBuffer Used to return a pointer to the task's data structure\r\n * buffer.\r\n *\r\n * @return pdTRUE if buffers were retrieved, pdFALSE otherwise.\r\n *\r\n * \\defgroup xTaskGetStaticBuffers xTaskGetStaticBuffers\r\n * \\ingroup TaskUtils\r\n */\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n    BaseType_t xTaskGetStaticBuffers( TaskHandle_t xTask,\r\n                                      StackType_t ** ppuxStackBuffer,\r\n                                      StaticTask_t ** ppxTaskBuffer ) PRIVILEGED_FUNCTION;\r\n#endif /* configSUPPORT_STATIC_ALLOCATION */\r\n\r\n/**\r\n * task.h\r\n * @code{c}\r\n * UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask );\r\n * @endcode\r\n *\r\n * INCLUDE_uxTaskGetStackHighWaterMark must be set to 1 in FreeRTOSConfig.h for\r\n * this function to be available.\r\n *\r\n * Returns the high water mark of the stack associated with xTask.  That is,\r\n * the minimum free stack space there has been (in words, so on a 32 bit machine\r\n * a value of 1 means 4 bytes) since the task started.  The smaller the returned\r\n * number the closer the task has come to overflowing its stack.\r\n *\r\n * uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the\r\n * same except for their return type.  Using configSTACK_DEPTH_TYPE allows the\r\n * user to determine the return type.  It gets around the problem of the value\r\n * overflowing on 8-bit types without breaking backward compatibility for\r\n * applications that expect an 8-bit return type.\r\n *\r\n * @param xTask Handle of the task associated with the stack to be checked.\r\n * Set xTask to NULL to check the stack of the calling task.\r\n *\r\n * @return The smallest amount of free stack space there has been (in words, so\r\n * actual spaces on the stack rather than bytes) since the task referenced by\r\n * xTask was created.\r\n */\r\n#if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 )\r\n    UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * task.h\r\n * @code{c}\r\n * configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask );\r\n * @endcode\r\n *\r\n * INCLUDE_uxTaskGetStackHighWaterMark2 must be set to 1 in FreeRTOSConfig.h for\r\n * this function to be available.\r\n *\r\n * Returns the high water mark of the stack associated with xTask.  That is,\r\n * the minimum free stack space there has been (in words, so on a 32 bit machine\r\n * a value of 1 means 4 bytes) since the task started.  The smaller the returned\r\n * number the closer the task has come to overflowing its stack.\r\n *\r\n * uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the\r\n * same except for their return type.  Using configSTACK_DEPTH_TYPE allows the\r\n * user to determine the return type.  It gets around the problem of the value\r\n * overflowing on 8-bit types without breaking backward compatibility for\r\n * applications that expect an 8-bit return type.\r\n *\r\n * @param xTask Handle of the task associated with the stack to be checked.\r\n * Set xTask to NULL to check the stack of the calling task.\r\n *\r\n * @return The smallest amount of free stack space there has been (in words, so\r\n * actual spaces on the stack rather than bytes) since the task referenced by\r\n * xTask was created.\r\n */\r\n#if ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 )\r\n    configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/* When using trace macros it is sometimes necessary to include task.h before\r\n * FreeRTOS.h.  When this is done TaskHookFunction_t will not yet have been defined,\r\n * so the following two prototypes will cause a compilation error.  This can be\r\n * fixed by simply guarding against the inclusion of these two prototypes unless\r\n * they are explicitly required by the configUSE_APPLICATION_TASK_TAG configuration\r\n * constant. */\r\n#ifdef configUSE_APPLICATION_TASK_TAG\r\n    #if configUSE_APPLICATION_TASK_TAG == 1\r\n\r\n/**\r\n * task.h\r\n * @code{c}\r\n * void vTaskSetApplicationTaskTag( TaskHandle_t xTask, TaskHookFunction_t pxHookFunction );\r\n * @endcode\r\n *\r\n * Sets pxHookFunction to be the task hook function used by the task xTask.\r\n * Passing xTask as NULL has the effect of setting the calling tasks hook\r\n * function.\r\n */\r\n        void vTaskSetApplicationTaskTag( TaskHandle_t xTask,\r\n                                         TaskHookFunction_t pxHookFunction ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * task.h\r\n * @code{c}\r\n * void xTaskGetApplicationTaskTag( TaskHandle_t xTask );\r\n * @endcode\r\n *\r\n * Returns the pxHookFunction value assigned to the task xTask.  Do not\r\n * call from an interrupt service routine - call\r\n * xTaskGetApplicationTaskTagFromISR() instead.\r\n */\r\n        TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * task.h\r\n * @code{c}\r\n * void xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask );\r\n * @endcode\r\n *\r\n * Returns the pxHookFunction value assigned to the task xTask.  Can\r\n * be called from an interrupt service routine.\r\n */\r\n        TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r\n    #endif /* configUSE_APPLICATION_TASK_TAG ==1 */\r\n#endif /* ifdef configUSE_APPLICATION_TASK_TAG */\r\n\r\n#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 )\r\n\r\n/* Each task contains an array of pointers that is dimensioned by the\r\n * configNUM_THREAD_LOCAL_STORAGE_POINTERS setting in FreeRTOSConfig.h.  The\r\n * kernel does not use the pointers itself, so the application writer can use\r\n * the pointers for any purpose they wish.  The following two functions are\r\n * used to set and query a pointer respectively. */\r\n    void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet,\r\n                                            BaseType_t xIndex,\r\n                                            void * pvValue ) PRIVILEGED_FUNCTION;\r\n    void * pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery,\r\n                                               BaseType_t xIndex ) PRIVILEGED_FUNCTION;\r\n\r\n#endif\r\n\r\n#if ( configCHECK_FOR_STACK_OVERFLOW > 0 )\r\n\r\n/**\r\n * task.h\r\n * @code{c}\r\n * void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName);\r\n * @endcode\r\n *\r\n * The application stack overflow hook is called when a stack overflow is detected for a task.\r\n *\r\n * Details on stack overflow detection can be found here: https://www.FreeRTOS.org/Stacks-and-stack-overflow-checking.html\r\n *\r\n * @param xTask the task that just exceeded its stack boundaries.\r\n * @param pcTaskName A character string containing the name of the offending task.\r\n */\r\n    /* MISRA Ref 8.6.1 [External linkage] */\r\n    /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-86 */\r\n    /* coverity[misra_c_2012_rule_8_6_violation] */\r\n    void vApplicationStackOverflowHook( TaskHandle_t xTask,\r\n                                        char * pcTaskName );\r\n\r\n#endif\r\n\r\n#if ( configUSE_IDLE_HOOK == 1 )\r\n\r\n/**\r\n * task.h\r\n * @code{c}\r\n * void vApplicationIdleHook( void );\r\n * @endcode\r\n *\r\n * The application idle hook is called by the idle task.\r\n * This allows the application designer to add background functionality without\r\n * the overhead of a separate task.\r\n * NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES, CALL A FUNCTION THAT MIGHT BLOCK.\r\n */\r\n    /* MISRA Ref 8.6.1 [External linkage] */\r\n    /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-86 */\r\n    /* coverity[misra_c_2012_rule_8_6_violation] */\r\n    void vApplicationIdleHook( void );\r\n\r\n#endif\r\n\r\n\r\n#if  ( configUSE_TICK_HOOK != 0 )\r\n\r\n/**\r\n *  task.h\r\n * @code{c}\r\n * void vApplicationTickHook( void );\r\n * @endcode\r\n *\r\n * This hook function is called in the system tick handler after any OS work is completed.\r\n */\r\n    /* MISRA Ref 8.6.1 [External linkage] */\r\n    /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-86 */\r\n    /* coverity[misra_c_2012_rule_8_6_violation] */\r\n    void vApplicationTickHook( void );\r\n\r\n#endif\r\n\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n\r\n/**\r\n * task.h\r\n * @code{c}\r\n * void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, StackType_t ** ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize )\r\n * @endcode\r\n *\r\n * This function is used to provide a statically allocated block of memory to FreeRTOS to hold the Idle Task TCB.  This function is required when\r\n * configSUPPORT_STATIC_ALLOCATION is set.  For more information see this URI: https://www.FreeRTOS.org/a00110.html#configSUPPORT_STATIC_ALLOCATION\r\n *\r\n * @param ppxIdleTaskTCBBuffer A handle to a statically allocated TCB buffer\r\n * @param ppxIdleTaskStackBuffer A handle to a statically allocated Stack buffer for the idle task\r\n * @param pulIdleTaskStackSize A pointer to the number of elements that will fit in the allocated stack buffer\r\n */\r\n    void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,\r\n                                        StackType_t ** ppxIdleTaskStackBuffer,\r\n                                        uint32_t * pulIdleTaskStackSize );\r\n\r\n/**\r\n * task.h\r\n * @code{c}\r\n * void vApplicationGetPassiveIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, StackType_t ** ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize, BaseType_t xCoreID )\r\n * @endcode\r\n *\r\n * This function is used to provide a statically allocated block of memory to FreeRTOS to hold the Idle Tasks TCB.  This function is required when\r\n * configSUPPORT_STATIC_ALLOCATION is set.  For more information see this URI: https://www.FreeRTOS.org/a00110.html#configSUPPORT_STATIC_ALLOCATION\r\n *\r\n * In the FreeRTOS SMP, there are a total of configNUMBER_OF_CORES idle tasks:\r\n *  1. 1 Active idle task which does all the housekeeping.\r\n *  2. ( configNUMBER_OF_CORES - 1 ) Passive idle tasks which do nothing.\r\n * These idle tasks are created to ensure that each core has an idle task to run when\r\n * no other task is available to run.\r\n *\r\n * The function vApplicationGetPassiveIdleTaskMemory is called with passive idle\r\n * task index 0, 1 ... ( configNUMBER_OF_CORES - 2 ) to get memory for passive idle\r\n * tasks.\r\n *\r\n * @param ppxIdleTaskTCBBuffer A handle to a statically allocated TCB buffer\r\n * @param ppxIdleTaskStackBuffer A handle to a statically allocated Stack buffer for the idle task\r\n * @param pulIdleTaskStackSize A pointer to the number of elements that will fit in the allocated stack buffer\r\n * @param xPassiveIdleTaskIndex The passive idle task index of the idle task buffer\r\n */\r\n    #if ( configNUMBER_OF_CORES > 1 )\r\n        void vApplicationGetPassiveIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,\r\n                                                   StackType_t ** ppxIdleTaskStackBuffer,\r\n                                                   uint32_t * pulIdleTaskStackSize,\r\n                                                   BaseType_t xPassiveIdleTaskIndex );\r\n    #endif /* #if ( configNUMBER_OF_CORES > 1 ) */\r\n#endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */\r\n\r\n/**\r\n * task.h\r\n * @code{c}\r\n * BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask, void *pvParameter );\r\n * @endcode\r\n *\r\n * Calls the hook function associated with xTask.  Passing xTask as NULL has\r\n * the effect of calling the Running tasks (the calling task) hook function.\r\n *\r\n * pvParameter is passed to the hook function for the task to interpret as it\r\n * wants.  The return value is the value returned by the task hook function\r\n * registered by the user.\r\n */\r\n#if ( configUSE_APPLICATION_TASK_TAG == 1 )\r\n    BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask,\r\n                                             void * pvParameter ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * xTaskGetIdleTaskHandle() is only available if\r\n * INCLUDE_xTaskGetIdleTaskHandle is set to 1 in FreeRTOSConfig.h.\r\n *\r\n * In single-core FreeRTOS, this function simply returns the handle of the idle\r\n * task. It is not valid to call xTaskGetIdleTaskHandle() before the scheduler\r\n * has been started.\r\n *\r\n * In the FreeRTOS SMP, there are a total of configNUMBER_OF_CORES idle tasks:\r\n *  1. 1 Active idle task which does all the housekeeping.\r\n *  2. ( configNUMBER_OF_CORES - 1 ) Passive idle tasks which do nothing.\r\n * These idle tasks are created to ensure that each core has an idle task to run when\r\n * no other task is available to run. Call xTaskGetIdleTaskHandle() or\r\n * xTaskGetIdleTaskHandleForCore() with xCoreID set to 0  to get the Active\r\n * idle task handle. Call xTaskGetIdleTaskHandleForCore() with xCoreID set to\r\n * 1,2 ... ( configNUMBER_OF_CORES - 1 ) to get the Passive idle task handles.\r\n */\r\n#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 )\r\n    #if ( configNUMBER_OF_CORES == 1 )\r\n        TaskHandle_t xTaskGetIdleTaskHandle( void ) PRIVILEGED_FUNCTION;\r\n    #endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n\r\n    TaskHandle_t xTaskGetIdleTaskHandleForCore( BaseType_t xCoreID ) PRIVILEGED_FUNCTION;\r\n#endif /* #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) */\r\n\r\n/**\r\n * configUSE_TRACE_FACILITY must be defined as 1 in FreeRTOSConfig.h for\r\n * uxTaskGetSystemState() to be available.\r\n *\r\n * uxTaskGetSystemState() populates an TaskStatus_t structure for each task in\r\n * the system.  TaskStatus_t structures contain, among other things, members\r\n * for the task handle, task name, task priority, task state, and total amount\r\n * of run time consumed by the task.  See the TaskStatus_t structure\r\n * definition in this file for the full member list.\r\n *\r\n * NOTE:  This function is intended for debugging use only as its use results in\r\n * the scheduler remaining suspended for an extended period.\r\n *\r\n * @param pxTaskStatusArray A pointer to an array of TaskStatus_t structures.\r\n * The array must contain at least one TaskStatus_t structure for each task\r\n * that is under the control of the RTOS.  The number of tasks under the control\r\n * of the RTOS can be determined using the uxTaskGetNumberOfTasks() API function.\r\n *\r\n * @param uxArraySize The size of the array pointed to by the pxTaskStatusArray\r\n * parameter.  The size is specified as the number of indexes in the array, or\r\n * the number of TaskStatus_t structures contained in the array, not by the\r\n * number of bytes in the array.\r\n *\r\n * @param pulTotalRunTime If configGENERATE_RUN_TIME_STATS is set to 1 in\r\n * FreeRTOSConfig.h then *pulTotalRunTime is set by uxTaskGetSystemState() to the\r\n * total run time (as defined by the run time stats clock, see\r\n * https://www.FreeRTOS.org/rtos-run-time-stats.html) since the target booted.\r\n * pulTotalRunTime can be set to NULL to omit the total run time information.\r\n *\r\n * @return The number of TaskStatus_t structures that were populated by\r\n * uxTaskGetSystemState().  This should equal the number returned by the\r\n * uxTaskGetNumberOfTasks() API function, but will be zero if the value passed\r\n * in the uxArraySize parameter was too small.\r\n *\r\n * Example usage:\r\n * @code{c}\r\n *  // This example demonstrates how a human readable table of run time stats\r\n *  // information is generated from raw data provided by uxTaskGetSystemState().\r\n *  // The human readable table is written to pcWriteBuffer\r\n *  void vTaskGetRunTimeStats( char *pcWriteBuffer )\r\n *  {\r\n *  TaskStatus_t *pxTaskStatusArray;\r\n *  volatile UBaseType_t uxArraySize, x;\r\n *  configRUN_TIME_COUNTER_TYPE ulTotalRunTime, ulStatsAsPercentage;\r\n *\r\n *      // Make sure the write buffer does not contain a string.\r\n * pcWriteBuffer = 0x00;\r\n *\r\n *      // Take a snapshot of the number of tasks in case it changes while this\r\n *      // function is executing.\r\n *      uxArraySize = uxTaskGetNumberOfTasks();\r\n *\r\n *      // Allocate a TaskStatus_t structure for each task.  An array could be\r\n *      // allocated statically at compile time.\r\n *      pxTaskStatusArray = pvPortMalloc( uxArraySize * sizeof( TaskStatus_t ) );\r\n *\r\n *      if( pxTaskStatusArray != NULL )\r\n *      {\r\n *          // Generate raw status information about each task.\r\n *          uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalRunTime );\r\n *\r\n *          // For percentage calculations.\r\n *          ulTotalRunTime /= 100UL;\r\n *\r\n *          // Avoid divide by zero errors.\r\n *          if( ulTotalRunTime > 0 )\r\n *          {\r\n *              // For each populated position in the pxTaskStatusArray array,\r\n *              // format the raw data as human readable ASCII data\r\n *              for( x = 0; x < uxArraySize; x++ )\r\n *              {\r\n *                  // What percentage of the total run time has the task used?\r\n *                  // This will always be rounded down to the nearest integer.\r\n *                  // ulTotalRunTimeDiv100 has already been divided by 100.\r\n *                  ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalRunTime;\r\n *\r\n *                  if( ulStatsAsPercentage > 0UL )\r\n *                  {\r\n *                      sprintf( pcWriteBuffer, \"%s\\t\\t%lu\\t\\t%lu%%\\r\\n\", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage );\r\n *                  }\r\n *                  else\r\n *                  {\r\n *                      // If the percentage is zero here then the task has\r\n *                      // consumed less than 1% of the total run time.\r\n *                      sprintf( pcWriteBuffer, \"%s\\t\\t%lu\\t\\t<1%%\\r\\n\", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter );\r\n *                  }\r\n *\r\n *                  pcWriteBuffer += strlen( ( char * ) pcWriteBuffer );\r\n *              }\r\n *          }\r\n *\r\n *          // The array is no longer needed, free the memory it consumes.\r\n *          vPortFree( pxTaskStatusArray );\r\n *      }\r\n *  }\r\n *  @endcode\r\n */\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n    UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray,\r\n                                      const UBaseType_t uxArraySize,\r\n                                      configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * void vTaskListTasks( char *pcWriteBuffer, size_t uxBufferLength );\r\n * @endcode\r\n *\r\n * configUSE_TRACE_FACILITY and configUSE_STATS_FORMATTING_FUNCTIONS must\r\n * both be defined as 1 for this function to be available.  See the\r\n * configuration section of the FreeRTOS.org website for more information.\r\n *\r\n * NOTE 1: This function will disable interrupts for its duration.  It is\r\n * not intended for normal application runtime use but as a debug aid.\r\n *\r\n * Lists all the current tasks, along with their current state and stack\r\n * usage high water mark.\r\n *\r\n * Tasks are reported as blocked ('B'), ready ('R'), deleted ('D') or\r\n * suspended ('S').\r\n *\r\n * PLEASE NOTE:\r\n *\r\n * This function is provided for convenience only, and is used by many of the\r\n * demo applications.  Do not consider it to be part of the scheduler.\r\n *\r\n * vTaskListTasks() calls uxTaskGetSystemState(), then formats part of the\r\n * uxTaskGetSystemState() output into a human readable table that displays task:\r\n * names, states, priority, stack usage and task number.\r\n * Stack usage specified as the number of unused StackType_t words stack can hold\r\n * on top of stack - not the number of bytes.\r\n *\r\n * vTaskListTasks() has a dependency on the snprintf() C library function that might\r\n * bloat the code size, use a lot of stack, and provide different results on\r\n * different platforms.  An alternative, tiny, third party, and limited\r\n * functionality implementation of snprintf() is provided in many of the\r\n * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note\r\n * printf-stdarg.c does not provide a full snprintf() implementation!).\r\n *\r\n * It is recommended that production systems call uxTaskGetSystemState()\r\n * directly to get access to raw stats data, rather than indirectly through a\r\n * call to vTaskListTasks().\r\n *\r\n * @param pcWriteBuffer A buffer into which the above mentioned details\r\n * will be written, in ASCII form.  This buffer is assumed to be large\r\n * enough to contain the generated report.  Approximately 40 bytes per\r\n * task should be sufficient.\r\n *\r\n * @param uxBufferLength Length of the pcWriteBuffer.\r\n *\r\n * \\defgroup vTaskListTasks vTaskListTasks\r\n * \\ingroup TaskUtils\r\n */\r\n#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) )\r\n    void vTaskListTasks( char * pcWriteBuffer,\r\n                         size_t uxBufferLength ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * void vTaskList( char *pcWriteBuffer );\r\n * @endcode\r\n *\r\n * configUSE_TRACE_FACILITY and configUSE_STATS_FORMATTING_FUNCTIONS must\r\n * both be defined as 1 for this function to be available.  See the\r\n * configuration section of the FreeRTOS.org website for more information.\r\n *\r\n * WARN: This function assumes that the pcWriteBuffer is of length\r\n * configSTATS_BUFFER_MAX_LENGTH. This function is there only for\r\n * backward compatibility. New applications are recommended to\r\n * use vTaskListTasks and supply the length of the pcWriteBuffer explicitly.\r\n *\r\n * NOTE 1: This function will disable interrupts for its duration.  It is\r\n * not intended for normal application runtime use but as a debug aid.\r\n *\r\n * Lists all the current tasks, along with their current state and stack\r\n * usage high water mark.\r\n *\r\n * Tasks are reported as blocked ('B'), ready ('R'), deleted ('D') or\r\n * suspended ('S').\r\n *\r\n * PLEASE NOTE:\r\n *\r\n * This function is provided for convenience only, and is used by many of the\r\n * demo applications.  Do not consider it to be part of the scheduler.\r\n *\r\n * vTaskList() calls uxTaskGetSystemState(), then formats part of the\r\n * uxTaskGetSystemState() output into a human readable table that displays task:\r\n * names, states, priority, stack usage and task number.\r\n * Stack usage specified as the number of unused StackType_t words stack can hold\r\n * on top of stack - not the number of bytes.\r\n *\r\n * vTaskList() has a dependency on the snprintf() C library function that might\r\n * bloat the code size, use a lot of stack, and provide different results on\r\n * different platforms.  An alternative, tiny, third party, and limited\r\n * functionality implementation of snprintf() is provided in many of the\r\n * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note\r\n * printf-stdarg.c does not provide a full snprintf() implementation!).\r\n *\r\n * It is recommended that production systems call uxTaskGetSystemState()\r\n * directly to get access to raw stats data, rather than indirectly through a\r\n * call to vTaskList().\r\n *\r\n * @param pcWriteBuffer A buffer into which the above mentioned details\r\n * will be written, in ASCII form.  This buffer is assumed to be large\r\n * enough to contain the generated report.  Approximately 40 bytes per\r\n * task should be sufficient.\r\n *\r\n * \\defgroup vTaskList vTaskList\r\n * \\ingroup TaskUtils\r\n */\r\n#define vTaskList( pcWriteBuffer )    vTaskListTasks( pcWriteBuffer, configSTATS_BUFFER_MAX_LENGTH )\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * void vTaskGetRunTimeStatistics( char *pcWriteBuffer, size_t uxBufferLength );\r\n * @endcode\r\n *\r\n * configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS\r\n * must both be defined as 1 for this function to be available.  The application\r\n * must also then provide definitions for\r\n * portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and portGET_RUN_TIME_COUNTER_VALUE()\r\n * to configure a peripheral timer/counter and return the timers current count\r\n * value respectively.  The counter should be at least 10 times the frequency of\r\n * the tick count.\r\n *\r\n * NOTE 1: This function will disable interrupts for its duration.  It is\r\n * not intended for normal application runtime use but as a debug aid.\r\n *\r\n * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total\r\n * accumulated execution time being stored for each task.  The resolution\r\n * of the accumulated time value depends on the frequency of the timer\r\n * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro.\r\n * Calling vTaskGetRunTimeStatistics() writes the total execution time of each\r\n * task into a buffer, both as an absolute count value and as a percentage\r\n * of the total system execution time.\r\n *\r\n * NOTE 2:\r\n *\r\n * This function is provided for convenience only, and is used by many of the\r\n * demo applications.  Do not consider it to be part of the scheduler.\r\n *\r\n * vTaskGetRunTimeStatistics() calls uxTaskGetSystemState(), then formats part of\r\n * the uxTaskGetSystemState() output into a human readable table that displays the\r\n * amount of time each task has spent in the Running state in both absolute and\r\n * percentage terms.\r\n *\r\n * vTaskGetRunTimeStatistics() has a dependency on the snprintf() C library function\r\n * that might bloat the code size, use a lot of stack, and provide different\r\n * results on different platforms.  An alternative, tiny, third party, and\r\n * limited functionality implementation of snprintf() is provided in many of the\r\n * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note\r\n * printf-stdarg.c does not provide a full snprintf() implementation!).\r\n *\r\n * It is recommended that production systems call uxTaskGetSystemState() directly\r\n * to get access to raw stats data, rather than indirectly through a call to\r\n * vTaskGetRunTimeStatistics().\r\n *\r\n * @param pcWriteBuffer A buffer into which the execution times will be\r\n * written, in ASCII form.  This buffer is assumed to be large enough to\r\n * contain the generated report.  Approximately 40 bytes per task should\r\n * be sufficient.\r\n *\r\n * @param uxBufferLength Length of the pcWriteBuffer.\r\n *\r\n * \\defgroup vTaskGetRunTimeStatistics vTaskGetRunTimeStatistics\r\n * \\ingroup TaskUtils\r\n */\r\n#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configUSE_TRACE_FACILITY == 1 ) )\r\n    void vTaskGetRunTimeStatistics( char * pcWriteBuffer,\r\n                                    size_t uxBufferLength ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * void vTaskGetRunTimeStats( char *pcWriteBuffer );\r\n * @endcode\r\n *\r\n * configGENERATE_RUN_TIME_STATS and configUSE_STATS_FORMATTING_FUNCTIONS\r\n * must both be defined as 1 for this function to be available.  The application\r\n * must also then provide definitions for\r\n * portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and portGET_RUN_TIME_COUNTER_VALUE()\r\n * to configure a peripheral timer/counter and return the timers current count\r\n * value respectively.  The counter should be at least 10 times the frequency of\r\n * the tick count.\r\n *\r\n * WARN: This function assumes that the pcWriteBuffer is of length\r\n * configSTATS_BUFFER_MAX_LENGTH. This function is there only for\r\n * backward compatiblity. New applications are recommended to use\r\n * vTaskGetRunTimeStatistics and supply the length of the pcWriteBuffer\r\n * explicitly.\r\n *\r\n * NOTE 1: This function will disable interrupts for its duration.  It is\r\n * not intended for normal application runtime use but as a debug aid.\r\n *\r\n * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total\r\n * accumulated execution time being stored for each task.  The resolution\r\n * of the accumulated time value depends on the frequency of the timer\r\n * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro.\r\n * Calling vTaskGetRunTimeStats() writes the total execution time of each\r\n * task into a buffer, both as an absolute count value and as a percentage\r\n * of the total system execution time.\r\n *\r\n * NOTE 2:\r\n *\r\n * This function is provided for convenience only, and is used by many of the\r\n * demo applications.  Do not consider it to be part of the scheduler.\r\n *\r\n * vTaskGetRunTimeStats() calls uxTaskGetSystemState(), then formats part of the\r\n * uxTaskGetSystemState() output into a human readable table that displays the\r\n * amount of time each task has spent in the Running state in both absolute and\r\n * percentage terms.\r\n *\r\n * vTaskGetRunTimeStats() has a dependency on the snprintf() C library function\r\n * that might bloat the code size, use a lot of stack, and provide different\r\n * results on different platforms.  An alternative, tiny, third party, and\r\n * limited functionality implementation of snprintf() is provided in many of the\r\n * FreeRTOS/Demo sub-directories in a file called printf-stdarg.c (note\r\n * printf-stdarg.c does not provide a full snprintf() implementation!).\r\n *\r\n * It is recommended that production systems call uxTaskGetSystemState() directly\r\n * to get access to raw stats data, rather than indirectly through a call to\r\n * vTaskGetRunTimeStats().\r\n *\r\n * @param pcWriteBuffer A buffer into which the execution times will be\r\n * written, in ASCII form.  This buffer is assumed to be large enough to\r\n * contain the generated report.  Approximately 40 bytes per task should\r\n * be sufficient.\r\n *\r\n * \\defgroup vTaskGetRunTimeStats vTaskGetRunTimeStats\r\n * \\ingroup TaskUtils\r\n */\r\n#define vTaskGetRunTimeStats( pcWriteBuffer )    vTaskGetRunTimeStatistics( pcWriteBuffer, configSTATS_BUFFER_MAX_LENGTH )\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimeCounter( const TaskHandle_t xTask );\r\n * configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimePercent( const TaskHandle_t xTask );\r\n * @endcode\r\n *\r\n * configGENERATE_RUN_TIME_STATS must be defined as 1 for these functions to be\r\n * available.  The application must also then provide definitions for\r\n * portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and\r\n * portGET_RUN_TIME_COUNTER_VALUE() to configure a peripheral timer/counter and\r\n * return the timers current count value respectively.  The counter should be\r\n * at least 10 times the frequency of the tick count.\r\n *\r\n * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total\r\n * accumulated execution time being stored for each task.  The resolution\r\n * of the accumulated time value depends on the frequency of the timer\r\n * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro.\r\n * While uxTaskGetSystemState() and vTaskGetRunTimeStats() writes the total\r\n * execution time of each task into a buffer, ulTaskGetRunTimeCounter()\r\n * returns the total execution time of just one task and\r\n * ulTaskGetRunTimePercent() returns the percentage of the CPU time used by\r\n * just one task.\r\n *\r\n * @return The total run time of the given task or the percentage of the total\r\n * run time consumed by the given task.  This is the amount of time the task\r\n * has actually been executing.  The unit of time is dependent on the frequency\r\n * configured using the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and\r\n * portGET_RUN_TIME_COUNTER_VALUE() macros.\r\n *\r\n * \\defgroup ulTaskGetRunTimeCounter ulTaskGetRunTimeCounter\r\n * \\ingroup TaskUtils\r\n */\r\n#if ( configGENERATE_RUN_TIME_STATS == 1 )\r\n    configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimeCounter( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r\n    configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimePercent( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimeCounter( void );\r\n * configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimePercent( void );\r\n * @endcode\r\n *\r\n * configGENERATE_RUN_TIME_STATS must be defined as 1 for these functions to be\r\n * available.  The application must also then provide definitions for\r\n * portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and\r\n * portGET_RUN_TIME_COUNTER_VALUE() to configure a peripheral timer/counter and\r\n * return the timers current count value respectively.  The counter should be\r\n * at least 10 times the frequency of the tick count.\r\n *\r\n * Setting configGENERATE_RUN_TIME_STATS to 1 will result in a total\r\n * accumulated execution time being stored for each task.  The resolution\r\n * of the accumulated time value depends on the frequency of the timer\r\n * configured by the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() macro.\r\n * While uxTaskGetSystemState() and vTaskGetRunTimeStats() writes the total\r\n * execution time of each task into a buffer, ulTaskGetIdleRunTimeCounter()\r\n * returns the total execution time of just the idle task and\r\n * ulTaskGetIdleRunTimePercent() returns the percentage of the CPU time used by\r\n * just the idle task.\r\n *\r\n * Note the amount of idle time is only a good measure of the slack time in a\r\n * system if there are no other tasks executing at the idle priority, tickless\r\n * idle is not used, and configIDLE_SHOULD_YIELD is set to 0.\r\n *\r\n * @return The total run time of the idle task or the percentage of the total\r\n * run time consumed by the idle task.  This is the amount of time the\r\n * idle task has actually been executing.  The unit of time is dependent on the\r\n * frequency configured using the portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() and\r\n * portGET_RUN_TIME_COUNTER_VALUE() macros.\r\n *\r\n * \\defgroup ulTaskGetIdleRunTimeCounter ulTaskGetIdleRunTimeCounter\r\n * \\ingroup TaskUtils\r\n */\r\n#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) )\r\n    configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimeCounter( void ) PRIVILEGED_FUNCTION;\r\n    configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimePercent( void ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * BaseType_t xTaskNotifyIndexed( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify, uint32_t ulValue, eNotifyAction eAction );\r\n * BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction );\r\n * @endcode\r\n *\r\n * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details.\r\n *\r\n * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these\r\n * functions to be available.\r\n *\r\n * Sends a direct to task notification to a task, with an optional value and\r\n * action.\r\n *\r\n * Each task has a private array of \"notification values\" (or 'notifications'),\r\n * each of which is a 32-bit unsigned integer (uint32_t).  The constant\r\n * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the\r\n * array, and (for backward compatibility) defaults to 1 if left undefined.\r\n * Prior to FreeRTOS V10.4.0 there was only one notification value per task.\r\n *\r\n * Events can be sent to a task using an intermediary object.  Examples of such\r\n * objects are queues, semaphores, mutexes and event groups.  Task notifications\r\n * are a method of sending an event directly to a task without the need for such\r\n * an intermediary object.\r\n *\r\n * A notification sent to a task can optionally perform an action, such as\r\n * update, overwrite or increment one of the task's notification values.  In\r\n * that way task notifications can be used to send data to a task, or be used as\r\n * light weight and fast binary or counting semaphores.\r\n *\r\n * A task can use xTaskNotifyWaitIndexed() or ulTaskNotifyTakeIndexed() to\r\n * [optionally] block to wait for a notification to be pending.  The task does\r\n * not consume any CPU time while it is in the Blocked state.\r\n *\r\n * A notification sent to a task will remain pending until it is cleared by the\r\n * task calling xTaskNotifyWaitIndexed() or ulTaskNotifyTakeIndexed() (or their\r\n * un-indexed equivalents).  If the task was already in the Blocked state to\r\n * wait for a notification when the notification arrives then the task will\r\n * automatically be removed from the Blocked state (unblocked) and the\r\n * notification cleared.\r\n *\r\n * **NOTE** Each notification within the array operates independently - a task\r\n * can only block on one notification within the array at a time and will not be\r\n * unblocked by a notification sent to any other array index.\r\n *\r\n * Backward compatibility information:\r\n * Prior to FreeRTOS V10.4.0 each task had a single \"notification value\", and\r\n * all task notification API functions operated on that value. Replacing the\r\n * single notification value with an array of notification values necessitated a\r\n * new set of API functions that could address specific notifications within the\r\n * array.  xTaskNotify() is the original API function, and remains backward\r\n * compatible by always operating on the notification value at index 0 in the\r\n * array. Calling xTaskNotify() is equivalent to calling xTaskNotifyIndexed()\r\n * with the uxIndexToNotify parameter set to 0.\r\n *\r\n * @param xTaskToNotify The handle of the task being notified.  The handle to a\r\n * task can be returned from the xTaskCreate() API function used to create the\r\n * task, and the handle of the currently running task can be obtained by calling\r\n * xTaskGetCurrentTaskHandle().\r\n *\r\n * @param uxIndexToNotify The index within the target task's array of\r\n * notification values to which the notification is to be sent.  uxIndexToNotify\r\n * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES.  xTaskNotify() does\r\n * not have this parameter and always sends notifications to index 0.\r\n *\r\n * @param ulValue Data that can be sent with the notification.  How the data is\r\n * used depends on the value of the eAction parameter.\r\n *\r\n * @param eAction Specifies how the notification updates the task's notification\r\n * value, if at all.  Valid values for eAction are as follows:\r\n *\r\n * eSetBits -\r\n * The target notification value is bitwise ORed with ulValue.\r\n * xTaskNotifyIndexed() always returns pdPASS in this case.\r\n *\r\n * eIncrement -\r\n * The target notification value is incremented.  ulValue is not used and\r\n * xTaskNotifyIndexed() always returns pdPASS in this case.\r\n *\r\n * eSetValueWithOverwrite -\r\n * The target notification value is set to the value of ulValue, even if the\r\n * task being notified had not yet processed the previous notification at the\r\n * same array index (the task already had a notification pending at that index).\r\n * xTaskNotifyIndexed() always returns pdPASS in this case.\r\n *\r\n * eSetValueWithoutOverwrite -\r\n * If the task being notified did not already have a notification pending at the\r\n * same array index then the target notification value is set to ulValue and\r\n * xTaskNotifyIndexed() will return pdPASS.  If the task being notified already\r\n * had a notification pending at the same array index then no action is\r\n * performed and pdFAIL is returned.\r\n *\r\n * eNoAction -\r\n * The task receives a notification at the specified array index without the\r\n * notification value at that index being updated.  ulValue is not used and\r\n * xTaskNotifyIndexed() always returns pdPASS in this case.\r\n *\r\n * pulPreviousNotificationValue -\r\n * Can be used to pass out the subject task's notification value before any\r\n * bits are modified by the notify function.\r\n *\r\n * @return Dependent on the value of eAction.  See the description of the\r\n * eAction parameter.\r\n *\r\n * \\defgroup xTaskNotifyIndexed xTaskNotifyIndexed\r\n * \\ingroup TaskNotifications\r\n */\r\nBaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify,\r\n                               UBaseType_t uxIndexToNotify,\r\n                               uint32_t ulValue,\r\n                               eNotifyAction eAction,\r\n                               uint32_t * pulPreviousNotificationValue ) PRIVILEGED_FUNCTION;\r\n#define xTaskNotify( xTaskToNotify, ulValue, eAction ) \\\r\n    xTaskGenericNotify( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ), NULL )\r\n#define xTaskNotifyIndexed( xTaskToNotify, uxIndexToNotify, ulValue, eAction ) \\\r\n    xTaskGenericNotify( ( xTaskToNotify ), ( uxIndexToNotify ), ( ulValue ), ( eAction ), NULL )\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * BaseType_t xTaskNotifyAndQueryIndexed( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotifyValue );\r\n * BaseType_t xTaskNotifyAndQuery( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotifyValue );\r\n * @endcode\r\n *\r\n * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details.\r\n *\r\n * xTaskNotifyAndQueryIndexed() performs the same operation as\r\n * xTaskNotifyIndexed() with the addition that it also returns the subject\r\n * task's prior notification value (the notification value at the time the\r\n * function is called rather than when the function returns) in the additional\r\n * pulPreviousNotifyValue parameter.\r\n *\r\n * xTaskNotifyAndQuery() performs the same operation as xTaskNotify() with the\r\n * addition that it also returns the subject task's prior notification value\r\n * (the notification value as it was at the time the function is called, rather\r\n * than when the function returns) in the additional pulPreviousNotifyValue\r\n * parameter.\r\n *\r\n * \\defgroup xTaskNotifyAndQueryIndexed xTaskNotifyAndQueryIndexed\r\n * \\ingroup TaskNotifications\r\n */\r\n#define xTaskNotifyAndQuery( xTaskToNotify, ulValue, eAction, pulPreviousNotifyValue ) \\\r\n    xTaskGenericNotify( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ), ( pulPreviousNotifyValue ) )\r\n#define xTaskNotifyAndQueryIndexed( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotifyValue ) \\\r\n    xTaskGenericNotify( ( xTaskToNotify ), ( uxIndexToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotifyValue ) )\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * BaseType_t xTaskNotifyIndexedFromISR( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify, uint32_t ulValue, eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken );\r\n * BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken );\r\n * @endcode\r\n *\r\n * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details.\r\n *\r\n * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these\r\n * functions to be available.\r\n *\r\n * A version of xTaskNotifyIndexed() that can be used from an interrupt service\r\n * routine (ISR).\r\n *\r\n * Each task has a private array of \"notification values\" (or 'notifications'),\r\n * each of which is a 32-bit unsigned integer (uint32_t).  The constant\r\n * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the\r\n * array, and (for backward compatibility) defaults to 1 if left undefined.\r\n * Prior to FreeRTOS V10.4.0 there was only one notification value per task.\r\n *\r\n * Events can be sent to a task using an intermediary object.  Examples of such\r\n * objects are queues, semaphores, mutexes and event groups.  Task notifications\r\n * are a method of sending an event directly to a task without the need for such\r\n * an intermediary object.\r\n *\r\n * A notification sent to a task can optionally perform an action, such as\r\n * update, overwrite or increment one of the task's notification values.  In\r\n * that way task notifications can be used to send data to a task, or be used as\r\n * light weight and fast binary or counting semaphores.\r\n *\r\n * A task can use xTaskNotifyWaitIndexed() to [optionally] block to wait for a\r\n * notification to be pending, or ulTaskNotifyTakeIndexed() to [optionally] block\r\n * to wait for a notification value to have a non-zero value.  The task does\r\n * not consume any CPU time while it is in the Blocked state.\r\n *\r\n * A notification sent to a task will remain pending until it is cleared by the\r\n * task calling xTaskNotifyWaitIndexed() or ulTaskNotifyTakeIndexed() (or their\r\n * un-indexed equivalents).  If the task was already in the Blocked state to\r\n * wait for a notification when the notification arrives then the task will\r\n * automatically be removed from the Blocked state (unblocked) and the\r\n * notification cleared.\r\n *\r\n * **NOTE** Each notification within the array operates independently - a task\r\n * can only block on one notification within the array at a time and will not be\r\n * unblocked by a notification sent to any other array index.\r\n *\r\n * Backward compatibility information:\r\n * Prior to FreeRTOS V10.4.0 each task had a single \"notification value\", and\r\n * all task notification API functions operated on that value. Replacing the\r\n * single notification value with an array of notification values necessitated a\r\n * new set of API functions that could address specific notifications within the\r\n * array.  xTaskNotifyFromISR() is the original API function, and remains\r\n * backward compatible by always operating on the notification value at index 0\r\n * within the array. Calling xTaskNotifyFromISR() is equivalent to calling\r\n * xTaskNotifyIndexedFromISR() with the uxIndexToNotify parameter set to 0.\r\n *\r\n * @param uxIndexToNotify The index within the target task's array of\r\n * notification values to which the notification is to be sent.  uxIndexToNotify\r\n * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES.  xTaskNotifyFromISR()\r\n * does not have this parameter and always sends notifications to index 0.\r\n *\r\n * @param xTaskToNotify The handle of the task being notified.  The handle to a\r\n * task can be returned from the xTaskCreate() API function used to create the\r\n * task, and the handle of the currently running task can be obtained by calling\r\n * xTaskGetCurrentTaskHandle().\r\n *\r\n * @param ulValue Data that can be sent with the notification.  How the data is\r\n * used depends on the value of the eAction parameter.\r\n *\r\n * @param eAction Specifies how the notification updates the task's notification\r\n * value, if at all.  Valid values for eAction are as follows:\r\n *\r\n * eSetBits -\r\n * The task's notification value is bitwise ORed with ulValue.  xTaskNotify()\r\n * always returns pdPASS in this case.\r\n *\r\n * eIncrement -\r\n * The task's notification value is incremented.  ulValue is not used and\r\n * xTaskNotify() always returns pdPASS in this case.\r\n *\r\n * eSetValueWithOverwrite -\r\n * The task's notification value is set to the value of ulValue, even if the\r\n * task being notified had not yet processed the previous notification (the\r\n * task already had a notification pending).  xTaskNotify() always returns\r\n * pdPASS in this case.\r\n *\r\n * eSetValueWithoutOverwrite -\r\n * If the task being notified did not already have a notification pending then\r\n * the task's notification value is set to ulValue and xTaskNotify() will\r\n * return pdPASS.  If the task being notified already had a notification\r\n * pending then no action is performed and pdFAIL is returned.\r\n *\r\n * eNoAction -\r\n * The task receives a notification without its notification value being\r\n * updated.  ulValue is not used and xTaskNotify() always returns pdPASS in\r\n * this case.\r\n *\r\n * @param pxHigherPriorityTaskWoken  xTaskNotifyFromISR() will set\r\n * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the\r\n * task to which the notification was sent to leave the Blocked state, and the\r\n * unblocked task has a priority higher than the currently running task.  If\r\n * xTaskNotifyFromISR() sets this value to pdTRUE then a context switch should\r\n * be requested before the interrupt is exited.  How a context switch is\r\n * requested from an ISR is dependent on the port - see the documentation page\r\n * for the port in use.\r\n *\r\n * @return Dependent on the value of eAction.  See the description of the\r\n * eAction parameter.\r\n *\r\n * \\defgroup xTaskNotifyIndexedFromISR xTaskNotifyIndexedFromISR\r\n * \\ingroup TaskNotifications\r\n */\r\nBaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify,\r\n                                      UBaseType_t uxIndexToNotify,\r\n                                      uint32_t ulValue,\r\n                                      eNotifyAction eAction,\r\n                                      uint32_t * pulPreviousNotificationValue,\r\n                                      BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r\n#define xTaskNotifyFromISR( xTaskToNotify, ulValue, eAction, pxHigherPriorityTaskWoken ) \\\r\n    xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ), NULL, ( pxHigherPriorityTaskWoken ) )\r\n#define xTaskNotifyIndexedFromISR( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pxHigherPriorityTaskWoken ) \\\r\n    xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( uxIndexToNotify ), ( ulValue ), ( eAction ), NULL, ( pxHigherPriorityTaskWoken ) )\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * BaseType_t xTaskNotifyAndQueryIndexedFromISR( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken );\r\n * BaseType_t xTaskNotifyAndQueryFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken );\r\n * @endcode\r\n *\r\n * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details.\r\n *\r\n * xTaskNotifyAndQueryIndexedFromISR() performs the same operation as\r\n * xTaskNotifyIndexedFromISR() with the addition that it also returns the\r\n * subject task's prior notification value (the notification value at the time\r\n * the function is called rather than at the time the function returns) in the\r\n * additional pulPreviousNotifyValue parameter.\r\n *\r\n * xTaskNotifyAndQueryFromISR() performs the same operation as\r\n * xTaskNotifyFromISR() with the addition that it also returns the subject\r\n * task's prior notification value (the notification value at the time the\r\n * function is called rather than at the time the function returns) in the\r\n * additional pulPreviousNotifyValue parameter.\r\n *\r\n * \\defgroup xTaskNotifyAndQueryIndexedFromISR xTaskNotifyAndQueryIndexedFromISR\r\n * \\ingroup TaskNotifications\r\n */\r\n#define xTaskNotifyAndQueryIndexedFromISR( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken ) \\\r\n    xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( uxIndexToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotificationValue ), ( pxHigherPriorityTaskWoken ) )\r\n#define xTaskNotifyAndQueryFromISR( xTaskToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken ) \\\r\n    xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ), ( pulPreviousNotificationValue ), ( pxHigherPriorityTaskWoken ) )\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * BaseType_t xTaskNotifyWaitIndexed( UBaseType_t uxIndexToWaitOn, uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait );\r\n *\r\n * BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait );\r\n * @endcode\r\n *\r\n * Waits for a direct to task notification to be pending at a given index within\r\n * an array of direct to task notifications.\r\n *\r\n * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details.\r\n *\r\n * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this\r\n * function to be available.\r\n *\r\n * Each task has a private array of \"notification values\" (or 'notifications'),\r\n * each of which is a 32-bit unsigned integer (uint32_t).  The constant\r\n * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the\r\n * array, and (for backward compatibility) defaults to 1 if left undefined.\r\n * Prior to FreeRTOS V10.4.0 there was only one notification value per task.\r\n *\r\n * Events can be sent to a task using an intermediary object.  Examples of such\r\n * objects are queues, semaphores, mutexes and event groups.  Task notifications\r\n * are a method of sending an event directly to a task without the need for such\r\n * an intermediary object.\r\n *\r\n * A notification sent to a task can optionally perform an action, such as\r\n * update, overwrite or increment one of the task's notification values.  In\r\n * that way task notifications can be used to send data to a task, or be used as\r\n * light weight and fast binary or counting semaphores.\r\n *\r\n * A notification sent to a task will remain pending until it is cleared by the\r\n * task calling xTaskNotifyWaitIndexed() or ulTaskNotifyTakeIndexed() (or their\r\n * un-indexed equivalents).  If the task was already in the Blocked state to\r\n * wait for a notification when the notification arrives then the task will\r\n * automatically be removed from the Blocked state (unblocked) and the\r\n * notification cleared.\r\n *\r\n * A task can use xTaskNotifyWaitIndexed() to [optionally] block to wait for a\r\n * notification to be pending, or ulTaskNotifyTakeIndexed() to [optionally] block\r\n * to wait for a notification value to have a non-zero value.  The task does\r\n * not consume any CPU time while it is in the Blocked state.\r\n *\r\n * **NOTE** Each notification within the array operates independently - a task\r\n * can only block on one notification within the array at a time and will not be\r\n * unblocked by a notification sent to any other array index.\r\n *\r\n * Backward compatibility information:\r\n * Prior to FreeRTOS V10.4.0 each task had a single \"notification value\", and\r\n * all task notification API functions operated on that value. Replacing the\r\n * single notification value with an array of notification values necessitated a\r\n * new set of API functions that could address specific notifications within the\r\n * array.  xTaskNotifyWait() is the original API function, and remains backward\r\n * compatible by always operating on the notification value at index 0 in the\r\n * array. Calling xTaskNotifyWait() is equivalent to calling\r\n * xTaskNotifyWaitIndexed() with the uxIndexToWaitOn parameter set to 0.\r\n *\r\n * @param uxIndexToWaitOn The index within the calling task's array of\r\n * notification values on which the calling task will wait for a notification to\r\n * be received.  uxIndexToWaitOn must be less than\r\n * configTASK_NOTIFICATION_ARRAY_ENTRIES.  xTaskNotifyWait() does\r\n * not have this parameter and always waits for notifications on index 0.\r\n *\r\n * @param ulBitsToClearOnEntry Bits that are set in ulBitsToClearOnEntry value\r\n * will be cleared in the calling task's notification value before the task\r\n * checks to see if any notifications are pending, and optionally blocks if no\r\n * notifications are pending.  Setting ulBitsToClearOnEntry to ULONG_MAX (if\r\n * limits.h is included) or 0xffffffffUL (if limits.h is not included) will have\r\n * the effect of resetting the task's notification value to 0.  Setting\r\n * ulBitsToClearOnEntry to 0 will leave the task's notification value unchanged.\r\n *\r\n * @param ulBitsToClearOnExit If a notification is pending or received before\r\n * the calling task exits the xTaskNotifyWait() function then the task's\r\n * notification value (see the xTaskNotify() API function) is passed out using\r\n * the pulNotificationValue parameter.  Then any bits that are set in\r\n * ulBitsToClearOnExit will be cleared in the task's notification value (note\r\n * *pulNotificationValue is set before any bits are cleared).  Setting\r\n * ulBitsToClearOnExit to ULONG_MAX (if limits.h is included) or 0xffffffffUL\r\n * (if limits.h is not included) will have the effect of resetting the task's\r\n * notification value to 0 before the function exits.  Setting\r\n * ulBitsToClearOnExit to 0 will leave the task's notification value unchanged\r\n * when the function exits (in which case the value passed out in\r\n * pulNotificationValue will match the task's notification value).\r\n *\r\n * @param pulNotificationValue Used to pass the task's notification value out\r\n * of the function.  Note the value passed out will not be effected by the\r\n * clearing of any bits caused by ulBitsToClearOnExit being non-zero.\r\n *\r\n * @param xTicksToWait The maximum amount of time that the task should wait in\r\n * the Blocked state for a notification to be received, should a notification\r\n * not already be pending when xTaskNotifyWait() was called.  The task\r\n * will not consume any processing time while it is in the Blocked state.  This\r\n * is specified in kernel ticks, the macro pdMS_TO_TICKS( value_in_ms ) can be\r\n * used to convert a time specified in milliseconds to a time specified in\r\n * ticks.\r\n *\r\n * @return If a notification was received (including notifications that were\r\n * already pending when xTaskNotifyWait was called) then pdPASS is\r\n * returned.  Otherwise pdFAIL is returned.\r\n *\r\n * \\defgroup xTaskNotifyWaitIndexed xTaskNotifyWaitIndexed\r\n * \\ingroup TaskNotifications\r\n */\r\nBaseType_t xTaskGenericNotifyWait( UBaseType_t uxIndexToWaitOn,\r\n                                   uint32_t ulBitsToClearOnEntry,\r\n                                   uint32_t ulBitsToClearOnExit,\r\n                                   uint32_t * pulNotificationValue,\r\n                                   TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r\n#define xTaskNotifyWait( ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait ) \\\r\n    xTaskGenericNotifyWait( tskDEFAULT_INDEX_TO_NOTIFY, ( ulBitsToClearOnEntry ), ( ulBitsToClearOnExit ), ( pulNotificationValue ), ( xTicksToWait ) )\r\n#define xTaskNotifyWaitIndexed( uxIndexToWaitOn, ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait ) \\\r\n    xTaskGenericNotifyWait( ( uxIndexToWaitOn ), ( ulBitsToClearOnEntry ), ( ulBitsToClearOnExit ), ( pulNotificationValue ), ( xTicksToWait ) )\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * BaseType_t xTaskNotifyGiveIndexed( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify );\r\n * BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );\r\n * @endcode\r\n *\r\n * Sends a direct to task notification to a particular index in the target\r\n * task's notification array in a manner similar to giving a counting semaphore.\r\n *\r\n * See https://www.FreeRTOS.org/RTOS-task-notifications.html for more details.\r\n *\r\n * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these\r\n * macros to be available.\r\n *\r\n * Each task has a private array of \"notification values\" (or 'notifications'),\r\n * each of which is a 32-bit unsigned integer (uint32_t).  The constant\r\n * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the\r\n * array, and (for backward compatibility) defaults to 1 if left undefined.\r\n * Prior to FreeRTOS V10.4.0 there was only one notification value per task.\r\n *\r\n * Events can be sent to a task using an intermediary object.  Examples of such\r\n * objects are queues, semaphores, mutexes and event groups.  Task notifications\r\n * are a method of sending an event directly to a task without the need for such\r\n * an intermediary object.\r\n *\r\n * A notification sent to a task can optionally perform an action, such as\r\n * update, overwrite or increment one of the task's notification values.  In\r\n * that way task notifications can be used to send data to a task, or be used as\r\n * light weight and fast binary or counting semaphores.\r\n *\r\n * xTaskNotifyGiveIndexed() is a helper macro intended for use when task\r\n * notifications are used as light weight and faster binary or counting\r\n * semaphore equivalents.  Actual FreeRTOS semaphores are given using the\r\n * xSemaphoreGive() API function, the equivalent action that instead uses a task\r\n * notification is xTaskNotifyGiveIndexed().\r\n *\r\n * When task notifications are being used as a binary or counting semaphore\r\n * equivalent then the task being notified should wait for the notification\r\n * using the ulTaskNotifyTakeIndexed() API function rather than the\r\n * xTaskNotifyWaitIndexed() API function.\r\n *\r\n * **NOTE** Each notification within the array operates independently - a task\r\n * can only block on one notification within the array at a time and will not be\r\n * unblocked by a notification sent to any other array index.\r\n *\r\n * Backward compatibility information:\r\n * Prior to FreeRTOS V10.4.0 each task had a single \"notification value\", and\r\n * all task notification API functions operated on that value. Replacing the\r\n * single notification value with an array of notification values necessitated a\r\n * new set of API functions that could address specific notifications within the\r\n * array.  xTaskNotifyGive() is the original API function, and remains backward\r\n * compatible by always operating on the notification value at index 0 in the\r\n * array. Calling xTaskNotifyGive() is equivalent to calling\r\n * xTaskNotifyGiveIndexed() with the uxIndexToNotify parameter set to 0.\r\n *\r\n * @param xTaskToNotify The handle of the task being notified.  The handle to a\r\n * task can be returned from the xTaskCreate() API function used to create the\r\n * task, and the handle of the currently running task can be obtained by calling\r\n * xTaskGetCurrentTaskHandle().\r\n *\r\n * @param uxIndexToNotify The index within the target task's array of\r\n * notification values to which the notification is to be sent.  uxIndexToNotify\r\n * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES.  xTaskNotifyGive()\r\n * does not have this parameter and always sends notifications to index 0.\r\n *\r\n * @return xTaskNotifyGive() is a macro that calls xTaskNotify() with the\r\n * eAction parameter set to eIncrement - so pdPASS is always returned.\r\n *\r\n * \\defgroup xTaskNotifyGiveIndexed xTaskNotifyGiveIndexed\r\n * \\ingroup TaskNotifications\r\n */\r\n#define xTaskNotifyGive( xTaskToNotify ) \\\r\n    xTaskGenericNotify( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( 0 ), eIncrement, NULL )\r\n#define xTaskNotifyGiveIndexed( xTaskToNotify, uxIndexToNotify ) \\\r\n    xTaskGenericNotify( ( xTaskToNotify ), ( uxIndexToNotify ), ( 0 ), eIncrement, NULL )\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * void vTaskNotifyGiveIndexedFromISR( TaskHandle_t xTaskHandle, UBaseType_t uxIndexToNotify, BaseType_t *pxHigherPriorityTaskWoken );\r\n * void vTaskNotifyGiveFromISR( TaskHandle_t xTaskHandle, BaseType_t *pxHigherPriorityTaskWoken );\r\n * @endcode\r\n *\r\n * A version of xTaskNotifyGiveIndexed() that can be called from an interrupt\r\n * service routine (ISR).\r\n *\r\n * See https://www.FreeRTOS.org/RTOS-task-notifications.html for more details.\r\n *\r\n * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this macro\r\n * to be available.\r\n *\r\n * Each task has a private array of \"notification values\" (or 'notifications'),\r\n * each of which is a 32-bit unsigned integer (uint32_t).  The constant\r\n * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the\r\n * array, and (for backward compatibility) defaults to 1 if left undefined.\r\n * Prior to FreeRTOS V10.4.0 there was only one notification value per task.\r\n *\r\n * Events can be sent to a task using an intermediary object.  Examples of such\r\n * objects are queues, semaphores, mutexes and event groups.  Task notifications\r\n * are a method of sending an event directly to a task without the need for such\r\n * an intermediary object.\r\n *\r\n * A notification sent to a task can optionally perform an action, such as\r\n * update, overwrite or increment one of the task's notification values.  In\r\n * that way task notifications can be used to send data to a task, or be used as\r\n * light weight and fast binary or counting semaphores.\r\n *\r\n * vTaskNotifyGiveIndexedFromISR() is intended for use when task notifications\r\n * are used as light weight and faster binary or counting semaphore equivalents.\r\n * Actual FreeRTOS semaphores are given from an ISR using the\r\n * xSemaphoreGiveFromISR() API function, the equivalent action that instead uses\r\n * a task notification is vTaskNotifyGiveIndexedFromISR().\r\n *\r\n * When task notifications are being used as a binary or counting semaphore\r\n * equivalent then the task being notified should wait for the notification\r\n * using the ulTaskNotifyTakeIndexed() API function rather than the\r\n * xTaskNotifyWaitIndexed() API function.\r\n *\r\n * **NOTE** Each notification within the array operates independently - a task\r\n * can only block on one notification within the array at a time and will not be\r\n * unblocked by a notification sent to any other array index.\r\n *\r\n * Backward compatibility information:\r\n * Prior to FreeRTOS V10.4.0 each task had a single \"notification value\", and\r\n * all task notification API functions operated on that value. Replacing the\r\n * single notification value with an array of notification values necessitated a\r\n * new set of API functions that could address specific notifications within the\r\n * array.  xTaskNotifyFromISR() is the original API function, and remains\r\n * backward compatible by always operating on the notification value at index 0\r\n * within the array. Calling xTaskNotifyGiveFromISR() is equivalent to calling\r\n * xTaskNotifyGiveIndexedFromISR() with the uxIndexToNotify parameter set to 0.\r\n *\r\n * @param xTaskToNotify The handle of the task being notified.  The handle to a\r\n * task can be returned from the xTaskCreate() API function used to create the\r\n * task, and the handle of the currently running task can be obtained by calling\r\n * xTaskGetCurrentTaskHandle().\r\n *\r\n * @param uxIndexToNotify The index within the target task's array of\r\n * notification values to which the notification is to be sent.  uxIndexToNotify\r\n * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES.\r\n * xTaskNotifyGiveFromISR() does not have this parameter and always sends\r\n * notifications to index 0.\r\n *\r\n * @param pxHigherPriorityTaskWoken  vTaskNotifyGiveFromISR() will set\r\n * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the\r\n * task to which the notification was sent to leave the Blocked state, and the\r\n * unblocked task has a priority higher than the currently running task.  If\r\n * vTaskNotifyGiveFromISR() sets this value to pdTRUE then a context switch\r\n * should be requested before the interrupt is exited.  How a context switch is\r\n * requested from an ISR is dependent on the port - see the documentation page\r\n * for the port in use.\r\n *\r\n * \\defgroup vTaskNotifyGiveIndexedFromISR vTaskNotifyGiveIndexedFromISR\r\n * \\ingroup TaskNotifications\r\n */\r\nvoid vTaskGenericNotifyGiveFromISR( TaskHandle_t xTaskToNotify,\r\n                                    UBaseType_t uxIndexToNotify,\r\n                                    BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r\n#define vTaskNotifyGiveFromISR( xTaskToNotify, pxHigherPriorityTaskWoken ) \\\r\n    vTaskGenericNotifyGiveFromISR( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( pxHigherPriorityTaskWoken ) )\r\n#define vTaskNotifyGiveIndexedFromISR( xTaskToNotify, uxIndexToNotify, pxHigherPriorityTaskWoken ) \\\r\n    vTaskGenericNotifyGiveFromISR( ( xTaskToNotify ), ( uxIndexToNotify ), ( pxHigherPriorityTaskWoken ) )\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * uint32_t ulTaskNotifyTakeIndexed( UBaseType_t uxIndexToWaitOn, BaseType_t xClearCountOnExit, TickType_t xTicksToWait );\r\n *\r\n * uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );\r\n * @endcode\r\n *\r\n * Waits for a direct to task notification on a particular index in the calling\r\n * task's notification array in a manner similar to taking a counting semaphore.\r\n *\r\n * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details.\r\n *\r\n * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this\r\n * function to be available.\r\n *\r\n * Each task has a private array of \"notification values\" (or 'notifications'),\r\n * each of which is a 32-bit unsigned integer (uint32_t).  The constant\r\n * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the\r\n * array, and (for backward compatibility) defaults to 1 if left undefined.\r\n * Prior to FreeRTOS V10.4.0 there was only one notification value per task.\r\n *\r\n * Events can be sent to a task using an intermediary object.  Examples of such\r\n * objects are queues, semaphores, mutexes and event groups.  Task notifications\r\n * are a method of sending an event directly to a task without the need for such\r\n * an intermediary object.\r\n *\r\n * A notification sent to a task can optionally perform an action, such as\r\n * update, overwrite or increment one of the task's notification values.  In\r\n * that way task notifications can be used to send data to a task, or be used as\r\n * light weight and fast binary or counting semaphores.\r\n *\r\n * ulTaskNotifyTakeIndexed() is intended for use when a task notification is\r\n * used as a faster and lighter weight binary or counting semaphore alternative.\r\n * Actual FreeRTOS semaphores are taken using the xSemaphoreTake() API function,\r\n * the equivalent action that instead uses a task notification is\r\n * ulTaskNotifyTakeIndexed().\r\n *\r\n * When a task is using its notification value as a binary or counting semaphore\r\n * other tasks should send notifications to it using the xTaskNotifyGiveIndexed()\r\n * macro, or xTaskNotifyIndex() function with the eAction parameter set to\r\n * eIncrement.\r\n *\r\n * ulTaskNotifyTakeIndexed() can either clear the task's notification value at\r\n * the array index specified by the uxIndexToWaitOn parameter to zero on exit,\r\n * in which case the notification value acts like a binary semaphore, or\r\n * decrement the notification value on exit, in which case the notification\r\n * value acts like a counting semaphore.\r\n *\r\n * A task can use ulTaskNotifyTakeIndexed() to [optionally] block to wait for\r\n * a notification.  The task does not consume any CPU time while it is in the\r\n * Blocked state.\r\n *\r\n * Where as xTaskNotifyWaitIndexed() will return when a notification is pending,\r\n * ulTaskNotifyTakeIndexed() will return when the task's notification value is\r\n * not zero.\r\n *\r\n * **NOTE** Each notification within the array operates independently - a task\r\n * can only block on one notification within the array at a time and will not be\r\n * unblocked by a notification sent to any other array index.\r\n *\r\n * Backward compatibility information:\r\n * Prior to FreeRTOS V10.4.0 each task had a single \"notification value\", and\r\n * all task notification API functions operated on that value. Replacing the\r\n * single notification value with an array of notification values necessitated a\r\n * new set of API functions that could address specific notifications within the\r\n * array.  ulTaskNotifyTake() is the original API function, and remains backward\r\n * compatible by always operating on the notification value at index 0 in the\r\n * array. Calling ulTaskNotifyTake() is equivalent to calling\r\n * ulTaskNotifyTakeIndexed() with the uxIndexToWaitOn parameter set to 0.\r\n *\r\n * @param uxIndexToWaitOn The index within the calling task's array of\r\n * notification values on which the calling task will wait for a notification to\r\n * be non-zero.  uxIndexToWaitOn must be less than\r\n * configTASK_NOTIFICATION_ARRAY_ENTRIES.  xTaskNotifyTake() does\r\n * not have this parameter and always waits for notifications on index 0.\r\n *\r\n * @param xClearCountOnExit if xClearCountOnExit is pdFALSE then the task's\r\n * notification value is decremented when the function exits.  In this way the\r\n * notification value acts like a counting semaphore.  If xClearCountOnExit is\r\n * not pdFALSE then the task's notification value is cleared to zero when the\r\n * function exits.  In this way the notification value acts like a binary\r\n * semaphore.\r\n *\r\n * @param xTicksToWait The maximum amount of time that the task should wait in\r\n * the Blocked state for the task's notification value to be greater than zero,\r\n * should the count not already be greater than zero when\r\n * ulTaskNotifyTake() was called.  The task will not consume any processing\r\n * time while it is in the Blocked state.  This is specified in kernel ticks,\r\n * the macro pdMS_TO_TICKS( value_in_ms ) can be used to convert a time\r\n * specified in milliseconds to a time specified in ticks.\r\n *\r\n * @return The task's notification count before it is either cleared to zero or\r\n * decremented (see the xClearCountOnExit parameter).\r\n *\r\n * \\defgroup ulTaskNotifyTakeIndexed ulTaskNotifyTakeIndexed\r\n * \\ingroup TaskNotifications\r\n */\r\nuint32_t ulTaskGenericNotifyTake( UBaseType_t uxIndexToWaitOn,\r\n                                  BaseType_t xClearCountOnExit,\r\n                                  TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r\n#define ulTaskNotifyTake( xClearCountOnExit, xTicksToWait ) \\\r\n    ulTaskGenericNotifyTake( ( tskDEFAULT_INDEX_TO_NOTIFY ), ( xClearCountOnExit ), ( xTicksToWait ) )\r\n#define ulTaskNotifyTakeIndexed( uxIndexToWaitOn, xClearCountOnExit, xTicksToWait ) \\\r\n    ulTaskGenericNotifyTake( ( uxIndexToWaitOn ), ( xClearCountOnExit ), ( xTicksToWait ) )\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * BaseType_t xTaskNotifyStateClearIndexed( TaskHandle_t xTask, UBaseType_t uxIndexToCLear );\r\n *\r\n * BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask );\r\n * @endcode\r\n *\r\n * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details.\r\n *\r\n * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these\r\n * functions to be available.\r\n *\r\n * Each task has a private array of \"notification values\" (or 'notifications'),\r\n * each of which is a 32-bit unsigned integer (uint32_t).  The constant\r\n * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the\r\n * array, and (for backward compatibility) defaults to 1 if left undefined.\r\n * Prior to FreeRTOS V10.4.0 there was only one notification value per task.\r\n *\r\n * If a notification is sent to an index within the array of notifications then\r\n * the notification at that index is said to be 'pending' until it is read or\r\n * explicitly cleared by the receiving task.  xTaskNotifyStateClearIndexed()\r\n * is the function that clears a pending notification without reading the\r\n * notification value.  The notification value at the same array index is not\r\n * altered.  Set xTask to NULL to clear the notification state of the calling\r\n * task.\r\n *\r\n * Backward compatibility information:\r\n * Prior to FreeRTOS V10.4.0 each task had a single \"notification value\", and\r\n * all task notification API functions operated on that value. Replacing the\r\n * single notification value with an array of notification values necessitated a\r\n * new set of API functions that could address specific notifications within the\r\n * array.  xTaskNotifyStateClear() is the original API function, and remains\r\n * backward compatible by always operating on the notification value at index 0\r\n * within the array. Calling xTaskNotifyStateClear() is equivalent to calling\r\n * xTaskNotifyStateClearIndexed() with the uxIndexToNotify parameter set to 0.\r\n *\r\n * @param xTask The handle of the RTOS task that will have a notification state\r\n * cleared.  Set xTask to NULL to clear a notification state in the calling\r\n * task.  To obtain a task's handle create the task using xTaskCreate() and\r\n * make use of the pxCreatedTask parameter, or create the task using\r\n * xTaskCreateStatic() and store the returned value, or use the task's name in\r\n * a call to xTaskGetHandle().\r\n *\r\n * @param uxIndexToClear The index within the target task's array of\r\n * notification values to act upon.  For example, setting uxIndexToClear to 1\r\n * will clear the state of the notification at index 1 within the array.\r\n * uxIndexToClear must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES.\r\n * ulTaskNotifyStateClear() does not have this parameter and always acts on the\r\n * notification at index 0.\r\n *\r\n * @return pdTRUE if the task's notification state was set to\r\n * eNotWaitingNotification, otherwise pdFALSE.\r\n *\r\n * \\defgroup xTaskNotifyStateClearIndexed xTaskNotifyStateClearIndexed\r\n * \\ingroup TaskNotifications\r\n */\r\nBaseType_t xTaskGenericNotifyStateClear( TaskHandle_t xTask,\r\n                                         UBaseType_t uxIndexToClear ) PRIVILEGED_FUNCTION;\r\n#define xTaskNotifyStateClear( xTask ) \\\r\n    xTaskGenericNotifyStateClear( ( xTask ), ( tskDEFAULT_INDEX_TO_NOTIFY ) )\r\n#define xTaskNotifyStateClearIndexed( xTask, uxIndexToClear ) \\\r\n    xTaskGenericNotifyStateClear( ( xTask ), ( uxIndexToClear ) )\r\n\r\n/**\r\n * task. h\r\n * @code{c}\r\n * uint32_t ulTaskNotifyValueClearIndexed( TaskHandle_t xTask, UBaseType_t uxIndexToClear, uint32_t ulBitsToClear );\r\n *\r\n * uint32_t ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear );\r\n * @endcode\r\n *\r\n * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details.\r\n *\r\n * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these\r\n * functions to be available.\r\n *\r\n * Each task has a private array of \"notification values\" (or 'notifications'),\r\n * each of which is a 32-bit unsigned integer (uint32_t).  The constant\r\n * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the\r\n * array, and (for backward compatibility) defaults to 1 if left undefined.\r\n * Prior to FreeRTOS V10.4.0 there was only one notification value per task.\r\n *\r\n * ulTaskNotifyValueClearIndexed() clears the bits specified by the\r\n * ulBitsToClear bit mask in the notification value at array index uxIndexToClear\r\n * of the task referenced by xTask.\r\n *\r\n * Backward compatibility information:\r\n * Prior to FreeRTOS V10.4.0 each task had a single \"notification value\", and\r\n * all task notification API functions operated on that value. Replacing the\r\n * single notification value with an array of notification values necessitated a\r\n * new set of API functions that could address specific notifications within the\r\n * array.  ulTaskNotifyValueClear() is the original API function, and remains\r\n * backward compatible by always operating on the notification value at index 0\r\n * within the array. Calling ulTaskNotifyValueClear() is equivalent to calling\r\n * ulTaskNotifyValueClearIndexed() with the uxIndexToClear parameter set to 0.\r\n *\r\n * @param xTask The handle of the RTOS task that will have bits in one of its\r\n * notification values cleared. Set xTask to NULL to clear bits in a\r\n * notification value of the calling task.  To obtain a task's handle create the\r\n * task using xTaskCreate() and make use of the pxCreatedTask parameter, or\r\n * create the task using xTaskCreateStatic() and store the returned value, or\r\n * use the task's name in a call to xTaskGetHandle().\r\n *\r\n * @param uxIndexToClear The index within the target task's array of\r\n * notification values in which to clear the bits.  uxIndexToClear\r\n * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES.\r\n * ulTaskNotifyValueClear() does not have this parameter and always clears bits\r\n * in the notification value at index 0.\r\n *\r\n * @param ulBitsToClear Bit mask of the bits to clear in the notification value of\r\n * xTask. Set a bit to 1 to clear the corresponding bits in the task's notification\r\n * value. Set ulBitsToClear to 0xffffffff (UINT_MAX on 32-bit architectures) to clear\r\n * the notification value to 0.  Set ulBitsToClear to 0 to query the task's\r\n * notification value without clearing any bits.\r\n *\r\n *\r\n * @return The value of the target task's notification value before the bits\r\n * specified by ulBitsToClear were cleared.\r\n * \\defgroup ulTaskNotifyValueClear ulTaskNotifyValueClear\r\n * \\ingroup TaskNotifications\r\n */\r\nuint32_t ulTaskGenericNotifyValueClear( TaskHandle_t xTask,\r\n                                        UBaseType_t uxIndexToClear,\r\n                                        uint32_t ulBitsToClear ) PRIVILEGED_FUNCTION;\r\n#define ulTaskNotifyValueClear( xTask, ulBitsToClear ) \\\r\n    ulTaskGenericNotifyValueClear( ( xTask ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulBitsToClear ) )\r\n#define ulTaskNotifyValueClearIndexed( xTask, uxIndexToClear, ulBitsToClear ) \\\r\n    ulTaskGenericNotifyValueClear( ( xTask ), ( uxIndexToClear ), ( ulBitsToClear ) )\r\n\r\n/**\r\n * task.h\r\n * @code{c}\r\n * void vTaskSetTimeOutState( TimeOut_t * const pxTimeOut );\r\n * @endcode\r\n *\r\n * Capture the current time for future use with xTaskCheckForTimeOut().\r\n *\r\n * @param pxTimeOut Pointer to a timeout object into which the current time\r\n * is to be captured.  The captured time includes the tick count and the number\r\n * of times the tick count has overflowed since the system first booted.\r\n * \\defgroup vTaskSetTimeOutState vTaskSetTimeOutState\r\n * \\ingroup TaskCtrl\r\n */\r\nvoid vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * task.h\r\n * @code{c}\r\n * BaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut, TickType_t * const pxTicksToWait );\r\n * @endcode\r\n *\r\n * Determines if pxTicksToWait ticks has passed since a time was captured\r\n * using a call to vTaskSetTimeOutState().  The captured time includes the tick\r\n * count and the number of times the tick count has overflowed.\r\n *\r\n * @param pxTimeOut The time status as captured previously using\r\n * vTaskSetTimeOutState. If the timeout has not yet occurred, it is updated\r\n * to reflect the current time status.\r\n * @param pxTicksToWait The number of ticks to check for timeout i.e. if\r\n * pxTicksToWait ticks have passed since pxTimeOut was last updated (either by\r\n * vTaskSetTimeOutState() or xTaskCheckForTimeOut()), the timeout has occurred.\r\n * If the timeout has not occurred, pxTicksToWait is updated to reflect the\r\n * number of remaining ticks.\r\n *\r\n * @return If timeout has occurred, pdTRUE is returned. Otherwise pdFALSE is\r\n * returned and pxTicksToWait is updated to reflect the number of remaining\r\n * ticks.\r\n *\r\n * @see https://www.FreeRTOS.org/xTaskCheckForTimeOut.html\r\n *\r\n * Example Usage:\r\n * @code{c}\r\n *  // Driver library function used to receive uxWantedBytes from an Rx buffer\r\n *  // that is filled by a UART interrupt. If there are not enough bytes in the\r\n *  // Rx buffer then the task enters the Blocked state until it is notified that\r\n *  // more data has been placed into the buffer. If there is still not enough\r\n *  // data then the task re-enters the Blocked state, and xTaskCheckForTimeOut()\r\n *  // is used to re-calculate the Block time to ensure the total amount of time\r\n *  // spent in the Blocked state does not exceed MAX_TIME_TO_WAIT. This\r\n *  // continues until either the buffer contains at least uxWantedBytes bytes,\r\n *  // or the total amount of time spent in the Blocked state reaches\r\n *  // MAX_TIME_TO_WAIT - at which point the task reads however many bytes are\r\n *  // available up to a maximum of uxWantedBytes.\r\n *\r\n *  size_t xUART_Receive( uint8_t *pucBuffer, size_t uxWantedBytes )\r\n *  {\r\n *  size_t uxReceived = 0;\r\n *  TickType_t xTicksToWait = MAX_TIME_TO_WAIT;\r\n *  TimeOut_t xTimeOut;\r\n *\r\n *      // Initialize xTimeOut.  This records the time at which this function\r\n *      // was entered.\r\n *      vTaskSetTimeOutState( &xTimeOut );\r\n *\r\n *      // Loop until the buffer contains the wanted number of bytes, or a\r\n *      // timeout occurs.\r\n *      while( UART_bytes_in_rx_buffer( pxUARTInstance ) < uxWantedBytes )\r\n *      {\r\n *          // The buffer didn't contain enough data so this task is going to\r\n *          // enter the Blocked state. Adjusting xTicksToWait to account for\r\n *          // any time that has been spent in the Blocked state within this\r\n *          // function so far to ensure the total amount of time spent in the\r\n *          // Blocked state does not exceed MAX_TIME_TO_WAIT.\r\n *          if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) != pdFALSE )\r\n *          {\r\n *              //Timed out before the wanted number of bytes were available,\r\n *              // exit the loop.\r\n *              break;\r\n *          }\r\n *\r\n *          // Wait for a maximum of xTicksToWait ticks to be notified that the\r\n *          // receive interrupt has placed more data into the buffer.\r\n *          ulTaskNotifyTake( pdTRUE, xTicksToWait );\r\n *      }\r\n *\r\n *      // Attempt to read uxWantedBytes from the receive buffer into pucBuffer.\r\n *      // The actual number of bytes read (which might be less than\r\n *      // uxWantedBytes) is returned.\r\n *      uxReceived = UART_read_from_receive_buffer( pxUARTInstance,\r\n *                                                  pucBuffer,\r\n *                                                  uxWantedBytes );\r\n *\r\n *      return uxReceived;\r\n *  }\r\n * @endcode\r\n * \\defgroup xTaskCheckForTimeOut xTaskCheckForTimeOut\r\n * \\ingroup TaskCtrl\r\n */\r\nBaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut,\r\n                                 TickType_t * const pxTicksToWait ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * task.h\r\n * @code{c}\r\n * BaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp );\r\n * @endcode\r\n *\r\n * This function corrects the tick count value after the application code has held\r\n * interrupts disabled for an extended period resulting in tick interrupts having\r\n * been missed.\r\n *\r\n * This function is similar to vTaskStepTick(), however, unlike\r\n * vTaskStepTick(), xTaskCatchUpTicks() may move the tick count forward past a\r\n * time at which a task should be removed from the blocked state.  That means\r\n * tasks may have to be removed from the blocked state as the tick count is\r\n * moved.\r\n *\r\n * @param xTicksToCatchUp The number of tick interrupts that have been missed due to\r\n * interrupts being disabled.  Its value is not computed automatically, so must be\r\n * computed by the application writer.\r\n *\r\n * @return pdTRUE if moving the tick count forward resulted in a task leaving the\r\n * blocked state and a context switch being performed.  Otherwise pdFALSE.\r\n *\r\n * \\defgroup xTaskCatchUpTicks xTaskCatchUpTicks\r\n * \\ingroup TaskCtrl\r\n */\r\nBaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp ) PRIVILEGED_FUNCTION;\r\n\r\n\r\n/*-----------------------------------------------------------\r\n* SCHEDULER INTERNALS AVAILABLE FOR PORTING PURPOSES\r\n*----------------------------------------------------------*/\r\n\r\n#if ( configNUMBER_OF_CORES == 1 )\r\n    #define taskYIELD_WITHIN_API()    portYIELD_WITHIN_API()\r\n#else /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n    #define taskYIELD_WITHIN_API()    vTaskYieldWithinAPI()\r\n#endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n\r\n/*\r\n * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE.  IT IS ONLY\r\n * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS\r\n * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER.\r\n *\r\n * Called from the real time kernel tick (either preemptive or cooperative),\r\n * this increments the tick count and checks if any tasks that are blocked\r\n * for a finite period required removing from a blocked list and placing on\r\n * a ready list.  If a non-zero value is returned then a context switch is\r\n * required because either:\r\n *   + A task was removed from a blocked list because its timeout had expired,\r\n *     or\r\n *   + Time slicing is in use and there is a task of equal priority to the\r\n *     currently running task.\r\n */\r\nBaseType_t xTaskIncrementTick( void ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE.  IT IS AN\r\n * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER.\r\n *\r\n * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED.\r\n *\r\n * Removes the calling task from the ready list and places it both\r\n * on the list of tasks waiting for a particular event, and the\r\n * list of delayed tasks.  The task will be removed from both lists\r\n * and replaced on the ready list should either the event occur (and\r\n * there be no higher priority tasks waiting on the same event) or\r\n * the delay period expires.\r\n *\r\n * The 'unordered' version replaces the event list item value with the\r\n * xItemValue value, and inserts the list item at the end of the list.\r\n *\r\n * The 'ordered' version uses the existing event list item value (which is the\r\n * owning task's priority) to insert the list item into the event list in task\r\n * priority order.\r\n *\r\n * @param pxEventList The list containing tasks that are blocked waiting\r\n * for the event to occur.\r\n *\r\n * @param xItemValue The item value to use for the event list item when the\r\n * event list is not ordered by task priority.\r\n *\r\n * @param xTicksToWait The maximum amount of time that the task should wait\r\n * for the event to occur.  This is specified in kernel ticks, the constant\r\n * portTICK_PERIOD_MS can be used to convert kernel ticks into a real time\r\n * period.\r\n */\r\nvoid vTaskPlaceOnEventList( List_t * const pxEventList,\r\n                            const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r\nvoid vTaskPlaceOnUnorderedEventList( List_t * pxEventList,\r\n                                     const TickType_t xItemValue,\r\n                                     const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE.  IT IS AN\r\n * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER.\r\n *\r\n * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED.\r\n *\r\n * This function performs nearly the same function as vTaskPlaceOnEventList().\r\n * The difference being that this function does not permit tasks to block\r\n * indefinitely, whereas vTaskPlaceOnEventList() does.\r\n *\r\n */\r\nvoid vTaskPlaceOnEventListRestricted( List_t * const pxEventList,\r\n                                      TickType_t xTicksToWait,\r\n                                      const BaseType_t xWaitIndefinitely ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE.  IT IS AN\r\n * INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER.\r\n *\r\n * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED.\r\n *\r\n * Removes a task from both the specified event list and the list of blocked\r\n * tasks, and places it on a ready queue.\r\n *\r\n * xTaskRemoveFromEventList()/vTaskRemoveFromUnorderedEventList() will be called\r\n * if either an event occurs to unblock a task, or the block timeout period\r\n * expires.\r\n *\r\n * xTaskRemoveFromEventList() is used when the event list is in task priority\r\n * order.  It removes the list item from the head of the event list as that will\r\n * have the highest priority owning task of all the tasks on the event list.\r\n * vTaskRemoveFromUnorderedEventList() is used when the event list is not\r\n * ordered and the event list items hold something other than the owning tasks\r\n * priority.  In this case the event list item value is updated to the value\r\n * passed in the xItemValue parameter.\r\n *\r\n * @return pdTRUE if the task being removed has a higher priority than the task\r\n * making the call, otherwise pdFALSE.\r\n */\r\nBaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList ) PRIVILEGED_FUNCTION;\r\nvoid vTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem,\r\n                                        const TickType_t xItemValue ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * THIS FUNCTION MUST NOT BE USED FROM APPLICATION CODE.  IT IS ONLY\r\n * INTENDED FOR USE WHEN IMPLEMENTING A PORT OF THE SCHEDULER AND IS\r\n * AN INTERFACE WHICH IS FOR THE EXCLUSIVE USE OF THE SCHEDULER.\r\n *\r\n * Sets the pointer to the current TCB to the TCB of the highest priority task\r\n * that is ready to run.\r\n */\r\n#if ( configNUMBER_OF_CORES == 1 )\r\n    portDONT_DISCARD void vTaskSwitchContext( void ) PRIVILEGED_FUNCTION;\r\n#else\r\n    portDONT_DISCARD void vTaskSwitchContext( BaseType_t xCoreID ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/*\r\n * THESE FUNCTIONS MUST NOT BE USED FROM APPLICATION CODE.  THEY ARE USED BY\r\n * THE EVENT BITS MODULE.\r\n */\r\nTickType_t uxTaskResetEventItemValue( void ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Return the handle of the calling task.\r\n */\r\nTaskHandle_t xTaskGetCurrentTaskHandle( void ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Return the handle of the task running on specified core.\r\n */\r\n#if ( configNUMBER_OF_CORES > 1 )\r\n    TaskHandle_t xTaskGetCurrentTaskHandleForCore( BaseType_t xCoreID ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/*\r\n * Shortcut used by the queue implementation to prevent unnecessary call to\r\n * taskYIELD();\r\n */\r\nvoid vTaskMissedYield( void ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Returns the scheduler state as taskSCHEDULER_RUNNING,\r\n * taskSCHEDULER_NOT_STARTED or taskSCHEDULER_SUSPENDED.\r\n */\r\nBaseType_t xTaskGetSchedulerState( void ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Raises the priority of the mutex holder to that of the calling task should\r\n * the mutex holder have a priority less than the calling task.\r\n */\r\nBaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Set the priority of a task back to its proper priority in the case that it\r\n * inherited a higher priority while it was holding a semaphore.\r\n */\r\nBaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * If a higher priority task attempting to obtain a mutex caused a lower\r\n * priority task to inherit the higher priority task's priority - but the higher\r\n * priority task then timed out without obtaining the mutex, then the lower\r\n * priority task will disinherit the priority again - but only down as far as\r\n * the highest priority task that is still waiting for the mutex (if there were\r\n * more than one task waiting for the mutex).\r\n */\r\nvoid vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder,\r\n                                          UBaseType_t uxHighestPriorityWaitingTask ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Get the uxTaskNumber assigned to the task referenced by the xTask parameter.\r\n */\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n    UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/*\r\n * Set the uxTaskNumber of the task referenced by the xTask parameter to\r\n * uxHandle.\r\n */\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n    void vTaskSetTaskNumber( TaskHandle_t xTask,\r\n                             const UBaseType_t uxHandle ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/*\r\n * Only available when configUSE_TICKLESS_IDLE is set to 1.\r\n * If tickless mode is being used, or a low power mode is implemented, then\r\n * the tick interrupt will not execute during idle periods.  When this is the\r\n * case, the tick count value maintained by the scheduler needs to be kept up\r\n * to date with the actual execution time by being skipped forward by a time\r\n * equal to the idle period.\r\n */\r\n#if ( configUSE_TICKLESS_IDLE != 0 )\r\n    void vTaskStepTick( TickType_t xTicksToJump ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/*\r\n * Only available when configUSE_TICKLESS_IDLE is set to 1.\r\n * Provided for use within portSUPPRESS_TICKS_AND_SLEEP() to allow the port\r\n * specific sleep function to determine if it is ok to proceed with the sleep,\r\n * and if it is ok to proceed, if it is ok to sleep indefinitely.\r\n *\r\n * This function is necessary because portSUPPRESS_TICKS_AND_SLEEP() is only\r\n * called with the scheduler suspended, not from within a critical section.  It\r\n * is therefore possible for an interrupt to request a context switch between\r\n * portSUPPRESS_TICKS_AND_SLEEP() and the low power mode actually being\r\n * entered.  eTaskConfirmSleepModeStatus() should be called from a short\r\n * critical section between the timer being stopped and the sleep mode being\r\n * entered to ensure it is ok to proceed into the sleep mode.\r\n */\r\n#if ( configUSE_TICKLESS_IDLE != 0 )\r\n    eSleepModeStatus eTaskConfirmSleepModeStatus( void ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/*\r\n * For internal use only.  Increment the mutex held count when a mutex is\r\n * taken and return the handle of the task that has taken the mutex.\r\n */\r\nTaskHandle_t pvTaskIncrementMutexHeldCount( void ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * For internal use only.  Same as vTaskSetTimeOutState(), but without a critical\r\n * section.\r\n */\r\nvoid vTaskInternalSetTimeOutState( TimeOut_t * const pxTimeOut ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * For internal use only. Same as portYIELD_WITHIN_API() in single core FreeRTOS.\r\n * For SMP this is not defined by the port.\r\n */\r\n#if ( configNUMBER_OF_CORES > 1 )\r\n    void vTaskYieldWithinAPI( void );\r\n#endif\r\n\r\n/*\r\n * This function is only intended for use when implementing a port of the scheduler\r\n * and is only available when portCRITICAL_NESTING_IN_TCB is set to 1 or configNUMBER_OF_CORES\r\n * is greater than 1. This function can be used in the implementation of portENTER_CRITICAL\r\n * if port wants to maintain critical nesting count in TCB in single core FreeRTOS.\r\n * It should be used in the implementation of portENTER_CRITICAL if port is running a\r\n * multiple core FreeRTOS.\r\n */\r\n#if ( ( portCRITICAL_NESTING_IN_TCB == 1 ) || ( configNUMBER_OF_CORES > 1 ) )\r\n    void vTaskEnterCritical( void );\r\n#endif\r\n\r\n/*\r\n * This function is only intended for use when implementing a port of the scheduler\r\n * and is only available when portCRITICAL_NESTING_IN_TCB is set to 1 or configNUMBER_OF_CORES\r\n * is greater than 1. This function can be used in the implementation of portEXIT_CRITICAL\r\n * if port wants to maintain critical nesting count in TCB in single core FreeRTOS.\r\n * It should be used in the implementation of portEXIT_CRITICAL if port is running a\r\n * multiple core FreeRTOS.\r\n */\r\n#if ( ( portCRITICAL_NESTING_IN_TCB == 1 ) || ( configNUMBER_OF_CORES > 1 ) )\r\n    void vTaskExitCritical( void );\r\n#endif\r\n\r\n/*\r\n * This function is only intended for use when implementing a port of the scheduler\r\n * and is only available when configNUMBER_OF_CORES is greater than 1. This function\r\n * should be used in the implementation of portENTER_CRITICAL_FROM_ISR if port is\r\n * running a multiple core FreeRTOS.\r\n */\r\n#if ( configNUMBER_OF_CORES > 1 )\r\n    UBaseType_t vTaskEnterCriticalFromISR( void );\r\n#endif\r\n\r\n/*\r\n * This function is only intended for use when implementing a port of the scheduler\r\n * and is only available when configNUMBER_OF_CORES is greater than 1. This function\r\n * should be used in the implementation of portEXIT_CRITICAL_FROM_ISR if port is\r\n * running a multiple core FreeRTOS.\r\n */\r\n#if ( configNUMBER_OF_CORES > 1 )\r\n    void vTaskExitCriticalFromISR( UBaseType_t uxSavedInterruptStatus );\r\n#endif\r\n\r\n#if ( portUSING_MPU_WRAPPERS == 1 )\r\n\r\n/*\r\n * For internal use only.  Get MPU settings associated with a task.\r\n */\r\n    xMPU_SETTINGS * xTaskGetMPUSettings( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r\n\r\n#endif /* portUSING_MPU_WRAPPERS */\r\n\r\n\r\n#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) && ( configENABLE_ACCESS_CONTROL_LIST == 1 ) )\r\n\r\n/*\r\n * For internal use only.  Grant/Revoke a task's access to a kernel object.\r\n */\r\n    void vGrantAccessToKernelObject( TaskHandle_t xExternalTaskHandle,\r\n                                     int32_t lExternalKernelObjectHandle ) PRIVILEGED_FUNCTION;\r\n    void vRevokeAccessToKernelObject( TaskHandle_t xExternalTaskHandle,\r\n                                      int32_t lExternalKernelObjectHandle ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * For internal use only.  Grant/Revoke a task's access to a kernel object.\r\n */\r\n    void vPortGrantAccessToKernelObject( TaskHandle_t xInternalTaskHandle,\r\n                                         int32_t lInternalIndexOfKernelObject ) PRIVILEGED_FUNCTION;\r\n    void vPortRevokeAccessToKernelObject( TaskHandle_t xInternalTaskHandle,\r\n                                          int32_t lInternalIndexOfKernelObject ) PRIVILEGED_FUNCTION;\r\n\r\n#endif /* #if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) && ( configENABLE_ACCESS_CONTROL_LIST == 1 ) ) */\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    }\r\n#endif\r\n/* *INDENT-ON* */\r\n#endif /* INC_TASK_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/include/timers.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n\r\n#ifndef TIMERS_H\r\n#define TIMERS_H\r\n\r\n#ifndef INC_FREERTOS_H\r\n    #error \"include FreeRTOS.h must appear in source files before include timers.h\"\r\n#endif\r\n\r\n#include \"task.h\"\r\n\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    extern \"C\" {\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n/*-----------------------------------------------------------\r\n* MACROS AND DEFINITIONS\r\n*----------------------------------------------------------*/\r\n\r\n/* IDs for commands that can be sent/received on the timer queue.  These are to\r\n * be used solely through the macros that make up the public software timer API,\r\n * as defined below.  The commands that are sent from interrupts must use the\r\n * highest numbers as tmrFIRST_FROM_ISR_COMMAND is used to determine if the task\r\n * or interrupt version of the queue send function should be used. */\r\n#define tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR    ( ( BaseType_t ) -2 )\r\n#define tmrCOMMAND_EXECUTE_CALLBACK             ( ( BaseType_t ) -1 )\r\n#define tmrCOMMAND_START_DONT_TRACE             ( ( BaseType_t ) 0 )\r\n#define tmrCOMMAND_START                        ( ( BaseType_t ) 1 )\r\n#define tmrCOMMAND_RESET                        ( ( BaseType_t ) 2 )\r\n#define tmrCOMMAND_STOP                         ( ( BaseType_t ) 3 )\r\n#define tmrCOMMAND_CHANGE_PERIOD                ( ( BaseType_t ) 4 )\r\n#define tmrCOMMAND_DELETE                       ( ( BaseType_t ) 5 )\r\n\r\n#define tmrFIRST_FROM_ISR_COMMAND               ( ( BaseType_t ) 6 )\r\n#define tmrCOMMAND_START_FROM_ISR               ( ( BaseType_t ) 6 )\r\n#define tmrCOMMAND_RESET_FROM_ISR               ( ( BaseType_t ) 7 )\r\n#define tmrCOMMAND_STOP_FROM_ISR                ( ( BaseType_t ) 8 )\r\n#define tmrCOMMAND_CHANGE_PERIOD_FROM_ISR       ( ( BaseType_t ) 9 )\r\n\r\n\r\n/**\r\n * Type by which software timers are referenced.  For example, a call to\r\n * xTimerCreate() returns an TimerHandle_t variable that can then be used to\r\n * reference the subject timer in calls to other software timer API functions\r\n * (for example, xTimerStart(), xTimerReset(), etc.).\r\n */\r\nstruct tmrTimerControl; /* The old naming convention is used to prevent breaking kernel aware debuggers. */\r\ntypedef struct tmrTimerControl * TimerHandle_t;\r\n\r\n/*\r\n * Defines the prototype to which timer callback functions must conform.\r\n */\r\ntypedef void (* TimerCallbackFunction_t)( TimerHandle_t xTimer );\r\n\r\n/*\r\n * Defines the prototype to which functions used with the\r\n * xTimerPendFunctionCallFromISR() function must conform.\r\n */\r\ntypedef void (* PendedFunction_t)( void * arg1,\r\n                                   uint32_t arg2 );\r\n\r\n/**\r\n * TimerHandle_t xTimerCreate(  const char * const pcTimerName,\r\n *                              TickType_t xTimerPeriodInTicks,\r\n *                              BaseType_t xAutoReload,\r\n *                              void * pvTimerID,\r\n *                              TimerCallbackFunction_t pxCallbackFunction );\r\n *\r\n * Creates a new software timer instance, and returns a handle by which the\r\n * created software timer can be referenced.\r\n *\r\n * Internally, within the FreeRTOS implementation, software timers use a block\r\n * of memory, in which the timer data structure is stored.  If a software timer\r\n * is created using xTimerCreate() then the required memory is automatically\r\n * dynamically allocated inside the xTimerCreate() function.  (see\r\n * https://www.FreeRTOS.org/a00111.html).  If a software timer is created using\r\n * xTimerCreateStatic() then the application writer must provide the memory that\r\n * will get used by the software timer.  xTimerCreateStatic() therefore allows a\r\n * software timer to be created without using any dynamic memory allocation.\r\n *\r\n * Timers are created in the dormant state.  The xTimerStart(), xTimerReset(),\r\n * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and\r\n * xTimerChangePeriodFromISR() API functions can all be used to transition a\r\n * timer into the active state.\r\n *\r\n * @param pcTimerName A text name that is assigned to the timer.  This is done\r\n * purely to assist debugging.  The kernel itself only ever references a timer\r\n * by its handle, and never by its name.\r\n *\r\n * @param xTimerPeriodInTicks The timer period.  The time is defined in tick\r\n * periods so the constant portTICK_PERIOD_MS can be used to convert a time that\r\n * has been specified in milliseconds.  For example, if the timer must expire\r\n * after 100 ticks, then xTimerPeriodInTicks should be set to 100.\r\n * Alternatively, if the timer must expire after 500ms, then xPeriod can be set\r\n * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or\r\n * equal to 1000.  Time timer period must be greater than 0.\r\n *\r\n * @param xAutoReload If xAutoReload is set to pdTRUE then the timer will\r\n * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter.\r\n * If xAutoReload is set to pdFALSE then the timer will be a one-shot timer and\r\n * enter the dormant state after it expires.\r\n *\r\n * @param pvTimerID An identifier that is assigned to the timer being created.\r\n * Typically this would be used in the timer callback function to identify which\r\n * timer expired when the same callback function is assigned to more than one\r\n * timer.\r\n *\r\n * @param pxCallbackFunction The function to call when the timer expires.\r\n * Callback functions must have the prototype defined by TimerCallbackFunction_t,\r\n * which is \"void vCallbackFunction( TimerHandle_t xTimer );\".\r\n *\r\n * @return If the timer is successfully created then a handle to the newly\r\n * created timer is returned.  If the timer cannot be created because there is\r\n * insufficient FreeRTOS heap remaining to allocate the timer\r\n * structures then NULL is returned.\r\n *\r\n * Example usage:\r\n * @verbatim\r\n * #define NUM_TIMERS 5\r\n *\r\n * // An array to hold handles to the created timers.\r\n * TimerHandle_t xTimers[ NUM_TIMERS ];\r\n *\r\n * // An array to hold a count of the number of times each timer expires.\r\n * int32_t lExpireCounters[ NUM_TIMERS ] = { 0 };\r\n *\r\n * // Define a callback function that will be used by multiple timer instances.\r\n * // The callback function does nothing but count the number of times the\r\n * // associated timer expires, and stop the timer once the timer has expired\r\n * // 10 times.\r\n * void vTimerCallback( TimerHandle_t pxTimer )\r\n * {\r\n * int32_t lArrayIndex;\r\n * const int32_t xMaxExpiryCountBeforeStopping = 10;\r\n *\r\n *     // Optionally do something if the pxTimer parameter is NULL.\r\n *     configASSERT( pxTimer );\r\n *\r\n *     // Which timer expired?\r\n *     lArrayIndex = ( int32_t ) pvTimerGetTimerID( pxTimer );\r\n *\r\n *     // Increment the number of times that pxTimer has expired.\r\n *     lExpireCounters[ lArrayIndex ] += 1;\r\n *\r\n *     // If the timer has expired 10 times then stop it from running.\r\n *     if( lExpireCounters[ lArrayIndex ] == xMaxExpiryCountBeforeStopping )\r\n *     {\r\n *         // Do not use a block time if calling a timer API function from a\r\n *         // timer callback function, as doing so could cause a deadlock!\r\n *         xTimerStop( pxTimer, 0 );\r\n *     }\r\n * }\r\n *\r\n * void main( void )\r\n * {\r\n * int32_t x;\r\n *\r\n *     // Create then start some timers.  Starting the timers before the scheduler\r\n *     // has been started means the timers will start running immediately that\r\n *     // the scheduler starts.\r\n *     for( x = 0; x < NUM_TIMERS; x++ )\r\n *     {\r\n *         xTimers[ x ] = xTimerCreate(    \"Timer\",             // Just a text name, not used by the kernel.\r\n *                                         ( 100 * ( x + 1 ) ), // The timer period in ticks.\r\n *                                         pdTRUE,              // The timers will auto-reload themselves when they expire.\r\n *                                         ( void * ) x,        // Assign each timer a unique id equal to its array index.\r\n *                                         vTimerCallback       // Each timer calls the same callback when it expires.\r\n *                                     );\r\n *\r\n *         if( xTimers[ x ] == NULL )\r\n *         {\r\n *             // The timer was not created.\r\n *         }\r\n *         else\r\n *         {\r\n *             // Start the timer.  No block time is specified, and even if one was\r\n *             // it would be ignored because the scheduler has not yet been\r\n *             // started.\r\n *             if( xTimerStart( xTimers[ x ], 0 ) != pdPASS )\r\n *             {\r\n *                 // The timer could not be set into the Active state.\r\n *             }\r\n *         }\r\n *     }\r\n *\r\n *     // ...\r\n *     // Create tasks here.\r\n *     // ...\r\n *\r\n *     // Starting the scheduler will start the timers running as they have already\r\n *     // been set into the active state.\r\n *     vTaskStartScheduler();\r\n *\r\n *     // Should not reach here.\r\n *     for( ;; );\r\n * }\r\n * @endverbatim\r\n */\r\n#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r\n    TimerHandle_t xTimerCreate( const char * const pcTimerName,\r\n                                const TickType_t xTimerPeriodInTicks,\r\n                                const BaseType_t xAutoReload,\r\n                                void * const pvTimerID,\r\n                                TimerCallbackFunction_t pxCallbackFunction ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * TimerHandle_t xTimerCreateStatic(const char * const pcTimerName,\r\n *                                  TickType_t xTimerPeriodInTicks,\r\n *                                  BaseType_t xAutoReload,\r\n *                                  void * pvTimerID,\r\n *                                  TimerCallbackFunction_t pxCallbackFunction,\r\n *                                  StaticTimer_t *pxTimerBuffer );\r\n *\r\n * Creates a new software timer instance, and returns a handle by which the\r\n * created software timer can be referenced.\r\n *\r\n * Internally, within the FreeRTOS implementation, software timers use a block\r\n * of memory, in which the timer data structure is stored.  If a software timer\r\n * is created using xTimerCreate() then the required memory is automatically\r\n * dynamically allocated inside the xTimerCreate() function.  (see\r\n * https://www.FreeRTOS.org/a00111.html).  If a software timer is created using\r\n * xTimerCreateStatic() then the application writer must provide the memory that\r\n * will get used by the software timer.  xTimerCreateStatic() therefore allows a\r\n * software timer to be created without using any dynamic memory allocation.\r\n *\r\n * Timers are created in the dormant state.  The xTimerStart(), xTimerReset(),\r\n * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and\r\n * xTimerChangePeriodFromISR() API functions can all be used to transition a\r\n * timer into the active state.\r\n *\r\n * @param pcTimerName A text name that is assigned to the timer.  This is done\r\n * purely to assist debugging.  The kernel itself only ever references a timer\r\n * by its handle, and never by its name.\r\n *\r\n * @param xTimerPeriodInTicks The timer period.  The time is defined in tick\r\n * periods so the constant portTICK_PERIOD_MS can be used to convert a time that\r\n * has been specified in milliseconds.  For example, if the timer must expire\r\n * after 100 ticks, then xTimerPeriodInTicks should be set to 100.\r\n * Alternatively, if the timer must expire after 500ms, then xPeriod can be set\r\n * to ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than or\r\n * equal to 1000.  The timer period must be greater than 0.\r\n *\r\n * @param xAutoReload If xAutoReload is set to pdTRUE then the timer will\r\n * expire repeatedly with a frequency set by the xTimerPeriodInTicks parameter.\r\n * If xAutoReload is set to pdFALSE then the timer will be a one-shot timer and\r\n * enter the dormant state after it expires.\r\n *\r\n * @param pvTimerID An identifier that is assigned to the timer being created.\r\n * Typically this would be used in the timer callback function to identify which\r\n * timer expired when the same callback function is assigned to more than one\r\n * timer.\r\n *\r\n * @param pxCallbackFunction The function to call when the timer expires.\r\n * Callback functions must have the prototype defined by TimerCallbackFunction_t,\r\n * which is \"void vCallbackFunction( TimerHandle_t xTimer );\".\r\n *\r\n * @param pxTimerBuffer Must point to a variable of type StaticTimer_t, which\r\n * will be then be used to hold the software timer's data structures, removing\r\n * the need for the memory to be allocated dynamically.\r\n *\r\n * @return If the timer is created then a handle to the created timer is\r\n * returned.  If pxTimerBuffer was NULL then NULL is returned.\r\n *\r\n * Example usage:\r\n * @verbatim\r\n *\r\n * // The buffer used to hold the software timer's data structure.\r\n * static StaticTimer_t xTimerBuffer;\r\n *\r\n * // A variable that will be incremented by the software timer's callback\r\n * // function.\r\n * UBaseType_t uxVariableToIncrement = 0;\r\n *\r\n * // A software timer callback function that increments a variable passed to\r\n * // it when the software timer was created.  After the 5th increment the\r\n * // callback function stops the software timer.\r\n * static void prvTimerCallback( TimerHandle_t xExpiredTimer )\r\n * {\r\n * UBaseType_t *puxVariableToIncrement;\r\n * BaseType_t xReturned;\r\n *\r\n *     // Obtain the address of the variable to increment from the timer ID.\r\n *     puxVariableToIncrement = ( UBaseType_t * ) pvTimerGetTimerID( xExpiredTimer );\r\n *\r\n *     // Increment the variable to show the timer callback has executed.\r\n *     ( *puxVariableToIncrement )++;\r\n *\r\n *     // If this callback has executed the required number of times, stop the\r\n *     // timer.\r\n *     if( *puxVariableToIncrement == 5 )\r\n *     {\r\n *         // This is called from a timer callback so must not block.\r\n *         xTimerStop( xExpiredTimer, staticDONT_BLOCK );\r\n *     }\r\n * }\r\n *\r\n *\r\n * void main( void )\r\n * {\r\n *     // Create the software time.  xTimerCreateStatic() has an extra parameter\r\n *     // than the normal xTimerCreate() API function.  The parameter is a pointer\r\n *     // to the StaticTimer_t structure that will hold the software timer\r\n *     // structure.  If the parameter is passed as NULL then the structure will be\r\n *     // allocated dynamically, just as if xTimerCreate() had been called.\r\n *     xTimer = xTimerCreateStatic( \"T1\",             // Text name for the task.  Helps debugging only.  Not used by FreeRTOS.\r\n *                                  xTimerPeriod,     // The period of the timer in ticks.\r\n *                                  pdTRUE,           // This is an auto-reload timer.\r\n *                                  ( void * ) &uxVariableToIncrement,    // A variable incremented by the software timer's callback function\r\n *                                  prvTimerCallback, // The function to execute when the timer expires.\r\n *                                  &xTimerBuffer );  // The buffer that will hold the software timer structure.\r\n *\r\n *     // The scheduler has not started yet so a block time is not used.\r\n *     xReturned = xTimerStart( xTimer, 0 );\r\n *\r\n *     // ...\r\n *     // Create tasks here.\r\n *     // ...\r\n *\r\n *     // Starting the scheduler will start the timers running as they have already\r\n *     // been set into the active state.\r\n *     vTaskStartScheduler();\r\n *\r\n *     // Should not reach here.\r\n *     for( ;; );\r\n * }\r\n * @endverbatim\r\n */\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n    TimerHandle_t xTimerCreateStatic( const char * const pcTimerName,\r\n                                      const TickType_t xTimerPeriodInTicks,\r\n                                      const BaseType_t xAutoReload,\r\n                                      void * const pvTimerID,\r\n                                      TimerCallbackFunction_t pxCallbackFunction,\r\n                                      StaticTimer_t * pxTimerBuffer ) PRIVILEGED_FUNCTION;\r\n#endif /* configSUPPORT_STATIC_ALLOCATION */\r\n\r\n/**\r\n * void *pvTimerGetTimerID( TimerHandle_t xTimer );\r\n *\r\n * Returns the ID assigned to the timer.\r\n *\r\n * IDs are assigned to timers using the pvTimerID parameter of the call to\r\n * xTimerCreated() that was used to create the timer, and by calling the\r\n * vTimerSetTimerID() API function.\r\n *\r\n * If the same callback function is assigned to multiple timers then the timer\r\n * ID can be used as time specific (timer local) storage.\r\n *\r\n * @param xTimer The timer being queried.\r\n *\r\n * @return The ID assigned to the timer being queried.\r\n *\r\n * Example usage:\r\n *\r\n * See the xTimerCreate() API function example usage scenario.\r\n */\r\nvoid * pvTimerGetTimerID( const TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID );\r\n *\r\n * Sets the ID assigned to the timer.\r\n *\r\n * IDs are assigned to timers using the pvTimerID parameter of the call to\r\n * xTimerCreated() that was used to create the timer.\r\n *\r\n * If the same callback function is assigned to multiple timers then the timer\r\n * ID can be used as time specific (timer local) storage.\r\n *\r\n * @param xTimer The timer being updated.\r\n *\r\n * @param pvNewID The ID to assign to the timer.\r\n *\r\n * Example usage:\r\n *\r\n * See the xTimerCreate() API function example usage scenario.\r\n */\r\nvoid vTimerSetTimerID( TimerHandle_t xTimer,\r\n                       void * pvNewID ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer );\r\n *\r\n * Queries a timer to see if it is active or dormant.\r\n *\r\n * A timer will be dormant if:\r\n *     1) It has been created but not started, or\r\n *     2) It is an expired one-shot timer that has not been restarted.\r\n *\r\n * Timers are created in the dormant state.  The xTimerStart(), xTimerReset(),\r\n * xTimerStartFromISR(), xTimerResetFromISR(), xTimerChangePeriod() and\r\n * xTimerChangePeriodFromISR() API functions can all be used to transition a timer into the\r\n * active state.\r\n *\r\n * @param xTimer The timer being queried.\r\n *\r\n * @return pdFALSE will be returned if the timer is dormant.  A value other than\r\n * pdFALSE will be returned if the timer is active.\r\n *\r\n * Example usage:\r\n * @verbatim\r\n * // This function assumes xTimer has already been created.\r\n * void vAFunction( TimerHandle_t xTimer )\r\n * {\r\n *     if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently \"if( xTimerIsTimerActive( xTimer ) )\"\r\n *     {\r\n *         // xTimer is active, do something.\r\n *     }\r\n *     else\r\n *     {\r\n *         // xTimer is not active, do something else.\r\n *     }\r\n * }\r\n * @endverbatim\r\n */\r\nBaseType_t xTimerIsTimerActive( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * TaskHandle_t xTimerGetTimerDaemonTaskHandle( void );\r\n *\r\n * Simply returns the handle of the timer service/daemon task.  It it not valid\r\n * to call xTimerGetTimerDaemonTaskHandle() before the scheduler has been started.\r\n */\r\nTaskHandle_t xTimerGetTimerDaemonTaskHandle( void ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait );\r\n *\r\n * Timer functionality is provided by a timer service/daemon task.  Many of the\r\n * public FreeRTOS timer API functions send commands to the timer service task\r\n * through a queue called the timer command queue.  The timer command queue is\r\n * private to the kernel itself and is not directly accessible to application\r\n * code.  The length of the timer command queue is set by the\r\n * configTIMER_QUEUE_LENGTH configuration constant.\r\n *\r\n * xTimerStart() starts a timer that was previously created using the\r\n * xTimerCreate() API function.  If the timer had already been started and was\r\n * already in the active state, then xTimerStart() has equivalent functionality\r\n * to the xTimerReset() API function.\r\n *\r\n * Starting a timer ensures the timer is in the active state.  If the timer\r\n * is not stopped, deleted, or reset in the mean time, the callback function\r\n * associated with the timer will get called 'n' ticks after xTimerStart() was\r\n * called, where 'n' is the timers defined period.\r\n *\r\n * It is valid to call xTimerStart() before the scheduler has been started, but\r\n * when this is done the timer will not actually start until the scheduler is\r\n * started, and the timers expiry time will be relative to when the scheduler is\r\n * started, not relative to when xTimerStart() was called.\r\n *\r\n * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStart()\r\n * to be available.\r\n *\r\n * @param xTimer The handle of the timer being started/restarted.\r\n *\r\n * @param xTicksToWait Specifies the time, in ticks, that the calling task should\r\n * be held in the Blocked state to wait for the start command to be successfully\r\n * sent to the timer command queue, should the queue already be full when\r\n * xTimerStart() was called.  xTicksToWait is ignored if xTimerStart() is called\r\n * before the scheduler is started.\r\n *\r\n * @return pdFAIL will be returned if the start command could not be sent to\r\n * the timer command queue even after xTicksToWait ticks had passed.  pdPASS will\r\n * be returned if the command was successfully sent to the timer command queue.\r\n * When the command is actually processed will depend on the priority of the\r\n * timer service/daemon task relative to other tasks in the system, although the\r\n * timers expiry time is relative to when xTimerStart() is actually called.  The\r\n * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY\r\n * configuration constant.\r\n *\r\n * Example usage:\r\n *\r\n * See the xTimerCreate() API function example usage scenario.\r\n *\r\n */\r\n#define xTimerStart( xTimer, xTicksToWait ) \\\r\n    xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) )\r\n\r\n/**\r\n * BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait );\r\n *\r\n * Timer functionality is provided by a timer service/daemon task.  Many of the\r\n * public FreeRTOS timer API functions send commands to the timer service task\r\n * through a queue called the timer command queue.  The timer command queue is\r\n * private to the kernel itself and is not directly accessible to application\r\n * code.  The length of the timer command queue is set by the\r\n * configTIMER_QUEUE_LENGTH configuration constant.\r\n *\r\n * xTimerStop() stops a timer that was previously started using either of the\r\n * The xTimerStart(), xTimerReset(), xTimerStartFromISR(), xTimerResetFromISR(),\r\n * xTimerChangePeriod() or xTimerChangePeriodFromISR() API functions.\r\n *\r\n * Stopping a timer ensures the timer is not in the active state.\r\n *\r\n * The configUSE_TIMERS configuration constant must be set to 1 for xTimerStop()\r\n * to be available.\r\n *\r\n * @param xTimer The handle of the timer being stopped.\r\n *\r\n * @param xTicksToWait Specifies the time, in ticks, that the calling task should\r\n * be held in the Blocked state to wait for the stop command to be successfully\r\n * sent to the timer command queue, should the queue already be full when\r\n * xTimerStop() was called.  xTicksToWait is ignored if xTimerStop() is called\r\n * before the scheduler is started.\r\n *\r\n * @return pdFAIL will be returned if the stop command could not be sent to\r\n * the timer command queue even after xTicksToWait ticks had passed.  pdPASS will\r\n * be returned if the command was successfully sent to the timer command queue.\r\n * When the command is actually processed will depend on the priority of the\r\n * timer service/daemon task relative to other tasks in the system.  The timer\r\n * service/daemon task priority is set by the configTIMER_TASK_PRIORITY\r\n * configuration constant.\r\n *\r\n * Example usage:\r\n *\r\n * See the xTimerCreate() API function example usage scenario.\r\n *\r\n */\r\n#define xTimerStop( xTimer, xTicksToWait ) \\\r\n    xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 0U, NULL, ( xTicksToWait ) )\r\n\r\n/**\r\n * BaseType_t xTimerChangePeriod(   TimerHandle_t xTimer,\r\n *                                  TickType_t xNewPeriod,\r\n *                                  TickType_t xTicksToWait );\r\n *\r\n * Timer functionality is provided by a timer service/daemon task.  Many of the\r\n * public FreeRTOS timer API functions send commands to the timer service task\r\n * through a queue called the timer command queue.  The timer command queue is\r\n * private to the kernel itself and is not directly accessible to application\r\n * code.  The length of the timer command queue is set by the\r\n * configTIMER_QUEUE_LENGTH configuration constant.\r\n *\r\n * xTimerChangePeriod() changes the period of a timer that was previously\r\n * created using the xTimerCreate() API function.\r\n *\r\n * xTimerChangePeriod() can be called to change the period of an active or\r\n * dormant state timer.\r\n *\r\n * The configUSE_TIMERS configuration constant must be set to 1 for\r\n * xTimerChangePeriod() to be available.\r\n *\r\n * @param xTimer The handle of the timer that is having its period changed.\r\n *\r\n * @param xNewPeriod The new period for xTimer. Timer periods are specified in\r\n * tick periods, so the constant portTICK_PERIOD_MS can be used to convert a time\r\n * that has been specified in milliseconds.  For example, if the timer must\r\n * expire after 100 ticks, then xNewPeriod should be set to 100.  Alternatively,\r\n * if the timer must expire after 500ms, then xNewPeriod can be set to\r\n * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than\r\n * or equal to 1000.\r\n *\r\n * @param xTicksToWait Specifies the time, in ticks, that the calling task should\r\n * be held in the Blocked state to wait for the change period command to be\r\n * successfully sent to the timer command queue, should the queue already be\r\n * full when xTimerChangePeriod() was called.  xTicksToWait is ignored if\r\n * xTimerChangePeriod() is called before the scheduler is started.\r\n *\r\n * @return pdFAIL will be returned if the change period command could not be\r\n * sent to the timer command queue even after xTicksToWait ticks had passed.\r\n * pdPASS will be returned if the command was successfully sent to the timer\r\n * command queue.  When the command is actually processed will depend on the\r\n * priority of the timer service/daemon task relative to other tasks in the\r\n * system.  The timer service/daemon task priority is set by the\r\n * configTIMER_TASK_PRIORITY configuration constant.\r\n *\r\n * Example usage:\r\n * @verbatim\r\n * // This function assumes xTimer has already been created.  If the timer\r\n * // referenced by xTimer is already active when it is called, then the timer\r\n * // is deleted.  If the timer referenced by xTimer is not active when it is\r\n * // called, then the period of the timer is set to 500ms and the timer is\r\n * // started.\r\n * void vAFunction( TimerHandle_t xTimer )\r\n * {\r\n *     if( xTimerIsTimerActive( xTimer ) != pdFALSE ) // or more simply and equivalently \"if( xTimerIsTimerActive( xTimer ) )\"\r\n *     {\r\n *         // xTimer is already active - delete it.\r\n *         xTimerDelete( xTimer );\r\n *     }\r\n *     else\r\n *     {\r\n *         // xTimer is not active, change its period to 500ms.  This will also\r\n *         // cause the timer to start.  Block for a maximum of 100 ticks if the\r\n *         // change period command cannot immediately be sent to the timer\r\n *         // command queue.\r\n *         if( xTimerChangePeriod( xTimer, 500 / portTICK_PERIOD_MS, 100 ) == pdPASS )\r\n *         {\r\n *             // The command was successfully sent.\r\n *         }\r\n *         else\r\n *         {\r\n *             // The command could not be sent, even after waiting for 100 ticks\r\n *             // to pass.  Take appropriate action here.\r\n *         }\r\n *     }\r\n * }\r\n * @endverbatim\r\n */\r\n#define xTimerChangePeriod( xTimer, xNewPeriod, xTicksToWait ) \\\r\n    xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD, ( xNewPeriod ), NULL, ( xTicksToWait ) )\r\n\r\n/**\r\n * BaseType_t xTimerDelete( TimerHandle_t xTimer, TickType_t xTicksToWait );\r\n *\r\n * Timer functionality is provided by a timer service/daemon task.  Many of the\r\n * public FreeRTOS timer API functions send commands to the timer service task\r\n * through a queue called the timer command queue.  The timer command queue is\r\n * private to the kernel itself and is not directly accessible to application\r\n * code.  The length of the timer command queue is set by the\r\n * configTIMER_QUEUE_LENGTH configuration constant.\r\n *\r\n * xTimerDelete() deletes a timer that was previously created using the\r\n * xTimerCreate() API function.\r\n *\r\n * The configUSE_TIMERS configuration constant must be set to 1 for\r\n * xTimerDelete() to be available.\r\n *\r\n * @param xTimer The handle of the timer being deleted.\r\n *\r\n * @param xTicksToWait Specifies the time, in ticks, that the calling task should\r\n * be held in the Blocked state to wait for the delete command to be\r\n * successfully sent to the timer command queue, should the queue already be\r\n * full when xTimerDelete() was called.  xTicksToWait is ignored if xTimerDelete()\r\n * is called before the scheduler is started.\r\n *\r\n * @return pdFAIL will be returned if the delete command could not be sent to\r\n * the timer command queue even after xTicksToWait ticks had passed.  pdPASS will\r\n * be returned if the command was successfully sent to the timer command queue.\r\n * When the command is actually processed will depend on the priority of the\r\n * timer service/daemon task relative to other tasks in the system.  The timer\r\n * service/daemon task priority is set by the configTIMER_TASK_PRIORITY\r\n * configuration constant.\r\n *\r\n * Example usage:\r\n *\r\n * See the xTimerChangePeriod() API function example usage scenario.\r\n */\r\n#define xTimerDelete( xTimer, xTicksToWait ) \\\r\n    xTimerGenericCommand( ( xTimer ), tmrCOMMAND_DELETE, 0U, NULL, ( xTicksToWait ) )\r\n\r\n/**\r\n * BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait );\r\n *\r\n * Timer functionality is provided by a timer service/daemon task.  Many of the\r\n * public FreeRTOS timer API functions send commands to the timer service task\r\n * through a queue called the timer command queue.  The timer command queue is\r\n * private to the kernel itself and is not directly accessible to application\r\n * code.  The length of the timer command queue is set by the\r\n * configTIMER_QUEUE_LENGTH configuration constant.\r\n *\r\n * xTimerReset() re-starts a timer that was previously created using the\r\n * xTimerCreate() API function.  If the timer had already been started and was\r\n * already in the active state, then xTimerReset() will cause the timer to\r\n * re-evaluate its expiry time so that it is relative to when xTimerReset() was\r\n * called.  If the timer was in the dormant state then xTimerReset() has\r\n * equivalent functionality to the xTimerStart() API function.\r\n *\r\n * Resetting a timer ensures the timer is in the active state.  If the timer\r\n * is not stopped, deleted, or reset in the mean time, the callback function\r\n * associated with the timer will get called 'n' ticks after xTimerReset() was\r\n * called, where 'n' is the timers defined period.\r\n *\r\n * It is valid to call xTimerReset() before the scheduler has been started, but\r\n * when this is done the timer will not actually start until the scheduler is\r\n * started, and the timers expiry time will be relative to when the scheduler is\r\n * started, not relative to when xTimerReset() was called.\r\n *\r\n * The configUSE_TIMERS configuration constant must be set to 1 for xTimerReset()\r\n * to be available.\r\n *\r\n * @param xTimer The handle of the timer being reset/started/restarted.\r\n *\r\n * @param xTicksToWait Specifies the time, in ticks, that the calling task should\r\n * be held in the Blocked state to wait for the reset command to be successfully\r\n * sent to the timer command queue, should the queue already be full when\r\n * xTimerReset() was called.  xTicksToWait is ignored if xTimerReset() is called\r\n * before the scheduler is started.\r\n *\r\n * @return pdFAIL will be returned if the reset command could not be sent to\r\n * the timer command queue even after xTicksToWait ticks had passed.  pdPASS will\r\n * be returned if the command was successfully sent to the timer command queue.\r\n * When the command is actually processed will depend on the priority of the\r\n * timer service/daemon task relative to other tasks in the system, although the\r\n * timers expiry time is relative to when xTimerStart() is actually called.  The\r\n * timer service/daemon task priority is set by the configTIMER_TASK_PRIORITY\r\n * configuration constant.\r\n *\r\n * Example usage:\r\n * @verbatim\r\n * // When a key is pressed, an LCD back-light is switched on.  If 5 seconds pass\r\n * // without a key being pressed, then the LCD back-light is switched off.  In\r\n * // this case, the timer is a one-shot timer.\r\n *\r\n * TimerHandle_t xBacklightTimer = NULL;\r\n *\r\n * // The callback function assigned to the one-shot timer.  In this case the\r\n * // parameter is not used.\r\n * void vBacklightTimerCallback( TimerHandle_t pxTimer )\r\n * {\r\n *     // The timer expired, therefore 5 seconds must have passed since a key\r\n *     // was pressed.  Switch off the LCD back-light.\r\n *     vSetBacklightState( BACKLIGHT_OFF );\r\n * }\r\n *\r\n * // The key press event handler.\r\n * void vKeyPressEventHandler( char cKey )\r\n * {\r\n *     // Ensure the LCD back-light is on, then reset the timer that is\r\n *     // responsible for turning the back-light off after 5 seconds of\r\n *     // key inactivity.  Wait 10 ticks for the command to be successfully sent\r\n *     // if it cannot be sent immediately.\r\n *     vSetBacklightState( BACKLIGHT_ON );\r\n *     if( xTimerReset( xBacklightTimer, 100 ) != pdPASS )\r\n *     {\r\n *         // The reset command was not executed successfully.  Take appropriate\r\n *         // action here.\r\n *     }\r\n *\r\n *     // Perform the rest of the key processing here.\r\n * }\r\n *\r\n * void main( void )\r\n * {\r\n * int32_t x;\r\n *\r\n *     // Create then start the one-shot timer that is responsible for turning\r\n *     // the back-light off if no keys are pressed within a 5 second period.\r\n *     xBacklightTimer = xTimerCreate( \"BacklightTimer\",           // Just a text name, not used by the kernel.\r\n *                                     ( 5000 / portTICK_PERIOD_MS), // The timer period in ticks.\r\n *                                     pdFALSE,                    // The timer is a one-shot timer.\r\n *                                     0,                          // The id is not used by the callback so can take any value.\r\n *                                     vBacklightTimerCallback     // The callback function that switches the LCD back-light off.\r\n *                                   );\r\n *\r\n *     if( xBacklightTimer == NULL )\r\n *     {\r\n *         // The timer was not created.\r\n *     }\r\n *     else\r\n *     {\r\n *         // Start the timer.  No block time is specified, and even if one was\r\n *         // it would be ignored because the scheduler has not yet been\r\n *         // started.\r\n *         if( xTimerStart( xBacklightTimer, 0 ) != pdPASS )\r\n *         {\r\n *             // The timer could not be set into the Active state.\r\n *         }\r\n *     }\r\n *\r\n *     // ...\r\n *     // Create tasks here.\r\n *     // ...\r\n *\r\n *     // Starting the scheduler will start the timer running as it has already\r\n *     // been set into the active state.\r\n *     vTaskStartScheduler();\r\n *\r\n *     // Should not reach here.\r\n *     for( ;; );\r\n * }\r\n * @endverbatim\r\n */\r\n#define xTimerReset( xTimer, xTicksToWait ) \\\r\n    xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET, ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) )\r\n\r\n/**\r\n * BaseType_t xTimerStartFromISR(   TimerHandle_t xTimer,\r\n *                                  BaseType_t *pxHigherPriorityTaskWoken );\r\n *\r\n * A version of xTimerStart() that can be called from an interrupt service\r\n * routine.\r\n *\r\n * @param xTimer The handle of the timer being started/restarted.\r\n *\r\n * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most\r\n * of its time in the Blocked state, waiting for messages to arrive on the timer\r\n * command queue.  Calling xTimerStartFromISR() writes a message to the timer\r\n * command queue, so has the potential to transition the timer service/daemon\r\n * task out of the Blocked state.  If calling xTimerStartFromISR() causes the\r\n * timer service/daemon task to leave the Blocked state, and the timer service/\r\n * daemon task has a priority equal to or greater than the currently executing\r\n * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will\r\n * get set to pdTRUE internally within the xTimerStartFromISR() function.  If\r\n * xTimerStartFromISR() sets this value to pdTRUE then a context switch should\r\n * be performed before the interrupt exits.\r\n *\r\n * @return pdFAIL will be returned if the start command could not be sent to\r\n * the timer command queue.  pdPASS will be returned if the command was\r\n * successfully sent to the timer command queue.  When the command is actually\r\n * processed will depend on the priority of the timer service/daemon task\r\n * relative to other tasks in the system, although the timers expiry time is\r\n * relative to when xTimerStartFromISR() is actually called.  The timer\r\n * service/daemon task priority is set by the configTIMER_TASK_PRIORITY\r\n * configuration constant.\r\n *\r\n * Example usage:\r\n * @verbatim\r\n * // This scenario assumes xBacklightTimer has already been created.  When a\r\n * // key is pressed, an LCD back-light is switched on.  If 5 seconds pass\r\n * // without a key being pressed, then the LCD back-light is switched off.  In\r\n * // this case, the timer is a one-shot timer, and unlike the example given for\r\n * // the xTimerReset() function, the key press event handler is an interrupt\r\n * // service routine.\r\n *\r\n * // The callback function assigned to the one-shot timer.  In this case the\r\n * // parameter is not used.\r\n * void vBacklightTimerCallback( TimerHandle_t pxTimer )\r\n * {\r\n *     // The timer expired, therefore 5 seconds must have passed since a key\r\n *     // was pressed.  Switch off the LCD back-light.\r\n *     vSetBacklightState( BACKLIGHT_OFF );\r\n * }\r\n *\r\n * // The key press interrupt service routine.\r\n * void vKeyPressEventInterruptHandler( void )\r\n * {\r\n * BaseType_t xHigherPriorityTaskWoken = pdFALSE;\r\n *\r\n *     // Ensure the LCD back-light is on, then restart the timer that is\r\n *     // responsible for turning the back-light off after 5 seconds of\r\n *     // key inactivity.  This is an interrupt service routine so can only\r\n *     // call FreeRTOS API functions that end in \"FromISR\".\r\n *     vSetBacklightState( BACKLIGHT_ON );\r\n *\r\n *     // xTimerStartFromISR() or xTimerResetFromISR() could be called here\r\n *     // as both cause the timer to re-calculate its expiry time.\r\n *     // xHigherPriorityTaskWoken was initialised to pdFALSE when it was\r\n *     // declared (in this function).\r\n *     if( xTimerStartFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS )\r\n *     {\r\n *         // The start command was not executed successfully.  Take appropriate\r\n *         // action here.\r\n *     }\r\n *\r\n *     // Perform the rest of the key processing here.\r\n *\r\n *     // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch\r\n *     // should be performed.  The syntax required to perform a context switch\r\n *     // from inside an ISR varies from port to port, and from compiler to\r\n *     // compiler.  Inspect the demos for the port you are using to find the\r\n *     // actual syntax required.\r\n *     if( xHigherPriorityTaskWoken != pdFALSE )\r\n *     {\r\n *         // Call the interrupt safe yield function here (actual function\r\n *         // depends on the FreeRTOS port being used).\r\n *     }\r\n * }\r\n * @endverbatim\r\n */\r\n#define xTimerStartFromISR( xTimer, pxHigherPriorityTaskWoken ) \\\r\n    xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U )\r\n\r\n/**\r\n * BaseType_t xTimerStopFromISR(    TimerHandle_t xTimer,\r\n *                                  BaseType_t *pxHigherPriorityTaskWoken );\r\n *\r\n * A version of xTimerStop() that can be called from an interrupt service\r\n * routine.\r\n *\r\n * @param xTimer The handle of the timer being stopped.\r\n *\r\n * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most\r\n * of its time in the Blocked state, waiting for messages to arrive on the timer\r\n * command queue.  Calling xTimerStopFromISR() writes a message to the timer\r\n * command queue, so has the potential to transition the timer service/daemon\r\n * task out of the Blocked state.  If calling xTimerStopFromISR() causes the\r\n * timer service/daemon task to leave the Blocked state, and the timer service/\r\n * daemon task has a priority equal to or greater than the currently executing\r\n * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will\r\n * get set to pdTRUE internally within the xTimerStopFromISR() function.  If\r\n * xTimerStopFromISR() sets this value to pdTRUE then a context switch should\r\n * be performed before the interrupt exits.\r\n *\r\n * @return pdFAIL will be returned if the stop command could not be sent to\r\n * the timer command queue.  pdPASS will be returned if the command was\r\n * successfully sent to the timer command queue.  When the command is actually\r\n * processed will depend on the priority of the timer service/daemon task\r\n * relative to other tasks in the system.  The timer service/daemon task\r\n * priority is set by the configTIMER_TASK_PRIORITY configuration constant.\r\n *\r\n * Example usage:\r\n * @verbatim\r\n * // This scenario assumes xTimer has already been created and started.  When\r\n * // an interrupt occurs, the timer should be simply stopped.\r\n *\r\n * // The interrupt service routine that stops the timer.\r\n * void vAnExampleInterruptServiceRoutine( void )\r\n * {\r\n * BaseType_t xHigherPriorityTaskWoken = pdFALSE;\r\n *\r\n *     // The interrupt has occurred - simply stop the timer.\r\n *     // xHigherPriorityTaskWoken was set to pdFALSE where it was defined\r\n *     // (within this function).  As this is an interrupt service routine, only\r\n *     // FreeRTOS API functions that end in \"FromISR\" can be used.\r\n *     if( xTimerStopFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS )\r\n *     {\r\n *         // The stop command was not executed successfully.  Take appropriate\r\n *         // action here.\r\n *     }\r\n *\r\n *     // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch\r\n *     // should be performed.  The syntax required to perform a context switch\r\n *     // from inside an ISR varies from port to port, and from compiler to\r\n *     // compiler.  Inspect the demos for the port you are using to find the\r\n *     // actual syntax required.\r\n *     if( xHigherPriorityTaskWoken != pdFALSE )\r\n *     {\r\n *         // Call the interrupt safe yield function here (actual function\r\n *         // depends on the FreeRTOS port being used).\r\n *     }\r\n * }\r\n * @endverbatim\r\n */\r\n#define xTimerStopFromISR( xTimer, pxHigherPriorityTaskWoken ) \\\r\n    xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP_FROM_ISR, 0, ( pxHigherPriorityTaskWoken ), 0U )\r\n\r\n/**\r\n * BaseType_t xTimerChangePeriodFromISR( TimerHandle_t xTimer,\r\n *                                       TickType_t xNewPeriod,\r\n *                                       BaseType_t *pxHigherPriorityTaskWoken );\r\n *\r\n * A version of xTimerChangePeriod() that can be called from an interrupt\r\n * service routine.\r\n *\r\n * @param xTimer The handle of the timer that is having its period changed.\r\n *\r\n * @param xNewPeriod The new period for xTimer. Timer periods are specified in\r\n * tick periods, so the constant portTICK_PERIOD_MS can be used to convert a time\r\n * that has been specified in milliseconds.  For example, if the timer must\r\n * expire after 100 ticks, then xNewPeriod should be set to 100.  Alternatively,\r\n * if the timer must expire after 500ms, then xNewPeriod can be set to\r\n * ( 500 / portTICK_PERIOD_MS ) provided configTICK_RATE_HZ is less than\r\n * or equal to 1000.\r\n *\r\n * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most\r\n * of its time in the Blocked state, waiting for messages to arrive on the timer\r\n * command queue.  Calling xTimerChangePeriodFromISR() writes a message to the\r\n * timer command queue, so has the potential to transition the timer service/\r\n * daemon task out of the Blocked state.  If calling xTimerChangePeriodFromISR()\r\n * causes the timer service/daemon task to leave the Blocked state, and the\r\n * timer service/daemon task has a priority equal to or greater than the\r\n * currently executing task (the task that was interrupted), then\r\n * *pxHigherPriorityTaskWoken will get set to pdTRUE internally within the\r\n * xTimerChangePeriodFromISR() function.  If xTimerChangePeriodFromISR() sets\r\n * this value to pdTRUE then a context switch should be performed before the\r\n * interrupt exits.\r\n *\r\n * @return pdFAIL will be returned if the command to change the timers period\r\n * could not be sent to the timer command queue.  pdPASS will be returned if the\r\n * command was successfully sent to the timer command queue.  When the command\r\n * is actually processed will depend on the priority of the timer service/daemon\r\n * task relative to other tasks in the system.  The timer service/daemon task\r\n * priority is set by the configTIMER_TASK_PRIORITY configuration constant.\r\n *\r\n * Example usage:\r\n * @verbatim\r\n * // This scenario assumes xTimer has already been created and started.  When\r\n * // an interrupt occurs, the period of xTimer should be changed to 500ms.\r\n *\r\n * // The interrupt service routine that changes the period of xTimer.\r\n * void vAnExampleInterruptServiceRoutine( void )\r\n * {\r\n * BaseType_t xHigherPriorityTaskWoken = pdFALSE;\r\n *\r\n *     // The interrupt has occurred - change the period of xTimer to 500ms.\r\n *     // xHigherPriorityTaskWoken was set to pdFALSE where it was defined\r\n *     // (within this function).  As this is an interrupt service routine, only\r\n *     // FreeRTOS API functions that end in \"FromISR\" can be used.\r\n *     if( xTimerChangePeriodFromISR( xTimer, &xHigherPriorityTaskWoken ) != pdPASS )\r\n *     {\r\n *         // The command to change the timers period was not executed\r\n *         // successfully.  Take appropriate action here.\r\n *     }\r\n *\r\n *     // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch\r\n *     // should be performed.  The syntax required to perform a context switch\r\n *     // from inside an ISR varies from port to port, and from compiler to\r\n *     // compiler.  Inspect the demos for the port you are using to find the\r\n *     // actual syntax required.\r\n *     if( xHigherPriorityTaskWoken != pdFALSE )\r\n *     {\r\n *         // Call the interrupt safe yield function here (actual function\r\n *         // depends on the FreeRTOS port being used).\r\n *     }\r\n * }\r\n * @endverbatim\r\n */\r\n#define xTimerChangePeriodFromISR( xTimer, xNewPeriod, pxHigherPriorityTaskWoken ) \\\r\n    xTimerGenericCommand( ( xTimer ), tmrCOMMAND_CHANGE_PERIOD_FROM_ISR, ( xNewPeriod ), ( pxHigherPriorityTaskWoken ), 0U )\r\n\r\n/**\r\n * BaseType_t xTimerResetFromISR(   TimerHandle_t xTimer,\r\n *                                  BaseType_t *pxHigherPriorityTaskWoken );\r\n *\r\n * A version of xTimerReset() that can be called from an interrupt service\r\n * routine.\r\n *\r\n * @param xTimer The handle of the timer that is to be started, reset, or\r\n * restarted.\r\n *\r\n * @param pxHigherPriorityTaskWoken The timer service/daemon task spends most\r\n * of its time in the Blocked state, waiting for messages to arrive on the timer\r\n * command queue.  Calling xTimerResetFromISR() writes a message to the timer\r\n * command queue, so has the potential to transition the timer service/daemon\r\n * task out of the Blocked state.  If calling xTimerResetFromISR() causes the\r\n * timer service/daemon task to leave the Blocked state, and the timer service/\r\n * daemon task has a priority equal to or greater than the currently executing\r\n * task (the task that was interrupted), then *pxHigherPriorityTaskWoken will\r\n * get set to pdTRUE internally within the xTimerResetFromISR() function.  If\r\n * xTimerResetFromISR() sets this value to pdTRUE then a context switch should\r\n * be performed before the interrupt exits.\r\n *\r\n * @return pdFAIL will be returned if the reset command could not be sent to\r\n * the timer command queue.  pdPASS will be returned if the command was\r\n * successfully sent to the timer command queue.  When the command is actually\r\n * processed will depend on the priority of the timer service/daemon task\r\n * relative to other tasks in the system, although the timers expiry time is\r\n * relative to when xTimerResetFromISR() is actually called.  The timer service/daemon\r\n * task priority is set by the configTIMER_TASK_PRIORITY configuration constant.\r\n *\r\n * Example usage:\r\n * @verbatim\r\n * // This scenario assumes xBacklightTimer has already been created.  When a\r\n * // key is pressed, an LCD back-light is switched on.  If 5 seconds pass\r\n * // without a key being pressed, then the LCD back-light is switched off.  In\r\n * // this case, the timer is a one-shot timer, and unlike the example given for\r\n * // the xTimerReset() function, the key press event handler is an interrupt\r\n * // service routine.\r\n *\r\n * // The callback function assigned to the one-shot timer.  In this case the\r\n * // parameter is not used.\r\n * void vBacklightTimerCallback( TimerHandle_t pxTimer )\r\n * {\r\n *     // The timer expired, therefore 5 seconds must have passed since a key\r\n *     // was pressed.  Switch off the LCD back-light.\r\n *     vSetBacklightState( BACKLIGHT_OFF );\r\n * }\r\n *\r\n * // The key press interrupt service routine.\r\n * void vKeyPressEventInterruptHandler( void )\r\n * {\r\n * BaseType_t xHigherPriorityTaskWoken = pdFALSE;\r\n *\r\n *     // Ensure the LCD back-light is on, then reset the timer that is\r\n *     // responsible for turning the back-light off after 5 seconds of\r\n *     // key inactivity.  This is an interrupt service routine so can only\r\n *     // call FreeRTOS API functions that end in \"FromISR\".\r\n *     vSetBacklightState( BACKLIGHT_ON );\r\n *\r\n *     // xTimerStartFromISR() or xTimerResetFromISR() could be called here\r\n *     // as both cause the timer to re-calculate its expiry time.\r\n *     // xHigherPriorityTaskWoken was initialised to pdFALSE when it was\r\n *     // declared (in this function).\r\n *     if( xTimerResetFromISR( xBacklightTimer, &xHigherPriorityTaskWoken ) != pdPASS )\r\n *     {\r\n *         // The reset command was not executed successfully.  Take appropriate\r\n *         // action here.\r\n *     }\r\n *\r\n *     // Perform the rest of the key processing here.\r\n *\r\n *     // If xHigherPriorityTaskWoken equals pdTRUE, then a context switch\r\n *     // should be performed.  The syntax required to perform a context switch\r\n *     // from inside an ISR varies from port to port, and from compiler to\r\n *     // compiler.  Inspect the demos for the port you are using to find the\r\n *     // actual syntax required.\r\n *     if( xHigherPriorityTaskWoken != pdFALSE )\r\n *     {\r\n *         // Call the interrupt safe yield function here (actual function\r\n *         // depends on the FreeRTOS port being used).\r\n *     }\r\n * }\r\n * @endverbatim\r\n */\r\n#define xTimerResetFromISR( xTimer, pxHigherPriorityTaskWoken ) \\\r\n    xTimerGenericCommand( ( xTimer ), tmrCOMMAND_RESET_FROM_ISR, ( xTaskGetTickCountFromISR() ), ( pxHigherPriorityTaskWoken ), 0U )\r\n\r\n\r\n/**\r\n * BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend,\r\n *                                          void *pvParameter1,\r\n *                                          uint32_t ulParameter2,\r\n *                                          BaseType_t *pxHigherPriorityTaskWoken );\r\n *\r\n *\r\n * Used from application interrupt service routines to defer the execution of a\r\n * function to the RTOS daemon task (the timer service task, hence this function\r\n * is implemented in timers.c and is prefixed with 'Timer').\r\n *\r\n * Ideally an interrupt service routine (ISR) is kept as short as possible, but\r\n * sometimes an ISR either has a lot of processing to do, or needs to perform\r\n * processing that is not deterministic.  In these cases\r\n * xTimerPendFunctionCallFromISR() can be used to defer processing of a function\r\n * to the RTOS daemon task.\r\n *\r\n * A mechanism is provided that allows the interrupt to return directly to the\r\n * task that will subsequently execute the pended callback function.  This\r\n * allows the callback function to execute contiguously in time with the\r\n * interrupt - just as if the callback had executed in the interrupt itself.\r\n *\r\n * @param xFunctionToPend The function to execute from the timer service/\r\n * daemon task.  The function must conform to the PendedFunction_t\r\n * prototype.\r\n *\r\n * @param pvParameter1 The value of the callback function's first parameter.\r\n * The parameter has a void * type to allow it to be used to pass any type.\r\n * For example, unsigned longs can be cast to a void *, or the void * can be\r\n * used to point to a structure.\r\n *\r\n * @param ulParameter2 The value of the callback function's second parameter.\r\n *\r\n * @param pxHigherPriorityTaskWoken As mentioned above, calling this function\r\n * will result in a message being sent to the timer daemon task.  If the\r\n * priority of the timer daemon task (which is set using\r\n * configTIMER_TASK_PRIORITY in FreeRTOSConfig.h) is higher than the priority of\r\n * the currently running task (the task the interrupt interrupted) then\r\n * *pxHigherPriorityTaskWoken will be set to pdTRUE within\r\n * xTimerPendFunctionCallFromISR(), indicating that a context switch should be\r\n * requested before the interrupt exits.  For that reason\r\n * *pxHigherPriorityTaskWoken must be initialised to pdFALSE.  See the\r\n * example code below.\r\n *\r\n * @return pdPASS is returned if the message was successfully sent to the\r\n * timer daemon task, otherwise pdFALSE is returned.\r\n *\r\n * Example usage:\r\n * @verbatim\r\n *\r\n *  // The callback function that will execute in the context of the daemon task.\r\n *  // Note callback functions must all use this same prototype.\r\n *  void vProcessInterface( void *pvParameter1, uint32_t ulParameter2 )\r\n *  {\r\n *      BaseType_t xInterfaceToService;\r\n *\r\n *      // The interface that requires servicing is passed in the second\r\n *      // parameter.  The first parameter is not used in this case.\r\n *      xInterfaceToService = ( BaseType_t ) ulParameter2;\r\n *\r\n *      // ...Perform the processing here...\r\n *  }\r\n *\r\n *  // An ISR that receives data packets from multiple interfaces\r\n *  void vAnISR( void )\r\n *  {\r\n *      BaseType_t xInterfaceToService, xHigherPriorityTaskWoken;\r\n *\r\n *      // Query the hardware to determine which interface needs processing.\r\n *      xInterfaceToService = prvCheckInterfaces();\r\n *\r\n *      // The actual processing is to be deferred to a task.  Request the\r\n *      // vProcessInterface() callback function is executed, passing in the\r\n *      // number of the interface that needs processing.  The interface to\r\n *      // service is passed in the second parameter.  The first parameter is\r\n *      // not used in this case.\r\n *      xHigherPriorityTaskWoken = pdFALSE;\r\n *      xTimerPendFunctionCallFromISR( vProcessInterface, NULL, ( uint32_t ) xInterfaceToService, &xHigherPriorityTaskWoken );\r\n *\r\n *      // If xHigherPriorityTaskWoken is now set to pdTRUE then a context\r\n *      // switch should be requested.  The macro used is port specific and will\r\n *      // be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() - refer to\r\n *      // the documentation page for the port being used.\r\n *      portYIELD_FROM_ISR( xHigherPriorityTaskWoken );\r\n *\r\n *  }\r\n * @endverbatim\r\n */\r\n#if ( INCLUDE_xTimerPendFunctionCall == 1 )\r\n    BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend,\r\n                                              void * pvParameter1,\r\n                                              uint32_t ulParameter2,\r\n                                              BaseType_t * pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend,\r\n *                                    void *pvParameter1,\r\n *                                    uint32_t ulParameter2,\r\n *                                    TickType_t xTicksToWait );\r\n *\r\n *\r\n * Used to defer the execution of a function to the RTOS daemon task (the timer\r\n * service task, hence this function is implemented in timers.c and is prefixed\r\n * with 'Timer').\r\n *\r\n * @param xFunctionToPend The function to execute from the timer service/\r\n * daemon task.  The function must conform to the PendedFunction_t\r\n * prototype.\r\n *\r\n * @param pvParameter1 The value of the callback function's first parameter.\r\n * The parameter has a void * type to allow it to be used to pass any type.\r\n * For example, unsigned longs can be cast to a void *, or the void * can be\r\n * used to point to a structure.\r\n *\r\n * @param ulParameter2 The value of the callback function's second parameter.\r\n *\r\n * @param xTicksToWait Calling this function will result in a message being\r\n * sent to the timer daemon task on a queue.  xTicksToWait is the amount of\r\n * time the calling task should remain in the Blocked state (so not using any\r\n * processing time) for space to become available on the timer queue if the\r\n * queue is found to be full.\r\n *\r\n * @return pdPASS is returned if the message was successfully sent to the\r\n * timer daemon task, otherwise pdFALSE is returned.\r\n *\r\n */\r\n#if ( INCLUDE_xTimerPendFunctionCall == 1 )\r\n    BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend,\r\n                                       void * pvParameter1,\r\n                                       uint32_t ulParameter2,\r\n                                       TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/**\r\n * const char * const pcTimerGetName( TimerHandle_t xTimer );\r\n *\r\n * Returns the name that was assigned to a timer when the timer was created.\r\n *\r\n * @param xTimer The handle of the timer being queried.\r\n *\r\n * @return The name assigned to the timer specified by the xTimer parameter.\r\n */\r\nconst char * pcTimerGetName( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * void vTimerSetReloadMode( TimerHandle_t xTimer, const BaseType_t xAutoReload );\r\n *\r\n * Updates a timer to be either an auto-reload timer, in which case the timer\r\n * automatically resets itself each time it expires, or a one-shot timer, in\r\n * which case the timer will only expire once unless it is manually restarted.\r\n *\r\n * @param xTimer The handle of the timer being updated.\r\n *\r\n * @param xAutoReload If xAutoReload is set to pdTRUE then the timer will\r\n * expire repeatedly with a frequency set by the timer's period (see the\r\n * xTimerPeriodInTicks parameter of the xTimerCreate() API function).  If\r\n * xAutoReload is set to pdFALSE then the timer will be a one-shot timer and\r\n * enter the dormant state after it expires.\r\n */\r\nvoid vTimerSetReloadMode( TimerHandle_t xTimer,\r\n                          const BaseType_t xAutoReload ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * BaseType_t xTimerGetReloadMode( TimerHandle_t xTimer );\r\n *\r\n * Queries a timer to determine if it is an auto-reload timer, in which case the timer\r\n * automatically resets itself each time it expires, or a one-shot timer, in\r\n * which case the timer will only expire once unless it is manually restarted.\r\n *\r\n * @param xTimer The handle of the timer being queried.\r\n *\r\n * @return If the timer is an auto-reload timer then pdTRUE is returned, otherwise\r\n * pdFALSE is returned.\r\n */\r\nBaseType_t xTimerGetReloadMode( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer );\r\n *\r\n * Queries a timer to determine if it is an auto-reload timer, in which case the timer\r\n * automatically resets itself each time it expires, or a one-shot timer, in\r\n * which case the timer will only expire once unless it is manually restarted.\r\n *\r\n * @param xTimer The handle of the timer being queried.\r\n *\r\n * @return If the timer is an auto-reload timer then pdTRUE is returned, otherwise\r\n * pdFALSE is returned.\r\n */\r\nUBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * TickType_t xTimerGetPeriod( TimerHandle_t xTimer );\r\n *\r\n * Returns the period of a timer.\r\n *\r\n * @param xTimer The handle of the timer being queried.\r\n *\r\n * @return The period of the timer in ticks.\r\n */\r\nTickType_t xTimerGetPeriod( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer );\r\n *\r\n * Returns the time in ticks at which the timer will expire.  If this is less\r\n * than the current tick count then the expiry time has overflowed from the\r\n * current time.\r\n *\r\n * @param xTimer The handle of the timer being queried.\r\n *\r\n * @return If the timer is running then the time in ticks at which the timer\r\n * will next expire is returned.  If the timer is not running then the return\r\n * value is undefined.\r\n */\r\nTickType_t xTimerGetExpiryTime( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * BaseType_t xTimerGetStaticBuffer( TimerHandle_t xTimer,\r\n *                                   StaticTimer_t ** ppxTimerBuffer );\r\n *\r\n * Retrieve pointer to a statically created timer's data structure\r\n * buffer. This is the same buffer that is supplied at the time of\r\n * creation.\r\n *\r\n * @param xTimer The timer for which to retrieve the buffer.\r\n *\r\n * @param ppxTaskBuffer Used to return a pointer to the timers's data\r\n * structure buffer.\r\n *\r\n * @return pdTRUE if the buffer was retrieved, pdFALSE otherwise.\r\n */\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n    BaseType_t xTimerGetStaticBuffer( TimerHandle_t xTimer,\r\n                                      StaticTimer_t ** ppxTimerBuffer ) PRIVILEGED_FUNCTION;\r\n#endif /* configSUPPORT_STATIC_ALLOCATION */\r\n\r\n/*\r\n * Functions beyond this part are not part of the public API and are intended\r\n * for use by the kernel only.\r\n */\r\nBaseType_t xTimerCreateTimerTask( void ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Splitting the xTimerGenericCommand into two sub functions and making it a macro\r\n * removes a recursion path when called from ISRs. This is primarily for the XCore\r\n * XCC port which detects the recursion path and throws an error during compilation\r\n * when this is not split.\r\n */\r\nBaseType_t xTimerGenericCommandFromTask( TimerHandle_t xTimer,\r\n                                         const BaseType_t xCommandID,\r\n                                         const TickType_t xOptionalValue,\r\n                                         BaseType_t * const pxHigherPriorityTaskWoken,\r\n                                         const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r\n\r\nBaseType_t xTimerGenericCommandFromISR( TimerHandle_t xTimer,\r\n                                        const BaseType_t xCommandID,\r\n                                        const TickType_t xOptionalValue,\r\n                                        BaseType_t * const pxHigherPriorityTaskWoken,\r\n                                        const TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;\r\n\r\n#define xTimerGenericCommand( xTimer, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait )         \\\r\n    ( ( xCommandID ) < tmrFIRST_FROM_ISR_COMMAND ?                                                                  \\\r\n      xTimerGenericCommandFromTask( xTimer, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait ) : \\\r\n      xTimerGenericCommandFromISR( xTimer, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait ) )\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n    void vTimerSetTimerNumber( TimerHandle_t xTimer,\r\n                               UBaseType_t uxTimerNumber ) PRIVILEGED_FUNCTION;\r\n    UBaseType_t uxTimerGetTimerNumber( TimerHandle_t xTimer ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n\r\n/**\r\n * task.h\r\n * @code{c}\r\n * void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer, StackType_t ** ppxTimerTaskStackBuffer, uint32_t *pulTimerTaskStackSize )\r\n * @endcode\r\n *\r\n * This function is used to provide a statically allocated block of memory to FreeRTOS to hold the Timer Task TCB.  This function is required when\r\n * configSUPPORT_STATIC_ALLOCATION is set.  For more information see this URI: https://www.FreeRTOS.org/a00110.html#configSUPPORT_STATIC_ALLOCATION\r\n *\r\n * @param ppxTimerTaskTCBBuffer   A handle to a statically allocated TCB buffer\r\n * @param ppxTimerTaskStackBuffer A handle to a statically allocated Stack buffer for the idle task\r\n * @param pulTimerTaskStackSize   A pointer to the number of elements that will fit in the allocated stack buffer\r\n */\r\n    void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer,\r\n                                         StackType_t ** ppxTimerTaskStackBuffer,\r\n                                         uint32_t * pulTimerTaskStackSize );\r\n\r\n#endif\r\n\r\n#if ( configUSE_DAEMON_TASK_STARTUP_HOOK != 0 )\r\n\r\n/**\r\n *  timers.h\r\n * @code{c}\r\n * void vApplicationDaemonTaskStartupHook( void );\r\n * @endcode\r\n *\r\n * This hook function is called form the timer task once when the task starts running.\r\n */\r\n    /* MISRA Ref 8.6.1 [External linkage] */\r\n    /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-86 */\r\n    /* coverity[misra_c_2012_rule_8_6_violation] */\r\n    void vApplicationDaemonTaskStartupHook( void );\r\n\r\n#endif\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    }\r\n#endif\r\n/* *INDENT-ON* */\r\n#endif /* TIMERS_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/list.c",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n\r\n#include <stdlib.h>\r\n\r\n/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining\r\n * all the API functions to use the MPU wrappers.  That should only be done when\r\n * task.h is included from an application file. */\r\n#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n#include \"FreeRTOS.h\"\r\n#include \"list.h\"\r\n\r\n/* The MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be\r\n * defined for the header files above, but not in this file, in order to\r\n * generate the correct privileged Vs unprivileged linkage and placement. */\r\n#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n/*-----------------------------------------------------------\r\n* PUBLIC LIST API documented in list.h\r\n*----------------------------------------------------------*/\r\n\r\nvoid vListInitialise( List_t * const pxList )\r\n{\r\n    traceENTER_vListInitialise( pxList );\r\n\r\n    /* The list structure contains a list item which is used to mark the\r\n     * end of the list.  To initialise the list the list end is inserted\r\n     * as the only list entry. */\r\n    pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd );\r\n\r\n    listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( &( pxList->xListEnd ) );\r\n\r\n    /* The list end value is the highest possible value in the list to\r\n     * ensure it remains at the end of the list. */\r\n    pxList->xListEnd.xItemValue = portMAX_DELAY;\r\n\r\n    /* The list end next and previous pointers point to itself so we know\r\n     * when the list is empty. */\r\n    pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd );\r\n    pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );\r\n\r\n    /* Initialize the remaining fields of xListEnd when it is a proper ListItem_t */\r\n    #if ( configUSE_MINI_LIST_ITEM == 0 )\r\n    {\r\n        pxList->xListEnd.pvOwner = NULL;\r\n        pxList->xListEnd.pxContainer = NULL;\r\n        listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( &( pxList->xListEnd ) );\r\n    }\r\n    #endif\r\n\r\n    pxList->uxNumberOfItems = ( UBaseType_t ) 0U;\r\n\r\n    /* Write known values into the list if\r\n     * configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */\r\n    listSET_LIST_INTEGRITY_CHECK_1_VALUE( pxList );\r\n    listSET_LIST_INTEGRITY_CHECK_2_VALUE( pxList );\r\n\r\n    traceRETURN_vListInitialise();\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vListInitialiseItem( ListItem_t * const pxItem )\r\n{\r\n    traceENTER_vListInitialiseItem( pxItem );\r\n\r\n    /* Make sure the list item is not recorded as being on a list. */\r\n    pxItem->pxContainer = NULL;\r\n\r\n    /* Write known values into the list item if\r\n     * configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */\r\n    listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem );\r\n    listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem );\r\n\r\n    traceRETURN_vListInitialiseItem();\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vListInsertEnd( List_t * const pxList,\r\n                     ListItem_t * const pxNewListItem )\r\n{\r\n    ListItem_t * const pxIndex = pxList->pxIndex;\r\n\r\n    traceENTER_vListInsertEnd( pxList, pxNewListItem );\r\n\r\n    /* Only effective when configASSERT() is also defined, these tests may catch\r\n     * the list data structures being overwritten in memory.  They will not catch\r\n     * data errors caused by incorrect configuration or use of FreeRTOS. */\r\n    listTEST_LIST_INTEGRITY( pxList );\r\n    listTEST_LIST_ITEM_INTEGRITY( pxNewListItem );\r\n\r\n    /* Insert a new list item into pxList, but rather than sort the list,\r\n     * makes the new list item the last item to be removed by a call to\r\n     * listGET_OWNER_OF_NEXT_ENTRY(). */\r\n    pxNewListItem->pxNext = pxIndex;\r\n    pxNewListItem->pxPrevious = pxIndex->pxPrevious;\r\n\r\n    /* Only used during decision coverage testing. */\r\n    mtCOVERAGE_TEST_DELAY();\r\n\r\n    pxIndex->pxPrevious->pxNext = pxNewListItem;\r\n    pxIndex->pxPrevious = pxNewListItem;\r\n\r\n    /* Remember which list the item is in. */\r\n    pxNewListItem->pxContainer = pxList;\r\n\r\n    ( pxList->uxNumberOfItems )++;\r\n\r\n    traceRETURN_vListInsertEnd();\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vListInsert( List_t * const pxList,\r\n                  ListItem_t * const pxNewListItem )\r\n{\r\n    ListItem_t * pxIterator;\r\n    const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;\r\n\r\n    traceENTER_vListInsert( pxList, pxNewListItem );\r\n\r\n    /* Only effective when configASSERT() is also defined, these tests may catch\r\n     * the list data structures being overwritten in memory.  They will not catch\r\n     * data errors caused by incorrect configuration or use of FreeRTOS. */\r\n    listTEST_LIST_INTEGRITY( pxList );\r\n    listTEST_LIST_ITEM_INTEGRITY( pxNewListItem );\r\n\r\n    /* Insert the new list item into the list, sorted in xItemValue order.\r\n     *\r\n     * If the list already contains a list item with the same item value then the\r\n     * new list item should be placed after it.  This ensures that TCBs which are\r\n     * stored in ready lists (all of which have the same xItemValue value) get a\r\n     * share of the CPU.  However, if the xItemValue is the same as the back marker\r\n     * the iteration loop below will not end.  Therefore the value is checked\r\n     * first, and the algorithm slightly modified if necessary. */\r\n    if( xValueOfInsertion == portMAX_DELAY )\r\n    {\r\n        pxIterator = pxList->xListEnd.pxPrevious;\r\n    }\r\n    else\r\n    {\r\n        /* *** NOTE ***********************************************************\r\n        *  If you find your application is crashing here then likely causes are\r\n        *  listed below.  In addition see https://www.FreeRTOS.org/FAQHelp.html for\r\n        *  more tips, and ensure configASSERT() is defined!\r\n        *  https://www.FreeRTOS.org/a00110.html#configASSERT\r\n        *\r\n        *   1) Stack overflow -\r\n        *      see https://www.FreeRTOS.org/Stacks-and-stack-overflow-checking.html\r\n        *   2) Incorrect interrupt priority assignment, especially on Cortex-M\r\n        *      parts where numerically high priority values denote low actual\r\n        *      interrupt priorities, which can seem counter intuitive.  See\r\n        *      https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html and the definition\r\n        *      of configMAX_SYSCALL_INTERRUPT_PRIORITY on\r\n        *      https://www.FreeRTOS.org/a00110.html\r\n        *   3) Calling an API function from within a critical section or when\r\n        *      the scheduler is suspended, or calling an API function that does\r\n        *      not end in \"FromISR\" from an interrupt.\r\n        *   4) Using a queue or semaphore before it has been initialised or\r\n        *      before the scheduler has been started (are interrupts firing\r\n        *      before vTaskStartScheduler() has been called?).\r\n        *   5) If the FreeRTOS port supports interrupt nesting then ensure that\r\n        *      the priority of the tick interrupt is at or below\r\n        *      configMAX_SYSCALL_INTERRUPT_PRIORITY.\r\n        **********************************************************************/\r\n\r\n        for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext )\r\n        {\r\n            /* There is nothing to do here, just iterating to the wanted\r\n             * insertion position. */\r\n        }\r\n    }\r\n\r\n    pxNewListItem->pxNext = pxIterator->pxNext;\r\n    pxNewListItem->pxNext->pxPrevious = pxNewListItem;\r\n    pxNewListItem->pxPrevious = pxIterator;\r\n    pxIterator->pxNext = pxNewListItem;\r\n\r\n    /* Remember which list the item is in.  This allows fast removal of the\r\n     * item later. */\r\n    pxNewListItem->pxContainer = pxList;\r\n\r\n    ( pxList->uxNumberOfItems )++;\r\n\r\n    traceRETURN_vListInsert();\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nUBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )\r\n{\r\n    /* The list item knows which list it is in.  Obtain the list from the list\r\n     * item. */\r\n    List_t * const pxList = pxItemToRemove->pxContainer;\r\n\r\n    traceENTER_uxListRemove( pxItemToRemove );\r\n\r\n\r\n\r\n    pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;\r\n    pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;\r\n\r\n    /* Only used during decision coverage testing. */\r\n    mtCOVERAGE_TEST_DELAY();\r\n\r\n    /* Make sure the index is left pointing to a valid item. */\r\n    if( pxList->pxIndex == pxItemToRemove )\r\n    {\r\n        pxList->pxIndex = pxItemToRemove->pxPrevious;\r\n    }\r\n    else\r\n    {\r\n        mtCOVERAGE_TEST_MARKER();\r\n    }\r\n\r\n    pxItemToRemove->pxContainer = NULL;\r\n    ( pxList->uxNumberOfItems )--;\r\n\r\n    traceRETURN_uxListRemove( pxList->uxNumberOfItems );\r\n\r\n    return pxList->uxNumberOfItems;\r\n}\r\n/*-----------------------------------------------------------*/\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/portable/GCC/ARM_CM33_NTZ/non_secure/mpu_wrappers_v2_asm.c",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining\r\n * all the API functions to use the MPU wrappers.  That should only be done when\r\n * task.h is included from an application file. */\r\n#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n/* Scheduler includes. */\r\n#include \"FreeRTOS.h\"\r\n#include \"task.h\"\r\n#include \"queue.h\"\r\n#include \"timers.h\"\r\n#include \"event_groups.h\"\r\n#include \"stream_buffer.h\"\r\n#include \"mpu_prototypes.h\"\r\n#include \"mpu_syscall_numbers.h\"\r\n\r\n#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) )\r\n\r\n    #if ( INCLUDE_xTaskDelayUntil == 1 )\r\n\r\n        BaseType_t MPU_xTaskDelayUntil( TickType_t * const pxPreviousWakeTime,\r\n                                        const TickType_t xTimeIncrement ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        BaseType_t MPU_xTaskDelayUntil( TickType_t * const pxPreviousWakeTime,\r\n                                        const TickType_t xTimeIncrement ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_xTaskDelayUntilImpl                       \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_xTaskDelayUntil_Unpriv                        \\n\"\r\n                \" MPU_xTaskDelayUntil_Priv:                             \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_xTaskDelayUntilImpl                         \\n\"\r\n                \" MPU_xTaskDelayUntil_Unpriv:                           \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_xTaskDelayUntil ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( INCLUDE_xTaskDelayUntil == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( INCLUDE_xTaskAbortDelay == 1 )\r\n\r\n        BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_xTaskAbortDelayImpl                       \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_xTaskAbortDelay_Unpriv                        \\n\"\r\n                \" MPU_xTaskAbortDelay_Priv:                             \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_xTaskAbortDelayImpl                         \\n\"\r\n                \" MPU_xTaskAbortDelay_Unpriv:                           \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_xTaskAbortDelay ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( INCLUDE_xTaskAbortDelay == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( INCLUDE_vTaskDelay == 1 )\r\n\r\n        void MPU_vTaskDelay( const TickType_t xTicksToDelay ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        void MPU_vTaskDelay( const TickType_t xTicksToDelay ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_vTaskDelayImpl                            \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_vTaskDelay_Unpriv                             \\n\"\r\n                \" MPU_vTaskDelay_Priv:                                  \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_vTaskDelayImpl                              \\n\"\r\n                \" MPU_vTaskDelay_Unpriv:                                \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_vTaskDelay ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( INCLUDE_vTaskDelay == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( INCLUDE_uxTaskPriorityGet == 1 )\r\n\r\n        UBaseType_t MPU_uxTaskPriorityGet( const TaskHandle_t xTask ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        UBaseType_t MPU_uxTaskPriorityGet( const TaskHandle_t xTask ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_uxTaskPriorityGetImpl                     \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_uxTaskPriorityGet_Unpriv                      \\n\"\r\n                \" MPU_uxTaskPriorityGet_Priv:                           \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_uxTaskPriorityGetImpl                       \\n\"\r\n                \" MPU_uxTaskPriorityGet_Unpriv:                         \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_uxTaskPriorityGet ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( INCLUDE_uxTaskPriorityGet == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( INCLUDE_eTaskGetState == 1 )\r\n\r\n        eTaskState MPU_eTaskGetState( TaskHandle_t xTask ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        eTaskState MPU_eTaskGetState( TaskHandle_t xTask ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_eTaskGetStateImpl                         \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_eTaskGetState_Unpriv                          \\n\"\r\n                \" MPU_eTaskGetState_Priv:                               \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_eTaskGetStateImpl                           \\n\"\r\n                \" MPU_eTaskGetState_Unpriv:                             \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_eTaskGetState ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( INCLUDE_eTaskGetState == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TRACE_FACILITY == 1 )\r\n\r\n        void MPU_vTaskGetInfo( TaskHandle_t xTask,\r\n                               TaskStatus_t * pxTaskStatus,\r\n                               BaseType_t xGetFreeStackSpace,\r\n                               eTaskState eState ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        void MPU_vTaskGetInfo( TaskHandle_t xTask,\r\n                               TaskStatus_t * pxTaskStatus,\r\n                               BaseType_t xGetFreeStackSpace,\r\n                               eTaskState eState ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_vTaskGetInfoImpl                          \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_vTaskGetInfo_Unpriv                           \\n\"\r\n                \" MPU_vTaskGetInfo_Priv:                                \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_vTaskGetInfoImpl                            \\n\"\r\n                \" MPU_vTaskGetInfo_Unpriv:                              \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_vTaskGetInfo ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_TRACE_FACILITY == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 )\r\n\r\n        TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        TaskHandle_t MPU_xTaskGetIdleTaskHandle( void ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_xTaskGetIdleTaskHandleImpl                \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_xTaskGetIdleTaskHandle_Unpriv                 \\n\"\r\n                \" MPU_xTaskGetIdleTaskHandle_Priv:                      \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_xTaskGetIdleTaskHandleImpl                  \\n\"\r\n                \" MPU_xTaskGetIdleTaskHandle_Unpriv:                    \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_xTaskGetIdleTaskHandle ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( INCLUDE_vTaskSuspend == 1 )\r\n\r\n        void MPU_vTaskSuspend( TaskHandle_t xTaskToSuspend ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        void MPU_vTaskSuspend( TaskHandle_t xTaskToSuspend ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_vTaskSuspendImpl                          \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_vTaskSuspend_Unpriv                           \\n\"\r\n                \" MPU_vTaskSuspend_Priv:                                \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_vTaskSuspendImpl                            \\n\"\r\n                \" MPU_vTaskSuspend_Unpriv:                              \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_vTaskSuspend ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( INCLUDE_vTaskSuspend == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( INCLUDE_vTaskSuspend == 1 )\r\n\r\n        void MPU_vTaskResume( TaskHandle_t xTaskToResume ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        void MPU_vTaskResume( TaskHandle_t xTaskToResume ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_vTaskResumeImpl                           \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_vTaskResume_Unpriv                            \\n\"\r\n                \" MPU_vTaskResume_Priv:                                 \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_vTaskResumeImpl                             \\n\"\r\n                \" MPU_vTaskResume_Unpriv:                               \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_vTaskResume ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( INCLUDE_vTaskSuspend == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    TickType_t MPU_xTaskGetTickCount( void ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    TickType_t MPU_xTaskGetTickCount( void ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_xTaskGetTickCountImpl                     \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_xTaskGetTickCount_Unpriv                      \\n\"\r\n            \" MPU_xTaskGetTickCount_Priv:                           \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_xTaskGetTickCountImpl                       \\n\"\r\n            \" MPU_xTaskGetTickCount_Unpriv:                         \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_xTaskGetTickCount ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    UBaseType_t MPU_uxTaskGetNumberOfTasks( void ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    UBaseType_t MPU_uxTaskGetNumberOfTasks( void ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_uxTaskGetNumberOfTasksImpl                \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_uxTaskGetNumberOfTasks_Unpriv                 \\n\"\r\n            \" MPU_uxTaskGetNumberOfTasks_Priv:                      \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_uxTaskGetNumberOfTasksImpl                  \\n\"\r\n            \" MPU_uxTaskGetNumberOfTasks_Unpriv:                    \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_uxTaskGetNumberOfTasks ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configGENERATE_RUN_TIME_STATS == 1 )\r\n\r\n        configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetRunTimeCounter( const TaskHandle_t xTask ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetRunTimeCounter( const TaskHandle_t xTask ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_ulTaskGetRunTimeCounterImpl               \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_ulTaskGetRunTimeCounter_Unpriv                \\n\"\r\n                \" MPU_ulTaskGetRunTimeCounter_Priv:                     \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_ulTaskGetRunTimeCounterImpl                 \\n\"\r\n                \" MPU_ulTaskGetRunTimeCounter_Unpriv:                   \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_ulTaskGetRunTimeCounter ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configGENERATE_RUN_TIME_STATS == 1 )\r\n\r\n        configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetRunTimePercent( const TaskHandle_t xTask ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetRunTimePercent( const TaskHandle_t xTask ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_ulTaskGetRunTimePercentImpl               \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_ulTaskGetRunTimePercent_Unpriv                \\n\"\r\n                \" MPU_ulTaskGetRunTimePercent_Priv:                     \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_ulTaskGetRunTimePercentImpl                 \\n\"\r\n                \" MPU_ulTaskGetRunTimePercent_Unpriv:                   \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_ulTaskGetRunTimePercent ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) )\r\n\r\n        configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimePercent( void ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimePercent( void ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_ulTaskGetIdleRunTimePercentImpl           \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_ulTaskGetIdleRunTimePercent_Unpriv            \\n\"\r\n                \" MPU_ulTaskGetIdleRunTimePercent_Priv:                 \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_ulTaskGetIdleRunTimePercentImpl             \\n\"\r\n                \" MPU_ulTaskGetIdleRunTimePercent_Unpriv:               \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_ulTaskGetIdleRunTimePercent ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) )\r\n\r\n        configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimeCounter( void ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        configRUN_TIME_COUNTER_TYPE MPU_ulTaskGetIdleRunTimeCounter( void ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_ulTaskGetIdleRunTimeCounterImpl           \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_ulTaskGetIdleRunTimeCounter_Unpriv            \\n\"\r\n                \" MPU_ulTaskGetIdleRunTimeCounter_Priv:                 \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_ulTaskGetIdleRunTimeCounterImpl             \\n\"\r\n                \" MPU_ulTaskGetIdleRunTimeCounter_Unpriv:               \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_ulTaskGetIdleRunTimeCounter ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_APPLICATION_TASK_TAG == 1 )\r\n\r\n        void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask,\r\n                                             TaskHookFunction_t pxHookFunction ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        void MPU_vTaskSetApplicationTaskTag( TaskHandle_t xTask,\r\n                                             TaskHookFunction_t pxHookFunction ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_vTaskSetApplicationTaskTagImpl            \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_vTaskSetApplicationTaskTag_Unpriv             \\n\"\r\n                \" MPU_vTaskSetApplicationTaskTag_Priv:                  \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_vTaskSetApplicationTaskTagImpl              \\n\"\r\n                \" MPU_vTaskSetApplicationTaskTag_Unpriv:                \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_vTaskSetApplicationTaskTag ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_APPLICATION_TASK_TAG == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_APPLICATION_TASK_TAG == 1 )\r\n\r\n        TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        TaskHookFunction_t MPU_xTaskGetApplicationTaskTag( TaskHandle_t xTask ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_xTaskGetApplicationTaskTagImpl            \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_xTaskGetApplicationTaskTag_Unpriv             \\n\"\r\n                \" MPU_xTaskGetApplicationTaskTag_Priv:                  \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_xTaskGetApplicationTaskTagImpl              \\n\"\r\n                \" MPU_xTaskGetApplicationTaskTag_Unpriv:                \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_xTaskGetApplicationTaskTag ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_APPLICATION_TASK_TAG == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 )\r\n\r\n        void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet,\r\n                                                    BaseType_t xIndex,\r\n                                                    void * pvValue ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        void MPU_vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet,\r\n                                                    BaseType_t xIndex,\r\n                                                    void * pvValue ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_vTaskSetThreadLocalStoragePointerImpl     \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_vTaskSetThreadLocalStoragePointer_Unpriv      \\n\"\r\n                \" MPU_vTaskSetThreadLocalStoragePointer_Priv:           \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_vTaskSetThreadLocalStoragePointerImpl       \\n\"\r\n                \" MPU_vTaskSetThreadLocalStoragePointer_Unpriv:         \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_vTaskSetThreadLocalStoragePointer ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 )\r\n\r\n        void * MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery,\r\n                                                       BaseType_t xIndex ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        void * MPU_pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery,\r\n                                                       BaseType_t xIndex ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_pvTaskGetThreadLocalStoragePointerImpl    \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_pvTaskGetThreadLocalStoragePointer_Unpriv     \\n\"\r\n                \" MPU_pvTaskGetThreadLocalStoragePointer_Priv:          \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_pvTaskGetThreadLocalStoragePointerImpl      \\n\"\r\n                \" MPU_pvTaskGetThreadLocalStoragePointer_Unpriv:        \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_pvTaskGetThreadLocalStoragePointer ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TRACE_FACILITY == 1 )\r\n\r\n        UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray,\r\n                                              const UBaseType_t uxArraySize,\r\n                                              configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        UBaseType_t MPU_uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray,\r\n                                              const UBaseType_t uxArraySize,\r\n                                              configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_uxTaskGetSystemStateImpl                  \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_uxTaskGetSystemState_Unpriv                   \\n\"\r\n                \" MPU_uxTaskGetSystemState_Priv:                        \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_uxTaskGetSystemStateImpl                    \\n\"\r\n                \" MPU_uxTaskGetSystemState_Unpriv:                      \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_uxTaskGetSystemState ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_TRACE_FACILITY == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 )\r\n\r\n        UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        UBaseType_t MPU_uxTaskGetStackHighWaterMark( TaskHandle_t xTask ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_uxTaskGetStackHighWaterMarkImpl           \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_uxTaskGetStackHighWaterMark_Unpriv            \\n\"\r\n                \" MPU_uxTaskGetStackHighWaterMark_Priv:                 \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_uxTaskGetStackHighWaterMarkImpl             \\n\"\r\n                \" MPU_uxTaskGetStackHighWaterMark_Unpriv:               \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_uxTaskGetStackHighWaterMark ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 )\r\n\r\n        configSTACK_DEPTH_TYPE MPU_uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        configSTACK_DEPTH_TYPE MPU_uxTaskGetStackHighWaterMark2( TaskHandle_t xTask ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_uxTaskGetStackHighWaterMark2Impl          \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_uxTaskGetStackHighWaterMark2_Unpriv           \\n\"\r\n                \" MPU_uxTaskGetStackHighWaterMark2_Priv:                \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_uxTaskGetStackHighWaterMark2Impl            \\n\"\r\n                \" MPU_uxTaskGetStackHighWaterMark2_Unpriv:              \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_uxTaskGetStackHighWaterMark2 ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) )\r\n\r\n        TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        TaskHandle_t MPU_xTaskGetCurrentTaskHandle( void ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_xTaskGetCurrentTaskHandleImpl             \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_xTaskGetCurrentTaskHandle_Unpriv              \\n\"\r\n                \" MPU_xTaskGetCurrentTaskHandle_Priv:                   \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_xTaskGetCurrentTaskHandleImpl               \\n\"\r\n                \" MPU_xTaskGetCurrentTaskHandle_Unpriv:                 \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_xTaskGetCurrentTaskHandle ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( INCLUDE_xTaskGetSchedulerState == 1 )\r\n\r\n        BaseType_t MPU_xTaskGetSchedulerState( void ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        BaseType_t MPU_xTaskGetSchedulerState( void ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_xTaskGetSchedulerStateImpl                \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_xTaskGetSchedulerState_Unpriv                 \\n\"\r\n                \" MPU_xTaskGetSchedulerState_Priv:                      \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_xTaskGetSchedulerStateImpl                  \\n\"\r\n                \" MPU_xTaskGetSchedulerState_Unpriv:                    \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_xTaskGetSchedulerState ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( INCLUDE_xTaskGetSchedulerState == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    void MPU_vTaskSetTimeOutState( TimeOut_t * const pxTimeOut ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_vTaskSetTimeOutStateImpl                  \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_vTaskSetTimeOutState_Unpriv                   \\n\"\r\n            \" MPU_vTaskSetTimeOutState_Priv:                        \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_vTaskSetTimeOutStateImpl                    \\n\"\r\n            \" MPU_vTaskSetTimeOutState_Unpriv:                      \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_vTaskSetTimeOutState ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut,\r\n                                         TickType_t * const pxTicksToWait ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    BaseType_t MPU_xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut,\r\n                                         TickType_t * const pxTicksToWait ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_xTaskCheckForTimeOutImpl                  \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_xTaskCheckForTimeOut_Unpriv                   \\n\"\r\n            \" MPU_xTaskCheckForTimeOut_Priv:                        \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_xTaskCheckForTimeOutImpl                    \\n\"\r\n            \" MPU_xTaskCheckForTimeOut_Unpriv:                      \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_xTaskCheckForTimeOut ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TASK_NOTIFICATIONS == 1 )\r\n\r\n        BaseType_t MPU_xTaskGenericNotifyEntry( const xTaskGenericNotifyParams_t * pxParams ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        BaseType_t MPU_xTaskGenericNotifyEntry( const xTaskGenericNotifyParams_t * pxParams ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_xTaskGenericNotifyImpl                    \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_xTaskGenericNotify_Unpriv                     \\n\"\r\n                \" MPU_xTaskGenericNotify_Priv:                          \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_xTaskGenericNotifyImpl                      \\n\"\r\n                \" MPU_xTaskGenericNotify_Unpriv:                        \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_xTaskGenericNotify ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TASK_NOTIFICATIONS == 1 )\r\n\r\n        BaseType_t MPU_xTaskGenericNotifyWaitEntry( const xTaskGenericNotifyWaitParams_t * pxParams ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        BaseType_t MPU_xTaskGenericNotifyWaitEntry( const xTaskGenericNotifyWaitParams_t * pxParams ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_xTaskGenericNotifyWaitImpl                \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_xTaskGenericNotifyWait_Unpriv                 \\n\"\r\n                \" MPU_xTaskGenericNotifyWait_Priv:                      \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_xTaskGenericNotifyWaitImpl                  \\n\"\r\n                \" MPU_xTaskGenericNotifyWait_Unpriv:                    \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_xTaskGenericNotifyWait ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TASK_NOTIFICATIONS == 1 )\r\n\r\n        uint32_t MPU_ulTaskGenericNotifyTake( UBaseType_t uxIndexToWaitOn,\r\n                                              BaseType_t xClearCountOnExit,\r\n                                              TickType_t xTicksToWait ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        uint32_t MPU_ulTaskGenericNotifyTake( UBaseType_t uxIndexToWaitOn,\r\n                                              BaseType_t xClearCountOnExit,\r\n                                              TickType_t xTicksToWait ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_ulTaskGenericNotifyTakeImpl               \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_ulTaskGenericNotifyTake_Unpriv                \\n\"\r\n                \" MPU_ulTaskGenericNotifyTake_Priv:                     \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_ulTaskGenericNotifyTakeImpl                 \\n\"\r\n                \" MPU_ulTaskGenericNotifyTake_Unpriv:                   \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_ulTaskGenericNotifyTake ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TASK_NOTIFICATIONS == 1 )\r\n\r\n        BaseType_t MPU_xTaskGenericNotifyStateClear( TaskHandle_t xTask,\r\n                                                     UBaseType_t uxIndexToClear ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        BaseType_t MPU_xTaskGenericNotifyStateClear( TaskHandle_t xTask,\r\n                                                     UBaseType_t uxIndexToClear ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_xTaskGenericNotifyStateClearImpl          \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_xTaskGenericNotifyStateClear_Unpriv           \\n\"\r\n                \" MPU_xTaskGenericNotifyStateClear_Priv:                \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_xTaskGenericNotifyStateClearImpl            \\n\"\r\n                \" MPU_xTaskGenericNotifyStateClear_Unpriv:              \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_xTaskGenericNotifyStateClear ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TASK_NOTIFICATIONS == 1 )\r\n\r\n        uint32_t MPU_ulTaskGenericNotifyValueClear( TaskHandle_t xTask,\r\n                                                    UBaseType_t uxIndexToClear,\r\n                                                    uint32_t ulBitsToClear ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        uint32_t MPU_ulTaskGenericNotifyValueClear( TaskHandle_t xTask,\r\n                                                    UBaseType_t uxIndexToClear,\r\n                                                    uint32_t ulBitsToClear ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_ulTaskGenericNotifyValueClearImpl         \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_ulTaskGenericNotifyValueClear_Unpriv          \\n\"\r\n                \" MPU_ulTaskGenericNotifyValueClear_Priv:               \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_ulTaskGenericNotifyValueClearImpl           \\n\"\r\n                \" MPU_ulTaskGenericNotifyValueClear_Unpriv:             \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_ulTaskGenericNotifyValueClear ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue,\r\n                                      const void * const pvItemToQueue,\r\n                                      TickType_t xTicksToWait,\r\n                                      const BaseType_t xCopyPosition ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    BaseType_t MPU_xQueueGenericSend( QueueHandle_t xQueue,\r\n                                      const void * const pvItemToQueue,\r\n                                      TickType_t xTicksToWait,\r\n                                      const BaseType_t xCopyPosition ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_xQueueGenericSendImpl                     \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_xQueueGenericSend_Unpriv                      \\n\"\r\n            \" MPU_xQueueGenericSend_Priv:                           \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_xQueueGenericSendImpl                       \\n\"\r\n            \" MPU_xQueueGenericSend_Unpriv:                         \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_xQueueGenericSend ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t xQueue ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    UBaseType_t MPU_uxQueueMessagesWaiting( const QueueHandle_t xQueue ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_uxQueueMessagesWaitingImpl                \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_uxQueueMessagesWaiting_Unpriv                 \\n\"\r\n            \" MPU_uxQueueMessagesWaiting_Priv:                      \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_uxQueueMessagesWaitingImpl                  \\n\"\r\n            \" MPU_uxQueueMessagesWaiting_Unpriv:                    \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_uxQueueMessagesWaiting ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    UBaseType_t MPU_uxQueueSpacesAvailable( const QueueHandle_t xQueue ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_uxQueueSpacesAvailableImpl                \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_uxQueueSpacesAvailable_Unpriv                 \\n\"\r\n            \" MPU_uxQueueSpacesAvailable_Priv:                      \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_uxQueueSpacesAvailableImpl                  \\n\"\r\n            \" MPU_uxQueueSpacesAvailable_Unpriv:                    \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_uxQueueSpacesAvailable ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    BaseType_t MPU_xQueueReceive( QueueHandle_t xQueue,\r\n                                  void * const pvBuffer,\r\n                                  TickType_t xTicksToWait ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    BaseType_t MPU_xQueueReceive( QueueHandle_t xQueue,\r\n                                  void * const pvBuffer,\r\n                                  TickType_t xTicksToWait ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_xQueueReceiveImpl                         \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_xQueueReceive_Unpriv                          \\n\"\r\n            \" MPU_xQueueReceive_Priv:                               \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_xQueueReceiveImpl                           \\n\"\r\n            \" MPU_xQueueReceive_Unpriv:                             \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_xQueueReceive ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    BaseType_t MPU_xQueuePeek( QueueHandle_t xQueue,\r\n                               void * const pvBuffer,\r\n                               TickType_t xTicksToWait ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    BaseType_t MPU_xQueuePeek( QueueHandle_t xQueue,\r\n                               void * const pvBuffer,\r\n                               TickType_t xTicksToWait ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_xQueuePeekImpl                            \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_xQueuePeek_Unpriv                             \\n\"\r\n            \" MPU_xQueuePeek_Priv:                                  \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_xQueuePeekImpl                              \\n\"\r\n            \" MPU_xQueuePeek_Unpriv:                                \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_xQueuePeek ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    BaseType_t MPU_xQueueSemaphoreTake( QueueHandle_t xQueue,\r\n                                        TickType_t xTicksToWait ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    BaseType_t MPU_xQueueSemaphoreTake( QueueHandle_t xQueue,\r\n                                        TickType_t xTicksToWait ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_xQueueSemaphoreTakeImpl                   \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_xQueueSemaphoreTake_Unpriv                    \\n\"\r\n            \" MPU_xQueueSemaphoreTake_Priv:                         \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_xQueueSemaphoreTakeImpl                     \\n\"\r\n            \" MPU_xQueueSemaphoreTake_Unpriv:                       \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_xQueueSemaphoreTake ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) )\r\n\r\n        TaskHandle_t MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        TaskHandle_t MPU_xQueueGetMutexHolder( QueueHandle_t xSemaphore ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_xQueueGetMutexHolderImpl                  \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_xQueueGetMutexHolder_Unpriv                   \\n\"\r\n                \" MPU_xQueueGetMutexHolder_Priv:                        \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_xQueueGetMutexHolderImpl                    \\n\"\r\n                \" MPU_xQueueGetMutexHolder_Unpriv:                      \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_xQueueGetMutexHolder ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_RECURSIVE_MUTEXES == 1 )\r\n\r\n        BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex,\r\n                                                 TickType_t xTicksToWait ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        BaseType_t MPU_xQueueTakeMutexRecursive( QueueHandle_t xMutex,\r\n                                                 TickType_t xTicksToWait ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_xQueueTakeMutexRecursiveImpl              \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_xQueueTakeMutexRecursive_Unpriv               \\n\"\r\n                \" MPU_xQueueTakeMutexRecursive_Priv:                    \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_xQueueTakeMutexRecursiveImpl                \\n\"\r\n                \" MPU_xQueueTakeMutexRecursive_Unpriv:                  \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_xQueueTakeMutexRecursive ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_RECURSIVE_MUTEXES == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_RECURSIVE_MUTEXES == 1 )\r\n\r\n        BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        BaseType_t MPU_xQueueGiveMutexRecursive( QueueHandle_t pxMutex ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_xQueueGiveMutexRecursiveImpl              \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_xQueueGiveMutexRecursive_Unpriv               \\n\"\r\n                \" MPU_xQueueGiveMutexRecursive_Priv:                    \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_xQueueGiveMutexRecursiveImpl                \\n\"\r\n                \" MPU_xQueueGiveMutexRecursive_Unpriv:                  \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_xQueueGiveMutexRecursive ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_RECURSIVE_MUTEXES == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_QUEUE_SETS == 1 )\r\n\r\n        QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet,\r\n                                                        const TickType_t xTicksToWait ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        QueueSetMemberHandle_t MPU_xQueueSelectFromSet( QueueSetHandle_t xQueueSet,\r\n                                                        const TickType_t xTicksToWait ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_xQueueSelectFromSetImpl                   \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_xQueueSelectFromSet_Unpriv                    \\n\"\r\n                \" MPU_xQueueSelectFromSet_Priv:                         \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_xQueueSelectFromSetImpl                     \\n\"\r\n                \" MPU_xQueueSelectFromSet_Unpriv:                       \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_xQueueSelectFromSet ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_QUEUE_SETS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_QUEUE_SETS == 1 )\r\n\r\n        BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore,\r\n                                       QueueSetHandle_t xQueueSet ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        BaseType_t MPU_xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore,\r\n                                       QueueSetHandle_t xQueueSet ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_xQueueAddToSetImpl                        \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_xQueueAddToSet_Unpriv                         \\n\"\r\n                \" MPU_xQueueAddToSet_Priv:                              \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_xQueueAddToSetImpl                          \\n\"\r\n                \" MPU_xQueueAddToSet_Unpriv:                            \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_xQueueAddToSet ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_QUEUE_SETS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configQUEUE_REGISTRY_SIZE > 0 )\r\n\r\n        void MPU_vQueueAddToRegistry( QueueHandle_t xQueue,\r\n                                      const char * pcName ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        void MPU_vQueueAddToRegistry( QueueHandle_t xQueue,\r\n                                      const char * pcName ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_vQueueAddToRegistryImpl                   \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_vQueueAddToRegistry_Unpriv                    \\n\"\r\n                \" MPU_vQueueAddToRegistry_Priv:                         \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_vQueueAddToRegistryImpl                     \\n\"\r\n                \" MPU_vQueueAddToRegistry_Unpriv:                       \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_vQueueAddToRegistry ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configQUEUE_REGISTRY_SIZE > 0 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configQUEUE_REGISTRY_SIZE > 0 )\r\n\r\n        void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        void MPU_vQueueUnregisterQueue( QueueHandle_t xQueue ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_vQueueUnregisterQueueImpl                 \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_vQueueUnregisterQueue_Unpriv                  \\n\"\r\n                \" MPU_vQueueUnregisterQueue_Priv:                       \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_vQueueUnregisterQueueImpl                   \\n\"\r\n                \" MPU_vQueueUnregisterQueue_Unpriv:                     \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_vQueueUnregisterQueue ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configQUEUE_REGISTRY_SIZE > 0 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configQUEUE_REGISTRY_SIZE > 0 )\r\n\r\n        const char * MPU_pcQueueGetName( QueueHandle_t xQueue ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        const char * MPU_pcQueueGetName( QueueHandle_t xQueue ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_pcQueueGetNameImpl                        \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_pcQueueGetName_Unpriv                         \\n\"\r\n                \" MPU_pcQueueGetName_Priv:                              \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_pcQueueGetNameImpl                          \\n\"\r\n                \" MPU_pcQueueGetName_Unpriv:                            \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_pcQueueGetName ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configQUEUE_REGISTRY_SIZE > 0 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TIMERS == 1 )\r\n\r\n        void * MPU_pvTimerGetTimerID( const TimerHandle_t xTimer ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        void * MPU_pvTimerGetTimerID( const TimerHandle_t xTimer ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_pvTimerGetTimerIDImpl                     \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_pvTimerGetTimerID_Unpriv                      \\n\"\r\n                \" MPU_pvTimerGetTimerID_Priv:                           \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_pvTimerGetTimerIDImpl                       \\n\"\r\n                \" MPU_pvTimerGetTimerID_Unpriv:                         \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_pvTimerGetTimerID ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_TIMERS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TIMERS == 1 )\r\n\r\n        void MPU_vTimerSetTimerID( TimerHandle_t xTimer,\r\n                                   void * pvNewID ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        void MPU_vTimerSetTimerID( TimerHandle_t xTimer,\r\n                                   void * pvNewID ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_vTimerSetTimerIDImpl                      \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_vTimerSetTimerID_Unpriv                       \\n\"\r\n                \" MPU_vTimerSetTimerID_Priv:                            \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_vTimerSetTimerIDImpl                        \\n\"\r\n                \" MPU_vTimerSetTimerID_Unpriv:                          \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_vTimerSetTimerID ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_TIMERS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TIMERS == 1 )\r\n\r\n        BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        BaseType_t MPU_xTimerIsTimerActive( TimerHandle_t xTimer ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_xTimerIsTimerActiveImpl                   \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_xTimerIsTimerActive_Unpriv                    \\n\"\r\n                \" MPU_xTimerIsTimerActive_Priv:                         \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_xTimerIsTimerActiveImpl                     \\n\"\r\n                \" MPU_xTimerIsTimerActive_Unpriv:                       \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_xTimerIsTimerActive ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_TIMERS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TIMERS == 1 )\r\n\r\n        TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        TaskHandle_t MPU_xTimerGetTimerDaemonTaskHandle( void ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_xTimerGetTimerDaemonTaskHandleImpl        \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_xTimerGetTimerDaemonTaskHandle_Unpriv         \\n\"\r\n                \" MPU_xTimerGetTimerDaemonTaskHandle_Priv:              \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_xTimerGetTimerDaemonTaskHandleImpl          \\n\"\r\n                \" MPU_xTimerGetTimerDaemonTaskHandle_Unpriv:            \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_xTimerGetTimerDaemonTaskHandle ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_TIMERS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TIMERS == 1 )\r\n\r\n        BaseType_t MPU_xTimerGenericCommandFromTaskEntry( const xTimerGenericCommandFromTaskParams_t * pxParams ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        BaseType_t MPU_xTimerGenericCommandFromTaskEntry( const xTimerGenericCommandFromTaskParams_t * pxParams ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                               \\n\"\r\n                \" .extern MPU_xTimerGenericCommandFromTaskImpl                  \\n\"\r\n                \"                                                               \\n\"\r\n                \" push {r0}                                                     \\n\"\r\n                \" mrs r0, control                                               \\n\"\r\n                \" tst r0, #1                                                    \\n\"\r\n                \" bne MPU_xTimerGenericCommandFromTask_Unpriv                   \\n\"\r\n                \" MPU_xTimerGenericCommandFromTask_Priv:                        \\n\"\r\n                \"     pop {r0}                                                  \\n\"\r\n                \"     b MPU_xTimerGenericCommandFromTaskImpl                    \\n\"\r\n                \" MPU_xTimerGenericCommandFromTask_Unpriv:                      \\n\"\r\n                \"     pop {r0}                                                  \\n\"\r\n                \"     svc %0                                                    \\n\"\r\n                \"                                                               \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_xTimerGenericCommandFromTask ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_TIMERS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TIMERS == 1 )\r\n\r\n        const char * MPU_pcTimerGetName( TimerHandle_t xTimer ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        const char * MPU_pcTimerGetName( TimerHandle_t xTimer ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_pcTimerGetNameImpl                        \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_pcTimerGetName_Unpriv                         \\n\"\r\n                \" MPU_pcTimerGetName_Priv:                              \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_pcTimerGetNameImpl                          \\n\"\r\n                \" MPU_pcTimerGetName_Unpriv:                            \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_pcTimerGetName ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_TIMERS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TIMERS == 1 )\r\n\r\n        void MPU_vTimerSetReloadMode( TimerHandle_t xTimer,\r\n                                      const BaseType_t uxAutoReload ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        void MPU_vTimerSetReloadMode( TimerHandle_t xTimer,\r\n                                      const BaseType_t uxAutoReload ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_vTimerSetReloadModeImpl                   \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_vTimerSetReloadMode_Unpriv                    \\n\"\r\n                \" MPU_vTimerSetReloadMode_Priv:                         \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_vTimerSetReloadModeImpl                     \\n\"\r\n                \" MPU_vTimerSetReloadMode_Unpriv:                       \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_vTimerSetReloadMode ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_TIMERS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TIMERS == 1 )\r\n\r\n        BaseType_t MPU_xTimerGetReloadMode( TimerHandle_t xTimer ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        BaseType_t MPU_xTimerGetReloadMode( TimerHandle_t xTimer ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_xTimerGetReloadModeImpl                   \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_xTimerGetReloadMode_Unpriv                    \\n\"\r\n                \" MPU_xTimerGetReloadMode_Priv:                         \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_xTimerGetReloadModeImpl                     \\n\"\r\n                \" MPU_xTimerGetReloadMode_Unpriv:                       \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_xTimerGetReloadMode ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_TIMERS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TIMERS == 1 )\r\n\r\n        UBaseType_t MPU_uxTimerGetReloadMode( TimerHandle_t xTimer ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        UBaseType_t MPU_uxTimerGetReloadMode( TimerHandle_t xTimer ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_uxTimerGetReloadModeImpl                  \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_uxTimerGetReloadMode_Unpriv                   \\n\"\r\n                \" MPU_uxTimerGetReloadMode_Priv:                        \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_uxTimerGetReloadModeImpl                    \\n\"\r\n                \" MPU_uxTimerGetReloadMode_Unpriv:                      \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_uxTimerGetReloadMode ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_TIMERS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TIMERS == 1 )\r\n\r\n        TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        TickType_t MPU_xTimerGetPeriod( TimerHandle_t xTimer ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_xTimerGetPeriodImpl                       \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_xTimerGetPeriod_Unpriv                        \\n\"\r\n                \" MPU_xTimerGetPeriod_Priv:                             \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_xTimerGetPeriodImpl                         \\n\"\r\n                \" MPU_xTimerGetPeriod_Unpriv:                           \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_xTimerGetPeriod ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_TIMERS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TIMERS == 1 )\r\n\r\n        TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        TickType_t MPU_xTimerGetExpiryTime( TimerHandle_t xTimer ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_xTimerGetExpiryTimeImpl                   \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_xTimerGetExpiryTime_Unpriv                    \\n\"\r\n                \" MPU_xTimerGetExpiryTime_Priv:                         \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_xTimerGetExpiryTimeImpl                     \\n\"\r\n                \" MPU_xTimerGetExpiryTime_Unpriv:                       \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_xTimerGetExpiryTime ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /* if ( configUSE_TIMERS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n    EventBits_t MPU_xEventGroupWaitBitsEntry( const xEventGroupWaitBitsParams_t * pxParams ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    EventBits_t MPU_xEventGroupWaitBitsEntry( const xEventGroupWaitBitsParams_t * pxParams ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_xEventGroupWaitBitsImpl                   \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_xEventGroupWaitBits_Unpriv                    \\n\"\r\n            \" MPU_xEventGroupWaitBits_Priv:                         \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_xEventGroupWaitBitsImpl                     \\n\"\r\n            \" MPU_xEventGroupWaitBits_Unpriv:                       \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_xEventGroupWaitBits ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    EventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup,\r\n                                          const EventBits_t uxBitsToClear ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    EventBits_t MPU_xEventGroupClearBits( EventGroupHandle_t xEventGroup,\r\n                                          const EventBits_t uxBitsToClear ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_xEventGroupClearBitsImpl                  \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_xEventGroupClearBits_Unpriv                   \\n\"\r\n            \" MPU_xEventGroupClearBits_Priv:                        \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_xEventGroupClearBitsImpl                    \\n\"\r\n            \" MPU_xEventGroupClearBits_Unpriv:                      \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_xEventGroupClearBits ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    EventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup,\r\n                                        const EventBits_t uxBitsToSet ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    EventBits_t MPU_xEventGroupSetBits( EventGroupHandle_t xEventGroup,\r\n                                        const EventBits_t uxBitsToSet ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_xEventGroupSetBitsImpl                    \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_xEventGroupSetBits_Unpriv                     \\n\"\r\n            \" MPU_xEventGroupSetBits_Priv:                          \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_xEventGroupSetBitsImpl                      \\n\"\r\n            \" MPU_xEventGroupSetBits_Unpriv:                        \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_xEventGroupSetBits ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    EventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup,\r\n                                     const EventBits_t uxBitsToSet,\r\n                                     const EventBits_t uxBitsToWaitFor,\r\n                                     TickType_t xTicksToWait ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    EventBits_t MPU_xEventGroupSync( EventGroupHandle_t xEventGroup,\r\n                                     const EventBits_t uxBitsToSet,\r\n                                     const EventBits_t uxBitsToWaitFor,\r\n                                     TickType_t xTicksToWait ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_xEventGroupSyncImpl                       \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_xEventGroupSync_Unpriv                        \\n\"\r\n            \" MPU_xEventGroupSync_Priv:                             \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_xEventGroupSyncImpl                         \\n\"\r\n            \" MPU_xEventGroupSync_Unpriv:                           \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_xEventGroupSync ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TRACE_FACILITY == 1 )\r\n\r\n        UBaseType_t MPU_uxEventGroupGetNumber( void * xEventGroup ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        UBaseType_t MPU_uxEventGroupGetNumber( void * xEventGroup ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_uxEventGroupGetNumberImpl                 \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_uxEventGroupGetNumber_Unpriv                  \\n\"\r\n                \" MPU_uxEventGroupGetNumber_Priv:                       \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_uxEventGroupGetNumberImpl                   \\n\"\r\n                \" MPU_uxEventGroupGetNumber_Unpriv:                     \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_uxEventGroupGetNumber ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /*( configUSE_TRACE_FACILITY == 1 )*/\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TRACE_FACILITY == 1 )\r\n\r\n        void MPU_vEventGroupSetNumber( void * xEventGroup,\r\n                                       UBaseType_t uxEventGroupNumber ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n        void MPU_vEventGroupSetNumber( void * xEventGroup,\r\n                                       UBaseType_t uxEventGroupNumber ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n        {\r\n            __asm volatile\r\n            (\r\n                \" .syntax unified                                       \\n\"\r\n                \" .extern MPU_vEventGroupSetNumberImpl                  \\n\"\r\n                \"                                                       \\n\"\r\n                \" push {r0}                                             \\n\"\r\n                \" mrs r0, control                                       \\n\"\r\n                \" tst r0, #1                                            \\n\"\r\n                \" bne MPU_vEventGroupSetNumber_Unpriv                   \\n\"\r\n                \" MPU_vEventGroupSetNumber_Priv:                        \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     b MPU_vEventGroupSetNumberImpl                    \\n\"\r\n                \" MPU_vEventGroupSetNumber_Unpriv:                      \\n\"\r\n                \"     pop {r0}                                          \\n\"\r\n                \"     svc %0                                            \\n\"\r\n                \"                                                       \\n\"\r\n                : : \"i\" ( SYSTEM_CALL_vEventGroupSetNumber ) : \"memory\"\r\n            );\r\n        }\r\n\r\n    #endif /*( configUSE_TRACE_FACILITY == 1 )*/\r\n/*-----------------------------------------------------------*/\r\n\r\n    size_t MPU_xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,\r\n                                  const void * pvTxData,\r\n                                  size_t xDataLengthBytes,\r\n                                  TickType_t xTicksToWait ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    size_t MPU_xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,\r\n                                  const void * pvTxData,\r\n                                  size_t xDataLengthBytes,\r\n                                  TickType_t xTicksToWait ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_xStreamBufferSendImpl                     \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_xStreamBufferSend_Unpriv                      \\n\"\r\n            \" MPU_xStreamBufferSend_Priv:                           \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_xStreamBufferSendImpl                       \\n\"\r\n            \" MPU_xStreamBufferSend_Unpriv:                         \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_xStreamBufferSend ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    size_t MPU_xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,\r\n                                     void * pvRxData,\r\n                                     size_t xBufferLengthBytes,\r\n                                     TickType_t xTicksToWait ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    size_t MPU_xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,\r\n                                     void * pvRxData,\r\n                                     size_t xBufferLengthBytes,\r\n                                     TickType_t xTicksToWait ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_xStreamBufferReceiveImpl                  \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_xStreamBufferReceive_Unpriv                   \\n\"\r\n            \" MPU_xStreamBufferReceive_Priv:                        \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_xStreamBufferReceiveImpl                    \\n\"\r\n            \" MPU_xStreamBufferReceive_Unpriv:                      \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_xStreamBufferReceive ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    BaseType_t MPU_xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    BaseType_t MPU_xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_xStreamBufferIsFullImpl                   \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_xStreamBufferIsFull_Unpriv                    \\n\"\r\n            \" MPU_xStreamBufferIsFull_Priv:                         \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_xStreamBufferIsFullImpl                     \\n\"\r\n            \" MPU_xStreamBufferIsFull_Unpriv:                       \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_xStreamBufferIsFull ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    BaseType_t MPU_xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    BaseType_t MPU_xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_xStreamBufferIsEmptyImpl                  \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_xStreamBufferIsEmpty_Unpriv                   \\n\"\r\n            \" MPU_xStreamBufferIsEmpty_Priv:                        \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_xStreamBufferIsEmptyImpl                    \\n\"\r\n            \" MPU_xStreamBufferIsEmpty_Unpriv:                      \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_xStreamBufferIsEmpty ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    size_t MPU_xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    size_t MPU_xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_xStreamBufferSpacesAvailableImpl          \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_xStreamBufferSpacesAvailable_Unpriv           \\n\"\r\n            \" MPU_xStreamBufferSpacesAvailable_Priv:                \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_xStreamBufferSpacesAvailableImpl            \\n\"\r\n            \" MPU_xStreamBufferSpacesAvailable_Unpriv:              \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_xStreamBufferSpacesAvailable ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    size_t MPU_xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    size_t MPU_xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_xStreamBufferBytesAvailableImpl           \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_xStreamBufferBytesAvailable_Unpriv            \\n\"\r\n            \" MPU_xStreamBufferBytesAvailable_Priv:                 \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_xStreamBufferBytesAvailableImpl             \\n\"\r\n            \" MPU_xStreamBufferBytesAvailable_Unpriv:               \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_xStreamBufferBytesAvailable ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    BaseType_t MPU_xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer,\r\n                                                 size_t xTriggerLevel ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    BaseType_t MPU_xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer,\r\n                                                 size_t xTriggerLevel ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_xStreamBufferSetTriggerLevelImpl          \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_xStreamBufferSetTriggerLevel_Unpriv           \\n\"\r\n            \" MPU_xStreamBufferSetTriggerLevel_Priv:                \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_xStreamBufferSetTriggerLevelImpl            \\n\"\r\n            \" MPU_xStreamBufferSetTriggerLevel_Unpriv:              \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_xStreamBufferSetTriggerLevel ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    size_t MPU_xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) __attribute__( ( naked ) ) FREERTOS_SYSTEM_CALL;\r\n\r\n    size_t MPU_xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer ) /* __attribute__ (( naked )) FREERTOS_SYSTEM_CALL */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                       \\n\"\r\n            \" .extern MPU_xStreamBufferNextMessageLengthBytesImpl   \\n\"\r\n            \"                                                       \\n\"\r\n            \" push {r0}                                             \\n\"\r\n            \" mrs r0, control                                       \\n\"\r\n            \" tst r0, #1                                            \\n\"\r\n            \" bne MPU_xStreamBufferNextMessageLengthBytes_Unpriv    \\n\"\r\n            \" MPU_xStreamBufferNextMessageLengthBytes_Priv:         \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     b MPU_xStreamBufferNextMessageLengthBytesImpl     \\n\"\r\n            \" MPU_xStreamBufferNextMessageLengthBytes_Unpriv:       \\n\"\r\n            \"     pop {r0}                                          \\n\"\r\n            \"     svc %0                                            \\n\"\r\n            \"                                                       \\n\"\r\n            : : \"i\" ( SYSTEM_CALL_xStreamBufferNextMessageLengthBytes ) : \"memory\"\r\n        );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n#endif /* ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/portable/GCC/ARM_CM33_NTZ/non_secure/port.c",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining\r\n * all the API functions to use the MPU wrappers. That should only be done when\r\n * task.h is included from an application file. */\r\n#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n/* Scheduler includes. */\r\n#include \"FreeRTOS.h\"\r\n#include \"task.h\"\r\n\r\n/* MPU includes. */\r\n#include \"mpu_wrappers.h\"\r\n#include \"mpu_syscall_numbers.h\"\r\n\r\n/* Portasm includes. */\r\n#include \"portasm.h\"\r\n\r\n#if ( configENABLE_TRUSTZONE == 1 )\r\n    /* Secure components includes. */\r\n    #include \"secure_context.h\"\r\n    #include \"secure_init.h\"\r\n#endif /* configENABLE_TRUSTZONE */\r\n\r\n#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n/**\r\n * The FreeRTOS Cortex M33 port can be configured to run on the Secure Side only\r\n * i.e. the processor boots as secure and never jumps to the non-secure side.\r\n * The Trust Zone support in the port must be disabled in order to run FreeRTOS\r\n * on the secure side. The following are the valid configuration seetings:\r\n *\r\n * 1. Run FreeRTOS on the Secure Side:\r\n *    configRUN_FREERTOS_SECURE_ONLY = 1 and configENABLE_TRUSTZONE = 0\r\n *\r\n * 2. Run FreeRTOS on the Non-Secure Side with Secure Side function call support:\r\n *    configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 1\r\n *\r\n * 3. Run FreeRTOS on the Non-Secure Side only i.e. no Secure Side function call support:\r\n *    configRUN_FREERTOS_SECURE_ONLY = 0 and configENABLE_TRUSTZONE = 0\r\n */\r\n#if ( ( configRUN_FREERTOS_SECURE_ONLY == 1 ) && ( configENABLE_TRUSTZONE == 1 ) )\r\n    #error TrustZone needs to be disabled in order to run FreeRTOS on the Secure Side.\r\n#endif\r\n\r\n/**\r\n * Cortex-M23 does not have non-secure PSPLIM. We should use PSPLIM on Cortex-M23\r\n * only when FreeRTOS runs on secure side.\r\n */\r\n#if ( ( portHAS_ARMV8M_MAIN_EXTENSION == 0 ) && ( configRUN_FREERTOS_SECURE_ONLY == 0 ) )\r\n    #define portUSE_PSPLIM_REGISTER    0\r\n#else\r\n    #define portUSE_PSPLIM_REGISTER    1\r\n#endif\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief Prototype of all Interrupt Service Routines (ISRs).\r\n */\r\ntypedef void ( * portISR_t )( void );\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief Constants required to manipulate the NVIC.\r\n */\r\n#define portNVIC_SYSTICK_CTRL_REG             ( *( ( volatile uint32_t * ) 0xe000e010 ) )\r\n#define portNVIC_SYSTICK_LOAD_REG             ( *( ( volatile uint32_t * ) 0xe000e014 ) )\r\n#define portNVIC_SYSTICK_CURRENT_VALUE_REG    ( *( ( volatile uint32_t * ) 0xe000e018 ) )\r\n#define portNVIC_SHPR3_REG                    ( *( ( volatile uint32_t * ) 0xe000ed20 ) )\r\n#define portNVIC_SYSTICK_ENABLE_BIT           ( 1UL << 0UL )\r\n#define portNVIC_SYSTICK_INT_BIT              ( 1UL << 1UL )\r\n#define portNVIC_SYSTICK_CLK_BIT              ( 1UL << 2UL )\r\n#define portNVIC_SYSTICK_COUNT_FLAG_BIT       ( 1UL << 16UL )\r\n#define portNVIC_PEND_SYSTICK_CLEAR_BIT       ( 1UL << 25UL )\r\n#define portNVIC_PEND_SYSTICK_SET_BIT         ( 1UL << 26UL )\r\n#define portMIN_INTERRUPT_PRIORITY            ( 255UL )\r\n#define portNVIC_PENDSV_PRI                   ( portMIN_INTERRUPT_PRIORITY << 16UL )\r\n#define portNVIC_SYSTICK_PRI                  ( portMIN_INTERRUPT_PRIORITY << 24UL )\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief Constants required to manipulate the SCB.\r\n */\r\n#define portSCB_VTOR_REG                      ( *( ( portISR_t ** ) 0xe000ed08 ) )\r\n#define portSCB_SYS_HANDLER_CTRL_STATE_REG    ( *( ( volatile uint32_t * ) 0xe000ed24 ) )\r\n#define portSCB_MEM_FAULT_ENABLE_BIT          ( 1UL << 16UL )\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief Constants used to check the installation of the FreeRTOS interrupt handlers.\r\n */\r\n#define portVECTOR_INDEX_SVC       ( 11 )\r\n#define portVECTOR_INDEX_PENDSV    ( 14 )\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief Constants required to check the validity of an interrupt priority.\r\n */\r\n#define portNVIC_SHPR2_REG                 ( *( ( volatile uint32_t * ) 0xE000ED1C ) )\r\n#define portFIRST_USER_INTERRUPT_NUMBER    ( 16 )\r\n#define portNVIC_IP_REGISTERS_OFFSET_16    ( 0xE000E3F0 )\r\n#define portAIRCR_REG                      ( *( ( volatile uint32_t * ) 0xE000ED0C ) )\r\n#define portTOP_BIT_OF_BYTE                ( ( uint8_t ) 0x80 )\r\n#define portMAX_PRIGROUP_BITS              ( ( uint8_t ) 7 )\r\n#define portPRIORITY_GROUP_MASK            ( 0x07UL << 8UL )\r\n#define portPRIGROUP_SHIFT                 ( 8UL )\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief Constants used during system call enter and exit.\r\n */\r\n#define portPSR_STACK_PADDING_MASK              ( 1UL << 9UL )\r\n#define portEXC_RETURN_STACK_FRAME_TYPE_MASK    ( 1UL << 4UL )\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief Constants required to manipulate the FPU.\r\n */\r\n#define portCPACR               ( ( volatile uint32_t * ) 0xe000ed88 )              /* Coprocessor Access Control Register. */\r\n#define portCPACR_CP10_VALUE    ( 3UL )\r\n#define portCPACR_CP11_VALUE    portCPACR_CP10_VALUE\r\n#define portCPACR_CP10_POS      ( 20UL )\r\n#define portCPACR_CP11_POS      ( 22UL )\r\n\r\n#define portFPCCR               ( ( volatile uint32_t * ) 0xe000ef34 )              /* Floating Point Context Control Register. */\r\n#define portFPCCR_ASPEN_POS     ( 31UL )\r\n#define portFPCCR_ASPEN_MASK    ( 1UL << portFPCCR_ASPEN_POS )\r\n#define portFPCCR_LSPEN_POS     ( 30UL )\r\n#define portFPCCR_LSPEN_MASK    ( 1UL << portFPCCR_LSPEN_POS )\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief Offsets in the stack to the parameters when inside the SVC handler.\r\n */\r\n#define portOFFSET_TO_LR     ( 5 )\r\n#define portOFFSET_TO_PC     ( 6 )\r\n#define portOFFSET_TO_PSR    ( 7 )\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief Constants required to manipulate the MPU.\r\n */\r\n#define portMPU_TYPE_REG                        ( *( ( volatile uint32_t * ) 0xe000ed90 ) )\r\n#define portMPU_CTRL_REG                        ( *( ( volatile uint32_t * ) 0xe000ed94 ) )\r\n#define portMPU_RNR_REG                         ( *( ( volatile uint32_t * ) 0xe000ed98 ) )\r\n\r\n#define portMPU_RBAR_REG                        ( *( ( volatile uint32_t * ) 0xe000ed9c ) )\r\n#define portMPU_RLAR_REG                        ( *( ( volatile uint32_t * ) 0xe000eda0 ) )\r\n\r\n#define portMPU_RBAR_A1_REG                     ( *( ( volatile uint32_t * ) 0xe000eda4 ) )\r\n#define portMPU_RLAR_A1_REG                     ( *( ( volatile uint32_t * ) 0xe000eda8 ) )\r\n\r\n#define portMPU_RBAR_A2_REG                     ( *( ( volatile uint32_t * ) 0xe000edac ) )\r\n#define portMPU_RLAR_A2_REG                     ( *( ( volatile uint32_t * ) 0xe000edb0 ) )\r\n\r\n#define portMPU_RBAR_A3_REG                     ( *( ( volatile uint32_t * ) 0xe000edb4 ) )\r\n#define portMPU_RLAR_A3_REG                     ( *( ( volatile uint32_t * ) 0xe000edb8 ) )\r\n\r\n#define portMPU_MAIR0_REG                       ( *( ( volatile uint32_t * ) 0xe000edc0 ) )\r\n#define portMPU_MAIR1_REG                       ( *( ( volatile uint32_t * ) 0xe000edc4 ) )\r\n\r\n#define portMPU_RBAR_ADDRESS_MASK               ( 0xffffffe0 ) /* Must be 32-byte aligned. */\r\n#define portMPU_RLAR_ADDRESS_MASK               ( 0xffffffe0 ) /* Must be 32-byte aligned. */\r\n\r\n#define portMPU_RBAR_ACCESS_PERMISSIONS_MASK    ( 3UL << 1UL )\r\n\r\n#define portMPU_MAIR_ATTR0_POS                  ( 0UL )\r\n#define portMPU_MAIR_ATTR0_MASK                 ( 0x000000ff )\r\n\r\n#define portMPU_MAIR_ATTR1_POS                  ( 8UL )\r\n#define portMPU_MAIR_ATTR1_MASK                 ( 0x0000ff00 )\r\n\r\n#define portMPU_MAIR_ATTR2_POS                  ( 16UL )\r\n#define portMPU_MAIR_ATTR2_MASK                 ( 0x00ff0000 )\r\n\r\n#define portMPU_MAIR_ATTR3_POS                  ( 24UL )\r\n#define portMPU_MAIR_ATTR3_MASK                 ( 0xff000000 )\r\n\r\n#define portMPU_MAIR_ATTR4_POS                  ( 0UL )\r\n#define portMPU_MAIR_ATTR4_MASK                 ( 0x000000ff )\r\n\r\n#define portMPU_MAIR_ATTR5_POS                  ( 8UL )\r\n#define portMPU_MAIR_ATTR5_MASK                 ( 0x0000ff00 )\r\n\r\n#define portMPU_MAIR_ATTR6_POS                  ( 16UL )\r\n#define portMPU_MAIR_ATTR6_MASK                 ( 0x00ff0000 )\r\n\r\n#define portMPU_MAIR_ATTR7_POS                  ( 24UL )\r\n#define portMPU_MAIR_ATTR7_MASK                 ( 0xff000000 )\r\n\r\n#define portMPU_RLAR_ATTR_INDEX0                ( 0UL << 1UL )\r\n#define portMPU_RLAR_ATTR_INDEX1                ( 1UL << 1UL )\r\n#define portMPU_RLAR_ATTR_INDEX2                ( 2UL << 1UL )\r\n#define portMPU_RLAR_ATTR_INDEX3                ( 3UL << 1UL )\r\n#define portMPU_RLAR_ATTR_INDEX4                ( 4UL << 1UL )\r\n#define portMPU_RLAR_ATTR_INDEX5                ( 5UL << 1UL )\r\n#define portMPU_RLAR_ATTR_INDEX6                ( 6UL << 1UL )\r\n#define portMPU_RLAR_ATTR_INDEX7                ( 7UL << 1UL )\r\n\r\n#define portMPU_RLAR_REGION_ENABLE              ( 1UL )\r\n\r\n/* Enable privileged access to unmapped region. */\r\n#define portMPU_PRIV_BACKGROUND_ENABLE_BIT      ( 1UL << 2UL )\r\n\r\n/* Enable MPU. */\r\n#define portMPU_ENABLE_BIT                      ( 1UL << 0UL )\r\n\r\n/* Expected value of the portMPU_TYPE register. */\r\n#define portEXPECTED_MPU_TYPE_VALUE             ( configTOTAL_MPU_REGIONS << 8UL )\r\n\r\n/* Extract first address of the MPU region as encoded in the\r\n * RBAR (Region Base Address Register) value. */\r\n#define portEXTRACT_FIRST_ADDRESS_FROM_RBAR( rbar ) \\\r\n    ( ( rbar ) & portMPU_RBAR_ADDRESS_MASK )\r\n\r\n/* Extract last address of the MPU region as encoded in the\r\n * RLAR (Region Limit Address Register) value. */\r\n#define portEXTRACT_LAST_ADDRESS_FROM_RLAR( rlar ) \\\r\n    ( ( ( rlar ) & portMPU_RLAR_ADDRESS_MASK ) | ~portMPU_RLAR_ADDRESS_MASK )\r\n\r\n/* Does addr lies within [start, end] address range? */\r\n#define portIS_ADDRESS_WITHIN_RANGE( addr, start, end ) \\\r\n    ( ( ( addr ) >= ( start ) ) && ( ( addr ) <= ( end ) ) )\r\n\r\n/* Is the access request satisfied by the available permissions? */\r\n#define portIS_AUTHORIZED( accessRequest, permissions ) \\\r\n    ( ( ( permissions ) & ( accessRequest ) ) == accessRequest )\r\n\r\n/* Max value that fits in a uint32_t type. */\r\n#define portUINT32_MAX    ( ~( ( uint32_t ) 0 ) )\r\n\r\n/* Check if adding a and b will result in overflow. */\r\n#define portADD_UINT32_WILL_OVERFLOW( a, b )    ( ( a ) > ( portUINT32_MAX - ( b ) ) )\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief The maximum 24-bit number.\r\n *\r\n * It is needed because the systick is a 24-bit counter.\r\n */\r\n#define portMAX_24_BIT_NUMBER       ( 0xffffffUL )\r\n\r\n/**\r\n * @brief A fiddle factor to estimate the number of SysTick counts that would\r\n * have occurred while the SysTick counter is stopped during tickless idle\r\n * calculations.\r\n */\r\n#define portMISSED_COUNTS_FACTOR    ( 94UL )\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief Constants required to set up the initial stack.\r\n */\r\n#define portINITIAL_XPSR    ( 0x01000000 )\r\n\r\n#if ( configRUN_FREERTOS_SECURE_ONLY == 1 )\r\n\r\n/**\r\n * @brief Initial EXC_RETURN value.\r\n *\r\n *     FF         FF         FF         FD\r\n * 1111 1111  1111 1111  1111 1111  1111 1101\r\n *\r\n * Bit[6] - 1 --> The exception was taken from the Secure state.\r\n * Bit[5] - 1 --> Do not skip stacking of additional state context.\r\n * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context.\r\n * Bit[3] - 1 --> Return to the Thread mode.\r\n * Bit[2] - 1 --> Restore registers from the process stack.\r\n * Bit[1] - 0 --> Reserved, 0.\r\n * Bit[0] - 1 --> The exception was taken to the Secure state.\r\n */\r\n    #define portINITIAL_EXC_RETURN    ( 0xfffffffd )\r\n#else\r\n\r\n/**\r\n * @brief Initial EXC_RETURN value.\r\n *\r\n *     FF         FF         FF         BC\r\n * 1111 1111  1111 1111  1111 1111  1011 1100\r\n *\r\n * Bit[6] - 0 --> The exception was taken from the Non-Secure state.\r\n * Bit[5] - 1 --> Do not skip stacking of additional state context.\r\n * Bit[4] - 1 --> The PE did not allocate space on the stack for FP context.\r\n * Bit[3] - 1 --> Return to the Thread mode.\r\n * Bit[2] - 1 --> Restore registers from the process stack.\r\n * Bit[1] - 0 --> Reserved, 0.\r\n * Bit[0] - 0 --> The exception was taken to the Non-Secure state.\r\n */\r\n    #define portINITIAL_EXC_RETURN    ( 0xffffffbc )\r\n#endif /* configRUN_FREERTOS_SECURE_ONLY */\r\n\r\n/**\r\n * @brief CONTROL register privileged bit mask.\r\n *\r\n * Bit[0] in CONTROL register tells the privilege:\r\n *  Bit[0] = 0 ==> The task is privileged.\r\n *  Bit[0] = 1 ==> The task is not privileged.\r\n */\r\n#define portCONTROL_PRIVILEGED_MASK         ( 1UL << 0UL )\r\n\r\n/**\r\n * @brief Initial CONTROL register values.\r\n */\r\n#define portINITIAL_CONTROL_UNPRIVILEGED    ( 0x3 )\r\n#define portINITIAL_CONTROL_PRIVILEGED      ( 0x2 )\r\n\r\n/**\r\n * @brief Let the user override the default SysTick clock rate.  If defined by the\r\n * user, this symbol must equal the SysTick clock rate when the CLK bit is 0 in the\r\n * configuration register.\r\n */\r\n#ifndef configSYSTICK_CLOCK_HZ\r\n    #define configSYSTICK_CLOCK_HZ             ( configCPU_CLOCK_HZ )\r\n    /* Ensure the SysTick is clocked at the same frequency as the core. */\r\n    #define portNVIC_SYSTICK_CLK_BIT_CONFIG    ( portNVIC_SYSTICK_CLK_BIT )\r\n#else\r\n    /* Select the option to clock SysTick not at the same frequency as the core. */\r\n    #define portNVIC_SYSTICK_CLK_BIT_CONFIG    ( 0 )\r\n#endif\r\n\r\n/**\r\n * @brief Let the user override the pre-loading of the initial LR with the\r\n * address of prvTaskExitError() in case it messes up unwinding of the stack\r\n * in the debugger.\r\n */\r\n#ifdef configTASK_RETURN_ADDRESS\r\n    #define portTASK_RETURN_ADDRESS    configTASK_RETURN_ADDRESS\r\n#else\r\n    #define portTASK_RETURN_ADDRESS    prvTaskExitError\r\n#endif\r\n\r\n/**\r\n * @brief If portPRELOAD_REGISTERS then registers will be given an initial value\r\n * when a task is created. This helps in debugging at the cost of code size.\r\n */\r\n#define portPRELOAD_REGISTERS    1\r\n\r\n/**\r\n * @brief A task is created without a secure context, and must call\r\n * portALLOCATE_SECURE_CONTEXT() to give itself a secure context before it makes\r\n * any secure calls.\r\n */\r\n#define portNO_SECURE_CONTEXT    0\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief Used to catch tasks that attempt to return from their implementing\r\n * function.\r\n */\r\nstatic void prvTaskExitError( void );\r\n\r\n#if ( configENABLE_MPU == 1 )\r\n\r\n/**\r\n * @brief Extract MPU region's access permissions from the Region Base Address\r\n * Register (RBAR) value.\r\n *\r\n * @param ulRBARValue RBAR value for the MPU region.\r\n *\r\n * @return uint32_t Access permissions.\r\n */\r\n    static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) PRIVILEGED_FUNCTION;\r\n#endif /* configENABLE_MPU */\r\n\r\n#if ( configENABLE_MPU == 1 )\r\n\r\n/**\r\n * @brief Setup the Memory Protection Unit (MPU).\r\n */\r\n    static void prvSetupMPU( void ) PRIVILEGED_FUNCTION;\r\n#endif /* configENABLE_MPU */\r\n\r\n#if ( configENABLE_FPU == 1 )\r\n\r\n/**\r\n * @brief Setup the Floating Point Unit (FPU).\r\n */\r\n    static void prvSetupFPU( void ) PRIVILEGED_FUNCTION;\r\n#endif /* configENABLE_FPU */\r\n\r\n/**\r\n * @brief Setup the timer to generate the tick interrupts.\r\n *\r\n * The implementation in this file is weak to allow application writers to\r\n * change the timer used to generate the tick interrupt.\r\n */\r\nvoid vPortSetupTimerInterrupt( void ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * @brief Checks whether the current execution context is interrupt.\r\n *\r\n * @return pdTRUE if the current execution context is interrupt, pdFALSE\r\n * otherwise.\r\n */\r\nBaseType_t xPortIsInsideInterrupt( void );\r\n\r\n/**\r\n * @brief Yield the processor.\r\n */\r\nvoid vPortYield( void ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * @brief Enter critical section.\r\n */\r\nvoid vPortEnterCritical( void ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * @brief Exit from critical section.\r\n */\r\nvoid vPortExitCritical( void ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * @brief SysTick handler.\r\n */\r\nvoid SysTick_Handler( void ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * @brief C part of SVC handler.\r\n */\r\nportDONT_DISCARD void vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) PRIVILEGED_FUNCTION;\r\n\r\n#if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) )\r\n\r\n/**\r\n * @brief Sets up the system call stack so that upon returning from\r\n * SVC, the system call stack is used.\r\n *\r\n * @param pulTaskStack The current SP when the SVC was raised.\r\n * @param ulLR The value of Link Register (EXC_RETURN) in the SVC handler.\r\n * @param ucSystemCallNumber The system call number of the system call.\r\n */\r\n    void vSystemCallEnter( uint32_t * pulTaskStack,\r\n                           uint32_t ulLR,\r\n                           uint8_t ucSystemCallNumber ) PRIVILEGED_FUNCTION;\r\n\r\n#endif /* ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) */\r\n\r\n#if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) )\r\n\r\n/**\r\n * @brief Raise SVC for exiting from a system call.\r\n */\r\n    void vRequestSystemCallExit( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;\r\n\r\n#endif /* ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) */\r\n\r\n#if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) )\r\n\r\n/**\r\n * @brief Sets up the task stack so that upon returning from\r\n * SVC, the task stack is used again.\r\n *\r\n * @param pulSystemCallStack The current SP when the SVC was raised.\r\n * @param ulLR The value of Link Register (EXC_RETURN) in the SVC handler.\r\n */\r\n    void vSystemCallExit( uint32_t * pulSystemCallStack,\r\n                          uint32_t ulLR ) PRIVILEGED_FUNCTION;\r\n\r\n#endif /* ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) */\r\n\r\n#if ( configENABLE_MPU == 1 )\r\n\r\n/**\r\n * @brief Checks whether or not the calling task is privileged.\r\n *\r\n * @return pdTRUE if the calling task is privileged, pdFALSE otherwise.\r\n */\r\n    BaseType_t xPortIsTaskPrivileged( void ) PRIVILEGED_FUNCTION;\r\n\r\n#endif /* configENABLE_MPU == 1 */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) && ( configENABLE_ACCESS_CONTROL_LIST == 1 ) )\r\n\r\n/**\r\n * @brief This variable is set to pdTRUE when the scheduler is started.\r\n */\r\n    PRIVILEGED_DATA static BaseType_t xSchedulerRunning = pdFALSE;\r\n\r\n#endif\r\n\r\n/**\r\n * @brief Each task maintains its own interrupt status in the critical nesting\r\n * variable.\r\n */\r\nPRIVILEGED_DATA static volatile uint32_t ulCriticalNesting = 0xaaaaaaaaUL;\r\n\r\n#if ( configENABLE_TRUSTZONE == 1 )\r\n\r\n/**\r\n * @brief Saved as part of the task context to indicate which context the\r\n * task is using on the secure side.\r\n */\r\n    PRIVILEGED_DATA portDONT_DISCARD volatile SecureContextHandle_t xSecureContext = portNO_SECURE_CONTEXT;\r\n#endif /* configENABLE_TRUSTZONE */\r\n\r\n/**\r\n * @brief Used by the portASSERT_IF_INTERRUPT_PRIORITY_INVALID() macro to ensure\r\n * FreeRTOS API functions are not called from interrupts that have been assigned\r\n * a priority above configMAX_SYSCALL_INTERRUPT_PRIORITY.\r\n */\r\n#if ( ( configASSERT_DEFINED == 1 ) && ( portHAS_ARMV8M_MAIN_EXTENSION == 1 ) )\r\n\r\n    static uint8_t ucMaxSysCallPriority = 0;\r\n    static uint32_t ulMaxPRIGROUPValue = 0;\r\n    static const volatile uint8_t * const pcInterruptPriorityRegisters = ( const volatile uint8_t * ) portNVIC_IP_REGISTERS_OFFSET_16;\r\n\r\n#endif /* #if ( ( configASSERT_DEFINED == 1 ) && ( portHAS_ARMV8M_MAIN_EXTENSION == 1 ) ) */\r\n\r\n#if ( configUSE_TICKLESS_IDLE == 1 )\r\n\r\n/**\r\n * @brief The number of SysTick increments that make up one tick period.\r\n */\r\n    PRIVILEGED_DATA static uint32_t ulTimerCountsForOneTick = 0;\r\n\r\n/**\r\n * @brief The maximum number of tick periods that can be suppressed is\r\n * limited by the 24 bit resolution of the SysTick timer.\r\n */\r\n    PRIVILEGED_DATA static uint32_t xMaximumPossibleSuppressedTicks = 0;\r\n\r\n/**\r\n * @brief Compensate for the CPU cycles that pass while the SysTick is\r\n * stopped (low power functionality only).\r\n */\r\n    PRIVILEGED_DATA static uint32_t ulStoppedTimerCompensation = 0;\r\n#endif /* configUSE_TICKLESS_IDLE */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TICKLESS_IDLE == 1 )\r\n    __attribute__( ( weak ) ) void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime )\r\n    {\r\n        uint32_t ulReloadValue, ulCompleteTickPeriods, ulCompletedSysTickDecrements, ulSysTickDecrementsLeft;\r\n        TickType_t xModifiableIdleTime;\r\n\r\n        /* Make sure the SysTick reload value does not overflow the counter. */\r\n        if( xExpectedIdleTime > xMaximumPossibleSuppressedTicks )\r\n        {\r\n            xExpectedIdleTime = xMaximumPossibleSuppressedTicks;\r\n        }\r\n\r\n        /* Enter a critical section but don't use the taskENTER_CRITICAL()\r\n         * method as that will mask interrupts that should exit sleep mode. */\r\n        __asm volatile ( \"cpsid i\" ::: \"memory\" );\r\n        __asm volatile ( \"dsb\" );\r\n        __asm volatile ( \"isb\" );\r\n\r\n        /* If a context switch is pending or a task is waiting for the scheduler\r\n         * to be unsuspended then abandon the low power entry. */\r\n        if( eTaskConfirmSleepModeStatus() == eAbortSleep )\r\n        {\r\n            /* Re-enable interrupts - see comments above the cpsid instruction\r\n             * above. */\r\n            __asm volatile ( \"cpsie i\" ::: \"memory\" );\r\n        }\r\n        else\r\n        {\r\n            /* Stop the SysTick momentarily.  The time the SysTick is stopped for\r\n             * is accounted for as best it can be, but using the tickless mode will\r\n             * inevitably result in some tiny drift of the time maintained by the\r\n             * kernel with respect to calendar time. */\r\n            portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT );\r\n\r\n            /* Use the SysTick current-value register to determine the number of\r\n             * SysTick decrements remaining until the next tick interrupt.  If the\r\n             * current-value register is zero, then there are actually\r\n             * ulTimerCountsForOneTick decrements remaining, not zero, because the\r\n             * SysTick requests the interrupt when decrementing from 1 to 0. */\r\n            ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG;\r\n\r\n            if( ulSysTickDecrementsLeft == 0 )\r\n            {\r\n                ulSysTickDecrementsLeft = ulTimerCountsForOneTick;\r\n            }\r\n\r\n            /* Calculate the reload value required to wait xExpectedIdleTime\r\n             * tick periods.  -1 is used because this code normally executes part\r\n             * way through the first tick period.  But if the SysTick IRQ is now\r\n             * pending, then clear the IRQ, suppressing the first tick, and correct\r\n             * the reload value to reflect that the second tick period is already\r\n             * underway.  The expected idle time is always at least two ticks. */\r\n            ulReloadValue = ulSysTickDecrementsLeft + ( ulTimerCountsForOneTick * ( xExpectedIdleTime - 1UL ) );\r\n\r\n            if( ( portNVIC_INT_CTRL_REG & portNVIC_PEND_SYSTICK_SET_BIT ) != 0 )\r\n            {\r\n                portNVIC_INT_CTRL_REG = portNVIC_PEND_SYSTICK_CLEAR_BIT;\r\n                ulReloadValue -= ulTimerCountsForOneTick;\r\n            }\r\n\r\n            if( ulReloadValue > ulStoppedTimerCompensation )\r\n            {\r\n                ulReloadValue -= ulStoppedTimerCompensation;\r\n            }\r\n\r\n            /* Set the new reload value. */\r\n            portNVIC_SYSTICK_LOAD_REG = ulReloadValue;\r\n\r\n            /* Clear the SysTick count flag and set the count value back to\r\n             * zero. */\r\n            portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;\r\n\r\n            /* Restart SysTick. */\r\n            portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;\r\n\r\n            /* Sleep until something happens.  configPRE_SLEEP_PROCESSING() can\r\n             * set its parameter to 0 to indicate that its implementation contains\r\n             * its own wait for interrupt or wait for event instruction, and so wfi\r\n             * should not be executed again.  However, the original expected idle\r\n             * time variable must remain unmodified, so a copy is taken. */\r\n            xModifiableIdleTime = xExpectedIdleTime;\r\n            configPRE_SLEEP_PROCESSING( xModifiableIdleTime );\r\n\r\n            if( xModifiableIdleTime > 0 )\r\n            {\r\n                __asm volatile ( \"dsb\" ::: \"memory\" );\r\n                __asm volatile ( \"wfi\" );\r\n                __asm volatile ( \"isb\" );\r\n            }\r\n\r\n            configPOST_SLEEP_PROCESSING( xExpectedIdleTime );\r\n\r\n            /* Re-enable interrupts to allow the interrupt that brought the MCU\r\n             * out of sleep mode to execute immediately.  See comments above\r\n             * the cpsid instruction above. */\r\n            __asm volatile ( \"cpsie i\" ::: \"memory\" );\r\n            __asm volatile ( \"dsb\" );\r\n            __asm volatile ( \"isb\" );\r\n\r\n            /* Disable interrupts again because the clock is about to be stopped\r\n             * and interrupts that execute while the clock is stopped will increase\r\n             * any slippage between the time maintained by the RTOS and calendar\r\n             * time. */\r\n            __asm volatile ( \"cpsid i\" ::: \"memory\" );\r\n            __asm volatile ( \"dsb\" );\r\n            __asm volatile ( \"isb\" );\r\n\r\n            /* Disable the SysTick clock without reading the\r\n             * portNVIC_SYSTICK_CTRL_REG register to ensure the\r\n             * portNVIC_SYSTICK_COUNT_FLAG_BIT is not cleared if it is set.  Again,\r\n             * the time the SysTick is stopped for is accounted for as best it can\r\n             * be, but using the tickless mode will inevitably result in some tiny\r\n             * drift of the time maintained by the kernel with respect to calendar\r\n             * time*/\r\n            portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT );\r\n\r\n            /* Determine whether the SysTick has already counted to zero. */\r\n            if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )\r\n            {\r\n                uint32_t ulCalculatedLoadValue;\r\n\r\n                /* The tick interrupt ended the sleep (or is now pending), and\r\n                 * a new tick period has started.  Reset portNVIC_SYSTICK_LOAD_REG\r\n                 * with whatever remains of the new tick period. */\r\n                ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL ) - ( ulReloadValue - portNVIC_SYSTICK_CURRENT_VALUE_REG );\r\n\r\n                /* Don't allow a tiny value, or values that have somehow\r\n                 * underflowed because the post sleep hook did something\r\n                 * that took too long or because the SysTick current-value register\r\n                 * is zero. */\r\n                if( ( ulCalculatedLoadValue <= ulStoppedTimerCompensation ) || ( ulCalculatedLoadValue > ulTimerCountsForOneTick ) )\r\n                {\r\n                    ulCalculatedLoadValue = ( ulTimerCountsForOneTick - 1UL );\r\n                }\r\n\r\n                portNVIC_SYSTICK_LOAD_REG = ulCalculatedLoadValue;\r\n\r\n                /* As the pending tick will be processed as soon as this\r\n                 * function exits, the tick value maintained by the tick is stepped\r\n                 * forward by one less than the time spent waiting. */\r\n                ulCompleteTickPeriods = xExpectedIdleTime - 1UL;\r\n            }\r\n            else\r\n            {\r\n                /* Something other than the tick interrupt ended the sleep. */\r\n\r\n                /* Use the SysTick current-value register to determine the\r\n                 * number of SysTick decrements remaining until the expected idle\r\n                 * time would have ended. */\r\n                ulSysTickDecrementsLeft = portNVIC_SYSTICK_CURRENT_VALUE_REG;\r\n                #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG != portNVIC_SYSTICK_CLK_BIT )\r\n                {\r\n                    /* If the SysTick is not using the core clock, the current-\r\n                     * value register might still be zero here.  In that case, the\r\n                     * SysTick didn't load from the reload register, and there are\r\n                     * ulReloadValue decrements remaining in the expected idle\r\n                     * time, not zero. */\r\n                    if( ulSysTickDecrementsLeft == 0 )\r\n                    {\r\n                        ulSysTickDecrementsLeft = ulReloadValue;\r\n                    }\r\n                }\r\n                #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */\r\n\r\n                /* Work out how long the sleep lasted rounded to complete tick\r\n                 * periods (not the ulReload value which accounted for part\r\n                 * ticks). */\r\n                ulCompletedSysTickDecrements = ( xExpectedIdleTime * ulTimerCountsForOneTick ) - ulSysTickDecrementsLeft;\r\n\r\n                /* How many complete tick periods passed while the processor\r\n                 * was waiting? */\r\n                ulCompleteTickPeriods = ulCompletedSysTickDecrements / ulTimerCountsForOneTick;\r\n\r\n                /* The reload value is set to whatever fraction of a single tick\r\n                 * period remains. */\r\n                portNVIC_SYSTICK_LOAD_REG = ( ( ulCompleteTickPeriods + 1UL ) * ulTimerCountsForOneTick ) - ulCompletedSysTickDecrements;\r\n            }\r\n\r\n            /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG again,\r\n             * then set portNVIC_SYSTICK_LOAD_REG back to its standard value.  If\r\n             * the SysTick is not using the core clock, temporarily configure it to\r\n             * use the core clock.  This configuration forces the SysTick to load\r\n             * from portNVIC_SYSTICK_LOAD_REG immediately instead of at the next\r\n             * cycle of the other clock.  Then portNVIC_SYSTICK_LOAD_REG is ready\r\n             * to receive the standard value immediately. */\r\n            portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;\r\n            portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;\r\n            #if ( portNVIC_SYSTICK_CLK_BIT_CONFIG == portNVIC_SYSTICK_CLK_BIT )\r\n            {\r\n                portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;\r\n            }\r\n            #else\r\n            {\r\n                /* The temporary usage of the core clock has served its purpose,\r\n                 * as described above.  Resume usage of the other clock. */\r\n                portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT;\r\n\r\n                if( ( portNVIC_SYSTICK_CTRL_REG & portNVIC_SYSTICK_COUNT_FLAG_BIT ) != 0 )\r\n                {\r\n                    /* The partial tick period already ended.  Be sure the SysTick\r\n                     * counts it only once. */\r\n                    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0;\r\n                }\r\n\r\n                portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;\r\n                portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;\r\n            }\r\n            #endif /* portNVIC_SYSTICK_CLK_BIT_CONFIG */\r\n\r\n            /* Step the tick to account for any tick periods that elapsed. */\r\n            vTaskStepTick( ulCompleteTickPeriods );\r\n\r\n            /* Exit with interrupts enabled. */\r\n            __asm volatile ( \"cpsie i\" ::: \"memory\" );\r\n        }\r\n    }\r\n#endif /* configUSE_TICKLESS_IDLE */\r\n/*-----------------------------------------------------------*/\r\n\r\n__attribute__( ( weak ) ) void vPortSetupTimerInterrupt( void ) /* PRIVILEGED_FUNCTION */\r\n{\r\n    /* Calculate the constants required to configure the tick interrupt. */\r\n    #if ( configUSE_TICKLESS_IDLE == 1 )\r\n    {\r\n        ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );\r\n        xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;\r\n        ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );\r\n    }\r\n    #endif /* configUSE_TICKLESS_IDLE */\r\n\r\n    /* Stop and reset SysTick.\r\n     *\r\n     * QEMU versions older than 7.0.0 contain a bug which causes an error if we\r\n     * enable SysTick without first selecting a valid clock source. We trigger\r\n     * the bug if we change clock sources from a clock with a zero clock period\r\n     * to one with a nonzero clock period and enable Systick at the same time.\r\n     * So we configure the CLKSOURCE bit here, prior to setting the ENABLE bit.\r\n     * This workaround avoids the bug in QEMU versions older than 7.0.0. */\r\n    portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG;\r\n    portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;\r\n\r\n    /* Configure SysTick to interrupt at the requested rate. */\r\n    portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;\r\n    portNVIC_SYSTICK_CTRL_REG = portNVIC_SYSTICK_CLK_BIT_CONFIG | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic void prvTaskExitError( void )\r\n{\r\n    volatile uint32_t ulDummy = 0UL;\r\n\r\n    /* A function that implements a task must not exit or attempt to return to\r\n     * its caller as there is nothing to return to. If a task wants to exit it\r\n     * should instead call vTaskDelete( NULL ). Artificially force an assert()\r\n     * to be triggered if configASSERT() is defined, then stop here so\r\n     * application writers can catch the error. */\r\n    configASSERT( ulCriticalNesting == ~0UL );\r\n    portDISABLE_INTERRUPTS();\r\n\r\n    while( ulDummy == 0 )\r\n    {\r\n        /* This file calls prvTaskExitError() after the scheduler has been\r\n         * started to remove a compiler warning about the function being\r\n         * defined but never called.  ulDummy is used purely to quieten other\r\n         * warnings about code appearing after this function is called - making\r\n         * ulDummy volatile makes the compiler think the function could return\r\n         * and therefore not output an 'unreachable code' warning for code that\r\n         * appears after it. */\r\n    }\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configENABLE_MPU == 1 )\r\n    static uint32_t prvGetRegionAccessPermissions( uint32_t ulRBARValue ) /* PRIVILEGED_FUNCTION */\r\n    {\r\n        uint32_t ulAccessPermissions = 0;\r\n\r\n        if( ( ulRBARValue & portMPU_RBAR_ACCESS_PERMISSIONS_MASK ) == portMPU_REGION_READ_ONLY )\r\n        {\r\n            ulAccessPermissions = tskMPU_READ_PERMISSION;\r\n        }\r\n\r\n        if( ( ulRBARValue & portMPU_RBAR_ACCESS_PERMISSIONS_MASK ) == portMPU_REGION_READ_WRITE )\r\n        {\r\n            ulAccessPermissions = ( tskMPU_READ_PERMISSION | tskMPU_WRITE_PERMISSION );\r\n        }\r\n\r\n        return ulAccessPermissions;\r\n    }\r\n#endif /* configENABLE_MPU */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configENABLE_MPU == 1 )\r\n    static void prvSetupMPU( void ) /* PRIVILEGED_FUNCTION */\r\n    {\r\n        #if defined( __ARMCC_VERSION )\r\n\r\n            /* Declaration when these variable are defined in code instead of being\r\n             * exported from linker scripts. */\r\n            extern uint32_t * __privileged_functions_start__;\r\n            extern uint32_t * __privileged_functions_end__;\r\n            extern uint32_t * __syscalls_flash_start__;\r\n            extern uint32_t * __syscalls_flash_end__;\r\n            extern uint32_t * __unprivileged_flash_start__;\r\n            extern uint32_t * __unprivileged_flash_end__;\r\n            extern uint32_t * __privileged_sram_start__;\r\n            extern uint32_t * __privileged_sram_end__;\r\n        #else /* if defined( __ARMCC_VERSION ) */\r\n            /* Declaration when these variable are exported from linker scripts. */\r\n            extern uint32_t __privileged_functions_start__[];\r\n            extern uint32_t __privileged_functions_end__[];\r\n            extern uint32_t __syscalls_flash_start__[];\r\n            extern uint32_t __syscalls_flash_end__[];\r\n            extern uint32_t __unprivileged_flash_start__[];\r\n            extern uint32_t __unprivileged_flash_end__[];\r\n            extern uint32_t __privileged_sram_start__[];\r\n            extern uint32_t __privileged_sram_end__[];\r\n        #endif /* defined( __ARMCC_VERSION ) */\r\n\r\n        /* The only permitted number of regions are 8 or 16. */\r\n        configASSERT( ( configTOTAL_MPU_REGIONS == 8 ) || ( configTOTAL_MPU_REGIONS == 16 ) );\r\n\r\n        /* Ensure that the configTOTAL_MPU_REGIONS is configured correctly. */\r\n        configASSERT( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE );\r\n\r\n        /* Check that the MPU is present. */\r\n        if( portMPU_TYPE_REG == portEXPECTED_MPU_TYPE_VALUE )\r\n        {\r\n            /* MAIR0 - Index 0. */\r\n            portMPU_MAIR0_REG |= ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK );\r\n            /* MAIR0 - Index 1. */\r\n            portMPU_MAIR0_REG |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK );\r\n\r\n            /* Setup privileged flash as Read Only so that privileged tasks can\r\n             * read it but not modify. */\r\n            portMPU_RNR_REG = portPRIVILEGED_FLASH_REGION;\r\n            portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_functions_start__ ) & portMPU_RBAR_ADDRESS_MASK ) |\r\n                               ( portMPU_REGION_NON_SHAREABLE ) |\r\n                               ( portMPU_REGION_PRIVILEGED_READ_ONLY );\r\n            portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_functions_end__ ) & portMPU_RLAR_ADDRESS_MASK ) |\r\n                               ( portMPU_RLAR_ATTR_INDEX0 ) |\r\n                               ( portMPU_RLAR_REGION_ENABLE );\r\n\r\n            /* Setup unprivileged flash as Read Only by both privileged and\r\n             * unprivileged tasks. All tasks can read it but no-one can modify. */\r\n            portMPU_RNR_REG = portUNPRIVILEGED_FLASH_REGION;\r\n            portMPU_RBAR_REG = ( ( ( uint32_t ) __unprivileged_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) |\r\n                               ( portMPU_REGION_NON_SHAREABLE ) |\r\n                               ( portMPU_REGION_READ_ONLY );\r\n            portMPU_RLAR_REG = ( ( ( uint32_t ) __unprivileged_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) |\r\n                               ( portMPU_RLAR_ATTR_INDEX0 ) |\r\n                               ( portMPU_RLAR_REGION_ENABLE );\r\n\r\n            /* Setup unprivileged syscalls flash as Read Only by both privileged\r\n             * and unprivileged tasks. All tasks can read it but no-one can modify. */\r\n            portMPU_RNR_REG = portUNPRIVILEGED_SYSCALLS_REGION;\r\n            portMPU_RBAR_REG = ( ( ( uint32_t ) __syscalls_flash_start__ ) & portMPU_RBAR_ADDRESS_MASK ) |\r\n                               ( portMPU_REGION_NON_SHAREABLE ) |\r\n                               ( portMPU_REGION_READ_ONLY );\r\n            portMPU_RLAR_REG = ( ( ( uint32_t ) __syscalls_flash_end__ ) & portMPU_RLAR_ADDRESS_MASK ) |\r\n                               ( portMPU_RLAR_ATTR_INDEX0 ) |\r\n                               ( portMPU_RLAR_REGION_ENABLE );\r\n\r\n            /* Setup RAM containing kernel data for privileged access only. */\r\n            portMPU_RNR_REG = portPRIVILEGED_RAM_REGION;\r\n            portMPU_RBAR_REG = ( ( ( uint32_t ) __privileged_sram_start__ ) & portMPU_RBAR_ADDRESS_MASK ) |\r\n                               ( portMPU_REGION_NON_SHAREABLE ) |\r\n                               ( portMPU_REGION_PRIVILEGED_READ_WRITE ) |\r\n                               ( portMPU_REGION_EXECUTE_NEVER );\r\n            portMPU_RLAR_REG = ( ( ( uint32_t ) __privileged_sram_end__ ) & portMPU_RLAR_ADDRESS_MASK ) |\r\n                               ( portMPU_RLAR_ATTR_INDEX0 ) |\r\n                               ( portMPU_RLAR_REGION_ENABLE );\r\n\r\n            /* Enable mem fault. */\r\n            portSCB_SYS_HANDLER_CTRL_STATE_REG |= portSCB_MEM_FAULT_ENABLE_BIT;\r\n\r\n            /* Enable MPU with privileged background access i.e. unmapped\r\n             * regions have privileged access. */\r\n            portMPU_CTRL_REG |= ( portMPU_PRIV_BACKGROUND_ENABLE_BIT | portMPU_ENABLE_BIT );\r\n        }\r\n    }\r\n#endif /* configENABLE_MPU */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configENABLE_FPU == 1 )\r\n    static void prvSetupFPU( void ) /* PRIVILEGED_FUNCTION */\r\n    {\r\n        #if ( configENABLE_TRUSTZONE == 1 )\r\n        {\r\n            /* Enable non-secure access to the FPU. */\r\n            SecureInit_EnableNSFPUAccess();\r\n        }\r\n        #endif /* configENABLE_TRUSTZONE */\r\n\r\n        /* CP10 = 11 ==> Full access to FPU i.e. both privileged and\r\n         * unprivileged code should be able to access FPU. CP11 should be\r\n         * programmed to the same value as CP10. */\r\n        *( portCPACR ) |= ( ( portCPACR_CP10_VALUE << portCPACR_CP10_POS ) |\r\n                            ( portCPACR_CP11_VALUE << portCPACR_CP11_POS )\r\n                            );\r\n\r\n        /* ASPEN = 1 ==> Hardware should automatically preserve floating point\r\n         * context on exception entry and restore on exception return.\r\n         * LSPEN = 1 ==> Enable lazy context save of FP state. */\r\n        *( portFPCCR ) |= ( portFPCCR_ASPEN_MASK | portFPCCR_LSPEN_MASK );\r\n    }\r\n#endif /* configENABLE_FPU */\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vPortYield( void ) /* PRIVILEGED_FUNCTION */\r\n{\r\n    /* Set a PendSV to request a context switch. */\r\n    portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;\r\n\r\n    /* Barriers are normally not required but do ensure the code is\r\n     * completely within the specified behaviour for the architecture. */\r\n    __asm volatile ( \"dsb\" ::: \"memory\" );\r\n    __asm volatile ( \"isb\" );\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */\r\n{\r\n    portDISABLE_INTERRUPTS();\r\n    ulCriticalNesting++;\r\n\r\n    /* Barriers are normally not required but do ensure the code is\r\n     * completely within the specified behaviour for the architecture. */\r\n    __asm volatile ( \"dsb\" ::: \"memory\" );\r\n    __asm volatile ( \"isb\" );\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */\r\n{\r\n    configASSERT( ulCriticalNesting );\r\n    ulCriticalNesting--;\r\n\r\n    if( ulCriticalNesting == 0 )\r\n    {\r\n        portENABLE_INTERRUPTS();\r\n    }\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid SysTick_Handler( void ) /* PRIVILEGED_FUNCTION */\r\n{\r\n    uint32_t ulPreviousMask;\r\n\r\n    ulPreviousMask = portSET_INTERRUPT_MASK_FROM_ISR();\r\n    traceISR_ENTER();\r\n    {\r\n        /* Increment the RTOS tick. */\r\n        if( xTaskIncrementTick() != pdFALSE )\r\n        {\r\n            traceISR_EXIT_TO_SCHEDULER();\r\n            /* Pend a context switch. */\r\n            portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT;\r\n        }\r\n        else\r\n        {\r\n            traceISR_EXIT();\r\n        }\r\n    }\r\n    portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask );\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vPortSVCHandler_C( uint32_t * pulCallerStackAddress ) /* PRIVILEGED_FUNCTION portDONT_DISCARD */\r\n{\r\n    #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 1 ) )\r\n        #if defined( __ARMCC_VERSION )\r\n\r\n            /* Declaration when these variable are defined in code instead of being\r\n             * exported from linker scripts. */\r\n            extern uint32_t * __syscalls_flash_start__;\r\n            extern uint32_t * __syscalls_flash_end__;\r\n        #else\r\n            /* Declaration when these variable are exported from linker scripts. */\r\n            extern uint32_t __syscalls_flash_start__[];\r\n            extern uint32_t __syscalls_flash_end__[];\r\n        #endif /* defined( __ARMCC_VERSION ) */\r\n    #endif /* ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 1 ) */\r\n\r\n    uint32_t ulPC;\r\n\r\n    #if ( configENABLE_TRUSTZONE == 1 )\r\n        uint32_t ulR0, ulR1;\r\n        extern TaskHandle_t pxCurrentTCB;\r\n        #if ( configENABLE_MPU == 1 )\r\n            uint32_t ulControl, ulIsTaskPrivileged;\r\n        #endif /* configENABLE_MPU */\r\n    #endif /* configENABLE_TRUSTZONE */\r\n    uint8_t ucSVCNumber;\r\n\r\n    /* Register are stored on the stack in the following order - R0, R1, R2, R3,\r\n     * R12, LR, PC, xPSR. */\r\n    ulPC = pulCallerStackAddress[ portOFFSET_TO_PC ];\r\n    ucSVCNumber = ( ( uint8_t * ) ulPC )[ -2 ];\r\n\r\n    switch( ucSVCNumber )\r\n    {\r\n        #if ( configENABLE_TRUSTZONE == 1 )\r\n            case portSVC_ALLOCATE_SECURE_CONTEXT:\r\n\r\n                /* R0 contains the stack size passed as parameter to the\r\n                 * vPortAllocateSecureContext function. */\r\n                ulR0 = pulCallerStackAddress[ 0 ];\r\n\r\n                #if ( configENABLE_MPU == 1 )\r\n                {\r\n                    /* Read the CONTROL register value. */\r\n                    __asm volatile ( \"mrs %0, control\"  : \"=r\" ( ulControl ) );\r\n\r\n                    /* The task that raised the SVC is privileged if Bit[0]\r\n                     * in the CONTROL register is 0. */\r\n                    ulIsTaskPrivileged = ( ( ulControl & portCONTROL_PRIVILEGED_MASK ) == 0 );\r\n\r\n                    /* Allocate and load a context for the secure task. */\r\n                    xSecureContext = SecureContext_AllocateContext( ulR0, ulIsTaskPrivileged, pxCurrentTCB );\r\n                }\r\n                #else /* if ( configENABLE_MPU == 1 ) */\r\n                {\r\n                    /* Allocate and load a context for the secure task. */\r\n                    xSecureContext = SecureContext_AllocateContext( ulR0, pxCurrentTCB );\r\n                }\r\n                #endif /* configENABLE_MPU */\r\n\r\n                configASSERT( xSecureContext != securecontextINVALID_CONTEXT_ID );\r\n                SecureContext_LoadContext( xSecureContext, pxCurrentTCB );\r\n                break;\r\n\r\n            case portSVC_FREE_SECURE_CONTEXT:\r\n\r\n                /* R0 contains TCB being freed and R1 contains the secure\r\n                 * context handle to be freed. */\r\n                ulR0 = pulCallerStackAddress[ 0 ];\r\n                ulR1 = pulCallerStackAddress[ 1 ];\r\n\r\n                /* Free the secure context. */\r\n                SecureContext_FreeContext( ( SecureContextHandle_t ) ulR1, ( void * ) ulR0 );\r\n                break;\r\n        #endif /* configENABLE_TRUSTZONE */\r\n\r\n        case portSVC_START_SCHEDULER:\r\n            #if ( configENABLE_TRUSTZONE == 1 )\r\n            {\r\n                /* De-prioritize the non-secure exceptions so that the\r\n                 * non-secure pendSV runs at the lowest priority. */\r\n                SecureInit_DePrioritizeNSExceptions();\r\n\r\n                /* Initialize the secure context management system. */\r\n                SecureContext_Init();\r\n            }\r\n            #endif /* configENABLE_TRUSTZONE */\r\n\r\n            #if ( configENABLE_FPU == 1 )\r\n            {\r\n                /* Setup the Floating Point Unit (FPU). */\r\n                prvSetupFPU();\r\n            }\r\n            #endif /* configENABLE_FPU */\r\n\r\n            /* Setup the context of the first task so that the first task starts\r\n             * executing. */\r\n            vRestoreContextOfFirstTask();\r\n            break;\r\n\r\n            #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 1 ) )\r\n                case portSVC_RAISE_PRIVILEGE:\r\n\r\n                    /* Only raise the privilege, if the svc was raised from any of\r\n                     * the system calls. */\r\n                    if( ( ulPC >= ( uint32_t ) __syscalls_flash_start__ ) &&\r\n                        ( ulPC <= ( uint32_t ) __syscalls_flash_end__ ) )\r\n                    {\r\n                        vRaisePrivilege();\r\n                    }\r\n                    break;\r\n            #endif /* ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 1 ) */\r\n\r\n            #if ( configENABLE_MPU == 1 )\r\n                case portSVC_YIELD:\r\n                    vPortYield();\r\n                    break;\r\n            #endif /* configENABLE_MPU == 1 */\r\n\r\n        default:\r\n            /* Incorrect SVC call. */\r\n            configASSERT( pdFALSE );\r\n    }\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) )\r\n\r\n    void vSystemCallEnter( uint32_t * pulTaskStack,\r\n                           uint32_t ulLR,\r\n                           uint8_t ucSystemCallNumber ) /* PRIVILEGED_FUNCTION */\r\n    {\r\n        extern TaskHandle_t pxCurrentTCB;\r\n        extern UBaseType_t uxSystemCallImplementations[ NUM_SYSTEM_CALLS ];\r\n        xMPU_SETTINGS * pxMpuSettings;\r\n        uint32_t * pulSystemCallStack;\r\n        uint32_t ulStackFrameSize, ulSystemCallLocation, i;\r\n\r\n        #if defined( __ARMCC_VERSION )\r\n            /* Declaration when these variable are defined in code instead of being\r\n             * exported from linker scripts. */\r\n            extern uint32_t * __syscalls_flash_start__;\r\n            extern uint32_t * __syscalls_flash_end__;\r\n        #else\r\n            /* Declaration when these variable are exported from linker scripts. */\r\n            extern uint32_t __syscalls_flash_start__[];\r\n            extern uint32_t __syscalls_flash_end__[];\r\n        #endif /* #if defined( __ARMCC_VERSION ) */\r\n\r\n        ulSystemCallLocation = pulTaskStack[ portOFFSET_TO_PC ];\r\n        pxMpuSettings = xTaskGetMPUSettings( pxCurrentTCB );\r\n\r\n        /* Checks:\r\n         * 1. SVC is raised from the system call section (i.e. application is\r\n         *    not raising SVC directly).\r\n         * 2. pxMpuSettings->xSystemCallStackInfo.pulTaskStack must be NULL as\r\n         *    it is non-NULL only during the execution of a system call (i.e.\r\n         *    between system call enter and exit).\r\n         * 3. System call is not for a kernel API disabled by the configuration\r\n         *    in FreeRTOSConfig.h.\r\n         * 4. We do not need to check that ucSystemCallNumber is within range\r\n         *    because the assembly SVC handler checks that before calling\r\n         *    this function.\r\n         */\r\n        if( ( ulSystemCallLocation >= ( uint32_t ) __syscalls_flash_start__ ) &&\r\n            ( ulSystemCallLocation <= ( uint32_t ) __syscalls_flash_end__ ) &&\r\n            ( pxMpuSettings->xSystemCallStackInfo.pulTaskStack == NULL ) &&\r\n            ( uxSystemCallImplementations[ ucSystemCallNumber ] != ( UBaseType_t ) 0 ) )\r\n        {\r\n            pulSystemCallStack = pxMpuSettings->xSystemCallStackInfo.pulSystemCallStack;\r\n\r\n            #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )\r\n            {\r\n                if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )\r\n                {\r\n                    /* Extended frame i.e. FPU in use. */\r\n                    ulStackFrameSize = 26;\r\n                    __asm volatile (\r\n                        \" vpush {s0}         \\n\" /* Trigger lazy stacking. */\r\n                        \" vpop  {s0}         \\n\" /* Nullify the affect of the above instruction. */\r\n                        ::: \"memory\"\r\n                        );\r\n                }\r\n                else\r\n                {\r\n                    /* Standard frame i.e. FPU not in use. */\r\n                    ulStackFrameSize = 8;\r\n                }\r\n            }\r\n            #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */\r\n            {\r\n                ulStackFrameSize = 8;\r\n            }\r\n            #endif /* configENABLE_FPU || configENABLE_MVE */\r\n\r\n            /* Make space on the system call stack for the stack frame. */\r\n            pulSystemCallStack = pulSystemCallStack - ulStackFrameSize;\r\n\r\n            /* Copy the stack frame. */\r\n            for( i = 0; i < ulStackFrameSize; i++ )\r\n            {\r\n                pulSystemCallStack[ i ] = pulTaskStack[ i ];\r\n            }\r\n\r\n            /* Store the value of the Link Register before the SVC was raised.\r\n             * It contains the address of the caller of the System Call entry\r\n             * point (i.e. the caller of the MPU_<API>). We need to restore it\r\n             * when we exit from the system call. */\r\n            pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry = pulTaskStack[ portOFFSET_TO_LR ];\r\n            /* Store the value of the PSPLIM register before the SVC was raised.\r\n             * We need to restore it when we exit from the system call. */\r\n            #if ( portUSE_PSPLIM_REGISTER == 1 )\r\n            {\r\n                __asm volatile ( \"mrs %0, psplim\" : \"=r\" ( pxMpuSettings->xSystemCallStackInfo.ulStackLimitRegisterAtSystemCallEntry ) );\r\n            }\r\n            #endif\r\n\r\n            /* Use the pulSystemCallStack in thread mode. */\r\n            __asm volatile ( \"msr psp, %0\" : : \"r\" ( pulSystemCallStack ) );\r\n            #if ( portUSE_PSPLIM_REGISTER == 1 )\r\n            {\r\n                __asm volatile ( \"msr psplim, %0\" : : \"r\" ( pxMpuSettings->xSystemCallStackInfo.pulSystemCallStackLimit ) );\r\n            }\r\n            #endif\r\n\r\n            /* Start executing the system call upon returning from this handler. */\r\n            pulSystemCallStack[ portOFFSET_TO_PC ] = uxSystemCallImplementations[ ucSystemCallNumber ];\r\n            /* Raise a request to exit from the system call upon finishing the\r\n             * system call. */\r\n            pulSystemCallStack[ portOFFSET_TO_LR ] = ( uint32_t ) vRequestSystemCallExit;\r\n\r\n            /* Remember the location where we should copy the stack frame when we exit from\r\n             * the system call. */\r\n            pxMpuSettings->xSystemCallStackInfo.pulTaskStack = pulTaskStack + ulStackFrameSize;\r\n\r\n            /* Record if the hardware used padding to force the stack pointer\r\n             * to be double word aligned. */\r\n            if( ( pulTaskStack[ portOFFSET_TO_PSR ] & portPSR_STACK_PADDING_MASK ) == portPSR_STACK_PADDING_MASK )\r\n            {\r\n                pxMpuSettings->ulTaskFlags |= portSTACK_FRAME_HAS_PADDING_FLAG;\r\n            }\r\n            else\r\n            {\r\n                pxMpuSettings->ulTaskFlags &= ( ~portSTACK_FRAME_HAS_PADDING_FLAG );\r\n            }\r\n\r\n            /* We ensure in pxPortInitialiseStack that the system call stack is\r\n             * double word aligned and therefore, there is no need of padding.\r\n             * Clear the bit[9] of stacked xPSR. */\r\n            pulSystemCallStack[ portOFFSET_TO_PSR ] &= ( ~portPSR_STACK_PADDING_MASK );\r\n\r\n            /* Raise the privilege for the duration of the system call. */\r\n            __asm volatile (\r\n                \" mrs r0, control     \\n\" /* Obtain current control value. */\r\n                \" movs r1, #1         \\n\" /* r1 = 1. */\r\n                \" bics r0, r1         \\n\" /* Clear nPRIV bit. */\r\n                \" msr control, r0     \\n\" /* Write back new control value. */\r\n                ::: \"r0\", \"r1\", \"memory\"\r\n                );\r\n        }\r\n    }\r\n\r\n#endif /* ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) )\r\n\r\n    void vRequestSystemCallExit( void ) /* __attribute__( ( naked ) ) PRIVILEGED_FUNCTION */\r\n    {\r\n        __asm volatile ( \"svc %0 \\n\" ::\"i\" ( portSVC_SYSTEM_CALL_EXIT ) : \"memory\" );\r\n    }\r\n\r\n#endif /* ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) )\r\n\r\n    void vSystemCallExit( uint32_t * pulSystemCallStack,\r\n                          uint32_t ulLR ) /* PRIVILEGED_FUNCTION */\r\n    {\r\n        extern TaskHandle_t pxCurrentTCB;\r\n        xMPU_SETTINGS * pxMpuSettings;\r\n        uint32_t * pulTaskStack;\r\n        uint32_t ulStackFrameSize, ulSystemCallLocation, i;\r\n\r\n        #if defined( __ARMCC_VERSION )\r\n            /* Declaration when these variable are defined in code instead of being\r\n             * exported from linker scripts. */\r\n            extern uint32_t * __privileged_functions_start__;\r\n            extern uint32_t * __privileged_functions_end__;\r\n        #else\r\n            /* Declaration when these variable are exported from linker scripts. */\r\n            extern uint32_t __privileged_functions_start__[];\r\n            extern uint32_t __privileged_functions_end__[];\r\n        #endif /* #if defined( __ARMCC_VERSION ) */\r\n\r\n        ulSystemCallLocation = pulSystemCallStack[ portOFFSET_TO_PC ];\r\n        pxMpuSettings = xTaskGetMPUSettings( pxCurrentTCB );\r\n\r\n        /* Checks:\r\n         * 1. SVC is raised from the privileged code (i.e. application is not\r\n         *    raising SVC directly). This SVC is only raised from\r\n         *    vRequestSystemCallExit which is in the privileged code section.\r\n         * 2. pxMpuSettings->xSystemCallStackInfo.pulTaskStack must not be NULL -\r\n         *    this means that we previously entered a system call and the\r\n         *    application is not attempting to exit without entering a system\r\n         *    call.\r\n         */\r\n        if( ( ulSystemCallLocation >= ( uint32_t ) __privileged_functions_start__ ) &&\r\n            ( ulSystemCallLocation <= ( uint32_t ) __privileged_functions_end__ ) &&\r\n            ( pxMpuSettings->xSystemCallStackInfo.pulTaskStack != NULL ) )\r\n        {\r\n            pulTaskStack = pxMpuSettings->xSystemCallStackInfo.pulTaskStack;\r\n\r\n            #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )\r\n            {\r\n                if( ( ulLR & portEXC_RETURN_STACK_FRAME_TYPE_MASK ) == 0UL )\r\n                {\r\n                    /* Extended frame i.e. FPU in use. */\r\n                    ulStackFrameSize = 26;\r\n                    __asm volatile (\r\n                        \" vpush {s0}         \\n\" /* Trigger lazy stacking. */\r\n                        \" vpop  {s0}         \\n\" /* Nullify the affect of the above instruction. */\r\n                        ::: \"memory\"\r\n                        );\r\n                }\r\n                else\r\n                {\r\n                    /* Standard frame i.e. FPU not in use. */\r\n                    ulStackFrameSize = 8;\r\n                }\r\n            }\r\n            #else /* if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */\r\n            {\r\n                ulStackFrameSize = 8;\r\n            }\r\n            #endif /* configENABLE_FPU || configENABLE_MVE */\r\n\r\n            /* Make space on the task stack for the stack frame. */\r\n            pulTaskStack = pulTaskStack - ulStackFrameSize;\r\n\r\n            /* Copy the stack frame. */\r\n            for( i = 0; i < ulStackFrameSize; i++ )\r\n            {\r\n                pulTaskStack[ i ] = pulSystemCallStack[ i ];\r\n            }\r\n\r\n            /* Use the pulTaskStack in thread mode. */\r\n            __asm volatile ( \"msr psp, %0\" : : \"r\" ( pulTaskStack ) );\r\n\r\n            /* Return to the caller of the System Call entry point (i.e. the\r\n             * caller of the MPU_<API>). */\r\n            pulTaskStack[ portOFFSET_TO_PC ] = pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry;\r\n            /* Ensure that LR has a valid value.*/\r\n            pulTaskStack[ portOFFSET_TO_LR ] = pxMpuSettings->xSystemCallStackInfo.ulLinkRegisterAtSystemCallEntry;\r\n\r\n            /* Restore the PSPLIM register to what it was at the time of\r\n             * system call entry. */\r\n            #if ( portUSE_PSPLIM_REGISTER == 1 )\r\n            {\r\n                __asm volatile ( \"msr psplim, %0\" : : \"r\" ( pxMpuSettings->xSystemCallStackInfo.ulStackLimitRegisterAtSystemCallEntry ) );\r\n            }\r\n            #endif\r\n\r\n            /* If the hardware used padding to force the stack pointer\r\n             * to be double word aligned, set the stacked xPSR bit[9],\r\n             * otherwise clear it. */\r\n            if( ( pxMpuSettings->ulTaskFlags & portSTACK_FRAME_HAS_PADDING_FLAG ) == portSTACK_FRAME_HAS_PADDING_FLAG )\r\n            {\r\n                pulTaskStack[ portOFFSET_TO_PSR ] |= portPSR_STACK_PADDING_MASK;\r\n            }\r\n            else\r\n            {\r\n                pulTaskStack[ portOFFSET_TO_PSR ] &= ( ~portPSR_STACK_PADDING_MASK );\r\n            }\r\n\r\n            /* This is not NULL only for the duration of the system call. */\r\n            pxMpuSettings->xSystemCallStackInfo.pulTaskStack = NULL;\r\n\r\n            /* Drop the privilege before returning to the thread mode. */\r\n            __asm volatile (\r\n                \" mrs r0, control     \\n\" /* Obtain current control value. */\r\n                \" movs r1, #1         \\n\" /* r1 = 1. */\r\n                \" orrs r0, r1         \\n\" /* Set nPRIV bit. */\r\n                \" msr control, r0     \\n\" /* Write back new control value. */\r\n                ::: \"r0\", \"r1\", \"memory\"\r\n                );\r\n        }\r\n    }\r\n\r\n#endif /* ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configENABLE_MPU == 1 )\r\n\r\n    BaseType_t xPortIsTaskPrivileged( void ) /* PRIVILEGED_FUNCTION */\r\n    {\r\n        BaseType_t xTaskIsPrivileged = pdFALSE;\r\n        const xMPU_SETTINGS * xTaskMpuSettings = xTaskGetMPUSettings( NULL ); /* Calling task's MPU settings. */\r\n\r\n        if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )\r\n        {\r\n            xTaskIsPrivileged = pdTRUE;\r\n        }\r\n\r\n        return xTaskIsPrivileged;\r\n    }\r\n\r\n#endif /* configENABLE_MPU == 1 */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configENABLE_MPU == 1 )\r\n\r\n    StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,\r\n                                         StackType_t * pxEndOfStack,\r\n                                         TaskFunction_t pxCode,\r\n                                         void * pvParameters,\r\n                                         BaseType_t xRunPrivileged,\r\n                                         xMPU_SETTINGS * xMPUSettings ) /* PRIVILEGED_FUNCTION */\r\n    {\r\n        uint32_t ulIndex = 0;\r\n\r\n        xMPUSettings->ulContext[ ulIndex ] = 0x04040404; /* r4. */\r\n        ulIndex++;\r\n        xMPUSettings->ulContext[ ulIndex ] = 0x05050505; /* r5. */\r\n        ulIndex++;\r\n        xMPUSettings->ulContext[ ulIndex ] = 0x06060606; /* r6. */\r\n        ulIndex++;\r\n        xMPUSettings->ulContext[ ulIndex ] = 0x07070707; /* r7. */\r\n        ulIndex++;\r\n        xMPUSettings->ulContext[ ulIndex ] = 0x08080808; /* r8. */\r\n        ulIndex++;\r\n        xMPUSettings->ulContext[ ulIndex ] = 0x09090909; /* r9. */\r\n        ulIndex++;\r\n        xMPUSettings->ulContext[ ulIndex ] = 0x10101010; /* r10. */\r\n        ulIndex++;\r\n        xMPUSettings->ulContext[ ulIndex ] = 0x11111111; /* r11. */\r\n        ulIndex++;\r\n\r\n        xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pvParameters;            /* r0. */\r\n        ulIndex++;\r\n        xMPUSettings->ulContext[ ulIndex ] = 0x01010101;                           /* r1. */\r\n        ulIndex++;\r\n        xMPUSettings->ulContext[ ulIndex ] = 0x02020202;                           /* r2. */\r\n        ulIndex++;\r\n        xMPUSettings->ulContext[ ulIndex ] = 0x03030303;                           /* r3. */\r\n        ulIndex++;\r\n        xMPUSettings->ulContext[ ulIndex ] = 0x12121212;                           /* r12. */\r\n        ulIndex++;\r\n        xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) portTASK_RETURN_ADDRESS; /* LR. */\r\n        ulIndex++;\r\n        xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxCode;                  /* PC. */\r\n        ulIndex++;\r\n        xMPUSettings->ulContext[ ulIndex ] = portINITIAL_XPSR;                     /* xPSR. */\r\n        ulIndex++;\r\n\r\n        #if ( configENABLE_TRUSTZONE == 1 )\r\n        {\r\n            xMPUSettings->ulContext[ ulIndex ] = portNO_SECURE_CONTEXT; /* xSecureContext. */\r\n            ulIndex++;\r\n        }\r\n        #endif /* configENABLE_TRUSTZONE */\r\n        xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) ( pxTopOfStack - 8 ); /* PSP with the hardware saved stack. */\r\n        ulIndex++;\r\n        xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) pxEndOfStack;         /* PSPLIM. */\r\n        ulIndex++;\r\n\r\n        if( xRunPrivileged == pdTRUE )\r\n        {\r\n            xMPUSettings->ulTaskFlags |= portTASK_IS_PRIVILEGED_FLAG;\r\n            xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) portINITIAL_CONTROL_PRIVILEGED; /* CONTROL. */\r\n            ulIndex++;\r\n        }\r\n        else\r\n        {\r\n            xMPUSettings->ulTaskFlags &= ( ~portTASK_IS_PRIVILEGED_FLAG );\r\n            xMPUSettings->ulContext[ ulIndex ] = ( uint32_t ) portINITIAL_CONTROL_UNPRIVILEGED; /* CONTROL. */\r\n            ulIndex++;\r\n        }\r\n\r\n        xMPUSettings->ulContext[ ulIndex ] = portINITIAL_EXC_RETURN; /* LR (EXC_RETURN). */\r\n        ulIndex++;\r\n\r\n        #if ( configUSE_MPU_WRAPPERS_V1 == 0 )\r\n        {\r\n            /* Ensure that the system call stack is double word aligned. */\r\n            xMPUSettings->xSystemCallStackInfo.pulSystemCallStack = &( xMPUSettings->xSystemCallStackInfo.ulSystemCallStackBuffer[ configSYSTEM_CALL_STACK_SIZE - 1 ] );\r\n            xMPUSettings->xSystemCallStackInfo.pulSystemCallStack = ( uint32_t * ) ( ( uint32_t ) ( xMPUSettings->xSystemCallStackInfo.pulSystemCallStack ) &\r\n                                                                                     ( uint32_t ) ( ~( portBYTE_ALIGNMENT_MASK ) ) );\r\n\r\n            xMPUSettings->xSystemCallStackInfo.pulSystemCallStackLimit = &( xMPUSettings->xSystemCallStackInfo.ulSystemCallStackBuffer[ 0 ] );\r\n            xMPUSettings->xSystemCallStackInfo.pulSystemCallStackLimit = ( uint32_t * ) ( ( ( uint32_t ) ( xMPUSettings->xSystemCallStackInfo.pulSystemCallStackLimit ) +\r\n                                                                                            ( uint32_t ) ( portBYTE_ALIGNMENT - 1 ) ) &\r\n                                                                                          ( uint32_t ) ( ~( portBYTE_ALIGNMENT_MASK ) ) );\r\n\r\n            /* This is not NULL only for the duration of a system call. */\r\n            xMPUSettings->xSystemCallStackInfo.pulTaskStack = NULL;\r\n        }\r\n        #endif /* configUSE_MPU_WRAPPERS_V1 == 0 */\r\n\r\n        return &( xMPUSettings->ulContext[ ulIndex ] );\r\n    }\r\n\r\n#else /* configENABLE_MPU */\r\n\r\n    StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,\r\n                                         StackType_t * pxEndOfStack,\r\n                                         TaskFunction_t pxCode,\r\n                                         void * pvParameters ) /* PRIVILEGED_FUNCTION */\r\n    {\r\n        /* Simulate the stack frame as it would be created by a context switch\r\n         * interrupt. */\r\n        #if ( portPRELOAD_REGISTERS == 0 )\r\n        {\r\n            pxTopOfStack--;                                          /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */\r\n            *pxTopOfStack = portINITIAL_XPSR;                        /* xPSR. */\r\n            pxTopOfStack--;\r\n            *pxTopOfStack = ( StackType_t ) pxCode;                  /* PC. */\r\n            pxTopOfStack--;\r\n            *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR. */\r\n            pxTopOfStack -= 5;                                       /* R12, R3, R2 and R1. */\r\n            *pxTopOfStack = ( StackType_t ) pvParameters;            /* R0. */\r\n            pxTopOfStack -= 9;                                       /* R11..R4, EXC_RETURN. */\r\n            *pxTopOfStack = portINITIAL_EXC_RETURN;\r\n            pxTopOfStack--;\r\n            *pxTopOfStack = ( StackType_t ) pxEndOfStack; /* Slot used to hold this task's PSPLIM value. */\r\n\r\n            #if ( configENABLE_TRUSTZONE == 1 )\r\n            {\r\n                pxTopOfStack--;\r\n                *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */\r\n            }\r\n            #endif /* configENABLE_TRUSTZONE */\r\n        }\r\n        #else /* portPRELOAD_REGISTERS */\r\n        {\r\n            pxTopOfStack--;                                          /* Offset added to account for the way the MCU uses the stack on entry/exit of interrupts. */\r\n            *pxTopOfStack = portINITIAL_XPSR;                        /* xPSR. */\r\n            pxTopOfStack--;\r\n            *pxTopOfStack = ( StackType_t ) pxCode;                  /* PC. */\r\n            pxTopOfStack--;\r\n            *pxTopOfStack = ( StackType_t ) portTASK_RETURN_ADDRESS; /* LR. */\r\n            pxTopOfStack--;\r\n            *pxTopOfStack = ( StackType_t ) 0x12121212UL;            /* R12. */\r\n            pxTopOfStack--;\r\n            *pxTopOfStack = ( StackType_t ) 0x03030303UL;            /* R3. */\r\n            pxTopOfStack--;\r\n            *pxTopOfStack = ( StackType_t ) 0x02020202UL;            /* R2. */\r\n            pxTopOfStack--;\r\n            *pxTopOfStack = ( StackType_t ) 0x01010101UL;            /* R1. */\r\n            pxTopOfStack--;\r\n            *pxTopOfStack = ( StackType_t ) pvParameters;            /* R0. */\r\n            pxTopOfStack--;\r\n            *pxTopOfStack = ( StackType_t ) 0x11111111UL;            /* R11. */\r\n            pxTopOfStack--;\r\n            *pxTopOfStack = ( StackType_t ) 0x10101010UL;            /* R10. */\r\n            pxTopOfStack--;\r\n            *pxTopOfStack = ( StackType_t ) 0x09090909UL;            /* R09. */\r\n            pxTopOfStack--;\r\n            *pxTopOfStack = ( StackType_t ) 0x08080808UL;            /* R08. */\r\n            pxTopOfStack--;\r\n            *pxTopOfStack = ( StackType_t ) 0x07070707UL;            /* R07. */\r\n            pxTopOfStack--;\r\n            *pxTopOfStack = ( StackType_t ) 0x06060606UL;            /* R06. */\r\n            pxTopOfStack--;\r\n            *pxTopOfStack = ( StackType_t ) 0x05050505UL;            /* R05. */\r\n            pxTopOfStack--;\r\n            *pxTopOfStack = ( StackType_t ) 0x04040404UL;            /* R04. */\r\n            pxTopOfStack--;\r\n            *pxTopOfStack = portINITIAL_EXC_RETURN;                  /* EXC_RETURN. */\r\n            pxTopOfStack--;\r\n            *pxTopOfStack = ( StackType_t ) pxEndOfStack;            /* Slot used to hold this task's PSPLIM value. */\r\n\r\n            #if ( configENABLE_TRUSTZONE == 1 )\r\n            {\r\n                pxTopOfStack--;\r\n                *pxTopOfStack = portNO_SECURE_CONTEXT; /* Slot used to hold this task's xSecureContext value. */\r\n            }\r\n            #endif /* configENABLE_TRUSTZONE */\r\n        }\r\n        #endif /* portPRELOAD_REGISTERS */\r\n\r\n        return pxTopOfStack;\r\n    }\r\n\r\n#endif /* configENABLE_MPU */\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xPortStartScheduler( void ) /* PRIVILEGED_FUNCTION */\r\n{\r\n    /* An application can install FreeRTOS interrupt handlers in one of the\r\n     * folllowing ways:\r\n     * 1. Direct Routing - Install the functions SVC_Handler and PendSV_Handler\r\n     *    for SVCall and PendSV interrupts respectively.\r\n     * 2. Indirect Routing - Install separate handlers for SVCall and PendSV\r\n     *    interrupts and route program control from those handlers to\r\n     *    SVC_Handler and PendSV_Handler functions.\r\n     *\r\n     * Applications that use Indirect Routing must set\r\n     * configCHECK_HANDLER_INSTALLATION to 0 in their FreeRTOSConfig.h. Direct\r\n     * routing, which is validated here when configCHECK_HANDLER_INSTALLATION\r\n     * is 1, should be preferred when possible. */\r\n    #if ( configCHECK_HANDLER_INSTALLATION == 1 )\r\n    {\r\n        const portISR_t * const pxVectorTable = portSCB_VTOR_REG;\r\n\r\n        /* Validate that the application has correctly installed the FreeRTOS\r\n         * handlers for SVCall and PendSV interrupts. We do not check the\r\n         * installation of the SysTick handler because the application may\r\n         * choose to drive the RTOS tick using a timer other than the SysTick\r\n         * timer by overriding the weak function vPortSetupTimerInterrupt().\r\n         *\r\n         * Assertion failures here indicate incorrect installation of the\r\n         * FreeRTOS handlers. For help installing the FreeRTOS handlers, see\r\n         * https://www.FreeRTOS.org/FAQHelp.html.\r\n         *\r\n         * Systems with a configurable address for the interrupt vector table\r\n         * can also encounter assertion failures or even system faults here if\r\n         * VTOR is not set correctly to point to the application's vector table. */\r\n        configASSERT( pxVectorTable[ portVECTOR_INDEX_SVC ] == SVC_Handler );\r\n        configASSERT( pxVectorTable[ portVECTOR_INDEX_PENDSV ] == PendSV_Handler );\r\n    }\r\n    #endif /* configCHECK_HANDLER_INSTALLATION */\r\n\r\n    #if ( ( configASSERT_DEFINED == 1 ) && ( portHAS_ARMV8M_MAIN_EXTENSION == 1 ) )\r\n    {\r\n        volatile uint32_t ulImplementedPrioBits = 0;\r\n        volatile uint8_t ucMaxPriorityValue;\r\n\r\n        /* Determine the maximum priority from which ISR safe FreeRTOS API\r\n         * functions can be called. ISR safe functions are those that end in\r\n         * \"FromISR\". FreeRTOS maintains separate thread and ISR API functions to\r\n         * ensure interrupt entry is as fast and simple as possible.\r\n         *\r\n         * First, determine the number of priority bits available. Write to all\r\n         * possible bits in the priority setting for SVCall. */\r\n        portNVIC_SHPR2_REG = 0xFF000000;\r\n\r\n        /* Read the value back to see how many bits stuck. */\r\n        ucMaxPriorityValue = ( uint8_t ) ( ( portNVIC_SHPR2_REG & 0xFF000000 ) >> 24 );\r\n\r\n        /* Use the same mask on the maximum system call priority. */\r\n        ucMaxSysCallPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY & ucMaxPriorityValue;\r\n\r\n        /* Check that the maximum system call priority is nonzero after\r\n         * accounting for the number of priority bits supported by the\r\n         * hardware. A priority of 0 is invalid because setting the BASEPRI\r\n         * register to 0 unmasks all interrupts, and interrupts with priority 0\r\n         * cannot be masked using BASEPRI.\r\n         * See https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */\r\n        configASSERT( ucMaxSysCallPriority );\r\n\r\n        /* Check that the bits not implemented in hardware are zero in\r\n         * configMAX_SYSCALL_INTERRUPT_PRIORITY. */\r\n        configASSERT( ( configMAX_SYSCALL_INTERRUPT_PRIORITY & ( uint8_t ) ( ~( uint32_t ) ucMaxPriorityValue ) ) == 0U );\r\n\r\n        /* Calculate the maximum acceptable priority group value for the number\r\n         * of bits read back. */\r\n        while( ( ucMaxPriorityValue & portTOP_BIT_OF_BYTE ) == portTOP_BIT_OF_BYTE )\r\n        {\r\n            ulImplementedPrioBits++;\r\n            ucMaxPriorityValue <<= ( uint8_t ) 0x01;\r\n        }\r\n\r\n        if( ulImplementedPrioBits == 8 )\r\n        {\r\n            /* When the hardware implements 8 priority bits, there is no way for\r\n             * the software to configure PRIGROUP to not have sub-priorities. As\r\n             * a result, the least significant bit is always used for sub-priority\r\n             * and there are 128 preemption priorities and 2 sub-priorities.\r\n             *\r\n             * This may cause some confusion in some cases - for example, if\r\n             * configMAX_SYSCALL_INTERRUPT_PRIORITY is set to 5, both 5 and 4\r\n             * priority interrupts will be masked in Critical Sections as those\r\n             * are at the same preemption priority. This may appear confusing as\r\n             * 4 is higher (numerically lower) priority than\r\n             * configMAX_SYSCALL_INTERRUPT_PRIORITY and therefore, should not\r\n             * have been masked. Instead, if we set configMAX_SYSCALL_INTERRUPT_PRIORITY\r\n             * to 4, this confusion does not happen and the behaviour remains the same.\r\n             *\r\n             * The following assert ensures that the sub-priority bit in the\r\n             * configMAX_SYSCALL_INTERRUPT_PRIORITY is clear to avoid the above mentioned\r\n             * confusion. */\r\n            configASSERT( ( configMAX_SYSCALL_INTERRUPT_PRIORITY & 0x1U ) == 0U );\r\n            ulMaxPRIGROUPValue = 0;\r\n        }\r\n        else\r\n        {\r\n            ulMaxPRIGROUPValue = portMAX_PRIGROUP_BITS - ulImplementedPrioBits;\r\n        }\r\n\r\n        /* Shift the priority group value back to its position within the AIRCR\r\n         * register. */\r\n        ulMaxPRIGROUPValue <<= portPRIGROUP_SHIFT;\r\n        ulMaxPRIGROUPValue &= portPRIORITY_GROUP_MASK;\r\n    }\r\n    #endif /* #if ( ( configASSERT_DEFINED == 1 ) && ( portHAS_ARMV8M_MAIN_EXTENSION == 1 ) ) */\r\n\r\n    /* Make PendSV and SysTick the lowest priority interrupts, and make SVCall\r\n     * the highest priority. */\r\n    portNVIC_SHPR3_REG |= portNVIC_PENDSV_PRI;\r\n    portNVIC_SHPR3_REG |= portNVIC_SYSTICK_PRI;\r\n    portNVIC_SHPR2_REG = 0;\r\n\r\n    #if ( configENABLE_MPU == 1 )\r\n    {\r\n        /* Setup the Memory Protection Unit (MPU). */\r\n        prvSetupMPU();\r\n    }\r\n    #endif /* configENABLE_MPU */\r\n\r\n    /* Start the timer that generates the tick ISR. Interrupts are disabled\r\n     * here already. */\r\n    vPortSetupTimerInterrupt();\r\n\r\n    /* Initialize the critical nesting count ready for the first task. */\r\n    ulCriticalNesting = 0;\r\n\r\n    #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) && ( configENABLE_ACCESS_CONTROL_LIST == 1 ) )\r\n    {\r\n        xSchedulerRunning = pdTRUE;\r\n    }\r\n    #endif\r\n\r\n    /* Start the first task. */\r\n    vStartFirstTask();\r\n\r\n    /* Should never get here as the tasks will now be executing. Call the task\r\n     * exit error function to prevent compiler warnings about a static function\r\n     * not being called in the case that the application writer overrides this\r\n     * functionality by defining configTASK_RETURN_ADDRESS. Call\r\n     * vTaskSwitchContext() so link time optimization does not remove the\r\n     * symbol. */\r\n    vTaskSwitchContext();\r\n    prvTaskExitError();\r\n\r\n    /* Should not get here. */\r\n    return 0;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vPortEndScheduler( void ) /* PRIVILEGED_FUNCTION */\r\n{\r\n    /* Not implemented in ports where there is nothing to return to.\r\n     * Artificially force an assert. */\r\n    configASSERT( ulCriticalNesting == 1000UL );\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configENABLE_MPU == 1 )\r\n    void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings,\r\n                                    const struct xMEMORY_REGION * const xRegions,\r\n                                    StackType_t * pxBottomOfStack,\r\n                                    uint32_t ulStackDepth )\r\n    {\r\n        uint32_t ulRegionStartAddress, ulRegionEndAddress, ulRegionNumber;\r\n        int32_t lIndex = 0;\r\n\r\n        #if defined( __ARMCC_VERSION )\r\n\r\n            /* Declaration when these variable are defined in code instead of being\r\n             * exported from linker scripts. */\r\n            extern uint32_t * __privileged_sram_start__;\r\n            extern uint32_t * __privileged_sram_end__;\r\n        #else\r\n            /* Declaration when these variable are exported from linker scripts. */\r\n            extern uint32_t __privileged_sram_start__[];\r\n            extern uint32_t __privileged_sram_end__[];\r\n        #endif /* defined( __ARMCC_VERSION ) */\r\n\r\n        /* Setup MAIR0. */\r\n        xMPUSettings->ulMAIR0 = ( ( portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE << portMPU_MAIR_ATTR0_POS ) & portMPU_MAIR_ATTR0_MASK );\r\n        xMPUSettings->ulMAIR0 |= ( ( portMPU_DEVICE_MEMORY_nGnRE << portMPU_MAIR_ATTR1_POS ) & portMPU_MAIR_ATTR1_MASK );\r\n\r\n        /* This function is called automatically when the task is created - in\r\n         * which case the stack region parameters will be valid.  At all other\r\n         * times the stack parameters will not be valid and it is assumed that\r\n         * the stack region has already been configured. */\r\n        if( ulStackDepth > 0 )\r\n        {\r\n            ulRegionStartAddress = ( uint32_t ) pxBottomOfStack;\r\n            ulRegionEndAddress = ( uint32_t ) pxBottomOfStack + ( ulStackDepth * ( uint32_t ) sizeof( StackType_t ) ) - 1;\r\n\r\n            /* If the stack is within the privileged SRAM, do not protect it\r\n             * using a separate MPU region. This is needed because privileged\r\n             * SRAM is already protected using an MPU region and ARMv8-M does\r\n             * not allow overlapping MPU regions. */\r\n            if( ( ulRegionStartAddress >= ( uint32_t ) __privileged_sram_start__ ) &&\r\n                ( ulRegionEndAddress <= ( uint32_t ) __privileged_sram_end__ ) )\r\n            {\r\n                xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = 0;\r\n                xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = 0;\r\n            }\r\n            else\r\n            {\r\n                /* Define the region that allows access to the stack. */\r\n                ulRegionStartAddress &= portMPU_RBAR_ADDRESS_MASK;\r\n                ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK;\r\n\r\n                xMPUSettings->xRegionsSettings[ 0 ].ulRBAR = ( ulRegionStartAddress ) |\r\n                                                             ( portMPU_REGION_NON_SHAREABLE ) |\r\n                                                             ( portMPU_REGION_READ_WRITE ) |\r\n                                                             ( portMPU_REGION_EXECUTE_NEVER );\r\n\r\n                xMPUSettings->xRegionsSettings[ 0 ].ulRLAR = ( ulRegionEndAddress ) |\r\n                                                             ( portMPU_RLAR_ATTR_INDEX0 ) |\r\n                                                             ( portMPU_RLAR_REGION_ENABLE );\r\n            }\r\n        }\r\n\r\n        /* User supplied configurable regions. */\r\n        for( ulRegionNumber = 1; ulRegionNumber <= portNUM_CONFIGURABLE_REGIONS; ulRegionNumber++ )\r\n        {\r\n            /* If xRegions is NULL i.e. the task has not specified any MPU\r\n             * region, the else part ensures that all the configurable MPU\r\n             * regions are invalidated. */\r\n            if( ( xRegions != NULL ) && ( xRegions[ lIndex ].ulLengthInBytes > 0UL ) )\r\n            {\r\n                /* Translate the generic region definition contained in xRegions\r\n                 * into the ARMv8 specific MPU settings that are then stored in\r\n                 * xMPUSettings. */\r\n                ulRegionStartAddress = ( ( uint32_t ) xRegions[ lIndex ].pvBaseAddress ) & portMPU_RBAR_ADDRESS_MASK;\r\n                ulRegionEndAddress = ( uint32_t ) xRegions[ lIndex ].pvBaseAddress + xRegions[ lIndex ].ulLengthInBytes - 1;\r\n                ulRegionEndAddress &= portMPU_RLAR_ADDRESS_MASK;\r\n\r\n                /* Start address. */\r\n                xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = ( ulRegionStartAddress ) |\r\n                                                                          ( portMPU_REGION_NON_SHAREABLE );\r\n\r\n                /* RO/RW. */\r\n                if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_READ_ONLY ) != 0 )\r\n                {\r\n                    xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_ONLY );\r\n                }\r\n                else\r\n                {\r\n                    xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_READ_WRITE );\r\n                }\r\n\r\n                /* XN. */\r\n                if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_EXECUTE_NEVER ) != 0 )\r\n                {\r\n                    xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR |= ( portMPU_REGION_EXECUTE_NEVER );\r\n                }\r\n\r\n                /* End Address. */\r\n                xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = ( ulRegionEndAddress ) |\r\n                                                                          ( portMPU_RLAR_REGION_ENABLE );\r\n\r\n                /* Normal memory/ Device memory. */\r\n                if( ( xRegions[ lIndex ].ulParameters & tskMPU_REGION_DEVICE_MEMORY ) != 0 )\r\n                {\r\n                    /* Attr1 in MAIR0 is configured as device memory. */\r\n                    xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX1;\r\n                }\r\n                else\r\n                {\r\n                    /* Attr0 in MAIR0 is configured as normal memory. */\r\n                    xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR |= portMPU_RLAR_ATTR_INDEX0;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                /* Invalidate the region. */\r\n                xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRBAR = 0UL;\r\n                xMPUSettings->xRegionsSettings[ ulRegionNumber ].ulRLAR = 0UL;\r\n            }\r\n\r\n            lIndex++;\r\n        }\r\n    }\r\n#endif /* configENABLE_MPU */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configENABLE_MPU == 1 )\r\n    BaseType_t xPortIsAuthorizedToAccessBuffer( const void * pvBuffer,\r\n                                                uint32_t ulBufferLength,\r\n                                                uint32_t ulAccessRequested ) /* PRIVILEGED_FUNCTION */\r\n\r\n    {\r\n        uint32_t i, ulBufferStartAddress, ulBufferEndAddress;\r\n        BaseType_t xAccessGranted = pdFALSE;\r\n        const xMPU_SETTINGS * xTaskMpuSettings = xTaskGetMPUSettings( NULL ); /* Calling task's MPU settings. */\r\n\r\n        if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )\r\n        {\r\n            xAccessGranted = pdTRUE;\r\n        }\r\n        else\r\n        {\r\n            if( portADD_UINT32_WILL_OVERFLOW( ( ( uint32_t ) pvBuffer ), ( ulBufferLength - 1UL ) ) == pdFALSE )\r\n            {\r\n                ulBufferStartAddress = ( uint32_t ) pvBuffer;\r\n                ulBufferEndAddress = ( ( ( uint32_t ) pvBuffer ) + ulBufferLength - 1UL );\r\n\r\n                for( i = 0; i < portTOTAL_NUM_REGIONS; i++ )\r\n                {\r\n                    /* Is the MPU region enabled? */\r\n                    if( ( xTaskMpuSettings->xRegionsSettings[ i ].ulRLAR & portMPU_RLAR_REGION_ENABLE ) == portMPU_RLAR_REGION_ENABLE )\r\n                    {\r\n                        if( portIS_ADDRESS_WITHIN_RANGE( ulBufferStartAddress,\r\n                                                         portEXTRACT_FIRST_ADDRESS_FROM_RBAR( xTaskMpuSettings->xRegionsSettings[ i ].ulRBAR ),\r\n                                                         portEXTRACT_LAST_ADDRESS_FROM_RLAR( xTaskMpuSettings->xRegionsSettings[ i ].ulRLAR ) ) &&\r\n                            portIS_ADDRESS_WITHIN_RANGE( ulBufferEndAddress,\r\n                                                         portEXTRACT_FIRST_ADDRESS_FROM_RBAR( xTaskMpuSettings->xRegionsSettings[ i ].ulRBAR ),\r\n                                                         portEXTRACT_LAST_ADDRESS_FROM_RLAR( xTaskMpuSettings->xRegionsSettings[ i ].ulRLAR ) ) &&\r\n                            portIS_AUTHORIZED( ulAccessRequested,\r\n                                               prvGetRegionAccessPermissions( xTaskMpuSettings->xRegionsSettings[ i ].ulRBAR ) ) )\r\n                        {\r\n                            xAccessGranted = pdTRUE;\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n\r\n        return xAccessGranted;\r\n    }\r\n#endif /* configENABLE_MPU */\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xPortIsInsideInterrupt( void )\r\n{\r\n    uint32_t ulCurrentInterrupt;\r\n    BaseType_t xReturn;\r\n\r\n    /* Obtain the number of the currently executing interrupt. Interrupt Program\r\n     * Status Register (IPSR) holds the exception number of the currently-executing\r\n     * exception or zero for Thread mode.*/\r\n    __asm volatile ( \"mrs %0, ipsr\" : \"=r\" ( ulCurrentInterrupt )::\"memory\" );\r\n\r\n    if( ulCurrentInterrupt == 0 )\r\n    {\r\n        xReturn = pdFALSE;\r\n    }\r\n    else\r\n    {\r\n        xReturn = pdTRUE;\r\n    }\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configASSERT_DEFINED == 1 ) && ( portHAS_ARMV8M_MAIN_EXTENSION == 1 ) )\r\n\r\n    void vPortValidateInterruptPriority( void )\r\n    {\r\n        uint32_t ulCurrentInterrupt;\r\n        uint8_t ucCurrentPriority;\r\n\r\n        /* Obtain the number of the currently executing interrupt. */\r\n        __asm volatile ( \"mrs %0, ipsr\" : \"=r\" ( ulCurrentInterrupt )::\"memory\" );\r\n\r\n        /* Is the interrupt number a user defined interrupt? */\r\n        if( ulCurrentInterrupt >= portFIRST_USER_INTERRUPT_NUMBER )\r\n        {\r\n            /* Look up the interrupt's priority. */\r\n            ucCurrentPriority = pcInterruptPriorityRegisters[ ulCurrentInterrupt ];\r\n\r\n            /* The following assertion will fail if a service routine (ISR) for\r\n             * an interrupt that has been assigned a priority above\r\n             * configMAX_SYSCALL_INTERRUPT_PRIORITY calls an ISR safe FreeRTOS API\r\n             * function.  ISR safe FreeRTOS API functions must *only* be called\r\n             * from interrupts that have been assigned a priority at or below\r\n             * configMAX_SYSCALL_INTERRUPT_PRIORITY.\r\n             *\r\n             * Numerically low interrupt priority numbers represent logically high\r\n             * interrupt priorities, therefore the priority of the interrupt must\r\n             * be set to a value equal to or numerically *higher* than\r\n             * configMAX_SYSCALL_INTERRUPT_PRIORITY.\r\n             *\r\n             * Interrupts that  use the FreeRTOS API must not be left at their\r\n             * default priority of  zero as that is the highest possible priority,\r\n             * which is guaranteed to be above configMAX_SYSCALL_INTERRUPT_PRIORITY,\r\n             * and  therefore also guaranteed to be invalid.\r\n             *\r\n             * FreeRTOS maintains separate thread and ISR API functions to ensure\r\n             * interrupt entry is as fast and simple as possible.\r\n             *\r\n             * The following links provide detailed information:\r\n             * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html\r\n             * https://www.FreeRTOS.org/FAQHelp.html */\r\n            configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );\r\n        }\r\n\r\n        /* Priority grouping:  The interrupt controller (NVIC) allows the bits\r\n         * that define each interrupt's priority to be split between bits that\r\n         * define the interrupt's pre-emption priority bits and bits that define\r\n         * the interrupt's sub-priority.  For simplicity all bits must be defined\r\n         * to be pre-emption priority bits.  The following assertion will fail if\r\n         * this is not the case (if some bits represent a sub-priority).\r\n         *\r\n         * If the application only uses CMSIS libraries for interrupt\r\n         * configuration then the correct setting can be achieved on all Cortex-M\r\n         * devices by calling NVIC_SetPriorityGrouping( 0 ); before starting the\r\n         * scheduler.  Note however that some vendor specific peripheral libraries\r\n         * assume a non-zero priority group setting, in which cases using a value\r\n         * of zero will result in unpredictable behaviour. */\r\n        configASSERT( ( portAIRCR_REG & portPRIORITY_GROUP_MASK ) <= ulMaxPRIGROUPValue );\r\n    }\r\n\r\n#endif /* #if ( ( configASSERT_DEFINED == 1 ) && ( portHAS_ARMV8M_MAIN_EXTENSION == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) && ( configENABLE_ACCESS_CONTROL_LIST == 1 ) )\r\n\r\n    void vPortGrantAccessToKernelObject( TaskHandle_t xInternalTaskHandle,\r\n                                         int32_t lInternalIndexOfKernelObject ) /* PRIVILEGED_FUNCTION */\r\n    {\r\n        uint32_t ulAccessControlListEntryIndex, ulAccessControlListEntryBit;\r\n        xMPU_SETTINGS * xTaskMpuSettings;\r\n\r\n        ulAccessControlListEntryIndex = ( ( uint32_t ) lInternalIndexOfKernelObject / portACL_ENTRY_SIZE_BITS );\r\n        ulAccessControlListEntryBit = ( ( uint32_t ) lInternalIndexOfKernelObject % portACL_ENTRY_SIZE_BITS );\r\n\r\n        xTaskMpuSettings = xTaskGetMPUSettings( xInternalTaskHandle );\r\n\r\n        xTaskMpuSettings->ulAccessControlList[ ulAccessControlListEntryIndex ] |= ( 1U << ulAccessControlListEntryBit );\r\n    }\r\n\r\n#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) && ( configENABLE_ACCESS_CONTROL_LIST == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) && ( configENABLE_ACCESS_CONTROL_LIST == 1 ) )\r\n\r\n    void vPortRevokeAccessToKernelObject( TaskHandle_t xInternalTaskHandle,\r\n                                          int32_t lInternalIndexOfKernelObject ) /* PRIVILEGED_FUNCTION */\r\n    {\r\n        uint32_t ulAccessControlListEntryIndex, ulAccessControlListEntryBit;\r\n        xMPU_SETTINGS * xTaskMpuSettings;\r\n\r\n        ulAccessControlListEntryIndex = ( ( uint32_t ) lInternalIndexOfKernelObject / portACL_ENTRY_SIZE_BITS );\r\n        ulAccessControlListEntryBit = ( ( uint32_t ) lInternalIndexOfKernelObject % portACL_ENTRY_SIZE_BITS );\r\n\r\n        xTaskMpuSettings = xTaskGetMPUSettings( xInternalTaskHandle );\r\n\r\n        xTaskMpuSettings->ulAccessControlList[ ulAccessControlListEntryIndex ] &= ~( 1U << ulAccessControlListEntryBit );\r\n    }\r\n\r\n#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) && ( configENABLE_ACCESS_CONTROL_LIST == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) )\r\n\r\n    #if ( configENABLE_ACCESS_CONTROL_LIST == 1 )\r\n\r\n        BaseType_t xPortIsAuthorizedToAccessKernelObject( int32_t lInternalIndexOfKernelObject ) /* PRIVILEGED_FUNCTION */\r\n        {\r\n            uint32_t ulAccessControlListEntryIndex, ulAccessControlListEntryBit;\r\n            BaseType_t xAccessGranted = pdFALSE;\r\n            const xMPU_SETTINGS * xTaskMpuSettings;\r\n\r\n            if( xSchedulerRunning == pdFALSE )\r\n            {\r\n                /* Grant access to all the kernel objects before the scheduler\r\n                 * is started. It is necessary because there is no task running\r\n                 * yet and therefore, we cannot use the permissions of any\r\n                 * task. */\r\n                xAccessGranted = pdTRUE;\r\n            }\r\n            else\r\n            {\r\n                xTaskMpuSettings = xTaskGetMPUSettings( NULL ); /* Calling task's MPU settings. */\r\n\r\n                ulAccessControlListEntryIndex = ( ( uint32_t ) lInternalIndexOfKernelObject / portACL_ENTRY_SIZE_BITS );\r\n                ulAccessControlListEntryBit = ( ( uint32_t ) lInternalIndexOfKernelObject % portACL_ENTRY_SIZE_BITS );\r\n\r\n                if( ( xTaskMpuSettings->ulTaskFlags & portTASK_IS_PRIVILEGED_FLAG ) == portTASK_IS_PRIVILEGED_FLAG )\r\n                {\r\n                    xAccessGranted = pdTRUE;\r\n                }\r\n                else\r\n                {\r\n                    if( ( xTaskMpuSettings->ulAccessControlList[ ulAccessControlListEntryIndex ] & ( 1U << ulAccessControlListEntryBit ) ) != 0 )\r\n                    {\r\n                        xAccessGranted = pdTRUE;\r\n                    }\r\n                }\r\n            }\r\n\r\n            return xAccessGranted;\r\n        }\r\n\r\n    #else /* #if ( configENABLE_ACCESS_CONTROL_LIST == 1 ) */\r\n\r\n        BaseType_t xPortIsAuthorizedToAccessKernelObject( int32_t lInternalIndexOfKernelObject ) /* PRIVILEGED_FUNCTION */\r\n        {\r\n            ( void ) lInternalIndexOfKernelObject;\r\n\r\n            /* If Access Control List feature is not used, all the tasks have\r\n             * access to all the kernel objects. */\r\n            return pdTRUE;\r\n        }\r\n\r\n    #endif /* #if ( configENABLE_ACCESS_CONTROL_LIST == 1 ) */\r\n\r\n#endif /* #if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) ) */\r\n/*-----------------------------------------------------------*/\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.c",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n/* Standard includes. */\r\n#include <stdint.h>\r\n\r\n/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE ensures that PRIVILEGED_FUNCTION\r\n * is defined correctly and privileged functions are placed in correct sections. */\r\n#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n/* Portasm includes. */\r\n#include \"portasm.h\"\r\n\r\n/* System call numbers includes. */\r\n#include \"mpu_syscall_numbers.h\"\r\n\r\n/* MPU_WRAPPERS_INCLUDED_FROM_API_FILE is needed to be defined only for the\r\n * header files. */\r\n#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n#if ( configENABLE_MPU == 1 )\r\n\r\n    void vRestoreContextOfFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                 \\n\"\r\n            \"                                                 \\n\"\r\n            \" program_mpu_first_task:                         \\n\"\r\n            \"    ldr r2, pxCurrentTCBConst2                   \\n\" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */\r\n            \"    ldr r0, [r2]                                 \\n\" /* r0 = pxCurrentTCB. */\r\n            \"                                                 \\n\"\r\n            \"    dmb                                          \\n\" /* Complete outstanding transfers before disabling MPU. */\r\n            \"    ldr r1, xMPUCTRLConst2                       \\n\" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */\r\n            \"    ldr r2, [r1]                                 \\n\" /* Read the value of MPU_CTRL. */\r\n            \"    bic r2, #1                                   \\n\" /* r2 = r2 & ~1 i.e. Clear the bit 0 in r2. */\r\n            \"    str r2, [r1]                                 \\n\" /* Disable MPU. */\r\n            \"                                                 \\n\"\r\n            \"    adds r0, #4                                  \\n\" /* r0 = r0 + 4. r0 now points to MAIR0 in TCB. */\r\n            \"    ldr r1, [r0]                                 \\n\" /* r1 = *r0 i.e. r1 = MAIR0. */\r\n            \"    ldr r2, xMAIR0Const2                         \\n\" /* r2 = 0xe000edc0 [Location of MAIR0]. */\r\n            \"    str r1, [r2]                                 \\n\" /* Program MAIR0. */\r\n            \"                                                 \\n\"\r\n            \"    adds r0, #4                                  \\n\" /* r0 = r0 + 4. r0 now points to first RBAR in TCB. */\r\n            \"    ldr r1, xRNRConst2                           \\n\" /* r1 = 0xe000ed98 [Location of RNR]. */\r\n            \"    ldr r2, xRBARConst2                          \\n\" /* r2 = 0xe000ed9c [Location of RBAR]. */\r\n            \"                                                 \\n\"\r\n            \"    movs r3, #4                                  \\n\" /* r3 = 4. */\r\n            \"    str r3, [r1]                                 \\n\" /* Program RNR = 4. */\r\n            \"    ldmia r0!, {r4-r11}                          \\n\" /* Read 4 sets of RBAR/RLAR registers from TCB. */\r\n            \"    stmia r2, {r4-r11}                           \\n\" /* Write 4 set of RBAR/RLAR registers using alias registers. */\r\n            \"                                                 \\n\"\r\n            #if ( configTOTAL_MPU_REGIONS == 16 )\r\n                \"    movs r3, #8                                  \\n\" /* r3 = 8. */\r\n                \"    str r3, [r1]                                 \\n\" /* Program RNR = 8. */\r\n                \"    ldmia r0!, {r4-r11}                          \\n\" /* Read 4 sets of RBAR/RLAR registers from TCB. */\r\n                \"    stmia r2, {r4-r11}                           \\n\" /* Write 4 set of RBAR/RLAR registers using alias registers. */\r\n                \"    movs r3, #12                                 \\n\" /* r3 = 12. */\r\n                \"    str r3, [r1]                                 \\n\" /* Program RNR = 12. */\r\n                \"    ldmia r0!, {r4-r11}                          \\n\" /* Read 4 sets of RBAR/RLAR registers from TCB. */\r\n                \"    stmia r2, {r4-r11}                           \\n\" /* Write 4 set of RBAR/RLAR registers using alias registers. */\r\n            #endif /* configTOTAL_MPU_REGIONS == 16 */\r\n            \"                                                 \\n\"\r\n            \"   ldr r1, xMPUCTRLConst2                        \\n\" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */\r\n            \"   ldr r2, [r1]                                  \\n\" /* Read the value of MPU_CTRL. */\r\n            \"   orr r2, #1                                    \\n\" /* r2 = r2 | 1 i.e. Set the bit 0 in r2. */\r\n            \"   str r2, [r1]                                  \\n\" /* Enable MPU. */\r\n            \"   dsb                                           \\n\" /* Force memory writes before continuing. */\r\n            \"                                                 \\n\"\r\n            \" restore_context_first_task:                     \\n\"\r\n            \"    ldr r2, pxCurrentTCBConst2                   \\n\" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */\r\n            \"    ldr r0, [r2]                                 \\n\" /* r0 = pxCurrentTCB.*/\r\n            \"    ldr r1, [r0]                                 \\n\" /* r1 = Location of saved context in TCB. */\r\n            \"                                                 \\n\"\r\n            \" restore_special_regs_first_task:                \\n\"\r\n            \"    ldmdb r1!, {r2-r4, lr}                       \\n\" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */\r\n            \"    msr psp, r2                                  \\n\"\r\n            \"    msr psplim, r3                               \\n\"\r\n            \"    msr control, r4                              \\n\"\r\n            \"                                                 \\n\"\r\n            \" restore_general_regs_first_task:                \\n\"\r\n            \"    ldmdb r1!, {r4-r11}                          \\n\" /* r4-r11 contain hardware saved context. */\r\n            \"    stmia r2!, {r4-r11}                          \\n\" /* Copy the hardware saved context on the task stack. */\r\n            \"    ldmdb r1!, {r4-r11}                          \\n\" /* r4-r11 restored. */\r\n            \"                                                 \\n\"\r\n            \" restore_context_done_first_task:                \\n\"\r\n            \"    str r1, [r0]                                 \\n\" /* Save the location where the context should be saved next as the first member of TCB. */\r\n            \"    mov r0, #0                                   \\n\"\r\n            \"    msr basepri, r0                              \\n\" /* Ensure that interrupts are enabled when the first task starts. */\r\n            \"    bx lr                                        \\n\"\r\n            \"                                                 \\n\"\r\n            \" .align 4                                        \\n\"\r\n            \" pxCurrentTCBConst2: .word pxCurrentTCB          \\n\"\r\n            \" xMPUCTRLConst2: .word 0xe000ed94                \\n\"\r\n            \" xMAIR0Const2: .word 0xe000edc0                  \\n\"\r\n            \" xRNRConst2: .word 0xe000ed98                    \\n\"\r\n            \" xRBARConst2: .word 0xe000ed9c                   \\n\"\r\n        );\r\n    }\r\n\r\n#else /* configENABLE_MPU */\r\n\r\n    void vRestoreContextOfFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \"   .syntax unified                                 \\n\"\r\n            \"                                                   \\n\"\r\n            \"   ldr  r2, pxCurrentTCBConst2                     \\n\" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */\r\n            \"   ldr  r1, [r2]                                   \\n\" /* Read pxCurrentTCB. */\r\n            \"   ldr  r0, [r1]                                   \\n\" /* Read top of stack from TCB - The first item in pxCurrentTCB is the task top of stack. */\r\n            \"                                                   \\n\"\r\n            \"   ldm  r0!, {r1-r2}                               \\n\" /* Read from stack - r1 = PSPLIM and r2 = EXC_RETURN. */\r\n            \"   msr  psplim, r1                                 \\n\" /* Set this task's PSPLIM value. */\r\n            \"   movs r1, #2                                     \\n\" /* r1 = 2. */\r\n            \"   msr  CONTROL, r1                                \\n\" /* Switch to use PSP in the thread mode. */\r\n            \"   adds r0, #32                                    \\n\" /* Discard everything up to r0. */\r\n            \"   msr  psp, r0                                    \\n\" /* This is now the new top of stack to use in the task. */\r\n            \"   isb                                             \\n\"\r\n            \"   mov  r0, #0                                     \\n\"\r\n            \"   msr  basepri, r0                                \\n\" /* Ensure that interrupts are enabled when the first task starts. */\r\n            \"   bx   r2                                         \\n\" /* Finally, branch to EXC_RETURN. */\r\n            \"                                                   \\n\"\r\n            \"   .align 4                                        \\n\"\r\n            \"pxCurrentTCBConst2: .word pxCurrentTCB             \\n\"\r\n        );\r\n    }\r\n\r\n#endif /* configENABLE_MPU */\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */\r\n{\r\n    __asm volatile\r\n    (\r\n        \"   .syntax unified                                 \\n\"\r\n        \"                                                   \\n\"\r\n        \"   mrs r0, control                                 \\n\" /* r0 = CONTROL. */\r\n        \"   tst r0, #1                                      \\n\" /* Perform r0 & 1 (bitwise AND) and update the conditions flag. */\r\n        \"   ite ne                                          \\n\"\r\n        \"   movne r0, #0                                    \\n\" /* CONTROL[0]!=0. Return false to indicate that the processor is not privileged. */\r\n        \"   moveq r0, #1                                    \\n\" /* CONTROL[0]==0. Return true to indicate that the processor is privileged. */\r\n        \"   bx lr                                           \\n\" /* Return. */\r\n        \"                                                   \\n\"\r\n        \"   .align 4                                        \\n\"\r\n        ::: \"r0\", \"memory\"\r\n    );\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vRaisePrivilege( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */\r\n{\r\n    __asm volatile\r\n    (\r\n        \"   .syntax unified                                 \\n\"\r\n        \"                                                   \\n\"\r\n        \"   mrs  r0, control                                \\n\" /* Read the CONTROL register. */\r\n        \"   bic r0, #1                                      \\n\" /* Clear the bit 0. */\r\n        \"   msr  control, r0                                \\n\" /* Write back the new CONTROL value. */\r\n        \"   bx lr                                           \\n\" /* Return to the caller. */\r\n        ::: \"r0\", \"memory\"\r\n    );\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vResetPrivilege( void ) /* __attribute__ (( naked )) */\r\n{\r\n    __asm volatile\r\n    (\r\n        \"   .syntax unified                                 \\n\"\r\n        \"                                                   \\n\"\r\n        \"   mrs r0, control                                 \\n\" /* r0 = CONTROL. */\r\n        \"   orr r0, #1                                      \\n\" /* r0 = r0 | 1. */\r\n        \"   msr control, r0                                 \\n\" /* CONTROL = r0. */\r\n        \"   bx lr                                           \\n\" /* Return to the caller. */\r\n        ::: \"r0\", \"memory\"\r\n    );\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vStartFirstTask( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */\r\n{\r\n    __asm volatile\r\n    (\r\n        \"   .syntax unified                                 \\n\"\r\n        \"                                                   \\n\"\r\n        \"   ldr r0, xVTORConst                              \\n\" /* Use the NVIC offset register to locate the stack. */\r\n        \"   ldr r0, [r0]                                    \\n\" /* Read the VTOR register which gives the address of vector table. */\r\n        \"   ldr r0, [r0]                                    \\n\" /* The first entry in vector table is stack pointer. */\r\n        \"   msr msp, r0                                     \\n\" /* Set the MSP back to the start of the stack. */\r\n        \"   cpsie i                                         \\n\" /* Globally enable interrupts. */\r\n        \"   cpsie f                                         \\n\"\r\n        \"   dsb                                             \\n\"\r\n        \"   isb                                             \\n\"\r\n        \"   svc %0                                          \\n\" /* System call to start the first task. */\r\n        \"   nop                                             \\n\"\r\n        \"                                                   \\n\"\r\n        \"   .align 4                                        \\n\"\r\n        \"xVTORConst: .word 0xe000ed08                       \\n\"\r\n        ::\"i\" ( portSVC_START_SCHEDULER ) : \"memory\"\r\n    );\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nuint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */\r\n{\r\n    __asm volatile\r\n    (\r\n        \"   .syntax unified                                 \\n\"\r\n        \"                                                   \\n\"\r\n        \"   mrs r0, basepri                                 \\n\" /* r0 = basepri. Return original basepri value. */\r\n        \"   mov r1, %0                                      \\n\" /* r1 = configMAX_SYSCALL_INTERRUPT_PRIORITY. */\r\n        \"   msr basepri, r1                                 \\n\" /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */\r\n        \"   dsb                                             \\n\"\r\n        \"   isb                                             \\n\"\r\n        \"   bx lr                                           \\n\" /* Return. */\r\n        ::\"i\" ( configMAX_SYSCALL_INTERRUPT_PRIORITY ) : \"memory\"\r\n    );\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vClearInterruptMask( __attribute__( ( unused ) ) uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */\r\n{\r\n    __asm volatile\r\n    (\r\n        \"   .syntax unified                                 \\n\"\r\n        \"                                                   \\n\"\r\n        \"   msr basepri, r0                                 \\n\" /* basepri = ulMask. */\r\n        \"   dsb                                             \\n\"\r\n        \"   isb                                             \\n\"\r\n        \"   bx lr                                           \\n\" /* Return. */\r\n        ::: \"memory\"\r\n    );\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configENABLE_MPU == 1 )\r\n\r\n    void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \" .syntax unified                                 \\n\"\r\n            \"                                                 \\n\"\r\n            \" ldr r2, pxCurrentTCBConst                       \\n\" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */\r\n            \" ldr r0, [r2]                                    \\n\" /* r0 = pxCurrentTCB. */\r\n            \" ldr r1, [r0]                                    \\n\" /* r1 = Location in TCB where the context should be saved. */\r\n            \" mrs r2, psp                                     \\n\" /* r2 = PSP. */\r\n            \"                                                 \\n\"\r\n            \" save_general_regs:                              \\n\"\r\n            #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )\r\n                \"    add r2, r2, #0x20                            \\n\" /* Move r2 to location where s0 is saved. */\r\n                \"    tst lr, #0x10                                \\n\"\r\n                \"    ittt eq                                      \\n\"\r\n                \"    vstmiaeq r1!, {s16-s31}                      \\n\" /* Store s16-s31. */\r\n                \"    vldmiaeq r2, {s0-s16}                        \\n\" /* Copy hardware saved FP context into s0-s16. */\r\n                \"    vstmiaeq r1!, {s0-s16}                       \\n\" /* Store hardware saved FP context. */\r\n                \"    sub r2, r2, #0x20                            \\n\" /* Set r2 back to the location of hardware saved context. */\r\n            #endif /* configENABLE_FPU || configENABLE_MVE */\r\n            \"                                                 \\n\"\r\n            \"    stmia r1!, {r4-r11}                          \\n\" /* Store r4-r11. */\r\n            \"    ldmia r2, {r4-r11}                           \\n\" /* Copy the hardware saved context into r4-r11. */\r\n            \"    stmia r1!, {r4-r11}                          \\n\" /* Store the hardware saved context. */\r\n            \"                                                 \\n\"\r\n            \" save_special_regs:                              \\n\"\r\n            \"    mrs r3, psplim                               \\n\" /* r3 = PSPLIM. */\r\n            \"    mrs r4, control                              \\n\" /* r4 = CONTROL. */\r\n            \"    stmia r1!, {r2-r4, lr}                       \\n\" /* Store original PSP (after hardware has saved context), PSPLIM, CONTROL and LR. */\r\n            \"    str r1, [r0]                                 \\n\" /* Save the location from where the context should be restored as the first member of TCB. */\r\n            \"                                                 \\n\"\r\n            \" select_next_task:                               \\n\"\r\n            \"    mov r0, %0                                   \\n\" /* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */\r\n            \"    msr basepri, r0                              \\n\" /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */\r\n            \"    dsb                                          \\n\"\r\n            \"    isb                                          \\n\"\r\n            \"    bl vTaskSwitchContext                        \\n\"\r\n            \"    mov r0, #0                                   \\n\" /* r0 = 0. */\r\n            \"    msr basepri, r0                              \\n\" /* Enable interrupts. */\r\n            \"                                                 \\n\"\r\n            \" program_mpu:                                    \\n\"\r\n            \"    ldr r2, pxCurrentTCBConst                    \\n\" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */\r\n            \"    ldr r0, [r2]                                 \\n\" /* r0 = pxCurrentTCB. */\r\n            \"                                                 \\n\"\r\n            \"    dmb                                          \\n\" /* Complete outstanding transfers before disabling MPU. */\r\n            \"    ldr r1, xMPUCTRLConst                        \\n\" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */\r\n            \"    ldr r2, [r1]                                 \\n\" /* Read the value of MPU_CTRL. */\r\n            \"    bic r2, #1                                   \\n\" /* r2 = r2 & ~1 i.e. Clear the bit 0 in r2. */\r\n            \"    str r2, [r1]                                 \\n\" /* Disable MPU. */\r\n            \"                                                 \\n\"\r\n            \"    adds r0, #4                                  \\n\" /* r0 = r0 + 4. r0 now points to MAIR0 in TCB. */\r\n            \"    ldr r1, [r0]                                 \\n\" /* r1 = *r0 i.e. r1 = MAIR0. */\r\n            \"    ldr r2, xMAIR0Const                          \\n\" /* r2 = 0xe000edc0 [Location of MAIR0]. */\r\n            \"    str r1, [r2]                                 \\n\" /* Program MAIR0. */\r\n            \"                                                 \\n\"\r\n            \"    adds r0, #4                                  \\n\" /* r0 = r0 + 4. r0 now points to first RBAR in TCB. */\r\n            \"    ldr r1, xRNRConst                            \\n\" /* r1 = 0xe000ed98 [Location of RNR]. */\r\n            \"    ldr r2, xRBARConst                           \\n\" /* r2 = 0xe000ed9c [Location of RBAR]. */\r\n            \"                                                 \\n\"\r\n            \"    movs r3, #4                                  \\n\" /* r3 = 4. */\r\n            \"    str r3, [r1]                                 \\n\" /* Program RNR = 4. */\r\n            \"    ldmia r0!, {r4-r11}                          \\n\" /* Read 4 sets of RBAR/RLAR registers from TCB. */\r\n            \"    stmia r2, {r4-r11}                           \\n\" /* Write 4 set of RBAR/RLAR registers using alias registers. */\r\n            \"                                                 \\n\"\r\n            #if ( configTOTAL_MPU_REGIONS == 16 )\r\n                \"    movs r3, #8                                  \\n\" /* r3 = 8. */\r\n                \"    str r3, [r1]                                 \\n\" /* Program RNR = 8. */\r\n                \"    ldmia r0!, {r4-r11}                          \\n\" /* Read 4 sets of RBAR/RLAR registers from TCB. */\r\n                \"    stmia r2, {r4-r11}                           \\n\" /* Write 4 set of RBAR/RLAR registers using alias registers. */\r\n                \"    movs r3, #12                                 \\n\" /* r3 = 12. */\r\n                \"    str r3, [r1]                                 \\n\" /* Program RNR = 12. */\r\n                \"    ldmia r0!, {r4-r11}                          \\n\" /* Read 4 sets of RBAR/RLAR registers from TCB. */\r\n                \"    stmia r2, {r4-r11}                           \\n\" /* Write 4 set of RBAR/RLAR registers using alias registers. */\r\n            #endif /* configTOTAL_MPU_REGIONS == 16 */\r\n            \"                                                 \\n\"\r\n            \"   ldr r1, xMPUCTRLConst                         \\n\" /* r1 = 0xe000ed94 [Location of MPU_CTRL]. */\r\n            \"   ldr r2, [r1]                                  \\n\" /* Read the value of MPU_CTRL. */\r\n            \"   orr r2, #1                                    \\n\" /* r2 = r2 | 1 i.e. Set the bit 0 in r2. */\r\n            \"   str r2, [r1]                                  \\n\" /* Enable MPU. */\r\n            \"   dsb                                           \\n\" /* Force memory writes before continuing. */\r\n            \"                                                 \\n\"\r\n            \" restore_context:                                \\n\"\r\n            \"    ldr r2, pxCurrentTCBConst                    \\n\" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */\r\n            \"    ldr r0, [r2]                                 \\n\" /* r0 = pxCurrentTCB.*/\r\n            \"    ldr r1, [r0]                                 \\n\" /* r1 = Location of saved context in TCB. */\r\n            \"                                                 \\n\"\r\n            \" restore_special_regs:                           \\n\"\r\n            \"    ldmdb r1!, {r2-r4, lr}                       \\n\" /* r2 = original PSP, r3 = PSPLIM, r4 = CONTROL, LR restored. */\r\n            \"    msr psp, r2                                  \\n\"\r\n            \"    msr psplim, r3                               \\n\"\r\n            \"    msr control, r4                              \\n\"\r\n            \"                                                 \\n\"\r\n            \" restore_general_regs:                           \\n\"\r\n            \"    ldmdb r1!, {r4-r11}                          \\n\" /* r4-r11 contain hardware saved context. */\r\n            \"    stmia r2!, {r4-r11}                          \\n\" /* Copy the hardware saved context on the task stack. */\r\n            \"    ldmdb r1!, {r4-r11}                          \\n\" /* r4-r11 restored. */\r\n            #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )\r\n                \"    tst lr, #0x10                                \\n\"\r\n                \"    ittt eq                                      \\n\"\r\n                \"    vldmdbeq r1!, {s0-s16}                       \\n\" /* s0-s16 contain hardware saved FP context. */\r\n                \"    vstmiaeq r2!, {s0-s16}                       \\n\" /* Copy hardware saved FP context on the task stack. */\r\n                \"    vldmdbeq r1!, {s16-s31}                      \\n\" /* Restore s16-s31. */\r\n            #endif /* configENABLE_FPU || configENABLE_MVE */\r\n            \"                                                 \\n\"\r\n            \" restore_context_done:                           \\n\"\r\n            \"    str r1, [r0]                                 \\n\" /* Save the location where the context should be saved next as the first member of TCB. */\r\n            \"    bx lr                                        \\n\"\r\n            \"                                                 \\n\"\r\n            \" .align 4                                        \\n\"\r\n            \" pxCurrentTCBConst: .word pxCurrentTCB           \\n\"\r\n            \" xMPUCTRLConst: .word 0xe000ed94                 \\n\"\r\n            \" xMAIR0Const: .word 0xe000edc0                   \\n\"\r\n            \" xRNRConst: .word 0xe000ed98                     \\n\"\r\n            \" xRBARConst: .word 0xe000ed9c                    \\n\"\r\n            ::\"i\" ( configMAX_SYSCALL_INTERRUPT_PRIORITY )\r\n        );\r\n    }\r\n\r\n#else /* configENABLE_MPU */\r\n\r\n    void PendSV_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \"   .syntax unified                                 \\n\"\r\n            \"                                                   \\n\"\r\n            \"   mrs r0, psp                                     \\n\" /* Read PSP in r0. */\r\n            \"                                                   \\n\"\r\n            #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )\r\n                \"   tst lr, #0x10                                   \\n\" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */\r\n                \"   it eq                                           \\n\"\r\n                \"   vstmdbeq r0!, {s16-s31}                         \\n\" /* Store the additional FP context registers which are not saved automatically. */\r\n            #endif /* configENABLE_FPU || configENABLE_MVE */\r\n            \"                                                   \\n\"\r\n            \"   mrs r2, psplim                                  \\n\" /* r2 = PSPLIM. */\r\n            \"   mov r3, lr                                      \\n\" /* r3 = LR/EXC_RETURN. */\r\n            \"   stmdb r0!, {r2-r11}                             \\n\" /* Store on the stack - PSPLIM, LR and registers that are not automatically saved. */\r\n            \"                                                   \\n\"\r\n            \"   ldr r2, pxCurrentTCBConst                       \\n\" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */\r\n            \"   ldr r1, [r2]                                    \\n\" /* Read pxCurrentTCB. */\r\n            \"   str r0, [r1]                                    \\n\" /* Save the new top of stack in TCB. */\r\n            \"                                                   \\n\"\r\n            \"   mov r0, %0                                      \\n\" /* r0 = configMAX_SYSCALL_INTERRUPT_PRIORITY */\r\n            \"   msr basepri, r0                                 \\n\" /* Disable interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY. */\r\n            \"   dsb                                             \\n\"\r\n            \"   isb                                             \\n\"\r\n            \"   bl vTaskSwitchContext                           \\n\"\r\n            \"   mov r0, #0                                      \\n\" /* r0 = 0. */\r\n            \"   msr basepri, r0                                 \\n\" /* Enable interrupts. */\r\n            \"                                                   \\n\"\r\n            \"   ldr r2, pxCurrentTCBConst                       \\n\" /* Read the location of pxCurrentTCB i.e. &( pxCurrentTCB ). */\r\n            \"   ldr r1, [r2]                                    \\n\" /* Read pxCurrentTCB. */\r\n            \"   ldr r0, [r1]                                    \\n\" /* The first item in pxCurrentTCB is the task top of stack. r0 now points to the top of stack. */\r\n            \"                                                   \\n\"\r\n            \"   ldmia r0!, {r2-r11}                             \\n\" /* Read from stack - r2 = PSPLIM, r3 = LR and r4-r11 restored. */\r\n            \"                                                   \\n\"\r\n            #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )\r\n                \"   tst r3, #0x10                                   \\n\" /* Test Bit[4] in LR. Bit[4] of EXC_RETURN is 0 if the Extended Stack Frame is in use. */\r\n                \"   it eq                                           \\n\"\r\n                \"   vldmiaeq r0!, {s16-s31}                         \\n\" /* Restore the additional FP context registers which are not restored automatically. */\r\n            #endif /* configENABLE_FPU || configENABLE_MVE */\r\n            \"                                                   \\n\"\r\n            \"   msr psplim, r2                                  \\n\" /* Restore the PSPLIM register value for the task. */\r\n            \"   msr psp, r0                                     \\n\" /* Remember the new top of stack for the task. */\r\n            \"   bx r3                                           \\n\"\r\n            \"                                                   \\n\"\r\n            \"   .align 4                                        \\n\"\r\n            \"pxCurrentTCBConst: .word pxCurrentTCB              \\n\"\r\n            ::\"i\" ( configMAX_SYSCALL_INTERRUPT_PRIORITY )\r\n        );\r\n    }\r\n\r\n#endif /* configENABLE_MPU */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) )\r\n\r\n    void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \".syntax unified                \\n\"\r\n            \".extern vPortSVCHandler_C      \\n\"\r\n            \".extern vSystemCallEnter       \\n\"\r\n            \".extern vSystemCallExit        \\n\"\r\n            \"                               \\n\"\r\n            \"tst lr, #4                     \\n\"\r\n            \"ite eq                         \\n\"\r\n            \"mrseq r0, msp                  \\n\"\r\n            \"mrsne r0, psp                  \\n\"\r\n            \"                               \\n\"\r\n            \"ldr r1, [r0, #24]              \\n\"\r\n            \"ldrb r2, [r1, #-2]             \\n\"\r\n            \"cmp r2, %0                     \\n\"\r\n            \"blt syscall_enter              \\n\"\r\n            \"cmp r2, %1                     \\n\"\r\n            \"beq syscall_exit               \\n\"\r\n            \"b vPortSVCHandler_C            \\n\"\r\n            \"                               \\n\"\r\n            \"syscall_enter:                 \\n\"\r\n            \"    mov r1, lr                 \\n\"\r\n            \"    b vSystemCallEnter         \\n\"\r\n            \"                               \\n\"\r\n            \"syscall_exit:                  \\n\"\r\n            \"    mov r1, lr                 \\n\"\r\n            \"    b vSystemCallExit          \\n\"\r\n            \"                               \\n\"\r\n            : /* No outputs. */\r\n            : \"i\" ( NUM_SYSTEM_CALLS ), \"i\" ( portSVC_SYSTEM_CALL_EXIT )\r\n            : \"r0\", \"r1\", \"r2\", \"memory\"\r\n        );\r\n    }\r\n\r\n#else /* ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) */\r\n\r\n    void SVC_Handler( void ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */\r\n    {\r\n        __asm volatile\r\n        (\r\n            \"   .syntax unified                                 \\n\"\r\n            \"                                                   \\n\"\r\n            \"   tst lr, #4                                      \\n\"\r\n            \"   ite eq                                          \\n\"\r\n            \"   mrseq r0, msp                                   \\n\"\r\n            \"   mrsne r0, psp                                   \\n\"\r\n            \"   ldr r1, svchandler_address_const                \\n\"\r\n            \"   bx r1                                           \\n\"\r\n            \"                                                   \\n\"\r\n            \"   .align 4                                        \\n\"\r\n            \"svchandler_address_const: .word vPortSVCHandler_C  \\n\"\r\n        );\r\n    }\r\n\r\n#endif /* ( configENABLE_MPU == 1 ) && ( configUSE_MPU_WRAPPERS_V1 == 0 ) */\r\n/*-----------------------------------------------------------*/\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/portable/GCC/ARM_CM33_NTZ/non_secure/portasm.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n#ifndef __PORT_ASM_H__\r\n#define __PORT_ASM_H__\r\n\r\n/* Scheduler includes. */\r\n#include \"FreeRTOS.h\"\r\n\r\n/* MPU wrappers includes. */\r\n#include \"mpu_wrappers.h\"\r\n\r\n/**\r\n * @brief Restore the context of the first task so that the first task starts\r\n * executing.\r\n */\r\nvoid vRestoreContextOfFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * @brief Checks whether or not the processor is privileged.\r\n *\r\n * @return 1 if the processor is already privileged, 0 otherwise.\r\n */\r\nBaseType_t xIsPrivileged( void ) __attribute__( ( naked ) );\r\n\r\n/**\r\n * @brief Raises the privilege level by clearing the bit 0 of the CONTROL\r\n * register.\r\n *\r\n * @note This is a privileged function and should only be called from the kenrel\r\n * code.\r\n *\r\n * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.\r\n *  Bit[0] = 0 --> The processor is running privileged\r\n *  Bit[0] = 1 --> The processor is running unprivileged.\r\n */\r\nvoid vRaisePrivilege( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * @brief Lowers the privilege level by setting the bit 0 of the CONTROL\r\n * register.\r\n *\r\n * Bit 0 of the CONTROL register defines the privilege level of Thread Mode.\r\n *  Bit[0] = 0 --> The processor is running privileged\r\n *  Bit[0] = 1 --> The processor is running unprivileged.\r\n */\r\nvoid vResetPrivilege( void ) __attribute__( ( naked ) );\r\n\r\n/**\r\n * @brief Starts the first task.\r\n */\r\nvoid vStartFirstTask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * @brief Disables interrupts.\r\n */\r\nuint32_t ulSetInterruptMask( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * @brief Enables interrupts.\r\n */\r\nvoid vClearInterruptMask( uint32_t ulMask ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * @brief PendSV Exception handler.\r\n */\r\nvoid PendSV_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * @brief SVC Handler.\r\n */\r\nvoid SVC_Handler( void ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;\r\n\r\n/**\r\n * @brief Allocate a Secure context for the calling task.\r\n *\r\n * @param[in] ulSecureStackSize The size of the stack to be allocated on the\r\n * secure side for the calling task.\r\n */\r\nvoid vPortAllocateSecureContext( uint32_t ulSecureStackSize ) __attribute__( ( naked ) );\r\n\r\n/**\r\n * @brief Free the task's secure context.\r\n *\r\n * @param[in] pulTCB Pointer to the Task Control Block (TCB) of the task.\r\n */\r\nvoid vPortFreeSecureContext( uint32_t * pulTCB ) __attribute__( ( naked ) ) PRIVILEGED_FUNCTION;\r\n\r\n#endif /* __PORT_ASM_H__ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/portable/GCC/ARM_CM33_NTZ/non_secure/portmacro.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n#ifndef PORTMACRO_H\r\n#define PORTMACRO_H\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    extern \"C\" {\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n/*------------------------------------------------------------------------------\r\n * Port specific definitions.\r\n *\r\n * The settings in this file configure FreeRTOS correctly for the given hardware\r\n * and compiler.\r\n *\r\n * These settings should not be altered.\r\n *------------------------------------------------------------------------------\r\n */\r\n\r\n/**\r\n * Architecture specifics.\r\n */\r\n#define portARCH_NAME                    \"Cortex-M33\"\r\n#define portHAS_ARMV8M_MAIN_EXTENSION    1\r\n#define portDONT_DISCARD                 __attribute__( ( used ) )\r\n/*-----------------------------------------------------------*/\r\n\r\n/* ARMv8-M common port configurations. */\r\n#include \"portmacrocommon.h\"\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief Critical section management.\r\n */\r\n#define portDISABLE_INTERRUPTS()    ulSetInterruptMask()\r\n#define portENABLE_INTERRUPTS()     vClearInterruptMask( 0 )\r\n/*-----------------------------------------------------------*/\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    }\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n#endif /* PORTMACRO_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/portable/GCC/ARM_CM33_NTZ/non_secure/portmacrocommon.h",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n#ifndef PORTMACROCOMMON_H\r\n#define PORTMACROCOMMON_H\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    extern \"C\" {\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n/*------------------------------------------------------------------------------\r\n * Port specific definitions.\r\n *\r\n * The settings in this file configure FreeRTOS correctly for the given hardware\r\n * and compiler.\r\n *\r\n * These settings should not be altered.\r\n *------------------------------------------------------------------------------\r\n */\r\n\r\n#ifndef configENABLE_FPU\r\n    #error configENABLE_FPU must be defined in FreeRTOSConfig.h.  Set configENABLE_FPU to 1 to enable the FPU or 0 to disable the FPU.\r\n#endif /* configENABLE_FPU */\r\n\r\n#ifndef configENABLE_MPU\r\n    #error configENABLE_MPU must be defined in FreeRTOSConfig.h.  Set configENABLE_MPU to 1 to enable the MPU or 0 to disable the MPU.\r\n#endif /* configENABLE_MPU */\r\n\r\n#ifndef configENABLE_TRUSTZONE\r\n    #error configENABLE_TRUSTZONE must be defined in FreeRTOSConfig.h.  Set configENABLE_TRUSTZONE to 1 to enable TrustZone or 0 to disable TrustZone.\r\n#endif /* configENABLE_TRUSTZONE */\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief Type definitions.\r\n */\r\n#define portCHAR          char\r\n#define portFLOAT         float\r\n#define portDOUBLE        double\r\n#define portLONG          long\r\n#define portSHORT         short\r\n#define portSTACK_TYPE    uint32_t\r\n#define portBASE_TYPE     long\r\n\r\ntypedef portSTACK_TYPE   StackType_t;\r\ntypedef long             BaseType_t;\r\ntypedef unsigned long    UBaseType_t;\r\n\r\n#if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS )\r\n    typedef uint16_t     TickType_t;\r\n    #define portMAX_DELAY              ( TickType_t ) 0xffff\r\n#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_32_BITS )\r\n    typedef uint32_t     TickType_t;\r\n    #define portMAX_DELAY              ( TickType_t ) 0xffffffffUL\r\n\r\n/* 32-bit tick type on a 32-bit architecture, so reads of the tick count do\r\n * not need to be guarded with a critical section. */\r\n    #define portTICK_TYPE_IS_ATOMIC    1\r\n#else\r\n    #error configTICK_TYPE_WIDTH_IN_BITS set to unsupported tick type width.\r\n#endif\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * Architecture specifics.\r\n */\r\n#define portSTACK_GROWTH                   ( -1 )\r\n#define portTICK_PERIOD_MS                 ( ( TickType_t ) 1000 / configTICK_RATE_HZ )\r\n#define portBYTE_ALIGNMENT                 8\r\n#define portNOP()\r\n#define portINLINE                         __inline\r\n#ifndef portFORCE_INLINE\r\n    #define portFORCE_INLINE               inline __attribute__( ( always_inline ) )\r\n#endif\r\n#define portHAS_STACK_OVERFLOW_CHECKING    1\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief Extern declarations.\r\n */\r\nextern BaseType_t xPortIsInsideInterrupt( void );\r\n\r\nextern void vPortYield( void ) /* PRIVILEGED_FUNCTION */;\r\n\r\nextern void vPortEnterCritical( void ) /* PRIVILEGED_FUNCTION */;\r\nextern void vPortExitCritical( void ) /* PRIVILEGED_FUNCTION */;\r\n\r\nextern uint32_t ulSetInterruptMask( void ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */;\r\nextern void vClearInterruptMask( uint32_t ulMask ) /* __attribute__(( naked )) PRIVILEGED_FUNCTION */;\r\n\r\n#if ( configENABLE_TRUSTZONE == 1 )\r\n    extern void vPortAllocateSecureContext( uint32_t ulSecureStackSize ); /* __attribute__ (( naked )) */\r\n    extern void vPortFreeSecureContext( uint32_t * pulTCB ) /* __attribute__ (( naked )) PRIVILEGED_FUNCTION */;\r\n#endif /* configENABLE_TRUSTZONE */\r\n\r\n#if ( configENABLE_MPU == 1 )\r\n    extern BaseType_t xIsPrivileged( void ) /* __attribute__ (( naked )) */;\r\n    extern void vResetPrivilege( void ) /* __attribute__ (( naked )) */;\r\n#endif /* configENABLE_MPU */\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief MPU specific constants.\r\n */\r\n#if ( configENABLE_MPU == 1 )\r\n    #define portUSING_MPU_WRAPPERS    1\r\n    #define portPRIVILEGE_BIT         ( 0x80000000UL )\r\n#else\r\n    #define portPRIVILEGE_BIT         ( 0x0UL )\r\n#endif /* configENABLE_MPU */\r\n\r\n/* MPU settings that can be overriden in FreeRTOSConfig.h. */\r\n#ifndef configTOTAL_MPU_REGIONS\r\n    /* Define to 8 for backward compatibility. */\r\n    #define configTOTAL_MPU_REGIONS    ( 8UL )\r\n#endif\r\n\r\n/* MPU regions. */\r\n#define portPRIVILEGED_FLASH_REGION                   ( 0UL )\r\n#define portUNPRIVILEGED_FLASH_REGION                 ( 1UL )\r\n#define portUNPRIVILEGED_SYSCALLS_REGION              ( 2UL )\r\n#define portPRIVILEGED_RAM_REGION                     ( 3UL )\r\n#define portSTACK_REGION                              ( 4UL )\r\n#define portFIRST_CONFIGURABLE_REGION                 ( 5UL )\r\n#define portLAST_CONFIGURABLE_REGION                  ( configTOTAL_MPU_REGIONS - 1UL )\r\n#define portNUM_CONFIGURABLE_REGIONS                  ( ( portLAST_CONFIGURABLE_REGION - portFIRST_CONFIGURABLE_REGION ) + 1 )\r\n#define portTOTAL_NUM_REGIONS                         ( portNUM_CONFIGURABLE_REGIONS + 1 )       /* Plus one to make space for the stack region. */\r\n\r\n/* Device memory attributes used in MPU_MAIR registers.\r\n *\r\n * 8-bit values encoded as follows:\r\n *  Bit[7:4] - 0000 - Device Memory\r\n *  Bit[3:2] - 00 --> Device-nGnRnE\r\n *              01 --> Device-nGnRE\r\n *              10 --> Device-nGRE\r\n *              11 --> Device-GRE\r\n *  Bit[1:0] - 00, Reserved.\r\n */\r\n#define portMPU_DEVICE_MEMORY_nGnRnE                  ( 0x00 )       /* 0000 0000 */\r\n#define portMPU_DEVICE_MEMORY_nGnRE                   ( 0x04 )       /* 0000 0100 */\r\n#define portMPU_DEVICE_MEMORY_nGRE                    ( 0x08 )       /* 0000 1000 */\r\n#define portMPU_DEVICE_MEMORY_GRE                     ( 0x0C )       /* 0000 1100 */\r\n\r\n/* Normal memory attributes used in MPU_MAIR registers. */\r\n#define portMPU_NORMAL_MEMORY_NON_CACHEABLE           ( 0x44 )       /* Non-cacheable. */\r\n#define portMPU_NORMAL_MEMORY_BUFFERABLE_CACHEABLE    ( 0xFF )       /* Non-Transient, Write-back, Read-Allocate and Write-Allocate. */\r\n\r\n/* Attributes used in MPU_RBAR registers. */\r\n#define portMPU_REGION_NON_SHAREABLE                  ( 0UL << 3UL )\r\n#define portMPU_REGION_INNER_SHAREABLE                ( 1UL << 3UL )\r\n#define portMPU_REGION_OUTER_SHAREABLE                ( 2UL << 3UL )\r\n\r\n#define portMPU_REGION_PRIVILEGED_READ_WRITE          ( 0UL << 1UL )\r\n#define portMPU_REGION_READ_WRITE                     ( 1UL << 1UL )\r\n#define portMPU_REGION_PRIVILEGED_READ_ONLY           ( 2UL << 1UL )\r\n#define portMPU_REGION_READ_ONLY                      ( 3UL << 1UL )\r\n\r\n#define portMPU_REGION_EXECUTE_NEVER                  ( 1UL )\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configENABLE_MPU == 1 )\r\n\r\n/**\r\n * @brief Settings to define an MPU region.\r\n */\r\n    typedef struct MPURegionSettings\r\n    {\r\n        uint32_t ulRBAR; /**< RBAR for the region. */\r\n        uint32_t ulRLAR; /**< RLAR for the region. */\r\n    } MPURegionSettings_t;\r\n\r\n    #if ( configUSE_MPU_WRAPPERS_V1 == 0 )\r\n\r\n        #ifndef configSYSTEM_CALL_STACK_SIZE\r\n            #error configSYSTEM_CALL_STACK_SIZE must be defined to the desired size of the system call stack in words for using MPU wrappers v2.\r\n        #endif\r\n\r\n/**\r\n * @brief System call stack.\r\n */\r\n        typedef struct SYSTEM_CALL_STACK_INFO\r\n        {\r\n            uint32_t ulSystemCallStackBuffer[ configSYSTEM_CALL_STACK_SIZE ];\r\n            uint32_t * pulSystemCallStack;\r\n            uint32_t * pulSystemCallStackLimit;\r\n            uint32_t * pulTaskStack;\r\n            uint32_t ulLinkRegisterAtSystemCallEntry;\r\n            uint32_t ulStackLimitRegisterAtSystemCallEntry;\r\n        } xSYSTEM_CALL_STACK_INFO;\r\n\r\n    #endif /* configUSE_MPU_WRAPPERS_V1 == 0 */\r\n\r\n/**\r\n * @brief MPU settings as stored in the TCB.\r\n */\r\n    #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) )\r\n\r\n        #if ( configENABLE_TRUSTZONE == 1 )\r\n\r\n/*\r\n * +-----------+---------------+----------+-----------------+------------------------------+-----+\r\n * |  s16-s31  | s0-s15, FPSCR |  r4-r11  | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, |     |\r\n * |           |               |          | PC, xPSR        | CONTROL, EXC_RETURN          |     |\r\n * +-----------+---------------+----------+-----------------+------------------------------+-----+\r\n *\r\n * <-----------><--------------><---------><----------------><-----------------------------><---->\r\n *      16             16            8               8                     5                   1\r\n */\r\n            #define MAX_CONTEXT_SIZE    54\r\n\r\n        #else /* #if( configENABLE_TRUSTZONE == 1 ) */\r\n\r\n/*\r\n * +-----------+---------------+----------+-----------------+----------------------+-----+\r\n * |  s16-s31  | s0-s15, FPSCR |  r4-r11  | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL |     |\r\n * |           |               |          | PC, xPSR        | EXC_RETURN           |     |\r\n * +-----------+---------------+----------+-----------------+----------------------+-----+\r\n *\r\n * <-----------><--------------><---------><----------------><---------------------><---->\r\n *      16             16            8               8                  4              1\r\n */\r\n            #define MAX_CONTEXT_SIZE    53\r\n\r\n        #endif /* #if( configENABLE_TRUSTZONE == 1 ) */\r\n\r\n    #else /* #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */\r\n\r\n        #if ( configENABLE_TRUSTZONE == 1 )\r\n\r\n/*\r\n * +----------+-----------------+------------------------------+-----+\r\n * |  r4-r11  | r0-r3, r12, LR, | xSecureContext, PSP, PSPLIM, |     |\r\n * |          | PC, xPSR        | CONTROL, EXC_RETURN          |     |\r\n * +----------+-----------------+------------------------------+-----+\r\n *\r\n * <---------><----------------><------------------------------><---->\r\n *     8               8                      5                   1\r\n */\r\n            #define MAX_CONTEXT_SIZE    22\r\n\r\n        #else /* #if( configENABLE_TRUSTZONE == 1 ) */\r\n\r\n/*\r\n * +----------+-----------------+----------------------+-----+\r\n * |  r4-r11  | r0-r3, r12, LR, | PSP, PSPLIM, CONTROL |     |\r\n * |          | PC, xPSR        | EXC_RETURN           |     |\r\n * +----------+-----------------+----------------------+-----+\r\n *\r\n * <---------><----------------><----------------------><---->\r\n *     8               8                  4              1\r\n */\r\n            #define MAX_CONTEXT_SIZE    21\r\n\r\n        #endif /* #if( configENABLE_TRUSTZONE == 1 ) */\r\n\r\n    #endif /* #if ( ( configENABLE_FPU == 1 ) || ( configENABLE_MVE == 1 ) ) */\r\n\r\n/* Flags used for xMPU_SETTINGS.ulTaskFlags member. */\r\n    #define portSTACK_FRAME_HAS_PADDING_FLAG    ( 1UL << 0UL )\r\n    #define portTASK_IS_PRIVILEGED_FLAG         ( 1UL << 1UL )\r\n\r\n/* Size of an Access Control List (ACL) entry in bits. */\r\n    #define portACL_ENTRY_SIZE_BITS             ( 32U )\r\n\r\n    typedef struct MPU_SETTINGS\r\n    {\r\n        uint32_t ulMAIR0;                                              /**< MAIR0 for the task containing attributes for all the 4 per task regions. */\r\n        MPURegionSettings_t xRegionsSettings[ portTOTAL_NUM_REGIONS ]; /**< Settings for 4 per task regions. */\r\n        uint32_t ulContext[ MAX_CONTEXT_SIZE ];\r\n        uint32_t ulTaskFlags;\r\n\r\n        #if ( configUSE_MPU_WRAPPERS_V1 == 0 )\r\n            xSYSTEM_CALL_STACK_INFO xSystemCallStackInfo;\r\n            #if ( configENABLE_ACCESS_CONTROL_LIST == 1 )\r\n                uint32_t ulAccessControlList[ ( configPROTECTED_KERNEL_OBJECT_POOL_SIZE / portACL_ENTRY_SIZE_BITS ) + 1 ];\r\n            #endif\r\n        #endif\r\n    } xMPU_SETTINGS;\r\n\r\n#endif /* configENABLE_MPU == 1 */\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief Validate priority of ISRs that are allowed to call FreeRTOS\r\n * system calls.\r\n */\r\n#ifdef configASSERT\r\n    #if ( portHAS_ARMV8M_MAIN_EXTENSION == 1 )\r\n        void vPortValidateInterruptPriority( void );\r\n        #define portASSERT_IF_INTERRUPT_PRIORITY_INVALID()    vPortValidateInterruptPriority()\r\n    #endif\r\n#endif\r\n\r\n/**\r\n * @brief SVC numbers.\r\n */\r\n#define portSVC_ALLOCATE_SECURE_CONTEXT    100\r\n#define portSVC_FREE_SECURE_CONTEXT        101\r\n#define portSVC_START_SCHEDULER            102\r\n#define portSVC_RAISE_PRIVILEGE            103\r\n#define portSVC_SYSTEM_CALL_EXIT           104\r\n#define portSVC_YIELD                      105\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief Scheduler utilities.\r\n */\r\n#if ( configENABLE_MPU == 1 )\r\n    #define portYIELD()               __asm volatile ( \"svc %0\" ::\"i\" ( portSVC_YIELD ) : \"memory\" )\r\n    #define portYIELD_WITHIN_API()    vPortYield()\r\n#else\r\n    #define portYIELD()               vPortYield()\r\n    #define portYIELD_WITHIN_API()    vPortYield()\r\n#endif\r\n\r\n#define portNVIC_INT_CTRL_REG     ( *( ( volatile uint32_t * ) 0xe000ed04 ) )\r\n#define portNVIC_PENDSVSET_BIT    ( 1UL << 28UL )\r\n#define portEND_SWITCHING_ISR( xSwitchRequired )            \\\r\n    do                                                      \\\r\n    {                                                       \\\r\n        if( xSwitchRequired )                               \\\r\n        {                                                   \\\r\n            traceISR_EXIT_TO_SCHEDULER();                   \\\r\n            portNVIC_INT_CTRL_REG = portNVIC_PENDSVSET_BIT; \\\r\n        }                                                   \\\r\n        else                                                \\\r\n        {                                                   \\\r\n            traceISR_EXIT();                                \\\r\n        }                                                   \\\r\n    } while( 0 )\r\n#define portYIELD_FROM_ISR( x )    portEND_SWITCHING_ISR( x )\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief Critical section management.\r\n */\r\n#define portSET_INTERRUPT_MASK_FROM_ISR()         ulSetInterruptMask()\r\n#define portCLEAR_INTERRUPT_MASK_FROM_ISR( x )    vClearInterruptMask( x )\r\n#define portENTER_CRITICAL()                      vPortEnterCritical()\r\n#define portEXIT_CRITICAL()                       vPortExitCritical()\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief Tickless idle/low power functionality.\r\n */\r\n#ifndef portSUPPRESS_TICKS_AND_SLEEP\r\n    extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime );\r\n    #define portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime )    vPortSuppressTicksAndSleep( xExpectedIdleTime )\r\n#endif\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief Task function macros as described on the FreeRTOS.org WEB site.\r\n */\r\n#define portTASK_FUNCTION_PROTO( vFunction, pvParameters )    void vFunction( void * pvParameters )\r\n#define portTASK_FUNCTION( vFunction, pvParameters )          void vFunction( void * pvParameters )\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configENABLE_TRUSTZONE == 1 )\r\n\r\n/**\r\n * @brief Allocate a secure context for the task.\r\n *\r\n * Tasks are not created with a secure context. Any task that is going to call\r\n * secure functions must call portALLOCATE_SECURE_CONTEXT() to allocate itself a\r\n * secure context before it calls any secure function.\r\n *\r\n * @param[in] ulSecureStackSize The size of the secure stack to be allocated.\r\n */\r\n    #define portALLOCATE_SECURE_CONTEXT( ulSecureStackSize )    vPortAllocateSecureContext( ulSecureStackSize )\r\n\r\n/**\r\n * @brief Called when a task is deleted to delete the task's secure context,\r\n * if it has one.\r\n *\r\n * @param[in] pxTCB The TCB of the task being deleted.\r\n */\r\n    #define portCLEAN_UP_TCB( pxTCB )                           vPortFreeSecureContext( ( uint32_t * ) pxTCB )\r\n#endif /* configENABLE_TRUSTZONE */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configENABLE_MPU == 1 )\r\n\r\n/**\r\n * @brief Checks whether or not the processor is privileged.\r\n *\r\n * @return 1 if the processor is already privileged, 0 otherwise.\r\n */\r\n    #define portIS_PRIVILEGED()      xIsPrivileged()\r\n\r\n/**\r\n * @brief Raise an SVC request to raise privilege.\r\n *\r\n * The SVC handler checks that the SVC was raised from a system call and only\r\n * then it raises the privilege. If this is called from any other place,\r\n * the privilege is not raised.\r\n */\r\n    #define portRAISE_PRIVILEGE()    __asm volatile ( \"svc %0 \\n\" ::\"i\" ( portSVC_RAISE_PRIVILEGE ) : \"memory\" );\r\n\r\n/**\r\n * @brief Lowers the privilege level by setting the bit 0 of the CONTROL\r\n * register.\r\n */\r\n    #define portRESET_PRIVILEGE()    vResetPrivilege()\r\n#else\r\n    #define portIS_PRIVILEGED()\r\n    #define portRAISE_PRIVILEGE()\r\n    #define portRESET_PRIVILEGE()\r\n#endif /* configENABLE_MPU */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configENABLE_MPU == 1 )\r\n\r\n    extern BaseType_t xPortIsTaskPrivileged( void );\r\n\r\n/**\r\n * @brief Checks whether or not the calling task is privileged.\r\n *\r\n * @return pdTRUE if the calling task is privileged, pdFALSE otherwise.\r\n */\r\n    #define portIS_TASK_PRIVILEGED()    xPortIsTaskPrivileged()\r\n\r\n#endif /* configENABLE_MPU == 1 */\r\n/*-----------------------------------------------------------*/\r\n\r\n/**\r\n * @brief Barriers.\r\n */\r\n#define portMEMORY_BARRIER()    __asm volatile ( \"\" ::: \"memory\" )\r\n/*-----------------------------------------------------------*/\r\n\r\n/* Select correct value of configUSE_PORT_OPTIMISED_TASK_SELECTION\r\n * based on whether or not Mainline extension is implemented. */\r\n#ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION\r\n    #if ( portHAS_ARMV8M_MAIN_EXTENSION == 1 )\r\n        #define configUSE_PORT_OPTIMISED_TASK_SELECTION    1\r\n    #else\r\n        #define configUSE_PORT_OPTIMISED_TASK_SELECTION    0\r\n    #endif\r\n#endif /* #ifndef configUSE_PORT_OPTIMISED_TASK_SELECTION */\r\n\r\n/**\r\n * @brief Port-optimised task selection.\r\n */\r\n#if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 1 )\r\n\r\n/**\r\n * @brief Count the number of leading zeros in a 32-bit value.\r\n */\r\n    static portFORCE_INLINE uint32_t ulPortCountLeadingZeros( uint32_t ulBitmap )\r\n    {\r\n        uint32_t ulReturn;\r\n\r\n        __asm volatile ( \"clz %0, %1\" : \"=r\" ( ulReturn ) : \"r\" ( ulBitmap ) : \"memory\" );\r\n\r\n        return ulReturn;\r\n    }\r\n\r\n/* Check the configuration. */\r\n    #if ( configMAX_PRIORITIES > 32 )\r\n        #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32.  It is very rare that a system requires more than 10 to 15 different priorities as tasks that share a priority will time slice.\r\n    #endif\r\n\r\n    #if ( portHAS_ARMV8M_MAIN_EXTENSION == 0 )\r\n        #error ARMv8-M baseline implementations (such as Cortex-M23) do not support port-optimised task selection.  Please set configUSE_PORT_OPTIMISED_TASK_SELECTION to 0 or leave it undefined.\r\n    #endif\r\n\r\n/**\r\n * @brief Store/clear the ready priorities in a bit map.\r\n */\r\n    #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities )      ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )\r\n    #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities )       ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )\r\n\r\n/**\r\n * @brief Get the priority of the highest-priority task that is ready to execute.\r\n */\r\n    #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities )    uxTopPriority = ( 31UL - ulPortCountLeadingZeros( ( uxReadyPriorities ) ) )\r\n\r\n#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */\r\n/*-----------------------------------------------------------*/\r\n\r\n/* *INDENT-OFF* */\r\n#ifdef __cplusplus\r\n    }\r\n#endif\r\n/* *INDENT-ON* */\r\n\r\n#endif /* PORTMACROCOMMON_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/portable/MemMang/ReadMe.url",
    "content": "[{000214A0-0000-0000-C000-000000000046}]\r\nProp3=19,2\r\n[InternetShortcut]\r\nURL=https://www.FreeRTOS.org/a00111.html\r\nIDList=\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/portable/MemMang/heap_3.c",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n\r\n/*\r\n * Implementation of pvPortMalloc() and vPortFree() that relies on the\r\n * compilers own malloc() and free() implementations.\r\n *\r\n * This file can only be used if the linker is configured to to generate\r\n * a heap memory area.\r\n *\r\n * See heap_1.c, heap_2.c and heap_4.c for alternative implementations, and the\r\n * memory management pages of https://www.FreeRTOS.org for more information.\r\n */\r\n\r\n#include <stdlib.h>\r\n\r\n/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining\r\n * all the API functions to use the MPU wrappers.  That should only be done when\r\n * task.h is included from an application file. */\r\n#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n#include \"FreeRTOS.h\"\r\n#include \"task.h\"\r\n\r\n#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 )\r\n    #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0\r\n#endif\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid * pvPortMalloc( size_t xWantedSize )\r\n{\r\n    void * pvReturn;\r\n\r\n    vTaskSuspendAll();\r\n    {\r\n        pvReturn = malloc( xWantedSize );\r\n        traceMALLOC( pvReturn, xWantedSize );\r\n    }\r\n    ( void ) xTaskResumeAll();\r\n\r\n    #if ( configUSE_MALLOC_FAILED_HOOK == 1 )\r\n    {\r\n        if( pvReturn == NULL )\r\n        {\r\n            vApplicationMallocFailedHook();\r\n        }\r\n    }\r\n    #endif\r\n\r\n    return pvReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vPortFree( void * pv )\r\n{\r\n    if( pv != NULL )\r\n    {\r\n        vTaskSuspendAll();\r\n        {\r\n            free( pv );\r\n            traceFREE( pv, 0 );\r\n        }\r\n        ( void ) xTaskResumeAll();\r\n    }\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/portable/MemMang/heap_4.c",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n/*\r\n * A sample implementation of pvPortMalloc() and vPortFree() that combines\r\n * (coalescences) adjacent memory blocks as they are freed, and in so doing\r\n * limits memory fragmentation.\r\n *\r\n * See heap_1.c, heap_2.c and heap_3.c for alternative implementations, and the\r\n * memory management pages of https://www.FreeRTOS.org for more information.\r\n */\r\n#include <stdlib.h>\r\n#include <string.h>\r\n\r\n/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining\r\n * all the API functions to use the MPU wrappers.  That should only be done when\r\n * task.h is included from an application file. */\r\n#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n#include \"FreeRTOS.h\"\r\n#include \"task.h\"\r\n\r\n#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n#if ( configSUPPORT_DYNAMIC_ALLOCATION == 0 )\r\n    #error This file must not be used if configSUPPORT_DYNAMIC_ALLOCATION is 0\r\n#endif\r\n\r\n#ifndef configHEAP_CLEAR_MEMORY_ON_FREE\r\n    #define configHEAP_CLEAR_MEMORY_ON_FREE    0\r\n#endif\r\n\r\n/* Block sizes must not get too small. */\r\n#define heapMINIMUM_BLOCK_SIZE    ( ( size_t ) ( xHeapStructSize << 1 ) )\r\n\r\n/* Assumes 8bit bytes! */\r\n#define heapBITS_PER_BYTE         ( ( size_t ) 8 )\r\n\r\n/* Max value that fits in a size_t type. */\r\n#define heapSIZE_MAX              ( ~( ( size_t ) 0 ) )\r\n\r\n/* Check if multiplying a and b will result in overflow. */\r\n#define heapMULTIPLY_WILL_OVERFLOW( a, b )     ( ( ( a ) > 0 ) && ( ( b ) > ( heapSIZE_MAX / ( a ) ) ) )\r\n\r\n/* Check if adding a and b will result in overflow. */\r\n#define heapADD_WILL_OVERFLOW( a, b )          ( ( a ) > ( heapSIZE_MAX - ( b ) ) )\r\n\r\n/* Check if the subtraction operation ( a - b ) will result in underflow. */\r\n#define heapSUBTRACT_WILL_UNDERFLOW( a, b )    ( ( a ) < ( b ) )\r\n\r\n/* MSB of the xBlockSize member of an BlockLink_t structure is used to track\r\n * the allocation status of a block.  When MSB of the xBlockSize member of\r\n * an BlockLink_t structure is set then the block belongs to the application.\r\n * When the bit is free the block is still part of the free heap space. */\r\n#define heapBLOCK_ALLOCATED_BITMASK    ( ( ( size_t ) 1 ) << ( ( sizeof( size_t ) * heapBITS_PER_BYTE ) - 1 ) )\r\n#define heapBLOCK_SIZE_IS_VALID( xBlockSize )    ( ( ( xBlockSize ) & heapBLOCK_ALLOCATED_BITMASK ) == 0 )\r\n#define heapBLOCK_IS_ALLOCATED( pxBlock )        ( ( ( pxBlock->xBlockSize ) & heapBLOCK_ALLOCATED_BITMASK ) != 0 )\r\n#define heapALLOCATE_BLOCK( pxBlock )            ( ( pxBlock->xBlockSize ) |= heapBLOCK_ALLOCATED_BITMASK )\r\n#define heapFREE_BLOCK( pxBlock )                ( ( pxBlock->xBlockSize ) &= ~heapBLOCK_ALLOCATED_BITMASK )\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n/* Allocate the memory for the heap. */\r\n#if ( configAPPLICATION_ALLOCATED_HEAP == 1 )\r\n\r\n/* The application writer has already defined the array used for the RTOS\r\n* heap - probably so it can be placed in a special segment or address. */\r\n    extern uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];\r\n#else\r\n    PRIVILEGED_DATA static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];\r\n#endif /* configAPPLICATION_ALLOCATED_HEAP */\r\n\r\n/* Define the linked list structure.  This is used to link free blocks in order\r\n * of their memory address. */\r\ntypedef struct A_BLOCK_LINK\r\n{\r\n    struct A_BLOCK_LINK * pxNextFreeBlock; /**< The next free block in the list. */\r\n    size_t xBlockSize;                     /**< The size of the free block. */\r\n} BlockLink_t;\r\n\r\n/* Setting configENABLE_HEAP_PROTECTOR to 1 enables heap block pointers\r\n * protection using an application supplied canary value to catch heap\r\n * corruption should a heap buffer overflow occur.\r\n */\r\n#if ( configENABLE_HEAP_PROTECTOR == 1 )\r\n\r\n/**\r\n * @brief Application provided function to get a random value to be used as canary.\r\n *\r\n * @param pxHeapCanary [out] Output parameter to return the canary value.\r\n */\r\n    extern void vApplicationGetRandomHeapCanary( portPOINTER_SIZE_TYPE * pxHeapCanary );\r\n\r\n/* Canary value for protecting internal heap pointers. */\r\n    PRIVILEGED_DATA static portPOINTER_SIZE_TYPE xHeapCanary;\r\n\r\n/* Macro to load/store BlockLink_t pointers to memory. By XORing the\r\n * pointers with a random canary value, heap overflows will result\r\n * in randomly unpredictable pointer values which will be caught by\r\n * heapVALIDATE_BLOCK_POINTER assert. */\r\n    #define heapPROTECT_BLOCK_POINTER( pxBlock )    ( ( BlockLink_t * ) ( ( ( portPOINTER_SIZE_TYPE ) ( pxBlock ) ) ^ xHeapCanary ) )\r\n#else\r\n\r\n    #define heapPROTECT_BLOCK_POINTER( pxBlock )    ( pxBlock )\r\n\r\n#endif /* configENABLE_HEAP_PROTECTOR */\r\n\r\n/* Assert that a heap block pointer is within the heap bounds. */\r\n#define heapVALIDATE_BLOCK_POINTER( pxBlock )                          \\\r\n    configASSERT( ( ( uint8_t * ) ( pxBlock ) >= &( ucHeap[ 0 ] ) ) && \\\r\n                  ( ( uint8_t * ) ( pxBlock ) <= &( ucHeap[ configTOTAL_HEAP_SIZE - 1 ] ) ) )\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n/*\r\n * Inserts a block of memory that is being freed into the correct position in\r\n * the list of free memory blocks.  The block being freed will be merged with\r\n * the block in front it and/or the block behind it if the memory blocks are\r\n * adjacent to each other.\r\n */\r\nstatic void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Called automatically to setup the required heap structures the first time\r\n * pvPortMalloc() is called.\r\n */\r\nstatic void prvHeapInit( void ) PRIVILEGED_FUNCTION;\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n/* The size of the structure placed at the beginning of each allocated memory\r\n * block must by correctly byte aligned. */\r\nstatic const size_t xHeapStructSize = ( sizeof( BlockLink_t ) + ( ( size_t ) ( portBYTE_ALIGNMENT - 1 ) ) ) & ~( ( size_t ) portBYTE_ALIGNMENT_MASK );\r\n\r\n/* Create a couple of list links to mark the start and end of the list. */\r\nPRIVILEGED_DATA static BlockLink_t xStart;\r\nPRIVILEGED_DATA static BlockLink_t * pxEnd = NULL;\r\n\r\n/* Keeps track of the number of calls to allocate and free memory as well as the\r\n * number of free bytes remaining, but says nothing about fragmentation. */\r\nPRIVILEGED_DATA static size_t xFreeBytesRemaining = 0U;\r\nPRIVILEGED_DATA static size_t xMinimumEverFreeBytesRemaining = 0U;\r\nPRIVILEGED_DATA static size_t xNumberOfSuccessfulAllocations = 0;\r\nPRIVILEGED_DATA static size_t xNumberOfSuccessfulFrees = 0;\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid * pvPortMalloc( size_t xWantedSize )\r\n{\r\n    BlockLink_t * pxBlock;\r\n    BlockLink_t * pxPreviousBlock;\r\n    BlockLink_t * pxNewBlockLink;\r\n    void * pvReturn = NULL;\r\n    size_t xAdditionalRequiredSize;\r\n\r\n    if( xWantedSize > 0 )\r\n    {\r\n        /* The wanted size must be increased so it can contain a BlockLink_t\r\n         * structure in addition to the requested amount of bytes. */\r\n        if( heapADD_WILL_OVERFLOW( xWantedSize, xHeapStructSize ) == 0 )\r\n        {\r\n            xWantedSize += xHeapStructSize;\r\n\r\n            /* Ensure that blocks are always aligned to the required number\r\n             * of bytes. */\r\n            if( ( xWantedSize & portBYTE_ALIGNMENT_MASK ) != 0x00 )\r\n            {\r\n                /* Byte alignment required. */\r\n                xAdditionalRequiredSize = portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK );\r\n\r\n                if( heapADD_WILL_OVERFLOW( xWantedSize, xAdditionalRequiredSize ) == 0 )\r\n                {\r\n                    xWantedSize += xAdditionalRequiredSize;\r\n                }\r\n                else\r\n                {\r\n                    xWantedSize = 0;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            xWantedSize = 0;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        mtCOVERAGE_TEST_MARKER();\r\n    }\r\n\r\n    vTaskSuspendAll();\r\n    {\r\n        /* If this is the first call to malloc then the heap will require\r\n         * initialisation to setup the list of free blocks. */\r\n        if( pxEnd == NULL )\r\n        {\r\n            prvHeapInit();\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        /* Check the block size we are trying to allocate is not so large that the\r\n         * top bit is set.  The top bit of the block size member of the BlockLink_t\r\n         * structure is used to determine who owns the block - the application or\r\n         * the kernel, so it must be free. */\r\n        if( heapBLOCK_SIZE_IS_VALID( xWantedSize ) != 0 )\r\n        {\r\n            if( ( xWantedSize > 0 ) && ( xWantedSize <= xFreeBytesRemaining ) )\r\n            {\r\n                /* Traverse the list from the start (lowest address) block until\r\n                 * one of adequate size is found. */\r\n                pxPreviousBlock = &xStart;\r\n                pxBlock = heapPROTECT_BLOCK_POINTER( xStart.pxNextFreeBlock );\r\n                heapVALIDATE_BLOCK_POINTER( pxBlock );\r\n\r\n                while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock != heapPROTECT_BLOCK_POINTER( NULL ) ) )\r\n                {\r\n                    pxPreviousBlock = pxBlock;\r\n                    pxBlock = heapPROTECT_BLOCK_POINTER( pxBlock->pxNextFreeBlock );\r\n                    heapVALIDATE_BLOCK_POINTER( pxBlock );\r\n                }\r\n\r\n                /* If the end marker was reached then a block of adequate size\r\n                 * was not found. */\r\n                if( pxBlock != pxEnd )\r\n                {\r\n                    /* Return the memory space pointed to - jumping over the\r\n                     * BlockLink_t structure at its start. */\r\n                    pvReturn = ( void * ) ( ( ( uint8_t * ) heapPROTECT_BLOCK_POINTER( pxPreviousBlock->pxNextFreeBlock ) ) + xHeapStructSize );\r\n                    heapVALIDATE_BLOCK_POINTER( pvReturn );\r\n\r\n                    /* This block is being returned for use so must be taken out\r\n                     * of the list of free blocks. */\r\n                    pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;\r\n\r\n                    /* If the block is larger than required it can be split into\r\n                     * two. */\r\n                    configASSERT( heapSUBTRACT_WILL_UNDERFLOW( pxBlock->xBlockSize, xWantedSize ) == 0 );\r\n\r\n                    if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE )\r\n                    {\r\n                        /* This block is to be split into two.  Create a new\r\n                         * block following the number of bytes requested. The void\r\n                         * cast is used to prevent byte alignment warnings from the\r\n                         * compiler. */\r\n                        pxNewBlockLink = ( void * ) ( ( ( uint8_t * ) pxBlock ) + xWantedSize );\r\n                        configASSERT( ( ( ( size_t ) pxNewBlockLink ) & portBYTE_ALIGNMENT_MASK ) == 0 );\r\n\r\n                        /* Calculate the sizes of two blocks split from the\r\n                         * single block. */\r\n                        pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;\r\n                        pxBlock->xBlockSize = xWantedSize;\r\n\r\n                        /* Insert the new block into the list of free blocks. */\r\n                        pxNewBlockLink->pxNextFreeBlock = pxPreviousBlock->pxNextFreeBlock;\r\n                        pxPreviousBlock->pxNextFreeBlock = heapPROTECT_BLOCK_POINTER( pxNewBlockLink );\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n\r\n                    xFreeBytesRemaining -= pxBlock->xBlockSize;\r\n\r\n                    if( xFreeBytesRemaining < xMinimumEverFreeBytesRemaining )\r\n                    {\r\n                        xMinimumEverFreeBytesRemaining = xFreeBytesRemaining;\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n\r\n                    /* The block is being returned - it is allocated and owned\r\n                     * by the application and has no \"next\" block. */\r\n                    heapALLOCATE_BLOCK( pxBlock );\r\n                    pxBlock->pxNextFreeBlock = NULL;\r\n                    xNumberOfSuccessfulAllocations++;\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceMALLOC( pvReturn, xWantedSize );\r\n    }\r\n    ( void ) xTaskResumeAll();\r\n\r\n    #if ( configUSE_MALLOC_FAILED_HOOK == 1 )\r\n    {\r\n        if( pvReturn == NULL )\r\n        {\r\n            vApplicationMallocFailedHook();\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n    #endif /* if ( configUSE_MALLOC_FAILED_HOOK == 1 ) */\r\n\r\n    configASSERT( ( ( ( size_t ) pvReturn ) & ( size_t ) portBYTE_ALIGNMENT_MASK ) == 0 );\r\n    return pvReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vPortFree( void * pv )\r\n{\r\n    uint8_t * puc = ( uint8_t * ) pv;\r\n    BlockLink_t * pxLink;\r\n\r\n    if( pv != NULL )\r\n    {\r\n        /* The memory being freed will have an BlockLink_t structure immediately\r\n         * before it. */\r\n        puc -= xHeapStructSize;\r\n\r\n        /* This casting is to keep the compiler from issuing warnings. */\r\n        pxLink = ( void * ) puc;\r\n\r\n        heapVALIDATE_BLOCK_POINTER( pxLink );\r\n        configASSERT( heapBLOCK_IS_ALLOCATED( pxLink ) != 0 );\r\n        configASSERT( pxLink->pxNextFreeBlock == NULL );\r\n\r\n        if( heapBLOCK_IS_ALLOCATED( pxLink ) != 0 )\r\n        {\r\n            if( pxLink->pxNextFreeBlock == NULL )\r\n            {\r\n                /* The block is being returned to the heap - it is no longer\r\n                 * allocated. */\r\n                heapFREE_BLOCK( pxLink );\r\n                #if ( configHEAP_CLEAR_MEMORY_ON_FREE == 1 )\r\n                {\r\n                    /* Check for underflow as this can occur if xBlockSize is\r\n                     * overwritten in a heap block. */\r\n                    if( heapSUBTRACT_WILL_UNDERFLOW( pxLink->xBlockSize, xHeapStructSize ) == 0 )\r\n                    {\r\n                        ( void ) memset( puc + xHeapStructSize, 0, pxLink->xBlockSize - xHeapStructSize );\r\n                    }\r\n                }\r\n                #endif\r\n\r\n                vTaskSuspendAll();\r\n                {\r\n                    /* Add this block to the list of free blocks. */\r\n                    xFreeBytesRemaining += pxLink->xBlockSize;\r\n                    traceFREE( pv, pxLink->xBlockSize );\r\n                    prvInsertBlockIntoFreeList( ( ( BlockLink_t * ) pxLink ) );\r\n                    xNumberOfSuccessfulFrees++;\r\n                }\r\n                ( void ) xTaskResumeAll();\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nsize_t xPortGetFreeHeapSize( void )\r\n{\r\n    return xFreeBytesRemaining;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nsize_t xPortGetMinimumEverFreeHeapSize( void )\r\n{\r\n    return xMinimumEverFreeBytesRemaining;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vPortInitialiseBlocks( void )\r\n{\r\n    /* This just exists to keep the linker quiet. */\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid * pvPortCalloc( size_t xNum,\r\n                     size_t xSize )\r\n{\r\n    void * pv = NULL;\r\n\r\n    if( heapMULTIPLY_WILL_OVERFLOW( xNum, xSize ) == 0 )\r\n    {\r\n        pv = pvPortMalloc( xNum * xSize );\r\n\r\n        if( pv != NULL )\r\n        {\r\n            ( void ) memset( pv, 0, xNum * xSize );\r\n        }\r\n    }\r\n\r\n    return pv;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic void prvHeapInit( void ) /* PRIVILEGED_FUNCTION */\r\n{\r\n    BlockLink_t * pxFirstFreeBlock;\r\n    portPOINTER_SIZE_TYPE uxStartAddress, uxEndAddress;\r\n    size_t xTotalHeapSize = configTOTAL_HEAP_SIZE;\r\n\r\n    /* Ensure the heap starts on a correctly aligned boundary. */\r\n    uxStartAddress = ( portPOINTER_SIZE_TYPE ) ucHeap;\r\n\r\n    if( ( uxStartAddress & portBYTE_ALIGNMENT_MASK ) != 0 )\r\n    {\r\n        uxStartAddress += ( portBYTE_ALIGNMENT - 1 );\r\n        uxStartAddress &= ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK );\r\n        xTotalHeapSize -= ( size_t ) ( uxStartAddress - ( portPOINTER_SIZE_TYPE ) ucHeap );\r\n    }\r\n\r\n    #if ( configENABLE_HEAP_PROTECTOR == 1 )\r\n    {\r\n        vApplicationGetRandomHeapCanary( &( xHeapCanary ) );\r\n    }\r\n    #endif\r\n\r\n    /* xStart is used to hold a pointer to the first item in the list of free\r\n     * blocks.  The void cast is used to prevent compiler warnings. */\r\n    xStart.pxNextFreeBlock = ( void * ) heapPROTECT_BLOCK_POINTER( uxStartAddress );\r\n    xStart.xBlockSize = ( size_t ) 0;\r\n\r\n    /* pxEnd is used to mark the end of the list of free blocks and is inserted\r\n     * at the end of the heap space. */\r\n    uxEndAddress = uxStartAddress + ( portPOINTER_SIZE_TYPE ) xTotalHeapSize;\r\n    uxEndAddress -= ( portPOINTER_SIZE_TYPE ) xHeapStructSize;\r\n    uxEndAddress &= ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK );\r\n    pxEnd = ( BlockLink_t * ) uxEndAddress;\r\n    pxEnd->xBlockSize = 0;\r\n    pxEnd->pxNextFreeBlock = heapPROTECT_BLOCK_POINTER( NULL );\r\n\r\n    /* To start with there is a single free block that is sized to take up the\r\n     * entire heap space, minus the space taken by pxEnd. */\r\n    pxFirstFreeBlock = ( BlockLink_t * ) uxStartAddress;\r\n    pxFirstFreeBlock->xBlockSize = ( size_t ) ( uxEndAddress - ( portPOINTER_SIZE_TYPE ) pxFirstFreeBlock );\r\n    pxFirstFreeBlock->pxNextFreeBlock = heapPROTECT_BLOCK_POINTER( pxEnd );\r\n\r\n    /* Only one block exists - and it covers the entire usable heap space. */\r\n    xMinimumEverFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;\r\n    xFreeBytesRemaining = pxFirstFreeBlock->xBlockSize;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic void prvInsertBlockIntoFreeList( BlockLink_t * pxBlockToInsert ) /* PRIVILEGED_FUNCTION */\r\n{\r\n    BlockLink_t * pxIterator;\r\n    uint8_t * puc;\r\n\r\n    /* Iterate through the list until a block is found that has a higher address\r\n     * than the block being inserted. */\r\n    for( pxIterator = &xStart; heapPROTECT_BLOCK_POINTER( pxIterator->pxNextFreeBlock ) < pxBlockToInsert; pxIterator = heapPROTECT_BLOCK_POINTER( pxIterator->pxNextFreeBlock ) )\r\n    {\r\n        /* Nothing to do here, just iterate to the right position. */\r\n    }\r\n\r\n    if( pxIterator != &xStart )\r\n    {\r\n        heapVALIDATE_BLOCK_POINTER( pxIterator );\r\n    }\r\n\r\n    /* Do the block being inserted, and the block it is being inserted after\r\n     * make a contiguous block of memory? */\r\n    puc = ( uint8_t * ) pxIterator;\r\n\r\n    if( ( puc + pxIterator->xBlockSize ) == ( uint8_t * ) pxBlockToInsert )\r\n    {\r\n        pxIterator->xBlockSize += pxBlockToInsert->xBlockSize;\r\n        pxBlockToInsert = pxIterator;\r\n    }\r\n    else\r\n    {\r\n        mtCOVERAGE_TEST_MARKER();\r\n    }\r\n\r\n    /* Do the block being inserted, and the block it is being inserted before\r\n     * make a contiguous block of memory? */\r\n    puc = ( uint8_t * ) pxBlockToInsert;\r\n\r\n    if( ( puc + pxBlockToInsert->xBlockSize ) == ( uint8_t * ) heapPROTECT_BLOCK_POINTER( pxIterator->pxNextFreeBlock ) )\r\n    {\r\n        if( heapPROTECT_BLOCK_POINTER( pxIterator->pxNextFreeBlock ) != pxEnd )\r\n        {\r\n            /* Form one big block from the two blocks. */\r\n            pxBlockToInsert->xBlockSize += heapPROTECT_BLOCK_POINTER( pxIterator->pxNextFreeBlock )->xBlockSize;\r\n            pxBlockToInsert->pxNextFreeBlock = heapPROTECT_BLOCK_POINTER( pxIterator->pxNextFreeBlock )->pxNextFreeBlock;\r\n        }\r\n        else\r\n        {\r\n            pxBlockToInsert->pxNextFreeBlock = heapPROTECT_BLOCK_POINTER( pxEnd );\r\n        }\r\n    }\r\n    else\r\n    {\r\n        pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock;\r\n    }\r\n\r\n    /* If the block being inserted plugged a gab, so was merged with the block\r\n     * before and the block after, then it's pxNextFreeBlock pointer will have\r\n     * already been set, and should not be set here as that would make it point\r\n     * to itself. */\r\n    if( pxIterator != pxBlockToInsert )\r\n    {\r\n        pxIterator->pxNextFreeBlock = heapPROTECT_BLOCK_POINTER( pxBlockToInsert );\r\n    }\r\n    else\r\n    {\r\n        mtCOVERAGE_TEST_MARKER();\r\n    }\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vPortGetHeapStats( HeapStats_t * pxHeapStats )\r\n{\r\n    BlockLink_t * pxBlock;\r\n    size_t xBlocks = 0, xMaxSize = 0, xMinSize = portMAX_DELAY; /* portMAX_DELAY used as a portable way of getting the maximum value. */\r\n\r\n    vTaskSuspendAll();\r\n    {\r\n        pxBlock = heapPROTECT_BLOCK_POINTER( xStart.pxNextFreeBlock );\r\n\r\n        /* pxBlock will be NULL if the heap has not been initialised.  The heap\r\n         * is initialised automatically when the first allocation is made. */\r\n        if( pxBlock != NULL )\r\n        {\r\n            while( pxBlock != pxEnd )\r\n            {\r\n                /* Increment the number of blocks and record the largest block seen\r\n                 * so far. */\r\n                xBlocks++;\r\n\r\n                if( pxBlock->xBlockSize > xMaxSize )\r\n                {\r\n                    xMaxSize = pxBlock->xBlockSize;\r\n                }\r\n\r\n                if( pxBlock->xBlockSize < xMinSize )\r\n                {\r\n                    xMinSize = pxBlock->xBlockSize;\r\n                }\r\n\r\n                /* Move to the next block in the chain until the last block is\r\n                 * reached. */\r\n                pxBlock = heapPROTECT_BLOCK_POINTER( pxBlock->pxNextFreeBlock );\r\n            }\r\n        }\r\n    }\r\n    ( void ) xTaskResumeAll();\r\n\r\n    pxHeapStats->xSizeOfLargestFreeBlockInBytes = xMaxSize;\r\n    pxHeapStats->xSizeOfSmallestFreeBlockInBytes = xMinSize;\r\n    pxHeapStats->xNumberOfFreeBlocks = xBlocks;\r\n\r\n    taskENTER_CRITICAL();\r\n    {\r\n        pxHeapStats->xAvailableHeapSpaceInBytes = xFreeBytesRemaining;\r\n        pxHeapStats->xNumberOfSuccessfulAllocations = xNumberOfSuccessfulAllocations;\r\n        pxHeapStats->xNumberOfSuccessfulFrees = xNumberOfSuccessfulFrees;\r\n        pxHeapStats->xMinimumEverFreeBytesRemaining = xMinimumEverFreeBytesRemaining;\r\n    }\r\n    taskEXIT_CRITICAL();\r\n}\r\n/*-----------------------------------------------------------*/\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/portable/readme.txt",
    "content": "Each real time kernel port consists of three files that contain the core kernel\r\ncomponents and are common to every port, and one or more files that are\r\nspecific to a particular microcontroller and/or compiler.\r\n\r\n\r\n+ The FreeRTOS/Source/Portable/MemMang directory contains the five sample\r\nmemory allocators as described on the https://www.FreeRTOS.org WEB site.\r\n\r\n+ The other directories each contain files specific to a particular\r\nmicrocontroller or compiler, where the directory name denotes the compiler\r\nspecific files the directory contains.\r\n\r\n\r\n\r\nFor example, if you are interested in the [compiler] port for the [architecture]\r\nmicrocontroller, then the port specific files are contained in\r\nFreeRTOS/Source/Portable/[compiler]/[architecture] directory.  If this is the\r\nonly port you are interested in then all the other directories can be\r\nignored.\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/queue.c",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n#include <stdlib.h>\r\n#include <string.h>\r\n\r\n/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining\r\n * all the API functions to use the MPU wrappers.  That should only be done when\r\n * task.h is included from an application file. */\r\n#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n#include \"FreeRTOS.h\"\r\n#include \"task.h\"\r\n#include \"queue.h\"\r\n\r\n#if ( configUSE_CO_ROUTINES == 1 )\r\n    #include \"croutine.h\"\r\n#endif\r\n\r\n/* The MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined\r\n * for the header files above, but not in this file, in order to generate the\r\n * correct privileged Vs unprivileged linkage and placement. */\r\n#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n\r\n/* Constants used with the cRxLock and cTxLock structure members. */\r\n#define queueUNLOCKED             ( ( int8_t ) -1 )\r\n#define queueLOCKED_UNMODIFIED    ( ( int8_t ) 0 )\r\n#define queueINT8_MAX             ( ( int8_t ) 127 )\r\n\r\n/* When the Queue_t structure is used to represent a base queue its pcHead and\r\n * pcTail members are used as pointers into the queue storage area.  When the\r\n * Queue_t structure is used to represent a mutex pcHead and pcTail pointers are\r\n * not necessary, and the pcHead pointer is set to NULL to indicate that the\r\n * structure instead holds a pointer to the mutex holder (if any).  Map alternative\r\n * names to the pcHead and structure member to ensure the readability of the code\r\n * is maintained.  The QueuePointers_t and SemaphoreData_t types are used to form\r\n * a union as their usage is mutually exclusive dependent on what the queue is\r\n * being used for. */\r\n#define uxQueueType               pcHead\r\n#define queueQUEUE_IS_MUTEX       NULL\r\n\r\ntypedef struct QueuePointers\r\n{\r\n    int8_t * pcTail;     /**< Points to the byte at the end of the queue storage area.  Once more byte is allocated than necessary to store the queue items, this is used as a marker. */\r\n    int8_t * pcReadFrom; /**< Points to the last place that a queued item was read from when the structure is used as a queue. */\r\n} QueuePointers_t;\r\n\r\ntypedef struct SemaphoreData\r\n{\r\n    TaskHandle_t xMutexHolder;        /**< The handle of the task that holds the mutex. */\r\n    UBaseType_t uxRecursiveCallCount; /**< Maintains a count of the number of times a recursive mutex has been recursively 'taken' when the structure is used as a mutex. */\r\n} SemaphoreData_t;\r\n\r\n/* Semaphores do not actually store or copy data, so have an item size of\r\n * zero. */\r\n#define queueSEMAPHORE_QUEUE_ITEM_LENGTH    ( ( UBaseType_t ) 0 )\r\n#define queueMUTEX_GIVE_BLOCK_TIME          ( ( TickType_t ) 0U )\r\n\r\n#if ( configUSE_PREEMPTION == 0 )\r\n\r\n/* If the cooperative scheduler is being used then a yield should not be\r\n * performed just because a higher priority task has been woken. */\r\n    #define queueYIELD_IF_USING_PREEMPTION()\r\n#else\r\n    #if ( configNUMBER_OF_CORES == 1 )\r\n        #define queueYIELD_IF_USING_PREEMPTION()    portYIELD_WITHIN_API()\r\n    #else /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n        #define queueYIELD_IF_USING_PREEMPTION()    vTaskYieldWithinAPI()\r\n    #endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n#endif\r\n\r\n/*\r\n * Definition of the queue used by the scheduler.\r\n * Items are queued by copy, not reference.  See the following link for the\r\n * rationale: https://www.FreeRTOS.org/Embedded-RTOS-Queues.html\r\n */\r\ntypedef struct QueueDefinition /* The old naming convention is used to prevent breaking kernel aware debuggers. */\r\n{\r\n    int8_t * pcHead;           /**< Points to the beginning of the queue storage area. */\r\n    int8_t * pcWriteTo;        /**< Points to the free next place in the storage area. */\r\n\r\n    union\r\n    {\r\n        QueuePointers_t xQueue;     /**< Data required exclusively when this structure is used as a queue. */\r\n        SemaphoreData_t xSemaphore; /**< Data required exclusively when this structure is used as a semaphore. */\r\n    } u;\r\n\r\n    List_t xTasksWaitingToSend;             /**< List of tasks that are blocked waiting to post onto this queue.  Stored in priority order. */\r\n    List_t xTasksWaitingToReceive;          /**< List of tasks that are blocked waiting to read from this queue.  Stored in priority order. */\r\n\r\n    volatile UBaseType_t uxMessagesWaiting; /**< The number of items currently in the queue. */\r\n    UBaseType_t uxLength;                   /**< The length of the queue defined as the number of items it will hold, not the number of bytes. */\r\n    UBaseType_t uxItemSize;                 /**< The size of each items that the queue will hold. */\r\n\r\n    volatile int8_t cRxLock;                /**< Stores the number of items received from the queue (removed from the queue) while the queue was locked.  Set to queueUNLOCKED when the queue is not locked. */\r\n    volatile int8_t cTxLock;                /**< Stores the number of items transmitted to the queue (added to the queue) while the queue was locked.  Set to queueUNLOCKED when the queue is not locked. */\r\n\r\n    #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )\r\n        uint8_t ucStaticallyAllocated; /**< Set to pdTRUE if the memory used by the queue was statically allocated to ensure no attempt is made to free the memory. */\r\n    #endif\r\n\r\n    #if ( configUSE_QUEUE_SETS == 1 )\r\n        struct QueueDefinition * pxQueueSetContainer;\r\n    #endif\r\n\r\n    #if ( configUSE_TRACE_FACILITY == 1 )\r\n        UBaseType_t uxQueueNumber;\r\n        uint8_t ucQueueType;\r\n    #endif\r\n} xQUEUE;\r\n\r\n/* The old xQUEUE name is maintained above then typedefed to the new Queue_t\r\n * name below to enable the use of older kernel aware debuggers. */\r\ntypedef xQUEUE Queue_t;\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n/*\r\n * The queue registry is just a means for kernel aware debuggers to locate\r\n * queue structures.  It has no other purpose so is an optional component.\r\n */\r\n#if ( configQUEUE_REGISTRY_SIZE > 0 )\r\n\r\n/* The type stored within the queue registry array.  This allows a name\r\n * to be assigned to each queue making kernel aware debugging a little\r\n * more user friendly. */\r\n    typedef struct QUEUE_REGISTRY_ITEM\r\n    {\r\n        const char * pcQueueName;\r\n        QueueHandle_t xHandle;\r\n    } xQueueRegistryItem;\r\n\r\n/* The old xQueueRegistryItem name is maintained above then typedefed to the\r\n * new xQueueRegistryItem name below to enable the use of older kernel aware\r\n * debuggers. */\r\n    typedef xQueueRegistryItem QueueRegistryItem_t;\r\n\r\n/* The queue registry is simply an array of QueueRegistryItem_t structures.\r\n * The pcQueueName member of a structure being NULL is indicative of the\r\n * array position being vacant. */\r\n\r\n/* MISRA Ref 8.4.2 [Declaration shall be visible] */\r\n/* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-84 */\r\n/* coverity[misra_c_2012_rule_8_4_violation] */\r\n    PRIVILEGED_DATA QueueRegistryItem_t xQueueRegistry[ configQUEUE_REGISTRY_SIZE ];\r\n\r\n#endif /* configQUEUE_REGISTRY_SIZE */\r\n\r\n/*\r\n * Unlocks a queue locked by a call to prvLockQueue.  Locking a queue does not\r\n * prevent an ISR from adding or removing items to the queue, but does prevent\r\n * an ISR from removing tasks from the queue event lists.  If an ISR finds a\r\n * queue is locked it will instead increment the appropriate queue lock count\r\n * to indicate that a task may require unblocking.  When the queue in unlocked\r\n * these lock counts are inspected, and the appropriate action taken.\r\n */\r\nstatic void prvUnlockQueue( Queue_t * const pxQueue ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Uses a critical section to determine if there is any data in a queue.\r\n *\r\n * @return pdTRUE if the queue contains no items, otherwise pdFALSE.\r\n */\r\nstatic BaseType_t prvIsQueueEmpty( const Queue_t * pxQueue ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Uses a critical section to determine if there is any space in a queue.\r\n *\r\n * @return pdTRUE if there is no space, otherwise pdFALSE;\r\n */\r\nstatic BaseType_t prvIsQueueFull( const Queue_t * pxQueue ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Copies an item into the queue, either at the front of the queue or the\r\n * back of the queue.\r\n */\r\nstatic BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue,\r\n                                      const void * pvItemToQueue,\r\n                                      const BaseType_t xPosition ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Copies an item out of a queue.\r\n */\r\nstatic void prvCopyDataFromQueue( Queue_t * const pxQueue,\r\n                                  void * const pvBuffer ) PRIVILEGED_FUNCTION;\r\n\r\n#if ( configUSE_QUEUE_SETS == 1 )\r\n\r\n/*\r\n * Checks to see if a queue is a member of a queue set, and if so, notifies\r\n * the queue set that the queue contains data.\r\n */\r\n    static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/*\r\n * Called after a Queue_t structure has been allocated either statically or\r\n * dynamically to fill in the structure's members.\r\n */\r\nstatic void prvInitialiseNewQueue( const UBaseType_t uxQueueLength,\r\n                                   const UBaseType_t uxItemSize,\r\n                                   uint8_t * pucQueueStorage,\r\n                                   const uint8_t ucQueueType,\r\n                                   Queue_t * pxNewQueue ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Mutexes are a special type of queue.  When a mutex is created, first the\r\n * queue is created, then prvInitialiseMutex() is called to configure the queue\r\n * as a mutex.\r\n */\r\n#if ( configUSE_MUTEXES == 1 )\r\n    static void prvInitialiseMutex( Queue_t * pxNewQueue ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n#if ( configUSE_MUTEXES == 1 )\r\n\r\n/*\r\n * If a task waiting for a mutex causes the mutex holder to inherit a\r\n * priority, but the waiting task times out, then the holder should\r\n * disinherit the priority - but only down to the highest priority of any\r\n * other tasks that are waiting for the same mutex.  This function returns\r\n * that priority.\r\n */\r\n    static UBaseType_t prvGetDisinheritPriorityAfterTimeout( const Queue_t * const pxQueue ) PRIVILEGED_FUNCTION;\r\n#endif\r\n/*-----------------------------------------------------------*/\r\n\r\n/*\r\n * Macro to mark a queue as locked.  Locking a queue prevents an ISR from\r\n * accessing the queue event lists.\r\n */\r\n#define prvLockQueue( pxQueue )                            \\\r\n    taskENTER_CRITICAL();                                  \\\r\n    {                                                      \\\r\n        if( ( pxQueue )->cRxLock == queueUNLOCKED )        \\\r\n        {                                                  \\\r\n            ( pxQueue )->cRxLock = queueLOCKED_UNMODIFIED; \\\r\n        }                                                  \\\r\n        if( ( pxQueue )->cTxLock == queueUNLOCKED )        \\\r\n        {                                                  \\\r\n            ( pxQueue )->cTxLock = queueLOCKED_UNMODIFIED; \\\r\n        }                                                  \\\r\n    }                                                      \\\r\n    taskEXIT_CRITICAL()\r\n\r\n/*\r\n * Macro to increment cTxLock member of the queue data structure. It is\r\n * capped at the number of tasks in the system as we cannot unblock more\r\n * tasks than the number of tasks in the system.\r\n */\r\n#define prvIncrementQueueTxLock( pxQueue, cTxLock )                           \\\r\n    do {                                                                      \\\r\n        const UBaseType_t uxNumberOfTasks = uxTaskGetNumberOfTasks();         \\\r\n        if( ( UBaseType_t ) ( cTxLock ) < uxNumberOfTasks )                   \\\r\n        {                                                                     \\\r\n            configASSERT( ( cTxLock ) != queueINT8_MAX );                     \\\r\n            ( pxQueue )->cTxLock = ( int8_t ) ( ( cTxLock ) + ( int8_t ) 1 ); \\\r\n        }                                                                     \\\r\n    } while( 0 )\r\n\r\n/*\r\n * Macro to increment cRxLock member of the queue data structure. It is\r\n * capped at the number of tasks in the system as we cannot unblock more\r\n * tasks than the number of tasks in the system.\r\n */\r\n#define prvIncrementQueueRxLock( pxQueue, cRxLock )                           \\\r\n    do {                                                                      \\\r\n        const UBaseType_t uxNumberOfTasks = uxTaskGetNumberOfTasks();         \\\r\n        if( ( UBaseType_t ) ( cRxLock ) < uxNumberOfTasks )                   \\\r\n        {                                                                     \\\r\n            configASSERT( ( cRxLock ) != queueINT8_MAX );                     \\\r\n            ( pxQueue )->cRxLock = ( int8_t ) ( ( cRxLock ) + ( int8_t ) 1 ); \\\r\n        }                                                                     \\\r\n    } while( 0 )\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xQueueGenericReset( QueueHandle_t xQueue,\r\n                               BaseType_t xNewQueue )\r\n{\r\n    BaseType_t xReturn = pdPASS;\r\n    Queue_t * const pxQueue = xQueue;\r\n\r\n    traceENTER_xQueueGenericReset( xQueue, xNewQueue );\r\n\r\n    configASSERT( pxQueue );\r\n\r\n    if( ( pxQueue != NULL ) &&\r\n        ( pxQueue->uxLength >= 1U ) &&\r\n        /* Check for multiplication overflow. */\r\n        ( ( SIZE_MAX / pxQueue->uxLength ) >= pxQueue->uxItemSize ) )\r\n    {\r\n        taskENTER_CRITICAL();\r\n        {\r\n            pxQueue->u.xQueue.pcTail = pxQueue->pcHead + ( pxQueue->uxLength * pxQueue->uxItemSize );\r\n            pxQueue->uxMessagesWaiting = ( UBaseType_t ) 0U;\r\n            pxQueue->pcWriteTo = pxQueue->pcHead;\r\n            pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead + ( ( pxQueue->uxLength - 1U ) * pxQueue->uxItemSize );\r\n            pxQueue->cRxLock = queueUNLOCKED;\r\n            pxQueue->cTxLock = queueUNLOCKED;\r\n\r\n            if( xNewQueue == pdFALSE )\r\n            {\r\n                /* If there are tasks blocked waiting to read from the queue, then\r\n                 * the tasks will remain blocked as after this function exits the queue\r\n                 * will still be empty.  If there are tasks blocked waiting to write to\r\n                 * the queue, then one should be unblocked as after this function exits\r\n                 * it will be possible to write to it. */\r\n                if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )\r\n                {\r\n                    if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )\r\n                    {\r\n                        queueYIELD_IF_USING_PREEMPTION();\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                /* Ensure the event queues start in the correct state. */\r\n                vListInitialise( &( pxQueue->xTasksWaitingToSend ) );\r\n                vListInitialise( &( pxQueue->xTasksWaitingToReceive ) );\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL();\r\n    }\r\n    else\r\n    {\r\n        xReturn = pdFAIL;\r\n    }\r\n\r\n    configASSERT( xReturn != pdFAIL );\r\n\r\n    /* A value is returned for calling semantic consistency with previous\r\n     * versions. */\r\n    traceRETURN_xQueueGenericReset( xReturn );\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n\r\n    QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength,\r\n                                             const UBaseType_t uxItemSize,\r\n                                             uint8_t * pucQueueStorage,\r\n                                             StaticQueue_t * pxStaticQueue,\r\n                                             const uint8_t ucQueueType )\r\n    {\r\n        Queue_t * pxNewQueue = NULL;\r\n\r\n        traceENTER_xQueueGenericCreateStatic( uxQueueLength, uxItemSize, pucQueueStorage, pxStaticQueue, ucQueueType );\r\n\r\n        /* The StaticQueue_t structure and the queue storage area must be\r\n         * supplied. */\r\n        configASSERT( pxStaticQueue );\r\n\r\n        if( ( uxQueueLength > ( UBaseType_t ) 0 ) &&\r\n            ( pxStaticQueue != NULL ) &&\r\n\r\n            /* A queue storage area should be provided if the item size is not 0, and\r\n             * should not be provided if the item size is 0. */\r\n            ( !( ( pucQueueStorage != NULL ) && ( uxItemSize == 0U ) ) ) &&\r\n            ( !( ( pucQueueStorage == NULL ) && ( uxItemSize != 0U ) ) ) )\r\n        {\r\n            #if ( configASSERT_DEFINED == 1 )\r\n            {\r\n                /* Sanity check that the size of the structure used to declare a\r\n                 * variable of type StaticQueue_t or StaticSemaphore_t equals the size of\r\n                 * the real queue and semaphore structures. */\r\n                volatile size_t xSize = sizeof( StaticQueue_t );\r\n\r\n                /* This assertion cannot be branch covered in unit tests */\r\n                configASSERT( xSize == sizeof( Queue_t ) ); /* LCOV_EXCL_BR_LINE */\r\n                ( void ) xSize;                             /* Prevent unused variable warning when configASSERT() is not defined. */\r\n            }\r\n            #endif /* configASSERT_DEFINED */\r\n\r\n            /* The address of a statically allocated queue was passed in, use it.\r\n             * The address of a statically allocated storage area was also passed in\r\n             * but is already set. */\r\n            /* MISRA Ref 11.3.1 [Misaligned access] */\r\n            /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */\r\n            /* coverity[misra_c_2012_rule_11_3_violation] */\r\n            pxNewQueue = ( Queue_t * ) pxStaticQueue;\r\n\r\n            #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r\n            {\r\n                /* Queues can be allocated wither statically or dynamically, so\r\n                 * note this queue was allocated statically in case the queue is\r\n                 * later deleted. */\r\n                pxNewQueue->ucStaticallyAllocated = pdTRUE;\r\n            }\r\n            #endif /* configSUPPORT_DYNAMIC_ALLOCATION */\r\n\r\n            prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue );\r\n        }\r\n        else\r\n        {\r\n            configASSERT( pxNewQueue );\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_xQueueGenericCreateStatic( pxNewQueue );\r\n\r\n        return pxNewQueue;\r\n    }\r\n\r\n#endif /* configSUPPORT_STATIC_ALLOCATION */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n\r\n    BaseType_t xQueueGenericGetStaticBuffers( QueueHandle_t xQueue,\r\n                                              uint8_t ** ppucQueueStorage,\r\n                                              StaticQueue_t ** ppxStaticQueue )\r\n    {\r\n        BaseType_t xReturn;\r\n        Queue_t * const pxQueue = xQueue;\r\n\r\n        traceENTER_xQueueGenericGetStaticBuffers( xQueue, ppucQueueStorage, ppxStaticQueue );\r\n\r\n        configASSERT( pxQueue );\r\n        configASSERT( ppxStaticQueue );\r\n\r\n        #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r\n        {\r\n            /* Check if the queue was statically allocated. */\r\n            if( pxQueue->ucStaticallyAllocated == ( uint8_t ) pdTRUE )\r\n            {\r\n                if( ppucQueueStorage != NULL )\r\n                {\r\n                    *ppucQueueStorage = ( uint8_t * ) pxQueue->pcHead;\r\n                }\r\n\r\n                /* MISRA Ref 11.3.1 [Misaligned access] */\r\n                /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */\r\n                /* coverity[misra_c_2012_rule_11_3_violation] */\r\n                *ppxStaticQueue = ( StaticQueue_t * ) pxQueue;\r\n                xReturn = pdTRUE;\r\n            }\r\n            else\r\n            {\r\n                xReturn = pdFALSE;\r\n            }\r\n        }\r\n        #else /* configSUPPORT_DYNAMIC_ALLOCATION */\r\n        {\r\n            /* Queue must have been statically allocated. */\r\n            if( ppucQueueStorage != NULL )\r\n            {\r\n                *ppucQueueStorage = ( uint8_t * ) pxQueue->pcHead;\r\n            }\r\n\r\n            *ppxStaticQueue = ( StaticQueue_t * ) pxQueue;\r\n            xReturn = pdTRUE;\r\n        }\r\n        #endif /* configSUPPORT_DYNAMIC_ALLOCATION */\r\n\r\n        traceRETURN_xQueueGenericGetStaticBuffers( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configSUPPORT_STATIC_ALLOCATION */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r\n\r\n    QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength,\r\n                                       const UBaseType_t uxItemSize,\r\n                                       const uint8_t ucQueueType )\r\n    {\r\n        Queue_t * pxNewQueue = NULL;\r\n        size_t xQueueSizeInBytes;\r\n        uint8_t * pucQueueStorage;\r\n\r\n        traceENTER_xQueueGenericCreate( uxQueueLength, uxItemSize, ucQueueType );\r\n\r\n        if( ( uxQueueLength > ( UBaseType_t ) 0 ) &&\r\n            /* Check for multiplication overflow. */\r\n            ( ( SIZE_MAX / uxQueueLength ) >= uxItemSize ) &&\r\n            /* Check for addition overflow. */\r\n            ( ( UBaseType_t ) ( SIZE_MAX - sizeof( Queue_t ) ) >= ( uxQueueLength * uxItemSize ) ) )\r\n        {\r\n            /* Allocate enough space to hold the maximum number of items that\r\n             * can be in the queue at any time.  It is valid for uxItemSize to be\r\n             * zero in the case the queue is used as a semaphore. */\r\n            xQueueSizeInBytes = ( size_t ) ( ( size_t ) uxQueueLength * ( size_t ) uxItemSize );\r\n\r\n            /* MISRA Ref 11.5.1 [Malloc memory assignment] */\r\n            /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n            /* coverity[misra_c_2012_rule_11_5_violation] */\r\n            pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes );\r\n\r\n            if( pxNewQueue != NULL )\r\n            {\r\n                /* Jump past the queue structure to find the location of the queue\r\n                 * storage area. */\r\n                pucQueueStorage = ( uint8_t * ) pxNewQueue;\r\n                pucQueueStorage += sizeof( Queue_t );\r\n\r\n                #if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n                {\r\n                    /* Queues can be created either statically or dynamically, so\r\n                     * note this task was created dynamically in case it is later\r\n                     * deleted. */\r\n                    pxNewQueue->ucStaticallyAllocated = pdFALSE;\r\n                }\r\n                #endif /* configSUPPORT_STATIC_ALLOCATION */\r\n\r\n                prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue );\r\n            }\r\n            else\r\n            {\r\n                traceQUEUE_CREATE_FAILED( ucQueueType );\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            configASSERT( pxNewQueue );\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_xQueueGenericCreate( pxNewQueue );\r\n\r\n        return pxNewQueue;\r\n    }\r\n\r\n#endif /* configSUPPORT_STATIC_ALLOCATION */\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic void prvInitialiseNewQueue( const UBaseType_t uxQueueLength,\r\n                                   const UBaseType_t uxItemSize,\r\n                                   uint8_t * pucQueueStorage,\r\n                                   const uint8_t ucQueueType,\r\n                                   Queue_t * pxNewQueue )\r\n{\r\n    /* Remove compiler warnings about unused parameters should\r\n     * configUSE_TRACE_FACILITY not be set to 1. */\r\n    ( void ) ucQueueType;\r\n\r\n    if( uxItemSize == ( UBaseType_t ) 0 )\r\n    {\r\n        /* No RAM was allocated for the queue storage area, but PC head cannot\r\n         * be set to NULL because NULL is used as a key to say the queue is used as\r\n         * a mutex.  Therefore just set pcHead to point to the queue as a benign\r\n         * value that is known to be within the memory map. */\r\n        pxNewQueue->pcHead = ( int8_t * ) pxNewQueue;\r\n    }\r\n    else\r\n    {\r\n        /* Set the head to the start of the queue storage area. */\r\n        pxNewQueue->pcHead = ( int8_t * ) pucQueueStorage;\r\n    }\r\n\r\n    /* Initialise the queue members as described where the queue type is\r\n     * defined. */\r\n    pxNewQueue->uxLength = uxQueueLength;\r\n    pxNewQueue->uxItemSize = uxItemSize;\r\n    ( void ) xQueueGenericReset( pxNewQueue, pdTRUE );\r\n\r\n    #if ( configUSE_TRACE_FACILITY == 1 )\r\n    {\r\n        pxNewQueue->ucQueueType = ucQueueType;\r\n    }\r\n    #endif /* configUSE_TRACE_FACILITY */\r\n\r\n    #if ( configUSE_QUEUE_SETS == 1 )\r\n    {\r\n        pxNewQueue->pxQueueSetContainer = NULL;\r\n    }\r\n    #endif /* configUSE_QUEUE_SETS */\r\n\r\n    traceQUEUE_CREATE( pxNewQueue );\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_MUTEXES == 1 )\r\n\r\n    static void prvInitialiseMutex( Queue_t * pxNewQueue )\r\n    {\r\n        if( pxNewQueue != NULL )\r\n        {\r\n            /* The queue create function will set all the queue structure members\r\n            * correctly for a generic queue, but this function is creating a\r\n            * mutex.  Overwrite those members that need to be set differently -\r\n            * in particular the information required for priority inheritance. */\r\n            pxNewQueue->u.xSemaphore.xMutexHolder = NULL;\r\n            pxNewQueue->uxQueueType = queueQUEUE_IS_MUTEX;\r\n\r\n            /* In case this is a recursive mutex. */\r\n            pxNewQueue->u.xSemaphore.uxRecursiveCallCount = 0;\r\n\r\n            traceCREATE_MUTEX( pxNewQueue );\r\n\r\n            /* Start with the semaphore in the expected state. */\r\n            ( void ) xQueueGenericSend( pxNewQueue, NULL, ( TickType_t ) 0U, queueSEND_TO_BACK );\r\n        }\r\n        else\r\n        {\r\n            traceCREATE_MUTEX_FAILED();\r\n        }\r\n    }\r\n\r\n#endif /* configUSE_MUTEXES */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )\r\n\r\n    QueueHandle_t xQueueCreateMutex( const uint8_t ucQueueType )\r\n    {\r\n        QueueHandle_t xNewQueue;\r\n        const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0;\r\n\r\n        traceENTER_xQueueCreateMutex( ucQueueType );\r\n\r\n        xNewQueue = xQueueGenericCreate( uxMutexLength, uxMutexSize, ucQueueType );\r\n        prvInitialiseMutex( ( Queue_t * ) xNewQueue );\r\n\r\n        traceRETURN_xQueueCreateMutex( xNewQueue );\r\n\r\n        return xNewQueue;\r\n    }\r\n\r\n#endif /* configUSE_MUTEXES */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configUSE_MUTEXES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )\r\n\r\n    QueueHandle_t xQueueCreateMutexStatic( const uint8_t ucQueueType,\r\n                                           StaticQueue_t * pxStaticQueue )\r\n    {\r\n        QueueHandle_t xNewQueue;\r\n        const UBaseType_t uxMutexLength = ( UBaseType_t ) 1, uxMutexSize = ( UBaseType_t ) 0;\r\n\r\n        traceENTER_xQueueCreateMutexStatic( ucQueueType, pxStaticQueue );\r\n\r\n        /* Prevent compiler warnings about unused parameters if\r\n         * configUSE_TRACE_FACILITY does not equal 1. */\r\n        ( void ) ucQueueType;\r\n\r\n        xNewQueue = xQueueGenericCreateStatic( uxMutexLength, uxMutexSize, NULL, pxStaticQueue, ucQueueType );\r\n        prvInitialiseMutex( ( Queue_t * ) xNewQueue );\r\n\r\n        traceRETURN_xQueueCreateMutexStatic( xNewQueue );\r\n\r\n        return xNewQueue;\r\n    }\r\n\r\n#endif /* configUSE_MUTEXES */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) )\r\n\r\n    TaskHandle_t xQueueGetMutexHolder( QueueHandle_t xSemaphore )\r\n    {\r\n        TaskHandle_t pxReturn;\r\n        Queue_t * const pxSemaphore = ( Queue_t * ) xSemaphore;\r\n\r\n        traceENTER_xQueueGetMutexHolder( xSemaphore );\r\n\r\n        configASSERT( xSemaphore );\r\n\r\n        /* This function is called by xSemaphoreGetMutexHolder(), and should not\r\n         * be called directly.  Note:  This is a good way of determining if the\r\n         * calling task is the mutex holder, but not a good way of determining the\r\n         * identity of the mutex holder, as the holder may change between the\r\n         * following critical section exiting and the function returning. */\r\n        taskENTER_CRITICAL();\r\n        {\r\n            if( pxSemaphore->uxQueueType == queueQUEUE_IS_MUTEX )\r\n            {\r\n                pxReturn = pxSemaphore->u.xSemaphore.xMutexHolder;\r\n            }\r\n            else\r\n            {\r\n                pxReturn = NULL;\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_xQueueGetMutexHolder( pxReturn );\r\n\r\n        return pxReturn;\r\n    }\r\n\r\n#endif /* if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) )\r\n\r\n    TaskHandle_t xQueueGetMutexHolderFromISR( QueueHandle_t xSemaphore )\r\n    {\r\n        TaskHandle_t pxReturn;\r\n\r\n        traceENTER_xQueueGetMutexHolderFromISR( xSemaphore );\r\n\r\n        configASSERT( xSemaphore );\r\n\r\n        /* Mutexes cannot be used in interrupt service routines, so the mutex\r\n         * holder should not change in an ISR, and therefore a critical section is\r\n         * not required here. */\r\n        if( ( ( Queue_t * ) xSemaphore )->uxQueueType == queueQUEUE_IS_MUTEX )\r\n        {\r\n            pxReturn = ( ( Queue_t * ) xSemaphore )->u.xSemaphore.xMutexHolder;\r\n        }\r\n        else\r\n        {\r\n            pxReturn = NULL;\r\n        }\r\n\r\n        traceRETURN_xQueueGetMutexHolderFromISR( pxReturn );\r\n\r\n        return pxReturn;\r\n    }\r\n\r\n#endif /* if ( ( configUSE_MUTEXES == 1 ) && ( INCLUDE_xSemaphoreGetMutexHolder == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_RECURSIVE_MUTEXES == 1 )\r\n\r\n    BaseType_t xQueueGiveMutexRecursive( QueueHandle_t xMutex )\r\n    {\r\n        BaseType_t xReturn;\r\n        Queue_t * const pxMutex = ( Queue_t * ) xMutex;\r\n\r\n        traceENTER_xQueueGiveMutexRecursive( xMutex );\r\n\r\n        configASSERT( pxMutex );\r\n\r\n        /* If this is the task that holds the mutex then xMutexHolder will not\r\n         * change outside of this task.  If this task does not hold the mutex then\r\n         * pxMutexHolder can never coincidentally equal the tasks handle, and as\r\n         * this is the only condition we are interested in it does not matter if\r\n         * pxMutexHolder is accessed simultaneously by another task.  Therefore no\r\n         * mutual exclusion is required to test the pxMutexHolder variable. */\r\n        if( pxMutex->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle() )\r\n        {\r\n            traceGIVE_MUTEX_RECURSIVE( pxMutex );\r\n\r\n            /* uxRecursiveCallCount cannot be zero if xMutexHolder is equal to\r\n             * the task handle, therefore no underflow check is required.  Also,\r\n             * uxRecursiveCallCount is only modified by the mutex holder, and as\r\n             * there can only be one, no mutual exclusion is required to modify the\r\n             * uxRecursiveCallCount member. */\r\n            ( pxMutex->u.xSemaphore.uxRecursiveCallCount )--;\r\n\r\n            /* Has the recursive call count unwound to 0? */\r\n            if( pxMutex->u.xSemaphore.uxRecursiveCallCount == ( UBaseType_t ) 0 )\r\n            {\r\n                /* Return the mutex.  This will automatically unblock any other\r\n                 * task that might be waiting to access the mutex. */\r\n                ( void ) xQueueGenericSend( pxMutex, NULL, queueMUTEX_GIVE_BLOCK_TIME, queueSEND_TO_BACK );\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n\r\n            xReturn = pdPASS;\r\n        }\r\n        else\r\n        {\r\n            /* The mutex cannot be given because the calling task is not the\r\n             * holder. */\r\n            xReturn = pdFAIL;\r\n\r\n            traceGIVE_MUTEX_RECURSIVE_FAILED( pxMutex );\r\n        }\r\n\r\n        traceRETURN_xQueueGiveMutexRecursive( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_RECURSIVE_MUTEXES */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_RECURSIVE_MUTEXES == 1 )\r\n\r\n    BaseType_t xQueueTakeMutexRecursive( QueueHandle_t xMutex,\r\n                                         TickType_t xTicksToWait )\r\n    {\r\n        BaseType_t xReturn;\r\n        Queue_t * const pxMutex = ( Queue_t * ) xMutex;\r\n\r\n        traceENTER_xQueueTakeMutexRecursive( xMutex, xTicksToWait );\r\n\r\n        configASSERT( pxMutex );\r\n\r\n        /* Comments regarding mutual exclusion as per those within\r\n         * xQueueGiveMutexRecursive(). */\r\n\r\n        traceTAKE_MUTEX_RECURSIVE( pxMutex );\r\n\r\n        if( pxMutex->u.xSemaphore.xMutexHolder == xTaskGetCurrentTaskHandle() )\r\n        {\r\n            ( pxMutex->u.xSemaphore.uxRecursiveCallCount )++;\r\n            xReturn = pdPASS;\r\n        }\r\n        else\r\n        {\r\n            xReturn = xQueueSemaphoreTake( pxMutex, xTicksToWait );\r\n\r\n            /* pdPASS will only be returned if the mutex was successfully\r\n             * obtained.  The calling task may have entered the Blocked state\r\n             * before reaching here. */\r\n            if( xReturn != pdFAIL )\r\n            {\r\n                ( pxMutex->u.xSemaphore.uxRecursiveCallCount )++;\r\n            }\r\n            else\r\n            {\r\n                traceTAKE_MUTEX_RECURSIVE_FAILED( pxMutex );\r\n            }\r\n        }\r\n\r\n        traceRETURN_xQueueTakeMutexRecursive( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_RECURSIVE_MUTEXES */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )\r\n\r\n    QueueHandle_t xQueueCreateCountingSemaphoreStatic( const UBaseType_t uxMaxCount,\r\n                                                       const UBaseType_t uxInitialCount,\r\n                                                       StaticQueue_t * pxStaticQueue )\r\n    {\r\n        QueueHandle_t xHandle = NULL;\r\n\r\n        traceENTER_xQueueCreateCountingSemaphoreStatic( uxMaxCount, uxInitialCount, pxStaticQueue );\r\n\r\n        if( ( uxMaxCount != 0U ) &&\r\n            ( uxInitialCount <= uxMaxCount ) )\r\n        {\r\n            xHandle = xQueueGenericCreateStatic( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, NULL, pxStaticQueue, queueQUEUE_TYPE_COUNTING_SEMAPHORE );\r\n\r\n            if( xHandle != NULL )\r\n            {\r\n                ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount;\r\n\r\n                traceCREATE_COUNTING_SEMAPHORE();\r\n            }\r\n            else\r\n            {\r\n                traceCREATE_COUNTING_SEMAPHORE_FAILED();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            configASSERT( xHandle );\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_xQueueCreateCountingSemaphoreStatic( xHandle );\r\n\r\n        return xHandle;\r\n    }\r\n\r\n#endif /* ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )\r\n\r\n    QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount,\r\n                                                 const UBaseType_t uxInitialCount )\r\n    {\r\n        QueueHandle_t xHandle = NULL;\r\n\r\n        traceENTER_xQueueCreateCountingSemaphore( uxMaxCount, uxInitialCount );\r\n\r\n        if( ( uxMaxCount != 0U ) &&\r\n            ( uxInitialCount <= uxMaxCount ) )\r\n        {\r\n            xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE );\r\n\r\n            if( xHandle != NULL )\r\n            {\r\n                ( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount;\r\n\r\n                traceCREATE_COUNTING_SEMAPHORE();\r\n            }\r\n            else\r\n            {\r\n                traceCREATE_COUNTING_SEMAPHORE_FAILED();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            configASSERT( xHandle );\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_xQueueCreateCountingSemaphore( xHandle );\r\n\r\n        return xHandle;\r\n    }\r\n\r\n#endif /* ( ( configUSE_COUNTING_SEMAPHORES == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xQueueGenericSend( QueueHandle_t xQueue,\r\n                              const void * const pvItemToQueue,\r\n                              TickType_t xTicksToWait,\r\n                              const BaseType_t xCopyPosition )\r\n{\r\n    BaseType_t xEntryTimeSet = pdFALSE, xYieldRequired;\r\n    TimeOut_t xTimeOut;\r\n    Queue_t * const pxQueue = xQueue;\r\n\r\n    traceENTER_xQueueGenericSend( xQueue, pvItemToQueue, xTicksToWait, xCopyPosition );\r\n\r\n    configASSERT( pxQueue );\r\n    configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );\r\n    configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) );\r\n    #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )\r\n    {\r\n        configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );\r\n    }\r\n    #endif\r\n\r\n    for( ; ; )\r\n    {\r\n        taskENTER_CRITICAL();\r\n        {\r\n            /* Is there room on the queue now?  The running task must be the\r\n             * highest priority task wanting to access the queue.  If the head item\r\n             * in the queue is to be overwritten then it does not matter if the\r\n             * queue is full. */\r\n            if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )\r\n            {\r\n                traceQUEUE_SEND( pxQueue );\r\n\r\n                #if ( configUSE_QUEUE_SETS == 1 )\r\n                {\r\n                    const UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting;\r\n\r\n                    xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );\r\n\r\n                    if( pxQueue->pxQueueSetContainer != NULL )\r\n                    {\r\n                        if( ( xCopyPosition == queueOVERWRITE ) && ( uxPreviousMessagesWaiting != ( UBaseType_t ) 0 ) )\r\n                        {\r\n                            /* Do not notify the queue set as an existing item\r\n                             * was overwritten in the queue so the number of items\r\n                             * in the queue has not changed. */\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n                        else if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE )\r\n                        {\r\n                            /* The queue is a member of a queue set, and posting\r\n                             * to the queue set caused a higher priority task to\r\n                             * unblock. A context switch is required. */\r\n                            queueYIELD_IF_USING_PREEMPTION();\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        /* If there was a task waiting for data to arrive on the\r\n                         * queue then unblock it now. */\r\n                        if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )\r\n                        {\r\n                            if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )\r\n                            {\r\n                                /* The unblocked task has a priority higher than\r\n                                 * our own so yield immediately.  Yes it is ok to\r\n                                 * do this from within the critical section - the\r\n                                 * kernel takes care of that. */\r\n                                queueYIELD_IF_USING_PREEMPTION();\r\n                            }\r\n                            else\r\n                            {\r\n                                mtCOVERAGE_TEST_MARKER();\r\n                            }\r\n                        }\r\n                        else if( xYieldRequired != pdFALSE )\r\n                        {\r\n                            /* This path is a special case that will only get\r\n                             * executed if the task was holding multiple mutexes\r\n                             * and the mutexes were given back in an order that is\r\n                             * different to that in which they were taken. */\r\n                            queueYIELD_IF_USING_PREEMPTION();\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n                    }\r\n                }\r\n                #else /* configUSE_QUEUE_SETS */\r\n                {\r\n                    xYieldRequired = prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );\r\n\r\n                    /* If there was a task waiting for data to arrive on the\r\n                     * queue then unblock it now. */\r\n                    if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )\r\n                    {\r\n                        if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )\r\n                        {\r\n                            /* The unblocked task has a priority higher than\r\n                             * our own so yield immediately.  Yes it is ok to do\r\n                             * this from within the critical section - the kernel\r\n                             * takes care of that. */\r\n                            queueYIELD_IF_USING_PREEMPTION();\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n                    }\r\n                    else if( xYieldRequired != pdFALSE )\r\n                    {\r\n                        /* This path is a special case that will only get\r\n                         * executed if the task was holding multiple mutexes and\r\n                         * the mutexes were given back in an order that is\r\n                         * different to that in which they were taken. */\r\n                        queueYIELD_IF_USING_PREEMPTION();\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                #endif /* configUSE_QUEUE_SETS */\r\n\r\n                taskEXIT_CRITICAL();\r\n\r\n                traceRETURN_xQueueGenericSend( pdPASS );\r\n\r\n                return pdPASS;\r\n            }\r\n            else\r\n            {\r\n                if( xTicksToWait == ( TickType_t ) 0 )\r\n                {\r\n                    /* The queue was full and no block time is specified (or\r\n                     * the block time has expired) so leave now. */\r\n                    taskEXIT_CRITICAL();\r\n\r\n                    /* Return to the original privilege level before exiting\r\n                     * the function. */\r\n                    traceQUEUE_SEND_FAILED( pxQueue );\r\n                    traceRETURN_xQueueGenericSend( errQUEUE_FULL );\r\n\r\n                    return errQUEUE_FULL;\r\n                }\r\n                else if( xEntryTimeSet == pdFALSE )\r\n                {\r\n                    /* The queue was full and a block time was specified so\r\n                     * configure the timeout structure. */\r\n                    vTaskInternalSetTimeOutState( &xTimeOut );\r\n                    xEntryTimeSet = pdTRUE;\r\n                }\r\n                else\r\n                {\r\n                    /* Entry time was already set. */\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        /* Interrupts and other tasks can send to and receive from the queue\r\n         * now the critical section has been exited. */\r\n\r\n        vTaskSuspendAll();\r\n        prvLockQueue( pxQueue );\r\n\r\n        /* Update the timeout state to see if it has expired yet. */\r\n        if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )\r\n        {\r\n            if( prvIsQueueFull( pxQueue ) != pdFALSE )\r\n            {\r\n                traceBLOCKING_ON_QUEUE_SEND( pxQueue );\r\n                vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToSend ), xTicksToWait );\r\n\r\n                /* Unlocking the queue means queue events can effect the\r\n                 * event list. It is possible that interrupts occurring now\r\n                 * remove this task from the event list again - but as the\r\n                 * scheduler is suspended the task will go onto the pending\r\n                 * ready list instead of the actual ready list. */\r\n                prvUnlockQueue( pxQueue );\r\n\r\n                /* Resuming the scheduler will move tasks from the pending\r\n                 * ready list into the ready list - so it is feasible that this\r\n                 * task is already in the ready list before it yields - in which\r\n                 * case the yield will not cause a context switch unless there\r\n                 * is also a higher priority task in the pending ready list. */\r\n                if( xTaskResumeAll() == pdFALSE )\r\n                {\r\n                    taskYIELD_WITHIN_API();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                /* Try again. */\r\n                prvUnlockQueue( pxQueue );\r\n                ( void ) xTaskResumeAll();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            /* The timeout has expired. */\r\n            prvUnlockQueue( pxQueue );\r\n            ( void ) xTaskResumeAll();\r\n\r\n            traceQUEUE_SEND_FAILED( pxQueue );\r\n            traceRETURN_xQueueGenericSend( errQUEUE_FULL );\r\n\r\n            return errQUEUE_FULL;\r\n        }\r\n    }\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xQueueGenericSendFromISR( QueueHandle_t xQueue,\r\n                                     const void * const pvItemToQueue,\r\n                                     BaseType_t * const pxHigherPriorityTaskWoken,\r\n                                     const BaseType_t xCopyPosition )\r\n{\r\n    BaseType_t xReturn;\r\n    UBaseType_t uxSavedInterruptStatus;\r\n    Queue_t * const pxQueue = xQueue;\r\n\r\n    traceENTER_xQueueGenericSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken, xCopyPosition );\r\n\r\n    configASSERT( pxQueue );\r\n    configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );\r\n    configASSERT( !( ( xCopyPosition == queueOVERWRITE ) && ( pxQueue->uxLength != 1 ) ) );\r\n\r\n    /* RTOS ports that support interrupt nesting have the concept of a maximum\r\n     * system call (or maximum API call) interrupt priority.  Interrupts that are\r\n     * above the maximum system call priority are kept permanently enabled, even\r\n     * when the RTOS kernel is in a critical section, but cannot make any calls to\r\n     * FreeRTOS API functions.  If configASSERT() is defined in FreeRTOSConfig.h\r\n     * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion\r\n     * failure if a FreeRTOS API function is called from an interrupt that has been\r\n     * assigned a priority above the configured maximum system call priority.\r\n     * Only FreeRTOS functions that end in FromISR can be called from interrupts\r\n     * that have been assigned a priority at or (logically) below the maximum\r\n     * system call interrupt priority.  FreeRTOS maintains a separate interrupt\r\n     * safe API to ensure interrupt entry is as fast and as simple as possible.\r\n     * More information (albeit Cortex-M specific) is provided on the following\r\n     * link: https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */\r\n    portASSERT_IF_INTERRUPT_PRIORITY_INVALID();\r\n\r\n    /* Similar to xQueueGenericSend, except without blocking if there is no room\r\n     * in the queue.  Also don't directly wake a task that was blocked on a queue\r\n     * read, instead return a flag to say whether a context switch is required or\r\n     * not (i.e. has a task with a higher priority than us been woken by this\r\n     * post). */\r\n    uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();\r\n    {\r\n        if( ( pxQueue->uxMessagesWaiting < pxQueue->uxLength ) || ( xCopyPosition == queueOVERWRITE ) )\r\n        {\r\n            const int8_t cTxLock = pxQueue->cTxLock;\r\n            const UBaseType_t uxPreviousMessagesWaiting = pxQueue->uxMessagesWaiting;\r\n\r\n            traceQUEUE_SEND_FROM_ISR( pxQueue );\r\n\r\n            /* Semaphores use xQueueGiveFromISR(), so pxQueue will not be a\r\n             *  semaphore or mutex.  That means prvCopyDataToQueue() cannot result\r\n             *  in a task disinheriting a priority and prvCopyDataToQueue() can be\r\n             *  called here even though the disinherit function does not check if\r\n             *  the scheduler is suspended before accessing the ready lists. */\r\n            ( void ) prvCopyDataToQueue( pxQueue, pvItemToQueue, xCopyPosition );\r\n\r\n            /* The event list is not altered if the queue is locked.  This will\r\n             * be done when the queue is unlocked later. */\r\n            if( cTxLock == queueUNLOCKED )\r\n            {\r\n                #if ( configUSE_QUEUE_SETS == 1 )\r\n                {\r\n                    if( pxQueue->pxQueueSetContainer != NULL )\r\n                    {\r\n                        if( ( xCopyPosition == queueOVERWRITE ) && ( uxPreviousMessagesWaiting != ( UBaseType_t ) 0 ) )\r\n                        {\r\n                            /* Do not notify the queue set as an existing item\r\n                             * was overwritten in the queue so the number of items\r\n                             * in the queue has not changed. */\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n                        else if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE )\r\n                        {\r\n                            /* The queue is a member of a queue set, and posting\r\n                             * to the queue set caused a higher priority task to\r\n                             * unblock.  A context switch is required. */\r\n                            if( pxHigherPriorityTaskWoken != NULL )\r\n                            {\r\n                                *pxHigherPriorityTaskWoken = pdTRUE;\r\n                            }\r\n                            else\r\n                            {\r\n                                mtCOVERAGE_TEST_MARKER();\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )\r\n                        {\r\n                            if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )\r\n                            {\r\n                                /* The task waiting has a higher priority so\r\n                                 *  record that a context switch is required. */\r\n                                if( pxHigherPriorityTaskWoken != NULL )\r\n                                {\r\n                                    *pxHigherPriorityTaskWoken = pdTRUE;\r\n                                }\r\n                                else\r\n                                {\r\n                                    mtCOVERAGE_TEST_MARKER();\r\n                                }\r\n                            }\r\n                            else\r\n                            {\r\n                                mtCOVERAGE_TEST_MARKER();\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n                    }\r\n                }\r\n                #else /* configUSE_QUEUE_SETS */\r\n                {\r\n                    if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )\r\n                    {\r\n                        if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )\r\n                        {\r\n                            /* The task waiting has a higher priority so record that a\r\n                             * context switch is required. */\r\n                            if( pxHigherPriorityTaskWoken != NULL )\r\n                            {\r\n                                *pxHigherPriorityTaskWoken = pdTRUE;\r\n                            }\r\n                            else\r\n                            {\r\n                                mtCOVERAGE_TEST_MARKER();\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n\r\n                    /* Not used in this path. */\r\n                    ( void ) uxPreviousMessagesWaiting;\r\n                }\r\n                #endif /* configUSE_QUEUE_SETS */\r\n            }\r\n            else\r\n            {\r\n                /* Increment the lock count so the task that unlocks the queue\r\n                 * knows that data was posted while it was locked. */\r\n                prvIncrementQueueTxLock( pxQueue, cTxLock );\r\n            }\r\n\r\n            xReturn = pdPASS;\r\n        }\r\n        else\r\n        {\r\n            traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue );\r\n            xReturn = errQUEUE_FULL;\r\n        }\r\n    }\r\n    taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );\r\n\r\n    traceRETURN_xQueueGenericSendFromISR( xReturn );\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xQueueGiveFromISR( QueueHandle_t xQueue,\r\n                              BaseType_t * const pxHigherPriorityTaskWoken )\r\n{\r\n    BaseType_t xReturn;\r\n    UBaseType_t uxSavedInterruptStatus;\r\n    Queue_t * const pxQueue = xQueue;\r\n\r\n    traceENTER_xQueueGiveFromISR( xQueue, pxHigherPriorityTaskWoken );\r\n\r\n    /* Similar to xQueueGenericSendFromISR() but used with semaphores where the\r\n     * item size is 0.  Don't directly wake a task that was blocked on a queue\r\n     * read, instead return a flag to say whether a context switch is required or\r\n     * not (i.e. has a task with a higher priority than us been woken by this\r\n     * post). */\r\n\r\n    configASSERT( pxQueue );\r\n\r\n    /* xQueueGenericSendFromISR() should be used instead of xQueueGiveFromISR()\r\n     * if the item size is not 0. */\r\n    configASSERT( pxQueue->uxItemSize == 0 );\r\n\r\n    /* Normally a mutex would not be given from an interrupt, especially if\r\n     * there is a mutex holder, as priority inheritance makes no sense for an\r\n     * interrupts, only tasks. */\r\n    configASSERT( !( ( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX ) && ( pxQueue->u.xSemaphore.xMutexHolder != NULL ) ) );\r\n\r\n    /* RTOS ports that support interrupt nesting have the concept of a maximum\r\n     * system call (or maximum API call) interrupt priority.  Interrupts that are\r\n     * above the maximum system call priority are kept permanently enabled, even\r\n     * when the RTOS kernel is in a critical section, but cannot make any calls to\r\n     * FreeRTOS API functions.  If configASSERT() is defined in FreeRTOSConfig.h\r\n     * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion\r\n     * failure if a FreeRTOS API function is called from an interrupt that has been\r\n     * assigned a priority above the configured maximum system call priority.\r\n     * Only FreeRTOS functions that end in FromISR can be called from interrupts\r\n     * that have been assigned a priority at or (logically) below the maximum\r\n     * system call interrupt priority.  FreeRTOS maintains a separate interrupt\r\n     * safe API to ensure interrupt entry is as fast and as simple as possible.\r\n     * More information (albeit Cortex-M specific) is provided on the following\r\n     * link: https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */\r\n    portASSERT_IF_INTERRUPT_PRIORITY_INVALID();\r\n\r\n    uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();\r\n    {\r\n        const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting;\r\n\r\n        /* When the queue is used to implement a semaphore no data is ever\r\n         * moved through the queue but it is still valid to see if the queue 'has\r\n         * space'. */\r\n        if( uxMessagesWaiting < pxQueue->uxLength )\r\n        {\r\n            const int8_t cTxLock = pxQueue->cTxLock;\r\n\r\n            traceQUEUE_SEND_FROM_ISR( pxQueue );\r\n\r\n            /* A task can only have an inherited priority if it is a mutex\r\n             * holder - and if there is a mutex holder then the mutex cannot be\r\n             * given from an ISR.  As this is the ISR version of the function it\r\n             * can be assumed there is no mutex holder and no need to determine if\r\n             * priority disinheritance is needed.  Simply increase the count of\r\n             * messages (semaphores) available. */\r\n            pxQueue->uxMessagesWaiting = ( UBaseType_t ) ( uxMessagesWaiting + ( UBaseType_t ) 1 );\r\n\r\n            /* The event list is not altered if the queue is locked.  This will\r\n             * be done when the queue is unlocked later. */\r\n            if( cTxLock == queueUNLOCKED )\r\n            {\r\n                #if ( configUSE_QUEUE_SETS == 1 )\r\n                {\r\n                    if( pxQueue->pxQueueSetContainer != NULL )\r\n                    {\r\n                        if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE )\r\n                        {\r\n                            /* The semaphore is a member of a queue set, and\r\n                             * posting to the queue set caused a higher priority\r\n                             * task to unblock.  A context switch is required. */\r\n                            if( pxHigherPriorityTaskWoken != NULL )\r\n                            {\r\n                                *pxHigherPriorityTaskWoken = pdTRUE;\r\n                            }\r\n                            else\r\n                            {\r\n                                mtCOVERAGE_TEST_MARKER();\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )\r\n                        {\r\n                            if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )\r\n                            {\r\n                                /* The task waiting has a higher priority so\r\n                                 *  record that a context switch is required. */\r\n                                if( pxHigherPriorityTaskWoken != NULL )\r\n                                {\r\n                                    *pxHigherPriorityTaskWoken = pdTRUE;\r\n                                }\r\n                                else\r\n                                {\r\n                                    mtCOVERAGE_TEST_MARKER();\r\n                                }\r\n                            }\r\n                            else\r\n                            {\r\n                                mtCOVERAGE_TEST_MARKER();\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n                    }\r\n                }\r\n                #else /* configUSE_QUEUE_SETS */\r\n                {\r\n                    if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )\r\n                    {\r\n                        if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )\r\n                        {\r\n                            /* The task waiting has a higher priority so record that a\r\n                             * context switch is required. */\r\n                            if( pxHigherPriorityTaskWoken != NULL )\r\n                            {\r\n                                *pxHigherPriorityTaskWoken = pdTRUE;\r\n                            }\r\n                            else\r\n                            {\r\n                                mtCOVERAGE_TEST_MARKER();\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                #endif /* configUSE_QUEUE_SETS */\r\n            }\r\n            else\r\n            {\r\n                /* Increment the lock count so the task that unlocks the queue\r\n                 * knows that data was posted while it was locked. */\r\n                prvIncrementQueueTxLock( pxQueue, cTxLock );\r\n            }\r\n\r\n            xReturn = pdPASS;\r\n        }\r\n        else\r\n        {\r\n            traceQUEUE_SEND_FROM_ISR_FAILED( pxQueue );\r\n            xReturn = errQUEUE_FULL;\r\n        }\r\n    }\r\n    taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );\r\n\r\n    traceRETURN_xQueueGiveFromISR( xReturn );\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xQueueReceive( QueueHandle_t xQueue,\r\n                          void * const pvBuffer,\r\n                          TickType_t xTicksToWait )\r\n{\r\n    BaseType_t xEntryTimeSet = pdFALSE;\r\n    TimeOut_t xTimeOut;\r\n    Queue_t * const pxQueue = xQueue;\r\n\r\n    traceENTER_xQueueReceive( xQueue, pvBuffer, xTicksToWait );\r\n\r\n    /* Check the pointer is not NULL. */\r\n    configASSERT( ( pxQueue ) );\r\n\r\n    /* The buffer into which data is received can only be NULL if the data size\r\n     * is zero (so no data is copied into the buffer). */\r\n    configASSERT( !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) );\r\n\r\n    /* Cannot block if the scheduler is suspended. */\r\n    #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )\r\n    {\r\n        configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );\r\n    }\r\n    #endif\r\n\r\n    for( ; ; )\r\n    {\r\n        taskENTER_CRITICAL();\r\n        {\r\n            const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting;\r\n\r\n            /* Is there data in the queue now?  To be running the calling task\r\n             * must be the highest priority task wanting to access the queue. */\r\n            if( uxMessagesWaiting > ( UBaseType_t ) 0 )\r\n            {\r\n                /* Data available, remove one item. */\r\n                prvCopyDataFromQueue( pxQueue, pvBuffer );\r\n                traceQUEUE_RECEIVE( pxQueue );\r\n                pxQueue->uxMessagesWaiting = ( UBaseType_t ) ( uxMessagesWaiting - ( UBaseType_t ) 1 );\r\n\r\n                /* There is now space in the queue, were any tasks waiting to\r\n                 * post to the queue?  If so, unblock the highest priority waiting\r\n                 * task. */\r\n                if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )\r\n                {\r\n                    if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )\r\n                    {\r\n                        queueYIELD_IF_USING_PREEMPTION();\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n\r\n                taskEXIT_CRITICAL();\r\n\r\n                traceRETURN_xQueueReceive( pdPASS );\r\n\r\n                return pdPASS;\r\n            }\r\n            else\r\n            {\r\n                if( xTicksToWait == ( TickType_t ) 0 )\r\n                {\r\n                    /* The queue was empty and no block time is specified (or\r\n                     * the block time has expired) so leave now. */\r\n                    taskEXIT_CRITICAL();\r\n\r\n                    traceQUEUE_RECEIVE_FAILED( pxQueue );\r\n                    traceRETURN_xQueueReceive( errQUEUE_EMPTY );\r\n\r\n                    return errQUEUE_EMPTY;\r\n                }\r\n                else if( xEntryTimeSet == pdFALSE )\r\n                {\r\n                    /* The queue was empty and a block time was specified so\r\n                     * configure the timeout structure. */\r\n                    vTaskInternalSetTimeOutState( &xTimeOut );\r\n                    xEntryTimeSet = pdTRUE;\r\n                }\r\n                else\r\n                {\r\n                    /* Entry time was already set. */\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        /* Interrupts and other tasks can send to and receive from the queue\r\n         * now the critical section has been exited. */\r\n\r\n        vTaskSuspendAll();\r\n        prvLockQueue( pxQueue );\r\n\r\n        /* Update the timeout state to see if it has expired yet. */\r\n        if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )\r\n        {\r\n            /* The timeout has not expired.  If the queue is still empty place\r\n             * the task on the list of tasks waiting to receive from the queue. */\r\n            if( prvIsQueueEmpty( pxQueue ) != pdFALSE )\r\n            {\r\n                traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue );\r\n                vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait );\r\n                prvUnlockQueue( pxQueue );\r\n\r\n                if( xTaskResumeAll() == pdFALSE )\r\n                {\r\n                    taskYIELD_WITHIN_API();\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                /* The queue contains data again.  Loop back to try and read the\r\n                 * data. */\r\n                prvUnlockQueue( pxQueue );\r\n                ( void ) xTaskResumeAll();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            /* Timed out.  If there is no data in the queue exit, otherwise loop\r\n             * back and attempt to read the data. */\r\n            prvUnlockQueue( pxQueue );\r\n            ( void ) xTaskResumeAll();\r\n\r\n            if( prvIsQueueEmpty( pxQueue ) != pdFALSE )\r\n            {\r\n                traceQUEUE_RECEIVE_FAILED( pxQueue );\r\n                traceRETURN_xQueueReceive( errQUEUE_EMPTY );\r\n\r\n                return errQUEUE_EMPTY;\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n    }\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xQueueSemaphoreTake( QueueHandle_t xQueue,\r\n                                TickType_t xTicksToWait )\r\n{\r\n    BaseType_t xEntryTimeSet = pdFALSE;\r\n    TimeOut_t xTimeOut;\r\n    Queue_t * const pxQueue = xQueue;\r\n\r\n    #if ( configUSE_MUTEXES == 1 )\r\n        BaseType_t xInheritanceOccurred = pdFALSE;\r\n    #endif\r\n\r\n    traceENTER_xQueueSemaphoreTake( xQueue, xTicksToWait );\r\n\r\n    /* Check the queue pointer is not NULL. */\r\n    configASSERT( ( pxQueue ) );\r\n\r\n    /* Check this really is a semaphore, in which case the item size will be\r\n     * 0. */\r\n    configASSERT( pxQueue->uxItemSize == 0 );\r\n\r\n    /* Cannot block if the scheduler is suspended. */\r\n    #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )\r\n    {\r\n        configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );\r\n    }\r\n    #endif\r\n\r\n    for( ; ; )\r\n    {\r\n        taskENTER_CRITICAL();\r\n        {\r\n            /* Semaphores are queues with an item size of 0, and where the\r\n             * number of messages in the queue is the semaphore's count value. */\r\n            const UBaseType_t uxSemaphoreCount = pxQueue->uxMessagesWaiting;\r\n\r\n            /* Is there data in the queue now?  To be running the calling task\r\n             * must be the highest priority task wanting to access the queue. */\r\n            if( uxSemaphoreCount > ( UBaseType_t ) 0 )\r\n            {\r\n                traceQUEUE_RECEIVE( pxQueue );\r\n\r\n                /* Semaphores are queues with a data size of zero and where the\r\n                 * messages waiting is the semaphore's count.  Reduce the count. */\r\n                pxQueue->uxMessagesWaiting = ( UBaseType_t ) ( uxSemaphoreCount - ( UBaseType_t ) 1 );\r\n\r\n                #if ( configUSE_MUTEXES == 1 )\r\n                {\r\n                    if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )\r\n                    {\r\n                        /* Record the information required to implement\r\n                         * priority inheritance should it become necessary. */\r\n                        pxQueue->u.xSemaphore.xMutexHolder = pvTaskIncrementMutexHeldCount();\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                #endif /* configUSE_MUTEXES */\r\n\r\n                /* Check to see if other tasks are blocked waiting to give the\r\n                 * semaphore, and if so, unblock the highest priority such task. */\r\n                if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )\r\n                {\r\n                    if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )\r\n                    {\r\n                        queueYIELD_IF_USING_PREEMPTION();\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n\r\n                taskEXIT_CRITICAL();\r\n\r\n                traceRETURN_xQueueSemaphoreTake( pdPASS );\r\n\r\n                return pdPASS;\r\n            }\r\n            else\r\n            {\r\n                if( xTicksToWait == ( TickType_t ) 0 )\r\n                {\r\n                    /* The semaphore count was 0 and no block time is specified\r\n                     * (or the block time has expired) so exit now. */\r\n                    taskEXIT_CRITICAL();\r\n\r\n                    traceQUEUE_RECEIVE_FAILED( pxQueue );\r\n                    traceRETURN_xQueueSemaphoreTake( errQUEUE_EMPTY );\r\n\r\n                    return errQUEUE_EMPTY;\r\n                }\r\n                else if( xEntryTimeSet == pdFALSE )\r\n                {\r\n                    /* The semaphore count was 0 and a block time was specified\r\n                     * so configure the timeout structure ready to block. */\r\n                    vTaskInternalSetTimeOutState( &xTimeOut );\r\n                    xEntryTimeSet = pdTRUE;\r\n                }\r\n                else\r\n                {\r\n                    /* Entry time was already set. */\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        /* Interrupts and other tasks can give to and take from the semaphore\r\n         * now the critical section has been exited. */\r\n\r\n        vTaskSuspendAll();\r\n        prvLockQueue( pxQueue );\r\n\r\n        /* Update the timeout state to see if it has expired yet. */\r\n        if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )\r\n        {\r\n            /* A block time is specified and not expired.  If the semaphore\r\n             * count is 0 then enter the Blocked state to wait for a semaphore to\r\n             * become available.  As semaphores are implemented with queues the\r\n             * queue being empty is equivalent to the semaphore count being 0. */\r\n            if( prvIsQueueEmpty( pxQueue ) != pdFALSE )\r\n            {\r\n                traceBLOCKING_ON_QUEUE_RECEIVE( pxQueue );\r\n\r\n                #if ( configUSE_MUTEXES == 1 )\r\n                {\r\n                    if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )\r\n                    {\r\n                        taskENTER_CRITICAL();\r\n                        {\r\n                            xInheritanceOccurred = xTaskPriorityInherit( pxQueue->u.xSemaphore.xMutexHolder );\r\n                        }\r\n                        taskEXIT_CRITICAL();\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                #endif /* if ( configUSE_MUTEXES == 1 ) */\r\n\r\n                vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait );\r\n                prvUnlockQueue( pxQueue );\r\n\r\n                if( xTaskResumeAll() == pdFALSE )\r\n                {\r\n                    taskYIELD_WITHIN_API();\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                /* There was no timeout and the semaphore count was not 0, so\r\n                 * attempt to take the semaphore again. */\r\n                prvUnlockQueue( pxQueue );\r\n                ( void ) xTaskResumeAll();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            /* Timed out. */\r\n            prvUnlockQueue( pxQueue );\r\n            ( void ) xTaskResumeAll();\r\n\r\n            /* If the semaphore count is 0 exit now as the timeout has\r\n             * expired.  Otherwise return to attempt to take the semaphore that is\r\n             * known to be available.  As semaphores are implemented by queues the\r\n             * queue being empty is equivalent to the semaphore count being 0. */\r\n            if( prvIsQueueEmpty( pxQueue ) != pdFALSE )\r\n            {\r\n                #if ( configUSE_MUTEXES == 1 )\r\n                {\r\n                    /* xInheritanceOccurred could only have be set if\r\n                     * pxQueue->uxQueueType == queueQUEUE_IS_MUTEX so no need to\r\n                     * test the mutex type again to check it is actually a mutex. */\r\n                    if( xInheritanceOccurred != pdFALSE )\r\n                    {\r\n                        taskENTER_CRITICAL();\r\n                        {\r\n                            UBaseType_t uxHighestWaitingPriority;\r\n\r\n                            /* This task blocking on the mutex caused another\r\n                             * task to inherit this task's priority.  Now this task\r\n                             * has timed out the priority should be disinherited\r\n                             * again, but only as low as the next highest priority\r\n                             * task that is waiting for the same mutex. */\r\n                            uxHighestWaitingPriority = prvGetDisinheritPriorityAfterTimeout( pxQueue );\r\n\r\n                            /* vTaskPriorityDisinheritAfterTimeout uses the uxHighestWaitingPriority\r\n                             * parameter to index pxReadyTasksLists when adding the task holding\r\n                             * mutex to the ready list for its new priority. Coverity thinks that\r\n                             * it can result in out-of-bounds access which is not true because\r\n                             * uxHighestWaitingPriority, as returned by prvGetDisinheritPriorityAfterTimeout,\r\n                             * is capped at ( configMAX_PRIORITIES - 1 ). */\r\n                            /* coverity[overrun] */\r\n                            vTaskPriorityDisinheritAfterTimeout( pxQueue->u.xSemaphore.xMutexHolder, uxHighestWaitingPriority );\r\n                        }\r\n                        taskEXIT_CRITICAL();\r\n                    }\r\n                }\r\n                #endif /* configUSE_MUTEXES */\r\n\r\n                traceQUEUE_RECEIVE_FAILED( pxQueue );\r\n                traceRETURN_xQueueSemaphoreTake( errQUEUE_EMPTY );\r\n\r\n                return errQUEUE_EMPTY;\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n    }\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xQueuePeek( QueueHandle_t xQueue,\r\n                       void * const pvBuffer,\r\n                       TickType_t xTicksToWait )\r\n{\r\n    BaseType_t xEntryTimeSet = pdFALSE;\r\n    TimeOut_t xTimeOut;\r\n    int8_t * pcOriginalReadPosition;\r\n    Queue_t * const pxQueue = xQueue;\r\n\r\n    traceENTER_xQueuePeek( xQueue, pvBuffer, xTicksToWait );\r\n\r\n    /* Check the pointer is not NULL. */\r\n    configASSERT( ( pxQueue ) );\r\n\r\n    /* The buffer into which data is received can only be NULL if the data size\r\n     * is zero (so no data is copied into the buffer. */\r\n    configASSERT( !( ( ( pvBuffer ) == NULL ) && ( ( pxQueue )->uxItemSize != ( UBaseType_t ) 0U ) ) );\r\n\r\n    /* Cannot block if the scheduler is suspended. */\r\n    #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )\r\n    {\r\n        configASSERT( !( ( xTaskGetSchedulerState() == taskSCHEDULER_SUSPENDED ) && ( xTicksToWait != 0 ) ) );\r\n    }\r\n    #endif\r\n\r\n    for( ; ; )\r\n    {\r\n        taskENTER_CRITICAL();\r\n        {\r\n            const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting;\r\n\r\n            /* Is there data in the queue now?  To be running the calling task\r\n             * must be the highest priority task wanting to access the queue. */\r\n            if( uxMessagesWaiting > ( UBaseType_t ) 0 )\r\n            {\r\n                /* Remember the read position so it can be reset after the data\r\n                 * is read from the queue as this function is only peeking the\r\n                 * data, not removing it. */\r\n                pcOriginalReadPosition = pxQueue->u.xQueue.pcReadFrom;\r\n\r\n                prvCopyDataFromQueue( pxQueue, pvBuffer );\r\n                traceQUEUE_PEEK( pxQueue );\r\n\r\n                /* The data is not being removed, so reset the read pointer. */\r\n                pxQueue->u.xQueue.pcReadFrom = pcOriginalReadPosition;\r\n\r\n                /* The data is being left in the queue, so see if there are\r\n                 * any other tasks waiting for the data. */\r\n                if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )\r\n                {\r\n                    if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )\r\n                    {\r\n                        /* The task waiting has a higher priority than this task. */\r\n                        queueYIELD_IF_USING_PREEMPTION();\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n\r\n                taskEXIT_CRITICAL();\r\n\r\n                traceRETURN_xQueuePeek( pdPASS );\r\n\r\n                return pdPASS;\r\n            }\r\n            else\r\n            {\r\n                if( xTicksToWait == ( TickType_t ) 0 )\r\n                {\r\n                    /* The queue was empty and no block time is specified (or\r\n                     * the block time has expired) so leave now. */\r\n                    taskEXIT_CRITICAL();\r\n\r\n                    traceQUEUE_PEEK_FAILED( pxQueue );\r\n                    traceRETURN_xQueuePeek( errQUEUE_EMPTY );\r\n\r\n                    return errQUEUE_EMPTY;\r\n                }\r\n                else if( xEntryTimeSet == pdFALSE )\r\n                {\r\n                    /* The queue was empty and a block time was specified so\r\n                     * configure the timeout structure ready to enter the blocked\r\n                     * state. */\r\n                    vTaskInternalSetTimeOutState( &xTimeOut );\r\n                    xEntryTimeSet = pdTRUE;\r\n                }\r\n                else\r\n                {\r\n                    /* Entry time was already set. */\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        /* Interrupts and other tasks can send to and receive from the queue\r\n         * now that the critical section has been exited. */\r\n\r\n        vTaskSuspendAll();\r\n        prvLockQueue( pxQueue );\r\n\r\n        /* Update the timeout state to see if it has expired yet. */\r\n        if( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE )\r\n        {\r\n            /* Timeout has not expired yet, check to see if there is data in the\r\n            * queue now, and if not enter the Blocked state to wait for data. */\r\n            if( prvIsQueueEmpty( pxQueue ) != pdFALSE )\r\n            {\r\n                traceBLOCKING_ON_QUEUE_PEEK( pxQueue );\r\n                vTaskPlaceOnEventList( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait );\r\n                prvUnlockQueue( pxQueue );\r\n\r\n                if( xTaskResumeAll() == pdFALSE )\r\n                {\r\n                    taskYIELD_WITHIN_API();\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                /* There is data in the queue now, so don't enter the blocked\r\n                 * state, instead return to try and obtain the data. */\r\n                prvUnlockQueue( pxQueue );\r\n                ( void ) xTaskResumeAll();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            /* The timeout has expired.  If there is still no data in the queue\r\n             * exit, otherwise go back and try to read the data again. */\r\n            prvUnlockQueue( pxQueue );\r\n            ( void ) xTaskResumeAll();\r\n\r\n            if( prvIsQueueEmpty( pxQueue ) != pdFALSE )\r\n            {\r\n                traceQUEUE_PEEK_FAILED( pxQueue );\r\n                traceRETURN_xQueuePeek( errQUEUE_EMPTY );\r\n\r\n                return errQUEUE_EMPTY;\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n    }\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xQueueReceiveFromISR( QueueHandle_t xQueue,\r\n                                 void * const pvBuffer,\r\n                                 BaseType_t * const pxHigherPriorityTaskWoken )\r\n{\r\n    BaseType_t xReturn;\r\n    UBaseType_t uxSavedInterruptStatus;\r\n    Queue_t * const pxQueue = xQueue;\r\n\r\n    traceENTER_xQueueReceiveFromISR( xQueue, pvBuffer, pxHigherPriorityTaskWoken );\r\n\r\n    configASSERT( pxQueue );\r\n    configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );\r\n\r\n    /* RTOS ports that support interrupt nesting have the concept of a maximum\r\n     * system call (or maximum API call) interrupt priority.  Interrupts that are\r\n     * above the maximum system call priority are kept permanently enabled, even\r\n     * when the RTOS kernel is in a critical section, but cannot make any calls to\r\n     * FreeRTOS API functions.  If configASSERT() is defined in FreeRTOSConfig.h\r\n     * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion\r\n     * failure if a FreeRTOS API function is called from an interrupt that has been\r\n     * assigned a priority above the configured maximum system call priority.\r\n     * Only FreeRTOS functions that end in FromISR can be called from interrupts\r\n     * that have been assigned a priority at or (logically) below the maximum\r\n     * system call interrupt priority.  FreeRTOS maintains a separate interrupt\r\n     * safe API to ensure interrupt entry is as fast and as simple as possible.\r\n     * More information (albeit Cortex-M specific) is provided on the following\r\n     * link: https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */\r\n    portASSERT_IF_INTERRUPT_PRIORITY_INVALID();\r\n\r\n    uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();\r\n    {\r\n        const UBaseType_t uxMessagesWaiting = pxQueue->uxMessagesWaiting;\r\n\r\n        /* Cannot block in an ISR, so check there is data available. */\r\n        if( uxMessagesWaiting > ( UBaseType_t ) 0 )\r\n        {\r\n            const int8_t cRxLock = pxQueue->cRxLock;\r\n\r\n            traceQUEUE_RECEIVE_FROM_ISR( pxQueue );\r\n\r\n            prvCopyDataFromQueue( pxQueue, pvBuffer );\r\n            pxQueue->uxMessagesWaiting = ( UBaseType_t ) ( uxMessagesWaiting - ( UBaseType_t ) 1 );\r\n\r\n            /* If the queue is locked the event list will not be modified.\r\n             * Instead update the lock count so the task that unlocks the queue\r\n             * will know that an ISR has removed data while the queue was\r\n             * locked. */\r\n            if( cRxLock == queueUNLOCKED )\r\n            {\r\n                if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )\r\n                {\r\n                    if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )\r\n                    {\r\n                        /* The task waiting has a higher priority than us so\r\n                         * force a context switch. */\r\n                        if( pxHigherPriorityTaskWoken != NULL )\r\n                        {\r\n                            *pxHigherPriorityTaskWoken = pdTRUE;\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                /* Increment the lock count so the task that unlocks the queue\r\n                 * knows that data was removed while it was locked. */\r\n                prvIncrementQueueRxLock( pxQueue, cRxLock );\r\n            }\r\n\r\n            xReturn = pdPASS;\r\n        }\r\n        else\r\n        {\r\n            xReturn = pdFAIL;\r\n            traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue );\r\n        }\r\n    }\r\n    taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );\r\n\r\n    traceRETURN_xQueueReceiveFromISR( xReturn );\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xQueuePeekFromISR( QueueHandle_t xQueue,\r\n                              void * const pvBuffer )\r\n{\r\n    BaseType_t xReturn;\r\n    UBaseType_t uxSavedInterruptStatus;\r\n    int8_t * pcOriginalReadPosition;\r\n    Queue_t * const pxQueue = xQueue;\r\n\r\n    traceENTER_xQueuePeekFromISR( xQueue, pvBuffer );\r\n\r\n    configASSERT( pxQueue );\r\n    configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( UBaseType_t ) 0U ) ) );\r\n    configASSERT( pxQueue->uxItemSize != 0 ); /* Can't peek a semaphore. */\r\n\r\n    /* RTOS ports that support interrupt nesting have the concept of a maximum\r\n     * system call (or maximum API call) interrupt priority.  Interrupts that are\r\n     * above the maximum system call priority are kept permanently enabled, even\r\n     * when the RTOS kernel is in a critical section, but cannot make any calls to\r\n     * FreeRTOS API functions.  If configASSERT() is defined in FreeRTOSConfig.h\r\n     * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion\r\n     * failure if a FreeRTOS API function is called from an interrupt that has been\r\n     * assigned a priority above the configured maximum system call priority.\r\n     * Only FreeRTOS functions that end in FromISR can be called from interrupts\r\n     * that have been assigned a priority at or (logically) below the maximum\r\n     * system call interrupt priority.  FreeRTOS maintains a separate interrupt\r\n     * safe API to ensure interrupt entry is as fast and as simple as possible.\r\n     * More information (albeit Cortex-M specific) is provided on the following\r\n     * link: https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */\r\n    portASSERT_IF_INTERRUPT_PRIORITY_INVALID();\r\n\r\n    uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();\r\n    {\r\n        /* Cannot block in an ISR, so check there is data available. */\r\n        if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 )\r\n        {\r\n            traceQUEUE_PEEK_FROM_ISR( pxQueue );\r\n\r\n            /* Remember the read position so it can be reset as nothing is\r\n             * actually being removed from the queue. */\r\n            pcOriginalReadPosition = pxQueue->u.xQueue.pcReadFrom;\r\n            prvCopyDataFromQueue( pxQueue, pvBuffer );\r\n            pxQueue->u.xQueue.pcReadFrom = pcOriginalReadPosition;\r\n\r\n            xReturn = pdPASS;\r\n        }\r\n        else\r\n        {\r\n            xReturn = pdFAIL;\r\n            traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue );\r\n        }\r\n    }\r\n    taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );\r\n\r\n    traceRETURN_xQueuePeekFromISR( xReturn );\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nUBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue )\r\n{\r\n    UBaseType_t uxReturn;\r\n\r\n    traceENTER_uxQueueMessagesWaiting( xQueue );\r\n\r\n    configASSERT( xQueue );\r\n\r\n    taskENTER_CRITICAL();\r\n    {\r\n        uxReturn = ( ( Queue_t * ) xQueue )->uxMessagesWaiting;\r\n    }\r\n    taskEXIT_CRITICAL();\r\n\r\n    traceRETURN_uxQueueMessagesWaiting( uxReturn );\r\n\r\n    return uxReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nUBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue )\r\n{\r\n    UBaseType_t uxReturn;\r\n    Queue_t * const pxQueue = xQueue;\r\n\r\n    traceENTER_uxQueueSpacesAvailable( xQueue );\r\n\r\n    configASSERT( pxQueue );\r\n\r\n    taskENTER_CRITICAL();\r\n    {\r\n        uxReturn = ( UBaseType_t ) ( pxQueue->uxLength - pxQueue->uxMessagesWaiting );\r\n    }\r\n    taskEXIT_CRITICAL();\r\n\r\n    traceRETURN_uxQueueSpacesAvailable( uxReturn );\r\n\r\n    return uxReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nUBaseType_t uxQueueMessagesWaitingFromISR( const QueueHandle_t xQueue )\r\n{\r\n    UBaseType_t uxReturn;\r\n    Queue_t * const pxQueue = xQueue;\r\n\r\n    traceENTER_uxQueueMessagesWaitingFromISR( xQueue );\r\n\r\n    configASSERT( pxQueue );\r\n    uxReturn = pxQueue->uxMessagesWaiting;\r\n\r\n    traceRETURN_uxQueueMessagesWaitingFromISR( uxReturn );\r\n\r\n    return uxReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vQueueDelete( QueueHandle_t xQueue )\r\n{\r\n    Queue_t * const pxQueue = xQueue;\r\n\r\n    traceENTER_vQueueDelete( xQueue );\r\n\r\n    configASSERT( pxQueue );\r\n    traceQUEUE_DELETE( pxQueue );\r\n\r\n    #if ( configQUEUE_REGISTRY_SIZE > 0 )\r\n    {\r\n        vQueueUnregisterQueue( pxQueue );\r\n    }\r\n    #endif\r\n\r\n    #if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) )\r\n    {\r\n        /* The queue can only have been allocated dynamically - free it\r\n         * again. */\r\n        vPortFree( pxQueue );\r\n    }\r\n    #elif ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )\r\n    {\r\n        /* The queue could have been allocated statically or dynamically, so\r\n         * check before attempting to free the memory. */\r\n        if( pxQueue->ucStaticallyAllocated == ( uint8_t ) pdFALSE )\r\n        {\r\n            vPortFree( pxQueue );\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n    #else /* if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) ) */\r\n    {\r\n        /* The queue must have been statically allocated, so is not going to be\r\n         * deleted.  Avoid compiler warnings about the unused parameter. */\r\n        ( void ) pxQueue;\r\n    }\r\n    #endif /* configSUPPORT_DYNAMIC_ALLOCATION */\r\n\r\n    traceRETURN_vQueueDelete();\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n\r\n    UBaseType_t uxQueueGetQueueNumber( QueueHandle_t xQueue )\r\n    {\r\n        traceENTER_uxQueueGetQueueNumber( xQueue );\r\n\r\n        traceRETURN_uxQueueGetQueueNumber( ( ( Queue_t * ) xQueue )->uxQueueNumber );\r\n\r\n        return ( ( Queue_t * ) xQueue )->uxQueueNumber;\r\n    }\r\n\r\n#endif /* configUSE_TRACE_FACILITY */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n\r\n    void vQueueSetQueueNumber( QueueHandle_t xQueue,\r\n                               UBaseType_t uxQueueNumber )\r\n    {\r\n        traceENTER_vQueueSetQueueNumber( xQueue, uxQueueNumber );\r\n\r\n        ( ( Queue_t * ) xQueue )->uxQueueNumber = uxQueueNumber;\r\n\r\n        traceRETURN_vQueueSetQueueNumber();\r\n    }\r\n\r\n#endif /* configUSE_TRACE_FACILITY */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n\r\n    uint8_t ucQueueGetQueueType( QueueHandle_t xQueue )\r\n    {\r\n        traceENTER_ucQueueGetQueueType( xQueue );\r\n\r\n        traceRETURN_ucQueueGetQueueType( ( ( Queue_t * ) xQueue )->ucQueueType );\r\n\r\n        return ( ( Queue_t * ) xQueue )->ucQueueType;\r\n    }\r\n\r\n#endif /* configUSE_TRACE_FACILITY */\r\n/*-----------------------------------------------------------*/\r\n\r\nUBaseType_t uxQueueGetQueueItemSize( QueueHandle_t xQueue ) /* PRIVILEGED_FUNCTION */\r\n{\r\n    traceENTER_uxQueueGetQueueItemSize( xQueue );\r\n\r\n    traceRETURN_uxQueueGetQueueItemSize( ( ( Queue_t * ) xQueue )->uxItemSize );\r\n\r\n    return ( ( Queue_t * ) xQueue )->uxItemSize;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nUBaseType_t uxQueueGetQueueLength( QueueHandle_t xQueue ) /* PRIVILEGED_FUNCTION */\r\n{\r\n    traceENTER_uxQueueGetQueueLength( xQueue );\r\n\r\n    traceRETURN_uxQueueGetQueueLength( ( ( Queue_t * ) xQueue )->uxLength );\r\n\r\n    return ( ( Queue_t * ) xQueue )->uxLength;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_MUTEXES == 1 )\r\n\r\n    static UBaseType_t prvGetDisinheritPriorityAfterTimeout( const Queue_t * const pxQueue )\r\n    {\r\n        UBaseType_t uxHighestPriorityOfWaitingTasks;\r\n\r\n        /* If a task waiting for a mutex causes the mutex holder to inherit a\r\n         * priority, but the waiting task times out, then the holder should\r\n         * disinherit the priority - but only down to the highest priority of any\r\n         * other tasks that are waiting for the same mutex.  For this purpose,\r\n         * return the priority of the highest priority task that is waiting for the\r\n         * mutex. */\r\n        if( listCURRENT_LIST_LENGTH( &( pxQueue->xTasksWaitingToReceive ) ) > 0U )\r\n        {\r\n            uxHighestPriorityOfWaitingTasks = ( UBaseType_t ) ( ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) listGET_ITEM_VALUE_OF_HEAD_ENTRY( &( pxQueue->xTasksWaitingToReceive ) ) );\r\n        }\r\n        else\r\n        {\r\n            uxHighestPriorityOfWaitingTasks = tskIDLE_PRIORITY;\r\n        }\r\n\r\n        return uxHighestPriorityOfWaitingTasks;\r\n    }\r\n\r\n#endif /* configUSE_MUTEXES */\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic BaseType_t prvCopyDataToQueue( Queue_t * const pxQueue,\r\n                                      const void * pvItemToQueue,\r\n                                      const BaseType_t xPosition )\r\n{\r\n    BaseType_t xReturn = pdFALSE;\r\n    UBaseType_t uxMessagesWaiting;\r\n\r\n    /* This function is called from a critical section. */\r\n\r\n    uxMessagesWaiting = pxQueue->uxMessagesWaiting;\r\n\r\n    if( pxQueue->uxItemSize == ( UBaseType_t ) 0 )\r\n    {\r\n        #if ( configUSE_MUTEXES == 1 )\r\n        {\r\n            if( pxQueue->uxQueueType == queueQUEUE_IS_MUTEX )\r\n            {\r\n                /* The mutex is no longer being held. */\r\n                xReturn = xTaskPriorityDisinherit( pxQueue->u.xSemaphore.xMutexHolder );\r\n                pxQueue->u.xSemaphore.xMutexHolder = NULL;\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        #endif /* configUSE_MUTEXES */\r\n    }\r\n    else if( xPosition == queueSEND_TO_BACK )\r\n    {\r\n        ( void ) memcpy( ( void * ) pxQueue->pcWriteTo, pvItemToQueue, ( size_t ) pxQueue->uxItemSize );\r\n        pxQueue->pcWriteTo += pxQueue->uxItemSize;\r\n\r\n        if( pxQueue->pcWriteTo >= pxQueue->u.xQueue.pcTail )\r\n        {\r\n            pxQueue->pcWriteTo = pxQueue->pcHead;\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n    else\r\n    {\r\n        ( void ) memcpy( ( void * ) pxQueue->u.xQueue.pcReadFrom, pvItemToQueue, ( size_t ) pxQueue->uxItemSize );\r\n        pxQueue->u.xQueue.pcReadFrom -= pxQueue->uxItemSize;\r\n\r\n        if( pxQueue->u.xQueue.pcReadFrom < pxQueue->pcHead )\r\n        {\r\n            pxQueue->u.xQueue.pcReadFrom = ( pxQueue->u.xQueue.pcTail - pxQueue->uxItemSize );\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        if( xPosition == queueOVERWRITE )\r\n        {\r\n            if( uxMessagesWaiting > ( UBaseType_t ) 0 )\r\n            {\r\n                /* An item is not being added but overwritten, so subtract\r\n                 * one from the recorded number of items in the queue so when\r\n                 * one is added again below the number of recorded items remains\r\n                 * correct. */\r\n                --uxMessagesWaiting;\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n\r\n    pxQueue->uxMessagesWaiting = ( UBaseType_t ) ( uxMessagesWaiting + ( UBaseType_t ) 1 );\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic void prvCopyDataFromQueue( Queue_t * const pxQueue,\r\n                                  void * const pvBuffer )\r\n{\r\n    if( pxQueue->uxItemSize != ( UBaseType_t ) 0 )\r\n    {\r\n        pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize;\r\n\r\n        if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail )\r\n        {\r\n            pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead;\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( size_t ) pxQueue->uxItemSize );\r\n    }\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic void prvUnlockQueue( Queue_t * const pxQueue )\r\n{\r\n    /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED. */\r\n\r\n    /* The lock counts contains the number of extra data items placed or\r\n     * removed from the queue while the queue was locked.  When a queue is\r\n     * locked items can be added or removed, but the event lists cannot be\r\n     * updated. */\r\n    taskENTER_CRITICAL();\r\n    {\r\n        int8_t cTxLock = pxQueue->cTxLock;\r\n\r\n        /* See if data was added to the queue while it was locked. */\r\n        while( cTxLock > queueLOCKED_UNMODIFIED )\r\n        {\r\n            /* Data was posted while the queue was locked.  Are any tasks\r\n             * blocked waiting for data to become available? */\r\n            #if ( configUSE_QUEUE_SETS == 1 )\r\n            {\r\n                if( pxQueue->pxQueueSetContainer != NULL )\r\n                {\r\n                    if( prvNotifyQueueSetContainer( pxQueue ) != pdFALSE )\r\n                    {\r\n                        /* The queue is a member of a queue set, and posting to\r\n                         * the queue set caused a higher priority task to unblock.\r\n                         * A context switch is required. */\r\n                        vTaskMissedYield();\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    /* Tasks that are removed from the event list will get\r\n                     * added to the pending ready list as the scheduler is still\r\n                     * suspended. */\r\n                    if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )\r\n                    {\r\n                        if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )\r\n                        {\r\n                            /* The task waiting has a higher priority so record that a\r\n                             * context switch is required. */\r\n                            vTaskMissedYield();\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n            #else /* configUSE_QUEUE_SETS */\r\n            {\r\n                /* Tasks that are removed from the event list will get added to\r\n                 * the pending ready list as the scheduler is still suspended. */\r\n                if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )\r\n                {\r\n                    if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )\r\n                    {\r\n                        /* The task waiting has a higher priority so record that\r\n                         * a context switch is required. */\r\n                        vTaskMissedYield();\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    break;\r\n                }\r\n            }\r\n            #endif /* configUSE_QUEUE_SETS */\r\n\r\n            --cTxLock;\r\n        }\r\n\r\n        pxQueue->cTxLock = queueUNLOCKED;\r\n    }\r\n    taskEXIT_CRITICAL();\r\n\r\n    /* Do the same for the Rx lock. */\r\n    taskENTER_CRITICAL();\r\n    {\r\n        int8_t cRxLock = pxQueue->cRxLock;\r\n\r\n        while( cRxLock > queueLOCKED_UNMODIFIED )\r\n        {\r\n            if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )\r\n            {\r\n                if( xTaskRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )\r\n                {\r\n                    vTaskMissedYield();\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n\r\n                --cRxLock;\r\n            }\r\n            else\r\n            {\r\n                break;\r\n            }\r\n        }\r\n\r\n        pxQueue->cRxLock = queueUNLOCKED;\r\n    }\r\n    taskEXIT_CRITICAL();\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic BaseType_t prvIsQueueEmpty( const Queue_t * pxQueue )\r\n{\r\n    BaseType_t xReturn;\r\n\r\n    taskENTER_CRITICAL();\r\n    {\r\n        if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 )\r\n        {\r\n            xReturn = pdTRUE;\r\n        }\r\n        else\r\n        {\r\n            xReturn = pdFALSE;\r\n        }\r\n    }\r\n    taskEXIT_CRITICAL();\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue )\r\n{\r\n    BaseType_t xReturn;\r\n    Queue_t * const pxQueue = xQueue;\r\n\r\n    traceENTER_xQueueIsQueueEmptyFromISR( xQueue );\r\n\r\n    configASSERT( pxQueue );\r\n\r\n    if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 )\r\n    {\r\n        xReturn = pdTRUE;\r\n    }\r\n    else\r\n    {\r\n        xReturn = pdFALSE;\r\n    }\r\n\r\n    traceRETURN_xQueueIsQueueEmptyFromISR( xReturn );\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic BaseType_t prvIsQueueFull( const Queue_t * pxQueue )\r\n{\r\n    BaseType_t xReturn;\r\n\r\n    taskENTER_CRITICAL();\r\n    {\r\n        if( pxQueue->uxMessagesWaiting == pxQueue->uxLength )\r\n        {\r\n            xReturn = pdTRUE;\r\n        }\r\n        else\r\n        {\r\n            xReturn = pdFALSE;\r\n        }\r\n    }\r\n    taskEXIT_CRITICAL();\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue )\r\n{\r\n    BaseType_t xReturn;\r\n    Queue_t * const pxQueue = xQueue;\r\n\r\n    traceENTER_xQueueIsQueueFullFromISR( xQueue );\r\n\r\n    configASSERT( pxQueue );\r\n\r\n    if( pxQueue->uxMessagesWaiting == pxQueue->uxLength )\r\n    {\r\n        xReturn = pdTRUE;\r\n    }\r\n    else\r\n    {\r\n        xReturn = pdFALSE;\r\n    }\r\n\r\n    traceRETURN_xQueueIsQueueFullFromISR( xReturn );\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_CO_ROUTINES == 1 )\r\n\r\n    BaseType_t xQueueCRSend( QueueHandle_t xQueue,\r\n                             const void * pvItemToQueue,\r\n                             TickType_t xTicksToWait )\r\n    {\r\n        BaseType_t xReturn;\r\n        Queue_t * const pxQueue = xQueue;\r\n\r\n        traceENTER_xQueueCRSend( xQueue, pvItemToQueue, xTicksToWait );\r\n\r\n        /* If the queue is already full we may have to block.  A critical section\r\n         * is required to prevent an interrupt removing something from the queue\r\n         * between the check to see if the queue is full and blocking on the queue. */\r\n        portDISABLE_INTERRUPTS();\r\n        {\r\n            if( prvIsQueueFull( pxQueue ) != pdFALSE )\r\n            {\r\n                /* The queue is full - do we want to block or just leave without\r\n                 * posting? */\r\n                if( xTicksToWait > ( TickType_t ) 0 )\r\n                {\r\n                    /* As this is called from a coroutine we cannot block directly, but\r\n                     * return indicating that we need to block. */\r\n                    vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToSend ) );\r\n                    portENABLE_INTERRUPTS();\r\n                    return errQUEUE_BLOCKED;\r\n                }\r\n                else\r\n                {\r\n                    portENABLE_INTERRUPTS();\r\n                    return errQUEUE_FULL;\r\n                }\r\n            }\r\n        }\r\n        portENABLE_INTERRUPTS();\r\n\r\n        portDISABLE_INTERRUPTS();\r\n        {\r\n            if( pxQueue->uxMessagesWaiting < pxQueue->uxLength )\r\n            {\r\n                /* There is room in the queue, copy the data into the queue. */\r\n                prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK );\r\n                xReturn = pdPASS;\r\n\r\n                /* Were any co-routines waiting for data to become available? */\r\n                if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )\r\n                {\r\n                    /* In this instance the co-routine could be placed directly\r\n                     * into the ready list as we are within a critical section.\r\n                     * Instead the same pending ready list mechanism is used as if\r\n                     * the event were caused from within an interrupt. */\r\n                    if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )\r\n                    {\r\n                        /* The co-routine waiting has a higher priority so record\r\n                         * that a yield might be appropriate. */\r\n                        xReturn = errQUEUE_YIELD;\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                xReturn = errQUEUE_FULL;\r\n            }\r\n        }\r\n        portENABLE_INTERRUPTS();\r\n\r\n        traceRETURN_xQueueCRSend( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_CO_ROUTINES */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_CO_ROUTINES == 1 )\r\n\r\n    BaseType_t xQueueCRReceive( QueueHandle_t xQueue,\r\n                                void * pvBuffer,\r\n                                TickType_t xTicksToWait )\r\n    {\r\n        BaseType_t xReturn;\r\n        Queue_t * const pxQueue = xQueue;\r\n\r\n        traceENTER_xQueueCRReceive( xQueue, pvBuffer, xTicksToWait );\r\n\r\n        /* If the queue is already empty we may have to block.  A critical section\r\n         * is required to prevent an interrupt adding something to the queue\r\n         * between the check to see if the queue is empty and blocking on the queue. */\r\n        portDISABLE_INTERRUPTS();\r\n        {\r\n            if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0 )\r\n            {\r\n                /* There are no messages in the queue, do we want to block or just\r\n                 * leave with nothing? */\r\n                if( xTicksToWait > ( TickType_t ) 0 )\r\n                {\r\n                    /* As this is a co-routine we cannot block directly, but return\r\n                     * indicating that we need to block. */\r\n                    vCoRoutineAddToDelayedList( xTicksToWait, &( pxQueue->xTasksWaitingToReceive ) );\r\n                    portENABLE_INTERRUPTS();\r\n                    return errQUEUE_BLOCKED;\r\n                }\r\n                else\r\n                {\r\n                    portENABLE_INTERRUPTS();\r\n                    return errQUEUE_FULL;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        portENABLE_INTERRUPTS();\r\n\r\n        portDISABLE_INTERRUPTS();\r\n        {\r\n            if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 )\r\n            {\r\n                /* Data is available from the queue. */\r\n                pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize;\r\n\r\n                if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail )\r\n                {\r\n                    pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead;\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n\r\n                --( pxQueue->uxMessagesWaiting );\r\n                ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( unsigned ) pxQueue->uxItemSize );\r\n\r\n                xReturn = pdPASS;\r\n\r\n                /* Were any co-routines waiting for space to become available? */\r\n                if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )\r\n                {\r\n                    /* In this instance the co-routine could be placed directly\r\n                     * into the ready list as we are within a critical section.\r\n                     * Instead the same pending ready list mechanism is used as if\r\n                     * the event were caused from within an interrupt. */\r\n                    if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )\r\n                    {\r\n                        xReturn = errQUEUE_YIELD;\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                xReturn = pdFAIL;\r\n            }\r\n        }\r\n        portENABLE_INTERRUPTS();\r\n\r\n        traceRETURN_xQueueCRReceive( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_CO_ROUTINES */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_CO_ROUTINES == 1 )\r\n\r\n    BaseType_t xQueueCRSendFromISR( QueueHandle_t xQueue,\r\n                                    const void * pvItemToQueue,\r\n                                    BaseType_t xCoRoutinePreviouslyWoken )\r\n    {\r\n        Queue_t * const pxQueue = xQueue;\r\n\r\n        traceENTER_xQueueCRSendFromISR( xQueue, pvItemToQueue, xCoRoutinePreviouslyWoken );\r\n\r\n        /* Cannot block within an ISR so if there is no space on the queue then\r\n         * exit without doing anything. */\r\n        if( pxQueue->uxMessagesWaiting < pxQueue->uxLength )\r\n        {\r\n            prvCopyDataToQueue( pxQueue, pvItemToQueue, queueSEND_TO_BACK );\r\n\r\n            /* We only want to wake one co-routine per ISR, so check that a\r\n             * co-routine has not already been woken. */\r\n            if( xCoRoutinePreviouslyWoken == pdFALSE )\r\n            {\r\n                if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToReceive ) ) == pdFALSE )\r\n                {\r\n                    if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToReceive ) ) != pdFALSE )\r\n                    {\r\n                        return pdTRUE;\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_xQueueCRSendFromISR( xCoRoutinePreviouslyWoken );\r\n\r\n        return xCoRoutinePreviouslyWoken;\r\n    }\r\n\r\n#endif /* configUSE_CO_ROUTINES */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_CO_ROUTINES == 1 )\r\n\r\n    BaseType_t xQueueCRReceiveFromISR( QueueHandle_t xQueue,\r\n                                       void * pvBuffer,\r\n                                       BaseType_t * pxCoRoutineWoken )\r\n    {\r\n        BaseType_t xReturn;\r\n        Queue_t * const pxQueue = xQueue;\r\n\r\n        traceENTER_xQueueCRReceiveFromISR( xQueue, pvBuffer, pxCoRoutineWoken );\r\n\r\n        /* We cannot block from an ISR, so check there is data available. If\r\n         * not then just leave without doing anything. */\r\n        if( pxQueue->uxMessagesWaiting > ( UBaseType_t ) 0 )\r\n        {\r\n            /* Copy the data from the queue. */\r\n            pxQueue->u.xQueue.pcReadFrom += pxQueue->uxItemSize;\r\n\r\n            if( pxQueue->u.xQueue.pcReadFrom >= pxQueue->u.xQueue.pcTail )\r\n            {\r\n                pxQueue->u.xQueue.pcReadFrom = pxQueue->pcHead;\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n\r\n            --( pxQueue->uxMessagesWaiting );\r\n            ( void ) memcpy( ( void * ) pvBuffer, ( void * ) pxQueue->u.xQueue.pcReadFrom, ( unsigned ) pxQueue->uxItemSize );\r\n\r\n            if( ( *pxCoRoutineWoken ) == pdFALSE )\r\n            {\r\n                if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )\r\n                {\r\n                    if( xCoRoutineRemoveFromEventList( &( pxQueue->xTasksWaitingToSend ) ) != pdFALSE )\r\n                    {\r\n                        *pxCoRoutineWoken = pdTRUE;\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n\r\n            xReturn = pdPASS;\r\n        }\r\n        else\r\n        {\r\n            xReturn = pdFAIL;\r\n        }\r\n\r\n        traceRETURN_xQueueCRReceiveFromISR( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_CO_ROUTINES */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configQUEUE_REGISTRY_SIZE > 0 )\r\n\r\n    void vQueueAddToRegistry( QueueHandle_t xQueue,\r\n                              const char * pcQueueName )\r\n    {\r\n        UBaseType_t ux;\r\n        QueueRegistryItem_t * pxEntryToWrite = NULL;\r\n\r\n        traceENTER_vQueueAddToRegistry( xQueue, pcQueueName );\r\n\r\n        configASSERT( xQueue );\r\n\r\n        if( pcQueueName != NULL )\r\n        {\r\n            /* See if there is an empty space in the registry.  A NULL name denotes\r\n             * a free slot. */\r\n            for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ )\r\n            {\r\n                /* Replace an existing entry if the queue is already in the registry. */\r\n                if( xQueue == xQueueRegistry[ ux ].xHandle )\r\n                {\r\n                    pxEntryToWrite = &( xQueueRegistry[ ux ] );\r\n                    break;\r\n                }\r\n                /* Otherwise, store in the next empty location */\r\n                else if( ( pxEntryToWrite == NULL ) && ( xQueueRegistry[ ux ].pcQueueName == NULL ) )\r\n                {\r\n                    pxEntryToWrite = &( xQueueRegistry[ ux ] );\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n        }\r\n\r\n        if( pxEntryToWrite != NULL )\r\n        {\r\n            /* Store the information on this queue. */\r\n            pxEntryToWrite->pcQueueName = pcQueueName;\r\n            pxEntryToWrite->xHandle = xQueue;\r\n\r\n            traceQUEUE_REGISTRY_ADD( xQueue, pcQueueName );\r\n        }\r\n\r\n        traceRETURN_vQueueAddToRegistry();\r\n    }\r\n\r\n#endif /* configQUEUE_REGISTRY_SIZE */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configQUEUE_REGISTRY_SIZE > 0 )\r\n\r\n    const char * pcQueueGetName( QueueHandle_t xQueue )\r\n    {\r\n        UBaseType_t ux;\r\n        const char * pcReturn = NULL;\r\n\r\n        traceENTER_pcQueueGetName( xQueue );\r\n\r\n        configASSERT( xQueue );\r\n\r\n        /* Note there is nothing here to protect against another task adding or\r\n         * removing entries from the registry while it is being searched. */\r\n\r\n        for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ )\r\n        {\r\n            if( xQueueRegistry[ ux ].xHandle == xQueue )\r\n            {\r\n                pcReturn = xQueueRegistry[ ux ].pcQueueName;\r\n                break;\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n\r\n        traceRETURN_pcQueueGetName( pcReturn );\r\n\r\n        return pcReturn;\r\n    }\r\n\r\n#endif /* configQUEUE_REGISTRY_SIZE */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configQUEUE_REGISTRY_SIZE > 0 )\r\n\r\n    void vQueueUnregisterQueue( QueueHandle_t xQueue )\r\n    {\r\n        UBaseType_t ux;\r\n\r\n        traceENTER_vQueueUnregisterQueue( xQueue );\r\n\r\n        configASSERT( xQueue );\r\n\r\n        /* See if the handle of the queue being unregistered in actually in the\r\n         * registry. */\r\n        for( ux = ( UBaseType_t ) 0U; ux < ( UBaseType_t ) configQUEUE_REGISTRY_SIZE; ux++ )\r\n        {\r\n            if( xQueueRegistry[ ux ].xHandle == xQueue )\r\n            {\r\n                /* Set the name to NULL to show that this slot if free again. */\r\n                xQueueRegistry[ ux ].pcQueueName = NULL;\r\n\r\n                /* Set the handle to NULL to ensure the same queue handle cannot\r\n                 * appear in the registry twice if it is added, removed, then\r\n                 * added again. */\r\n                xQueueRegistry[ ux ].xHandle = ( QueueHandle_t ) 0;\r\n                break;\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n\r\n        traceRETURN_vQueueUnregisterQueue();\r\n    }\r\n\r\n#endif /* configQUEUE_REGISTRY_SIZE */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TIMERS == 1 )\r\n\r\n    void vQueueWaitForMessageRestricted( QueueHandle_t xQueue,\r\n                                         TickType_t xTicksToWait,\r\n                                         const BaseType_t xWaitIndefinitely )\r\n    {\r\n        Queue_t * const pxQueue = xQueue;\r\n\r\n        traceENTER_vQueueWaitForMessageRestricted( xQueue, xTicksToWait, xWaitIndefinitely );\r\n\r\n        /* This function should not be called by application code hence the\r\n         * 'Restricted' in its name.  It is not part of the public API.  It is\r\n         * designed for use by kernel code, and has special calling requirements.\r\n         * It can result in vListInsert() being called on a list that can only\r\n         * possibly ever have one item in it, so the list will be fast, but even\r\n         * so it should be called with the scheduler locked and not from a critical\r\n         * section. */\r\n\r\n        /* Only do anything if there are no messages in the queue.  This function\r\n         *  will not actually cause the task to block, just place it on a blocked\r\n         *  list.  It will not block until the scheduler is unlocked - at which\r\n         *  time a yield will be performed.  If an item is added to the queue while\r\n         *  the queue is locked, and the calling task blocks on the queue, then the\r\n         *  calling task will be immediately unblocked when the queue is unlocked. */\r\n        prvLockQueue( pxQueue );\r\n\r\n        if( pxQueue->uxMessagesWaiting == ( UBaseType_t ) 0U )\r\n        {\r\n            /* There is nothing in the queue, block for the specified period. */\r\n            vTaskPlaceOnEventListRestricted( &( pxQueue->xTasksWaitingToReceive ), xTicksToWait, xWaitIndefinitely );\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        prvUnlockQueue( pxQueue );\r\n\r\n        traceRETURN_vQueueWaitForMessageRestricted();\r\n    }\r\n\r\n#endif /* configUSE_TIMERS */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configUSE_QUEUE_SETS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )\r\n\r\n    QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength )\r\n    {\r\n        QueueSetHandle_t pxQueue;\r\n\r\n        traceENTER_xQueueCreateSet( uxEventQueueLength );\r\n\r\n        pxQueue = xQueueGenericCreate( uxEventQueueLength, ( UBaseType_t ) sizeof( Queue_t * ), queueQUEUE_TYPE_SET );\r\n\r\n        traceRETURN_xQueueCreateSet( pxQueue );\r\n\r\n        return pxQueue;\r\n    }\r\n\r\n#endif /* configUSE_QUEUE_SETS */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_QUEUE_SETS == 1 )\r\n\r\n    BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore,\r\n                               QueueSetHandle_t xQueueSet )\r\n    {\r\n        BaseType_t xReturn;\r\n\r\n        traceENTER_xQueueAddToSet( xQueueOrSemaphore, xQueueSet );\r\n\r\n        taskENTER_CRITICAL();\r\n        {\r\n            if( ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer != NULL )\r\n            {\r\n                /* Cannot add a queue/semaphore to more than one queue set. */\r\n                xReturn = pdFAIL;\r\n            }\r\n            else if( ( ( Queue_t * ) xQueueOrSemaphore )->uxMessagesWaiting != ( UBaseType_t ) 0 )\r\n            {\r\n                /* Cannot add a queue/semaphore to a queue set if there are already\r\n                 * items in the queue/semaphore. */\r\n                xReturn = pdFAIL;\r\n            }\r\n            else\r\n            {\r\n                ( ( Queue_t * ) xQueueOrSemaphore )->pxQueueSetContainer = xQueueSet;\r\n                xReturn = pdPASS;\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_xQueueAddToSet( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_QUEUE_SETS */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_QUEUE_SETS == 1 )\r\n\r\n    BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore,\r\n                                    QueueSetHandle_t xQueueSet )\r\n    {\r\n        BaseType_t xReturn;\r\n        Queue_t * const pxQueueOrSemaphore = ( Queue_t * ) xQueueOrSemaphore;\r\n\r\n        traceENTER_xQueueRemoveFromSet( xQueueOrSemaphore, xQueueSet );\r\n\r\n        if( pxQueueOrSemaphore->pxQueueSetContainer != xQueueSet )\r\n        {\r\n            /* The queue was not a member of the set. */\r\n            xReturn = pdFAIL;\r\n        }\r\n        else if( pxQueueOrSemaphore->uxMessagesWaiting != ( UBaseType_t ) 0 )\r\n        {\r\n            /* It is dangerous to remove a queue from a set when the queue is\r\n             * not empty because the queue set will still hold pending events for\r\n             * the queue. */\r\n            xReturn = pdFAIL;\r\n        }\r\n        else\r\n        {\r\n            taskENTER_CRITICAL();\r\n            {\r\n                /* The queue is no longer contained in the set. */\r\n                pxQueueOrSemaphore->pxQueueSetContainer = NULL;\r\n            }\r\n            taskEXIT_CRITICAL();\r\n            xReturn = pdPASS;\r\n        }\r\n\r\n        traceRETURN_xQueueRemoveFromSet( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_QUEUE_SETS */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_QUEUE_SETS == 1 )\r\n\r\n    QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet,\r\n                                                TickType_t const xTicksToWait )\r\n    {\r\n        QueueSetMemberHandle_t xReturn = NULL;\r\n\r\n        traceENTER_xQueueSelectFromSet( xQueueSet, xTicksToWait );\r\n\r\n        ( void ) xQueueReceive( ( QueueHandle_t ) xQueueSet, &xReturn, xTicksToWait );\r\n\r\n        traceRETURN_xQueueSelectFromSet( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_QUEUE_SETS */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_QUEUE_SETS == 1 )\r\n\r\n    QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet )\r\n    {\r\n        QueueSetMemberHandle_t xReturn = NULL;\r\n\r\n        traceENTER_xQueueSelectFromSetFromISR( xQueueSet );\r\n\r\n        ( void ) xQueueReceiveFromISR( ( QueueHandle_t ) xQueueSet, &xReturn, NULL );\r\n\r\n        traceRETURN_xQueueSelectFromSetFromISR( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_QUEUE_SETS */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_QUEUE_SETS == 1 )\r\n\r\n    static BaseType_t prvNotifyQueueSetContainer( const Queue_t * const pxQueue )\r\n    {\r\n        Queue_t * pxQueueSetContainer = pxQueue->pxQueueSetContainer;\r\n        BaseType_t xReturn = pdFALSE;\r\n\r\n        /* This function must be called form a critical section. */\r\n\r\n        /* The following line is not reachable in unit tests because every call\r\n         * to prvNotifyQueueSetContainer is preceded by a check that\r\n         * pxQueueSetContainer != NULL */\r\n        configASSERT( pxQueueSetContainer ); /* LCOV_EXCL_BR_LINE */\r\n        configASSERT( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength );\r\n\r\n        if( pxQueueSetContainer->uxMessagesWaiting < pxQueueSetContainer->uxLength )\r\n        {\r\n            const int8_t cTxLock = pxQueueSetContainer->cTxLock;\r\n\r\n            traceQUEUE_SET_SEND( pxQueueSetContainer );\r\n\r\n            /* The data copied is the handle of the queue that contains data. */\r\n            xReturn = prvCopyDataToQueue( pxQueueSetContainer, &pxQueue, queueSEND_TO_BACK );\r\n\r\n            if( cTxLock == queueUNLOCKED )\r\n            {\r\n                if( listLIST_IS_EMPTY( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) == pdFALSE )\r\n                {\r\n                    if( xTaskRemoveFromEventList( &( pxQueueSetContainer->xTasksWaitingToReceive ) ) != pdFALSE )\r\n                    {\r\n                        /* The task waiting has a higher priority. */\r\n                        xReturn = pdTRUE;\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                prvIncrementQueueTxLock( pxQueueSetContainer, cTxLock );\r\n            }\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_QUEUE_SETS */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/stream_buffer.c",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n/* Standard includes. */\r\n#include <string.h>\r\n\r\n/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining\r\n * all the API functions to use the MPU wrappers.  That should only be done when\r\n * task.h is included from an application file. */\r\n#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n/* FreeRTOS includes. */\r\n#include \"FreeRTOS.h\"\r\n#include \"task.h\"\r\n#include \"stream_buffer.h\"\r\n\r\n#if ( configUSE_TASK_NOTIFICATIONS != 1 )\r\n    #error configUSE_TASK_NOTIFICATIONS must be set to 1 to build stream_buffer.c\r\n#endif\r\n\r\n#if ( INCLUDE_xTaskGetCurrentTaskHandle != 1 )\r\n    #error INCLUDE_xTaskGetCurrentTaskHandle must be set to 1 to build stream_buffer.c\r\n#endif\r\n\r\n/* The MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined\r\n * for the header files above, but not in this file, in order to generate the\r\n * correct privileged Vs unprivileged linkage and placement. */\r\n#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n/* If the user has not provided application specific Rx notification macros,\r\n * or #defined the notification macros away, then provide default implementations\r\n * that uses task notifications. */\r\n#ifndef sbRECEIVE_COMPLETED\r\n    #define sbRECEIVE_COMPLETED( pxStreamBuffer )                             \\\r\n    do                                                                        \\\r\n    {                                                                         \\\r\n        vTaskSuspendAll();                                                    \\\r\n        {                                                                     \\\r\n            if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL )              \\\r\n            {                                                                 \\\r\n                ( void ) xTaskNotify( ( pxStreamBuffer )->xTaskWaitingToSend, \\\r\n                                      ( uint32_t ) 0,                         \\\r\n                                      eNoAction );                            \\\r\n                ( pxStreamBuffer )->xTaskWaitingToSend = NULL;                \\\r\n            }                                                                 \\\r\n        }                                                                     \\\r\n        ( void ) xTaskResumeAll();                                            \\\r\n    } while( 0 )\r\n#endif /* sbRECEIVE_COMPLETED */\r\n\r\n/* If user has provided a per-instance receive complete callback, then\r\n * invoke the callback else use the receive complete macro which is provided by default for all instances.\r\n */\r\n#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )\r\n    #define prvRECEIVE_COMPLETED( pxStreamBuffer )                                               \\\r\n    do {                                                                                         \\\r\n        if( ( pxStreamBuffer )->pxReceiveCompletedCallback != NULL )                             \\\r\n        {                                                                                        \\\r\n            ( pxStreamBuffer )->pxReceiveCompletedCallback( ( pxStreamBuffer ), pdFALSE, NULL ); \\\r\n        }                                                                                        \\\r\n        else                                                                                     \\\r\n        {                                                                                        \\\r\n            sbRECEIVE_COMPLETED( ( pxStreamBuffer ) );                                           \\\r\n        }                                                                                        \\\r\n    } while( 0 )\r\n#else /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */\r\n    #define prvRECEIVE_COMPLETED( pxStreamBuffer )    sbRECEIVE_COMPLETED( ( pxStreamBuffer ) )\r\n#endif /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */\r\n\r\n#ifndef sbRECEIVE_COMPLETED_FROM_ISR\r\n    #define sbRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer,                            \\\r\n                                          pxHigherPriorityTaskWoken )                \\\r\n    do {                                                                             \\\r\n        UBaseType_t uxSavedInterruptStatus;                                          \\\r\n                                                                                     \\\r\n        uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();                      \\\r\n        {                                                                            \\\r\n            if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL )                     \\\r\n            {                                                                        \\\r\n                ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToSend, \\\r\n                                             ( uint32_t ) 0,                         \\\r\n                                             eNoAction,                              \\\r\n                                             ( pxHigherPriorityTaskWoken ) );        \\\r\n                ( pxStreamBuffer )->xTaskWaitingToSend = NULL;                       \\\r\n            }                                                                        \\\r\n        }                                                                            \\\r\n        taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );                        \\\r\n    } while( 0 )\r\n#endif /* sbRECEIVE_COMPLETED_FROM_ISR */\r\n\r\n#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )\r\n    #define prvRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer,                                                               \\\r\n                                           pxHigherPriorityTaskWoken )                                                   \\\r\n    do {                                                                                                                 \\\r\n        if( ( pxStreamBuffer )->pxReceiveCompletedCallback != NULL )                                                     \\\r\n        {                                                                                                                \\\r\n            ( pxStreamBuffer )->pxReceiveCompletedCallback( ( pxStreamBuffer ), pdTRUE, ( pxHigherPriorityTaskWoken ) ); \\\r\n        }                                                                                                                \\\r\n        else                                                                                                             \\\r\n        {                                                                                                                \\\r\n            sbRECEIVE_COMPLETED_FROM_ISR( ( pxStreamBuffer ), ( pxHigherPriorityTaskWoken ) );                           \\\r\n        }                                                                                                                \\\r\n    } while( 0 )\r\n#else /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */\r\n    #define prvRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ) \\\r\n    sbRECEIVE_COMPLETED_FROM_ISR( ( pxStreamBuffer ), ( pxHigherPriorityTaskWoken ) )\r\n#endif /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */\r\n\r\n/* If the user has not provided an application specific Tx notification macro,\r\n * or #defined the notification macro away, then provide a default\r\n * implementation that uses task notifications.\r\n */\r\n#ifndef sbSEND_COMPLETED\r\n    #define sbSEND_COMPLETED( pxStreamBuffer )                               \\\r\n    vTaskSuspendAll();                                                       \\\r\n    {                                                                        \\\r\n        if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL )              \\\r\n        {                                                                    \\\r\n            ( void ) xTaskNotify( ( pxStreamBuffer )->xTaskWaitingToReceive, \\\r\n                                  ( uint32_t ) 0,                            \\\r\n                                  eNoAction );                               \\\r\n            ( pxStreamBuffer )->xTaskWaitingToReceive = NULL;                \\\r\n        }                                                                    \\\r\n    }                                                                        \\\r\n    ( void ) xTaskResumeAll()\r\n#endif /* sbSEND_COMPLETED */\r\n\r\n/* If user has provided a per-instance send completed callback, then\r\n * invoke the callback else use the send complete macro which is provided by default for all instances.\r\n */\r\n#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )\r\n    #define prvSEND_COMPLETED( pxStreamBuffer )                                               \\\r\n    do {                                                                                      \\\r\n        if( ( pxStreamBuffer )->pxSendCompletedCallback != NULL )                             \\\r\n        {                                                                                     \\\r\n            ( pxStreamBuffer )->pxSendCompletedCallback( ( pxStreamBuffer ), pdFALSE, NULL ); \\\r\n        }                                                                                     \\\r\n        else                                                                                  \\\r\n        {                                                                                     \\\r\n            sbSEND_COMPLETED( ( pxStreamBuffer ) );                                           \\\r\n        }                                                                                     \\\r\n    } while( 0 )\r\n#else /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */\r\n    #define prvSEND_COMPLETED( pxStreamBuffer )    sbSEND_COMPLETED( ( pxStreamBuffer ) )\r\n#endif /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */\r\n\r\n\r\n#ifndef sbSEND_COMPLETE_FROM_ISR\r\n    #define sbSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken )       \\\r\n    do {                                                                                \\\r\n        UBaseType_t uxSavedInterruptStatus;                                             \\\r\n                                                                                        \\\r\n        uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();                         \\\r\n        {                                                                               \\\r\n            if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL )                     \\\r\n            {                                                                           \\\r\n                ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToReceive, \\\r\n                                             ( uint32_t ) 0,                            \\\r\n                                             eNoAction,                                 \\\r\n                                             ( pxHigherPriorityTaskWoken ) );           \\\r\n                ( pxStreamBuffer )->xTaskWaitingToReceive = NULL;                       \\\r\n            }                                                                           \\\r\n        }                                                                               \\\r\n        taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );                           \\\r\n    } while( 0 )\r\n#endif /* sbSEND_COMPLETE_FROM_ISR */\r\n\r\n\r\n#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )\r\n    #define prvSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken )                                    \\\r\n    do {                                                                                                              \\\r\n        if( ( pxStreamBuffer )->pxSendCompletedCallback != NULL )                                                     \\\r\n        {                                                                                                             \\\r\n            ( pxStreamBuffer )->pxSendCompletedCallback( ( pxStreamBuffer ), pdTRUE, ( pxHigherPriorityTaskWoken ) ); \\\r\n        }                                                                                                             \\\r\n        else                                                                                                          \\\r\n        {                                                                                                             \\\r\n            sbSEND_COMPLETE_FROM_ISR( ( pxStreamBuffer ), ( pxHigherPriorityTaskWoken ) );                            \\\r\n        }                                                                                                             \\\r\n    } while( 0 )\r\n#else /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */\r\n    #define prvSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ) \\\r\n    sbSEND_COMPLETE_FROM_ISR( ( pxStreamBuffer ), ( pxHigherPriorityTaskWoken ) )\r\n#endif /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */\r\n\r\n/* The number of bytes used to hold the length of a message in the buffer. */\r\n#define sbBYTES_TO_STORE_MESSAGE_LENGTH    ( sizeof( configMESSAGE_BUFFER_LENGTH_TYPE ) )\r\n\r\n/* Bits stored in the ucFlags field of the stream buffer. */\r\n#define sbFLAGS_IS_MESSAGE_BUFFER          ( ( uint8_t ) 1 ) /* Set if the stream buffer was created as a message buffer, in which case it holds discrete messages rather than a stream. */\r\n#define sbFLAGS_IS_STATICALLY_ALLOCATED    ( ( uint8_t ) 2 ) /* Set if the stream buffer was created using statically allocated memory. */\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n/* Structure that hold state information on the buffer. */\r\ntypedef struct StreamBufferDef_t\r\n{\r\n    volatile size_t xTail;                       /* Index to the next item to read within the buffer. */\r\n    volatile size_t xHead;                       /* Index to the next item to write within the buffer. */\r\n    size_t xLength;                              /* The length of the buffer pointed to by pucBuffer. */\r\n    size_t xTriggerLevelBytes;                   /* The number of bytes that must be in the stream buffer before a task that is waiting for data is unblocked. */\r\n    volatile TaskHandle_t xTaskWaitingToReceive; /* Holds the handle of a task waiting for data, or NULL if no tasks are waiting. */\r\n    volatile TaskHandle_t xTaskWaitingToSend;    /* Holds the handle of a task waiting to send data to a message buffer that is full. */\r\n    uint8_t * pucBuffer;                         /* Points to the buffer itself - that is - the RAM that stores the data passed through the buffer. */\r\n    uint8_t ucFlags;\r\n\r\n    #if ( configUSE_TRACE_FACILITY == 1 )\r\n        UBaseType_t uxStreamBufferNumber; /* Used for tracing purposes. */\r\n    #endif\r\n\r\n    #if ( configUSE_SB_COMPLETED_CALLBACK == 1 )\r\n        StreamBufferCallbackFunction_t pxSendCompletedCallback;    /* Optional callback called on send complete. sbSEND_COMPLETED is called if this is NULL. */\r\n        StreamBufferCallbackFunction_t pxReceiveCompletedCallback; /* Optional callback called on receive complete.  sbRECEIVE_COMPLETED is called if this is NULL. */\r\n    #endif\r\n} StreamBuffer_t;\r\n\r\n/*\r\n * The number of bytes available to be read from the buffer.\r\n */\r\nstatic size_t prvBytesInBuffer( const StreamBuffer_t * const pxStreamBuffer ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Add xCount bytes from pucData into the pxStreamBuffer's data storage area.\r\n * This function does not update the buffer's xHead pointer, so multiple writes\r\n * may be chained together \"atomically\". This is useful for Message Buffers where\r\n * the length and data bytes are written in two separate chunks, and we don't want\r\n * the reader to see the buffer as having grown until after all data is copied over.\r\n * This function takes a custom xHead value to indicate where to write to (necessary\r\n * for chaining) and returns the the resulting xHead position.\r\n * To mark the write as complete, manually set the buffer's xHead field with the\r\n * returned xHead from this function.\r\n */\r\nstatic size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer,\r\n                                     const uint8_t * pucData,\r\n                                     size_t xCount,\r\n                                     size_t xHead ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * If the stream buffer is being used as a message buffer, then reads an entire\r\n * message out of the buffer.  If the stream buffer is being used as a stream\r\n * buffer then read as many bytes as possible from the buffer.\r\n * prvReadBytesFromBuffer() is called to actually extract the bytes from the\r\n * buffer's data storage area.\r\n */\r\nstatic size_t prvReadMessageFromBuffer( StreamBuffer_t * pxStreamBuffer,\r\n                                        void * pvRxData,\r\n                                        size_t xBufferLengthBytes,\r\n                                        size_t xBytesAvailable ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * If the stream buffer is being used as a message buffer, then writes an entire\r\n * message to the buffer.  If the stream buffer is being used as a stream\r\n * buffer then write as many bytes as possible to the buffer.\r\n * prvWriteBytestoBuffer() is called to actually send the bytes to the buffer's\r\n * data storage area.\r\n */\r\nstatic size_t prvWriteMessageToBuffer( StreamBuffer_t * const pxStreamBuffer,\r\n                                       const void * pvTxData,\r\n                                       size_t xDataLengthBytes,\r\n                                       size_t xSpace,\r\n                                       size_t xRequiredSpace ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Copies xCount bytes from the pxStreamBuffer's data storage area to pucData.\r\n * This function does not update the buffer's xTail pointer, so multiple reads\r\n * may be chained together \"atomically\". This is useful for Message Buffers where\r\n * the length and data bytes are read in two separate chunks, and we don't want\r\n * the writer to see the buffer as having more free space until after all data is\r\n * copied over, especially if we have to abort the read due to insufficient receiving space.\r\n * This function takes a custom xTail value to indicate where to read from (necessary\r\n * for chaining) and returns the the resulting xTail position.\r\n * To mark the read as complete, manually set the buffer's xTail field with the\r\n * returned xTail from this function.\r\n */\r\nstatic size_t prvReadBytesFromBuffer( StreamBuffer_t * pxStreamBuffer,\r\n                                      uint8_t * pucData,\r\n                                      size_t xCount,\r\n                                      size_t xTail ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Called by both pxStreamBufferCreate() and pxStreamBufferCreateStatic() to\r\n * initialise the members of the newly created stream buffer structure.\r\n */\r\nstatic void prvInitialiseNewStreamBuffer( StreamBuffer_t * const pxStreamBuffer,\r\n                                          uint8_t * const pucBuffer,\r\n                                          size_t xBufferSizeBytes,\r\n                                          size_t xTriggerLevelBytes,\r\n                                          uint8_t ucFlags,\r\n                                          StreamBufferCallbackFunction_t pxSendCompletedCallback,\r\n                                          StreamBufferCallbackFunction_t pxReceiveCompletedCallback ) PRIVILEGED_FUNCTION;\r\n\r\n/*-----------------------------------------------------------*/\r\n#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r\n    StreamBufferHandle_t xStreamBufferGenericCreate( size_t xBufferSizeBytes,\r\n                                                     size_t xTriggerLevelBytes,\r\n                                                     BaseType_t xIsMessageBuffer,\r\n                                                     StreamBufferCallbackFunction_t pxSendCompletedCallback,\r\n                                                     StreamBufferCallbackFunction_t pxReceiveCompletedCallback )\r\n    {\r\n        void * pvAllocatedMemory;\r\n        uint8_t ucFlags;\r\n\r\n        traceENTER_xStreamBufferGenericCreate( xBufferSizeBytes, xTriggerLevelBytes, xIsMessageBuffer, pxSendCompletedCallback, pxReceiveCompletedCallback );\r\n\r\n        /* In case the stream buffer is going to be used as a message buffer\r\n         * (that is, it will hold discrete messages with a little meta data that\r\n         * says how big the next message is) check the buffer will be large enough\r\n         * to hold at least one message. */\r\n        if( xIsMessageBuffer == pdTRUE )\r\n        {\r\n            /* Is a message buffer but not statically allocated. */\r\n            ucFlags = sbFLAGS_IS_MESSAGE_BUFFER;\r\n            configASSERT( xBufferSizeBytes > sbBYTES_TO_STORE_MESSAGE_LENGTH );\r\n        }\r\n        else\r\n        {\r\n            /* Not a message buffer and not statically allocated. */\r\n            ucFlags = 0;\r\n            configASSERT( xBufferSizeBytes > 0 );\r\n        }\r\n\r\n        configASSERT( xTriggerLevelBytes <= xBufferSizeBytes );\r\n\r\n        /* A trigger level of 0 would cause a waiting task to unblock even when\r\n         * the buffer was empty. */\r\n        if( xTriggerLevelBytes == ( size_t ) 0 )\r\n        {\r\n            xTriggerLevelBytes = ( size_t ) 1;\r\n        }\r\n\r\n        /* A stream buffer requires a StreamBuffer_t structure and a buffer.\r\n         * Both are allocated in a single call to pvPortMalloc().  The\r\n         * StreamBuffer_t structure is placed at the start of the allocated memory\r\n         * and the buffer follows immediately after.  The requested size is\r\n         * incremented so the free space is returned as the user would expect -\r\n         * this is a quirk of the implementation that means otherwise the free\r\n         * space would be reported as one byte smaller than would be logically\r\n         * expected. */\r\n        if( xBufferSizeBytes < ( xBufferSizeBytes + 1U + sizeof( StreamBuffer_t ) ) )\r\n        {\r\n            xBufferSizeBytes++;\r\n            pvAllocatedMemory = pvPortMalloc( xBufferSizeBytes + sizeof( StreamBuffer_t ) );\r\n        }\r\n        else\r\n        {\r\n            pvAllocatedMemory = NULL;\r\n        }\r\n\r\n        if( pvAllocatedMemory != NULL )\r\n        {\r\n            /* MISRA Ref 11.5.1 [Malloc memory assignment] */\r\n            /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n            /* coverity[misra_c_2012_rule_11_5_violation] */\r\n            prvInitialiseNewStreamBuffer( ( StreamBuffer_t * ) pvAllocatedMemory,                         /* Structure at the start of the allocated memory. */\r\n                                                                                                          /* MISRA Ref 11.5.1 [Malloc memory assignment] */\r\n                                                                                                          /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n                                                                                                          /* coverity[misra_c_2012_rule_11_5_violation] */\r\n                                          ( ( uint8_t * ) pvAllocatedMemory ) + sizeof( StreamBuffer_t ), /* Storage area follows. */\r\n                                          xBufferSizeBytes,\r\n                                          xTriggerLevelBytes,\r\n                                          ucFlags,\r\n                                          pxSendCompletedCallback,\r\n                                          pxReceiveCompletedCallback );\r\n\r\n            traceSTREAM_BUFFER_CREATE( ( ( StreamBuffer_t * ) pvAllocatedMemory ), xIsMessageBuffer );\r\n        }\r\n        else\r\n        {\r\n            traceSTREAM_BUFFER_CREATE_FAILED( xIsMessageBuffer );\r\n        }\r\n\r\n        traceRETURN_xStreamBufferGenericCreate( pvAllocatedMemory );\r\n\r\n        /* MISRA Ref 11.5.1 [Malloc memory assignment] */\r\n        /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n        /* coverity[misra_c_2012_rule_11_5_violation] */\r\n        return ( StreamBufferHandle_t ) pvAllocatedMemory;\r\n    }\r\n#endif /* configSUPPORT_DYNAMIC_ALLOCATION */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n\r\n    StreamBufferHandle_t xStreamBufferGenericCreateStatic( size_t xBufferSizeBytes,\r\n                                                           size_t xTriggerLevelBytes,\r\n                                                           BaseType_t xIsMessageBuffer,\r\n                                                           uint8_t * const pucStreamBufferStorageArea,\r\n                                                           StaticStreamBuffer_t * const pxStaticStreamBuffer,\r\n                                                           StreamBufferCallbackFunction_t pxSendCompletedCallback,\r\n                                                           StreamBufferCallbackFunction_t pxReceiveCompletedCallback )\r\n    {\r\n        /* MISRA Ref 11.3.1 [Misaligned access] */\r\n        /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */\r\n        /* coverity[misra_c_2012_rule_11_3_violation] */\r\n        StreamBuffer_t * const pxStreamBuffer = ( StreamBuffer_t * ) pxStaticStreamBuffer;\r\n        StreamBufferHandle_t xReturn;\r\n        uint8_t ucFlags;\r\n\r\n        traceENTER_xStreamBufferGenericCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, xIsMessageBuffer, pucStreamBufferStorageArea, pxStaticStreamBuffer, pxSendCompletedCallback, pxReceiveCompletedCallback );\r\n\r\n        configASSERT( pucStreamBufferStorageArea );\r\n        configASSERT( pxStaticStreamBuffer );\r\n        configASSERT( xTriggerLevelBytes <= xBufferSizeBytes );\r\n\r\n        /* A trigger level of 0 would cause a waiting task to unblock even when\r\n         * the buffer was empty. */\r\n        if( xTriggerLevelBytes == ( size_t ) 0 )\r\n        {\r\n            xTriggerLevelBytes = ( size_t ) 1;\r\n        }\r\n\r\n        /* In case the stream buffer is going to be used as a message buffer\r\n         * (that is, it will hold discrete messages with a little meta data that\r\n         * says how big the next message is) check the buffer will be large enough\r\n         * to hold at least one message. */\r\n\r\n        if( xIsMessageBuffer != pdFALSE )\r\n        {\r\n            /* Statically allocated message buffer. */\r\n            ucFlags = sbFLAGS_IS_MESSAGE_BUFFER | sbFLAGS_IS_STATICALLY_ALLOCATED;\r\n            configASSERT( xBufferSizeBytes > sbBYTES_TO_STORE_MESSAGE_LENGTH );\r\n        }\r\n        else\r\n        {\r\n            /* Statically allocated stream buffer. */\r\n            ucFlags = sbFLAGS_IS_STATICALLY_ALLOCATED;\r\n        }\r\n\r\n        #if ( configASSERT_DEFINED == 1 )\r\n        {\r\n            /* Sanity check that the size of the structure used to declare a\r\n             * variable of type StaticStreamBuffer_t equals the size of the real\r\n             * message buffer structure. */\r\n            volatile size_t xSize = sizeof( StaticStreamBuffer_t );\r\n            configASSERT( xSize == sizeof( StreamBuffer_t ) );\r\n        }\r\n        #endif /* configASSERT_DEFINED */\r\n\r\n        if( ( pucStreamBufferStorageArea != NULL ) && ( pxStaticStreamBuffer != NULL ) )\r\n        {\r\n            prvInitialiseNewStreamBuffer( pxStreamBuffer,\r\n                                          pucStreamBufferStorageArea,\r\n                                          xBufferSizeBytes,\r\n                                          xTriggerLevelBytes,\r\n                                          ucFlags,\r\n                                          pxSendCompletedCallback,\r\n                                          pxReceiveCompletedCallback );\r\n\r\n            /* Remember this was statically allocated in case it is ever deleted\r\n             * again. */\r\n            pxStreamBuffer->ucFlags |= sbFLAGS_IS_STATICALLY_ALLOCATED;\r\n\r\n            traceSTREAM_BUFFER_CREATE( pxStreamBuffer, xIsMessageBuffer );\r\n\r\n            /* MISRA Ref 11.3.1 [Misaligned access] */\r\n            /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */\r\n            /* coverity[misra_c_2012_rule_11_3_violation] */\r\n            xReturn = ( StreamBufferHandle_t ) pxStaticStreamBuffer;\r\n        }\r\n        else\r\n        {\r\n            xReturn = NULL;\r\n            traceSTREAM_BUFFER_CREATE_STATIC_FAILED( xReturn, xIsMessageBuffer );\r\n        }\r\n\r\n        traceRETURN_xStreamBufferGenericCreateStatic( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n#endif /* ( configSUPPORT_STATIC_ALLOCATION == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n    BaseType_t xStreamBufferGetStaticBuffers( StreamBufferHandle_t xStreamBuffer,\r\n                                              uint8_t ** ppucStreamBufferStorageArea,\r\n                                              StaticStreamBuffer_t ** ppxStaticStreamBuffer )\r\n    {\r\n        BaseType_t xReturn;\r\n        StreamBuffer_t * const pxStreamBuffer = xStreamBuffer;\r\n\r\n        traceENTER_xStreamBufferGetStaticBuffers( xStreamBuffer, ppucStreamBufferStorageArea, ppxStaticStreamBuffer );\r\n\r\n        configASSERT( pxStreamBuffer );\r\n        configASSERT( ppucStreamBufferStorageArea );\r\n        configASSERT( ppxStaticStreamBuffer );\r\n\r\n        if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_STATICALLY_ALLOCATED ) != ( uint8_t ) 0 )\r\n        {\r\n            *ppucStreamBufferStorageArea = pxStreamBuffer->pucBuffer;\r\n            /* MISRA Ref 11.3.1 [Misaligned access] */\r\n            /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */\r\n            /* coverity[misra_c_2012_rule_11_3_violation] */\r\n            *ppxStaticStreamBuffer = ( StaticStreamBuffer_t * ) pxStreamBuffer;\r\n            xReturn = pdTRUE;\r\n        }\r\n        else\r\n        {\r\n            xReturn = pdFALSE;\r\n        }\r\n\r\n        traceRETURN_xStreamBufferGetStaticBuffers( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n#endif /* configSUPPORT_STATIC_ALLOCATION */\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vStreamBufferDelete( StreamBufferHandle_t xStreamBuffer )\r\n{\r\n    StreamBuffer_t * pxStreamBuffer = xStreamBuffer;\r\n\r\n    traceENTER_vStreamBufferDelete( xStreamBuffer );\r\n\r\n    configASSERT( pxStreamBuffer );\r\n\r\n    traceSTREAM_BUFFER_DELETE( xStreamBuffer );\r\n\r\n    if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_STATICALLY_ALLOCATED ) == ( uint8_t ) pdFALSE )\r\n    {\r\n        #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r\n        {\r\n            /* Both the structure and the buffer were allocated using a single call\r\n            * to pvPortMalloc(), hence only one call to vPortFree() is required. */\r\n            vPortFree( ( void * ) pxStreamBuffer );\r\n        }\r\n        #else\r\n        {\r\n            /* Should not be possible to get here, ucFlags must be corrupt.\r\n             * Force an assert. */\r\n            configASSERT( xStreamBuffer == ( StreamBufferHandle_t ) ~0 );\r\n        }\r\n        #endif\r\n    }\r\n    else\r\n    {\r\n        /* The structure and buffer were not allocated dynamically and cannot be\r\n         * freed - just scrub the structure so future use will assert. */\r\n        ( void ) memset( pxStreamBuffer, 0x00, sizeof( StreamBuffer_t ) );\r\n    }\r\n\r\n    traceRETURN_vStreamBufferDelete();\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer )\r\n{\r\n    StreamBuffer_t * const pxStreamBuffer = xStreamBuffer;\r\n    BaseType_t xReturn = pdFAIL;\r\n    StreamBufferCallbackFunction_t pxSendCallback = NULL, pxReceiveCallback = NULL;\r\n\r\n    #if ( configUSE_TRACE_FACILITY == 1 )\r\n        UBaseType_t uxStreamBufferNumber;\r\n    #endif\r\n\r\n    traceENTER_xStreamBufferReset( xStreamBuffer );\r\n\r\n    configASSERT( pxStreamBuffer );\r\n\r\n    #if ( configUSE_TRACE_FACILITY == 1 )\r\n    {\r\n        /* Store the stream buffer number so it can be restored after the\r\n         * reset. */\r\n        uxStreamBufferNumber = pxStreamBuffer->uxStreamBufferNumber;\r\n    }\r\n    #endif\r\n\r\n    /* Can only reset a message buffer if there are no tasks blocked on it. */\r\n    taskENTER_CRITICAL();\r\n    {\r\n        if( ( pxStreamBuffer->xTaskWaitingToReceive == NULL ) && ( pxStreamBuffer->xTaskWaitingToSend == NULL ) )\r\n        {\r\n            #if ( configUSE_SB_COMPLETED_CALLBACK == 1 )\r\n            {\r\n                pxSendCallback = pxStreamBuffer->pxSendCompletedCallback;\r\n                pxReceiveCallback = pxStreamBuffer->pxReceiveCompletedCallback;\r\n            }\r\n            #endif\r\n\r\n            prvInitialiseNewStreamBuffer( pxStreamBuffer,\r\n                                          pxStreamBuffer->pucBuffer,\r\n                                          pxStreamBuffer->xLength,\r\n                                          pxStreamBuffer->xTriggerLevelBytes,\r\n                                          pxStreamBuffer->ucFlags,\r\n                                          pxSendCallback,\r\n                                          pxReceiveCallback );\r\n\r\n            #if ( configUSE_TRACE_FACILITY == 1 )\r\n            {\r\n                pxStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber;\r\n            }\r\n            #endif\r\n\r\n            traceSTREAM_BUFFER_RESET( xStreamBuffer );\r\n\r\n            xReturn = pdPASS;\r\n        }\r\n    }\r\n    taskEXIT_CRITICAL();\r\n\r\n    traceRETURN_xStreamBufferReset( xReturn );\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer,\r\n                                         size_t xTriggerLevel )\r\n{\r\n    StreamBuffer_t * const pxStreamBuffer = xStreamBuffer;\r\n    BaseType_t xReturn;\r\n\r\n    traceENTER_xStreamBufferSetTriggerLevel( xStreamBuffer, xTriggerLevel );\r\n\r\n    configASSERT( pxStreamBuffer );\r\n\r\n    /* It is not valid for the trigger level to be 0. */\r\n    if( xTriggerLevel == ( size_t ) 0 )\r\n    {\r\n        xTriggerLevel = ( size_t ) 1;\r\n    }\r\n\r\n    /* The trigger level is the number of bytes that must be in the stream\r\n     * buffer before a task that is waiting for data is unblocked. */\r\n    if( xTriggerLevel < pxStreamBuffer->xLength )\r\n    {\r\n        pxStreamBuffer->xTriggerLevelBytes = xTriggerLevel;\r\n        xReturn = pdPASS;\r\n    }\r\n    else\r\n    {\r\n        xReturn = pdFALSE;\r\n    }\r\n\r\n    traceRETURN_xStreamBufferSetTriggerLevel( xReturn );\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nsize_t xStreamBufferSpacesAvailable( StreamBufferHandle_t xStreamBuffer )\r\n{\r\n    const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer;\r\n    size_t xSpace;\r\n    size_t xOriginalTail;\r\n\r\n    traceENTER_xStreamBufferSpacesAvailable( xStreamBuffer );\r\n\r\n    configASSERT( pxStreamBuffer );\r\n\r\n    /* The code below reads xTail and then xHead.  This is safe if the stream\r\n     * buffer is updated once between the two reads - but not if the stream buffer\r\n     * is updated more than once between the two reads - hence the loop. */\r\n    do\r\n    {\r\n        xOriginalTail = pxStreamBuffer->xTail;\r\n        xSpace = pxStreamBuffer->xLength + pxStreamBuffer->xTail;\r\n        xSpace -= pxStreamBuffer->xHead;\r\n    } while( xOriginalTail != pxStreamBuffer->xTail );\r\n\r\n    xSpace -= ( size_t ) 1;\r\n\r\n    if( xSpace >= pxStreamBuffer->xLength )\r\n    {\r\n        xSpace -= pxStreamBuffer->xLength;\r\n    }\r\n    else\r\n    {\r\n        mtCOVERAGE_TEST_MARKER();\r\n    }\r\n\r\n    traceRETURN_xStreamBufferSpacesAvailable( xSpace );\r\n\r\n    return xSpace;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nsize_t xStreamBufferBytesAvailable( StreamBufferHandle_t xStreamBuffer )\r\n{\r\n    const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer;\r\n    size_t xReturn;\r\n\r\n    traceENTER_xStreamBufferBytesAvailable( xStreamBuffer );\r\n\r\n    configASSERT( pxStreamBuffer );\r\n\r\n    xReturn = prvBytesInBuffer( pxStreamBuffer );\r\n\r\n    traceRETURN_xStreamBufferBytesAvailable( xReturn );\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nsize_t xStreamBufferSend( StreamBufferHandle_t xStreamBuffer,\r\n                          const void * pvTxData,\r\n                          size_t xDataLengthBytes,\r\n                          TickType_t xTicksToWait )\r\n{\r\n    StreamBuffer_t * const pxStreamBuffer = xStreamBuffer;\r\n    size_t xReturn, xSpace = 0;\r\n    size_t xRequiredSpace = xDataLengthBytes;\r\n    TimeOut_t xTimeOut;\r\n    size_t xMaxReportedSpace = 0;\r\n\r\n    traceENTER_xStreamBufferSend( xStreamBuffer, pvTxData, xDataLengthBytes, xTicksToWait );\r\n\r\n    configASSERT( pvTxData );\r\n    configASSERT( pxStreamBuffer );\r\n\r\n    /* The maximum amount of space a stream buffer will ever report is its length\r\n     * minus 1. */\r\n    xMaxReportedSpace = pxStreamBuffer->xLength - ( size_t ) 1;\r\n\r\n    /* This send function is used to write to both message buffers and stream\r\n     * buffers.  If this is a message buffer then the space needed must be\r\n     * increased by the amount of bytes needed to store the length of the\r\n     * message. */\r\n    if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 )\r\n    {\r\n        xRequiredSpace += sbBYTES_TO_STORE_MESSAGE_LENGTH;\r\n\r\n        /* Overflow? */\r\n        configASSERT( xRequiredSpace > xDataLengthBytes );\r\n\r\n        /* If this is a message buffer then it must be possible to write the\r\n         * whole message. */\r\n        if( xRequiredSpace > xMaxReportedSpace )\r\n        {\r\n            /* The message would not fit even if the entire buffer was empty,\r\n             * so don't wait for space. */\r\n            xTicksToWait = ( TickType_t ) 0;\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n    else\r\n    {\r\n        /* If this is a stream buffer then it is acceptable to write only part\r\n         * of the message to the buffer.  Cap the length to the total length of\r\n         * the buffer. */\r\n        if( xRequiredSpace > xMaxReportedSpace )\r\n        {\r\n            xRequiredSpace = xMaxReportedSpace;\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n\r\n    if( xTicksToWait != ( TickType_t ) 0 )\r\n    {\r\n        vTaskSetTimeOutState( &xTimeOut );\r\n\r\n        do\r\n        {\r\n            /* Wait until the required number of bytes are free in the message\r\n             * buffer. */\r\n            taskENTER_CRITICAL();\r\n            {\r\n                xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer );\r\n\r\n                if( xSpace < xRequiredSpace )\r\n                {\r\n                    /* Clear notification state as going to wait for space. */\r\n                    ( void ) xTaskNotifyStateClear( NULL );\r\n\r\n                    /* Should only be one writer. */\r\n                    configASSERT( pxStreamBuffer->xTaskWaitingToSend == NULL );\r\n                    pxStreamBuffer->xTaskWaitingToSend = xTaskGetCurrentTaskHandle();\r\n                }\r\n                else\r\n                {\r\n                    taskEXIT_CRITICAL();\r\n                    break;\r\n                }\r\n            }\r\n            taskEXIT_CRITICAL();\r\n\r\n            traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer );\r\n            ( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait );\r\n            pxStreamBuffer->xTaskWaitingToSend = NULL;\r\n        } while( xTaskCheckForTimeOut( &xTimeOut, &xTicksToWait ) == pdFALSE );\r\n    }\r\n    else\r\n    {\r\n        mtCOVERAGE_TEST_MARKER();\r\n    }\r\n\r\n    if( xSpace == ( size_t ) 0 )\r\n    {\r\n        xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer );\r\n    }\r\n    else\r\n    {\r\n        mtCOVERAGE_TEST_MARKER();\r\n    }\r\n\r\n    xReturn = prvWriteMessageToBuffer( pxStreamBuffer, pvTxData, xDataLengthBytes, xSpace, xRequiredSpace );\r\n\r\n    if( xReturn > ( size_t ) 0 )\r\n    {\r\n        traceSTREAM_BUFFER_SEND( xStreamBuffer, xReturn );\r\n\r\n        /* Was a task waiting for the data? */\r\n        if( prvBytesInBuffer( pxStreamBuffer ) >= pxStreamBuffer->xTriggerLevelBytes )\r\n        {\r\n            prvSEND_COMPLETED( pxStreamBuffer );\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n    else\r\n    {\r\n        mtCOVERAGE_TEST_MARKER();\r\n        traceSTREAM_BUFFER_SEND_FAILED( xStreamBuffer );\r\n    }\r\n\r\n    traceRETURN_xStreamBufferSend( xReturn );\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nsize_t xStreamBufferSendFromISR( StreamBufferHandle_t xStreamBuffer,\r\n                                 const void * pvTxData,\r\n                                 size_t xDataLengthBytes,\r\n                                 BaseType_t * const pxHigherPriorityTaskWoken )\r\n{\r\n    StreamBuffer_t * const pxStreamBuffer = xStreamBuffer;\r\n    size_t xReturn, xSpace;\r\n    size_t xRequiredSpace = xDataLengthBytes;\r\n\r\n    traceENTER_xStreamBufferSendFromISR( xStreamBuffer, pvTxData, xDataLengthBytes, pxHigherPriorityTaskWoken );\r\n\r\n    configASSERT( pvTxData );\r\n    configASSERT( pxStreamBuffer );\r\n\r\n    /* This send function is used to write to both message buffers and stream\r\n     * buffers.  If this is a message buffer then the space needed must be\r\n     * increased by the amount of bytes needed to store the length of the\r\n     * message. */\r\n    if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 )\r\n    {\r\n        xRequiredSpace += sbBYTES_TO_STORE_MESSAGE_LENGTH;\r\n    }\r\n    else\r\n    {\r\n        mtCOVERAGE_TEST_MARKER();\r\n    }\r\n\r\n    xSpace = xStreamBufferSpacesAvailable( pxStreamBuffer );\r\n    xReturn = prvWriteMessageToBuffer( pxStreamBuffer, pvTxData, xDataLengthBytes, xSpace, xRequiredSpace );\r\n\r\n    if( xReturn > ( size_t ) 0 )\r\n    {\r\n        /* Was a task waiting for the data? */\r\n        if( prvBytesInBuffer( pxStreamBuffer ) >= pxStreamBuffer->xTriggerLevelBytes )\r\n        {\r\n            prvSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken );\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n    else\r\n    {\r\n        mtCOVERAGE_TEST_MARKER();\r\n    }\r\n\r\n    traceSTREAM_BUFFER_SEND_FROM_ISR( xStreamBuffer, xReturn );\r\n    traceRETURN_xStreamBufferSendFromISR( xReturn );\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic size_t prvWriteMessageToBuffer( StreamBuffer_t * const pxStreamBuffer,\r\n                                       const void * pvTxData,\r\n                                       size_t xDataLengthBytes,\r\n                                       size_t xSpace,\r\n                                       size_t xRequiredSpace )\r\n{\r\n    size_t xNextHead = pxStreamBuffer->xHead;\r\n    configMESSAGE_BUFFER_LENGTH_TYPE xMessageLength;\r\n\r\n    if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 )\r\n    {\r\n        /* This is a message buffer, as opposed to a stream buffer. */\r\n\r\n        /* Convert xDataLengthBytes to the message length type. */\r\n        xMessageLength = ( configMESSAGE_BUFFER_LENGTH_TYPE ) xDataLengthBytes;\r\n\r\n        /* Ensure the data length given fits within configMESSAGE_BUFFER_LENGTH_TYPE. */\r\n        configASSERT( ( size_t ) xMessageLength == xDataLengthBytes );\r\n\r\n        if( xSpace >= xRequiredSpace )\r\n        {\r\n            /* There is enough space to write both the message length and the message\r\n             * itself into the buffer.  Start by writing the length of the data, the data\r\n             * itself will be written later in this function. */\r\n            xNextHead = prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) &( xMessageLength ), sbBYTES_TO_STORE_MESSAGE_LENGTH, xNextHead );\r\n        }\r\n        else\r\n        {\r\n            /* Not enough space, so do not write data to the buffer. */\r\n            xDataLengthBytes = 0;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        /* This is a stream buffer, as opposed to a message buffer, so writing a\r\n         * stream of bytes rather than discrete messages.  Plan to write as many\r\n         * bytes as possible. */\r\n        xDataLengthBytes = configMIN( xDataLengthBytes, xSpace );\r\n    }\r\n\r\n    if( xDataLengthBytes != ( size_t ) 0 )\r\n    {\r\n        /* Write the data to the buffer. */\r\n        /* MISRA Ref 11.5.5 [Void pointer assignment] */\r\n        /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n        /* coverity[misra_c_2012_rule_11_5_violation] */\r\n        pxStreamBuffer->xHead = prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) pvTxData, xDataLengthBytes, xNextHead );\r\n    }\r\n\r\n    return xDataLengthBytes;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nsize_t xStreamBufferReceive( StreamBufferHandle_t xStreamBuffer,\r\n                             void * pvRxData,\r\n                             size_t xBufferLengthBytes,\r\n                             TickType_t xTicksToWait )\r\n{\r\n    StreamBuffer_t * const pxStreamBuffer = xStreamBuffer;\r\n    size_t xReceivedLength = 0, xBytesAvailable, xBytesToStoreMessageLength;\r\n\r\n    traceENTER_xStreamBufferReceive( xStreamBuffer, pvRxData, xBufferLengthBytes, xTicksToWait );\r\n\r\n    configASSERT( pvRxData );\r\n    configASSERT( pxStreamBuffer );\r\n\r\n    /* This receive function is used by both message buffers, which store\r\n     * discrete messages, and stream buffers, which store a continuous stream of\r\n     * bytes.  Discrete messages include an additional\r\n     * sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the\r\n     * message. */\r\n    if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 )\r\n    {\r\n        xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH;\r\n    }\r\n    else\r\n    {\r\n        xBytesToStoreMessageLength = 0;\r\n    }\r\n\r\n    if( xTicksToWait != ( TickType_t ) 0 )\r\n    {\r\n        /* Checking if there is data and clearing the notification state must be\r\n         * performed atomically. */\r\n        taskENTER_CRITICAL();\r\n        {\r\n            xBytesAvailable = prvBytesInBuffer( pxStreamBuffer );\r\n\r\n            /* If this function was invoked by a message buffer read then\r\n             * xBytesToStoreMessageLength holds the number of bytes used to hold\r\n             * the length of the next discrete message.  If this function was\r\n             * invoked by a stream buffer read then xBytesToStoreMessageLength will\r\n             * be 0. */\r\n            if( xBytesAvailable <= xBytesToStoreMessageLength )\r\n            {\r\n                /* Clear notification state as going to wait for data. */\r\n                ( void ) xTaskNotifyStateClear( NULL );\r\n\r\n                /* Should only be one reader. */\r\n                configASSERT( pxStreamBuffer->xTaskWaitingToReceive == NULL );\r\n                pxStreamBuffer->xTaskWaitingToReceive = xTaskGetCurrentTaskHandle();\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        if( xBytesAvailable <= xBytesToStoreMessageLength )\r\n        {\r\n            /* Wait for data to be available. */\r\n            traceBLOCKING_ON_STREAM_BUFFER_RECEIVE( xStreamBuffer );\r\n            ( void ) xTaskNotifyWait( ( uint32_t ) 0, ( uint32_t ) 0, NULL, xTicksToWait );\r\n            pxStreamBuffer->xTaskWaitingToReceive = NULL;\r\n\r\n            /* Recheck the data available after blocking. */\r\n            xBytesAvailable = prvBytesInBuffer( pxStreamBuffer );\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n    else\r\n    {\r\n        xBytesAvailable = prvBytesInBuffer( pxStreamBuffer );\r\n    }\r\n\r\n    /* Whether receiving a discrete message (where xBytesToStoreMessageLength\r\n     * holds the number of bytes used to store the message length) or a stream of\r\n     * bytes (where xBytesToStoreMessageLength is zero), the number of bytes\r\n     * available must be greater than xBytesToStoreMessageLength to be able to\r\n     * read bytes from the buffer. */\r\n    if( xBytesAvailable > xBytesToStoreMessageLength )\r\n    {\r\n        xReceivedLength = prvReadMessageFromBuffer( pxStreamBuffer, pvRxData, xBufferLengthBytes, xBytesAvailable );\r\n\r\n        /* Was a task waiting for space in the buffer? */\r\n        if( xReceivedLength != ( size_t ) 0 )\r\n        {\r\n            traceSTREAM_BUFFER_RECEIVE( xStreamBuffer, xReceivedLength );\r\n            prvRECEIVE_COMPLETED( xStreamBuffer );\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n    else\r\n    {\r\n        traceSTREAM_BUFFER_RECEIVE_FAILED( xStreamBuffer );\r\n        mtCOVERAGE_TEST_MARKER();\r\n    }\r\n\r\n    traceRETURN_xStreamBufferReceive( xReceivedLength );\r\n\r\n    return xReceivedLength;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nsize_t xStreamBufferNextMessageLengthBytes( StreamBufferHandle_t xStreamBuffer )\r\n{\r\n    StreamBuffer_t * const pxStreamBuffer = xStreamBuffer;\r\n    size_t xReturn, xBytesAvailable;\r\n    configMESSAGE_BUFFER_LENGTH_TYPE xTempReturn;\r\n\r\n    traceENTER_xStreamBufferNextMessageLengthBytes( xStreamBuffer );\r\n\r\n    configASSERT( pxStreamBuffer );\r\n\r\n    /* Ensure the stream buffer is being used as a message buffer. */\r\n    if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 )\r\n    {\r\n        xBytesAvailable = prvBytesInBuffer( pxStreamBuffer );\r\n\r\n        if( xBytesAvailable > sbBYTES_TO_STORE_MESSAGE_LENGTH )\r\n        {\r\n            /* The number of bytes available is greater than the number of bytes\r\n             * required to hold the length of the next message, so another message\r\n             * is available. */\r\n            ( void ) prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) &xTempReturn, sbBYTES_TO_STORE_MESSAGE_LENGTH, pxStreamBuffer->xTail );\r\n            xReturn = ( size_t ) xTempReturn;\r\n        }\r\n        else\r\n        {\r\n            /* The minimum amount of bytes in a message buffer is\r\n             * ( sbBYTES_TO_STORE_MESSAGE_LENGTH + 1 ), so if xBytesAvailable is\r\n             * less than sbBYTES_TO_STORE_MESSAGE_LENGTH the only other valid\r\n             * value is 0. */\r\n            configASSERT( xBytesAvailable == 0 );\r\n            xReturn = 0;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        xReturn = 0;\r\n    }\r\n\r\n    traceRETURN_xStreamBufferNextMessageLengthBytes( xReturn );\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nsize_t xStreamBufferReceiveFromISR( StreamBufferHandle_t xStreamBuffer,\r\n                                    void * pvRxData,\r\n                                    size_t xBufferLengthBytes,\r\n                                    BaseType_t * const pxHigherPriorityTaskWoken )\r\n{\r\n    StreamBuffer_t * const pxStreamBuffer = xStreamBuffer;\r\n    size_t xReceivedLength = 0, xBytesAvailable, xBytesToStoreMessageLength;\r\n\r\n    traceENTER_xStreamBufferReceiveFromISR( xStreamBuffer, pvRxData, xBufferLengthBytes, pxHigherPriorityTaskWoken );\r\n\r\n    configASSERT( pvRxData );\r\n    configASSERT( pxStreamBuffer );\r\n\r\n    /* This receive function is used by both message buffers, which store\r\n     * discrete messages, and stream buffers, which store a continuous stream of\r\n     * bytes.  Discrete messages include an additional\r\n     * sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the\r\n     * message. */\r\n    if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 )\r\n    {\r\n        xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH;\r\n    }\r\n    else\r\n    {\r\n        xBytesToStoreMessageLength = 0;\r\n    }\r\n\r\n    xBytesAvailable = prvBytesInBuffer( pxStreamBuffer );\r\n\r\n    /* Whether receiving a discrete message (where xBytesToStoreMessageLength\r\n     * holds the number of bytes used to store the message length) or a stream of\r\n     * bytes (where xBytesToStoreMessageLength is zero), the number of bytes\r\n     * available must be greater than xBytesToStoreMessageLength to be able to\r\n     * read bytes from the buffer. */\r\n    if( xBytesAvailable > xBytesToStoreMessageLength )\r\n    {\r\n        xReceivedLength = prvReadMessageFromBuffer( pxStreamBuffer, pvRxData, xBufferLengthBytes, xBytesAvailable );\r\n\r\n        /* Was a task waiting for space in the buffer? */\r\n        if( xReceivedLength != ( size_t ) 0 )\r\n        {\r\n            prvRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken );\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n    else\r\n    {\r\n        mtCOVERAGE_TEST_MARKER();\r\n    }\r\n\r\n    traceSTREAM_BUFFER_RECEIVE_FROM_ISR( xStreamBuffer, xReceivedLength );\r\n    traceRETURN_xStreamBufferReceiveFromISR( xReceivedLength );\r\n\r\n    return xReceivedLength;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic size_t prvReadMessageFromBuffer( StreamBuffer_t * pxStreamBuffer,\r\n                                        void * pvRxData,\r\n                                        size_t xBufferLengthBytes,\r\n                                        size_t xBytesAvailable )\r\n{\r\n    size_t xCount, xNextMessageLength;\r\n    configMESSAGE_BUFFER_LENGTH_TYPE xTempNextMessageLength;\r\n    size_t xNextTail = pxStreamBuffer->xTail;\r\n\r\n    if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 )\r\n    {\r\n        /* A discrete message is being received.  First receive the length\r\n         * of the message. */\r\n        xNextTail = prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) &xTempNextMessageLength, sbBYTES_TO_STORE_MESSAGE_LENGTH, xNextTail );\r\n        xNextMessageLength = ( size_t ) xTempNextMessageLength;\r\n\r\n        /* Reduce the number of bytes available by the number of bytes just\r\n         * read out. */\r\n        xBytesAvailable -= sbBYTES_TO_STORE_MESSAGE_LENGTH;\r\n\r\n        /* Check there is enough space in the buffer provided by the\r\n         * user. */\r\n        if( xNextMessageLength > xBufferLengthBytes )\r\n        {\r\n            /* The user has provided insufficient space to read the message. */\r\n            xNextMessageLength = 0;\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n    else\r\n    {\r\n        /* A stream of bytes is being received (as opposed to a discrete\r\n         * message), so read as many bytes as possible. */\r\n        xNextMessageLength = xBufferLengthBytes;\r\n    }\r\n\r\n    /* Use the minimum of the wanted bytes and the available bytes. */\r\n    xCount = configMIN( xNextMessageLength, xBytesAvailable );\r\n\r\n    if( xCount != ( size_t ) 0 )\r\n    {\r\n        /* Read the actual data and update the tail to mark the data as officially consumed. */\r\n        /* MISRA Ref 11.5.5 [Void pointer assignment] */\r\n        /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n        /* coverity[misra_c_2012_rule_11_5_violation] */\r\n        pxStreamBuffer->xTail = prvReadBytesFromBuffer( pxStreamBuffer, ( uint8_t * ) pvRxData, xCount, xNextTail );\r\n    }\r\n\r\n    return xCount;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer )\r\n{\r\n    const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer;\r\n    BaseType_t xReturn;\r\n    size_t xTail;\r\n\r\n    traceENTER_xStreamBufferIsEmpty( xStreamBuffer );\r\n\r\n    configASSERT( pxStreamBuffer );\r\n\r\n    /* True if no bytes are available. */\r\n    xTail = pxStreamBuffer->xTail;\r\n\r\n    if( pxStreamBuffer->xHead == xTail )\r\n    {\r\n        xReturn = pdTRUE;\r\n    }\r\n    else\r\n    {\r\n        xReturn = pdFALSE;\r\n    }\r\n\r\n    traceRETURN_xStreamBufferIsEmpty( xReturn );\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xStreamBufferIsFull( StreamBufferHandle_t xStreamBuffer )\r\n{\r\n    BaseType_t xReturn;\r\n    size_t xBytesToStoreMessageLength;\r\n    const StreamBuffer_t * const pxStreamBuffer = xStreamBuffer;\r\n\r\n    traceENTER_xStreamBufferIsFull( xStreamBuffer );\r\n\r\n    configASSERT( pxStreamBuffer );\r\n\r\n    /* This generic version of the receive function is used by both message\r\n     * buffers, which store discrete messages, and stream buffers, which store a\r\n     * continuous stream of bytes.  Discrete messages include an additional\r\n     * sbBYTES_TO_STORE_MESSAGE_LENGTH bytes that hold the length of the message. */\r\n    if( ( pxStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) != ( uint8_t ) 0 )\r\n    {\r\n        xBytesToStoreMessageLength = sbBYTES_TO_STORE_MESSAGE_LENGTH;\r\n    }\r\n    else\r\n    {\r\n        xBytesToStoreMessageLength = 0;\r\n    }\r\n\r\n    /* True if the available space equals zero. */\r\n    if( xStreamBufferSpacesAvailable( xStreamBuffer ) <= xBytesToStoreMessageLength )\r\n    {\r\n        xReturn = pdTRUE;\r\n    }\r\n    else\r\n    {\r\n        xReturn = pdFALSE;\r\n    }\r\n\r\n    traceRETURN_xStreamBufferIsFull( xReturn );\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xStreamBufferSendCompletedFromISR( StreamBufferHandle_t xStreamBuffer,\r\n                                              BaseType_t * pxHigherPriorityTaskWoken )\r\n{\r\n    StreamBuffer_t * const pxStreamBuffer = xStreamBuffer;\r\n    BaseType_t xReturn;\r\n    UBaseType_t uxSavedInterruptStatus;\r\n\r\n    traceENTER_xStreamBufferSendCompletedFromISR( xStreamBuffer, pxHigherPriorityTaskWoken );\r\n\r\n    configASSERT( pxStreamBuffer );\r\n\r\n    uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();\r\n    {\r\n        if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL )\r\n        {\r\n            ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToReceive,\r\n                                         ( uint32_t ) 0,\r\n                                         eNoAction,\r\n                                         pxHigherPriorityTaskWoken );\r\n            ( pxStreamBuffer )->xTaskWaitingToReceive = NULL;\r\n            xReturn = pdTRUE;\r\n        }\r\n        else\r\n        {\r\n            xReturn = pdFALSE;\r\n        }\r\n    }\r\n    taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );\r\n\r\n    traceRETURN_xStreamBufferSendCompletedFromISR( xReturn );\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuffer,\r\n                                                 BaseType_t * pxHigherPriorityTaskWoken )\r\n{\r\n    StreamBuffer_t * const pxStreamBuffer = xStreamBuffer;\r\n    BaseType_t xReturn;\r\n    UBaseType_t uxSavedInterruptStatus;\r\n\r\n    traceENTER_xStreamBufferReceiveCompletedFromISR( xStreamBuffer, pxHigherPriorityTaskWoken );\r\n\r\n    configASSERT( pxStreamBuffer );\r\n\r\n    uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();\r\n    {\r\n        if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL )\r\n        {\r\n            ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToSend,\r\n                                         ( uint32_t ) 0,\r\n                                         eNoAction,\r\n                                         pxHigherPriorityTaskWoken );\r\n            ( pxStreamBuffer )->xTaskWaitingToSend = NULL;\r\n            xReturn = pdTRUE;\r\n        }\r\n        else\r\n        {\r\n            xReturn = pdFALSE;\r\n        }\r\n    }\r\n    taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );\r\n\r\n    traceRETURN_xStreamBufferReceiveCompletedFromISR( xReturn );\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer,\r\n                                     const uint8_t * pucData,\r\n                                     size_t xCount,\r\n                                     size_t xHead )\r\n{\r\n    size_t xFirstLength;\r\n\r\n    configASSERT( xCount > ( size_t ) 0 );\r\n\r\n    /* Calculate the number of bytes that can be added in the first write -\r\n     * which may be less than the total number of bytes that need to be added if\r\n     * the buffer will wrap back to the beginning. */\r\n    xFirstLength = configMIN( pxStreamBuffer->xLength - xHead, xCount );\r\n\r\n    /* Write as many bytes as can be written in the first write. */\r\n    configASSERT( ( xHead + xFirstLength ) <= pxStreamBuffer->xLength );\r\n    ( void ) memcpy( ( void * ) ( &( pxStreamBuffer->pucBuffer[ xHead ] ) ), ( const void * ) pucData, xFirstLength );\r\n\r\n    /* If the number of bytes written was less than the number that could be\r\n     * written in the first write... */\r\n    if( xCount > xFirstLength )\r\n    {\r\n        /* ...then write the remaining bytes to the start of the buffer. */\r\n        configASSERT( ( xCount - xFirstLength ) <= pxStreamBuffer->xLength );\r\n        ( void ) memcpy( ( void * ) pxStreamBuffer->pucBuffer, ( const void * ) &( pucData[ xFirstLength ] ), xCount - xFirstLength );\r\n    }\r\n    else\r\n    {\r\n        mtCOVERAGE_TEST_MARKER();\r\n    }\r\n\r\n    xHead += xCount;\r\n\r\n    if( xHead >= pxStreamBuffer->xLength )\r\n    {\r\n        xHead -= pxStreamBuffer->xLength;\r\n    }\r\n    else\r\n    {\r\n        mtCOVERAGE_TEST_MARKER();\r\n    }\r\n\r\n    return xHead;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic size_t prvReadBytesFromBuffer( StreamBuffer_t * pxStreamBuffer,\r\n                                      uint8_t * pucData,\r\n                                      size_t xCount,\r\n                                      size_t xTail )\r\n{\r\n    size_t xFirstLength;\r\n\r\n    configASSERT( xCount != ( size_t ) 0 );\r\n\r\n    /* Calculate the number of bytes that can be read - which may be\r\n     * less than the number wanted if the data wraps around to the start of\r\n     * the buffer. */\r\n    xFirstLength = configMIN( pxStreamBuffer->xLength - xTail, xCount );\r\n\r\n    /* Obtain the number of bytes it is possible to obtain in the first\r\n     * read.  Asserts check bounds of read and write. */\r\n    configASSERT( xFirstLength <= xCount );\r\n    configASSERT( ( xTail + xFirstLength ) <= pxStreamBuffer->xLength );\r\n    ( void ) memcpy( ( void * ) pucData, ( const void * ) &( pxStreamBuffer->pucBuffer[ xTail ] ), xFirstLength );\r\n\r\n    /* If the total number of wanted bytes is greater than the number\r\n     * that could be read in the first read... */\r\n    if( xCount > xFirstLength )\r\n    {\r\n        /* ...then read the remaining bytes from the start of the buffer. */\r\n        ( void ) memcpy( ( void * ) &( pucData[ xFirstLength ] ), ( void * ) ( pxStreamBuffer->pucBuffer ), xCount - xFirstLength );\r\n    }\r\n    else\r\n    {\r\n        mtCOVERAGE_TEST_MARKER();\r\n    }\r\n\r\n    /* Move the tail pointer to effectively remove the data read from the buffer. */\r\n    xTail += xCount;\r\n\r\n    if( xTail >= pxStreamBuffer->xLength )\r\n    {\r\n        xTail -= pxStreamBuffer->xLength;\r\n    }\r\n\r\n    return xTail;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic size_t prvBytesInBuffer( const StreamBuffer_t * const pxStreamBuffer )\r\n{\r\n/* Returns the distance between xTail and xHead. */\r\n    size_t xCount;\r\n\r\n    xCount = pxStreamBuffer->xLength + pxStreamBuffer->xHead;\r\n    xCount -= pxStreamBuffer->xTail;\r\n\r\n    if( xCount >= pxStreamBuffer->xLength )\r\n    {\r\n        xCount -= pxStreamBuffer->xLength;\r\n    }\r\n    else\r\n    {\r\n        mtCOVERAGE_TEST_MARKER();\r\n    }\r\n\r\n    return xCount;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic void prvInitialiseNewStreamBuffer( StreamBuffer_t * const pxStreamBuffer,\r\n                                          uint8_t * const pucBuffer,\r\n                                          size_t xBufferSizeBytes,\r\n                                          size_t xTriggerLevelBytes,\r\n                                          uint8_t ucFlags,\r\n                                          StreamBufferCallbackFunction_t pxSendCompletedCallback,\r\n                                          StreamBufferCallbackFunction_t pxReceiveCompletedCallback )\r\n{\r\n    /* Assert here is deliberately writing to the entire buffer to ensure it can\r\n     * be written to without generating exceptions, and is setting the buffer to a\r\n     * known value to assist in development/debugging. */\r\n    #if ( configASSERT_DEFINED == 1 )\r\n    {\r\n        /* The value written just has to be identifiable when looking at the\r\n         * memory.  Don't use 0xA5 as that is the stack fill value and could\r\n         * result in confusion as to what is actually being observed. */\r\n    #define STREAM_BUFFER_BUFFER_WRITE_VALUE    ( 0x55 )\r\n        configASSERT( memset( pucBuffer, ( int ) STREAM_BUFFER_BUFFER_WRITE_VALUE, xBufferSizeBytes ) == pucBuffer );\r\n    }\r\n    #endif\r\n\r\n    ( void ) memset( ( void * ) pxStreamBuffer, 0x00, sizeof( StreamBuffer_t ) );\r\n    pxStreamBuffer->pucBuffer = pucBuffer;\r\n    pxStreamBuffer->xLength = xBufferSizeBytes;\r\n    pxStreamBuffer->xTriggerLevelBytes = xTriggerLevelBytes;\r\n    pxStreamBuffer->ucFlags = ucFlags;\r\n    #if ( configUSE_SB_COMPLETED_CALLBACK == 1 )\r\n    {\r\n        pxStreamBuffer->pxSendCompletedCallback = pxSendCompletedCallback;\r\n        pxStreamBuffer->pxReceiveCompletedCallback = pxReceiveCompletedCallback;\r\n    }\r\n    #else\r\n    {\r\n        /* MISRA Ref 11.1.1 [Object type casting] */\r\n        /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-111 */\r\n        /* coverity[misra_c_2012_rule_11_1_violation] */\r\n        ( void ) pxSendCompletedCallback;\r\n\r\n        /* MISRA Ref 11.1.1 [Object type casting] */\r\n        /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-111 */\r\n        /* coverity[misra_c_2012_rule_11_1_violation] */\r\n        ( void ) pxReceiveCompletedCallback;\r\n    }\r\n    #endif /* if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) */\r\n}\r\n\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n\r\n    UBaseType_t uxStreamBufferGetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer )\r\n    {\r\n        traceENTER_uxStreamBufferGetStreamBufferNumber( xStreamBuffer );\r\n\r\n        traceRETURN_uxStreamBufferGetStreamBufferNumber( xStreamBuffer->uxStreamBufferNumber );\r\n\r\n        return xStreamBuffer->uxStreamBufferNumber;\r\n    }\r\n\r\n#endif /* configUSE_TRACE_FACILITY */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n\r\n    void vStreamBufferSetStreamBufferNumber( StreamBufferHandle_t xStreamBuffer,\r\n                                             UBaseType_t uxStreamBufferNumber )\r\n    {\r\n        traceENTER_vStreamBufferSetStreamBufferNumber( xStreamBuffer, uxStreamBufferNumber );\r\n\r\n        xStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber;\r\n\r\n        traceRETURN_vStreamBufferSetStreamBufferNumber();\r\n    }\r\n\r\n#endif /* configUSE_TRACE_FACILITY */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n\r\n    uint8_t ucStreamBufferGetStreamBufferType( StreamBufferHandle_t xStreamBuffer )\r\n    {\r\n        traceENTER_ucStreamBufferGetStreamBufferType( xStreamBuffer );\r\n\r\n        traceRETURN_ucStreamBufferGetStreamBufferType( ( uint8_t ) ( xStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) );\r\n\r\n        return( ( uint8_t ) ( xStreamBuffer->ucFlags & sbFLAGS_IS_MESSAGE_BUFFER ) );\r\n    }\r\n\r\n#endif /* configUSE_TRACE_FACILITY */\r\n/*-----------------------------------------------------------*/\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/tasks.c",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n/* Standard includes. */\r\n#include <stdlib.h>\r\n#include <string.h>\r\n\r\n/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining\r\n * all the API functions to use the MPU wrappers.  That should only be done when\r\n * task.h is included from an application file. */\r\n#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n/* FreeRTOS includes. */\r\n#include \"FreeRTOS.h\"\r\n#include \"task.h\"\r\n#include \"timers.h\"\r\n#include \"stack_macros.h\"\r\n\r\n/* The MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined\r\n * for the header files above, but not in this file, in order to generate the\r\n * correct privileged Vs unprivileged linkage and placement. */\r\n#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n/* Set configUSE_STATS_FORMATTING_FUNCTIONS to 2 to include the stats formatting\r\n * functions but without including stdio.h here. */\r\n#if ( configUSE_STATS_FORMATTING_FUNCTIONS == 1 )\r\n\r\n/* At the bottom of this file are two optional functions that can be used\r\n * to generate human readable text from the raw data generated by the\r\n * uxTaskGetSystemState() function.  Note the formatting functions are provided\r\n * for convenience only, and are NOT considered part of the kernel. */\r\n    #include <stdio.h>\r\n#endif /* configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) */\r\n\r\n#if ( configUSE_PREEMPTION == 0 )\r\n\r\n/* If the cooperative scheduler is being used then a yield should not be\r\n * performed just because a higher priority task has been woken. */\r\n    #define taskYIELD_TASK_CORE_IF_USING_PREEMPTION( pxTCB )\r\n    #define taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxTCB )\r\n#else\r\n\r\n    #if ( configNUMBER_OF_CORES == 1 )\r\n\r\n/* This macro requests the running task pxTCB to yield. In single core\r\n * scheduler, a running task always runs on core 0 and portYIELD_WITHIN_API()\r\n * can be used to request the task running on core 0 to yield. Therefore, pxTCB\r\n * is not used in this macro. */\r\n        #define taskYIELD_TASK_CORE_IF_USING_PREEMPTION( pxTCB ) \\\r\n    do {                                                         \\\r\n        ( void ) ( pxTCB );                                      \\\r\n        portYIELD_WITHIN_API();                                  \\\r\n    } while( 0 )\r\n\r\n        #define taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxTCB ) \\\r\n    do {                                                        \\\r\n        if( pxCurrentTCB->uxPriority < ( pxTCB )->uxPriority )  \\\r\n        {                                                       \\\r\n            portYIELD_WITHIN_API();                             \\\r\n        }                                                       \\\r\n        else                                                    \\\r\n        {                                                       \\\r\n            mtCOVERAGE_TEST_MARKER();                           \\\r\n        }                                                       \\\r\n    } while( 0 )\r\n\r\n    #else /* if ( configNUMBER_OF_CORES == 1 ) */\r\n\r\n/* Yield the core on which this task is running. */\r\n        #define taskYIELD_TASK_CORE_IF_USING_PREEMPTION( pxTCB )    prvYieldCore( ( pxTCB )->xTaskRunState )\r\n\r\n/* Yield for the task if a running task has priority lower than this task. */\r\n        #define taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxTCB )     prvYieldForTask( pxTCB )\r\n\r\n    #endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n\r\n#endif /* if ( configUSE_PREEMPTION == 0 ) */\r\n\r\n/* Values that can be assigned to the ucNotifyState member of the TCB. */\r\n#define taskNOT_WAITING_NOTIFICATION              ( ( uint8_t ) 0 ) /* Must be zero as it is the initialised value. */\r\n#define taskWAITING_NOTIFICATION                  ( ( uint8_t ) 1 )\r\n#define taskNOTIFICATION_RECEIVED                 ( ( uint8_t ) 2 )\r\n\r\n/*\r\n * The value used to fill the stack of a task when the task is created.  This\r\n * is used purely for checking the high water mark for tasks.\r\n */\r\n#define tskSTACK_FILL_BYTE                        ( 0xa5U )\r\n\r\n/* Bits used to record how a task's stack and TCB were allocated. */\r\n#define tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB    ( ( uint8_t ) 0 )\r\n#define tskSTATICALLY_ALLOCATED_STACK_ONLY        ( ( uint8_t ) 1 )\r\n#define tskSTATICALLY_ALLOCATED_STACK_AND_TCB     ( ( uint8_t ) 2 )\r\n\r\n/* If any of the following are set then task stacks are filled with a known\r\n * value so the high water mark can be determined.  If none of the following are\r\n * set then don't fill the stack so there is no unnecessary dependency on memset. */\r\n#if ( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) )\r\n    #define tskSET_NEW_STACKS_TO_KNOWN_VALUE    1\r\n#else\r\n    #define tskSET_NEW_STACKS_TO_KNOWN_VALUE    0\r\n#endif\r\n\r\n/*\r\n * Macros used by vListTask to indicate which state a task is in.\r\n */\r\n#define tskRUNNING_CHAR      ( 'X' )\r\n#define tskBLOCKED_CHAR      ( 'B' )\r\n#define tskREADY_CHAR        ( 'R' )\r\n#define tskDELETED_CHAR      ( 'D' )\r\n#define tskSUSPENDED_CHAR    ( 'S' )\r\n\r\n/*\r\n * Some kernel aware debuggers require the data the debugger needs access to to\r\n * be global, rather than file scope.\r\n */\r\n#ifdef portREMOVE_STATIC_QUALIFIER\r\n    #define static\r\n#endif\r\n\r\n/* The name allocated to the Idle task.  This can be overridden by defining\r\n * configIDLE_TASK_NAME in FreeRTOSConfig.h. */\r\n#ifndef configIDLE_TASK_NAME\r\n    #define configIDLE_TASK_NAME    \"IDLE\"\r\n#endif\r\n\r\n#if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 )\r\n\r\n/* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 0 then task selection is\r\n * performed in a generic way that is not optimised to any particular\r\n * microcontroller architecture. */\r\n\r\n/* uxTopReadyPriority holds the priority of the highest priority ready\r\n * state task. */\r\n    #define taskRECORD_READY_PRIORITY( uxPriority ) \\\r\n    do {                                            \\\r\n        if( ( uxPriority ) > uxTopReadyPriority )   \\\r\n        {                                           \\\r\n            uxTopReadyPriority = ( uxPriority );    \\\r\n        }                                           \\\r\n    } while( 0 ) /* taskRECORD_READY_PRIORITY */\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configNUMBER_OF_CORES == 1 )\r\n        #define taskSELECT_HIGHEST_PRIORITY_TASK()                            \\\r\n    do {                                                                      \\\r\n        UBaseType_t uxTopPriority = uxTopReadyPriority;                       \\\r\n                                                                              \\\r\n        /* Find the highest priority queue that contains ready tasks. */      \\\r\n        while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopPriority ] ) ) ) \\\r\n        {                                                                     \\\r\n            configASSERT( uxTopPriority );                                    \\\r\n            --uxTopPriority;                                                  \\\r\n        }                                                                     \\\r\n                                                                              \\\r\n        /* listGET_OWNER_OF_NEXT_ENTRY indexes through the list, so the tasks of \\\r\n         * the  same priority get an equal share of the processor time. */                    \\\r\n        listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \\\r\n        uxTopReadyPriority = uxTopPriority;                                                   \\\r\n    } while( 0 ) /* taskSELECT_HIGHEST_PRIORITY_TASK */\r\n    #else /* if ( configNUMBER_OF_CORES == 1 ) */\r\n\r\n        #define taskSELECT_HIGHEST_PRIORITY_TASK( xCoreID )    prvSelectHighestPriorityTask( xCoreID )\r\n\r\n    #endif /* if ( configNUMBER_OF_CORES == 1 ) */\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n/* Define away taskRESET_READY_PRIORITY() and portRESET_READY_PRIORITY() as\r\n * they are only required when a port optimised method of task selection is\r\n * being used. */\r\n    #define taskRESET_READY_PRIORITY( uxPriority )\r\n    #define portRESET_READY_PRIORITY( uxPriority, uxTopReadyPriority )\r\n\r\n#else /* configUSE_PORT_OPTIMISED_TASK_SELECTION */\r\n\r\n/* If configUSE_PORT_OPTIMISED_TASK_SELECTION is 1 then task selection is\r\n * performed in a way that is tailored to the particular microcontroller\r\n * architecture being used. */\r\n\r\n/* A port optimised version is provided.  Call the port defined macros. */\r\n    #define taskRECORD_READY_PRIORITY( uxPriority )    portRECORD_READY_PRIORITY( ( uxPriority ), uxTopReadyPriority )\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n    #define taskSELECT_HIGHEST_PRIORITY_TASK()                                                  \\\r\n    do {                                                                                        \\\r\n        UBaseType_t uxTopPriority;                                                              \\\r\n                                                                                                \\\r\n        /* Find the highest priority list that contains ready tasks. */                         \\\r\n        portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority );                          \\\r\n        configASSERT( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ uxTopPriority ] ) ) > 0 ); \\\r\n        listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) );   \\\r\n    } while( 0 )\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n/* A port optimised version is provided, call it only if the TCB being reset\r\n * is being referenced from a ready list.  If it is referenced from a delayed\r\n * or suspended list then it won't be in a ready list. */\r\n    #define taskRESET_READY_PRIORITY( uxPriority )                                                     \\\r\n    do {                                                                                               \\\r\n        if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ ( uxPriority ) ] ) ) == ( UBaseType_t ) 0 ) \\\r\n        {                                                                                              \\\r\n            portRESET_READY_PRIORITY( ( uxPriority ), ( uxTopReadyPriority ) );                        \\\r\n        }                                                                                              \\\r\n    } while( 0 )\r\n\r\n#endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n/* pxDelayedTaskList and pxOverflowDelayedTaskList are switched when the tick\r\n * count overflows. */\r\n#define taskSWITCH_DELAYED_LISTS()                                                \\\r\n    do {                                                                          \\\r\n        List_t * pxTemp;                                                          \\\r\n                                                                                  \\\r\n        /* The delayed tasks list should be empty when the lists are switched. */ \\\r\n        configASSERT( ( listLIST_IS_EMPTY( pxDelayedTaskList ) ) );               \\\r\n                                                                                  \\\r\n        pxTemp = pxDelayedTaskList;                                               \\\r\n        pxDelayedTaskList = pxOverflowDelayedTaskList;                            \\\r\n        pxOverflowDelayedTaskList = pxTemp;                                       \\\r\n        xNumOfOverflows++;                                                        \\\r\n        prvResetNextTaskUnblockTime();                                            \\\r\n    } while( 0 )\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n/*\r\n * Place the task represented by pxTCB into the appropriate ready list for\r\n * the task.  It is inserted at the end of the list.\r\n */\r\n#define prvAddTaskToReadyList( pxTCB )                                                                     \\\r\n    do {                                                                                                   \\\r\n        traceMOVED_TASK_TO_READY_STATE( pxTCB );                                                           \\\r\n        taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority );                                                \\\r\n        listINSERT_END( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) ); \\\r\n        tracePOST_MOVED_TASK_TO_READY_STATE( pxTCB );                                                      \\\r\n    } while( 0 )\r\n/*-----------------------------------------------------------*/\r\n\r\n/*\r\n * Several functions take a TaskHandle_t parameter that can optionally be NULL,\r\n * where NULL is used to indicate that the handle of the currently executing\r\n * task should be used in place of the parameter.  This macro simply checks to\r\n * see if the parameter is NULL and returns a pointer to the appropriate TCB.\r\n */\r\n#define prvGetTCBFromHandle( pxHandle )    ( ( ( pxHandle ) == NULL ) ? pxCurrentTCB : ( pxHandle ) )\r\n\r\n/* The item value of the event list item is normally used to hold the priority\r\n * of the task to which it belongs (coded to allow it to be held in reverse\r\n * priority order).  However, it is occasionally borrowed for other purposes.  It\r\n * is important its value is not updated due to a task priority change while it is\r\n * being used for another purpose.  The following bit definition is used to inform\r\n * the scheduler that the value should not be changed - in which case it is the\r\n * responsibility of whichever module is using the value to ensure it gets set back\r\n * to its original value when it is released. */\r\n#if ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_16_BITS )\r\n    #define taskEVENT_LIST_ITEM_VALUE_IN_USE    ( ( uint16_t ) 0x8000U )\r\n#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_32_BITS )\r\n    #define taskEVENT_LIST_ITEM_VALUE_IN_USE    ( ( uint32_t ) 0x80000000UL )\r\n#elif ( configTICK_TYPE_WIDTH_IN_BITS == TICK_TYPE_WIDTH_64_BITS )\r\n    #define taskEVENT_LIST_ITEM_VALUE_IN_USE    ( ( uint64_t ) 0x8000000000000000ULL )\r\n#endif\r\n\r\n/* Indicates that the task is not actively running on any core. */\r\n#define taskTASK_NOT_RUNNING           ( ( BaseType_t ) ( -1 ) )\r\n\r\n/* Indicates that the task is actively running but scheduled to yield. */\r\n#define taskTASK_SCHEDULED_TO_YIELD    ( ( BaseType_t ) ( -2 ) )\r\n\r\n/* Returns pdTRUE if the task is actively running and not scheduled to yield. */\r\n#if ( configNUMBER_OF_CORES == 1 )\r\n    #define taskTASK_IS_RUNNING( pxTCB )                          ( ( ( pxTCB ) == pxCurrentTCB ) ? ( pdTRUE ) : ( pdFALSE ) )\r\n    #define taskTASK_IS_RUNNING_OR_SCHEDULED_TO_YIELD( pxTCB )    ( ( ( pxTCB ) == pxCurrentTCB ) ? ( pdTRUE ) : ( pdFALSE ) )\r\n#else\r\n    #define taskTASK_IS_RUNNING( pxTCB )                          ( ( ( ( pxTCB )->xTaskRunState >= ( BaseType_t ) 0 ) && ( ( pxTCB )->xTaskRunState < ( BaseType_t ) configNUMBER_OF_CORES ) ) ? ( pdTRUE ) : ( pdFALSE ) )\r\n    #define taskTASK_IS_RUNNING_OR_SCHEDULED_TO_YIELD( pxTCB )    ( ( ( pxTCB )->xTaskRunState != taskTASK_NOT_RUNNING ) ? ( pdTRUE ) : ( pdFALSE ) )\r\n#endif\r\n\r\n/* Indicates that the task is an Idle task. */\r\n#define taskATTRIBUTE_IS_IDLE    ( UBaseType_t ) ( 1UL << 0UL )\r\n\r\n#if ( ( configNUMBER_OF_CORES > 1 ) && ( portCRITICAL_NESTING_IN_TCB == 1 ) )\r\n    #define portGET_CRITICAL_NESTING_COUNT()          ( pxCurrentTCBs[ portGET_CORE_ID() ]->uxCriticalNesting )\r\n    #define portSET_CRITICAL_NESTING_COUNT( x )       ( pxCurrentTCBs[ portGET_CORE_ID() ]->uxCriticalNesting = ( x ) )\r\n    #define portINCREMENT_CRITICAL_NESTING_COUNT()    ( pxCurrentTCBs[ portGET_CORE_ID() ]->uxCriticalNesting++ )\r\n    #define portDECREMENT_CRITICAL_NESTING_COUNT()    ( pxCurrentTCBs[ portGET_CORE_ID() ]->uxCriticalNesting-- )\r\n#endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( portCRITICAL_NESTING_IN_TCB == 1 ) ) */\r\n\r\n#define taskBITS_PER_BYTE    ( ( size_t ) 8 )\r\n\r\n#if ( configNUMBER_OF_CORES > 1 )\r\n\r\n/* Yields the given core. This must be called from a critical section and xCoreID\r\n * must be valid. This macro is not required in single core since there is only\r\n * one core to yield. */\r\n    #define prvYieldCore( xCoreID )                                                          \\\r\n    do {                                                                                     \\\r\n        if( ( xCoreID ) == ( BaseType_t ) portGET_CORE_ID() )                                \\\r\n        {                                                                                    \\\r\n            /* Pending a yield for this core since it is in the critical section. */         \\\r\n            xYieldPendings[ ( xCoreID ) ] = pdTRUE;                                          \\\r\n        }                                                                                    \\\r\n        else                                                                                 \\\r\n        {                                                                                    \\\r\n            /* Request other core to yield if it is not requested before. */                 \\\r\n            if( pxCurrentTCBs[ ( xCoreID ) ]->xTaskRunState != taskTASK_SCHEDULED_TO_YIELD ) \\\r\n            {                                                                                \\\r\n                portYIELD_CORE( xCoreID );                                                   \\\r\n                pxCurrentTCBs[ ( xCoreID ) ]->xTaskRunState = taskTASK_SCHEDULED_TO_YIELD;   \\\r\n            }                                                                                \\\r\n        }                                                                                    \\\r\n    } while( 0 )\r\n#endif /* #if ( configNUMBER_OF_CORES > 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n/*\r\n * Task control block.  A task control block (TCB) is allocated for each task,\r\n * and stores task state information, including a pointer to the task's context\r\n * (the task's run time environment, including register values)\r\n */\r\ntypedef struct tskTaskControlBlock       /* The old naming convention is used to prevent breaking kernel aware debuggers. */\r\n{\r\n    volatile StackType_t * pxTopOfStack; /**< Points to the location of the last item placed on the tasks stack.  THIS MUST BE THE FIRST MEMBER OF THE TCB STRUCT. */\r\n\r\n    #if ( portUSING_MPU_WRAPPERS == 1 )\r\n        xMPU_SETTINGS xMPUSettings; /**< The MPU settings are defined as part of the port layer.  THIS MUST BE THE SECOND MEMBER OF THE TCB STRUCT. */\r\n    #endif\r\n\r\n    #if ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 )\r\n        UBaseType_t uxCoreAffinityMask; /**< Used to link the task to certain cores.  UBaseType_t must have greater than or equal to the number of bits as configNUMBER_OF_CORES. */\r\n    #endif\r\n\r\n    ListItem_t xStateListItem;                  /**< The list that the state list item of a task is reference from denotes the state of that task (Ready, Blocked, Suspended ). */\r\n    ListItem_t xEventListItem;                  /**< Used to reference a task from an event list. */\r\n    UBaseType_t uxPriority;                     /**< The priority of the task.  0 is the lowest priority. */\r\n    StackType_t * pxStack;                      /**< Points to the start of the stack. */\r\n    #if ( configNUMBER_OF_CORES > 1 )\r\n        volatile BaseType_t xTaskRunState;      /**< Used to identify the core the task is running on, if the task is running. Otherwise, identifies the task's state - not running or yielding. */\r\n        UBaseType_t uxTaskAttributes;           /**< Task's attributes - currently used to identify the idle tasks. */\r\n    #endif\r\n    char pcTaskName[ configMAX_TASK_NAME_LEN ]; /**< Descriptive name given to the task when created.  Facilitates debugging only. */\r\n\r\n    #if ( configUSE_TASK_PREEMPTION_DISABLE == 1 )\r\n        BaseType_t xPreemptionDisable; /**< Used to prevent the task from being preempted. */\r\n    #endif\r\n\r\n    #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) )\r\n        StackType_t * pxEndOfStack; /**< Points to the highest valid address for the stack. */\r\n    #endif\r\n\r\n    #if ( portCRITICAL_NESTING_IN_TCB == 1 )\r\n        UBaseType_t uxCriticalNesting; /**< Holds the critical section nesting depth for ports that do not maintain their own count in the port layer. */\r\n    #endif\r\n\r\n    #if ( configUSE_TRACE_FACILITY == 1 )\r\n        UBaseType_t uxTCBNumber;  /**< Stores a number that increments each time a TCB is created.  It allows debuggers to determine when a task has been deleted and then recreated. */\r\n        UBaseType_t uxTaskNumber; /**< Stores a number specifically for use by third party trace code. */\r\n    #endif\r\n\r\n    #if ( configUSE_MUTEXES == 1 )\r\n        UBaseType_t uxBasePriority; /**< The priority last assigned to the task - used by the priority inheritance mechanism. */\r\n        UBaseType_t uxMutexesHeld;\r\n    #endif\r\n\r\n    #if ( configUSE_APPLICATION_TASK_TAG == 1 )\r\n        TaskHookFunction_t pxTaskTag;\r\n    #endif\r\n\r\n    #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 )\r\n        void * pvThreadLocalStoragePointers[ configNUM_THREAD_LOCAL_STORAGE_POINTERS ];\r\n    #endif\r\n\r\n    #if ( configGENERATE_RUN_TIME_STATS == 1 )\r\n        configRUN_TIME_COUNTER_TYPE ulRunTimeCounter; /**< Stores the amount of time the task has spent in the Running state. */\r\n    #endif\r\n\r\n    #if ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 )\r\n        configTLS_BLOCK_TYPE xTLSBlock; /**< Memory block used as Thread Local Storage (TLS) Block for the task. */\r\n    #endif\r\n\r\n    #if ( configUSE_TASK_NOTIFICATIONS == 1 )\r\n        volatile uint32_t ulNotifiedValue[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];\r\n        volatile uint8_t ucNotifyState[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];\r\n    #endif\r\n\r\n    /* See the comments in FreeRTOS.h with the definition of\r\n     * tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */\r\n    #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )\r\n        uint8_t ucStaticallyAllocated; /**< Set to pdTRUE if the task is a statically allocated to ensure no attempt is made to free the memory. */\r\n    #endif\r\n\r\n    #if ( INCLUDE_xTaskAbortDelay == 1 )\r\n        uint8_t ucDelayAborted;\r\n    #endif\r\n\r\n    #if ( configUSE_POSIX_ERRNO == 1 )\r\n        int iTaskErrno;\r\n    #endif\r\n} tskTCB;\r\n\r\n/* The old tskTCB name is maintained above then typedefed to the new TCB_t name\r\n * below to enable the use of older kernel aware debuggers. */\r\ntypedef tskTCB TCB_t;\r\n\r\n#if ( configNUMBER_OF_CORES == 1 )\r\n    /* MISRA Ref 8.4.1 [Declaration shall be visible] */\r\n    /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-84 */\r\n    /* coverity[misra_c_2012_rule_8_4_violation] */\r\n    portDONT_DISCARD PRIVILEGED_DATA TCB_t * volatile pxCurrentTCB = NULL;\r\n#else\r\n    /* MISRA Ref 8.4.1 [Declaration shall be visible] */\r\n    /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-84 */\r\n    /* coverity[misra_c_2012_rule_8_4_violation] */\r\n    portDONT_DISCARD PRIVILEGED_DATA TCB_t * volatile pxCurrentTCBs[ configNUMBER_OF_CORES ];\r\n    #define pxCurrentTCB    xTaskGetCurrentTaskHandle()\r\n#endif\r\n\r\n/* Lists for ready and blocked tasks. --------------------\r\n * xDelayedTaskList1 and xDelayedTaskList2 could be moved to function scope but\r\n * doing so breaks some kernel aware debuggers and debuggers that rely on removing\r\n * the static qualifier. */\r\nPRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ]; /**< Prioritised ready tasks. */\r\nPRIVILEGED_DATA static List_t xDelayedTaskList1;                         /**< Delayed tasks. */\r\nPRIVILEGED_DATA static List_t xDelayedTaskList2;                         /**< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */\r\nPRIVILEGED_DATA static List_t * volatile pxDelayedTaskList;              /**< Points to the delayed task list currently being used. */\r\nPRIVILEGED_DATA static List_t * volatile pxOverflowDelayedTaskList;      /**< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */\r\nPRIVILEGED_DATA static List_t xPendingReadyList;                         /**< Tasks that have been readied while the scheduler was suspended.  They will be moved to the ready list when the scheduler is resumed. */\r\n\r\n#if ( INCLUDE_vTaskDelete == 1 )\r\n\r\n    PRIVILEGED_DATA static List_t xTasksWaitingTermination; /**< Tasks that have been deleted - but their memory not yet freed. */\r\n    PRIVILEGED_DATA static volatile UBaseType_t uxDeletedTasksWaitingCleanUp = ( UBaseType_t ) 0U;\r\n\r\n#endif\r\n\r\n#if ( INCLUDE_vTaskSuspend == 1 )\r\n\r\n    PRIVILEGED_DATA static List_t xSuspendedTaskList; /**< Tasks that are currently suspended. */\r\n\r\n#endif\r\n\r\n/* Global POSIX errno. Its value is changed upon context switching to match\r\n * the errno of the currently running task. */\r\n#if ( configUSE_POSIX_ERRNO == 1 )\r\n    int FreeRTOS_errno = 0;\r\n#endif\r\n\r\n/* Other file private variables. --------------------------------*/\r\nPRIVILEGED_DATA static volatile UBaseType_t uxCurrentNumberOfTasks = ( UBaseType_t ) 0U;\r\nPRIVILEGED_DATA static volatile TickType_t xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT;\r\nPRIVILEGED_DATA static volatile UBaseType_t uxTopReadyPriority = tskIDLE_PRIORITY;\r\nPRIVILEGED_DATA static volatile BaseType_t xSchedulerRunning = pdFALSE;\r\nPRIVILEGED_DATA static volatile TickType_t xPendedTicks = ( TickType_t ) 0U;\r\nPRIVILEGED_DATA static volatile BaseType_t xYieldPendings[ configNUMBER_OF_CORES ] = { pdFALSE };\r\nPRIVILEGED_DATA static volatile BaseType_t xNumOfOverflows = ( BaseType_t ) 0;\r\nPRIVILEGED_DATA static UBaseType_t uxTaskNumber = ( UBaseType_t ) 0U;\r\nPRIVILEGED_DATA static volatile TickType_t xNextTaskUnblockTime = ( TickType_t ) 0U; /* Initialised to portMAX_DELAY before the scheduler starts. */\r\nPRIVILEGED_DATA static TaskHandle_t xIdleTaskHandles[ configNUMBER_OF_CORES ];       /**< Holds the handles of the idle tasks.  The idle tasks are created automatically when the scheduler is started. */\r\n\r\n/* Improve support for OpenOCD. The kernel tracks Ready tasks via priority lists.\r\n * For tracking the state of remote threads, OpenOCD uses uxTopUsedPriority\r\n * to determine the number of priority lists to read back from the remote target. */\r\nstatic const volatile UBaseType_t uxTopUsedPriority = configMAX_PRIORITIES - 1U;\r\n\r\n/* Context switches are held pending while the scheduler is suspended.  Also,\r\n * interrupts must not manipulate the xStateListItem of a TCB, or any of the\r\n * lists the xStateListItem can be referenced from, if the scheduler is suspended.\r\n * If an interrupt needs to unblock a task while the scheduler is suspended then it\r\n * moves the task's event list item into the xPendingReadyList, ready for the\r\n * kernel to move the task from the pending ready list into the real ready list\r\n * when the scheduler is unsuspended.  The pending ready list itself can only be\r\n * accessed from a critical section.\r\n *\r\n * Updates to uxSchedulerSuspended must be protected by both the task lock and the ISR lock\r\n * and must not be done from an ISR. Reads must be protected by either lock and may be done\r\n * from either an ISR or a task. */\r\nPRIVILEGED_DATA static volatile UBaseType_t uxSchedulerSuspended = ( UBaseType_t ) 0U;\r\n\r\n#if ( configGENERATE_RUN_TIME_STATS == 1 )\r\n\r\n/* Do not move these variables to function scope as doing so prevents the\r\n * code working with debuggers that need to remove the static qualifier. */\r\nPRIVILEGED_DATA static configRUN_TIME_COUNTER_TYPE ulTaskSwitchedInTime[ configNUMBER_OF_CORES ] = { 0U };    /**< Holds the value of a timer/counter the last time a task was switched in. */\r\nPRIVILEGED_DATA static volatile configRUN_TIME_COUNTER_TYPE ulTotalRunTime[ configNUMBER_OF_CORES ] = { 0U }; /**< Holds the total amount of execution time as defined by the run time counter clock. */\r\n\r\n#endif\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n/* File private functions. --------------------------------*/\r\n\r\n/*\r\n * Creates the idle tasks during scheduler start.\r\n */\r\nstatic BaseType_t prvCreateIdleTasks( void );\r\n\r\n#if ( configNUMBER_OF_CORES > 1 )\r\n\r\n/*\r\n * Checks to see if another task moved the current task out of the ready\r\n * list while it was waiting to enter a critical section and yields, if so.\r\n */\r\n    static void prvCheckForRunStateChange( void );\r\n#endif /* #if ( configNUMBER_OF_CORES > 1 ) */\r\n\r\n#if ( configNUMBER_OF_CORES > 1 )\r\n\r\n/*\r\n * Yields a core, or cores if multiple priorities are not allowed to run\r\n * simultaneously, to allow the task pxTCB to run.\r\n */\r\n    static void prvYieldForTask( const TCB_t * pxTCB );\r\n#endif /* #if ( configNUMBER_OF_CORES > 1 ) */\r\n\r\n#if ( configNUMBER_OF_CORES > 1 )\r\n\r\n/*\r\n * Selects the highest priority available task for the given core.\r\n */\r\n    static void prvSelectHighestPriorityTask( BaseType_t xCoreID );\r\n#endif /* #if ( configNUMBER_OF_CORES > 1 ) */\r\n\r\n/**\r\n * Utility task that simply returns pdTRUE if the task referenced by xTask is\r\n * currently in the Suspended state, or pdFALSE if the task referenced by xTask\r\n * is in any other state.\r\n */\r\n#if ( INCLUDE_vTaskSuspend == 1 )\r\n\r\n    static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;\r\n\r\n#endif /* INCLUDE_vTaskSuspend */\r\n\r\n/*\r\n * Utility to ready all the lists used by the scheduler.  This is called\r\n * automatically upon the creation of the first task.\r\n */\r\nstatic void prvInitialiseTaskLists( void ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * The idle task, which as all tasks is implemented as a never ending loop.\r\n * The idle task is automatically created and added to the ready lists upon\r\n * creation of the first user task.\r\n *\r\n * In the FreeRTOS SMP, configNUMBER_OF_CORES - 1 passive idle tasks are also\r\n * created to ensure that each core has an idle task to run when no other\r\n * task is available to run.\r\n *\r\n * The portTASK_FUNCTION_PROTO() macro is used to allow port/compiler specific\r\n * language extensions.  The equivalent prototype for these functions are:\r\n *\r\n * void prvIdleTask( void *pvParameters );\r\n * void prvPassiveIdleTask( void *pvParameters );\r\n *\r\n */\r\nstatic portTASK_FUNCTION_PROTO( prvIdleTask, pvParameters ) PRIVILEGED_FUNCTION;\r\n#if ( configNUMBER_OF_CORES > 1 )\r\n    static portTASK_FUNCTION_PROTO( prvPassiveIdleTask, pvParameters ) PRIVILEGED_FUNCTION;\r\n#endif\r\n\r\n/*\r\n * Utility to free all memory allocated by the scheduler to hold a TCB,\r\n * including the stack pointed to by the TCB.\r\n *\r\n * This does not free memory allocated by the task itself (i.e. memory\r\n * allocated by calls to pvPortMalloc from within the tasks application code).\r\n */\r\n#if ( INCLUDE_vTaskDelete == 1 )\r\n\r\n    static void prvDeleteTCB( TCB_t * pxTCB ) PRIVILEGED_FUNCTION;\r\n\r\n#endif\r\n\r\n/*\r\n * Used only by the idle task.  This checks to see if anything has been placed\r\n * in the list of tasks waiting to be deleted.  If so the task is cleaned up\r\n * and its TCB deleted.\r\n */\r\nstatic void prvCheckTasksWaitingTermination( void ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * The currently executing task is entering the Blocked state.  Add the task to\r\n * either the current or the overflow delayed task list.\r\n */\r\nstatic void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait,\r\n                                            const BaseType_t xCanBlockIndefinitely ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Fills an TaskStatus_t structure with information on each task that is\r\n * referenced from the pxList list (which may be a ready list, a delayed list,\r\n * a suspended list, etc.).\r\n *\r\n * THIS FUNCTION IS INTENDED FOR DEBUGGING ONLY, AND SHOULD NOT BE CALLED FROM\r\n * NORMAL APPLICATION CODE.\r\n */\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n\r\n    static UBaseType_t prvListTasksWithinSingleList( TaskStatus_t * pxTaskStatusArray,\r\n                                                     List_t * pxList,\r\n                                                     eTaskState eState ) PRIVILEGED_FUNCTION;\r\n\r\n#endif\r\n\r\n/*\r\n * Searches pxList for a task with name pcNameToQuery - returning a handle to\r\n * the task if it is found, or NULL if the task is not found.\r\n */\r\n#if ( INCLUDE_xTaskGetHandle == 1 )\r\n\r\n    static TCB_t * prvSearchForNameWithinSingleList( List_t * pxList,\r\n                                                     const char pcNameToQuery[] ) PRIVILEGED_FUNCTION;\r\n\r\n#endif\r\n\r\n/*\r\n * When a task is created, the stack of the task is filled with a known value.\r\n * This function determines the 'high water mark' of the task stack by\r\n * determining how much of the stack remains at the original preset value.\r\n */\r\n#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) )\r\n\r\n    static configSTACK_DEPTH_TYPE prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte ) PRIVILEGED_FUNCTION;\r\n\r\n#endif\r\n\r\n/*\r\n * Return the amount of time, in ticks, that will pass before the kernel will\r\n * next move a task from the Blocked state to the Running state.\r\n *\r\n * This conditional compilation should use inequality to 0, not equality to 1.\r\n * This is to ensure portSUPPRESS_TICKS_AND_SLEEP() can be called when user\r\n * defined low power mode implementations require configUSE_TICKLESS_IDLE to be\r\n * set to a value other than 1.\r\n */\r\n#if ( configUSE_TICKLESS_IDLE != 0 )\r\n\r\n    static TickType_t prvGetExpectedIdleTime( void ) PRIVILEGED_FUNCTION;\r\n\r\n#endif\r\n\r\n/*\r\n * Set xNextTaskUnblockTime to the time at which the next Blocked state task\r\n * will exit the Blocked state.\r\n */\r\nstatic void prvResetNextTaskUnblockTime( void ) PRIVILEGED_FUNCTION;\r\n\r\n#if ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 )\r\n\r\n/*\r\n * Helper function used to pad task names with spaces when printing out\r\n * human readable tables of task information.\r\n */\r\n    static char * prvWriteNameToBuffer( char * pcBuffer,\r\n                                        const char * pcTaskName ) PRIVILEGED_FUNCTION;\r\n\r\n#endif\r\n\r\n/*\r\n * Called after a Task_t structure has been allocated either statically or\r\n * dynamically to fill in the structure's members.\r\n */\r\nstatic void prvInitialiseNewTask( TaskFunction_t pxTaskCode,\r\n                                  const char * const pcName,\r\n                                  const uint32_t ulStackDepth,\r\n                                  void * const pvParameters,\r\n                                  UBaseType_t uxPriority,\r\n                                  TaskHandle_t * const pxCreatedTask,\r\n                                  TCB_t * pxNewTCB,\r\n                                  const MemoryRegion_t * const xRegions ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Called after a new task has been created and initialised to place the task\r\n * under the control of the scheduler.\r\n */\r\nstatic void prvAddNewTaskToReadyList( TCB_t * pxNewTCB ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Create a task with static buffer for both TCB and stack. Returns a handle to\r\n * the task if it is created successfully. Otherwise, returns NULL.\r\n */\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n    static TCB_t * prvCreateStaticTask( TaskFunction_t pxTaskCode,\r\n                                        const char * const pcName,\r\n                                        const uint32_t ulStackDepth,\r\n                                        void * const pvParameters,\r\n                                        UBaseType_t uxPriority,\r\n                                        StackType_t * const puxStackBuffer,\r\n                                        StaticTask_t * const pxTaskBuffer,\r\n                                        TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION;\r\n#endif /* #if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */\r\n\r\n/*\r\n * Create a restricted task with static buffer for both TCB and stack. Returns\r\n * a handle to the task if it is created successfully. Otherwise, returns NULL.\r\n */\r\n#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )\r\n    static TCB_t * prvCreateRestrictedStaticTask( const TaskParameters_t * const pxTaskDefinition,\r\n                                                  TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION;\r\n#endif /* #if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) ) */\r\n\r\n/*\r\n * Create a restricted task with static buffer for task stack and allocated buffer\r\n * for TCB. Returns a handle to the task if it is created successfully. Otherwise,\r\n * returns NULL.\r\n */\r\n#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )\r\n    static TCB_t * prvCreateRestrictedTask( const TaskParameters_t * const pxTaskDefinition,\r\n                                            TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION;\r\n#endif /* #if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) ) */\r\n\r\n/*\r\n * Create a task with allocated buffer for both TCB and stack. Returns a handle to\r\n * the task if it is created successfully. Otherwise, returns NULL.\r\n */\r\n#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r\n    static TCB_t * prvCreateTask( TaskFunction_t pxTaskCode,\r\n                                  const char * const pcName,\r\n                                  const configSTACK_DEPTH_TYPE usStackDepth,\r\n                                  void * const pvParameters,\r\n                                  UBaseType_t uxPriority,\r\n                                  TaskHandle_t * const pxCreatedTask ) PRIVILEGED_FUNCTION;\r\n#endif /* #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) */\r\n\r\n/*\r\n * freertos_tasks_c_additions_init() should only be called if the user definable\r\n * macro FREERTOS_TASKS_C_ADDITIONS_INIT() is defined, as that is the only macro\r\n * called by the function.\r\n */\r\n#ifdef FREERTOS_TASKS_C_ADDITIONS_INIT\r\n\r\n    static void freertos_tasks_c_additions_init( void ) PRIVILEGED_FUNCTION;\r\n\r\n#endif\r\n\r\n#if ( configUSE_PASSIVE_IDLE_HOOK == 1 )\r\n    extern void vApplicationPassiveIdleHook( void );\r\n#endif /* #if ( configUSE_PASSIVE_IDLE_HOOK == 1 ) */\r\n\r\n#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) )\r\n\r\n/*\r\n * Convert the snprintf return value to the number of characters\r\n * written. The following are the possible cases:\r\n *\r\n * 1. The buffer supplied to snprintf is large enough to hold the\r\n *    generated string. The return value in this case is the number\r\n *    of characters actually written, not counting the terminating\r\n *    null character.\r\n * 2. The buffer supplied to snprintf is NOT large enough to hold\r\n *    the generated string. The return value in this case is the\r\n *    number of characters that would have been written if the\r\n *    buffer had been sufficiently large, not counting the\r\n *    terminating null character.\r\n * 3. Encoding error. The return value in this case is a negative\r\n *    number.\r\n *\r\n * From 1 and 2 above ==> Only when the return value is non-negative\r\n * and less than the supplied buffer length, the string has been\r\n * completely written.\r\n */\r\n    static size_t prvSnprintfReturnValueToCharsWritten( int iSnprintfReturnValue,\r\n                                                        size_t n );\r\n\r\n#endif /* #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configNUMBER_OF_CORES > 1 )\r\n    static void prvCheckForRunStateChange( void )\r\n    {\r\n        UBaseType_t uxPrevCriticalNesting;\r\n        const TCB_t * pxThisTCB;\r\n\r\n        /* This must only be called from within a task. */\r\n        portASSERT_IF_IN_ISR();\r\n\r\n        /* This function is always called with interrupts disabled\r\n         * so this is safe. */\r\n        pxThisTCB = pxCurrentTCBs[ portGET_CORE_ID() ];\r\n\r\n        while( pxThisTCB->xTaskRunState == taskTASK_SCHEDULED_TO_YIELD )\r\n        {\r\n            /* We are only here if we just entered a critical section\r\n            * or if we just suspended the scheduler, and another task\r\n            * has requested that we yield.\r\n            *\r\n            * This is slightly complicated since we need to save and restore\r\n            * the suspension and critical nesting counts, as well as release\r\n            * and reacquire the correct locks. And then, do it all over again\r\n            * if our state changed again during the reacquisition. */\r\n            uxPrevCriticalNesting = portGET_CRITICAL_NESTING_COUNT();\r\n\r\n            if( uxPrevCriticalNesting > 0U )\r\n            {\r\n                portSET_CRITICAL_NESTING_COUNT( 0U );\r\n                portRELEASE_ISR_LOCK();\r\n            }\r\n            else\r\n            {\r\n                /* The scheduler is suspended. uxSchedulerSuspended is updated\r\n                 * only when the task is not requested to yield. */\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n\r\n            portRELEASE_TASK_LOCK();\r\n            portMEMORY_BARRIER();\r\n            configASSERT( pxThisTCB->xTaskRunState == taskTASK_SCHEDULED_TO_YIELD );\r\n\r\n            portENABLE_INTERRUPTS();\r\n\r\n            /* Enabling interrupts should cause this core to immediately\r\n             * service the pending interrupt and yield. If the run state is still\r\n             * yielding here then that is a problem. */\r\n            configASSERT( pxThisTCB->xTaskRunState != taskTASK_SCHEDULED_TO_YIELD );\r\n\r\n            portDISABLE_INTERRUPTS();\r\n            portGET_TASK_LOCK();\r\n            portGET_ISR_LOCK();\r\n\r\n            portSET_CRITICAL_NESTING_COUNT( uxPrevCriticalNesting );\r\n\r\n            if( uxPrevCriticalNesting == 0U )\r\n            {\r\n                portRELEASE_ISR_LOCK();\r\n            }\r\n        }\r\n    }\r\n#endif /* #if ( configNUMBER_OF_CORES > 1 ) */\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configNUMBER_OF_CORES > 1 )\r\n    static void prvYieldForTask( const TCB_t * pxTCB )\r\n    {\r\n        BaseType_t xLowestPriorityToPreempt;\r\n        BaseType_t xCurrentCoreTaskPriority;\r\n        BaseType_t xLowestPriorityCore = ( BaseType_t ) -1;\r\n        BaseType_t xCoreID;\r\n\r\n        #if ( configRUN_MULTIPLE_PRIORITIES == 0 )\r\n            BaseType_t xYieldCount = 0;\r\n        #endif /* #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) */\r\n\r\n        /* This must be called from a critical section. */\r\n        configASSERT( portGET_CRITICAL_NESTING_COUNT() > 0U );\r\n\r\n        #if ( configRUN_MULTIPLE_PRIORITIES == 0 )\r\n\r\n            /* No task should yield for this one if it is a lower priority\r\n             * than priority level of currently ready tasks. */\r\n            if( pxTCB->uxPriority >= uxTopReadyPriority )\r\n        #else\r\n            /* Yield is not required for a task which is already running. */\r\n            if( taskTASK_IS_RUNNING( pxTCB ) == pdFALSE )\r\n        #endif\r\n        {\r\n            xLowestPriorityToPreempt = ( BaseType_t ) pxTCB->uxPriority;\r\n\r\n            /* xLowestPriorityToPreempt will be decremented to -1 if the priority of pxTCB\r\n             * is 0. This is ok as we will give system idle tasks a priority of -1 below. */\r\n            --xLowestPriorityToPreempt;\r\n\r\n            for( xCoreID = ( BaseType_t ) 0; xCoreID < ( BaseType_t ) configNUMBER_OF_CORES; xCoreID++ )\r\n            {\r\n                xCurrentCoreTaskPriority = ( BaseType_t ) pxCurrentTCBs[ xCoreID ]->uxPriority;\r\n\r\n                /* System idle tasks are being assigned a priority of tskIDLE_PRIORITY - 1 here. */\r\n                if( ( pxCurrentTCBs[ xCoreID ]->uxTaskAttributes & taskATTRIBUTE_IS_IDLE ) != 0U )\r\n                {\r\n                    xCurrentCoreTaskPriority = xCurrentCoreTaskPriority - 1;\r\n                }\r\n\r\n                if( ( taskTASK_IS_RUNNING( pxCurrentTCBs[ xCoreID ] ) != pdFALSE ) && ( xYieldPendings[ xCoreID ] == pdFALSE ) )\r\n                {\r\n                    #if ( configRUN_MULTIPLE_PRIORITIES == 0 )\r\n                        if( taskTASK_IS_RUNNING( pxTCB ) == pdFALSE )\r\n                    #endif\r\n                    {\r\n                        if( xCurrentCoreTaskPriority <= xLowestPriorityToPreempt )\r\n                        {\r\n                            #if ( configUSE_CORE_AFFINITY == 1 )\r\n                                if( ( pxTCB->uxCoreAffinityMask & ( ( UBaseType_t ) 1U << ( UBaseType_t ) xCoreID ) ) != 0U )\r\n                            #endif\r\n                            {\r\n                                #if ( configUSE_TASK_PREEMPTION_DISABLE == 1 )\r\n                                    if( pxCurrentTCBs[ xCoreID ]->xPreemptionDisable == pdFALSE )\r\n                                #endif\r\n                                {\r\n                                    xLowestPriorityToPreempt = xCurrentCoreTaskPriority;\r\n                                    xLowestPriorityCore = xCoreID;\r\n                                }\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n                    }\r\n\r\n                    #if ( configRUN_MULTIPLE_PRIORITIES == 0 )\r\n                    {\r\n                        /* Yield all currently running non-idle tasks with a priority lower than\r\n                         * the task that needs to run. */\r\n                        if( ( xCurrentCoreTaskPriority > ( ( BaseType_t ) tskIDLE_PRIORITY - 1 ) ) &&\r\n                            ( xCurrentCoreTaskPriority < ( BaseType_t ) pxTCB->uxPriority ) )\r\n                        {\r\n                            prvYieldCore( xCoreID );\r\n                            xYieldCount++;\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n                    }\r\n                    #endif /* #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) */\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n\r\n            #if ( configRUN_MULTIPLE_PRIORITIES == 0 )\r\n                if( ( xYieldCount == 0 ) && ( xLowestPriorityCore >= 0 ) )\r\n            #else /* #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) */\r\n                if( xLowestPriorityCore >= 0 )\r\n            #endif /* #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) */\r\n            {\r\n                prvYieldCore( xLowestPriorityCore );\r\n            }\r\n\r\n            #if ( configRUN_MULTIPLE_PRIORITIES == 0 )\r\n                /* Verify that the calling core always yields to higher priority tasks. */\r\n                if( ( ( pxCurrentTCBs[ portGET_CORE_ID() ]->uxTaskAttributes & taskATTRIBUTE_IS_IDLE ) == 0U ) &&\r\n                    ( pxTCB->uxPriority > pxCurrentTCBs[ portGET_CORE_ID() ]->uxPriority ) )\r\n                {\r\n                    configASSERT( ( xYieldPendings[ portGET_CORE_ID() ] == pdTRUE ) ||\r\n                                  ( taskTASK_IS_RUNNING( pxCurrentTCBs[ portGET_CORE_ID() ] ) == pdFALSE ) );\r\n                }\r\n            #endif\r\n        }\r\n    }\r\n#endif /* #if ( configNUMBER_OF_CORES > 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configNUMBER_OF_CORES > 1 )\r\n    static void prvSelectHighestPriorityTask( BaseType_t xCoreID )\r\n    {\r\n        UBaseType_t uxCurrentPriority = uxTopReadyPriority;\r\n        BaseType_t xTaskScheduled = pdFALSE;\r\n        BaseType_t xDecrementTopPriority = pdTRUE;\r\n\r\n        #if ( configUSE_CORE_AFFINITY == 1 )\r\n            const TCB_t * pxPreviousTCB = NULL;\r\n        #endif\r\n        #if ( configRUN_MULTIPLE_PRIORITIES == 0 )\r\n            BaseType_t xPriorityDropped = pdFALSE;\r\n        #endif\r\n\r\n        /* This function should be called when scheduler is running. */\r\n        configASSERT( xSchedulerRunning == pdTRUE );\r\n\r\n        /* A new task is created and a running task with the same priority yields\r\n         * itself to run the new task. When a running task yields itself, it is still\r\n         * in the ready list. This running task will be selected before the new task\r\n         * since the new task is always added to the end of the ready list.\r\n         * The other problem is that the running task still in the same position of\r\n         * the ready list when it yields itself. It is possible that it will be selected\r\n         * earlier then other tasks which waits longer than this task.\r\n         *\r\n         * To fix these problems, the running task should be put to the end of the\r\n         * ready list before searching for the ready task in the ready list. */\r\n        if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxCurrentTCBs[ xCoreID ]->uxPriority ] ),\r\n                                     &pxCurrentTCBs[ xCoreID ]->xStateListItem ) == pdTRUE )\r\n        {\r\n            ( void ) uxListRemove( &pxCurrentTCBs[ xCoreID ]->xStateListItem );\r\n            vListInsertEnd( &( pxReadyTasksLists[ pxCurrentTCBs[ xCoreID ]->uxPriority ] ),\r\n                            &pxCurrentTCBs[ xCoreID ]->xStateListItem );\r\n        }\r\n\r\n        while( xTaskScheduled == pdFALSE )\r\n        {\r\n            #if ( configRUN_MULTIPLE_PRIORITIES == 0 )\r\n            {\r\n                if( uxCurrentPriority < uxTopReadyPriority )\r\n                {\r\n                    /* We can't schedule any tasks, other than idle, that have a\r\n                     * priority lower than the priority of a task currently running\r\n                     * on another core. */\r\n                    uxCurrentPriority = tskIDLE_PRIORITY;\r\n                }\r\n            }\r\n            #endif\r\n\r\n            if( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxCurrentPriority ] ) ) == pdFALSE )\r\n            {\r\n                const List_t * const pxReadyList = &( pxReadyTasksLists[ uxCurrentPriority ] );\r\n                const ListItem_t * pxEndMarker = listGET_END_MARKER( pxReadyList );\r\n                ListItem_t * pxIterator;\r\n\r\n                /* The ready task list for uxCurrentPriority is not empty, so uxTopReadyPriority\r\n                 * must not be decremented any further. */\r\n                xDecrementTopPriority = pdFALSE;\r\n\r\n                for( pxIterator = listGET_HEAD_ENTRY( pxReadyList ); pxIterator != pxEndMarker; pxIterator = listGET_NEXT( pxIterator ) )\r\n                {\r\n                    /* MISRA Ref 11.5.3 [Void pointer assignment] */\r\n                    /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n                    /* coverity[misra_c_2012_rule_11_5_violation] */\r\n                    TCB_t * pxTCB = ( TCB_t * ) listGET_LIST_ITEM_OWNER( pxIterator );\r\n\r\n                    #if ( configRUN_MULTIPLE_PRIORITIES == 0 )\r\n                    {\r\n                        /* When falling back to the idle priority because only one priority\r\n                         * level is allowed to run at a time, we should ONLY schedule the true\r\n                         * idle tasks, not user tasks at the idle priority. */\r\n                        if( uxCurrentPriority < uxTopReadyPriority )\r\n                        {\r\n                            if( ( pxTCB->uxTaskAttributes & taskATTRIBUTE_IS_IDLE ) == 0U )\r\n                            {\r\n                                continue;\r\n                            }\r\n                        }\r\n                    }\r\n                    #endif /* #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) */\r\n\r\n                    if( pxTCB->xTaskRunState == taskTASK_NOT_RUNNING )\r\n                    {\r\n                        #if ( configUSE_CORE_AFFINITY == 1 )\r\n                            if( ( pxTCB->uxCoreAffinityMask & ( ( UBaseType_t ) 1U << ( UBaseType_t ) xCoreID ) ) != 0U )\r\n                        #endif\r\n                        {\r\n                            /* If the task is not being executed by any core swap it in. */\r\n                            pxCurrentTCBs[ xCoreID ]->xTaskRunState = taskTASK_NOT_RUNNING;\r\n                            #if ( configUSE_CORE_AFFINITY == 1 )\r\n                                pxPreviousTCB = pxCurrentTCBs[ xCoreID ];\r\n                            #endif\r\n                            pxTCB->xTaskRunState = xCoreID;\r\n                            pxCurrentTCBs[ xCoreID ] = pxTCB;\r\n                            xTaskScheduled = pdTRUE;\r\n                        }\r\n                    }\r\n                    else if( pxTCB == pxCurrentTCBs[ xCoreID ] )\r\n                    {\r\n                        configASSERT( ( pxTCB->xTaskRunState == xCoreID ) || ( pxTCB->xTaskRunState == taskTASK_SCHEDULED_TO_YIELD ) );\r\n\r\n                        #if ( configUSE_CORE_AFFINITY == 1 )\r\n                            if( ( pxTCB->uxCoreAffinityMask & ( ( UBaseType_t ) 1U << ( UBaseType_t ) xCoreID ) ) != 0U )\r\n                        #endif\r\n                        {\r\n                            /* The task is already running on this core, mark it as scheduled. */\r\n                            pxTCB->xTaskRunState = xCoreID;\r\n                            xTaskScheduled = pdTRUE;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        /* This task is running on the core other than xCoreID. */\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n\r\n                    if( xTaskScheduled != pdFALSE )\r\n                    {\r\n                        /* A task has been selected to run on this core. */\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if( xDecrementTopPriority != pdFALSE )\r\n                {\r\n                    uxTopReadyPriority--;\r\n                    #if ( configRUN_MULTIPLE_PRIORITIES == 0 )\r\n                    {\r\n                        xPriorityDropped = pdTRUE;\r\n                    }\r\n                    #endif\r\n                }\r\n            }\r\n\r\n            /* There are configNUMBER_OF_CORES Idle tasks created when scheduler started.\r\n             * The scheduler should be able to select a task to run when uxCurrentPriority\r\n             * is tskIDLE_PRIORITY. uxCurrentPriority is never decreased to value blow\r\n             * tskIDLE_PRIORITY. */\r\n            if( uxCurrentPriority > tskIDLE_PRIORITY )\r\n            {\r\n                uxCurrentPriority--;\r\n            }\r\n            else\r\n            {\r\n                /* This function is called when idle task is not created. Break the\r\n                 * loop to prevent uxCurrentPriority overrun. */\r\n                break;\r\n            }\r\n        }\r\n\r\n        #if ( configRUN_MULTIPLE_PRIORITIES == 0 )\r\n        {\r\n            if( xTaskScheduled == pdTRUE )\r\n            {\r\n                if( xPriorityDropped != pdFALSE )\r\n                {\r\n                    /* There may be several ready tasks that were being prevented from running because there was\r\n                     * a higher priority task running. Now that the last of the higher priority tasks is no longer\r\n                     * running, make sure all the other idle tasks yield. */\r\n                    BaseType_t x;\r\n\r\n                    for( x = ( BaseType_t ) 0; x < ( BaseType_t ) configNUMBER_OF_CORES; x++ )\r\n                    {\r\n                        if( ( pxCurrentTCBs[ x ]->uxTaskAttributes & taskATTRIBUTE_IS_IDLE ) != 0U )\r\n                        {\r\n                            prvYieldCore( x );\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        #endif /* #if ( configRUN_MULTIPLE_PRIORITIES == 0 ) */\r\n\r\n        #if ( configUSE_CORE_AFFINITY == 1 )\r\n        {\r\n            if( xTaskScheduled == pdTRUE )\r\n            {\r\n                if( ( pxPreviousTCB != NULL ) && ( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxPreviousTCB->uxPriority ] ), &( pxPreviousTCB->xStateListItem ) ) != pdFALSE ) )\r\n                {\r\n                    /* A ready task was just evicted from this core. See if it can be\r\n                     * scheduled on any other core. */\r\n                    UBaseType_t uxCoreMap = pxPreviousTCB->uxCoreAffinityMask;\r\n                    BaseType_t xLowestPriority = ( BaseType_t ) pxPreviousTCB->uxPriority;\r\n                    BaseType_t xLowestPriorityCore = -1;\r\n                    BaseType_t x;\r\n\r\n                    if( ( pxPreviousTCB->uxTaskAttributes & taskATTRIBUTE_IS_IDLE ) != 0U )\r\n                    {\r\n                        xLowestPriority = xLowestPriority - 1;\r\n                    }\r\n\r\n                    if( ( uxCoreMap & ( ( UBaseType_t ) 1U << ( UBaseType_t ) xCoreID ) ) != 0U )\r\n                    {\r\n                        /* pxPreviousTCB was removed from this core and this core is not excluded\r\n                         * from it's core affinity mask.\r\n                         *\r\n                         * pxPreviousTCB is preempted by the new higher priority task\r\n                         * pxCurrentTCBs[ xCoreID ]. When searching a new core for pxPreviousTCB,\r\n                         * we do not need to look at the cores on which pxCurrentTCBs[ xCoreID ]\r\n                         * is allowed to run. The reason is - when more than one cores are\r\n                         * eligible for an incoming task, we preempt the core with the minimum\r\n                         * priority task. Because this core (i.e. xCoreID) was preempted for\r\n                         * pxCurrentTCBs[ xCoreID ], this means that all the others cores\r\n                         * where pxCurrentTCBs[ xCoreID ] can run, are running tasks with priority\r\n                         * no lower than pxPreviousTCB's priority. Therefore, the only cores where\r\n                         * which can be preempted for pxPreviousTCB are the ones where\r\n                         * pxCurrentTCBs[ xCoreID ] is not allowed to run (and obviously,\r\n                         * pxPreviousTCB is allowed to run).\r\n                         *\r\n                         * This is an optimization which reduces the number of cores needed to be\r\n                         * searched for pxPreviousTCB to run. */\r\n                        uxCoreMap &= ~( pxCurrentTCBs[ xCoreID ]->uxCoreAffinityMask );\r\n                    }\r\n                    else\r\n                    {\r\n                        /* pxPreviousTCB's core affinity mask is changed and it is no longer\r\n                         * allowed to run on this core. Searching all the cores in pxPreviousTCB's\r\n                         * new core affinity mask to find a core on which it can run. */\r\n                    }\r\n\r\n                    uxCoreMap &= ( ( 1U << configNUMBER_OF_CORES ) - 1U );\r\n\r\n                    for( x = ( ( BaseType_t ) configNUMBER_OF_CORES - 1 ); x >= ( BaseType_t ) 0; x-- )\r\n                    {\r\n                        UBaseType_t uxCore = ( UBaseType_t ) x;\r\n                        BaseType_t xTaskPriority;\r\n\r\n                        if( ( uxCoreMap & ( ( UBaseType_t ) 1U << uxCore ) ) != 0U )\r\n                        {\r\n                            xTaskPriority = ( BaseType_t ) pxCurrentTCBs[ uxCore ]->uxPriority;\r\n\r\n                            if( ( pxCurrentTCBs[ uxCore ]->uxTaskAttributes & taskATTRIBUTE_IS_IDLE ) != 0U )\r\n                            {\r\n                                xTaskPriority = xTaskPriority - ( BaseType_t ) 1;\r\n                            }\r\n\r\n                            uxCoreMap &= ~( ( UBaseType_t ) 1U << uxCore );\r\n\r\n                            if( ( xTaskPriority < xLowestPriority ) &&\r\n                                ( taskTASK_IS_RUNNING( pxCurrentTCBs[ uxCore ] ) != pdFALSE ) &&\r\n                                ( xYieldPendings[ uxCore ] == pdFALSE ) )\r\n                            {\r\n                                #if ( configUSE_TASK_PREEMPTION_DISABLE == 1 )\r\n                                    if( pxCurrentTCBs[ uxCore ]->xPreemptionDisable == pdFALSE )\r\n                                #endif\r\n                                {\r\n                                    xLowestPriority = xTaskPriority;\r\n                                    xLowestPriorityCore = ( BaseType_t ) uxCore;\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if( xLowestPriorityCore >= 0 )\r\n                    {\r\n                        prvYieldCore( xLowestPriorityCore );\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        #endif /* #if ( configUSE_CORE_AFFINITY == 1 ) */\r\n    }\r\n\r\n#endif /* ( configNUMBER_OF_CORES > 1 ) */\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n\r\n    static TCB_t * prvCreateStaticTask( TaskFunction_t pxTaskCode,\r\n                                        const char * const pcName,\r\n                                        const uint32_t ulStackDepth,\r\n                                        void * const pvParameters,\r\n                                        UBaseType_t uxPriority,\r\n                                        StackType_t * const puxStackBuffer,\r\n                                        StaticTask_t * const pxTaskBuffer,\r\n                                        TaskHandle_t * const pxCreatedTask )\r\n    {\r\n        TCB_t * pxNewTCB;\r\n\r\n        configASSERT( puxStackBuffer != NULL );\r\n        configASSERT( pxTaskBuffer != NULL );\r\n\r\n        #if ( configASSERT_DEFINED == 1 )\r\n        {\r\n            /* Sanity check that the size of the structure used to declare a\r\n             * variable of type StaticTask_t equals the size of the real task\r\n             * structure. */\r\n            volatile size_t xSize = sizeof( StaticTask_t );\r\n            configASSERT( xSize == sizeof( TCB_t ) );\r\n            ( void ) xSize; /* Prevent unused variable warning when configASSERT() is not used. */\r\n        }\r\n        #endif /* configASSERT_DEFINED */\r\n\r\n        if( ( pxTaskBuffer != NULL ) && ( puxStackBuffer != NULL ) )\r\n        {\r\n            /* The memory used for the task's TCB and stack are passed into this\r\n             * function - use them. */\r\n            /* MISRA Ref 11.3.1 [Misaligned access] */\r\n            /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */\r\n            /* coverity[misra_c_2012_rule_11_3_violation] */\r\n            pxNewTCB = ( TCB_t * ) pxTaskBuffer;\r\n            ( void ) memset( ( void * ) pxNewTCB, 0x00, sizeof( TCB_t ) );\r\n            pxNewTCB->pxStack = ( StackType_t * ) puxStackBuffer;\r\n\r\n            #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )\r\n            {\r\n                /* Tasks can be created statically or dynamically, so note this\r\n                 * task was created statically in case the task is later deleted. */\r\n                pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB;\r\n            }\r\n            #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */\r\n\r\n            prvInitialiseNewTask( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, pxCreatedTask, pxNewTCB, NULL );\r\n        }\r\n        else\r\n        {\r\n            pxNewTCB = NULL;\r\n        }\r\n\r\n        return pxNewTCB;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,\r\n                                    const char * const pcName,\r\n                                    const uint32_t ulStackDepth,\r\n                                    void * const pvParameters,\r\n                                    UBaseType_t uxPriority,\r\n                                    StackType_t * const puxStackBuffer,\r\n                                    StaticTask_t * const pxTaskBuffer )\r\n    {\r\n        TaskHandle_t xReturn = NULL;\r\n        TCB_t * pxNewTCB;\r\n\r\n        traceENTER_xTaskCreateStatic( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer );\r\n\r\n        pxNewTCB = prvCreateStaticTask( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer, &xReturn );\r\n\r\n        if( pxNewTCB != NULL )\r\n        {\r\n            #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) )\r\n            {\r\n                /* Set the task's affinity before scheduling it. */\r\n                pxNewTCB->uxCoreAffinityMask = tskNO_AFFINITY;\r\n            }\r\n            #endif\r\n\r\n            prvAddNewTaskToReadyList( pxNewTCB );\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_xTaskCreateStatic( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) )\r\n        TaskHandle_t xTaskCreateStaticAffinitySet( TaskFunction_t pxTaskCode,\r\n                                                   const char * const pcName,\r\n                                                   const uint32_t ulStackDepth,\r\n                                                   void * const pvParameters,\r\n                                                   UBaseType_t uxPriority,\r\n                                                   StackType_t * const puxStackBuffer,\r\n                                                   StaticTask_t * const pxTaskBuffer,\r\n                                                   UBaseType_t uxCoreAffinityMask )\r\n        {\r\n            TaskHandle_t xReturn = NULL;\r\n            TCB_t * pxNewTCB;\r\n\r\n            traceENTER_xTaskCreateStaticAffinitySet( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer, uxCoreAffinityMask );\r\n\r\n            pxNewTCB = prvCreateStaticTask( pxTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer, &xReturn );\r\n\r\n            if( pxNewTCB != NULL )\r\n            {\r\n                /* Set the task's affinity before scheduling it. */\r\n                pxNewTCB->uxCoreAffinityMask = uxCoreAffinityMask;\r\n\r\n                prvAddNewTaskToReadyList( pxNewTCB );\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n\r\n            traceRETURN_xTaskCreateStaticAffinitySet( xReturn );\r\n\r\n            return xReturn;\r\n        }\r\n    #endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) */\r\n\r\n#endif /* SUPPORT_STATIC_ALLOCATION */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) )\r\n    static TCB_t * prvCreateRestrictedStaticTask( const TaskParameters_t * const pxTaskDefinition,\r\n                                                  TaskHandle_t * const pxCreatedTask )\r\n    {\r\n        TCB_t * pxNewTCB;\r\n\r\n        configASSERT( pxTaskDefinition->puxStackBuffer != NULL );\r\n        configASSERT( pxTaskDefinition->pxTaskBuffer != NULL );\r\n\r\n        if( ( pxTaskDefinition->puxStackBuffer != NULL ) && ( pxTaskDefinition->pxTaskBuffer != NULL ) )\r\n        {\r\n            /* Allocate space for the TCB.  Where the memory comes from depends\r\n             * on the implementation of the port malloc function and whether or\r\n             * not static allocation is being used. */\r\n            pxNewTCB = ( TCB_t * ) pxTaskDefinition->pxTaskBuffer;\r\n            ( void ) memset( ( void * ) pxNewTCB, 0x00, sizeof( TCB_t ) );\r\n\r\n            /* Store the stack location in the TCB. */\r\n            pxNewTCB->pxStack = pxTaskDefinition->puxStackBuffer;\r\n\r\n            #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )\r\n            {\r\n                /* Tasks can be created statically or dynamically, so note this\r\n                 * task was created statically in case the task is later deleted. */\r\n                pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_AND_TCB;\r\n            }\r\n            #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */\r\n\r\n            prvInitialiseNewTask( pxTaskDefinition->pvTaskCode,\r\n                                  pxTaskDefinition->pcName,\r\n                                  ( uint32_t ) pxTaskDefinition->usStackDepth,\r\n                                  pxTaskDefinition->pvParameters,\r\n                                  pxTaskDefinition->uxPriority,\r\n                                  pxCreatedTask, pxNewTCB,\r\n                                  pxTaskDefinition->xRegions );\r\n        }\r\n        else\r\n        {\r\n            pxNewTCB = NULL;\r\n        }\r\n\r\n        return pxNewTCB;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    BaseType_t xTaskCreateRestrictedStatic( const TaskParameters_t * const pxTaskDefinition,\r\n                                            TaskHandle_t * pxCreatedTask )\r\n    {\r\n        TCB_t * pxNewTCB;\r\n        BaseType_t xReturn;\r\n\r\n        traceENTER_xTaskCreateRestrictedStatic( pxTaskDefinition, pxCreatedTask );\r\n\r\n        configASSERT( pxTaskDefinition != NULL );\r\n\r\n        pxNewTCB = prvCreateRestrictedStaticTask( pxTaskDefinition, pxCreatedTask );\r\n\r\n        if( pxNewTCB != NULL )\r\n        {\r\n            #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) )\r\n            {\r\n                /* Set the task's affinity before scheduling it. */\r\n                pxNewTCB->uxCoreAffinityMask = tskNO_AFFINITY;\r\n            }\r\n            #endif\r\n\r\n            prvAddNewTaskToReadyList( pxNewTCB );\r\n            xReturn = pdPASS;\r\n        }\r\n        else\r\n        {\r\n            xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;\r\n        }\r\n\r\n        traceRETURN_xTaskCreateRestrictedStatic( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) )\r\n        BaseType_t xTaskCreateRestrictedStaticAffinitySet( const TaskParameters_t * const pxTaskDefinition,\r\n                                                           UBaseType_t uxCoreAffinityMask,\r\n                                                           TaskHandle_t * pxCreatedTask )\r\n        {\r\n            TCB_t * pxNewTCB;\r\n            BaseType_t xReturn;\r\n\r\n            traceENTER_xTaskCreateRestrictedStaticAffinitySet( pxTaskDefinition, uxCoreAffinityMask, pxCreatedTask );\r\n\r\n            configASSERT( pxTaskDefinition != NULL );\r\n\r\n            pxNewTCB = prvCreateRestrictedStaticTask( pxTaskDefinition, pxCreatedTask );\r\n\r\n            if( pxNewTCB != NULL )\r\n            {\r\n                /* Set the task's affinity before scheduling it. */\r\n                pxNewTCB->uxCoreAffinityMask = uxCoreAffinityMask;\r\n\r\n                prvAddNewTaskToReadyList( pxNewTCB );\r\n                xReturn = pdPASS;\r\n            }\r\n            else\r\n            {\r\n                xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;\r\n            }\r\n\r\n            traceRETURN_xTaskCreateRestrictedStaticAffinitySet( xReturn );\r\n\r\n            return xReturn;\r\n        }\r\n    #endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) */\r\n\r\n#endif /* ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( portUSING_MPU_WRAPPERS == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )\r\n    static TCB_t * prvCreateRestrictedTask( const TaskParameters_t * const pxTaskDefinition,\r\n                                            TaskHandle_t * const pxCreatedTask )\r\n    {\r\n        TCB_t * pxNewTCB;\r\n\r\n        configASSERT( pxTaskDefinition->puxStackBuffer );\r\n\r\n        if( pxTaskDefinition->puxStackBuffer != NULL )\r\n        {\r\n            /* MISRA Ref 11.5.1 [Malloc memory assignment] */\r\n            /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n            /* coverity[misra_c_2012_rule_11_5_violation] */\r\n            pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) );\r\n\r\n            if( pxNewTCB != NULL )\r\n            {\r\n                ( void ) memset( ( void * ) pxNewTCB, 0x00, sizeof( TCB_t ) );\r\n\r\n                /* Store the stack location in the TCB. */\r\n                pxNewTCB->pxStack = pxTaskDefinition->puxStackBuffer;\r\n\r\n                #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )\r\n                {\r\n                    /* Tasks can be created statically or dynamically, so note\r\n                     * this task had a statically allocated stack in case it is\r\n                     * later deleted.  The TCB was allocated dynamically. */\r\n                    pxNewTCB->ucStaticallyAllocated = tskSTATICALLY_ALLOCATED_STACK_ONLY;\r\n                }\r\n                #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */\r\n\r\n                prvInitialiseNewTask( pxTaskDefinition->pvTaskCode,\r\n                                      pxTaskDefinition->pcName,\r\n                                      ( uint32_t ) pxTaskDefinition->usStackDepth,\r\n                                      pxTaskDefinition->pvParameters,\r\n                                      pxTaskDefinition->uxPriority,\r\n                                      pxCreatedTask, pxNewTCB,\r\n                                      pxTaskDefinition->xRegions );\r\n            }\r\n        }\r\n        else\r\n        {\r\n            pxNewTCB = NULL;\r\n        }\r\n\r\n        return pxNewTCB;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    BaseType_t xTaskCreateRestricted( const TaskParameters_t * const pxTaskDefinition,\r\n                                      TaskHandle_t * pxCreatedTask )\r\n    {\r\n        TCB_t * pxNewTCB;\r\n        BaseType_t xReturn;\r\n\r\n        traceENTER_xTaskCreateRestricted( pxTaskDefinition, pxCreatedTask );\r\n\r\n        pxNewTCB = prvCreateRestrictedTask( pxTaskDefinition, pxCreatedTask );\r\n\r\n        if( pxNewTCB != NULL )\r\n        {\r\n            #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) )\r\n            {\r\n                /* Set the task's affinity before scheduling it. */\r\n                pxNewTCB->uxCoreAffinityMask = tskNO_AFFINITY;\r\n            }\r\n            #endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) */\r\n\r\n            prvAddNewTaskToReadyList( pxNewTCB );\r\n\r\n            xReturn = pdPASS;\r\n        }\r\n        else\r\n        {\r\n            xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;\r\n        }\r\n\r\n        traceRETURN_xTaskCreateRestricted( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) )\r\n        BaseType_t xTaskCreateRestrictedAffinitySet( const TaskParameters_t * const pxTaskDefinition,\r\n                                                     UBaseType_t uxCoreAffinityMask,\r\n                                                     TaskHandle_t * pxCreatedTask )\r\n        {\r\n            TCB_t * pxNewTCB;\r\n            BaseType_t xReturn;\r\n\r\n            traceENTER_xTaskCreateRestrictedAffinitySet( pxTaskDefinition, uxCoreAffinityMask, pxCreatedTask );\r\n\r\n            pxNewTCB = prvCreateRestrictedTask( pxTaskDefinition, pxCreatedTask );\r\n\r\n            if( pxNewTCB != NULL )\r\n            {\r\n                /* Set the task's affinity before scheduling it. */\r\n                pxNewTCB->uxCoreAffinityMask = uxCoreAffinityMask;\r\n\r\n                prvAddNewTaskToReadyList( pxNewTCB );\r\n\r\n                xReturn = pdPASS;\r\n            }\r\n            else\r\n            {\r\n                xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;\r\n            }\r\n\r\n            traceRETURN_xTaskCreateRestrictedAffinitySet( xReturn );\r\n\r\n            return xReturn;\r\n        }\r\n    #endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) */\r\n\r\n\r\n#endif /* portUSING_MPU_WRAPPERS */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r\n    static TCB_t * prvCreateTask( TaskFunction_t pxTaskCode,\r\n                                  const char * const pcName,\r\n                                  const configSTACK_DEPTH_TYPE usStackDepth,\r\n                                  void * const pvParameters,\r\n                                  UBaseType_t uxPriority,\r\n                                  TaskHandle_t * const pxCreatedTask )\r\n    {\r\n        TCB_t * pxNewTCB;\r\n\r\n        /* If the stack grows down then allocate the stack then the TCB so the stack\r\n         * does not grow into the TCB.  Likewise if the stack grows up then allocate\r\n         * the TCB then the stack. */\r\n        #if ( portSTACK_GROWTH > 0 )\r\n        {\r\n            /* Allocate space for the TCB.  Where the memory comes from depends on\r\n             * the implementation of the port malloc function and whether or not static\r\n             * allocation is being used. */\r\n            /* MISRA Ref 11.5.1 [Malloc memory assignment] */\r\n            /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n            /* coverity[misra_c_2012_rule_11_5_violation] */\r\n            pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) );\r\n\r\n            if( pxNewTCB != NULL )\r\n            {\r\n                ( void ) memset( ( void * ) pxNewTCB, 0x00, sizeof( TCB_t ) );\r\n\r\n                /* Allocate space for the stack used by the task being created.\r\n                 * The base of the stack memory stored in the TCB so the task can\r\n                 * be deleted later if required. */\r\n                /* MISRA Ref 11.5.1 [Malloc memory assignment] */\r\n                /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n                /* coverity[misra_c_2012_rule_11_5_violation] */\r\n                pxNewTCB->pxStack = ( StackType_t * ) pvPortMallocStack( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) );\r\n\r\n                if( pxNewTCB->pxStack == NULL )\r\n                {\r\n                    /* Could not allocate the stack.  Delete the allocated TCB. */\r\n                    vPortFree( pxNewTCB );\r\n                    pxNewTCB = NULL;\r\n                }\r\n            }\r\n        }\r\n        #else /* portSTACK_GROWTH */\r\n        {\r\n            StackType_t * pxStack;\r\n\r\n            /* Allocate space for the stack used by the task being created. */\r\n            /* MISRA Ref 11.5.1 [Malloc memory assignment] */\r\n            /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n            /* coverity[misra_c_2012_rule_11_5_violation] */\r\n            pxStack = pvPortMallocStack( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) );\r\n\r\n            if( pxStack != NULL )\r\n            {\r\n                /* Allocate space for the TCB. */\r\n                /* MISRA Ref 11.5.1 [Malloc memory assignment] */\r\n                /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n                /* coverity[misra_c_2012_rule_11_5_violation] */\r\n                pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) );\r\n\r\n                if( pxNewTCB != NULL )\r\n                {\r\n                    ( void ) memset( ( void * ) pxNewTCB, 0x00, sizeof( TCB_t ) );\r\n\r\n                    /* Store the stack location in the TCB. */\r\n                    pxNewTCB->pxStack = pxStack;\r\n                }\r\n                else\r\n                {\r\n                    /* The stack cannot be used as the TCB was not created.  Free\r\n                     * it again. */\r\n                    vPortFreeStack( pxStack );\r\n                }\r\n            }\r\n            else\r\n            {\r\n                pxNewTCB = NULL;\r\n            }\r\n        }\r\n        #endif /* portSTACK_GROWTH */\r\n\r\n        if( pxNewTCB != NULL )\r\n        {\r\n            #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )\r\n            {\r\n                /* Tasks can be created statically or dynamically, so note this\r\n                 * task was created dynamically in case it is later deleted. */\r\n                pxNewTCB->ucStaticallyAllocated = tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB;\r\n            }\r\n            #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE */\r\n\r\n            prvInitialiseNewTask( pxTaskCode, pcName, ( uint32_t ) usStackDepth, pvParameters, uxPriority, pxCreatedTask, pxNewTCB, NULL );\r\n        }\r\n\r\n        return pxNewTCB;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,\r\n                            const char * const pcName,\r\n                            const configSTACK_DEPTH_TYPE usStackDepth,\r\n                            void * const pvParameters,\r\n                            UBaseType_t uxPriority,\r\n                            TaskHandle_t * const pxCreatedTask )\r\n    {\r\n        TCB_t * pxNewTCB;\r\n        BaseType_t xReturn;\r\n\r\n        traceENTER_xTaskCreate( pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask );\r\n\r\n        pxNewTCB = prvCreateTask( pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask );\r\n\r\n        if( pxNewTCB != NULL )\r\n        {\r\n            #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) )\r\n            {\r\n                /* Set the task's affinity before scheduling it. */\r\n                pxNewTCB->uxCoreAffinityMask = tskNO_AFFINITY;\r\n            }\r\n            #endif\r\n\r\n            prvAddNewTaskToReadyList( pxNewTCB );\r\n            xReturn = pdPASS;\r\n        }\r\n        else\r\n        {\r\n            xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;\r\n        }\r\n\r\n        traceRETURN_xTaskCreate( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) )\r\n        BaseType_t xTaskCreateAffinitySet( TaskFunction_t pxTaskCode,\r\n                                           const char * const pcName,\r\n                                           const configSTACK_DEPTH_TYPE usStackDepth,\r\n                                           void * const pvParameters,\r\n                                           UBaseType_t uxPriority,\r\n                                           UBaseType_t uxCoreAffinityMask,\r\n                                           TaskHandle_t * const pxCreatedTask )\r\n        {\r\n            TCB_t * pxNewTCB;\r\n            BaseType_t xReturn;\r\n\r\n            traceENTER_xTaskCreateAffinitySet( pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, uxCoreAffinityMask, pxCreatedTask );\r\n\r\n            pxNewTCB = prvCreateTask( pxTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask );\r\n\r\n            if( pxNewTCB != NULL )\r\n            {\r\n                /* Set the task's affinity before scheduling it. */\r\n                pxNewTCB->uxCoreAffinityMask = uxCoreAffinityMask;\r\n\r\n                prvAddNewTaskToReadyList( pxNewTCB );\r\n                xReturn = pdPASS;\r\n            }\r\n            else\r\n            {\r\n                xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;\r\n            }\r\n\r\n            traceRETURN_xTaskCreateAffinitySet( xReturn );\r\n\r\n            return xReturn;\r\n        }\r\n    #endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) */\r\n\r\n#endif /* configSUPPORT_DYNAMIC_ALLOCATION */\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic void prvInitialiseNewTask( TaskFunction_t pxTaskCode,\r\n                                  const char * const pcName,\r\n                                  const uint32_t ulStackDepth,\r\n                                  void * const pvParameters,\r\n                                  UBaseType_t uxPriority,\r\n                                  TaskHandle_t * const pxCreatedTask,\r\n                                  TCB_t * pxNewTCB,\r\n                                  const MemoryRegion_t * const xRegions )\r\n{\r\n    StackType_t * pxTopOfStack;\r\n    UBaseType_t x;\r\n\r\n    #if ( portUSING_MPU_WRAPPERS == 1 )\r\n        /* Should the task be created in privileged mode? */\r\n        BaseType_t xRunPrivileged;\r\n\r\n        if( ( uxPriority & portPRIVILEGE_BIT ) != 0U )\r\n        {\r\n            xRunPrivileged = pdTRUE;\r\n        }\r\n        else\r\n        {\r\n            xRunPrivileged = pdFALSE;\r\n        }\r\n        uxPriority &= ~portPRIVILEGE_BIT;\r\n    #endif /* portUSING_MPU_WRAPPERS == 1 */\r\n\r\n    /* Avoid dependency on memset() if it is not required. */\r\n    #if ( tskSET_NEW_STACKS_TO_KNOWN_VALUE == 1 )\r\n    {\r\n        /* Fill the stack with a known value to assist debugging. */\r\n        ( void ) memset( pxNewTCB->pxStack, ( int ) tskSTACK_FILL_BYTE, ( size_t ) ulStackDepth * sizeof( StackType_t ) );\r\n    }\r\n    #endif /* tskSET_NEW_STACKS_TO_KNOWN_VALUE */\r\n\r\n    /* Calculate the top of stack address.  This depends on whether the stack\r\n     * grows from high memory to low (as per the 80x86) or vice versa.\r\n     * portSTACK_GROWTH is used to make the result positive or negative as required\r\n     * by the port. */\r\n    #if ( portSTACK_GROWTH < 0 )\r\n    {\r\n        pxTopOfStack = &( pxNewTCB->pxStack[ ulStackDepth - ( uint32_t ) 1 ] );\r\n        pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) );\r\n\r\n        /* Check the alignment of the calculated top of stack is correct. */\r\n        configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) );\r\n\r\n        #if ( configRECORD_STACK_HIGH_ADDRESS == 1 )\r\n        {\r\n            /* Also record the stack's high address, which may assist\r\n             * debugging. */\r\n            pxNewTCB->pxEndOfStack = pxTopOfStack;\r\n        }\r\n        #endif /* configRECORD_STACK_HIGH_ADDRESS */\r\n    }\r\n    #else /* portSTACK_GROWTH */\r\n    {\r\n        pxTopOfStack = pxNewTCB->pxStack;\r\n        pxTopOfStack = ( StackType_t * ) ( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) + portBYTE_ALIGNMENT_MASK ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) );\r\n\r\n        /* Check the alignment of the calculated top of stack is correct. */\r\n        configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) );\r\n\r\n        /* The other extreme of the stack space is required if stack checking is\r\n         * performed. */\r\n        pxNewTCB->pxEndOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 );\r\n    }\r\n    #endif /* portSTACK_GROWTH */\r\n\r\n    /* Store the task name in the TCB. */\r\n    if( pcName != NULL )\r\n    {\r\n        for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ )\r\n        {\r\n            pxNewTCB->pcTaskName[ x ] = pcName[ x ];\r\n\r\n            /* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than\r\n             * configMAX_TASK_NAME_LEN characters just in case the memory after the\r\n             * string is not accessible (extremely unlikely). */\r\n            if( pcName[ x ] == ( char ) 0x00 )\r\n            {\r\n                break;\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n\r\n        /* Ensure the name string is terminated in the case that the string length\r\n         * was greater or equal to configMAX_TASK_NAME_LEN. */\r\n        pxNewTCB->pcTaskName[ configMAX_TASK_NAME_LEN - 1U ] = '\\0';\r\n    }\r\n    else\r\n    {\r\n        mtCOVERAGE_TEST_MARKER();\r\n    }\r\n\r\n    /* This is used as an array index so must ensure it's not too large. */\r\n    configASSERT( uxPriority < configMAX_PRIORITIES );\r\n\r\n    if( uxPriority >= ( UBaseType_t ) configMAX_PRIORITIES )\r\n    {\r\n        uxPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U;\r\n    }\r\n    else\r\n    {\r\n        mtCOVERAGE_TEST_MARKER();\r\n    }\r\n\r\n    pxNewTCB->uxPriority = uxPriority;\r\n    #if ( configUSE_MUTEXES == 1 )\r\n    {\r\n        pxNewTCB->uxBasePriority = uxPriority;\r\n    }\r\n    #endif /* configUSE_MUTEXES */\r\n\r\n    vListInitialiseItem( &( pxNewTCB->xStateListItem ) );\r\n    vListInitialiseItem( &( pxNewTCB->xEventListItem ) );\r\n\r\n    /* Set the pxNewTCB as a link back from the ListItem_t.  This is so we can get\r\n     * back to  the containing TCB from a generic item in a list. */\r\n    listSET_LIST_ITEM_OWNER( &( pxNewTCB->xStateListItem ), pxNewTCB );\r\n\r\n    /* Event lists are always in priority order. */\r\n    listSET_LIST_ITEM_VALUE( &( pxNewTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriority );\r\n    listSET_LIST_ITEM_OWNER( &( pxNewTCB->xEventListItem ), pxNewTCB );\r\n\r\n    #if ( portUSING_MPU_WRAPPERS == 1 )\r\n    {\r\n        vPortStoreTaskMPUSettings( &( pxNewTCB->xMPUSettings ), xRegions, pxNewTCB->pxStack, ulStackDepth );\r\n    }\r\n    #else\r\n    {\r\n        /* Avoid compiler warning about unreferenced parameter. */\r\n        ( void ) xRegions;\r\n    }\r\n    #endif\r\n\r\n    #if ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 )\r\n    {\r\n        /* Allocate and initialize memory for the task's TLS Block. */\r\n        configINIT_TLS_BLOCK( pxNewTCB->xTLSBlock, pxTopOfStack );\r\n    }\r\n    #endif\r\n\r\n    /* Initialize the TCB stack to look as if the task was already running,\r\n     * but had been interrupted by the scheduler.  The return address is set\r\n     * to the start of the task function. Once the stack has been initialised\r\n     * the top of stack variable is updated. */\r\n    #if ( portUSING_MPU_WRAPPERS == 1 )\r\n    {\r\n        /* If the port has capability to detect stack overflow,\r\n         * pass the stack end address to the stack initialization\r\n         * function as well. */\r\n        #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 )\r\n        {\r\n            #if ( portSTACK_GROWTH < 0 )\r\n            {\r\n                pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxStack, pxTaskCode, pvParameters, xRunPrivileged, &( pxNewTCB->xMPUSettings ) );\r\n            }\r\n            #else /* portSTACK_GROWTH */\r\n            {\r\n                pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxEndOfStack, pxTaskCode, pvParameters, xRunPrivileged, &( pxNewTCB->xMPUSettings ) );\r\n            }\r\n            #endif /* portSTACK_GROWTH */\r\n        }\r\n        #else /* portHAS_STACK_OVERFLOW_CHECKING */\r\n        {\r\n            pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters, xRunPrivileged, &( pxNewTCB->xMPUSettings ) );\r\n        }\r\n        #endif /* portHAS_STACK_OVERFLOW_CHECKING */\r\n    }\r\n    #else /* portUSING_MPU_WRAPPERS */\r\n    {\r\n        /* If the port has capability to detect stack overflow,\r\n         * pass the stack end address to the stack initialization\r\n         * function as well. */\r\n        #if ( portHAS_STACK_OVERFLOW_CHECKING == 1 )\r\n        {\r\n            #if ( portSTACK_GROWTH < 0 )\r\n            {\r\n                pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxStack, pxTaskCode, pvParameters );\r\n            }\r\n            #else /* portSTACK_GROWTH */\r\n            {\r\n                pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxNewTCB->pxEndOfStack, pxTaskCode, pvParameters );\r\n            }\r\n            #endif /* portSTACK_GROWTH */\r\n        }\r\n        #else /* portHAS_STACK_OVERFLOW_CHECKING */\r\n        {\r\n            pxNewTCB->pxTopOfStack = pxPortInitialiseStack( pxTopOfStack, pxTaskCode, pvParameters );\r\n        }\r\n        #endif /* portHAS_STACK_OVERFLOW_CHECKING */\r\n    }\r\n    #endif /* portUSING_MPU_WRAPPERS */\r\n\r\n    /* Initialize task state and task attributes. */\r\n    #if ( configNUMBER_OF_CORES > 1 )\r\n    {\r\n        pxNewTCB->xTaskRunState = taskTASK_NOT_RUNNING;\r\n\r\n        /* Is this an idle task? */\r\n        if( ( ( TaskFunction_t ) pxTaskCode == ( TaskFunction_t ) prvIdleTask ) || ( ( TaskFunction_t ) pxTaskCode == ( TaskFunction_t ) prvPassiveIdleTask ) )\r\n        {\r\n            pxNewTCB->uxTaskAttributes |= taskATTRIBUTE_IS_IDLE;\r\n        }\r\n    }\r\n    #endif /* #if ( configNUMBER_OF_CORES > 1 ) */\r\n\r\n    if( pxCreatedTask != NULL )\r\n    {\r\n        /* Pass the handle out in an anonymous way.  The handle can be used to\r\n         * change the created task's priority, delete the created task, etc.*/\r\n        *pxCreatedTask = ( TaskHandle_t ) pxNewTCB;\r\n    }\r\n    else\r\n    {\r\n        mtCOVERAGE_TEST_MARKER();\r\n    }\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configNUMBER_OF_CORES == 1 )\r\n\r\n    static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB )\r\n    {\r\n        /* Ensure interrupts don't access the task lists while the lists are being\r\n         * updated. */\r\n        taskENTER_CRITICAL();\r\n        {\r\n            uxCurrentNumberOfTasks++;\r\n\r\n            if( pxCurrentTCB == NULL )\r\n            {\r\n                /* There are no other tasks, or all the other tasks are in\r\n                 * the suspended state - make this the current task. */\r\n                pxCurrentTCB = pxNewTCB;\r\n\r\n                if( uxCurrentNumberOfTasks == ( UBaseType_t ) 1 )\r\n                {\r\n                    /* This is the first task to be created so do the preliminary\r\n                     * initialisation required.  We will not recover if this call\r\n                     * fails, but we will report the failure. */\r\n                    prvInitialiseTaskLists();\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                /* If the scheduler is not already running, make this task the\r\n                 * current task if it is the highest priority task to be created\r\n                 * so far. */\r\n                if( xSchedulerRunning == pdFALSE )\r\n                {\r\n                    if( pxCurrentTCB->uxPriority <= pxNewTCB->uxPriority )\r\n                    {\r\n                        pxCurrentTCB = pxNewTCB;\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n\r\n            uxTaskNumber++;\r\n\r\n            #if ( configUSE_TRACE_FACILITY == 1 )\r\n            {\r\n                /* Add a counter into the TCB for tracing only. */\r\n                pxNewTCB->uxTCBNumber = uxTaskNumber;\r\n            }\r\n            #endif /* configUSE_TRACE_FACILITY */\r\n            traceTASK_CREATE( pxNewTCB );\r\n\r\n            prvAddTaskToReadyList( pxNewTCB );\r\n\r\n            portSETUP_TCB( pxNewTCB );\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        if( xSchedulerRunning != pdFALSE )\r\n        {\r\n            /* If the created task is of a higher priority than the current task\r\n             * then it should run now. */\r\n            taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxNewTCB );\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n\r\n#else /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n\r\n    static void prvAddNewTaskToReadyList( TCB_t * pxNewTCB )\r\n    {\r\n        /* Ensure interrupts don't access the task lists while the lists are being\r\n         * updated. */\r\n        taskENTER_CRITICAL();\r\n        {\r\n            uxCurrentNumberOfTasks++;\r\n\r\n            if( xSchedulerRunning == pdFALSE )\r\n            {\r\n                if( uxCurrentNumberOfTasks == ( UBaseType_t ) 1 )\r\n                {\r\n                    /* This is the first task to be created so do the preliminary\r\n                     * initialisation required.  We will not recover if this call\r\n                     * fails, but we will report the failure. */\r\n                    prvInitialiseTaskLists();\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n\r\n                if( ( pxNewTCB->uxTaskAttributes & taskATTRIBUTE_IS_IDLE ) != 0U )\r\n                {\r\n                    BaseType_t xCoreID;\r\n\r\n                    /* Check if a core is free. */\r\n                    for( xCoreID = ( BaseType_t ) 0; xCoreID < ( BaseType_t ) configNUMBER_OF_CORES; xCoreID++ )\r\n                    {\r\n                        if( pxCurrentTCBs[ xCoreID ] == NULL )\r\n                        {\r\n                            pxNewTCB->xTaskRunState = xCoreID;\r\n                            pxCurrentTCBs[ xCoreID ] = pxNewTCB;\r\n                            break;\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n\r\n            uxTaskNumber++;\r\n\r\n            #if ( configUSE_TRACE_FACILITY == 1 )\r\n            {\r\n                /* Add a counter into the TCB for tracing only. */\r\n                pxNewTCB->uxTCBNumber = uxTaskNumber;\r\n            }\r\n            #endif /* configUSE_TRACE_FACILITY */\r\n            traceTASK_CREATE( pxNewTCB );\r\n\r\n            prvAddTaskToReadyList( pxNewTCB );\r\n\r\n            portSETUP_TCB( pxNewTCB );\r\n\r\n            if( xSchedulerRunning != pdFALSE )\r\n            {\r\n                /* If the created task is of a higher priority than another\r\n                 * currently running task and preemption is on then it should\r\n                 * run now. */\r\n                taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxNewTCB );\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL();\r\n    }\r\n\r\n#endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) )\r\n\r\n    static size_t prvSnprintfReturnValueToCharsWritten( int iSnprintfReturnValue,\r\n                                                        size_t n )\r\n    {\r\n        size_t uxCharsWritten;\r\n\r\n        if( iSnprintfReturnValue < 0 )\r\n        {\r\n            /* Encoding error - Return 0 to indicate that nothing\r\n             * was written to the buffer. */\r\n            uxCharsWritten = 0;\r\n        }\r\n        else if( iSnprintfReturnValue >= ( int ) n )\r\n        {\r\n            /* This is the case when the supplied buffer is not\r\n             * large to hold the generated string. Return the\r\n             * number of characters actually written without\r\n             * counting the terminating NULL character. */\r\n            uxCharsWritten = n - 1U;\r\n        }\r\n        else\r\n        {\r\n            /* Complete string was written to the buffer. */\r\n            uxCharsWritten = ( size_t ) iSnprintfReturnValue;\r\n        }\r\n\r\n        return uxCharsWritten;\r\n    }\r\n\r\n#endif /* #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( INCLUDE_vTaskDelete == 1 )\r\n\r\n    void vTaskDelete( TaskHandle_t xTaskToDelete )\r\n    {\r\n        TCB_t * pxTCB;\r\n\r\n        traceENTER_vTaskDelete( xTaskToDelete );\r\n\r\n        taskENTER_CRITICAL();\r\n        {\r\n            /* If null is passed in here then it is the calling task that is\r\n             * being deleted. */\r\n            pxTCB = prvGetTCBFromHandle( xTaskToDelete );\r\n\r\n            /* Remove task from the ready/delayed list. */\r\n            if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )\r\n            {\r\n                taskRESET_READY_PRIORITY( pxTCB->uxPriority );\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n\r\n            /* Is the task waiting on an event also? */\r\n            if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL )\r\n            {\r\n                ( void ) uxListRemove( &( pxTCB->xEventListItem ) );\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n\r\n            /* Increment the uxTaskNumber also so kernel aware debuggers can\r\n             * detect that the task lists need re-generating.  This is done before\r\n             * portPRE_TASK_DELETE_HOOK() as in the Windows port that macro will\r\n             * not return. */\r\n            uxTaskNumber++;\r\n\r\n            /* If the task is running (or yielding), we must add it to the\r\n             * termination list so that an idle task can delete it when it is\r\n             * no longer running. */\r\n            if( taskTASK_IS_RUNNING_OR_SCHEDULED_TO_YIELD( pxTCB ) != pdFALSE )\r\n            {\r\n                /* A running task or a task which is scheduled to yield is being\r\n                 * deleted. This cannot complete when the task is still running\r\n                 * on a core, as a context switch to another task is required.\r\n                 * Place the task in the termination list. The idle task will check\r\n                 * the termination list and free up any memory allocated by the\r\n                 * scheduler for the TCB and stack of the deleted task. */\r\n                vListInsertEnd( &xTasksWaitingTermination, &( pxTCB->xStateListItem ) );\r\n\r\n                /* Increment the ucTasksDeleted variable so the idle task knows\r\n                 * there is a task that has been deleted and that it should therefore\r\n                 * check the xTasksWaitingTermination list. */\r\n                ++uxDeletedTasksWaitingCleanUp;\r\n\r\n                /* Call the delete hook before portPRE_TASK_DELETE_HOOK() as\r\n                 * portPRE_TASK_DELETE_HOOK() does not return in the Win32 port. */\r\n                traceTASK_DELETE( pxTCB );\r\n\r\n                /* The pre-delete hook is primarily for the Windows simulator,\r\n                 * in which Windows specific clean up operations are performed,\r\n                 * after which it is not possible to yield away from this task -\r\n                 * hence xYieldPending is used to latch that a context switch is\r\n                 * required. */\r\n                #if ( configNUMBER_OF_CORES == 1 )\r\n                    portPRE_TASK_DELETE_HOOK( pxTCB, &( xYieldPendings[ 0 ] ) );\r\n                #else\r\n                    portPRE_TASK_DELETE_HOOK( pxTCB, &( xYieldPendings[ pxTCB->xTaskRunState ] ) );\r\n                #endif\r\n            }\r\n            else\r\n            {\r\n                --uxCurrentNumberOfTasks;\r\n                traceTASK_DELETE( pxTCB );\r\n\r\n                /* Reset the next expected unblock time in case it referred to\r\n                 * the task that has just been deleted. */\r\n                prvResetNextTaskUnblockTime();\r\n            }\r\n        }\r\n\r\n        #if ( configNUMBER_OF_CORES == 1 )\r\n        {\r\n            taskEXIT_CRITICAL();\r\n\r\n            /* If the task is not deleting itself, call prvDeleteTCB from outside of\r\n             * critical section. If a task deletes itself, prvDeleteTCB is called\r\n             * from prvCheckTasksWaitingTermination which is called from Idle task. */\r\n            if( pxTCB != pxCurrentTCB )\r\n            {\r\n                prvDeleteTCB( pxTCB );\r\n            }\r\n\r\n            /* Force a reschedule if it is the currently running task that has just\r\n             * been deleted. */\r\n            if( xSchedulerRunning != pdFALSE )\r\n            {\r\n                if( pxTCB == pxCurrentTCB )\r\n                {\r\n                    configASSERT( uxSchedulerSuspended == 0 );\r\n                    portYIELD_WITHIN_API();\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n        }\r\n        #else /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n        {\r\n            /* If a running task is not deleting itself, call prvDeleteTCB. If a running\r\n             * task deletes itself, prvDeleteTCB is called from prvCheckTasksWaitingTermination\r\n             * which is called from Idle task. */\r\n            if( pxTCB->xTaskRunState == taskTASK_NOT_RUNNING )\r\n            {\r\n                prvDeleteTCB( pxTCB );\r\n            }\r\n\r\n            /* Force a reschedule if the task that has just been deleted was running. */\r\n            if( ( xSchedulerRunning != pdFALSE ) && ( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE ) )\r\n            {\r\n                if( pxTCB->xTaskRunState == ( BaseType_t ) portGET_CORE_ID() )\r\n                {\r\n                    configASSERT( uxSchedulerSuspended == 0 );\r\n                    vTaskYieldWithinAPI();\r\n                }\r\n                else\r\n                {\r\n                    prvYieldCore( pxTCB->xTaskRunState );\r\n                }\r\n            }\r\n\r\n            taskEXIT_CRITICAL();\r\n        }\r\n        #endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n\r\n        traceRETURN_vTaskDelete();\r\n    }\r\n\r\n#endif /* INCLUDE_vTaskDelete */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( INCLUDE_xTaskDelayUntil == 1 )\r\n\r\n    BaseType_t xTaskDelayUntil( TickType_t * const pxPreviousWakeTime,\r\n                                const TickType_t xTimeIncrement )\r\n    {\r\n        TickType_t xTimeToWake;\r\n        BaseType_t xAlreadyYielded, xShouldDelay = pdFALSE;\r\n\r\n        traceENTER_xTaskDelayUntil( pxPreviousWakeTime, xTimeIncrement );\r\n\r\n        configASSERT( pxPreviousWakeTime );\r\n        configASSERT( ( xTimeIncrement > 0U ) );\r\n\r\n        vTaskSuspendAll();\r\n        {\r\n            /* Minor optimisation.  The tick count cannot change in this\r\n             * block. */\r\n            const TickType_t xConstTickCount = xTickCount;\r\n\r\n            configASSERT( uxSchedulerSuspended == 1U );\r\n\r\n            /* Generate the tick time at which the task wants to wake. */\r\n            xTimeToWake = *pxPreviousWakeTime + xTimeIncrement;\r\n\r\n            if( xConstTickCount < *pxPreviousWakeTime )\r\n            {\r\n                /* The tick count has overflowed since this function was\r\n                 * lasted called.  In this case the only time we should ever\r\n                 * actually delay is if the wake time has also  overflowed,\r\n                 * and the wake time is greater than the tick time.  When this\r\n                 * is the case it is as if neither time had overflowed. */\r\n                if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xConstTickCount ) )\r\n                {\r\n                    xShouldDelay = pdTRUE;\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                /* The tick time has not overflowed.  In this case we will\r\n                 * delay if either the wake time has overflowed, and/or the\r\n                 * tick time is less than the wake time. */\r\n                if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xConstTickCount ) )\r\n                {\r\n                    xShouldDelay = pdTRUE;\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n\r\n            /* Update the wake time ready for the next call. */\r\n            *pxPreviousWakeTime = xTimeToWake;\r\n\r\n            if( xShouldDelay != pdFALSE )\r\n            {\r\n                traceTASK_DELAY_UNTIL( xTimeToWake );\r\n\r\n                /* prvAddCurrentTaskToDelayedList() needs the block time, not\r\n                 * the time to wake, so subtract the current tick count. */\r\n                prvAddCurrentTaskToDelayedList( xTimeToWake - xConstTickCount, pdFALSE );\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        xAlreadyYielded = xTaskResumeAll();\r\n\r\n        /* Force a reschedule if xTaskResumeAll has not already done so, we may\r\n         * have put ourselves to sleep. */\r\n        if( xAlreadyYielded == pdFALSE )\r\n        {\r\n            taskYIELD_WITHIN_API();\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_xTaskDelayUntil( xShouldDelay );\r\n\r\n        return xShouldDelay;\r\n    }\r\n\r\n#endif /* INCLUDE_xTaskDelayUntil */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( INCLUDE_vTaskDelay == 1 )\r\n\r\n    void vTaskDelay( const TickType_t xTicksToDelay )\r\n    {\r\n        BaseType_t xAlreadyYielded = pdFALSE;\r\n\r\n        traceENTER_vTaskDelay( xTicksToDelay );\r\n\r\n        /* A delay time of zero just forces a reschedule. */\r\n        if( xTicksToDelay > ( TickType_t ) 0U )\r\n        {\r\n            vTaskSuspendAll();\r\n            {\r\n                configASSERT( uxSchedulerSuspended == 1U );\r\n\r\n                traceTASK_DELAY();\r\n\r\n                /* A task that is removed from the event list while the\r\n                 * scheduler is suspended will not get placed in the ready\r\n                 * list or removed from the blocked list until the scheduler\r\n                 * is resumed.\r\n                 *\r\n                 * This task cannot be in an event list as it is the currently\r\n                 * executing task. */\r\n                prvAddCurrentTaskToDelayedList( xTicksToDelay, pdFALSE );\r\n            }\r\n            xAlreadyYielded = xTaskResumeAll();\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        /* Force a reschedule if xTaskResumeAll has not already done so, we may\r\n         * have put ourselves to sleep. */\r\n        if( xAlreadyYielded == pdFALSE )\r\n        {\r\n            taskYIELD_WITHIN_API();\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_vTaskDelay();\r\n    }\r\n\r\n#endif /* INCLUDE_vTaskDelay */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( INCLUDE_eTaskGetState == 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_xTaskAbortDelay == 1 ) )\r\n\r\n    eTaskState eTaskGetState( TaskHandle_t xTask )\r\n    {\r\n        eTaskState eReturn;\r\n        List_t const * pxStateList;\r\n        List_t const * pxEventList;\r\n        List_t const * pxDelayedList;\r\n        List_t const * pxOverflowedDelayedList;\r\n        const TCB_t * const pxTCB = xTask;\r\n\r\n        traceENTER_eTaskGetState( xTask );\r\n\r\n        configASSERT( pxTCB );\r\n\r\n        #if ( configNUMBER_OF_CORES == 1 )\r\n            if( pxTCB == pxCurrentTCB )\r\n            {\r\n                /* The task calling this function is querying its own state. */\r\n                eReturn = eRunning;\r\n            }\r\n            else\r\n        #endif\r\n        {\r\n            taskENTER_CRITICAL();\r\n            {\r\n                pxStateList = listLIST_ITEM_CONTAINER( &( pxTCB->xStateListItem ) );\r\n                pxEventList = listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) );\r\n                pxDelayedList = pxDelayedTaskList;\r\n                pxOverflowedDelayedList = pxOverflowDelayedTaskList;\r\n            }\r\n            taskEXIT_CRITICAL();\r\n\r\n            if( pxEventList == &xPendingReadyList )\r\n            {\r\n                /* The task has been placed on the pending ready list, so its\r\n                 * state is eReady regardless of what list the task's state list\r\n                 * item is currently placed on. */\r\n                eReturn = eReady;\r\n            }\r\n            else if( ( pxStateList == pxDelayedList ) || ( pxStateList == pxOverflowedDelayedList ) )\r\n            {\r\n                /* The task being queried is referenced from one of the Blocked\r\n                 * lists. */\r\n                eReturn = eBlocked;\r\n            }\r\n\r\n            #if ( INCLUDE_vTaskSuspend == 1 )\r\n                else if( pxStateList == &xSuspendedTaskList )\r\n                {\r\n                    /* The task being queried is referenced from the suspended\r\n                     * list.  Is it genuinely suspended or is it blocked\r\n                     * indefinitely? */\r\n                    if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL )\r\n                    {\r\n                        #if ( configUSE_TASK_NOTIFICATIONS == 1 )\r\n                        {\r\n                            BaseType_t x;\r\n\r\n                            /* The task does not appear on the event list item of\r\n                             * and of the RTOS objects, but could still be in the\r\n                             * blocked state if it is waiting on its notification\r\n                             * rather than waiting on an object.  If not, is\r\n                             * suspended. */\r\n                            eReturn = eSuspended;\r\n\r\n                            for( x = ( BaseType_t ) 0; x < ( BaseType_t ) configTASK_NOTIFICATION_ARRAY_ENTRIES; x++ )\r\n                            {\r\n                                if( pxTCB->ucNotifyState[ x ] == taskWAITING_NOTIFICATION )\r\n                                {\r\n                                    eReturn = eBlocked;\r\n                                    break;\r\n                                }\r\n                            }\r\n                        }\r\n                        #else /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */\r\n                        {\r\n                            eReturn = eSuspended;\r\n                        }\r\n                        #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */\r\n                    }\r\n                    else\r\n                    {\r\n                        eReturn = eBlocked;\r\n                    }\r\n                }\r\n            #endif /* if ( INCLUDE_vTaskSuspend == 1 ) */\r\n\r\n            #if ( INCLUDE_vTaskDelete == 1 )\r\n                else if( ( pxStateList == &xTasksWaitingTermination ) || ( pxStateList == NULL ) )\r\n                {\r\n                    /* The task being queried is referenced from the deleted\r\n                     * tasks list, or it is not referenced from any lists at\r\n                     * all. */\r\n                    eReturn = eDeleted;\r\n                }\r\n            #endif\r\n\r\n            else\r\n            {\r\n                #if ( configNUMBER_OF_CORES == 1 )\r\n                {\r\n                    /* If the task is not in any other state, it must be in the\r\n                     * Ready (including pending ready) state. */\r\n                    eReturn = eReady;\r\n                }\r\n                #else /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n                {\r\n                    if( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE )\r\n                    {\r\n                        /* Is it actively running on a core? */\r\n                        eReturn = eRunning;\r\n                    }\r\n                    else\r\n                    {\r\n                        /* If the task is not in any other state, it must be in the\r\n                         * Ready (including pending ready) state. */\r\n                        eReturn = eReady;\r\n                    }\r\n                }\r\n                #endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n            }\r\n        }\r\n\r\n        traceRETURN_eTaskGetState( eReturn );\r\n\r\n        return eReturn;\r\n    }\r\n\r\n#endif /* INCLUDE_eTaskGetState */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( INCLUDE_uxTaskPriorityGet == 1 )\r\n\r\n    UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask )\r\n    {\r\n        TCB_t const * pxTCB;\r\n        UBaseType_t uxReturn;\r\n\r\n        traceENTER_uxTaskPriorityGet( xTask );\r\n\r\n        taskENTER_CRITICAL();\r\n        {\r\n            /* If null is passed in here then it is the priority of the task\r\n             * that called uxTaskPriorityGet() that is being queried. */\r\n            pxTCB = prvGetTCBFromHandle( xTask );\r\n            uxReturn = pxTCB->uxPriority;\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_uxTaskPriorityGet( uxReturn );\r\n\r\n        return uxReturn;\r\n    }\r\n\r\n#endif /* INCLUDE_uxTaskPriorityGet */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( INCLUDE_uxTaskPriorityGet == 1 )\r\n\r\n    UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask )\r\n    {\r\n        TCB_t const * pxTCB;\r\n        UBaseType_t uxReturn;\r\n        UBaseType_t uxSavedInterruptStatus;\r\n\r\n        traceENTER_uxTaskPriorityGetFromISR( xTask );\r\n\r\n        /* RTOS ports that support interrupt nesting have the concept of a\r\n         * maximum  system call (or maximum API call) interrupt priority.\r\n         * Interrupts that are  above the maximum system call priority are keep\r\n         * permanently enabled, even when the RTOS kernel is in a critical section,\r\n         * but cannot make any calls to FreeRTOS API functions.  If configASSERT()\r\n         * is defined in FreeRTOSConfig.h then\r\n         * portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion\r\n         * failure if a FreeRTOS API function is called from an interrupt that has\r\n         * been assigned a priority above the configured maximum system call\r\n         * priority.  Only FreeRTOS functions that end in FromISR can be called\r\n         * from interrupts  that have been assigned a priority at or (logically)\r\n         * below the maximum system call interrupt priority.  FreeRTOS maintains a\r\n         * separate interrupt safe API to ensure interrupt entry is as fast and as\r\n         * simple as possible.  More information (albeit Cortex-M specific) is\r\n         * provided on the following link:\r\n         * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */\r\n        portASSERT_IF_INTERRUPT_PRIORITY_INVALID();\r\n\r\n        uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();\r\n        {\r\n            /* If null is passed in here then it is the priority of the calling\r\n             * task that is being queried. */\r\n            pxTCB = prvGetTCBFromHandle( xTask );\r\n            uxReturn = pxTCB->uxPriority;\r\n        }\r\n        taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );\r\n\r\n        traceRETURN_uxTaskPriorityGetFromISR( uxReturn );\r\n\r\n        return uxReturn;\r\n    }\r\n\r\n#endif /* INCLUDE_uxTaskPriorityGet */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( INCLUDE_uxTaskPriorityGet == 1 ) && ( configUSE_MUTEXES == 1 ) )\r\n\r\n    UBaseType_t uxTaskBasePriorityGet( const TaskHandle_t xTask )\r\n    {\r\n        TCB_t const * pxTCB;\r\n        UBaseType_t uxReturn;\r\n\r\n        traceENTER_uxTaskBasePriorityGet( xTask );\r\n\r\n        taskENTER_CRITICAL();\r\n        {\r\n            /* If null is passed in here then it is the base priority of the task\r\n             * that called uxTaskBasePriorityGet() that is being queried. */\r\n            pxTCB = prvGetTCBFromHandle( xTask );\r\n            uxReturn = pxTCB->uxBasePriority;\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_uxTaskBasePriorityGet( uxReturn );\r\n\r\n        return uxReturn;\r\n    }\r\n\r\n#endif /* #if ( ( INCLUDE_uxTaskPriorityGet == 1 ) && ( configUSE_MUTEXES == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( INCLUDE_uxTaskPriorityGet == 1 ) && ( configUSE_MUTEXES == 1 ) )\r\n\r\n    UBaseType_t uxTaskBasePriorityGetFromISR( const TaskHandle_t xTask )\r\n    {\r\n        TCB_t const * pxTCB;\r\n        UBaseType_t uxReturn;\r\n        UBaseType_t uxSavedInterruptStatus;\r\n\r\n        traceENTER_uxTaskBasePriorityGetFromISR( xTask );\r\n\r\n        /* RTOS ports that support interrupt nesting have the concept of a\r\n         * maximum  system call (or maximum API call) interrupt priority.\r\n         * Interrupts that are  above the maximum system call priority are keep\r\n         * permanently enabled, even when the RTOS kernel is in a critical section,\r\n         * but cannot make any calls to FreeRTOS API functions.  If configASSERT()\r\n         * is defined in FreeRTOSConfig.h then\r\n         * portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion\r\n         * failure if a FreeRTOS API function is called from an interrupt that has\r\n         * been assigned a priority above the configured maximum system call\r\n         * priority.  Only FreeRTOS functions that end in FromISR can be called\r\n         * from interrupts  that have been assigned a priority at or (logically)\r\n         * below the maximum system call interrupt priority.  FreeRTOS maintains a\r\n         * separate interrupt safe API to ensure interrupt entry is as fast and as\r\n         * simple as possible.  More information (albeit Cortex-M specific) is\r\n         * provided on the following link:\r\n         * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */\r\n        portASSERT_IF_INTERRUPT_PRIORITY_INVALID();\r\n\r\n        uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();\r\n        {\r\n            /* If null is passed in here then it is the base priority of the calling\r\n             * task that is being queried. */\r\n            pxTCB = prvGetTCBFromHandle( xTask );\r\n            uxReturn = pxTCB->uxBasePriority;\r\n        }\r\n        taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );\r\n\r\n        traceRETURN_uxTaskBasePriorityGetFromISR( uxReturn );\r\n\r\n        return uxReturn;\r\n    }\r\n\r\n#endif /* #if ( ( INCLUDE_uxTaskPriorityGet == 1 ) && ( configUSE_MUTEXES == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( INCLUDE_vTaskPrioritySet == 1 )\r\n\r\n    void vTaskPrioritySet( TaskHandle_t xTask,\r\n                           UBaseType_t uxNewPriority )\r\n    {\r\n        TCB_t * pxTCB;\r\n        UBaseType_t uxCurrentBasePriority, uxPriorityUsedOnEntry;\r\n        BaseType_t xYieldRequired = pdFALSE;\r\n\r\n        #if ( configNUMBER_OF_CORES > 1 )\r\n            BaseType_t xYieldForTask = pdFALSE;\r\n        #endif\r\n\r\n        traceENTER_vTaskPrioritySet( xTask, uxNewPriority );\r\n\r\n        configASSERT( uxNewPriority < configMAX_PRIORITIES );\r\n\r\n        /* Ensure the new priority is valid. */\r\n        if( uxNewPriority >= ( UBaseType_t ) configMAX_PRIORITIES )\r\n        {\r\n            uxNewPriority = ( UBaseType_t ) configMAX_PRIORITIES - ( UBaseType_t ) 1U;\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        taskENTER_CRITICAL();\r\n        {\r\n            /* If null is passed in here then it is the priority of the calling\r\n             * task that is being changed. */\r\n            pxTCB = prvGetTCBFromHandle( xTask );\r\n\r\n            traceTASK_PRIORITY_SET( pxTCB, uxNewPriority );\r\n\r\n            #if ( configUSE_MUTEXES == 1 )\r\n            {\r\n                uxCurrentBasePriority = pxTCB->uxBasePriority;\r\n            }\r\n            #else\r\n            {\r\n                uxCurrentBasePriority = pxTCB->uxPriority;\r\n            }\r\n            #endif\r\n\r\n            if( uxCurrentBasePriority != uxNewPriority )\r\n            {\r\n                /* The priority change may have readied a task of higher\r\n                 * priority than a running task. */\r\n                if( uxNewPriority > uxCurrentBasePriority )\r\n                {\r\n                    #if ( configNUMBER_OF_CORES == 1 )\r\n                    {\r\n                        if( pxTCB != pxCurrentTCB )\r\n                        {\r\n                            /* The priority of a task other than the currently\r\n                             * running task is being raised.  Is the priority being\r\n                             * raised above that of the running task? */\r\n                            if( uxNewPriority > pxCurrentTCB->uxPriority )\r\n                            {\r\n                                xYieldRequired = pdTRUE;\r\n                            }\r\n                            else\r\n                            {\r\n                                mtCOVERAGE_TEST_MARKER();\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            /* The priority of the running task is being raised,\r\n                             * but the running task must already be the highest\r\n                             * priority task able to run so no yield is required. */\r\n                        }\r\n                    }\r\n                    #else /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n                    {\r\n                        /* The priority of a task is being raised so\r\n                         * perform a yield for this task later. */\r\n                        xYieldForTask = pdTRUE;\r\n                    }\r\n                    #endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n                }\r\n                else if( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE )\r\n                {\r\n                    /* Setting the priority of a running task down means\r\n                     * there may now be another task of higher priority that\r\n                     * is ready to execute. */\r\n                    #if ( configUSE_TASK_PREEMPTION_DISABLE == 1 )\r\n                        if( pxTCB->xPreemptionDisable == pdFALSE )\r\n                    #endif\r\n                    {\r\n                        xYieldRequired = pdTRUE;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    /* Setting the priority of any other task down does not\r\n                     * require a yield as the running task must be above the\r\n                     * new priority of the task being modified. */\r\n                }\r\n\r\n                /* Remember the ready list the task might be referenced from\r\n                 * before its uxPriority member is changed so the\r\n                 * taskRESET_READY_PRIORITY() macro can function correctly. */\r\n                uxPriorityUsedOnEntry = pxTCB->uxPriority;\r\n\r\n                #if ( configUSE_MUTEXES == 1 )\r\n                {\r\n                    /* Only change the priority being used if the task is not\r\n                     * currently using an inherited priority or the new priority\r\n                     * is bigger than the inherited priority. */\r\n                    if( ( pxTCB->uxBasePriority == pxTCB->uxPriority ) || ( uxNewPriority > pxTCB->uxPriority ) )\r\n                    {\r\n                        pxTCB->uxPriority = uxNewPriority;\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n\r\n                    /* The base priority gets set whatever. */\r\n                    pxTCB->uxBasePriority = uxNewPriority;\r\n                }\r\n                #else /* if ( configUSE_MUTEXES == 1 ) */\r\n                {\r\n                    pxTCB->uxPriority = uxNewPriority;\r\n                }\r\n                #endif /* if ( configUSE_MUTEXES == 1 ) */\r\n\r\n                /* Only reset the event list item value if the value is not\r\n                 * being used for anything else. */\r\n                if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == ( ( TickType_t ) 0UL ) )\r\n                {\r\n                    listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxNewPriority ) );\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n\r\n                /* If the task is in the blocked or suspended list we need do\r\n                 * nothing more than change its priority variable. However, if\r\n                 * the task is in a ready list it needs to be removed and placed\r\n                 * in the list appropriate to its new priority. */\r\n                if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE )\r\n                {\r\n                    /* The task is currently in its ready list - remove before\r\n                     * adding it to its new ready list.  As we are in a critical\r\n                     * section we can do this even if the scheduler is suspended. */\r\n                    if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )\r\n                    {\r\n                        /* It is known that the task is in its ready list so\r\n                         * there is no need to check again and the port level\r\n                         * reset macro can be called directly. */\r\n                        portRESET_READY_PRIORITY( uxPriorityUsedOnEntry, uxTopReadyPriority );\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n\r\n                    prvAddTaskToReadyList( pxTCB );\r\n                }\r\n                else\r\n                {\r\n                    #if ( configNUMBER_OF_CORES == 1 )\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                    #else\r\n                    {\r\n                        /* It's possible that xYieldForTask was already set to pdTRUE because\r\n                         * its priority is being raised. However, since it is not in a ready list\r\n                         * we don't actually need to yield for it. */\r\n                        xYieldForTask = pdFALSE;\r\n                    }\r\n                    #endif\r\n                }\r\n\r\n                if( xYieldRequired != pdFALSE )\r\n                {\r\n                    /* The running task priority is set down. Request the task to yield. */\r\n                    taskYIELD_TASK_CORE_IF_USING_PREEMPTION( pxTCB );\r\n                }\r\n                else\r\n                {\r\n                    #if ( configNUMBER_OF_CORES > 1 )\r\n                        if( xYieldForTask != pdFALSE )\r\n                        {\r\n                            /* The priority of the task is being raised. If a running\r\n                             * task has priority lower than this task, it should yield\r\n                             * for this task. */\r\n                            taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxTCB );\r\n                        }\r\n                        else\r\n                    #endif /* if ( configNUMBER_OF_CORES > 1 ) */\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n\r\n                /* Remove compiler warning about unused variables when the port\r\n                 * optimised task selection is not being used. */\r\n                ( void ) uxPriorityUsedOnEntry;\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_vTaskPrioritySet();\r\n    }\r\n\r\n#endif /* INCLUDE_vTaskPrioritySet */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) )\r\n    void vTaskCoreAffinitySet( const TaskHandle_t xTask,\r\n                               UBaseType_t uxCoreAffinityMask )\r\n    {\r\n        TCB_t * pxTCB;\r\n        BaseType_t xCoreID;\r\n        UBaseType_t uxPrevCoreAffinityMask;\r\n\r\n        #if ( configUSE_PREEMPTION == 1 )\r\n            UBaseType_t uxPrevNotAllowedCores;\r\n        #endif\r\n\r\n        traceENTER_vTaskCoreAffinitySet( xTask, uxCoreAffinityMask );\r\n\r\n        taskENTER_CRITICAL();\r\n        {\r\n            pxTCB = prvGetTCBFromHandle( xTask );\r\n\r\n            uxPrevCoreAffinityMask = pxTCB->uxCoreAffinityMask;\r\n            pxTCB->uxCoreAffinityMask = uxCoreAffinityMask;\r\n\r\n            if( xSchedulerRunning != pdFALSE )\r\n            {\r\n                if( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE )\r\n                {\r\n                    xCoreID = ( BaseType_t ) pxTCB->xTaskRunState;\r\n\r\n                    /* If the task can no longer run on the core it was running,\r\n                     * request the core to yield. */\r\n                    if( ( uxCoreAffinityMask & ( ( UBaseType_t ) 1U << ( UBaseType_t ) xCoreID ) ) == 0U )\r\n                    {\r\n                        prvYieldCore( xCoreID );\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    #if ( configUSE_PREEMPTION == 1 )\r\n                    {\r\n                        /* Calculate the cores on which this task was not allowed to\r\n                         * run previously. */\r\n                        uxPrevNotAllowedCores = ( ~uxPrevCoreAffinityMask ) & ( ( 1U << configNUMBER_OF_CORES ) - 1U );\r\n\r\n                        /* Does the new core mask enables this task to run on any of the\r\n                         * previously not allowed cores? If yes, check if this task can be\r\n                         * scheduled on any of those cores. */\r\n                        if( ( uxPrevNotAllowedCores & uxCoreAffinityMask ) != 0U )\r\n                        {\r\n                            prvYieldForTask( pxTCB );\r\n                        }\r\n                    }\r\n                    #else /* #if( configUSE_PREEMPTION == 1 ) */\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                    #endif /* #if( configUSE_PREEMPTION == 1 ) */\r\n                }\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_vTaskCoreAffinitySet();\r\n    }\r\n#endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) )\r\n    UBaseType_t vTaskCoreAffinityGet( ConstTaskHandle_t xTask )\r\n    {\r\n        const TCB_t * pxTCB;\r\n        UBaseType_t uxCoreAffinityMask;\r\n\r\n        traceENTER_vTaskCoreAffinityGet( xTask );\r\n\r\n        taskENTER_CRITICAL();\r\n        {\r\n            pxTCB = prvGetTCBFromHandle( xTask );\r\n            uxCoreAffinityMask = pxTCB->uxCoreAffinityMask;\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_vTaskCoreAffinityGet( uxCoreAffinityMask );\r\n\r\n        return uxCoreAffinityMask;\r\n    }\r\n#endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) */\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TASK_PREEMPTION_DISABLE == 1 )\r\n\r\n    void vTaskPreemptionDisable( const TaskHandle_t xTask )\r\n    {\r\n        TCB_t * pxTCB;\r\n\r\n        traceENTER_vTaskPreemptionDisable( xTask );\r\n\r\n        taskENTER_CRITICAL();\r\n        {\r\n            pxTCB = prvGetTCBFromHandle( xTask );\r\n\r\n            pxTCB->xPreemptionDisable = pdTRUE;\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_vTaskPreemptionDisable();\r\n    }\r\n\r\n#endif /* #if ( configUSE_TASK_PREEMPTION_DISABLE == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TASK_PREEMPTION_DISABLE == 1 )\r\n\r\n    void vTaskPreemptionEnable( const TaskHandle_t xTask )\r\n    {\r\n        TCB_t * pxTCB;\r\n        BaseType_t xCoreID;\r\n\r\n        traceENTER_vTaskPreemptionEnable( xTask );\r\n\r\n        taskENTER_CRITICAL();\r\n        {\r\n            pxTCB = prvGetTCBFromHandle( xTask );\r\n\r\n            pxTCB->xPreemptionDisable = pdFALSE;\r\n\r\n            if( xSchedulerRunning != pdFALSE )\r\n            {\r\n                if( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE )\r\n                {\r\n                    xCoreID = ( BaseType_t ) pxTCB->xTaskRunState;\r\n                    prvYieldCore( xCoreID );\r\n                }\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_vTaskPreemptionEnable();\r\n    }\r\n\r\n#endif /* #if ( configUSE_TASK_PREEMPTION_DISABLE == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( INCLUDE_vTaskSuspend == 1 )\r\n\r\n    void vTaskSuspend( TaskHandle_t xTaskToSuspend )\r\n    {\r\n        TCB_t * pxTCB;\r\n\r\n        #if ( configNUMBER_OF_CORES > 1 )\r\n            BaseType_t xTaskRunningOnCore;\r\n        #endif\r\n\r\n        traceENTER_vTaskSuspend( xTaskToSuspend );\r\n\r\n        taskENTER_CRITICAL();\r\n        {\r\n            /* If null is passed in here then it is the running task that is\r\n             * being suspended. */\r\n            pxTCB = prvGetTCBFromHandle( xTaskToSuspend );\r\n\r\n            traceTASK_SUSPEND( pxTCB );\r\n\r\n            #if ( configNUMBER_OF_CORES > 1 )\r\n                xTaskRunningOnCore = pxTCB->xTaskRunState;\r\n            #endif\r\n\r\n            /* Remove task from the ready/delayed list and place in the\r\n             * suspended list. */\r\n            if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )\r\n            {\r\n                taskRESET_READY_PRIORITY( pxTCB->uxPriority );\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n\r\n            /* Is the task waiting on an event also? */\r\n            if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL )\r\n            {\r\n                ( void ) uxListRemove( &( pxTCB->xEventListItem ) );\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n\r\n            vListInsertEnd( &xSuspendedTaskList, &( pxTCB->xStateListItem ) );\r\n\r\n            #if ( configUSE_TASK_NOTIFICATIONS == 1 )\r\n            {\r\n                BaseType_t x;\r\n\r\n                for( x = ( BaseType_t ) 0; x < ( BaseType_t ) configTASK_NOTIFICATION_ARRAY_ENTRIES; x++ )\r\n                {\r\n                    if( pxTCB->ucNotifyState[ x ] == taskWAITING_NOTIFICATION )\r\n                    {\r\n                        /* The task was blocked to wait for a notification, but is\r\n                         * now suspended, so no notification was received. */\r\n                        pxTCB->ucNotifyState[ x ] = taskNOT_WAITING_NOTIFICATION;\r\n                    }\r\n                }\r\n            }\r\n            #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */\r\n        }\r\n\r\n        #if ( configNUMBER_OF_CORES == 1 )\r\n        {\r\n            taskEXIT_CRITICAL();\r\n\r\n            if( xSchedulerRunning != pdFALSE )\r\n            {\r\n                /* Reset the next expected unblock time in case it referred to the\r\n                 * task that is now in the Suspended state. */\r\n                taskENTER_CRITICAL();\r\n                {\r\n                    prvResetNextTaskUnblockTime();\r\n                }\r\n                taskEXIT_CRITICAL();\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n\r\n            if( pxTCB == pxCurrentTCB )\r\n            {\r\n                if( xSchedulerRunning != pdFALSE )\r\n                {\r\n                    /* The current task has just been suspended. */\r\n                    configASSERT( uxSchedulerSuspended == 0 );\r\n                    portYIELD_WITHIN_API();\r\n                }\r\n                else\r\n                {\r\n                    /* The scheduler is not running, but the task that was pointed\r\n                     * to by pxCurrentTCB has just been suspended and pxCurrentTCB\r\n                     * must be adjusted to point to a different task. */\r\n                    if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == uxCurrentNumberOfTasks )\r\n                    {\r\n                        /* No other tasks are ready, so set pxCurrentTCB back to\r\n                         * NULL so when the next task is created pxCurrentTCB will\r\n                         * be set to point to it no matter what its relative priority\r\n                         * is. */\r\n                        pxCurrentTCB = NULL;\r\n                    }\r\n                    else\r\n                    {\r\n                        vTaskSwitchContext();\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        #else /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n        {\r\n            if( xSchedulerRunning != pdFALSE )\r\n            {\r\n                /* Reset the next expected unblock time in case it referred to the\r\n                 * task that is now in the Suspended state. */\r\n                prvResetNextTaskUnblockTime();\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n\r\n            if( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE )\r\n            {\r\n                if( xSchedulerRunning != pdFALSE )\r\n                {\r\n                    if( xTaskRunningOnCore == ( BaseType_t ) portGET_CORE_ID() )\r\n                    {\r\n                        /* The current task has just been suspended. */\r\n                        configASSERT( uxSchedulerSuspended == 0 );\r\n                        vTaskYieldWithinAPI();\r\n                    }\r\n                    else\r\n                    {\r\n                        prvYieldCore( xTaskRunningOnCore );\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    /* This code path is not possible because only Idle tasks are\r\n                     * assigned a core before the scheduler is started ( i.e.\r\n                     * taskTASK_IS_RUNNING is only true for idle tasks before\r\n                     * the scheduler is started ) and idle tasks cannot be\r\n                     * suspended. */\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n\r\n            taskEXIT_CRITICAL();\r\n        }\r\n        #endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n\r\n        traceRETURN_vTaskSuspend();\r\n    }\r\n\r\n#endif /* INCLUDE_vTaskSuspend */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( INCLUDE_vTaskSuspend == 1 )\r\n\r\n    static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask )\r\n    {\r\n        BaseType_t xReturn = pdFALSE;\r\n        const TCB_t * const pxTCB = xTask;\r\n\r\n        /* Accesses xPendingReadyList so must be called from a critical\r\n         * section. */\r\n\r\n        /* It does not make sense to check if the calling task is suspended. */\r\n        configASSERT( xTask );\r\n\r\n        /* Is the task being resumed actually in the suspended list? */\r\n        if( listIS_CONTAINED_WITHIN( &xSuspendedTaskList, &( pxTCB->xStateListItem ) ) != pdFALSE )\r\n        {\r\n            /* Has the task already been resumed from within an ISR? */\r\n            if( listIS_CONTAINED_WITHIN( &xPendingReadyList, &( pxTCB->xEventListItem ) ) == pdFALSE )\r\n            {\r\n                /* Is it in the suspended list because it is in the Suspended\r\n                 * state, or because it is blocked with no timeout? */\r\n                if( listIS_CONTAINED_WITHIN( NULL, &( pxTCB->xEventListItem ) ) != pdFALSE )\r\n                {\r\n                    #if ( configUSE_TASK_NOTIFICATIONS == 1 )\r\n                    {\r\n                        BaseType_t x;\r\n\r\n                        /* The task does not appear on the event list item of\r\n                         * and of the RTOS objects, but could still be in the\r\n                         * blocked state if it is waiting on its notification\r\n                         * rather than waiting on an object.  If not, is\r\n                         * suspended. */\r\n                        xReturn = pdTRUE;\r\n\r\n                        for( x = ( BaseType_t ) 0; x < ( BaseType_t ) configTASK_NOTIFICATION_ARRAY_ENTRIES; x++ )\r\n                        {\r\n                            if( pxTCB->ucNotifyState[ x ] == taskWAITING_NOTIFICATION )\r\n                            {\r\n                                xReturn = pdFALSE;\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n                    #else /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */\r\n                    {\r\n                        xReturn = pdTRUE;\r\n                    }\r\n                    #endif /* if ( configUSE_TASK_NOTIFICATIONS == 1 ) */\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* INCLUDE_vTaskSuspend */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( INCLUDE_vTaskSuspend == 1 )\r\n\r\n    void vTaskResume( TaskHandle_t xTaskToResume )\r\n    {\r\n        TCB_t * const pxTCB = xTaskToResume;\r\n\r\n        traceENTER_vTaskResume( xTaskToResume );\r\n\r\n        /* It does not make sense to resume the calling task. */\r\n        configASSERT( xTaskToResume );\r\n\r\n        #if ( configNUMBER_OF_CORES == 1 )\r\n\r\n            /* The parameter cannot be NULL as it is impossible to resume the\r\n             * currently executing task. */\r\n            if( ( pxTCB != pxCurrentTCB ) && ( pxTCB != NULL ) )\r\n        #else\r\n\r\n            /* The parameter cannot be NULL as it is impossible to resume the\r\n             * currently executing task. It is also impossible to resume a task\r\n             * that is actively running on another core but it is not safe\r\n             * to check their run state here. Therefore, we get into a critical\r\n             * section and check if the task is actually suspended or not. */\r\n            if( pxTCB != NULL )\r\n        #endif\r\n        {\r\n            taskENTER_CRITICAL();\r\n            {\r\n                if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE )\r\n                {\r\n                    traceTASK_RESUME( pxTCB );\r\n\r\n                    /* The ready list can be accessed even if the scheduler is\r\n                     * suspended because this is inside a critical section. */\r\n                    ( void ) uxListRemove( &( pxTCB->xStateListItem ) );\r\n                    prvAddTaskToReadyList( pxTCB );\r\n\r\n                    /* This yield may not cause the task just resumed to run,\r\n                     * but will leave the lists in the correct state for the\r\n                     * next yield. */\r\n                    taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxTCB );\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            taskEXIT_CRITICAL();\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_vTaskResume();\r\n    }\r\n\r\n#endif /* INCLUDE_vTaskSuspend */\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) )\r\n\r\n    BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume )\r\n    {\r\n        BaseType_t xYieldRequired = pdFALSE;\r\n        TCB_t * const pxTCB = xTaskToResume;\r\n        UBaseType_t uxSavedInterruptStatus;\r\n\r\n        traceENTER_xTaskResumeFromISR( xTaskToResume );\r\n\r\n        configASSERT( xTaskToResume );\r\n\r\n        /* RTOS ports that support interrupt nesting have the concept of a\r\n         * maximum  system call (or maximum API call) interrupt priority.\r\n         * Interrupts that are  above the maximum system call priority are keep\r\n         * permanently enabled, even when the RTOS kernel is in a critical section,\r\n         * but cannot make any calls to FreeRTOS API functions.  If configASSERT()\r\n         * is defined in FreeRTOSConfig.h then\r\n         * portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion\r\n         * failure if a FreeRTOS API function is called from an interrupt that has\r\n         * been assigned a priority above the configured maximum system call\r\n         * priority.  Only FreeRTOS functions that end in FromISR can be called\r\n         * from interrupts  that have been assigned a priority at or (logically)\r\n         * below the maximum system call interrupt priority.  FreeRTOS maintains a\r\n         * separate interrupt safe API to ensure interrupt entry is as fast and as\r\n         * simple as possible.  More information (albeit Cortex-M specific) is\r\n         * provided on the following link:\r\n         * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */\r\n        portASSERT_IF_INTERRUPT_PRIORITY_INVALID();\r\n\r\n        uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();\r\n        {\r\n            if( prvTaskIsTaskSuspended( pxTCB ) != pdFALSE )\r\n            {\r\n                traceTASK_RESUME_FROM_ISR( pxTCB );\r\n\r\n                /* Check the ready lists can be accessed. */\r\n                if( uxSchedulerSuspended == ( UBaseType_t ) 0U )\r\n                {\r\n                    #if ( configNUMBER_OF_CORES == 1 )\r\n                    {\r\n                        /* Ready lists can be accessed so move the task from the\r\n                         * suspended list to the ready list directly. */\r\n                        if( pxTCB->uxPriority > pxCurrentTCB->uxPriority )\r\n                        {\r\n                            xYieldRequired = pdTRUE;\r\n\r\n                            /* Mark that a yield is pending in case the user is not\r\n                             * using the return value to initiate a context switch\r\n                             * from the ISR using the port specific portYIELD_FROM_ISR(). */\r\n                            xYieldPendings[ 0 ] = pdTRUE;\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n                    }\r\n                    #endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n\r\n                    ( void ) uxListRemove( &( pxTCB->xStateListItem ) );\r\n                    prvAddTaskToReadyList( pxTCB );\r\n                }\r\n                else\r\n                {\r\n                    /* The delayed or ready lists cannot be accessed so the task\r\n                     * is held in the pending ready list until the scheduler is\r\n                     * unsuspended. */\r\n                    vListInsertEnd( &( xPendingReadyList ), &( pxTCB->xEventListItem ) );\r\n                }\r\n\r\n                #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_PREEMPTION == 1 ) )\r\n                {\r\n                    prvYieldForTask( pxTCB );\r\n\r\n                    if( xYieldPendings[ portGET_CORE_ID() ] != pdFALSE )\r\n                    {\r\n                        xYieldRequired = pdTRUE;\r\n                    }\r\n                }\r\n                #endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_PREEMPTION == 1 ) ) */\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );\r\n\r\n        traceRETURN_xTaskResumeFromISR( xYieldRequired );\r\n\r\n        return xYieldRequired;\r\n    }\r\n\r\n#endif /* ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic BaseType_t prvCreateIdleTasks( void )\r\n{\r\n    BaseType_t xReturn = pdPASS;\r\n    BaseType_t xCoreID;\r\n    char cIdleName[ configMAX_TASK_NAME_LEN ];\r\n    TaskFunction_t pxIdleTaskFunction = NULL;\r\n    BaseType_t xIdleTaskNameIndex;\r\n\r\n    for( xIdleTaskNameIndex = ( BaseType_t ) 0; xIdleTaskNameIndex < ( BaseType_t ) configMAX_TASK_NAME_LEN; xIdleTaskNameIndex++ )\r\n    {\r\n        cIdleName[ xIdleTaskNameIndex ] = configIDLE_TASK_NAME[ xIdleTaskNameIndex ];\r\n\r\n        /* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than\r\n         * configMAX_TASK_NAME_LEN characters just in case the memory after the\r\n         * string is not accessible (extremely unlikely). */\r\n        if( cIdleName[ xIdleTaskNameIndex ] == ( char ) 0x00 )\r\n        {\r\n            break;\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n\r\n    /* Add each idle task at the lowest priority. */\r\n    for( xCoreID = ( BaseType_t ) 0; xCoreID < ( BaseType_t ) configNUMBER_OF_CORES; xCoreID++ )\r\n    {\r\n        #if ( configNUMBER_OF_CORES == 1 )\r\n        {\r\n            pxIdleTaskFunction = prvIdleTask;\r\n        }\r\n        #else /* #if (  configNUMBER_OF_CORES == 1 ) */\r\n        {\r\n            /* In the FreeRTOS SMP, configNUMBER_OF_CORES - 1 passive idle tasks\r\n             * are also created to ensure that each core has an idle task to\r\n             * run when no other task is available to run. */\r\n            if( xCoreID == 0 )\r\n            {\r\n                pxIdleTaskFunction = prvIdleTask;\r\n            }\r\n            else\r\n            {\r\n                pxIdleTaskFunction = prvPassiveIdleTask;\r\n            }\r\n        }\r\n        #endif /* #if (  configNUMBER_OF_CORES == 1 ) */\r\n\r\n        /* Update the idle task name with suffix to differentiate the idle tasks.\r\n         * This function is not required in single core FreeRTOS since there is\r\n         * only one idle task. */\r\n        #if ( configNUMBER_OF_CORES > 1 )\r\n        {\r\n            /* Append the idle task number to the end of the name if there is space. */\r\n            if( xIdleTaskNameIndex < ( BaseType_t ) configMAX_TASK_NAME_LEN )\r\n            {\r\n                cIdleName[ xIdleTaskNameIndex ] = ( char ) ( xCoreID + '0' );\r\n\r\n                /* And append a null character if there is space. */\r\n                if( ( xIdleTaskNameIndex + 1 ) < ( BaseType_t ) configMAX_TASK_NAME_LEN )\r\n                {\r\n                    cIdleName[ xIdleTaskNameIndex + 1 ] = '\\0';\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        #endif /* if ( configNUMBER_OF_CORES > 1 ) */\r\n\r\n        #if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n        {\r\n            StaticTask_t * pxIdleTaskTCBBuffer = NULL;\r\n            StackType_t * pxIdleTaskStackBuffer = NULL;\r\n            uint32_t ulIdleTaskStackSize;\r\n\r\n            /* The Idle task is created using user provided RAM - obtain the\r\n             * address of the RAM then create the idle task. */\r\n            #if ( configNUMBER_OF_CORES == 1 )\r\n            {\r\n                vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize );\r\n            }\r\n            #else\r\n            {\r\n                if( xCoreID == 0 )\r\n                {\r\n                    vApplicationGetIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize );\r\n                }\r\n                else\r\n                {\r\n                    vApplicationGetPassiveIdleTaskMemory( &pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize, xCoreID - 1 );\r\n                }\r\n            }\r\n            #endif /* if ( configNUMBER_OF_CORES == 1 ) */\r\n            xIdleTaskHandles[ xCoreID ] = xTaskCreateStatic( pxIdleTaskFunction,\r\n                                                             cIdleName,\r\n                                                             ulIdleTaskStackSize,\r\n                                                             ( void * ) NULL,\r\n                                                             portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */\r\n                                                             pxIdleTaskStackBuffer,\r\n                                                             pxIdleTaskTCBBuffer );\r\n\r\n            if( xIdleTaskHandles[ xCoreID ] != NULL )\r\n            {\r\n                xReturn = pdPASS;\r\n            }\r\n            else\r\n            {\r\n                xReturn = pdFAIL;\r\n            }\r\n        }\r\n        #else /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */\r\n        {\r\n            /* The Idle task is being created using dynamically allocated RAM. */\r\n            xReturn = xTaskCreate( pxIdleTaskFunction,\r\n                                   cIdleName,\r\n                                   configMINIMAL_STACK_SIZE,\r\n                                   ( void * ) NULL,\r\n                                   portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */\r\n                                   &xIdleTaskHandles[ xCoreID ] );\r\n        }\r\n        #endif /* configSUPPORT_STATIC_ALLOCATION */\r\n\r\n        /* Break the loop if any of the idle task is failed to be created. */\r\n        if( xReturn == pdFAIL )\r\n        {\r\n            break;\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n\r\n    return xReturn;\r\n}\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vTaskStartScheduler( void )\r\n{\r\n    BaseType_t xReturn;\r\n\r\n    traceENTER_vTaskStartScheduler();\r\n\r\n    #if ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 )\r\n    {\r\n        /* Sanity check that the UBaseType_t must have greater than or equal to\r\n         * the number of bits as confNUMBER_OF_CORES. */\r\n        configASSERT( ( sizeof( UBaseType_t ) * taskBITS_PER_BYTE ) >= configNUMBER_OF_CORES );\r\n    }\r\n    #endif /* #if ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 ) */\r\n\r\n    xReturn = prvCreateIdleTasks();\r\n\r\n    #if ( configUSE_TIMERS == 1 )\r\n    {\r\n        if( xReturn == pdPASS )\r\n        {\r\n            xReturn = xTimerCreateTimerTask();\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n    #endif /* configUSE_TIMERS */\r\n\r\n    if( xReturn == pdPASS )\r\n    {\r\n        /* freertos_tasks_c_additions_init() should only be called if the user\r\n         * definable macro FREERTOS_TASKS_C_ADDITIONS_INIT() is defined, as that is\r\n         * the only macro called by the function. */\r\n        #ifdef FREERTOS_TASKS_C_ADDITIONS_INIT\r\n        {\r\n            freertos_tasks_c_additions_init();\r\n        }\r\n        #endif\r\n\r\n        /* Interrupts are turned off here, to ensure a tick does not occur\r\n         * before or during the call to xPortStartScheduler().  The stacks of\r\n         * the created tasks contain a status word with interrupts switched on\r\n         * so interrupts will automatically get re-enabled when the first task\r\n         * starts to run. */\r\n        portDISABLE_INTERRUPTS();\r\n\r\n        #if ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 )\r\n        {\r\n            /* Switch C-Runtime's TLS Block to point to the TLS\r\n             * block specific to the task that will run first. */\r\n            configSET_TLS_BLOCK( pxCurrentTCB->xTLSBlock );\r\n        }\r\n        #endif\r\n\r\n        xNextTaskUnblockTime = portMAX_DELAY;\r\n        xSchedulerRunning = pdTRUE;\r\n        xTickCount = ( TickType_t ) configINITIAL_TICK_COUNT;\r\n\r\n        /* If configGENERATE_RUN_TIME_STATS is defined then the following\r\n         * macro must be defined to configure the timer/counter used to generate\r\n         * the run time counter time base.   NOTE:  If configGENERATE_RUN_TIME_STATS\r\n         * is set to 0 and the following line fails to build then ensure you do not\r\n         * have portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() defined in your\r\n         * FreeRTOSConfig.h file. */\r\n        portCONFIGURE_TIMER_FOR_RUN_TIME_STATS();\r\n\r\n        traceTASK_SWITCHED_IN();\r\n\r\n        /* Setting up the timer tick is hardware specific and thus in the\r\n         * portable interface. */\r\n\r\n        /* The return value for xPortStartScheduler is not required\r\n         * hence using a void datatype. */\r\n        ( void ) xPortStartScheduler();\r\n\r\n        /* In most cases, xPortStartScheduler() will not return. If it\r\n         * returns pdTRUE then there was not enough heap memory available\r\n         * to create either the Idle or the Timer task. If it returned\r\n         * pdFALSE, then the application called xTaskEndScheduler().\r\n         * Most ports don't implement xTaskEndScheduler() as there is\r\n         * nothing to return to. */\r\n    }\r\n    else\r\n    {\r\n        /* This line will only be reached if the kernel could not be started,\r\n         * because there was not enough FreeRTOS heap to create the idle task\r\n         * or the timer task. */\r\n        configASSERT( xReturn != errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY );\r\n    }\r\n\r\n    /* Prevent compiler warnings if INCLUDE_xTaskGetIdleTaskHandle is set to 0,\r\n     * meaning xIdleTaskHandles are not used anywhere else. */\r\n    ( void ) xIdleTaskHandles;\r\n\r\n    /* OpenOCD makes use of uxTopUsedPriority for thread debugging. Prevent uxTopUsedPriority\r\n     * from getting optimized out as it is no longer used by the kernel. */\r\n    ( void ) uxTopUsedPriority;\r\n\r\n    traceRETURN_vTaskStartScheduler();\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vTaskEndScheduler( void )\r\n{\r\n    traceENTER_vTaskEndScheduler();\r\n\r\n    /* Stop the scheduler interrupts and call the portable scheduler end\r\n     * routine so the original ISRs can be restored if necessary.  The port\r\n     * layer must ensure interrupts enable  bit is left in the correct state. */\r\n    portDISABLE_INTERRUPTS();\r\n    xSchedulerRunning = pdFALSE;\r\n    vPortEndScheduler();\r\n\r\n    traceRETURN_vTaskEndScheduler();\r\n}\r\n/*----------------------------------------------------------*/\r\n\r\nvoid vTaskSuspendAll( void )\r\n{\r\n    traceENTER_vTaskSuspendAll();\r\n\r\n    #if ( configNUMBER_OF_CORES == 1 )\r\n    {\r\n        /* A critical section is not required as the variable is of type\r\n         * BaseType_t.  Please read Richard Barry's reply in the following link to a\r\n         * post in the FreeRTOS support forum before reporting this as a bug! -\r\n         * https://goo.gl/wu4acr */\r\n\r\n        /* portSOFTWARE_BARRIER() is only implemented for emulated/simulated ports that\r\n         * do not otherwise exhibit real time behaviour. */\r\n        portSOFTWARE_BARRIER();\r\n\r\n        /* The scheduler is suspended if uxSchedulerSuspended is non-zero.  An increment\r\n         * is used to allow calls to vTaskSuspendAll() to nest. */\r\n        ++uxSchedulerSuspended;\r\n\r\n        /* Enforces ordering for ports and optimised compilers that may otherwise place\r\n         * the above increment elsewhere. */\r\n        portMEMORY_BARRIER();\r\n    }\r\n    #else /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n    {\r\n        UBaseType_t ulState;\r\n\r\n        /* This must only be called from within a task. */\r\n        portASSERT_IF_IN_ISR();\r\n\r\n        if( xSchedulerRunning != pdFALSE )\r\n        {\r\n            /* Writes to uxSchedulerSuspended must be protected by both the task AND ISR locks.\r\n             * We must disable interrupts before we grab the locks in the event that this task is\r\n             * interrupted and switches context before incrementing uxSchedulerSuspended.\r\n             * It is safe to re-enable interrupts after releasing the ISR lock and incrementing\r\n             * uxSchedulerSuspended since that will prevent context switches. */\r\n            ulState = portSET_INTERRUPT_MASK();\r\n\r\n            /* portSOFRWARE_BARRIER() is only implemented for emulated/simulated ports that\r\n             * do not otherwise exhibit real time behaviour. */\r\n            portSOFTWARE_BARRIER();\r\n\r\n            portGET_TASK_LOCK();\r\n\r\n            /* uxSchedulerSuspended is increased after prvCheckForRunStateChange. The\r\n             * purpose is to prevent altering the variable when fromISR APIs are readying\r\n             * it. */\r\n            if( uxSchedulerSuspended == 0U )\r\n            {\r\n                if( portGET_CRITICAL_NESTING_COUNT() == 0U )\r\n                {\r\n                    prvCheckForRunStateChange();\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n\r\n            portGET_ISR_LOCK();\r\n\r\n            /* The scheduler is suspended if uxSchedulerSuspended is non-zero. An increment\r\n             * is used to allow calls to vTaskSuspendAll() to nest. */\r\n            ++uxSchedulerSuspended;\r\n            portRELEASE_ISR_LOCK();\r\n\r\n            portCLEAR_INTERRUPT_MASK( ulState );\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n    }\r\n    #endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n\r\n    traceRETURN_vTaskSuspendAll();\r\n}\r\n\r\n/*----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TICKLESS_IDLE != 0 )\r\n\r\n    static TickType_t prvGetExpectedIdleTime( void )\r\n    {\r\n        TickType_t xReturn;\r\n        UBaseType_t uxHigherPriorityReadyTasks = pdFALSE;\r\n\r\n        /* uxHigherPriorityReadyTasks takes care of the case where\r\n         * configUSE_PREEMPTION is 0, so there may be tasks above the idle priority\r\n         * task that are in the Ready state, even though the idle task is\r\n         * running. */\r\n        #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 )\r\n        {\r\n            if( uxTopReadyPriority > tskIDLE_PRIORITY )\r\n            {\r\n                uxHigherPriorityReadyTasks = pdTRUE;\r\n            }\r\n        }\r\n        #else\r\n        {\r\n            const UBaseType_t uxLeastSignificantBit = ( UBaseType_t ) 0x01;\r\n\r\n            /* When port optimised task selection is used the uxTopReadyPriority\r\n             * variable is used as a bit map.  If bits other than the least\r\n             * significant bit are set then there are tasks that have a priority\r\n             * above the idle priority that are in the Ready state.  This takes\r\n             * care of the case where the co-operative scheduler is in use. */\r\n            if( uxTopReadyPriority > uxLeastSignificantBit )\r\n            {\r\n                uxHigherPriorityReadyTasks = pdTRUE;\r\n            }\r\n        }\r\n        #endif /* if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) */\r\n\r\n        if( pxCurrentTCB->uxPriority > tskIDLE_PRIORITY )\r\n        {\r\n            xReturn = 0;\r\n        }\r\n        else if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > 1U )\r\n        {\r\n            /* There are other idle priority tasks in the ready state.  If\r\n             * time slicing is used then the very next tick interrupt must be\r\n             * processed. */\r\n            xReturn = 0;\r\n        }\r\n        else if( uxHigherPriorityReadyTasks != pdFALSE )\r\n        {\r\n            /* There are tasks in the Ready state that have a priority above the\r\n             * idle priority.  This path can only be reached if\r\n             * configUSE_PREEMPTION is 0. */\r\n            xReturn = 0;\r\n        }\r\n        else\r\n        {\r\n            xReturn = xNextTaskUnblockTime;\r\n            xReturn -= xTickCount;\r\n        }\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_TICKLESS_IDLE */\r\n/*----------------------------------------------------------*/\r\n\r\nBaseType_t xTaskResumeAll( void )\r\n{\r\n    TCB_t * pxTCB = NULL;\r\n    BaseType_t xAlreadyYielded = pdFALSE;\r\n\r\n    traceENTER_xTaskResumeAll();\r\n\r\n    #if ( configNUMBER_OF_CORES > 1 )\r\n        if( xSchedulerRunning != pdFALSE )\r\n    #endif\r\n    {\r\n        /* It is possible that an ISR caused a task to be removed from an event\r\n         * list while the scheduler was suspended.  If this was the case then the\r\n         * removed task will have been added to the xPendingReadyList.  Once the\r\n         * scheduler has been resumed it is safe to move all the pending ready\r\n         * tasks from this list into their appropriate ready list. */\r\n        taskENTER_CRITICAL();\r\n        {\r\n            BaseType_t xCoreID;\r\n            xCoreID = ( BaseType_t ) portGET_CORE_ID();\r\n\r\n            /* If uxSchedulerSuspended is zero then this function does not match a\r\n             * previous call to vTaskSuspendAll(). */\r\n            configASSERT( uxSchedulerSuspended != 0U );\r\n\r\n            --uxSchedulerSuspended;\r\n            portRELEASE_TASK_LOCK();\r\n\r\n            if( uxSchedulerSuspended == ( UBaseType_t ) 0U )\r\n            {\r\n                if( uxCurrentNumberOfTasks > ( UBaseType_t ) 0U )\r\n                {\r\n                    /* Move any readied tasks from the pending list into the\r\n                     * appropriate ready list. */\r\n                    while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE )\r\n                    {\r\n                        /* MISRA Ref 11.5.3 [Void pointer assignment] */\r\n                        /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n                        /* coverity[misra_c_2012_rule_11_5_violation] */\r\n                        pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) );\r\n                        listREMOVE_ITEM( &( pxTCB->xEventListItem ) );\r\n                        portMEMORY_BARRIER();\r\n                        listREMOVE_ITEM( &( pxTCB->xStateListItem ) );\r\n                        prvAddTaskToReadyList( pxTCB );\r\n\r\n                        #if ( configNUMBER_OF_CORES == 1 )\r\n                        {\r\n                            /* If the moved task has a priority higher than the current\r\n                             * task then a yield must be performed. */\r\n                            if( pxTCB->uxPriority > pxCurrentTCB->uxPriority )\r\n                            {\r\n                                xYieldPendings[ xCoreID ] = pdTRUE;\r\n                            }\r\n                            else\r\n                            {\r\n                                mtCOVERAGE_TEST_MARKER();\r\n                            }\r\n                        }\r\n                        #else /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n                        {\r\n                            /* All appropriate tasks yield at the moment a task is added to xPendingReadyList.\r\n                             * If the current core yielded then vTaskSwitchContext() has already been called\r\n                             * which sets xYieldPendings for the current core to pdTRUE. */\r\n                        }\r\n                        #endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n                    }\r\n\r\n                    if( pxTCB != NULL )\r\n                    {\r\n                        /* A task was unblocked while the scheduler was suspended,\r\n                         * which may have prevented the next unblock time from being\r\n                         * re-calculated, in which case re-calculate it now.  Mainly\r\n                         * important for low power tickless implementations, where\r\n                         * this can prevent an unnecessary exit from low power\r\n                         * state. */\r\n                        prvResetNextTaskUnblockTime();\r\n                    }\r\n\r\n                    /* If any ticks occurred while the scheduler was suspended then\r\n                     * they should be processed now.  This ensures the tick count does\r\n                     * not  slip, and that any delayed tasks are resumed at the correct\r\n                     * time.\r\n                     *\r\n                     * It should be safe to call xTaskIncrementTick here from any core\r\n                     * since we are in a critical section and xTaskIncrementTick itself\r\n                     * protects itself within a critical section. Suspending the scheduler\r\n                     * from any core causes xTaskIncrementTick to increment uxPendedCounts. */\r\n                    {\r\n                        TickType_t xPendedCounts = xPendedTicks; /* Non-volatile copy. */\r\n\r\n                        if( xPendedCounts > ( TickType_t ) 0U )\r\n                        {\r\n                            do\r\n                            {\r\n                                if( xTaskIncrementTick() != pdFALSE )\r\n                                {\r\n                                    /* Other cores are interrupted from\r\n                                     * within xTaskIncrementTick(). */\r\n                                    xYieldPendings[ xCoreID ] = pdTRUE;\r\n                                }\r\n                                else\r\n                                {\r\n                                    mtCOVERAGE_TEST_MARKER();\r\n                                }\r\n\r\n                                --xPendedCounts;\r\n                            } while( xPendedCounts > ( TickType_t ) 0U );\r\n\r\n                            xPendedTicks = 0;\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n                    }\r\n\r\n                    if( xYieldPendings[ xCoreID ] != pdFALSE )\r\n                    {\r\n                        #if ( configUSE_PREEMPTION != 0 )\r\n                        {\r\n                            xAlreadyYielded = pdTRUE;\r\n                        }\r\n                        #endif /* #if ( configUSE_PREEMPTION != 0 ) */\r\n\r\n                        #if ( configNUMBER_OF_CORES == 1 )\r\n                        {\r\n                            taskYIELD_TASK_CORE_IF_USING_PREEMPTION( pxCurrentTCB );\r\n                        }\r\n                        #endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL();\r\n    }\r\n\r\n    traceRETURN_xTaskResumeAll( xAlreadyYielded );\r\n\r\n    return xAlreadyYielded;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nTickType_t xTaskGetTickCount( void )\r\n{\r\n    TickType_t xTicks;\r\n\r\n    traceENTER_xTaskGetTickCount();\r\n\r\n    /* Critical section required if running on a 16 bit processor. */\r\n    portTICK_TYPE_ENTER_CRITICAL();\r\n    {\r\n        xTicks = xTickCount;\r\n    }\r\n    portTICK_TYPE_EXIT_CRITICAL();\r\n\r\n    traceRETURN_xTaskGetTickCount( xTicks );\r\n\r\n    return xTicks;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nTickType_t xTaskGetTickCountFromISR( void )\r\n{\r\n    TickType_t xReturn;\r\n    UBaseType_t uxSavedInterruptStatus;\r\n\r\n    traceENTER_xTaskGetTickCountFromISR();\r\n\r\n    /* RTOS ports that support interrupt nesting have the concept of a maximum\r\n     * system call (or maximum API call) interrupt priority.  Interrupts that are\r\n     * above the maximum system call priority are kept permanently enabled, even\r\n     * when the RTOS kernel is in a critical section, but cannot make any calls to\r\n     * FreeRTOS API functions.  If configASSERT() is defined in FreeRTOSConfig.h\r\n     * then portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion\r\n     * failure if a FreeRTOS API function is called from an interrupt that has been\r\n     * assigned a priority above the configured maximum system call priority.\r\n     * Only FreeRTOS functions that end in FromISR can be called from interrupts\r\n     * that have been assigned a priority at or (logically) below the maximum\r\n     * system call  interrupt priority.  FreeRTOS maintains a separate interrupt\r\n     * safe API to ensure interrupt entry is as fast and as simple as possible.\r\n     * More information (albeit Cortex-M specific) is provided on the following\r\n     * link: https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */\r\n    portASSERT_IF_INTERRUPT_PRIORITY_INVALID();\r\n\r\n    uxSavedInterruptStatus = portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR();\r\n    {\r\n        xReturn = xTickCount;\r\n    }\r\n    portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );\r\n\r\n    traceRETURN_xTaskGetTickCountFromISR( xReturn );\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nUBaseType_t uxTaskGetNumberOfTasks( void )\r\n{\r\n    traceENTER_uxTaskGetNumberOfTasks();\r\n\r\n    /* A critical section is not required because the variables are of type\r\n     * BaseType_t. */\r\n    traceRETURN_uxTaskGetNumberOfTasks( uxCurrentNumberOfTasks );\r\n\r\n    return uxCurrentNumberOfTasks;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nchar * pcTaskGetName( TaskHandle_t xTaskToQuery )\r\n{\r\n    TCB_t * pxTCB;\r\n\r\n    traceENTER_pcTaskGetName( xTaskToQuery );\r\n\r\n    /* If null is passed in here then the name of the calling task is being\r\n     * queried. */\r\n    pxTCB = prvGetTCBFromHandle( xTaskToQuery );\r\n    configASSERT( pxTCB );\r\n\r\n    traceRETURN_pcTaskGetName( &( pxTCB->pcTaskName[ 0 ] ) );\r\n\r\n    return &( pxTCB->pcTaskName[ 0 ] );\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( INCLUDE_xTaskGetHandle == 1 )\r\n\r\n    #if ( configNUMBER_OF_CORES == 1 )\r\n        static TCB_t * prvSearchForNameWithinSingleList( List_t * pxList,\r\n                                                         const char pcNameToQuery[] )\r\n        {\r\n            TCB_t * pxNextTCB;\r\n            TCB_t * pxFirstTCB;\r\n            TCB_t * pxReturn = NULL;\r\n            UBaseType_t x;\r\n            char cNextChar;\r\n            BaseType_t xBreakLoop;\r\n\r\n            /* This function is called with the scheduler suspended. */\r\n\r\n            if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 )\r\n            {\r\n                /* MISRA Ref 11.5.3 [Void pointer assignment] */\r\n                /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n                /* coverity[misra_c_2012_rule_11_5_violation] */\r\n                listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList );\r\n\r\n                do\r\n                {\r\n                    /* MISRA Ref 11.5.3 [Void pointer assignment] */\r\n                    /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n                    /* coverity[misra_c_2012_rule_11_5_violation] */\r\n                    listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList );\r\n\r\n                    /* Check each character in the name looking for a match or\r\n                     * mismatch. */\r\n                    xBreakLoop = pdFALSE;\r\n\r\n                    for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ )\r\n                    {\r\n                        cNextChar = pxNextTCB->pcTaskName[ x ];\r\n\r\n                        if( cNextChar != pcNameToQuery[ x ] )\r\n                        {\r\n                            /* Characters didn't match. */\r\n                            xBreakLoop = pdTRUE;\r\n                        }\r\n                        else if( cNextChar == ( char ) 0x00 )\r\n                        {\r\n                            /* Both strings terminated, a match must have been\r\n                             * found. */\r\n                            pxReturn = pxNextTCB;\r\n                            xBreakLoop = pdTRUE;\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n\r\n                        if( xBreakLoop != pdFALSE )\r\n                        {\r\n                            break;\r\n                        }\r\n                    }\r\n\r\n                    if( pxReturn != NULL )\r\n                    {\r\n                        /* The handle has been found. */\r\n                        break;\r\n                    }\r\n                } while( pxNextTCB != pxFirstTCB );\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n\r\n            return pxReturn;\r\n        }\r\n    #else /* if ( configNUMBER_OF_CORES == 1 ) */\r\n        static TCB_t * prvSearchForNameWithinSingleList( List_t * pxList,\r\n                                                         const char pcNameToQuery[] )\r\n        {\r\n            TCB_t * pxReturn = NULL;\r\n            UBaseType_t x;\r\n            char cNextChar;\r\n            BaseType_t xBreakLoop;\r\n            const ListItem_t * pxEndMarker = listGET_END_MARKER( pxList );\r\n            ListItem_t * pxIterator;\r\n\r\n            /* This function is called with the scheduler suspended. */\r\n\r\n            if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 )\r\n            {\r\n                for( pxIterator = listGET_HEAD_ENTRY( pxList ); pxIterator != pxEndMarker; pxIterator = listGET_NEXT( pxIterator ) )\r\n                {\r\n                    /* MISRA Ref 11.5.3 [Void pointer assignment] */\r\n                    /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n                    /* coverity[misra_c_2012_rule_11_5_violation] */\r\n                    TCB_t * pxTCB = listGET_LIST_ITEM_OWNER( pxIterator );\r\n\r\n                    /* Check each character in the name looking for a match or\r\n                     * mismatch. */\r\n                    xBreakLoop = pdFALSE;\r\n\r\n                    for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ )\r\n                    {\r\n                        cNextChar = pxTCB->pcTaskName[ x ];\r\n\r\n                        if( cNextChar != pcNameToQuery[ x ] )\r\n                        {\r\n                            /* Characters didn't match. */\r\n                            xBreakLoop = pdTRUE;\r\n                        }\r\n                        else if( cNextChar == ( char ) 0x00 )\r\n                        {\r\n                            /* Both strings terminated, a match must have been\r\n                             * found. */\r\n                            pxReturn = pxTCB;\r\n                            xBreakLoop = pdTRUE;\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n\r\n                        if( xBreakLoop != pdFALSE )\r\n                        {\r\n                            break;\r\n                        }\r\n                    }\r\n\r\n                    if( pxReturn != NULL )\r\n                    {\r\n                        /* The handle has been found. */\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n\r\n            return pxReturn;\r\n        }\r\n    #endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n\r\n#endif /* INCLUDE_xTaskGetHandle */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( INCLUDE_xTaskGetHandle == 1 )\r\n\r\n    TaskHandle_t xTaskGetHandle( const char * pcNameToQuery )\r\n    {\r\n        UBaseType_t uxQueue = configMAX_PRIORITIES;\r\n        TCB_t * pxTCB;\r\n\r\n        traceENTER_xTaskGetHandle( pcNameToQuery );\r\n\r\n        /* Task names will be truncated to configMAX_TASK_NAME_LEN - 1 bytes. */\r\n        configASSERT( strlen( pcNameToQuery ) < configMAX_TASK_NAME_LEN );\r\n\r\n        vTaskSuspendAll();\r\n        {\r\n            /* Search the ready lists. */\r\n            do\r\n            {\r\n                uxQueue--;\r\n                pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) &( pxReadyTasksLists[ uxQueue ] ), pcNameToQuery );\r\n\r\n                if( pxTCB != NULL )\r\n                {\r\n                    /* Found the handle. */\r\n                    break;\r\n                }\r\n            } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY );\r\n\r\n            /* Search the delayed lists. */\r\n            if( pxTCB == NULL )\r\n            {\r\n                pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) pxDelayedTaskList, pcNameToQuery );\r\n            }\r\n\r\n            if( pxTCB == NULL )\r\n            {\r\n                pxTCB = prvSearchForNameWithinSingleList( ( List_t * ) pxOverflowDelayedTaskList, pcNameToQuery );\r\n            }\r\n\r\n            #if ( INCLUDE_vTaskSuspend == 1 )\r\n            {\r\n                if( pxTCB == NULL )\r\n                {\r\n                    /* Search the suspended list. */\r\n                    pxTCB = prvSearchForNameWithinSingleList( &xSuspendedTaskList, pcNameToQuery );\r\n                }\r\n            }\r\n            #endif\r\n\r\n            #if ( INCLUDE_vTaskDelete == 1 )\r\n            {\r\n                if( pxTCB == NULL )\r\n                {\r\n                    /* Search the deleted list. */\r\n                    pxTCB = prvSearchForNameWithinSingleList( &xTasksWaitingTermination, pcNameToQuery );\r\n                }\r\n            }\r\n            #endif\r\n        }\r\n        ( void ) xTaskResumeAll();\r\n\r\n        traceRETURN_xTaskGetHandle( pxTCB );\r\n\r\n        return pxTCB;\r\n    }\r\n\r\n#endif /* INCLUDE_xTaskGetHandle */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n\r\n    BaseType_t xTaskGetStaticBuffers( TaskHandle_t xTask,\r\n                                      StackType_t ** ppuxStackBuffer,\r\n                                      StaticTask_t ** ppxTaskBuffer )\r\n    {\r\n        BaseType_t xReturn;\r\n        TCB_t * pxTCB;\r\n\r\n        traceENTER_xTaskGetStaticBuffers( xTask, ppuxStackBuffer, ppxTaskBuffer );\r\n\r\n        configASSERT( ppuxStackBuffer != NULL );\r\n        configASSERT( ppxTaskBuffer != NULL );\r\n\r\n        pxTCB = prvGetTCBFromHandle( xTask );\r\n\r\n        #if ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE == 1 )\r\n        {\r\n            if( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_AND_TCB )\r\n            {\r\n                *ppuxStackBuffer = pxTCB->pxStack;\r\n                /* MISRA Ref 11.3.1 [Misaligned access] */\r\n                /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */\r\n                /* coverity[misra_c_2012_rule_11_3_violation] */\r\n                *ppxTaskBuffer = ( StaticTask_t * ) pxTCB;\r\n                xReturn = pdTRUE;\r\n            }\r\n            else if( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_ONLY )\r\n            {\r\n                *ppuxStackBuffer = pxTCB->pxStack;\r\n                *ppxTaskBuffer = NULL;\r\n                xReturn = pdTRUE;\r\n            }\r\n            else\r\n            {\r\n                xReturn = pdFALSE;\r\n            }\r\n        }\r\n        #else /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE == 1 */\r\n        {\r\n            *ppuxStackBuffer = pxTCB->pxStack;\r\n            *ppxTaskBuffer = ( StaticTask_t * ) pxTCB;\r\n            xReturn = pdTRUE;\r\n        }\r\n        #endif /* tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE == 1 */\r\n\r\n        traceRETURN_xTaskGetStaticBuffers( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configSUPPORT_STATIC_ALLOCATION */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n\r\n    UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray,\r\n                                      const UBaseType_t uxArraySize,\r\n                                      configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime )\r\n    {\r\n        UBaseType_t uxTask = 0, uxQueue = configMAX_PRIORITIES;\r\n\r\n        traceENTER_uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, pulTotalRunTime );\r\n\r\n        vTaskSuspendAll();\r\n        {\r\n            /* Is there a space in the array for each task in the system? */\r\n            if( uxArraySize >= uxCurrentNumberOfTasks )\r\n            {\r\n                /* Fill in an TaskStatus_t structure with information on each\r\n                 * task in the Ready state. */\r\n                do\r\n                {\r\n                    uxQueue--;\r\n                    uxTask = ( UBaseType_t ) ( uxTask + prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &( pxReadyTasksLists[ uxQueue ] ), eReady ) );\r\n                } while( uxQueue > ( UBaseType_t ) tskIDLE_PRIORITY );\r\n\r\n                /* Fill in an TaskStatus_t structure with information on each\r\n                 * task in the Blocked state. */\r\n                uxTask = ( UBaseType_t ) ( uxTask + prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxDelayedTaskList, eBlocked ) );\r\n                uxTask = ( UBaseType_t ) ( uxTask + prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), ( List_t * ) pxOverflowDelayedTaskList, eBlocked ) );\r\n\r\n                #if ( INCLUDE_vTaskDelete == 1 )\r\n                {\r\n                    /* Fill in an TaskStatus_t structure with information on\r\n                     * each task that has been deleted but not yet cleaned up. */\r\n                    uxTask = ( UBaseType_t ) ( uxTask + prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xTasksWaitingTermination, eDeleted ) );\r\n                }\r\n                #endif\r\n\r\n                #if ( INCLUDE_vTaskSuspend == 1 )\r\n                {\r\n                    /* Fill in an TaskStatus_t structure with information on\r\n                     * each task in the Suspended state. */\r\n                    uxTask = ( UBaseType_t ) ( uxTask + prvListTasksWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xSuspendedTaskList, eSuspended ) );\r\n                }\r\n                #endif\r\n\r\n                #if ( configGENERATE_RUN_TIME_STATS == 1 )\r\n                {\r\n                    if( pulTotalRunTime != NULL )\r\n                    {\r\n                        #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE\r\n                            portALT_GET_RUN_TIME_COUNTER_VALUE( ( *pulTotalRunTime ) );\r\n                        #else\r\n                            *pulTotalRunTime = ( configRUN_TIME_COUNTER_TYPE ) portGET_RUN_TIME_COUNTER_VALUE();\r\n                        #endif\r\n                    }\r\n                }\r\n                #else /* if ( configGENERATE_RUN_TIME_STATS == 1 ) */\r\n                {\r\n                    if( pulTotalRunTime != NULL )\r\n                    {\r\n                        *pulTotalRunTime = 0;\r\n                    }\r\n                }\r\n                #endif /* if ( configGENERATE_RUN_TIME_STATS == 1 ) */\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        ( void ) xTaskResumeAll();\r\n\r\n        traceRETURN_uxTaskGetSystemState( uxTask );\r\n\r\n        return uxTask;\r\n    }\r\n\r\n#endif /* configUSE_TRACE_FACILITY */\r\n/*----------------------------------------------------------*/\r\n\r\n#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 )\r\n\r\n    #if ( configNUMBER_OF_CORES == 1 )\r\n        TaskHandle_t xTaskGetIdleTaskHandle( void )\r\n        {\r\n            traceENTER_xTaskGetIdleTaskHandle();\r\n\r\n            /* If xTaskGetIdleTaskHandle() is called before the scheduler has been\r\n             * started, then xIdleTaskHandles will be NULL. */\r\n            configASSERT( ( xIdleTaskHandles[ 0 ] != NULL ) );\r\n\r\n            traceRETURN_xTaskGetIdleTaskHandle( xIdleTaskHandles[ 0 ] );\r\n\r\n            return xIdleTaskHandles[ 0 ];\r\n        }\r\n    #endif /* if ( configNUMBER_OF_CORES == 1 ) */\r\n\r\n    TaskHandle_t xTaskGetIdleTaskHandleForCore( BaseType_t xCoreID )\r\n    {\r\n        traceENTER_xTaskGetIdleTaskHandleForCore( xCoreID );\r\n\r\n        /* Ensure the core ID is valid. */\r\n        configASSERT( taskVALID_CORE_ID( xCoreID ) == pdTRUE );\r\n\r\n        /* If xTaskGetIdleTaskHandle() is called before the scheduler has been\r\n         * started, then xIdleTaskHandles will be NULL. */\r\n        configASSERT( ( xIdleTaskHandles[ xCoreID ] != NULL ) );\r\n\r\n        traceRETURN_xTaskGetIdleTaskHandleForCore( xIdleTaskHandles[ xCoreID ] );\r\n\r\n        return xIdleTaskHandles[ xCoreID ];\r\n    }\r\n\r\n#endif /* INCLUDE_xTaskGetIdleTaskHandle */\r\n/*----------------------------------------------------------*/\r\n\r\n/* This conditional compilation should use inequality to 0, not equality to 1.\r\n * This is to ensure vTaskStepTick() is available when user defined low power mode\r\n * implementations require configUSE_TICKLESS_IDLE to be set to a value other than\r\n * 1. */\r\n#if ( configUSE_TICKLESS_IDLE != 0 )\r\n\r\n    void vTaskStepTick( TickType_t xTicksToJump )\r\n    {\r\n        TickType_t xUpdatedTickCount;\r\n\r\n        traceENTER_vTaskStepTick( xTicksToJump );\r\n\r\n        /* Correct the tick count value after a period during which the tick\r\n         * was suppressed.  Note this does *not* call the tick hook function for\r\n         * each stepped tick. */\r\n        xUpdatedTickCount = xTickCount + xTicksToJump;\r\n        configASSERT( xUpdatedTickCount <= xNextTaskUnblockTime );\r\n\r\n        if( xUpdatedTickCount == xNextTaskUnblockTime )\r\n        {\r\n            /* Arrange for xTickCount to reach xNextTaskUnblockTime in\r\n             * xTaskIncrementTick() when the scheduler resumes.  This ensures\r\n             * that any delayed tasks are resumed at the correct time. */\r\n            configASSERT( uxSchedulerSuspended != ( UBaseType_t ) 0U );\r\n            configASSERT( xTicksToJump != ( TickType_t ) 0 );\r\n\r\n            /* Prevent the tick interrupt modifying xPendedTicks simultaneously. */\r\n            taskENTER_CRITICAL();\r\n            {\r\n                xPendedTicks++;\r\n            }\r\n            taskEXIT_CRITICAL();\r\n            xTicksToJump--;\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        xTickCount += xTicksToJump;\r\n\r\n        traceINCREASE_TICK_COUNT( xTicksToJump );\r\n        traceRETURN_vTaskStepTick();\r\n    }\r\n\r\n#endif /* configUSE_TICKLESS_IDLE */\r\n/*----------------------------------------------------------*/\r\n\r\nBaseType_t xTaskCatchUpTicks( TickType_t xTicksToCatchUp )\r\n{\r\n    BaseType_t xYieldOccurred;\r\n\r\n    traceENTER_xTaskCatchUpTicks( xTicksToCatchUp );\r\n\r\n    /* Must not be called with the scheduler suspended as the implementation\r\n     * relies on xPendedTicks being wound down to 0 in xTaskResumeAll(). */\r\n    configASSERT( uxSchedulerSuspended == ( UBaseType_t ) 0U );\r\n\r\n    /* Use xPendedTicks to mimic xTicksToCatchUp number of ticks occurring when\r\n     * the scheduler is suspended so the ticks are executed in xTaskResumeAll(). */\r\n    vTaskSuspendAll();\r\n\r\n    /* Prevent the tick interrupt modifying xPendedTicks simultaneously. */\r\n    taskENTER_CRITICAL();\r\n    {\r\n        xPendedTicks += xTicksToCatchUp;\r\n    }\r\n    taskEXIT_CRITICAL();\r\n    xYieldOccurred = xTaskResumeAll();\r\n\r\n    traceRETURN_xTaskCatchUpTicks( xYieldOccurred );\r\n\r\n    return xYieldOccurred;\r\n}\r\n/*----------------------------------------------------------*/\r\n\r\n#if ( INCLUDE_xTaskAbortDelay == 1 )\r\n\r\n    BaseType_t xTaskAbortDelay( TaskHandle_t xTask )\r\n    {\r\n        TCB_t * pxTCB = xTask;\r\n        BaseType_t xReturn;\r\n\r\n        traceENTER_xTaskAbortDelay( xTask );\r\n\r\n        configASSERT( pxTCB );\r\n\r\n        vTaskSuspendAll();\r\n        {\r\n            /* A task can only be prematurely removed from the Blocked state if\r\n             * it is actually in the Blocked state. */\r\n            if( eTaskGetState( xTask ) == eBlocked )\r\n            {\r\n                xReturn = pdPASS;\r\n\r\n                /* Remove the reference to the task from the blocked list.  An\r\n                 * interrupt won't touch the xStateListItem because the\r\n                 * scheduler is suspended. */\r\n                ( void ) uxListRemove( &( pxTCB->xStateListItem ) );\r\n\r\n                /* Is the task waiting on an event also?  If so remove it from\r\n                 * the event list too.  Interrupts can touch the event list item,\r\n                 * even though the scheduler is suspended, so a critical section\r\n                 * is used. */\r\n                taskENTER_CRITICAL();\r\n                {\r\n                    if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL )\r\n                    {\r\n                        ( void ) uxListRemove( &( pxTCB->xEventListItem ) );\r\n\r\n                        /* This lets the task know it was forcibly removed from the\r\n                         * blocked state so it should not re-evaluate its block time and\r\n                         * then block again. */\r\n                        pxTCB->ucDelayAborted = pdTRUE;\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                taskEXIT_CRITICAL();\r\n\r\n                /* Place the unblocked task into the appropriate ready list. */\r\n                prvAddTaskToReadyList( pxTCB );\r\n\r\n                /* A task being unblocked cannot cause an immediate context\r\n                 * switch if preemption is turned off. */\r\n                #if ( configUSE_PREEMPTION == 1 )\r\n                {\r\n                    #if ( configNUMBER_OF_CORES == 1 )\r\n                    {\r\n                        /* Preemption is on, but a context switch should only be\r\n                         * performed if the unblocked task has a priority that is\r\n                         * higher than the currently executing task. */\r\n                        if( pxTCB->uxPriority > pxCurrentTCB->uxPriority )\r\n                        {\r\n                            /* Pend the yield to be performed when the scheduler\r\n                             * is unsuspended. */\r\n                            xYieldPendings[ 0 ] = pdTRUE;\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n                    }\r\n                    #else /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n                    {\r\n                        taskENTER_CRITICAL();\r\n                        {\r\n                            prvYieldForTask( pxTCB );\r\n                        }\r\n                        taskEXIT_CRITICAL();\r\n                    }\r\n                    #endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n                }\r\n                #endif /* #if ( configUSE_PREEMPTION == 1 ) */\r\n            }\r\n            else\r\n            {\r\n                xReturn = pdFAIL;\r\n            }\r\n        }\r\n        ( void ) xTaskResumeAll();\r\n\r\n        traceRETURN_xTaskAbortDelay( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* INCLUDE_xTaskAbortDelay */\r\n/*----------------------------------------------------------*/\r\n\r\nBaseType_t xTaskIncrementTick( void )\r\n{\r\n    TCB_t * pxTCB;\r\n    TickType_t xItemValue;\r\n    BaseType_t xSwitchRequired = pdFALSE;\r\n\r\n    #if ( configUSE_PREEMPTION == 1 ) && ( configNUMBER_OF_CORES > 1 )\r\n    BaseType_t xYieldRequiredForCore[ configNUMBER_OF_CORES ] = { pdFALSE };\r\n    #endif /* #if ( configUSE_PREEMPTION == 1 ) && ( configNUMBER_OF_CORES > 1 ) */\r\n\r\n    traceENTER_xTaskIncrementTick();\r\n\r\n    /* Called by the portable layer each time a tick interrupt occurs.\r\n     * Increments the tick then checks to see if the new tick value will cause any\r\n     * tasks to be unblocked. */\r\n    traceTASK_INCREMENT_TICK( xTickCount );\r\n\r\n    /* Tick increment should occur on every kernel timer event. Core 0 has the\r\n     * responsibility to increment the tick, or increment the pended ticks if the\r\n     * scheduler is suspended.  If pended ticks is greater than zero, the core that\r\n     * calls xTaskResumeAll has the responsibility to increment the tick. */\r\n    if( uxSchedulerSuspended == ( UBaseType_t ) 0U )\r\n    {\r\n        /* Minor optimisation.  The tick count cannot change in this\r\n         * block. */\r\n        const TickType_t xConstTickCount = xTickCount + ( TickType_t ) 1;\r\n\r\n        /* Increment the RTOS tick, switching the delayed and overflowed\r\n         * delayed lists if it wraps to 0. */\r\n        xTickCount = xConstTickCount;\r\n\r\n        if( xConstTickCount == ( TickType_t ) 0U )\r\n        {\r\n            taskSWITCH_DELAYED_LISTS();\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        /* See if this tick has made a timeout expire.  Tasks are stored in\r\n         * the  queue in the order of their wake time - meaning once one task\r\n         * has been found whose block time has not expired there is no need to\r\n         * look any further down the list. */\r\n        if( xConstTickCount >= xNextTaskUnblockTime )\r\n        {\r\n            for( ; ; )\r\n            {\r\n                if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE )\r\n                {\r\n                    /* The delayed list is empty.  Set xNextTaskUnblockTime\r\n                     * to the maximum possible value so it is extremely\r\n                     * unlikely that the\r\n                     * if( xTickCount >= xNextTaskUnblockTime ) test will pass\r\n                     * next time through. */\r\n                    xNextTaskUnblockTime = portMAX_DELAY;\r\n                    break;\r\n                }\r\n                else\r\n                {\r\n                    /* The delayed list is not empty, get the value of the\r\n                     * item at the head of the delayed list.  This is the time\r\n                     * at which the task at the head of the delayed list must\r\n                     * be removed from the Blocked state. */\r\n                    /* MISRA Ref 11.5.3 [Void pointer assignment] */\r\n                    /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n                    /* coverity[misra_c_2012_rule_11_5_violation] */\r\n                    pxTCB = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList );\r\n                    xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) );\r\n\r\n                    if( xConstTickCount < xItemValue )\r\n                    {\r\n                        /* It is not time to unblock this item yet, but the\r\n                         * item value is the time at which the task at the head\r\n                         * of the blocked list must be removed from the Blocked\r\n                         * state -  so record the item value in\r\n                         * xNextTaskUnblockTime. */\r\n                        xNextTaskUnblockTime = xItemValue;\r\n                        break;\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n\r\n                    /* It is time to remove the item from the Blocked state. */\r\n                    listREMOVE_ITEM( &( pxTCB->xStateListItem ) );\r\n\r\n                    /* Is the task waiting on an event also?  If so remove\r\n                     * it from the event list. */\r\n                    if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL )\r\n                    {\r\n                        listREMOVE_ITEM( &( pxTCB->xEventListItem ) );\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n\r\n                    /* Place the unblocked task into the appropriate ready\r\n                     * list. */\r\n                    prvAddTaskToReadyList( pxTCB );\r\n\r\n                    /* A task being unblocked cannot cause an immediate\r\n                     * context switch if preemption is turned off. */\r\n                    #if ( configUSE_PREEMPTION == 1 )\r\n                    {\r\n                        #if ( configNUMBER_OF_CORES == 1 )\r\n                        {\r\n                            /* Preemption is on, but a context switch should\r\n                             * only be performed if the unblocked task's\r\n                             * priority is higher than the currently executing\r\n                             * task.\r\n                             * The case of equal priority tasks sharing\r\n                             * processing time (which happens when both\r\n                             * preemption and time slicing are on) is\r\n                             * handled below.*/\r\n                            if( pxTCB->uxPriority > pxCurrentTCB->uxPriority )\r\n                            {\r\n                                xSwitchRequired = pdTRUE;\r\n                            }\r\n                            else\r\n                            {\r\n                                mtCOVERAGE_TEST_MARKER();\r\n                            }\r\n                        }\r\n                        #else /* #if( configNUMBER_OF_CORES == 1 ) */\r\n                        {\r\n                            prvYieldForTask( pxTCB );\r\n                        }\r\n                        #endif /* #if( configNUMBER_OF_CORES == 1 ) */\r\n                    }\r\n                    #endif /* #if ( configUSE_PREEMPTION == 1 ) */\r\n                }\r\n            }\r\n        }\r\n\r\n        /* Tasks of equal priority to the currently running task will share\r\n         * processing time (time slice) if preemption is on, and the application\r\n         * writer has not explicitly turned time slicing off. */\r\n        #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) )\r\n        {\r\n            #if ( configNUMBER_OF_CORES == 1 )\r\n            {\r\n                if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCB->uxPriority ] ) ) > 1U )\r\n                {\r\n                    xSwitchRequired = pdTRUE;\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            #else /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n            {\r\n                BaseType_t xCoreID;\r\n\r\n                for( xCoreID = 0; xCoreID < ( ( BaseType_t ) configNUMBER_OF_CORES ); xCoreID++ )\r\n                {\r\n                    if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ pxCurrentTCBs[ xCoreID ]->uxPriority ] ) ) > 1U )\r\n                    {\r\n                        xYieldRequiredForCore[ xCoreID ] = pdTRUE;\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n            }\r\n            #endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n        }\r\n        #endif /* #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) */\r\n\r\n        #if ( configUSE_TICK_HOOK == 1 )\r\n        {\r\n            /* Guard against the tick hook being called when the pended tick\r\n             * count is being unwound (when the scheduler is being unlocked). */\r\n            if( xPendedTicks == ( TickType_t ) 0 )\r\n            {\r\n                vApplicationTickHook();\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        #endif /* configUSE_TICK_HOOK */\r\n\r\n        #if ( configUSE_PREEMPTION == 1 )\r\n        {\r\n            #if ( configNUMBER_OF_CORES == 1 )\r\n            {\r\n                /* For single core the core ID is always 0. */\r\n                if( xYieldPendings[ 0 ] != pdFALSE )\r\n                {\r\n                    xSwitchRequired = pdTRUE;\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            #else /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n            {\r\n                BaseType_t xCoreID, xCurrentCoreID;\r\n                xCurrentCoreID = ( BaseType_t ) portGET_CORE_ID();\r\n\r\n                for( xCoreID = 0; xCoreID < ( BaseType_t ) configNUMBER_OF_CORES; xCoreID++ )\r\n                {\r\n                    #if ( configUSE_TASK_PREEMPTION_DISABLE == 1 )\r\n                        if( pxCurrentTCBs[ xCoreID ]->xPreemptionDisable == pdFALSE )\r\n                    #endif\r\n                    {\r\n                        if( ( xYieldRequiredForCore[ xCoreID ] != pdFALSE ) || ( xYieldPendings[ xCoreID ] != pdFALSE ) )\r\n                        {\r\n                            if( xCoreID == xCurrentCoreID )\r\n                            {\r\n                                xSwitchRequired = pdTRUE;\r\n                            }\r\n                            else\r\n                            {\r\n                                prvYieldCore( xCoreID );\r\n                            }\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n            #endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n        }\r\n        #endif /* #if ( configUSE_PREEMPTION == 1 ) */\r\n    }\r\n    else\r\n    {\r\n        ++xPendedTicks;\r\n\r\n        /* The tick hook gets called at regular intervals, even if the\r\n         * scheduler is locked. */\r\n        #if ( configUSE_TICK_HOOK == 1 )\r\n        {\r\n            vApplicationTickHook();\r\n        }\r\n        #endif\r\n    }\r\n\r\n    traceRETURN_xTaskIncrementTick( xSwitchRequired );\r\n\r\n    return xSwitchRequired;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_APPLICATION_TASK_TAG == 1 )\r\n\r\n    void vTaskSetApplicationTaskTag( TaskHandle_t xTask,\r\n                                     TaskHookFunction_t pxHookFunction )\r\n    {\r\n        TCB_t * xTCB;\r\n\r\n        traceENTER_vTaskSetApplicationTaskTag( xTask, pxHookFunction );\r\n\r\n        /* If xTask is NULL then it is the task hook of the calling task that is\r\n         * getting set. */\r\n        if( xTask == NULL )\r\n        {\r\n            xTCB = ( TCB_t * ) pxCurrentTCB;\r\n        }\r\n        else\r\n        {\r\n            xTCB = xTask;\r\n        }\r\n\r\n        /* Save the hook function in the TCB.  A critical section is required as\r\n         * the value can be accessed from an interrupt. */\r\n        taskENTER_CRITICAL();\r\n        {\r\n            xTCB->pxTaskTag = pxHookFunction;\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_vTaskSetApplicationTaskTag();\r\n    }\r\n\r\n#endif /* configUSE_APPLICATION_TASK_TAG */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_APPLICATION_TASK_TAG == 1 )\r\n\r\n    TaskHookFunction_t xTaskGetApplicationTaskTag( TaskHandle_t xTask )\r\n    {\r\n        TCB_t * pxTCB;\r\n        TaskHookFunction_t xReturn;\r\n\r\n        traceENTER_xTaskGetApplicationTaskTag( xTask );\r\n\r\n        /* If xTask is NULL then set the calling task's hook. */\r\n        pxTCB = prvGetTCBFromHandle( xTask );\r\n\r\n        /* Save the hook function in the TCB.  A critical section is required as\r\n         * the value can be accessed from an interrupt. */\r\n        taskENTER_CRITICAL();\r\n        {\r\n            xReturn = pxTCB->pxTaskTag;\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_xTaskGetApplicationTaskTag( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_APPLICATION_TASK_TAG */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_APPLICATION_TASK_TAG == 1 )\r\n\r\n    TaskHookFunction_t xTaskGetApplicationTaskTagFromISR( TaskHandle_t xTask )\r\n    {\r\n        TCB_t * pxTCB;\r\n        TaskHookFunction_t xReturn;\r\n        UBaseType_t uxSavedInterruptStatus;\r\n\r\n        traceENTER_xTaskGetApplicationTaskTagFromISR( xTask );\r\n\r\n        /* If xTask is NULL then set the calling task's hook. */\r\n        pxTCB = prvGetTCBFromHandle( xTask );\r\n\r\n        /* Save the hook function in the TCB.  A critical section is required as\r\n         * the value can be accessed from an interrupt. */\r\n        uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();\r\n        {\r\n            xReturn = pxTCB->pxTaskTag;\r\n        }\r\n        taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );\r\n\r\n        traceRETURN_xTaskGetApplicationTaskTagFromISR( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_APPLICATION_TASK_TAG */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_APPLICATION_TASK_TAG == 1 )\r\n\r\n    BaseType_t xTaskCallApplicationTaskHook( TaskHandle_t xTask,\r\n                                             void * pvParameter )\r\n    {\r\n        TCB_t * xTCB;\r\n        BaseType_t xReturn;\r\n\r\n        traceENTER_xTaskCallApplicationTaskHook( xTask, pvParameter );\r\n\r\n        /* If xTask is NULL then we are calling our own task hook. */\r\n        if( xTask == NULL )\r\n        {\r\n            xTCB = pxCurrentTCB;\r\n        }\r\n        else\r\n        {\r\n            xTCB = xTask;\r\n        }\r\n\r\n        if( xTCB->pxTaskTag != NULL )\r\n        {\r\n            xReturn = xTCB->pxTaskTag( pvParameter );\r\n        }\r\n        else\r\n        {\r\n            xReturn = pdFAIL;\r\n        }\r\n\r\n        traceRETURN_xTaskCallApplicationTaskHook( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_APPLICATION_TASK_TAG */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configNUMBER_OF_CORES == 1 )\r\n    void vTaskSwitchContext( void )\r\n    {\r\n        traceENTER_vTaskSwitchContext();\r\n\r\n        if( uxSchedulerSuspended != ( UBaseType_t ) 0U )\r\n        {\r\n            /* The scheduler is currently suspended - do not allow a context\r\n             * switch. */\r\n            xYieldPendings[ 0 ] = pdTRUE;\r\n        }\r\n        else\r\n        {\r\n            xYieldPendings[ 0 ] = pdFALSE;\r\n            traceTASK_SWITCHED_OUT();\r\n\r\n            #if ( configGENERATE_RUN_TIME_STATS == 1 )\r\n            {\r\n                #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE\r\n                    portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime[ 0 ] );\r\n                #else\r\n                    ulTotalRunTime[ 0 ] = portGET_RUN_TIME_COUNTER_VALUE();\r\n                #endif\r\n\r\n                /* Add the amount of time the task has been running to the\r\n                 * accumulated time so far.  The time the task started running was\r\n                 * stored in ulTaskSwitchedInTime.  Note that there is no overflow\r\n                 * protection here so count values are only valid until the timer\r\n                 * overflows.  The guard against negative values is to protect\r\n                 * against suspect run time stat counter implementations - which\r\n                 * are provided by the application, not the kernel. */\r\n                if( ulTotalRunTime[ 0 ] > ulTaskSwitchedInTime[ 0 ] )\r\n                {\r\n                    pxCurrentTCB->ulRunTimeCounter += ( ulTotalRunTime[ 0 ] - ulTaskSwitchedInTime[ 0 ] );\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n\r\n                ulTaskSwitchedInTime[ 0 ] = ulTotalRunTime[ 0 ];\r\n            }\r\n            #endif /* configGENERATE_RUN_TIME_STATS */\r\n\r\n            /* Check for stack overflow, if configured. */\r\n            taskCHECK_FOR_STACK_OVERFLOW();\r\n\r\n            /* Before the currently running task is switched out, save its errno. */\r\n            #if ( configUSE_POSIX_ERRNO == 1 )\r\n            {\r\n                pxCurrentTCB->iTaskErrno = FreeRTOS_errno;\r\n            }\r\n            #endif\r\n\r\n            /* Select a new task to run using either the generic C or port\r\n             * optimised asm code. */\r\n            /* MISRA Ref 11.5.3 [Void pointer assignment] */\r\n            /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n            /* coverity[misra_c_2012_rule_11_5_violation] */\r\n            taskSELECT_HIGHEST_PRIORITY_TASK();\r\n            traceTASK_SWITCHED_IN();\r\n\r\n            /* Macro to inject port specific behaviour immediately after\r\n             * switching tasks, such as setting an end of stack watchpoint\r\n             * or reconfiguring the MPU. */\r\n            portTASK_SWITCH_HOOK( pxCurrentTCB );\r\n\r\n            /* After the new task is switched in, update the global errno. */\r\n            #if ( configUSE_POSIX_ERRNO == 1 )\r\n            {\r\n                FreeRTOS_errno = pxCurrentTCB->iTaskErrno;\r\n            }\r\n            #endif\r\n\r\n            #if ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 )\r\n            {\r\n                /* Switch C-Runtime's TLS Block to point to the TLS\r\n                 * Block specific to this task. */\r\n                configSET_TLS_BLOCK( pxCurrentTCB->xTLSBlock );\r\n            }\r\n            #endif\r\n        }\r\n\r\n        traceRETURN_vTaskSwitchContext();\r\n    }\r\n#else /* if ( configNUMBER_OF_CORES == 1 ) */\r\n    void vTaskSwitchContext( BaseType_t xCoreID )\r\n    {\r\n        traceENTER_vTaskSwitchContext();\r\n\r\n        /* Acquire both locks:\r\n         * - The ISR lock protects the ready list from simultaneous access by\r\n         *   both other ISRs and tasks.\r\n         * - We also take the task lock to pause here in case another core has\r\n         *   suspended the scheduler. We don't want to simply set xYieldPending\r\n         *   and move on if another core suspended the scheduler. We should only\r\n         *   do that if the current core has suspended the scheduler. */\r\n\r\n        portGET_TASK_LOCK(); /* Must always acquire the task lock first. */\r\n        portGET_ISR_LOCK();\r\n        {\r\n            /* vTaskSwitchContext() must never be called from within a critical section.\r\n             * This is not necessarily true for single core FreeRTOS, but it is for this\r\n             * SMP port. */\r\n            configASSERT( portGET_CRITICAL_NESTING_COUNT() == 0 );\r\n\r\n            if( uxSchedulerSuspended != ( UBaseType_t ) 0U )\r\n            {\r\n                /* The scheduler is currently suspended - do not allow a context\r\n                 * switch. */\r\n                xYieldPendings[ xCoreID ] = pdTRUE;\r\n            }\r\n            else\r\n            {\r\n                xYieldPendings[ xCoreID ] = pdFALSE;\r\n                traceTASK_SWITCHED_OUT();\r\n\r\n                #if ( configGENERATE_RUN_TIME_STATS == 1 )\r\n                {\r\n                    #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE\r\n                        portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime[ xCoreID ] );\r\n                    #else\r\n                        ulTotalRunTime[ xCoreID ] = portGET_RUN_TIME_COUNTER_VALUE();\r\n                    #endif\r\n\r\n                    /* Add the amount of time the task has been running to the\r\n                     * accumulated time so far.  The time the task started running was\r\n                     * stored in ulTaskSwitchedInTime.  Note that there is no overflow\r\n                     * protection here so count values are only valid until the timer\r\n                     * overflows.  The guard against negative values is to protect\r\n                     * against suspect run time stat counter implementations - which\r\n                     * are provided by the application, not the kernel. */\r\n                    if( ulTotalRunTime[ xCoreID ] > ulTaskSwitchedInTime[ xCoreID ] )\r\n                    {\r\n                        pxCurrentTCBs[ xCoreID ]->ulRunTimeCounter += ( ulTotalRunTime[ xCoreID ] - ulTaskSwitchedInTime[ xCoreID ] );\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n\r\n                    ulTaskSwitchedInTime[ xCoreID ] = ulTotalRunTime[ xCoreID ];\r\n                }\r\n                #endif /* configGENERATE_RUN_TIME_STATS */\r\n\r\n                /* Check for stack overflow, if configured. */\r\n                taskCHECK_FOR_STACK_OVERFLOW();\r\n\r\n                /* Before the currently running task is switched out, save its errno. */\r\n                #if ( configUSE_POSIX_ERRNO == 1 )\r\n                {\r\n                    pxCurrentTCBs[ xCoreID ]->iTaskErrno = FreeRTOS_errno;\r\n                }\r\n                #endif\r\n\r\n                /* Select a new task to run. */\r\n                taskSELECT_HIGHEST_PRIORITY_TASK( xCoreID );\r\n                traceTASK_SWITCHED_IN();\r\n\r\n                /* Macro to inject port specific behaviour immediately after\r\n                 * switching tasks, such as setting an end of stack watchpoint\r\n                 * or reconfiguring the MPU. */\r\n                portTASK_SWITCH_HOOK( pxCurrentTCBs[ portGET_CORE_ID() ] );\r\n\r\n                /* After the new task is switched in, update the global errno. */\r\n                #if ( configUSE_POSIX_ERRNO == 1 )\r\n                {\r\n                    FreeRTOS_errno = pxCurrentTCBs[ xCoreID ]->iTaskErrno;\r\n                }\r\n                #endif\r\n\r\n                #if ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 )\r\n                {\r\n                    /* Switch C-Runtime's TLS Block to point to the TLS\r\n                     * Block specific to this task. */\r\n                    configSET_TLS_BLOCK( pxCurrentTCBs[ xCoreID ]->xTLSBlock );\r\n                }\r\n                #endif\r\n            }\r\n        }\r\n        portRELEASE_ISR_LOCK();\r\n        portRELEASE_TASK_LOCK();\r\n\r\n        traceRETURN_vTaskSwitchContext();\r\n    }\r\n#endif /* if ( configNUMBER_OF_CORES > 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vTaskPlaceOnEventList( List_t * const pxEventList,\r\n                            const TickType_t xTicksToWait )\r\n{\r\n    traceENTER_vTaskPlaceOnEventList( pxEventList, xTicksToWait );\r\n\r\n    configASSERT( pxEventList );\r\n\r\n    /* THIS FUNCTION MUST BE CALLED WITH THE\r\n     * SCHEDULER SUSPENDED AND THE QUEUE BEING ACCESSED LOCKED. */\r\n\r\n    /* Place the event list item of the TCB in the appropriate event list.\r\n     * This is placed in the list in priority order so the highest priority task\r\n     * is the first to be woken by the event.\r\n     *\r\n     * Note: Lists are sorted in ascending order by ListItem_t.xItemValue.\r\n     * Normally, the xItemValue of a TCB's ListItem_t members is:\r\n     *      xItemValue = ( configMAX_PRIORITIES - uxPriority )\r\n     * Therefore, the event list is sorted in descending priority order.\r\n     *\r\n     * The queue that contains the event list is locked, preventing\r\n     * simultaneous access from interrupts. */\r\n    vListInsert( pxEventList, &( pxCurrentTCB->xEventListItem ) );\r\n\r\n    prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE );\r\n\r\n    traceRETURN_vTaskPlaceOnEventList();\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vTaskPlaceOnUnorderedEventList( List_t * pxEventList,\r\n                                     const TickType_t xItemValue,\r\n                                     const TickType_t xTicksToWait )\r\n{\r\n    traceENTER_vTaskPlaceOnUnorderedEventList( pxEventList, xItemValue, xTicksToWait );\r\n\r\n    configASSERT( pxEventList );\r\n\r\n    /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED.  It is used by\r\n     * the event groups implementation. */\r\n    configASSERT( uxSchedulerSuspended != ( UBaseType_t ) 0U );\r\n\r\n    /* Store the item value in the event list item.  It is safe to access the\r\n     * event list item here as interrupts won't access the event list item of a\r\n     * task that is not in the Blocked state. */\r\n    listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ), xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE );\r\n\r\n    /* Place the event list item of the TCB at the end of the appropriate event\r\n     * list.  It is safe to access the event list here because it is part of an\r\n     * event group implementation - and interrupts don't access event groups\r\n     * directly (instead they access them indirectly by pending function calls to\r\n     * the task level). */\r\n    listINSERT_END( pxEventList, &( pxCurrentTCB->xEventListItem ) );\r\n\r\n    prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE );\r\n\r\n    traceRETURN_vTaskPlaceOnUnorderedEventList();\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TIMERS == 1 )\r\n\r\n    void vTaskPlaceOnEventListRestricted( List_t * const pxEventList,\r\n                                          TickType_t xTicksToWait,\r\n                                          const BaseType_t xWaitIndefinitely )\r\n    {\r\n        traceENTER_vTaskPlaceOnEventListRestricted( pxEventList, xTicksToWait, xWaitIndefinitely );\r\n\r\n        configASSERT( pxEventList );\r\n\r\n        /* This function should not be called by application code hence the\r\n         * 'Restricted' in its name.  It is not part of the public API.  It is\r\n         * designed for use by kernel code, and has special calling requirements -\r\n         * it should be called with the scheduler suspended. */\r\n\r\n\r\n        /* Place the event list item of the TCB in the appropriate event list.\r\n         * In this case it is assume that this is the only task that is going to\r\n         * be waiting on this event list, so the faster vListInsertEnd() function\r\n         * can be used in place of vListInsert. */\r\n        listINSERT_END( pxEventList, &( pxCurrentTCB->xEventListItem ) );\r\n\r\n        /* If the task should block indefinitely then set the block time to a\r\n         * value that will be recognised as an indefinite delay inside the\r\n         * prvAddCurrentTaskToDelayedList() function. */\r\n        if( xWaitIndefinitely != pdFALSE )\r\n        {\r\n            xTicksToWait = portMAX_DELAY;\r\n        }\r\n\r\n        traceTASK_DELAY_UNTIL( ( xTickCount + xTicksToWait ) );\r\n        prvAddCurrentTaskToDelayedList( xTicksToWait, xWaitIndefinitely );\r\n\r\n        traceRETURN_vTaskPlaceOnEventListRestricted();\r\n    }\r\n\r\n#endif /* configUSE_TIMERS */\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xTaskRemoveFromEventList( const List_t * const pxEventList )\r\n{\r\n    TCB_t * pxUnblockedTCB;\r\n    BaseType_t xReturn;\r\n\r\n    traceENTER_xTaskRemoveFromEventList( pxEventList );\r\n\r\n    /* THIS FUNCTION MUST BE CALLED FROM A CRITICAL SECTION.  It can also be\r\n     * called from a critical section within an ISR. */\r\n\r\n    /* The event list is sorted in priority order, so the first in the list can\r\n     * be removed as it is known to be the highest priority.  Remove the TCB from\r\n     * the delayed list, and add it to the ready list.\r\n     *\r\n     * If an event is for a queue that is locked then this function will never\r\n     * get called - the lock count on the queue will get modified instead.  This\r\n     * means exclusive access to the event list is guaranteed here.\r\n     *\r\n     * This function assumes that a check has already been made to ensure that\r\n     * pxEventList is not empty. */\r\n    /* MISRA Ref 11.5.3 [Void pointer assignment] */\r\n    /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n    /* coverity[misra_c_2012_rule_11_5_violation] */\r\n    pxUnblockedTCB = listGET_OWNER_OF_HEAD_ENTRY( pxEventList );\r\n    configASSERT( pxUnblockedTCB );\r\n    listREMOVE_ITEM( &( pxUnblockedTCB->xEventListItem ) );\r\n\r\n    if( uxSchedulerSuspended == ( UBaseType_t ) 0U )\r\n    {\r\n        listREMOVE_ITEM( &( pxUnblockedTCB->xStateListItem ) );\r\n        prvAddTaskToReadyList( pxUnblockedTCB );\r\n\r\n        #if ( configUSE_TICKLESS_IDLE != 0 )\r\n        {\r\n            /* If a task is blocked on a kernel object then xNextTaskUnblockTime\r\n             * might be set to the blocked task's time out time.  If the task is\r\n             * unblocked for a reason other than a timeout xNextTaskUnblockTime is\r\n             * normally left unchanged, because it is automatically reset to a new\r\n             * value when the tick count equals xNextTaskUnblockTime.  However if\r\n             * tickless idling is used it might be more important to enter sleep mode\r\n             * at the earliest possible time - so reset xNextTaskUnblockTime here to\r\n             * ensure it is updated at the earliest possible time. */\r\n            prvResetNextTaskUnblockTime();\r\n        }\r\n        #endif\r\n    }\r\n    else\r\n    {\r\n        /* The delayed and ready lists cannot be accessed, so hold this task\r\n         * pending until the scheduler is resumed. */\r\n        listINSERT_END( &( xPendingReadyList ), &( pxUnblockedTCB->xEventListItem ) );\r\n    }\r\n\r\n    #if ( configNUMBER_OF_CORES == 1 )\r\n    {\r\n        if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority )\r\n        {\r\n            /* Return true if the task removed from the event list has a higher\r\n             * priority than the calling task.  This allows the calling task to know if\r\n             * it should force a context switch now. */\r\n            xReturn = pdTRUE;\r\n\r\n            /* Mark that a yield is pending in case the user is not using the\r\n             * \"xHigherPriorityTaskWoken\" parameter to an ISR safe FreeRTOS function. */\r\n            xYieldPendings[ 0 ] = pdTRUE;\r\n        }\r\n        else\r\n        {\r\n            xReturn = pdFALSE;\r\n        }\r\n    }\r\n    #else /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n    {\r\n        xReturn = pdFALSE;\r\n\r\n        #if ( configUSE_PREEMPTION == 1 )\r\n        {\r\n            prvYieldForTask( pxUnblockedTCB );\r\n\r\n            if( xYieldPendings[ portGET_CORE_ID() ] != pdFALSE )\r\n            {\r\n                xReturn = pdTRUE;\r\n            }\r\n        }\r\n        #endif /* #if ( configUSE_PREEMPTION == 1 ) */\r\n    }\r\n    #endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n\r\n    traceRETURN_xTaskRemoveFromEventList( xReturn );\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vTaskRemoveFromUnorderedEventList( ListItem_t * pxEventListItem,\r\n                                        const TickType_t xItemValue )\r\n{\r\n    TCB_t * pxUnblockedTCB;\r\n\r\n    traceENTER_vTaskRemoveFromUnorderedEventList( pxEventListItem, xItemValue );\r\n\r\n    /* THIS FUNCTION MUST BE CALLED WITH THE SCHEDULER SUSPENDED.  It is used by\r\n     * the event flags implementation. */\r\n    configASSERT( uxSchedulerSuspended != ( UBaseType_t ) 0U );\r\n\r\n    /* Store the new item value in the event list. */\r\n    listSET_LIST_ITEM_VALUE( pxEventListItem, xItemValue | taskEVENT_LIST_ITEM_VALUE_IN_USE );\r\n\r\n    /* Remove the event list form the event flag.  Interrupts do not access\r\n     * event flags. */\r\n    /* MISRA Ref 11.5.3 [Void pointer assignment] */\r\n    /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n    /* coverity[misra_c_2012_rule_11_5_violation] */\r\n    pxUnblockedTCB = listGET_LIST_ITEM_OWNER( pxEventListItem );\r\n    configASSERT( pxUnblockedTCB );\r\n    listREMOVE_ITEM( pxEventListItem );\r\n\r\n    #if ( configUSE_TICKLESS_IDLE != 0 )\r\n    {\r\n        /* If a task is blocked on a kernel object then xNextTaskUnblockTime\r\n         * might be set to the blocked task's time out time.  If the task is\r\n         * unblocked for a reason other than a timeout xNextTaskUnblockTime is\r\n         * normally left unchanged, because it is automatically reset to a new\r\n         * value when the tick count equals xNextTaskUnblockTime.  However if\r\n         * tickless idling is used it might be more important to enter sleep mode\r\n         * at the earliest possible time - so reset xNextTaskUnblockTime here to\r\n         * ensure it is updated at the earliest possible time. */\r\n        prvResetNextTaskUnblockTime();\r\n    }\r\n    #endif\r\n\r\n    /* Remove the task from the delayed list and add it to the ready list.  The\r\n     * scheduler is suspended so interrupts will not be accessing the ready\r\n     * lists. */\r\n    listREMOVE_ITEM( &( pxUnblockedTCB->xStateListItem ) );\r\n    prvAddTaskToReadyList( pxUnblockedTCB );\r\n\r\n    #if ( configNUMBER_OF_CORES == 1 )\r\n    {\r\n        if( pxUnblockedTCB->uxPriority > pxCurrentTCB->uxPriority )\r\n        {\r\n            /* The unblocked task has a priority above that of the calling task, so\r\n             * a context switch is required.  This function is called with the\r\n             * scheduler suspended so xYieldPending is set so the context switch\r\n             * occurs immediately that the scheduler is resumed (unsuspended). */\r\n            xYieldPendings[ 0 ] = pdTRUE;\r\n        }\r\n    }\r\n    #else /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n    {\r\n        #if ( configUSE_PREEMPTION == 1 )\r\n        {\r\n            taskENTER_CRITICAL();\r\n            {\r\n                prvYieldForTask( pxUnblockedTCB );\r\n            }\r\n            taskEXIT_CRITICAL();\r\n        }\r\n        #endif\r\n    }\r\n    #endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n\r\n    traceRETURN_vTaskRemoveFromUnorderedEventList();\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vTaskSetTimeOutState( TimeOut_t * const pxTimeOut )\r\n{\r\n    traceENTER_vTaskSetTimeOutState( pxTimeOut );\r\n\r\n    configASSERT( pxTimeOut );\r\n    taskENTER_CRITICAL();\r\n    {\r\n        pxTimeOut->xOverflowCount = xNumOfOverflows;\r\n        pxTimeOut->xTimeOnEntering = xTickCount;\r\n    }\r\n    taskEXIT_CRITICAL();\r\n\r\n    traceRETURN_vTaskSetTimeOutState();\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vTaskInternalSetTimeOutState( TimeOut_t * const pxTimeOut )\r\n{\r\n    traceENTER_vTaskInternalSetTimeOutState( pxTimeOut );\r\n\r\n    /* For internal use only as it does not use a critical section. */\r\n    pxTimeOut->xOverflowCount = xNumOfOverflows;\r\n    pxTimeOut->xTimeOnEntering = xTickCount;\r\n\r\n    traceRETURN_vTaskInternalSetTimeOutState();\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nBaseType_t xTaskCheckForTimeOut( TimeOut_t * const pxTimeOut,\r\n                                 TickType_t * const pxTicksToWait )\r\n{\r\n    BaseType_t xReturn;\r\n\r\n    traceENTER_xTaskCheckForTimeOut( pxTimeOut, pxTicksToWait );\r\n\r\n    configASSERT( pxTimeOut );\r\n    configASSERT( pxTicksToWait );\r\n\r\n    taskENTER_CRITICAL();\r\n    {\r\n        /* Minor optimisation.  The tick count cannot change in this block. */\r\n        const TickType_t xConstTickCount = xTickCount;\r\n        const TickType_t xElapsedTime = xConstTickCount - pxTimeOut->xTimeOnEntering;\r\n\r\n        #if ( INCLUDE_xTaskAbortDelay == 1 )\r\n            if( pxCurrentTCB->ucDelayAborted != ( uint8_t ) pdFALSE )\r\n            {\r\n                /* The delay was aborted, which is not the same as a time out,\r\n                 * but has the same result. */\r\n                pxCurrentTCB->ucDelayAborted = pdFALSE;\r\n                xReturn = pdTRUE;\r\n            }\r\n            else\r\n        #endif\r\n\r\n        #if ( INCLUDE_vTaskSuspend == 1 )\r\n            if( *pxTicksToWait == portMAX_DELAY )\r\n            {\r\n                /* If INCLUDE_vTaskSuspend is set to 1 and the block time\r\n                 * specified is the maximum block time then the task should block\r\n                 * indefinitely, and therefore never time out. */\r\n                xReturn = pdFALSE;\r\n            }\r\n            else\r\n        #endif\r\n\r\n        if( ( xNumOfOverflows != pxTimeOut->xOverflowCount ) && ( xConstTickCount >= pxTimeOut->xTimeOnEntering ) )\r\n        {\r\n            /* The tick count is greater than the time at which\r\n             * vTaskSetTimeout() was called, but has also overflowed since\r\n             * vTaskSetTimeOut() was called.  It must have wrapped all the way\r\n             * around and gone past again. This passed since vTaskSetTimeout()\r\n             * was called. */\r\n            xReturn = pdTRUE;\r\n            *pxTicksToWait = ( TickType_t ) 0;\r\n        }\r\n        else if( xElapsedTime < *pxTicksToWait )\r\n        {\r\n            /* Not a genuine timeout. Adjust parameters for time remaining. */\r\n            *pxTicksToWait -= xElapsedTime;\r\n            vTaskInternalSetTimeOutState( pxTimeOut );\r\n            xReturn = pdFALSE;\r\n        }\r\n        else\r\n        {\r\n            *pxTicksToWait = ( TickType_t ) 0;\r\n            xReturn = pdTRUE;\r\n        }\r\n    }\r\n    taskEXIT_CRITICAL();\r\n\r\n    traceRETURN_xTaskCheckForTimeOut( xReturn );\r\n\r\n    return xReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nvoid vTaskMissedYield( void )\r\n{\r\n    traceENTER_vTaskMissedYield();\r\n\r\n    /* Must be called from within a critical section. */\r\n    xYieldPendings[ portGET_CORE_ID() ] = pdTRUE;\r\n\r\n    traceRETURN_vTaskMissedYield();\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n\r\n    UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask )\r\n    {\r\n        UBaseType_t uxReturn;\r\n        TCB_t const * pxTCB;\r\n\r\n        traceENTER_uxTaskGetTaskNumber( xTask );\r\n\r\n        if( xTask != NULL )\r\n        {\r\n            pxTCB = xTask;\r\n            uxReturn = pxTCB->uxTaskNumber;\r\n        }\r\n        else\r\n        {\r\n            uxReturn = 0U;\r\n        }\r\n\r\n        traceRETURN_uxTaskGetTaskNumber( uxReturn );\r\n\r\n        return uxReturn;\r\n    }\r\n\r\n#endif /* configUSE_TRACE_FACILITY */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n\r\n    void vTaskSetTaskNumber( TaskHandle_t xTask,\r\n                             const UBaseType_t uxHandle )\r\n    {\r\n        TCB_t * pxTCB;\r\n\r\n        traceENTER_vTaskSetTaskNumber( xTask, uxHandle );\r\n\r\n        if( xTask != NULL )\r\n        {\r\n            pxTCB = xTask;\r\n            pxTCB->uxTaskNumber = uxHandle;\r\n        }\r\n\r\n        traceRETURN_vTaskSetTaskNumber();\r\n    }\r\n\r\n#endif /* configUSE_TRACE_FACILITY */\r\n/*-----------------------------------------------------------*/\r\n\r\n/*\r\n * -----------------------------------------------------------\r\n * The passive idle task.\r\n * ----------------------------------------------------------\r\n *\r\n * The passive idle task is used for all the additional cores in a SMP\r\n * system. There must be only 1 active idle task and the rest are passive\r\n * idle tasks.\r\n *\r\n * The portTASK_FUNCTION() macro is used to allow port/compiler specific\r\n * language extensions.  The equivalent prototype for this function is:\r\n *\r\n * void prvPassiveIdleTask( void *pvParameters );\r\n */\r\n\r\n#if ( configNUMBER_OF_CORES > 1 )\r\n    static portTASK_FUNCTION( prvPassiveIdleTask, pvParameters )\r\n    {\r\n        ( void ) pvParameters;\r\n\r\n        taskYIELD();\r\n\r\n        for( ; configCONTROL_INFINITE_LOOP(); )\r\n        {\r\n            #if ( configUSE_PREEMPTION == 0 )\r\n            {\r\n                /* If we are not using preemption we keep forcing a task switch to\r\n                 * see if any other task has become available.  If we are using\r\n                 * preemption we don't need to do this as any task becoming available\r\n                 * will automatically get the processor anyway. */\r\n                taskYIELD();\r\n            }\r\n            #endif /* configUSE_PREEMPTION */\r\n\r\n            #if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) )\r\n            {\r\n                /* When using preemption tasks of equal priority will be\r\n                 * timesliced.  If a task that is sharing the idle priority is ready\r\n                 * to run then the idle task should yield before the end of the\r\n                 * timeslice.\r\n                 *\r\n                 * A critical region is not required here as we are just reading from\r\n                 * the list, and an occasional incorrect value will not matter.  If\r\n                 * the ready list at the idle priority contains one more task than the\r\n                 * number of idle tasks, which is equal to the configured numbers of cores\r\n                 * then a task other than the idle task is ready to execute. */\r\n                if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) configNUMBER_OF_CORES )\r\n                {\r\n                    taskYIELD();\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) */\r\n\r\n            #if ( configUSE_PASSIVE_IDLE_HOOK == 1 )\r\n            {\r\n                /* Call the user defined function from within the idle task.  This\r\n                 * allows the application designer to add background functionality\r\n                 * without the overhead of a separate task.\r\n                 *\r\n                 * This hook is intended to manage core activity such as disabling cores that go idle.\r\n                 *\r\n                 * NOTE: vApplicationPassiveIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES,\r\n                 * CALL A FUNCTION THAT MIGHT BLOCK. */\r\n                vApplicationPassiveIdleHook();\r\n            }\r\n            #endif /* configUSE_PASSIVE_IDLE_HOOK */\r\n        }\r\n    }\r\n#endif /* #if ( configNUMBER_OF_CORES > 1 ) */\r\n\r\n/*\r\n * -----------------------------------------------------------\r\n * The idle task.\r\n * ----------------------------------------------------------\r\n *\r\n * The portTASK_FUNCTION() macro is used to allow port/compiler specific\r\n * language extensions.  The equivalent prototype for this function is:\r\n *\r\n * void prvIdleTask( void *pvParameters );\r\n *\r\n */\r\n\r\nstatic portTASK_FUNCTION( prvIdleTask, pvParameters )\r\n{\r\n    /* Stop warnings. */\r\n    ( void ) pvParameters;\r\n\r\n    /** THIS IS THE RTOS IDLE TASK - WHICH IS CREATED AUTOMATICALLY WHEN THE\r\n     * SCHEDULER IS STARTED. **/\r\n\r\n    /* In case a task that has a secure context deletes itself, in which case\r\n     * the idle task is responsible for deleting the task's secure context, if\r\n     * any. */\r\n    portALLOCATE_SECURE_CONTEXT( configMINIMAL_SECURE_STACK_SIZE );\r\n\r\n    #if ( configNUMBER_OF_CORES > 1 )\r\n    {\r\n        /* SMP all cores start up in the idle task. This initial yield gets the application\r\n         * tasks started. */\r\n        taskYIELD();\r\n    }\r\n    #endif /* #if ( configNUMBER_OF_CORES > 1 ) */\r\n\r\n    for( ; configCONTROL_INFINITE_LOOP(); )\r\n    {\r\n        /* See if any tasks have deleted themselves - if so then the idle task\r\n         * is responsible for freeing the deleted task's TCB and stack. */\r\n        prvCheckTasksWaitingTermination();\r\n\r\n        #if ( configUSE_PREEMPTION == 0 )\r\n        {\r\n            /* If we are not using preemption we keep forcing a task switch to\r\n             * see if any other task has become available.  If we are using\r\n             * preemption we don't need to do this as any task becoming available\r\n             * will automatically get the processor anyway. */\r\n            taskYIELD();\r\n        }\r\n        #endif /* configUSE_PREEMPTION */\r\n\r\n        #if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) )\r\n        {\r\n            /* When using preemption tasks of equal priority will be\r\n             * timesliced.  If a task that is sharing the idle priority is ready\r\n             * to run then the idle task should yield before the end of the\r\n             * timeslice.\r\n             *\r\n             * A critical region is not required here as we are just reading from\r\n             * the list, and an occasional incorrect value will not matter.  If\r\n             * the ready list at the idle priority contains one more task than the\r\n             * number of idle tasks, which is equal to the configured numbers of cores\r\n             * then a task other than the idle task is ready to execute. */\r\n            if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ tskIDLE_PRIORITY ] ) ) > ( UBaseType_t ) configNUMBER_OF_CORES )\r\n            {\r\n                taskYIELD();\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        #endif /* ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) */\r\n\r\n        #if ( configUSE_IDLE_HOOK == 1 )\r\n        {\r\n            /* Call the user defined function from within the idle task. */\r\n            vApplicationIdleHook();\r\n        }\r\n        #endif /* configUSE_IDLE_HOOK */\r\n\r\n        /* This conditional compilation should use inequality to 0, not equality\r\n         * to 1.  This is to ensure portSUPPRESS_TICKS_AND_SLEEP() is called when\r\n         * user defined low power mode  implementations require\r\n         * configUSE_TICKLESS_IDLE to be set to a value other than 1. */\r\n        #if ( configUSE_TICKLESS_IDLE != 0 )\r\n        {\r\n            TickType_t xExpectedIdleTime;\r\n\r\n            /* It is not desirable to suspend then resume the scheduler on\r\n             * each iteration of the idle task.  Therefore, a preliminary\r\n             * test of the expected idle time is performed without the\r\n             * scheduler suspended.  The result here is not necessarily\r\n             * valid. */\r\n            xExpectedIdleTime = prvGetExpectedIdleTime();\r\n\r\n            if( xExpectedIdleTime >= ( TickType_t ) configEXPECTED_IDLE_TIME_BEFORE_SLEEP )\r\n            {\r\n                vTaskSuspendAll();\r\n                {\r\n                    /* Now the scheduler is suspended, the expected idle\r\n                     * time can be sampled again, and this time its value can\r\n                     * be used. */\r\n                    configASSERT( xNextTaskUnblockTime >= xTickCount );\r\n                    xExpectedIdleTime = prvGetExpectedIdleTime();\r\n\r\n                    /* Define the following macro to set xExpectedIdleTime to 0\r\n                     * if the application does not want\r\n                     * portSUPPRESS_TICKS_AND_SLEEP() to be called. */\r\n                    configPRE_SUPPRESS_TICKS_AND_SLEEP_PROCESSING( xExpectedIdleTime );\r\n\r\n                    if( xExpectedIdleTime >= ( TickType_t ) configEXPECTED_IDLE_TIME_BEFORE_SLEEP )\r\n                    {\r\n                        traceLOW_POWER_IDLE_BEGIN();\r\n                        portSUPPRESS_TICKS_AND_SLEEP( xExpectedIdleTime );\r\n                        traceLOW_POWER_IDLE_END();\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                ( void ) xTaskResumeAll();\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        #endif /* configUSE_TICKLESS_IDLE */\r\n\r\n        #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_PASSIVE_IDLE_HOOK == 1 ) )\r\n        {\r\n            /* Call the user defined function from within the idle task.  This\r\n             * allows the application designer to add background functionality\r\n             * without the overhead of a separate task.\r\n             *\r\n             * This hook is intended to manage core activity such as disabling cores that go idle.\r\n             *\r\n             * NOTE: vApplicationPassiveIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES,\r\n             * CALL A FUNCTION THAT MIGHT BLOCK. */\r\n            vApplicationPassiveIdleHook();\r\n        }\r\n        #endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_PASSIVE_IDLE_HOOK == 1 ) ) */\r\n    }\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TICKLESS_IDLE != 0 )\r\n\r\n    eSleepModeStatus eTaskConfirmSleepModeStatus( void )\r\n    {\r\n        #if ( INCLUDE_vTaskSuspend == 1 )\r\n            /* The idle task exists in addition to the application tasks. */\r\n            const UBaseType_t uxNonApplicationTasks = configNUMBER_OF_CORES;\r\n        #endif /* INCLUDE_vTaskSuspend */\r\n\r\n        eSleepModeStatus eReturn = eStandardSleep;\r\n\r\n        traceENTER_eTaskConfirmSleepModeStatus();\r\n\r\n        /* This function must be called from a critical section. */\r\n\r\n        if( listCURRENT_LIST_LENGTH( &xPendingReadyList ) != 0U )\r\n        {\r\n            /* A task was made ready while the scheduler was suspended. */\r\n            eReturn = eAbortSleep;\r\n        }\r\n        else if( xYieldPendings[ portGET_CORE_ID() ] != pdFALSE )\r\n        {\r\n            /* A yield was pended while the scheduler was suspended. */\r\n            eReturn = eAbortSleep;\r\n        }\r\n        else if( xPendedTicks != 0U )\r\n        {\r\n            /* A tick interrupt has already occurred but was held pending\r\n             * because the scheduler is suspended. */\r\n            eReturn = eAbortSleep;\r\n        }\r\n\r\n        #if ( INCLUDE_vTaskSuspend == 1 )\r\n            else if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == ( uxCurrentNumberOfTasks - uxNonApplicationTasks ) )\r\n            {\r\n                /* If all the tasks are in the suspended list (which might mean they\r\n                 * have an infinite block time rather than actually being suspended)\r\n                 * then it is safe to turn all clocks off and just wait for external\r\n                 * interrupts. */\r\n                eReturn = eNoTasksWaitingTimeout;\r\n            }\r\n        #endif /* INCLUDE_vTaskSuspend */\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_eTaskConfirmSleepModeStatus( eReturn );\r\n\r\n        return eReturn;\r\n    }\r\n\r\n#endif /* configUSE_TICKLESS_IDLE */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 )\r\n\r\n    void vTaskSetThreadLocalStoragePointer( TaskHandle_t xTaskToSet,\r\n                                            BaseType_t xIndex,\r\n                                            void * pvValue )\r\n    {\r\n        TCB_t * pxTCB;\r\n\r\n        traceENTER_vTaskSetThreadLocalStoragePointer( xTaskToSet, xIndex, pvValue );\r\n\r\n        if( ( xIndex >= 0 ) &&\r\n            ( xIndex < ( BaseType_t ) configNUM_THREAD_LOCAL_STORAGE_POINTERS ) )\r\n        {\r\n            pxTCB = prvGetTCBFromHandle( xTaskToSet );\r\n            configASSERT( pxTCB != NULL );\r\n            pxTCB->pvThreadLocalStoragePointers[ xIndex ] = pvValue;\r\n        }\r\n\r\n        traceRETURN_vTaskSetThreadLocalStoragePointer();\r\n    }\r\n\r\n#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 )\r\n\r\n    void * pvTaskGetThreadLocalStoragePointer( TaskHandle_t xTaskToQuery,\r\n                                               BaseType_t xIndex )\r\n    {\r\n        void * pvReturn = NULL;\r\n        TCB_t * pxTCB;\r\n\r\n        traceENTER_pvTaskGetThreadLocalStoragePointer( xTaskToQuery, xIndex );\r\n\r\n        if( ( xIndex >= 0 ) &&\r\n            ( xIndex < ( BaseType_t ) configNUM_THREAD_LOCAL_STORAGE_POINTERS ) )\r\n        {\r\n            pxTCB = prvGetTCBFromHandle( xTaskToQuery );\r\n            pvReturn = pxTCB->pvThreadLocalStoragePointers[ xIndex ];\r\n        }\r\n        else\r\n        {\r\n            pvReturn = NULL;\r\n        }\r\n\r\n        traceRETURN_pvTaskGetThreadLocalStoragePointer( pvReturn );\r\n\r\n        return pvReturn;\r\n    }\r\n\r\n#endif /* configNUM_THREAD_LOCAL_STORAGE_POINTERS */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( portUSING_MPU_WRAPPERS == 1 )\r\n\r\n    void vTaskAllocateMPURegions( TaskHandle_t xTaskToModify,\r\n                                  const MemoryRegion_t * const pxRegions )\r\n    {\r\n        TCB_t * pxTCB;\r\n\r\n        traceENTER_vTaskAllocateMPURegions( xTaskToModify, pxRegions );\r\n\r\n        /* If null is passed in here then we are modifying the MPU settings of\r\n         * the calling task. */\r\n        pxTCB = prvGetTCBFromHandle( xTaskToModify );\r\n\r\n        vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), pxRegions, NULL, 0 );\r\n\r\n        traceRETURN_vTaskAllocateMPURegions();\r\n    }\r\n\r\n#endif /* portUSING_MPU_WRAPPERS */\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic void prvInitialiseTaskLists( void )\r\n{\r\n    UBaseType_t uxPriority;\r\n\r\n    for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )\r\n    {\r\n        vListInitialise( &( pxReadyTasksLists[ uxPriority ] ) );\r\n    }\r\n\r\n    vListInitialise( &xDelayedTaskList1 );\r\n    vListInitialise( &xDelayedTaskList2 );\r\n    vListInitialise( &xPendingReadyList );\r\n\r\n    #if ( INCLUDE_vTaskDelete == 1 )\r\n    {\r\n        vListInitialise( &xTasksWaitingTermination );\r\n    }\r\n    #endif /* INCLUDE_vTaskDelete */\r\n\r\n    #if ( INCLUDE_vTaskSuspend == 1 )\r\n    {\r\n        vListInitialise( &xSuspendedTaskList );\r\n    }\r\n    #endif /* INCLUDE_vTaskSuspend */\r\n\r\n    /* Start with pxDelayedTaskList using list1 and the pxOverflowDelayedTaskList\r\n     * using list2. */\r\n    pxDelayedTaskList = &xDelayedTaskList1;\r\n    pxOverflowDelayedTaskList = &xDelayedTaskList2;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic void prvCheckTasksWaitingTermination( void )\r\n{\r\n    /** THIS FUNCTION IS CALLED FROM THE RTOS IDLE TASK **/\r\n\r\n    #if ( INCLUDE_vTaskDelete == 1 )\r\n    {\r\n        TCB_t * pxTCB;\r\n\r\n        /* uxDeletedTasksWaitingCleanUp is used to prevent taskENTER_CRITICAL()\r\n         * being called too often in the idle task. */\r\n        while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U )\r\n        {\r\n            #if ( configNUMBER_OF_CORES == 1 )\r\n            {\r\n                taskENTER_CRITICAL();\r\n                {\r\n                    {\r\n                        /* MISRA Ref 11.5.3 [Void pointer assignment] */\r\n                        /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n                        /* coverity[misra_c_2012_rule_11_5_violation] */\r\n                        pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) );\r\n                        ( void ) uxListRemove( &( pxTCB->xStateListItem ) );\r\n                        --uxCurrentNumberOfTasks;\r\n                        --uxDeletedTasksWaitingCleanUp;\r\n                    }\r\n                }\r\n                taskEXIT_CRITICAL();\r\n\r\n                prvDeleteTCB( pxTCB );\r\n            }\r\n            #else /* #if( configNUMBER_OF_CORES == 1 ) */\r\n            {\r\n                pxTCB = NULL;\r\n\r\n                taskENTER_CRITICAL();\r\n                {\r\n                    /* For SMP, multiple idles can be running simultaneously\r\n                     * and we need to check that other idles did not cleanup while we were\r\n                     * waiting to enter the critical section. */\r\n                    if( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U )\r\n                    {\r\n                        /* MISRA Ref 11.5.3 [Void pointer assignment] */\r\n                        /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n                        /* coverity[misra_c_2012_rule_11_5_violation] */\r\n                        pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) );\r\n\r\n                        if( pxTCB->xTaskRunState == taskTASK_NOT_RUNNING )\r\n                        {\r\n                            ( void ) uxListRemove( &( pxTCB->xStateListItem ) );\r\n                            --uxCurrentNumberOfTasks;\r\n                            --uxDeletedTasksWaitingCleanUp;\r\n                        }\r\n                        else\r\n                        {\r\n                            /* The TCB to be deleted still has not yet been switched out\r\n                             * by the scheduler, so we will just exit this loop early and\r\n                             * try again next time. */\r\n                            taskEXIT_CRITICAL();\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n                taskEXIT_CRITICAL();\r\n\r\n                if( pxTCB != NULL )\r\n                {\r\n                    prvDeleteTCB( pxTCB );\r\n                }\r\n            }\r\n            #endif /* #if( configNUMBER_OF_CORES == 1 ) */\r\n        }\r\n    }\r\n    #endif /* INCLUDE_vTaskDelete */\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n\r\n    void vTaskGetInfo( TaskHandle_t xTask,\r\n                       TaskStatus_t * pxTaskStatus,\r\n                       BaseType_t xGetFreeStackSpace,\r\n                       eTaskState eState )\r\n    {\r\n        TCB_t * pxTCB;\r\n\r\n        traceENTER_vTaskGetInfo( xTask, pxTaskStatus, xGetFreeStackSpace, eState );\r\n\r\n        /* xTask is NULL then get the state of the calling task. */\r\n        pxTCB = prvGetTCBFromHandle( xTask );\r\n\r\n        pxTaskStatus->xHandle = pxTCB;\r\n        pxTaskStatus->pcTaskName = ( const char * ) &( pxTCB->pcTaskName[ 0 ] );\r\n        pxTaskStatus->uxCurrentPriority = pxTCB->uxPriority;\r\n        pxTaskStatus->pxStackBase = pxTCB->pxStack;\r\n        #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) )\r\n            pxTaskStatus->pxTopOfStack = ( StackType_t * ) pxTCB->pxTopOfStack;\r\n            pxTaskStatus->pxEndOfStack = pxTCB->pxEndOfStack;\r\n        #endif\r\n        pxTaskStatus->xTaskNumber = pxTCB->uxTCBNumber;\r\n\r\n        #if ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 ) )\r\n        {\r\n            pxTaskStatus->uxCoreAffinityMask = pxTCB->uxCoreAffinityMask;\r\n        }\r\n        #endif\r\n\r\n        #if ( configUSE_MUTEXES == 1 )\r\n        {\r\n            pxTaskStatus->uxBasePriority = pxTCB->uxBasePriority;\r\n        }\r\n        #else\r\n        {\r\n            pxTaskStatus->uxBasePriority = 0;\r\n        }\r\n        #endif\r\n\r\n        #if ( configGENERATE_RUN_TIME_STATS == 1 )\r\n        {\r\n            pxTaskStatus->ulRunTimeCounter = pxTCB->ulRunTimeCounter;\r\n        }\r\n        #else\r\n        {\r\n            pxTaskStatus->ulRunTimeCounter = ( configRUN_TIME_COUNTER_TYPE ) 0;\r\n        }\r\n        #endif\r\n\r\n        /* Obtaining the task state is a little fiddly, so is only done if the\r\n         * value of eState passed into this function is eInvalid - otherwise the\r\n         * state is just set to whatever is passed in. */\r\n        if( eState != eInvalid )\r\n        {\r\n            if( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE )\r\n            {\r\n                pxTaskStatus->eCurrentState = eRunning;\r\n            }\r\n            else\r\n            {\r\n                pxTaskStatus->eCurrentState = eState;\r\n\r\n                #if ( INCLUDE_vTaskSuspend == 1 )\r\n                {\r\n                    /* If the task is in the suspended list then there is a\r\n                     *  chance it is actually just blocked indefinitely - so really\r\n                     *  it should be reported as being in the Blocked state. */\r\n                    if( eState == eSuspended )\r\n                    {\r\n                        vTaskSuspendAll();\r\n                        {\r\n                            if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) != NULL )\r\n                            {\r\n                                pxTaskStatus->eCurrentState = eBlocked;\r\n                            }\r\n                            else\r\n                            {\r\n                                BaseType_t x;\r\n\r\n                                /* The task does not appear on the event list item of\r\n                                 * and of the RTOS objects, but could still be in the\r\n                                 * blocked state if it is waiting on its notification\r\n                                 * rather than waiting on an object.  If not, is\r\n                                 * suspended. */\r\n                                for( x = ( BaseType_t ) 0; x < ( BaseType_t ) configTASK_NOTIFICATION_ARRAY_ENTRIES; x++ )\r\n                                {\r\n                                    if( pxTCB->ucNotifyState[ x ] == taskWAITING_NOTIFICATION )\r\n                                    {\r\n                                        pxTaskStatus->eCurrentState = eBlocked;\r\n                                        break;\r\n                                    }\r\n                                }\r\n                            }\r\n                        }\r\n                        ( void ) xTaskResumeAll();\r\n                    }\r\n                }\r\n                #endif /* INCLUDE_vTaskSuspend */\r\n\r\n                /* Tasks can be in pending ready list and other state list at the\r\n                 * same time. These tasks are in ready state no matter what state\r\n                 * list the task is in. */\r\n                taskENTER_CRITICAL();\r\n                {\r\n                    if( listIS_CONTAINED_WITHIN( &xPendingReadyList, &( pxTCB->xEventListItem ) ) != pdFALSE )\r\n                    {\r\n                        pxTaskStatus->eCurrentState = eReady;\r\n                    }\r\n                }\r\n                taskEXIT_CRITICAL();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            pxTaskStatus->eCurrentState = eTaskGetState( pxTCB );\r\n        }\r\n\r\n        /* Obtaining the stack space takes some time, so the xGetFreeStackSpace\r\n         * parameter is provided to allow it to be skipped. */\r\n        if( xGetFreeStackSpace != pdFALSE )\r\n        {\r\n            #if ( portSTACK_GROWTH > 0 )\r\n            {\r\n                pxTaskStatus->usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxTCB->pxEndOfStack );\r\n            }\r\n            #else\r\n            {\r\n                pxTaskStatus->usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxTCB->pxStack );\r\n            }\r\n            #endif\r\n        }\r\n        else\r\n        {\r\n            pxTaskStatus->usStackHighWaterMark = 0;\r\n        }\r\n\r\n        traceRETURN_vTaskGetInfo();\r\n    }\r\n\r\n#endif /* configUSE_TRACE_FACILITY */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TRACE_FACILITY == 1 )\r\n\r\n    static UBaseType_t prvListTasksWithinSingleList( TaskStatus_t * pxTaskStatusArray,\r\n                                                     List_t * pxList,\r\n                                                     eTaskState eState )\r\n    {\r\n        configLIST_VOLATILE TCB_t * pxNextTCB;\r\n        configLIST_VOLATILE TCB_t * pxFirstTCB;\r\n        UBaseType_t uxTask = 0;\r\n\r\n        if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 )\r\n        {\r\n            /* MISRA Ref 11.5.3 [Void pointer assignment] */\r\n            /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n            /* coverity[misra_c_2012_rule_11_5_violation] */\r\n            listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList );\r\n\r\n            /* Populate an TaskStatus_t structure within the\r\n             * pxTaskStatusArray array for each task that is referenced from\r\n             * pxList.  See the definition of TaskStatus_t in task.h for the\r\n             * meaning of each TaskStatus_t structure member. */\r\n            do\r\n            {\r\n                /* MISRA Ref 11.5.3 [Void pointer assignment] */\r\n                /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n                /* coverity[misra_c_2012_rule_11_5_violation] */\r\n                listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList );\r\n                vTaskGetInfo( ( TaskHandle_t ) pxNextTCB, &( pxTaskStatusArray[ uxTask ] ), pdTRUE, eState );\r\n                uxTask++;\r\n            } while( pxNextTCB != pxFirstTCB );\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        return uxTask;\r\n    }\r\n\r\n#endif /* configUSE_TRACE_FACILITY */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) )\r\n\r\n    static configSTACK_DEPTH_TYPE prvTaskCheckFreeStackSpace( const uint8_t * pucStackByte )\r\n    {\r\n        uint32_t ulCount = 0U;\r\n\r\n        while( *pucStackByte == ( uint8_t ) tskSTACK_FILL_BYTE )\r\n        {\r\n            pucStackByte -= portSTACK_GROWTH;\r\n            ulCount++;\r\n        }\r\n\r\n        ulCount /= ( uint32_t ) sizeof( StackType_t );\r\n\r\n        return ( configSTACK_DEPTH_TYPE ) ulCount;\r\n    }\r\n\r\n#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( INCLUDE_uxTaskGetStackHighWaterMark2 == 1 )\r\n\r\n/* uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are the\r\n * same except for their return type.  Using configSTACK_DEPTH_TYPE allows the\r\n * user to determine the return type.  It gets around the problem of the value\r\n * overflowing on 8-bit types without breaking backward compatibility for\r\n * applications that expect an 8-bit return type. */\r\n    configSTACK_DEPTH_TYPE uxTaskGetStackHighWaterMark2( TaskHandle_t xTask )\r\n    {\r\n        TCB_t * pxTCB;\r\n        uint8_t * pucEndOfStack;\r\n        configSTACK_DEPTH_TYPE uxReturn;\r\n\r\n        traceENTER_uxTaskGetStackHighWaterMark2( xTask );\r\n\r\n        /* uxTaskGetStackHighWaterMark() and uxTaskGetStackHighWaterMark2() are\r\n         * the same except for their return type.  Using configSTACK_DEPTH_TYPE\r\n         * allows the user to determine the return type.  It gets around the\r\n         * problem of the value overflowing on 8-bit types without breaking\r\n         * backward compatibility for applications that expect an 8-bit return\r\n         * type. */\r\n\r\n        pxTCB = prvGetTCBFromHandle( xTask );\r\n\r\n        #if portSTACK_GROWTH < 0\r\n        {\r\n            pucEndOfStack = ( uint8_t * ) pxTCB->pxStack;\r\n        }\r\n        #else\r\n        {\r\n            pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack;\r\n        }\r\n        #endif\r\n\r\n        uxReturn = prvTaskCheckFreeStackSpace( pucEndOfStack );\r\n\r\n        traceRETURN_uxTaskGetStackHighWaterMark2( uxReturn );\r\n\r\n        return uxReturn;\r\n    }\r\n\r\n#endif /* INCLUDE_uxTaskGetStackHighWaterMark2 */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 )\r\n\r\n    UBaseType_t uxTaskGetStackHighWaterMark( TaskHandle_t xTask )\r\n    {\r\n        TCB_t * pxTCB;\r\n        uint8_t * pucEndOfStack;\r\n        UBaseType_t uxReturn;\r\n\r\n        traceENTER_uxTaskGetStackHighWaterMark( xTask );\r\n\r\n        pxTCB = prvGetTCBFromHandle( xTask );\r\n\r\n        #if portSTACK_GROWTH < 0\r\n        {\r\n            pucEndOfStack = ( uint8_t * ) pxTCB->pxStack;\r\n        }\r\n        #else\r\n        {\r\n            pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack;\r\n        }\r\n        #endif\r\n\r\n        uxReturn = ( UBaseType_t ) prvTaskCheckFreeStackSpace( pucEndOfStack );\r\n\r\n        traceRETURN_uxTaskGetStackHighWaterMark( uxReturn );\r\n\r\n        return uxReturn;\r\n    }\r\n\r\n#endif /* INCLUDE_uxTaskGetStackHighWaterMark */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( INCLUDE_vTaskDelete == 1 )\r\n\r\n    static void prvDeleteTCB( TCB_t * pxTCB )\r\n    {\r\n        /* This call is required specifically for the TriCore port.  It must be\r\n         * above the vPortFree() calls.  The call is also used by ports/demos that\r\n         * want to allocate and clean RAM statically. */\r\n        portCLEAN_UP_TCB( pxTCB );\r\n\r\n        #if ( configUSE_C_RUNTIME_TLS_SUPPORT == 1 )\r\n        {\r\n            /* Free up the memory allocated for the task's TLS Block. */\r\n            configDEINIT_TLS_BLOCK( pxTCB->xTLSBlock );\r\n        }\r\n        #endif\r\n\r\n        #if ( ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) && ( configSUPPORT_STATIC_ALLOCATION == 0 ) && ( portUSING_MPU_WRAPPERS == 0 ) )\r\n        {\r\n            /* The task can only have been allocated dynamically - free both\r\n             * the stack and TCB. */\r\n            vPortFreeStack( pxTCB->pxStack );\r\n            vPortFree( pxTCB );\r\n        }\r\n        #elif ( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 )\r\n        {\r\n            /* The task could have been allocated statically or dynamically, so\r\n             * check what was statically allocated before trying to free the\r\n             * memory. */\r\n            if( pxTCB->ucStaticallyAllocated == tskDYNAMICALLY_ALLOCATED_STACK_AND_TCB )\r\n            {\r\n                /* Both the stack and TCB were allocated dynamically, so both\r\n                 * must be freed. */\r\n                vPortFreeStack( pxTCB->pxStack );\r\n                vPortFree( pxTCB );\r\n            }\r\n            else if( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_ONLY )\r\n            {\r\n                /* Only the stack was statically allocated, so the TCB is the\r\n                 * only memory that must be freed. */\r\n                vPortFree( pxTCB );\r\n            }\r\n            else\r\n            {\r\n                /* Neither the stack nor the TCB were allocated dynamically, so\r\n                 * nothing needs to be freed. */\r\n                configASSERT( pxTCB->ucStaticallyAllocated == tskSTATICALLY_ALLOCATED_STACK_AND_TCB );\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        #endif /* configSUPPORT_DYNAMIC_ALLOCATION */\r\n    }\r\n\r\n#endif /* INCLUDE_vTaskDelete */\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic void prvResetNextTaskUnblockTime( void )\r\n{\r\n    if( listLIST_IS_EMPTY( pxDelayedTaskList ) != pdFALSE )\r\n    {\r\n        /* The new current delayed list is empty.  Set xNextTaskUnblockTime to\r\n         * the maximum possible value so it is  extremely unlikely that the\r\n         * if( xTickCount >= xNextTaskUnblockTime ) test will pass until\r\n         * there is an item in the delayed list. */\r\n        xNextTaskUnblockTime = portMAX_DELAY;\r\n    }\r\n    else\r\n    {\r\n        /* The new current delayed list is not empty, get the value of\r\n         * the item at the head of the delayed list.  This is the time at\r\n         * which the task at the head of the delayed list should be removed\r\n         * from the Blocked state. */\r\n        xNextTaskUnblockTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxDelayedTaskList );\r\n    }\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) || ( configNUMBER_OF_CORES > 1 )\r\n\r\n    #if ( configNUMBER_OF_CORES == 1 )\r\n        TaskHandle_t xTaskGetCurrentTaskHandle( void )\r\n        {\r\n            TaskHandle_t xReturn;\r\n\r\n            traceENTER_xTaskGetCurrentTaskHandle();\r\n\r\n            /* A critical section is not required as this is not called from\r\n             * an interrupt and the current TCB will always be the same for any\r\n             * individual execution thread. */\r\n            xReturn = pxCurrentTCB;\r\n\r\n            traceRETURN_xTaskGetCurrentTaskHandle( xReturn );\r\n\r\n            return xReturn;\r\n        }\r\n    #else /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n        TaskHandle_t xTaskGetCurrentTaskHandle( void )\r\n        {\r\n            TaskHandle_t xReturn;\r\n            UBaseType_t uxSavedInterruptStatus;\r\n\r\n            traceENTER_xTaskGetCurrentTaskHandle();\r\n\r\n            uxSavedInterruptStatus = portSET_INTERRUPT_MASK();\r\n            {\r\n                xReturn = pxCurrentTCBs[ portGET_CORE_ID() ];\r\n            }\r\n            portCLEAR_INTERRUPT_MASK( uxSavedInterruptStatus );\r\n\r\n            traceRETURN_xTaskGetCurrentTaskHandle( xReturn );\r\n\r\n            return xReturn;\r\n        }\r\n\r\n        TaskHandle_t xTaskGetCurrentTaskHandleForCore( BaseType_t xCoreID )\r\n        {\r\n            TaskHandle_t xReturn = NULL;\r\n\r\n            traceENTER_xTaskGetCurrentTaskHandleForCore( xCoreID );\r\n\r\n            if( taskVALID_CORE_ID( xCoreID ) != pdFALSE )\r\n            {\r\n                xReturn = pxCurrentTCBs[ xCoreID ];\r\n            }\r\n\r\n            traceRETURN_xTaskGetCurrentTaskHandleForCore( xReturn );\r\n\r\n            return xReturn;\r\n        }\r\n    #endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n\r\n#endif /* ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )\r\n\r\n    BaseType_t xTaskGetSchedulerState( void )\r\n    {\r\n        BaseType_t xReturn;\r\n\r\n        traceENTER_xTaskGetSchedulerState();\r\n\r\n        if( xSchedulerRunning == pdFALSE )\r\n        {\r\n            xReturn = taskSCHEDULER_NOT_STARTED;\r\n        }\r\n        else\r\n        {\r\n            #if ( configNUMBER_OF_CORES > 1 )\r\n                taskENTER_CRITICAL();\r\n            #endif\r\n            {\r\n                if( uxSchedulerSuspended == ( UBaseType_t ) 0U )\r\n                {\r\n                    xReturn = taskSCHEDULER_RUNNING;\r\n                }\r\n                else\r\n                {\r\n                    xReturn = taskSCHEDULER_SUSPENDED;\r\n                }\r\n            }\r\n            #if ( configNUMBER_OF_CORES > 1 )\r\n                taskEXIT_CRITICAL();\r\n            #endif\r\n        }\r\n\r\n        traceRETURN_xTaskGetSchedulerState( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_MUTEXES == 1 )\r\n\r\n    BaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder )\r\n    {\r\n        TCB_t * const pxMutexHolderTCB = pxMutexHolder;\r\n        BaseType_t xReturn = pdFALSE;\r\n\r\n        traceENTER_xTaskPriorityInherit( pxMutexHolder );\r\n\r\n        /* If the mutex is taken by an interrupt, the mutex holder is NULL. Priority\r\n         * inheritance is not applied in this scenario. */\r\n        if( pxMutexHolder != NULL )\r\n        {\r\n            /* If the holder of the mutex has a priority below the priority of\r\n             * the task attempting to obtain the mutex then it will temporarily\r\n             * inherit the priority of the task attempting to obtain the mutex. */\r\n            if( pxMutexHolderTCB->uxPriority < pxCurrentTCB->uxPriority )\r\n            {\r\n                /* Adjust the mutex holder state to account for its new\r\n                 * priority.  Only reset the event list item value if the value is\r\n                 * not being used for anything else. */\r\n                if( ( listGET_LIST_ITEM_VALUE( &( pxMutexHolderTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == ( ( TickType_t ) 0UL ) )\r\n                {\r\n                    listSET_LIST_ITEM_VALUE( &( pxMutexHolderTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority );\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n\r\n                /* If the task being modified is in the ready state it will need\r\n                 * to be moved into a new list. */\r\n                if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxMutexHolderTCB->uxPriority ] ), &( pxMutexHolderTCB->xStateListItem ) ) != pdFALSE )\r\n                {\r\n                    if( uxListRemove( &( pxMutexHolderTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )\r\n                    {\r\n                        /* It is known that the task is in its ready list so\r\n                         * there is no need to check again and the port level\r\n                         * reset macro can be called directly. */\r\n                        portRESET_READY_PRIORITY( pxMutexHolderTCB->uxPriority, uxTopReadyPriority );\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n\r\n                    /* Inherit the priority before being moved into the new list. */\r\n                    pxMutexHolderTCB->uxPriority = pxCurrentTCB->uxPriority;\r\n                    prvAddTaskToReadyList( pxMutexHolderTCB );\r\n                    #if ( configNUMBER_OF_CORES > 1 )\r\n                    {\r\n                        /* The priority of the task is raised. Yield for this task\r\n                         * if it is not running. */\r\n                        if( taskTASK_IS_RUNNING( pxMutexHolderTCB ) != pdTRUE )\r\n                        {\r\n                            prvYieldForTask( pxMutexHolderTCB );\r\n                        }\r\n                    }\r\n                    #endif /* if ( configNUMBER_OF_CORES > 1 ) */\r\n                }\r\n                else\r\n                {\r\n                    /* Just inherit the priority. */\r\n                    pxMutexHolderTCB->uxPriority = pxCurrentTCB->uxPriority;\r\n                }\r\n\r\n                traceTASK_PRIORITY_INHERIT( pxMutexHolderTCB, pxCurrentTCB->uxPriority );\r\n\r\n                /* Inheritance occurred. */\r\n                xReturn = pdTRUE;\r\n            }\r\n            else\r\n            {\r\n                if( pxMutexHolderTCB->uxBasePriority < pxCurrentTCB->uxPriority )\r\n                {\r\n                    /* The base priority of the mutex holder is lower than the\r\n                     * priority of the task attempting to take the mutex, but the\r\n                     * current priority of the mutex holder is not lower than the\r\n                     * priority of the task attempting to take the mutex.\r\n                     * Therefore the mutex holder must have already inherited a\r\n                     * priority, but inheritance would have occurred if that had\r\n                     * not been the case. */\r\n                    xReturn = pdTRUE;\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_xTaskPriorityInherit( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_MUTEXES */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_MUTEXES == 1 )\r\n\r\n    BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder )\r\n    {\r\n        TCB_t * const pxTCB = pxMutexHolder;\r\n        BaseType_t xReturn = pdFALSE;\r\n\r\n        traceENTER_xTaskPriorityDisinherit( pxMutexHolder );\r\n\r\n        if( pxMutexHolder != NULL )\r\n        {\r\n            /* A task can only have an inherited priority if it holds the mutex.\r\n             * If the mutex is held by a task then it cannot be given from an\r\n             * interrupt, and if a mutex is given by the holding task then it must\r\n             * be the running state task. */\r\n            configASSERT( pxTCB == pxCurrentTCB );\r\n            configASSERT( pxTCB->uxMutexesHeld );\r\n            ( pxTCB->uxMutexesHeld )--;\r\n\r\n            /* Has the holder of the mutex inherited the priority of another\r\n             * task? */\r\n            if( pxTCB->uxPriority != pxTCB->uxBasePriority )\r\n            {\r\n                /* Only disinherit if no other mutexes are held. */\r\n                if( pxTCB->uxMutexesHeld == ( UBaseType_t ) 0 )\r\n                {\r\n                    /* A task can only have an inherited priority if it holds\r\n                     * the mutex.  If the mutex is held by a task then it cannot be\r\n                     * given from an interrupt, and if a mutex is given by the\r\n                     * holding task then it must be the running state task.  Remove\r\n                     * the holding task from the ready list. */\r\n                    if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )\r\n                    {\r\n                        portRESET_READY_PRIORITY( pxTCB->uxPriority, uxTopReadyPriority );\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n\r\n                    /* Disinherit the priority before adding the task into the\r\n                     * new  ready list. */\r\n                    traceTASK_PRIORITY_DISINHERIT( pxTCB, pxTCB->uxBasePriority );\r\n                    pxTCB->uxPriority = pxTCB->uxBasePriority;\r\n\r\n                    /* Reset the event list item value.  It cannot be in use for\r\n                     * any other purpose if this task is running, and it must be\r\n                     * running to give back the mutex. */\r\n                    listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxTCB->uxPriority );\r\n                    prvAddTaskToReadyList( pxTCB );\r\n                    #if ( configNUMBER_OF_CORES > 1 )\r\n                    {\r\n                        /* The priority of the task is dropped. Yield the core on\r\n                         * which the task is running. */\r\n                        if( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE )\r\n                        {\r\n                            prvYieldCore( pxTCB->xTaskRunState );\r\n                        }\r\n                    }\r\n                    #endif /* if ( configNUMBER_OF_CORES > 1 ) */\r\n\r\n                    /* Return true to indicate that a context switch is required.\r\n                     * This is only actually required in the corner case whereby\r\n                     * multiple mutexes were held and the mutexes were given back\r\n                     * in an order different to that in which they were taken.\r\n                     * If a context switch did not occur when the first mutex was\r\n                     * returned, even if a task was waiting on it, then a context\r\n                     * switch should occur when the last mutex is returned whether\r\n                     * a task is waiting on it or not. */\r\n                    xReturn = pdTRUE;\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_xTaskPriorityDisinherit( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_MUTEXES */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_MUTEXES == 1 )\r\n\r\n    void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder,\r\n                                              UBaseType_t uxHighestPriorityWaitingTask )\r\n    {\r\n        TCB_t * const pxTCB = pxMutexHolder;\r\n        UBaseType_t uxPriorityUsedOnEntry, uxPriorityToUse;\r\n        const UBaseType_t uxOnlyOneMutexHeld = ( UBaseType_t ) 1;\r\n\r\n        traceENTER_vTaskPriorityDisinheritAfterTimeout( pxMutexHolder, uxHighestPriorityWaitingTask );\r\n\r\n        if( pxMutexHolder != NULL )\r\n        {\r\n            /* If pxMutexHolder is not NULL then the holder must hold at least\r\n             * one mutex. */\r\n            configASSERT( pxTCB->uxMutexesHeld );\r\n\r\n            /* Determine the priority to which the priority of the task that\r\n             * holds the mutex should be set.  This will be the greater of the\r\n             * holding task's base priority and the priority of the highest\r\n             * priority task that is waiting to obtain the mutex. */\r\n            if( pxTCB->uxBasePriority < uxHighestPriorityWaitingTask )\r\n            {\r\n                uxPriorityToUse = uxHighestPriorityWaitingTask;\r\n            }\r\n            else\r\n            {\r\n                uxPriorityToUse = pxTCB->uxBasePriority;\r\n            }\r\n\r\n            /* Does the priority need to change? */\r\n            if( pxTCB->uxPriority != uxPriorityToUse )\r\n            {\r\n                /* Only disinherit if no other mutexes are held.  This is a\r\n                 * simplification in the priority inheritance implementation.  If\r\n                 * the task that holds the mutex is also holding other mutexes then\r\n                 * the other mutexes may have caused the priority inheritance. */\r\n                if( pxTCB->uxMutexesHeld == uxOnlyOneMutexHeld )\r\n                {\r\n                    /* If a task has timed out because it already holds the\r\n                     * mutex it was trying to obtain then it cannot of inherited\r\n                     * its own priority. */\r\n                    configASSERT( pxTCB != pxCurrentTCB );\r\n\r\n                    /* Disinherit the priority, remembering the previous\r\n                     * priority to facilitate determining the subject task's\r\n                     * state. */\r\n                    traceTASK_PRIORITY_DISINHERIT( pxTCB, uxPriorityToUse );\r\n                    uxPriorityUsedOnEntry = pxTCB->uxPriority;\r\n                    pxTCB->uxPriority = uxPriorityToUse;\r\n\r\n                    /* Only reset the event list item value if the value is not\r\n                     * being used for anything else. */\r\n                    if( ( listGET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ) ) & taskEVENT_LIST_ITEM_VALUE_IN_USE ) == ( ( TickType_t ) 0UL ) )\r\n                    {\r\n                        listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) uxPriorityToUse );\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n\r\n                    /* If the running task is not the task that holds the mutex\r\n                     * then the task that holds the mutex could be in either the\r\n                     * Ready, Blocked or Suspended states.  Only remove the task\r\n                     * from its current state list if it is in the Ready state as\r\n                     * the task's priority is going to change and there is one\r\n                     * Ready list per priority. */\r\n                    if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ uxPriorityUsedOnEntry ] ), &( pxTCB->xStateListItem ) ) != pdFALSE )\r\n                    {\r\n                        if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )\r\n                        {\r\n                            /* It is known that the task is in its ready list so\r\n                             * there is no need to check again and the port level\r\n                             * reset macro can be called directly. */\r\n                            portRESET_READY_PRIORITY( pxTCB->uxPriority, uxTopReadyPriority );\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n\r\n                        prvAddTaskToReadyList( pxTCB );\r\n                        #if ( configNUMBER_OF_CORES > 1 )\r\n                        {\r\n                            /* The priority of the task is dropped. Yield the core on\r\n                             * which the task is running. */\r\n                            if( taskTASK_IS_RUNNING( pxTCB ) == pdTRUE )\r\n                            {\r\n                                prvYieldCore( pxTCB->xTaskRunState );\r\n                            }\r\n                        }\r\n                        #endif /* if ( configNUMBER_OF_CORES > 1 ) */\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_vTaskPriorityDisinheritAfterTimeout();\r\n    }\r\n\r\n#endif /* configUSE_MUTEXES */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configNUMBER_OF_CORES > 1 )\r\n\r\n/* If not in a critical section then yield immediately.\r\n * Otherwise set xYieldPendings to true to wait to\r\n * yield until exiting the critical section.\r\n */\r\n    void vTaskYieldWithinAPI( void )\r\n    {\r\n        traceENTER_vTaskYieldWithinAPI();\r\n\r\n        if( portGET_CRITICAL_NESTING_COUNT() == 0U )\r\n        {\r\n            portYIELD();\r\n        }\r\n        else\r\n        {\r\n            xYieldPendings[ portGET_CORE_ID() ] = pdTRUE;\r\n        }\r\n\r\n        traceRETURN_vTaskYieldWithinAPI();\r\n    }\r\n#endif /* #if ( configNUMBER_OF_CORES > 1 ) */\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( portCRITICAL_NESTING_IN_TCB == 1 ) && ( configNUMBER_OF_CORES == 1 ) )\r\n\r\n    void vTaskEnterCritical( void )\r\n    {\r\n        traceENTER_vTaskEnterCritical();\r\n\r\n        portDISABLE_INTERRUPTS();\r\n\r\n        if( xSchedulerRunning != pdFALSE )\r\n        {\r\n            ( pxCurrentTCB->uxCriticalNesting )++;\r\n\r\n            /* This is not the interrupt safe version of the enter critical\r\n             * function so  assert() if it is being called from an interrupt\r\n             * context.  Only API functions that end in \"FromISR\" can be used in an\r\n             * interrupt.  Only assert if the critical nesting count is 1 to\r\n             * protect against recursive calls if the assert function also uses a\r\n             * critical section. */\r\n            if( pxCurrentTCB->uxCriticalNesting == 1U )\r\n            {\r\n                portASSERT_IF_IN_ISR();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_vTaskEnterCritical();\r\n    }\r\n\r\n#endif /* #if ( ( portCRITICAL_NESTING_IN_TCB == 1 ) && ( configNUMBER_OF_CORES == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configNUMBER_OF_CORES > 1 )\r\n\r\n    void vTaskEnterCritical( void )\r\n    {\r\n        traceENTER_vTaskEnterCritical();\r\n\r\n        portDISABLE_INTERRUPTS();\r\n\r\n        if( xSchedulerRunning != pdFALSE )\r\n        {\r\n            if( portGET_CRITICAL_NESTING_COUNT() == 0U )\r\n            {\r\n                portGET_TASK_LOCK();\r\n                portGET_ISR_LOCK();\r\n            }\r\n\r\n            portINCREMENT_CRITICAL_NESTING_COUNT();\r\n\r\n            /* This is not the interrupt safe version of the enter critical\r\n             * function so  assert() if it is being called from an interrupt\r\n             * context.  Only API functions that end in \"FromISR\" can be used in an\r\n             * interrupt.  Only assert if the critical nesting count is 1 to\r\n             * protect against recursive calls if the assert function also uses a\r\n             * critical section. */\r\n            if( portGET_CRITICAL_NESTING_COUNT() == 1U )\r\n            {\r\n                portASSERT_IF_IN_ISR();\r\n\r\n                if( uxSchedulerSuspended == 0U )\r\n                {\r\n                    /* The only time there would be a problem is if this is called\r\n                     * before a context switch and vTaskExitCritical() is called\r\n                     * after pxCurrentTCB changes. Therefore this should not be\r\n                     * used within vTaskSwitchContext(). */\r\n                    prvCheckForRunStateChange();\r\n                }\r\n            }\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_vTaskEnterCritical();\r\n    }\r\n\r\n#endif /* #if ( configNUMBER_OF_CORES > 1 ) */\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configNUMBER_OF_CORES > 1 )\r\n\r\n    UBaseType_t vTaskEnterCriticalFromISR( void )\r\n    {\r\n        UBaseType_t uxSavedInterruptStatus = 0;\r\n\r\n        traceENTER_vTaskEnterCriticalFromISR();\r\n\r\n        if( xSchedulerRunning != pdFALSE )\r\n        {\r\n            uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();\r\n\r\n            if( portGET_CRITICAL_NESTING_COUNT() == 0U )\r\n            {\r\n                portGET_ISR_LOCK();\r\n            }\r\n\r\n            portINCREMENT_CRITICAL_NESTING_COUNT();\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_vTaskEnterCriticalFromISR( uxSavedInterruptStatus );\r\n\r\n        return uxSavedInterruptStatus;\r\n    }\r\n\r\n#endif /* #if ( configNUMBER_OF_CORES > 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( portCRITICAL_NESTING_IN_TCB == 1 ) && ( configNUMBER_OF_CORES == 1 ) )\r\n\r\n    void vTaskExitCritical( void )\r\n    {\r\n        traceENTER_vTaskExitCritical();\r\n\r\n        if( xSchedulerRunning != pdFALSE )\r\n        {\r\n            /* If pxCurrentTCB->uxCriticalNesting is zero then this function\r\n             * does not match a previous call to vTaskEnterCritical(). */\r\n            configASSERT( pxCurrentTCB->uxCriticalNesting > 0U );\r\n\r\n            /* This function should not be called in ISR. Use vTaskExitCriticalFromISR\r\n             * to exit critical section from ISR. */\r\n            portASSERT_IF_IN_ISR();\r\n\r\n            if( pxCurrentTCB->uxCriticalNesting > 0U )\r\n            {\r\n                ( pxCurrentTCB->uxCriticalNesting )--;\r\n\r\n                if( pxCurrentTCB->uxCriticalNesting == 0U )\r\n                {\r\n                    portENABLE_INTERRUPTS();\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_vTaskExitCritical();\r\n    }\r\n\r\n#endif /* #if ( ( portCRITICAL_NESTING_IN_TCB == 1 ) && ( configNUMBER_OF_CORES == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configNUMBER_OF_CORES > 1 )\r\n\r\n    void vTaskExitCritical( void )\r\n    {\r\n        traceENTER_vTaskExitCritical();\r\n\r\n        if( xSchedulerRunning != pdFALSE )\r\n        {\r\n            /* If critical nesting count is zero then this function\r\n             * does not match a previous call to vTaskEnterCritical(). */\r\n            configASSERT( portGET_CRITICAL_NESTING_COUNT() > 0U );\r\n\r\n            /* This function should not be called in ISR. Use vTaskExitCriticalFromISR\r\n             * to exit critical section from ISR. */\r\n            portASSERT_IF_IN_ISR();\r\n\r\n            if( portGET_CRITICAL_NESTING_COUNT() > 0U )\r\n            {\r\n                portDECREMENT_CRITICAL_NESTING_COUNT();\r\n\r\n                if( portGET_CRITICAL_NESTING_COUNT() == 0U )\r\n                {\r\n                    BaseType_t xYieldCurrentTask;\r\n\r\n                    /* Get the xYieldPending stats inside the critical section. */\r\n                    xYieldCurrentTask = xYieldPendings[ portGET_CORE_ID() ];\r\n\r\n                    portRELEASE_ISR_LOCK();\r\n                    portRELEASE_TASK_LOCK();\r\n                    portENABLE_INTERRUPTS();\r\n\r\n                    /* When a task yields in a critical section it just sets\r\n                     * xYieldPending to true. So now that we have exited the\r\n                     * critical section check if xYieldPending is true, and\r\n                     * if so yield. */\r\n                    if( xYieldCurrentTask != pdFALSE )\r\n                    {\r\n                        portYIELD();\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_vTaskExitCritical();\r\n    }\r\n\r\n#endif /* #if ( configNUMBER_OF_CORES > 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configNUMBER_OF_CORES > 1 )\r\n\r\n    void vTaskExitCriticalFromISR( UBaseType_t uxSavedInterruptStatus )\r\n    {\r\n        traceENTER_vTaskExitCriticalFromISR( uxSavedInterruptStatus );\r\n\r\n        if( xSchedulerRunning != pdFALSE )\r\n        {\r\n            /* If critical nesting count is zero then this function\r\n             * does not match a previous call to vTaskEnterCritical(). */\r\n            configASSERT( portGET_CRITICAL_NESTING_COUNT() > 0U );\r\n\r\n            if( portGET_CRITICAL_NESTING_COUNT() > 0U )\r\n            {\r\n                portDECREMENT_CRITICAL_NESTING_COUNT();\r\n\r\n                if( portGET_CRITICAL_NESTING_COUNT() == 0U )\r\n                {\r\n                    portRELEASE_ISR_LOCK();\r\n                    portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_vTaskExitCriticalFromISR();\r\n    }\r\n\r\n#endif /* #if ( configNUMBER_OF_CORES > 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 )\r\n\r\n    static char * prvWriteNameToBuffer( char * pcBuffer,\r\n                                        const char * pcTaskName )\r\n    {\r\n        size_t x;\r\n\r\n        /* Start by copying the entire string. */\r\n        ( void ) strcpy( pcBuffer, pcTaskName );\r\n\r\n        /* Pad the end of the string with spaces to ensure columns line up when\r\n         * printed out. */\r\n        for( x = strlen( pcBuffer ); x < ( size_t ) ( ( size_t ) configMAX_TASK_NAME_LEN - 1U ); x++ )\r\n        {\r\n            pcBuffer[ x ] = ' ';\r\n        }\r\n\r\n        /* Terminate. */\r\n        pcBuffer[ x ] = ( char ) 0x00;\r\n\r\n        /* Return the new end of string. */\r\n        return &( pcBuffer[ x ] );\r\n    }\r\n\r\n#endif /* ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) )\r\n\r\n    void vTaskListTasks( char * pcWriteBuffer,\r\n                         size_t uxBufferLength )\r\n    {\r\n        TaskStatus_t * pxTaskStatusArray;\r\n        size_t uxConsumedBufferLength = 0;\r\n        size_t uxCharsWrittenBySnprintf;\r\n        int iSnprintfReturnValue;\r\n        BaseType_t xOutputBufferFull = pdFALSE;\r\n        UBaseType_t uxArraySize, x;\r\n        char cStatus;\r\n\r\n        traceENTER_vTaskListTasks( pcWriteBuffer, uxBufferLength );\r\n\r\n        /*\r\n         * PLEASE NOTE:\r\n         *\r\n         * This function is provided for convenience only, and is used by many\r\n         * of the demo applications.  Do not consider it to be part of the\r\n         * scheduler.\r\n         *\r\n         * vTaskListTasks() calls uxTaskGetSystemState(), then formats part of the\r\n         * uxTaskGetSystemState() output into a human readable table that\r\n         * displays task: names, states, priority, stack usage and task number.\r\n         * Stack usage specified as the number of unused StackType_t words stack can hold\r\n         * on top of stack - not the number of bytes.\r\n         *\r\n         * vTaskListTasks() has a dependency on the snprintf() C library function that\r\n         * might bloat the code size, use a lot of stack, and provide different\r\n         * results on different platforms.  An alternative, tiny, third party,\r\n         * and limited functionality implementation of snprintf() is provided in\r\n         * many of the FreeRTOS/Demo sub-directories in a file called\r\n         * printf-stdarg.c (note printf-stdarg.c does not provide a full\r\n         * snprintf() implementation!).\r\n         *\r\n         * It is recommended that production systems call uxTaskGetSystemState()\r\n         * directly to get access to raw stats data, rather than indirectly\r\n         * through a call to vTaskListTasks().\r\n         */\r\n\r\n\r\n        /* Make sure the write buffer does not contain a string. */\r\n        *pcWriteBuffer = ( char ) 0x00;\r\n\r\n        /* Take a snapshot of the number of tasks in case it changes while this\r\n         * function is executing. */\r\n        uxArraySize = uxCurrentNumberOfTasks;\r\n\r\n        /* Allocate an array index for each task.  NOTE!  if\r\n         * configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will\r\n         * equate to NULL. */\r\n        /* MISRA Ref 11.5.1 [Malloc memory assignment] */\r\n        /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n        /* coverity[misra_c_2012_rule_11_5_violation] */\r\n        pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) );\r\n\r\n        if( pxTaskStatusArray != NULL )\r\n        {\r\n            /* Generate the (binary) data. */\r\n            uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, NULL );\r\n\r\n            /* Create a human readable table from the binary data. */\r\n            for( x = 0; x < uxArraySize; x++ )\r\n            {\r\n                switch( pxTaskStatusArray[ x ].eCurrentState )\r\n                {\r\n                    case eRunning:\r\n                        cStatus = tskRUNNING_CHAR;\r\n                        break;\r\n\r\n                    case eReady:\r\n                        cStatus = tskREADY_CHAR;\r\n                        break;\r\n\r\n                    case eBlocked:\r\n                        cStatus = tskBLOCKED_CHAR;\r\n                        break;\r\n\r\n                    case eSuspended:\r\n                        cStatus = tskSUSPENDED_CHAR;\r\n                        break;\r\n\r\n                    case eDeleted:\r\n                        cStatus = tskDELETED_CHAR;\r\n                        break;\r\n\r\n                    case eInvalid: /* Fall through. */\r\n                    default:       /* Should not get here, but it is included\r\n                                    * to prevent static checking errors. */\r\n                        cStatus = ( char ) 0x00;\r\n                        break;\r\n                }\r\n\r\n                /* Is there enough space in the buffer to hold task name? */\r\n                if( ( uxConsumedBufferLength + configMAX_TASK_NAME_LEN ) <= uxBufferLength )\r\n                {\r\n                    /* Write the task name to the string, padding with spaces so it\r\n                     * can be printed in tabular form more easily. */\r\n                    pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName );\r\n                    /* Do not count the terminating null character. */\r\n                    uxConsumedBufferLength = uxConsumedBufferLength + ( configMAX_TASK_NAME_LEN - 1U );\r\n\r\n                    /* Is there space left in the buffer? -1 is done because snprintf\r\n                     * writes a terminating null character. So we are essentially\r\n                     * checking if the buffer has space to write at least one non-null\r\n                     * character. */\r\n                    if( uxConsumedBufferLength < ( uxBufferLength - 1U ) )\r\n                    {\r\n                        /* Write the rest of the string. */\r\n                        #if ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 ) )\r\n                            /* MISRA Ref 21.6.1 [snprintf for utility] */\r\n                            /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-216 */\r\n                            /* coverity[misra_c_2012_rule_21_6_violation] */\r\n                            iSnprintfReturnValue = snprintf( pcWriteBuffer,\r\n                                                             uxBufferLength - uxConsumedBufferLength,\r\n                                                             \"\\t%c\\t%u\\t%u\\t%u\\t0x%x\\r\\n\",\r\n                                                             cStatus,\r\n                                                             ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority,\r\n                                                             ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark,\r\n                                                             ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber,\r\n                                                             ( unsigned int ) pxTaskStatusArray[ x ].uxCoreAffinityMask );\r\n                        #else /* ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 ) ) */\r\n                            /* MISRA Ref 21.6.1 [snprintf for utility] */\r\n                            /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-216 */\r\n                            /* coverity[misra_c_2012_rule_21_6_violation] */\r\n                            iSnprintfReturnValue = snprintf( pcWriteBuffer,\r\n                                                             uxBufferLength - uxConsumedBufferLength,\r\n                                                             \"\\t%c\\t%u\\t%u\\t%u\\r\\n\",\r\n                                                             cStatus,\r\n                                                             ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority,\r\n                                                             ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark,\r\n                                                             ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber );\r\n                        #endif /* ( ( configUSE_CORE_AFFINITY == 1 ) && ( configNUMBER_OF_CORES > 1 ) ) */\r\n                        uxCharsWrittenBySnprintf = prvSnprintfReturnValueToCharsWritten( iSnprintfReturnValue, uxBufferLength - uxConsumedBufferLength );\r\n\r\n                        uxConsumedBufferLength += uxCharsWrittenBySnprintf;\r\n                        pcWriteBuffer += uxCharsWrittenBySnprintf;\r\n                    }\r\n                    else\r\n                    {\r\n                        xOutputBufferFull = pdTRUE;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    xOutputBufferFull = pdTRUE;\r\n                }\r\n\r\n                if( xOutputBufferFull == pdTRUE )\r\n                {\r\n                    break;\r\n                }\r\n            }\r\n\r\n            /* Free the array again.  NOTE!  If configSUPPORT_DYNAMIC_ALLOCATION\r\n             * is 0 then vPortFree() will be #defined to nothing. */\r\n            vPortFree( pxTaskStatusArray );\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_vTaskListTasks();\r\n    }\r\n\r\n#endif /* ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) */\r\n/*----------------------------------------------------------*/\r\n\r\n#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) && ( configUSE_TRACE_FACILITY == 1 ) )\r\n\r\n    void vTaskGetRunTimeStatistics( char * pcWriteBuffer,\r\n                                    size_t uxBufferLength )\r\n    {\r\n        TaskStatus_t * pxTaskStatusArray;\r\n        size_t uxConsumedBufferLength = 0;\r\n        size_t uxCharsWrittenBySnprintf;\r\n        int iSnprintfReturnValue;\r\n        BaseType_t xOutputBufferFull = pdFALSE;\r\n        UBaseType_t uxArraySize, x;\r\n        configRUN_TIME_COUNTER_TYPE ulTotalTime = 0;\r\n        configRUN_TIME_COUNTER_TYPE ulStatsAsPercentage;\r\n\r\n        traceENTER_vTaskGetRunTimeStatistics( pcWriteBuffer, uxBufferLength );\r\n\r\n        /*\r\n         * PLEASE NOTE:\r\n         *\r\n         * This function is provided for convenience only, and is used by many\r\n         * of the demo applications.  Do not consider it to be part of the\r\n         * scheduler.\r\n         *\r\n         * vTaskGetRunTimeStatistics() calls uxTaskGetSystemState(), then formats part\r\n         * of the uxTaskGetSystemState() output into a human readable table that\r\n         * displays the amount of time each task has spent in the Running state\r\n         * in both absolute and percentage terms.\r\n         *\r\n         * vTaskGetRunTimeStatistics() has a dependency on the snprintf() C library\r\n         * function that might bloat the code size, use a lot of stack, and\r\n         * provide different results on different platforms.  An alternative,\r\n         * tiny, third party, and limited functionality implementation of\r\n         * snprintf() is provided in many of the FreeRTOS/Demo sub-directories in\r\n         * a file called printf-stdarg.c (note printf-stdarg.c does not provide\r\n         * a full snprintf() implementation!).\r\n         *\r\n         * It is recommended that production systems call uxTaskGetSystemState()\r\n         * directly to get access to raw stats data, rather than indirectly\r\n         * through a call to vTaskGetRunTimeStatistics().\r\n         */\r\n\r\n        /* Make sure the write buffer does not contain a string. */\r\n        *pcWriteBuffer = ( char ) 0x00;\r\n\r\n        /* Take a snapshot of the number of tasks in case it changes while this\r\n         * function is executing. */\r\n        uxArraySize = uxCurrentNumberOfTasks;\r\n\r\n        /* Allocate an array index for each task.  NOTE!  If\r\n         * configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will\r\n         * equate to NULL. */\r\n        /* MISRA Ref 11.5.1 [Malloc memory assignment] */\r\n        /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n        /* coverity[misra_c_2012_rule_11_5_violation] */\r\n        pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) );\r\n\r\n        if( pxTaskStatusArray != NULL )\r\n        {\r\n            /* Generate the (binary) data. */\r\n            uxArraySize = uxTaskGetSystemState( pxTaskStatusArray, uxArraySize, &ulTotalTime );\r\n\r\n            /* For percentage calculations. */\r\n            ulTotalTime /= ( ( configRUN_TIME_COUNTER_TYPE ) 100UL );\r\n\r\n            /* Avoid divide by zero errors. */\r\n            if( ulTotalTime > 0UL )\r\n            {\r\n                /* Create a human readable table from the binary data. */\r\n                for( x = 0; x < uxArraySize; x++ )\r\n                {\r\n                    /* What percentage of the total run time has the task used?\r\n                     * This will always be rounded down to the nearest integer.\r\n                     * ulTotalRunTime has already been divided by 100. */\r\n                    ulStatsAsPercentage = pxTaskStatusArray[ x ].ulRunTimeCounter / ulTotalTime;\r\n\r\n                    /* Is there enough space in the buffer to hold task name? */\r\n                    if( ( uxConsumedBufferLength + configMAX_TASK_NAME_LEN ) <= uxBufferLength )\r\n                    {\r\n                        /* Write the task name to the string, padding with\r\n                         * spaces so it can be printed in tabular form more\r\n                         * easily. */\r\n                        pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName );\r\n                        /* Do not count the terminating null character. */\r\n                        uxConsumedBufferLength = uxConsumedBufferLength + ( configMAX_TASK_NAME_LEN - 1U );\r\n\r\n                        /* Is there space left in the buffer? -1 is done because snprintf\r\n                         * writes a terminating null character. So we are essentially\r\n                         * checking if the buffer has space to write at least one non-null\r\n                         * character. */\r\n                        if( uxConsumedBufferLength < ( uxBufferLength - 1U ) )\r\n                        {\r\n                            if( ulStatsAsPercentage > 0UL )\r\n                            {\r\n                                #ifdef portLU_PRINTF_SPECIFIER_REQUIRED\r\n                                {\r\n                                    /* MISRA Ref 21.6.1 [snprintf for utility] */\r\n                                    /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-216 */\r\n                                    /* coverity[misra_c_2012_rule_21_6_violation] */\r\n                                    iSnprintfReturnValue = snprintf( pcWriteBuffer,\r\n                                                                     uxBufferLength - uxConsumedBufferLength,\r\n                                                                     \"\\t%lu\\t\\t%lu%%\\r\\n\",\r\n                                                                     pxTaskStatusArray[ x ].ulRunTimeCounter,\r\n                                                                     ulStatsAsPercentage );\r\n                                }\r\n                                #else /* ifdef portLU_PRINTF_SPECIFIER_REQUIRED */\r\n                                {\r\n                                    /* sizeof( int ) == sizeof( long ) so a smaller\r\n                                     * printf() library can be used. */\r\n                                    /* MISRA Ref 21.6.1 [snprintf for utility] */\r\n                                    /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-216 */\r\n                                    /* coverity[misra_c_2012_rule_21_6_violation] */\r\n                                    iSnprintfReturnValue = snprintf( pcWriteBuffer,\r\n                                                                     uxBufferLength - uxConsumedBufferLength,\r\n                                                                     \"\\t%u\\t\\t%u%%\\r\\n\",\r\n                                                                     ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter,\r\n                                                                     ( unsigned int ) ulStatsAsPercentage );\r\n                                }\r\n                                #endif /* ifdef portLU_PRINTF_SPECIFIER_REQUIRED */\r\n                            }\r\n                            else\r\n                            {\r\n                                /* If the percentage is zero here then the task has\r\n                                 * consumed less than 1% of the total run time. */\r\n                                #ifdef portLU_PRINTF_SPECIFIER_REQUIRED\r\n                                {\r\n                                    /* MISRA Ref 21.6.1 [snprintf for utility] */\r\n                                    /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-216 */\r\n                                    /* coverity[misra_c_2012_rule_21_6_violation] */\r\n                                    iSnprintfReturnValue = snprintf( pcWriteBuffer,\r\n                                                                     uxBufferLength - uxConsumedBufferLength,\r\n                                                                     \"\\t%lu\\t\\t<1%%\\r\\n\",\r\n                                                                     pxTaskStatusArray[ x ].ulRunTimeCounter );\r\n                                }\r\n                                #else\r\n                                {\r\n                                    /* sizeof( int ) == sizeof( long ) so a smaller\r\n                                     * printf() library can be used. */\r\n                                    /* MISRA Ref 21.6.1 [snprintf for utility] */\r\n                                    /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-216 */\r\n                                    /* coverity[misra_c_2012_rule_21_6_violation] */\r\n                                    iSnprintfReturnValue = snprintf( pcWriteBuffer,\r\n                                                                     uxBufferLength - uxConsumedBufferLength,\r\n                                                                     \"\\t%u\\t\\t<1%%\\r\\n\",\r\n                                                                     ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter );\r\n                                }\r\n                                #endif /* ifdef portLU_PRINTF_SPECIFIER_REQUIRED */\r\n                            }\r\n\r\n                            uxCharsWrittenBySnprintf = prvSnprintfReturnValueToCharsWritten( iSnprintfReturnValue, uxBufferLength - uxConsumedBufferLength );\r\n                            uxConsumedBufferLength += uxCharsWrittenBySnprintf;\r\n                            pcWriteBuffer += uxCharsWrittenBySnprintf;\r\n                        }\r\n                        else\r\n                        {\r\n                            xOutputBufferFull = pdTRUE;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        xOutputBufferFull = pdTRUE;\r\n                    }\r\n\r\n                    if( xOutputBufferFull == pdTRUE )\r\n                    {\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n\r\n            /* Free the array again.  NOTE!  If configSUPPORT_DYNAMIC_ALLOCATION\r\n             * is 0 then vPortFree() will be #defined to nothing. */\r\n            vPortFree( pxTaskStatusArray );\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_vTaskGetRunTimeStatistics();\r\n    }\r\n\r\n#endif /* ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\nTickType_t uxTaskResetEventItemValue( void )\r\n{\r\n    TickType_t uxReturn;\r\n\r\n    traceENTER_uxTaskResetEventItemValue();\r\n\r\n    uxReturn = listGET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ) );\r\n\r\n    /* Reset the event list item to its normal value - so it can be used with\r\n     * queues and semaphores. */\r\n    listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xEventListItem ), ( ( TickType_t ) configMAX_PRIORITIES - ( TickType_t ) pxCurrentTCB->uxPriority ) );\r\n\r\n    traceRETURN_uxTaskResetEventItemValue( uxReturn );\r\n\r\n    return uxReturn;\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_MUTEXES == 1 )\r\n\r\n    TaskHandle_t pvTaskIncrementMutexHeldCount( void )\r\n    {\r\n        TCB_t * pxTCB;\r\n\r\n        traceENTER_pvTaskIncrementMutexHeldCount();\r\n\r\n        pxTCB = pxCurrentTCB;\r\n\r\n        /* If xSemaphoreCreateMutex() is called before any tasks have been created\r\n         * then pxCurrentTCB will be NULL. */\r\n        if( pxTCB != NULL )\r\n        {\r\n            ( pxTCB->uxMutexesHeld )++;\r\n        }\r\n\r\n        traceRETURN_pvTaskIncrementMutexHeldCount( pxTCB );\r\n\r\n        return pxTCB;\r\n    }\r\n\r\n#endif /* configUSE_MUTEXES */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TASK_NOTIFICATIONS == 1 )\r\n\r\n    uint32_t ulTaskGenericNotifyTake( UBaseType_t uxIndexToWaitOn,\r\n                                      BaseType_t xClearCountOnExit,\r\n                                      TickType_t xTicksToWait )\r\n    {\r\n        uint32_t ulReturn;\r\n        BaseType_t xAlreadyYielded;\r\n\r\n        traceENTER_ulTaskGenericNotifyTake( uxIndexToWaitOn, xClearCountOnExit, xTicksToWait );\r\n\r\n        configASSERT( uxIndexToWaitOn < configTASK_NOTIFICATION_ARRAY_ENTRIES );\r\n\r\n        taskENTER_CRITICAL();\r\n\r\n        /* Only block if the notification count is not already non-zero. */\r\n        if( pxCurrentTCB->ulNotifiedValue[ uxIndexToWaitOn ] == 0UL )\r\n        {\r\n            /* Mark this task as waiting for a notification. */\r\n            pxCurrentTCB->ucNotifyState[ uxIndexToWaitOn ] = taskWAITING_NOTIFICATION;\r\n\r\n            if( xTicksToWait > ( TickType_t ) 0 )\r\n            {\r\n                traceTASK_NOTIFY_TAKE_BLOCK( uxIndexToWaitOn );\r\n\r\n                /* We MUST suspend the scheduler before exiting the critical\r\n                 * section (i.e. before enabling interrupts).\r\n                 *\r\n                 * If we do not do so, a notification sent from an ISR, which\r\n                 * happens after exiting the critical section and before\r\n                 * suspending the scheduler, will get lost. The sequence of\r\n                 * events will be:\r\n                 * 1. Exit critical section.\r\n                 * 2. Interrupt - ISR calls xTaskNotifyFromISR which adds the\r\n                 *    task to the Ready list.\r\n                 * 3. Suspend scheduler.\r\n                 * 4. prvAddCurrentTaskToDelayedList moves the task to the\r\n                 *    delayed or suspended list.\r\n                 * 5. Resume scheduler does not touch the task (because it is\r\n                 *    not on the pendingReady list), effectively losing the\r\n                 *    notification from the ISR.\r\n                 *\r\n                 * The same does not happen when we suspend the scheduler before\r\n                 * exiting the critical section. The sequence of events in this\r\n                 * case will be:\r\n                 * 1. Suspend scheduler.\r\n                 * 2. Exit critical section.\r\n                 * 3. Interrupt - ISR calls xTaskNotifyFromISR which adds the\r\n                 *    task to the pendingReady list as the scheduler is\r\n                 *    suspended.\r\n                 * 4. prvAddCurrentTaskToDelayedList adds the task to delayed or\r\n                 *    suspended list. Note that this operation does not nullify\r\n                 *    the add to pendingReady list done in the above step because\r\n                 *    a different list item, namely xEventListItem, is used for\r\n                 *    adding the task to the pendingReady list. In other words,\r\n                 *    the task still remains on the pendingReady list.\r\n                 * 5. Resume scheduler moves the task from pendingReady list to\r\n                 *    the Ready list.\r\n                 */\r\n                vTaskSuspendAll();\r\n                {\r\n                    taskEXIT_CRITICAL();\r\n\r\n                    prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE );\r\n                }\r\n                xAlreadyYielded = xTaskResumeAll();\r\n\r\n                if( xAlreadyYielded == pdFALSE )\r\n                {\r\n                    taskYIELD_WITHIN_API();\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                taskEXIT_CRITICAL();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            taskEXIT_CRITICAL();\r\n        }\r\n\r\n        taskENTER_CRITICAL();\r\n        {\r\n            traceTASK_NOTIFY_TAKE( uxIndexToWaitOn );\r\n            ulReturn = pxCurrentTCB->ulNotifiedValue[ uxIndexToWaitOn ];\r\n\r\n            if( ulReturn != 0UL )\r\n            {\r\n                if( xClearCountOnExit != pdFALSE )\r\n                {\r\n                    pxCurrentTCB->ulNotifiedValue[ uxIndexToWaitOn ] = ( uint32_t ) 0UL;\r\n                }\r\n                else\r\n                {\r\n                    pxCurrentTCB->ulNotifiedValue[ uxIndexToWaitOn ] = ulReturn - ( uint32_t ) 1;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n\r\n            pxCurrentTCB->ucNotifyState[ uxIndexToWaitOn ] = taskNOT_WAITING_NOTIFICATION;\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_ulTaskGenericNotifyTake( ulReturn );\r\n\r\n        return ulReturn;\r\n    }\r\n\r\n#endif /* configUSE_TASK_NOTIFICATIONS */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TASK_NOTIFICATIONS == 1 )\r\n\r\n    BaseType_t xTaskGenericNotifyWait( UBaseType_t uxIndexToWaitOn,\r\n                                       uint32_t ulBitsToClearOnEntry,\r\n                                       uint32_t ulBitsToClearOnExit,\r\n                                       uint32_t * pulNotificationValue,\r\n                                       TickType_t xTicksToWait )\r\n    {\r\n        BaseType_t xReturn, xAlreadyYielded;\r\n\r\n        traceENTER_xTaskGenericNotifyWait( uxIndexToWaitOn, ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait );\r\n\r\n        configASSERT( uxIndexToWaitOn < configTASK_NOTIFICATION_ARRAY_ENTRIES );\r\n\r\n        taskENTER_CRITICAL();\r\n\r\n        /* Only block if a notification is not already pending. */\r\n        if( pxCurrentTCB->ucNotifyState[ uxIndexToWaitOn ] != taskNOTIFICATION_RECEIVED )\r\n        {\r\n            /* Clear bits in the task's notification value as bits may get\r\n             * set  by the notifying task or interrupt.  This can be used to\r\n             * clear the value to zero. */\r\n            pxCurrentTCB->ulNotifiedValue[ uxIndexToWaitOn ] &= ~ulBitsToClearOnEntry;\r\n\r\n            /* Mark this task as waiting for a notification. */\r\n            pxCurrentTCB->ucNotifyState[ uxIndexToWaitOn ] = taskWAITING_NOTIFICATION;\r\n\r\n            if( xTicksToWait > ( TickType_t ) 0 )\r\n            {\r\n                traceTASK_NOTIFY_WAIT_BLOCK( uxIndexToWaitOn );\r\n\r\n                /* We MUST suspend the scheduler before exiting the critical\r\n                 * section (i.e. before enabling interrupts).\r\n                 *\r\n                 * If we do not do so, a notification sent from an ISR, which\r\n                 * happens after exiting the critical section and before\r\n                 * suspending the scheduler, will get lost. The sequence of\r\n                 * events will be:\r\n                 * 1. Exit critical section.\r\n                 * 2. Interrupt - ISR calls xTaskNotifyFromISR which adds the\r\n                 *    task to the Ready list.\r\n                 * 3. Suspend scheduler.\r\n                 * 4. prvAddCurrentTaskToDelayedList moves the task to the\r\n                 *    delayed or suspended list.\r\n                 * 5. Resume scheduler does not touch the task (because it is\r\n                 *    not on the pendingReady list), effectively losing the\r\n                 *    notification from the ISR.\r\n                 *\r\n                 * The same does not happen when we suspend the scheduler before\r\n                 * exiting the critical section. The sequence of events in this\r\n                 * case will be:\r\n                 * 1. Suspend scheduler.\r\n                 * 2. Exit critical section.\r\n                 * 3. Interrupt - ISR calls xTaskNotifyFromISR which adds the\r\n                 *    task to the pendingReady list as the scheduler is\r\n                 *    suspended.\r\n                 * 4. prvAddCurrentTaskToDelayedList adds the task to delayed or\r\n                 *    suspended list. Note that this operation does not nullify\r\n                 *    the add to pendingReady list done in the above step because\r\n                 *    a different list item, namely xEventListItem, is used for\r\n                 *    adding the task to the pendingReady list. In other words,\r\n                 *    the task still remains on the pendingReady list.\r\n                 * 5. Resume scheduler moves the task from pendingReady list to\r\n                 *    the Ready list.\r\n                 */\r\n                vTaskSuspendAll();\r\n                {\r\n                    taskEXIT_CRITICAL();\r\n\r\n                    prvAddCurrentTaskToDelayedList( xTicksToWait, pdTRUE );\r\n                }\r\n                xAlreadyYielded = xTaskResumeAll();\r\n\r\n                if( xAlreadyYielded == pdFALSE )\r\n                {\r\n                    taskYIELD_WITHIN_API();\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            else\r\n            {\r\n                taskEXIT_CRITICAL();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            taskEXIT_CRITICAL();\r\n        }\r\n\r\n        taskENTER_CRITICAL();\r\n        {\r\n            traceTASK_NOTIFY_WAIT( uxIndexToWaitOn );\r\n\r\n            if( pulNotificationValue != NULL )\r\n            {\r\n                /* Output the current notification value, which may or may not\r\n                 * have changed. */\r\n                *pulNotificationValue = pxCurrentTCB->ulNotifiedValue[ uxIndexToWaitOn ];\r\n            }\r\n\r\n            /* If ucNotifyValue is set then either the task never entered the\r\n             * blocked state (because a notification was already pending) or the\r\n             * task unblocked because of a notification.  Otherwise the task\r\n             * unblocked because of a timeout. */\r\n            if( pxCurrentTCB->ucNotifyState[ uxIndexToWaitOn ] != taskNOTIFICATION_RECEIVED )\r\n            {\r\n                /* A notification was not received. */\r\n                xReturn = pdFALSE;\r\n            }\r\n            else\r\n            {\r\n                /* A notification was already pending or a notification was\r\n                 * received while the task was waiting. */\r\n                pxCurrentTCB->ulNotifiedValue[ uxIndexToWaitOn ] &= ~ulBitsToClearOnExit;\r\n                xReturn = pdTRUE;\r\n            }\r\n\r\n            pxCurrentTCB->ucNotifyState[ uxIndexToWaitOn ] = taskNOT_WAITING_NOTIFICATION;\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_xTaskGenericNotifyWait( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_TASK_NOTIFICATIONS */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TASK_NOTIFICATIONS == 1 )\r\n\r\n    BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify,\r\n                                   UBaseType_t uxIndexToNotify,\r\n                                   uint32_t ulValue,\r\n                                   eNotifyAction eAction,\r\n                                   uint32_t * pulPreviousNotificationValue )\r\n    {\r\n        TCB_t * pxTCB;\r\n        BaseType_t xReturn = pdPASS;\r\n        uint8_t ucOriginalNotifyState;\r\n\r\n        traceENTER_xTaskGenericNotify( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue );\r\n\r\n        configASSERT( uxIndexToNotify < configTASK_NOTIFICATION_ARRAY_ENTRIES );\r\n        configASSERT( xTaskToNotify );\r\n        pxTCB = xTaskToNotify;\r\n\r\n        taskENTER_CRITICAL();\r\n        {\r\n            if( pulPreviousNotificationValue != NULL )\r\n            {\r\n                *pulPreviousNotificationValue = pxTCB->ulNotifiedValue[ uxIndexToNotify ];\r\n            }\r\n\r\n            ucOriginalNotifyState = pxTCB->ucNotifyState[ uxIndexToNotify ];\r\n\r\n            pxTCB->ucNotifyState[ uxIndexToNotify ] = taskNOTIFICATION_RECEIVED;\r\n\r\n            switch( eAction )\r\n            {\r\n                case eSetBits:\r\n                    pxTCB->ulNotifiedValue[ uxIndexToNotify ] |= ulValue;\r\n                    break;\r\n\r\n                case eIncrement:\r\n                    ( pxTCB->ulNotifiedValue[ uxIndexToNotify ] )++;\r\n                    break;\r\n\r\n                case eSetValueWithOverwrite:\r\n                    pxTCB->ulNotifiedValue[ uxIndexToNotify ] = ulValue;\r\n                    break;\r\n\r\n                case eSetValueWithoutOverwrite:\r\n\r\n                    if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED )\r\n                    {\r\n                        pxTCB->ulNotifiedValue[ uxIndexToNotify ] = ulValue;\r\n                    }\r\n                    else\r\n                    {\r\n                        /* The value could not be written to the task. */\r\n                        xReturn = pdFAIL;\r\n                    }\r\n\r\n                    break;\r\n\r\n                case eNoAction:\r\n\r\n                    /* The task is being notified without its notify value being\r\n                     * updated. */\r\n                    break;\r\n\r\n                default:\r\n\r\n                    /* Should not get here if all enums are handled.\r\n                     * Artificially force an assert by testing a value the\r\n                     * compiler can't assume is const. */\r\n                    configASSERT( xTickCount == ( TickType_t ) 0 );\r\n\r\n                    break;\r\n            }\r\n\r\n            traceTASK_NOTIFY( uxIndexToNotify );\r\n\r\n            /* If the task is in the blocked state specifically to wait for a\r\n             * notification then unblock it now. */\r\n            if( ucOriginalNotifyState == taskWAITING_NOTIFICATION )\r\n            {\r\n                listREMOVE_ITEM( &( pxTCB->xStateListItem ) );\r\n                prvAddTaskToReadyList( pxTCB );\r\n\r\n                /* The task should not have been on an event list. */\r\n                configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL );\r\n\r\n                #if ( configUSE_TICKLESS_IDLE != 0 )\r\n                {\r\n                    /* If a task is blocked waiting for a notification then\r\n                     * xNextTaskUnblockTime might be set to the blocked task's time\r\n                     * out time.  If the task is unblocked for a reason other than\r\n                     * a timeout xNextTaskUnblockTime is normally left unchanged,\r\n                     * because it will automatically get reset to a new value when\r\n                     * the tick count equals xNextTaskUnblockTime.  However if\r\n                     * tickless idling is used it might be more important to enter\r\n                     * sleep mode at the earliest possible time - so reset\r\n                     * xNextTaskUnblockTime here to ensure it is updated at the\r\n                     * earliest possible time. */\r\n                    prvResetNextTaskUnblockTime();\r\n                }\r\n                #endif\r\n\r\n                /* Check if the notified task has a priority above the currently\r\n                 * executing task. */\r\n                taskYIELD_ANY_CORE_IF_USING_PREEMPTION( pxTCB );\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_xTaskGenericNotify( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_TASK_NOTIFICATIONS */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TASK_NOTIFICATIONS == 1 )\r\n\r\n    BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify,\r\n                                          UBaseType_t uxIndexToNotify,\r\n                                          uint32_t ulValue,\r\n                                          eNotifyAction eAction,\r\n                                          uint32_t * pulPreviousNotificationValue,\r\n                                          BaseType_t * pxHigherPriorityTaskWoken )\r\n    {\r\n        TCB_t * pxTCB;\r\n        uint8_t ucOriginalNotifyState;\r\n        BaseType_t xReturn = pdPASS;\r\n        UBaseType_t uxSavedInterruptStatus;\r\n\r\n        traceENTER_xTaskGenericNotifyFromISR( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken );\r\n\r\n        configASSERT( xTaskToNotify );\r\n        configASSERT( uxIndexToNotify < configTASK_NOTIFICATION_ARRAY_ENTRIES );\r\n\r\n        /* RTOS ports that support interrupt nesting have the concept of a\r\n         * maximum  system call (or maximum API call) interrupt priority.\r\n         * Interrupts that are  above the maximum system call priority are keep\r\n         * permanently enabled, even when the RTOS kernel is in a critical section,\r\n         * but cannot make any calls to FreeRTOS API functions.  If configASSERT()\r\n         * is defined in FreeRTOSConfig.h then\r\n         * portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion\r\n         * failure if a FreeRTOS API function is called from an interrupt that has\r\n         * been assigned a priority above the configured maximum system call\r\n         * priority.  Only FreeRTOS functions that end in FromISR can be called\r\n         * from interrupts  that have been assigned a priority at or (logically)\r\n         * below the maximum system call interrupt priority.  FreeRTOS maintains a\r\n         * separate interrupt safe API to ensure interrupt entry is as fast and as\r\n         * simple as possible.  More information (albeit Cortex-M specific) is\r\n         * provided on the following link:\r\n         * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */\r\n        portASSERT_IF_INTERRUPT_PRIORITY_INVALID();\r\n\r\n        pxTCB = xTaskToNotify;\r\n\r\n        uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();\r\n        {\r\n            if( pulPreviousNotificationValue != NULL )\r\n            {\r\n                *pulPreviousNotificationValue = pxTCB->ulNotifiedValue[ uxIndexToNotify ];\r\n            }\r\n\r\n            ucOriginalNotifyState = pxTCB->ucNotifyState[ uxIndexToNotify ];\r\n            pxTCB->ucNotifyState[ uxIndexToNotify ] = taskNOTIFICATION_RECEIVED;\r\n\r\n            switch( eAction )\r\n            {\r\n                case eSetBits:\r\n                    pxTCB->ulNotifiedValue[ uxIndexToNotify ] |= ulValue;\r\n                    break;\r\n\r\n                case eIncrement:\r\n                    ( pxTCB->ulNotifiedValue[ uxIndexToNotify ] )++;\r\n                    break;\r\n\r\n                case eSetValueWithOverwrite:\r\n                    pxTCB->ulNotifiedValue[ uxIndexToNotify ] = ulValue;\r\n                    break;\r\n\r\n                case eSetValueWithoutOverwrite:\r\n\r\n                    if( ucOriginalNotifyState != taskNOTIFICATION_RECEIVED )\r\n                    {\r\n                        pxTCB->ulNotifiedValue[ uxIndexToNotify ] = ulValue;\r\n                    }\r\n                    else\r\n                    {\r\n                        /* The value could not be written to the task. */\r\n                        xReturn = pdFAIL;\r\n                    }\r\n\r\n                    break;\r\n\r\n                case eNoAction:\r\n\r\n                    /* The task is being notified without its notify value being\r\n                     * updated. */\r\n                    break;\r\n\r\n                default:\r\n\r\n                    /* Should not get here if all enums are handled.\r\n                     * Artificially force an assert by testing a value the\r\n                     * compiler can't assume is const. */\r\n                    configASSERT( xTickCount == ( TickType_t ) 0 );\r\n                    break;\r\n            }\r\n\r\n            traceTASK_NOTIFY_FROM_ISR( uxIndexToNotify );\r\n\r\n            /* If the task is in the blocked state specifically to wait for a\r\n             * notification then unblock it now. */\r\n            if( ucOriginalNotifyState == taskWAITING_NOTIFICATION )\r\n            {\r\n                /* The task should not have been on an event list. */\r\n                configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL );\r\n\r\n                if( uxSchedulerSuspended == ( UBaseType_t ) 0U )\r\n                {\r\n                    listREMOVE_ITEM( &( pxTCB->xStateListItem ) );\r\n                    prvAddTaskToReadyList( pxTCB );\r\n                }\r\n                else\r\n                {\r\n                    /* The delayed and ready lists cannot be accessed, so hold\r\n                     * this task pending until the scheduler is resumed. */\r\n                    listINSERT_END( &( xPendingReadyList ), &( pxTCB->xEventListItem ) );\r\n                }\r\n\r\n                #if ( configNUMBER_OF_CORES == 1 )\r\n                {\r\n                    if( pxTCB->uxPriority > pxCurrentTCB->uxPriority )\r\n                    {\r\n                        /* The notified task has a priority above the currently\r\n                         * executing task so a yield is required. */\r\n                        if( pxHigherPriorityTaskWoken != NULL )\r\n                        {\r\n                            *pxHigherPriorityTaskWoken = pdTRUE;\r\n                        }\r\n\r\n                        /* Mark that a yield is pending in case the user is not\r\n                         * using the \"xHigherPriorityTaskWoken\" parameter to an ISR\r\n                         * safe FreeRTOS function. */\r\n                        xYieldPendings[ 0 ] = pdTRUE;\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                #else /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n                {\r\n                    #if ( configUSE_PREEMPTION == 1 )\r\n                    {\r\n                        prvYieldForTask( pxTCB );\r\n\r\n                        if( xYieldPendings[ portGET_CORE_ID() ] == pdTRUE )\r\n                        {\r\n                            if( pxHigherPriorityTaskWoken != NULL )\r\n                            {\r\n                                *pxHigherPriorityTaskWoken = pdTRUE;\r\n                            }\r\n                        }\r\n                    }\r\n                    #endif /* if ( configUSE_PREEMPTION == 1 ) */\r\n                }\r\n                #endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );\r\n\r\n        traceRETURN_xTaskGenericNotifyFromISR( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_TASK_NOTIFICATIONS */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TASK_NOTIFICATIONS == 1 )\r\n\r\n    void vTaskGenericNotifyGiveFromISR( TaskHandle_t xTaskToNotify,\r\n                                        UBaseType_t uxIndexToNotify,\r\n                                        BaseType_t * pxHigherPriorityTaskWoken )\r\n    {\r\n        TCB_t * pxTCB;\r\n        uint8_t ucOriginalNotifyState;\r\n        UBaseType_t uxSavedInterruptStatus;\r\n\r\n        traceENTER_vTaskGenericNotifyGiveFromISR( xTaskToNotify, uxIndexToNotify, pxHigherPriorityTaskWoken );\r\n\r\n        configASSERT( xTaskToNotify );\r\n        configASSERT( uxIndexToNotify < configTASK_NOTIFICATION_ARRAY_ENTRIES );\r\n\r\n        /* RTOS ports that support interrupt nesting have the concept of a\r\n         * maximum  system call (or maximum API call) interrupt priority.\r\n         * Interrupts that are  above the maximum system call priority are keep\r\n         * permanently enabled, even when the RTOS kernel is in a critical section,\r\n         * but cannot make any calls to FreeRTOS API functions.  If configASSERT()\r\n         * is defined in FreeRTOSConfig.h then\r\n         * portASSERT_IF_INTERRUPT_PRIORITY_INVALID() will result in an assertion\r\n         * failure if a FreeRTOS API function is called from an interrupt that has\r\n         * been assigned a priority above the configured maximum system call\r\n         * priority.  Only FreeRTOS functions that end in FromISR can be called\r\n         * from interrupts  that have been assigned a priority at or (logically)\r\n         * below the maximum system call interrupt priority.  FreeRTOS maintains a\r\n         * separate interrupt safe API to ensure interrupt entry is as fast and as\r\n         * simple as possible.  More information (albeit Cortex-M specific) is\r\n         * provided on the following link:\r\n         * https://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html */\r\n        portASSERT_IF_INTERRUPT_PRIORITY_INVALID();\r\n\r\n        pxTCB = xTaskToNotify;\r\n\r\n        uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();\r\n        {\r\n            ucOriginalNotifyState = pxTCB->ucNotifyState[ uxIndexToNotify ];\r\n            pxTCB->ucNotifyState[ uxIndexToNotify ] = taskNOTIFICATION_RECEIVED;\r\n\r\n            /* 'Giving' is equivalent to incrementing a count in a counting\r\n             * semaphore. */\r\n            ( pxTCB->ulNotifiedValue[ uxIndexToNotify ] )++;\r\n\r\n            traceTASK_NOTIFY_GIVE_FROM_ISR( uxIndexToNotify );\r\n\r\n            /* If the task is in the blocked state specifically to wait for a\r\n             * notification then unblock it now. */\r\n            if( ucOriginalNotifyState == taskWAITING_NOTIFICATION )\r\n            {\r\n                /* The task should not have been on an event list. */\r\n                configASSERT( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL );\r\n\r\n                if( uxSchedulerSuspended == ( UBaseType_t ) 0U )\r\n                {\r\n                    listREMOVE_ITEM( &( pxTCB->xStateListItem ) );\r\n                    prvAddTaskToReadyList( pxTCB );\r\n                }\r\n                else\r\n                {\r\n                    /* The delayed and ready lists cannot be accessed, so hold\r\n                     * this task pending until the scheduler is resumed. */\r\n                    listINSERT_END( &( xPendingReadyList ), &( pxTCB->xEventListItem ) );\r\n                }\r\n\r\n                #if ( configNUMBER_OF_CORES == 1 )\r\n                {\r\n                    if( pxTCB->uxPriority > pxCurrentTCB->uxPriority )\r\n                    {\r\n                        /* The notified task has a priority above the currently\r\n                         * executing task so a yield is required. */\r\n                        if( pxHigherPriorityTaskWoken != NULL )\r\n                        {\r\n                            *pxHigherPriorityTaskWoken = pdTRUE;\r\n                        }\r\n\r\n                        /* Mark that a yield is pending in case the user is not\r\n                         * using the \"xHigherPriorityTaskWoken\" parameter in an ISR\r\n                         * safe FreeRTOS function. */\r\n                        xYieldPendings[ 0 ] = pdTRUE;\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                #else /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n                {\r\n                    #if ( configUSE_PREEMPTION == 1 )\r\n                    {\r\n                        prvYieldForTask( pxTCB );\r\n\r\n                        if( xYieldPendings[ portGET_CORE_ID() ] == pdTRUE )\r\n                        {\r\n                            if( pxHigherPriorityTaskWoken != NULL )\r\n                            {\r\n                                *pxHigherPriorityTaskWoken = pdTRUE;\r\n                            }\r\n                        }\r\n                    }\r\n                    #endif /* #if ( configUSE_PREEMPTION == 1 ) */\r\n                }\r\n                #endif /* #if ( configNUMBER_OF_CORES == 1 ) */\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );\r\n\r\n        traceRETURN_vTaskGenericNotifyGiveFromISR();\r\n    }\r\n\r\n#endif /* configUSE_TASK_NOTIFICATIONS */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TASK_NOTIFICATIONS == 1 )\r\n\r\n    BaseType_t xTaskGenericNotifyStateClear( TaskHandle_t xTask,\r\n                                             UBaseType_t uxIndexToClear )\r\n    {\r\n        TCB_t * pxTCB;\r\n        BaseType_t xReturn;\r\n\r\n        traceENTER_xTaskGenericNotifyStateClear( xTask, uxIndexToClear );\r\n\r\n        configASSERT( uxIndexToClear < configTASK_NOTIFICATION_ARRAY_ENTRIES );\r\n\r\n        /* If null is passed in here then it is the calling task that is having\r\n         * its notification state cleared. */\r\n        pxTCB = prvGetTCBFromHandle( xTask );\r\n\r\n        taskENTER_CRITICAL();\r\n        {\r\n            if( pxTCB->ucNotifyState[ uxIndexToClear ] == taskNOTIFICATION_RECEIVED )\r\n            {\r\n                pxTCB->ucNotifyState[ uxIndexToClear ] = taskNOT_WAITING_NOTIFICATION;\r\n                xReturn = pdPASS;\r\n            }\r\n            else\r\n            {\r\n                xReturn = pdFAIL;\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_xTaskGenericNotifyStateClear( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n#endif /* configUSE_TASK_NOTIFICATIONS */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configUSE_TASK_NOTIFICATIONS == 1 )\r\n\r\n    uint32_t ulTaskGenericNotifyValueClear( TaskHandle_t xTask,\r\n                                            UBaseType_t uxIndexToClear,\r\n                                            uint32_t ulBitsToClear )\r\n    {\r\n        TCB_t * pxTCB;\r\n        uint32_t ulReturn;\r\n\r\n        traceENTER_ulTaskGenericNotifyValueClear( xTask, uxIndexToClear, ulBitsToClear );\r\n\r\n        configASSERT( uxIndexToClear < configTASK_NOTIFICATION_ARRAY_ENTRIES );\r\n\r\n        /* If null is passed in here then it is the calling task that is having\r\n         * its notification state cleared. */\r\n        pxTCB = prvGetTCBFromHandle( xTask );\r\n\r\n        taskENTER_CRITICAL();\r\n        {\r\n            /* Return the notification as it was before the bits were cleared,\r\n             * then clear the bit mask. */\r\n            ulReturn = pxTCB->ulNotifiedValue[ uxIndexToClear ];\r\n            pxTCB->ulNotifiedValue[ uxIndexToClear ] &= ~ulBitsToClear;\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_ulTaskGenericNotifyValueClear( ulReturn );\r\n\r\n        return ulReturn;\r\n    }\r\n\r\n#endif /* configUSE_TASK_NOTIFICATIONS */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configGENERATE_RUN_TIME_STATS == 1 )\r\n\r\n    configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimeCounter( const TaskHandle_t xTask )\r\n    {\r\n        TCB_t * pxTCB;\r\n\r\n        traceENTER_ulTaskGetRunTimeCounter( xTask );\r\n\r\n        pxTCB = prvGetTCBFromHandle( xTask );\r\n\r\n        traceRETURN_ulTaskGetRunTimeCounter( pxTCB->ulRunTimeCounter );\r\n\r\n        return pxTCB->ulRunTimeCounter;\r\n    }\r\n\r\n#endif /* if ( configGENERATE_RUN_TIME_STATS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( configGENERATE_RUN_TIME_STATS == 1 )\r\n\r\n    configRUN_TIME_COUNTER_TYPE ulTaskGetRunTimePercent( const TaskHandle_t xTask )\r\n    {\r\n        TCB_t * pxTCB;\r\n        configRUN_TIME_COUNTER_TYPE ulTotalTime, ulReturn;\r\n\r\n        traceENTER_ulTaskGetRunTimePercent( xTask );\r\n\r\n        ulTotalTime = ( configRUN_TIME_COUNTER_TYPE ) portGET_RUN_TIME_COUNTER_VALUE();\r\n\r\n        /* For percentage calculations. */\r\n        ulTotalTime /= ( configRUN_TIME_COUNTER_TYPE ) 100;\r\n\r\n        /* Avoid divide by zero errors. */\r\n        if( ulTotalTime > ( configRUN_TIME_COUNTER_TYPE ) 0 )\r\n        {\r\n            pxTCB = prvGetTCBFromHandle( xTask );\r\n            ulReturn = pxTCB->ulRunTimeCounter / ulTotalTime;\r\n        }\r\n        else\r\n        {\r\n            ulReturn = 0;\r\n        }\r\n\r\n        traceRETURN_ulTaskGetRunTimePercent( ulReturn );\r\n\r\n        return ulReturn;\r\n    }\r\n\r\n#endif /* if ( configGENERATE_RUN_TIME_STATS == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) )\r\n\r\n    configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimeCounter( void )\r\n    {\r\n        configRUN_TIME_COUNTER_TYPE ulReturn = 0;\r\n        BaseType_t i;\r\n\r\n        traceENTER_ulTaskGetIdleRunTimeCounter();\r\n\r\n        for( i = 0; i < ( BaseType_t ) configNUMBER_OF_CORES; i++ )\r\n        {\r\n            ulReturn += xIdleTaskHandles[ i ]->ulRunTimeCounter;\r\n        }\r\n\r\n        traceRETURN_ulTaskGetIdleRunTimeCounter( ulReturn );\r\n\r\n        return ulReturn;\r\n    }\r\n\r\n#endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) )\r\n\r\n    configRUN_TIME_COUNTER_TYPE ulTaskGetIdleRunTimePercent( void )\r\n    {\r\n        configRUN_TIME_COUNTER_TYPE ulTotalTime, ulReturn;\r\n        configRUN_TIME_COUNTER_TYPE ulRunTimeCounter = 0;\r\n        BaseType_t i;\r\n\r\n        traceENTER_ulTaskGetIdleRunTimePercent();\r\n\r\n        ulTotalTime = portGET_RUN_TIME_COUNTER_VALUE() * configNUMBER_OF_CORES;\r\n\r\n        /* For percentage calculations. */\r\n        ulTotalTime /= ( configRUN_TIME_COUNTER_TYPE ) 100;\r\n\r\n        /* Avoid divide by zero errors. */\r\n        if( ulTotalTime > ( configRUN_TIME_COUNTER_TYPE ) 0 )\r\n        {\r\n            for( i = 0; i < ( BaseType_t ) configNUMBER_OF_CORES; i++ )\r\n            {\r\n                ulRunTimeCounter += xIdleTaskHandles[ i ]->ulRunTimeCounter;\r\n            }\r\n\r\n            ulReturn = ulRunTimeCounter / ulTotalTime;\r\n        }\r\n        else\r\n        {\r\n            ulReturn = 0;\r\n        }\r\n\r\n        traceRETURN_ulTaskGetIdleRunTimePercent( ulReturn );\r\n\r\n        return ulReturn;\r\n    }\r\n\r\n#endif /* if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\nstatic void prvAddCurrentTaskToDelayedList( TickType_t xTicksToWait,\r\n                                            const BaseType_t xCanBlockIndefinitely )\r\n{\r\n    TickType_t xTimeToWake;\r\n    const TickType_t xConstTickCount = xTickCount;\r\n    List_t * const pxDelayedList = pxDelayedTaskList;\r\n    List_t * const pxOverflowDelayedList = pxOverflowDelayedTaskList;\r\n\r\n    #if ( INCLUDE_xTaskAbortDelay == 1 )\r\n    {\r\n        /* About to enter a delayed list, so ensure the ucDelayAborted flag is\r\n         * reset to pdFALSE so it can be detected as having been set to pdTRUE\r\n         * when the task leaves the Blocked state. */\r\n        pxCurrentTCB->ucDelayAborted = pdFALSE;\r\n    }\r\n    #endif\r\n\r\n    /* Remove the task from the ready list before adding it to the blocked list\r\n     * as the same list item is used for both lists. */\r\n    if( uxListRemove( &( pxCurrentTCB->xStateListItem ) ) == ( UBaseType_t ) 0 )\r\n    {\r\n        /* The current task must be in a ready list, so there is no need to\r\n         * check, and the port reset macro can be called directly. */\r\n        portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority );\r\n    }\r\n    else\r\n    {\r\n        mtCOVERAGE_TEST_MARKER();\r\n    }\r\n\r\n    #if ( INCLUDE_vTaskSuspend == 1 )\r\n    {\r\n        if( ( xTicksToWait == portMAX_DELAY ) && ( xCanBlockIndefinitely != pdFALSE ) )\r\n        {\r\n            /* Add the task to the suspended task list instead of a delayed task\r\n             * list to ensure it is not woken by a timing event.  It will block\r\n             * indefinitely. */\r\n            listINSERT_END( &xSuspendedTaskList, &( pxCurrentTCB->xStateListItem ) );\r\n        }\r\n        else\r\n        {\r\n            /* Calculate the time at which the task should be woken if the event\r\n             * does not occur.  This may overflow but this doesn't matter, the\r\n             * kernel will manage it correctly. */\r\n            xTimeToWake = xConstTickCount + xTicksToWait;\r\n\r\n            /* The list item will be inserted in wake time order. */\r\n            listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake );\r\n\r\n            if( xTimeToWake < xConstTickCount )\r\n            {\r\n                /* Wake time has overflowed.  Place this item in the overflow\r\n                 * list. */\r\n                traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST();\r\n                vListInsert( pxOverflowDelayedList, &( pxCurrentTCB->xStateListItem ) );\r\n            }\r\n            else\r\n            {\r\n                /* The wake time has not overflowed, so the current block list\r\n                 * is used. */\r\n                traceMOVED_TASK_TO_DELAYED_LIST();\r\n                vListInsert( pxDelayedList, &( pxCurrentTCB->xStateListItem ) );\r\n\r\n                /* If the task entering the blocked state was placed at the\r\n                 * head of the list of blocked tasks then xNextTaskUnblockTime\r\n                 * needs to be updated too. */\r\n                if( xTimeToWake < xNextTaskUnblockTime )\r\n                {\r\n                    xNextTaskUnblockTime = xTimeToWake;\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n        }\r\n    }\r\n    #else /* INCLUDE_vTaskSuspend */\r\n    {\r\n        /* Calculate the time at which the task should be woken if the event\r\n         * does not occur.  This may overflow but this doesn't matter, the kernel\r\n         * will manage it correctly. */\r\n        xTimeToWake = xConstTickCount + xTicksToWait;\r\n\r\n        /* The list item will be inserted in wake time order. */\r\n        listSET_LIST_ITEM_VALUE( &( pxCurrentTCB->xStateListItem ), xTimeToWake );\r\n\r\n        if( xTimeToWake < xConstTickCount )\r\n        {\r\n            traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST();\r\n            /* Wake time has overflowed.  Place this item in the overflow list. */\r\n            vListInsert( pxOverflowDelayedList, &( pxCurrentTCB->xStateListItem ) );\r\n        }\r\n        else\r\n        {\r\n            traceMOVED_TASK_TO_DELAYED_LIST();\r\n            /* The wake time has not overflowed, so the current block list is used. */\r\n            vListInsert( pxDelayedList, &( pxCurrentTCB->xStateListItem ) );\r\n\r\n            /* If the task entering the blocked state was placed at the head of the\r\n             * list of blocked tasks then xNextTaskUnblockTime needs to be updated\r\n             * too. */\r\n            if( xTimeToWake < xNextTaskUnblockTime )\r\n            {\r\n                xNextTaskUnblockTime = xTimeToWake;\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n\r\n        /* Avoid compiler warning when INCLUDE_vTaskSuspend is not 1. */\r\n        ( void ) xCanBlockIndefinitely;\r\n    }\r\n    #endif /* INCLUDE_vTaskSuspend */\r\n}\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( portUSING_MPU_WRAPPERS == 1 )\r\n\r\n    xMPU_SETTINGS * xTaskGetMPUSettings( TaskHandle_t xTask )\r\n    {\r\n        TCB_t * pxTCB;\r\n\r\n        traceENTER_xTaskGetMPUSettings( xTask );\r\n\r\n        pxTCB = prvGetTCBFromHandle( xTask );\r\n\r\n        traceRETURN_xTaskGetMPUSettings( &( pxTCB->xMPUSettings ) );\r\n\r\n        return &( pxTCB->xMPUSettings );\r\n    }\r\n\r\n#endif /* portUSING_MPU_WRAPPERS */\r\n/*-----------------------------------------------------------*/\r\n\r\n/* Code below here allows additional code to be inserted into this source file,\r\n * especially where access to file scope functions and data is needed (for example\r\n * when performing module tests). */\r\n\r\n#ifdef FREERTOS_MODULE_TEST\r\n    #include \"tasks_test_access_functions.h\"\r\n#endif\r\n\r\n\r\n#if ( configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H == 1 )\r\n\r\n    #include \"freertos_tasks_c_additions.h\"\r\n\r\n    #ifdef FREERTOS_TASKS_C_ADDITIONS_INIT\r\n        static void freertos_tasks_c_additions_init( void )\r\n        {\r\n            FREERTOS_TASKS_C_ADDITIONS_INIT();\r\n        }\r\n    #endif\r\n\r\n#endif /* if ( configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H == 1 ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configKERNEL_PROVIDED_STATIC_MEMORY == 1 ) && ( portUSING_MPU_WRAPPERS == 0 ) )\r\n\r\n/*\r\n * This is the kernel provided implementation of vApplicationGetIdleTaskMemory()\r\n * to provide the memory that is used by the Idle task. It is used when\r\n * configKERNEL_PROVIDED_STATIC_MEMORY is set to 1. The application can provide\r\n * it's own implementation of vApplicationGetIdleTaskMemory by setting\r\n * configKERNEL_PROVIDED_STATIC_MEMORY to 0 or leaving it undefined.\r\n */\r\n    void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,\r\n                                        StackType_t ** ppxIdleTaskStackBuffer,\r\n                                        uint32_t * pulIdleTaskStackSize )\r\n    {\r\n        static StaticTask_t xIdleTaskTCB;\r\n        static StackType_t uxIdleTaskStack[ configMINIMAL_STACK_SIZE ];\r\n\r\n        *ppxIdleTaskTCBBuffer = &( xIdleTaskTCB );\r\n        *ppxIdleTaskStackBuffer = &( uxIdleTaskStack[ 0 ] );\r\n        *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;\r\n    }\r\n\r\n    #if ( configNUMBER_OF_CORES > 1 )\r\n\r\n        void vApplicationGetPassiveIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer,\r\n                                                   StackType_t ** ppxIdleTaskStackBuffer,\r\n                                                   uint32_t * pulIdleTaskStackSize,\r\n                                                   BaseType_t xPassiveIdleTaskIndex )\r\n        {\r\n            static StaticTask_t xIdleTaskTCBs[ configNUMBER_OF_CORES - 1 ];\r\n            static StackType_t uxIdleTaskStacks[ configNUMBER_OF_CORES - 1 ][ configMINIMAL_STACK_SIZE ];\r\n\r\n            *ppxIdleTaskTCBBuffer = &( xIdleTaskTCBs[ xPassiveIdleTaskIndex ] );\r\n            *ppxIdleTaskStackBuffer = &( uxIdleTaskStacks[ xPassiveIdleTaskIndex ][ 0 ] );\r\n            *pulIdleTaskStackSize = configMINIMAL_STACK_SIZE;\r\n        }\r\n\r\n    #endif /* #if ( configNUMBER_OF_CORES > 1 ) */\r\n\r\n#endif /* #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configKERNEL_PROVIDED_STATIC_MEMORY == 1 ) && ( portUSING_MPU_WRAPPERS == 0 ) ) */\r\n/*-----------------------------------------------------------*/\r\n\r\n#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configKERNEL_PROVIDED_STATIC_MEMORY == 1 ) && ( portUSING_MPU_WRAPPERS == 0 ) )\r\n\r\n/*\r\n * This is the kernel provided implementation of vApplicationGetTimerTaskMemory()\r\n * to provide the memory that is used by the Timer service task. It is used when\r\n * configKERNEL_PROVIDED_STATIC_MEMORY is set to 1. The application can provide\r\n * it's own implementation of vApplicationGetTimerTaskMemory by setting\r\n * configKERNEL_PROVIDED_STATIC_MEMORY to 0 or leaving it undefined.\r\n */\r\n    void vApplicationGetTimerTaskMemory( StaticTask_t ** ppxTimerTaskTCBBuffer,\r\n                                         StackType_t ** ppxTimerTaskStackBuffer,\r\n                                         uint32_t * pulTimerTaskStackSize )\r\n    {\r\n        static StaticTask_t xTimerTaskTCB;\r\n        static StackType_t uxTimerTaskStack[ configTIMER_TASK_STACK_DEPTH ];\r\n\r\n        *ppxTimerTaskTCBBuffer = &( xTimerTaskTCB );\r\n        *ppxTimerTaskStackBuffer = &( uxTimerTaskStack[ 0 ] );\r\n        *pulTimerTaskStackSize = configTIMER_TASK_STACK_DEPTH;\r\n    }\r\n\r\n#endif /* #if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configKERNEL_PROVIDED_STATIC_MEMORY == 1 ) && ( portUSING_MPU_WRAPPERS == 0 ) ) */\r\n/*-----------------------------------------------------------*/\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/freertos/freertos-kernel/timers.c",
    "content": "/*\r\n * FreeRTOS Kernel V11.0.1\r\n * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * SPDX-License-Identifier: MIT\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n/* Standard includes. */\r\n#include <stdlib.h>\r\n\r\n/* Defining MPU_WRAPPERS_INCLUDED_FROM_API_FILE prevents task.h from redefining\r\n * all the API functions to use the MPU wrappers.  That should only be done when\r\n * task.h is included from an application file. */\r\n#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n#include \"FreeRTOS.h\"\r\n#include \"task.h\"\r\n#include \"queue.h\"\r\n#include \"timers.h\"\r\n\r\n#if ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 0 )\r\n    #error configUSE_TIMERS must be set to 1 to make the xTimerPendFunctionCall() function available.\r\n#endif\r\n\r\n/* The MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined\r\n * for the header files above, but not in this file, in order to generate the\r\n * correct privileged Vs unprivileged linkage and placement. */\r\n#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE\r\n\r\n\r\n/* This entire source file will be skipped if the application is not configured\r\n * to include software timer functionality.  This #if is closed at the very bottom\r\n * of this file.  If you want to include software timer functionality then ensure\r\n * configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */\r\n#if ( configUSE_TIMERS == 1 )\r\n\r\n/* Misc definitions. */\r\n    #define tmrNO_DELAY                    ( ( TickType_t ) 0U )\r\n    #define tmrMAX_TIME_BEFORE_OVERFLOW    ( ( TickType_t ) -1 )\r\n\r\n/* The name assigned to the timer service task. This can be overridden by\r\n * defining configTIMER_SERVICE_TASK_NAME in FreeRTOSConfig.h. */\r\n    #ifndef configTIMER_SERVICE_TASK_NAME\r\n        #define configTIMER_SERVICE_TASK_NAME    \"Tmr Svc\"\r\n    #endif\r\n\r\n    #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) )\r\n\r\n/* The core affinity assigned to the timer service task on SMP systems.\r\n * This can be overridden by defining configTIMER_SERVICE_TASK_CORE_AFFINITY in FreeRTOSConfig.h. */\r\n        #ifndef configTIMER_SERVICE_TASK_CORE_AFFINITY\r\n            #define configTIMER_SERVICE_TASK_CORE_AFFINITY    tskNO_AFFINITY\r\n        #endif\r\n    #endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) */\r\n\r\n/* Bit definitions used in the ucStatus member of a timer structure. */\r\n    #define tmrSTATUS_IS_ACTIVE                  ( 0x01U )\r\n    #define tmrSTATUS_IS_STATICALLY_ALLOCATED    ( 0x02U )\r\n    #define tmrSTATUS_IS_AUTORELOAD              ( 0x04U )\r\n\r\n/* The definition of the timers themselves. */\r\n    typedef struct tmrTimerControl                                               /* The old naming convention is used to prevent breaking kernel aware debuggers. */\r\n    {\r\n        const char * pcTimerName;                                                /**< Text name.  This is not used by the kernel, it is included simply to make debugging easier. */\r\n        ListItem_t xTimerListItem;                                               /**< Standard linked list item as used by all kernel features for event management. */\r\n        TickType_t xTimerPeriodInTicks;                                          /**< How quickly and often the timer expires. */\r\n        void * pvTimerID;                                                        /**< An ID to identify the timer.  This allows the timer to be identified when the same callback is used for multiple timers. */\r\n        portTIMER_CALLBACK_ATTRIBUTE TimerCallbackFunction_t pxCallbackFunction; /**< The function that will be called when the timer expires. */\r\n        #if ( configUSE_TRACE_FACILITY == 1 )\r\n            UBaseType_t uxTimerNumber;                                           /**< An ID assigned by trace tools such as FreeRTOS+Trace */\r\n        #endif\r\n        uint8_t ucStatus;                                                        /**< Holds bits to say if the timer was statically allocated or not, and if it is active or not. */\r\n    } xTIMER;\r\n\r\n/* The old xTIMER name is maintained above then typedefed to the new Timer_t\r\n * name below to enable the use of older kernel aware debuggers. */\r\n    typedef xTIMER Timer_t;\r\n\r\n/* The definition of messages that can be sent and received on the timer queue.\r\n * Two types of message can be queued - messages that manipulate a software timer,\r\n * and messages that request the execution of a non-timer related callback.  The\r\n * two message types are defined in two separate structures, xTimerParametersType\r\n * and xCallbackParametersType respectively. */\r\n    typedef struct tmrTimerParameters\r\n    {\r\n        TickType_t xMessageValue; /**< An optional value used by a subset of commands, for example, when changing the period of a timer. */\r\n        Timer_t * pxTimer;        /**< The timer to which the command will be applied. */\r\n    } TimerParameter_t;\r\n\r\n\r\n    typedef struct tmrCallbackParameters\r\n    {\r\n        portTIMER_CALLBACK_ATTRIBUTE\r\n        PendedFunction_t pxCallbackFunction; /* << The callback function to execute. */\r\n        void * pvParameter1;                 /* << The value that will be used as the callback functions first parameter. */\r\n        uint32_t ulParameter2;               /* << The value that will be used as the callback functions second parameter. */\r\n    } CallbackParameters_t;\r\n\r\n/* The structure that contains the two message types, along with an identifier\r\n * that is used to determine which message type is valid. */\r\n    typedef struct tmrTimerQueueMessage\r\n    {\r\n        BaseType_t xMessageID; /**< The command being sent to the timer service task. */\r\n        union\r\n        {\r\n            TimerParameter_t xTimerParameters;\r\n\r\n            /* Don't include xCallbackParameters if it is not going to be used as\r\n             * it makes the structure (and therefore the timer queue) larger. */\r\n            #if ( INCLUDE_xTimerPendFunctionCall == 1 )\r\n                CallbackParameters_t xCallbackParameters;\r\n            #endif /* INCLUDE_xTimerPendFunctionCall */\r\n        } u;\r\n    } DaemonTaskMessage_t;\r\n\r\n/* The list in which active timers are stored.  Timers are referenced in expire\r\n * time order, with the nearest expiry time at the front of the list.  Only the\r\n * timer service task is allowed to access these lists.\r\n * xActiveTimerList1 and xActiveTimerList2 could be at function scope but that\r\n * breaks some kernel aware debuggers, and debuggers that reply on removing the\r\n * static qualifier. */\r\n    PRIVILEGED_DATA static List_t xActiveTimerList1;\r\n    PRIVILEGED_DATA static List_t xActiveTimerList2;\r\n    PRIVILEGED_DATA static List_t * pxCurrentTimerList;\r\n    PRIVILEGED_DATA static List_t * pxOverflowTimerList;\r\n\r\n/* A queue that is used to send commands to the timer service task. */\r\n    PRIVILEGED_DATA static QueueHandle_t xTimerQueue = NULL;\r\n    PRIVILEGED_DATA static TaskHandle_t xTimerTaskHandle = NULL;\r\n\r\n/*-----------------------------------------------------------*/\r\n\r\n/*\r\n * Initialise the infrastructure used by the timer service task if it has not\r\n * been initialised already.\r\n */\r\n    static void prvCheckForValidListAndQueue( void ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * The timer service task (daemon).  Timer functionality is controlled by this\r\n * task.  Other tasks communicate with the timer service task using the\r\n * xTimerQueue queue.\r\n */\r\n    static portTASK_FUNCTION_PROTO( prvTimerTask, pvParameters ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Called by the timer service task to interpret and process a command it\r\n * received on the timer queue.\r\n */\r\n    static void prvProcessReceivedCommands( void ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Insert the timer into either xActiveTimerList1, or xActiveTimerList2,\r\n * depending on if the expire time causes a timer counter overflow.\r\n */\r\n    static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer,\r\n                                                  const TickType_t xNextExpiryTime,\r\n                                                  const TickType_t xTimeNow,\r\n                                                  const TickType_t xCommandTime ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Reload the specified auto-reload timer.  If the reloading is backlogged,\r\n * clear the backlog, calling the callback for each additional reload.  When\r\n * this function returns, the next expiry time is after xTimeNow.\r\n */\r\n    static void prvReloadTimer( Timer_t * const pxTimer,\r\n                                TickType_t xExpiredTime,\r\n                                const TickType_t xTimeNow ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * An active timer has reached its expire time.  Reload the timer if it is an\r\n * auto-reload timer, then call its callback.\r\n */\r\n    static void prvProcessExpiredTimer( const TickType_t xNextExpireTime,\r\n                                        const TickType_t xTimeNow ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * The tick count has overflowed.  Switch the timer lists after ensuring the\r\n * current timer list does not still reference some timers.\r\n */\r\n    static void prvSwitchTimerLists( void ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Obtain the current tick count, setting *pxTimerListsWereSwitched to pdTRUE\r\n * if a tick count overflow occurred since prvSampleTimeNow() was last called.\r\n */\r\n    static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * If the timer list contains any active timers then return the expire time of\r\n * the timer that will expire first and set *pxListWasEmpty to false.  If the\r\n * timer list does not contain any timers then return 0 and set *pxListWasEmpty\r\n * to pdTRUE.\r\n */\r\n    static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * If a timer has expired, process it.  Otherwise, block the timer service task\r\n * until either a timer does expire or a command is received.\r\n */\r\n    static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime,\r\n                                            BaseType_t xListWasEmpty ) PRIVILEGED_FUNCTION;\r\n\r\n/*\r\n * Called after a Timer_t structure has been allocated either statically or\r\n * dynamically to fill in the structure's members.\r\n */\r\n    static void prvInitialiseNewTimer( const char * const pcTimerName,\r\n                                       const TickType_t xTimerPeriodInTicks,\r\n                                       const BaseType_t xAutoReload,\r\n                                       void * const pvTimerID,\r\n                                       TimerCallbackFunction_t pxCallbackFunction,\r\n                                       Timer_t * pxNewTimer ) PRIVILEGED_FUNCTION;\r\n/*-----------------------------------------------------------*/\r\n\r\n    BaseType_t xTimerCreateTimerTask( void )\r\n    {\r\n        BaseType_t xReturn = pdFAIL;\r\n\r\n        traceENTER_xTimerCreateTimerTask();\r\n\r\n        /* This function is called when the scheduler is started if\r\n         * configUSE_TIMERS is set to 1.  Check that the infrastructure used by the\r\n         * timer service task has been created/initialised.  If timers have already\r\n         * been created then the initialisation will already have been performed. */\r\n        prvCheckForValidListAndQueue();\r\n\r\n        if( xTimerQueue != NULL )\r\n        {\r\n            #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) )\r\n            {\r\n                #if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n                {\r\n                    StaticTask_t * pxTimerTaskTCBBuffer = NULL;\r\n                    StackType_t * pxTimerTaskStackBuffer = NULL;\r\n                    uint32_t ulTimerTaskStackSize;\r\n\r\n                    vApplicationGetTimerTaskMemory( &pxTimerTaskTCBBuffer, &pxTimerTaskStackBuffer, &ulTimerTaskStackSize );\r\n                    xTimerTaskHandle = xTaskCreateStaticAffinitySet( prvTimerTask,\r\n                                                                     configTIMER_SERVICE_TASK_NAME,\r\n                                                                     ulTimerTaskStackSize,\r\n                                                                     NULL,\r\n                                                                     ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT,\r\n                                                                     pxTimerTaskStackBuffer,\r\n                                                                     pxTimerTaskTCBBuffer,\r\n                                                                     configTIMER_SERVICE_TASK_CORE_AFFINITY );\r\n\r\n                    if( xTimerTaskHandle != NULL )\r\n                    {\r\n                        xReturn = pdPASS;\r\n                    }\r\n                }\r\n                #else /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */\r\n                {\r\n                    xReturn = xTaskCreateAffinitySet( prvTimerTask,\r\n                                                      configTIMER_SERVICE_TASK_NAME,\r\n                                                      configTIMER_TASK_STACK_DEPTH,\r\n                                                      NULL,\r\n                                                      ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT,\r\n                                                      configTIMER_SERVICE_TASK_CORE_AFFINITY,\r\n                                                      &xTimerTaskHandle );\r\n                }\r\n                #endif /* configSUPPORT_STATIC_ALLOCATION */\r\n            }\r\n            #else /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) */\r\n            {\r\n                #if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n                {\r\n                    StaticTask_t * pxTimerTaskTCBBuffer = NULL;\r\n                    StackType_t * pxTimerTaskStackBuffer = NULL;\r\n                    uint32_t ulTimerTaskStackSize;\r\n\r\n                    vApplicationGetTimerTaskMemory( &pxTimerTaskTCBBuffer, &pxTimerTaskStackBuffer, &ulTimerTaskStackSize );\r\n                    xTimerTaskHandle = xTaskCreateStatic( prvTimerTask,\r\n                                                          configTIMER_SERVICE_TASK_NAME,\r\n                                                          ulTimerTaskStackSize,\r\n                                                          NULL,\r\n                                                          ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT,\r\n                                                          pxTimerTaskStackBuffer,\r\n                                                          pxTimerTaskTCBBuffer );\r\n\r\n                    if( xTimerTaskHandle != NULL )\r\n                    {\r\n                        xReturn = pdPASS;\r\n                    }\r\n                }\r\n                #else /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */\r\n                {\r\n                    xReturn = xTaskCreate( prvTimerTask,\r\n                                           configTIMER_SERVICE_TASK_NAME,\r\n                                           configTIMER_TASK_STACK_DEPTH,\r\n                                           NULL,\r\n                                           ( ( UBaseType_t ) configTIMER_TASK_PRIORITY ) | portPRIVILEGE_BIT,\r\n                                           &xTimerTaskHandle );\r\n                }\r\n                #endif /* configSUPPORT_STATIC_ALLOCATION */\r\n            }\r\n            #endif /* #if ( ( configNUMBER_OF_CORES > 1 ) && ( configUSE_CORE_AFFINITY == 1 ) ) */\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        configASSERT( xReturn );\r\n\r\n        traceRETURN_xTimerCreateTimerTask( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r\n\r\n        TimerHandle_t xTimerCreate( const char * const pcTimerName,\r\n                                    const TickType_t xTimerPeriodInTicks,\r\n                                    const BaseType_t xAutoReload,\r\n                                    void * const pvTimerID,\r\n                                    TimerCallbackFunction_t pxCallbackFunction )\r\n        {\r\n            Timer_t * pxNewTimer;\r\n\r\n            traceENTER_xTimerCreate( pcTimerName, xTimerPeriodInTicks, xAutoReload, pvTimerID, pxCallbackFunction );\r\n\r\n            /* MISRA Ref 11.5.1 [Malloc memory assignment] */\r\n            /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n            /* coverity[misra_c_2012_rule_11_5_violation] */\r\n            pxNewTimer = ( Timer_t * ) pvPortMalloc( sizeof( Timer_t ) );\r\n\r\n            if( pxNewTimer != NULL )\r\n            {\r\n                /* Status is thus far zero as the timer is not created statically\r\n                 * and has not been started.  The auto-reload bit may get set in\r\n                 * prvInitialiseNewTimer. */\r\n                pxNewTimer->ucStatus = 0x00;\r\n                prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, xAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer );\r\n            }\r\n\r\n            traceRETURN_xTimerCreate( pxNewTimer );\r\n\r\n            return pxNewTimer;\r\n        }\r\n\r\n    #endif /* configSUPPORT_DYNAMIC_ALLOCATION */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n\r\n        TimerHandle_t xTimerCreateStatic( const char * const pcTimerName,\r\n                                          const TickType_t xTimerPeriodInTicks,\r\n                                          const BaseType_t xAutoReload,\r\n                                          void * const pvTimerID,\r\n                                          TimerCallbackFunction_t pxCallbackFunction,\r\n                                          StaticTimer_t * pxTimerBuffer )\r\n        {\r\n            Timer_t * pxNewTimer;\r\n\r\n            traceENTER_xTimerCreateStatic( pcTimerName, xTimerPeriodInTicks, xAutoReload, pvTimerID, pxCallbackFunction, pxTimerBuffer );\r\n\r\n            #if ( configASSERT_DEFINED == 1 )\r\n            {\r\n                /* Sanity check that the size of the structure used to declare a\r\n                 * variable of type StaticTimer_t equals the size of the real timer\r\n                 * structure. */\r\n                volatile size_t xSize = sizeof( StaticTimer_t );\r\n                configASSERT( xSize == sizeof( Timer_t ) );\r\n                ( void ) xSize; /* Prevent unused variable warning when configASSERT() is not defined. */\r\n            }\r\n            #endif /* configASSERT_DEFINED */\r\n\r\n            /* A pointer to a StaticTimer_t structure MUST be provided, use it. */\r\n            configASSERT( pxTimerBuffer );\r\n            /* MISRA Ref 11.3.1 [Misaligned access] */\r\n            /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */\r\n            /* coverity[misra_c_2012_rule_11_3_violation] */\r\n            pxNewTimer = ( Timer_t * ) pxTimerBuffer;\r\n\r\n            if( pxNewTimer != NULL )\r\n            {\r\n                /* Timers can be created statically or dynamically so note this\r\n                 * timer was created statically in case it is later deleted.  The\r\n                 * auto-reload bit may get set in prvInitialiseNewTimer(). */\r\n                pxNewTimer->ucStatus = ( uint8_t ) tmrSTATUS_IS_STATICALLY_ALLOCATED;\r\n\r\n                prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, xAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer );\r\n            }\r\n\r\n            traceRETURN_xTimerCreateStatic( pxNewTimer );\r\n\r\n            return pxNewTimer;\r\n        }\r\n\r\n    #endif /* configSUPPORT_STATIC_ALLOCATION */\r\n/*-----------------------------------------------------------*/\r\n\r\n    static void prvInitialiseNewTimer( const char * const pcTimerName,\r\n                                       const TickType_t xTimerPeriodInTicks,\r\n                                       const BaseType_t xAutoReload,\r\n                                       void * const pvTimerID,\r\n                                       TimerCallbackFunction_t pxCallbackFunction,\r\n                                       Timer_t * pxNewTimer )\r\n    {\r\n        /* 0 is not a valid value for xTimerPeriodInTicks. */\r\n        configASSERT( ( xTimerPeriodInTicks > 0 ) );\r\n\r\n        /* Ensure the infrastructure used by the timer service task has been\r\n         * created/initialised. */\r\n        prvCheckForValidListAndQueue();\r\n\r\n        /* Initialise the timer structure members using the function\r\n         * parameters. */\r\n        pxNewTimer->pcTimerName = pcTimerName;\r\n        pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks;\r\n        pxNewTimer->pvTimerID = pvTimerID;\r\n        pxNewTimer->pxCallbackFunction = pxCallbackFunction;\r\n        vListInitialiseItem( &( pxNewTimer->xTimerListItem ) );\r\n\r\n        if( xAutoReload != pdFALSE )\r\n        {\r\n            pxNewTimer->ucStatus |= ( uint8_t ) tmrSTATUS_IS_AUTORELOAD;\r\n        }\r\n\r\n        traceTIMER_CREATE( pxNewTimer );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    BaseType_t xTimerGenericCommandFromTask( TimerHandle_t xTimer,\r\n                                             const BaseType_t xCommandID,\r\n                                             const TickType_t xOptionalValue,\r\n                                             BaseType_t * const pxHigherPriorityTaskWoken,\r\n                                             const TickType_t xTicksToWait )\r\n    {\r\n        BaseType_t xReturn = pdFAIL;\r\n        DaemonTaskMessage_t xMessage;\r\n\r\n        ( void ) pxHigherPriorityTaskWoken;\r\n\r\n        traceENTER_xTimerGenericCommandFromTask( xTimer, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait );\r\n\r\n        configASSERT( xTimer );\r\n\r\n        /* Send a message to the timer service task to perform a particular action\r\n         * on a particular timer definition. */\r\n        if( xTimerQueue != NULL )\r\n        {\r\n            /* Send a command to the timer service task to start the xTimer timer. */\r\n            xMessage.xMessageID = xCommandID;\r\n            xMessage.u.xTimerParameters.xMessageValue = xOptionalValue;\r\n            xMessage.u.xTimerParameters.pxTimer = xTimer;\r\n\r\n            configASSERT( xCommandID < tmrFIRST_FROM_ISR_COMMAND );\r\n\r\n            if( xCommandID < tmrFIRST_FROM_ISR_COMMAND )\r\n            {\r\n                if( xTaskGetSchedulerState() == taskSCHEDULER_RUNNING )\r\n                {\r\n                    xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait );\r\n                }\r\n                else\r\n                {\r\n                    xReturn = xQueueSendToBack( xTimerQueue, &xMessage, tmrNO_DELAY );\r\n                }\r\n            }\r\n\r\n            traceTIMER_COMMAND_SEND( xTimer, xCommandID, xOptionalValue, xReturn );\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_xTimerGenericCommandFromTask( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    BaseType_t xTimerGenericCommandFromISR( TimerHandle_t xTimer,\r\n                                            const BaseType_t xCommandID,\r\n                                            const TickType_t xOptionalValue,\r\n                                            BaseType_t * const pxHigherPriorityTaskWoken,\r\n                                            const TickType_t xTicksToWait )\r\n    {\r\n        BaseType_t xReturn = pdFAIL;\r\n        DaemonTaskMessage_t xMessage;\r\n\r\n        ( void ) xTicksToWait;\r\n\r\n        traceENTER_xTimerGenericCommandFromISR( xTimer, xCommandID, xOptionalValue, pxHigherPriorityTaskWoken, xTicksToWait );\r\n\r\n        configASSERT( xTimer );\r\n\r\n        /* Send a message to the timer service task to perform a particular action\r\n         * on a particular timer definition. */\r\n        if( xTimerQueue != NULL )\r\n        {\r\n            /* Send a command to the timer service task to start the xTimer timer. */\r\n            xMessage.xMessageID = xCommandID;\r\n            xMessage.u.xTimerParameters.xMessageValue = xOptionalValue;\r\n            xMessage.u.xTimerParameters.pxTimer = xTimer;\r\n\r\n            configASSERT( xCommandID >= tmrFIRST_FROM_ISR_COMMAND );\r\n\r\n            if( xCommandID >= tmrFIRST_FROM_ISR_COMMAND )\r\n            {\r\n                xReturn = xQueueSendToBackFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken );\r\n            }\r\n\r\n            traceTIMER_COMMAND_SEND( xTimer, xCommandID, xOptionalValue, xReturn );\r\n        }\r\n        else\r\n        {\r\n            mtCOVERAGE_TEST_MARKER();\r\n        }\r\n\r\n        traceRETURN_xTimerGenericCommandFromISR( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    TaskHandle_t xTimerGetTimerDaemonTaskHandle( void )\r\n    {\r\n        traceENTER_xTimerGetTimerDaemonTaskHandle();\r\n\r\n        /* If xTimerGetTimerDaemonTaskHandle() is called before the scheduler has been\r\n         * started, then xTimerTaskHandle will be NULL. */\r\n        configASSERT( ( xTimerTaskHandle != NULL ) );\r\n\r\n        traceRETURN_xTimerGetTimerDaemonTaskHandle( xTimerTaskHandle );\r\n\r\n        return xTimerTaskHandle;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    TickType_t xTimerGetPeriod( TimerHandle_t xTimer )\r\n    {\r\n        Timer_t * pxTimer = xTimer;\r\n\r\n        traceENTER_xTimerGetPeriod( xTimer );\r\n\r\n        configASSERT( xTimer );\r\n\r\n        traceRETURN_xTimerGetPeriod( pxTimer->xTimerPeriodInTicks );\r\n\r\n        return pxTimer->xTimerPeriodInTicks;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    void vTimerSetReloadMode( TimerHandle_t xTimer,\r\n                              const BaseType_t xAutoReload )\r\n    {\r\n        Timer_t * pxTimer = xTimer;\r\n\r\n        traceENTER_vTimerSetReloadMode( xTimer, xAutoReload );\r\n\r\n        configASSERT( xTimer );\r\n        taskENTER_CRITICAL();\r\n        {\r\n            if( xAutoReload != pdFALSE )\r\n            {\r\n                pxTimer->ucStatus |= ( uint8_t ) tmrSTATUS_IS_AUTORELOAD;\r\n            }\r\n            else\r\n            {\r\n                pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_AUTORELOAD );\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_vTimerSetReloadMode();\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    BaseType_t xTimerGetReloadMode( TimerHandle_t xTimer )\r\n    {\r\n        Timer_t * pxTimer = xTimer;\r\n        BaseType_t xReturn;\r\n\r\n        traceENTER_xTimerGetReloadMode( xTimer );\r\n\r\n        configASSERT( xTimer );\r\n        taskENTER_CRITICAL();\r\n        {\r\n            if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) == 0U )\r\n            {\r\n                /* Not an auto-reload timer. */\r\n                xReturn = pdFALSE;\r\n            }\r\n            else\r\n            {\r\n                /* Is an auto-reload timer. */\r\n                xReturn = pdTRUE;\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_xTimerGetReloadMode( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n\r\n    UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer )\r\n    {\r\n        UBaseType_t uxReturn;\r\n\r\n        traceENTER_uxTimerGetReloadMode( xTimer );\r\n\r\n        uxReturn = ( UBaseType_t ) xTimerGetReloadMode( xTimer );\r\n\r\n        traceRETURN_uxTimerGetReloadMode( uxReturn );\r\n\r\n        return uxReturn;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer )\r\n    {\r\n        Timer_t * pxTimer = xTimer;\r\n        TickType_t xReturn;\r\n\r\n        traceENTER_xTimerGetExpiryTime( xTimer );\r\n\r\n        configASSERT( xTimer );\r\n        xReturn = listGET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ) );\r\n\r\n        traceRETURN_xTimerGetExpiryTime( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n        BaseType_t xTimerGetStaticBuffer( TimerHandle_t xTimer,\r\n                                          StaticTimer_t ** ppxTimerBuffer )\r\n        {\r\n            BaseType_t xReturn;\r\n            Timer_t * pxTimer = xTimer;\r\n\r\n            traceENTER_xTimerGetStaticBuffer( xTimer, ppxTimerBuffer );\r\n\r\n            configASSERT( ppxTimerBuffer != NULL );\r\n\r\n            if( ( pxTimer->ucStatus & tmrSTATUS_IS_STATICALLY_ALLOCATED ) != 0U )\r\n            {\r\n                /* MISRA Ref 11.3.1 [Misaligned access] */\r\n                /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-113 */\r\n                /* coverity[misra_c_2012_rule_11_3_violation] */\r\n                *ppxTimerBuffer = ( StaticTimer_t * ) pxTimer;\r\n                xReturn = pdTRUE;\r\n            }\r\n            else\r\n            {\r\n                xReturn = pdFALSE;\r\n            }\r\n\r\n            traceRETURN_xTimerGetStaticBuffer( xReturn );\r\n\r\n            return xReturn;\r\n        }\r\n    #endif /* configSUPPORT_STATIC_ALLOCATION */\r\n/*-----------------------------------------------------------*/\r\n\r\n    const char * pcTimerGetName( TimerHandle_t xTimer )\r\n    {\r\n        Timer_t * pxTimer = xTimer;\r\n\r\n        traceENTER_pcTimerGetName( xTimer );\r\n\r\n        configASSERT( xTimer );\r\n\r\n        traceRETURN_pcTimerGetName( pxTimer->pcTimerName );\r\n\r\n        return pxTimer->pcTimerName;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    static void prvReloadTimer( Timer_t * const pxTimer,\r\n                                TickType_t xExpiredTime,\r\n                                const TickType_t xTimeNow )\r\n    {\r\n        /* Insert the timer into the appropriate list for the next expiry time.\r\n         * If the next expiry time has already passed, advance the expiry time,\r\n         * call the callback function, and try again. */\r\n        while( prvInsertTimerInActiveList( pxTimer, ( xExpiredTime + pxTimer->xTimerPeriodInTicks ), xTimeNow, xExpiredTime ) != pdFALSE )\r\n        {\r\n            /* Advance the expiry time. */\r\n            xExpiredTime += pxTimer->xTimerPeriodInTicks;\r\n\r\n            /* Call the timer callback. */\r\n            traceTIMER_EXPIRED( pxTimer );\r\n            pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer );\r\n        }\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    static void prvProcessExpiredTimer( const TickType_t xNextExpireTime,\r\n                                        const TickType_t xTimeNow )\r\n    {\r\n        /* MISRA Ref 11.5.3 [Void pointer assignment] */\r\n        /* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */\r\n        /* coverity[misra_c_2012_rule_11_5_violation] */\r\n        Timer_t * const pxTimer = ( Timer_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxCurrentTimerList );\r\n\r\n        /* Remove the timer from the list of active timers.  A check has already\r\n         * been performed to ensure the list is not empty. */\r\n\r\n        ( void ) uxListRemove( &( pxTimer->xTimerListItem ) );\r\n\r\n        /* If the timer is an auto-reload timer then calculate the next\r\n         * expiry time and re-insert the timer in the list of active timers. */\r\n        if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0U )\r\n        {\r\n            prvReloadTimer( pxTimer, xNextExpireTime, xTimeNow );\r\n        }\r\n        else\r\n        {\r\n            pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE );\r\n        }\r\n\r\n        /* Call the timer callback. */\r\n        traceTIMER_EXPIRED( pxTimer );\r\n        pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer );\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    static portTASK_FUNCTION( prvTimerTask, pvParameters )\r\n    {\r\n        TickType_t xNextExpireTime;\r\n        BaseType_t xListWasEmpty;\r\n\r\n        /* Just to avoid compiler warnings. */\r\n        ( void ) pvParameters;\r\n\r\n        #if ( configUSE_DAEMON_TASK_STARTUP_HOOK == 1 )\r\n        {\r\n            /* Allow the application writer to execute some code in the context of\r\n             * this task at the point the task starts executing.  This is useful if the\r\n             * application includes initialisation code that would benefit from\r\n             * executing after the scheduler has been started. */\r\n            vApplicationDaemonTaskStartupHook();\r\n        }\r\n        #endif /* configUSE_DAEMON_TASK_STARTUP_HOOK */\r\n\r\n        for( ; configCONTROL_INFINITE_LOOP(); )\r\n        {\r\n            /* Query the timers list to see if it contains any timers, and if so,\r\n             * obtain the time at which the next timer will expire. */\r\n            xNextExpireTime = prvGetNextExpireTime( &xListWasEmpty );\r\n\r\n            /* If a timer has expired, process it.  Otherwise, block this task\r\n             * until either a timer does expire, or a command is received. */\r\n            prvProcessTimerOrBlockTask( xNextExpireTime, xListWasEmpty );\r\n\r\n            /* Empty the command queue. */\r\n            prvProcessReceivedCommands();\r\n        }\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    static void prvProcessTimerOrBlockTask( const TickType_t xNextExpireTime,\r\n                                            BaseType_t xListWasEmpty )\r\n    {\r\n        TickType_t xTimeNow;\r\n        BaseType_t xTimerListsWereSwitched;\r\n\r\n        vTaskSuspendAll();\r\n        {\r\n            /* Obtain the time now to make an assessment as to whether the timer\r\n             * has expired or not.  If obtaining the time causes the lists to switch\r\n             * then don't process this timer as any timers that remained in the list\r\n             * when the lists were switched will have been processed within the\r\n             * prvSampleTimeNow() function. */\r\n            xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched );\r\n\r\n            if( xTimerListsWereSwitched == pdFALSE )\r\n            {\r\n                /* The tick count has not overflowed, has the timer expired? */\r\n                if( ( xListWasEmpty == pdFALSE ) && ( xNextExpireTime <= xTimeNow ) )\r\n                {\r\n                    ( void ) xTaskResumeAll();\r\n                    prvProcessExpiredTimer( xNextExpireTime, xTimeNow );\r\n                }\r\n                else\r\n                {\r\n                    /* The tick count has not overflowed, and the next expire\r\n                     * time has not been reached yet.  This task should therefore\r\n                     * block to wait for the next expire time or a command to be\r\n                     * received - whichever comes first.  The following line cannot\r\n                     * be reached unless xNextExpireTime > xTimeNow, except in the\r\n                     * case when the current timer list is empty. */\r\n                    if( xListWasEmpty != pdFALSE )\r\n                    {\r\n                        /* The current timer list is empty - is the overflow list\r\n                         * also empty? */\r\n                        xListWasEmpty = listLIST_IS_EMPTY( pxOverflowTimerList );\r\n                    }\r\n\r\n                    vQueueWaitForMessageRestricted( xTimerQueue, ( xNextExpireTime - xTimeNow ), xListWasEmpty );\r\n\r\n                    if( xTaskResumeAll() == pdFALSE )\r\n                    {\r\n                        /* Yield to wait for either a command to arrive, or the\r\n                         * block time to expire.  If a command arrived between the\r\n                         * critical section being exited and this yield then the yield\r\n                         * will not cause the task to block. */\r\n                        taskYIELD_WITHIN_API();\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n            }\r\n            else\r\n            {\r\n                ( void ) xTaskResumeAll();\r\n            }\r\n        }\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    static TickType_t prvGetNextExpireTime( BaseType_t * const pxListWasEmpty )\r\n    {\r\n        TickType_t xNextExpireTime;\r\n\r\n        /* Timers are listed in expiry time order, with the head of the list\r\n         * referencing the task that will expire first.  Obtain the time at which\r\n         * the timer with the nearest expiry time will expire.  If there are no\r\n         * active timers then just set the next expire time to 0.  That will cause\r\n         * this task to unblock when the tick count overflows, at which point the\r\n         * timer lists will be switched and the next expiry time can be\r\n         * re-assessed.  */\r\n        *pxListWasEmpty = listLIST_IS_EMPTY( pxCurrentTimerList );\r\n\r\n        if( *pxListWasEmpty == pdFALSE )\r\n        {\r\n            xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList );\r\n        }\r\n        else\r\n        {\r\n            /* Ensure the task unblocks when the tick count rolls over. */\r\n            xNextExpireTime = ( TickType_t ) 0U;\r\n        }\r\n\r\n        return xNextExpireTime;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    static TickType_t prvSampleTimeNow( BaseType_t * const pxTimerListsWereSwitched )\r\n    {\r\n        TickType_t xTimeNow;\r\n        PRIVILEGED_DATA static TickType_t xLastTime = ( TickType_t ) 0U;\r\n\r\n        xTimeNow = xTaskGetTickCount();\r\n\r\n        if( xTimeNow < xLastTime )\r\n        {\r\n            prvSwitchTimerLists();\r\n            *pxTimerListsWereSwitched = pdTRUE;\r\n        }\r\n        else\r\n        {\r\n            *pxTimerListsWereSwitched = pdFALSE;\r\n        }\r\n\r\n        xLastTime = xTimeNow;\r\n\r\n        return xTimeNow;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    static BaseType_t prvInsertTimerInActiveList( Timer_t * const pxTimer,\r\n                                                  const TickType_t xNextExpiryTime,\r\n                                                  const TickType_t xTimeNow,\r\n                                                  const TickType_t xCommandTime )\r\n    {\r\n        BaseType_t xProcessTimerNow = pdFALSE;\r\n\r\n        listSET_LIST_ITEM_VALUE( &( pxTimer->xTimerListItem ), xNextExpiryTime );\r\n        listSET_LIST_ITEM_OWNER( &( pxTimer->xTimerListItem ), pxTimer );\r\n\r\n        if( xNextExpiryTime <= xTimeNow )\r\n        {\r\n            /* Has the expiry time elapsed between the command to start/reset a\r\n             * timer was issued, and the time the command was processed? */\r\n            if( ( ( TickType_t ) ( xTimeNow - xCommandTime ) ) >= pxTimer->xTimerPeriodInTicks )\r\n            {\r\n                /* The time between a command being issued and the command being\r\n                 * processed actually exceeds the timers period.  */\r\n                xProcessTimerNow = pdTRUE;\r\n            }\r\n            else\r\n            {\r\n                vListInsert( pxOverflowTimerList, &( pxTimer->xTimerListItem ) );\r\n            }\r\n        }\r\n        else\r\n        {\r\n            if( ( xTimeNow < xCommandTime ) && ( xNextExpiryTime >= xCommandTime ) )\r\n            {\r\n                /* If, since the command was issued, the tick count has overflowed\r\n                 * but the expiry time has not, then the timer must have already passed\r\n                 * its expiry time and should be processed immediately. */\r\n                xProcessTimerNow = pdTRUE;\r\n            }\r\n            else\r\n            {\r\n                vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) );\r\n            }\r\n        }\r\n\r\n        return xProcessTimerNow;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    static void prvProcessReceivedCommands( void )\r\n    {\r\n        DaemonTaskMessage_t xMessage = { 0 };\r\n        Timer_t * pxTimer;\r\n        BaseType_t xTimerListsWereSwitched;\r\n        TickType_t xTimeNow;\r\n\r\n        while( xQueueReceive( xTimerQueue, &xMessage, tmrNO_DELAY ) != pdFAIL )\r\n        {\r\n            #if ( INCLUDE_xTimerPendFunctionCall == 1 )\r\n            {\r\n                /* Negative commands are pended function calls rather than timer\r\n                 * commands. */\r\n                if( xMessage.xMessageID < ( BaseType_t ) 0 )\r\n                {\r\n                    const CallbackParameters_t * const pxCallback = &( xMessage.u.xCallbackParameters );\r\n\r\n                    /* The timer uses the xCallbackParameters member to request a\r\n                     * callback be executed.  Check the callback is not NULL. */\r\n                    configASSERT( pxCallback );\r\n\r\n                    /* Call the function. */\r\n                    pxCallback->pxCallbackFunction( pxCallback->pvParameter1, pxCallback->ulParameter2 );\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n            }\r\n            #endif /* INCLUDE_xTimerPendFunctionCall */\r\n\r\n            /* Commands that are positive are timer commands rather than pended\r\n             * function calls. */\r\n            if( xMessage.xMessageID >= ( BaseType_t ) 0 )\r\n            {\r\n                /* The messages uses the xTimerParameters member to work on a\r\n                 * software timer. */\r\n                pxTimer = xMessage.u.xTimerParameters.pxTimer;\r\n\r\n                if( listIS_CONTAINED_WITHIN( NULL, &( pxTimer->xTimerListItem ) ) == pdFALSE )\r\n                {\r\n                    /* The timer is in a list, remove it. */\r\n                    ( void ) uxListRemove( &( pxTimer->xTimerListItem ) );\r\n                }\r\n                else\r\n                {\r\n                    mtCOVERAGE_TEST_MARKER();\r\n                }\r\n\r\n                traceTIMER_COMMAND_RECEIVED( pxTimer, xMessage.xMessageID, xMessage.u.xTimerParameters.xMessageValue );\r\n\r\n                /* In this case the xTimerListsWereSwitched parameter is not used, but\r\n                 *  it must be present in the function call.  prvSampleTimeNow() must be\r\n                 *  called after the message is received from xTimerQueue so there is no\r\n                 *  possibility of a higher priority task adding a message to the message\r\n                 *  queue with a time that is ahead of the timer daemon task (because it\r\n                 *  pre-empted the timer daemon task after the xTimeNow value was set). */\r\n                xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched );\r\n\r\n                switch( xMessage.xMessageID )\r\n                {\r\n                    case tmrCOMMAND_START:\r\n                    case tmrCOMMAND_START_FROM_ISR:\r\n                    case tmrCOMMAND_RESET:\r\n                    case tmrCOMMAND_RESET_FROM_ISR:\r\n                        /* Start or restart a timer. */\r\n                        pxTimer->ucStatus |= ( uint8_t ) tmrSTATUS_IS_ACTIVE;\r\n\r\n                        if( prvInsertTimerInActiveList( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.u.xTimerParameters.xMessageValue ) != pdFALSE )\r\n                        {\r\n                            /* The timer expired before it was added to the active\r\n                             * timer list.  Process it now. */\r\n                            if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0U )\r\n                            {\r\n                                prvReloadTimer( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow );\r\n                            }\r\n                            else\r\n                            {\r\n                                pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE );\r\n                            }\r\n\r\n                            /* Call the timer callback. */\r\n                            traceTIMER_EXPIRED( pxTimer );\r\n                            pxTimer->pxCallbackFunction( ( TimerHandle_t ) pxTimer );\r\n                        }\r\n                        else\r\n                        {\r\n                            mtCOVERAGE_TEST_MARKER();\r\n                        }\r\n\r\n                        break;\r\n\r\n                    case tmrCOMMAND_STOP:\r\n                    case tmrCOMMAND_STOP_FROM_ISR:\r\n                        /* The timer has already been removed from the active list. */\r\n                        pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE );\r\n                        break;\r\n\r\n                    case tmrCOMMAND_CHANGE_PERIOD:\r\n                    case tmrCOMMAND_CHANGE_PERIOD_FROM_ISR:\r\n                        pxTimer->ucStatus |= ( uint8_t ) tmrSTATUS_IS_ACTIVE;\r\n                        pxTimer->xTimerPeriodInTicks = xMessage.u.xTimerParameters.xMessageValue;\r\n                        configASSERT( ( pxTimer->xTimerPeriodInTicks > 0 ) );\r\n\r\n                        /* The new period does not really have a reference, and can\r\n                         * be longer or shorter than the old one.  The command time is\r\n                         * therefore set to the current time, and as the period cannot\r\n                         * be zero the next expiry time can only be in the future,\r\n                         * meaning (unlike for the xTimerStart() case above) there is\r\n                         * no fail case that needs to be handled here. */\r\n                        ( void ) prvInsertTimerInActiveList( pxTimer, ( xTimeNow + pxTimer->xTimerPeriodInTicks ), xTimeNow, xTimeNow );\r\n                        break;\r\n\r\n                    case tmrCOMMAND_DELETE:\r\n                        #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )\r\n                        {\r\n                            /* The timer has already been removed from the active list,\r\n                             * just free up the memory if the memory was dynamically\r\n                             * allocated. */\r\n                            if( ( pxTimer->ucStatus & tmrSTATUS_IS_STATICALLY_ALLOCATED ) == ( uint8_t ) 0 )\r\n                            {\r\n                                vPortFree( pxTimer );\r\n                            }\r\n                            else\r\n                            {\r\n                                pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE );\r\n                            }\r\n                        }\r\n                        #else /* if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) */\r\n                        {\r\n                            /* If dynamic allocation is not enabled, the memory\r\n                             * could not have been dynamically allocated. So there is\r\n                             * no need to free the memory - just mark the timer as\r\n                             * \"not active\". */\r\n                            pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE );\r\n                        }\r\n                        #endif /* configSUPPORT_DYNAMIC_ALLOCATION */\r\n                        break;\r\n\r\n                    default:\r\n                        /* Don't expect to get here. */\r\n                        break;\r\n                }\r\n            }\r\n        }\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    static void prvSwitchTimerLists( void )\r\n    {\r\n        TickType_t xNextExpireTime;\r\n        List_t * pxTemp;\r\n\r\n        /* The tick count has overflowed.  The timer lists must be switched.\r\n         * If there are any timers still referenced from the current timer list\r\n         * then they must have expired and should be processed before the lists\r\n         * are switched. */\r\n        while( listLIST_IS_EMPTY( pxCurrentTimerList ) == pdFALSE )\r\n        {\r\n            xNextExpireTime = listGET_ITEM_VALUE_OF_HEAD_ENTRY( pxCurrentTimerList );\r\n\r\n            /* Process the expired timer.  For auto-reload timers, be careful to\r\n             * process only expirations that occur on the current list.  Further\r\n             * expirations must wait until after the lists are switched. */\r\n            prvProcessExpiredTimer( xNextExpireTime, tmrMAX_TIME_BEFORE_OVERFLOW );\r\n        }\r\n\r\n        pxTemp = pxCurrentTimerList;\r\n        pxCurrentTimerList = pxOverflowTimerList;\r\n        pxOverflowTimerList = pxTemp;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    static void prvCheckForValidListAndQueue( void )\r\n    {\r\n        /* Check that the list from which active timers are referenced, and the\r\n         * queue used to communicate with the timer service, have been\r\n         * initialised. */\r\n        taskENTER_CRITICAL();\r\n        {\r\n            if( xTimerQueue == NULL )\r\n            {\r\n                vListInitialise( &xActiveTimerList1 );\r\n                vListInitialise( &xActiveTimerList2 );\r\n                pxCurrentTimerList = &xActiveTimerList1;\r\n                pxOverflowTimerList = &xActiveTimerList2;\r\n\r\n                #if ( configSUPPORT_STATIC_ALLOCATION == 1 )\r\n                {\r\n                    /* The timer queue is allocated statically in case\r\n                     * configSUPPORT_DYNAMIC_ALLOCATION is 0. */\r\n                    PRIVILEGED_DATA static StaticQueue_t xStaticTimerQueue;\r\n                    PRIVILEGED_DATA static uint8_t ucStaticTimerQueueStorage[ ( size_t ) configTIMER_QUEUE_LENGTH * sizeof( DaemonTaskMessage_t ) ];\r\n\r\n                    xTimerQueue = xQueueCreateStatic( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, ( UBaseType_t ) sizeof( DaemonTaskMessage_t ), &( ucStaticTimerQueueStorage[ 0 ] ), &xStaticTimerQueue );\r\n                }\r\n                #else\r\n                {\r\n                    xTimerQueue = xQueueCreate( ( UBaseType_t ) configTIMER_QUEUE_LENGTH, ( UBaseType_t ) sizeof( DaemonTaskMessage_t ) );\r\n                }\r\n                #endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */\r\n\r\n                #if ( configQUEUE_REGISTRY_SIZE > 0 )\r\n                {\r\n                    if( xTimerQueue != NULL )\r\n                    {\r\n                        vQueueAddToRegistry( xTimerQueue, \"TmrQ\" );\r\n                    }\r\n                    else\r\n                    {\r\n                        mtCOVERAGE_TEST_MARKER();\r\n                    }\r\n                }\r\n                #endif /* configQUEUE_REGISTRY_SIZE */\r\n            }\r\n            else\r\n            {\r\n                mtCOVERAGE_TEST_MARKER();\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL();\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer )\r\n    {\r\n        BaseType_t xReturn;\r\n        Timer_t * pxTimer = xTimer;\r\n\r\n        traceENTER_xTimerIsTimerActive( xTimer );\r\n\r\n        configASSERT( xTimer );\r\n\r\n        /* Is the timer in the list of active timers? */\r\n        taskENTER_CRITICAL();\r\n        {\r\n            if( ( pxTimer->ucStatus & tmrSTATUS_IS_ACTIVE ) == 0U )\r\n            {\r\n                xReturn = pdFALSE;\r\n            }\r\n            else\r\n            {\r\n                xReturn = pdTRUE;\r\n            }\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_xTimerIsTimerActive( xReturn );\r\n\r\n        return xReturn;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    void * pvTimerGetTimerID( const TimerHandle_t xTimer )\r\n    {\r\n        Timer_t * const pxTimer = xTimer;\r\n        void * pvReturn;\r\n\r\n        traceENTER_pvTimerGetTimerID( xTimer );\r\n\r\n        configASSERT( xTimer );\r\n\r\n        taskENTER_CRITICAL();\r\n        {\r\n            pvReturn = pxTimer->pvTimerID;\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_pvTimerGetTimerID( pvReturn );\r\n\r\n        return pvReturn;\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    void vTimerSetTimerID( TimerHandle_t xTimer,\r\n                           void * pvNewID )\r\n    {\r\n        Timer_t * const pxTimer = xTimer;\r\n\r\n        traceENTER_vTimerSetTimerID( xTimer, pvNewID );\r\n\r\n        configASSERT( xTimer );\r\n\r\n        taskENTER_CRITICAL();\r\n        {\r\n            pxTimer->pvTimerID = pvNewID;\r\n        }\r\n        taskEXIT_CRITICAL();\r\n\r\n        traceRETURN_vTimerSetTimerID();\r\n    }\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( INCLUDE_xTimerPendFunctionCall == 1 )\r\n\r\n        BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend,\r\n                                                  void * pvParameter1,\r\n                                                  uint32_t ulParameter2,\r\n                                                  BaseType_t * pxHigherPriorityTaskWoken )\r\n        {\r\n            DaemonTaskMessage_t xMessage;\r\n            BaseType_t xReturn;\r\n\r\n            traceENTER_xTimerPendFunctionCallFromISR( xFunctionToPend, pvParameter1, ulParameter2, pxHigherPriorityTaskWoken );\r\n\r\n            /* Complete the message with the function parameters and post it to the\r\n             * daemon task. */\r\n            xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR;\r\n            xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend;\r\n            xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1;\r\n            xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2;\r\n\r\n            xReturn = xQueueSendFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken );\r\n\r\n            tracePEND_FUNC_CALL_FROM_ISR( xFunctionToPend, pvParameter1, ulParameter2, xReturn );\r\n            traceRETURN_xTimerPendFunctionCallFromISR( xReturn );\r\n\r\n            return xReturn;\r\n        }\r\n\r\n    #endif /* INCLUDE_xTimerPendFunctionCall */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( INCLUDE_xTimerPendFunctionCall == 1 )\r\n\r\n        BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend,\r\n                                           void * pvParameter1,\r\n                                           uint32_t ulParameter2,\r\n                                           TickType_t xTicksToWait )\r\n        {\r\n            DaemonTaskMessage_t xMessage;\r\n            BaseType_t xReturn;\r\n\r\n            traceENTER_xTimerPendFunctionCall( xFunctionToPend, pvParameter1, ulParameter2, xTicksToWait );\r\n\r\n            /* This function can only be called after a timer has been created or\r\n             * after the scheduler has been started because, until then, the timer\r\n             * queue does not exist. */\r\n            configASSERT( xTimerQueue );\r\n\r\n            /* Complete the message with the function parameters and post it to the\r\n             * daemon task. */\r\n            xMessage.xMessageID = tmrCOMMAND_EXECUTE_CALLBACK;\r\n            xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend;\r\n            xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1;\r\n            xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2;\r\n\r\n            xReturn = xQueueSendToBack( xTimerQueue, &xMessage, xTicksToWait );\r\n\r\n            tracePEND_FUNC_CALL( xFunctionToPend, pvParameter1, ulParameter2, xReturn );\r\n            traceRETURN_xTimerPendFunctionCall( xReturn );\r\n\r\n            return xReturn;\r\n        }\r\n\r\n    #endif /* INCLUDE_xTimerPendFunctionCall */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TRACE_FACILITY == 1 )\r\n\r\n        UBaseType_t uxTimerGetTimerNumber( TimerHandle_t xTimer )\r\n        {\r\n            traceENTER_uxTimerGetTimerNumber( xTimer );\r\n\r\n            traceRETURN_uxTimerGetTimerNumber( ( ( Timer_t * ) xTimer )->uxTimerNumber );\r\n\r\n            return ( ( Timer_t * ) xTimer )->uxTimerNumber;\r\n        }\r\n\r\n    #endif /* configUSE_TRACE_FACILITY */\r\n/*-----------------------------------------------------------*/\r\n\r\n    #if ( configUSE_TRACE_FACILITY == 1 )\r\n\r\n        void vTimerSetTimerNumber( TimerHandle_t xTimer,\r\n                                   UBaseType_t uxTimerNumber )\r\n        {\r\n            traceENTER_vTimerSetTimerNumber( xTimer, uxTimerNumber );\r\n\r\n            ( ( Timer_t * ) xTimer )->uxTimerNumber = uxTimerNumber;\r\n\r\n            traceRETURN_vTimerSetTimerNumber();\r\n        }\r\n\r\n    #endif /* configUSE_TRACE_FACILITY */\r\n/*-----------------------------------------------------------*/\r\n\r\n/* This entire source file will be skipped if the application is not configured\r\n * to include software timer functionality.  If you want to include software timer\r\n * functionality then ensure configUSE_TIMERS is set to 1 in FreeRTOSConfig.h. */\r\n#endif /* configUSE_TIMERS == 1 */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/linkscripts/main_data.ldt",
    "content": "       *mflash_drv.o(.text .text* .rodata .rodata*)\r\n       *fsl_flexspi.o(.text .text* .rodata .rodata*)\r\n       *(.data*)\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/linkscripts/main_rodata.ldt",
    "content": "       *(.rodata)\r\n       *(EXCLUDE_FILE(*mflash_drv.o *fsl_flexspi.o).rodata.*)\r\n       *(.constdata .constdata.*)\r\n       . = ALIGN(${text_align});\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/linkscripts/main_text.ldt",
    "content": "        *(EXCLUDE_FILE(*mflash_drv.o *fsl_flexspi.o) .text*)"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/linkscripts/noinit_noload_section.ldt",
    "content": "    /* DEFAULT NOINIT SECTION */\r\n    .noinit (NOLOAD): ALIGN(4)\r\n    {\r\n        _noinit = .;\r\n        PROVIDE(__start_noinit_RAM = .) ;\r\n        PROVIDE(__start_noinit_SRAM = .) ;\r\n        *(.noinit*)\r\n        . = ALIGN(4) ;\r\n        _end_noinit = .;\r\n        PROVIDE(__end_noinit_RAM = .) ;\r\n        PROVIDE(__end_noinit_SRAM = .) ;\r\n    } > SRAM AT> SRAM\r\n\r\n    .smu_cpu13_mbox (NOLOAD) :\r\n    {\r\n        . = ALIGN(4);\r\n        *(.smu_cpu13_mbox)\r\n        KEEP (*(.smu_cpu13_mbox))\r\n        . = ALIGN(4);\r\n    } > MBOX1 AT> MBOX1\r\n\r\n    .smu_cpu31_txq (NOLOAD) :\r\n    {\r\n        . = ALIGN(4);\r\n        *(.smu_cpu31_txq)\r\n        KEEP (*(.smu_cpu31_txq))\r\n        . = ALIGN(4);\r\n    } > TXQ1 AT> TXQ1\r\n\r\n    .smu_cpu23_mbox (NOLOAD) :\r\n    {\r\n        . = ALIGN(4);\r\n        *(.smu_cpu23_mbox)\r\n        KEEP (*(.smu_cpu23_mbox))\r\n        . = ALIGN(4);\r\n    } > MBOX2 AT> MBOX2\r\n\r\n    .smu_cpu32_txq (NOLOAD) :\r\n    {\r\n        . = ALIGN(4);\r\n        *(.smu_cpu32_txq)\r\n        KEEP (*(.smu_cpu32_txq))\r\n        . = ALIGN(4);\r\n    } > TXQ32 AT> TXQ32\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/source/FreeRTOSConfig.h",
    "content": "/*\r\n * FreeRTOS Kernel V10.4.3\r\n * Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r\n *\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\r\n * this software and associated documentation files (the \"Software\"), to deal in\r\n * the Software without restriction, including without limitation the rights to\r\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r\n * the Software, and to permit persons to whom the Software is furnished to do so,\r\n * subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r\n * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r\n * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r\n * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r\n * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n * https://www.FreeRTOS.org\r\n * https://github.com/FreeRTOS\r\n *\r\n */\r\n\r\n#ifndef FREERTOS_CONFIG_H\r\n#define FREERTOS_CONFIG_H\r\n\r\n/*-----------------------------------------------------------\r\n * Application specific definitions.\r\n *\r\n * These definitions should be adjusted for your particular hardware and\r\n * application requirements.\r\n *\r\n * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\r\n * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.\r\n *\r\n * See http://www.freertos.org/a00110.html.\r\n *----------------------------------------------------------*/\r\n\r\n#define configUSE_PREEMPTION                    1\r\n#define configUSE_TICKLESS_IDLE                 0\r\n#define configCPU_CLOCK_HZ                      (SystemCoreClock)\r\n#define configTICK_RATE_HZ                      ((TickType_t)1000)\r\n#define configMAX_PRIORITIES                    5\r\n#define configMINIMAL_STACK_SIZE                ((unsigned short)128)\r\n#define configMAX_TASK_NAME_LEN                 20\r\n#define configUSE_16_BIT_TICKS                  0\r\n#define configIDLE_SHOULD_YIELD                 1\r\n#define configUSE_TASK_NOTIFICATIONS            1\r\n#define configUSE_MUTEXES                       1\r\n#define configUSE_RECURSIVE_MUTEXES             1\r\n#define configUSE_COUNTING_SEMAPHORES           1\r\n#define configUSE_ALTERNATIVE_API               0 /* Deprecated! */\r\n#define configQUEUE_REGISTRY_SIZE               8\r\n#define configUSE_QUEUE_SETS                    0\r\n#define configUSE_TIME_SLICING                  0\r\n#define configUSE_NEWLIB_REENTRANT              0\r\n#define configENABLE_BACKWARD_COMPATIBILITY     1\r\n#define configNUM_THREAD_LOCAL_STORAGE_POINTERS 5\r\n\r\n/* Used memory allocation (heap_x.c) */\r\n#define configFRTOS_MEMORY_SCHEME               3\r\n/* Tasks.c additions (e.g. Thread Aware Debug capability) */\r\n#define configINCLUDE_FREERTOS_TASK_C_ADDITIONS_H 1\r\n\r\n/* Memory allocation related definitions. */\r\n#define configSUPPORT_STATIC_ALLOCATION         0\r\n#define configSUPPORT_DYNAMIC_ALLOCATION        1\r\n//#define configTOTAL_HEAP_SIZE                   ((size_t)(35 * 1024))\r\n#define configAPPLICATION_ALLOCATED_HEAP        0\r\n\r\n/* Hook function related definitions. */\r\n#define configUSE_IDLE_HOOK                     0\r\n#define configUSE_TICK_HOOK                     0\r\n#define configCHECK_FOR_STACK_OVERFLOW          0\r\n#define configUSE_MALLOC_FAILED_HOOK            0\r\n#define configUSE_DAEMON_TASK_STARTUP_HOOK      0\r\n\r\n/* Run time and task stats gathering related definitions. */\r\n#define configGENERATE_RUN_TIME_STATS 0\r\n#define configUSE_TRACE_FACILITY 1\r\n#define configUSE_STATS_FORMATTING_FUNCTIONS 1\r\n\r\n/* Task aware debugging. */\r\n#define configRECORD_STACK_HIGH_ADDRESS         1\r\n\r\n/* Co-routine related definitions. */\r\n#define configUSE_CO_ROUTINES                   0\r\n#define configMAX_CO_ROUTINE_PRIORITIES         2\r\n\r\n/* Software timer related definitions. */\r\n#define configUSE_TIMERS                        1\r\n#define configTIMER_TASK_PRIORITY               (configMAX_PRIORITIES - 1)\r\n#define configTIMER_QUEUE_LENGTH                10\r\n#define configTIMER_TASK_STACK_DEPTH            (configMINIMAL_STACK_SIZE * 2)\r\n\r\n/* Define to trap errors during development. */\r\n#define configASSERT(x) if(( x) == 0) {taskDISABLE_INTERRUPTS(); for (;;);}\r\n\r\n/* Optional functions - most linkers will remove unused functions anyway. */\r\n#define INCLUDE_vTaskPrioritySet                1\r\n#define INCLUDE_uxTaskPriorityGet               1\r\n#define INCLUDE_vTaskDelete                     1\r\n#define INCLUDE_vTaskSuspend                    1\r\n#define INCLUDE_vTaskDelayUntil                 1\r\n#define INCLUDE_vTaskDelay                      1\r\n#define INCLUDE_xTaskGetSchedulerState          1\r\n#define INCLUDE_xTaskGetCurrentTaskHandle       1\r\n#define INCLUDE_uxTaskGetStackHighWaterMark     0\r\n#define INCLUDE_xTaskGetIdleTaskHandle          0\r\n#define INCLUDE_eTaskGetState                   0\r\n#define INCLUDE_xTimerPendFunctionCall          1\r\n#define INCLUDE_xTaskAbortDelay                 0\r\n#define INCLUDE_xTaskGetHandle                  0\r\n#define INCLUDE_xTaskResumeFromISR              1\r\n\r\n\r\n\r\n#if defined(__ICCARM__)||defined(__CC_ARM)||defined(__GNUC__)\r\n#include \"fsl_device_registers.h\"\r\n#endif\r\n\r\n\r\n#ifndef configENABLE_FPU\r\n  #define configENABLE_FPU                        1\r\n#endif\r\n#ifndef configENABLE_MPU\r\n  #define configENABLE_MPU                        0\r\n#endif\r\n#ifndef configENABLE_TRUSTZONE\r\n  #define configENABLE_TRUSTZONE                  0\r\n#endif\r\n#ifndef configRUN_FREERTOS_SECURE_ONLY\r\n  #define configRUN_FREERTOS_SECURE_ONLY          1\r\n#endif\r\n\r\n/* Redefine: Mutex is needed for SRTM communication */\r\n#undef configUSE_MUTEXES\r\n#define configUSE_MUTEXES                       1\r\n\r\n#ifndef configTOTAL_HEAP_SIZE\r\n#define configTOTAL_HEAP_SIZE ((size_t)(128 * 1024))\r\n#endif\r\n\r\n/* Interrupt nesting behaviour configuration. Cortex-M specific. */\r\n#ifdef __NVIC_PRIO_BITS\r\n/* __BVIC_PRIO_BITS will be specified when CMSIS is being used. */\r\n#define configPRIO_BITS __NVIC_PRIO_BITS\r\n#else\r\n#define configPRIO_BITS 3 /* 7 priority levels */\r\n#endif\r\n\r\n#define configSTACK_DEPTH_TYPE uint32_t\r\n\r\n/* The lowest interrupt priority that can be used in a call to a \"set priority\"\r\nfunction. */\r\n#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY ((1U << (configPRIO_BITS)) - 1)\r\n\r\n/* The highest interrupt priority that can be used by any interrupt service\r\nroutine that makes calls to interrupt safe FreeRTOS API functions.  DO NOT CALL\r\nINTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER\r\nPRIORITY THAN THIS! (higher priorities are lower numeric values. */\r\n#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 2\r\n\r\n/* Interrupt priorities used by the kernel port layer itself.  These are generic\r\nto all Cortex-M ports, and do not rely on any particular library functions. */\r\n#define configKERNEL_INTERRUPT_PRIORITY (configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS))\r\n/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!\r\nSee http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */\r\n#define configMAX_SYSCALL_INTERRUPT_PRIORITY (configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS))\r\n\r\n/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS\r\nstandard names. */\r\n#define vPortSVCHandler SVC_Handler\r\n#define vPortPendSVHandler PendSV_Handler\r\n#define vPortSysTickHandler SysTick_Handler\r\n\r\n#endif /* FREERTOS_CONFIG_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/source/app_config.h",
    "content": "/*\r\n *  Copyright 2021 NXP\r\n *  All rights reserved.\r\n *\r\n *  SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#define RW610\r\n#define FRDMRW610\r\n#define WIFI_BT_USE_IMU_INTERFACE\r\n\r\n#if CONFIG_MONOLITHIC_WIFI\r\n#define CONFIG_SOC_SERIES_RW6XX_REVISION_A2 1\r\n#endif\r\n\r\n\r\n#define WIFI_BT_TX_PWR_LIMITS \"wlan_txpwrlimit_cfg_WW_rw610.h\"\r\n#define CONFIG_BT_SNOOP 1"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/source/main.c",
    "content": "\r\n#include <stdio.h>\r\n\r\n#include \"mongoose.h\"\r\n\r\n#include \"pin_mux.h\"\r\n#include \"clock_config.h\"\r\n#include \"board.h\"\r\n#include \"timers.h\"\r\n\r\n#include \"fsl_debug_console.h\"\r\n\r\n#include \"fsl_power.h\"\r\n\r\n\r\n\r\n//#define WIFI_SSID \"YOUR_WIFI_NETWORK_NAME\"  // SET THIS!\r\n//#define WIFI_PASS \"YOUR_WIFI_PASSWORD\"      // SET THIS!\r\n#define WIFI_SSID \"LinternaVerde\"\r\n#define WIFI_PASS \"StanleyJordan69\"\r\n\r\n\r\n// mif user states\r\nenum {AP, SCANNING, STOPPING_AP, CONNECTING, READY};\r\nstatic unsigned int state;\r\n\r\n\r\nstatic void mif_fn(struct mg_tcpip_if *ifp, int ev, void *ev_data) {\r\n  // TODO(): should we include this inside ifp ? add an fn_data ?\r\n  if (ev == MG_TCPIP_EV_ST_CHG) {\r\n    MG_INFO((\"State change: %u\", *(uint8_t *) ev_data));\r\n  }\r\n  switch(state) {\r\n    case AP: // we are in AP mode, wait for a user connection to trigger a scan or a connection to a network\r\n      if (ev == MG_TCPIP_EV_ST_CHG && *(uint8_t *) ev_data == MG_TCPIP_STATE_READY) {\r\n        MG_INFO((\"Access Point READY !\"));\r\n\r\n        // simulate user request to scan for networks\r\n        bool res = mg_wifi_scan();\r\n        MG_INFO((\"Starting scan: %s\", res ? \"OK\":\"FAIL\"));\r\n        if (res) state = SCANNING;\r\n      }\r\n      break;\r\n    case SCANNING:\r\n      if (ev == MG_TCPIP_EV_WIFI_SCAN_RESULT) {\r\n        struct mg_wifi_scan_bss_data *bss = (struct mg_wifi_scan_bss_data *) ev_data;\r\n        MG_INFO((\"BSS: %.*s (%u) (%M) %d dBm %u\", bss->SSID.len, bss->SSID.buf, bss->channel, mg_print_mac, bss->BSSID, (int) bss->RSSI, bss->security));\r\n      } else if (ev == MG_TCPIP_EV_WIFI_SCAN_END) {\r\n        // struct mg_tcpip_driver_nxp_wifi_data *d = (struct mg_tcpip_driver_nxp_wifi_data *) ifp->driver_data;\r\n        MG_INFO((\"Wi-Fi scan finished\"));\r\n\r\n        // simulate user selection of a network (1/2: stop AP)\r\n        bool res = mg_wifi_ap_stop();\r\n        MG_INFO((\"Manually stopping AP: %s\", res ? \"OK\":\"FAIL\"));\r\n        if (res) state = STOPPING_AP;\r\n        // else we have a hw/fw problem\r\n      }\r\n      break;\r\n    case STOPPING_AP:\r\n      if (ev == MG_TCPIP_EV_ST_CHG && *(uint8_t *) ev_data == MG_TCPIP_STATE_DOWN) {\r\n        struct mg_wifi_data *wifi = &((struct mg_tcpip_driver_nxp_wifi_data *) ifp->driver_data)->wifi;\r\n        wifi->apmode = false;\r\n\r\n        // simulate user selection of a network (2/2: actual connect)\r\n        bool res = mg_wifi_connect(wifi);\r\n        MG_INFO((\"Manually connecting: %s\", res ? \"OK\":\"FAIL\"));\r\n        if (res) {\r\n          state = CONNECTING;\r\n        } // else manually start AP as below\r\n      }\r\n      break;\r\n    case CONNECTING:\r\n      if (ev == MG_TCPIP_EV_ST_CHG && *(uint8_t *) ev_data == MG_TCPIP_STATE_READY) {\r\n        MG_INFO((\"READY!\"));\r\n        state = READY;\r\n\r\n        // simulate user code disconnection and go back to AP mode (1/2: disconnect)\r\n        bool res = mg_wifi_disconnect();\r\n        MG_INFO((\"Manually disconnecting: %s\", res ? \"OK\":\"FAIL\"));\r\n      } else if (ev == MG_TCPIP_EV_WIFI_CONNECT_ERR) {\r\n        MG_ERROR((\"Wi-Fi connect failed\"));\r\n        // manually start AP as below\r\n      }\r\n      break;\r\n    case READY:\r\n      // go back to AP mode after a disconnection (simulation 2/2), you could retry\r\n      if (ev == MG_TCPIP_EV_ST_CHG && *(uint8_t *) ev_data == MG_TCPIP_STATE_DOWN) {\r\n        struct mg_wifi_data *wifi = &((struct mg_tcpip_driver_nxp_wifi_data *) ifp->driver_data)->wifi;\r\n        bool res = mg_wifi_ap_start(wifi);\r\n        MG_INFO((\"Disconnected\"));\r\n        MG_INFO((\"Manually starting AP: %s\", res ? \"OK\":\"FAIL\"));\r\n        if (res) {\r\n          state = AP;\r\n          wifi->apmode = true;\r\n        }\r\n      }\r\n      break;\r\n  }\r\n}\r\n\r\n\r\nstatic void mongoose(void *arg) {\r\n  struct mg_mgr mgr;        // Initialise Mongoose event manager\r\n  mg_mgr_init(&mgr);        // and attach it to the interface\r\n  mg_log_set(MG_LL_DEBUG);\r\n\r\n  extern const struct mg_tcpip_driver netif_driver;\r\n\r\n  // Initialise WiFi creds\r\n  struct mg_tcpip_driver_nxp_wifi_data driver_data = {\r\n    .wifi.ssid = WIFI_SSID,\r\n    .wifi.pass = WIFI_PASS,\r\n    .wifi.apssid = \"mongoose\",\r\n    .wifi.appass = \"mongoose\",\r\n    .wifi.apip = MG_IPV4(192, 168, 169, 1),\r\n    .wifi.apmask = MG_IPV4(255, 255, 255, 0),\r\n    .wifi.security = 0,\r\n    .wifi.apsecurity = 0,\r\n    .wifi.apchannel = 10,\r\n    .wifi.apmode = true\r\n  };\r\n\r\n  state = driver_data.wifi.apmode ? AP : CONNECTING;\r\n\r\n  // Initialise Mongoose network stack\r\n  // Either set use_dhcp or enter a static config.\r\n  // For static configuration, specify IP/mask/GW in network byte order\r\n  struct mg_tcpip_if mif = {\r\n      .ip = 0,\r\n      .driver = (struct mg_tcpip_driver *)&mg_tcpip_driver_nxp_wifi,\r\n      .driver_data = (struct mg_tcpip_driver_nxp_wifi_data*)&driver_data,\r\n      .fn = mif_fn,\r\n//      .recv_queue.size = 8192\r\n  };\r\n\r\n  mg_tcpip_init(&mgr, &mif);\r\n\r\n    MG_INFO((\"Starting event loop\"));\r\n\r\n    for (;;) {\r\n      mg_mgr_poll(&mgr, 10);\r\n    }\r\n}\r\n\r\n\r\nint main(void)\r\n{\r\n    BOARD_InitBootPins();\r\n    BOARD_BootClockLPR();\r\n    CLOCK_EnableClock(kCLOCK_Otp);\r\n    CLOCK_EnableClock(kCLOCK_Els);\r\n    CLOCK_EnableClock(kCLOCK_ElsApb);\r\n    RESET_PeripheralReset(kOTP_RST_SHIFT_RSTn);\r\n    RESET_PeripheralReset(kELS_APB_RST_SHIFT_RSTn);\r\n    BOARD_InitDebugConsole();\r\n    RESET_PeripheralReset(kGDMA_RST_SHIFT_RSTn);\r\n    POWER_ConfigCauInSleep(false);\r\n    BOARD_InitSleepPinConfig();\r\n\r\n    xTaskCreate(mongoose, \"mongoose\", 2048, NULL, configMAX_PRIORITIES - 4, NULL);\r\n\r\n    vTaskStartScheduler();  // This blocks\r\n\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/source/mongoose_config.h",
    "content": "#pragma once\r\n\r\n// See https://mongoose.ws/documentation/#build-options\r\n#define MG_ARCH MG_ARCH_FREERTOS\r\n\r\n#define MG_ENABLE_TCPIP 1\r\n#define MG_ENABLE_DRIVER_NXP_WIFI 1\r\n#define MG_ENABLE_PACKED_FS 1\r\n#define MG_ENABLE_TCPIP_DRIVER_INIT 0\r\n\r\n\r\n#define HTTP_URL \"http://0.0.0.0:80\"\r\n#define HTTPS_URL \"https://0.0.0.0:443\"\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/source/semihost_hardfault.c",
    "content": "// ****************************************************************************\r\n// semihost_hardfault.c\r\n//                - Provides hard fault handler to allow semihosting code not\r\n//                  to hang application when debugger not connected.\r\n//\r\n// ****************************************************************************\r\n// Copyright 2017-2025 NXP\r\n// All rights reserved.\r\n//\r\n// SPDX-License-Identifier: BSD-3-Clause\r\n// ****************************************************************************\r\n//\r\n//                       ===== DESCRIPTION =====\r\n//\r\n// One of the issues with applications that make use of semihosting operations\r\n// (such as printf calls) is that the code will not execute correctly when the\r\n// debugger is not connected. Generally this will show up with the application\r\n// appearing to just hang. This may include the application running from reset\r\n// or powering up the board (with the application already in FLASH), and also\r\n// as the application failing to continue to execute after a debug session is\r\n// terminated.\r\n//\r\n// The problem here is that the \"bottom layer\" of the semihosted variants of\r\n// the C library, semihosting is implemented by a \"BKPT 0xAB\" instruction.\r\n// When the debug tools are not connected, this instruction triggers a hard\r\n// fault - and the default hard fault handler within an application will\r\n// typically just contains an infinite loop - causing the application to\r\n// appear to have hang when no debugger is connected.\r\n//\r\n// The below code provides an example hard fault handler which instead looks\r\n// to see what the instruction that caused the hard fault was - and if it\r\n// was a \"BKPT 0xAB\", then it instead returns back to the user application.\r\n//\r\n// In most cases this will allow applications containing semihosting\r\n// operations to execute (to some degree) when the debugger is not connected.\r\n//\r\n// == NOTE ==\r\n//\r\n// Correct execution of the application containing semihosted operations\r\n// which are vectored onto this hard fault handler cannot be guaranteed. This\r\n// is because the handler may not return data or return codes that the higher\r\n// level C library code or application code expects. This hard fault handler\r\n// is meant as a development aid, and it is not recommended to leave\r\n// semihosted code in a production build of your application!\r\n//\r\n// ****************************************************************************\r\n\r\n// Allow handler to be removed by setting a define (via command line)\r\n#if !defined (__SEMIHOST_HARDFAULT_DISABLE)\r\n\r\n__attribute__((naked))\r\nvoid HardFault_Handler(void){\r\n    __asm(  \".syntax unified\\n\"\r\n        // Check which stack is in use\r\n            \"MOVS   R0, #4           \\n\"\r\n            \"MOV    R1, LR           \\n\"\r\n            \"TST    R0, R1           \\n\"\r\n            \"BEQ    _MSP             \\n\"\r\n            \"MRS    R0, PSP          \\n\"\r\n            \"B  _process             \\n\"\r\n            \"_MSP:                   \\n\"\r\n            \"MRS    R0, MSP          \\n\"\r\n        // Load the instruction that triggered hard fault\r\n        \"_process:                   \\n\"\r\n            \"LDR    R1,[R0,#24]      \\n\"\r\n            \"LDRH   R2,[r1]          \\n\"\r\n        // Semihosting instruction is \"BKPT 0xAB\" (0xBEAB)\r\n            \"LDR    R3,=0xBEAB       \\n\"\r\n            \"CMP    R2,R3            \\n\"\r\n            \"BEQ    _semihost_return \\n\"\r\n        // Wasn't semihosting instruction so enter infinite loop\r\n            \"B .                     \\n\"\r\n        // Was semihosting instruction, so adjust location to\r\n        // return to by 1 instruction (2 bytes), then exit function\r\n            \"_semihost_return:       \\n\"\r\n            \"ADDS   R1,#2            \\n\"\r\n            \"STR    R1,[R0,#24]      \\n\"\r\n        // Set a return value from semihosting operation.\r\n        // 0 is slightly arbitrary, but appears to allow most\r\n        // C Library IO functions sitting on top of semihosting to\r\n        // continue to operate to some degree\r\n        // Return a positive value (32) for SYS_OPEN only\r\n            \"LDR    R1,[ R0,#0 ]     \\n\"  // R0 is at location 0 on stack\r\n            \"CMP    R1, #1           \\n\"  // 0x01=SYS_OPEN\r\n            \"BEQ    _non_zero_ret    \\n\"\r\n            \"MOVS   R1,#0            \\n\"\r\n            \"B      _sys_ret         \\n\"\r\n            \"_non_zero_ret:          \\n\"\r\n            \"MOVS   R1,#32           \\n\"\r\n            \"_sys_ret:               \\n\"\r\n            \"STR    R1,[ R0,#0 ]     \\n\" // R0 is at location 0 on stack\r\n        // Return from hard fault handler to application\r\n            \"BX     LR               \\n\"\r\n        \".syntax divided\\n\") ;\r\n}\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/source/wifi_config.h",
    "content": "/*\r\n *  Copyright 2020-2024 NXP\r\n *  All rights reserved.\r\n *\r\n *  SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef _WIFI_CONFIG_H_\r\n#define _WIFI_CONFIG_H_\r\n\r\n#include \"app_config.h\"\r\n#ifndef RW610\r\n#include \"wifi_bt_module_config.h\"\r\n#endif\r\n\r\n#define CONFIG_IPV6 0\r\n#define CONFIG_MAX_IPV6_ADDRESSES 3\r\n\r\n/* WLCMGR debug */\r\n#define CONFIG_WLCMGR_DEBUG 0\r\n\r\n/*\r\n * Wifi extra debug options\r\n */\r\n#define CONFIG_WIFI_EXTRA_DEBUG 0\r\n#define CONFIG_WIFI_EVENTS_DEBUG 0\r\n#define CONFIG_WIFI_CMD_RESP_DEBUG 0\r\n#define CONFIG_WIFI_PKT_DEBUG 0\r\n#define CONFIG_WIFI_SCAN_DEBUG 0\r\n#define CONFIG_WIFI_IO_INFO_DUMP 0\r\n#define CONFIG_WIFI_IO_DEBUG 0\r\n#define CONFIG_WIFI_IO_DUMP 0\r\n#define CONFIG_WIFI_MEM_DEBUG 0\r\n#define CONFIG_WIFI_AMPDU_DEBUG 0\r\n#define CONFIG_WIFI_TIMER_DEBUG 0\r\n#define CONFIG_WIFI_SDIO_DEBUG 0\r\n#define CONFIG_WIFI_FW_DEBUG 0\r\n#define CONFIG_WIFI_UAP_DEBUG 0\r\n#define CONFIG_WPS_DEBUG 0\r\n#define CONFIG_FW_VDLL_DEBUG 0\r\n#define CONFIG_DHCP_SERVER_DEBUG 0\r\n#define CONFIG_WIFI_SDIO_DEBUG 0\r\n#define CONFIG_FWDNLD_IO_DEBUG 0\r\n\r\n/*\r\n * Heap debug options\r\n */\r\n#define CONFIG_HEAP_DEBUG 0\r\n#define CONFIG_HEAP_STAT 0\r\n\r\n#endif /* _WIFI_CONFIG_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/startup/startup_rw612.c",
    "content": "//*****************************************************************************\r\n// RW612 startup code for use with MCUXpresso IDE\r\n//\r\n// Version : 120324\r\n//*****************************************************************************\r\n//\r\n// Copyright 2016-2024 NXP\r\n// All rights reserved.\r\n//\r\n// SPDX-License-Identifier: BSD-3-Clause\r\n//*****************************************************************************\r\n\r\n#if defined (DEBUG)\r\n#pragma GCC push_options\r\n#pragma GCC optimize (\"Og\")\r\n#endif // (DEBUG)\r\n\r\n#if defined (__cplusplus)\r\n#ifdef __REDLIB__\r\n#error Redlib does not support C++\r\n#else\r\n//*****************************************************************************\r\n//\r\n// The entry point for the C++ library startup\r\n//\r\n//*****************************************************************************\r\nextern \"C\" {\r\n    extern void __libc_init_array(void);\r\n}\r\n#endif\r\n#endif\r\n\r\n#define WEAK __attribute__ ((weak))\r\n#define WEAK_AV __attribute__ ((weak, section(\".after_vectors\")))\r\n#define ALIAS(f) __attribute__ ((weak, alias (#f)))\r\n\r\n//*****************************************************************************\r\n#if defined (__cplusplus)\r\nextern \"C\" {\r\n#endif\r\n\r\n//*****************************************************************************\r\n// Variable to store CRP value in. Will be placed automatically\r\n// by the linker when \"Enable Code Read Protect\" selected.\r\n// See crp.h header for more information\r\n//*****************************************************************************\r\n//*****************************************************************************\r\n// Declaration of external SystemInit function\r\n//*****************************************************************************\r\n#if defined (__USE_CMSIS)\r\nextern void SystemInit(void);\r\n#endif // (__USE_CMSIS)\r\n\r\n//*****************************************************************************\r\n// Forward declaration of the core exception handlers.\r\n// When the application defines a handler (with the same name), this will\r\n// automatically take precedence over these weak definitions.\r\n// If your application is a C++ one, then any interrupt handlers defined\r\n// in C++ files within in your main application will need to have C linkage\r\n// rather than C++ linkage. To do this, make sure that you are using extern \"C\"\r\n// { .... } around the interrupt handler within your main application code.\r\n//*****************************************************************************\r\n     void ResetISR(void);\r\nWEAK void NMI_Handler(void);\r\nWEAK void HardFault_Handler(void);\r\nWEAK void MemManage_Handler(void);\r\nWEAK void BusFault_Handler(void);\r\nWEAK void UsageFault_Handler(void);\r\nWEAK void SecureFault_Handler(void);\r\nWEAK void SVC_Handler(void);\r\nWEAK void DebugMon_Handler(void);\r\nWEAK void PendSV_Handler(void);\r\nWEAK void SysTick_Handler(void);\r\nWEAK void IntDefaultHandler(void);\r\n\r\n//*****************************************************************************\r\n// Forward declaration of the application IRQ handlers. When the application\r\n// defines a handler (with the same name), this will automatically take\r\n// precedence over weak definitions below\r\n//*****************************************************************************\r\nWEAK void WDT0_IRQHandler(void);\r\nWEAK void DMA0_IRQHandler(void);\r\nWEAK void GPIO_INTA_IRQHandler(void);\r\nWEAK void GPIO_INTB_IRQHandler(void);\r\nWEAK void PIN_INT0_IRQHandler(void);\r\nWEAK void PIN_INT1_IRQHandler(void);\r\nWEAK void PIN_INT2_IRQHandler(void);\r\nWEAK void PIN_INT3_IRQHandler(void);\r\nWEAK void UTICK_IRQHandler(void);\r\nWEAK void MRT_IRQHandler(void);\r\nWEAK void CTIMER0_IRQHandler(void);\r\nWEAK void CTIMER1_IRQHandler(void);\r\nWEAK void SCT0_IRQHandler(void);\r\nWEAK void CTIMER3_IRQHandler(void);\r\nWEAK void FLEXCOMM0_IRQHandler(void);\r\nWEAK void FLEXCOMM1_IRQHandler(void);\r\nWEAK void FLEXCOMM2_IRQHandler(void);\r\nWEAK void FLEXCOMM3_IRQHandler(void);\r\nWEAK void Reserved34_IRQHandler(void);\r\nWEAK void Reserved35_IRQHandler(void);\r\nWEAK void FLEXCOMM14_IRQHandler(void);\r\nWEAK void Reserved37_IRQHandler(void);\r\nWEAK void Reserved38_IRQHandler(void);\r\nWEAK void GFMRT_IRQHandler(void);\r\nWEAK void Reserved40_IRQHandler(void);\r\nWEAK void DMIC_IRQHandler(void);\r\nWEAK void WKDEEPSLEEP_IRQHandler(void);\r\nWEAK void HYPERVISOR_IRQHandler(void);\r\nWEAK void SECUREVIOLATION_IRQHandler(void);\r\nWEAK void HWVAD_IRQHandler(void);\r\nWEAK void Reserved46_IRQHandler(void);\r\nWEAK void Reserved47_IRQHandler(void);\r\nWEAK void RTC_IRQHandler(void);\r\nWEAK void Reserved49_IRQHandler(void);\r\nWEAK void Reserved50_IRQHandler(void);\r\nWEAK void PIN_INT4_IRQHandler(void);\r\nWEAK void PIN_INT5_IRQHandler(void);\r\nWEAK void PIN_INT6_IRQHandler(void);\r\nWEAK void PIN_INT7_IRQHandler(void);\r\nWEAK void CTIMER2_IRQHandler(void);\r\nWEAK void CTIMER4_IRQHandler(void);\r\nWEAK void OS_EVENT_TIMER_IRQHandler(void);\r\nWEAK void FLEXSPI_IRQHandler(void);\r\nWEAK void Reserved59_IRQHandler(void);\r\nWEAK void Reserved60_IRQHandler(void);\r\nWEAK void Reserved61_IRQHandler(void);\r\nWEAK void SDIO_IRQHandler(void);\r\nWEAK void SGPIO_INTA_IRQHandler(void);\r\nWEAK void SGPIO_INTB_IRQHandler(void);\r\nWEAK void Reserved65_IRQHandler(void);\r\nWEAK void USB_IRQHandler(void);\r\nWEAK void Reserved67_IRQHandler(void);\r\nWEAK void Reserved68_IRQHandler(void);\r\nWEAK void Reserved69_IRQHandler(void);\r\nWEAK void DMA1_IRQHandler(void);\r\nWEAK void PUF_IRQHandler(void);\r\nWEAK void POWERQUAD_IRQHandler(void);\r\nWEAK void Reserved73_IRQHandler(void);\r\nWEAK void Reserved74_IRQHandler(void);\r\nWEAK void Reserved75_IRQHandler(void);\r\nWEAK void Reserved76_IRQHandler(void);\r\nWEAK void LCD_IRQHandler(void);\r\nWEAK void CAPTIMER_IRQHandler(void);\r\nWEAK void Reserved79_IRQHandler(void);\r\nWEAK void W2MWKUP_DONE0_IRQHandler(void);\r\nWEAK void W2MWKUP_DONE1_IRQHandler(void);\r\nWEAK void W2MWKUP_DONE2_IRQHandler(void);\r\nWEAK void W2MWKUP_DONE3_IRQHandler(void);\r\nWEAK void W2MWKUP_DONE4_IRQHandler(void);\r\nWEAK void W2MWKUP_DONE5_IRQHandler(void);\r\nWEAK void W2MWKUP_DONE6_IRQHandler(void);\r\nWEAK void W2MWKUP_DONE7_IRQHandler(void);\r\nWEAK void W2MWKUP0_IRQHandler(void);\r\nWEAK void W2MWKUP1_IRQHandler(void);\r\nWEAK void WL_MCI_INT0_IRQHandler(void);\r\nWEAK void WL_MCI_INT1_IRQHandler(void);\r\nWEAK void WL_MCI_INT2_IRQHandler(void);\r\nWEAK void WL_MCI_INT3_IRQHandler(void);\r\nWEAK void WL_MCI_INT4_IRQHandler(void);\r\nWEAK void WL_MCI_INT5_IRQHandler(void);\r\nWEAK void WL_MCI_INT6_IRQHandler(void);\r\nWEAK void WL_MCI_INT7_IRQHandler(void);\r\nWEAK void B2MWKUP_DONE0_IRQHandler(void);\r\nWEAK void B2MWKUP_DONE1_IRQHandler(void);\r\nWEAK void B2MWKUP_DONE2_IRQHandler(void);\r\nWEAK void B2MWKUP_DONE3_IRQHandler(void);\r\nWEAK void B2MWKUP_DONE4_IRQHandler(void);\r\nWEAK void B2MWKUP_DONE5_IRQHandler(void);\r\nWEAK void B2MWKUP_DONE6_IRQHandler(void);\r\nWEAK void B2MWKUP_DONE7_IRQHandler(void);\r\nWEAK void B2MWKUP0_IRQHandler(void);\r\nWEAK void B2MWKUP1_IRQHandler(void);\r\nWEAK void BLE_MCI_INT0_IRQHandler(void);\r\nWEAK void BLE_MCI_INT1_IRQHandler(void);\r\nWEAK void BLE_MCI_INT2_IRQHandler(void);\r\nWEAK void BLE_MCI_INT3_IRQHandler(void);\r\nWEAK void BLE_MCI_INT4_IRQHandler(void);\r\nWEAK void BLE_MCI_INT5_IRQHandler(void);\r\nWEAK void BLE_MCI_INT6_IRQHandler(void);\r\nWEAK void BLE_MCI_INT7_IRQHandler(void);\r\nWEAK void PIN0_INT_IRQHandler(void);\r\nWEAK void PIN1_INT_IRQHandler(void);\r\nWEAK void ELS_IRQHandler(void);\r\nWEAK void ELS_GDET_IRQHandler(void);\r\nWEAK void ELS_GDET_UM_IRQHandler(void);\r\nWEAK void PKC_INT_IRQHandler(void);\r\nWEAK void PKC_ERR_IRQHandler(void);\r\nWEAK void CDOG_INT_IRQHandler(void);\r\nWEAK void GAU_DAC_IRQHandler(void);\r\nWEAK void GAU_ACOMP_WKUP_IRQHandler(void);\r\nWEAK void GAU_ACOMP_IRQHandler(void);\r\nWEAK void GAU_ADC1_IRQHandler(void);\r\nWEAK void GAU_ADC0_IRQHandler(void);\r\nWEAK void USIM_IRQHandler(void);\r\nWEAK void OTP_IRQHandler(void);\r\nWEAK void ENET_IRQHandler(void);\r\nWEAK void ENET_TIMER_IRQHandler(void);\r\nWEAK void PMIP_IRQHandler(void);\r\nWEAK void PMIP_CHANGE_IRQHandler(void);\r\nWEAK void ITRC_IRQHandler(void);\r\nWEAK void Reserved136_IRQHandler(void);\r\nWEAK void Reserved137_IRQHandler(void);\r\nWEAK void Reserved138_IRQHandler(void);\r\nWEAK void TRNG_IRQHandler(void);\r\nWEAK void ACC_C_INT_IRQHandler(void);\r\nWEAK void ACC_S_INT_IRQHandler(void);\r\nWEAK void WACC_IRQHandler(void);\r\nWEAK void BACC_IRQHandler(void);\r\nWEAK void GDMA_IRQHandler(void);\r\n\r\n//*****************************************************************************\r\n// Forward declaration of the driver IRQ handlers. These are aliased\r\n// to the IntDefaultHandler, which is a 'forever' loop. When the driver\r\n// defines a handler (with the same name), this will automatically take\r\n// precedence over these weak definitions\r\n//*****************************************************************************\r\nvoid WDT0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid DMA0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid GPIO_INTA_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid GPIO_INTB_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid PIN_INT0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid PIN_INT1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid PIN_INT2_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid PIN_INT3_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid UTICK_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid MRT_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid CTIMER0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid CTIMER1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid SCT0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid CTIMER3_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid FLEXCOMM0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid FLEXCOMM1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid FLEXCOMM2_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid FLEXCOMM3_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved34_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved35_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid FLEXCOMM14_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved37_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved38_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid GFMRT_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved40_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid DMIC_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid WKDEEPSLEEP_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid HYPERVISOR_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid SECUREVIOLATION_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid HWVAD_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved46_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved47_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid RTC_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved49_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved50_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid PIN_INT4_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid PIN_INT5_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid PIN_INT6_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid PIN_INT7_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid CTIMER2_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid CTIMER4_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid OS_EVENT_TIMER_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid FLEXSPI_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved59_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved60_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved61_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid SDIO_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid SGPIO_INTA_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid SGPIO_INTB_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved65_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid USB_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved67_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved68_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved69_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid DMA1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid PUF_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid POWERQUAD_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved73_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved74_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved75_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved76_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid LCD_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid CAPTIMER_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved79_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid W2MWKUP_DONE0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid W2MWKUP_DONE1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid W2MWKUP_DONE2_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid W2MWKUP_DONE3_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid W2MWKUP_DONE4_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid W2MWKUP_DONE5_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid W2MWKUP_DONE6_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid W2MWKUP_DONE7_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid W2MWKUP0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid W2MWKUP1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid WL_MCI_INT0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid WL_MCI_INT1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid WL_MCI_INT2_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid WL_MCI_INT3_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid WL_MCI_INT4_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid WL_MCI_INT5_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid WL_MCI_INT6_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid WL_MCI_INT7_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid B2MWKUP_DONE0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid B2MWKUP_DONE1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid B2MWKUP_DONE2_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid B2MWKUP_DONE3_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid B2MWKUP_DONE4_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid B2MWKUP_DONE5_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid B2MWKUP_DONE6_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid B2MWKUP_DONE7_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid B2MWKUP0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid B2MWKUP1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid BLE_MCI_INT0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid BLE_MCI_INT1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid BLE_MCI_INT2_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid BLE_MCI_INT3_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid BLE_MCI_INT4_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid BLE_MCI_INT5_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid BLE_MCI_INT6_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid BLE_MCI_INT7_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid PIN0_INT_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid PIN1_INT_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid ELS_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid ELS_GDET_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid ELS_GDET_UM_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid PKC_INT_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid PKC_ERR_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid CDOG_INT_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid GAU_DAC_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid GAU_ACOMP_WKUP_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid GAU_ACOMP_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid GAU_ADC1_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid GAU_ADC0_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid USIM_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid OTP_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid ENET_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid ENET_TIMER_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid PMIP_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid PMIP_CHANGE_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid ITRC_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved136_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved137_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid Reserved138_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid TRNG_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid ACC_C_INT_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid ACC_S_INT_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid WACC_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid BACC_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\nvoid GDMA_DriverIRQHandler(void) ALIAS(IntDefaultHandler);\r\n\r\n//*****************************************************************************\r\n// The entry point for the application.\r\n// __main() is the entry point for Redlib based applications\r\n// main() is the entry point for Newlib based applications\r\n//*****************************************************************************\r\n#if defined (__REDLIB__)\r\nextern void __main(void);\r\n#endif\r\nextern int main(void);\r\n\r\n//*****************************************************************************\r\n// External declaration for the pointer to the stack top from the Linker Script\r\n//*****************************************************************************\r\nextern void _vStackTop(void);\r\nextern void _image_size(void);\r\n//*****************************************************************************\r\n// External declaration for the pointer to the stack base from the Linker Script\r\n//*****************************************************************************\r\nextern void _vStackBase(void);\r\n//*****************************************************************************\r\n// External declaration for image type and load address from  Linker Script\r\n//*****************************************************************************\r\nWEAK extern void __imghdr_loadaddress();\r\nWEAK extern void __imghdr_imagetype();\r\n\r\n//*****************************************************************************\r\n#if defined (__cplusplus)\r\n} // extern \"C\"\r\n#endif\r\n//*****************************************************************************\r\n// The vector table.\r\n// This relies on the linker script to place at correct location in memory.\r\n//*****************************************************************************\r\n\r\nextern void (* const g_pfnVectors[])(void);\r\nextern void * __Vectors __attribute__ ((alias (\"g_pfnVectors\")));\r\n\r\n__attribute__ ((used, section(\".isr_vector\")))\r\nvoid (* const g_pfnVectors[])(void) = {\r\n    // Core Level - CM33\r\n    &_vStackTop,                       // The initial stack pointer\r\n    ResetISR,                          // The reset handler\r\n    NMI_Handler,                       // NMI Handler\r\n    HardFault_Handler,                 // Hard Fault Handler\r\n    MemManage_Handler,                 // MPU Fault Handler\r\n    BusFault_Handler,                  // Bus Fault Handler\r\n    UsageFault_Handler,                // Usage Fault Handler\r\n    SecureFault_Handler,               // Secure Fault Handler\r\n#if (defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE & 0x2))\r\n    (void (*)())0x100000,                // Image length\r\n#else\r\n    (void (*)())((unsigned)_image_size), // Image length\r\n#endif\r\n    __imghdr_imagetype,                // Image type\r\n    0,                                 // Reserved\r\n    SVC_Handler,                       // SVCall Handler\r\n    DebugMon_Handler,                  // Debug Monitor Handler\r\n    (void (*)())g_pfnVectors,          // Image load address\r\n    PendSV_Handler,                    // PendSV Handler\r\n    SysTick_Handler,                   // SysTick Handler\r\n\r\n    // Chip Level - RW612\r\n    WDT0_IRQHandler,             // 16 : Windowed watchdog timer 0 (WDT0)(Cortex-M33 watchdog)\r\n    DMA0_IRQHandler,             // 17 : Direct memory access (DMA) controller 0 (secure or Cortex-M33 DMA)\r\n    GPIO_INTA_IRQHandler,        // 18 : GPIO interrupt A\r\n    GPIO_INTB_IRQHandler,        // 19 : GPIO interrupt B\r\n    PIN_INT0_IRQHandler,         // 20 : Pin interrupt 0 or pattern match engine slice 0\r\n    PIN_INT1_IRQHandler,         // 21 : Pin interrupt 1 or pattern match engine slice 1\r\n    PIN_INT2_IRQHandler,         // 22 : Pin interrupt 2 or pattern match engine slice 2\r\n    PIN_INT3_IRQHandler,         // 23 : Pin interrupt 3 or pattern match engine slice 3\r\n    UTICK_IRQHandler,            // 24 : Micro-tick Timer (UTICK)\r\n    MRT_IRQHandler,              // 25 : Multi-Rate Timer (MRT). Global MRT interrupts\r\n    CTIMER0_IRQHandler,          // 26 : Standard counter/timer CTIMER0\r\n    CTIMER1_IRQHandler,          // 27 : Standard counter/timer CTIMER1\r\n    SCT0_IRQHandler,             // 28 : SCTimer/PWM\r\n    CTIMER3_IRQHandler,          // 29 : Standard counter/timer CTIMER3\r\n    FLEXCOMM0_IRQHandler,        // 30 : Flexcomm Interface 0 (USART, SPI, I2C, I2S)\r\n    FLEXCOMM1_IRQHandler,        // 31 : Flexcomm Interface 1 (USART, SPI, I2C, I2S)\r\n    FLEXCOMM2_IRQHandler,        // 32 : Flexcomm Interface 2 (USART, SPI, I2C, I2S)\r\n    FLEXCOMM3_IRQHandler,        // 33 : Flexcomm Interface 3 (USART, SPI, I2C, I2S)\r\n    Reserved34_IRQHandler,       // 34 : Reserved interrupt\r\n    Reserved35_IRQHandler,       // 35 : Reserved interrupt\r\n    FLEXCOMM14_IRQHandler,       // 36 : Flexcomm Interface 14 (USART, SPI, I2C, I2S)\r\n    Reserved37_IRQHandler,       // 37 : Reserved interrupt\r\n    Reserved38_IRQHandler,       // 38 : Reserved interrupt\r\n    GFMRT_IRQHandler,            // 39 : Free Multi-rate timer (GFMRT). Global MRT interrupts\r\n    Reserved40_IRQHandler,       // 40 : Reserved interrupt\r\n    DMIC_IRQHandler,             // 41 : Digital microphone (DMIC) and DMIC subsystem\r\n    WKDEEPSLEEP_IRQHandler,      // 42 : Wake-up from deep sleep\r\n    HYPERVISOR_IRQHandler,       // 43 : Hypervisor service software interrupt\r\n    SECUREVIOLATION_IRQHandler,  // 44 : Secure violation\r\n    HWVAD_IRQHandler,            // 45 : Hardware Voice Activity Detector\r\n    Reserved46_IRQHandler,       // 46 : Reserved interrupt\r\n    Reserved47_IRQHandler,       // 47 : Reserved interrupt\r\n    RTC_IRQHandler,              // 48 : RTC alarm and wake-up\r\n    Reserved49_IRQHandler,       // 49 : Reserved interrupt\r\n    Reserved50_IRQHandler,       // 50 : Reserved interrupt\r\n    PIN_INT4_IRQHandler,         // 51 : Pin interrupt 4 or pattern match engine slice 4\r\n    PIN_INT5_IRQHandler,         // 52 : Pin interrupt 5 or pattern match engine slice 5\r\n    PIN_INT6_IRQHandler,         // 53 : Pin interrupt 6 or pattern match engine slice 6\r\n    PIN_INT7_IRQHandler,         // 54 : Pin interrupt 7 or pattern match engine slice 7\r\n    CTIMER2_IRQHandler,          // 55 : Standard counter/timer CTIMER2\r\n    CTIMER4_IRQHandler,          // 56 : Standard counter/timer CTIMER4\r\n    OS_EVENT_TIMER_IRQHandler,   // 57 : OS event timer 0\r\n    FLEXSPI_IRQHandler,          // 58 : FLEXSPI interface\r\n    Reserved59_IRQHandler,       // 59 : Reserved interrupt\r\n    Reserved60_IRQHandler,       // 60 : Reserved interrupt\r\n    Reserved61_IRQHandler,       // 61 : Reserved interrupt\r\n    SDIO_IRQHandler,             // 62 : The secure digital interface\r\n    SGPIO_INTA_IRQHandler,       // 63 : Secure GPIO interrupt A\r\n    SGPIO_INTB_IRQHandler,       // 64 : Secure GPIO interrupt B\r\n    Reserved65_IRQHandler,       // 65 : Reserved interrupt\r\n    USB_IRQHandler,              // 66 : High-speed USB device/host\r\n    Reserved67_IRQHandler,       // 67 : Reserved interrupt\r\n    Reserved68_IRQHandler,       // 68 : Reserved interrupt\r\n    Reserved69_IRQHandler,       // 69 : Reserved interrupt\r\n    DMA1_IRQHandler,             // 70 : DMA controller 1 (non-secure or HiFi 4 DMA)\r\n    PUF_IRQHandler,              // 71 : Physical Unclonable Function\r\n    POWERQUAD_IRQHandler,        // 72 : PowerQuad math coprocessor\r\n    Reserved73_IRQHandler,       // 73 : Reserved interrupt\r\n    Reserved74_IRQHandler,       // 74 : Reserved interrupt\r\n    Reserved75_IRQHandler,       // 75 : Reserved interrupt\r\n    Reserved76_IRQHandler,       // 76 : Reserved interrupt\r\n    LCD_IRQHandler,              // 77 : LCDIC\r\n    CAPTIMER_IRQHandler,         // 78 : Capture timer\r\n    Reserved79_IRQHandler,       // 79 : Reserved interrupt\r\n    W2MWKUP_DONE0_IRQHandler,    // 80 : Wi-Fi to MCU, wakeup done 0\r\n    W2MWKUP_DONE1_IRQHandler,    // 81 : Wi-Fi to MCU, wakeup done 1\r\n    W2MWKUP_DONE2_IRQHandler,    // 82 : Wi-Fi to MCU, wakeup done 2\r\n    W2MWKUP_DONE3_IRQHandler,    // 83 : Wi-Fi to MCU, wakeup done 3\r\n    W2MWKUP_DONE4_IRQHandler,    // 84 : Wi-Fi to MCU, wakeup done 4\r\n    W2MWKUP_DONE5_IRQHandler,    // 85 : Wi-Fi to MCU, wakeup done 5\r\n    W2MWKUP_DONE6_IRQHandler,    // 86 : Wi-Fi to MCU, wakeup done 6\r\n    W2MWKUP_DONE7_IRQHandler,    // 87 : Wi-Fi to MCU, wakeup done 7\r\n    W2MWKUP0_IRQHandler,         // 88 : Wi-Fi to MCU, wakeup signal 0\r\n    W2MWKUP1_IRQHandler,         // 89 : Wi-Fi to MCU, wakueup signal 1\r\n    WL_MCI_INT0_IRQHandler,      // 90 : Wi-Fi to MCU interrupt 0\r\n    WL_MCI_INT1_IRQHandler,      // 91 : Reserved for Wi-Fi to MCU\r\n    WL_MCI_INT2_IRQHandler,      // 92 : Reserved for Wi-Fi to MCU\r\n    WL_MCI_INT3_IRQHandler,      // 93 : Reserved for Wi-Fi to MCU\r\n    WL_MCI_INT4_IRQHandler,      // 94 : Reserved for Wi-Fi to MCU\r\n    WL_MCI_INT5_IRQHandler,      // 95 : Reserved for Wi-Fi to MCU\r\n    WL_MCI_INT6_IRQHandler,      // 96 : Reserved for Wi-Fi to MCU\r\n    WL_MCI_INT7_IRQHandler,      // 97 : Reserved for Wi-Fi to MCU\r\n    B2MWKUP_DONE0_IRQHandler,    // 98 : Bluetooth LE/802.15.4 radio to MCU, wakeup done 0\r\n    B2MWKUP_DONE1_IRQHandler,    // 99 : Bluetooth LE/802.15.4 radio to MCU, wakeup done 1\r\n    B2MWKUP_DONE2_IRQHandler,    // 100: Bluetooth LE/802.15.4 radio to MCU, wakeup done 2\r\n    B2MWKUP_DONE3_IRQHandler,    // 101: Bluetooth LE/802.15.4 radio to MCU, wakeup done 3\r\n    B2MWKUP_DONE4_IRQHandler,    // 102: Bluetooth LE/802.15.4 radio to MCU, wakeup done 4\r\n    B2MWKUP_DONE5_IRQHandler,    // 103: Bluetooth LE/802.15.4 radio to MCU, wakeup done 5\r\n    B2MWKUP_DONE6_IRQHandler,    // 104: Bluetooth LE/802.15.4 radio to MCU, wakeup done 6\r\n    B2MWKUP_DONE7_IRQHandler,    // 105: Bluetooth LE/802.15.4 radio to MCU, wakeup done 7\r\n    B2MWKUP0_IRQHandler,         // 106: Bluetooth LE/802.15.4 radio to MCU, wakeup signal 0\r\n    B2MWKUP1_IRQHandler,         // 107: Bluetooth LE/802.15.4 radio to MCU, wakeup signal 1\r\n    BLE_MCI_INT0_IRQHandler,     // 108: Bluetooth LE/802.15.4 radio to MCU interrupt 0\r\n    BLE_MCI_INT1_IRQHandler,     // 109: Reserved for Bluetooth LE/802.15.4 radio to MCU\r\n    BLE_MCI_INT2_IRQHandler,     // 110: Reserved for Bluetooth LE/802.15.4 radio to MCU\r\n    BLE_MCI_INT3_IRQHandler,     // 111: Reserved for Bluetooth LE/802.15.4 radio to MCU\r\n    BLE_MCI_INT4_IRQHandler,     // 112: Reserved for Bluetooth LE/802.15.4 radio to MCU\r\n    BLE_MCI_INT5_IRQHandler,     // 113: Reserved for Bluetooth LE/802.15.4 radio to MCU\r\n    BLE_MCI_INT6_IRQHandler,     // 114: Reserved for Bluetooth LE/802.15.4 radio to MCU\r\n    BLE_MCI_INT7_IRQHandler,     // 115: Reserved for Bluetooth LE/802.15.4 radio to MCU\r\n    PIN0_INT_IRQHandler,         // 116: From AON GPIO\r\n    PIN1_INT_IRQHandler,         // 117: From AON GPIO\r\n    ELS_IRQHandler,              // 118: EdgeLock subsystem (ELS)\r\n    ELS_GDET_IRQHandler,         // 119: ELS IRQ line for GDET error\r\n    ELS_GDET_UM_IRQHandler,      // 120: ELS un-gated latched error\r\n    PKC_INT_IRQHandler,          // 121: Public key crypto-processor (PKC) interrupt\r\n    PKC_ERR_IRQHandler,          // 122: PKC error\r\n    CDOG_INT_IRQHandler,         // 123: Code watch dog timmer interrupt\r\n    GAU_DAC_IRQHandler,          // 124: General analog unit (GAU) digital to analog converter (DAC)\r\n    GAU_ACOMP_WKUP_IRQHandler,   // 125: GAU analog comparator (ACOMP) wake-up\r\n    GAU_ACOMP_IRQHandler,        // 126: GAU analog comparator\r\n    GAU_ADC1_IRQHandler,         // 127: GAU analog to digital converter 1 (ADC1)\r\n    GAU_ADC0_IRQHandler,         // 128: GAU analog to digital converter 0 (ADC0)\r\n    USIM_IRQHandler,             // 129: Universal subscriber identity module (USIM) interface\r\n    OTP_IRQHandler,              // 130: One time programmable (OTP) memory interrupt\r\n    ENET_IRQHandler,             // 131: Etheret interrupt\r\n    ENET_TIMER_IRQHandler,       // 132: Ethernet timer interrupt\r\n    PMIP_IRQHandler,             // 133: Power management IP (PMIP)\r\n    PMIP_CHANGE_IRQHandler,      // 134: PMIP change from 1 to 0\r\n    ITRC_IRQHandler,             // 135: Intrusion and tamper response controller (ITRC) interrupt request\r\n    Reserved136_IRQHandler,      // 136: Reserved interrupt\r\n    Reserved137_IRQHandler,      // 137: Reserved interrupt\r\n    Reserved138_IRQHandler,      // 138: Reserved interrupt\r\n    TRNG_IRQHandler,             // 139: TRNG interrupt request\r\n    ACC_C_INT_IRQHandler,        // 140: AHB memory access checker - Cortex-M33 code bus\r\n    ACC_S_INT_IRQHandler,        // 141: AHB memory access checker - Cortex-M33 sys bus\r\n    WACC_IRQHandler,             // 142: Wi-Fi accessed during power off\r\n    BACC_IRQHandler,             // 143: Bluetooth LE/802.15.4 radio accessed during power off\r\n    GDMA_IRQHandler,             // 144: General purpose direct memory access (GDMA) interrupt\r\n}; /* End of g_pfnVectors */\r\n\r\n//*****************************************************************************\r\n// Functions to carry out the initialization of RW and BSS data sections. These\r\n// are written as separate functions rather than being inlined within the\r\n// ResetISR() function in order to cope with MCUs with multiple banks of\r\n// memory.\r\n//*****************************************************************************\r\n__attribute__ ((section(\".after_vectors.init_data\")))\r\nvoid data_init(unsigned int romstart, unsigned int start, unsigned int len) {\r\n    unsigned int *pulDest = (unsigned int*) start;\r\n    unsigned int *pulSrc = (unsigned int*) romstart;\r\n    unsigned int loop;\r\n    for (loop = 0; loop < len; loop = loop + 4)\r\n        *pulDest++ = *pulSrc++;\r\n}\r\n\r\n__attribute__ ((section(\".after_vectors.init_bss\")))\r\nvoid bss_init(unsigned int start, unsigned int len) {\r\n    unsigned int *pulDest = (unsigned int*) start;\r\n    unsigned int loop;\r\n    for (loop = 0; loop < len; loop = loop + 4)\r\n        *pulDest++ = 0;\r\n}\r\n\r\n//*****************************************************************************\r\n// The following symbols are constructs generated by the linker, indicating\r\n// the location of various points in the \"Global Section Table\". This table is\r\n// created by the linker via the Code Red managed linker script mechanism. It\r\n// contains the load address, execution address and length of each RW data\r\n// section and the execution and length of each BSS (zero initialized) section.\r\n//*****************************************************************************\r\nextern unsigned int __data_section_table;\r\nextern unsigned int __data_section_table_end;\r\nextern unsigned int __bss_section_table;\r\nextern unsigned int __bss_section_table_end;\r\n\r\n//*****************************************************************************\r\n// Reset entry point for your code.\r\n// Sets up a simple runtime environment and initializes the C/C++\r\n// library.\r\n//*****************************************************************************\r\n__attribute__ ((naked, section(\".after_vectors.reset\")))\r\nvoid ResetISR(void) {\r\n    // Disable interrupts\r\n    __asm volatile (\"cpsid i\");\r\n    // Config VTOR & MSPLIM register\r\n    __asm volatile (\"LDR R0, =0xE000ED08  \\n\"\r\n                    \"STR %0, [R0]         \\n\"\r\n                    \"LDR R1, [%0]         \\n\"\r\n                    \"MSR MSP, R1          \\n\"\r\n                    \"MSR MSPLIM, %1       \\n\"\r\n                    :\r\n                    : \"r\"(g_pfnVectors), \"r\"(_vStackBase)\r\n                    : \"r0\", \"r1\");\r\n\r\n#if defined (__USE_CMSIS)\r\n// If __USE_CMSIS defined, then call CMSIS SystemInit code\r\n    SystemInit();\r\n\r\n#endif // (__USE_CMSIS)\r\n\r\n    //\r\n    // Copy the data sections from flash to SRAM.\r\n    //\r\n    unsigned int LoadAddr, ExeAddr, SectionLen;\r\n    unsigned int *SectionTableAddr;\r\n\r\n    // Load base address of Global Section Table\r\n    SectionTableAddr = &__data_section_table;\r\n\r\n    // Copy the data sections from flash to SRAM.\r\n    while (SectionTableAddr < &__data_section_table_end) {\r\n        LoadAddr = *SectionTableAddr++;\r\n        ExeAddr = *SectionTableAddr++;\r\n        SectionLen = *SectionTableAddr++;\r\n        data_init(LoadAddr, ExeAddr, SectionLen);\r\n    }\r\n\r\n    // At this point, SectionTableAddr = &__bss_section_table;\r\n    // Zero fill the bss segment\r\n    while (SectionTableAddr < &__bss_section_table_end) {\r\n        ExeAddr = *SectionTableAddr++;\r\n        SectionLen = *SectionTableAddr++;\r\n        bss_init(ExeAddr, SectionLen);\r\n    }\r\n\r\n#if defined (__cplusplus)\r\n    //\r\n    // Call C++ library initialisation\r\n    //\r\n    __libc_init_array();\r\n#endif\r\n\r\n    // Reenable interrupts\r\n    __asm volatile (\"cpsie i\");\r\n\r\n#if defined (__REDLIB__)\r\n    // Call the Redlib library, which in turn calls main()\r\n    __main();\r\n#else\r\n    main();\r\n#endif\r\n\r\n    //\r\n    // main() shouldn't return, but if it does, we'll just enter an infinite loop\r\n    //\r\n    while (1) {\r\n        ;\r\n    }\r\n}\r\n\r\n//*****************************************************************************\r\n// Default core exception handlers. Override the ones here by defining your own\r\n// handler routines in your application code.\r\n//*****************************************************************************\r\nWEAK_AV void NMI_Handler(void)\r\n{ while(1) {}\r\n}\r\n\r\nWEAK_AV void HardFault_Handler(void)\r\n{ while(1) {}\r\n}\r\n\r\nWEAK_AV void MemManage_Handler(void)\r\n{ while(1) {}\r\n}\r\n\r\nWEAK_AV void BusFault_Handler(void)\r\n{ while(1) {}\r\n}\r\n\r\nWEAK_AV void UsageFault_Handler(void)\r\n{ while(1) {}\r\n}\r\n\r\nWEAK_AV void SecureFault_Handler(void)\r\n{ while(1) {}\r\n}\r\n\r\nWEAK_AV void SVC_Handler(void)\r\n{ while(1) {}\r\n}\r\n\r\nWEAK_AV void DebugMon_Handler(void)\r\n{ while(1) {}\r\n}\r\n\r\nWEAK_AV void PendSV_Handler(void)\r\n{ while(1) {}\r\n}\r\n\r\nWEAK_AV void SysTick_Handler(void)\r\n{ while(1) {}\r\n}\r\n\r\n//*****************************************************************************\r\n// Processor ends up here if an unexpected interrupt occurs or a specific\r\n// handler is not present in the application code.\r\n//*****************************************************************************\r\nWEAK_AV void IntDefaultHandler(void)\r\n{ while(1) {}\r\n}\r\n\r\n//*****************************************************************************\r\n// Default application exception handlers. Override the ones here by defining\r\n// your own handler routines in your application code. These routines call\r\n// driver exception handlers or IntDefaultHandler() if no driver exception\r\n// handler is included.\r\n//*****************************************************************************\r\nWEAK void WDT0_IRQHandler(void)\r\n{   WDT0_DriverIRQHandler();\r\n}\r\n\r\nWEAK void DMA0_IRQHandler(void)\r\n{   DMA0_DriverIRQHandler();\r\n}\r\n\r\nWEAK void GPIO_INTA_IRQHandler(void)\r\n{   GPIO_INTA_DriverIRQHandler();\r\n}\r\n\r\nWEAK void GPIO_INTB_IRQHandler(void)\r\n{   GPIO_INTB_DriverIRQHandler();\r\n}\r\n\r\nWEAK void PIN_INT0_IRQHandler(void)\r\n{   PIN_INT0_DriverIRQHandler();\r\n}\r\n\r\nWEAK void PIN_INT1_IRQHandler(void)\r\n{   PIN_INT1_DriverIRQHandler();\r\n}\r\n\r\nWEAK void PIN_INT2_IRQHandler(void)\r\n{   PIN_INT2_DriverIRQHandler();\r\n}\r\n\r\nWEAK void PIN_INT3_IRQHandler(void)\r\n{   PIN_INT3_DriverIRQHandler();\r\n}\r\n\r\nWEAK void UTICK_IRQHandler(void)\r\n{   UTICK_DriverIRQHandler();\r\n}\r\n\r\nWEAK void MRT_IRQHandler(void)\r\n{   MRT_DriverIRQHandler();\r\n}\r\n\r\nWEAK void CTIMER0_IRQHandler(void)\r\n{   CTIMER0_DriverIRQHandler();\r\n}\r\n\r\nWEAK void CTIMER1_IRQHandler(void)\r\n{   CTIMER1_DriverIRQHandler();\r\n}\r\n\r\nWEAK void SCT0_IRQHandler(void)\r\n{   SCT0_DriverIRQHandler();\r\n}\r\n\r\nWEAK void CTIMER3_IRQHandler(void)\r\n{   CTIMER3_DriverIRQHandler();\r\n}\r\n\r\nWEAK void FLEXCOMM0_IRQHandler(void)\r\n{   FLEXCOMM0_DriverIRQHandler();\r\n}\r\n\r\nWEAK void FLEXCOMM1_IRQHandler(void)\r\n{   FLEXCOMM1_DriverIRQHandler();\r\n}\r\n\r\nWEAK void FLEXCOMM2_IRQHandler(void)\r\n{   FLEXCOMM2_DriverIRQHandler();\r\n}\r\n\r\nWEAK void FLEXCOMM3_IRQHandler(void)\r\n{   FLEXCOMM3_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved34_IRQHandler(void)\r\n{   Reserved34_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved35_IRQHandler(void)\r\n{   Reserved35_DriverIRQHandler();\r\n}\r\n\r\nWEAK void FLEXCOMM14_IRQHandler(void)\r\n{   FLEXCOMM14_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved37_IRQHandler(void)\r\n{   Reserved37_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved38_IRQHandler(void)\r\n{   Reserved38_DriverIRQHandler();\r\n}\r\n\r\nWEAK void GFMRT_IRQHandler(void)\r\n{   GFMRT_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved40_IRQHandler(void)\r\n{   Reserved40_DriverIRQHandler();\r\n}\r\n\r\nWEAK void DMIC_IRQHandler(void)\r\n{   DMIC_DriverIRQHandler();\r\n}\r\n\r\nWEAK void WKDEEPSLEEP_IRQHandler(void)\r\n{   WKDEEPSLEEP_DriverIRQHandler();\r\n}\r\n\r\nWEAK void HYPERVISOR_IRQHandler(void)\r\n{   HYPERVISOR_DriverIRQHandler();\r\n}\r\n\r\nWEAK void SECUREVIOLATION_IRQHandler(void)\r\n{   SECUREVIOLATION_DriverIRQHandler();\r\n}\r\n\r\nWEAK void HWVAD_IRQHandler(void)\r\n{   HWVAD_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved46_IRQHandler(void)\r\n{   Reserved46_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved47_IRQHandler(void)\r\n{   Reserved47_DriverIRQHandler();\r\n}\r\n\r\nWEAK void RTC_IRQHandler(void)\r\n{   RTC_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved49_IRQHandler(void)\r\n{   Reserved49_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved50_IRQHandler(void)\r\n{   Reserved50_DriverIRQHandler();\r\n}\r\n\r\nWEAK void PIN_INT4_IRQHandler(void)\r\n{   PIN_INT4_DriverIRQHandler();\r\n}\r\n\r\nWEAK void PIN_INT5_IRQHandler(void)\r\n{   PIN_INT5_DriverIRQHandler();\r\n}\r\n\r\nWEAK void PIN_INT6_IRQHandler(void)\r\n{   PIN_INT6_DriverIRQHandler();\r\n}\r\n\r\nWEAK void PIN_INT7_IRQHandler(void)\r\n{   PIN_INT7_DriverIRQHandler();\r\n}\r\n\r\nWEAK void CTIMER2_IRQHandler(void)\r\n{   CTIMER2_DriverIRQHandler();\r\n}\r\n\r\nWEAK void CTIMER4_IRQHandler(void)\r\n{   CTIMER4_DriverIRQHandler();\r\n}\r\n\r\nWEAK void OS_EVENT_TIMER_IRQHandler(void)\r\n{   OS_EVENT_TIMER_DriverIRQHandler();\r\n}\r\n\r\nWEAK void FLEXSPI_IRQHandler(void)\r\n{   FLEXSPI_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved59_IRQHandler(void)\r\n{   Reserved59_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved60_IRQHandler(void)\r\n{   Reserved60_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved61_IRQHandler(void)\r\n{   Reserved61_DriverIRQHandler();\r\n}\r\n\r\nWEAK void SDIO_IRQHandler(void)\r\n{   SDIO_DriverIRQHandler();\r\n}\r\n\r\nWEAK void SGPIO_INTA_IRQHandler(void)\r\n{   SGPIO_INTA_DriverIRQHandler();\r\n}\r\n\r\nWEAK void SGPIO_INTB_IRQHandler(void)\r\n{   SGPIO_INTB_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved65_IRQHandler(void)\r\n{   Reserved65_DriverIRQHandler();\r\n}\r\n\r\nWEAK void USB_IRQHandler(void)\r\n{   USB_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved67_IRQHandler(void)\r\n{   Reserved67_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved68_IRQHandler(void)\r\n{   Reserved68_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved69_IRQHandler(void)\r\n{   Reserved69_DriverIRQHandler();\r\n}\r\n\r\nWEAK void DMA1_IRQHandler(void)\r\n{   DMA1_DriverIRQHandler();\r\n}\r\n\r\nWEAK void PUF_IRQHandler(void)\r\n{   PUF_DriverIRQHandler();\r\n}\r\n\r\nWEAK void POWERQUAD_IRQHandler(void)\r\n{   POWERQUAD_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved73_IRQHandler(void)\r\n{   Reserved73_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved74_IRQHandler(void)\r\n{   Reserved74_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved75_IRQHandler(void)\r\n{   Reserved75_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved76_IRQHandler(void)\r\n{   Reserved76_DriverIRQHandler();\r\n}\r\n\r\nWEAK void LCD_IRQHandler(void)\r\n{   LCD_DriverIRQHandler();\r\n}\r\n\r\nWEAK void CAPTIMER_IRQHandler(void)\r\n{   CAPTIMER_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved79_IRQHandler(void)\r\n{   Reserved79_DriverIRQHandler();\r\n}\r\n\r\nWEAK void W2MWKUP_DONE0_IRQHandler(void)\r\n{   W2MWKUP_DONE0_DriverIRQHandler();\r\n}\r\n\r\nWEAK void W2MWKUP_DONE1_IRQHandler(void)\r\n{   W2MWKUP_DONE1_DriverIRQHandler();\r\n}\r\n\r\nWEAK void W2MWKUP_DONE2_IRQHandler(void)\r\n{   W2MWKUP_DONE2_DriverIRQHandler();\r\n}\r\n\r\nWEAK void W2MWKUP_DONE3_IRQHandler(void)\r\n{   W2MWKUP_DONE3_DriverIRQHandler();\r\n}\r\n\r\nWEAK void W2MWKUP_DONE4_IRQHandler(void)\r\n{   W2MWKUP_DONE4_DriverIRQHandler();\r\n}\r\n\r\nWEAK void W2MWKUP_DONE5_IRQHandler(void)\r\n{   W2MWKUP_DONE5_DriverIRQHandler();\r\n}\r\n\r\nWEAK void W2MWKUP_DONE6_IRQHandler(void)\r\n{   W2MWKUP_DONE6_DriverIRQHandler();\r\n}\r\n\r\nWEAK void W2MWKUP_DONE7_IRQHandler(void)\r\n{   W2MWKUP_DONE7_DriverIRQHandler();\r\n}\r\n\r\nWEAK void W2MWKUP0_IRQHandler(void)\r\n{   W2MWKUP0_DriverIRQHandler();\r\n}\r\n\r\nWEAK void W2MWKUP1_IRQHandler(void)\r\n{   W2MWKUP1_DriverIRQHandler();\r\n}\r\n\r\nWEAK void WL_MCI_INT0_IRQHandler(void)\r\n{   WL_MCI_INT0_DriverIRQHandler();\r\n}\r\n\r\nWEAK void WL_MCI_INT1_IRQHandler(void)\r\n{   WL_MCI_INT1_DriverIRQHandler();\r\n}\r\n\r\nWEAK void WL_MCI_INT2_IRQHandler(void)\r\n{   WL_MCI_INT2_DriverIRQHandler();\r\n}\r\n\r\nWEAK void WL_MCI_INT3_IRQHandler(void)\r\n{   WL_MCI_INT3_DriverIRQHandler();\r\n}\r\n\r\nWEAK void WL_MCI_INT4_IRQHandler(void)\r\n{   WL_MCI_INT4_DriverIRQHandler();\r\n}\r\n\r\nWEAK void WL_MCI_INT5_IRQHandler(void)\r\n{   WL_MCI_INT5_DriverIRQHandler();\r\n}\r\n\r\nWEAK void WL_MCI_INT6_IRQHandler(void)\r\n{   WL_MCI_INT6_DriverIRQHandler();\r\n}\r\n\r\nWEAK void WL_MCI_INT7_IRQHandler(void)\r\n{   WL_MCI_INT7_DriverIRQHandler();\r\n}\r\n\r\nWEAK void B2MWKUP_DONE0_IRQHandler(void)\r\n{   B2MWKUP_DONE0_DriverIRQHandler();\r\n}\r\n\r\nWEAK void B2MWKUP_DONE1_IRQHandler(void)\r\n{   B2MWKUP_DONE1_DriverIRQHandler();\r\n}\r\n\r\nWEAK void B2MWKUP_DONE2_IRQHandler(void)\r\n{   B2MWKUP_DONE2_DriverIRQHandler();\r\n}\r\n\r\nWEAK void B2MWKUP_DONE3_IRQHandler(void)\r\n{   B2MWKUP_DONE3_DriverIRQHandler();\r\n}\r\n\r\nWEAK void B2MWKUP_DONE4_IRQHandler(void)\r\n{   B2MWKUP_DONE4_DriverIRQHandler();\r\n}\r\n\r\nWEAK void B2MWKUP_DONE5_IRQHandler(void)\r\n{   B2MWKUP_DONE5_DriverIRQHandler();\r\n}\r\n\r\nWEAK void B2MWKUP_DONE6_IRQHandler(void)\r\n{   B2MWKUP_DONE6_DriverIRQHandler();\r\n}\r\n\r\nWEAK void B2MWKUP_DONE7_IRQHandler(void)\r\n{   B2MWKUP_DONE7_DriverIRQHandler();\r\n}\r\n\r\nWEAK void B2MWKUP0_IRQHandler(void)\r\n{   B2MWKUP0_DriverIRQHandler();\r\n}\r\n\r\nWEAK void B2MWKUP1_IRQHandler(void)\r\n{   B2MWKUP1_DriverIRQHandler();\r\n}\r\n\r\nWEAK void BLE_MCI_INT0_IRQHandler(void)\r\n{   BLE_MCI_INT0_DriverIRQHandler();\r\n}\r\n\r\nWEAK void BLE_MCI_INT1_IRQHandler(void)\r\n{   BLE_MCI_INT1_DriverIRQHandler();\r\n}\r\n\r\nWEAK void BLE_MCI_INT2_IRQHandler(void)\r\n{   BLE_MCI_INT2_DriverIRQHandler();\r\n}\r\n\r\nWEAK void BLE_MCI_INT3_IRQHandler(void)\r\n{   BLE_MCI_INT3_DriverIRQHandler();\r\n}\r\n\r\nWEAK void BLE_MCI_INT4_IRQHandler(void)\r\n{   BLE_MCI_INT4_DriverIRQHandler();\r\n}\r\n\r\nWEAK void BLE_MCI_INT5_IRQHandler(void)\r\n{   BLE_MCI_INT5_DriverIRQHandler();\r\n}\r\n\r\nWEAK void BLE_MCI_INT6_IRQHandler(void)\r\n{   BLE_MCI_INT6_DriverIRQHandler();\r\n}\r\n\r\nWEAK void BLE_MCI_INT7_IRQHandler(void)\r\n{   BLE_MCI_INT7_DriverIRQHandler();\r\n}\r\n\r\nWEAK void PIN0_INT_IRQHandler(void)\r\n{   PIN0_INT_DriverIRQHandler();\r\n}\r\n\r\nWEAK void PIN1_INT_IRQHandler(void)\r\n{   PIN1_INT_DriverIRQHandler();\r\n}\r\n\r\nWEAK void ELS_IRQHandler(void)\r\n{   ELS_DriverIRQHandler();\r\n}\r\n\r\nWEAK void ELS_GDET_IRQHandler(void)\r\n{   ELS_GDET_DriverIRQHandler();\r\n}\r\n\r\nWEAK void ELS_GDET_UM_IRQHandler(void)\r\n{   ELS_GDET_UM_DriverIRQHandler();\r\n}\r\n\r\nWEAK void PKC_INT_IRQHandler(void)\r\n{   PKC_INT_DriverIRQHandler();\r\n}\r\n\r\nWEAK void PKC_ERR_IRQHandler(void)\r\n{   PKC_ERR_DriverIRQHandler();\r\n}\r\n\r\nWEAK void CDOG_INT_IRQHandler(void)\r\n{   CDOG_INT_DriverIRQHandler();\r\n}\r\n\r\nWEAK void GAU_DAC_IRQHandler(void)\r\n{   GAU_DAC_DriverIRQHandler();\r\n}\r\n\r\nWEAK void GAU_ACOMP_WKUP_IRQHandler(void)\r\n{   GAU_ACOMP_WKUP_DriverIRQHandler();\r\n}\r\n\r\nWEAK void GAU_ACOMP_IRQHandler(void)\r\n{   GAU_ACOMP_DriverIRQHandler();\r\n}\r\n\r\nWEAK void GAU_ADC1_IRQHandler(void)\r\n{   GAU_ADC1_DriverIRQHandler();\r\n}\r\n\r\nWEAK void GAU_ADC0_IRQHandler(void)\r\n{   GAU_ADC0_DriverIRQHandler();\r\n}\r\n\r\nWEAK void USIM_IRQHandler(void)\r\n{   USIM_DriverIRQHandler();\r\n}\r\n\r\nWEAK void OTP_IRQHandler(void)\r\n{   OTP_DriverIRQHandler();\r\n}\r\n\r\nWEAK void ENET_IRQHandler(void)\r\n{   ENET_DriverIRQHandler();\r\n}\r\n\r\nWEAK void ENET_TIMER_IRQHandler(void)\r\n{   ENET_TIMER_DriverIRQHandler();\r\n}\r\n\r\nWEAK void PMIP_IRQHandler(void)\r\n{   PMIP_DriverIRQHandler();\r\n}\r\n\r\nWEAK void PMIP_CHANGE_IRQHandler(void)\r\n{   PMIP_CHANGE_DriverIRQHandler();\r\n}\r\n\r\nWEAK void ITRC_IRQHandler(void)\r\n{   ITRC_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved136_IRQHandler(void)\r\n{   Reserved136_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved137_IRQHandler(void)\r\n{   Reserved137_DriverIRQHandler();\r\n}\r\n\r\nWEAK void Reserved138_IRQHandler(void)\r\n{   Reserved138_DriverIRQHandler();\r\n}\r\n\r\nWEAK void TRNG_IRQHandler(void)\r\n{   TRNG_DriverIRQHandler();\r\n}\r\n\r\nWEAK void ACC_C_INT_IRQHandler(void)\r\n{   ACC_C_INT_DriverIRQHandler();\r\n}\r\n\r\nWEAK void ACC_S_INT_IRQHandler(void)\r\n{   ACC_S_INT_DriverIRQHandler();\r\n}\r\n\r\nWEAK void WACC_IRQHandler(void)\r\n{   WACC_DriverIRQHandler();\r\n}\r\n\r\nWEAK void BACC_IRQHandler(void)\r\n{   BACC_DriverIRQHandler();\r\n}\r\n\r\nWEAK void GDMA_IRQHandler(void)\r\n{   GDMA_DriverIRQHandler();\r\n}\r\n\r\n//*****************************************************************************\r\n\r\n#if defined (DEBUG)\r\n#pragma GCC pop_options\r\n#endif // (DEBUG)\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/utilities/fsl_assert.c",
    "content": "/*\r\n * Copyright (c) 2015-2016, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2017, 2022-2023 NXP\r\n * All rights reserved.\r\n *\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include \"fsl_common.h\"\r\n#include \"fsl_assert.h\"\r\n#include \"fsl_debug_console.h\"\r\n\r\n/* User can implement its own asser handler (dump logs, registers, etc) by reimplementing the function fsl_assert_hook() */\r\n__attribute__ ((weak)) int fsl_assert_hook(const char *failedExpr, const char *file, int line)\r\n{\r\n    (void)failedExpr;\r\n    (void)file;\r\n    (void)line;\r\n\r\n    return 0;\r\n}\r\n\r\n#ifndef NDEBUG\r\n#if (defined(__CC_ARM)) || (defined(__ARMCC_VERSION)) || (defined(__ICCARM__))\r\nvoid __aeabi_assert(const char *failedExpr, const char *file, int line)\r\n{\r\n#if SDK_DEBUGCONSOLE == DEBUGCONSOLE_DISABLE\r\n    PRINTF(\"ASSERT ERROR \\\" %s \\\": file \\\"%s\\\" Line \\\"%d\\\" \\n\", failedExpr, file, line);\r\n#else\r\n    (void)PRINTF(\"ASSERT ERROR \\\" %s \\\": file \\\"%s\\\" Line \\\"%d\\\" \\n\", failedExpr, file, line);\r\n#endif\r\n\r\n    (void)fsl_assert_hook(failedExpr, file, line);\r\n\r\n    for (;;)\r\n    {\r\n        __BKPT(0);\r\n    }\r\n}\r\n#elif (defined(__GNUC__))\r\n#if defined(__REDLIB__)\r\nvoid __assertion_failed(char *failedExpr)\r\n{\r\n    const char *file = NULL;\r\n    int line = -1;\r\n\r\n    (void)PRINTF(\"ASSERT ERROR \\\" %s \\n\", failedExpr);\r\n\r\n    (void)fsl_assert_hook(failedExpr, file, line);\r\n\r\n    for (;;)\r\n    {\r\n        __BKPT(0);\r\n    }\r\n}\r\n#else\r\nvoid __assert_func(const char *file, int line, const char *func, const char *failedExpr)\r\n{\r\n    (void)PRINTF(\"ASSERT ERROR \\\" %s \\\": file \\\"%s\\\" Line \\\"%d\\\" function name \\\"%s\\\" \\n\", failedExpr, file, line,\r\n                 func);\r\n\r\n    (void)fsl_assert_hook(failedExpr, file, line);\r\n\r\n    for (;;)\r\n    {\r\n        __BKPT(0);\r\n    }\r\n}\r\n#endif /* defined(__REDLIB__) */\r\n#else  /* (defined(__CC_ARM) || (defined(__ICCARM__)) || (defined(__ARMCC_VERSION)) */\r\n\r\n#if (defined(__DSC__) && defined(__CW__))\r\n\r\nvoid __msl_assertion_failed(char const *failedExpr, char const *file, char const *func, int line)\r\n{\r\n    PRINTF(\"\\r\\nASSERT ERROR\\r\\n\");\r\n    PRINTF(\"  File      : %s\\r\\n\", file);\r\n    PRINTF(\"  Function  : %s\\r\\n\", func); /*compiler not support func name yet*/\r\n    PRINTF(\"  Line      : %u\\r\\n\", (uint32_t)line);\r\n    PRINTF(\"  failedExpr: %s\\r\\n\", failedExpr);\r\n    asm(DEBUGHLT);\r\n}\r\n\r\n#endif /* (defined(__DSC__) && defined (__CW__)) */\r\n\r\n#endif /* (defined(__CC_ARM) || (defined(__ICCARM__)) || (defined(__ARMCC_VERSION)) */\r\n#endif /* NDEBUG */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/utilities/fsl_assert.h",
    "content": "/*\r\n * Copyright 2023 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#ifndef _FSL_ASSERT_H_\r\n#define _FSL_ASSERT_H_\r\n\r\n/*!\r\n * @addtogroup assert\r\n * @{\r\n */\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n\r\n/*******************************************************************************\r\n * Prototypes\r\n ******************************************************************************/\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif /* __cplusplus */\r\n\r\n/*! @name Initialization*/\r\n/* @{ */\r\n\r\n\r\n/*!\r\n * @brief Assert hook that can be redifined\r\n *\r\n * @param failedExpr  Expression that caused the assert\r\n * @param file  File where the exception occured.\r\n * @param line  Line on the file where the exception occured.\r\n */\r\nint fsl_assert_hook(const char *failedExpr, const char *file, int line);\r\n\r\n/*! @} */\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif /* __cplusplus */\r\n\r\n/*! @} */\r\n\r\n#endif /* _FSL_DEBUGCONSOLE_H_ */\r\n\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/utilities/fsl_debug_console.c",
    "content": "/*\r\n * This is a modified version of the file printf.c, which was distributed\r\n * by Motorola as part of the M5407C3BOOT.zip package used to initialize\r\n * the M5407C3 evaluation board.\r\n *\r\n * Copyright:\r\n *      1999-2000 MOTOROLA, INC. All Rights Reserved.\r\n *  You are hereby granted a copyright license to use, modify, and\r\n *  distribute the SOFTWARE so long as this entire notice is\r\n *  retained without alteration in any modified and/or redistributed\r\n *  versions, and that such modified versions are clearly identified\r\n *  as such. No licenses are granted by implication, estoppel or\r\n *  otherwise under any patents or trademarks of Motorola, Inc. This\r\n *  software is provided on an \"AS IS\" basis and without warranty.\r\n *\r\n *  To the maximum extent permitted by applicable law, MOTOROLA\r\n *  DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, INCLUDING\r\n *  IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR\r\n *  PURPOSE AND ANY WARRANTY AGAINST INFRINGEMENT WITH REGARD TO THE\r\n *  SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) AND ANY\r\n *  ACCOMPANYING WRITTEN MATERIALS.\r\n *\r\n *  To the maximum extent permitted by applicable law, IN NO EVENT\r\n *  SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER (INCLUDING\r\n *  WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS\r\n *  INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY\r\n *  LOSS) ARISING OF THE USE OR INABILITY TO USE THE SOFTWARE.\r\n *\r\n *  Motorola assumes no responsibility for the maintenance and support\r\n *  of this software\r\n\r\n * Copyright (c) 2015, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2020, 2023 NXP\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n#include <stdarg.h>\r\n#include <stdlib.h>\r\n#if defined(__CC_ARM) || defined(__ARMCC_VERSION)\r\n#include <stdio.h>\r\n#endif\r\n\r\n#include \"fsl_debug_console_conf.h\"\r\n#include \"fsl_str.h\"\r\n\r\n#include \"fsl_common.h\"\r\n#include \"fsl_component_serial_manager.h\"\r\n\r\n#include \"fsl_debug_console.h\"\r\n\r\n#ifdef SDK_OS_FREE_RTOS\r\n#include \"FreeRTOS.h\"\r\n#include \"semphr.h\"\r\n#include \"task.h\"\r\n#endif\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n#ifndef NDEBUG\r\n#if (defined(DEBUG_CONSOLE_ASSERT_DISABLE) && (DEBUG_CONSOLE_ASSERT_DISABLE > 0U))\r\n#undef assert\r\n#define assert(n)\r\n#else\r\n/* MISRA C-2012 Rule 17.2 */\r\n#undef assert\r\n#define assert(n) \\\r\n    while (!(n))  \\\r\n    {             \\\r\n        ;         \\\r\n    }\r\n#endif\r\n#endif\r\n\r\n#if (defined(SDK_DEBUGCONSOLE) && (SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK))\r\n#define DEBUG_CONSOLE_FUNCTION_PREFIX\r\n#else\r\n#define DEBUG_CONSOLE_FUNCTION_PREFIX static\r\n#endif\r\n\r\n/*! @brief character backspace ASCII value */\r\n#define DEBUG_CONSOLE_BACKSPACE 127U\r\n\r\n/* lock definition */\r\n#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)\r\n\r\nstatic SemaphoreHandle_t s_debugConsoleReadSemaphore;\r\n#if configSUPPORT_STATIC_ALLOCATION\r\nstatic StaticSemaphore_t s_debugConsoleReadSemaphoreStatic;\r\n#endif\r\n#if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))\r\nstatic SemaphoreHandle_t s_debugConsoleReadWaitSemaphore;\r\n#if configSUPPORT_STATIC_ALLOCATION\r\nstatic StaticSemaphore_t s_debugConsoleReadWaitSemaphoreStatic;\r\n#endif\r\n#endif\r\n\r\n#elif (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_BM)\r\n\r\n#if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))\r\nstatic volatile bool s_debugConsoleReadWaitSemaphore;\r\n#endif\r\n\r\n#else\r\n\r\n#endif /* DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS */\r\n\r\n/*! @brief get current runing environment is ISR or not */\r\n#ifdef __CA7_REV\r\n#define IS_RUNNING_IN_ISR() SystemGetIRQNestingLevel()\r\n#else\r\n#define IS_RUNNING_IN_ISR() __get_IPSR()\r\n#endif /* __CA7_REV */\r\n\r\n/* semaphore definition */\r\n#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)\r\n\r\n/* mutex semaphore */\r\n/* clang-format off */\r\n#if configSUPPORT_STATIC_ALLOCATION\r\n#define DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(mutex, stack) ((mutex) = xSemaphoreCreateMutexStatic(stack))\r\n#else\r\n#define DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(mutex) ((mutex) = xSemaphoreCreateMutex())\r\n#endif\r\n#define DEBUG_CONSOLE_DESTROY_MUTEX_SEMAPHORE(mutex)   \\\r\n        do                                             \\\r\n        {                                              \\\r\n            if(NULL != (mutex))                        \\\r\n            {                                          \\\r\n                vSemaphoreDelete(mutex);               \\\r\n                (mutex) = NULL;                          \\\r\n            }                                          \\\r\n        } while(false)\r\n\r\n#define DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(mutex) \\\r\n{                                                 \\\r\n        if (IS_RUNNING_IN_ISR() == 0U)            \\\r\n        {                                         \\\r\n            (void)xSemaphoreGive(mutex);          \\\r\n        }                                         \\\r\n}\r\n\r\n#define DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(mutex) \\\r\n{                                                          \\\r\n        if (IS_RUNNING_IN_ISR() == 0U)                     \\\r\n        {                                                  \\\r\n            (void)xSemaphoreTake(mutex, portMAX_DELAY);    \\\r\n        }                                                  \\\r\n}\r\n\r\n#define DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_NONBLOCKING(mutex, result) \\\r\n{                                                                     \\\r\n        if (IS_RUNNING_IN_ISR() == 0U)                                \\\r\n        {                                                             \\\r\n            result = xSemaphoreTake(mutex, 0U);                       \\\r\n        }                                                             \\\r\n        else                                                          \\\r\n        {                                                             \\\r\n            result = 1U;                                              \\\r\n        }                                                             \\\r\n}\r\n\r\n/* Binary semaphore */\r\n#if configSUPPORT_STATIC_ALLOCATION\r\n#define DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(binary,stack) ((binary) = xSemaphoreCreateBinaryStatic(stack))\r\n#else\r\n#define DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(binary) ((binary) = xSemaphoreCreateBinary())\r\n#endif\r\n#define DEBUG_CONSOLE_DESTROY_BINARY_SEMAPHORE(binary) \\\r\n        do                                             \\\r\n        {                                              \\\r\n            if(NULL != (binary))                       \\\r\n            {                                          \\\r\n                vSemaphoreDelete((binary));              \\\r\n                (binary) = NULL;                         \\\r\n            }                                          \\\r\n        } while(false)\r\n#define DEBUG_CONSOLE_TAKE_BINARY_SEMAPHORE_BLOCKING(binary) ((void)xSemaphoreTake((binary), portMAX_DELAY))\r\n#define DEBUG_CONSOLE_GIVE_BINARY_SEMAPHORE_FROM_ISR(binary) ((void)xSemaphoreGiveFromISR((binary), NULL))\r\n\r\n#elif (DEBUG_CONSOLE_SYNCHRONIZATION_BM == DEBUG_CONSOLE_SYNCHRONIZATION_MODE)\r\n\r\n#define DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(mutex)         (void)(mutex)\r\n#define DEBUG_CONSOLE_DESTROY_MUTEX_SEMAPHORE(mutex)        (void)(mutex)\r\n#define DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(mutex)  (void)(mutex)\r\n#define DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(mutex)           (void)(mutex)\r\n#define DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_NONBLOCKING(mutex, result) (result = 1U)\r\n\r\n#define DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(binary)       (void)(binary)\r\n#define DEBUG_CONSOLE_DESTROY_BINARY_SEMAPHORE(binary)      (void)(binary)\r\n#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING\r\n#define DEBUG_CONSOLE_TAKE_BINARY_SEMAPHORE_BLOCKING(binary) \\\r\n    {                                                        \\\r\n        while (!(binary))                                    \\\r\n        {                                                    \\\r\n        }                                                    \\\r\n        (binary) = false;                                      \\\r\n    }\r\n#define DEBUG_CONSOLE_GIVE_BINARY_SEMAPHORE_FROM_ISR(binary) \\\r\n    do                                                       \\\r\n    {                                                        \\\r\n        (binary) = true;                                       \\\r\n    } while(false)\r\n#else\r\n#define DEBUG_CONSOLE_TAKE_BINARY_SEMAPHORE_BLOCKING(binary)  (void)(binary)\r\n#define DEBUG_CONSOLE_GIVE_BINARY_SEMAPHORE_FROM_ISR(binary)  (void)(binary)\r\n#endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */\r\n/* clang-format on */\r\n\r\n/* add other implementation here\r\n *such as :\r\n * #elif(DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DDEBUG_CONSOLE_SYNCHRONIZATION_xxx)\r\n */\r\n\r\n#else\r\n\r\n#error RTOS type is not defined by DEBUG_CONSOLE_SYNCHRONIZATION_MODE.\r\n\r\n#endif /* DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS */\r\n\r\n#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING\r\n/* receive state structure */\r\ntypedef struct _debug_console_write_ring_buffer\r\n{\r\n    uint32_t ringBufferSize;\r\n    volatile uint32_t ringHead;\r\n    volatile uint32_t ringTail;\r\n    uint8_t ringBuffer[DEBUG_CONSOLE_TRANSMIT_BUFFER_LEN];\r\n} debug_console_write_ring_buffer_t;\r\n#endif\r\n\r\ntypedef struct _debug_console_state_struct\r\n{\r\n    serial_handle_t serialHandle; /*!< serial manager handle */\r\n#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING\r\n    SERIAL_MANAGER_HANDLE_DEFINE(serialHandleBuffer);\r\n    debug_console_write_ring_buffer_t writeRingBuffer;\r\n    uint8_t readRingBuffer[DEBUG_CONSOLE_RECEIVE_BUFFER_LEN];\r\n    SERIAL_MANAGER_WRITE_HANDLE_DEFINE(serialWriteHandleBuffer);\r\n    SERIAL_MANAGER_WRITE_HANDLE_DEFINE(serialWriteHandleBuffer2);\r\n    SERIAL_MANAGER_READ_HANDLE_DEFINE(serialReadHandleBuffer);\r\n#else\r\n    SERIAL_MANAGER_BLOCK_HANDLE_DEFINE(serialHandleBuffer);\r\n    SERIAL_MANAGER_WRITE_BLOCK_HANDLE_DEFINE(serialWriteHandleBuffer);\r\n    SERIAL_MANAGER_READ_BLOCK_HANDLE_DEFINE(serialReadHandleBuffer);\r\n#endif\r\n} debug_console_state_struct_t;\r\n\r\n/*******************************************************************************\r\n * Variables\r\n ******************************************************************************/\r\n\r\n/*! @brief Debug console state information. */\r\n#if (defined(DATA_SECTION_IS_CACHEABLE) && (DATA_SECTION_IS_CACHEABLE > 0))\r\nAT_NONCACHEABLE_SECTION(static debug_console_state_struct_t s_debugConsoleState);\r\n#else\r\nstatic debug_console_state_struct_t s_debugConsoleState;\r\n#endif\r\nserial_handle_t g_serialHandle; /*!< serial manager handle */\r\n\r\n/*******************************************************************************\r\n * Prototypes\r\n ******************************************************************************/\r\n/*!\r\n * @brief This is a printf call back function which is used to relocate the log to buffer\r\n * or print the log immediately when the local buffer is full.\r\n *\r\n * @param[in] buf   Buffer to store log.\r\n * @param[in] indicator Buffer index.\r\n * @param[in] val Target character to store.\r\n * @param[in] len length of the character\r\n *\r\n */\r\n#if (defined(SDK_DEBUGCONSOLE) && (SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK))\r\nstatic void DbgConsole_PrintCallback(char *buf, int32_t *indicator, char dbgVal, int len);\r\n#endif\r\n\r\nstatus_t DbgConsole_ReadOneCharacter(uint8_t *ch);\r\nint DbgConsole_SendData(uint8_t *ch, size_t size);\r\nint DbgConsole_SendDataReliable(uint8_t *ch, size_t size);\r\nint DbgConsole_ReadLine(uint8_t *buf, size_t size);\r\nint DbgConsole_ReadCharacter(uint8_t *ch);\r\n\r\n#if ((SDK_DEBUGCONSOLE != DEBUGCONSOLE_REDIRECT_TO_SDK) && defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) && \\\r\n     (defined(DEBUG_CONSOLE_TX_RELIABLE_ENABLE) && (DEBUG_CONSOLE_TX_RELIABLE_ENABLE > 0U)))\r\nDEBUG_CONSOLE_FUNCTION_PREFIX status_t DbgConsole_Flush(void);\r\n#endif\r\n/*******************************************************************************\r\n * Code\r\n ******************************************************************************/\r\n\r\n#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)\r\n\r\nstatic status_t DbgConsole_SerialManagerPerformTransfer(debug_console_state_struct_t *ioState)\r\n{\r\n    serial_manager_status_t ret = kStatus_SerialManager_Error;\r\n    uint32_t sendDataLength;\r\n    uint32_t startIndex;\r\n    uint32_t regPrimask;\r\n\r\n    regPrimask = DisableGlobalIRQ();\r\n    if (ioState->writeRingBuffer.ringTail != ioState->writeRingBuffer.ringHead)\r\n    {\r\n        if (ioState->writeRingBuffer.ringHead > ioState->writeRingBuffer.ringTail)\r\n        {\r\n            sendDataLength = ioState->writeRingBuffer.ringHead - ioState->writeRingBuffer.ringTail;\r\n            startIndex     = ioState->writeRingBuffer.ringTail;\r\n        }\r\n        else\r\n        {\r\n            sendDataLength = ioState->writeRingBuffer.ringBufferSize - ioState->writeRingBuffer.ringTail;\r\n            startIndex     = ioState->writeRingBuffer.ringTail;\r\n            if (0U != ioState->writeRingBuffer.ringHead)\r\n            {\r\n                ret = SerialManager_WriteNonBlocking(((serial_write_handle_t)&ioState->serialWriteHandleBuffer2[0]),\r\n                                                     &ioState->writeRingBuffer.ringBuffer[startIndex], sendDataLength);\r\n                sendDataLength = ioState->writeRingBuffer.ringHead - 0U;\r\n                startIndex     = 0U;\r\n            }\r\n        }\r\n        ret = SerialManager_WriteNonBlocking(((serial_write_handle_t)&ioState->serialWriteHandleBuffer[0]),\r\n                                             &ioState->writeRingBuffer.ringBuffer[startIndex], sendDataLength);\r\n    }\r\n    EnableGlobalIRQ(regPrimask);\r\n    return (status_t)ret;\r\n}\r\n\r\nstatic void DbgConsole_SerialManagerTxCallback(void *callbackParam,\r\n                                               serial_manager_callback_message_t *message,\r\n                                               serial_manager_status_t serialManagerStatus)\r\n{\r\n    debug_console_state_struct_t *ioState;\r\n\r\n    if ((NULL == callbackParam) || (NULL == message))\r\n    {\r\n        return;\r\n    }\r\n\r\n    ioState = (debug_console_state_struct_t *)callbackParam;\r\n\r\n    ioState->writeRingBuffer.ringTail += message->length;\r\n    if (ioState->writeRingBuffer.ringTail >= ioState->writeRingBuffer.ringBufferSize)\r\n    {\r\n        ioState->writeRingBuffer.ringTail = 0U;\r\n    }\r\n\r\n    if (kStatus_SerialManager_Success == serialManagerStatus)\r\n    {\r\n        (void)DbgConsole_SerialManagerPerformTransfer(ioState);\r\n    }\r\n    else if (kStatus_SerialManager_Canceled == serialManagerStatus)\r\n    {\r\n        ioState->writeRingBuffer.ringTail = 0U;\r\n        ioState->writeRingBuffer.ringHead = 0U;\r\n    }\r\n    else\r\n    {\r\n        /*MISRA rule 16.4*/\r\n    }\r\n}\r\n\r\nstatic void DbgConsole_SerialManagerTx2Callback(void *callbackParam,\r\n                                                serial_manager_callback_message_t *message,\r\n                                                serial_manager_status_t serialManagerStatus)\r\n{\r\n    debug_console_state_struct_t *ioState;\r\n\r\n    if ((NULL == callbackParam) || (NULL == message))\r\n    {\r\n        return;\r\n    }\r\n\r\n    ioState = (debug_console_state_struct_t *)callbackParam;\r\n\r\n    ioState->writeRingBuffer.ringTail += message->length;\r\n    if (ioState->writeRingBuffer.ringTail >= ioState->writeRingBuffer.ringBufferSize)\r\n    {\r\n        ioState->writeRingBuffer.ringTail = 0U;\r\n    }\r\n\r\n    if (kStatus_SerialManager_Success == serialManagerStatus)\r\n    {\r\n        /* Empty block*/\r\n    }\r\n    else if (kStatus_SerialManager_Canceled == serialManagerStatus)\r\n    {\r\n        /* Empty block*/\r\n    }\r\n    else\r\n    {\r\n        /*MISRA rule 16.4*/\r\n    }\r\n}\r\n\r\n#if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))\r\n\r\nstatic void DbgConsole_SerialManagerRxCallback(void *callbackParam,\r\n                                               serial_manager_callback_message_t *message,\r\n                                               serial_manager_status_t serialManagerStatus)\r\n{\r\n    if ((NULL == callbackParam) || (NULL == message))\r\n    {\r\n        return;\r\n    }\r\n\r\n    if (kStatus_SerialManager_Notify == serialManagerStatus)\r\n    {\r\n    }\r\n    else if (kStatus_SerialManager_Success == serialManagerStatus)\r\n    {\r\n        /* release s_debugConsoleReadWaitSemaphore from RX callback */\r\n        DEBUG_CONSOLE_GIVE_BINARY_SEMAPHORE_FROM_ISR(s_debugConsoleReadWaitSemaphore);\r\n    }\r\n    else\r\n    {\r\n        /*MISRA rule 16.4*/\r\n    }\r\n}\r\n#endif\r\n\r\n#endif\r\n\r\nstatus_t DbgConsole_ReadOneCharacter(uint8_t *ch)\r\n{\r\n#if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))\r\n\r\n#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) && \\\r\n    (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_BM) && defined(OSA_USED)\r\n    return (status_t)kStatus_Fail;\r\n#else  /*defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) && (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == \\\r\n          DEBUG_CONSOLE_SYNCHRONIZATION_BM) && defined(OSA_USED)*/\r\n    serial_manager_status_t serialManagerStatus = kStatus_SerialManager_Error;\r\n\r\n/* recieve one char every time */\r\n#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)\r\n    serialManagerStatus =\r\n        SerialManager_ReadNonBlocking(((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]), ch, 1);\r\n#else  /*defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)*/\r\n    serialManagerStatus =\r\n        SerialManager_ReadBlocking(((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]), ch, 1);\r\n#endif /*defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)*/\r\n    if (kStatus_SerialManager_Success != serialManagerStatus)\r\n    {\r\n        serialManagerStatus = (serial_manager_status_t)kStatus_Fail;\r\n    }\r\n    else\r\n    {\r\n        /* wait s_debugConsoleReadWaitSemaphore from RX callback */\r\n        DEBUG_CONSOLE_TAKE_BINARY_SEMAPHORE_BLOCKING(s_debugConsoleReadWaitSemaphore);\r\n        serialManagerStatus = (serial_manager_status_t)kStatus_Success;\r\n    }\r\n    return (status_t)serialManagerStatus;\r\n#endif /*defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) && (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == \\\r\n          DEBUG_CONSOLE_SYNCHRONIZATION_BM) && defined(OSA_USED)*/\r\n\r\n#else  /*(defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))*/\r\n\r\n    return (status_t)kStatus_Fail;\r\n\r\n#endif /*(defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))*/\r\n}\r\n\r\n#if DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION\r\nstatic status_t DbgConsole_EchoCharacter(uint8_t *ch, bool isGetChar, int *index)\r\n{\r\n    /* Due to scanf take \\n and \\r as end of string,should not echo */\r\n    if (((*ch != (uint8_t)'\\r') && (*ch != (uint8_t)'\\n')) || (isGetChar))\r\n    {\r\n        /* recieve one char every time */\r\n        if (1 != DbgConsole_SendDataReliable(ch, 1U))\r\n        {\r\n            return (status_t)kStatus_Fail;\r\n        }\r\n    }\r\n\r\n    if ((!isGetChar) && (index != NULL))\r\n    {\r\n        if (DEBUG_CONSOLE_BACKSPACE == *ch)\r\n        {\r\n            if ((*index >= 2))\r\n            {\r\n                *index -= 2;\r\n            }\r\n            else\r\n            {\r\n                *index = 0;\r\n            }\r\n        }\r\n    }\r\n\r\n    return (status_t)kStatus_Success;\r\n}\r\n#endif\r\n\r\nint DbgConsole_SendData(uint8_t *ch, size_t size)\r\n{\r\n    status_t dbgConsoleStatus;\r\n#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)\r\n    uint32_t sendDataLength;\r\n    int txBusy = 0;\r\n#endif\r\n    assert(NULL != ch);\r\n    assert(0U != size);\r\n\r\n#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)\r\n    uint32_t regPrimask = DisableGlobalIRQ();\r\n    if (s_debugConsoleState.writeRingBuffer.ringHead != s_debugConsoleState.writeRingBuffer.ringTail)\r\n    {\r\n        txBusy = 1;\r\n        sendDataLength =\r\n            (s_debugConsoleState.writeRingBuffer.ringHead + s_debugConsoleState.writeRingBuffer.ringBufferSize -\r\n             s_debugConsoleState.writeRingBuffer.ringTail) %\r\n            s_debugConsoleState.writeRingBuffer.ringBufferSize;\r\n    }\r\n    else\r\n    {\r\n        sendDataLength = 0U;\r\n    }\r\n    sendDataLength = s_debugConsoleState.writeRingBuffer.ringBufferSize - sendDataLength - 1U;\r\n    if (sendDataLength < size)\r\n    {\r\n        EnableGlobalIRQ(regPrimask);\r\n        return -1;\r\n    }\r\n    for (int i = 0; i < (int)size; i++)\r\n    {\r\n        s_debugConsoleState.writeRingBuffer.ringBuffer[s_debugConsoleState.writeRingBuffer.ringHead++] = ch[i];\r\n        if (s_debugConsoleState.writeRingBuffer.ringHead >= s_debugConsoleState.writeRingBuffer.ringBufferSize)\r\n        {\r\n            s_debugConsoleState.writeRingBuffer.ringHead = 0U;\r\n        }\r\n    }\r\n\r\n    dbgConsoleStatus = (status_t)kStatus_SerialManager_Success;\r\n\r\n    if (txBusy == 0)\r\n    {\r\n        dbgConsoleStatus = DbgConsole_SerialManagerPerformTransfer(&s_debugConsoleState);\r\n    }\r\n    EnableGlobalIRQ(regPrimask);\r\n#else\r\n    dbgConsoleStatus = (status_t)SerialManager_WriteBlocking(\r\n        ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]), ch, size);\r\n#endif\r\n    return (((status_t)kStatus_Success == dbgConsoleStatus) ? (int)size : -1);\r\n}\r\n\r\nint DbgConsole_SendDataReliable(uint8_t *ch, size_t size)\r\n{\r\n#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)\r\n#if (defined(DEBUG_CONSOLE_TX_RELIABLE_ENABLE) && (DEBUG_CONSOLE_TX_RELIABLE_ENABLE > 0U))\r\n    serial_manager_status_t serialManagerStatus = kStatus_SerialManager_Error;\r\n    uint32_t sendDataLength;\r\n    uint32_t totalLength = size;\r\n    int sentLength;\r\n#endif /* DEBUG_CONSOLE_TX_RELIABLE_ENABLE */\r\n#else  /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */\r\n    serial_manager_status_t serialManagerStatus;\r\n#endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */\r\n\r\n    assert(NULL != ch);\r\n\r\n    if (0U == size)\r\n    {\r\n        return 0;\r\n    }\r\n\r\n    if (NULL == g_serialHandle)\r\n    {\r\n        return 0;\r\n    }\r\n\r\n#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)\r\n\r\n#if (defined(DEBUG_CONSOLE_TX_RELIABLE_ENABLE) && (DEBUG_CONSOLE_TX_RELIABLE_ENABLE > 0U))\r\n    do\r\n    {\r\n        uint32_t regPrimask = DisableGlobalIRQ();\r\n        if (s_debugConsoleState.writeRingBuffer.ringHead != s_debugConsoleState.writeRingBuffer.ringTail)\r\n        {\r\n            sendDataLength =\r\n                (s_debugConsoleState.writeRingBuffer.ringHead + s_debugConsoleState.writeRingBuffer.ringBufferSize -\r\n                 s_debugConsoleState.writeRingBuffer.ringTail) %\r\n                s_debugConsoleState.writeRingBuffer.ringBufferSize;\r\n        }\r\n        else\r\n        {\r\n            sendDataLength = 0U;\r\n        }\r\n        sendDataLength = s_debugConsoleState.writeRingBuffer.ringBufferSize - sendDataLength - 1U;\r\n\r\n        if ((sendDataLength > 0U) && ((sendDataLength >= totalLength) ||\r\n                                      (totalLength >= (s_debugConsoleState.writeRingBuffer.ringBufferSize - 1U))))\r\n        {\r\n            if (sendDataLength > totalLength)\r\n            {\r\n                sendDataLength = totalLength;\r\n            }\r\n\r\n            sentLength = DbgConsole_SendData(&ch[size - totalLength], (size_t)sendDataLength);\r\n            if (sentLength > 0)\r\n            {\r\n                totalLength = totalLength - (uint32_t)sentLength;\r\n            }\r\n        }\r\n        EnableGlobalIRQ(regPrimask);\r\n\r\n        if (totalLength != 0U)\r\n        {\r\n            serialManagerStatus = (serial_manager_status_t)DbgConsole_Flush();\r\n            if (kStatus_SerialManager_Success != serialManagerStatus)\r\n            {\r\n                break;\r\n            }\r\n        }\r\n    } while (totalLength != 0U);\r\n    return ((int)size - (int)totalLength);\r\n#else  /* DEBUG_CONSOLE_TX_RELIABLE_ENABLE */\r\n    return DbgConsole_SendData(ch, size);\r\n#endif /* DEBUG_CONSOLE_TX_RELIABLE_ENABLE */\r\n\r\n#else  /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */\r\n    serialManagerStatus =\r\n        SerialManager_WriteBlocking(((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]), ch, size);\r\n    return ((kStatus_SerialManager_Success == serialManagerStatus) ? (int)size : -1);\r\n#endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */\r\n}\r\n\r\nint DbgConsole_ReadLine(uint8_t *buf, size_t size)\r\n{\r\n    int i = 0;\r\n\r\n    assert(buf != NULL);\r\n\r\n    if (NULL == g_serialHandle)\r\n    {\r\n        return -1;\r\n    }\r\n\r\n    /* take mutex lock function */\r\n#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)\r\n    DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(s_debugConsoleReadSemaphore);\r\n#endif\r\n\r\n    do\r\n    {\r\n        /* recieve one char every time */\r\n        if ((status_t)kStatus_Success != DbgConsole_ReadOneCharacter(&buf[i]))\r\n        {\r\n            /* release mutex lock function */\r\n#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)\r\n            DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);\r\n#endif\r\n            i = -1;\r\n            break;\r\n        }\r\n#if DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION\r\n        (void)DbgConsole_EchoCharacter(&buf[i], false, &i);\r\n#endif\r\n        /* analysis data */\r\n        if (((uint8_t)'\\r' == buf[i]) || ((uint8_t)'\\n' == buf[i]))\r\n        {\r\n            /* End of Line. */\r\n            if (0 == i)\r\n            {\r\n                buf[i] = (uint8_t)'\\0';\r\n                continue;\r\n            }\r\n            else\r\n            {\r\n                break;\r\n            }\r\n        }\r\n        i++;\r\n    } while (i < (int)size);\r\n\r\n    /* get char should not add '\\0'*/\r\n    if (i == (int)size)\r\n    {\r\n        buf[i] = (uint8_t)'\\0';\r\n    }\r\n    else\r\n    {\r\n        buf[i + 1] = (uint8_t)'\\0';\r\n    }\r\n\r\n    /* release mutex lock function */\r\n#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)\r\n    DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);\r\n#endif\r\n\r\n    return i;\r\n}\r\n\r\nint DbgConsole_ReadCharacter(uint8_t *ch)\r\n{\r\n    int ret;\r\n\r\n    assert(ch);\r\n\r\n    if (NULL == g_serialHandle)\r\n    {\r\n        return -1;\r\n    }\r\n\r\n    /* take mutex lock function */\r\n#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)\r\n    DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(s_debugConsoleReadSemaphore);\r\n#endif\r\n    /* read one character */\r\n    if ((status_t)kStatus_Success == DbgConsole_ReadOneCharacter(ch))\r\n    {\r\n        ret = 1;\r\n#if DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION\r\n        (void)DbgConsole_EchoCharacter(ch, true, NULL);\r\n#endif\r\n    }\r\n    else\r\n    {\r\n        ret = -1;\r\n    }\r\n\r\n    /* release mutex lock function */\r\n#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)\r\n    DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);\r\n#endif\r\n\r\n    return ret;\r\n}\r\n\r\n#if (defined(SDK_DEBUGCONSOLE) && (SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK))\r\nstatic void DbgConsole_PrintCallback(char *buf, int32_t *indicator, char dbgVal, int len)\r\n{\r\n    int i = 0;\r\n\r\n    for (i = 0; i < len; i++)\r\n    {\r\n        if (((uint32_t)*indicator + 1UL) >= (uint32_t)DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN)\r\n        {\r\n            (void)DbgConsole_SendDataReliable((uint8_t *)buf, (size_t)(*indicator));\r\n            *indicator = 0;\r\n        }\r\n\r\n        buf[*indicator] = dbgVal;\r\n        (*indicator)++;\r\n    }\r\n}\r\n#endif\r\n\r\n/*************Code for DbgConsole Init, Deinit, Printf, Scanf *******************************/\r\n#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART))\r\n#if (defined(SERIAL_USE_CONFIGURE_STRUCTURE) && (SERIAL_USE_CONFIGURE_STRUCTURE > 0U))\r\n#include \"board.h\"\r\n#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))\r\nstatic const serial_port_uart_config_t uartConfig = {.instance     = BOARD_DEBUG_UART_INSTANCE,\r\n                                                     .clockRate    = BOARD_DEBUG_UART_CLK_FREQ,\r\n                                                     .baudRate     = BOARD_DEBUG_UART_BAUDRATE,\r\n                                                     .parityMode   = kSerialManager_UartParityDisabled,\r\n                                                     .stopBitCount = kSerialManager_UartOneStopBit,\r\n                                                     .enableRx     = 1U,\r\n                                                     .enableTx     = 1U,\r\n                                                     .enableRxRTS  = 0U,\r\n                                                     .enableTxCTS  = 0U,\r\n#if (defined(HAL_UART_ADAPTER_FIFO) && (HAL_UART_ADAPTER_FIFO > 0u))\r\n                                                     .txFifoWatermark = 0U,\r\n                                                     .rxFifoWatermark = 0U\r\n#endif\r\n};\r\n#endif\r\n#endif\r\n/* See fsl_debug_console.h for documentation of this function. */\r\nstatus_t DbgConsole_Init(uint8_t instance, uint32_t baudRate, serial_port_type_t device, uint32_t clkSrcFreq)\r\n{\r\n    serial_manager_config_t serialConfig;\r\n    serial_manager_status_t serialManagerStatus = kStatus_SerialManager_Success;\r\n\r\n#if (defined(SERIAL_USE_CONFIGURE_STRUCTURE) && (SERIAL_USE_CONFIGURE_STRUCTURE == 0U))\r\n#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))\r\n    serial_port_uart_config_t uartConfig = {\r\n        .instance     = instance,\r\n        .clockRate    = clkSrcFreq,\r\n        .baudRate     = baudRate,\r\n        .parityMode   = kSerialManager_UartParityDisabled,\r\n        .stopBitCount = kSerialManager_UartOneStopBit,\r\n        .enableRx     = 1,\r\n        .enableTx     = 1,\r\n        .enableRxRTS  = 0U,\r\n        .enableTxCTS  = 0U,\r\n#if (defined(HAL_UART_ADAPTER_FIFO) && (HAL_UART_ADAPTER_FIFO > 0u))\r\n        .txFifoWatermark = 0U,\r\n        .rxFifoWatermark = 0U\r\n#endif\r\n    };\r\n#endif\r\n#endif\r\n    (void)memset(&serialConfig, 0x0, sizeof(serial_manager_config_t));\r\n#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))\r\n    serial_port_usb_cdc_config_t usbCdcConfig = {\r\n        .controllerIndex = (serial_port_usb_cdc_controller_index_t)instance,\r\n    };\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))\r\n    serial_port_swo_config_t swoConfig = {\r\n        .clockRate = clkSrcFreq,\r\n        .baudRate  = baudRate,\r\n        .port      = instance,\r\n        .protocol  = kSerialManager_SwoProtocolNrz,\r\n    };\r\n#endif\r\n\r\n#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))\r\n    serial_port_virtual_config_t serialPortVirtualConfig = {\r\n        .controllerIndex = (serial_port_virtual_controller_index_t)instance,\r\n    };\r\n#endif\r\n\r\n    serialConfig.type = device;\r\n#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)\r\n    serialConfig.ringBuffer     = &s_debugConsoleState.readRingBuffer[0];\r\n    serialConfig.ringBufferSize = DEBUG_CONSOLE_RECEIVE_BUFFER_LEN;\r\n    serialConfig.blockType      = kSerialManager_NonBlocking;\r\n#else\r\n    serialConfig.blockType = kSerialManager_Blocking;\r\n#endif\r\n\r\n    if (kSerialPort_Uart == device)\r\n    {\r\n#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))\r\n#if (defined(SERIAL_USE_CONFIGURE_STRUCTURE) && (SERIAL_USE_CONFIGURE_STRUCTURE > 0U))\r\n        serialConfig.portConfig = (void *)&uartConfig;\r\n#else\r\n        serialConfig.portConfig = &uartConfig;\r\n#endif\r\n#else\r\n        serialManagerStatus = kStatus_SerialManager_Error;\r\n#endif\r\n    }\r\n    else if (kSerialPort_UsbCdc == device)\r\n    {\r\n#if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U))\r\n        serialConfig.portConfig = &usbCdcConfig;\r\n#else\r\n        serialManagerStatus = kStatus_SerialManager_Error;\r\n#endif\r\n    }\r\n    else if (kSerialPort_Swo == device)\r\n    {\r\n#if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U))\r\n        serialConfig.portConfig = &swoConfig;\r\n#else\r\n        serialManagerStatus = kStatus_SerialManager_Error;\r\n#endif\r\n    }\r\n    else if (kSerialPort_Virtual == device)\r\n    {\r\n#if (defined(SERIAL_PORT_TYPE_VIRTUAL) && (SERIAL_PORT_TYPE_VIRTUAL > 0U))\r\n        serialConfig.portConfig = &serialPortVirtualConfig;\r\n#else\r\n        serialManagerStatus = kStatus_SerialManager_Error;\r\n#endif\r\n    }\r\n    else if (kSerialPort_BleWu == device)\r\n    {\r\n#if (defined(SERIAL_PORT_TYPE_BLE_WU) && (SERIAL_PORT_TYPE_BLE_WU > 0U))\r\n        serialConfig.portConfig = NULL;\r\n#else\r\n        serialManagerStatus = kStatus_SerialManager_Error;\r\n#endif\r\n    }\r\n    else\r\n    {\r\n        serialManagerStatus = kStatus_SerialManager_Error;\r\n    }\r\n\r\n    if (kStatus_SerialManager_Error != serialManagerStatus)\r\n    {\r\n        (void)memset(&s_debugConsoleState, 0, sizeof(s_debugConsoleState));\r\n\r\n#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)\r\n        s_debugConsoleState.writeRingBuffer.ringBufferSize = DEBUG_CONSOLE_TRANSMIT_BUFFER_LEN;\r\n#endif\r\n\r\n        s_debugConsoleState.serialHandle = (serial_handle_t)&s_debugConsoleState.serialHandleBuffer[0];\r\n        serialManagerStatus              = SerialManager_Init(s_debugConsoleState.serialHandle, &serialConfig);\r\n\r\n        assert(kStatus_SerialManager_Success == serialManagerStatus);\r\n\r\n#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)\r\n#if configSUPPORT_STATIC_ALLOCATION\r\n        DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore, &s_debugConsoleReadSemaphoreStatic);\r\n#else\r\n        DEBUG_CONSOLE_CREATE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);\r\n#endif\r\n#endif\r\n#if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))\r\n#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS) && configSUPPORT_STATIC_ALLOCATION\r\n        DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(s_debugConsoleReadWaitSemaphore, &s_debugConsoleReadWaitSemaphoreStatic);\r\n#else\r\n        DEBUG_CONSOLE_CREATE_BINARY_SEMAPHORE(s_debugConsoleReadWaitSemaphore);\r\n#endif\r\n#endif\r\n\r\n        {\r\n            serialManagerStatus =\r\n                SerialManager_OpenWriteHandle(s_debugConsoleState.serialHandle,\r\n                                              ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]));\r\n            assert(kStatus_SerialManager_Success == serialManagerStatus);\r\n#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)\r\n            (void)SerialManager_InstallTxCallback(\r\n                ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]),\r\n                DbgConsole_SerialManagerTxCallback, &s_debugConsoleState);\r\n            serialManagerStatus = SerialManager_OpenWriteHandle(\r\n                s_debugConsoleState.serialHandle,\r\n                ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer2[0]));\r\n            assert(kStatus_SerialManager_Success == serialManagerStatus);\r\n            (void)SerialManager_InstallTxCallback(\r\n                ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer2[0]),\r\n                DbgConsole_SerialManagerTx2Callback, &s_debugConsoleState);\r\n#endif\r\n        }\r\n\r\n#if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))\r\n        {\r\n            serialManagerStatus =\r\n                SerialManager_OpenReadHandle(s_debugConsoleState.serialHandle,\r\n                                             ((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]));\r\n            assert(kStatus_SerialManager_Success == serialManagerStatus);\r\n#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)\r\n            (void)SerialManager_InstallRxCallback(\r\n                ((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]),\r\n                DbgConsole_SerialManagerRxCallback, &s_debugConsoleState);\r\n#endif\r\n        }\r\n#endif\r\n\r\n        g_serialHandle = s_debugConsoleState.serialHandle;\r\n    }\r\n    return (status_t)serialManagerStatus;\r\n}\r\n\r\n/* See fsl_debug_console.h for documentation of this function. */\r\nstatus_t DbgConsole_EnterLowpower(void)\r\n{\r\n    serial_manager_status_t serialManagerStatus = kStatus_SerialManager_Error;\r\n    if (s_debugConsoleState.serialHandle != NULL)\r\n    {\r\n        serialManagerStatus = SerialManager_EnterLowpower(s_debugConsoleState.serialHandle);\r\n    }\r\n    return (status_t)serialManagerStatus;\r\n}\r\n\r\n/* See fsl_debug_console.h for documentation of this function. */\r\nstatus_t DbgConsole_ExitLowpower(void)\r\n{\r\n    serial_manager_status_t serialManagerStatus = kStatus_SerialManager_Error;\r\n\r\n    if (s_debugConsoleState.serialHandle != NULL)\r\n    {\r\n        serialManagerStatus = SerialManager_ExitLowpower(s_debugConsoleState.serialHandle);\r\n    }\r\n    return (status_t)serialManagerStatus;\r\n}\r\n/* See fsl_debug_console.h for documentation of this function. */\r\nstatus_t DbgConsole_Deinit(void)\r\n{\r\n    {\r\n        if (s_debugConsoleState.serialHandle != NULL)\r\n        {\r\n#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)\r\n            (void)SerialManager_CloseWriteHandle(\r\n                ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer2[0]));\r\n#endif\r\n            (void)SerialManager_CloseWriteHandle(\r\n                ((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]));\r\n        }\r\n    }\r\n#if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))\r\n    {\r\n        if (s_debugConsoleState.serialHandle != NULL)\r\n        {\r\n            (void)SerialManager_CloseReadHandle(((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]));\r\n        }\r\n    }\r\n#endif\r\n    if (NULL != s_debugConsoleState.serialHandle)\r\n    {\r\n        if (kStatus_SerialManager_Success == SerialManager_Deinit(s_debugConsoleState.serialHandle))\r\n        {\r\n            s_debugConsoleState.serialHandle = NULL;\r\n            g_serialHandle                   = NULL;\r\n        }\r\n    }\r\n#if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))\r\n    DEBUG_CONSOLE_DESTROY_BINARY_SEMAPHORE(s_debugConsoleReadWaitSemaphore);\r\n#endif\r\n#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)\r\n    DEBUG_CONSOLE_DESTROY_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);\r\n#endif\r\n\r\n    return (status_t)kStatus_Success;\r\n}\r\n#endif /* ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) */\r\n\r\n#if (((defined(SDK_DEBUGCONSOLE) && (SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK))) ||                 \\\r\n     ((SDK_DEBUGCONSOLE != DEBUGCONSOLE_REDIRECT_TO_SDK) && defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING) && \\\r\n      (defined(DEBUG_CONSOLE_TX_RELIABLE_ENABLE) && (DEBUG_CONSOLE_TX_RELIABLE_ENABLE > 0U))))\r\nDEBUG_CONSOLE_FUNCTION_PREFIX status_t DbgConsole_Flush(void)\r\n{\r\n#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)\r\n\r\n#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_BM) && defined(OSA_USED)\r\n\r\n    if (s_debugConsoleState.writeRingBuffer.ringHead != s_debugConsoleState.writeRingBuffer.ringTail)\r\n    {\r\n        return (status_t)kStatus_Fail;\r\n    }\r\n\r\n#else\r\n\r\n    while (s_debugConsoleState.writeRingBuffer.ringHead != s_debugConsoleState.writeRingBuffer.ringTail)\r\n    {\r\n#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)\r\n        if (0U == IS_RUNNING_IN_ISR())\r\n        {\r\n            if (taskSCHEDULER_RUNNING == xTaskGetSchedulerState())\r\n            {\r\n                vTaskDelay(1);\r\n            }\r\n        }\r\n        else\r\n        {\r\n            return (status_t)kStatus_Fail;\r\n        }\r\n#endif\r\n    }\r\n\r\n#endif\r\n\r\n#endif\r\n    return (status_t)kStatus_Success;\r\n}\r\n#endif\r\n\r\n#if (defined(SDK_DEBUGCONSOLE) && (SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK))\r\n/* See fsl_debug_console.h for documentation of this function. */\r\nint DbgConsole_Printf(const char *fmt_s, ...)\r\n{\r\n    va_list ap;\r\n    int result = 0;\r\n\r\n    va_start(ap, fmt_s);\r\n    result = DbgConsole_Vprintf(fmt_s, ap);\r\n    va_end(ap);\r\n\r\n    return result;\r\n}\r\n\r\n/* See fsl_debug_console.h for documentation of this function. */\r\nint DbgConsole_Vprintf(const char *fmt_s, va_list formatStringArg)\r\n{\r\n    int logLength = 0, result = 0;\r\n    char printBuf[DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN] = {'\\0'};\r\n\r\n    if (NULL != g_serialHandle)\r\n    {\r\n        /* format print log first */\r\n        logLength = StrFormatPrintf(fmt_s, formatStringArg, printBuf, DbgConsole_PrintCallback);\r\n        /* print log */\r\n        result = DbgConsole_SendDataReliable((uint8_t *)printBuf, (size_t)logLength);\r\n    }\r\n    return result;\r\n}\r\n\r\n/* See fsl_debug_console.h for documentation of this function. */\r\nint DbgConsole_Putchar(int ch)\r\n{\r\n    /* print char */\r\n    return DbgConsole_SendDataReliable((uint8_t *)&ch, 1U);\r\n}\r\n\r\n/* See fsl_debug_console.h for documentation of this function. */\r\nint DbgConsole_Scanf(char *fmt_s, ...)\r\n{\r\n    va_list ap;\r\n    int formatResult;\r\n    char scanfBuf[DEBUG_CONSOLE_SCANF_MAX_LOG_LEN + 1U] = {'\\0'};\r\n\r\n    /* scanf log */\r\n    (void)DbgConsole_ReadLine((uint8_t *)scanfBuf, DEBUG_CONSOLE_SCANF_MAX_LOG_LEN);\r\n    /* get va_list */\r\n    va_start(ap, fmt_s);\r\n    /* format scanf log */\r\n    formatResult = StrFormatScanf(scanfBuf, fmt_s, ap);\r\n\r\n    va_end(ap);\r\n\r\n    return formatResult;\r\n}\r\n\r\n/* See fsl_debug_console.h for documentation of this function. */\r\nint DbgConsole_BlockingPrintf(const char *fmt_s, ...)\r\n{\r\n    va_list ap;\r\n    int result = 0;\r\n\r\n    va_start(ap, fmt_s);\r\n    result = DbgConsole_BlockingVprintf(fmt_s, ap);\r\n    va_end(ap);\r\n\r\n    return result;\r\n}\r\n\r\n/* See fsl_debug_console.h for documentation of this function. */\r\nint DbgConsole_BlockingVprintf(const char *fmt_s, va_list formatStringArg)\r\n{\r\n    status_t dbgConsoleStatus;\r\n    int logLength = 0, result = 0;\r\n    char printBuf[DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN] = {'\\0'};\r\n\r\n    if (NULL == g_serialHandle)\r\n    {\r\n        return 0;\r\n    }\r\n\r\n    /* format print log first */\r\n    logLength = StrFormatPrintf(fmt_s, formatStringArg, printBuf, DbgConsole_PrintCallback);\r\n\r\n#if defined(DEBUG_CONSOLE_TRANSFER_NON_BLOCKING)\r\n    (void)SerialManager_CancelWriting(((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]));\r\n#endif\r\n    /* print log */\r\n    dbgConsoleStatus =\r\n        (status_t)SerialManager_WriteBlocking(((serial_write_handle_t)&s_debugConsoleState.serialWriteHandleBuffer[0]),\r\n                                              (uint8_t *)printBuf, (size_t)logLength);\r\n    result = (((status_t)kStatus_Success == dbgConsoleStatus) ? (int)logLength : -1);\r\n\r\n    return result;\r\n}\r\n\r\n#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING\r\nstatus_t DbgConsole_TryGetchar(char *ch)\r\n{\r\n#if (defined(DEBUG_CONSOLE_RX_ENABLE) && (DEBUG_CONSOLE_RX_ENABLE > 0U))\r\n    uint32_t length           = 0;\r\n    status_t dbgConsoleStatus = (status_t)kStatus_Fail;\r\n\r\n    assert(ch);\r\n\r\n    if (NULL == g_serialHandle)\r\n    {\r\n        return kStatus_Fail;\r\n    }\r\n\r\n    /* take mutex lock function */\r\n#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)\r\n    DEBUG_CONSOLE_TAKE_MUTEX_SEMAPHORE_BLOCKING(s_debugConsoleReadSemaphore);\r\n#endif\r\n\r\n    if (kStatus_SerialManager_Success ==\r\n        SerialManager_TryRead(((serial_read_handle_t)&s_debugConsoleState.serialReadHandleBuffer[0]), (uint8_t *)ch, 1,\r\n                              &length))\r\n    {\r\n        if (length != 0U)\r\n        {\r\n#if DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION\r\n            (void)DbgConsole_EchoCharacter((uint8_t *)ch, true, NULL);\r\n#endif\r\n            dbgConsoleStatus = (status_t)kStatus_Success;\r\n        }\r\n    }\r\n    /* release mutex lock function */\r\n#if (DEBUG_CONSOLE_SYNCHRONIZATION_MODE == DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS)\r\n    DEBUG_CONSOLE_GIVE_MUTEX_SEMAPHORE(s_debugConsoleReadSemaphore);\r\n#endif\r\n    return dbgConsoleStatus;\r\n#else\r\n    return (status_t)kStatus_Fail;\r\n#endif\r\n}\r\n#endif\r\n\r\n/* See fsl_debug_console.h for documentation of this function. */\r\nint DbgConsole_Getchar(void)\r\n{\r\n    int ret    = -1;\r\n    uint8_t ch = 0U;\r\n\r\n    /* Get char */\r\n    if (DbgConsole_ReadCharacter(&ch) > 0)\r\n    {\r\n        ret = (int)ch;\r\n    }\r\n\r\n    return ret;\r\n}\r\n\r\n#endif /* SDK_DEBUGCONSOLE */\r\n\r\n/*************Code to support toolchain's printf, scanf *******************************/\r\n/* These function __write and __read is used to support IAR toolchain to printf and scanf*/\r\n#if (defined(__ICCARM__))\r\n#if defined(SDK_DEBUGCONSOLE_UART)\r\n#pragma weak __write\r\nsize_t __write(int handle, const unsigned char *buffer, size_t size);\r\nsize_t __write(int handle, const unsigned char *buffer, size_t size)\r\n{\r\n    size_t ret;\r\n    if (NULL == buffer)\r\n    {\r\n        /*\r\n         * This means that we should flush internal buffers.  Since we don't we just return.\r\n         * (Remember, \"handle\" == -1 means that all handles should be flushed.)\r\n         */\r\n        ret = 0U;\r\n    }\r\n    else if ((handle != 1) && (handle != 2))\r\n    {\r\n        /* This function only writes to \"standard out\" and \"standard err\" for all other file handles it returns failure.\r\n         */\r\n        ret = (size_t)-1;\r\n    }\r\n    else\r\n    {\r\n        /* Send data. */\r\n        uint8_t buff[512];\r\n        (void)memcpy(buff, buffer, size);\r\n        (void)DbgConsole_SendDataReliable((uint8_t *)buff, size);\r\n\r\n        ret = size;\r\n    }\r\n    return ret;\r\n}\r\n\r\n#pragma weak __read\r\nsize_t __read(int handle, unsigned char *buffer, size_t size);\r\nsize_t __read(int handle, unsigned char *buffer, size_t size)\r\n{\r\n    uint8_t ch     = 0U;\r\n    int actualSize = 0;\r\n\r\n    /* This function only reads from \"standard in\", for all other file  handles it returns failure. */\r\n    if (0 != handle)\r\n    {\r\n        actualSize = -1;\r\n    }\r\n    else\r\n    {\r\n        /* Receive data.*/\r\n        for (; size > 0U; size--)\r\n        {\r\n            (void)DbgConsole_ReadCharacter(&ch);\r\n            if (0U == ch)\r\n            {\r\n                break;\r\n            }\r\n\r\n            *buffer++ = ch;\r\n            actualSize++;\r\n        }\r\n    }\r\n    return (size_t)actualSize;\r\n}\r\n#endif /* SDK_DEBUGCONSOLE_UART */\r\n\r\n/* support LPC Xpresso with RedLib */\r\n#elif (defined(__REDLIB__))\r\n\r\n#if (defined(SDK_DEBUGCONSOLE_UART))\r\nint __attribute__((weak)) __sys_write(int handle, char *buffer, int size)\r\n{\r\n    if (NULL == buffer)\r\n    {\r\n        /* return -1 if error. */\r\n        return -1;\r\n    }\r\n\r\n    /* This function only writes to \"standard out\" and \"standard err\" for all other file handles it returns failure. */\r\n    if ((handle != 1) && (handle != 2))\r\n    {\r\n        return -1;\r\n    }\r\n\r\n    /* Send data. */\r\n    DbgConsole_SendDataReliable((uint8_t *)buffer, size);\r\n\r\n    return 0;\r\n}\r\n\r\nint __attribute__((weak)) __sys_readc(void)\r\n{\r\n    char tmp;\r\n\r\n    /* Receive data. */\r\n    DbgConsole_ReadCharacter((uint8_t *)&tmp);\r\n\r\n    return tmp;\r\n}\r\n#endif /* SDK_DEBUGCONSOLE_UART */\r\n\r\n/* These function fputc and fgetc is used to support KEIL toolchain to printf and scanf*/\r\n#elif defined(__CC_ARM) || defined(__ARMCC_VERSION)\r\n#if defined(SDK_DEBUGCONSOLE_UART)\r\n#if defined(__CC_ARM)\r\nstruct __FILE\r\n{\r\n    int handle;\r\n    /*\r\n     * Whatever you require here. If the only file you are using is standard output using printf() for debugging,\r\n     * no file handling is required.\r\n     */\r\n};\r\n#endif\r\n\r\n/* FILE is typedef in stdio.h. */\r\n#pragma weak __stdout\r\n#pragma weak __stdin\r\nFILE __stdout;\r\nFILE __stdin;\r\n\r\n#pragma weak fputc\r\nint fputc(int ch, FILE *f)\r\n{\r\n    /* Send data. */\r\n    return DbgConsole_SendDataReliable((uint8_t *)(&ch), 1);\r\n}\r\n\r\n#pragma weak fgetc\r\nint fgetc(FILE *f)\r\n{\r\n    char ch;\r\n\r\n    /* Receive data. */\r\n    DbgConsole_ReadCharacter((uint8_t *)&ch);\r\n\r\n    return ch;\r\n}\r\n\r\n/*\r\n * Terminate the program, passing a return code back to the user.\r\n * This function may not return.\r\n */\r\nvoid _sys_exit(int returncode)\r\n{\r\n    while (1)\r\n    {\r\n    }\r\n}\r\n\r\n/*\r\n * Writes a character to the output channel. This function is used\r\n * for last-resort error message output.\r\n */\r\nvoid _ttywrch(int ch)\r\n{\r\n    char ench = ch;\r\n    DbgConsole_SendDataReliable((uint8_t *)(&ench), 1);\r\n}\r\n\r\nchar *_sys_command_string(char *cmd, int len)\r\n{\r\n    return (cmd);\r\n}\r\n#endif /* SDK_DEBUGCONSOLE_UART */\r\n\r\n/* These function __write and __read is used to support ARM_GCC, KDS, Atollic toolchains to printf and scanf*/\r\n#elif (defined(__GNUC__))\r\n\r\n#if ((defined(__GNUC__) && (!defined(__MCUXPRESSO)) && (defined(SDK_DEBUGCONSOLE_UART))) || \\\r\n     (defined(__MCUXPRESSO) && (defined(SDK_DEBUGCONSOLE_UART))))\r\nint __attribute__((weak)) _write(int handle, char *buffer, int size);\r\nint __attribute__((weak)) _write(int handle, char *buffer, int size)\r\n{\r\n    if (NULL == buffer)\r\n    {\r\n        /* return -1 if error. */\r\n        return -1;\r\n    }\r\n\r\n    /* This function only writes to \"standard out\" and \"standard err\" for all other file handles it returns failure. */\r\n    if ((handle != 1) && (handle != 2))\r\n    {\r\n        return -1;\r\n    }\r\n\r\n    /* Send data. */\r\n    (void)DbgConsole_SendDataReliable((uint8_t *)buffer, (size_t)size);\r\n\r\n    return size;\r\n}\r\n\r\nint __attribute__((weak)) _read(int handle, char *buffer, int size);\r\nint __attribute__((weak)) _read(int handle, char *buffer, int size)\r\n{\r\n    uint8_t ch     = 0U;\r\n    int actualSize = 0;\r\n\r\n    /* This function only reads from \"standard in\", for all other file handles it returns failure. */\r\n    if (handle != 0)\r\n    {\r\n        return -1;\r\n    }\r\n\r\n    /* Receive data. */\r\n    for (; size > 0; size--)\r\n    {\r\n        if (DbgConsole_ReadCharacter(&ch) < 0)\r\n        {\r\n            break;\r\n        }\r\n\r\n        *buffer++ = (char)ch;\r\n        actualSize++;\r\n\r\n        if ((ch == 0U) || (ch == (uint8_t)'\\n') || (ch == (uint8_t)'\\r'))\r\n        {\r\n            break;\r\n        }\r\n    }\r\n\r\n    return (actualSize > 0) ? actualSize : -1;\r\n}\r\n#endif\r\n\r\n#endif /* __ICCARM__ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/utilities/fsl_debug_console.h",
    "content": "/*\r\n * Copyright (c) 2013 - 2015, Freescale Semiconductor, Inc.\r\n * Copyright 2016-2018, 2020 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n *\r\n * Debug console shall provide input and output functions to scan and print formatted data.\r\n * o Support a format specifier for PRINTF follows this prototype \"%[flags][width][.precision][length]specifier\"\r\n *   - [flags] :'-', '+', '#', ' ', '0'\r\n *   - [width]:  number (0,1...)\r\n *   - [.precision]: number (0,1...)\r\n *   - [length]: do not support\r\n *   - [specifier]: 'd', 'i', 'f', 'F', 'x', 'X', 'o', 'p', 'u', 'c', 's', 'n'\r\n * o Support a format specifier for SCANF follows this prototype \" %[*][width][length]specifier\"\r\n *   - [*]: is supported.\r\n *   - [width]: number (0,1...)\r\n *   - [length]: 'h', 'hh', 'l','ll','L'. ignore ('j','z','t')\r\n *   - [specifier]: 'd', 'i', 'u', 'f', 'F', 'e', 'E', 'g', 'G', 'a', 'A', 'o', 'c', 's'\r\n */\r\n\r\n#ifndef _FSL_DEBUGCONSOLE_H_\r\n#define _FSL_DEBUGCONSOLE_H_\r\n\r\n#include \"fsl_common.h\"\r\n#include \"fsl_component_serial_manager.h\"\r\n\r\n/*!\r\n * @addtogroup debugconsole\r\n * @{\r\n */\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\nextern serial_handle_t g_serialHandle; /*!< serial manager handle */\r\n\r\n/*! @brief Definition select redirect toolchain printf, scanf to uart or not. */\r\n#define DEBUGCONSOLE_REDIRECT_TO_TOOLCHAIN 0U /*!< Select toolchain printf and scanf. */\r\n#define DEBUGCONSOLE_REDIRECT_TO_SDK       1U /*!< Select SDK version printf, scanf. */\r\n#define DEBUGCONSOLE_DISABLE               2U /*!< Disable debugconsole function. */\r\n\r\n/*! @brief Definition to select sdk or toolchain printf, scanf. The macro only support\r\n * to be redefined in project setting.\r\n */\r\n#ifndef SDK_DEBUGCONSOLE\r\n#define SDK_DEBUGCONSOLE DEBUGCONSOLE_REDIRECT_TO_SDK\r\n#endif\r\n\r\n#if defined(SDK_DEBUGCONSOLE) && !(SDK_DEBUGCONSOLE)\r\n#include <stdio.h>\r\n#else\r\n#include <stdarg.h>\r\n#endif\r\n\r\n/*! @brief Definition to select redirect toolchain printf, scanf to uart or not.\r\n *\r\n *  if SDK_DEBUGCONSOLE defined to 0,it represents select toolchain printf, scanf.\r\n *  if SDK_DEBUGCONSOLE defined to 1,it represents select SDK version printf, scanf.\r\n *  if SDK_DEBUGCONSOLE defined to 2,it represents disable debugconsole function.\r\n */\r\n#if SDK_DEBUGCONSOLE == DEBUGCONSOLE_DISABLE /* Disable debug console */\r\nstatic inline int DbgConsole_Disabled(void)\r\n{\r\n    return -1;\r\n}\r\n#define PRINTF(...)  DbgConsole_Disabled()\r\n#define SCANF(...)   DbgConsole_Disabled()\r\n#define PUTCHAR(...) DbgConsole_Disabled()\r\n#define GETCHAR()    DbgConsole_Disabled()\r\n#elif SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK /* Select printf, scanf, putchar, getchar of SDK version. */\r\n#define PRINTF  DbgConsole_Printf\r\n#define SCANF   DbgConsole_Scanf\r\n#define PUTCHAR DbgConsole_Putchar\r\n#define GETCHAR DbgConsole_Getchar\r\n#elif SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_TOOLCHAIN /* Select printf, scanf, putchar, getchar of toolchain. \\ \\\r\n                                                              */\r\n#define PRINTF  printf\r\n#define SCANF   scanf\r\n#define PUTCHAR putchar\r\n#define GETCHAR getchar\r\n#endif /* SDK_DEBUGCONSOLE */\r\n\r\n/*******************************************************************************\r\n * Prototypes\r\n ******************************************************************************/\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif /* __cplusplus */\r\n\r\n/*! @name Initialization*/\r\n/* @{ */\r\n\r\n#if ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART))\r\n/*!\r\n * @brief Initializes the peripheral used for debug messages.\r\n *\r\n * Call this function to enable debug log messages to be output via the specified peripheral\r\n * initialized by the serial manager module.\r\n * After this function has returned, stdout and stdin are connected to the selected peripheral.\r\n *\r\n * @param instance      The instance of the module.If the device is kSerialPort_Uart,\r\n *                      the instance is UART peripheral instance. The UART hardware peripheral\r\n *                      type is determined by UART adapter. For example, if the instance is 1,\r\n *                      if the lpuart_adapter.c is added to the current project, the UART periheral\r\n *                      is LPUART1.\r\n *                      If the uart_adapter.c is added to the current project, the UART periheral\r\n *                      is UART1.\r\n * @param baudRate      The desired baud rate in bits per second.\r\n * @param device        Low level device type for the debug console, can be one of the following.\r\n *                      @arg kSerialPort_Uart,\r\n *                      @arg kSerialPort_UsbCdc\r\n * @param clkSrcFreq    Frequency of peripheral source clock.\r\n *\r\n * @return              Indicates whether initialization was successful or not.\r\n * @retval kStatus_Success          Execution successfully\r\n */\r\nstatus_t DbgConsole_Init(uint8_t instance, uint32_t baudRate, serial_port_type_t device, uint32_t clkSrcFreq);\r\n\r\n/*!\r\n * @brief De-initializes the peripheral used for debug messages.\r\n *\r\n * Call this function to disable debug log messages to be output via the specified peripheral\r\n * initialized by the serial manager module.\r\n *\r\n * @return Indicates whether de-initialization was successful or not.\r\n */\r\nstatus_t DbgConsole_Deinit(void);\r\n/*!\r\n * @brief Prepares to enter low power consumption.\r\n *\r\n * This function is used to prepare to enter low power consumption.\r\n *\r\n * @return Indicates whether de-initialization was successful or not.\r\n */\r\nstatus_t DbgConsole_EnterLowpower(void);\r\n\r\n/*!\r\n * @brief Restores from low power consumption.\r\n *\r\n * This function is used to restore from low power consumption.\r\n *\r\n * @return Indicates whether de-initialization was successful or not.\r\n */\r\nstatus_t DbgConsole_ExitLowpower(void);\r\n\r\n#else\r\n/*!\r\n * Use an error to replace the DbgConsole_Init when SDK_DEBUGCONSOLE is not DEBUGCONSOLE_REDIRECT_TO_SDK and\r\n * SDK_DEBUGCONSOLE_UART is not defined.\r\n */\r\nstatic inline status_t DbgConsole_Init(uint8_t instance,\r\n                                       uint32_t baudRate,\r\n                                       serial_port_type_t device,\r\n                                       uint32_t clkSrcFreq)\r\n{\r\n    (void)instance;\r\n    (void)baudRate;\r\n    (void)device;\r\n    (void)clkSrcFreq;\r\n    return (status_t)kStatus_Fail;\r\n}\r\n/*!\r\n * Use an error to replace the DbgConsole_Deinit when SDK_DEBUGCONSOLE is not DEBUGCONSOLE_REDIRECT_TO_SDK and\r\n * SDK_DEBUGCONSOLE_UART is not defined.\r\n */\r\nstatic inline status_t DbgConsole_Deinit(void)\r\n{\r\n    return (status_t)kStatus_Fail;\r\n}\r\n\r\n/*!\r\n * Use an error to replace the DbgConsole_EnterLowpower when SDK_DEBUGCONSOLE is not DEBUGCONSOLE_REDIRECT_TO_SDK and\r\n * SDK_DEBUGCONSOLE_UART is not defined.\r\n */\r\nstatic inline status_t DbgConsole_EnterLowpower(void)\r\n{\r\n    return (status_t)kStatus_Fail;\r\n}\r\n\r\n/*!\r\n * Use an error to replace the DbgConsole_ExitLowpower when SDK_DEBUGCONSOLE is not DEBUGCONSOLE_REDIRECT_TO_SDK and\r\n * SDK_DEBUGCONSOLE_UART is not defined.\r\n */\r\nstatic inline status_t DbgConsole_ExitLowpower(void)\r\n{\r\n    return (status_t)kStatus_Fail;\r\n}\r\n\r\n#endif /* ((SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK) || defined(SDK_DEBUGCONSOLE_UART)) */\r\n\r\n#if (defined(SDK_DEBUGCONSOLE) && (SDK_DEBUGCONSOLE == DEBUGCONSOLE_REDIRECT_TO_SDK))\r\n/*!\r\n * @brief Writes formatted output to the standard output stream.\r\n *\r\n * Call this function to write a formatted output to the standard output stream.\r\n *\r\n * @param   fmt_s Format control string.\r\n * @return  Returns the number of characters printed or a negative value if an error occurs.\r\n */\r\nint DbgConsole_Printf(const char *fmt_s, ...);\r\n\r\n/*!\r\n * @brief Writes formatted output to the standard output stream.\r\n *\r\n * Call this function to write a formatted output to the standard output stream.\r\n *\r\n * @param   fmt_s Format control string.\r\n * @param   formatStringArg Format arguments.\r\n * @return  Returns the number of characters printed or a negative value if an error occurs.\r\n */\r\nint DbgConsole_Vprintf(const char *fmt_s, va_list formatStringArg);\r\n\r\n/*!\r\n * @brief Writes a character to stdout.\r\n *\r\n * Call this function to write a character to stdout.\r\n *\r\n * @param   ch Character to be written.\r\n * @return  Returns the character written.\r\n */\r\nint DbgConsole_Putchar(int ch);\r\n\r\n/*!\r\n * @brief Reads formatted data from the standard input stream.\r\n *\r\n * Call this function to read formatted data from the standard input stream.\r\n *\r\n * @note Due the limitation in the BM OSA environment (CPU is blocked in the function,\r\n * other tasks will not be scheduled), the function cannot be used when the\r\n * DEBUG_CONSOLE_TRANSFER_NON_BLOCKING is set in the BM OSA environment.\r\n * And an error is returned when the function called in this case. The suggestion\r\n * is that polling the non-blocking function DbgConsole_TryGetchar to get the input char.\r\n *\r\n * @param   fmt_s Format control string.\r\n * @return  Returns the number of fields successfully converted and assigned.\r\n */\r\nint DbgConsole_Scanf(char *fmt_s, ...);\r\n\r\n/*!\r\n * @brief Reads a character from standard input.\r\n *\r\n * Call this function to read a character from standard input.\r\n *\r\n * @note Due the limitation in the BM OSA environment (CPU is blocked in the function,\r\n * other tasks will not be scheduled), the function cannot be used when the\r\n * DEBUG_CONSOLE_TRANSFER_NON_BLOCKING is set in the BM OSA environment.\r\n * And an error is returned when the function called in this case. The suggestion\r\n * is that polling the non-blocking function DbgConsole_TryGetchar to get the input char.\r\n *\r\n * @return Returns the character read.\r\n */\r\nint DbgConsole_Getchar(void);\r\n\r\n/*!\r\n * @brief Writes formatted output to the standard output stream with the blocking mode.\r\n *\r\n * Call this function to write a formatted output to the standard output stream with the blocking mode.\r\n * The function will send data with blocking mode no matter the DEBUG_CONSOLE_TRANSFER_NON_BLOCKING set\r\n * or not.\r\n * The function could be used in system ISR mode with DEBUG_CONSOLE_TRANSFER_NON_BLOCKING set.\r\n *\r\n * @param   fmt_s Format control string.\r\n * @return  Returns the number of characters printed or a negative value if an error occurs.\r\n */\r\nint DbgConsole_BlockingPrintf(const char *fmt_s, ...);\r\n\r\n/*!\r\n * @brief Writes formatted output to the standard output stream with the blocking mode.\r\n *\r\n * Call this function to write a formatted output to the standard output stream with the blocking mode.\r\n * The function will send data with blocking mode no matter the DEBUG_CONSOLE_TRANSFER_NON_BLOCKING set\r\n * or not.\r\n * The function could be used in system ISR mode with DEBUG_CONSOLE_TRANSFER_NON_BLOCKING set.\r\n *\r\n * @param   fmt_s Format control string.\r\n * @param   formatStringArg Format arguments.\r\n * @return  Returns the number of characters printed or a negative value if an error occurs.\r\n */\r\nint DbgConsole_BlockingVprintf(const char *fmt_s, va_list formatStringArg);\r\n\r\n/*!\r\n * @brief Debug console flush.\r\n *\r\n * Call this function to wait the tx buffer empty.\r\n * If interrupt transfer is using, make sure the global IRQ is enable before call this function\r\n * This function should be called when\r\n * 1, before enter power down mode\r\n * 2, log is required to print to terminal immediately\r\n * @return Indicates whether wait idle was successful or not.\r\n */\r\nstatus_t DbgConsole_Flush(void);\r\n\r\n#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING\r\n/*!\r\n * @brief Debug console try to get char\r\n * This function provides a API which will not block current task, if character is\r\n * available return it, otherwise return fail.\r\n * @param ch the address of char to receive\r\n * @return Indicates get char was successful or not.\r\n */\r\nstatus_t DbgConsole_TryGetchar(char *ch);\r\n#endif\r\n\r\n#endif /* SDK_DEBUGCONSOLE */\r\n\r\n/*! @} */\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif /* __cplusplus */\r\n\r\n/*! @} */\r\n\r\n#endif /* _FSL_DEBUGCONSOLE_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/utilities/fsl_debug_console_conf.h",
    "content": "/*\r\n * Copyright 2017 - 2020 NXP\r\n * All rights reserved.\r\n *\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n#ifndef _FSL_DEBUG_CONSOLE_CONF_H_\r\n#define _FSL_DEBUG_CONSOLE_CONF_H_\r\n\r\n#include \"fsl_common.h\"\r\n\r\n/*!\r\n * @addtogroup debug_console_config\r\n * @ingroup debugconsole\r\n * @{ \r\n */\r\n\r\n/****************Debug console configuration********************/\r\n\r\n/*! @brief If Non-blocking mode is needed, please define it at project setting,\r\n * otherwise blocking mode is the default transfer mode.\r\n * Warning: If you want to use non-blocking transfer,please make sure the corresponding\r\n * IO interrupt is enable, otherwise there is no output.\r\n * And non-blocking is combine with buffer, no matter bare-metal or rtos.\r\n * Below shows how to configure in your project if you want to use non-blocking mode.\r\n * For IAR, right click project and select \"Options\", define it in \"C/C++ Compiler->Preprocessor->Defined symbols\".\r\n * For KEIL, click \"Options for Target…\", define it in \"C/C++->Preprocessor Symbols->Define\".\r\n * For ARMGCC, open CmakeLists.txt and add the following lines,\r\n * \"SET(CMAKE_C_FLAGS_DEBUG \"${CMAKE_C_FLAGS_DEBUG} -DDEBUG_CONSOLE_TRANSFER_NON_BLOCKING\")\" for debug target.\r\n * \"SET(CMAKE_C_FLAGS_RELEASE \"${CMAKE_C_FLAGS_RELEASE} -DDEBUG_CONSOLE_TRANSFER_NON_BLOCKING\")\" for release target.\r\n * For MCUxpresso, right click project and select \"Properties\", define it in \"C/C++ Build->Settings->MCU C\r\n * Complier->Preprocessor\".\r\n *\r\n */\r\n#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING\r\n/*! @brief define the transmit buffer length which is used to store the multi task log, buffer is enabled automatically\r\n * when\r\n * non-blocking transfer is using,\r\n * This value will affect the RAM's ultilization, should be set per paltform's capability and software requirement.\r\n * If it is configured too small, log maybe missed , because the log will not be\r\n * buffered if the buffer is full, and the print will return immediately with -1.\r\n * And this value should be multiple of 4 to meet memory alignment.\r\n *\r\n */\r\n#ifndef DEBUG_CONSOLE_TRANSMIT_BUFFER_LEN\r\n#define DEBUG_CONSOLE_TRANSMIT_BUFFER_LEN (512U)\r\n#endif /* DEBUG_CONSOLE_TRANSMIT_BUFFER_LEN */\r\n\r\n/*! @brief define the receive buffer length which is used to store the user input, buffer is enabled automatically when\r\n * non-blocking transfer is using,\r\n * This value will affect the RAM's ultilization, should be set per paltform's capability and software requirement.\r\n * If it is configured too small, log maybe missed, because buffer will be overwrited if buffer is too small.\r\n * And this value should be multiple of 4 to meet memory alignment.\r\n *\r\n */\r\n#ifndef DEBUG_CONSOLE_RECEIVE_BUFFER_LEN\r\n#define DEBUG_CONSOLE_RECEIVE_BUFFER_LEN (1024U)\r\n#endif /* DEBUG_CONSOLE_RECEIVE_BUFFER_LEN */\r\n\r\n/*!@brief Whether enable the reliable TX function\r\n * If the macro is zero, the reliable TX function of the debug console is disabled.\r\n * When the macro is zero, the string of PRINTF will be thrown away after the transmit buffer is full.\r\n */\r\n#ifndef DEBUG_CONSOLE_TX_RELIABLE_ENABLE\r\n#define DEBUG_CONSOLE_TX_RELIABLE_ENABLE (1U)\r\n#endif /* DEBUG_CONSOLE_TX_RELIABLE_ENABLE */\r\n\r\n#else\r\n#define DEBUG_CONSOLE_TRANSFER_BLOCKING\r\n#endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */\r\n\r\n/*!@brief Whether enable the RX function\r\n * If the macro is zero, the receive function of the debug console is disabled.\r\n */\r\n#ifndef DEBUG_CONSOLE_RX_ENABLE\r\n#define DEBUG_CONSOLE_RX_ENABLE (1U)\r\n#endif /* DEBUG_CONSOLE_RX_ENABLE */\r\n\r\n/*!@brief define the MAX log length debug console support , that is when you call printf(\"log\", x);, the log\r\n * length can not bigger than this value.\r\n * This macro decide the local log buffer length, the buffer locate at stack, the stack maybe overflow if\r\n * the buffer is too big and current task stack size not big enough.\r\n */\r\n#ifndef DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN\r\n#define DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN (128U)\r\n#endif /* DEBUG_CONSOLE_PRINTF_MAX_LOG_LEN */\r\n\r\n/*!@brief define the buffer support buffer scanf log length, that is when you call scanf(\"log\", &x);, the log\r\n * length can not bigger than this value.\r\n * As same as the DEBUG_CONSOLE_BUFFER_PRINTF_MAX_LOG_LEN.\r\n */\r\n#ifndef DEBUG_CONSOLE_SCANF_MAX_LOG_LEN\r\n#define DEBUG_CONSOLE_SCANF_MAX_LOG_LEN (20U)\r\n#endif /* DEBUG_CONSOLE_SCANF_MAX_LOG_LEN */\r\n\r\n/*! @brief Debug console synchronization\r\n * User should not change these macro for synchronization mode, but add the\r\n * corresponding synchronization mechanism per different software environment.\r\n * Such as, if another RTOS is used,\r\n * add:\r\n *  \\#define DEBUG_CONSOLE_SYNCHRONIZATION_XXXX 3\r\n * in this configuration file and implement the synchronization in fsl.log.c.\r\n */\r\n/*! @brief synchronization for baremetal software */\r\n#define DEBUG_CONSOLE_SYNCHRONIZATION_BM 0\r\n/*! @brief synchronization for freertos software */\r\n#define DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS 1\r\n\r\n/*! @brief RTOS synchronization mechanism disable\r\n * If not defined, default is enable, to avoid multitask log print mess.\r\n * If other RTOS is used, you can implement the RTOS's specific synchronization mechanism in fsl.log.c\r\n * If synchronization is disabled, log maybe messed on terminal.\r\n */\r\n#ifndef DEBUG_CONSOLE_DISABLE_RTOS_SYNCHRONIZATION\r\n#ifdef DEBUG_CONSOLE_TRANSFER_NON_BLOCKING\r\n#ifdef SDK_OS_FREE_RTOS\r\n#define DEBUG_CONSOLE_SYNCHRONIZATION_MODE DEBUG_CONSOLE_SYNCHRONIZATION_FREERTOS\r\n#else\r\n#define DEBUG_CONSOLE_SYNCHRONIZATION_MODE DEBUG_CONSOLE_SYNCHRONIZATION_BM\r\n#endif /* SDK_OS_FREE_RTOS */\r\n#else\r\n#define DEBUG_CONSOLE_SYNCHRONIZATION_MODE DEBUG_CONSOLE_SYNCHRONIZATION_BM\r\n#endif /* DEBUG_CONSOLE_TRANSFER_NON_BLOCKING */\r\n#endif /* DEBUG_CONSOLE_DISABLE_RTOS_SYNCHRONIZATION */\r\n\r\n/*! @brief echo function support\r\n * If you want to use the echo function,please define DEBUG_CONSOLE_ENABLE_ECHO\r\n * at your project setting.\r\n */\r\n#ifndef DEBUG_CONSOLE_ENABLE_ECHO\r\n#define DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION 0\r\n#else\r\n#define DEBUG_CONSOLE_ENABLE_ECHO_FUNCTION 1\r\n#endif /* DEBUG_CONSOLE_ENABLE_ECHO */\r\n\r\n/*********************************************************************/\r\n\r\n/***************Debug console other configuration*********************/\r\n\r\n/*! @brief Definition to select virtual com(USB CDC) as the debug console. */\r\n#ifndef BOARD_USE_VIRTUALCOM\r\n#define BOARD_USE_VIRTUALCOM 0U\r\n#endif\r\n/*******************************************************************/\r\n\r\n/*! @} */\r\n\r\n#endif /* _FSL_DEBUG_CONSOLE_CONF_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/utilities/fsl_memcpy.S",
    "content": "/*\r\n * Copyright 2022 NXP\r\n * All rights reserved.\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n\r\n    .syntax unified\r\n\r\n    .text\r\n    .thumb\r\n\r\n    .align 2\r\n\r\n#ifndef MSDK_MISC_OVERRIDE_MEMCPY\r\n#define MSDK_MISC_OVERRIDE_MEMCPY 1\r\n#endif\r\n\r\n/*\r\n   This mempcy function is used to replace the GCC newlib function for these purposes:\r\n   1. The newlib nano memcpy function use byte by byte copy, it is slow.\r\n   2. The newlib memcpy function for CM4, CM7, CM33 does't check address alignment,\r\n      so it may run to fault when the address is unaligned, and the memory region\r\n      is device memory, which does not support unaligned access.\r\n\r\n   This function is manually optimized base on assembly result of the c function.\r\n   The workflow is:\r\n   1. Return directly if length is 0.\r\n   2. If the source address is not 4-byte aligned, copy the unaligned part first byte by byte.\r\n   3. If the destination address is 4-byte aligned, then copy the 16-byte aligned part first,\r\n      copy 16-byte each loop, and then copy 8-byte, 4-byte, 2-byte and 1-byte.\r\n   4. If the destination address is not 4-byte aligned, load source data into register word\r\n      by word first, then store to memory based on alignement requirement. For the left part,\r\n      copy them byte by byte.\r\n\r\n   The source code of the c function is:\r\n\r\n   #define __CPY_WORD(dst, src) \\\r\n       *(uint32_t *)(dst) = *(uint32_t *)(src); \\\r\n       (dst) = ((uint32_t *)dst) + 1; \\\r\n       (src) = ((uint32_t *)src) + 1\r\n\r\n   #define __CPY_HWORD(dst, src) \\\r\n       *(uint16_t *)(dst) = *(uint16_t *)(src); \\\r\n       (dst) = ((uint16_t *)dst) + 1; \\\r\n       (src) = ((uint16_t *)src) + 1\r\n\r\n   #define __CPY_BYTE(dst, src) \\\r\n       *(uint8_t *)(dst) = *(uint8_t *)(src); \\\r\n       (dst) = ((uint8_t *)dst) + 1; \\\r\n       (src) = ((uint8_t *)src) + 1\r\n\r\n   void * memcpy(void *restrict  dst, const void * restrict src, size_t n)\r\n   {\r\n       void *ret = dst;\r\n       uint32_t tmp;\r\n\r\n       if (0 == n) return ret;\r\n\r\n       while (((uintptr_t)src & 0x03UL) != 0UL)\r\n       {\r\n           __CPY_BYTE(dst, src);\r\n           n--;\r\n\r\n           if (0 == n) return ret;\r\n       }\r\n\r\n       if (((uintptr_t)dst & 0x03UL) == 0UL)\r\n       {\r\n           while (n >= 16UL)\r\n           {\r\n               __CPY_WORD(dst, src);\r\n               __CPY_WORD(dst, src);\r\n               __CPY_WORD(dst, src);\r\n               __CPY_WORD(dst, src);\r\n               n-= 16UL;\r\n           }\r\n\r\n           if ((n & 0x08UL) != 0UL)\r\n           {\r\n               __CPY_WORD(dst, src);\r\n               __CPY_WORD(dst, src);\r\n           }\r\n\r\n           if ((n & 0x04UL) != 0UL)\r\n           {\r\n               __CPY_WORD(dst, src);\r\n           }\r\n\r\n           if ((n & 0x02UL) != 0UL)\r\n           {\r\n               __CPY_HWORD(dst, src);\r\n           }\r\n\r\n           if ((n & 0x01UL) != 0UL)\r\n           {\r\n               __CPY_BYTE(dst, src);\r\n           }\r\n       }\r\n       else\r\n       {\r\n           if (((uintptr_t)dst & 1UL) == 0UL)\r\n           {\r\n               while (n >= 4)\r\n               {\r\n                   tmp = *(uint32_t *)src;\r\n                   src = ((uint32_t *)src) + 1;\r\n\r\n                   *(volatile uint16_t *)dst = (uint16_t)tmp;\r\n                   dst = ((uint16_t *)dst) + 1;\r\n                   *(volatile uint16_t *)dst = (uint16_t)(tmp>>16U);\r\n                   dst = ((uint16_t *)dst) + 1;\r\n\r\n                   n-=4;\r\n               }\r\n           }\r\n           else\r\n           {\r\n               while (n >= 4)\r\n               {\r\n                   tmp = *(uint32_t *)src;\r\n                   src = ((uint32_t *)src) + 1;\r\n\r\n                   *(volatile uint8_t *)dst  = (uint8_t)tmp;\r\n                   dst = ((uint8_t *)dst) + 1;\r\n                   *(volatile uint16_t *)dst = (uint16_t)(tmp>>8U);\r\n                   dst = ((uint16_t *)dst) + 1;\r\n                   *(volatile uint8_t *)dst = (uint8_t)(tmp>>24U);\r\n                   dst = ((uint8_t *)dst) + 1;\r\n                   n-=4;\r\n               }\r\n           }\r\n\r\n           while (n > 0)\r\n           {\r\n               __CPY_BYTE(dst, src);\r\n               n--;\r\n           }\r\n       }\r\n\r\n       return ret;\r\n   }\r\n\r\n   The test function is:\r\n\r\n   void test_memcpy(uint8_t *dst, const uint8_t * src, size_t n)\r\n   {\r\n       uint8_t * ds;\r\n       uint8_t * de;\r\n       const uint8_t *ss;\r\n       const uint8_t *se;\r\n       uint8_t * ret;\r\n\r\n       for (ss = src; ss < src+n; ss++)\r\n       {\r\n           for (se = ss; se < src + n; se ++)\r\n           {\r\n               size_t nn = (uintptr_t)se - (uintptr_t)ss;\r\n\r\n               for (ds = dst; ds + nn < dst+n; ds++)\r\n               {\r\n                   de = ds + nn;\r\n\r\n                   memset(dst, 0, n);\r\n\r\n                   ret = memcpy(ds, ss, nn);\r\n\r\n                   assert(ret == ds);\r\n\r\n                   for (const uint8_t *data = dst; data < ds; data++)\r\n                   {\r\n                       assert(0 == *data);\r\n                   }\r\n\r\n                   for (const uint8_t *data = de; data < dst+n; data++)\r\n                   {\r\n                       assert(0 == *data);\r\n                   }\r\n\r\n                   assert(memcmp(ds, ss, nn) == 0);\r\n               }\r\n           }\r\n       }\r\n   }\r\n\r\n   test_memcpy((uint8_t *)0x20240000, (const uint8_t *)0x202C0000, 48);\r\n\r\n */\r\n\r\n#if MSDK_MISC_OVERRIDE_MEMCPY\r\n\r\n    .thumb_func\r\n    .align 2\r\n    .global  memcpy\r\n    .type    memcpy, %function\r\n\r\nmemcpy:\r\n    push    {r0, r4, r5, r6, r7, lr}\r\n    cmp     r2, #0\r\n    beq     ret                    /* If copy size is 0, return. */\r\n\r\nsrc_word_unaligned:\r\n    ands    r3, r1, #3             /* Make src 4-byte align. */\r\n    beq.n   src_word_aligned       /* src is 4-byte aligned, jump. */\r\n    ldrb    r4, [r1], #1\r\n    subs    r2, r2, #1             /* n-- */\r\n    strb    r4, [r0], #1\r\n    beq.n   ret                    /* n=0, return. */\r\n    b.n     src_word_unaligned\r\n\r\nsrc_word_aligned:\r\n    ands    r3, r0, #3             /* Check dest 4-byte align. */\r\n    bne.n   dst_word_unaligned\r\n\r\ndst_word_aligned:\r\n    cmp     r2, #16\r\n    blt.n   size_ge_8\r\nsize_ge_16:                         /* size greater or equal than 16, use ldm and stm. */\r\n    subs    r2, r2, #16             /* n -= 16 */\r\n    ldmia   r1!, { r4, r5, r6, r7 }\r\n    cmp     r2, #16\r\n    stmia   r0!, { r4, r5, r6, r7 }\r\n    bcs.n   size_ge_16\r\nsize_ge_8:                         /* size greater or equal than 8 */\r\n    lsls    r3, r2, #28\r\n    itt     mi\r\n    ldmiami r1!, { r4, r5 }\r\n    stmiami r0!, { r4, r5 }\r\nsize_ge_4:                         /* size greater or equal than 4 */\r\n    lsls    r3, r2, #29\r\n    itt     mi\r\n    ldrmi   r4, [r1], #4\r\n    strmi   r4, [r0], #4\r\nsize_ge_2:                         /* size greater or equal than 2 */\r\n    lsls    r3, r2, #30\r\n    itt     mi\r\n    ldrhmi  r4, [r1], #2\r\n    strhmi  r4, [r0], #2\r\nsize_ge_1:                         /* size greater or equal than 1 */\r\n    lsls    r3, r2, #31\r\n    itt     mi\r\n    ldrbmi  r4, [r1]\r\n    strbmi  r4, [r0]\r\n    b.n     ret\r\n\r\ndst_word_unaligned:\r\n    lsls    r3, r0, #31\r\n    bmi.n   dst_half_word_unaligned\r\ndst_half_word_aligned:\r\n    cmp     r2, #4\r\n    bcc.n   size_lt_4\r\n    ldr     r4, [r1], #4\r\n    subs    r2, r2, #4\r\n    strh    r4, [r0], #2\r\n    lsrs    r5, r4, #16\r\n    strh    r5, [r0], #2\r\n    b  dst_half_word_aligned\r\ndst_half_word_unaligned:\r\n    cmp     r2, #4\r\n    bcc.n   size_lt_4\r\n    ldr     r4, [r1], #4\r\n    subs    r2, r2, #4\r\n    strb    r4, [r0], #1\r\n    lsrs    r5, r4, #8\r\n    strh    r5, [r0], #2\r\n    lsrs    r6, r4, #24\r\n    strb    r6, [r0], #1\r\n    b  dst_half_word_unaligned\r\nsize_lt_4:                             /* size less than 4. */\r\n    cmp     r2, #0\r\n    ittt    ne\r\n    ldrbne  r4, [r1], #1\r\n    strbne  r4, [r0], #1\r\n    subne   r2, r2, #1\r\n    bne     size_lt_4\r\nret:\r\n    pop    {r0, r4, r5, r6, r7, pc}\r\n\r\n#endif /* MSDK_MISC_OVERRIDE_MEMCPY */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/utilities/fsl_str.c",
    "content": "/*\r\n * Copyright 2017, 2020, 2022-2023 NXP\r\n * All rights reserved.\r\n *\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n *\r\n */\r\n\r\n#include <math.h>\r\n#include <stdarg.h>\r\n#include <stdlib.h>\r\n#include <errno.h> /* MISRA C-2012 Rule 22.9 */\r\n#include \"fsl_str.h\"\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*! @brief The overflow value.*/\r\n#ifndef HUGE_VAL\r\n#define HUGE_VAL (99.e99)\r\n#endif /* HUGE_VAL */\r\n\r\n#ifndef MAX_FIELD_WIDTH\r\n#define MAX_FIELD_WIDTH 99U\r\n#endif\r\n\r\n/*! @brief Keil: suppress ellipsis warning in va_arg usage below. */\r\n#if defined(__CC_ARM)\r\n#pragma diag_suppress 1256\r\n#endif /* __CC_ARM */\r\n\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n#define STR_FORMAT_PRINTF_UVAL_TYPE unsigned long long int\r\n#define STR_FORMAT_PRINTF_IVAL_TYPE long long int\r\n#else\r\n#define STR_FORMAT_PRINTF_UVAL_TYPE unsigned int\r\n#define STR_FORMAT_PRINTF_IVAL_TYPE int\r\n#endif\r\n/*******************************************************************************\r\n * Prototypes\r\n ******************************************************************************/\r\n/*!\r\n * @brief Scanline function which ignores white spaces.\r\n *\r\n * @param[in]   s The address of the string pointer to update.\r\n * @return      String without white spaces.\r\n */\r\nstatic uint32_t ScanIgnoreWhiteSpace(const char **s);\r\n\r\n/*!\r\n * @brief Converts a radix number to a string and return its length.\r\n *\r\n * @param[in] numstr    Converted string of the number.\r\n * @param[in] nump      Pointer to the number.\r\n * @param[in] neg       Polarity of the number.\r\n * @param[in] radix     The radix to be converted to.\r\n * @param[in] use_caps  Used to identify %x/X output format.\r\n\r\n * @return Length of the converted string.\r\n */\r\nstatic int32_t ConvertRadixNumToString(char *numstr, void *nump, unsigned int neg, unsigned int radix, bool use_caps);\r\n\r\n#if (defined(PRINTF_FLOAT_ENABLE) && (PRINTF_FLOAT_ENABLE > 0U))\r\n/*!\r\n * @brief Converts a floating radix number to a string and return its length.\r\n *\r\n * @param[in] numstr            Converted string of the number.\r\n * @param[in] nump              Pointer to the number.\r\n * @param[in] radix             The radix to be converted to.\r\n * @param[in] precision_width   Specify the precision width.\r\n\r\n * @return Length of the converted string.\r\n */\r\nstatic int32_t ConvertFloatRadixNumToString(char *numstr, void *nump, int32_t radix, uint32_t precision_width);\r\n\r\n#endif /* PRINTF_FLOAT_ENABLE */\r\n\r\n/*************Code for process formatted data*******************************/\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\nstatic uint8_t PrintGetSignChar(long long int ival, uint32_t flags_used, char *schar)\r\n{\r\n    uint8_t len = 1U;\r\n    if (ival < 0)\r\n    {\r\n        *schar = '-';\r\n    }\r\n    else\r\n    {\r\n        if (0U != (flags_used & (uint32_t)kPRINTF_Plus))\r\n        {\r\n            *schar = '+';\r\n        }\r\n        else if (0U != (flags_used & (uint32_t)kPRINTF_Space))\r\n        {\r\n            *schar = ' ';\r\n        }\r\n        else\r\n        {\r\n            *schar = '\\0';\r\n            len    = 0U;\r\n        }\r\n    }\r\n    return len;\r\n}\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n\r\nstatic uint32_t PrintGetWidth(const char **p, va_list *ap)\r\n{\r\n    uint32_t field_width = 0;\r\n    uint8_t done         = 0U;\r\n    char c;\r\n\r\n    while (0U == done)\r\n    {\r\n        c = *(++(*p));\r\n        if ((c >= '0') && (c <= '9'))\r\n        {\r\n            (field_width) = ((field_width)*10U) + ((uint32_t)c - (uint32_t)'0');\r\n        }\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n        else if (c == '*')\r\n        {\r\n            (field_width) = (uint32_t)va_arg(*ap, uint32_t);\r\n        }\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n        else\r\n        {\r\n            /* We've gone one char too far. */\r\n            --(*p);\r\n            done = 1U;\r\n        }\r\n    }\r\n    return field_width;\r\n}\r\n\r\nstatic uint32_t PrintGetPrecision(const char **s, va_list *ap, bool *valid_precision_width)\r\n{\r\n    const char *p            = *s;\r\n    uint32_t precision_width = 6U;\r\n    uint8_t done             = 0U;\r\n\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n    if (NULL != valid_precision_width)\r\n    {\r\n        *valid_precision_width = false;\r\n    }\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n    if (*++p == '.')\r\n    {\r\n        /* Must get precision field width, if present. */\r\n        precision_width = 0U;\r\n        done            = 0U;\r\n        while (0U == done)\r\n        {\r\n            char c = *++p;\r\n            if ((c >= '0') && (c <= '9'))\r\n            {\r\n                precision_width = (precision_width * 10U) + ((uint32_t)c - (uint32_t)'0');\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n                if (NULL != valid_precision_width)\r\n                {\r\n                    *valid_precision_width = true;\r\n                }\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n            }\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n            else if (c == '*')\r\n            {\r\n                precision_width = (uint32_t)va_arg(*ap, uint32_t);\r\n                if (NULL != valid_precision_width)\r\n                {\r\n                    *valid_precision_width = true;\r\n                }\r\n            }\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n            else\r\n            {\r\n                /* We've gone one char too far. */\r\n                --p;\r\n                done = 1U;\r\n            }\r\n        }\r\n    }\r\n    else\r\n    {\r\n        /* We've gone one char too far. */\r\n        --p;\r\n    }\r\n    *s = p;\r\n    return precision_width;\r\n}\r\n\r\nstatic uint32_t PrintIsobpu(const char c)\r\n{\r\n    uint32_t ret = 0U;\r\n    if ((c == 'o') || (c == 'b') || (c == 'p') || (c == 'u'))\r\n    {\r\n        ret = 1U;\r\n    }\r\n    return ret;\r\n}\r\n\r\nstatic uint32_t PrintIsdi(const char c)\r\n{\r\n    uint32_t ret = 0U;\r\n    if ((c == 'd') || (c == 'i'))\r\n    {\r\n        ret = 1U;\r\n    }\r\n    return ret;\r\n}\r\n\r\nstatic void PrintOutputdifFobpu(uint32_t flags_used,\r\n                                uint32_t field_width,\r\n                                uint32_t vlen,\r\n                                char schar,\r\n                                char *vstrp,\r\n                                printfCb cb,\r\n                                char *buf,\r\n                                int32_t *count)\r\n{\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n    /* Do the ZERO pad. */\r\n    if (0U != (flags_used & (uint32_t)kPRINTF_Zero))\r\n    {\r\n        if ('\\0' != schar)\r\n        {\r\n            cb(buf, count, schar, 1);\r\n            schar = '\\0';\r\n        }\r\n        cb(buf, count, '0', (int)field_width - (int)vlen);\r\n        vlen = field_width;\r\n    }\r\n    else\r\n    {\r\n        if (0U == (flags_used & (uint32_t)kPRINTF_Minus))\r\n        {\r\n            cb(buf, count, ' ', (int)field_width - (int)vlen);\r\n            if ('\\0' != schar)\r\n            {\r\n                cb(buf, count, schar, 1);\r\n                schar = '\\0';\r\n            }\r\n        }\r\n    }\r\n    /* The string was built in reverse order, now display in correct order. */\r\n    if ('\\0' != schar)\r\n    {\r\n        cb(buf, count, schar, 1);\r\n    }\r\n#else\r\n    cb(buf, count, ' ', (int)field_width - (int)vlen);\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n    while ('\\0' != (*vstrp))\r\n    {\r\n        cb(buf, count, *vstrp--, 1);\r\n    }\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n    if (0U != (flags_used & (uint32_t)kPRINTF_Minus))\r\n    {\r\n        cb(buf, count, ' ', (int)field_width - (int)vlen);\r\n    }\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n}\r\n\r\nstatic void PrintOutputxX(uint32_t flags_used,\r\n                          uint32_t field_width,\r\n                          uint32_t vlen,\r\n                          bool use_caps,\r\n                          char *vstrp,\r\n                          printfCb cb,\r\n                          char *buf,\r\n                          int32_t *count)\r\n{\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n    uint8_t dschar = 0;\r\n    if (0U != (flags_used & (uint32_t)kPRINTF_Zero))\r\n    {\r\n        if (0U != (flags_used & (uint32_t)kPRINTF_Pound))\r\n        {\r\n            cb(buf, count, '0', 1);\r\n            cb(buf, count, (use_caps ? 'X' : 'x'), 1);\r\n            dschar = 1U;\r\n        }\r\n        cb(buf, count, '0', (int)field_width - (int)vlen);\r\n        vlen = field_width;\r\n    }\r\n    else\r\n    {\r\n        if (0U == (flags_used & (uint32_t)kPRINTF_Minus))\r\n        {\r\n            if (0U != (flags_used & (uint32_t)kPRINTF_Pound))\r\n            {\r\n                vlen += 2U;\r\n            }\r\n            cb(buf, count, ' ', (int)field_width - (int)vlen);\r\n            if (0U != (flags_used & (uint32_t)kPRINTF_Pound))\r\n            {\r\n                cb(buf, count, '0', 1);\r\n                cb(buf, count, (use_caps ? 'X' : 'x'), 1);\r\n                dschar = 1U;\r\n            }\r\n        }\r\n    }\r\n\r\n    if ((0U != (flags_used & (uint32_t)kPRINTF_Pound)) && (0U == dschar))\r\n    {\r\n        cb(buf, count, '0', 1);\r\n        cb(buf, count, (use_caps ? 'X' : 'x'), 1);\r\n        vlen += 2U;\r\n    }\r\n#else\r\n    cb(buf, count, ' ', (int)field_width - (int)vlen);\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n    while ('\\0' != (*vstrp))\r\n    {\r\n        cb(buf, count, *vstrp--, 1);\r\n    }\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n    if (0U != (flags_used & (uint32_t)kPRINTF_Minus))\r\n    {\r\n        cb(buf, count, ' ', (int)field_width - (int)vlen);\r\n    }\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n}\r\n\r\nstatic uint32_t PrintIsfF(const char c)\r\n{\r\n    uint32_t ret = 0U;\r\n    if ((c == 'f') || (c == 'F'))\r\n    {\r\n        ret = 1U;\r\n    }\r\n    return ret;\r\n}\r\n\r\nstatic uint32_t PrintIsxX(const char c)\r\n{\r\n    uint32_t ret = 0U;\r\n    if ((c == 'x') || (c == 'X'))\r\n    {\r\n        ret = 1U;\r\n    }\r\n    return ret;\r\n}\r\n\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\nstatic uint32_t PrintCheckFlags(const char **s)\r\n{\r\n    const char *p = *s;\r\n    /* First check for specification modifier flags. */\r\n    uint32_t flags_used = 0U;\r\n    bool done           = false;\r\n    while (false == done)\r\n    {\r\n        switch (*++p)\r\n        {\r\n            case '-':\r\n                flags_used |= (uint32_t)kPRINTF_Minus;\r\n                break;\r\n            case '+':\r\n                flags_used |= (uint32_t)kPRINTF_Plus;\r\n                break;\r\n            case ' ':\r\n                flags_used |= (uint32_t)kPRINTF_Space;\r\n                break;\r\n            case '0':\r\n                flags_used |= (uint32_t)kPRINTF_Zero;\r\n                break;\r\n            case '#':\r\n                flags_used |= (uint32_t)kPRINTF_Pound;\r\n                break;\r\n            default:\r\n                /* We've gone one char too far. */\r\n                --p;\r\n                done = true;\r\n                break;\r\n        }\r\n    }\r\n    *s = p;\r\n    return flags_used;\r\n}\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n/*\r\n * Check for the length modifier.\r\n */\r\nstatic uint32_t PrintGetLengthFlag(const char **s)\r\n{\r\n    const char *p = *s;\r\n    /* First check for specification modifier flags. */\r\n    uint32_t flags_used = 0U;\r\n\r\n    switch (/* c = */ *++p)\r\n    {\r\n        case 'h':\r\n            if (*++p != 'h')\r\n            {\r\n                flags_used |= (uint32_t)kPRINTF_LengthShortInt;\r\n                --p;\r\n            }\r\n            else\r\n            {\r\n                flags_used |= (uint32_t)kPRINTF_LengthChar;\r\n            }\r\n            break;\r\n        case 'l':\r\n            if (*++p != 'l')\r\n            {\r\n                flags_used |= (uint32_t)kPRINTF_LengthLongInt;\r\n                --p;\r\n            }\r\n            else\r\n            {\r\n                flags_used |= (uint32_t)kPRINTF_LengthLongLongInt;\r\n            }\r\n            break;\r\n        case 'z':\r\n            if (sizeof(size_t) == sizeof(uint32_t))\r\n            {\r\n                flags_used |= (uint32_t)kPRINTF_LengthLongInt;\r\n            }\r\n            else if (sizeof(size_t) == (2U * sizeof(uint32_t)))\r\n            {\r\n                flags_used |= (uint32_t)kPRINTF_LengthLongLongInt;\r\n            }\r\n            else if (sizeof(size_t) == sizeof(uint16_t))\r\n            {\r\n                flags_used |= (uint32_t)kPRINTF_LengthShortInt;\r\n            }\r\n            else\r\n            {\r\n                /* MISRA C-2012 Rule 15.7 */\r\n            }\r\n            break;\r\n        default:\r\n            /* we've gone one char too far */\r\n            --p;\r\n            break;\r\n    }\r\n    *s = p;\r\n    return flags_used;\r\n}\r\n#else\r\nstatic void PrintFilterLengthFlag(const char **s)\r\n{\r\n    const char *p = *s;\r\n    char strCh;\r\n\r\n    do\r\n    {\r\n        strCh = *++p;\r\n    } while ((strCh == 'h') || (strCh == 'l'));\r\n\r\n    *s = --p;\r\n}\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n\r\nstatic uint8_t PrintGetRadixFromobpu(const char c)\r\n{\r\n    uint8_t radix;\r\n\r\n    if (c == 'o')\r\n    {\r\n        radix = 8U;\r\n    }\r\n    else if (c == 'b')\r\n    {\r\n        radix = 2U;\r\n    }\r\n    else if (c == 'p')\r\n    {\r\n        radix = 16U;\r\n    }\r\n    else\r\n    {\r\n        radix = 10U;\r\n    }\r\n    return radix;\r\n}\r\n\r\nstatic uint32_t ScanIsWhiteSpace(const char c)\r\n{\r\n    uint32_t ret = 0U;\r\n    if ((c == ' ') || (c == '\\t') || (c == '\\n') || (c == '\\r') || (c == '\\v') || (c == '\\f'))\r\n    {\r\n        ret = 1U;\r\n    }\r\n    return ret;\r\n}\r\n\r\nstatic uint32_t ScanIgnoreWhiteSpace(const char **s)\r\n{\r\n    uint32_t count = 0U;\r\n    char c;\r\n\r\n    c = **s;\r\n    while (1U == ScanIsWhiteSpace(c))\r\n    {\r\n        count++;\r\n        (*s)++;\r\n        c = **s;\r\n    }\r\n    return count;\r\n}\r\n\r\nstatic int32_t ConvertRadixNumToString(char *numstr, void *nump, unsigned int neg, unsigned int radix, bool use_caps)\r\n{\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n    long long int a;\r\n    long long int b;\r\n    long long int c;\r\n\r\n    unsigned long long int ua;\r\n    unsigned long long int ub;\r\n    unsigned long long int uc;\r\n    unsigned long long int uc_param;\r\n#else\r\n    int a;\r\n    int b;\r\n    int c;\r\n\r\n    unsigned int ua;\r\n    unsigned int ub;\r\n    unsigned int uc;\r\n    unsigned int uc_param;\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n\r\n    int32_t nlen;\r\n    char *nstrp;\r\n\r\n    nlen     = 0;\r\n    nstrp    = numstr;\r\n    *nstrp++ = '\\0';\r\n\r\n#if !(defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0u))\r\n    neg = 0U;\r\n#endif\r\n\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n    a        = 0;\r\n    b        = 0;\r\n    c        = 0;\r\n    ua       = 0ULL;\r\n    ub       = 0ULL;\r\n    uc       = 0ULL;\r\n    uc_param = 0ULL;\r\n#else\r\n    a        = 0;\r\n    b        = 0;\r\n    c        = 0;\r\n    ua       = 0U;\r\n    ub       = 0U;\r\n    uc       = 0U;\r\n    uc_param = 0U;\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n\r\n    (void)a;\r\n    (void)b;\r\n    (void)c;\r\n    (void)ua;\r\n    (void)ub;\r\n    (void)uc;\r\n    (void)uc_param;\r\n    (void)neg;\r\n    /*\r\n     * Fix MISRA issue: CID 15972928 (#15 of 15): MISRA C-2012 Control Flow Expressions (MISRA C-2012 Rule 14.3)\r\n     * misra_c_2012_rule_14_3_violation: Execution cannot reach this statement: a = *((int *)nump);\r\n     */\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n    if (0U != neg)\r\n    {\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n        a = *(long long int *)nump;\r\n#else\r\n        a = *(int *)nump;\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n        if (a == 0)\r\n        {\r\n            *nstrp = '0';\r\n            ++nlen;\r\n            return nlen;\r\n        }\r\n        while (a != 0)\r\n        {\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n            b = (long long int)a / (long long int)radix;\r\n            c = (long long int)a - ((long long int)b * (long long int)radix);\r\n            if (c < 0)\r\n            {\r\n                uc       = (unsigned long long int)c;\r\n                uc_param = ~uc;\r\n                c        = (long long int)uc_param + 1 + (long long int)'0';\r\n            }\r\n#else\r\n            b = (int)a / (int)radix;\r\n            c = (int)a - ((int)b * (int)radix);\r\n            if (c < 0)\r\n            {\r\n                uc       = (unsigned int)c;\r\n                uc_param = ~uc;\r\n                c        = (int)uc_param + 1 + (int)'0';\r\n            }\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n            else\r\n            {\r\n                c = c + (int)'0';\r\n            }\r\n            a        = b;\r\n            *nstrp++ = (char)c;\r\n            ++nlen;\r\n        }\r\n    }\r\n    else\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n    {\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n        ua = *(unsigned long long int *)nump;\r\n#else\r\n        ua = *(unsigned int *)nump;\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n        if (ua == 0U)\r\n        {\r\n            *nstrp = '0';\r\n            ++nlen;\r\n            return nlen;\r\n        }\r\n        while (ua != 0U)\r\n        {\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n            ub = (unsigned long long int)ua / (unsigned long long int)radix;\r\n            uc = (unsigned long long int)ua - ((unsigned long long int)ub * (unsigned long long int)radix);\r\n#else\r\n            ub = ua / (unsigned int)radix;\r\n            uc = ua - (ub * (unsigned int)radix);\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n\r\n            if (uc < 10U)\r\n            {\r\n                uc = uc + (unsigned int)'0';\r\n            }\r\n            else\r\n            {\r\n                uc = uc - 10U + (unsigned int)(use_caps ? 'A' : 'a');\r\n            }\r\n            ua       = ub;\r\n            *nstrp++ = (char)uc;\r\n            ++nlen;\r\n        }\r\n    }\r\n    return nlen;\r\n}\r\n\r\n#if (defined(PRINTF_FLOAT_ENABLE) && (PRINTF_FLOAT_ENABLE > 0U))\r\nstatic int32_t ConvertFloatRadixNumToString(char *numstr, void *nump, int32_t radix, uint32_t precision_width)\r\n{\r\n    int32_t a;\r\n    int32_t b;\r\n    int32_t c;\r\n    int32_t i;\r\n    uint32_t uc;\r\n    double fa;\r\n    double dc;\r\n    double fb;\r\n    double r;\r\n    double fractpart;\r\n    double intpart;\r\n\r\n    int32_t nlen;\r\n    char *nstrp;\r\n    nlen     = 0;\r\n    nstrp    = numstr;\r\n    *nstrp++ = '\\0';\r\n    r        = *(double *)nump;\r\n    if (0.0 == r)\r\n    {\r\n        *nstrp = '0';\r\n        ++nlen;\r\n        return nlen;\r\n    }\r\n    fractpart = modf((double)r, (double *)&intpart);\r\n    /* Process fractional part. */\r\n    for (i = 0; i < (int32_t)precision_width; i++)\r\n    {\r\n        fractpart *= (double)radix;\r\n    }\r\n    if (r >= (double)0.0)\r\n    {\r\n        fa = fractpart + (double)0.5;\r\n        if (fa >= pow((double)10, (double)precision_width))\r\n        {\r\n            intpart++;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        fa = fractpart - (double)0.5;\r\n        if (fa <= -pow((double)10, (double)precision_width))\r\n        {\r\n            intpart--;\r\n        }\r\n    }\r\n    for (i = 0; i < (int32_t)precision_width; i++)\r\n    {\r\n        fb = fa / (double)radix;\r\n        dc = (fa - (double)(long long int)fb * (double)radix);\r\n        c  = (int32_t)dc;\r\n        if (c < 0)\r\n        {\r\n            uc = (uint32_t)c;\r\n            uc = ~uc;\r\n            c  = (int32_t)uc;\r\n            c += (int32_t)1;\r\n            c += (int32_t)'0';\r\n        }\r\n        else\r\n        {\r\n            c = c + '0';\r\n        }\r\n        fa       = fb;\r\n        *nstrp++ = (char)c;\r\n        ++nlen;\r\n    }\r\n    *nstrp++ = (char)'.';\r\n    ++nlen;\r\n    a = (int32_t)intpart;\r\n    if (a == 0)\r\n    {\r\n        *nstrp++ = '0';\r\n        ++nlen;\r\n    }\r\n    else\r\n    {\r\n        while (a != 0)\r\n        {\r\n            b = (int32_t)a / (int32_t)radix;\r\n            c = (int32_t)a - ((int32_t)b * (int32_t)radix);\r\n            if (c < 0)\r\n            {\r\n                uc = (uint32_t)c;\r\n                uc = ~uc;\r\n                c  = (int32_t)uc;\r\n                c += (int32_t)1;\r\n                c += (int32_t)'0';\r\n            }\r\n            else\r\n            {\r\n                c = c + '0';\r\n            }\r\n            a        = b;\r\n            *nstrp++ = (char)c;\r\n            ++nlen;\r\n        }\r\n    }\r\n    return nlen;\r\n}\r\n#endif /* PRINTF_FLOAT_ENABLE */\r\n\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\nstatic void StrFormatExaminedi(uint32_t *flags_used, long long int *ival, va_list *ap)\r\n#else\r\nstatic void StrFormatExaminedi(int *ival, va_list *ap)\r\n#endif\r\n{\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n    if (0U != (*flags_used & (uint32_t)kPRINTF_LengthLongLongInt))\r\n    {\r\n        *ival = (long long int)va_arg(*ap, long long int);\r\n    }\r\n    else if (0U != (*flags_used & (uint32_t)kPRINTF_LengthLongInt))\r\n    {\r\n        *ival = (long long int)va_arg(*ap, long int);\r\n    }\r\n    else\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n    {\r\n        *ival = (STR_FORMAT_PRINTF_IVAL_TYPE)va_arg(*ap, int);\r\n    }\r\n}\r\n\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\nstatic void StrFormatExaminexX(uint32_t *flags_used, unsigned long long int *uval, va_list *ap)\r\n#else\r\nstatic void StrFormatExaminexX(unsigned int *uval, va_list *ap)\r\n#endif\r\n{\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n    if (0U != (*flags_used & (unsigned int)kPRINTF_LengthLongLongInt))\r\n    {\r\n        *uval = (unsigned long long int)va_arg(*ap, unsigned long long int);\r\n    }\r\n    else if (0U != (*flags_used & (unsigned int)kPRINTF_LengthLongInt))\r\n    {\r\n        *uval = (unsigned long long int)va_arg(*ap, unsigned long int);\r\n    }\r\n    else\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n    {\r\n        *uval = (STR_FORMAT_PRINTF_UVAL_TYPE)va_arg(*ap, unsigned int);\r\n    }\r\n}\r\n\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\nstatic void StrFormatExamineobpu(uint32_t *flags_used, unsigned long long int *uval, va_list *ap)\r\n#else\r\nstatic void StrFormatExamineobpu(unsigned int *uval, va_list *ap)\r\n#endif\r\n{\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n    if (0U != (*flags_used & (unsigned int)kPRINTF_LengthLongLongInt))\r\n    {\r\n        *uval = (unsigned long long int)va_arg(*ap, unsigned long long int);\r\n    }\r\n    else if (0U != (*flags_used & (unsigned int)kPRINTF_LengthLongInt))\r\n    {\r\n        *uval = (unsigned long long int)va_arg(*ap, unsigned long int);\r\n    }\r\n    else\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n    {\r\n        *uval = (STR_FORMAT_PRINTF_UVAL_TYPE)va_arg(*ap, unsigned int);\r\n    }\r\n}\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\nstatic int32_t ConvertPrecisionWidthToLength(bool valid_precision_width, uint32_t precision_width, char *sval)\r\n#else\r\nstatic int32_t ConvertPrecisionWidthToLength(char *sval)\r\n#endif\r\n{\r\n    int32_t vlen = 0;\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n    if (valid_precision_width)\r\n    {\r\n        vlen = (int)precision_width;\r\n    }\r\n    else\r\n    {\r\n        vlen = (int)strlen(sval);\r\n    }\r\n#else\r\n    vlen = (int32_t)strlen(sval);\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n\r\n    return vlen;\r\n}\r\n\r\n/*!\r\n * brief This function outputs its parameters according to a formatted string.\r\n *\r\n * note I/O is performed by calling given function pointer using following\r\n * (*func_ptr)(c);\r\n *\r\n * param[in] fmt   Format string for printf.\r\n * param[in] ap    Arguments to printf.\r\n * param[in] buf  pointer to the buffer\r\n * param cb print callback function pointer\r\n *\r\n * return Number of characters to be print\r\n */\r\nint StrFormatPrintf(const char *fmt, va_list ap, char *buf, printfCb cb)\r\n{\r\n    /* va_list ap; */\r\n    const char *p;\r\n    char c;\r\n\r\n    char vstr[33];\r\n    char *vstrp  = NULL;\r\n    int32_t vlen = 0;\r\n\r\n    int32_t count = 0;\r\n\r\n    uint32_t field_width;\r\n    uint32_t precision_width;\r\n    char *sval;\r\n    int32_t cval;\r\n    bool use_caps;\r\n    unsigned int radix = 0;\r\n\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n    uint32_t flags_used;\r\n    char schar;\r\n    long long int ival;\r\n    unsigned long long int uval = 0;\r\n    bool valid_precision_width;\r\n#else\r\n    int ival;\r\n    unsigned int uval = 0;\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n\r\n#if (defined(PRINTF_FLOAT_ENABLE) && (PRINTF_FLOAT_ENABLE > 0U))\r\n    double fval;\r\n#endif /* PRINTF_FLOAT_ENABLE */\r\n\r\n    /* Start parsing apart the format string and display appropriate formats and data. */\r\n    p = fmt;\r\n    while (true)\r\n    {\r\n        if ('\\0' == *p)\r\n        {\r\n            break;\r\n        }\r\n        c = *p;\r\n        /*\r\n         * All formats begin with a '%' marker.  Special chars like\r\n         * '\\n' or '\\t' are normally converted to the appropriate\r\n         * character by the __compiler__.  Thus, no need for this\r\n         * routine to account for the '\\' character.\r\n         */\r\n        if (c != '%')\r\n        {\r\n            cb(buf, &count, c, 1);\r\n            p++;\r\n            /* By using 'continue', the next iteration of the loop is used, skipping the code that follows. */\r\n            continue;\r\n        }\r\n\r\n        use_caps = true;\r\n\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n        /* First check for specification modifier flags. */\r\n        flags_used = PrintCheckFlags(&p);\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n\r\n        /* Next check for minimum field width. */\r\n        field_width = PrintGetWidth(&p, &ap);\r\n\r\n        /* Next check for the width and precision field separator. */\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n        precision_width = PrintGetPrecision(&p, &ap, &valid_precision_width);\r\n#else\r\n        precision_width = PrintGetPrecision(&p, &ap, NULL);\r\n        (void)precision_width;\r\n#endif\r\n\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n        /* Check for the length modifier. */\r\n        flags_used |= PrintGetLengthFlag(&p);\r\n#else\r\n        /* Filter length modifier. */\r\n        PrintFilterLengthFlag(&p);\r\n#endif\r\n\r\n        /* Now we're ready to examine the format. */\r\n        c = *++p;\r\n        {\r\n            if (1U == PrintIsdi(c))\r\n            {\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n                StrFormatExaminedi(&flags_used, &ival, &ap);\r\n#else\r\n                StrFormatExaminedi(&ival, &ap);\r\n#endif\r\n\r\n                vlen  = ConvertRadixNumToString((char *)vstr, (void *)&ival, 1, 10, use_caps);\r\n                vstrp = &vstr[vlen];\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n                vlen += (int)PrintGetSignChar(ival, flags_used, &schar);\r\n                PrintOutputdifFobpu(flags_used, field_width, (unsigned int)vlen, schar, vstrp, cb, buf, &count);\r\n#else\r\n                PrintOutputdifFobpu(0U, field_width, (unsigned int)vlen, '\\0', vstrp, cb, buf, &count);\r\n#endif\r\n            }\r\n            else if (1U == PrintIsfF(c))\r\n            {\r\n#if (defined(PRINTF_FLOAT_ENABLE) && (PRINTF_FLOAT_ENABLE > 0U))\r\n                fval  = (double)va_arg(ap, double);\r\n                vlen  = ConvertFloatRadixNumToString(vstr, &fval, 10, precision_width);\r\n                vstrp = &vstr[vlen];\r\n\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n                vlen += (int32_t)PrintGetSignChar(((fval < 0.0) ? ((long long int)-1) : ((long long int)fval)),\r\n                                                  flags_used, &schar);\r\n                PrintOutputdifFobpu(flags_used, field_width, (unsigned int)vlen, schar, vstrp, cb, buf, &count);\r\n#else\r\n                PrintOutputdifFobpu(0, field_width, (unsigned int)vlen, '\\0', vstrp, cb, buf, &count);\r\n#endif\r\n\r\n#else\r\n                (void)va_arg(ap, double);\r\n#endif /* PRINTF_FLOAT_ENABLE */\r\n            }\r\n            else if (1U == PrintIsxX(c))\r\n            {\r\n                if (c == 'x')\r\n                {\r\n                    use_caps = false;\r\n                }\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n                StrFormatExaminexX(&flags_used, &uval, &ap);\r\n#else\r\n                StrFormatExaminexX(&uval, &ap);\r\n#endif\r\n\r\n                vlen  = ConvertRadixNumToString((char *)vstr, (void *)&uval, 0, 16, use_caps);\r\n                vstrp = &vstr[vlen];\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n                PrintOutputxX(flags_used, field_width, (unsigned int)vlen, use_caps, vstrp, cb, buf, &count);\r\n#else\r\n                PrintOutputxX(0U, field_width, (uint32_t)vlen, use_caps, vstrp, cb, buf, &count);\r\n#endif\r\n            }\r\n            else if (1U == PrintIsobpu(c))\r\n            {\r\n                if ('p' == c)\r\n                {\r\n                    /*\r\n                     * Fix MISRA issue: CID 17205581 (#15 of 15): MISRA C-2012 Pointer Type Conversions (MISRA C-2012\r\n                     * Rule 11.6) 1.misra_c_2012_rule_11_6_violation: The expression va_arg (ap, void *) of type void *\r\n                     * is cast to type uint32_t.\r\n                     *\r\n                     * Orignal code: uval = (STR_FORMAT_PRINTF_UVAL_TYPE)(uint32_t)va_arg(ap, void *);\r\n                     */\r\n                    void *pval;\r\n                    pval = (void *)va_arg(ap, void *);\r\n                    (void)memcpy((void *)&uval, (void *)&pval, sizeof(void *));\r\n                }\r\n                else\r\n                {\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n                    StrFormatExamineobpu(&flags_used, &uval, &ap);\r\n#else\r\n                    StrFormatExamineobpu(&uval, &ap);\r\n#endif\r\n                }\r\n\r\n                radix = PrintGetRadixFromobpu(c);\r\n\r\n                vlen  = ConvertRadixNumToString((char *)vstr, (void *)&uval, 0, radix, use_caps);\r\n                vstrp = &vstr[vlen];\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n                PrintOutputdifFobpu(flags_used, field_width, (unsigned int)vlen, '\\0', vstrp, cb, buf, &count);\r\n#else\r\n                PrintOutputdifFobpu(0U, field_width, (uint32_t)vlen, '\\0', vstrp, cb, buf, &count);\r\n#endif\r\n            }\r\n            else if (c == 'c')\r\n            {\r\n                cval = (int32_t)va_arg(ap, int);\r\n                cb(buf, &count, cval, 1);\r\n            }\r\n            else if (c == 's')\r\n            {\r\n                sval = (char *)va_arg(ap, char *);\r\n                if (NULL != sval)\r\n                {\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n                    vlen = ConvertPrecisionWidthToLength(valid_precision_width, precision_width, sval);\r\n#else\r\n                    vlen = ConvertPrecisionWidthToLength(sval);\r\n#endif\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n                    if (0U == (flags_used & (unsigned int)kPRINTF_Minus))\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n                    {\r\n                        cb(buf, &count, ' ', (int)field_width - (int)vlen);\r\n                    }\r\n\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n                    if (valid_precision_width)\r\n                    {\r\n                        while (('\\0' != *sval) && (vlen > 0))\r\n                        {\r\n                            cb(buf, &count, *sval++, 1);\r\n                            vlen--;\r\n                        }\r\n                        /* In case that vlen sval is shorter than vlen */\r\n                        vlen = (int)precision_width - vlen;\r\n                    }\r\n                    else\r\n                    {\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n                        while ('\\0' != (*sval))\r\n                        {\r\n                            cb(buf, &count, *sval++, 1);\r\n                        }\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n                    }\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n                    if (0U != (flags_used & (unsigned int)kPRINTF_Minus))\r\n                    {\r\n                        cb(buf, &count, ' ', (int)field_width - vlen);\r\n                    }\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n                }\r\n            }\r\n            else\r\n            {\r\n                cb(buf, &count, c, 1);\r\n            }\r\n        }\r\n        p++;\r\n    }\r\n\r\n    return (int)count;\r\n}\r\n\r\n#if (defined(SCANF_FLOAT_ENABLE) && (SCANF_FLOAT_ENABLE > 0U))\r\nstatic uint8_t StrFormatScanIsFloat(char *c)\r\n{\r\n    uint8_t ret = 0U;\r\n    if (('a' == (*c)) || ('A' == (*c)) || ('e' == (*c)) || ('E' == (*c)) || ('f' == (*c)) || ('F' == (*c)) ||\r\n        ('g' == (*c)) || ('G' == (*c)))\r\n    {\r\n        ret = 1U;\r\n    }\r\n    return ret;\r\n}\r\n#endif\r\n\r\nstatic uint8_t StrFormatScanIsFormatStarting(char *c)\r\n{\r\n    uint8_t ret = 1U;\r\n    if ((*c != '%'))\r\n    {\r\n        ret = 0U;\r\n    }\r\n    else if (*(c + 1) == '%')\r\n    {\r\n        ret = 0U;\r\n    }\r\n    else\r\n    {\r\n        /*MISRA rule 15.7*/\r\n    }\r\n\r\n    return ret;\r\n}\r\n\r\nstatic uint8_t StrFormatScanGetBase(uint8_t base, const char *s)\r\n{\r\n    if (base == 0U)\r\n    {\r\n        if (s[0] == '0')\r\n        {\r\n            if ((s[1] == 'x') || (s[1] == 'X'))\r\n            {\r\n                base = 16;\r\n            }\r\n            else\r\n            {\r\n                base = 8;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            base = 10;\r\n        }\r\n    }\r\n    return base;\r\n}\r\n\r\nstatic uint8_t StrFormatScanCheckSymbol(const char *p, int8_t *neg)\r\n{\r\n    uint8_t len;\r\n    switch (*p)\r\n    {\r\n        case '-':\r\n            *neg = -1;\r\n            len  = 1;\r\n            break;\r\n        case '+':\r\n            *neg = 1;\r\n            len  = 1;\r\n            break;\r\n        default:\r\n            *neg = 1;\r\n            len  = 0;\r\n            break;\r\n    }\r\n    return len;\r\n}\r\n\r\nstatic uint8_t StrFormatScanFillInteger(uint32_t flag, va_list *args_ptr, int32_t val)\r\n{\r\n#if (defined(SCANF_ADVANCED_ENABLE) && (SCANF_ADVANCED_ENABLE > 0U))\r\n    if (0U != (flag & (uint32_t)kSCANF_Suppress))\r\n    {\r\n        return 0u;\r\n    }\r\n\r\n    switch (flag & (uint32_t)kSCANF_LengthMask)\r\n    {\r\n        case (uint32_t)kSCANF_LengthChar:\r\n            if (0U != (flag & (uint32_t)kSCANF_TypeSinged))\r\n            {\r\n                *va_arg(*args_ptr, signed char *) = (signed char)val;\r\n            }\r\n            else\r\n            {\r\n                *va_arg(*args_ptr, unsigned char *) = (unsigned char)val;\r\n            }\r\n            break;\r\n        case (uint32_t)kSCANF_LengthShortInt:\r\n            if (0U != (flag & (uint32_t)kSCANF_TypeSinged))\r\n            {\r\n                *va_arg(*args_ptr, signed short *) = (signed short)val;\r\n            }\r\n            else\r\n            {\r\n                *va_arg(*args_ptr, unsigned short *) = (unsigned short)val;\r\n            }\r\n            break;\r\n        case (uint32_t)kSCANF_LengthLongInt:\r\n            if (0U != (flag & (uint32_t)kSCANF_TypeSinged))\r\n            {\r\n                *va_arg(*args_ptr, signed long int *) = (signed long int)val;\r\n            }\r\n            else\r\n            {\r\n                *va_arg(*args_ptr, unsigned long int *) = (unsigned long int)val;\r\n            }\r\n            break;\r\n        case (uint32_t)kSCANF_LengthLongLongInt:\r\n            if (0U != (flag & (uint32_t)kSCANF_TypeSinged))\r\n            {\r\n                *va_arg(*args_ptr, signed long long int *) = (signed long long int)val;\r\n            }\r\n            else\r\n            {\r\n                *va_arg(*args_ptr, unsigned long long int *) = (unsigned long long int)val;\r\n            }\r\n            break;\r\n        default:\r\n            /* The default type is the type int. */\r\n            if (0U != (flag & (uint32_t)kSCANF_TypeSinged))\r\n            {\r\n                *va_arg(*args_ptr, signed int *) = (signed int)val;\r\n            }\r\n            else\r\n            {\r\n                *va_arg(*args_ptr, unsigned int *) = (unsigned int)val;\r\n            }\r\n            break;\r\n    }\r\n#else\r\n    /* The default type is the type int. */\r\n    if (0U != (flag & (uint32_t)kSCANF_TypeSinged))\r\n    {\r\n        *va_arg(*args_ptr, signed int *) = (signed int)val;\r\n    }\r\n    else\r\n    {\r\n        *va_arg(*args_ptr, unsigned int *) = (unsigned int)val;\r\n    }\r\n#endif /* SCANF_ADVANCED_ENABLE */\r\n\r\n    return 1U;\r\n}\r\n\r\n#if (defined(SCANF_FLOAT_ENABLE) && (SCANF_FLOAT_ENABLE > 0U))\r\nstatic uint8_t StrFormatScanFillFloat(uint32_t flag, va_list *args_ptr, double fnum)\r\n{\r\n#if (defined(SCANF_ADVANCED_ENABLE) && (SCANF_ADVANCED_ENABLE > 0U))\r\n    if (0U != (flag & (uint32_t)kSCANF_Suppress))\r\n    {\r\n        return 0U;\r\n    }\r\n    else\r\n#endif /* SCANF_ADVANCED_ENABLE */\r\n    {\r\n        if (0U != (flag & (uint32_t)kSCANF_LengthLongLongDouble))\r\n        {\r\n            *va_arg(*args_ptr, double *) = fnum;\r\n        }\r\n        else\r\n        {\r\n            *va_arg(*args_ptr, float *) = (float)fnum;\r\n        }\r\n        return 1U;\r\n    }\r\n}\r\n#endif /* SCANF_FLOAT_ENABLE */\r\n\r\n#if (defined(SCANF_ADVANCED_ENABLE) && (SCANF_ADVANCED_ENABLE > 0U))\r\nstatic uint8_t strFormatScanfHandleh(uint8_t exitPending, char **c, uint32_t *flag)\r\n{\r\n    if (0U != ((*flag) & (uint32_t)kSCANF_LengthMask))\r\n    {\r\n        /* Match failure. */\r\n        exitPending = 1U;\r\n    }\r\n    else\r\n    {\r\n        if ((*c)[1] == 'h')\r\n        {\r\n            (*flag) |= (uint32_t)kSCANF_LengthChar;\r\n            *c = *c + 1U;\r\n        }\r\n        else\r\n        {\r\n            (*flag) |= (uint32_t)kSCANF_LengthShortInt;\r\n        }\r\n    }\r\n\r\n    return exitPending;\r\n}\r\n\r\nstatic uint8_t strFormatScanfHandlel(uint8_t exitPending, char **c, uint32_t *flag)\r\n{\r\n    if (0U != ((*flag) & (uint32_t)kSCANF_LengthMask))\r\n    {\r\n        /* Match failure. */\r\n        exitPending = 1U;\r\n    }\r\n    else\r\n    {\r\n        if ((*c)[1] == 'l')\r\n        {\r\n            (*flag) |= (uint32_t)kSCANF_LengthLongLongInt;\r\n            *c = *c + 1U;\r\n        }\r\n        else\r\n        {\r\n            (*flag) |= (uint32_t)kSCANF_LengthLongInt;\r\n        }\r\n    }\r\n\r\n    return exitPending;\r\n}\r\n#endif\r\n\r\nstatic uint8_t StrFormatScanfStringHandling(char **str, uint32_t *flag, uint32_t *field_width, uint8_t *base)\r\n{\r\n    uint8_t exitPending = 0U;\r\n    char *c             = *str;\r\n\r\n    /* Loop to get full conversion specification. */\r\n    while (('\\0' != (*c)) && (0U == (*flag & (uint32_t)kSCANF_DestMask)))\r\n    {\r\n#if (defined(SCANF_ADVANCED_ENABLE) && (SCANF_ADVANCED_ENABLE > 0U))\r\n        if ('*' == (*c))\r\n        {\r\n            if (0U != ((*flag) & (uint32_t)kSCANF_Suppress))\r\n            {\r\n                /* Match failure. */\r\n                exitPending = 1U;\r\n            }\r\n            else\r\n            {\r\n                (*flag) |= (uint32_t)kSCANF_Suppress;\r\n            }\r\n        }\r\n        else if ('h' == (*c))\r\n        {\r\n            exitPending = strFormatScanfHandleh(exitPending, &c, flag);\r\n        }\r\n        else if ('l' == (*c))\r\n        {\r\n            exitPending = strFormatScanfHandlel(exitPending, &c, flag);\r\n        }\r\n        else\r\n#endif /* SCANF_ADVANCED_ENABLE */\r\n#if (defined(SCANF_FLOAT_ENABLE) && (SCANF_FLOAT_ENABLE > 0U))\r\n            if ('L' == (*c))\r\n        {\r\n            if (0U != ((*flag) & (uint32_t)kSCANF_LengthMask))\r\n            {\r\n                /* Match failure. */\r\n                exitPending = 1U;\r\n            }\r\n            else\r\n            {\r\n                (*flag) |= (uint32_t)kSCANF_LengthLongLongDouble;\r\n            }\r\n        }\r\n        else\r\n#endif /* SCANF_FLOAT_ENABLE */\r\n            if (((*c) >= '0') && ((*c) <= '9'))\r\n            {\r\n                {\r\n                    char *p;\r\n                    errno          = 0;\r\n                    (*field_width) = strtoul(c, &p, 10);\r\n                    if (0 != errno)\r\n                    {\r\n                        *field_width = 0U;\r\n                    }\r\n                    c = p - 1;\r\n                }\r\n            }\r\n            else if ('d' == (*c))\r\n            {\r\n                (*base) = 10U;\r\n                (*flag) |= (uint32_t)kSCANF_TypeSinged;\r\n                (*flag) |= (uint32_t)kSCANF_DestInt;\r\n            }\r\n            else if ('u' == (*c))\r\n            {\r\n                (*base) = 10U;\r\n                (*flag) |= (uint32_t)kSCANF_DestInt;\r\n            }\r\n            else if ('o' == (*c))\r\n            {\r\n                (*base) = 8U;\r\n                (*flag) |= (uint32_t)kSCANF_DestInt;\r\n            }\r\n            else if (('x' == (*c)))\r\n            {\r\n                (*base) = 16U;\r\n                (*flag) |= (uint32_t)kSCANF_DestInt;\r\n            }\r\n            else if ('X' == (*c))\r\n            {\r\n                (*base) = 16U;\r\n                (*flag) |= (uint32_t)kSCANF_DestInt;\r\n            }\r\n            else if ('i' == (*c))\r\n            {\r\n                (*base) = 0U;\r\n                (*flag) |= (uint32_t)kSCANF_DestInt;\r\n            }\r\n#if (defined(SCANF_FLOAT_ENABLE) && (SCANF_FLOAT_ENABLE > 0U))\r\n            else if (1U == StrFormatScanIsFloat(c))\r\n            {\r\n                (*flag) |= (uint32_t)kSCANF_DestFloat;\r\n            }\r\n#endif /* SCANF_FLOAT_ENABLE */\r\n            else if ('c' == (*c))\r\n            {\r\n                (*flag) |= (uint32_t)kSCANF_DestChar;\r\n                if (MAX_FIELD_WIDTH == (*field_width))\r\n                {\r\n                    (*field_width) = 1;\r\n                }\r\n            }\r\n            else if ('s' == (*c))\r\n            {\r\n                (*flag) |= (uint32_t)kSCANF_DestString;\r\n            }\r\n            else\r\n            {\r\n                exitPending = 1U;\r\n            }\r\n\r\n        if (1U == exitPending)\r\n        {\r\n            break;\r\n        }\r\n        else\r\n        {\r\n            c++;\r\n        }\r\n    }\r\n    *str = c;\r\n    return exitPending;\r\n}\r\n\r\nstatic void StrFormatScanfHandleChar(\r\n    const char **Cp, uint32_t *field_width, char **buf, uint32_t flag, uint32_t *n_decode, uint32_t *nassigned)\r\n{\r\n#if (defined(SCANF_ADVANCED_ENABLE) && (SCANF_ADVANCED_ENABLE > 0U))\r\n    uint8_t added = 0;\r\n#endif\r\n    while ((0U != ((*field_width)--))\r\n#if (defined(SCANF_ADVANCED_ENABLE) && (SCANF_ADVANCED_ENABLE > 0U))\r\n           && ('\\0' != (**Cp))\r\n#endif\r\n    )\r\n    {\r\n#if (defined(SCANF_ADVANCED_ENABLE) && (SCANF_ADVANCED_ENABLE > 0U))\r\n        if (0U != (flag & (uint32_t)kSCANF_Suppress))\r\n        {\r\n            (*Cp) = (*Cp) + 1U;\r\n        }\r\n        else\r\n#endif\r\n        {\r\n            **buf  = **Cp;\r\n            (*Cp)  = (*Cp) + 1U;\r\n            (*buf) = (*buf) + 1U;\r\n\r\n#if (defined(SCANF_ADVANCED_ENABLE) && (SCANF_ADVANCED_ENABLE > 0U))\r\n            added = 1u;\r\n#endif\r\n        }\r\n        *n_decode = *n_decode + 1U;\r\n    }\r\n\r\n#if (defined(SCANF_ADVANCED_ENABLE) && (SCANF_ADVANCED_ENABLE > 0U))\r\n    if (1u == added)\r\n#endif\r\n    {\r\n        *nassigned = *nassigned + 1U;\r\n    }\r\n}\r\n\r\nstatic void StrFormatScanfHandleString(\r\n    const char **Sp, uint32_t *field_width, char **buf, uint32_t flag, uint32_t *n_decode, uint32_t *nassigned)\r\n{\r\n#if (defined(SCANF_ADVANCED_ENABLE) && (SCANF_ADVANCED_ENABLE > 0U))\r\n    uint8_t added = 0;\r\n#endif\r\n    while ((0U != ((*field_width)--)) && (**Sp != '\\0') && (0U == ScanIsWhiteSpace(**Sp)))\r\n    {\r\n#if (defined(SCANF_ADVANCED_ENABLE) && (SCANF_ADVANCED_ENABLE > 0U))\r\n        if (0U != (flag & (uint32_t)kSCANF_Suppress))\r\n        {\r\n            (*Sp) = (*Sp) + 1U;\r\n        }\r\n        else\r\n#endif\r\n        {\r\n            **buf  = **Sp;\r\n            (*buf) = (*buf) + 1U;\r\n            (*Sp)  = (*Sp) + 1U;\r\n#if (defined(SCANF_ADVANCED_ENABLE) && (SCANF_ADVANCED_ENABLE > 0U))\r\n            added = 1u;\r\n#endif\r\n        }\r\n        *n_decode = *n_decode + 1U;\r\n    }\r\n\r\n#if (defined(SCANF_ADVANCED_ENABLE) && (SCANF_ADVANCED_ENABLE > 0U))\r\n    if (1u == added)\r\n#endif\r\n    {\r\n        /* Add NULL to end of string. */\r\n        **buf      = '\\0';\r\n        *nassigned = *nassigned + 1U;\r\n    }\r\n}\r\n\r\n/*!\r\n * brief Converts an input line of ASCII characters based upon a provided\r\n * string format.\r\n *\r\n * param[in] line_ptr The input line of ASCII data.\r\n * param[in] format   Format first points to the format string.\r\n * param[in] args_ptr The list of parameters.\r\n *\r\n * return Number of input items converted and assigned.\r\n * retval IO_EOF When line_ptr is empty string \"\".\r\n */\r\nint StrFormatScanf(const char *line_ptr, char *format, va_list args_ptr)\r\n{\r\n    uint8_t base;\r\n    int8_t neg;\r\n    /* Identifier for the format string. */\r\n    char *c = format;\r\n    char *buf;\r\n    /* Flag telling the conversion specification. */\r\n    uint32_t flag = 0;\r\n    /* Filed width for the matching input streams. */\r\n    uint32_t field_width;\r\n    /* How many arguments are assigned except the suppress. */\r\n    uint32_t nassigned = 0;\r\n    /* How many characters are read from the input streams. */\r\n    uint32_t n_decode = 0;\r\n\r\n    int32_t val;\r\n\r\n    uint8_t added = 0U;\r\n\r\n    uint8_t exitPending = 0;\r\n\r\n    const char *s;\r\n#if (defined(SCANF_FLOAT_ENABLE) && (SCANF_FLOAT_ENABLE > 0U))\r\n    char *s_temp; /* MISRA C-2012 Rule 11.3 */\r\n#endif\r\n\r\n    /* Identifier for the input string. */\r\n    const char *p = line_ptr;\r\n\r\n#if (defined(SCANF_FLOAT_ENABLE) && (SCANF_FLOAT_ENABLE > 0U))\r\n    double fnum = 0.0;\r\n#endif /* SCANF_FLOAT_ENABLE */\r\n    /* Return EOF error before any conversion. */\r\n    if (*p == '\\0')\r\n    {\r\n        return -1;\r\n    }\r\n\r\n    /* Decode directives. */\r\n    while (('\\0' != (*c)) && ('\\0' != (*p)))\r\n    {\r\n        /* Ignore all white-spaces in the format strings. */\r\n        if (0U != ScanIgnoreWhiteSpace((const char **)((void *)&c)))\r\n        {\r\n            n_decode += ScanIgnoreWhiteSpace(&p);\r\n        }\r\n        else if (0U == StrFormatScanIsFormatStarting(c))\r\n        {\r\n            /* Ordinary characters. */\r\n            c++;\r\n            if (*p == *c)\r\n            {\r\n                n_decode++;\r\n                p++;\r\n                c++;\r\n            }\r\n            else\r\n            {\r\n                /* Match failure. Misalignment with C99, the unmatched characters need to be pushed back to stream.\r\n                 * However, it is deserted now. */\r\n                break;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            /* convernsion specification */\r\n            c++;\r\n            /* Reset. */\r\n            flag        = 0;\r\n            field_width = MAX_FIELD_WIDTH;\r\n            base        = 0;\r\n\r\n            exitPending = StrFormatScanfStringHandling(&c, &flag, &field_width, &base);\r\n\r\n            if (1U == exitPending)\r\n            {\r\n                /* Format strings are exhausted. */\r\n                break;\r\n            }\r\n\r\n            /* Matching strings in input streams and assign to argument. */\r\n            if ((flag & (uint32_t)kSCANF_DestMask) == (uint32_t)kSCANF_DestChar)\r\n            {\r\n                s   = (const char *)p;\r\n                buf = va_arg(args_ptr, char *);\r\n                StrFormatScanfHandleChar(&p, &field_width, &buf, flag, &n_decode, &nassigned);\r\n            }\r\n            else if ((flag & (uint32_t)kSCANF_DestMask) == (uint32_t)kSCANF_DestString)\r\n            {\r\n                n_decode += ScanIgnoreWhiteSpace(&p);\r\n                buf = va_arg(args_ptr, char *);\r\n                StrFormatScanfHandleString(&p, &field_width, &buf, flag, &n_decode, &nassigned);\r\n            }\r\n            else if ((flag & (uint32_t)kSCANF_DestMask) == (uint32_t)kSCANF_DestInt)\r\n            {\r\n                n_decode += ScanIgnoreWhiteSpace(&p);\r\n                s    = p;\r\n                val  = 0;\r\n                base = StrFormatScanGetBase(base, s);\r\n\r\n                added = StrFormatScanCheckSymbol(p, &neg);\r\n                n_decode += added;\r\n                p += added;\r\n                field_width -= added;\r\n\r\n                s = p;\r\n                if (strlen(p) > field_width)\r\n                {\r\n                    char temp[12];\r\n                    char *tempEnd;\r\n                    (void)memcpy(temp, p, sizeof(temp) - 1U);\r\n                    temp[sizeof(temp) - 1U] = '\\0';\r\n                    errno                   = 0;\r\n                    val                     = (int32_t)strtoul(temp, &tempEnd, (int)base);\r\n                    if (0 != errno)\r\n                    {\r\n                        break;\r\n                    }\r\n                    p = p + (tempEnd - temp);\r\n                }\r\n                else\r\n                {\r\n                    char *tempEnd;\r\n                    errno = 0;\r\n                    val   = (int32_t)strtoul(p, &tempEnd, (int)base);\r\n                    if (0 != errno)\r\n                    {\r\n                        break;\r\n                    }\r\n                    p = tempEnd;\r\n                }\r\n                n_decode += (uintptr_t)p - (uintptr_t)s;\r\n\r\n                val *= neg;\r\n\r\n                nassigned += StrFormatScanFillInteger(flag, &args_ptr, val);\r\n            }\r\n#if (defined(SCANF_FLOAT_ENABLE) && (SCANF_FLOAT_ENABLE > 0U))\r\n            else if ((flag & (uint32_t)kSCANF_DestMask) == (uint32_t)kSCANF_DestFloat)\r\n            {\r\n                n_decode += ScanIgnoreWhiteSpace(&p);\r\n                errno = 0;\r\n\r\n                fnum = strtod(p, (char **)&s_temp);\r\n                s    = s_temp; /* MISRA C-2012 Rule 11.3 */\r\n\r\n                /* MISRA C-2012 Rule 22.9 */\r\n                if (0 != errno)\r\n                {\r\n                    break;\r\n                }\r\n\r\n                if ((fnum < HUGE_VAL) && (fnum > -HUGE_VAL))\r\n                {\r\n                    n_decode = (uint32_t)n_decode + (uint32_t)s - (uint32_t)p;\r\n                    p        = s;\r\n                    nassigned += StrFormatScanFillFloat(flag, &args_ptr, fnum);\r\n                }\r\n            }\r\n#endif /* SCANF_FLOAT_ENABLE */\r\n            else\r\n            {\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    return (int)nassigned;\r\n}\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/utilities/fsl_str.h",
    "content": "/*\r\n * Copyright 2017 NXP\r\n * All rights reserved.\r\n *\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n *\r\n */\r\n\r\n#ifndef _FSL_STR_H\r\n#define _FSL_STR_H\r\n\r\n#include \"fsl_common.h\"\r\n\r\n/*!\r\n * @addtogroup debugconsole\r\n * @{\r\n */\r\n\r\n/*******************************************************************************\r\n * Definitions\r\n ******************************************************************************/\r\n\r\n/*! @brief Definition to printf the float number. */\r\n#ifndef PRINTF_FLOAT_ENABLE\r\n#define PRINTF_FLOAT_ENABLE 0U\r\n#endif /* PRINTF_FLOAT_ENABLE */\r\n\r\n/*! @brief Definition to scanf the float number. */\r\n#ifndef SCANF_FLOAT_ENABLE\r\n#define SCANF_FLOAT_ENABLE 0U\r\n#endif /* SCANF_FLOAT_ENABLE */\r\n\r\n/*! @brief Definition to support advanced format specifier for printf. */\r\n#ifndef PRINTF_ADVANCED_ENABLE\r\n#define PRINTF_ADVANCED_ENABLE 0U\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n\r\n/*! @brief Definition to support advanced format specifier for scanf. */\r\n#ifndef SCANF_ADVANCED_ENABLE\r\n#define SCANF_ADVANCED_ENABLE 0U\r\n#endif /* SCANF_ADVANCED_ENABLE */\r\n\r\n/*******************************************************************************\r\n * Prototypes\r\n ******************************************************************************/\r\n#if (defined(PRINTF_ADVANCED_ENABLE) && (PRINTF_ADVANCED_ENABLE > 0U))\r\n/*! @brief Specification modifier flags for printf. */\r\nenum _debugconsole_printf_flag\r\n{\r\n    kPRINTF_Minus             = 0x01U,  /*!< Minus FLag. */\r\n    kPRINTF_Plus              = 0x02U,  /*!< Plus Flag. */\r\n    kPRINTF_Space             = 0x04U,  /*!< Space Flag. */\r\n    kPRINTF_Zero              = 0x08U,  /*!< Zero Flag. */\r\n    kPRINTF_Pound             = 0x10U,  /*!< Pound Flag. */\r\n    kPRINTF_LengthChar        = 0x20U,  /*!< Length: Char Flag. */\r\n    kPRINTF_LengthShortInt    = 0x40U,  /*!< Length: Short Int Flag. */\r\n    kPRINTF_LengthLongInt     = 0x80U,  /*!< Length: Long Int Flag. */\r\n    kPRINTF_LengthLongLongInt = 0x100U, /*!< Length: Long Long Int Flag. */\r\n};\r\n#endif /* PRINTF_ADVANCED_ENABLE */\r\n\r\n/*! @brief Specification modifier flags for scanf. */\r\nenum _debugconsole_scanf_flag\r\n{\r\n    kSCANF_Suppress   = 0x2U,    /*!< Suppress Flag. */\r\n    kSCANF_DestMask   = 0x7cU,   /*!< Destination Mask. */\r\n    kSCANF_DestChar   = 0x4U,    /*!< Destination Char Flag. */\r\n    kSCANF_DestString = 0x8U,    /*!< Destination String FLag. */\r\n    kSCANF_DestSet    = 0x10U,   /*!< Destination Set Flag. */\r\n    kSCANF_DestInt    = 0x20U,   /*!< Destination Int Flag. */\r\n    kSCANF_DestFloat  = 0x30U,   /*!< Destination Float Flag. */\r\n    kSCANF_LengthMask = 0x1f00U, /*!< Length Mask Flag. */\r\n#if (defined(SCANF_ADVANCED_ENABLE) && (SCANF_ADVANCED_ENABLE > 0U))\r\n    kSCANF_LengthChar        = 0x100U, /*!< Length Char Flag. */\r\n    kSCANF_LengthShortInt    = 0x200U, /*!< Length ShortInt Flag. */\r\n    kSCANF_LengthLongInt     = 0x400U, /*!< Length LongInt Flag. */\r\n    kSCANF_LengthLongLongInt = 0x800U, /*!< Length LongLongInt Flag. */\r\n#endif                                 /* SCANF_ADVANCED_ENABLE */\r\n#if (defined(SCANF_FLOAT_ENABLE) && (SCANF_FLOAT_ENABLE > 0))\r\n    kSCANF_LengthLongLongDouble = 0x1000U, /*!< Length LongLongDuoble Flag. */\r\n#endif                                     /*PRINTF_FLOAT_ENABLE */\r\n    kSCANF_TypeSinged = 0x2000U,           /*!< TypeSinged Flag. */\r\n};\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\" {\r\n#endif /* __cplusplus */\r\n\r\n/*!\r\n * @brief A function pointer which is used when format printf log.\r\n */\r\ntypedef void (*printfCb)(char *buf, int32_t *indicator, char val, int len);\r\n\r\n/*!\r\n * @brief This function outputs its parameters according to a formatted string.\r\n *\r\n * @note I/O is performed by calling given function pointer using following\r\n * (*func_ptr)(c);\r\n *\r\n * @param[in] fmt   Format string for printf.\r\n * @param[in] ap  Arguments to printf.\r\n * @param[in] buf  pointer to the buffer\r\n * @param cb print callbck function pointer\r\n *\r\n * @return Number of characters to be print\r\n */\r\nint StrFormatPrintf(const char *fmt, va_list ap, char *buf, printfCb cb);\r\n\r\n/*!\r\n * @brief Converts an input line of ASCII characters based upon a provided\r\n * string format.\r\n *\r\n * @param[in] line_ptr The input line of ASCII data.\r\n * @param[in] format   Format first points to the format string.\r\n * @param[in] args_ptr The list of parameters.\r\n *\r\n * @return Number of input items converted and assigned.\r\n * @retval IO_EOF When line_ptr is empty string \"\".\r\n */\r\nint StrFormatScanf(const char *line_ptr, char *format, va_list args_ptr);\r\n\r\n#if defined(__cplusplus)\r\n}\r\n#endif /* __cplusplus */\r\n\r\n/*! @} */\r\n\r\n#endif /* _FSL_STR_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/wifi/CMakeLists.txt",
    "content": "# SPDX-License-Identifier: Apache-2.0\r\n# Copyright 2022 NXP\r\n\r\n# define part number for this driver\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_88W8987\r\n    SD8987\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_IW416\r\n    SD8978\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_IW61X\r\n    SD9177\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_88W8801\r\n    SD8801\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_RW610\r\n    RW610\r\n    WIFI_BT_TX_PWR_LIMITS=\"wlan_txpwrlimit_cfg_WW_rw610.h\"\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_88W8987_AW_CM358_USD\r\n    WIFI_BT_TX_PWR_LIMITS=\"wlan_txpwrlimit_cfg_WW.h\"\r\n    CONFIG_NXP_WIFI_ED_OFFSET_2G=0x09\r\n    CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0C\r\n    WIFI_BT_USE_USD_INTERFACE\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_88W8987_AW_CM358MA_M2\r\n    WIFI_BT_TX_PWR_LIMITS=\"wlan_txpwrlimit_cfg_WW.h\"\r\n    CONFIG_NXP_WIFI_ED_OFFSET_2G=0x09\r\n    CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0C\r\n    WIFI_BT_USE_M2_INTERFACE\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_88W8987_MURATA_1ZM_USD\r\n    WIFI_BT_TX_PWR_LIMITS=\"wlan_txpwrlimit_cfg_murata_1ZM_WW.h\"\r\n    CONFIG_NXP_WIFI_ED_OFFSET_2G=0x06\r\n    CONFIG_NXP_WIFI_ED_OFFSET_5G=0x06\r\n    WIFI_BT_USE_USD_INTERFACE\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_88W8987_MURATA_1ZM_M2\r\n    WIFI_BT_TX_PWR_LIMITS=\"wlan_txpwrlimit_cfg_murata_1ZM_WW.h\"\r\n    CONFIG_NXP_WIFI_ED_OFFSET_2G=0x06\r\n    CONFIG_NXP_WIFI_ED_OFFSET_5G=0x06\r\n    WIFI_BT_USE_M2_INTERFACE\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_IW416_AW_AM457_USD\r\n    WIFI_BT_TX_PWR_LIMITS=\"wlan_txpwrlimit_cfg_WW.h\"\r\n    CONFIG_NXP_WIFI_ED_OFFSET_2G=0x09\r\n    CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0C\r\n    WIFI_BT_USE_USD_INTERFACE\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_IW416_AW_AM457MA_M2\r\n    WIFI_BT_TX_PWR_LIMITS=\"wlan_txpwrlimit_cfg_WW.h\"\r\n    CONFIG_NXP_WIFI_ED_OFFSET_2G=0x09\r\n    CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0C\r\n    WIFI_BT_USE_M2_INTERFACE\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_IW416_AW_AM510_USD\r\n    WIFI_BT_TX_PWR_LIMITS=\"wlan_txpwrlimit_cfg_WW.h\"\r\n    CONFIG_NXP_WIFI_ED_OFFSET_2G=0x09\r\n    CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0C\r\n    WIFI_BT_USE_USD_INTERFACE\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_IW416_AW_AM510MA_M2\r\n    WIFI_BT_TX_PWR_LIMITS=\"wlan_txpwrlimit_cfg_murata_1XK_WW.h\"\r\n    CONFIG_NXP_WIFI_ED_OFFSET_2G=0x09\r\n    CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0C\r\n    WIFI_BT_USE_M2_INTERFACE\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_IW416_MURATA_1XK_USD\r\n    WIFI_BT_TX_PWR_LIMITS=\"wlan_txpwrlimit_cfg_murata_1XK_WW.h\"\r\n    CONFIG_NXP_WIFI_ED_OFFSET_2G=0x00\r\n    CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0C\r\n    WIFI_BT_USE_USD_INTERFACE\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_IW416_MURATA_1XK_M2\r\n    WIFI_BT_TX_PWR_LIMITS=\"wlan_txpwrlimit_cfg_murata_1XK_WW.h\"\r\n    CONFIG_NXP_WIFI_ED_OFFSET_2G=0x00\r\n    CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0C\r\n    WIFI_BT_USE_M2_INTERFACE\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_IW612_MURATA_2EL_USD\r\n    WIFI_BT_TX_PWR_LIMITS=\"wlan_txpwrlimit_cfg_murata_2EL_WW.h\"\r\n    CONFIG_NXP_WIFI_ED_OFFSET_2G=0x0A\r\n    CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0A\r\n    WIFI_BT_USE_USD_INTERFACE\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_IW612_MURATA_2EL_M2\r\n    WIFI_BT_TX_PWR_LIMITS=\"wlan_txpwrlimit_cfg_murata_2EL_WW.h\"\r\n    CONFIG_NXP_WIFI_ED_OFFSET_2G=0x0A\r\n    CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0A\r\n    WIFI_BT_USE_M2_INTERFACE\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_IW611_MURATA_2DL_USD\r\n    WIFI_BT_TX_PWR_LIMITS=\"wlan_txpwrlimit_cfg_murata_2EL_WW.h\"\r\n    CONFIG_NXP_WIFI_ED_OFFSET_2G=0x0A\r\n    CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0A\r\n    WIFI_BT_USE_USD_INTERFACE\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_IW611_MURATA_2DL_M2\r\n    WIFI_BT_TX_PWR_LIMITS=\"wlan_txpwrlimit_cfg_murata_2EL_WW.h\"\r\n    CONFIG_NXP_WIFI_ED_OFFSET_2G=0x0A\r\n    CONFIG_NXP_WIFI_ED_OFFSET_5G=0x0A\r\n    WIFI_BT_USE_M2_INTERFACE\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_88W8801_AW_NM191_USD\r\n    WIFI_BT_TX_PWR_LIMITS=\"wlan_txpwrlimit_cfg_WW.h\"\r\n    CONFIG_NXP_WIFI_ED_OFFSET_2G=0x1B\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_88W8801_AW_NM191MA_M2\r\n    WIFI_BT_TX_PWR_LIMITS=\"wlan_txpwrlimit_cfg_WW.h\"\r\n    CONFIG_NXP_WIFI_ED_OFFSET_2G=0x1B\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_88W8801_MURATA_2DS_USD\r\n    WIFI_BT_TX_PWR_LIMITS=\"wlan_txpwrlimit_cfg_murata_2DS_WW.h\"\r\n    CONFIG_NXP_WIFI_ED_OFFSET_2G=0x0E\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_88W8801_MURATA_2DS_M2\r\n    WIFI_BT_TX_PWR_LIMITS=\"wlan_txpwrlimit_cfg_murata_2DS_WW.h\"\r\n    CONFIG_NXP_WIFI_ED_OFFSET_2G=0x0E\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_NXP_WIFI_BT_USE_USD_INTERFACE\r\n    WIFI_BT_USE_USD_INTERFACE\r\n)\r\n\r\nzephyr_compile_definitions_ifdef(CONFIG_NXP_WIFI_BT_USE_M2_INTERFACE\r\n    WIFI_BT_USE_M2_INTERFACE\r\n)\r\n\r\nzephyr_library_compile_definitions(\r\n    FSL_OSA_TASK_ENABLE=1\r\n)\r\n\r\nzephyr_library_sources(${ZEPHYR_HAL_NXP_MODULE_DIR}/mcux/mcux-sdk/utilities/misc_utilities/fsl_memcpy.S)\r\n\r\nzephyr_library_sources(${ZEPHYR_HAL_NXP_MODULE_DIR}/mcux/mcux-sdk/components/lists/fsl_component_generic_list.c)\r\n\r\nzephyr_library_sources(${ZEPHYR_HAL_NXP_MODULE_DIR}/mcux/mcux-sdk/components/osa/fsl_os_abstraction_zephyr.c)\r\n\r\nzephyr_include_directories(\r\n    incl\r\n    incl/wifidriver\r\n    incl/wlcmgr\r\n    incl/port/net\r\n    incl/port/osa\r\n    incl/port/net/zephyr\r\n    port/osa\r\n    port/net/zephyr\r\n    sdio_nxp_abs/incl\r\n    firmware_dnld\r\n    fwdnld_intf_abs\r\n    wifidriver\r\n    wifidriver/incl\r\n    wifi_bt_firmware\r\n    wifi_bt_firmware/8987\r\n    wifi_bt_firmware/IW416\r\n    wifi_bt_firmware/nw61x\r\n    wifi_bt_firmware/8801\r\n    cli\r\n    ${ZEPHYR_HAL_NXP_MODULE_DIR}/mcux/mcux-sdk/components/osa/\r\n    ${ZEPHYR_HAL_NXP_MODULE_DIR}/mcux/mcux-sdk/components/lists/\r\n    ${ZEPHYR_HAL_NXP_MODULE_DIR}/mcux/mcux-sdk/components/wifi_bt_module/AzureWave/tx_pwr_limits/\r\n    ${ZEPHYR_HAL_NXP_MODULE_DIR}/mcux/mcux-sdk/components/wifi_bt_module/Murata/tx_pwr_limits/\r\n)\r\n\r\n# OS abstraction layer source\r\nzephyr_library_sources(\r\n    port/osa/osa.c\r\n    port/osa/osa_zephyr.c\r\n)\r\n# net stack abstraction layer source\r\nzephyr_library_sources(port/net/zephyr/net.c)\r\n\r\nfile(GLOB WIFI_SRC ./wifidriver/*.c)\r\nlist(FILTER WIFI_SRC EXCLUDE REGEX \".*imu.c$\")\r\nlist(FILTER WIFI_SRC EXCLUDE REGEX \".*sdio.c$\")\r\nlist(FILTER WIFI_SRC EXCLUDE REGEX \".*firmware_dnld.c$\")\r\n\r\nzephyr_library_sources_ifdef(CONFIG_RW610\r\n    wifidriver/wifi-imu.c\r\n)\r\n\r\nzephyr_library_sources_ifdef(CONFIG_SDIO_STACK\r\n    wifidriver/sdio.c\r\n    sdio_nxp_abs/fwdnld_sdio.c\r\n    sdio_nxp_abs/mlan_sdio.c\r\n    wifidriver/wifi-sdio.c\r\n    firmware_dnld/firmware_dnld.c\r\n    fwdnld_intf_abs/fwdnld_intf_abs.c\r\n)\r\n\r\nzephyr_library_sources(${WIFI_SRC})\r\n\r\nfile(GLOB WLCMGR_SRC ./wlcmgr/*.c)\r\n#list(FILTER WLCMGR_SRC EXCLUDE REGEX \".*tests*\")\r\n#list(FILTER WLCMGR_SRC EXCLUDE REGEX \".*cli*\")\r\n\r\nzephyr_library_sources(${WLCMGR_SRC})\r\n\r\nzephyr_library_sources_ifdef(CONFIG_NXP_WIFI_SMOKE_TESTS\r\n    nw_utils/init_enet.c\r\n)\r\n\r\nzephyr_include_directories_ifdef(CONFIG_NXP_WIFI_SMOKE_TESTS\r\n    nw_utils\r\n)\r\n\r\nif(CONFIG_NXP_WIFI_SIGMA_AGENT)\r\nzephyr_library_sources(\r\n    nw_utils/wifi_ping.c\r\n    sigma_agent/sigma_agent.c\r\n    sigma_agent/dut/wfa_dut.c\r\n    sigma_agent/dut/wfa_dut_init.c\r\n)\r\n\r\nfile(GLOB SIGMA_SRC ./sigma_agent/lib/*.c)\r\nlist(FILTER SIGMA_SRC EXCLUDE REGEX \".*cmdproc*\")\r\nlist(FILTER SIGMA_SRC EXCLUDE REGEX \".*ca_resp*\")\r\nzephyr_library_sources(${SIGMA_SRC})\r\nendif()\r\n\r\nzephyr_library_include_directories_ifdef(CONFIG_NXP_WIFI_SIGMA_AGENT\r\n    PRIVATE ${ZEPHYR_BASE}/subsys/net/ip)\r\n\r\nzephyr_library_include_directories_ifdef(CONFIG_NXP_WIFI_SIGMA_AGENT\r\n    sigma_agent/inc\r\n    sigma_agent/dut\r\n)\r\n\r\nfile(GLOB DHCPD_SRC ./dhcpd/*.c)\r\nlist(FILTER DHCPD_SRC EXCLUDE REGEX \".*cli*\")\r\n\r\nzephyr_library_sources(${DHCPD_SRC})\r\nzephyr_library_include_directories(dhcpd)\r\n\r\n# nxp wifi shell\r\nzephyr_library_sources(cli/wifi_shell.c)\r\nzephyr_library_sources(cli/cli_utils.c)\r\n\r\n# macros for wpa_supplicant\r\nif(CONFIG_WPA_SUPP)\r\nzephyr_include_directories(certs)\r\n\r\nzephyr_library_include_directories(wifidriver/wpa_supp_if wifidriver/wpa_supp_if/incl)\r\nfile(GLOB WIFI_SUPP_SRC ./wifidriver/wpa_supp_if/*.c)\r\nzephyr_library_sources(${WIFI_SUPP_SRC})\r\nendif()\r\n\r\nif(CONFIG_SPEED_OPTIMIZATIONS OR CONFIG_SIZE_OPTIMIZATIONS)\r\n# critical path code relocated to SRAM\r\nzephyr_code_relocate(FILES\r\n                     port/net/net.c\r\n                     port/osa/osa.c\r\n                     port/osa/osa_zephyr.c\r\n                     port/net/zephyr/net.c\r\n                     sdio_nxp_abs/mlan_sdio_zephyr.c\r\n                     wifidriver/mlan_11n.c\r\n                     wifidriver/mlan_11n_aggr.c\r\n                     wifidriver/mlan_11n_rxreorder.c\r\n                     wifidriver/mlan_wmm.c\r\n                     wifidriver/wifi.c\r\n                     LOCATION RAM_TEXT)\r\n\r\nif(CONFIG_SDIO_STACK)\r\nzephyr_code_relocate(FILES\r\n                     sdio_nxp_abs/mlan_sdio.c\r\n                     wifidriver/wifi-sdio.c\r\n                     LOCATION RAM_TEXT)\r\nendif()\r\n\r\nif(CONFIG_RW610)\r\nzephyr_code_relocate(FILES\r\n                     # fsl_cache.c\r\n                     # ${ZEPHYR_BASE}/modules/hal_nxp/fsl_memcpy.S\r\n                     wifidriver/wifi-imu.c\r\n                     ${ZEPHYR_HAL_NXP_MODULE_DIR}/mcux/mcux-sdk/components/osa/fsl_os_abstraction_zephyr.c\r\n                     ${ZEPHYR_HAL_NXP_MODULE_DIR}/mcux/mcux-sdk/drivers/imu/fsl_imu.c\r\n                     ${ZEPHYR_HAL_NXP_MODULE_DIR}/mcux/mcux-sdk/components/rpmsg/fsl_adapter_rfimu.c\r\n                     LOCATION RAM_TEXT)\r\nendif()\r\n\r\nzephyr_code_relocate(FILES\r\n                     # fsl_cache.c\r\n                     # ${ZEPHYR_BASE}/modules/hal_nxp/fsl_memcpy.S\r\n                     ${ZEPHYR_HAL_NXP_MODULE_DIR}/mcux/mcux-sdk/components/osa/fsl_os_abstraction_zephyr.c\r\n                     ${ZEPHYR_HAL_NXP_MODULE_DIR}/mcux/mcux-sdk/utilities/misc_utilities/fsl_memcpy.S\r\n                     LOCATION RAM_TEXT)\r\n\r\nfile(GLOB ZPERF_SRC ${ZEPHYR_BASE}/subsys/net/lib/zperf/*.c)\r\nzephyr_code_relocate(FILES ${ZPERF_SRC} LOCATION RAM_TEXT)\r\n\r\nfile(GLOB SOCKET_SRC ${ZEPHYR_BASE}/subsys/net/lib/sockets/*.c)\r\nzephyr_code_relocate(FILES ${SOCKET_SRC} LOCATION RAM_TEXT)\r\n\r\nfile(GLOB NET_SRC ${ZEPHYR_BASE}/subsys/net/ip/*.c)\r\nzephyr_code_relocate(FILES ${NET_SRC} LOCATION RAM_TEXT)\r\n\r\nfile(GLOB ETH_SRC ${ZEPHYR_BASE}/subsys/net/l2/ethernet/*.c)\r\nzephyr_code_relocate(FILES ${ETH_SRC} LOCATION RAM_TEXT)\r\n\r\nzephyr_code_relocate(FILES ${ZEPHYR_BASE}/subsys/net/buf.c LOCATION RAM_TEXT)\r\n\r\nzephyr_code_relocate(FILES\r\n                     ${ZEPHYR_BASE}/kernel/mem_slab.c\r\n                     ${ZEPHYR_BASE}/kernel/mempool.c\r\n                     ${ZEPHYR_BASE}/kernel/msg_q.c\r\n                     ${ZEPHYR_BASE}/kernel/mutex.c\r\n                     ${ZEPHYR_BASE}/kernel/queue.c\r\n                     ${ZEPHYR_BASE}/kernel/sched.c\r\n                     ${ZEPHYR_BASE}/kernel/sem.c\r\n                     ${ZEPHYR_BASE}/kernel/thread.c\r\n                     ${ZEPHYR_BASE}/kernel/work.c\r\n                     LOCATION RAM_TEXT)\r\nendif()\r\n\r\nzephyr_library_link_libraries_ifdef(CONFIG_MBEDTLS mbedTLS)\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/wifi/ChangeLogKSDK.txt",
    "content": "/*!\r\n@page middleware_log Middleware Change Log\r\n\r\n@section wifi NXP WiFi\r\n\r\nVersion 1.3.r47.p16\r\n - Updates:\r\n  - Updated FC's f/w version to 2.p66.155.\r\n  - Updated CA2 and RB3+ f/w version to 21.p124.\r\n  - Fine tuning of GTK rekey offload feature.\r\n\r\nVersion 1.3.r47.p15\r\n - Bug Fix:\r\n  - DUT fails to connect to Ex-AP configured with wpa2 Enterprise security (Auth method Fast-mschapv2).\r\n  - Incorrect AKM types PSK(2), PSK(SHA-256) are seen in beacon after configuring APUT in wpa2-psk security mode.\r\n  - Link lost seen after wlan-scan when DUT is connected in wpa2 ft-psk security in 2.4Ghz band.\r\n\r\nVersion 1.3.r47.p12\r\n - Bug Fix:\r\n  - Throughput numbers for TCP-Rx traffic on APUT are dropping to 0mbps in HE20/VHT20 mode.\r\n\r\nVersion 1.3.r47.p11\r\n - Bug Fix:\r\n  - Failed to connect STAUT configured in WPA2+PMF required security to Ex-AP configured in WPA2/WPA3 mixed mode+PMF capable security.\r\n  - STAUT is waking up with Broadcast traffic while running MEF AUTO PING ALLOW and WAKE HOST & MEF AUTO PING DISCARD and WAKE HOST.\r\n  - Cannot connec to AP with security wpa3_sb_192_eap_tls.\r\n  - Cannot out band independent reset successfully.\r\n\r\nVersion 1.3.r47.p10\r\n - Bug Fix:\r\n  - Auto reconnect - link lost reported when ap shut down.\r\n  - STAUT failed to roam from Ex-AP1 to Ex-AP2 with WPA3 security mode while running UDP-Tx traffic.\r\n  - STAUT is not waking up from suspend state while running Host-sleep test even after running Unicast/Broadcast traffic from Ex-AP to STAUT.\r\n  - STAUT is waking up with Unicast data and without unicast data as well before running Broadcast data traffic from AP backend to STAUT.\r\n  - While running WPS connection with Ex-AP, DUT gets deauthenticated after M4 packet, WPS_NACK is recvd. M1 packet does not have WPS PBC or keypad specific bit set\r\n  - \"Network not found\" is seen on the STAUT after disconnection and reconnection of the same profile in UNII4 channels (169,173,177).\r\n  - When Dut reported Link lost, After configured time interval, DUT reconnects to AP but fails to ping to AP_BACKEND after reconnection.\r\n  - Coverity Fixes.\r\n\r\nVersion 1.3.r47.p9\r\n - Bug Fix:\r\n  - APUT is advertising channel width information for 40Mhz in HE-phy capabilities instead of 20Mhz bandwidth in Assoc response frame.\r\n  - STAUT failed to roam from Ex-AP1 to Ex-AP2 with WPA3 security mode with same channel same band and different channel same band scenario.\r\n  - 15-20% Throughput degradation observed in TCP-TX and UDP-TX of HE[40Mhz/80MHz], VHT[40Mhz/80Mhz] compared to previous release[R45.p12].\r\n  - \"WLAN: Network not found\" is observed while connecting STAUT configured in wpa2 security PMF capable to Ex-AP in wpa2 security with PMF required.\r\n  - Coverity Fixes.\r\n\r\nVersion 1.3.r47.p8\r\n - Bug Fix:\r\n  - \"WLAN: network not found & Warn: Scan temporary failure\" is observed after disconnecting from one network and Re-connecting to same network after renaming SSID of Ex-AP.\r\n  - \"Network not found\" is seen on the STAUT after disconnection and reconnection of the same profile in UNII4 channels (169,173,177).\r\n  - Beacons not stopping in the older channel, after uAP switching the channel according to the Ex-AP in simultaneous mode.\r\n  - Incorrect return value on error.\r\n\r\nVersion 1.3.r47.p7\r\n - Bug Fix:\r\n  - STA STRESS | Independent Reset, DUT went to hang state after 134 iterations of independent reset with status \"ASSERT: wlan_process_hang: 982 Assert failed: Panic\"!\r\n  - Error message \"'is_mef' undeclared(first use in this function)\" is observed while the time of compilation of binary after enabling macro for the host-sleep.\r\n  - DUT not able to roam from AP1 to AP2 in different channel (DFS) and same Band on reducing the RSSI of AP1.\r\n  - STAUT failed to roam from Ex-AP1 to Ex-AP2 with WPA3 security mode while running UDP-Tx traffic.\r\n  - MEF, DUT fails to wakeup with mef conditions ping 1,3 and arp 1 & 3.\r\n\r\nVersion 1.3.r47.p6\r\n - Features\r\n  - Add GTK rekey offload support.\r\n  - Independent Reset via In-band\r\n  - Independent Reset via Out-of-Band\r\n - Updates:\r\n  - Updated FC's f/w version to 2.p66.14.\r\n - Bug Fix:\r\n  - Power save/host sleep support improvements.\r\n  - Messy log output after in band independent reset(17 in 31)\r\n  - Association_Req content corrupted when Dut config as WPA/WPA2 mix mode and connecting to AP WPA+TKIP\r\n  - Cannot connect to AP with security wpa3_sb_192_eap_tls.\r\n  - Command \"wlan-add-packet-filter 1\" is not available for setting MEF filter configuration in Host-sleep.\r\n  - WPA3 Enterprise support (Host based - Remaining set of authentication methods)\r\n  - STAUT failed to roam from Ex-AP1 to Ex-AP2 with WPA3 security mode while running UDP-Tx traffic.\r\n  - No Link lost is observed while switching from 11n[2.4G | 20Mhz] to legacy[2.4G] mode.\r\n  - The introduction of new features does not follow the scope limitations of modules and apps\r\n  - STAUT 11r, DUT unable to roam to particular BSSID after 10 to 15 iterations of roam, showing \"Roaming already in progress Started FT roaming\"\r\n  - STAUT | After DUT wake up from Hostsleep condition 0x10 (WAKE_ON_ARP_BROADCAST) Ping failed from AP_Backend to DUT and Delayed ping from DUT to AP_Backend\r\n  - Error: ignoring scan request in invalid state\r\n  - Fix COVERITY Issue for midware_wifi\r\n\r\nVersion 1.3.r47.p5\r\n - Updates:\r\n  - Updated FC's f/w version to 2.p66.11.\r\n - Bug Fix:\r\n  - AKM checks are wrong for UAP PMF MANDATORY WPA2 PSK STA PMF MANDATORY WPA2 PSK for 11AN[20Mhz] as well as BGN[20Mhz] mode.\r\n  - STAUT is not waking up in any scenarios after giving Host-sleep commands with default power save enabled mode.\r\n\r\nVersion 1.3.r47.p4\r\n - Features\r\n  - Added support for Doxygen.\r\n - Bug Fix:\r\n  - AKM checks are wrong for UAP PMF MANDATORY WPA2 PSK STA PMF MANDATORY WPA2 PSK for 11AN[20Mhz] as well as BGN[20Mhz] mode.\r\n  - On DUT manually configured parameters of 11axcfg, not getting reset to default after \"wlan-reset\" command execution.\r\n  - 2G to 5G and 5G to 2G FTOA roaming fails , link lost observed with permanent disconnect\r\n  - Change of bandwidth from 80Mhz to 40 MHz is observed after uAP (APUT) is stopped and started again, in HE/VHT band.\r\n  - STAUT unable to scan Ex-AP in UNII4 channels (169,173,177) with any Band/security.\r\n  - \"Command response timed out. command 0x107\" observed after 945 iterations in Scan-Connect-Disconnect Test without any traffic [Idle Test].\r\n  - RT Console hangs after enabling WLAN/BT Independent Download.\r\n  - Cannot get full iperf summary.\r\n  - While running UDP Bi-directional traffic, QOS data packets are not going from APUT/STAUT.\r\n\r\nVersion 1.3.r47.p3\r\n - Updates:\r\n  - Updated FC's f/w version to 2.p66.6.\r\n  - Updated CA2 and RB3+ f/w version to 21.221.\r\n - Features\r\n  - Added FW (Parallel) Download support.\r\n - Bug Fix:\r\n  - WiFi hang up with memory alloc buffer error during perform WiFi-scan along with WiFi independent reset loop test(OT already form the NTW)\r\n  - TCP-Keep-Alive packets are not seen in sniffer after successfully setting configuration commands for cloud keep alive and STAUT is not waking up after putting in suspend state.\r\n  - STAUT is not waking up from suspend state while running Host-sleep test even after running Unicast/Broadcast traffic from Ex-AP to STAUT.\r\n  - AKM checks are wrong for UAP PMF MANDATORY WPA2 PSK STA PMF MANDATORY WPA2 PSK for 11AN[20Mhz] as well as BGN[20Mhz] mode.\r\n  - Ex-STA (Kestrel, Firecrest RT1060-EVKC) Failed to associate in WPA2 PMF disabled mode to APUT configured in WPA2/WPA3 mixed security mode.\r\n  - STAUT, failed to Associate in WPA2 security with PMF disabled to Ex-AP configured in WPA2/WPA3 mixed security mode.\r\n\r\nVersion 1.3.r47.p2\r\n - Bug Fix:\r\n  - Fail to disable IEEE Power save mode, while giving command to disable it.\r\n  - NXP devices Kestrel/KF2-RD(STA) unable to connect to DUT as MMH-AP but connecting with Mobile, Four way Handshake Timeout is observed with NXP Devices\r\n  - Ex-STA(Kestrel, KF2) Assoc-reject is observed with uAP configured in OWE security mode.\r\n  - Cannot connect to 5g external AP.\r\n\r\nVersion 1.3.r47.p1\r\n - Updates:\r\n  - Updated CA2 and RB3+ f/w version to 21.p109\r\n  - Updated 8801 f/w version to 36_186\r\n  - Updated Firecrest firmware version to p66.5.\r\n - Features\r\n  - Added EVKC board support for all SoCs.\r\n  - Added WPA2/3 Enterprise support for EAP-SIM/EAP-AKA/EAP-AKA-PRIME for STA and uAP.\r\n  - Added CSI support.\r\n  - Added Auto Reconnect support.\r\n  - Added CA2 and RB3+ Parallel FW Download support.\r\n  - Added CA2 and RB3+ Independent Reset via In-band support.\r\n  - Added CA2 and RB3+ Independent Reset via Out-of-Band support.\r\n  - Added CA2 and RB3+ Boot sleep patch support.\r\n\r\nVersion 1.3.r46.p7\r\n - Updates:\r\n  - Updated Falcon to p185, CA2 and RB3+ f/w version to 21.p91.5\r\n - Bug Fix:\r\n  - uAP reassociation not working\r\n  - Traffic stops wen moving from auto rate to mcs0\r\n  - DUT not sending TCP-KEEP-ALIVE in suspend state\r\n  - DUT not able to roam from WPA-R1 enabled AP to WPA3-R3 enabled AP\r\n  - Ex-AP1 to Ex-AP2 roaming not working in wpa3\r\n  - STAUT is nto following BSS transition correctly\r\n  - RF test mode commands crash issue\r\n  - Ping is not working when uAP configured with wpa3-sb-192 bit EAP-TLS/EAP-TTLS/EAP-PEAP enterprise security.\r\n  - DUT shows network not found, even when connected to Ex-AP\r\n  - Stress test fixes\r\n\r\nVersion 1.3.r46.p5\r\n - Updates:\r\n  - Updated CA2 and RB3+ f/w version to 21.p91.5\r\n - Bug Fix:\r\n  - Wifi random crash issue when DUT set to sleep\r\n  - Enable 11D for uAP by default\r\n  - STA doesnt get IP address when ieee-ps and deep sleep are enabled\r\n  - Coverity fixes\r\n  - BT/BLE fix for PTS test case\r\n\r\nVersion 1.3.r46.p4\r\n - Updates:\r\n  - Updated CA2 and RB3+ f/w version to 21.p91.4\r\n - Bug Fix:\r\n  - Fixed: pre-cert: 20/40 BSS coexistence management is not supported in association request.\r\n  - Fixed: pre-cert: STAUT is not correctly following the MU EDCA parameters advertised by the AP.\r\n  - Fixed: Fail to connect to external AP with security wpa3.\r\n  - Fixed: uAP with wpa3 security is not connectable.\r\n  - Fixed: DUT not able to connect to Ex-AP in WPA2 security when PMF required is set.\r\n  - Fixed: Remove BAND_B rates from Supported rates for 5G channels during scan.\r\n  - Fixed: pre-cert STAUT is not including operating class 81 and 115 under Alternate Operating Classes in assoc request.\r\n  - Fixed: Cannot connect to external AP successfully.\r\n  - Fixed: 5Ghz channel are configured acceptable in 2.4Ghz band\r\n  - Fixed: wlan_set_rf_tx_power is not consistent with tx-frame power output\r\n  - Fixed: Getting compilation errors while compiling the binary after defining \"CONFIG_UNII4_BAND_SUPPORT\" macro in wifi_config.h file.\r\n  - Fixed: uAP Beacons advertise 3 AKM suites (PSK & PSK SHA256 & SAE SHA256) in RSNIE when WPA2+WPA3 mixed mode is set on AP with mfpc 1 and mfpr 0.\r\n  - Fixed: STAUT configured with WPA3-SAE associates to WPA2 configured AP.\r\n  - Fixed: DUT unable to roam from Ex-AP1 to Ex-AP2 on lowering the RSSI of Ex-AP1.\r\n  - Fixed: pre-cert STAUT is not correctly following the MU EDCA parameters advertised by the AP.\r\n  - Fixed: DUT-STA is unable to associate with WPA/WPA2 Mixed mode AP when DUT-STA is configure WPA security.\r\n  - Fixed: pre-cert STAUT fails to roam from WPA3 configured AP1 to WPA2-PSK configured AP2.\r\n  - Removed IEEE_MGMT_ACTION_CATEGORY_PUBLIC enum.\r\n  - Fixed logic for consecutive connect for both embedded and wpa supplicant.\r\n  - Fixed all compilation errors and warnings seen on dapeng.\r\n  - Resolved MISRA and coverity defects.\r\n\r\nVersion 1.3.r46.p3\r\n - Updates:\r\n  - Updated CA2 and RB3+ f/w version to 21.p91.2\r\n - Bug Fix:\r\n  - Fixed: TCP and UDP TX traffic stream not working with ex-sta\r\n  - Fixed: pre-cert: STAUT is not following BSS transition correctly\r\n  - Fixed: Extend wlan-get-antcfg to print current antenna\r\n  - Fixed: DUT able to configure MFPR 0 in WPA3 security.\r\n  - Fixed: DUT MCS rates are not updating to default after stopping/removing previous profile with MCS set to fixed number via fixed rate command.\r\n  - Fixed: DUT-uAP unable to start with ACS configuration.\r\n  - Fixed: While running WPS connection with Ex-AP, DUT gets deauthenticated after M4 packet, WPS_NACK is recvd. M1 packet does not have WPS PBC or keypad specific bit set.\r\n  - Fixed: Fail to create ipv6 iperf client.\r\n  - Fixed: uAP beacons contain incorrect bit, UAPSD bit is set in WME QoS Info even though it is not supported.\r\n  - Fixed: uAP beacons contain incorrect bits, SU/MU Beamformer bits are set in HE Phy capabilities and UAPSD bit is set in WME QoS Info even though it is not supported.\r\n  - Fixed: Data path blocks once we initiate wlan-scan on DUT and change Ex-AP channel at the same time.\r\n  - Fixed: MISRA defects.\r\n\r\nVersion 1.3.r46.p2\r\n - Updates:\r\n  - Updated CA2 and RB3+ f/w version to 21.p91\r\n - Bug Fix:\r\n  - Fixed BT connection issue on RB3+\r\n\r\nVersion 1.3.r46.p1\r\n - Updates:\r\n  - Updated CA2 and RB3+ f/w version to 21.p90\r\n  - Updated 8801 f/w version to 36_181\r\n  - CA2 Fixed FIPS GCMP support\r\n  - Added all changes as part of r45.p3 as applicable for CA2 and RB3+\r\n  - Added information for BSD3 license.\r\n  - Updated WLCMGR and Wi-Fi driver to support WPA supplicant and hostapd.\r\n  - Deepsleep feature in BLE peripheral role\r\n  - Deep Sleep and wakeup feature is enabled for CA2 and RB3+\r\n\r\n - Features\r\n  - Added WPA supplicant and hostapd support.\r\n  - Added WPS 2.0 support for STA and uAP.\r\n  - Added WPA2 enterprise support for STA and uAP.\r\n  - Added WPA3 enterprise support with suite b and suite b 192 bit mode for STA and uAP.\r\n\r\n - Bug Fixes:\r\n  - Fixed: APUT goes into hang state after every disassociation of STA.\r\n  - Fixed: (pre-cert)AMSDU Rx test fails as STAUT returns the throughput received as 0.\r\n  - Fixed: Country Information IE with default country code (WW) is seen in beacon even after changing the regions from WW to US/EU/CA/CN.\r\n  - Fixed: DUT should show \"Network not found\" message in cli, when Configure SSID is not present in network area.\r\n  - Fixed: DUT not able to connect to Ex-AP in WPA3R3 security.\r\n  - Fixed: DUT not able to roam from Ex-AP1 to Ex-AP2.\r\n  - Fixed: Hostsleep/MEF test condition failures are seen.\r\n  - Fixed: uAP not coming up in WPA2/WPA3 mixed mode security., getting \"WPA initialization failed\" on DUT console.\r\n  - Fixed: DUT shows wrong channel number in wlan-scan-opt and wlan-info command results.\r\n  - Fixed: DUT sending QoS data packets with LDPC coding when LDPC coding is disabled on Ex-STA.\r\n  - Fixed: Country Information IE is not seen in uAP Beacon.\r\n  - Fixed: DUT is going into hang state while running Connect/Disconnect Stress Test\r\n  - Fixed: Supported MCS and NSS rates are not properly set under HE capabilities IE in beacon frame when CAPA enabled binary is flashed on DUT.\r\n  - Fixed: Channel Bandwidth is setting to 80Mhz when uAP is configured in 11AX-40Mhz/20Mhz.\r\n  - Fixed: Beacon frame includes HE IE when uAP is configured in 11AC using Capa command.\r\n  - Fixed: DUT is not connecting in WPA2/WPA3 Enterprise security.\r\n  - Fixed: DUT is not getting ipv4 address after Roaming to Ex-AP2.\r\n  - Fixed: DUT is not roaming from AP1 to Ex-AP2 after running wlan-ft-roam command in 5Ghz.\r\n  - Fixed: DUT is not following BSS transition Correctly.\r\n  - Fixed: DUT is not responding Beacon Report Action frame after sending the Beacon request from Ex-AP to DUT.\r\n  - Fixed: Automatic Channel Selection is not working when DUT configured in MMH mode.\r\n  - Fixed: DUT is going for Reassociation with the same Ex-AP after running \"wlan-host-11k-neighbour-req\" command.\r\n  - Fixed: uAP Beacons does not include SHA256 in RSNIE when PMF mandatory is set on AP in WPA2-PSK security.\r\n  - Fixed: Low Throughput seen in 11AX, 11AC, 11N (80MHz, 40MHz & 20MHz) TCP-RX/TX, UDP-TX/RX in 2.4Ghz & 5Ghz.\r\n  - Fixed: DUT is not using \"FT using PSK\" AKM suite when 802.11R is enabled.\r\n  - Fixed: DUT not able to connect to Ex-AP in WPA2 security when PMF required is set.\r\n  - Fixed: Need to reset DUT every time for every new connection to happen.\r\n  - Fixed: Incorrect VHT IE \"RX/TX MCS Map\" is seen in uAP beacons.\r\n  - Fixed: uAP Beacons is advertising 4 Pairwise Cipher Suites [CCMP (256), GCMP (256), AES (CCM), GCMP (128)] in RSNIE with WPA2/WPA3 security.\r\n  - Fixed: uAP not coming up in 2.4GHz channel 11, getting \"uAP start failed, giving up\" on DUT console.\r\n  - Fixed: DUT is going in hang state after Stop/Remove/Start network in wpa2 and wpa3 security, when configured in MMH mode.\r\n  - Fixed: HE IE is not reflecting in beacons, when DUT is configured in default mode without capa in MMH.\r\n  - Fixed: DUT is not connecting in WPA3 security, shows \"Error: Init of random number generator failed.\"\r\n\r\nVersion 1.3.r45.p12\r\n - Updates:\r\n  - Uodated tx pwr limit files for murata 2el module.\r\n  - Added config macro for RU Tx power.\r\n  - Updated WPA2/3 Enterprise support to handle pre-cert tests.\r\n\r\n - Bug Fixes:\r\n  - Fixed: uAP not starting up in channel 14 showing start failed when uAP country code is set to JP.\r\n\r\nVersion 1.3.r45.p11\r\n - Updates:\r\n  - Added integrate tx pwr limit files for murata 2el module.\r\n  - Added support for legacy mode of RU Tx power.\r\n  - Updated WPA2/3 Enterprise support to handle pre-cert tests.\r\n\r\n - Bug Fixes:\r\n  - Fixed: Bi-directional traffic converts to uni-directional traffic.\r\n  - Fixed: The support for \"wlan-multi-mef\" command to configure MEF\r\n  parameters on cli is not available.\r\n  - Fixed: Country Information IE with default country code (WW) is seen in\r\n  uAP beacon even after changing the regions from WW to US/EU/CA/CN.\r\n  - Fixed: Failed to wakeup card after turned on IEEE Power Save mode.\r\n  - Fixed: Bi-directional iperf traffic is not running getting dropped to\r\n  0.000 bits/sec.\r\n  - Fixed: Macbook not connecting with DUT-AP in channel 48 and BW 80MHz.\r\n  - Fixed: [pre-cert] DUT fails to connect to Ex-AP configured with wpa/wpa2\r\n  enterprise security (AES Encryption) and the radius server configured with\r\n  hostapd, unsupported certificate error.\r\n  - Fixed: Not connecting to AP in WPA-TKIP and WPA-AES, M2 is not being\r\n  initiated by STA.\r\n\r\nVersion 1.3.r45.p10\r\n - Updates:\r\n  - Updated firmware version to 2.p7.19 and added TP signed FW(with VDLL) too.\r\n  - Changed the init and command flow for uart_wifi_bridge app.\r\n\r\n - Bug Fixes:\r\n  - Fixed: [pre-cert] DUT not correctly receiving AMPDU+AMSDU , AMSDU bit is not set to 1 in QOS data frame.\r\n  - Fixed: uAP not starting up in channel 14 showing start failed when uAP country code is set to JP.\r\n  - Fixed: Data path blocks once we initiate wlan-scan on DUT and change Ex-AP channel at the same time.\r\n  - Fixed: App will block/output error log when trying to set rf tx frame.\r\n\r\nVersion 1.3.r45.p9\r\n - Updates:\r\n  - Updated firmware version to 2.p7.17 and added TP signed FW(with VDLL) too.\r\n  - Added support for channel based RU Tx power.\r\n  - Added support of reassociate command on STAUT to test reassociate feature.\r\n\r\n - Bug Fixes:\r\n  - Fixed: Ex-STA(Kestrel) not able to connect to uAP with \"reassociate\" command in first attempt, getting deauthentication and again connection is initiated with Association Request and connection happens, in wpa3 security.\r\n  - Fixed: [pre-cert] STAUT is sending incomplete beacon report response to AP's beacon report request.\r\n  - Fixed: Messy log output when trying to turn off deep sleep mode.\r\n  - Fixed: Unable to set TX-OMI on uAP using command \"wlan-set-tx-omi\".\r\n  - Fixed: DUT is not re-connecting when bandwidth/mode changed on Ex-AP.\r\n\r\nVersion 1.3.r45.p7\r\n - Updates:\r\n  - Updated firmware version to 2.p7.15 and added TP signed FW(with VDLL) too.\r\n - Bug Fixes:\r\n  - Fixed: STAUT is not following BSS transition correctly.\r\n  - Fixed: DUT is not sending TCP-KEEP-ALIVE packets in suspend state, when TCP connection is established via Cloud keep alive command.\r\n  - Fixed: DUT not able to roam from Ex-AP1 to Ex-AP2 on lowering the RSSI of Ex-AP1 in wpa3 security.\r\n  - Fixed: STAUT's probe request does not contain MBO-OCE IE\r\n  - Fixed: Ping is not working when uAP configured with wpa3-sb-192 bit EAP-TLS/EAP-TTLS/EAP-PEAP enterprise security.\r\n  - Fixed: STAUT's probe request does not contain MBO-OCE IE.\r\n  - Fixed: Throughput enhancement for STA and uAP mode for various TCP/UDP and Tx-Rx modes for embedded and wpa supplicant.\r\n  - Fixed: \"TCP_ABORTED_LOCAL\" message seen on DUT console instead of \"TCP_DONE\" when running iperf traffic\r\n  - Fixed: [pre-cert] STAUT is not dropping TP when AP is increasing MPDU spacing factor from 0 to 3.\r\n\r\nVersion 1.3.r45.p6\r\n - Updates:\r\n  - Updated firmware version to 2.p7.11 and added TP signed FW(with VDLL) too.\r\n  - uart_wifi_bridge added and errors fixed for RT1170-EVKB.\r\n - Bug Fixes:\r\n  - Fixed: Traffic stops after moving from auto rate to fixed mcs0. Command is triggered on the fly.\r\n  - Fixed: DUT not able to roam from WPA3R1 enabled AP to WPA3R3 enabled AP showing network not found.\r\n\r\nVersion 1.3.r45.p5\r\n - Updates:\r\n  - Updated firmware version to 2.p7.10 and added TP signed FW(with VDLL) too.\r\n\r\n - Bug Fixes:\r\n  - Fixed: Data path blocks once we initiate wlan-scan on DUT and change Ex-AP channel at the same time.\r\n  - Fixed: uAP beacons contain incorrect bits, SU/MU Beamformer bits are set in HE Phy capabilities and UAPSD bit is set in WME QoS Info even though it is not supported.\r\n  - Fixed: uAP beacons contain incorrect bit, UAPSD bit is set in WME QoS Info even though it is not supported.\r\n  - Fixed: [pre-cert] STAUT is not correctly following the MU EDCA parameters advertised by the AP\r\n  - Fixed: [pre-cert] 20/40 BSS coexistence management is not supported in association request.\r\n  - Fixed: Fail to connect to external AP with security wpa3.\r\n  - Fixed: uAP with wpa3 security is not connectable.\r\n  - Fixed: DUT not able to connect to Ex-AP in WPA2 security when PMF required is set.\r\n  - Fixed: Remove BAND_B rates from Supported rates for 5G channels during scan.\r\n  - Fixed: Fix wifi_cli_prov example hang when connect if enable ieee power save and deep sleep.\r\n  - Fixed: RFTM: 5Ghz channel are configured acceptable in 2.4Ghz band.\r\n  - Fixed: RFTM: wlan_set_rf_tx_power is not consistent with tx-frame power output.\r\n  - Fixed: DUT not able to roam from AP1 to AP2 in different channel (DFS) and same Band on reducing the RSSI of AP1.\r\n  - Fixed: uAP Beacons advertise 3 AKM suites (PSK & PSK SHA256 & SAE SHA256) in RSNIE when WPA2+WPA3 mixed mode is set on AP with mfpc 1 and mfpr 0.\r\n  - Fixed: DUT unable to roam from Ex-AP1 to Ex-AP2 on lowering the RSSI of Ex-AP1.\r\n  - Fixed: Fixed build errors and warnings for matter, MISRA, coverity and other compilers.\r\n\r\nVersion 1.3.r45.p4\r\n - Updates:\r\n  - Updated firmware version to 2.p7.4 and added TP signed FW(with VDLL) too.\r\n\r\n - Bug Fixes:\r\n  - Fixed: Fail to create ipv6 iperf client.\r\n  - Fixed: DUT MCS rates are not updating to default after stopping/removing previous profile with MCS set to fixed number via fixed rate command.\r\n  - Fixed: MISRA Defect fixed.\r\n  - Fixed: IEEE PS event not getting triggered.\r\n  - Fixed: While running WPS connection with Ex-AP, DUT gets deauthenticated after M4 packet, WPS_NACK is recvd. M1 packet does not have WPS PBC or keypad specific bit set.\r\n  - Fixed: Fail to create ipv6 iperf client.\r\n  - Fixed: Hang issue seen when assoc reject event received.\r\n\r\nVersion 1.3.r45.p3\r\n - Updates:\r\n  - Enabled h/w acceleration APIs via mbedtls.\r\n  - VDLL support added.\r\n\r\n - Bug Fixes:\r\n  - Fixed: (pre-cert)Need support to set UL MU Disable/Data Disable element through TX-OMI command.\r\n  - Fixed: iTCP and UDP TX traffic stream not working with ex-sta.\r\n  - Fixed: STA not able to connect to APUT when APUT is configured in OWE security.\r\n  - Fixed: DUT is going on hang state after running \"wlan-reset\" command.\r\n  - Fixed: \"TCP_ABORTED_REMOTE\" message seen on DUT console when running UDP traffic.\r\n  - Fixed: (pre-cert)STAUT is not scanning Non Transmitted SSID in MBSSID test.\r\n  - Fixed: 6+ ms of traffic burst is seen which is failing cert criteria of max cot as 6ms.\r\n  - Fixed: DUT not getting IP address(DHCP) when \"WMM_ENH\" Macro is defined in \"wifi_config.h\" file for TWT feature.\r\n  - Fixed: For Tx Frame & tx-continuous, the Measured tx-power value is 2dBm irrespective of configured Tx-power(10/12/15/20dBm)\r\n  - Fixed: Data path blocks once we initiate wlan-scan on DUT and change Ex-AP channel at the same time.\r\n  - Fixed: DUT not able to scan and connect to DFS channels when Broadcast SSID is disabled.\r\n  - Fixed: Aggregation is broken when TCP/UDP TX Data is going with TID 6-7 (Voice), and TID 3 (Best Effort).\r\n  - Fixed: uAP not beaconing in 40MHz when uAP configured in channel 12/13-40MHz in MMH mode\r\n  - Fixed: STA Ping is not working once it roams to Ex-AP2.\r\n  - Fixed: Wi-Fi lwip port does not protect correctly concurrent accesses to lwip stack.\r\n  - Fixed: Beacon frame does not include RSN XE IE when uAP configured in WPA3R3 security.\r\n  - Fixed: Beacon frame includes HT IE when uAP configured in 11A mode using capa legacy command.\r\n  - Fixed: DUT not connecting to Ex-AP when PMF is configured using \"wlan-set-pmfcfg\" command.\r\n  - Resolved IAR, MCUX and MDK build errors.\r\n\r\nVersion 1.3.r45.p2\r\n - Updates:\r\n  - Updated firmware version to 2.p7.1 and added TP signed FW too.\r\n  - Added RFTM commands missing CLI commands related to OFDMA feature.\r\n  - Added support for EVKB board.\r\n\r\n - Bug Fixes:\r\n  - Fixed: uAP not coming up in channel 14 when country code is set to JP.\r\n  - Fixed: DUT not able to connect with 32-character SSID when Ex-AP configured in open/wpa2/wpa3 security.\r\n  - Fixed: QoS Data packets not seen on air when we run \"wlan-set-tx-omi 0x48 0xff 16\" command on DUT.\r\n  - Fixed: [pre-cert] Not able to set non-preferred channel in MBO through wpa_cli on RTOS.\r\n  - Fixed: Automatic Channel Selection is not working when DUT configured in MMH mode.\r\n  - Fixed: STA not able to connect to APUT when APUT is configured in OWE security.\r\n  - Fixed: Wi-Fi lwip port does not protect correctly concurrent accesses to lwip stack.\r\n  - Fixed: DUT is going on hang state after running \"wlan-reset\" command.\r\n  - Resolved IAR, MCUX and MDK build errors.\r\n\r\nVersion 1.3.r43.p9\r\n - Updates:\r\n  - Added support for RF test mode.\r\n\r\n - Bug Fixes:\r\n  - Fixed: (pre-cert)Updated help message for TX-OMI command.\r\n  - Fixed: (pre-cert)STAUT is not scanning Non Transmitted SSID in MBSSID test.\r\n  - Fixed: (pre-cert)STAUT is not governing OBSS Narrow Bandwidth RU in UL OFDMA Tolerance Support.\r\n  - Fixed compilation errors and warnings after branch merge.\r\n\r\nVersion 1.3.r44.p3\r\n - Bug fixes:\r\n  - Added RSNX IE for WPA3-R3 for uAP\r\n\r\nVersion 1.3.r44.p2\r\n - Updates:\r\n  - Updated CA2, RB3+ firmware to p82\r\n  - Bug fixes:\r\n   - Fixes for 11KR\r\n   - Fixes for WPA3-R3 STA\r\n   - Added extra event for Connected notification in case of uAP\r\n\r\nVersion 1.3.r44.p1\r\n - Updates:\r\n  - Updated CA2, RB3+ firmware to p79\r\n  - Updated 8801 firmware to p180\r\n\r\n - Features:\r\n  - Added 11KVR support for CA2 and RB3+\r\n\r\n - Bug fixes:\r\n  - Fixed: Association Request does not include Group Management Cipher Suite IE in RSNIE when PMF mandatory is set on STA in WPA2-PSK/WPA3/OWE security.\r\n  - Fixed: Sending of deauth codes in all scenarios\r\n  - Fixed: Command timeout issues for wlan-eu-crypto\r\n  - Added Coverity fixes\r\n  - Fixed command timeout seen during simultaneous AP + STA mode, with high\r\n  traffic on 8801\r\n  - Set proper value for Edmac value updated to support Murata 2DS Module\r\n  - Fixed Channel switch announcement is not seen in beacon in AP+STA mode,\r\n  when AP changes channel on 8801\r\n  - Added few BT Sig qualification fixes\r\n\r\nVersion 1.3.r43.p8\r\n - Updates:\r\n  - Updated firmware version to p182.1 and added TP signed secure FW too.\r\n\r\n - Bug Fixes:\r\n  - Fixed: (pre-cert)APUT beacons does not have RSNXE when configured in H2E mode.\r\n\r\nVersion 1.3.r43.p7\r\n - Updates:\r\n  - Updated firmware version to p182.\r\n  - Added TP signed secure FW.\r\n  - Added support for 2EL M2 module for Firecrest.\r\n  - Added wifi capability configuration support.\r\n  - Added FIPS validation feature.\r\n  - Added wifi rf test mode example.\r\n  - Unified all wifi examples in wifi_cli.\r\n  - 11R is not surrpoted for FC.\r\n\r\n - Bug Fixes:\r\n  - Modified the method to load RU tx power limit with RT.\r\n  - Modified txrate config design for 11AC and 11AX features.\r\n  - Added support for roaming and neighbor request processing.\r\n  - Fixed: \"Error in sending Background traffic\" messages seen on DUT while running Background TX-Traffic.\r\n  - Fixed: STAUT is not associating in WPA3 Hash-to-Element only mode.\r\n  - Fixed: Not able to change HE MAC Capabilities or HE PHY Capabilities in Association Request using 11axcfg command.\r\n  - Fixed: DUT not waking up from suspend state when we start multicast traffic after 30sec-1 minute.\r\n  - Fixed: STAUT hangs after scanning AP in scenario K of SI-5.2.2 test case.\r\n  - Fixed: STAUT is not including operating class 81 and 115 under Alternate Operating Classes in assoc request.\r\n  - Fixed: STAUT fails to roam from WPA3 cionfigured AP1 to WPA2-PSK configured AP2.\r\n  - Fixed: DUT goes for DHCP DORA Process after roaming to AP2 from AP1.\r\n  - Fixed build errors and warnings.\r\n  - Corrected description related to num_dat_pkts parameter of tx-omi command.\r\n\r\nVersion 1.3.r43.p6\r\n - Updates:\r\n  - Updated firmware version to p174 and added latest signed FW bins as well.\r\n\r\n - Bug Fixes:\r\n  - Fixed: Command timeout issues observed for various offload commands.\r\n  - Fixed: TWT requester bit not set in Extended Capabilities IE (127) in Association Request and Probe Request of STAUT.\r\n  - Fixed: Not able to scan and connect Firecrest-STA to Firecrest-uAP configured in UNII-4 band channels 173 and 177.\r\n  - Fixed: Multiple error messages are seen on DUT while running the stress \"RX ping on STA, Start-stop uAP\" in loop.\r\n  - Added 11AX macro so that nss settings can be available for 11AC as well as 11AX based configurations.\r\n  - Fixed various warning for IAR, MDK, armgcc and mcuXpresso compilers.\r\n\r\nVersion 1.3.r43.p5\r\n - Updates:\r\n  - Updated firmware version to p168(however signed firmware is not updated in this release and has version p164).\r\n\r\n - Bug Fixes:\r\n  - Fixed: DUT not able to connect to AP configured in WPA2/WPA3 mixed mode security.\r\n  - Fixed: Association Request does not include Group Management Cipher Suite IE in RSNIE when PMF mandatory is set on STA in WPA2-PSK/WPA3/OWE security.\r\n  - Fixed: uAP Beacons does not include SHA256 in RSNIE when PMF mandatory is set on AP in WPA2-PSK security.\r\n  - Fixed: Device getting hanged while setting txpwrlimit by CMD 'wlan-set-txpwrlimit'.\r\n  - Fixed: Not able to load RU tx power limit with RT.\r\n  - Fixed: Not able to change HE parameters in HE MAC Capabilities or HE PHY Capabilities using 11axcfg command.\r\n\r\nVersion 1.3.r43.p4\r\n - Updates:\r\n  - None.\r\n\r\n - Bug Fixes:\r\n  - Updated helper message for owe_only cli.\r\n  - Fixed: Observed bi-directional data traffic on air while running uni-directional TCP-RX traffic.\r\n  - Fixed: UDP-TX traffic going without using aggregation.\r\n  - Throughput values will now be displayed on DUT while running iperf Tx and Rx traffic.\r\n\r\nVersion 1.3.r43.p3\r\n - Updates:\r\n  - Updated firmware version to p164.\r\n\r\n - Bug Fixes:\r\n  - Added ed mac config support for uAP.\r\n  - Modified process_rsn_ie function on driver side to provide support for Group Management Cipher suite.\r\n  - Added conditional logic related to handling of region code.\r\n\r\nVersion 1.3.r43.p2\r\n - Bug Fixes:\r\n  - Added delay in uart_wifi_bridge application to correctly read calibration data for RB3P board.\r\n\r\nVersion 1.3.r43.p1\r\n - Updates:\r\n  - Updated firmware version to p162.\r\n  - Added MBO feature support.\r\n  - Added OWE feature support.\r\n\r\n - Bug Fixes:\r\n  - uAP Beacons contains MFPC & MFPR bits set to 1 in WPA2-PSK security after removing the previous WPA3 security profile.\r\n  - Added new cli parameters for wlan-set-tx-omi command to send OMI using QoS Null Packet or QoS Data Packet according to input provided.\r\n  - Corrected 11R configuration macro in allMacros_iw61x.txt file and removed the same from ignoreMacros_iw61x.txt file.\r\n  - Coverity fix: Changed all WM_FAIL to -WM_FAIL.\r\n\r\nVersion 1.3.r42.p4\r\n  -New Additions:\r\n   - CA2 and RB3+ f/w updated to v16_xx.21.p64.1\r\n\r\nVersion 1.3.r42.p3\r\n  -New Additions:\r\n   - 8801 f/w update\r\n  -Bug Fixes:\r\n   - Fixed Misra issues.\r\n\r\nVersion 1.3.r42.p2\r\n  -Bug Fixes:\r\n   - Fixed Misra issues.\r\n\r\nVersion 1.3.r42.p1\r\n  -New Additions:\r\n   - RTOS abstraction improvement\r\n   - Added support for FIPS for CA2 and RB3+\r\n   - Added uAP 11AC support\r\n   - Deprecated support for 88W8977 Wi-Fi SoC\r\n   - Added 8978 SoC firmware p64.\r\n   - Added 8987 SoC firmware p64.\r\n   - Added mlanutl equivalent utility on RT to create wifi fw compatible command arrays.\r\n\r\n  -Bug Fixes:\r\n   - Fixed Misra issues.\r\n\r\nVersion 1.3.r41.p2\r\n  -New Additions:\r\n   - Updated license header as a github friendly license.\r\n   - Added 8801 SoC firmware p177 with get Coex Statistics support.\r\n   - Added 8987 SoC firmware p32.2 with Bluetooth related fixes. Added fix for automatic ble disconnect issue.\r\n\r\n  -Bug Fixes:\r\n   - Fixed Unable to start/stop 11n rx reorder timer(50%).\r\n   - Fixed Getting Improper Channel Number in \"wlan-get-uap-channel\" command.\r\n   - Fixed DUT fails to start DHCP intermittently.\r\n   - Fixed wrong wlan-list output.\r\n   - Fixed station connect issue after host sleep is enabled and disabled.\r\n   - Fixed Misra and coverity issues.\r\n   - Fixed automatic ble disconnect issue after 30 seconds of connection establishment.\r\n\r\nVersion 1.3.r41.p1\r\n  -Bug Fixes:\r\n   - Updated 8801 SoC firmware to toggle GRANT Pin with WLAN/BT time on HIGH Request with Low Priority.\r\n   - Added coverity fixes.\r\n\r\nVersion 1.3.r40.p5\r\n  -Bug Fixes:\r\n   - Fixed issue of DUT not entering Powersave mode on all SoCs.\r\n\r\nVersion 1.3.r40.p4\r\n  -Bug Fixes:\r\n   - Default bandwidth set to 20 MHz for uAP on 8977.\r\n   - Fixed an issue in static IPv4 address assignment.\r\n   - Fixed warning and errors for IAR, MDK and gn + ninja + armgcc toolchains.\r\n\r\nVersion 1.3.r40.p3\r\n  -Bug Fixes:\r\n   - Added wlan_uap_set_httxcfg API to set 40 MHz support in 2.4 GHz.\r\n   - Fix for build issue seen for wifi_setup 1020\r\n\r\nVersion 1.3.r40.p2\r\n  -Bug Fixes:\r\n   - Fixed IPv6 address and state updates as per the networking stack configuration.\r\n   - Removed errors shown in channel validation and in setting custom CFP tables\r\n   - Added API to support selection of 20 and 40 MHz bandwidth\r\n   - Added -b(bandwidth) option in wifi_cli iperf command\r\n   - DHCP client doesn't report the failure of obtaining IP address\r\n   - Remove dependency for wifi_config_internal.h\r\n   - Remove warnings reported for channel list variables\r\n   - Fix STA not sending data in 40M bandwidth for BGN 40 in 2.4G\r\n\r\n\r\nVersion 1.3.r38.p2\r\n  - New Additions:\r\n   - Added Support for IPv6.\r\n   - Added support for Hostsleep and packet filters.\r\n   - Updated Firecrest Firmware version to p50.5.\r\n   - Updated CA2 Firmware version to p21.22.\r\n\r\n  -Bug Fixes:\r\n   - Fixed an issue where DUT not able to start UAP Network in 2G MMH Mode.\r\n   - Fixed an issue where Command 0xb2 timeout is seen when stopped uAP while running DL traffic.\r\n\r\nVersion 1.3.r37.p4\r\n  - New Additions:\r\n   - Added support for new API for HostCmd in RT Platform.\r\n   - Added provision to set tx rates for HE mode in wlan_set_txratecfg API.\r\n   - Added support for new command to set tx OMI.\r\n   - Added WPA3 R3 support for 8801, RB3, RB3+ and CA2.\r\n   - Updated Firecrest firmware version to p50.2.\r\n   - Updated CA2 firmware version to p235.2\r\n   - Updated RB3+ firmware version to p11.3.\r\n   - Updated 8801 firmware version to p191.2\r\n   - Updated RB3 firmware version to p186.2.\r\n\r\n  - Bug Fixes:\r\n   - Fixed an issue where default netif was not set to STA after closing uAP.\r\n   - Fixed an issue where 30% low RX throughput was seen with 11AN 40Mhz.\r\n   - Fixed wlan_start and wlan_stop API working.\r\n   - Fixed High ping latency when DUT is put in IEEEPS mode.\r\n   - Fixed an issue where wlan_get_dtim_period API was not returning any value.\r\n   - Fixed SVD vulnerability issue on RB3+.\r\n   - Fixed MISRA/Coverity issues.\r\n   - Fixed SVD vulnerability issue on 8977, 8801 and CA2.\r\n   - Fixed an issue in Firecrest where STAUT is disconnecting immediately after ieeeps command is fired.\r\n   - Fixed an issue where UDP traffic was not working on uAP mode.\r\n   - Country code not being displayed in 11d is being fixed\r\n\r\nVersion 1.3.r35.p2\r\n  - New Additions:\r\n   - Added support for 11ax for Firecrest.\r\n   - Updated Firecrest firmware version to p27.\r\n\r\n  - Bug Fixes:\r\n   - Fixed an issue for CA2 where tcp/udp Rx traffic was not seen with Linksys AP.\r\n   - Fixed tx power limit issue for Firecrest.\r\n   - Fixed an issue for Firecrest where Ping stops working after TCP traffic is started from DUT.\r\n   - Changed WLAN_PSK_MAX_LENGTH to 64 from 65.\r\n   - Fixed an issue where mfpc was not set properly.\r\n\r\nVersion 1.3.r34.p2\r\n  - New Additions:\r\n   - Updated CA2(8987) SoC firmware to p235.1.\r\n\r\n  - Bug Fixes:\r\n   - Fixed WPA3 Authentication failure for CA2.\r\n   - Fixed SPP connection issue.\r\n\r\nversion 1.3.r34.p1\r\n  - New Additions:\r\n   - Updated CA2(8987) SoC firmware to p235.\r\n   - Added Separation of fw download from Wi-Fi initialization.\r\n   - Added support for Multicast group creation\r\n   - Updated license content in the wlan src for Murata or Generic customer.\r\n   - Added support for new firmware version display.\r\n   - Added config Macro for disabling Rx SDIO aggregation. This is enabled by default.\r\n\r\n  - Bug Fixes:\r\n   - Fixed CH 144 connection issue.\r\n\r\nversion 1.3.r33.p2\r\n  - New Additions:\r\n   - Updated RB3+(8978) SoC firmware to p214.\r\n   - Updated CA2(8987) SoC firmware to p200.\r\n\r\n  - Bug Fixes:\r\n  - Fixed an issue where, wifi connection was failing during BLE activity.\r\n  - Fixed an issue where a2dp profile app could not find a2dp sink device.\r\n\r\n\r\nversion 1.3.r32.p5\r\n  - New Additions:\r\n   - Updated RB3+(8978) SoC firmware to p198.\r\n   - Updated CA2(8987) SoC firmware to p199.\r\n\r\n  - Bug Fixes:\r\n   - Fixed an issue where BT pairing auth failure was observed between two 8987\r\n   or two IW416 devices due to same DH Public Key being generated.\r\n\r\nversion 1.3.r32.p4\r\n  - New Additions:\r\n   - Updated RB3+(8978) SoC firmware to p197.\r\n\r\n  - Bug Fixes:\r\n   - Fixed an issue where, in presence of WLAN, BT A2DP SNK scenario can observe continuous glitches because\r\n   of BT utilizing the WLAN overlapping channels.\r\n   - Fixed an issue where, in presence of BT A2DP SRC scenario and WLAN traffic, both will share air-time.\r\n   WLAN Rx TP can drop to 15-20% of its baseline because of A2DP occupying more air-time duty cycle.\r\n\r\nversion 1.3.r32.p3\r\n  - New Additions:\r\n   - Updated RB3+(8978) SoC firmware to p196.\r\n   - Updated CA2(8987) SoC firmware to p162.\r\n   - Updated RB3(8977) SoC firmware to p186.\r\n   - Updated Falcon(8801) SoC firmware to p191.\r\n\r\n  - Bug Fixes:\r\n   - Fixed an issue where STAUT was not advertising extended capabilities in assoc request\r\n   - Fixed an issue where cal data download API is not setting the cal data\r\n   correctly.\r\n   - Fixed an issue where Ping of 10000 bytes is not workingfor WMM case with 11n/11ac pre-cert WFA testbed AP's.\r\n   - VU FFD(vulnerability) fixes have been made for CA2(8987)/RB3+(8978)/RB3(8977)/Falcon(8801).\r\n\r\nversion 1.3.r31.p1\r\n  - New Additions:\r\n   - Updated RB3+(8978) SoC firmware to p152.\r\n   - Updated CA2(8987) SoC firmware to p152.\r\n   - Added WMM feature for 8987 SoC\r\n  -Updates\r\n   - Enabled wifi deep sleep and IEEEPS modes as part of CLI initialisation.\r\n   - Updated module macro for CA2 from WIFI_BOARD_AW_CM358MA to WIFI_BOARD_AW_CM358.\r\n  - Bug Fixes:\r\n   - Fixed deepsleep error when called immediately after disconnection\r\n   - Fixed an issue where uAP was not turned on when country is specified using wlan_set_country API.\r\n\r\nversion 1.3.r30.p2\r\n  - New Additions:\r\n   - Updated 8978 SoC firmware to p185.\r\n   - Updated 8987 SoC firmware to p185.\r\n  - Bug Fixes:\r\n   - Fixed a regression issue in WiFi FW where Ex-client is not able to associate with uAP on 8978 and 8987 SoC.\r\n\r\nversion 1.3.r30.p1\r\n  - New Additions:\r\n   - Updated RB3+(8978) SoC firmware to p145.\r\n   - Updated CA2(8987) SoC firmware to p145.\r\n  - Bug Fixes:\r\n   - Fixed MISRA C-2012 Rule 14.4 issues.\r\n   - Updated TX Power configuration table for uAP.\r\n   - Fixed an issue where in MFG mode measured TX power value for 2.4GHz is 10.97dBm\r\n     and for 5GHz is 12.03dBm always irrespective of TX-power values configured in CA2.\r\n   - Fixed an issue where in control frames measured TX power is less than configured\r\n     Tx power by 3dBm for 5Ghz 40Mhz BW and ~7dBm for 5Ghz 80Mhz BW in CA2.\r\n\r\nversion 1.3.r29.p2\r\n  - New Additions:\r\n   - Updated 8987 SoC firmware to p142.\r\n   - Updated 8978 SoC firmware to p142.\r\n  - Bug Fixes:\r\n   - Fixed MISRA C-2012 Directive 4.7, Directive 4.10, Rule 15.7 and Rule 14.4 issues\r\n   - Fixed wlan_get_sta_tx_power() API implementation for retrieving station tx power level.\r\n   - Fixed wlan-set/get-txpwrlimit CLI command for setting/getting TX power\r\n   limit for 11AC modulation groups in 8987.\r\n   - Fixed an issue where in MFG mode(rf_test_mode=1) after disabling\r\n   wlan_set_rf_cont_mode(CMD18_CW=1) command response timeout is seen in 8987.\r\n\r\nversion 1.3.r29.p1\r\n  - New Additions:\r\n   - Added support for 8987 SoC with p141 firmware version.\r\n   - Updated 8978 SoC firmware to p141.\r\n  - Bug Fixes:\r\n   - Fixed Misra C-2012 required category issues for Rule 17.7.\r\n   - Fixes for BCA-TDM in Co-Ex for 8978 SoC.\r\n   - Fixed A2DP glitches in BT when WLAN connected for 8978 SoC.\r\n\r\nversion 1.3.r27.p2\r\n  - New Additions:\r\n   - Updated FW versions to p130 for 8978.\r\n\r\nversion 1.3.r27.p1\r\n\r\n  - Bug Fixes:\r\n   - Fixed PMF pre-cert issue where STAUT is not associating to PSK-SHA-256 enabled AP.\r\n   - Fixed 11N pre-cert issue where 11N-5.2.47 STAUT AMPDU TX test case is failing.\r\n\r\nversion 1.3.r26.p2\r\n\r\n  - New Additions:\r\n   - Updated FW versions to p184 for 8977 and p122 FW for 8978.\r\n   - Added wifi_cert application under wifi_examples.\r\n\r\n  - Bug Fixes:\r\n   - Fixed an issue where connection problem is seen with uAP in wifi_webconfig after removing stored credentials.\r\n   - Fixed RF Test Mode issue for setting data rate in uAP mode.\r\n   - Fixed Coverity and MISRA issues in WiFi Driver.\r\n   - Fixed WPA3 SAE pre-cert requirement where there was requirement of Auth confirm to be initiated by either STA or Ex-AP.\r\n   - Removed following API's from WiFi driver as they were not supported:\r\n     - wifi_auto_reconnect_enable()\r\n     - wifi_auto_reconnect_disable()\r\n     - wifi_get_auto_reconnect_config()\r\n     - wifi_get_tbtt_offset()\r\n     - wifi_set_packet_filters()\r\n     - wifi_set_auto_arp()\r\n     - wifi_tcp_keep_alive()\r\n     - wifi_nat_keep_alive()\r\n\r\nversion 1.3.r23.p2\r\n\r\n  - New Additions:\r\n   - Minor update to wifi_test_mode CLIs for better usability.\r\n   - Added bug fixes in WiFi FW and updated FW versions to p155 for 8801, p182 for 8977 and p106 for 8978.\r\n   - Added new wlan_uap_set_htcapinfo() API for setting HT Capability field for uAP.\r\n\r\n  - Bug Fixes:\r\n   - Fixed RF Test Mode issues for SD8801 and SD8977 reported by QA.\r\n   - Fixed WiFi 802.11n WPA3 SAE pre-cert test failures for SD8978.\r\n   - Fixed stack overflow issue with WLCMGR thread during wlan-connect.\r\n   - Fixed memory corruption issue cause by scan list overflow when using 11D.\r\n\r\nversion 1.3.r21.p1\r\n\r\n  - New Additions:\r\n   - Added support for SD8978.\r\n   - Added Test Mode support for 8801, 8977 and 8978.\r\n   - Added new FW binaries for 8801, 8977 and 8978.\r\n   - Added OTP Force Region support in WiFi Driver.\r\n   - Added support for DHCP Server CLI to print IP addresses of connected clients to uAP.\r\n   - Added support to set HT Capability field for uAP.\r\n   - Added wlan_get_chanlist API and CLI.\r\n   - Added WiFi Driver task priority configurability option.\r\n   - Reduced WiFi Driver SRAM footprint.\r\n   - Added support in Wi-Fi driver to print debug events from WLAN FW.\r\n   - Added support for FW Dump generation using a micro-USB mass storage device.\r\n\r\n  - Bug Fixes:\r\n   - Fixed an issue where a redundant Link Loss disconnect timer was defined in the wifi_iperf app.\r\n   - Fixed an issue where sometimes the wlan_disconnect call did not abort an ongoing re-association.\r\n   - Fixed an issue where station connection to an Open security Ext-AP fails after connection to a WPA3-SAE Ext-AP.\r\n   - Fixed an issue where uAP did not start with WPA3-SAE security type.\r\n\r\n  - Known Issues\r\n   - Wi-Fi sample apps do not work with Rev-C (2018) version of RT685 board\r\n\r\nversion 1.3.r20.p1\r\n\r\n  - New Additions:\r\n   - Added new FW for 8801.\r\n\r\n  - Bug Fixes:\r\n   - Fixed an issue where STAUT went to hang state when doing a disconnect in the wifi_iperf app.\r\n   - Fixed an issue where STAUT failed to reassociate with an Ext-AP after band switch.\r\n   - Fixed an issue where Scan command timeout was observed after changing the ssid of Ext-AP to which STAUT is connected.\r\n\r\n  - Known Issues\r\n   - Wi-Fi sample apps do not work with Rev-C (2018) version of RT685 board\r\n\r\nversion 1.3.r19.p1\r\n\r\n  - New Additions:\r\n   - Added new FW for 8801.\r\n   - Updated WiFi API reference manual.\r\n\r\n  - Bug Fixes:\r\n   - Fixed an issue where STAUT attempted to connect with Ext-AP continuously even when an Auth Failure occured due to incorect passphrase.\r\n   - Fixed an issue where SDIO write error occured sometimes for some packet sizes during Tx.\r\n   - Fixed an issue where packet leakage was noticed on SD8801 when noise was applied.\r\n   - Fixed an issue to supress Association Failed warning generated during a connection attempt.\r\n\r\n  - Known Issues\r\n   - Wi-Fi sample apps do not work with Rev-C (2018) version of RT685 board\r\n\r\nversion 1.3.r18.p1\r\n\r\n  - New Additions:\r\n   - Added new FW for 8977.\r\n\r\n  - Bug Fixes:\r\n   - Fixed an issue where STAUT fails to scan after Channel Switch and STAUT moves to new channel after eCSA IE.\r\n   - Fixed IAR, MDK build compilation warnings.\r\n\r\n  - Known Issues\r\n   - Wi-Fi sample apps do not work with Rev-C (2018) version of RT685 board\r\n\r\nversion 1.3.r17.p1\r\n\r\n  - New Additions:\r\n   - Added new FW for 8977.\r\n   - Added CLI command to get a list of stations connected to uAP.\r\n\r\n  - Bug Fixes:\r\n   - Fixed an issue where Scan was temporarily aborted due to noise but correct status was not being returned to the host.\r\n   - Fixed an issue where STAUT failed to connect with an AP with hidden SSID.\r\n   - Fixed IAR, MDK build compilation warnings.\r\n   - Fixed an issue where TCP bi-directional throughput stops abruptly for SD8801 and STAUT is disconnected.\r\n   - Fixed an issue where UDP Dual Mode throughput stops abruptly and disconnection is seen.\r\n   - Fixed an issue where Tx got stuck after removal of interference noise.\r\n\r\n  - Known Issues\r\n   - Wi-Fi sample apps do not work with Rev-C (2018) version of RT685 board\r\n\r\nversion 1.3.r16.p1\r\n\r\n  - New Additions:\r\n   - Added PMF Configuration for uAP.\r\n   - Updated WLAN Versioning.\r\n   - Updated WLAN CLIs.\r\n\r\n  - Bug Fixes:\r\n   - Fixed an issue where the STAUT sometimes did not send aggregated packets during Tx.\r\n   - Fixed an issue External Client could not associate with the UAP in WPA3-SAE mode.\r\n   - Fixed IAR build compilation warnings.\r\n   - Fixed an issue where the STAUT failed to associate with an AP with hidden SSID.\r\n   - Fixed an issue where active scan probe requests were sent for DFS channels.\r\n   - Fixed an issue where 2.4GHz-HT40 power values were exposed via CLI configuration.\r\n   - Fixed an issue where the STAUT will be continuously in re-association mode after link-loss.\r\n\r\n  - Known Issues\r\n   - Wi-Fi sample apps do not work with Rev-C (2018) version of RT685 board\r\n\r\nversion 1.3.r15.p1\r\n\r\n  - New Additions\r\n   - Added support for Tx Power Limit configuration.\r\n   - Added support for Channel List configuration.\r\n   - Added support for CW MODE.\r\n   - Added support for sysinfo CLI to get threads information, network stats, wlan stats and heap stats.\r\n   - Added -d and -r options to iperf CLI for dual and trade-off mode.\r\n   - Added support for antenna configuration for 8801.\r\n   - Added support for band configuration.\r\n   - Added new FW for 8977\r\n\r\n  - Bug Fixes:\r\n   - Fixed an issue where UDP Rx data rate was low in iperf dual mode operation.\r\n   - Fixed an issue where STAUT traffic was getting halted when there is traffic in overlapping BSS on the extension channel.\r\n   - Fixed an issue where STAUT was not able to transmit above MCS 4.\r\n   - Fixed an issue where association with uAP failed with WPA2 security mode.\r\n   - Fixed an issue where STAUT failed to connect to WPA3 AP due to PMF config mismatch.\r\n   - Fixed an issue where ping loss was observed for packets of size greater than 10000 bytes.\r\n   - Fixed an issue in CLI where CR and LF characters where not handled properly.\r\n   - Fixed an issue where TCP-Tx traffic abruptly stops when parallel traffic is ongoing on another device using the same AP.\r\n   - Fixed an issue where DUT goes into hang state when iperf run is aborted.\r\n   - Fixed an issue where the STATU was not sending aggregated packets to the AP.\r\n   - Fixed an issue where UAP did not start with WPA2 security mode when ACS is configured.\r\n   - Fixed an issue where ED MAC was not enabled by default.\r\n\r\n  - Known Issues\r\n   - WiFi sample apps do not work with Rev-C (2018) version of RT685 board\r\n\r\nversion 1.3.r14.p1\r\n\r\n  - New Additions\r\n   - Added support for Panasonic PAN9026 module.\r\n   - Added -t option in iperf CLI for setting traffic running time.\r\n   - Added -B option for supporting Tx/Rx Multicast packets during iperf runs.\r\n   - Added World Wide Safe Mode configurability to the WiFi Driver.\r\n   - Added ED MAC support for 8977.\r\n   - Added support for PMF APIs and CLIs.\r\n   - Added new FW for 8977 and 8801.\r\n\r\n  - Bug Fixes:\r\n   - Fixed Coverity and mandatory MISRA issues reported on v1.3.r13.p1 release.\r\n   - Fixed an isuue where DUT console was getting stuck after intiating connection with an AP which has different RSN values than expected.\r\n   - Fixed an issue where DUT was not able to roam from SAE-PSK to PSK configured AP.\r\n   - Fixed an issue where the app became unresponsive after Soft AP is stopped.\r\n   - Removed unnecessary files after Blackduck scan.\r\n\r\n  - Known Issues\r\n   - WiFi sample apps do not work with Rev-C (2018) version of RT685 board\r\n\r\nversion 1.3.r1r3.p1\r\n\r\n  - New Additions\r\n    - Updated WiFi Driver to be independednt of the LwIP stack. Only the WLAN Connection Manager now uses LwIP.\r\n    - Added WiFi Roaming feature.\r\n    - Added CLI support for iperf in wifi_cli app.\r\n    - Added support for CSA handling from wlan station side.\r\n    - Added WLAN APIs for wlan-set-txratecfg, wlan-get-txratecfg, wlan-get-data-rate, wlan-set-reg and wlan-get-reg.\r\n    - Updated External AP SSID required for wifi_iperf app.\r\n  - Bug Fixes:\r\n    - Fixed Coverity issues reported on v1.3.r12.p1 release.\r\n    - Added a fix for ping loss observed during ping test.\r\n    - Added a fix where the console became unresponsive after wlan-start-network+wlan-stop-network commands are executed in loop.\r\n    - Added a fix for HT IE missing from beacon for both 2.4GHz and 5GHZ bands.\r\n    - Fixed warnings reported for IAR.\r\n    - Added a fix for increasing DHCP leave time to 24 hrs for long duration stress tests.\r\n  - Known Issues\r\n    - WiFi sample apps do not work with Rev-C (2018) version of RT685 board\r\n\r\nversion 1.3.r12.p1\r\n\r\n  - New Additions\r\n    - Added support for ping utility.\r\n  - Bug Fixes\r\n    - Restart of SoftAP fails once SoftAP is stopped.\r\n    - HT IE is missing from beacon for both 2.4GHz and 5GHZ bands.\r\n    - Low TCP-Rx and UDP-Rx throughput observed for 5GHz-HT40 band.\r\n    - uAP couldn't be started after STA is associated to Ex-AP.\r\n    - Stopping SoftAP results in disconnection of In-STA from Ex-AP.\r\n    - DHCP server is not started for BSS created using \"wlan-add\" command.\r\n  - Known Issues\r\n    - N.A\r\n\r\nversion 1.3.r11.p2\r\n\r\n  - New Additions\r\n    - Updated SDK version for RT1060 to 2.7.1 RFP RC2.\r\n    - Added FP91 based WiFi FW for SD8801, SD8977, SD8978, and SD8987.\r\n    - SD8801, SD8977, SD8978 and SD8987 WiFi Fw have embedded WPA3 SAE support\r\n      from version v1.3.r11.p1 onwards.\r\n    - Added WLAN CLI support. Added new wifi_cli for CLI demo.\r\n  - Enhancements\r\n    - License and Copyright Updates.\r\n    - Formated code base with clang-format 10.0.0 standards.\r\n    - Integrated PICK utility for WiFi Driver code scrubbing.\r\n  - Bug Fixes\r\n    - Removed unnecessary prints LwIP stats display.\r\n    - Fixed an issue where uAP did not start on 5GHz band.\r\n    - Fixed an issue where loww TCP/UDP-Rx throughput was observed for 5GHz-HT40Mhz.\r\n  - Known Issues\r\n    - N.A\r\n\r\nversion 1.3.r10.p1\r\n\r\n  - New Additions\r\n    - Moved to using LwIP provided IPerf App.\r\n    - Added SDIO Rx Aggregation support to improve throughput.\r\n    - Added support for 11ac configuration API.\r\n    - Updated License and Copyright information on all WiFi driver files and sample apps.\r\n    - Moved MCUXpresso SDK base for RT1060 platform from 2.6.2 to 2.7.0 rc3.\r\n  - Known Issues\r\n    - N.A\r\n\r\nversion 1.3.r9.p1\r\n\r\n  - New Additions\r\n    - Achieved additional TP improvements by updating LwIP parameters.\r\n  - Bug Fixes\r\n    - Fixed the issue of low throughput for both TCP and UDP (Tx/Rx) by updating LwIP parameters.\r\n    - TCP Throughput was observed to be lower than UDP throughput by 70%-80%. Fixed this issue by updating TCP related LwIP configurations.\r\n  - Known Issues\r\n    - N.A\r\n\r\n*/\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/wifi/certs/ca-cert.h",
    "content": "const unsigned char ca_der[] = {\r\n    0x30, 0x82, 0x04, 0xa1, 0x30, 0x82, 0x03, 0x09, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x39, 0x27, 0xf3, 0x9b,\r\n    0x20, 0x1e, 0xa5, 0xe3, 0xda, 0xdb, 0x44, 0x64, 0x0d, 0x71, 0x24, 0xb6, 0x8a, 0x94, 0x33, 0x64, 0x30, 0x0d, 0x06,\r\n    0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x5f, 0x31, 0x0b, 0x30, 0x09, 0x06,\r\n    0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, 0x4e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x02,\r\n    0x4d, 0x48, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x04, 0x50, 0x55, 0x4e, 0x45, 0x31, 0x0c,\r\n    0x30, 0x0a, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x03, 0x4e, 0x58, 0x50, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\r\n    0x04, 0x03, 0x0c, 0x02, 0x43, 0x41, 0x31, 0x19, 0x30, 0x17, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,\r\n    0x09, 0x01, 0x16, 0x0a, 0x63, 0x61, 0x40, 0x6e, 0x78, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x20, 0x17, 0x0d, 0x32,\r\n    0x33, 0x30, 0x33, 0x31, 0x35, 0x31, 0x34, 0x32, 0x33, 0x31, 0x33, 0x5a, 0x18, 0x0f, 0x33, 0x30, 0x32, 0x32, 0x30,\r\n    0x37, 0x31, 0x36, 0x31, 0x34, 0x32, 0x33, 0x31, 0x33, 0x5a, 0x30, 0x5f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,\r\n    0x04, 0x06, 0x13, 0x02, 0x49, 0x4e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x02, 0x4d, 0x48,\r\n    0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x04, 0x50, 0x55, 0x4e, 0x45, 0x31, 0x0c, 0x30, 0x0a,\r\n    0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x03, 0x4e, 0x58, 0x50, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x03,\r\n    0x0c, 0x02, 0x43, 0x41, 0x31, 0x19, 0x30, 0x17, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01,\r\n    0x16, 0x0a, 0x63, 0x61, 0x40, 0x6e, 0x78, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x82, 0x01, 0xa2, 0x30, 0x0d, 0x06,\r\n    0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x8f, 0x00, 0x30, 0x82,\r\n    0x01, 0x8a, 0x02, 0x82, 0x01, 0x81, 0x00, 0xdd, 0x70, 0x03, 0x4e, 0xb4, 0x53, 0xdf, 0x45, 0xfb, 0xf2, 0x9f, 0x74,\r\n    0x0b, 0x1e, 0x53, 0x0e, 0x98, 0x30, 0x5b, 0x68, 0x26, 0x8f, 0x59, 0xba, 0xfc, 0x3c, 0xd6, 0x80, 0x33, 0xd4, 0xf1,\r\n    0x16, 0x44, 0x42, 0xc7, 0x7e, 0x77, 0xfe, 0x0b, 0xae, 0x92, 0x50, 0x4c, 0x3b, 0xeb, 0x3f, 0x28, 0x53, 0x4d, 0xa0,\r\n    0x58, 0xad, 0xd9, 0x88, 0x4a, 0xd8, 0xac, 0x52, 0xfb, 0x35, 0x5a, 0x34, 0x07, 0xb9, 0x14, 0xd4, 0x0f, 0x3d, 0xa5,\r\n    0x7a, 0xa8, 0x44, 0x17, 0x9c, 0x97, 0xb6, 0x7f, 0x0e, 0x7a, 0x05, 0x33, 0x65, 0x58, 0x42, 0xf0, 0x61, 0xd8, 0x20,\r\n    0x1f, 0xaa, 0xc6, 0xdc, 0xcf, 0x6b, 0x50, 0xb5, 0x13, 0x55, 0x19, 0x3f, 0x57, 0x6d, 0x15, 0x8f, 0x33, 0xe9, 0x86,\r\n    0x98, 0x85, 0xdf, 0xb3, 0x72, 0x4b, 0x8b, 0xa1, 0xe3, 0xa9, 0xa5, 0x43, 0x84, 0xcd, 0x61, 0x6a, 0x61, 0xbc, 0x1a,\r\n    0xb9, 0xd6, 0x57, 0xaa, 0x53, 0x4e, 0xa3, 0x1c, 0x8a, 0xab, 0x81, 0x40, 0x84, 0xaa, 0x11, 0x55, 0xcf, 0x37, 0xb4,\r\n    0x69, 0xe5, 0x65, 0x59, 0x27, 0x74, 0x78, 0xfb, 0xa3, 0xf0, 0x1a, 0xa1, 0xdd, 0xaf, 0xd7, 0x5e, 0x65, 0x72, 0x99,\r\n    0x1b, 0x40, 0x44, 0x99, 0x9f, 0x67, 0x30, 0x5f, 0x12, 0x3c, 0xb7, 0x6a, 0x03, 0xe3, 0x35, 0x10, 0xc2, 0x02, 0x80,\r\n    0x66, 0x80, 0xc2, 0xa6, 0x50, 0x9a, 0x9a, 0xa1, 0xa1, 0xf3, 0xc4, 0x06, 0x3b, 0x87, 0x3f, 0xb3, 0x0a, 0x52, 0x4d,\r\n    0xb7, 0x3c, 0x8b, 0x8d, 0x17, 0x23, 0x4f, 0x4c, 0x27, 0x7d, 0x1c, 0xb2, 0xb2, 0x6c, 0x19, 0x0c, 0xef, 0x6c, 0xf2,\r\n    0x2a, 0xfc, 0x6a, 0x98, 0xb4, 0x7f, 0x46, 0xa2, 0xf2, 0xf1, 0x36, 0x46, 0xbf, 0x40, 0x06, 0x47, 0xf3, 0xdd, 0xa7,\r\n    0xe7, 0xe4, 0xef, 0xd3, 0x1e, 0xc5, 0x01, 0xb1, 0xb0, 0x1a, 0x8b, 0x86, 0x06, 0x5f, 0x66, 0xc4, 0x3a, 0xa5, 0x49,\r\n    0x09, 0xaa, 0xf6, 0x64, 0x51, 0x41, 0x14, 0x8a, 0x7b, 0x9c, 0x06, 0xfa, 0xff, 0x06, 0xa0, 0xf2, 0x12, 0xa9, 0xef,\r\n    0x14, 0x2d, 0xd3, 0x6e, 0xee, 0x0f, 0x35, 0x10, 0xb0, 0x7a, 0x1b, 0xbb, 0x58, 0x44, 0xe8, 0x18, 0x5c, 0xc0, 0x26,\r\n    0x1c, 0xfb, 0xc3, 0x80, 0x97, 0xc1, 0xae, 0x56, 0x44, 0xd1, 0x5e, 0xd8, 0xe1, 0x66, 0xfd, 0x43, 0xea, 0x3e, 0x1f,\r\n    0x88, 0x00, 0x73, 0xb1, 0x05, 0xd5, 0xbb, 0x70, 0xe6, 0xea, 0xab, 0x6a, 0x63, 0xe7, 0xa2, 0x3b, 0xad, 0x50, 0xe0,\r\n    0xc8, 0x79, 0x22, 0x71, 0x8d, 0x31, 0x5c, 0x7d, 0xf6, 0xea, 0x0b, 0x92, 0x7a, 0x1d, 0x46, 0xde, 0xf7, 0x33, 0x4d,\r\n    0xca, 0xb0, 0xa4, 0x81, 0x1b, 0xd8, 0xd3, 0xf1, 0x8d, 0xa7, 0xc1, 0xe2, 0x84, 0x24, 0x31, 0x19, 0x71, 0x8c, 0xe6,\r\n    0xfe, 0x5d, 0xdb, 0xcd, 0x8b, 0xae, 0xa3, 0x25, 0xdd, 0x2d, 0x07, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x53, 0x30,\r\n    0x51, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xc5, 0x31, 0x78, 0x1d, 0x4a, 0xde, 0xf0,\r\n    0x95, 0x0c, 0xdd, 0xd2, 0x21, 0x41, 0x2c, 0x8c, 0xfa, 0xc8, 0x20, 0x2d, 0xb1, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d,\r\n    0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xc5, 0x31, 0x78, 0x1d, 0x4a, 0xde, 0xf0, 0x95, 0x0c, 0xdd, 0xd2, 0x21,\r\n    0x41, 0x2c, 0x8c, 0xfa, 0xc8, 0x20, 0x2d, 0xb1, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,\r\n    0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b,\r\n    0x05, 0x00, 0x03, 0x82, 0x01, 0x81, 0x00, 0xb1, 0x1b, 0x2b, 0xdc, 0xf0, 0x60, 0x19, 0xa8, 0x83, 0xb9, 0x10, 0xc3,\r\n    0x69, 0x40, 0x52, 0x09, 0x14, 0x41, 0x85, 0x5c, 0x07, 0x73, 0xbc, 0x0f, 0x19, 0xae, 0xcd, 0x40, 0xb2, 0x88, 0x60,\r\n    0x12, 0x15, 0x49, 0x8a, 0x37, 0x82, 0xb5, 0x66, 0xa6, 0xea, 0x3e, 0x94, 0xe0, 0x17, 0x64, 0x1d, 0x9f, 0x40, 0x49,\r\n    0x03, 0x8e, 0x0b, 0x0d, 0x4e, 0x16, 0xdf, 0x3d, 0x0d, 0x1d, 0x79, 0xe5, 0xaf, 0xd0, 0x20, 0x48, 0xe2, 0x4b, 0x07,\r\n    0xc1, 0x3a, 0x23, 0x10, 0x21, 0xc2, 0x72, 0xe1, 0xb4, 0xd6, 0x78, 0xd8, 0xe5, 0xa9, 0xa8, 0x34, 0x2c, 0x74, 0x70,\r\n    0x09, 0x30, 0xb7, 0xbe, 0xde, 0x3e, 0x25, 0x02, 0x74, 0xfc, 0xe4, 0x1c, 0xfa, 0xb9, 0xa7, 0x70, 0x94, 0xfa, 0x52,\r\n    0x5f, 0x32, 0x73, 0x93, 0x1b, 0x1c, 0x11, 0xb4, 0xc6, 0x7a, 0xd9, 0x72, 0x18, 0xf5, 0x74, 0x06, 0xce, 0xb6, 0xb1,\r\n    0x0f, 0x5c, 0x45, 0x21, 0xca, 0x52, 0xda, 0x14, 0x50, 0x8a, 0x1a, 0x30, 0xbd, 0xd3, 0xed, 0x13, 0x10, 0x5c, 0x94,\r\n    0x93, 0xb0, 0x45, 0x46, 0x31, 0xbb, 0xb1, 0x61, 0xc8, 0xa9, 0xad, 0x91, 0xee, 0xe1, 0xea, 0xeb, 0x1f, 0x8e, 0x67,\r\n    0x22, 0xc4, 0x3a, 0x54, 0xd8, 0x52, 0xeb, 0xde, 0xcf, 0x6d, 0x72, 0x31, 0xaf, 0x75, 0x8c, 0xd2, 0x2c, 0xa8, 0x72,\r\n    0x8d, 0x1a, 0x35, 0x53, 0x4b, 0x10, 0x98, 0xc7, 0xd8, 0x3d, 0x59, 0x18, 0x24, 0xdf, 0x57, 0xe6, 0x31, 0x91, 0x55,\r\n    0x17, 0x2e, 0x40, 0x1d, 0x82, 0x34, 0xa6, 0x2d, 0x99, 0x23, 0x73, 0xd6, 0x1c, 0x2b, 0x66, 0xe2, 0x50, 0x18, 0xc2,\r\n    0x9d, 0x85, 0x32, 0x12, 0xac, 0x7e, 0x41, 0x76, 0x33, 0x39, 0x5b, 0x6d, 0x22, 0xd4, 0x0b, 0xb0, 0xc2, 0x26, 0x53,\r\n    0x72, 0x2c, 0x18, 0xbf, 0x45, 0x13, 0x8f, 0xce, 0xc8, 0x28, 0x3c, 0x6d, 0x13, 0x83, 0x02, 0x79, 0xe0, 0x38, 0xb7,\r\n    0x14, 0x74, 0x1e, 0xab, 0xc8, 0x9d, 0xad, 0xe2, 0x64, 0xae, 0x4f, 0x16, 0xd6, 0x60, 0xa1, 0x0d, 0x90, 0x11, 0xce,\r\n    0x9b, 0x9b, 0x51, 0xe0, 0xba, 0x7c, 0xa2, 0xb5, 0xfd, 0xa4, 0x40, 0x7f, 0xee, 0xaa, 0x5f, 0xf1, 0xbd, 0xf8, 0x04,\r\n    0x8f, 0x5a, 0x82, 0x50, 0x80, 0xf5, 0x27, 0x18, 0x8d, 0x37, 0x86, 0x35, 0xb5, 0xf2, 0xfa, 0x18, 0x71, 0x82, 0x24,\r\n    0x9a, 0xdd, 0x37, 0x1e, 0xf1, 0xee, 0xd8, 0xd2, 0x16, 0xf4, 0x93, 0xa7, 0x35, 0x46, 0xa0, 0x54, 0x1c, 0x3b, 0x7d,\r\n    0x77, 0x48, 0x4e, 0x76, 0x46, 0x27, 0x2d, 0x83, 0x40, 0x76, 0x66, 0x1b, 0x3c, 0x7b, 0x57, 0x68, 0x2d, 0x9d, 0x21,\r\n    0xa4, 0x70, 0xf5, 0xff, 0x58, 0xce, 0x3c, 0xf3, 0xc9, 0x67, 0x8c, 0x9d, 0x5a, 0x9c, 0xa0, 0x02, 0xf3, 0x0c, 0x44,\r\n    0x65, 0x1b, 0xe3, 0x51, 0x79, 0xcd, 0xf7, 0xb6, 0x66, 0xb3, 0x9d};\r\nunsigned int ca_der_len = 1189;\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/wifi/certs/client-cert.h",
    "content": "const unsigned char client_der[] = {\r\n    0x30, 0x82, 0x04, 0x3c, 0x30, 0x82, 0x02, 0xa4, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\r\n    0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x5f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\r\n    0x02, 0x49, 0x4e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x02, 0x4d, 0x48, 0x31, 0x0d, 0x30,\r\n    0x0b, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x04, 0x50, 0x55, 0x4e, 0x45, 0x31, 0x0c, 0x30, 0x0a, 0x06, 0x03, 0x55,\r\n    0x04, 0x0a, 0x0c, 0x03, 0x4e, 0x58, 0x50, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x02, 0x43,\r\n    0x41, 0x31, 0x19, 0x30, 0x17, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x0a, 0x63,\r\n    0x61, 0x40, 0x6e, 0x78, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x20, 0x17, 0x0d, 0x32, 0x33, 0x30, 0x33, 0x31, 0x35,\r\n    0x31, 0x34, 0x32, 0x36, 0x32, 0x31, 0x5a, 0x18, 0x0f, 0x33, 0x30, 0x32, 0x32, 0x30, 0x37, 0x31, 0x36, 0x31, 0x34,\r\n    0x32, 0x36, 0x32, 0x31, 0x5a, 0x30, 0x67, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49,\r\n    0x4e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x02, 0x4d, 0x48, 0x31, 0x0d, 0x30, 0x0b, 0x06,\r\n    0x03, 0x55, 0x04, 0x07, 0x0c, 0x04, 0x50, 0x55, 0x4e, 0x45, 0x31, 0x0c, 0x30, 0x0a, 0x06, 0x03, 0x55, 0x04, 0x0a,\r\n    0x0c, 0x03, 0x4e, 0x58, 0x50, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x06, 0x43, 0x6c, 0x69,\r\n    0x65, 0x6e, 0x74, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16,\r\n    0x0e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x40, 0x6e, 0x78, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x82, 0x01, 0xa2,\r\n    0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x8f,\r\n    0x00, 0x30, 0x82, 0x01, 0x8a, 0x02, 0x82, 0x01, 0x81, 0x00, 0xd6, 0xd8, 0x4e, 0x1a, 0xc7, 0x51, 0x89, 0x3c, 0x6e,\r\n    0xd5, 0xf7, 0xc2, 0x44, 0xbd, 0x8d, 0x53, 0x6a, 0x01, 0xc4, 0x6b, 0x1d, 0xe3, 0xae, 0xbd, 0x83, 0x34, 0x92, 0x31,\r\n    0x89, 0xe3, 0x65, 0x63, 0x25, 0xf3, 0xe8, 0x38, 0x37, 0xcd, 0xae, 0x13, 0xac, 0xe3, 0x61, 0xa8, 0x4f, 0x1a, 0xa0,\r\n    0x61, 0xb0, 0x54, 0x19, 0x39, 0x4c, 0xd5, 0xb2, 0x99, 0xaa, 0x2c, 0x15, 0xe5, 0x7e, 0x61, 0xec, 0xe9, 0x2f, 0x1e,\r\n    0xd1, 0x89, 0x91, 0x90, 0x08, 0x08, 0x51, 0xc7, 0x8a, 0x9f, 0xa2, 0xf0, 0xa8, 0x69, 0x8e, 0xf7, 0xda, 0x7e, 0x69,\r\n    0xb4, 0x28, 0xf8, 0x83, 0x81, 0x6d, 0x96, 0x6d, 0xb2, 0x88, 0x98, 0xa3, 0x1f, 0x2f, 0xe3, 0x09, 0x3a, 0x5e, 0xe1,\r\n    0x0a, 0xfc, 0xba, 0xd5, 0x98, 0x0a, 0x1d, 0x66, 0x1f, 0xeb, 0x8d, 0x9b, 0x6a, 0x7a, 0xd9, 0x43, 0x29, 0x8c, 0xd9,\r\n    0xbd, 0x6e, 0x97, 0xde, 0x84, 0x8b, 0xe0, 0x9c, 0x36, 0x21, 0xd8, 0x22, 0xa1, 0xbf, 0xcc, 0x01, 0x53, 0x53, 0x31,\r\n    0x36, 0x97, 0xaa, 0xfe, 0x53, 0x88, 0x14, 0xc9, 0xac, 0xbb, 0x03, 0x4d, 0x74, 0x48, 0x8d, 0x47, 0x5b, 0xbe, 0x41,\r\n    0xc0, 0xd2, 0x70, 0x2a, 0xc0, 0x41, 0x2d, 0xa8, 0x1a, 0xd8, 0xa5, 0x88, 0xd1, 0x5e, 0x07, 0x33, 0x40, 0x00, 0xaa,\r\n    0xe4, 0xc3, 0xd1, 0xb5, 0x57, 0x22, 0x1c, 0xfc, 0xc8, 0x84, 0x23, 0xab, 0xe2, 0x27, 0x2d, 0x40, 0xa8, 0x1e, 0x39,\r\n    0xf3, 0x58, 0xd3, 0x6a, 0x62, 0x55, 0x6d, 0x46, 0x53, 0xf9, 0xad, 0x5a, 0xa4, 0xf5, 0xba, 0x5c, 0xb8, 0x95, 0xc8,\r\n    0x32, 0xef, 0x8e, 0x77, 0x50, 0x58, 0x71, 0xc8, 0xaf, 0x5b, 0xc2, 0x8c, 0x37, 0x46, 0xeb, 0x75, 0xbc, 0x96, 0x89,\r\n    0x12, 0x86, 0xe8, 0x5c, 0x9e, 0x34, 0x42, 0xed, 0xbc, 0xf6, 0x72, 0x69, 0x28, 0xa5, 0xbd, 0x36, 0x9c, 0xe2, 0x67,\r\n    0xf1, 0x09, 0x4f, 0xcb, 0x49, 0x96, 0x45, 0x16, 0xe4, 0xe8, 0x6a, 0x03, 0x91, 0xab, 0x77, 0x5a, 0x52, 0x49, 0x9c,\r\n    0xa6, 0x6a, 0x84, 0xc1, 0x7c, 0x7b, 0x68, 0x71, 0x23, 0x3d, 0x82, 0x13, 0x58, 0x1c, 0xd7, 0x75, 0x37, 0x81, 0x86,\r\n    0x2e, 0xfb, 0x74, 0x66, 0xfb, 0xcf, 0xfe, 0xab, 0x57, 0x1c, 0xe0, 0x02, 0x95, 0x4c, 0x54, 0x7d, 0x31, 0xf7, 0xb7,\r\n    0x3f, 0xe2, 0xb8, 0xf0, 0xe6, 0x90, 0x68, 0x8d, 0x81, 0x9b, 0xdd, 0xad, 0x25, 0x8d, 0x53, 0x5b, 0x6e, 0xbe, 0x87,\r\n    0x61, 0x62, 0x10, 0xe6, 0x2b, 0x2e, 0x14, 0xa6, 0x1b, 0x0c, 0x5a, 0xca, 0xe1, 0x32, 0xb1, 0xf9, 0xd6, 0x0b, 0xb2,\r\n    0xfb, 0xc4, 0xf4, 0xe8, 0xf9, 0x86, 0xae, 0x9c, 0x8c, 0x37, 0x07, 0x96, 0x59, 0x87, 0xdf, 0x2d, 0xd4, 0x05, 0x97,\r\n    0x7d, 0xc2, 0x59, 0xef, 0xa9, 0x8c, 0xcd, 0x7c, 0xb6, 0xab, 0x14, 0xc7, 0x7d, 0xe3, 0x02, 0x03, 0x01, 0x00, 0x01,\r\n    0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x81,\r\n    0x00, 0xc4, 0xce, 0x37, 0x39, 0x3f, 0x3e, 0x78, 0xdb, 0x9e, 0x37, 0x9c, 0x42, 0x49, 0x30, 0x65, 0xe7, 0x59, 0xd1,\r\n    0xd8, 0x83, 0x55, 0xf4, 0x1b, 0xb0, 0x8e, 0x43, 0xc4, 0x5c, 0x6c, 0xca, 0x95, 0x5a, 0xd9, 0x89, 0xd3, 0x4b, 0x73,\r\n    0x78, 0x8a, 0x3a, 0xc6, 0xe3, 0xdc, 0x67, 0x1d, 0xb6, 0xe9, 0x8e, 0x67, 0x71, 0x0a, 0xa4, 0x00, 0x79, 0x82, 0x40,\r\n    0x11, 0x64, 0x86, 0x4a, 0x8a, 0x8f, 0x98, 0xce, 0x2c, 0x74, 0xb5, 0x56, 0xeb, 0xfa, 0xe8, 0x83, 0x27, 0x0f, 0xec,\r\n    0x12, 0xcb, 0x85, 0x30, 0x9a, 0x16, 0xcc, 0x15, 0x91, 0xb5, 0x66, 0xd0, 0x58, 0xec, 0x1f, 0x55, 0x2c, 0xde, 0x17,\r\n    0xc1, 0x83, 0x5c, 0x50, 0x53, 0x8f, 0x64, 0x62, 0xab, 0xec, 0x2b, 0x04, 0x06, 0xeb, 0x29, 0x7e, 0x18, 0x53, 0xfa,\r\n    0xfd, 0x0b, 0x79, 0x73, 0x65, 0x02, 0x5b, 0x85, 0x8f, 0x8b, 0xb3, 0xd3, 0xa1, 0x1b, 0x3e, 0x4c, 0x90, 0x55, 0xd1,\r\n    0x38, 0x01, 0x0c, 0x76, 0xca, 0x06, 0xe3, 0xaa, 0x3e, 0x7b, 0xfc, 0x3c, 0xbe, 0x8c, 0x25, 0x5a, 0x06, 0x5f, 0x1f,\r\n    0x61, 0x8b, 0xab, 0x2c, 0xa4, 0xc3, 0xc7, 0x2b, 0xfa, 0x07, 0x63, 0x1c, 0xda, 0xea, 0x3f, 0x09, 0x92, 0x67, 0x40,\r\n    0xbb, 0x5d, 0xd5, 0xc8, 0x3d, 0xf0, 0x6b, 0xdc, 0x7d, 0x88, 0x6a, 0x42, 0xb2, 0xe4, 0xd0, 0x82, 0x69, 0xb5, 0x00,\r\n    0x18, 0x40, 0x3c, 0xd1, 0x2c, 0x22, 0x8d, 0xda, 0x9a, 0xdf, 0xb6, 0x79, 0x51, 0xf9, 0x73, 0xe8, 0xfd, 0xb1, 0xb4,\r\n    0x24, 0x3c, 0x2f, 0xfe, 0xeb, 0xb3, 0xd2, 0x0c, 0x14, 0x64, 0x9b, 0x63, 0xe9, 0xc4, 0x71, 0x8e, 0x6b, 0xac, 0x5a,\r\n    0xa2, 0x16, 0x18, 0xe9, 0x12, 0xec, 0xa1, 0x8c, 0x4c, 0x81, 0xd1, 0x26, 0xb3, 0xa5, 0x3d, 0x5a, 0x0f, 0xf1, 0x81,\r\n    0xe4, 0x2b, 0xb5, 0x9a, 0xc6, 0x83, 0x28, 0x64, 0x92, 0xfe, 0x36, 0x88, 0xab, 0x16, 0x29, 0x5a, 0x03, 0xef, 0x96,\r\n    0x2c, 0xb0, 0xd8, 0x16, 0x02, 0x3b, 0x5d, 0x38, 0xff, 0xed, 0xcb, 0x59, 0xdf, 0xb0, 0x9a, 0x5f, 0xae, 0xf9, 0xff,\r\n    0xaa, 0xd3, 0xaf, 0x7c, 0xce, 0xa2, 0xeb, 0xd0, 0xeb, 0xb4, 0x2e, 0xb8, 0x60, 0xea, 0x7f, 0xb5, 0x79, 0xb5, 0x93,\r\n    0x39, 0x83, 0x04, 0x2b, 0xfe, 0xab, 0xd3, 0x9b, 0x8c, 0xee, 0x32, 0x13, 0x76, 0xaa, 0xed, 0x67, 0x87, 0x0d, 0xa9,\r\n    0x7b, 0xe8, 0x96, 0xb3, 0x22, 0x3e, 0xf4, 0xac, 0xf8, 0xd4, 0x1e, 0xce, 0x1c, 0x73, 0x9a, 0xf4, 0x13, 0x33, 0xe6,\r\n    0x0f, 0x43, 0xc3, 0xe5, 0x23, 0x78, 0xeb, 0xc3, 0xe4, 0x98, 0x82, 0x46, 0x0f, 0x93, 0xb0, 0xda, 0xa5, 0xa4, 0xb8,\r\n    0x9b, 0x81, 0x65, 0x68, 0xf5, 0xf1, 0xae, 0xd0, 0x5c, 0x9e, 0x9d, 0x9b, 0xa8, 0x88, 0x2f, 0xdd, 0x25, 0x2b, 0xf3,\r\n    0xbb, 0xe0, 0xfe, 0xf8, 0xeb};\r\nunsigned int client_der_len = 1088;\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/wifi/certs/client-key.h",
    "content": "const unsigned char client_key_der[] = {\r\n    0x30, 0x82, 0x06, 0xe3, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x81, 0x00, 0xd6, 0xd8, 0x4e, 0x1a, 0xc7, 0x51, 0x89,\r\n    0x3c, 0x6e, 0xd5, 0xf7, 0xc2, 0x44, 0xbd, 0x8d, 0x53, 0x6a, 0x01, 0xc4, 0x6b, 0x1d, 0xe3, 0xae, 0xbd, 0x83, 0x34,\r\n    0x92, 0x31, 0x89, 0xe3, 0x65, 0x63, 0x25, 0xf3, 0xe8, 0x38, 0x37, 0xcd, 0xae, 0x13, 0xac, 0xe3, 0x61, 0xa8, 0x4f,\r\n    0x1a, 0xa0, 0x61, 0xb0, 0x54, 0x19, 0x39, 0x4c, 0xd5, 0xb2, 0x99, 0xaa, 0x2c, 0x15, 0xe5, 0x7e, 0x61, 0xec, 0xe9,\r\n    0x2f, 0x1e, 0xd1, 0x89, 0x91, 0x90, 0x08, 0x08, 0x51, 0xc7, 0x8a, 0x9f, 0xa2, 0xf0, 0xa8, 0x69, 0x8e, 0xf7, 0xda,\r\n    0x7e, 0x69, 0xb4, 0x28, 0xf8, 0x83, 0x81, 0x6d, 0x96, 0x6d, 0xb2, 0x88, 0x98, 0xa3, 0x1f, 0x2f, 0xe3, 0x09, 0x3a,\r\n    0x5e, 0xe1, 0x0a, 0xfc, 0xba, 0xd5, 0x98, 0x0a, 0x1d, 0x66, 0x1f, 0xeb, 0x8d, 0x9b, 0x6a, 0x7a, 0xd9, 0x43, 0x29,\r\n    0x8c, 0xd9, 0xbd, 0x6e, 0x97, 0xde, 0x84, 0x8b, 0xe0, 0x9c, 0x36, 0x21, 0xd8, 0x22, 0xa1, 0xbf, 0xcc, 0x01, 0x53,\r\n    0x53, 0x31, 0x36, 0x97, 0xaa, 0xfe, 0x53, 0x88, 0x14, 0xc9, 0xac, 0xbb, 0x03, 0x4d, 0x74, 0x48, 0x8d, 0x47, 0x5b,\r\n    0xbe, 0x41, 0xc0, 0xd2, 0x70, 0x2a, 0xc0, 0x41, 0x2d, 0xa8, 0x1a, 0xd8, 0xa5, 0x88, 0xd1, 0x5e, 0x07, 0x33, 0x40,\r\n    0x00, 0xaa, 0xe4, 0xc3, 0xd1, 0xb5, 0x57, 0x22, 0x1c, 0xfc, 0xc8, 0x84, 0x23, 0xab, 0xe2, 0x27, 0x2d, 0x40, 0xa8,\r\n    0x1e, 0x39, 0xf3, 0x58, 0xd3, 0x6a, 0x62, 0x55, 0x6d, 0x46, 0x53, 0xf9, 0xad, 0x5a, 0xa4, 0xf5, 0xba, 0x5c, 0xb8,\r\n    0x95, 0xc8, 0x32, 0xef, 0x8e, 0x77, 0x50, 0x58, 0x71, 0xc8, 0xaf, 0x5b, 0xc2, 0x8c, 0x37, 0x46, 0xeb, 0x75, 0xbc,\r\n    0x96, 0x89, 0x12, 0x86, 0xe8, 0x5c, 0x9e, 0x34, 0x42, 0xed, 0xbc, 0xf6, 0x72, 0x69, 0x28, 0xa5, 0xbd, 0x36, 0x9c,\r\n    0xe2, 0x67, 0xf1, 0x09, 0x4f, 0xcb, 0x49, 0x96, 0x45, 0x16, 0xe4, 0xe8, 0x6a, 0x03, 0x91, 0xab, 0x77, 0x5a, 0x52,\r\n    0x49, 0x9c, 0xa6, 0x6a, 0x84, 0xc1, 0x7c, 0x7b, 0x68, 0x71, 0x23, 0x3d, 0x82, 0x13, 0x58, 0x1c, 0xd7, 0x75, 0x37,\r\n    0x81, 0x86, 0x2e, 0xfb, 0x74, 0x66, 0xfb, 0xcf, 0xfe, 0xab, 0x57, 0x1c, 0xe0, 0x02, 0x95, 0x4c, 0x54, 0x7d, 0x31,\r\n    0xf7, 0xb7, 0x3f, 0xe2, 0xb8, 0xf0, 0xe6, 0x90, 0x68, 0x8d, 0x81, 0x9b, 0xdd, 0xad, 0x25, 0x8d, 0x53, 0x5b, 0x6e,\r\n    0xbe, 0x87, 0x61, 0x62, 0x10, 0xe6, 0x2b, 0x2e, 0x14, 0xa6, 0x1b, 0x0c, 0x5a, 0xca, 0xe1, 0x32, 0xb1, 0xf9, 0xd6,\r\n    0x0b, 0xb2, 0xfb, 0xc4, 0xf4, 0xe8, 0xf9, 0x86, 0xae, 0x9c, 0x8c, 0x37, 0x07, 0x96, 0x59, 0x87, 0xdf, 0x2d, 0xd4,\r\n    0x05, 0x97, 0x7d, 0xc2, 0x59, 0xef, 0xa9, 0x8c, 0xcd, 0x7c, 0xb6, 0xab, 0x14, 0xc7, 0x7d, 0xe3, 0x02, 0x03, 0x01,\r\n    0x00, 0x01, 0x02, 0x82, 0x01, 0x80, 0x04, 0x89, 0x7c, 0xdc, 0xc3, 0xe8, 0xcc, 0xe5, 0x21, 0xd2, 0x12, 0xf1, 0x5f,\r\n    0x52, 0x41, 0x71, 0xc9, 0x83, 0x50, 0x0a, 0x93, 0x0f, 0x03, 0xd9, 0xac, 0xb3, 0xa7, 0x82, 0xb4, 0x4e, 0xc1, 0x0d,\r\n    0x5e, 0xf7, 0xcf, 0xa7, 0xa0, 0x46, 0x0f, 0xaf, 0x0a, 0xaf, 0xa2, 0x98, 0x53, 0x53, 0x54, 0x9f, 0xbb, 0x81, 0x8b,\r\n    0x26, 0xd2, 0xa0, 0x90, 0xac, 0xfe, 0x13, 0x00, 0x43, 0x60, 0x6f, 0xe0, 0xf8, 0xeb, 0xad, 0xd2, 0xee, 0xfc, 0xcb,\r\n    0xf5, 0xdf, 0x77, 0x1a, 0xa7, 0xaa, 0xc7, 0x5e, 0x1d, 0xb0, 0x5c, 0xfc, 0x8e, 0xf8, 0xac, 0x72, 0xc9, 0x8a, 0xb5,\r\n    0xfc, 0x3d, 0xbc, 0x37, 0x84, 0xd5, 0xad, 0xa3, 0x84, 0x3d, 0x16, 0xa6, 0x53, 0x3d, 0x3d, 0xb3, 0x65, 0xb2, 0xec,\r\n    0x5f, 0xd1, 0x96, 0xdd, 0x59, 0x3f, 0x38, 0x36, 0x58, 0x01, 0x50, 0x25, 0x42, 0xf3, 0x5e, 0x85, 0xc9, 0x98, 0x1b,\r\n    0x72, 0xe1, 0x21, 0x55, 0x2b, 0x2f, 0x7b, 0xc8, 0xff, 0x71, 0x75, 0x75, 0x71, 0xb5, 0x08, 0x0d, 0x07, 0x16, 0xed,\r\n    0x58, 0x06, 0x3f, 0xaa, 0x22, 0xa3, 0xb0, 0x66, 0x2a, 0x56, 0x7d, 0xe5, 0x4b, 0xe2, 0xb0, 0xb0, 0xc9, 0xc0, 0xe4,\r\n    0xa6, 0x3a, 0xba, 0x24, 0x1a, 0xad, 0x08, 0x91, 0xe3, 0x1a, 0x01, 0x3c, 0xeb, 0xd5, 0x17, 0xc6, 0xcc, 0xfb, 0xd8,\r\n    0xc0, 0x86, 0x4f, 0xe6, 0x66, 0xb5, 0xa3, 0xab, 0x2b, 0xa5, 0x11, 0xff, 0xcb, 0x56, 0x5f, 0x88, 0xef, 0x64, 0x45,\r\n    0x73, 0x09, 0x68, 0x86, 0x5a, 0x7c, 0xb4, 0x3c, 0xb8, 0x1f, 0x4b, 0x40, 0xd3, 0x05, 0xe2, 0xbb, 0x2c, 0x05, 0x8e,\r\n    0xda, 0x81, 0x9f, 0x37, 0x25, 0xfa, 0x7d, 0x7d, 0x94, 0x5f, 0x11, 0xc9, 0x47, 0x24, 0x72, 0x0e, 0x17, 0x08, 0xb6,\r\n    0xa7, 0xf0, 0x13, 0x2d, 0x76, 0xfe, 0x97, 0xed, 0x0c, 0xe6, 0x3b, 0xc0, 0x04, 0xe8, 0xf9, 0x0e, 0x70, 0xd7, 0x63,\r\n    0xa8, 0x32, 0xf1, 0x63, 0xd1, 0xca, 0xc7, 0xe2, 0x81, 0xf5, 0x72, 0x97, 0x22, 0x43, 0x52, 0x0a, 0x6b, 0x22, 0xdd,\r\n    0xe6, 0xf3, 0x9d, 0xed, 0x3a, 0xeb, 0x3b, 0x52, 0x7c, 0x38, 0xca, 0x14, 0xbc, 0x95, 0x9c, 0x9c, 0x0b, 0x14, 0x4b,\r\n    0x2c, 0x99, 0x45, 0xd1, 0x4e, 0x02, 0xaa, 0xf4, 0x57, 0x60, 0xba, 0xaf, 0x92, 0x03, 0x22, 0x03, 0x6d, 0x5e, 0x36,\r\n    0xfa, 0x14, 0x92, 0x26, 0x09, 0x61, 0x40, 0xe2, 0x9d, 0x75, 0x01, 0xb6, 0x0e, 0x89, 0xfc, 0x44, 0xc4, 0xf1, 0x4f,\r\n    0xb0, 0xe9, 0x50, 0xfe, 0xdf, 0xcd, 0xec, 0xe7, 0xda, 0x41, 0x75, 0x73, 0x4f, 0x46, 0x63, 0xf9, 0xa1, 0x28, 0xf4,\r\n    0xcb, 0xf6, 0x19, 0x15, 0x1c, 0xea, 0x0b, 0xde, 0x9a, 0x7d, 0xe8, 0x4c, 0x22, 0xd2, 0x0b, 0x4e, 0x5b, 0xa5, 0x0c,\r\n    0xe0, 0x34, 0x05, 0x97, 0x83, 0xa6, 0x5f, 0x74, 0xba, 0x81, 0x02, 0x81, 0xc1, 0x00, 0xfc, 0x1c, 0xe8, 0x40, 0x0f,\r\n    0x52, 0x89, 0x0b, 0x71, 0x02, 0x91, 0x64, 0xf1, 0x40, 0xfb, 0x55, 0x52, 0x44, 0x43, 0x9d, 0x85, 0x3e, 0x74, 0x86,\r\n    0xfc, 0xbb, 0x16, 0x3e, 0x3f, 0xa5, 0x6a, 0xb5, 0x04, 0xec, 0x4b, 0x5e, 0x06, 0x43, 0xd0, 0xa5, 0xf2, 0x48, 0xdb,\r\n    0x0c, 0xea, 0x4d, 0xf7, 0xfd, 0x8c, 0xcc, 0xb9, 0xe6, 0xe7, 0xa4, 0xb7, 0x2b, 0xbc, 0x80, 0xd0, 0x67, 0xa6, 0x41,\r\n    0xf4, 0x97, 0x5f, 0x86, 0x82, 0x42, 0xe3, 0xf4, 0xfd, 0x68, 0xc2, 0xcc, 0xe2, 0x60, 0x75, 0x9c, 0x55, 0x42, 0x06,\r\n    0x6c, 0xf3, 0x58, 0xa2, 0xdb, 0x3c, 0x63, 0x16, 0x21, 0x99, 0xde, 0x96, 0x46, 0x39, 0x36, 0x12, 0xc0, 0x7a, 0x69,\r\n    0x4c, 0x92, 0x3b, 0x69, 0xd6, 0xc9, 0xc6, 0x01, 0x0f, 0x77, 0x58, 0xc2, 0xba, 0xb4, 0xe1, 0x86, 0x90, 0x92, 0xa8,\r\n    0xba, 0x04, 0x76, 0xd7, 0xb4, 0x2b, 0x24, 0x6e, 0x7c, 0xca, 0x14, 0x3d, 0xe8, 0xb4, 0xcb, 0xf0, 0x2c, 0x00, 0xf9,\r\n    0x21, 0x8c, 0x6f, 0x37, 0x8c, 0x30, 0x69, 0x7a, 0xd2, 0x0e, 0x0a, 0xa1, 0xd5, 0x41, 0x7b, 0x75, 0xe7, 0xa9, 0x41,\r\n    0xe4, 0xeb, 0xbf, 0x7a, 0x89, 0xc4, 0x77, 0x0e, 0x78, 0x80, 0x28, 0x55, 0x97, 0x52, 0x4f, 0x88, 0xc6, 0x96, 0x72,\r\n    0x4c, 0x27, 0x56, 0x73, 0xc7, 0x76, 0x4c, 0x40, 0xf1, 0x3f, 0xf2, 0x6e, 0xc6, 0xc9, 0x08, 0x29, 0x02, 0x81, 0xc1,\r\n    0x00, 0xda, 0x28, 0x4c, 0xfb, 0x2b, 0xa1, 0xb9, 0xe9, 0x95, 0x77, 0x2a, 0x81, 0x4d, 0x51, 0x54, 0xcb, 0xc6, 0xb8,\r\n    0xbb, 0xf4, 0xf0, 0x99, 0x7b, 0x02, 0x7b, 0xdf, 0x0b, 0x2a, 0x83, 0x8f, 0x4b, 0xa7, 0x8b, 0xcb, 0x27, 0x04, 0x7e,\r\n    0x1e, 0x9f, 0x7a, 0xd7, 0x13, 0x8d, 0x9c, 0xa2, 0xbc, 0xf5, 0x3e, 0x1b, 0x2a, 0x7f, 0xb3, 0xc9, 0x05, 0xbd, 0x41,\r\n    0x8f, 0xa5, 0xbf, 0x04, 0x7f, 0xf4, 0xa4, 0x33, 0xd2, 0x45, 0x0d, 0xcf, 0x80, 0x86, 0x59, 0xaa, 0x95, 0xc9, 0xd5,\r\n    0x16, 0x30, 0xc8, 0xbe, 0x1a, 0x5b, 0xaf, 0x78, 0xe3, 0xc2, 0x3e, 0xc8, 0xd5, 0x0b, 0x96, 0x97, 0x7b, 0x51, 0xbb,\r\n    0x88, 0xd4, 0x7c, 0x58, 0x8c, 0x11, 0xd7, 0x81, 0xb3, 0xff, 0x0e, 0x66, 0x4b, 0x2e, 0xac, 0x23, 0x02, 0x0e, 0x7f,\r\n    0xc0, 0xb1, 0x5a, 0xd7, 0x19, 0x05, 0x0a, 0xa4, 0x41, 0x04, 0xcb, 0xbc, 0xd3, 0x3b, 0xc6, 0x49, 0x6e, 0xfa, 0x64,\r\n    0xb7, 0x8b, 0xfe, 0xf8, 0xe9, 0xf3, 0x62, 0xbf, 0xfc, 0x4c, 0xe8, 0x7a, 0x27, 0x9e, 0x30, 0xcd, 0x30, 0x15, 0x4d,\r\n    0xb7, 0x6c, 0xe4, 0xcc, 0x64, 0x6b, 0xe2, 0x1b, 0x94, 0x20, 0x81, 0xb7, 0x93, 0xb0, 0xfd, 0x49, 0x27, 0x5d, 0x98,\r\n    0x19, 0x6d, 0xc9, 0x4e, 0xf6, 0xfd, 0x6f, 0xcb, 0xd3, 0x27, 0x77, 0xbd, 0xf1, 0x1b, 0x6f, 0x8f, 0x67, 0x66, 0xa4,\r\n    0xba, 0x07, 0x2b, 0x02, 0x81, 0xc1, 0x00, 0x93, 0x91, 0xf4, 0x1c, 0x33, 0x1b, 0xd3, 0x9d, 0xff, 0xdb, 0x49, 0xf1,\r\n    0xb5, 0x09, 0x9d, 0x54, 0x16, 0xe0, 0x60, 0x57, 0x9e, 0xbb, 0xad, 0x07, 0xaa, 0x7d, 0x74, 0x0a, 0xa1, 0xc4, 0x98,\r\n    0x8e, 0x36, 0xc0, 0x7d, 0x69, 0x1e, 0xef, 0xa8, 0xfc, 0xc9, 0xb1, 0xfd, 0x8e, 0x34, 0xc3, 0xc8, 0xaa, 0x00, 0x35,\r\n    0x81, 0x87, 0x78, 0x05, 0xc1, 0x35, 0xf7, 0x93, 0xca, 0xe9, 0x30, 0xb7, 0x20, 0x8d, 0x4e, 0x5b, 0xf4, 0x79, 0x64,\r\n    0xe7, 0x6d, 0x41, 0x59, 0xed, 0x05, 0x81, 0x02, 0xb6, 0xac, 0x6d, 0x06, 0x47, 0xd5, 0xb5, 0x07, 0x36, 0x9e, 0xc5,\r\n    0x3d, 0x1a, 0x13, 0xef, 0xe7, 0x34, 0x59, 0x9e, 0x9e, 0x21, 0x4e, 0x45, 0xbe, 0x8d, 0x45, 0xfb, 0xb0, 0xbe, 0xd0,\r\n    0x88, 0xa4, 0x5d, 0xee, 0x75, 0xa5, 0x45, 0xe5, 0x50, 0x97, 0xe5, 0x50, 0x9f, 0xf9, 0xa6, 0xfa, 0xa1, 0xba, 0x33,\r\n    0x0b, 0xfd, 0x3d, 0x67, 0xd5, 0xc9, 0x15, 0xb2, 0xdd, 0xf5, 0x53, 0xe8, 0x7f, 0xcb, 0xac, 0xf9, 0xed, 0xb4, 0x14,\r\n    0xb9, 0xd0, 0xa4, 0x69, 0x72, 0xca, 0xda, 0x16, 0x83, 0x30, 0x43, 0xb1, 0x8f, 0x66, 0xb2, 0xe0, 0xee, 0x2d, 0x32,\r\n    0xa7, 0x24, 0xbf, 0x97, 0x5c, 0x6a, 0x43, 0xc2, 0xcc, 0x43, 0xb9, 0xa2, 0x53, 0x93, 0x1f, 0x16, 0x8c, 0x25, 0x61,\r\n    0x83, 0x0d, 0xf3, 0xa9, 0x5b, 0x50, 0x3e, 0x31, 0xe9, 0x02, 0x81, 0xc0, 0x43, 0x5e, 0x1a, 0x97, 0x9d, 0x9b, 0xad,\r\n    0x9b, 0x92, 0x4a, 0x60, 0x57, 0xd9, 0x96, 0x7a, 0x07, 0x0b, 0x70, 0xd4, 0xaa, 0x08, 0xfa, 0x7c, 0x60, 0x01, 0xfc,\r\n    0x98, 0xa8, 0x22, 0x44, 0x47, 0xea, 0x8f, 0x62, 0xc6, 0xc3, 0xbe, 0x66, 0x9a, 0x7d, 0x06, 0x99, 0xc5, 0x2b, 0x4f,\r\n    0x9d, 0xe6, 0x65, 0xad, 0x61, 0xec, 0x59, 0x8a, 0x84, 0x39, 0x33, 0x5b, 0xb6, 0xa5, 0x4c, 0x30, 0x6f, 0x4d, 0x9d,\r\n    0xab, 0x1b, 0x23, 0xee, 0xa6, 0x13, 0xd6, 0xf0, 0xb4, 0x9c, 0xc5, 0x2e, 0xbb, 0x15, 0xe2, 0x8e, 0xa5, 0x2d, 0x84,\r\n    0xb9, 0x60, 0xac, 0x9e, 0xbc, 0x1b, 0x7d, 0xff, 0x7d, 0x57, 0x7a, 0x00, 0x01, 0x0d, 0xfd, 0x12, 0x14, 0x18, 0x66,\r\n    0xb7, 0x3c, 0xd6, 0x27, 0x84, 0xa3, 0xff, 0x08, 0x38, 0x84, 0x5d, 0xb3, 0x15, 0x91, 0xa5, 0xc6, 0xd6, 0x25, 0xb9,\r\n    0x1f, 0x52, 0xe9, 0xcf, 0x7f, 0xb3, 0x7f, 0xc2, 0x01, 0x81, 0x55, 0x44, 0xd0, 0xf8, 0x85, 0xc9, 0x49, 0x1d, 0x7f,\r\n    0x87, 0xdc, 0x00, 0x16, 0x68, 0xd1, 0x92, 0xe4, 0x6a, 0x2a, 0xc9, 0xfb, 0x10, 0xa7, 0x7e, 0xee, 0xab, 0xda, 0x01,\r\n    0x06, 0x37, 0x1b, 0x97, 0xa3, 0x06, 0x0e, 0xd1, 0x5e, 0x54, 0xaa, 0xb9, 0x7f, 0x8b, 0xa0, 0xd4, 0xe8, 0xe2, 0x73,\r\n    0x20, 0xdb, 0x99, 0x40, 0x90, 0x8a, 0x16, 0x63, 0x44, 0x5d, 0x10, 0x15, 0x5a, 0x4d, 0x02, 0x81, 0xc0, 0x5a, 0x64,\r\n    0x55, 0x96, 0x85, 0x29, 0xf3, 0x13, 0xe5, 0x67, 0xf4, 0xb8, 0xfa, 0x43, 0xae, 0x75, 0xce, 0xae, 0x01, 0xc7, 0x51,\r\n    0xac, 0xc4, 0x95, 0x81, 0x36, 0x2c, 0x4d, 0x31, 0x92, 0x3d, 0xa4, 0x1e, 0x42, 0x2e, 0x66, 0xe0, 0xd9, 0x04, 0xfd,\r\n    0xb7, 0xc1, 0x88, 0xdc, 0xc7, 0xee, 0x01, 0x0d, 0xfa, 0x2a, 0x4a, 0x04, 0x85, 0x51, 0xa9, 0x52, 0x35, 0xe7, 0xe6,\r\n    0x4a, 0xac, 0x6d, 0x0f, 0x1c, 0xa5, 0x28, 0x66, 0xd5, 0x55, 0xf9, 0x0e, 0x13, 0x7e, 0xfa, 0x26, 0x28, 0xad, 0xbe,\r\n    0xf9, 0xe8, 0xfd, 0x37, 0xdf, 0x9b, 0x8d, 0x9b, 0x7c, 0xe1, 0x28, 0xd2, 0x21, 0xb0, 0x47, 0xba, 0xdc, 0xbb, 0xf9,\r\n    0x69, 0xcc, 0x0f, 0x3b, 0x98, 0x6c, 0xdb, 0xc1, 0x66, 0x0f, 0x97, 0x06, 0xbe, 0xcb, 0xe2, 0x65, 0xae, 0x23, 0x75,\r\n    0x7c, 0x5c, 0xbf, 0x26, 0x75, 0xae, 0xf6, 0x0d, 0xad, 0x16, 0xb5, 0x14, 0x9e, 0x0f, 0xd3, 0x66, 0x62, 0x48, 0xd4,\r\n    0x35, 0x09, 0x63, 0xc4, 0xed, 0x13, 0xa2, 0x09, 0x11, 0x4a, 0x20, 0x52, 0x6b, 0x39, 0x74, 0xc4, 0xff, 0x6a, 0xb3,\r\n    0xc5, 0xbf, 0x72, 0xf7, 0xae, 0x6c, 0x60, 0xba, 0x8f, 0xb9, 0xe0, 0xc3, 0x04, 0xe0, 0x47, 0xbc, 0xb3, 0x70, 0x49,\r\n    0x89, 0xbc, 0x4c, 0x4f, 0x51, 0xcb, 0x5a, 0x7f, 0xc1, 0xbc, 0x92, 0xc9, 0x90, 0x66, 0x58, 0x94, 0x63, 0x2a, 0xcd};\r\nunsigned int client_key_der_len = 1767;\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/wifi/certs/dh-param.h",
    "content": "unsigned char dh_der[] = {\r\n    0x30, 0x82, 0x01, 0x08, 0x02, 0x82, 0x01, 0x01, 0x00, 0xf5, 0x39, 0x89, 0x48, 0xe9, 0x02, 0xfc, 0xd5, 0x13,\r\n    0x31, 0xa5, 0x83, 0x8c, 0xeb, 0xdf, 0x6f, 0xb5, 0xd2, 0x94, 0x35, 0x17, 0x60, 0xec, 0xb5, 0x1f, 0x43, 0xd0,\r\n    0x90, 0xbd, 0xc8, 0x77, 0xa7, 0x1e, 0xd3, 0x0a, 0x2b, 0x2a, 0xd4, 0xea, 0xa8, 0xbb, 0x19, 0xa9, 0x01, 0x11,\r\n    0xde, 0x35, 0xaf, 0xd1, 0x95, 0x55, 0x05, 0x17, 0x9d, 0xf9, 0xc9, 0x73, 0x63, 0xdf, 0x10, 0x97, 0x4d, 0x55,\r\n    0xa2, 0x25, 0xa1, 0x90, 0xf0, 0x16, 0xe2, 0x23, 0xd0, 0x87, 0x7b, 0xc9, 0x03, 0xdb, 0x13, 0xdf, 0xf9, 0xe2,\r\n    0xb3, 0xe7, 0xf0, 0xff, 0x53, 0xf8, 0xbb, 0xd0, 0x5b, 0xe2, 0x97, 0x17, 0xeb, 0x6b, 0x20, 0x72, 0x96, 0x1f,\r\n    0xec, 0x18, 0x60, 0xd0, 0x1f, 0xe8, 0xf1, 0x6f, 0xa1, 0x82, 0x16, 0xca, 0xdc, 0x03, 0xde, 0xcd, 0x8b, 0xbc,\r\n    0xc8, 0xd3, 0xca, 0x30, 0x16, 0x52, 0x7f, 0x42, 0xfa, 0xbc, 0xb5, 0xae, 0xb1, 0x64, 0x4a, 0x00, 0x28, 0x0b,\r\n    0xcc, 0xfa, 0x7a, 0x59, 0xe9, 0x67, 0x84, 0xb1, 0x5e, 0x95, 0x86, 0x9a, 0xc7, 0xc5, 0xb3, 0xc0, 0x5a, 0x9c,\r\n    0x35, 0xa2, 0x33, 0x6e, 0xbd, 0xbf, 0x4a, 0x59, 0x07, 0x76, 0x7c, 0xdd, 0x3e, 0xe2, 0x70, 0x2b, 0x12, 0x75,\r\n    0x60, 0xfc, 0x89, 0xc3, 0x0b, 0xe7, 0xb0, 0x08, 0x01, 0x91, 0x68, 0x6e, 0x19, 0xe5, 0x3f, 0xdf, 0xc7, 0xdf,\r\n    0x57, 0x86, 0x83, 0xfa, 0x50, 0x46, 0x07, 0x5f, 0xe0, 0x59, 0x2c, 0x98, 0x79, 0x01, 0xb0, 0x8b, 0xad, 0xb5,\r\n    0x40, 0x36, 0x5b, 0xcf, 0x01, 0x59, 0x79, 0xfd, 0xb1, 0x4f, 0x69, 0x2b, 0x1c, 0xec, 0x97, 0x04, 0xd2, 0xdb,\r\n    0x7c, 0x0e, 0x5f, 0xa4, 0xd6, 0x16, 0x4a, 0x6c, 0x78, 0x8b, 0xa7, 0x23, 0xff, 0x14, 0x6e, 0x88, 0x37, 0xbf,\r\n    0x77, 0xc3, 0x11, 0xac, 0x87, 0xe9, 0xab, 0x0e, 0x4f, 0x95, 0xa0, 0x37, 0x2b, 0x02, 0x01, 0x02};\r\nunsigned int dh_der_len = 268;\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/wifi/certs/server-cert.h",
    "content": "const unsigned char server_der[] = {\r\n    0x30, 0x82, 0x04, 0x3c, 0x30, 0x82, 0x02, 0xa4, 0x02, 0x01, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,\r\n    0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x5f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,\r\n    0x02, 0x49, 0x4e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x02, 0x4d, 0x48, 0x31, 0x0d, 0x30,\r\n    0x0b, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x04, 0x50, 0x55, 0x4e, 0x45, 0x31, 0x0c, 0x30, 0x0a, 0x06, 0x03, 0x55,\r\n    0x04, 0x0a, 0x0c, 0x03, 0x4e, 0x58, 0x50, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x02, 0x43,\r\n    0x41, 0x31, 0x19, 0x30, 0x17, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x0a, 0x63,\r\n    0x61, 0x40, 0x6e, 0x78, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x20, 0x17, 0x0d, 0x32, 0x33, 0x30, 0x33, 0x31, 0x35,\r\n    0x31, 0x34, 0x32, 0x34, 0x33, 0x37, 0x5a, 0x18, 0x0f, 0x33, 0x30, 0x32, 0x32, 0x30, 0x37, 0x31, 0x36, 0x31, 0x34,\r\n    0x32, 0x34, 0x33, 0x37, 0x5a, 0x30, 0x67, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49,\r\n    0x4e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x02, 0x4d, 0x48, 0x31, 0x0d, 0x30, 0x0b, 0x06,\r\n    0x03, 0x55, 0x04, 0x07, 0x0c, 0x04, 0x50, 0x55, 0x4e, 0x45, 0x31, 0x0c, 0x30, 0x0a, 0x06, 0x03, 0x55, 0x04, 0x0a,\r\n    0x0c, 0x03, 0x4e, 0x58, 0x50, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x06, 0x53, 0x45, 0x52,\r\n    0x56, 0x45, 0x52, 0x31, 0x1d, 0x30, 0x1b, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16,\r\n    0x0e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x40, 0x6e, 0x78, 0x70, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x82, 0x01, 0xa2,\r\n    0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x8f,\r\n    0x00, 0x30, 0x82, 0x01, 0x8a, 0x02, 0x82, 0x01, 0x81, 0x00, 0xce, 0x19, 0xcb, 0x0e, 0x8d, 0x82, 0xc1, 0x22, 0xe1,\r\n    0xed, 0xa2, 0x88, 0xd0, 0x46, 0xb6, 0x3c, 0x70, 0xcf, 0x30, 0x9c, 0x83, 0x55, 0x7d, 0xd6, 0xac, 0xb3, 0x2f, 0x02,\r\n    0xb3, 0x86, 0x8c, 0x8e, 0xcc, 0xcc, 0x9a, 0x6b, 0x1c, 0xf4, 0x12, 0x6e, 0x3a, 0x97, 0xb5, 0x6f, 0x0a, 0xf7, 0x0f,\r\n    0x7d, 0x61, 0x1f, 0xf4, 0xf1, 0xef, 0x27, 0xa8, 0x8d, 0xde, 0xcf, 0x77, 0xfa, 0x8c, 0x0c, 0xe3, 0x9b, 0x06, 0xfe,\r\n    0x70, 0x54, 0xd2, 0xb5, 0x4b, 0xd8, 0xac, 0x96, 0x6b, 0xef, 0x45, 0xe5, 0x33, 0xe4, 0xd4, 0xec, 0x37, 0xae, 0xfc,\r\n    0xe9, 0xbf, 0x4d, 0x97, 0x22, 0x85, 0xde, 0xbf, 0xfe, 0x58, 0x31, 0x01, 0xfd, 0x7c, 0xc1, 0x10, 0x8b, 0x06, 0xdd,\r\n    0x78, 0x6f, 0xad, 0x93, 0x6f, 0x1a, 0xf4, 0xf7, 0xab, 0x72, 0x63, 0xd3, 0x24, 0xcc, 0x47, 0xc4, 0xd2, 0x38, 0xfd,\r\n    0x69, 0x6a, 0x20, 0x72, 0x65, 0xa9, 0xe2, 0xe3, 0x14, 0xb3, 0xe1, 0x99, 0xc2, 0x70, 0xed, 0x4f, 0xd8, 0xf9, 0x71,\r\n    0x5a, 0x08, 0x2e, 0x90, 0x99, 0x87, 0x4c, 0x8d, 0x5b, 0xf2, 0x25, 0x82, 0xe1, 0xfe, 0x50, 0x38, 0xf3, 0x91, 0xd2,\r\n    0x86, 0xe6, 0xc9, 0xdc, 0x14, 0xef, 0xaf, 0x75, 0x48, 0x92, 0x65, 0xb3, 0x1a, 0x27, 0x21, 0x56, 0xa9, 0xa0, 0xfd,\r\n    0x99, 0xc6, 0xfe, 0x13, 0x3f, 0x65, 0xe2, 0x5a, 0x21, 0x1c, 0xac, 0xce, 0xea, 0x8d, 0x21, 0xae, 0x04, 0xeb, 0x0e,\r\n    0x1e, 0x90, 0x2b, 0x4b, 0x63, 0x11, 0xd4, 0x27, 0x3f, 0x72, 0xd3, 0x6a, 0x7c, 0xae, 0x41, 0x47, 0xd4, 0xdb, 0x7b,\r\n    0xf3, 0xbf, 0x31, 0x4d, 0x3a, 0x40, 0x02, 0x65, 0xfd, 0x1d, 0x0a, 0x35, 0x8b, 0xf3, 0x2e, 0x38, 0x56, 0xc2, 0xb3,\r\n    0x88, 0xc1, 0x36, 0xa0, 0x02, 0x09, 0xe7, 0x2d, 0xc2, 0xbe, 0x68, 0xcd, 0x42, 0xc3, 0xda, 0x4d, 0xdd, 0xfa, 0x69,\r\n    0x39, 0x49, 0x93, 0x3c, 0x6c, 0x00, 0x6f, 0x8b, 0x30, 0x88, 0x23, 0x8c, 0x0f, 0xef, 0x9e, 0x65, 0xd2, 0x45, 0x00,\r\n    0xd9, 0x80, 0x59, 0x1f, 0xcb, 0x65, 0x35, 0xdc, 0x85, 0xf7, 0xc2, 0x00, 0x9b, 0xc0, 0x2e, 0x4c, 0xb0, 0x90, 0xcd,\r\n    0x72, 0xbd, 0x8d, 0x61, 0x4f, 0x26, 0x12, 0x4c, 0x10, 0x32, 0xeb, 0x03, 0x42, 0x1f, 0xb6, 0x9a, 0xc2, 0xab, 0x31,\r\n    0x54, 0xb8, 0x80, 0xe2, 0x05, 0x40, 0xdd, 0x36, 0xed, 0x62, 0x84, 0xee, 0xb3, 0x0e, 0x0e, 0x74, 0x48, 0xad, 0xad,\r\n    0x6b, 0xd6, 0x99, 0x09, 0xc0, 0xa6, 0x61, 0x24, 0x19, 0x12, 0xcc, 0xca, 0x47, 0x12, 0x4a, 0xf3, 0x65, 0xef, 0xed,\r\n    0x97, 0x1a, 0x74, 0xa5, 0x4a, 0xbb, 0xdf, 0x02, 0x49, 0x1b, 0xb0, 0x4d, 0xa1, 0x95, 0x25, 0xda, 0x63, 0xe5, 0x44,\r\n    0xb2, 0xf2, 0x35, 0x5e, 0x80, 0x72, 0x7b, 0x50, 0x45, 0x5f, 0xc4, 0xc6, 0xcd, 0x85, 0x02, 0x03, 0x01, 0x00, 0x01,\r\n    0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x81,\r\n    0x00, 0xaa, 0x6d, 0x4f, 0x75, 0x97, 0x2d, 0x69, 0xa6, 0x13, 0xc0, 0xde, 0xe1, 0x2f, 0x91, 0xeb, 0x63, 0x2a, 0x16,\r\n    0x8a, 0x56, 0x75, 0xce, 0xcb, 0x6f, 0xfa, 0xfa, 0x96, 0xa2, 0xf4, 0x87, 0xcd, 0xea, 0xc5, 0x9c, 0x79, 0x63, 0x56,\r\n    0x3b, 0x20, 0x02, 0xc2, 0xb4, 0xc8, 0x6c, 0x03, 0x0a, 0x19, 0xa0, 0xd6, 0x2d, 0xb4, 0x9a, 0x70, 0xe8, 0x86, 0x09,\r\n    0xcd, 0xf7, 0x38, 0xf7, 0x9a, 0x6c, 0xce, 0xeb, 0x1f, 0xff, 0x34, 0x1f, 0x20, 0xbd, 0x64, 0x93, 0xef, 0x95, 0xc4,\r\n    0x60, 0x68, 0x23, 0xe6, 0x5f, 0x20, 0xdd, 0xcd, 0xbf, 0xe2, 0x31, 0x66, 0xa5, 0x8a, 0x50, 0x88, 0xcc, 0x5a, 0x8d,\r\n    0x6d, 0x81, 0x00, 0x8b, 0xba, 0xf7, 0x2b, 0x0d, 0xe6, 0x02, 0x0e, 0x43, 0x96, 0x49, 0x78, 0x0f, 0xbf, 0x2a, 0x26,\r\n    0x2e, 0xde, 0xa0, 0xc4, 0x99, 0x71, 0x70, 0xfd, 0x31, 0xdc, 0xa4, 0x98, 0x80, 0x14, 0xaf, 0xe9, 0x86, 0x4e, 0x00,\r\n    0x52, 0x42, 0x9e, 0x22, 0x63, 0xbc, 0x25, 0x4d, 0xd0, 0xf4, 0xa9, 0x08, 0x9c, 0x82, 0xbb, 0x72, 0xce, 0xee, 0x08,\r\n    0x13, 0x33, 0xe4, 0xa8, 0x9c, 0x74, 0x8d, 0x3b, 0x79, 0x99, 0x17, 0x18, 0x28, 0x9c, 0x18, 0x6b, 0xd7, 0x36, 0x94,\r\n    0x2c, 0xf4, 0x0e, 0x0c, 0x6f, 0x27, 0x57, 0xdc, 0x23, 0x18, 0xee, 0xb7, 0xc2, 0x65, 0x5e, 0xd1, 0x6a, 0x59, 0x7e,\r\n    0x2a, 0xe8, 0xeb, 0xb4, 0xf8, 0xb7, 0xa5, 0xbc, 0xc5, 0x7c, 0x0f, 0x7b, 0x6f, 0x60, 0x32, 0x24, 0x8a, 0xf6, 0x60,\r\n    0xb2, 0x6d, 0x96, 0xb9, 0x27, 0x11, 0x58, 0x94, 0x75, 0x30, 0xe2, 0x34, 0x8d, 0x88, 0x90, 0xa7, 0xb4, 0x36, 0x55,\r\n    0x30, 0x7f, 0x10, 0x30, 0x48, 0x8c, 0x60, 0x6a, 0x7e, 0x2f, 0x16, 0xc8, 0x72, 0x9e, 0xb8, 0xe8, 0xb8, 0x05, 0xf7,\r\n    0x48, 0xe9, 0x22, 0x4d, 0x9c, 0x2a, 0xd7, 0xba, 0x4b, 0xf7, 0x63, 0xf9, 0x08, 0x6b, 0xd3, 0x88, 0x8f, 0x54, 0xce,\r\n    0xc3, 0x23, 0xed, 0x57, 0xb8, 0xa2, 0x44, 0x2c, 0x36, 0xe6, 0x96, 0xcb, 0xf7, 0xed, 0x8b, 0xfb, 0xf6, 0x6d, 0x6e,\r\n    0xa1, 0xd5, 0x43, 0x6d, 0xbd, 0x4c, 0xe7, 0xc6, 0x30, 0x03, 0x1f, 0x1f, 0x48, 0xbd, 0xc6, 0x1b, 0x5d, 0xc7, 0x60,\r\n    0xb3, 0x42, 0xbf, 0x0f, 0x8c, 0x1f, 0xd3, 0xea, 0x8b, 0x1c, 0x91, 0x89, 0x7c, 0x88, 0xbe, 0x93, 0xc9, 0xf1, 0x1c,\r\n    0x5c, 0xc6, 0x56, 0x10, 0x6e, 0xae, 0x55, 0x3e, 0x19, 0xa2, 0xab, 0x05, 0x4c, 0x62, 0xa9, 0x25, 0x3f, 0x54, 0x9e,\r\n    0xac, 0x47, 0x22, 0x7e, 0x03, 0xf0, 0xfb, 0x36, 0x8c, 0x89, 0x5c, 0x5f, 0xfd, 0xcf, 0xf3, 0x92, 0xc6, 0x13, 0xed,\r\n    0x4e, 0x28, 0x63, 0xa0, 0xfa, 0xae, 0x19, 0x53, 0x95, 0x80, 0x0f, 0xa8, 0x82, 0x52, 0xde, 0x89, 0xb5, 0xa7, 0xc5,\r\n    0xf9, 0x80, 0x0a, 0x3c, 0x2a};\r\nunsigned int server_der_len = 1088;\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/wifi/certs/server-key.h",
    "content": "const unsigned char server_key_der[] = {\r\n    0x30, 0x82, 0x06, 0xe3, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01, 0x81, 0x00, 0xce, 0x19, 0xcb, 0x0e, 0x8d, 0x82, 0xc1,\r\n    0x22, 0xe1, 0xed, 0xa2, 0x88, 0xd0, 0x46, 0xb6, 0x3c, 0x70, 0xcf, 0x30, 0x9c, 0x83, 0x55, 0x7d, 0xd6, 0xac, 0xb3,\r\n    0x2f, 0x02, 0xb3, 0x86, 0x8c, 0x8e, 0xcc, 0xcc, 0x9a, 0x6b, 0x1c, 0xf4, 0x12, 0x6e, 0x3a, 0x97, 0xb5, 0x6f, 0x0a,\r\n    0xf7, 0x0f, 0x7d, 0x61, 0x1f, 0xf4, 0xf1, 0xef, 0x27, 0xa8, 0x8d, 0xde, 0xcf, 0x77, 0xfa, 0x8c, 0x0c, 0xe3, 0x9b,\r\n    0x06, 0xfe, 0x70, 0x54, 0xd2, 0xb5, 0x4b, 0xd8, 0xac, 0x96, 0x6b, 0xef, 0x45, 0xe5, 0x33, 0xe4, 0xd4, 0xec, 0x37,\r\n    0xae, 0xfc, 0xe9, 0xbf, 0x4d, 0x97, 0x22, 0x85, 0xde, 0xbf, 0xfe, 0x58, 0x31, 0x01, 0xfd, 0x7c, 0xc1, 0x10, 0x8b,\r\n    0x06, 0xdd, 0x78, 0x6f, 0xad, 0x93, 0x6f, 0x1a, 0xf4, 0xf7, 0xab, 0x72, 0x63, 0xd3, 0x24, 0xcc, 0x47, 0xc4, 0xd2,\r\n    0x38, 0xfd, 0x69, 0x6a, 0x20, 0x72, 0x65, 0xa9, 0xe2, 0xe3, 0x14, 0xb3, 0xe1, 0x99, 0xc2, 0x70, 0xed, 0x4f, 0xd8,\r\n    0xf9, 0x71, 0x5a, 0x08, 0x2e, 0x90, 0x99, 0x87, 0x4c, 0x8d, 0x5b, 0xf2, 0x25, 0x82, 0xe1, 0xfe, 0x50, 0x38, 0xf3,\r\n    0x91, 0xd2, 0x86, 0xe6, 0xc9, 0xdc, 0x14, 0xef, 0xaf, 0x75, 0x48, 0x92, 0x65, 0xb3, 0x1a, 0x27, 0x21, 0x56, 0xa9,\r\n    0xa0, 0xfd, 0x99, 0xc6, 0xfe, 0x13, 0x3f, 0x65, 0xe2, 0x5a, 0x21, 0x1c, 0xac, 0xce, 0xea, 0x8d, 0x21, 0xae, 0x04,\r\n    0xeb, 0x0e, 0x1e, 0x90, 0x2b, 0x4b, 0x63, 0x11, 0xd4, 0x27, 0x3f, 0x72, 0xd3, 0x6a, 0x7c, 0xae, 0x41, 0x47, 0xd4,\r\n    0xdb, 0x7b, 0xf3, 0xbf, 0x31, 0x4d, 0x3a, 0x40, 0x02, 0x65, 0xfd, 0x1d, 0x0a, 0x35, 0x8b, 0xf3, 0x2e, 0x38, 0x56,\r\n    0xc2, 0xb3, 0x88, 0xc1, 0x36, 0xa0, 0x02, 0x09, 0xe7, 0x2d, 0xc2, 0xbe, 0x68, 0xcd, 0x42, 0xc3, 0xda, 0x4d, 0xdd,\r\n    0xfa, 0x69, 0x39, 0x49, 0x93, 0x3c, 0x6c, 0x00, 0x6f, 0x8b, 0x30, 0x88, 0x23, 0x8c, 0x0f, 0xef, 0x9e, 0x65, 0xd2,\r\n    0x45, 0x00, 0xd9, 0x80, 0x59, 0x1f, 0xcb, 0x65, 0x35, 0xdc, 0x85, 0xf7, 0xc2, 0x00, 0x9b, 0xc0, 0x2e, 0x4c, 0xb0,\r\n    0x90, 0xcd, 0x72, 0xbd, 0x8d, 0x61, 0x4f, 0x26, 0x12, 0x4c, 0x10, 0x32, 0xeb, 0x03, 0x42, 0x1f, 0xb6, 0x9a, 0xc2,\r\n    0xab, 0x31, 0x54, 0xb8, 0x80, 0xe2, 0x05, 0x40, 0xdd, 0x36, 0xed, 0x62, 0x84, 0xee, 0xb3, 0x0e, 0x0e, 0x74, 0x48,\r\n    0xad, 0xad, 0x6b, 0xd6, 0x99, 0x09, 0xc0, 0xa6, 0x61, 0x24, 0x19, 0x12, 0xcc, 0xca, 0x47, 0x12, 0x4a, 0xf3, 0x65,\r\n    0xef, 0xed, 0x97, 0x1a, 0x74, 0xa5, 0x4a, 0xbb, 0xdf, 0x02, 0x49, 0x1b, 0xb0, 0x4d, 0xa1, 0x95, 0x25, 0xda, 0x63,\r\n    0xe5, 0x44, 0xb2, 0xf2, 0x35, 0x5e, 0x80, 0x72, 0x7b, 0x50, 0x45, 0x5f, 0xc4, 0xc6, 0xcd, 0x85, 0x02, 0x03, 0x01,\r\n    0x00, 0x01, 0x02, 0x82, 0x01, 0x81, 0x00, 0xc3, 0x41, 0x1c, 0x66, 0x85, 0x1a, 0x42, 0xef, 0x51, 0x2b, 0x58, 0xb8,\r\n    0x54, 0xd9, 0x28, 0xfc, 0xc9, 0xc3, 0x00, 0x42, 0xc7, 0x09, 0xcf, 0x55, 0xf9, 0xf7, 0x27, 0xaa, 0x5f, 0x7a, 0x30,\r\n    0xdf, 0x78, 0x96, 0xbe, 0x14, 0x8c, 0x31, 0x8e, 0xe4, 0x6f, 0x0e, 0x1b, 0x0d, 0x40, 0x4e, 0x1f, 0x96, 0xa0, 0xd5,\r\n    0x2d, 0xb1, 0xa6, 0xe8, 0xe3, 0x7e, 0xc4, 0x7f, 0xb9, 0x22, 0xdc, 0x5b, 0xb9, 0xa5, 0xbd, 0x52, 0x80, 0x09, 0x5c,\r\n    0x35, 0xf5, 0xcd, 0x28, 0x74, 0xb9, 0x7c, 0xcd, 0xb2, 0xff, 0x1e, 0xe3, 0xb9, 0x86, 0x67, 0x79, 0xa3, 0xd9, 0x61,\r\n    0x20, 0xb5, 0xcc, 0x2d, 0xe3, 0xa6, 0x8a, 0xd6, 0xa3, 0x14, 0x0b, 0x84, 0xbc, 0xaf, 0x79, 0xa9, 0x87, 0xd8, 0x05,\r\n    0x91, 0x8f, 0xc8, 0xf2, 0x1b, 0x51, 0x89, 0xe5, 0x98, 0xbb, 0x5b, 0xed, 0x02, 0x42, 0x47, 0x4b, 0x8c, 0xfa, 0xc6,\r\n    0x12, 0x9a, 0xcd, 0xff, 0xed, 0x32, 0x47, 0xd8, 0x8b, 0x5a, 0xf2, 0xb1, 0x60, 0xdc, 0x26, 0x35, 0x85, 0x1e, 0x0b,\r\n    0x3f, 0x62, 0xb4, 0x13, 0x8a, 0x38, 0x79, 0x87, 0xa0, 0x1f, 0x8a, 0x57, 0x66, 0x1d, 0x1b, 0x21, 0x60, 0x3c, 0x75,\r\n    0x30, 0xd3, 0x84, 0xdf, 0xad, 0x35, 0x3b, 0xbc, 0xad, 0x99, 0x31, 0x49, 0x1c, 0x59, 0x47, 0xf3, 0xfa, 0x23, 0xd3,\r\n    0xc1, 0x58, 0x66, 0xa5, 0xb2, 0xcd, 0x7b, 0xe5, 0x19, 0xcc, 0xe6, 0x2f, 0x1f, 0x16, 0xd0, 0xad, 0xa1, 0xaf, 0xdf,\r\n    0x16, 0x70, 0xe8, 0x1d, 0x77, 0xe2, 0x15, 0x48, 0x4b, 0x2c, 0xf6, 0xb6, 0x31, 0x50, 0x69, 0x99, 0x66, 0xb0, 0xc2,\r\n    0x58, 0x3b, 0x80, 0xc2, 0x59, 0x68, 0x77, 0x8a, 0x40, 0xec, 0x15, 0x26, 0x9c, 0x2b, 0x58, 0xdf, 0x75, 0xe9, 0x52,\r\n    0xa3, 0x41, 0x43, 0x77, 0xa7, 0xc7, 0x1f, 0x62, 0x76, 0x75, 0xd1, 0x13, 0x72, 0xcd, 0x47, 0x46, 0x28, 0xd1, 0x41,\r\n    0xac, 0x4d, 0x1b, 0x56, 0x58, 0x0b, 0xf8, 0x37, 0x0f, 0xae, 0x0b, 0xd4, 0x75, 0x05, 0xb6, 0x66, 0x0d, 0x06, 0x3e,\r\n    0xa9, 0xb6, 0x66, 0xe2, 0x69, 0x60, 0x6d, 0x0b, 0x3f, 0x07, 0x62, 0xd6, 0x5a, 0xb3, 0x66, 0x83, 0x9c, 0x14, 0xd4,\r\n    0x86, 0xb5, 0xa6, 0x81, 0x90, 0x23, 0x77, 0xa8, 0x26, 0x51, 0x82, 0xad, 0xae, 0x43, 0x31, 0x0d, 0xf2, 0xb9, 0xc8,\r\n    0xbd, 0x3d, 0x11, 0xa9, 0x5c, 0x83, 0x11, 0x98, 0xe3, 0x0d, 0x2e, 0x29, 0x59, 0xe3, 0x2b, 0xd4, 0x8f, 0x69, 0xe7,\r\n    0xd3, 0x23, 0x74, 0x64, 0x13, 0x86, 0x8b, 0x44, 0x85, 0x03, 0xd0, 0xc0, 0x04, 0x0c, 0xe0, 0xbb, 0x2e, 0x1c, 0xb1,\r\n    0x4e, 0x20, 0xb0, 0xf1, 0x23, 0x84, 0xda, 0x03, 0xcf, 0xb8, 0x4d, 0x9f, 0x34, 0x8a, 0x92, 0x5d, 0x84, 0x08, 0x87,\r\n    0x86, 0x04, 0x6a, 0x19, 0x5f, 0xcb, 0xc5, 0x93, 0x82, 0xe7, 0x01, 0x02, 0x81, 0xc1, 0x00, 0xff, 0x3b, 0x7a, 0xe2,\r\n    0xdb, 0x66, 0x15, 0x4f, 0x21, 0x66, 0xee, 0x47, 0x84, 0x41, 0x5f, 0x75, 0x4f, 0x44, 0xf0, 0xc5, 0x93, 0xc0, 0x4e,\r\n    0xdf, 0x36, 0x47, 0x07, 0xe7, 0x45, 0x31, 0x57, 0x44, 0x5b, 0x23, 0x49, 0xd1, 0x5f, 0x7e, 0x0e, 0x2d, 0xd5, 0x93,\r\n    0xa1, 0xb5, 0x8c, 0xba, 0xf6, 0x77, 0x33, 0xc0, 0xb3, 0x4f, 0x6e, 0x1d, 0x02, 0x61, 0xfd, 0xb2, 0xfc, 0x78, 0x28,\r\n    0x89, 0x8f, 0xf4, 0x8a, 0xc6, 0x69, 0xdb, 0xc3, 0xe2, 0xc4, 0x54, 0x2e, 0xd1, 0xd9, 0x87, 0x7f, 0x35, 0x88, 0x4e,\r\n    0xcf, 0x16, 0x78, 0x57, 0x00, 0x3d, 0xe7, 0x02, 0x72, 0x22, 0xbe, 0x0d, 0x39, 0x1c, 0xfa, 0x7f, 0x41, 0xda, 0x65,\r\n    0x1a, 0xf9, 0xd5, 0xb7, 0x0c, 0xfc, 0x25, 0x86, 0xb4, 0xd5, 0xe7, 0x81, 0x01, 0x2f, 0x56, 0x17, 0xb5, 0x0b, 0x6b,\r\n    0x2c, 0xa5, 0xcb, 0x7c, 0xa2, 0x2f, 0xaf, 0x4b, 0xf7, 0x15, 0xe8, 0x15, 0x9f, 0xa6, 0x68, 0xab, 0x12, 0x5c, 0x11,\r\n    0xc6, 0xb1, 0x8c, 0x1f, 0x02, 0x31, 0x8d, 0x0c, 0x8f, 0x87, 0x88, 0x2a, 0xf6, 0x4d, 0x6b, 0x87, 0x75, 0x06, 0xa7,\r\n    0x5c, 0xf4, 0xb4, 0xf2, 0x2c, 0x48, 0xbb, 0x67, 0x44, 0x37, 0x14, 0xff, 0x7b, 0xc5, 0x0d, 0xa8, 0xcb, 0x3f, 0x62,\r\n    0x5e, 0x7d, 0x5c, 0x52, 0x63, 0x66, 0x8b, 0x6e, 0xc7, 0xb6, 0x52, 0xd3, 0x0b, 0x43, 0x60, 0xde, 0x89, 0x02, 0x81,\r\n    0xc1, 0x00, 0xce, 0xb8, 0x7b, 0xca, 0xb5, 0x7a, 0x44, 0x2c, 0x19, 0x5d, 0x52, 0xfb, 0x2a, 0xd2, 0x57, 0xe7, 0xa3,\r\n    0xba, 0x69, 0x00, 0xc0, 0x92, 0x8d, 0xba, 0xc9, 0x8c, 0x98, 0x6a, 0x13, 0x96, 0xa2, 0x64, 0xb8, 0x89, 0x36, 0x2d,\r\n    0x8a, 0x39, 0x65, 0x12, 0x9e, 0xbb, 0x64, 0xa5, 0x23, 0x0c, 0x6d, 0x98, 0x37, 0xa0, 0x9b, 0x00, 0x33, 0x3b, 0xc1,\r\n    0x76, 0x71, 0x41, 0x4e, 0xf2, 0xc5, 0x5f, 0x42, 0x6e, 0x26, 0x73, 0x27, 0x46, 0xcd, 0x18, 0x14, 0x7d, 0x8d, 0x91,\r\n    0xba, 0x90, 0x88, 0xd4, 0x33, 0x4f, 0xbd, 0x0a, 0x66, 0x0f, 0x11, 0x0f, 0xe8, 0x71, 0xcc, 0xad, 0x20, 0x81, 0x4b,\r\n    0x60, 0xdb, 0xf1, 0xef, 0x3f, 0x08, 0xf5, 0x57, 0x68, 0xaa, 0x23, 0xbf, 0xfe, 0x06, 0x77, 0x68, 0x4d, 0x51, 0x1d,\r\n    0xd3, 0xf6, 0x49, 0x9d, 0xe5, 0xfe, 0xbb, 0x21, 0xec, 0xef, 0xd6, 0x79, 0xdf, 0x8b, 0x25, 0x66, 0xee, 0x9b, 0x24,\r\n    0x4a, 0xba, 0xc8, 0x6a, 0x4d, 0x94, 0xc2, 0x48, 0x6d, 0x2f, 0xad, 0x49, 0x62, 0x33, 0xe0, 0x75, 0x7f, 0xa6, 0x9a,\r\n    0x96, 0x97, 0x37, 0xda, 0xff, 0xee, 0x6f, 0x6a, 0x15, 0xc8, 0x8e, 0x1e, 0xce, 0x89, 0x0e, 0xe2, 0xfc, 0x45, 0x72,\r\n    0x19, 0x74, 0x91, 0x0f, 0x77, 0xf5, 0x6c, 0xa7, 0xa2, 0x9e, 0x9c, 0x8c, 0x54, 0xf3, 0x0e, 0x5c, 0x95, 0x52, 0xc6,\r\n    0x1c, 0x3a, 0xd8, 0x1d, 0x02, 0x81, 0xc0, 0x0f, 0x31, 0x3e, 0x2e, 0x54, 0xba, 0xed, 0xd7, 0xc8, 0xf8, 0x34, 0x84,\r\n    0xc3, 0x45, 0x94, 0xe6, 0x09, 0xb2, 0xe3, 0xd6, 0x0e, 0xe6, 0x6a, 0x8b, 0x74, 0xd2, 0xa3, 0x90, 0xcb, 0x98, 0x95,\r\n    0x46, 0x37, 0x5a, 0x91, 0x61, 0x4a, 0x1a, 0xd9, 0xc3, 0x36, 0xac, 0x53, 0xfa, 0xd7, 0x86, 0xa5, 0x77, 0x10, 0xf8,\r\n    0x8e, 0x73, 0xd2, 0xed, 0x1d, 0x20, 0x32, 0x16, 0xbe, 0x5a, 0x74, 0xa7, 0x43, 0x8f, 0x5d, 0xd7, 0x53, 0xa3, 0xc6,\r\n    0x34, 0x30, 0x55, 0x86, 0x77, 0xed, 0x47, 0xd8, 0x75, 0x9a, 0x48, 0x7e, 0xa1, 0x2a, 0xc6, 0x9a, 0xf8, 0x14, 0x51,\r\n    0x1b, 0xf4, 0x1f, 0x75, 0xf0, 0x09, 0x5e, 0x8b, 0xc6, 0xa2, 0xb6, 0x53, 0xf5, 0xbd, 0x17, 0xe9, 0x48, 0xf4, 0xfe,\r\n    0xe0, 0xb2, 0xbe, 0xd5, 0xf9, 0xf9, 0x14, 0x59, 0xd2, 0xe7, 0xfc, 0x18, 0x2b, 0x42, 0x42, 0x87, 0xf0, 0xe8, 0xb1,\r\n    0x4f, 0xe2, 0xd8, 0xee, 0xb8, 0x93, 0x12, 0x35, 0xe4, 0xa0, 0xe0, 0x5a, 0x00, 0x65, 0x83, 0xcf, 0x00, 0x9e, 0x11,\r\n    0xba, 0x55, 0x69, 0xf0, 0x8c, 0xba, 0xad, 0x04, 0xe2, 0x1d, 0x64, 0x46, 0xef, 0x35, 0xfa, 0x18, 0x52, 0xb7, 0xfc,\r\n    0xfc, 0x9d, 0x7e, 0xbd, 0x7a, 0x63, 0x8f, 0x5d, 0x95, 0xc3, 0x8f, 0x1a, 0x6a, 0xc1, 0xdd, 0x11, 0x97, 0xa0, 0x03,\r\n    0x17, 0x16, 0x2e, 0x35, 0xeb, 0xbc, 0xb5, 0xfe, 0x69, 0x02, 0x81, 0xc0, 0x77, 0xc3, 0x98, 0x2c, 0xc3, 0xe1, 0x57,\r\n    0x37, 0xb9, 0x66, 0x41, 0x1a, 0x35, 0x1f, 0xf2, 0x3f, 0xc8, 0xb2, 0xc9, 0xfc, 0xde, 0x94, 0xc9, 0xba, 0x0a, 0xe5,\r\n    0x02, 0xb4, 0x8a, 0x2e, 0xbe, 0x5c, 0xde, 0x30, 0xd8, 0x8b, 0x9f, 0xc6, 0x4a, 0xd1, 0x73, 0xd7, 0x1b, 0xa3, 0x34,\r\n    0xe0, 0x11, 0x6a, 0x9b, 0xe7, 0xd7, 0x85, 0x51, 0x29, 0x70, 0x97, 0x3f, 0x5c, 0x57, 0xf1, 0xfc, 0xf9, 0x88, 0x92,\r\n    0x2a, 0x82, 0x92, 0xa1, 0xc9, 0x57, 0x07, 0x20, 0x0a, 0x72, 0x00, 0x85, 0x96, 0x50, 0x62, 0x7d, 0xf3, 0x06, 0xe0,\r\n    0x44, 0x20, 0x5d, 0x78, 0x0c, 0xde, 0x48, 0xfb, 0x49, 0x0d, 0x33, 0xcb, 0x99, 0xaa, 0x43, 0x79, 0xdc, 0x32, 0x4c,\r\n    0xf8, 0x2d, 0x88, 0x21, 0x12, 0xfc, 0x01, 0x18, 0xb2, 0x43, 0x36, 0xb7, 0x3c, 0xc5, 0x57, 0x27, 0xb2, 0xa1, 0x20,\r\n    0x15, 0x7f, 0xcb, 0xd2, 0x00, 0x5a, 0xa5, 0xfc, 0xdd, 0x33, 0x34, 0x7c, 0x6c, 0x7a, 0x72, 0x02, 0x1a, 0x61, 0x3d,\r\n    0xa8, 0xde, 0x9b, 0x62, 0x62, 0xad, 0xcb, 0x45, 0x2e, 0x6f, 0xe7, 0x89, 0x2a, 0x9a, 0x1d, 0xa6, 0xb5, 0x33, 0xdf,\r\n    0xf4, 0xf6, 0xa9, 0xd0, 0x7c, 0xc5, 0x7c, 0x2a, 0x2d, 0xcd, 0xc2, 0x03, 0xaf, 0xbb, 0x27, 0x83, 0xaf, 0xf4, 0x9b,\r\n    0x19, 0x8b, 0x97, 0x1d, 0xec, 0x47, 0x48, 0xca, 0x56, 0x4f, 0x62, 0xb1, 0x90, 0xdd, 0x02, 0x81, 0xc0, 0x26, 0x80,\r\n    0xdf, 0xf2, 0x8b, 0x17, 0x31, 0x72, 0x38, 0x4a, 0x05, 0x90, 0x92, 0xc5, 0x26, 0x71, 0xb2, 0xeb, 0x1e, 0x5e, 0x30,\r\n    0x56, 0x5a, 0x42, 0x60, 0x3c, 0x91, 0xf9, 0x29, 0xbe, 0x09, 0x89, 0xbe, 0xd1, 0x23, 0x3d, 0x52, 0xfd, 0x35, 0xf7,\r\n    0xab, 0x1a, 0xb5, 0x00, 0xae, 0x02, 0xc5, 0x68, 0x76, 0x5b, 0x6f, 0x6b, 0x95, 0xd5, 0x1f, 0x12, 0x05, 0x02, 0x42,\r\n    0x40, 0xd5, 0xa3, 0xc2, 0x7c, 0xd5, 0x04, 0xa8, 0x81, 0xa2, 0x79, 0xfc, 0x27, 0xe7, 0x11, 0x02, 0x84, 0x50, 0x90,\r\n    0x55, 0x1c, 0x96, 0x2f, 0x0d, 0xa8, 0xf6, 0x14, 0xdb, 0x33, 0xca, 0x1c, 0x4f, 0x99, 0x55, 0x11, 0x20, 0x19, 0xab,\r\n    0x97, 0xb3, 0xd1, 0x25, 0x56, 0xb9, 0x6e, 0x71, 0xec, 0x53, 0xfe, 0x58, 0xa6, 0xe5, 0x0a, 0x5f, 0x29, 0x2e, 0xfe,\r\n    0x20, 0xd0, 0x3b, 0xfc, 0x2c, 0x3d, 0x6e, 0x4b, 0x48, 0x05, 0x78, 0x9b, 0xf2, 0xd4, 0xc6, 0x58, 0xc8, 0x07, 0x22,\r\n    0x95, 0x51, 0x71, 0x6a, 0xb0, 0x20, 0x48, 0x91, 0x94, 0x67, 0x71, 0xb3, 0x6b, 0x09, 0x10, 0x09, 0x17, 0x32, 0x4c,\r\n    0xbf, 0x70, 0xe5, 0xce, 0x9b, 0x64, 0xfe, 0x04, 0x5e, 0x0c, 0xd9, 0xfb, 0xa7, 0x4e, 0xf7, 0xcb, 0x03, 0xb9, 0xcc,\r\n    0x17, 0x58, 0xff, 0x42, 0x3d, 0x1c, 0x09, 0x09, 0x9c, 0x4e, 0x7b, 0x1e, 0x0d, 0x08, 0x2d, 0x21, 0xd9, 0xd0, 0xf1};\r\nunsigned int server_key_der_len = 1767;\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/wifi/incl/dhcp-server.h",
    "content": "/*\r\n *  Copyright 2008-2022, 2024 NXP\r\n *\r\n *  SPDX-License-Identifier: BSD-3-Clause\r\n *\r\n */\r\n\r\n/*!\\file dhcp-server.h\r\n *\\brief The file provides DHCP server configuration interfaces.\r\n *\r\n * The DHCP Server is required in the provisioning mode of the application to\r\n * assign IP Address to Wireless Clients that connect to the WM.\r\n */\r\n\r\n#ifndef __DHCP_SERVER_H__\r\n#define __DHCP_SERVER_H__\r\n\r\n#include <wmerrno.h>\r\n\r\n/** DHCPD Error Codes\r\n */\r\n\r\nenum wm_dhcpd_errno\r\n{\r\n    WM_E_DHCPD_ERRNO_BASE = MOD_ERROR_START(MOD_DHCPD),\r\n    /** Dhcp server is already running */\r\n    WM_E_DHCPD_SERVER_RUNNING,\r\n    /** Failed to create dhcp thread */\r\n    WM_E_DHCPD_THREAD_CREATE,\r\n    /** Failed to create dhcp mutex */\r\n    WM_E_DHCPD_MUTEX_CREATE,\r\n    /** Failed to register dhcp commands */\r\n    WM_E_DHCPD_REGISTER_CMDS,\r\n    /** Failed to send dhcp response */\r\n    WM_E_DHCPD_RESP_SEND,\r\n    /** Ignore as msg is not a valid dns query */\r\n    WM_E_DHCPD_DNS_IGNORE,\r\n    /** Buffer overflow occurred */\r\n    WM_E_DHCPD_BUFFER_FULL,\r\n    /** The input message is NULL or has incorrect length */\r\n    WM_E_DHCPD_INVALID_INPUT,\r\n    /** Invalid opcode in the dhcp message */\r\n    WM_E_DHCPD_INVALID_OPCODE,\r\n    /** Invalid header type or incorrect header length */\r\n    WM_E_DHCPD_INCORRECT_HEADER,\r\n    /** Spoof length is either NULL or it exceeds max length */\r\n    WM_E_DHCPD_SPOOF_NAME,\r\n    /** Failed to get broadcast address */\r\n    WM_E_DHCPD_BCAST_ADDR,\r\n    /** Failed to look up requested IP address from the interface */\r\n    WM_E_DHCPD_IP_ADDR,\r\n    /** Failed to look up requested netmask from the interface */\r\n    WM_E_DHCPD_NETMASK,\r\n    /** Failed to create the socket */\r\n    WM_E_DHCPD_SOCKET,\r\n    /** Failed to send Gratuitous ARP */\r\n    WM_E_DHCPD_ARP_SEND,\r\n    /** Error in ioctl call */\r\n    WM_E_DHCPD_IOCTL_CALL,\r\n    /** Failed to init dhcp server */\r\n    WM_E_DHCPD_INIT,\r\n\r\n};\r\n\r\n/* Maximum length of the name_to_spoof for the DNS spoofer (see\r\n * dhcp_server_start below)\r\n */\r\n#define MAX_QNAME_SIZE 32\r\n\r\n/** Register DHCP server commands\r\n *\r\n * This function registers the CLI dhcp-stat for the DHCP server.\r\n * dhcp-stat command displays ip to associated client mac mapping.\r\n *\r\n * @return -WM_E_DHCPD_REGISTER_CMDS if cli init operation failed.\r\n * @return WM_SUCCESS if cli init operation success.\r\n */\r\nint dhcpd_cli_init(void);\r\n\r\n/** Unrgister DHCP server commands\r\n *\r\n * This function unregisters the CLI dhcp-stat for the DHCP server.\r\n * dhcp-stat command displays ip to associated client mac mapping.\r\n *\r\n * @return -WM_E_DHCPD_REGISTER_CMDS if cli init operation failed.\r\n * @return WM_SUCCESS if cli init operation success.\r\n */\r\nint dhcpd_cli_deinit(void);\r\n\r\n/** Start DHCP server\r\n *\r\n * This starts the DHCP server on the interface specified. Typically DHCP server\r\n * should be running on the micro-AP interface but it can also run on wifi\r\n * direct interface if configured as group owner. Use net_get_uap_handle() to\r\n * get micro-AP interface handle.\r\n *\r\n * \\param[in] intrfc_handle The interface handle on which DHCP server will start\r\n *\r\n * \\return WM_SUCCESS on success or error code\r\n */\r\nint dhcp_server_start(void *intrfc_handle);\r\n\r\n/** Start DNS server\r\n *\r\n * This starts the DNS server on the interface specified for dhcp server. This\r\n * function needs to be used before dhcp_server_start() function and can be\r\n * invoked on receiving \\ref WLAN_REASON_INITIALIZED event in the application\r\n * before starting micro-AP.\r\n *\r\n * The application needs to define its own list of domain names with the last\r\n * entry as NULL. The dns server handles dns queries and if domain name match is\r\n * found then resolves it to device ip address. Currently the maximum length for\r\n * each domain name is set to 32 bytes.\r\n *\r\n * Eg.\r\n * char *domain_names[] = {\"nxpprov.net\", \"www.nxpprov.net\", NULL};\r\n *\r\n * dhcp_enable_dns_server(domain_names);\r\n *\r\n * However, application can also start dns server without any domain names\r\n * specified to solve following issue.\r\n * Some of the client devices do not show Wi-Fi signal strength symbol when\r\n * connected to micro-AP in open mode, if dns queries are not resolved.\r\n * With dns server support enabled, dns server responds with ERROR_REFUSED\r\n * indicating that the DNS server refuses to provide whatever data client is\r\n * asking for.\r\n *\r\n * \\param[in] domain_names Pointer to the list of domain names or NULL.\r\n *\r\n */\r\nvoid dhcp_enable_dns_server(char **domain_names);\r\n\r\n/** Stop DHCP server\r\n */\r\nvoid dhcp_server_stop(void);\r\n\r\n/** Configure the DHCP dynamic IP lease time\r\n *\r\n * This API configures the dynamic IP lease time, which\r\n * should be invoked before DHCP server initialization\r\n *\r\n * \\param[in] val Number of seconds, use (60U*60U*number of hours)\r\n *             for clarity. Max value is (60U*60U*24U*49700U)\r\n *\r\n * \\return Error status code\r\n */\r\nint dhcp_server_lease_timeout(uint32_t val);\r\n\r\n/** Get IP address corresponding to MAC address from dhcpd ip-mac mapping\r\n *\r\n * This API returns IP address mapping to the MAC address present in cache.\r\n * IP-MAC cache stores MAC to IP mapping of previously or currently connected\r\n * clients.\r\n *\r\n * \\param[in] client_mac Pointer to a six byte array containing the MAC address\r\n * of the client\r\n * \\param[out] client_ip Pointer to IP address of the client\r\n *\r\n * \\return WM_SUCCESS on success or -WM_FAIL.\r\n */\r\nint dhcp_get_ip_from_mac(uint8_t *client_mac, uint32_t *client_ip);\r\n\r\n/** Print DHCP stats on the console\r\n *\r\n * This API prints DHCP stats on the console\r\n */\r\nvoid dhcp_stat(void);\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/wifi/incl/nxp_wifi.h",
    "content": "/*  Copyright 2023-2024 NXP\r\n *\r\n *  SPDX-License-Identifier: BSD-3-Clause\r\n *\r\n */\r\n/*!\\file nxp_wifi.h\r\n *\\brief This file provides macros mapping between zephyr Kconfig and Wi-Fi driver.\r\n */\r\n\r\n#ifndef __NXP_WIFI_H__\r\n#define __NXP_WIFI_H__\r\n\r\n#include <stdint.h>\r\n#include <stdbool.h>\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_SHELL\r\n#define CONFIG_WIFI_SHELL CONFIG_NXP_WIFI_SHELL\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_MAX_AP_ENTRIES\r\n#define CONFIG_MAX_AP_ENTRIES CONFIG_NXP_WIFI_MAX_AP_ENTRIES\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_WLAN_KNOWN_NETWORKS\r\n#define CONFIG_WLAN_KNOWN_NETWORKS CONFIG_NXP_WIFI_WLAN_KNOWN_NETWORKS\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_SDIO_MULTI_PORT_RX_AGGR\r\n#define CONFIG_SDIO_MULTI_PORT_RX_AGGR CONFIG_NXP_WIFI_SDIO_MULTI_PORT_RX_AGGR\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_SDIO_MULTI_PORT_TX_AGGR\r\n#define CONFIG_SDIO_MULTI_PORT_TX_AGGR CONFIG_NXP_WIFI_SDIO_MULTI_PORT_TX_AGGR\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_AUTO_POWER_SAVE\r\n#define CONFIG_WIFI_AUTO_POWER_SAVE CONFIG_NXP_WIFI_AUTO_POWER_SAVE\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_TX_RX_ZERO_COPY\r\n#define CONFIG_TX_RX_ZERO_COPY CONFIG_NXP_WIFI_TX_RX_ZERO_COPY\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_RF_TEST_MODE\r\n#define CONFIG_WIFI_RF_TEST_MODE CONFIG_NXP_WIFI_RF_TEST_MODE\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_OFFLOAD\r\n#define CONFIG_OFFLOAD CONFIG_NXP_WIFI_OFFLOAD\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_STA_AUTO_DHCPV4\r\n#define CONFIG_STA_AUTO_DHCPV4 CONFIG_NXP_WIFI_STA_AUTO_DHCPV4\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_STA_RECONNECT\r\n#define CONFIG_WIFI_STA_RECONNECT CONFIG_NXP_WIFI_STA_RECONNECT\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_MON_THREAD_STACK_SIZE\r\n#define CONFIG_MON_THREAD_STACK_SIZE CONFIG_NXP_WIFI_MON_THREAD_STACK_SIZE\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_WLCMGR_STACK_SIZE\r\n#define CONFIG_WLCMGR_STACK_SIZE CONFIG_NXP_WIFI_WLCMGR_STACK_SIZE\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_WPS_STACK_SIZE\r\n#define CONFIG_WPS_STACK_SIZE CONFIG_NXP_WIFI_WPS_STACK_SIZE\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_POWERSAVE_STACK_SIZE\r\n#define CONFIG_POWERSAVE_STACK_SIZE CONFIG_NXP_WIFI_POWERSAVE_STACK_SIZE\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_TX_STACK_SIZE\r\n#define CONFIG_TX_STACK_SIZE CONFIG_NXP_WIFI_TX_STACK_SIZE\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_DRIVER_STACK_SIZE\r\n#define CONFIG_DRIVER_STACK_SIZE CONFIG_NXP_WIFI_DRIVER_STACK_SIZE\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_DHCP_SERVER_STACK_SIZE\r\n#define CONFIG_DHCP_SERVER_STACK_SIZE CONFIG_NXP_WIFI_DHCP_SERVER_STACK_SIZE\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_11AX\r\n#define CONFIG_11AX CONFIG_NXP_WIFI_11AX\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_11AC\r\n#define CONFIG_11AC CONFIG_NXP_WIFI_11AC\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_ENABLE_HTTPSERVER\r\n#define CONFIG_ENABLE_HTTPSERVER CONFIG_NXP_WIFI_ENABLE_HTTPSERVER\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_TX_RX_ZERO_COPY\r\n#define CONFIG_TX_RX_ZERO_COPY CONFIG_NXP_WIFI_TX_RX_ZERO_COPY\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_CAPA\r\n#define CONFIG_WIFI_CAPA CONFIG_NXP_WIFI_CAPA\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_WMM_UAPSD\r\n#define CONFIG_WMM_UAPSD CONFIG_NXP_WIFI_WMM_UAPSD\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_GET_LOG\r\n#define CONFIG_WIFI_GET_LOG CONFIG_NXP_WIFI_GET_LOG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_TX_PER_TRACK\r\n#define CONFIG_WIFI_TX_PER_TRACK CONFIG_NXP_WIFI_TX_PER_TRACK\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_CSI\r\n#define CONFIG_CSI CONFIG_NXP_WIFI_CSI\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_RESET\r\n#define CONFIG_WIFI_RESET CONFIG_NXP_WIFI_RESET\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_NET_MONITOR\r\n#define CONFIG_NET_MONITOR CONFIG_NXP_WIFI_NET_MONITOR\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_ECSA\r\n#define CONFIG_ECSA CONFIG_NXP_WIFI_ECSA\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_UNII4_BAND_SUPPORT\r\n#define CONFIG_UNII4_BAND_SUPPORT CONFIG_NXP_WIFI_UNII4_BAND_SUPPORT\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_TSP\r\n#define CONFIG_TSP CONFIG_NXP_WIFI_TSP\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_11AX_TWT\r\n#define CONFIG_11AX_TWT CONFIG_NXP_WIFI_11AX_TWT\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_COMPRESS_TX_PWTBL\r\n#define CONFIG_COMPRESS_TX_PWTBL CONFIG_NXP_WIFI_COMPRESS_TX_PWTBL\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_COMPRESS_RU_TX_PWTBL\r\n#define CONFIG_COMPRESS_RU_TX_PWTBL CONFIG_NXP_WIFI_COMPRESS_RU_TX_PWTBL\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_MAX_PRIO\r\n#define CONFIG_WIFI_MAX_PRIO CONFIG_NXP_WIFI_MAX_PRIO\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_IPS\r\n#define CONFIG_IPS CONFIG_NXP_WIFI_IPS\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_EXT_SCAN_SUPPORT\r\n#define CONFIG_EXT_SCAN_SUPPORT CONFIG_NXP_WIFI_EXT_SCAN_SUPPORT\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_SCAN_WITH_RSSIFILTER\r\n#define CONFIG_SCAN_WITH_RSSIFILTER CONFIG_NXP_WIFI_SCAN_WITH_RSSIFILTER\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_DTIM_PERIOD\r\n#define CONFIG_WIFI_DTIM_PERIOD CONFIG_NXP_WIFI_DTIM_PERIOD\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_RX_ABORT_CFG\r\n#define CONFIG_RX_ABORT_CFG CONFIG_NXP_WIFI_RX_ABORT_CFG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_RX_ABORT_CFG_EXT\r\n#define CONFIG_RX_ABORT_CFG_EXT CONFIG_NXP_WIFI_RX_ABORT_CFG_EXT\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_CCK_DESENSE_CFG\r\n#define CONFIG_CCK_DESENSE_CFG CONFIG_NXP_WIFI_CCK_DESENSE_CFG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_MEM_ACCESS\r\n#define CONFIG_WIFI_MEM_ACCESS CONFIG_NXP_WIFI_MEM_ACCESS\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_REG_ACCESS\r\n#define CONFIG_WIFI_REG_ACCESS CONFIG_NXP_WIFI_REG_ACCESS\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_SUBSCRIBE_EVENT_SUPPORT\r\n#define CONFIG_SUBSCRIBE_EVENT_SUPPORT CONFIG_NXP_WIFI_SUBSCRIBE_EVENT_SUPPORT\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_TX_RX_HISTOGRAM\r\n#define CONFIG_TX_RX_HISTOGRAM CONFIG_NXP_WIFI_TX_RX_HISTOGRAM\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_COEX_DUTY_CYCLE\r\n#define CONFIG_COEX_DUTY_CYCLE CONFIG_NXP_WIFI_COEX_DUTY_CYCLE\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_MMSF\r\n#define CONFIG_MMSF CONFIG_NXP_WIFI_MMSF\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_USB_FILE_ACCESS\r\n#define CONFIG_USB_FILE_ACCESS CONFIG_NXP_WIFI_USB_FILE_ACCESS\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_SCAN_CHANNEL_GAP_TIME\r\n#define CONFIG_SCAN_CHANNEL_GAP_TIME CONFIG_NXP_WIFI_SCAN_CHANNEL_GAP_TIME\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_INACTIVITY_TIMEOUT_EXT\r\n#define CONFIG_INACTIVITY_TIMEOUT_EXT CONFIG_NXP_WIFI_INACTIVITY_TIMEOUT_EXT\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_RF_TEST_MODE\r\n#define CONFIG_RF_TEST_MODE CONFIG_NXP_WIFI_RF_TEST_MODE\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_IMD3_CFG\r\n#define CONFIG_IMD3_CFG CONFIG_NXP_WIFI_IMD3_CFG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_ANT_DETECT\r\n#define CONFIG_ANT_DETECT CONFIG_NXP_WIFI_ANT_DETECT\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_WLAN_CALDATA_1ANT\r\n#define CONFIG_WLAN_CALDATA_1ANT CONFIG_NXP_WIFI_WLAN_CALDATA_1ANT\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_WLAN_CALDATA_1ANT_WITH_DIVERSITY\r\n#define CONFIG_WLAN_CALDATA_1ANT_WITH_DIVERSITY CONFIG_NXP_WIFI_WLAN_CALDATA_1ANT_WITH_DIVERSITY\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_WLAN_CALDATA_3ANT_DIVERSITY\r\n#define CONFIG_WLAN_CALDATA_3ANT_DIVERSITY CONFIG_NXP_WIFI_WLAN_CALDATA_3ANT_DIVERSITY\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_CLOCKSYNC\r\n#define CONFIG_CLOCKSYNC CONFIG_NXP_WIFI_CLOCKSYNC\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_WMM\r\n#define CONFIG_WMM CONFIG_NXP_WIFI_WMM\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_IPV6\r\n#define CONFIG_IPV6 CONFIG_NXP_WIFI_IPV6\r\n#endif\r\n\r\n#if CONFIG_NET_IF_UNICAST_IPV6_ADDR_COUNT\r\n#define CONFIG_MAX_IPV6_ADDRESSES CONFIG_NET_IF_UNICAST_IPV6_ADDR_COUNT\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_5GHz_SUPPORT\r\n#define CONFIG_5GHz_SUPPORT CONFIG_NXP_WIFI_5GHz_SUPPORT\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_HOST_SLEEP\r\n#define CONFIG_HOST_SLEEP CONFIG_NXP_WIFI_HOST_SLEEP\r\n#endif\r\n\r\n#if CONFIG_PM\r\n#define CONFIG_POWER_MANAGER CONFIG_PM\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_ROAMING\r\n#define CONFIG_ROAMING CONFIG_NXP_WIFI_ROAMING\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_CLOUD_KEEP_ALIVE\r\n#define CONFIG_CLOUD_KEEP_ALIVE CONFIG_NXP_WIFI_CLOUD_KEEP_ALIVE\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_MEF_CFG\r\n#define CONFIG_MEF_CFG CONFIG_NXP_WIFI_MEF_CFG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_TURBO_MODE\r\n#define CONFIG_TURBO_MODE CONFIG_NXP_WIFI_TURBO_MODE\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_EU_CRYPTO\r\n#define CONFIG_EU_CRYPTO CONFIG_NXP_WIFI_EU_CRYPTO\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_FIPS\r\n#define CONFIG_FIPS CONFIG_NXP_WIFI_FIPS\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_OWE\r\n#define CONFIG_OWE CONFIG_NXP_WIFI_OWE\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_11K\r\n#define CONFIG_11K CONFIG_NXP_WIFI_11K\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_11V\r\n#define CONFIG_11V CONFIG_NXP_WIFI_11V\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_11R\r\n#define CONFIG_11R CONFIG_NXP_WIFI_11R\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_EU_CRYPTO\r\n#define CONFIG_WIFI_EU_CRYPTO CONFIG_NXP_WIFI_EU_CRYPTO\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_CLOCKSYNC\r\n#define CONFIG_WIFI_CLOCKSYNC CONFIG_NXP_WIFI_CLOCKSYNC\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_RTS_THRESHOLD\r\n#define CONFIG_WIFI_RTS_THRESHOLD 1\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_UAP_WORKAROUND_STICKY_TIM\r\n#define CONFIG_UAP_WORKAROUND_STICKY_TIM CONFIG_NXP_WIFI_UAP_WORKAROUND_STICKY_TIM\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_AUTO_NULL_TX\r\n#define CONFIG_AUTO_NULL_TX CONFIG_NXP_WIFI_AUTO_NULL_TX\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_ENABLE_ERROR_LOGS\r\n#define CONFIG_ENABLE_ERROR_LOGS CONFIG_NXP_WIFI_ENABLE_ERROR_LOGS\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_ENABLE_WARNING_LOGS\r\n#define CONFIG_ENABLE_WARNING_LOGS CONFIG_NXP_WIFI_ENABLE_WARNING_LOGS\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_DEBUG_BUILD\r\n#define CONFIG_DEBUG_BUILD CONFIG_NXP_WIFI_DEBUG_BUILD\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_OS_DEBUG\r\n#define CONFIG_OS_DEBUG CONFIG_NXP_WIFI_OS_DEBUG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_NET_DEBUG\r\n#define CONFIG_NET_DEBUG CONFIG_NXP_WIFI_NET_DEBUG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_WLCMGR_DEBUG\r\n#define CONFIG_WLCMGR_DEBUG CONFIG_NXP_WIFI_WLCMGR_DEBUG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_EXTRA_DEBUG\r\n#define CONFIG_WIFI_EXTRA_DEBUG CONFIG_NXP_WIFI_EXTRA_DEBUG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_UAP_DEBUG\r\n#define CONFIG_WIFI_UAP_DEBUG CONFIG_NXP_WIFI_UAP_DEBUG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_EVENTS_DEBUG\r\n#define CONFIG_WIFI_EVENTS_DEBUG CONFIG_NXP_WIFI_EVENTS_DEBUG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_CMD_RESP_DEBUG\r\n#define CONFIG_WIFI_CMD_RESP_DEBUG CONFIG_NXP_WIFI_CMD_RESP_DEBUG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_PS_DEBUG\r\n#define CONFIG_WIFI_PS_DEBUG CONFIG_NXP_WIFI_PS_DEBUG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_SCAN_DEBUG\r\n#define CONFIG_WIFI_SCAN_DEBUG CONFIG_NXP_WIFI_SCAN_DEBUG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_PKT_DEBUG\r\n#define CONFIG_WIFI_PKT_DEBUG CONFIG_NXP_WIFI_PKT_DEBUG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_IO_INFO_DUMP\r\n#define CONFIG_WIFI_IO_INFO_DUMP CONFIG_NXP_WIFI_IO_INFO_DUMP\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_IO_DEBUG\r\n#define CONFIG_WIFI_IO_DEBUG CONFIG_NXP_WIFI_IO_DEBUG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_IO_DUMP\r\n#define CONFIG_WIFI_IO_DUMP CONFIG_NXP_WIFI_IO_DUMP\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_MEM_DEBUG\r\n#define CONFIG_WIFI_MEM_DEBUG CONFIG_NXP_WIFI_MEM_DEBUG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_AMPDU_DEBUG\r\n#define CONFIG_WIFI_AMPDU_DEBUG CONFIG_NXP_WIFI_AMPDU_DEBUG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_TIMER_DEBUG\r\n#define CONFIG_WIFI_TIMER_DEBUG CONFIG_NXP_WIFI_TIMER_DEBUG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_SDIO_DEBUG\r\n#define CONFIG_WIFI_SDIO_DEBUG CONFIG_NXP_WIFI_SDIO_DEBUG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_SDIO_IO_DEBUG\r\n#define CONFIG_SDIO_IO_DEBUG CONFIG_NXP_WIFI_SDIO_IO_DEBUG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_FWDNLD_IO_DEBUG\r\n#define CONFIG_FWDNLD_IO_DEBUG CONFIG_NXP_WIFI_FWDNLD_IO_DEBUG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_FW_DEBUG\r\n#define CONFIG_WIFI_FW_DEBUG CONFIG_NXP_WIFI_FW_DEBUG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_FW_VDLL_DEBUG\r\n#define CONFIG_FW_VDLL_DEBUG CONFIG_NXP_WIFI_FW_VDLL_DEBUG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_DHCP_SERVER_DEBUG\r\n#define CONFIG_DHCP_SERVER_DEBUG CONFIG_NXP_WIFI_DHCP_SERVER_DEBUG\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_SMOKE_TESTS\r\n#define CONFIG_WIFI_SMOKE_TESTS CONFIG_NXP_WIFI_SMOKE_TESTS\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_SM_IP_DHCP\r\n#define IP_USE_DHCP CONFIG_NXP_WIFI_SM_IP_DHCP\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_SIGMA_AGENT\r\n#define CONFIG_SIGMA_AGENT CONFIG_NXP_WIFI_SIGMA_AGENT\r\n#endif\r\n\r\n#if CONFIG_NXP_WIFI_CUSTOM_CALDATA\r\n#define CONFIG_CUSTOM_CALDATA CONFIG_NXP_WIFI_CUSTOM_CALDATA\r\n#endif\r\n\r\n#if (CONFIG_NXP_WIFI_8978) || (CONFIG_NXP_WIFI_8987) || (CONFIG_NXP_WIFI_9177)\r\n\r\n#define CONFIG_GTK_REKEY_OFFLOAD 0\r\n\r\n#define CONFIG_FW_VDLL 1\r\n\r\n#endif\r\n\r\n#if (CONFIG_NXP_WIFI_9177)\r\n#define CONFIG_TCP_ACK_ENH 1\r\n#endif\r\n\r\n#if CONFIG_11AX\r\n\r\n#if !CONFIG_11K\r\n#define CONFIG_11K 1\r\n#endif\r\n\r\n#if !CONFIG_11V\r\n#define CONFIG_11V 1\r\n#endif\r\n\r\n#if !CONFIG_WPA_SUPP\r\n#define CONFIG_DRIVER_MBO 1\r\n#endif\r\n\r\n#endif\r\n\r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* __NXP_WIFI_H__ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/wifi/incl/port/net/wm_net.h",
    "content": "/*\r\n *  Copyright 2008-2024 NXP\r\n *\r\n *  SPDX-License-Identifier: BSD-3-Clause\r\n */\r\n/*\r\n * Copyright (c) 2016 Intel Corporation.\r\n *\r\n * SPDX-License-Identifier: Apache-2.0\r\n */\r\n\r\n/*!\\file wm_net.h\r\n *\\brief This file provides interface for network abstraction layer.\r\n *\r\n * This provides the calls related to the network layer.\r\n */\r\n\r\n// Modified to work with Mongoose built-in TCP/IP by Cesanta Software Ltd.\r\n\r\n#ifndef _WM_NET_H_\r\n#define _WM_NET_H_\r\n\r\n#include <string.h>\r\n\r\n#include <osa.h>\r\n#include <wmtypes.h>\r\n#include <wmerrno.h>\r\n\r\n// need this dependency due to assumptions satisfied below\r\n#include \"mongoose.h\"\r\n// vendor libs have strong lwIP dependencies\r\n#define htonl(x) mg_htonl(x)\r\n#define ipaddr_addr(x) 0    // A Mongoose environment does not need this nor works this way\r\n\r\n// instead of exposing wlan.h, libs cast to \"the same\" structure and enums we must replicate here and expose to them\r\nenum net_address_types\r\n{\r\n    /** static IP address */\r\n    NET_ADDR_TYPE_STATIC = 0,\r\n    /** Dynamic  IP address*/\r\n    NET_ADDR_TYPE_DHCP = 1,\r\n    /** Link level address */\r\n    NET_ADDR_TYPE_LLA = 2,\r\n};\r\n\r\n/** This data structure represents an IPv4 address */\r\nstruct net_ipv4_config\r\n{\r\n    /** Set to \\ref ADDR_TYPE_DHCP to use DHCP to obtain the IP address or\r\n     *  \\ref ADDR_TYPE_STATIC to use a static IP. In case of static IP\r\n     *  address ip, gw, netmask and dns members must be specified.  When\r\n     *  using DHCP, the ip, gw, netmask and dns are overwritten by the\r\n     *  values obtained from the DHCP server. They should be zeroed out if\r\n     *  not used. */\r\n    enum net_address_types addr_type;\r\n    /** The system's IP address in network order. */\r\n    unsigned address;\r\n    /** The system's default gateway in network order. */\r\n    unsigned gw;\r\n    /** The system's subnet mask in network order. */\r\n    unsigned netmask;\r\n    /** The system's primary dns server in network order. */\r\n    unsigned dns1;\r\n    /** The system's secondary dns server in network order. */\r\n    unsigned dns2;\r\n};\r\n\r\n#if CONFIG_IPV6\r\n/** This data structure represents an IPv6 address */\r\nstruct net_ipv6_config\r\n{\r\n    /** The system's IPv6 address in network order. */\r\n    unsigned address[4];\r\n    /** The address type: linklocal, site-local or global. */\r\n    unsigned char addr_type;\r\n    /** The state of IPv6 address (Tentative, Preferred, etc). */\r\n    unsigned char addr_state;\r\n};\r\n#endif\r\n\r\n/** Network IP configuration.\r\n *\r\n *  This data structure represents the network IP configuration\r\n *  for IPv4 as well as IPv6 addresses\r\n */\r\nstruct net_ip_config\r\n{\r\n#if CONFIG_IPV6\r\n    /** The network IPv6 address configuration that should be\r\n     * associated with this interface. */\r\n    struct net_ipv6_config ipv6[CONFIG_MAX_IPV6_ADDRESSES];\r\n    /** The network IPv6 valid addresses count */\r\n    size_t ipv6_count;\r\n#endif\r\n    /** The network IPv4 address configuration that should be\r\n     * associated with this interface. */\r\n    struct net_ipv4_config ipv4;\r\n};\r\n\r\n// libs only handle one private var, so we need to craft a \"packet buffer\" structure to be able to hold data length\r\n#pragma pack(push, 1)\r\nstruct pb {\r\n  uint16_t len;\r\n  uint8_t data[1];\r\n};\r\n#pragma pack(pop)\r\n\r\n\r\n\r\n/** Deactivate the dhcp timer\r\n *\r\n */\r\nvoid net_stop_dhcp_timer(void);\r\n\r\n/** set MAC hardware address to lwip network interface\r\n *\r\n * \\param[in] stamac sta MAC address.\r\n * \\param[in] uapmac uap MAC address.\r\n *\r\n */\r\nvoid net_wlan_set_mac_address(unsigned char *stamac, unsigned char *uapmac);\r\n\r\n/** Skip a number of bytes at the start of a stack buffer\r\n *\r\n * \\param[in] buf input stack buffer.\r\n * \\param[in] in_offset offset to skip.\r\n *\r\n * \\return the payload pointer after skip a number of bytes\r\n */\r\nstatic inline uint8_t *net_stack_buffer_skip(void *buf, uint16_t in_offset)\r\n{\r\n\treturn ((struct pb *)buf)->data + in_offset;\r\n}\r\n\r\n/** Free a buffer allocated from stack memory\r\n *\r\n * \\param[in] buf stack buffer pointer.\r\n *\r\n */\r\nstatic inline void net_stack_buffer_free(void *buf)\r\n{\r\n    free(buf);\r\n}\r\n\r\n/** Copy (part of) the contents of a packet buffer to an application supplied buffer\r\n *\r\n * \\param[in] stack_buffer the stack buffer from which to copy data.\r\n * \\param[in] dst the destination buffer.\r\n * \\param[in] len length of data to copy.\r\n * \\param[in] offset offset into the stack buffer from where to begin copying\r\n * \\return copy status based on stack definition.\r\n */\r\nstatic inline int net_stack_buffer_copy_partial(void *stack_buffer, void *dst, uint16_t len, uint16_t offset)\r\n{\r\n    memcpy(dst, ((struct pb *)stack_buffer)->data + offset, len);\r\n\treturn 1;\r\n}\r\n\r\n/** Get the data payload inside the stack buffer.\r\n *\r\n * \\param[in] buf input stack buffer.\r\n *\r\n * \\return the payload pointer of the stack buffer.\r\n */\r\nstatic inline void *net_stack_buffer_get_payload(void *buf)\r\n{\r\n\treturn ((struct pb *)buf)->data;\r\n}\r\n\r\n/** Converts Internet host address in network byte order to a string in IPv4\r\n * dotted-decimal notation\r\n *\r\n * \\param[in] addr IP address in network byte order.\r\n * \\param[out] cp buffer in which IPv4 dotted-decimal string is returned.\r\n *\r\n */\r\nstatic inline void net_inet_ntoa(unsigned long addr, char *cp)\r\n{\r\n\t// This is only called by WPL, we don't need to call this function so we don't serve this\r\n}\r\n\r\n/** Check whether buffer is IPv4 or IPV6 packet type\r\n *\r\n * \\param[in] buffer pointer to buffer where packet to be checked located.\r\n *\r\n * \\return true if buffer packet type matches with IPv4 or IPv6, false otherwise.\r\n *\r\n */\r\nstatic inline bool net_is_ip_or_ipv6(const uint8_t *b)\r\n{\r\n\t// this does not account for 802.1Q-tagged traffic, no need to, this is called\r\n    // when sending and we don't send that.\r\n    return (b[12]==0x08 && b[13]== 0x00) || (b[12]==0x86 && b[13]== 0xdd);\r\n}\r\n\r\n/** Initialize TCP/IP networking stack\r\n *\r\n * \\return WM_SUCCESS on success\r\n * \\return -WM_FAIL otherwise\r\n */\r\nint net_wlan_init(void);\r\n\r\n/** DeInitialize TCP/IP networking stack\r\n *\r\n * \\return WM_SUCCESS on success\r\n * \\return -WM_FAIL otherwise\r\n */\r\nint net_wlan_deinit(void);\r\n\r\n/** Get STA interface netif structure pointer\r\n *\r\n * \\return A pointer to STA interface netif structure\r\n */\r\nstruct netif *net_get_sta_interface(void);\r\n\r\n/** Get uAP interface netif structure pointer\r\n *\r\n * \\return A pointer to uAP interface netif structure\r\n *\r\n */\r\nstruct netif *net_get_uap_interface(void);\r\n\r\n/** Get interface name for given netif\r\n *\r\n * \\param[out] pif_name Buffer to store interface name\r\n * \\param[in] iface Interface to get the name\r\n *\r\n * \\return WM_SUCCESS on success\r\n * \\return -WM_FAIL otherwise\r\n *\r\n */\r\nint net_get_if_name_netif(char *pif_name, struct netif *iface);\r\n\r\n/** Get client data index for storing private data in * netif.\r\n *\r\n * \\return allocated client data index, -1 if error or\r\n *         not supported.\r\n */\r\nint net_alloc_client_data_id();\r\n\r\n/** Get station interface handle\r\n *\r\n * Some APIs require the interface handle to be passed to them. The handle can\r\n * be retrieved using this API.\r\n *\r\n * \\return station interface handle\r\n */\r\nvoid *net_get_sta_handle(void);\r\n#define net_get_mlan_handle() net_get_sta_handle()\r\n\r\n/** Get micro-AP interface handle\r\n *\r\n * Some APIs require the interface handle to be passed to them. The handle can\r\n * be retrieved using this API.\r\n *\r\n * \\return micro-AP interface handle\r\n */\r\nvoid *net_get_uap_handle(void);\r\n\r\n/** Take interface up\r\n *\r\n * Change interface state to up. Use net_get_sta_handle(),\r\n * net_get_uap_handle() to get interface handle.\r\n *\r\n * \\param[in] intrfc_handle interface handle\r\n *\r\n * \\return void\r\n */\r\nvoid net_interface_up(void *intrfc_handle);\r\n\r\n/** Take interface down\r\n *\r\n * Change interface state to down. Use net_get_sta_handle(),\r\n * net_get_uap_handle() to get interface handle.\r\n *\r\n * \\param[in] intrfc_handle interface handle\r\n *\r\n * \\return void\r\n */\r\nvoid net_interface_down(void *intrfc_handle);\r\n\r\n/** Stop DHCP client on given interface\r\n *\r\n * Stop the DHCP client on given interface state. Use net_get_sta_handle(),\r\n * net_get_uap_handle() to get interface handle.\r\n *\r\n * \\param[in] intrfc_handle interface handle\r\n *\r\n * \\return void\r\n */\r\nvoid net_interface_dhcp_stop(void *intrfc_handle);\r\n\r\n/** Cleanup DHCP client on given interface\r\n *\r\n * Cleanup the DHCP client on given interface state. Use net_get_sta_handle(),\r\n * net_get_uap_handle() to get interface handle.\r\n *\r\n * \\param[in] intrfc_handle interface handle\r\n *\r\n */\r\nvoid net_interface_dhcp_cleanup(void *intrfc_handle);\r\n\r\n/** Configure IP address for interface\r\n *\r\n * \\param[in] addr Address that needs to be configured.\r\n * \\param[in] intrfc_handle Handle for network interface to be configured.\r\n *\r\n * \\return WM_SUCCESS on success or an error code.\r\n */\r\nint net_configure_address(struct net_ip_config *addr, void *intrfc_handle);\r\n\r\n/** Configure DNS server address\r\n *\r\n * \\param[in] ip IP address of the DNS server to set\r\n * \\param[in] role Network wireless BSS Role\r\n *\r\n */\r\nvoid net_configure_dns(struct net_ip_config *ip, unsigned int role);\r\n\r\n/** Get interface IP Address in \\ref net_ip_config\r\n *\r\n * This function will get the IP address of a given interface. Use\r\n * net_get_sta_handle(), net_get_uap_handle() to get\r\n * interface handle.\r\n *\r\n * \\param[out] addr \\ref net_ip_config\r\n * \\param[in] intrfc_handle interface handle\r\n *\r\n * \\return WM_SUCCESS on success or error code.\r\n */\r\nint net_get_if_addr(struct net_ip_config *addr, void *intrfc_handle);\r\n\r\n\r\n#endif /* _WM_NET_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/wifi/incl/port/osa/mem_pool.h",
    "content": "/*\r\n *  Copyright 2023-2024 NXP\r\n *\r\n *  SPDX-License-Identifier: BSD-3-Clause\r\n *\r\n */\r\n/*!\\file mem_pool.h\r\n *\\brief This file provides OSA memory pool interfaces for Wi-Fi driver static memory operation.\r\n */\r\n\r\n#ifndef MEM_POOL_H_\r\n#define MEM_POOL_H_\r\n\r\n#include <osa.h>\r\n\r\n/**\r\n * @brief Amount of memory reserved for overhead\r\n */\r\n#define POOL_OVERHEAD (sizeof(uint32_t))\r\n\r\n#if defined(SDK_OS_FREE_RTOS)\r\n\r\n#include \"stack_simple.h\"\r\n\r\n/**\r\n *  The actual Memory Pool data structure.\r\n *\r\n *  This is a variable length data structure.\r\n */\r\ntypedef struct MemPool_t_\r\n{\r\n    /**\r\n     *  We need a lock to make this thread safe.\r\n     */\r\n    OSA_MUTEX_HANDLE_DEFINE(Lock);\r\n\r\n    /**\r\n     *  Memory blocks are stored on a stack.\r\n     */\r\n    Stack_t Stack;\r\n\r\n    /**\r\n     *  Save the item size for additions.\r\n     */\r\n    int ItemSize;\r\n\r\n    /**\r\n     *  The overall alignment of an item.\r\n     */\r\n    int Alignment;\r\n\r\n    /**\r\n     *  The begining of the actual memory pool itself.\r\n     */\r\n    unsigned char Buffer[1];\r\n\r\n} MemPool_t;\r\n\r\n#elif defined(FSL_RTOS_THREADX)\r\n\r\ntypedef TX_BLOCK_POOL MemPool_t;\r\n\r\n#endif\r\n\r\n/** Create a MemoryPool\r\n *\\param[in,out] MemPool the created memory pool.\r\n *\\param[in] ItemSize How big is an allocation.\r\n *\\param[in] PreallocatedMemory Pointer to the preallocated memory\r\n *           you are dedicating to this pool.\r\n *\\param[in] PreallocatedMemorySize How big is the buffer you are\r\n *           passing in.\r\n *\\param[in] Alignment Power of 2 value denoting on which address boundary the\r\n *           memory will be aligned to. Must be at least sizeof(unsigned char *).\r\n *\\return A Handle to the pool, or NULL on failure.\r\n */\r\nMemoryPool_t OSA_MemoryPoolCreate(\r\n    MemPool_t *MemPool, int ItemSize, void *PreallocatedMemory, int PreallocatedMemorySize, int Alignment);\r\n\r\n/**Get a memory buffer from the pool.\r\n * Note that this can block, and cannnot be used from ISR context.\r\n *\r\n *\\param[in] pool A handle to a MemoryPool.\r\n *\\return A pointer or NULL on failure.\r\n */\r\nvoid *OSA_MemoryPoolAllocate(MemoryPool_t pool);\r\n\r\n/**free a memory buffer to the pool.\r\n *\r\n *  note This can block, and cannnot be used from ISR context.\r\n *  note There is no check that the memory passed in is valid.\r\n *\r\n *\\param[in] pool A handle to a MemoryPool.\r\n *\\param[in] memory memory obtained from OSA_MemoryPoolAllocate().\r\n */\r\nvoid OSA_MemoryPoolFree(MemoryPool_t pool, void *memory);\r\n\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/wifi/incl/port/osa/mem_pool_config.h",
    "content": "/*  Copyright 2023-2024 NXP\r\n *\r\n *  SPDX-License-Identifier: BSD-3-Clause\r\n *\r\n */\r\n/*!\\file mem_pool_config.h\r\n *\\brief This file declares interface for memeory pool.\r\n */\r\n\r\n#ifndef _MEM_POOL_CONFIG_H_\r\n#define _MEM_POOL_CONFIG_H_\r\n\r\n#include <mem_pool.h>\r\n\r\n#include <wmlog.h>\r\n#define mpool_e(...) wmlog_e(\"mpool\", ##__VA_ARGS__)\r\n#define mpool_w(...) wmlog_w(\"mpool\", ##__VA_ARGS__)\r\n\r\n#if CONFIG_MEM_POOL_DEBUG\r\n#define mpool_d(...) wmlog(\"mpool\", ##__VA_ARGS__)\r\n#else\r\n#define mpool_d(...)\r\n#endif /* ! CONFIG_MEM_POOL_DEBUG */\r\n\r\n/**\r\n *  Handle for memory pools.\r\n *\r\n *  These are fixed allocation size memory areas.\r\n */\r\nextern MemoryPool_t pmAdapterMemoryPool;\r\nextern MemoryPool_t pmPrivateMemoryPool;\r\nextern MemoryPool_t buf_32_MemoryPool;\r\nextern MemoryPool_t buf_128_MemoryPool;\r\nextern MemoryPool_t buf_256_MemoryPool;\r\nextern MemoryPool_t buf_512_MemoryPool;\r\nextern MemoryPool_t buf_768_MemoryPool;\r\nextern MemoryPool_t buf_1024_MemoryPool;\r\nextern MemoryPool_t buf_1280_MemoryPool;\r\nextern MemoryPool_t buf_1536_MemoryPool;\r\nextern MemoryPool_t buf_1792_MemoryPool;\r\nextern MemoryPool_t buf_2048_MemoryPool;\r\nextern MemoryPool_t buf_2560_MemoryPool;\r\nextern MemoryPool_t buf_3072_MemoryPool;\r\nextern MemoryPool_t buf_4096_MemoryPool;\r\n\r\nint mem_pool_init();\r\n\r\n#endif // _MEM_POOL_CONFIG_H_\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/wifi/incl/port/osa/osa.h",
    "content": "/*\r\n *  Copyright 2024 NXP\r\n *\r\n *  SPDX-License-Identifier: BSD-3-Clause\r\n *\r\n */\r\n/*!\\file osa.h\r\n *\\brief This file contains OSA wrapper declarations for timer, read/write lock and idle hook.\r\n*/\r\n\r\n\r\n#ifndef _OSA_H_\r\n#define _OSA_H_\r\n\r\n#include <wifi_config_default.h>\r\n\r\n#include \"fsl_os_abstraction.h\"\r\n\r\n#if defined(SDK_OS_FREE_RTOS)\r\n#include <osa_freertos.h>\r\n#elif defined(FSL_RTOS_THREADX)\r\n#include \"app_config.h\"\r\n#include <osa_threadx.h>\r\n#elif (CONFIG_ZEPHYR)\r\n#include <osa_zephyr.h>\r\n#else\r\n#error \"Please define OS type\"\r\n#endif\r\n\r\n#include <wmerrno.h>\r\n#include <wm_utils.h>\r\n\r\n/*** Timer Management ***/\r\n/** Create timer\r\n *\r\n * This function creates a timer.\r\n *\r\n * @param[in] timerHandle Pointer to the timer handle\r\n * @param[in] ticks Period in ticks\r\n * @param[in] call_back Timer expire callback function\r\n * @param[in] cb_arg Timer callback data\r\n * @param[in] reload Reload Options, valid values include \\ref KOSA_TimerOnce\r\n * or \\ref KOSA_TimerPeriodic.\r\n * @param[in] activate Activate Options, valid values include \\ref\r\n * OSA_TIMER_AUTO_ACTIVATE or \\ref OSA_TIMER_NO_ACTIVATE\r\n *\r\n * @return KOSA_StatusSuccess if timer created successfully\r\n * @return KOSA_StatusError if timer creation fails\r\n */\r\nosa_status_t OSA_TimerCreate(osa_timer_handle_t timerHandle,\r\n                             osa_timer_tick ticks,\r\n                             void (*call_back)(osa_timer_arg_t),\r\n                             void *cb_arg,\r\n                             osa_timer_t reload,\r\n                             osa_timer_activate_t activate);\r\n\r\n/** Activate timer\r\n *\r\n * This function activates (or starts) a timer that was previously created using\r\n * OSA_TimerCreate(). If the timer had already started and was already in the\r\n * active state, then this call is equivalent to OSA_TimerReset().\r\n *\r\n * @param[in] timerHandle Pointer to a timer handle\r\n *\r\n * @return KOSA_StatusSuccess if timer activated successfully\r\n * @return KOSA_StatusError if timer activation fails\r\n *\r\n */\r\nosa_status_t OSA_TimerActivate(osa_timer_handle_t timerHandle);\r\n\r\n/** Change timer period\r\n *\r\n * This function changes the period of a timer that was previously created using\r\n * OSA_TimerCreate(). This function changes the period of an active or dormant\r\n * state timer.\r\n *\r\n * @param[in] timerHandle Pointer to a timer handle\r\n * @param[in] ntime Time in ticks after which the timer will expire\r\n * @param[in] block_time  This option is currently not supported\r\n *\r\n * @return KOSA_StatusSuccess if timer change successfully\r\n * @return KOSA_StatusError if timer change fails\r\n */\r\nosa_status_t OSA_TimerChange(osa_timer_handle_t timerHandle, osa_timer_tick ntime, osa_timer_tick block_time);\r\n\r\n/** Check the timer active state\r\n *\r\n * This function checks if the timer is in the active or dormant state. A timer\r\n * is in the dormant state if (a) it has been created but not started, or (b) it\r\n * has expired and a one-shot timer.\r\n *\r\n * @param [in] timerHandle Pointer to a timer handle\r\n *\r\n * @return true if timer is active\r\n * @return false if time is not active\r\n */\r\nbool OSA_TimerIsRunning(osa_timer_handle_t timerHandle);\r\n\r\n/**\r\n * Get the timer context\r\n *\r\n * This function helps to retrieve the timer context i.e. 'cb_arg' passed\r\n * to OSA_TimerCreate().\r\n *\r\n * @param[in] timer_t Pointer to timer handle. The timer handle is received\r\n * in the timer callback.\r\n *\r\n * @return The timer context i.e. the callback argument passed to\r\n * OSA_TimerCreate().\r\n */\r\nvoid *OSA_TimerGetContext(osa_timer_handle_t timerHandle);\r\n\r\n/** Reset timer\r\n *\r\n * This function resets a timer that was previously created using using\r\n * OSA_TimerCreate(). If the timer had already been started and was already in\r\n * the active state, then this call will cause the timer to re-evaluate its\r\n * expiry time so that it is relative to when OSA_TimerReset() was called. If\r\n * the timer was in the dormant state then this call behaves in the same way as\r\n * OSA_TimerActivate().\r\n *\r\n * @param[in] timerHandle Pointer to a timer handle\r\n *\r\n * @return KOSA_StatusSuccess if timer reset successfully\r\n * @return KOSA_StatusError if timer reset fails\r\n */\r\nosa_status_t OSA_TimerReset(osa_timer_handle_t timerHandle);\r\n\r\n/** Deactivate timer\r\n *\r\n * This function deactivates (or stops) a timer that was previously started.\r\n *\r\n * @param [in] timerHandle handle populated by OSA_TimerCreate().\r\n *\r\n * @return KOSA_StatusSuccess if timer deactivate successfully\r\n * @return KOSA_StatusError if timer deactivate fails\r\n */\r\nosa_status_t OSA_TimerDeactivate(osa_timer_handle_t timerHandle);\r\n\r\n/** Destroy timer\r\n *\r\n * This function deletes a timer.\r\n *\r\n * @param[in] timerHandle Pointer to a timer handle\r\n *\r\n * @return KOSA_StatusSuccess if timer destroy successfully\r\n * @return KOSA_StatusError if timer destroy fails\r\n */\r\nosa_status_t OSA_TimerDestroy(osa_timer_handle_t timerHandle);\r\n\r\n/*\r\n * Reader Writer Locks\r\n * This is a generic implementation of reader writer locks\r\n * which is reader priority.\r\n * Not only it provides mutual exclusion but also synchronization.\r\n * Six APIs are exposed to user which include.\r\n * -# Create a reader writer lock\r\n * -# Delete a reader writer lock\r\n * -# Reader lock\r\n * -# Reader unlock\r\n * -# Writer lock\r\n * -# Writer unlock\r\n * The locking operation is timeout based.\r\n * Caller can give a timeout from 0 (no wait) to\r\n * infinite (wait forever)\r\n */\r\n\r\ntypedef struct _rw_lock osa_rw_lock_t;\r\n/** This is prototype of reader callback */\r\ntypedef int (*cb_fn)(osa_rw_lock_t *plock, unsigned int wait_time);\r\n\r\nstruct _rw_lock\r\n{\r\n    /** Mutex for reader mutual exclusion */\r\n    OSA_MUTEX_HANDLE_DEFINE(reader_mutex);\r\n    /** Mutex for write mutual exclusion */\r\n    OSA_MUTEX_HANDLE_DEFINE(write_mutex);\r\n    /** Lock which when held by reader,\r\n     *  writer cannot enter critical section\r\n     */\r\n    OSA_SEMAPHORE_HANDLE_DEFINE(rw_lock);\r\n    /** Function being called when first reader gets\r\n     *  the lock\r\n     */\r\n    cb_fn reader_cb;\r\n    /** Counter to maintain number of readers\r\n     *  in critical section\r\n     */\r\n    unsigned int reader_count;\r\n};\r\n\r\nint OSA_RWLockCreateWithCB(osa_rw_lock_t *plock, const char *mutex_name, const char *lock_name, cb_fn r_fn);\r\n\r\n/** Create reader-writer lock\r\n *\r\n * This function creates a reader-writer lock.\r\n *\r\n * @param[in] lock Pointer to a reader-writer lock handle\r\n * @param[in] mutex_name Name of the mutex\r\n * @param[in] lock_name Name of the lock\r\n *\r\n * @return WM_SUCCESS on success\r\n * @return -WM_FAIL on error\r\n */\r\nint OSA_RWLockCreate(osa_rw_lock_t *plock, const char *mutex_name, const char *lock_name);\r\n\r\n/** Delete a reader-write lock\r\n *\r\n * This function deletes a reader-writer lock.\r\n *\r\n * @param[in] lock Pointer to the reader-writer lock handle\r\n *\r\n */\r\nvoid OSA_RWLockDestroy(osa_rw_lock_t *lock);\r\n\r\n/** Acquire writer lock\r\n *\r\n * This function acquires a writer lock. While readers can acquire the lock on a\r\n * sharing basis, writers acquire the lock in an exclusive manner.\r\n *\r\n * @param[in] lock Pointer to the reader-writer lock handle\r\n * @param[in] wait_time The maximum amount of time, in OS ticks, the task should\r\n * block waiting for the lock to be acquired. The special values \\ref\r\n * osaWaitForever_c and \\ref osaWaitNone_c are provided to respectively wait\r\n * infinitely or return immediately.\r\n *\r\n * @return  WM_SUCCESS on success\r\n * @return  -WM_FAIL on error\r\n *\r\n */\r\nint OSA_RWLockWriteLock(osa_rw_lock_t *lock, unsigned int wait_time);\r\n\r\n/** Release writer lock\r\n *\r\n * This function releases a writer lock previously acquired using\r\n * OSA_RWLockWriteLock().\r\n *\r\n * @param[in] lock Pointer to the reader-writer lock handle\r\n */\r\nvoid OSA_RWLockWriteUnlock(osa_rw_lock_t *lock);\r\n\r\n/** Acquire reader lock\r\n *\r\n * This function acquires a reader lock. While readers can acquire the lock on a\r\n * sharing basis, writers acquire the lock in an exclusive manner.\r\n *\r\n * @param[in] lock pointer to the reader-writer lock handle\r\n * @param[in] wait_time The maximum amount of time, in OS ticks, the task should\r\n * block waiting for the lock to be acquired. The special values \\ref\r\n * osaWaitForever_c and \\ref osaWaitNone_c are provided to respectively wait\r\n * infinitely or return immediately.\r\n *\r\n * @return  WM_SUCCESS on success\r\n * @return  -WM_FAIL on error\r\n *\r\n */\r\nint OSA_RWLockReadLock(osa_rw_lock_t *lock, unsigned int wait_time);\r\n\r\n/** Release reader lock\r\n *\r\n * This function releases a reader lock previously acquired using\r\n * OSA_RWLockReadLock().\r\n *\r\n * @param[in] lock pointer to the reader-writer lock handle\r\n *\r\n * @return WM_SUCCESS if unlock operation successful.\r\n * @return -WM_FAIL if unlock operation failed.\r\n */\r\nint OSA_RWLockReadUnlock(osa_rw_lock_t *lock);\r\n\r\n/*** Tick function */\r\n#define MAX_CUSTOM_HOOKS 4U\r\n\r\nextern void (*g_osa_tick_hooks[MAX_CUSTOM_HOOKS])(void);\r\nextern void (*g_osa_idle_hooks[MAX_CUSTOM_HOOKS])(void);\r\n\r\n/** Setup idle function\r\n *\r\n * This function sets up a callback function which will be called whenever the\r\n * system enters the idle thread context.\r\n *\r\n *  @param[in] func The callback function\r\n *\r\n *  @return WM_SUCCESS on success\r\n *  @return -WM_FAIL on error\r\n */\r\nint OSA_SetupIdleFunction(void (*func)(void));\r\n\r\n/** Setup tick function\r\n *\r\n * This function sets up a callback function which will be called on every\r\n * SysTick interrupt.\r\n *\r\n *  @param[in] func The callback function\r\n *\r\n *  @return WM_SUCCESS on success\r\n *  @return -WM_FAIL on error\r\n */\r\nint OSA_SetupTickFunction(void (*func)(void));\r\n\r\n/** Remove idle function\r\n *\r\n *  This function removes an idle callback function that was registered\r\n *  previously using OSA_SetupIdleFunction().\r\n *\r\n *  @param[in] func The callback function\r\n *\r\n *  @return WM_SUCCESS on success\r\n *  @return -WM_FAIL on error\r\n */\r\nint OSA_RemoveIdleFunction(void (*func)(void));\r\n\r\n/** Remove tick function\r\n *\r\n *  This function removes a tick callback function that was registered\r\n *  previously using OSA_SetupTickFunction().\r\n *\r\n *  @param[in] func Callback function\r\n *  @return WM_SUCCESS on success\r\n *  @return -WM_FAIL on error\r\n */\r\nint OSA_RemoveTickFunction(void (*func)(void));\r\n\r\n/* Init value for rand generator seed */\r\nextern uint32_t wm_rand_seed;\r\n\r\n/** This function initialize the seed for rand generator\r\n *  @return a uint32_t random numer\r\n */\r\nstatic inline void OSA_Srand(uint32_t seed)\r\n{\r\n    wm_rand_seed = seed;\r\n}\r\n\r\n/** This function generate a random number\r\n *  @return a uint32_t random numer\r\n */\r\nstatic inline uint32_t OSA_Rand()\r\n{\r\n    if (wm_rand_seed == 0xFFFFFFFFU)\r\n        OSA_Srand(OSA_TimeGetMsec());\r\n    wm_rand_seed = (uint32_t)((((uint64_t)wm_rand_seed * 279470273UL) % 4294967291UL) & 0xFFFFFFFFUL);\r\n    return wm_rand_seed;\r\n}\r\n\r\n/** This function generate a random number in a range\r\n *  @param [in] low  range low\r\n *  @param [in] high range high\r\n *  @return a uint32_t random numer\r\n */\r\nstatic inline uint32_t OSA_RandRange(uint32_t low, uint32_t high)\r\n{\r\n    uint32_t tmp;\r\n    if (low == high)\r\n        return low;\r\n    if (low > high)\r\n    {\r\n        tmp  = low;\r\n        low  = high;\r\n        high = tmp;\r\n    }\r\n    return (low + OSA_Rand() % (high - low));\r\n}\r\n\r\nvoid OSA_DumpThreadInfo(char *name);\r\n\r\n/** Suspend the given thread\r\n *\r\n * - The function OSA_ThreadSelfComplete() will \\b permanently suspend the\r\n * given thread. Passing NULL will suspend the current thread. This\r\n * function never returns.\r\n * - The thread continues to consume system resources. To delete the thread\r\n * the function OSA_TaskDestroy() needs to be called separately.\r\n *\r\n * @param[in] taskHandle Pointer to thread handle\r\n */\r\nvoid OSA_ThreadSelfComplete(osa_task_handle_t taskHandle);\r\n\r\n/** Return the number of messages stored in queue.\r\n *\r\n * @param[in] msgqHandle Pointer to handle of the queue to be queried.\r\n *\r\n * @returns Number of items in the queue\r\n */\r\nuint32_t OSA_MsgQWaiting(osa_msgq_handle_t msgqHandle);\r\n\r\n#endif /* ! _OSA_H_ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/wifi/incl/port/osa/stack_simple.h",
    "content": "/*\r\n *  Copyright (c) 2023, Michael Becker (michael.f.becker@gmail.com)\r\n *  Copyright 2023-2024 NXP\r\n */\r\n/*!\\file stack_simple.h\r\n *\\brief This file is part of the FreeRTOS Add-ons project.\r\n */\r\n\r\n/*\r\n *  Source Code:\r\n *  https://github.com/michaelbecker/freertos-addons\r\n *\r\n *  Project Page:\r\n *  http://michaelbecker.github.io/freertos-addons/\r\n *\r\n *  On-line Documentation:\r\n *  http://michaelbecker.github.io/freertos-addons/docs/html/index.html\r\n *\r\n *  MIT License\r\n *\r\n *  Permission is hereby granted, free of charge, to any person obtaining a\r\n *  copy of this software and associated documentation files\r\n *  (the \"Software\"), to deal in the Software without restriction, including\r\n *  without limitation the rights to use, copy, modify, merge, publish,\r\n *  distribute, sublicense, and/or sell copies of the Software, and to\r\n *  permit persons to whom the Software is furnished to do so,subject to the\r\n *  following conditions:\r\n *\r\n *  + The above copyright notice and this permission notice shall be included\r\n *    in all copies or substantial portions of the Software.\r\n *  + Credit is appreciated, but not required, if you find this project\r\n *    useful enough to include in your application, product, device, etc.\r\n *\r\n *  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\r\n *  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r\n *  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r\n *  IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r\n *  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r\n *  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r\n *  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n *\r\n */\r\n\r\n#ifndef STACK_H_\r\n#define STACK_H_\r\n\r\n#include \"slist.h\"\r\n\r\n/**\r\n *  The stack structure, we leverage low overhead singly linked lists here.\r\n */\r\ntypedef struct Stack_t_\r\n{\r\n    /**\r\n     *  How many items are in the stack.\r\n     */\r\n    int Count;\r\n\r\n    /**\r\n     *  The head of the stack.\r\n     */\r\n    SlNode_t Head;\r\n\r\n} Stack_t;\r\n\r\n/**\r\n *  Initialize a Stack structure you provide.\r\n *\r\n *  @param Stack Pointer to your stack structure.\r\n */\r\nvoid InitStack(Stack_t *Stack);\r\n\r\n/**\r\n *  Push an item onto the stack.\r\n *\r\n *  Note that you have to have embedded an SListNode inside your data\r\n *  structure.\r\n *\r\n *  @param Stack Pointer to your stack structure.\r\n *  @param Node The SListNode you want on the stack.\r\n */\r\nvoid PushOnStack(Stack_t *Stack, SlNode_t *Node);\r\n\r\n/**\r\n *  Pop an item off the stack.\r\n *\r\n *  Note that you have to have embedded an SListNode inside your data\r\n *  structure.\r\n *\r\n *  @param Stack Pointer to your stack structure.\r\n *  @return An SListNode from the stack, or NULL if it's empty.\r\n */\r\nSlNode_t *PopOffStack(Stack_t *Stack);\r\n\r\n/**\r\n *  @return True if the stack is empty, false otherwise.\r\n */\r\n#define IsStackEmpty(_stack) ((_stack)->Count == 0)\r\n\r\n#endif\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/wifi/incl/wifi_config_default.h",
    "content": " /*\r\n *  Copyright 2024 NXP\r\n *\r\n *  SPDX-License-Identifier: BSD-3-Clause\r\n *\r\n */\r\n/*!\\file wifi_config_default.h\r\n *\\brief This file provides default macros for Wi-Fi.\r\n */\r\n\r\n#if !defined WIFI_HDR_CONFIG_H\r\n#define WIFI_HDR_CONFIG_H\r\n\r\n/*\r\n * Include user defined options first. Anything not defined in these files\r\n * will be set to standard values. Override anything you don't like!\r\n */\r\n\r\n#include \"wifi_config.h\"\r\n\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n\r\n#if !defined CONFIG_WIFI_AUTO_POWER_SAVE\r\n#define CONFIG_WIFI_AUTO_POWER_SAVE 1\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_MAX_PRIO\r\n#define CONFIG_WIFI_MAX_PRIO (configMAX_PRIORITIES - 1)\r\n#endif\r\n\r\n#if !defined CONFIG_MAX_AP_ENTRIES\r\n#if defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_MAX_AP_ENTRIES 10\r\n#else\r\n#define CONFIG_MAX_AP_ENTRIES 30\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_5GHz_SUPPORT\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD9177)\r\n#define CONFIG_5GHz_SUPPORT 1\r\n#endif\r\n#endif\r\n\r\n#if defined(SD8801)\r\n#undef CONFIG_5GHz_SUPPORT\r\n#define CONFIG_5GHz_SUPPORT 0\r\n#endif\r\n\r\n#if !defined CONFIG_11AC\r\n#if defined(RW610) || defined(SD8987) || defined(SD9177)\r\n#define CONFIG_11AC 1\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_11AC\r\n#if defined(SD8801) || defined(SD8978)\r\n#undef CONFIG_11AC\r\n#define CONFIG_11AC 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_11AX\r\n#if defined(RW610) || defined(SD9177)\r\n#define CONFIG_11AX CONFIG_11AC\r\n#endif\r\n#endif\r\n\r\n#if !CONFIG_11AC\r\n#undef CONFIG_11AX\r\n#define CONFIG_11AX 0\r\n#endif\r\n\r\n\r\n\r\n#if !defined CONFIG_11AX_TWT\r\n#if defined(RW610) || defined(SD9177)\r\n#define CONFIG_11AX_TWT CONFIG_11AX\r\n#endif\r\n#endif\r\n\r\n#if !CONFIG_11AX\r\n#undef CONFIG_11AX_TWT\r\n#define CONFIG_11AX_TWT 0\r\n#endif\r\n\r\n\r\n#if !CONFIG_11AX\r\n#undef CONFIG_SET_SU\r\n#define CONFIG_SET_SU 0\r\n#endif\r\n\r\n/* WMM options */\r\n#if !defined CONFIG_WMM\r\n#if defined(RW610)\r\n#define CONFIG_WMM 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WMM 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_SDIO_MULTI_PORT_RX_AGGR\r\n#if defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_SDIO_MULTI_PORT_RX_AGGR 1\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_SDIO_MULTI_PORT_RX_AGGR\r\n#if defined(RW610)\r\n#undef CONFIG_SDIO_MULTI_PORT_RX_AGGR\r\n#define CONFIG_SDIO_MULTI_PORT_RX_AGGR 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_SDIO_MULTI_PORT_TX_AGGR\r\n#if defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_SDIO_MULTI_PORT_TX_AGGR CONFIG_WMM\r\n#endif\r\n#endif\r\n\r\n#if defined(RW610)\r\n#undef CONFIG_SDIO_MULTI_PORT_TX_AGGR\r\n#define CONFIG_SDIO_MULTI_PORT_TX_AGGR 0\r\n#endif\r\n\r\n#if !CONFIG_WMM\r\n#undef CONFIG_SDIO_MULTI_PORT_TX_AGGR\r\n#define CONFIG_SDIO_MULTI_PORT_TX_AGGR 0\r\n#endif\r\n\r\n/** Multi port aggregation packet limit */\r\n#if !defined CONFIG_SDIO_MP_AGGR_DEF_PKT_LIMIT\r\n#if defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_SDIO_MP_AGGR_DEF_PKT_LIMIT (4 + (CONFIG_WMM * 4))\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_SDIO_MP_AGGR_DEF_PKT_LIMIT > 8\r\n#undef CONFIG_SDIO_MP_AGGR_DEF_PKT_LIMIT\r\n#if CONFIG_WMM && CONFIG_SDIO_MULTI_PORT_TX_AGGR\r\n#define CONFIG_SDIO_MP_AGGR_DEF_PKT_LIMIT 8\r\n#else\r\n#define CONFIG_SDIO_MP_AGGR_DEF_PKT_LIMIT 4\r\n#endif\r\n#endif\r\n\r\n\r\n#if !defined CONFIG_RF_TEST_MODE\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_RF_TEST_MODE 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_UNII4_BAND_SUPPORT\r\n#if defined(RW610)\r\n#define CONFIG_UNII4_BAND_SUPPORT 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD9177)\r\n#define CONFIG_UNII4_BAND_SUPPORT 0\r\n#endif\r\n#endif\r\n\r\n#if !CONFIG_5GHz_SUPPORT\r\n#undef CONFIG_UNII4_BAND_SUPPORT\r\n#define CONFIG_UNII4_BAND_SUPPORT 0\r\n#endif\r\n\r\n#if !defined CONFIG_COMPRESS_TX_PWTBL\r\n#if defined(RW610) || defined(SD9177)\r\n#define CONFIG_COMPRESS_TX_PWTBL 1\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_COMPRESS_TX_PWTBL\r\n#if defined(SD8978) || defined(SD8987) || defined(SD8801)\r\n#undef CONFIG_COMPRESS_TX_PWTBL\r\n#define CONFIG_COMPRESS_TX_PWTBL 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_COMPRESS_RU_TX_PWTBL\r\n#if defined(SD9177) || defined(RW610)\r\n#define CONFIG_COMPRESS_RU_TX_PWTBL 1\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_COMPRESS_RU_TX_PWTBL\r\n#if defined(SD8978) || defined(SD8987) || defined(SD8801)\r\n#undef CONFIG_COMPRESS_RU_TX_PWTBL\r\n#define CONFIG_COMPRESS_RU_TX_PWTBL 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_FEATURES\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WIFI_FEATURES 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_WIFI_FEATURES\r\n#if defined(SD8801)\r\n#undef CONFIG_WIFI_FEATURES\r\n#define CONFIG_WIFI_FEATURES 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_OFFLOAD\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_OFFLOAD CONFIG_WIFI_FEATURES\r\n#endif\r\n#endif\r\n\r\n#if !CONFIG_WIFI_FEATURES\r\n#undef CONFIG_OFFLOAD\r\n#define CONFIG_OFFLOAD 0\r\n#endif\r\n\r\n#if !defined CONFIG_RW610_A1\r\n#if defined(RW610)\r\n#define CONFIG_RW610_A1 1\r\n#endif\r\n#endif\r\n\r\n#if !defined PRINTF_FLOAT_ENABLE\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define PRINTF_FLOAT_ENABLE 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_IMU_GDMA\r\n#if defined(RW610)\r\n#define CONFIG_IMU_GDMA 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_AMSDU_IN_AMPDU\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_AMSDU_IN_AMPDU 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_SCAN_WITH_RSSIFILTER\r\n#if defined(RW610)\r\n#define CONFIG_SCAN_WITH_RSSIFILTER 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_SCAN_WITH_RSSIFILTER 0\r\n#endif\r\n#endif\r\n\r\n/* WLAN white/black list opt */\r\n#if !defined CONFIG_UAP_STA_MAC_ADDR_FILTER\r\n#if defined(RW610)\r\n#define CONFIG_UAP_STA_MAC_ADDR_FILTER 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_UAP_STA_MAC_ADDR_FILTER 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_DTIM_PERIOD\r\n#if defined(RW610)\r\n#define CONFIG_WIFI_DTIM_PERIOD 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WIFI_DTIM_PERIOD 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_UART_INTERRUPT\r\n#if defined(RW610)\r\n#define CONFIG_UART_INTERRUPT 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_UART_INTERRUPT 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_MAX_CLIENTS_CNT\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WIFI_MAX_CLIENTS_CNT 1\r\n#endif\r\n#endif\r\n\r\n\r\n#if !defined CONFIG_WIFI_FRAG_THRESHOLD\r\n#if defined(RW610)\r\n#define CONFIG_WIFI_FRAG_THRESHOLD 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WIFI_FRAG_THRESHOLD 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_WMM_UAPSD\r\n#if defined(RW610)\r\n#define CONFIG_WMM_UAPSD 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WMM_UAPSD 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_GET_LOG\r\n#if defined(RW610)\r\n#define CONFIG_WIFI_GET_LOG 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WIFI_GET_LOG 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_TX_PER_TRACK\r\n#if defined(RW610)\r\n#define CONFIG_WIFI_TX_PER_TRACK 0\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WIFI_TX_PER_TRACK 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_WIFI_TX_PER_TRACK\r\n#if defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#undef CONFIG_WIFI_TX_PER_TRACK\r\n#define CONFIG_WIFI_TX_PER_TRACK 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_POWER_MANAGER\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_POWER_MANAGER 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_POWER_MANAGER\r\n#if defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#undef CONFIG_POWER_MANAGER\r\n#define CONFIG_POWER_MANAGER 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_CSI\r\n#if defined(RW610)\r\n#define CONFIG_CSI 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_CSI 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_CSI\r\n#if defined(SD8801)\r\n#undef CONFIG_CSI\r\n#define CONFIG_CSI 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_RESET\r\n#if defined(RW610)\r\n#define CONFIG_WIFI_RESET 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WIFI_RESET 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_WIFI_RESET\r\n#if defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#undef CONFIG_WIFI_RESET\r\n#define CONFIG_WIFI_RESET 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_NET_MONITOR\r\n#if defined(RW610)\r\n#define CONFIG_NET_MONITOR 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_NET_MONITOR 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_NET_MONITOR\r\n#if defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#undef CONFIG_NET_MONITOR\r\n#define CONFIG_NET_MONITOR 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_MEM_ACCESS\r\n#if defined(RW610)\r\n#define CONFIG_WIFI_MEM_ACCESS 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WIFI_MEM_ACCESS 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_WIFI_MEM_ACCESS\r\n#if defined(SD8801)\r\n#undef CONFIG_WIFI_MEM_ACCESS\r\n#define CONFIG_WIFI_MEM_ACCESS 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_REG_ACCESS\r\n#if defined(RW610)\r\n#define CONFIG_WIFI_REG_ACCESS 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WIFI_REG_ACCESS 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_WIFI_REG_ACCESS\r\n#if defined(SD8801)\r\n#undef CONFIG_WIFI_REG_ACCESS\r\n#define CONFIG_WIFI_REG_ACCESS 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_ECSA\r\n#if defined(RW610)\r\n#define CONFIG_ECSA 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_ECSA 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_RX_ABORT_CFG\r\n#if defined(RW610)\r\n#define CONFIG_RX_ABORT_CFG 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_RX_ABORT_CFG 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_RX_ABORT_CFG_EXT\r\n#if defined(RW610)\r\n#define CONFIG_RX_ABORT_CFG_EXT 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_RX_ABORT_CFG_EXT 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_CCK_DESENSE_CFG\r\n#if defined(RW610)\r\n#define CONFIG_CCK_DESENSE_CFG 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_CCK_DESENSE_CFG 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_IPS\r\n#if defined(RW610)\r\n#define CONFIG_IPS 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_IPS 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_SUBSCRIBE_EVENT_SUPPORT\r\n#if defined(RW610)\r\n#define CONFIG_SUBSCRIBE_EVENT_SUPPORT 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_SUBSCRIBE_EVENT_SUPPORT 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_FORCE_RTS\r\n#if defined(RW610)\r\n#define CONFIG_WIFI_FORCE_RTS 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WIFI_FORCE_RTS 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_TX_AMPDU_PROT_MODE\r\n#if defined(RW610)\r\n#define CONFIG_TX_AMPDU_PROT_MODE 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_TX_AMPDU_PROT_MODE 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_TSP\r\n#if defined(RW610)\r\n#define CONFIG_TSP 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_TSP 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_TX_RX_HISTOGRAM\r\n#if defined(RW610)\r\n#define CONFIG_TX_RX_HISTOGRAM 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_TX_RX_HISTOGRAM 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_IPV6\r\n#define CONFIG_IPV6 0\r\n#endif\r\n\r\n#if !defined CONFIG_MAX_IPV6_ADDRESSES\r\n#define CONFIG_MAX_IPV6_ADDRESSES 0\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_CAPA\r\n#if defined(RW610)\r\n#define CONFIG_WIFI_CAPA 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WIFI_CAPA 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_ROAMING\r\n#if defined(RW610)\r\n#define CONFIG_ROAMING 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_ROAMING 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_CLOUD_KEEP_ALIVE\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_CLOUD_KEEP_ALIVE 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_CLOUD_KEEP_ALIVE\r\n#if defined(SD8801)\r\n#undef CONFIG_CLOUD_KEEP_ALIVE\r\n#define CONFIG_CLOUD_KEEP_ALIVE 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_TURBO_MODE\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_TURBO_MODE CONFIG_WMM\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_TURBO_MODE\r\n#undef CONFIG_TURBO_MODE\r\n#define CONFIG_TURBO_MODE CONFIG_WMM\r\n#endif\r\n\r\n#if !defined CONFIG_AUTO_RECONNECT\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_AUTO_RECONNECT 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_AUTO_RECONNECT\r\n#if defined(SD8801)\r\n#undef CONFIG_AUTO_RECONNECT\r\n#define CONFIG_AUTO_RECONNECT 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_EXT_SCAN_SUPPORT\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD9177)\r\n#define CONFIG_EXT_SCAN_SUPPORT 1\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_EXT_SCAN_SUPPORT\r\n#if defined(SD8801)\r\n#undef CONFIG_EXT_SCAN_SUPPORT\r\n#define CONFIG_EXT_SCAN_SUPPORT 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_EU_CRYPTO\r\n#if defined(RW610)\r\n#define CONFIG_WIFI_EU_CRYPTO 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WIFI_EU_CRYPTO 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_WIFI_EU_CRYPTO\r\n#if defined(SD8801)\r\n#undef CONFIG_WIFI_EU_CRYPTO\r\n#define CONFIG_WIFI_EU_CRYPTO 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_IND_DNLD\r\n#if defined(SD8978) || defined(SD8987) || defined(SD9177)\r\n#define CONFIG_WIFI_IND_DNLD 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_WIFI_IND_DNLD\r\n#if defined(RW610) || defined(SD8801)\r\n#undef CONFIG_WIFI_IND_DNLD\r\n#define CONFIG_WIFI_IND_DNLD 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_IND_RESET\r\n#if defined(SD8978) || defined(SD8987) || defined(SD9177)\r\n#define CONFIG_WIFI_IND_RESET 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_WIFI_IND_RESET\r\n#if defined(RW610) || defined(SD8801)\r\n#undef CONFIG_WIFI_IND_RESET\r\n#define CONFIG_WIFI_IND_RESET 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_HOST_SLEEP\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_HOST_SLEEP 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_DRIVER_FIPS\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_DRIVER_FIPS 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_DRIVER_FIPS\r\n#define CONFIG_FIPS\r\n#endif\r\n\r\n#if !CONFIG_DRIVER_FIPS\r\n#undef CONFIG_FIPS\r\n#endif\r\n\r\n#if !defined CONFIG_11K\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_11K 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_11AX\r\n#undef CONFIG_11K\r\n#define CONFIG_11K CONFIG_11AX\r\n#endif\r\n\r\n#if !defined CONFIG_11V\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_11V 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_11AX\r\n#undef CONFIG_11V\r\n#define CONFIG_11V CONFIG_11AX\r\n#endif\r\n\r\n#if !defined CONFIG_TCP_ACK_ENH\r\n#if defined(SD9177)\r\n#define CONFIG_TCP_ACK_ENH 1\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_TCP_ACK_ENH\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801)\r\n#undef CONFIG_TCP_ACK_ENH\r\n#define CONFIG_TCP_ACK_ENH\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_FW_VDLL\r\n#if defined(SD9177)\r\n#define CONFIG_FW_VDLL 1\r\n#endif\r\n#endif\r\n\r\n#if !CONFIG_FW_VDLL\r\n#if defined(SD9177)\r\n#undef CONFIG_FW_VDLL\r\n#define CONFIG_FW_VDLL 1\r\n#endif\r\n#endif\r\n\r\n/*\r\n * Config options for wpa supplicant\r\n */\r\n#if !defined CONFIG_WPA_SUPP\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WPA_SUPP 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_DRIVER_MBO\r\n#if defined(RW610) || defined(SD9177)\r\n#define CONFIG_DRIVER_MBO (CONFIG_11AX && !CONFIG_WPA_SUPP)\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_DRIVER_MBO\r\n#if !CONFIG_11AX || CONFIG_WPA_SUPP\r\n#undef CONFIG_DRIVER_MBO\r\n#define CONFIG_DRIVER_MBO 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_DRIVER_MBO\r\n#undef CONFIG_MBO\r\n#endif\r\n\r\n#if !CONFIG_DRIVER_MBO\r\n#define CONFIG_MBO\r\n#endif\r\n\r\n#if !defined CONFIG_DRIVER_OWE\r\n#if defined(RW610)\r\n#define CONFIG_DRIVER_OWE 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_DRIVER_OWE 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_DRIVER_OWE\r\n#if defined(RW610) || defined(SD8801)\r\n#undef CONFIG_DRIVER_OWE\r\n#define CONFIG_DRIVER_OWE CONFIG_WPA_SUPP\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_DRIVER_OWE\r\n#define CONFIG_OWE\r\n#endif\r\n\r\n#if !CONFIG_DRIVER_OWE\r\n#undef CONFIG_OWE\r\n#endif\r\n\r\n#if !defined CONFIG_11R\r\n#if defined(RW610)\r\n#define CONFIG_11R 1\r\n#elif defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_11R 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_11R\r\n#if defined(RW610) || defined(SD8801) || defined(SD9177)\r\n#undef CONFIG_11R\r\n#define CONFIG_11R CONFIG_WPA_SUPP\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_WPA_SUPP_WPS\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WPA_SUPP_WPS 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_WPA_SUPP_WPS\r\n#undef CONFIG_WPA_SUPP_WPS\r\n#define CONFIG_WPA_SUPP_WPS CONFIG_WPA_SUPP\r\n#endif\r\n\r\n#if !defined CONFIG_WPA_SUPP_WPA3\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WPA_SUPP_WPA3 CONFIG_WPA_SUPP\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_WPA_SUPP_WPA3\r\n#undef CONFIG_WPA_SUPP_WPA3\r\n#define CONFIG_WPA_SUPP_WPA3 CONFIG_WPA_SUPP\r\n#endif\r\n\r\n#if !defined CONFIG_WPA_SUPP_DPP\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WPA_SUPP_DPP 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_WPA_SUPP_DPP\r\n#if defined(SD8978) || defined(SD8987) || defined(SD8801)\r\n#undef CONFIG_WPA_SUPP_DPP\r\n#define CONFIG_WPA_SUPP_DPP 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_WPA_SUPP_DPP2\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WPA_SUPP_DPP2 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_WPA_SUPP_DPP2\r\n#if defined(SD8978) || defined(SD8987) || defined(SD8801)\r\n#undef CONFIG_WPA_SUPP_DPP2\r\n#define CONFIG_WPA_SUPP_DPP2 CONFIG_WPA_SUPP_DPP\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_WPA_SUPP_DPP3\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WPA_SUPP_DPP3 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_WPA_SUPP_DPP3\r\n#if defined(SD8978) || defined(SD8987) || defined(SD8801)\r\n#undef CONFIG_WPA_SUPP_DPP3\r\n#define CONFIG_WPA_SUPP_DPP3 (CONFIG_WPA_SUPP_DPP && CONFIG_WPA_SUPP_DPP2)\r\n#endif\r\n#endif\r\n\r\n\r\n\r\n#if !CONFIG_WPA_SUPP_DPP\r\n#undef CONFIG_RX_CHAN_INFO\r\n#define CONFIG_RX_CHAN_INFO 0\r\n#endif\r\n\r\n\r\n\r\n#if !CONFIG_WPA_SUPP_DPP\r\n#undef CONFIG_TXPD_RXPD_V3\r\n#define CONFIG_TXPD_RXPD_V3 0\r\n#endif\r\n\r\n#if !defined CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE\r\n#undef CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE\r\n#define CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE CONFIG_WPA_SUPP\r\n#endif\r\n\r\n#if !defined CONFIG_WPA_SUPP_CRYPTO_AP_ENTERPRISE\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WPA_SUPP_CRYPTO_AP_ENTERPRISE 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_WPA_SUPP_CRYPTO_AP_ENTERPRISE\r\n#undef CONFIG_WPA_SUPP_CRYPTO_AP_ENTERPRISE\r\n#define CONFIG_WPA_SUPP_CRYPTO_AP_ENTERPRISE (CONFIG_WPA_SUPP && CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE)\r\n#endif\r\n\r\n#if !defined CONFIG_EAP_TLS\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_EAP_TLS 0\r\n#endif\r\n#endif\r\n\r\n#if !CONFIG_WPA2_ENTP\r\n#if CONFIG_EAP_TLS\r\n#undef CONFIG_EAP_TLS\r\n#define CONFIG_EAP_TLS (CONFIG_WPA_SUPP && CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE)\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_EAP_PEAP\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_EAP_PEAP 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_EAP_PEAP\r\n#undef CONFIG_EAP_PEAP\r\n#define CONFIG_EAP_PEAP (CONFIG_WPA_SUPP && CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE)\r\n#endif\r\n\r\n#if !defined CONFIG_EAP_TTLS\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_EAP_TTLS 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_EAP_TTLS\r\n#undef CONFIG_EAP_TTLS\r\n#define CONFIG_EAP_TTLS (CONFIG_WPA_SUPP && CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE)\r\n#endif\r\n\r\n#if !defined CONFIG_EAP_FAST\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_EAP_FAST 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_EAP_FAST\r\n#undef CONFIG_EAP_FAST\r\n#define CONFIG_EAP_FAST (CONFIG_WPA_SUPP && CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE)\r\n#endif\r\n\r\n#if !defined CONFIG_EAP_SIM\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_EAP_SIM 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_EAP_SIM\r\n#undef CONFIG_EAP_SIM\r\n#define CONFIG_EAP_SIM (CONFIG_WPA_SUPP && CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE)\r\n#endif\r\n\r\n#if !defined CONFIG_EAP_AKA\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_EAP_AKA 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_EAP_AKA\r\n#undef CONFIG_EAP_AKA\r\n#define CONFIG_EAP_AKA (CONFIG_WPA_SUPP && CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE)\r\n#endif\r\n\r\n#if !defined CONFIG_EAP_AKA_PRIME\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_EAP_AKA_PRIME 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_EAP_AKA_PRIME\r\n#undef CONFIG_EAP_AKA_PRIME\r\n#define CONFIG_EAP_AKA_PRIME (CONFIG_WPA_SUPP && CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE && CONFIG_EAP_AKA)\r\n#endif\r\n\r\n#if !defined CONFIG_EAP_MSCHAPV2\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_EAP_MSCHAPV2 (CONFIG_EAP_PEAP || CONFIG_EAP_TTLS || CONFIG_EAP_FAST)\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_EAP_MSCHAPV2\r\n#undef CONFIG_EAP_MSCHAPV2\r\n#define CONFIG_EAP_MSCHAPV2 \\\r\n    (CONFIG_WPA_SUPP && CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE && (CONFIG_EAP_PEAP || CONFIG_EAP_TTLS || CONFIG_EAP_FAST))\r\n#endif\r\n\r\n#if !defined CONFIG_EAP_GTC\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_EAP_GTC (CONFIG_EAP_PEAP || CONFIG_EAP_TTLS || CONFIG_EAP_FAST)\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_EAP_GTC\r\n#undef CONFIG_EAP_GTC\r\n#define CONFIG_EAP_GTC \\\r\n    (CONFIG_WPA_SUPP && CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE && (CONFIG_EAP_PEAP || CONFIG_EAP_TTLS || CONFIG_EAP_FAST))\r\n#endif\r\n\r\n#if !defined CONFIG_WPS2\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WPS2 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_WPS2\r\n#undef CONFIG_WPS2\r\n#define CONFIG_WPS2 !CONFIG_WPA_SUPP\r\n#endif\r\n\r\n#if !defined CONFIG_WPA2_ENTP\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WPA2_ENTP 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_WPA2_ENTP\r\n#undef CONFIG_WPA2_ENTP\r\n#define CONFIG_WPA2_ENTP !CONFIG_WPA_SUPP\r\n#endif\r\n\r\n#if !defined CONFIG_PEAP_MSCHAPV2\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_PEAP_MSCHAPV2 0\r\n#endif\r\n#endif\r\n\r\n#if CONFIG_PEAP_MSCHAPV2\r\n#undef CONFIG_PEAP_MSCHAPV2\r\n#define CONFIG_PEAP_MSCHAPV2 !CONFIG_WPA_SUPP\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_USB_FILE_ACCESS\r\n#if defined(RW610) || defined(SD8978) || defined(SD8987) || defined(SD8801) || defined(SD9177)\r\n#define CONFIG_WIFI_USB_FILE_ACCESS 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_MMSF\r\n#if defined(RW610)\r\n#define CONFIG_MMSF 1\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_COEX_DUTY_CYCLE\r\n#if defined(RW610)\r\n#define CONFIG_COEX_DUTY_CYCLE 1\r\n#endif\r\n#endif\r\n\r\n/** If define CONFIG_TX_RX_ZERO_COPY 1, please make sure\r\n *  #define PBUF_POOL_BUFSIZE 1752\r\n *  in lwipopts.h\r\n */\r\n#if !defined CONFIG_TX_RX_ZERO_COPY\r\n#if defined(RW610)\r\n#define CONFIG_TX_RX_ZERO_COPY 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_CLOCKSYNC\r\n#if defined(RW610)\r\n#define CONFIG_WIFI_CLOCKSYNC 1\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_INACTIVITY_TIMEOUT_EXT\r\n#if defined(RW610)\r\n#define CONFIG_INACTIVITY_TIMEOUT_EXT 1\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_AUTO_NULL_TX\r\n#if defined(RW610)\r\n#define CONFIG_AUTO_NULL_TX 1\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_EXTERNAL_COEX_PTA\r\n#if defined(RW610)\r\n#define CONFIG_EXTERNAL_COEX_PTA 1\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_FW_VDLLV2\r\n#if defined(RW610)\r\n#define CONFIG_FW_VDLLV2 1\r\n#endif\r\n#endif\r\n\r\n/** Wi-Fi NXP internal macros */\r\n#define LWIPERF_REVERSE_MODE      1\r\n#define CONFIG_MLAN_WMSDK         1\r\n#define CONFIG_11N                1\r\n#define STA_SUPPORT               1\r\n#define UAP_SUPPORT               1\r\n#define WPA                       1\r\n#define KEY_MATERIAL_WEP          1\r\n#define KEY_PARAM_SET_V2          1\r\n#define ENABLE_802_11W            1\r\n#define ENABLE_GCMP_SUPPORT       1\r\n#define CONFIG_STA_AMPDU_RX       1\r\n#define CONFIG_STA_AMPDU_TX       1\r\n#define CONFIG_ENABLE_AMSDU_RX    1\r\n#define CONFIG_UAP_AMPDU_TX       1\r\n#define CONFIG_UAP_AMPDU_RX       1\r\n#define CONFIG_WIFIDRIVER_PS_LOCK 1\r\n#define CONFIG_WNM_PS             1\r\n#define CONFIG_SCAN_CHANNEL_GAP   1\r\n#define CONFIG_COMBO_SCAN         1\r\n#define CONFIG_BG_SCAN            1\r\n#define CONFIG_HOST_MLME          1\r\n#define UAP_HOST_MLME             1\r\n\r\n#if CONFIG_WNM_PS\r\n#if defined(RW610)\r\n#undef CONFIG_WNM_PS\r\n#define CONFIG_WNM_PS 0\r\n#endif\r\n#endif\r\n\r\n#if !defined CONFIG_SEND_HOSTCMD\r\n#define CONFIG_SEND_HOSTCMD 1\r\n#endif\r\n\r\n/* Logs */\r\n#if !defined CONFIG_ENABLE_ERROR_LOGS\r\n#define CONFIG_ENABLE_ERROR_LOGS 1\r\n#endif\r\n\r\n#if !defined CONFIG_ENABLE_WARNING_LOGS\r\n#define CONFIG_ENABLE_WARNING_LOGS 1\r\n#endif\r\n\r\n/* WLCMGR debug */\r\n#if !defined CONFIG_WLCMGR_DEBUG\r\n#define CONFIG_WLCMGR_DEBUG 0\r\n#endif\r\n\r\n/*\r\n * Wifi extra debug options\r\n */\r\n#if !defined CONFIG_WIFI_EXTRA_DEBUG\r\n#define CONFIG_WIFI_EXTRA_DEBUG 0\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_EVENTS_DEBUG\r\n#define CONFIG_WIFI_EVENTS_DEBUG 0\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_CMD_RESP_DEBUG\r\n#define CONFIG_WIFI_CMD_RESP_DEBUG 0\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_PKT_DEBUG\r\n#define CONFIG_WIFI_PKT_DEBUG 0\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_SCAN_DEBUG\r\n#define CONFIG_WIFI_SCAN_DEBUG 0\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_IO_INFO_DUMP\r\n#define CONFIG_WIFI_IO_INFO_DUMP 0\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_IO_DEBUG\r\n#define CONFIG_WIFI_IO_DEBUG 0\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_IO_DUMP\r\n#define CONFIG_WIFI_IO_DUMP 0\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_MEM_DEBUG\r\n#define CONFIG_WIFI_MEM_DEBUG 0\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_AMPDU_DEBUG\r\n#define CONFIG_WIFI_AMPDU_DEBUG 0\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_TIMER_DEBUG\r\n#define CONFIG_WIFI_TIMER_DEBUG 0\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_SDIO_DEBUG\r\n#define CONFIG_WIFI_SDIO_DEBUG 0\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_FW_DEBUG\r\n#define CONFIG_WIFI_FW_DEBUG 0\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_UAP_DEBUG\r\n#define CONFIG_WIFI_UAP_DEBUG 0\r\n#endif\r\n\r\n#if !defined CONFIG_WPS_DEBUG\r\n#define CONFIG_WPS_DEBUG 0\r\n#endif\r\n\r\n#if !defined CONFIG_FW_VDLL_DEBUG\r\n#define CONFIG_FW_VDLL_DEBUG 0\r\n#endif\r\n\r\n#if !defined CONFIG_DHCP_SERVER_DEBUG\r\n#define CONFIG_DHCP_SERVER_DEBUG 0\r\n#endif\r\n\r\n#if !defined CONFIG_WIFI_SDIO_DEBUG\r\n#define CONFIG_WIFI_SDIO_DEBUG 0\r\n#endif\r\n\r\n#if !defined CONFIG_FWDNLD_IO_DEBUG\r\n#define CONFIG_FWDNLD_IO_DEBUG 0\r\n#endif\r\n\r\n/*\r\n * Heap debug options\r\n */\r\n#if !defined CONFIG_HEAP_DEBUG\r\n#define CONFIG_HEAP_DEBUG 0\r\n#endif\r\n\r\n#if !defined CONFIG_HEAP_STAT\r\n#define CONFIG_HEAP_STAT 0\r\n#endif\r\n\r\n/*\r\n * wpa supplicant debug options\r\n */\r\n#if !defined CONFIG_WPA_SUPP_DEBUG_LEVEL\r\n#define CONFIG_WPA_SUPP_DEBUG_LEVEL 6\r\n#endif\r\n\r\n#if !defined CONFIG_SUPP_DEBUG\r\n#define CONFIG_SUPP_DEBUG 0\r\n#endif\r\n\r\n/*\r\n* Wi-Fi SLIM feature options\r\n*/\r\n\r\n#ifndef CONFIG_WIFI_SLIM_ROAM\r\n#define CONFIG_WIFI_SLIM_ROAM 0\r\n#endif\r\n\r\n#ifndef CONFIG_WIFI_SLIM_STA\r\n#define CONFIG_WIFI_SLIM_STA 0\r\n#endif\r\n\r\n#ifndef CONFIG_WIFI_SLIM_UAP\r\n#define CONFIG_WIFI_SLIM_UAP 0\r\n#endif\r\n\r\n#ifndef CONFIG_WIFI_SLIM_DBG\r\n#define CONFIG_WIFI_SLIM_DBG 0\r\n#endif\r\n\r\n#if CONFIG_WIFI_SLIM_ROAM\r\n\r\n#if CONFIG_ROAMING\r\n#undef CONFIG_ROAMING\r\n#define CONFIG_ROAMING 0\r\n#endif\r\n\r\n#if CONFIG_11K\r\n#undef CONFIG_11K\r\n#define CONFIG_11K 0\r\n#endif\r\n\r\n#if CONFIG_11V\r\n#undef CONFIG_11V\r\n#define CONFIG_11V 0\r\n#endif\r\n\r\n#if CONFIG_11R\r\n#undef CONFIG_11R\r\n#define CONFIG_11R 0\r\n#endif\r\n\r\n#endif /* CONFIG_WIFI_SLIM_ROAM */\r\n\r\n#if CONFIG_WIFI_SLIM_STA\r\n\r\n#if CONFIG_5GHz_SUPPORT\r\n#undef CONFIG_5GHz_SUPPORT\r\n#define CONFIG_5GHz_SUPPORT 0\r\n#endif\r\n\r\n#if CONFIG_CLOUD_KEEP_ALIVE\r\n#undef CONFIG_CLOUD_KEEP_ALIVE\r\n#define CONFIG_CLOUD_KEEP_ALIVE 0\r\n#endif\r\n\r\n#if CONFIG_WIFI_EU_CRYPTO\r\n#undef CONFIG_WIFI_EU_CRYPTO\r\n#define CONFIG_WIFI_EU_CRYPTO 0\r\n#endif\r\n\r\n#if CONFIG_TX_AMPDU_PROT_MODE\r\n#undef CONFIG_TX_AMPDU_PROT_MODE\r\n#define CONFIG_TX_AMPDU_PROT_MODE 0\r\n#endif\r\n\r\n#if CONFIG_WNM_PS\r\n#undef CONFIG_WNM_PS\r\n#define CONFIG_WNM_PS 0\r\n#endif\r\n\r\n#if CONFIG_TURBO_MODE\r\n#undef CONFIG_TURBO_MODE\r\n#define CONFIG_TURBO_MODE 0\r\n#endif\r\n\r\n#if CONFIG_AUTO_RECONNECT\r\n#undef CONFIG_AUTO_RECONNECT\r\n#define CONFIG_AUTO_RECONNECT 0\r\n#endif\r\n\r\n#if CONFIG_DRIVER_OWE\r\n#undef CONFIG_DRIVER_OWE\r\n#define CONFIG_DRIVER_OWE 0\r\n#endif\r\n\r\n#ifdef CONFIG_OWE\r\n#undef CONFIG_OWE\r\n#endif\r\n\r\n#if CONFIG_WIFI_FORCE_RTS\r\n#undef CONFIG_WIFI_FORCE_RTS\r\n#define CONFIG_WIFI_FORCE_RTS 0\r\n#endif\r\n\r\n#if CONFIG_WIFI_FRAG_THRESHOLD\r\n#undef CONFIG_WIFI_FRAG_THRESHOLD\r\n#define CONFIG_WIFI_FRAG_THRESHOLD 0\r\n#endif\r\n\r\n#if CONFIG_COMBO_SCAN\r\n#undef CONFIG_COMBO_SCAN\r\n#define CONFIG_COMBO_SCAN 0\r\n#endif\r\n\r\n#if CONFIG_SCAN_CHANNEL_GAP\r\n#undef CONFIG_SCAN_CHANNEL_GAP\r\n#define CONFIG_SCAN_CHANNEL_GAP 0\r\n#endif\r\n\r\n#if CONFIG_MAX_AP_ENTRIES\r\n#undef CONFIG_MAX_AP_ENTRIES\r\n#define CONFIG_MAX_AP_ENTRIES 5\r\n#endif\r\n\r\n#endif /* CONFIG_WIFI_SLIM_ROAM */\r\n\r\n#if CONFIG_WIFI_SLIM_UAP\r\n\r\n#if CONFIG_UAP_STA_MAC_ADDR_FILTER\r\n#undef CONFIG_UAP_STA_MAC_ADDR_FILTER\r\n#define CONFIG_UAP_STA_MAC_ADDR_FILTER 0\r\n#endif\r\n\r\n#if CONFIG_WIFI_MAX_CLIENTS_CNT\r\n#undef CONFIG_WIFI_MAX_CLIENTS_CNT\r\n#define CONFIG_WIFI_MAX_CLIENTS_CNT 0\r\n#endif\r\n\r\n#if CONFIG_WIFI_CAPA\r\n#undef CONFIG_WIFI_CAPA\r\n#define CONFIG_WIFI_CAPA 0\r\n#endif\r\n\r\n#endif /* CONFIG_WIFI_SLIM_ROAM */\r\n\r\n#if CONFIG_WIFI_SLIM_DBG\r\n\r\n#if CONFIG_ENABLE_ERROR_LOGS\r\n#undef CONFIG_ENABLE_ERROR_LOGS\r\n#define CONFIG_ENABLE_ERROR_LOGS 0\r\n#endif\r\n\r\n#if CONFIG_ENABLE_WARNING_LOGS\r\n#undef CONFIG_ENABLE_WARNING_LOGS\r\n#define CONFIG_ENABLE_WARNING_LOGS 0\r\n#endif\r\n\r\n#if CONFIG_SEND_HOSTCMD\r\n#undef CONFIG_SEND_HOSTCMD\r\n#define CONFIG_SEND_HOSTCMD 0\r\n#endif\r\n\r\n#endif /* CONFIG_WIFI_SLIM_ROAM */\r\n\r\n#else\r\n#error \"Please define supported Wi-Fi module\"\r\n#endif\r\n\r\n#endif /* WIFI_HDR_CONFIG_H */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/wifi/incl/wifidriver/wifi_nxp.h",
    "content": "/*\r\n * Copyright 2008-2024 NXP\r\n *\r\n * SPDX-License-Identifier: BSD-3-Clause\r\n *\r\n */\r\n/*!\\file  wifi_nxp.h\r\n *\\brief This file provides core Wi-Fi function definition for wpa supplicant RTOS driver port layer.\r\n */\r\n\r\n#ifndef __WIFI_NXP_H__\r\n#define __WIFI_NXP_H__\r\n\r\n#include <stdio.h>\r\n#include <wm_net.h>\r\n#if CONFIG_WPA_SUPP\r\n\r\n#include <drivers/driver_freertos.h>\r\n\r\ntypedef struct freertos_wpa_supp_dev_callbk_fns rtos_wpa_supp_dev_callbk_fns;\r\n\r\n#if CONFIG_WPA_SUPP_AP\r\ntypedef struct freertos_hostapd_dev_callbk_fns rtos_hostapd_dev_callbk_fns;\r\n#endif\r\n\r\ntypedef struct freertos_wpa_supp_dev_ops rtos_wpa_supp_dev_ops;\r\n\r\n#if 0\r\n/* current zephyr implement uses freertos structures */\r\n#include <drivers/driver_zephyr.h>\r\n\r\ntypedef struct zep_wpa_supp_dev_callbk_fns rtos_wpa_supp_dev_callbk_fns;\r\n\r\n#if CONFIG_WPA_SUPP_AP\r\ntypedef struct zep_hostapd_dev_callbk_fns rtos_hostapd_dev_callbk_fns;\r\n#endif\r\n\r\ntypedef struct zep_wpa_supp_dev_ops rtos_wpa_supp_dev_ops;\r\n#error \"Define WPA Supplicant driver interface structs for your RTOS here\"\r\n#endif\r\n\r\nstruct wifi_nxp_ctx_rtos\r\n{\r\n    const struct netif *iface_ctx;\r\n    void *supp_drv_if_ctx;\r\n\r\n    void *hapd_drv_if_ctx;\r\n    unsigned int bss_type;\r\n\r\n    bool scan_in_progress;\r\n    uint64_t scan_start_tsf;\r\n    uint8_t scan_start_tsf_bssid[ETH_ALEN];\r\n\r\n    unsigned int assoc_freq;\r\n    uint8_t attempt_bssid[ETH_ALEN];\r\n    uint8_t assoc_bssid[ETH_ALEN];\r\n    bool associated;\r\n    bool uap_started;\r\n    bool hostapd;\r\n    rtos_wpa_supp_dev_callbk_fns supp_callbk_fns;\r\n    bool supp_called_remain_on_chan;\r\n    unsigned int remain_on_channel_freq;\r\n    unsigned int remain_on_channel_duration;\r\n    bool remain_on_chan_is_canceled;\r\n#if CONFIG_WPA_SUPP_AP\r\n    rtos_hostapd_dev_callbk_fns hostapd_callbk_fns;\r\n    int mgmt_tx_status;\r\n    uint8_t *last_mgmt_tx_data;\r\n    size_t last_mgmt_tx_data_len;\r\n#endif\r\n};\r\n\r\nint wifi_supp_init(void);\r\nvoid wifi_supp_deinit(void);\r\nint monitor_start(void);\r\nvoid monitor_stop(void);\r\nvoid wifi_scan_start(struct wifi_message *msg);\r\nvoid wifi_scan_done(struct wifi_message *msg);\r\nvoid wifi_process_remain_on_channel(struct wifi_message *msg);\r\nvoid wifi_process_mgmt_tx_status(struct wifi_message *msg);\r\nvoid wifi_scan_result_get(struct wifi_message *msg);\r\nvoid wifi_survey_result_get(struct wifi_message *msg);\r\n\r\n#endif /* CONFIG_WPA_SUPP */\r\n\r\n#endif /* __WIFI_NXP_H__ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/wifi/incl/wlcmgr/wlan.h",
    "content": "/*\r\n *  Copyright 2008-2024 NXP\r\n *\r\n *  SPDX-License-Identifier: BSD-3-Clause\r\n *\r\n */\r\n\r\n/*!\\file wlan.h\r\n *\\brief This file provides Wi-Fi APIs for the application.\r\n */\r\n\r\n#ifndef __WLAN_H__\r\n#define __WLAN_H__\r\n\r\n#ifdef __ZEPHYR__\r\n#include <nxp_wifi.h>\r\n#endif\r\n\r\n#include <wmtypes.h>\r\n#include <wmerrno.h>\r\n#include <stdint.h>\r\n#include <wifi_events.h>\r\n#include <wifi.h>\r\n\r\n#define WLAN_DRV_VERSION \"v1.3.r48.p25\"\r\n\r\n#if CONFIG_WPA2_ENTP\r\n#include <wm_mbedtls_helper_api.h>\r\n#endif\r\n\r\n#define ARG_UNUSED(x) (void)(x)\r\n/* Configuration */\r\n\r\n#if !CONFIG_WLAN_KNOWN_NETWORKS\r\n#define CONFIG_WLAN_KNOWN_NETWORKS 5U\r\n#endif\r\n\r\n#include <wmlog.h>\r\n#define wlcm_e(...) wmlog_e(\"wlcm\", ##__VA_ARGS__)\r\n#define wlcm_w(...) wmlog_w(\"wlcm\", ##__VA_ARGS__)\r\n\r\n#if CONFIG_WLCMGR_DEBUG\r\n#define wlcm_d(...) wmlog(\"wlcm\", ##__VA_ARGS__)\r\n#else\r\n#define wlcm_d(...)\r\n#endif /* ! CONFIG_WLCMGR_DEBUG */\r\n\r\n#if (defined(configSUPPORT_STATIC_ALLOCATION) && (configSUPPORT_STATIC_ALLOCATION > 0U)) && \\\r\n    !((defined(configSUPPORT_DYNAMIC_ALLOCATION) && (configSUPPORT_DYNAMIC_ALLOCATION == 1U)))\r\n\r\n#if CONFIG_WPA_SUPP\r\n#error \"Static memory allocation is not supported for wpa supplicant \"\r\n#endif\r\n\r\n#endif\r\n\r\n/** Action GET */\r\n#define ACTION_GET (0U)\r\n/** Action SET */\r\n#define ACTION_SET (1)\r\n\r\n/** Maximum SSID length */\r\n#ifndef IEEEtypes_SSID_SIZE\r\n#define IEEEtypes_SSID_SIZE 32U\r\n#endif /* IEEEtypes_SSID_SIZE */\r\n\r\n/** MAC Address length */\r\n#ifndef IEEEtypes_ADDRESS_SIZE\r\n#define IEEEtypes_ADDRESS_SIZE 6\r\n#endif /* IEEEtypes_ADDRESS_SIZE */\r\n\r\n#if CONFIG_HOST_SLEEP\r\n#if CONFIG_POWER_MANAGER\r\nextern osa_msg_handle_t mon_thread_event_queue;\r\n#endif\r\n#endif\r\n\r\n#define WLAN_REASON_CODE_PREV_AUTH_NOT_VALID 2U\r\n\r\ntypedef enum\r\n{\r\n    BSS_INFRASTRUCTURE = 1,\r\n    BSS_INDEPENDENT,\r\n    BSS_ANY\r\n} IEEEtypes_Bss_t;\r\n\r\n/* The possible types of basic service sets */\r\n\r\n/** The number of times that the Wi-Fi connection manager look for a\r\n *  network before giving up. */\r\n#if CONFIG_MAX_RESCAN_LIMIT\r\n#define WLAN_RESCAN_LIMIT CONFIG_MAX_RESCAN_LIMIT\r\n#else\r\n#if CONFIG_WPA_SUPP\r\n#define WLAN_RESCAN_LIMIT 30U\r\n#else\r\n#define WLAN_RESCAN_LIMIT 5U\r\n#endif /* CONFIG_WPA_SUPP */\r\n#endif /* CONFIG_MAX_RESCAN_LIMIT */\r\n\r\n#define WLAN_11D_SCAN_LIMIT 3U\r\n/** The number of times that the Wi-Fi connection manager attempts a\r\n * reconnection with the network before giving up. */\r\n#ifndef WLAN_RECONNECT_LIMIT\r\n#define WLAN_RECONNECT_LIMIT 5U\r\n#endif\r\n/** The minimum length for network names, see \\ref wlan_network. This should\r\n *  be between 1 and \\ref WLAN_NETWORK_NAME_MAX_LENGTH */\r\n#define WLAN_NETWORK_NAME_MIN_LENGTH 1U\r\n/** The space reserved for storing network names, \\ref wlan_network */\r\n#define WLAN_NETWORK_NAME_MAX_LENGTH 32U\r\n/** The space reserved for storing PSK (password) phrases. */\r\n/* Min WPA2 passphrase can be upto 8 ASCII chars */\r\n#define WLAN_PSK_MIN_LENGTH 8U\r\n/** Max WPA2 passphrase can be upto 63 ASCII chars or 64 hexadecimal digits*/\r\n#define WLAN_PSK_MAX_LENGTH 65U\r\n/** Min WPA3 password can be upto 8 ASCII chars */\r\n#define WLAN_PASSWORD_MIN_LENGTH 8U\r\n/** Max WPA3 password can be upto 255 ASCII chars */\r\n#define WLAN_PASSWORD_MAX_LENGTH 255U\r\n/** Max WPA2 Enterprise identity can be upto 256 characters */\r\n#define IDENTITY_MAX_LENGTH 64U\r\n/** Max WPA2 Enterprise password can be upto 256 unicode characters */\r\n#define PASSWORD_MAX_LENGTH 128U\r\n/** Max identities for EAP server users */\r\n#define MAX_USERS 8U\r\n/** Encryption key for EAP-FAST PAC-Opaque values. This key is a secret, random value. It is configured as a\r\n * 16-octet value in hex format. */\r\n#define PAC_OPAQUE_ENCR_KEY_MAX_LENGTH 33U\r\n/** A-ID indicates the identity of the authority that issues PACs. The A-ID should be unique across all issuing servers.\r\n * A-ID to be 16 octets in length */\r\n#define A_ID_MAX_LENGTH 33U\r\n/** MAX CA Cert hash len */\r\n#define HASH_MAX_LENGTH 40U\r\n/** MAX domain len */\r\n#define DOMAIN_MATCH_MAX_LENGTH 64U\r\n\r\n#if CONFIG_WLAN_KNOWN_NETWORKS\r\n/** The size of the list of known networks maintained by the Wi-Fi connection manager */\r\n#define WLAN_MAX_KNOWN_NETWORKS CONFIG_WLAN_KNOWN_NETWORKS\r\n#else\r\n#error \"CONFIG_WLAN_KNOWN_NETWORKS is not defined\"\r\n#endif /* CONFIG_WLAN_KNOWN_NETWORKS */\r\n/** Length of a pairwise master key (PMK).  It's always 256 bits (32 Bytes) */\r\n#define WLAN_PMK_LENGTH 32\r\n\r\n#if CONFIG_WMM_UAPSD\r\n#define WMM_UAPSD_QOS_INFO     0x0F\r\n#define WMM_UAPSD_SLEEP_PERIOD 20\r\n#endif\r\n\r\n#if CONFIG_UAP_STA_MAC_ADDR_FILTER\r\n\r\n/* Maximum number of STA filter list can be upto 16 */\r\n#define WLAN_MAX_STA_FILTER_NUM 16\r\n\r\n/* The length of Wi-Fi MAC address */\r\n#define WLAN_MAC_ADDR_LENGTH 6\r\n#endif\r\n\r\n/** Error codes */\r\n/** The operation was successful. */\r\n#define WLAN_ERROR_NONE 0\r\n/** The operation failed due to an error with one or more parameters. */\r\n#define WLAN_ERROR_PARAM 1\r\n/** The operation could not be performed because there is not enough memory. */\r\n#define WLAN_ERROR_NOMEM 2\r\n/** The operation could not be performed in the current system state. */\r\n#define WLAN_ERROR_STATE 3\r\n/** The operation failed due to an internal error. */\r\n#define WLAN_ERROR_ACTION 4\r\n/** The operation to change power state could not be performed*/\r\n#define WLAN_ERROR_PS_ACTION 5\r\n/** The requested feature is not supported*/\r\n#define WLAN_ERROR_NOT_SUPPORTED 6\r\n\r\n/*\r\n * HOST_WAKEUP_GPIO_PIN / CARD_WAKEUP_GPIO_PIN\r\n *\r\n *   Default GPIO pin number. This is chip\r\n *   specific, and a compile time setting depending on the system\r\n *   board level build!\r\n */\r\n#if defined(SD8997) || defined(SD9098) || defined(SD9064) || defined(RW610)\r\n#define HOST_WAKEUP_GPIO_PIN 12\r\n#define CARD_WAKEUP_GPIO_PIN 13\r\n#elif defined(SD9177)\r\n#define HOST_WAKEUP_GPIO_PIN 17\r\n#define CARD_WAKEUP_GPIO_PIN 16\r\n#elif defined(WIFI_88W8987_BOARD_MURATA_1ZM_M2)\r\n#define HOST_WAKEUP_GPIO_PIN 13\r\n#define CARD_WAKEUP_GPIO_PIN 16\r\n#elif defined(WIFI_IW416_BOARD_MURATA_1XK_M2)\r\n#define HOST_WAKEUP_GPIO_PIN 2\r\n#define CARD_WAKEUP_GPIO_PIN 16\r\n#else\r\n#define HOST_WAKEUP_GPIO_PIN 1\r\n#define CARD_WAKEUP_GPIO_PIN 16\r\n#endif\r\n\r\n#define WLAN_MGMT_DIASSOC MBIT(10)\r\n#define WLAN_MGMT_AUTH    MBIT(11)\r\n#define WLAN_MGMT_DEAUTH  MBIT(12)\r\n/** BITMAP for Action frame */\r\n#define WLAN_MGMT_ACTION MBIT(13)\r\n\r\n#if CONFIG_WMM_UAPSD\r\n#define WMM_UAPSD_QOS_INFO     0x0F\r\n#define WMM_UAPSD_SLEEP_PERIOD 20\r\n#endif\r\n\r\n#define WLAN_KEY_MGMT_IEEE8021X             MBIT(0)\r\n#define WLAN_KEY_MGMT_PSK                   MBIT(1)\r\n#define WLAN_KEY_MGMT_NONE                  MBIT(2)\r\n#define WLAN_KEY_MGMT_IEEE8021X_NO_WPA      MBIT(3)\r\n#define WLAN_KEY_MGMT_WPA_NONE              MBIT(4)\r\n#define WLAN_KEY_MGMT_FT_IEEE8021X          MBIT(5)\r\n#define WLAN_KEY_MGMT_FT_PSK                MBIT(6)\r\n#define WLAN_KEY_MGMT_IEEE8021X_SHA256      MBIT(7)\r\n#define WLAN_KEY_MGMT_PSK_SHA256            MBIT(8)\r\n#define WLAN_KEY_MGMT_WPS                   MBIT(9)\r\n#define WLAN_KEY_MGMT_SAE                   MBIT(10)\r\n#define WLAN_KEY_MGMT_FT_SAE                MBIT(11)\r\n#define WLAN_KEY_MGMT_WAPI_PSK              MBIT(12)\r\n#define WLAN_KEY_MGMT_WAPI_CERT             MBIT(13)\r\n#define WLAN_KEY_MGMT_CCKM                  MBIT(14)\r\n#define WLAN_KEY_MGMT_OSEN                  MBIT(15)\r\n#define WLAN_KEY_MGMT_IEEE8021X_SUITE_B     MBIT(16)\r\n#define WLAN_KEY_MGMT_IEEE8021X_SUITE_B_192 MBIT(17)\r\n#define WLAN_KEY_MGMT_FILS_SHA256           MBIT(18)\r\n#define WLAN_KEY_MGMT_FILS_SHA384           MBIT(19)\r\n#define WLAN_KEY_MGMT_FT_FILS_SHA256        MBIT(20)\r\n#define WLAN_KEY_MGMT_FT_FILS_SHA384        MBIT(21)\r\n#define WLAN_KEY_MGMT_OWE                   MBIT(22)\r\n#define WLAN_KEY_MGMT_DPP                   MBIT(23)\r\n#define WLAN_KEY_MGMT_FT_IEEE8021X_SHA384   MBIT(24)\r\n#define WLAN_KEY_MGMT_PASN                  MBIT(25)\r\n#define WLAN_KEY_MGMT_SAE_EXT_KEY           MBIT(26)\r\n\r\n#define WLAN_KEY_MGMT_FT                                                                                            \\\r\n    (WLAN_KEY_MGMT_FT_PSK | WLAN_KEY_MGMT_FT_IEEE8021X | WLAN_KEY_MGMT_FT_IEEE8021X_SHA384 | WLAN_KEY_MGMT_FT_SAE | \\\r\n     WLAN_KEY_MGMT_FT_FILS_SHA256 | WLAN_KEY_MGMT_FT_FILS_SHA384)\r\n\r\n#if CONFIG_WPA_SUPP\r\n\r\n#define WLAN_CIPHER_NONE         MBIT(0)\r\n#define WLAN_CIPHER_WEP40        MBIT(1)\r\n#define WLAN_CIPHER_WEP104       MBIT(2)\r\n#define WLAN_CIPHER_TKIP         MBIT(3)\r\n#define WLAN_CIPHER_CCMP         MBIT(4)\r\n#define WLAN_CIPHER_AES_128_CMAC MBIT(5)\r\n#define WLAN_CIPHER_GCMP         MBIT(6)\r\n#define WLAN_CIPHER_SMS4         MBIT(7)\r\n#define WLAN_CIPHER_GCMP_256     MBIT(8)\r\n#define WLAN_CIPHER_CCMP_256     MBIT(9)\r\n#define WLAN_CIPHER_BIP_GMAC_128 MBIT(11)\r\n#define WLAN_CIPHER_BIP_GMAC_256 MBIT(12)\r\n#define WLAN_CIPHER_BIP_CMAC_256 MBIT(13)\r\n#define WLAN_CIPHER_GTK_NOT_USED MBIT(14)\r\n\r\n#endif\r\n\r\n/** Enum for Wi-Fi errors */\r\nenum wm_wlan_errno\r\n{\r\n    WM_E_WLAN_ERRNO_BASE = MOD_ERROR_START(MOD_WLAN),\r\n    /** The firmware download operation failed. */\r\n    WLAN_ERROR_FW_DNLD_FAILED,\r\n    /** The firmware ready register not set. */\r\n    WLAN_ERROR_FW_NOT_READY,\r\n    /** The Wi-Fi card not found. */\r\n    WLAN_ERROR_CARD_NOT_DETECTED,\r\n    /** The Wi-Fi Firmware not found. */\r\n    WLAN_ERROR_FW_NOT_DETECTED,\r\n    /** BSSID not found in scan list */\r\n    WLAN_BSSID_NOT_FOUND_IN_SCAN_LIST,\r\n};\r\n\r\n/* Events and states */\r\n\r\n/** Wi-Fi connection manager event reason */\r\nenum wlan_event_reason\r\n{\r\n    /** The Wi-Fi connection manager has successfully connected to a network and\r\n     *  is now in the \\ref WLAN_CONNECTED state. */\r\n    WLAN_REASON_SUCCESS,\r\n    /** The Wi-Fi connection manager has successfully authenticated to a network and\r\n     *  is now in the \\ref WLAN_ASSOCIATED state. */\r\n    WLAN_REASON_AUTH_SUCCESS,\r\n    /** The Wi-Fi connection manager failed to connect before actual\r\n     * connection attempt with AP due to incorrect Wi-Fi network profile.\r\n     * or the Wi-Fi connection manager failed to reconnect to previously connected\r\n     * network and it is now in the \\ref WLAN_DISCONNECTED state.*/\r\n    WLAN_REASON_CONNECT_FAILED,\r\n    /** The Wi-Fi connection manager could not find the network that it was\r\n     *  connecting to and it is now in the \\ref WLAN_DISCONNECTED state. */\r\n    WLAN_REASON_NETWORK_NOT_FOUND,\r\n    /** The Wi-Fi connection manager could not find the network in background scan during roam attempt that it was\r\n     *  connecting to and it is now in the \\ref WLAN_CONNECTED state with previous AP. */\r\n    WLAN_REASON_BGSCAN_NETWORK_NOT_FOUND,\r\n    /** The Wi-Fi connection manager failed to authenticate with the network\r\n     *  and is now in the \\ref WLAN_DISCONNECTED state. */\r\n    WLAN_REASON_NETWORK_AUTH_FAILED,\r\n    /** DHCP lease has been renewed.*/\r\n    WLAN_REASON_ADDRESS_SUCCESS,\r\n    /** The Wi-Fi connection manager failed to obtain an IP address\r\n     *  or TCP stack configuration has failed or the IP address\r\n     *  configuration was lost due to a DHCP error.  The system is\r\n     *  now in the \\ref WLAN_DISCONNECTED state. */\r\n    WLAN_REASON_ADDRESS_FAILED,\r\n    /** The Wi-Fi connection manager has lost the link to the current network. */\r\n    WLAN_REASON_LINK_LOST,\r\n    /** The Wi-Fi connection manager has received the channel switch\r\n     * announcement from the current network. */\r\n    WLAN_REASON_CHAN_SWITCH,\r\n    /** The Wi-Fi connection manager has disconnected from the WPS network\r\n     *  (or has canceled a connection attempt) by request and is now in the\r\n     *  WLAN_DISCONNECTED state. */\r\n    WLAN_REASON_WPS_DISCONNECT,\r\n    /** The Wi-Fi connection manager has disconnected from the current network\r\n     *  (or has canceled a connection attempt) by request and is now in the\r\n     *  WLAN_DISCONNECTED state. */\r\n    WLAN_REASON_USER_DISCONNECT,\r\n    /** The Wi-Fi connection manager is initialized and is ready for use.\r\n     *  That is, it's now possible to scan or to connect to a network. */\r\n    WLAN_REASON_INITIALIZED,\r\n    /** The Wi-Fi connection manager has failed to initialize and is therefore\r\n     *  not running. It is not possible to scan or to connect to a network.  The\r\n     *  Wi-Fi connection manager should be stopped and started again via\r\n     *  wlan_stop() and wlan_start() respectively. */\r\n    WLAN_REASON_INITIALIZATION_FAILED,\r\n#if (CONFIG_WIFI_IND_DNLD)\r\n    /** The Wi-Fi connection manager has entered in hang mode. */\r\n    WLAN_REASON_FW_HANG,\r\n    /** The Wi-Fi connection manager has reset fw successfully. */\r\n    WLAN_REASON_FW_RESET,\r\n#endif\r\n    /** The Wi-Fi connection manager has entered power save mode. */\r\n    WLAN_REASON_PS_ENTER,\r\n    /** The Wi-Fi connection manager has exited from power save mode. */\r\n    WLAN_REASON_PS_EXIT,\r\n    /** The Wi-Fi connection manager has started UAP */\r\n    WLAN_REASON_UAP_SUCCESS,\r\n    /** A Wi-Fi client has joined UAP's BSS network */\r\n    WLAN_REASON_UAP_CLIENT_ASSOC,\r\n    /** A Wi-Fi client has auhtenticated and connected to UAP's BSS network */\r\n    WLAN_REASON_UAP_CLIENT_CONN,\r\n    /** A Wi-Fi client has left UAP's BSS network */\r\n    WLAN_REASON_UAP_CLIENT_DISSOC,\r\n    /** The Wi-Fi connection manager has failed to start UAP */\r\n    WLAN_REASON_UAP_START_FAILED,\r\n    /** The Wi-Fi connection manager has failed to stop UAP */\r\n    WLAN_REASON_UAP_STOP_FAILED,\r\n    /** The Wi-Fi connection manager has stopped UAP */\r\n    WLAN_REASON_UAP_STOPPED,\r\n    /** The Wi-Fi connection manager has received subscribed RSSI low event on station interface as per configured\r\n       threshold and frequency. If CONFIG_11K, CONFIG_11V, CONFIG_11R or CONFIG_ROAMING enabled then RSSI low event is\r\n       processed internally.*/\r\n    WLAN_REASON_RSSI_LOW,\r\n#if CONFIG_SUBSCRIBE_EVENT_SUPPORT\r\n    /** The Wi-Fi connection manager has received subscribed RSSI high event on station interface as per configured\r\n       threshold and frequency. */\r\n    WLAN_REASON_RSSI_HIGH,\r\n    /** The Wi-Fi connection manager has received subscribed SNR low event on station interface as per configured\r\n       threshold and frequency. */\r\n    WLAN_REASON_SNR_LOW,\r\n    /** The Wi-Fi connection manager has received subscribed SNR high event on station interface as per configured\r\n       threshold and frequency. */\r\n    WLAN_REASON_SNR_HIGH,\r\n    /** The Wi-Fi connection manager has received subscribed maximum fail event on station interface as per configured\r\n       threshold and frequency. */\r\n    WLAN_REASON_MAX_FAIL,\r\n    /** The Wi-Fi connection manager has received subscribed beacon missed fail event on station interface as per\r\n       configured threshold and frequency. */\r\n    WLAN_REASON_BEACON_MISSED,\r\n    /** The Wi-Fi connection manager has received subscribed data RSSI low event on station interface as per configured\r\n       threshold and frequency. */\r\n    WLAN_REASON_DATA_RSSI_LOW,\r\n    /** The Wi-Fi connection manager has received subscribed data RSSI high event on station interface as per configured\r\n       threshold and frequency. */\r\n    WLAN_REASON_DATA_RSSI_HIGH,\r\n    /** The Wi-Fi connection manager has received subscribed data SNR low event on station interface as per configured\r\n       threshold and frequency. */\r\n    WLAN_REASON_DATA_SNR_LOW,\r\n    /** The Wi-Fi connection manager has received subscribed data SNR high event on station interface as per configured\r\n       threshold and frequency. */\r\n    WLAN_REASON_DATA_SNR_HIGH,\r\n    /** The Wi-Fi connection manager has received subscribed link quality event on station interface as per configured\r\n    link_snr threshold and frequency, link_rate threshold and frequency, link_tx_latency threshold and frequency*/\r\n    WLAN_REASON_LINK_QUALITY,\r\n    /** The Wi-Fi connection manager has received subscribed pre beacon lost event on station interface as per configured\r\n       threshold and frequency. */\r\n    WLAN_REASON_PRE_BEACON_LOST,\r\n#endif\r\n#if CONFIG_NCP\r\n    /** Scan is done */\r\n    WLAN_REASON_SCAN_DONE,\r\n    /** WPS session is done */\r\n    WLAN_REASON_WPS_SESSION_DONE,\r\n#endif\r\n};\r\n\r\n/** Wakeup event bitmap */\r\nenum wlan_wakeup_event_t\r\n{\r\n    /** Wakeup on broadcast  */\r\n    WAKE_ON_ALL_BROADCAST = 1,\r\n    /** Wakeup on unicast  */\r\n    WAKE_ON_UNICAST = 1 << 1,\r\n    /** Wakeup on MAC event  */\r\n    WAKE_ON_MAC_EVENT = 1 << 2,\r\n    /** Wakeup on multicast  */\r\n    WAKE_ON_MULTICAST = 1 << 3,\r\n    /** Wakeup on ARP broadcast  */\r\n    WAKE_ON_ARP_BROADCAST = 1 << 4,\r\n    /** Wakeup on receiving a management frame  */\r\n    WAKE_ON_MGMT_FRAME = 1 << 6,\r\n};\r\n\r\n/** Wi-Fi station/UAP/Wi-Fi direct connection/status state */\r\nenum wlan_connection_state\r\n{\r\n    /** The Wi-Fi connection manager is not connected and no connection attempt\r\n     *  is in progress. It is possible to connect to a network or scan. */\r\n    WLAN_DISCONNECTED,\r\n    /** The Wi-Fi connection manager is not connected but it is currently\r\n     *  attempting to connect to a network.  It is not possible to scan at this\r\n     *  time.  It is possible to connect to a different network. */\r\n    WLAN_CONNECTING,\r\n    /** The Wi-Fi connection manager is not connected but associated. */\r\n    WLAN_ASSOCIATED,\r\n    /** The Wi-Fi connection manager is not connected but authenticated. */\r\n    WLAN_AUTHENTICATED,\r\n    /** The Wi-Fi connection manager is connected. It is possible to scan and\r\n     *  connect to another network at this time. Information about the current\r\n     *  network configuration is available. */\r\n    WLAN_CONNECTED,\r\n    /** The Wi-Fi connection manager has started UAP */\r\n    WLAN_UAP_STARTED,\r\n    /** The Wi-Fi connection manager has stopped UAP */\r\n    WLAN_UAP_STOPPED,\r\n    /** The Wi-Fi connection manager is not connected and network scan\r\n     * is in progress. */\r\n    WLAN_SCANNING,\r\n    /** The Wi-Fi connection manager is not connected and network association\r\n     * is in progress. */\r\n    WLAN_ASSOCIATING,\r\n};\r\n\r\n/* Data Structures */\r\n\r\n/** Station power save mode */\r\ntypedef enum wlan_ps_mode\r\n{\r\n    /** Active mode */\r\n    WLAN_ACTIVE = 0,\r\n    /** IEEE power save mode */\r\n    WLAN_IEEE,\r\n    /** Deep sleep power save mode */\r\n    WLAN_DEEP_SLEEP,\r\n    /** IEEE and deep sleep power save mode */\r\n    WLAN_IEEE_DEEP_SLEEP,\r\n#if CONFIG_WNM_PS\r\n    /** WNM power save mode */\r\n    WLAN_WNM,\r\n    /** WNM and Deep sleep power save mode */\r\n    WLAN_WNM_DEEP_SLEEP,\r\n#endif\r\n} wlan_ps_mode;\r\n\r\nenum wlan_ps_state\r\n{\r\n    PS_STATE_AWAKE = 0,\r\n    PS_STATE_PRE_SLEEP,\r\n    PS_STATE_SLEEP_CFM,\r\n    PS_STATE_SLEEP\r\n};\r\n\r\ntypedef enum _ENH_PS_MODES\r\n{\r\n    GET_PS        = 0,\r\n    SLEEP_CONFIRM = 5,\r\n    EXT_PS_PARAM  = 6,\r\n#if (CONFIG_WNM_PS)\r\n    DIS_WNM_PS = 0xfc,\r\n    EN_WNM_PS  = 0xfd,\r\n#endif\r\n    DIS_AUTO_PS = 0xfe,\r\n    EN_AUTO_PS  = 0xff,\r\n} ENH_PS_MODES;\r\n\r\ntypedef enum _Host_Sleep_Action\r\n{\r\n    HS_CONFIGURE = 0x0001,\r\n    HS_ACTIVATE  = 0x0002,\r\n} Host_Sleep_Action;\r\n\r\n#if (CONFIG_WNM_PS)\r\ntypedef PACK_START struct\r\n{\r\n    uint8_t action;\r\n    uint8_t result;\r\n} PACK_END wnm_sleep_result_t;\r\n#endif\r\n\r\n#if CONFIG_CSI\r\nenum wlan_csi_opt\r\n{\r\n    CSI_FILTER_OPT_ADD = 0,\r\n    CSI_FILTER_OPT_DELETE,\r\n    CSI_FILTER_OPT_CLEAR,\r\n    CSI_FILTER_OPT_DUMP,\r\n};\r\n#endif\r\n\r\nenum wlan_monitor_opt\r\n{\r\n    MONITOR_FILTER_OPT_ADD_MAC = 0,\r\n    MONITOR_FILTER_OPT_DELETE_MAC,\r\n    MONITOR_FILTER_OPT_CLEAR_MAC,\r\n    MONITOR_FILTER_OPT_DUMP,\r\n};\r\n\r\n#if (CONFIG_11MC) || (CONFIG_11AZ)\r\n#define FTM_ACTION_START 1\r\n#define FTM_ACTION_STOP  2\r\n\r\n#define PROTO_DOT11AZ_NTB 1\r\n#define PROTO_DOT11AZ_TB  2\r\n#define PROTO_DOT11MC     0\r\n\r\n/* DOT11MC CFG */\r\n/* Burst duration\r\n 0 - 1: Reserved\r\n 2: 250 micro seconds\r\n 3: 500 micro seconds\r\n 4: 1 ms\r\n 5: 2 ms\r\n 6: 4 ms\r\n 7: 8 ms\r\n 8: 16 ms\r\n 9: 32 ms\r\n 10: 64 ms\r\n 11: 128 ms\r\n 12-14 reserved*/\r\n#define BURST_DURATION 11\r\n/* Burst period in units of 100 milli seconds */\r\n#define BURST_PERIOD 10\r\n/* FTM frames per burst */\r\n#define FTM_PER_BURST 5\r\n/* Indicates minimum time between consecutive FTM (fine timing measurement) frames. It is specified in in units of 100 micro\r\n * seconds. */\r\n#define MIN_DELTA 60\r\n/* ASAP */\r\n#define IS_ASAP 1\r\n/* Bandwidth\r\n 9  - HT20\r\n 10 - VHT20\r\n 11 - HT40\r\n 12 - VHT40\r\n 13 - VHT80 */\r\n#define BW 13 /* RW610 only allows 20M bandwidth */\r\n/*Indicates how many burst instances are requested for the FTM session */\r\n#define BURST_EXP 3\r\n\r\n/* LCI */\r\n#define LCI_REQUEST                1\r\n#define LCI_LATITIUDE              -33.8570095\r\n#define LCI_LONGITUDE              151.2152005\r\n#define LCI_LATITUDE_UNCERTAINITY  18\r\n#define LCI_LONGITUDE_UNCERTAINITY 18\r\n#define LCI_ALTITUDE               11.2\r\n#define LCI_ALTITUDE_UNCERTAINITY  15\r\n#define Z_INFO                     0\r\n\r\n/* CIVIC */\r\n#define CIVIC_REQUEST       1\r\n#define CIVIC_LOCATION      1\r\n#define CIVIC_LOCATION_TYPE 1\r\n#define CIVIC_COUNTRY_CODE  0 /* US */\r\n#define CIVIC_ADDRESS_TYPE  22\r\n#define CIVIC_ADDRESS       \"#123\"\r\n\r\n/* DOT11AZ CFG */\r\n#define FORMAT_BW 2 /* RW610 only allows 20M bandwidth */\r\n/*Maximum number of space-time streams to be used in DL/UL NDP frames in the session upto 80MHz*/\r\n#define MAX_I2R_STS_UPTO80 0 /* RW610 only allows to send 1 N_STS*/\r\n#define MAX_R2I_STS_UPTO80 0\r\n/* Measurement freq in Hz to calculate measurement interval*/\r\n#define AZ_MEASUREMENT_FREQ       4 /* in 0.1 Hz increments */\r\n#define AZ_NUMBER_OF_MEASUREMENTS 6\r\n#define I2R_LMR_FEEDBACK          0 /* allow RSTA to request I2R reporting */\r\n\r\n#define FOR_RANGING 0\r\n\r\n/** Structure of FTM_SESSION_CFG_NTB_RANGING / FTM_SESSION_CFG_TB_RANGING TLV data */\r\ntypedef struct _ranging_11az_cfg\r\n{\r\n    /** Indicates the channel BW for session*/\r\n    /*0: HE20, 1: HE40, 2: HE80, 3: HE80+80, 4: HE160, 5:HE160_SRF*/\r\n    t_u8 format_bw;\r\n    /** indicates for bandwidths less than or equal to 80 MHz the maximum number of space-time streams to be used in\r\n     * DL/UL NDP frames in the session*/\r\n    t_u8 max_i2r_sts_upto80;\r\n    /**indicates for bandwidths less than or equal to 80 MHz the maximum number of space-time streams to be used in\r\n     * DL/UL NDP frames in the session*/\r\n    t_u8 max_r2i_sts_upto80;\r\n    /**Specify measurement freq in Hz to calculate measurement interval*/\r\n    t_u8 az_measurement_freq;\r\n    /**Indicates the number of measurements to be done for session*/\r\n    t_u8 az_number_of_measurements;\r\n    /** Initator lmr feedback */\r\n    t_u8 i2r_lmr_feedback;\r\n    /**Include location civic request (Expect location civic from responder)*/\r\n    t_u8 civic_req;\r\n    /**Include LCI request (Expect LCI info from responder)*/\r\n    t_u8 lci_req;\r\n} ranging_11az_cfg_t;\r\n\r\ntypedef struct _location_cfg_info\r\n{\r\n    /** known latitude uncertainty */\r\n    t_u8 lat_unc;\r\n    /** known longitude uncertainty */\r\n    t_u8 long_unc;\r\n    /** Known altitude uncertainty */\r\n    t_u8 alt_unc;\r\n    /**Include LCI request (expect LCI infomation from responder) */\r\n    t_u8 lci_req;\r\n    /** known longitude */\r\n    double longitude;\r\n    /** known latitude */\r\n    double latitude;\r\n    /** known altitude */\r\n    double altitude;\r\n} location_cfg_info_t;\r\n\r\ntypedef struct _location_civic_rep\r\n{\r\n    /** Civic location type */\r\n    t_u8 civic_location_type;\r\n    /**Civic address type*/\r\n    t_u8 civic_address_type;\r\n    /**Civic address length*/\r\n    t_u8 civic_address_length;\r\n    /**Include LCI request (Expect LCI info from responder)*/\r\n    t_u8 civic_req;\r\n    /**Country code*/\r\n    t_u16 country_code;\r\n} location_civic_rep_t;\r\n\r\n/** Structure of FTM_SESSION_CFG TLV data */\r\ntypedef struct _ftm_11mc_nego_cfg\r\n{\r\n    /** Indicates how many burst instances are requested for the FTM session*/\r\n    t_u8 burst_exponent;\r\n    /** Indicates the duration of a burst instance*/\r\n    t_u8 burst_duration;\r\n    /**Minimum time between consecutive FTM frames*/\r\n    t_u8 min_delta_FTM;\r\n    /**ASAP/non-ASAP casel*/\r\n    t_u8 is_ASAP;\r\n    /**Number of FTMs per burst*/\r\n    t_u8 per_burst_FTM;\r\n    /**FTM channel spacing: HT20/HT40/VHT80/... */\r\n    t_u8 channel_spacing;\r\n    /**Indicates the interval between two consecutive burst instances*/\r\n    t_u16 burst_period;\r\n} ftm_11mc_nego_cfg_t;\r\n#endif\r\n\r\n/** Scan result */\r\nstruct wlan_scan_result\r\n{\r\n    /** The network SSID, represented as a NULL-terminated C string of 0 to 32\r\n     *  characters. If the network has a hidden SSID, this can be the empty\r\n     *  string.\r\n     */\r\n    char ssid[33];\r\n    /** SSID length */\r\n    unsigned int ssid_len;\r\n    /** The network BSSID, represented as a 6-byte array. */\r\n    char bssid[6];\r\n    /** The network channel. */\r\n    unsigned int channel;\r\n    /** The Wi-Fi network type. */\r\n    enum wlan_bss_type type;\r\n    /** The Wi-Fi network mode. */\r\n    enum wlan_bss_role role;\r\n\r\n    /* network features */\r\n    /** The network supports 802.11N.  This is set to 0 if the network does not\r\n     *  support 802.11N or if the system does not have 802.11N support enabled. */\r\n    unsigned dot11n : 1;\r\n#if CONFIG_11AC\r\n    /** The network supports 802.11AC.  This is set to 0 if the network does not\r\n     *  support 802.11AC or if the system does not have 802.11AC support enabled. */\r\n    unsigned dot11ac : 1;\r\n#endif\r\n#if CONFIG_11AX\r\n    /** The network supports 802.11AX.  This is set to 0 if the network does not\r\n     *  support 802.11AX or if the system does not have 802.11AX support enabled. */\r\n    unsigned dot11ax : 1;\r\n#endif\r\n\r\n    /** The network supports WMM.  This is set to 0 if the network does not\r\n     *  support WMM or if the system does not have WMM support enabled. */\r\n    unsigned wmm : 1;\r\n#if (CONFIG_WPA_SUPP_WPS) || (CONFIG_WPS2)\r\n    /** The network supports WPS.  This is set to 0 if the network does not\r\n     *  support WPS or if the system does not have WPS support enabled. */\r\n    unsigned wps : 1;\r\n    /** WPS Type PBC/PIN */\r\n    unsigned int wps_session;\r\n#endif\r\n    /** The network uses WEP security. */\r\n    unsigned wep : 1;\r\n    /** The network uses WPA security. */\r\n    unsigned wpa : 1;\r\n    /** The network uses WPA2 security */\r\n    unsigned wpa2 : 1;\r\n    /** The network uses WPA2 SHA256 security */\r\n    unsigned wpa2_sha256 : 1;\r\n#if CONFIG_DRIVER_OWE\r\n    /** The network uses OWE security */\r\n    unsigned owe : 1;\r\n#endif\r\n    /** The network uses WPA3 SAE security */\r\n    unsigned wpa3_sae : 1;\r\n    /** The network uses WPA2 Enterprise security */\r\n    unsigned wpa2_entp : 1;\r\n    /** The network uses WPA2 Enterprise SHA256 security */\r\n    unsigned wpa2_entp_sha256 : 1;\r\n    /** The network uses WPA3 Enterprise SHA256 security */\r\n    unsigned wpa3_1x_sha256 : 1;\r\n    /** The network uses WPA3 Enterprise SHA384 security */\r\n    unsigned wpa3_1x_sha384 : 1;\r\n#if CONFIG_11R\r\n    /** The network uses FT 802.1x security (For internal use only)*/\r\n    unsigned ft_1x : 1;\r\n    /** The network uses FT 892.1x SHA384 security */\r\n    unsigned ft_1x_sha384 : 1;\r\n    /** The network uses FT PSK security (For internal use only)*/\r\n    unsigned ft_psk : 1;\r\n    /** The network uses FT SAE security (For internal use only)*/\r\n    unsigned ft_sae : 1;\r\n#endif\r\n    /** The signal strength of the beacon */\r\n    unsigned char rssi;\r\n    /** The network SSID, represented as a NULL-terminated C string of 0 to 32\r\n     *  characters. If the network has a hidden SSID, this should be the empty\r\n     *  string.\r\n     */\r\n    char trans_ssid[33];\r\n    /** SSID length */\r\n    unsigned int trans_ssid_len;\r\n    /** The network BSSID, represented as a 6-byte array. */\r\n    char trans_bssid[6];\r\n\r\n    /** Beacon Period */\r\n    uint16_t beacon_period;\r\n\r\n    /** DTIM Period */\r\n    uint8_t dtim_period;\r\n\r\n    /** MFPC bit of AP*/\r\n    t_u8 ap_mfpc;\r\n    /** MFPR bit of AP*/\r\n    t_u8 ap_mfpr;\r\n    /** PWE bit of AP*/\r\n    t_u8 ap_pwe;\r\n\r\n#if CONFIG_11K\r\n    /** Neigbort report support (For internal use only)*/\r\n    bool neighbor_report_supported;\r\n#endif\r\n#if CONFIG_11V\r\n    /** bss transition support (For internal use only)*/\r\n    bool bss_transition_supported;\r\n#endif\r\n};\r\n\r\ntypedef enum\r\n{\r\n    Band_2_4_GHz = 0,\r\n    Band_5_GHz   = 1,\r\n    Band_4_GHz   = 2,\r\n\r\n} ChanBand_e;\r\n\r\n#define NUM_CHAN_BAND_ENUMS 3\r\n\r\ntypedef enum\r\n{\r\n    ChanWidth_20_MHz = 0,\r\n    ChanWidth_10_MHz = 1,\r\n    ChanWidth_40_MHz = 2,\r\n    ChanWidth_80_MHz = 3,\r\n} ChanWidth_e;\r\n\r\ntypedef enum\r\n{\r\n    SECONDARY_CHAN_NONE  = 0,\r\n    SECONDARY_CHAN_ABOVE = 1,\r\n    SECONDARY_CHAN_BELOW = 3,\r\n    // reserved 2, 4~255\r\n} Chan2Offset_e;\r\n\r\ntypedef enum\r\n{\r\n    MANUAL_MODE = 0,\r\n    ACS_MODE    = 1,\r\n} ScanMode_e;\r\n\r\ntypedef PACK_START struct\r\n{\r\n    ChanBand_e chanBand : 2;\r\n    ChanWidth_e chanWidth : 2;\r\n    Chan2Offset_e chan2Offset : 2;\r\n    ScanMode_e scanMode : 2;\r\n} PACK_END BandConfig_t;\r\n\r\ntypedef PACK_START struct\r\n{\r\n    BandConfig_t bandConfig;\r\n    uint8_t chanNum;\r\n\r\n} PACK_END ChanBandInfo_t;\r\n\r\n\r\n#if CONFIG_5GHz_SUPPORT\r\n#define DFS_REC_HDR_LEN (8)\r\n#define DFS_REC_HDR_NUM (10)\r\n#define BIN_COUNTER_LEN (7)\r\n\r\ntypedef PACK_START struct _Event_Radar_Detected_Info\r\n{\r\n    t_u32 detect_count;\r\n    t_u8 reg_domain;    /*1=fcc, 2=etsi, 3=mic*/\r\n    t_u8 main_det_type; /*0=none, 1=pw(chirp), 2=pri(radar)*/\r\n    t_u16 pw_chirp_type;\r\n    t_u8 pw_chirp_idx;\r\n    t_u8 pw_value;\r\n    t_u8 pri_radar_type;\r\n    t_u8 pri_binCnt;\r\n    t_u8 binCounter[BIN_COUNTER_LEN];\r\n    t_u8 numDfsRecords;\r\n    t_u8 dfsRecordHdrs[DFS_REC_HDR_NUM][DFS_REC_HDR_LEN];\r\n    t_u32 reallyPassed;\r\n} PACK_END Event_Radar_Detected_Info;\r\n#endif\r\n\r\n/** Network security types */\r\nenum wlan_security_type\r\n{\r\n    /** The network does not use security. */\r\n    WLAN_SECURITY_NONE,\r\n    /** The network uses WEP security with open key. */\r\n    WLAN_SECURITY_WEP_OPEN,\r\n    /** The network uses WEP security with shared key. */\r\n    WLAN_SECURITY_WEP_SHARED,\r\n    /** The network uses WPA security with PSK. */\r\n    WLAN_SECURITY_WPA,\r\n    /** The network uses WPA2 security with PSK. */\r\n    WLAN_SECURITY_WPA2,\r\n    /** The network uses WPA/WPA2 mixed security with PSK */\r\n    WLAN_SECURITY_WPA_WPA2_MIXED,\r\n#if CONFIG_11R\r\n    /** The network uses WPA2 security with PSK FT. */\r\n    WLAN_SECURITY_WPA2_FT,\r\n#endif\r\n    /** The network uses WPA3 security with SAE. */\r\n    WLAN_SECURITY_WPA3_SAE,\r\n#if CONFIG_WPA_SUPP\r\n#if CONFIG_11R\r\n    /** The network uses WPA3 security with SAE FT. */\r\n    WLAN_SECURITY_WPA3_FT_SAE,\r\n#endif\r\n#endif\r\n    /** The network uses WPA3 security with SAE EXT KEY. */\r\n    WLAN_SECURITY_WPA3_SAE_EXT_KEY,\r\n    /** The network uses WPA2/WPA3 SAE mixed security with PSK. */\r\n    WLAN_SECURITY_WPA2_WPA3_SAE_MIXED,\r\n#if CONFIG_DRIVER_OWE\r\n    /** The network uses OWE only security without Transition mode support. */\r\n    WLAN_SECURITY_OWE_ONLY,\r\n#endif\r\n#if (CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE) || (CONFIG_WPA2_ENTP)\r\n    /** The network uses WPA2 Enterprise EAP-TLS security\r\n     * The identity field in \\ref wlan_network structure is used */\r\n    WLAN_SECURITY_EAP_TLS,\r\n#endif\r\n#if CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE\r\n#if CONFIG_EAP_TLS\r\n    /** The network uses WPA2 Enterprise EAP-TLS SHA256 security.\r\n     * The identity field in \\ref wlan_network structure is used */\r\n    WLAN_SECURITY_EAP_TLS_SHA256,\r\n#if CONFIG_11R\r\n    /** The network uses WPA2 Enterprise EAP-TLS FT security.\r\n     * The identity field in \\ref wlan_network structure is used */\r\n    WLAN_SECURITY_EAP_TLS_FT,\r\n    /** The network uses WPA2 Enterprise EAP-TLS FT SHA384 security\r\n     * The identity field in \\ref wlan_network structure is used */\r\n    WLAN_SECURITY_EAP_TLS_FT_SHA384,\r\n#endif\r\n#endif\r\n#if CONFIG_EAP_TTLS\r\n    /** The network uses WPA2 Enterprise EAP-TTLS security.\r\n     * The identity field in \\ref wlan_network structure is used */\r\n    WLAN_SECURITY_EAP_TTLS,\r\n#endif\r\n#if CONFIG_EAP_MSCHAPV2\r\n    /** The network uses WPA2 Enterprise EAP-TTLS-MSCHAPV2 security.\r\n     * The anonymous identity, identity and password fields in\r\n     * \\ref wlan_network structure are used */\r\n    WLAN_SECURITY_EAP_TTLS_MSCHAPV2,\r\n#endif\r\n#endif\r\n#if (CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE) || (CONFIG_PEAP_MSCHAPV2) || (CONFIG_WPA2_ENTP)\r\n    /** The network uses WPA2 Enterprise EAP-PEAP-MSCHAPV2 security.\r\n     * The anonymous identity, identity and password fields in\r\n     * \\ref wlan_network structure are used */\r\n    WLAN_SECURITY_EAP_PEAP_MSCHAPV2,\r\n#endif\r\n#if CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE\r\n#if CONFIG_EAP_PEAP\r\n#if CONFIG_EAP_TLS\r\n    /** The network uses WPA2 Enterprise EAP-PEAP-TLS security.\r\n     * The anonymous identity, identity and password fields in\r\n     * \\ref wlan_network structure are used */\r\n    WLAN_SECURITY_EAP_PEAP_TLS,\r\n#endif\r\n#if CONFIG_EAP_GTC\r\n    /** The network uses WPA2 Enterprise EAP-PEAP-GTC security.\r\n     * The anonymous identity, identity and password fields in\r\n     * \\ref wlan_network structure are used */\r\n    WLAN_SECURITY_EAP_PEAP_GTC,\r\n#endif\r\n#endif\r\n#if CONFIG_EAP_FAST\r\n#if CONFIG_EAP_MSCHAPV2\r\n    /** The network uses WPA2 Enterprise EAP-FAST-MSCHAPV2 security.\r\n     * The anonymous identity, identity and password fields in\r\n     * \\ref wlan_network structure are used */\r\n    WLAN_SECURITY_EAP_FAST_MSCHAPV2,\r\n#endif\r\n#if CONFIG_EAP_GTC\r\n    /** The network uses WPA2 Enterprise EAP-FAST-GTC security\r\n     * The anonymous identity, identity and password fields in\r\n     * \\ref wlan_network structure are used */\r\n    WLAN_SECURITY_EAP_FAST_GTC,\r\n#endif\r\n#endif\r\n#if CONFIG_EAP_SIM\r\n    /** The network uses WPA2 Enterprise EAP-SIM security\r\n     * The identity and password fields in\r\n     * \\ref wlan_network structure are used */\r\n    WLAN_SECURITY_EAP_SIM,\r\n#endif\r\n#if CONFIG_EAP_AKA\r\n    /** The network uses WPA2 Enterprise EAP-AKA security\r\n     * The identity and password fields in\r\n     * \\ref wlan_network structure are used */\r\n    WLAN_SECURITY_EAP_AKA,\r\n#endif\r\n#if CONFIG_EAP_AKA_PRIME\r\n    /** The network uses WPA2 Enterprise EAP-AKA-PRIME security\r\n     * The identity and password fields in\r\n     * \\ref wlan_network structure are used */\r\n    WLAN_SECURITY_EAP_AKA_PRIME,\r\n#endif\r\n#endif\r\n#if CONFIG_WPA_SUPP_DPP\r\n    /** The network uses DPP security with NAK(Net Access Key) */\r\n    WLAN_SECURITY_DPP,\r\n#endif\r\n    /** The network can use any security method. This is often used when\r\n     * the user only knows the name and passphrase but not the security\r\n     * type.  */\r\n    WLAN_SECURITY_WILDCARD,\r\n};\r\n\r\n#if CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE\r\n#if CONFIG_EAP_TLS\r\n/** EAP TLS Cipher types*/\r\nenum eap_tls_cipher_type\r\n{\r\n    EAP_TLS_NONE,\r\n    /** EAP TLS with ECDH & ECDSA with p384 */\r\n    EAP_TLS_ECC_P384,\r\n    /** EAP TLS with ECDH & RSA with > 3K */\r\n    EAP_TLS_RSA_3K,\r\n};\r\n#endif\r\n#endif\r\n\r\n/** Wi-Fi cipher structure */\r\nstruct wlan_cipher\r\n{\r\n    /** 1 bit value can be set for none */\r\n    uint16_t none : 1;\r\n    /** 1 bit value can be set for wep40 */\r\n    uint16_t wep40 : 1;\r\n    /** 1 bit value can be set for wep104 */\r\n    uint16_t wep104 : 1;\r\n    /** 1 bit value can be set for tkip */\r\n    uint16_t tkip : 1;\r\n    /** 1 bit value can be set for ccmp */\r\n    uint16_t ccmp : 1;\r\n    /**  1 bit value can be set for aes 128 cmac */\r\n    uint16_t aes_128_cmac : 1;\r\n    /** 1 bit value can be set for gcmp */\r\n    uint16_t gcmp : 1;\r\n    /** 1 bit value can be set for sms4 */\r\n    uint16_t sms4 : 1;\r\n    /** 1 bit value can be set for gcmp 256 */\r\n    uint16_t gcmp_256 : 1;\r\n    /** 1 bit value can be set for ccmp 256 */\r\n    uint16_t ccmp_256 : 1;\r\n    /** 1 bit is reserved */\r\n    uint16_t rsvd : 1;\r\n    /** 1 bit value can be set for bip gmac 128 */\r\n    uint16_t bip_gmac_128 : 1;\r\n    /** 1 bit value can be set for bip gmac 256 */\r\n    uint16_t bip_gmac_256 : 1;\r\n    /** 1 bit value can be set for bip cmac 256 */\r\n    uint16_t bip_cmac_256 : 1;\r\n    /** 1 bit value can be set for gtk not used */\r\n    uint16_t gtk_not_used : 1;\r\n    /** 4 bits are reserved */\r\n    uint16_t rsvd2 : 2;\r\n};\r\n\r\nstatic inline int is_valid_security(int security)\r\n{\r\n    /*Currently only these modes are supported */\r\n    if ((security == WLAN_SECURITY_NONE) || (security == WLAN_SECURITY_WEP_OPEN) || (security == WLAN_SECURITY_WPA) ||\r\n        (security == WLAN_SECURITY_WPA2) ||\r\n#if CONFIG_11R\r\n        (security == WLAN_SECURITY_WPA2_FT) ||\r\n#endif\r\n        (security == WLAN_SECURITY_WPA_WPA2_MIXED) ||\r\n#if CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE\r\n#if CONFIG_EAP_TLS\r\n        (security == WLAN_SECURITY_EAP_TLS) || (security == WLAN_SECURITY_EAP_TLS_SHA256) ||\r\n#if CONFIG_11R\r\n        (security == WLAN_SECURITY_EAP_TLS_FT) || (security == WLAN_SECURITY_EAP_TLS_FT_SHA384) ||\r\n#endif\r\n#endif\r\n#if CONFIG_EAP_TTLS\r\n        (security == WLAN_SECURITY_EAP_TTLS) ||\r\n#if CONFIG_EAP_MSCHAPV2\r\n        (security == WLAN_SECURITY_EAP_TTLS_MSCHAPV2) ||\r\n#endif\r\n#endif\r\n#if CONFIG_EAP_PEAP\r\n#if CONFIG_EAP_MSCHAPV2\r\n        (security == WLAN_SECURITY_EAP_PEAP_MSCHAPV2) ||\r\n#endif\r\n#if CONFIG_EAP_TLS\r\n        (security == WLAN_SECURITY_EAP_PEAP_TLS) ||\r\n#endif\r\n#if CONFIG_EAP_GTC\r\n        (security == WLAN_SECURITY_EAP_PEAP_GTC) ||\r\n#endif\r\n#endif\r\n#if CONFIG_EAP_FAST\r\n#if CONFIG_EAP_MSCHAPV2\r\n        (security == WLAN_SECURITY_EAP_FAST_MSCHAPV2) ||\r\n#endif\r\n#if CONFIG_EAP_GTC\r\n        (security == WLAN_SECURITY_EAP_FAST_GTC) ||\r\n#endif\r\n#endif\r\n#if CONFIG_EAP_SIM\r\n        (security == WLAN_SECURITY_EAP_SIM) ||\r\n#endif\r\n#if CONFIG_EAP_AKA\r\n        (security == WLAN_SECURITY_EAP_AKA) ||\r\n#endif\r\n#if CONFIG_EAP_AKA_PRIME\r\n        (security == WLAN_SECURITY_EAP_AKA_PRIME) ||\r\n#endif\r\n#else\r\n#if CONFIG_WPA2_ENTP\r\n        (security == WLAN_SECURITY_EAP_TLS) ||\r\n#endif\r\n#if CONFIG_PEAP_MSCHAPV2\r\n        (security == WLAN_SECURITY_EAP_PEAP_MSCHAPV2) ||\r\n#endif\r\n#endif /* CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE */\r\n#if CONFIG_DRIVER_OWE\r\n        (security == WLAN_SECURITY_OWE_ONLY) ||\r\n#endif\r\n        (security == WLAN_SECURITY_WPA3_SAE) || (security == WLAN_SECURITY_WPA2_WPA3_SAE_MIXED) ||\r\n#if CONFIG_WPA_SUPP\r\n#if CONFIG_11R\r\n        (security == WLAN_SECURITY_WPA3_FT_SAE) ||\r\n#endif\r\n#endif\r\n        (security == WLAN_SECURITY_WPA3_SAE_EXT_KEY) || (security == WLAN_SECURITY_WILDCARD))\r\n    {\r\n        return 1;\r\n    }\r\n    return 0;\r\n}\r\n\r\n#if CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE\r\nstatic inline int is_ep_valid_security(int security)\r\n{\r\n    /*Currently only these modes are supported */\r\n    if (\r\n#if CONFIG_EAP_TLS\r\n        (security == WLAN_SECURITY_EAP_TLS) || (security == WLAN_SECURITY_EAP_TLS_SHA256) ||\r\n#if CONFIG_11R\r\n        (security == WLAN_SECURITY_EAP_TLS_FT) || (security == WLAN_SECURITY_EAP_TLS_FT_SHA384) ||\r\n#endif\r\n#endif\r\n#if CONFIG_EAP_TTLS\r\n        (security == WLAN_SECURITY_EAP_TTLS) ||\r\n#if CONFIG_EAP_MSCHAPV2\r\n        (security == WLAN_SECURITY_EAP_TTLS_MSCHAPV2) ||\r\n#endif\r\n#endif\r\n#if CONFIG_EAP_PEAP\r\n#if CONFIG_EAP_MSCHAPV2\r\n        (security == WLAN_SECURITY_EAP_PEAP_MSCHAPV2) ||\r\n#endif\r\n#if CONFIG_EAP_TLS\r\n        (security == WLAN_SECURITY_EAP_PEAP_TLS) ||\r\n#endif\r\n#if CONFIG_EAP_GTC\r\n        (security == WLAN_SECURITY_EAP_PEAP_GTC) ||\r\n#endif\r\n#endif\r\n#if CONFIG_EAP_FAST\r\n#if CONFIG_EAP_MSCHAPV2\r\n        (security == WLAN_SECURITY_EAP_FAST_MSCHAPV2) ||\r\n#endif\r\n#if CONFIG_EAP_GTC\r\n        (security == WLAN_SECURITY_EAP_FAST_GTC) ||\r\n#endif\r\n#endif\r\n#if CONFIG_EAP_SIM\r\n        (security == WLAN_SECURITY_EAP_SIM) ||\r\n#endif\r\n#if CONFIG_EAP_AKA\r\n        (security == WLAN_SECURITY_EAP_AKA) ||\r\n#endif\r\n#if CONFIG_EAP_AKA_PRIME\r\n        (security == WLAN_SECURITY_EAP_AKA_PRIME) ||\r\n#endif\r\n        false)\r\n    {\r\n        return 1;\r\n    }\r\n    return 0;\r\n}\r\n#endif\r\n\r\n/** Network security configuration */\r\nstruct wlan_network_security\r\n{\r\n    /** Type of network security to use specified by enum\r\n     * wlan_security_type. */\r\n    enum wlan_security_type type;\r\n    /** Key management type */\r\n    int key_mgmt;\r\n    /** Type of network security Group Cipher suite used internally*/\r\n    struct wlan_cipher mcstCipher;\r\n    /** Type of network security Pairwise Cipher suite used internally*/\r\n    struct wlan_cipher ucstCipher;\r\n#if CONFIG_WPA_SUPP\r\n    /** Proactive key caching */\r\n    unsigned pkc : 1;\r\n    /** Type of network security Group Cipher suite */\r\n    int group_cipher;\r\n    /** Type of network security Pairwise Cipher suite */\r\n    int pairwise_cipher;\r\n    /** Type of network security Pairwise Cipher suite */\r\n    int group_mgmt_cipher;\r\n#endif\r\n    /** Is PMF (protected management frame) required */\r\n    bool is_pmf_required;\r\n    /** Pre-shared key (network password).  For WEP networks this is a hex byte\r\n     * sequence of length psk_len, for WPA and WPA2 networks this is an ASCII\r\n     * pass-phrase of length psk_len.  This field is ignored for networks with no\r\n     * security. */\r\n    char psk[WLAN_PSK_MAX_LENGTH];\r\n    /** Length of the WEP key or WPA/WPA2 pass phrase, \\ref WLAN_PSK_MIN_LENGTH to \\ref\r\n     * WLAN_PSK_MAX_LENGTH.  Ignored for networks with no security. */\r\n    uint8_t psk_len;\r\n    /** WPA3 SAE password, for WPA3 SAE networks this is an ASCII\r\n     * password of length password_len.  This field is ignored for networks with no\r\n     * security. */\r\n    char password[WLAN_PASSWORD_MAX_LENGTH + 1];\r\n    /** Length of the WPA3 SAE Password, \\ref WLAN_PASSWORD_MIN_LENGTH to \\ref\r\n     * WLAN_PASSWORD_MAX_LENGTH.  Ignored for networks with no security. */\r\n    size_t password_len;\r\n    /** SAE Groups */\r\n    char *sae_groups;\r\n    /** PWE derivation */\r\n    uint8_t pwe_derivation;\r\n    /** transition disable */\r\n    uint8_t transition_disable;\r\n#if CONFIG_DRIVER_OWE\r\n    /** OWE Groups */\r\n    char *owe_groups;\r\n#endif\r\n    /** PMK (pairwise master key). When pmk_valid is set, this is the PMK calculated\r\n     * from the PSK for WPA/PSK networks. If pmk_valid is not set, this field\r\n     * is not valid. When adding networks with \\ref wlan_add_network, users\r\n     * can initialize PMK and set pmk_valid in lieu of setting the psk. After\r\n     * successfully connecting to a WPA/PSK network, users can call \\ref\r\n     * wlan_get_current_network to inspect pmk_valid and pmk. Thus, the pmk\r\n     * value can be populated in subsequent calls to \\ref wlan_add_network.\r\n     * This saves the CPU time required to otherwise calculate the PMK.\r\n     */\r\n    char pmk[WLAN_PMK_LENGTH];\r\n\r\n    /** Flag reporting whether PMK is valid or not. */\r\n    bool pmk_valid;\r\n    /** Management frame protection capable (MFPC) */\r\n    int8_t mfpc;\r\n    /** Management frame protection required (MFPR) */\r\n    int8_t mfpr;\r\n#if CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE\r\n    /** WPA3 Enterprise mode */\r\n    unsigned wpa3_sb : 1;\r\n    /** WPA3 Enterprise Suite B 192 mode */\r\n    unsigned wpa3_sb_192 : 1;\r\n    /** PEAP version */\r\n    unsigned eap_ver : 1;\r\n#if CONFIG_EAP_PEAP\r\n    /** PEAP label */\r\n    unsigned peap_label : 1;\r\n    /** crypto_binding option can be used to control \\ref WLAN_SECURITY_EAP_PEAP_MSCHAPV2, \\ref\r\n     * WLAN_SECURITY_EAP_PEAP_TLS and \\ref WLAN_SECURITY_EAP_PEAP_GTC version 0 cryptobinding behavior: 0 = do not use\r\n     * cryptobinding (default) 1 = use cryptobinding if server supports it 2 = require cryptobinding */\r\n    uint8_t eap_crypto_binding;\r\n#endif\r\n#if (CONFIG_EAP_SIM) || (CONFIG_EAP_AKA) || (CONFIG_EAP_AKA_PRIME)\r\n    /** eap_result_ind=1 can be used to enable \\ref WLAN_SECURITY_EAP_SIM, \\ref WLAN_SECURITY_EAP_AKA and \\ref\r\n     * WLAN_SECURITY_EAP_AKA_PRIME to use protected result indication.*/\r\n    unsigned eap_result_ind : 1;\r\n#endif\r\n#if CONFIG_EAP_TLS\r\n    /** Cipher for EAP TLS */\r\n    unsigned char tls_cipher;\r\n#endif\r\n    /** Identity string for EAP */\r\n    char identity[IDENTITY_MAX_LENGTH];\r\n    /** Anonymous identity string for EAP */\r\n    char anonymous_identity[IDENTITY_MAX_LENGTH];\r\n    /** Password string for EAP. This field can include\r\n     * either the plaintext password (using ASCII or\r\n     * hex string) */\r\n    char eap_password[PASSWORD_MAX_LENGTH];\r\n    /** CA cert blob in PEM/DER format */\r\n    unsigned char *ca_cert_data;\r\n    /** CA cert blob len */\r\n    size_t ca_cert_len;\r\n    /** Client cert blob in PEM/DER format */\r\n    unsigned char *client_cert_data;\r\n    /** Client cert blob len */\r\n    size_t client_cert_len;\r\n    /** Client key blob */\r\n    unsigned char *client_key_data;\r\n    /** Client key blob len */\r\n    size_t client_key_len;\r\n    /** Client key password */\r\n    char client_key_passwd[PASSWORD_MAX_LENGTH];\r\n    /** CA cert HASH */\r\n    char ca_cert_hash[HASH_MAX_LENGTH];\r\n    /** Domain */\r\n    char domain_match[DOMAIN_MATCH_MAX_LENGTH];\r\n    /** Domain Suffix */\r\n    char domain_suffix_match[DOMAIN_MATCH_MAX_LENGTH]; /*suffix max length same as full domain name length*/\r\n    /** CA cert2 blob in PEM/DER format */\r\n    unsigned char *ca_cert2_data;\r\n    /** CA cert2 blob len */\r\n    size_t ca_cert2_len;\r\n    /** Client cert2 blob in PEM/DER format */\r\n    unsigned char *client_cert2_data;\r\n    /** Client cert2 blob len */\r\n    size_t client_cert2_len;\r\n    /** Client key2 blob */\r\n    unsigned char *client_key2_data;\r\n    /** Client key2 blob len */\r\n    size_t client_key2_len;\r\n    /** Client key2 password */\r\n    char client_key2_passwd[PASSWORD_MAX_LENGTH];\r\n#if CONFIG_HOSTAPD\r\n#if CONFIG_WPA_SUPP_CRYPTO_AP_ENTERPRISE\r\n    /** DH params blob */\r\n    unsigned char *dh_data;\r\n    /** DH params blob len */\r\n    size_t dh_len;\r\n    /** Server cert blob in PEM/DER format */\r\n    unsigned char *server_cert_data;\r\n    /** Server cert blob len */\r\n    size_t server_cert_len;\r\n    /** Server key blob */\r\n    unsigned char *server_key_data;\r\n    /** Server key blob len */\r\n    size_t server_key_len;\r\n    /** Server key password */\r\n    char server_key_passwd[PASSWORD_MAX_LENGTH];\r\n    /** Number of EAP users */\r\n    size_t nusers;\r\n    /** User Identities */\r\n    char identities[MAX_USERS][IDENTITY_MAX_LENGTH];\r\n    /** User Passwords */\r\n    char passwords[MAX_USERS][PASSWORD_MAX_LENGTH];\r\n#if CONFIG_EAP_FAST\r\n    /** Encryption key for EAP-FAST PAC-Opaque values */\r\n    char pac_opaque_encr_key[PAC_OPAQUE_ENCR_KEY_MAX_LENGTH];\r\n    /** EAP-FAST authority identity (A-ID) */\r\n    char a_id[A_ID_MAX_LENGTH];\r\n    /** EAP-FAST provisioning modes:\r\n     * 0 = provisioning disabled\r\n     * 1 = only anonymous provisioning allowed\r\n     * 2 = only authenticated provisioning allowed\r\n     * 3 = both provisioning modes allowed (default)\r\n     */\r\n    uint8_t fast_prov;\r\n#endif\r\n#endif\r\n#endif\r\n#elif (CONFIG_WPA2_ENTP)\r\n    /** TLS client cert configuration */\r\n    wm_mbedtls_cert_t tls_cert;\r\n    /** mbedtls_ssl_config handle */\r\n    mbedtls_ssl_config *wlan_ctx;\r\n    /** mbedtls_ssl_context handle */\r\n    mbedtls_ssl_context *wlan_ssl;\r\n#endif\r\n#if CONFIG_WPA_SUPP_DPP\r\n    unsigned char *dpp_connector;\r\n    unsigned char *dpp_c_sign_key;\r\n    unsigned char *dpp_net_access_key;\r\n#endif\r\n};\r\n\r\n/** Configuration for Wi-Fi scan */\r\n#define MAX_CHANNEL_LIST 6\r\n/** This structure is used to configure Wi-Fi scan parameters */\r\nstruct wifi_scan_params_t\r\n{\r\n    /** BSSID (basic servivce set ID) */\r\n    uint8_t *bssid;\r\n    /** SSID (service set ID) */\r\n    char *ssid;\r\n    /** Channel list */\r\n    int channel[MAX_CHANNEL_LIST];\r\n    /** BSS (basic service set) type.\r\n    1: Infrastructure BSS,\r\n    2: Indenpent BSS.\r\n    */\r\n    IEEEtypes_Bss_t bss_type;\r\n    /** Time for scan duration */\r\n    int scan_duration;\r\n    /** split scan delay */\r\n    int split_scan_delay;\r\n};\r\n\r\n#if CONFIG_WIFI_GET_LOG\r\n/** Wi-Fi firmware stat from \\ref wifi_pkt_stats_t\r\n */\r\ntypedef wifi_pkt_stats_t wlan_pkt_stats_t;\r\n#endif\r\n\r\n/** Configuration for Wi-Fi scan channel list from\r\n * \\ref wifi_scan_channel_list_t\r\n */\r\ntypedef wifi_scan_channel_list_t wlan_scan_channel_list_t;\r\n/** Configuration for Wi-Fi scan parameters v2 from\r\n * \\ref wifi_scan_params_v2_t\r\n */\r\ntypedef wifi_scan_params_v2_t wlan_scan_params_v2_t;\r\n\r\n\r\n/** Configuration for Wi-Fi calibration data from\r\n * \\ref wifi_cal_data_t\r\n */\r\ntypedef wifi_cal_data_t wlan_cal_data_t;\r\n\r\n#if CONFIG_AUTO_RECONNECT\r\n/** Configuration for auto reconnect configuration from\r\n * \\ref wifi_auto_reconnect_config_t\r\n */\r\ntypedef wifi_auto_reconnect_config_t wlan_auto_reconnect_config_t;\r\n#endif\r\n\r\n/** Configuration for memory efficient filters in Wi-Fi firmware from\r\n * \\ref wifi_flt_cfg_t\r\n */\r\ntypedef wifi_flt_cfg_t wlan_flt_cfg_t;\r\n\r\n/** Configuration for wowlan pattern parameters from\r\n * \\ref wifi_wowlan_ptn_cfg_t\r\n */\r\ntypedef wifi_wowlan_ptn_cfg_t wlan_wowlan_ptn_cfg_t;\r\n/** Configuration for TCP keep alive parameters from\r\n * \\ref wifi_tcp_keep_alive_t\r\n */\r\ntypedef wifi_tcp_keep_alive_t wlan_tcp_keep_alive_t;\r\n\r\n#if CONFIG_CLOUD_KEEP_ALIVE\r\n/** Configuration for cloud keep alive parameters from\r\n * \\ref wifi_cloud_keep_alive_t\r\n */\r\ntypedef wifi_cloud_keep_alive_t wlan_cloud_keep_alive_t;\r\n#endif\r\n\r\n/** Configuration for TX rate and get data rate from\r\n * \\ref wifi_ds_rate\r\n */\r\ntypedef wifi_ds_rate wlan_ds_rate;\r\n/** Configuration for ED MAC Control parameters from\r\n * \\ref wifi_ed_mac_ctrl_t\r\n */\r\ntypedef wifi_ed_mac_ctrl_t wlan_ed_mac_ctrl_t;\r\n/** Configuration for band from\r\n * \\ref wifi_bandcfg_t\r\n */\r\ntypedef wifi_bandcfg_t wlan_bandcfg_t;\r\n/** Configuration for CW mode parameters from\r\n * \\ref wifi_cw_mode_ctrl_t\r\n */\r\ntypedef wifi_cw_mode_ctrl_t wlan_cw_mode_ctrl_t;\r\n/** Configuration for channel list from\r\n * \\ref wifi_chanlist_t\r\n */\r\ntypedef wifi_chanlist_t wlan_chanlist_t;\r\n/** Configuration for TX power Limit from\r\n * \\ref wifi_txpwrlimit_t\r\n */\r\ntypedef wifi_txpwrlimit_t wlan_txpwrlimit_t;\r\n#ifdef SD8801\r\n/** Statistic of External Coex from\r\n * \\ref wifi_ext_coex_config_t\r\n */\r\ntypedef wifi_ext_coex_stats_t wlan_ext_coex_stats_t;\r\n/** Configuration for external Coex from\r\n * \\ref wifi_ext_coex_config_t\r\n */\r\ntypedef wifi_ext_coex_config_t wlan_ext_coex_config_t;\r\n#endif\r\n\r\n#if CONFIG_11AX\r\n/** Configuration for RU TX power limit from\r\n * \\ref wifi_rutxpwrlimit_t\r\n */\r\ntypedef wifi_rutxpwrlimit_t wlan_rutxpwrlimit_t;\r\n/** Configuration for 802.11ax capabilities\r\n * \\ref wifi_11ax_config_t\r\n */\r\ntypedef wifi_11ax_config_t wlan_11ax_config_t;\r\n#if CONFIG_11AX_TWT\r\n/** Configuration for TWT setup\r\n * \\ref wifi_twt_setup_config_t\r\n */\r\ntypedef wifi_twt_setup_config_t wlan_twt_setup_config_t;\r\n/** Configuration for TWT teardown\r\n * \\ref wifi_twt_teardown_config_t\r\n */\r\ntypedef wifi_twt_teardown_config_t wlan_twt_teardown_config_t;\r\n/** Configuration for Broadcast TWT setup\r\n * \\ref wifi_btwt_config_t\r\n */\r\ntypedef wifi_btwt_config_t wlan_btwt_config_t;\r\n/** Configuration for TWT report\r\n * \\ref wifi_twt_report_t\r\n */\r\ntypedef wifi_twt_report_t wlan_twt_report_t;\r\n#endif /* CONFIG_11AX_TWT */\r\n#if CONFIG_MMSF\r\n#define WLAN_AMPDU_DENSITY 0x30\r\n#define WLAN_AMPDU_MMSF    0x6\r\n#endif\r\n#endif\r\n#if CONFIG_WIFI_CLOCKSYNC\r\n/** Configuration for clock sync GPIO TSF latch\r\n * \\ref wifi_clock_sync_gpio_tsf_t\r\n */\r\ntypedef wifi_clock_sync_gpio_tsf_t wlan_clock_sync_gpio_tsf_t;\r\n/** Configuration for TSF info\r\n * \\ref wifi_tsf_info_t\r\n */\r\ntypedef wifi_tsf_info_t wlan_tsf_info_t;\r\n#endif\r\n\r\n#if CONFIG_MULTI_CHAN\r\n/** Configuration for multi-channel switch\r\n * \\ref wifi_drcs_cfg_t\r\n */\r\ntypedef wifi_drcs_cfg_t wlan_drcs_cfg_t;\r\n#endif\r\n\r\ntypedef wifi_mgmt_frame_t wlan_mgmt_frame_t;\r\n\r\n\r\n#if CONFIG_CSI\r\n/** Configuration for CSI config params from\r\n * \\ref wifi_csi_config_params_t\r\n */\r\ntypedef wifi_csi_config_params_t wlan_csi_config_params_t;\r\n#endif\r\n\r\n#if CONFIG_NET_MONITOR\r\n/** Configuration for net monitor from\r\n * \\ref wifi_net_monitor_t\r\n */\r\ntypedef wifi_net_monitor_t wlan_net_monitor_t;\r\n#endif\r\n\r\n#if (CONFIG_WIFI_IND_RESET) && (CONFIG_WIFI_IND_DNLD)\r\n/** Configuration for GPIO independent reset\r\n * \\ref wifi_indrst_cfg_t\r\n */\r\ntypedef wifi_indrst_cfg_t wlan_indrst_cfg_t;\r\n#endif\r\n\r\n#if CONFIG_11AX\r\n/** Configuration for TX rate setting from\r\n * \\ref txrate_setting\r\n */\r\ntypedef txrate_setting wlan_txrate_setting;\r\n#endif\r\n\r\n/** Configuration for RSSI information\r\n * \\ref wifi_rssi_info_t\r\n */\r\ntypedef wifi_rssi_info_t wlan_rssi_info_t;\r\n\r\n#if CONFIG_EXTERNAL_COEX_PTA\r\n#define MIN_SAMP_TIMING              20\r\n#define MAX_SAMP_TIMING              200\r\n#define COEX_PTA_FEATURE_ENABLE      1\r\n#define COEX_PTA_FEATURE_DISABLE     0\r\n#define POL_GRANT_PIN_HIGH           0\r\n#define POL_GRANT_PIN_LOW            1\r\n#define STATE_INPUT_DISABLE          0\r\n#define STATE_PTA_PIN                1\r\n#define STATE_PRIORITY_PIN           2\r\n#define SAMPLE_TIMING_VALUE          100\r\n#define EXT_COEX_PTA_INTERFACE       5\r\n#define EXT_COEX_WCI2_INTERFACE      6\r\n#define EXT_COEX_WCI2_GPIO_INTERFACE 7\r\n\r\ntypedef struct _external_coex_pta_cfg\r\n{\r\n    /** Enable: 0x01, Disable: 0x00 */\r\n    t_u8 enabled;\r\n    /** Enable extended Wi-Fi and Bluetooth LE arbitration: 0x01, disable : 0x00 */\r\n    t_u8 ext_WifiBtArb;\r\n    /** Active high: 0x00, Active low: 0x01 */\r\n    t_u8 polGrantPin;\r\n    /**  Enable PriPtaInt: 0x01, Disable PriPtaInt: 0x00 */\r\n    t_u8 enable_PriPtaInt;\r\n    /** State input disable: 0x00, State info is from state pin: 0x01, State info is sampled on priority pin: 0x02 */\r\n    t_u8 enable_StatusFromPta;\r\n    /** Timing to sample Priority bit */\r\n    t_u16 setPriSampTiming;\r\n    /** Timing to sample TX/RX info */\r\n    t_u16 setStateInfoSampTiming;\r\n    /** Enable external traffic TX/RX Priority: 0x01, Disable external traffic TX/RX Priority: 0x00 */\r\n    t_u8 extRadioTrafficPrio;\r\n    /** Enable wci-2 interface: 0x01, Disable wci-2 interface: 0x00 */\r\n    t_u8 extCoexHwIntWci2;\r\n} ext_coex_pta_cfg;\r\n#endif\r\n\r\n/**\r\n* Check whether the scan duration is valid.\r\n*\r\n* \\param[in] scan duration time\r\n*\r\n* \\return 0 if the time is valid, else return -1.\r\n*/\r\nint verify_scan_duration_value(int scan_duration);\r\n\r\n/**\r\n* Check whether the scan channel is valid.\r\n*\r\n* \\param[in] channel\r\n*\r\n* \\return 0 if the channel is valid, else return -1.\r\n*/\r\nint verify_scan_channel_value(int channel);\r\n\r\n/**\r\n* Check whether the scan delay time is valid.\r\n*\r\n* \\param[in] delay, the scan delay time.\r\n*\r\n* \\return 0 if the time is valid, else return -1.\r\n*/\r\nint verify_split_scan_delay(int delay);\r\n\r\n/**\r\n* Set scan parameters.\r\n*\r\n* \\param[in] wifi_scan_params Wi-Fi scan parameter structure pointer.\r\n*\r\n* \\return WM_SUCCESS.\r\n*/\r\nint set_scan_params(struct wifi_scan_params_t *wifi_scan_params);\r\n\r\n/**\r\n* Get scan parameters.\r\n*\r\n* \\param[out] wifi_scan_params Wi-Fi scan parameter structure pointer.\r\n*\r\n* \\return WM_SUCCESS.\r\n*/\r\nint get_scan_params(struct wifi_scan_params_t *wifi_scan_params);\r\n\r\n/**\r\n* Get current RSSI value.\r\n*\r\n* \\param[out] rssi, RSSI pointer.\r\n*\r\n* \\return WM_SUCCESS.\r\n*/\r\nint wlan_get_current_rssi(short *rssi);\r\n\r\n/**\r\n* Get current noise floor.\r\n*\r\n* \\return noise floor value .\r\n*/\r\nint wlan_get_current_nf(void);\r\n\r\n/** Address types to be used by the element wlan_ip_config.addr_type below\r\n */\r\nenum address_types\r\n{\r\n    /** static IP address */\r\n    ADDR_TYPE_STATIC = 0,\r\n    /** Dynamic  IP address*/\r\n    ADDR_TYPE_DHCP = 1,\r\n    /** Link level address */\r\n    ADDR_TYPE_LLA = 2,\r\n};\r\n\r\n/** This data structure represents an IPv4 address */\r\nstruct ipv4_config\r\n{\r\n    /** Set to \\ref ADDR_TYPE_DHCP to use DHCP to obtain the IP address or\r\n     *  \\ref ADDR_TYPE_STATIC to use a static IP. In case of static IP\r\n     *  address ip, gw, netmask and dns members should be specified. When\r\n     *  using DHCP, the ip, gw, netmask and dns are overwritten by the\r\n     *  values obtained from the DHCP server. They should be zeroed out if\r\n     *  not used. */\r\n    enum address_types addr_type;\r\n    /** The system's IP address in network order. */\r\n    unsigned address;\r\n    /** The system's default gateway in network order. */\r\n    unsigned gw;\r\n    /** The system's subnet mask in network order. */\r\n    unsigned netmask;\r\n    /** The system's primary dns server in network order. */\r\n    unsigned dns1;\r\n    /** The system's secondary dns server in network order. */\r\n    unsigned dns2;\r\n};\r\n\r\n#if CONFIG_IPV6\r\n/** This data structure represents an IPv6 address */\r\nstruct ipv6_config\r\n{\r\n    /** The system's IPv6 address in network order. */\r\n    unsigned address[4];\r\n    /** The address type: linklocal, site-local or global. */\r\n    unsigned char addr_type;\r\n    /** The state of IPv6 address (Tentative, Preferred, etc). */\r\n    unsigned char addr_state;\r\n};\r\n#endif\r\n\r\n/** Network IP configuration.\r\n *\r\n *  This data structure represents the network IP configuration\r\n *  for IPv4 as well as IPv6 addresses\r\n */\r\nstruct wlan_ip_config\r\n{\r\n#if CONFIG_IPV6\r\n    /** The network IPv6 address configuration that should be\r\n     * associated with this interface. */\r\n    struct ipv6_config ipv6[CONFIG_MAX_IPV6_ADDRESSES];\r\n    /** The network IPv6 valid addresses count */\r\n    size_t ipv6_count;\r\n#endif\r\n    /** The network IPv4 address configuration that should be\r\n     * associated with this interface. */\r\n    struct ipv4_config ipv4;\r\n};\r\n\r\n/** Wi-Fi network profile\r\n *\r\n *  This data structure represents a Wi-Fi network profile. It consists of an\r\n *  arbitrary name, Wi-Fi configuration, and IP address configuration.\r\n *\r\n *  Every network profile is associated with one of the two interfaces. The\r\n *  network profile can be used for the station interface (i.e. to connect to an\r\n *  Access Point) by setting the role field to \\ref\r\n *  WLAN_BSS_ROLE_STA. The network profile can be used for the UAP\r\n *  interface (i.e. to start a network of our own.) by setting the mode field to\r\n *  \\ref WLAN_BSS_ROLE_UAP.\r\n *\r\n *  If the mode field is \\ref WLAN_BSS_ROLE_STA, either of the SSID or\r\n *  BSSID fields are used to identify the network, while the other members like\r\n *  channel and security settings characterize the network.\r\n *\r\n *  If the mode field is \\ref WLAN_BSS_ROLE_UAP, the SSID, channel and security\r\n *  fields are used to define the network to be started.\r\n *\r\n *  In both the above cases, the address field is used to determine the type of\r\n *  address assignment to be used for this interface.\r\n */\r\nstruct wlan_network\r\n{\r\n#if CONFIG_WPA_SUPP\r\n    /** Identifier for network profile */\r\n    int id;\r\n    /** WPS netwrok flag. */\r\n    int wps_network;\r\n#endif\r\n    /** The name of this network profile. Each network profile that is\r\n     *  added to the Wi-Fi connection manager should have a unique name. */\r\n    char name[WLAN_NETWORK_NAME_MAX_LENGTH + 1];\r\n    /** The network SSID, represented as a C string of up to 32 characters\r\n     *  in length.\r\n     *  If this profile is used in the UAP mode, this field is\r\n     *  used as the SSID of the network.\r\n     *  If this profile is used in the station mode, this field is\r\n     *  used to identify the network. Set the first byte of the SSID to NULL\r\n     *  (a 0-length string) to use only the BSSID to find the network.\r\n     */\r\n    char ssid[IEEEtypes_SSID_SIZE + 1];\r\n    /** The network BSSID, represented as a 6-byte array.\r\n     *  If this profile is used in the UAP mode, this field is\r\n     *  ignored.\r\n     *  If this profile is used in the station mode, this field is\r\n     *  used to identify the network. Set all 6 bytes to 0 to use any BSSID,\r\n     *  in which case only the SSID is used to find the network.\r\n     */\r\n    char bssid[IEEEtypes_ADDRESS_SIZE];\r\n    /** The channel for this network.\r\n     *\r\n     *  If this profile is used in UAP mode, this field\r\n     *  specifies the channel to start the UAP interface on. Set this\r\n     *  to 0 for auto channel selection.\r\n     *\r\n     *  If this profile is used in the station mode, this constrains the\r\n     *  channel on which the network to connect should be present. Set this\r\n     *  to 0 to allow the network to be found on any channel. */\r\n    unsigned int channel;\r\n    /** The secondary channel offset **/\r\n    uint8_t sec_channel_offset;\r\n    /** The ACS (auto channel selection) band if set channel to 0. */\r\n    uint16_t acs_band;\r\n    /** RSSI (received signal strength indicator) value. */\r\n    int rssi;\r\n#if CONFIG_SCAN_WITH_RSSIFILTER\r\n    /** RSSI threshold */\r\n    short rssi_threshold;\r\n#endif\r\n#if CONFIG_WPA_SUPP\r\n    /** HT capabilities */\r\n    unsigned short ht_capab;\r\n#if CONFIG_11AC\r\n    /** VHT capabilities */\r\n    unsigned int vht_capab;\r\n    /** VHT bandwidth */\r\n    unsigned char vht_oper_chwidth;\r\n#endif\r\n#if CONFIG_11AX\r\n    /** HE bandwidth */\r\n    unsigned char he_oper_chwidth;\r\n#endif\r\n#endif\r\n    /** BSS type */\r\n    enum wlan_bss_type type;\r\n    /** The network Wi-Fi mode enum wlan_bss_role. Set this\r\n     *  to specify what type of Wi-Fi network mode to use.\r\n     *  This can either be \\ref WLAN_BSS_ROLE_STA for use in\r\n     *  the station mode, or it can be \\ref WLAN_BSS_ROLE_UAP\r\n     *  for use in the UAP mode. */\r\n    enum wlan_bss_role role;\r\n    /** The network security configuration specified by struct\r\n     * wlan_network_security for the network. */\r\n    struct wlan_network_security security;\r\n    /** The network IP address configuration specified by struct\r\n     * wlan_ip_config that should be associated with this interface. */\r\n    struct wlan_ip_config ip;\r\n#if CONFIG_WPA2_ENTP\r\n    /** WPA2 Enterprise identity, the max can be upto 256 characters */\r\n    char identity[IDENTITY_MAX_LENGTH];\r\n#if CONFIG_PEAP_MSCHAPV2\r\n    char anonymous_identity[IDENTITY_MAX_LENGTH];\r\n    /** password string */\r\n    char password[PASSWORD_MAX_LENGTH];\r\n#endif\r\n#endif\r\n\r\n    /* Private Fields */\r\n\r\n    /**\r\n     * If set to 1, the ssid field contains the specific SSID for this\r\n     * network.\r\n     * the Wi-Fi connection manager can only connect to networks whose SSID\r\n     * matches.  If set to 0, the ssid field contents are not used when\r\n     * deciding whether to connect to a network, the BSSID field is used\r\n     * instead and any network whose BSSID matches is accepted.\r\n     *\r\n     * This field can be set to 1 if the network is added with the SSID\r\n     * specified (not an empty string), otherwise it is set to 0.\r\n     */\r\n    unsigned ssid_specific : 1;\r\n#if CONFIG_DRIVER_OWE\r\n    /**\r\n     * If set to 1, the ssid field contains the transitional SSID for this\r\n     * network.\r\n     */\r\n    unsigned trans_ssid_specific : 1;\r\n#endif\r\n    /** If set to 1, the bssid field contains the specific BSSID for this\r\n     *  network. The Wi-Fi connection manager can not connect to any other\r\n     *  network with the same SSID unless the BSSID matches.  If set to 0, the\r\n     *  Wi-Fi connection manager can connect to any network whose SSID matches.\r\n     *\r\n     *  This field set to 1 if the network is added with the BSSID\r\n     *  specified (not set to all zeroes), otherwise it is set to 0. */\r\n    unsigned bssid_specific : 1;\r\n    /**\r\n     * If set to 1, the channel field contains the specific channel for this\r\n     * network. The Wi-Fi connection manager can not look for this network on\r\n     * any other channel. If set to 0, the Wi-Fi connection manager can look\r\n     * for this network on any available channel.\r\n     *\r\n     * This field set to 1 if the network is added with the channel\r\n     * specified (not set to 0), otherwise it is set to 0. */\r\n    unsigned channel_specific : 1;\r\n    /**\r\n     * If set to 0, any security that matches is used. This field is\r\n     * internally set when the security type parameter above is set to\r\n     * WLAN_SECURITY_WILDCARD.\r\n     */\r\n    unsigned security_specific : 1;\r\n#if CONFIG_WPS2\r\n    /** This indicates this network is used as an internal network for\r\n     * WPS */\r\n    unsigned wps_specific : 1;\r\n#endif\r\n\r\n    /** The network supports 802.11N. (For internal use only) */\r\n    unsigned dot11n : 1;\r\n#if CONFIG_11AC\r\n    /** The network supports 802.11AC. (For internal use only) */\r\n    unsigned dot11ac : 1;\r\n#endif\r\n#if CONFIG_11AX\r\n    /** The network supports 802.11AX. (For internal use only) */\r\n    unsigned dot11ax : 1;\r\n#endif\r\n\r\n#if CONFIG_11R\r\n    /** Mobility Domain ID */\r\n    uint16_t mdid;\r\n    /** The network uses FT 802.1x security (For internal use only)*/\r\n    unsigned ft_1x : 1;\r\n    /** The network uses FT PSK security (For internal use only)*/\r\n    unsigned ft_psk : 1;\r\n    /** The network uses FT SAE security (For internal use only)*/\r\n    unsigned ft_sae : 1;\r\n#endif\r\n#if CONFIG_DRIVER_OWE\r\n    /** OWE Transition mode */\r\n    unsigned int owe_trans_mode;\r\n    /** The network transitional SSID, represented as a C string of up to 32 characters\r\n     *  in length.\r\n     *\r\n     * This field is used internally.\r\n     */\r\n    char trans_ssid[IEEEtypes_SSID_SIZE + 1];\r\n    /** Transitional SSID length\r\n     *\r\n     * This field is used internally.\r\n     */\r\n    unsigned int trans_ssid_len;\r\n#endif\r\n    /** Beacon period of associated BSS */\r\n    uint16_t beacon_period;\r\n    /** DTIM period of associated BSS */\r\n    uint8_t dtim_period;\r\n#if CONFIG_WIFI_CAPA\r\n    /** Wi-Fi capabilities of UAP network 802.11n, 802.11ac or/and 802.11ax */\r\n    uint8_t wlan_capa;\r\n#endif\r\n#if CONFIG_11V\r\n    /** BTM mode */\r\n    uint8_t btm_mode;\r\n    /** BSS transition support (For internal use only) */\r\n    bool bss_transition_supported;\r\n#endif\r\n#if CONFIG_11K\r\n    /** Neighbor report support (For internal use only) */\r\n    bool neighbor_report_supported;\r\n#endif\r\n};\r\n\r\n/** This structure is for IEEE PS (power save) configuration */\r\nstruct wlan_ieeeps_config\r\n{\r\n    /** PS null interval in seconds */\r\n    t_u32 ps_null_interval;\r\n    /** Multiple DTIM interval */\r\n    t_u32 multiple_dtim_interval;\r\n    /** Listen interval */\r\n    t_u32 listen_interval;\r\n    /** Adhoc awake period */\r\n    t_u32 adhoc_awake_period;\r\n    /** Beacon miss timeout in milliseconds */\r\n    t_u32 bcn_miss_timeout;\r\n    /** Delay to PS in milliseconds */\r\n    t_s32 delay_to_ps;\r\n    /** Power save mode,\r\n    0: Active mode,\r\n    1: IEEE power save mode,\r\n    2: Deep sleep power save mode,\r\n    3: IEEE and deep sleep power save mode,\r\n    4: WNM power save mode,\r\n    5: WNM and deep sleep power save mode. */\r\n    t_u32 ps_mode;\r\n};\r\n\r\n#if CONFIG_WIFI_TX_PER_TRACK\r\n/** TX per tracking structure\r\n * Driver sets TX per tracking statistic to FW.\r\n * FW can check TX packet error rate periodically and\r\n * report per to host if per is high.\r\n */\r\nstruct wlan_tx_pert_info\r\n{\r\n    /** Enable/Disable TX per tracking */\r\n    t_u8 tx_pert_check;\r\n    /** Check period (unit sec) */\r\n    t_u8 tx_pert_check_peroid;\r\n    /** (Fail TX packet)/(Total TX packet) ratio (unit 10%)\r\n     * default: 5\r\n     */\r\n    t_u8 tx_pert_check_ratio;\r\n    /** A watermark of check number (default 5) */\r\n    t_u16 tx_pert_check_num;\r\n};\r\n#endif\r\n#if defined(RW610)\r\ntypedef enum\r\n{\r\n    CLI_DISABLE_WIFI,\r\n    CLI_ENABLE_WIFI,\r\n    CLI_RESET_WIFI,\r\n} cli_reset_option;\r\n#endif\r\n\r\nenum wlan_mon_task_event\r\n{\r\n    HOST_SLEEP_HANDSHAKE = 1,\r\n    HOST_SLEEP_EXIT,\r\n    WIFI_RECOVERY_REQ,\r\n};\r\n\r\n#if CONFIG_HOST_SLEEP\r\nenum wlan_hostsleep_state\r\n{\r\n    HOST_SLEEP_DISABLE,\r\n    HOST_SLEEP_ONESHOT,\r\n    HOST_SLEEP_PERIODIC,\r\n};\r\n\r\n#define WLAN_HOSTSLEEP_SUCCESS    1\r\n#define WLAN_HOSTSLEEP_IN_PROCESS 2\r\n#define WLAN_HOSTSLEEP_FAIL       3\r\n#endif\r\n\r\n#if CONFIG_TX_RX_HISTOGRAM\r\nstruct wlan_txrx_histogram_info\r\n{\r\n    /**  Enable or disable  */\r\n    t_u8 enable;\r\n    /** Choose to get TX, RX or both */\r\n    t_u16 action;\r\n};\r\n\r\n#define FLAG_TX_HISTOGRAM       0x01\r\n#define FLAG_RX_HISTOGRAM       0x02\r\n#define DISABLE_TX_RX_HISTOGRAM 0x00\r\n#define ENABLE_TX_RX_HISTOGRAM  0x01\r\n#define GET_TX_RX_HISTOGRAM     0x02\r\n\r\n/** Sum of TX packets for HT (802.11n high throughput) rate. */\r\ntypedef struct _tx_pkt_ht_rate_info\r\n{\r\n    /** Sum of TX packets for HT rate. Array index represents MSC0~MCS15,\r\n    the following array indexs have the same effect. */\r\n    t_u32 htmcs_txcnt[16];\r\n    /** Sum of TX short GI (guard interval) packets for HT rate. */\r\n    t_u32 htsgi_txcnt[16];\r\n    /** Sum of TX STBC (space time block code) packets for HT rate. */\r\n    t_u32 htstbcrate_txcnt[16];\r\n} tx_pkt_ht_rate_info;\r\n\r\n/** Sum of TX packets for VHT (802.11ac very high throughput) rate. */\r\ntypedef struct _tx_pkt_vht_rate_info\r\n{\r\n\t/** Sum of TX packets for VHT rate. Array index represents MSC0~MCS9,\r\n\tthe following array indexs have the same effect. */\r\n    t_u32 vhtmcs_txcnt[10];\r\n\t/** Sum of TX short GI packets for HT mode. */\r\n    t_u32 vhtsgi_txcnt[10];\r\n\t/** Sum of TX STBC (space time block code) packets for VHT mode. */\r\n    t_u32 vhtstbcrate_txcnt[10];\r\n} tx_pkt_vht_rate_info;\r\n\r\n/** Sum of TX packets for HE (802.11ax high efficiency) rate. */\r\ntypedef struct _tx_pkt_he_rate_info\r\n{\r\n    /** Sum of TX packets for HE rate. Array index represents MSC0~MCS11,\r\n\tthe following array indexs have the same effect. */\r\n    t_u32 hemcs_txcnt[12];\r\n    /** Sum of TX STBC (space time block code) packets for HE rate. */\r\n    t_u32 hestbcrate_txcnt[12];\r\n} tx_pkt_he_rate_info;\r\n\r\n/** Sum of TX packets. */\r\ntypedef struct _tx_pkt_rate_info\r\n{\r\n    /** Sum of TX NSS (N*N MIMO spatial stream) packets.\r\n    nss_txcnt[0] is for NSS 1,\r\n    nss_txcnt[1] is for NSS 2.\r\n    */\r\n    t_u32 nss_txcnt[2];\r\n    /** Sum of TX packets for 3 bandwidths.\r\n    bandwidth_txcnt[0] is for 20MHz,\r\n    bandwidth_txcnt[1] is for 40MHz,\r\n    bandwidth_txcnt[2] is for 80MHz.\r\n    */\r\n    t_u32 bandwidth_txcnt[3];\r\n    /** Sum of RX packets for 4 preamble format types.\r\n    preamble_txcnt[0] is for preamble format 0,\r\n    preamble_txcnt[1] is for preamble format 1,\r\n    preamble_txcnt[2] is for preamble format 2,\r\n    preamble_txcnt[3] is for preamble format 3,\r\n    */\r\n    t_u32 preamble_txcnt[4];\r\n\t/** Sum of TX LDPC (low density parity check) packets. */\r\n    t_u32 ldpc_txcnt;\r\n    /** Sum of TX RTS (require to send) packets */\r\n    t_u32 rts_txcnt;\r\n    /** RSSI of ACK packet */\r\n    t_s32 ack_RSSI;\r\n} tx_pkt_rate_info;\r\n\r\n/** Sum of RX packets for HT (802.11n high throughput) rate. */\r\ntypedef struct _rx_pkt_ht_rate_info\r\n{\r\n    /** Sum of RX packets for HT rate. Array index represents MSC0~MCS15,\r\n    the following array indexs have the same effect.\r\n    */\r\n    t_u32 htmcs_rxcnt[16];\r\n\t/** Sum of TX short GI (guard interval) packets for HT rate. */\r\n    t_u32 htsgi_rxcnt[16];\r\n\t/** Sum of TX STBC (space time block code) packets for HT rate. */\r\n    t_u32 htstbcrate_rxcnt[16];\r\n} rx_pkt_ht_rate_info;\r\n\r\n/** Sum of RX packets for VHT (802.11ac very high throughput) rate. */\r\ntypedef struct _rx_pkt_vht_rate_info\r\n{\r\n\t/** Sum of RX packets for VHT rate. Array index represents MSC0~MCS9,\r\n\tthe following array indexs have the same effect. */\r\n    t_u32 vhtmcs_rxcnt[10];\r\n    /** Sum of RX short GI (guard interval) packets for VHT rate. */\r\n    t_u32 vhtsgi_rxcnt[10];\r\n\t/** Sum of RX STBC (space time block code) packets for VHT rate. */\r\n    t_u32 vhtstbcrate_rxcnt[10];\r\n} rx_pkt_vht_rate_info;\r\n\r\n/** Sum of RX packets for HE (802.11ax high efficiency) rate. */\r\ntypedef struct _rx_pkt_he_rate_info\r\n{\r\n    /** Sum of TX packets for HE rate. Array index represents MSC0~MCS11,\r\n\tthe following array indexs have the same effect. */\r\n    t_u32 hemcs_rxcnt[12];\r\n    /** Sum of TX STBC (space time block code) packets for HE rate. */\r\n    t_u32 hestbcrate_rxcnt[12];\r\n} rx_pkt_he_rate_info;\r\n\r\n/** Sum of RX packets. */\r\ntypedef struct _rx_pkt_rate_info\r\n{\r\n    /** Sum of RX NSS (N*N MIMO spatial stream) packets.\r\n    nss_txcnt[0] is for NSS 1,\r\n    nss_txcnt[1] is for NSS 2.\r\n    */\r\n    t_u32 nss_rxcnt[2];\r\n    /** Sum of received packets for all STBC rates. */\r\n    t_u32 nsts_rxcnt;\r\n    /** Sum of received packets for 3 bandwith types.\r\n    bandwidth_rxcnt[0] is for 20MHz,\r\n    bandwidth_rxcnt[1] is for 40MHz,\r\n    bandwidth_rxcnt[2] is for 80MHz.\r\n    */\r\n    t_u32 bandwidth_rxcnt[3];\r\n    /** Sum of received packets for 4 preamble format types.\r\n    preamble_txcnt[0] is for preamble format 0,\r\n    preamble_txcnt[1] is for preamble format 1,\r\n    preamble_txcnt[2] is for preamble format 2,\r\n    preamble_txcnt[3] is for preamble format 3,\r\n    preamble_txcnt[4] and preamble_txcnt[5] are as reserved.\r\n    */\r\n    t_u32 preamble_rxcnt[6];\r\n    /** Sum of packets for TX LDPC packets. */\r\n    t_u32 ldpc_txbfcnt[2];\r\n    /** Average RSSI */\r\n    t_s32 rssi_value[2];\r\n    /** RSSI value of path A */\r\n    t_s32 rssi_chain0[4];\r\n    /** RSSI value of path B */\r\n    t_s32 rssi_chain1[4];\r\n} rx_pkt_rate_info;\r\n#endif\r\n\r\n#if CONFIG_TX_AMPDU_PROT_MODE\r\n#define TX_AMPDU_RTS_CTS            0\r\n#define TX_AMPDU_CTS_2_SELF         1\r\n#define TX_AMPDU_DISABLE_PROTECTION 2\r\n#define TX_AMPDU_DYNAMIC_RTS_CTS    3\r\n\r\n/** Set protection mode for the transmit AMPDU packet */\r\ntypedef struct _tx_ampdu_prot_mode_para\r\n{\r\n    /**\r\n    mode,\r\n    0: set RTS/CTS mode,\r\n    1: set CTS to self mode,\r\n    2: disable protection mode,\r\n    3: set dynamic RTS/CTS mode.\r\n    */\r\n    int mode;\r\n} tx_ampdu_prot_mode_para;\r\n#endif\r\n\r\ntypedef wifi_uap_client_disassoc_t wlan_uap_client_disassoc_t;\r\n\r\n#if CONFIG_INACTIVITY_TIMEOUT_EXT\r\ntypedef wifi_inactivity_to_t wlan_inactivity_to_t;\r\n#endif\r\n\r\n/* Wi-Fi connection manager API */\r\n/** Initialize Wi-Fi driver and create the Wi-Fi driver thread.\r\n *\r\n * \\param[in]  fw_start_addr Start address of the Wi-Fi firmware.\r\n * \\param[in]  size Size of the Wi-Fi firmware.\r\n *\r\n * \\return WM_SUCCESS if the Wi-Fi connection manager service has\r\n *         initialized successfully.\r\n * \\return Negative value if initialization failed.\r\n */\r\nint wlan_init(const uint8_t *fw_start_addr, const size_t size);\r\n\r\n/** Start the Wi-Fi connection manager service.\r\n *\r\n * This function starts the Wi-Fi connection manager.\r\n *\r\n * \\note The status of the Wi-Fi connection manager is notified asynchronously\r\n * through the callback, \\a cb, with a WLAN_REASON_INITIALIZED event\r\n * (if initialization succeeded) or WLAN_REASON_INITIALIZATION_FAILED\r\n * (if initialization failed).\r\n * If the Wi-Fi connection manager fails to initialize, the caller should\r\n * stop Wi-Fi connection manager via wlan_stop() and try wlan_start() again.\r\n *\r\n * \\param[in] cb A pointer to a callback function that handles Wi-Fi events. All\r\n * further WLCMGR events can be notified in this callback. Refer to enum\r\n * \\ref wlan_event_reason for the various events for which this callback is called.\r\n *\r\n * \\return WM_SUCCESS if the Wi-Fi connection manager service has started\r\n *         successfully.\r\n * \\return -WM_E_INVAL if the \\a cb pointer is NULL.\r\n * \\return -WM_FAIL if an internal error occurred.\r\n * \\return WLAN_ERROR_STATE if the Wi-Fi connection manager is already running.\r\n */\r\nint wlan_start(int (*cb)(enum wlan_event_reason reason, void *data));\r\n\r\n/** Stop the Wi-Fi connection manager service.\r\n *\r\n *  This function stops the Wi-Fi connection manager, causing station interface\r\n *  to disconnect from the currently connected network and stop the\r\n * UAP interface.\r\n *\r\n *  \\return WM_SUCCESS if the Wi-Fi connection manager service has been\r\n *          stopped successfully.\r\n *  \\return WLAN_ERROR_STATE if the Wi-Fi connection manager was not\r\n *          running.\r\n */\r\nint wlan_stop(void);\r\n\r\n/** Deinitialize Wi-Fi driver, send shutdown command to Wi-Fi firmware\r\n *  and delete the Wi-Fi driver thread.\r\n *  \\param action Additional action to be taken with deinit\r\n *\t\t\tWLAN_ACTIVE: no action to be taken\r\n */\r\nvoid wlan_deinit(int action);\r\n\r\n#if CONFIG_WPS2\r\n/** Generate valid pin code for WPS session.\r\n *\r\n *  This function generate pin for WPS pin session.\r\n *\r\n * \\param[out]  pin A pointer to WPS pin to be generated.\r\n */\r\nvoid wlan_wps_generate_pin(uint32_t *pin);\r\n\r\n/** Start WPS pin session.\r\n *\r\n *  This function starts WPS pin session.\r\n *\r\n * \\param[in]  pin Pin for WPS session.\r\n *\r\n * \\return WM_SUCCESS if the pin entered is valid.\r\n * \\return -WM_FAIL if invalid pin entered.\r\n */\r\nint wlan_start_wps_pin(uint32_t pin);\r\n\r\n/** Start WPS PBC session.\r\n *\r\n *  This function starts WPS PBC session.\r\n *\r\n * \\return  WM_SUCCESS if successful\r\n */\r\nint wlan_start_wps_pbc(void);\r\n/**\r\n * Set None/WPS/802.1x session.\r\n *\r\n *\\param[in] session       0 -- PROV_NON_SESSION_ATTEMPT, 1 -- PROV_WPS_SESSION_ATTEMPT, 2 -- PROV_ENTP_SESSION_ATTEMPT.\r\n */\r\nvoid wlan_set_prov_session(int session);\r\n\r\n/**\r\n * Get connect session type.\r\n *\r\n * \\return 0 -- PROV_NON_SESSION_ATTEMPT, 1 -- PROV_WPS_SESSION_ATTEMPT, 2 -- PROV_ENTP_SESSION_ATTEMPT.\r\n */\r\nint wlan_get_prov_session(void);\r\n#endif\r\n\r\n/** Stop and remove all Wi-Fi network profiles.\r\n *\r\n *  \\return WM_SUCCESS if successful otherwise return -WM_E_INVAL.\r\n */\r\nint wlan_remove_all_network_profiles(void);\r\n\r\n#if defined(RW610)\r\n/** Reset driver.\r\n *  \\param[in] ResetOption Option including enable, disable or reset Wi-Fi driver\r\n *  can be chosen.\r\n */\r\nvoid wlan_reset(cli_reset_option ResetOption);\r\n/** Stop and remove all Wi-Fi network (access point).\r\n *\r\n *  \\return WM_SUCCESS if successful.\r\n */\r\nint wlan_remove_all_networks(void);\r\n\r\n/**\r\n * This API destroy all tasks.\r\n */\r\nvoid wlan_destroy_all_tasks(void);\r\n/** Retrieve the status information of if Wi-Fi started.\r\n *\r\n *  \\return TRUE if Wi-Fi network is started.\r\n *  \\return FALSE if not started.\r\n */\r\nint wlan_is_started(void);\r\n\r\n#endif // RW610\r\n\r\n#if CONFIG_NCP\r\n/** UAP provisioning deinit callback function */\r\nvoid wlan_register_uap_prov_deinit_cb(int (*cb)(void));\r\n/** UAP provisioning cleanup callback function */\r\nvoid wlan_register_uap_prov_cleanup_cb(void (*cb)(void));\r\n/** Stop all Wi-Fi network.\r\n *\r\n *  \\return WM_SUCCESS if successful.\r\n */\r\nint wlan_stop_all_networks(void);\r\n#endif\r\n\r\n#if CONFIG_RX_ABORT_CFG\r\nstruct wlan_rx_abort_cfg\r\n{\r\n    /** Enable/Disable RX abort configuration */\r\n    t_u8 enable;\r\n    /** RX weak RSSI threshold */\r\n    int rssi_threshold;\r\n};\r\n#endif\r\n\r\n#if CONFIG_RX_ABORT_CFG_EXT\r\nstruct wlan_rx_abort_cfg_ext\r\n{\r\n    /** Enable/Disable dyn RX abort on weak packet RSSI */\r\n    int enable;\r\n    /** Specify RSSI margin */\r\n    int rssi_margin;\r\n    /** Specify ceil RSSI threshold */\r\n    int ceil_rssi_threshold;\r\n    /** Specify floor RSSI threshold */\r\n    int floor_rssi_threshold;\r\n    /** Current dynamic RSSI threshold */\r\n    int current_dynamic_rssi_threshold;\r\n    /** RSSI config: default or user configured */\r\n    int rssi_default_config;\r\n    /** EDMAC status */\r\n    int edmac_enable;\r\n};\r\n#endif\r\n\r\n#if CONFIG_CCK_DESENSE_CFG\r\n#define CCK_DESENSE_MODE_DISABLED 0\r\n#define CCK_DESENSE_MODE_DYNAMIC  1\r\n#define CCK_DESENSE_MODE_DYN_ENH  2\r\n\r\nstruct wlan_cck_desense_cfg\r\n{\r\n    /** CCK (complementary code keying) desense mode: 0:disable 1:normal 2:dynamic */\r\n    t_u16 mode;\r\n    /** Specify RSSI margin */\r\n    int margin;\r\n    /** Specify ceil RSSI threshold */\r\n    int ceil_thresh;\r\n    /** CCK (complementary code keying) desense \"on\" interval count */\r\n    int num_on_intervals;\r\n    /** CCK desense \"off\" interval count */\r\n    int num_off_intervals;\r\n};\r\n#endif\r\n#if CONFIG_RX_ABORT_CFG\r\n/**\r\n * Set/Get RX abort configure to/from firmware.\r\n *\r\n * \\param[in,out] cfg A pointer to information buffer\r\n * \\param[in] action Command action: get or set\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_get_rx_abort_cfg(struct wlan_rx_abort_cfg *cfg, t_u16 action);\r\n#endif\r\n\r\n#if CONFIG_RX_ABORT_CFG_EXT\r\n/**\r\n * Set dynamic RX abort config to firmware.\r\n *\r\n * \\param[in] cfg A pointer to information buffer\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_rx_abort_cfg_ext(const struct wlan_rx_abort_cfg_ext *cfg);\r\n\r\n/**\r\n * Get dynamic RX abort config from firmware.\r\n *\r\n * \\param[in,out] cfg A pointer to information buffer\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_get_rx_abort_cfg_ext(struct wlan_rx_abort_cfg_ext *cfg);\r\n#endif\r\n\r\n#if CONFIG_CCK_DESENSE_CFG\r\n/**\r\n * Set/Get CCK (complementary code keying) desense configure to/from firmware.\r\n *\r\n * \\param[in,out] cfg A pointer to information buffer\r\n * \\param[in] action get or set.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_get_cck_desense_cfg(struct wlan_cck_desense_cfg *cfg, t_u16 action);\r\n#endif\r\n\r\n/** Wi-Fi initialize UAP network information\r\n *\r\n * This API intializes a default UAP network. The network ssid, passphrase\r\n * is initialized to NULL. Channel is set to auto. The IP Address of the\r\n * UAP interface is 192.168.10.1/255.255.255.0. Network name is set to\r\n * 'uap-network'.\r\n *\r\n * \\param[out] net Pointer to the initialized UAP network\r\n */\r\nvoid wlan_initialize_uap_network(struct wlan_network *net);\r\n\r\n/** Wi-Fi initialize station network information\r\n *\r\n * This API intializes a default station network. The network ssid, passphrase\r\n * is initialized to NULL. Channel is set to auto.\r\n *\r\n * \\param[out] net Pointer to the initialized UAP network\r\n */\r\nvoid wlan_initialize_sta_network(struct wlan_network *net);\r\n\r\n/** Add a network profile to the list of known networks.\r\n *\r\n *  This function copies the contents of \\a network to the list of known\r\n *  networks in the Wi-Fi connection manager. The network's 'name' field is\r\n *  unique and between \\ref WLAN_NETWORK_NAME_MIN_LENGTH and \\ref\r\n *  WLAN_NETWORK_NAME_MAX_LENGTH characters.  The network must specify at least\r\n *  an SSID or BSSID.  the Wi-Fi connection manager may store up to\r\n *  WLAN_MAX_KNOWN_NETWORKS networks.\r\n *\r\n *  \\note Profiles for the station interface may be added only when the station\r\n *  interface is in the \\ref WLAN_DISCONNECTED or \\ref WLAN_CONNECTED state.\r\n *\r\n *  \\note This API can be used to add profiles for station or\r\n *  UAP interfaces.\r\n *\r\n *  \\note Set mfpc and mfpr to -1 for default configurations.\r\n *\r\n *  \\param[in] network A pointer to the \\ref wlan_network that can be copied\r\n *             to the list of known networks in the Wi-Fi connection manager\r\n *             successfully.\r\n *\r\n *  \\return WM_SUCCESS if the contents pointed to by \\a network have been\r\n *          added to the Wi-Fi connection manager.\r\n *  \\return -WM_E_INVAL if \\a network is NULL or the network name\r\n *          is not unique or the network name length is not valid\r\n *          or network security is \\ref WLAN_SECURITY_WPA3_SAE but\r\n *          Management Frame Protection Capable is not enabled.\r\n *          in \\ref wlan_network_security field. if network security type is\r\n *          \\ref WLAN_SECURITY_WPA or \\ref WLAN_SECURITY_WPA2 or \\ref\r\n *          WLAN_SECURITY_WPA_WPA2_MIXED, but the passphrase length is less\r\n *          than 8 or greater than 63, or the psk length equal to 64 but not\r\n *          hexadecimal digits. if network security type is \\ref WLAN_SECURITY_WPA3_SAE,\r\n *          but the password length is less than 8 or greater than 255.\r\n *          if network security type is \\ref WLAN_SECURITY_WEP_OPEN or\r\n *          \\ref WLAN_SECURITY_WEP_SHARED.\r\n *  \\return -WM_E_NOMEM if there was no room to add the network.\r\n *  \\return WLAN_ERROR_STATE if the Wi-Fi connection manager\r\n *          was running and not in the \\ref WLAN_DISCONNECTED,\r\n *          \\ref WLAN_ASSOCIATED or \\ref WLAN_CONNECTED state.\r\n */\r\nint wlan_add_network(struct wlan_network *network);\r\n\r\n/** Remove a network profile from the list of known networks.\r\n *\r\n *  This function removes a network (identified by its name) from the WLAN\r\n *  Connection Manager, disconnecting from that network if connected.\r\n *\r\n *  \\note This function is asynchronous if it is called while the WLAN\r\n *  Connection Manager is running and connected to the network to be removed.\r\n *  In that case, the Wi-Fi connection manager can disconnect from the network\r\n *  and generate an event with reason \\ref WLAN_REASON_USER_DISCONNECT. This\r\n *  function is synchronous otherwise.\r\n *\r\n *  \\note This API can be used to remove profiles for station or\r\n *  UAP interfaces. Station network can not be removed if it is\r\n *  in \\ref WLAN_CONNECTED state and UAP network can not be removed\r\n *  if it is in \\ref WLAN_UAP_STARTED state.\r\n *\r\n *  \\param[in] name A pointer to the string representing the name of the\r\n *             network to remove.\r\n *\r\n *  \\return WM_SUCCESS if the network named \\a name was removed from the\r\n *          Wi-Fi connection manager successfully. Otherwise,\r\n *          the network is not removed.\r\n *  \\return WLAN_ERROR_STATE if the Wi-Fi connection manager was\r\n *          running and the station interface was not in the \\ref\r\n *          WLAN_DISCONNECTED state.\r\n *  \\return -WM_E_INVAL if \\a name is NULL or the network was not found in\r\n *          the list of known networks.\r\n *  \\return -WM_FAIL if an internal error occurred\r\n *          while trying to disconnect from the network specified for\r\n *          removal.\r\n */\r\nint wlan_remove_network(const char *name);\r\n\r\n/** Connect to a Wi-Fi network (access point).\r\n *\r\n *  When this function is called, Wi-Fi connection manager starts connection attempts\r\n *  to the network specified by \\a name. The connection result can be notified\r\n *  asynchronously to the WLCMGR callback when the connection process has\r\n *  completed.\r\n *\r\n *  When connecting to a network, the event refers to the connection\r\n *  attempt to that network.\r\n *\r\n *  Calling this function when the station interface is in the \\ref\r\n *  WLAN_DISCONNECTED state should, if successful, cause the interface to\r\n *  transition into the \\ref WLAN_CONNECTING state. If the connection attempt\r\n *  succeeds, the station interface should transition to the \\ref WLAN_CONNECTED state,\r\n *  otherwise it should return to the \\ref WLAN_DISCONNECTED state.  If this\r\n *  function is called while the station interface is in the \\ref\r\n *  WLAN_CONNECTING or \\ref WLAN_CONNECTED state, the Wi-Fi connection manager\r\n *  should first cancel its connection attempt or disconnect from the network,\r\n *  respectively, and generate an event with reason \\ref\r\n *  WLAN_REASON_USER_DISCONNECT. This should be followed by a second event that\r\n *  reports the result of the new connection attempt.\r\n *\r\n *  If the connection attempt was successful the WLCMGR callback is notified\r\n *  with the event \\ref WLAN_REASON_SUCCESS, while if the connection attempt\r\n *  fails then either of the events, \\ref WLAN_REASON_NETWORK_NOT_FOUND, \\ref\r\n *  WLAN_REASON_NETWORK_AUTH_FAILED, \\ref WLAN_REASON_CONNECT_FAILED\r\n *  or \\ref WLAN_REASON_ADDRESS_FAILED are reported as appropriate.\r\n *\r\n *  \\param[in] name A pointer to a string representing the name of the network\r\n *              to connect to.\r\n *\r\n *  \\return WM_SUCCESS if a connection attempt was started successfully\r\n *  \\return WLAN_ERROR_STATE if the Wi-Fi connection manager was not running.\r\n *  \\return -WM_E_INVAL if there are no known networks to connect to\r\n *          or the network specified by \\a name is not in the list\r\n *          of known networks or network \\a name is NULL.\r\n *  \\return -WM_FAIL if an internal error has occurred.\r\n */\r\nint wlan_connect(char *name);\r\n\r\n/** Connect to a Wi-Fi network (access point) with options.\r\n *\r\n *  When this function is called, Wi-Fi connection manager starts connection attempts\r\n *  to the network specified by \\a name. The connection result should be notified\r\n *  asynchronously to the WLCMGR callback when the connection process has\r\n *  completed.\r\n *\r\n *  When connecting to a network, the event refers to the connection\r\n *  attempt to that network.\r\n *\r\n *  Calling this function when the station interface is in the \\ref\r\n *  WLAN_DISCONNECTED state should, if successful, cause the interface to\r\n *  transition into the \\ref WLAN_CONNECTING state.  If the connection attempt\r\n *  succeeds, the station interface should transition to the \\ref WLAN_CONNECTED state,\r\n *  otherwise it should return to the \\ref WLAN_DISCONNECTED state.  If this\r\n *  function is called while the station interface is in the \\ref\r\n *  WLAN_CONNECTING or \\ref WLAN_CONNECTED state, the Wi-Fi connection manager\r\n *  should first cancel its connection attempt or disconnect from the network,\r\n *  respectively, and generate an event with reason \\ref\r\n *  WLAN_REASON_USER_DISCONNECT. This should be followed by a second event that\r\n *  reports the result of the new connection attempt.\r\n *\r\n *  If the connection attempt was successful the WLCMGR callback is notified\r\n *  with the event \\ref WLAN_REASON_SUCCESS, while if the connection attempt\r\n *  fails then either of the events, \\ref WLAN_REASON_NETWORK_NOT_FOUND, \\ref\r\n *  WLAN_REASON_NETWORK_AUTH_FAILED, \\ref WLAN_REASON_CONNECT_FAILED\r\n *  or \\ref WLAN_REASON_ADDRESS_FAILED are reported as appropriate.\r\n *\r\n *  \\param[in] name A pointer to a string representing the name of the network\r\n *              to connect to.\r\n *  \\param[in] skip_dfs Option to skip DFS channel when doing scan.\r\n *\r\n *  \\return WM_SUCCESS if a connection attempt was started successfully\r\n *  \\return WLAN_ERROR_STATE if the Wi-Fi connection manager was not running.\r\n *  \\return -WM_E_INVAL if there are no known networks to connect to\r\n *          or the network specified by \\a name is not in the list\r\n *          of known networks or network \\a name is NULL.\r\n *  \\return -WM_FAIL if an internal error has occurred.\r\n */\r\nint wlan_connect_opt(char *name, bool skip_dfs);\r\n\r\n/** Reassociate to a Wi-Fi network (access point).\r\n *\r\n *  When this function is called, Wi-Fi connection manager starts reassociation\r\n *  attempts using same SSID as currently connected network .\r\n *  The connection result should be notified asynchronously to the WLCMGR\r\n *  callback when the connection process has completed.\r\n *\r\n *  When connecting to a network, the event refers to the connection\r\n *  attempt to that network.\r\n *\r\n *  Calling this function when the station interface is in the \\ref\r\n *  WLAN_DISCONNECTED state should have no effect.\r\n *\r\n *  Calling this function when the station interface is in the \\ref\r\n *  WLAN_CONNECTED state should, if successful, cause the interface to\r\n *  reassociate to another network (access point).\r\n *\r\n *  If the connection attempt was successful the WLCMGR (Wi-Fi command manager) callback is notified\r\n *  with the event \\ref WLAN_REASON_SUCCESS, while if the connection attempt\r\n *  fails then either of the events, \\ref WLAN_REASON_NETWORK_AUTH_FAILED,\r\n *  \\ref WLAN_REASON_CONNECT_FAILED or \\ref WLAN_REASON_ADDRESS_FAILED\r\n *  are reported as appropriate.\r\n *\r\n *  \\return WM_SUCCESS if a reassociation attempt was started successfully\r\n *  \\return WLAN_ERROR_STATE if the Wi-Fi connection manager was not running.\r\n *          or Wi-Fi connection manager was not in \\ref WLAN_CONNECTED state.\r\n *  \\return -WM_E_INVAL if there are no known networks to connect to\r\n *  \\return -WM_FAIL if an internal error has occurred.\r\n */\r\nint wlan_reassociate(void);\r\n\r\n/** Disconnect from the current Wi-Fi network (access point).\r\n *\r\n *  When this function is called, the Wi-Fi connection manager attempts to disconnect\r\n *  the station interface from its currently connected network (or cancel an in-progress\r\n *  connection attempt) and return to the \\ref WLAN_DISCONNECTED state. Calling\r\n *  this function has no effect if the station interface is already\r\n *  disconnected.\r\n *\r\n *  \\note This is an asynchronous function and successful disconnection should be\r\n *  notified using the \\ref WLAN_REASON_USER_DISCONNECT.\r\n *\r\n * \\return  WM_SUCCESS if successful\r\n * \\return  WLAN_ERROR_STATE otherwise\r\n */\r\nint wlan_disconnect(void);\r\n\r\n/** Start a Wi-Fi network (access point).\r\n *\r\n *  When this function is called, the Wi-Fi connection manager starts the network\r\n *  specified by \\a name. The network with the specified \\a name is\r\n *  first added using \\ref wlan_add_network and is a UAP network with\r\n *  a valid SSID.\r\n *\r\n *  \\note The WLCMGR callback is asynchronously notified of the status. On\r\n *  success, the event \\ref WLAN_REASON_UAP_SUCCESS is reported, while on\r\n *  failure, the event \\ref WLAN_REASON_UAP_START_FAILED is reported.\r\n *\r\n *  \\param[in] name A pointer to string representing the name of the network\r\n *             to connect to.\r\n *\r\n *  \\return WM_SUCCESS if successful.\r\n *  \\return WLAN_ERROR_STATE if in power save state or UAP already running.\r\n *  \\return -WM_E_INVAL if \\a name was NULL or the network \\a\r\n *          name was not found or it not have a specified SSID.\r\n */\r\nint wlan_start_network(const char *name);\r\n\r\n/** Stop a Wi-Fi network (access point).\r\n *\r\n *  When this function is called, the Wi-Fi connection manager stops the network\r\n *  specified by \\a name. The specified network is a valid UAP\r\n *  network that has already been started.\r\n *\r\n *  \\note The WLCMGR callback is asynchronously notified of the status. On\r\n *  success, the event \\ref WLAN_REASON_UAP_STOPPED is reported, while on\r\n *  failure, the event \\ref WLAN_REASON_UAP_STOP_FAILED is reported.\r\n *\r\n *  \\param[in] name A pointer to a string representing the name of the network\r\n *             to stop.\r\n *\r\n *  \\return WM_SUCCESS if successful.\r\n *  \\return WLAN_ERROR_STATE if UAP is in power save state.\r\n *  \\return -WM_E_INVAL if \\a name was NULL or the network \\a\r\n *          name was not found or that the network \\a name is not a UAP\r\n *          network or it is a UAP network but does not have a specified\r\n *          SSID.\r\n */\r\nint wlan_stop_network(const char *name);\r\n\r\n/** Retrieve the Wi-Fi MAC address of station interface.\r\n *\r\n *  This function copies the MAC address of the station interface to STA MAC address and UAP interface to UAP mac\r\n * address.\r\n *\r\n *  \\param[out] dest A pointer to a 6-byte array where the MAC address should be\r\n *              copied.\r\n *\r\n *  \\return WM_SUCCESS if the MAC address was copied.\r\n *  \\return -WM_E_INVAL if \\a sta_mac or UAP_mac is NULL.\r\n */\r\nint wlan_get_mac_address(uint8_t *dest);\r\n\r\n/** Retrieve the Wi-Fi MAC address of UAP interface.\r\n *\r\n *  This function copies the MAC address of the Wi-Fi interface to\r\n *  the 6-byte array pointed to by \\a dest. In the event of an error, nothing\r\n *  is copied to \\a dest.\r\n *\r\n *  \\param[out] dest A pointer to a 6-byte array where the MAC address can be\r\n *              copied.\r\n *\r\n *  \\return WM_SUCCESS if the MAC address was copied.\r\n *  \\return -WM_E_INVAL if \\a dest is NULL.\r\n */\r\nint wlan_get_mac_address_uap(uint8_t *dest);\r\n\r\n/** Retrieve the IP address configuration of the station interface.\r\n *\r\n *  This function retrieves the IP address configuration\r\n *  of the station interface and copies it to the memory\r\n *  location pointed to by \\a addr.\r\n *\r\n *  \\note This function may only be called when the station interface is in the\r\n *  \\ref WLAN_CONNECTED state.\r\n *\r\n *  \\param[out] addr A pointer to the \\ref wlan_ip_config.\r\n *\r\n *  \\return WM_SUCCESS if successful.\r\n *  \\return -WM_E_INVAL if \\a addr is NULL.\r\n *  \\return WLAN_ERROR_STATE if the Wi-Fi connection manager was not running or was\r\n *          not in the \\ref WLAN_CONNECTED state.\r\n *  \\return -WM_FAIL if an internal error\r\n *          occurred when retrieving IP address information from the\r\n *          TCP stack.\r\n */\r\nint wlan_get_address(struct wlan_ip_config *addr);\r\n\r\n/** Retrieve the IP address of UAP interface.\r\n *\r\n *  This function retrieves the current IP address configuration of UAP\r\n *  and copies it to the memory location pointed to by \\a addr.\r\n *\r\n *  \\note This function may only be called when the UAP interface is in the\r\n *  \\ref WLAN_UAP_STARTED state.\r\n *\r\n *  \\param[out] addr A pointer to the \\ref wlan_ip_config.\r\n *\r\n *  \\return WM_SUCCESS if successful.\r\n *  \\return -WM_E_INVAL if \\a addr is NULL.\r\n *  \\return WLAN_ERROR_STATE if the Wi-Fi connection manager was not running or\r\n *          the UAP interface was not in the \\ref WLAN_UAP_STARTED state.\r\n *  \\return -WM_FAIL if an internal error\r\n *          occurred when retrieving IP address information from the\r\n *          TCP stack.\r\n */\r\nint wlan_get_uap_address(struct wlan_ip_config *addr);\r\n\r\n/** Retrieve the channel of UAP interface.\r\n *\r\n *  This function retrieves the channel number of UAP\r\n *  and copies it to the memory location pointed to by \\a channel.\r\n *\r\n *  \\note This function may only be called when the UAP interface is in the\r\n *  \\ref WLAN_UAP_STARTED state.\r\n *\r\n *  \\param[out] channel A pointer to variable that stores channel number.\r\n *\r\n *  \\return WM_SUCCESS if successful.\r\n *  \\return -WM_E_INVAL if \\a channel is NULL.\r\n *  \\return -WM_FAIL if an internal error has occurred.\r\n */\r\nint wlan_get_uap_channel(int *channel);\r\n\r\n/** Retrieve the current network configuration of station interface.\r\n *\r\n *  This function retrieves the current network configuration of station\r\n *  interface when the station interface is in the \\ref WLAN_CONNECTED\r\n *  state.\r\n *\r\n *  \\param[out] network A pointer to the \\ref wlan_network.\r\n *\r\n *  \\return WM_SUCCESS if successful.\r\n *  \\return -WM_E_INVAL if \\a network is NULL.\r\n *  \\return WLAN_ERROR_STATE if the Wi-Fi connection manager was\r\n *          not running or not in the \\ref WLAN_CONNECTED state.\r\n */\r\nint wlan_get_current_network(struct wlan_network *network);\r\n\r\n/** Retrieve the current network ssid of station interface.\r\n *\r\n *  This function retrieves the current network ssid of station\r\n *  interface when the station interface is in the \\ref WLAN_CONNECTED\r\n *  state.\r\n *\r\n *  \\param[out] ssid A pointer to the ssid.\r\n *\r\n *  \\return WM_SUCCESS if successful.\r\n *  \\return -WM_E_INVAL if \\a network is NULL.\r\n *  \\return WLAN_ERROR_STATE if the Wi-Fi connection manager was\r\n *          not running or not in the \\ref WLAN_CONNECTED state.\r\n */\r\nint wlan_get_current_network_ssid(char *ssid);\r\n\r\n/** Retrieve the current network bssid of station interface.\r\n *\r\n *  This function retrieves the current network bssid of station\r\n *  interface when the station interface is in the \\ref WLAN_CONNECTED\r\n *  state.\r\n *\r\n *  \\param[out] bssid A pointer to the bssid.\r\n *\r\n *  \\return WM_SUCCESS if successful.\r\n *  \\return -WM_E_INVAL if \\a network is NULL.\r\n *  \\return WLAN_ERROR_STATE if the Wi-Fi connection manager was\r\n *          not running or not in the \\ref WLAN_CONNECTED state.\r\n */\r\nint wlan_get_current_network_bssid(char *bssid);\r\n\r\n/** Retrieve the current network configuration of UAP interface.\r\n *\r\n *  This function retrieves the current network configuration of UAP\r\n *  interface when the UAP interface is in the \\ref WLAN_UAP_STARTED state.\r\n *\r\n *  \\param[out] network A pointer to the \\ref wlan_network.\r\n *\r\n *  \\return WM_SUCCESS if successful.\r\n *  \\return -WM_E_INVAL if \\a network is NULL.\r\n *  \\return WLAN_ERROR_STATE if the Wi-Fi connection manager was\r\n *           not running or not in the \\ref WLAN_UAP_STARTED state.\r\n */\r\nint wlan_get_current_uap_network(struct wlan_network *network);\r\n\r\n/** Retrieve the current network ssid of UAP interface.\r\n *\r\n *  This function retrieves the current network ssid of UAP\r\n *  interface when the UAP interface is in the \\ref WLAN_UAP_STARTED state.\r\n *\r\n *  \\param[out] ssid A pointer to the ssid.\r\n *\r\n *  \\return WM_SUCCESS if successful.\r\n *  \\return -WM_E_INVAL if \\a network is NULL.\r\n *  \\return WLAN_ERROR_STATE if the Wi-Fi connection manager was\r\n *           not running or not in the \\ref WLAN_UAP_STARTED state.\r\n */\r\nint wlan_get_current_uap_network_ssid(char *ssid);\r\n\r\n#if CONFIG_SCAN_WITH_RSSIFILTER\r\nint wlan_set_rssi_threshold(int rssithr);\r\n#endif\r\n\r\n/** Retrieve the status information of the UAP interface.\r\n *\r\n *  \\return TRUE if UAP interface is in \\ref WLAN_UAP_STARTED state.\r\n *  \\return FALSE otherwise.\r\n */\r\nbool is_uap_started(void);\r\n\r\n/** Retrieve the status information of the station interface.\r\n *\r\n *  \\return TRUE if station interface is in \\ref WLAN_CONNECTED state.\r\n *  \\return FALSE otherwise.\r\n */\r\nbool is_sta_connected(void);\r\n\r\n/** Retrieve the status information of the ipv4 network of station interface.\r\n *\r\n *  \\return TRUE if ipv4 network of station interface is in \\ref WLAN_CONNECTED\r\n *  state.\r\n *  \\return FALSE otherwise.\r\n */\r\nbool is_sta_ipv4_connected(void);\r\n\r\n#if CONFIG_IPV6\r\n/** Retrieve the status information of the ipv6 network of station interface.\r\n *\r\n *  \\return TRUE if ipv6 network of station interface is in \\ref WLAN_CONNECTED\r\n *  state.\r\n *  \\return FALSE otherwise.\r\n */\r\nbool is_sta_ipv6_connected(void);\r\n#endif\r\n\r\n/** Retrieve the information about a known network using \\a index.\r\n *\r\n *  This function retrieves the contents of a network at \\a index in the\r\n *  list of known networks maintained by the Wi-Fi connection manager and\r\n *  copies it to the location pointed to by \\a network.\r\n *\r\n *  \\note \\ref wlan_get_network_count() may be used to retrieve the number\r\n *  of known networks. \\ref wlan_get_network() may be used to retrieve\r\n *  information about networks at \\a index 0 to one minus the number of networks.\r\n *\r\n *  \\note This function may be called regardless of whether the Wi-Fi connection\r\n *  manager is running. Calls to this function are synchronous.\r\n *\r\n *  \\param[in] index The index of the network to retrieve.\r\n *  \\param[out] network A pointer to the \\ref wlan_network where the network\r\n *              configuration for the network at \\a index can be copied.\r\n *\r\n *  \\returns WM_SUCCESS if successful.\r\n *  \\return -WM_E_INVAL if \\a network is NULL or \\a index is out of range.\r\n */\r\nint wlan_get_network(unsigned int index, struct wlan_network *network);\r\n\r\n/** Retrieve information about a known network using \\a name.\r\n *\r\n *  This function retrieves the contents of a named network in the\r\n *  list of known networks maintained by the Wi-Fi connection manager and\r\n *  copies it to the location pointed to by \\a network.\r\n *\r\n *  \\note This function may be called regardless of whether the Wi-Fi Connection\r\n *  Manager is running. Calls to this function are synchronous.\r\n *\r\n *  \\param[in] name The name of the network to retrieve.\r\n *  \\param[out] network A pointer to the \\ref wlan_network where the network\r\n *              configuration for the network having name as \\a name should be copied.\r\n *\r\n *  \\return WM_SUCCESS if successful.\r\n *  \\return -WM_E_INVAL if \\a network is NULL or \\a name is NULL.\r\n */\r\nint wlan_get_network_byname(char *name, struct wlan_network *network);\r\n\r\n/** Retrieve the number of networks known to the Wi-Fi connection manager.\r\n *\r\n *  This function retrieves the number of known networks in the list maintained\r\n *  by the Wi-Fi connection manager and copies it to \\a count.\r\n *\r\n *  \\note This function may be called regardless of whether the Wi-Fi Connection\r\n *  Manager is running. Calls to this function are synchronous.\r\n *\r\n *  \\param[out] count A pointer to the memory location where the number of\r\n *              networks should be copied.\r\n *\r\n *  \\return WM_SUCCESS if successful.\r\n *  \\return -WM_E_INVAL if \\a count is NULL.\r\n */\r\nint wlan_get_network_count(unsigned int *count);\r\n\r\n/** Retrieve the connection state of station interface.\r\n *\r\n *  This function retrieves the connection state of station interface, which is\r\n *  one of \\ref WLAN_DISCONNECTED, \\ref WLAN_CONNECTING, \\ref WLAN_ASSOCIATED\r\n *  or \\ref WLAN_CONNECTED.\r\n *\r\n *  \\param[out] state A pointer to the \\ref wlan_connection_state where the\r\n *         current connection state should be copied.\r\n *\r\n *  \\return WM_SUCCESS if successful.\r\n *  \\return -WM_E_INVAL if \\a state is NULL\r\n *  \\return WLAN_ERROR_STATE if the Wi-Fi connection manager was not running.\r\n */\r\nint wlan_get_connection_state(enum wlan_connection_state *state);\r\n\r\n/** Retrieve the connection state of UAP interface.\r\n *\r\n *  This function retrieves the connection state of UAP interface, which is\r\n *  one of \\ref WLAN_UAP_STARTED, or \\ref WLAN_UAP_STOPPED.\r\n *\r\n *  \\param[out] state A pointer to the \\ref wlan_connection_state where the\r\n *         current connection state should be copied.\r\n *\r\n *  \\return WM_SUCCESS if successful.\r\n *  \\return -WM_E_INVAL if \\a state is NULL\r\n *  \\return WLAN_ERROR_STATE if the Wi-Fi connection manager was not running.\r\n */\r\nint wlan_get_uap_connection_state(enum wlan_connection_state *state);\r\n\r\n/** Scan for Wi-Fi networks.\r\n *\r\n *  When this function is called, the Wi-Fi connection manager starts scan\r\n *  for Wi-Fi networks. On completion of the scan the Wi-Fi connection manager\r\n *  can call the specified callback function \\a cb. The callback function should then\r\n *  retrieve the scan results by using the \\ref wlan_get_scan_result() function.\r\n *\r\n *  \\note This function may only be called when the station interface is in the\r\n *  \\ref WLAN_DISCONNECTED or \\ref WLAN_CONNECTED state. scan is disabled\r\n *  in the \\ref WLAN_CONNECTING state.\r\n *\r\n *  \\note This function should block until it can issue a scan request if called\r\n *  while another scan is in progress.\r\n *\r\n *  \\param[in] cb A pointer to the function that should be called to handle scan\r\n *         results when they are available.\r\n *\r\n *  \\return WM_SUCCESS if successful.\r\n *  \\return -WM_E_NOMEM if failed to allocated memory for \\ref\r\n *\t     wlan_scan_params_v2_t structure.\r\n *  \\return -WM_E_INVAL if \\a cb scan result callack functio pointer is NULL.\r\n *  \\return WLAN_ERROR_STATE if the Wi-Fi connection manager was\r\n *           not running or not in the \\ref WLAN_DISCONNECTED or \\ref\r\n *           WLAN_CONNECTED states.\r\n *  \\return -WM_FAIL if an internal error has occurred and\r\n *           the system is unable to scan.\r\n */\r\nint wlan_scan(int (*cb)(unsigned int count));\r\n\r\n/** Scan for Wi-Fi networks using options provided.\r\n *\r\n *  When this function is called, the Wi-Fi connection manager starts scan\r\n *  for Wi-Fi networks. On completion of the scan the Wi-Fi connection manager\r\n *  should call the specified callback function \\a cb. The callback function\r\n *  should then retrieve the scan results by using the \\ref wlan_get_scan_result()\r\n *  function.\r\n *\r\n *  \\note This function may only be called when the station interface is in the\r\n *  \\ref WLAN_DISCONNECTED or \\ref WLAN_CONNECTED state. scan is disabled\r\n *  in the \\ref WLAN_CONNECTING state.\r\n *\r\n *  \\note This function can block until it issue a scan request if called\r\n *  while another scan is in progress.\r\n *\r\n *  \\param[in] t_wlan_scan_param  A \\ref wlan_scan_params_v2_t structure holding\r\n *\t       a pointer to function that should be called\r\n *\t       to handle scan results when they are available,\r\n *\t       SSID of a Wi-Fi network, BSSID of a Wi-Fi network,\r\n *\t       number of channels with scan type information and number of\r\n *\t       probes.\r\n *\r\n *  \\return WM_SUCCESS if successful.\r\n *  \\return -WM_E_NOMEM if failed to allocated memory for \\ref\r\n *\t     wlan_scan_params_v2_t structure.\r\n *  \\return -WM_E_INVAL if \\a cb scan result callack function pointer is NULL.\r\n *  \\return WLAN_ERROR_STATE if the Wi-Fi connection manager was\r\n *           not running or not in the \\ref WLAN_DISCONNECTED or \\ref\r\n *           WLAN_CONNECTED states.\r\n *  \\return -WM_FAIL if an internal error has occurred and\r\n *           the system is unable to scan.\r\n */\r\nint wlan_scan_with_opt(wlan_scan_params_v2_t t_wlan_scan_param);\r\n\r\n/** Retrieve a scan result.\r\n *\r\n *  This function may be called to retrieve scan results when the Wi-Fi\r\n *  connection manager has finished scanning. It is called from within the\r\n *  scan result callback (see \\ref wlan_scan()) as scan results are valid\r\n *  only in that context. The callback argument 'count' provides the number\r\n *  of scan results that may be retrieved and \\ref wlan_get_scan_result() may\r\n *  be used to retrieve scan results at \\a index 0 through that number.\r\n *\r\n *  \\note This function may only be called in the context of the scan results\r\n *  callback.\r\n *\r\n *  \\note Calls to this function are synchronous.\r\n *\r\n *  \\param[in] index The scan result to retrieve.\r\n *  \\param[out] res A pointer to the \\ref wlan_scan_result where the scan\r\n *              result information should be copied.\r\n *\r\n *  \\return WM_SUCCESS if successful.\r\n *  \\return -WM_E_INVAL if \\a res is NULL\r\n *  \\return WLAN_ERROR_STATE if the Wi-Fi connection manager\r\n *          was not running\r\n *  \\return -WM_FAIL if the scan result at \\a\r\n *          index could not be retrieved (that is, \\a index\r\n *          is out of range).\r\n */\r\nint wlan_get_scan_result(unsigned int index, struct wlan_scan_result *res);\r\n\r\n#ifdef WLAN_LOW_POWER_ENABLE\r\n/**\r\n * Enable low power mode in Wi-Fi Firmware.\r\n *\r\n * \\note When low power mode is enabled, the output power should be clipped at\r\n * ~+10dBm and the expected PA current is expected to be in the 80-90 mA\r\n * range for b/g/n modes.\r\n *\r\n * This function may be called to enable low power mode in firmware.\r\n * This should be called before \\ref wlan_init() function.\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL if failed.\r\n *\r\n */\r\nint wlan_enable_low_pwr_mode(void);\r\n#endif\r\n\r\n/**\r\n * Configure ED MAC mode for station in Wi-Fi Firmware.\r\n *\r\n * \\note When ED MAC mode is enabled,\r\n * Wi-Fi Firmware can behave following way:\r\n *\r\n * when background noise had reached -70dB or above,\r\n * Wi-Fi chipset/module should hold data transmitting\r\n * until condition is removed.\r\n * It is applicable for both 5GHz and 2.4GHz bands.\r\n *\r\n * \\param[in] wlan_ed_mac_ctrl  Struct with following parameters\r\n *\t ed_ctrl_2g\t     0  - disable EU adaptivity for 2.4GHz band\r\n *                           1  - enable EU adaptivity for 2.4GHz band\r\n *\r\n *       ed_offset_2g        0  - Default Energy Detect threshold (Default: 0x9)\r\n *                           offset value range: 0x80 to 0x7F\r\n *\r\n * \\note If 5GH enabled then add following parameters\r\n *\r\n *       ed_ctrl_5g          0  - disable EU adaptivity for 5GHz band\r\n *                           1  - enable EU adaptivity for 5GHz band\r\n *\r\n *       ed_offset_5g        0  - Default Energy Detect threshold(Default: 0xC)\r\n *                           offset value range: 0x80 to 0x7F\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL if failed.\r\n *\r\n */\r\nint wlan_set_ed_mac_mode(wlan_ed_mac_ctrl_t wlan_ed_mac_ctrl);\r\n\r\n/**\r\n * Configure ED MAC mode for UAP in Wi-Fi firmware.\r\n *\r\n * \\note When ED MAC mode is enabled,\r\n * Wi-Fi Firmware can behave following way:\r\n *\r\n * when background noise had reached -70dB or above,\r\n * Wi-Fi chipset/module should hold data transmitting\r\n * until condition is removed.\r\n * It is applicable for both 5GHz and 2.4GHz bands.\r\n *\r\n * \\param[in] wlan_ed_mac_ctrl  Struct with following parameters\r\n *\t ed_ctrl_2g\t     0  - disable EU adaptivity for 2.4GHz band\r\n *                           1  - enable EU adaptivity for 2.4GHz band\r\n *\r\n *       ed_offset_2g        0  - Default energy detect threshold (Default: 0x9)\r\n *                           offset value range: 0x80 to 0x7F\r\n *\r\n * \\note If 5GH enabled then add following parameters\r\n *\r\n *       ed_ctrl_5g          0  - disable EU adaptivity for 5GHz band\r\n *                           1  - enable EU adaptivity for 5GHz band\r\n *\r\n *       ed_offset_5g        0  - Default energy detect threshold(Default: 0xC)\r\n *                           offset value range: 0x80 to 0x7F\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL if failed.\r\n *\r\n */\r\nint wlan_set_uap_ed_mac_mode(wlan_ed_mac_ctrl_t wlan_ed_mac_ctrl);\r\n\r\n/**\r\n * This API can be used to get current ED MAC MODE configuration for station.\r\n *\r\n * \\param[out] wlan_ed_mac_ctrl A pointer to \\ref wlan_ed_mac_ctrl_t\r\n * \t\t\twith parameters mentioned in above set API.\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL if failed.\r\n *\r\n */\r\nint wlan_get_ed_mac_mode(wlan_ed_mac_ctrl_t *wlan_ed_mac_ctrl);\r\n\r\n/**\r\n * This API can be used to get current ED MAC MODE configuration for UAP.\r\n *\r\n * \\param[out] wlan_ed_mac_ctrl A pointer to \\ref wlan_ed_mac_ctrl_t\r\n * \t\t\twith parameters mentioned in above set API.\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL if failed.\r\n *\r\n */\r\nint wlan_get_uap_ed_mac_mode(wlan_ed_mac_ctrl_t *wlan_ed_mac_ctrl);\r\n\r\n/** Set Wi-Fi calibration data in Wi-Fi firmware.\r\n *\r\n * This function may be called to set Wi-Fi calibration data in firmware.\r\n * This should be call before \\ref wlan_init() function.\r\n *\r\n * \\param[in] cal_data The calibration data buffer\r\n * \\param[in] cal_data_size Size of calibration data buffer.\r\n *\r\n */\r\nvoid wlan_set_cal_data(const uint8_t *cal_data, const unsigned int cal_data_size);\r\n\r\n/** Set Wi-Fi MAC Address in Wi-Fi firmware.\r\n *\r\n * This function may be called to set Wi-Fi MAC Address in firmware.\r\n * This should be call before \\ref wlan_init() function.\r\n * When called after Wi-Fi init done, the incoming MAC is treated as the STA MAC address directly. And mac[4] plus 1 the\r\n * modifed MAC as the UAP MAC address.\r\n *\r\n * \\param[in] MAC The MAC Address in 6 byte array format like\r\n *                uint8_t mac[] = { 0x00, 0x50, 0x43, 0x21, 0x19, 0x6E};\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL if failed.\r\n */\r\nint wlan_set_mac_addr(uint8_t *mac);\r\n\r\n/** Set Wi-Fi MAC address for STA in Wi-Fi firmware.\r\n *\r\n * This function may be called to set Wi-Fi MAC address in firmware.\r\n * This should be call before \\ref wlan_init() function.\r\n * When called after Wi-Fi init done, it can set only STA MAC adderess.\r\n *\r\n * \\param[in] MAC The MAC Address in 6 byte array format like\r\n *                uint8_t mac[] = { 0x00, 0x50, 0x43, 0x21, 0x19, 0x6E};\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL if failed.\r\n */\r\nint wlan_set_sta_mac_addr(uint8_t *mac);\r\n\r\n/** Set Wi-Fi MAC address for UAP in Wi-Fi firmware.\r\n *\r\n * This function may be called to set Wi-Fi MAC address in firmware.\r\n * This should be call before \\ref wlan_init() function.\r\n * When called after Wi-Fi init done, it can set only UAP MAC address.\r\n *\r\n * \\param[in] MAC The MAC Address in 6 byte array format like\r\n *                uint8_t mac[] = { 0x00, 0x50, 0x43, 0x21, 0x19, 0x6E};\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL if failed.\r\n */\r\nint wlan_set_uap_mac_addr(uint8_t *mac);\r\n\r\n#if CONFIG_WMM_UAPSD\r\n/** Set QOS info in Wi-Fi firmware.\r\n *\r\n * \\param[in] qos_info UAPSD (unscheduled automatic power save delivery) QOS info.\r\n * \\param[in] action Set/get action.\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL if failed.\r\n */\r\nint wlan_wmm_uapsd_qosinfo(t_u8 *qos_info, t_u8 action);\r\n/** Enable/Disable UAPSD in Wi-Fi firmware.\r\n *\r\n * \\param[in] UAPsd_enable Enable/Disable UAPSD.\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL if failed.\r\n */\r\nint wlan_set_wmm_uapsd(t_u8 UAPsd_enable);\r\n/** Set/get UAPSD sleep period in Wi-Fi firmware.\r\n *\r\n * \\param[in] sleep_period UAPSD sleep period.\r\n * \\param[in] action Set/get action.\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL if failed.\r\n */\r\nint wlan_sleep_period(unsigned int *sleep_period, t_u8 action);\r\n/** Check whether UAPSD is enabled or not.\r\n *\r\n * \\return true if UAPSD is enabled.\r\n * \\return false if UAPSD is disabled.\r\n */\r\nt_u8 wlan_is_wmm_uapsd_enabled(void);\r\n#endif\r\n\r\n#if CONFIG_WIFI_TX_BUFF\r\n/** Reconfigure Wi-Fi TX buffer size in Wi-Fi firmware.\r\n *\r\n * This function may be called to reconfigure Wi-Fi TX buffer size in firmware.\r\n * This should be call before \\ref wlan_init() function.\r\n *\r\n * \\param[in] buf_size The new buffer size\r\n *\r\n * \\param[in] bss_type 0: STA, 1: UAP\r\n *\r\n */\r\nvoid wlan_recfg_tx_buf_size(uint16_t buf_size, mlan_bss_type bss_type);\r\n#endif\r\n\r\n#if CONFIG_WIFI_TX_PER_TRACK\r\n/** Set TX per tracking config.\r\n * This function may be called to set TX per tracking in firmware.\r\n *\r\n * \\param[in] tx_pert User configured parameters of TX per tracking\r\n *            period, ratio and number of TX packets.\r\n *\r\n * \\param[in] bss_type BSS type for STA or UAP.\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL if failed.\r\n */\r\nvoid wlan_set_tx_pert(struct wlan_tx_pert_info *tx_pert, mlan_bss_type bss_type);\r\n#endif\r\n\r\n#if CONFIG_TX_RX_HISTOGRAM\r\n/** Set TX RX histogram config.\r\n * This function may be called to set TX RX histogram config.\r\n *\r\n * \\param[in] txrx_histogram User configured parameters of TX RX histogram.\r\n *            including enable and action.\r\n * \\param[out] data TX RX histogram data from FW.\r\n */\r\nvoid wlan_set_txrx_histogram(struct wlan_txrx_histogram_info *txrx_histogram, t_u8 *data);\r\n#endif\r\n\r\n#if CONFIG_ROAMING\r\n/** Set soft roaming config.\r\n *\r\n * This function may be called to enable/disable soft roaming\r\n * by specifying the RSSI threshold.\r\n *\r\n * \\note <b>RSSI Threshold setting for soft roaming</b>:\r\n * The provided RSSI low threshold value is used to subscribe\r\n * RSSI low event from firmware, on reception of this event\r\n * background scan is started in firmware with same RSSI\r\n * threshold to find out APs with better signal strength than\r\n * RSSI threshold.\r\n *\r\n * If AP is found then roam attempt is initiated, otherwise\r\n * background scan started again till limit reaches to\r\n * BG_SCAN_LIMIT.\r\n *\r\n * If still AP is not found then Wi-Fi connection manager sends\r\n * \\ref WLAN_REASON_BGSCAN_NETWORK_NOT_FOUND event to\r\n * application. In this case,\r\n * if application again wants to use soft roaming then it\r\n * can call this API again or use\r\n * \\ref wlan_set_rssi_low_threshold API to set RSSI low\r\n * threshold again.\r\n *\r\n * \\param[in] enable Enable/Disable roaming.\r\n * \\param[in] rssi_low_threshold RSSI low threshold value\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL if failed.\r\n */\r\nint wlan_set_roaming(const int enable, const uint8_t rssi_low_threshold);\r\n\r\n/** Get roaming status.\r\n *\r\n * \\return 1 if roaming is enabled.\r\n * \\return 0 if roaming is disbled.\r\n */\r\nint wlan_get_roaming_status(void);\r\n#endif\r\n\r\n#if CONFIG_HOST_SLEEP\r\n#ifdef RW610\r\n/** Wowlan (wake on wireless LAN) configure.\r\n * This function may be called to config host sleep in firmware.\r\n *\r\n * \\param[in] is_mef Flag to indicate use MEF (memory efficient filtering) condition or not.\r\n * \\param[in] wake_up_conds Bit map of default condition.\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL if failed.\r\n */\r\nint wlan_wowlan_config(uint8_t is_mef, t_u32 wake_up_conds);\r\n\r\n/** Host sleep configure.\r\n * This function may be called to config host sleep in firmware.\r\n *\r\n * \\param[in] is_manual Flag to indicate host enter low power mode with power manager or by command.\r\n * \\param[in] is_periodic Flag to indicate host enter low power periodically or once with power manager.\r\n */\r\nvoid wlan_config_host_sleep(bool is_manual, t_u8 is_periodic);\r\n\r\n/** This function sent host sleep events to mon_thread\r\n * \\param[in] id Event ID.\r\n * \\param[in] data Pointer to event msg.\r\n * \\return kStatus_Success if successful else return -WM_FAIL.\r\n */\r\nstatus_t wlan_hs_send_event(int id, void *data);\r\n#endif /*RW610*/\r\n\r\n/** Cancel host sleep.\r\n * This function may be called to cancel host sleep in firmware.\r\n */\r\nvoid wlan_cancel_host_sleep(void);\r\n\r\n/** Clear host sleep configurations in driver.\r\n * This function clears all the host sleep related configures in driver.\r\n */\r\nvoid wlan_clear_host_sleep_config(void);\r\n\r\n/** This function set multicast MEF (memory efficient filtering) entry\r\n *\r\n * \\param[in] mef_action To be 0--discard and not wake host, 1--discard and wake host 3--allow and wake host.\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL if failed.\r\n */\r\nint wlan_set_multicast(t_u8 mef_action);\r\n#endif\r\n\r\n/** Set configuration parameters of IEEE power save mode.\r\n *\r\n * \\param [in] ps_cfg Power save configuratiuon includes multiple parameters.\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL if failed.\r\n */\r\nint wlan_set_ieeeps_cfg(struct wlan_ieeeps_config *ps_cfg);\r\n\r\n/** Configure listen interval of IEEE power save mode.\r\n *\r\n * \\note <b>Delivery traffic indication message (DTIM)</b>:\r\n * It is a concept in 802.11\r\n * It is a time duration after which AP can send out buffered\r\n * BROADCAST / MULTICAST data and stations connected to the AP\r\n * should wakeup to take this broadcast / multicast data.\r\n\r\n * \\note <b>Traffic Indication Map (TIM)</b>:\r\n * It is a bitmap which the AP sends with each beacon.\r\n * The bitmap has one bit each for a station connected to AP.\r\n *\r\n * \\note Each station is recognized by an association ID (AID).\r\n * If AID is say 1 bit number 1 is set in the bitmap if\r\n * unicast data is present with AP in its buffer for station with AID = 1\r\n * Ideally AP does not buffer any unicast data it just sends\r\n * unicast data to the station on every beacon when station\r\n * is not sleeping.\\n\r\n * When broadcast data / multicast data is to be send AP sets bit 0\r\n * of TIM indicating broadcast / multicast.\\n\r\n * The occurrence of DTIM is defined by AP.\\n\r\n * Each beacon has a number indicating period at which DTIM occurs.\\n\r\n * The number is expressed in terms of number of beacons.\\n\r\n * This period is called DTIM Period / DTIM interval.\\n\r\n * For example:\\n\r\n *     If AP has DTIM period = 3 the stations connected to AP\r\n *     have to wake up (if they are sleeping) to receive\r\n *     broadcast /multicast data on every third beacon.\\n\r\n * Generic:\\n\r\n *     When DTIM period is X\r\n *     AP buffers broadcast data / multicast data for X beacons.\r\n *     Then it transmits the data no matter whether station is awake or not.\\n\r\n * Listen interval:\\n\r\n * This is time interval on station side which indicates when station\r\n * can be awake to listen i.e. accept data.\\n\r\n * Long listen interval:\\n\r\n * It comes into picture when station sleeps (IEEEPS) and it does\r\n * not want to wake up on every DTIM\r\n * So station is not worried about broadcast data/multicast data\r\n * in this case.\\n\r\n * This should be a design decision what should be chosen\r\n * Firmware suggests values which are about 3 times DTIM\r\n * at the max to gain optimal usage and reliability.\\n\r\n * In the IEEEPS power save mode, the Wi-Fi firmware goes to sleep and\r\n * periodically wakes up to check if the AP has any pending packets for it. A\r\n * longer listen interval implies that the Wi-Fi card stays in power save for a\r\n * longer duration at the cost of additional delays while receiving data.\r\n * Note that choosing incorrect value for listen interval\r\n * causes poor response from device during data transfer.\r\n * Actual listen interval selected by firmware is equal to closest DTIM.\\n\r\n * For e.g.:-\\n\r\n *            AP beacon period : 100 ms\\n\r\n *            AP DTIM period : 2\\n\r\n *            Application request value: 500ms\\n\r\n *            Actual listen interval = 400ms (This is the closest DTIM).\r\n * Actual listen interval set should be a multiple of DTIM closest to but\r\n * lower than the value provided by the application.\\n\r\n *\r\n *  \\note This API can be called before/after association.\r\n *  The configured listen interval can be used in subsequent association\r\n *  attempt.\r\n *\r\n *  \\param [in]  listen_interval Listen interval as below\\n\r\n *               0 : Unchanged,\\n\r\n *              -1 : Disable,\\n\r\n *             1-49: Value in beacon intervals,\\n\r\n *            >= 50: Value in TUs\\n\r\n */\r\nvoid wlan_configure_listen_interval(int listen_interval);\r\n\r\n/** Set timeout configuration before Wi-Fi power save mode.\r\n *\r\n * \\param [in] timeout_ms timout time, in milliseconds.\r\n *\r\n */\r\nvoid wlan_configure_delay_to_ps(unsigned int timeout_ms);\r\n\r\n/** Get listen interval .\r\n *\r\n * \\return listen interval value.\r\n *\r\n */\r\nunsigned short wlan_get_listen_interval(void);\r\n\r\n/** Get delay time for Wi-Fi power save mode.\r\n *\r\n * \\return delay time value.\r\n *\r\n */\r\nunsigned int wlan_get_delay_to_ps(void);\r\n\r\n/** Check whether Wi-Fi power save is enabled.\r\n *\r\n * \\return TRUE if Wi-Fi power save is enable, else return FALSE.\r\n *\r\n */\r\nbool wlan_is_power_save_enabled(void);\r\n\r\n/** Configure NULL packet interval of IEEE power save mode.\r\n *\r\n *  \\note In IEEE PS (power save) station sends a NULL packet to AP to indicate that\r\n *  the station is alive and AP should not kick it off.\r\n *  If null packet is not send some APs may disconnect station\r\n *  which might lead to a loss of connectivity.\r\n *  The time is specified in seconds.\r\n *  Default value is 30 seconds.\r\n *\r\n *  \\note This API should be called before configuring IEEE Power save.\r\n *\r\n *  \\param [in] time_in_secs : -1 Disables null packet transmission,\r\n *                              0  Null packet interval is unchanged,\r\n *                              n  Null packet interval in seconds.\r\n */\r\nvoid wlan_configure_null_pkt_interval(int time_in_secs);\r\n\r\n#ifndef RW610\r\n/** This API can be used to set the mode of TX/RX antenna.\r\n * If SAD (slow antenna diversity) is enabled, this API can also used to set SAD antenna\r\n * evaluate time interval(antenna mode is antenna diversity\r\n * when set SAD evaluate time interval).\r\n *\r\n * \\param[in] ant Antenna valid values are 1, 2 and 65535\r\n *                1 : TX/RX antenna 1\r\n *                2 : TX/RX antenna 2\r\n *\t          0xFFFF: TX/RX antenna diversity\r\n * \\param[in] evaluate_time\r\n *\t      SAD (slow antenna diversity) evaluate time interval, default value is 6s(0x1770).\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n * \\return WLAN_ERROR_STATE if unsuccessful.\r\n *\r\n */\r\nint wlan_set_antcfg(uint32_t ant, uint16_t evaluate_time);\r\n\r\n/** This API can be used to get the mode of TX/RX antenna.\r\n * If SAD (slow antenna diversity) is enabled, this API can also used to get SAD antenna\r\n * evaluate time interval(antenna mode is antenna diversity\r\n * when set SAD evaluate time interval).\r\n *\r\n * \\param[out] ant pointer to antenna variable.\r\n * \\param[out] evaluate_time pointer to evaluate_time variable for SAD.\r\n * \\param[out] current_antenna pointer to current antenna.\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n * \\return WLAN_ERROR_STATE if unsuccessful.\r\n */\r\nint wlan_get_antcfg(uint32_t *ant, uint16_t *evaluate_time, uint16_t *current_antenna);\r\n#else\r\n/** This API can be used to set the mode of TX/RX antenna.\r\n * If SAD is enabled, this API can also used to set SAD antenna\r\n * evaluate time interval(antenna mode is antenna diversity\r\n * when set SAD evaluate time interval).\r\n *\r\n * \\param[in] ant Antenna valid values are 1, 2 and 65535\r\n *                1 : TX/RX antenna 1\r\n *                2 : TX/RX antenna 2\r\n *\t          0xFFFF: TX/RX antenna diversity\r\n * \\param[in] evaluate_time\r\n *\t      SAD evaluate time interval, default value is 6s(0x1770).\r\n *  \\param[in] evaluate_mode\r\n *\t            0: PCB Ant  + Ext Ant0\r\n *              1: Ext Ant0 + Ext Ant1\r\n *              2: PCB Ant  + Ext Ant1\r\n *           0xFF: Default divisity mode.\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n * \\return WLAN_ERROR_STATE if unsuccessful.\r\n *\r\n */\r\nint wlan_set_antcfg(uint32_t ant, uint16_t evaluate_time, uint8_t evaluate_mode);\r\n\r\n/** This API can be used to get the mode of TX/RX antenna.\r\n * If SAD is enabled, this API can also used to get SAD antenna\r\n * evaluate time interval(antenna mode is antenna diversity\r\n * when set SAD evaluate time interval).\r\n *\r\n * \\param[out] ant pointer to antenna variable.\r\n * \\param[out] evaluate_time pointer to evaluate_time variable for SAD.\r\n * \\param[out] current_mode pointer to evaluate_mode.\r\n * \\param[out] current_antenna pointer to current antenna.\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n * \\return WLAN_ERROR_STATE if unsuccessful.\r\n */\r\nint wlan_get_antcfg(uint32_t *ant, uint16_t *evaluate_time, uint8_t *evaluate_mode, uint16_t *current_antenna);\r\n#endif /*RW610*/\r\n\r\n/** Get the Wi-Fi firmware version extension string.\r\n *\r\n * \\note This API does not allocate memory for pointer.\r\n *       It just returns pointer of WLCMGR internal static\r\n *       buffer. So no need to free the pointer by caller.\r\n *\r\n * \\return Wi-Fi firmware version extension string pointer stored in\r\n *         WLCMGR\r\n */\r\nchar *wlan_get_firmware_version_ext(void);\r\n\r\n/** Use this API to print Wi-Fi driver and firmware extended version.\r\n */\r\nvoid wlan_version_extended(void);\r\n\r\n/**\r\n * Use this API to get the TSF (timing synchronization function) from Wi-Fi firmware.\r\n *\r\n * \\param[in] tsf_high Pointer to store TSF higher 32bits.\r\n * \\param[in] tsf_low Pointer to store TSF lower 32bits.\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n *\r\n */\r\nint wlan_get_tsf(uint32_t *tsf_high, uint32_t *tsf_low);\r\n\r\n/** Enable IEEE power save with host sleep configuration\r\n *\r\n * When enabled, it opportunistically puts the Wi-Fi card into IEEE power save mode.\r\n * Before putting the Wi-Fi card in power\r\n * save this also sets the hostsleep configuration on the card as\r\n * specified. This makes the card generate a wakeup for the processor if\r\n * any of the wakeup conditions are met.\r\n *\r\n * \\param[in] wakeup_conditions conditions to wake the host. This should\r\n *            be a logical OR of the conditions in \\ref wlan_wakeup_event_t.\r\n *            Typically devices would want to wake up on\r\n *            \\ref WAKE_ON_ALL_BROADCAST,\r\n *            \\ref WAKE_ON_UNICAST,\r\n *            \\ref WAKE_ON_MAC_EVENT.\r\n *            \\ref WAKE_ON_MULTICAST,\r\n *            \\ref WAKE_ON_ARP_BROADCAST,\r\n *            \\ref WAKE_ON_MGMT_FRAME\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL otherwise.\r\n *\r\n */\r\nint wlan_ieeeps_on(unsigned int wakeup_conditions);\r\n\r\n/** Turn off IEEE power save mode.\r\n *\r\n * \\note This call is asynchronous. The system exits the power save mode\r\n *       only when all requisite conditions are met.\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL otherwise.\r\n *\r\n */\r\nint wlan_ieeeps_off(void);\r\n\r\n#if !CONFIG_WPA_SUPP\r\n#if (CONFIG_WNM_PS)\r\n/** Enable WNM with host sleep configuration\r\n *\r\n * When enabled, it opportunistically puts the Wi-Fi card into IEEE PS (power save) mode.\r\n * Before putting the Wi-Fi card in power\r\n * save this also sets the hostsleep configuration on the card as\r\n * specified. This makes the card generate a wakeup for the processor if\r\n * any of the wakeup conditions are met.\r\n *\r\n * \\param[in] wakeup_conditions conditions to wake the host. This should\r\n *            be a logical OR of the conditions in \\ref wlan_wakeup_event_t.\r\n *            Typically devices would want to wake up on\r\n *            \\ref WAKE_ON_ALL_BROADCAST,\r\n *            \\ref WAKE_ON_UNICAST,\r\n *            \\ref WAKE_ON_MAC_EVENT.\r\n *            \\ref WAKE_ON_MULTICAST,\r\n *            \\ref WAKE_ON_ARP_BROADCAST,\r\n *            \\ref WAKE_ON_MGMT_FRAME\r\n * \\param[in] wnm_sleep_time wnm sleep interval.(number of dtims)\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL otherwise.\r\n *\r\n */\r\nint wlan_wnmps_on(unsigned int wakeup_conditions, t_u16 wnm_sleep_time);\r\n\r\n/** Turn off WNM power save mode.\r\n *\r\n * \\note This call is asynchronous. The system exits the power save mode\r\n *       only when all requisite conditions are met.\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL otherwise.\r\n *\r\n */\r\nint wlan_wnmps_off(void);\r\n#endif\r\n#endif\r\n\r\n/** Turn on deep sleep power save mode.\r\n *\r\n * \\note This call is asynchronous. The system enters the power save mode\r\n * only when all requisite conditions are meet. For example, Wi-Fi should be\r\n * disconnected for this to work.\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL otherwise.\r\n *\r\n */\r\nint wlan_deepsleepps_on(void);\r\n\r\n/** Turn off deep sleep power save mode.\r\n *\r\n * \\note This call is asynchronous. The system exits the power save mode\r\n *       only when all requisite conditions are met.\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL otherwise.\r\n *\r\n */\r\nint wlan_deepsleepps_off(void);\r\n\r\n/**\r\n * Use this API to configure the TCP keep alive parameters in Wi-Fi firmware.\r\n * \\ref wlan_tcp_keep_alive_t provides the parameters which are available\r\n * for configuration.\r\n *\r\n * \\note To reset current TCP keep alive configuration just pass the reset with\r\n * value 1, all other parameters are ignored in this case.\r\n *\r\n * \\note Note that this API is called after successful connection\r\n * and before putting Wi-Fi card in IEEE power save mode.\r\n *\r\n * \\param[in] keep_alive A pointer to \\ref wlan_tcp_keep_alive_t\r\n * \t\twith following parameters.\r\n * \t         enable Enable keep alive\r\n *               reset  Reset keep alive\r\n *   \t         timeout Keep alive timeout\r\n *   \t         interval Keep alive interval\r\n *               max_keep_alives Maximum keep alives\r\n *   \t\t dst_mac Destination MAC address\r\n *   \t\t dst_ip Destination IP\r\n *   \t\t dst_tcp_port Destination TCP port\r\n *   \t\t src_tcp_port Source TCP port\r\n *   \t\t seq_no Sequence number\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n */\r\nint wlan_tcp_keep_alive(wlan_tcp_keep_alive_t *keep_alive);\r\n\r\n\r\n/**\r\n * Use this API to get the beacon period of associated BSS.\r\n *\r\n * \\return beacon_period if operation is successful.\r\n * \\return 0 if command fails.\r\n */\r\nuint16_t wlan_get_beacon_period(void);\r\n\r\n/**\r\n * Use this API to get the dtim period of associated BSS.\r\n *\r\n * \\return dtim_period if operation is successful.\r\n * \\return 0 if DTIM IE Is not found in AP's Probe response.\r\n * \\note This API should not be called from Wi-Fi event handler\r\n *        registered by application during \\ref wlan_start.\r\n */\r\nuint8_t wlan_get_dtim_period(void);\r\n\r\n/**\r\n * Use this API to get the current TX and RX rates along with\r\n * bandwidth and guard interval information if rate is 802.11n.\r\n *\r\n * \\param[in] ds_rate A pointer to structure which has\r\n *            tx, RX rate information along with bandwidth and guard\r\n *\t      interval information.\r\n *\r\n * \\param[in] bss_type 0: STA, 1: UAP\r\n *\r\n * \\note If rate is greater than 11 then it is 802.11n rate and from 12\r\n *       MCS0 rate starts. The bandwidth mapping is like value 0 is for\r\n *\t 20MHz, 1 is 40MHz, 2 is for 80MHz.\r\n *\t The guard interval value zero means Long otherwise Short.\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n */\r\nint wlan_get_data_rate(wlan_ds_rate *ds_rate, mlan_bss_type bss_type);\r\n\r\n/**\r\n * Use this API to get the set management frame protection parameters for sta.\r\n *\r\n * \\param[out] mfpc: Management frame protection capable (MFPC)\r\n *                       1: Management frame protection capable\r\n *                       0: Management frame protection not capable\r\n * \\param[out] mfpr: Management frame protection required (MFPR)\r\n *                       1: Management frame protection required\r\n *                       0: Management frame protection optional\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n */\r\nint wlan_get_pmfcfg(uint8_t *mfpc, uint8_t *mfpr);\r\n\r\n/**\r\n * Use this API to get the set management frame protection parameters for UAP.\r\n *\r\n * \\param[out] mfpc: Management frame protection capable (MFPC)\r\n *                       1: management frame protection capable.\r\n *                       0: management frame protection not capable.\r\n * \\param[out] mfpr: Management frame protection required (MFPR)\r\n *                       1: management frame protection required.\r\n *                       0: management frame protection optional.\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n */\r\nint wlan_uap_get_pmfcfg(uint8_t *mfpc, uint8_t *mfpr);\r\n\r\n\r\n/**\r\n * Use this API to set packet filters in Wi-Fi firmware.\r\n *\r\n * \\param[in] flt_cfg A pointer to structure which holds the\r\n *\t      the packet filters in same way as given below.\\n\r\n *\r\n * MEF Configuration command\\n\r\n * mefcfg={\\n\r\n * Criteria: bit0-broadcast, bit1-unicast, bit3-multicast\\n\r\n * Criteria=2 \t\tUnicast frames are received during hostsleepmode\\n\r\n * NumEntries=1\t\tNumber of activated MEF entries\\n\r\n * mef_entry_0: example filters to match TCP destination port 80 send by 192.168.0.88 pkt or magic pkt.\\n\r\n * mef_entry_0={\\n\r\n *  mode: bit0--hostsleep mode, bit1--non hostsleep mode\\n\r\n *  mode=1\t\tHostSleep mode\\n\r\n *  action: 0--discard and not wake host, 1--discard and wake host 3--allow and wake host\\n\r\n *  action=3\tAllow and Wake host\\n\r\n *  filter_num=3    Number of filter\\n\r\n *   RPN only support \"&&\" and \"||\" operator,space can not be removed between operator.\\n\r\n *   RPN=Filter_0 && Filter_1 || Filter_2\\n\r\n *   Byte comparison filter's type is 0x41,Decimal comparison filter's type is 0x42,\\n\r\n *   Bit comparison filter's type is  0x43\\n\r\n *  Filter_0 is decimal comparison filter, it always with type=0x42\\n\r\n *  Decimal filter always has type, pattern, offset, numbyte 4 field\\n\r\n *  Filter_0 matchs RX packet with TCP destination port 80\\n\r\n *  Filter_0={\\n\r\n *    type=0x42\t      decimal comparison filter\\n\r\n *    pattern=80      80 is the decimal constant to be compared\\n\r\n *    offset=44\t      44 is the byte offset of the field in RX pkt to be compare\\n\r\n *    numbyte=2       2 is the number of bytes of the field\\n\r\n *  }\\n\r\n *  Filter_1 is Byte comparison filter, it always with type=0x41\\n\r\n *  Byte filter always has type, byte, repeat, offset 4 filed\\n\r\n *  Filter_1 matchs RX packet send by IP address 192.168.0.88\\n\r\n *  Filter_1={\\n\r\n *   type=0x41         Byte comparison filter\\n\r\n *   repeat=1          1 copies of 'c0:a8:00:58'\\n\r\n *   byte=c0:a8:00:58  'c0:a8:00:58' is the byte sequence constant with each byte\\n\r\n *   in hex format, with ':' as delimiter between two byte.\\n\r\n *   offset=34         34 is the byte offset of the equal length field of rx'd pkt.\\n\r\n *  }\\n\r\n *  Filter_2 is Magic packet, it can looking for 16 contiguous copies of '00:50:43:20:01:02' from\\n\r\n *  the RX pkt's offset 14\\n\r\n *  Filter_2={\\n\r\n *   type=0x41\t       Byte comparison filter\\n\r\n *   repeat=16         16 copies of '00:50:43:20:01:02'\\n\r\n *   byte=00:50:43:20:01:02  # '00:50:43:20:01:02' is the byte sequence constant\\n\r\n *   offset=14\t       14 is the byte offset of the equal length field of rx'd pkt.\\n\r\n *  }\\n\r\n * }\\n\r\n * }\\n\r\n * Above filters can be set by filling values in following way in \\ref wlan_flt_cfg_t structure.\\n\r\n * wlan_flt_cfg_t flt_cfg;\\n\r\n * uint8_t byte_seq1[] = {0xc0, 0xa8, 0x00, 0x58};\\n\r\n * uint8_t byte_seq2[] = {0x00, 0x50, 0x43, 0x20, 0x01, 0x02};\\n\r\n *\\n\r\n * memset(&flt_cfg, 0, sizeof(wlan_flt_cfg_t));\\n\r\n *\\n\r\n * flt_cfg.criteria = 2;\\n\r\n * flt_cfg.nentries = 1;\\n\r\n *\\n\r\n * flt_cfg.mef_entry.mode = 1;\\n\r\n * flt_cfg.mef_entry.action = 3;\\n\r\n *\\n\r\n * flt_cfg.mef_entry.filter_num = 3;\\n\r\n *\\n\r\n * flt_cfg.mef_entry.filter_item[0].type = TYPE_DNUM_EQ;\\n\r\n * flt_cfg.mef_entry.filter_item[0].pattern = 80;\\n\r\n * flt_cfg.mef_entry.filter_item[0].offset = 44;\\n\r\n * flt_cfg.mef_entry.filter_item[0].num_bytes = 2;\\n\r\n *\\n\r\n * flt_cfg.mef_entry.filter_item[1].type = TYPE_BYTE_EQ;\\n\r\n * flt_cfg.mef_entry.filter_item[1].repeat = 1;\\n\r\n * flt_cfg.mef_entry.filter_item[1].offset = 34;\\n\r\n * flt_cfg.mef_entry.filter_item[1].num_byte_seq = 4;\\n\r\n * memcpy(flt_cfg.mef_entry.filter_item[1].byte_seq, byte_seq1, 4);\\n\r\n * flt_cfg.mef_entry.rpn[1] = RPN_TYPE_AND;\\n\r\n *\\n\r\n * flt_cfg.mef_entry.filter_item[2].type = TYPE_BYTE_EQ;\\n\r\n * flt_cfg.mef_entry.filter_item[2].repeat = 16;\\n\r\n * flt_cfg.mef_entry.filter_item[2].offset = 14;\\n\r\n * flt_cfg.mef_entry.filter_item[2].num_byte_seq = 6;\\n\r\n * memcpy(flt_cfg.mef_entry.filter_item[2].byte_seq, byte_seq2, 6);\\n\r\n * flt_cfg.mef_entry.rpn[2] = RPN_TYPE_OR;\\n\r\n *\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n */\r\nint wlan_set_packet_filters(wlan_flt_cfg_t *flt_cfg);\r\n\r\n/**\r\n * Use this API to enable ARP (address resolution protocol) offload in Wi-Fi firmware\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n */\r\nint wlan_set_auto_arp(void);\r\n\r\n\r\n/**\r\n * Use this API to enable WOWLAN (wake-on-wireless-LAN) on magic packet RX in Wi-Fi firmware\r\n *\r\n * \\param[in] ptn_cfg A pointer to \\ref wlan_wowlan_ptn_cfg_t containing wake on Wi-Fi pattern configuration\r\n *\r\n *\\return WM_SUCCESS if operation is successful.\r\n *\\return -WM_FAIL if command fails\r\n */\r\nint wlan_wowlan_cfg_ptn_match(wlan_wowlan_ptn_cfg_t *ptn_cfg);\r\n/**\r\n * Use this API to enable NS offload in Wi-Fi firmware.\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n */\r\nint wlan_set_ipv6_ns_offload(void);\r\n\r\n#if CONFIG_HOST_SLEEP\r\n\r\n/** WLCMGR host sleep pre configuration */\r\nvoid wlan_hs_pre_cfg(void);\r\n\r\n/** WLCMGR host sleep post configuration */\r\nvoid wlan_hs_post_cfg(void);\r\n\r\n/**\r\n * Use this API to configure host sleep params in Wi-Fi firmware.\r\n *\r\n * \\param[in] wakeup_condition  bit 0: WAKE_ON_ALL_BROADCAST\r\n *                              bit 1: WAKE_ON_UNICAST\r\n *                              bit 2: WAKE_ON_MAC_EVENT\r\n *                              bit 3: WAKE_ON_MULTICAST\r\n *                              bit 4: WAKE_ON_ARP_BROADCAST\r\n *                              bit 6: WAKE_ON_MGMT_FRAME\r\n *                              All bit 0 discard and not wakeup host\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n */\r\nint wlan_send_host_sleep(uint32_t wakeup_condition);\r\n\r\n/**\r\n * Use this API to get host sleep wakeup reason from Wi-Fi firmware.\r\n *\r\n * \\param[out] hs_wakeup_reason wakeupReason:\r\n *                              0: unknown\r\n *                              1: Broadcast data matched\r\n *                              2: Multicast data matched\r\n *                              3: Unicast data matched\r\n *                              4: Maskable event matched\r\n *                              5. Non-maskable event matched\r\n *                              6: Non-maskable condition matched (EAPoL rekey)\r\n *                              7: Magic pattern matched\r\n *                              Others: reserved. (set to 0)\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n */\r\nint wlan_get_wakeup_reason(uint16_t *hs_wakeup_reason);\r\n#endif\r\n\r\n/**\r\n * Use this API to get the BSSID of associated BSS.\r\n *\r\n * \\param[in] bssid A pointer to array to store the BSSID.\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n */\r\nint wlan_get_current_bssid(uint8_t *bssid);\r\n\r\n/**\r\n * Use this API to get the channel number of associated BSS.\r\n *\r\n * \\return channel number if operation is successful.\r\n * \\return 0 if command fails.\r\n */\r\nuint8_t wlan_get_current_channel(void);\r\n\r\n#if CONFIG_WIFI_GET_LOG\r\n/**\r\n * Use this API to get the various statistics of STA from Wi-Fi firmware like\r\n * number of beacons received, missed and so on.\r\n *\r\n * \\param[in] stats A pointer to structure where stats collected from Wi-Fi firmware\r\n *\t      can be copied.\r\n * \\note Explore the elements of the \\ref wlan_pkt_stats_t strucutre for\r\n * \t more information on stats.\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n */\r\nint wlan_get_log(wlan_pkt_stats_t *stats);\r\n\r\n/**\r\n * Use this API to get the various statistics of UAP from Wi-Fi firmware like\r\n * number of beacons received, missed and so on.\r\n *\r\n * \\param[in] stats A pointer to structure where stats collected from Wi-Fi firmware\r\n *\t      can be copied.\r\n * \\note  explore the elements of the \\ref wlan_pkt_stats_t strucutre for\r\n * \t more information on stats.\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n */\r\nint wlan_uap_get_log(wlan_pkt_stats_t *stats);\r\n#endif\r\n\r\n/** Get station interface power save mode.\r\n *\r\n * \\param[out] ps_mode A pointer to \\ref wlan_ps_mode where station interface\r\n * \t      power save mode should be stored.\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_E_INVAL if \\a ps_mode was NULL.\r\n */\r\nint wlan_get_ps_mode(enum wlan_ps_mode *ps_mode);\r\n\r\n/** Send message to Wi-Fi connection manager thread.\r\n *\r\n * \\param[in] event An event from \\ref wifi_event.\r\n * \\param[in] reason A reason code.\r\n * \\param[in] data A pointer to data buffer associated with event.\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_FAIL if failed.\r\n */\r\nint wlan_wlcmgr_send_msg(enum wifi_event event, enum wifi_event_reason reason, void *data);\r\n\r\n/** Register WFA basic Wi-Fi CLI (command line input) commands\r\n *\r\n * This function registers basic Wi-Fi CLI commands like showing\r\n * version information, MAC address.\r\n *\r\n * \\note This function can only be called by the application after\r\n * \\ref wlan_init() called.\r\n *\r\n * \\return WLAN_ERROR_NONE if the CLI commands were registered or\r\n * \\return WLAN_ERROR_ACTION if they were not registered (for example\r\n *   if this function was called while the CLI commands were already\r\n *   registered).\r\n */\r\nint wlan_wfa_basic_cli_init(void);\r\n\r\n/** Unregister WFA basic Wi-Fi CLI (command line input) commands\r\n *\r\n * This function unregisters basic Wi-Fi CLI commands like showing\r\n * version information, MAC address.\r\n *\r\n * \\note This function can only be called by the application after\r\n * \\ref wlan_init() called.\r\n *\r\n * \\return WLAN_ERROR_NONE if the CLI commands were unregistered or\r\n * \\return WLAN_ERROR_ACTION if they were not unregistered\r\n */\r\nint wlan_wfa_basic_cli_deinit(void);\r\n\r\n/** Register basic Wi-Fi CLI (command line input) commands\r\n *\r\n * This function registers basic Wi-Fi CLI commands like showing\r\n * version information, MAC address.\r\n *\r\n * \\note This function can only be called by the application after\r\n * \\ref wlan_init() called.\r\n *\r\n * \\note This function gets called by \\ref wlan_cli_init(), hence\r\n * only one function out of these two functions should be called in\r\n * the application.\r\n *\r\n * \\return WLAN_ERROR_NONE if the CLI commands were registered or\r\n * \\return WLAN_ERROR_ACTION if they were not registered (for example\r\n *   if this function was called while the CLI commands were already\r\n *   registered).\r\n */\r\nint wlan_basic_cli_init(void);\r\n\r\n/** Unregister basic Wi-Fi CLI commands\r\n *\r\n * This function unregisters basic Wi-Fi CLI commands like showing\r\n * version information, MAC address.\r\n *\r\n * \\note This function can only be called by the application after\r\n * \\ref wlan_init() called.\r\n *\r\n * \\note This function gets called by \\ref wlan_cli_init(), hence\r\n * only one function out of these two functions should be called in\r\n * the application.\r\n *\r\n * \\return WLAN_ERROR_NONE if the CLI commands were unregistered or\r\n * \\return WLAN_ERROR_ACTION if they were not unregistered (for example\r\n *   if this function was called while the CLI commands were already\r\n *   registered).\r\n */\r\nint wlan_basic_cli_deinit(void);\r\n\r\n/** Register Wi-Fi CLI (command line input) commands.\r\n *\r\n *  Try to register the Wi-Fi CLI commands with the CLI subsystem. This\r\n *  function is available for the application for use.\r\n *\r\n *  \\note This function can only be called by the application after \\ref wlan_init()\r\n *  called.\r\n *\r\n *  \\note This function internally calls \\ref wlan_basic_cli_init(), hence\r\n *  only one function out of these two functions should be called in\r\n *  the application.\r\n *\r\n *  \\return WM_SUCCESS if the CLI commands were registered or\r\n *  \\return -WM_FAIL if they were not (for example if this function\r\n *          was called while the CLI commands were already registered).\r\n */\r\nint wlan_cli_init(void);\r\n\r\n/** Unregister Wi-Fi CLI commands.\r\n *\r\n *  Try to unregister the Wi-Fi CLI commands with the CLI subsystem. This\r\n *  function is available for the application for use.\r\n *\r\n *  \\note This function can only be called by the application after \\ref wlan_init()\r\n *  called.\r\n *\r\n *  \\note This function internally calls \\ref wlan_basic_cli_deinit(), hence\r\n *  only one function out of these two functions should be called in\r\n *  the application.\r\n *\r\n *  \\return WM_SUCCESS if the CLI commands were unregistered or\r\n *  \\return -WM_FAIL if they were not (for example if this function\r\n *          was called while the CLI commands were already unregistered).\r\n */\r\nint wlan_cli_deinit(void);\r\n\r\n/** Register Wi-Fi enhanced CLI commands.\r\n *\r\n *  Register the Wi-Fi enhanced CLI commands like set or get tx-power,\r\n *  tx-datarate, tx-modulation etc with the CLI subsystem.\r\n *\r\n *  \\note This function can only be called by the application after \\ref wlan_init()\r\n *  called.\r\n *\r\n *  \\return WM_SUCCESS if the CLI commands were registered or\r\n *  \\return -WM_FAIL if they were not (for example if this function\r\n *           was called while the CLI commands were already registered).\r\n */\r\nint wlan_enhanced_cli_init(void);\r\n\r\n/** Unregister Wi-Fi enhanced CLI commands.\r\n *\r\n *  Unregister the Wi-Fi enhanced CLI commands like set or get tx-power,\r\n *  tx-datarate, tx-modulation etc with the CLI subsystem.\r\n *\r\n *  \\note This function can only be called by the application after \\ref wlan_init()\r\n *  called.\r\n *\r\n *  \\return WM_SUCCESS if the CLI commands were unregistered or\r\n *  \\return -WM_FAIL if they were not unregistered.\r\n */\r\n\r\nint wlan_enhanced_cli_deinit(void);\r\n\r\n#if CONFIG_RF_TEST_MODE\r\n/** Register Wi-Fi test mode CLI commands.\r\n *\r\n *  Register the Wi-Fi test mode CLI commands like set or get channel,\r\n *  band, bandwidth, per and more with the CLI subsystem.\r\n *\r\n *  \\note This function can only be called by the application after \\ref wlan_init()\r\n *  called.\r\n *\r\n *  \\return WM_SUCCESS if the CLI commands were registered or\r\n *  \\return -WM_FAIL if they were not (for example if this function\r\n *           was called while the CLI commands were already registered).\r\n */\r\nint wlan_test_mode_cli_init(void);\r\n\r\n/** Unregister Wi-Fi test mode CLI commands.\r\n *\r\n *  Unregister the Wi-Fi test mode CLI commands like set or get channel,\r\n *  band, bandwidth, PER and more with the CLI subsystem.\r\n *\r\n *  \\note This function can only be called by the application after \\ref wlan_init()\r\n *  called.\r\n *\r\n *  \\return WM_SUCCESS if the CLI commands were unregistered or\r\n *  \\return -WM_FAIL if they were not unregistered\r\n */\r\nint wlan_test_mode_cli_deinit(void);\r\n#endif\r\n\r\n/**\r\n * Get maximum number of Wi-Fi firmware supported stations that\r\n * can be allowed to connect to the UAP.\r\n *\r\n * \\return Maximum number of Wi-Fi firmware supported stations.\r\n *\r\n * \\note Get operation is allowed in any UAP state.\r\n */\r\nunsigned int wlan_get_uap_supported_max_clients(void);\r\n\r\n/**\r\n * Get current maximum number of stations that\r\n * can be allowed to connect to the UAP.\r\n *\r\n * \\param[out] max_sta_num A pointer to variable where current maximum\r\n *             number of stations of UAP interface can be stored.\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_FAIL if unsuccessful.\r\n *\r\n * \\note Get operation is allowed in any UAP state.\r\n */\r\nint wlan_get_uap_max_clients(unsigned int *max_sta_num);\r\n\r\n/**\r\n * Set maximum number of stations that can be allowed to connect to the UAP.\r\n *\r\n * \\param[in] max_sta_num Number of maximum stations for UAP.\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_FAIL if unsuccessful.\r\n *\r\n * \\note Set operation in not allowed in \\ref WLAN_UAP_STARTED state.\r\n */\r\nint wlan_set_uap_max_clients(unsigned int max_sta_num);\r\n\r\n/**\r\n * This API can be used to configure some of parameters in HT capability infomation IE\r\n *       (such as short GI, channel bandwidth, and green field support)\r\n *\r\n * \\param[in] htcapinfo This is a bitmap and should be used as following\\n\r\n *               Bit 29: Green field Enable/Disable\\n\r\n *               Bit 26: RX STBC Support Enable/Disable. (As we support\\n\r\n *                       single spatial stream only 1 bit is used for RX STBC)\\n\r\n *               Bit 25: TX STBC support Enable/Disable.\\n\r\n *               Bit 24: Short GI in 40 Mhz Enable/Disable\\n\r\n *               Bit 23: Short GI in 20 Mhz Enable/Disable\\n\r\n *               Bit 22: RX LDPC Enable/Disable\\n\r\n *               Bit 17: 20/40 Mhz enable disable.\\n\r\n *               Bit  8: Enable/Disable 40Mhz Intolarent bit in HT capinfo.\\n\r\n *                       0 can reset this bit and 1 can set this bit in\\n\r\n *                       htcapinfo attached in assoc request.\\n\r\n *               All others are reserved and should be set to 0.\\n\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_FAIL if unsuccessful.\r\n *\r\n */\r\nint wlan_set_htcapinfo(unsigned int htcapinfo);\r\n\r\n/**\r\n * This API can be used to configure various 802.11n specific configuration\r\n *       for transmit (such as short GI, channel bandwidth and green field support)\r\n *\r\n * \\param[in] httxcfg This is a bitmap and should be used as following\\n\r\n *               Bit 15-10: Reserved set to 0\\n\r\n *               Bit 9-8: RX STBC set to 0x01\\n\r\n *               BIT9 BIT8  Description\\n\r\n *               0    0     No spatial streams\\n\r\n *               0    1     One spatial streams supported\\n\r\n *               1    0     Reserved\\n\r\n *               1    1     Reserved\\n\r\n *               Bit 7: STBC Enable/Disable\\n\r\n *               Bit 6: Short GI in 40 Mhz Enable/Disable\\n\r\n *               Bit 5: Short GI in 20 Mhz Enable/Disable\\n\r\n *               Bit 4: Green field Enable/Disable\\n\r\n *               Bit 3-2: Reserved set to 1\\n\r\n *               Bit 1: 20/40 Mhz enable disable.\\n\r\n *               Bit 0: LDPC Enable/Disable\\n\r\n *\r\n *       When Bit 1 is set then firmware could transmit in 20Mhz or 40Mhz based\\n\r\n *       on rate adaptation. When this bit is reset then firmware can only\\n\r\n *       transmit in 20Mhz.\\n\r\n *\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_FAIL if unsuccessful.\r\n *\r\n */\r\nint wlan_set_httxcfg(unsigned short httxcfg);\r\n\r\n/**\r\n * This API can be used to set the transmit data rate.\r\n *\r\n * \\note The data rate can be set only after association.\r\n *\r\n * \\param[in] ds_rate struct contains following fields\r\n *             sub_command It should be WIFI_DS_RATE_CFG\r\n *             and rate_cfg should have following parameters.\\n\r\n *              rate_format - This parameter specifies\r\n *                              the data rate format used\r\n *                              in this command\\n\r\n *               0:    LG\\n\r\n *               1:    HT\\n\r\n *               2:    VHT\\n\r\n *               0xff: Auto\\n\r\n *\r\n *              index - This parameter specifies the rate or MCS index\\n\r\n *              If  rate_format is 0 (LG),\\n\r\n *               0       1 Mbps\\n\r\n *               1       2 Mbps\\n\r\n *               2       5.5 Mbps\\n\r\n *               3       11 Mbps\\n\r\n *               4       6 Mbps\\n\r\n *               5       9 Mbps\\n\r\n *               6       12 Mbps\\n\r\n *               7       18 Mbps\\n\r\n *               8       24 Mbps\\n\r\n *               9       36 Mbps\\n\r\n *               10      48 Mbps\\n\r\n *               11      54 Mbps\\n\r\n *              If  rate_format is 1 (HT),\\n\r\n *               0       MCS0\\n\r\n *               1       MCS1\\n\r\n *               2       MCS2\\n\r\n *               3       MCS3\\n\r\n *               4       MCS4\\n\r\n *               5       MCS5\\n\r\n *               6       MCS6\\n\r\n *               7       MCS7\\n\r\n *\t        If STREAM_2X2\\n\r\n *               8       MCS8\\n\r\n *               9       MCS9\\n\r\n *               10      MCS10\\n\r\n *               11      MCS11\\n\r\n *               12      MCS12\\n\r\n *               13      MCS13\\n\r\n *               14      MCS14\\n\r\n *               15      MCS15\\n\r\n *              If  rate_format is 2 (VHT),\\n\r\n *               0       MCS0\\n\r\n *               1       MCS1\\n\r\n *               2       MCS2\\n\r\n *               3       MCS3\\n\r\n *               4       MCS4\\n\r\n *               5       MCS5\\n\r\n *               6       MCS6\\n\r\n *               7       MCS7\\n\r\n *               8       MCS8\\n\r\n *               9       MCS9\\n\r\n *              nss - This parameter specifies the NSS.\\n\r\n *\t\t\tIt is valid only for VHT\\n\r\n *              If  rate_format is 2 (VHT),\\n\r\n *               1       NSS1\\n\r\n *               2       NSS2\\n\r\n *\r\n * \\param[in] bss_type 0: STA, 1: UAP\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_FAIL if unsuccessful.\r\n *\r\n */\r\nint wlan_set_txratecfg(wlan_ds_rate ds_rate, mlan_bss_type bss_type);\r\n\r\n/**\r\n * This API can be used to get the transmit data rate.\r\n *\r\n * \\param[in] ds_rate A pointer to \\ref wlan_ds_rate where TX Rate\r\n * \t\tconfiguration can be stored.\r\n * \\param[in] bss_type 0: STA, 1: UAP\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_FAIL if unsuccessful.\r\n *\r\n */\r\nint wlan_get_txratecfg(wlan_ds_rate *ds_rate, mlan_bss_type bss_type);\r\n\r\n/**\r\n * Get station transmit power\r\n *\r\n * \\param[out] power_level Transmit power level.\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_FAIL if unsuccessful.\r\n *\r\n */\r\nint wlan_get_sta_tx_power(t_u32 *power_level);\r\n\r\n/**\r\n * Set station transmit power\r\n *\r\n * \\param[in] power_level Transmit power level.\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_FAIL if unsuccessful.\r\n *\r\n */\r\nint wlan_set_sta_tx_power(t_u32 power_level);\r\n\r\n/**\r\n * Set world wide safe mode TX power limits\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_FAIL if unsuccessful.\r\n *\r\n */\r\nint wlan_set_wwsm_txpwrlimit(void);\r\n\r\n#ifndef RW610\r\n/**\r\n * Get Wi-Fi region code from TX power config\r\n *\r\n * \\return Wi-Fi region code in string format.\r\n *\r\n */\r\nconst char *wlan_get_wlan_region_code(void);\r\n#endif\r\n\r\n/**\r\n * Get Management IE for given BSS type (interface) and index.\r\n *\r\n * \\param[in] bss_type 0: STA, 1: UAP\r\n * \\param[in] index IE index.\r\n *\r\n * \\param[out] buf Buffer to store requested IE data.\r\n * \\param[out] buf_len To store length of IE data.\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_FAIL if unsuccessful.\r\n *\r\n */\r\nint wlan_get_mgmt_ie(enum wlan_bss_type bss_type, IEEEtypes_ElementId_t index, void *buf, unsigned int *buf_len);\r\n\r\n/**\r\n * Set management IE for given BSS type (interface) and index.\r\n *\r\n * \\param[in] bss_type 0: STA, 1: UAP\r\n * \\param[in] id Type/ID of Management IE.\r\n * \\param[in] buf Buffer containing IE data.\r\n * \\param[in] buf_len Length of IE data.\r\n *\r\n * \\return IE index if successful.\r\n * \\return -WM_FAIL if unsuccessful.\r\n *\r\n */\r\nint wlan_set_mgmt_ie(enum wlan_bss_type bss_type, IEEEtypes_ElementId_t id, void *buf, unsigned int buf_len);\r\n\r\n#ifdef SD8801\r\n/**\r\n * Get external radio coex statistics.\r\n *\r\n * \\param[out] ext_coex_stats A pointer to structure to get coex statistics.\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_FAIL if unsuccessful.\r\n *\r\n */\r\nint wlan_get_ext_coex_stats(wlan_ext_coex_stats_t *ext_coex_stats);\r\n\r\n/**\r\n * Set external radio coex configuration.\r\n *\r\n * \\param[in] ext_coex_config to apply coex configuration.\r\n *\r\n * \\return IE index if successful.\r\n * \\return -WM_FAIL if unsuccessful.\r\n *\r\n */\r\nint wlan_set_ext_coex_config(const wlan_ext_coex_config_t ext_coex_config);\r\n#endif\r\n\r\n/**\r\n * Clear management IE for given BSS type (interface) and index.\r\n *\r\n * \\param[in] bss_type 0: STA, 1: UAP\r\n * \\param[in] index IE index.\r\n * \\param[in] mgmt_bitmap_index management bitmap index.\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_FAIL if unsuccessful.\r\n *\r\n */\r\nint wlan_clear_mgmt_ie(enum wlan_bss_type bss_type, IEEEtypes_ElementId_t index, int mgmt_bitmap_index);\r\n\r\n/**\r\n * Get current status of 802.11d support.\r\n *\r\n * \\return true if 802.11d support is enabled by application.\r\n * \\return false if not enabled.\r\n *\r\n */\r\nbool wlan_get_11d_enable_status(void);\r\n\r\n/**\r\n * Get current RSSI and signal to noise ratio from Wi-Fi firmware.\r\n *\r\n * \\param[in] RSSI A pointer to variable to store current RSSI\r\n * \\param[in] snr A pointer to variable to store current SNR.\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n */\r\nint wlan_get_current_signal_strength(short *rssi, int *snr);\r\n\r\n/**\r\n * Get average RSSI and signal to noise ratio from Wi-Fi firmware.\r\n *\r\n * \\param[in] RSSI A pointer to variable to store current RSSI\r\n * \\param[in] snr A pointer to variable to store current SNR.\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n */\r\nint wlan_get_average_signal_strength(short *rssi, int *snr);\r\n\r\n/**\r\n * This API is used to set/cancel the remain on channel configuration.\r\n *\r\n * \\note When status is false, channel and duration parameters are\r\n * ignored.\r\n *\r\n * \\param[in] bss_type The interface to set channel  bss_type 0: STA, 1: UAP\r\n * \\param[in] status false : Cancel the remain on channel configuration\r\n *                   true : Set the remain on channel configuration\r\n * \\param[in] channel The channel to configure\r\n * \\param[in] duration The duration for which to\r\n *\t      remain on channel in milliseconds.\r\n *\r\n * \\return WM_SUCCESS on success or error code.\r\n *\r\n */\r\nint wlan_remain_on_channel(const enum wlan_bss_type bss_type,\r\n                           const bool status,\r\n                           const uint8_t channel,\r\n                           const uint32_t duration);\r\n\r\n/**\r\n * Get user data from OTP (one-time pramming) memory\r\n *\r\n * \\param[in] buf Pointer to buffer where data should be stored\r\n * \\param[in] len Number of bytes to read\r\n *\r\n * \\return WM_SUCCESS if user data read operation is successful.\r\n * \\return -WM_E_INVAL if buf is not valid or of insufficient size.\r\n * \\return -WM_FAIL if user data field is not present or command fails.\r\n */\r\nint wlan_get_otp_user_data(uint8_t *buf, uint16_t len);\r\n\r\n/**\r\n * Get calibration data from Wi-Fi firmware.\r\n *\r\n * \\param[out] cal_data Pointer to calibration data structure where\r\n *\t      calibration data and it's length should be stored.\r\n *\r\n * \\return WM_SUCCESS if calibration data read operation is successful.\r\n * \\return -WM_E_INVAL if cal_data is not valid.\r\n * \\return -WM_FAIL if command fails.\r\n *\r\n * \\note The user of this API should free the allocated buffer for\r\n *\t calibration data.\r\n */\r\nint wlan_get_cal_data(wlan_cal_data_t *cal_data);\r\n\r\n#if CONFIG_COMPRESS_TX_PWTBL\r\n/**\r\n * Set the compressed TX power limit configuration.\r\n *\r\n * \\param[in] data A pointer to TX power limit configuration.\r\n * \\param[in] len Length of TX power limit configuration.\r\n *\r\n * \\return WM_SUCCESS on success, error otherwise.\r\n *\r\n */\r\nint wlan_set_region_power_cfg(const t_u8 *data, t_u16 len);\r\n#endif\r\n\r\n/**\r\n * Set the TRPC (transient receptor potential canonical) channel list and TX power limit configuration.\r\n *\r\n * \\param[in] chanlist A poiner to \\ref wlan_chanlist_t channel List configuration.\r\n * \\param[in] txpwrlimit A pointer to \\ref wlan_txpwrlimit_t TX power limit configuration.\r\n *\r\n * \\return WM_SUCCESS on success, error otherwise.\r\n *\r\n */\r\nint wlan_set_chanlist_and_txpwrlimit(wlan_chanlist_t *chanlist, wlan_txpwrlimit_t *txpwrlimit);\r\n\r\n/**\r\n * Set the channel list configuration.\r\n *\r\n * \\param[in] chanlist A pointer to wlan_chanlist_t channel list configuration.\r\n *\r\n * \\return WM_SUCCESS on success, error otherwise.\r\n *\r\n * \\note If region enforcement flag is enabled in the OTP then this API should\r\n * not take effect.\r\n */\r\nint wlan_set_chanlist(wlan_chanlist_t *chanlist);\r\n\r\n/**\r\n * Get the channel list configuration.\r\n *\r\n * \\param[out] chanlist A pointer to wlan_chanlist_t channel list configuration.\r\n *\r\n * \\return WM_SUCCESS on success, error otherwise.\r\n *\r\n * \\note The \\ref wlan_chanlist_t struct allocates memory for a maximum of 54.\r\n * channels.\r\n *\r\n */\r\nint wlan_get_chanlist(wlan_chanlist_t *chanlist);\r\n\r\n/**\r\n * Set the TRPC (transient receptor potential canonical) channel configuration.\r\n *\r\n * \\param[in] txpwrlimit A pointer to \\ref wlan_txpwrlimit_t TX power limit configuration.\r\n *\r\n * \\return WM_SUCCESS on success, error otherwise.\r\n *\r\n */\r\nint wlan_set_txpwrlimit(wlan_txpwrlimit_t *txpwrlimit);\r\n\r\n/**\r\n * Get the TRPC (transient receptor potential canonical) channel configuration.\r\n *\r\n * \\param[in] subband  Where subband is:\\n\r\n *              0x00 2G subband  (2.4G: channel 1-14)\\n\r\n *              0x10 5G subband0 (5G: channel 36,40,44,48,\\n\r\n *                                            52,56,60,64)\\n\r\n *              0x11 5G subband1 (5G: channel 100,104,108,112,\\n\r\n *                                            116,120,124,128,\\n\r\n *                                            132,136,140,144)\\n\r\n *              0x12 5G subband2 (5G: channel 149,153,157,161,165,172)\\n\r\n *              0x13 5G subband3 (5G: channel 183,184,185,187,188,\\n\r\n *                                            189, 192,196;\\n\r\n *                                5G: channel 7,8,11,12,16,34)\\n\r\n *\r\n * \\param[out] txpwrlimit A pointer to \\ref wlan_txpwrlimit_t TX power\r\n * \t\tLimit configuration structure where Wi-Fi firmware\r\n * \t\tconfiguration can get copied.\r\n *\r\n * \\return WM_SUCCESS on success, error otherwise.\r\n *\r\n * \\note application can use print_txpwrlimit API to print the\r\n *\t content of the txpwrlimit structure.\r\n */\r\nint wlan_get_txpwrlimit(wifi_SubBand_t subband, wifi_txpwrlimit_t *txpwrlimit);\r\n\r\n#if CONFIG_AUTO_RECONNECT\r\n/**\r\n * Enable auto reconnect feature in Wi-Fi firmware.\r\n *\r\n * \\param[in] auto_reconnect_config auto reconnect configuration\r\n *\t      structure holding following parameters:\r\n *\t      1. reconnect counter(0x1-0xff) - The number of times the Wi-Fi\r\n *\t\t firmware retries connection attempt with AP.\r\n *\t\t\t\tThe value 0xff means retry forever.\r\n *\t\t\t\t(default 0xff).\r\n *\t      2. reconnect interval(0x0-0xff) - Time gap in seconds between\r\n *\t\t\t\teach connection attempt (default 10).\r\n *\t      3. flags - Bit 0:\r\n *\t\t\t Set to 1: Firmware should report link-loss to host\r\n *\t\t\t\tif AP rejects authentication/association\r\n *\t\t\t\twhile reconnecting.\r\n *\t\t\t Set to 0: Default behaviour: Firmware does not report\r\n *\t\t\t\tlink-loss to host on AP rejection and\r\n *\t\t\t\tcontinues internally.\r\n *\t\t\t Bit 1-15: Reserved.\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n *\r\n */\r\nint wlan_auto_reconnect_enable(wlan_auto_reconnect_config_t auto_reconnect_config);\r\n\r\n/**\r\n * Disable auto reconnect feature in Wi-Fi firmware.\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n *\r\n */\r\nint wlan_auto_reconnect_disable(void);\r\n\r\n/**\r\n * Get auto reconnect configuration from Wi-Fi firmware.\r\n *\r\n * \\param[out] auto_reconnect_config auto reconnect configuration\r\n *\t       structure where response from Wi-Fi firmware\r\n *\t       gets stored.\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_E_INVAL if auto_reconnect_config is not valid.\r\n * \\return -WM_FAIL if command fails.\r\n *\r\n */\r\nint wlan_get_auto_reconnect_config(wlan_auto_reconnect_config_t *auto_reconnect_config);\r\n#endif\r\n/**\r\n * Set reassociation control in Wi-Fi connection manager.\r\n * \\note Reassociation is enabled by default in the Wi-Fi connection manager.\r\n *\r\n * \\param[in] reassoc_control Reassociation enable/disable\r\n *\r\n */\r\nvoid wlan_set_reassoc_control(bool reassoc_control);\r\n\r\n/** API to set the beacon period of UAP\r\n *\r\n *\\param[in] beacon_period Beacon period in TU (1 TU = 1024 micro seconds)\r\n *\r\n *\\note  Call this API before calling UAP start API.\r\n *\r\n */\r\nvoid wlan_uap_set_beacon_period(const uint16_t beacon_period);\r\n\r\n/** API to set the bandwidth of UAP\r\n *\r\n *\\param[in] bandwidth Wi-Fi AP bandwidth (20MHz/40MHz)\r\n    1: 20 MHz 2: 40 MHz 3: 80 MHz\r\n *\r\n *\\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\\return -WM_FAIL if command fails.\r\n *\r\n *\\note  call this API before calling UAP start API.\r\n *\\note Default bandwidth setting is 40 MHz.\r\n *\r\n */\r\nint wlan_uap_set_bandwidth(const uint8_t bandwidth);\r\n\r\n/** API to get the bandwidth of UAP\r\n *\r\n *\\param[out] bandwidth Wi-Fi AP bandwidth (20MHz/40MHz)\r\n    1: 20 MHz 2: 40 MHz 3: 80 MHz\r\n *\r\n *\\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\\return -WM_FAIL if command fails.\r\n *\r\n *\\note  call this API before calling UAP start API.\r\n *\r\n */\r\nint wlan_uap_get_bandwidth(uint8_t *bandwidth);\r\n\r\n/** API to control SSID broadcast capability of UAP\r\n *\r\n * This API enables/disables the SSID broadcast feature\r\n * (also known as the hidden SSID feature). When broadcast SSID\r\n * is enabled, the AP responds to probe requests from client stations\r\n * that contain null SSID. When broadcast SSID is disabled, the AP\r\n * does not respond to probe requests that contain null SSID and\r\n * generates beacons that contain null SSID.\r\n *\r\n *\\param[in] hidden_ssid Hidden SSID control\r\n *           hidden_ssid=0: broadcast SSID in beacons.\r\n *           hidden_ssid=1: send empty SSID (length=0) in beacon.\r\n *           hidden_ssid=2: clear SSID (ACSII 0), but keep the original length\r\n *\r\n *\\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\\return -WM_FAIL if command fails.\r\n *\r\n *\\note  call this API before calling UAP start API.\r\n *\r\n */\r\nint wlan_uap_set_hidden_ssid(const t_u8 hidden_ssid);\r\n\r\n/** API to control the deauth during UAP channel switch.\r\n *\r\n *\\param[in] enable 0 -- Wi-Fi firmware can use default behaviour.\r\n *\t\t    1 -- Wi-Fi firmware can not send deauth packet\r\n *\t\t         when UAP move to another channel.\r\n *\r\n *\\note  call this API before calling UAP start API.\r\n *\r\n */\r\nvoid wlan_uap_ctrl_deauth(const bool enable);\r\n\r\n/** API to enable channel switch announcement functionality on UAP.\r\n *\r\n *\\note  call this API before calling UAP start API. Also\r\n *\tnote that 802.11n should be enabled on UAP. The channel switch announcement IE\r\n *\tis transmitted in 7 beacons before the channel switch, during a station\r\n *\tconnection attempt on a different channel with Ex-AP.\r\n *\r\n */\r\nvoid wlan_uap_set_ecsa(void);\r\n\r\n/** API to set the HT capability information of UAP.\r\n *\r\n *\\param[in] ht_cap_info - This is a bitmap and should be used as following\\n\r\n *             Bit 15: L Sig TxOP protection - reserved, set to 0 \\n\r\n *             Bit 14: 40 MHz intolerant - reserved, set to 0 \\n\r\n *             Bit 13: PSMP - reserved, set to 0 \\n\r\n *             Bit 12: DSSS Cck40MHz mode\\n\r\n *             Bit 11: Maximal A-MSDU size - reserved, set to 0 \\n\r\n *             Bit 10: Delayed BA - reserved, set to 0 \\n\r\n *             Bits 9:8: RX STBC - reserved, set to 0 \\n\r\n *             Bit 7: TX STBC - reserved, set to 0 \\n\r\n *             Bit 6: Short GI 40 MHz\\n\r\n *             Bit 5: Short GI 20 MHz\\n\r\n *             Bit 4: GF preamble\\n\r\n *             Bits 3:2: MIMO power save - reserved, set to 0 \\n\r\n *             Bit 1: SuppChanWidth - set to 0 for 2.4 GHz band \\n\r\n *             Bit 0: LDPC coding - reserved, set to 0 \\n\r\n *\r\n *\\note  call this API before calling UAP start API.\r\n *\r\n */\r\nvoid wlan_uap_set_htcapinfo(const uint16_t ht_cap_info);\r\n\r\n/**\r\n * This API can be used to configure various 802.11n specific configuration\r\n *       for transmit (such as short GI, channel bandwidth and green field support)\r\n *       for UAP interface.\r\n *\r\n * \\param[in] httxcfg This is a bitmap and should be used as following\\n\r\n *               Bit 15-8: Reserved set to 0\\n\r\n *               Bit 7: STBC Enable/Disable\\n\r\n *               Bit 6: Short GI in 40 Mhz Enable/Disable\\n\r\n *               Bit 5: Short GI in 20 Mhz Enable/Disable\\n\r\n *               Bit 4: Green field Enable/Disable\\n\r\n *               Bit 3-2: Reserved set to 1\\n\r\n *               Bit 1: 20/40 Mhz enable disable.\\n\r\n *               Bit 0: LDPC Enable/Disable\\n\r\n *\r\n *       When Bit 1 is set then firmware could transmit in 20Mhz or 40Mhz based\\n\r\n *       on rate adaptation. When this bit is reset then firmware can only\\n\r\n *       transmit in 20Mhz.\\n\r\n *\r\n *\\note  Call this API before calling UAP start API.\r\n *\r\n */\r\nvoid wlan_uap_set_httxcfg(unsigned short httxcfg);\r\n\r\n/**\r\n * This API can be used to enable AMPDU support on the go\r\n * when station is a transmitter.\r\n *\r\n * \\note By default the station AMPDU TX support is on if\r\n * configuration option is enabled in defconfig.\r\n */\r\nvoid wlan_sta_ampdu_tx_enable(void);\r\n\r\n/**\r\n * This API can be used to disable AMPDU support on the go\r\n * when station is a transmitter.\r\n *\r\n *\\note By default the station AMPDU RX support is on if\r\n * configuration option is enabled in defconfig.\r\n *\r\n */\r\nvoid wlan_sta_ampdu_tx_disable(void);\r\n\r\n/**\r\n * This API can be used to enable AMPDU support on the go\r\n * when station is a receiver.\r\n */\r\nvoid wlan_sta_ampdu_rx_enable(void);\r\n\r\n/**\r\n * This API can be used to disable AMPDU support on the go\r\n * when station is a receiver.\r\n */\r\nvoid wlan_sta_ampdu_rx_disable(void);\r\n\r\n/**\r\n * This API can be used to enable AMPDU support on the go\r\n * when UAP is a transmitter.\r\n *\r\n * \\note By default the UAP AMPDU TX support is on if\r\n * configuration option is enabled in defconfig.\r\n */\r\nvoid wlan_uap_ampdu_tx_enable(void);\r\n\r\n/**\r\n * This API can be used to disable AMPDU support on the go\r\n * when UAP is a transmitter.\r\n *\r\n *\\note By default the UAP AMPDU RX support is on if\r\n * configuration option is enabled in defconfig.\r\n *\r\n */\r\nvoid wlan_uap_ampdu_tx_disable(void);\r\n\r\n/**\r\n * This API can be used to enable AMPDU support on the go\r\n * when UAP is a receiver.\r\n */\r\nvoid wlan_uap_ampdu_rx_enable(void);\r\n\r\n/**\r\n * This API can be used to disable AMPDU support on the go\r\n * when UAP is a receiver.\r\n */\r\nvoid wlan_uap_ampdu_rx_disable(void);\r\n\r\n\r\n/**\r\n * Set number of channels and channel number used during automatic\r\n * channel selection of UAP.\r\n *\r\n *\\param[in] scan_chan_list A structure holding the number of channels and\r\n *\t     channel numbers.\r\n *\r\n *\\note  call this API before UAP start API in order to set the user\r\n *      defined channels, otherwise it can have no effect. There is no need\r\n *      to call this API every time before UAP start, if once set same channel\r\n *      configuration can get used in all upcoming UAP start call. If user\r\n *      wish to change the channels at run time then it make sense to call\r\n *      this API before every UAP start API.\r\n */\r\nvoid wlan_uap_set_scan_chan_list(wifi_scan_chan_list_t scan_chan_list);\r\n\r\n#if CONFIG_WPA2_ENTP\r\n\r\n/**\r\n * Use this API if application want to allow station\r\n * connection to WPA2 Enterprise ap profiles only.\r\n *\r\n * If called the in scan result only the WPA2 Enterprise AP\r\n * can be listed and station network profile only with WPA2\r\n * Enterprise security can be allowed to add to network profile\r\n * list.\r\n */\r\nvoid wlan_enable_wpa2_enterprise_ap_only(void);\r\n#endif\r\n\r\n/**\r\n * Set the rts threshold of STA in Wi-Fi firmware.\r\n *\r\n * \\param[in] rts the value of rts threshold configuration.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_rts(int rts);\r\n\r\n/**\r\n * Set the rts threshold of UAP in Wi-Fi firmware.\r\n *\r\n * \\param[in] rts the value of rts threshold configuration.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_uap_rts(int rts);\r\n\r\n#if CONFIG_WIFI_FRAG_THRESHOLD\r\n/**\r\n * Set the fragment threshold of STA in Wi-Fi firmware.\r\n *\r\n * \\param[in] frag The value of fragment threshold configuration.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_frag(int frag);\r\n\r\n/**\r\n * Set the fragment threshold of UAP in Wi-Fi firmware.\r\n *\r\n * \\param[in] frag the value of fragment threshold configuration.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_uap_frag(int frag);\r\n#endif\r\n\r\n\r\n#if CONFIG_UAP_STA_MAC_ADDR_FILTER\r\n/**\r\n * Set the STA MAC filter in Wi-Fi firmware.\r\n *\r\n * \\param[in] filter_mode Channel filter mode (disable/white/black list)\r\n * \\param[in] mac_count The ount of MAC list\r\n * \\param[in] mac_addr The pointer to MAC address list\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_set_sta_mac_filter(int filter_mode, int mac_count, unsigned char *mac_addr);\r\n#endif\r\n\r\nstatic inline void print_mac(const char *mac)\r\n{\r\n    (void)PRINTF(\"%02X:%02X:%02X:%02X:%02X:%02X \", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);\r\n}\r\n\r\n#if CONFIG_RF_TEST_MODE\r\n\r\n/**\r\n * Set the RF test mode in Wi-Fi firmware.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_rf_test_mode(void);\r\n\r\n/**\r\n * Unset the RF test mode in Wi-Fi firmware.\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n */\r\nint wlan_unset_rf_test_mode(void);\r\n\r\n/**\r\n * Set the RF channel in Wi-Fi firmware.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[in] channel The channel number to be set in Wi-Fi firmware.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_set_rf_channel(const uint8_t channel);\r\n\r\n/**\r\n * Set the RF radio mode in Wi-Fi firmware.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[in] mode The radio mode number to be set in Wi-Fi firmware.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_set_rf_radio_mode(const uint8_t mode);\r\n\r\n/**\r\n * Get the RF channel from Wi-Fi firmware.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[out] channel A pointer to a variable where channel number to get.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_get_rf_channel(uint8_t *channel);\r\n\r\n/**\r\n * Get the RF radio mode from Wi-Fi firmware.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[out] mode A pointer to a variable where radio mode number to get.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_get_rf_radio_mode(uint8_t *mode);\r\n\r\n/**\r\n * Set the RF band in Wi-Fi firmware.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[in] band The bandwidth to be set in Wi-Fi firmware.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_set_rf_band(const uint8_t band);\r\n\r\n/**\r\n * Get the RF band from Wi-Fi firmware.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[out] band A Pointer to a variable where RF band is to be stored.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_get_rf_band(uint8_t *band);\r\n\r\n/**\r\n * Set the RF bandwidth in Wi-Fi firmware.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[in] bandwidth The bandwidth to be set in Wi-Fi firmware.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_set_rf_bandwidth(const uint8_t bandwidth);\r\n\r\n/**\r\n * Get the RF bandwidth from Wi-Fi firmware.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[out] bandwidth A Pointer to a variable where bandwidth to get.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_get_rf_bandwidth(uint8_t *bandwidth);\r\n\r\n/**\r\n * Get the RF RX total packet and multicast/broadcast packet count.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[out] rx_tot_pkt_count A Pointer to a variable where RX total packet count to get.\r\n * \\param[out] rx_mcast_bcast_count A Pointer to a variable where RX total multicast/broadcast packet count to get.\r\n * \\param[out] rx_pkt_fcs_error A Pointer to a variable where RX total packet count with FCS (frame check sequence) error to get.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_get_rf_per(uint32_t *rx_tot_pkt_count, uint32_t *rx_mcast_bcast_count, uint32_t *rx_pkt_fcs_error);\r\n\r\n/**\r\n * Set the RF TX continuous mode in Wi-Fi firmware.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[in] enable_tx Enable TX.\r\n * \\param[in] cw_mode Set CW (continuous wave) mode.\r\n * \\param[in] payload_pattern Set payload pattern.\r\n * \\param[in] cs_mode Set CS mode.\r\n * \\param[in] act_sub_ch Active subchannel.\r\n * \\param[in] tx_rate Set TX rate.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL..\r\n *\r\n */\r\nint wlan_set_rf_tx_cont_mode(const uint32_t enable_tx,\r\n                             const uint32_t cw_mode,\r\n                             const uint32_t payload_pattern,\r\n                             const uint32_t cs_mode,\r\n                             const uint32_t act_sub_ch,\r\n                             const uint32_t tx_rate);\r\n\r\n/**\r\n * Set the RF HE TB TX in Wi-Fi firmware.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[in] enable Enable/Disable trigger response mode\r\n * \\param[in] qnum AXQ to be used for the trigger response frame\r\n * \\param[in] aid AID of the peer to which response is to be generated\r\n * \\param[in] axq_mu_timer MU timer for the AXQ on which response is sent\r\n * \\param[in] tx_power TxPwr to be configured for the response\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_cfg_rf_he_tb_tx(uint16_t enable, uint16_t qnum, uint16_t aid, uint16_t axq_mu_timer, int16_t tx_power);\r\n\r\n/**\r\n * Set the RF Trigger Frame Config in Wi-Fi firmware.\r\n *\r\n * \\note call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[in] Enable_tx Enable or Disable trigger frame transmission.\r\n * \\param[in] Standalone_hetb Enable or Disable Standalone HE TB support.\r\n * \\param[in] FRAME_CTRL_TYPE Frame control type.\r\n * \\param[in] FRAME_CTRL_SUBTYPE Frame control subtype.\r\n * \\param[in] FRAME_DURATION Max Duration time.\r\n * \\param[in] TriggerType Identifies the Trigger frame variant and its encoding.\r\n * \\param[in] UlLen Indicates the value of the L-SIG LENGTH field of the solicited HE TB PPDU.\r\n * \\param[in] MoreTF Indicates whether a subsequent Trigger frame is scheduled for transmission.\r\n * \\param[in] CSRequired Required to use ED to sense the medium and to consider the medium state and the NAV in\r\n * determining whether to respond. \\param[in] UlBw Indicates the bandwidth in the HE-SIG-A field of the HE TB PPDU.\r\n * \\param[in] LTFType Indicates the LTF type of the HE TB PPDU response.\r\n * \\param[in] LTFMode Indicates the LTF mode for an HE TB PPDU.\r\n * \\param[in] LTFSymbol Indicates the number of LTF symbols present in the HE TB PPDU.\r\n * \\param[in] UlSTBC Indicates the status of STBC encoding for the solicited HE TB PPDUs.\r\n * \\param[in] LdpcESS Indicates the status of the LDPC extra symbol segment.\r\n * \\param[in] ApTxPwr Indicates the AP’s combined transmit power at the transmit antenna connector of all the antennas\r\n * used to transmit the triggering PPDU. \\param[in] PreFecPadFct Indicates the pre-FEC padding factor. \\param[in]\r\n * PeDisambig Indicates PE disambiguity. \\param[in] SpatialReuse Carries the values to be included in the Spatial Reuse\r\n * fields in the HE-SIG-A field of the solicited HE TB PPDUs. \\param[in] Doppler Indicate that a midamble is present in\r\n * the HE TB PPDU. \\param[in] HeSig2 Carries the value to be included in the Reserved field in the HE-SIG-A2 subfield of\r\n * the solicited HE TB PPDUs. \\param[in] AID12 If set to 0 allocates one or more contiguous RA-RUs for associated STAs.\r\n * \\param[in] RUAllocReg RUAllocReg.\r\n * \\param[in] RUAlloc Identifies the size and the location of the RU.\r\n * \\param[in] UlCodingType Indicates the code type of the solicited HE TB PPDU.\r\n * \\param[in] UlMCS Indicates the HE-MCS of the solicited HE TB PPDU.\r\n * \\param[in] UlDCM Indicates DCM of the solicited HE TB PPDU.\r\n * \\param[in] SSAlloc Indicates the spatial streams of the solicited HE TB PPDU.\r\n * \\param[in] UlTargetRSSI Indicates the expected receive signal power.\r\n * \\param[in] MPDU_MU_SF Used for calculating the value by which the minimum MPDU start spacing is multiplied.\r\n * \\param[in] TID_AL Indicates the MPDUs allowed in an A-MPDU carried in the HE TB PPDU and the maximum number of TIDs\r\n * that can be aggregated by the STA in the A-MPDU. \\param[in] AC_PL Reserved. \\param[in] Pref_AC Indicates the lowest\r\n * AC that is recommended for aggregation of MPDUs in the A-MPDU contained in the HE TB PPDU sent as a response to the\r\n * Trigger frame.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_rf_trigger_frame_cfg(uint32_t Enable_tx,\r\n                              uint32_t Standalone_hetb,\r\n                              uint8_t FRAME_CTRL_TYPE,\r\n                              uint8_t FRAME_CTRL_SUBTYPE,\r\n                              uint16_t FRAME_DURATION,\r\n                              uint64_t TriggerType,\r\n                              uint64_t UlLen,\r\n                              uint64_t MoreTF,\r\n                              uint64_t CSRequired,\r\n                              uint64_t UlBw,\r\n                              uint64_t LTFType,\r\n                              uint64_t LTFMode,\r\n                              uint64_t LTFSymbol,\r\n                              uint64_t UlSTBC,\r\n                              uint64_t LdpcESS,\r\n                              uint64_t ApTxPwr,\r\n                              uint64_t PreFecPadFct,\r\n                              uint64_t PeDisambig,\r\n                              uint64_t SpatialReuse,\r\n                              uint64_t Doppler,\r\n                              uint64_t HeSig2,\r\n                              uint32_t AID12,\r\n                              uint32_t RUAllocReg,\r\n                              uint32_t RUAlloc,\r\n                              uint32_t UlCodingType,\r\n                              uint32_t UlMCS,\r\n                              uint32_t UlDCM,\r\n                              uint32_t SSAlloc,\r\n                              uint8_t UlTargetRSSI,\r\n                              uint8_t MPDU_MU_SF,\r\n                              uint8_t TID_AL,\r\n                              uint8_t AC_PL,\r\n                              uint8_t Pref_AC);\r\n\r\n/**\r\n * Set the RF TX antenna in Wi-Fi firmware.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[in] antenna The TX antenna to be set in Wi-Fi firmware.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_set_rf_tx_antenna(const uint8_t antenna);\r\n\r\n/**\r\n * Get the RF TX antenna from Wi-Fi firmware.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[out] antenna A Pointer to a variable where TX antenna is to be stored.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_get_rf_tx_antenna(uint8_t *antenna);\r\n\r\n/**\r\n * Set RF RX antenna in Wi-Fi firmware.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[in] antenna The RX antenna to be set in Wi-Fi firmware.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_set_rf_rx_antenna(const uint8_t antenna);\r\n\r\n/**\r\n * Get RF RX antenna from Wi-Fi firmware.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[out] antenna A Pointer to a variable where RX antenna is to be stored.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_get_rf_rx_antenna(uint8_t *antenna);\r\n\r\n/**\r\n * Set RF RX power in Wi-Fi firmware.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[in] power The RF RX power to be set in Wi-Fi firmware.\r\n *                  For RW610, 20M bandwidth max linear output power is 20db per data sheet.\r\n * \\param[in] mod The modulation to be set in Wi-Fi firmware.\r\n * \\param[in] path_id The Path ID to be set in Wi-Fi firmware.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_set_rf_tx_power(const uint32_t power, const uint8_t mod, const uint8_t path_id);\r\n\r\n/**\r\n * Set the RF TX Frame in Wi-Fi firmware.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[in] enable Enable/Disable RF TX Frame\r\n * \\param[in] data_rate Rate index corresponding to legacy/HT/VHT rates\r\n * \\param[in] frame_pattern Payload pattern\r\n * \\param[in] frame_length Payload length\r\n * \\param[in] adjust_burst_sifs Enabl/Disable adjust burst SIFS3 Gap\r\n * \\param[in] burst_sifs_in_us Burst SIFS in us\r\n * \\param[in] short_preamble Enable/Disable short preamble\r\n * \\param[in] act_sub_ch Enable/Disable active subChannel\r\n * \\param[in] short_gi Short guard interval\r\n * \\param[in] adv_coding Enable/Disable adv Coding\r\n * \\param[in] tx_bf Enable/Disable beamforming\r\n * \\param[in] gf_mode Enable/Disable green field mode\r\n * \\param[in] stbc Enable/Disable STBC\r\n * \\param[in] bssid BSSID\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_set_rf_tx_frame(const uint32_t enable,\r\n                         const uint32_t data_rate,\r\n                         const uint32_t frame_pattern,\r\n                         const uint32_t frame_length,\r\n                         const uint16_t adjust_burst_sifs,\r\n                         const uint32_t burst_sifs_in_us,\r\n                         const uint32_t short_preamble,\r\n                         const uint32_t act_sub_ch,\r\n                         const uint32_t short_gi,\r\n                         const uint32_t adv_coding,\r\n                         const uint32_t tx_bf,\r\n                         const uint32_t gf_mode,\r\n                         const uint32_t stbc,\r\n                         const uint8_t *bssid);\r\n\r\n/**\r\n * Set the RF OTP (one-time password) MAC address in Wi-Fi firmware.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[in] MAC A pointer to a variable where OTP MAC address is to be stored.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_set_rf_otp_mac_addr(uint8_t *mac);\r\n\r\n/**\r\n * Get the RF OTP MAC address from Wi-Fi firmware.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[out] MAC A Pointer to a variable where OTP MAC address is to be stored.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_get_rf_otp_mac_addr(uint8_t *mac);\r\n\r\n/**\r\n * Set the RF OTP calculate data in Wi-Fi firmware.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[in] cal_data A Pointer to a variable where OTP calculate data is to be stored.\r\n * \\param[in] cal_data_len The length of OTP calculate data.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_set_rf_otp_cal_data(const uint8_t *cal_data, uint32_t cal_data_len);\r\n\r\n/**\r\n * Get the RF OTP calculate data from Wi-Fi firmware.\r\n *\r\n * \\note  call \\ref wlan_set_rf_test_mode API before using this API.\r\n *\r\n * \\param[out] cal_data A pointer to a variable where OTP calculate data is to be stored.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_get_rf_otp_cal_data(uint8_t *cal_data);\r\n#endif\r\n#if CONFIG_WIFI_FW_DEBUG\r\n/** This function registers callbacks which are used to generate firmware dump on USB\r\n * device.\r\n *\r\n * \\param[in] wlan_usb_init_cb Callback to initialize usb device.\r\n * \\param[in] wlan_usb_mount_cb Callback to mount usb device.\r\n * \\param[in] wlan_usb_file_open_cb Callback to open file on usb device for firmware dump.\r\n * \\param[in] wlan_usb_file_write_cb Callback to write firmware dump data to opened file.\r\n * \\param[in] wlan_usb_file_close_cb Callback to close firmware dump file.\r\n *\r\n */\r\nvoid wlan_register_fw_dump_cb(void (*wlan_usb_init_cb)(void),\r\n                              int (*wlan_usb_mount_cb)(),\r\n                              int (*wlan_usb_file_open_cb)(char *test_file_name),\r\n                              int (*wlan_usb_file_write_cb)(uint8_t *data, size_t data_len),\r\n                              int (*wlan_usb_file_close_cb)());\r\n\r\n#endif\r\n\r\n#if CONFIG_WIFI_EU_CRYPTO\r\n#define EU_CRYPTO_DATA_MAX_LENGTH  1300U\r\n#define EU_CRYPTO_KEY_MAX_LENGTH   32U\r\n#define EU_CRYPTO_KEYIV_MAX_LENGTH 32U\r\n#define EU_CRYPTO_NONCE_MAX_LENGTH 14U\r\n#define EU_CRYPTO_AAD_MAX_LENGTH   32U\r\n\r\n/** Set crypto RC4 (rivest cipher 4) algorithm encrypt command param.\r\n *\r\n * \\param[in] Key key\r\n * \\param[in] KeyLength The KeyLength + KeyIVLength valid range [1,256].\r\n * \\param[in] KeyIV KeyIV\r\n * \\param[in] KeyIVLength The KeyLength + KeyIVLength valid range [1,256].\r\n * \\param[in] Data Data\r\n * \\param[in] DataLength The maximum data length is 1200.\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_E_PERM if not supported.\r\n * \\return -WM_FAIL if failure.\r\n *\r\n * \\note If the function returns WM_SUCCESS, the data in the memory pointed to by data is overwritten by the encrypted\r\n * data. The value of DataLength is updated to the encrypted data length. The length of the encrypted data is the same\r\n * as the origin DataLength.\r\n */\r\nint wlan_set_crypto_RC4_encrypt(\r\n    const t_u8 *Key, const t_u16 KeyLength, const t_u8 *KeyIV, const t_u16 KeyIVLength, t_u8 *Data, t_u16 *DataLength);\r\n\r\n/** Set crypto RC4 (rivest cipher 4) algorithm decrypt command param.\r\n *\r\n * \\param[in] Key key\r\n * \\param[in] KeyLength The KeyLength + KeyIVLength valid range [1,256].\r\n * \\param[in] KeyIV KeyIV\r\n * \\param[in] KeyIVLength The KeyLength + KeyIVLength valid range [1,256].\r\n * \\param[in] Data Data\r\n * \\param[in] DataLength The maximum data length is 1200.\r\n *\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_E_PERM if not supported.\r\n * \\return -WM_FAIL if failure.\r\n *\r\n * \\note If the function returns WM_SUCCESS, the data in the memory pointed to by data is overwritten by the decrypted\r\n * data. The value of DataLength is updated to the decrypted data length. The length of the decrypted data is the same\r\n * as the origin DataLength.\r\n */\r\nint wlan_set_crypto_RC4_decrypt(\r\n    const t_u8 *Key, const t_u16 KeyLength, const t_u8 *KeyIV, const t_u16 KeyIVLength, t_u8 *Data, t_u16 *DataLength);\r\n\r\n/** Set crypto AES_ECB (advanced encryption standard, electronic codebook) algorithm encrypt command param.\r\n *\r\n * \\param[in] Key key\r\n * \\param[in] KeyLength The key length is 16/24/32.\r\n * \\param[in] KeyIV KeyIV should point to a 8 bytes array with any value in the array.\r\n * \\param[in] KeyIVLength The keyIV length is 8.\r\n * \\param[in] Data Data\r\n * \\param[in] DataLength The data length is 16.\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_E_PERM if not supported.\r\n * \\return -WM_FAIL if failure.\r\n *\r\n * \\note If the function returns WM_SUCCESS, the data in the memory pointed to by data is overwritten by the encrypted\r\n * data. The value of DataLength is updated to the encrypted data length. The length of the encrypted data is the same\r\n * as the origin DataLength.\r\n */\r\nint wlan_set_crypto_AES_ECB_encrypt(\r\n    const t_u8 *Key, const t_u16 KeyLength, const t_u8 *KeyIV, const t_u16 KeyIVLength, t_u8 *Data, t_u16 *DataLength);\r\n\r\n/** Set crypto AES_ECB (advanced encryption standard, electronic codebook) algorithm decrypt command param.\r\n *\r\n * \\param[in] Key key\r\n * \\param[in] KeyLength The key length is 16/24/32.\r\n * \\param[in] KeyIV KeyIV should point to a 8 bytes array with any value in the array.\r\n * \\param[in] KeyIVLength The keyIV length is 8.\r\n * \\param[in] Data Data\r\n * \\param[in] DataLength The data length is 16.\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_E_PERM if not supported.\r\n * \\return -WM_FAIL if failure.\r\n *\r\n * \\note If the function returns WM_SUCCESS, the data in the memory pointed to by data is overwritten by the decrypted\r\n * data. The value of DataLength is updated to the decrypted data length. The length of the decrypted data is the same\r\n * as the origin DataLength.\r\n */\r\nint wlan_set_crypto_AES_ECB_decrypt(\r\n    const t_u8 *Key, const t_u16 KeyLength, const t_u8 *KeyIV, const t_u16 KeyIVLength, t_u8 *Data, t_u16 *DataLength);\r\n\r\n/** Set crypto AES_WRAP (advanced encryption standard wrap) algorithm encrypt command param.\r\n *\r\n * \\param[in] Key key\r\n * \\param[in] KeyLength The key length is 16/24/32.\r\n * \\param[in] KeyIV KeyIV\r\n * \\param[in] KeyIVLength The keyIV length is 8.\r\n * \\param[in] Data Data\r\n * \\param[in] DataLength The data length valid range [8,1016].\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_E_PERM if not supported.\r\n * \\return -WM_FAIL if failure.\r\n *\r\n * \\note If the function returns WM_SUCCESS, the data in the memory pointed to by data is overwritten by the encrypted\r\n * data. The value of DataLength is updated to the encrypted data length. The encrypted data is 8 bytes more than the\r\n * original data. Therefore, the address pointed to by Data needs to reserve enough space.\r\n */\r\nint wlan_set_crypto_AES_WRAP_encrypt(\r\n    const t_u8 *Key, const t_u16 KeyLength, const t_u8 *KeyIV, const t_u16 KeyIVLength, t_u8 *Data, t_u16 *DataLength);\r\n\r\n/** Set crypto AES_WRAP algorithm decrypt command param.\r\n *\r\n * \\param[in] Key key\r\n * \\param[in] KeyLength The key length is 16/24/32.\r\n * \\param[in] KeyIV KeyIV\r\n * \\param[in] KeyIVLength The keyIV length is 8.\r\n * \\param[in] Data Data\r\n * \\param[in] DataLength The data length valid range [8,1016].\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_E_PERM if not supported.\r\n * \\return -WM_FAIL if failure.\r\n *\r\n * \\note If the function returns WM_SUCCESS, the data in the memory pointed to by data is overwritten by the decrypted\r\n * data. The value of DataLength is updated to the decrypted data length. The decrypted data is 8 bytes less than the\r\n * original data.\r\n */\r\nint wlan_set_crypto_AES_WRAP_decrypt(\r\n    const t_u8 *Key, const t_u16 KeyLength, const t_u8 *KeyIV, const t_u16 KeyIVLength, t_u8 *Data, t_u16 *DataLength);\r\n\r\n/** Set crypto AES_CCMP (counter mode with cipher block chaining message authentication code protocol)\r\n * algorithm encrypt command param.\r\n *\r\n * \\param[in] Key key\r\n * \\param[in] KeyLength The key length is 16/32.\r\n * \\param[in] AAD AAD\r\n * \\param[in] AADLength The maximum AAD length is 30.\r\n * \\param[in] Nonce Nonce\r\n * \\param[in] NonceLength The nonce length valid range [7,13].\r\n * \\param[in] Data Data\r\n * \\param[in] DataLength The maximum data length is 80.\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_E_PERM if not supported.\r\n * \\return -WM_FAIL if failure.\r\n *\r\n * \\note If the function returns WM_SUCCESS, the data in the memory pointed to by data is overwritten by the encrypted\r\n * data. The value of DataLength is updated to the encrypted data length. The encrypted data is 8 or 16 bytes more than\r\n * the original data. Therefore, the address pointed to by Data needs to reserve enough space.\r\n */\r\nint wlan_set_crypto_AES_CCMP_encrypt(const t_u8 *Key,\r\n                                     const t_u16 KeyLength,\r\n                                     const t_u8 *AAD,\r\n                                     const t_u16 AADLength,\r\n                                     const t_u8 *Nonce,\r\n                                     const t_u16 NonceLength,\r\n                                     t_u8 *Data,\r\n                                     t_u16 *DataLength);\r\n\r\n/** Set crypto AES_CCMP algorithm decrypt command param.\r\n *\r\n * \\param[in] Key key\r\n * \\param[in] KeyLength The key length is 16/32.\r\n * \\param[in] AAD AAD\r\n * \\param[in] AADLength The maximum AAD length is 30.\r\n * \\param[in] Nonce Nonce\r\n * \\param[in] NonceLength The nonce length valid range [7,13].\r\n * \\param[in] Data Data\r\n * \\param[in] DataLength The maximum data length is 80.\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_E_PERM if not supported.\r\n * \\return -WM_FAIL if failure.\r\n *\r\n * \\note If the function returns WM_SUCCESS, the data in the memory pointed to by data is overwritten by the decrypted\r\n * data. The value of DataLength is updated to the decrypted data length. The decrypted data is 8 or 16 bytes less than\r\n * the original data.\r\n */\r\nint wlan_set_crypto_AES_CCMP_decrypt(const t_u8 *Key,\r\n                                     const t_u16 KeyLength,\r\n                                     const t_u8 *AAD,\r\n                                     const t_u16 AADLength,\r\n                                     const t_u8 *Nonce,\r\n                                     const t_u16 NonceLength,\r\n                                     t_u8 *Data,\r\n                                     t_u16 *DataLength);\r\n\r\n/** Set crypto AES_GCMP (galois/counter mode with AES-GMAC) algorithm encrypt command param.\r\n *\r\n * \\param[in] Key key\r\n * \\param[in] KeyLength The key length is 16/32.\r\n * \\param[in] AAD AAD\r\n * \\param[in] AADLength The maximum AAD length is 30.\r\n * \\param[in] Nonce Nonce\r\n * \\param[in] NonceLength The nonce length valid range [7,13].\r\n * \\param[in] Data Data\r\n * \\param[in] DataLength The maximum data length is 80.\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_E_PERM if not supported.\r\n * \\return -WM_FAIL if failure.\r\n *\r\n * \\note If the function returns WM_SUCCESS, the data in the memory pointed to by data is overwritten by the encrypted\r\n * data. The value of DataLength is updated to the encrypted data length. The encrypted data is 16 bytes more than the\r\n * original data. Therefore, the address pointed to by Data needs to reserve enough space.\r\n */\r\nint wlan_set_crypto_AES_GCMP_encrypt(const t_u8 *Key,\r\n                                     const t_u16 KeyLength,\r\n                                     const t_u8 *AAD,\r\n                                     const t_u16 AADLength,\r\n                                     const t_u8 *Nonce,\r\n                                     const t_u16 NonceLength,\r\n                                     t_u8 *Data,\r\n                                     t_u16 *DataLength);\r\n\r\n/** Set crypto AES_CCMP algorithm decrypt command param.\r\n *\r\n * \\param[in] Key key\r\n * \\param[in] KeyLength The key length is 16/32.\r\n * \\param[in] AAD AAD\r\n * \\param[in] AADLength The maximum AAD length is 30.\r\n * \\param[in] Nonce Nonce\r\n * \\param[in] NonceLength The nonce length valid range [7,13].\r\n * \\param[in] Data Data\r\n * \\param[in] DataLength The maximum data length is 80.\r\n * \\return WM_SUCCESS if successful.\r\n * \\return -WM_E_PERM if not supported.\r\n * \\return -WM_FAIL if failure.\r\n *\r\n * \\note If the function returns WM_SUCCESS, the data in the memory pointed to by data is overwritten by the decrypted\r\n * data. The value of DataLength is updated to the decrypted data length. The decrypted data is 16 bytes less than the\r\n * original data.\r\n */\r\nint wlan_set_crypto_AES_GCMP_decrypt(const t_u8 *Key,\r\n                                     const t_u16 KeyLength,\r\n                                     const t_u8 *AAD,\r\n                                     const t_u16 AADLength,\r\n                                     const t_u8 *Nonce,\r\n                                     const t_u16 NonceLength,\r\n                                     t_u8 *Data,\r\n                                     t_u16 *DataLength);\r\n#endif\r\n\r\n#if CONFIG_WIFI_MEM_ACCESS\r\n/** This function reads/writes adapter memory location value.\r\n *\r\n *\\param[in]        action      0 -- read, 1 -- write\r\n *\\param[in]        addr        Specifies the memory address that is to be read/write.\r\n *\\param[in,out]    value       Value if specified, stand for write action, then that value can be written to that\r\n *offset in the specified register. Value should be specified in hexadecimal. Otherwise, it stands for read action, the\r\n *value is updated with read value.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_mem_access(uint16_t action, uint32_t addr, uint32_t *value);\r\n#endif\r\n\r\n#if CONFIG_WIFI_BOOT_SLEEP\r\n/** This function get/set Wi-Fi boot sleep enable status.\r\n *\r\n *\\param[in]        action      0 -- get, 1 -- set\r\n *\\param[in,out]    enable      If action is get then enable value is used to store firmware returned value otherwise it\r\n *is set in firmware.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_boot_sleep(uint16_t action, uint16_t *enable);\r\n#endif\r\n\r\n/**\r\n * This function sends the host command to firmware and copies back response to caller provided buffer in case of\r\n * success response from firmware is not parsed by this function but just copied back to the caller buffer.\r\n *\r\n *  \\param[in]    cmd_buf         Buffer containing the host command with header\r\n *  \\param[in]    cmd_buf_len     length of valid bytes in cmd_buf\r\n *  \\param[out]   host_resp_buf   Caller provided buffer, in case of success command response is copied to this\r\n * buffer can be same as cmd_buf \\param[in]    resp_buf_len    resp_buf's allocated length \\param[out]   reqd_resp_len\r\n * length of valid bytes in response buffer if successful otherwise invalid. \\return                       WM_SUCCESS in\r\n * case of success. \\return                       WM_E_INBIG in case cmd_buf_len is bigger than the commands that can be\r\n * handled by driver. \\return                       WM_E_INSMALL in case cmd_buf_len is smaller than the minimum length.\r\n * Minimum length is atleast the length of command header.  see Note for same. \\return WM_E_OUTBIG in case the\r\n * resp_buf_len is not sufficient to copy response from firmware. reqd_resp_len is updated with the response size.\r\n *  \\return                       WM_E_INVAL in case cmd_buf_len and resp_buf_len have invalid values.\r\n *  \\return                       WM_E_NOMEM in case cmd_buf, resp_buf and reqd_resp_len are NULL\r\n *  \\note                         Brief on the command Header: Start 8 bytes of cmd_buf should have these values set.\r\n *                                Firmware would update resp_buf with these 8 bytes at the start.\\n\r\n *                                2 bytes : Command.\\n\r\n *                                2 bytes : Size.\\n\r\n *                                2 bytes : Sequence number.\\n\r\n *                                2 bytes : Result.\\n\r\n *                                Rest of buffer length is Command/Response Body.\r\n */\r\n\r\nint wlan_send_hostcmd(\r\n    const void *cmd_buf, uint32_t cmd_buf_len, void *host_resp_buf, uint32_t resp_buf_len, uint32_t *reqd_resp_len);\r\n\r\n#if CONFIG_11AX\r\n/**\r\n * This function is used to set HTC (high throughput control) parameter.\r\n *\r\n *  \\param[in]    count\r\n *  \\param[in]    vht\r\n *  \\param[in]    he\r\n *  \\param[in]    rxNss\r\n *  \\param[in]    channelWidth\r\n *  \\param[in]    ulMuDisable\r\n *  \\param[in]    txNSTS\r\n *  \\param[in]    erSuDisable\r\n *  \\param[in]    dlResoundRecomm\r\n *  \\param[in]    ulMuDataDisable\r\n *\r\n * \\return WM_SUCCESS if operation is successful, otherwise return -WM_FAIL\r\n */\r\nint wlan_send_debug_htc(const uint8_t count,\r\n                        const uint8_t vht,\r\n                        const uint8_t he,\r\n                        const uint8_t rxNss,\r\n                        const uint8_t channelWidth,\r\n                        const uint8_t ulMuDisable,\r\n                        const uint8_t txNSTS,\r\n                        const uint8_t erSuDisable,\r\n                        const uint8_t dlResoundRecomm,\r\n                        const uint8_t ulMuDataDisable);\r\n\r\n/**\r\n * This function is used to enable/disable HTC (high throughput control).\r\n *\r\n *  \\param[in]    option         1 => Enable; 0 => Disable\r\n *\r\n * \\return WM_SUCCESS if operation is successful, otherwise return -WM_FAIL\r\n */\r\nint wlan_enable_disable_htc(uint8_t option);\r\n#endif\r\n\r\n#if CONFIG_11AX\r\n/**\r\n * Use this API to set the set 802.11ax TX OMI (operating mode inication).\r\n *\r\n * \\param[in] interface Interface type STAor UAP.\r\n * \\param[in] tx_omi value to be sent to firmware\r\n * \\param[in] tx_option value to be sent to firmware\r\n *            1: send OMI (operating mode indication) in QoS (quality of service) data.\r\n * \\param[in] num_data_pkts value to be sent to firmware\r\n *            num_data_pkts is applied only if OMI is sent in QoS data frame.\r\n *            It specifies the number of consecutive data frames containing the OMI.\r\n *            Minimum value is 1\r\n *            Maximum value is 16\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n */\r\nint wlan_set_11ax_tx_omi(const t_u8 interface, const t_u16 tx_omi, const t_u8 tx_option, const t_u8 num_data_pkts);\r\n/**\r\n * Set 802.11ax OBSS (overlapping basic service set) narrow bandwidth RU (resource unit) tolerance time\r\n * In uplink transmission, AP sends a trigger frame to all the stations that can be involved in the upcoming\r\n *transmission, and then these stations transmit Trigger-based(TB) PPDU in response to the trigger frame. If STA\r\n *connects to AP which channel is set to 100,STA doesn't support 26 tones RU. The API should be called when station is\r\n *in disconnected state.\r\n *\r\n *\r\n * \\param[in] tol_time     Valid range [1...3600]\r\n *          tolerance time is in unit of seconds.\r\n *\t\t\tSTA periodically check AP's beacon for ext cap bit79 (OBSS Narrow bandwidth RU in ofdma tolerance support)\r\n * \t\t\tand set 20 tone RU tolerance time if ext cap bit79 is not set\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_11ax_tol_time(const t_u32 tol_time);\r\n/**\r\n * Use this API to set the RU TX power limit.\r\n *\r\n * \\param[in] rutx_pwr_cfg       802.11ax rutxpwr of sub-bands to be sent to firmware.\r\n * \\param[in] rutx_pwr_cfg_len   Size of rutx_pwr_cfg buffer.\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n */\r\nint wlan_set_11ax_rutxpowerlimit(const void *rutx_pwr_cfg, uint32_t rutx_pwr_cfg_len);\r\n\r\n/**\r\n * Use this API to set the RU TX power limit by channel based approach.\r\n *\r\n * \\param[in] ru_pwr_cfg 802.11ax rutxpwr of channels to be sent to firmware.\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n */\r\nint wlan_set_11ax_rutxpowerlimit_legacy(const wlan_rutxpwrlimit_t *ru_pwr_cfg);\r\n\r\n/**\r\n * Use this API to get the RU TX power limit by channel based approach.\r\n *\r\n * \\param[in] ru_pwr_cfg 802.11ax rutxpwr of channels to be get from firmware.\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n */\r\nint wlan_get_11ax_rutxpowerlimit_legacy(wlan_rutxpwrlimit_t *ru_pwr_cfg);\r\n\r\n/** Set 802.11ax config params\r\n *\r\n * \\param[in, out] ax_config 802.11ax config parameters to be sent to firmware.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_11ax_cfg(wlan_11ax_config_t *ax_config);\r\n\r\n/** Get default 802.11ax config params\r\n *\r\n * \\return 802.11ax config parameters default array.\r\n */\r\nuint8_t *wlan_get_11ax_cfg(void);\r\n\r\n#if CONFIG_11AX_TWT\r\n/** Set broadcast TWT (target wake time) config params\r\n *\r\n * \\param[in] btwt_config Broadcast TWT setup parameters to be sent to firmware.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_btwt_cfg(const wlan_btwt_config_t *btwt_config);\r\n\r\n/** Get broadcast TWT config params\r\n *\r\n * \\return Broadcast TWT setup parameters default config array.\r\n */\r\nuint8_t *wlan_get_btwt_cfg(void);\r\n\r\n/** Set TWT setup config params\r\n *\r\n * \\param[in] twt_setup TWT setup parameters to be sent to firmware.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_twt_setup_cfg(const wlan_twt_setup_config_t *twt_setup);\r\n\r\n/** Get TWT setup config params\r\n *\r\n * \\return TWT setup parameters default array.\r\n */\r\nuint8_t *wlan_get_twt_setup_cfg(void);\r\n\r\n/** Set TWT teardown config params\r\n *\r\n * \\param[in] teardown_config TWT teardown parameters sent to firmware.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_twt_teardown_cfg(const wlan_twt_teardown_config_t *teardown_config);\r\n\r\n/** Get TWT teardown config params\r\n *\r\n * \\return TWT Teardown parameters default array\r\n */\r\nuint8_t *wlan_get_twt_teardown_cfg(void);\r\n\r\n/** Get TWT report\r\n *\r\n * \\param[out] twt_report TWT report parameter.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_get_twt_report(wlan_twt_report_t *twt_report);\r\n\r\n#endif /* CONFIG_11AX_TWT */\r\n\r\n#if CONFIG_MMSF\r\n/**\r\n * Set 802.11ax AMPDU (aggregate medium access control (MAC) protocol data unit) density config.\r\n * \\param[in] enable     0 - Disbale MMSF;  1 - Enable MMSF\r\n * \\param[in] Density    AMPDU density value. Default value is 0x30.\r\n * \\param[in] MMSF       AMPDU MMSF value. Default value is 0x6.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_mmsf(const t_u8 enable, const t_u8 Density, const t_u8 MMSF);\r\n\r\n/**\r\n * Get 802.11ax AMPDU density config.\r\n * \\param[out] enable     0 - Disbale MMSF;  1 - Enable MMSF\r\n * \\param[out] Density    AMPDU Density value. Default value is 0x30.\r\n * \\param[out] MMSF       AMPDU MMSF value. Default value is 0x6.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_get_mmsf(t_u8 *enable, t_u8 *Density, t_u8 *MMSF);\r\n#endif\r\n#endif /* CONFIG_11AX */\r\n\r\n#if CONFIG_WIFI_RECOVERY\r\nint wlan_recovery_test(void);\r\n#endif\r\n\r\n#if CONFIG_WIFI_CLOCKSYNC\r\n/** Set clock sync GPIO based TSF (time synchronization function).\r\n *\r\n * \\param[in] tsf_latch Clock sync TSF latch parameters to be sent to firmware\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_clocksync_cfg(const wlan_clock_sync_gpio_tsf_t *tsf_latch);\r\n/** Get TSF info from firmware using GPIO latch.\r\n *\r\n * \\param[out] tsf_info TSF info parameter received from firmware\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_get_tsf_info(wlan_tsf_info_t *tsf_info);\r\n#endif /* CONFIG_WIFI_CLOCKSYNC */\r\n\r\n#if CONFIG_HEAP_DEBUG\r\n/**\r\n * Show os mem alloc and free info.\r\n *\r\n */\r\nvoid wlan_show_os_mem_stat(void);\r\n#endif\r\n\r\n#if CONFIG_MULTI_CHAN\r\n/**\r\n * Set multi-channel status disable/enable.\r\n * \\param[in]      status   multi channel status\r\n * 0-disable, 1-enable\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_multi_chan_status(const int status);\r\n\r\n/**\r\n * Get dynamic rapid channel switch status disable/enable.\r\n * \\param[out]      status  multi channel status\r\n * 0-disable, 1-enable\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_get_multi_chan_status(int *status);\r\n\r\n/**\r\n * Set dynamic rapid channel switch config.\r\n * \\param[in]      num       array length of drcs_cfg[]\r\n * \\param[in]     drcs_cfg   multi-channel config, maybe an array\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_drcs_cfg(const wlan_drcs_cfg_t *drcs_cfg, const int num);\r\n\r\n/**\r\n * Get dynamic rapid channel switch config.\r\n * \\param[in]      num       array length of drcs_cfg[]\r\n * \\param[out] drcs_cfg  multi-channel config, maybe an array\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_get_drcs_cfg(wlan_drcs_cfg_t *drcs_cfg, int num);\r\n#endif\r\n\r\n#if CONFIG_11R\r\n/**\r\n * Start FT roaming : This API is used to initiate fast BSS transition based\r\n * roaming.\r\n *\r\n * \\param[in] bssid       BSSID of AP to roam\r\n * \\param[in] channel     Channel of AP to roam\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_ft_roam(const t_u8 *bssid, const t_u8 channel);\r\n#endif\r\n\r\n/**\r\n * This API can be used to start/stop the management frame forwards\r\n * to host through datapath.\r\n *\r\n * \\param[in] bss_type The interface from which management frame needs to be\r\n *            collected 0: STA, 1: UAP\r\n\r\n * \\param[in] mgmt_subtype_mask     Management Subtype Mask\r\n *            If Bit X is set in mask, it means that IEEE Management Frame\r\n *            SubTyoe X is to be filtered and passed through to host.\r\n *            Bit                   Description\r\n *            [31:14]               Reserved\r\n *            [13]                  Action frame\r\n *            [12:9]                Reserved\r\n *            [8]                   Beacon\r\n *            [7:6]                 Reserved\r\n *            [5]                   Probe response\r\n *            [4]                   Probe request\r\n *            [3]                   Reassociation response\r\n *            [2]                   Reassociation request\r\n *            [1]                   Association response\r\n *            [0]                   Association request\r\n *            Support multiple bits set.\r\n *            0 = stop forward frame\r\n *            1 = start forward frame\r\n *\\param[in] rx_mgmt_callback The receive callback where the received management\r\n *           frames are passed.\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n *\r\n * \\note Pass management subtype mask all zero to disable all the management\r\n *       frame forward to host.\r\n */\r\nint wlan_rx_mgmt_indication(const enum wlan_bss_type bss_type,\r\n                            const uint32_t mgmt_subtype_mask,\r\n                            int (*rx_mgmt_callback)(const enum wlan_bss_type bss_type,\r\n                                                    const wlan_mgmt_frame_t *frame,\r\n                                                    const size_t len));\r\n\r\n#if CONFIG_WMM\r\nvoid wlan_wmm_tx_stats_dump(int bss_type);\r\n#endif\r\n\r\n#if CONFIG_SCAN_CHANNEL_GAP\r\n/**\r\n * Set scan channel gap.\r\n * \\param[in] scan_chan_gap      Time gap to be used between two consecutive channels scan.\r\n *\r\n */\r\nvoid wlan_set_scan_channel_gap(unsigned scan_chan_gap);\r\n#endif\r\n\r\n#if CONFIG_11K\r\n/**\r\n * Enable/Disable host 802.11k feature.\r\n *\r\n * \\param[in] enable_11k the value of 802.11k configuration.\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_host_11k_cfg(int enable_11k);\r\n\r\n/**\r\n * Get enable/disable host 802.11k feature flag.\r\n *\r\n * \\return TRUE if 802.11k is enabled, return FALSE if 802.11k is disabled.\r\n *\r\n */\r\nbool wlan_get_host_11k_status(void);\r\n\r\n/**\r\n * Host send neighbor report request.\r\n *\r\n * \\param[in] ssid The SSID for neighbor report\r\n * \\note ssid parameter is optional\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_host_11k_neighbor_req(const char *ssid);\r\n#endif\r\n\r\n#if CONFIG_11V\r\n/**\r\n * Host send BSS transition management query.\r\n *\r\n * \\param[in] query_reason BTM (BSS transition management) request query reason code.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_host_11v_bss_trans_query(t_u8 query_reason);\r\n#endif\r\n\r\n#if !CONFIG_WPA_SUPP\r\n#if CONFIG_DRIVER_MBO\r\n/**\r\n * Enable/Disable MBO (multi band operation) feature.\r\n *\r\n * \\param[in] enable_mbo The value of MBO configuration.\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_host_mbo_cfg(int enable_mbo);\r\n\r\n/**\r\n * MBO channel operation preference configuration\r\n *\r\n * \\param[in] ch0 Channel number.\r\n * \\param[in] prefer0 Operation preference for ch0.\r\n * \\param[in] ch1 Channel number.\r\n * \\param[in] prefer1 Operation preference for ch1.\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_mbo_peferch_cfg(t_u8 ch0, t_u8 pefer0, t_u8 ch1, t_u8 pefer1);\r\n#endif\r\n#endif\r\n\r\n#if (CONFIG_11MC) || (CONFIG_11AZ)\r\nint wlan_unassoc_ftm_cfg(const t_u16 action, const t_u16 config);\r\n\r\n/**\r\n * Start or stop FTM (Wi-Fi fine time measurement) based on the command from CLI.\r\n * \\param[in] action 1: start FTM  2: stop FTM.\r\n * \\param[in] loop_cnt         number of FTM sessions to run repeatedly (default:1,  0: non-stop, n>1: n times).\r\n * \\param[in] MAC              MAC address of the peer with whom FTM session is required.\r\n * \\param[in] channel          Channel on which FTM is started.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_ftm_start_stop(const t_u16 action, const t_u8 loop_cnt, const t_u8 *mac, const t_u8 channel);\r\n\r\n/**\r\n * Config FTM protocol.\r\n * \\param[in] protocol 0: Dot11mc, 1: Dot11az_ntb, 2: Dot11az_tb\r\n * \\param[in] ftm_ranging_cfg  FTM ranging config.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_ftm_cfg(const t_u8 protocol, ranging_11az_cfg_t *ftm_ranging_cfg);\r\n\r\nint wlan_ftm_11mc_cfg(ftm_11mc_nego_cfg_t *ftm_11mc_nego_cfg);\r\n\r\nint wlan_ftm_location_cfg(location_cfg_info_t *ftm_location_cfg);\r\n\r\nint wlan_ftm_civic_cfg(location_civic_rep_t *ftm_civic_cfg);\r\n\r\nextern location_cfg_info_t g_ftm_location_cfg;\r\nextern location_civic_rep_t g_ftm_civic_cfg;\r\n\r\n#endif\r\n\r\n#if CONFIG_WPA_SUPP\r\n#if (CONFIG_11AX && defined(CONFIG_MBO))\r\n/**\r\n * Multi band pperation (MBO) non-preferred channels\r\n *\r\n * A space delimited list of non-preferred channels where each channel is a colon delimited list of values.\r\n *\r\n * Format:\r\n *\r\n * non_pref_chan=oper_class:chan:preference:reason\r\n * Example:\r\n *\r\n * non_pref_chan=81:5:10:2 81:1:0:2 81:9:0:2\r\n *\r\n * \\param[in] non_pref_chan list of non-preferred channels.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_mbo_peferch_cfg(const char *non_pref_chan);\r\n\r\n/**\r\n * MBO set cellular data capabilities\r\n *\r\n * \\param[in] cell_capa 1 = Cellular data connection available\r\n * 2 = Cellular data connection not available\r\n * 3 = Not cellular capable (default)\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_mbo_set_cell_capa(t_u8 cell_capa);\r\n\r\n/**\r\n * Optimized connectivity experience (OCE)\r\n *\r\n * \\param[in] oce Enable OCE features\r\n * 1 = Enable OCE in non-AP STA mode (default; disabled if the driver\r\n * does not indicate support for OCE in STA mode).\r\n * 2 = Enable OCE in STA-CFON mode.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_mbo_set_oce(t_u8 oce);\r\n#endif\r\n\r\n/**\r\n * Opportunistic key caching (also known as proactive key caching) default\r\n * This parameter can be used to set the default behavior for the\r\n * proactive_key_caching parameter. By default, OKC is disabled unless enabled\r\n * with the global okc=1 parameter or with the per-network\r\n * pkc(proactive_key_caching)=1 parameter. With okc=1, OKC is enabled by default, but\r\n * can be disabled with per-network pkc(proactive_key_caching)=0 parameter.\r\n *\r\n * \\param[in] okc Enable opportunistic key caching\r\n *\r\n * 0 = Disable OKC (default)\r\n * 1 = Enable OKC\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_okc(t_u8 okc);\r\n\r\n/**\r\n * Dump text list of entries in PMKSA (pairwise master key security association) cache.\r\n *\r\n * \\param[out] buf Buffer to save PMKSA cache text list\r\n * \\param[in] buflen length of the buffer\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_pmksa_list(char *buf, size_t buflen);\r\n\r\n/**\r\n * Flush PTKSA cache entries\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_pmksa_flush(void);\r\n\r\n/**\r\n * Set wpa supplicant scan interval in seconds\r\n *\r\n * \\param[in] scan_int Scan interval in seconds\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_scan_interval(int scan_int);\r\n#endif\r\n\r\n\r\n#if CONFIG_ECSA\r\n/**\r\n * Send the ecsa config parameter to FW.\r\n *\r\n *\\param[in] block_tx      0 -- no need to block traffic,1 -- need block traffic.\r\n *\\param[in] oper_class    Operating class according to IEEE std802.11 spec, refer to Annex E,\r\n *                         when 0 is used, automatically get operclass through band_width and channel.\r\n *\\param[in] channel       The channel can switch to.\r\n *\\param[in] switch_count  Channel switch time to send ECSA ie, unit is 110ms.\r\n *\\param[in] band_width    Channel width switch to(optional), only for 5G channels.\r\n *                         Depends on the hardware capabilities, when the hardware does not support, it can\r\n *automatically downgrade. Redfinch support 20M. 0 -- 20MHZ, 1 -- 40M above, 3 -- 40M below, 4 -- 80M, 5 -- 160M\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_uap_set_ecsa_cfg(t_u8 block_tx, t_u8 oper_class, t_u8 channel, t_u8 switch_count, t_u8 band_width);\r\n#endif\r\n\r\n#if CONFIG_SUBSCRIBE_EVENT_SUPPORT\r\n\r\n/** Type enum definition of subscribe event */\r\ntypedef enum\r\n{\r\n    /** Event Id for subscribe event RSSI low */\r\n    EVENT_SUB_RSSI_LOW = 0,\r\n    /** Event Id for subscribe event RSSI high */\r\n    EVENT_SUB_RSSI_HIGH,\r\n    /** Event Id for subscribe event snr low */\r\n    EVENT_SUB_SNR_LOW,\r\n    /** Event Id for subscribe event snr high */\r\n    EVENT_SUB_SNR_HIGH,\r\n    /** Event Id for subscribe event max fail */\r\n    EVENT_SUB_MAX_FAIL,\r\n    /** Event Id for subscribe event beacon missed */\r\n    EVENT_SUB_BEACON_MISSED,\r\n    /** Event Id for subscribe event data RSSI low */\r\n    EVENT_SUB_DATA_RSSI_LOW,\r\n    /** Event Id for subscribe event data RSSI high */\r\n    EVENT_SUB_DATA_RSSI_HIGH,\r\n    /** Event Id for subscribe event data snr low */\r\n    EVENT_SUB_DATA_SNR_LOW,\r\n    /** Event Id for subscribe event data snr high */\r\n    EVENT_SUB_DATA_SNR_HIGH,\r\n    /** Event Id for subscribe event link quality */\r\n    EVENT_SUB_LINK_QUALITY,\r\n    /** Event Id for subscribe event pre_beacon_lost */\r\n    EVENT_SUB_PRE_BEACON_LOST,\r\n    /** Fail event id */\r\n    MAX_EVENT_ID,\r\n} sub_event_id;\r\n\r\n/** Type definition of wlan_ds_subscribe_evt for subscribe events */\r\ntypedef wifi_ds_subscribe_evt wlan_ds_subscribe_evt;\r\n\r\n/**\r\n * Subscribe specified event from the Wi-Fi firmware. Wi-Fi firmware report the registered event to driver upon\r\n * configured report conditions are met.\r\n * \\param[in] event_id event to register as per \\ref sub_event_id\r\n * \\param[in] thresh_value the RSSI threshold value (dBm)\r\n * \\param[in] freq     event frequency 0--report once, 1--report everytime happened, N --\r\n *                     report only happened > N consecutive times.\r\n * \\return WM_SUCCESS if set successfully, otherwise return failure.\r\n */\r\nint wlan_set_subscribe_event(unsigned int event_id, unsigned int thresh_value, unsigned int freq);\r\n/**\r\n * Get all subscribed events from Wi-Fi firmware along with threshold value and report frequency.\r\n * \\param[in] sub_evt A pointer to \\ref wlan_ds_subscribe_evt to store the events data.\r\n */\r\nint wlan_get_subscribe_event(wlan_ds_subscribe_evt *sub_evt);\r\n/**\r\n * cancel the subscribe event to firmware\r\n * \\param[in] event_id event id to clear as per \\ref sub_event_id\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_clear_subscribe_event(unsigned int event_id);\r\n/**\r\n * subscibe link quality event\r\n * \\param[in] event_id event id to clear as per \\ref sub_event_id\r\n * \\param[in] link_snr link quality snr value\r\n * \\param[in] link_snr_freq link quality snr freq\r\n * \\param[in] link_rate link quality rate\r\n * \\param[in] link_rate_freq link quality rate freq\r\n * \\param[in] link_tx_latency link quality write lantency\r\n * \\param[in] link_tx_lantency_freq link quality write lantency freq\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_threshold_link_quality(unsigned int evend_id,\r\n                                    unsigned int link_snr,\r\n                                    unsigned int link_snr_freq,\r\n                                    unsigned int link_rate,\r\n                                    unsigned int link_rate_freq,\r\n                                    unsigned int link_tx_latency,\r\n                                    unsigned int link_tx_lantency_freq);\r\n#endif\r\n\r\n#if CONFIG_TSP\r\n/**\r\n * get TSP (thermal safeguard protection) configuration.\r\n * TSP algorithm moniters PA Tj and primarily backs off data throughput.\r\n * \\param[out] enable            Enable/Disable TSP algothrim\r\n * \\param[out] back_off          Power back off   [0...20]dB\r\n * \\param[out] highThreshold     High threshold  [0...300]°C\r\n * \\param[out] lowThreshold      Low threshold   [0...300]°C\r\n *             High Threshold is Greater than low threshold.\r\n * \\param[out] dutycycstep       Duty cycle step(percentage)\r\n * \\param[out] dutycycmin        Duty cycle min(percentage)\r\n * \\param[out] highthrtemp       High throttle threshold temperature(celsius)\r\n * \\param[out] lowthrtemp        Low throttle threshold temperature(celsius)\r\n * \\param[out] currCAUTemp       CAU TSEN temperature\r\n * \\param[out] currRFUTemp       RFU temperature\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_get_tsp_cfg(t_u16 *enable,\r\n                     t_u32 *back_off,\r\n                     t_u32 *highThreshold,\r\n                     t_u32 *lowThreshold,\r\n                     t_u32 *dutycycstep,\r\n                     t_u32 *dutycycmin,\r\n                     int *highthrtemp,\r\n                     int *lowthrtemp,\r\n                     int *currCAUTemp,\r\n                     int *currRFUTemp);\r\n\r\n/**\r\n * Set TSP (thermal safeguard protection) configuration.\r\n * TSP algorithm moniters and primarily backs off data throughput.\r\n * \\param[in] enable            Enable/Disable tsp algothrim\r\n * \\param[in] back_off          Power back off   [0...20]dB\r\n * \\param[in] highThreshold     High threshold  [0...300]°C\r\n * \\param[in] lowThreshold      Low threshold   [0...300]°C\r\n *                              High threshold is greater than low threshold.\r\n * \\param[in] dutycycstep       Duty cycle step(percentage)\r\n * \\param[in] dutycycmin        Duty cycle min(percentage)\r\n * \\param[out] highthrtemp      High throttle threshold temperature (celsius)\r\n * \\param[out] lowthrtemp       Low throttle threshold temperature (celsius)\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_tsp_cfg(t_u16 enable,\r\n                     t_u32 back_off,\r\n                     t_u32 highThreshold,\r\n                     t_u32 lowThreshold,\r\n                     t_u32 dutycycstep,\r\n                     t_u32 dutycycmin,\r\n                     int highthrtemp,\r\n                     int lowthrtemp);\r\n#endif\r\n\r\n#if CONFIG_WIFI_REG_ACCESS\r\n/** This function reads/writes adapter registers value.\r\n *\r\n *\\param[in]        type        Register type: 1 -- MAC, 2 -- BBP, 3 -- RF.\r\n *\\param[in]        action      0 -- read, 1 -- write\r\n *\\param[in]        offset      Specifies the offset location that is to be read/write.\r\n *\\param[in,out]    value       Value if specified, stand for write action, then that value can be written to that\r\n *                              offset in the specified register. Value should be specified in hexadecimal. Otherwise,\r\n *                              it stands for read action, the\r\n *value is updated with read value.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_reg_access(wifi_reg_t type, uint16_t action, uint32_t offset, uint32_t *value);\r\n#endif\r\n\r\n#if CONFIG_TX_AMPDU_PROT_MODE\r\n/**\r\n * Set/Get TX AMPDU protect mode.\r\n *\r\n * \\param[in,out] prot_mode    TX AMPDU protect mode\r\n * \\param[in]     action       Command action\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_tx_ampdu_prot_mode(tx_ampdu_prot_mode_para *prot_mode, t_u16 action);\r\n#endif\r\n\r\nstruct wlan_message\r\n{\r\n    t_u16 id;\r\n    void *data;\r\n};\r\n\r\nenum wlan_mef_type\r\n{\r\n    MEF_TYPE_DELETE = 0,\r\n    MEF_TYPE_PING,\r\n    MEF_TYPE_ARP,\r\n    MEF_TYPE_MULTICAST,\r\n    MEF_TYPE_IPV6_NS,\r\n    MEF_TYPE_END,\r\n};\r\n/** This function set auto ARP configuration.\r\n *\r\n * \\param[in] mef_action  To be 0--discard and not wake host, 1--discard and wake host 3--allow and wake host.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_mef_set_auto_arp(t_u8 mef_action);\r\n/** This function set auto ping configuration.\r\n *\r\n * \\param[in] mef_action  To be 0--discard and not wake host, 1--discard and wake host 3--allow and wake host.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n *\r\n */\r\nint wlan_mef_set_auto_ping(t_u8 mef_action);\r\n/** This function set/delete MEF entries configuration.\r\n *\r\n * \\param[in] type        MEF type: MEF_TYPE_DELETE, MEF_TYPE_AUTO_PING, MEF_TYPE_AUTO_ARP\r\n * \\param[in] mef_action  To be 0--discard and not wake host, 1--discard and wake host 3--allow and wake host.\r\n *\r\n * \\return WM_SUCCESS if the call was successful.\r\n * \\return -WM_FAIL if failed.\r\n */\r\nint wlan_config_mef(int type, t_u8 mef_action);\r\n/**\r\n * Use this API to enable IPv6 neighbor solicitation offload in Wi-Fi firmware.\r\n *\r\n * \\param[in] mef_action  0--discard and not wake host, 1--discard and wake host 3--allow and wake host.\r\n *\r\n * \\return WM_SUCCESS if operation is successful.\r\n * \\return -WM_FAIL if command fails.\r\n */\r\nint wlan_set_ipv6_ns_mef(t_u8 mef_action);\r\n\r\n#if CONFIG_CSI\r\n/**\r\n * Send the CSI config parameter to firmware.\r\n *\r\n *\\param[in] csi_params CSI config parameter\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_csi_cfg(wlan_csi_config_params_t *csi_params);\r\n\r\n/** This function registers callback which are used to deliver CSI (channel state information) data to user.\r\n *\r\n * \\param[in] csi_data_recv_callback Callback to deliver CSI data and max data length is 768 bytes.\r\n * Pls save data as soon as possible in callback\r\n * Type of callback return vale is int.\r\n *\r\n *          Memory layout of buffer:\r\n *          size(byte)                         items\r\n *          2                                  buffer len[bit 0:12]\r\n *          2                                  CSI signature, 0xABCD fixed\r\n *          4                                  User defined HeaderID\r\n *          2                                  Packet info\r\n *          2                                  Frame control field for the received packet\r\n *          8                                  Timestamp when packet received\r\n *          6                                  Received packet destination MAC Address\r\n *          6                                  Received packet source MAC address\r\n *          1                                  RSSI for antenna A\r\n *          1                                  RSSI for antenna B\r\n *          1                                  Noise floor for antenna A\r\n *          1                                  Noise floor for antenna B\r\n *          1                                  RX signal strength above noise floor\r\n *          1                                  Channel\r\n *          2                                  user defined chip ID\r\n *          4                                  Reserved\r\n *          4                                  CSI data length in DWORDs\r\n *                                             CSI data\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_register_csi_user_callback(int (*csi_data_recv_callback)(void *buffer, size_t len));\r\n\r\n/** This function unregisters callback which are used to deliver CSI data to user.\r\n *\r\n * \\return  WM_SUCCESS if successful\r\n */\r\nint wlan_unregister_csi_user_callback(void);\r\n/** This function get CSI default configuration data.\r\n *\r\n * \\return CSI data pointer.\r\n */\r\nwlan_csi_config_params_t *wlan_get_csi_cfg_param_default(void);\r\n/** This function set CSI default configuration data.\r\n *\r\n * \\param[in] in_csi_cfg CSI default configuration data to be set.\r\n *\r\n * \\return if successful return 1 else return 0.\r\n */\r\nint wlan_set_csi_cfg_param_default(wlan_csi_config_params_t *in_csi_cfg);\r\n\r\n/**\r\n * This function reset Wi-Fi CSI filter data.\r\n */\r\nvoid wlan_reset_csi_filter_data(void);\r\n#endif\r\n\r\n#if (CONFIG_11K) || (CONFIG_11V) || (CONFIG_11R) || (CONFIG_ROAMING)\r\n/**\r\n * Use this API to set the RSSI threshold value for low RSSI event subscription.\r\n * When RSSI falls below this threshold firmware can generate the low RSSI event to driver.\r\n * This low RSSI event is used when either of CONFIG_11R, CONFIG_11K, CONFIG_11V or CONFIG_ROAMING is enabled.\r\n * NOTE: By default RSSI low threshold is set at -70 dbm\r\n *\r\n * \\param[in]     threshold      Threshold RSSI value to be set\r\n *\r\n */\r\nvoid wlan_set_rssi_low_threshold(uint8_t threshold);\r\n#endif\r\n\r\n#if CONFIG_WPA_SUPP\r\n#if CONFIG_WPA_SUPP_WPS\r\n/**\r\n *  This function generate pin for WPS pin session.\r\n *\r\n * \\param[in]  pin A pointer to WPS pin to be generated.\r\n */\r\nvoid wlan_wps_generate_pin(uint32_t *pin);\r\n\r\n/** Start WPS pin session.\r\n *\r\n *  This function starts WPS pin session.\r\n *\r\n * \\param[in]  pin Pin for WPS session.\r\n *\r\n * \\return WM_SUCCESS if the pin entered is valid.\r\n * \\return -WM_FAIL if invalid pin entered.\r\n */\r\nint wlan_start_wps_pin(const char *pin);\r\n\r\n/** Start WPS PBC (push button configuration) session.\r\n *\r\n *  This function starts WPS PBC (push button configuration) session.\r\n *\r\n * \\return  WM_SUCCESS if successful\r\n * \\return -WM_FAIL if invalid pin entered.\r\n *\r\n */\r\nint wlan_start_wps_pbc(void);\r\n\r\n/** Cancel WPS session.\r\n *\r\n *  This function cancels ongoing WPS session.\r\n *\r\n * \\return  WM_SUCCESS if successful\r\n * \\return -WM_FAIL if invalid pin entered.\r\n *\r\n */\r\nint wlan_wps_cancel(void);\r\n\r\n#if CONFIG_WPA_SUPP_AP\r\n/** Start WPS pin session.\r\n *\r\n *  This function starts AP WPS pin session.\r\n *\r\n * \\param[in] pin Pin for WPS session.\r\n *\r\n * \\return WM_SUCCESS if the pin entered is valid.\r\n * \\return -WM_FAIL if invalid pin entered.\r\n */\r\nint wlan_start_ap_wps_pin(const char *pin);\r\n\r\n/** Start WPS PBC session.\r\n *\r\n *  This function starts AP WPS PBC session.\r\n *\r\n * \\return  WM_SUCCESS if successful\r\n * \\return -WM_FAIL if invalid pin entered.\r\n *\r\n */\r\nint wlan_start_ap_wps_pbc(void);\r\n\r\n/** Cancel AP's WPS session.\r\n *\r\n *  This function cancels ongoing WPS session.\r\n *\r\n * \\return  WM_SUCCESS if successful\r\n * \\return -WM_FAIL if invalid pin entered.\r\n *\r\n */\r\nint wlan_wps_ap_cancel(void);\r\n#endif\r\n#endif\r\n#endif\r\n\r\n#if (CONFIG_WPA2_ENTP) || (CONFIG_WPA_SUPP_CRYPTO_ENTERPRISE)\r\n#define FILE_TYPE_NONE              0\r\n#define FILE_TYPE_ENTP_CA_CERT      1\r\n#define FILE_TYPE_ENTP_CLIENT_CERT  2\r\n#define FILE_TYPE_ENTP_CLIENT_KEY   3\r\n#define FILE_TYPE_ENTP_CA_CERT2     4\r\n#define FILE_TYPE_ENTP_CLIENT_CERT2 5\r\n#define FILE_TYPE_ENTP_CLIENT_KEY2  6\r\n\r\n#if CONFIG_HOSTAPD\r\n#define FILE_TYPE_ENTP_SERVER_CERT 8\r\n#define FILE_TYPE_ENTP_SERVER_KEY  9\r\n#define FILE_TYPE_ENTP_DH_PARAMS   10\r\n#endif\r\n\r\n/** This function specifies the enterprise certificate file\r\n *  This function is used before adding network profile. It can store certificate data\r\n *  in \"wlan\" global structure. When adding new network profile, it can be get by\r\n *  wlan_get_entp_cert_files(), and put into profile security structure after mbedtls parse.\r\n *\r\n * \\param[in]        cert_type   certificate file type:\r\n * 1 -- FILE_TYPE_ENTP_CA_CERT,\r\n * 2 -- FILE_TYPE_ENTP_CLIENT_CERT,\r\n * 3 -- FILE_TYPE_ENTP_CLIENT_KEY.\r\n * \\param[in]        data        raw data\r\n * \\param[in]        data_len    size of raw data\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_entp_cert_files(int cert_type, t_u8 *data, t_u32 data_len);\r\n\r\n/** This function get enterprise certificate data from \"wlan\" global structure           *\r\n * \\param[in]        cert_type   certificate file type:\r\n * 1 -- FILE_TYPE_ENTP_CA_CERT,\r\n * 2 -- FILE_TYPE_ENTP_CLIENT_CERT,\r\n * 3 -- FILE_TYPE_ENTP_CLIENT_KEY.\r\n * \\param[in]        data        raw data\r\n *\r\n * \\return size of raw data\r\n */\r\nt_u32 wlan_get_entp_cert_files(int cert_type, t_u8 **data);\r\n\r\n/** This function free the temporary memory of enterprise certificate data\r\n *  After add new enterprise network profile, the certificate data has been parsed by mbedtls into another data, which\r\n * can be freed.\r\n *\r\n */\r\nvoid wlan_free_entp_cert_files(void);\r\n#endif\r\n\r\n#if CONFIG_NET_MONITOR\r\n/**\r\n * Send the net monitor config parameter to firmware.\r\n *\r\n *\\param[in] monitor Monitor config parameter\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_net_monitor_cfg(wlan_net_monitor_t *monitor);\r\n\r\n/** This function registers callback which are used to deliver monitor data to user.\r\n *\r\n * \\param[in] monitor_data_recv_callback Callback to deliver monitor data and data length to user.\r\n *          Memory layout of buffer:\r\n *          offset(byte)                        items\r\n *          0                                   rssi\r\n *          1                                   802.11 MAC header\r\n *          1 + 'size of 802.11 MAC header'     frame body\r\n *\r\n * \\return void\r\n */\r\nvoid wlan_register_monitor_user_callback(int (*monitor_data_recv_callback)(void *buffer, t_u16 data_len));\r\n\r\n/** This function deregisters monitor callback.\r\n *\r\n * \\return void\r\n */\r\nvoid wlan_deregister_net_monitor_user_callback(void);\r\n#endif\r\n\r\n#if CONFIG_WIFI_CAPA\r\n/** Check if 802.11n (2G or 5G) is supported by hardware or not.\r\n *\r\n * \\param[in] channel Channel number.\r\n *\r\n * \\return true if 802.11n is supported or false if not.\r\n */\r\nuint8_t wlan_check_11n_capa(unsigned int channel);\r\n\r\n/** Check if 802.11ac (2G or 5G) is supported by hardware or not.\r\n *\r\n * \\param[in] channel Channel number.\r\n *\r\n * \\return true if 802.11ac is supported or false if not.\r\n */\r\nuint8_t wlan_check_11ac_capa(unsigned int channel);\r\n\r\n/** Check if 11ax(2G or 5G) is supported by hardware or not.\r\n *\r\n * \\param[in] channel Channel number.\r\n *\r\n * \\return true if 802.11ax is supported or false if not.\r\n */\r\nuint8_t wlan_check_11ax_capa(unsigned int channel);\r\n#endif\r\n\r\n#if (CONFIG_IPS)\r\n/**\r\n * Config IEEE power save mode (IPS). If the option is 1, the IPS hardware listens to beacon frames after Wi-Fi CPU enters\r\n * power save mode. When there is work needed to done by Wi-Fi CPU, Wi-Fi CPU can be woken up by ips hardware. \\param[in]\r\n * option    0/1  disable/enable ips\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_ips(int option);\r\n#endif\r\n\r\n/**\r\n * Get RSSI information.\r\n * \\param[out] signal    RSSI infomation get report buffer\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_get_signal_info(wlan_rssi_info_t *signal);\r\n\r\n/**\r\n * Set band configuration.\r\n * \\param[in] bandcfg    band configureation\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_bandcfg(wlan_bandcfg_t *bandcfg);\r\n\r\n/**\r\n * Get band configuration.\r\n * \\param[out] bandcfg    band configureation\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_get_bandcfg(wlan_bandcfg_t *bandcfg);\r\n\r\n#if CONFIG_COMPRESS_TX_PWTBL\r\n/**\r\n * set region power table\r\n * \\param[in] region_code region code\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_rg_power_cfg(t_u16 region_code);\r\n#endif\r\n\r\n#if (CONFIG_COMPRESS_RU_TX_PWTBL) && (CONFIG_11AX)\r\n/**\r\n * set ru tx power table\r\n * \\param[in] region_code region code\r\n * \\return WM_SUCCESS if successful otherwise failure.\r\n */\r\nint wlan_set_ru_power_cfg(t_u16 region_code);\r\n#endif\r\n\r\n#if CONFIG_TURBO_MODE\r\n/**\r\n * Get Turbo mode.\r\n * \\param[out] mode    turbo mode\r\n *                          0: disable turbo mode\r\n *                          1: turbo mode 1\r\n *                          2: turbo mode 2\r\n *                          3: turbo mode 3\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_get_turbo_mode(t_u8 *mode);\r\n\r\n/**\r\n * Get UAP turbo mode.\r\n * \\param[out] mode    turbo mode\r\n *                          0: disable turbo mode\r\n *                          1: turbo mode 1\r\n *                          2: turbo mode 2\r\n *                          3: turbo mode 3\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_get_uap_turbo_mode(t_u8 *mode);\r\n\r\n/**\r\n * Set turbo mode.\r\n * \\param[in] mode    turbo mode\r\n *                          0: disable turbo mode\r\n *                          1: turbo mode 1\r\n *                          2: turbo mode 2\r\n *                          3: turbo mode 3\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_turbo_mode(t_u8 mode);\r\n\r\n/**\r\n * Set UAP turbo mode.\r\n * \\param[in] mode    turbo mode\r\n *                          0: disable turbo mode\r\n *                          1: turbo mode 1\r\n *                          2: turbo mode 2\r\n *                          3: turbo mode 3\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_uap_turbo_mode(t_u8 mode);\r\n#endif\r\n\r\n/**\r\n * set ps configuration.\r\n * Currently only used to modify multiple dtim.\r\n * \\param[in] multiple_dtims        num dtims, range [1,20]\r\n * \\param[in] bcn_miss_timeout      becaon miss interval\r\n * \\param[in] local_listen_interval local listen interval\r\n * \\param[in] adhoc_wake_period     adhoc awake period\r\n * \\param[in] mode                  mode - (0x01 - firmware to automatically choose PS_POLL or NULL mode,\r\n *                                          0x02 - PS_POLL,\r\n *                                          0x03 - NULL mode )\r\n * \\param[in] delay_to_ps           Delay to PS in milliseconds\r\n */\r\nvoid wlan_set_ps_cfg(t_u16 multiple_dtims,\r\n                     t_u16 bcn_miss_timeout,\r\n                     t_u16 local_listen_interval,\r\n                     t_u16 adhoc_wake_period,\r\n                     t_u16 mode,\r\n                     t_u16 delay_to_ps);\r\n\r\n#if CONFIG_CLOUD_KEEP_ALIVE\r\n/**\r\n * Save start cloud keep alive parameters\r\n *\r\n * \\param[in] cloud_keep_alive    cloud keep alive information\r\n * \\param[in] src_port Source port\r\n * \\param[in] dst_port Destination port\r\n * \\param[in] seq_number Sequence number\r\n * \\param[in] ack_number Acknowledgement number\r\n * \\param[in] enable Enable\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_save_cloud_keep_alive_params(wlan_cloud_keep_alive_t *cloud_keep_alive,\r\n                                      t_u16 src_port,\r\n                                      t_u16 dst_port,\r\n                                      t_u32 seq_number,\r\n                                      t_u32 ack_number,\r\n                                      t_u8 enable);\r\n\r\n/**\r\n * Get cloud keep alive status for given destination ip and port\r\n *\r\n * \\param[in] dst_ip Destination ip address\r\n * \\param[in] dst_port Destination port\r\n *\r\n * \\return 1 if enabled otherwise 0.\r\n */\r\nint wlan_cloud_keep_alive_enabled(t_u32 dst_ip, t_u16 dst_port);\r\n\r\n/**\r\n * Start cloud keep alive\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_start_cloud_keep_alive(void);\r\n/**\r\n * Stop cloud keep alive\r\n * \\param[in] cloud_keep_alive    cloud keep alive information\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_stop_cloud_keep_alive(wlan_cloud_keep_alive_t *cloud_keep_alive);\r\n#endif\r\n\r\n/**\r\n * Set country code\r\n *\r\n * \\note This API should be called after Wi-Fi is initialized\r\n * but before starting UAP interface.\r\n *\r\n * \\param[in] alpha2 country code in 3 octets string, 2 octets country code and 1 octet environment\r\n *            2 octets country code supported:\r\n *            WW : World Wide Safe\r\n *            US : US FCC\r\n *            CA : IC Canada\r\n *            SG : Singapore\r\n *            EU : ETSI\r\n *            AU : Australia\r\n *            KR : Republic Of Korea\r\n *            FR : France\r\n *            JP : Japan\r\n *            CN : China\r\n *\r\n * For the third octet, STA is always 0.\r\n * for UAP environment:\r\n * All environments of the current frequency band and country (default)\r\n * alpha2[2]=0x20\r\n * Outdoor environment only\r\n * alpha2[2]=0x4f\r\n * Indoor environment only\r\n * alpha2[2]=0x49\r\n * Noncountry entity (country_code=XX)\r\n * alpha[2]=0x58\r\n * IEEE 802.11 standard Annex E table indication: 0x01 .. 0x1f\r\n * Annex E, Table E-4 (Global operating classes)\r\n * alpha[2]=0x04\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_country_code(const char *alpha2);\r\n\r\n/** Set ignore region code.\r\n *\r\n * \\param[in] ignore     0: don't ignore, 1: ignore\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_country_ie_ignore(uint8_t *ignore);\r\n\r\n/** Set region code.\r\n *\r\n * \\param[in] region_code region code to be set.\r\n * \\return WM_SUCCESS if successful otherwise fail.\r\n */\r\nint wlan_set_region_code(unsigned int region_code);\r\n\r\n/** Get region code.\r\n *\r\n * \\param[out] region_code pointer\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_get_region_code(unsigned int *region_code);\r\n\r\n/** Set STA/UAP 802.11d feature Enable/Disable.\r\n *\r\n * \\param[in] bss_type 0: STA, 1: UAP\r\n * \\param[in] state    0: disable, 1: enable\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_11d_state(int bss_type, int state);\r\n\r\n#if CONFIG_COEX_DUTY_CYCLE\r\n/**\r\n * Set single ant duty cycle.\r\n * \\param[in] enable\r\n * \\param[in] nbTime\r\n * \\param[in] wlanTime\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_single_ant_duty_cycle(t_u16 enable, t_u16 nbTime, t_u16 wlanTime);\r\n\r\n/**\r\n * Set dual ant duty cycle.\r\n * \\param[in] enable\r\n * \\param[in] nbTime\r\n * \\param[in] wlanTime\r\n * \\param[in] wlanBlockTime\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_dual_ant_duty_cycle(t_u16 enable, t_u16 nbTime, t_u16 wlanTime, t_u16 wlanBlockTime);\r\n#endif\r\n\r\n#if CONFIG_EXTERNAL_COEX_PTA\r\n/**\r\n * Set external coex PTA (packet traffic arbitration) parameters.\r\n * \\param[in] coex_pta_config\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_external_coex_pta_cfg(ext_coex_pta_cfg coex_pta_config);\r\n#endif\r\n\r\n#if CONFIG_WPA_SUPP_DPP\r\n/** Add a DPP (device provisioning protocol) configurator.\r\n *\r\n *  If this device is DPP configurator, add it to get configurator ID.\r\n *\r\n * \\param[in]  is_ap    0 is STA, 1 is UAP.\r\n * \\param[in]  cmd      \"curve=P-256\"\r\n *\r\n * \\return configurator ID if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_dpp_configurator_add(int is_ap, const char *cmd);\r\n\r\n/** Set DPP (device provisioning protocol) configurator parameter\r\n *\r\n *  set DPP configurator params.\r\n *  for example:\" conf=<sta-dpp/ap-dpp> ssid=<hex ssid> configurator=conf_id\"\r\n *  #space character exists between \" & conf word.\r\n *\r\n * \\param[in]  is_ap    0 is STA, 1 is UAP.\r\n * \\param[in]  cmd      \" conf=<sta-dpp/ap-dpp/sta-psk> ssid=<hex ssid> configurator=conf_id...\"\r\n *\r\n * \\return void\r\n */\r\nvoid wlan_dpp_configurator_params(int is_ap, const char *cmd);\r\n\r\n/** MUD URL for enrollee's DPP configuration request (optional)\r\n *\r\n *  Wi-Fi_CERTIFIED_Easy_Connect_Test_Plan_v3.0.pdf\r\n *  5.1.23 STAUT sends the MUD URL\r\n *\r\n * \\param[in]  is_ap    0 is STA, 1 is UAP.\r\n * \\param[in]  cmd      \"https://example.com/mud\"\r\n *\r\n * \\return void\r\n */\r\nvoid wlan_dpp_mud_url(int is_ap, const char *cmd);\r\n\r\n/** Generate QR code.\r\n *\r\n *  This function generates QR code and return bootstrap-id\r\n *\r\n * \\param[in]  is_ap    0 is STA, 1 is UAP.\r\n * \\param[in]  cmd      \"type=qrcode mac=<mac-address-of-device> chan=<operating-class/channel>...\"\r\n *\r\n * \\return bootstrap-id if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_dpp_bootstrap_gen(int is_ap, const char *cmd);\r\n\r\n/** Get QR code by bootstrap-id.\r\n *\r\n *  This function get QR code string by bootstrap-id\r\n *\r\n * \\param[in]  is_ap    0 is STA, 1 is UAP.\r\n * \\param[in]  id       bootstrap-id\r\n *\r\n * \\return QR code string if successful otherwise NULL.\r\n */\r\nconst char *wlan_dpp_bootstrap_get_uri(int is_ap, unsigned int id);\r\n\r\n/** Enter the QR code in the DPP device.\r\n *\r\n *  This function set the QR code and return qr-code-id.\r\n *\r\n * \\param[in]  is_ap    0 is STA, 1 is UAP\r\n * \\param[in]  uri      QR code provided by other device.\r\n *\r\n * \\return qr-code-id if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_dpp_qr_code(int is_ap, char *uri);\r\n\r\n/** Send provisioning auth request to responder.\r\n *\r\n *  This function send Auth request to responder by qr-code-id.\r\n *\r\n * \\param[in]  is_ap    0 is STA, 1 is UAP.\r\n * \\param[in]  cmd      \" peer=<qr-code-id> conf=<sta-dpp/ap-dpp/sta-psk> ....\"\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_dpp_auth_init(int is_ap, const char *cmd);\r\n\r\n/** Make device listen to DPP request.\r\n *\r\n *  Responder generates QR code and listening on its operating channel to wait Auth request.\r\n *\r\n * \\param[in]  is_ap    0 is STA, 1 is UAP.\r\n * \\param[in]  cmd      \"<frequency>\"\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_dpp_listen(int is_ap, const char *cmd);\r\n\r\n/** DPP stop listen.\r\n *\r\n *  Stop dpp listen and clear listen frequency\r\n *\r\n * \\param[in]  is_ap    0 is STA, 1 is UAP.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_dpp_stop_listen(int is_ap);\r\n\r\n/** Set bootstrapping through PKEX (Public Key Exchange).\r\n *\r\n *  Support in-band bootstrapping through PKEX\r\n *\r\n * \\param[in]  is_ap    0 is STA, 1 is UAP.\r\n * \\param[in]  cmd      \"own=<bootstrap_id> identifier=<string> code=<string>\"\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_dpp_pkex_add(int is_ap, const char *cmd);\r\n\r\n/** sends DPP presence announcement.\r\n *\r\n *  Send DPP presence announcement from responder.\r\n *  After the Initiator enters the QRcode URI provided by the Responder,\r\n *  the Responder sends the presence announcement to trigger Auth Request from Initiator.\r\n *\r\n * \\param[in]  is_ap    0 is STA, 1 is UAP.\r\n * \\param[in]  cmd      \"own=<bootstrap id> listen=<freq> ...\"\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_dpp_chirp(int is_ap, const char *cmd);\r\n\r\n/** DPP reconfig.\r\n *\r\n *  DPP reconfig and make a new DPP connection.\r\n *\r\n * \\param[in]  cmd      \"<network id> ...\"\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_dpp_reconfig(const char *cmd);\r\n\r\n/** Configurator configures itself as an Enrollee AP/STA.\r\n *\r\n *  Wi-Fi_CERTIFIED_Easy_Connect_Test_Plan_v3.0.pdf\r\n *  5.3.8 & 5.3.9 Configurator configures itself as an Enrollee AP/STA\r\n *\r\n *  for example:\" conf=<sta-dpp/ap-dpp> ssid=<hex ssid> configurator=conf_id\"\r\n *  #space character exists between \" & conf word.\r\n *\r\n * \\param[in]  is_ap    0 is STA, 1 is UAP\r\n * \\param[in]  cmd      \" conf=<sta-dpp/ap-dpp/sta-psk> ssid=<hex ssid> configurator=conf_id...\"\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_dpp_configurator_sign(int is_ap, const char *cmd);\r\n#endif\r\n\r\n#if CONFIG_IMD3_CFG\r\n/**\r\n * Set imd validation parameters.\r\n * \\param[in] imd3_value   disable imd3: imd3_value = 0;\r\n *                         enable imd3: low 4 bits: enable, high 4 bits: isolation index.\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_imd3_cfg(t_u8 imd3_value);\r\n#endif\r\n\r\n#if CONFIG_UAP_STA_MAC_ADDR_FILTER\r\nint wlan_host_set_sta_mac_filter(int filter_mode, int mac_count, unsigned char *mac_addr);\r\n#endif\r\n\r\n#if (CONFIG_WIFI_IND_RESET) && (CONFIG_WIFI_IND_DNLD)\r\n/**\r\n * Set GPIO independent reset configuration\r\n *\r\n * \\param[in] indrst_cfg GPIO independent reset config to be sent to firmware\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_set_indrst_cfg(const wifi_indrst_cfg_t *indrst_cfg);\r\n\r\n/* Get GPIO independent reset configuration\r\n *\r\n * \\param[out] indrst_cfg GPIO independent reset config set in Firmware\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_get_indrst_cfg(wifi_indrst_cfg_t *indrst_cfg);\r\n\r\n/** Test independent firmware reset\r\n *\r\n * This function can either send cmd that can cause timeout in firmware or\r\n * send GPIO pulse that can cause out of band reset in firmware as per configuration\r\n * int earlier \\ref wlan_set_indrst_cfg API.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_independent_reset(void);\r\n\r\n#endif\r\n\r\nint wlan_set_network_ip_byname(char *name, struct wlan_ip_config *ip);\r\n\r\n#if CONFIG_INACTIVITY_TIMEOUT_EXT\r\n/**\r\n * Get/Set inactivity timeout extend\r\n * \\param[in] inac_to\r\n * \\param[in] action\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_sta_inactivityto(wlan_inactivity_to_t *inac_to, t_u16 action);\r\n#endif\r\n\r\n/**\r\n * Get 802.11 Status Code.\r\n *\r\n * \\param[in] reason wlcmgr event reason\r\n *\r\n * \\return status code defined in IEEE 802.11-2020 standard.\r\n */\r\nt_u16 wlan_get_status_code(enum wlan_event_reason reason);\r\n\r\n#ifdef RW610\r\n/**\r\n * Get board temperature.\r\n * \\return board temperature.\r\n */\r\nint32_t wlan_get_temperature(void);\r\n#endif\r\n\r\n#if CONFIG_CPU_LOADING\r\n/**\r\n * Set parameters for cpu loading test.\r\n *\r\n * \\param[in]  start    0 stop test, 1 start test.\r\n * \\param[in]  number   The number of cpu loading test.\r\n * \\param[in]  period   The period of cpu loading test.\r\n *\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_cpu_loading(uint8_t start, uint32_t number, uint8_t period);\r\n#endif\r\n\r\n#if CONFIG_AUTO_NULL_TX\r\n/** Configuration for auto null TX parameters from\r\n * \\ref wifi_auto_null_tx_t\r\n */\r\ntypedef wifi_auto_null_tx_t wlan_auto_null_tx_t;\r\n\r\n/**\r\n * Start/Stop auto TX null.\r\n *\r\n * \\param[in]  auto_null_tx  auto null RX information\r\n * \\param[in]  bss_type      0: station; 1: UAP\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_auto_null_tx(wlan_auto_null_tx_t *auto_null_tx, mlan_bss_type bss_type);\r\n#endif\r\n\r\n/**\r\n * allocate a copy of a string\r\n *\r\n * \\param[in,out] s the source/target string\r\n * \\return new string if successful, otherwise return -WM_FAIL.\r\n */\r\nchar *wlan_string_dup(const char *s);\r\n\r\n/**\r\n * Get board type.\r\n *\r\n * \\return board type.\r\n */\r\nuint32_t wlan_get_board_type(void);\r\n\r\n/**\r\n * Disconnect to STA which is connected with internal UAP.\r\n *\r\n * \\param[in]  sta_addr    STA MAC address\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_uap_disconnect_sta(uint8_t *sta_addr);\r\n\r\n/**\r\n * Check if 802.11n is allowed in capability.\r\n *\r\n * \\param[in]  network    A pointer to the \\ref wlan_network\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_11n_allowed(struct wlan_network *network);\r\n\r\n#if CONFIG_11AC\r\n/**\r\n * Check if 802.11ac is allowed in capability.\r\n *\r\n * \\param[in]  network    A pointer to the \\ref wlan_network\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_11ac_allowed(struct wlan_network *network);\r\n#endif\r\n\r\n#if CONFIG_11AX\r\n/**\r\n * Check if 802.11ax is allowed in capability.\r\n *\r\n * \\param[in]  network    A pointer to the \\ref wlan_network\r\n * \\return WM_SUCCESS if successful otherwise return -WM_FAIL.\r\n */\r\nint wlan_11ax_allowed(struct wlan_network *network);\r\n#endif\r\n#endif /* __WLAN_H__ */\r\n"
  },
  {
    "path": "tutorials/nxp/frdm-rw612-xpresso-freertos-builtin-wifi/wifi/incl/wmerrno.h",
    "content": "/*\r\n *  Copyright 2008-2020, 2024 NXP\r\n *\r\n *  SPDX-License-Identifier: BSD-3-Clause\r\n *\r\n */\r\n\r\n/*!\\file wmerrno.h\r\n *\\brief This file provides error codes definition.\r\n */\r\n#ifndef WM_ERRNO_H\r\n#define WM_ERRNO_H\r\n\r\n#include <wifi_config_default.h>\r\n\r\n#if defined(FSL_RTOS_THREADX)\r\n#include <errno.h>\r\n#endif\r\n\r\n/* Get the module index number from error code (4th byte from LSB)*/\r\n#define get_module_base(code) ((code & 0xF000) >> 12)\r\n\r\n/* Get notifier message type i.e Error, Warning or Info (3rd byte from LSB)*/\r\n#define get_notifier_msg_type(code) ((code & 0x0F00) >> 8)\r\n\r\n/* Get module notifier code (2nd and 1st byte from LSB)*/\r\n#define get_code(code) (code & 0xFF)\r\n\r\n#define MOD_ERROR_START(x) ((x) << 12 | 0)\r\n#define MOD_WARN_START(x)  ((x) << 12 | 1)\r\n#define MOD_INFO_START(x)  ((x) << 12 | 2)\r\n\r\n/* Create Module index */\r\n#define MOD_GENERIC 0\r\n/** Unused */\r\n#define MOD_UNUSED_3 2\r\n/** HTTPD module index */\r\n#define MOD_HTTPD 3\r\n/** Application framework module index */\r\n#define MOD_AF 4\r\n/** FTFS module index */\r\n#define MOD_FTFS 5\r\n/** RFGET module index */\r\n#define MOD_RFGET 6\r\n/** JSON module index  */\r\n#define MOD_JSON 7\r\n/** TELNETD module index */\r\n#define MOD_TELNETD 8\r\n/** SIMPLE MDNS module index */\r\n#define MOD_SMDNS 9\r\n/** EXML module index */\r\n#define MOD_EXML 10\r\n/** DHCPD module index */\r\n#define MOD_DHCPD 11\r\n/** MDNS module index */\r\n#define MOD_MDNS 12\r\n/** SYSINFO module index */\r\n#define MOD_SYSINFO 13\r\n/** Unused module index */\r\n#define MOD_UNUSED_1 14\r\n/** CRYPTO module index */\r\n#define MOD_CRYPTO 15\r\n/** HTTP-CLIENT module index */\r\n#define MOD_HTTPC 16\r\n/** PROVISIONING module index */\r\n#define MOD_PROV 17\r\n/** SPI module index */\r\n#define MOD_SPI 18\r\n/** PSM module index */\r\n#define MOD_PSM 19\r\n/** TTCP module index */\r\n#define MOD_TTCP 20\r\n/** DIAGNOSTICS module index */\r\n#define MOD_DIAG 21\r\n/** Unused module index */\r\n#define MOD_UNUSED_2 22\r\n/** WPS module index */\r\n#define MOD_WPS 23\r\n/** WLAN module index */\r\n#define MOD_WLAN 24\r\n/** USB module index */\r\n#define MOD_USB 25\r\n/** WIFI driver module index */\r\n#define MOD_WIFI 26\r\n/** Critical error module index */\r\n#define MOD_CRIT_ERR 27\r\n/** Last module index .Applications can define their own modules beyond this */\r\n#define MOD_ERR_LAST 50\r\n\r\n/* Globally unique success code */\r\n#define WM_SUCCESS 0\r\n\r\n/* First Generic Error codes */\r\n#define WM_GEN_E_BASE MOD_ERROR_START(MOD_GENERIC)\r\n#define WM_FAIL       1\r\n#define WM_E_PERM     2  /*Operation not permitted */\r\n#define WM_E_NOENT    3  /*No such file or directory */\r\n#define WM_E_SRCH     4  /*No such process */\r\n#define WM_E_INTR     5  /*Interrupted system call */\r\n#define WM_E_IO       6  /*I/O error */\r\n#define WM_E_NXIO     7  /*No such device or address */\r\n#define WM_E_2BIG     8  /*Argument list too long */\r\n#define WM_E_NOEXEC   9  /*Exec format error */\r\n#define WM_E_BADF     10 /* Bad file number */\r\n#define WM_E_CHILD    11 /* No child processes */\r\n#define WM_E_AGAIN    12 /* Try again */\r\n#define WM_E_NOMEM    13 /* Out of memory */\r\n#define WM_E_ACCES    14 /* Permission denied */\r\n#define WM_E_FAULT    15 /* Bad address */\r\n#define WM_E_NOTBLK   16 /* Block device required */\r\n#define WM_E_BUSY     17 /* Device or resource busy */\r\n#define WM_E_EXIST    18 /* File exists */\r\n#define WM_E_XDEV     19 /* Cross-device link */\r\n#define WM_E_NODEV    20 /* No such device */\r\n#define WM_E_NOTDIR   21 /* Not a directory */\r\n#define WM_E_ISDIR    22 /* Is a directory */\r\n#define WM_E_INVAL    23 /* Invalid argument */\r\n#define WM_E_NFILE    24 /* File table overflow */\r\n#define WM_E_MFILE    25 /* Too many open files */\r\n#define WM_E_NOTTY    26 /* Not a typewriter */\r\n#define WM_E_TXTBSY   27 /* Text file busy */\r\n#define WM_E_FBIG     28 /* File too large */\r\n#define WM_E_NOSPC    29 /* No space left on device */\r\n#define WM_E_SPIPE    30 /* Illegal seek */\r\n#define WM_E_ROFS     31 /* Read-only file system */\r\n#define WM_E_MLINK    32 /* Too many links */\r\n#define WM_E_PIPE     33 /* Broken pipe */\r\n#define WM_E_DOM      34 /* Math argument out of domain of func */\r\n#define WM_E_RANGE    35 /* Math result not representable */\r\n\r\n/* WMSDK generic error codes */\r\n#define WM_E_CRC     36 /* Error in CRC check */\r\n#define WM_E_UNINIT  37 /* Module is not yet initialized */\r\n#define WM_E_TIMEOUT 38 /* Timeout occurred during operation */\r\n\r\n/* Defined for Hostcmd specific API*/\r\n#define WM_E_INBIG 39 /* Input buffer too big */\r\n#define WM_E_INSMALL                                                                                         \\\r\n    40 /* A finer version for WM_E_INVAL, where it clearly specifies that input is much smaller than minimum \\\r\n          requirement */\r\n#define WM_E_OUTBIG 41 /* Data output exceeds the size provided */\r\n\r\n#endif                 /* ! WM_ERRNO_H */\r\n"
  },
  {
    "path": "tutorials/nxp/rt1060-evk-xpresso-baremetal-builtin/Debug/board/dcd.su",
    "content": ""
  },
  {
    "path": "tutorials/nxp/rt1060-evk-xpresso-baremetal-builtin/Debug/xip/evkbmimxrt1060_flexspi_nor_config.su",
    "content": ""
  },
  {
    "path": "tutorials/nxp/rt1060-evk-xpresso-baremetal-builtin/Debug/xip/fsl_flexspi_nor_boot.su",
    "content": ""
  },
  {
    "path": "tutorials/nxp/rt1060-evk-xpresso-baremetal-builtin/Test/board/dcd.su",
    "content": ""
  },
  {
    "path": "tutorials/nxp/rt1060-evk-xpresso-baremetal-builtin/Test/xip/evkbmimxrt1060_flexspi_nor_config.su",
    "content": ""
  },
  {
    "path": "tutorials/nxp/rt1060-evk-xpresso-baremetal-builtin/Test/xip/fsl_flexspi_nor_boot.su",
    "content": ""
  },
  {
    "path": "tutorials/stm32/nucleo-f746zg-make-baremetal-builtin-cmsis_driver/RTE_Components.h",
    "content": ""
  },
  {
    "path": "tutorials/udp/mdns-client/README.md",
    "content": ""
  },
  {
    "path": "tutorials/udp/mdns-server/README.md",
    "content": ""
  }
]